ZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggNTY2YWIxYy4uMjdhZjljOSAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTYxNzEsNyArNjE3MSw3IEBACiAKIFNUQUdJTkcgU1VCU1lTVEVNCiBNOglHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBzdXNlLmRlPgotVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9ncmVna2gvc3RhZ2luZy0yLjYuZ2l0CitUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2dyZWdraC9zdGFnaW5nLmdpdAogTDoJZGV2ZWxAZHJpdmVyZGV2Lm9zdW9zbC5vcmcKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvc3RhZ2luZy8KQEAgLTYyMTIsNiArNjIxMiwxMSBAQAogUzoJT2RkIEZpeGVzCiBGOglkcml2ZXJzL3N0YWdpbmcvZWNoby8KIAorU1RBR0lORyAtIEVUMTMxWCBORVRXT1JLIERSSVZFUgorTToJTWFyayBFaW5vbiA8bWFyay5laW5vbkBnbWFpbC5jb20+CitTOglPZGQgRml4ZXMKK0Y6CWRyaXZlcnMvc3RhZ2luZy9ldDEzMXgvCisKIFNUQUdJTkcgLSBGTEFSSU9OIEZUMTAwMCBEUklWRVJTCiBNOglNYXJlayBCZWxpc2tvIDxtYXJlay5iZWxpc2tvQGdtYWlsLmNvbT4KIFM6CU9kZCBGaXhlcwpAQCAtNjI0MCw2ICs2MjQ1LDEzIEBACiBTOglPZGQgRml4ZXMKIEY6CWRyaXZlcnMvc3RhZ2luZy9saXJjLwogCitTVEFHSU5HIC0gTlZJRElBIENPTVBMSUFOVCBFTUJFRERFRCBDT05UUk9MTEVSIElOVEVSRkFDRSAobnZlYykKK006CUp1bGlhbiBBbmRyZXMgS2xvZGUgPGpha0BqYWstbGludXgub3JnPgorTToJTWFyYyBEaWV0cmljaCA8bWFydmluMjRAZ214LmRlPgorTDoJYWMxMDBAbGlzdHMubGF1bmNocGFkLm5ldCAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL3N0YWdpbmcvbnZlYy8KKwogU1RBR0lORyAtIE9MUEMgU0VDT05EQVJZIERJU1BMQVkgQ09OVFJPTExFUiAoRENPTikKIE06CUFuZHJlcyBTYWxvbW9uIDxkaWxpbmdlckBxdWV1ZWQubmV0PgogTToJQ2hyaXMgQmFsbCA8Y2piQGxhcHRvcC5vcmc+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9oeXBlcnYuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2h5cGVydi5oCmluZGV4IDVkZjQ3N2EuLmI4MDQyMGIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2h5cGVydi5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2h5cGVydi5oCkBAIC0xODksNSArMTg5LDYgQEAKICNkZWZpbmUgSFZfU1RBVFVTX0lOVkFMSURfSFlQRVJDQUxMX0NPREUJMgogI2RlZmluZSBIVl9TVEFUVVNfSU5WQUxJRF9IWVBFUkNBTExfSU5QVVQJMwogI2RlZmluZSBIVl9TVEFUVVNfSU5WQUxJRF9BTElHTk1FTlQJCTQKKyNkZWZpbmUgSFZfU1RBVFVTX0lOU1VGRklDSUVOVF9CVUZGRVJTCQkxOQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvS2NvbmZpZyBiL2RyaXZlcnMvS2NvbmZpZwppbmRleCA2MjY4MTY3Li5iNWU2ZjI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL0tjb25maWcKKysrIGIvZHJpdmVycy9LY29uZmlnCkBAIC0xMzIsNiArMTMyLDggQEAKIAogc291cmNlICJkcml2ZXJzL3ZpcnQvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL2h2L0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9kZXZmcmVxL0tjb25maWciCiAKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvTWFrZWZpbGUgYi9kcml2ZXJzL01ha2VmaWxlCmluZGV4IDc1NWVhZjcuLjFiMzE0MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9NYWtlZmlsZQpAQCAtMTI5LDUgKzEyOSw2IEBACiAKICMgVmlydHVhbGl6YXRpb24gZHJpdmVycwogb2JqLSQoQ09ORklHX1ZJUlRfRFJJVkVSUykJKz0gdmlydC8KK29iai0kKENPTkZJR19IWVBFUlYpCQkrPSBodi8KIAogb2JqLSQoQ09ORklHX1BNX0RFVkZSRVEpCSs9IGRldmZyZXEvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvc2NjLmggYi9kcml2ZXJzL2NoYXIvc2NjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MWIxMTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL3NjYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEzICswLDAgQEAKLS8qCi0gKiBhdGFyaV9TQ0MuaDogRGVmaW5pdGlvbnMgZm9yIHRoZSBBbTg1MzAgU2VyaWFsIENvbW11bmljYXRpb25zIENvbnRyb2xsZXIKLSAqCi0gKiBDb3B5cmlnaHQgMTk5NCBSb21hbiBIb2RlayA8Um9tYW4uSG9kZWtAaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+Ci0gKgotICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCi0gKiBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0KLSNpZm5kZWYgX1NDQ19ICi0jZGVmaW5lIF9TQ0NfSAotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotLyogU3BlY2lhbCBjb25maWd1cmF0aW9uIGlvY3RscyBmb3IgdGhlIEF0YXJpIFNDQzUzODAgU2VyaWFsCi0gKiBDb21tdW5pY2F0aW9ucyBDb250cm9sbGVyCi0gKi8KLQotLyogaW9jdGwgY29tbWFuZCBjb2RlcyAqLwotCi0jZGVmaW5lIFRJT0NHQVRTQ0MJMHg1NGMwCS8qIGdldCBTQ0MgY29uZmlndXJhdGlvbiAqLwotI2RlZmluZSBUSU9DU0FUU0NDCTB4NTRjMQkvKiBzZXQgU0NDIGNvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgVElPQ0RBVFNDQwkweDU0YzIJLyogcmVzZXQgY29uZmlndXJhdGlvbiB0byBkZWZhdWx0cyAqLwotCi0vKiBDbG9jayBzb3VyY2VzICovCi0KLSNkZWZpbmUgQ0xLX1JUeEMJMAotI2RlZmluZSBDTEtfVFJ4QwkxCi0jZGVmaW5lIENMS19QQ0xLCTIKLQotLyogYmF1ZF9iYXNlcyBmb3IgdGhlIGNvbW1vbiBjbG9ja3MgaW4gdGhlIEF0YXJpLiBUaGVzZSBhcmUgdGhlIHJlYWwKLSAqIGZyZXF1ZW5jaWVzIGRpdmlkZWQgYnkgMTYuCi0gKi8KLSAgIAotI2RlZmluZSBTQ0NfQkFVRF9CQVNFX1RJTUMJMTkyMDAJLyogMC4zMDcyIE1IeiBmcm9tIFRULU1GUCwgVGltZXIgQyAqLwotI2RlZmluZSBTQ0NfQkFVRF9CQVNFX0JDTEsJMTUzNjAwCS8qIDIuNDU3NiBNSHogKi8KLSNkZWZpbmUgU0NDX0JBVURfQkFTRV9QQ0xLNAkyMjk1MDAJLyogMy42NzIwIE1IeiAqLwotI2RlZmluZSBTQ0NfQkFVRF9CQVNFX1BDTEsJNTAzMzc0CS8qIDguMDUzOTc2MyBNSHogKi8KLSNkZWZpbmUgU0NDX0JBVURfQkFTRV9OT05FCTAJLyogZm9yIG5vdCBjb25uZWN0ZWQgb3IgdW51c2VkCi0JCQkJCSAqIGNsb2NrIHNvdXJjZXMgKi8KLQotLyogVGhlIFNDQyBjbG9jayBjb25maWd1cmF0aW9uIHN0cnVjdHVyZSAqLwotCi1zdHJ1Y3Qgc2NjX2Nsb2NrX2NvbmZpZyB7Ci0JdW5zaWduZWQJUlR4Q19iYXNlOwkvKiBiYXNlX2JhdWQgb2YgUlR4QyAqLwotCXVuc2lnbmVkCVRSeENfYmFzZTsJLyogYmFzZV9iYXVkIG9mIFRSeEMgKi8KLQl1bnNpZ25lZAlQQ0xLX2Jhc2U7CS8qIGJhc2VfYmF1ZCBvZiBQQ0xLLCBib3RoIGNoYW5uZWxzISAqLwotCXN0cnVjdCB7Ci0JCXVuc2lnbmVkIGNsa3NyYzsJLyogQ0xLX1JUeEMsIENMS19UUnhDIG9yIENMS19QQ0xLICovCi0JCXVuc2lnbmVkIGRpdmlzb3I7CS8qIGRpdmlzb3IgZm9yIGJhc2UgYmF1ZCwgdmFsaWQgdmFsdWVzOgotCQkJCQkgKiBzZWUgYmVsb3cgKi8KLQl9IGJhdWRfdGFibGVbMTddOwkJLyogRm9yIDUwLCA3NSwgMTEwLCAxMzUsIDE1MCwgMjAwLCAzMDAsCi0JCQkJCSAqIDYwMCwgMTIwMCwgMTgwMCwgMjQwMCwgNDgwMCwgOTYwMCwKLQkJCQkJICogMTkyMDAsIDM4NDAwLCA1NzYwMCBhbmQgMTE1MjAwIGJwcy4KLQkJCQkJICogVGhlIGxhc3QgdHdvIGNvdWxkIGJlIHJlcGxhY2VkIGJ5Ci0JCQkJCSAqIG90aGVyIHJhdGVzID4gMzg0MDAgaWYgdGhleSdyZSBub3QKLQkJCQkJICogcG9zc2libGUuCi0JCQkJCSAqLwotfTsKLQotLyogVGhlIGZvbGxvd2luZyBkaXZpc29ycyBhcmUgdmFsaWQ6Ci0gKgotICogICAtIENMS19SVHhDOiAxIG9yIGV2ZW4gKDEsIDIgYW5kIDQgYXJlIHRoZSBkaXJlY3QgbW9kZXMsID4gNCB1c2UKLSAqICAgICAgICAgICAgICAgdGhlIEJSRykKLSAqCi0gKiAgIC0gQ0xLX1RSeEM6IDEsIDIgb3IgNCAobm8gQlJHLCBvbmx5IGRpcmVjdCBtb2RlcyBwb3NzaWJsZSkKLSAqCi0gKiAgIC0gQ0xLX1BDTEs6ID49IDQgYW5kIGV2ZW4gKG5vIGRpcmVjdCBtb2Rlcywgb25seSBCUkcpCi0gKgotICovCi0KLXN0cnVjdCBzY2NfcG9ydCB7Ci0Jc3RydWN0IGdzX3BvcnQJCWdzOwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJKmN0cmxwOwotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIJKmRhdGFwOwotCWludAkJCXhfY2hhcjsJCS8qIHhvbi94b2ZmIGNoYXJhY3RlciAqLwotCWludAkJCWNfZGNkOwotCWludAkJCWNoYW5uZWw7Ci0Jc3RydWN0IHNjY19wb3J0CQkqcG9ydF9hOwkvKiBSZWZlcmVuY2UgdG8gcG9ydCBBIGFuZCBCICovCi0Jc3RydWN0IHNjY19wb3J0CQkqcG9ydF9iOwkvKiAgIHN0cnVjdHMgZm9yIHJlZyBhY2Nlc3MgICovCi19OwotCi0jZGVmaW5lIFNDQ19NQUdJQwkweDUyNjk2MzY4Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlciBOYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIFNDQyBkb2N1bWVudGF0aW9uIGdpdmVzIG5vIGV4cGxpY2l0IG5hbWVzIHRvIHRoZSByZWdpc3RlcnMsCi0gKiB0aGV5J3JlIGp1c3QgY2FsbGVkIFdSMC4uMTUgYW5kIFJSMC4uMTUuIFRvIG1ha2UgdGhlIHNvdXJjZSBjb2RlCi0gKiBiZXR0ZXIgcmVhZGFibGUgYW5kIG1ha2UgdGhlIHRyYW5zcGFyZW50IHdyaXRlIHJlZyByZWFkIGFjY2VzcyAoc2VlCi0gKiBiZWxvdykgcG9zc2libGUsIEkgY2hyaXN0ZW4gdGhlbSBoZXJlIHdpdGggc2VsZi1pbnZlbnRlZCBuYW1lcy4KLSAqIE5vdGUgdGhhdCAocmVhbCkgcmVhZCByZWdpc3RlcnMgYXJlIGFzc2lnbmVkIG51bWJlcnMgMTYuLjMxLiBXUjcnCi0gKiBoYXMgbnVtYmVyIDMzLgotICovCi0KLSNkZWZpbmUJQ09NTUFORF9SRUcJCTAJLyogd28gKi8KLSNkZWZpbmUJSU5UX0FORF9ETUFfUkVHCQkxCS8qIHdvICovCi0jZGVmaW5lCUlOVF9WRUNUT1JfUkVHCQkyCS8qIHJ3LCBjb21tb24gdG8gYm90aCBjaGFubmVscyAqLwotI2RlZmluZQlSWF9DVFJMX1JFRwkJMwkvKiBydyAqLwotI2RlZmluZQlBVVgxX0NUUkxfUkVHCQk0CS8qIHJ3ICovCi0jZGVmaW5lCVRYX0NUUkxfUkVHCQk1CS8qIHJ3ICovCi0jZGVmaW5lCVNZTkNfQURSX1JFRwkJNgkvKiB3byAqLwotI2RlZmluZQlTWU5DX0NIQVJfUkVHCQk3CS8qIHdvICovCi0jZGVmaW5lCVNETENfT1BUSU9OX1JFRwkJMzMJLyogd28gKi8KLSNkZWZpbmUJVFhfREFUQV9SRUcJCTgJLyogd28gKi8KLSNkZWZpbmUJTUFTVEVSX0lOVF9DVFJMCQk5CS8qIHdvLCBjb21tb24gdG8gYm90aCBjaGFubmVscyAqLwotI2RlZmluZQlBVVgyX0NUUkxfUkVHCQkxMAkvKiBydyAqLwotI2RlZmluZQlDTEtfQ1RSTF9SRUcJCTExCS8qIHdvICovCi0jZGVmaW5lCVRJTUVSX0xPV19SRUcJCTEyCS8qIHJ3ICovCi0jZGVmaW5lCVRJTUVSX0hJR0hfUkVHCQkxMwkvKiBydyAqLwotI2RlZmluZQlEUExMX0NUUkxfUkVHCQkxNAkvKiB3byAqLwotI2RlZmluZQlJTlRfQ1RSTF9SRUcJCTE1CS8qIHJ3ICovCi0KLSNkZWZpbmUJU1RBVFVTX1JFRwkJMTYJLyogcm8gKi8KLSNkZWZpbmUJU1BDT05EX1NUQVRVU19SRUcJMTcJLyogd28gKi8KLS8qIFJSMiBpcyBXUjIgZm9yIENoYW5uZWwgQSwgQ2hhbm5lbCBCIGdpdmVzIHZlY3RvciArIGN1cnJlbnQgc3RhdHVzOiAqLwotI2RlZmluZQlDVVJSX1ZFQ1RPUl9SRUcJCTE4CS8qIENoLiBCIG9ubHksIENoLiBBIGZvciBydyAqLwotI2RlZmluZQlJTlRfUEVORElOR19SRUcJCTE5CS8qIENoYW5uZWwgQSBvbmx5ISAqLwotLyogUlI0IGlzIFdSNCwgaWYgYjYoTVI3JykgPT0gMSAqLwotLyogUlI1IGlzIFdSNSwgaWYgYjYoTVI3JykgPT0gMSAqLwotI2RlZmluZQlGU19GSUZPX0xPV19SRUcJCTIyCS8qIHJvICovCi0jZGVmaW5lCUZTX0ZJRk9fSElHSF9SRUcJMjMJLyogcm8gKi8KLSNkZWZpbmUJUlhfREFUQV9SRUcJCTI0CS8qIHJvICovCi0vKiBSUjkgaXMgV1IzLCBpZiBiNihNUjcnKSA9PSAxICovCi0jZGVmaW5lCURQTExfU1RBVFVTX1JFRwkJMjYJLyogcm8gKi8KLS8qIFJSMTEgaXMgV1IxMCwgaWYgYjYoTVI3JykgPT0gMSAqLwotLyogUlIxMiBpcyBXUjEyICovCi0vKiBSUjEzIGlzIFdSMTMgKi8KLS8qIFJSMTQgbm90IHByZXNlbnQgKi8KLS8qIFJSMTUgaXMgV1IxNSAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlciBWYWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKiBXUjA6IENPTU1BTkRfUkVHICJDUiIgKi8KLQotI2RlZmluZQlDUl9SWF9DUkNfUkVTRVQJCTB4NDAKLSNkZWZpbmUJQ1JfVFhfQ1JDX1JFU0VUCQkweDgwCi0jZGVmaW5lCUNSX1RYX1VOREVSUlVOX1JFU0VUCTB4YzAKLQotI2RlZmluZQlDUl9FWFRTVEFUX1JFU0VUCTB4MTAKLSNkZWZpbmUJQ1JfU0VORF9BQk9SVAkJMHgxOAotI2RlZmluZQlDUl9FTkFCX0lOVF9ORVhUX1JYCTB4MjAKLSNkZWZpbmUJQ1JfVFhfUEVORElOR19SRVNFVAkweDI4Ci0jZGVmaW5lCUNSX0VSUk9SX1JFU0VUCQkweDMwCi0jZGVmaW5lCUNSX0hJR0hFU1RfSVVTX1JFU0VUCTB4MzgKLQotCi0vKiBXUjE6IElOVF9BTkRfRE1BX1JFRyAiSURSIiAqLwotCi0jZGVmaW5lCUlEUl9FWFRTVEFUX0lOVF9FTkFCCTB4MDEKLSNkZWZpbmUJSURSX1RYX0lOVF9FTkFCCQkweDAyCi0jZGVmaW5lCUlEUl9QQVJFUlJfQVNfU1BDT05ECTB4MDQKLQotI2RlZmluZQlJRFJfUlhfSU5UX0RJU0FCCTB4MDAKLSNkZWZpbmUJSURSX1JYX0lOVF9GSVJTVAkweDA4Ci0jZGVmaW5lCUlEUl9SWF9JTlRfQUxMCQkweDEwCi0jZGVmaW5lCUlEUl9SWF9JTlRfU1BDT05ECTB4MTgKLSNkZWZpbmUJSURSX1JYX0lOVF9NQVNLCQkweDE4Ci0KLSNkZWZpbmUJSURSX1dBSVRSRVFfUlgJCTB4MjAKLSNkZWZpbmUJSURSX1dBSVRSRVFfSVNfUkVRCTB4NDAKLSNkZWZpbmUJSURSX1dBSVRSRVFfRU5BQgkweDgwCi0KLQotLyogV1IzOiBSWF9DVFJMX1JFRyAiUkNSIiAqLwotCi0jZGVmaW5lCVJDUl9SWF9FTkFCCQkweDAxCi0jZGVmaW5lCVJDUl9ESVNDQVJEX1NZTkNfQ0hBUlMJMHgwMgotI2RlZmluZQlSQ1JfQUREUl9TRUFSQ0gJCTB4MDQKLSNkZWZpbmUJUkNSX0NSQ19FTkFCCQkweDA4Ci0jZGVmaW5lCVJDUl9TRUFSQ0hfTU9ERQkJMHgxMAotI2RlZmluZQlSQ1JfQVVUT19FTkFCX01PREUJMHgyMAotCi0jZGVmaW5lCVJDUl9DSFNJWkVfTUFTSwkJMHhjMAotI2RlZmluZQlSQ1JfQ0hTSVpFXzUJCTB4MDAKLSNkZWZpbmUJUkNSX0NIU0laRV82CQkweDQwCi0jZGVmaW5lCVJDUl9DSFNJWkVfNwkJMHg4MAotI2RlZmluZQlSQ1JfQ0hTSVpFXzgJCTB4YzAKLQotCi0vKiBXUjQ6IEFVWDFfQ1RSTF9SRUcgIkExQ1IiICovCi0KLSNkZWZpbmUJQTFDUl9QQVJJVFlfTUFTSwkweDAzCi0jZGVmaW5lCUExQ1JfUEFSSVRZX05PTkUJMHgwMAotI2RlZmluZQlBMUNSX1BBUklUWV9PREQJCTB4MDEKLSNkZWZpbmUJQTFDUl9QQVJJVFlfRVZFTgkweDAzCi0KLSNkZWZpbmUJQTFDUl9NT0RFX01BU0sJCTB4MGMKLSNkZWZpbmUJQTFDUl9NT0RFX1NZTkNSCQkweDAwCi0jZGVmaW5lCUExQ1JfTU9ERV9BU1lOQ18xCTB4MDQKLSNkZWZpbmUJQTFDUl9NT0RFX0FTWU5DXzE1CTB4MDgKLSNkZWZpbmUJQTFDUl9NT0RFX0FTWU5DXzIJMHgwYwotCi0jZGVmaW5lCUExQ1JfU1lOQ1JfTU9ERV9NQVNLCTB4MzAKLSNkZWZpbmUJQTFDUl9TWU5DUl9NT05PU1lOQwkweDAwCi0jZGVmaW5lCUExQ1JfU1lOQ1JfQklTWU5DCTB4MTAKLSNkZWZpbmUJQTFDUl9TWU5DUl9TRExDCQkweDIwCi0jZGVmaW5lCUExQ1JfU1lOQ1JfRVhUQ1NZTkMJMHgzMAotCi0jZGVmaW5lCUExQ1JfQ0xLTU9ERV9NQVNLCTB4YzAKLSNkZWZpbmUJQTFDUl9DTEtNT0RFX3gxCQkweDAwCi0jZGVmaW5lCUExQ1JfQ0xLTU9ERV94MTYJMHg0MAotI2RlZmluZQlBMUNSX0NMS01PREVfeDMyCTB4ODAKLSNkZWZpbmUJQTFDUl9DTEtNT0RFX3g2NAkweGMwCi0KLQotLyogV1I1OiBUWF9DVFJMX1JFRyAiVENSIiAqLwotCi0jZGVmaW5lCVRDUl9UWF9DUkNfRU5BQgkJMHgwMQotI2RlZmluZQlUQ1JfUlRTCQkJMHgwMgotI2RlZmluZQlUQ1JfVVNFX0NSQ19DQ0lUVAkweDAwCi0jZGVmaW5lCVRDUl9VU0VfQ1JDXzE2CQkweDA0Ci0jZGVmaW5lCVRDUl9UWF9FTkFCCQkweDA4Ci0jZGVmaW5lCVRDUl9TRU5EX0JSRUFLCQkweDEwCi0KLSNkZWZpbmUJVENSX0NIU0laRV9NQVNLCQkweDYwCi0jZGVmaW5lCVRDUl9DSFNJWkVfNQkJMHgwMAotI2RlZmluZQlUQ1JfQ0hTSVpFXzYJCTB4MjAKLSNkZWZpbmUJVENSX0NIU0laRV83CQkweDQwCi0jZGVmaW5lCVRDUl9DSFNJWkVfOAkJMHg2MAotCi0jZGVmaW5lCVRDUl9EVFIJCQkweDgwCi0KLQotLyogV1I3JzogU0xEQ19PUFRJT05fUkVHICJTT1IiICovCi0KLSNkZWZpbmUJU09SX0FVVE9fVFhfRU5BQgkweDAxCi0jZGVmaW5lCVNPUl9BVVRPX0VPTV9SRVNFVAkweDAyCi0jZGVmaW5lCVNPUl9BVVRPX1JUU19NT0RFCTB4MDQKLSNkZWZpbmUJU09SX05SWklfRElTQUJfSElHSAkweDA4Ci0jZGVmaW5lCVNPUl9BTFRfRFRSUkVRX1RJTUlORwkweDEwCi0jZGVmaW5lCVNPUl9SRUFEX0NSQ19DSEFSUwkweDIwCi0jZGVmaW5lCVNPUl9FWFRFTkRFRF9SRUdfQUNDRVNTCTB4NDAKLQotCi0vKiBXUjk6IE1BU1RFUl9JTlRfQ1RSTCAiTUlDIiAqLwotCi0jZGVmaW5lCU1JQ19WRUNfSU5DTF9TVEFUCTB4MDEKLSNkZWZpbmUJTUlDX05PX1ZFQ1RPUgkJMHgwMgotI2RlZmluZQlNSUNfRElTQUJfTE9XRVJfQ0hBSU4JMHgwNAotI2RlZmluZQlNSUNfTUFTVEVSX0lOVF9FTkFCCTB4MDgKLSNkZWZpbmUJTUlDX1NUQVRVU19ISUdICQkweDEwCi0jZGVmaW5lCU1JQ19JR05fSU5UQUNLCQkweDIwCi0KLSNkZWZpbmUJTUlDX05PX1JFU0VUCQkweDAwCi0jZGVmaW5lCU1JQ19DSF9BX1JFU0VUCQkweDQwCi0jZGVmaW5lCU1JQ19DSF9CX1JFU0VUCQkweDgwCi0jZGVmaW5lCU1JQ19IQVJEX1JFU0VUCQkweGMwCi0KLQotLyogV1IxMDogQVVYMl9DVFJMX1JFRyAiQTJDUiIgKi8KLQotI2RlZmluZQlBMkNSX1NZTkNfNgkJMHgwMQotI2RlZmluZQlBMkNSX0xPT1BfTU9ERQkJMHgwMgotI2RlZmluZQlBMkNSX0FCT1JUX09OX1VOREVSUlVOCTB4MDQKLSNkZWZpbmUJQTJDUl9NQVJLX0lETEUJCTB4MDgKLSNkZWZpbmUJQTJDUl9HT19BQ1RJVkVfT05fUE9MTAkweDEwCi0KLSNkZWZpbmUJQTJDUl9DT0RJTkdfTUFTSwkweDYwCi0jZGVmaW5lCUEyQ1JfQ09ESU5HX05SWgkJMHgwMAotI2RlZmluZQlBMkNSX0NPRElOR19OUlpJCTB4MjAKLSNkZWZpbmUJQTJDUl9DT0RJTkdfRk0xCQkweDQwCi0jZGVmaW5lCUEyQ1JfQ09ESU5HX0ZNMAkJMHg2MAotCi0jZGVmaW5lCUEyQ1JfUFJFU0VUX0NSQ18xCTB4ODAKLQotCi0vKiBXUjExOiBDTEtfQ1RSTF9SRUcgIkNDUiIgKi8KLQotI2RlZmluZQlDQ1JfVFJ4Q09VVF9NQVNLCTB4MDMKLSNkZWZpbmUJQ0NSX1RSeENPVVRfWFRBTAkweDAwCi0jZGVmaW5lCUNDUl9UUnhDT1VUX1RYQ0xLCTB4MDEKLSNkZWZpbmUJQ0NSX1RSeENPVVRfQlJHCQkweDAyCi0jZGVmaW5lCUNDUl9UUnhDT1VUX0RQTEwJMHgwMwotCi0jZGVmaW5lCUNDUl9UUnhDX09VVFBVVAkJMHgwNAotCi0jZGVmaW5lCUNDUl9UWENMS19NQVNLCQkweDE4Ci0jZGVmaW5lCUNDUl9UWENMS19SVHhDCQkweDAwCi0jZGVmaW5lCUNDUl9UWENMS19UUnhDCQkweDA4Ci0jZGVmaW5lCUNDUl9UWENMS19CUkcJCTB4MTAKLSNkZWZpbmUJQ0NSX1RYQ0xLX0RQTEwJCTB4MTgKLQotI2RlZmluZQlDQ1JfUlhDTEtfTUFTSwkJMHg2MAotI2RlZmluZQlDQ1JfUlhDTEtfUlR4QwkJMHgwMAotI2RlZmluZQlDQ1JfUlhDTEtfVFJ4QwkJMHgyMAotI2RlZmluZQlDQ1JfUlhDTEtfQlJHCQkweDQwCi0jZGVmaW5lCUNDUl9SWENMS19EUExMCQkweDYwCi0KLSNkZWZpbmUJQ0NSX1JUeENfWFRBTAkJMHg4MAotCi0KLS8qIFdSMTQ6IERQTExfQ1RSTF9SRUcgIkRDUiIgKi8KLQotI2RlZmluZQlEQ1JfQlJHX0VOQUIJCTB4MDEKLSNkZWZpbmUJRENSX0JSR19VU0VfUENMSwkweDAyCi0jZGVmaW5lCURDUl9EVFJSRVFfSVNfUkVRCTB4MDQKLSNkZWZpbmUJRENSX0FVVE9fRUNITwkJMHgwOAotI2RlZmluZQlEQ1JfTE9DQUxfTE9PUEJBQ0sJMHgxMAotCi0jZGVmaW5lCURDUl9EUExMX0VER0VfU0VBUkNICTB4MjAKLSNkZWZpbmUJRENSX0RQTExfRVJSX1JFU0VUCTB4NDAKLSNkZWZpbmUJRENSX0RQTExfRElTQUIJCTB4NjAKLSNkZWZpbmUJRENSX0RQTExfQ0xLX0JSRwkweDgwCi0jZGVmaW5lCURDUl9EUExMX0NMS19SVHhDCTB4YTAKLSNkZWZpbmUJRENSX0RQTExfRk0JCTB4YzAKLSNkZWZpbmUJRENSX0RQTExfTlJaSQkJMHhlMAotCi0KLS8qIFdSMTU6IElOVF9DVFJMX1JFRyAiSUNSIiAqLwotCi0jZGVmaW5lCUlDUl9PUFRJT05SRUdfU0VMRUNUCTB4MDEKLSNkZWZpbmUJSUNSX0VOQUJfQlJHX1pFUk9fSU5UCTB4MDIKLSNkZWZpbmUJSUNSX1VTRV9GU19GSUZPCQkweDA0Ci0jZGVmaW5lCUlDUl9FTkFCX0RDRF9JTlQJMHgwOAotI2RlZmluZQlJQ1JfRU5BQl9TWU5DX0lOVAkweDEwCi0jZGVmaW5lCUlDUl9FTkFCX0NUU19JTlQJMHgyMAotI2RlZmluZQlJQ1JfRU5BQl9VTkRFUlJVTl9JTlQJMHg0MAotI2RlZmluZQlJQ1JfRU5BQl9CUkVBS19JTlQJMHg4MAotCi0KLS8qIFJSMDogU1RBVFVTX1JFRyAiU1IiICovCi0KLSNkZWZpbmUJU1JfQ0hBUl9BVkFJTAkJMHgwMQotI2RlZmluZQlTUl9CUkdfWkVSTwkJMHgwMgotI2RlZmluZQlTUl9UWF9CVUZfRU1QVFkJCTB4MDQKLSNkZWZpbmUJU1JfRENECQkJMHgwOAotI2RlZmluZQlTUl9TWU5DX0FCT1JUCQkweDEwCi0jZGVmaW5lCVNSX0NUUwkJCTB4MjAKLSNkZWZpbmUJU1JfVFhfVU5ERVJSVU4JCTB4NDAKLSNkZWZpbmUJU1JfQlJFQUsJCTB4ODAKLQotCi0vKiBSUjE6IFNQQ09ORF9TVEFUVVNfUkVHICJTQ1NSIiAqLwotCi0jZGVmaW5lCVNDU1JfQUxMX1NFTlQJCTB4MDEKLSNkZWZpbmUJU0NTUl9SRVNJRFVBTF9NQVNLCTB4MGUKLSNkZWZpbmUJU0NTUl9QQVJJVFlfRVJSCQkweDEwCi0jZGVmaW5lCVNDU1JfUlhfT1ZFUlJVTgkJMHgyMAotI2RlZmluZQlTQ1NSX0NSQ19GUkFNRV9FUlIJMHg0MAotI2RlZmluZQlTQ1NSX0VORF9PRl9GUkFNRQkweDgwCi0KLQotLyogUlIzOiBJTlRfUEVORElOR19SRUcgIklQUiIgKi8KLQotI2RlZmluZQlJUFJfQl9FWFRTVEFUCQkweDAxCi0jZGVmaW5lCUlQUl9CX1RYCQkweDAyCi0jZGVmaW5lCUlQUl9CX1JYCQkweDA0Ci0jZGVmaW5lCUlQUl9BX0VYVFNUQVQJCTB4MDgKLSNkZWZpbmUJSVBSX0FfVFgJCTB4MTAKLSNkZWZpbmUJSVBSX0FfUlgJCTB4MjAKLQotCi0vKiBSUjc6IEZTX0ZJRk9fSElHSF9SRUcgIkZGSFIiICovCi0KLSNkZWZpbmUJRkZIUl9DTlRfTUFTSwkJMHgzZgotI2RlZmluZQlGRkhSX0lTX0ZST01fRklGTwkweDQwCi0jZGVmaW5lCUZGSFJfRklGT19PVkVSUlVOCTB4ODAKLQotCi0vKiBSUjEwOiBEUExMX1NUQVRVU19SRUcgIkRTUiIgKi8KLQotI2RlZmluZQlEU1JfT05fTE9PUAkJMHgwMgotI2RlZmluZQlEU1JfT05fTE9PUF9TRU5ESU5HCTB4MTAKLSNkZWZpbmUJRFNSX1RXT19DTEtfTUlTU0lORwkweDQwCi0jZGVmaW5lCURTUl9PTkVfQ0xLX01JU1NJTkcJMHg4MAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXIgQWNjZXNzICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyogVGhlIFNDQyBuZWVkcyAzLjUgUENMSyBjeWNsZXMgcmVjb3ZlcnkgdGltZSBiZXR3ZWVuIHRvIHJlZ2lzdGVyCi0gKiBhY2Nlc3Nlcy4gUENMSyBydW5zIHdpdGggOCBNSHogb24gYW4gQXRhcmksIHNvIHRoaXMgZGVsYXkgaXMgMy41ICoKLSAqIDEyNSBucyA9IDQzNy41IG5zLiBUaGlzIGlzIHRvbyBzaG9ydCBmb3IgdWRlbGF5KCkuCi0gKiAxMC8xNi85NTogQSB0c3RiIHN0X21mcC5wYXJfZHRfcmVnIHRha2VzIDYwMG5zIChzdXJlPykgYW5kIHRodXMgc2hvdWxkIGJlCi0gKiBxdWl0ZSByaWdodAotICovCi0KLSNkZWZpbmUgc2NjX3JlZ19kZWxheSgpIFwKLSAgICBkbyB7CQkJXAotCWlmIChNQUNIX0lTX01WTUUxNnggfHwgTUFDSF9JU19CVk1FNjAwMCB8fCBNQUNIX0lTX01WTUUxNDcpCVwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18gKCAiIG5vcDsgbm9wIik7CQkJXAotCWVsc2UgaWYgKE1BQ0hfSVNfQVRBUkkpCQkJCQkJXAotCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoICJ0c3RiICUwIiA6IDogImciICgqX3NjY19kZWwpIDogImNjIiApO1wKLSAgICB9IHdoaWxlICgwKQotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBzY2Nfc2hhZG93WzJdWzE2XTsKLQotLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgc2hvdWxkIHJlbGF4IHRoZSBzb21laG93IGNvbXBsaWNhdGVkCi0gKiByZWdpc3RlciBhY2Nlc3Mgb2YgdGhlIFNDQy4gX1NDQ3dyaXRlKCkgc3RvcmVzIGFsbCB3cml0dGVuIHZhbHVlcwotICogKGV4Y2VwdCBmb3IgV1IwIGFuZCBXUjgpIGluIHNoYWRvdyByZWdpc3RlcnMgZm9yIGxhdGVyIHJlY2FsbC4gVGhpcwotICogcmVtb3ZlcyB0aGUgYnVyZGVuIG9mIHJlbWVtYmVyaW5nIHdyaXR0ZW4gdmFsdWVzIGFzIG5lZWRlZC4gVGhlCi0gKiBleHRyYSB3b3JrIG9mIHN0b3JpbmcgdGhlIHZhbHVlIGRvZXNuJ3QgY291bnQsIHNpbmNlIGEgZGVsYXkgaXMKLSAqIG5lZWRlZCBhZnRlciBhIFNDQyBhY2Nlc3MgYW55d2F5LiBBZGRpdGlvbmFsbHksIF9TQ0N3cml0ZSgpIG1hbmFnZXMKLSAqIHdyaXRlcyB0byBXUjAgYW5kIFdSOCBkaWZmZXJlbnRseSwgYmVjYXVzZSB0aGVzZSBjYW4gYmUgYWNjZXNzZWQKLSAqIGRpcmVjdGx5IHdpdGggbGVzcyBvdmVyaGVhZC4gQW5vdGhlciBzcGVjaWFsIGNhc2UgYXJlIFdSNyBhbmQgV1I3Jy4KLSAqIF9TQ0N3cml0ZSBhdXRvbWF0aWNhbGx5IGNoZWNrcyB3aGF0IG9mIHRoaXMgcmVnaXN0ZXJzIGlzIHNlbGVjdGVkCi0gKiBhbmQgY2hhbmdlcyBiMCBvZiBXUjE1IGlmIG5lZWRlZC4KLSAqIAotICogX1NDQ3JlYWQoKSBmb3Igc3RhbmRhcmQgcmVhZCByZWdpc3RlcnMgaXMgc3RyYWlnaHRmb3J3YXJkLCBleGNlcHQKLSAqIGZvciBSUjIgKHNwbGl0IGludG8gdHdvICJ2aXJ0dWFsIiByZWdpc3RlcnM6IG9uZSBmb3IgdGhlIHZhbHVlCi0gKiB3cml0dGVuIHRvIFdSMiAoZnJvbSB0aGUgc2hhZG93KSBhbmQgb25lIGZvciB0aGUgdmVjdG9yIGluY2x1ZGluZwotICogc3RhdHVzIGZyb20gUlIyLCBDaC4gQikgYW5kIFJSMy4gVGhlIGxhdHRlciBtdXN0IGJlIHJlYWQgZnJvbQotICogQ2hhbm5lbCBBLCBiZWNhdXNlIGl0IHJlYWRzIGFzIGFsbCB6ZXJvcyBvbiBDaC4gQi4gUlIwIGFuZCBSUjggY2FuCi0gKiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBhcyBiZWZvcmUuCi0gKiAKLSAqIFRoZSB0d28gaW5saW5lIGZ1bmN0aW9uIGNvbnRhaW4gY29tcGxpY2F0ZWQgc3dpdGNoIHN0YXRlbWVudHMuIEJ1dAotICogSSByZWx5IG9uIHJlZ25vIGFuZCBmaW5hbF9kZWxheSBiZWluZyBjb25zdGFudHMsIHNvIGdjYyBjYW4gcmVkdWNlCi0gKiB0aGUgd2hvbGUgc3R1ZmYgdG8ganVzdCBzb21lIGFzc2VtYmxlciBzdGF0ZW1lbnRzLgotICogCi0gKiBfU0NDd3JpdGUgYW5kIF9TQ0NyZWFkIGFyZW4ndCBpbnRlbmRlZCB0byBiZSB1c2VkIGRpcmVjdGx5IHVuZGVyCi0gKiBub3JtYWwgY2lyY3Vtc3RhbmNlcy4gVGhlIG1hY3JvcyBTQ0NyZWFkW19ORF0gYW5kIFNDQ3dyaXRlW19ORF0gYXJlCi0gKiBmb3IgdGhhdCBwdXJwb3NlLiBUaGV5IGFzc3VtZSB0aGF0IGEgbG9jYWwgdmFyaWFibGUgJ3BvcnQnIGlzCi0gKiBkZWNsYXJlZCBhbmQgcG9pbnRpbmcgdG8gdGhlIHBvcnQncyBzY2Nfc3RydWN0IGVudHJ5LiBUaGUKLSAqIHZhcmlhbnRzIHdpdGggIl9OQiIgYXBwZW5kZWQgc2hvdWxkIGJlIHVzZWQgaWYgbm8gb3RoZXIgU0NDCi0gKiBhY2Nlc3NlcyBmb2xsb3cgaW1tZWRpYXRlbHkgKHdpdGhpbiAwLjUgdXNlY3MpLiBUaGV5IGp1c3Qgc2tpcCB0aGUKLSAqIGZpbmFsIGRlbGF5IG5vcHMuCi0gKiAKLSAqIFBsZWFzZSBub3RlIHRoYXQgYWNjZXNzZXMgdG8gU0NDIHJlZ2lzdGVycyBzaG91bGQgb25seSB0YWtlIHBsYWNlCi0gKiB3aGVuIGludGVycnVwdHMgYXJlIHR1cm5lZCBvZmYgKGF0IGxlYXN0IGlmIFNDQyBpbnRlcnJ1cHRzIGFyZQotICogZW5hYmxlZCkuIE90aGVyd2lzZSwgYW4gaW50ZXJydXB0IGNvdWxkIGludGVyZmVyZSB3aXRoIHRoZQotICogdHdvLXN0YWdlIGFjY2Vzc2luZyBwcm9jZXNzLgotICoKLSAqLwotCi0KLXN0YXRpYyBfX2lubGluZV9fIHZvaWQgX1NDQ3dyaXRlKAotCXN0cnVjdCBzY2NfcG9ydCAqcG9ydCwKLQl1bnNpZ25lZCBjaGFyICpzaGFkb3csCi0Jdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqX3NjY19kZWwsCi0JaW50IHJlZ25vLAotCXVuc2lnbmVkIGNoYXIgdmFsLCBpbnQgZmluYWxfZGVsYXkgKQotewotCXN3aXRjaCggcmVnbm8gKSB7Ci0KLQkgIGNhc2UgQ09NTUFORF9SRUc6Ci0JCS8qIFdSMCBjYW4gYmUgd3JpdHRlbiBkaXJlY3RseSB3aXRob3V0IHBvaW50aW5nICovCi0JCSpwb3J0LT5jdHJscCA9IHZhbDsKLQkJYnJlYWs7Ci0KLQkgIGNhc2UgU1lOQ19DSEFSX1JFRzoKLQkJLyogRm9yIFdSNywgZmlyc3Qgc2V0IGIwIG9mIFdSMTUgdG8gMCwgaWYgbmVlZGVkICovCi0JCWlmIChzaGFkb3dbSU5UX0NUUkxfUkVHXSAmIElDUl9PUFRJT05SRUdfU0VMRUNUKSB7Ci0JCQkqcG9ydC0+Y3RybHAgPSAxNTsKLQkJCXNoYWRvd1tJTlRfQ1RSTF9SRUddICY9IH5JQ1JfT1BUSU9OUkVHX1NFTEVDVDsKLQkJCXNjY19yZWdfZGVsYXkoKTsKLQkJCSpwb3J0LT5jdHJscCA9IHNoYWRvd1tJTlRfQ1RSTF9SRUddOwotCQkJc2NjX3JlZ19kZWxheSgpOwotCQl9Ci0JCWdvdG8gbm9ybWFsX2Nhc2U7Ci0JCQotCSAgY2FzZSBTRExDX09QVElPTl9SRUc6Ci0JCS8qIEZvciBXUjcnLCBmaXJzdCBzZXQgYjAgb2YgV1IxNSB0byAxLCBpZiBuZWVkZWQgKi8KLQkJaWYgKCEoc2hhZG93W0lOVF9DVFJMX1JFR10gJiBJQ1JfT1BUSU9OUkVHX1NFTEVDVCkpIHsKLQkJCSpwb3J0LT5jdHJscCA9IDE1OwotCQkJc2hhZG93W0lOVF9DVFJMX1JFR10gfD0gSUNSX09QVElPTlJFR19TRUxFQ1Q7Ci0JCQlzY2NfcmVnX2RlbGF5KCk7Ci0JCQkqcG9ydC0+Y3RybHAgPSBzaGFkb3dbSU5UX0NUUkxfUkVHXTsKLQkJCXNjY19yZWdfZGVsYXkoKTsKLQkJfQotCQkqcG9ydC0+Y3RybHAgPSA3OwotCQlzaGFkb3dbOF0gPSB2YWw7CS8qIFdSNycgc2hhZG93ZWQgYXQgV1I4ICovCi0JCXNjY19yZWdfZGVsYXkoKTsKLQkJKnBvcnQtPmN0cmxwID0gdmFsOwotCQlicmVhazsKLQotCSAgY2FzZSBUWF9EQVRBX1JFRzoJCS8qIFdSOCAqLwotCQkvKiBUWF9EQVRBX1JFRyBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgb24gc29tZSBoL3cgKi8KLQkJaWYgKE1BQ0hfSVNfTVZNRTE2eCB8fCBNQUNIX0lTX0JWTUU2MDAwIHx8IE1BQ0hfSVNfTVZNRTE0NykKLQkJewotCQkJKnBvcnQtPmN0cmxwID0gcmVnbm87Ci0JCQlzY2NfcmVnX2RlbGF5KCk7Ci0JCQkqcG9ydC0+Y3RybHAgPSB2YWw7Ci0JCX0KLQkJZWxzZQotCQkJKnBvcnQtPmRhdGFwID0gdmFsOwotCQlicmVhazsKLQotCSAgY2FzZSBNQVNURVJfSU5UX0NUUkw6Ci0JCSpwb3J0LT5jdHJscCA9IHJlZ25vOwotCQl2YWwgJj0gMHgzZjsJLyogYml0cyA2Li43IGFyZSB0aGUgcmVzZXQgY29tbWFuZHMgKi8KLQkJc2NjX3NoYWRvd1swXVtyZWdub10gPSB2YWw7Ci0JCXNjY19yZWdfZGVsYXkoKTsKLQkJKnBvcnQtPmN0cmxwID0gdmFsOwotCQlicmVhazsKLQotCSAgY2FzZSBEUExMX0NUUkxfUkVHOgotCQkqcG9ydC0+Y3RybHAgPSByZWdubzsKLQkJdmFsICY9IDB4MWY7CQkJLyogYml0cyA1Li43IGFyZSB0aGUgRFBMTCBjb21tYW5kcyAqLwotCQlzaGFkb3dbcmVnbm9dID0gdmFsOwotCQlzY2NfcmVnX2RlbGF5KCk7Ci0JCSpwb3J0LT5jdHJscCA9IHZhbDsKLQkJYnJlYWs7Ci0KLQkgIGNhc2UgMSAuLi4gNjoJCi0JICBjYXNlIDEwIC4uLiAxMzoKLQkgIGNhc2UgMTU6Ci0JICBub3JtYWxfY2FzZToKLQkJKnBvcnQtPmN0cmxwID0gcmVnbm87Ci0JCXNoYWRvd1tyZWdub10gPSB2YWw7Ci0JCXNjY19yZWdfZGVsYXkoKTsKLQkJKnBvcnQtPmN0cmxwID0gdmFsOwotCQlicmVhazsKLQkJCi0JICBkZWZhdWx0OgotCQlwcmludGsoICJCYWQgU0NDIHdyaXRlIGFjY2VzcyB0byBXUiVkXG4iLCByZWdubyApOwotCQlicmVhazsKLQkJCi0JfQotCi0JaWYgKGZpbmFsX2RlbGF5KQotCQlzY2NfcmVnX2RlbGF5KCk7Ci19Ci0KLQotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgY2hhciBfU0NDcmVhZCgKLQlzdHJ1Y3Qgc2NjX3BvcnQgKnBvcnQsCi0JdW5zaWduZWQgY2hhciAqc2hhZG93LAotCXZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKl9zY2NfZGVsLAotCWludCByZWdubywgaW50IGZpbmFsX2RlbGF5ICkKLXsKLQl1bnNpZ25lZCBjaGFyIHJ2OwotCi0Jc3dpdGNoKCByZWdubyApIHsKLQotCQkvKiAtLS0gcmVhbCByZWFkIHJlZ2lzdGVycyAtLS0gKi8KLQkgIGNhc2UgU1RBVFVTX1JFRzoKLQkJcnYgPSAqcG9ydC0+Y3RybHA7Ci0JCWJyZWFrOwotCi0JICBjYXNlIElOVF9QRU5ESU5HX1JFRzoKLQkJLyogUlIzOiByZWFkIG9ubHkgZnJvbSBDaGFubmVsIEEhICovCi0JCXBvcnQgPSBwb3J0LT5wb3J0X2E7Ci0JCWdvdG8gbm9ybWFsX2Nhc2U7Ci0KLQkgIGNhc2UgUlhfREFUQV9SRUc6Ci0JCS8qIFJSOCBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHkgb24gc29tZSBoL3cgKi8KLQkJaWYgKE1BQ0hfSVNfTVZNRTE2eCB8fCBNQUNIX0lTX0JWTUU2MDAwIHx8IE1BQ0hfSVNfTVZNRTE0NykKLQkJewotCQkJKnBvcnQtPmN0cmxwID0gODsKLQkJCXNjY19yZWdfZGVsYXkoKTsKLQkJCXJ2ID0gKnBvcnQtPmN0cmxwOwotCQl9Ci0JCWVsc2UKLQkJCXJ2ID0gKnBvcnQtPmRhdGFwOwotCQlicmVhazsKLQotCSAgY2FzZSBDVVJSX1ZFQ1RPUl9SRUc6Ci0JCS8qIFJSMiAodmVjdG9yIGluY2x1ZGluZyBzdGF0dXMpIGZyb20gQ2guIEIgKi8KLQkJcG9ydCA9IHBvcnQtPnBvcnRfYjsKLQkJZ290byBub3JtYWxfY2FzZTsKLQkJCi0JCS8qIC0tLSByZWFkaW5nIHdyaXRlIHJlZ2lzdGVyczogYWNjZXNzIHRoZSBzaGFkb3cgLS0tICovCi0JICBjYXNlIDEgLi4uIDc6Ci0JICBjYXNlIDEwIC4uLiAxNToKLQkJcmV0dXJuIHNoYWRvd1tyZWdub107IC8qIG5vIGZpbmFsIGRlbGF5ISAqLwotCi0JCS8qIFdSNycgaXMgc3BlY2lhbCwgYmVjYXVzZSBpdCBpcyBzaGFkb3dlZCBhdCB0aGUgcGxhY2Ugb2YgV1I4ICovCi0JICBjYXNlIFNETENfT1BUSU9OX1JFRzoKLQkJcmV0dXJuIHNoYWRvd1s4XTsgLyogbm8gZmluYWwgZGVsYXkhICovCi0KLQkJLyogV1I5IGlzIHNwZWNpYWwgdG9vLCBiZWNhdXNlIGl0IGlzIGNvbW1vbiBmb3IgYm90aCBjaGFubmVscyAqLwotCSAgY2FzZSBNQVNURVJfSU5UX0NUUkw6Ci0JCXJldHVybiBzY2Nfc2hhZG93WzBdWzldOyAvKiBubyBmaW5hbCBkZWxheSEgKi8KLQotCSAgZGVmYXVsdDoKLQkJcHJpbnRrKCAiQmFkIFNDQyByZWFkIGFjY2VzcyB0byAlY1IlZFxuIiwgKHJlZ25vICYgMTYpID8gJ1InIDogJ1cnLAotCQkJCXJlZ25vICYgfjE2ICk7Ci0JCWJyZWFrOwotCQkKLQkgIGNhc2UgU1BDT05EX1NUQVRVU19SRUc6Ci0JICBjYXNlIEZTX0ZJRk9fTE9XX1JFRzoKLQkgIGNhc2UgRlNfRklGT19ISUdIX1JFRzoKLQkgIGNhc2UgRFBMTF9TVEFUVVNfUkVHOgotCSAgbm9ybWFsX2Nhc2U6Ci0JCSpwb3J0LT5jdHJscCA9IHJlZ25vICYgMHgwZjsKLQkJc2NjX3JlZ19kZWxheSgpOwotCQlydiA9ICpwb3J0LT5jdHJscDsKLQkJYnJlYWs7Ci0JCQotCX0KLQotCWlmIChmaW5hbF9kZWxheSkKLQkJc2NjX3JlZ19kZWxheSgpOwotCXJldHVybiBydjsKLX0KLQotI2RlZmluZSBTQ0NfQUNDRVNTX0lOSVQocG9ydCkJCQkJCQlcCi0JdW5zaWduZWQgY2hhciAqX3NjY19zaGFkb3cgPSAmc2NjX3NoYWRvd1twb3J0LT5jaGFubmVsXVswXQotCi0jZGVmaW5lCVNDQ3dyaXRlKHJlZyx2YWwpCV9TQ0N3cml0ZShwb3J0LF9zY2Nfc2hhZG93LHNjY19kZWwsKHJlZyksKHZhbCksMSkKLSNkZWZpbmUJU0NDd3JpdGVfTkIocmVnLHZhbCkJX1NDQ3dyaXRlKHBvcnQsX3NjY19zaGFkb3csc2NjX2RlbCwocmVnKSwodmFsKSwwKQotI2RlZmluZQlTQ0NyZWFkKHJlZykJCV9TQ0NyZWFkKHBvcnQsX3NjY19zaGFkb3csc2NjX2RlbCwocmVnKSwxKQotI2RlZmluZQlTQ0NyZWFkX05CKHJlZykJCV9TQ0NyZWFkKHBvcnQsX3NjY19zaGFkb3csc2NjX2RlbCwocmVnKSwwKQotCi0jZGVmaW5lIFNDQ21vZChyZWcsYW5kLG9yKQlTQ0N3cml0ZSgocmVnKSwoU0NDcmVhZChyZWcpJihhbmQpKXwob3IpKQotCi0jZW5kaWYgLyogX1NDQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h2L0tjb25maWcgYi9kcml2ZXJzL2h2L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZhMDlhYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHYvS2NvbmZpZwpAQCAtMCwwICsxLDE0IEBACitjb25maWcgSFlQRVJWCisJdHJpc3RhdGUgIk1pY3Jvc29mdCBIeXBlci1WIGNsaWVudCBkcml2ZXJzIgorCWRlcGVuZHMgb24gWDg2ICYmIEFDUEkgJiYgUENJCisJaGVscAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIHJ1biBMaW51eCBhcyBhIEh5cGVyLVYgY2xpZW50IG9wZXJhdGluZworCSAgc3lzdGVtLgorCitjb25maWcgSFlQRVJWX1VUSUxTCisJdHJpc3RhdGUgIk1pY3Jvc29mdCBIeXBlci1WIFV0aWxpdGllcyBkcml2ZXIiCisJZGVwZW5kcyBvbiBIWVBFUlYgJiYgQ09OTkVDVE9SICYmIE5MUworCWhlbHAKKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byBlbmFibGUgdGhlIEh5cGVyLVYgVXRpbGl0aWVzLgorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvTWFrZWZpbGUgYi9kcml2ZXJzL2h2L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMzkzOGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h2L01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorb2JqLSQoQ09ORklHX0hZUEVSVikJCSs9IGh2X3ZtYnVzLm8KK29iai0kKENPTkZJR19IWVBFUlZfVVRJTFMpCSs9IGh2X3V0aWxzLm8KKworaHZfdm1idXMteSA6PSB2bWJ1c19kcnYubyBcCisJCSBodi5vIGNvbm5lY3Rpb24ubyBjaGFubmVsLm8gXAorCQkgY2hhbm5lbF9tZ210Lm8gcmluZ19idWZmZXIubworaHZfdXRpbHMteSA6PSBodl91dGlsLm8gaHZfa3ZwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9jaGFubmVsLmMgYi9kcml2ZXJzL2h2L2NoYW5uZWwuYwpzaW1pbGFyaXR5IGluZGV4IDg3JQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvaHYvY2hhbm5lbC5jCnJlbmFtZSB0byBkcml2ZXJzL2h2L2NoYW5uZWwuYwppbmRleCA0NTVmNDdhLi40MDY1Mzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvY2hhbm5lbC5jCisrKyBiL2RyaXZlcnMvaHYvY2hhbm5lbC5jCkBAIC0yNiw4ICsyNiw4IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaHlwZXJ2Lmg+CiAKLSNpbmNsdWRlICJoeXBlcnYuaCIKICNpbmNsdWRlICJoeXBlcnZfdm1idXMuaCIKIAogI2RlZmluZSBOVU1fUEFHRVNfU1BBTk5FRChhZGRyLCBsZW4pIFwKQEAgLTc2LDE1ICs3NiwxNCBAQAogCXN0cnVjdCBodl9tb25pdG9yX3BhZ2UgKm1vbml0b3JwYWdlOwogCXU4IG1vbml0b3JfZ3JvdXAgPSAodTgpY2hhbm5lbC0+b2ZmZXJtc2cubW9uaXRvcmlkIC8gMzI7CiAJdTggbW9uaXRvcl9vZmZzZXQgPSAodTgpY2hhbm5lbC0+b2ZmZXJtc2cubW9uaXRvcmlkICUgMzI7Ci0JLyogdTMyIG1vbml0b3JCaXQJPSAxIDw8IG1vbml0b3JPZmZzZXQ7ICovCiAKIAlkZWJ1Z2luZm8tPnJlbGlkID0gY2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQ7CiAJZGVidWdpbmZvLT5zdGF0ZSA9IGNoYW5uZWwtPnN0YXRlOwogCW1lbWNweSgmZGVidWdpbmZvLT5pbnRlcmZhY2V0eXBlLAotCSAgICAgICAmY2hhbm5lbC0+b2ZmZXJtc2cub2ZmZXIuaWZfdHlwZSwgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7CisJICAgICAgICZjaGFubmVsLT5vZmZlcm1zZy5vZmZlci5pZl90eXBlLCBzaXplb2YodXVpZF9sZSkpOwogCW1lbWNweSgmZGVidWdpbmZvLT5pbnRlcmZhY2VfaW5zdGFuY2UsCiAJICAgICAgICZjaGFubmVsLT5vZmZlcm1zZy5vZmZlci5pZl9pbnN0YW5jZSwKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7CisJICAgICAgIHNpemVvZih1dWlkX2xlKSk7CiAKIAltb25pdG9ycGFnZSA9IChzdHJ1Y3QgaHZfbW9uaXRvcl9wYWdlICopdm1idXNfY29ubmVjdGlvbi5tb25pdG9yX3BhZ2VzOwogCkBAIC0xMTksOCArMTE4LDggQEAKIAkJICAgICB1MzIgcmVjdl9yaW5nYnVmZmVyX3NpemUsIHZvaWQgKnVzZXJkYXRhLCB1MzIgdXNlcmRhdGFsZW4sCiAJCSAgICAgdm9pZCAoKm9uY2hhbm5lbGNhbGxiYWNrKSh2b2lkICpjb250ZXh0KSwgdm9pZCAqY29udGV4dCkKIHsKLQlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9vcGVuX2NoYW5uZWwgKm9wZW5Nc2c7Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWxfbXNnaW5mbyAqb3BlbkluZm8gPSBOVUxMOworCXN0cnVjdCB2bWJ1c19jaGFubmVsX29wZW5fY2hhbm5lbCAqb3Blbl9tc2c7CisJc3RydWN0IHZtYnVzX2NoYW5uZWxfbXNnaW5mbyAqb3Blbl9pbmZvID0gTlVMTDsKIAl2b2lkICppbiwgKm91dDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQsIHQsIGVyciA9IDA7CkBAIC0xNzMsMjQgKzE3MiwyNCBAQAogCX0KIAogCS8qIENyZWF0ZSBhbmQgaW5pdCB0aGUgY2hhbm5lbCBvcGVuIG1lc3NhZ2UgKi8KLQlvcGVuSW5mbyA9IGttYWxsb2Moc2l6ZW9mKCpvcGVuSW5mbykgKworCW9wZW5faW5mbyA9IGttYWxsb2Moc2l6ZW9mKCpvcGVuX2luZm8pICsKIAkJCSAgIHNpemVvZihzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9vcGVuX2NoYW5uZWwpLAogCQkJICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFvcGVuSW5mbykgeworCWlmICghb3Blbl9pbmZvKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JvdXQ7CiAJfQogCi0JaW5pdF9jb21wbGV0aW9uKCZvcGVuSW5mby0+d2FpdGV2ZW50KTsKKwlpbml0X2NvbXBsZXRpb24oJm9wZW5faW5mby0+d2FpdGV2ZW50KTsKIAotCW9wZW5Nc2cgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfb3Blbl9jaGFubmVsICopb3BlbkluZm8tPm1zZzsKLQlvcGVuTXNnLT5oZWFkZXIubXNndHlwZSA9IENIQU5ORUxNU0dfT1BFTkNIQU5ORUw7Ci0Jb3Blbk1zZy0+b3BlbmlkID0gbmV3Y2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQ7Ci0Jb3Blbk1zZy0+Y2hpbGRfcmVsaWQgPSBuZXdjaGFubmVsLT5vZmZlcm1zZy5jaGlsZF9yZWxpZDsKLQlvcGVuTXNnLT5yaW5nYnVmZmVyX2dwYWRsaGFuZGxlID0gbmV3Y2hhbm5lbC0+cmluZ2J1ZmZlcl9ncGFkbGhhbmRsZTsKLQlvcGVuTXNnLT5kb3duc3RyZWFtX3JpbmdidWZmZXJfcGFnZW9mZnNldCA9IHNlbmRfcmluZ2J1ZmZlcl9zaXplID4+CisJb3Blbl9tc2cgPSAoc3RydWN0IHZtYnVzX2NoYW5uZWxfb3Blbl9jaGFubmVsICopb3Blbl9pbmZvLT5tc2c7CisJb3Blbl9tc2ctPmhlYWRlci5tc2d0eXBlID0gQ0hBTk5FTE1TR19PUEVOQ0hBTk5FTDsKKwlvcGVuX21zZy0+b3BlbmlkID0gbmV3Y2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQ7CisJb3Blbl9tc2ctPmNoaWxkX3JlbGlkID0gbmV3Y2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQ7CisJb3Blbl9tc2ctPnJpbmdidWZmZXJfZ3BhZGxoYW5kbGUgPSBuZXdjaGFubmVsLT5yaW5nYnVmZmVyX2dwYWRsaGFuZGxlOworCW9wZW5fbXNnLT5kb3duc3RyZWFtX3JpbmdidWZmZXJfcGFnZW9mZnNldCA9IHNlbmRfcmluZ2J1ZmZlcl9zaXplID4+CiAJCQkJCQkgIFBBR0VfU0hJRlQ7Ci0Jb3Blbk1zZy0+c2VydmVyX2NvbnRleHRhcmVhX2dwYWRsaGFuZGxlID0gMDsKKwlvcGVuX21zZy0+c2VydmVyX2NvbnRleHRhcmVhX2dwYWRsaGFuZGxlID0gMDsKIAogCWlmICh1c2VyZGF0YWxlbiA+IE1BWF9VU0VSX0RFRklORURfQllURVMpIHsKIAkJZXJyID0gLUVJTlZBTDsKQEAgLTE5OCwzNSArMTk3LDM1IEBACiAJfQogCiAJaWYgKHVzZXJkYXRhbGVuKQotCQltZW1jcHkob3Blbk1zZy0+dXNlcmRhdGEsIHVzZXJkYXRhLCB1c2VyZGF0YWxlbik7CisJCW1lbWNweShvcGVuX21zZy0+dXNlcmRhdGEsIHVzZXJkYXRhLCB1c2VyZGF0YWxlbik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdm1idXNfY29ubmVjdGlvbi5jaGFubmVsbXNnX2xvY2ssIGZsYWdzKTsKLQlsaXN0X2FkZF90YWlsKCZvcGVuSW5mby0+bXNnbGlzdGVudHJ5LAorCWxpc3RfYWRkX3RhaWwoJm9wZW5faW5mby0+bXNnbGlzdGVudHJ5LAogCQkgICAgICAmdm1idXNfY29ubmVjdGlvbi5jaG5fbXNnX2xpc3QpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZtYnVzX2Nvbm5lY3Rpb24uY2hhbm5lbG1zZ19sb2NrLCBmbGFncyk7CiAKLQlyZXQgPSB2bWJ1c19wb3N0X21zZyhvcGVuTXNnLAorCXJldCA9IHZtYnVzX3Bvc3RfbXNnKG9wZW5fbXNnLAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9vcGVuX2NoYW5uZWwpKTsKIAogCWlmIChyZXQgIT0gMCkKIAkJZ290byBjbGVhbnVwOwogCi0JdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmb3BlbkluZm8tPndhaXRldmVudCwgNSpIWik7CisJdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmb3Blbl9pbmZvLT53YWl0ZXZlbnQsIDUqSFopOwogCWlmICh0ID09IDApIHsKIAkJZXJyID0gLUVUSU1FRE9VVDsKIAkJZ290byBlcnJvcm91dDsKIAl9CiAKIAotCWlmIChvcGVuSW5mby0+cmVzcG9uc2Uub3Blbl9yZXN1bHQuc3RhdHVzKQotCQllcnIgPSBvcGVuSW5mby0+cmVzcG9uc2Uub3Blbl9yZXN1bHQuc3RhdHVzOworCWlmIChvcGVuX2luZm8tPnJlc3BvbnNlLm9wZW5fcmVzdWx0LnN0YXR1cykKKwkJZXJyID0gb3Blbl9pbmZvLT5yZXNwb25zZS5vcGVuX3Jlc3VsdC5zdGF0dXM7CiAKIGNsZWFudXA6CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnZtYnVzX2Nvbm5lY3Rpb24uY2hhbm5lbG1zZ19sb2NrLCBmbGFncyk7Ci0JbGlzdF9kZWwoJm9wZW5JbmZvLT5tc2dsaXN0ZW50cnkpOworCWxpc3RfZGVsKCZvcGVuX2luZm8tPm1zZ2xpc3RlbnRyeSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdm1idXNfY29ubmVjdGlvbi5jaGFubmVsbXNnX2xvY2ssIGZsYWdzKTsKIAotCWtmcmVlKG9wZW5JbmZvKTsKKwlrZnJlZShvcGVuX2luZm8pOwogCXJldHVybiBlcnI7CiAKIGVycm9yb3V0OgpAQCAtMjM0LDU3ICsyMzMsMTIgQEAKIAlodl9yaW5nYnVmZmVyX2NsZWFudXAoJm5ld2NoYW5uZWwtPmluYm91bmQpOwogCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpb3V0LAogCQlnZXRfb3JkZXIoc2VuZF9yaW5nYnVmZmVyX3NpemUgKyByZWN2X3JpbmdidWZmZXJfc2l6ZSkpOwotCWtmcmVlKG9wZW5JbmZvKTsKKwlrZnJlZShvcGVuX2luZm8pOwogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2bWJ1c19vcGVuKTsKIAogLyoKLSAqIGR1bXBfZ3BhZGxfYm9keSAtIER1bXAgdGhlIGdwYWRsIGJvZHkgbWVzc2FnZSB0byB0aGUgY29uc29sZSBmb3IKLSAqIGRlYnVnZ2luZyBwdXJwb3Nlcy4KLSAqLwotc3RhdGljIHZvaWQgZHVtcF9ncGFkbF9ib2R5KHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2JvZHkgKmdwYWRsLCB1MzIgbGVuKQotewotCWludCBpOwotCWludCBwZm5jb3VudDsKLQotCXBmbmNvdW50ID0gKGxlbiAtIHNpemVvZihzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9ib2R5KSkgLwotCQkgICBzaXplb2YodTY0KTsKLQotCURQUklOVF9EQkcoVk1CVVMsICJncGFkbCBib2R5IC0gbGVuICVkIHBmbiBjb3VudCAlZCIsIGxlbiwgcGZuY291bnQpOwotCi0JZm9yIChpID0gMDsgaSA8IHBmbmNvdW50OyBpKyspCi0JCURQUklOVF9EQkcoVk1CVVMsICJncGFkbCBib2R5ICAtICVkKSBwZm4gJWxsdSIsCi0JCQkgICBpLCBncGFkbC0+cGZuW2ldKTsKLX0KLQotLyoKLSAqIGR1bXBfZ3BhZGxfaGVhZGVyIC0gRHVtcCB0aGUgZ3BhZGwgaGVhZGVyIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUgZm9yCi0gKiBkZWJ1Z2dpbmcgcHVycG9zZXMuCi0gKi8KLXN0YXRpYyB2b2lkIGR1bXBfZ3BhZGxfaGVhZGVyKHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2hlYWRlciAqZ3BhZGwpCi17Ci0JaW50IGksIGo7Ci0JaW50IHBhZ2Vjb3VudDsKLQotCURQUklOVF9EQkcoVk1CVVMsCi0JCSAgICJncGFkbCBoZWFkZXIgLSByZWxpZCAlZCwgcmFuZ2UgY291bnQgJWQsIHJhbmdlIGJ1ZmxlbiAlZCIsCi0JCSAgIGdwYWRsLT5jaGlsZF9yZWxpZCwgZ3BhZGwtPnJhbmdlY291bnQsIGdwYWRsLT5yYW5nZV9idWZsZW4pOwotCWZvciAoaSA9IDA7IGkgPCBncGFkbC0+cmFuZ2Vjb3VudDsgaSsrKSB7Ci0JCXBhZ2Vjb3VudCA9IGdwYWRsLT5yYW5nZVtpXS5ieXRlX2NvdW50ID4+IFBBR0VfU0hJRlQ7Ci0JCXBhZ2Vjb3VudCA9IChwYWdlY291bnQgPiAyNikgPyAyNiA6IHBhZ2Vjb3VudDsKLQotCQlEUFJJTlRfREJHKFZNQlVTLCAiZ3BhZGwgcmFuZ2UgJWQgLSBsZW4gJWQgb2Zmc2V0ICVkICIKLQkJCSAgICJwYWdlIGNvdW50ICVkIiwgaSwgZ3BhZGwtPnJhbmdlW2ldLmJ5dGVfY291bnQsCi0JCQkgICBncGFkbC0+cmFuZ2VbaV0uYnl0ZV9vZmZzZXQsIHBhZ2Vjb3VudCk7Ci0KLQkJZm9yIChqID0gMDsgaiA8IHBhZ2Vjb3VudDsgaisrKQotCQkJRFBSSU5UX0RCRyhWTUJVUywgIiVkKSBwZm4gJWxsdSIsIGosCi0JCQkJICAgZ3BhZGwtPnJhbmdlW2ldLnBmbl9hcnJheVtqXSk7Ci0JfQotfQotCi0vKgogICogY3JlYXRlX2dwYWRsX2hlYWRlciAtIENyZWF0ZXMgYSBncGFkbCBmb3IgdGhlIHNwZWNpZmllZCBidWZmZXIKICAqLwogc3RhdGljIGludCBjcmVhdGVfZ3BhZGxfaGVhZGVyKHZvaWQgKmtidWZmZXIsIHUzMiBzaXplLApAQCAtNDM3LDcgKzM5MSw2IEBACiB7CiAJc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfaGVhZGVyICpncGFkbG1zZzsKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9ncGFkbF9ib2R5ICpncGFkbF9ib2R5OwotCS8qIHN0cnVjdCB2bWJ1c19jaGFubmVsX2dwYWRsX2NyZWF0ZWQgKmdwYWRsQ3JlYXRlZDsgKi8KIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tc2dpbmZvICptc2dpbmZvID0gTlVMTDsKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tc2dpbmZvICpzdWJtc2dpbmZvOwogCXUzMiBtc2djb3VudDsKQEAgLTQ2MSw3ICs0MTQsNiBAQAogCWdwYWRsbXNnLT5jaGlsZF9yZWxpZCA9IGNoYW5uZWwtPm9mZmVybXNnLmNoaWxkX3JlbGlkOwogCWdwYWRsbXNnLT5ncGFkbCA9IG5leHRfZ3BhZGxfaGFuZGxlOwogCi0JZHVtcF9ncGFkbF9oZWFkZXIoZ3BhZGxtc2cpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnZtYnVzX2Nvbm5lY3Rpb24uY2hhbm5lbG1zZ19sb2NrLCBmbGFncyk7CiAJbGlzdF9hZGRfdGFpbCgmbXNnaW5mby0+bXNnbGlzdGVudHJ5LApAQCAtNDg1LDggKzQzNyw2IEBACiAJCQkJQ0hBTk5FTE1TR19HUEFETF9CT0RZOwogCQkJZ3BhZGxfYm9keS0+Z3BhZGwgPSBuZXh0X2dwYWRsX2hhbmRsZTsKIAotCQkJZHVtcF9ncGFkbF9ib2R5KGdwYWRsX2JvZHksIHN1Ym1zZ2luZm8tPm1zZ3NpemUgLQotCQkJCSAgICAgIHNpemVvZigqc3VibXNnaW5mbykpOwogCQkJcmV0ID0gdm1idXNfcG9zdF9tc2coZ3BhZGxfYm9keSwKIAkJCQkJICAgICAgIHN1Ym1zZ2luZm8tPm1zZ3NpemUgLQogCQkJCQkgICAgICAgc2l6ZW9mKCpzdWJtc2dpbmZvKSk7CkBAIC01MjIsOCArNDcyLDYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQsIHQ7CiAKLQkvKiBBU1NFUlQoZ3BhZGxfaGFuZGxlICE9IDApOyAqLwotCiAJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCppbmZvKSArCiAJCSAgICAgICBzaXplb2Yoc3RydWN0IHZtYnVzX2NoYW5uZWxfZ3BhZGxfdGVhcmRvd24pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluZm8pCkBAIC01NjUsOSArNTEzLDEyIEBACiB7CiAJc3RydWN0IHZtYnVzX2NoYW5uZWxfY2xvc2VfY2hhbm5lbCAqbXNnOwogCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIFN0b3AgY2FsbGJhY2sgYW5kIGNhbmNlbCB0aGUgdGltZXIgYXNhcCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFubmVsLT5pbmJvdW5kX2xvY2ssIGZsYWdzKTsKIAljaGFubmVsLT5vbmNoYW5uZWxfY2FsbGJhY2sgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW5uZWwtPmluYm91bmRfbG9jaywgZmxhZ3MpOwogCiAJLyogU2VuZCBhIGNsb3NpbmcgbWVzc2FnZSAqLwogCkBAIC03ODcsMTkgKzczOCwxNSBAQAogCXUzMiBwYWNrZXRsZW47CiAJdTMyIHVzZXJsZW47CiAJaW50IHJldDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJKmJ1ZmZlcl9hY3R1YWxfbGVuID0gMDsKIAkqcmVxdWVzdGlkID0gMDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFubmVsLT5pbmJvdW5kX2xvY2ssIGZsYWdzKTsKIAogCXJldCA9IGh2X3JpbmdidWZmZXJfcGVlaygmY2hhbm5lbC0+aW5ib3VuZCwgJmRlc2MsCiAJCQkgICAgIHNpemVvZihzdHJ1Y3Qgdm1wYWNrZXRfZGVzY3JpcHRvcikpOwotCWlmIChyZXQgIT0gMCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFubmVsLT5pbmJvdW5kX2xvY2ssIGZsYWdzKTsKKwlpZiAocmV0ICE9IDApCiAJCXJldHVybiAwOwotCX0KIAogCXBhY2tldGxlbiA9IGRlc2MubGVuOCA8PCAzOwogCXVzZXJsZW4gPSBwYWNrZXRsZW4gLSAoZGVzYy5vZmZzZXQ4IDw8IDMpOwpAQCAtODA3LDcgKzc1NCw2IEBACiAJKmJ1ZmZlcl9hY3R1YWxfbGVuID0gdXNlcmxlbjsKIAogCWlmICh1c2VybGVuID4gYnVmZmVybGVuKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW5uZWwtPmluYm91bmRfbG9jaywgZmxhZ3MpOwogCiAJCXByX2VycigiQnVmZmVyIHRvbyBzbWFsbCAtIGdvdCAlZCBuZWVkcyAlZFxuIiwKIAkJCSAgIGJ1ZmZlcmxlbiwgdXNlcmxlbik7CkBAIC04MjAsNyArNzY2LDYgQEAKIAlyZXQgPSBodl9yaW5nYnVmZmVyX3JlYWQoJmNoYW5uZWwtPmluYm91bmQsIGJ1ZmZlciwgdXNlcmxlbiwKIAkJCSAgICAgKGRlc2Mub2Zmc2V0OCA8PCAzKSk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFubmVsLT5pbmJvdW5kX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQpAQCAtODM3LDE5ICs3ODIsMTUgQEAKIAl1MzIgcGFja2V0bGVuOwogCXUzMiB1c2VybGVuOwogCWludCByZXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCSpidWZmZXJfYWN0dWFsX2xlbiA9IDA7CiAJKnJlcXVlc3RpZCA9IDA7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbm5lbC0+aW5ib3VuZF9sb2NrLCBmbGFncyk7CiAKIAlyZXQgPSBodl9yaW5nYnVmZmVyX3BlZWsoJmNoYW5uZWwtPmluYm91bmQsICZkZXNjLAogCQkJICAgICBzaXplb2Yoc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IpKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbm5lbC0+aW5ib3VuZF9sb2NrLCBmbGFncyk7CisJaWYgKHJldCAhPSAwKQogCQlyZXR1cm4gMDsKLQl9CiAKIAogCXBhY2tldGxlbiA9IGRlc2MubGVuOCA8PCAzOwpAQCAtODU4LDEyICs3OTksMTAgQEAKIAkqYnVmZmVyX2FjdHVhbF9sZW4gPSBwYWNrZXRsZW47CiAKIAlpZiAocGFja2V0bGVuID4gYnVmZmVybGVuKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW5uZWwtPmluYm91bmRfbG9jaywgZmxhZ3MpOwotCiAJCXByX2VycigiQnVmZmVyIHRvbyBzbWFsbCAtIG5lZWRlZCAlZCBieXRlcyBidXQgIgogCQkJImdvdCBzcGFjZSBmb3Igb25seSAlZCBieXRlc1xuIiwKIAkJCXBhY2tldGxlbiwgYnVmZmVybGVuKTsKLQkJcmV0dXJuIC0yOworCQlyZXR1cm4gLUVOT0JVRlM7CiAJfQogCiAJKnJlcXVlc3RpZCA9IGRlc2MudHJhbnNfaWQ7CkBAIC04NzEsNyArODEwLDYgQEAKIAkvKiBDb3B5IG92ZXIgdGhlIGVudGlyZSBwYWNrZXQgdG8gdGhlIHVzZXIgYnVmZmVyICovCiAJcmV0ID0gaHZfcmluZ2J1ZmZlcl9yZWFkKCZjaGFubmVsLT5pbmJvdW5kLCBidWZmZXIsIHBhY2tldGxlbiwgMCk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGFubmVsLT5pbmJvdW5kX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZtYnVzX3JlY3ZwYWNrZXRfcmF3KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9jaGFubmVsX21nbXQuYyBiL2RyaXZlcnMvaHYvY2hhbm5lbF9tZ210LmMKc2ltaWxhcml0eSBpbmRleCA3NyUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2h2L2NoYW5uZWxfbWdtdC5jCnJlbmFtZSB0byBkcml2ZXJzL2h2L2NoYW5uZWxfbWdtdC5jCmluZGV4IGJmMDExZjMuLjEyYjg1ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9jaGFubmVsX21nbXQuYworKysgYi9kcml2ZXJzL2h2L2NoYW5uZWxfbWdtdC5jCkBAIC0yOCw4ICsyOCw4IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9oeXBlcnYuaD4KIAotI2luY2x1ZGUgImh5cGVydi5oIgogI2luY2x1ZGUgImh5cGVydl92bWJ1cy5oIgogCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX3RhYmxlX2VudHJ5IHsKQEAgLTQwLDEyICs0MCwxMiBAQAogI2RlZmluZSBNQVhfTVNHX1RZUEVTICAgICAgICAgICAgICAgICAgICA0CiAjZGVmaW5lIE1BWF9OVU1fREVWSUNFX0NMQVNTRVNfU1VQUE9SVEVEIDgKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBodl9ndWlkCitzdGF0aWMgY29uc3QgdXVpZF9sZQogCXN1cHBvcnRlZF9kZXZpY2VfY2xhc3Nlc1tNQVhfTlVNX0RFVklDRV9DTEFTU0VTX1NVUFBPUlRFRF0gPSB7CiAJLyoge2JhNjE2M2Q5LTA0YTEtNGQyOS1iNjA1LTcyZTJmZmIxZGM3Zn0gKi8KIAkvKiBTdG9yYWdlIC0gU0NTSSAqLwogCXsKLQkJLmRhdGEgID0geworCQkuYiAgPSB7CiAJCQkweGQ5LCAweDYzLCAweDYxLCAweGJhLCAweGExLCAweDA0LCAweDI5LCAweDRkLAogCQkJMHhiNiwgMHgwNSwgMHg3MiwgMHhlMiwgMHhmZiwgMHhiMSwgMHhkYywgMHg3ZgogCQl9CkBAIC01NCw3ICs1NCw3IEBACiAJLyoge0Y4NjE1MTYzLURGM0UtNDZjNS05MTNGLUYyRDJGOTY1RUQwRX0gKi8KIAkvKiBOZXR3b3JrICovCiAJewotCQkuZGF0YSA9IHsKKwkJLmIgPSB7CiAJCQkweDYzLCAweDUxLCAweDYxLCAweEY4LCAweDNFLCAweERGLCAweGM1LCAweDQ2LAogCQkJMHg5MSwgMHgzRiwgMHhGMiwgMHhEMiwgMHhGOSwgMHg2NSwgMHhFRCwgMHgwRQogCQl9CkBAIC02Myw3ICs2Myw3IEBACiAJLyoge0NGQThCNjlFLTVCNEEtNGNjMC1COThCLThCQTFBMUYzRjk1QX0gKi8KIAkvKiBJbnB1dCAqLwogCXsKLQkJLmRhdGEgPSB7CisJCS5iID0gewogCQkJMHg5RSwgMHhCNiwgMHhBOCwgMHhDRiwgMHg0QSwgMHg1QiwgMHhjMCwgMHg0YywKIAkJCTB4QjksIDB4OEIsIDB4OEIsIDB4QTEsIDB4QTEsIDB4RjMsIDB4RjksIDB4NUEKIAkJfQpAQCAtNzIsNyArNzIsNyBAQAogCS8qIHszMjQxMjYzMi04NmNiLTQ0YTItOWI1Yy01MGQxNDE3MzU0ZjV9ICovCiAJLyogSURFICovCiAJewotCQkuZGF0YSA9IHsKKwkJLmIgPSB7CiAJCQkweDMyLCAweDI2LCAweDQxLCAweDMyLCAweGNiLCAweDg2LCAweGEyLCAweDQ0LAogCQkJMHg5YiwgMHg1YywgMHg1MCwgMHhkMSwgMHg0MSwgMHg3MywgMHg1NCwgMHhmNQogCQl9CkBAIC04MCw3ICs4MCw3IEBACiAJLyogMEUwQjYwMzEtNTIxMy00OTM0LTgxOEItMzhEOTBDRUQzOURCICovCiAJLyogU2h1dGRvd24gKi8KIAl7Ci0JCS5kYXRhID0geworCQkuYiA9IHsKIAkJCTB4MzEsIDB4NjAsIDB4MEIsIDBYMEUsIDB4MTMsIDB4NTIsIDB4MzQsIDB4NDksCiAJCQkweDgxLCAweDhCLCAweDM4LCAwWEQ5LCAweDBDLCAweEVELCAweDM5LCAweERCCiAJCX0KQEAgLTg4LDcgKzg4LDcgQEAKIAkvKiB7OTUyN0U2MzAtRDBBRS00OTdiLUFEQ0UtRTgwQUIwMTc1Q0FGfSAqLwogCS8qIFRpbWVTeW5jICovCiAJewotCQkuZGF0YSA9IHsKKwkJLmIgPSB7CiAJCQkweDMwLCAweGU2LCAweDI3LCAweDk1LCAweGFlLCAweGQwLCAweDdiLCAweDQ5LAogCQkJMHhhZCwgMHhjZSwgMHhlOCwgMHgwYSwgMHhiMCwgMHgxNywgMHg1YywgMHhhZgogCQl9CkBAIC05Niw3ICs5Niw3IEBACiAJLyogezU3MTY0ZjM5LTkxMTUtNGU3OC1hYjU1LTM4MmYzYmQ1NDIyZH0gKi8KIAkvKiBIZWFydGJlYXQgKi8KIAl7Ci0JCS5kYXRhID0geworCQkuYiA9IHsKIAkJCTB4MzksIDB4NGYsIDB4MTYsIDB4NTcsIDB4MTUsIDB4OTEsIDB4NzgsIDB4NGUsCiAJCQkweGFiLCAweDU1LCAweDM4LCAweDJmLCAweDNiLCAweGQ1LCAweDQyLCAweDJkCiAJCX0KQEAgLTEwNCw3ICsxMDQsNyBAQAogCS8qIHtBOUEwRjRFNy01QTQ1LTRkOTYtQjgyNy04QTg0MUU4QzAzRTZ9ICovCiAJLyogS1ZQICovCiAJewotCQkuZGF0YSA9IHsKKwkJLmIgPSB7CiAJCQkweGU3LCAweGY0LCAweGEwLCAweGE5LCAweDQ1LCAweDVhLCAweDk2LCAweDRkLAogCQkJMHhiOCwgMHgyNywgMHg4YSwgMHg4NCwgMHgxZSwgMHg4YywgMHgzLCAgMHhlNgogCX0KQEAgLTExNCw3ICsxMTQsNyBAQAogCiAKIC8qKgotICogcHJlcF9uZWdvdGlhdGVfcmVzcCgpIC0gQ3JlYXRlIGRlZmF1bHQgcmVzcG9uc2UgZm9yIEh5cGVyLVYgTmVnb3RpYXRlIG1lc3NhZ2UKKyAqIHZtYnVzX3ByZXBfbmVnb3RpYXRlX3Jlc3AoKSAtIENyZWF0ZSBkZWZhdWx0IHJlc3BvbnNlIGZvciBIeXBlci1WIE5lZ290aWF0ZSBtZXNzYWdlCiAgKiBAaWNtc2doZHJwOiBQb2ludGVyIHRvIG1zZyBoZWFkZXIgc3RydWN0dXJlCiAgKiBAaWNtc2dfbmVnb3RpYXRlOiBQb2ludGVyIHRvIG5lZ290aWF0ZSBtZXNzYWdlIHN0cnVjdHVyZQogICogQGJ1ZjogUmF3IGJ1ZmZlciBjaGFubmVsIGRhdGEKQEAgLTEyOCw5ICsxMjgsOCBAQAogICoKICAqIE1haW5seSB1c2VkIGJ5IEh5cGVyLVYgZHJpdmVycy4KICAqLwotdm9pZCBwcmVwX25lZ290aWF0ZV9yZXNwKHN0cnVjdCBpY21zZ19oZHIgKmljbXNnaGRycCwKLQkJCSAgICAgc3RydWN0IGljbXNnX25lZ290aWF0ZSAqbmVnb3AsCi0JCQkgICAgIHU4ICpidWYpCit2b2lkIHZtYnVzX3ByZXBfbmVnb3RpYXRlX3Jlc3Aoc3RydWN0IGljbXNnX2hkciAqaWNtc2doZHJwLAorCQkJICAgICAgIHN0cnVjdCBpY21zZ19uZWdvdGlhdGUgKm5lZ29wLCB1OCAqYnVmKQogewogCWlmIChpY21zZ2hkcnAtPmljbXNndHlwZSA9PSBJQ01TR1RZUEVfTkVHT1RJQVRFKSB7CiAJCWljbXNnaGRycC0+aWNtc2dzaXplID0gMHgxMDsKQEAgLTE1NiwxMTkgKzE1NSw3IEBACiAJCW5lZ29wLT5pY21zZ192ZXJjbnQgPSAxOwogCX0KIH0KLUVYUE9SVF9TWU1CT0wocHJlcF9uZWdvdGlhdGVfcmVzcCk7Ci0KLS8qKgotICogY2huX2NiX25lZ290aWF0ZSgpIC0gRGVmYXVsdCBoYW5kbGVyIGZvciBub24gSURFL1NDU0kvTkVUV09SSwotICogSHlwZXItViByZXF1ZXN0cwotICogQGNvbnRleHQ6IFBvaW50ZXIgdG8gYXJndW1lbnQgc3RydWN0dXJlLgotICoKLSAqIFNldCB1cCB0aGUgZGVmYXVsdCBoYW5kbGVyIGZvciBub24gZGV2aWNlIGRyaXZlciBzcGVjaWZpYyByZXF1ZXN0cwotICogZnJvbSBIeXBlci1WLiBUaGlzIHN0dWIgcmVzcG9uZHMgdG8gdGhlIGRlZmF1bHQgbmVnb3RpYXRlIG1lc3NhZ2VzCi0gKiB0aGF0IGNvbWUgaW4gZm9yIGV2ZXJ5IG5vbiBJREUvU0NTSS9OZXR3b3JrIHJlcXVlc3QuCi0gKiBUaGlzIGJlaGF2aW9yIGlzIG5vcm1hbGx5IG92ZXJ3cml0dGVuIGluIHRoZSBodl91dGlscyBkcml2ZXIuIFRoYXQKLSAqIGRyaXZlciBoYW5kbGVzIHJlcXVlc3RzIGxpa2UgZ3JhY2VmdWwgc2h1dGRvd24sIGhlYXJ0YmVhdHMgZXRjLgotICoKLSAqIE1haW5seSB1c2VkIGJ5IEh5cGVyLVYgZHJpdmVycy4KLSAqLwotdm9pZCBjaG5fY2JfbmVnb3RpYXRlKHZvaWQgKmNvbnRleHQpCi17Ci0Jc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwgPSBjb250ZXh0OwotCXU4ICpidWY7Ci0JdTMyIGJ1ZmxlbiwgcmVjdmxlbjsKLQl1NjQgcmVxdWVzdGlkOwotCi0Jc3RydWN0IGljbXNnX2hkciAqaWNtc2doZHJwOwotCXN0cnVjdCBpY21zZ19uZWdvdGlhdGUgKm5lZ29wID0gTlVMTDsKLQotCWlmIChjaGFubmVsLT51dGlsX2luZGV4ID49IDApIHsKLQkJLyoKLQkJICogVGhpcyBpcyBhIHByb3Blcmx5IGluaXRpYWxpemVkIHV0aWwgY2hhbm5lbC4KLQkJICogUm91dGUgdGhpcyBjYWxsYmFjayBhcHByb3ByaWF0ZWx5IGFuZCBzZXR1cCBzdGF0ZQotCQkgKiBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gcmVyb3V0ZSBhZ2Fpbi4KLQkJICovCi0JCWlmIChodl9jYl91dGlsc1tjaGFubmVsLT51dGlsX2luZGV4XS5jYWxsYmFjayAhPSBOVUxMKSB7Ci0JCQkvKgotCQkJICogVGhlIHV0aWwgZHJpdmVyIGhhcyBlc3RhYmxpc2hlZCBhIGhhbmRsZXIgZm9yCi0JCQkgKiB0aGlzIHNlcnZpY2U7IGRvIHRoZSBtYWdpYy4KLQkJCSAqLwotCQkJY2hhbm5lbC0+b25jaGFubmVsX2NhbGxiYWNrID0KLQkJCWh2X2NiX3V0aWxzW2NoYW5uZWwtPnV0aWxfaW5kZXhdLmNhbGxiYWNrOwotCQkJKGh2X2NiX3V0aWxzW2NoYW5uZWwtPnV0aWxfaW5kZXhdLmNhbGxiYWNrKShjaGFubmVsKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCWJ1ZmxlbiA9IFBBR0VfU0laRTsKLQlidWYgPSBrbWFsbG9jKGJ1ZmxlbiwgR0ZQX0FUT01JQyk7Ci0KLQl2bWJ1c19yZWN2cGFja2V0KGNoYW5uZWwsIGJ1ZiwgYnVmbGVuLCAmcmVjdmxlbiwgJnJlcXVlc3RpZCk7Ci0KLQlpZiAocmVjdmxlbiA+IDApIHsKLQkJaWNtc2doZHJwID0gKHN0cnVjdCBpY21zZ19oZHIgKikmYnVmWwotCQkJc2l6ZW9mKHN0cnVjdCB2bWJ1c3BpcGVfaGRyKV07Ci0KLQkJcHJlcF9uZWdvdGlhdGVfcmVzcChpY21zZ2hkcnAsIG5lZ29wLCBidWYpOwotCi0JCWljbXNnaGRycC0+aWNmbGFncyA9IElDTVNHSERSRkxBR19UUkFOU0FDVElPTgotCQkJfCBJQ01TR0hEUkZMQUdfUkVTUE9OU0U7Ci0KLQkJdm1idXNfc2VuZHBhY2tldChjaGFubmVsLCBidWYsCi0JCQkJICAgICAgIHJlY3ZsZW4sIHJlcXVlc3RpZCwKLQkJCQkgICAgICAgVk1fUEtUX0RBVEFfSU5CQU5ELCAwKTsKLQl9Ci0KLQlrZnJlZShidWYpOwotfQotRVhQT1JUX1NZTUJPTChjaG5fY2JfbmVnb3RpYXRlKTsKLQotLyoKLSAqIEZ1bmN0aW9uIHRhYmxlIHVzZWQgZm9yIG1lc3NhZ2UgcmVzcG9uc2VzIGZvciBub24gSURFL1NDU0kvTmV0d29yayB0eXBlCi0gKiBtZXNzYWdlcy4gKFN1Y2ggYXMgS1ZQL1NodXRkb3duIGV0YykKLSAqLwotc3RydWN0IGh5cGVydl9zZXJ2aWNlX2NhbGxiYWNrIGh2X2NiX3V0aWxzW01BWF9NU0dfVFlQRVNdID0gewotCS8qIDBFMEI2MDMxLTUyMTMtNDkzNC04MThCLTM4RDkwQ0VEMzlEQiAqLwotCS8qIFNodXRkb3duICovCi0JewotCQkubXNnX3R5cGUgPSBIVl9TSFVURE9XTl9NU0csCi0JCS5kYXRhID0gewotCQkJMHgzMSwgMHg2MCwgMHgwQiwgMFgwRSwgMHgxMywgMHg1MiwgMHgzNCwgMHg0OSwKLQkJCTB4ODEsIDB4OEIsIDB4MzgsIDBYRDksIDB4MEMsIDB4RUQsIDB4MzksIDB4REIKLQkJfSwKLQkJLmxvZ19tc2cgPSAiU2h1dGRvd24gY2hhbm5lbCBmdW5jdGlvbmFsaXR5IGluaXRpYWxpemVkIgotCX0sCi0KLQkvKiB7OTUyN0U2MzAtRDBBRS00OTdiLUFEQ0UtRTgwQUIwMTc1Q0FGfSAqLwotCS8qIFRpbWVTeW5jICovCi0JewotCQkubXNnX3R5cGUgPSBIVl9USU1FU1lOQ19NU0csCi0JCS5kYXRhID0gewotCQkJMHgzMCwgMHhlNiwgMHgyNywgMHg5NSwgMHhhZSwgMHhkMCwgMHg3YiwgMHg0OSwKLQkJCTB4YWQsIDB4Y2UsIDB4ZTgsIDB4MGEsIDB4YjAsIDB4MTcsIDB4NWMsIDB4YWYKLQkJfSwKLQkJLmxvZ19tc2cgPSAiVGltZXN5bmMgY2hhbm5lbCBmdW5jdGlvbmFsaXR5IGluaXRpYWxpemVkIgotCX0sCi0JLyogezU3MTY0ZjM5LTkxMTUtNGU3OC1hYjU1LTM4MmYzYmQ1NDIyZH0gKi8KLQkvKiBIZWFydGJlYXQgKi8KLQl7Ci0JCS5tc2dfdHlwZSA9IEhWX0hFQVJUQkVBVF9NU0csCi0JCS5kYXRhID0gewotCQkJMHgzOSwgMHg0ZiwgMHgxNiwgMHg1NywgMHgxNSwgMHg5MSwgMHg3OCwgMHg0ZSwKLQkJCTB4YWIsIDB4NTUsIDB4MzgsIDB4MmYsIDB4M2IsIDB4ZDUsIDB4NDIsIDB4MmQKLQkJfSwKLQkJLmxvZ19tc2cgPSAiSGVhcnRiZWF0IGNoYW5uZWwgZnVuY3Rpb25hbGl0eSBpbml0aWFsaXplZCIKLQl9LAotCS8qIHtBOUEwRjRFNy01QTQ1LTRkOTYtQjgyNy04QTg0MUU4QzAzRTZ9ICovCi0JLyogS1ZQICovCi0JewotCQkuZGF0YSA9IHsKLQkJCTB4ZTcsIDB4ZjQsIDB4YTAsIDB4YTksIDB4NDUsIDB4NWEsIDB4OTYsIDB4NGQsCi0JCQkweGI4LCAweDI3LCAweDhhLCAweDg0LCAweDFlLCAweDhjLCAweDMsICAweGU2Ci0JCX0sCi0JCS5sb2dfbXNnID0gIktWUCBjaGFubmVsIGZ1bmN0aW9uYWxpdHkgaW5pdGlhbGl6ZWQiCi0JfSwKLX07Ci1FWFBPUlRfU1lNQk9MKGh2X2NiX3V0aWxzKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHZtYnVzX3ByZXBfbmVnb3RpYXRlX3Jlc3ApOwogCiAvKgogICogYWxsb2NfY2hhbm5lbCAtIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgdm1idXMgY2hhbm5lbCBvYmplY3QKQEAgLTMwOSw3ICsxOTYsNyBAQAogLyoKICAqIGZyZWVfY2hhbm5lbCAtIFJlbGVhc2UgdGhlIHJlc291cmNlcyB1c2VkIGJ5IHRoZSB2bWJ1cyBjaGFubmVsIG9iamVjdAogICovCi12b2lkIGZyZWVfY2hhbm5lbChzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCkKK3N0YXRpYyB2b2lkIGZyZWVfY2hhbm5lbChzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbCkKIHsKIAogCS8qCkBAIC0zMzMsNyArMjIwLDcgQEAKIAkJCQkJCSAgICAgc3RydWN0IHZtYnVzX2NoYW5uZWwsCiAJCQkJCQkgICAgIHdvcmspOwogCi0Jdm1idXNfY2hpbGRfZGV2aWNlX3VucmVnaXN0ZXIoY2hhbm5lbC0+ZGV2aWNlX29iaik7CisJdm1idXNfZGV2aWNlX3VucmVnaXN0ZXIoY2hhbm5lbC0+ZGV2aWNlX29iaik7CiB9CiAKIC8qCkBAIC0zNDgsNyArMjM1LDYgQEAKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbDsKIAlib29sIGZuZXcgPSB0cnVlOwogCWludCByZXQ7Ci0JaW50IGNudDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogVGhlIG5leHQgcG9zc2libGUgd29yayBpcyByZXNjaW5kIGhhbmRsaW5nICovCkBAIC0zNTgsMTIgKzI0NCwxMCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZ2bWJ1c19jb25uZWN0aW9uLmNoYW5uZWxfbG9jaywgZmxhZ3MpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFubmVsLCAmdm1idXNfY29ubmVjdGlvbi5jaG5fbGlzdCwgbGlzdGVudHJ5KSB7Ci0JCWlmICghbWVtY21wKCZjaGFubmVsLT5vZmZlcm1zZy5vZmZlci5pZl90eXBlLAotCQkJICAgICZuZXdjaGFubmVsLT5vZmZlcm1zZy5vZmZlci5pZl90eXBlLAotCQkJICAgIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpICYmCi0JCSAgICAhbWVtY21wKCZjaGFubmVsLT5vZmZlcm1zZy5vZmZlci5pZl9pbnN0YW5jZSwKLQkJCSAgICAmbmV3Y2hhbm5lbC0+b2ZmZXJtc2cub2ZmZXIuaWZfaW5zdGFuY2UsCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSkpIHsKKwkJaWYgKCF1dWlkX2xlX2NtcChjaGFubmVsLT5vZmZlcm1zZy5vZmZlci5pZl90eXBlLAorCQkJbmV3Y2hhbm5lbC0+b2ZmZXJtc2cub2ZmZXIuaWZfdHlwZSkgJiYKKwkJCSF1dWlkX2xlX2NtcChjaGFubmVsLT5vZmZlcm1zZy5vZmZlci5pZl9pbnN0YW5jZSwKKwkJCQluZXdjaGFubmVsLT5vZmZlcm1zZy5vZmZlci5pZl9pbnN0YW5jZSkpIHsKIAkJCWZuZXcgPSBmYWxzZTsKIAkJCWJyZWFrOwogCQl9CkBAIC0zODUsNyArMjY5LDcgQEAKIAkgKiBXZSBuZWVkIHRvIHNldCB0aGUgRGV2aWNlT2JqZWN0IGZpZWxkIGJlZm9yZSBjYWxsaW5nCiAJICogdm1idXNfY2hpbGRfZGV2X2FkZCgpCiAJICovCi0JbmV3Y2hhbm5lbC0+ZGV2aWNlX29iaiA9IHZtYnVzX2NoaWxkX2RldmljZV9jcmVhdGUoCisJbmV3Y2hhbm5lbC0+ZGV2aWNlX29iaiA9IHZtYnVzX2RldmljZV9jcmVhdGUoCiAJCSZuZXdjaGFubmVsLT5vZmZlcm1zZy5vZmZlci5pZl90eXBlLAogCQkmbmV3Y2hhbm5lbC0+b2ZmZXJtc2cub2ZmZXIuaWZfaW5zdGFuY2UsCiAJCW5ld2NoYW5uZWwpOwpAQCAtMzk1LDcgKzI3OSw3IEBACiAJICogYmluZGluZyB3aGljaCBldmVudHVhbGx5IGludm9rZXMgdGhlIGRldmljZSBkcml2ZXIncyBBZGREZXZpY2UoKQogCSAqIG1ldGhvZC4KIAkgKi8KLQlyZXQgPSB2bWJ1c19jaGlsZF9kZXZpY2VfcmVnaXN0ZXIobmV3Y2hhbm5lbC0+ZGV2aWNlX29iaik7CisJcmV0ID0gdm1idXNfZGV2aWNlX3JlZ2lzdGVyKG5ld2NoYW5uZWwtPmRldmljZV9vYmopOwogCWlmIChyZXQgIT0gMCkgewogCQlwcl9lcnIoInVuYWJsZSB0byBhZGQgY2hpbGQgZGV2aWNlIG9iamVjdCAocmVsaWQgJWQpXG4iLAogCQkJICAgbmV3Y2hhbm5lbC0+b2ZmZXJtc2cuY2hpbGRfcmVsaWQpOwpAQCAtNDEyLDQ4ICsyOTYsMjYgQEAKIAkJICogY2FuIGNsZWFudXAgcHJvcGVybHkKIAkJICovCiAJCW5ld2NoYW5uZWwtPnN0YXRlID0gQ0hBTk5FTF9PUEVOX1NUQVRFOwotCQluZXdjaGFubmVsLT51dGlsX2luZGV4ID0gLTE7IC8qIEludmFsaWQgaW5kZXggKi8KLQotCQkvKiBPcGVuIElDIGNoYW5uZWxzICovCi0JCWZvciAoY250ID0gMDsgY250IDwgTUFYX01TR19UWVBFUzsgY250KyspIHsKLQkJCWlmIChtZW1jbXAoJm5ld2NoYW5uZWwtPm9mZmVybXNnLm9mZmVyLmlmX3R5cGUsCi0JCQkJICAgJmh2X2NiX3V0aWxzW2NudF0uZGF0YSwKLQkJCQkgICBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKSA9PSAwICYmCi0JCQkJdm1idXNfb3BlbihuZXdjaGFubmVsLCAyICogUEFHRV9TSVpFLAotCQkJCQkJIDIgKiBQQUdFX1NJWkUsIE5VTEwsIDAsCi0JCQkJCQkgY2huX2NiX25lZ290aWF0ZSwKLQkJCQkJCSBuZXdjaGFubmVsKSA9PSAwKSB7Ci0JCQkJaHZfY2JfdXRpbHNbY250XS5jaGFubmVsID0gbmV3Y2hhbm5lbDsKLQkJCQluZXdjaGFubmVsLT51dGlsX2luZGV4ID0gY250OwotCi0JCQkJcHJfaW5mbygiJXNcbiIsIGh2X2NiX3V0aWxzW2NudF0ubG9nX21zZyk7Ci0KLQkJCX0KLQkJfQogCX0KIH0KIAogLyoKICAqIHZtYnVzX29ub2ZmZXIgLSBIYW5kbGVyIGZvciBjaGFubmVsIG9mZmVycyBmcm9tIHZtYnVzIGluIHBhcmVudCBwYXJ0aXRpb24uCiAgKgotICogV2UgaWdub3JlIGFsbCBvZmZlcnMgZXhjZXB0IG5ldHdvcmsgYW5kIHN0b3JhZ2Ugb2ZmZXJzLiBGb3IgZWFjaCBuZXR3b3JrIGFuZAotICogc3RvcmFnZSBvZmZlcnMsIHdlIGNyZWF0ZSBhIGNoYW5uZWwgb2JqZWN0IGFuZCBxdWV1ZSBhIHdvcmsgaXRlbSB0byB0aGUKLSAqIGNoYW5uZWwgb2JqZWN0IHRvIHByb2Nlc3MgdGhlIG9mZmVyIHN5bmNocm9ub3VzbHkKICAqLwogc3RhdGljIHZvaWQgdm1idXNfb25vZmZlcihzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9tZXNzYWdlX2hlYWRlciAqaGRyKQogewogCXN0cnVjdCB2bWJ1c19jaGFubmVsX29mZmVyX2NoYW5uZWwgKm9mZmVyOwogCXN0cnVjdCB2bWJ1c19jaGFubmVsICpuZXdjaGFubmVsOwotCXN0cnVjdCBodl9ndWlkICpndWlkdHlwZTsKLQlzdHJ1Y3QgaHZfZ3VpZCAqZ3VpZGluc3RhbmNlOworCXV1aWRfbGUgKmd1aWR0eXBlOworCXV1aWRfbGUgKmd1aWRpbnN0YW5jZTsKIAlpbnQgaTsKIAlpbnQgZnN1cHBvcnRlZCA9IDA7CiAKIAlvZmZlciA9IChzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9vZmZlcl9jaGFubmVsICopaGRyOwogCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX0RFVklDRV9DTEFTU0VTX1NVUFBPUlRFRDsgaSsrKSB7Ci0JCWlmIChtZW1jbXAoJm9mZmVyLT5vZmZlci5pZl90eXBlLAotCQkJJnN1cHBvcnRlZF9kZXZpY2VfY2xhc3Nlc1tpXSwKLQkJCXNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpID09IDApIHsKKwkJaWYgKCF1dWlkX2xlX2NtcChvZmZlci0+b2ZmZXIuaWZfdHlwZSwKKwkJCQlzdXBwb3J0ZWRfZGV2aWNlX2NsYXNzZXNbaV0pKSB7CiAJCQlmc3VwcG9ydGVkID0gMTsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvY29ubmVjdGlvbi5jIGIvZHJpdmVycy9odi9jb25uZWN0aW9uLmMKc2ltaWxhcml0eSBpbmRleCA4NSUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2h2L2Nvbm5lY3Rpb24uYwpyZW5hbWUgdG8gZHJpdmVycy9odi9jb25uZWN0aW9uLmMKaW5kZXggZTZiNDAzOS4uNjUwYzlmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2Nvbm5lY3Rpb24uYworKysgYi9kcml2ZXJzL2h2L2Nvbm5lY3Rpb24uYwpAQCAtMjUsMTEgKzI1LDEyIEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0KLSNpbmNsdWRlICJoeXBlcnYuaCIKKyNpbmNsdWRlIDxsaW51eC9oeXBlcnYuaD4KKyNpbmNsdWRlIDxhc20vaHlwZXJ2Lmg+CiAjaW5jbHVkZSAiaHlwZXJ2X3ZtYnVzLmgiCiAKIApAQCAtNDksMTAgKzUwLDYgQEAKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9pbml0aWF0ZV9jb250YWN0ICptc2c7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qIE1ha2Ugc3VyZSB3ZSBhcmUgbm90IGNvbm5lY3Rpbmcgb3IgY29ubmVjdGVkICovCi0JaWYgKHZtYnVzX2Nvbm5lY3Rpb24uY29ubl9zdGF0ZSAhPSBESVNDT05ORUNURUQpCi0JCXJldHVybiAtRUlTQ09OTjsKLQogCS8qIEluaXRpYWxpemUgdGhlIHZtYnVzIGNvbm5lY3Rpb24gKi8KIAl2bWJ1c19jb25uZWN0aW9uLmNvbm5fc3RhdGUgPSBDT05ORUNUSU5HOwogCXZtYnVzX2Nvbm5lY3Rpb24ud29ya19xdWV1ZSA9IGNyZWF0ZV93b3JrcXVldWUoImh2X3ZtYnVzX2NvbiIpOwpAQCAtMjE0LDggKzIxMSw3IEBACiBzdGF0aWMgdm9pZCBwcm9jZXNzX2Nobl9ldmVudCh1MzIgcmVsaWQpCiB7CiAJc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWw7Ci0KLQkvKiBBU1NFUlQocmVsSWQgPiAwKTsgKi8KKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyoKIAkgKiBGaW5kIHRoZSBjaGFubmVsIGJhc2VkIG9uIHRoaXMgcmVsaWQgYW5kIGludm9rZXMgdGhlCkBAIC0yMjMsMTEgKzIxOSwyNyBAQAogCSAqLwogCWNoYW5uZWwgPSByZWxpZDJjaGFubmVsKHJlbGlkKTsKIAotCWlmIChjaGFubmVsKSB7Ci0JCWNoYW5uZWwtPm9uY2hhbm5lbF9jYWxsYmFjayhjaGFubmVsLT5jaGFubmVsX2NhbGxiYWNrX2NvbnRleHQpOwotCX0gZWxzZSB7CisJaWYgKCFjaGFubmVsKSB7CiAJCXByX2VycigiY2hhbm5lbCBub3QgZm91bmQgZm9yIHJlbGlkIC0gJXVcbiIsIHJlbGlkKTsKKwkJcmV0dXJuOwogCX0KKworCS8qCisJICogQSBjaGFubmVsIG9uY2UgY3JlYXRlZCBpcyBwZXJzaXN0ZW50IGV2ZW4gd2hlbiB0aGVyZQorCSAqIGlzIG5vIGRyaXZlciBoYW5kbGluZyB0aGUgZGV2aWNlLiBBbiB1bmxvYWRpbmcgZHJpdmVyCisJICogc2V0cyB0aGUgb25jaGFubmVsX2NhbGxiYWNrIHRvIE5VTEwgdW5kZXIgdGhlCisJICogcHJvdGVjdGlvbiBvZiB0aGUgY2hhbm5lbCBpbmJvdW5kX2xvY2suIFRodXMsIGNoZWNraW5nCisJICogYW5kIGludm9raW5nIHRoZSBkcml2ZXIgc3BlY2lmaWMgY2FsbGJhY2sgdGFrZXMgY2FyZSBvZgorCSAqIG9yZGVybHkgdW5sb2FkaW5nIG9mIHRoZSBkcml2ZXIuCisJICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbm5lbC0+aW5ib3VuZF9sb2NrLCBmbGFncyk7CisJaWYgKGNoYW5uZWwtPm9uY2hhbm5lbF9jYWxsYmFjayAhPSBOVUxMKQorCQljaGFubmVsLT5vbmNoYW5uZWxfY2FsbGJhY2soY2hhbm5lbC0+Y2hhbm5lbF9jYWxsYmFja19jb250ZXh0KTsKKwllbHNlCisJCXByX2Vycigibm8gY2hhbm5lbCBjYWxsYmFjayBmb3IgcmVsaWQgLSAldVxuIiwgcmVsaWQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbm5lbC0+aW5ib3VuZF9sb2NrLCBmbGFncyk7CiB9CiAKIC8qCkBAIC0yNDgsMTYgKzI2MCwxNyBAQAogCQlpZiAoIXJlY3ZfaW50X3BhZ2VbZHdvcmRdKQogCQkJY29udGludWU7CiAJCWZvciAoYml0ID0gMDsgYml0IDwgMzI7IGJpdCsrKSB7Ci0JCQlpZiAoc3luY190ZXN0X2FuZF9jbGVhcl9iaXQoYml0LCAodW5zaWduZWQgbG9uZyAqKSZyZWN2X2ludF9wYWdlW2R3b3JkXSkpIHsKKwkJCWlmIChzeW5jX3Rlc3RfYW5kX2NsZWFyX2JpdChiaXQsCisJCQkJKHVuc2lnbmVkIGxvbmcgKikmcmVjdl9pbnRfcGFnZVtkd29yZF0pKSB7CiAJCQkJcmVsaWQgPSAoZHdvcmQgPDwgNSkgKyBiaXQ7CiAKLQkJCQlpZiAocmVsaWQgPT0gMCkgeworCQkJCWlmIChyZWxpZCA9PSAwKQogCQkJCQkvKgogCQkJCQkgKiBTcGVjaWFsIGNhc2UgLSB2bWJ1cwogCQkJCQkgKiBjaGFubmVsIHByb3RvY29sIG1zZwogCQkJCQkgKi8KIAkJCQkJY29udGludWU7Ci0JCQkJfQorCiAJCQkJcHJvY2Vzc19jaG5fZXZlbnQocmVsaWQpOwogCQkJfQogCQl9CkBAIC0yNzAsMTAgKzI4MywyNSBAQAogaW50IHZtYnVzX3Bvc3RfbXNnKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmxlbikKIHsKIAl1bmlvbiBodl9jb25uZWN0aW9uX2lkIGNvbm5faWQ7CisJaW50IHJldCA9IDA7CisJaW50IHJldHJpZXMgPSAwOwogCiAJY29ubl9pZC5hc3UzMiA9IDA7CiAJY29ubl9pZC51LmlkID0gVk1CVVNfTUVTU0FHRV9DT05ORUNUSU9OX0lEOwotCXJldHVybiBodl9wb3N0X21lc3NhZ2UoY29ubl9pZCwgMSwgYnVmZmVyLCBidWZsZW4pOworCisJLyoKKwkgKiBodl9wb3N0X21lc3NhZ2UoKSBjYW4gaGF2ZSB0cmFuc2llbnQgZmFpbHVyZXMgYmVjYXVzZSBvZgorCSAqIGluc3VmZmljaWVudCByZXNvdXJjZXMuIFJldHJ5IHRoZSBvcGVyYXRpb24gYSBjb3VwbGUgb2YKKwkgKiB0aW1lcyBiZWZvcmUgZ2l2aW5nIHVwLgorCSAqLworCXdoaWxlIChyZXRyaWVzIDwgMykgeworCQlyZXQgPSAgaHZfcG9zdF9tZXNzYWdlKGNvbm5faWQsIDEsIGJ1ZmZlciwgYnVmbGVuKTsKKwkJaWYgKHJldCAhPSBIVl9TVEFUVVNfSU5TVUZGSUNJRU5UX0JVRkZFUlMpCisJCQlyZXR1cm4gcmV0OworCQlyZXRyaWVzKys7CisJCW1zbGVlcCgxMDApOworCX0KKwlyZXR1cm4gcmV0OwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L2h2LmMgYi9kcml2ZXJzL2h2L2h2LmMKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2h2L2h2LmMKcmVuYW1lIHRvIGRyaXZlcnMvaHYvaHYuYwppbmRleCA4MjRmODE2Li4wZmIxMDBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvaHYuYworKysgYi9kcml2ZXJzL2h2L2h2LmMKQEAgLTI1LDggKzI1LDggQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0KLSNpbmNsdWRlICJoeXBlcnYuaCIKKyNpbmNsdWRlIDxsaW51eC9oeXBlcnYuaD4KKyNpbmNsdWRlIDxhc20vaHlwZXJ2Lmg+CiAjaW5jbHVkZSAiaHlwZXJ2X3ZtYnVzLmgiCiAKIC8qIFRoZSBvbmUgYW5kIG9ubHkgKi8KQEAgLTExMSw3ICsxMTEsNyBAQAogCXU2NCBodl9zdGF0dXMgPSAwOwogCXU2NCBpbnB1dF9hZGRyZXNzID0gKGlucHV0KSA/IHZpcnRfdG9fcGh5cyhpbnB1dCkgOiAwOwogCXU2NCBvdXRwdXRfYWRkcmVzcyA9IChvdXRwdXQpID8gdmlydF90b19waHlzKG91dHB1dCkgOiAwOwotCXZvbGF0aWxlIHZvaWQgKmh5cGVyY2FsbF9wYWdlID0gaHZfY29udGV4dC5oeXBlcmNhbGxfcGFnZTsKKwl2b2lkICpoeXBlcmNhbGxfcGFnZSA9IGh2X2NvbnRleHQuaHlwZXJjYWxsX3BhZ2U7CiAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92ICUwLCAlJXI4IiA6IDogInIiIChvdXRwdXRfYWRkcmVzcykgOiAicjgiKTsKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygiY2FsbCAqJTMiIDogIj1hIiAoaHZfc3RhdHVzKSA6CkBAIC0xMzIsNyArMTMyLDcgQEAKIAl1NjQgb3V0cHV0X2FkZHJlc3MgPSAob3V0cHV0KSA/IHZpcnRfdG9fcGh5cyhvdXRwdXQpIDogMDsKIAl1MzIgb3V0cHV0X2FkZHJlc3NfaGkgPSBvdXRwdXRfYWRkcmVzcyA+PiAzMjsKIAl1MzIgb3V0cHV0X2FkZHJlc3NfbG8gPSBvdXRwdXRfYWRkcmVzcyAmIDB4RkZGRkZGRkY7Ci0Jdm9sYXRpbGUgdm9pZCAqaHlwZXJjYWxsX3BhZ2UgPSBodl9jb250ZXh0Lmh5cGVyY2FsbF9wYWdlOworCXZvaWQgKmh5cGVyY2FsbF9wYWdlID0gaHZfY29udGV4dC5oeXBlcmNhbGxfcGFnZTsKIAogCV9fYXNtX18gX192b2xhdGlsZV9fICgiY2FsbCAqJTgiIDogIj1kIihodl9zdGF0dXNfaGkpLAogCQkJICAgICAgIj1hIihodl9zdGF0dXNfbG8pIDogImQiIChjb250cm9sX2hpKSwKQEAgLTE1MSw3ICsxNTEsNiBAQAogICovCiBpbnQgaHZfaW5pdCh2b2lkKQogewotCWludCByZXQgPSAwOwogCWludCBtYXhfbGVhZjsKIAl1bmlvbiBodl94NjRfbXNyX2h5cGVyY2FsbF9jb250ZW50cyBoeXBlcmNhbGxfbXNyOwogCXZvaWQgKnZpcnRhZGRyID0gTlVMTDsKQEAgLTE2NCwxMSArMTYzLDcgQEAKIAkJZ290byBjbGVhbnVwOwogCiAJbWF4X2xlYWYgPSBxdWVyeV9oeXBlcnZpc29yX2luZm8oKTsKLQkvKiBIdlF1ZXJ5SHlwZXJ2aXNvckZlYXR1cmVzKG1heExlYWYpOyAqLwogCi0JLyoKLQkgKiBXZSBvbmx5IHN1cHBvcnQgcnVubmluZyBvbiB0b3Agb2YgSHlwZXItVgotCSAqLwogCXJkbXNybChIVl9YNjRfTVNSX0dVRVNUX09TX0lELCBodl9jb250ZXh0Lmd1ZXN0aWQpOwogCiAJaWYgKGh2X2NvbnRleHQuZ3Vlc3RpZCAhPSAwKQpAQCAtMTgxLDEwICsxNzYsNiBAQAogCS8qIFNlZSBpZiB0aGUgaHlwZXJjYWxsIHBhZ2UgaXMgYWxyZWFkeSBzZXQgKi8KIAlyZG1zcmwoSFZfWDY0X01TUl9IWVBFUkNBTEwsIGh5cGVyY2FsbF9tc3IuYXNfdWludDY0KTsKIAotCS8qCi0JKiBBbGxvY2F0ZSB0aGUgaHlwZXJjYWxsIHBhZ2UgbWVtb3J5Ci0JKiB2aXJ0YWRkciA9IG9zZF9wYWdlX2FsbG9jKDEpOwotCSovCiAJdmlydGFkZHIgPSBfX3ZtYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMLCBQQUdFX0tFUk5FTF9FWEVDKTsKIAogCWlmICghdmlydGFkZHIpCkBAIC0yMjIsNyArMjEzLDcgQEAKIAlodl9jb250ZXh0LnNpZ25hbF9ldmVudF9wYXJhbS0+ZmxhZ19udW1iZXIgPSAwOwogCWh2X2NvbnRleHQuc2lnbmFsX2V2ZW50X3BhcmFtLT5yc3ZkeiA9IDA7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogCiBjbGVhbnVwOgogCWlmICh2aXJ0YWRkcikgewpAQCAtMjMzLDggKzIyNCw4IEBACiAKIAkJdmZyZWUodmlydGFkZHIpOwogCX0KLQlyZXQgPSAtMTsKLQlyZXR1cm4gcmV0OworCisJcmV0dXJuIC1FTk9UU1VQUDsKIH0KIAogLyoKQEAgLTM3OCw3ICszNjksNyBAQAogCXNoYXJlZF9zaW50LmFzX3VpbnQ2NCA9IDA7CiAJc2hhcmVkX3NpbnQudmVjdG9yID0gaXJxX3ZlY3RvcjsgLyogSFZfU0hBUkVEX1NJTlRfSURUX1ZFQ1RPUiArIDB4MjA7ICovCiAJc2hhcmVkX3NpbnQubWFza2VkID0gZmFsc2U7Ci0Jc2hhcmVkX3NpbnQuYXV0b19lb2kgPSB0cnVlOworCXNoYXJlZF9zaW50LmF1dG9fZW9pID0gZmFsc2U7CiAKIAl3cm1zcmwoSFZfWDY0X01TUl9TSU5UMCArIFZNQlVTX01FU1NBR0VfU0lOVCwgc2hhcmVkX3NpbnQuYXNfdWludDY0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L2h2X2t2cC5jIGIvZHJpdmVycy9odi9odl9rdnAuYwpzaW1pbGFyaXR5IGluZGV4IDkwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvaHYvaHZfa3ZwLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHYvaHZfa3ZwLmMKaW5kZXggMTNiMGVjZi4uODlmNTI0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2h2X2t2cC5jCisrKyBiL2RyaXZlcnMvaHYvaHZfa3ZwLmMKQEAgLTI2LDggKzI2LDggQEAKICNpbmNsdWRlIDxsaW51eC9ubHMuaD4KICNpbmNsdWRlIDxsaW51eC9jb25uZWN0b3IuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9oeXBlcnYuaD4KIAotI2luY2x1ZGUgImh5cGVydi5oIgogI2luY2x1ZGUgImh2X2t2cC5oIgogCiAKQEAgLTQ0LDIxICs0NCwyNCBAQAogc3RhdGljIHN0cnVjdCB7CiAJYm9vbCBhY3RpdmU7IC8qIHRyYW5zYWN0aW9uIHN0YXR1cyAtIGFjdGl2ZSBvciBub3QgKi8KIAlpbnQgcmVjdl9sZW47IC8qIG51bWJlciBvZiBieXRlcyByZWNlaXZlZC4gKi8KKwlpbnQgaW5kZXg7IC8qIGN1cnJlbnQgaW5kZXggKi8KIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqcmVjdl9jaGFubmVsOyAvKiBjaG4gd2UgZ290IHRoZSByZXF1ZXN0ICovCiAJdTY0IHJlY3ZfcmVxX2lkOyAvKiByZXF1ZXN0IElELiAqLwogfSBrdnBfdHJhbnNhY3Rpb247CiAKLXN0YXRpYyBpbnQga3ZwX3NlbmRfa2V5KGludCBpbmRleCk7CitzdGF0aWMgdm9pZCBrdnBfc2VuZF9rZXkoc3RydWN0IHdvcmtfc3RydWN0ICpkdW1teSk7CisKKyNkZWZpbmUgVElNRU9VVF9GSVJFRCAxCiAKIHN0YXRpYyB2b2lkIGt2cF9yZXNwb25kX3RvX2hvc3QoY2hhciAqa2V5LCBjaGFyICp2YWx1ZSwgaW50IGVycm9yKTsKIHN0YXRpYyB2b2lkIGt2cF93b3JrX2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICpkdW1teSk7CiBzdGF0aWMgdm9pZCBrdnBfcmVnaXN0ZXIodm9pZCk7CiAKIHN0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhrdnBfd29yaywga3ZwX3dvcmtfZnVuYyk7CitzdGF0aWMgREVDTEFSRV9XT1JLKGt2cF9zZW5ka2V5X3dvcmssIGt2cF9zZW5kX2tleSk7CiAKIHN0YXRpYyBzdHJ1Y3QgY2JfaWQga3ZwX2lkID0geyBDTl9LVlBfSURYLCBDTl9LVlBfVkFMIH07CiBzdGF0aWMgY29uc3QgY2hhciBrdnBfbmFtZVtdID0gImt2cF9rZXJuZWxfbW9kdWxlIjsKLXN0YXRpYyBpbnQgdGltZW91dF9maXJlZDsKIHN0YXRpYyB1OCAqcmVjdl9idWZmZXI7CiAvKgogICogUmVnaXN0ZXIgdGhlIGtlcm5lbCBjb21wb25lbnQgd2l0aCB0aGUgdXNlci1sZXZlbCBkYWVtb24uCkBAIC05MCw4ICs5Myw3IEBACiAJICogSWYgdGhlIHRpbWVyIGZpcmVzLCB0aGUgdXNlci1tb2RlIGNvbXBvbmVudCBoYXMgbm90IHJlc3BvbmRlZDsKIAkgKiBwcm9jZXNzIHRoZSBwZW5kaW5nIHRyYW5zYWN0aW9uLgogCSAqLwotCWt2cF9yZXNwb25kX3RvX2hvc3QoIlVua25vd24ga2V5IiwgIkd1ZXN0IHRpbWVkIG91dCIsIHRpbWVvdXRfZmlyZWQpOwotCXRpbWVvdXRfZmlyZWQgPSAxOworCWt2cF9yZXNwb25kX3RvX2hvc3QoIlVua25vd24ga2V5IiwgIkd1ZXN0IHRpbWVkIG91dCIsIFRJTUVPVVRfRklSRUQpOwogfQogCiAvKgpAQCAtMTIxLDEwICsxMjMsMTEgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQKLWt2cF9zZW5kX2tleShpbnQgaW5kZXgpCitzdGF0aWMgdm9pZAora3ZwX3NlbmRfa2V5KHN0cnVjdCB3b3JrX3N0cnVjdCAqZHVtbXkpCiB7CiAJc3RydWN0IGNuX21zZyAqbXNnOworCWludCBpbmRleCA9IGt2cF90cmFuc2FjdGlvbi5pbmRleDsKIAogCW1zZyA9IGt6YWxsb2Moc2l6ZW9mKCptc2cpICsgc2l6ZW9mKHN0cnVjdCBodl9rdnBfbXNnKSAsIEdGUF9BVE9NSUMpOwogCkBAIC0xMzYsOSArMTM5LDggQEAKIAkJbXNnLT5sZW4gPSBzaXplb2Yoc3RydWN0IGh2X2t1X21zZyk7CiAJCWNuX25ldGxpbmtfc2VuZChtc2csIDAsIEdGUF9BVE9NSUMpOwogCQlrZnJlZShtc2cpOwotCQlyZXR1cm4gMDsKIAl9Ci0JcmV0dXJuIDE7CisJcmV0dXJuOwogfQogCiAvKgpAQCAtMTc3LDYgKzE3OSwxNSBAQAogCWNoYW5uZWwgPSBrdnBfdHJhbnNhY3Rpb24ucmVjdl9jaGFubmVsOwogCXJlcV9pZCA9IGt2cF90cmFuc2FjdGlvbi5yZWN2X3JlcV9pZDsKIAorCWt2cF90cmFuc2FjdGlvbi5hY3RpdmUgPSBmYWxzZTsKKworCWlmIChjaGFubmVsLT5vbmNoYW5uZWxfY2FsbGJhY2sgPT0gTlVMTCkKKwkJLyoKKwkJICogV2UgaGF2ZSByYWNlZCB3aXRoIHV0aWwgZHJpdmVyIGJlaW5nIHVubG9hZGVkOworCQkgKiBzaWxlbnRseSByZXR1cm4uCisJCSAqLworCQlyZXR1cm47CisKIAlpY21zZ2hkcnAgPSAoc3RydWN0IGljbXNnX2hkciAqKQogCQkJJnJlY3ZfYnVmZmVyW3NpemVvZihzdHJ1Y3Qgdm1idXNwaXBlX2hkcildOwogCWt2cF9tc2cgPSAoc3RydWN0IGh2X2t2cF9tc2cgKikKQEAgLTIxNyw3ICsyMjgsNiBAQAogCXZtYnVzX3NlbmRwYWNrZXQoY2hhbm5lbCwgcmVjdl9idWZmZXIsIGJ1Zl9sZW4sIHJlcV9pZCwKIAkJCQlWTV9QS1RfREFUQV9JTkJBTkQsIDApOwogCi0Ja3ZwX3RyYW5zYWN0aW9uLmFjdGl2ZSA9IGZhbHNlOwogfQogCiAvKgpAQCAtMjQzLDEwICsyNTMsNiBAQAogCXN0cnVjdCBpY21zZ19uZWdvdGlhdGUgKm5lZ29wID0gTlVMTDsKIAogCi0JaWYgKGt2cF90cmFuc2FjdGlvbi5hY3RpdmUpCi0JCXJldHVybjsKLQotCiAJdm1idXNfcmVjdnBhY2tldChjaGFubmVsLCByZWN2X2J1ZmZlciwgUEFHRV9TSVpFLCAmcmVjdmxlbiwgJnJlcXVlc3RpZCk7CiAKIAlpZiAocmVjdmxlbiA+IDApIHsKQEAgLTI1NCw3ICsyNjAsNyBAQAogCQkJc2l6ZW9mKHN0cnVjdCB2bWJ1c3BpcGVfaGRyKV07CiAKIAkJaWYgKGljbXNnaGRycC0+aWNtc2d0eXBlID09IElDTVNHVFlQRV9ORUdPVElBVEUpIHsKLQkJCXByZXBfbmVnb3RpYXRlX3Jlc3AoaWNtc2doZHJwLCBuZWdvcCwgcmVjdl9idWZmZXIpOworCQkJdm1idXNfcHJlcF9uZWdvdGlhdGVfcmVzcChpY21zZ2hkcnAsIG5lZ29wLCByZWN2X2J1ZmZlcik7CiAJCX0gZWxzZSB7CiAJCQlrdnBfbXNnID0gKHN0cnVjdCBodl9rdnBfbXNnICopJnJlY3ZfYnVmZmVyWwogCQkJCXNpemVvZihzdHJ1Y3Qgdm1idXNwaXBlX2hkcikgKwpAQCAtMjgyLDYgKzI4OCw3IEBACiAJCQlrdnBfdHJhbnNhY3Rpb24ucmVjdl9jaGFubmVsID0gY2hhbm5lbDsKIAkJCWt2cF90cmFuc2FjdGlvbi5yZWN2X3JlcV9pZCA9IHJlcXVlc3RpZDsKIAkJCWt2cF90cmFuc2FjdGlvbi5hY3RpdmUgPSB0cnVlOworCQkJa3ZwX3RyYW5zYWN0aW9uLmluZGV4ID0ga3ZwX2RhdGEtPmluZGV4OwogCiAJCQkvKgogCQkJICogR2V0IHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZQpAQCAtMjkyLDggKzI5OSw4IEBACiAJCQkgKiBTZXQgYSB0aW1lb3V0IHRvIGRlYWwgd2l0aAogCQkJICogdXNlci1tb2RlIG5vdCByZXNwb25kaW5nLgogCQkJICovCi0JCQlrdnBfc2VuZF9rZXkoa3ZwX2RhdGEtPmluZGV4KTsKLQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygma3ZwX3dvcmssIDEwMCk7CisJCQlzY2hlZHVsZV93b3JrKCZrdnBfc2VuZGtleV93b3JrKTsKKwkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygma3ZwX3dvcmssIDUqSFopOwogCiAJCQlyZXR1cm47CiAKQEAgLTMxMiwxNiArMzE5LDE0IEBACiB9CiAKIGludAotaHZfa3ZwX2luaXQodm9pZCkKK2h2X2t2cF9pbml0KHN0cnVjdCBodl91dGlsX3NlcnZpY2UgKnNydikKIHsKIAlpbnQgZXJyOwogCiAJZXJyID0gY25fYWRkX2NhbGxiYWNrKCZrdnBfaWQsIGt2cF9uYW1lLCBrdnBfY25fY2FsbGJhY2spOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7Ci0JcmVjdl9idWZmZXIgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyZWN2X2J1ZmZlcikKLQkJcmV0dXJuIC1FTk9NRU07CisJcmVjdl9idWZmZXIgPSBzcnYtPnJlY3ZfYnVmZmVyOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMzAsNSArMzM1LDUgQEAKIHsKIAljbl9kZWxfY2FsbGJhY2soJmt2cF9pZCk7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZrdnBfd29yayk7Ci0Ja2ZyZWUocmVjdl9idWZmZXIpOworCWNhbmNlbF93b3JrX3N5bmMoJmt2cF9zZW5ka2V5X3dvcmspOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L2h2X2t2cC5oIGIvZHJpdmVycy9odi9odl9rdnAuaApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvaHYvaHZfa3ZwLmgKcmVuYW1lIHRvIGRyaXZlcnMvaHYvaHZfa3ZwLmgKaW5kZXggOGM0MDJmMy4uOWI3NjVkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2h2X2t2cC5oCisrKyBiL2RyaXZlcnMvaHYvaHZfa3ZwLmgKQEAgLTE3NSw3ICsxNzUsNyBAQAogCXN0cnVjdCBodl9rdnBfbXNnX2VudW1lcmF0ZQlrdnBfZGF0YTsKIH07CiAKLWludCBodl9rdnBfaW5pdCh2b2lkKTsKK2ludCBodl9rdnBfaW5pdChzdHJ1Y3QgaHZfdXRpbF9zZXJ2aWNlICopOwogdm9pZCBodl9rdnBfZGVpbml0KHZvaWQpOwogdm9pZCBodl9rdnBfb25jaGFubmVsY2FsbGJhY2sodm9pZCAqKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L2h2X3V0aWwuYyBiL2RyaXZlcnMvaHYvaHZfdXRpbC5jCnNpbWlsYXJpdHkgaW5kZXggNjElCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9odi9odl91dGlsLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHYvaHZfdXRpbC5jCmluZGV4IGMxNjRiNTQuLjU1ZDU4ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9odl91dGlsLmMKKysrIGIvZHJpdmVycy9odi9odl91dGlsLmMKQEAgLTI2LDE1ICsyNiwzMSBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWkuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9oeXBlcnYuaD4KIAotI2luY2x1ZGUgImh5cGVydi5oIgogI2luY2x1ZGUgImh2X2t2cC5oIgogCi1zdGF0aWMgdTggKnNodXRfdHhmX2J1ZjsKLXN0YXRpYyB1OCAqdGltZV90eGZfYnVmOwotc3RhdGljIHU4ICpoYmVhdF90eGZfYnVmOworCitzdGF0aWMgdm9pZCBzaHV0ZG93bl9vbmNoYW5uZWxjYWxsYmFjayh2b2lkICpjb250ZXh0KTsKK3N0YXRpYyBzdHJ1Y3QgaHZfdXRpbF9zZXJ2aWNlIHV0aWxfc2h1dGRvd24gPSB7CisJLnV0aWxfY2IgPSBzaHV0ZG93bl9vbmNoYW5uZWxjYWxsYmFjaywKK307CisKK3N0YXRpYyB2b2lkIHRpbWVzeW5jX29uY2hhbm5lbGNhbGxiYWNrKHZvaWQgKmNvbnRleHQpOworc3RhdGljIHN0cnVjdCBodl91dGlsX3NlcnZpY2UgdXRpbF90aW1lc3luY2ggPSB7CisJLnV0aWxfY2IgPSB0aW1lc3luY19vbmNoYW5uZWxjYWxsYmFjaywKK307CisKK3N0YXRpYyB2b2lkIGhlYXJ0YmVhdF9vbmNoYW5uZWxjYWxsYmFjayh2b2lkICpjb250ZXh0KTsKK3N0YXRpYyBzdHJ1Y3QgaHZfdXRpbF9zZXJ2aWNlIHV0aWxfaGVhcnRiZWF0ID0geworCS51dGlsX2NiID0gaGVhcnRiZWF0X29uY2hhbm5lbGNhbGxiYWNrLAorfTsKKworc3RhdGljIHN0cnVjdCBodl91dGlsX3NlcnZpY2UgdXRpbF9rdnAgPSB7CisJLnV0aWxfY2IgPSBodl9rdnBfb25jaGFubmVsY2FsbGJhY2ssCisJLnV0aWxfaW5pdCA9IGh2X2t2cF9pbml0LAorCS51dGlsX2RlaW5pdCA9IGh2X2t2cF9kZWluaXQsCit9OwogCiBzdGF0aWMgdm9pZCBzaHV0ZG93bl9vbmNoYW5uZWxjYWxsYmFjayh2b2lkICpjb250ZXh0KQogewpAQCAtNDIsNiArNTgsNyBAQAogCXUzMiByZWN2bGVuOwogCXU2NCByZXF1ZXN0aWQ7CiAJdTggIGV4ZWN1dGVfc2h1dGRvd24gPSBmYWxzZTsKKwl1OCAgKnNodXRfdHhmX2J1ZiA9IHV0aWxfc2h1dGRvd24ucmVjdl9idWZmZXI7CiAKIAlzdHJ1Y3Qgc2h1dGRvd25fbXNnX2RhdGEgKnNodXRkb3duX21zZzsKIApAQCAtNTYsNyArNzMsNyBAQAogCQkJc2l6ZW9mKHN0cnVjdCB2bWJ1c3BpcGVfaGRyKV07CiAKIAkJaWYgKGljbXNnaGRycC0+aWNtc2d0eXBlID09IElDTVNHVFlQRV9ORUdPVElBVEUpIHsKLQkJCXByZXBfbmVnb3RpYXRlX3Jlc3AoaWNtc2doZHJwLCBuZWdvcCwgc2h1dF90eGZfYnVmKTsKKwkJCXZtYnVzX3ByZXBfbmVnb3RpYXRlX3Jlc3AoaWNtc2doZHJwLCBuZWdvcCwgc2h1dF90eGZfYnVmKTsKIAkJfSBlbHNlIHsKIAkJCXNodXRkb3duX21zZyA9CiAJCQkJKHN0cnVjdCBzaHV0ZG93bl9tc2dfZGF0YSAqKSZzaHV0X3R4Zl9idWZbCkBAIC05MSw3ICsxMDgsNyBAQAogCX0KIAogCWlmIChleGVjdXRlX3NodXRkb3duID09IHRydWUpCi0JCW9yZGVybHlfcG93ZXJvZmYoZmFsc2UpOworCQlvcmRlcmx5X3Bvd2Vyb2ZmKHRydWUpOwogfQogCiAvKgpAQCAtMTA5LDYgKzEyNiwyNCBAQAogfQogCiAvKgorICogU2V0IHRoZSBob3N0IHRpbWUgaW4gYSBwcm9jZXNzIGNvbnRleHQuCisgKi8KKworc3RydWN0IGFkal90aW1lX3dvcmsgeworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXU2NAlob3N0X3RpbWU7Cit9OworCitzdGF0aWMgdm9pZCBodl9zZXRfaG9zdF90aW1lKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYWRqX3RpbWVfd29yawkqd3JrOworCisJd3JrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBhZGpfdGltZV93b3JrLCB3b3JrKTsKKwlkb19hZGpfZ3Vlc3R0aW1lKHdyay0+aG9zdF90aW1lKTsKKwlrZnJlZSh3cmspOworfQorCisvKgogICogU3luY2hyb25pemUgdGltZSB3aXRoIGhvc3QgYWZ0ZXIgcmVib290LCByZXN0b3JlLCBldGMuCiAgKgogICogSUNUSU1FU1lOQ0ZMQUdfU1lOQyBmbGFnIGJpdCBpbmRpY2F0ZXMgcmVib290LCByZXN0b3JlIGV2ZW50cyBvZiB0aGUgVk0uCkBAIC0xMjEsMTcgKzE1NiwyNiBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgYWRqX2d1ZXN0dGltZSh1NjQgaG9zdHRpbWUsIHU4IGZsYWdzKQogeworCXN0cnVjdCBhZGpfdGltZV93b3JrICAgICp3cms7CiAJc3RhdGljIHMzMiBzY250ID0gNTA7CiAKKwl3cmsgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWRqX3RpbWVfd29yayksIEdGUF9BVE9NSUMpOworCWlmICh3cmsgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJd3JrLT5ob3N0X3RpbWUgPSBob3N0dGltZTsKIAlpZiAoKGZsYWdzICYgSUNUSU1FU1lOQ0ZMQUdfU1lOQykgIT0gMCkgewotCQlkb19hZGpfZ3Vlc3R0aW1lKGhvc3R0aW1lKTsKKwkJSU5JVF9XT1JLKCZ3cmstPndvcmssIGh2X3NldF9ob3N0X3RpbWUpOworCQlzY2hlZHVsZV93b3JrKCZ3cmstPndvcmspOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKChmbGFncyAmIElDVElNRVNZTkNGTEFHX1NBTVBMRSkgIT0gMCAmJiBzY250ID4gMCkgewogCQlzY250LS07Ci0JCWRvX2Fkal9ndWVzdHRpbWUoaG9zdHRpbWUpOwotCX0KKwkJSU5JVF9XT1JLKCZ3cmstPndvcmssIGh2X3NldF9ob3N0X3RpbWUpOworCQlzY2hlZHVsZV93b3JrKCZ3cmstPndvcmspOworCX0gZWxzZQorCQlrZnJlZSh3cmspOwogfQogCiAvKgpAQCAtMTQ0LDYgKzE4OCw3IEBACiAJdTY0IHJlcXVlc3RpZDsKIAlzdHJ1Y3QgaWNtc2dfaGRyICppY21zZ2hkcnA7CiAJc3RydWN0IGljdGltZXN5bmNfZGF0YSAqdGltZWRhdGFwOworCXU4ICp0aW1lX3R4Zl9idWYgPSB1dGlsX3RpbWVzeW5jaC5yZWN2X2J1ZmZlcjsKIAogCXZtYnVzX3JlY3ZwYWNrZXQoY2hhbm5lbCwgdGltZV90eGZfYnVmLAogCQkJIFBBR0VfU0laRSwgJnJlY3ZsZW4sICZyZXF1ZXN0aWQpOwpAQCAtMTUzLDcgKzE5OCw3IEBACiAJCQkJc2l6ZW9mKHN0cnVjdCB2bWJ1c3BpcGVfaGRyKV07CiAKIAkJaWYgKGljbXNnaGRycC0+aWNtc2d0eXBlID09IElDTVNHVFlQRV9ORUdPVElBVEUpIHsKLQkJCXByZXBfbmVnb3RpYXRlX3Jlc3AoaWNtc2doZHJwLCBOVUxMLCB0aW1lX3R4Zl9idWYpOworCQkJdm1idXNfcHJlcF9uZWdvdGlhdGVfcmVzcChpY21zZ2hkcnAsIE5VTEwsIHRpbWVfdHhmX2J1Zik7CiAJCX0gZWxzZSB7CiAJCQl0aW1lZGF0YXAgPSAoc3RydWN0IGljdGltZXN5bmNfZGF0YSAqKSZ0aW1lX3R4Zl9idWZbCiAJCQkJc2l6ZW9mKHN0cnVjdCB2bWJ1c3BpcGVfaGRyKSArCkBAIC0xODIsNiArMjI3LDcgQEAKIAl1NjQgcmVxdWVzdGlkOwogCXN0cnVjdCBpY21zZ19oZHIgKmljbXNnaGRycDsKIAlzdHJ1Y3QgaGVhcnRiZWF0X21zZ19kYXRhICpoZWFydGJlYXRfbXNnOworCXU4ICpoYmVhdF90eGZfYnVmID0gdXRpbF9oZWFydGJlYXQucmVjdl9idWZmZXI7CiAKIAl2bWJ1c19yZWN2cGFja2V0KGNoYW5uZWwsIGhiZWF0X3R4Zl9idWYsCiAJCQkgUEFHRV9TSVpFLCAmcmVjdmxlbiwgJnJlcXVlc3RpZCk7CkBAIC0xOTEsNyArMjM3LDcgQEAKIAkJCQlzaXplb2Yoc3RydWN0IHZtYnVzcGlwZV9oZHIpXTsKIAogCQlpZiAoaWNtc2doZHJwLT5pY21zZ3R5cGUgPT0gSUNNU0dUWVBFX05FR09USUFURSkgewotCQkJcHJlcF9uZWdvdGlhdGVfcmVzcChpY21zZ2hkcnAsIE5VTEwsIGhiZWF0X3R4Zl9idWYpOworCQkJdm1idXNfcHJlcF9uZWdvdGlhdGVfcmVzcChpY21zZ2hkcnAsIE5VTEwsIGhiZWF0X3R4Zl9idWYpOwogCQl9IGVsc2UgewogCQkJaGVhcnRiZWF0X21zZyA9CiAJCQkJKHN0cnVjdCBoZWFydGJlYXRfbXNnX2RhdGEgKikmaGJlYXRfdHhmX2J1ZlsKQEAgLTIxMCw5MiArMjU2LDk0IEBACiAJfQogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgX19pbml0Y29uc3QKLWh2X3V0aWxzX3BjaV90YWJsZVtdIF9fbWF5YmVfdW51c2VkID0gewotCXsgUENJX0RFVklDRSgweDE0MTQsIDB4NTM1MykgfSwgLyogSHlwZXItViBlbXVsYXRlZCBWR0EgY29udHJvbGxlciAqLwotCXsgMCB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGh2X3V0aWxzX3BjaV90YWJsZSk7CitzdGF0aWMgaW50IHV0aWxfcHJvYmUoc3RydWN0IGh2X2RldmljZSAqZGV2LAorCQkJY29uc3Qgc3RydWN0IGh2X3ZtYnVzX2RldmljZV9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBodl91dGlsX3NlcnZpY2UgKnNydiA9CisJCShzdHJ1Y3QgaHZfdXRpbF9zZXJ2aWNlICopZGV2X2lkLT5kcml2ZXJfZGF0YTsKKwlpbnQgcmV0OwogCisJc3J2LT5yZWN2X2J1ZmZlciA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNydi0+cmVjdl9idWZmZXIpCisJCXJldHVybiAtRU5PTUVNOworCWlmIChzcnYtPnV0aWxfaW5pdCkgeworCQlyZXQgPSBzcnYtPnV0aWxfaW5pdChzcnYpOworCQlpZiAocmV0KSB7CisJCQlyZXQgPSAtRU5PREVWOworCQkJZ290byBlcnJvcjE7CisJCX0KKwl9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBfX2luaXRjb25zdAotaHZfdXRpbHNfZG1pX3RhYmxlW10gX19tYXliZV91bnVzZWQgID0gewotCXsKLQkJLmlkZW50ID0gIkh5cGVyLVYiLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIk1pY3Jvc29mdCBDb3Jwb3JhdGlvbiIpLAotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWaXJ0dWFsIE1hY2hpbmUiKSwKLQkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIlZpcnR1YWwgTWFjaGluZSIpLAotCQl9LAotCX0sCisJcmV0ID0gdm1idXNfb3BlbihkZXYtPmNoYW5uZWwsIDIgKiBQQUdFX1NJWkUsIDIgKiBQQUdFX1NJWkUsIE5VTEwsIDAsCisJCQlzcnYtPnV0aWxfY2IsIGRldi0+Y2hhbm5lbCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCWh2X3NldF9kcnZkYXRhKGRldiwgc3J2KTsKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJaWYgKHNydi0+dXRpbF9kZWluaXQpCisJCXNydi0+dXRpbF9kZWluaXQoKTsKK2Vycm9yMToKKwlrZnJlZShzcnYtPnJlY3ZfYnVmZmVyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHV0aWxfcmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaHZfdXRpbF9zZXJ2aWNlICpzcnYgPSBodl9nZXRfZHJ2ZGF0YShkZXYpOworCisJdm1idXNfY2xvc2UoZGV2LT5jaGFubmVsKTsKKwlpZiAoc3J2LT51dGlsX2RlaW5pdCkKKwkJc3J2LT51dGlsX2RlaW5pdCgpOworCWtmcmVlKHNydi0+cmVjdl9idWZmZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHZfdm1idXNfZGV2aWNlX2lkIGlkX3RhYmxlW10gPSB7CisJLyogU2h1dGRvd24gZ3VpZCAqLworCXsgVk1CVVNfREVWSUNFKDB4MzEsIDB4NjAsIDB4MEIsIDBYMEUsIDB4MTMsIDB4NTIsIDB4MzQsIDB4NDksCisJCSAgICAgICAweDgxLCAweDhCLCAweDM4LCAwWEQ5LCAweDBDLCAweEVELCAweDM5LCAweERCKQorCSAgLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpJnV0aWxfc2h1dGRvd24gfSwKKwkvKiBUaW1lIHN5bmNoIGd1aWQgKi8KKwl7IFZNQlVTX0RFVklDRSgweDMwLCAweGU2LCAweDI3LCAweDk1LCAweGFlLCAweGQwLCAweDdiLCAweDQ5LAorCQkgICAgICAgMHhhZCwgMHhjZSwgMHhlOCwgMHgwYSwgMHhiMCwgMHgxNywgMHg1YywgMHhhZikKKwkgIC5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSZ1dGlsX3RpbWVzeW5jaCB9LAorCS8qIEhlYXJ0YmVhdCBndWlkICovCisJeyBWTUJVU19ERVZJQ0UoMHgzOSwgMHg0ZiwgMHgxNiwgMHg1NywgMHgxNSwgMHg5MSwgMHg3OCwgMHg0ZSwKKwkJICAgICAgIDB4YWIsIDB4NTUsIDB4MzgsIDB4MmYsIDB4M2IsIDB4ZDUsIDB4NDIsIDB4MmQpCisJICAuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZykmdXRpbF9oZWFydGJlYXQgfSwKKwkvKiBLVlAgZ3VpZCAqLworCXsgVk1CVVNfREVWSUNFKDB4ZTcsIDB4ZjQsIDB4YTAsIDB4YTksIDB4NDUsIDB4NWEsIDB4OTYsIDB4NGQsCisJCSAgICAgICAweGI4LCAweDI3LCAweDhhLCAweDg0LCAweDFlLCAweDhjLCAweDMsICAweGU2KQorCSAgLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpJnV0aWxfa3ZwIH0sCiAJeyB9LAogfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUoZG1pLCBodl91dGlsc19kbWlfdGFibGUpOwogCitNT0RVTEVfREVWSUNFX1RBQkxFKHZtYnVzLCBpZF90YWJsZSk7CisKKy8qIFRoZSBvbmUgYW5kIG9ubHkgb25lICovCitzdGF0aWMgIHN0cnVjdCBodl9kcml2ZXIgdXRpbF9kcnYgPSB7CisJLm5hbWUgPSAiaHZfdXRpbCIsCisJLmlkX3RhYmxlID0gaWRfdGFibGUsCisJLnByb2JlID0gIHV0aWxfcHJvYmUsCisJLnJlbW92ZSA9ICB1dGlsX3JlbW92ZSwKK307CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfaHlwZXJ2X3V0aWxzKHZvaWQpCiB7CiAJcHJfaW5mbygiUmVnaXN0ZXJpbmcgSHlwZXJWIFV0aWxpdHkgRHJpdmVyXG4iKTsKIAotCWlmIChodl9rdnBfaW5pdCgpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCi0JaWYgKCFkbWlfY2hlY2tfc3lzdGVtKGh2X3V0aWxzX2RtaV90YWJsZSkpCi0JCXJldHVybiAtRU5PREVWOwotCi0Jc2h1dF90eGZfYnVmID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwotCXRpbWVfdHhmX2J1ZiA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKLQloYmVhdF90eGZfYnVmID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOwotCi0JaWYgKCFzaHV0X3R4Zl9idWYgfHwgIXRpbWVfdHhmX2J1ZiB8fCAhaGJlYXRfdHhmX2J1ZikgewotCQlwcl9pbmZvKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciByZWNlaXZlIGJ1ZmZlclxuIik7Ci0JCWtmcmVlKHNodXRfdHhmX2J1Zik7Ci0JCWtmcmVlKHRpbWVfdHhmX2J1Zik7Ci0JCWtmcmVlKGhiZWF0X3R4Zl9idWYpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlodl9jYl91dGlsc1tIVl9TSFVURE9XTl9NU0ddLmNhbGxiYWNrID0gJnNodXRkb3duX29uY2hhbm5lbGNhbGxiYWNrOwotCi0JaHZfY2JfdXRpbHNbSFZfVElNRVNZTkNfTVNHXS5jYWxsYmFjayA9ICZ0aW1lc3luY19vbmNoYW5uZWxjYWxsYmFjazsKLQotCWh2X2NiX3V0aWxzW0hWX0hFQVJUQkVBVF9NU0ddLmNhbGxiYWNrID0gJmhlYXJ0YmVhdF9vbmNoYW5uZWxjYWxsYmFjazsKLQotCWh2X2NiX3V0aWxzW0hWX0tWUF9NU0ddLmNhbGxiYWNrID0gJmh2X2t2cF9vbmNoYW5uZWxjYWxsYmFjazsKLQotCXJldHVybiAwOworCXJldHVybiB2bWJ1c19kcml2ZXJfcmVnaXN0ZXIoJnV0aWxfZHJ2KTsKIH0KIAogc3RhdGljIHZvaWQgZXhpdF9oeXBlcnZfdXRpbHModm9pZCkKIHsKIAlwcl9pbmZvKCJEZS1SZWdpc3RlcmVkIEh5cGVyViBVdGlsaXR5IERyaXZlclxuIik7CiAKLQlpZiAoaHZfY2JfdXRpbHNbSFZfU0hVVERPV05fTVNHXS5jaGFubmVsICE9IE5VTEwpCi0JCWh2X2NiX3V0aWxzW0hWX1NIVVRET1dOX01TR10uY2hhbm5lbC0+b25jaGFubmVsX2NhbGxiYWNrID0KLQkJCSZjaG5fY2JfbmVnb3RpYXRlOwotCWh2X2NiX3V0aWxzW0hWX1NIVVRET1dOX01TR10uY2FsbGJhY2sgPSBOVUxMOwotCi0JaWYgKGh2X2NiX3V0aWxzW0hWX1RJTUVTWU5DX01TR10uY2hhbm5lbCAhPSBOVUxMKQotCQlodl9jYl91dGlsc1tIVl9USU1FU1lOQ19NU0ddLmNoYW5uZWwtPm9uY2hhbm5lbF9jYWxsYmFjayA9Ci0JCQkmY2huX2NiX25lZ290aWF0ZTsKLQlodl9jYl91dGlsc1tIVl9USU1FU1lOQ19NU0ddLmNhbGxiYWNrID0gTlVMTDsKLQotCWlmIChodl9jYl91dGlsc1tIVl9IRUFSVEJFQVRfTVNHXS5jaGFubmVsICE9IE5VTEwpCi0JCWh2X2NiX3V0aWxzW0hWX0hFQVJUQkVBVF9NU0ddLmNoYW5uZWwtPm9uY2hhbm5lbF9jYWxsYmFjayA9Ci0JCQkmY2huX2NiX25lZ290aWF0ZTsKLQlodl9jYl91dGlsc1tIVl9IRUFSVEJFQVRfTVNHXS5jYWxsYmFjayA9IE5VTEw7Ci0KLQlpZiAoaHZfY2JfdXRpbHNbSFZfS1ZQX01TR10uY2hhbm5lbCAhPSBOVUxMKQotCQlodl9jYl91dGlsc1tIVl9LVlBfTVNHXS5jaGFubmVsLT5vbmNoYW5uZWxfY2FsbGJhY2sgPQotCQkJJmNobl9jYl9uZWdvdGlhdGU7Ci0JaHZfY2JfdXRpbHNbSFZfS1ZQX01TR10uY2FsbGJhY2sgPSBOVUxMOwotCi0JaHZfa3ZwX2RlaW5pdCgpOwotCi0Ja2ZyZWUoc2h1dF90eGZfYnVmKTsKLQlrZnJlZSh0aW1lX3R4Zl9idWYpOwotCWtmcmVlKGhiZWF0X3R4Zl9idWYpOworCXZtYnVzX2RyaXZlcl91bnJlZ2lzdGVyKCZ1dGlsX2Rydik7CiB9CiAKIG1vZHVsZV9pbml0KGluaXRfaHlwZXJ2X3V0aWxzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9oeXBlcnZfdm1idXMuaCBiL2RyaXZlcnMvaHYvaHlwZXJ2X3ZtYnVzLmgKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2h2L2h5cGVydl92bWJ1cy5oCnJlbmFtZSB0byBkcml2ZXJzL2h2L2h5cGVydl92bWJ1cy5oCmluZGV4IDM0OWFkODAuLjBhZWUxMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9oeXBlcnZfdm1idXMuaAorKysgYi9kcml2ZXJzL2h2L2h5cGVydl92bWJ1cy5oCkBAIC0yOCw4ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGFzbS9zeW5jX2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgotCi0jaW5jbHVkZSAiaHlwZXJ2LmgiCisjaW5jbHVkZSA8bGludXgvaHlwZXJ2Lmg+CiAKIC8qCiAgKiBUaGUgYmVsb3cgQ1BVSUQgbGVhdmVzIGFyZSBwcmVzZW50IGlmIFZlcnNpb25BbmRGZWF0dXJlcy5IeXBlcnZpc29yUHJlc2VudApAQCAtNDUxLDggKzQ1MCw4IEBACiAvKiAjZGVmaW5lIFZNQlVTX1BPUlRfSUQJCTExICovCiAKIC8qIDYyODE4MEI4LTMwOEQtNGM1ZS1CN0RCLTFCRUI2MkU2MkVGNCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBodl9ndWlkIFZNQlVTX1NFUlZJQ0VfSUQgPSB7Ci0JLmRhdGEgPSB7CitzdGF0aWMgY29uc3QgdXVpZF9sZSBWTUJVU19TRVJWSUNFX0lEID0geworCS5iID0gewogCQkweGI4LCAweDgwLCAweDgxLCAweDYyLCAweDhkLCAweDMwLCAweDVlLCAweDRjLAogCQkweGI3LCAweGRiLCAweDFiLCAweGViLCAweDYyLCAweGU2LCAweDJlLCAweGY0CiAJfSwKQEAgLTUzMCw4ICs1MjksNiBAQAogCiB1MzIgaHZfZ2V0X3JpbmdidWZmZXJfaW50ZXJydXB0X21hc2soc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbyk7CiAKLXZvaWQgaHZfZHVtcF9yaW5nX2luZm8oc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbywgY2hhciAqcHJlZml4KTsKLQogdm9pZCBodl9yaW5nYnVmZmVyX2dldF9kZWJ1Z2luZm8oc3RydWN0IGh2X3JpbmdfYnVmZmVyX2luZm8gKnJpbmdfaW5mbywKIAkJCSAgICBzdHJ1Y3QgaHZfcmluZ19idWZmZXJfZGVidWdfaW5mbyAqZGVidWdfaW5mbyk7CiAKQEAgLTYwMSwxMiArNTk4LDEyIEBACiAKIC8qIEdlbmVyYWwgdm1idXMgaW50ZXJmYWNlICovCiAKLXN0cnVjdCBodl9kZXZpY2UgKnZtYnVzX2NoaWxkX2RldmljZV9jcmVhdGUoc3RydWN0IGh2X2d1aWQgKnR5cGUsCi0JCQkJCSBzdHJ1Y3QgaHZfZ3VpZCAqaW5zdGFuY2UsCitzdHJ1Y3QgaHZfZGV2aWNlICp2bWJ1c19kZXZpY2VfY3JlYXRlKHV1aWRfbGUgKnR5cGUsCisJCQkJCSB1dWlkX2xlICppbnN0YW5jZSwKIAkJCQkJIHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsKTsKIAotaW50IHZtYnVzX2NoaWxkX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgaHZfZGV2aWNlICpjaGlsZF9kZXZpY2Vfb2JqKTsKLXZvaWQgdm1idXNfY2hpbGRfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlX29iaik7CitpbnQgdm1idXNfZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBodl9kZXZpY2UgKmNoaWxkX2RldmljZV9vYmopOwordm9pZCB2bWJ1c19kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2Vfb2JqKTsKIAogLyogc3RhdGljIHZvaWQgKi8KIC8qIFZtYnVzQ2hpbGREZXZpY2VEZXN0cm95KCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3JpbmdfYnVmZmVyLmMgYi9kcml2ZXJzL2h2L3JpbmdfYnVmZmVyLmMKc2ltaWxhcml0eSBpbmRleCA5MyUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL2h2L3JpbmdfYnVmZmVyLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHYvcmluZ19idWZmZXIuYwppbmRleCA0MmY3NjcyLi44YWYyNWEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvcmluZ19idWZmZXIuYworKysgYi9kcml2ZXJzL2h2L3JpbmdfYnVmZmVyLmMKQEAgLTI1LDggKzI1LDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaHlwZXJ2Lmg+CiAKLSNpbmNsdWRlICJoeXBlcnYuaCIKICNpbmNsdWRlICJoeXBlcnZfdm1idXMuaCIKIAogCkBAIC0zNCw3ICszNCw4IEBACiAKIAogLyogQW1vdW50IG9mIHNwYWNlIHRvIHdyaXRlIHRvICovCi0jZGVmaW5lIEJZVEVTX0FWQUlMX1RPX1dSSVRFKHIsIHcsIHopICgodykgPj0gKHIpKSA/ICgoeikgLSAoKHcpIC0gKHIpKSkgOiAoKHIpIC0gKHcpKQorI2RlZmluZSBCWVRFU19BVkFJTF9UT19XUklURShyLCB3LCB6KSBcCisJKCh3KSA+PSAocikpID8gKCh6KSAtICgodykgLSAocikpKSA6ICgocikgLSAodykpCiAKIAogLyoKQEAgLTE3MSwzNyArMTcyLDYgQEAKIAlyZXR1cm4gKHU2NClyaW5nX2luZm8tPnJpbmdfYnVmZmVyLT53cml0ZV9pbmRleCA8PCAzMjsKIH0KIAotCi0vKgotICoKLSAqIGh2X2R1bXBfcmluZ19pbmZvKCkKLSAqCi0gKiBEdW1wIG91dCB0byBjb25zb2xlIHRoZSByaW5nIGJ1ZmZlciBpbmZvCi0gKgotICovCi12b2lkIGh2X2R1bXBfcmluZ19pbmZvKHN0cnVjdCBodl9yaW5nX2J1ZmZlcl9pbmZvICpyaW5nX2luZm8sIGNoYXIgKnByZWZpeCkKLXsKLQl1MzIgYnl0ZXNfYXZhaWxfdG93cml0ZTsKLQl1MzIgYnl0ZXNfYXZhaWxfdG9yZWFkOwotCi0JaHZfZ2V0X3JpbmdidWZmZXJfYXZhaWxieXRlcyhyaW5nX2luZm8sCi0JJmJ5dGVzX2F2YWlsX3RvcmVhZCwKLQkmYnl0ZXNfYXZhaWxfdG93cml0ZSk7Ci0KLQlEUFJJTlQoVk1CVVMsCi0JCURFQlVHX1JJTkdfTFZMLAotCQkiJXMgPDxyaW5naW5mbyAlcCBidWZmZXIgJXAgYXZhaWwgd3JpdGUgJXUgIgotCQkiYXZhaWwgcmVhZCAldSByZWFkIGlkeCAldSB3cml0ZSBpZHggJXU+PiIsCi0JCXByZWZpeCwKLQkJcmluZ19pbmZvLAotCQlyaW5nX2luZm8tPnJpbmdfYnVmZmVyLT5idWZmZXIsCi0JCWJ5dGVzX2F2YWlsX3Rvd3JpdGUsCi0JCWJ5dGVzX2F2YWlsX3RvcmVhZCwKLQkJcmluZ19pbmZvLT5yaW5nX2J1ZmZlci0+cmVhZF9pbmRleCwKLQkJcmluZ19pbmZvLT5yaW5nX2J1ZmZlci0+d3JpdGVfaW5kZXgpOwotfQotCi0KIC8qCiAgKgogICogaHZfY29weWZyb21fcmluZ2J1ZmZlcigpCkBAIC0zOTAsNyArMzYwLDcgQEAKIAkvKiBpcyBlbXB0eSBzaW5jZSB0aGUgcmVhZCBpbmRleCA9PSB3cml0ZSBpbmRleCAqLwogCWlmIChieXRlc19hdmFpbF90b3dyaXRlIDw9IHRvdGFsYnl0ZXNfdG93cml0ZSkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvdXRyaW5nX2luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUFHQUlOOwogCX0KIAogCS8qIFdyaXRlIHRvIHRoZSByaW5nIGJ1ZmZlciAqLwpAQCAtNDUwLDcgKzQyMCw3IEBACiAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmSW5yaW5nX2luZm8tPnJpbmdfbG9jaywgZmxhZ3MpOwogCi0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FQUdBSU47CiAJfQogCiAJLyogQ29udmVydCB0byBieXRlIG9mZnNldCAqLwpAQCAtNDk2LDcgKzQ2Niw3IEBACiAJaWYgKGJ5dGVzX2F2YWlsX3RvcmVhZCA8IGJ1ZmxlbikgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbnJpbmdfaW5mby0+cmluZ19sb2NrLCBmbGFncyk7CiAKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKIAluZXh0X3JlYWRfbG9jYXRpb24gPQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L3ZtYnVzX2Rydi5jIGIvZHJpdmVycy9odi92bWJ1c19kcnYuYwpzaW1pbGFyaXR5IGluZGV4IDYzJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvaHYvdm1idXNfZHJ2LmMKcmVuYW1lIHRvIGRyaXZlcnMvaHYvdm1idXNfZHJ2LmMKaW5kZXggMWM5NDlmNS4uMGMwNDhkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L3ZtYnVzX2Rydi5jCisrKyBiL2RyaXZlcnMvaHYvdm1idXNfZHJ2LmMKQEAgLTI4LDE0ICsyOCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KLQotI2luY2x1ZGUgImh5cGVydi5oIgorI2luY2x1ZGUgPGxpbnV4L2h5cGVydi5oPgorI2luY2x1ZGUgPGFzbS9oeXBlcnYuaD4KICNpbmNsdWRlICJoeXBlcnZfdm1idXMuaCIKIAogCkBAIC00MywxNSArNDEsMjggQEAKIAogc3RhdGljIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCBtc2dfZHBjOwogc3RhdGljIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCBldmVudF9kcGM7Ci0KLXVuc2lnbmVkIGludCB2bWJ1c19sb2dsZXZlbCA9IChBTExfTU9EVUxFUyA8PCAxNiB8IElORk9fTFZMKTsKLUVYUE9SVF9TWU1CT0wodm1idXNfbG9nbGV2ZWwpOwotCS8qIChBTExfTU9EVUxFUyA8PCAxNiB8IERFQlVHX0xWTF9FTlRFUkVYSVQpOyAqLwotCS8qICgoKFZNQlVTIHwgVk1CVVNfRFJWKTw8MTYpIHwgREVCVUdfTFZMX0VOVEVSRVhJVCk7ICovCi0KIHN0YXRpYyBzdHJ1Y3QgY29tcGxldGlvbiBwcm9iZV9ldmVudDsKIHN0YXRpYyBpbnQgaXJxOwogCitzdHJ1Y3QgaHZfZGV2aWNlX2luZm8geworCXUzMiBjaG5faWQ7CisJdTMyIGNobl9zdGF0ZTsKKwl1dWlkX2xlIGNobl90eXBlOworCXV1aWRfbGUgY2huX2luc3RhbmNlOworCisJdTMyIG1vbml0b3JfaWQ7CisJdTMyIHNlcnZlcl9tb25pdG9yX3BlbmRpbmc7CisJdTMyIHNlcnZlcl9tb25pdG9yX2xhdGVuY3k7CisJdTMyIHNlcnZlcl9tb25pdG9yX2Nvbm5faWQ7CisJdTMyIGNsaWVudF9tb25pdG9yX3BlbmRpbmc7CisJdTMyIGNsaWVudF9tb25pdG9yX2xhdGVuY3k7CisJdTMyIGNsaWVudF9tb25pdG9yX2Nvbm5faWQ7CisKKwlzdHJ1Y3QgaHZfZGV2X3BvcnRfaW5mbyBpbmJvdW5kOworCXN0cnVjdCBodl9kZXZfcG9ydF9pbmZvIG91dGJvdW5kOworfTsKKworCiBzdGF0aWMgdm9pZCBnZXRfY2hhbm5lbF9pbmZvKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKIAkJCSAgICAgc3RydWN0IGh2X2RldmljZV9pbmZvICppbmZvKQogewpAQCAtNjUsOSArNzYsOSBAQAogCWluZm8tPmNobl9pZCA9IGRlYnVnX2luZm8ucmVsaWQ7CiAJaW5mby0+Y2huX3N0YXRlID0gZGVidWdfaW5mby5zdGF0ZTsKIAltZW1jcHkoJmluZm8tPmNobl90eXBlLCAmZGVidWdfaW5mby5pbnRlcmZhY2V0eXBlLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKKwkgICAgICAgc2l6ZW9mKHV1aWRfbGUpKTsKIAltZW1jcHkoJmluZm8tPmNobl9pbnN0YW5jZSwgJmRlYnVnX2luZm8uaW50ZXJmYWNlX2luc3RhbmNlLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKKwkgICAgICAgc2l6ZW9mKHV1aWRfbGUpKTsKIAogCWluZm8tPm1vbml0b3JfaWQgPSBkZWJ1Z19pbmZvLm1vbml0b3JpZDsKIApAQCAtOTcsNiArMTA4LDE0IEBACiAJCWRlYnVnX2luZm8ub3V0Ym91bmQuYnl0ZXNfYXZhaWxfdG93cml0ZTsKIH0KIAorI2RlZmluZSBWTUJVU19BTElBU19MRU4gKChzaXplb2YoKHN0cnVjdCBodl92bWJ1c19kZXZpY2VfaWQgKikwKS0+Z3VpZCkgKiAyKQorc3RhdGljIHZvaWQgcHJpbnRfYWxpYXNfbmFtZShzdHJ1Y3QgaHZfZGV2aWNlICpodl9kZXYsIGNoYXIgKmFsaWFzX25hbWUpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IFZNQlVTX0FMSUFTX0xFTjsgaSArPSAyKQorCQlzcHJpbnRmKCZhbGlhc19uYW1lW2ldLCAiJTAyeCIsIGh2X2Rldi0+ZGV2X3R5cGUuYltpLzJdKTsKK30KKwogLyoKICAqIHZtYnVzX3Nob3dfZGV2aWNlX2F0dHIgLSBTaG93IHRoZSBkZXZpY2UgYXR0cmlidXRlIGluIHN5c2ZzLgogICoKQEAgLTEwOCw5NyArMTI3LDEwNSBAQAogCQkJCSAgICAgIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgaHZfZGV2aWNlICpodl9kZXYgPSBkZXZpY2VfdG9faHZfZGV2aWNlKGRldik7Ci0Jc3RydWN0IGh2X2RldmljZV9pbmZvIGRldmljZV9pbmZvOworCXN0cnVjdCBodl9kZXZpY2VfaW5mbyAqZGV2aWNlX2luZm87CisJY2hhciBhbGlhc19uYW1lW1ZNQlVTX0FMSUFTX0xFTiArIDFdOworCWludCByZXQgPSAwOwogCi0JbWVtc2V0KCZkZXZpY2VfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBodl9kZXZpY2VfaW5mbykpOworCWRldmljZV9pbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGh2X2RldmljZV9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXZpY2VfaW5mbykKKwkJcmV0dXJuIHJldDsKIAotCWdldF9jaGFubmVsX2luZm8oaHZfZGV2LCAmZGV2aWNlX2luZm8pOworCWdldF9jaGFubmVsX2luZm8oaHZfZGV2LCBkZXZpY2VfaW5mbyk7CiAKIAlpZiAoIXN0cmNtcChkZXZfYXR0ci0+YXR0ci5uYW1lLCAiY2xhc3NfaWQiKSkgewotCQlyZXR1cm4gc3ByaW50ZihidWYsICJ7JTAyeCUwMnglMDJ4JTAyeC0lMDJ4JTAyeC0lMDJ4JTAyeC0iCisJCXJldCA9IHNwcmludGYoYnVmLCAieyUwMnglMDJ4JTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMngtIgogCQkJICAgICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeH1cbiIsCi0JCQkgICAgICAgZGV2aWNlX2luZm8uY2huX3R5cGUuZGF0YVszXSwKLQkJCSAgICAgICBkZXZpY2VfaW5mby5jaG5fdHlwZS5kYXRhWzJdLAotCQkJICAgICAgIGRldmljZV9pbmZvLmNobl90eXBlLmRhdGFbMV0sCi0JCQkgICAgICAgZGV2aWNlX2luZm8uY2huX3R5cGUuZGF0YVswXSwKLQkJCSAgICAgICBkZXZpY2VfaW5mby5jaG5fdHlwZS5kYXRhWzVdLAotCQkJICAgICAgIGRldmljZV9pbmZvLmNobl90eXBlLmRhdGFbNF0sCi0JCQkgICAgICAgZGV2aWNlX2luZm8uY2huX3R5cGUuZGF0YVs3XSwKLQkJCSAgICAgICBkZXZpY2VfaW5mby5jaG5fdHlwZS5kYXRhWzZdLAotCQkJICAgICAgIGRldmljZV9pbmZvLmNobl90eXBlLmRhdGFbOF0sCi0JCQkgICAgICAgZGV2aWNlX2luZm8uY2huX3R5cGUuZGF0YVs5XSwKLQkJCSAgICAgICBkZXZpY2VfaW5mby5jaG5fdHlwZS5kYXRhWzEwXSwKLQkJCSAgICAgICBkZXZpY2VfaW5mby5jaG5fdHlwZS5kYXRhWzExXSwKLQkJCSAgICAgICBkZXZpY2VfaW5mby5jaG5fdHlwZS5kYXRhWzEyXSwKLQkJCSAgICAgICBkZXZpY2VfaW5mby5jaG5fdHlwZS5kYXRhWzEzXSwKLQkJCSAgICAgICBkZXZpY2VfaW5mby5jaG5fdHlwZS5kYXRhWzE0XSwKLQkJCSAgICAgICBkZXZpY2VfaW5mby5jaG5fdHlwZS5kYXRhWzE1XSk7CisJCQkgICAgICAgZGV2aWNlX2luZm8tPmNobl90eXBlLmJbM10sCisJCQkgICAgICAgZGV2aWNlX2luZm8tPmNobl90eXBlLmJbMl0sCisJCQkgICAgICAgZGV2aWNlX2luZm8tPmNobl90eXBlLmJbMV0sCisJCQkgICAgICAgZGV2aWNlX2luZm8tPmNobl90eXBlLmJbMF0sCisJCQkgICAgICAgZGV2aWNlX2luZm8tPmNobl90eXBlLmJbNV0sCisJCQkgICAgICAgZGV2aWNlX2luZm8tPmNobl90eXBlLmJbNF0sCisJCQkgICAgICAgZGV2aWNlX2luZm8tPmNobl90eXBlLmJbN10sCisJCQkgICAgICAgZGV2aWNlX2luZm8tPmNobl90eXBlLmJbNl0sCisJCQkgICAgICAgZGV2aWNlX2luZm8tPmNobl90eXBlLmJbOF0sCisJCQkgICAgICAgZGV2aWNlX2luZm8tPmNobl90eXBlLmJbOV0sCisJCQkgICAgICAgZGV2aWNlX2luZm8tPmNobl90eXBlLmJbMTBdLAorCQkJICAgICAgIGRldmljZV9pbmZvLT5jaG5fdHlwZS5iWzExXSwKKwkJCSAgICAgICBkZXZpY2VfaW5mby0+Y2huX3R5cGUuYlsxMl0sCisJCQkgICAgICAgZGV2aWNlX2luZm8tPmNobl90eXBlLmJbMTNdLAorCQkJICAgICAgIGRldmljZV9pbmZvLT5jaG5fdHlwZS5iWzE0XSwKKwkJCSAgICAgICBkZXZpY2VfaW5mby0+Y2huX3R5cGUuYlsxNV0pOwogCX0gZWxzZSBpZiAoIXN0cmNtcChkZXZfYXR0ci0+YXR0ci5uYW1lLCAiZGV2aWNlX2lkIikpIHsKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAieyUwMnglMDJ4JTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMngtIgorCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgInslMDJ4JTAyeCUwMnglMDJ4LSUwMnglMDJ4LSUwMnglMDJ4LSIKIAkJCSAgICAgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnh9XG4iLAotCQkJICAgICAgIGRldmljZV9pbmZvLmNobl9pbnN0YW5jZS5kYXRhWzNdLAotCQkJICAgICAgIGRldmljZV9pbmZvLmNobl9pbnN0YW5jZS5kYXRhWzJdLAotCQkJICAgICAgIGRldmljZV9pbmZvLmNobl9pbnN0YW5jZS5kYXRhWzFdLAotCQkJICAgICAgIGRldmljZV9pbmZvLmNobl9pbnN0YW5jZS5kYXRhWzBdLAotCQkJICAgICAgIGRldmljZV9pbmZvLmNobl9pbnN0YW5jZS5kYXRhWzVdLAotCQkJICAgICAgIGRldmljZV9pbmZvLmNobl9pbnN0YW5jZS5kYXRhWzRdLAotCQkJICAgICAgIGRldmljZV9pbmZvLmNobl9pbnN0YW5jZS5kYXRhWzddLAotCQkJICAgICAgIGRldmljZV9pbmZvLmNobl9pbnN0YW5jZS5kYXRhWzZdLAotCQkJICAgICAgIGRldmljZV9pbmZvLmNobl9pbnN0YW5jZS5kYXRhWzhdLAotCQkJICAgICAgIGRldmljZV9pbmZvLmNobl9pbnN0YW5jZS5kYXRhWzldLAotCQkJICAgICAgIGRldmljZV9pbmZvLmNobl9pbnN0YW5jZS5kYXRhWzEwXSwKLQkJCSAgICAgICBkZXZpY2VfaW5mby5jaG5faW5zdGFuY2UuZGF0YVsxMV0sCi0JCQkgICAgICAgZGV2aWNlX2luZm8uY2huX2luc3RhbmNlLmRhdGFbMTJdLAotCQkJICAgICAgIGRldmljZV9pbmZvLmNobl9pbnN0YW5jZS5kYXRhWzEzXSwKLQkJCSAgICAgICBkZXZpY2VfaW5mby5jaG5faW5zdGFuY2UuZGF0YVsxNF0sCi0JCQkgICAgICAgZGV2aWNlX2luZm8uY2huX2luc3RhbmNlLmRhdGFbMTVdKTsKKwkJCSAgICAgICBkZXZpY2VfaW5mby0+Y2huX2luc3RhbmNlLmJbM10sCisJCQkgICAgICAgZGV2aWNlX2luZm8tPmNobl9pbnN0YW5jZS5iWzJdLAorCQkJICAgICAgIGRldmljZV9pbmZvLT5jaG5faW5zdGFuY2UuYlsxXSwKKwkJCSAgICAgICBkZXZpY2VfaW5mby0+Y2huX2luc3RhbmNlLmJbMF0sCisJCQkgICAgICAgZGV2aWNlX2luZm8tPmNobl9pbnN0YW5jZS5iWzVdLAorCQkJICAgICAgIGRldmljZV9pbmZvLT5jaG5faW5zdGFuY2UuYls0XSwKKwkJCSAgICAgICBkZXZpY2VfaW5mby0+Y2huX2luc3RhbmNlLmJbN10sCisJCQkgICAgICAgZGV2aWNlX2luZm8tPmNobl9pbnN0YW5jZS5iWzZdLAorCQkJICAgICAgIGRldmljZV9pbmZvLT5jaG5faW5zdGFuY2UuYls4XSwKKwkJCSAgICAgICBkZXZpY2VfaW5mby0+Y2huX2luc3RhbmNlLmJbOV0sCisJCQkgICAgICAgZGV2aWNlX2luZm8tPmNobl9pbnN0YW5jZS5iWzEwXSwKKwkJCSAgICAgICBkZXZpY2VfaW5mby0+Y2huX2luc3RhbmNlLmJbMTFdLAorCQkJICAgICAgIGRldmljZV9pbmZvLT5jaG5faW5zdGFuY2UuYlsxMl0sCisJCQkgICAgICAgZGV2aWNlX2luZm8tPmNobl9pbnN0YW5jZS5iWzEzXSwKKwkJCSAgICAgICBkZXZpY2VfaW5mby0+Y2huX2luc3RhbmNlLmJbMTRdLAorCQkJICAgICAgIGRldmljZV9pbmZvLT5jaG5faW5zdGFuY2UuYlsxNV0pOworCX0gZWxzZSBpZiAoIXN0cmNtcChkZXZfYXR0ci0+YXR0ci5uYW1lLCAibW9kYWxpYXMiKSkgeworCQlwcmludF9hbGlhc19uYW1lKGh2X2RldiwgYWxpYXNfbmFtZSk7CisJCXJldCA9IHNwcmludGYoYnVmLCAidm1idXM6JXNcbiIsIGFsaWFzX25hbWUpOwogCX0gZWxzZSBpZiAoIXN0cmNtcChkZXZfYXR0ci0+YXR0ci5uYW1lLCAic3RhdGUiKSkgewotCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGV2aWNlX2luZm8uY2huX3N0YXRlKTsKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgZGV2aWNlX2luZm8tPmNobl9zdGF0ZSk7CiAJfSBlbHNlIGlmICghc3RyY21wKGRldl9hdHRyLT5hdHRyLm5hbWUsICJpZCIpKSB7Ci0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkZXZpY2VfaW5mby5jaG5faWQpOworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkZXZpY2VfaW5mby0+Y2huX2lkKTsKIAl9IGVsc2UgaWYgKCFzdHJjbXAoZGV2X2F0dHItPmF0dHIubmFtZSwgIm91dF9pbnRyX21hc2siKSkgewotCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGV2aWNlX2luZm8ub3V0Ym91bmQuaW50X21hc2spOworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkZXZpY2VfaW5mby0+b3V0Ym91bmQuaW50X21hc2spOwogCX0gZWxzZSBpZiAoIXN0cmNtcChkZXZfYXR0ci0+YXR0ci5uYW1lLCAib3V0X3JlYWRfaW5kZXgiKSkgewotCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGV2aWNlX2luZm8ub3V0Ym91bmQucmVhZF9pZHgpOworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkZXZpY2VfaW5mby0+b3V0Ym91bmQucmVhZF9pZHgpOwogCX0gZWxzZSBpZiAoIXN0cmNtcChkZXZfYXR0ci0+YXR0ci5uYW1lLCAib3V0X3dyaXRlX2luZGV4IikpIHsKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRldmljZV9pbmZvLm91dGJvdW5kLndyaXRlX2lkeCk7CisJCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIGRldmljZV9pbmZvLT5vdXRib3VuZC53cml0ZV9pZHgpOwogCX0gZWxzZSBpZiAoIXN0cmNtcChkZXZfYXR0ci0+YXR0ci5uYW1lLCAib3V0X3JlYWRfYnl0ZXNfYXZhaWwiKSkgewotCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKLQkJCSAgICAgICBkZXZpY2VfaW5mby5vdXRib3VuZC5ieXRlc19hdmFpbF90b3JlYWQpOworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAorCQkJICAgICAgIGRldmljZV9pbmZvLT5vdXRib3VuZC5ieXRlc19hdmFpbF90b3JlYWQpOwogCX0gZWxzZSBpZiAoIXN0cmNtcChkZXZfYXR0ci0+YXR0ci5uYW1lLCAib3V0X3dyaXRlX2J5dGVzX2F2YWlsIikpIHsKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCi0JCQkgICAgICAgZGV2aWNlX2luZm8ub3V0Ym91bmQuYnl0ZXNfYXZhaWxfdG93cml0ZSk7CisJCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsCisJCQkgICAgICAgZGV2aWNlX2luZm8tPm91dGJvdW5kLmJ5dGVzX2F2YWlsX3Rvd3JpdGUpOwogCX0gZWxzZSBpZiAoIXN0cmNtcChkZXZfYXR0ci0+YXR0ci5uYW1lLCAiaW5faW50cl9tYXNrIikpIHsKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRldmljZV9pbmZvLmluYm91bmQuaW50X21hc2spOworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkZXZpY2VfaW5mby0+aW5ib3VuZC5pbnRfbWFzayk7CiAJfSBlbHNlIGlmICghc3RyY21wKGRldl9hdHRyLT5hdHRyLm5hbWUsICJpbl9yZWFkX2luZGV4IikpIHsKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRldmljZV9pbmZvLmluYm91bmQucmVhZF9pZHgpOworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkZXZpY2VfaW5mby0+aW5ib3VuZC5yZWFkX2lkeCk7CiAJfSBlbHNlIGlmICghc3RyY21wKGRldl9hdHRyLT5hdHRyLm5hbWUsICJpbl93cml0ZV9pbmRleCIpKSB7Ci0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkZXZpY2VfaW5mby5pbmJvdW5kLndyaXRlX2lkeCk7CisJCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsIGRldmljZV9pbmZvLT5pbmJvdW5kLndyaXRlX2lkeCk7CiAJfSBlbHNlIGlmICghc3RyY21wKGRldl9hdHRyLT5hdHRyLm5hbWUsICJpbl9yZWFkX2J5dGVzX2F2YWlsIikpIHsKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCi0JCQkgICAgICAgZGV2aWNlX2luZm8uaW5ib3VuZC5ieXRlc19hdmFpbF90b3JlYWQpOworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAorCQkJICAgICAgIGRldmljZV9pbmZvLT5pbmJvdW5kLmJ5dGVzX2F2YWlsX3RvcmVhZCk7CiAJfSBlbHNlIGlmICghc3RyY21wKGRldl9hdHRyLT5hdHRyLm5hbWUsICJpbl93cml0ZV9ieXRlc19hdmFpbCIpKSB7Ci0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAotCQkJICAgICAgIGRldmljZV9pbmZvLmluYm91bmQuYnl0ZXNfYXZhaWxfdG93cml0ZSk7CisJCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsCisJCQkgICAgICAgZGV2aWNlX2luZm8tPmluYm91bmQuYnl0ZXNfYXZhaWxfdG93cml0ZSk7CiAJfSBlbHNlIGlmICghc3RyY21wKGRldl9hdHRyLT5hdHRyLm5hbWUsICJtb25pdG9yX2lkIikpIHsKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRldmljZV9pbmZvLm1vbml0b3JfaWQpOworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkZXZpY2VfaW5mby0+bW9uaXRvcl9pZCk7CiAJfSBlbHNlIGlmICghc3RyY21wKGRldl9hdHRyLT5hdHRyLm5hbWUsICJzZXJ2ZXJfbW9uaXRvcl9wZW5kaW5nIikpIHsKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRldmljZV9pbmZvLnNlcnZlcl9tb25pdG9yX3BlbmRpbmcpOworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkZXZpY2VfaW5mby0+c2VydmVyX21vbml0b3JfcGVuZGluZyk7CiAJfSBlbHNlIGlmICghc3RyY21wKGRldl9hdHRyLT5hdHRyLm5hbWUsICJzZXJ2ZXJfbW9uaXRvcl9sYXRlbmN5IikpIHsKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRldmljZV9pbmZvLnNlcnZlcl9tb25pdG9yX2xhdGVuY3kpOworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkZXZpY2VfaW5mby0+c2VydmVyX21vbml0b3JfbGF0ZW5jeSk7CiAJfSBlbHNlIGlmICghc3RyY21wKGRldl9hdHRyLT5hdHRyLm5hbWUsICJzZXJ2ZXJfbW9uaXRvcl9jb25uX2lkIikpIHsKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCi0JCQkgICAgICAgZGV2aWNlX2luZm8uc2VydmVyX21vbml0b3JfY29ubl9pZCk7CisJCXJldCA9IHNwcmludGYoYnVmLCAiJWRcbiIsCisJCQkgICAgICAgZGV2aWNlX2luZm8tPnNlcnZlcl9tb25pdG9yX2Nvbm5faWQpOwogCX0gZWxzZSBpZiAoIXN0cmNtcChkZXZfYXR0ci0+YXR0ci5uYW1lLCAiY2xpZW50X21vbml0b3JfcGVuZGluZyIpKSB7Ci0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkZXZpY2VfaW5mby5jbGllbnRfbW9uaXRvcl9wZW5kaW5nKTsKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgZGV2aWNlX2luZm8tPmNsaWVudF9tb25pdG9yX3BlbmRpbmcpOwogCX0gZWxzZSBpZiAoIXN0cmNtcChkZXZfYXR0ci0+YXR0ci5uYW1lLCAiY2xpZW50X21vbml0b3JfbGF0ZW5jeSIpKSB7Ci0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkZXZpY2VfaW5mby5jbGllbnRfbW9uaXRvcl9sYXRlbmN5KTsKKwkJcmV0ID0gc3ByaW50ZihidWYsICIlZFxuIiwgZGV2aWNlX2luZm8tPmNsaWVudF9tb25pdG9yX2xhdGVuY3kpOwogCX0gZWxzZSBpZiAoIXN0cmNtcChkZXZfYXR0ci0+YXR0ci5uYW1lLCAiY2xpZW50X21vbml0b3JfY29ubl9pZCIpKSB7Ci0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAotCQkJICAgICAgIGRldmljZV9pbmZvLmNsaWVudF9tb25pdG9yX2Nvbm5faWQpOwotCX0gZWxzZSB7Ci0JCXJldHVybiAwOworCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAorCQkJICAgICAgIGRldmljZV9pbmZvLT5jbGllbnRfbW9uaXRvcl9jb25uX2lkKTsKIAl9CisKKwlrZnJlZShkZXZpY2VfaW5mbyk7CisJcmV0dXJuIHJldDsKIH0KIAogLyogU2V0IHVwIHBlciBkZXZpY2UgYXR0cmlidXRlcyBpbiAvc3lzL2J1cy92bWJ1cy9kZXZpY2VzLzxidXMgZGV2aWNlPiAqLwpAQCAtMjA4LDYgKzIzNSw3IEBACiAJX19BVFRSKGNsYXNzX2lkLCBTX0lSVUdPLCB2bWJ1c19zaG93X2RldmljZV9hdHRyLCBOVUxMKSwKIAlfX0FUVFIoZGV2aWNlX2lkLCBTX0lSVUdPLCB2bWJ1c19zaG93X2RldmljZV9hdHRyLCBOVUxMKSwKIAlfX0FUVFIobW9uaXRvcl9pZCwgU19JUlVHTywgdm1idXNfc2hvd19kZXZpY2VfYXR0ciwgTlVMTCksCisJX19BVFRSKG1vZGFsaWFzLCBTX0lSVUdPLCB2bWJ1c19zaG93X2RldmljZV9hdHRyLCBOVUxMKSwKIAogCV9fQVRUUihzZXJ2ZXJfbW9uaXRvcl9wZW5kaW5nLCBTX0lSVUdPLCB2bWJ1c19zaG93X2RldmljZV9hdHRyLCBOVUxMKSwKIAlfX0FUVFIoc2VydmVyX21vbml0b3JfbGF0ZW5jeSwgU19JUlVHTywgdm1idXNfc2hvd19kZXZpY2VfYXR0ciwgTlVMTCksCkBAIC0yMzgsNzYgKzI2Niw2MCBAQAogICogVGhpcyByb3V0aW5lIGlzIGludm9rZWQgd2hlbiBhIGRldmljZSBpcyBhZGRlZCBvciByZW1vdmVkIG9uIHRoZSB2bWJ1cyB0bwogICogZ2VuZXJhdGUgYSB1ZXZlbnQgdG8gdWRldiBpbiB0aGUgdXNlcnNwYWNlLiBUaGUgdWRldiB3aWxsIHRoZW4gbG9vayBhdCBpdHMKICAqIHJ1bGUgYW5kIHRoZSB1ZXZlbnQgZ2VuZXJhdGVkIGhlcmUgdG8gbG9hZCB0aGUgYXBwcm9wcmlhdGUgZHJpdmVyCisgKgorICogVGhlIGFsaWFzIHN0cmluZyB3aWxsIGJlIG9mIHRoZSBmb3JtIHZtYnVzOmd1aWQgd2hlcmUgZ3VpZCBpcyB0aGUgc3RyaW5nCisgKiByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGV2aWNlIGd1aWQgKGVhY2ggYnl0ZSBvZiB0aGUgZ3VpZCB3aWxsIGJlCisgKiByZXByZXNlbnRlZCB3aXRoIHR3byBoZXggY2hhcmFjdGVycy4KICAqLwogc3RhdGljIGludCB2bWJ1c191ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2aWNlLCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCiB7CiAJc3RydWN0IGh2X2RldmljZSAqZGV2ID0gZGV2aWNlX3RvX2h2X2RldmljZShkZXZpY2UpOwogCWludCByZXQ7CisJY2hhciBhbGlhc19uYW1lW1ZNQlVTX0FMSUFTX0xFTiArIDFdOwogCi0JcmV0ID0gYWRkX3VldmVudF92YXIoZW52LCAiVk1CVVNfREVWSUNFX0NMQVNTX0dVSUQ9eyIKLQkJCSAgICAgIiUwMnglMDJ4JTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMngtIgotCQkJICAgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnh9IiwKLQkJCSAgICAgZGV2LT5kZXZfdHlwZS5kYXRhWzNdLAotCQkJICAgICBkZXYtPmRldl90eXBlLmRhdGFbMl0sCi0JCQkgICAgIGRldi0+ZGV2X3R5cGUuZGF0YVsxXSwKLQkJCSAgICAgZGV2LT5kZXZfdHlwZS5kYXRhWzBdLAotCQkJICAgICBkZXYtPmRldl90eXBlLmRhdGFbNV0sCi0JCQkgICAgIGRldi0+ZGV2X3R5cGUuZGF0YVs0XSwKLQkJCSAgICAgZGV2LT5kZXZfdHlwZS5kYXRhWzddLAotCQkJICAgICBkZXYtPmRldl90eXBlLmRhdGFbNl0sCi0JCQkgICAgIGRldi0+ZGV2X3R5cGUuZGF0YVs4XSwKLQkJCSAgICAgZGV2LT5kZXZfdHlwZS5kYXRhWzldLAotCQkJICAgICBkZXYtPmRldl90eXBlLmRhdGFbMTBdLAotCQkJICAgICBkZXYtPmRldl90eXBlLmRhdGFbMTFdLAotCQkJICAgICBkZXYtPmRldl90eXBlLmRhdGFbMTJdLAotCQkJICAgICBkZXYtPmRldl90eXBlLmRhdGFbMTNdLAotCQkJICAgICBkZXYtPmRldl90eXBlLmRhdGFbMTRdLAotCQkJICAgICBkZXYtPmRldl90eXBlLmRhdGFbMTVdKTsKLQotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBhZGRfdWV2ZW50X3ZhcihlbnYsICJWTUJVU19ERVZJQ0VfREVWSUNFX0dVSUQ9eyIKLQkJCSAgICAgIiUwMnglMDJ4JTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMngtIgotCQkJICAgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnh9IiwKLQkJCSAgICAgZGV2LT5kZXZfaW5zdGFuY2UuZGF0YVszXSwKLQkJCSAgICAgZGV2LT5kZXZfaW5zdGFuY2UuZGF0YVsyXSwKLQkJCSAgICAgZGV2LT5kZXZfaW5zdGFuY2UuZGF0YVsxXSwKLQkJCSAgICAgZGV2LT5kZXZfaW5zdGFuY2UuZGF0YVswXSwKLQkJCSAgICAgZGV2LT5kZXZfaW5zdGFuY2UuZGF0YVs1XSwKLQkJCSAgICAgZGV2LT5kZXZfaW5zdGFuY2UuZGF0YVs0XSwKLQkJCSAgICAgZGV2LT5kZXZfaW5zdGFuY2UuZGF0YVs3XSwKLQkJCSAgICAgZGV2LT5kZXZfaW5zdGFuY2UuZGF0YVs2XSwKLQkJCSAgICAgZGV2LT5kZXZfaW5zdGFuY2UuZGF0YVs4XSwKLQkJCSAgICAgZGV2LT5kZXZfaW5zdGFuY2UuZGF0YVs5XSwKLQkJCSAgICAgZGV2LT5kZXZfaW5zdGFuY2UuZGF0YVsxMF0sCi0JCQkgICAgIGRldi0+ZGV2X2luc3RhbmNlLmRhdGFbMTFdLAotCQkJICAgICBkZXYtPmRldl9pbnN0YW5jZS5kYXRhWzEyXSwKLQkJCSAgICAgZGV2LT5kZXZfaW5zdGFuY2UuZGF0YVsxM10sCi0JCQkgICAgIGRldi0+ZGV2X2luc3RhbmNlLmRhdGFbMTRdLAotCQkJICAgICBkZXYtPmRldl9pbnN0YW5jZS5kYXRhWzE1XSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiAwOworCXByaW50X2FsaWFzX25hbWUoZGV2LCBhbGlhc19uYW1lKTsKKwlyZXQgPSBhZGRfdWV2ZW50X3ZhcihlbnYsICJNT0RBTElBUz12bWJ1czolcyIsIGFsaWFzX25hbWUpOworCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB1dWlkX2xlIG51bGxfZ3VpZDsKKworc3RhdGljIGlubGluZSBib29sIGlzX251bGxfZ3VpZChjb25zdCBfX3U4ICpndWlkKQoreworCWlmIChtZW1jbXAoZ3VpZCwgJm51bGxfZ3VpZCwgc2l6ZW9mKHV1aWRfbGUpKSkKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworfQorCisvKgorICogUmV0dXJuIGEgbWF0Y2hpbmcgaHZfdm1idXNfZGV2aWNlX2lkIHBvaW50ZXIuCisgKiBJZiB0aGVyZSBpcyBubyBtYXRjaCwgcmV0dXJuIE5VTEwuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHZfdm1idXNfZGV2aWNlX2lkICpodl92bWJ1c19nZXRfaWQoCisJCQkJCWNvbnN0IHN0cnVjdCBodl92bWJ1c19kZXZpY2VfaWQgKmlkLAorCQkJCQlfX3U4ICpndWlkKQoreworCWZvciAoOyAhaXNfbnVsbF9ndWlkKGlkLT5ndWlkKTsgaWQrKykKKwkJaWYgKCFtZW1jbXAoJmlkLT5ndWlkLCBndWlkLCBzaXplb2YodXVpZF9sZSkpKQorCQkJcmV0dXJuIGlkOworCisJcmV0dXJuIE5VTEw7Cit9CisKKwogCiAvKgogICogdm1idXNfbWF0Y2ggLSBBdHRlbXB0IHRvIG1hdGNoIHRoZSBzcGVjaWZpZWQgZGV2aWNlIHRvIHRoZSBzcGVjaWZpZWQgZHJpdmVyCiAgKi8KIHN0YXRpYyBpbnQgdm1idXNfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2aWNlLCBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJpdmVyKQogewotCWludCBtYXRjaCA9IDA7CiAJc3RydWN0IGh2X2RyaXZlciAqZHJ2ID0gZHJ2X3RvX2h2X2Rydihkcml2ZXIpOwogCXN0cnVjdCBodl9kZXZpY2UgKmh2X2RldiA9IGRldmljZV90b19odl9kZXZpY2UoZGV2aWNlKTsKIAotCS8qIFdlIGZvdW5kIG91ciBkcml2ZXIgPyAqLwotCWlmIChtZW1jbXAoJmh2X2Rldi0+ZGV2X3R5cGUsICZkcnYtPmRldl90eXBlLAotCQkgICBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKSA9PSAwKQotCQltYXRjaCA9IDE7CisJaWYgKGh2X3ZtYnVzX2dldF9pZChkcnYtPmlkX3RhYmxlLCBodl9kZXYtPmRldl90eXBlLmIpKQorCQlyZXR1cm4gMTsKIAotCXJldHVybiBtYXRjaDsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTMxOSw5ICszMzEsMTEgQEAKIAlzdHJ1Y3QgaHZfZHJpdmVyICpkcnYgPQogCQkJZHJ2X3RvX2h2X2RydihjaGlsZF9kZXZpY2UtPmRyaXZlcik7CiAJc3RydWN0IGh2X2RldmljZSAqZGV2ID0gZGV2aWNlX3RvX2h2X2RldmljZShjaGlsZF9kZXZpY2UpOworCWNvbnN0IHN0cnVjdCBodl92bWJ1c19kZXZpY2VfaWQgKmRldl9pZDsKIAorCWRldl9pZCA9IGh2X3ZtYnVzX2dldF9pZChkcnYtPmlkX3RhYmxlLCBkZXYtPmRldl90eXBlLmIpOwogCWlmIChkcnYtPnByb2JlKSB7Ci0JCXJldCA9IGRydi0+cHJvYmUoZGV2KTsKKwkJcmV0ID0gZHJ2LT5wcm9iZShkZXYsIGRldl9pZCk7CiAJCWlmIChyZXQgIT0gMCkKIAkJCXByX2VycigicHJvYmUgZmFpbGVkIGZvciBkZXZpY2UgJXMgKCVkKVxuIiwKIAkJCSAgICAgICBkZXZfbmFtZShjaGlsZF9kZXZpY2UpLCByZXQpOwpAQCAtMzM5LDIyICszNTMsMTQgQEAKICAqLwogc3RhdGljIGludCB2bWJ1c19yZW1vdmUoc3RydWN0IGRldmljZSAqY2hpbGRfZGV2aWNlKQogewotCWludCByZXQ7Ci0Jc3RydWN0IGh2X2RyaXZlciAqZHJ2OwotCisJc3RydWN0IGh2X2RyaXZlciAqZHJ2ID0gZHJ2X3RvX2h2X2RydihjaGlsZF9kZXZpY2UtPmRyaXZlcik7CiAJc3RydWN0IGh2X2RldmljZSAqZGV2ID0gZGV2aWNlX3RvX2h2X2RldmljZShjaGlsZF9kZXZpY2UpOwogCi0JaWYgKGNoaWxkX2RldmljZS0+ZHJpdmVyKSB7Ci0JCWRydiA9IGRydl90b19odl9kcnYoY2hpbGRfZGV2aWNlLT5kcml2ZXIpOwotCi0JCWlmIChkcnYtPnJlbW92ZSkgewotCQkJcmV0ID0gZHJ2LT5yZW1vdmUoZGV2KTsKLQkJfSBlbHNlIHsKLQkJCXByX2VycigicmVtb3ZlIG5vdCBzZXQgZm9yIGRyaXZlciAlc1xuIiwKLQkJCQlkZXZfbmFtZShjaGlsZF9kZXZpY2UpKTsKLQkJCXJldCA9IC1FTk9ERVY7Ci0JCX0KLQl9CisJaWYgKGRydi0+cmVtb3ZlKQorCQlkcnYtPnJlbW92ZShkZXYpOworCWVsc2UKKwkJcHJfZXJyKCJyZW1vdmUgbm90IHNldCBmb3IgZHJpdmVyICVzXG4iLAorCQkJZGV2X25hbWUoY2hpbGRfZGV2aWNlKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQyMiw5ICs0MjgsNiBAQAogCWtmcmVlKGN0eCk7CiB9CiAKLS8qCi0gKiB2bWJ1c19vbl9tc2dfZHBjIC0gRFBDIHJvdXRpbmUgdG8gaGFuZGxlIG1lc3NhZ2VzIGZyb20gdGhlIGh5cGVydmlzaW9yCi0gKi8KIHN0YXRpYyB2b2lkIHZtYnVzX29uX21zZ19kcGModW5zaWduZWQgbG9uZyBkYXRhKQogewogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CkBAIC00NjgsNTMgKzQ3MSw0MiBAQAogCX0KIH0KIAotLyoKLSAqIHZtYnVzX29uX2lzciAtIElTUiByb3V0aW5lCi0gKi8KLXN0YXRpYyBpbnQgdm1idXNfb25faXNyKHZvaWQpCitzdGF0aWMgaXJxcmV0dXJuX3Qgdm1idXNfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKLQlpbnQgcmV0ID0gMDsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXZvaWQgKnBhZ2VfYWRkcjsKIAlzdHJ1Y3QgaHZfbWVzc2FnZSAqbXNnOwogCXVuaW9uIGh2X3N5bmljX2V2ZW50X2ZsYWdzICpldmVudDsKKwlib29sIGhhbmRsZWQgPSBmYWxzZTsKIAotCXBhZ2VfYWRkciA9IGh2X2NvbnRleHQuc3luaWNfbWVzc2FnZV9wYWdlW2NwdV07Ci0JbXNnID0gKHN0cnVjdCBodl9tZXNzYWdlICopcGFnZV9hZGRyICsgVk1CVVNfTUVTU0FHRV9TSU5UOwotCi0JLyogQ2hlY2sgaWYgdGhlcmUgYXJlIGFjdHVhbCBtc2dzIHRvIGJlIHByb2Nlc3MgKi8KLQlpZiAobXNnLT5oZWFkZXIubWVzc2FnZV90eXBlICE9IEhWTVNHX05PTkUpCi0JCXJldCB8PSAweDE7CisJLyoKKwkgKiBDaGVjayBmb3IgZXZlbnRzIGJlZm9yZSBjaGVja2luZyBmb3IgbWVzc2FnZXMuIFRoaXMgaXMgdGhlIG9yZGVyCisJICogaW4gd2hpY2ggZXZlbnRzIGFuZCBtZXNzYWdlcyBhcmUgY2hlY2tlZCBpbiBXaW5kb3dzIGd1ZXN0cyBvbgorCSAqIEh5cGVyLVYsIGFuZCB0aGUgV2luZG93cyB0ZWFtIHN1Z2dlc3RlZCB3ZSBkbyB0aGUgc2FtZS4KKwkgKi8KIAogCXBhZ2VfYWRkciA9IGh2X2NvbnRleHQuc3luaWNfZXZlbnRfcGFnZVtjcHVdOwogCWV2ZW50ID0gKHVuaW9uIGh2X3N5bmljX2V2ZW50X2ZsYWdzICopcGFnZV9hZGRyICsgVk1CVVNfTUVTU0FHRV9TSU5UOwogCiAJLyogU2luY2Ugd2UgYXJlIGEgY2hpbGQsIHdlIG9ubHkgbmVlZCB0byBjaGVjayBiaXQgMCAqLwotCWlmIChzeW5jX3Rlc3RfYW5kX2NsZWFyX2JpdCgwLCAodW5zaWduZWQgbG9uZyAqKSAmZXZlbnQtPmZsYWdzMzJbMF0pKQotCQlyZXQgfD0gMHgyOwotCi0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgdm1idXNfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gdm1idXNfb25faXNyKCk7Ci0KLQkvKiBTY2hlZHVsZXMgYSBkcGMgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKHJldCA+IDApIHsKLQkJaWYgKHRlc3RfYml0KDAsICh1bnNpZ25lZCBsb25nICopJnJldCkpCi0JCQl0YXNrbGV0X3NjaGVkdWxlKCZtc2dfZHBjKTsKLQotCQlpZiAodGVzdF9iaXQoMSwgKHVuc2lnbmVkIGxvbmcgKikmcmV0KSkKLQkJCXRhc2tsZXRfc2NoZWR1bGUoJmV2ZW50X2RwYyk7Ci0KLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCX0gZWxzZSB7Ci0JCXJldHVybiBJUlFfTk9ORTsKKwlpZiAoc3luY190ZXN0X2FuZF9jbGVhcl9iaXQoMCwgKHVuc2lnbmVkIGxvbmcgKikgJmV2ZW50LT5mbGFnczMyWzBdKSkgeworCQloYW5kbGVkID0gdHJ1ZTsKKwkJdGFza2xldF9zY2hlZHVsZSgmZXZlbnRfZHBjKTsKIAl9CisKKwlwYWdlX2FkZHIgPSBodl9jb250ZXh0LnN5bmljX21lc3NhZ2VfcGFnZVtjcHVdOworCW1zZyA9IChzdHJ1Y3QgaHZfbWVzc2FnZSAqKXBhZ2VfYWRkciArIFZNQlVTX01FU1NBR0VfU0lOVDsKKworCS8qIENoZWNrIGlmIHRoZXJlIGFyZSBhY3R1YWwgbXNncyB0byBiZSBwcm9jZXNzZWQgKi8KKwlpZiAobXNnLT5oZWFkZXIubWVzc2FnZV90eXBlICE9IEhWTVNHX05PTkUpIHsKKwkJaGFuZGxlZCA9IHRydWU7CisJCXRhc2tsZXRfc2NoZWR1bGUoJm1zZ19kcGMpOworCX0KKworCWlmIChoYW5kbGVkKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJZWxzZQorCQlyZXR1cm4gSVJRX05PTkU7CiB9CiAKIC8qCkBAIC01MzgsMjYgKzUzMCwyMCBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCS8qIEluaXRpYWxpemUgdGhlIGJ1cyBjb250ZXh0ICovCiAJdGFza2xldF9pbml0KCZtc2dfZHBjLCB2bWJ1c19vbl9tc2dfZHBjLCAwKTsKIAl0YXNrbGV0X2luaXQoJmV2ZW50X2RwYywgdm1idXNfb25fZXZlbnQsIDApOwogCi0JLyogTm93LCByZWdpc3RlciB0aGUgYnVzICB3aXRoIExETSAqLwogCXJldCA9IGJ1c19yZWdpc3RlcigmaHZfYnVzKTsKIAlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycl9jbGVhbnVwOwogCi0JLyogR2V0IHRoZSBpbnRlcnJ1cHQgcmVzb3VyY2UgKi8KIAlyZXQgPSByZXF1ZXN0X2lycShpcnEsIHZtYnVzX2lzciwgSVJRRl9TQU1QTEVfUkFORE9NLAogCQkJZHJpdmVyX25hbWUsIGh2X2FjcGlfZGV2KTsKIAogCWlmIChyZXQgIT0gMCkgewogCQlwcl9lcnIoIlVuYWJsZSB0byByZXF1ZXN0IElSUSAlZFxuIiwKIAkJCSAgIGlycSk7Ci0KLQkJYnVzX3VucmVnaXN0ZXIoJmh2X2J1cyk7Ci0KLQkJcmV0dXJuIHJldDsKKwkJZ290byBlcnJfdW5yZWdpc3RlcjsKIAl9CiAKIAl2ZWN0b3IgPSBJUlEwX1ZFQ1RPUiArIGlycTsKQEAgLTU2OCw3NiArNTU0LDgxIEBACiAJICovCiAJb25fZWFjaF9jcHUoaHZfc3luaWNfaW5pdCwgKHZvaWQgKikmdmVjdG9yLCAxKTsKIAlyZXQgPSB2bWJ1c19jb25uZWN0KCk7Ci0JaWYgKHJldCkgewotCQlmcmVlX2lycShpcnEsIGh2X2FjcGlfZGV2KTsKLQkJYnVzX3VucmVnaXN0ZXIoJmh2X2J1cyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCisJaWYgKHJldCkKKwkJZ290byBlcnJfaXJxOwogCiAJdm1idXNfcmVxdWVzdF9vZmZlcnMoKTsKIAogCXJldHVybiAwOworCitlcnJfaXJxOgorCWZyZWVfaXJxKGlycSwgaHZfYWNwaV9kZXYpOworCitlcnJfdW5yZWdpc3RlcjoKKwlidXNfdW5yZWdpc3RlcigmaHZfYnVzKTsKKworZXJyX2NsZWFudXA6CisJaHZfY2xlYW51cCgpOworCisJcmV0dXJuIHJldDsKIH0KIAogLyoqCi0gKiB2bWJ1c19jaGlsZF9kcml2ZXJfcmVnaXN0ZXIoKSAtIFJlZ2lzdGVyIGEgdm1idXMncyBjaGlsZCBkcml2ZXIKLSAqIEBkcnY6ICAgICAgICBQb2ludGVyIHRvIGRyaXZlciBzdHJ1Y3R1cmUgeW91IHdhbnQgdG8gcmVnaXN0ZXIKLSAqCisgKiBfX3ZtYnVzX2NoaWxkX2RyaXZlcl9yZWdpc3RlciAtIFJlZ2lzdGVyIGEgdm1idXMncyBkcml2ZXIKKyAqIEBkcnY6IFBvaW50ZXIgdG8gZHJpdmVyIHN0cnVjdHVyZSB5b3Ugd2FudCB0byByZWdpc3RlcgorICogQG93bmVyOiBvd25lciBtb2R1bGUgb2YgdGhlIGRydgorICogQG1vZF9uYW1lOiBtb2R1bGUgbmFtZSBzdHJpbmcKICAqCiAgKiBSZWdpc3RlcnMgdGhlIGdpdmVuIGRyaXZlciB3aXRoIExpbnV4IHRocm91Z2ggdGhlICdkcml2ZXJfcmVnaXN0ZXIoKScgY2FsbAotICogQW5kIHNldHMgdXAgdGhlIGh5cGVyLXYgdm1idXMgaGFuZGxpbmcgZm9yIHRoaXMgZHJpdmVyLgorICogYW5kIHNldHMgdXAgdGhlIGh5cGVyLXYgdm1idXMgaGFuZGxpbmcgZm9yIHRoaXMgZHJpdmVyLgogICogSXQgd2lsbCByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSAnZHJpdmVyX3JlZ2lzdGVyKCknIGNhbGwuCiAgKgotICogTWFpbmx5IHVzZWQgYnkgSHlwZXItViBkcml2ZXJzLgogICovCi1pbnQgdm1idXNfY2hpbGRfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCitpbnQgX192bWJ1c19kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGh2X2RyaXZlciAqaHZfZHJpdmVyLCBzdHJ1Y3QgbW9kdWxlICpvd25lciwgY29uc3QgY2hhciAqbW9kX25hbWUpCiB7CiAJaW50IHJldDsKIAotCXByX2luZm8oImNoaWxkIGRyaXZlciByZWdpc3RlcmluZyAtIG5hbWUgJXNcbiIsIGRydi0+bmFtZSk7CisJcHJfaW5mbygicmVnaXN0ZXJpbmcgZHJpdmVyICVzXG4iLCBodl9kcml2ZXItPm5hbWUpOwogCi0JLyogVGhlIGNoaWxkIGRyaXZlciBvbiB0aGlzIHZtYnVzICovCi0JZHJ2LT5idXMgPSAmaHZfYnVzOworCWh2X2RyaXZlci0+ZHJpdmVyLm5hbWUgPSBodl9kcml2ZXItPm5hbWU7CisJaHZfZHJpdmVyLT5kcml2ZXIub3duZXIgPSBvd25lcjsKKwlodl9kcml2ZXItPmRyaXZlci5tb2RfbmFtZSA9IG1vZF9uYW1lOworCWh2X2RyaXZlci0+ZHJpdmVyLmJ1cyA9ICZodl9idXM7CiAKLQlyZXQgPSBkcml2ZXJfcmVnaXN0ZXIoZHJ2KTsKKwlyZXQgPSBkcml2ZXJfcmVnaXN0ZXIoJmh2X2RyaXZlci0+ZHJpdmVyKTsKIAogCXZtYnVzX3JlcXVlc3Rfb2ZmZXJzKCk7CiAKIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTCh2bWJ1c19jaGlsZF9kcml2ZXJfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTF9HUEwoX192bWJ1c19kcml2ZXJfcmVnaXN0ZXIpOwogCiAvKioKLSAqIHZtYnVzX2NoaWxkX2RyaXZlcl91bnJlZ2lzdGVyKCkgLSBVbnJlZ2lzdGVyIGEgdm1idXMncyBjaGlsZCBkcml2ZXIKLSAqIEBkcnY6ICAgICAgICBQb2ludGVyIHRvIGRyaXZlciBzdHJ1Y3R1cmUgeW91IHdhbnQgdG8gdW4tcmVnaXN0ZXIKKyAqIHZtYnVzX2RyaXZlcl91bnJlZ2lzdGVyKCkgLSBVbnJlZ2lzdGVyIGEgdm1idXMncyBkcml2ZXIKKyAqIEBkcnY6IFBvaW50ZXIgdG8gZHJpdmVyIHN0cnVjdHVyZSB5b3Ugd2FudCB0byB1bi1yZWdpc3RlcgogICoKLSAqCi0gKiBVbi1yZWdpc3RlciB0aGUgZ2l2ZW4gZHJpdmVyIHdpdGggTGludXggdGhyb3VnaCB0aGUgJ2RyaXZlcl91bnJlZ2lzdGVyKCknCi0gKiBjYWxsLiBBbmQgdW5nZWdpc3RlcnMgdGhlIGRyaXZlciBmcm9tIHRoZSBIeXBlci1WIHZtYnVzIGhhbmRsZXIuCi0gKgotICogTWFpbmx5IHVzZWQgYnkgSHlwZXItViBkcml2ZXJzLgorICogVW4tcmVnaXN0ZXIgdGhlIGdpdmVuIGRyaXZlciB0aGF0IHdhcyBwcmV2aW91cyByZWdpc3RlcmVkIHdpdGggYSBjYWxsIHRvCisgKiB2bWJ1c19kcml2ZXJfcmVnaXN0ZXIoKQogICovCi12b2lkIHZtYnVzX2NoaWxkX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCit2b2lkIHZtYnVzX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBodl9kcml2ZXIgKmh2X2RyaXZlcikKIHsKLQlwcl9pbmZvKCJjaGlsZCBkcml2ZXIgdW5yZWdpc3RlcmluZyAtIG5hbWUgJXNcbiIsIGRydi0+bmFtZSk7CisJcHJfaW5mbygidW5yZWdpc3RlcmluZyBkcml2ZXIgJXNcbiIsIGh2X2RyaXZlci0+bmFtZSk7CiAKLQlkcml2ZXJfdW5yZWdpc3RlcihkcnYpOworCWRyaXZlcl91bnJlZ2lzdGVyKCZodl9kcml2ZXItPmRyaXZlcik7CiAKIH0KLUVYUE9SVF9TWU1CT0wodm1idXNfY2hpbGRfZHJpdmVyX3VucmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTF9HUEwodm1idXNfZHJpdmVyX3VucmVnaXN0ZXIpOwogCiAvKgotICogdm1idXNfY2hpbGRfZGV2aWNlX2NyZWF0ZSAtIENyZWF0ZXMgYW5kIHJlZ2lzdGVycyBhIG5ldyBjaGlsZCBkZXZpY2UKKyAqIHZtYnVzX2RldmljZV9jcmVhdGUgLSBDcmVhdGVzIGFuZCByZWdpc3RlcnMgYSBuZXcgY2hpbGQgZGV2aWNlCiAgKiBvbiB0aGUgdm1idXMuCiAgKi8KLXN0cnVjdCBodl9kZXZpY2UgKnZtYnVzX2NoaWxkX2RldmljZV9jcmVhdGUoc3RydWN0IGh2X2d1aWQgKnR5cGUsCi0JCQkJCSAgICBzdHJ1Y3QgaHZfZ3VpZCAqaW5zdGFuY2UsCitzdHJ1Y3QgaHZfZGV2aWNlICp2bWJ1c19kZXZpY2VfY3JlYXRlKHV1aWRfbGUgKnR5cGUsCisJCQkJCSAgICB1dWlkX2xlICppbnN0YW5jZSwKIAkJCQkJICAgIHN0cnVjdCB2bWJ1c19jaGFubmVsICpjaGFubmVsKQogewogCXN0cnVjdCBodl9kZXZpY2UgKmNoaWxkX2RldmljZV9vYmo7CiAKLQkvKiBBbGxvY2F0ZSB0aGUgbmV3IGNoaWxkIGRldmljZSAqLwogCWNoaWxkX2RldmljZV9vYmogPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaHZfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjaGlsZF9kZXZpY2Vfb2JqKSB7CiAJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIGRldmljZSBvYmplY3QgZm9yIGNoaWxkIGRldmljZVxuIik7CkBAIC02NDUsMjkgKzYzNiwyNyBAQAogCX0KIAogCWNoaWxkX2RldmljZV9vYmotPmNoYW5uZWwgPSBjaGFubmVsOwotCW1lbWNweSgmY2hpbGRfZGV2aWNlX29iai0+ZGV2X3R5cGUsIHR5cGUsIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpOworCW1lbWNweSgmY2hpbGRfZGV2aWNlX29iai0+ZGV2X3R5cGUsIHR5cGUsIHNpemVvZih1dWlkX2xlKSk7CiAJbWVtY3B5KCZjaGlsZF9kZXZpY2Vfb2JqLT5kZXZfaW5zdGFuY2UsIGluc3RhbmNlLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKKwkgICAgICAgc2l6ZW9mKHV1aWRfbGUpKTsKIAogCiAJcmV0dXJuIGNoaWxkX2RldmljZV9vYmo7CiB9CiAKIC8qCi0gKiB2bWJ1c19jaGlsZF9kZXZpY2VfcmVnaXN0ZXIgLSBSZWdpc3RlciB0aGUgY2hpbGQgZGV2aWNlCisgKiB2bWJ1c19kZXZpY2VfcmVnaXN0ZXIgLSBSZWdpc3RlciB0aGUgY2hpbGQgZGV2aWNlCiAgKi8KLWludCB2bWJ1c19jaGlsZF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGh2X2RldmljZSAqY2hpbGRfZGV2aWNlX29iaikKK2ludCB2bWJ1c19kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGh2X2RldmljZSAqY2hpbGRfZGV2aWNlX29iaikKIHsKIAlpbnQgcmV0ID0gMDsKIAogCXN0YXRpYyBhdG9taWNfdCBkZXZpY2VfbnVtID0gQVRPTUlDX0lOSVQoMCk7CiAKLQkvKiBTZXQgdGhlIGRldmljZSBuYW1lLiBPdGhlcndpc2UsIGRldmljZV9yZWdpc3RlcigpIHdpbGwgZmFpbC4gKi8KIAlkZXZfc2V0X25hbWUoJmNoaWxkX2RldmljZV9vYmotPmRldmljZSwgInZtYnVzXzBfJWQiLAogCQkgICAgIGF0b21pY19pbmNfcmV0dXJuKCZkZXZpY2VfbnVtKSk7CiAKLQkvKiBUaGUgbmV3IGRldmljZSBiZWxvbmdzIHRvIHRoaXMgYnVzICovCi0JY2hpbGRfZGV2aWNlX29iai0+ZGV2aWNlLmJ1cyA9ICZodl9idXM7IC8qIGRldmljZS0+ZGV2LmJ1czsgKi8KKwljaGlsZF9kZXZpY2Vfb2JqLT5kZXZpY2UuYnVzID0gJmh2X2J1czsKIAljaGlsZF9kZXZpY2Vfb2JqLT5kZXZpY2UucGFyZW50ID0gJmh2X2FjcGlfZGV2LT5kZXY7CiAJY2hpbGRfZGV2aWNlX29iai0+ZGV2aWNlLnJlbGVhc2UgPSB2bWJ1c19kZXZpY2VfcmVsZWFzZTsKIApAQCAtNjg3LDEwICs2NzYsMTAgQEAKIH0KIAogLyoKLSAqIHZtYnVzX2NoaWxkX2RldmljZV91bnJlZ2lzdGVyIC0gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgY2hpbGQgZGV2aWNlCisgKiB2bWJ1c19kZXZpY2VfdW5yZWdpc3RlciAtIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGNoaWxkIGRldmljZQogICogZnJvbSB0aGUgdm1idXMuCiAgKi8KLXZvaWQgdm1idXNfY2hpbGRfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlX29iaikKK3ZvaWQgdm1idXNfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlX29iaikKIHsKIAkvKgogCSAqIEtpY2sgb2ZmIHRoZSBwcm9jZXNzIG9mIHVucmVnaXN0ZXJpbmcgdGhlIGRldmljZS4KQEAgLTcyNyw5ICs3MTYsOCBAQAogCiAJaHZfYWNwaV9kZXYgPSBkZXZpY2U7CiAKLQlyZXN1bHQgPQotCWFjcGlfd2Fsa19yZXNvdXJjZXMoZGV2aWNlLT5oYW5kbGUsIE1FVEhPRF9OQU1FX19DUlMsCi0JCQl2bWJ1c193YWxrX3Jlc291cmNlcywgJmlycSk7CisJcmVzdWx0ID0gYWNwaV93YWxrX3Jlc291cmNlcyhkZXZpY2UtPmhhbmRsZSwgTUVUSE9EX05BTUVfX0NSUywKKwkJCQkJdm1idXNfd2Fsa19yZXNvdXJjZXMsICZpcnEpOwogCiAJaWYgKEFDUElfRkFJTFVSRShyZXN1bHQpKSB7CiAJCWNvbXBsZXRlKCZwcm9iZV9ldmVudCk7CkBAIC03NTQsMjEgKzc0Miw5IEBACiAJfSwKIH07CiAKLS8qCi0gKiBXZSB1c2UgYSBQQ0kgdGFibGUgdG8gZGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBhdXRvbG9hZCB0aGlzIGRyaXZlciAgVGhpcyBpcwotICogbmVlZGVkIGJ5IGRpc3RybyB0b29scyB0byBkZXRlcm1pbmUgaWYgdGhlIGh5cGVydiBkcml2ZXJzIHNob3VsZCBiZQotICogaW5zdGFsbGVkIGFuZC9vciBjb25maWd1cmVkLiAgV2UgZG9uJ3QgZG8gYW55dGhpbmcgZWxzZSB3aXRoIHRoZSB0YWJsZSwgYnV0Ci0gKiBpdCBuZWVkcyB0byBiZSBwcmVzZW50LgotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgbWljcm9zb2Z0X2h2X3BjaV90YWJsZVtdID0gewotCXsgUENJX0RFVklDRSgweDE0MTQsIDB4NTM1MykgfSwJLyogVkdBIGNvbXBhdGlibGUgY29udHJvbGxlciAqLwotCXsgMCB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG1pY3Jvc29mdF9odl9wY2lfdGFibGUpOwotCiBzdGF0aWMgaW50IF9faW5pdCBodl9hY3BpX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0OworCWludCByZXQsIHQ7CiAKIAlpbml0X2NvbXBsZXRpb24oJnByb2JlX2V2ZW50KTsKIApAQCAtNzgxLDIyICs3NTcsMzAgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0Jd2FpdF9mb3JfY29tcGxldGlvbigmcHJvYmVfZXZlbnQpOworCXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnByb2JlX2V2ZW50LCA1KkhaKTsKKwlpZiAodCA9PSAwKSB7CisJCXJldCA9IC1FVElNRURPVVQ7CisJCWdvdG8gY2xlYW51cDsKKwl9CiAKIAlpZiAoaXJxIDw9IDApIHsKLQkJYWNwaV9idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJnZtYnVzX2FjcGlfZHJpdmVyKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAlyZXQgPSB2bWJ1c19idXNfaW5pdChpcnEpOwogCWlmIChyZXQpCi0JCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZ2bWJ1c19hY3BpX2RyaXZlcik7CisJCWdvdG8gY2xlYW51cDsKKworCXJldHVybiAwOworCitjbGVhbnVwOgorCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZ2bWJ1c19hY3BpX2RyaXZlcik7CiAJcmV0dXJuIHJldDsKIH0KIAogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfVkVSU0lPTihIVl9EUlZfVkVSU0lPTik7Ci1tb2R1bGVfcGFyYW0odm1idXNfbG9nbGV2ZWwsIGludCwgU19JUlVHT3xTX0lXVVNSKTsKIAogbW9kdWxlX2luaXQoaHZfYWNwaV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKaW5kZXggMDM2ZDlkZS4uODllNTAzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKQEAgLTQ2LDggKzQ2LDYgQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvZWNoby9LY29uZmlnIgogCi0KLQogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvY29tZWRpL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9LY29uZmlnIgpAQCAtNjYsNiArNjQsOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9ydHNfcHN0b3IvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9LY29uZmlnIgorCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9mcm9udGllci9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9wb2htZWxmcy9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCmluZGV4IDA1OTk1MDkuLmQ3YTVhMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKQEAgLTE1LDggKzE1LDYgQEAKIG9iai0kKENPTkZJR19XMzVVTkQpCQkrPSB3aW5ib25kLwogb2JqLSQoQ09ORklHX1BSSVNNMl9VU0IpCSs9IHdsYW4tbmcvCiBvYmotJChDT05GSUdfRUNITykJCSs9IGVjaG8vCi0KLQogb2JqLSQoQ09ORklHX0NPTUVESSkJCSs9IGNvbWVkaS8KIG9iai0kKENPTkZJR19GQl9PTFBDX0RDT04pCSs9IG9scGNfZGNvbi8KIG9iai0kKENPTkZJR19BU1VTX09MRUQpCQkrPSBhc3VzX29sZWQvCkBAIC0yNiw2ICsyNCw3IEBACiBvYmotJChDT05GSUdfUlRMODE5MkUpCQkrPSBydGw4MTkyZS8KIG9iai0kKENPTkZJR19SODcxMlUpCQkrPSBydGw4NzEyLwogb2JqLSQoQ09ORklHX1JUU19QU1RPUikJCSs9IHJ0c19wc3Rvci8KK29iai0kKENPTkZJR19SVFM1MTM5KQkJKz0gcnRzNTEzOS8KIG9iai0kKENPTkZJR19TUEVDVFJBKQkJKz0gc3BlY3RyYS8KIG9iai0kKENPTkZJR19UUkFOWlBPUlQpCQkrPSBmcm9udGllci8KIG9iai0kKENPTkZJR19QT0hNRUxGUykJCSs9IHBvaG1lbGZzLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbHRlcmEtc3RhcGwvYWx0ZXJhLmMKaW5kZXggOGQ3M2E4Ni4uYzJlZmY2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYWx0ZXJhLXN0YXBsL2FsdGVyYS5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAiYWx0ZXJhLmgiCiAjaW5jbHVkZSAiYWx0ZXJhLWV4cHJ0LmgiCiAjaW5jbHVkZSAiYWx0ZXJhLWp0YWcuaCIKQEAgLTIzODQsNyArMjM4NSw3IEBACiAJCWFjdF9wcm9jX2F0dHJpYnV0ZSA9CiAJCQkocFtwcm9jX3RhYmxlICsgKDEzICogYWN0X3Byb2NfaWQpICsgOF0gJiAweDAzKTsKIAotCQlwcm9jcHRyID0gKHN0cnVjdCBhbHRlcmFfcHJvY2luZm8gKikKKwkJcHJvY3B0ciA9CiAJCQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IGFsdGVyYV9wcm9jaW5mbyksCiAJCQkJCQkJCUdGUF9LRVJORUwpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0JjbWNoYXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vQmNtY2hhci5jCmluZGV4IDg2N2RiZjEuLjJmYTY1OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vQmNtY2hhci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vQmNtY2hhci5jCkBAIC0zNCw3ICszNCw3IEBACiAJLyogU3RvcmUgdGhlIEFkYXB0ZXIgc3RydWN0dXJlICovCiAJZmlscC0+cHJpdmF0ZV9kYXRhID0gcFRhcmFuZzsKIAotCS8qU3RhcnQgUXVldWluZyB0aGUgY29udHJvbCByZXNwb25zZSBQYWNrZXRzKi8KKwkvKiBTdGFydCBRdWV1aW5nIHRoZSBjb250cm9sIHJlc3BvbnNlIFBhY2tldHMgKi8KIAlhdG9taWNfaW5jKCZBZGFwdGVyLT5BcHBsaWNhdGlvblJ1bm5pbmcpOwogCiAJbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlscCk7CkBAIC04NCw3ICs4NCw3IEBACiAKIAl1cCgmQWRhcHRlci0+UnhBcHBDb250cm9sUXVldWVsb2NrKTsKIAotCS8qU3RvcCBRdWV1aW5nIHRoZSBjb250cm9sIHJlc3BvbnNlIFBhY2tldHMqLworCS8qIFN0b3AgUXVldWluZyB0aGUgY29udHJvbCByZXNwb25zZSBQYWNrZXRzICovCiAJYXRvbWljX2RlYygmQWRhcHRlci0+QXBwbGljYXRpb25SdW5uaW5nKTsKIAogCWtmcmVlKHBUYXJhbmcpOwpAQCAtMTAwLDggKzEwMCw4IEBACiAJUFBFUl9UQVJBTkdfREFUQSBwVGFyYW5nID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCVBNSU5JX0FEQVBURVIJQWRhcHRlciA9IHBUYXJhbmctPkFkYXB0ZXI7CiAJc3RydWN0IHNrX2J1ZmYgKlBhY2tldCA9IE5VTEw7Ci0Jc3NpemVfdCAgICAgICAgIFBrdExlbiA9IDA7Ci0JaW50ICAgICAgICAgICAgIHdhaXRfcmV0X3ZhbCA9IDA7CisJc3NpemVfdCBQa3RMZW4gPSAwOworCWludCB3YWl0X3JldF92YWwgPSAwOwogCXVuc2lnbmVkIGxvbmcgcmV0ID0gMDsKIAogCXdhaXRfcmV0X3ZhbCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShBZGFwdGVyLT5wcm9jZXNzX3JlYWRfd2FpdF9xdWV1ZSwKQEAgLTE1NywxOTQyICsxNTcsMTgyNCBAQAogewogCVBQRVJfVEFSQU5HX0RBVEEgIHBUYXJhbmcgPSBmaWxwLT5wcml2YXRlX2RhdGE7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7Ci0JUE1JTklfQURBUFRFUiAJQWRhcHRlciA9IHBUYXJhbmctPkFkYXB0ZXI7Ci0JSU5UICAJCQlTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKwlQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBwVGFyYW5nLT5BZGFwdGVyOworCUlOVCBTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKIAlpbnQgdGltZW91dCA9IDA7Ci0JSU9DVExfQlVGRkVSIAlJb0J1ZmZlcjsKKwlJT0NUTF9CVUZGRVIgSW9CdWZmZXI7CiAKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlBhcmFtZXRlcnMgUGFzc2VkIHRvIGNvbnRyb2wgSU9DVEwgY21kPTB4JVggYXJnPTB4JWxYIiwgY21kLCBhcmcpOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlBhcmFtZXRlcnMgUGFzc2VkIHRvIGNvbnRyb2wgSU9DVEwgY21kPTB4JVggYXJnPTB4JWxYIiwgY21kLCBhcmcpOwogCi0JaWYoX0lPQ19UWVBFKGNtZCkgIT0gQkNNX0lPQ1RMKQorCWlmIChfSU9DX1RZUEUoY21kKSAhPSBCQ01fSU9DVEwpCiAJCXJldHVybiAtRUZBVUxUOwotCWlmKF9JT0NfRElSKGNtZCkgJiBfSU9DX1JFQUQpCisJaWYgKF9JT0NfRElSKGNtZCkgJiBfSU9DX1JFQUQpCiAJCVN0YXR1cyA9ICFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBhcmdwLCBfSU9DX1NJWkUoY21kKSk7CiAJZWxzZSBpZiAoX0lPQ19ESVIoY21kKSAmIF9JT0NfV1JJVEUpCi0JICAgIFN0YXR1cyA9ICFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGFyZ3AsIF9JT0NfU0laRShjbWQpKTsKKwkJU3RhdHVzID0gIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYXJncCwgX0lPQ19TSVpFKGNtZCkpOwogCWVsc2UgaWYgKF9JT0NfTk9ORSA9PSAoX0lPQ19ESVIoY21kKSAmIF9JT0NfTk9ORSkpCi0JICAgIFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKIAotCWlmKFN0YXR1cykKKwlpZiAoU3RhdHVzKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlmKEFkYXB0ZXItPmRldmljZV9yZW1vdmVkKQotCXsKKwlpZiAoQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQpCiAJCXJldHVybiAtRUZBVUxUOwotCX0KIAotCWlmKEZBTFNFID09IEFkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmUpCi0JewotCQlzd2l0Y2ggKGNtZCkKLQkJewotCQkJY2FzZSBJT0NUTF9NQUNfQUREUl9SRVE6Ci0JCQljYXNlIElPQ1RMX0xJTktfUkVROgotCQkJY2FzZSBJT0NUTF9DTV9SRVFVRVNUOgotCQkJY2FzZSBJT0NUTF9TU19JTkZPX1JFUToKLQkJCWNhc2UgSU9DVExfU0VORF9DT05UUk9MX01FU1NBR0U6Ci0JCQljYXNlIElPQ1RMX0lETEVfUkVROgotCQkJY2FzZSBJT0NUTF9CQ01fR1BJT19TRVRfUkVRVUVTVDoKLQkJCWNhc2UgSU9DVExfQkNNX0dQSU9fU1RBVFVTX1JFUVVFU1Q6Ci0JCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JU3RhdHVzID0gdmVuZG9yZXh0bklvY3RsKEFkYXB0ZXIsIGNtZCwgYXJnKTsKLQlpZihTdGF0dXMgIT0gQ09OVElOVUVfQ09NTU9OX1BBVEggKQotCQkgcmV0dXJuIFN0YXR1czsKLQotCXN3aXRjaChjbWQpewotCQkvLyBSZG1zIGZvciBTd2luIElkbGUuLi4KLQkJY2FzZSBJT0NUTF9CQ01fUkVHSVNURVJfUkVBRF9QUklWQVRFOgotCQl7Ci0JCQlSRE1fQlVGRkVSICBzUmRtQnVmZmVyID0gezB9OwotCQkJUENIQVIgdGVtcF9idWZmOwotCQkJVUlOVCBCdWZmbGVuOwotCi0JCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCi0JCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2Yoc1JkbUJ1ZmZlcikpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCWlmKGNvcHlfZnJvbV91c2VyKCZzUmRtQnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCi0JCQkvKiBGSVhNRTogbmVlZCB0byByZXN0cmljdCBCdWZmTGVuICovCi0JCQlCdWZmbGVuID0gSW9CdWZmZXIuT3V0cHV0TGVuZ3RoICsgKDQgLSBJb0J1ZmZlci5PdXRwdXRMZW5ndGglNCklNDsKLQkJCXRlbXBfYnVmZiA9IGttYWxsb2MoQnVmZmxlbiwgR0ZQX0tFUk5FTCk7Ci0JCQlpZighdGVtcF9idWZmKQotCQkJCXJldHVybiAtRU5PTUVNOwotCi0JCQlTdGF0dXMgPSByZG1hbHQoQWRhcHRlciwgKFVJTlQpc1JkbUJ1ZmZlci5SZWdpc3RlciwKLQkJCQkJKFBVSU5UKXRlbXBfYnVmZiwgQnVmZmxlbik7Ci0JCQlpZihTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQl7Ci0JCQkJaWYoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgdGVtcF9idWZmLCBJb0J1ZmZlci5PdXRwdXRMZW5ndGgpKQotCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJfQotCi0JCQlrZnJlZSh0ZW1wX2J1ZmYpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FzZSBJT0NUTF9CQ01fUkVHSVNURVJfV1JJVEVfUFJJVkFURToKLQkJewotCQkJV1JNX0JVRkZFUiAgc1dybUJ1ZmZlciA9IHswfTsKLQkJCVVJTlQgdWlUZW1wVmFyPTA7Ci0JCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQotCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihzV3JtQnVmZmVyKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJLyogR2V0IFdybUJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJCWlmKGNvcHlfZnJvbV91c2VyKCZzV3JtQnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCi0JCQl1aVRlbXBWYXIgPSBzV3JtQnVmZmVyLlJlZ2lzdGVyICYgRUVQUk9NX1JFSkVDVF9NQVNLOwotCQkJaWYoISgoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyQ3VzdG9taXplKSAmIFZTR19NT0RFKSAmJgotCQkJIAkoKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18xKXx8Ci0JCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18yKSB8fAotCQkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMykgfHwKLQkJCQkodWlUZW1wVmFyID09IEVFUFJPTV9SRUpFQ1RfUkVHXzQpKSkKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJFRVBST00gQWNjZXNzIERlbmllZCwgbm90IGluIFZTRyBNb2RlXG4iKTsKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQkJCVN0YXR1cyA9IHdybWFsdChBZGFwdGVyLCAoVUlOVClzV3JtQnVmZmVyLlJlZ2lzdGVyLAotCQkJCQkJKFBVSU5UKXNXcm1CdWZmZXIuRGF0YSwgc2l6ZW9mKFVMT05HKSk7Ci0JCQlpZihTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIldSTSBEb25lXG4iKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIldSTSBGYWlsZWRcbiIpOwotCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCi0JCWNhc2UgSU9DVExfQkNNX1JFR0lTVEVSX1JFQUQ6Ci0JCWNhc2UgSU9DVExfQkNNX0VFUFJPTV9SRUdJU1RFUl9SRUFEOgotCQl7Ci0JCQlSRE1fQlVGRkVSICBzUmRtQnVmZmVyID0gezB9OwotCQkJUENIQVIgdGVtcF9idWZmID0gTlVMTDsKLQkJCVVJTlQgdWlUZW1wVmFyID0gMDsKLQkJCWlmKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PVRSVUUpIHx8Ci0JCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT1UUlVFKSkKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJEZXZpY2UgaW4gSWRsZSBNb2RlLCBCbG9ja2luZyBSZG1zXG4iKTsKLQkJCQlyZXR1cm4gLUVBQ0NFUzsKLQkJCX0KLQkJCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwotCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihzUmRtQnVmZmVyKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJaWYoY29weV9mcm9tX3VzZXIoJnNSZG1CdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJCS8qIEZJWE1FOiBkb24ndCB0cnVzdCB1c2VyIHN1cHBsaWVkIGxlbmd0aCAqLwotCQkJdGVtcF9idWZmID0ga21hbGxvYyhJb0J1ZmZlci5PdXRwdXRMZW5ndGgsIEdGUF9LRVJORUwpOwotCQkJaWYoIXRlbXBfYnVmZikKLQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7Ci0KLQkJCWlmKCgoKFVMT05HKXNSZG1CdWZmZXIuUmVnaXN0ZXIgJiAweDBGMDAwMDAwKSAhPSAweDBGMDAwMDAwKSB8fAotCQkJICAgKChVTE9ORylzUmRtQnVmZmVyLlJlZ2lzdGVyICYgMHgzKSkKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJSRE0gRG9uZSBPbiBpbnZhbGlkIEFkZHJlc3MgOiAleCBBY2Nlc3MgRGVuaWVkLlxuIiwKLQkJCQkJKGludClzUmRtQnVmZmVyLlJlZ2lzdGVyKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQotCQkJdWlUZW1wVmFyID0gc1JkbUJ1ZmZlci5SZWdpc3RlciAmIEVFUFJPTV9SRUpFQ1RfTUFTSzsKLQkJCVN0YXR1cyA9IHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKXNSZG1CdWZmZXIuUmVnaXN0ZXIsCi0JCQkJCQkoUFVJTlQpdGVtcF9idWZmLCBJb0J1ZmZlci5PdXRwdXRMZW5ndGgpOwotCQkJaWYoU3RhdHVzID09IFNUQVRVU19TVUNDRVNTKQotCQkJCWlmKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIHRlbXBfYnVmZiwgSW9CdWZmZXIuT3V0cHV0TGVuZ3RoKSkKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQotCQkJa2ZyZWUodGVtcF9idWZmKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgSU9DVExfQkNNX1JFR0lTVEVSX1dSSVRFOgotCQljYXNlIElPQ1RMX0JDTV9FRVBST01fUkVHSVNURVJfV1JJVEU6Ci0JCXsKLQkJCVdSTV9CVUZGRVIgIHNXcm1CdWZmZXIgPSB7MH07Ci0JCQlVSU5UIHVpVGVtcFZhcj0wOwotCQkJaWYoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8Ci0JCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09VFJVRSkgfHwKLQkJCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PVRSVUUpKQotCQkJewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkRldmljZSBpbiBJZGxlIE1vZGUsIEJsb2NraW5nIFdybXNcbiIpOwotCQkJCXJldHVybiAtRUFDQ0VTOwotCQkJfQotCi0JCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCi0JCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2Yoc1dybUJ1ZmZlcikpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCS8qIEdldCBXcm1CdWZmZXIgc3RydWN0dXJlICovCi0JCQlpZihjb3B5X2Zyb21fdXNlcigmc1dybUJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkJaWYoICgoKFVMT05HKXNXcm1CdWZmZXIuUmVnaXN0ZXIgJiAweDBGMDAwMDAwKSAhPSAweDBGMDAwMDAwKSB8fAotCQkJCQkoKFVMT05HKXNXcm1CdWZmZXIuUmVnaXN0ZXIgJiAweDMpICkKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJXUk0gRG9uZSBPbiBpbnZhbGlkIEFkZHJlc3MgOiAleCBBY2Nlc3MgRGVuaWVkLlxuIiwKLQkJCQkJCShpbnQpc1dybUJ1ZmZlci5SZWdpc3Rlcik7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0KLQkJCXVpVGVtcFZhciA9IHNXcm1CdWZmZXIuUmVnaXN0ZXIgJiBFRVBST01fUkVKRUNUX01BU0s7Ci0JCQlpZighKChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJDdXN0b21pemUpICYgVlNHX01PREUpICYmCi0JCQkJKCh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMSl8fAotCQkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMikgfHwKLQkJCQkodWlUZW1wVmFyID09IEVFUFJPTV9SRUpFQ1RfUkVHXzMpIHx8Ci0JCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR180KSkgJiYKLQkJCQkoY21kID09IElPQ1RMX0JDTV9SRUdJU1RFUl9XUklURSkpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRUVQUk9NIEFjY2VzcyBEZW5pZWQsIG5vdCBpbiBWU0cgTW9kZVxuIik7Ci0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQl9Ci0KLQkJCVN0YXR1cyA9IHdybWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKXNXcm1CdWZmZXIuUmVnaXN0ZXIsCi0JCQkJCQkJKFBVSU5UKXNXcm1CdWZmZXIuRGF0YSwgc1dybUJ1ZmZlci5MZW5ndGgpOwotCQkJaWYoU3RhdHVzID09IFNUQVRVU19TVUNDRVNTKQotCQkJewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiV1JNIERvbmVcbiIpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiV1JNIEZhaWxlZFxuIik7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgSU9DVExfQkNNX0dQSU9fU0VUX1JFUVVFU1Q6Ci0JCXsKLQkJCVVDSEFSIHVjUmVzZXRWYWx1ZVs0XTsKLQkJCVVJTlQgdmFsdWUgPTA7Ci0JCQlVSU5UIHVpQml0ID0gMDsKLQkgICAgICAgIFVJTlQgdWlPcGVyYXRpb24gPSAwOwotCi0JCQlHUElPX0lORk8gICBncGlvX2luZm8gPSB7MH07Ci0JCQlpZigoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT1UUlVFKSB8fAotCQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09VFJVRSkpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIkdQSU8gQ2FuJ3QgYmUgc2V0L2NsZWFyIGluIExvdyBwb3dlciBNb2RlIik7Ci0JCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCQl9Ci0JCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihncGlvX2luZm8pKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJaWYoY29weV9mcm9tX3VzZXIoJmdwaW9faW5mbywgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCXVpQml0ICA9IGdwaW9faW5mby51aUdwaW9OdW1iZXI7Ci0JCQl1aU9wZXJhdGlvbiA9IGdwaW9faW5mby51aUdwaW9WYWx1ZTsKLQotCQkJdmFsdWU9ICgxPDx1aUJpdCk7Ci0KLQkJCWlmKElzUmVxR3Bpb0lzTGVkSW5OVk0oQWRhcHRlcix2YWx1ZSkgPT1GQUxTRSkKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlNvcnJ5LCBSZXF1ZXN0ZWQgR1BJTzwweCVYPiBpcyBub3QgY29ycmVzcG9uZCB0byBMRUQgISEhIix2YWx1ZSk7Ci0JCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQotCi0JCQlpZih1aU9wZXJhdGlvbikvL1NldCAtIHNldHRpbmcgMQotCQkJewotCQkJCS8vU2V0IHRoZSBncGlvIG91dHB1dCByZWdpc3RlcgotCQkJCVN0YXR1cyA9IHdybWFsdFdpdGhMb2NrKEFkYXB0ZXIsQkNNX0dQSU9fT1VUUFVUX1NFVF9SRUcgLAotCQkJCQkJKFBVSU5UKSgmdmFsdWUpLCBzaXplb2YoVUlOVCkpOwotCQkJCWlmKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykKLQkJCQl7Ci0gICAgICAgICAgICAgICAJICAgIEJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiU2V0IHRoZSBHUElPIGJpdFxuIik7Ci0JCQkJfQotICAgICAgICAJICAgIGVsc2UKLQkJICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJGYWlsZWQgdG8gc2V0IHRoZSAlZHRoIEdQSU8gXG4iLHVpQml0KTsKLSAgICAgICAgICAgICAgICAgICAJYnJlYWs7Ci0gICAgICAgICAgICAgICAJfQotCQkJfQotCQkJZWxzZS8vVW5zZXQgLSBzZXR0aW5nIDAKLQkJCXsKLQkJCQkvL1NldCB0aGUgZ3BpbyBvdXRwdXQgcmVnaXN0ZXIKLQkJCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLEJDTV9HUElPX09VVFBVVF9DTFJfUkVHICwKLQkJCQkJCShQVUlOVCkoJnZhbHVlKSwgc2l6ZW9mKFVJTlQpKTsKLQkJCQlpZihTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJewotICAgICAgICAgICAgICAgCSAgICBCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiU2V0IHRoZSBHUElPIGJpdFxuIik7Ci0JCQkJfQotICAgICAgICAJICAgIGVsc2UKLQkJICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJGYWlsZWQgdG8gY2xlYXIgdGhlICVkdGggR1BJTyBcbiIsdWlCaXQpOwotICAgICAgICAgICAgICAgICAgIAlicmVhazsKLSAgICAgICAgICAgICAgIAl9Ci0JCQl9Ci0KLQkJCVN0YXR1cyA9IHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKUdQSU9fTU9ERV9SRUdJU1RFUiwKLQkJCQkJKFBVSU5UKXVjUmVzZXRWYWx1ZSwgc2l6ZW9mKFVJTlQpKTsKLQkJCWlmIChTVEFUVVNfU1VDQ0VTUyAhPSBTdGF0dXMpCi0gICAgICAgICAgICB7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIkdQSU9fTU9ERV9SRUdJU1RFUiByZWFkIGZhaWxlZCIpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJLy9TZXQgdGhlIGdwaW8gbW9kZSByZWdpc3RlciB0byBvdXRwdXQKLQkJCSooVUlOVCopdWNSZXNldFZhbHVlIHw9ICgxPDx1aUJpdCk7Ci0JCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLEdQSU9fTU9ERV9SRUdJU1RFUiAsCi0JCQkJCShQVUlOVCl1Y1Jlc2V0VmFsdWUsIHNpemVvZihVSU5UKSk7Ci0JCQlpZihTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQl7Ci0gICAgICAgICAgICAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIlNldCB0aGUgR1BJTyB0byBvdXRwdXQgTW9kZVxuIik7Ci0JCQl9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJGYWlsZWQgdG8gcHV0IEdQSU8gaW4gT3V0cHV0IE1vZGVcbiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCQl9Ci0JCWJyZWFrOwotCQljYXNlIEJDTV9MRURfVEhSRUFEX1NUQVRFX0NIQU5HRV9SRVE6Ci0JCXsKLQkJCVVTRVJfVEhSRUFEX1JFUSB0aHJlYWRSZXEgPSB7IDAgfTsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJVc2VyIG1hZGUgTEVEIHRocmVhZCBJbkFjdGl2ZSIpOwotCi0JCQlpZigoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT1UUlVFKSB8fAotCQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09VFJVRSkpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIkdQSU8gQ2FuJ3QgYmUgc2V0L2NsZWFyIGluIExvdyBwb3dlciBNb2RlIik7Ci0JCQkJU3RhdHVzID0gLUVBQ0NFUzsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCi0JCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2YodGhyZWFkUmVxKSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0aHJlYWRSZXEsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJCS8vaWYgTEVEIHRocmVhZCBpcyBydW5uaW5nKEFjdGl2ZWx5IG9yIEluYWN0aXZlbHkpIHNldCBpdCBzdGF0ZSB0byBtYWtlIGluYWN0aXZlCi0JCQlpZihBZGFwdGVyLT5MRURJbmZvLmxlZF90aHJlYWRfcnVubmluZykKLQkJCXsKLQkJCQlpZih0aHJlYWRSZXEuVGhyZWFkU3RhdGUgPT0gTEVEX1RIUkVBRF9BQ1RJVkFUSU9OX1JFUSkKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJBY3RpdmF0aW5nIHRocmVhZCByZXEiKTsKLQkJCQkJQWRhcHRlci0+RHJpdmVyU3RhdGUgPSBMRURfVEhSRUFEX0FDVElWRTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIkRlQWN0aXZhdGluZyBUaHJlYWQgcmVxLi4uLi4iKTsKLQkJCQkJQWRhcHRlci0+RHJpdmVyU3RhdGUgPSBMRURfVEhSRUFEX0lOQUNUSVZFOwotCQkJCX0KLQotCQkJCS8vc2lnbmFsIHRocmVhZC4KLQkJCQl3YWtlX3VwKCZBZGFwdGVyLT5MRURJbmZvLm5vdGlmeV9sZWRfZXZlbnQpOwotCi0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JCWNhc2UgSU9DVExfQkNNX0dQSU9fU1RBVFVTX1JFUVVFU1Q6Ci0JCXsKLQkJCVVMT05HIHVpQml0ID0gMDsKLQkJCVVDSEFSIHVjUmVhZFs0XTsKLQkJCUdQSU9fSU5GTyAgIGdwaW9faW5mbyA9IHswfTsKLQkJCWlmKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PVRSVUUpIHx8Ci0JCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT1UUlVFKSkKLQkJCQlyZXR1cm4gLUVBQ0NFUzsKLQkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKGdwaW9faW5mbykpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpZihjb3B5X2Zyb21fdXNlcigmZ3Bpb19pbmZvLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQotCQkJCXJldHVybiAtRUZBVUxUOwotICAgICAgICAgICAgICAgIHVpQml0ICA9IGdwaW9faW5mby51aUdwaW9OdW1iZXI7Ci0JCQkJICAvL1NldCB0aGUgZ3BpbyBvdXRwdXQgcmVnaXN0ZXIKLQkJCQlTdGF0dXMgPSByZG1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClHUElPX1BJTl9TVEFURV9SRUdJU1RFUiwKLSAgICAgICAgICAgICAgICAJKFBVSU5UKXVjUmVhZCwgc2l6ZW9mKFVJTlQpKTsKLSAgICAgICAgICAgICAgICBpZihTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJSRE0gRmFpbGVkXG4iKTsKLQkJCQkJcmV0dXJuIFN0YXR1czsKLSAgICAgICAgICAgICAgICB9Ci0KLQkJCX0KLQkJCWJyZWFrOwotCQkJY2FzZSBJT0NUTF9CQ01fR1BJT19NVUxUSV9SRVFVRVNUOgotCQkJewotCQkJCVVDSEFSIHVjUmVzZXRWYWx1ZVs0XTsKLQkJCQlHUElPX01VTFRJX0lORk8gZ3Bpb19tdWx0aV9pbmZvW01BWF9JRFhdOwotCQkJCVBHUElPX01VTFRJX0lORk8gcGdwaW9fbXVsdGlfaW5mbyA9IChQR1BJT19NVUxUSV9JTkZPKWdwaW9fbXVsdGlfaW5mbzsKLQotCQkJCW1lbXNldCggcGdwaW9fbXVsdGlfaW5mbywgMCwgTUFYX0lEWCAqIHNpemVvZiggR1BJT19NVUxUSV9JTkZPKSk7Ci0KLQkJCQlpZigoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT1UUlVFKSB8fAotCQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09VFJVRSkpCi0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKGdwaW9fbXVsdGlfaW5mbykpCi0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmZ3Bpb19tdWx0aV9pbmZvLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkJCWlmKElzUmVxR3Bpb0lzTGVkSW5OVk0oQWRhcHRlcixwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzayk9PSBGQUxTRSkKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiU29ycnksIFJlcXVlc3RlZCBHUElPPDB4JVg+IGlzIG5vdCBjb3JyZXNwb25kIHRvIE5WTSBMRUQgYml0IG1hcDwweCVYPiEhISIscGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT01hc2ssQWRhcHRlci0+Z3Bpb0JpdE1hcCk7Ci0JCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCS8qIFNldCB0aGUgZ3BpbyBvdXRwdXQgcmVnaXN0ZXIgKi8KLQotCQkJCWlmKCAoIHBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9NYXNrKSAmCi0JCQkJCSggcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT0NvbW1hbmQpKQotCQkJCXsKLQkJCQkJLyogU2V0IDEncyBpbiBHUElPIE9VVFBVVCBSRUdJU1RFUiAqLwotCQkJCQkqKFVJTlQqKSB1Y1Jlc2V0VmFsdWUgPSAgcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT01hc2sgJgotCQkJCQkgICAgICAgIAkJCQkgcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT0NvbW1hbmQgJgotCQkJCQkJCQkJCQkgcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT1ZhbHVlOwotCi0JCQkJCWlmKCAqKFVJTlQqKSB1Y1Jlc2V0VmFsdWUpCi0JCQkJCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayggQWRhcHRlciwgQkNNX0dQSU9fT1VUUFVUX1NFVF9SRUcgLCAoUFVJTlQpIHVjUmVzZXRWYWx1ZSwgc2l6ZW9mKFVMT05HKSk7Ci0KLQkJCQkJaWYoIFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQkJewotCQkJCQkJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiV1JNIHRvIEJDTV9HUElPX09VVFBVVF9TRVRfUkVHIEZhaWxlZC4iKTsKLQkJCQkJCXJldHVybiBTdGF0dXM7Ci0JCQkJCX0KLQotCQkJCQkvKiBDbGVhciB0byAwJ3MgaW4gR1BJTyBPVVRQVVQgUkVHSVNURVIgKi8KLQkJCQkJKihVSU5UKikgdWNSZXNldFZhbHVlID0gKHBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9NYXNrICYKLQkJCQkJCQlwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPQ29tbWFuZCAmCi0JCQkJCQkJKCB+KCBwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPVmFsdWUpKSk7Ci0KLQkJCQkJaWYoICooVUlOVCopIHVjUmVzZXRWYWx1ZSkKLQkJCQkJCVN0YXR1cyA9IHdybWFsdFdpdGhMb2NrKCBBZGFwdGVyLCBCQ01fR1BJT19PVVRQVVRfQ0xSX1JFRyAsIChQVUlOVCkgdWNSZXNldFZhbHVlLCBzaXplb2YoVUxPTkcpKTsKLQotCQkJCQlpZiggU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCQl7Ci0JCQkJCQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJXUk0gdG8gQkNNX0dQSU9fT1VUUFVUX0NMUl9SRUcgRmFpbGVkLiIgKTsKLQkJCQkJCXJldHVybiBTdGF0dXM7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiggcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT01hc2spCi0JCQkJewotCQkJCQlTdGF0dXMgPSByZG1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClHUElPX1BJTl9TVEFURV9SRUdJU1RFUiwgKFBVSU5UKXVjUmVzZXRWYWx1ZSwgc2l6ZW9mKFVJTlQpKTsKLQotCQkJCQlpZihTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJCXsKLQkJCQkJCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIlJETSB0byBHUElPX1BJTl9TVEFURV9SRUdJU1RFUiBGYWlsZWQuIik7Ci0JCQkJCQlyZXR1cm4gU3RhdHVzOwotCQkJCQl9Ci0KLQkJCQkJcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT1ZhbHVlID0gKCAqKFVJTlQqKXVjUmVzZXRWYWx1ZSAmCi0JCQkJCQkJCQkJCXBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9NYXNrKTsKLQkJCQl9Ci0KLQkJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmZ3Bpb19tdWx0aV9pbmZvLCBJb0J1ZmZlci5PdXRwdXRMZW5ndGgpOwotCQkJCWlmKFN0YXR1cykKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiRmFpbGVkIHdoaWxlIGNvcHlpbmcgQ29udGVudCB0byBJT0J1ZmVyIGZvciB1c2VyIHNwYWNlIGVycjolZCIsU3RhdHVzKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSU9DVExfQkNNX0dQSU9fTU9ERV9SRVFVRVNUOgotCQl7Ci0JCQlVQ0hBUiB1Y1Jlc2V0VmFsdWVbNF07Ci0JCQlHUElPX01VTFRJX01PREUgZ3Bpb19tdWx0aV9tb2RlW01BWF9JRFhdOwotCQkJUEdQSU9fTVVMVElfTU9ERSBwZ3Bpb19tdWx0aV9tb2RlID0gKCBQR1BJT19NVUxUSV9NT0RFKSBncGlvX211bHRpX21vZGU7Ci0KLQkJCWlmKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PVRSVUUpIHx8Ci0JCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT1UUlVFKSkKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihncGlvX211bHRpX21vZGUpKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZncGlvX211bHRpX21vZGUsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJCVN0YXR1cyA9IHJkbWFsdFdpdGhMb2NrKCBBZGFwdGVyLCAoIFVJTlQpIEdQSU9fTU9ERV9SRUdJU1RFUiwgKCBQVUlOVCkgdWNSZXNldFZhbHVlLCBzaXplb2YoIFVJTlQpKTsKLQkJCWlmKCBTVEFUVVNfU1VDQ0VTUyAhPSBTdGF0dXMpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJSZWFkIG9mIEdQSU9fTU9ERV9SRUdJU1RFUiBmYWlsZWQiKTsKLQkJCQlyZXR1cm4gU3RhdHVzOwotCQkJfQotCi0JCQkvL1ZhbGlkYXRpbmcgdGhlIHJlcXVlc3QKLQkJCWlmKElzUmVxR3Bpb0lzTGVkSW5OVk0oQWRhcHRlcixwZ3Bpb19tdWx0aV9tb2RlW1dJTUFYX0lEWF0udWlHUElPTWFzayk9PSBGQUxTRSkKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlNvcnJ5LCBSZXF1ZXN0ZWQgR1BJTzwweCVYPiBpcyBub3QgY29ycmVzcG9uZCB0byBOVk0gTEVEIGJpdCBtYXA8MHglWD4hISEiLHBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9NYXNrLEFkYXB0ZXItPmdwaW9CaXRNYXApOwotCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmKCBwZ3Bpb19tdWx0aV9tb2RlW1dJTUFYX0lEWF0udWlHUElPTWFzaykKLQkJCXsKLQkJCQkvKiB3cml0ZSBhbGwgT1VUJ3MgKDEncykgKi8KLQkJCQkqKCBVSU5UKikgdWNSZXNldFZhbHVlIHw9ICggcGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01vZGUgJgotCQkJCQkJCQlwZ3Bpb19tdWx0aV9tb2RlW1dJTUFYX0lEWF0udWlHUElPTWFzayk7Ci0JCQkJLyogd3JpdGUgYWxsIElOJ3MgKDAncykgKi8KLQkJCQkqKCBVSU5UKikgdWNSZXNldFZhbHVlICY9IH4oICggfnBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9Nb2RlKSAmCi0JCQkJCQkJCXBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9NYXNrKTsKLQotCQkJCS8qIEN1cnJlbnRseSBpbXBsZW1lbnRlZCByZXR1cm4gdGhlIG1vZGVzIG9mIGFsbCBHUElPJ3MKLQkJCQkgKiBlbHNlIG5lZWRzIHRvIGJpdCBBTkQgd2l0aCAgbWFzawotCQkJCSAqICovCi0JCQkJcGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01vZGUgPSAqKFVJTlQqKXVjUmVzZXRWYWx1ZTsKLQotCQkJCVN0YXR1cyA9IHdybWFsdFdpdGhMb2NrKCBBZGFwdGVyLCBHUElPX01PREVfUkVHSVNURVIgLCAoIFBVSU5UKSB1Y1Jlc2V0VmFsdWUsIHNpemVvZiggVUxPTkcpKTsKLQkJCQlpZiggU3RhdHVzID09IFNUQVRVU19TVUNDRVNTKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiV1JNIHRvIEdQSU9fTU9ERV9SRUdJU1RFUiBEb25lIik7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIldSTSB0byBHUElPX01PREVfUkVHSVNURVIgRmFpbGVkIik7Ci0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgLyogaWYgdWlHUElPTWFzayBpcyAwIHRoZW4gcmV0dXJuIG1vZGUgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiAqLwotCQkJewotCQkJCXBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9Nb2RlID0gKiggVUlOVCopIHVjUmVzZXRWYWx1ZTsKLQkJCX0KLQkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZncGlvX211bHRpX21vZGUsIElvQnVmZmVyLk91dHB1dExlbmd0aCk7Ci0JCQlpZihTdGF0dXMpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJGYWlsZWQgd2hpbGUgY29weWluZyBDb250ZW50IHRvIElPQnVmZXIgZm9yIHVzZXIgc3BhY2UgZXJyOiVkIixTdGF0dXMpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCisJaWYgKEZBTFNFID09IEFkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmUpIHsKKwkJc3dpdGNoIChjbWQpIHsKIAkJY2FzZSBJT0NUTF9NQUNfQUREUl9SRVE6CiAJCWNhc2UgSU9DVExfTElOS19SRVE6CiAJCWNhc2UgSU9DVExfQ01fUkVRVUVTVDoKIAkJY2FzZSBJT0NUTF9TU19JTkZPX1JFUToKIAkJY2FzZSBJT0NUTF9TRU5EX0NPTlRST0xfTUVTU0FHRToKIAkJY2FzZSBJT0NUTF9JRExFX1JFUToKLQkJewotCQkJUFZPSUQgcHZCdWZmZXI9TlVMTDsKKwkJY2FzZSBJT0NUTF9CQ01fR1BJT19TRVRfUkVRVUVTVDoKKwkJY2FzZSBJT0NUTF9CQ01fR1BJT19TVEFUVVNfUkVRVUVTVDoKKwkJCXJldHVybiAtRUFDQ0VTOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CiAKLQkJCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLwotCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7CisJU3RhdHVzID0gdmVuZG9yZXh0bklvY3RsKEFkYXB0ZXIsIGNtZCwgYXJnKTsKKwlpZiAoU3RhdHVzICE9IENPTlRJTlVFX0NPTU1PTl9QQVRIKQorCQlyZXR1cm4gU3RhdHVzOwogCi0JCQkvKiBGSVhNRTogZG9uJ3QgYWNjZXB0IGFueSBsZW5ndGggZnJvbSB1c2VyICovCi0JCQlwdkJ1ZmZlciA9IGttYWxsb2MoSW9CdWZmZXIuSW5wdXRMZW5ndGgsIEdGUF9LRVJORUwpOwotCQkJaWYoIXB2QnVmZmVyKQotCQkJCXJldHVybiAtRU5PTUVNOworCXN3aXRjaCAoY21kKSB7CisJLyogUmRtcyBmb3IgU3dpbiBJZGxlLi4uICovCisJY2FzZSBJT0NUTF9CQ01fUkVHSVNURVJfUkVBRF9QUklWQVRFOiB7CisJCVJETV9CVUZGRVIgIHNSZG1CdWZmZXIgPSB7MH07CisJCVBDSEFSIHRlbXBfYnVmZjsKKwkJVUlOVCBCdWZmbGVuOworCQl1MTYgdGVtcF92YWx1ZTsKIAotCQkJaWYoY29weV9mcm9tX3VzZXIocHZCdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0JCQl7CisJCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2Yoc1JkbUJ1ZmZlcikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnNSZG1CdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoID4gVVNIUlRfTUFYIHx8CisJCQlJb0J1ZmZlci5PdXRwdXRMZW5ndGggPT0gMCkgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlCdWZmbGVuID0gSW9CdWZmZXIuT3V0cHV0TGVuZ3RoOworCQl0ZW1wX3ZhbHVlID0gNCAtIChCdWZmbGVuICUgNCk7CisJCUJ1ZmZsZW4gKz0gdGVtcF92YWx1ZSAlIDQ7CisKKwkJdGVtcF9idWZmID0ga21hbGxvYyhCdWZmbGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF0ZW1wX2J1ZmYpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlTdGF0dXMgPSByZG1hbHQoQWRhcHRlciwgKFVJTlQpc1JkbUJ1ZmZlci5SZWdpc3RlciwKKwkJCQkoUFVJTlQpdGVtcF9idWZmLCBCdWZmbGVuKTsKKwkJaWYgKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgeworCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIHRlbXBfYnVmZiwgSW9CdWZmZXIuT3V0cHV0TGVuZ3RoKSkKIAkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCWtmcmVlKHB2QnVmZmVyKTsKKwkJfQorCisJCWtmcmVlKHRlbXBfYnVmZik7CisJCWJyZWFrOworCX0KKworCWNhc2UgSU9DVExfQkNNX1JFR0lTVEVSX1dSSVRFX1BSSVZBVEU6IHsKKwkJV1JNX0JVRkZFUiAgc1dybUJ1ZmZlciA9IHswfTsKKwkJVUlOVCB1aVRlbXBWYXIgPSAwOworCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKworCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2Yoc1dybUJ1ZmZlcikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKiBHZXQgV3JtQnVmZmVyIHN0cnVjdHVyZSAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoJnNXcm1CdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQl1aVRlbXBWYXIgPSBzV3JtQnVmZmVyLlJlZ2lzdGVyICYgRUVQUk9NX1JFSkVDVF9NQVNLOworCQlpZiAoISgoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyQ3VzdG9taXplKSAmIFZTR19NT0RFKSAmJgorCQkJKCh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMSkgfHwKKwkJCQkodWlUZW1wVmFyID09IEVFUFJPTV9SRUpFQ1RfUkVHXzIpIHx8CisJCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18zKSB8fAorCQkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfNCkpKSB7CisKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJFRVBST00gQWNjZXNzIERlbmllZCwgbm90IGluIFZTRyBNb2RlXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJU3RhdHVzID0gd3JtYWx0KEFkYXB0ZXIsIChVSU5UKXNXcm1CdWZmZXIuUmVnaXN0ZXIsCisJCQkJKFBVSU5UKXNXcm1CdWZmZXIuRGF0YSwgc2l6ZW9mKFVMT05HKSk7CisKKwkJaWYgKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiV1JNIERvbmVcbiIpOworCQl9IGVsc2UgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiV1JNIEZhaWxlZFxuIik7CisJCQlTdGF0dXMgPSAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgSU9DVExfQkNNX1JFR0lTVEVSX1JFQUQ6CisJY2FzZSBJT0NUTF9CQ01fRUVQUk9NX1JFR0lTVEVSX1JFQUQ6IHsKKwkJUkRNX0JVRkZFUiAgc1JkbUJ1ZmZlciA9IHswfTsKKwkJUENIQVIgdGVtcF9idWZmID0gTlVMTDsKKwkJVUlOVCB1aVRlbXBWYXIgPSAwOworCQlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CisJCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKKwkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJEZXZpY2UgaW4gSWRsZSBNb2RlLCBCbG9ja2luZyBSZG1zXG4iKTsKKwkJCXJldHVybiAtRUFDQ0VTOworCQl9CisKKwkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCisJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihzUmRtQnVmZmVyKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmc1JkbUJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCS8qIEZJWE1FOiBkb24ndCB0cnVzdCB1c2VyIHN1cHBsaWVkIGxlbmd0aCAqLworCQl0ZW1wX2J1ZmYgPSBrbWFsbG9jKElvQnVmZmVyLk91dHB1dExlbmd0aCwgR0ZQX0tFUk5FTCk7CisJCWlmICghdGVtcF9idWZmKQorCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCisJCWlmICgoKChVTE9ORylzUmRtQnVmZmVyLlJlZ2lzdGVyICYgMHgwRjAwMDAwMCkgIT0gMHgwRjAwMDAwMCkgfHwKKwkJCSgoVUxPTkcpc1JkbUJ1ZmZlci5SZWdpc3RlciAmIDB4MykpIHsKKworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIlJETSBEb25lIE9uIGludmFsaWQgQWRkcmVzcyA6ICV4IEFjY2VzcyBEZW5pZWQuXG4iLAorCQkJCQkoaW50KXNSZG1CdWZmZXIuUmVnaXN0ZXIpOworCisJCQlrZnJlZSh0ZW1wX2J1ZmYpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQl1aVRlbXBWYXIgPSBzUmRtQnVmZmVyLlJlZ2lzdGVyICYgRUVQUk9NX1JFSkVDVF9NQVNLOworCQlTdGF0dXMgPSByZG1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClzUmRtQnVmZmVyLlJlZ2lzdGVyLCAoUFVJTlQpdGVtcF9idWZmLCBJb0J1ZmZlci5PdXRwdXRMZW5ndGgpOworCisJCWlmIChTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgdGVtcF9idWZmLCBJb0J1ZmZlci5PdXRwdXRMZW5ndGgpKQorCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisKKwkJa2ZyZWUodGVtcF9idWZmKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgSU9DVExfQkNNX1JFR0lTVEVSX1dSSVRFOgorCWNhc2UgSU9DVExfQkNNX0VFUFJPTV9SRUdJU1RFUl9XUklURTogeworCQlXUk1fQlVGRkVSICBzV3JtQnVmZmVyID0gezB9OworCQlVSU5UIHVpVGVtcFZhciA9IDA7CisJCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAorCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKKworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkRldmljZSBpbiBJZGxlIE1vZGUsIEJsb2NraW5nIFdybXNcbiIpOworCQkJcmV0dXJuIC1FQUNDRVM7CisJCX0KKworCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKHNXcm1CdWZmZXIpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogR2V0IFdybUJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzV3JtQnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKCgoKFVMT05HKXNXcm1CdWZmZXIuUmVnaXN0ZXIgJiAweDBGMDAwMDAwKSAhPSAweDBGMDAwMDAwKSB8fAorCQkJKChVTE9ORylzV3JtQnVmZmVyLlJlZ2lzdGVyICYgMHgzKSkgeworCisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiV1JNIERvbmUgT24gaW52YWxpZCBBZGRyZXNzIDogJXggQWNjZXNzIERlbmllZC5cbiIsIChpbnQpc1dybUJ1ZmZlci5SZWdpc3Rlcik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXVpVGVtcFZhciA9IHNXcm1CdWZmZXIuUmVnaXN0ZXIgJiBFRVBST01fUkVKRUNUX01BU0s7CisJCWlmICghKChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJDdXN0b21pemUpICYgVlNHX01PREUpICYmCisJCQkJKCh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMSkgfHwKKwkJCQkodWlUZW1wVmFyID09IEVFUFJPTV9SRUpFQ1RfUkVHXzIpIHx8CisJCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18zKSB8fAorCQkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfNCkpICYmCisJCQkJKGNtZCA9PSBJT0NUTF9CQ01fUkVHSVNURVJfV1JJVEUpKSB7CisKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRUVQUk9NIEFjY2VzcyBEZW5pZWQsIG5vdCBpbiBWU0cgTW9kZVxuIik7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClzV3JtQnVmZmVyLlJlZ2lzdGVyLAorCQkJCQkoUFVJTlQpc1dybUJ1ZmZlci5EYXRhLCBzV3JtQnVmZmVyLkxlbmd0aCk7CisKKwkJaWYgKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiV1JNIERvbmVcbiIpOworCQl9IGVsc2UgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiV1JNIEZhaWxlZFxuIik7CisJCQlTdGF0dXMgPSAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIElPQ1RMX0JDTV9HUElPX1NFVF9SRVFVRVNUOiB7CisJCVVDSEFSIHVjUmVzZXRWYWx1ZVs0XTsKKwkJVUlOVCB2YWx1ZSA9IDA7CisJCVVJTlQgdWlCaXQgPSAwOworCQlVSU5UIHVpT3BlcmF0aW9uID0gMDsKKworCQlHUElPX0lORk8gICBncGlvX2luZm8gPSB7MH07CisJCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAorCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKKworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiR1BJTyBDYW4ndCBiZSBzZXQvY2xlYXIgaW4gTG93IHBvd2VyIE1vZGUiKTsKKwkJCXJldHVybiAtRUFDQ0VTOworCQl9CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKGdwaW9faW5mbykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmdwaW9faW5mbywgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXVpQml0ICA9IGdwaW9faW5mby51aUdwaW9OdW1iZXI7CisJCXVpT3BlcmF0aW9uID0gZ3Bpb19pbmZvLnVpR3Bpb1ZhbHVlOworCQl2YWx1ZSA9ICgxPDx1aUJpdCk7CisKKwkJaWYgKElzUmVxR3Bpb0lzTGVkSW5OVk0oQWRhcHRlciwgdmFsdWUpID09IEZBTFNFKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJTb3JyeSwgUmVxdWVzdGVkIEdQSU88MHglWD4gaXMgbm90IGNvcnJlc3BvbmQgdG8gTEVEICEhISIsIHZhbHVlKTsKKwkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFNldCAtIHNldHRpbmcgMSAqLworCQlpZiAodWlPcGVyYXRpb24pIHsKKwkJCS8qIFNldCB0aGUgZ3BpbyBvdXRwdXQgcmVnaXN0ZXIgKi8KKwkJCVN0YXR1cyA9IHdybWFsdFdpdGhMb2NrKEFkYXB0ZXIsIEJDTV9HUElPX09VVFBVVF9TRVRfUkVHLCAoUFVJTlQpKCZ2YWx1ZSksIHNpemVvZihVSU5UKSk7CisKKwkJCWlmIChTdGF0dXMgPT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJTZXQgdGhlIEdQSU8gYml0XG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiRmFpbGVkIHRvIHNldCB0aGUgJWR0aCBHUElPXG4iLCB1aUJpdCk7CiAJCQkJYnJlYWs7CiAJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBTZXQgdGhlIGdwaW8gb3V0cHV0IHJlZ2lzdGVyICovCisJCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLCBCQ01fR1BJT19PVVRQVVRfQ0xSX1JFRywgKFBVSU5UKSgmdmFsdWUpLCBzaXplb2YoVUlOVCkpOwogCi0JCQlkb3duKCZBZGFwdGVyLT5Mb3dQb3dlck1vZGVTeW5jKTsKLQkJCVN0YXR1cyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KEFkYXB0ZXItPmxvd3Bvd2VyX21vZGVfd2FpdF9xdWV1ZSwKLQkJCQkJCQkJCQkJCQkhQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSwKLQkJCQkJCQkJCQkJCQkoMSAqIEhaKSk7Ci0JCQlpZihTdGF0dXMgPT0gLUVSRVNUQVJUU1lTKQotCQkJCQlnb3RvIGNudHJsRW5kOwotCi0JCQlpZihBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlKQotCQkJewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiUHJlcGFyaW5nIElkbGUgTW9kZSBpcyBzdGlsbCBUcnVlIC0gSGVuY2UgUmVqZWN0aW5nIGNvbnRyb2wgbWVzc2FnZVxuIik7Ci0JCQkJU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkUgOwotCQkJCWdvdG8gY250cmxFbmQgOworCQkJaWYgKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlNldCB0aGUgR1BJTyBiaXRcbiIpOworCQkJfSBlbHNlIHsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJGYWlsZWQgdG8gY2xlYXIgdGhlICVkdGggR1BJT1xuIiwgdWlCaXQpOworCQkJCWJyZWFrOwogCQkJfQotCQkJU3RhdHVzID0gQ29weUJ1ZmZlclRvQ29udHJvbFBhY2tldChBZGFwdGVyLCAoUFZPSUQpcHZCdWZmZXIpOwotCQljbnRybEVuZDoKLQkJCXVwKCZBZGFwdGVyLT5Mb3dQb3dlck1vZGVTeW5jKTsKKwkJfQorCisJCVN0YXR1cyA9IHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKUdQSU9fTU9ERV9SRUdJU1RFUiwgKFBVSU5UKXVjUmVzZXRWYWx1ZSwgc2l6ZW9mKFVJTlQpKTsKKworCQlpZiAoU1RBVFVTX1NVQ0NFU1MgIT0gU3RhdHVzKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJCSJHUElPX01PREVfUkVHSVNURVIgcmVhZCBmYWlsZWQiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogU2V0IHRoZSBncGlvIG1vZGUgcmVnaXN0ZXIgdG8gb3V0cHV0ICovCisJCSooVUlOVCAqKXVjUmVzZXRWYWx1ZSB8PSAoMTw8dWlCaXQpOworCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLCBHUElPX01PREVfUkVHSVNURVIsCisJCQkJCShQVUlOVCl1Y1Jlc2V0VmFsdWUsIHNpemVvZihVSU5UKSk7CisKKwkJaWYgKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiU2V0IHRoZSBHUElPIHRvIG91dHB1dCBNb2RlXG4iKTsKKwkJfSBlbHNlIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkZhaWxlZCB0byBwdXQgR1BJTyBpbiBPdXRwdXQgTW9kZVxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKwlicmVhazsKKworCWNhc2UgQkNNX0xFRF9USFJFQURfU1RBVEVfQ0hBTkdFX1JFUTogeworCQlVU0VSX1RIUkVBRF9SRVEgdGhyZWFkUmVxID0gezB9OworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJVc2VyIG1hZGUgTEVEIHRocmVhZCBJbkFjdGl2ZSIpOworCisJCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAorCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKKworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiR1BJTyBDYW4ndCBiZSBzZXQvY2xlYXIgaW4gTG93IHBvd2VyIE1vZGUiKTsKKwkJCVN0YXR1cyA9IC1FQUNDRVM7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZih0aHJlYWRSZXEpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0aHJlYWRSZXEsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkvKiBpZiBMRUQgdGhyZWFkIGlzIHJ1bm5pbmcoQWN0aXZlbHkgb3IgSW5hY3RpdmVseSkgc2V0IGl0IHN0YXRlIHRvIG1ha2UgaW5hY3RpdmUgKi8KKwkJaWYgKEFkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nKSB7CisJCQlpZiAodGhyZWFkUmVxLlRocmVhZFN0YXRlID09IExFRF9USFJFQURfQUNUSVZBVElPTl9SRVEpIHsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJBY3RpdmF0aW5nIHRocmVhZCByZXEiKTsKKwkJCQlBZGFwdGVyLT5Ecml2ZXJTdGF0ZSA9IExFRF9USFJFQURfQUNUSVZFOworCQkJfSBlbHNlIHsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJEZUFjdGl2YXRpbmcgVGhyZWFkIHJlcS4uLi4uIik7CisJCQkJQWRhcHRlci0+RHJpdmVyU3RhdGUgPSBMRURfVEhSRUFEX0lOQUNUSVZFOworCQkJfQorCisJCQkvKiBzaWduYWwgdGhyZWFkLiAqLworCQkJd2FrZV91cCgmQWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50KTsKKwkJfQorCX0KKwlicmVhazsKKworCWNhc2UgSU9DVExfQkNNX0dQSU9fU1RBVFVTX1JFUVVFU1Q6IHsKKwkJVUxPTkcgdWlCaXQgPSAwOworCQlVQ0hBUiB1Y1JlYWRbNF07CisJCUdQSU9fSU5GTyAgIGdwaW9faW5mbyA9IHswfTsKKworCQlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CisJCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKKwkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKGdwaW9faW5mbykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmdwaW9faW5mbywgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXVpQml0ID0gZ3Bpb19pbmZvLnVpR3Bpb051bWJlcjsKKworCQkvKiBTZXQgdGhlIGdwaW8gb3V0cHV0IHJlZ2lzdGVyICovCisJCVN0YXR1cyA9IHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKUdQSU9fUElOX1NUQVRFX1JFR0lTVEVSLAorCQkJCQkoUFVJTlQpdWNSZWFkLCBzaXplb2YoVUlOVCkpOworCisJCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJSRE0gRmFpbGVkXG4iKTsKKwkJCXJldHVybiBTdGF0dXM7CisJCX0KKwl9CisJYnJlYWs7CisKKwljYXNlIElPQ1RMX0JDTV9HUElPX01VTFRJX1JFUVVFU1Q6IHsKKwkJVUNIQVIgdWNSZXNldFZhbHVlWzRdOworCQlHUElPX01VTFRJX0lORk8gZ3Bpb19tdWx0aV9pbmZvW01BWF9JRFhdOworCQlQR1BJT19NVUxUSV9JTkZPIHBncGlvX211bHRpX2luZm8gPSAoUEdQSU9fTVVMVElfSU5GTylncGlvX211bHRpX2luZm87CisKKwkJbWVtc2V0KHBncGlvX211bHRpX2luZm8sIDAsIE1BWF9JRFggKiBzaXplb2YoR1BJT19NVUxUSV9JTkZPKSk7CisKKwkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAorCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihncGlvX211bHRpX2luZm8pKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZncGlvX211bHRpX2luZm8sIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoSXNSZXFHcGlvSXNMZWRJbk5WTShBZGFwdGVyLCBwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzaykgPT0gRkFMU0UpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCQkJIlNvcnJ5LCBSZXF1ZXN0ZWQgR1BJTzwweCVYPiBpcyBub3QgY29ycmVzcG9uZCB0byBOVk0gTEVEIGJpdCBtYXA8MHglWD4hISEiLAorCQkJCQlwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzaywgQWRhcHRlci0+Z3Bpb0JpdE1hcCk7CisJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBTZXQgdGhlIGdwaW8gb3V0cHV0IHJlZ2lzdGVyICovCisJCWlmICgocGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT01hc2spICYKKwkJCShwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPQ29tbWFuZCkpIHsKKwkJCS8qIFNldCAxJ3MgaW4gR1BJTyBPVVRQVVQgUkVHSVNURVIgKi8KKwkJCSooVUlOVCAqKXVjUmVzZXRWYWx1ZSA9ICBwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzayAmCisJCQkJcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT0NvbW1hbmQgJgorCQkJCXBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9WYWx1ZTsKKworCQkJaWYgKCooVUlOVCAqKSB1Y1Jlc2V0VmFsdWUpCisJCQkJU3RhdHVzID0gd3JtYWx0V2l0aExvY2soQWRhcHRlciwgQkNNX0dQSU9fT1VUUFVUX1NFVF9SRUcsCisJCQkJCQkJKFBVSU5UKXVjUmVzZXRWYWx1ZSwgc2l6ZW9mKFVMT05HKSk7CisKKwkJCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiV1JNIHRvIEJDTV9HUElPX09VVFBVVF9TRVRfUkVHIEZhaWxlZC4iKTsKKwkJCQlyZXR1cm4gU3RhdHVzOworCQkJfQorCisJCQkvKiBDbGVhciB0byAwJ3MgaW4gR1BJTyBPVVRQVVQgUkVHSVNURVIgKi8KKwkJCSooVUlOVCAqKXVjUmVzZXRWYWx1ZSA9IChwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPTWFzayAmCisJCQkJCQlwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPQ29tbWFuZCAmCisJCQkJCQkofihwZ3Bpb19tdWx0aV9pbmZvW1dJTUFYX0lEWF0udWlHUElPVmFsdWUpKSk7CisKKwkJCWlmICgqKFVJTlQgKikgdWNSZXNldFZhbHVlKQorCQkJCVN0YXR1cyA9IHdybWFsdFdpdGhMb2NrKEFkYXB0ZXIsIEJDTV9HUElPX09VVFBVVF9DTFJfUkVHLCAoUFVJTlQpdWNSZXNldFZhbHVlLCBzaXplb2YoVUxPTkcpKTsKKworCQkJaWYgKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJXUk0gdG8gQkNNX0dQSU9fT1VUUFVUX0NMUl9SRUcgRmFpbGVkLiIpOworCQkJCXJldHVybiBTdGF0dXM7CisJCQl9CisJCX0KKworCQlpZiAocGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT01hc2spIHsKKwkJCVN0YXR1cyA9IHJkbWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKUdQSU9fUElOX1NUQVRFX1JFR0lTVEVSLCAoUFVJTlQpdWNSZXNldFZhbHVlLCBzaXplb2YoVUlOVCkpOworCisJCQlpZiAoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIlJETSB0byBHUElPX1BJTl9TVEFURV9SRUdJU1RFUiBGYWlsZWQuIik7CisJCQkJcmV0dXJuIFN0YXR1czsKKwkJCX0KKworCQkJcGdwaW9fbXVsdGlfaW5mb1tXSU1BWF9JRFhdLnVpR1BJT1ZhbHVlID0gKCooVUlOVCAqKXVjUmVzZXRWYWx1ZSAmCisJCQkJCQkJCXBncGlvX211bHRpX2luZm9bV0lNQVhfSURYXS51aUdQSU9NYXNrKTsKKwkJfQorCisJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZncGlvX211bHRpX2luZm8sIElvQnVmZmVyLk91dHB1dExlbmd0aCk7CisJCWlmIChTdGF0dXMpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJCSJGYWlsZWQgd2hpbGUgY29weWluZyBDb250ZW50IHRvIElPQnVmZXIgZm9yIHVzZXIgc3BhY2UgZXJyOiVkIiwgU3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWJyZWFrOworCisJY2FzZSBJT0NUTF9CQ01fR1BJT19NT0RFX1JFUVVFU1Q6IHsKKwkJVUNIQVIgdWNSZXNldFZhbHVlWzRdOworCQlHUElPX01VTFRJX01PREUgZ3Bpb19tdWx0aV9tb2RlW01BWF9JRFhdOworCQlQR1BJT19NVUxUSV9NT0RFIHBncGlvX211bHRpX21vZGUgPSAoUEdQSU9fTVVMVElfTU9ERSlncGlvX211bHRpX21vZGU7CisKKwkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAorCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCA+IHNpemVvZihncGlvX211bHRpX21vZGUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZncGlvX211bHRpX21vZGUsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlTdGF0dXMgPSByZG1hbHRXaXRoTG9jayhBZGFwdGVyLCAoVUlOVClHUElPX01PREVfUkVHSVNURVIsIChQVUlOVCl1Y1Jlc2V0VmFsdWUsIHNpemVvZihVSU5UKSk7CisKKwkJaWYgKFNUQVRVU19TVUNDRVNTICE9IFN0YXR1cykgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIlJlYWQgb2YgR1BJT19NT0RFX1JFR0lTVEVSIGZhaWxlZCIpOworCQkJcmV0dXJuIFN0YXR1czsKKwkJfQorCisJCS8qIFZhbGlkYXRpbmcgdGhlIHJlcXVlc3QgKi8KKwkJaWYgKElzUmVxR3Bpb0lzTGVkSW5OVk0oQWRhcHRlciwgcGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01hc2spID09IEZBTFNFKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJCSJTb3JyeSwgUmVxdWVzdGVkIEdQSU88MHglWD4gaXMgbm90IGNvcnJlc3BvbmQgdG8gTlZNIExFRCBiaXQgbWFwPDB4JVg+ISEhIiwKKwkJCQkJcGdwaW9fbXVsdGlfbW9kZVtXSU1BWF9JRFhdLnVpR1BJT01hc2ssIEFkYXB0ZXItPmdwaW9CaXRNYXApOworCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9NYXNrKSB7CisJCQkvKiB3cml0ZSBhbGwgT1VUJ3MgKDEncykgKi8KKwkJCSooVUlOVCAqKSB1Y1Jlc2V0VmFsdWUgfD0gKHBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9Nb2RlICYKKwkJCQkJCXBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9NYXNrKTsKKworCQkJLyogd3JpdGUgYWxsIElOJ3MgKDAncykgKi8KKwkJCSooVUlOVCAqKSB1Y1Jlc2V0VmFsdWUgJj0gfigofnBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9Nb2RlKSAmCisJCQkJCQlwZ3Bpb19tdWx0aV9tb2RlW1dJTUFYX0lEWF0udWlHUElPTWFzayk7CisKKwkJCS8qIEN1cnJlbnRseSBpbXBsZW1lbnRlZCByZXR1cm4gdGhlIG1vZGVzIG9mIGFsbCBHUElPJ3MKKwkJCSAqIGVsc2UgbmVlZHMgdG8gYml0IEFORCB3aXRoICBtYXNrCisJCQkgKi8KKwkJCXBncGlvX211bHRpX21vZGVbV0lNQVhfSURYXS51aUdQSU9Nb2RlID0gKihVSU5UICopdWNSZXNldFZhbHVlOworCisJCQlTdGF0dXMgPSB3cm1hbHRXaXRoTG9jayhBZGFwdGVyLCBHUElPX01PREVfUkVHSVNURVIsIChQVUlOVCl1Y1Jlc2V0VmFsdWUsIHNpemVvZihVTE9ORykpOworCQkJaWYgKFN0YXR1cyA9PSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCQkJCSJXUk0gdG8gR1BJT19NT0RFX1JFR0lTVEVSIERvbmUiKTsKKwkJCX0gZWxzZSB7CisJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkJCSJXUk0gdG8gR1BJT19NT0RFX1JFR0lTVEVSIEZhaWxlZCIpOworCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisvKiBpZiB1aUdQSU9NYXNrIGlzIDAgdGhlbiByZXR1cm4gbW9kZSByZWdpc3RlciBjb25maWd1cmF0aW9uICovCisJCQlwZ3Bpb19tdWx0aV9tb2RlW1dJTUFYX0lEWF0udWlHUElPTW9kZSA9ICooVUlOVCAqKXVjUmVzZXRWYWx1ZTsKKwkJfQorCisJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZncGlvX211bHRpX21vZGUsIElvQnVmZmVyLk91dHB1dExlbmd0aCk7CisJCWlmIChTdGF0dXMpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJCSJGYWlsZWQgd2hpbGUgY29weWluZyBDb250ZW50IHRvIElPQnVmZXIgZm9yIHVzZXIgc3BhY2UgZXJyOiVkIiwgU3RhdHVzKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWJyZWFrOworCisJY2FzZSBJT0NUTF9NQUNfQUREUl9SRVE6CisJY2FzZSBJT0NUTF9MSU5LX1JFUToKKwljYXNlIElPQ1RMX0NNX1JFUVVFU1Q6CisJY2FzZSBJT0NUTF9TU19JTkZPX1JFUToKKwljYXNlIElPQ1RMX1NFTkRfQ09OVFJPTF9NRVNTQUdFOgorCWNhc2UgSU9DVExfSURMRV9SRVE6IHsKKwkJUFZPSUQgcHZCdWZmZXIgPSBOVUxMOworCisJCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPCBzaXplb2Yoc3RydWN0IGxpbmtfcmVxdWVzdCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBNQVhfQ05UTF9QS1RfU0laRSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXB2QnVmZmVyID0ga21hbGxvYyhJb0J1ZmZlci5JbnB1dExlbmd0aCwgR0ZQX0tFUk5FTCk7CisJCWlmICghcHZCdWZmZXIpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIocHZCdWZmZXIsIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpIHsKKwkJCVN0YXR1cyA9IC1FRkFVTFQ7CiAJCQlrZnJlZShwdkJ1ZmZlcik7CiAJCQlicmVhazsKIAkJfQotCQljYXNlIElPQ1RMX0JDTV9CVUZGRVJfRE9XTkxPQURfU1RBUlQ6Ci0JCXsKLQkJCUlOVCBOVk1BY2Nlc3MgPSBkb3duX3RyeWxvY2soJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spIDsKLQkJCWlmKE5WTUFjY2VzcykKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIiBJT0NUTF9CQ01fQ0hJUF9SRVNFVCBub3QgYWxsb3dlZCBhcyBFRVBST00gUmVhZC9Xcml0ZSBpcyBpbiBwcm9ncmVzc1xuIik7Ci0JCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCQl9Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJTdGFydGluZyB0aGUgZmlybXdhcmUgZG93bmxvYWQgUElEID0weCV4ISEhIVxuIiwgY3VycmVudC0+cGlkKTsKLQkJICAgIGlmKCFkb3duX3RyeWxvY2soJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpKQotCQkJewotCQkJCUFkYXB0ZXItPmJCaW5Eb3dubG9hZGVkPUZBTFNFOwotCQkJCUFkYXB0ZXItPmZ3X2Rvd25sb2FkX3Byb2Nlc3NfcGlkPWN1cnJlbnQtPnBpZDsKLQkJCQlBZGFwdGVyLT5iQ2ZnRG93bmxvYWRlZD1GQUxTRTsKLQkJCQlBZGFwdGVyLT5md19kb3dubG9hZF9kb25lPUZBTFNFOwotCQkJCW5ldGlmX2NhcnJpZXJfb2ZmKEFkYXB0ZXItPmRldik7Ci0JCQkJbmV0aWZfc3RvcF9xdWV1ZShBZGFwdGVyLT5kZXYpOwotCQkJCVN0YXR1cyA9IHJlc2V0X2NhcmRfcHJvYyhBZGFwdGVyKTsKLQkJCQlpZihTdGF0dXMpCi0JCQkJewotCQkJCQlwcl9lcnIoUEZYICIlczogcmVzZXRfY2FyZF9wcm9jIEZhaWxlZCFcbiIsIEFkYXB0ZXItPmRldi0+bmFtZSk7Ci0JCQkJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKLQkJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJbWRlbGF5KDEwKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKIAotCQkJCVN0YXR1cyA9IC1FQlVTWTsKKwkJZG93bigmQWRhcHRlci0+TG93UG93ZXJNb2RlU3luYyk7CisJCVN0YXR1cyA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KEFkYXB0ZXItPmxvd3Bvd2VyX21vZGVfd2FpdF9xdWV1ZSwKKwkJCQkJCQkhQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSwKKwkJCQkJCQkoMSAqIEhaKSk7CisJCWlmIChTdGF0dXMgPT0gLUVSRVNUQVJUU1lTKQorCQkJZ290byBjbnRybEVuZDsKIAotCQkJfQotCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJYnJlYWs7CisJCWlmIChBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsCisJCQkJCSJQcmVwYXJpbmcgSWRsZSBNb2RlIGlzIHN0aWxsIFRydWUgLSBIZW5jZSBSZWplY3RpbmcgY29udHJvbCBtZXNzYWdlXG4iKTsKKwkJCVN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCQkJZ290byBjbnRybEVuZDsKIAkJfQotCQljYXNlIElPQ1RMX0JDTV9CVUZGRVJfRE9XTkxPQUQ6Ci0JCQl7Ci0JCQkJRklSTVdBUkVfSU5GTyAJKnBzRndJbmZvID0gTlVMTDsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJTdGFydGluZyB0aGUgZmlybXdhcmUgZG93bmxvYWQgUElEID0weCV4ISEhIVxuIiwgY3VycmVudC0+cGlkKTsKLQkJCWRvewotCQkJCWlmKCFkb3duX3RyeWxvY2soJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiSW52YWxpZCB3YXkgdG8gZG93bmxvYWQgYnVmZmVyLiBVc2UgU3RhcnQgYW5kIHRoZW4gY2FsbCB0aGlzISEhXG4iKTsKLQkJCQkJU3RhdHVzPS1FSU5WQUw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KKwkJU3RhdHVzID0gQ29weUJ1ZmZlclRvQ29udHJvbFBhY2tldChBZGFwdGVyLCAoUFZPSUQpcHZCdWZmZXIpOwogCi0JCQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0JCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOworY250cmxFbmQ6CisJCXVwKCZBZGFwdGVyLT5Mb3dQb3dlck1vZGVTeW5jKTsKKwkJa2ZyZWUocHZCdWZmZXIpOworCQlicmVhazsKKwl9CiAKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJMZW5ndGggZm9yIEZXIERMRCBpcyA6ICVseFxuIiwKLQkJCQkJCQkJCQlJb0J1ZmZlci5JbnB1dExlbmd0aCk7Ci0KLQkJCQlpZiAoSW9CdWZmZXIuSW5wdXRMZW5ndGggPiBzaXplb2YoRklSTVdBUkVfSU5GTykpCi0JCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQkJcHNGd0luZm8gPSBrbWFsbG9jKHNpemVvZigqcHNGd0luZm8pLCBHRlBfS0VSTkVMKTsKLQkJCQlpZighcHNGd0luZm8pCi0JCQkJCXJldHVybiAtRU5PTUVNOwotCi0JCQkJaWYoY29weV9mcm9tX3VzZXIocHNGd0luZm8sIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCi0JCQkJaWYoIXBzRndJbmZvLT5wdk1hcHBlZEZpcm13YXJlQWRkcmVzcyB8fAotCQkJCQkJKHBzRndJbmZvLT51MzJGaXJtd2FyZUxlbmd0aCA9PSAwKSkKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIlNvbWV0aGluZyBlbHNlIGlzIHdyb25nICVsdVxuIiwKLQkJCQkJcHNGd0luZm8tPnUzMkZpcm13YXJlTGVuZ3RoKTsKLQkJCQkJU3RhdHVzID0gLUVJTlZBTDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCVN0YXR1cyA9IGJjbV9pb2N0bF9md19kb3dubG9hZChBZGFwdGVyLCBwc0Z3SW5mbyk7Ci0JCQkJaWYoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCXsKLQkJCQkJaWYocHNGd0luZm8tPnUzMlN0YXJ0aW5nQWRkcmVzcz09Q09ORklHX0JFR0lOX0FERFIpCi0JCQkJCXsKLQkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIklPQ1RMOiBDb25maWd1cmF0aW9uIEZpbGUgVXBsb2FkIEZhaWxlZFxuIik7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJJT0NUTDogRmlybXdhcmUgRmlsZSBVcGxvYWQgRmFpbGVkXG4iKTsKLQkJCQkJfQotCQkJCQkvL3VwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKLQotCQkJCQlpZihBZGFwdGVyLT5MRURJbmZvLmxlZF90aHJlYWRfcnVubmluZyAmIEJDTV9MRURfVEhSRUFEX1JVTk5JTkdfQUNUSVZFTFkpCi0JCQkJCXsKLQkJCQkJCUFkYXB0ZXItPkRyaXZlclN0YXRlID0gRFJJVkVSX0lOSVQ7Ci0JCQkJCQlBZGFwdGVyLT5MRURJbmZvLmJMZWRJbml0RG9uZSA9IEZBTFNFOwotCQkJCQkJd2FrZV91cCgmQWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlicmVhayA7Ci0JCQkgIH13aGlsZSgwKTsKLQotCQkJICBpZihTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMOiBGaXJtd2FyZSBGaWxlIFVwbG9hZGVkXG4iKTsKLQkJCQlrZnJlZShwc0Z3SW5mbyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCWNhc2UgSU9DVExfQkNNX0JVRkZFUl9ET1dOTE9BRF9TVE9QOgotCQl7Ci0JCQlJTlQgTlZNQWNjZXNzID0gZG93bl90cnlsb2NrKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCWlmKE5WTUFjY2VzcykKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICIgRlcgZG93bmxvYWQgYmxvY2tlZCBhcyBFRVBST00gUmVhZC9Xcml0ZSBpcyBpbiBwcm9ncmVzc1xuIik7Ci0JCQkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOwotCQkJCXJldHVybiAtRUFDQ0VTOwotCQkJfQotCQkJaWYoZG93bl90cnlsb2NrKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKSkKLQkJCXsKLQkJCQlBZGFwdGVyLT5iQmluRG93bmxvYWRlZD1UUlVFOwotCQkJCUFkYXB0ZXItPmJDZmdEb3dubG9hZGVkPVRSVUU7Ci0JCQkJYXRvbWljX3NldCgmQWRhcHRlci0+Q3Vyck51bUZyZWVUeERlc2MsIDApOwotCi0JCQkJQWRhcHRlci0+Q3Vyck51bVJlY3ZEZXNjcz0wOwotCQkJCUFkYXB0ZXItPmRvd25sb2FkRERSID0gMDsKLQotCQkJCS8vc2V0dGluZyB0aGUgTWlwcyB0byBSdW4KLQkJCQlTdGF0dXMgPSBydW5fY2FyZF9wcm9jKEFkYXB0ZXIpOwotCQkJCWlmKFN0YXR1cykKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkZpcm0gRG93bmxvYWQgRmFpbGVkXG4iKTsKLQkJCQkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOwotCQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiRmlybSBEb3dubG9hZCBPdmVyLi4uXG4iKTsKLQkJCQltZGVsYXkoMTApOwotCQkJCS8qIFdhaXQgZm9yIE1haWxCb3ggSW50ZXJydXB0ICovCi0JCQkJaWYoU3RhcnRJbnRlcnJ1cHRVcmIoKFBTX0lOVEVSRkFDRV9BREFQVEVSKUFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlcikpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJVbmFibGUgdG8gc2VuZCBpbnRlcnJ1cHQuLi5cbiIpOwotCQkJCX0KLQkJCQl0aW1lb3V0ID0gNSpIWjsKLQkJCQlBZGFwdGVyLT53YWl0aW5nX3RvX2Z3X2Rvd25sb2FkX2RvbmUgPSBGQUxTRTsKLQkJCQl3YWl0X2V2ZW50X3RpbWVvdXQoQWRhcHRlci0+aW9jdGxfZndfZG5sZF93YWl0X3F1ZXVlLAotCQkJCQlBZGFwdGVyLT53YWl0aW5nX3RvX2Z3X2Rvd25sb2FkX2RvbmUsIHRpbWVvdXQpOwotCQkJCUFkYXB0ZXItPmZ3X2Rvd25sb2FkX3Byb2Nlc3NfcGlkPUlOVkFMSURfUElEOwotCQkJCUFkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmU9VFJVRTsKLQkJCQlhdG9taWNfc2V0KCZBZGFwdGVyLT5DdXJyTnVtRnJlZVR4RGVzYywgMCk7Ci0JCQkJQWRhcHRlci0+Q3Vyck51bVJlY3ZEZXNjcyA9IDA7Ci0JCQkJQWRhcHRlci0+UHJldk51bVJlY3ZEZXNjcyA9IDA7Ci0JCQkJYXRvbWljX3NldCgmQWRhcHRlci0+Y250cmxwa3RDbnQsMCk7Ci0gICAgICAgICAgICAgICAgQWRhcHRlci0+TGlua1VwU3RhdHVzID0gMDsKLSAgICAgICAgICAgICAgICBBZGFwdGVyLT5MaW5rU3RhdHVzID0gMDsKLQotCQkJCWlmKEFkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nICYgQkNNX0xFRF9USFJFQURfUlVOTklOR19BQ1RJVkVMWSkKLQkJCQl7Ci0JCQkJCUFkYXB0ZXItPkRyaXZlclN0YXRlID0gRldfRE9XTkxPQURfRE9ORTsKLQkJCQkJd2FrZV91cCgmQWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50KTsKLQkJCQl9Ci0KLQkJCQlpZighdGltZW91dCkKLQkJCQl7Ci0JCQkJCVN0YXR1cyA9IC1FTk9ERVY7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJICAgCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQl9Ci0JCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7Ci0JCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQlicmVhazsKKwljYXNlIElPQ1RMX0JDTV9CVUZGRVJfRE9XTkxPQURfU1RBUlQ6IHsKKwkJSU5UIE5WTUFjY2VzcyA9IGRvd25fdHJ5bG9jaygmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCWlmIChOVk1BY2Nlc3MpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwKKwkJCQkJIklPQ1RMX0JDTV9DSElQX1JFU0VUIG5vdCBhbGxvd2VkIGFzIEVFUFJPTSBSZWFkL1dyaXRlIGlzIGluIHByb2dyZXNzXG4iKTsKKwkJCXJldHVybiAtRUFDQ0VTOwogCQl9Ci0JCWNhc2UgSU9DVExfQkVfQlVDS0VUX1NJWkU6Ci0JCQlTdGF0dXMgPSAwOwotCQkJaWYgKGdldF91c2VyKEFkYXB0ZXItPkJFQnVja2V0U2l6ZSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJnKSkKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJYnJlYWs7CiAKLQkJY2FzZSBJT0NUTF9SVFBTX0JVQ0tFVF9TSVpFOgotCQkJU3RhdHVzID0gMDsKLQkJCWlmIChnZXRfdXNlcihBZGFwdGVyLT5ydFBTQnVja2V0U2l6ZSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJnKSkKLQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCWNhc2UgSU9DVExfQ0hJUF9SRVNFVDoKLQkgICAgewotCQkJSU5UIE5WTUFjY2VzcyA9IGRvd25fdHJ5bG9jaygmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQlpZihOVk1BY2Nlc3MpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiIElPQ1RMX0JDTV9DSElQX1JFU0VUIG5vdCBhbGxvd2VkIGFzIEVFUFJPTSBSZWFkL1dyaXRlIGlzIGluIHByb2dyZXNzXG4iKTsKLQkJCQlyZXR1cm4gLUVBQ0NFUzsKLQkJCX0KLQkJCWRvd24oJkFkYXB0ZXItPlJ4QXBwQ29udHJvbFF1ZXVlbG9jayk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJIlN0YXJ0aW5nIHRoZSBmaXJtd2FyZSBkb3dubG9hZCBQSUQgPTB4JXghISEhXG4iLCBjdXJyZW50LT5waWQpOworCisJCWlmICghZG93bl90cnlsb2NrKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKSkgeworCQkJQWRhcHRlci0+YkJpbkRvd25sb2FkZWQgPSBGQUxTRTsKKwkJCUFkYXB0ZXItPmZ3X2Rvd25sb2FkX3Byb2Nlc3NfcGlkID0gY3VycmVudC0+cGlkOworCQkJQWRhcHRlci0+YkNmZ0Rvd25sb2FkZWQgPSBGQUxTRTsKKwkJCUFkYXB0ZXItPmZ3X2Rvd25sb2FkX2RvbmUgPSBGQUxTRTsKKwkJCW5ldGlmX2NhcnJpZXJfb2ZmKEFkYXB0ZXItPmRldik7CisJCQluZXRpZl9zdG9wX3F1ZXVlKEFkYXB0ZXItPmRldik7CiAJCQlTdGF0dXMgPSByZXNldF9jYXJkX3Byb2MoQWRhcHRlcik7Ci0JCQlmbHVzaEFsbEFwcFEoKTsKLQkJCXVwKCZBZGFwdGVyLT5SeEFwcENvbnRyb2xRdWV1ZWxvY2spOwotCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJUmVzZXRDb3VudGVycyhBZGFwdGVyKTsKLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgSU9DVExfUU9TX1RIUkVTSE9MRDoKLQkJewotCQkJVVNIT1JUIHVpTG9vcEluZGV4OwotCi0JCQlTdGF0dXMgPSAwOwotCQkJZm9yICh1aUxvb3BJbmRleCA9IDA7IHVpTG9vcEluZGV4IDwgTk9fT0ZfUVVFVUVTOyB1aUxvb3BJbmRleCsrKSB7Ci0JCQkJaWYgKGdldF91c2VyKEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51aVRocmVzaG9sZCwKLQkJCQkJCSh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZykpIHsKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQljYXNlIElPQ1RMX0RVTVBfUEFDS0VUX0lORk86Ci0KLQkJCUR1bXBQYWNrSW5mbyhBZGFwdGVyKTsKLSAgICAgICAgIAlEdW1wUGhzUnVsZXMoJkFkYXB0ZXItPnN0QkNNUGhzQ29udGV4dCk7Ci0JCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSU9DVExfR0VUX1BBQ0tfSU5GTzoKLQkJCWlmKGNvcHlfdG9fdXNlcihhcmdwLCAmQWRhcHRlci0+UGFja0luZm8sIHNpemVvZihQYWNrZXRJbmZvKSpOT19PRl9RVUVVRVMpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JCQlicmVhazsKLQkJY2FzZSBJT0NUTF9CQ01fU1dJVENIX1RSQU5TRkVSX01PREU6Ci0JCXsKLQkJCVVJTlQgdWlEYXRhID0gMDsKLQkJCWlmKGNvcHlfZnJvbV91c2VyKCZ1aURhdGEsIGFyZ3AsIHNpemVvZihVSU5UKSkpCi0JCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJCWlmKHVpRGF0YSkJLyogQWxsb3cgQWxsIFBhY2tldHMgKi8KLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9TV0lUQ0hfVFJBTlNGRVJfTU9ERTogRVRIX1BBQ0tFVF9UVU5ORUxJTkdfTU9ERVxuIik7Ci0JCQkJQWRhcHRlci0+VHJhbnNmZXJNb2RlID0gRVRIX1BBQ0tFVF9UVU5ORUxJTkdfTU9ERTsKLQkJCX0KLQkJCWVsc2UJLyogQWxsb3cgSVAgb25seSBQYWNrZXRzICovCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTF9CQ01fU1dJVENIX1RSQU5TRkVSX01PREU6IElQX1BBQ0tFVF9PTkxZX01PREVcbiIpOwotCQkJCUFkYXB0ZXItPlRyYW5zZmVyTW9kZSA9IElQX1BBQ0tFVF9PTkxZX01PREU7Ci0JCQl9Ci0JCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJY2FzZSBJT0NUTF9CQ01fR0VUX0RSSVZFUl9WRVJTSU9OOgotCQl7Ci0JCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KLQkJCWlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCi0JCQlpZihjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCBWRVJfRklMRVZFUlNJT05fU1RSLCBJb0J1ZmZlci5PdXRwdXRMZW5ndGgpKQotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JCQlicmVhazsKLQkJfQotCQljYXNlIElPQ1RMX0JDTV9HRVRfQ1VSUkVOVF9TVEFUVVM6Ci0JCXsKLQkJCUxJTktfU1RBVEUgbGlua19zdGF0ZTsKLQotCQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0JCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJjb3B5X2Zyb21fdXNlciBmYWlsZWQuLlxuIik7Ci0JCQkJU3RhdHVzID0gLUVGQVVMVDsKKwkJCWlmIChTdGF0dXMpIHsKKwkJCQlwcl9lcnIoUEZYICIlczogcmVzZXRfY2FyZF9wcm9jIEZhaWxlZCFcbiIsIEFkYXB0ZXItPmRldi0+bmFtZSk7CisJCQkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOworCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggIT0gc2l6ZW9mKGxpbmtfc3RhdGUpKSB7CisJCQltZGVsYXkoMTApOworCQl9IGVsc2UgeworCQkJU3RhdHVzID0gLUVCVVNZOworCQl9CisKKwkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQlicmVhazsKKwl9CisKKwljYXNlIElPQ1RMX0JDTV9CVUZGRVJfRE9XTkxPQUQ6IHsKKwkJRklSTVdBUkVfSU5GTyAqcHNGd0luZm8gPSBOVUxMOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiU3RhcnRpbmcgdGhlIGZpcm13YXJlIGRvd25sb2FkIFBJRCA9MHgleCEhISFcbiIsIGN1cnJlbnQtPnBpZCk7CisJCWRvIHsKKwkJCWlmICghZG93bl90cnlsb2NrKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKSkgeworCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsCisJCQkJCQkiSW52YWxpZCB3YXkgdG8gZG93bmxvYWQgYnVmZmVyLiBVc2UgU3RhcnQgYW5kIHRoZW4gY2FsbCB0aGlzISEhXG4iKTsKIAkJCQlTdGF0dXMgPSAtRUlOVkFMOwogCQkJCWJyZWFrOwogCQkJfQogCi0JCQltZW1zZXQoJmxpbmtfc3RhdGUsIDAsIHNpemVvZihsaW5rX3N0YXRlKSk7Ci0JCQlsaW5rX3N0YXRlLmJJZGxlTW9kZSA9IEFkYXB0ZXItPklkbGVNb2RlOwotCQkJbGlua19zdGF0ZS5iU2h1dGRvd25Nb2RlID0gQWRhcHRlci0+YlNodXRTdGF0dXM7Ci0JCQlsaW5rX3N0YXRlLnVjTGlua1N0YXR1cyA9IEFkYXB0ZXItPkxpbmtTdGF0dXM7CisJCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZsaW5rX3N0YXRlLAotCQkJCQkgbWluX3Qoc2l6ZV90LCBzaXplb2YobGlua19zdGF0ZSksIElvQnVmZmVyLk91dHB1dExlbmd0aCkpKQotCQkJewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHlfdG9fdXNlciBGYWlsZWQuLlxuIik7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCQkiTGVuZ3RoIGZvciBGVyBETEQgaXMgOiAlbHhcbiIsIElvQnVmZmVyLklucHV0TGVuZ3RoKTsKKworCQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoID4gc2l6ZW9mKEZJUk1XQVJFX0lORk8pKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlwc0Z3SW5mbyA9IGttYWxsb2Moc2l6ZW9mKCpwc0Z3SW5mbyksIEdGUF9LRVJORUwpOworCQkJaWYgKCFwc0Z3SW5mbykKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKHBzRndJbmZvLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAoIXBzRndJbmZvLT5wdk1hcHBlZEZpcm13YXJlQWRkcmVzcyB8fAorCQkJCShwc0Z3SW5mby0+dTMyRmlybXdhcmVMZW5ndGggPT0gMCkpIHsKKworCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJTb21ldGhpbmcgZWxzZSBpcyB3cm9uZyAlbHVcbiIsCisJCQkJCQlwc0Z3SW5mby0+dTMyRmlybXdhcmVMZW5ndGgpOworCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCVN0YXR1cyA9IGJjbV9pb2N0bF9md19kb3dubG9hZChBZGFwdGVyLCBwc0Z3SW5mbyk7CisKKwkJCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlpZiAocHNGd0luZm8tPnUzMlN0YXJ0aW5nQWRkcmVzcyA9PSBDT05GSUdfQkVHSU5fQUREUikKKwkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIklPQ1RMOiBDb25maWd1cmF0aW9uIEZpbGUgVXBsb2FkIEZhaWxlZFxuIik7CisJCQkJZWxzZQorCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAkiSU9DVEw6IEZpcm13YXJlIEZpbGUgVXBsb2FkIEZhaWxlZFxuIik7CisKKwkJCQkvKiB1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7ICovCisKKwkJCQlpZiAoQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcgJiBCQ01fTEVEX1RIUkVBRF9SVU5OSU5HX0FDVElWRUxZKSB7CisJCQkJCUFkYXB0ZXItPkRyaXZlclN0YXRlID0gRFJJVkVSX0lOSVQ7CisJCQkJCUFkYXB0ZXItPkxFREluZm8uYkxlZEluaXREb25lID0gRkFMU0U7CisJCQkJCXdha2VfdXAoJkFkYXB0ZXItPkxFREluZm8ubm90aWZ5X2xlZF9ldmVudCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJfSB3aGlsZSAoMCk7CisKKwkJaWYgKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKKworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTDogRmlybXdhcmUgRmlsZSBVcGxvYWRlZFxuIik7CisJCWtmcmVlKHBzRndJbmZvKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBJT0NUTF9CQ01fQlVGRkVSX0RPV05MT0FEX1NUT1A6IHsKKwkJSU5UIE5WTUFjY2VzcyA9IGRvd25fdHJ5bG9jaygmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisKKwkJaWYgKE5WTUFjY2VzcykgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkJIkZXIGRvd25sb2FkIGJsb2NrZWQgYXMgRUVQUk9NIFJlYWQvV3JpdGUgaXMgaW4gcHJvZ3Jlc3NcbiIpOworCQkJdXAoJkFkYXB0ZXItPmZ3X2Rvd25sb2FkX3NlbWEpOworCQkJcmV0dXJuIC1FQUNDRVM7CisJCX0KKworCQlpZiAoZG93bl90cnlsb2NrKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKSkgeworCQkJQWRhcHRlci0+YkJpbkRvd25sb2FkZWQgPSBUUlVFOworCQkJQWRhcHRlci0+YkNmZ0Rvd25sb2FkZWQgPSBUUlVFOworCQkJYXRvbWljX3NldCgmQWRhcHRlci0+Q3Vyck51bUZyZWVUeERlc2MsIDApOworCQkJQWRhcHRlci0+Q3Vyck51bVJlY3ZEZXNjcyA9IDA7CisJCQlBZGFwdGVyLT5kb3dubG9hZEREUiA9IDA7CisKKwkJCS8qIHNldHRpbmcgdGhlIE1pcHMgdG8gUnVuICovCisJCQlTdGF0dXMgPSBydW5fY2FyZF9wcm9jKEFkYXB0ZXIpOworCisJCQlpZiAoU3RhdHVzKSB7CisJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkZpcm0gRG93bmxvYWQgRmFpbGVkXG4iKTsKKwkJCQl1cCgmQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSk7CisJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywKKwkJCQkJCURCR19MVkxfQUxMLCAiRmlybSBEb3dubG9hZCBPdmVyLi4uXG4iKTsKKwkJCX0KKworCQkJbWRlbGF5KDEwKTsKKworCQkJLyogV2FpdCBmb3IgTWFpbEJveCBJbnRlcnJ1cHQgKi8KKwkJCWlmIChTdGFydEludGVycnVwdFVyYigoUFNfSU5URVJGQUNFX0FEQVBURVIpQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyKSkKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiVW5hYmxlIHRvIHNlbmQgaW50ZXJydXB0Li4uXG4iKTsKKworCQkJdGltZW91dCA9IDUqSFo7CisJCQlBZGFwdGVyLT53YWl0aW5nX3RvX2Z3X2Rvd25sb2FkX2RvbmUgPSBGQUxTRTsKKwkJCXdhaXRfZXZlbnRfdGltZW91dChBZGFwdGVyLT5pb2N0bF9md19kbmxkX3dhaXRfcXVldWUsCisJCQkJCUFkYXB0ZXItPndhaXRpbmdfdG9fZndfZG93bmxvYWRfZG9uZSwgdGltZW91dCk7CisJCQlBZGFwdGVyLT5md19kb3dubG9hZF9wcm9jZXNzX3BpZCA9IElOVkFMSURfUElEOworCQkJQWRhcHRlci0+ZndfZG93bmxvYWRfZG9uZSA9IFRSVUU7CisJCQlhdG9taWNfc2V0KCZBZGFwdGVyLT5DdXJyTnVtRnJlZVR4RGVzYywgMCk7CisJCQlBZGFwdGVyLT5DdXJyTnVtUmVjdkRlc2NzID0gMDsKKwkJCUFkYXB0ZXItPlByZXZOdW1SZWN2RGVzY3MgPSAwOworCQkJYXRvbWljX3NldCgmQWRhcHRlci0+Y250cmxwa3RDbnQsIDApOworCQkJQWRhcHRlci0+TGlua1VwU3RhdHVzID0gMDsKKwkJCUFkYXB0ZXItPkxpbmtTdGF0dXMgPSAwOworCisJCQlpZiAoQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcgJiBCQ01fTEVEX1RIUkVBRF9SVU5OSU5HX0FDVElWRUxZKSB7CisJCQkJQWRhcHRlci0+RHJpdmVyU3RhdGUgPSBGV19ET1dOTE9BRF9ET05FOworCQkJCXdha2VfdXAoJkFkYXB0ZXItPkxFREluZm8ubm90aWZ5X2xlZF9ldmVudCk7CisJCQl9CisKKwkJCWlmICghdGltZW91dCkKKwkJCQlTdGF0dXMgPSAtRU5PREVWOworCQl9IGVsc2UgeworCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJfQorCisJCXVwKCZBZGFwdGVyLT5md19kb3dubG9hZF9zZW1hKTsKKwkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQlicmVhazsKKwl9CisKKwljYXNlIElPQ1RMX0JFX0JVQ0tFVF9TSVpFOgorCQlTdGF0dXMgPSAwOworCQlpZiAoZ2V0X3VzZXIoQWRhcHRlci0+QkVCdWNrZXRTaXplLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmcpKQorCQkJU3RhdHVzID0gLUVGQVVMVDsKKwkJYnJlYWs7CisKKwljYXNlIElPQ1RMX1JUUFNfQlVDS0VUX1NJWkU6CisJCVN0YXR1cyA9IDA7CisJCWlmIChnZXRfdXNlcihBZGFwdGVyLT5ydFBTQnVja2V0U2l6ZSwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopYXJnKSkKKwkJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCWJyZWFrOworCisJY2FzZSBJT0NUTF9DSElQX1JFU0VUOiB7CisJCUlOVCBOVk1BY2Nlc3MgPSBkb3duX3RyeWxvY2soJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQlpZiAoTlZNQWNjZXNzKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiIElPQ1RMX0JDTV9DSElQX1JFU0VUIG5vdCBhbGxvd2VkIGFzIEVFUFJPTSBSZWFkL1dyaXRlIGlzIGluIHByb2dyZXNzXG4iKTsKKwkJCXJldHVybiAtRUFDQ0VTOworCQl9CisKKwkJZG93bigmQWRhcHRlci0+UnhBcHBDb250cm9sUXVldWVsb2NrKTsKKwkJU3RhdHVzID0gcmVzZXRfY2FyZF9wcm9jKEFkYXB0ZXIpOworCQlmbHVzaEFsbEFwcFEoKTsKKwkJdXAoJkFkYXB0ZXItPlJ4QXBwQ29udHJvbFF1ZXVlbG9jayk7CisJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwkJUmVzZXRDb3VudGVycyhBZGFwdGVyKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBJT0NUTF9RT1NfVEhSRVNIT0xEOiB7CisJCVVTSE9SVCB1aUxvb3BJbmRleDsKKworCQlTdGF0dXMgPSAwOworCQlmb3IgKHVpTG9vcEluZGV4ID0gMDsgdWlMb29wSW5kZXggPCBOT19PRl9RVUVVRVM7IHVpTG9vcEluZGV4KyspIHsKKwkJCWlmIChnZXRfdXNlcihBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlUaHJlc2hvbGQsCisJCQkJCSh1bnNpZ25lZCBsb25nIF9fdXNlciAqKWFyZykpIHsKIAkJCQlTdGF0dXMgPSAtRUZBVUxUOwogCQkJCWJyZWFrOwogCQkJfQotCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JCQlicmVhazsKLQkJfQotICAgICAgICBjYXNlIElPQ1RMX0JDTV9TRVRfTUFDX1RSQUNJTkc6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFVJTlQgIHRyYWNpbmdfZmxhZzsKLQotICAgICAgICAgICAgLyogY29weSBpb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0JICAgIGlmKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQotCQkgICAgcmV0dXJuIC1FRkFVTFQ7Ci0KLQkgICAgaWYoY29weV9mcm9tX3VzZXIoJnRyYWNpbmdfZmxhZyxJb0J1ZmZlci5JbnB1dEJ1ZmZlcixzaXplb2YoVUlOVCkpKQotCQkgICAgcmV0dXJuIC1FRkFVTFQ7Ci0KLSAgICAgICAgICAgIGlmICh0cmFjaW5nX2ZsYWcpCi0gICAgICAgICAgICAgICAgQWRhcHRlci0+cFRhcmFuZ3MtPk1hY1RyYWNpbmdFbmFibGVkID0gVFJVRTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBBZGFwdGVyLT5wVGFyYW5ncy0+TWFjVHJhY2luZ0VuYWJsZWQgPSBGQUxTRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0JCWNhc2UgSU9DVExfQkNNX0dFVF9EU1hfSU5ESUNBVElPTjoKLQkJewotCQkJVUxPTkcgdWxTRklkPTA7Ci0JCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkJaWYoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoIDwgc2l6ZW9mKHN0TG9jYWxTRkFkZEluZGljYXRpb25BbHQpKQotCQkJewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwKLQkJCQkJCSJNaXNtYXRjaCByZXE6ICVseCBuZWVkZWQgaXMgPTB4JXp4ISEhIiwKLQkJCQkJCUlvQnVmZmVyLk91dHB1dExlbmd0aCwgc2l6ZW9mKHN0TG9jYWxTRkFkZEluZGljYXRpb25BbHQpKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQotCQkJaWYoY29weV9mcm9tX3VzZXIoJnVsU0ZJZCwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZih1bFNGSWQpKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJHZXQgRFNYIERhdGEgU0YgSUQgaXMgPSVseFxuIiwgdWxTRklkICk7Ci0JCQlnZXRfZHN4X3NmX2RhdGFfdG9fYXBwbGljYXRpb24oQWRhcHRlciwgdWxTRklkLCBJb0J1ZmZlci5PdXRwdXRCdWZmZXIpOwotCQkJU3RhdHVzPVNUQVRVU19TVUNDRVNTOwogCQl9CiAJCWJyZWFrOwotCQljYXNlIElPQ1RMX0JDTV9HRVRfSE9TVF9NSUJTOgotCQl7Ci0JCQlQVk9JRCB0ZW1wX2J1ZmY7CisJfQogCi0JCQlpZihjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCQlyZXR1cm4gLUVGQVVMVDsKKwljYXNlIElPQ1RMX0RVTVBfUEFDS0VUX0lORk86CisJCUR1bXBQYWNrSW5mbyhBZGFwdGVyKTsKKwkJRHVtcFBoc1J1bGVzKCZBZGFwdGVyLT5zdEJDTVBoc0NvbnRleHQpOworCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKwkJYnJlYWs7CiAKLQkJCWlmKElvQnVmZmVyLk91dHB1dExlbmd0aCAhPSBzaXplb2YoU19NSUJTX0hPU1RfU1RBVFNfTUlCUykpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLAotCQkJCQkJIkxlbmd0aCBDaGVjayBmYWlsZWQgJWx1ICV6ZFxuIiwKLQkJCQkJCUlvQnVmZmVyLk91dHB1dExlbmd0aCwgc2l6ZW9mKFNfTUlCU19IT1NUX1NUQVRTX01JQlMpKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KKwljYXNlIElPQ1RMX0dFVF9QQUNLX0lORk86CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJkFkYXB0ZXItPlBhY2tJbmZvLCBzaXplb2YoUGFja2V0SW5mbykqTk9fT0ZfUVVFVUVTKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKwkJYnJlYWs7CiAKLQkJCS8qIEZJWE1FOiBIT1NUX1NUQVRTIGFyZSB0b28gYmlnIGZvciBrbWFsbG9jICgxMjIwNDgpISAqLwotCQkJdGVtcF9idWZmID0ga3phbGxvYyhzaXplb2YoU19NSUJTX0hPU1RfU1RBVFNfTUlCUyksIEdGUF9LRVJORUwpOwotCQkJaWYoIXRlbXBfYnVmZikKLQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CisJY2FzZSBJT0NUTF9CQ01fU1dJVENIX1RSQU5TRkVSX01PREU6IHsKKwkJVUlOVCB1aURhdGEgPSAwOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnVpRGF0YSwgYXJncCwgc2l6ZW9mKFVJTlQpKSkKKwkJCXJldHVybiAtRUZBVUxUOwogCi0JCQlTdGF0dXMgPSBQcm9jZXNzR2V0SG9zdE1pYnMoQWRhcHRlciwgdGVtcF9idWZmKTsKLQkJCUdldERyb3BwZWRBcHBDbnRybFBrdE1pYnModGVtcF9idWZmLCBwVGFyYW5nKTsKKwkJaWYgKHVpRGF0YSkgeworCQkJLyogQWxsb3cgQWxsIFBhY2tldHMgKi8KKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9TV0lUQ0hfVFJBTlNGRVJfTU9ERTogRVRIX1BBQ0tFVF9UVU5ORUxJTkdfTU9ERVxuIik7CisJCQkJQWRhcHRlci0+VHJhbnNmZXJNb2RlID0gRVRIX1BBQ0tFVF9UVU5ORUxJTkdfTU9ERTsKKwkJfSBlbHNlIHsKKwkJCS8qIEFsbG93IElQIG9ubHkgUGFja2V0cyAqLworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiSU9DVExfQkNNX1NXSVRDSF9UUkFOU0ZFUl9NT0RFOiBJUF9QQUNLRVRfT05MWV9NT0RFXG4iKTsKKwkJCUFkYXB0ZXItPlRyYW5zZmVyTW9kZSA9IElQX1BBQ0tFVF9PTkxZX01PREU7CisJCX0KKwkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisJCWJyZWFrOworCX0KIAotCQkJaWYgKFN0YXR1cyAhPSBTVEFUVVNfRkFJTFVSRSkKLQkJCQlpZihjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCB0ZW1wX2J1ZmYsIHNpemVvZihTX01JQlNfSE9TVF9TVEFUU19NSUJTKSkpCi0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7CisJY2FzZSBJT0NUTF9CQ01fR0VUX0RSSVZFUl9WRVJTSU9OOiB7CisJCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQkJa2ZyZWUodGVtcF9idWZmKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIFZFUl9GSUxFVkVSU0lPTl9TVFIsIElvQnVmZmVyLk91dHB1dExlbmd0aCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisJCWJyZWFrOworCX0KKworCWNhc2UgSU9DVExfQkNNX0dFVF9DVVJSRU5UX1NUQVRVUzogeworCQlMSU5LX1NUQVRFIGxpbmtfc3RhdGU7CisKKwkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCisJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgImNvcHlfZnJvbV91c2VyIGZhaWxlZC4uXG4iKTsKKwkJCVN0YXR1cyA9IC1FRkFVTFQ7CiAJCQlicmVhazsKIAkJfQogCi0JCWNhc2UgSU9DVExfQkNNX1dBS0VfVVBfREVWSUNFX0ZST01fSURMRToKLQkJCWlmKChGQUxTRSA9PSBBZGFwdGVyLT5iVHJpZWRUb1dha2VVcEZyb21sb3dQb3dlck1vZGUpICYmIChUUlVFPT1BZGFwdGVyLT5JZGxlTW9kZSkpCi0JCQl7Ci0JCQkJQWRhcHRlci0+dXNJZGxlTW9kZVBhdHRlcm4gPSBBQk9SVF9JRExFX01PREU7Ci0JCQkJQWRhcHRlci0+Yldha2VVcERldmljZSA9IFRSVUU7Ci0JCQkJd2FrZV91cCgmQWRhcHRlci0+cHJvY2Vzc19yeF9jbnRybHBrdCk7Ci0JCQl9Ci0JCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKwkJaWYgKElvQnVmZmVyLk91dHB1dExlbmd0aCAhPSBzaXplb2YobGlua19zdGF0ZSkpIHsKKwkJCVN0YXR1cyA9IC1FSU5WQUw7CiAJCQlicmVhazsKKwkJfQogCi0JCWNhc2UgSU9DVExfQkNNX0JVTEtfV1JNOgotCQkJewotCQkJCVBCVUxLV1JNX0JVRkZFUiBwQnVsa0J1ZmZlcjsKLQkJCQlVSU5UIHVpVGVtcFZhcj0wOwotCQkJCVBDSEFSIHB2QnVmZmVyID0gTlVMTDsKKwkJbWVtc2V0KCZsaW5rX3N0YXRlLCAwLCBzaXplb2YobGlua19zdGF0ZSkpOworCQlsaW5rX3N0YXRlLmJJZGxlTW9kZSA9IEFkYXB0ZXItPklkbGVNb2RlOworCQlsaW5rX3N0YXRlLmJTaHV0ZG93bk1vZGUgPSBBZGFwdGVyLT5iU2h1dFN0YXR1czsKKwkJbGlua19zdGF0ZS51Y0xpbmtTdGF0dXMgPSBBZGFwdGVyLT5MaW5rU3RhdHVzOwogCi0JCQkJaWYoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8Ci0JCQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PVRSVUUpIHx8Ci0JCQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09VFJVRSkpCi0JCQkJewotICAgICAgICAgICAgICAgICAgICBCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkRldmljZSBpbiBJZGxlL1NodXRkb3duIE1vZGUsIEJsb2NraW5nIFdybXNcbiIpOwotCQkJCQlTdGF0dXMgPSAtRUFDQ0VTOwotCQkJCQlicmVhazsKLQkJCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmbGlua19zdGF0ZSwgbWluX3Qoc2l6ZV90LCBzaXplb2YobGlua19zdGF0ZSksIElvQnVmZmVyLk91dHB1dExlbmd0aCkpKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weV90b191c2VyIEZhaWxlZC4uXG4iKTsKKwkJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKwkJYnJlYWs7CisJfQogCi0JCQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0JCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOworCWNhc2UgSU9DVExfQkNNX1NFVF9NQUNfVFJBQ0lORzogeworCQlVSU5UICB0cmFjaW5nX2ZsYWc7CiAKLQkJCQkvKiBGSVhNRTogcmVzdHJpY3QgbGVuZ3RoICovCi0JCQkJcHZCdWZmZXIgPSBrbWFsbG9jKElvQnVmZmVyLklucHV0TGVuZ3RoLCBHRlBfS0VSTkVMKTsKLQkJCQlpZighcHZCdWZmZXIpCi0JCQkJCXJldHVybiAtRU5PTUVNOworCQkvKiBjb3B5IGlvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJCQkvKiBHZXQgV3JtQnVmZmVyIHN0cnVjdHVyZSAqLwotCQkJCWlmKGNvcHlfZnJvbV91c2VyKHB2QnVmZmVyLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRMZW5ndGgpKQotCQkJCXsKLQkJCQkJa2ZyZWUocHZCdWZmZXIpOwotCQkJCQlTdGF0dXMgPSAtRUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdHJhY2luZ19mbGFnLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKFVJTlQpKSkKKwkJCXJldHVybiAtRUZBVUxUOwogCi0JCQkJcEJ1bGtCdWZmZXIgPSAoUEJVTEtXUk1fQlVGRkVSKXB2QnVmZmVyOworCQlpZiAodHJhY2luZ19mbGFnKQorCQkJQWRhcHRlci0+cFRhcmFuZ3MtPk1hY1RyYWNpbmdFbmFibGVkID0gVFJVRTsKKwkJZWxzZQorCQkJQWRhcHRlci0+cFRhcmFuZ3MtPk1hY1RyYWNpbmdFbmFibGVkID0gRkFMU0U7CisJCWJyZWFrOworCX0KIAotCQkJCWlmKCgoVUxPTkcpcEJ1bGtCdWZmZXItPlJlZ2lzdGVyICYgMHgwRjAwMDAwMCkgIT0gMHgwRjAwMDAwMCB8fAotCQkJCQkoKFVMT05HKXBCdWxrQnVmZmVyLT5SZWdpc3RlciAmIDB4MykpCi0JCQkJewotCQkJCQlrZnJlZShwdkJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIEJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJXUk0gRG9uZSBPbiBpbnZhbGlkIEFkZHJlc3MgOiAleCBBY2Nlc3MgRGVuaWVkLlxuIiwoaW50KXBCdWxrQnVmZmVyLT5SZWdpc3Rlcik7Ci0JCQkJCVN0YXR1cyA9IC1FSU5WQUw7Ci0JCQkJCWJyZWFrOwotCQkJCX0KKwljYXNlIElPQ1RMX0JDTV9HRVRfRFNYX0lORElDQVRJT046IHsKKwkJVUxPTkcgdWxTRklkID0gMDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAKKwkJaWYgKElvQnVmZmVyLk91dHB1dExlbmd0aCA8IHNpemVvZihzdExvY2FsU0ZBZGRJbmRpY2F0aW9uQWx0KSkgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKKwkJCQkJIk1pc21hdGNoIHJlcTogJWx4IG5lZWRlZCBpcyA9MHglenghISEiLAorCQkJCQlJb0J1ZmZlci5PdXRwdXRMZW5ndGgsIHNpemVvZihzdExvY2FsU0ZBZGRJbmRpY2F0aW9uQWx0KSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCi0JCQkJdWlUZW1wVmFyID0gcEJ1bGtCdWZmZXItPlJlZ2lzdGVyICYgRUVQUk9NX1JFSkVDVF9NQVNLOwotCQkJCWlmKCEoKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMkN1c3RvbWl6ZSkmVlNHX01PREUpCi0JCQkJJiYgCSgodWlUZW1wVmFyID09IEVFUFJPTV9SRUpFQ1RfUkVHXzEpfHwKLQkJCQkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMikgfHwKLQkJCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18zKSB8fAotCQkJCQkodWlUZW1wVmFyID09IEVFUFJPTV9SRUpFQ1RfUkVHXzQpKSAmJgotCQkJCQkoY21kID09IElPQ1RMX0JDTV9SRUdJU1RFUl9XUklURSkpCi0JCQkJewotCQkJCQlrZnJlZShwdkJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIEJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJFRVBST00gQWNjZXNzIERlbmllZCwgbm90IGluIFZTRyBNb2RlXG4iKTsKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIoJnVsU0ZJZCwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZih1bFNGSWQpKSkKKwkJCXJldHVybiAtRUZBVUxUOwogCi0JCQkJaWYocEJ1bGtCdWZmZXItPlN3YXBFbmRpYW4gPT0gRkFMU0UpCi0JCQkJCVN0YXR1cyA9IHdybVdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKXBCdWxrQnVmZmVyLT5SZWdpc3RlciwgKFBDSEFSKXBCdWxrQnVmZmVyLT5WYWx1ZXMsIElvQnVmZmVyLklucHV0TGVuZ3RoIC0gMipzaXplb2YoVUxPTkcpKTsKLQkJCQllbHNlCi0JCQkJCVN0YXR1cyA9IHdybWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKXBCdWxrQnVmZmVyLT5SZWdpc3RlciwgKFBVSU5UKXBCdWxrQnVmZmVyLT5WYWx1ZXMsIElvQnVmZmVyLklucHV0TGVuZ3RoIC0gMipzaXplb2YoVUxPTkcpKTsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiR2V0IERTWCBEYXRhIFNGIElEIGlzID0lbHhcbiIsIHVsU0ZJZCk7CisJCWdldF9kc3hfc2ZfZGF0YV90b19hcHBsaWNhdGlvbihBZGFwdGVyLCB1bFNGSWQsIElvQnVmZmVyLk91dHB1dEJ1ZmZlcik7CisJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCX0KKwlicmVhazsKIAotCQkJCWlmKFN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIldSTSBGYWlsZWRcbiIpOwotCQkJCX0KKwljYXNlIElPQ1RMX0JDTV9HRVRfSE9TVF9NSUJTOiB7CisJCVBWT0lEIHRlbXBfYnVmZjsKIAotCQkJCWtmcmVlKHB2QnVmZmVyKTsKLQkJCQlicmVhazsKLQkJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJY2FzZSBJT0NUTF9CQ01fR0VUX05WTV9TSVpFOgotCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCisJCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggIT0gc2l6ZW9mKFNfTUlCU19IT1NUX1NUQVRTX01JQlMpKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCQkiTGVuZ3RoIENoZWNrIGZhaWxlZCAlbHUgJXpkXG4iLAorCQkJCQlJb0J1ZmZlci5PdXRwdXRMZW5ndGgsIHNpemVvZihTX01JQlNfSE9TVF9TVEFUU19NSUJTKSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIEZJWE1FOiBIT1NUX1NUQVRTIGFyZSB0b28gYmlnIGZvciBrbWFsbG9jICgxMjIwNDgpISAqLworCQl0ZW1wX2J1ZmYgPSBremFsbG9jKHNpemVvZihTX01JQlNfSE9TVF9TVEFUU19NSUJTKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghdGVtcF9idWZmKQorCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCisJCVN0YXR1cyA9IFByb2Nlc3NHZXRIb3N0TWlicyhBZGFwdGVyLCB0ZW1wX2J1ZmYpOworCQlHZXREcm9wcGVkQXBwQ250cmxQa3RNaWJzKHRlbXBfYnVmZiwgcFRhcmFuZyk7CisKKwkJaWYgKFN0YXR1cyAhPSBTVEFUVVNfRkFJTFVSRSkKKwkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCB0ZW1wX2J1ZmYsIHNpemVvZihTX01JQlNfSE9TVF9TVEFUU19NSUJTKSkpCisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKworCQlrZnJlZSh0ZW1wX2J1ZmYpOworCQlicmVhazsKKwl9CisKKwljYXNlIElPQ1RMX0JDTV9XQUtFX1VQX0RFVklDRV9GUk9NX0lETEU6CisJCWlmICgoRkFMU0UgPT0gQWRhcHRlci0+YlRyaWVkVG9XYWtlVXBGcm9tbG93UG93ZXJNb2RlKSAmJiAoVFJVRSA9PSBBZGFwdGVyLT5JZGxlTW9kZSkpIHsKKwkJCUFkYXB0ZXItPnVzSWRsZU1vZGVQYXR0ZXJuID0gQUJPUlRfSURMRV9NT0RFOworCQkJQWRhcHRlci0+Yldha2VVcERldmljZSA9IFRSVUU7CisJCQl3YWtlX3VwKCZBZGFwdGVyLT5wcm9jZXNzX3J4X2NudHJscGt0KTsKKwkJfQorCisJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCQlicmVhazsKKworCWNhc2UgSU9DVExfQkNNX0JVTEtfV1JNOiB7CisJCVBCVUxLV1JNX0JVRkZFUiBwQnVsa0J1ZmZlcjsKKwkJVUlOVCB1aVRlbXBWYXIgPSAwOworCQlQQ0hBUiBwdkJ1ZmZlciA9IE5VTEw7CisKKwkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAorCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgeworCisJCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkRldmljZSBpbiBJZGxlL1NodXRkb3duIE1vZGUsIEJsb2NraW5nIFdybXNcbiIpOworCQkJU3RhdHVzID0gLUVBQ0NFUzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCisJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCS8qIEZJWE1FOiByZXN0cmljdCBsZW5ndGggKi8KKwkJcHZCdWZmZXIgPSBrbWFsbG9jKElvQnVmZmVyLklucHV0TGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwdkJ1ZmZlcikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCS8qIEdldCBXcm1CdWZmZXIgc3RydWN0dXJlICovCisJCWlmIChjb3B5X2Zyb21fdXNlcihwdkJ1ZmZlciwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKSkgeworCQkJa2ZyZWUocHZCdWZmZXIpOworCQkJU3RhdHVzID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJcEJ1bGtCdWZmZXIgPSAoUEJVTEtXUk1fQlVGRkVSKXB2QnVmZmVyOworCisJCWlmICgoKFVMT05HKXBCdWxrQnVmZmVyLT5SZWdpc3RlciAmIDB4MEYwMDAwMDApICE9IDB4MEYwMDAwMDAgfHwKKwkJCSgoVUxPTkcpcEJ1bGtCdWZmZXItPlJlZ2lzdGVyICYgMHgzKSkgeworCQkJa2ZyZWUocHZCdWZmZXIpOworCQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJXUk0gRG9uZSBPbiBpbnZhbGlkIEFkZHJlc3MgOiAleCBBY2Nlc3MgRGVuaWVkLlxuIiwgKGludClwQnVsa0J1ZmZlci0+UmVnaXN0ZXIpOworCQkJU3RhdHVzID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJdWlUZW1wVmFyID0gcEJ1bGtCdWZmZXItPlJlZ2lzdGVyICYgRUVQUk9NX1JFSkVDVF9NQVNLOworCQlpZiAoISgoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyQ3VzdG9taXplKSZWU0dfTU9ERSkgJiYKKwkJCSgodWlUZW1wVmFyID09IEVFUFJPTV9SRUpFQ1RfUkVHXzEpIHx8CisJCQkJKHVpVGVtcFZhciA9PSBFRVBST01fUkVKRUNUX1JFR18yKSB8fAorCQkJCSh1aVRlbXBWYXIgPT0gRUVQUk9NX1JFSkVDVF9SRUdfMykgfHwKKwkJCQkodWlUZW1wVmFyID09IEVFUFJPTV9SRUpFQ1RfUkVHXzQpKSAmJgorCQkJKGNtZCA9PSBJT0NUTF9CQ01fUkVHSVNURVJfV1JJVEUpKSB7CisKKwkJCWtmcmVlKHB2QnVmZmVyKTsKKwkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRUVQUk9NIEFjY2VzcyBEZW5pZWQsIG5vdCBpbiBWU0cgTW9kZVxuIik7CisJCQlTdGF0dXMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocEJ1bGtCdWZmZXItPlN3YXBFbmRpYW4gPT0gRkFMU0UpCisJCQlTdGF0dXMgPSB3cm1XaXRoTG9jayhBZGFwdGVyLCAoVUlOVClwQnVsa0J1ZmZlci0+UmVnaXN0ZXIsIChQQ0hBUilwQnVsa0J1ZmZlci0+VmFsdWVzLCBJb0J1ZmZlci5JbnB1dExlbmd0aCAtIDIqc2l6ZW9mKFVMT05HKSk7CisJCWVsc2UKKwkJCVN0YXR1cyA9IHdybWFsdFdpdGhMb2NrKEFkYXB0ZXIsIChVSU5UKXBCdWxrQnVmZmVyLT5SZWdpc3RlciwgKFBVSU5UKXBCdWxrQnVmZmVyLT5WYWx1ZXMsIElvQnVmZmVyLklucHV0TGVuZ3RoIC0gMipzaXplb2YoVUxPTkcpKTsKKworCQlpZiAoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKQorCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIldSTSBGYWlsZWRcbiIpOworCisJCWtmcmVlKHB2QnVmZmVyKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBJT0NUTF9CQ01fR0VUX05WTV9TSVpFOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoQWRhcHRlci0+ZU5WTVR5cGUgPT0gTlZNX0VFUFJPTSB8fCBBZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRkxBU0gpIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmQWRhcHRlci0+dWlOVk1EU0RTaXplLCBzaXplb2YoVUlOVCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisJCWJyZWFrOworCisJY2FzZSBJT0NUTF9CQ01fQ0FMX0lOSVQ6IHsKKwkJVUlOVCB1aVNlY3RvclNpemUgPSAwIDsKKwkJaWYgKEFkYXB0ZXItPmVOVk1UeXBlID09IE5WTV9GTEFTSCkgeworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQogCQkJCXJldHVybiAtRUZBVUxUOwogCi0JCQlpZihBZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRUVQUk9NIHx8IEFkYXB0ZXItPmVOVk1UeXBlID09IE5WTV9GTEFTSCApIHsKLQkJCQlpZihjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmQWRhcHRlci0+dWlOVk1EU0RTaXplLCBzaXplb2YoVUlOVCkpKQorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ1aVNlY3RvclNpemUsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2YoVUlOVCkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlpZiAoKHVpU2VjdG9yU2l6ZSA8IE1JTl9TRUNUT1JfU0laRSkgfHwgKHVpU2VjdG9yU2l6ZSA+IE1BWF9TRUNUT1JfU0laRSkpIHsKKwkJCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJkFkYXB0ZXItPnVpU2VjdG9yU2l6ZSwKKwkJCQkJCQlzaXplb2YoVUlOVCkpKQogCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQkJCX0KLQkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTIDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSU9DVExfQkNNX0NBTF9JTklUIDoKLQotCQkJewotCQkJCVVJTlQgdWlTZWN0b3JTaXplID0gMCA7Ci0JCQkJaWYoQWRhcHRlci0+ZU5WTVR5cGUgPT0gTlZNX0ZMQVNIKQotCQkJCXsKLQkJCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCisJCQl9IGVsc2UgeworCQkJCWlmIChJc0ZsYXNoMngoQWRhcHRlcikpIHsKKwkJCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsCSZBZGFwdGVyLT51aVNlY3RvclNpemUsIHNpemVvZihVSU5UKSkpCiAJCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkJCQlpZiAoY29weV9mcm9tX3VzZXIoJnVpU2VjdG9yU2l6ZSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihVSU5UKSkpCi0JCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkJCQlpZigodWlTZWN0b3JTaXplIDwgTUlOX1NFQ1RPUl9TSVpFKSB8fCAodWlTZWN0b3JTaXplID4gTUFYX1NFQ1RPUl9TSVpFKSkKLQkJCQkJewotCQkJCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZBZGFwdGVyLT51aVNlY3RvclNpemUsCi0JCQkJCQkJCSBzaXplb2YoVUlOVCkpKQotCQkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICgoVFJVRSA9PSBBZGFwdGVyLT5iU2h1dFN0YXR1cykgfHwgKFRSVUUgPT0gQWRhcHRlci0+SWRsZU1vZGUpKSB7CisJCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7CisJCQkJCQlyZXR1cm4gLUVBQ0NFUzsKIAkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCWlmKElzRmxhc2gyeChBZGFwdGVyKSkKLQkJCQkJCXsKLQkJCQkJCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwKLQkJCQkJCQkJCSAmQWRhcHRlci0+dWlTZWN0b3JTaXplICwKLQkJCQkJCQkJCSBzaXplb2YoVUlOVCkpKQotCQkJCQkJCSAgICByZXR1cm4gLUVGQVVMVDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlpZigoVFJVRSA9PSBBZGFwdGVyLT5iU2h1dFN0YXR1cykgfHwKLQkJCQkJCQkgICAoVFJVRSA9PSBBZGFwdGVyLT5JZGxlTW9kZSkpCi0JCQkJCQkJewotCQkJCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOwotCQkJCQkJCQlyZXR1cm4gLUVBQ0NFUzsKLQkJCQkJCQl9CiAKLQkJCQkJCQlBZGFwdGVyLT51aVNlY3RvclNpemUgPSB1aVNlY3RvclNpemUgOwotCQkJCQkJCUJjbVVwZGF0ZVNlY3RvclNpemUoQWRhcHRlcixBZGFwdGVyLT51aVNlY3RvclNpemUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTIDsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisJCQkJCUFkYXB0ZXItPnVpU2VjdG9yU2l6ZSA9IHVpU2VjdG9yU2l6ZTsKKwkJCQkJQmNtVXBkYXRlU2VjdG9yU2l6ZShBZGFwdGVyLCBBZGFwdGVyLT51aVNlY3RvclNpemUpOwogCQkJCX0KIAkJCX0KLQkJCWJyZWFrOwotICAgICAgICBjYXNlIElPQ1RMX0JDTV9TRVRfREVCVUcgOgorCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisJCX0gZWxzZSB7CisJCQlTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKwkJfQorCX0KKwlicmVhazsKKworCWNhc2UgSU9DVExfQkNNX1NFVF9ERUJVRzoKICNpZmRlZiBERUJVRwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFVTRVJfQkNNX0RCR19TVEFURSBzVXNlckRlYnVnU3RhdGU7CisJeworCQlVU0VSX0JDTV9EQkdfU1RBVEUgc1VzZXJEZWJ1Z1N0YXRlOwogCi0vLwkJCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkVudGVyZWQgdGhlIGlvY3RsICV4IFxuIiwgSU9DVExfQkNNX1NFVF9ERUJVRyApOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJbiBTRVRfREVCVUcgaW9jdGxcbiIpOworCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJbiBTRVRfREVCVUcgaW9jdGxcbiIpOwotCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc1VzZXJEZWJ1Z1N0YXRlLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKFVTRVJfQkNNX0RCR19TVEFURSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJCQlpZiAoY29weV9mcm9tX3VzZXIoJnNVc2VyRGVidWdTdGF0ZSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihVU0VSX0JDTV9EQkdfU1RBVEUpKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQotCQkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiSU9DVExfQkNNX1NFVF9ERUJVRzogT25PZmY9JWQgVHlwZSA9IDB4JXggIiwKKwkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJJT0NUTF9CQ01fU0VUX0RFQlVHOiBPbk9mZj0lZCBUeXBlID0gMHgleCAiLAogCQkJCXNVc2VyRGVidWdTdGF0ZS5Pbk9mZiwgc1VzZXJEZWJ1Z1N0YXRlLlR5cGUpOwotCQkJCS8vc1VzZXJEZWJ1Z1N0YXRlLlN1YnR5cGUgPDw9IDE7Ci0JCQkJc1VzZXJEZWJ1Z1N0YXRlLlN1YnR5cGUgPSAxIDw8IHNVc2VyRGVidWdTdGF0ZS5TdWJ0eXBlOwotCQkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiYWN0dWFsIFN1YnR5cGU9MHgleFxuIiwgc1VzZXJEZWJ1Z1N0YXRlLlN1YnR5cGUpOworCQkvKiBzVXNlckRlYnVnU3RhdGUuU3VidHlwZSA8PD0gMTsgKi8KKwkJc1VzZXJEZWJ1Z1N0YXRlLlN1YnR5cGUgPSAxIDw8IHNVc2VyRGVidWdTdGF0ZS5TdWJ0eXBlOworCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgImFjdHVhbCBTdWJ0eXBlPTB4JXhcbiIsIHNVc2VyRGVidWdTdGF0ZS5TdWJ0eXBlKTsKIAotCQkJCS8vIFVwZGF0ZSBuZXcgJ0RlYnVnU3RhdGUnIGluIHRoZSBBZGFwdGVyCi0JCQkJQWRhcHRlci0+c3REZWJ1Z1N0YXRlLnR5cGUgfD0gc1VzZXJEZWJ1Z1N0YXRlLlR5cGU7Ci0JCQkJLyogU3VidHlwZTogQSBiaXRtYXAgb2YgMzIgYml0cyBmb3IgU3VidHlwZSBwZXIgVHlwZS4KLQkJCQkgKiBWYWxpZCBpbmRleGVzIGluICdzdWJ0eXBlJyBhcnJheTogMSwyLDQsOAotCQkJCSAqIGNvcnJlc3BvbmRpbmcgdG8gdmFsaWQgVHlwZSB2YWx1ZXMuIEhlbmNlIHdlIGNhbiB1c2UgdGhlICdUeXBlJyBmaWVsZAotCQkJCSAqIGFzIHRoZSBpbmRleCB2YWx1ZSwgaWdub3JpbmcgdGhlIGFycmF5IGVudHJpZXMgMCwzLDUsNiw3ICEKLQkJCQkgKi8KLQkJCQlpZiAoc1VzZXJEZWJ1Z1N0YXRlLk9uT2ZmKQotCQkJCQlBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtzVXNlckRlYnVnU3RhdGUuVHlwZV0gfD0gc1VzZXJEZWJ1Z1N0YXRlLlN1YnR5cGU7Ci0JCQkJZWxzZQotCQkJCQlBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtzVXNlckRlYnVnU3RhdGUuVHlwZV0gJj0gfnNVc2VyRGVidWdTdGF0ZS5TdWJ0eXBlOworCQkvKiBVcGRhdGUgbmV3ICdEZWJ1Z1N0YXRlJyBpbiB0aGUgQWRhcHRlciAqLworCQlBZGFwdGVyLT5zdERlYnVnU3RhdGUudHlwZSB8PSBzVXNlckRlYnVnU3RhdGUuVHlwZTsKKwkJLyogU3VidHlwZTogQSBiaXRtYXAgb2YgMzIgYml0cyBmb3IgU3VidHlwZSBwZXIgVHlwZS4KKwkJICogVmFsaWQgaW5kZXhlcyBpbiAnc3VidHlwZScgYXJyYXk6IDEsMiw0LDgKKwkJICogY29ycmVzcG9uZGluZyB0byB2YWxpZCBUeXBlIHZhbHVlcy4gSGVuY2Ugd2UgY2FuIHVzZSB0aGUgJ1R5cGUnIGZpZWxkCisJCSAqIGFzIHRoZSBpbmRleCB2YWx1ZSwgaWdub3JpbmcgdGhlIGFycmF5IGVudHJpZXMgMCwzLDUsNiw3ICEKKwkJICovCisJCWlmIChzVXNlckRlYnVnU3RhdGUuT25PZmYpCisJCQlBZGFwdGVyLT5zdERlYnVnU3RhdGUuc3VidHlwZVtzVXNlckRlYnVnU3RhdGUuVHlwZV0gfD0gc1VzZXJEZWJ1Z1N0YXRlLlN1YnR5cGU7CisJCWVsc2UKKwkJCUFkYXB0ZXItPnN0RGVidWdTdGF0ZS5zdWJ0eXBlW3NVc2VyRGVidWdTdGF0ZS5UeXBlXSAmPSB+c1VzZXJEZWJ1Z1N0YXRlLlN1YnR5cGU7CiAKLSAgICAgICAgICAgICAgICBCQ01fU0hPV19ERUJVR19CSVRNQVAoQWRhcHRlcik7Ci0KLQkJCX0KKwkJQkNNX1NIT1dfREVCVUdfQklUTUFQKEFkYXB0ZXIpOworCX0KICNlbmRpZgorCWJyZWFrOworCisJY2FzZSBJT0NUTF9CQ01fTlZNX1JFQUQ6CisJY2FzZSBJT0NUTF9CQ01fTlZNX1dSSVRFOiB7CisJCU5WTV9SRUFEV1JJVEUgIHN0TlZNUmVhZFdyaXRlOworCQlQVUNIQVIgcFJlYWREYXRhID0gTlVMTDsKKwkJVUxPTkcgdWxEU0RNYWdpY051bUluVXNyQnVmZiA9IDA7CisJCXN0cnVjdCB0aW1ldmFsIHR2MCwgdHYxOworCQltZW1zZXQoJnR2MCwgMCwgc2l6ZW9mKHN0cnVjdCB0aW1ldmFsKSk7CisJCW1lbXNldCgmdHYxLCAwLCBzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKKwkJaWYgKChBZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRkxBU0gpICYmIChBZGFwdGVyLT51aUZsYXNoTGF5b3V0TWFqb3JWZXJzaW9uID09IDApKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiVGhlIEZsYXNoIENvbnRyb2wgU2VjdGlvbiBpcyBDb3JydXB0ZWQuIEhlbmNlIFJlamVjdGlvbiBvbiBOVk0gUmVhZC9Xcml0ZVxuIik7CisJCQlTdGF0dXMgPSAtRUZBVUxUOwogCQkJYnJlYWs7Ci0JCWNhc2UgSU9DVExfQkNNX05WTV9SRUFEOgotCQljYXNlIElPQ1RMX0JDTV9OVk1fV1JJVEU6Ci0JCQl7Ci0JCQkJTlZNX1JFQURXUklURSAgc3ROVk1SZWFkV3JpdGU7Ci0JCQkJUFVDSEFSIHBSZWFkRGF0YSA9IE5VTEw7Ci0JCQkJVUxPTkcgdWxEU0RNYWdpY051bUluVXNyQnVmZiA9IDA7Ci0JCQkJc3RydWN0IHRpbWV2YWwgdHYwLCB0djE7Ci0JCQkJbWVtc2V0KCZ0djAsMCxzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKLQkJCQltZW1zZXQoJnR2MSwwLHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOwotCQkJCWlmKChBZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRkxBU0gpICYmIChBZGFwdGVyLT51aUZsYXNoTGF5b3V0TWFqb3JWZXJzaW9uID09IDApKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwiVGhlIEZsYXNoIENvbnRyb2wgU2VjdGlvbiBpcyBDb3JydXB0ZWQuIEhlbmNlIFJlamVjdGlvbiBvbiBOVk0gUmVhZC9Xcml0ZVxuIik7Ci0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KKwkJfQogCi0JCQkJaWYoSXNGbGFzaDJ4KEFkYXB0ZXIpKQotCQkJCXsKLQkJCQkJaWYoKEFkYXB0ZXItPmVBY3RpdmVEU0QgIT0gRFNEMCkgJiYKLQkJCQkJCShBZGFwdGVyLT5lQWN0aXZlRFNEICE9IERTRDEpICYmCi0JCQkJCQkoQWRhcHRlci0+ZUFjdGl2ZURTRCAhPSBEU0QyKSkKLQkJCQkJewotCQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJObyBEU0QgaXMgYWN0aXZlLi5oZW5jZSBOVk0gQ29tbWFuZCBpcyBibG9ja2VkIik7Ci0JCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkUgOwotCQkJCQl9Ci0JCQkJfQorCQlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpKSB7CisJCQlpZiAoKEFkYXB0ZXItPmVBY3RpdmVEU0QgIT0gRFNEMCkgJiYKKwkJCQkoQWRhcHRlci0+ZUFjdGl2ZURTRCAhPSBEU0QxKSAmJgorCQkJCShBZGFwdGVyLT5lQWN0aXZlRFNEICE9IERTRDIpKSB7CiAKLQkJCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJObyBEU0QgaXMgYWN0aXZlLi5oZW5jZSBOVk0gQ29tbWFuZCBpcyBibG9ja2VkIik7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFIDsKKwkJCX0KKwkJfQogCi0JCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOworCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJCQlpZihjb3B5X2Zyb21fdXNlcigmc3ROVk1SZWFkV3JpdGUsCi0JCQkJCQkgIChJT0NUTF9CQ01fTlZNX1JFQUQgPT0gY21kKSA/IElvQnVmZmVyLk91dHB1dEJ1ZmZlciA6IElvQnVmZmVyLklucHV0QnVmZmVyLAotCQkJCQkJICBzaXplb2YoTlZNX1JFQURXUklURSkpKQotCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzdE5WTVJlYWRXcml0ZSwKKwkJCQkJKElPQ1RMX0JDTV9OVk1fUkVBRCA9PSBjbWQpID8gSW9CdWZmZXIuT3V0cHV0QnVmZmVyIDogSW9CdWZmZXIuSW5wdXRCdWZmZXIsCisJCQkJCXNpemVvZihOVk1fUkVBRFdSSVRFKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKIAotCQkJCS8vCi0JCQkJLy8gRGVueSB0aGUgYWNjZXNzIGlmIHRoZSBvZmZzZXQgY3Jvc3NlcyB0aGUgY2FsIGFyZWEgbGltaXQuCi0JCQkJLy8KLQkJCQlpZigoc3ROVk1SZWFkV3JpdGUudWlPZmZzZXQgKyBzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKSA+IEFkYXB0ZXItPnVpTlZNRFNEU2l6ZSkKLQkJCQl7Ci0JCQkJLy9CQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkNhbid0IGFsbG93IGFjY2VzcyBiZXlvbmQgTlZNIFNpemU6IDB4JXggMHgleFxuIiwgc3ROVk1SZWFkV3JpdGUudWlPZmZzZXQgLAotLy8JCQkJCQkJc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcyk7Ci0JCQkJCVN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOwotCQkJCQlicmVhazsKLQkJCQl9CisJCS8qCisJCSAqIERlbnkgdGhlIGFjY2VzcyBpZiB0aGUgb2Zmc2V0IGNyb3NzZXMgdGhlIGNhbCBhcmVhIGxpbWl0LgorCQkgKi8KIAotCQkJCXBSZWFkRGF0YSA9IGt6YWxsb2Moc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcywgR0ZQX0tFUk5FTCk7Ci0JCQkJaWYoIXBSZWFkRGF0YSkKLQkJCQkJcmV0dXJuIC1FTk9NRU07CisJCWlmICgoc3ROVk1SZWFkV3JpdGUudWlPZmZzZXQgKyBzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKSA+IEFkYXB0ZXItPnVpTlZNRFNEU2l6ZSkgeworCQkJLyogQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJDYW4ndCBhbGxvdyBhY2Nlc3MgYmV5b25kIE5WTSBTaXplOiAweCV4IDB4JXhcbiIsIHN0TlZNUmVhZFdyaXRlLnVpT2Zmc2V0LCBzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKTsgKi8KKwkJCVN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCQkJYnJlYWs7CisJCX0KIAotCQkJCWlmKGNvcHlfZnJvbV91c2VyKHBSZWFkRGF0YSwgc3ROVk1SZWFkV3JpdGUucEJ1ZmZlciwKLQkJCQkJCQlzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKSkKLQkJCQl7Ci0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJCWtmcmVlKHBSZWFkRGF0YSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KKwkJcFJlYWREYXRhID0ga3phbGxvYyhzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwUmVhZERhdGEpCisJCQlyZXR1cm4gLUVOT01FTTsKIAotCQkJCWRvX2dldHRpbWVvZmRheSgmdHYwKTsKLQkJCQlpZihJT0NUTF9CQ01fTlZNX1JFQUQgPT0gY21kKQotCQkJCXsKLQkJCQkJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCWlmIChjb3B5X2Zyb21fdXNlcihwUmVhZERhdGEsIHN0TlZNUmVhZFdyaXRlLnBCdWZmZXIsIHN0TlZNUmVhZFdyaXRlLnVpTnVtQnl0ZXMpKSB7CisJCQlTdGF0dXMgPSAtRUZBVUxUOworCQkJa2ZyZWUocFJlYWREYXRhKTsKKwkJCWJyZWFrOworCQl9CiAKLQkJCQkJaWYoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8Ci0JCQkJCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT1UUlVFKSB8fAotCQkJCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT1UUlVFKSkKLQkJCQkJewotCQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOworCQlkb19nZXR0aW1lb2ZkYXkoJnR2MCk7CisJCWlmIChJT0NUTF9CQ01fTlZNX1JFQUQgPT0gY21kKSB7CisJCQlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKworCQkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAorCQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAorCQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKKwkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCQkJa2ZyZWUocFJlYWREYXRhKTsKKwkJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJCX0KKworCQkJU3RhdHVzID0gQmVjZWVtTlZNUmVhZChBZGFwdGVyLCAoUFVJTlQpcFJlYWREYXRhLCBzdE5WTVJlYWRXcml0ZS51aU9mZnNldCwgc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcyk7CisJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisKKwkJCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlrZnJlZShwUmVhZERhdGEpOworCQkJCXJldHVybiBTdGF0dXM7CisJCQl9CisKKwkJCWlmIChjb3B5X3RvX3VzZXIoc3ROVk1SZWFkV3JpdGUucEJ1ZmZlciwgcFJlYWREYXRhLCBzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKSkgeworCQkJCWtmcmVlKHBSZWFkRGF0YSk7CisJCQkJU3RhdHVzID0gLUVGQVVMVDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWRvd24oJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCisJCQlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CisJCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKKworCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOworCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwkJCQlrZnJlZShwUmVhZERhdGEpOworCQkJCXJldHVybiAtRUFDQ0VTOworCQkJfQorCisJCQlBZGFwdGVyLT5iSGVhZGVyQ2hhbmdlQWxsb3dlZCA9IFRSVUU7CisJCQlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpKSB7CisJCQkJLyoKKwkJCQkgKgkJCU5ldyBSZXF1aXJlbWVudDotCisJCQkJICoJCQlEU0Qgc2VjdGlvbiB1cGRhdGlvbiB3aWxsIGJlIGFsbG93ZWQgaW4gdHdvIGNhc2U6LQorCQkJCSAqCQkJMS4gIGlmIERTRCBzaWcgaXMgcHJlc2VudCBpbiBEU0QgaGVhZGVyIG1lYW5zIGRvbmdsZSBpcyBvayBhbmQgdXBkYXRpb24gaXMgZnJ1aXRmdWxsCisJCQkJICoJCQkyLiAgaWYgcG9pbnQgMSBmYWlsZXMgdGhlbiB1c2VyIGJ1ZmYgc2hvdWxkIGhhdmUgRFNEIHNpZy4gdGhpcyBwb2ludCBlbnN1cmVzIHRoYXQgaWYgZG9uZ2xlIGlzCisJCQkJICoJCQkgICAgICBjb3JydXB0ZWQgdGhlbiB1c2VyIHNwYWNlIHByb2dyYW0gZmlyc3QgbW9kaWZ5IHRoZSBEU0QgaGVhZGVyIHdpdGggdmFsaWQgRFNEIHNpZyBzbworCQkJCSAqCQkJICAgICAgdGhhdCB0aGlzIGFzIHdlbGwgYXMgZnVydGhlciB3cml0ZSBtYXkgYmUgd29ydGh3aGlsZS4KKwkJCQkgKgorCQkJCSAqCQkJIFRoaXMgcmVzdHJpY3Rpb24gaGFzIGJlZW4gcHV0IGFzc3VtaW5nIHRoYXQgaWYgRFNEIHNpZyBpcyBjb3JydXB0ZWQsIERTRAorCQkJCSAqCQkJIGRhdGEgd29uJ3QgYmUgY29uc2lkZXJlZCB2YWxpZC4KKwkJCQkgKi8KKworCQkJCVN0YXR1cyA9IEJjbUZsYXNoMnhDb3JydXB0U2lnKEFkYXB0ZXIsIEFkYXB0ZXItPmVBY3RpdmVEU0QpOworCQkJCWlmIChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQkJaWYgKCgoc3ROVk1SZWFkV3JpdGUudWlPZmZzZXQgKyBzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKSAhPSBBZGFwdGVyLT51aU5WTURTRFNpemUpIHx8CisJCQkJCQkoc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcyA8IFNJR05BVFVSRV9TSVpFKSkgeworCisJCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJEU0QgU2lnIGlzIHByZXNlbnQgbmVpdGhlciBpbiBGbGFzaCBub3IgVXNlciBwcm92aWRlZCBJbnB1dC4uIik7CiAJCQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CiAJCQkJCQlrZnJlZShwUmVhZERhdGEpOwotCQkJCQkJcmV0dXJuIC1FQUNDRVM7CisJCQkJCQlyZXR1cm4gU3RhdHVzOwogCQkJCQl9CiAKLQkJCQkJU3RhdHVzID0gQmVjZWVtTlZNUmVhZChBZGFwdGVyLCAoUFVJTlQpcFJlYWREYXRhLAotCQkJCQkJc3ROVk1SZWFkV3JpdGUudWlPZmZzZXQsIHN0TlZNUmVhZFdyaXRlLnVpTnVtQnl0ZXMpOwotCi0JCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQotCQkJCQlpZihTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJCQl7Ci0JCQkJCQkJa2ZyZWUocFJlYWREYXRhKTsKLQkJCQkJCQlyZXR1cm4gU3RhdHVzOwotCQkJCQkJfQotCQkJCQlpZihjb3B5X3RvX3VzZXIoc3ROVk1SZWFkV3JpdGUucEJ1ZmZlcixwUmVhZERhdGEsIHN0TlZNUmVhZFdyaXRlLnVpTnVtQnl0ZXMpKQotCQkJCQkJewotCQkJCQkJCWtmcmVlKHBSZWFkRGF0YSk7Ci0JCQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQotCQkJCQlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQotCQkJCQlpZigoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PVRSVUUpIHx8Ci0JCQkJCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PVRSVUUpKQotCQkJCQl7Ci0JCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7CisJCQkJCXVsRFNETWFnaWNOdW1JblVzckJ1ZmYgPSBudG9obCgqKFBVSU5UKShwUmVhZERhdGEgKyBzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzIC0gU0lHTkFUVVJFX1NJWkUpKTsKKwkJCQkJaWYgKHVsRFNETWFnaWNOdW1JblVzckJ1ZmYgIT0gRFNEX0lNQUdFX01BR0lDX05VTUJFUikgeworCQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiRFNEIFNpZyBpcyBwcmVzZW50IG5laXRoZXIgaW4gRmxhc2ggbm9yIFVzZXIgcHJvdmlkZWQgSW5wdXQuLiIpOwogCQkJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwogCQkJCQkJa2ZyZWUocFJlYWREYXRhKTsKLQkJCQkJCXJldHVybiAtRUFDQ0VTOwotCQkJCQl9Ci0KLQkJCQkJQWRhcHRlci0+YkhlYWRlckNoYW5nZUFsbG93ZWQgPSBUUlVFIDsKLQkJCQkJaWYoSXNGbGFzaDJ4KEFkYXB0ZXIpKQotCQkJCQl7Ci0JCQkJCQkvKgotCQkJCQkJCU5ldyBSZXF1aXJlbWVudDotCi0JCQkJCQkJRFNEIHNlY3Rpb24gdXBkYXRpb24gd2lsbCBiZSBhbGxvd2VkIGluIHR3byBjYXNlOi0KLQkJCQkJCQkxLiAgaWYgRFNEIHNpZyBpcyBwcmVzZW50IGluIERTRCBoZWFkZXIgbWVhbnMgZG9uZ2xlIGlzIG9rIGFuZCB1cGRhdGlvbiBpcyBmcnVpdGZ1bGwKLQkJCQkJCQkyLiAgaWYgcG9pbnQgMSBmYWlsZXMgdGhlbiB1c2VyIGJ1ZmYgc2hvdWxkIGhhdmUgRFNEIHNpZy4gdGhpcyBwb2ludCBlbnN1cmVzIHRoYXQgaWYgZG9uZ2xlIGlzCi0JCQkJCQkJICAgICAgY29ycnVwdGVkIHRoZW4gdXNlciBzcGFjZSBwcm9ncmFtIGZpcnN0IG1vZGlmeSB0aGUgRFNEIGhlYWRlciB3aXRoIHZhbGlkIERTRCBzaWcgc28KLQkJCQkJCQkgICAgICB0aGF0IHRoaXMgYXMgd2VsbCBhcyBmdXJ0aGVyIHdyaXRlIG1heSBiZSB3b3J0aHdoaWxlLgotCi0JCQkJCQkJIFRoaXMgcmVzdHJpY3Rpb24gaGFzIGJlZW4gcHV0IGFzc3VtaW5nIHRoYXQgaWYgRFNEIHNpZyBpcyBjb3JydXB0ZWQsIERTRAotCQkJCQkJCSBkYXRhIHdvbid0IGJlIGNvbnNpZGVyZWQgdmFsaWQuCi0KLQotCQkJCQkJKi8KLQkJCQkJCVN0YXR1cyA9IEJjbUZsYXNoMnhDb3JydXB0U2lnKEFkYXB0ZXIsQWRhcHRlci0+ZUFjdGl2ZURTRCk7Ci0JCQkJCQlpZihTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJCQl7Ci0JCQkJCQkJaWYoKCAoc3ROVk1SZWFkV3JpdGUudWlPZmZzZXQgKyBzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzKSAhPSBBZGFwdGVyLT51aU5WTURTRFNpemUgKSB8fAotCQkJCQkJCQkoc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcyA8IFNJR05BVFVSRV9TSVpFKSkKLQkJCQkJCQl7Ci0JCQkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJEU0QgU2lnIGlzIHByZXNlbnQgbmVpdGhlciBpbiBGbGFzaCBub3IgVXNlciBwcm92aWRlZCBJbnB1dC4uIik7Ci0JCQkJCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCQkJCQkJa2ZyZWUocFJlYWREYXRhKTsKLQkJCQkJCQkJcmV0dXJuIFN0YXR1czsKLQkJCQkJCQl9Ci0KLQkJCQkJCQl1bERTRE1hZ2ljTnVtSW5Vc3JCdWZmID0gbnRvaGwoKihQVUlOVCkocFJlYWREYXRhICsgc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcyAtIFNJR05BVFVSRV9TSVpFKSk7Ci0JCQkJCQkJaWYodWxEU0RNYWdpY051bUluVXNyQnVmZiAhPSBEU0RfSU1BR0VfTUFHSUNfTlVNQkVSKQotCQkJCQkJCXsKLQkJCQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIkRTRCBTaWcgaXMgcHJlc2VudCBuZWl0aGVyIGluIEZsYXNoIG5vciBVc2VyIHByb3ZpZGVkIElucHV0Li4iKTsKLQkJCQkJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCQkJCQlrZnJlZShwUmVhZERhdGEpOwotCQkJCQkJCQlyZXR1cm4gU3RhdHVzOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlTdGF0dXMgPSBCZWNlZW1OVk1Xcml0ZShBZGFwdGVyLCAoUFVJTlQgKXBSZWFkRGF0YSwKLQkJCQkJCQkJCXN0TlZNUmVhZFdyaXRlLnVpT2Zmc2V0LCBzdE5WTVJlYWRXcml0ZS51aU51bUJ5dGVzLCBzdE5WTVJlYWRXcml0ZS5iVmVyaWZ5KTsKLQkJCQkJaWYoSXNGbGFzaDJ4KEFkYXB0ZXIpKQotCQkJCQkJQmNtRmxhc2gyeFdyaXRlU2lnKEFkYXB0ZXIsQWRhcHRlci0+ZUFjdGl2ZURTRCk7Ci0KLQkJCQkJQWRhcHRlci0+YkhlYWRlckNoYW5nZUFsbG93ZWQgPSBGQUxTRSA7Ci0KLQkJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCi0KLQkJCQkJaWYoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCQl7Ci0JCQkJCQlrZnJlZShwUmVhZERhdGEpOwogCQkJCQkJcmV0dXJuIFN0YXR1czsKIAkJCQkJfQogCQkJCX0KLQkJCQlkb19nZXR0aW1lb2ZkYXkoJnR2MSk7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICIgdGltZXRha2VuIGJ5IFdyaXRlL3JlYWQgOiVsZCBtc2VjXG4iLCh0djEudHZfc2VjIC0gdHYwLnR2X3NlYykqMTAwMCArKHR2MS50dl91c2VjIC0gdHYwLnR2X3VzZWMpLzEwMDApOworCQkJfQogCisJCQlTdGF0dXMgPSBCZWNlZW1OVk1Xcml0ZShBZGFwdGVyLCAoUFVJTlQpcFJlYWREYXRhLCBzdE5WTVJlYWRXcml0ZS51aU9mZnNldCwgc3ROVk1SZWFkV3JpdGUudWlOdW1CeXRlcywgc3ROVk1SZWFkV3JpdGUuYlZlcmlmeSk7CisJCQlpZiAoSXNGbGFzaDJ4KEFkYXB0ZXIpKQorCQkJCUJjbUZsYXNoMnhXcml0ZVNpZyhBZGFwdGVyLCBBZGFwdGVyLT5lQWN0aXZlRFNEKTsKIAorCQkJQWRhcHRlci0+YkhlYWRlckNoYW5nZUFsbG93ZWQgPSBGQUxTRTsKKworCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCisJCQlpZiAoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJa2ZyZWUocFJlYWREYXRhKTsKLQkJCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKwkJCQlyZXR1cm4gU3RhdHVzOwogCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSU9DVExfQkNNX0ZMQVNIMlhfU0VDVElPTl9SRUFEIDoKLQkJCSB7CisJCX0KIAotCQkJCUZMQVNIMlhfUkVBRFdSSVRFIHNGbGFzaDJ4UmVhZCA9IHswfTsKLQkJCQlQVUNIQVIgcFJlYWRCdWZmID0gTlVMTCA7Ci0JCQkJVUlOVCBOT0IgPSAwOwotCQkJCVVJTlQgQnVmZlNpemUgPSAwOwotCQkJCVVJTlQgUmVhZEJ5dGVzID0gMDsKLQkJCQlVSU5UIFJlYWRPZmZzZXQgPSAwOwotCQkJCXZvaWQgX191c2VyICpPdXRQdXRCdWZmOworCQlkb19nZXR0aW1lb2ZkYXkoJnR2MSk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIiB0aW1ldGFrZW4gYnkgV3JpdGUvcmVhZCA6JWxkIG1zZWNcbiIsICh0djEudHZfc2VjIC0gdHYwLnR2X3NlYykqMTAwMCArICh0djEudHZfdXNlYyAtIHR2MC50dl91c2VjKS8xMDAwKTsKIAotCQkJCWlmKElzRmxhc2gyeChBZGFwdGVyKSAhPSBUUlVFKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJGbGFzaCBEb2VzIG5vdCBoYXZlIDIueCBtYXAiKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQorCQlrZnJlZShwUmVhZERhdGEpOworCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKwl9CisJYnJlYWs7CiAKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9GTEFTSDJYX1NFQ1RJT05fUkVBRCBDYWxsZWQiKTsKLQkJCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOworCWNhc2UgSU9DVExfQkNNX0ZMQVNIMlhfU0VDVElPTl9SRUFEOiB7CisJCUZMQVNIMlhfUkVBRFdSSVRFIHNGbGFzaDJ4UmVhZCA9IHswfTsKKwkJUFVDSEFSIHBSZWFkQnVmZiA9IE5VTEwgOworCQlVSU5UIE5PQiA9IDA7CisJCVVJTlQgQnVmZlNpemUgPSAwOworCQlVSU5UIFJlYWRCeXRlcyA9IDA7CisJCVVJTlQgUmVhZE9mZnNldCA9IDA7CisJCXZvaWQgX191c2VyICpPdXRQdXRCdWZmOwogCi0JCQkJLy9SZWFkaW5nIEZMQVNIIDIueCBSRUFEIHN0cnVjdHVyZQotCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmc0ZsYXNoMnhSZWFkLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlcixzaXplb2YoRkxBU0gyWF9SRUFEV1JJVEUpKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChJc0ZsYXNoMngoQWRhcHRlcikgIT0gVFJVRSkJeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkZsYXNoIERvZXMgbm90IGhhdmUgMi54IG1hcCIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAorCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTF9CQ01fRkxBU0gyWF9TRUNUSU9OX1JFQUQgQ2FsbGVkIik7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKKwkJCXJldHVybiAtRUZBVUxUOwogCi0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIlxuc0ZsYXNoMnhSZWFkLlNlY3Rpb24gOiV4IiAsc0ZsYXNoMnhSZWFkLlNlY3Rpb24pOwotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJcbnNGbGFzaDJ4UmVhZC5vZmZzZXQgOiV4IiAsc0ZsYXNoMnhSZWFkLm9mZnNldCk7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIlxuc0ZsYXNoMnhSZWFkLm51bU9mQnl0ZXMgOiV4IiAsc0ZsYXNoMnhSZWFkLm51bU9mQnl0ZXMpOwotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJcbnNGbGFzaDJ4UmVhZC5iVmVyaWZ5IDoleFxuIiAsc0ZsYXNoMnhSZWFkLmJWZXJpZnkpOworCQkvKiBSZWFkaW5nIEZMQVNIIDIueCBSRUFEIHN0cnVjdHVyZSAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoJnNGbGFzaDJ4UmVhZCwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihGTEFTSDJYX1JFQURXUklURSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJCQkvL1RoaXMgd2FzIGludGVybmFsIHRvIGRyaXZlciBmb3IgcmF3IHJlYWQuIG5vdyBpdCBoYXMgYmVuIGV4cG9zZWQgdG8gdXNlciBzcGFjZSBhcHAuCi0JCQkJaWYodmFsaWRhdGVGbGFzaDJ4UmVhZFdyaXRlKEFkYXB0ZXIsJnNGbGFzaDJ4UmVhZCkgPT0gRkFMU0UpCi0JCQkJCXJldHVybiBTVEFUVVNfRkFJTFVSRSA7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlxuc0ZsYXNoMnhSZWFkLlNlY3Rpb24gOiV4Iiwgc0ZsYXNoMnhSZWFkLlNlY3Rpb24pOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJcbnNGbGFzaDJ4UmVhZC5vZmZzZXQgOiV4Iiwgc0ZsYXNoMnhSZWFkLm9mZnNldCk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlxuc0ZsYXNoMnhSZWFkLm51bU9mQnl0ZXMgOiV4Iiwgc0ZsYXNoMnhSZWFkLm51bU9mQnl0ZXMpOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJcbnNGbGFzaDJ4UmVhZC5iVmVyaWZ5IDoleFxuIiwgc0ZsYXNoMnhSZWFkLmJWZXJpZnkpOwogCi0JCQkJTk9CID0gc0ZsYXNoMnhSZWFkLm51bU9mQnl0ZXM7Ci0JCQkJaWYoTk9CID4gQWRhcHRlci0+dWlTZWN0b3JTaXplICkKLQkJCQkJQnVmZlNpemUgPSBBZGFwdGVyLT51aVNlY3RvclNpemU7CisJCS8qIFRoaXMgd2FzIGludGVybmFsIHRvIGRyaXZlciBmb3IgcmF3IHJlYWQuIG5vdyBpdCBoYXMgYmVuIGV4cG9zZWQgdG8gdXNlciBzcGFjZSBhcHAuICovCisJCWlmICh2YWxpZGF0ZUZsYXNoMnhSZWFkV3JpdGUoQWRhcHRlciwgJnNGbGFzaDJ4UmVhZCkgPT0gRkFMU0UpCisJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CisKKwkJTk9CID0gc0ZsYXNoMnhSZWFkLm51bU9mQnl0ZXM7CisJCWlmIChOT0IgPiBBZGFwdGVyLT51aVNlY3RvclNpemUpCisJCQlCdWZmU2l6ZSA9IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZTsKKwkJZWxzZQorCQkJQnVmZlNpemUgPSBOT0I7CisKKwkJUmVhZE9mZnNldCA9IHNGbGFzaDJ4UmVhZC5vZmZzZXQgOworCQlPdXRQdXRCdWZmID0gSW9CdWZmZXIuT3V0cHV0QnVmZmVyOworCQlwUmVhZEJ1ZmYgPSAoUENIQVIpa3phbGxvYyhCdWZmU2l6ZSAsIEdGUF9LRVJORUwpOworCisJCWlmIChwUmVhZEJ1ZmYgPT0gTlVMTCkgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgRmxhc2ggMi54IFJlYWQgU3RydWN0dXJlIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKworCQlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CisJCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKKwkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOworCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQkJa2ZyZWUocFJlYWRCdWZmKTsKKwkJCXJldHVybiAtRUFDQ0VTOworCQl9CisKKwkJd2hpbGUgKE5PQikgeworCQkJaWYgKE5PQiA+IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSkKKwkJCQlSZWFkQnl0ZXMgPSBBZGFwdGVyLT51aVNlY3RvclNpemU7CisJCQllbHNlCisJCQkJUmVhZEJ5dGVzID0gTk9COworCisJCQkvKiBSZWFkaW5nIHRoZSBkYXRhIGZyb20gRmxhc2ggMi54ICovCisJCQlTdGF0dXMgPSBCY21GbGFzaDJ4QnVsa1JlYWQoQWRhcHRlciwgKFBVSU5UKXBSZWFkQnVmZiwgc0ZsYXNoMnhSZWFkLlNlY3Rpb24sIFJlYWRPZmZzZXQsIFJlYWRCeXRlcyk7CisJCQlpZiAoU3RhdHVzKSB7CisJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiRmxhc2ggMnggcmVhZCBlcnIgd2l0aCBTdGF0dXMgOiVkIiwgU3RhdHVzKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJQkNNX0RFQlVHX1BSSU5UX0JVRkZFUihBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgcFJlYWRCdWZmLCBSZWFkQnl0ZXMpOworCisJCQlTdGF0dXMgPSBjb3B5X3RvX3VzZXIoT3V0UHV0QnVmZiwgcFJlYWRCdWZmLCBSZWFkQnl0ZXMpOworCQkJaWYgKFN0YXR1cykgeworCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkNvcHkgdG8gdXNlIGZhaWxlZCB3aXRoIHN0YXR1cyA6JWQiLCBTdGF0dXMpOworCQkJCWJyZWFrOworCQkJfQorCQkJTk9CID0gTk9CIC0gUmVhZEJ5dGVzOworCQkJaWYgKE5PQikgeworCQkJCVJlYWRPZmZzZXQgPSBSZWFkT2Zmc2V0ICsgUmVhZEJ5dGVzOworCQkJCU91dFB1dEJ1ZmYgPSBPdXRQdXRCdWZmICsgUmVhZEJ5dGVzIDsKKwkJCX0KKwkJfQorCisJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwkJa2ZyZWUocFJlYWRCdWZmKTsKKwl9CisJYnJlYWs7CisKKwljYXNlIElPQ1RMX0JDTV9GTEFTSDJYX1NFQ1RJT05fV1JJVEU6IHsKKwkJRkxBU0gyWF9SRUFEV1JJVEUgc0ZsYXNoMnhXcml0ZSA9IHswfTsKKwkJUFVDSEFSIHBXcml0ZUJ1ZmY7CisJCXZvaWQgX191c2VyICpJbnB1dEFkZHI7CisJCVVJTlQgTk9CID0gMDsKKwkJVUlOVCBCdWZmU2l6ZSA9IDA7CisJCVVJTlQgV3JpdGVPZmZzZXQgPSAwOworCQlVSU5UIFdyaXRlQnl0ZXMgPSAwOworCisJCWlmIChJc0ZsYXNoMngoQWRhcHRlcikgIT0gVFJVRSkgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkZsYXNoIERvZXMgbm90IGhhdmUgMi54IG1hcCIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkvKiBGaXJzdCBtYWtlIHRoaXMgRmFsc2Ugc28gdGhhdCB3ZSBjYW4gZW5hYmxlIHRoZSBTZWN0b3IgUGVybWlzc2lvbiBDaGVjayBpbiBCZWNlZW1GbGFzaEJ1bGtXcml0ZSAqLworCQlBZGFwdGVyLT5iQWxsRFNEV3JpdGVBbGxvdyA9IEZBTFNFOworCisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9GTEFTSDJYX1NFQ1RJT05fV1JJVEUgQ2FsbGVkIik7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJLyogUmVhZGluZyBGTEFTSCAyLnggUkVBRCBzdHJ1Y3R1cmUgKi8KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzRmxhc2gyeFdyaXRlLCBJb0J1ZmZlci5JbnB1dEJ1ZmZlciwgc2l6ZW9mKEZMQVNIMlhfUkVBRFdSSVRFKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJcbnNGbGFzaDJ4UmVhZC5TZWN0aW9uIDoleCIsIHNGbGFzaDJ4V3JpdGUuU2VjdGlvbik7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlxuc0ZsYXNoMnhSZWFkLm9mZnNldCA6JWQiLCBzRmxhc2gyeFdyaXRlLm9mZnNldCk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlxuc0ZsYXNoMnhSZWFkLm51bU9mQnl0ZXMgOiV4Iiwgc0ZsYXNoMnhXcml0ZS5udW1PZkJ5dGVzKTsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiXG5zRmxhc2gyeFJlYWQuYlZlcmlmeSA6JXhcbiIsIHNGbGFzaDJ4V3JpdGUuYlZlcmlmeSk7CisKKwkJaWYgKChzRmxhc2gyeFdyaXRlLlNlY3Rpb24gIT0gVlNBMCkgJiYgKHNGbGFzaDJ4V3JpdGUuU2VjdGlvbiAhPSBWU0ExKSAmJiAoc0ZsYXNoMnhXcml0ZS5TZWN0aW9uICE9IFZTQTIpKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJPbmx5IFZTQSB3cml0ZSBpcyBhbGxvd2VkIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmICh2YWxpZGF0ZUZsYXNoMnhSZWFkV3JpdGUoQWRhcHRlciwgJnNGbGFzaDJ4V3JpdGUpID09IEZBTFNFKQorCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCisJCUlucHV0QWRkciA9IHNGbGFzaDJ4V3JpdGUucERhdGFCdWZmOworCQlXcml0ZU9mZnNldCA9IHNGbGFzaDJ4V3JpdGUub2Zmc2V0OworCQlOT0IgPSBzRmxhc2gyeFdyaXRlLm51bU9mQnl0ZXM7CisKKwkJaWYgKE5PQiA+IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSkKKwkJCUJ1ZmZTaXplID0gQWRhcHRlci0+dWlTZWN0b3JTaXplOworCQllbHNlCisJCQlCdWZmU2l6ZSA9IE5PQiA7CisKKwkJcFdyaXRlQnVmZiA9IGttYWxsb2MoQnVmZlNpemUsIEdGUF9LRVJORUwpOworCisJCWlmIChwV3JpdGVCdWZmID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQkvKiBleHRyYWN0aW5nIHRoZSByZW1haW5kZXIgb2YgdGhlIGdpdmVuIG9mZnNldC4gKi8KKwkJV3JpdGVCeXRlcyA9IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZTsKKwkJaWYgKFdyaXRlT2Zmc2V0ICUgQWRhcHRlci0+dWlTZWN0b3JTaXplKQorCQkJV3JpdGVCeXRlcyA9IEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSAtIChXcml0ZU9mZnNldCAlIEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSk7CisKKwkJaWYgKE5PQiA8IFdyaXRlQnl0ZXMpCisJCQlXcml0ZUJ5dGVzID0gTk9COworCisJCWRvd24oJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCisJCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAorCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKKworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7CisJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCQlrZnJlZShwV3JpdGVCdWZmKTsKKwkJCXJldHVybiAtRUFDQ0VTOworCQl9CisKKwkJQmNtRmxhc2gyeENvcnJ1cHRTaWcoQWRhcHRlciwgc0ZsYXNoMnhXcml0ZS5TZWN0aW9uKTsKKwkJZG8geworCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIocFdyaXRlQnVmZiwgSW5wdXRBZGRyLCBXcml0ZUJ5dGVzKTsKKwkJCWlmIChTdGF0dXMpIHsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSB0byB1c2VyIGZhaWxlZCB3aXRoIHN0YXR1cyA6JWQiLCBTdGF0dXMpOworCQkJCWJyZWFrOworCQkJfQorCQkJQkNNX0RFQlVHX1BSSU5UX0JVRkZFUihBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgcFdyaXRlQnVmZiwgV3JpdGVCeXRlcyk7CisKKwkJCS8qIFdyaXRpbmcgdGhlIGRhdGEgZnJvbSBGbGFzaCAyLnggKi8KKwkJCVN0YXR1cyA9IEJjbUZsYXNoMnhCdWxrV3JpdGUoQWRhcHRlciwgKFBVSU5UKXBXcml0ZUJ1ZmYsIHNGbGFzaDJ4V3JpdGUuU2VjdGlvbiwgV3JpdGVPZmZzZXQsIFdyaXRlQnl0ZXMsIHNGbGFzaDJ4V3JpdGUuYlZlcmlmeSk7CisKKwkJCWlmIChTdGF0dXMpIHsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRmxhc2ggMnggcmVhZCBlcnIgd2l0aCBTdGF0dXMgOiVkIiwgU3RhdHVzKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJTk9CID0gTk9CIC0gV3JpdGVCeXRlczsKKwkJCWlmIChOT0IpIHsKKwkJCQlXcml0ZU9mZnNldCA9IFdyaXRlT2Zmc2V0ICsgV3JpdGVCeXRlczsKKwkJCQlJbnB1dEFkZHIgPSBJbnB1dEFkZHIgKyBXcml0ZUJ5dGVzOworCQkJCWlmIChOT0IgPiBBZGFwdGVyLT51aVNlY3RvclNpemUpCisJCQkJCVdyaXRlQnl0ZXMgPSBBZGFwdGVyLT51aVNlY3RvclNpemU7CiAJCQkJZWxzZQotCQkJCQlCdWZmU2l6ZSA9IE5PQiA7Ci0KLQkJCQlSZWFkT2Zmc2V0ID0gc0ZsYXNoMnhSZWFkLm9mZnNldCA7Ci0JCQkJT3V0UHV0QnVmZiA9IElvQnVmZmVyLk91dHB1dEJ1ZmZlcjsKLQotCi0JCQkJcFJlYWRCdWZmID0gKFBDSEFSKWt6YWxsb2MoQnVmZlNpemUgLCBHRlBfS0VSTkVMKTsKLQkJCQlpZihwUmVhZEJ1ZmYgPT0gTlVMTCkKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciBGbGFzaCAyLnggUmVhZCBTdHJ1Y3R1cmUiKTsKLQkJCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQkJfQotCQkJCWRvd24oJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCi0JCQkJaWYoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8Ci0JCQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PVRSVUUpIHx8Ci0JCQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09VFJVRSkpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7Ci0JCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCQkJa2ZyZWUocFJlYWRCdWZmKTsKLQkJCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCQkJfQotCi0JCQkJd2hpbGUoTk9CKQotCQkJCXsKLQotCQkJCQlpZihOT0IgPiBBZGFwdGVyLT51aVNlY3RvclNpemUgKQotCQkJCQkJUmVhZEJ5dGVzID0gQWRhcHRlci0+dWlTZWN0b3JTaXplOwotCQkJCQllbHNlCi0JCQkJCQlSZWFkQnl0ZXMgPSBOT0I7Ci0KLQotCQkJCQkvL1JlYWRpbmcgdGhlIGRhdGEgZnJvbSBGbGFzaCAyLngKLQotCQkJCQlTdGF0dXMgPSBCY21GbGFzaDJ4QnVsa1JlYWQoQWRhcHRlciwoUFVJTlQpcFJlYWRCdWZmLHNGbGFzaDJ4UmVhZC5TZWN0aW9uLFJlYWRPZmZzZXQsUmVhZEJ5dGVzKTsKLQkJCQkJaWYoU3RhdHVzKQotCQkJCQl7Ci0JCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiRmxhc2ggMnggcmVhZCBlcnIgd2l0aCBTdGF0dXMgOiVkIiwgU3RhdHVzKTsKLQkJCQkJCWJyZWFrIDsKLQkJCQkJfQotCi0JCQkJCUJDTV9ERUJVR19QUklOVF9CVUZGRVIoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCxwUmVhZEJ1ZmYsIFJlYWRCeXRlcyk7Ci0KLQkJCQkJU3RhdHVzID0gY29weV90b191c2VyKE91dFB1dEJ1ZmYsIHBSZWFkQnVmZixSZWFkQnl0ZXMpOwotCQkJCSAJaWYoU3RhdHVzKQotCQkJCSAJewotCQkJCSAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJDb3B5IHRvIHVzZSBmYWlsZWQgd2l0aCBzdGF0dXMgOiVkIiwgU3RhdHVzKTsKLQkJCQkJCWJyZWFrOwotCQkJCSAJfQotCQkJCQlOT0IgPSBOT0IgLSBSZWFkQnl0ZXM7Ci0JCQkJCWlmKE5PQikKLQkJCQkJewotCQkJCQkJUmVhZE9mZnNldCA9IFJlYWRPZmZzZXQgKyBSZWFkQnl0ZXMgOwotCQkJCQkJT3V0UHV0QnVmZiA9IE91dFB1dEJ1ZmYgKyBSZWFkQnl0ZXMgOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCWtmcmVlKHBSZWFkQnVmZik7Ci0KLQkJCSB9Ci0JCQkgYnJlYWsgOwotCQljYXNlIElPQ1RMX0JDTV9GTEFTSDJYX1NFQ1RJT05fV1JJVEUgOgotCQkJIHsKLQkJCSAJRkxBU0gyWF9SRUFEV1JJVEUgc0ZsYXNoMnhXcml0ZSA9IHswfTsKLQkJCQlQVUNIQVIgcFdyaXRlQnVmZjsKLQkJCQl2b2lkIF9fdXNlciAqSW5wdXRBZGRyOwotCQkJCVVJTlQgTk9CID0gMDsKLQkJCQlVSU5UIEJ1ZmZTaXplID0gMDsKLQkJCQlVSU5UIFdyaXRlT2Zmc2V0ID0gMDsKLQkJCQlVSU5UIFdyaXRlQnl0ZXMgPSAwOwotCi0JCQkJaWYoSXNGbGFzaDJ4KEFkYXB0ZXIpICE9IFRSVUUpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkZsYXNoIERvZXMgbm90IGhhdmUgMi54IG1hcCIpOwotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl9Ci0KLQkJCQkvL0ZpcnN0IG1ha2UgdGhpcyBGYWxzZSBzbyB0aGF0IHdlIGNhbiBlbmFibGUgdGhlIFNlY3RvciBQZXJtaXNzaW9uIENoZWNrIGluIEJlY2VlbUZsYXNoQnVsa1dyaXRlCi0JCQkJQWRhcHRlci0+YkFsbERTRFdyaXRlQWxsb3cgPSBGQUxTRTsKLQotCi0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICIgSU9DVExfQkNNX0ZMQVNIMlhfU0VDVElPTl9XUklURSBDYWxsZWQiKTsKLQkJCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOwotCi0JCQkJLy9SZWFkaW5nIEZMQVNIIDIueCBSRUFEIHN0cnVjdHVyZQotCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmc0ZsYXNoMnhXcml0ZSwgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihGTEFTSDJYX1JFQURXUklURSkpKQotCQkJCQlyZXR1cm4gLUVGQVVMVDsKLQotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJcbnNGbGFzaDJ4UmVhZC5TZWN0aW9uIDoleCIgLHNGbGFzaDJ4V3JpdGUuU2VjdGlvbik7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIlxuc0ZsYXNoMnhSZWFkLm9mZnNldCA6JWQiICxzRmxhc2gyeFdyaXRlLm9mZnNldCk7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIlxuc0ZsYXNoMnhSZWFkLm51bU9mQnl0ZXMgOiV4IiAsc0ZsYXNoMnhXcml0ZS5udW1PZkJ5dGVzKTsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiXG5zRmxhc2gyeFJlYWQuYlZlcmlmeSA6JXhcbiIgLHNGbGFzaDJ4V3JpdGUuYlZlcmlmeSk7Ci0JCQkJaWYoKHNGbGFzaDJ4V3JpdGUuU2VjdGlvbiAhPSBWU0EwKSAmJiAoc0ZsYXNoMnhXcml0ZS5TZWN0aW9uICE9IFZTQTEpICYmCi0JCQkJCShzRmxhc2gyeFdyaXRlLlNlY3Rpb24gIT0gVlNBMikgKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIk9ubHkgVlNBIHdyaXRlIGlzIGFsbG93ZWQiKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQotCi0JCQkJaWYodmFsaWRhdGVGbGFzaDJ4UmVhZFdyaXRlKEFkYXB0ZXIsJnNGbGFzaDJ4V3JpdGUpID09IEZBTFNFKQotCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkUgOwotCi0JCQkJSW5wdXRBZGRyID0gc0ZsYXNoMnhXcml0ZS5wRGF0YUJ1ZmY7Ci0JCQkJV3JpdGVPZmZzZXQgPSBzRmxhc2gyeFdyaXRlLm9mZnNldCA7Ci0JCQkJTk9CID0gc0ZsYXNoMnhXcml0ZS5udW1PZkJ5dGVzOwotCi0JCQkJaWYoTk9CID4gQWRhcHRlci0+dWlTZWN0b3JTaXplICkKLQkJCQkJQnVmZlNpemUgPSBBZGFwdGVyLT51aVNlY3RvclNpemU7Ci0JCQkJZWxzZQotCQkJCQlCdWZmU2l6ZSA9IE5PQiA7Ci0KLQkJCQlwV3JpdGVCdWZmID0ga21hbGxvYyhCdWZmU2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCQkJaWYocFdyaXRlQnVmZiA9PSBOVUxMKQotCQkJCQlyZXR1cm4gLUVOT01FTTsKLQotCi0JCQkJLy9leHRyYWN0aW5nIHRoZSByZW1haW5kZXIgb2YgdGhlIGdpdmVuIG9mZnNldC4KLQkJCQlXcml0ZUJ5dGVzID0gQWRhcHRlci0+dWlTZWN0b3JTaXplIDsKLQkJCQlpZihXcml0ZU9mZnNldCAlIEFkYXB0ZXItPnVpU2VjdG9yU2l6ZSkKLQkJCQkJV3JpdGVCeXRlcyA9QWRhcHRlci0+dWlTZWN0b3JTaXplIC0gKFdyaXRlT2Zmc2V0ICUgQWRhcHRlci0+dWlTZWN0b3JTaXplKTsKLQkJCQlpZihOT0IgPCBXcml0ZUJ5dGVzKQogCQkJCQlXcml0ZUJ5dGVzID0gTk9COwotCi0JCQkJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0KLQkJCQlpZigoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09VFJVRSkgfHwKLQkJCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT1UUlVFKSkKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKLQkJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCQlrZnJlZShwV3JpdGVCdWZmKTsKLQkJCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCQkJfQotCi0JCQkJQmNtRmxhc2gyeENvcnJ1cHRTaWcoQWRhcHRlcixzRmxhc2gyeFdyaXRlLlNlY3Rpb24pOwotCQkJCWRvCi0JCQkJewotCQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcihwV3JpdGVCdWZmLElucHV0QWRkcixXcml0ZUJ5dGVzKTsKLQkJCQkgCWlmKFN0YXR1cykKLQkJCQkgCXsKLQkJCQkgCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkNvcHkgdG8gdXNlciBmYWlsZWQgd2l0aCBzdGF0dXMgOiVkIiwgU3RhdHVzKTsKLQkJCQkJCWJyZWFrIDsKLQkJCQkgCX0KLQkJCQkJQkNNX0RFQlVHX1BSSU5UX0JVRkZFUihBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLHBXcml0ZUJ1ZmYsV3JpdGVCeXRlcyk7Ci0JCQkJCS8vV3JpdGluZyB0aGUgZGF0YSBmcm9tIEZsYXNoIDIueAotCQkJCQlTdGF0dXMgPSBCY21GbGFzaDJ4QnVsa1dyaXRlKEFkYXB0ZXIsKFBVSU5UKXBXcml0ZUJ1ZmYsc0ZsYXNoMnhXcml0ZS5TZWN0aW9uLFdyaXRlT2Zmc2V0LFdyaXRlQnl0ZXMsc0ZsYXNoMnhXcml0ZS5iVmVyaWZ5KTsKLQotCQkJCQlpZihTdGF0dXMpCi0JCQkJCXsKLQkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiRmxhc2ggMnggcmVhZCBlcnIgd2l0aCBTdGF0dXMgOiVkIiwgU3RhdHVzKTsKLQkJCQkJCWJyZWFrIDsKLQkJCQkJfQotCi0JCQkJCU5PQiA9IE5PQiAtIFdyaXRlQnl0ZXM7Ci0JCQkJCWlmKE5PQikKLQkJCQkJewotCQkJCQkJV3JpdGVPZmZzZXQgPSBXcml0ZU9mZnNldCArIFdyaXRlQnl0ZXMgOwotCQkJCQkJSW5wdXRBZGRyID0gSW5wdXRBZGRyICsgV3JpdGVCeXRlcyA7Ci0JCQkJCQlpZihOT0IgPiBBZGFwdGVyLT51aVNlY3RvclNpemUgKQotCQkJCQkJCVdyaXRlQnl0ZXMgPSBBZGFwdGVyLT51aVNlY3RvclNpemU7Ci0JCQkJCQllbHNlCi0JCQkJCQkJV3JpdGVCeXRlcyA9IE5PQjsKLQkJCQkJfQotCi0KLQkJCQl9CXdoaWxlKE5PQiA+IDApOwotCQkJCUJjbUZsYXNoMnhXcml0ZVNpZyhBZGFwdGVyLHNGbGFzaDJ4V3JpdGUuU2VjdGlvbik7Ci0JCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCWtmcmVlKHBXcml0ZUJ1ZmYpOwotCQkJIH0KLQkJCSBicmVhayA7Ci0JCWNhc2UgSU9DVExfQkNNX0dFVF9GTEFTSDJYX1NFQ1RJT05fQklUTUFQIDoKLQkJCSB7Ci0KLQkJCQkgUEZMQVNIMlhfQklUTUFQIHBzRmxhc2gyeEJpdE1hcDsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9HRVRfRkxBU0gyWF9TRUNUSU9OX0JJVE1BUCBDYWxsZWQiKTsKLQotCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJCQlpZihJb0J1ZmZlci5PdXRwdXRMZW5ndGggIT0gc2l6ZW9mKEZMQVNIMlhfQklUTUFQKSkKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJCQlwc0ZsYXNoMnhCaXRNYXAgPSBremFsbG9jKHNpemVvZihGTEFTSDJYX0JJVE1BUCksIEdGUF9LRVJORUwpOwotCQkJCWlmKHBzRmxhc2gyeEJpdE1hcCA9PSBOVUxMKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJNZW1vcnkgaXMgbm90IGF2YWlsYWJsZSIpOwotCQkJCQlyZXR1cm4gLUVOT01FTSA7Ci0JCQkJfQotCQkJCS8vUmVhZGluZyB0aGUgRmxhc2ggU2VjdGlvIEJpdCBtYXAKLQkJCQlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQotCQkJCWlmKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT1UUlVFKSB8fAotCQkJCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PVRSVUUpKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOwotCQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJCWtmcmVlKHBzRmxhc2gyeEJpdE1hcCk7Ci0JCQkJCXJldHVybiAtRUFDQ0VTOwotCQkJCX0KLQotCQkJCUJjbUdldEZsYXNoMnhTZWN0aW9uYWxCaXRNYXAoQWRhcHRlciwgcHNGbGFzaDJ4Qml0TWFwKTsKLQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIHBzRmxhc2gyeEJpdE1hcCwgc2l6ZW9mKEZMQVNIMlhfQklUTUFQKSkpCi0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0KLQkJCQlrZnJlZShwc0ZsYXNoMnhCaXRNYXApOwotCQkJIH0KLQkJCSBicmVhayA7Ci0JCWNhc2UgSU9DVExfQkNNX1NFVF9BQ1RJVkVfU0VDVElPTiA6Ci0JCQkgewotCQkJCUZMQVNIMlhfU0VDVElPTl9WQUwgZUZsYXNoMnhTZWN0aW9uVmFsID0gMDsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9TRVRfQUNUSVZFX1NFQ1RJT04gQ2FsbGVkIik7Ci0KLQkJCQlpZihJc0ZsYXNoMngoQWRhcHRlcikgIT0gVFJVRSkKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiRmxhc2ggRG9lcyBub3QgaGF2ZSAyLnggbWFwIik7Ci0JCQkJCXJldHVybiAtRUlOVkFMOwotCQkJCX0KLQotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpOwotCQkJCWlmKFN0YXR1cykKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgSU9DVEwgQlVGRkVSIGZhaWxlZCIpOwotCQkJCQlyZXR1cm4gU3RhdHVzOwotCQkJCX0KLQotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZlRmxhc2gyeFNlY3Rpb25WYWwsSW9CdWZmZXIuSW5wdXRCdWZmZXIsIHNpemVvZihJTlQpKTsKLQkJCQlpZihTdGF0dXMpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IG9mIGZsYXNoIHNlY3Rpb24gdmFsIGZhaWxlZCIpOwotCQkJCQlyZXR1cm4gU3RhdHVzOwotCQkJCX0KLQotCQkJCWRvd24oJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCi0JCQkJaWYoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8Ci0JCQkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PVRSVUUpIHx8Ci0JCQkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09VFJVRSkpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiRGV2aWNlIGlzIGluIElkbGUvU2h1dGRvd24gTW9kZVxuIik7Ci0JCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCQkJcmV0dXJuIC1FQUNDRVM7Ci0JCQkJfQotCi0JCQkJU3RhdHVzID0gQmNtU2V0QWN0aXZlU2VjdGlvbihBZGFwdGVyLGVGbGFzaDJ4U2VjdGlvblZhbCk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJGYWlsZWQgdG8gbWFrZSBpdCdzIHByaW9yaXR5IEhpZ2hlc3QuIFN0YXR1cyAlZCIsIFN0YXR1cyk7Ci0JCQkJfQotCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKIAkJCX0KLQkJCWJyZWFrIDsKLQkJY2FzZSBJT0NUTF9CQ01fSURFTlRJRllfQUNUSVZFX1NFQ1RJT04gOgotCQkJIHsKLQkJCSAJLy9SaWdodCBOb3cgd2UgYXJlIHRha2luZyBjYXJlIG9mIG9ubHkgRFNECi0JCQkJQWRhcHRlci0+YkFsbERTRFdyaXRlQWxsb3cgPSBGQUxTRSA7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIklPQ1RMX0JDTV9JREVOVElGWV9BQ1RJVkVfU0VDVElPTiBjYWxsZWQiKTsKKwkJfSB3aGlsZSAoTk9CID4gMCk7CiAKLQkJCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUyA7Ci0JCQkgfQotCQkJIGJyZWFrIDsKLQkJY2FzZSBJT0NUTF9CQ01fQ09QWV9TRUNUSU9OIDoKLQkJCSB7Ci0JCQkJRkxBU0gyWF9DT1BZX1NFQ1RJT04gc0NvcHlTZWN0U3RydXQgPSB7MH07Ci0JCQkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTF9CQ01fQ09QWV9TRUNUSU9OICBDYWxsZWQiKTsKKwkJQmNtRmxhc2gyeFdyaXRlU2lnKEFkYXB0ZXIsIHNGbGFzaDJ4V3JpdGUuU2VjdGlvbik7CisJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwkJa2ZyZWUocFdyaXRlQnVmZik7CisJfQorCWJyZWFrOwogCi0JCQkJQWRhcHRlci0+YkFsbERTRFdyaXRlQWxsb3cgPSBGQUxTRSA7Ci0JCQkJaWYoSXNGbGFzaDJ4KEFkYXB0ZXIpICE9IFRSVUUpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkZsYXNoIERvZXMgbm90IGhhdmUgMi54IG1hcCIpOwotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl9CisJY2FzZSBJT0NUTF9CQ01fR0VUX0ZMQVNIMlhfU0VDVElPTl9CSVRNQVA6IHsKKwkJUEZMQVNIMlhfQklUTUFQIHBzRmxhc2gyeEJpdE1hcDsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiSU9DVExfQkNNX0dFVF9GTEFTSDJYX1NFQ1RJT05fQklUTUFQIENhbGxlZCIpOwogCi0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIFN0YXR1cyA6JWQiLCBTdGF0dXMpOwotCQkJCQlyZXR1cm4gU3RhdHVzOwotCQkJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CiAKLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmc0NvcHlTZWN0U3RydXQsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2YoRkxBU0gyWF9DT1BZX1NFQ1RJT04pKTsKLQkJCQlpZihTdGF0dXMpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IG9mIENvcHlfU2VjdGlvbl9TdHJ1Y3QgZmFpbGVkIHdpdGggU3RhdHVzIDolZCIsIFN0YXR1cyk7Ci0JCQkJCXJldHVybiBTdGF0dXM7Ci0JCQkJfQotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiU291cmNlIFNFY3Rpb24gOiV4Iiwgc0NvcHlTZWN0U3RydXQuU3JjU2VjdGlvbik7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJEZXN0aW5hdGlvbiBTRWN0aW9uIDoleCIsIHNDb3B5U2VjdFN0cnV0LkRzdFNlY3Rpb24pOwotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAib2Zmc2V0IDoleCIsIHNDb3B5U2VjdFN0cnV0Lm9mZnNldCk7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJOT0IgOiV4Iiwgc0NvcHlTZWN0U3RydXQubnVtT2ZCeXRlcyk7CisJCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggIT0gc2l6ZW9mKEZMQVNIMlhfQklUTUFQKSkKKwkJCXJldHVybiAtRUlOVkFMOwogCisJCXBzRmxhc2gyeEJpdE1hcCA9IGt6YWxsb2Moc2l6ZW9mKEZMQVNIMlhfQklUTUFQKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChwc0ZsYXNoMnhCaXRNYXAgPT0gTlVMTCkgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIk1lbW9yeSBpcyBub3QgYXZhaWxhYmxlIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQogCi0JCQkJaWYoSXNTZWN0aW9uRXhpc3RJbkZsYXNoKEFkYXB0ZXIsc0NvcHlTZWN0U3RydXQuU3JjU2VjdGlvbikgPT0gRkFMU0UpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIlNvdXJjZSBTZWN0aW9uPCV4PiBkb2VzIG5vdCBleGl4dCBpbiBGbGFzaCAiLCBzQ29weVNlY3RTdHJ1dC5TcmNTZWN0aW9uKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQorCQkvKiBSZWFkaW5nIHRoZSBGbGFzaCBTZWN0aW8gQml0IG1hcCAqLworCQlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKIAotCQkJCWlmKElzU2VjdGlvbkV4aXN0SW5GbGFzaChBZGFwdGVyLHNDb3B5U2VjdFN0cnV0LkRzdFNlY3Rpb24pID09IEZBTFNFKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJEZXN0aW5hdGlvIFNlY3Rpb248JXg+IGRvZXMgbm90IGV4aXh0IGluIEZsYXNoICIsIHNDb3B5U2VjdFN0cnV0LkRzdFNlY3Rpb24pOwotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl9CisJCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAorCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKIAotCQkJCWlmKHNDb3B5U2VjdFN0cnV0LlNyY1NlY3Rpb24gPT0gc0NvcHlTZWN0U3RydXQuRHN0U2VjdGlvbikKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJTb3VyY2UgYW5kIERlc3RpbmF0aW9uIHNlY3Rpb24gc2hvdWxkIGJlIGRpZmZlcmVudCIpOwotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl9CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKKwkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwkJCWtmcmVlKHBzRmxhc2gyeEJpdE1hcCk7CisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJfQogCi0JCQkJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJCUJjbUdldEZsYXNoMnhTZWN0aW9uYWxCaXRNYXAoQWRhcHRlciwgcHNGbGFzaDJ4Qml0TWFwKTsKKwkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgcHNGbGFzaDJ4Qml0TWFwLCBzaXplb2YoRkxBU0gyWF9CSVRNQVApKSkKKwkJCVN0YXR1cyA9IC1FRkFVTFQ7CiAKLQkJCQlpZigoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKLQkJCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09VFJVRSkgfHwKLQkJCQkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT1UUlVFKSkKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKLQkJCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCQlyZXR1cm4gLUVBQ0NFUzsKLQkJCQl9CisJCWtmcmVlKHBzRmxhc2gyeEJpdE1hcCk7CisJfQorCWJyZWFrOwogCi0JCQkJaWYoc0NvcHlTZWN0U3RydXQuU3JjU2VjdGlvbiA9PSBJU09fSU1BR0UxIHx8IHNDb3B5U2VjdFN0cnV0LlNyY1NlY3Rpb24gPT0gSVNPX0lNQUdFMikKLQkJCQl7Ci0JCQkJCWlmKElzTm9uQ0RMZXNzRGV2aWNlKEFkYXB0ZXIpKQotCQkJCQl7Ci0JCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkRldmljZSBpcyBOb24tQ0RMZXNzIGhlbmNlIHdvbid0IGhhdmUgSVNPICEhIik7Ci0JCQkJCQlTdGF0dXMgPSAtRUlOVkFMIDsKLQkJCQkJfQotCQkJCQllbHNlIGlmKHNDb3B5U2VjdFN0cnV0Lm51bU9mQnl0ZXMgPT0gMCkKLQkJCQkJewotCQkJCQkJU3RhdHVzID0gQmNtQ29weUlTTyhBZGFwdGVyLHNDb3B5U2VjdFN0cnV0KTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiUGFydGlhbCBDb3B5IG9mIElTTyBzZWN0aW9uIGlzIG5vdCBBbGxvd2VkLi4iKTsKLQkJCQkJCVN0YXR1cyA9IFNUQVRVU19GQUlMVVJFIDsKLQkJCQkJfQotCQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJCXJldHVybiBTdGF0dXM7Ci0JCQkJfQorCWNhc2UgSU9DVExfQkNNX1NFVF9BQ1RJVkVfU0VDVElPTjogeworCQlGTEFTSDJYX1NFQ1RJT05fVkFMIGVGbGFzaDJ4U2VjdGlvblZhbCA9IDA7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9TRVRfQUNUSVZFX1NFQ1RJT04gQ2FsbGVkIik7CiAKLQkJCQlTdGF0dXMgPSBCY21Db3B5U2VjdGlvbihBZGFwdGVyLCBzQ29weVNlY3RTdHJ1dC5TcmNTZWN0aW9uLAotCQkJCQkJCXNDb3B5U2VjdFN0cnV0LkRzdFNlY3Rpb24sc0NvcHlTZWN0U3RydXQub2Zmc2V0LHNDb3B5U2VjdFN0cnV0Lm51bU9mQnl0ZXMpOwotCQkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQkJCSB9Ci0JCQkgYnJlYWsgOwotCQljYXNlIElPQ1RMX0JDTV9HRVRfRkxBU0hfQ1NfSU5GTyA6Ci0JCQkgewotCQkJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiIElPQ1RMX0JDTV9HRVRfRkxBU0hfQ1NfSU5GTyBDYWxsZWQiKTsKKwkJaWYgKElzRmxhc2gyeChBZGFwdGVyKSAhPSBUUlVFKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRmxhc2ggRG9lcyBub3QgaGF2ZSAyLnggbWFwIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCi0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZihBZGFwdGVyLT5lTlZNVHlwZSAhPSBOVk1fRkxBU0gpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIkNvbm5lY3RlZCBkZXZpY2UgZG9lcyBub3QgaGF2ZSBmbGFzaCIpOwotCQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYoSXNGbGFzaDJ4KEFkYXB0ZXIpID09IFRSVUUpCi0JCQkJeworCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKTsKKwkJaWYgKFN0YXR1cykgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgSU9DVEwgQlVGRkVSIGZhaWxlZCIpOworCQkJcmV0dXJuIFN0YXR1czsKKwkJfQogCi0JCQkJCWlmKElvQnVmZmVyLk91dHB1dExlbmd0aCA8IHNpemVvZihGTEFTSDJYX0NTX0lORk8pKQotCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZlRmxhc2gyeFNlY3Rpb25WYWwsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2YoSU5UKSk7CisJCWlmIChTdGF0dXMpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IG9mIGZsYXNoIHNlY3Rpb24gdmFsIGZhaWxlZCIpOworCQkJcmV0dXJuIFN0YXR1czsKKwkJfQogCi0JCQkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCBBZGFwdGVyLT5wc0ZsYXNoMnhDU0luZm8sIHNpemVvZihGTEFTSDJYX0NTX0lORk8pKSkKLQkJCQkJCXJldHVybiAtRUZBVUxUOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlpZihJb0J1ZmZlci5PdXRwdXRMZW5ndGggPCBzaXplb2YoRkxBU0hfQ1NfSU5GTykpCi0JCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CiAKLQkJCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsIEFkYXB0ZXItPnBzRmxhc2hDU0luZm8sIHNpemVvZihGTEFTSF9DU19JTkZPKSkpCi0JCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAorCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgewogCi0JCQkgCSB9Ci0JCQkgIH0KLQkJCSAgYnJlYWsgOwotCQljYXNlIElPQ1RMX0JDTV9TRUxFQ1RfRFNEIDoKLQkJCSB7Ci0JCQkJVUlOVCBTZWN0T2ZzZXQgPSAwOwotCQkJCUZMQVNIMlhfU0VDVElPTl9WQUwgZUZsYXNoMnhTZWN0aW9uVmFsOwotCQkJCWVGbGFzaDJ4U2VjdGlvblZhbCA9IE5PX1NFQ1RJT05fVkFMIDsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIiBJT0NUTF9CQ01fU0VMRUNUX0RTRCBDYWxsZWQiKTsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOworCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQkJcmV0dXJuIC1FQUNDRVM7CisJCX0KIAotCQkJCWlmKElzRmxhc2gyeChBZGFwdGVyKSAhPSBUUlVFKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJGbGFzaCBEb2VzIG5vdCBoYXZlIDIueCBtYXAiKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQorCQlTdGF0dXMgPSBCY21TZXRBY3RpdmVTZWN0aW9uKEFkYXB0ZXIsIGVGbGFzaDJ4U2VjdGlvblZhbCk7CisJCWlmIChTdGF0dXMpCisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRmFpbGVkIHRvIG1ha2UgaXQncyBwcmlvcml0eSBIaWdoZXN0LiBTdGF0dXMgJWQiLCBTdGF0dXMpOwogCi0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIik7Ci0JCQkJCXJldHVybiBTdGF0dXM7Ci0JCQkJfQotCQkJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZlRmxhc2gyeFNlY3Rpb25WYWwsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2YoSU5UKSk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBmbGFzaCBzZWN0aW9uIHZhbCBmYWlsZWQiKTsKLQkJCQkJcmV0dXJuIFN0YXR1czsKLQkJCQl9CisJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwl9CisJYnJlYWs7CiAKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiUmVhZCBTZWN0aW9uIDolZCIsIGVGbGFzaDJ4U2VjdGlvblZhbCk7Ci0JCQkJaWYoKGVGbGFzaDJ4U2VjdGlvblZhbCAhPSBEU0QwKSAmJgotCQkJCQkoZUZsYXNoMnhTZWN0aW9uVmFsICE9IERTRDEpICYmCi0JCQkJCShlRmxhc2gyeFNlY3Rpb25WYWwgIT0gRFNEMikgKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJQYXNzZWQgc2VjdGlvbjwleD4gaXMgbm90IERTRCBzZWN0aW9uIiwgZUZsYXNoMnhTZWN0aW9uVmFsKTsKLQkJCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFIDsKLQkJCQl9CisJY2FzZSBJT0NUTF9CQ01fSURFTlRJRllfQUNUSVZFX1NFQ1RJT046IHsKKwkJLyogUmlnaHQgTm93IHdlIGFyZSB0YWtpbmcgY2FyZSBvZiBvbmx5IERTRCAqLworCQlBZGFwdGVyLT5iQWxsRFNEV3JpdGVBbGxvdyA9IEZBTFNFOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTF9CQ01fSURFTlRJRllfQUNUSVZFX1NFQ1RJT04gY2FsbGVkIik7CisJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCX0KKwlicmVhazsKIAotCQkJCVNlY3RPZnNldD0gQmNtR2V0U2VjdGlvblZhbFN0YXJ0T2Zmc2V0KEFkYXB0ZXIsZUZsYXNoMnhTZWN0aW9uVmFsKTsKLQkJCQlpZihTZWN0T2ZzZXQgPT0gSU5WQUxJRF9PRkZTRVQpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIlByb3ZpZGVkIFNlY3Rpb24gdmFsIDwlZD4gZG9lcyBub3QgZXhpeHQgaW4gRmxhc2ggMi54IiwgZUZsYXNoMnhTZWN0aW9uVmFsKTsKLQkJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQkJfQorCWNhc2UgSU9DVExfQkNNX0NPUFlfU0VDVElPTjogeworCQlGTEFTSDJYX0NPUFlfU0VDVElPTiBzQ29weVNlY3RTdHJ1dCA9IHswfTsKKwkJU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIklPQ1RMX0JDTV9DT1BZX1NFQ1RJT04gIENhbGxlZCIpOwogCi0JCQkJQWRhcHRlci0+YkFsbERTRFdyaXRlQWxsb3cgPSBUUlVFIDsKKwkJQWRhcHRlci0+YkFsbERTRFdyaXRlQWxsb3cgPSBGQUxTRTsKKwkJaWYgKElzRmxhc2gyeChBZGFwdGVyKSAhPSBUUlVFKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRmxhc2ggRG9lcyBub3QgaGF2ZSAyLnggbWFwIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCi0JCQkJQWRhcHRlci0+dWxGbGFzaENhbFN0YXJ0ID0gU2VjdE9mc2V0IDsKLQkJCQlBZGFwdGVyLT5lQWN0aXZlRFNEID0gZUZsYXNoMnhTZWN0aW9uVmFsOwotCQkJIH0KLQkJCSBTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUyA7Ci0JCQkgYnJlYWs7CisJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpOworCQlpZiAoU3RhdHVzKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIFN0YXR1cyA6JWQiLCBTdGF0dXMpOworCQkJcmV0dXJuIFN0YXR1czsKKwkJfQogCi0JCWNhc2UgSU9DVExfQkNNX05WTV9SQVdfUkVBRCA6Ci0JCQkgeworCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmc0NvcHlTZWN0U3RydXQsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2YoRkxBU0gyWF9DT1BZX1NFQ1RJT04pKTsKKwkJaWYgKFN0YXR1cykgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgb2YgQ29weV9TZWN0aW9uX1N0cnVjdCBmYWlsZWQgd2l0aCBTdGF0dXMgOiVkIiwgU3RhdHVzKTsKKwkJCXJldHVybiBTdGF0dXM7CisJCX0KIAotCQkJCSBOVk1fUkVBRFdSSVRFIHN0TlZNUmVhZDsKLQkJCQlJTlQgTk9CIDsKLQkJCQlJTlQgQnVmZlNpemUgOwotCQkJCUlOVCBSZWFkT2Zmc2V0ID0gMDsKLQkJCQlVSU5UIFJlYWRCeXRlcyA9IDAgOwotCQkJCVBVQ0hBUiBwUmVhZEJ1ZmY7Ci0JCQkJdm9pZCBfX3VzZXIgKk91dFB1dEJ1ZmY7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlNvdXJjZSBTRWN0aW9uIDoleCIsIHNDb3B5U2VjdFN0cnV0LlNyY1NlY3Rpb24pOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJEZXN0aW5hdGlvbiBTRWN0aW9uIDoleCIsIHNDb3B5U2VjdFN0cnV0LkRzdFNlY3Rpb24pOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJvZmZzZXQgOiV4Iiwgc0NvcHlTZWN0U3RydXQub2Zmc2V0KTsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiTk9CIDoleCIsIHNDb3B5U2VjdFN0cnV0Lm51bU9mQnl0ZXMpOwogCi0JCQkJaWYoQWRhcHRlci0+ZU5WTVR5cGUgIT0gTlZNX0ZMQVNIKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJOVk0gVFlQRSBpcyBub3QgRmxhc2ggIik7Ci0JCQkJCXJldHVybiAtRUlOVkFMIDsKLQkJCQl9CisJCWlmIChJc1NlY3Rpb25FeGlzdEluRmxhc2goQWRhcHRlciwgc0NvcHlTZWN0U3RydXQuU3JjU2VjdGlvbikgPT0gRkFMU0UpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJTb3VyY2UgU2VjdGlvbjwleD4gZG9lcyBub3QgZXhpeHQgaW4gRmxhc2ggIiwgc0NvcHlTZWN0U3RydXQuU3JjU2VjdGlvbik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCi0JCQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0JCQkJaWYoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJjb3B5X2Zyb21fdXNlciAxIGZhaWxlZFxuIik7Ci0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KKwkJaWYgKElzU2VjdGlvbkV4aXN0SW5GbGFzaChBZGFwdGVyLCBzQ29weVNlY3RTdHJ1dC5Ec3RTZWN0aW9uKSA9PSBGQUxTRSkgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkRlc3RpbmF0aW8gU2VjdGlvbjwleD4gZG9lcyBub3QgZXhpeHQgaW4gRmxhc2ggIiwgc0NvcHlTZWN0U3RydXQuRHN0U2VjdGlvbik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCi0JCQkJaWYoY29weV9mcm9tX3VzZXIoJnN0TlZNUmVhZCwgSW9CdWZmZXIuT3V0cHV0QnVmZmVyLHNpemVvZihOVk1fUkVBRFdSSVRFKSkpCi0JCQkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoc0NvcHlTZWN0U3RydXQuU3JjU2VjdGlvbiA9PSBzQ29weVNlY3RTdHJ1dC5Ec3RTZWN0aW9uKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJTb3VyY2UgYW5kIERlc3RpbmF0aW9uIHNlY3Rpb24gc2hvdWxkIGJlIGRpZmZlcmVudCIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAotCQkJCU5PQiA9IHN0TlZNUmVhZC51aU51bUJ5dGVzOwotCQkJCS8vSW4gUmF3LVJlYWQgbWF4IEJ1ZmYgc2l6ZSA6IDY0TUIKKwkJZG93bigmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CiAKLQkJCQlpZihOT0IgPiBERUZBVUxUX0JVRkZfU0laRSkKLQkJCQkJQnVmZlNpemUgPSBERUZBVUxUX0JVRkZfU0laRTsKLQkJCQllbHNlCi0JCQkJCUJ1ZmZTaXplID0gTk9CIDsKKwkJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAorCQkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgewogCi0JCQkJUmVhZE9mZnNldCA9IHN0TlZNUmVhZC51aU9mZnNldDsKLQkJCQlPdXRQdXRCdWZmID0gc3ROVk1SZWFkLnBCdWZmZXI7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJEZXZpY2UgaXMgaW4gSWRsZS9TaHV0ZG93biBNb2RlXG4iKTsKKwkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwkJCXJldHVybiAtRUFDQ0VTOworCQl9CiAKLQkJCQlwUmVhZEJ1ZmYgPSBremFsbG9jKEJ1ZmZTaXplICwgR0ZQX0tFUk5FTCk7Ci0JCQkJaWYocFJlYWRCdWZmID09IE5VTEwpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCBmb3IgRmxhc2ggMi54IFJlYWQgU3RydWN0dXJlIik7Ci0JCQkJCVN0YXR1cyA9IC1FTk9NRU07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKLQotCQkJCWlmKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkJCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT1UUlVFKSB8fAotCQkJCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PVRSVUUpKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOwotCQkJCQlrZnJlZShwUmVhZEJ1ZmYpOwotCQkJCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7Ci0JCQkJCXJldHVybiAtRUFDQ0VTOwotCQkJCX0KLQotCQkJCUFkYXB0ZXItPmJGbGFzaFJhd1JlYWQgPSBUUlVFIDsKLQkJCQl3aGlsZShOT0IpCi0JCQkJewotCQkJCQlpZihOT0IgPiBERUZBVUxUX0JVRkZfU0laRSApCi0JCQkJCQlSZWFkQnl0ZXMgPSBERUZBVUxUX0JVRkZfU0laRTsKLQkJCQkJZWxzZQotCQkJCQkJUmVhZEJ5dGVzID0gTk9COwotCi0JCQkJCS8vUmVhZGluZyB0aGUgZGF0YSBmcm9tIEZsYXNoIDIueAotCQkJCQlTdGF0dXMgPSBCZWNlZW1OVk1SZWFkKEFkYXB0ZXIsKFBVSU5UKXBSZWFkQnVmZixSZWFkT2Zmc2V0LFJlYWRCeXRlcyk7Ci0JCQkJCWlmKFN0YXR1cykKLQkJCQkJewotCQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJGbGFzaCAyeCByZWFkIGVyciB3aXRoIFN0YXR1cyA6JWQiLCBTdGF0dXMpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQotCQkJCQlCQ01fREVCVUdfUFJJTlRfQlVGRkVSKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwscFJlYWRCdWZmLFJlYWRCeXRlcyk7Ci0KLQkJCQkJU3RhdHVzID0gY29weV90b191c2VyKE91dFB1dEJ1ZmYsIHBSZWFkQnVmZixSZWFkQnl0ZXMpOwotCQkJCSAJaWYoU3RhdHVzKQotCQkJCSAJewotCQkJCSAJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiQ29weSB0byB1c2UgZmFpbGVkIHdpdGggc3RhdHVzIDolZCIsIFN0YXR1cyk7Ci0JCQkJCQlicmVhazsKLQkJCQkgCX0KLQkJCQkJTk9CID0gTk9CIC0gUmVhZEJ5dGVzOwotCQkJCQlpZihOT0IpCi0JCQkJCXsKLQkJCQkJCVJlYWRPZmZzZXQgPSBSZWFkT2Zmc2V0ICsgUmVhZEJ5dGVzIDsKLQkJCQkJCU91dFB1dEJ1ZmYgPSBPdXRQdXRCdWZmICsgUmVhZEJ5dGVzIDsKLQkJCQkJfQotCi0JCQkJfQotCQkJCUFkYXB0ZXItPmJGbGFzaFJhd1JlYWQgPSBGQUxTRSA7Ci0JCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCQkJCWtmcmVlKHBSZWFkQnVmZik7Ci0JCQkJYnJlYWsgOwotCQkJIH0KLQotCQljYXNlIElPQ1RMX0JDTV9DTlRSTE1TR19NQVNLOgotCQkJIHsKLQkJCQlVTE9ORyBSeENudHJsTXNnQml0TWFzayA9IDAgOwotCi0JCQkJLyogQ29weSBJb2N0bCBCdWZmZXIgc3RydWN0dXJlICovCi0JCQkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsImNvcHkgb2YgSW9jdGwgYnVmZmVyIGlzIGZhaWxlZCBmcm9tIHVzZXIgc3BhY2UiKTsKLQkJCQkJU3RhdHVzID0gLUVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJaWYgKElvQnVmZmVyLklucHV0TGVuZ3RoICE9IHNpemVvZih1bnNpZ25lZCBsb25nKSkgewotCQkJCQlTdGF0dXMgPSAtRUlOVkFMOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlTdGF0dXMgPSBjb3B5X2Zyb21fdXNlcigmUnhDbnRybE1zZ0JpdE1hc2ssIElvQnVmZmVyLklucHV0QnVmZmVyLCBJb0J1ZmZlci5JbnB1dExlbmd0aCk7Ci0JCQkJaWYoU3RhdHVzKQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsImNvcHkgb2YgY29udHJvbCBiaXQgbWFzayBmYWlsZWQgZnJvbSB1c2VyIHNwYWNlIik7Ci0JCQkJCVN0YXR1cyA9IC1FRkFVTFQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiXG4gR290IHVzZXIgZGVmaW5lZCBjbnRybCBtc2cgYml0IG1hc2sgOiVseCIsIFJ4Q250cmxNc2dCaXRNYXNrKTsKLQkJCQlwVGFyYW5nLT5SeENudHJsTXNnQml0TWFzayA9IFJ4Q250cmxNc2dCaXRNYXNrIDsKLQkJCSB9Ci0JCQkgYnJlYWs7Ci0JCQljYXNlIElPQ1RMX0JDTV9HRVRfREVWSUNFX0RSSVZFUl9JTkZPOgotCQkJewotCQkJCURFVklDRV9EUklWRVJfSU5GTyBEZXZJbmZvOwotCi0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIkNhbGxlZCBJT0NUTF9CQ01fR0VUX0RFVklDRV9EUklWRVJfSU5GT1xuIik7Ci0KLQkJCQlEZXZJbmZvLk1heFJETUJ1ZmZlclNpemUgPSBCVUZGRVJfNEs7Ci0JCQkJRGV2SW5mby51MzJEU0RTdGFydE9mZnNldCA9IEVFUFJPTV9DQUxQQVJBTV9TVEFSVDsKLQkJCQlEZXZJbmZvLnUzMlJ4QWxpZ25tZW50Q29ycmVjdGlvbiA9IDA7Ci0JCQkJRGV2SW5mby51MzJOVk1UeXBlID0gQWRhcHRlci0+ZU5WTVR5cGU7Ci0JCQkJRGV2SW5mby51MzJJbnRlcmZhY2VUeXBlID0gQkNNX1VTQjsKLQotCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJCQlpZihJb0J1ZmZlci5PdXRwdXRMZW5ndGggPCBzaXplb2YoRGV2SW5mbykpCi0JCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZEZXZJbmZvLCBzaXplb2YoRGV2SW5mbykpKQotCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHNDb3B5U2VjdFN0cnV0LlNyY1NlY3Rpb24gPT0gSVNPX0lNQUdFMSB8fCBzQ29weVNlY3RTdHJ1dC5TcmNTZWN0aW9uID09IElTT19JTUFHRTIpIHsKKwkJCWlmIChJc05vbkNETGVzc0RldmljZShBZGFwdGVyKSkgeworCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJEZXZpY2UgaXMgTm9uLUNETGVzcyBoZW5jZSB3b24ndCBoYXZlIElTTyAhISIpOworCQkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQl9IGVsc2UgaWYgKHNDb3B5U2VjdFN0cnV0Lm51bU9mQnl0ZXMgPT0gMCkgeworCQkJCVN0YXR1cyA9IEJjbUNvcHlJU08oQWRhcHRlciwgc0NvcHlTZWN0U3RydXQpOworCQkJfSBlbHNlIHsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiUGFydGlhbCBDb3B5IG9mIElTTyBzZWN0aW9uIGlzIG5vdCBBbGxvd2VkLi4iKTsKKwkJCQlTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKIAkJCX0KLQkJCWJyZWFrIDsKKwkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwkJCXJldHVybiBTdGF0dXM7CisJCX0KIAotCQkJY2FzZSBJT0NUTF9CQ01fVElNRV9TSU5DRV9ORVRfRU5UUlk6Ci0JCQl7Ci0JCQkJU1RfVElNRV9FTEFQU0VEIHN0VGltZUVsYXBzZWRTaW5jZU5ldEVudHJ5ID0gezB9OworCQlTdGF0dXMgPSBCY21Db3B5U2VjdGlvbihBZGFwdGVyLCBzQ29weVNlY3RTdHJ1dC5TcmNTZWN0aW9uLAorCQkJCQlzQ29weVNlY3RTdHJ1dC5Ec3RTZWN0aW9uLCBzQ29weVNlY3RTdHJ1dC5vZmZzZXQsIHNDb3B5U2VjdFN0cnV0Lm51bU9mQnl0ZXMpOworCQl1cCgmQWRhcHRlci0+TlZNUmRtV3JtTG9jayk7CisJfQorCWJyZWFrOwogCi0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIklPQ1RMX0JDTV9USU1FX1NJTkNFX05FVF9FTlRSWSBjYWxsZWQiKTsKKwljYXNlIElPQ1RMX0JDTV9HRVRfRkxBU0hfQ1NfSU5GTzogeworCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiIElPQ1RMX0JDTV9HRVRfRkxBU0hfQ1NfSU5GTyBDYWxsZWQiKTsKIAotCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmSW9CdWZmZXIsIGFyZ3AsIHNpemVvZihJT0NUTF9CVUZGRVIpKSkKLQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpOworCQlpZiAoU3RhdHVzKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIik7CisJCQlicmVhazsKKwkJfQogCi0JCQkJaWYoSW9CdWZmZXIuT3V0cHV0TGVuZ3RoIDwgc2l6ZW9mKFNUX1RJTUVfRUxBUFNFRCkpCi0JCQkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoQWRhcHRlci0+ZU5WTVR5cGUgIT0gTlZNX0ZMQVNIKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29ubmVjdGVkIGRldmljZSBkb2VzIG5vdCBoYXZlIGZsYXNoIik7CisJCQlTdGF0dXMgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KIAotCQkJCXN0VGltZUVsYXBzZWRTaW5jZU5ldEVudHJ5LnVsNjRUaW1lRWxhcHNlZFNpbmNlTmV0RW50cnkgPSBnZXRfc2Vjb25kcygpIC0gQWRhcHRlci0+bGlUaW1lU2luY2VMYXN0TmV0RW50cnk7CisJCWlmIChJc0ZsYXNoMngoQWRhcHRlcikgPT0gVFJVRSkgeworCQkJaWYgKElvQnVmZmVyLk91dHB1dExlbmd0aCA8IHNpemVvZihGTEFTSDJYX0NTX0lORk8pKQorCQkJCXJldHVybiAtRUlOVkFMOwogCi0JCQkJaWYgKGNvcHlfdG9fdXNlcihJb0J1ZmZlci5PdXRwdXRCdWZmZXIsICZzdFRpbWVFbGFwc2VkU2luY2VOZXRFbnRyeSwgc2l6ZW9mKFNUX1RJTUVfRUxBUFNFRCkpKQotCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCBBZGFwdGVyLT5wc0ZsYXNoMnhDU0luZm8sIHNpemVvZihGTEFTSDJYX0NTX0lORk8pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfSBlbHNlIHsKKwkJCWlmIChJb0J1ZmZlci5PdXRwdXRMZW5ndGggPCBzaXplb2YoRkxBU0hfQ1NfSU5GTykpCisJCQkJcmV0dXJuIC1FSU5WQUw7CiAKKwkJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCBBZGFwdGVyLT5wc0ZsYXNoQ1NJbmZvLCBzaXplb2YoRkxBU0hfQ1NfSU5GTykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCWJyZWFrOworCisJY2FzZSBJT0NUTF9CQ01fU0VMRUNUX0RTRDogeworCQlVSU5UIFNlY3RPZnNldCA9IDA7CisJCUZMQVNIMlhfU0VDVElPTl9WQUwgZUZsYXNoMnhTZWN0aW9uVmFsOworCQllRmxhc2gyeFNlY3Rpb25WYWwgPSBOT19TRUNUSU9OX1ZBTDsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiSU9DVExfQkNNX1NFTEVDVF9EU0QgQ2FsbGVkIik7CisKKwkJaWYgKElzRmxhc2gyeChBZGFwdGVyKSAhPSBUUlVFKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiRmxhc2ggRG9lcyBub3QgaGF2ZSAyLnggbWFwIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpOworCQlpZiAoU3RhdHVzKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiQ29weSBvZiBJT0NUTCBCVUZGRVIgZmFpbGVkIik7CisJCQlyZXR1cm4gU3RhdHVzOworCQl9CisJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZlRmxhc2gyeFNlY3Rpb25WYWwsIElvQnVmZmVyLklucHV0QnVmZmVyLCBzaXplb2YoSU5UKSk7CisJCWlmIChTdGF0dXMpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJDb3B5IG9mIGZsYXNoIHNlY3Rpb24gdmFsIGZhaWxlZCIpOworCQkJcmV0dXJuIFN0YXR1czsKKwkJfQorCisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIlJlYWQgU2VjdGlvbiA6JWQiLCBlRmxhc2gyeFNlY3Rpb25WYWwpOworCQlpZiAoKGVGbGFzaDJ4U2VjdGlvblZhbCAhPSBEU0QwKSAmJgorCQkJKGVGbGFzaDJ4U2VjdGlvblZhbCAhPSBEU0QxKSAmJgorCQkJKGVGbGFzaDJ4U2VjdGlvblZhbCAhPSBEU0QyKSkgeworCisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiUGFzc2VkIHNlY3Rpb248JXg+IGlzIG5vdCBEU0Qgc2VjdGlvbiIsIGVGbGFzaDJ4U2VjdGlvblZhbCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CisJCX0KKworCQlTZWN0T2ZzZXQgPSBCY21HZXRTZWN0aW9uVmFsU3RhcnRPZmZzZXQoQWRhcHRlciwgZUZsYXNoMnhTZWN0aW9uVmFsKTsKKwkJaWYgKFNlY3RPZnNldCA9PSBJTlZBTElEX09GRlNFVCkgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIlByb3ZpZGVkIFNlY3Rpb24gdmFsIDwlZD4gZG9lcyBub3QgZXhpeHQgaW4gRmxhc2ggMi54IiwgZUZsYXNoMnhTZWN0aW9uVmFsKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJQWRhcHRlci0+YkFsbERTRFdyaXRlQWxsb3cgPSBUUlVFOworCQlBZGFwdGVyLT51bEZsYXNoQ2FsU3RhcnQgPSBTZWN0T2ZzZXQ7CisJCUFkYXB0ZXItPmVBY3RpdmVEU0QgPSBlRmxhc2gyeFNlY3Rpb25WYWw7CisJfQorCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCWJyZWFrOworCisJY2FzZSBJT0NUTF9CQ01fTlZNX1JBV19SRUFEOiB7CisJCU5WTV9SRUFEV1JJVEUgc3ROVk1SZWFkOworCQlJTlQgTk9CIDsKKwkJSU5UIEJ1ZmZTaXplIDsKKwkJSU5UIFJlYWRPZmZzZXQgPSAwOworCQlVSU5UIFJlYWRCeXRlcyA9IDAgOworCQlQVUNIQVIgcFJlYWRCdWZmOworCQl2b2lkIF9fdXNlciAqT3V0UHV0QnVmZjsKKworCQlpZiAoQWRhcHRlci0+ZU5WTVR5cGUgIT0gTlZNX0ZMQVNIKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiTlZNIFRZUEUgaXMgbm90IEZsYXNoIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCS8qIENvcHkgSW9jdGwgQnVmZmVyIHN0cnVjdHVyZSAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSkpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJjb3B5X2Zyb21fdXNlciAxIGZhaWxlZFxuIik7CisJCQlTdGF0dXMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnN0TlZNUmVhZCwgSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCBzaXplb2YoTlZNX1JFQURXUklURSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJTk9CID0gc3ROVk1SZWFkLnVpTnVtQnl0ZXM7CisJCS8qIEluIFJhdy1SZWFkIG1heCBCdWZmIHNpemUgOiA2NE1CICovCisKKwkJaWYgKE5PQiA+IERFRkFVTFRfQlVGRl9TSVpFKQorCQkJQnVmZlNpemUgPSBERUZBVUxUX0JVRkZfU0laRTsKKwkJZWxzZQorCQkJQnVmZlNpemUgPSBOT0I7CisKKwkJUmVhZE9mZnNldCA9IHN0TlZNUmVhZC51aU9mZnNldDsKKwkJT3V0UHV0QnVmZiA9IHN0TlZNUmVhZC5wQnVmZmVyOworCisJCXBSZWFkQnVmZiA9IGt6YWxsb2MoQnVmZlNpemUgLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHBSZWFkQnVmZiA9PSBOVUxMKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGZvciBGbGFzaCAyLnggUmVhZCBTdHJ1Y3R1cmUiKTsKKwkJCVN0YXR1cyA9IC1FTk9NRU07CisJCQlicmVhazsKKwkJfQorCQlkb3duKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKworCQlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CisJCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKKwkJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgIkRldmljZSBpcyBpbiBJZGxlL1NodXRkb3duIE1vZGVcbiIpOworCQkJa2ZyZWUocFJlYWRCdWZmKTsKKwkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwkJCXJldHVybiAtRUFDQ0VTOworCQl9CisKKwkJQWRhcHRlci0+YkZsYXNoUmF3UmVhZCA9IFRSVUU7CisKKwkJd2hpbGUgKE5PQikgeworCQkJaWYgKE5PQiA+IERFRkFVTFRfQlVGRl9TSVpFKQorCQkJCVJlYWRCeXRlcyA9IERFRkFVTFRfQlVGRl9TSVpFOworCQkJZWxzZQorCQkJCVJlYWRCeXRlcyA9IE5PQjsKKworCQkJLyogUmVhZGluZyB0aGUgZGF0YSBmcm9tIEZsYXNoIDIueCAqLworCQkJU3RhdHVzID0gQmVjZWVtTlZNUmVhZChBZGFwdGVyLCAoUFVJTlQpcFJlYWRCdWZmLCBSZWFkT2Zmc2V0LCBSZWFkQnl0ZXMpOworCQkJaWYgKFN0YXR1cykgeworCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJGbGFzaCAyeCByZWFkIGVyciB3aXRoIFN0YXR1cyA6JWQiLCBTdGF0dXMpOworCQkJCWJyZWFrOwogCQkJfQotCQkJYnJlYWs7CiAKLQkJY2FzZSBJT0NUTF9DTE9TRV9OT1RJRklDQVRJT046Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwiSU9DVExfQ0xPU0VfTk9USUZJQ0FUSU9OIik7Ci0JCQlicmVhazsKKwkJCUJDTV9ERUJVR19QUklOVF9CVUZGRVIoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsIHBSZWFkQnVmZiwgUmVhZEJ5dGVzKTsKIAotCQlkZWZhdWx0OgotCQkJcHJfaW5mbyhEUlZfTkFNRSAiOiB1bmtub3duIGlvY3RsIGNtZD0lI3hcbiIsIGNtZCk7Ci0JCQlTdGF0dXMgPSBTVEFUVVNfRkFJTFVSRTsKKwkJCVN0YXR1cyA9IGNvcHlfdG9fdXNlcihPdXRQdXRCdWZmLCBwUmVhZEJ1ZmYsIFJlYWRCeXRlcyk7CisJCQlpZiAoU3RhdHVzKSB7CisJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkNvcHkgdG8gdXNlIGZhaWxlZCB3aXRoIHN0YXR1cyA6JWQiLCBTdGF0dXMpOworCQkJCWJyZWFrOworCQkJfQorCQkJTk9CID0gTk9CIC0gUmVhZEJ5dGVzOworCQkJaWYgKE5PQikgeworCQkJCVJlYWRPZmZzZXQgPSBSZWFkT2Zmc2V0ICsgUmVhZEJ5dGVzOworCQkJCU91dFB1dEJ1ZmYgPSBPdXRQdXRCdWZmICsgUmVhZEJ5dGVzOworCQkJfQorCQl9CisJCUFkYXB0ZXItPmJGbGFzaFJhd1JlYWQgPSBGQUxTRTsKKwkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOworCQlrZnJlZShwUmVhZEJ1ZmYpOworCQlicmVhazsKKwl9CisKKwljYXNlIElPQ1RMX0JDTV9DTlRSTE1TR19NQVNLOiB7CisJCVVMT05HIFJ4Q250cmxNc2dCaXRNYXNrID0gMDsKKworCQkvKiBDb3B5IElvY3RsIEJ1ZmZlciBzdHJ1Y3R1cmUgKi8KKwkJU3RhdHVzID0gY29weV9mcm9tX3VzZXIoJklvQnVmZmVyLCBhcmdwLCBzaXplb2YoSU9DVExfQlVGRkVSKSk7CisJCWlmIChTdGF0dXMpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE9TQUxfREJHLCBEQkdfTFZMX0FMTCwgImNvcHkgb2YgSW9jdGwgYnVmZmVyIGlzIGZhaWxlZCBmcm9tIHVzZXIgc3BhY2UiKTsKKwkJCVN0YXR1cyA9IC1FRkFVTFQ7CiAJCQlicmVhazsKKwkJfQorCisJCWlmIChJb0J1ZmZlci5JbnB1dExlbmd0aCAhPSBzaXplb2YodW5zaWduZWQgbG9uZykpIHsKKwkJCVN0YXR1cyA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCVN0YXR1cyA9IGNvcHlfZnJvbV91c2VyKCZSeENudHJsTXNnQml0TWFzaywgSW9CdWZmZXIuSW5wdXRCdWZmZXIsIElvQnVmZmVyLklucHV0TGVuZ3RoKTsKKwkJaWYgKFN0YXR1cykgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiY29weSBvZiBjb250cm9sIGJpdCBtYXNrIGZhaWxlZCBmcm9tIHVzZXIgc3BhY2UiKTsKKwkJCVN0YXR1cyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJcbiBHb3QgdXNlciBkZWZpbmVkIGNudHJsIG1zZyBiaXQgbWFzayA6JWx4IiwgUnhDbnRybE1zZ0JpdE1hc2spOworCQlwVGFyYW5nLT5SeENudHJsTXNnQml0TWFzayA9IFJ4Q250cmxNc2dCaXRNYXNrOworCX0KKwlicmVhazsKKworCWNhc2UgSU9DVExfQkNNX0dFVF9ERVZJQ0VfRFJJVkVSX0lORk86IHsKKwkJREVWSUNFX0RSSVZFUl9JTkZPIERldkluZm87CisKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiQ2FsbGVkIElPQ1RMX0JDTV9HRVRfREVWSUNFX0RSSVZFUl9JTkZPXG4iKTsKKworCQlEZXZJbmZvLk1heFJETUJ1ZmZlclNpemUgPSBCVUZGRVJfNEs7CisJCURldkluZm8udTMyRFNEU3RhcnRPZmZzZXQgPSBFRVBST01fQ0FMUEFSQU1fU1RBUlQ7CisJCURldkluZm8udTMyUnhBbGlnbm1lbnRDb3JyZWN0aW9uID0gMDsKKwkJRGV2SW5mby51MzJOVk1UeXBlID0gQWRhcHRlci0+ZU5WTVR5cGU7CisJCURldkluZm8udTMySW50ZXJmYWNlVHlwZSA9IEJDTV9VU0I7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKElvQnVmZmVyLk91dHB1dExlbmd0aCA8IHNpemVvZihEZXZJbmZvKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChjb3B5X3RvX3VzZXIoSW9CdWZmZXIuT3V0cHV0QnVmZmVyLCAmRGV2SW5mbywgc2l6ZW9mKERldkluZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlicmVhazsKKworCWNhc2UgSU9DVExfQkNNX1RJTUVfU0lOQ0VfTkVUX0VOVFJZOiB7CisJCVNUX1RJTUVfRUxBUFNFRCBzdFRpbWVFbGFwc2VkU2luY2VOZXRFbnRyeSA9IHswfTsKKworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBPU0FMX0RCRywgREJHX0xWTF9BTEwsICJJT0NUTF9CQ01fVElNRV9TSU5DRV9ORVRfRU5UUlkgY2FsbGVkIik7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZJb0J1ZmZlciwgYXJncCwgc2l6ZW9mKElPQ1RMX0JVRkZFUikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKElvQnVmZmVyLk91dHB1dExlbmd0aCA8IHNpemVvZihTVF9USU1FX0VMQVBTRUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJc3RUaW1lRWxhcHNlZFNpbmNlTmV0RW50cnkudWw2NFRpbWVFbGFwc2VkU2luY2VOZXRFbnRyeSA9IGdldF9zZWNvbmRzKCkgLSBBZGFwdGVyLT5saVRpbWVTaW5jZUxhc3ROZXRFbnRyeTsKKworCQlpZiAoY29weV90b191c2VyKElvQnVmZmVyLk91dHB1dEJ1ZmZlciwgJnN0VGltZUVsYXBzZWRTaW5jZU5ldEVudHJ5LCBzaXplb2YoU1RfVElNRV9FTEFQU0VEKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJYnJlYWs7CisKKwljYXNlIElPQ1RMX0NMT1NFX05PVElGSUNBVElPTjoKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgT1NBTF9EQkcsIERCR19MVkxfQUxMLCAiSU9DVExfQ0xPU0VfTk9USUZJQ0FUSU9OIik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJfaW5mbyhEUlZfTkFNRSAiOiB1bmtub3duIGlvY3RsIGNtZD0lI3hcbiIsIGNtZCk7CisJCVN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCQlicmVhazsKIAl9CiAJcmV0dXJuIFN0YXR1czsKIH0KQEAgLTIxMDcsOCArMTk4OSw2IEBACiAJLmxsc2VlayA9IG5vX2xsc2VlaywKIH07CiAKLWV4dGVybiBzdHJ1Y3QgY2xhc3MgKmJjbV9jbGFzczsKLQogaW50IHJlZ2lzdGVyX2NvbnRyb2xfZGV2aWNlX2ludGVyZmFjZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7CiAKQEAgLTIxMjIsOCArMjAwMiw4IEBACiAJfQogCiAJQWRhcHRlci0+cHN0Q3JlYXRlZENsYXNzRGV2aWNlID0gZGV2aWNlX2NyZWF0ZShiY21fY2xhc3MsIE5VTEwsCi0JCQkJCQkgICAgICAgTUtERVYoQWRhcHRlci0+bWFqb3IsIDApLAotCQkJCQkJICAgICAgIEFkYXB0ZXIsIERFVl9OQU1FKTsKKwkJCQkJCU1LREVWKEFkYXB0ZXItPm1ham9yLCAwKSwKKwkJCQkJCUFkYXB0ZXIsIERFVl9OQU1FKTsKIAogCWlmIChJU19FUlIoQWRhcHRlci0+cHN0Q3JlYXRlZENsYXNzRGV2aWNlKSkgewogCQlwcl9lcnIoRFJWX05BTUUgIjogY2xhc3MgZGV2aWNlIGNyZWF0ZSBmYWlsZWRcbiIpOwpAQCAtMjE0MSwzICsyMDIxLDQgQEAKIAkJdW5yZWdpc3Rlcl9jaHJkZXYoQWRhcHRlci0+bWFqb3IsIERFVl9OQU1FKTsKIAl9CiB9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlRGxkLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZURsZC5jCmluZGV4IGRmNjRhY2IuLmJjZDg2YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlRGxkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VEbGQuYwpAQCAtMSwyMDQgKzEsMTgzIEBACiAjaW5jbHVkZSAiaGVhZGVycy5oIgogCi0KLWludCBJbnRlcmZhY2VGaWxlRG93bmxvYWQoIFBWT0lEIGFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBmaWxlICpmbHAsCi0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb25fY2hpcF9sb2MpCitpbnQgSW50ZXJmYWNlRmlsZURvd25sb2FkKFBWT0lEIGFyZywgc3RydWN0IGZpbGUgKmZscCwgdW5zaWduZWQgaW50IG9uX2NoaXBfbG9jKQogewotICAgLy8gdW5zaWduZWQgaW50ICAgIHJlZz0wOwotICAgIG1tX3NlZ21lbnRfdCAgICBvbGRmcz17MH07Ci0gICAgaW50ICAgICAgICAgICAgIGVycm5vPTAsIGxlbj0wIC8qLGlzX2NvbmZpZ19maWxlID0gMCovOwotICAgIGxvZmZfdCAgICAgICAgICBwb3M9MDsKKwkvKiB1bnNpZ25lZCBpbnQgcmVnID0gMDsgKi8KKwltbV9zZWdtZW50X3Qgb2xkZnMgPSB7MH07CisJaW50IGVycm5vID0gMCwgbGVuID0gMDsgLyogLGlzX2NvbmZpZ19maWxlID0gMCAqLworCWxvZmZfdCBwb3MgPSAwOwogCVBTX0lOVEVSRkFDRV9BREFQVEVSIHBzSW50ZkFkYXB0ZXIgPSAoUFNfSU5URVJGQUNFX0FEQVBURVIpYXJnOwotCS8vUE1JTklfQURBUFRFUiBBZGFwdGVyID0gcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyOwotICAgIGNoYXIgICAgICAgICAgICAqYnVmZj1rbWFsbG9jKE1BWF9UUkFOU0ZFUl9DVFJMX0JZVEVfVVNCLCBHRlBfS0VSTkVMKTsKKwkvKiBQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXI7ICovCisJY2hhciAqYnVmZiA9IGttYWxsb2MoTUFYX1RSQU5TRkVSX0NUUkxfQllURV9VU0IsIEdGUF9LRVJORUwpOwogCi0gICAgaWYoIWJ1ZmYpCi0gICAgewotICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICB9Ci0gICAgd2hpbGUoMSkKLSAgICB7Ci0gICAgICAgIG9sZGZzPWdldF9mcygpOyBzZXRfZnMoZ2V0X2RzKCkpOwotICAgICAgICBsZW49dmZzX3JlYWQoZmxwLCAodm9pZCBfX2ZvcmNlIF9fdXNlciAqKWJ1ZmYsIE1BWF9UUkFOU0ZFUl9DVFJMX0JZVEVfVVNCLCAmcG9zKTsKLSAgICAgICAgc2V0X2ZzKG9sZGZzKTsKLSAgICAgICAgaWYobGVuPD0wKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihsZW48MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgImxlbiA8IDAiKTsKLSAgICAgICAgICAgICAgICBlcnJubz1sZW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJybm8gPSAwOwotICAgICAgICAgICAgICAgIEJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiR290IGVuZCBvZiBmaWxlISIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgLy9CQ01fREVCVUdfUFJJTlRfQlVGRkVSKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCBidWZmLCBNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQik7Ci0gICAgICAgIGVycm5vID0gSW50ZXJmYWNlV1JNKHBzSW50ZkFkYXB0ZXIsIG9uX2NoaXBfbG9jLCBidWZmLCBsZW4pIDsKLQkJaWYoZXJybm8pCi0JCXsKLSAgICAgICAgICAgIEJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiV1JNIEZhaWxlZCEgc3RhdHVzOiAlZCIsIGVycm5vKTsKKwlpZiAoIWJ1ZmYpCisJCXJldHVybiAtRU5PTUVNOworCisJd2hpbGUgKDEpIHsKKwkJb2xkZnMgPSBnZXRfZnMoKTsKKwkJc2V0X2ZzKGdldF9kcygpKTsKKwkJbGVuID0gdmZzX3JlYWQoZmxwLCAodm9pZCBfX2ZvcmNlIF9fdXNlciAqKWJ1ZmYsCisJCQlNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQiwgJnBvcyk7CisJCXNldF9mcyhvbGRmcyk7CisJCWlmIChsZW4gPD0gMCkgeworCQkJaWYgKGxlbiA8IDApIHsKKwkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLAorCQkJCQkJREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsCisJCQkJCQlEQkdfTFZMX0FMTCwgImxlbiA8IDAiKTsKKwkJCQllcnJubyA9IGxlbjsKKwkJCX0gZWxzZSB7CisJCQkJZXJybm8gPSAwOworCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsCisJCQkJCQlEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwKKwkJCQkJCURCR19MVkxfQUxMLAorCQkJCQkJIkdvdCBlbmQgb2YgZmlsZSEiKTsKKwkJCX0KIAkJCWJyZWFrOwotCiAJCX0KLSAgICAgICAgb25fY2hpcF9sb2MrPU1BWF9UUkFOU0ZFUl9DVFJMX0JZVEVfVVNCOwotCX0vKiBFbmQgb2YgZm9yKDs7KSovCisJCS8qIEJDTV9ERUJVR19QUklOVF9CVUZGRVIoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwKKwkJICoJCQkgIERCR19MVkxfQUxMLCBidWZmLAorCQkgKgkJCSAgTUFYX1RSQU5TRkVSX0NUUkxfQllURV9VU0IpOworCQkgKi8KKwkJZXJybm8gPSBJbnRlcmZhY2VXUk0ocHNJbnRmQWRhcHRlciwgb25fY2hpcF9sb2MsIGJ1ZmYsIGxlbik7CisJCWlmIChlcnJubykgeworCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwKKwkJCQkJREJHX1RZUEVfUFJJTlRLLCAwLCAwLAorCQkJCQkiV1JNIEZhaWxlZCEgc3RhdHVzOiAlZCIsIGVycm5vKTsKKwkJCWJyZWFrOworCQl9CisJCW9uX2NoaXBfbG9jICs9IE1BWF9UUkFOU0ZFUl9DVFJMX0JZVEVfVVNCOworCX0KIAogCWtmcmVlKGJ1ZmYpOwotICAgIHJldHVybiBlcnJubzsKKwlyZXR1cm4gZXJybm87CiB9CiAKLWludCBJbnRlcmZhY2VGaWxlUmVhZGJhY2tGcm9tQ2hpcCggUFZPSUQgYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZpbGUgKmZscCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBvbl9jaGlwX2xvYykKK2ludCBJbnRlcmZhY2VGaWxlUmVhZGJhY2tGcm9tQ2hpcChQVk9JRCBhcmcsIHN0cnVjdCBmaWxlICpmbHAsIHVuc2lnbmVkIGludCBvbl9jaGlwX2xvYykKIHsKLSAgICBjaGFyICAgICAgICAgICAgKmJ1ZmYsICpidWZmX3JlYWRiYWNrOwotICAgIHVuc2lnbmVkIGludCAgICByZWc9MDsKLSAgICBtbV9zZWdtZW50X3QgICAgb2xkZnM9ezB9OwotICAgIGludCAgICAgICAgICAgICBlcnJubz0wLCBsZW49MCwgaXNfY29uZmlnX2ZpbGUgPSAwOwotICAgIGxvZmZfdCAgICAgICAgICBwb3M9MDsKLSAgICBzdGF0aWMgaW50IGZ3X2Rvd24gPSAwOwotCUlOVAkJCQlTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKKwljaGFyICpidWZmLCAqYnVmZl9yZWFkYmFjazsKKwl1bnNpZ25lZCBpbnQgcmVnID0gMDsKKwltbV9zZWdtZW50X3Qgb2xkZnMgPSB7MH07CisJaW50IGVycm5vID0gMCwgbGVuID0gMCwgaXNfY29uZmlnX2ZpbGUgPSAwOworCWxvZmZfdCBwb3MgPSAwOworCXN0YXRpYyBpbnQgZndfZG93bjsKKwlJTlQgU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAJUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlciA9IChQU19JTlRFUkZBQ0VfQURBUFRFUilhcmc7CiAKLSAgICBidWZmPWttYWxsb2MoTUFYX1RSQU5TRkVSX0NUUkxfQllURV9VU0IsIEdGUF9ETUEpOwotICAgIGJ1ZmZfcmVhZGJhY2s9a21hbGxvYyhNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQiAsIEdGUF9ETUEpOwotICAgIGlmKCFidWZmIHx8ICFidWZmX3JlYWRiYWNrKQotICAgIHsKLSAgICAgICAga2ZyZWUoYnVmZik7Ci0gICAgICAgIGtmcmVlKGJ1ZmZfcmVhZGJhY2spOworCWJ1ZmYgPSBrbWFsbG9jKE1BWF9UUkFOU0ZFUl9DVFJMX0JZVEVfVVNCLCBHRlBfRE1BKTsKKwlidWZmX3JlYWRiYWNrID0ga21hbGxvYyhNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQiAsIEdGUF9ETUEpOworCWlmICghYnVmZiB8fCAhYnVmZl9yZWFkYmFjaykgeworCQlrZnJlZShidWZmKTsKKwkJa2ZyZWUoYnVmZl9yZWFkYmFjayk7CiAKLSAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgfQorCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKLQlpc19jb25maWdfZmlsZSA9IChvbl9jaGlwX2xvYyA9PSBDT05GSUdfQkVHSU5fQUREUik/IDE6MDsKKwlpc19jb25maWdfZmlsZSA9IChvbl9jaGlwX2xvYyA9PSBDT05GSUdfQkVHSU5fQUREUikgPyAxIDogMDsKIAogCW1lbXNldChidWZmX3JlYWRiYWNrLCAwLCBNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQik7CiAJbWVtc2V0KGJ1ZmYsIDAsIE1BWF9UUkFOU0ZFUl9DVFJMX0JZVEVfVVNCKTsKLSAgICB3aGlsZSgxKQotICAgIHsKLSAgICAgICAgb2xkZnM9Z2V0X2ZzKCk7IHNldF9mcyhnZXRfZHMoKSk7Ci0gICAgICAgIGxlbj12ZnNfcmVhZChmbHAsICh2b2lkIF9fZm9yY2UgX191c2VyICopYnVmZiwgTUFYX1RSQU5TRkVSX0NUUkxfQllURV9VU0IsICZwb3MpOwotICAgICAgICBzZXRfZnMob2xkZnMpOwotICAgICAgICBmd19kb3duKys7Ci0gICAgICAgIGlmKGxlbjw9MCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYobGVuPDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJsZW4gPCAwIik7Ci0gICAgICAgICAgICAgICAgZXJybm89bGVuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVycm5vID0gMDsKLSAgICAgICAgICAgICAgICBCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkdvdCBlbmQgb2YgZmlsZSEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisJd2hpbGUgKDEpIHsKKwkJb2xkZnMgPSBnZXRfZnMoKTsKKwkJc2V0X2ZzKGdldF9kcygpKTsKKwkJbGVuID0gdmZzX3JlYWQoZmxwLCAodm9pZCBfX2ZvcmNlIF9fdXNlciAqKWJ1ZmYsIE1BWF9UUkFOU0ZFUl9DVFJMX0JZVEVfVVNCLCAmcG9zKTsKKwkJc2V0X2ZzKG9sZGZzKTsKKwkJZndfZG93bisrOwogCisJCWlmIChsZW4gPD0gMCkgeworCQkJaWYgKGxlbiA8IDApIHsKKwkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJsZW4gPCAwIik7CisJCQkJZXJybm8gPSBsZW47CisJCQl9IGVsc2UgeworCQkJCWVycm5vID0gMDsKKwkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJHb3QgZW5kIG9mIGZpbGUhIik7CisJCQl9CisJCQlicmVhazsKKwkJfQogCiAJCVN0YXR1cyA9IEludGVyZmFjZVJETShwc0ludGZBZGFwdGVyLCBvbl9jaGlwX2xvYywgYnVmZl9yZWFkYmFjaywgbGVuKTsKLQkJaWYoU3RhdHVzKQotCQl7Ci0gICAgICAgICAgICBCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIlJETSBvZiBsZW4gJWQgRmFpbGVkISAlZCIsIGxlbiwgcmVnKTsKKwkJaWYgKFN0YXR1cykgeworCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiUkRNIG9mIGxlbiAlZCBGYWlsZWQhICVkIiwgbGVuLCByZWcpOwogCQkJZ290byBleGl0OwogCQl9CiAJCXJlZysrOwotICAgICAgICBpZigobGVuLXNpemVvZih1bnNpZ25lZCBpbnQpKTw0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihtZW1jbXAoYnVmZl9yZWFkYmFjaywgYnVmZiwgbGVuKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkZpcm13YXJlIERvd25sb2FkIGlzIG5vdCBwcm9wZXIgJWQiLCBmd19kb3duKTsKLQkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULERCR19MVkxfQUxMLCJMZW5ndGggaXM6ICVkIixsZW4pOworCQlpZiAoKGxlbi1zaXplb2YodW5zaWduZWQgaW50KSkgPCA0KSB7CisJCQlpZiAobWVtY21wKGJ1ZmZfcmVhZGJhY2ssIGJ1ZmYsIGxlbikpIHsKKwkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJGaXJtd2FyZSBEb3dubG9hZCBpcyBub3QgcHJvcGVyICVkIiwgZndfZG93bik7CisJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiTGVuZ3RoIGlzOiAlZCIsIGxlbik7CiAJCQkJU3RhdHVzID0gLUVJTzsKIAkJCQlnb3RvIGV4aXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBsZW4tPTQ7Ci0gICAgICAgICAgICB3aGlsZShsZW4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoKih1bnNpZ25lZCBpbnQqKSZidWZmX3JlYWRiYWNrW2xlbl0gIT0gKih1bnNpZ25lZCBpbnQgKikmYnVmZltsZW5dKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJGaXJtd2FyZSBEb3dubG9hZCBpcyBub3QgcHJvcGVyICVkIiwgZndfZG93bik7Ci0gICAgICAgICAgICAgICAgICAgIEJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiVmFsIGZyb20gQmluYXJ5ICV4LCBWYWwgRnJvbSBSZWFkIEJhY2sgJXggIiwgKih1bnNpZ25lZCBpbnQgKikmYnVmZltsZW5dLCAqKHVuc2lnbmVkIGludCopJmJ1ZmZfcmVhZGJhY2tbbGVuXSk7Ci0gICAgICAgICAgICAgICAgICAgIEJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAibGVuID0leCEhISIsIGxlbik7CisJCQl9CisJCX0gZWxzZSB7CisJCQlsZW4gLT0gNDsKKworCQkJd2hpbGUgKGxlbikgeworCQkJCWlmICgqKHVuc2lnbmVkIGludCAqKSZidWZmX3JlYWRiYWNrW2xlbl0gIT0gKih1bnNpZ25lZCBpbnQgKikmYnVmZltsZW5dKSB7CisJCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkZpcm13YXJlIERvd25sb2FkIGlzIG5vdCBwcm9wZXIgJWQiLCBmd19kb3duKTsKKwkJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiVmFsIGZyb20gQmluYXJ5ICV4LCBWYWwgRnJvbSBSZWFkIEJhY2sgJXggIiwgKih1bnNpZ25lZCBpbnQgKikmYnVmZltsZW5dLCAqKHVuc2lnbmVkIGludCopJmJ1ZmZfcmVhZGJhY2tbbGVuXSk7CisJCQkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgImxlbiA9JXghISEiLCBsZW4pOwogCQkJCQlTdGF0dXMgPSAtRUlPOwogCQkJCQlnb3RvIGV4aXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxlbi09NDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBvbl9jaGlwX2xvYys9TUFYX1RSQU5TRkVSX0NUUkxfQllURV9VU0I7Ci0gICAgfS8qIEVuZCBvZiB3aGlsZSgxKSovCisJCQkJfQorCQkJCWxlbiAtPSA0OworCQkJfQorCQl9CisJCW9uX2NoaXBfbG9jICs9IE1BWF9UUkFOU0ZFUl9DVFJMX0JZVEVfVVNCOworCX0gLyogRW5kIG9mIHdoaWxlKDEpICovCisKIGV4aXQ6Ci0gICAga2ZyZWUoYnVmZik7Ci0gICAga2ZyZWUoYnVmZl9yZWFkYmFjayk7CisJa2ZyZWUoYnVmZik7CisJa2ZyZWUoYnVmZl9yZWFkYmFjayk7CiAJcmV0dXJuIFN0YXR1czsKIH0KIAotc3RhdGljIGludCBiY21fZG93bmxvYWRfY29uZmlnX2ZpbGUoUE1JTklfQURBUFRFUiBBZGFwdGVyLAotCQkJCQkJCQlGSVJNV0FSRV9JTkZPICpwc0Z3SW5mbykKK3N0YXRpYyBpbnQgYmNtX2Rvd25sb2FkX2NvbmZpZ19maWxlKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgRklSTVdBUkVfSU5GTyAqcHNGd0luZm8pCiB7CiAJaW50IHJldHZhbCA9IFNUQVRVU19TVUNDRVNTOwogCUJfVUlOVDMyIHZhbHVlID0gMDsKIAotCWlmKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zID09IE5VTEwpCi0gICAgewotICAgICAgICBpZigoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMgPQotICAgICAgICAgICAga21hbGxvYyhzaXplb2YoU1RBUkdFVFBBUkFNUyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICAgICAgfQotICAgIH0KLQlpZihwc0Z3SW5mby0+dTMyRmlybXdhcmVMZW5ndGggIT0gc2l6ZW9mKFNUQVJHRVRQQVJBTVMpKQotCXsKLQkJcmV0dXJuIC1FSU87CisJaWYgKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zID09IE5VTEwpIHsKKwkJQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMgPSBrbWFsbG9jKHNpemVvZihTVEFSR0VUUEFSQU1TKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcyA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CiAJfQotCXJldHZhbCA9IGNvcHlfZnJvbV91c2VyKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLAotCQkJcHNGd0luZm8tPnB2TWFwcGVkRmlybXdhcmVBZGRyZXNzLCBwc0Z3SW5mby0+dTMyRmlybXdhcmVMZW5ndGgpOwotCWlmKHJldHZhbCkKLQl7CisKKwlpZiAocHNGd0luZm8tPnUzMkZpcm13YXJlTGVuZ3RoICE9IHNpemVvZihTVEFSR0VUUEFSQU1TKSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR2YWwgPSBjb3B5X2Zyb21fdXNlcihBZGFwdGVyLT5wc3RhcmdldHBhcmFtcywgcHNGd0luZm8tPnB2TWFwcGVkRmlybXdhcmVBZGRyZXNzLCBwc0Z3SW5mby0+dTMyRmlybXdhcmVMZW5ndGgpOworCWlmIChyZXR2YWwpIHsKIAkJa2ZyZWUoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMpOwogCQlBZGFwdGVyLT5wc3RhcmdldHBhcmFtcyA9IE5VTEw7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KKwogCS8qIFBhcnNlIHRoZSBzdHJ1Y3R1cmUgYW5kIHRoZW4gRG93bmxvYWQgdGhlIEZpcm13YXJlICovCiAJYmVjZWVtX3BhcnNlX3RhcmdldF9zdHJ1Y3QoQWRhcHRlcik7CiAKLQkvL0luaXRpYWxpemluZyB0aGUgTlZNLgorCS8qIEluaXRpYWxpemluZyB0aGUgTlZNLiAqLwogCUJjbUluaXROVk0oQWRhcHRlcik7CisJcmV0dmFsID0gSW5pdExlZFNldHRpbmdzKEFkYXB0ZXIpOwogCi0JcmV0dmFsID0gSW5pdExlZFNldHRpbmdzIChBZGFwdGVyKTsKLQotCWlmKHJldHZhbCkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJJTklUIExFRCBGYWlsZWRcbiIpOworCWlmIChyZXR2YWwpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIklOSVQgTEVEIEZhaWxlZFxuIik7CiAJCXJldHVybiByZXR2YWw7CiAJfQogCi0JaWYoQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcgJiBCQ01fTEVEX1RIUkVBRF9SVU5OSU5HX0FDVElWRUxZKQotCXsKKwlpZiAoQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcgJiBCQ01fTEVEX1RIUkVBRF9SVU5OSU5HX0FDVElWRUxZKSB7CiAJCUFkYXB0ZXItPkxFREluZm8uYkxlZEluaXREb25lID0gRkFMU0U7CiAJCUFkYXB0ZXItPkRyaXZlclN0YXRlID0gRFJJVkVSX0lOSVQ7CiAJCXdha2VfdXAoJkFkYXB0ZXItPkxFREluZm8ubm90aWZ5X2xlZF9ldmVudCk7CiAJfQogCi0JaWYoQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcgJiBCQ01fTEVEX1RIUkVBRF9SVU5OSU5HX0FDVElWRUxZKQotCXsKKwlpZiAoQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcgJiBCQ01fTEVEX1RIUkVBRF9SVU5OSU5HX0FDVElWRUxZKSB7CiAJCUFkYXB0ZXItPkRyaXZlclN0YXRlID0gRldfRE9XTkxPQUQ7CiAJCXdha2VfdXAoJkFkYXB0ZXItPkxFREluZm8ubm90aWZ5X2xlZF9ldmVudCk7CiAJfQogCiAJLyogSW5pdGlhbGl6ZSB0aGUgRERSIENvbnRyb2xsZXIgKi8KIAlyZXR2YWwgPSBkZHJfaW5pdChBZGFwdGVyKTsKLQlpZihyZXR2YWwpCi0JewotCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiRERSIEluaXQgRmFpbGVkXG4iKTsKKwlpZiAocmV0dmFsKSB7CisJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiRERSIEluaXQgRmFpbGVkXG4iKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKQEAgLTIwNiwxOTcgKzE4NSwxNjYgQEAKIAl3cm1hbHQoQWRhcHRlciwgRUVQUk9NX0NBTF9EQVRBX0lOVEVSTkFMX0xPQyAtIDQsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CiAJd3JtYWx0KEFkYXB0ZXIsIEVFUFJPTV9DQUxfREFUQV9JTlRFUk5BTF9MT0MgLSA4LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwogCi0JaWYoQWRhcHRlci0+ZU5WTVR5cGUgPT0gTlZNX0ZMQVNIKQotCXsKKwlpZiAoQWRhcHRlci0+ZU5WTVR5cGUgPT0gTlZNX0ZMQVNIKSB7CiAJCXJldHZhbCA9IFByb3BhZ2F0ZUNhbFBhcmFtc0Zyb21GbGFzaFRvTWVtb3J5KEFkYXB0ZXIpOwotCQlpZihyZXR2YWwpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwicHJvcGFnYWlvbiBvZiBjYWwgcGFyYW0gZmFpbGVkIHdpdGggc3RhdHVzIDolZCIsIHJldHZhbCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJwcm9wYWdhaW9uIG9mIGNhbCBwYXJhbSBmYWlsZWQgd2l0aCBzdGF0dXMgOiVkIiwgcmV0dmFsKTsKIAkJCXJldHVybiByZXR2YWw7CiAJCX0KIAl9CiAKKwlyZXR2YWwgPSBidWZmRG5sZFZlcmlmeShBZGFwdGVyLCAoUFVDSEFSKUFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLCBzaXplb2YoU1RBUkdFVFBBUkFNUyksIENPTkZJR19CRUdJTl9BRERSKTsKIAotCXJldHZhbCA9YnVmZkRubGRWZXJpZnkoQWRhcHRlciwoUFVDSEFSKUFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLHNpemVvZihTVEFSR0VUUEFSQU1TKSxDT05GSUdfQkVHSU5fQUREUik7Ci0KLQlpZihyZXR2YWwpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJjb25maWd1cmF0aW9uIGZpbGUgbm90IGRvd25sb2FkZWQgcHJvcGVybHkiKTsKLQl9CisJaWYgKHJldHZhbCkKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgImNvbmZpZ3VyYXRpb24gZmlsZSBub3QgZG93bmxvYWRlZCBwcm9wZXJseSIpOwogCWVsc2UKIAkJQWRhcHRlci0+YkNmZ0Rvd25sb2FkZWQgPSBUUlVFOwogCi0KIAlyZXR1cm4gcmV0dmFsOwogfQotc3RhdGljIGludCBiY21fY29tcGFyZV9idWZmX2NvbnRlbnRzKHVuc2lnbmVkIGNoYXIgKnJlYWRiYWNrYnVmZiwKLQl1bnNpZ25lZCBjaGFyICpidWZmLHVuc2lnbmVkIGludCBsZW4pCisKK3N0YXRpYyBpbnQgYmNtX2NvbXBhcmVfYnVmZl9jb250ZW50cyh1bnNpZ25lZCBjaGFyICpyZWFkYmFja2J1ZmYsIHVuc2lnbmVkIGNoYXIgKmJ1ZmYsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJaW50IHJldHZhbCA9IFNUQVRVU19TVUNDRVNTOwotICAgIFBNSU5JX0FEQVBURVIgQWRhcHRlciA9IEdFVF9CQ01fQURBUFRFUihnYmxwbmV0ZGV2KTsKLSAgICBpZigobGVuLXNpemVvZih1bnNpZ25lZCBpbnQpKTw0KQotCXsKLQkJaWYobWVtY21wKHJlYWRiYWNrYnVmZiAsIGJ1ZmYsIGxlbikpCi0JCXsKLQkJCXJldHZhbD0tRUlOVkFMOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWxlbi09NDsKLQkJd2hpbGUobGVuKQotCQl7Ci0JCQlpZigqKHVuc2lnbmVkIGludCopJnJlYWRiYWNrYnVmZltsZW5dICE9Ci0JCQkJCSoodW5zaWduZWQgaW50ICopJmJ1ZmZbbGVuXSkKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJGaXJtd2FyZSBEb3dubG9hZCBpcyBub3QgcHJvcGVyIik7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiVmFsIGZyb20gQmluYXJ5ICV4LCBWYWwgRnJvbSBSZWFkIEJhY2sgJXggIiwgKih1bnNpZ25lZCBpbnQgKikmYnVmZltsZW5dLCAqKHVuc2lnbmVkIGludCopJnJlYWRiYWNrYnVmZltsZW5dKTsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJsZW4gPSV4ISEhIiwgbGVuKTsKLQkJCQlyZXR2YWw9LUVJTlZBTDsKKwlQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBHRVRfQkNNX0FEQVBURVIoZ2JscG5ldGRldik7CisJaWYgKChsZW4tc2l6ZW9mKHVuc2lnbmVkIGludCkpIDwgNCkgeworCQlpZiAobWVtY21wKHJlYWRiYWNrYnVmZiAsIGJ1ZmYsIGxlbikpCisJCQlyZXR2YWwgPSAtRUlOVkFMOworCX0gZWxzZSB7CisJCWxlbiAtPSA0OworCisJCXdoaWxlIChsZW4pIHsKKwkJCWlmICgqKHVuc2lnbmVkIGludCAqKSZyZWFkYmFja2J1ZmZbbGVuXSAhPSAqKHVuc2lnbmVkIGludCAqKSZidWZmW2xlbl0pIHsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiRmlybXdhcmUgRG93bmxvYWQgaXMgbm90IHByb3BlciIpOworCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJWYWwgZnJvbSBCaW5hcnkgJXgsIFZhbCBGcm9tIFJlYWQgQmFjayAleCAiLCAqKHVuc2lnbmVkIGludCAqKSZidWZmW2xlbl0sICoodW5zaWduZWQgaW50KikmcmVhZGJhY2tidWZmW2xlbl0pOworCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJsZW4gPSV4ISEhIiwgbGVuKTsKKwkJCQlyZXR2YWwgPSAtRUlOVkFMOwogCQkJCWJyZWFrOwogCQkJfQotCQkJbGVuLT00OworCQkJbGVuIC09IDQ7CiAJCX0KIAl9CiAJcmV0dXJuIHJldHZhbDsKIH0KKwogaW50IGJjbV9pb2N0bF9md19kb3dubG9hZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIEZJUk1XQVJFX0lORk8gKnBzRndJbmZvKQogewogCWludCByZXR2YWwgPSBTVEFUVVNfU1VDQ0VTUzsKIAlQVUNIQVIgYnVmZiA9IE5VTEw7CiAKLQkvKiAgQ29uZmlnIEZpbGUgaXMgbmVlZGVkIGZvciB0aGUgRHJpdmVyIHRvIGRvd25sb2FkIHRoZSBDb25maWcgZmlsZSBhbmQKLQkJRmlybXdhcmUuIENoZWNrIGZvciB0aGUgQ29uZmlnIGZpbGUgdG8gYmUgZmlyc3QgdG8gYmUgc2VudCBmcm9tIHRoZQotCQlBcHBsaWNhdGlvbgotCSovCi0JYXRvbWljX3NldCAoJkFkYXB0ZXItPnVpTUJ1cGRhdGUsIEZBTFNFKTsKLQlpZighQWRhcHRlci0+YkNmZ0Rvd25sb2FkZWQgJiYKLQkJcHNGd0luZm8tPnUzMlN0YXJ0aW5nQWRkcmVzcyAhPSBDT05GSUdfQkVHSU5fQUREUikKLQl7Ci0JCS8qQ2FuJ3QgRG93bmxvYWQgRmlybXdhcmUuKi8KLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCJEb3dubG9hZCB0aGUgY29uZmlnIEZpbGUgZmlyc3RcbiIpOworCS8qIENvbmZpZyBGaWxlIGlzIG5lZWRlZCBmb3IgdGhlIERyaXZlciB0byBkb3dubG9hZCB0aGUgQ29uZmlnIGZpbGUgYW5kCisJICogRmlybXdhcmUuIENoZWNrIGZvciB0aGUgQ29uZmlnIGZpbGUgdG8gYmUgZmlyc3QgdG8gYmUgc2VudCBmcm9tIHRoZQorCSAqIEFwcGxpY2F0aW9uCisJICovCisJYXRvbWljX3NldCgmQWRhcHRlci0+dWlNQnVwZGF0ZSwgRkFMU0UpOworCWlmICghQWRhcHRlci0+YkNmZ0Rvd25sb2FkZWQgJiYgcHNGd0luZm8tPnUzMlN0YXJ0aW5nQWRkcmVzcyAhPSBDT05GSUdfQkVHSU5fQUREUikgeworCQkvKiBDYW4ndCBEb3dubG9hZCBGaXJtd2FyZS4gKi8KKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkRvd25sb2FkIHRoZSBjb25maWcgRmlsZSBmaXJzdFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIElmIENvbmZpZyBGaWxlLCBGaW5pc2ggdGhlIEREUiBTZXR0aW5ncyBhbmQgdGhlbiBEb3dubG9hZCBDRkcgRmlsZSAqLwotICAgIGlmKHBzRndJbmZvLT51MzJTdGFydGluZ0FkZHJlc3MgPT0gQ09ORklHX0JFR0lOX0FERFIpCi0gICAgewotCQlyZXR2YWwgPSBiY21fZG93bmxvYWRfY29uZmlnX2ZpbGUgKEFkYXB0ZXIsIHBzRndJbmZvKTsKLQl9Ci0JZWxzZQotCXsKLQotCQlidWZmID0ga3phbGxvYyhwc0Z3SW5mby0+dTMyRmlybXdhcmVMZW5ndGgsR0ZQX0tFUk5FTCk7Ci0JCWlmKGJ1ZmY9PU5VTEwpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwiRmFpbGVkIGluIGFsbG9jYXRpb24gbWVtb3J5Iik7CisJaWYgKHBzRndJbmZvLT51MzJTdGFydGluZ0FkZHJlc3MgPT0gQ09ORklHX0JFR0lOX0FERFIpIHsKKwkJcmV0dmFsID0gYmNtX2Rvd25sb2FkX2NvbmZpZ19maWxlKEFkYXB0ZXIsIHBzRndJbmZvKTsKKwl9IGVsc2UgeworCQlidWZmID0ga3phbGxvYyhwc0Z3SW5mby0+dTMyRmlybXdhcmVMZW5ndGgsIEdGUF9LRVJORUwpOworCQlpZiAoYnVmZiA9PSBOVUxMKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiRmFpbGVkIGluIGFsbG9jYXRpb24gbWVtb3J5Iik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQotCQlyZXR2YWwgPSBjb3B5X2Zyb21fdXNlcihidWZmLHBzRndJbmZvLT5wdk1hcHBlZEZpcm13YXJlQWRkcmVzcywgcHNGd0luZm8tPnUzMkZpcm13YXJlTGVuZ3RoKTsKLQkJaWYocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJjb3B5aW5nIGJ1ZmZlciBmcm9tIHVzZXIgc3BhY2UgZmFpbGVkIik7CisKKwkJcmV0dmFsID0gY29weV9mcm9tX3VzZXIoYnVmZiwgcHNGd0luZm8tPnB2TWFwcGVkRmlybXdhcmVBZGRyZXNzLCBwc0Z3SW5mby0+dTMyRmlybXdhcmVMZW5ndGgpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiY29weWluZyBidWZmZXIgZnJvbSB1c2VyIHNwYWNlIGZhaWxlZCIpOwogCQkJcmV0dmFsID0gLUVGQVVMVDsKLQkJCWdvdG8gZXJyb3IgOworCQkJZ290byBlcnJvcjsKIAkJfQogCiAJCXJldHZhbCA9IGJ1ZmZEbmxkVmVyaWZ5KEFkYXB0ZXIsCiAJCQkJCWJ1ZmYsCiAJCQkJCXBzRndJbmZvLT51MzJGaXJtd2FyZUxlbmd0aCwKIAkJCQkJcHNGd0luZm8tPnUzMlN0YXJ0aW5nQWRkcmVzcyk7Ci0JCWlmKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCJmL3cgZG93bmxvYWQgZmFpbGVkIHN0YXR1cyA6JWQiLCByZXR2YWwpOworCisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJmL3cgZG93bmxvYWQgZmFpbGVkIHN0YXR1cyA6JWQiLCByZXR2YWwpOwogCQkJZ290byBlcnJvcjsKIAkJfQogCX0KKwogZXJyb3I6CiAJa2ZyZWUoYnVmZik7CiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIElOVCBidWZmRG5sZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFBVQ0hBUiBtYXBwZWRidWZmZXIsIFVJTlQgdTMyRmlybXdhcmVMZW5ndGgsCi0JCVVMT05HIHUzMlN0YXJ0aW5nQWRkcmVzcykKK3N0YXRpYyBJTlQgYnVmZkRubGQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBQVUNIQVIgbWFwcGVkYnVmZmVyLCBVSU5UIHUzMkZpcm13YXJlTGVuZ3RoLCBVTE9ORyB1MzJTdGFydGluZ0FkZHJlc3MpCiB7Ci0KLQl1bnNpZ25lZCBpbnQJbGVuID0gMDsKKwl1bnNpZ25lZCBpbnQgbGVuID0gMDsKIAlpbnQgcmV0dmFsID0gU1RBVFVTX1NVQ0NFU1M7CiAJbGVuID0gdTMyRmlybXdhcmVMZW5ndGg7CiAKLQl3aGlsZSh1MzJGaXJtd2FyZUxlbmd0aCkKLQl7Ci0JCWxlbiA9IE1JTl9WQUwgKHUzMkZpcm13YXJlTGVuZ3RoLCBNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQik7Ci0JCXJldHZhbCA9IHdybSAoQWRhcHRlciwgdTMyU3RhcnRpbmdBZGRyZXNzLCBtYXBwZWRidWZmZXIsIGxlbik7Ci0JCWlmKHJldHZhbCkKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAid3JtIGZhaWxlZCB3aXRoIHN0YXR1cyA6JWQiLCByZXR2YWwpOworCXdoaWxlICh1MzJGaXJtd2FyZUxlbmd0aCkgeworCQlsZW4gPSBNSU5fVkFMKHUzMkZpcm13YXJlTGVuZ3RoLCBNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQik7CisJCXJldHZhbCA9IHdybShBZGFwdGVyLCB1MzJTdGFydGluZ0FkZHJlc3MsIG1hcHBlZGJ1ZmZlciwgbGVuKTsKKworCQlpZiAocmV0dmFsKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAid3JtIGZhaWxlZCB3aXRoIHN0YXR1cyA6JWQiLCByZXR2YWwpOwogCQkJYnJlYWs7CiAJCX0KLQkJdTMyU3RhcnRpbmdBZGRyZXNzCSs9IGxlbjsKLQkJdTMyRmlybXdhcmVMZW5ndGgJLT0gbGVuOwotCQltYXBwZWRidWZmZXIJCSs9bGVuOworCQl1MzJTdGFydGluZ0FkZHJlc3MgKz0gbGVuOworCQl1MzJGaXJtd2FyZUxlbmd0aCAtPSBsZW47CisJCW1hcHBlZGJ1ZmZlciArPSBsZW47CiAJfQogCXJldHVybiByZXR2YWw7Ci0KIH0KIAotc3RhdGljIElOVCBidWZmUmRia1ZlcmlmeShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsCi0JCQlQVUNIQVIgbWFwcGVkYnVmZmVyLCBVSU5UIHUzMkZpcm13YXJlTGVuZ3RoLAotCQkJVUxPTkcgdTMyU3RhcnRpbmdBZGRyZXNzKQorc3RhdGljIElOVCBidWZmUmRia1ZlcmlmeShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFBVQ0hBUiBtYXBwZWRidWZmZXIsIFVJTlQgdTMyRmlybXdhcmVMZW5ndGgsIFVMT05HIHUzMlN0YXJ0aW5nQWRkcmVzcykKIHsKIAlVSU5UIGxlbiA9IHUzMkZpcm13YXJlTGVuZ3RoOwogCUlOVCByZXR2YWwgPSBTVEFUVVNfU1VDQ0VTUzsKLQlQVUNIQVIgcmVhZGJhY2tidWZmID0ga3phbGxvYyhNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQixHRlBfS0VSTkVMKTsKKwlQVUNIQVIgcmVhZGJhY2tidWZmID0ga3phbGxvYyhNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQiwgR0ZQX0tFUk5FTCk7CiAKLQlpZihOVUxMID09IHJlYWRiYWNrYnVmZikKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIk1FTU9SWSBBTExPQ0FUSU9OIEZBSUxFRCIpOworCWlmIChOVUxMID09IHJlYWRiYWNrYnVmZikgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiTUVNT1JZIEFMTE9DQVRJT04gRkFJTEVEIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQl3aGlsZSAodTMyRmlybXdhcmVMZW5ndGggJiYgIXJldHZhbCkKLQl7CiAKLQkJbGVuID0gTUlOX1ZBTCAodTMyRmlybXdhcmVMZW5ndGgsIE1BWF9UUkFOU0ZFUl9DVFJMX0JZVEVfVVNCKTsKKwl3aGlsZSAodTMyRmlybXdhcmVMZW5ndGggJiYgIXJldHZhbCkgeworCQlsZW4gPSBNSU5fVkFMKHUzMkZpcm13YXJlTGVuZ3RoLCBNQVhfVFJBTlNGRVJfQ1RSTF9CWVRFX1VTQik7CisJCXJldHZhbCA9IHJkbShBZGFwdGVyLCB1MzJTdGFydGluZ0FkZHJlc3MsIHJlYWRiYWNrYnVmZiwgbGVuKTsKIAotCQlyZXR2YWwgPSByZG0gKEFkYXB0ZXIsIHUzMlN0YXJ0aW5nQWRkcmVzcywgcmVhZGJhY2tidWZmLCBsZW4pOwotCQlpZihyZXR2YWwpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgInJkbSBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiICxyZXR2YWwpOworCQlpZiAocmV0dmFsKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAicmRtIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIHJldHZhbCk7CiAJCQlicmVhazsKIAkJfQogCi0JCWlmIChTVEFUVVNfU1VDQ0VTUyAhPSAocmV0dmFsID0gYmNtX2NvbXBhcmVfYnVmZl9jb250ZW50cyAocmVhZGJhY2tidWZmLCBtYXBwZWRidWZmZXIsIGxlbikpKQotCQl7CisJCXJldHZhbCA9IGJjbV9jb21wYXJlX2J1ZmZfY29udGVudHMocmVhZGJhY2tidWZmLCBtYXBwZWRidWZmZXIsIGxlbik7CisJCWlmIChTVEFUVVNfU1VDQ0VTUyAhPSByZXR2YWwpCiAJCQlicmVhazsKLQkJfQotCQl1MzJTdGFydGluZ0FkZHJlc3MgCSs9IGxlbjsKLQkJdTMyRmlybXdhcmVMZW5ndGggIAktPSBsZW47Ci0JCW1hcHBlZGJ1ZmZlcgkgICAJKz1sZW47Ci0JfS8qIGVuZCBvZiB3aGlsZSAodTMyRmlybXdhcmVMZW5ndGggJiYgIXJldHZhbCkgKi8KKworCQl1MzJTdGFydGluZ0FkZHJlc3MgKz0gbGVuOworCQl1MzJGaXJtd2FyZUxlbmd0aCAtPSBsZW47CisJCW1hcHBlZGJ1ZmZlciArPSBsZW47CisKKwl9IC8qIGVuZCBvZiB3aGlsZSAodTMyRmlybXdhcmVMZW5ndGggJiYgIXJldHZhbCkgKi8KIAlrZnJlZShyZWFkYmFja2J1ZmYpOwogCXJldHVybiByZXR2YWw7CiB9CiAKLUlOVCBidWZmRG5sZFZlcmlmeShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKm1hcHBlZGJ1ZmZlciwgdW5zaWduZWQgaW50IHUzMkZpcm13YXJlTGVuZ3RoLAotCQl1bnNpZ25lZCBsb25nIHUzMlN0YXJ0aW5nQWRkcmVzcykKK0lOVCBidWZmRG5sZFZlcmlmeShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKm1hcHBlZGJ1ZmZlciwgdW5zaWduZWQgaW50IHUzMkZpcm13YXJlTGVuZ3RoLCB1bnNpZ25lZCBsb25nIHUzMlN0YXJ0aW5nQWRkcmVzcykKIHsKIAlJTlQgc3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAKLQlzdGF0dXMgPSBidWZmRG5sZChBZGFwdGVyLG1hcHBlZGJ1ZmZlcix1MzJGaXJtd2FyZUxlbmd0aCx1MzJTdGFydGluZ0FkZHJlc3MpOwotCWlmKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwiQnVmZmVyIGRvd25sb2FkIGZhaWxlZCIpOworCXN0YXR1cyA9IGJ1ZmZEbmxkKEFkYXB0ZXIsIG1hcHBlZGJ1ZmZlciwgdTMyRmlybXdhcmVMZW5ndGgsIHUzMlN0YXJ0aW5nQWRkcmVzcyk7CisJaWYgKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiQnVmZmVyIGRvd25sb2FkIGZhaWxlZCIpOwogCQlnb3RvIGVycm9yOwogCX0KIAotCXN0YXR1cz0gYnVmZlJkYmtWZXJpZnkoQWRhcHRlcixtYXBwZWRidWZmZXIsdTMyRmlybXdhcmVMZW5ndGgsdTMyU3RhcnRpbmdBZGRyZXNzKTsKLQlpZihzdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsIkJ1ZmZlciByZWFkYmFjayB2ZXJpZmllciBmYWlsZWQiKTsKKwlzdGF0dXMgPSBidWZmUmRia1ZlcmlmeShBZGFwdGVyLCBtYXBwZWRidWZmZXIsIHUzMkZpcm13YXJlTGVuZ3RoLCB1MzJTdGFydGluZ0FkZHJlc3MpOworCWlmIChzdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkJ1ZmZlciByZWFkYmFjayB2ZXJpZmllciBmYWlsZWQiKTsKIAkJZ290byBlcnJvcjsKIAl9CiBlcnJvcjoKIAlyZXR1cm4gc3RhdHVzOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9iY20vSW50ZXJmYWNlSW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJbml0LmMKaW5kZXggZDc4ZDVlZi4uYTA5ZDM1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJbml0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VJbml0LmMKQEAgLTEzOSw4ICsxMzksNyBAQAogCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShBZGFwdGVyLCAoUFVDSEFSKSZ1bFJlZywgMHgxQzIsIDQsIFRSVUUpOwogfQogCi1zdGF0aWMgaW50Ci11c2JiY21fZGV2aWNlX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCitzdGF0aWMgaW50IHVzYmJjbV9kZXZpY2VfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50Zik7CiAJaW50IHJldHZhbDsKQEAgLTI4MSw4ICsyODAsOSBAQAogCWludCBpID0gMDsKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhJTVVNX1VTQl9UQ0I7IGkrKykgewotCQlpZiAoKHBzSW50ZkFkYXB0ZXItPmFzVXNiVGNiW2ldLnVyYiA9Ci0JCQkJdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQlwc0ludGZBZGFwdGVyLT5hc1VzYlRjYltpXS51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCisJCWlmIChwc0ludGZBZGFwdGVyLT5hc1VzYlRjYltpXS51cmIgPT0gTlVMTCkgewogCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAogCQkJCSJDYW4ndCBhbGxvY2F0ZSBUeCB1cmIgZm9yIGluZGV4ICVkXG4iLCBpKTsKIAkJCXJldHVybiAtRU5PTUVNOwpAQCAtMjkwLDE0ICsyOTAsMTcgQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYSU1VTV9VU0JfUkNCOyBpKyspIHsKLQkJaWYgKChwc0ludGZBZGFwdGVyLT5hc1VzYlJjYltpXS51cmIgPQotCQkJCXVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJcHNJbnRmQWRhcHRlci0+YXNVc2JSY2JbaV0udXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKworCQlpZiAocHNJbnRmQWRhcHRlci0+YXNVc2JSY2JbaV0udXJiID09IE5VTEwpIHsKIAkJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwKIAkJCQkiQ2FuJ3QgYWxsb2NhdGUgUnggdXJiIGZvciBpbmRleCAlZFxuIiwgaSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQotCQlpZiAoKHBzSW50ZkFkYXB0ZXItPmFzVXNiUmNiW2ldLnVyYi0+dHJhbnNmZXJfYnVmZmVyID0KLQkJCWttYWxsb2MoTUFYX0RBVEFfQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisKKwkJcHNJbnRmQWRhcHRlci0+YXNVc2JSY2JbaV0udXJiLT50cmFuc2Zlcl9idWZmZXIgPSBrbWFsbG9jKE1BWF9EQVRBX0JVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKKworCQlpZiAocHNJbnRmQWRhcHRlci0+YXNVc2JSY2JbaV0udXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gTlVMTCkgewogCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLAogCQkJCSJDYW4ndCBhbGxvY2F0ZSBSeCBidWZmZXIgZm9yIGluZGV4ICVkXG4iLCBpKTsKIAkJCXJldHVybiAtRU5PTUVNOwpAQCAtMzg5LDMyICszOTIsMzIgQEAKIAogc3RhdGljIGlubGluZSBpbnQgYmNtX3VzYl9lbmRwb2ludF9pc19idWxrX2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQogewotCXJldHVybiAoYmNtX3VzYl9lbmRwb2ludF94ZmVyX2J1bGsoZXBkKSAmJiBiY21fdXNiX2VuZHBvaW50X2Rpcl9pbihlcGQpKTsKKwlyZXR1cm4gYmNtX3VzYl9lbmRwb2ludF94ZmVyX2J1bGsoZXBkKSAmJiBiY21fdXNiX2VuZHBvaW50X2Rpcl9pbihlcGQpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBiY21fdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQogewotCXJldHVybiAoYmNtX3VzYl9lbmRwb2ludF94ZmVyX2J1bGsoZXBkKSAmJiBiY21fdXNiX2VuZHBvaW50X2Rpcl9vdXQoZXBkKSk7CisJcmV0dXJuIGJjbV91c2JfZW5kcG9pbnRfeGZlcl9idWxrKGVwZCkgJiYgYmNtX3VzYl9lbmRwb2ludF9kaXJfb3V0KGVwZCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGJjbV91c2JfZW5kcG9pbnRfaXNfaW50X2luKGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQogewotCXJldHVybiAoYmNtX3VzYl9lbmRwb2ludF94ZmVyX2ludChlcGQpICYmIGJjbV91c2JfZW5kcG9pbnRfZGlyX2luKGVwZCkpOworCXJldHVybiBiY21fdXNiX2VuZHBvaW50X3hmZXJfaW50KGVwZCkgJiYgYmNtX3VzYl9lbmRwb2ludF9kaXJfaW4oZXBkKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgYmNtX3VzYl9lbmRwb2ludF9pc19pbnRfb3V0KGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBkKQogewotCXJldHVybiAoYmNtX3VzYl9lbmRwb2ludF94ZmVyX2ludChlcGQpICYmIGJjbV91c2JfZW5kcG9pbnRfZGlyX291dChlcGQpKTsKKwlyZXR1cm4gYmNtX3VzYl9lbmRwb2ludF94ZmVyX2ludChlcGQpICYmIGJjbV91c2JfZW5kcG9pbnRfZGlyX291dChlcGQpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBiY21fdXNiX2VuZHBvaW50X2lzX2lzb2NfaW4oY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCiB7Ci0JcmV0dXJuIChiY21fdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhlcGQpICYmIGJjbV91c2JfZW5kcG9pbnRfZGlyX2luKGVwZCkpOworCXJldHVybiBiY21fdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhlcGQpICYmIGJjbV91c2JfZW5kcG9pbnRfZGlyX2luKGVwZCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGJjbV91c2JfZW5kcG9pbnRfaXNfaXNvY19vdXQoY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcGQpCiB7Ci0JcmV0dXJuIChiY21fdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhlcGQpICYmIGJjbV91c2JfZW5kcG9pbnRfZGlyX291dChlcGQpKTsKKwlyZXR1cm4gYmNtX3VzYl9lbmRwb2ludF94ZmVyX2lzb2MoZXBkKSAmJiBiY21fdXNiX2VuZHBvaW50X2Rpcl9vdXQoZXBkKTsKIH0KIAogc3RhdGljIGludCBJbnRlcmZhY2VBZGFwdGVySW5pdChQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyKQpAQCAtNDYyLDcgKzQ2NSw3IEBACiAJCWlmIChiQmNtMTYgPT0gVFJVRSkgewogCQkJLyogc2VsZWN0aW5nIGFsdGVybmF0ZSBzZXR0aW5nIG9uZSBhcyBhIGRlZmF1bHQgc2V0dGluZyBmb3IgSGlnaCBTcGVlZCAgbW9kZW0uICovCiAJCQlpZiAocHNJbnRmQWRhcHRlci0+YkhpZ2hTcGVlZERldmljZSkKLQkJCQlyZXR2YWw9IHVzYl9zZXRfaW50ZXJmYWNlKHBzSW50ZkFkYXB0ZXItPnVkZXYsIERFRkFVTFRfU0VUVElOR18wLCBBTFRFUk5BVEVfU0VUVElOR18xKTsKKwkJCQlyZXR2YWwgPSB1c2Jfc2V0X2ludGVyZmFjZShwc0ludGZBZGFwdGVyLT51ZGV2LCBERUZBVUxUX1NFVFRJTkdfMCwgQUxURVJOQVRFX1NFVFRJTkdfMSk7CiAJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKIAkJCQkiQkNNMTYgaXMgYXBwbGljYWJsZSBvbiB0aGlzIGRvbmdsZVxuIik7CiAJCQlpZiAocmV0dmFsIHx8IChwc0ludGZBZGFwdGVyLT5iSGlnaFNwZWVkRGV2aWNlID09IEZBTFNFKSkgewpAQCAtNDk3LDcgKzUwMCw3IEBACiAJCQkJaWYgKChwc0ludGZBZGFwdGVyLT5iSGlnaFNwZWVkRGV2aWNlID09IEZBTFNFKSAmJiBiY21fdXNiX2VuZHBvaW50X2lzX2J1bGtfb3V0KGVuZHBvaW50KSkgewogCQkJCQkvKiBPbmNlIEJVTEsgaXMgc2VsZWN0ZWQgaW4gRlMgbW9kZS4gUmV2ZXJ0IGl0IGJhY2sgdG8gSU5ULiBFbHNlIFVTQl9JRiB3aWxsIGZhaWwuICovCiAJCQkJCVVJTlQgX3VpRGF0YSA9IG50b2hsKEVQMl9DRkdfSU5UKTsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsIAorCQkJCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgRFJWX0VOVFJZLCBEQkdfTFZMX0FMTCwKIAkJCQkJCSJSZXZlcnRpbmcgQnVsayB0byBJTlQgYXMgaXQgaXMgaW4gRnVsbCBTcGVlZCBtb2RlLlxuIik7CiAJCQkJCUJlY2VlbUVFUFJPTUJ1bGtXcml0ZShwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIChQVUNIQVIpJl91aURhdGEsIDB4MTM2LCA0LCBUUlVFKTsKIAkJCQl9CkBAIC01NzksNyArNTgyLDcgQEAKIAkJCQlwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X3NpemUgPSBidWZmZXJfc2l6ZTsKIAkJCQlwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X2VuZHBvaW50QWRkciA9IGVuZHBvaW50LT5iRW5kcG9pbnRBZGRyZXNzOwogCQkJCXBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfaW50ZXJ2YWwgPSBlbmRwb2ludC0+YkludGVydmFsOwotCQkJCXBzSW50ZkFkYXB0ZXItPnNJbnRyT3V0LmludF9vdXRfYnVmZmVyPSBrbWFsbG9jKGJ1ZmZlcl9zaXplLCBHRlBfS0VSTkVMKTsKKwkJCQlwc0ludGZBZGFwdGVyLT5zSW50ck91dC5pbnRfb3V0X2J1ZmZlciA9IGttYWxsb2MoYnVmZmVyX3NpemUsIEdGUF9LRVJORUwpOwogCQkJCWlmICghcHNJbnRmQWRhcHRlci0+c0ludHJPdXQuaW50X291dF9idWZmZXIpIHsKIAkJCQkJZGV2X2VycigmcHNJbnRmQWRhcHRlci0+dWRldi0+ZGV2LAogCQkJCQkJImNvdWxkIG5vdCBhbGxvY2F0ZSBpbnRlcnJ1cHRfb3V0X2J1ZmZlclxuIik7CkBAIC02NDEsOCArNjQ0LDggQEAKIHN0YXRpYyBpbnQgSW50ZXJmYWNlUmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQogewogCVBTX0lOVEVSRkFDRV9BREFQVEVSICBwc0ludGZBZGFwdGVyID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKLQltZGVsYXkoMTAwKTsKIAorCW1kZWxheSgxMDApOwogCXBzSW50ZkFkYXB0ZXItPmJTdXNwZW5kZWQgPSBGQUxTRTsKIAogCVN0YXJ0SW50ZXJydXB0VXJiKHBzSW50ZkFkYXB0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9JbnRlcmZhY2VNaXNjLmMgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZU1pc2MuYwppbmRleCBhNTExODViLi42MWY4NzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZU1pc2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL0ludGVyZmFjZU1pc2MuYwpAQCAtMSwyNDYgKzEsMjE5IEBACiAjaW5jbHVkZSAiaGVhZGVycy5oIgogCi1JTlQKLUludGVyZmFjZVJETShQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyLAotICAgICAgICAgICAgVUlOVCBhZGRyLAotICAgICAgICAgICAgUFZPSUQgYnVmZiwKLSAgICAgICAgICAgIElOVCBsZW4pCitJTlQgSW50ZXJmYWNlUkRNKFBTX0lOVEVSRkFDRV9BREFQVEVSIHBzSW50ZkFkYXB0ZXIsCisJCVVJTlQgYWRkciwKKwkJUFZPSUQgYnVmZiwKKwkJSU5UIGxlbikKIHsKIAlpbnQgcmV0dmFsID0gMDsKLQlVU0hPUlQgdXNSZXRyaWVzID0gMCA7Ci0JaWYocHNJbnRmQWRhcHRlciA9PSBOVUxMICkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJJbnRlcmZhY2UgQWRhcHRlciBpcyBOVUxMIik7Ci0JCXJldHVybiAtRUlOVkFMIDsKLQl9CisJVVNIT1JUIHVzUmV0cmllcyA9IDA7CiAKLQlpZihwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmRldmljZV9yZW1vdmVkID09IFRSVUUpCi0JewotCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiRGV2aWNlIGdvdCByZW1vdmVkIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmKChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPlN0b3BBbGxYYWN0aW9uID09IFRSVUUpICYmIChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQgPj0gVDNMUEIpKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIFJETSwgREJHX0xWTF9BTEwsIkN1cnJlbnRseSBYYWN0aW9uIGlzIG5vdCBhbGxvd2VkIG9uIHRoZSBidXMiKTsKLQkJcmV0dXJuIC1FQUNDRVM7Ci0JfQotCi0JaWYocHNJbnRmQWRhcHRlci0+YlN1c3BlbmRlZCA9PVRSVUUgfHwgcHNJbnRmQWRhcHRlci0+YlByZXBhcmluZ0ZvckJ1c1N1c3BlbmQgPT0gVFJVRSkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBSRE0sIERCR19MVkxfQUxMLCJCdXMgaXMgaW4gc3VzcGVuZGVkIHN0YXRlcyBoZW5jZSBSRE0gbm90IGFsbG93ZWQuLiIpOwotCQlyZXR1cm4gLUVBQ0NFUzsKLQl9Ci0JcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5EZXZpY2VBY2Nlc3MgPSBUUlVFIDsKLQlkbyB7Ci0JCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhwc0ludGZBZGFwdGVyLT51ZGV2LAotCQkJCXVzYl9yY3ZjdHJscGlwZShwc0ludGZBZGFwdGVyLT51ZGV2LDApLAotCSAgICAgICAgICAgIDB4MDIsCi0JICAgICAgICAgICAgMHhDMiwKLQkgICAgICAgICAgICAoYWRkciAmIDB4RkZGRiksCi0JICAgICAgICAgICAgKChhZGRyID4+IDE2KSAmIDB4RkZGRiksCi0JCQkJYnVmZiwKLQkgICAgICAgICAgICBsZW4sCi0JICAgICAgICAgICAgNTAwMCk7Ci0KLQkJdXNSZXRyaWVzKysgOwotCQlpZigtRU5PREVWID09IHJldHZhbCkKLQkJewotCQkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCA9VFJVRTsKLQkJCWJyZWFrOwotCQl9Ci0KLQl9d2hpbGUoKHJldHZhbCA8IDApICYmICh1c1JldHJpZXMgPCBNQVhfUkRNX1dSTV9SRVRJUkVTICkgKTsKLQotCWlmKHJldHZhbCA8IDApCi0JewotCQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIFJETSwgREJHX0xWTF9BTEwsICJSRE0gZmFpbGVkIHN0YXR1cyA6JWQsIHJldGlyZXMgOiVkIiwgcmV0dmFsLHVzUmV0cmllcyk7Ci0JCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkRldmljZUFjY2VzcyA9IEZBTFNFIDsKLQkJCXJldHVybiByZXR2YWw7Ci0JfQotCWVsc2UKLQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX09USEVSUywgUkRNLCBEQkdfTFZMX0FMTCwgIlJETSBzZW50ICVkIiwgcmV0dmFsKTsKLQkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+RGV2aWNlQWNjZXNzID0gRkFMU0UgOwotCQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotCX0KLX0KLQotSU5UCi1JbnRlcmZhY2VXUk0oUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlciwKLSAgICAgICAgICAgIFVJTlQgYWRkciwKLSAgICAgICAgICAgIFBWT0lEIGJ1ZmYsCi0gICAgICAgICAgICBJTlQgbGVuKQotewotCWludCByZXR2YWwgPSAwOwotCVVTSE9SVCB1c1JldHJpZXMgPSAwIDsKLQotCWlmKHBzSW50ZkFkYXB0ZXIgPT0gTlVMTCApCi0JewotCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIkludGVyZmFjZSBBZGFwdGVyICBpcyBOVUxMIik7CisJaWYgKHBzSW50ZkFkYXB0ZXIgPT0gTlVMTCkgeworCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJJbnRlcmZhY2UgQWRhcHRlciBpcyBOVUxMIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlpZihwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmRldmljZV9yZW1vdmVkID09IFRSVUUpCi0JewogCi0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJEZXZpY2UgZ290IHJlbW92ZWQiKTsKKwlpZiAocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCA9PSBUUlVFKSB7CisJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIkRldmljZSBnb3QgcmVtb3ZlZCIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZigocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5TdG9wQWxsWGFjdGlvbiA9PSBUUlVFKSAmJiAocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5jaGlwX2lkID49IFQzTFBCKSkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBXUk0sIERCR19MVkxfQUxMLCJDdXJyZW50bHkgWGFjdGlvbiBpcyBub3QgYWxsb3dlZCBvbiB0aGUgYnVzLi4uIik7CisJaWYgKChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPlN0b3BBbGxYYWN0aW9uID09IFRSVUUpICYmIChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQgPj0gVDNMUEIpKQl7CisJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX09USEVSUywgUkRNLCBEQkdfTFZMX0FMTCwgIkN1cnJlbnRseSBYYWN0aW9uIGlzIG5vdCBhbGxvd2VkIG9uIHRoZSBidXMiKTsKIAkJcmV0dXJuIC1FQUNDRVM7CiAJfQogCi0JaWYocHNJbnRmQWRhcHRlci0+YlN1c3BlbmRlZCA9PVRSVUUgfHwgcHNJbnRmQWRhcHRlci0+YlByZXBhcmluZ0ZvckJ1c1N1c3BlbmQgPT0gVFJVRSkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBXUk0sIERCR19MVkxfQUxMLCJCdXMgaXMgaW4gc3VzcGVuZGVkIHN0YXRlcyBoZW5jZSBSRE0gbm90IGFsbG93ZWQuLiIpOworCWlmIChwc0ludGZBZGFwdGVyLT5iU3VzcGVuZGVkID09IFRSVUUgfHwgcHNJbnRmQWRhcHRlci0+YlByZXBhcmluZ0ZvckJ1c1N1c3BlbmQgPT0gVFJVRSkgeworCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIFJETSwgREJHX0xWTF9BTEwsICJCdXMgaXMgaW4gc3VzcGVuZGVkIHN0YXRlcyBoZW5jZSBSRE0gbm90IGFsbG93ZWQuLiIpOwogCQlyZXR1cm4gLUVBQ0NFUzsKIAl9Ci0JcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5EZXZpY2VBY2Nlc3MgPSBUUlVFIDsKLQlkb3sKKwlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkRldmljZUFjY2VzcyA9IFRSVUU7CisKKwlkbyB7CiAJCXJldHZhbCA9IHVzYl9jb250cm9sX21zZyhwc0ludGZBZGFwdGVyLT51ZGV2LAotCQkJCXVzYl9zbmRjdHJscGlwZShwc0ludGZBZGFwdGVyLT51ZGV2LDApLAotCSAgICAgICAgICAgIDB4MDEsCi0JICAgICAgICAgICAgMHg0MiwKLQkgICAgICAgICAgICAoYWRkciAmIDB4RkZGRiksCi0JICAgICAgICAgICAgKChhZGRyID4+IDE2KSAmIDB4RkZGRiksCi0JCQkJYnVmZiwKLQkgICAgICAgICAgICBsZW4sCi0JICAgICAgICAgICAgNTAwMCk7CisJCQkJCXVzYl9yY3ZjdHJscGlwZShwc0ludGZBZGFwdGVyLT51ZGV2LCAwKSwKKwkJCQkJMHgwMiwKKwkJCQkJMHhDMiwKKwkJCQkJKGFkZHIgJiAweEZGRkYpLAorCQkJCQkoKGFkZHIgPj4gMTYpICYgMHhGRkZGKSwKKwkJCQkJYnVmZiwKKwkJCQkJbGVuLAorCQkJCQk1MDAwKTsKIAotCQl1c1JldHJpZXMrKyA7Ci0JCWlmKC1FTk9ERVYgPT0gcmV0dmFsKQotCQl7Ci0JCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmRldmljZV9yZW1vdmVkID0gVFJVRSA7CisJCXVzUmV0cmllcysrOworCQlpZiAoLUVOT0RFViA9PSByZXR2YWwpIHsKKwkJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQgPSBUUlVFOwogCQkJYnJlYWs7CiAJCX0KIAotCX13aGlsZSgocmV0dmFsIDwgMCkgJiYgKCB1c1JldHJpZXMgPCBNQVhfUkRNX1dSTV9SRVRJUkVTKSk7CisJfSB3aGlsZSAoKHJldHZhbCA8IDApICYmICh1c1JldHJpZXMgPCBNQVhfUkRNX1dSTV9SRVRJUkVTKSk7CiAKLQlpZihyZXR2YWwgPCAwKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIFdSTSwgREJHX0xWTF9BTEwsICJXUk0gZmFpbGVkIHN0YXR1cyA6JWQsIHJldGlyZXMgOiVkIiwgcmV0dmFsLCB1c1JldHJpZXMpOwotCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkRldmljZUFjY2VzcyA9IEZBTFNFIDsKKwlpZiAocmV0dmFsIDwgMCkJeworCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIFJETSwgREJHX0xWTF9BTEwsICJSRE0gZmFpbGVkIHN0YXR1cyA6JWQsIHJldGlyZXMgOiVkIiwgcmV0dmFsLCB1c1JldHJpZXMpOworCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkRldmljZUFjY2VzcyA9IEZBTFNFOwogCQlyZXR1cm4gcmV0dmFsOwotCX0KLQllbHNlCi0JewotCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkRldmljZUFjY2VzcyA9IEZBTFNFIDsKLQkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIFdSTSwgREJHX0xWTF9BTEwsICJXUk0gc2VudCAlZCIsIHJldHZhbCk7CisJfSBlbHNlIHsKKwkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBSRE0sIERCR19MVkxfQUxMLCAiUkRNIHNlbnQgJWQiLCByZXR2YWwpOworCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPkRldmljZUFjY2VzcyA9IEZBTFNFOwogCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Ci0KIAl9Ci0KIH0KIAotSU5UCi1CY21SRE0oUFZPSUQgYXJnLAotCQkJVUlOVCBhZGRyLAotCQkJUFZPSUQgYnVmZiwKLQkJCUlOVCBsZW4pCitJTlQgSW50ZXJmYWNlV1JNKFBTX0lOVEVSRkFDRV9BREFQVEVSIHBzSW50ZkFkYXB0ZXIsCisJCVVJTlQgYWRkciwKKwkJUFZPSUQgYnVmZiwKKwkJSU5UIGxlbikKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlVU0hPUlQgdXNSZXRyaWVzID0gMDsKKworCWlmIChwc0ludGZBZGFwdGVyID09IE5VTEwpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiSW50ZXJmYWNlIEFkYXB0ZXIgIGlzIE5VTEwiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+ZGV2aWNlX3JlbW92ZWQgPT0gVFJVRSkgeworCQlCQ01fREVCVUdfUFJJTlQocHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJEZXZpY2UgZ290IHJlbW92ZWQiKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPlN0b3BBbGxYYWN0aW9uID09IFRSVUUpICYmIChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmNoaXBfaWQgPj0gVDNMUEIpKSB7CisJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX09USEVSUywgV1JNLCBEQkdfTFZMX0FMTCwgIkN1cnJlbnRseSBYYWN0aW9uIGlzIG5vdCBhbGxvd2VkIG9uIHRoZSBidXMuLi4iKTsKKwkJcmV0dXJuIC1FQUNDRVM7CisJfQorCisJaWYgKHBzSW50ZkFkYXB0ZXItPmJTdXNwZW5kZWQgPT0gVFJVRSB8fCBwc0ludGZBZGFwdGVyLT5iUHJlcGFyaW5nRm9yQnVzU3VzcGVuZCA9PSBUUlVFKSB7CisJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX09USEVSUywgV1JNLCBEQkdfTFZMX0FMTCwgIkJ1cyBpcyBpbiBzdXNwZW5kZWQgc3RhdGVzIGhlbmNlIFJETSBub3QgYWxsb3dlZC4uIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+RGV2aWNlQWNjZXNzID0gVFJVRTsKKworCWRvIHsKKwkJcmV0dmFsID0gdXNiX2NvbnRyb2xfbXNnKHBzSW50ZkFkYXB0ZXItPnVkZXYsCisJCQkJCXVzYl9zbmRjdHJscGlwZShwc0ludGZBZGFwdGVyLT51ZGV2LCAwKSwKKwkJCQkJMHgwMSwKKwkJCQkJMHg0MiwKKwkJCQkJKGFkZHIgJiAweEZGRkYpLAorCQkJCQkoKGFkZHIgPj4gMTYpICYgMHhGRkZGKSwKKwkJCQkJYnVmZiwKKwkJCQkJbGVuLAorCQkJCQk1MDAwKTsKKworCQl1c1JldHJpZXMrKzsKKwkJaWYgKC1FTk9ERVYgPT0gcmV0dmFsKSB7CisJCQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPmRldmljZV9yZW1vdmVkID0gVFJVRTsKKwkJCWJyZWFrOworCQl9CisKKwl9IHdoaWxlICgocmV0dmFsIDwgMCkgJiYgKHVzUmV0cmllcyA8IE1BWF9SRE1fV1JNX1JFVElSRVMpKTsKKworCWlmIChyZXR2YWwgPCAwKQl7CisJCUJDTV9ERUJVR19QUklOVChwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXIsIERCR19UWVBFX09USEVSUywgV1JNLCBEQkdfTFZMX0FMTCwgIldSTSBmYWlsZWQgc3RhdHVzIDolZCwgcmV0aXJlcyA6JWQiLCByZXR2YWwsIHVzUmV0cmllcyk7CisJCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+RGV2aWNlQWNjZXNzID0gRkFMU0U7CisJCXJldHVybiByZXR2YWw7CisJfSBlbHNlIHsKKwkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5EZXZpY2VBY2Nlc3MgPSBGQUxTRTsKKwkJQkNNX0RFQlVHX1BSSU5UKHBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBXUk0sIERCR19MVkxfQUxMLCAiV1JNIHNlbnQgJWQiLCByZXR2YWwpOworCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CisJfQorfQorCitJTlQgQmNtUkRNKFBWT0lEIGFyZywKKwlVSU5UIGFkZHIsCisJUFZPSUQgYnVmZiwKKwlJTlQgbGVuKQogewogCXJldHVybiBJbnRlcmZhY2VSRE0oKFBTX0lOVEVSRkFDRV9BREFQVEVSKWFyZywgYWRkciwgYnVmZiwgbGVuKTsKIH0KIAotSU5UCi1CY21XUk0oUFZPSUQgYXJnLAotCQkJVUlOVCBhZGRyLAotCQkJUFZPSUQgYnVmZiwKLQkJCUlOVCBsZW4pCitJTlQgQmNtV1JNKFBWT0lEIGFyZywKKwlVSU5UIGFkZHIsCisJUFZPSUQgYnVmZiwKKwlJTlQgbGVuKQogewogCXJldHVybiBJbnRlcmZhY2VXUk0oKFBTX0lOVEVSRkFDRV9BREFQVEVSKWFyZywgYWRkciwgYnVmZiwgbGVuKTsKIH0KIAotCi0KIElOVCBCY21fY2xlYXJfaGFsdF9vZl9lbmRwb2ludHMoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewogCVBTX0lOVEVSRkFDRV9BREFQVEVSIHBzSW50ZkFkYXB0ZXIgPSAoUFNfSU5URVJGQUNFX0FEQVBURVIpKEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlcik7Ci0JSU5UIHN0YXR1cyA9IFNUQVRVU19TVUNDRVNTIDsKKwlJTlQgc3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7CiAKIAkvKgotCQkgdXNiX2NsZWFyX2hhbHQgLSB0ZWxscyBkZXZpY2UgdG8gY2xlYXIgZW5kcG9pbnQgaGFsdC9zdGFsbCBjb25kaXRpb24KLQkJIEBkZXY6IGRldmljZSB3aG9zZSBlbmRwb2ludCBpcyBoYWx0ZWQKLQkJIEBwaXBlOiBlbmRwb2ludCAicGlwZSIgYmVpbmcgY2xlYXJlZAotCQkgQCBDb250ZXh0OiAhaW5faW50ZXJydXB0ICgpCisJICogdXNiX2NsZWFyX2hhbHQgLSB0ZWxscyBkZXZpY2UgdG8gY2xlYXIgZW5kcG9pbnQgaGFsdC9zdGFsbCBjb25kaXRpb24KKwkgKiBAZGV2OiBkZXZpY2Ugd2hvc2UgZW5kcG9pbnQgaXMgaGFsdGVkCisJICogQHBpcGU6IGVuZHBvaW50ICJwaXBlIiBiZWluZyBjbGVhcmVkCisJICogQCBDb250ZXh0OiAhaW5faW50ZXJydXB0ICgpCisJICoKKwkgKiB1c2JfY2xlYXJfaGFsdCBpcyB0aGUgc3luY2hybm91cyBjYWxsIGFuZCByZXR1cm5zIDAgb24gc3VjY2VzcyBlbHNlIHJldHVybnMgd2l0aCBlcnJvciBjb2RlLgorCSAqIFRoaXMgaXMgdXNlZCB0byBjbGVhciBoYWx0IGNvbmRpdGlvbnMgZm9yIGJ1bGsgYW5kIGludGVycnVwdCBlbmRwb2ludHMgb25seS4KKwkgKiBDb250cm9sIGFuZCBpc29jaHJvbm91cyBlbmRwb2ludHMgbmV2ZXIgaGFsdHMuCisJICoKKwkgKiBBbnkgVVJCcyAgcXVldWVkIGZvciBzdWNoIGFuIGVuZHBvaW50IHNob3VsZCBub3JtYWxseSBiZSB1bmxpbmtlZCBieSB0aGUgZHJpdmVyCisJICogYmVmb3JlIGNsZWFyaW5nIHRoZSBoYWx0IGNvbmRpdGlvbi4KKwkgKgorCSAqLwogCi0JCXVzYl9jbGVhcl9oYWx0IGlzIHRoZSBzeW5jaHJub3VzIGNhbGwgYW5kIHJldHVybnMgMCBvbiBzdWNjZXNzIGVsc2UgcmV0dXJucyB3aXRoIGVycm9yIGNvZGUuCi0JCVRoaXMgaXMgdXNlZCB0byBjbGVhciBoYWx0IGNvbmRpdGlvbnMgZm9yIGJ1bGsgYW5kIGludGVycnVwdCBlbmRwb2ludHMgb25seS4KLQkJIENvbnRyb2wgYW5kIGlzb2Nocm9ub3VzIGVuZHBvaW50cyBuZXZlciBoYWx0cy4KLQotCQlBbnkgVVJCcyAgcXVldWVkIGZvciBzdWNoIGFuIGVuZHBvaW50IHNob3VsZCBub3JtYWxseSBiZSB1bmxpbmtlZCBieSB0aGUgZHJpdmVyCi0JCWJlZm9yZSBjbGVhcmluZyB0aGUgaGFsdCBjb25kaXRpb24uCi0KLQkqLwotCi0JLy9LaWxsaW5nIGFsbCB0aGUgc3VibWl0dGVkIHVyYnMgdG8gZGlmZmVyZW50IGVuZCBwb2ludHMuCisJLyogS2lsbGluZyBhbGwgdGhlIHN1Ym1pdHRlZCB1cmJzIHRvIGRpZmZlcmVudCBlbmQgcG9pbnRzLiAqLwogCUJjbV9raWxsX2FsbF9VUkJzKHBzSW50ZkFkYXB0ZXIpOwogCisJLyogY2xlYXIgdGhlIGhhbHRlZC9zdGFsbGVkIHN0YXRlIGZvciBldmVyeSBlbmQgcG9pbnQgKi8KKwlzdGF0dXMgPSB1c2JfY2xlYXJfaGFsdChwc0ludGZBZGFwdGVyLT51ZGV2LCBwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9waXBlKTsKKwlpZiAoc3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKQorCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsIERCR19MVkxfQUxMLCAiVW5hYmxlIHRvIENsZWFyIEhhbHQgb2YgSW50ZXJydXB0IElOIGVuZCBwb2ludC4gOiVkICIsIHN0YXR1cyk7CiAKLQkvL2NsZWFyIHRoZSBoYWx0ZWQvc3RhbGxlZCBzdGF0ZSBmb3IgZXZlcnkgZW5kIHBvaW50Ci0Jc3RhdHVzID0gdXNiX2NsZWFyX2hhbHQocHNJbnRmQWRhcHRlci0+dWRldixwc0ludGZBZGFwdGVyLT5zSW50ckluLmludF9pbl9waXBlKTsKLQlpZihzdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIElOVEZfSU5JVCwgREJHX0xWTF9BTEwsICJVbmFibGUgdG8gQ2xlYXIgSGFsdCBvZiBJbnRlcnJ1cHQgSU4gZW5kIHBvaW50LiA6JWQgIiwgc3RhdHVzKTsKKwlzdGF0dXMgPSB1c2JfY2xlYXJfaGFsdChwc0ludGZBZGFwdGVyLT51ZGV2LCBwc0ludGZBZGFwdGVyLT5zQnVsa0luLmJ1bGtfaW5fcGlwZSk7CisJaWYgKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgSU5URl9JTklULCBEQkdfTFZMX0FMTCwgIlVuYWJsZSB0byBDbGVhciBIYWx0IG9mIEJ1bGsgSU4gZW5kIHBvaW50LiA6JWQgIiwgc3RhdHVzKTsKIAotCXN0YXR1cyA9IHVzYl9jbGVhcl9oYWx0KHBzSW50ZkFkYXB0ZXItPnVkZXYscHNJbnRmQWRhcHRlci0+c0J1bGtJbi5idWxrX2luX3BpcGUpOwotCWlmKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgSU5URl9JTklULCBEQkdfTFZMX0FMTCwgIlVuYWJsZSB0byBDbGVhciBIYWx0IG9mIEJ1bGsgSU4gZW5kIHBvaW50LiA6JWQgIiwgc3RhdHVzKTsKKwlzdGF0dXMgPSB1c2JfY2xlYXJfaGFsdChwc0ludGZBZGFwdGVyLT51ZGV2LCBwc0ludGZBZGFwdGVyLT5zQnVsa091dC5idWxrX291dF9waXBlKTsKKwlpZiAoc3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKQorCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsIERCR19MVkxfQUxMLCAiVW5hYmxlIHRvIENsZWFyIEhhbHQgb2YgQnVsayBPVVQgZW5kIHBvaW50LiA6JWQgIiwgc3RhdHVzKTsKIAotCXN0YXR1cyA9IHVzYl9jbGVhcl9oYWx0KHBzSW50ZkFkYXB0ZXItPnVkZXYscHNJbnRmQWRhcHRlci0+c0J1bGtPdXQuYnVsa19vdXRfcGlwZSk7Ci0JaWYoc3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKQotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBJTlRGX0lOSVQsIERCR19MVkxfQUxMLCAiVW5hYmxlIHRvIENsZWFyIEhhbHQgb2YgQnVsayBPVVQgZW5kIHBvaW50LiA6JWQgIiwgc3RhdHVzKTsKLQotCXJldHVybiBzdGF0dXMgOworCXJldHVybiBzdGF0dXM7CiB9CiAKLQogVk9JRCBCY21fa2lsbF9hbGxfVVJCcyhQU19JTlRFUkZBQ0VfQURBUFRFUiBwc0ludGZBZGFwdGVyKQogewogCXN0cnVjdCB1cmIgKnRlbXBVcmIgPSBOVUxMOwogCVVJTlQgaTsKIAotCS8qKgotCSAgKiAgICAgdXNiX2tpbGxfdXJiIC0gY2FuY2VsIGEgdHJhbnNmZXIgcmVxdWVzdCBhbmQgd2FpdCBmb3IgaXQgdG8gZmluaXNoCi0gCSAgKiAgICAgQHVyYjogcG9pbnRlciB0byBVUkIgZGVzY3JpYmluZyBhIHByZXZpb3VzbHkgc3VibWl0dGVkIHJlcXVlc3QsCi0gCSAgKgkgIHJldHVybnMgbm90aGluZyBhcyBpdCBpcyB2b2lkIHJldHVybmVkIEFQSS4KLSAJICAqCi0JICAqIAkgVGhpcyByb3V0aW5lIGNhbmNlbHMgYW4gaW4tcHJvZ3Jlc3MgcmVxdWVzdC4gSXQgaXMgZ3VhcmFudGVlZCB0aGF0Ci0gCSAgKiAgICAgdXBvbiByZXR1cm4gYWxsIGNvbXBsZXRpb24gaGFuZGxlcnMgd2lsbCBoYXZlIGZpbmlzaGVkIGFuZCB0aGUgVVJCCi0gCSAgKiAgICAgd2lsbCBiZSB0b3RhbGx5IGlkbGUgYW5kIGF2YWlsYWJsZSBmb3IgcmV1c2UKLQotIAkgICoJVGhpcyByb3V0aW5lIG1heSBub3QgYmUgdXNlZCBpbiBhbiBpbnRlcnJ1cHQgY29udGV4dCAoc3VjaCBhcyBhIGJvdHRvbQotIAkgICoJIGhhbGYgb3IgYSBjb21wbGV0aW9uIGhhbmRsZXIpLCBvciB3aGVuIGhvbGRpbmcgYSBzcGlubG9jaywgb3IgaW4gb3RoZXIKLSAJICAqCSBzaXR1YXRpb25zIHdoZXJlIHRoZSBjYWxsZXIgY2FuJ3Qgc2NoZWR1bGUoKS4KLQkgICoKLQkqKi8KKwkvKgorCSAqIHVzYl9raWxsX3VyYiAtIGNhbmNlbCBhIHRyYW5zZmVyIHJlcXVlc3QgYW5kIHdhaXQgZm9yIGl0IHRvIGZpbmlzaAorCSAqIEB1cmI6IHBvaW50ZXIgdG8gVVJCIGRlc2NyaWJpbmcgYSBwcmV2aW91c2x5IHN1Ym1pdHRlZCByZXF1ZXN0LAorCSAqIHJldHVybnMgbm90aGluZyBhcyBpdCBpcyB2b2lkIHJldHVybmVkIEFQSS4KKwkgKgorCSAqIFRoaXMgcm91dGluZSBjYW5jZWxzIGFuIGluLXByb2dyZXNzIHJlcXVlc3QuIEl0IGlzIGd1YXJhbnRlZWQgdGhhdAorCSAqIHVwb24gcmV0dXJuIGFsbCBjb21wbGV0aW9uIGhhbmRsZXJzIHdpbGwgaGF2ZSBmaW5pc2hlZCBhbmQgdGhlIFVSQgorCSAqIHdpbGwgYmUgdG90YWxseSBpZGxlIGFuZCBhdmFpbGFibGUgZm9yIHJldXNlCisJICoKKwkgKiBUaGlzIHJvdXRpbmUgbWF5IG5vdCBiZSB1c2VkIGluIGFuIGludGVycnVwdCBjb250ZXh0IChzdWNoIGFzIGEgYm90dG9tCisJICogaGFsZiBvciBhIGNvbXBsZXRpb24gaGFuZGxlciksIG9yIHdoZW4gaG9sZGluZyBhIHNwaW5sb2NrLCBvciBpbiBvdGhlcgorCSAqIHNpdHVhdGlvbnMgd2hlcmUgdGhlIGNhbGxlciBjYW4ndCBzY2hlZHVsZSgpLgorCSAqCisJICovCiAKIAkvKiBDYW5jZWwgc3VibWl0dGVkIEludGVycnVwdC1VUkIncyAqLwotCWlmKHBzSW50ZkFkYXB0ZXItPnBzSW50ZXJydXB0VXJiICE9IE5VTEwpCi0JewotCQlpZihwc0ludGZBZGFwdGVyLT5wc0ludGVycnVwdFVyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykKLQkJCQkgdXNiX2tpbGxfdXJiKHBzSW50ZkFkYXB0ZXItPnBzSW50ZXJydXB0VXJiKTsKKwlpZiAocHNJbnRmQWRhcHRlci0+cHNJbnRlcnJ1cHRVcmIgIT0gTlVMTCkgeworCQlpZiAocHNJbnRmQWRhcHRlci0+cHNJbnRlcnJ1cHRVcmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCisJCQl1c2Jfa2lsbF91cmIocHNJbnRmQWRhcHRlci0+cHNJbnRlcnJ1cHRVcmIpOwogCX0KIAogCS8qIENhbmNlbCBBbGwgc3VibWl0dGVkIFRYIFVSQidzICovCi0JZm9yKGkgPSAwOyBpIDwgTUFYSU1VTV9VU0JfVENCOyBpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCBNQVhJTVVNX1VTQl9UQ0I7IGkrKykgewogCQl0ZW1wVXJiID0gcHNJbnRmQWRhcHRlci0+YXNVc2JUY2JbaV0udXJiOwotCQlpZih0ZW1wVXJiKQotCQl7Ci0JCQlpZih0ZW1wVXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKQorCQlpZiAodGVtcFVyYikgeworCQkJaWYgKHRlbXBVcmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCiAJCQkJdXNiX2tpbGxfdXJiKHRlbXBVcmIpOwogCQl9CiAJfQogCi0JZm9yKGkgPSAwOyBpIDwgTUFYSU1VTV9VU0JfUkNCOyBpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCBNQVhJTVVNX1VTQl9SQ0I7IGkrKykgewogCQl0ZW1wVXJiID0gcHNJbnRmQWRhcHRlci0+YXNVc2JSY2JbaV0udXJiOwotCQlpZih0ZW1wVXJiKQotCQl7Ci0JCQlpZih0ZW1wVXJiLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKQotCQkJCQl1c2Jfa2lsbF91cmIodGVtcFVyYik7CisJCWlmICh0ZW1wVXJiKSB7CisJCQlpZiAodGVtcFVyYi0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykKKwkJCQl1c2Jfa2lsbF91cmIodGVtcFVyYik7CiAJCX0KIAl9CiAKQEAgLTI1MywxMyArMjI2LDEyIEBACiAKIFZPSUQgcHV0VXNiU3VzcGVuZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0JUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlciA9IE5VTEwgOwotCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gTlVMTCA7Ci0JcHNJbnRmQWRhcHRlciA9IGNvbnRhaW5lcl9vZih3b3JrLCBTX0lOVEVSRkFDRV9BREFQVEVSLHVzYlN1c3BlbmRXb3JrKTsKLQlpbnRmPXBzSW50ZkFkYXB0ZXItPmludGVyZmFjZSA7CisJUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlciA9IE5VTEw7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSBOVUxMOworCXBzSW50ZkFkYXB0ZXIgPSBjb250YWluZXJfb2Yod29yaywgU19JTlRFUkZBQ0VfQURBUFRFUiwgdXNiU3VzcGVuZFdvcmspOworCWludGYgPSBwc0ludGZBZGFwdGVyLT5pbnRlcmZhY2U7CiAKLQlpZihwc0ludGZBZGFwdGVyLT5iU3VzcGVuZGVkID09IEZBTFNFKQorCWlmIChwc0ludGZBZGFwdGVyLT5iU3VzcGVuZGVkID09IEZBTFNFKQogCQl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoaW50Zik7Ci0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9NYWNyb3MuaCBiL2RyaXZlcnMvc3RhZ2luZy9iY20vTWFjcm9zLmgKaW5kZXggOTE2YmViYi4uNDZlZDk5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JjbS9NYWNyb3MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL01hY3Jvcy5oCkBAIC0xLDE3ICsxLDE3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKglNYWNyb3MuaAorKiBNYWNyb3MuaAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmCV9fTUFDUk9TX0hfXworI2lmbmRlZiBfX01BQ1JPU19IX18KICNkZWZpbmUgX19NQUNST1NfSF9fCiAKLSNkZWZpbmUgVFhfVElNRVJfUEVSSU9EIDEwCS8vMTAgbXNlYworI2RlZmluZSBUWF9USU1FUl9QRVJJT0QgMTAgLyoxMCBtc2VjKi8KICNkZWZpbmUgTUFYX0NMQVNTSUZJRVJTIDEwMAotLy8jZGVmaW5lIE1BWF9DTEFTU0lGSUVSU19QRVJfU0YgIDIwCisvKiAjZGVmaW5lIE1BWF9DTEFTU0lGSUVSU19QRVJfU0YgIDIwICovCiAjZGVmaW5lIE1BWF9UQVJHRVRfRFNYX0JVRkZFUlMgMjQKIAotI2RlZmluZSBNQVhfQ05UUkxfUEtUUyAJMTAwCi0jZGVmaW5lIE1BWF9EQVRBX1BLVFMgCQkyMDAKLSNkZWZpbmUgTUFYX0VUSF9TSVpFIAkJMTUzNgorI2RlZmluZSBNQVhfQ05UUkxfUEtUUyAgICAxMDAKKyNkZWZpbmUgTUFYX0RBVEFfUEtUUyAgICAgMjAwCisjZGVmaW5lIE1BWF9FVEhfU0laRSAgICAgIDE1MzYKICNkZWZpbmUgTUFYX0NOVExfUEtUX1NJWkUgMjA0OAogCiAjZGVmaW5lIE1UVV9TSVpFIDE0MDAKQEAgLTIwLDEwMiArMjAsMTAyIEBACiAjZGVmaW5lIE1BQ19BRERSX1JFR0lTVEVSIDB4YmY2MGQwMDAKIAogCi0vLy8vLy8vLy8vL1F1YWxpdHkgb2YgU2VydmljZS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotI2RlZmluZSBOT19PRl9RVUVVRVMJCQkJMTcKLSNkZWZpbmUgSGlQcmlvcml0eSAgICAgICAgICAgICAgICAgIE5PX09GX1FVRVVFUy0xCi0jZGVmaW5lIExvd1ByaW9yaXR5ICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEJFICAgICAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIHJ0UFMgICAgICAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIEVSVFBTICAgICAgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIFVHUyAgICAgICAgICAgICAgICAgICAgICAgICA2CisvKiBRdWFsaXR5IG9mIFNlcnZpY2UgKi8KKyNkZWZpbmUgTk9fT0ZfUVVFVUVTIDE3CisjZGVmaW5lIEhpUHJpb3JpdHkgKE5PX09GX1FVRVVFUy0xKQorI2RlZmluZSBMb3dQcmlvcml0eSAwCisjZGVmaW5lIEJFICAgICAgICAgIDIKKyNkZWZpbmUgcnRQUyAgICAgICAgNAorI2RlZmluZSBFUlRQUyAgICAgICA1CisjZGVmaW5lIFVHUyAgICAgICAgIDYKIAotI2RlZmluZSBCRV9CVUNLRVRfU0laRSAgICAgICAgICAJMTAyNCoxMDI0KjEwMCAgLy8zMmtiCi0jZGVmaW5lIHJ0UFNfQlVDS0VUX1NJWkUgICAgICAgIAkxMDI0KjEwMjQqMTAwICAgIC8vOGtiCi0jZGVmaW5lIE1BWF9BTExPV0VEX1JBVEUgICAgCQkxMDI0KjEwMjQqMTAwCi0jZGVmaW5lIFRYX1BBQ0tFVF9USFJFU0hPTEQgCQkxMAotI2RlZmluZSBYU0VDT05EUyAgICAgICAgICAgICAgICAgICAgMSpIWgotI2RlZmluZSBEU0NfQUNUSVZBVEVfUkVRVUVTVCAgICAJMjQ4Ci0jZGVmaW5lIFFVRVVFX0RFUFRIX09GRlNFVCAgICAgICAgICAweDFmYzAxMDAwCi0jZGVmaW5lIE1BWF9ERVZJQ0VfREVTQ19TSVpFIAkJMjA0MAotI2RlZmluZSBNQVhfQ1RSTF9RVUVVRV9MRU4JCQkxMDAKLSNkZWZpbmUgTUFYX0FQUF9RVUVVRV9MRU4JCQkyMDAKLSNkZWZpbmUgTUFYX0xBVEVOQ1lfQUxMT1dFRAkJCTB4RkZGRkZGRkYKLSNkZWZpbmUgREVGQVVMVF9VR19JTlRFUlZBTAkJCTI1MAotI2RlZmluZSBERUZBVUxUX1VHSV9GQUNUT1IJCQk0CisjZGVmaW5lIEJFX0JVQ0tFVF9TSVpFICAgICAgICgxMDI0KjEwMjQqMTAwKSAgLyogMzJrYiAqLworI2RlZmluZSBydFBTX0JVQ0tFVF9TSVpFICAgICAoMTAyNCoxMDI0KjEwMCkgLyogIDhrYiAqLworI2RlZmluZSBNQVhfQUxMT1dFRF9SQVRFICAgICAoMTAyNCoxMDI0KjEwMCkKKyNkZWZpbmUgVFhfUEFDS0VUX1RIUkVTSE9MRCAgMTAKKyNkZWZpbmUgWFNFQ09ORFMgICAgICAgICAgICAgKDEqSFopCisjZGVmaW5lIERTQ19BQ1RJVkFURV9SRVFVRVNUIDI0OAorI2RlZmluZSBRVUVVRV9ERVBUSF9PRkZTRVQgICAweDFmYzAxMDAwCisjZGVmaW5lIE1BWF9ERVZJQ0VfREVTQ19TSVpFIDIwNDAKKyNkZWZpbmUgTUFYX0NUUkxfUVVFVUVfTEVOICAgMTAwCisjZGVmaW5lIE1BWF9BUFBfUVVFVUVfTEVOICAgIDIwMAorI2RlZmluZSBNQVhfTEFURU5DWV9BTExPV0VEICAweEZGRkZGRkZGCisjZGVmaW5lIERFRkFVTFRfVUdfSU5URVJWQUwgIDI1MAorI2RlZmluZSBERUZBVUxUX1VHSV9GQUNUT1IgICA0CiAKLSNkZWZpbmUgREVGQVVMVF9QRVJTRkNPVU5UCQkJNjAKLSNkZWZpbmUgTUFYX0NPTk5FQ1RJT05TCQkJCTEwCi0jZGVmaW5lIE1BWF9DTEFTU19OQU1FX0xFTkdUSCAgICAgIAkzMgorI2RlZmluZSBERUZBVUxUX1BFUlNGQ09VTlQgICAgNjAKKyNkZWZpbmUgTUFYX0NPTk5FQ1RJT05TICAgICAgIDEwCisjZGVmaW5lIE1BWF9DTEFTU19OQU1FX0xFTkdUSCAzMgogCi0jZGVmaW5lCUVUSF9MRU5HVEhfT0ZfQUREUkVTUwkJNgotI2RlZmluZSBNQVhfTVVMVElDQVNUX0FERFJFU1NFUyAgICAgMzIKLSNkZWZpbmUgSVBfTEVOR1RIX09GX0FERFJFU1MgICAgCTQKKyNkZWZpbmUgRVRIX0xFTkdUSF9PRl9BRERSRVNTICAgNgorI2RlZmluZSBNQVhfTVVMVElDQVNUX0FERFJFU1NFUyAzMgorI2RlZmluZSBJUF9MRU5HVEhfT0ZfQUREUkVTUyAgICA0CiAKLSNkZWZpbmUgSVBfUEFDS0VUX09OTFlfTU9ERQkJCTAKLSNkZWZpbmUgRVRIX1BBQ0tFVF9UVU5ORUxJTkdfTU9ERQkxCisjZGVmaW5lIElQX1BBQ0tFVF9PTkxZX01PREUgICAgICAgMAorI2RlZmluZSBFVEhfUEFDS0VUX1RVTk5FTElOR19NT0RFIDEKIAotLy8vLy8vLy8vLy8vTGluayBSZXF1ZXN0Ly8vLy8vLy8vLy8vLy8KLSNkZWZpbmUgU0VUX01BQ19BRERSRVNTX1JFUVVFU1QJCTAKLSNkZWZpbmUgU1lOQ19VUF9SRVFVRVNUICAgICAgICAgICAgIDEKLSNkZWZpbmUgU1lOQ0VEX1VQICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgTElOS19VUF9SRVFVRVNUICAgICAgICAgICAgIDMKLSNkZWZpbmUgTElOS19DT05ORUNURUQgICAgICAgICAgICAgIDQKLSNkZWZpbmUgU1lOQ19VUF9OT1RJRklDQVRJT04gICAgCTIKLSNkZWZpbmUgTElOS19VUF9OT1RJRklDQVRJT04gICAgCTQKKy8qIExpbmsgUmVxdWVzdCAqLworI2RlZmluZSBTRVRfTUFDX0FERFJFU1NfUkVRVUVTVCAwCisjZGVmaW5lIFNZTkNfVVBfUkVRVUVTVCAgICAgICAgIDEKKyNkZWZpbmUgU1lOQ0VEX1VQICAgICAgICAgICAgICAgMgorI2RlZmluZSBMSU5LX1VQX1JFUVVFU1QgICAgICAgICAzCisjZGVmaW5lIExJTktfQ09OTkVDVEVEICAgICAgICAgIDQKKyNkZWZpbmUgU1lOQ19VUF9OT1RJRklDQVRJT04gICAgMgorI2RlZmluZSBMSU5LX1VQX05PVElGSUNBVElPTiAgICA0CiAKIAogI2RlZmluZSBMSU5LX05FVF9FTlRSWSAgICAgICAgICAgICAgMHgwMDAyCi0jZGVmaW5lIEhNQ19TVEFUVVMJCQkJCTB4MDAwNAorI2RlZmluZSBITUNfU1RBVFVTICAgICAgICAgICAgICAgICAgMHgwMDA0CiAjZGVmaW5lIExJTktfVVBfQ09OVFJPTF9SRVEgICAgICAgICAweDgzCiAKICNkZWZpbmUgU1RBVFNfUE9JTlRFUl9SRVFfU1RBVFVTICAgIDB4ODYKICNkZWZpbmUgTkVUV09SS19FTlRSWV9SRVFfUEFZTE9BRCAgIDE5OAotI2RlZmluZSBMSU5LX0RPV05fUkVRX1BBWUxPQUQgIAkgCTIyNgorI2RlZmluZSBMSU5LX0RPV05fUkVRX1BBWUxPQUQgICAgICAgMjI2CiAjZGVmaW5lIFNZTkNfVVBfUkVRX1BBWUxPQUQgICAgICAgICAyMjgKLSNkZWZpbmUgU1RBVElTVElDU19QT0lOVEVSX1JFUSAgCTIzNworI2RlZmluZSBTVEFUSVNUSUNTX1BPSU5URVJfUkVRICAgICAgMjM3CiAjZGVmaW5lIExJTktfVVBfUkVRX1BBWUxPQUQgICAgICAgICAyNDUKICNkZWZpbmUgTElOS19VUF9BQ0sgICAgICAgICAgICAgICAgIDI0NgogCiAjZGVmaW5lIFNUQVRTX01TR19TSVpFICAgICAgICAgICAgICA0CiAjZGVmaW5lIElOREVYX1RPX0RBVEEgICAgICAgICAgICAgICA0CiAKLSNkZWZpbmUJR09fVE9fSURMRV9NT0RFX1BBWUxPQUQJCQkyMTAKLSNkZWZpbmUJQ09NRV9VUF9GUk9NX0lETEVfTU9ERV9QQVlMT0FECTIxMQotI2RlZmluZSBJRExFX01PREVfU0ZfVVBEQVRFX01TRwkJCTE4NworI2RlZmluZSBHT19UT19JRExFX01PREVfUEFZTE9BRCAgICAgICAgIDIxMAorI2RlZmluZSBDT01FX1VQX0ZST01fSURMRV9NT0RFX1BBWUxPQUQgIDIxMQorI2RlZmluZSBJRExFX01PREVfU0ZfVVBEQVRFX01TRyAgICAgICAgIDE4NwogCi0jZGVmaW5lIFNLQl9SRVNFUlZFX0VUSEVSTkVUX0hFQURFUgkxNgotI2RlZmluZSBTS0JfUkVTRVJWRV9QSFNfQllURVMJCTMyCisjZGVmaW5lIFNLQl9SRVNFUlZFX0VUSEVSTkVUX0hFQURFUiAxNgorI2RlZmluZSBTS0JfUkVTRVJWRV9QSFNfQllURVMgICAgICAgMzIKIAotI2RlZmluZSBJUF9QQUNLRVRfT05MWV9NT0RFCQkJMAotI2RlZmluZSBFVEhfUEFDS0VUX1RVTk5FTElOR19NT0RFCTEKKyNkZWZpbmUgSVBfUEFDS0VUX09OTFlfTU9ERSAgICAgICAwCisjZGVmaW5lIEVUSF9QQUNLRVRfVFVOTkVMSU5HX01PREUgMQogCi0jZGVmaW5lIEVUSF9DU184MDJfMwkJCQkxCi0jZGVmaW5lIEVUSF9DU184MDJfMVFfVkxBTgkJCTMKLSNkZWZpbmUgSVBWNF9DUwkJCQkJCTEKLSNkZWZpbmUgSVBWNl9DUwkJCQkJCTIKLSNkZWZpbmUJRVRIX0NTX01BU0sJCQkJCTB4M2YKKyNkZWZpbmUgRVRIX0NTXzgwMl8zICAgICAgIDEKKyNkZWZpbmUgRVRIX0NTXzgwMl8xUV9WTEFOIDMKKyNkZWZpbmUgSVBWNF9DUyAgICAgICAgICAgIDEKKyNkZWZpbmUgSVBWNl9DUyAgICAgICAgICAgIDIKKyNkZWZpbmUgRVRIX0NTX01BU0sgICAgICAgIDB4M2YKIAogLyoqIFxicmllZiBWYWxpZGl0eSBiaXQgbWFwcyBmb3IgVExWcyBpbiBwYWNrZXQgY2xhc3NpZmljYXRpb24gcnVsZSAqLwogCi0jZGVmaW5lIFBLVF9DTEFTU0lGSUNBVElPTl9VU0VSX1BSSU9SSVRZX1ZBTElECQkwCi0jZGVmaW5lIFBLVF9DTEFTU0lGSUNBVElPTl9WTEFOSURfVkFMSUQJCQkJMQorI2RlZmluZSBQS1RfQ0xBU1NJRklDQVRJT05fVVNFUl9QUklPUklUWV9WQUxJRCAwCisjZGVmaW5lIFBLVF9DTEFTU0lGSUNBVElPTl9WTEFOSURfVkFMSUQgICAgICAgIDEKIAogI2lmbmRlZiBNSU4KLSNkZWZpbmUgTUlOKF9hLCBfYikgKChfYSkgPCAoX2IpPyAoX2EpOiAoX2IpKQorI2RlZmluZSBNSU4oX2EsIF9iKSAoKF9hKSA8IChfYikgPyAoX2EpIDogKF9iKSkKICNlbmRpZgogCiAKIC8qTGVhZGVyIHJlbGF0ZWQgdGVybXMgKi8KLSNkZWZpbmUgTEVBREVSX1NUQVRVUyAgIAkJCQkweDAwCi0jZGVmaW5lIExFQURFUl9TVEFUVVNfVENQX0FDSwkJCTB4MQotI2RlZmluZSBMRUFERVJfU0laRSAgICAgICAgICAgICAJCXNpemVvZihMRUFERVIpCi0jZGVmaW5lIE1BQ19BRERSX1JFUV9TSVpFCQkJCXNpemVvZihQQUNLRVRUT1NFTkQpCi0jZGVmaW5lIFNTX0lORk9fUkVRX1NJWkUJCQkJc2l6ZW9mKFBBQ0tFVFRPU0VORCkKLSNkZWZpbmUJQ01fUkVRVUVTVF9TSVpFCQkJCQlMRUFERVJfU0laRSArIHNpemVvZihzdExvY2FsU0ZDaGFuZ2VSZXF1ZXN0KQotI2RlZmluZSBJRExFX1JFUV9TSVpFCQkJCQlzaXplb2YoUEFDS0VUVE9TRU5EKQorI2RlZmluZSBMRUFERVJfU1RBVFVTICAgICAgICAgMHgwMAorI2RlZmluZSBMRUFERVJfU1RBVFVTX1RDUF9BQ0sgMHgxCisjZGVmaW5lIExFQURFUl9TSVpFICAgICAgICAgICBzaXplb2YoTEVBREVSKQorI2RlZmluZSBNQUNfQUREUl9SRVFfU0laRSAgICAgc2l6ZW9mKFBBQ0tFVFRPU0VORCkKKyNkZWZpbmUgU1NfSU5GT19SRVFfU0laRSAgICAgIHNpemVvZihQQUNLRVRUT1NFTkQpCisjZGVmaW5lIENNX1JFUVVFU1RfU0laRSAgICAgICAoTEVBREVSX1NJWkUgKyBzaXplb2Yoc3RMb2NhbFNGQ2hhbmdlUmVxdWVzdCkpCisjZGVmaW5lIElETEVfUkVRX1NJWkUgICAgICAgICBzaXplb2YoUEFDS0VUVE9TRU5EKQogCiAKLSNkZWZpbmUgTUFYX1RSQU5TRkVSX0NUUkxfQllURV9VU0IJCTIgKiAxMDI0CisjZGVmaW5lIE1BWF9UUkFOU0ZFUl9DVFJMX0JZVEVfVVNCICgyKjEwMjQpCiAKICNkZWZpbmUgR0VUX01BSUxCT1gxX1JFR19SRVFVRVNUICAgICAgICAweDg3CiAjZGVmaW5lIEdFVF9NQUlMQk9YMV9SRUdfUkVTUE9OU0UgICAgICAgMHg2NwpAQCAtMTI0LDQwICsxMjQsNDAgQEAKICNkZWZpbmUgVFJBTlNNSVRfTkVUV09SS19EQVRBICAgICAgICAgICAweDAwCiAjZGVmaW5lIFJFQ0VJVkVEX05FVFdPUktfREFUQSAgICAgICAgICAgMHgyMAogCi0jZGVmaW5lIENNX1JFU1BPTlNFUwkJCQkJMHhBMAotI2RlZmluZSBTVEFUVVNfUlNQCQkJCQkJMHhBMQotI2RlZmluZSBMSU5LX0NPTlRST0xfUkVTUAkJCQkweEEyCi0jZGVmaW5lCUlETEVfTU9ERV9TVEFUVVMJCQkJMHhBMwotI2RlZmluZSBTVEFUU19QT0lOVEVSX1JFU1AJCQkJMHhBNgotI2RlZmluZSBNR01UX01TR19JTkZPX1NXX1NUQVRVUyAgICAgICAgIDB4QTcKLSNkZWZpbmUgQVVUSF9TU19IT1NUX01TRwkgICAgCQkweEE4CisjZGVmaW5lIENNX1JFU1BPTlNFUyAgICAgICAgICAgIDB4QTAKKyNkZWZpbmUgU1RBVFVTX1JTUCAgICAgICAgICAgICAgMHhBMQorI2RlZmluZSBMSU5LX0NPTlRST0xfUkVTUCAgICAgICAweEEyCisjZGVmaW5lIElETEVfTU9ERV9TVEFUVVMgICAgICAgIDB4QTMKKyNkZWZpbmUgU1RBVFNfUE9JTlRFUl9SRVNQICAgICAgMHhBNgorI2RlZmluZSBNR01UX01TR19JTkZPX1NXX1NUQVRVUyAweEE3CisjZGVmaW5lIEFVVEhfU1NfSE9TVF9NU0cgICAgICAgIDB4QTgKIAotI2RlZmluZSBDTV9EU0FfQUNLX1BBWUxPQUQJCQkJMjQ3Ci0jZGVmaW5lIENNX0RTQ19BQ0tfUEFZTE9BRAkJCQkyNDgKLSNkZWZpbmUgQ01fRFNEX0FDS19QQVlMT0FECQkJCTI0OQotI2RlZmluZSBDTV9EU0RFQUNUVkFURQkJCQkJMjUwCi0jZGVmaW5lIFRPVEFMX01BU0tFRF9BRERSRVNTX0lOX0JZVEVTCTMyCisjZGVmaW5lIENNX0RTQV9BQ0tfUEFZTE9BRCAgICAgICAgICAgIDI0NworI2RlZmluZSBDTV9EU0NfQUNLX1BBWUxPQUQgICAgICAgICAgICAyNDgKKyNkZWZpbmUgQ01fRFNEX0FDS19QQVlMT0FEICAgICAgICAgICAgMjQ5CisjZGVmaW5lIENNX0RTREVBQ1RWQVRFICAgICAgICAgICAgICAgIDI1MAorI2RlZmluZSBUT1RBTF9NQVNLRURfQUREUkVTU19JTl9CWVRFUyAzMgogCi0jZGVmaW5lIE1BQ19SRVEJCQkJMAotI2RlZmluZSBMSU5LX1JFU1AJCQkxCi0jZGVmaW5lIFJTU0lfSU5ESUNBVElPTiAJMgorI2RlZmluZSBNQUNfUkVRICAgICAgICAgMAorI2RlZmluZSBMSU5LX1JFU1AgICAgICAgMQorI2RlZmluZSBSU1NJX0lORElDQVRJT04gMgogCi0jZGVmaW5lIFNTX0lORk8gICAgICAgICAJNAotI2RlZmluZSBTVEFUSVNUSUNTX0lORk8gCTUKLSNkZWZpbmUgQ01fSU5ESUNBVElPTiAgIAk2Ci0jZGVmaW5lIFBBUkFNX1JFU1AJCQk3Ci0jZGVmaW5lIEJVRkZFUl8xSyAJCQkxMDI0Ci0jZGVmaW5lIEJVRkZFUl8ySyAJCQlCVUZGRVJfMUsqMgotI2RlZmluZSBCVUZGRVJfNEsgCQkJQlVGRkVSXzJLKjIKLSNkZWZpbmUgQlVGRkVSXzhLIAkJCUJVRkZFUl80SyoyCi0jZGVmaW5lIEJVRkZFUl8xNksgCQkJQlVGRkVSXzhLKjIKLSNkZWZpbmUgRE9XTkxJTktfRElSIDAKLSNkZWZpbmUgVVBMSU5LX0RJUiAxCisjZGVmaW5lIFNTX0lORk8gICAgICAgICA0CisjZGVmaW5lIFNUQVRJU1RJQ1NfSU5GTyA1CisjZGVmaW5lIENNX0lORElDQVRJT04gICA2CisjZGVmaW5lIFBBUkFNX1JFU1AgICAgICA3CisjZGVmaW5lIEJVRkZFUl8xSyAgICAgICAxMDI0CisjZGVmaW5lIEJVRkZFUl8ySyAgICAgICAoQlVGRkVSXzFLKjIpCisjZGVmaW5lIEJVRkZFUl80SyAgICAgICAoQlVGRkVSXzJLKjIpCisjZGVmaW5lIEJVRkZFUl84SyAgICAgICAoQlVGRkVSXzRLKjIpCisjZGVmaW5lIEJVRkZFUl8xNksgICAgICAoQlVGRkVSXzhLKjIpCisjZGVmaW5lIERPV05MSU5LX0RJUiAgICAwCisjZGVmaW5lIFVQTElOS19ESVIgICAgICAxCiAKLSNkZWZpbmUgQkNNX1NJR05BVFVSRQkJIkJFQ0VFTSIKKyNkZWZpbmUgQkNNX1NJR05BVFVSRSAgICJCRUNFRU0iCiAKIAotI2RlZmluZSBHUElPX09VVFBVVF9SRUdJU1RFUgkgMHgwRjAwMDAzQworI2RlZmluZSBHUElPX09VVFBVVF9SRUdJU1RFUiAgICAgMHgwRjAwMDAzQwogI2RlZmluZSBCQ01fR1BJT19PVVRQVVRfU0VUX1JFRyAgMHgwRjAwMDA0MAogI2RlZmluZSBCQ01fR1BJT19PVVRQVVRfQ0xSX1JFRyAgMHgwRjAwMDA0NAogI2RlZmluZSBHUElPX01PREVfUkVHSVNURVIgICAgICAgMHgwRjAwMDAzNApAQCAtMTY1LDQ0ICsxNjUsNDMgQEAKIAogCiB0eXBlZGVmIHN0cnVjdCBfTElOS19TVEFURSB7Ci0JVUNIQVIJdWNMaW5rU3RhdHVzOwotICAgIFVDSEFSICAgYklkbGVNb2RlOwotCVVDSEFSCWJTaHV0ZG93bk1vZGU7Ci19TElOS19TVEFURSwgKlBMSU5LX1NUQVRFOworCVVDSEFSIHVjTGlua1N0YXR1czsKKwlVQ0hBUiBiSWRsZU1vZGU7CisJVUNIQVIgYlNodXRkb3duTW9kZTsKK30gTElOS19TVEFURSwgKlBMSU5LX1NUQVRFOwogCiAKIGVudW0gZW5MaW5rU3RhdHVzIHsKLSAgICBXQUlUX0ZPUl9TWU5DID0gCTEsCi0gICAgUEhZX1NZTkNfQUNISVZFRCA9IAkyLAotICAgIExJTktVUF9JTl9QUk9HUkVTUyA9IDMsCi0gICAgTElOS1VQX0RPTkUgICAgID0gCTQsCi0gICAgRFJFR19SRUNFSVZFRCA9CQk1LAotICAgIExJTktfU1RBVFVTX1JFU0VUX1JFQ0VJVkVEID0gNiwKLSAgICBQRVJJT0RJQ19XQUtFX1VQX05PVElGSUNBVElPTl9GUk1fRlcgID0gNywKLSAgICBMSU5LX1NIVVRET1dOX1JFUV9GUk9NX0ZJUk1XQVJFID0gOCwKLSAgICBDT01QTEVURV9XQUtFX1VQX05PVElGSUNBVElPTl9GUk1fRlcgPTkKKwlXQUlUX0ZPUl9TWU5DID0gMSwKKwlQSFlfU1lOQ19BQ0hJVkVEID0gMiwKKwlMSU5LVVBfSU5fUFJPR1JFU1MgPSAzLAorCUxJTktVUF9ET05FID0gNCwKKwlEUkVHX1JFQ0VJVkVEID0gNSwKKwlMSU5LX1NUQVRVU19SRVNFVF9SRUNFSVZFRCA9IDYsCisJUEVSSU9ESUNfV0FLRV9VUF9OT1RJRklDQVRJT05fRlJNX0ZXICA9IDcsCisJTElOS19TSFVURE9XTl9SRVFfRlJPTV9GSVJNV0FSRSA9IDgsCisJQ09NUExFVEVfV0FLRV9VUF9OT1RJRklDQVRJT05fRlJNX0ZXID0gOQogfTsKIAotdHlwZWRlZiBlbnVtIF9FX1BIU19EU0NfQUNUSU9OCi17Ci0JZUFkZFBIU1J1bGU9MCwKK3R5cGVkZWYgZW51bSBfRV9QSFNfRFNDX0FDVElPTiB7CisJZUFkZFBIU1J1bGUgPSAwLAogCWVTZXRQSFNSdWxlLAogCWVEZWxldGVQSFNSdWxlLAogCWVEZWxldGVBbGxQSFNSdWxlcwotfUVfUEhTX0RTQ19BQ1RJT047Cit9IEVfUEhTX0RTQ19BQ1RJT047CiAKIAotI2RlZmluZSBDTV9DT05UUk9MX05FV0RTWF9NVUxUSUNMQVNTSUZJRVJfUkVRCQkweDg5ICAgIC8vIEhvc3QgdG8gTWFjCi0jZGVmaW5lIENNX0NPTlRST0xfTkVXRFNYX01VTFRJQ0xBU1NJRklFUl9SRVNQICAgICAgMHhBOSAgICAvLyBNYWMgdG8gSG9zdAotI2RlZmluZSBNQVNLX0RJU0FCTEVfSEVBREVSX1NVUFBSRVNTSU9OIAkJCTB4MTAgLy8wYjAwMDAxMDAwMAotI2RlZmluZQlNSU5JTVVNX1BFTkRJTkdfREVTQ1JJUFRPUlMJCQkJCTUKKyNkZWZpbmUgQ01fQ09OVFJPTF9ORVdEU1hfTVVMVElDTEFTU0lGSUVSX1JFUSAgMHg4OSAvKiBIb3N0IHRvIE1hYyAqLworI2RlZmluZSBDTV9DT05UUk9MX05FV0RTWF9NVUxUSUNMQVNTSUZJRVJfUkVTUCAweEE5IC8qIE1hYyB0byBIb3N0ICovCisjZGVmaW5lIE1BU0tfRElTQUJMRV9IRUFERVJfU1VQUFJFU1NJT04gICAgICAgIDB4MTAgLyogMGIwMDAwMTAwMDAgKi8KKyNkZWZpbmUgTUlOSU1VTV9QRU5ESU5HX0RFU0NSSVBUT1JTICAgICAgICAgICAgNQogCiAjZGVmaW5lIFNIVVRET1dOX0hPU1RJTklUSUFURURfUkVRVUVTVFBBWUxPQUQgMHhDQwogI2RlZmluZSBTSFVURE9XTl9BQ0tfRlJPTV9EUklWRVIgMHgxCiAjZGVmaW5lIFNIVVRET1dOX05BQ0tfRlJPTV9EUklWRVIgMHgyCiAKLSNkZWZpbmUgTElOS19TWU5DX1VQX1NVQlRZUEUJCTB4MDAwMQotI2RlZmluZSBMSU5LX1NZTkNfRE9XTl9TVUJUWVBFCQkweDAwMDEKKyNkZWZpbmUgTElOS19TWU5DX1VQX1NVQlRZUEUgICAweDAwMDEKKyNkZWZpbmUgTElOS19TWU5DX0RPV05fU1VCVFlQRSAweDAwMDEKIAogCiAKQEAgLTIyNiw5ICsyMjUsOSBAQAogCiAjZGVmaW5lIE1BWF9QRU5ESU5HX0NUUkxfUEFDS0VUIChNQVhfQ1RSTF9RVUVVRV9MRU4tMTApCiAKLSNkZWZpbmUgV0lNQVhfTUFYX01UVQkJCShNVFVfU0laRSArIEVUSF9ITEVOKQorI2RlZmluZSBXSU1BWF9NQVhfTVRVICAgICAgICAgICAgICAgICAgIChNVFVfU0laRSArIEVUSF9ITEVOKQogI2RlZmluZSBBVVRPX0xJTktVUF9FTkFCTEUgICAgICAgICAgICAgIDB4MgotI2RlZmluZSBBVVRPX1NZTkNfRElTQUJMRSAgICAgICAgICAgICAgCTB4MQorI2RlZmluZSBBVVRPX1NZTkNfRElTQUJMRSAgICAgICAgICAgICAgIDB4MQogI2RlZmluZSBBVVRPX0ZJUk1fRE9XTkxPQUQgICAgICAgICAgICAgIDB4MQogI2RlZmluZSBTRVRUTEVfRE9XTl9USU1FICAgICAgICAgICAgICAgIDUwCiAKQEAgLTI0Miw5ICsyNDEsOSBAQAogI2RlZmluZSBUQVJHRVRfQ0FOX05PVF9HT19UT19JRExFX01PREUgMwogI2RlZmluZSBJRExFX01PREVfUEFZTE9BRF9MRU5HVEggOAogCi0jZGVmaW5lIElQX0hFQURFUihCdWZmZXIpICgoSVBIZWFkZXJGb3JtYXQqKShCdWZmZXIpKQotI2RlZmluZSBJUFY0CQkJCTQKLSNkZWZpbmUgSVBfVkVSU0lPTihieXRlKQkoKChieXRlJjB4RjApPj40KSkKKyNkZWZpbmUgSVBfSEVBREVSKEJ1ZmZlcikgKChJUEhlYWRlckZvcm1hdCAqKShCdWZmZXIpKQorI2RlZmluZSBJUFY0IDQKKyNkZWZpbmUgSVBfVkVSU0lPTihieXRlKSAoKChieXRlJjB4RjApPj40KSkKIAogI2RlZmluZSBTRVRfTUFDX0FERFJFU1MgIDE5MwogI2RlZmluZSBTRVRfTUFDX0FERFJFU1NfUkVTUE9OU0UgMjM2CkBAIC0yNjMsMTUgKzI2MiwxNSBAQAogCiAjZGVmaW5lIElOVkFMSURfUVVFVUVfSU5ERVggTk9fT0ZfUVVFVUVTCiAKLSNkZWZpbmUgSU5WQUxJRF9QSUQgKHBpZF90KS0xCi0jZGVmaW5lIEREUl84MF9NSFogIAkwCi0jZGVmaW5lIEREUl8xMDBfTUhaIAkxCi0jZGVmaW5lIEREUl8xMjBfTUhaICAgIAkyIC8vICBBZGRpdGlvbmFsIEZyZXF1ZW5jeSBmb3IgVDNMUAotI2RlZmluZSBERFJfMTMzX01IWiAgICAJMwotI2RlZmluZSBERFJfMTQwX01IWiAgICAJNCAvLyAgTm90IFVzZWQgKFJlc2VydmVkIGZvciBmdXR1cmUpCi0jZGVmaW5lIEREUl8xNjBfTUhaICAgIAk1IC8vICBBZGRpdGlvbmFsIEZyZXF1ZW5jeSBmb3IgVDNMUAotI2RlZmluZSBERFJfMTgwX01IWiAgICAJNiAvLyAgTm90IFVzZWQgKFJlc2VydmVkIGZvciBmdXR1cmUpCi0jZGVmaW5lIEREUl8yMDBfTUhaICAgIAk3IC8vICBOb3QgVXNlZCAoUmVzZXJ2ZWQgZm9yIGZ1dHVyZSkKKyNkZWZpbmUgSU5WQUxJRF9QSUQgKChwaWRfdCktMSkKKyNkZWZpbmUgRERSXzgwX01IWiAgMAorI2RlZmluZSBERFJfMTAwX01IWiAxCisjZGVmaW5lIEREUl8xMjBfTUhaIDIgLyogQWRkaXRpb25hbCBGcmVxdWVuY3kgZm9yIFQzTFAgKi8KKyNkZWZpbmUgRERSXzEzM19NSFogMworI2RlZmluZSBERFJfMTQwX01IWiA0IC8qIE5vdCBVc2VkIChSZXNlcnZlZCBmb3IgZnV0dXJlKSAqLworI2RlZmluZSBERFJfMTYwX01IWiA1IC8qIEFkZGl0aW9uYWwgRnJlcXVlbmN5IGZvciBUM0xQICAqLworI2RlZmluZSBERFJfMTgwX01IWiA2IC8qIE5vdCBVc2VkIChSZXNlcnZlZCBmb3IgZnV0dXJlKSAqLworI2RlZmluZSBERFJfMjAwX01IWiA3IC8qIE5vdCBVc2VkIChSZXNlcnZlZCBmb3IgZnV0dXJlKSAqLwogCiAjZGVmaW5lIE1JUFNfMjAwX01IWiAgIDAKICNkZWZpbmUgTUlQU18xNjBfTUhaICAgMQpAQCAtMjkxLDI3ICsyOTAsMjcgQEAKICNkZWZpbmUgRUVQUk9NX1JFSkVDVF9SRUdfMyAweDBmMDAzMDA4CiAjZGVmaW5lIEVFUFJPTV9SRUpFQ1RfUkVHXzQgMHgwZjAwMzAyMAogI2RlZmluZSBFRVBST01fUkVKRUNUX01BU0sgIDB4MGZmZmZmZmYKLSNkZWZpbmUgVlNHX01PREUJCQkgIDB4MworI2RlZmluZSBWU0dfTU9ERSAgICAgICAgICAgIDB4MwogCiAvKiBJZGxlIE1vZGUgUmVsYXRlZCBSZWdpc3RlcnMgKi8KICNkZWZpbmUgREVCVUdfSU5URVJSVVBUX0dFTkVSQVRPUl9SRUdJU1RPUiAweDBGMDAwMDdDCi0jZGVmaW5lIFNXX0FCT1JUX0lETEVNT0RFX0xPQyAJCTB4MEZGMDFGRkMKKyNkZWZpbmUgU1dfQUJPUlRfSURMRU1PREVfTE9DIDB4MEZGMDFGRkMKIAotI2RlZmluZSBTV19BQk9SVF9JRExFTU9ERV9QQVRURVJOIAkweGQwZWExZDFlCi0jZGVmaW5lIERFVklDRV9JTlRfT1VUX0VQX1JFRzAJCTB4MEYwMTE4NzAKLSNkZWZpbmUgREVWSUNFX0lOVF9PVVRfRVBfUkVHMQkJMHgwRjAxMTg3NAorI2RlZmluZSBTV19BQk9SVF9JRExFTU9ERV9QQVRURVJOIDB4ZDBlYTFkMWUKKyNkZWZpbmUgREVWSUNFX0lOVF9PVVRfRVBfUkVHMCAgICAweDBGMDExODcwCisjZGVmaW5lIERFVklDRV9JTlRfT1VUX0VQX1JFRzEgICAgMHgwRjAxMTg3NAogCiAjZGVmaW5lIEJJTl9GSUxFICIvbGliL2Zpcm13YXJlL21hY3h2aTIwMC5iaW4iCiAjZGVmaW5lIENGR19GSUxFICIvbGliL2Zpcm13YXJlL21hY3h2aS5jZmciCiAjZGVmaW5lIFNGX01BWF9BTExPV0VEX1BBQ0tFVFNfVE9fQkFDS1VQIDEyOAotI2RlZmluZSBNSU5fVkFMKHgseSkgCSgoeCk8KHkpPyh4KTooeSkpCisjZGVmaW5lIE1JTl9WQUwoeCwgeSkgKCh4KSA8ICh5KSA/ICh4KSA6ICh5KSkKICNkZWZpbmUgTUFDX0FERFJFU1NfU0laRSA2CiAjZGVmaW5lIEVFUFJPTV9DT01NQU5EX1FfUkVHICAgIDB4MEYwMDMwMTgKICNkZWZpbmUgRUVQUk9NX1JFQURfREFUQV9RX1JFRyAgMHgwRjAwMzAyMAotI2RlZmluZSBDSElQX0lEX1JFRyAJCQkweDBGMDAwMDAwCi0jZGVmaW5lIEdQSU9fTU9ERV9SRUcJCQkweDBGMDAwMDM0Ci0jZGVmaW5lIEdQSU9fT1VUUFVUX1JFRwkJCTB4MEYwMDAwM0MKLSNkZWZpbmUgV0lNQVhfTUFYX0FMTE9XRURfUkFURSAgMTAyNCoxMDI0KjUwCisjZGVmaW5lIENISVBfSURfUkVHICAgICAgICAgICAgIDB4MEYwMDAwMDAKKyNkZWZpbmUgR1BJT19NT0RFX1JFRyAgICAgICAgICAgMHgwRjAwMDAzNAorI2RlZmluZSBHUElPX09VVFBVVF9SRUcgICAgICAgICAweDBGMDAwMDNDCisjZGVmaW5lIFdJTUFYX01BWF9BTExPV0VEX1JBVEUgICgxMDI0KjEwMjQqNTApCiAKICNkZWZpbmUgVDMgMHhiZWNlMDMwMAogI2RlZmluZSBUQVJHRVRfU0ZJRF9UWERFU0NfTUFQX0xPQyAweEJGRkZGNDAwCkBAIC0zMTksMzEgKzMxOCwyOSBAQAogI2RlZmluZSBSV01fUkVBRCAwCiAjZGVmaW5lIFJXTV9XUklURSAxCiAKLSNkZWZpbmUgVDNMUEIgICAgICAgMHhiZWNlMzMwMAotI2RlZmluZSBCQ1MyMjBfMgkweGJlY2UzMzExCi0jZGVmaW5lIEJDUzIyMF8yQkMJMHhCRUNFMzMxMAotI2RlZmluZSBCQ1MyNTBfQkMJMHhiZWNlMzMwMQotI2RlZmluZSBCQ1MyMjBfMwkweGJlY2UzMzIxCisjZGVmaW5lIFQzTFBCICAgICAgMHhiZWNlMzMwMAorI2RlZmluZSBCQ1MyMjBfMiAgIDB4YmVjZTMzMTEKKyNkZWZpbmUgQkNTMjIwXzJCQyAweEJFQ0UzMzEwCisjZGVmaW5lIEJDUzI1MF9CQyAgMHhiZWNlMzMwMQorI2RlZmluZSBCQ1MyMjBfMyAgIDB4YmVjZTMzMjEKIAogCi0jZGVmaW5lIEhQTV9DT05GSUdfTERPMTQ1CTB4MEYwMDBENTQKLSNkZWZpbmUgSFBNX0NPTkZJR19NU1cJCTB4MEYwMDBENTgKKyNkZWZpbmUgSFBNX0NPTkZJR19MRE8xNDUgMHgwRjAwMEQ1NAorI2RlZmluZSBIUE1fQ09ORklHX01TVyAgICAweDBGMDAwRDU4CiAKICNkZWZpbmUgVDNCIDB4YmVjZTAzMTAKLXR5cGVkZWYgZW51bSBlTlZNX1RZUEUKLXsKK3R5cGVkZWYgZW51bSBlTlZNX1RZUEUgewogCU5WTV9BVVRPREVURUNUID0gMCwKIAlOVk1fRUVQUk9NLAogCU5WTV9GTEFTSCwKIAlOVk1fVU5LTk9XTgotfU5WTV9UWVBFOworfSBOVk1fVFlQRTsKIAotdHlwZWRlZiBlbnVtIGVQTVVfTU9ERVMKLXsKK3R5cGVkZWYgZW51bSBlUE1VX01PREVTIHsKIAlIWUJSSURfTU9ERV83QyAgPSAwLAogCUlOVEVSTkFMX01PREVfNiA9IDEsCiAJSFlCUklEX01PREVfNiAgID0gMgotfVBNVV9NT0RFOworfSBQTVVfTU9ERTsKIAogI2RlZmluZSBNQVhfUkRNX1dSTV9SRVRJUkVTIDEKIApAQCAtMzYwLDQgKzM1Nyw0IEBACiAjZGVmaW5lIFNLQl9DQl9MQVRFTkNZX09GRlNFVCAgICAgICAgICAgMQogI2RlZmluZSBTS0JfQ0JfVENQQUNLX09GRlNFVCAgICAgICAgICAgIDIKIAotI2VuZGlmCS8vX19NQUNST1NfSF9fCisjZW5kaWYgLyogX19NQUNST1NfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL01pc2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vTWlzYy5jCmluZGV4IGM1YjNhMzYuLmU5ZjI5ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9iY20vTWlzYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vTWlzYy5jCkBAIC0xLDExMyArMSw5NCBAQAogI2luY2x1ZGUgImhlYWRlcnMuaCIKIAotc3RhdGljIGludCBCY21GaWxlRG93bmxvYWQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBjb25zdCBjaGFyICpwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxvYyk7CitzdGF0aWMgaW50IEJjbUZpbGVEb3dubG9hZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIGNvbnN0IGNoYXIgKnBhdGgsIHVuc2lnbmVkIGludCBsb2MpOwogc3RhdGljIFZPSUQgZG9Qb3dlckF1dG9Db3JyZWN0aW9uKFBNSU5JX0FEQVBURVIgcHNBZGFwdGVyKTsKLXN0YXRpYyB2b2lkIEhhbmRsZVNodXREb3duTW9kZVJlcXVlc3QoUE1JTklfQURBUFRFUiBBZGFwdGVyLFBVQ0hBUiBwdWNCdWZmZXIpOworc3RhdGljIHZvaWQgSGFuZGxlU2h1dERvd25Nb2RlUmVxdWVzdChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFBVQ0hBUiBwdWNCdWZmZXIpOwogc3RhdGljIGludCBiY21fcGFyc2VfdGFyZ2V0X3BhcmFtcyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOwotc3RhdGljIHZvaWQgYmVjZWVtX3Byb3RvY29sX3Jlc2V0IChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpOworc3RhdGljIHZvaWQgYmVjZWVtX3Byb3RvY29sX3Jlc2V0KFBNSU5JX0FEQVBURVIgQWRhcHRlcik7CiAKIHN0YXRpYyBWT0lEIGRlZmF1bHRfd2ltYXhfcHJvdG9jb2xfaW5pdGlhbGl6ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7CisJVUlOVCB1aUxvb3BJbmRleDsKIAotCVVJTlQgICAgdWlMb29wSW5kZXg7CisJZm9yICh1aUxvb3BJbmRleCA9IDA7IHVpTG9vcEluZGV4IDwgTk9fT0ZfUVVFVUVTLTE7IHVpTG9vcEluZGV4KyspIHsKKwkJQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVpVGhyZXNob2xkID0gVFhfUEFDS0VUX1RIUkVTSE9MRDsKKwkJQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVpTWF4QWxsb3dlZFJhdGUgPSBNQVhfQUxMT1dFRF9SQVRFOworCQlBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlNYXhCdWNrZXRTaXplID0gMjAqMTAyNCoxMDI0OworCX0KIAotICAgIGZvcih1aUxvb3BJbmRleD0wOyB1aUxvb3BJbmRleCA8IE5PX09GX1FVRVVFUy0xOyB1aUxvb3BJbmRleCsrKQotICAgIHsKLSAgICAJQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVpVGhyZXNob2xkPVRYX1BBQ0tFVF9USFJFU0hPTEQ7Ci0gICAgICAgIEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51aU1heEFsbG93ZWRSYXRlPU1BWF9BTExPV0VEX1JBVEU7Ci0gICAgICAgIEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51aU1heEJ1Y2tldFNpemU9MjAqMTAyNCoxMDI0OwotICAgIH0KLQotICAgIEFkYXB0ZXItPkJFQnVja2V0U2l6ZT1CRV9CVUNLRVRfU0laRTsKLSAgICBBZGFwdGVyLT5ydFBTQnVja2V0U2l6ZT1ydFBTX0JVQ0tFVF9TSVpFOwotICAgIEFkYXB0ZXItPkxpbmtTdGF0dXM9U1lOQ19VUF9SRVFVRVNUOwotICAgIEFkYXB0ZXItPlRyYW5zZmVyTW9kZT1JUF9QQUNLRVRfT05MWV9NT0RFOwotICAgIEFkYXB0ZXItPnVzQmVzdEVmZm9ydFF1ZXVlSW5kZXg9LTE7Ci0gICAgcmV0dXJuOworCUFkYXB0ZXItPkJFQnVja2V0U2l6ZSA9IEJFX0JVQ0tFVF9TSVpFOworCUFkYXB0ZXItPnJ0UFNCdWNrZXRTaXplID0gcnRQU19CVUNLRVRfU0laRTsKKwlBZGFwdGVyLT5MaW5rU3RhdHVzID0gU1lOQ19VUF9SRVFVRVNUOworCUFkYXB0ZXItPlRyYW5zZmVyTW9kZSA9IElQX1BBQ0tFVF9PTkxZX01PREU7CisJQWRhcHRlci0+dXNCZXN0RWZmb3J0UXVldWVJbmRleCA9IC0xOworCXJldHVybjsKIH0KIAotCi1JTlQKLUluaXRBZGFwdGVyKFBNSU5JX0FEQVBURVIgcHNBZGFwdGVyKQorSU5UIEluaXRBZGFwdGVyKFBNSU5JX0FEQVBURVIgcHNBZGFwdGVyKQogewotICAgIGludCBpID0gMDsKLQlJTlQgU3RhdHVzID0gU1RBVFVTX1NVQ0NFU1MgOwotCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsICBEQkdfTFZMX0FMTCwgICJJbml0aWFsaXNpbmcgQWRhcHRlciA9ICVwIiwgcHNBZGFwdGVyKTsKKwlpbnQgaSA9IDA7CisJSU5UIFN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOworCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkluaXRpYWxpc2luZyBBZGFwdGVyID0gJXAiLCBwc0FkYXB0ZXIpOwogCi0JaWYocHNBZGFwdGVyID09IE5VTEwpCi0JewotCQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCAgREJHX0xWTF9BTEwsICJBZGFwdGVyIGlzIE5VTEwiKTsKKwlpZiAocHNBZGFwdGVyID09IE5VTEwpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiQWRhcHRlciBpcyBOVUxMIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXNlbWFfaW5pdCgmcHNBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrLDEpOwotLy8JcHNBZGFwdGVyLT51bEZsYXNoQ2FsU3RhcnQgPSBGTEFTSF9BVVRPX0lOSVRfQkFTRV9BRERSOwotCisJc2VtYV9pbml0KCZwc0FkYXB0ZXItPk5WTVJkbVdybUxvY2ssIDEpOwogCXNlbWFfaW5pdCgmcHNBZGFwdGVyLT5yZG13cm1zeW5jLCAxKTsKIAlzcGluX2xvY2tfaW5pdCgmcHNBZGFwdGVyLT5jb250cm9sX3F1ZXVlX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZwc0FkYXB0ZXItPnR4dHJhbnNtaXRsb2NrKTsKLSAgICBzZW1hX2luaXQoJnBzQWRhcHRlci0+UnhBcHBDb250cm9sUXVldWVsb2NrLCAxKTsKLS8vICAgIHNlbWFfaW5pdCgmcHNBZGFwdGVyLT5kYXRhX3BhY2tldF9xdWV1ZV9sb2NrLCAxKTsKLSAgICBzZW1hX2luaXQoJnBzQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSwgMSk7Ci0gIAlzZW1hX2luaXQoJnBzQWRhcHRlci0+TG93UG93ZXJNb2RlU3luYywxKTsKKwlzZW1hX2luaXQoJnBzQWRhcHRlci0+UnhBcHBDb250cm9sUXVldWVsb2NrLCAxKTsKKwlzZW1hX2luaXQoJnBzQWRhcHRlci0+ZndfZG93bmxvYWRfc2VtYSwgMSk7CisJc2VtYV9pbml0KCZwc0FkYXB0ZXItPkxvd1Bvd2VyTW9kZVN5bmMsIDEpOwogCi0gIC8vIHNwaW5fbG9ja19pbml0KCZwc0FkYXB0ZXItPnNsZWVwZXJfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IE5PX09GX1FVRVVFUzsgaSsrKQorCQlzcGluX2xvY2tfaW5pdCgmcHNBZGFwdGVyLT5QYWNrSW5mb1tpXS5TRlF1ZXVlTG9jayk7CisJaSA9IDA7CiAKLSAgICBmb3IoaT0wO2k8Tk9fT0ZfUVVFVUVTOyBpKyspCi0gICAgICAgIHNwaW5fbG9ja19pbml0KCZwc0FkYXB0ZXItPlBhY2tJbmZvW2ldLlNGUXVldWVMb2NrKTsKLSAgICBpPTA7Ci0KLSAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZwc0FkYXB0ZXItPnByb2Nlc3NfcnhfY250cmxwa3QpOwotICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJnBzQWRhcHRlci0+dHhfcGFja2V0X3dhaXRfcXVldWUpOwotICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJnBzQWRhcHRlci0+cHJvY2Vzc19yZWFkX3dhaXRfcXVldWUpOwotICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJnBzQWRhcHRlci0+aW9jdGxfZndfZG5sZF93YWl0X3F1ZXVlKTsKLSAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZwc0FkYXB0ZXItPmxvd3Bvd2VyX21vZGVfd2FpdF9xdWV1ZSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcHNBZGFwdGVyLT5wcm9jZXNzX3J4X2NudHJscGt0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwc0FkYXB0ZXItPnR4X3BhY2tldF93YWl0X3F1ZXVlKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwc0FkYXB0ZXItPnByb2Nlc3NfcmVhZF93YWl0X3F1ZXVlKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwc0FkYXB0ZXItPmlvY3RsX2Z3X2RubGRfd2FpdF9xdWV1ZSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcHNBZGFwdGVyLT5sb3dwb3dlcl9tb2RlX3dhaXRfcXVldWUpOwogCXBzQWRhcHRlci0+d2FpdGluZ190b19md19kb3dubG9hZF9kb25lID0gVFJVRTsKLSAgICAvL2luaXRfd2FpdHF1ZXVlX2hlYWQoJnBzQWRhcHRlci0+ZGV2aWNlX3dha2VfcXVldWUpOwotICAgIHBzQWRhcHRlci0+ZndfZG93bmxvYWRfZG9uZT1GQUxTRTsKLQorCXBzQWRhcHRlci0+ZndfZG93bmxvYWRfZG9uZSA9IEZBTFNFOwogCiAJZGVmYXVsdF93aW1heF9wcm90b2NvbF9pbml0aWFsaXplKHBzQWRhcHRlcik7Ci0JZm9yIChpPTA7aTxNQVhfQ05UUkxfUEtUUztpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ05UUkxfUEtUUzsgaSsrKSB7CiAJCXBzQWRhcHRlci0+dHhjdGxwYWNrZXRbaV0gPSBrbWFsbG9jKE1BWF9DTlRMX1BLVF9TSVpFLCBHRlBfS0VSTkVMKTsKLQkJaWYoIXBzQWRhcHRlci0+dHhjdGxwYWNrZXRbaV0pCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiTm8gTW9yZSBDbnRsIHBrdHMgZ290LCBtYXggZ290IGlzICVkIiwgaSk7CisJCWlmICghcHNBZGFwdGVyLT50eGN0bHBhY2tldFtpXSkgeworCQkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiTm8gTW9yZSBDbnRsIHBrdHMgZ290LCBtYXggZ290IGlzICVkIiwgaSk7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0KLQlpZihBbGxvY0FkYXB0ZXJEc3hCdWZmZXIocHNBZGFwdGVyKSkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiRmFpbGVkIHRvIGFsbG9jYXRlIERTWCBidWZmZXJzIik7CisKKwlpZiAoQWxsb2NBZGFwdGVyRHN4QnVmZmVyKHBzQWRhcHRlcikpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiRmFpbGVkIHRvIGFsbG9jYXRlIERTWCBidWZmZXJzIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCS8vSW5pdGlhbGl6ZSBQSFMgaW50ZXJmYWNlCi0JaWYocGhzX2luaXQoJnBzQWRhcHRlci0+c3RCQ01QaHNDb250ZXh0LHBzQWRhcHRlcikhPTApCi0JewotCQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwiJXM6JXM6JWQ6RXJyb3IgUEhTIEluaXQgRmFpbGVkPT09PT0+XG4iLCBfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisJLyogSW5pdGlhbGl6ZSBQSFMgaW50ZXJmYWNlICovCisJaWYgKHBoc19pbml0KCZwc0FkYXB0ZXItPnN0QkNNUGhzQ29udGV4dCwgcHNBZGFwdGVyKSAhPSAwKSB7CisJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIiVzOiVzOiVkOkVycm9yIFBIUyBJbml0IEZhaWxlZD09PT09PlxuIiwgX19GSUxFX18sIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCVN0YXR1cyA9IEJjbUFsbG9jRmxhc2hDU1N0cnVjdHVyZShwc0FkYXB0ZXIpOwotCWlmKFN0YXR1cykKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCJNZW1vcnkgQWxsb2NhdGlvbiBmb3IgRmxhc2ggc3RydWN0dXJlIGZhaWxlZCIpOwotCQlyZXR1cm4gU3RhdHVzIDsKKwlpZiAoU3RhdHVzKSB7CisJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIk1lbW9yeSBBbGxvY2F0aW9uIGZvciBGbGFzaCBzdHJ1Y3R1cmUgZmFpbGVkIik7CisJCXJldHVybiBTdGF0dXM7CiAJfQogCiAJU3RhdHVzID0gdmVuZG9yZXh0bkluaXQocHNBZGFwdGVyKTsKIAotCWlmKFNUQVRVU19TVUNDRVNTICE9IFN0YXR1cykKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCJWZW5kb3IgSW5pdCBGYWlsZWQiKTsKLQkJcmV0dXJuIFN0YXR1cyA7CisJaWYgKFNUQVRVU19TVUNDRVNTICE9IFN0YXR1cykgeworCQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJWZW5kb3IgSW5pdCBGYWlsZWQiKTsKKwkJcmV0dXJuIFN0YXR1czsKIAl9CiAKLQlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgICJBZGFwdGVyIGluaXRpYWxpc2VkIik7Ci0KKwlCQ01fREVCVUdfUFJJTlQocHNBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJBZGFwdGVyIGluaXRpYWxpc2VkIik7CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC0xMTUsNDIgKzk2LDM3IEBACiBWT0lEIEFkYXB0ZXJGcmVlKFBNSU5JX0FEQVBURVIgQWRhcHRlcikKIHsKIAlpbnQgY291bnQ7Ci0KIAliZWNlZW1fcHJvdG9jb2xfcmVzZXQoQWRhcHRlcik7Ci0KIAl2ZW5kb3JleHRuRXhpdChBZGFwdGVyKTsKIAotCWlmKEFkYXB0ZXItPmNvbnRyb2xfcGFja2V0X2hhbmRsZXIgJiYgIUlTX0VSUihBZGFwdGVyLT5jb250cm9sX3BhY2tldF9oYW5kbGVyKSkKLQkgIAlrdGhyZWFkX3N0b3AgKEFkYXB0ZXItPmNvbnRyb2xfcGFja2V0X2hhbmRsZXIpOworCWlmIChBZGFwdGVyLT5jb250cm9sX3BhY2tldF9oYW5kbGVyICYmICFJU19FUlIoQWRhcHRlci0+Y29udHJvbF9wYWNrZXRfaGFuZGxlcikpCisJCWt0aHJlYWRfc3RvcChBZGFwdGVyLT5jb250cm9sX3BhY2tldF9oYW5kbGVyKTsKIAotCWlmKEFkYXB0ZXItPnRyYW5zbWl0X3BhY2tldF90aHJlYWQgJiYgIUlTX0VSUihBZGFwdGVyLT50cmFuc21pdF9wYWNrZXRfdGhyZWFkKSkKLQkJa3RocmVhZF9zdG9wIChBZGFwdGVyLT50cmFuc21pdF9wYWNrZXRfdGhyZWFkKTsKKwlpZiAoQWRhcHRlci0+dHJhbnNtaXRfcGFja2V0X3RocmVhZCAmJiAhSVNfRVJSKEFkYXB0ZXItPnRyYW5zbWl0X3BhY2tldF90aHJlYWQpKQorCQlrdGhyZWFkX3N0b3AoQWRhcHRlci0+dHJhbnNtaXRfcGFja2V0X3RocmVhZCk7CiAKIAl3YWtlX3VwKCZBZGFwdGVyLT5wcm9jZXNzX3JlYWRfd2FpdF9xdWV1ZSk7CiAKLQlpZihBZGFwdGVyLT5MRURJbmZvLmxlZF90aHJlYWRfcnVubmluZyAmIChCQ01fTEVEX1RIUkVBRF9SVU5OSU5HX0FDVElWRUxZIHwgQkNNX0xFRF9USFJFQURfUlVOTklOR19JTkFDVElWRUxZKSkKLQkJa3RocmVhZF9zdG9wIChBZGFwdGVyLT5MRURJbmZvLmxlZF9jbnRybF90aHJlYWRpZCk7CisJaWYgKEFkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nICYgKEJDTV9MRURfVEhSRUFEX1JVTk5JTkdfQUNUSVZFTFkgfCBCQ01fTEVEX1RIUkVBRF9SVU5OSU5HX0lOQUNUSVZFTFkpKQorCQlrdGhyZWFkX3N0b3AoQWRhcHRlci0+TEVESW5mby5sZWRfY250cmxfdGhyZWFkaWQpOwogCiAJdW5yZWdpc3Rlcl9uZXR3b3JrZGV2KEFkYXB0ZXIpOwogCiAJLyogRklYTUU6IHVzZSBwcm9wZXIgd2FpdF9ldmVudCBhbmQgcmVmY291bnRpbmcgKi8KLQl3aGlsZShhdG9taWNfcmVhZCgmQWRhcHRlci0+QXBwbGljYXRpb25SdW5uaW5nKSkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIldhaXRpbmcgZm9yIEFwcGxpY2F0aW9uIHRvIGNsb3NlLi4gJWRcbiIsYXRvbWljX3JlYWQoJkFkYXB0ZXItPkFwcGxpY2F0aW9uUnVubmluZykpOworCXdoaWxlIChhdG9taWNfcmVhZCgmQWRhcHRlci0+QXBwbGljYXRpb25SdW5uaW5nKSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiV2FpdGluZyBmb3IgQXBwbGljYXRpb24gdG8gY2xvc2UuLiAlZFxuIiwgYXRvbWljX3JlYWQoJkFkYXB0ZXItPkFwcGxpY2F0aW9uUnVubmluZykpOwogCQltc2xlZXAoMTAwKTsKIAl9CiAJdW5yZWdpc3Rlcl9jb250cm9sX2RldmljZV9pbnRlcmZhY2UoQWRhcHRlcik7Ci0KIAlrZnJlZShBZGFwdGVyLT5wc3RhcmdldHBhcmFtcyk7CiAKLQlmb3IgKGNvdW50ID0wO2NvdW50IDwgTUFYX0NOVFJMX1BLVFM7Y291bnQrKykKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBNQVhfQ05UUkxfUEtUUzsgY291bnQrKykKIAkJa2ZyZWUoQWRhcHRlci0+dHhjdGxwYWNrZXRbY291bnRdKTsKIAogCUZyZWVBZGFwdGVyRHN4QnVmZmVyKEFkYXB0ZXIpOwotCiAJa2ZyZWUoQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyKTsKIAotCS8vRnJlZSB0aGUgUEhTIEludGVyZmFjZQorCS8qIEZyZWUgdGhlIFBIUyBJbnRlcmZhY2UgKi8KIAlQaHNDbGVhbnVwKCZBZGFwdGVyLT5zdEJDTVBoc0NvbnRleHQpOwogCiAJQmNtRGVBbGxvY0ZsYXNoQ1NTdHJ1Y3R1cmUoQWRhcHRlcik7CkBAIC0xNjAsMjAgKzEzNiwxOCBAQAogCiBzdGF0aWMgaW50IGNyZWF0ZV93b3JrZXJfdGhyZWFkcyhQTUlOSV9BREFQVEVSIHBzQWRhcHRlcikKIHsKLQkvLyBSeCBDb250cm9sIFBhY2tldHMgUHJvY2Vzc2luZworCS8qIFJ4IENvbnRyb2wgUGFja2V0cyBQcm9jZXNzaW5nICovCiAJcHNBZGFwdGVyLT5jb250cm9sX3BhY2tldF9oYW5kbGVyID0ga3RocmVhZF9ydW4oKGludCAoKikodm9pZCAqKSkKIAkJCQkJCQljb250cm9sX3BhY2tldF9oYW5kbGVyLCBwc0FkYXB0ZXIsICIlcy1yeCIsIERSVl9OQU1FKTsKLQlpZihJU19FUlIocHNBZGFwdGVyLT5jb250cm9sX3BhY2tldF9oYW5kbGVyKSkKLQl7CisJaWYgKElTX0VSUihwc0FkYXB0ZXItPmNvbnRyb2xfcGFja2V0X2hhbmRsZXIpKSB7CiAJCXByX25vdGljZShEUlZfTkFNRSAiOiBjb3VsZCBub3QgY3JlYXRlIGNvbnRyb2wgdGhyZWFkXG4iKTsKIAkJcmV0dXJuIFBUUl9FUlIocHNBZGFwdGVyLT5jb250cm9sX3BhY2tldF9oYW5kbGVyKTsKIAl9CiAKLQkvLyBUeCBUaHJlYWQKKwkvKiBUeCBUaHJlYWQgKi8KIAlwc0FkYXB0ZXItPnRyYW5zbWl0X3BhY2tldF90aHJlYWQgPSBrdGhyZWFkX3J1bigoaW50ICgqKSh2b2lkICopKQogCQkJCQkJCXR4X3BrdF9oYW5kbGVyLCBwc0FkYXB0ZXIsICIlcy10eCIsIERSVl9OQU1FKTsKLQlpZihJU19FUlIgKHBzQWRhcHRlci0+dHJhbnNtaXRfcGFja2V0X3RocmVhZCkpCi0JeworCWlmIChJU19FUlIocHNBZGFwdGVyLT50cmFuc21pdF9wYWNrZXRfdGhyZWFkKSkgewogCQlwcl9ub3RpY2UoRFJWX05BTUUgIjogY291bGQgbm90IGNyZWF0IHRyYW5zbWl0IHRocmVhZFxuIik7CiAJCWt0aHJlYWRfc3RvcChwc0FkYXB0ZXItPmNvbnRyb2xfcGFja2V0X2hhbmRsZXIpOwogCQlyZXR1cm4gUFRSX0VSUihwc0FkYXB0ZXItPnRyYW5zbWl0X3BhY2tldF90aHJlYWQpOwpAQCAtMTgzLDI3NSArMTU3LDI0OCBAQAogCiBzdGF0aWMgc3RydWN0IGZpbGUgKm9wZW5fZmlybXdhcmVfZmlsZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIGNvbnN0IGNoYXIgKnBhdGgpCiB7Ci0gICAgc3RydWN0IGZpbGUgICAgICAgICAgICAgKmZscD1OVUxMOwotICAgIG1tX3NlZ21lbnRfdCAgICAgICAgb2xkZnM7Ci0gICAgb2xkZnM9Z2V0X2ZzKCk7CisJc3RydWN0IGZpbGUgKmZscCA9IE5VTEw7CisJbW1fc2VnbWVudF90IG9sZGZzOworCW9sZGZzID0gZ2V0X2ZzKCk7CiAJc2V0X2ZzKGdldF9kcygpKTsKLSAgICBmbHA9ZmlscF9vcGVuKHBhdGgsIE9fUkRPTkxZLCBTX0lSV1hVKTsKLSAgICBzZXRfZnMob2xkZnMpOwotICAgIGlmKElTX0VSUihmbHApKQotICAgIHsKLQkgICAgcHJfZXJyKERSVl9OQU1FICJVbmFibGUgVG8gT3BlbiBGaWxlICVzLCBlcnIgJWxkIiwKLQkJICAgcGF0aCwgUFRSX0VSUihmbHApKTsKLQkgICAgZmxwID0gTlVMTDsKLSAgICB9CisJZmxwID0gZmlscF9vcGVuKHBhdGgsIE9fUkRPTkxZLCBTX0lSV1hVKTsKKwlzZXRfZnMob2xkZnMpOworCWlmIChJU19FUlIoZmxwKSkgeworCQlwcl9lcnIoRFJWX05BTUUgIlVuYWJsZSBUbyBPcGVuIEZpbGUgJXMsIGVyciAlbGQiLCBwYXRoLCBQVFJfRVJSKGZscCkpOworCQlmbHAgPSBOVUxMOworCX0KIAotICAgIGlmKEFkYXB0ZXItPmRldmljZV9yZW1vdmVkKQotCSAgICBmbHAgPSBOVUxMOworCWlmIChBZGFwdGVyLT5kZXZpY2VfcmVtb3ZlZCkKKwkJZmxwID0gTlVMTDsKIAotICAgIHJldHVybiBmbHA7CisJcmV0dXJuIGZscDsKIH0KIAotCi1zdGF0aWMgaW50IEJjbUZpbGVEb3dubG9hZChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsLyoqPCBMb2dpY2FsIEFkYXB0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsICAgICAvKio8IHBhdGggdG8gaW1hZ2UgZmlsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxvYyAgICAvKio8IERvd25sb2FkIEFkZHJlc3Mgb24gdGhlIGNoaXAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKQorLyogQXJndW1lbnRzOgorICogTG9naWNhbCBBZGFwdGVyCisgKiBQYXRoIHRvIGltYWdlIGZpbGUKKyAqIERvd25sb2FkIEFkZHJlc3Mgb24gdGhlIGNoaXAKKyAqLworc3RhdGljIGludCBCY21GaWxlRG93bmxvYWQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBjb25zdCBjaGFyICpwYXRoLCB1bnNpZ25lZCBpbnQgbG9jKQogewotICAgIGludCAgICAgICAgICAgICBlcnJvcm5vPTA7Ci0gICAgc3RydWN0IGZpbGUgICAgICpmbHA9TlVMTDsKLSAgICBtbV9zZWdtZW50X3QgICAgb2xkZnM7Ci0gICAgc3RydWN0IHRpbWV2YWwgdHY9ezB9OworCWludCBlcnJvcm5vID0gMDsKKwlzdHJ1Y3QgZmlsZSAqZmxwID0gTlVMTDsKKwltbV9zZWdtZW50X3Qgb2xkZnM7CisJc3RydWN0IHRpbWV2YWwgdHYgPSB7MH07CiAKLSAgICBmbHA9b3Blbl9maXJtd2FyZV9maWxlKEFkYXB0ZXIsIHBhdGgpOwotICAgIGlmKCFmbHApCi0gICAgewotICAgICAgICBlcnJvcm5vID0gLUVOT0VOVDsKLSAgICAgICAgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiVW5hYmxlIHRvIE9wZW4gJXNcbiIsIHBhdGgpOwotICAgICAgICBnb3RvIGV4aXRfZG93bmxvYWQ7Ci0gICAgfQotICAgIEJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIk9wZW5lZCBmaWxlIGlzID0gJXMgYW5kIGxlbmd0aCA9MHglbHggdG8gYmUgZG93bmxvYWRlZCBhdCA9MHgleCIsIHBhdGgsKHVuc2lnbmVkIGxvbmcpZmxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zaXplLCBsb2MpOwotICAgIGRvX2dldHRpbWVvZmRheSgmdHYpOworCWZscCA9IG9wZW5fZmlybXdhcmVfZmlsZShBZGFwdGVyLCBwYXRoKTsKKwlpZiAoIWZscCkgeworCQllcnJvcm5vID0gLUVOT0VOVDsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIlVuYWJsZSB0byBPcGVuICVzXG4iLCBwYXRoKTsKKwkJZ290byBleGl0X2Rvd25sb2FkOworCX0KKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiT3BlbmVkIGZpbGUgaXMgPSAlcyBhbmQgbGVuZ3RoID0weCVseCB0byBiZSBkb3dubG9hZGVkIGF0ID0weCV4IiwgcGF0aCwgKHVuc2lnbmVkIGxvbmcpZmxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zaXplLCBsb2MpOworCWRvX2dldHRpbWVvZmRheSgmdHYpOwogCi0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiZG93bmxvYWQgc3RhcnQgJWx4IiwgKCh0di50dl9zZWMgKiAxMDAwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR2LnR2X3VzZWMvMTAwMCkpKTsKLSAgICBpZihBZGFwdGVyLT5iY21fZmlsZV9kb3dubG9hZChBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXIsIGZscCwgbG9jKSkKLSAgICB7Ci0gICAgICAgIEJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIkZhaWxlZCB0byBkb3dubG9hZCB0aGUgZmlybXdhcmUgd2l0aCBlcnJvclwKLQkJICV4ISEhIiwgLUVJTyk7Ci0gICAgICAgIGVycm9ybm89LUVJTzsKLSAgICAgICAgZ290byBleGl0X2Rvd25sb2FkOwotICAgIH0KLSAgICBvbGRmcz1nZXRfZnMoKTtzZXRfZnMoZ2V0X2RzKCkpOwotICAgIHZmc19sbHNlZWsoZmxwLCAwLCAwKTsKLSAgICBzZXRfZnMob2xkZnMpOwotICAgIGlmKEFkYXB0ZXItPmJjbV9maWxlX3JlYWRiYWNrX2Zyb21fY2hpcChBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXIsCi0JCQkJCQkJCQkJZmxwLCBsb2MpKQotICAgIHsKLSAgICAgICAgQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiRmFpbGVkIHRvIHJlYWQgYmFjayBmaXJtd2FyZSEiKTsKLSAgICAgICAgZXJyb3Jubz0tRUlPOwotICAgICAgICBnb3RvIGV4aXRfZG93bmxvYWQ7Ci0gICAgfQorCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJkb3dubG9hZCBzdGFydCAlbHgiLCAoKHR2LnR2X3NlYyAqIDEwMDApICsgKHR2LnR2X3VzZWMgLyAxMDAwKSkpOworCWlmIChBZGFwdGVyLT5iY21fZmlsZV9kb3dubG9hZChBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXIsIGZscCwgbG9jKSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiRmFpbGVkIHRvIGRvd25sb2FkIHRoZSBmaXJtd2FyZSB3aXRoIGVycm9yICV4ISEhIiwgLUVJTyk7CisJCWVycm9ybm8gPSAtRUlPOworCQlnb3RvIGV4aXRfZG93bmxvYWQ7CisJfQorCW9sZGZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKGdldF9kcygpKTsKKwl2ZnNfbGxzZWVrKGZscCwgMCwgMCk7CisJc2V0X2ZzKG9sZGZzKTsKKwlpZiAoQWRhcHRlci0+YmNtX2ZpbGVfcmVhZGJhY2tfZnJvbV9jaGlwKEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlciwgZmxwLCBsb2MpKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJGYWlsZWQgdG8gcmVhZCBiYWNrIGZpcm13YXJlISIpOworCQllcnJvcm5vID0gLUVJTzsKKwkJZ290byBleGl0X2Rvd25sb2FkOworCX0KIAogZXhpdF9kb3dubG9hZDoKLSAgICBvbGRmcz1nZXRfZnMoKTtzZXRfZnMoZ2V0X2RzKCkpOwotCWlmKGZscCAmJiAhKElTX0VSUihmbHApKSkKLSAgICAJZmlscF9jbG9zZShmbHAsIGN1cnJlbnQtPmZpbGVzKTsKLSAgICBzZXRfZnMob2xkZnMpOworCW9sZGZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKGdldF9kcygpKTsKKwlpZiAoZmxwICYmICEoSVNfRVJSKGZscCkpKQorCQlmaWxwX2Nsb3NlKGZscCwgY3VycmVudC0+ZmlsZXMpOworCXNldF9mcyhvbGRmcyk7CiAKLSAgICByZXR1cm4gZXJyb3JubzsKKwlyZXR1cm4gZXJyb3JubzsKIH0KIAogLyoqCi1AaW5ncm91cCBjdHJsX3BrdF9mdW5jdGlvbnMKLVRoaXMgZnVuY3Rpb24gY29waWVzIHRoZSBjb250ZW50cyBvZiBnaXZlbiBidWZmZXIKLXRvIHRoZSBjb250cm9sIHBhY2tldCBhbmQgcXVldWVzIGl0IGZvciB0cmFuc21pc3Npb24uCi1Abm90ZSBEbyBub3QgYWNxdWlyZSB0aGUgc3Bpbm9jaywgYXMgaXQgaXQgYWxyZWFkeSBhY3F1aXJlZC4KLUByZXR1cm4gIFNVQ0NFU1MvRkFJTFVSRS4KLSovCi1JTlQgQ29weUJ1ZmZlclRvQ29udHJvbFBhY2tldChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsLyoqPExvZ2ljYWwgQWRhcHRlciovCi0JCQkJCQkJCQkgIFBWT0lEIGlvQnVmZmVyLyoqPENvbnRyb2wgUGFja2V0IEJ1ZmZlciovCi0JCQkJCQkJCQkgICkKKyAqIEBpbmdyb3VwIGN0cmxfcGt0X2Z1bmN0aW9ucworICogVGhpcyBmdW5jdGlvbiBjb3BpZXMgdGhlIGNvbnRlbnRzIG9mIGdpdmVuIGJ1ZmZlcgorICogdG8gdGhlIGNvbnRyb2wgcGFja2V0IGFuZCBxdWV1ZXMgaXQgZm9yIHRyYW5zbWlzc2lvbi4KKyAqIEBub3RlIERvIG5vdCBhY3F1aXJlIHRoZSBzcGlub2NrLCBhcyBpdCBpdCBhbHJlYWR5IGFjcXVpcmVkLgorICogQHJldHVybiAgU1VDQ0VTUy9GQUlMVVJFLgorICogQXJndW1lbnRzOgorICogTG9naWNhbCBBZGFwdGVyCisgKiBDb250cm9sIFBhY2tldCBCdWZmZXIKKyAqLworSU5UIENvcHlCdWZmZXJUb0NvbnRyb2xQYWNrZXQoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBQVk9JRCBpb0J1ZmZlcikKIHsKLQlQTEVBREVSCQkJCXBMZWFkZXI9TlVMTDsKLQlJTlQJCQkJCVN0YXR1cz0wOwotCXVuc2lnbmVkIGNoYXIJCSpjdHJsX2J1ZmY9TlVMTDsKLQlVSU5UCQkJCXBrdGxlbj0wOwotCVBMSU5LX1JFUVVFU1QJCXBMaW5rUmVxIAk9IE5VTEw7Ci0JUFVDSEFSCQkJCXB1Y0FkZEluZGljYXRpb24gPSBOVUxMOworCVBMRUFERVIJcExlYWRlciA9IE5VTEw7CisJSU5UIFN0YXR1cyA9IDA7CisJdW5zaWduZWQgY2hhciAqY3RybF9idWZmID0gTlVMTDsKKwlVSU5UIHBrdGxlbiA9IDA7CisJUExJTktfUkVRVUVTVCBwTGlua1JlcSA9IE5VTEw7CisJUFVDSEFSIHB1Y0FkZEluZGljYXRpb24gPSBOVUxMOwogCi0JQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgIj09PT09PT4iKTsKLQlpZighaW9CdWZmZXIpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsREJHX0xWTF9BTEwsICJHb3QgTnVsbCBCdWZmZXJcbiIpOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCwgREJHX0xWTF9BTEwsICI9PT09PT0+Iik7CisJaWYgKCFpb0J1ZmZlcikgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsIERCR19MVkxfQUxMLCAiR290IE51bGwgQnVmZmVyXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJcExpbmtSZXEgPSAoUExJTktfUkVRVUVTVClpb0J1ZmZlcjsKLQlwTGVhZGVyPShQTEVBREVSKWlvQnVmZmVyOyAvL2lvQnVmZmVyIENvbnRhaW5zIHN3X1N0YXR1cyBhbmQgUGF5bG9hZAorCXBMZWFkZXIgPSAoUExFQURFUilpb0J1ZmZlcjsgLyogaW9CdWZmZXIgQ29udGFpbnMgc3dfU3RhdHVzIGFuZCBQYXlsb2FkICovCiAKLQlpZihBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFICYmCisJaWYgKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUgJiYKIAkJcExpbmtSZXEtPnN6RGF0YVswXSA9PSBMSU5LX0RPV05fUkVRX1BBWUxPQUQgJiYKLQkJcExpbmtSZXEtPnN6RGF0YVsxXSA9PSBMSU5LX1NZTkNfVVBfU1VCVFlQRSkKLQl7Ci0JCS8vR290IHN5bmMgZG93biBpbiBTSFVURE9XTi4ud2UgY291bGQgbm90IHByb2Nlc3MgdGhpcy4KLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsREJHX0xWTF9BTEwsICJTWU5DIERPV04gUmVxdWVzdCBpbiBTaHV0IERvd24gTW9kZS4uXG4iKTsKKwkJcExpbmtSZXEtPnN6RGF0YVsxXSA9PSBMSU5LX1NZTkNfVVBfU1VCVFlQRSkgeworCisJCS8qIEdvdCBzeW5jIGRvd24gaW4gU0hVVERPV04uLndlIGNvdWxkIG5vdCBwcm9jZXNzIHRoaXMuICovCisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJTWU5DIERPV04gUmVxdWVzdCBpbiBTaHV0IERvd24gTW9kZS4uXG4iKTsKIAkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwogCX0KIAotCWlmKChwTGVhZGVyLT5TdGF0dXMgPT0gTElOS19VUF9DT05UUk9MX1JFUSkgJiYKKwlpZiAoKHBMZWFkZXItPlN0YXR1cyA9PSBMSU5LX1VQX0NPTlRST0xfUkVRKSAmJgogCQkoKHBMaW5rUmVxLT5zekRhdGFbMF0gPT0gTElOS19VUF9SRVFfUEFZTE9BRCAmJgotCQkgKHBMaW5rUmVxLT5zekRhdGFbMV0gPT0gTElOS19TWU5DX1VQX1NVQlRZUEUpKSB8fC8vU3luYyBVcCBDb21tYW5kCi0JCSBwTGlua1JlcS0+c3pEYXRhWzBdID09IE5FVFdPUktfRU5UUllfUkVRX1BBWUxPQUQpKSAvL05ldCBFbnRyeSBDb21tYW5kCi0JewotCQlpZihBZGFwdGVyLT5MaW5rU3RhdHVzID4gUEhZX1NZTkNfQUNISVZFRCkKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsREJHX0xWTF9BTEwsIkxpbmtTdGF0dXMgaXMgR3JlYXRlciB0aGFuIFBIWV9TWU5fQUNISUVWRUQiKTsKKwkJCShwTGlua1JlcS0+c3pEYXRhWzFdID09IExJTktfU1lOQ19VUF9TVUJUWVBFKSkgfHwgLyogU3luYyBVcCBDb21tYW5kICovCisJCQlwTGlua1JlcS0+c3pEYXRhWzBdID09IE5FVFdPUktfRU5UUllfUkVRX1BBWUxPQUQpKSAvKiBOZXQgRW50cnkgQ29tbWFuZCAqLyB7CisKKwkJaWYgKEFkYXB0ZXItPkxpbmtTdGF0dXMgPiBQSFlfU1lOQ19BQ0hJVkVEKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsIERCR19MVkxfQUxMLCAiTGlua1N0YXR1cyBpcyBHcmVhdGVyIHRoYW4gUEhZX1NZTl9BQ0hJRVZFRCIpOwogCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOwogCQl9Ci0JCWlmKFRSVUUgPT0gQWRhcHRlci0+YlNodXRTdGF0dXMpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9DT05UUk9MLERCR19MVkxfQUxMLCAiU1lOQyBVUCBJTiBTSFVURE9XTi4uRGV2aWNlIFdha2VVcFxuIik7Ci0JCQlpZihBZGFwdGVyLT5iVHJpZWRUb1dha2VVcEZyb21sb3dQb3dlck1vZGUgPT0gRkFMU0UpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsREJHX0xWTF9BTEwsICJXYWtpbmcgdXAgZm9yIHRoZSBGaXJzdCBUaW1lLi5cbiIpOwotCQkJCUFkYXB0ZXItPnVzSWRsZU1vZGVQYXR0ZXJuID0gQUJPUlRfU0hVVERPV05fTU9ERTsgLy8gY2hhbmdlIGl0IHRvIDEgZm9yIGN1cnJlbnQgc3VwcG9ydC4KKworCQlpZiAoVFJVRSA9PSBBZGFwdGVyLT5iU2h1dFN0YXR1cykgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1RYLCBUWF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgIlNZTkMgVVAgSU4gU0hVVERPV04uLkRldmljZSBXYWtlVXBcbiIpOworCQkJaWYgKEFkYXB0ZXItPmJUcmllZFRvV2FrZVVwRnJvbWxvd1Bvd2VyTW9kZSA9PSBGQUxTRSkgeworCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJXYWtpbmcgdXAgZm9yIHRoZSBGaXJzdCBUaW1lLi5cbiIpOworCQkJCUFkYXB0ZXItPnVzSWRsZU1vZGVQYXR0ZXJuID0gQUJPUlRfU0hVVERPV05fTU9ERTsgLyogY2hhbmdlIGl0IHRvIDEgZm9yIGN1cnJlbnQgc3VwcG9ydC4gKi8KIAkJCQlBZGFwdGVyLT5iV2FrZVVwRGV2aWNlID0gVFJVRTsKIAkJCQl3YWtlX3VwKCZBZGFwdGVyLT5wcm9jZXNzX3J4X2NudHJscGt0KTsKKwkJCQlTdGF0dXMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChBZGFwdGVyLT5sb3dwb3dlcl9tb2RlX3dhaXRfcXVldWUsICFBZGFwdGVyLT5iU2h1dFN0YXR1cywgKDUgKiBIWikpOwogCi0JCQkJU3RhdHVzID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoQWRhcHRlci0+bG93cG93ZXJfbW9kZV93YWl0X3F1ZXVlLAotCQkJCQkhQWRhcHRlci0+YlNodXRTdGF0dXMsICg1ICogSFopKTsKLQotCQkJCWlmKFN0YXR1cyA9PSAtRVJFU1RBUlRTWVMpCisJCQkJaWYgKFN0YXR1cyA9PSAtRVJFU1RBUlRTWVMpCiAJCQkJCXJldHVybiBTdGF0dXM7CiAKLQkJCQlpZihBZGFwdGVyLT5iU2h1dFN0YXR1cykKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9DT05UUk9MLERCR19MVkxfQUxMLCAiU2h1dGRvd24gTW9kZSBXYWtlIHVwIEZhaWxlZCAtIE5vIFdha2UgVXAgUmVjZWl2ZWRcbiIpOworCQkJCWlmIChBZGFwdGVyLT5iU2h1dFN0YXR1cykgeworCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsIERCR19MVkxfQUxMLCAiU2h1dGRvd24gTW9kZSBXYWtlIHVwIEZhaWxlZCAtIE5vIFdha2UgVXAgUmVjZWl2ZWRcbiIpOwogCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CiAJCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9DT05UUk9MLERCR19MVkxfQUxMLCAiV2FrZXVwIGhhcyBiZWVuIHRyaWVkIGFscmVhZHkuLi5cbiIpOworCQkJfSBlbHNlIHsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsIERCR19MVkxfQUxMLCAiV2FrZXVwIGhhcyBiZWVuIHRyaWVkIGFscmVhZHkuLi5cbiIpOwogCQkJfQogCQl9Ci0KIAl9Ci0JaWYoVFJVRSA9PSBBZGFwdGVyLT5JZGxlTW9kZSkKLQl7Ci0JCS8vQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJEZXZpY2UgaXMgaW4gSWRsZSBtb2RlIC4uLiBoZW5jZSBcbiIpOwotCQlpZihwTGVhZGVyLT5TdGF0dXMgPT0gTElOS19VUF9DT05UUk9MX1JFUSB8fCBwTGVhZGVyLT5TdGF0dXMgPT0gMHg4MCB8fAotCQkJcExlYWRlci0+U3RhdHVzID09IENNX0NPTlRST0xfTkVXRFNYX01VTFRJQ0xBU1NJRklFUl9SRVEgKQogCi0JCXsKLQkJCWlmKChwTGVhZGVyLT5TdGF0dXMgPT0gTElOS19VUF9DT05UUk9MX1JFUSkgJiYgKHBMaW5rUmVxLT5zekRhdGFbMF09PUxJTktfRE9XTl9SRVFfUEFZTE9BRCkpCi0JCQl7Ci0JCQkJaWYoKHBMaW5rUmVxLT5zekRhdGFbMV0gPT0gTElOS19TWU5DX0RPV05fU1VCVFlQRSkpCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCxEQkdfTFZMX0FMTCwgIkxpbmsgRG93biBTZW50IGluIElkbGUgTW9kZVxuIik7Ci0JCQkJCUFkYXB0ZXItPnVzSWRsZU1vZGVQYXR0ZXJuID0gQUJPUlRfSURMRV9TWU5DRE9XTjsvL0xJTksgRE9XTiBzZW50IGluIElkbGUgTW9kZQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCxEQkdfTFZMX0FMTCwiQUJPUlRfSURMRV9NT0RFIHBhdHRlcm4gaXMgYmVpbmcgd3JpdHRlblxuIik7CisJaWYgKFRSVUUgPT0gQWRhcHRlci0+SWRsZU1vZGUpIHsKKwkJLyogQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJEZXZpY2UgaXMgaW4gSWRsZSBtb2RlIC4uLiBoZW5jZVxuIik7ICovCisJCWlmIChwTGVhZGVyLT5TdGF0dXMgPT0gTElOS19VUF9DT05UUk9MX1JFUSB8fCBwTGVhZGVyLT5TdGF0dXMgPT0gMHg4MCB8fAorCQkJcExlYWRlci0+U3RhdHVzID09IENNX0NPTlRST0xfTkVXRFNYX01VTFRJQ0xBU1NJRklFUl9SRVEpIHsKKworCQkJaWYgKChwTGVhZGVyLT5TdGF0dXMgPT0gTElOS19VUF9DT05UUk9MX1JFUSkgJiYgKHBMaW5rUmVxLT5zekRhdGFbMF0gPT0gTElOS19ET1dOX1JFUV9QQVlMT0FEKSkJeworCQkJCWlmICgocExpbmtSZXEtPnN6RGF0YVsxXSA9PSBMSU5LX1NZTkNfRE9XTl9TVUJUWVBFKSkgeworCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsIERCR19MVkxfQUxMLCAiTGluayBEb3duIFNlbnQgaW4gSWRsZSBNb2RlXG4iKTsKKwkJCQkJQWRhcHRlci0+dXNJZGxlTW9kZVBhdHRlcm4gPSBBQk9SVF9JRExFX1NZTkNET1dOOyAvKiBMSU5LIERPV04gc2VudCBpbiBJZGxlIE1vZGUgKi8KKwkJCQl9IGVsc2UgeworCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsIERCR19MVkxfQUxMLCAiQUJPUlRfSURMRV9NT0RFIHBhdHRlcm4gaXMgYmVpbmcgd3JpdHRlblxuIik7CiAJCQkJCUFkYXB0ZXItPnVzSWRsZU1vZGVQYXR0ZXJuID0gQUJPUlRfSURMRV9SRUc7CiAJCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCxEQkdfTFZMX0FMTCwiQUJPUlRfSURMRV9NT0RFIHBhdHRlcm4gaXMgYmVpbmcgd3JpdHRlblxuIik7Ci0JCQkJCUFkYXB0ZXItPnVzSWRsZU1vZGVQYXR0ZXJuID0gQUJPUlRfSURMRV9NT0RFOworCQkJfSBlbHNlIHsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsIERCR19MVkxfQUxMLCAiQUJPUlRfSURMRV9NT0RFIHBhdHRlcm4gaXMgYmVpbmcgd3JpdHRlblxuIik7CisJCQkJQWRhcHRlci0+dXNJZGxlTW9kZVBhdHRlcm4gPSBBQk9SVF9JRExFX01PREU7CiAJCQl9CiAKIAkJCS8qU2V0dGluZyBiSWRsZU1vZGVfdHhfZnJvbV9ob3N0IHRvIFRSVUUgdG8gaW5kaWNhdGUgTEVEIGNvbnRyb2wgdGhyZWFkIHRvIHJlcHJlc2VudAotCQkJICB0aGUgd2FrZSB1cCBmcm9tIGlkbGVtb2RlIGlzIGZyb20gaG9zdCovCi0JCQkvL0FkYXB0ZXItPkxFREluZm8uYklkbGVNb2RlX3R4X2Zyb21faG9zdCA9IFRSVUU7CisJCQkgKiAgdGhlIHdha2UgdXAgZnJvbSBpZGxlbW9kZSBpcyBmcm9tIGhvc3QKKwkJCSAqLworCQkJLyogQWRhcHRlci0+TEVESW5mby5iSWRsZU1vZGVfdHhfZnJvbV9ob3N0ID0gVFJVRTsgKi8KIAkJCUFkYXB0ZXItPmJXYWtlVXBEZXZpY2UgPSBUUlVFOwogCQkJd2FrZV91cCgmQWRhcHRlci0+cHJvY2Vzc19yeF9jbnRybHBrdCk7CiAKLQotCi0JCQlpZihMSU5LX0RPV05fUkVRX1BBWUxPQUQgPT0gcExpbmtSZXEtPnN6RGF0YVswXSkKLQkJCXsKLQkJCQkvLyBXZSBzaG91bGQgbm90IHNlbmQgRFJFRyBtZXNzYWdlIGRvd24gd2hpbGUgaW4gaWRsZW1vZGUuCisJCQkvKiBXZSBzaG91bGQgbm90IHNlbmQgRFJFRyBtZXNzYWdlIGRvd24gd2hpbGUgaW4gaWRsZW1vZGUuICovCisJCQlpZiAoTElOS19ET1dOX1JFUV9QQVlMT0FEID09IHBMaW5rUmVxLT5zekRhdGFbMF0pCiAJCQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwotCQkJfQogCi0JCQlTdGF0dXMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChBZGFwdGVyLT5sb3dwb3dlcl9tb2RlX3dhaXRfcXVldWUsCi0JCQkJIUFkYXB0ZXItPklkbGVNb2RlLCAoNSAqIEhaKSk7CisJCQlTdGF0dXMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChBZGFwdGVyLT5sb3dwb3dlcl9tb2RlX3dhaXRfcXVldWUsICFBZGFwdGVyLT5JZGxlTW9kZSwgKDUgKiBIWikpOwogCi0JCQlpZihTdGF0dXMgPT0gLUVSRVNUQVJUU1lTKQorCQkJaWYgKFN0YXR1cyA9PSAtRVJFU1RBUlRTWVMpCiAJCQkJcmV0dXJuIFN0YXR1czsKIAotCQkJaWYoQWRhcHRlci0+SWRsZU1vZGUpCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsREJHX0xWTF9BTEwsICJJZGxlIE1vZGUgV2FrZSB1cCBGYWlsZWQgLSBObyBXYWtlIFVwIFJlY2VpdmVkXG4iKTsKKwkJCWlmIChBZGFwdGVyLT5JZGxlTW9kZSkgeworCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJJZGxlIE1vZGUgV2FrZSB1cCBGYWlsZWQgLSBObyBXYWtlIFVwIFJlY2VpdmVkXG4iKTsKIAkJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CiAJCQl9Ci0JCX0KLQkJZWxzZQorCQl9IGVsc2UgewogCQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworCQl9CiAJfQotCS8vVGhlIERyaXZlciBoYXMgdG8gc2VuZCBjb250cm9sIG1lc3NhZ2VzIHdpdGggYSBwYXJ0aWN1bGFyIFZDSUQKLQlwTGVhZGVyLT5WY2lkID0gVkNJRF9DT05UUk9MX1BBQ0tFVDsvL1ZDSUQgZm9yIGNvbnRyb2wgcGFja2V0LgorCisJLyogVGhlIERyaXZlciBoYXMgdG8gc2VuZCBjb250cm9sIG1lc3NhZ2VzIHdpdGggYSBwYXJ0aWN1bGFyIFZDSUQgKi8KKwlwTGVhZGVyLT5WY2lkID0gVkNJRF9DT05UUk9MX1BBQ0tFVDsgLyogVkNJRCBmb3IgY29udHJvbCBwYWNrZXQuICovCiAKIAkvKiBBbGxvY2F0ZSBza2IgZm9yIENvbnRyb2wgUGFja2V0ICovCiAJcGt0bGVuID0gcExlYWRlci0+UExlbmd0aDsKIAljdHJsX2J1ZmYgPSAoY2hhciAqKUFkYXB0ZXItPnR4Y3RscGFja2V0W2F0b21pY19yZWFkKCZBZGFwdGVyLT5pbmRleF93cl90eGNudHJscGt0KSVNQVhfQ05UUkxfUEtUU107CiAKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCxEQkdfTFZMX0FMTCwgIkNvbnRyb2wgcGFja2V0IHRvIGJlIHRha2VuID0lZCBhbmQgYWRkcmVzcyBpcyA9JXBpbmNvbWluZyBhZGRyZXNzIGlzID0lcCBhbmQgcGFja2V0IGxlbj0leCIsCi0JCQkJCQkJCWF0b21pY19yZWFkKCZBZGFwdGVyLT5pbmRleF93cl90eGNudHJscGt0KSwgY3RybF9idWZmLCBpb0J1ZmZlciwgcGt0bGVuKTsKLQlpZihjdHJsX2J1ZmYpCi0JewotCQlpZihwTGVhZGVyKQotCQl7Ci0JCQlpZigocExlYWRlci0+U3RhdHVzID09IDB4ODApIHx8Ci0JCQkJKHBMZWFkZXItPlN0YXR1cyA9PSBDTV9DT05UUk9MX05FV0RTWF9NVUxUSUNMQVNTSUZJRVJfUkVRKSkKLQkJCXsKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsIERCR19MVkxfQUxMLCAiQ29udHJvbCBwYWNrZXQgdG8gYmUgdGFrZW4gPSVkIGFuZCBhZGRyZXNzIGlzID0lcGluY29taW5nIGFkZHJlc3MgaXMgPSVwIGFuZCBwYWNrZXQgbGVuPSV4IiwKKwkJCWF0b21pY19yZWFkKCZBZGFwdGVyLT5pbmRleF93cl90eGNudHJscGt0KSwgY3RybF9idWZmLCBpb0J1ZmZlciwgcGt0bGVuKTsKKwlpZiAoY3RybF9idWZmKSB7CisJCWlmIChwTGVhZGVyKSB7CisJCQlpZiAoKHBMZWFkZXItPlN0YXR1cyA9PSAweDgwKSB8fAorCQkJCShwTGVhZGVyLT5TdGF0dXMgPT0gQ01fQ09OVFJPTF9ORVdEU1hfTVVMVElDTEFTU0lGSUVSX1JFUSkpIHsKIAkJCQkvKgotCQkJCS8vUmVzdHJ1Y3R1cmUgdGhlIERTWCBtZXNzYWdlIHRvIGhhbmRsZSBNdWx0aXBsZSBjbGFzc2lmaWVyIFN1cHBvcnQKLQkJCQkvLyBXcml0ZSB0aGUgU2VydmljZSBGbG93IHBhcmFtIFN0cnVjdHVyZXMgZGlyZWN0bHkgdG8gdGhlIHRhcmdldAotCQkJCS8vYW5kIGVtYmVkIHRoZSBwb2ludGVycyBpbiB0aGUgRFNYIG1lc3NhZ2VzIHNlbnQgdG8gdGFyZ2V0LgotCQkJCSovCi0JCQkJLy9MZXRzIHN0b3JlIHRoZSBjdXJyZW50IGxlbmd0aCBvZiB0aGUgY29udHJvbCBwYWNrZXQgd2UgYXJlIHRyYW5zbWl0dGluZworCQkJCSAqIFJlc3RydWN0dXJlIHRoZSBEU1ggbWVzc2FnZSB0byBoYW5kbGUgTXVsdGlwbGUgY2xhc3NpZmllciBTdXBwb3J0CisJCQkJICogV3JpdGUgdGhlIFNlcnZpY2UgRmxvdyBwYXJhbSBTdHJ1Y3R1cmVzIGRpcmVjdGx5IHRvIHRoZSB0YXJnZXQKKwkJCQkgKiBhbmQgZW1iZWQgdGhlIHBvaW50ZXJzIGluIHRoZSBEU1ggbWVzc2FnZXMgc2VudCB0byB0YXJnZXQuCisJCQkJICovCisJCQkJLyogTGV0cyBzdG9yZSB0aGUgY3VycmVudCBsZW5ndGggb2YgdGhlIGNvbnRyb2wgcGFja2V0IHdlIGFyZSB0cmFuc21pdHRpbmcgKi8KIAkJCQlwdWNBZGRJbmRpY2F0aW9uID0gKFBVQ0hBUilpb0J1ZmZlciArIExFQURFUl9TSVpFOwogCQkJCXBrdGxlbiA9IHBMZWFkZXItPlBMZW5ndGg7Ci0JCQkJU3RhdHVzID0gU3RvcmVDbUNvbnRyb2xSZXNwb25zZU1lc3NhZ2UoQWRhcHRlcixwdWNBZGRJbmRpY2F0aW9uLCAmcGt0bGVuKTsKLQkJCQlpZihTdGF0dXMgIT0gMSkKLQkJCQl7Ci0JCQkJCUNsZWFyVGFyZ2V0RFNYQnVmZmVyKEFkYXB0ZXIsKChzdExvY2FsU0ZBZGRJbmRpY2F0aW9uQWx0ICopcHVjQWRkSW5kaWNhdGlvbiktPnUxNlRJRCwgRkFMU0UpOwotCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCwgREJHX0xWTF9BTEwsICIgRXJyb3IgUmVzdG9yaW5nIFRoZSBEU1ggQ29udHJvbCBQYWNrZXQuIERzeCBCdWZmZXJzIG9uIFRhcmdldCBtYXkgbm90IGJlIFNldHVwIFByb3Blcmx5ICIpOworCQkJCVN0YXR1cyA9IFN0b3JlQ21Db250cm9sUmVzcG9uc2VNZXNzYWdlKEFkYXB0ZXIsIHB1Y0FkZEluZGljYXRpb24sICZwa3RsZW4pOworCQkJCWlmIChTdGF0dXMgIT0gMSkgeworCQkJCQlDbGVhclRhcmdldERTWEJ1ZmZlcihBZGFwdGVyLCAoKHN0TG9jYWxTRkFkZEluZGljYXRpb25BbHQgKilwdWNBZGRJbmRpY2F0aW9uKS0+dTE2VElELCBGQUxTRSk7CisJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCwgREJHX0xWTF9BTEwsICIgRXJyb3IgUmVzdG9yaW5nIFRoZSBEU1ggQ29udHJvbCBQYWNrZXQuIERzeCBCdWZmZXJzIG9uIFRhcmdldCBtYXkgbm90IGJlIFNldHVwIFByb3Blcmx5ICIpOwogCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CiAJCQkJfQogCQkJCS8qCi0JCQkJLy91cGRhdGUgdGhlIGxlYWRlciB0byB1c2UgdGhlIG5ldyBsZW5ndGgKLQkJCQkvL1RoZSBsZW5ndGggb2YgdGhlIGNvbnRyb2wgcGFja2V0IGlzIGxlbmd0aCBvZiBtZXNzYWdlIGJlaW5nIHNlbnQgKyBMZWFkZXIgbGVuZ3RoCi0JCQkJKi8KKwkJCQkgKiB1cGRhdGUgdGhlIGxlYWRlciB0byB1c2UgdGhlIG5ldyBsZW5ndGgKKwkJCQkgKiBUaGUgbGVuZ3RoIG9mIHRoZSBjb250cm9sIHBhY2tldCBpcyBsZW5ndGggb2YgbWVzc2FnZSBiZWluZyBzZW50ICsgTGVhZGVyIGxlbmd0aAorCQkJCSAqLwogCQkJCXBMZWFkZXItPlBMZW5ndGggPSBwa3RsZW47CiAJCQl9CiAJCX0KLQkJbWVtc2V0KGN0cmxfYnVmZiwgMCwgcGt0bGVuK0xFQURFUl9TSVpFKTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsIERCR19MVkxfQUxMLCAiQ29weWluZyB0aGUgQ29udHJvbCBQYWNrZXQgQnVmZmVyIHdpdGggbGVuZ3RoPSVkXG4iLCBwTGVhZGVyLT5QTGVuZ3RoKTsKLQkJKihQTEVBREVSKWN0cmxfYnVmZj0qcExlYWRlcjsKLQkJbWVtY3B5KGN0cmxfYnVmZiArIExFQURFUl9TSVpFLCAoKFBVQ0hBUilpb0J1ZmZlciArIExFQURFUl9TSVpFKSwgcExlYWRlci0+UExlbmd0aCk7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9DT05UUk9MLCBEQkdfTFZMX0FMTCwgIkVucXVldWluZyB0aGUgQ29udHJvbCBQYWNrZXQiKTsKIAotCQkvKlVwZGF0ZSB0aGUgc3RhdGlzdGljcyBjb3VudGVycyAqLworCQlpZiAocGt0bGVuICsgTEVBREVSX1NJWkUgPiBNQVhfQ05UTF9QS1RfU0laRSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCW1lbXNldChjdHJsX2J1ZmYsIDAsIHBrdGxlbitMRUFERVJfU0laRSk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJDb3B5aW5nIHRoZSBDb250cm9sIFBhY2tldCBCdWZmZXIgd2l0aCBsZW5ndGg9JWRcbiIsIHBMZWFkZXItPlBMZW5ndGgpOworCQkqKFBMRUFERVIpY3RybF9idWZmID0gKnBMZWFkZXI7CisJCW1lbWNweShjdHJsX2J1ZmYgKyBMRUFERVJfU0laRSwgKChQVUNIQVIpaW9CdWZmZXIgKyBMRUFERVJfU0laRSksIHBMZWFkZXItPlBMZW5ndGgpOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsIERCR19MVkxfQUxMLCAiRW5xdWV1aW5nIHRoZSBDb250cm9sIFBhY2tldCIpOworCisJCS8qIFVwZGF0ZSB0aGUgc3RhdGlzdGljcyBjb3VudGVycyAqLwogCQlzcGluX2xvY2tfYmgoJkFkYXB0ZXItPlBhY2tJbmZvW0hpUHJpb3JpdHldLlNGUXVldWVMb2NrKTsKLQkJQWRhcHRlci0+UGFja0luZm9bSGlQcmlvcml0eV0udWlDdXJyZW50Qnl0ZXNPbkhvc3QrPXBMZWFkZXItPlBMZW5ndGg7CisJCUFkYXB0ZXItPlBhY2tJbmZvW0hpUHJpb3JpdHldLnVpQ3VycmVudEJ5dGVzT25Ib3N0ICs9IHBMZWFkZXItPlBMZW5ndGg7CiAJCUFkYXB0ZXItPlBhY2tJbmZvW0hpUHJpb3JpdHldLnVpQ3VycmVudFBhY2tldHNPbkhvc3QrKzsKIAkJYXRvbWljX2luYygmQWRhcHRlci0+VG90YWxQYWNrZXRDb3VudCk7CiAJCXNwaW5fdW5sb2NrX2JoKCZBZGFwdGVyLT5QYWNrSW5mb1tIaVByaW9yaXR5XS5TRlF1ZXVlTG9jayk7Ci0KIAkJQWRhcHRlci0+UGFja0luZm9bSGlQcmlvcml0eV0uYlZhbGlkID0gVFJVRTsKIAotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJDdXJyQnl0ZXNPbkhvc3Q6ICV4IGJWYWxpZDogJXgiLAotCQkJQWRhcHRlci0+UGFja0luZm9bSGlQcmlvcml0eV0udWlDdXJyZW50Qnl0ZXNPbkhvc3QsCi0JCQlBZGFwdGVyLT5QYWNrSW5mb1tIaVByaW9yaXR5XS5iVmFsaWQpOwotCQlTdGF0dXM9U1RBVFVTX1NVQ0NFU1M7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJDdXJyQnl0ZXNPbkhvc3Q6ICV4IGJWYWxpZDogJXgiLAorCQkJCUFkYXB0ZXItPlBhY2tJbmZvW0hpUHJpb3JpdHldLnVpQ3VycmVudEJ5dGVzT25Ib3N0LAorCQkJCUFkYXB0ZXItPlBhY2tJbmZvW0hpUHJpb3JpdHldLmJWYWxpZCk7CisJCVN0YXR1cyA9IFNUQVRVU19TVUNDRVNTOwogCQkvKlF1ZXVlIHRoZSBwYWNrZXQgZm9yIHRyYW5zbWlzc2lvbiAqLwogCQlhdG9taWNfaW5jKCZBZGFwdGVyLT5pbmRleF93cl90eGNudHJscGt0KTsKLQkJQkNNX0RFQlVHX1BSSU5UKCBBZGFwdGVyLERCR19UWVBFX1RYLCBUWF9DT05UUk9MLERCR19MVkxfQUxMLCAiQ2FsbGluZyB0cmFuc21pdF9wYWNrZXRzIik7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCwgREJHX0xWTF9BTEwsICJDYWxsaW5nIHRyYW5zbWl0X3BhY2tldHMiKTsKIAkJYXRvbWljX3NldCgmQWRhcHRlci0+VHhQa3RBdmFpbCwgMSk7CiAJCXdha2VfdXAoJkFkYXB0ZXItPnR4X3BhY2tldF93YWl0X3F1ZXVlKTsKKwl9IGVsc2UgeworCQlTdGF0dXMgPSAtRU5PTUVNOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsIERCR19MVkxfQUxMLCAibWVtIGFsbG9jYXRpb24gRmFpbGVkIik7CiAJfQotCWVsc2UKLQl7Ci0JCVN0YXR1cz0tRU5PTUVNOwotCQlCQ01fREVCVUdfUFJJTlQoIEFkYXB0ZXIsREJHX1RZUEVfVFgsIFRYX0NPTlRST0wsIERCR19MVkxfQUxMLCAibWVtIGFsbG9jYXRpb24gRmFpbGVkIik7Ci0gICAgfQotCUJDTV9ERUJVR19QUklOVCggQWRhcHRlcixEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCwgREJHX0xWTF9BTEwsICI8PT09PSIpOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9UWCwgVFhfQ09OVFJPTCwgREJHX0xWTF9BTEwsICI8PT09PSIpOwogCXJldHVybiBTdGF0dXM7CiB9CiAKQEAgLTQ2MCwzMyArNDA3LDMwIEBACiAqIEZ1bmN0aW9uICAgIC0gU2VuZFN0YXRpc3RpY3NQb2ludGVyUmVxdWVzdCgpCiAqCiAqIERlc2NyaXB0aW9uIC0gVGhpcyBmdW5jdGlvbiBidWlsZHMgYW5kIGZvcndhcmRzIHRoZSBTdGF0aXN0aWNzCi0qCQkJCVBvaW50ZXIgUmVxdWVzdCBjb250cm9sIFBhY2tldC4KKyogUG9pbnRlciBSZXF1ZXN0IGNvbnRyb2wgUGFja2V0LgogKgogKiBQYXJhbWV0ZXJzICAtIEFkYXB0ZXIJCQkJCTogUG9pbnRlciB0byBBZGFwdGVyIHN0cnVjdHVyZS4KLSogCQkJICAtIHBzdFN0YXRpc3RpY3NQdHJSZXF1ZXN0IDogUG9pbnRlciB0byBsaW5rIHJlcXVlc3QuCisqIC0gcHN0U3RhdGlzdGljc1B0clJlcXVlc3QgOiBQb2ludGVyIHRvIGxpbmsgcmVxdWVzdC4KICoKICogUmV0dXJucyAgICAgLSBOb25lLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgVk9JRCBTZW5kU3RhdGlzdGljc1BvaW50ZXJSZXF1ZXN0KFBNSU5JX0FEQVBURVIgQWRhcHRlciwKLQkJCQkJCQkJUExJTktfUkVRVUVTVAlwc3RTdGF0aXN0aWNzUHRyUmVxdWVzdCkKK3N0YXRpYyBWT0lEIFNlbmRTdGF0aXN0aWNzUG9pbnRlclJlcXVlc3QoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBQTElOS19SRVFVRVNUIHBzdFN0YXRpc3RpY3NQdHJSZXF1ZXN0KQogewotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1JYLCBSWF9EUEMsIERCR19MVkxfQUxMLCAiPT09PT09PiIpOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9SWCwgUlhfRFBDLCBEQkdfTFZMX0FMTCwgIj09PT09PT4iKTsKIAlwc3RTdGF0aXN0aWNzUHRyUmVxdWVzdC0+TGVhZGVyLlN0YXR1cyA9IFNUQVRTX1BPSU5URVJfUkVRX1NUQVRVUzsKLQlwc3RTdGF0aXN0aWNzUHRyUmVxdWVzdC0+TGVhZGVyLlBMZW5ndGggPSBzaXplb2YoVUxPTkcpOy8vbWluaW11bSA0IGJ5dGVzCisJcHN0U3RhdGlzdGljc1B0clJlcXVlc3QtPkxlYWRlci5QTGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsgLyogbWluaW11bSA0IGJ5dGVzICovCiAJcHN0U3RhdGlzdGljc1B0clJlcXVlc3QtPnN6RGF0YVswXSA9IFNUQVRJU1RJQ1NfUE9JTlRFUl9SRVE7Ci0KLQlDb3B5QnVmZmVyVG9Db250cm9sUGFja2V0KEFkYXB0ZXIscHN0U3RhdGlzdGljc1B0clJlcXVlc3QpOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1JYLCBSWF9EUEMsIERCR19MVkxfQUxMLCAiPD09PT09Iik7CisJQ29weUJ1ZmZlclRvQ29udHJvbFBhY2tldChBZGFwdGVyLCBwc3RTdGF0aXN0aWNzUHRyUmVxdWVzdCk7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1JYLCBSWF9EUEMsIERCR19MVkxfQUxMLCAiPD09PT09Iik7CiAJcmV0dXJuOwogfQogI2VuZGlmCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBGdW5jdGlvbiAgICAtIExpbmtNZXNzYWdlKCkKICoKICogRGVzY3JpcHRpb24gLSBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyB0aGUgU3luYy11cCBhbmQgTGluay11cCByZXF1ZXN0Ci0qCQkJCXBhY2tldCBtZXNzYWdlcyBkZXBlbmRpbmcgb24gdGhlIGRldmljZSBMaW5rIHN0YXR1cy4KKyogcGFja2V0IG1lc3NhZ2VzIGRlcGVuZGluZyBvbiB0aGUgZGV2aWNlIExpbmsgc3RhdHVzLgogKgogKiBQYXJhbWV0ZXJzICAtIEFkYXB0ZXI6CVBvaW50ZXIgdG8gdGhlIEFkYXB0ZXIgc3RydWN0dXJlLgogKgpAQCAtNDk0LDEwMiArNDM4LDkwIEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogVk9JRCBMaW5rTWVzc2FnZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7Ci0JUExJTktfUkVRVUVTVAlwc3RMaW5rUmVxdWVzdD1OVUxMOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTElOS19VUF9NU0csIERCR19MVkxfQUxMLCAiPT09PT0+Iik7Ci0JaWYoQWRhcHRlci0+TGlua1N0YXR1cyA9PSBTWU5DX1VQX1JFUVVFU1QgJiYgQWRhcHRlci0+QXV0b1N5bmN1cCkKLQl7CisJUExJTktfUkVRVUVTVCBwc3RMaW5rUmVxdWVzdCA9IE5VTEw7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgTElOS19VUF9NU0csIERCR19MVkxfQUxMLCAiPT09PT0+Iik7CisJaWYgKEFkYXB0ZXItPkxpbmtTdGF0dXMgPT0gU1lOQ19VUF9SRVFVRVNUICYmIEFkYXB0ZXItPkF1dG9TeW5jdXApIHsKIAkJcHN0TGlua1JlcXVlc3QgPSBremFsbG9jKHNpemVvZihMSU5LX1JFUVVFU1QpLCBHRlBfQVRPTUlDKTsKLQkJaWYoIXBzdExpbmtSZXF1ZXN0KQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIExJTktfVVBfTVNHLCBEQkdfTFZMX0FMTCwgIkNhbiBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBMaW5rIHJlcXVlc3QhIik7CisJCWlmICghcHN0TGlua1JlcXVlc3QpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIExJTktfVVBfTVNHLCBEQkdfTFZMX0FMTCwgIkNhbiBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBMaW5rIHJlcXVlc3QhIik7CiAJCQlyZXR1cm47CiAJCX0KLQkJLy9zeW5jIHVwIHJlcXVlc3QuLi4KLQkJQWRhcHRlci0+TGlua1N0YXR1cyA9IFdBSVRfRk9SX1NZTkM7Ly8gY3VycmVudCBsaW5rIHN0YXR1cwotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIExJTktfVVBfTVNHLCBEQkdfTFZMX0FMTCwgIlJlcXVlc3RpbmcgRm9yIFN5bmNVcC4uLiIpOwotCQlwc3RMaW5rUmVxdWVzdC0+c3pEYXRhWzBdPUxJTktfVVBfUkVRX1BBWUxPQUQ7Ci0JCXBzdExpbmtSZXF1ZXN0LT5zekRhdGFbMV09TElOS19TWU5DX1VQX1NVQlRZUEU7Ci0JCXBzdExpbmtSZXF1ZXN0LT5MZWFkZXIuU3RhdHVzPUxJTktfVVBfQ09OVFJPTF9SRVE7Ci0JCXBzdExpbmtSZXF1ZXN0LT5MZWFkZXIuUExlbmd0aD1zaXplb2YoVUxPTkcpOworCQkvKiBzeW5jIHVwIHJlcXVlc3QuLi4gKi8KKwkJQWRhcHRlci0+TGlua1N0YXR1cyA9IFdBSVRfRk9SX1NZTkM7IC8qIGN1cnJlbnQgbGluayBzdGF0dXMgKi8KKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgTElOS19VUF9NU0csIERCR19MVkxfQUxMLCAiUmVxdWVzdGluZyBGb3IgU3luY1VwLi4uIik7CisJCXBzdExpbmtSZXF1ZXN0LT5zekRhdGFbMF0gPSBMSU5LX1VQX1JFUV9QQVlMT0FEOworCQlwc3RMaW5rUmVxdWVzdC0+c3pEYXRhWzFdID0gTElOS19TWU5DX1VQX1NVQlRZUEU7CisJCXBzdExpbmtSZXF1ZXN0LT5MZWFkZXIuU3RhdHVzID0gTElOS19VUF9DT05UUk9MX1JFUTsKKwkJcHN0TGlua1JlcXVlc3QtPkxlYWRlci5QTGVuZ3RoID0gc2l6ZW9mKFVMT05HKTsKIAkJQWRhcHRlci0+YlN5bmNVcFJlcXVlc3RTZW50ID0gVFJVRTsKLQl9Ci0JZWxzZSBpZihBZGFwdGVyLT5MaW5rU3RhdHVzID09IFBIWV9TWU5DX0FDSElWRUQgJiYgQWRhcHRlci0+QXV0b0xpbmtVcCkKLQl7CisKKwl9IGVsc2UgaWYgKEFkYXB0ZXItPkxpbmtTdGF0dXMgPT0gUEhZX1NZTkNfQUNISVZFRCAmJiBBZGFwdGVyLT5BdXRvTGlua1VwKSB7CiAJCXBzdExpbmtSZXF1ZXN0ID0ga3phbGxvYyhzaXplb2YoTElOS19SRVFVRVNUKSwgR0ZQX0FUT01JQyk7Ci0JCWlmKCFwc3RMaW5rUmVxdWVzdCkKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBMSU5LX1VQX01TRywgREJHX0xWTF9BTEwsICJDYW4gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgTGluayByZXF1ZXN0ISIpOworCQlpZiAoIXBzdExpbmtSZXF1ZXN0KSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBMSU5LX1VQX01TRywgREJHX0xWTF9BTEwsICJDYW4gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgTGluayByZXF1ZXN0ISIpOwogCQkJcmV0dXJuOwogCQl9Ci0JCS8vTElOS19VUF9SRVFVRVNUCi0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTElOS19VUF9NU0csIERCR19MVkxfQUxMLCAiUmVxdWVzdGluZyBGb3IgTGlua1VwLi4uIik7Ci0JCXBzdExpbmtSZXF1ZXN0LT5zekRhdGFbMF09TElOS19VUF9SRVFfUEFZTE9BRDsKLQkJcHN0TGlua1JlcXVlc3QtPnN6RGF0YVsxXT1MSU5LX05FVF9FTlRSWTsKLQkJcHN0TGlua1JlcXVlc3QtPkxlYWRlci5TdGF0dXM9TElOS19VUF9DT05UUk9MX1JFUTsKLQkJcHN0TGlua1JlcXVlc3QtPkxlYWRlci5QTGVuZ3RoPXNpemVvZihVTE9ORyk7CisJCS8qIExJTktfVVBfUkVRVUVTVCAqLworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBMSU5LX1VQX01TRywgREJHX0xWTF9BTEwsICJSZXF1ZXN0aW5nIEZvciBMaW5rVXAuLi4iKTsKKwkJcHN0TGlua1JlcXVlc3QtPnN6RGF0YVswXSA9IExJTktfVVBfUkVRX1BBWUxPQUQ7CisJCXBzdExpbmtSZXF1ZXN0LT5zekRhdGFbMV0gPSBMSU5LX05FVF9FTlRSWTsKKwkJcHN0TGlua1JlcXVlc3QtPkxlYWRlci5TdGF0dXMgPSBMSU5LX1VQX0NPTlRST0xfUkVROworCQlwc3RMaW5rUmVxdWVzdC0+TGVhZGVyLlBMZW5ndGggPSBzaXplb2YoVUxPTkcpOwogCX0KLQlpZihwc3RMaW5rUmVxdWVzdCkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTElOS19VUF9NU0csIERCR19MVkxfQUxMLCAiQ2FsbGluZyBDb3B5QnVmZmVyVG9Db250cm9sUGFja2V0Iik7CisJaWYgKHBzdExpbmtSZXF1ZXN0KSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIExJTktfVVBfTVNHLCBEQkdfTFZMX0FMTCwgIkNhbGxpbmcgQ29weUJ1ZmZlclRvQ29udHJvbFBhY2tldCIpOwogCQlDb3B5QnVmZmVyVG9Db250cm9sUGFja2V0KEFkYXB0ZXIsIHBzdExpbmtSZXF1ZXN0KTsKIAkJa2ZyZWUocHN0TGlua1JlcXVlc3QpOwogCX0KLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIExJTktfVVBfTVNHLCBEQkdfTFZMX0FMTCwgIkxpbmtNZXNzYWdlIDw9PT09PSIpOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIExJTktfVVBfTVNHLCBEQkdfTFZMX0FMTCwgIkxpbmtNZXNzYWdlIDw9PT09PSIpOwogCXJldHVybjsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBGdW5jdGlvbiAgICAtIFN0YXRpc3RpY3NSZXNwb25zZSgpCiAqCiAqIERlc2NyaXB0aW9uIC0gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBTdGF0aXN0aWNzIHJlc3BvbnNlIHBhY2tldC4KICoKICogUGFyYW1ldGVycyAgLSBBZGFwdGVyCTogUG9pbnRlciB0byB0aGUgQWRhcHRlciBzdHJ1Y3R1cmUuCi0qIAkJCSAgLSBwdkJ1ZmZlcjogU3RhcnRpbmcgYWRkcmVzcyBvZiBTdGF0aXN0aWMgcmVzcG9uc2UgZGF0YS4KKyogLSBwdkJ1ZmZlcjogU3RhcnRpbmcgYWRkcmVzcyBvZiBTdGF0aXN0aWMgcmVzcG9uc2UgZGF0YS4KICoKICogUmV0dXJucyAgICAgLSBOb25lLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotVk9JRCBTdGF0aXN0aWNzUmVzcG9uc2UoUE1JTklfQURBUFRFUiBBZGFwdGVyLFBWT0lEIHB2QnVmZmVyKQorVk9JRCBTdGF0aXN0aWNzUmVzcG9uc2UoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBQVk9JRCBwdkJ1ZmZlcikKIHsKLQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICIlcz09PT0+IixfX0ZVTkNUSU9OX18pOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICIlcz09PT0+IiwgX19mdW5jX18pOwogCUFkYXB0ZXItPlN0YXRpc3RpY3NQb2ludGVyID0gbnRvaGwoKihfX2JlMzIgKilwdkJ1ZmZlcik7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiU3RhdHMgYXQgJXgiLCAoVUlOVClBZGFwdGVyLT5TdGF0aXN0aWNzUG9pbnRlcik7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiJXMgPD09PT0iLF9fRlVOQ1RJT05fXyk7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIlN0YXRzIGF0ICV4IiwgKFVJTlQpQWRhcHRlci0+U3RhdGlzdGljc1BvaW50ZXIpOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICIlcyA8PT09PSIsIF9fZnVuY19fKTsKIAlyZXR1cm47CiB9CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRnVuY3Rpb24gICAgLSBMaW5rQ29udHJvbFJlc3BvbnNlTWVzc2FnZSgpCiAqCiAqIERlc2NyaXB0aW9uIC0gVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSBMaW5rIHJlc3BvbnNlIHBhY2tldHMuCiAqCiAqIFBhcmFtZXRlcnMgIC0gQWRhcHRlcgkgOiBQb2ludGVyIHRvIHRoZSBBZGFwdGVyIHN0cnVjdHVyZS4KLSogCQkJICAtIHB1Y0J1ZmZlcjogU3RhcnRpbmcgYWRkcmVzcyBvZiBMaW5rIHJlc3BvbnNlIGRhdGEuCisqIC0gcHVjQnVmZmVyOiBTdGFydGluZyBhZGRyZXNzIG9mIExpbmsgcmVzcG9uc2UgZGF0YS4KICoKICogUmV0dXJucyAgICAgLSBOb25lLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1WT0lEIExpbmtDb250cm9sUmVzcG9uc2VNZXNzYWdlKFBNSU5JX0FEQVBURVIgQWRhcHRlcixQVUNIQVIgcHVjQnVmZmVyKQorVk9JRCBMaW5rQ29udHJvbFJlc3BvbnNlTWVzc2FnZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFBVQ0hBUiBwdWNCdWZmZXIpCiB7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUlgsIFJYX0RQQywgREJHX0xWTF9BTEwsICI9PT09PT4iKTsKKwlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUlgsIFJYX0RQQywgREJHX0xWTF9BTEwsICI9PT09PT4iKTsKIAotCWlmKCpwdWNCdWZmZXI9PUxJTktfVVBfQUNLKQotCXsKLQkJc3dpdGNoKCoocHVjQnVmZmVyKzEpKQotCQl7Ci0JCQljYXNlIFBIWV9TWU5DX0FDSElWRUQ6IC8vU1lOQ2VkIFVQCi0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiUEhZX1NZTkNfQUNISVZFRCIpOworCWlmICgqcHVjQnVmZmVyID09IExJTktfVVBfQUNLKSB7CisJCXN3aXRjaCAoKihwdWNCdWZmZXIrMSkpIHsKKwkJY2FzZSBQSFlfU1lOQ19BQ0hJVkVEOiAvKiBTWU5DZWQgVVAgKi8KKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJQSFlfU1lOQ19BQ0hJVkVEIik7CiAKLQkJCQlpZihBZGFwdGVyLT5MaW5rU3RhdHVzID09IExJTktVUF9ET05FKQotCQkJICAgCXsKKwkJCQlpZiAoQWRhcHRlci0+TGlua1N0YXR1cyA9PSBMSU5LVVBfRE9ORSkKIAkJCQkJYmVjZWVtX3Byb3RvY29sX3Jlc2V0KEFkYXB0ZXIpOwotCQkJCX0KIAotCQkJCUFkYXB0ZXItPnVzQmVzdEVmZm9ydFF1ZXVlSW5kZXg9SU5WQUxJRF9RVUVVRV9JTkRFWCA7Ci0JCQkJQWRhcHRlci0+TGlua1N0YXR1cz1QSFlfU1lOQ19BQ0hJVkVEOworCQkJCUFkYXB0ZXItPnVzQmVzdEVmZm9ydFF1ZXVlSW5kZXggPSBJTlZBTElEX1FVRVVFX0lOREVYOworCQkJCUFkYXB0ZXItPkxpbmtTdGF0dXMgPSBQSFlfU1lOQ19BQ0hJVkVEOwogCi0JCQkJaWYoQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcgJiBCQ01fTEVEX1RIUkVBRF9SVU5OSU5HX0FDVElWRUxZKQotCQkJCXsKKwkJCQlpZiAoQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcgJiBCQ01fTEVEX1RIUkVBRF9SVU5OSU5HX0FDVElWRUxZKSB7CiAJCQkJCUFkYXB0ZXItPkRyaXZlclN0YXRlID0gTk9fTkVUV09SS19FTlRSWTsKIAkJCQkJd2FrZV91cCgmQWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50KTsKIAkJCQl9CkBAIC01OTcsMTYxICs1MjksMTQ1IEBACiAJCQkJTGlua01lc3NhZ2UoQWRhcHRlcik7CiAJCQkJYnJlYWs7CiAKLQkJCWNhc2UgTElOS1VQX0RPTkU6Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUlgsIFJYX0RQQywgREJHX0xWTF9BTEwsICJMSU5LVVBfRE9ORSIpOwotCQkJCUFkYXB0ZXItPkxpbmtTdGF0dXM9TElOS1VQX0RPTkU7Ci0JCQkJQWRhcHRlci0+YlBIU0VuYWJsZWQgPSAqKHB1Y0J1ZmZlciszKTsKLSAgICAgICAgICAgICAgIAlBZGFwdGVyLT5iRVRIQ1NFbmFibGVkID0gKihwdWNCdWZmZXIrNCkgJiBFVEhfQ1NfTUFTSzsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJQSFMgU3VwcG9ydCBTdGF0dXMgUmVjZWl2ZWQgSW4gTGlua1VwIEFjayA6ICV4IFxuIixBZGFwdGVyLT5iUEhTRW5hYmxlZCk7Ci0JCQkJaWYoKEZBTFNFID09IEFkYXB0ZXItPmJTaHV0U3RhdHVzKSYmCi0JCQkJCShGQUxTRSA9PSBBZGFwdGVyLT5JZGxlTW9kZSkpCi0JCQkJewotCQkJCQlpZihBZGFwdGVyLT5MRURJbmZvLmxlZF90aHJlYWRfcnVubmluZyAmIEJDTV9MRURfVEhSRUFEX1JVTk5JTkdfQUNUSVZFTFkpCi0JCQkJCXsKLQkJCQkJCUFkYXB0ZXItPkRyaXZlclN0YXRlID0gTk9STUFMX09QRVJBVElPTjsKLQkJCQkJCXdha2VfdXAoJkFkYXB0ZXItPkxFREluZm8ubm90aWZ5X2xlZF9ldmVudCk7Ci0JCQkJCX0KKwkJY2FzZSBMSU5LVVBfRE9ORToKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9SWCwgUlhfRFBDLCBEQkdfTFZMX0FMTCwgIkxJTktVUF9ET05FIik7CisJCQlBZGFwdGVyLT5MaW5rU3RhdHVzID0gTElOS1VQX0RPTkU7CisJCQlBZGFwdGVyLT5iUEhTRW5hYmxlZCA9ICoocHVjQnVmZmVyKzMpOworCQkJQWRhcHRlci0+YkVUSENTRW5hYmxlZCA9ICoocHVjQnVmZmVyKzQpICYgRVRIX0NTX01BU0s7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiUEhTIFN1cHBvcnQgU3RhdHVzIFJlY2VpdmVkIEluIExpbmtVcCBBY2sgOiAleFxuIiwgQWRhcHRlci0+YlBIU0VuYWJsZWQpOworCisJCQlpZiAoKEZBTFNFID09IEFkYXB0ZXItPmJTaHV0U3RhdHVzKSAmJiAoRkFMU0UgPT0gQWRhcHRlci0+SWRsZU1vZGUpKSB7CisJCQkJaWYgKEFkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nICYgQkNNX0xFRF9USFJFQURfUlVOTklOR19BQ1RJVkVMWSkgeworCQkJCQlBZGFwdGVyLT5Ecml2ZXJTdGF0ZSA9IE5PUk1BTF9PUEVSQVRJT047CisJCQkJCXdha2VfdXAoJkFkYXB0ZXItPkxFREluZm8ubm90aWZ5X2xlZF9ldmVudCk7CiAJCQkJfQotCQkJCUxpbmtNZXNzYWdlKEFkYXB0ZXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXQUlUX0ZPUl9TWU5DOgotCi0JCQkJLyoKLQkJCQkgKiBEcml2ZXIgdG8gaWdub3JlIHRoZSBEUkVHX1JFQ0VJVkVECi0JCQkJICogV2lNQVggQXBwbGljYXRpb24gc2hvdWxkIGhhbmRsZSB0aGlzIE1lc3NhZ2UKLQkJCQkgKi8KLQkJCQkvL0FkYXB0ZXItPmxpVGltZVNpbmNlTGFzdE5ldEVudHJ5ID0gMDsKLQkJCQlBZGFwdGVyLT5MaW5rVXBTdGF0dXMgPSAwOwotCQkJCUFkYXB0ZXItPkxpbmtTdGF0dXMgPSAwOwotCQkJCUFkYXB0ZXItPnVzQmVzdEVmZm9ydFF1ZXVlSW5kZXg9SU5WQUxJRF9RVUVVRV9JTkRFWCA7Ci0JCQkJQWRhcHRlci0+YlRyaWVkVG9XYWtlVXBGcm9tbG93UG93ZXJNb2RlID0gRkFMU0U7Ci0JCQkJQWRhcHRlci0+SWRsZU1vZGUgPSBGQUxTRTsKLQkJCQliZWNlZW1fcHJvdG9jb2xfcmVzZXQoQWRhcHRlcik7Ci0KLQkJCQlicmVhazsKLQkJCWNhc2UgTElOS19TSFVURE9XTl9SRVFfRlJPTV9GSVJNV0FSRToKLQkJCWNhc2UgQ09NUExFVEVfV0FLRV9VUF9OT1RJRklDQVRJT05fRlJNX0ZXOgotCQkJewotCQkJCUhhbmRsZVNodXREb3duTW9kZVJlcXVlc3QoQWRhcHRlciwgcHVjQnVmZmVyKTsKIAkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiZGVmYXVsdCBjYXNlOkxpbmtSZXNwb25zZSAleCIsKihwdWNCdWZmZXIrMSkpOwotCQkJCWJyZWFrOworCQkJTGlua01lc3NhZ2UoQWRhcHRlcik7CisJCQlicmVhazsKKworCQljYXNlIFdBSVRfRk9SX1NZTkM6CisJCQkvKgorCQkJICogRHJpdmVyIHRvIGlnbm9yZSB0aGUgRFJFR19SRUNFSVZFRAorCQkJICogV2lNQVggQXBwbGljYXRpb24gc2hvdWxkIGhhbmRsZSB0aGlzIE1lc3NhZ2UKKwkJCSAqLworCQkJLyogQWRhcHRlci0+bGlUaW1lU2luY2VMYXN0TmV0RW50cnkgPSAwOyAqLworCQkJQWRhcHRlci0+TGlua1VwU3RhdHVzID0gMDsKKwkJCUFkYXB0ZXItPkxpbmtTdGF0dXMgPSAwOworCQkJQWRhcHRlci0+dXNCZXN0RWZmb3J0UXVldWVJbmRleCA9IElOVkFMSURfUVVFVUVfSU5ERVg7CisJCQlBZGFwdGVyLT5iVHJpZWRUb1dha2VVcEZyb21sb3dQb3dlck1vZGUgPSBGQUxTRTsKKwkJCUFkYXB0ZXItPklkbGVNb2RlID0gRkFMU0U7CisJCQliZWNlZW1fcHJvdG9jb2xfcmVzZXQoQWRhcHRlcik7CisKKwkJCWJyZWFrOworCQljYXNlIExJTktfU0hVVERPV05fUkVRX0ZST01fRklSTVdBUkU6CisJCWNhc2UgQ09NUExFVEVfV0FLRV9VUF9OT1RJRklDQVRJT05fRlJNX0ZXOgorCQl7CisJCQlIYW5kbGVTaHV0RG93bk1vZGVSZXF1ZXN0KEFkYXB0ZXIsIHB1Y0J1ZmZlcik7CiAJCX0KLQl9Ci0JZWxzZSBpZihTRVRfTUFDX0FERFJFU1NfUkVTUE9OU0U9PSpwdWNCdWZmZXIpCi0JeworCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJkZWZhdWx0IGNhc2U6TGlua1Jlc3BvbnNlICV4IiwgKihwdWNCdWZmZXIgKyAxKSk7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSBpZiAoU0VUX01BQ19BRERSRVNTX1JFU1BPTlNFID09ICpwdWNCdWZmZXIpIHsKIAkJUFVDSEFSIHB1TWFjQWRkciA9IChwdWNCdWZmZXIgKyAxKTsKLQkJQWRhcHRlci0+TGlua1N0YXR1cz1TWU5DX1VQX1JFUVVFU1Q7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1JYLCBSWF9EUEMsIERCR19MVkxfQUxMLCAiTUFDIGFkZHJlc3MgcmVzcG9uc2UsIHNlbmRpbmcgU1lOQ19VUCIpOworCQlBZGFwdGVyLT5MaW5rU3RhdHVzID0gU1lOQ19VUF9SRVFVRVNUOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUlgsIFJYX0RQQywgREJHX0xWTF9BTEwsICJNQUMgYWRkcmVzcyByZXNwb25zZSwgc2VuZGluZyBTWU5DX1VQIik7CiAJCUxpbmtNZXNzYWdlKEFkYXB0ZXIpOwogCQltZW1jcHkoQWRhcHRlci0+ZGV2LT5kZXZfYWRkciwgcHVNYWNBZGRyLCBNQUNfQUREUkVTU19TSVpFKTsKIAl9Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUlgsIFJYX0RQQywgREJHX0xWTF9BTEwsICIlcyA8PT09PT0iLF9fRlVOQ1RJT05fXyk7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1JYLCBSWF9EUEMsIERCR19MVkxfQUxMLCAiJXMgPD09PT09IiwgX19mdW5jX18pOwogCXJldHVybjsKIH0KIAogdm9pZCBTZW5kSWRsZU1vZGVSZXNwb25zZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7Ci0JSU5UIHN0YXR1cyA9IDAsIE5WTUFjY2VzcyA9IDAsbG93UHdyQWJvcnRNc2cgPSAwOworCUlOVCBzdGF0dXMgPSAwLCBOVk1BY2Nlc3MgPSAwLCBsb3dQd3JBYm9ydE1zZyA9IDA7CiAJc3RydWN0IHRpbWV2YWwgdHY7Ci0JQ09OVFJPTF9NRVNTQUdFCQlzdElkbGVSZXNwb25zZSA9IHt7MH19OworCUNPTlRST0xfTUVTU0FHRSBzdElkbGVSZXNwb25zZSA9IHt7MH0gfTsKIAltZW1zZXQoJnR2LCAwLCBzaXplb2YodHYpKTsKLQlzdElkbGVSZXNwb25zZS5MZWFkZXIuU3RhdHVzICA9IElETEVfTUVTU0FHRTsKKwlzdElkbGVSZXNwb25zZS5MZWFkZXIuU3RhdHVzID0gSURMRV9NRVNTQUdFOwogCXN0SWRsZVJlc3BvbnNlLkxlYWRlci5QTGVuZ3RoID0gSURMRV9NT0RFX1BBWUxPQURfTEVOR1RIOwogCXN0SWRsZVJlc3BvbnNlLnN6RGF0YVswXSA9IEdPX1RPX0lETEVfTU9ERV9QQVlMT0FEOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1JYLCBSWF9EUEMsIERCR19MVkxfQUxMLCIgPT09PT09PT09PT09PiIpOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9SWCwgUlhfRFBDLCBEQkdfTFZMX0FMTCwgIiA9PT09PT09PT09PT0+Iik7CiAKIAkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JKipkb3duX3RyeWxvY2sgLQotCSoqIGlmIFsgc2VtYXBob3JlIGlzIGF2YWlsYWJsZSBdCi0JKioJCSBhY3F1aXJlIHNlbWFwaG9uZSBhbmQgcmV0dXJuIHZhbHVlIDAgOwotCSoqICAgZWxzZQotCSoqCQkgcmV0dXJuIG5vbi16ZXJvIHZhbHVlIDsKLQkqKgotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCSAqZG93bl90cnlsb2NrIC0KKwkgKiBpZiBbIHNlbWFwaG9yZSBpcyBhdmFpbGFibGUgXQorCSAqCQkgYWNxdWlyZSBzZW1hcGhvbmUgYW5kIHJldHVybiB2YWx1ZSAwIDsKKwkgKiAgIGVsc2UKKwkgKgkJIHJldHVybiBub24temVybyB2YWx1ZSA7CisJICoKKwkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAlOVk1BY2Nlc3MgPSBkb3duX3RyeWxvY2soJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwotCi0JbG93UHdyQWJvcnRNc2c9IGRvd25fdHJ5bG9jaygmQWRhcHRlci0+TG93UG93ZXJNb2RlU3luYyk7CisJbG93UHdyQWJvcnRNc2cgPSBkb3duX3RyeWxvY2soJkFkYXB0ZXItPkxvd1Bvd2VyTW9kZVN5bmMpOwogCiAKLQlpZigoTlZNQWNjZXNzIHx8IGxvd1B3ckFib3J0TXNnIHx8IGF0b21pY19yZWFkKCZBZGFwdGVyLT5Ub3RhbFBhY2tldENvdW50KSkgJiYKLQkJICAoQWRhcHRlci0+dWxQb3dlclNhdmVNb2RlICE9IERFVklDRV9QT1dFUlNBVkVfTU9ERV9BU19QUk9UT0NPTF9JRExFX01PREUpICApCi0JewotCQlpZighTlZNQWNjZXNzKQorCWlmICgoTlZNQWNjZXNzIHx8IGxvd1B3ckFib3J0TXNnIHx8IGF0b21pY19yZWFkKCZBZGFwdGVyLT5Ub3RhbFBhY2tldENvdW50KSkgJiYKKwkJKEFkYXB0ZXItPnVsUG93ZXJTYXZlTW9kZSAhPSBERVZJQ0VfUE9XRVJTQVZFX01PREVfQVNfUFJPVE9DT0xfSURMRV9NT0RFKSkgeworCisJCWlmICghTlZNQWNjZXNzKQogCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwogCi0JCWlmKCFsb3dQd3JBYm9ydE1zZykKKwkJaWYgKCFsb3dQd3JBYm9ydE1zZykKIAkJCXVwKCZBZGFwdGVyLT5Mb3dQb3dlck1vZGVTeW5jKTsKIAotCQlzdElkbGVSZXNwb25zZS5zekRhdGFbMV0gPSBUQVJHRVRfQ0FOX05PVF9HT19UT19JRExFX01PREU7Ly9OQUNLLSBkZXZpY2UgYWNjZXNzIGlzIGdvaW5nIG9uLgotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9SWCwgUlhfRFBDLCBEQkdfTFZMX0FMTCwgIkhPU1QgSVMgTkFDS0lORyBJZGxlIG1vZGUgVG8gRi9XISEhISEhISEiKTsKKwkJc3RJZGxlUmVzcG9uc2Uuc3pEYXRhWzFdID0gVEFSR0VUX0NBTl9OT1RfR09fVE9fSURMRV9NT0RFOyAvKiBOQUNLLSBkZXZpY2UgYWNjZXNzIGlzIGdvaW5nIG9uLiAqLworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUlgsIFJYX0RQQywgREJHX0xWTF9BTEwsICJIT1NUIElTIE5BQ0tJTkcgSWRsZSBtb2RlIFRvIEYvVyEhISEhISEhIik7CiAJCUFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPSBGQUxTRTsKLQl9Ci0JZWxzZQotCXsKLQkJc3RJZGxlUmVzcG9uc2Uuc3pEYXRhWzFdID0gVEFSR0VUX0NBTl9HT19UT19JRExFX01PREU7IC8vMjsvL0lkbGUgQUNLCisJfSBlbHNlIHsKKwkJc3RJZGxlUmVzcG9uc2Uuc3pEYXRhWzFdID0gVEFSR0VUX0NBTl9HT19UT19JRExFX01PREU7IC8qIDI7IElkbGUgQUNLICovCiAJCUFkYXB0ZXItPlN0YXRpc3RpY3NQb2ludGVyID0gMDsKIAogCQkvKiBXYWl0IGZvciB0aGUgTEVEIHRvIFRVUk4gT0ZGIGJlZm9yZSBzZW5kaW5nIEFDSyByZXNwb25zZSAqLwotCQlpZihBZGFwdGVyLT5MRURJbmZvLmxlZF90aHJlYWRfcnVubmluZyAmIEJDTV9MRURfVEhSRUFEX1JVTk5JTkdfQUNUSVZFTFkpCi0JCXsKKwkJaWYgKEFkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nICYgQkNNX0xFRF9USFJFQURfUlVOTklOR19BQ1RJVkVMWSkgewogCQkJSU5UIGlSZXRWYWwgPSAwOwogCiAJCQkvKiBXYWtlIHRoZSBMRUQgVGhyZWFkIHdpdGggSURMRU1PREVfRU5URVIgU3RhdGUgKi8KIAkJCUFkYXB0ZXItPkRyaXZlclN0YXRlID0gTE9XUE9XRVJfTU9ERV9FTlRFUjsKLQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1JYLCBSWF9EUEMsIERCR19MVkxfQUxMLCJMRUQgVGhyZWFkIGlzIFJ1bm5pbmcuLkhlbmNlIFNldHRpbmcgTEVEIEV2ZW50IGFzIElETEVNT0RFX0VOVEVSIGppZmZpZXM6JWxkIixqaWZmaWVzKTsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9SWCwgUlhfRFBDLCBEQkdfTFZMX0FMTCwgIkxFRCBUaHJlYWQgaXMgUnVubmluZy4uSGVuY2UgU2V0dGluZyBMRUQgRXZlbnQgYXMgSURMRU1PREVfRU5URVIgamlmZmllczolbGQiLCBqaWZmaWVzKTsKIAkJCXdha2VfdXAoJkFkYXB0ZXItPkxFREluZm8ubm90aWZ5X2xlZF9ldmVudCk7CiAKIAkJCS8qIFdhaXQgZm9yIDEgU0VDIGZvciBMRUQgdG8gT0ZGICovCi0JCQlpUmV0VmFsID0gd2FpdF9ldmVudF90aW1lb3V0KEFkYXB0ZXItPkxFREluZm8uaWRsZU1vZGVTeW5jRXZlbnQsIFwKLQkJCQlBZGFwdGVyLT5MRURJbmZvLmJJZGxlX2xlZF9vZmYsIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOwotCisJCQlpUmV0VmFsID0gd2FpdF9ldmVudF90aW1lb3V0KEFkYXB0ZXItPkxFREluZm8uaWRsZU1vZGVTeW5jRXZlbnQsIEFkYXB0ZXItPkxFREluZm8uYklkbGVfbGVkX29mZiwgbXNlY3NfdG9famlmZmllcygxMDAwKSk7CiAKIAkJCS8qIElmIFRpbWVkIE91dCB0byBTeW5jIElETEUgTU9ERSBFbnRlciwgZG8gSURMRSBtb2RlIEV4aXQgYW5kIFNlbmQgTkFDSyB0byBkZXZpY2UgKi8KLQkJCWlmKGlSZXRWYWwgPD0gMCkKLQkJCXsKLQkJCQlzdElkbGVSZXNwb25zZS5zekRhdGFbMV0gPSBUQVJHRVRfQ0FOX05PVF9HT19UT19JRExFX01PREU7Ly9OQUNLLSBkZXZpY2UgYWNjZXNzIGlzIGdvaW5nIG9uLgorCQkJaWYgKGlSZXRWYWwgPD0gMCkgeworCQkJCXN0SWRsZVJlc3BvbnNlLnN6RGF0YVsxXSA9IFRBUkdFVF9DQU5fTk9UX0dPX1RPX0lETEVfTU9ERTsgLyogTkFDSy0gZGV2aWNlIGFjY2VzcyBpcyBnb2luZyBvbi4gKi8KIAkJCQlBZGFwdGVyLT5Ecml2ZXJTdGF0ZSA9IE5PUk1BTF9PUEVSQVRJT047CiAJCQkJd2FrZV91cCgmQWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50KTsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9SWCwgUlhfRFBDLCBEQkdfTFZMX0FMTCwgIk5BQ0tJTkcgSWRsZSBtb2RlIGFzIHRpbWUgb3V0IGhhcHBlbiBmcm9tIExFRCBzaWRlISEhISEhISEiKTsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUlgsIFJYX0RQQywgREJHX0xWTF9BTEwsICJOQUNLSU5HIElkbGUgbW9kZSBhcyB0aW1lIG91dCBoYXBwZW4gZnJvbSBMRUQgc2lkZSEhISEhISEhIik7CiAJCQl9CiAJCX0KLQkJaWYoc3RJZGxlUmVzcG9uc2Uuc3pEYXRhWzFdID09IFRBUkdFVF9DQU5fR09fVE9fSURMRV9NT0RFKQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9SWCwgUlhfRFBDLCBEQkdfTFZMX0FMTCwiQUNLSU5HIElETEUgTU9ERSAhISEhISEhISEiKTsKKworCQlpZiAoc3RJZGxlUmVzcG9uc2Uuc3pEYXRhWzFdID09IFRBUkdFVF9DQU5fR09fVE9fSURMRV9NT0RFKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUlgsIFJYX0RQQywgREJHX0xWTF9BTEwsICJBQ0tJTkcgSURMRSBNT0RFICEhISEhISEhISIpOwogCQkJZG93bigmQWRhcHRlci0+cmRtd3Jtc3luYyk7CiAJCQlBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID0gVFJVRTsKIAkJCXVwKCZBZGFwdGVyLT5yZG13cm1zeW5jKTsKLQkJCS8vS2lsbGluZyBhbGwgVVJCUy4KLQkJCWlmKEFkYXB0ZXItPmJEb1N1c3BlbmQgPT0gVFJVRSkKKwkJCS8qIEtpbGxpbmcgYWxsIFVSQlMuICovCisJCQlpZiAoQWRhcHRlci0+YkRvU3VzcGVuZCA9PSBUUlVFKQogCQkJCUJjbV9raWxsX2FsbF9VUkJzKChQU19JTlRFUkZBQ0VfQURBUFRFUikoQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyKSk7Ci0KLQkJfQotCQllbHNlCi0JCXsKKwkJfSBlbHNlIHsKIAkJCUFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPSBGQUxTRTsKIAkJfQogCi0JCWlmKCFOVk1BY2Nlc3MpCisJCWlmICghTlZNQWNjZXNzKQogCQkJdXAoJkFkYXB0ZXItPk5WTVJkbVdybUxvY2spOwogCi0JCWlmKCFsb3dQd3JBYm9ydE1zZykKKwkJaWYgKCFsb3dQd3JBYm9ydE1zZykKIAkJCXVwKCZBZGFwdGVyLT5Mb3dQb3dlck1vZGVTeW5jKTsKLQogCX0KLQlzdGF0dXMgPSBDb3B5QnVmZmVyVG9Db250cm9sUGFja2V0KEFkYXB0ZXIsJnN0SWRsZVJlc3BvbnNlKTsKLQlpZigoc3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiZmFpbCB0byBzZW5kIHRoZSBJZGxlIG1vZGUgUmVxdWVzdCBcbiIpOworCisJc3RhdHVzID0gQ29weUJ1ZmZlclRvQ29udHJvbFBhY2tldChBZGFwdGVyLCAmc3RJZGxlUmVzcG9uc2UpOworCWlmICgoc3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiZmFpbCB0byBzZW5kIHRoZSBJZGxlIG1vZGUgUmVxdWVzdFxuIik7CiAJCUFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPSBGQUxTRTsKIAkJU3RhcnRJbnRlcnJ1cHRVcmIoKFBTX0lOVEVSRkFDRV9BREFQVEVSKShBZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXIpKTsKIAl9CiAJZG9fZ2V0dGltZW9mZGF5KCZ0dik7Ci0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUlgsIFJYX0RQQywgREJHX0xWTF9BTEwsICJJZGxlTW9kZSBNc2cgc3VibWl0dGVyIHRvIFEgOiVsZCBtcyIsIHR2LnR2X3NlYyAqMTAwMCArIHR2LnR2X3VzZWMgLzEwMDApOwotCisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1JYLCBSWF9EUEMsIERCR19MVkxfQUxMLCAiSWRsZU1vZGUgTXNnIHN1Ym1pdHRlciB0byBRIDolbGQgbXMiLCB0di50dl9zZWMgKiAxMDAwICsgdHYudHZfdXNlYyAvIDEwMDApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC03NjUsMzA3ICs2ODEsMjY0IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogVk9JRCBEdW1wUGFja0luZm8oUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewotCi0gICAgVUlOVCB1aUxvb3BJbmRleCA9IDA7CisJVUlOVCB1aUxvb3BJbmRleCA9IDA7CiAJVUlOVCB1aUluZGV4ID0gMDsKIAlVSU5UIHVpQ2xzZnJJbmRleCA9IDA7CiAJU19DTEFTU0lGSUVSX1JVTEUgKnBzdENsYXNzaWZpZXJFbnRyeSA9IE5VTEw7CiAKLQlmb3IodWlMb29wSW5kZXg9MDt1aUxvb3BJbmRleDxOT19PRl9RVUVVRVM7dWlMb29wSW5kZXgrKykKLQl7Ci0JCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCIqKioqKioqKioqKiBTaG93aW5nIERldGFpbHMgT2YgUXVldWUgJWQqKioqKiAqKioqKioiLHVpTG9vcEluZGV4KTsKLQkJaWYoRkFMU0UgPT0gQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLmJWYWxpZCkKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsImJWYWxpZCBpcyBGQUxTRSBmb3IgJVggaW5kZXhcbiIsdWlMb29wSW5kZXgpOworCWZvciAodWlMb29wSW5kZXggPSAwOyB1aUxvb3BJbmRleCA8IE5PX09GX1FVRVVFUzsgdWlMb29wSW5kZXgrKykgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiKioqKioqKioqKiogU2hvd2luZyBEZXRhaWxzIE9mIFF1ZXVlICVkKioqKiogKioqKioqIiwgdWlMb29wSW5kZXgpOworCQlpZiAoRkFMU0UgPT0gQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLmJWYWxpZCkgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgImJWYWxpZCBpcyBGQUxTRSBmb3IgJVggaW5kZXhcbiIsIHVpTG9vcEluZGV4KTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsIglEdW1waW5nCVNGIFJ1bGUgRW50cnkgRm9yIFNGSUQgJWxYIFxuIixBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWxTRklEKTsKLQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsIgl1Y0RpcmVjdGlvbiAlWCBcbiIsQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVjRGlyZWN0aW9uKTsKLQkJaWYoQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVjSXBWZXJzaW9uID09IElQVjYpCi0JCXsKLQkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCJJcHY2IFNlcnZpY2UgRmxvdyBcbiIpOwotCQl9CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICIgRHVtcGluZwlTRiBSdWxlIEVudHJ5IEZvciBTRklEICVsWFxuIiwgQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVsU0ZJRCk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICIgdWNEaXJlY3Rpb24gJVhcbiIsIEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51Y0RpcmVjdGlvbik7CisKKwkJaWYgKEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51Y0lwVmVyc2lvbiA9PSBJUFY2KQorCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIklwdjYgU2VydmljZSBGbG93XG4iKTsKIAkJZWxzZQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwiSXB2NCBTZXJ2aWNlIEZsb3cgXG4iKTsKLQkJfQotCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwiCVNGIFRyYWZmaWMgUHJpb3JpdHkgJVggXG4iLEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51OFRyYWZmaWNQcmlvcml0eSk7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiSXB2NCBTZXJ2aWNlIEZsb3dcbiIpOwogCi0JCWZvcih1aUNsc2ZySW5kZXg9MDt1aUNsc2ZySW5kZXg8TUFYX0NMQVNTSUZJRVJTO3VpQ2xzZnJJbmRleCsrKQotCQl7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJTRiBUcmFmZmljIFByaW9yaXR5ICVYXG4iLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udThUcmFmZmljUHJpb3JpdHkpOworCisJCWZvciAodWlDbHNmckluZGV4ID0gMDsgdWlDbHNmckluZGV4IDwgTUFYX0NMQVNTSUZJRVJTOyB1aUNsc2ZySW5kZXgrKykgewogCQkJcHN0Q2xhc3NpZmllckVudHJ5ID0gJkFkYXB0ZXItPmFzdENsYXNzaWZpZXJUYWJsZVt1aUNsc2ZySW5kZXhdOwotCQkJaWYoIXBzdENsYXNzaWZpZXJFbnRyeS0+YlVzZWQpCisJCQlpZiAoIXBzdENsYXNzaWZpZXJFbnRyeS0+YlVzZWQpCiAJCQkJY29udGludWU7CiAKLQkJCWlmKHBzdENsYXNzaWZpZXJFbnRyeS0+dWxTRklEICE9IEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51bFNGSUQpCisJCQlpZiAocHN0Q2xhc3NpZmllckVudHJ5LT51bFNGSUQgIT0gQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVsU0ZJRCkKIAkJCQljb250aW51ZTsKIAotCQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsIlx0RHVtcGluZyBDbGFzc2lmaWVyIFJ1bGUgRW50cnkgRm9yIEluZGV4OiAlWCBDbGFzc2lmaWVyIFJ1bGUgSUQgOiAlWFxuIix1aUNsc2ZySW5kZXgscHN0Q2xhc3NpZmllckVudHJ5LT51aUNsYXNzaWZpZXJSdWxlSW5kZXgpOwotCQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsIlx0RHVtcGluZyBDbGFzc2lmaWVyIFJ1bGUgRW50cnkgRm9yIEluZGV4OiAlWCB1c1ZDSURfVmFsdWUgOiAlWFxuIix1aUNsc2ZySW5kZXgscHN0Q2xhc3NpZmllckVudHJ5LT51c1ZDSURfVmFsdWUpOwotCQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsIlx0RHVtcGluZyBDbGFzc2lmaWVyIFJ1bGUgRW50cnkgRm9yIEluZGV4OiAlWCBiUHJvdG9jb2xWYWxpZCA6ICVYXG4iLHVpQ2xzZnJJbmRleCxwc3RDbGFzc2lmaWVyRW50cnktPmJQcm90b2NvbFZhbGlkKTsKLQkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCJcdER1bXBpbmcJQ2xhc3NpZmllciBSdWxlIEVudHJ5IEZvciBJbmRleDogJVggYlRPU1ZhbGlkIDogJVhcbiIsdWlDbHNmckluZGV4LHBzdENsYXNzaWZpZXJFbnRyeS0+YlRPU1ZhbGlkKTsKLQkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCJcdER1bXBpbmcJQ2xhc3NpZmllciBSdWxlIEVudHJ5IEZvciBJbmRleDogJVggYkRlc3RJcFZhbGlkIDogJVhcbiIsdWlDbHNmckluZGV4LHBzdENsYXNzaWZpZXJFbnRyeS0+YkRlc3RJcFZhbGlkKTsKLQkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCJcdER1bXBpbmcJQ2xhc3NpZmllciBSdWxlIEVudHJ5IEZvciBJbmRleDogJVggYlNyY0lwVmFsaWQgOiAlWFxuIix1aUNsc2ZySW5kZXgscHN0Q2xhc3NpZmllckVudHJ5LT5iU3JjSXBWYWxpZCk7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiXHREdW1waW5nIENsYXNzaWZpZXIgUnVsZSBFbnRyeSBGb3IgSW5kZXg6ICVYIENsYXNzaWZpZXIgUnVsZSBJRCA6ICVYXG4iLCB1aUNsc2ZySW5kZXgsIHBzdENsYXNzaWZpZXJFbnRyeS0+dWlDbGFzc2lmaWVyUnVsZUluZGV4KTsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJcdER1bXBpbmcgQ2xhc3NpZmllciBSdWxlIEVudHJ5IEZvciBJbmRleDogJVggdXNWQ0lEX1ZhbHVlIDogJVhcbiIsIHVpQ2xzZnJJbmRleCwgcHN0Q2xhc3NpZmllckVudHJ5LT51c1ZDSURfVmFsdWUpOworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIlx0RHVtcGluZyBDbGFzc2lmaWVyIFJ1bGUgRW50cnkgRm9yIEluZGV4OiAlWCBiUHJvdG9jb2xWYWxpZCA6ICVYXG4iLCB1aUNsc2ZySW5kZXgsIHBzdENsYXNzaWZpZXJFbnRyeS0+YlByb3RvY29sVmFsaWQpOworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIlx0RHVtcGluZyBDbGFzc2lmaWVyIFJ1bGUgRW50cnkgRm9yIEluZGV4OiAlWCBiVE9TVmFsaWQgOiAlWFxuIiwgdWlDbHNmckluZGV4LCBwc3RDbGFzc2lmaWVyRW50cnktPmJUT1NWYWxpZCk7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiXHREdW1waW5nIENsYXNzaWZpZXIgUnVsZSBFbnRyeSBGb3IgSW5kZXg6ICVYIGJEZXN0SXBWYWxpZCA6ICVYXG4iLCB1aUNsc2ZySW5kZXgsIHBzdENsYXNzaWZpZXJFbnRyeS0+YkRlc3RJcFZhbGlkKTsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJcdER1bXBpbmcgQ2xhc3NpZmllciBSdWxlIEVudHJ5IEZvciBJbmRleDogJVggYlNyY0lwVmFsaWQgOiAlWFxuIiwgdWlDbHNmckluZGV4LCBwc3RDbGFzc2lmaWVyRW50cnktPmJTcmNJcFZhbGlkKTsKIAotCi0JCQlmb3IodWlJbmRleD0wO3VpSW5kZXg8TUFYX1BPUlRfUkFOR0U7dWlJbmRleCsrKQotCQkJewotCQkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCJcdHVzU3JjUG9ydFJhbmdlTG86JVhcbiIscHN0Q2xhc3NpZmllckVudHJ5LT51c1NyY1BvcnRSYW5nZUxvW3VpSW5kZXhdKTsKLQkJCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwiXHR1c1NyY1BvcnRSYW5nZUhpOiVYXG4iLHBzdENsYXNzaWZpZXJFbnRyeS0+dXNTcmNQb3J0UmFuZ2VIaVt1aUluZGV4XSk7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsIlx0dXNEZXN0UG9ydFJhbmdlTG86JVhcbiIscHN0Q2xhc3NpZmllckVudHJ5LT51c0Rlc3RQb3J0UmFuZ2VMb1t1aUluZGV4XSk7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsIlx0dXNEZXN0UG9ydFJhbmdlSGk6JVhcbiIscHN0Q2xhc3NpZmllckVudHJ5LT51c0Rlc3RQb3J0UmFuZ2VIaVt1aUluZGV4XSk7CisJCQlmb3IgKHVpSW5kZXggPSAwOyB1aUluZGV4IDwgTUFYX1BPUlRfUkFOR0U7IHVpSW5kZXgrKykgeworCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJcdHVzU3JjUG9ydFJhbmdlTG86JVhcbiIsIHBzdENsYXNzaWZpZXJFbnRyeS0+dXNTcmNQb3J0UmFuZ2VMb1t1aUluZGV4XSk7CisJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIlx0dXNTcmNQb3J0UmFuZ2VIaTolWFxuIiwgcHN0Q2xhc3NpZmllckVudHJ5LT51c1NyY1BvcnRSYW5nZUhpW3VpSW5kZXhdKTsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiXHR1c0Rlc3RQb3J0UmFuZ2VMbzolWFxuIiwgcHN0Q2xhc3NpZmllckVudHJ5LT51c0Rlc3RQb3J0UmFuZ2VMb1t1aUluZGV4XSk7CisJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIlx0dXNEZXN0UG9ydFJhbmdlSGk6JVhcbiIsIHBzdENsYXNzaWZpZXJFbnRyeS0+dXNEZXN0UG9ydFJhbmdlSGlbdWlJbmRleF0pOwogCQkJfQogCi0JCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwiIFx0dWNJUFNvdXJjZUFkZHJlc3NMZW5ndGggOiAweCV4XG4iLHBzdENsYXNzaWZpZXJFbnRyeS0+dWNJUFNvdXJjZUFkZHJlc3NMZW5ndGgpOwotCQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsIlx0dWNJUERlc3RpbmF0aW9uQWRkcmVzc0xlbmd0aCA6IDB4JXhcbiIscHN0Q2xhc3NpZmllckVudHJ5LT51Y0lQRGVzdGluYXRpb25BZGRyZXNzTGVuZ3RoKTsKLQkJCWZvcih1aUluZGV4PTA7dWlJbmRleDxwc3RDbGFzc2lmaWVyRW50cnktPnVjSVBTb3VyY2VBZGRyZXNzTGVuZ3RoO3VpSW5kZXgrKykKLQkJCXsKLQkJCQlpZihBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWNJcFZlcnNpb24gPT0gSVBWNikKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCJcdElwdjYgdWxTcmNJcEFkZHIgOlxuIik7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiXHR1Y0lQU291cmNlQWRkcmVzc0xlbmd0aCA6IDB4JXhcbiIsIHBzdENsYXNzaWZpZXJFbnRyeS0+dWNJUFNvdXJjZUFkZHJlc3NMZW5ndGgpOworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIlx0dWNJUERlc3RpbmF0aW9uQWRkcmVzc0xlbmd0aCA6IDB4JXhcbiIsIHBzdENsYXNzaWZpZXJFbnRyeS0+dWNJUERlc3RpbmF0aW9uQWRkcmVzc0xlbmd0aCk7CisJCQlmb3IgKHVpSW5kZXggPSAwOyB1aUluZGV4IDwgcHN0Q2xhc3NpZmllckVudHJ5LT51Y0lQU291cmNlQWRkcmVzc0xlbmd0aDsgdWlJbmRleCsrKSB7CisJCQkJaWYgKEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51Y0lwVmVyc2lvbiA9PSBJUFY2KQl7CisJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJcdElwdjYgdWxTcmNJcEFkZHIgOlxuIik7CiAJCQkJCUR1bXBJcHY2QWRkcmVzcyhwc3RDbGFzc2lmaWVyRW50cnktPnN0U3JjSXBBZGRyZXNzLnVsSXB2NkFkZHIpOwotCQkJCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwiXHRJcHY2IHVsU3JjSXBNYXNrIDpcbiIpOworCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiXHRJcHY2IHVsU3JjSXBNYXNrIDpcbiIpOwogCQkJCQlEdW1wSXB2NkFkZHJlc3MocHN0Q2xhc3NpZmllckVudHJ5LT5zdFNyY0lwQWRkcmVzcy51bElwdjZNYXNrKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwiXHR1bFNyY0lwQWRkcjolbFhcbiIscHN0Q2xhc3NpZmllckVudHJ5LT5zdFNyY0lwQWRkcmVzcy51bElwdjRBZGRyW3VpSW5kZXhdKTsKLQkJCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwiXHR1bFNyY0lwTWFzazolbFhcbiIscHN0Q2xhc3NpZmllckVudHJ5LT5zdFNyY0lwQWRkcmVzcy51bElwdjRNYXNrW3VpSW5kZXhdKTsKKwkJCQl9IGVsc2UgeworCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiXHR1bFNyY0lwQWRkcjolbFhcbiIsIHBzdENsYXNzaWZpZXJFbnRyeS0+c3RTcmNJcEFkZHJlc3MudWxJcHY0QWRkclt1aUluZGV4XSk7CisJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJcdHVsU3JjSXBNYXNrOiVsWFxuIiwgcHN0Q2xhc3NpZmllckVudHJ5LT5zdFNyY0lwQWRkcmVzcy51bElwdjRNYXNrW3VpSW5kZXhdKTsKIAkJCQl9CiAJCQl9Ci0JCQlmb3IodWlJbmRleD0wO3VpSW5kZXg8cHN0Q2xhc3NpZmllckVudHJ5LT51Y0lQRGVzdGluYXRpb25BZGRyZXNzTGVuZ3RoO3VpSW5kZXgrKykKLQkJCXsKLQkJCQlpZihBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWNJcFZlcnNpb24gPT0gSVBWNikKLQkJCQl7Ci0JCQkJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCJcdElwdjYgdWxEZXN0SXBBZGRyIDpcbiIpOworCisJCQlmb3IgKHVpSW5kZXggPSAwOyB1aUluZGV4IDwgcHN0Q2xhc3NpZmllckVudHJ5LT51Y0lQRGVzdGluYXRpb25BZGRyZXNzTGVuZ3RoOyB1aUluZGV4KyspIHsKKwkJCQlpZiAoQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVjSXBWZXJzaW9uID09IElQVjYpIHsKKwkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIlx0SXB2NiB1bERlc3RJcEFkZHIgOlxuIik7CiAJCQkJCUR1bXBJcHY2QWRkcmVzcyhwc3RDbGFzc2lmaWVyRW50cnktPnN0RGVzdElwQWRkcmVzcy51bElwdjZBZGRyKTsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsIlx0SXB2NiB1bERlc3RJcE1hc2sgOlxuIik7CisJCQkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJcdElwdjYgdWxEZXN0SXBNYXNrIDpcbiIpOwogCQkJCQlEdW1wSXB2NkFkZHJlc3MocHN0Q2xhc3NpZmllckVudHJ5LT5zdERlc3RJcEFkZHJlc3MudWxJcHY2TWFzayk7Ci0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsIlx0dWxEZXN0SXBBZGRyOiVsWFxuIixwc3RDbGFzc2lmaWVyRW50cnktPnN0RGVzdElwQWRkcmVzcy51bElwdjRBZGRyW3VpSW5kZXhdKTsKLQkJCQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsIlx0dWxEZXN0SXBNYXNrOiVsWFxuIixwc3RDbGFzc2lmaWVyRW50cnktPnN0RGVzdElwQWRkcmVzcy51bElwdjRNYXNrW3VpSW5kZXhdKTsKKwkJCQl9IGVsc2UgeworCQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiXHR1bERlc3RJcEFkZHI6JWxYXG4iLCBwc3RDbGFzc2lmaWVyRW50cnktPnN0RGVzdElwQWRkcmVzcy51bElwdjRBZGRyW3VpSW5kZXhdKTsKKwkJCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIlx0dWxEZXN0SXBNYXNrOiVsWFxuIiwgcHN0Q2xhc3NpZmllckVudHJ5LT5zdERlc3RJcEFkZHJlc3MudWxJcHY0TWFza1t1aUluZGV4XSk7CiAJCQkJfQogCQkJfQotCQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsIlx0dWNQcm90b2NvbDoweCVYXG4iLHBzdENsYXNzaWZpZXJFbnRyeS0+dWNQcm90b2NvbFswXSk7Ci0JCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwiXHR1OENsYXNzaWZpZXJSdWxlUHJpb3JpdHk6JVhcbiIscHN0Q2xhc3NpZmllckVudHJ5LT51OENsYXNzaWZpZXJSdWxlUHJpb3JpdHkpOwotCi0KKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJcdHVjUHJvdG9jb2w6MHglWFxuIiwgcHN0Q2xhc3NpZmllckVudHJ5LT51Y1Byb3RvY29sWzBdKTsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJcdHU4Q2xhc3NpZmllclJ1bGVQcmlvcml0eTolWFxuIiwgcHN0Q2xhc3NpZmllckVudHJ5LT51OENsYXNzaWZpZXJSdWxlUHJpb3JpdHkpOwogCQl9Ci0JCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCJ1bFNGSUQ6JWxYXG4iLEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51bFNGSUQpOwotCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwidXNWQ0lEX1ZhbHVlOiVYXG4iLEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51c1ZDSURfVmFsdWUpOwotCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwiUGhzRW5hYmxlZDogMHglWFxuIixBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0uYkhlYWRlclN1cHByZXNzaW9uRW5hYmxlZCk7Ci0JCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCJ1aVRocmVzaG9sZDolWFxuIixBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlUaHJlc2hvbGQpOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAidWxTRklEOiVsWFxuIiwgQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVsU0ZJRCk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJ1c1ZDSURfVmFsdWU6JVhcbiIsIEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51c1ZDSURfVmFsdWUpOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiUGhzRW5hYmxlZDogMHglWFxuIiwgQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLmJIZWFkZXJTdXBwcmVzc2lvbkVuYWJsZWQpOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAidWlUaHJlc2hvbGQ6JVhcbiIsIEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51aVRocmVzaG9sZCk7CiAKLQotCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwiYlZhbGlkOiVYXG4iLEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS5iVmFsaWQpOwotCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwiYkFjdGl2ZTolWFxuIixBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0uYkFjdGl2ZSk7Ci0JCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCJBY3RpdmF0ZVJlcVNlbnQ6ICV4IiwgQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLmJBY3RpdmF0ZVJlcXVlc3RTZW50KTsKLQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsInU4UXVldWVUeXBlOiVYXG4iLEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51OFF1ZXVlVHlwZSk7Ci0JCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCJ1aU1heEJ1Y2tldFNpemU6JVhcbiIsQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVpTWF4QnVja2V0U2l6ZSk7Ci0JCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCJ1aVBlclNGVHhSZXNvdXJjZUNvdW50OiVYXG4iLGF0b21pY19yZWFkKCZBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlQZXJTRlR4UmVzb3VyY2VDb3VudCkpOwotCQkvL0R1bXBEZWJ1ZyhEVU1QX0lORk8sKCIJCQkJYkNTU3VwcG9ydDolWFxuIixBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0uYkNTU3VwcG9ydCkpOwotCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwiQ3VyclF1ZXVlRGVwdGhPblRhcmdldDogJXhcbiIsIEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51aUN1cnJlbnRRdWV1ZURlcHRoT25UYXJnZXQpOwotCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwidWlDdXJyZW50Qnl0ZXNPbkhvc3Q6JVhcbiIsQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVpQ3VycmVudEJ5dGVzT25Ib3N0KTsKLQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsInVpQ3VycmVudFBhY2tldHNPbkhvc3Q6JVhcbiIsQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVpQ3VycmVudFBhY2tldHNPbkhvc3QpOwotCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwidWlEcm9wcGVkQ291bnRCeXRlczolWFxuIixBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlEcm9wcGVkQ291bnRCeXRlcyk7Ci0JCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCJ1aURyb3BwZWRDb3VudFBhY2tldHM6JVhcbiIsQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVpRHJvcHBlZENvdW50UGFja2V0cyk7Ci0JCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCJ1aVNlbnRCeXRlczolWFxuIixBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlTZW50Qnl0ZXMpOwotCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwidWlTZW50UGFja2V0czolWFxuIixBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlTZW50UGFja2V0cyk7Ci0JCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCJ1aUN1cnJlbnREcmFpblJhdGU6JVhcbiIsQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVpQ3VycmVudERyYWluUmF0ZSk7Ci0JCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCJ1aVRoaXNQZXJpb2RTZW50Qnl0ZXM6JVhcbiIsQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVpVGhpc1BlcmlvZFNlbnRCeXRlcyk7Ci0JCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCJsaURyYWluQ2FsY3VsYXRlZDolbGxYXG4iLEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS5saURyYWluQ2FsY3VsYXRlZCk7Ci0JCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCJ1aUN1cnJlbnRUb2tlbkNvdW50OiVYXG4iLEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51aUN1cnJlbnRUb2tlbkNvdW50KTsKLQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsImxpTGFzdFVwZGF0ZVRva2VuQXQ6JWxsWFxuIixBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0ubGlMYXN0VXBkYXRlVG9rZW5BdCk7Ci0JCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCJ1aU1heEFsbG93ZWRSYXRlOiVYXG4iLEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51aU1heEFsbG93ZWRSYXRlKTsKLQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsInVpUGVuZGVkTGFzdDolWFxuIixBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlQZW5kZWRMYXN0KTsKLQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsIk51bU9mUGFja2V0c1NlbnQ6JVhcbiIsQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLk51bU9mUGFja2V0c1NlbnQpOwotCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIkRpcmVjdGlvbjogJXhcbiIsIEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51Y0RpcmVjdGlvbik7Ci0JCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiQ0lEOiAleFxuIiwgQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVzQ0lEKTsKLQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJQcm90b2NvbFZhbGlkOiAleFxuIiwgQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLmJQcm90b2NvbFZhbGlkKTsKLQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJUT1NWYWxpZDogJXhcbiIsIEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS5iVE9TVmFsaWQpOwotCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIkRlc3RJcFZhbGlkOiAleFxuIiwgQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLmJEZXN0SXBWYWxpZCk7Ci0JCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiU3JjSXBWYWxpZDogJXhcbiIsIEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS5iU3JjSXBWYWxpZCk7Ci0JCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiQWN0aXZlU2V0OiAleFxuIiwgQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLmJBY3RpdmVTZXQpOwotCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIkFkbWl0dGVkU2V0OiAleFxuIiwgQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLmJBZG1pdHRlZFNldCk7Ci0JCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiQXV0aHpTZXQ6ICV4XG4iLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0uYkF1dGhvcml6ZWRTZXQpOwotCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIkNsYXNzaWZ5UHJvcml0eTogJXhcbiIsIEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS5iQ2xhc3NpZmllclByaW9yaXR5KTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAidWlNYXhMYXRlbmN5OiAleFxuIixBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlNYXhMYXRlbmN5KTsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiU2VydmljZUNsYXNzTmFtZTogJXggJXggJXggJXhcbiIsQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVjU2VydmljZUNsYXNzTmFtZVswXSxBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWNTZXJ2aWNlQ2xhc3NOYW1lWzFdLEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51Y1NlcnZpY2VDbGFzc05hbWVbMl0sQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVjU2VydmljZUNsYXNzTmFtZVszXSk7Ci0vLwlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgImJIZWFkZXJTdXBwcmVzc2lvbkVuYWJsZWQgOiVYXG4iLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0uYkhlYWRlclN1cHByZXNzaW9uRW5hYmxlZCk7Ci0vLwkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJ1aVRvdGFsVHhCeXRlczolWFxuIiwgQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVpVG90YWxUeEJ5dGVzKTsKLS8vCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgInVpVG90YWxSeEJ5dGVzOiVYXG4iLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlUb3RhbFJ4Qnl0ZXMpOwotLy8JCUR1bXBEZWJ1ZyhEVU1QX0lORk8sKCIJCQkJdWlSYW5PdXRPZlJlc0NvdW50OiVYXG4iLEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51aVJhbk91dE9mUmVzQ291bnQpKTsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgImJWYWxpZDolWFxuIiwgQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLmJWYWxpZCk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJiQWN0aXZlOiVYXG4iLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0uYkFjdGl2ZSk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJBY3RpdmF0ZVJlcVNlbnQ6ICV4IiwgQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLmJBY3RpdmF0ZVJlcXVlc3RTZW50KTsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgInU4UXVldWVUeXBlOiVYXG4iLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udThRdWV1ZVR5cGUpOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAidWlNYXhCdWNrZXRTaXplOiVYXG4iLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlNYXhCdWNrZXRTaXplKTsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgInVpUGVyU0ZUeFJlc291cmNlQ291bnQ6JVhcbiIsIGF0b21pY19yZWFkKCZBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlQZXJTRlR4UmVzb3VyY2VDb3VudCkpOworCQkvKiBEdW1wRGVidWcoRFVNUF9JTkZPLCgiYkNTU3VwcG9ydDolWFxuIixBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0uYkNTU3VwcG9ydCkpOyAqLworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiQ3VyclF1ZXVlRGVwdGhPblRhcmdldDogJXhcbiIsIEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51aUN1cnJlbnRRdWV1ZURlcHRoT25UYXJnZXQpOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAidWlDdXJyZW50Qnl0ZXNPbkhvc3Q6JVhcbiIsIEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51aUN1cnJlbnRCeXRlc09uSG9zdCk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJ1aUN1cnJlbnRQYWNrZXRzT25Ib3N0OiVYXG4iLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlDdXJyZW50UGFja2V0c09uSG9zdCk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJ1aURyb3BwZWRDb3VudEJ5dGVzOiVYXG4iLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlEcm9wcGVkQ291bnRCeXRlcyk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJ1aURyb3BwZWRDb3VudFBhY2tldHM6JVhcbiIsIEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51aURyb3BwZWRDb3VudFBhY2tldHMpOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAidWlTZW50Qnl0ZXM6JVhcbiIsIEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51aVNlbnRCeXRlcyk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJ1aVNlbnRQYWNrZXRzOiVYXG4iLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlTZW50UGFja2V0cyk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJ1aUN1cnJlbnREcmFpblJhdGU6JVhcbiIsIEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51aUN1cnJlbnREcmFpblJhdGUpOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAidWlUaGlzUGVyaW9kU2VudEJ5dGVzOiVYXG4iLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlUaGlzUGVyaW9kU2VudEJ5dGVzKTsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgImxpRHJhaW5DYWxjdWxhdGVkOiVsbFhcbiIsIEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS5saURyYWluQ2FsY3VsYXRlZCk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJ1aUN1cnJlbnRUb2tlbkNvdW50OiVYXG4iLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlDdXJyZW50VG9rZW5Db3VudCk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJsaUxhc3RVcGRhdGVUb2tlbkF0OiVsbFhcbiIsIEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS5saUxhc3RVcGRhdGVUb2tlbkF0KTsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgInVpTWF4QWxsb3dlZFJhdGU6JVhcbiIsIEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51aU1heEFsbG93ZWRSYXRlKTsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgInVpUGVuZGVkTGFzdDolWFxuIiwgQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVpUGVuZGVkTGFzdCk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJOdW1PZlBhY2tldHNTZW50OiVYXG4iLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0uTnVtT2ZQYWNrZXRzU2VudCk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJEaXJlY3Rpb246ICV4XG4iLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWNEaXJlY3Rpb24pOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiQ0lEOiAleFxuIiwgQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLnVzQ0lEKTsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIlByb3RvY29sVmFsaWQ6ICV4XG4iLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0uYlByb3RvY29sVmFsaWQpOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiVE9TVmFsaWQ6ICV4XG4iLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0uYlRPU1ZhbGlkKTsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIkRlc3RJcFZhbGlkOiAleFxuIiwgQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLmJEZXN0SXBWYWxpZCk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJTcmNJcFZhbGlkOiAleFxuIiwgQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLmJTcmNJcFZhbGlkKTsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIkFjdGl2ZVNldDogJXhcbiIsIEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS5iQWN0aXZlU2V0KTsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIkFkbWl0dGVkU2V0OiAleFxuIiwgQWRhcHRlci0+UGFja0luZm9bdWlMb29wSW5kZXhdLmJBZG1pdHRlZFNldCk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJBdXRoelNldDogJXhcbiIsIEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS5iQXV0aG9yaXplZFNldCk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJDbGFzc2lmeVByb3JpdHk6ICV4XG4iLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0uYkNsYXNzaWZpZXJQcmlvcml0eSk7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJ1aU1heExhdGVuY3k6ICV4XG4iLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlNYXhMYXRlbmN5KTsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIlNlcnZpY2VDbGFzc05hbWU6ICV4ICV4ICV4ICV4XG4iLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWNTZXJ2aWNlQ2xhc3NOYW1lWzBdLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWNTZXJ2aWNlQ2xhc3NOYW1lWzFdLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWNTZXJ2aWNlQ2xhc3NOYW1lWzJdLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWNTZXJ2aWNlQ2xhc3NOYW1lWzNdKTsKKy8qIEJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAiYkhlYWRlclN1cHByZXNzaW9uRW5hYmxlZCA6JVhcbiIsIEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS5iSGVhZGVyU3VwcHJlc3Npb25FbmFibGVkKTsKKyAqIEJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBEVU1QX0lORk8sIERCR19MVkxfQUxMLCAidWlUb3RhbFR4Qnl0ZXM6JVhcbiIsIEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51aVRvdGFsVHhCeXRlcyk7CisgKiBCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgInVpVG90YWxSeEJ5dGVzOiVYXG4iLCBBZGFwdGVyLT5QYWNrSW5mb1t1aUxvb3BJbmRleF0udWlUb3RhbFJ4Qnl0ZXMpOworICoJCUR1bXBEZWJ1ZyhEVU1QX0lORk8sKCIJCQkJdWlSYW5PdXRPZlJlc0NvdW50OiVYXG4iLEFkYXB0ZXItPlBhY2tJbmZvW3VpTG9vcEluZGV4XS51aVJhbk91dE9mUmVzQ291bnQpKTsKKyAqLwogCX0KIAotCWZvcih1aUxvb3BJbmRleCA9IDAgOyB1aUxvb3BJbmRleCA8IE1JQlNfTUFYX0hJU1RfRU5UUklFUyA7IHVpTG9vcEluZGV4KyspCi0JCQlCQ01fREVCVUdfUFJJTlQgKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwiQWRhcHRlci0+YVJ4UGt0U2l6ZUhpc3RbJXhdID0gJXhcbiIsdWlMb29wSW5kZXgsQWRhcHRlci0+YVJ4UGt0U2l6ZUhpc3RbdWlMb29wSW5kZXhdKTsKKwlmb3IgKHVpTG9vcEluZGV4ID0gMDsgdWlMb29wSW5kZXggPCBNSUJTX01BWF9ISVNUX0VOVFJJRVM7IHVpTG9vcEluZGV4KyspCisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsICJBZGFwdGVyLT5hUnhQa3RTaXplSGlzdFsleF0gPSAleFxuIiwgdWlMb29wSW5kZXgsIEFkYXB0ZXItPmFSeFBrdFNpemVIaXN0W3VpTG9vcEluZGV4XSk7CiAKLQlmb3IodWlMb29wSW5kZXggPSAwIDsgdWlMb29wSW5kZXggPCBNSUJTX01BWF9ISVNUX0VOVFJJRVMgOyB1aUxvb3BJbmRleCsrKQotCQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIERVTVBfSU5GTywgREJHX0xWTF9BTEwsIkFkYXB0ZXItPmFUeFBrdFNpemVIaXN0WyV4XSA9ICV4XG4iLHVpTG9vcEluZGV4LEFkYXB0ZXItPmFUeFBrdFNpemVIaXN0W3VpTG9vcEluZGV4XSk7Ci0KLQorCWZvciAodWlMb29wSW5kZXggPSAwOyB1aUxvb3BJbmRleCA8IE1JQlNfTUFYX0hJU1RfRU5UUklFUzsgdWlMb29wSW5kZXgrKykKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgRFVNUF9JTkZPLCBEQkdfTFZMX0FMTCwgIkFkYXB0ZXItPmFUeFBrdFNpemVIaXN0WyV4XSA9ICV4XG4iLCB1aUxvb3BJbmRleCwgQWRhcHRlci0+YVR4UGt0U2l6ZUhpc3RbdWlMb29wSW5kZXhdKTsKIAogCXJldHVybjsKLQotCiB9CiAKIGludCByZXNldF9jYXJkX3Byb2MoUE1JTklfQURBUFRFUiBwc19hZGFwdGVyKQogewogCWludCByZXR2YWwgPSBTVEFUVVNfU1VDQ0VTUzsKLQotICAgIFBNSU5JX0FEQVBURVIgQWRhcHRlciA9IEdFVF9CQ01fQURBUFRFUihnYmxwbmV0ZGV2KTsKKwlQTUlOSV9BREFQVEVSIEFkYXB0ZXIgPSBHRVRfQkNNX0FEQVBURVIoZ2JscG5ldGRldik7CiAJUFNfSU5URVJGQUNFX0FEQVBURVIgcHNJbnRmQWRhcHRlciA9IE5VTEw7CiAJdW5zaWduZWQgaW50IHZhbHVlID0gMCwgdWlSZXNldFZhbHVlID0gMDsKIAotCXBzSW50ZkFkYXB0ZXIgPSAoKFBTX0lOVEVSRkFDRV9BREFQVEVSKShwc19hZGFwdGVyLT5wdkludGVyZmFjZUFkYXB0ZXIpKSA7Ci0KKwlwc0ludGZBZGFwdGVyID0gKChQU19JTlRFUkZBQ0VfQURBUFRFUikocHNfYWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyKSk7CiAJcHNfYWRhcHRlci0+YkREUkluaXREb25lID0gRkFMU0U7CiAKLQlpZihwc19hZGFwdGVyLT5jaGlwX2lkID49IFQzTFBCKQotCXsKLQkJLy9TWVNfQ0ZHIHJlZ2lzdGVyIGlzIHdyaXRlIHByb3RlY3RlZCBoZW5jZSBmb3IgbW9kaWZ5aW5nIHRoaXMgcmVnIHZhbHVlLCBpdCBzaG91bGQgYmUgcmVhZCB0d2ljZSBiZWZvcmUKLQkJcmRtYWx0KHBzX2FkYXB0ZXIsU1lTX0NGRywgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLQkJcmRtYWx0KHBzX2FkYXB0ZXIsU1lTX0NGRywgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKKwlpZiAocHNfYWRhcHRlci0+Y2hpcF9pZCA+PSBUM0xQQikgeworCQkvKiBTWVNfQ0ZHIHJlZ2lzdGVyIGlzIHdyaXRlIHByb3RlY3RlZCBoZW5jZSBmb3IgbW9kaWZ5aW5nIHRoaXMgcmVnIHZhbHVlLCBpdCBzaG91bGQgYmUgcmVhZCB0d2ljZSBiZWZvcmUgKi8KKwkJcmRtYWx0KHBzX2FkYXB0ZXIsIFNZU19DRkcsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CisJCXJkbWFsdChwc19hZGFwdGVyLCBTWVNfQ0ZHLCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwogCi0JCS8vbWFraW5nIGJpdFs2Li4uNV0gc2FtZSBhcyB3YXMgYmVmb3JlIGYvdyBkb3dubG9hZC4gdGhpcyBzZXR0aW5nIGZvcmNlIHRoZSBoL3cgdG8KLQkJLy9yZS1wb3B1bGF0ZWQgdGhlIFNQIFJBTSBhcmVhIHdpdGggdGhlIHN0cmluZyBkZXNjcmlwdG9yIC4KLQkJdmFsdWUgPSB2YWx1ZSB8IChwc19hZGFwdGVyLT5zeXNjZmdCZWZGd0RsZCAmIDB4MDAwMDAwNjApIDsKKwkJLyogbWFraW5nIGJpdFs2Li4uNV0gc2FtZSBhcyB3YXMgYmVmb3JlIGYvdyBkb3dubG9hZC4gdGhpcyBzZXR0aW5nIGZvcmNlIHRoZSBoL3cgdG8gKi8KKwkJLyogcmUtcG9wdWxhdGVkIHRoZSBTUCBSQU0gYXJlYSB3aXRoIHRoZSBzdHJpbmcgZGVzY3JpcHRvci4gKi8KKwkJdmFsdWUgPSB2YWx1ZSB8IChwc19hZGFwdGVyLT5zeXNjZmdCZWZGd0RsZCAmIDB4MDAwMDAwNjApOwogCQl3cm1hbHQocHNfYWRhcHRlciwgU1lTX0NGRywgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKIAl9CiAKLQkvL2tpbGxpbmcgYWxsIHN1Ym1pdHRlZCBVUkJzLgotCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+U3RvcEFsbFhhY3Rpb24gPSBUUlVFIDsKKwkvKiBraWxsaW5nIGFsbCBzdWJtaXR0ZWQgVVJCcy4gKi8KKwlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPlN0b3BBbGxYYWN0aW9uID0gVFJVRTsKIAlCY21fa2lsbF9hbGxfVVJCcyhwc0ludGZBZGFwdGVyKTsKIAkvKiBSZXNldCB0aGUgVU1BLUIgRGV2aWNlICovCi0JaWYocHNfYWRhcHRlci0+Y2hpcF9pZCA+PSBUM0xQQikKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgIlJlc2V0aW5nIFVNQS1CIFxuIik7CisJaWYgKHBzX2FkYXB0ZXItPmNoaXBfaWQgPj0gVDNMUEIpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIlJlc2V0aW5nIFVNQS1CXG4iKTsKIAkJcmV0dmFsID0gdXNiX3Jlc2V0X2RldmljZShwc0ludGZBZGFwdGVyLT51ZGV2KTsKKwkJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5TdG9wQWxsWGFjdGlvbiA9IEZBTFNFOwogCi0JCXBzSW50ZkFkYXB0ZXItPnBzQWRhcHRlci0+U3RvcEFsbFhhY3Rpb24gPSBGQUxTRSA7Ci0KLQkJaWYocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJSZXNldCBmYWlsZWQgd2l0aCByZXQgdmFsdWUgOiVkIiwgcmV0dmFsKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIlJlc2V0IGZhaWxlZCB3aXRoIHJldCB2YWx1ZSA6JWQiLCByZXR2YWwpOwogCQkJZ290byBlcnJfZXhpdDsKIAkJfQorCiAJCWlmIChwc19hZGFwdGVyLT5jaGlwX2lkID09IEJDUzIyMF8yIHx8CiAJCQlwc19hZGFwdGVyLT5jaGlwX2lkID09IEJDUzIyMF8yQkMgfHwKIAkJCXBzX2FkYXB0ZXItPmNoaXBfaWQgPT0gQkNTMjUwX0JDIHx8Ci0JCQkJcHNfYWRhcHRlci0+Y2hpcF9pZCA9PSBCQ1MyMjBfMykKLQkJewotCQkJcmV0dmFsID0gcmRtYWx0KHBzX2FkYXB0ZXIsSFBNX0NPTkZJR19MRE8xNDUsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0JCQlpZiggcmV0dmFsIDwgMCkKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsInJlYWQgZmFpbGVkIHdpdGggc3RhdHVzIDolZCIscmV0dmFsKTsKKwkJCXBzX2FkYXB0ZXItPmNoaXBfaWQgPT0gQkNTMjIwXzMpIHsKKworCQkJcmV0dmFsID0gcmRtYWx0KHBzX2FkYXB0ZXIsIEhQTV9DT05GSUdfTERPMTQ1LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOworCQkJaWYgKHJldHZhbCA8IDApIHsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAicmVhZCBmYWlsZWQgd2l0aCBzdGF0dXMgOiVkIiwgcmV0dmFsKTsKIAkJCQlnb3RvIGVycl9leGl0OwogCQkJfQotCQkJLy9zZXR0aW5nIDB0aCBiaXQKKwkJCS8qIHNldHRpbmcgMHRoIGJpdCAqLwogCQkJdmFsdWUgfD0gKDE8PDApOwogCQkJcmV0dmFsID0gd3JtYWx0KHBzX2FkYXB0ZXIsIEhQTV9DT05GSUdfTERPMTQ1LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwotCQkJaWYoIHJldHZhbCA8IDApCi0JCQl7Ci0JCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJ3cml0ZSBmYWlsZWQgd2l0aCBzdGF0dXMgOiVkIixyZXR2YWwpOworCQkJaWYgKHJldHZhbCA8IDApIHsKKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAid3JpdGUgZmFpbGVkIHdpdGggc3RhdHVzIDolZCIsIHJldHZhbCk7CiAJCQkJZ290byBlcnJfZXhpdDsKIAkJCX0KIAkJfQotCi0JfQotCWVsc2UKLQl7Ci0JCXJldHZhbCA9IHJkbWFsdChwc19hZGFwdGVyLDB4MGYwMDcwMTgsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0JCWlmKCByZXR2YWwgPCAwKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsInJlYWQgZmFpbGVkIHdpdGggc3RhdHVzIDolZCIscmV0dmFsKTsKKwl9IGVsc2UgeworCQlyZXR2YWwgPSByZG1hbHQocHNfYWRhcHRlciwgMHgwZjAwNzAxOCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKKwkJaWYgKHJldHZhbCA8IDApIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJyZWFkIGZhaWxlZCB3aXRoIHN0YXR1cyA6JWQiLCByZXR2YWwpOwogCQkJZ290byBlcnJfZXhpdDsKIAkJfQotCQl2YWx1ZSY9KH4oMTw8MTYpKTsKLQkJcmV0dmFsPSB3cm1hbHQocHNfYWRhcHRlciwgMHgwZjAwNzAxOCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKSA7Ci0JCWlmKCByZXR2YWwgPCAwKSB7Ci0JCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIndyaXRlIGZhaWxlZCB3aXRoIHN0YXR1cyA6JWQiLHJldHZhbCk7CisJCXZhbHVlICY9ICh+KDE8PDE2KSk7CisJCXJldHZhbCA9IHdybWFsdChwc19hZGFwdGVyLCAweDBmMDA3MDE4LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIndyaXRlIGZhaWxlZCB3aXRoIHN0YXR1cyA6JWQiLCByZXR2YWwpOwogCQkJZ290byBlcnJfZXhpdDsKIAkJfQogCi0JCS8vIFRvZ2dsaW5nIHRoZSBHUElPIDgsIDkKKwkJLyogVG9nZ2xpbmcgdGhlIEdQSU8gOCwgOSAqLwogCQl2YWx1ZSA9IDA7CiAJCXJldHZhbCA9IHdybWFsdChwc19hZGFwdGVyLCBHUElPX09VVFBVVF9SRUdJU1RFUiwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLQkJaWYocmV0dmFsIDwgMCkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJ3cml0ZSBmYWlsZWQgd2l0aCBzdGF0dXMgOiVkIixyZXR2YWwpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIndyaXRlIGZhaWxlZCB3aXRoIHN0YXR1cyA6JWQiLCByZXR2YWwpOwogCQkJZ290byBlcnJfZXhpdDsKIAkJfQogCQl2YWx1ZSA9IDB4MzAwOwotCQlyZXR2YWwgPSB3cm1hbHQocHNfYWRhcHRlciwgR1BJT19NT0RFX1JFR0lTVEVSLCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpIDsKLQkJaWYocmV0dmFsIDwgMCkgewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCJ3cml0ZSBmYWlsZWQgd2l0aCBzdGF0dXMgOiVkIixyZXR2YWwpOworCQlyZXR2YWwgPSB3cm1hbHQocHNfYWRhcHRlciwgR1BJT19NT0RFX1JFR0lTVEVSLCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIndyaXRlIGZhaWxlZCB3aXRoIHN0YXR1cyA6JWQiLCByZXR2YWwpOwogCQkJZ290byBlcnJfZXhpdDsKIAkJfQogCQltZGVsYXkoNTApOwogCX0KIAotCS8vcHNfYWRhcHRlci0+ZG93bmxvYWRERFIgPSBmYWxzZTsKLQotCWlmKHBzX2FkYXB0ZXItPmJGbGFzaEJvb3QpCi0JewotCQkvL0luIGZsYXNoIGJvb3QgbW9kZSBNSVBTIHN0YXRlIHJlZ2lzdGVyIGhhcyByZXZlcnNlIHBvbGFyaXR5LgotCQkvLyBTbyBqdXN0IG9yIHdpdGggc2V0dGluZyBiaXQgMzAuCi0JCS8vTWFrZSB0aGUgTUlQUyBpbiBSZXNldCBzdGF0ZS4KKwkvKiBwc19hZGFwdGVyLT5kb3dubG9hZEREUiA9IGZhbHNlOyAqLworCWlmIChwc19hZGFwdGVyLT5iRmxhc2hCb290KSB7CisJCS8qIEluIGZsYXNoIGJvb3QgbW9kZSBNSVBTIHN0YXRlIHJlZ2lzdGVyIGhhcyByZXZlcnNlIHBvbGFyaXR5LgorCQkgKiBTbyBqdXN0IG9yIHdpdGggc2V0dGluZyBiaXQgMzAuCisJCSAqIE1ha2UgdGhlIE1JUFMgaW4gUmVzZXQgc3RhdGUuCisJCSAqLwogCQlyZG1hbHQocHNfYWRhcHRlciwgQ0xPQ0tfUkVTRVRfQ05UUkxfUkVHXzEsICZ1aVJlc2V0VmFsdWUsIHNpemVvZih1aVJlc2V0VmFsdWUpKTsKLQotCQl1aVJlc2V0VmFsdWUgfD0oMTw8MzApOworCQl1aVJlc2V0VmFsdWUgfD0gKDE8PDMwKTsKIAkJd3JtYWx0KHBzX2FkYXB0ZXIsIENMT0NLX1JFU0VUX0NOVFJMX1JFR18xLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CiAJfQogCi0JaWYocHNfYWRhcHRlci0+Y2hpcF9pZCA+PSBUM0xQQikKLQl7CisJaWYgKHBzX2FkYXB0ZXItPmNoaXBfaWQgPj0gVDNMUEIpIHsKIAkJdWlSZXNldFZhbHVlID0gMDsKLQkJLy8KLQkJLy8gV0EgZm9yIFNZU0NvbmZpZyBJc3N1ZS4KLQkJLy8gUmVhZCBTWVNDRkcgVHdpY2UgdG8gbWFrZSBpdCB3cml0YWJsZS4KLQkJLy8KKwkJLyoKKwkJICogV0EgZm9yIFNZU0NvbmZpZyBJc3N1ZS4KKwkJICogUmVhZCBTWVNDRkcgVHdpY2UgdG8gbWFrZSBpdCB3cml0YWJsZS4KKwkJICovCiAJCXJkbWFsdChwc19hZGFwdGVyLCBTWVNfQ0ZHLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7Ci0JCWlmKHVpUmVzZXRWYWx1ZSAmICgxPDw0KSkKLQkJeworCQlpZiAodWlSZXNldFZhbHVlICYgKDE8PDQpKSB7CiAJCQl1aVJlc2V0VmFsdWUgPSAwOwotCQkJcmRtYWx0KHBzX2FkYXB0ZXIsIFNZU19DRkcsICZ1aVJlc2V0VmFsdWUsIHNpemVvZih1aVJlc2V0VmFsdWUpKTsvLzJuZCByZWFkIHRvIG1ha2UgaXQgd3JpdGFibGUuCisJCQlyZG1hbHQocHNfYWRhcHRlciwgU1lTX0NGRywgJnVpUmVzZXRWYWx1ZSwgc2l6ZW9mKHVpUmVzZXRWYWx1ZSkpOyAvKiAybmQgcmVhZCB0byBtYWtlIGl0IHdyaXRhYmxlLiAqLwogCQkJdWlSZXNldFZhbHVlICY9ICh+KDE8PDQpKTsKLQkJCXdybWFsdChwc19hZGFwdGVyLFNZU19DRkcsICZ1aVJlc2V0VmFsdWUsIHNpemVvZih1aVJlc2V0VmFsdWUpKTsKKwkJCXdybWFsdChwc19hZGFwdGVyLCBTWVNfQ0ZHLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CiAJCX0KLQogCX0KIAl1aVJlc2V0VmFsdWUgPSAwOwogCXdybWFsdChwc19hZGFwdGVyLCAweDBmMDExODZjLCAmdWlSZXNldFZhbHVlLCBzaXplb2YodWlSZXNldFZhbHVlKSk7CiAKLWVycl9leGl0IDoKLQlwc0ludGZBZGFwdGVyLT5wc0FkYXB0ZXItPlN0b3BBbGxYYWN0aW9uID0gRkFMU0UgOworZXJyX2V4aXQ6CisJcHNJbnRmQWRhcHRlci0+cHNBZGFwdGVyLT5TdG9wQWxsWGFjdGlvbiA9IEZBTFNFOwogCXJldHVybiByZXR2YWw7CiB9CiAKLWludCBydW5fY2FyZF9wcm9jKFBNSU5JX0FEQVBURVIgcHNfYWRhcHRlciApCitpbnQgcnVuX2NhcmRfcHJvYyhQTUlOSV9BREFQVEVSIHBzX2FkYXB0ZXIpCiB7Ci0JdW5zaWduZWQgaW50IHZhbHVlPTA7CisJdW5zaWduZWQgaW50IHZhbHVlID0gMDsKIAl7Ci0KLQkJaWYocmRtYWx0KHBzX2FkYXB0ZXIsIENMT0NLX1JFU0VUX0NOVFJMX1JFR18xLCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpIDwgMCkgewotCQkJQkNNX0RFQlVHX1BSSU5UKHBzX2FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCIlczolZFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisJCWlmIChyZG1hbHQocHNfYWRhcHRlciwgQ0xPQ0tfUkVTRVRfQ05UUkxfUkVHXzEsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSkgPCAwKSB7CisJCQlCQ01fREVCVUdfUFJJTlQocHNfYWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CiAJCX0KIAotCQlpZihwc19hZGFwdGVyLT5iRmxhc2hCb290KQotCQl7Ci0KLQkJCXZhbHVlJj0ofigxPDwzMCkpOwotCQl9CisJCWlmIChwc19hZGFwdGVyLT5iRmxhc2hCb290KQorCQkJdmFsdWUgJj0gKH4oMTw8MzApKTsKIAkJZWxzZQotCQl7Ci0JCQl2YWx1ZSB8PSgxPDwzMCk7Ci0JCX0KKwkJCXZhbHVlIHw9ICgxPDwzMCk7CiAKLQkJaWYod3JtYWx0KHBzX2FkYXB0ZXIsIENMT0NLX1JFU0VUX0NOVFJMX1JFR18xLCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpIDwgMCkgewotCQkJQkNNX0RFQlVHX1BSSU5UKHBzX2FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCIlczolZFxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7CisJCWlmICh3cm1hbHQocHNfYWRhcHRlciwgQ0xPQ0tfUkVTRVRfQ05UUkxfUkVHXzEsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSkgPCAwKSB7CisJCQlCQ01fREVCVUdfUFJJTlQocHNfYWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCQlyZXR1cm4gU1RBVFVTX0ZBSUxVUkU7CiAJCX0KIAl9CkBAIC0xMDc0LDEwNCArOTQ3LDg3IEBACiAKIGludCBJbml0Q2FyZEFuZERvd25sb2FkRmlybXdhcmUoUE1JTklfQURBUFRFUiBwc19hZGFwdGVyKQogewotCiAJaW50IHN0YXR1czsKIAlVSU5UIHZhbHVlID0gMDsKIAkvKgotIAkgKiBDcmVhdGUgdGhlIHRocmVhZHMgZmlyc3QgYW5kIHRoZW4gZG93bmxvYWQgdGhlCi0gCSAqIEZpcm0vRERSIFNldHRpbmdzLi4KLSAJICovCi0KKwkgKiBDcmVhdGUgdGhlIHRocmVhZHMgZmlyc3QgYW5kIHRoZW4gZG93bmxvYWQgdGhlCisJICogRmlybS9ERFIgU2V0dGluZ3MuLgorCSAqLwogCXN0YXR1cyA9IGNyZWF0ZV93b3JrZXJfdGhyZWFkcyhwc19hZGFwdGVyKTsKLQlpZiAoc3RhdHVzPDApCisJaWYgKHN0YXR1cyA8IDApCiAJCXJldHVybiBzdGF0dXM7CiAKLQkvKgotIAkgKiBGb3IgRG93bmxvYWRpbmcgdGhlIEZpcm0sIHBhcnNlIHRoZSBjZmcgZmlsZSBmaXJzdC4KLSAJICovCi0Jc3RhdHVzID0gYmNtX3BhcnNlX3RhcmdldF9wYXJhbXMgKHBzX2FkYXB0ZXIpOwotCWlmKHN0YXR1cyl7CisJc3RhdHVzID0gYmNtX3BhcnNlX3RhcmdldF9wYXJhbXMocHNfYWRhcHRlcik7CisJaWYgKHN0YXR1cykKIAkJcmV0dXJuIHN0YXR1czsKLQl9CiAKLQlpZihwc19hZGFwdGVyLT5jaGlwX2lkID49IFQzTFBCKQotCXsKLQkJcmRtYWx0KHBzX2FkYXB0ZXIsIFNZU19DRkcsICZ2YWx1ZSwgc2l6ZW9mICh2YWx1ZSkpOwotCQlwc19hZGFwdGVyLT5zeXNjZmdCZWZGd0RsZCA9IHZhbHVlIDsKLQkJaWYoKHZhbHVlICYgMHg2MCk9PSAwKQotCQl7CisJaWYgKHBzX2FkYXB0ZXItPmNoaXBfaWQgPj0gVDNMUEIpIHsKKwkJcmRtYWx0KHBzX2FkYXB0ZXIsIFNZU19DRkcsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CisJCXBzX2FkYXB0ZXItPnN5c2NmZ0JlZkZ3RGxkID0gdmFsdWU7CisKKwkJaWYgKCh2YWx1ZSAmIDB4NjApID09IDApCiAJCQlwc19hZGFwdGVyLT5iRmxhc2hCb290ID0gVFJVRTsKLQkJfQogCX0KIAogCXJlc2V0X2NhcmRfcHJvYyhwc19hZGFwdGVyKTsKIAotCS8vSW5pdGlhbGl6aW5nIHRoZSBOVk0uCisJLyogSW5pdGlhbGl6aW5nIHRoZSBOVk0uICovCiAJQmNtSW5pdE5WTShwc19hZGFwdGVyKTsKIAlzdGF0dXMgPSBkZHJfaW5pdChwc19hZGFwdGVyKTsKLQlpZihzdGF0dXMpCi0JeworCWlmIChzdGF0dXMpIHsKIAkJcHJfZXJyKERSVl9OQU1FICJkZHJfaW5pdCBGYWlsZWRcbiIpOwogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAogCS8qIERvd25sb2FkIGNmZyBmaWxlICovCiAJc3RhdHVzID0gYnVmZkRubGRWZXJpZnkocHNfYWRhcHRlciwKLQkJCQkJCQkgKFBVQ0hBUilwc19hZGFwdGVyLT5wc3RhcmdldHBhcmFtcywKLQkJCQkJCQkgc2l6ZW9mKFNUQVJHRVRQQVJBTVMpLAotCQkJCQkJCSBDT05GSUdfQkVHSU5fQUREUik7Ci0JaWYoc3RhdHVzKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKHBzX2FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiRXJyb3IgZG93bmxvYWRpbmcgQ0ZHIGZpbGUiKTsKKwkJCQkoUFVDSEFSKXBzX2FkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLAorCQkJCXNpemVvZihTVEFSR0VUUEFSQU1TKSwKKwkJCQlDT05GSUdfQkVHSU5fQUREUik7CisJaWYgKHN0YXR1cykgeworCQlCQ01fREVCVUdfUFJJTlQocHNfYWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiRXJyb3IgZG93bmxvYWRpbmcgQ0ZHIGZpbGUiKTsKIAkJZ290byBPVVQ7CiAJfQogCi0JaWYocmVnaXN0ZXJfbmV0d29ya2Rldihwc19hZGFwdGVyKSkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc19hZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIlJlZ2lzdGVyIE5ldGRldmljZSBmYWlsZWQuIENsZWFudXAgbmVlZHMgdG8gYmUgcGVyZm9ybWVkLiIpOworCWlmIChyZWdpc3Rlcl9uZXR3b3JrZGV2KHBzX2FkYXB0ZXIpKSB7CisJCUJDTV9ERUJVR19QUklOVChwc19hZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJSZWdpc3RlciBOZXRkZXZpY2UgZmFpbGVkLiBDbGVhbnVwIG5lZWRzIHRvIGJlIHBlcmZvcm1lZC4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JaWYoRkFMU0UgPT0gcHNfYWRhcHRlci0+QXV0b0Zpcm1EbGQpCi0JewotCQlCQ01fREVCVUdfUFJJTlQocHNfYWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJBdXRvRmlybURsZCBEaXNhYmxlZCBpbiBDRkcgRmlsZS4uXG4iKTsKLQkJLy9JZiBBdXRvIGYvdyBkb3dubG9hZCBpcyBkaXNhYmxlLCByZWdpc3RlciB0aGUgY29udHJvbCBpbnRlcmZhY2UsCi0JCS8vcmVnaXN0ZXIgdGhlIGNvbnRyb2wgaW50ZXJmYWNlIGFmdGVyIHRoZSBtYWlsYm94LgotCQlpZihyZWdpc3Rlcl9jb250cm9sX2RldmljZV9pbnRlcmZhY2UocHNfYWRhcHRlcikgPCAwKQotCQl7Ci0JCQlCQ01fREVCVUdfUFJJTlQocHNfYWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJSZWdpc3RlciBDb250cm9sIERldmljZSBmYWlsZWQuIENsZWFudXAgbmVlZHMgdG8gYmUgcGVyZm9ybWVkLiIpOworCWlmIChGQUxTRSA9PSBwc19hZGFwdGVyLT5BdXRvRmlybURsZCkgeworCQlCQ01fREVCVUdfUFJJTlQocHNfYWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiQXV0b0Zpcm1EbGQgRGlzYWJsZWQgaW4gQ0ZHIEZpbGUuLlxuIik7CisJCS8qIElmIEF1dG8gZi93IGRvd25sb2FkIGlzIGRpc2FibGUsIHJlZ2lzdGVyIHRoZSBjb250cm9sIGludGVyZmFjZSwgKi8KKwkJLyogcmVnaXN0ZXIgdGhlIGNvbnRyb2wgaW50ZXJmYWNlIGFmdGVyIHRoZSBtYWlsYm94LiAqLworCQlpZiAocmVnaXN0ZXJfY29udHJvbF9kZXZpY2VfaW50ZXJmYWNlKHBzX2FkYXB0ZXIpIDwgMCkgeworCQkJQkNNX0RFQlVHX1BSSU5UKHBzX2FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIlJlZ2lzdGVyIENvbnRyb2wgRGV2aWNlIGZhaWxlZC4gQ2xlYW51cCBuZWVkcyB0byBiZSBwZXJmb3JtZWQuIik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQotCiAJCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIAl9CiAKIAkvKgotICAgICAqIERvIHRoZSBMRUQgU2V0dGluZ3MgaGVyZS4gSXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBGaXJtd2FyZSBEb3dubG9hZAotICAgICAqIFRocmVhZC4KLSAgICAgKi8KKwkgKiBEbyB0aGUgTEVEIFNldHRpbmdzIGhlcmUuIEl0IHdpbGwgYmUgdXNlZCBieSB0aGUgRmlybXdhcmUgRG93bmxvYWQKKwkgKiBUaHJlYWQuCisJICovCiAKIAkvKgotICAgICAqIDEuIElmIHRoZSBMRUQgU2V0dGluZ3MgZmFpbHMsIGRvIG5vdCBzdG9wIGFuZCBkbyB0aGUgRmlybXdhcmUgZG93bmxvYWQuCi0gICAgICogMi4gVGhpcyBpbml0IHdvdWxkIGhhcHBlbmVkIG9ubHkgaWYgdGhlIGNmZyBmaWxlIGlzIHByZXNlbnQsIGVsc2UKLSAgICAgKiAgICBjYWxsIGZyb20gdGhlIGlvY3RsIGNvbnRleHQuCi0gICAgICovCisJICogMS4gSWYgdGhlIExFRCBTZXR0aW5ncyBmYWlscywgZG8gbm90IHN0b3AgYW5kIGRvIHRoZSBGaXJtd2FyZSBkb3dubG9hZC4KKwkgKiAyLiBUaGlzIGluaXQgd291bGQgaGFwcGVuZWQgb25seSBpZiB0aGUgY2ZnIGZpbGUgaXMgcHJlc2VudCwgZWxzZQorCSAqICAgIGNhbGwgZnJvbSB0aGUgaW9jdGwgY29udGV4dC4KKwkgKi8KIAotCXN0YXR1cyA9IEluaXRMZWRTZXR0aW5ncyAocHNfYWRhcHRlcik7Ci0KLQlpZihzdGF0dXMpCi0JewotCQlCQ01fREVCVUdfUFJJTlQocHNfYWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsIklOSVQgTEVEIEZBSUxFRFxuIik7CisJc3RhdHVzID0gSW5pdExlZFNldHRpbmdzKHBzX2FkYXB0ZXIpOworCWlmIChzdGF0dXMpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKHBzX2FkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIklOSVQgTEVEIEZBSUxFRFxuIik7CiAJCXJldHVybiBzdGF0dXM7CiAJfQotCWlmKHBzX2FkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nICYgQkNNX0xFRF9USFJFQURfUlVOTklOR19BQ1RJVkVMWSkKLQl7CisKKwlpZiAocHNfYWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcgJiBCQ01fTEVEX1RIUkVBRF9SVU5OSU5HX0FDVElWRUxZKSB7CiAJCXBzX2FkYXB0ZXItPkRyaXZlclN0YXRlID0gRFJJVkVSX0lOSVQ7CiAJCXdha2VfdXAoJnBzX2FkYXB0ZXItPkxFREluZm8ubm90aWZ5X2xlZF9ldmVudCk7CiAJfQogCi0JaWYocHNfYWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcgJiBCQ01fTEVEX1RIUkVBRF9SVU5OSU5HX0FDVElWRUxZKQotCXsKKwlpZiAocHNfYWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcgJiBCQ01fTEVEX1RIUkVBRF9SVU5OSU5HX0FDVElWRUxZKSB7CiAJCXBzX2FkYXB0ZXItPkRyaXZlclN0YXRlID0gRldfRE9XTkxPQUQ7CiAJCXdha2VfdXAoJnBzX2FkYXB0ZXItPkxFREluZm8ubm90aWZ5X2xlZF9ldmVudCk7CiAJfQpAQCAtMTE4MCwzNyArMTAzNiwzMiBAQAogCXdybWFsdChwc19hZGFwdGVyLCBFRVBST01fQ0FMX0RBVEFfSU5URVJOQUxfTE9DIC0gNCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKIAl3cm1hbHQocHNfYWRhcHRlciwgRUVQUk9NX0NBTF9EQVRBX0lOVEVSTkFMX0xPQyAtIDgsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CiAKLQlpZihwc19hZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRkxBU0gpCi0JeworCWlmIChwc19hZGFwdGVyLT5lTlZNVHlwZSA9PSBOVk1fRkxBU0gpIHsKIAkJc3RhdHVzID0gUHJvcGFnYXRlQ2FsUGFyYW1zRnJvbUZsYXNoVG9NZW1vcnkocHNfYWRhcHRlcik7Ci0JCWlmKHN0YXR1cykKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKHBzX2FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCIgUHJvcGFnYXRpb24gb2YgQ2FsIHBhcmFtIGZhaWxlZCAuLiIgKTsKKwkJaWYgKHN0YXR1cykgeworCQkJQkNNX0RFQlVHX1BSSU5UKHBzX2FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIlByb3BhZ2F0aW9uIG9mIENhbCBwYXJhbSBmYWlsZWQgLi4iKTsKIAkJCWdvdG8gT1VUOwogCQl9CiAJfQogCiAJLyogRG93bmxvYWQgRmlybWFyZSAqLwotCWlmICgoc3RhdHVzID0gQmNtRmlsZURvd25sb2FkKCBwc19hZGFwdGVyLCBCSU5fRklMRSwgRklSTVdBUkVfQkVHSU5fQUREUikpKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKHBzX2FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiTm8gRmlybXdhcmUgRmlsZSBpcyBwcmVzZW50Li4uIFxuIik7CisJc3RhdHVzID0gQmNtRmlsZURvd25sb2FkKHBzX2FkYXB0ZXIsIEJJTl9GSUxFLCBGSVJNV0FSRV9CRUdJTl9BRERSKTsKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJQkNNX0RFQlVHX1BSSU5UKHBzX2FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIk5vIEZpcm13YXJlIEZpbGUgaXMgcHJlc2VudC4uLlxuIik7CiAJCWdvdG8gT1VUOwogCX0KIAogCXN0YXR1cyA9IHJ1bl9jYXJkX3Byb2MocHNfYWRhcHRlcik7Ci0JaWYoc3RhdHVzKQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UIChwc19hZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgInJ1bl9jYXJkX3Byb2MgRmFpbGVkXG4iKTsKKwlpZiAoc3RhdHVzKSB7CisJCUJDTV9ERUJVR19QUklOVChwc19hZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJydW5fY2FyZF9wcm9jIEZhaWxlZFxuIik7CiAJCWdvdG8gT1VUOwogCX0KIAotCiAJcHNfYWRhcHRlci0+ZndfZG93bmxvYWRfZG9uZSA9IFRSVUU7CiAJbWRlbGF5KDEwKTsKIAogT1VUOgotCWlmKHBzX2FkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nICYgQkNNX0xFRF9USFJFQURfUlVOTklOR19BQ1RJVkVMWSkKLQl7CisJaWYgKHBzX2FkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nICYgQkNNX0xFRF9USFJFQURfUlVOTklOR19BQ1RJVkVMWSkgewogCQlwc19hZGFwdGVyLT5Ecml2ZXJTdGF0ZSA9IEZXX0RPV05MT0FEX0RPTkU7CiAJCXdha2VfdXAoJnBzX2FkYXB0ZXItPkxFREluZm8ubm90aWZ5X2xlZF9ldmVudCk7CiAJfQpAQCAtMTIxOCw0MSArMTA2OSwzOSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLQogc3RhdGljIGludCBiY21fcGFyc2VfdGFyZ2V0X3BhcmFtcyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7Ci0Jc3RydWN0IGZpbGUgCQkqZmxwPU5VTEw7Ci0JbW1fc2VnbWVudF90IAlvbGRmcz17MH07CisJc3RydWN0IGZpbGUgKmZscCA9IE5VTEw7CisJbW1fc2VnbWVudF90IG9sZGZzID0gezB9OwogCWNoYXIgKmJ1ZmY7CiAJaW50IGxlbiA9IDA7Ci0JbG9mZl90CXBvcyA9IDA7CisJbG9mZl90IHBvcyA9IDA7CiAKLQlidWZmPWttYWxsb2MoQlVGRkVSXzFLLCBHRlBfS0VSTkVMKTsKLQlpZighYnVmZikKLQl7CisJYnVmZiA9IGttYWxsb2MoQlVGRkVSXzFLLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZmYpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KLQlpZigoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMgPQotCQlrbWFsbG9jKHNpemVvZihTVEFSR0VUUEFSQU1TKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCi0JeworCisJQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMgPSBrbWFsbG9jKHNpemVvZihTVEFSR0VUUEFSQU1TKSwgR0ZQX0tFUk5FTCk7CisJaWYgKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zID09IE5VTEwpIHsKIAkJa2ZyZWUoYnVmZik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlmbHA9b3Blbl9maXJtd2FyZV9maWxlKEFkYXB0ZXIsIENGR19GSUxFKTsKLQlpZighZmxwKSB7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIk5PVCBBQkxFIFRPIE9QRU4gVEhFICVzIEZJTEUgXG4iLCBDRkdfRklMRSk7CisKKwlmbHAgPSBvcGVuX2Zpcm13YXJlX2ZpbGUoQWRhcHRlciwgQ0ZHX0ZJTEUpOworCWlmICghZmxwKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsICJOT1QgQUJMRSBUTyBPUEVOIFRIRSAlcyBGSUxFXG4iLCBDRkdfRklMRSk7CiAJCWtmcmVlKGJ1ZmYpOwogCQlrZnJlZShBZGFwdGVyLT5wc3RhcmdldHBhcmFtcyk7CiAJCUFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zID0gTlVMTDsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQotCW9sZGZzPWdldF9mcygpOwlzZXRfZnMoZ2V0X2RzKCkpOwotCWxlbj12ZnNfcmVhZChmbHAsICh2b2lkIF9fdXNlciBfX2ZvcmNlICopYnVmZiwgQlVGRkVSXzFLLCAmcG9zKTsKKwlvbGRmcyA9IGdldF9mcygpOworCXNldF9mcyhnZXRfZHMoKSk7CisJbGVuID0gdmZzX3JlYWQoZmxwLCAodm9pZCBfX3VzZXIgX19mb3JjZSAqKWJ1ZmYsIEJVRkZFUl8xSywgJnBvcyk7CiAJc2V0X2ZzKG9sZGZzKTsKIAotCWlmKGxlbiAhPSBzaXplb2YoU1RBUkdFVFBBUkFNUykpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsIk1pc21hdGNoIGluIFRhcmdldCBQYXJhbSBTdHJ1Y3R1cmUhXG4iKTsKKwlpZiAobGVuICE9IHNpemVvZihTVEFSR0VUUEFSQU1TKSkgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCAiTWlzbWF0Y2ggaW4gVGFyZ2V0IFBhcmFtIFN0cnVjdHVyZSFcbiIpOwogCQlrZnJlZShidWZmKTsKIAkJa2ZyZWUoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMpOwogCQlBZGFwdGVyLT5wc3RhcmdldHBhcmFtcyA9IE5VTEw7CkBAIC0xMjY2LDEyMiArMTExNSw5NyBAQAogCSAqIFZhbHVlcyBpbiBBZGFwdGVyLT5wc3RhcmdldHBhcmFtcyBhcmUgaW4gbmV0d29yayBieXRlIG9yZGVyCiAJICovCiAJbWVtY3B5KEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLCBidWZmLCBzaXplb2YoU1RBUkdFVFBBUkFNUykpOwotCWtmcmVlIChidWZmKTsKKwlrZnJlZShidWZmKTsKIAliZWNlZW1fcGFyc2VfdGFyZ2V0X3N0cnVjdChBZGFwdGVyKTsKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKIHZvaWQgYmVjZWVtX3BhcnNlX3RhcmdldF9zdHJ1Y3QoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewotCVVJTlQgdWlIb3N0RHJ2ckNmZzYgPTAsIHVpRUVQUk9NRmxhZyA9IDA7CisJVUlOVCB1aUhvc3REcnZyQ2ZnNiA9IDAsIHVpRUVQUk9NRmxhZyA9IDA7CiAKLQlpZihudG9obChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+bV91MzJQaHlQYXJhbWV0ZXIyKSAmIEFVVE9fU1lOQ19ESVNBQkxFKQotCXsKKwlpZiAobnRvaGwoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyUGh5UGFyYW1ldGVyMikgJiBBVVRPX1NZTkNfRElTQUJMRSkgewogCQlwcl9pbmZvKERSVl9OQU1FICI6IEF1dG9TeW5jdXAgaXMgRGlzYWJsZWRcbiIpOwogCQlBZGFwdGVyLT5BdXRvU3luY3VwID0gRkFMU0U7Ci0JfQotCWVsc2UKLQl7CisJfSBlbHNlIHsKIAkJcHJfaW5mbyhEUlZfTkFNRSAiOiBBdXRvU3luY3VwIGlzIEVuYWJsZWRcbiIpOwotCQlBZGFwdGVyLT5BdXRvU3luY3VwCT0gVFJVRTsKKwkJQWRhcHRlci0+QXV0b1N5bmN1cCA9IFRSVUU7CiAJfQogCi0JaWYobnRvaGwoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPkhvc3REcnZyQ29uZmlnNikgJiBBVVRPX0xJTktVUF9FTkFCTEUpCi0JeworCWlmIChudG9obChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+SG9zdERydnJDb25maWc2KSAmIEFVVE9fTElOS1VQX0VOQUJMRSkgewogCQlwcl9pbmZvKERSVl9OQU1FICI6IEVuYWJsaW5nIGF1dG9saW5rIHVwIik7CiAJCUFkYXB0ZXItPkF1dG9MaW5rVXAgPSBUUlVFOwotCX0KLQllbHNlCi0JeworCX0gZWxzZSB7CiAJCXByX2luZm8oRFJWX05BTUUgIjogRGlzYWJsaW5nIGF1dG9saW5rIHVwIik7CiAJCUFkYXB0ZXItPkF1dG9MaW5rVXAgPSBGQUxTRTsKIAl9Ci0JLy8gU2V0dGluZyB0aGUgRERSIFNldHRpbmcuLgotCUFkYXB0ZXItPkREUlNldHRpbmcgPQotCQkJKG50b2hsKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5Ib3N0RHJ2ckNvbmZpZzYpID4+OCkmMHgwRjsKLQlBZGFwdGVyLT51bFBvd2VyU2F2ZU1vZGUgPQotCQkJKG50b2hsKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5Ib3N0RHJ2ckNvbmZpZzYpPj4xMikmMHgwRjsKLQorCS8qIFNldHRpbmcgdGhlIEREUiBTZXR0aW5nLi4gKi8KKwlBZGFwdGVyLT5ERFJTZXR0aW5nID0gKG50b2hsKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5Ib3N0RHJ2ckNvbmZpZzYpID4+IDgpJjB4MEY7CisJQWRhcHRlci0+dWxQb3dlclNhdmVNb2RlID0gKG50b2hsKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5Ib3N0RHJ2ckNvbmZpZzYpPj4xMikmMHgwRjsKIAlwcl9pbmZvKERSVl9OQU1FICI6IEREUiBTZXR0aW5nOiAleFxuIiwgQWRhcHRlci0+RERSU2V0dGluZyk7CiAJcHJfaW5mbyhEUlZfTkFNRSAiOiBQb3dlciBTYXZlIE1vZGU6ICVseFxuIiwgQWRhcHRlci0+dWxQb3dlclNhdmVNb2RlKTsKLQlpZihudG9obChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+SG9zdERydnJDb25maWc2KSAmIEFVVE9fRklSTV9ET1dOTE9BRCkKLSAgICB7Ci0gICAgICAgIHByX2luZm8oRFJWX05BTUUgIjogRW5hYmxpbmcgQXV0byBGaXJtd2FyZSBEb3dubG9hZFxuIik7Ci0gICAgICAgIEFkYXB0ZXItPkF1dG9GaXJtRGxkID0gVFJVRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcHJfaW5mbyhEUlZfTkFNRSAiOiBEaXNhYmxpbmcgQXV0byBGaXJtd2FyZSBEb3dubG9hZFxuIik7Ci0gICAgICAgIEFkYXB0ZXItPkF1dG9GaXJtRGxkID0gRkFMU0U7Ci0gICAgfQorCWlmIChudG9obChBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+SG9zdERydnJDb25maWc2KSAmIEFVVE9fRklSTV9ET1dOTE9BRCkgeworCQlwcl9pbmZvKERSVl9OQU1FICI6IEVuYWJsaW5nIEF1dG8gRmlybXdhcmUgRG93bmxvYWRcbiIpOworCQlBZGFwdGVyLT5BdXRvRmlybURsZCA9IFRSVUU7CisJfSBlbHNlIHsKKwkJcHJfaW5mbyhEUlZfTkFNRSAiOiBEaXNhYmxpbmcgQXV0byBGaXJtd2FyZSBEb3dubG9hZFxuIik7CisJCUFkYXB0ZXItPkF1dG9GaXJtRGxkID0gRkFMU0U7CisJfQogCXVpSG9zdERydnJDZmc2ID0gbnRvaGwoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPkhvc3REcnZyQ29uZmlnNik7CiAJQWRhcHRlci0+Yk1pcHNDb25maWcgPSAodWlIb3N0RHJ2ckNmZzY+PjIwKSYweDAxOwotCXByX2luZm8oRFJWX05BTUUgIjogTUlQU0NvbmZpZyAgIDogMHglWFxuIixBZGFwdGVyLT5iTWlwc0NvbmZpZyk7Ci0JLy91c2VkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorCXByX2luZm8oRFJWX05BTUUgIjogTUlQU0NvbmZpZyAgIDogMHglWFxuIiwgQWRhcHRlci0+Yk1pcHNDb25maWcpOworCS8qIHVzZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICovCiAJQWRhcHRlci0+YkRQTExDb25maWcgPSAodWlIb3N0RHJ2ckNmZzY+PjE5KSYweDAxOwotCi0JQWRhcHRlci0+UG11TW9kZT0gKHVpSG9zdERydnJDZmc2ID4+IDI0ICkgJiAweDAzOworCUFkYXB0ZXItPlBtdU1vZGUgPSAodWlIb3N0RHJ2ckNmZzYgPj4gMjQpICYgMHgwMzsKIAlwcl9pbmZvKERSVl9OQU1FICI6IFBNVSBNT0RFOiAleCIsIEFkYXB0ZXItPlBtdU1vZGUpOwogCi0gICAgaWYoKHVpSG9zdERydnJDZmc2ID4+IEhPU1RfQlVTX1NVU1BFTkRfQklUICkgJiAoMHgwMSkpCi0gICAgewotICAgICAgICBBZGFwdGVyLT5iRG9TdXNwZW5kID0gVFJVRTsKLSAgICAgICAgcHJfaW5mbyhEUlZfTkFNRSAiOiBNYWtpbmcgRG9TdXNwZW5kIFRSVUUgYXMgcGVyIGNvbmZpZ0ZpbGUiKTsKLSAgICB9CisJaWYgKCh1aUhvc3REcnZyQ2ZnNiA+PiBIT1NUX0JVU19TVVNQRU5EX0JJVCkgJiAoMHgwMSkpIHsKKwkJQWRhcHRlci0+YkRvU3VzcGVuZCA9IFRSVUU7CisJCXByX2luZm8oRFJWX05BTUUgIjogTWFraW5nIERvU3VzcGVuZCBUUlVFIGFzIHBlciBjb25maWdGaWxlIik7CisJfQogCiAJdWlFRVBST01GbGFnID0gbnRvaGwoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyRUVQUk9NRmxhZyk7Ci0JcHJfaW5mbyhEUlZfTkFNRSAiOiB1aUVFUFJPTUZsYWcgIDogMHglWFxuIix1aUVFUFJPTUZsYWcpOworCXByX2luZm8oRFJWX05BTUUgIjogdWlFRVBST01GbGFnICA6IDB4JVhcbiIsIHVpRUVQUk9NRmxhZyk7CiAJQWRhcHRlci0+ZU5WTVR5cGUgPSAoTlZNX1RZUEUpKCh1aUVFUFJPTUZsYWc+PjQpJjB4Myk7Ci0KIAlBZGFwdGVyLT5iU3RhdHVzV3JpdGUgPSAodWlFRVBST01GbGFnPj42KSYweDE7Ci0KIAlBZGFwdGVyLT51aVNlY3RvclNpemVJbkNGRyA9IDEwMjQqKDB4RkZGRiAmIG50b2hsKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5Ib3N0RHJ2ckNvbmZpZzQpKTsKKwlBZGFwdGVyLT5iU2VjdG9yU2l6ZU92ZXJyaWRlID0gKGJvb2wpICgobnRvaGwoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPkhvc3REcnZyQ29uZmlnNCkpPj4xNikmMHgxOwogCi0JQWRhcHRlci0+YlNlY3RvclNpemVPdmVycmlkZSA9KGJvb2wpICgobnRvaGwoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPkhvc3REcnZyQ29uZmlnNCkpPj4xNikmMHgxOwotCi0JaWYobnRvaGwoQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyUG93ZXJTYXZpbmdNb2RlT3B0aW9ucykgJjB4MDEpCisJaWYgKG50b2hsKEFkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMlBvd2VyU2F2aW5nTW9kZU9wdGlvbnMpICYgMHgwMSkKIAkJQWRhcHRlci0+dWxQb3dlclNhdmVNb2RlID0gREVWSUNFX1BPV0VSU0FWRV9NT0RFX0FTX1BST1RPQ09MX0lETEVfTU9ERTsKIAotCWlmKEFkYXB0ZXItPnVsUG93ZXJTYXZlTW9kZSAhPSBERVZJQ0VfUE9XRVJTQVZFX01PREVfQVNfUFJPVE9DT0xfSURMRV9NT0RFKQorCWlmIChBZGFwdGVyLT51bFBvd2VyU2F2ZU1vZGUgIT0gREVWSUNFX1BPV0VSU0FWRV9NT0RFX0FTX1BST1RPQ09MX0lETEVfTU9ERSkKIAkJZG9Qb3dlckF1dG9Db3JyZWN0aW9uKEFkYXB0ZXIpOwotCiB9CiAKIHN0YXRpYyBWT0lEIGRvUG93ZXJBdXRvQ29ycmVjdGlvbihQTUlOSV9BREFQVEVSIHBzQWRhcHRlcikKIHsKIAlVSU5UIHJlcG9ydGluZ19tb2RlOwogCi0JcmVwb3J0aW5nX21vZGUgPSBudG9obChwc0FkYXB0ZXItPnBzdGFyZ2V0cGFyYW1zLT5tX3UzMlBvd2VyU2F2aW5nTW9kZU9wdGlvbnMpICYweDAyIDsKKwlyZXBvcnRpbmdfbW9kZSA9IG50b2hsKHBzQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPm1fdTMyUG93ZXJTYXZpbmdNb2RlT3B0aW9ucykgJiAweDAyOwogCXBzQWRhcHRlci0+YklzQXV0b0NvcnJlY3RFbmFibGVkID0gISgoY2hhcikocHNBZGFwdGVyLT51bFBvd2VyU2F2ZU1vZGUgPj4gMykgJiAweDEpOwogCi0JaWYocmVwb3J0aW5nX21vZGUgPT0gVFJVRSkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsREJHX1RZUEVfSU5JVEVYSVQsIE1QX0lOSVQsIERCR19MVkxfQUxMLCJjYW4ndCBkbyBzdXNwZW4vcmVzdW1lIGFzIHJlcG9ydGluZyBtb2RlIGlzIGVuYWJsZSIpOworCWlmIChyZXBvcnRpbmdfbW9kZSA9PSBUUlVFKSB7CisJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgImNhbid0IGRvIHN1c3Blbi9yZXN1bWUgYXMgcmVwb3J0aW5nIG1vZGUgaXMgZW5hYmxlIik7CiAJCXBzQWRhcHRlci0+YkRvU3VzcGVuZCA9IEZBTFNFOwogCX0KIAotCWlmIChwc0FkYXB0ZXItPmJJc0F1dG9Db3JyZWN0RW5hYmxlZCAmJiAocHNBZGFwdGVyLT5jaGlwX2lkID49IFQzTFBCKSkKLQl7Ci0JCS8vSWYgcmVwb3J0aW5nIG1vZGUgaXMgZW5hYmxlLCBzd2l0Y2ggUE1VIHRvIFBNQworCWlmIChwc0FkYXB0ZXItPmJJc0F1dG9Db3JyZWN0RW5hYmxlZCAmJiAocHNBZGFwdGVyLT5jaGlwX2lkID49IFQzTFBCKSkgeworCQkvKiBJZiByZXBvcnRpbmcgbW9kZSBpcyBlbmFibGUsIHN3aXRjaCBQTVUgdG8gUE1DICovCiAJCXsKIAkJCXBzQWRhcHRlci0+dWxQb3dlclNhdmVNb2RlID0gREVWSUNFX1BPV0VSU0FWRV9NT0RFX0FTX1BNVV9DTE9DS19HQVRJTkc7Ci0JCQlwc0FkYXB0ZXItPmJEb1N1c3BlbmQgPUZBTFNFOwotCisJCQlwc0FkYXB0ZXItPmJEb1N1c3BlbmQgPSBGQUxTRTsKIAkJfQogCi0JCS8vY2xlYXJpbmcgc3BhY2UgYml0WzE1Li4xMl0KKwkJLyogY2xlYXJpbmcgc3BhY2UgYml0WzE1Li4xMl0gKi8KIAkJcHNBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+SG9zdERydnJDb25maWc2ICY9IH4oaHRvbmwoKDB4RiA8PCAxMikpKTsKLQkJLy9wbGFjaW5nIHRoZSBwb3dlciBzYXZlIG1vZGUgb3B0aW9uCisJCS8qIHBsYWNpbmcgdGhlIHBvd2VyIHNhdmUgbW9kZSBvcHRpb24gKi8KIAkJcHNBZGFwdGVyLT5wc3RhcmdldHBhcmFtcy0+SG9zdERydnJDb25maWc2IHw9IGh0b25sKChwc0FkYXB0ZXItPnVsUG93ZXJTYXZlTW9kZSA8PCAxMikpOwotCi0JfQotCWVsc2UgaWYgKHBzQWRhcHRlci0+YklzQXV0b0NvcnJlY3RFbmFibGVkID09IEZBTFNFKQotCXsKLQotCQkvLyByZW1vdmUgdGhlIGF1dG9jb3JyZWN0IGRpc2FibGUgYml0IHNldCBiZWZvcmUgZHVtcGluZy4KKwl9IGVsc2UgaWYgKHBzQWRhcHRlci0+YklzQXV0b0NvcnJlY3RFbmFibGVkID09IEZBTFNFKSB7CisJCS8qIHJlbW92ZSB0aGUgYXV0b2NvcnJlY3QgZGlzYWJsZSBiaXQgc2V0IGJlZm9yZSBkdW1waW5nLiAqLwogCQlwc0FkYXB0ZXItPnVsUG93ZXJTYXZlTW9kZSAmPSB+KDEgPDwgMyk7CiAJCXBzQWRhcHRlci0+cHN0YXJnZXRwYXJhbXMtPkhvc3REcnZyQ29uZmlnNiAmPSB+KGh0b25sKDEgPDwgMTUpKTsKLQkJQkNNX0RFQlVHX1BSSU5UKHBzQWRhcHRlcixEQkdfVFlQRV9JTklURVhJVCwgTVBfSU5JVCwgREJHX0xWTF9BTEwsIlVzaW5nIEZvcmNlZCBVc2VyIENob2ljZTogJWx4XG4iLCBwc0FkYXB0ZXItPnVsUG93ZXJTYXZlTW9kZSk7CisJCUJDTV9ERUJVR19QUklOVChwc0FkYXB0ZXIsIERCR19UWVBFX0lOSVRFWElULCBNUF9JTklULCBEQkdfTFZMX0FMTCwgIlVzaW5nIEZvcmNlZCBVc2VyIENob2ljZTogJWx4XG4iLCBwc0FkYXB0ZXItPnVsUG93ZXJTYXZlTW9kZSk7CiAJfQogfQogCkBAIC0xMzkyLDYzICsxMjE2LDU2IEBACiAJdW5zaWduZWQgaW50IHRlbXAgPSAwOwogCXVuc2lnbmVkIGNoYXIgKnB1Y21hY2FkZHIgPSBrbWFsbG9jKE1BQ19BRERSRVNTX1NJWkUsIEdGUF9LRVJORUwpOwogCi0JaWYoIXB1Y21hY2FkZHIpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJObyBCdWZmZXJzIHRvIFJlYWQgdGhlIEVFUFJPTSBBZGRyZXNzXG4iKTsKKwlpZiAoIXB1Y21hY2FkZHIpIHsKKwkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX1BSSU5USywgMCwgMCwgIk5vIEJ1ZmZlcnMgdG8gUmVhZCB0aGUgRUVQUk9NIEFkZHJlc3NcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKIAlkd0FkZHJlc3MgfD0gMHg1YjAwMDAwMDsKLQlzdGF0dXMgPSB3cm1hbHQoQWRhcHRlciwgRUVQUk9NX0NPTU1BTkRfUV9SRUcsCi0JCQkJCQkoUFVJTlQpJmR3QWRkcmVzcywgc2l6ZW9mKFVJTlQpKTsKLQlpZihzdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJ3cm0gRmFpbGVkLi5cbiIpOworCXN0YXR1cyA9IHdybWFsdChBZGFwdGVyLCBFRVBST01fQ09NTUFORF9RX1JFRywgKFBVSU5UKSZkd0FkZHJlc3MsIHNpemVvZihVSU5UKSk7CisJaWYgKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAid3JtIEZhaWxlZC4uXG4iKTsKIAkJa2ZyZWUocHVjbWFjYWRkcik7CiAJCXB1Y21hY2FkZHIgPSBOVUxMOwogCQlnb3RvIE9VVDsKIAl9Ci0JZm9yKGk9MDtpPE1BQ19BRERSRVNTX1NJWkU7aSsrKQotCXsKLQkJc3RhdHVzID0gcmRtYWx0KEFkYXB0ZXIsIEVFUFJPTV9SRUFEX0RBVEFfUV9SRUcsICZ0ZW1wLHNpemVvZih0ZW1wKSk7Ci0JCWlmKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAicmRtIEZhaWxlZC4uXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQUNfQUREUkVTU19TSVpFOyBpKyspIHsKKwkJc3RhdHVzID0gcmRtYWx0KEFkYXB0ZXIsIEVFUFJPTV9SRUFEX0RBVEFfUV9SRUcsICZ0ZW1wLCBzaXplb2YodGVtcCkpOworCQlpZiAoc3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAicmRtIEZhaWxlZC4uXG4iKTsKIAkJCWtmcmVlKHB1Y21hY2FkZHIpOwogCQkJcHVjbWFjYWRkciA9IE5VTEw7CiAJCQlnb3RvIE9VVDsKIAkJfQogCQlwdWNtYWNhZGRyW2ldID0gdGVtcCAmIDB4ZmY7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX0lOSVRFWElULCBEUlZfRU5UUlksIERCR19MVkxfQUxMLCIleCBcbiIsIHB1Y21hY2FkZHJbaV0pOworCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfSU5JVEVYSVQsIERSVl9FTlRSWSwgREJHX0xWTF9BTEwsICIleFxuIiwgcHVjbWFjYWRkcltpXSk7CiAJfQogT1VUOgogCXJldHVybiBwdWNtYWNhZGRyOwogfQogI2VuZGlmCiAKLQogc3RhdGljIHZvaWQgY29udmVydEVuZGlhbihCX1VJTlQ4IHJ3RmxhZywgUFVJTlQgcHVpQnVmZmVyLCBVSU5UIHVpQnl0ZUNvdW50KQogewogCVVJTlQgdWlJbmRleCA9IDA7CiAKLQlpZihSV01fV1JJVEUgPT0gcndGbGFnKSB7Ci0JCWZvcih1aUluZGV4ID0wOyB1aUluZGV4IDwgKHVpQnl0ZUNvdW50L3NpemVvZihVSU5UKSk7IHVpSW5kZXgrKykgeworCWlmIChSV01fV1JJVEUgPT0gcndGbGFnKSB7CisJCWZvciAodWlJbmRleCA9IDA7IHVpSW5kZXggPCAodWlCeXRlQ291bnQvc2l6ZW9mKFVJTlQpKTsgdWlJbmRleCsrKQogCQkJcHVpQnVmZmVyW3VpSW5kZXhdID0gaHRvbmwocHVpQnVmZmVyW3VpSW5kZXhdKTsKLQkJfQogCX0gZWxzZSB7Ci0JCWZvcih1aUluZGV4ID0wOyB1aUluZGV4IDwgKHVpQnl0ZUNvdW50L3NpemVvZihVSU5UKSk7IHVpSW5kZXgrKykgeworCQlmb3IgKHVpSW5kZXggPSAwOyB1aUluZGV4IDwgKHVpQnl0ZUNvdW50L3NpemVvZihVSU5UKSk7IHVpSW5kZXgrKykKIAkJCXB1aUJ1ZmZlclt1aUluZGV4XSA9IG50b2hsKHB1aUJ1ZmZlclt1aUluZGV4XSk7Ci0JCX0KIAl9CiB9CiAKLSNkZWZpbmUgQ0FDSEVfQUREUkVTU19NQVNLCTB4ODAwMDAwMDAKLSNkZWZpbmUgVU5DQUNIRV9BRERSRVNTX01BU0sJMHhhMDAwMDAwMAorI2RlZmluZSBDQUNIRV9BRERSRVNTX01BU0sgMHg4MDAwMDAwMAorI2RlZmluZSBVTkNBQ0hFX0FERFJFU1NfTUFTSyAweGEwMDAwMDAwCiAKIGludCByZG0oUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIHVpQWRkcmVzcywgUENIQVIgcHVjQnVmZiwgc2l6ZV90IHNTaXplKQogewogCXJldHVybiBBZGFwdGVyLT5pbnRlcmZhY2VfcmRtKEFkYXB0ZXItPnB2SW50ZXJmYWNlQWRhcHRlciwKLQkJCXVpQWRkcmVzcywgcHVjQnVmZiwgc1NpemUpOworCQkJCXVpQWRkcmVzcywgcHVjQnVmZiwgc1NpemUpOwogfQogCiBpbnQgd3JtKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCB1aUFkZHJlc3MsIFBDSEFSIHB1Y0J1ZmYsIHNpemVfdCBzU2l6ZSkKQEAgLTE0NTYsMTEyICsxMjczLDEwMyBAQAogCWludCBpUmV0VmFsOwogCiAJaVJldFZhbCA9IEFkYXB0ZXItPmludGVyZmFjZV93cm0oQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyLAotCQkJdWlBZGRyZXNzLCBwdWNCdWZmLCBzU2l6ZSk7Ci0KLQorCQkJCQl1aUFkZHJlc3MsIHB1Y0J1ZmYsIHNTaXplKTsKIAlyZXR1cm4gaVJldFZhbDsKIH0KIAotaW50IHdybWFsdCAoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIHVpQWRkcmVzcywgUFVJTlQgcHVjQnVmZiwgc2l6ZV90IHNpemUpCitpbnQgd3JtYWx0KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCB1aUFkZHJlc3MsIFBVSU5UIHB1Y0J1ZmYsIHNpemVfdCBzaXplKQogewogCWNvbnZlcnRFbmRpYW4oUldNX1dSSVRFLCBwdWNCdWZmLCBzaXplKTsKIAlyZXR1cm4gd3JtKEFkYXB0ZXIsIHVpQWRkcmVzcywgKFBVQ0hBUilwdWNCdWZmLCBzaXplKTsKIH0KIAotaW50IHJkbWFsdCAoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIHVpQWRkcmVzcywgUFVJTlQgcHVjQnVmZiwgc2l6ZV90IHNpemUpCitpbnQgcmRtYWx0KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCB1aUFkZHJlc3MsIFBVSU5UIHB1Y0J1ZmYsIHNpemVfdCBzaXplKQogewotCUlOVCB1aVJldFZhbCA9MDsKKwlJTlQgdWlSZXRWYWwgPSAwOwogCi0JdWlSZXRWYWwgPSByZG0oQWRhcHRlcix1aUFkZHJlc3MsKFBVQ0hBUilwdWNCdWZmLHNpemUpOworCXVpUmV0VmFsID0gcmRtKEFkYXB0ZXIsIHVpQWRkcmVzcywgKFBVQ0hBUilwdWNCdWZmLCBzaXplKTsKIAljb252ZXJ0RW5kaWFuKFJXTV9SRUFELCAoUFVJTlQpcHVjQnVmZiwgc2l6ZSk7CiAKIAlyZXR1cm4gdWlSZXRWYWw7CiB9CiAKLQogaW50IHdybVdpdGhMb2NrKFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVUlOVCB1aUFkZHJlc3MsIFBDSEFSIHB1Y0J1ZmYsIHNpemVfdCBzU2l6ZSkKIHsKLQlJTlQgc3RhdHVzID0gU1RBVFVTX1NVQ0NFU1MgOworCUlOVCBzdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKIAlkb3duKCZBZGFwdGVyLT5yZG13cm1zeW5jKTsKIAotCWlmKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT1UUlVFKSB8fAotCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PVRSVUUpKQotCXsKKwlpZiAoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PSBUUlVFKSB8fAorCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PSBUUlVFKSkgeworCiAJCXN0YXR1cyA9IC1FQUNDRVM7CiAJCWdvdG8gZXhpdDsKIAl9CiAKLQlzdGF0dXMgPXdybShBZGFwdGVyLCB1aUFkZHJlc3MsIHB1Y0J1ZmYsIHNTaXplKTsKLQorCXN0YXR1cyA9IHdybShBZGFwdGVyLCB1aUFkZHJlc3MsIHB1Y0J1ZmYsIHNTaXplKTsKIGV4aXQ6CiAJdXAoJkFkYXB0ZXItPnJkbXdybXN5bmMpOwotCXJldHVybiBzdGF0dXMgOworCXJldHVybiBzdGF0dXM7CiB9CiAKLWludCB3cm1hbHRXaXRoTG9jayAoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIHVpQWRkcmVzcywgUFVJTlQgcHVjQnVmZiwgc2l6ZV90IHNpemUpCitpbnQgd3JtYWx0V2l0aExvY2soUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVSU5UIHVpQWRkcmVzcywgUFVJTlQgcHVjQnVmZiwgc2l6ZV90IHNpemUpCiB7CiAJaW50IGlSZXRWYWwgPSBTVEFUVVNfU1VDQ0VTUzsKIAogCWRvd24oJkFkYXB0ZXItPnJkbXdybXN5bmMpOwogCi0JaWYoKEFkYXB0ZXItPklkbGVNb2RlID09IFRSVUUpIHx8Ci0JCShBZGFwdGVyLT5iU2h1dFN0YXR1cyA9PVRSVUUpIHx8Ci0JCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09VFJVRSkpCi0JeworCWlmICgoQWRhcHRlci0+SWRsZU1vZGUgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJTaHV0U3RhdHVzID09IFRSVUUpIHx8CisJCShBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID09IFRSVUUpKSB7CisKIAkJaVJldFZhbCA9IC1FQUNDRVM7CiAJCWdvdG8gZXhpdDsKIAl9CiAKLQlpUmV0VmFsID0gd3JtYWx0KEFkYXB0ZXIsdWlBZGRyZXNzLHB1Y0J1ZmYsc2l6ZSk7Ci0KKwlpUmV0VmFsID0gd3JtYWx0KEFkYXB0ZXIsIHVpQWRkcmVzcywgcHVjQnVmZiwgc2l6ZSk7CiBleGl0OgogCXVwKCZBZGFwdGVyLT5yZG13cm1zeW5jKTsKIAlyZXR1cm4gaVJldFZhbDsKIH0KIAotaW50IHJkbWFsdFdpdGhMb2NrIChQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgdWlBZGRyZXNzLCBQVUlOVCBwdWNCdWZmLCBzaXplX3Qgc2l6ZSkKK2ludCByZG1hbHRXaXRoTG9jayhQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgdWlBZGRyZXNzLCBQVUlOVCBwdWNCdWZmLCBzaXplX3Qgc2l6ZSkKIHsKLQlJTlQgdWlSZXRWYWwgPVNUQVRVU19TVUNDRVNTOworCUlOVCB1aVJldFZhbCA9IFNUQVRVU19TVUNDRVNTOwogCiAJZG93bigmQWRhcHRlci0+cmRtd3Jtc3luYyk7CisJaWYgKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAorCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT0gVFJVRSkgfHwKKwkJKEFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPT0gVFJVRSkpIHsKIAotCWlmKChBZGFwdGVyLT5JZGxlTW9kZSA9PSBUUlVFKSB8fAotCQkoQWRhcHRlci0+YlNodXRTdGF0dXMgPT1UUlVFKSB8fAotCQkoQWRhcHRlci0+YlByZXBhcmluZ0Zvckxvd1Bvd2VyTW9kZSA9PVRSVUUpKQotCXsKIAkJdWlSZXRWYWwgPSAtRUFDQ0VTOwogCQlnb3RvIGV4aXQ7CiAJfQogCi0JdWlSZXRWYWwgPSByZG1hbHQoQWRhcHRlcix1aUFkZHJlc3MsIHB1Y0J1ZmYsIHNpemUpOwotCisJdWlSZXRWYWwgPSByZG1hbHQoQWRhcHRlciwgdWlBZGRyZXNzLCBwdWNCdWZmLCBzaXplKTsKIGV4aXQ6CiAJdXAoJkFkYXB0ZXItPnJkbXdybXN5bmMpOwogCXJldHVybiB1aVJldFZhbDsKIH0KIAotCiBzdGF0aWMgVk9JRCBIYW5kbGVTaHV0RG93bk1vZGVXYWtldXAoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewotCWludCBjbGVhcl9hYm9ydF9wYXR0ZXJuID0gMCxTdGF0dXMgPSAwOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTVBfU0hVVERPV04sIERCR19MVkxfQUxMLCAiPT09PT5cbiIpOwotCS8vdGFyZ2V0IGhhcyB3b2tlbiB1cCBGcm9tIFNodXQgRG93bgotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTVBfU0hVVERPV04sIERCR19MVkxfQUxMLCAiQ2xlYXJpbmcgU2h1dCBEb3duIFNvZnR3YXJlIGFib3J0IHBhdHRlcm5cbiIpOwotCVN0YXR1cyA9IHdybWFsdChBZGFwdGVyLFNXX0FCT1JUX0lETEVNT0RFX0xPQywgKFBVSU5UKSZjbGVhcl9hYm9ydF9wYXR0ZXJuLCBzaXplb2YoY2xlYXJfYWJvcnRfcGF0dGVybikpOwotCWlmKFN0YXR1cykKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTVBfU0hVVERPV04sIERCR19MVkxfQUxMLCJXUk0gdG8gU1dfQUJPUlRfSURMRU1PREVfTE9DIGZhaWxlZCB3aXRoIGVycjolZCIsIFN0YXR1cyk7CisJaW50IGNsZWFyX2Fib3J0X3BhdHRlcm4gPSAwLCBTdGF0dXMgPSAwOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE1QX1NIVVRET1dOLCBEQkdfTFZMX0FMTCwgIj09PT0+XG4iKTsKKwkvKiB0YXJnZXQgaGFzIHdva2VuIHVwIEZyb20gU2h1dCBEb3duICovCisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgTVBfU0hVVERPV04sIERCR19MVkxfQUxMLCAiQ2xlYXJpbmcgU2h1dCBEb3duIFNvZnR3YXJlIGFib3J0IHBhdHRlcm5cbiIpOworCVN0YXR1cyA9IHdybWFsdChBZGFwdGVyLCBTV19BQk9SVF9JRExFTU9ERV9MT0MsIChQVUlOVCkmY2xlYXJfYWJvcnRfcGF0dGVybiwgc2l6ZW9mKGNsZWFyX2Fib3J0X3BhdHRlcm4pKTsKKwlpZiAoU3RhdHVzKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE1QX1NIVVRET1dOLCBEQkdfTFZMX0FMTCwgIldSTSB0byBTV19BQk9SVF9JRExFTU9ERV9MT0MgZmFpbGVkIHdpdGggZXJyOiVkIiwgU3RhdHVzKTsKIAkJcmV0dXJuOwogCX0KLQlpZihBZGFwdGVyLT51bFBvd2VyU2F2ZU1vZGUgIT0gREVWSUNFX1BPV0VSU0FWRV9NT0RFX0FTX1BST1RPQ09MX0lETEVfTU9ERSkKLQl7CisKKwlpZiAoQWRhcHRlci0+dWxQb3dlclNhdmVNb2RlICE9IERFVklDRV9QT1dFUlNBVkVfTU9ERV9BU19QUk9UT0NPTF9JRExFX01PREUpIHsKIAkJbXNsZWVwKDEwMCk7CiAJCUludGVyZmFjZUhhbmRsZVNodXRkb3duTW9kZVdha2V1cChBZGFwdGVyKTsKIAkJbXNsZWVwKDEwMCk7CiAJfQotCWlmKEFkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nICYgQkNNX0xFRF9USFJFQURfUlVOTklOR19BQ1RJVkVMWSkKLQl7CisKKwlpZiAoQWRhcHRlci0+TEVESW5mby5sZWRfdGhyZWFkX3J1bm5pbmcgJiBCQ01fTEVEX1RIUkVBRF9SVU5OSU5HX0FDVElWRUxZKSB7CiAJCUFkYXB0ZXItPkRyaXZlclN0YXRlID0gTk9fTkVUV09SS19FTlRSWTsKIAkJd2FrZV91cCgmQWRhcHRlci0+TEVESW5mby5ub3RpZnlfbGVkX2V2ZW50KTsKIAl9CkBAIC0xNTY5LDU1ICsxMzc3LDQ5IEBACiAJQWRhcHRlci0+YlRyaWVkVG9XYWtlVXBGcm9tbG93UG93ZXJNb2RlID0gRkFMU0U7CiAJQWRhcHRlci0+YlNodXRTdGF0dXMgPSBGQUxTRTsKIAl3YWtlX3VwKCZBZGFwdGVyLT5sb3dwb3dlcl9tb2RlX3dhaXRfcXVldWUpOwotCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTVBfU0hVVERPV04sIERCR19MVkxfQUxMLCAiPD09PT1cbiIpOworCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE1QX1NIVVRET1dOLCBEQkdfTFZMX0FMTCwgIjw9PT09XG4iKTsKIH0KIAogc3RhdGljIFZPSUQgU2VuZFNodXRNb2RlUmVzcG9uc2UoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewotCUNPTlRST0xfTUVTU0FHRQkJc3RTaHV0ZG93blJlc3BvbnNlOwotCVVJTlQgTlZNQWNjZXNzID0gMCxsb3dQd3JBYm9ydE1zZyA9IDA7CisJQ09OVFJPTF9NRVNTQUdFIHN0U2h1dGRvd25SZXNwb25zZTsKKwlVSU5UIE5WTUFjY2VzcyA9IDAsIGxvd1B3ckFib3J0TXNnID0gMDsKIAlVSU5UIFN0YXR1cyA9IDA7CiAKLQltZW1zZXQgKCZzdFNodXRkb3duUmVzcG9uc2UsIDAsIHNpemVvZihDT05UUk9MX01FU1NBR0UpKTsKKwltZW1zZXQoJnN0U2h1dGRvd25SZXNwb25zZSwgMCwgc2l6ZW9mKENPTlRST0xfTUVTU0FHRSkpOwogCXN0U2h1dGRvd25SZXNwb25zZS5MZWFkZXIuU3RhdHVzICA9IExJTktfVVBfQ09OVFJPTF9SRVE7Ci0Jc3RTaHV0ZG93blJlc3BvbnNlLkxlYWRlci5QTGVuZ3RoID0gODsvLzggYnl0ZXM7CisJc3RTaHV0ZG93blJlc3BvbnNlLkxlYWRlci5QTGVuZ3RoID0gODsgLyogOCBieXRlczsgKi8KIAlzdFNodXRkb3duUmVzcG9uc2Uuc3pEYXRhWzBdID0gTElOS19VUF9BQ0s7CiAJc3RTaHV0ZG93blJlc3BvbnNlLnN6RGF0YVsxXSA9IExJTktfU0hVVERPV05fUkVRX0ZST01fRklSTVdBUkU7CiAKIAkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JKipkb3duX3RyeWxvY2sgLQotCSoqIGlmIFsgc2VtYXBob3JlIGlzIGF2YWlsYWJsZSBdCi0JKioJCSBhY3F1aXJlIHNlbWFwaG9uZSBhbmQgcmV0dXJuIHZhbHVlIDAgOwotCSoqICAgZWxzZQotCSoqCQkgcmV0dXJuIG5vbi16ZXJvIHZhbHVlIDsKLQkqKgotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCSAqIGRvd25fdHJ5bG9jayAtCisJICogaWYgWyBzZW1hcGhvcmUgaXMgYXZhaWxhYmxlIF0KKwkgKgkJIGFjcXVpcmUgc2VtYXBob25lIGFuZCByZXR1cm4gdmFsdWUgMCA7CisJICogICBlbHNlCisJICoJCSByZXR1cm4gbm9uLXplcm8gdmFsdWUgOworCSAqCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAJTlZNQWNjZXNzID0gZG93bl90cnlsb2NrKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKKwlsb3dQd3JBYm9ydE1zZyA9IGRvd25fdHJ5bG9jaygmQWRhcHRlci0+TG93UG93ZXJNb2RlU3luYyk7CiAKLQlsb3dQd3JBYm9ydE1zZz0gZG93bl90cnlsb2NrKCZBZGFwdGVyLT5Mb3dQb3dlck1vZGVTeW5jKTsKLQotCi0JaWYoTlZNQWNjZXNzIHx8IGxvd1B3ckFib3J0TXNnfHwgYXRvbWljX3JlYWQoJkFkYXB0ZXItPlRvdGFsUGFja2V0Q291bnQpKQotCXsKLQkJaWYoIU5WTUFjY2VzcykKKwlpZiAoTlZNQWNjZXNzIHx8IGxvd1B3ckFib3J0TXNnIHx8IGF0b21pY19yZWFkKCZBZGFwdGVyLT5Ub3RhbFBhY2tldENvdW50KSkgeworCQlpZiAoIU5WTUFjY2VzcykKIAkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKIAotCQlpZighbG93UHdyQWJvcnRNc2cpCisJCWlmICghbG93UHdyQWJvcnRNc2cpCiAJCQl1cCgmQWRhcHRlci0+TG93UG93ZXJNb2RlU3luYyk7CiAKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBNUF9TSFVURE9XTiwgREJHX0xWTF9BTEwsICJEZXZpY2UgQWNjZXNzIGlzIGdvaW5nIG9uIE5BQ0sgdGhlIFNodXQgRG93biBNT0RFXG4iKTsKLQkJc3RTaHV0ZG93blJlc3BvbnNlLnN6RGF0YVsyXSA9IFNIVVRET1dOX05BQ0tfRlJPTV9EUklWRVI7Ly9OQUNLLSBkZXZpY2UgYWNjZXNzIGlzIGdvaW5nIG9uLgorCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBNUF9TSFVURE9XTiwgREJHX0xWTF9BTEwsICJEZXZpY2UgQWNjZXNzIGlzIGdvaW5nIG9uIE5BQ0sgdGhlIFNodXQgRG93biBNT0RFXG4iKTsKKwkJc3RTaHV0ZG93blJlc3BvbnNlLnN6RGF0YVsyXSA9IFNIVVRET1dOX05BQ0tfRlJPTV9EUklWRVI7IC8qIE5BQ0stIGRldmljZSBhY2Nlc3MgaXMgZ29pbmcgb24uICovCiAJCUFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPSBGQUxTRTsKLQl9Ci0JZWxzZQotCXsKLQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBNUF9TSFVURE9XTiwgREJHX0xWTF9BTEwsICJTZW5kaW5nIFNIVVRET1dOIE1PREUgQUNLXG4iKTsKLQkJc3RTaHV0ZG93blJlc3BvbnNlLnN6RGF0YVsyXSA9IFNIVVRET1dOX0FDS19GUk9NX0RSSVZFUjsvL1NodXREb3duIEFDSworCX0gZWxzZSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE1QX1NIVVRET1dOLCBEQkdfTFZMX0FMTCwgIlNlbmRpbmcgU0hVVERPV04gTU9ERSBBQ0tcbiIpOworCQlzdFNodXRkb3duUmVzcG9uc2Uuc3pEYXRhWzJdID0gU0hVVERPV05fQUNLX0ZST01fRFJJVkVSOyAvKiBTaHV0RG93biBBQ0sgKi8KIAogCQkvKiBXYWl0IGZvciB0aGUgTEVEIHRvIFRVUk4gT0ZGIGJlZm9yZSBzZW5kaW5nIEFDSyByZXNwb25zZSAqLwotCQlpZihBZGFwdGVyLT5MRURJbmZvLmxlZF90aHJlYWRfcnVubmluZyAmIEJDTV9MRURfVEhSRUFEX1JVTk5JTkdfQUNUSVZFTFkpCi0JCXsKKwkJaWYgKEFkYXB0ZXItPkxFREluZm8ubGVkX3RocmVhZF9ydW5uaW5nICYgQkNNX0xFRF9USFJFQURfUlVOTklOR19BQ1RJVkVMWSkgewogCQkJSU5UIGlSZXRWYWwgPSAwOwogCiAJCQkvKiBXYWtlIHRoZSBMRUQgVGhyZWFkIHdpdGggTE9XUE9XRVJfTU9ERV9FTlRFUiBTdGF0ZSAqLwpAQCAtMTYyNSwyMzcgKzE0MjcsMjAwIEBACiAJCQl3YWtlX3VwKCZBZGFwdGVyLT5MRURJbmZvLm5vdGlmeV9sZWRfZXZlbnQpOwogCiAJCQkvKiBXYWl0IGZvciAxIFNFQyBmb3IgTEVEIHRvIE9GRiAqLwotCQkJaVJldFZhbCA9IHdhaXRfZXZlbnRfdGltZW91dChBZGFwdGVyLT5MRURJbmZvLmlkbGVNb2RlU3luY0V2ZW50LFwKLQkJCQlBZGFwdGVyLT5MRURJbmZvLmJJZGxlX2xlZF9vZmYsIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCQkJaVJldFZhbCA9IHdhaXRfZXZlbnRfdGltZW91dChBZGFwdGVyLT5MRURJbmZvLmlkbGVNb2RlU3luY0V2ZW50LCBBZGFwdGVyLT5MRURJbmZvLmJJZGxlX2xlZF9vZmYsIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOwogCiAJCQkvKiBJZiBUaW1lZCBPdXQgdG8gU3luYyBJRExFIE1PREUgRW50ZXIsIGRvIElETEUgbW9kZSBFeGl0IGFuZCBTZW5kIE5BQ0sgdG8gZGV2aWNlICovCi0JCQlpZihpUmV0VmFsIDw9IDApCi0JCQl7Ci0JCQkJc3RTaHV0ZG93blJlc3BvbnNlLnN6RGF0YVsxXSA9IFNIVVRET1dOX05BQ0tfRlJPTV9EUklWRVI7Ly9OQUNLLSBkZXZpY2UgYWNjZXNzIGlzIGdvaW5nIG9uLgotCisJCQlpZiAoaVJldFZhbCA8PSAwKSB7CisJCQkJc3RTaHV0ZG93blJlc3BvbnNlLnN6RGF0YVsxXSA9IFNIVVRET1dOX05BQ0tfRlJPTV9EUklWRVI7IC8qIE5BQ0stIGRldmljZSBhY2Nlc3MgaXMgZ29pbmcgb24uICovCiAJCQkJQWRhcHRlci0+RHJpdmVyU3RhdGUgPSBOT19ORVRXT1JLX0VOVFJZOwogCQkJCXdha2VfdXAoJkFkYXB0ZXItPkxFREluZm8ubm90aWZ5X2xlZF9ldmVudCk7CiAJCQl9CiAJCX0KIAotCQlpZihzdFNodXRkb3duUmVzcG9uc2Uuc3pEYXRhWzJdID09IFNIVVRET1dOX0FDS19GUk9NX0RSSVZFUikKLQkJewotCQkJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBNUF9TSFVURE9XTiwgREJHX0xWTF9BTEwsIkFDS0lORyBTSFVURE9XTiBNT0RFICEhISEhISEhISIpOworCQlpZiAoc3RTaHV0ZG93blJlc3BvbnNlLnN6RGF0YVsyXSA9PSBTSFVURE9XTl9BQ0tfRlJPTV9EUklWRVIpIHsKKwkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE1QX1NIVVRET1dOLCBEQkdfTFZMX0FMTCwgIkFDS0lORyBTSFVURE9XTiBNT0RFICEhISEhISEhISIpOwogCQkJZG93bigmQWRhcHRlci0+cmRtd3Jtc3luYyk7CiAJCQlBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID0gVFJVRTsKIAkJCXVwKCZBZGFwdGVyLT5yZG13cm1zeW5jKTsKLQkJCS8vS2lsbGluZyBhbGwgVVJCUy4KLQkJCWlmKEFkYXB0ZXItPmJEb1N1c3BlbmQgPT0gVFJVRSkKKwkJCS8qIEtpbGxpbmcgYWxsIFVSQlMuICovCisJCQlpZiAoQWRhcHRlci0+YkRvU3VzcGVuZCA9PSBUUlVFKQogCQkJCUJjbV9raWxsX2FsbF9VUkJzKChQU19JTlRFUkZBQ0VfQURBUFRFUikoQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyKSk7Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQlBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID0gRkFMU0U7CiAJCX0KIAotCQlpZighTlZNQWNjZXNzKQorCQlpZiAoIU5WTUFjY2VzcykKIAkJCXVwKCZBZGFwdGVyLT5OVk1SZG1Xcm1Mb2NrKTsKIAotCQlpZighbG93UHdyQWJvcnRNc2cpCisJCWlmICghbG93UHdyQWJvcnRNc2cpCiAJCQl1cCgmQWRhcHRlci0+TG93UG93ZXJNb2RlU3luYyk7CiAJfQotCVN0YXR1cyA9IENvcHlCdWZmZXJUb0NvbnRyb2xQYWNrZXQoQWRhcHRlciwmc3RTaHV0ZG93blJlc3BvbnNlKTsKLQlpZigoU3RhdHVzICE9IFNUQVRVU19TVUNDRVNTKSkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTVBfU0hVVERPV04sIERCR19MVkxfQUxMLCJmYWlsIHRvIHNlbmQgdGhlIElkbGUgbW9kZSBSZXF1ZXN0IFxuIik7Ci0JCUFkYXB0ZXItPmJQcmVwYXJpbmdGb3JMb3dQb3dlck1vZGUgPSBGQUxTRTsKIAorCVN0YXR1cyA9IENvcHlCdWZmZXJUb0NvbnRyb2xQYWNrZXQoQWRhcHRlciwgJnN0U2h1dGRvd25SZXNwb25zZSk7CisJaWYgKChTdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9PVEhFUlMsIE1QX1NIVVRET1dOLCBEQkdfTFZMX0FMTCwgImZhaWwgdG8gc2VuZCB0aGUgSWRsZSBtb2RlIFJlcXVlc3RcbiIpOworCQlBZGFwdGVyLT5iUHJlcGFyaW5nRm9yTG93UG93ZXJNb2RlID0gRkFMU0U7CiAJCVN0YXJ0SW50ZXJydXB0VXJiKChQU19JTlRFUkZBQ0VfQURBUFRFUikoQWRhcHRlci0+cHZJbnRlcmZhY2VBZGFwdGVyKSk7CiAJfQogfQogCi0KLXN0YXRpYyB2b2lkIEhhbmRsZVNodXREb3duTW9kZVJlcXVlc3QoUE1JTklfQURBUFRFUiBBZGFwdGVyLFBVQ0hBUiBwdWNCdWZmZXIpCitzdGF0aWMgdm9pZCBIYW5kbGVTaHV0RG93bk1vZGVSZXF1ZXN0KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgUFVDSEFSIHB1Y0J1ZmZlcikKIHsKIAlCX1VJTlQzMiB1aVJlc2V0VmFsdWUgPSAwOwogCi0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBNUF9TSFVURE9XTiwgREJHX0xWTF9BTEwsICI9PT09PlxuIik7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgTVBfU0hVVERPV04sIERCR19MVkxfQUxMLCAiPT09PT5cbiIpOwogCi0JaWYoKihwdWNCdWZmZXIrMSkgPT0gIENPTVBMRVRFX1dBS0VfVVBfTk9USUZJQ0FUSU9OX0ZSTV9GVykKLQl7CisJaWYgKCoocHVjQnVmZmVyKzEpID09ICBDT01QTEVURV9XQUtFX1VQX05PVElGSUNBVElPTl9GUk1fRlcpIHsKIAkJSGFuZGxlU2h1dERvd25Nb2RlV2FrZXVwKEFkYXB0ZXIpOwotCX0KLQllbHNlIGlmKCoocHVjQnVmZmVyKzEpID09ICBMSU5LX1NIVVRET1dOX1JFUV9GUk9NX0ZJUk1XQVJFKQotCXsKLQkJLy9UYXJnZXQgd2FudHMgdG8gZ28gdG8gU2h1dCBEb3duIE1vZGUKLQkJLy9JbnRlcmZhY2VQcmVwYXJlRm9yU2h1dGRvd24oQWRhcHRlcik7Ci0JCWlmKEFkYXB0ZXItPmNoaXBfaWQgPT0gQkNTMjIwXzIgfHwKLQkJICAgQWRhcHRlci0+Y2hpcF9pZCA9PSBCQ1MyMjBfMkJDIHx8Ci0JCSAgIEFkYXB0ZXItPmNoaXBfaWQgPT0gQkNTMjUwX0JDIHx8Ci0JCSAgIEFkYXB0ZXItPmNoaXBfaWQgPT0gQkNTMjIwXzMpCi0JCXsKLQkJCXJkbWFsdChBZGFwdGVyLEhQTV9DT05GSUdfTVNXLCAmdWlSZXNldFZhbHVlLCA0KTsKKwl9IGVsc2UgaWYgKCoocHVjQnVmZmVyKzEpID09ICBMSU5LX1NIVVRET1dOX1JFUV9GUk9NX0ZJUk1XQVJFKSB7CisJCS8qIFRhcmdldCB3YW50cyB0byBnbyB0byBTaHV0IERvd24gTW9kZSAqLworCQkvKiBJbnRlcmZhY2VQcmVwYXJlRm9yU2h1dGRvd24oQWRhcHRlcik7ICovCisJCWlmIChBZGFwdGVyLT5jaGlwX2lkID09IEJDUzIyMF8yIHx8CisJCQlBZGFwdGVyLT5jaGlwX2lkID09IEJDUzIyMF8yQkMgfHwKKwkJCUFkYXB0ZXItPmNoaXBfaWQgPT0gQkNTMjUwX0JDIHx8CisJCQlBZGFwdGVyLT5jaGlwX2lkID09IEJDUzIyMF8zKSB7CisKKwkJCXJkbWFsdChBZGFwdGVyLCBIUE1fQ09ORklHX01TVywgJnVpUmVzZXRWYWx1ZSwgNCk7CiAJCQl1aVJlc2V0VmFsdWUgfD0gKDE8PDE3KTsKIAkJCXdybWFsdChBZGFwdGVyLCBIUE1fQ09ORklHX01TVywgJnVpUmVzZXRWYWx1ZSwgNCk7CiAJCX0KIAogCQlTZW5kU2h1dE1vZGVSZXNwb25zZShBZGFwdGVyKTsKLQkJQkNNX0RFQlVHX1BSSU5UIChBZGFwdGVyLERCR19UWVBFX09USEVSUywgTVBfU0hVVERPV04sIERCR19MVkxfQUxMLCJTaHV0RG93bk1vZGVSZXNwb25zZTpOb3RpZmljYXRpb24gcmVjZWl2ZWQ6IFNlbmRpbmcgdGhlIHJlc3BvbnNlKEFjay9OYWNrKVxuIik7CisJCUJDTV9ERUJVR19QUklOVCAoQWRhcHRlciwgREJHX1RZUEVfT1RIRVJTLCBNUF9TSFVURE9XTiwgREJHX0xWTF9BTEwsICJTaHV0RG93bk1vZGVSZXNwb25zZTpOb3RpZmljYXRpb24gcmVjZWl2ZWQ6IFNlbmRpbmcgdGhlIHJlc3BvbnNlKEFjay9OYWNrKVxuIik7CiAJfQogCi0JQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsREJHX1RZUEVfT1RIRVJTLCBNUF9TSFVURE9XTiwgREJHX0xWTF9BTEwsICI8PT09PVxuIik7CisJQkNNX0RFQlVHX1BSSU5UKEFkYXB0ZXIsIERCR19UWVBFX09USEVSUywgTVBfU0hVVERPV04sIERCR19MVkxfQUxMLCAiPD09PT1cbiIpOwogCXJldHVybjsKLQogfQogCiBWT0lEIFJlc2V0Q291bnRlcnMoUE1JTklfQURBUFRFUiBBZGFwdGVyKQogewotCi0gICAJYmVjZWVtX3Byb3RvY29sX3Jlc2V0KEFkYXB0ZXIpOwotCisJYmVjZWVtX3Byb3RvY29sX3Jlc2V0KEFkYXB0ZXIpOwogCUFkYXB0ZXItPkN1cnJOdW1SZWN2RGVzY3MgPSAwOwotICAgIEFkYXB0ZXItPlByZXZOdW1SZWN2RGVzY3MgPSAwOwotICAgIEFkYXB0ZXItPkxpbmtVcFN0YXR1cyA9IDA7CisJQWRhcHRlci0+UHJldk51bVJlY3ZEZXNjcyA9IDA7CisJQWRhcHRlci0+TGlua1VwU3RhdHVzID0gMDsKIAlBZGFwdGVyLT5MaW5rU3RhdHVzID0gMDsKLSAgICBhdG9taWNfc2V0KCZBZGFwdGVyLT5jbnRybHBrdENudCwwKTsKLSAgICBhdG9taWNfc2V0ICgmQWRhcHRlci0+VG90YWxQYWNrZXRDb3VudCwwKTsKLSAgICBBZGFwdGVyLT5md19kb3dubG9hZF9kb25lPUZBTFNFOworCWF0b21pY19zZXQoJkFkYXB0ZXItPmNudHJscGt0Q250LCAwKTsKKwlhdG9taWNfc2V0KCZBZGFwdGVyLT5Ub3RhbFBhY2tldENvdW50LCAwKTsKKwlBZGFwdGVyLT5md19kb3dubG9hZF9kb25lID0gRkFMU0U7CiAJQWRhcHRlci0+TGlua1N0YXR1cyA9IDA7Ci0gICAgQWRhcHRlci0+QXV0b0xpbmtVcCA9IEZBTFNFOworCUFkYXB0ZXItPkF1dG9MaW5rVXAgPSBGQUxTRTsKIAlBZGFwdGVyLT5JZGxlTW9kZSA9IEZBTFNFOwogCUFkYXB0ZXItPmJTaHV0U3RhdHVzID0gRkFMU0U7Ci0KIH0KLVNfQ0xBU1NJRklFUl9SVUxFICpHZXRGcmFnSVBDbHNFbnRyeShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsVVNIT1JUIHVzSXBJZGVudGlmaWNhdGlvbixVTE9ORyBTcmNJUCkKKworU19DTEFTU0lGSUVSX1JVTEUgKkdldEZyYWdJUENsc0VudHJ5KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgVVNIT1JUIHVzSXBJZGVudGlmaWNhdGlvbiwgVUxPTkcgU3JjSVApCiB7Ci0JVUlOVCB1aUluZGV4PTA7Ci0JZm9yKHVpSW5kZXg9MDt1aUluZGV4PE1BWF9GUkFHTUVOVEVESVBfQ0xBU1NJRklDQVRJT05fRU5UUklFUzt1aUluZGV4KyspCi0JewotCQlpZigoQWRhcHRlci0+YXN0RnJhZ21lbnRlZFBrdENsYXNzaWZpZXJUYWJsZVt1aUluZGV4XS5iVXNlZCkmJgotCQkJKEFkYXB0ZXItPmFzdEZyYWdtZW50ZWRQa3RDbGFzc2lmaWVyVGFibGVbdWlJbmRleF0udXNJcElkZW50aWZpY2F0aW9uID09IHVzSXBJZGVudGlmaWNhdGlvbikmJgotCQkJKEFkYXB0ZXItPmFzdEZyYWdtZW50ZWRQa3RDbGFzc2lmaWVyVGFibGVbdWlJbmRleF0udWxTcmNJcEFkZHJlc3M9PSBTcmNJUCkmJgorCVVJTlQgdWlJbmRleCA9IDA7CisJZm9yICh1aUluZGV4ID0gMDsgdWlJbmRleCA8IE1BWF9GUkFHTUVOVEVESVBfQ0xBU1NJRklDQVRJT05fRU5UUklFUzsgdWlJbmRleCsrKSB7CisJCWlmICgoQWRhcHRlci0+YXN0RnJhZ21lbnRlZFBrdENsYXNzaWZpZXJUYWJsZVt1aUluZGV4XS5iVXNlZCkgJiYKKwkJCShBZGFwdGVyLT5hc3RGcmFnbWVudGVkUGt0Q2xhc3NpZmllclRhYmxlW3VpSW5kZXhdLnVzSXBJZGVudGlmaWNhdGlvbiA9PSB1c0lwSWRlbnRpZmljYXRpb24pICYmCisJCQkoQWRhcHRlci0+YXN0RnJhZ21lbnRlZFBrdENsYXNzaWZpZXJUYWJsZVt1aUluZGV4XS51bFNyY0lwQWRkcmVzcyA9PSBTcmNJUCkgJiYKIAkJCSFBZGFwdGVyLT5hc3RGcmFnbWVudGVkUGt0Q2xhc3NpZmllclRhYmxlW3VpSW5kZXhdLmJPdXRPZk9yZGVyRnJhZ21lbnQpCisKIAkJCXJldHVybiBBZGFwdGVyLT5hc3RGcmFnbWVudGVkUGt0Q2xhc3NpZmllclRhYmxlW3VpSW5kZXhdLnBzdE1hdGNoZWRDbGFzc2lmaWVyRW50cnk7CiAJfQogCXJldHVybiBOVUxMOwogfQogCi12b2lkIEFkZEZyYWdJUENsc0VudHJ5KFBNSU5JX0FEQVBURVIgQWRhcHRlcixQU19GUkFHTUVOVEVEX1BBQ0tFVF9JTkZPIHBzRnJhZ1BrdEluZm8pCit2b2lkIEFkZEZyYWdJUENsc0VudHJ5KFBNSU5JX0FEQVBURVIgQWRhcHRlciwgUFNfRlJBR01FTlRFRF9QQUNLRVRfSU5GTyBwc0ZyYWdQa3RJbmZvKQogewotCVVJTlQgdWlJbmRleD0wOwotCWZvcih1aUluZGV4PTA7dWlJbmRleDxNQVhfRlJBR01FTlRFRElQX0NMQVNTSUZJQ0FUSU9OX0VOVFJJRVM7dWlJbmRleCsrKQotCXsKLQkJaWYoIUFkYXB0ZXItPmFzdEZyYWdtZW50ZWRQa3RDbGFzc2lmaWVyVGFibGVbdWlJbmRleF0uYlVzZWQpCi0JCXsKLQkJCW1lbWNweSgmQWRhcHRlci0+YXN0RnJhZ21lbnRlZFBrdENsYXNzaWZpZXJUYWJsZVt1aUluZGV4XSxwc0ZyYWdQa3RJbmZvLHNpemVvZihTX0ZSQUdNRU5URURfUEFDS0VUX0lORk8pKTsKKwlVSU5UIHVpSW5kZXggPSAwOworCWZvciAodWlJbmRleCA9IDA7IHVpSW5kZXggPCBNQVhfRlJBR01FTlRFRElQX0NMQVNTSUZJQ0FUSU9OX0VOVFJJRVM7IHVpSW5kZXgrKykgeworCQlpZiAoIUFkYXB0ZXItPmFzdEZyYWdtZW50ZWRQa3RDbGFzc2lmaWVyVGFibGVbdWlJbmRleF0uYlVzZWQpIHsKKwkJCW1lbWNweSgmQWRhcHRlci0+YXN0RnJhZ21lbnRlZFBrdENsYXNzaWZpZXJUYWJsZVt1aUluZGV4XSwgcHNGcmFnUGt0SW5mbywgc2l6ZW9mKFNfRlJBR01FTlRFRF9QQUNLRVRfSU5GTykpOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0KIH0KIAotdm9pZCBEZWxGcmFnSVBDbHNFbnRyeShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsVVNIT1JUIHVzSXBJZGVudGlmaWNhdGlvbixVTE9ORyBTcmNJcCkKK3ZvaWQgRGVsRnJhZ0lQQ2xzRW50cnkoUE1JTklfQURBUFRFUiBBZGFwdGVyLCBVU0hPUlQgdXNJcElkZW50aWZpY2F0aW9uLCBVTE9ORyBTcmNJcCkKIHsKLQlVSU5UIHVpSW5kZXg9MDsKLQlmb3IodWlJbmRleD0wO3VpSW5kZXg8TUFYX0ZSQUdNRU5URURJUF9DTEFTU0lGSUNBVElPTl9FTlRSSUVTO3VpSW5kZXgrKykKLQl7Ci0JCWlmKChBZGFwdGVyLT5hc3RGcmFnbWVudGVkUGt0Q2xhc3NpZmllclRhYmxlW3VpSW5kZXhdLmJVc2VkKSYmCi0JCQkoQWRhcHRlci0+YXN0RnJhZ21lbnRlZFBrdENsYXNzaWZpZXJUYWJsZVt1aUluZGV4XS51c0lwSWRlbnRpZmljYXRpb24gPT0gdXNJcElkZW50aWZpY2F0aW9uKSYmCi0JCQkoQWRhcHRlci0+YXN0RnJhZ21lbnRlZFBrdENsYXNzaWZpZXJUYWJsZVt1aUluZGV4XS51bFNyY0lwQWRkcmVzcz09IFNyY0lwKSkKLQkJbWVtc2V0KCZBZGFwdGVyLT5hc3RGcmFnbWVudGVkUGt0Q2xhc3NpZmllclRhYmxlW3VpSW5kZXhdLDAsc2l6ZW9mKFNfRlJBR01FTlRFRF9QQUNLRVRfSU5GTykpOworCVVJTlQgdWlJbmRleCA9IDA7CisJZm9yICh1aUluZGV4ID0gMDsgdWlJbmRleCA8IE1BWF9GUkFHTUVOVEVESVBfQ0xBU1NJRklDQVRJT05fRU5UUklFUzsgdWlJbmRleCsrKSB7CisJCWlmICgoQWRhcHRlci0+YXN0RnJhZ21lbnRlZFBrdENsYXNzaWZpZXJUYWJsZVt1aUluZGV4XS5iVXNlZCkgJiYKKwkJCShBZGFwdGVyLT5hc3RGcmFnbWVudGVkUGt0Q2xhc3NpZmllclRhYmxlW3VpSW5kZXhdLnVzSXBJZGVudGlmaWNhdGlvbiA9PSB1c0lwSWRlbnRpZmljYXRpb24pICYmCisJCQkoQWRhcHRlci0+YXN0RnJhZ21lbnRlZFBrdENsYXNzaWZpZXJUYWJsZVt1aUluZGV4XS51bFNyY0lwQWRkcmVzcyA9PSBTcmNJcCkpCisKKwkJCW1lbXNldCgmQWRhcHRlci0+YXN0RnJhZ21lbnRlZFBrdENsYXNzaWZpZXJUYWJsZVt1aUluZGV4XSwgMCwgc2l6ZW9mKFNfRlJBR01FTlRFRF9QQUNLRVRfSU5GTykpOwogCX0KIH0KIAotdm9pZCB1cGRhdGVfcGVyX2NpZF9yeCAoUE1JTklfQURBUFRFUiBBZGFwdGVyKQordm9pZCB1cGRhdGVfcGVyX2NpZF9yeChQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7Ci0JVUlOVCAgcWluZGV4ID0gMDsKKwlVSU5UIHFpbmRleCA9IDA7CiAKLQlpZigoamlmZmllcyAtIEFkYXB0ZXItPmxpRHJhaW5DYWxjdWxhdGVkKSA8IFhTRUNPTkRTKQorCWlmICgoamlmZmllcyAtIEFkYXB0ZXItPmxpRHJhaW5DYWxjdWxhdGVkKSA8IFhTRUNPTkRTKQogCQlyZXR1cm47CiAKLQlmb3IocWluZGV4ID0gMDsgcWluZGV4IDwgSGlQcmlvcml0eTsgcWluZGV4KyspCi0JewotCQlpZihBZGFwdGVyLT5QYWNrSW5mb1txaW5kZXhdLnVjRGlyZWN0aW9uID09IDApCi0JCXsKKwlmb3IgKHFpbmRleCA9IDA7IHFpbmRleCA8IEhpUHJpb3JpdHk7IHFpbmRleCsrKSB7CisJCWlmIChBZGFwdGVyLT5QYWNrSW5mb1txaW5kZXhdLnVjRGlyZWN0aW9uID09IDApIHsKIAkJCUFkYXB0ZXItPlBhY2tJbmZvW3FpbmRleF0udWlDdXJyZW50UnhSYXRlID0KIAkJCQkoQWRhcHRlci0+UGFja0luZm9bcWluZGV4XS51aUN1cnJlbnRSeFJhdGUgKwotCQkJCUFkYXB0ZXItPlBhY2tJbmZvW3FpbmRleF0udWlUaGlzUGVyaW9kUnhCeXRlcykvMjsKKwkJCQkJQWRhcHRlci0+UGFja0luZm9bcWluZGV4XS51aVRoaXNQZXJpb2RSeEJ5dGVzKSAvIDI7CiAKIAkJCUFkYXB0ZXItPlBhY2tJbmZvW3FpbmRleF0udWlUaGlzUGVyaW9kUnhCeXRlcyA9IDA7Ci0JCX0KLQkJZWxzZQotCQl7CisJCX0gZWxzZSB7CiAJCQlBZGFwdGVyLT5QYWNrSW5mb1txaW5kZXhdLnVpQ3VycmVudERyYWluUmF0ZSA9CiAJCQkJKEFkYXB0ZXItPlBhY2tJbmZvW3FpbmRleF0udWlDdXJyZW50RHJhaW5SYXRlICsKLQkJCQlBZGFwdGVyLT5QYWNrSW5mb1txaW5kZXhdLnVpVGhpc1BlcmlvZFNlbnRCeXRlcykvMjsKLQotCQkJQWRhcHRlci0+UGFja0luZm9bcWluZGV4XS51aVRoaXNQZXJpb2RTZW50Qnl0ZXM9MDsKKwkJCQkJQWRhcHRlci0+UGFja0luZm9bcWluZGV4XS51aVRoaXNQZXJpb2RTZW50Qnl0ZXMpIC8gMjsKKwkJCUFkYXB0ZXItPlBhY2tJbmZvW3FpbmRleF0udWlUaGlzUGVyaW9kU2VudEJ5dGVzID0gMDsKIAkJfQogCX0KLQlBZGFwdGVyLT5saURyYWluQ2FsY3VsYXRlZD1qaWZmaWVzOworCUFkYXB0ZXItPmxpRHJhaW5DYWxjdWxhdGVkID0gamlmZmllczsKIH0KLXZvaWQgdXBkYXRlX3Blcl9zZl9kZXNjX2NudHMoIFBNSU5JX0FEQVBURVIgQWRhcHRlcikKKwordm9pZCB1cGRhdGVfcGVyX3NmX2Rlc2NfY250cyhQTUlOSV9BREFQVEVSIEFkYXB0ZXIpCiB7CiAJSU5UIGlJbmRleCA9IDA7CiAJdTMyIHVpYnVmZltNQVhfVEFSR0VUX0RTWF9CVUZGRVJTXTsKIAotCWlmKCFhdG9taWNfcmVhZCAoJkFkYXB0ZXItPnVpTUJ1cGRhdGUpKQorCWlmICghYXRvbWljX3JlYWQoJkFkYXB0ZXItPnVpTUJ1cGRhdGUpKQogCQlyZXR1cm47CiAKLQlpZihyZG1hbHRXaXRoTG9jayhBZGFwdGVyLCBUQVJHRVRfU0ZJRF9UWERFU0NfTUFQX0xPQywgKFBVSU5UKXVpYnVmZiwgc2l6ZW9mKFVJTlQpICogTUFYX1RBUkdFVF9EU1hfQlVGRkVSUyk8MCkKLQl7Ci0JCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwgInJkbSBmYWlsZWRcbiIpOworCWlmIChyZG1hbHRXaXRoTG9jayhBZGFwdGVyLCBUQVJHRVRfU0ZJRF9UWERFU0NfTUFQX0xPQywgKFBVSU5UKXVpYnVmZiwgc2l6ZW9mKFVJTlQpICogTUFYX1RBUkdFVF9EU1hfQlVGRkVSUykgPCAwKSB7CisJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLCBEQkdfVFlQRV9QUklOVEssIDAsIDAsICJyZG0gZmFpbGVkXG4iKTsKIAkJcmV0dXJuOwogCX0KLQlmb3IoaUluZGV4ID0gMDtpSW5kZXggPCBIaVByaW9yaXR5OyBpSW5kZXgrKykKLQl7Ci0JCWlmKEFkYXB0ZXItPlBhY2tJbmZvW2lJbmRleF0uYlZhbGlkICYmIEFkYXB0ZXItPlBhY2tJbmZvW2lJbmRleF0udWNEaXJlY3Rpb24pCi0JCXsKLQkJCWlmKEFkYXB0ZXItPlBhY2tJbmZvW2lJbmRleF0udXNWQ0lEX1ZhbHVlIDwgTUFYX1RBUkdFVF9EU1hfQlVGRkVSUykKLQkJCXsKKworCWZvciAoaUluZGV4ID0gMDsgaUluZGV4IDwgSGlQcmlvcml0eTsgaUluZGV4KyspIHsKKwkJaWYgKEFkYXB0ZXItPlBhY2tJbmZvW2lJbmRleF0uYlZhbGlkICYmIEFkYXB0ZXItPlBhY2tJbmZvW2lJbmRleF0udWNEaXJlY3Rpb24pIHsKKwkJCWlmIChBZGFwdGVyLT5QYWNrSW5mb1tpSW5kZXhdLnVzVkNJRF9WYWx1ZSA8IE1BWF9UQVJHRVRfRFNYX0JVRkZFUlMpCiAJCQkJYXRvbWljX3NldCgmQWRhcHRlci0+UGFja0luZm9baUluZGV4XS51aVBlclNGVHhSZXNvdXJjZUNvdW50LCB1aWJ1ZmZbQWRhcHRlci0+UGFja0luZm9baUluZGV4XS51c1ZDSURfVmFsdWVdKTsKLQkJCX0KIAkJCWVsc2UKLQkJCXsKLQkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsICJJbnZhbGlkIFZDSUQgOiAleCBcbiIsCi0JCQkJCUFkYXB0ZXItPlBhY2tJbmZvW2lJbmRleF0udXNWQ0lEX1ZhbHVlKTsKLQkJCX0KKwkJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlciwgREJHX1RZUEVfUFJJTlRLLCAwLCAwLCAiSW52YWxpZCBWQ0lEIDogJXhcbiIsIEFkYXB0ZXItPlBhY2tJbmZvW2lJbmRleF0udXNWQ0lEX1ZhbHVlKTsKIAkJfQogCX0KLQlhdG9taWNfc2V0ICgmQWRhcHRlci0+dWlNQnVwZGF0ZSwgRkFMU0UpOworCWF0b21pY19zZXQoJkFkYXB0ZXItPnVpTUJ1cGRhdGUsIEZBTFNFKTsKIH0KIAogdm9pZCBmbHVzaF9xdWV1ZShQTUlOSV9BREFQVEVSIEFkYXB0ZXIsIFVJTlQgaVFJbmRleCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiogCQkJUGFja2V0VG9Ecm9wPU5VTEw7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMqCQluZXRzdGF0cyA9ICZBZGFwdGVyLT5kZXYtPnN0YXRzOwotCisJc3RydWN0IHNrX2J1ZmYgKlBhY2tldFRvRHJvcCA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm5ldHN0YXRzID0gJkFkYXB0ZXItPmRldi0+c3RhdHM7CiAJc3Bpbl9sb2NrX2JoKCZBZGFwdGVyLT5QYWNrSW5mb1tpUUluZGV4XS5TRlF1ZXVlTG9jayk7CiAKLQl3aGlsZShBZGFwdGVyLT5QYWNrSW5mb1tpUUluZGV4XS5GaXJzdFR4UXVldWUgJiYKLQkJYXRvbWljX3JlYWQoJkFkYXB0ZXItPlRvdGFsUGFja2V0Q291bnQpKQotCXsKKwl3aGlsZSAoQWRhcHRlci0+UGFja0luZm9baVFJbmRleF0uRmlyc3RUeFF1ZXVlICYmIGF0b21pY19yZWFkKCZBZGFwdGVyLT5Ub3RhbFBhY2tldENvdW50KSkgewogCQlQYWNrZXRUb0Ryb3AgPSBBZGFwdGVyLT5QYWNrSW5mb1tpUUluZGV4XS5GaXJzdFR4UXVldWU7Ci0JCWlmKFBhY2tldFRvRHJvcCAmJiBQYWNrZXRUb0Ryb3AtPmxlbikKLQkJeworCQlpZiAoUGFja2V0VG9Ecm9wICYmIFBhY2tldFRvRHJvcC0+bGVuKSB7CiAJCQluZXRzdGF0cy0+dHhfZHJvcHBlZCsrOwotCQkJREVRVUVVRVBBQ0tFVChBZGFwdGVyLT5QYWNrSW5mb1tpUUluZGV4XS5GaXJzdFR4UXVldWUsIFwKLQkJCQkJQWRhcHRlci0+UGFja0luZm9baVFJbmRleF0uTGFzdFR4UXVldWUpOwotCisJCQlERVFVRVVFUEFDS0VUKEFkYXB0ZXItPlBhY2tJbmZvW2lRSW5kZXhdLkZpcnN0VHhRdWV1ZSwgQWRhcHRlci0+UGFja0luZm9baVFJbmRleF0uTGFzdFR4UXVldWUpOwogCQkJQWRhcHRlci0+UGFja0luZm9baVFJbmRleF0udWlDdXJyZW50UGFja2V0c09uSG9zdC0tOwogCQkJQWRhcHRlci0+UGFja0luZm9baVFJbmRleF0udWlDdXJyZW50Qnl0ZXNPbkhvc3QgLT0gUGFja2V0VG9Ecm9wLT5sZW47CiAKLQkJCS8vQWRkaW5nIGRyb3BwZWQgc3RhdGlzdGljcworCQkJLyogQWRkaW5nIGRyb3BwZWQgc3RhdGlzdGljcyAqLwogCQkJQWRhcHRlci0+UGFja0luZm9baVFJbmRleF0udWlEcm9wcGVkQ291bnRCeXRlcyArPSBQYWNrZXRUb0Ryb3AtPmxlbjsKIAkJCUFkYXB0ZXItPlBhY2tJbmZvW2lRSW5kZXhdLnVpRHJvcHBlZENvdW50UGFja2V0cysrOwotCiAJCQlkZXZfa2ZyZWVfc2tiKFBhY2tldFRvRHJvcCk7CiAJCQlhdG9taWNfZGVjKCZBZGFwdGVyLT5Ub3RhbFBhY2tldENvdW50KTsKIAkJfQogCX0KIAlzcGluX3VubG9ja19iaCgmQWRhcHRlci0+UGFja0luZm9baVFJbmRleF0uU0ZRdWV1ZUxvY2spOwotCiB9CiAKLXN0YXRpYyB2b2lkIGJlY2VlbV9wcm90b2NvbF9yZXNldCAoUE1JTklfQURBUFRFUiBBZGFwdGVyKQorc3RhdGljIHZvaWQgYmVjZWVtX3Byb3RvY29sX3Jlc2V0KFBNSU5JX0FEQVBURVIgQWRhcHRlcikKIHsKIAlpbnQgaTsKLQogCWlmIChuZXRpZl9tc2dfbGluayhBZGFwdGVyKSkKIAkJcHJfbm90aWNlKFBGWCAiJXM6IHByb3RvY29sIHJlc2V0XG4iLCBBZGFwdGVyLT5kZXYtPm5hbWUpOwogCkBAIC0xODY0LDMyICsxNjI5LDIyIEBACiAKIAlBZGFwdGVyLT5JZGxlTW9kZSA9IEZBTFNFOwogCUFkYXB0ZXItPkxpbmtVcFN0YXR1cyA9IEZBTFNFOwotCUNsZWFyVGFyZ2V0RFNYQnVmZmVyKEFkYXB0ZXIsMCwgVFJVRSk7Ci0JLy9EZWxldGUgQWxsIENsYXNzaWZpZXIgUnVsZXMKKwlDbGVhclRhcmdldERTWEJ1ZmZlcihBZGFwdGVyLCAwLCBUUlVFKTsKKwkvKiBEZWxldGUgQWxsIENsYXNzaWZpZXIgUnVsZXMgKi8KIAotCWZvcihpID0gMDtpPEhpUHJpb3JpdHk7aSsrKQotCXsKLQkJRGVsZXRlQWxsQ2xhc3NpZmllcnNGb3JTRihBZGFwdGVyLGkpOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgSGlQcmlvcml0eTsgaSsrKQorCQlEZWxldGVBbGxDbGFzc2lmaWVyc0ZvclNGKEFkYXB0ZXIsIGkpOwogCiAJZmx1c2hfYWxsX3F1ZXVlcyhBZGFwdGVyKTsKIAotCWlmKEFkYXB0ZXItPlRpbWVyQWN0aXZlID09IFRSVUUpCisJaWYgKEFkYXB0ZXItPlRpbWVyQWN0aXZlID09IFRSVUUpCiAJCUFkYXB0ZXItPlRpbWVyQWN0aXZlID0gRkFMU0U7CiAKLQltZW1zZXQoQWRhcHRlci0+YXN0RnJhZ21lbnRlZFBrdENsYXNzaWZpZXJUYWJsZSwgMCwKLQkgICAgICAgc2l6ZW9mKFNfRlJBR01FTlRFRF9QQUNLRVRfSU5GTykgKiBNQVhfRlJBR01FTlRFRElQX0NMQVNTSUZJQ0FUSU9OX0VOVFJJRVMpOworCW1lbXNldChBZGFwdGVyLT5hc3RGcmFnbWVudGVkUGt0Q2xhc3NpZmllclRhYmxlLCAwLCBzaXplb2YoU19GUkFHTUVOVEVEX1BBQ0tFVF9JTkZPKSAqIE1BWF9GUkFHTUVOVEVESVBfQ0xBU1NJRklDQVRJT05fRU5UUklFUyk7CiAKLQlmb3IoaSA9IDA7aTxIaVByaW9yaXR5O2krKykKLQl7Ci0JCS8vcmVzZXR0aW5nIG9ubHkgdGhlIGZpcnN0IHNpemUgKFNfTUlCU19TRVJWSUNFRkxPV19UQUJMRSkgZm9yIHRoZSBTRi4KLQkJLy8gSXQgaXMgc2FtZSBiZXR3ZWVuIE1JQnMgYW5kIFNGLgotCQltZW1zZXQoJkFkYXB0ZXItPlBhY2tJbmZvW2ldLnN0TWlic0V4dFNlcnZpY2VGbG93VGFibGUsCi0JCSAgICAgICAwLCBzaXplb2YoU19NSUJTX0VYVFNFUlZJQ0VGTE9XX1BBUkFNRVRFUlMpKTsKKwlmb3IgKGkgPSAwOyBpIDwgSGlQcmlvcml0eTsgaSsrKSB7CisJCS8qIHJlc2V0dGluZyBvbmx5IHRoZSBmaXJzdCBzaXplIChTX01JQlNfU0VSVklDRUZMT1dfVEFCTEUpIGZvciB0aGUgU0YuICovCisJCS8qIEl0IGlzIHNhbWUgYmV0d2VlbiBNSUJzIGFuZCBTRi4gKi8KKwkJbWVtc2V0KCZBZGFwdGVyLT5QYWNrSW5mb1tpXS5zdE1pYnNFeHRTZXJ2aWNlRmxvd1RhYmxlLCAwLCBzaXplb2YoU19NSUJTX0VYVFNFUlZJQ0VGTE9XX1BBUkFNRVRFUlMpKTsKIAl9CiB9Ci0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JjbS9oZWFkZXJzLmggYi9kcml2ZXJzL3N0YWdpbmcvYmNtL2hlYWRlcnMuaAppbmRleCA5NDdkMDYzLi5kYTQ3ZGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL2hlYWRlcnMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvYmNtL2hlYWRlcnMuaApAQCAtNzQsNCArNzQsNiBAQAogI2RlZmluZSBEUlZfVkVSU0lPTglWRVJfRklMRVZFUlNJT05fU1RSCiAjZGVmaW5lIFBGWAkJRFJWX05BTUUgIiAiCiAKK2V4dGVybiBzdHJ1Y3QgY2xhc3MgKmJjbV9jbGFzczsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYmNtL252bS5jIGIvZHJpdmVycy9zdGFnaW5nL2JjbS9udm0uYwppbmRleCA0ZGE1YjdiLi4zZGUwZGFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYmNtL252bS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9iY20vbnZtLmMKQEAgLTQwMTMsNyArNDAxMyw4IEBACiAJCWlmKHVpVG90YWxEYXRhVG9Db3B5IDwgSVNPTGVuZ3RoKQogCQl7CiAJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsImVycm9yIGFzIFNvdXJjZSBJU08gU2VjdGlvbiBkb2VzIG5vdCBoYXZlIHZhbGlkIHNpZ25hdHVyZSIpOwotCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCQkJU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisJCQlnb3RvIG91dDsKIAkJfQogCiAJCXVpVG90YWxEYXRhVG9Db3B5ID0oQWRhcHRlci0+cHNGbGFzaDJ4Q1NJbmZvLT5PZmZzZXRJU09JbWFnZTJQYXJ0MUVuZCkgLQpAQCAtNDAyNiw3ICs0MDI3LDggQEAKIAkJaWYodWlUb3RhbERhdGFUb0NvcHkgPCBJU09MZW5ndGgpCiAJCXsKIAkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiZXJyb3IgYXMgRGVzdCBJU08gU2VjdGlvbiBkb2VzIG5vdCBoYXZlIGVub3VnaCBzZWN0aW9uIHNpemUiKTsKLQkJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKKwkJCVN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCQkJZ290byBvdXQ7CiAJCX0KIAogCQl1aVRvdGFsRGF0YVRvQ29weSA9IElTT0xlbmd0aDsKQEAgLTQxNDMsNyArNDE0NSw4IEBACiAJCWlmKHVpVG90YWxEYXRhVG9Db3B5IDwgSVNPTGVuZ3RoKQogCQl7CiAJCQlCQ01fREVCVUdfUFJJTlQoQWRhcHRlcixEQkdfVFlQRV9QUklOVEssIDAsIDAsImVycm9yIGFzIFNvdXJjZSBJU08gU2VjdGlvbiBkb2VzIG5vdCBoYXZlIHZhbGlkIHNpZ25hdHVyZSIpOwotCQkJcmV0dXJuIFNUQVRVU19GQUlMVVJFOworCQkJU3RhdHVzID0gU1RBVFVTX0ZBSUxVUkU7CisJCQlnb3RvIG91dDsKIAkJfQogCiAJCXVpVG90YWxEYXRhVG9Db3B5ID0oQWRhcHRlci0+cHNGbGFzaDJ4Q1NJbmZvLT5PZmZzZXRJU09JbWFnZTFQYXJ0MUVuZCkgLQpAQCAtNDE1Niw3ICs0MTU5LDggQEAKIAkJaWYodWlUb3RhbERhdGFUb0NvcHkgPCBJU09MZW5ndGgpCiAJCXsKIAkJCUJDTV9ERUJVR19QUklOVChBZGFwdGVyLERCR19UWVBFX1BSSU5USywgMCwgMCwiZXJyb3IgYXMgRGVzdCBJU08gU2VjdGlvbiBkb2VzIG5vdCBoYXZlIGVub3VnaCBzZWN0aW9uIHNpemUiKTsKLQkJCXJldHVybiBTVEFUVVNfRkFJTFVSRTsKKwkJCVN0YXR1cyA9IFNUQVRVU19GQUlMVVJFOworCQkJZ290byBvdXQ7CiAJCX0KIAogCQl1aVRvdGFsRGF0YVRvQ29weSA9IElTT0xlbmd0aDsKQEAgLTQyNTcsNiArNDI2MSw3IEBACiAKIAl9CiAKK291dDoKIAlrZnJlZShCdWZmKTsKIAogCXJldHVybiBTdGF0dXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL0tjb25maWcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OWNmMTYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9LY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotY29uZmlnIEJSQ01VVElMCi0JdHJpc3RhdGUKLQlkZWZhdWx0IG4KLQotY29uZmlnIEJSQ01TTUFDCi0JdHJpc3RhdGUgIkJyb2FkY29tIElFRUU4MDIuMTFuIFBDSWUgU29mdE1BQyBXTEFOIGRyaXZlciIKLQlkZWZhdWx0IG4KLQlkZXBlbmRzIG9uIFBDSQotCWRlcGVuZHMgb24gV0xBTiAmJiBNQUM4MDIxMQotCWRlcGVuZHMgb24gWDg2IHx8IE1JUFMKLQlzZWxlY3QgQlJDTVVUSUwKLQlzZWxlY3QgRldfTE9BREVSCi0Jc2VsZWN0IENSQ19DQ0lUVAotCS0tLWhlbHAtLS0KLQkgIFRoaXMgbW9kdWxlIGFkZHMgc3VwcG9ydCBmb3IgUENJZSB3aXJlbGVzcyBhZGFwdGVycyBiYXNlZCBvbiBCcm9hZGNvbQotCSAgSUVFRTgwMi4xMW4gU29mdE1BQyBjaGlwc2V0cy4gIElmIHlvdSBjaG9vc2UgdG8gYnVpbGQgYSBtb2R1bGUsIGl0J2xsCi0JICBiZSBjYWxsZWQgYnJjbXNtYWMua28uCi0KLWNvbmZpZyBCUkNNRk1BQwotCXRyaXN0YXRlICJCcm9hZGNvbSBJRUVFODAyLjExbiBlbWJlZGRlZCBGdWxsTUFDIFdMQU4gZHJpdmVyIgotCWRlZmF1bHQgbgotCWRlcGVuZHMgb24gTU1DCi0JZGVwZW5kcyBvbiBXTEFOICYmIENGRzgwMjExCi0JZGVwZW5kcyBvbiBYODYgfHwgTUlQUwotCXNlbGVjdCBCUkNNVVRJTAotCXNlbGVjdCBGV19MT0FERVIKLQlzZWxlY3QgV0lSRUxFU1NfRVhUCi0Jc2VsZWN0IFdFWFRfUFJJVgotCS0tLWhlbHAtLS0KLQkgIFRoaXMgbW9kdWxlIGFkZHMgc3VwcG9ydCBmb3IgZW1iZWRkZWQgd2lyZWxlc3MgYWRhcHRlcnMgYmFzZWQgb24KLQkgIEJyb2FkY29tIElFRUU4MDIuMTFuIEZ1bGxNQUMgY2hpcHNldHMuICBUaGlzIGRyaXZlciB1c2VzIHRoZSBrZXJuZWwncwotCSAgd2lyZWxlc3MgZXh0ZW5zaW9ucyBzdWJzeXN0ZW0uICBJZiB5b3UgY2hvb3NlIHRvIGJ1aWxkIGEgbW9kdWxlLAotCSAgaXQnbGwgYmUgY2FsbGVkIGJyY21mbWFjLmtvLgotCi1jb25maWcgQlJDTURCRwotCWJvb2wgIkJyb2FkY29tIGRyaXZlciBkZWJ1ZyBmdW5jdGlvbnMiCi0JZGVmYXVsdCBuCi0JZGVwZW5kcyBvbiBCUkNNU01BQyB8fCBCUkNNRk1BQwotCS0tLWhlbHAtLS0KLQkgIFNlbGVjdGluZyB0aGlzIGVuYWJsZXMgYWRkaXRpb25hbCBjb2RlIGZvciBkZWJ1ZyBwdXJwb3Nlcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjAxZjVlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZyYWdtZW50IGZvciBCcm9hZGNvbSA4MDIuMTFuIE5ldHdvcmtpbmcgRGV2aWNlIERyaXZlcgotIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSMKLSMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0jIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSMKLSMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0jIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0jIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotIyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0jIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSMgQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotIyBjb21tb24gZmxhZ3MKLXN1YmRpci1jY2ZsYWdzLXkJCQkJCTo9IC1EQkNNRE1BMzIKLXN1YmRpci1jY2ZsYWdzLSQoQ09ORklHX0JSQ01EQkcpCSs9IC1EQkNNREJHCi0KLW9iai0kKENPTkZJR19CUkNNVVRJTCkJKz0gYnJjbXV0aWwvCi1vYmotJChDT05GSUdfQlJDTUZNQUMpCSs9IGJyY21mbWFjLwotb2JqLSQoQ09ORklHX0JSQ01TTUFDKQkrPSBicmNtc21hYy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9SRUFETUUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiODZiMWIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9SRUFETUUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1yZWZlciB0bzogaHR0cDovL2xpbnV4d2lyZWxlc3Mub3JnL2VuL3VzZXJzL0RyaXZlcnMvYnJjbTgwMjExCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL1RPRE8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZTJlZjkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9UT0RPCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotVG8gRG8gTGlzdCBmb3IgQnJvYWRjb20gTWFjODAyMTEgZHJpdmVyIGJlZm9yZSBnZXR0aW5nIGluIG1haW5saW5lCi0KLUJ1Z3MKLT09PT0KLS0gbm9uZSBrbm93biBhdCB0aGlzIG1vbWVudAotCi1icmNtZm1hYwotPT09PT09PT09PT09PT09PT09PT09Ci0tIEFTU0VSVFMgZGVwcmVjYXRlZCBpbiBtYWlubGluZSwgcmVwbGFjZSBieSB3YXJuaW5nICsgZXJyb3IgaGFuZGxpbmcKLQotYnJjbTgwMjExIGluZm8gcGFnZQotPT09PT09PT09PT09PT09PT09PT09Ci1odHRwOi8vbGludXh3aXJlbGVzcy5vcmcvZW4vdXNlcnMvRHJpdmVycy9icmNtODAyMTEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTNjODA1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZyYWdtZW50IGZvciBCcm9hZGNvbSA4MDIuMTFuIE5ldHdvcmtpbmcgRGV2aWNlIERyaXZlcgotIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSMKLSMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0jIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSMKLSMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0jIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0jIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotIyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0jIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSMgQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotY2NmbGFncy15IDo9CQkJXAotCS1EQlJDTUZfRklSU1RSRUFEPTY0CVwKLQktREJSQ01GX1NEQUxJR049NjQJXAotCS1ETUFYX0hEUl9SRUFEPTY0Ci0KLWNjZmxhZ3MtJChDT05GSUdfQlJDTURCRykJKz0gLURTSE9XX0VWRU5UUwotCi1jY2ZsYWdzLXkgKz0gXAotCS1JZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYwlcCi0JLUlkcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUKLQotREhET0ZJTEVTID0gXAotCXdsX2NmZzgwMjExLm8gXAotCWRoZF9jZGMubyBcCi0JZGhkX2NvbW1vbi5vIFwKLQlkaGRfc2Rpby5vCVwKLQlkaGRfbGludXgubyBcCi0JYmNtc2RoLm8gXAotCWJjbXNkaF9zZG1tYy5vCi0KLW9iai0kKENPTkZJR19CUkNNRk1BQykgKz0gYnJjbWZtYWMubwotYnJjbWZtYWMtb2JqcyArPSAkKERIRE9GSUxFUykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvYmNtY2hpcC5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21jaGlwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZDNhZmQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21jaGlwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDExIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfYmNtY2hpcF9oXwotI2RlZmluZSBfYmNtY2hpcF9oXwotCi0vKiBiY200MzI5ICovCi0vKiBTRElPIGRldmljZSBjb3JlLCBJRCAweDgyOSAqLwotI2RlZmluZSBCQ000MzI5X0NPUkVfQlVTX0JBU0UJCTB4MTgwMTEwMDAKLS8qIGludGVybmFsIG1lbW9yeSBjb3JlLCBJRCAweDgwZSAqLwotI2RlZmluZSBCQ000MzI5X0NPUkVfU09DUkFNX0JBU0UJMHgxODAwMzAwMAotLyogQVJNIENvcnRleCBNMyBjb3JlLCBJRCAweDgyYSAqLwotI2RlZmluZSBCQ000MzI5X0NPUkVfQVJNX0JBU0UJCTB4MTgwMDIwMDAKLSNkZWZpbmUgQkNNNDMyOV9SQU1TSVpFCQkJMHg0ODAwMAotLyogZmlybXdhcmUgbmFtZSAqLwotI2RlZmluZSBCQ000MzI5X0ZXX05BTUUJCQkiYnJjbS9iY200MzI5LWZ1bGxtYWMtNC5iaW4iCi0jZGVmaW5lIEJDTTQzMjlfTlZfTkFNRQkJCSJicmNtL2JjbTQzMjktZnVsbG1hYy00LnR4dCIKLQotI2VuZGlmCQkJCS8qIF9iY21jaGlwX2hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaC5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRlNzJlZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotLyogKioqKioqKioqKioqKioqKioqIFNESU8gQ0FSRCBJbnRlcmZhY2UgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0KLSNpbmNsdWRlIDxkZWZzLmg+Ci0jaW5jbHVkZSA8YnJjbV9od19pZHMuaD4KLSNpbmNsdWRlIDxicmNtdV91dGlscy5oPgotI2luY2x1ZGUgPGJyY211X3dpZmkuaD4KLSNpbmNsdWRlIDxzb2MuaD4KLSNpbmNsdWRlICJkaGQuaCIKLSNpbmNsdWRlICJkaGRfYnVzLmgiCi0jaW5jbHVkZSAic2Rpb19ob3N0LmgiCi0KLSNkZWZpbmUgU0RJT0hfQVBJX0FDQ0VTU19SRVRSWV9MSU1JVAkyCi0KLSNkZWZpbmUgQlJDTUZfU0RfRVJST1JfVkFMCTB4MDAwMQkvKiBFcnJvciAqLwotI2RlZmluZSBCUkNNRl9TRF9JTkZPX1ZBTAkJMHgwMDAyCS8qIEluZm8gKi8KLQotCi0jaWZkZWYgQkNNREJHCi0jZGVmaW5lIEJSQ01GX1NEX0VSUk9SKHgpIFwKLQlkbyB7IFwKLQkJaWYgKChicmNtZl9zZGlvX21zZ2xldmVsICYgQlJDTUZfU0RfRVJST1JfVkFMKSAmJiBcCi0JCSAgICBuZXRfcmF0ZWxpbWl0KCkpIFwKLQkJCXByaW50ayB4OyBcCi0JfSB3aGlsZSAoMCkKLSNkZWZpbmUgQlJDTUZfU0RfSU5GTyh4KQlcCi0JZG8geyBcCi0JCWlmICgoYnJjbWZfc2Rpb19tc2dsZXZlbCAmIEJSQ01GX1NEX0lORk9fVkFMKSAmJiBcCi0JCSAgICBuZXRfcmF0ZWxpbWl0KCkpIFwKLQkJCXByaW50ayB4OyBcCi0JfSB3aGlsZSAoMCkKLSNlbHNlCQkJCS8qIEJDTURCRyAqLwotI2RlZmluZSBCUkNNRl9TRF9FUlJPUih4KQotI2RlZmluZSBCUkNNRl9TRF9JTkZPKHgpCi0jZW5kaWYJCQkJLyogQkNNREJHICovCi0KLS8qIGRlYnVnZ2luZyBtYWNyb3MgKi8KLSNkZWZpbmUgU0RMWF9NU0coeCkKLQotI2RlZmluZSBTRElPSF9DTURfVFlQRV9OT1JNQUwgICAwCS8qIE5vcm1hbCBjb21tYW5kICovCi0jZGVmaW5lIFNESU9IX0NNRF9UWVBFX0FQUEVORCAgIDEJLyogQXBwZW5kIGNvbW1hbmQgKi8KLSNkZWZpbmUgU0RJT0hfQ01EX1RZUEVfQ1VUVEhSVSAgMgkvKiBDdXQtdGhyb3VnaCBjb21tYW5kICovCi0KLSNkZWZpbmUgU0RJT0hfREFUQV9QSU8gICAgICAgICAgMAkvKiBQSU8gbW9kZSAqLwotI2RlZmluZSBTRElPSF9EQVRBX0RNQSAgICAgICAgICAxCS8qIERNQSBtb2RlICovCi0KLXN0cnVjdCBicmNtZl9zZGlvX2NhcmQgewotCWJvb2wgaW5pdF9zdWNjZXNzOwkvKiB1bmRlcmx5aW5nIGRyaXZlciBzdWNjZXNzZnVsbHkgYXR0YWNoZWQgKi8KLQl2b2lkICpzZGlvaDsJCS8qIGhhbmRsZXIgZm9yIHNkaW9oICovCi0JdTMyIHZlbmRldmlkOwkvKiBUYXJnZXQgVmVuZG9yIGFuZCBEZXZpY2UgSUQgb24gU0QgYnVzICovCi0JYm9vbCByZWdmYWlsOwkJLyogU2F2ZSBzdGF0dXMgb2YgbGFzdAotCQkJCSByZWdfcmVhZC9yZWdfd3JpdGUgY2FsbCAqLwotCXUzMiBzYndhZDsJCS8qIFNhdmUgYmFja3BsYW5lIHdpbmRvdyBhZGRyZXNzICovCi19OwotCi0vKioKLSAqIFNESU8gSG9zdCBDb250cm9sbGVyIGluZm8KLSAqLwotc3RydWN0IHNkaW9faGMgewotCXN0cnVjdCBzZGlvX2hjICpuZXh0OwotCXN0cnVjdCBkZXZpY2UgKmRldjsJLyogcGxhdGZvcm0gZGV2aWNlIGhhbmRsZSAqLwotCXZvaWQgKnJlZ3M7CQkvKiBTRElPIEhvc3QgQ29udHJvbGxlciBhZGRyZXNzICovCi0Jc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZDsKLQl2b2lkICpjaDsKLQl1bnNpZ25lZCBpbnQgb29iX2lycTsKLQl1bnNpZ25lZCBsb25nIG9vYl9mbGFnczsJLyogT09CIEhvc3Qgc3BlY2lmaWN0aW9uCi0JCQkJCWFzIGVkZ2UgYW5kIGV0YyAqLwotCWJvb2wgb29iX2lycV9yZWdpc3RlcmVkOwotfTsKLQotLyogbG9jYWwgY29weSBvZiBiY20gc2QgaGFuZGxlciAqLwotc3RhdGljIHN0cnVjdCBicmNtZl9zZGlvX2NhcmQgKmxfY2FyZDsKLQotY29uc3QgdWludCBicmNtZl9zZGlvX21zZ2xldmVsID0gQlJDTUZfU0RfRVJST1JfVkFMOwotCi1zdGF0aWMgc3RydWN0IHNkaW9faGMgKnNkaGNpbmZvOwotCi0vKiBkcml2ZXIgaW5mbywgaW5pdGlhbGl6ZWQgd2hlbiBicmNtZl9zZGlvX3JlZ2lzdGVyIGlzIGNhbGxlZCAqLwotc3RhdGljIHN0cnVjdCBicmNtZl9zZGlvaF9kcml2ZXIgZHJ2aW5mbyA9IHsgTlVMTCwgTlVMTCB9OwotCi0vKiBNb2R1bGUgcGFyYW1ldGVycyBzcGVjaWZpYyB0byBlYWNoIGhvc3QtY29udHJvbGxlciBkcml2ZXIgKi8KLQotbW9kdWxlX3BhcmFtKHNkX21zZ2xldmVsLCB1aW50LCAwKTsKLQotZXh0ZXJuIHVpbnQgc2RfZjJfYmxvY2tzaXplOwotbW9kdWxlX3BhcmFtKHNkX2YyX2Jsb2Nrc2l6ZSwgaW50LCAwKTsKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLWludCBicmNtZl9zZGlvX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldik7Ci1FWFBPUlRfU1lNQk9MKGJyY21mX3NkaW9fcHJvYmUpOwotCi1pbnQgYnJjbWZfc2Rpb19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KTsKLUVYUE9SVF9TWU1CT0woYnJjbWZfc2Rpb19yZW1vdmUpOwotCi1zdHJ1Y3QgYnJjbWZfc2Rpb19jYXJkKgotYnJjbWZfc2RjYXJkX2F0dGFjaCh2b2lkICpjZmdoZGwsIHUzMiAqcmVnc3ZhLCB1aW50IGlycSkKLXsKLQlzdHJ1Y3QgYnJjbWZfc2Rpb19jYXJkICpjYXJkOwotCi0JY2FyZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicmNtZl9zZGlvX2NhcmQpLCBHRlBfQVRPTUlDKTsKLQlpZiAoY2FyZCA9PSBOVUxMKSB7Ci0JCUJSQ01GX1NEX0VSUk9SKCgic2RjYXJkX2F0dGFjaDogb3V0IG9mIG1lbW9yeSIpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyogc2F2ZSB0aGUgaGFuZGxlciBsb2NhbGx5ICovCi0JbF9jYXJkID0gY2FyZDsKLQotCWNhcmQtPnNkaW9oID0gYnJjbWZfc2Rpb2hfYXR0YWNoKGNmZ2hkbCwgaXJxKTsKLQlpZiAoIWNhcmQtPnNkaW9oKSB7Ci0JCWJyY21mX3NkY2FyZF9kZXRhY2goY2FyZCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWNhcmQtPmluaXRfc3VjY2VzcyA9IHRydWU7Ci0KLQkqcmVnc3ZhID0gU0lfRU5VTV9CQVNFOwotCi0JLyogUmVwb3J0IHRoZSBCQVIsIHRvIGZpeCBpZiBuZWVkZWQgKi8KLQljYXJkLT5zYndhZCA9IFNJX0VOVU1fQkFTRTsKLQlyZXR1cm4gY2FyZDsKLX0KLQotaW50IGJyY21mX3NkY2FyZF9kZXRhY2goc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCkKLXsKLQlpZiAoY2FyZCAhPSBOVUxMKSB7Ci0JCWlmIChjYXJkLT5zZGlvaCkgewotCQkJYnJjbWZfc2Rpb2hfZGV0YWNoKGNhcmQtPnNkaW9oKTsKLQkJCWNhcmQtPnNkaW9oID0gTlVMTDsKLQkJfQotCQlrZnJlZShjYXJkKTsKLQl9Ci0KLQlsX2NhcmQgPSBOVUxMOwotCXJldHVybiAwOwotfQotCi1pbnQKLWJyY21mX3NkY2FyZF9pb3Zhcl9vcChzdHJ1Y3QgYnJjbWZfc2Rpb19jYXJkICpjYXJkLCBjb25zdCBjaGFyICpuYW1lLAotCQl2b2lkICpwYXJhbXMsIGludCBwbGVuLCB2b2lkICphcmcsIGludCBsZW4sIGJvb2wgc2V0KQotewotCXJldHVybiBicmNtZl9zZGlvaF9pb3Zhcl9vcChjYXJkLT5zZGlvaCwgbmFtZSwgcGFyYW1zLCBwbGVuLCBhcmcsCi0JCQkJICAgIGxlbiwgc2V0KTsKLX0KLQotaW50IGJyY21mX3NkY2FyZF9pbnRyX2VuYWJsZShzdHJ1Y3QgYnJjbWZfc2Rpb19jYXJkICpjYXJkKQotewotCXJldHVybiBicmNtZl9zZGlvaF9pbnRlcnJ1cHRfc2V0KGNhcmQtPnNkaW9oLCB0cnVlKTsKLX0KLQotaW50IGJyY21mX3NkY2FyZF9pbnRyX2Rpc2FibGUoc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCkKLXsKLQlyZXR1cm4gYnJjbWZfc2Rpb2hfaW50ZXJydXB0X3NldChjYXJkLT5zZGlvaCwgZmFsc2UpOwotfQotCi1pbnQgYnJjbWZfc2RjYXJkX2ludHJfcmVnKHN0cnVjdCBicmNtZl9zZGlvX2NhcmQgKmNhcmQsCi0JCQkgIHZvaWQgKCpmbikodm9pZCAqKSwgdm9pZCAqYXJnaCkKLXsKLQlyZXR1cm4gYnJjbWZfc2Rpb2hfaW50ZXJydXB0X3JlZ2lzdGVyKGNhcmQtPnNkaW9oLCBmbiwgYXJnaCk7Ci19Ci0KLWludCBicmNtZl9zZGNhcmRfaW50cl9kZXJlZyhzdHJ1Y3QgYnJjbWZfc2Rpb19jYXJkICpjYXJkKQotewotCXJldHVybiBicmNtZl9zZGlvaF9pbnRlcnJ1cHRfZGVyZWdpc3RlcihjYXJkLT5zZGlvaCk7Ci19Ci0KLXU4IGJyY21mX3NkY2FyZF9jZmdfcmVhZChzdHJ1Y3QgYnJjbWZfc2Rpb19jYXJkICpjYXJkLCB1aW50IGZuY19udW0sIHUzMiBhZGRyLAotCQkJIGludCAqZXJyKQotewotCWludCBzdGF0dXM7Ci0JczMyIHJldHJ5ID0gMDsKLQl1OCBkYXRhID0gMDsKLQotCWlmICghY2FyZCkKLQkJY2FyZCA9IGxfY2FyZDsKLQotCWRvIHsKLQkJaWYgKHJldHJ5KQkvKiB3YWl0IGZvciAxIG1zIHRpbGwgYnVzIGdldCBzZXR0bGVkIGRvd24gKi8KLQkJCXVkZWxheSgxMDAwKTsKLQkJc3RhdHVzID0KLQkJICAgIGJyY21mX3NkaW9oX2NmZ19yZWFkKGNhcmQtPnNkaW9oLCBmbmNfbnVtLCBhZGRyLAotCQkJCSAgICh1OCAqKSAmZGF0YSk7Ci0JfSB3aGlsZSAoc3RhdHVzICE9IDAKLQkJICYmIChyZXRyeSsrIDwgU0RJT0hfQVBJX0FDQ0VTU19SRVRSWV9MSU1JVCkpOwotCWlmIChlcnIpCi0JCSplcnIgPSBzdGF0dXM7Ci0KLQlCUkNNRl9TRF9JTkZPKCgiJXM6ZnVuID0gJWQsIGFkZHIgPSAweCV4LCB1OGRhdGEgPSAweCV4XG4iLAotCQkgICAgIF9fZnVuY19fLCBmbmNfbnVtLCBhZGRyLCBkYXRhKSk7Ci0KLQlyZXR1cm4gZGF0YTsKLX0KLQotdm9pZAotYnJjbWZfc2RjYXJkX2NmZ193cml0ZShzdHJ1Y3QgYnJjbWZfc2Rpb19jYXJkICpjYXJkLCB1aW50IGZuY19udW0sIHUzMiBhZGRyLAotCQkgICAgICAgdTggZGF0YSwgaW50ICplcnIpCi17Ci0JaW50IHN0YXR1czsKLQlzMzIgcmV0cnkgPSAwOwotCi0JaWYgKCFjYXJkKQotCQljYXJkID0gbF9jYXJkOwotCi0JZG8gewotCQlpZiAocmV0cnkpCS8qIHdhaXQgZm9yIDEgbXMgdGlsbCBidXMgZ2V0IHNldHRsZWQgZG93biAqLwotCQkJdWRlbGF5KDEwMDApOwotCQlzdGF0dXMgPQotCQkgICAgYnJjbWZfc2Rpb2hfY2ZnX3dyaXRlKGNhcmQtPnNkaW9oLCBmbmNfbnVtLCBhZGRyLAotCQkJCSAgICAodTggKikgJmRhdGEpOwotCX0gd2hpbGUgKHN0YXR1cyAhPSAwCi0JCSAmJiAocmV0cnkrKyA8IFNESU9IX0FQSV9BQ0NFU1NfUkVUUllfTElNSVQpKTsKLQlpZiAoZXJyKQotCQkqZXJyID0gc3RhdHVzOwotCi0JQlJDTUZfU0RfSU5GTygoIiVzOmZ1biA9ICVkLCBhZGRyID0gMHgleCwgdThkYXRhID0gMHgleFxuIiwKLQkJICAgICBfX2Z1bmNfXywgZm5jX251bSwgYWRkciwgZGF0YSkpOwotfQotCi11MzIgYnJjbWZfc2RjYXJkX2NmZ19yZWFkX3dvcmQoc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCwgdWludCBmbmNfbnVtLAotCQkJICAgICAgIHUzMiBhZGRyLCBpbnQgKmVycikKLXsKLQlpbnQgc3RhdHVzOwotCXUzMiBkYXRhID0gMDsKLQotCWlmICghY2FyZCkKLQkJY2FyZCA9IGxfY2FyZDsKLQotCXN0YXR1cyA9IGJyY21mX3NkaW9oX3JlcXVlc3Rfd29yZChjYXJkLT5zZGlvaCwgU0RJT0hfQ01EX1RZUEVfTk9STUFMLAotCQlTRElPSF9SRUFELCBmbmNfbnVtLCBhZGRyLCAmZGF0YSwgNCk7Ci0KLQlpZiAoZXJyKQotCQkqZXJyID0gc3RhdHVzOwotCi0JQlJDTUZfU0RfSU5GTygoIiVzOmZ1biA9ICVkLCBhZGRyID0gMHgleCwgdTMyZGF0YSA9IDB4JXhcbiIsCi0JCSAgICAgX19mdW5jX18sIGZuY19udW0sIGFkZHIsIGRhdGEpKTsKLQotCXJldHVybiBkYXRhOwotfQotCi12b2lkCi1icmNtZl9zZGNhcmRfY2ZnX3dyaXRlX3dvcmQoc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCwgdWludCBmbmNfbnVtLAotCQkJICAgIHUzMiBhZGRyLCB1MzIgZGF0YSwgaW50ICplcnIpCi17Ci0JaW50IHN0YXR1czsKLQotCWlmICghY2FyZCkKLQkJY2FyZCA9IGxfY2FyZDsKLQotCXN0YXR1cyA9Ci0JICAgIGJyY21mX3NkaW9oX3JlcXVlc3Rfd29yZChjYXJkLT5zZGlvaCwgU0RJT0hfQ01EX1RZUEVfTk9STUFMLAotCQkJICAgICAgIFNESU9IX1dSSVRFLCBmbmNfbnVtLCBhZGRyLCAmZGF0YSwgNCk7Ci0KLQlpZiAoZXJyKQotCQkqZXJyID0gc3RhdHVzOwotCi0JQlJDTUZfU0RfSU5GTygoIiVzOmZ1biA9ICVkLCBhZGRyID0gMHgleCwgdTMyZGF0YSA9IDB4JXhcbiIsCi0JCSAgICAgX19mdW5jX18sIGZuY19udW0sIGFkZHIsIGRhdGEpKTsKLX0KLQotaW50IGJyY21mX3NkY2FyZF9jaXNfcmVhZChzdHJ1Y3QgYnJjbWZfc2Rpb19jYXJkICpjYXJkLCB1aW50IGZ1bmMsIHU4ICogY2lzLAotCQkJICB1aW50IGxlbmd0aCkKLXsKLQlpbnQgc3RhdHVzOwotCi0JdTggKnRtcF9idWYsICp0bXBfcHRyOwotCXU4ICpwdHI7Ci0JYm9vbCBhc2NpaSA9IGZ1bmMgJiB+MHhmOwotCWZ1bmMgJj0gMHg3OwotCi0JaWYgKCFjYXJkKQotCQljYXJkID0gbF9jYXJkOwotCi0Jc3RhdHVzID0gYnJjbWZfc2Rpb2hfY2lzX3JlYWQoY2FyZC0+c2Rpb2gsIGZ1bmMsIGNpcywgbGVuZ3RoKTsKLQotCWlmIChhc2NpaSkgewotCQkvKiBNb3ZlIGJpbmFyeSBiaXRzIHRvIHRtcCBhbmQgZm9ybWF0IHRoZW0KLQkJCSBpbnRvIHRoZSBwcm92aWRlZCBidWZmZXIuICovCi0JCXRtcF9idWYgPSBrbWFsbG9jKGxlbmd0aCwgR0ZQX0FUT01JQyk7Ci0JCWlmICh0bXBfYnVmID09IE5VTEwpIHsKLQkJCUJSQ01GX1NEX0VSUk9SKCgiJXM6IG91dCBvZiBtZW1vcnlcbiIsIF9fZnVuY19fKSk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQltZW1jcHkodG1wX2J1ZiwgY2lzLCBsZW5ndGgpOwotCQlmb3IgKHRtcF9wdHIgPSB0bXBfYnVmLCBwdHIgPSBjaXM7IHB0ciA8IChjaXMgKyBsZW5ndGggLSA0KTsKLQkJICAgICB0bXBfcHRyKyspIHsKLQkJCXB0ciArPSBzcHJpbnRmKChjaGFyICopcHRyLCAiJS4yeCAiLCAqdG1wX3B0ciAmIDB4ZmYpOwotCQkJaWYgKCgoKHRtcF9wdHIgLSB0bXBfYnVmKSArIDEpICYgMHhmKSA9PSAwKQotCQkJCXB0ciArPSBzcHJpbnRmKChjaGFyICopcHRyLCAiXG4iKTsKLQkJfQotCQlrZnJlZSh0bXBfYnVmKTsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW50Ci1icmNtZl9zZGNhcmRfc2V0X3NiYWRkcl93aW5kb3coc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCwgdTMyIGFkZHJlc3MpCi17Ci0JaW50IGVyciA9IDA7Ci0JYnJjbWZfc2RjYXJkX2NmZ193cml0ZShjYXJkLCBTRElPX0ZVTkNfMSwgU0JTRElPX0ZVTkMxX1NCQUREUkxPVywKLQkJCSAoYWRkcmVzcyA+PiA4KSAmIFNCU0RJT19TQkFERFJMT1dfTUFTSywgJmVycik7Ci0JaWYgKCFlcnIpCi0JCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoY2FyZCwgU0RJT19GVU5DXzEsCi0JCQkJICAgICAgIFNCU0RJT19GVU5DMV9TQkFERFJNSUQsCi0JCQkJICAgICAgIChhZGRyZXNzID4+IDE2KSAmIFNCU0RJT19TQkFERFJNSURfTUFTSywKLQkJCQkgICAgICAgJmVycik7Ci0JaWYgKCFlcnIpCi0JCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoY2FyZCwgU0RJT19GVU5DXzEsCi0JCQkJICAgICAgIFNCU0RJT19GVU5DMV9TQkFERFJISUdILAotCQkJCSAgICAgICAoYWRkcmVzcyA+PiAyNCkgJiBTQlNESU9fU0JBRERSSElHSF9NQVNLLAotCQkJCSAgICAgICAmZXJyKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXUzMiBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCwgdTMyIGFkZHIsIHVpbnQgc2l6ZSkKLXsKLQlpbnQgc3RhdHVzOwotCXUzMiB3b3JkID0gMDsKLQl1aW50IGJhcjAgPSBhZGRyICYgflNCU0RJT19TQl9PRlRfQUREUl9NQVNLOwotCi0JQlJDTUZfU0RfSU5GTygoIiVzOmZ1biA9IDEsIGFkZHIgPSAweCV4LCAiLCBfX2Z1bmNfXywgYWRkcikpOwotCi0JaWYgKCFjYXJkKQotCQljYXJkID0gbF9jYXJkOwotCi0JaWYgKGJhcjAgIT0gY2FyZC0+c2J3YWQpIHsKLQkJaWYgKGJyY21mX3NkY2FyZF9zZXRfc2JhZGRyX3dpbmRvdyhjYXJkLCBiYXIwKSkKLQkJCXJldHVybiAweEZGRkZGRkZGOwotCi0JCWNhcmQtPnNid2FkID0gYmFyMDsKLQl9Ci0KLQlhZGRyICY9IFNCU0RJT19TQl9PRlRfQUREUl9NQVNLOwotCWlmIChzaXplID09IDQpCi0JCWFkZHIgfD0gU0JTRElPX1NCX0FDQ0VTU18yXzRCX0ZMQUc7Ci0KLQlzdGF0dXMgPSBicmNtZl9zZGlvaF9yZXF1ZXN0X3dvcmQoY2FyZC0+c2Rpb2gsIFNESU9IX0NNRF9UWVBFX05PUk1BTCwKLQkJCQkgICAgU0RJT0hfUkVBRCwgU0RJT19GVU5DXzEsIGFkZHIsICZ3b3JkLCBzaXplKTsKLQotCWNhcmQtPnJlZ2ZhaWwgPSAoc3RhdHVzICE9IDApOwotCi0JQlJDTUZfU0RfSU5GTygoInUzMmRhdGEgPSAweCV4XG4iLCB3b3JkKSk7Ci0KLQkvKiBpZiBvaywgcmV0dXJuIGFwcHJvcHJpYXRlbHkgbWFza2VkIHdvcmQgKi8KLQlpZiAoc3RhdHVzID09IDApIHsKLQkJc3dpdGNoIChzaXplKSB7Ci0JCWNhc2Ugc2l6ZW9mKHU4KToKLQkJCXJldHVybiB3b3JkICYgMHhmZjsKLQkJY2FzZSBzaXplb2YodTE2KToKLQkJCXJldHVybiB3b3JkICYgMHhmZmZmOwotCQljYXNlIHNpemVvZih1MzIpOgotCQkJcmV0dXJuIHdvcmQ7Ci0JCWRlZmF1bHQ6Ci0JCQljYXJkLT5yZWdmYWlsID0gdHJ1ZTsKLQotCQl9Ci0JfQotCi0JLyogb3RoZXJ3aXNlLCBiYWQgc2RpbyBhY2Nlc3Mgb3IgaW52YWxpZCBzaXplICovCi0JQlJDTUZfU0RfRVJST1IoKCIlczogZXJyb3IgcmVhZGluZyBhZGRyIDB4JTA0eCBzaXplICVkXG4iLCBfX2Z1bmNfXywKLQkJICAgICAgYWRkciwgc2l6ZSkpOwotCXJldHVybiAweEZGRkZGRkZGOwotfQotCi11MzIgYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzdHJ1Y3QgYnJjbWZfc2Rpb19jYXJkICpjYXJkLCB1MzIgYWRkciwgdWludCBzaXplLAotCQkJICAgdTMyIGRhdGEpCi17Ci0JaW50IHN0YXR1czsKLQl1aW50IGJhcjAgPSBhZGRyICYgflNCU0RJT19TQl9PRlRfQUREUl9NQVNLOwotCWludCBlcnIgPSAwOwotCi0JQlJDTUZfU0RfSU5GTygoIiVzOmZ1biA9IDEsIGFkZHIgPSAweCV4LCB1aW50JWRkYXRhID0gMHgleFxuIiwKLQkJICAgICBfX2Z1bmNfXywgYWRkciwgc2l6ZSAqIDgsIGRhdGEpKTsKLQotCWlmICghY2FyZCkKLQkJY2FyZCA9IGxfY2FyZDsKLQotCWlmIChiYXIwICE9IGNhcmQtPnNid2FkKSB7Ci0JCWVyciA9IGJyY21mX3NkY2FyZF9zZXRfc2JhZGRyX3dpbmRvdyhjYXJkLCBiYXIwKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0KLQkJY2FyZC0+c2J3YWQgPSBiYXIwOwotCX0KLQotCWFkZHIgJj0gU0JTRElPX1NCX09GVF9BRERSX01BU0s7Ci0JaWYgKHNpemUgPT0gNCkKLQkJYWRkciB8PSBTQlNESU9fU0JfQUNDRVNTXzJfNEJfRkxBRzsKLQlzdGF0dXMgPQotCSAgICBicmNtZl9zZGlvaF9yZXF1ZXN0X3dvcmQoY2FyZC0+c2Rpb2gsIFNESU9IX0NNRF9UWVBFX05PUk1BTCwKLQkJCSAgICAgICBTRElPSF9XUklURSwgU0RJT19GVU5DXzEsIGFkZHIsICZkYXRhLCBzaXplKTsKLQljYXJkLT5yZWdmYWlsID0gKHN0YXR1cyAhPSAwKTsKLQotCWlmIChzdGF0dXMgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlCUkNNRl9TRF9FUlJPUigoIiVzOiBlcnJvciB3cml0aW5nIDB4JTA4eCB0byBhZGRyIDB4JTA0eCBzaXplICVkXG4iLAotCQkgICAgICBfX2Z1bmNfXywgZGF0YSwgYWRkciwgc2l6ZSkpOwotCXJldHVybiAweEZGRkZGRkZGOwotfQotCi1ib29sIGJyY21mX3NkY2FyZF9yZWdmYWlsKHN0cnVjdCBicmNtZl9zZGlvX2NhcmQgKmNhcmQpCi17Ci0JcmV0dXJuIGNhcmQtPnJlZ2ZhaWw7Ci19Ci0KLWludAotYnJjbWZfc2RjYXJkX3JlY3ZfYnVmKHN0cnVjdCBicmNtZl9zZGlvX2NhcmQgKmNhcmQsIHUzMiBhZGRyLCB1aW50IGZuLAotCQkgICAgICB1aW50IGZsYWdzLAotCQkgICAgICB1OCAqYnVmLCB1aW50IG5ieXRlcywgc3RydWN0IHNrX2J1ZmYgKnBrdCwKLQkJICAgICAgdm9pZCAoKmNvbXBsZXRlKSh2b2lkICpoYW5kbGUsIGludCBzdGF0dXMsCi0JCQkJICAgICAgIGJvb2wgc3luY193YWl0aW5nKSwKLQkJICAgICAgdm9pZCAqaGFuZGxlKQotewotCWludCBzdGF0dXM7Ci0JdWludCBpbmNyX2ZpeDsKLQl1aW50IHdpZHRoOwotCXVpbnQgYmFyMCA9IGFkZHIgJiB+U0JTRElPX1NCX09GVF9BRERSX01BU0s7Ci0JaW50IGVyciA9IDA7Ci0KLQlCUkNNRl9TRF9JTkZPKCgiJXM6ZnVuID0gJWQsIGFkZHIgPSAweCV4LCBzaXplID0gJWRcbiIsCi0JCSAgICAgX19mdW5jX18sIGZuLCBhZGRyLCBuYnl0ZXMpKTsKLQotCS8qIEFzeW5jIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KLQlpZiAoZmxhZ3MgJiBTRElPX1JFUV9BU1lOQykKLQkJcmV0dXJuIC1FTk9UU1VQUDsKLQotCWlmIChiYXIwICE9IGNhcmQtPnNid2FkKSB7Ci0JCWVyciA9IGJyY21mX3NkY2FyZF9zZXRfc2JhZGRyX3dpbmRvdyhjYXJkLCBiYXIwKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0KLQkJY2FyZC0+c2J3YWQgPSBiYXIwOwotCX0KLQotCWFkZHIgJj0gU0JTRElPX1NCX09GVF9BRERSX01BU0s7Ci0KLQlpbmNyX2ZpeCA9IChmbGFncyAmIFNESU9fUkVRX0ZJWEVEKSA/IFNESU9IX0RBVEFfRklYIDogU0RJT0hfREFUQV9JTkM7Ci0Jd2lkdGggPSAoZmxhZ3MgJiBTRElPX1JFUV80QllURSkgPyA0IDogMjsKLQlpZiAod2lkdGggPT0gNCkKLQkJYWRkciB8PSBTQlNESU9fU0JfQUNDRVNTXzJfNEJfRkxBRzsKLQotCXN0YXR1cyA9IGJyY21mX3NkaW9oX3JlcXVlc3RfYnVmZmVyKGNhcmQtPnNkaW9oLCBTRElPSF9EQVRBX1BJTywKLQkJaW5jcl9maXgsIFNESU9IX1JFQUQsIGZuLCBhZGRyLCB3aWR0aCwgbmJ5dGVzLCBidWYsIHBrdCk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1pbnQKLWJyY21mX3NkY2FyZF9zZW5kX2J1ZihzdHJ1Y3QgYnJjbWZfc2Rpb19jYXJkICpjYXJkLCB1MzIgYWRkciwgdWludCBmbiwKLQkJICAgICAgdWludCBmbGFncywgdTggKmJ1ZiwgdWludCBuYnl0ZXMsIHZvaWQgKnBrdCwKLQkJICAgICAgdm9pZCAoKmNvbXBsZXRlKSh2b2lkICpoYW5kbGUsIGludCBzdGF0dXMsCi0JCQkJICAgICAgIGJvb2wgc3luY193YWl0aW5nKSwKLQkJICAgICAgdm9pZCAqaGFuZGxlKQotewotCXVpbnQgaW5jcl9maXg7Ci0JdWludCB3aWR0aDsKLQl1aW50IGJhcjAgPSBhZGRyICYgflNCU0RJT19TQl9PRlRfQUREUl9NQVNLOwotCWludCBlcnIgPSAwOwotCi0JQlJDTUZfU0RfSU5GTygoIiVzOmZ1biA9ICVkLCBhZGRyID0gMHgleCwgc2l6ZSA9ICVkXG4iLAotCQkgICAgIF9fZnVuY19fLCBmbiwgYWRkciwgbmJ5dGVzKSk7Ci0KLQkvKiBBc3luYyBub3QgaW1wbGVtZW50ZWQgeWV0ICovCi0JaWYgKGZsYWdzICYgU0RJT19SRVFfQVNZTkMpCi0JCXJldHVybiAtRU5PVFNVUFA7Ci0KLQlpZiAoYmFyMCAhPSBjYXJkLT5zYndhZCkgewotCQllcnIgPSBicmNtZl9zZGNhcmRfc2V0X3NiYWRkcl93aW5kb3coY2FyZCwgYmFyMCk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCi0JCWNhcmQtPnNid2FkID0gYmFyMDsKLQl9Ci0KLQlhZGRyICY9IFNCU0RJT19TQl9PRlRfQUREUl9NQVNLOwotCi0JaW5jcl9maXggPSAoZmxhZ3MgJiBTRElPX1JFUV9GSVhFRCkgPyBTRElPSF9EQVRBX0ZJWCA6IFNESU9IX0RBVEFfSU5DOwotCXdpZHRoID0gKGZsYWdzICYgU0RJT19SRVFfNEJZVEUpID8gNCA6IDI7Ci0JaWYgKHdpZHRoID09IDQpCi0JCWFkZHIgfD0gU0JTRElPX1NCX0FDQ0VTU18yXzRCX0ZMQUc7Ci0KLQlyZXR1cm4gYnJjbWZfc2Rpb2hfcmVxdWVzdF9idWZmZXIoY2FyZC0+c2Rpb2gsIFNESU9IX0RBVEFfUElPLAotCQlpbmNyX2ZpeCwgU0RJT0hfV1JJVEUsIGZuLCBhZGRyLCB3aWR0aCwgbmJ5dGVzLCBidWYsIHBrdCk7Ci19Ci0KLWludCBicmNtZl9zZGNhcmRfcndkYXRhKHN0cnVjdCBicmNtZl9zZGlvX2NhcmQgKmNhcmQsIHVpbnQgcncsIHUzMiBhZGRyLAotCQkJdTggKmJ1ZiwgdWludCBuYnl0ZXMpCi17Ci0JYWRkciAmPSBTQlNESU9fU0JfT0ZUX0FERFJfTUFTSzsKLQlhZGRyIHw9IFNCU0RJT19TQl9BQ0NFU1NfMl80Ql9GTEFHOwotCi0JcmV0dXJuIGJyY21mX3NkaW9oX3JlcXVlc3RfYnVmZmVyKGNhcmQtPnNkaW9oLCBTRElPSF9EQVRBX1BJTywKLQkJU0RJT0hfREFUQV9JTkMsIChydyA/IFNESU9IX1dSSVRFIDogU0RJT0hfUkVBRCksIFNESU9fRlVOQ18xLAotCQlhZGRyLCA0LCBuYnl0ZXMsIGJ1ZiwgTlVMTCk7Ci19Ci0KLWludCBicmNtZl9zZGNhcmRfYWJvcnQoc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCwgdWludCBmbikKLXsKLQlyZXR1cm4gYnJjbWZfc2Rpb2hfYWJvcnQoY2FyZC0+c2Rpb2gsIGZuKTsKLX0KLQotaW50IGJyY21mX3NkY2FyZF9xdWVyeV9kZXZpY2Uoc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCkKLXsKLQljYXJkLT52ZW5kZXZpZCA9IChQQ0lfVkVORE9SX0lEX0JST0FEQ09NIDw8IDE2KSB8IDA7Ci0JcmV0dXJuIGNhcmQtPnZlbmRldmlkOwotfQotCi11MzIgYnJjbWZfc2RjYXJkX2N1cl9zYndhZChzdHJ1Y3QgYnJjbWZfc2Rpb19jYXJkICpjYXJkKQotewotCWlmICghY2FyZCkKLQkJY2FyZCA9IGxfY2FyZDsKLQotCXJldHVybiBjYXJkLT5zYndhZDsKLX0KLQotaW50IGJyY21mX3NkaW9fcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBzZGlvX2hjICpzZGhjID0gTlVMTDsKLQl1MzIgcmVncyA9IDA7Ci0Jc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCA9IE5VTEw7Ci0JaW50IGlycSA9IDA7Ci0JdTMyIHZlbmRldmlkOwotCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzID0gMDsKLQotCS8qIGFsbG9jYXRlIFNESU8gSG9zdCBDb250cm9sbGVyIHN0YXRlIGluZm8gKi8KLQlzZGhjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNkaW9faGMpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXNkaGMpIHsKLQkJU0RMWF9NU0coKCIlczogb3V0IG9mIG1lbW9yeVxuIiwgX19mdW5jX18pKTsKLQkJZ290byBlcnI7Ci0JfQotCXNkaGMtPmRldiA9ICh2b2lkICopZGV2OwotCi0JY2FyZCA9IGJyY21mX3NkY2FyZF9hdHRhY2goKHZvaWQgKikwLCAmcmVncywgaXJxKTsKLQlpZiAoIWNhcmQpIHsKLQkJU0RMWF9NU0coKCIlczogYXR0YWNoIGZhaWxlZFxuIiwgX19mdW5jX18pKTsKLQkJZ290byBlcnI7Ci0JfQotCi0Jc2RoYy0+Y2FyZCA9IGNhcmQ7Ci0Jc2RoYy0+b29iX2lycSA9IGlycTsKLQlzZGhjLT5vb2JfZmxhZ3MgPSBpcnFfZmxhZ3M7Ci0Jc2RoYy0+b29iX2lycV9yZWdpc3RlcmVkID0gZmFsc2U7CS8qIHRvIG1ha2Ugc3VyZS4uICovCi0KLQkvKiBjaGFpbiBTRElPIEhvc3QgQ29udHJvbGxlciBpbmZvIHRvZ2V0aGVyICovCi0Jc2RoYy0+bmV4dCA9IHNkaGNpbmZvOwotCXNkaGNpbmZvID0gc2RoYzsKLQkvKiBSZWFkIHRoZSB2ZW5kb3IvZGV2aWNlIElEIGZyb20gdGhlIENJUyAqLwotCXZlbmRldmlkID0gYnJjbWZfc2RjYXJkX3F1ZXJ5X2RldmljZShjYXJkKTsKLQotCS8qIHRyeSB0byBhdHRhY2ggdG8gdGhlIHRhcmdldCBkZXZpY2UgKi8KLQlzZGhjLT5jaCA9IGRydmluZm8uYXR0YWNoKCh2ZW5kZXZpZCA+PiAxNiksICh2ZW5kZXZpZCAmIDB4RkZGRiksCi0JCQkJICAwLCAwLCAwLCAwLCByZWdzLCBjYXJkKTsKLQlpZiAoIXNkaGMtPmNoKSB7Ci0JCVNETFhfTVNHKCgiJXM6IGRldmljZSBhdHRhY2ggZmFpbGVkXG4iLCBfX2Z1bmNfXykpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotCS8qIGVycm9yIGhhbmRsaW5nICovCi1lcnI6Ci0JaWYgKHNkaGMpIHsKLQkJaWYgKHNkaGMtPmNhcmQpCi0JCQlicmNtZl9zZGNhcmRfZGV0YWNoKHNkaGMtPmNhcmQpOwotCQlrZnJlZShzZGhjKTsKLQl9Ci0KLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotaW50IGJyY21mX3NkaW9fcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgc2Rpb19oYyAqc2RoYywgKnByZXY7Ci0KLQlzZGhjID0gc2RoY2luZm87Ci0JZHJ2aW5mby5kZXRhY2goc2RoYy0+Y2gpOwotCWJyY21mX3NkY2FyZF9kZXRhY2goc2RoYy0+Y2FyZCk7Ci0JLyogZmluZCB0aGUgU0RJTyBIb3N0IENvbnRyb2xsZXIgc3RhdGUgZm9yIHRoaXMgcGRldgotCQkgYW5kIHRha2UgaXQgb3V0IGZyb20gdGhlIGxpc3QgKi8KLQlmb3IgKHNkaGMgPSBzZGhjaW5mbywgcHJldiA9IE5VTEw7IHNkaGM7IHNkaGMgPSBzZGhjLT5uZXh0KSB7Ci0JCWlmIChzZGhjLT5kZXYgPT0gKHZvaWQgKilkZXYpIHsKLQkJCWlmIChwcmV2KQotCQkJCXByZXYtPm5leHQgPSBzZGhjLT5uZXh0OwotCQkJZWxzZQotCQkJCXNkaGNpbmZvID0gTlVMTDsKLQkJCWJyZWFrOwotCQl9Ci0JCXByZXYgPSBzZGhjOwotCX0KLQlpZiAoIXNkaGMpIHsKLQkJU0RMWF9NU0coKCIlczogZmFpbGVkXG4iLCBfX2Z1bmNfXykpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiByZWxlYXNlIFNESU8gSG9zdCBDb250cm9sbGVyIGluZm8gKi8KLQlrZnJlZShzZGhjKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IGJyY21mX3NkaW9fcmVnaXN0ZXIoc3RydWN0IGJyY21mX3NkaW9oX2RyaXZlciAqZHJpdmVyKQotewotCWRydmluZm8gPSAqZHJpdmVyOwotCi0JU0RMWF9NU0coKCJMaW51eCBLZXJuZWwgU0RJTy9NTUMgRHJpdmVyXG4iKSk7Ci0JcmV0dXJuIGJyY21mX3NkaW9fZnVuY3Rpb25faW5pdCgpOwotfQotCi12b2lkIGJyY21mX3NkaW9fdW5yZWdpc3Rlcih2b2lkKQotewotCWJyY21mX3NkaW9fZnVuY3Rpb25fY2xlYW51cCgpOwotfQotCi12b2lkIGJyY21mX3NkaW9fd2R0bXJfZW5hYmxlKGJvb2wgZW5hYmxlKQotewotCWlmIChlbmFibGUpCi0JCWJyY21mX3NkYnJjbV93ZF90aW1lcihzZGhjaW5mby0+Y2gsIGJyY21mX3dhdGNoZG9nX21zKTsKLQllbHNlCi0JCWJyY21mX3NkYnJjbV93ZF90aW1lcihzZGhjaW5mby0+Y2gsIDApOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGhfc2RtbWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoX3NkbW1jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YmQ5YmEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGhfc2RtbWMuYworKysgL2Rldi9udWxsCkBAIC0xLDExOTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpby5oPgotI2luY2x1ZGUgPGxpbnV4L21tYy9jb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW1jL3NkaW9fZnVuYy5oPgotI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2lkcy5oPgotI2luY2x1ZGUgPGxpbnV4L21tYy9jYXJkLmg+Ci0jaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4JLyogcmVxdWVzdF9pcnEoKSAqLwotI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgotCi0jaW5jbHVkZSA8ZGVmcy5oPgotI2luY2x1ZGUgPGJyY21faHdfaWRzLmg+Ci0jaW5jbHVkZSA8YnJjbXVfdXRpbHMuaD4KLSNpbmNsdWRlIDxicmNtdV93aWZpLmg+Ci0jaW5jbHVkZSAic2Rpb19ob3N0LmgiCi0jaW5jbHVkZSAiZGhkLmgiCi0jaW5jbHVkZSAiZGhkX2RiZy5oIgotI2luY2x1ZGUgIndsX2NmZzgwMjExLmgiCi0KLSNkZWZpbmUgQkxPQ0tfU0laRV82NCA2NAotI2RlZmluZSBCTE9DS19TSVpFXzUxMiA1MTIKLSNkZWZpbmUgQkxPQ0tfU0laRV80MzE4IDY0Ci0jZGVmaW5lIEJMT0NLX1NJWkVfNDMyOCA1MTIKLQotLyogcHJpdmF0ZSBidXMgbW9kZXMgKi8KLSNkZWZpbmUgU0RJT0hfTU9ERV9TRDQJCTIKLQotI2RlZmluZSBDTElFTlRfSU5UUgkJMHgxMDAJLyogR2V0IHJpZCBvZiB0aGlzISAqLwotCi0jaWYgIWRlZmluZWQoU0RJT19WRU5ET1JfSURfQlJPQURDT00pCi0jZGVmaW5lIFNESU9fVkVORE9SX0lEX0JST0FEQ09NCQkweDAyZDAKLSNlbmRpZgkJCQkvKiAhZGVmaW5lZChTRElPX1ZFTkRPUl9JRF9CUk9BRENPTSkgKi8KLQotI2RlZmluZSBTRElPX0RFVklDRV9JRF9CUk9BRENPTV9ERUZBVUxUCTB4MDAwMAotCi0jZGVmaW5lIERNQV9BTElHTl9NQVNLCTB4MDMKLQotI2lmICFkZWZpbmVkKFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzMjVfU0RHV0IpCi0jZGVmaW5lIFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzMjVfU0RHV0IJMHgwNDkyCS8qIEJDTTk0MzI1U0RHV0IgKi8KLSNlbmRpZgkJLyogIWRlZmluZWQoU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMyNV9TREdXQikgKi8KLSNpZiAhZGVmaW5lZChTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzI1KQotI2RlZmluZSBTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzI1CTB4MDQ5MwotI2VuZGlmCQkvKiAhZGVmaW5lZChTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzI1KSAqLwotI2lmICFkZWZpbmVkKFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzMjkpCi0jZGVmaW5lIFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzMjkJMHg0MzI5Ci0jZW5kaWYJCS8qICFkZWZpbmVkKFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzMjkpICovCi0jaWYgIWRlZmluZWQoU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMxOSkKLSNkZWZpbmUgU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMxOQkweDQzMTkKLSNlbmRpZgkJLyogIWRlZmluZWQoU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMyOSkgKi8KLQotLyogQ29tbW9uIG1zZ2xldmVsIGNvbnN0YW50cyAqLwotI2RlZmluZSBTREhfRVJST1JfVkFMCQkweDAwMDEJLyogRXJyb3IgKi8KLSNkZWZpbmUgU0RIX1RSQUNFX1ZBTAkJMHgwMDAyCS8qIFRyYWNlICovCi0jZGVmaW5lIFNESF9JTkZPX1ZBTAkJMHgwMDA0CS8qIEluZm8gKi8KLSNkZWZpbmUgU0RIX0RFQlVHX1ZBTAkJMHgwMDA4CS8qIERlYnVnICovCi0jZGVmaW5lIFNESF9EQVRBX1ZBTAkJMHgwMDEwCS8qIERhdGEgKi8KLSNkZWZpbmUgU0RIX0NUUkxfVkFMCQkweDAwMjAJLyogQ29udHJvbCBSZWdzICovCi0jZGVmaW5lIFNESF9MT0dfVkFMCQkweDAwNDAJLyogRW5hYmxlIGJjbWxvZyAqLwotI2RlZmluZSBTREhfRE1BX1ZBTAkJMHgwMDgwCS8qIERNQSAqLwotCi0jaWZkZWYgQkNNREJHCi0jZGVmaW5lIHNkX2Vycih4KQlcCi0JZG8geyBcCi0JCWlmICgoc2RfbXNnbGV2ZWwgJiBTREhfRVJST1JfVkFMKSAmJiBuZXRfcmF0ZWxpbWl0KCkpIFwKLQkJCXByaW50ayB4OyBcCi0JfSB3aGlsZSAoMCkKLSNkZWZpbmUgc2RfdHJhY2UoeCkJXAotCWRvIHsgXAotCQlpZiAoKHNkX21zZ2xldmVsICYgU0RIX1RSQUNFX1ZBTCkgJiYgbmV0X3JhdGVsaW1pdCgpKSBcCi0JCQlwcmludGsgeDsgXAotCX0gd2hpbGUgKDApCi0jZGVmaW5lIHNkX2luZm8oeCkJXAotCWRvIHsgXAotCQlpZiAoKHNkX21zZ2xldmVsICYgU0RIX0lORk9fVkFMKSAmJiBuZXRfcmF0ZWxpbWl0KCkpIFwKLQkJCXByaW50ayB4OyBcCi0JfSB3aGlsZSAoMCkKLSNkZWZpbmUgc2RfZGVidWcoeCkJXAotCWRvIHsgXAotCQlpZiAoKHNkX21zZ2xldmVsICYgU0RIX0RFQlVHX1ZBTCkgJiYgbmV0X3JhdGVsaW1pdCgpKSBcCi0JCQlwcmludGsgeDsgXAotCX0gd2hpbGUgKDApCi0jZGVmaW5lIHNkX2RhdGEoeCkJXAotCWRvIHsgXAotCQlpZiAoKHNkX21zZ2xldmVsICYgU0RIX0RBVEFfVkFMKSAmJiBuZXRfcmF0ZWxpbWl0KCkpIFwKLQkJCXByaW50ayB4OyBcCi0JfSB3aGlsZSAoMCkKLSNkZWZpbmUgc2RfY3RybCh4KQlcCi0JZG8geyBcCi0JCWlmICgoc2RfbXNnbGV2ZWwgJiBTREhfQ1RSTF9WQUwpICYmIG5ldF9yYXRlbGltaXQoKSkgXAotCQkJcHJpbnRrIHg7IFwKLQl9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgc2RfZXJyKHgpCi0jZGVmaW5lIHNkX3RyYWNlKHgpCi0jZGVmaW5lIHNkX2luZm8oeCkKLSNkZWZpbmUgc2RfZGVidWcoeCkKLSNkZWZpbmUgc2RfZGF0YSh4KQotI2RlZmluZSBzZF9jdHJsKHgpCi0jZW5kaWYKLQotc3RydWN0IHNkb3NfaW5mbyB7Ci0Jc3RydWN0IHNkaW9oX2luZm8gKnNkOwotCXNwaW5sb2NrX3QgbG9jazsKLX07Ci0KLXN0YXRpYyB2b2lkIGJyY21mX3NkaW9oX2lycWhhbmRsZXIoc3RydWN0IHNkaW9fZnVuYyAqZnVuYyk7Ci1zdGF0aWMgdm9pZCBicmNtZl9zZGlvaF9pcnFoYW5kbGVyX2YyKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMpOwotc3RhdGljIGludCBicmNtZl9zZGlvaF9nZXRfY2lzYWRkcihzdHJ1Y3Qgc2Rpb2hfaW5mbyAqc2QsIHUzMiByZWdhZGRyKTsKLXN0YXRpYyBpbnQgYnJjbWZfb3BzX3NkaW9fcHJvYmUoc3RydWN0IHNkaW9fZnVuYyAqZnVuYywKLQkJCQljb25zdCBzdHJ1Y3Qgc2Rpb19kZXZpY2VfaWQgKmlkKTsKLXN0YXRpYyB2b2lkIGJyY21mX29wc19zZGlvX3JlbW92ZShzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jKTsKLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBicmNtZl9zZGlvX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KTsKLXN0YXRpYyBpbnQgYnJjbWZfc2Rpb19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KTsKLSNlbmRpZiAvKiBDT05GSUdfUE0gKi8KLQotdWludCBzZF9mMl9ibG9ja3NpemUgPSA1MTI7CS8qIERlZmF1bHQgYmxvY2tzaXplICovCi0KLXVpbnQgc2RfbXNnbGV2ZWwgPSAweDAxOwotCi0vKiBtb2R1bGUgcGFyYW0gZGVmYXVsdHMgKi8KLXN0YXRpYyBpbnQgY2xvY2tvdmVycmlkZTsKLQotbW9kdWxlX3BhcmFtKGNsb2Nrb3ZlcnJpZGUsIGludCwgMDY0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGNsb2Nrb3ZlcnJpZGUsICJTRElPIGNhcmQgY2xvY2sgb3ZlcnJpZGUiKTsKLQotc3RydWN0IGJyY21mX3NkbW1jX2luc3RhbmNlICpnSW5zdGFuY2U7Ci0KLXN0cnVjdCBkZXZpY2Ugc2RtbWNfZGV2OwotCi0vKiBkZXZpY2VzIHdlIHN1cHBvcnQsIG51bGwgdGVybWluYXRlZCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzZGlvX2RldmljZV9pZCBicmNtZl9zZG1tY19pZHNbXSA9IHsKLQl7U0RJT19ERVZJQ0UoU0RJT19WRU5ET1JfSURfQlJPQURDT00sIFNESU9fREVWSUNFX0lEX0JST0FEQ09NX0RFRkFVTFQpfSwKLQl7U0RJT19ERVZJQ0UKLQkgKFNESU9fVkVORE9SX0lEX0JST0FEQ09NLCBTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzI1X1NER1dCKX0sCi0Je1NESU9fREVWSUNFKFNESU9fVkVORE9SX0lEX0JST0FEQ09NLCBTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzI1KX0sCi0Je1NESU9fREVWSUNFKFNESU9fVkVORE9SX0lEX0JST0FEQ09NLCBTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzI5KX0sCi0Je1NESU9fREVWSUNFKFNESU9fVkVORE9SX0lEX0JST0FEQ09NLCBTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzE5KX0sCi0JeyAvKiBlbmQ6IGFsbCB6ZXJvZXMgKi8gfSwKLX07Ci0KLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBicmNtZl9zZGlvX3BtX29wcyA9IHsKLQkuc3VzcGVuZAk9IGJyY21mX3NkaW9fc3VzcGVuZCwKLQkucmVzdW1lCQk9IGJyY21mX3NkaW9fcmVzdW1lLAotfTsKLSNlbmRpZgkvKiBDT05GSUdfUE0gKi8KLQotc3RhdGljIHN0cnVjdCBzZGlvX2RyaXZlciBicmNtZl9zZG1tY19kcml2ZXIgPSB7Ci0JLnByb2JlID0gYnJjbWZfb3BzX3NkaW9fcHJvYmUsCi0JLnJlbW92ZSA9IGJyY21mX29wc19zZGlvX3JlbW92ZSwKLQkubmFtZSA9ICJicmNtZm1hYyIsCi0JLmlkX3RhYmxlID0gYnJjbWZfc2RtbWNfaWRzLAotI2lmZGVmIENPTkZJR19QTQotCS5kcnYgPSB7Ci0JCS5wbSA9ICZicmNtZl9zZGlvX3BtX29wcywKLQl9LAotI2VuZGlmCS8qIENPTkZJR19QTSAqLwotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShzZGlvLCBicmNtZl9zZG1tY19pZHMpOwotCi1CUkNNRl9QTV9SRVNVTUVfV0FJVF9JTklUKHNkaW9oX3JlcXVlc3RfYnl0ZV93YWl0KTsKLUJSQ01GX1BNX1JFU1VNRV9XQUlUX0lOSVQoc2Rpb2hfcmVxdWVzdF93b3JkX3dhaXQpOwotQlJDTUZfUE1fUkVTVU1FX1dBSVRfSU5JVChzZGlvaF9yZXF1ZXN0X3BhY2tldF93YWl0KTsKLUJSQ01GX1BNX1JFU1VNRV9XQUlUX0lOSVQoc2Rpb2hfcmVxdWVzdF9idWZmZXJfd2FpdCk7Ci0KLXN0YXRpYyBpbnQKLWJyY21mX3NkaW9oX2NhcmRfcmVncmVhZChzdHJ1Y3Qgc2Rpb2hfaW5mbyAqc2QsIGludCBmdW5jLCB1MzIgcmVnYWRkciwKLQkJCSBpbnQgcmVnc2l6ZSwgdTMyICpkYXRhKTsKLQotc3RhdGljIGludCBicmNtZl9zZGlvaF9lbmFibGVmdW5jcyhzdHJ1Y3Qgc2Rpb2hfaW5mbyAqc2QpCi17Ci0JaW50IGVycl9yZXQ7Ci0JdTMyIGZicmFkZHI7Ci0JdTggZnVuYzsKLQotCXNkX3RyYWNlKCgiJXNcbiIsIF9fZnVuY19fKSk7Ci0KLQkvKiBHZXQgdGhlIENhcmQncyBjb21tb24gQ0lTIGFkZHJlc3MgKi8KLQlzZC0+Y29tX2Npc19wdHIgPSBicmNtZl9zZGlvaF9nZXRfY2lzYWRkcihzZCwgU0RJT19DQ0NSX0NJUyk7Ci0Jc2QtPmZ1bmNfY2lzX3B0clswXSA9IHNkLT5jb21fY2lzX3B0cjsKLQlzZF9pbmZvKCgiJXM6IENhcmQncyBDb21tb24gQ0lTIFB0ciA9IDB4JXhcbiIsIF9fZnVuY19fLAotCQkgc2QtPmNvbV9jaXNfcHRyKSk7Ci0KLQkvKiBHZXQgdGhlIENhcmQncyBmdW5jdGlvbiBDSVMgKGZvciBlYWNoIGZ1bmN0aW9uKSAqLwotCWZvciAoZmJyYWRkciA9IFNESU9fRkJSX0JBU0UoMSksIGZ1bmMgPSAxOwotCSAgICAgZnVuYyA8PSBzZC0+bnVtX2Z1bmNzOyBmdW5jKyssIGZicmFkZHIgKz0gU0RJT0RfRkJSX1NJWkUpIHsKLQkJc2QtPmZ1bmNfY2lzX3B0cltmdW5jXSA9Ci0JCSAgICBicmNtZl9zZGlvaF9nZXRfY2lzYWRkcihzZCwgU0RJT19GQlJfQ0lTICsgZmJyYWRkcik7Ci0JCXNkX2luZm8oKCIlczogRnVuY3Rpb24gJWQgQ0lTIFB0ciA9IDB4JXhcbiIsIF9fZnVuY19fLCBmdW5jLAotCQkJIHNkLT5mdW5jX2Npc19wdHJbZnVuY10pKTsKLQl9Ci0KLQlzZC0+ZnVuY19jaXNfcHRyWzBdID0gc2QtPmNvbV9jaXNfcHRyOwotCXNkX2luZm8oKCIlczogQ2FyZCdzIENvbW1vbiBDSVMgUHRyID0gMHgleFxuIiwgX19mdW5jX18sCi0JCSBzZC0+Y29tX2Npc19wdHIpKTsKLQotCS8qIEVuYWJsZSBGdW5jdGlvbiAxICovCi0Jc2Rpb19jbGFpbV9ob3N0KGdJbnN0YW5jZS0+ZnVuY1sxXSk7Ci0JZXJyX3JldCA9IHNkaW9fZW5hYmxlX2Z1bmMoZ0luc3RhbmNlLT5mdW5jWzFdKTsKLQlzZGlvX3JlbGVhc2VfaG9zdChnSW5zdGFuY2UtPmZ1bmNbMV0pOwotCWlmIChlcnJfcmV0KSB7Ci0JCXNkX2VycigoImJyY21mX3NkaW9oX2VuYWJsZWZ1bmNzOiBGYWlsZWQgdG8gZW5hYmxlIEYxICIKLQkJCSJFcnI6IDB4JTA4eFxuIiwgZXJyX3JldCkpOwotCX0KLQotCXJldHVybiBmYWxzZTsKLX0KLQotLyoKLSAqCVB1YmxpYyBlbnRyeSBwb2ludHMgJiBleHRlcm4ncwotICovCi1zdHJ1Y3Qgc2Rpb2hfaW5mbyAqYnJjbWZfc2Rpb2hfYXR0YWNoKHZvaWQgKmJhcjAsIHVpbnQgaXJxKQotewotCXN0cnVjdCBzZGlvaF9pbmZvICpzZDsKLQlpbnQgZXJyX3JldDsKLQotCXNkX3RyYWNlKCgiJXNcbiIsIF9fZnVuY19fKSk7Ci0KLQlpZiAoZ0luc3RhbmNlID09IE5VTEwpIHsKLQkJc2RfZXJyKCgiJXM6IFNESU8gRGV2aWNlIG5vdCBwcmVzZW50XG4iLCBfX2Z1bmNfXykpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlzZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzZGlvaF9pbmZvKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHNkID09IE5VTEwpIHsKLQkJc2RfZXJyKCgic2Rpb2hfYXR0YWNoOiBvdXQgb2YgbWVtb3J5XG4iKSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlpZiAoYnJjbWZfc2Rpb2hfb3Npbml0KHNkKSAhPSAwKSB7Ci0JCXNkX2VycigoIiVzOnNkaW9oX3NkbW1jX29zaW5pdCgpIGZhaWxlZFxuIiwgX19mdW5jX18pKTsKLQkJa2ZyZWUoc2QpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlzZC0+bnVtX2Z1bmNzID0gMjsKLQlzZC0+dXNlX2NsaWVudF9pbnRzID0gdHJ1ZTsKLQlzZC0+Y2xpZW50X2Jsb2NrX3NpemVbMF0gPSA2NDsKLQotCWdJbnN0YW5jZS0+c2QgPSBzZDsKLQotCS8qIENsYWltIGhvc3QgY29udHJvbGxlciAqLwotCXNkaW9fY2xhaW1faG9zdChnSW5zdGFuY2UtPmZ1bmNbMV0pOwotCi0Jc2QtPmNsaWVudF9ibG9ja19zaXplWzFdID0gNjQ7Ci0JZXJyX3JldCA9IHNkaW9fc2V0X2Jsb2NrX3NpemUoZ0luc3RhbmNlLT5mdW5jWzFdLCA2NCk7Ci0JaWYgKGVycl9yZXQpCi0JCXNkX2VycigoImJyY21mX3NkaW9oX2F0dGFjaDogRmFpbGVkIHRvIHNldCBGMSBibG9ja3NpemVcbiIpKTsKLQotCS8qIFJlbGVhc2UgaG9zdCBjb250cm9sbGVyIEYxICovCi0Jc2Rpb19yZWxlYXNlX2hvc3QoZ0luc3RhbmNlLT5mdW5jWzFdKTsKLQotCWlmIChnSW5zdGFuY2UtPmZ1bmNbMl0pIHsKLQkJLyogQ2xhaW0gaG9zdCBjb250cm9sbGVyIEYyICovCi0JCXNkaW9fY2xhaW1faG9zdChnSW5zdGFuY2UtPmZ1bmNbMl0pOwotCi0JCXNkLT5jbGllbnRfYmxvY2tfc2l6ZVsyXSA9IHNkX2YyX2Jsb2Nrc2l6ZTsKLQkJZXJyX3JldCA9Ci0JCSAgICBzZGlvX3NldF9ibG9ja19zaXplKGdJbnN0YW5jZS0+ZnVuY1syXSwgc2RfZjJfYmxvY2tzaXplKTsKLQkJaWYgKGVycl9yZXQpCi0JCQlzZF9lcnIoKCJicmNtZl9zZGlvaF9hdHRhY2g6IEZhaWxlZCB0byBzZXQgRjIgYmxvY2tzaXplIgotCQkJCSIgdG8gJWRcbiIsIHNkX2YyX2Jsb2Nrc2l6ZSkpOwotCi0JCS8qIFJlbGVhc2UgaG9zdCBjb250cm9sbGVyIEYyICovCi0JCXNkaW9fcmVsZWFzZV9ob3N0KGdJbnN0YW5jZS0+ZnVuY1syXSk7Ci0JfQotCi0JYnJjbWZfc2Rpb2hfZW5hYmxlZnVuY3Moc2QpOwotCi0Jc2RfdHJhY2UoKCIlczogRG9uZVxuIiwgX19mdW5jX18pKTsKLQlyZXR1cm4gc2Q7Ci19Ci0KLWV4dGVybiBpbnQgYnJjbWZfc2Rpb2hfZGV0YWNoKHN0cnVjdCBzZGlvaF9pbmZvICpzZCkKLXsKLQlzZF90cmFjZSgoIiVzXG4iLCBfX2Z1bmNfXykpOwotCi0JaWYgKHNkKSB7Ci0KLQkJLyogRGlzYWJsZSBGdW5jdGlvbiAyICovCi0JCXNkaW9fY2xhaW1faG9zdChnSW5zdGFuY2UtPmZ1bmNbMl0pOwotCQlzZGlvX2Rpc2FibGVfZnVuYyhnSW5zdGFuY2UtPmZ1bmNbMl0pOwotCQlzZGlvX3JlbGVhc2VfaG9zdChnSW5zdGFuY2UtPmZ1bmNbMl0pOwotCi0JCS8qIERpc2FibGUgRnVuY3Rpb24gMSAqLwotCQlzZGlvX2NsYWltX2hvc3QoZ0luc3RhbmNlLT5mdW5jWzFdKTsKLQkJc2Rpb19kaXNhYmxlX2Z1bmMoZ0luc3RhbmNlLT5mdW5jWzFdKTsKLQkJc2Rpb19yZWxlYXNlX2hvc3QoZ0luc3RhbmNlLT5mdW5jWzFdKTsKLQotCQkvKiBkZXJlZ2lzdGVyIGlycSAqLwotCQlicmNtZl9zZGlvaF9vc2ZyZWUoc2QpOwotCi0JCWtmcmVlKHNkKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIENvbmZpZ3VyZSBjYWxsYmFjayB0byBjbGllbnQgd2hlbiB3ZSByZWNlaXZlIGNsaWVudCBpbnRlcnJ1cHQgKi8KLWV4dGVybiBpbnQKLWJyY21mX3NkaW9oX2ludGVycnVwdF9yZWdpc3RlcihzdHJ1Y3Qgc2Rpb2hfaW5mbyAqc2QsIHZvaWQgKCpmbikodm9pZCAqKSwKLQkJCSAgICAgICB2b2lkICphcmdoKQotewotCXNkX3RyYWNlKCgiJXM6IEVudGVyaW5nXG4iLCBfX2Z1bmNfXykpOwotCWlmIChmbiA9PSBOVUxMKSB7Ci0JCXNkX2VycigoIiVzOiBpbnRlcnJ1cHQgaGFuZGxlciBpcyBOVUxMLCBub3QgcmVnaXN0ZXJpbmdcbiIsCi0JCQlfX2Z1bmNfXykpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzZC0+aW50cl9oYW5kbGVyID0gZm47Ci0Jc2QtPmludHJfaGFuZGxlcl9hcmcgPSBhcmdoOwotCXNkLT5pbnRyX2hhbmRsZXJfdmFsaWQgPSB0cnVlOwotCi0JLyogcmVnaXN0ZXIgYW5kIHVubWFzayBpcnEgKi8KLQlpZiAoZ0luc3RhbmNlLT5mdW5jWzJdKSB7Ci0JCXNkaW9fY2xhaW1faG9zdChnSW5zdGFuY2UtPmZ1bmNbMl0pOwotCQlzZGlvX2NsYWltX2lycShnSW5zdGFuY2UtPmZ1bmNbMl0sIGJyY21mX3NkaW9oX2lycWhhbmRsZXJfZjIpOwotCQlzZGlvX3JlbGVhc2VfaG9zdChnSW5zdGFuY2UtPmZ1bmNbMl0pOwotCX0KLQotCWlmIChnSW5zdGFuY2UtPmZ1bmNbMV0pIHsKLQkJc2Rpb19jbGFpbV9ob3N0KGdJbnN0YW5jZS0+ZnVuY1sxXSk7Ci0JCXNkaW9fY2xhaW1faXJxKGdJbnN0YW5jZS0+ZnVuY1sxXSwgYnJjbWZfc2Rpb2hfaXJxaGFuZGxlcik7Ci0JCXNkaW9fcmVsZWFzZV9ob3N0KGdJbnN0YW5jZS0+ZnVuY1sxXSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWV4dGVybiBpbnQgYnJjbWZfc2Rpb2hfaW50ZXJydXB0X2RlcmVnaXN0ZXIoc3RydWN0IHNkaW9oX2luZm8gKnNkKQotewotCXNkX3RyYWNlKCgiJXM6IEVudGVyaW5nXG4iLCBfX2Z1bmNfXykpOwotCi0JaWYgKGdJbnN0YW5jZS0+ZnVuY1sxXSkgewotCQkvKiByZWdpc3RlciBhbmQgdW5tYXNrIGlycSAqLwotCQlzZGlvX2NsYWltX2hvc3QoZ0luc3RhbmNlLT5mdW5jWzFdKTsKLQkJc2Rpb19yZWxlYXNlX2lycShnSW5zdGFuY2UtPmZ1bmNbMV0pOwotCQlzZGlvX3JlbGVhc2VfaG9zdChnSW5zdGFuY2UtPmZ1bmNbMV0pOwotCX0KLQotCWlmIChnSW5zdGFuY2UtPmZ1bmNbMl0pIHsKLQkJLyogQ2xhaW0gaG9zdCBjb250cm9sbGVyIEYyICovCi0JCXNkaW9fY2xhaW1faG9zdChnSW5zdGFuY2UtPmZ1bmNbMl0pOwotCQlzZGlvX3JlbGVhc2VfaXJxKGdJbnN0YW5jZS0+ZnVuY1syXSk7Ci0JCS8qIFJlbGVhc2UgaG9zdCBjb250cm9sbGVyIEYyICovCi0JCXNkaW9fcmVsZWFzZV9ob3N0KGdJbnN0YW5jZS0+ZnVuY1syXSk7Ci0JfQotCi0Jc2QtPmludHJfaGFuZGxlcl92YWxpZCA9IGZhbHNlOwotCXNkLT5pbnRyX2hhbmRsZXIgPSBOVUxMOwotCXNkLT5pbnRyX2hhbmRsZXJfYXJnID0gTlVMTDsKLQotCXJldHVybiAwOwotfQotCi0vKiBJT1ZhciB0YWJsZSAqLwotZW51bSB7Ci0JSU9WX01TR0xFVkVMID0gMSwKLQlJT1ZfQkxPQ0tTSVpFLAotCUlPVl9VU0VJTlRTLAotCUlPVl9OVU1JTlRTLAotCUlPVl9ERVZSRUcsCi0JSU9WX0hDSVJFR1MsCi0JSU9WX1JYQ0hBSU4KLX07Ci0KLWNvbnN0IHN0cnVjdCBicmNtdV9pb3ZhciBzZGlvaF9pb3ZhcnNbXSA9IHsKLQl7InNkX21zZ2xldmVsIiwgSU9WX01TR0xFVkVMLCAwLCBJT1ZUX1VJTlQzMiwgMH0sCi0JeyJzZF9ibG9ja3NpemUiLCBJT1ZfQkxPQ0tTSVpFLCAwLCBJT1ZUX1VJTlQzMiwgMH0sLyogKChmbiA8PCAxNikgfAotCQkJCQkJCQkgc2l6ZSkgKi8KLQl7InNkX2ludHMiLCBJT1ZfVVNFSU5UUywgMCwgSU9WVF9CT09MLCAwfSwKLQl7InNkX251bWludHMiLCBJT1ZfTlVNSU5UUywgMCwgSU9WVF9VSU5UMzIsIDB9LAotCXsic2RfZGV2cmVnIiwgSU9WX0RFVlJFRywgMCwgSU9WVF9CVUZGRVIsIHNpemVvZihzdHJ1Y3QgYnJjbWZfc2RyZWcpfQotCSwKLQl7InNkX3J4Y2hhaW4iLCBJT1ZfUlhDSEFJTiwgMCwgSU9WVF9CT09MLCAwfQotCSwKLQl7TlVMTCwgMCwgMCwgMCwgMH0KLX07Ci0KLWludAotYnJjbWZfc2Rpb2hfaW92YXJfb3Aoc3RydWN0IHNkaW9oX2luZm8gKnNpLCBjb25zdCBjaGFyICpuYW1lLAotCQkgICAgIHZvaWQgKnBhcmFtcywgaW50IHBsZW4sIHZvaWQgKmFyZywgaW50IGxlbiwgYm9vbCBzZXQpCi17Ci0JY29uc3Qgc3RydWN0IGJyY211X2lvdmFyICp2aSA9IE5VTEw7Ci0JaW50IGJjbWVycm9yID0gMDsKLQlpbnQgdmFsX3NpemU7Ci0JczMyIGludF92YWwgPSAwOwotCWJvb2wgYm9vbF92YWw7Ci0JdTMyIGFjdGlvbmlkOwotCi0JaWYgKG5hbWUgPT0gTlVMTCB8fCBsZW4gPD0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBTZXQgZG9lcyBub3QgdGFrZSBxdWFsaWZpZXJzICovCi0JaWYgKHNldCAmJiAocGFyYW1zIHx8IHBsZW4pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIEdldCBtdXN0IGhhdmUgcmV0dXJuIHNwYWNlOyovCi0JaWYgKCFzZXQgJiYgIShhcmcgJiYgbGVuKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzZF90cmFjZSgoIiVzOiBFbnRlciAoJXMgJXMpXG4iLCBfX2Z1bmNfXywgKHNldCA/ICJzZXQiIDogImdldCIpLAotCQkgIG5hbWUpKTsKLQotCXZpID0gYnJjbXVfaW92YXJfbG9va3VwKHNkaW9oX2lvdmFycywgbmFtZSk7Ci0JaWYgKHZpID09IE5VTEwpIHsKLQkJYmNtZXJyb3IgPSAtRU5PVFNVUFA7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQliY21lcnJvciA9IGJyY211X2lvdmFyX2xlbmNoZWNrKHZpLCBhcmcsIGxlbiwgc2V0KTsKLQlpZiAoYmNtZXJyb3IgIT0gMCkKLQkJZ290byBleGl0OwotCi0JLyogU2V0IHVwIHBhcmFtcyBzbyBnZXQgYW5kIHNldCBjYW4gc2hhcmUgdGhlIGNvbnZlbmllbmNlIHZhcmlhYmxlcyAqLwotCWlmIChwYXJhbXMgPT0gTlVMTCkgewotCQlwYXJhbXMgPSBhcmc7Ci0JCXBsZW4gPSBsZW47Ci0JfQotCi0JaWYgKHZpLT50eXBlID09IElPVlRfVk9JRCkKLQkJdmFsX3NpemUgPSAwOwotCWVsc2UgaWYgKHZpLT50eXBlID09IElPVlRfQlVGRkVSKQotCQl2YWxfc2l6ZSA9IGxlbjsKLQllbHNlCi0JCXZhbF9zaXplID0gc2l6ZW9mKGludCk7Ci0KLQlpZiAocGxlbiA+PSAoaW50KXNpemVvZihpbnRfdmFsKSkKLQkJbWVtY3B5KCZpbnRfdmFsLCBwYXJhbXMsIHNpemVvZihpbnRfdmFsKSk7Ci0KLQlib29sX3ZhbCA9IChpbnRfdmFsICE9IDApID8gdHJ1ZSA6IGZhbHNlOwotCi0JYWN0aW9uaWQgPSBzZXQgPyBJT1ZfU1ZBTCh2aS0+dmFyaWQpIDogSU9WX0dWQUwodmktPnZhcmlkKTsKLQlzd2l0Y2ggKGFjdGlvbmlkKSB7Ci0JY2FzZSBJT1ZfR1ZBTChJT1ZfTVNHTEVWRUwpOgotCQlpbnRfdmFsID0gKHMzMikgc2RfbXNnbGV2ZWw7Ci0JCW1lbWNweShhcmcsICZpbnRfdmFsLCB2YWxfc2l6ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJT1ZfU1ZBTChJT1ZfTVNHTEVWRUwpOgotCQlzZF9tc2dsZXZlbCA9IGludF92YWw7Ci0JCWJyZWFrOwotCi0JY2FzZSBJT1ZfR1ZBTChJT1ZfQkxPQ0tTSVpFKToKLQkJaWYgKCh1MzIpIGludF92YWwgPiBzaS0+bnVtX2Z1bmNzKSB7Ci0JCQliY21lcnJvciA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlpbnRfdmFsID0gKHMzMikgc2ktPmNsaWVudF9ibG9ja19zaXplW2ludF92YWxdOwotCQltZW1jcHkoYXJnLCAmaW50X3ZhbCwgdmFsX3NpemUpOwotCQlicmVhazsKLQotCWNhc2UgSU9WX1NWQUwoSU9WX0JMT0NLU0laRSk6Ci0JCXsKLQkJCXVpbnQgZnVuYyA9ICgodTMyKSBpbnRfdmFsID4+IDE2KTsKLQkJCXVpbnQgYmxrc2l6ZSA9ICh1MTYpIGludF92YWw7Ci0JCQl1aW50IG1heHNpemU7Ci0KLQkJCWlmIChmdW5jID4gc2ktPm51bV9mdW5jcykgewotCQkJCWJjbWVycm9yID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJc3dpdGNoIChmdW5jKSB7Ci0JCQljYXNlIDA6Ci0JCQkJbWF4c2l6ZSA9IDMyOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCQkJCW1heHNpemUgPSBCTE9DS19TSVpFXzQzMTg7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDI6Ci0JCQkJbWF4c2l6ZSA9IEJMT0NLX1NJWkVfNDMyODsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJbWF4c2l6ZSA9IDA7Ci0JCQl9Ci0JCQlpZiAoYmxrc2l6ZSA+IG1heHNpemUpIHsKLQkJCQliY21lcnJvciA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoIWJsa3NpemUpCi0JCQkJYmxrc2l6ZSA9IG1heHNpemU7Ci0KLQkJCS8qIE5vdyBzZXQgaXQgKi8KLQkJCXNpLT5jbGllbnRfYmxvY2tfc2l6ZVtmdW5jXSA9IGJsa3NpemU7Ci0KLQkJCWJyZWFrOwotCQl9Ci0KLQljYXNlIElPVl9HVkFMKElPVl9SWENIQUlOKToKLQkJaW50X3ZhbCA9IGZhbHNlOwotCQltZW1jcHkoYXJnLCAmaW50X3ZhbCwgdmFsX3NpemUpOwotCQlicmVhazsKLQotCWNhc2UgSU9WX0dWQUwoSU9WX1VTRUlOVFMpOgotCQlpbnRfdmFsID0gKHMzMikgc2ktPnVzZV9jbGllbnRfaW50czsKLQkJbWVtY3B5KGFyZywgJmludF92YWwsIHZhbF9zaXplKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElPVl9TVkFMKElPVl9VU0VJTlRTKToKLQkJc2ktPnVzZV9jbGllbnRfaW50cyA9IChib29sKSBpbnRfdmFsOwotCQlpZiAoc2ktPnVzZV9jbGllbnRfaW50cykKLQkJCXNpLT5pbnRtYXNrIHw9IENMSUVOVF9JTlRSOwotCQllbHNlCi0JCQlzaS0+aW50bWFzayAmPSB+Q0xJRU5UX0lOVFI7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIElPVl9HVkFMKElPVl9OVU1JTlRTKToKLQkJaW50X3ZhbCA9IChzMzIpIHNpLT5pbnRyY291bnQ7Ci0JCW1lbWNweShhcmcsICZpbnRfdmFsLCB2YWxfc2l6ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJT1ZfR1ZBTChJT1ZfREVWUkVHKToKLQkJewotCQkJc3RydWN0IGJyY21mX3NkcmVnICpzZF9wdHIgPQotCQkJCQkoc3RydWN0IGJyY21mX3NkcmVnICopIHBhcmFtczsKLQkJCXU4IGRhdGEgPSAwOwotCi0JCQlpZiAoYnJjbWZfc2Rpb2hfY2ZnX3JlYWQKLQkJCSAgICAoc2ksIHNkX3B0ci0+ZnVuYywgc2RfcHRyLT5vZmZzZXQsICZkYXRhKSkgewotCQkJCWJjbWVycm9yID0gLUVJTzsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaW50X3ZhbCA9IChpbnQpZGF0YTsKLQkJCW1lbWNweShhcmcsICZpbnRfdmFsLCBzaXplb2YoaW50X3ZhbCkpOwotCQkJYnJlYWs7Ci0JCX0KLQotCWNhc2UgSU9WX1NWQUwoSU9WX0RFVlJFRyk6Ci0JCXsKLQkJCXN0cnVjdCBicmNtZl9zZHJlZyAqc2RfcHRyID0KLQkJCQkJKHN0cnVjdCBicmNtZl9zZHJlZyAqKSBwYXJhbXM7Ci0JCQl1OCBkYXRhID0gKHU4KSBzZF9wdHItPnZhbHVlOwotCi0JCQlpZiAoYnJjbWZfc2Rpb2hfY2ZnX3dyaXRlCi0JCQkgICAgKHNpLCBzZF9wdHItPmZ1bmMsIHNkX3B0ci0+b2Zmc2V0LCAmZGF0YSkpIHsKLQkJCQliY21lcnJvciA9IC1FSU87Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCi0JZGVmYXVsdDoKLQkJYmNtZXJyb3IgPSAtRU5PVFNVUFA7Ci0JCWJyZWFrOwotCX0KLWV4aXQ6Ci0KLQlyZXR1cm4gYmNtZXJyb3I7Ci19Ci0KLWV4dGVybiBpbnQKLWJyY21mX3NkaW9oX2NmZ19yZWFkKHN0cnVjdCBzZGlvaF9pbmZvICpzZCwgdWludCBmbmNfbnVtLCB1MzIgYWRkciwgdTggKmRhdGEpCi17Ci0JaW50IHN0YXR1czsKLQkvKiBObyBsb2NrIG5lZWRlZCBzaW5jZSBicmNtZl9zZGlvaF9yZXF1ZXN0X2J5dGUgZG9lcyBsb2NraW5nICovCi0Jc3RhdHVzID0gYnJjbWZfc2Rpb2hfcmVxdWVzdF9ieXRlKHNkLCBTRElPSF9SRUFELCBmbmNfbnVtLCBhZGRyLCBkYXRhKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi1leHRlcm4gaW50Ci1icmNtZl9zZGlvaF9jZmdfd3JpdGUoc3RydWN0IHNkaW9oX2luZm8gKnNkLCB1aW50IGZuY19udW0sIHUzMiBhZGRyLCB1OCAqZGF0YSkKLXsKLQkvKiBObyBsb2NrIG5lZWRlZCBzaW5jZSBicmNtZl9zZGlvaF9yZXF1ZXN0X2J5dGUgZG9lcyBsb2NraW5nICovCi0JaW50IHN0YXR1czsKLQlzdGF0dXMgPSBicmNtZl9zZGlvaF9yZXF1ZXN0X2J5dGUoc2QsIFNESU9IX1dSSVRFLCBmbmNfbnVtLCBhZGRyLCBkYXRhKTsKLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW50IGJyY21mX3NkaW9oX2dldF9jaXNhZGRyKHN0cnVjdCBzZGlvaF9pbmZvICpzZCwgdTMyIHJlZ2FkZHIpCi17Ci0JLyogcmVhZCAyNCBiaXRzIGFuZCByZXR1cm4gdmFsaWQgMTcgYml0IGFkZHIgKi8KLQlpbnQgaTsKLQl1MzIgc2NyYXRjaCwgcmVnZGF0YTsKLQl1OCAqcHRyID0gKHU4ICopJnNjcmF0Y2g7Ci0JZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQlpZiAoKGJyY21mX3NkaW9oX2NhcmRfcmVncmVhZChzZCwgMCwgcmVnYWRkciwgMSwgJnJlZ2RhdGEpKSAhPQotCQkgICAgU1VDQ0VTUykKLQkJCXNkX2VycigoIiVzOiBDYW4ndCByZWFkIVxuIiwgX19mdW5jX18pKTsKLQotCQkqcHRyKysgPSAodTgpIHJlZ2RhdGE7Ci0JCXJlZ2FkZHIrKzsKLQl9Ci0KLQkvKiBPbmx5IHRoZSBsb3dlciAxNy1iaXRzIGFyZSB2YWxpZCAqLwotCXNjcmF0Y2ggPSBsZTMyX3RvX2NwdShzY3JhdGNoKTsKLQlzY3JhdGNoICY9IDB4MDAwMUZGRkY7Ci0JcmV0dXJuIHNjcmF0Y2g7Ci19Ci0KLWV4dGVybiBpbnQKLWJyY21mX3NkaW9oX2Npc19yZWFkKHN0cnVjdCBzZGlvaF9pbmZvICpzZCwgdWludCBmdW5jLCB1OCAqY2lzZCwgdTMyIGxlbmd0aCkKLXsKLQl1MzIgY291bnQ7Ci0JaW50IG9mZnNldDsKLQl1MzIgZm9vOwotCXU4ICpjaXMgPSBjaXNkOwotCi0Jc2RfdHJhY2UoKCIlczogRnVuYyA9ICVkXG4iLCBfX2Z1bmNfXywgZnVuYykpOwotCi0JaWYgKCFzZC0+ZnVuY19jaXNfcHRyW2Z1bmNdKSB7Ci0JCW1lbXNldChjaXMsIDAsIGxlbmd0aCk7Ci0JCXNkX2VycigoIiVzOiBubyBmdW5jX2Npc19wdHJbJWRdXG4iLCBfX2Z1bmNfXywgZnVuYykpOwotCQlyZXR1cm4gLUVOT1RTVVBQOwotCX0KLQotCXNkX2VycigoIiVzOiBmdW5jX2Npc19wdHJbJWRdPTB4JTA0eFxuIiwgX19mdW5jX18sIGZ1bmMsCi0JCXNkLT5mdW5jX2Npc19wdHJbZnVuY10pKTsKLQotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGxlbmd0aDsgY291bnQrKykgewotCQlvZmZzZXQgPSBzZC0+ZnVuY19jaXNfcHRyW2Z1bmNdICsgY291bnQ7Ci0JCWlmIChicmNtZl9zZGlvaF9jYXJkX3JlZ3JlYWQoc2QsIDAsIG9mZnNldCwgMSwgJmZvbykgPCAwKSB7Ci0JCQlzZF9lcnIoKCIlczogcmVncmVhZCBmYWlsZWQ6IENhbid0IHJlYWQgQ0lTXG4iLAotCQkJCV9fZnVuY19fKSk7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCi0JCSpjaXMgPSAodTgpIChmb28gJiAweGZmKTsKLQkJY2lzKys7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWV4dGVybiBpbnQKLWJyY21mX3NkaW9oX3JlcXVlc3RfYnl0ZShzdHJ1Y3Qgc2Rpb2hfaW5mbyAqc2QsIHVpbnQgcncsIHVpbnQgZnVuYywKLQkJCSB1aW50IHJlZ2FkZHIsIHU4ICpieXRlKQotewotCWludCBlcnJfcmV0OwotCi0Jc2RfaW5mbygoIiVzOiBydz0lZCwgZnVuYz0lZCwgYWRkcj0weCUwNXhcbiIsIF9fZnVuY19fLCBydywgZnVuYywKLQkJIHJlZ2FkZHIpKTsKLQotCUJSQ01GX1BNX1JFU1VNRV9XQUlUKHNkaW9oX3JlcXVlc3RfYnl0ZV93YWl0KTsKLQlCUkNNRl9QTV9SRVNVTUVfUkVUVVJOX0VSUk9SKC1FSU8pOwotCWlmIChydykgewkJLyogQ01ENTIgV3JpdGUgKi8KLQkJaWYgKGZ1bmMgPT0gMCkgewotCQkJLyogQ2FuIG9ubHkgZGlyZWN0bHkgd3JpdGUgdG8gc29tZSBGMCByZWdpc3RlcnMuCi0JCQkgKiBIYW5kbGUgRjIgZW5hYmxlCi0JCQkgKiBhcyBhIHNwZWNpYWwgY2FzZS4KLQkJCSAqLwotCQkJaWYgKHJlZ2FkZHIgPT0gU0RJT19DQ0NSX0lPRXgpIHsKLQkJCQlpZiAoZ0luc3RhbmNlLT5mdW5jWzJdKSB7Ci0JCQkJCXNkaW9fY2xhaW1faG9zdChnSW5zdGFuY2UtPmZ1bmNbMl0pOwotCQkJCQlpZiAoKmJ5dGUgJiBTRElPX0ZVTkNfRU5BQkxFXzIpIHsKLQkJCQkJCS8qIEVuYWJsZSBGdW5jdGlvbiAyICovCi0JCQkJCQllcnJfcmV0ID0KLQkJCQkJCSAgICBzZGlvX2VuYWJsZV9mdW5jCi0JCQkJCQkgICAgKGdJbnN0YW5jZS0+ZnVuY1syXSk7Ci0JCQkJCQlpZiAoZXJyX3JldCkKLQkJCQkJCQlzZF9lcnIoKCJyZXF1ZXN0X2J5dGU6ICIKLQkJCQkJCQkJImVuYWJsZSBGMiAiCi0JCQkJCQkJCSJmYWlsZWQ6JWRcbiIsCi0JCQkJCQkJCSBlcnJfcmV0KSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvKiBEaXNhYmxlIEZ1bmN0aW9uIDIgKi8KLQkJCQkJCWVycl9yZXQgPQotCQkJCQkJICAgIHNkaW9fZGlzYWJsZV9mdW5jCi0JCQkJCQkgICAgKGdJbnN0YW5jZS0+ZnVuY1syXSk7Ci0JCQkJCQlpZiAoZXJyX3JldCkKLQkJCQkJCQlzZF9lcnIoKCJyZXF1ZXN0X2J5dGU6ICIKLQkJCQkJCQkJIkRpc2FiIEYyICIKLQkJCQkJCQkJImZhaWxlZDolZFxuIiwKLQkJCQkJCQkJIGVycl9yZXQpKTsKLQkJCQkJfQotCQkJCQlzZGlvX3JlbGVhc2VfaG9zdChnSW5zdGFuY2UtPmZ1bmNbMl0pOwotCQkJCX0KLQkJCX0KLQkJCS8qIHRvIGFsbG93IGFib3J0IGNvbW1hbmQgdGhyb3VnaCBGMSAqLwotCQkJZWxzZSBpZiAocmVnYWRkciA9PSBTRElPX0NDQ1JfQUJPUlQpIHsKLQkJCQlzZGlvX2NsYWltX2hvc3QoZ0luc3RhbmNlLT5mdW5jW2Z1bmNdKTsKLQkJCQkvKgotCQkJCSAqIHRoaXMgc2Rpb19mMF93cml0ZWIoKSBjYW4gYmUgcmVwbGFjZWQKLQkJCQkgKiB3aXRoIGFub3RoZXIgYXBpCi0JCQkJICogZGVwZW5kaW5nIHVwb24gTU1DIGRyaXZlciBjaGFuZ2UuCi0JCQkJICogQXMgb2YgdGhpcyB0aW1lLCB0aGlzIGlzIHRlbXBvcmFyYXkgb25lCi0JCQkJICovCi0JCQkJc2Rpb193cml0ZWIoZ0luc3RhbmNlLT5mdW5jW2Z1bmNdLCAqYnl0ZSwKLQkJCQkJICAgIHJlZ2FkZHIsICZlcnJfcmV0KTsKLQkJCQlzZGlvX3JlbGVhc2VfaG9zdChnSW5zdGFuY2UtPmZ1bmNbZnVuY10pOwotCQkJfSBlbHNlIGlmIChyZWdhZGRyIDwgMHhGMCkgewotCQkJCXNkX2VycigoImJyY21mOiBGMCBXcjoweCUwMng6IHdyaXRlICIKLQkJCQkJImRpc2FsbG93ZWRcbiIsIHJlZ2FkZHIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogQ2xhaW0gaG9zdCBjb250cm9sbGVyLCBwZXJmb3JtIEYwIHdyaXRlLAotCQkJCSBhbmQgcmVsZWFzZSAqLwotCQkJCXNkaW9fY2xhaW1faG9zdChnSW5zdGFuY2UtPmZ1bmNbZnVuY10pOwotCQkJCXNkaW9fZjBfd3JpdGViKGdJbnN0YW5jZS0+ZnVuY1tmdW5jXSwgKmJ5dGUsCi0JCQkJCSAgICAgICByZWdhZGRyLCAmZXJyX3JldCk7Ci0JCQkJc2Rpb19yZWxlYXNlX2hvc3QoZ0luc3RhbmNlLT5mdW5jW2Z1bmNdKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIENsYWltIGhvc3QgY29udHJvbGxlciwgcGVyZm9ybSBGbiB3cml0ZSwKLQkJCSBhbmQgcmVsZWFzZSAqLwotCQkJc2Rpb19jbGFpbV9ob3N0KGdJbnN0YW5jZS0+ZnVuY1tmdW5jXSk7Ci0JCQlzZGlvX3dyaXRlYihnSW5zdGFuY2UtPmZ1bmNbZnVuY10sICpieXRlLCByZWdhZGRyLAotCQkJCSAgICAmZXJyX3JldCk7Ci0JCQlzZGlvX3JlbGVhc2VfaG9zdChnSW5zdGFuY2UtPmZ1bmNbZnVuY10pOwotCQl9Ci0JfSBlbHNlIHsJCS8qIENNRDUyIFJlYWQgKi8KLQkJLyogQ2xhaW0gaG9zdCBjb250cm9sbGVyLCBwZXJmb3JtIEZuIHJlYWQsIGFuZCByZWxlYXNlICovCi0JCXNkaW9fY2xhaW1faG9zdChnSW5zdGFuY2UtPmZ1bmNbZnVuY10pOwotCi0JCWlmIChmdW5jID09IDApIHsKLQkJCSpieXRlID0KLQkJCSAgICBzZGlvX2YwX3JlYWRiKGdJbnN0YW5jZS0+ZnVuY1tmdW5jXSwgcmVnYWRkciwKLQkJCQkJICAmZXJyX3JldCk7Ci0JCX0gZWxzZSB7Ci0JCQkqYnl0ZSA9Ci0JCQkgICAgc2Rpb19yZWFkYihnSW5zdGFuY2UtPmZ1bmNbZnVuY10sIHJlZ2FkZHIsCi0JCQkJICAgICAgICZlcnJfcmV0KTsKLQkJfQotCi0JCXNkaW9fcmVsZWFzZV9ob3N0KGdJbnN0YW5jZS0+ZnVuY1tmdW5jXSk7Ci0JfQotCi0JaWYgKGVycl9yZXQpCi0JCXNkX2VycigoImJyY21mOiBGYWlsZWQgdG8gJXMgYnl0ZSBGJWQ6QDB4JTA1eD0lMDJ4LCAiCi0JCQkiRXJyOiAlZFxuIiwgcncgPyAiV3JpdGUiIDogIlJlYWQiLCBmdW5jLCByZWdhZGRyLAotCQkJKmJ5dGUsIGVycl9yZXQpKTsKLQotCXJldHVybiBlcnJfcmV0OwotfQotCi1leHRlcm4gaW50Ci1icmNtZl9zZGlvaF9yZXF1ZXN0X3dvcmQoc3RydWN0IHNkaW9oX2luZm8gKnNkLCB1aW50IGNtZF90eXBlLCB1aW50IHJ3LAotCQkJIHVpbnQgZnVuYywgdWludCBhZGRyLCB1MzIgKndvcmQsIHVpbnQgbmJ5dGVzKQotewotCWludCBlcnJfcmV0ID0gLUVJTzsKLQotCWlmIChmdW5jID09IDApIHsKLQkJc2RfZXJyKCgiJXM6IE9ubHkgQ01ENTIgYWxsb3dlZCB0byBGMC5cbiIsIF9fZnVuY19fKSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXNkX2luZm8oKCIlczogY21kX3R5cGU9JWQsIHJ3PSVkLCBmdW5jPSVkLCBhZGRyPTB4JTA1eCwgbmJ5dGVzPSVkXG4iLAotCQkgX19mdW5jX18sIGNtZF90eXBlLCBydywgZnVuYywgYWRkciwgbmJ5dGVzKSk7Ci0KLQlCUkNNRl9QTV9SRVNVTUVfV0FJVChzZGlvaF9yZXF1ZXN0X3dvcmRfd2FpdCk7Ci0JQlJDTUZfUE1fUkVTVU1FX1JFVFVSTl9FUlJPUigtRUlPKTsKLQkvKiBDbGFpbSBob3N0IGNvbnRyb2xsZXIgKi8KLQlzZGlvX2NsYWltX2hvc3QoZ0luc3RhbmNlLT5mdW5jW2Z1bmNdKTsKLQotCWlmIChydykgewkJLyogQ01ENTIgV3JpdGUgKi8KLQkJaWYgKG5ieXRlcyA9PSA0KSB7Ci0JCQlzZGlvX3dyaXRlbChnSW5zdGFuY2UtPmZ1bmNbZnVuY10sICp3b3JkLCBhZGRyLAotCQkJCSAgICAmZXJyX3JldCk7Ci0JCX0gZWxzZSBpZiAobmJ5dGVzID09IDIpIHsKLQkJCXNkaW9fd3JpdGV3KGdJbnN0YW5jZS0+ZnVuY1tmdW5jXSwgKCp3b3JkICYgMHhGRkZGKSwKLQkJCQkgICAgYWRkciwgJmVycl9yZXQpOwotCQl9IGVsc2UgewotCQkJc2RfZXJyKCgiJXM6IEludmFsaWQgbmJ5dGVzOiAlZFxuIiwgX19mdW5jX18sIG5ieXRlcykpOwotCQl9Ci0JfSBlbHNlIHsJCS8qIENNRDUyIFJlYWQgKi8KLQkJaWYgKG5ieXRlcyA9PSA0KSB7Ci0JCQkqd29yZCA9Ci0JCQkgICAgc2Rpb19yZWFkbChnSW5zdGFuY2UtPmZ1bmNbZnVuY10sIGFkZHIsICZlcnJfcmV0KTsKLQkJfSBlbHNlIGlmIChuYnl0ZXMgPT0gMikgewotCQkJKndvcmQgPQotCQkJICAgIHNkaW9fcmVhZHcoZ0luc3RhbmNlLT5mdW5jW2Z1bmNdLCBhZGRyLAotCQkJCSAgICAgICAmZXJyX3JldCkgJiAweEZGRkY7Ci0JCX0gZWxzZSB7Ci0JCQlzZF9lcnIoKCIlczogSW52YWxpZCBuYnl0ZXM6ICVkXG4iLCBfX2Z1bmNfXywgbmJ5dGVzKSk7Ci0JCX0KLQl9Ci0KLQkvKiBSZWxlYXNlIGhvc3QgY29udHJvbGxlciAqLwotCXNkaW9fcmVsZWFzZV9ob3N0KGdJbnN0YW5jZS0+ZnVuY1tmdW5jXSk7Ci0KLQlpZiAoZXJyX3JldCkgewotCQlzZF9lcnIoKCJicmNtZjogRmFpbGVkIHRvICVzIHdvcmQsIEVycjogMHglMDh4XG4iLAotCQkJcncgPyAiV3JpdGUiIDogIlJlYWQiLCBlcnJfcmV0KSk7Ci0JfQotCi0JcmV0dXJuIGVycl9yZXQ7Ci19Ci0KLXN0YXRpYyBpbnQKLWJyY21mX3NkaW9oX3JlcXVlc3RfcGFja2V0KHN0cnVjdCBzZGlvaF9pbmZvICpzZCwgdWludCBmaXhfaW5jLCB1aW50IHdyaXRlLAotCQkJICAgdWludCBmdW5jLCB1aW50IGFkZHIsIHN0cnVjdCBza19idWZmICpwa3QpCi17Ci0JYm9vbCBmaWZvID0gKGZpeF9pbmMgPT0gU0RJT0hfREFUQV9GSVgpOwotCXUzMiBTR0NvdW50ID0gMDsKLQlpbnQgZXJyX3JldCA9IDA7Ci0KLQlzdHJ1Y3Qgc2tfYnVmZiAqcG5leHQ7Ci0KLQlzZF90cmFjZSgoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKLQotCUJSQ01GX1BNX1JFU1VNRV9XQUlUKHNkaW9oX3JlcXVlc3RfcGFja2V0X3dhaXQpOwotCUJSQ01GX1BNX1JFU1VNRV9SRVRVUk5fRVJST1IoLUVJTyk7Ci0KLQkvKiBDbGFpbSBob3N0IGNvbnRyb2xsZXIgKi8KLQlzZGlvX2NsYWltX2hvc3QoZ0luc3RhbmNlLT5mdW5jW2Z1bmNdKTsKLQlmb3IgKHBuZXh0ID0gcGt0OyBwbmV4dDsgcG5leHQgPSBwbmV4dC0+bmV4dCkgewotCQl1aW50IHBrdF9sZW4gPSBwbmV4dC0+bGVuOwotCQlwa3RfbGVuICs9IDM7Ci0JCXBrdF9sZW4gJj0gMHhGRkZGRkZGQzsKLQotCQlpZiAoKHdyaXRlKSAmJiAoIWZpZm8pKSB7Ci0JCQllcnJfcmV0ID0gc2Rpb19tZW1jcHlfdG9pbyhnSW5zdGFuY2UtPmZ1bmNbZnVuY10sIGFkZHIsCi0JCQkJCQkgICAoKHU4ICopIChwbmV4dC0+ZGF0YSkpLAotCQkJCQkJICAgcGt0X2xlbik7Ci0JCX0gZWxzZSBpZiAod3JpdGUpIHsKLQkJCWVycl9yZXQgPSBzZGlvX21lbWNweV90b2lvKGdJbnN0YW5jZS0+ZnVuY1tmdW5jXSwgYWRkciwKLQkJCQkJCSAgICgodTggKikgKHBuZXh0LT5kYXRhKSksCi0JCQkJCQkgICBwa3RfbGVuKTsKLQkJfSBlbHNlIGlmIChmaWZvKSB7Ci0JCQllcnJfcmV0ID0gc2Rpb19yZWFkc2IoZ0luc3RhbmNlLT5mdW5jW2Z1bmNdLAotCQkJCQkgICAgICAoKHU4ICopIChwbmV4dC0+ZGF0YSkpLAotCQkJCQkgICAgICBhZGRyLCBwa3RfbGVuKTsKLQkJfSBlbHNlIHsKLQkJCWVycl9yZXQgPSBzZGlvX21lbWNweV9mcm9taW8oZ0luc3RhbmNlLT5mdW5jW2Z1bmNdLAotCQkJCQkJICAgICAoKHU4ICopIChwbmV4dC0+ZGF0YSkpLAotCQkJCQkJICAgICBhZGRyLCBwa3RfbGVuKTsKLQkJfQotCi0JCWlmIChlcnJfcmV0KSB7Ci0JCQlzZF9lcnIoKCIlczogJXMgRkFJTEVEICVwWyVkXSwgYWRkcj0weCUwNXgsIHBrdF9sZW49JWQsIgotCQkJCSAiRVJSPTB4JTA4eFxuIiwgX19mdW5jX18sCi0JCQkJICh3cml0ZSkgPyAiVFgiIDogIlJYIiwKLQkJCQkgcG5leHQsIFNHQ291bnQsIGFkZHIsIHBrdF9sZW4sIGVycl9yZXQpKTsKLQkJfSBlbHNlIHsKLQkJCXNkX3RyYWNlKCgiJXM6ICVzIHhmcidkICVwWyVkXSwgYWRkcj0weCUwNXgsIGxlbj0lZFxuIiwKLQkJCQkgIF9fZnVuY19fLAotCQkJCSAgKHdyaXRlKSA/ICJUWCIgOiAiUlgiLAotCQkJCSAgcG5leHQsIFNHQ291bnQsIGFkZHIsIHBrdF9sZW4pKTsKLQkJfQotCi0JCWlmICghZmlmbykKLQkJCWFkZHIgKz0gcGt0X2xlbjsKLQkJU0dDb3VudCsrOwotCi0JfQotCi0JLyogUmVsZWFzZSBob3N0IGNvbnRyb2xsZXIgKi8KLQlzZGlvX3JlbGVhc2VfaG9zdChnSW5zdGFuY2UtPmZ1bmNbZnVuY10pOwotCi0Jc2RfdHJhY2UoKCIlczogRXhpdFxuIiwgX19mdW5jX18pKTsKLQlyZXR1cm4gZXJyX3JldDsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBidWZmZXIgb3IgcGFja2V0LCBhbmQgZml4ZXMgZXZlcnl0aGluZyB1cAotICogc28gdGhhdCBpbiB0aGUgZW5kLCBhIERNQS1hYmxlIHBhY2tldCBpcyBjcmVhdGVkLgotICoKLSAqIEEgYnVmZmVyIGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCBwYWNrZXQgcG9pbnRlciwKLSAqIGFuZCBtYXkgb3IgbWF5IG5vdCBiZSBhbGlnbmVkLgotICogQSBwYWNrZXQgbWF5IGNvbnNpc3Qgb2YgYSBzaW5nbGUgcGFja2V0LCBvciBhIHBhY2tldCBjaGFpbi4KLSAqIElmIGl0IGlzIGEgcGFja2V0IGNoYWluLCB0aGVuIGFsbCB0aGUgcGFja2V0cyBpbiB0aGUgY2hhaW4KLSAqIG11c3QgYmUgcHJvcGVybHkgYWxpZ25lZC4KLSAqCi0gKiBJZiB0aGUgcGFja2V0IGRhdGEgaXMgbm90IGFsaWduZWQsIHRoZW4gdGhlcmUgbWF5IG9ubHkgYmUKLSAqIG9uZSBwYWNrZXQsIGFuZCBpbiB0aGlzIGNhc2UsICBpdCBpcyBjb3BpZWQgdG8gYSBuZXcKLSAqIGFsaWduZWQgcGFja2V0LgotICoKLSAqLwotZXh0ZXJuIGludAotYnJjbWZfc2Rpb2hfcmVxdWVzdF9idWZmZXIoc3RydWN0IHNkaW9oX2luZm8gKnNkLCB1aW50IHBpb19kbWEsIHVpbnQgZml4X2luYywKLQkJCSAgIHVpbnQgd3JpdGUsIHVpbnQgZnVuYywgdWludCBhZGRyLCB1aW50IHJlZ193aWR0aCwKLQkJCSAgIHVpbnQgYnVmbGVuX3UsIHU4ICpidWZmZXIsIHN0cnVjdCBza19idWZmICpwa3QpCi17Ci0JaW50IFN0YXR1czsKLQlzdHJ1Y3Qgc2tfYnVmZiAqbXlwa3QgPSBOVUxMOwotCi0Jc2RfdHJhY2UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQlCUkNNRl9QTV9SRVNVTUVfV0FJVChzZGlvaF9yZXF1ZXN0X2J1ZmZlcl93YWl0KTsKLQlCUkNNRl9QTV9SRVNVTUVfUkVUVVJOX0VSUk9SKC1FSU8pOwotCS8qIENhc2UgMTogd2UgZG9uJ3QgaGF2ZSBhIHBhY2tldC4gKi8KLQlpZiAocGt0ID09IE5VTEwpIHsKLQkJc2RfZGF0YSgoIiVzOiBDcmVhdGluZyBuZXcgJXMgUGFja2V0LCBsZW49JWRcbiIsCi0JCQkgX19mdW5jX18sIHdyaXRlID8gIlRYIiA6ICJSWCIsIGJ1Zmxlbl91KSk7Ci0JCW15cGt0ID0gYnJjbXVfcGt0X2J1Zl9nZXRfc2tiKGJ1Zmxlbl91KTsKLQkJaWYgKCFteXBrdCkgewotCQkJc2RfZXJyKCgiJXM6IGJyY211X3BrdF9idWZfZ2V0X3NrYiBmYWlsZWQ6IGxlbiAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgYnVmbGVuX3UpKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0KLQkJLyogRm9yIGEgd3JpdGUsIGNvcHkgdGhlIGJ1ZmZlciBkYXRhIGludG8gdGhlIHBhY2tldC4gKi8KLQkJaWYgKHdyaXRlKQotCQkJbWVtY3B5KG15cGt0LT5kYXRhLCBidWZmZXIsIGJ1Zmxlbl91KTsKLQotCQlTdGF0dXMgPSBicmNtZl9zZGlvaF9yZXF1ZXN0X3BhY2tldChzZCwgZml4X2luYywgd3JpdGUsIGZ1bmMsCi0JCQkJCQkgICAgYWRkciwgbXlwa3QpOwotCi0JCS8qIEZvciBhIHJlYWQsIGNvcHkgdGhlIHBhY2tldCBkYXRhIGJhY2sgdG8gdGhlIGJ1ZmZlci4gKi8KLQkJaWYgKCF3cml0ZSkKLQkJCW1lbWNweShidWZmZXIsIG15cGt0LT5kYXRhLCBidWZsZW5fdSk7Ci0KLQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihteXBrdCk7Ci0JfSBlbHNlIGlmICgoKHVsb25nKSAocGt0LT5kYXRhKSAmIERNQV9BTElHTl9NQVNLKSAhPSAwKSB7Ci0JCS8qCi0JCSAqIENhc2UgMjogV2UgaGF2ZSBhIHBhY2tldCwgYnV0IGl0IGlzIHVuYWxpZ25lZC4KLQkJICogSW4gdGhpcyBjYXNlLCB3ZSBjYW5ub3QgaGF2ZSBhIGNoYWluIChwa3QtPm5leHQgPT0gTlVMTCkKLQkJICovCi0JCXNkX2RhdGEoKCIlczogQ3JlYXRpbmcgYWxpZ25lZCAlcyBQYWNrZXQsIGxlbj0lZFxuIiwKLQkJCSBfX2Z1bmNfXywgd3JpdGUgPyAiVFgiIDogIlJYIiwgcGt0LT5sZW4pKTsKLQkJbXlwa3QgPSBicmNtdV9wa3RfYnVmX2dldF9za2IocGt0LT5sZW4pOwotCQlpZiAoIW15cGt0KSB7Ci0JCQlzZF9lcnIoKCIlczogYnJjbXVfcGt0X2J1Zl9nZXRfc2tiIGZhaWxlZDogbGVuICVkXG4iLAotCQkJCV9fZnVuY19fLCBwa3QtPmxlbikpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQotCQkvKiBGb3IgYSB3cml0ZSwgY29weSB0aGUgYnVmZmVyIGRhdGEgaW50byB0aGUgcGFja2V0LiAqLwotCQlpZiAod3JpdGUpCi0JCQltZW1jcHkobXlwa3QtPmRhdGEsIHBrdC0+ZGF0YSwgcGt0LT5sZW4pOwotCi0JCVN0YXR1cyA9IGJyY21mX3NkaW9oX3JlcXVlc3RfcGFja2V0KHNkLCBmaXhfaW5jLCB3cml0ZSwgZnVuYywKLQkJCQkJCSAgICBhZGRyLCBteXBrdCk7Ci0KLQkJLyogRm9yIGEgcmVhZCwgY29weSB0aGUgcGFja2V0IGRhdGEgYmFjayB0byB0aGUgYnVmZmVyLiAqLwotCQlpZiAoIXdyaXRlKQotCQkJbWVtY3B5KHBrdC0+ZGF0YSwgbXlwa3QtPmRhdGEsIG15cGt0LT5sZW4pOwotCi0JCWJyY211X3BrdF9idWZfZnJlZV9za2IobXlwa3QpOwotCX0gZWxzZSB7CQkvKiBjYXNlIDM6IFdlIGhhdmUgYSBwYWNrZXQgYW5kCi0JCQkJIGl0IGlzIGFsaWduZWQuICovCi0JCXNkX2RhdGEoKCIlczogQWxpZ25lZCAlcyBQYWNrZXQsIGRpcmVjdCBETUFcbiIsCi0JCQkgX19mdW5jX18sIHdyaXRlID8gIlR4IiA6ICJSeCIpKTsKLQkJU3RhdHVzID0gYnJjbWZfc2Rpb2hfcmVxdWVzdF9wYWNrZXQoc2QsIGZpeF9pbmMsIHdyaXRlLCBmdW5jLAotCQkJCQkJICAgIGFkZHIsIHBrdCk7Ci0JfQotCi0JcmV0dXJuIFN0YXR1czsKLX0KLQotLyogdGhpcyBmdW5jdGlvbiBwZXJmb3JtcyAiYWJvcnQiIGZvciBib3RoIG9mIGhvc3QgJiBkZXZpY2UgKi8KLWV4dGVybiBpbnQgYnJjbWZfc2Rpb2hfYWJvcnQoc3RydWN0IHNkaW9oX2luZm8gKnNkLCB1aW50IGZ1bmMpCi17Ci0JY2hhciB0X2Z1bmMgPSAoY2hhcilmdW5jOwotCXNkX3RyYWNlKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwotCi0JLyogaXNzdWUgYWJvcnQgY21kNTIgY29tbWFuZCB0aHJvdWdoIEYwICovCi0JYnJjbWZfc2Rpb2hfcmVxdWVzdF9ieXRlKHNkLCBTRElPSF9XUklURSwgU0RJT19GVU5DXzAsIFNESU9fQ0NDUl9BQk9SVCwKLQkJCSAgICZ0X2Z1bmMpOwotCi0Jc2RfdHJhY2UoKCIlczogRXhpdFxuIiwgX19mdW5jX18pKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogRGlzYWJsZSBkZXZpY2UgaW50ZXJydXB0ICovCi12b2lkIGJyY21mX3NkaW9oX2Rldl9pbnRyX29mZihzdHJ1Y3Qgc2Rpb2hfaW5mbyAqc2QpCi17Ci0Jc2RfdHJhY2UoKCIlczogJWRcbiIsIF9fZnVuY19fLCBzZC0+dXNlX2NsaWVudF9pbnRzKSk7Ci0Jc2QtPmludG1hc2sgJj0gfkNMSUVOVF9JTlRSOwotfQotCi0vKiBFbmFibGUgZGV2aWNlIGludGVycnVwdCAqLwotdm9pZCBicmNtZl9zZGlvaF9kZXZfaW50cl9vbihzdHJ1Y3Qgc2Rpb2hfaW5mbyAqc2QpCi17Ci0Jc2RfdHJhY2UoKCIlczogJWRcbiIsIF9fZnVuY19fLCBzZC0+dXNlX2NsaWVudF9pbnRzKSk7Ci0Jc2QtPmludG1hc2sgfD0gQ0xJRU5UX0lOVFI7Ci19Ci0KLS8qIFJlYWQgY2xpZW50IGNhcmQgcmVnICovCi1pbnQKLWJyY21mX3NkaW9oX2NhcmRfcmVncmVhZChzdHJ1Y3Qgc2Rpb2hfaW5mbyAqc2QsIGludCBmdW5jLCB1MzIgcmVnYWRkciwKLQkJCSBpbnQgcmVnc2l6ZSwgdTMyICpkYXRhKQotewotCi0JaWYgKChmdW5jID09IDApIHx8IChyZWdzaXplID09IDEpKSB7Ci0JCXU4IHRlbXAgPSAwOwotCi0JCWJyY21mX3NkaW9oX3JlcXVlc3RfYnl0ZShzZCwgU0RJT0hfUkVBRCwgZnVuYywgcmVnYWRkciwgJnRlbXApOwotCQkqZGF0YSA9IHRlbXA7Ci0JCSpkYXRhICY9IDB4ZmY7Ci0JCXNkX2RhdGEoKCIlczogYnl0ZSByZWFkIGRhdGE9MHglMDJ4XG4iLCBfX2Z1bmNfXywgKmRhdGEpKTsKLQl9IGVsc2UgewotCQlicmNtZl9zZGlvaF9yZXF1ZXN0X3dvcmQoc2QsIDAsIFNESU9IX1JFQUQsIGZ1bmMsIHJlZ2FkZHIsIGRhdGEsCi0JCQkJICAgcmVnc2l6ZSk7Ci0JCWlmIChyZWdzaXplID09IDIpCi0JCQkqZGF0YSAmPSAweGZmZmY7Ci0KLQkJc2RfZGF0YSgoIiVzOiB3b3JkIHJlYWQgZGF0YT0weCUwOHhcbiIsIF9fZnVuY19fLCAqZGF0YSkpOwotCX0KLQotCXJldHVybiBTVUNDRVNTOwotfQotCi1zdGF0aWMgdm9pZCBicmNtZl9zZGlvaF9pcnFoYW5kbGVyKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMpCi17Ci0Jc3RydWN0IHNkaW9oX2luZm8gKnNkOwotCi0Jc2RfdHJhY2UoKCJicmNtZjogKioqSVJRSGFuZGxlclxuIikpOwotCXNkID0gZ0luc3RhbmNlLT5zZDsKLQotCXNkaW9fcmVsZWFzZV9ob3N0KGdJbnN0YW5jZS0+ZnVuY1swXSk7Ci0KLQlpZiAoc2QtPnVzZV9jbGllbnRfaW50cykgewotCQlzZC0+aW50cmNvdW50Kys7Ci0JCShzZC0+aW50cl9oYW5kbGVyKSAoc2QtPmludHJfaGFuZGxlcl9hcmcpOwotCX0gZWxzZSB7Ci0JCXNkX2VycigoImJyY21mOiAqKipJUlFIYW5kbGVyXG4iKSk7Ci0KLQkJc2RfZXJyKCgiJXM6IE5vdCByZWFkeSBmb3IgaW50cjogZW5hYmxlZCAlZCwgaGFuZGxlciAlcFxuIiwKLQkJCV9fZnVuY19fLCBzZC0+Y2xpZW50X2ludHJfZW5hYmxlZCwgc2QtPmludHJfaGFuZGxlcikpOwotCX0KLQotCXNkaW9fY2xhaW1faG9zdChnSW5zdGFuY2UtPmZ1bmNbMF0pOwotfQotCi0vKiBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgRjIgKGR1bW15IGhhbmRsZXIpICovCi1zdGF0aWMgdm9pZCBicmNtZl9zZGlvaF9pcnFoYW5kbGVyX2YyKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMpCi17Ci0Jc3RydWN0IHNkaW9oX2luZm8gKnNkOwotCi0Jc2RfdHJhY2UoKCJicmNtZjogKioqSVJRSGFuZGxlckYyXG4iKSk7Ci0KLQlzZCA9IGdJbnN0YW5jZS0+c2Q7Ci19Ci0KLXN0YXRpYyBpbnQgYnJjbWZfb3BzX3NkaW9fcHJvYmUoc3RydWN0IHNkaW9fZnVuYyAqZnVuYywKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBzZGlvX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RhdGljIHN0cnVjdCBzZGlvX2Z1bmMgc2Rpb19mdW5jXzA7Ci0Jc2RfdHJhY2UoKCJzZGlvX3Byb2JlOiAlcyBFbnRlclxuIiwgX19mdW5jX18pKTsKLQlzZF90cmFjZSgoInNkaW9fcHJvYmU6IGZ1bmMtPmNsYXNzPSV4XG4iLCBmdW5jLT5jbGFzcykpOwotCXNkX3RyYWNlKCgic2Rpb192ZW5kb3I6IDB4JTA0eFxuIiwgZnVuYy0+dmVuZG9yKSk7Ci0Jc2RfdHJhY2UoKCJzZGlvX2RldmljZTogMHglMDR4XG4iLCBmdW5jLT5kZXZpY2UpKTsKLQlzZF90cmFjZSgoIkZ1bmN0aW9uIzogMHglMDR4XG4iLCBmdW5jLT5udW0pKTsKLQotCWlmIChmdW5jLT5udW0gPT0gMSkgewotCQlzZGlvX2Z1bmNfMC5udW0gPSAwOwotCQlzZGlvX2Z1bmNfMC5jYXJkID0gZnVuYy0+Y2FyZDsKLQkJZ0luc3RhbmNlLT5mdW5jWzBdID0gJnNkaW9fZnVuY18wOwotCQlpZiAoZnVuYy0+ZGV2aWNlID09IDB4NCkgewkvKiA0MzE4ICovCi0JCQlnSW5zdGFuY2UtPmZ1bmNbMl0gPSBOVUxMOwotCQkJc2RfdHJhY2UoKCJOSUMgZm91bmQsIGNhbGxpbmcgYnJjbWZfc2Rpb19wcm9iZS4uLlxuIikpOwotCQkJcmV0ID0gYnJjbWZfc2Rpb19wcm9iZSgmc2RtbWNfZGV2KTsKLQkJfQotCX0KLQotCWdJbnN0YW5jZS0+ZnVuY1tmdW5jLT5udW1dID0gZnVuYzsKLQotCWlmIChmdW5jLT5udW0gPT0gMikgewotCQlicmNtZl9jZmc4MDIxMV9zZGlvX2Z1bmMoZnVuYyk7Ci0JCXNkX3RyYWNlKCgiRjIgZm91bmQsIGNhbGxpbmcgYnJjbWZfc2Rpb19wcm9iZS4uLlxuIikpOwotCQlyZXQgPSBicmNtZl9zZGlvX3Byb2JlKCZzZG1tY19kZXYpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21mX29wc19zZGlvX3JlbW92ZShzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jKQotewotCXNkX3RyYWNlKCgiJXMgRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0Jc2RfaW5mbygoImZ1bmMtPmNsYXNzPSV4XG4iLCBmdW5jLT5jbGFzcykpOwotCXNkX2luZm8oKCJzZGlvX3ZlbmRvcjogMHglMDR4XG4iLCBmdW5jLT52ZW5kb3IpKTsKLQlzZF9pbmZvKCgic2Rpb19kZXZpY2U6IDB4JTA0eFxuIiwgZnVuYy0+ZGV2aWNlKSk7Ci0Jc2RfaW5mbygoIkZ1bmN0aW9uIzogMHglMDR4XG4iLCBmdW5jLT5udW0pKTsKLQotCWlmIChmdW5jLT5udW0gPT0gMikgewotCQlzZF90cmFjZSgoIkYyIGZvdW5kLCBjYWxsaW5nIGJyY21mX3NkaW9fcmVtb3ZlLi4uXG4iKSk7Ci0JCWJyY21mX3NkaW9fcmVtb3ZlKCZzZG1tY19kZXYpOwotCX0KLX0KLQotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IGJyY21mX3NkaW9fc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JbW1jX3BtX2ZsYWdfdCBzZGlvX2ZsYWdzOwotCWludCByZXQgPSAwOwotCi0Jc2RfdHJhY2UoKCIlc1xuIiwgX19mdW5jX18pKTsKLQotCXNkaW9fZmxhZ3MgPSBzZGlvX2dldF9ob3N0X3BtX2NhcHMoZ0luc3RhbmNlLT5mdW5jWzFdKTsKLQlpZiAoIShzZGlvX2ZsYWdzICYgTU1DX1BNX0tFRVBfUE9XRVIpKSB7Ci0JCXNkX2VycigoIkhvc3QgY2FuJ3Qga2VlcCBwb3dlciB3aGlsZSBzdXNwZW5kZWRcbiIpKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gc2Rpb19zZXRfaG9zdF9wbV9mbGFncyhnSW5zdGFuY2UtPmZ1bmNbMV0sIE1NQ19QTV9LRUVQX1BPV0VSKTsKLQlpZiAocmV0KSB7Ci0JCXNkX2VycigoIkZhaWxlZCB0byBzZXQgcG1fZmxhZ3NcbiIpKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlicmNtZl9zZGlvX3dkdG1yX2VuYWJsZShmYWxzZSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGJyY21mX3NkaW9fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlicmNtZl9zZGlvX3dkdG1yX2VuYWJsZSh0cnVlKTsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgkJLyogQ09ORklHX1BNICovCi0KLWludCBicmNtZl9zZGlvaF9vc2luaXQoc3RydWN0IHNkaW9oX2luZm8gKnNkKQotewotCXN0cnVjdCBzZG9zX2luZm8gKnNkb3M7Ci0KLQlzZG9zID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNkb3NfaW5mbyksIEdGUF9BVE9NSUMpOwotCXNkLT5zZG9zX2luZm8gPSAodm9pZCAqKXNkb3M7Ci0JaWYgKHNkb3MgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzZG9zLT5zZCA9IHNkOwotCXNwaW5fbG9ja19pbml0KCZzZG9zLT5sb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBicmNtZl9zZGlvaF9vc2ZyZWUoc3RydWN0IHNkaW9oX2luZm8gKnNkKQotewotCXN0cnVjdCBzZG9zX2luZm8gKnNkb3M7Ci0KLQlzZG9zID0gKHN0cnVjdCBzZG9zX2luZm8gKilzZC0+c2Rvc19pbmZvOwotCWtmcmVlKHNkb3MpOwotfQotCi0vKiBJbnRlcnJ1cHQgZW5hYmxlL2Rpc2FibGUgKi8KLWludCBicmNtZl9zZGlvaF9pbnRlcnJ1cHRfc2V0KHN0cnVjdCBzZGlvaF9pbmZvICpzZCwgYm9vbCBlbmFibGUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3Qgc2Rvc19pbmZvICpzZG9zOwotCi0Jc2RfdHJhY2UoKCIlczogJXNcbiIsIF9fZnVuY19fLCBlbmFibGUgPyAiRW5hYmxpbmciIDogIkRpc2FibGluZyIpKTsKLQotCXNkb3MgPSAoc3RydWN0IHNkb3NfaW5mbyAqKXNkLT5zZG9zX2luZm87Ci0KLQlpZiAoZW5hYmxlICYmICEoc2QtPmludHJfaGFuZGxlciAmJiBzZC0+aW50cl9oYW5kbGVyX2FyZykpIHsKLQkJc2RfZXJyKCgiJXM6IG5vIGhhbmRsZXIgcmVnaXN0ZXJlZCwgd2lsbCBub3QgZW5hYmxlXG4iLAotCQkJX19mdW5jX18pKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyogRW5zdXJlIGF0b21pY2l0eSBmb3IgZW5hYmxlL2Rpc2FibGUgY2FsbHMgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2Rvcy0+bG9jaywgZmxhZ3MpOwotCi0Jc2QtPmNsaWVudF9pbnRyX2VuYWJsZWQgPSBlbmFibGU7Ci0JaWYgKGVuYWJsZSkKLQkJYnJjbWZfc2Rpb2hfZGV2X2ludHJfb24oc2QpOwotCWVsc2UKLQkJYnJjbWZfc2Rpb2hfZGV2X2ludHJfb2ZmKHNkKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNkb3MtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogbW9kdWxlIGluaXQKLSovCi1pbnQgYnJjbWZfc2Rpb19mdW5jdGlvbl9pbml0KHZvaWQpCi17Ci0JaW50IGVycm9yID0gMDsKLQlzZF90cmFjZSgoImJyY21mX3NkaW9fZnVuY3Rpb25faW5pdDogJXMgRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQlnSW5zdGFuY2UgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnJjbWZfc2RtbWNfaW5zdGFuY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWdJbnN0YW5jZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQltZW1zZXQoJnNkbW1jX2RldiwgMCwgc2l6ZW9mKHNkbW1jX2RldikpOwotCWVycm9yID0gc2Rpb19yZWdpc3Rlcl9kcml2ZXIoJmJyY21mX3NkbW1jX2RyaXZlcik7Ci0KLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qCi0gKiBtb2R1bGUgY2xlYW51cAotKi8KLXZvaWQgYnJjbWZfc2Rpb19mdW5jdGlvbl9jbGVhbnVwKHZvaWQpCi17Ci0Jc2RfdHJhY2UoKCIlcyBFbnRlclxuIiwgX19mdW5jX18pKTsKLQotCXNkaW9fdW5yZWdpc3Rlcl9kcml2ZXIoJmJyY21mX3NkbW1jX2RyaXZlcik7Ci0KLQlrZnJlZShnSW5zdGFuY2UpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGQuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYmYwNGQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDkwNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioKLSAqIENvbW1vbiB0eXBlcyAqCi0gKi8KLQotI2lmbmRlZiBfQlJDTUZfSF8KLSNkZWZpbmUgX0JSQ01GX0hfCi0KLSNkZWZpbmUgQlJDTUZfVkVSU0lPTl9TVFIJCSI0LjIxOC4yNDguNSIKLQotI2RlZmluZQlCUkNNRl9DX0lPQ1RMX1NNTEVOCTI1NgkvKiAic21hbGwiIGlvY3RsIGJ1ZmZlciByZXF1aXJlZCAqLwotI2RlZmluZSBCUkNNRl9DX0lPQ1RMX01FRExFTgkxNTM2CS8qICJtZWQiIGlvY3RsIGJ1ZmZlciByZXF1aXJlZCAqLwotI2RlZmluZQlCUkNNRl9DX0lPQ1RMX01BWExFTgk4MTkyCi0KLSNkZWZpbmUgQlJDTUZfQ19VUAkJCQkyCi0jZGVmaW5lIEJSQ01GX0NfU0VUX1BST01JU0MJCQkxMAotI2RlZmluZSBCUkNNRl9DX0dFVF9SQVRFCQkJMTIKLSNkZWZpbmUgQlJDTUZfQ19HRVRfSU5GUkEJCQkxOQotI2RlZmluZSBCUkNNRl9DX1NFVF9JTkZSQQkJCTIwCi0jZGVmaW5lIEJSQ01GX0NfR0VUX0FVVEgJCQkyMQotI2RlZmluZSBCUkNNRl9DX1NFVF9BVVRICQkJMjIKLSNkZWZpbmUgQlJDTUZfQ19HRVRfQlNTSUQJCQkyMwotI2RlZmluZSBCUkNNRl9DX0dFVF9TU0lECQkJMjUKLSNkZWZpbmUgQlJDTUZfQ19TRVRfU1NJRAkJCTI2Ci0jZGVmaW5lIEJSQ01GX0NfR0VUX0NIQU5ORUwJCQkyOQotI2RlZmluZSBCUkNNRl9DX0dFVF9TUkwJCQkJMzEKLSNkZWZpbmUgQlJDTUZfQ19HRVRfTFJMCQkJCTMzCi0jZGVmaW5lIEJSQ01GX0NfR0VUX1JBRElPCQkJMzcKLSNkZWZpbmUgQlJDTUZfQ19TRVRfUkFESU8JCQkzOAotI2RlZmluZSBCUkNNRl9DX0dFVF9QSFlUWVBFCQkJMzkKLSNkZWZpbmUgQlJDTUZfQ19TRVRfS0VZCQkJCTQ1Ci0jZGVmaW5lIEJSQ01GX0NfU0VUX1BBU1NJVkVfU0NBTgkJNDkKLSNkZWZpbmUgQlJDTUZfQ19TQ0FOCQkJCTUwCi0jZGVmaW5lIEJSQ01GX0NfU0NBTl9SRVNVTFRTCQkJNTEKLSNkZWZpbmUgQlJDTUZfQ19ESVNBU1NPQwkJCTUyCi0jZGVmaW5lIEJSQ01GX0NfUkVBU1NPQwkJCQk1MwotI2RlZmluZSBCUkNNRl9DX1NFVF9ST0FNX1RSSUdHRVIJCTU1Ci0jZGVmaW5lIEJSQ01GX0NfU0VUX1JPQU1fREVMVEEJCQk1NwotI2RlZmluZSBCUkNNRl9DX0dFVF9EVElNUFJECQkJNzcKLSNkZWZpbmUgQlJDTUZfQ19TRVRfQ09VTlRSWQkJCTg0Ci0jZGVmaW5lIEJSQ01GX0NfR0VUX1BNCQkJCTg1Ci0jZGVmaW5lIEJSQ01GX0NfU0VUX1BNCQkJCTg2Ci0jZGVmaW5lIEJSQ01GX0NfR0VUX0FQCQkJCTExNwotI2RlZmluZSBCUkNNRl9DX1NFVF9BUAkJCQkxMTgKLSNkZWZpbmUgQlJDTUZfQ19HRVRfUlNTSQkJCTEyNwotI2RlZmluZSBCUkNNRl9DX0dFVF9XU0VDCQkJMTMzCi0jZGVmaW5lIEJSQ01GX0NfU0VUX1dTRUMJCQkxMzQKLSNkZWZpbmUgQlJDTUZfQ19HRVRfUEhZX05PSVNFCQkJMTM1Ci0jZGVmaW5lIEJSQ01GX0NfR0VUX0JTU19JTkZPCQkJMTM2Ci0jZGVmaW5lIEJSQ01GX0NfU0VUX1NDQU5fQ0hBTk5FTF9USU1FCQkxODUKLSNkZWZpbmUgQlJDTUZfQ19TRVRfU0NBTl9VTkFTU09DX1RJTUUJCTE4NwotI2RlZmluZSBCUkNNRl9DX1NDQl9ERUFVVEhFTlRJQ0FURV9GT1JfUkVBU09OCTIwMQotI2RlZmluZSBCUkNNRl9DX0dFVF9WQUxJRF9DSEFOTkVMUwkJMjE3Ci0jZGVmaW5lIEJSQ01GX0NfR0VUX0tFWV9QUklNQVJZCQkJMjM1Ci0jZGVmaW5lIEJSQ01GX0NfU0VUX0tFWV9QUklNQVJZCQkJMjM2Ci0jZGVmaW5lIEJSQ01GX0NfU0VUX1NDQU5fUEFTU0lWRV9USU1FCQkyNTgKLSNkZWZpbmUgQlJDTUZfQ19HRVRfVkFSCQkJCTI2MgotI2RlZmluZSBCUkNNRl9DX1NFVF9WQVIJCQkJMjYzCi0KLS8qIHBoeSB0eXBlcyAocmV0dXJuZWQgYnkgV0xDX0dFVF9QSFlUUEUpICovCi0jZGVmaW5lCVdMQ19QSFlfVFlQRV9BCQkwCi0jZGVmaW5lCVdMQ19QSFlfVFlQRV9CCQkxCi0jZGVmaW5lCVdMQ19QSFlfVFlQRV9HCQkyCi0jZGVmaW5lCVdMQ19QSFlfVFlQRV9OCQk0Ci0jZGVmaW5lCVdMQ19QSFlfVFlQRV9MUAkJNQotI2RlZmluZQlXTENfUEhZX1RZUEVfU1NOCTYKLSNkZWZpbmUJV0xDX1BIWV9UWVBFX0hUCQk3Ci0jZGVmaW5lCVdMQ19QSFlfVFlQRV9MQ04JOAotI2RlZmluZQlXTENfUEhZX1RZUEVfTlVMTAkweGYKLQotI2RlZmluZSBCUkNNRl9QS1RfRklMVEVSX0ZJWEVEX0xFTglvZmZzZXRvZihzdHJ1Y3QgYnJjbWZfcGt0X2ZpbHRlciwgdSkKLSNkZWZpbmUgQlJDTUZfUEtUX0ZJTFRFUl9QQVRURVJOX0ZJWEVEX0xFTglcCi0Jb2Zmc2V0b2Yoc3RydWN0IGJyY21mX3BrdF9maWx0ZXJfcGF0dGVybiwgbWFza19hbmRfcGF0dGVybikKLQotI2RlZmluZSBCUkNNRl9FVkVOVElOR19NQVNLX0xFTgkxNgotCi0jZGVmaW5lIFRPRV9UWF9DU1VNX09MCQkweDAwMDAwMDAxCi0jZGVmaW5lIFRPRV9SWF9DU1VNX09MCQkweDAwMDAwMDAyCi0KLS8qIG1heGltdW0gY2hhbm5lbHMgcmV0dXJuZWQgYnkgdGhlIGdldCB2YWxpZCBjaGFubmVscyBpb3ZhciAqLwotI2RlZmluZSBXTF9OVU1DSEFOTkVMUwkJNjQKLQotI2RlZmluZQlCUkNNRl9CU1NfSU5GT19WRVJTSU9OCTEwOCAvKiBjdXJyZW50IHZlciBvZiBicmNtZl9ic3NfaW5mbyBzdHJ1Y3QgKi8KLQotLyogc2l6ZSBvZiBicmNtZl9zY2FuX3BhcmFtcyBub3QgaW5jbHVkaW5nIHZhcmlhYmxlIGxlbmd0aCBhcnJheSAqLwotI2RlZmluZSBCUkNNRl9TQ0FOX1BBUkFNU19GSVhFRF9TSVpFIDY0Ci0KLS8qIG1hc2tzIGZvciBjaGFubmVsIGFuZCBzc2lkIGNvdW50ICovCi0jZGVmaW5lIEJSQ01GX1NDQU5fUEFSQU1TX0NPVU5UX01BU0sgMHgwMDAwZmZmZgotI2RlZmluZSBCUkNNRl9TQ0FOX1BBUkFNU19OU1NJRF9TSElGVCAxNgotCi0jZGVmaW5lIEJSQ01GX1NDQU5fQUNUSU9OX1NUQVJUICAgICAgMQotI2RlZmluZSBCUkNNRl9TQ0FOX0FDVElPTl9DT05USU5VRSAgIDIKLSNkZWZpbmUgV0xfU0NBTl9BQ1RJT05fQUJPUlQgICAgICAzCi0KLSNkZWZpbmUgQlJDTUZfSVNDQU5fUkVRX1ZFUlNJT04gMQotCi0vKiBicmNtZl9pc2Nhbl9yZXN1bHRzIHN0YXR1cyB2YWx1ZXMgKi8KLSNkZWZpbmUgQlJDTUZfU0NBTl9SRVNVTFRTX1NVQ0NFU1MJMAotI2RlZmluZSBCUkNNRl9TQ0FOX1JFU1VMVFNfUEFSVElBTAkxCi0jZGVmaW5lIEJSQ01GX1NDQU5fUkVTVUxUU19QRU5ESU5HCTIKLSNkZWZpbmUgQlJDTUZfU0NBTl9SRVNVTFRTX0FCT1JURUQJMwotI2RlZmluZSBCUkNNRl9TQ0FOX1JFU1VMVFNfTk9fTUVNCTQKLQotI2RlZmluZSBXTF9TT0ZUX0tFWQkoMSA8PCAwKQkvKiBJbmRpY2F0ZXMgdGhpcyBrZXkgaXMgdXNpbmcgc29mdCBlbmNyeXB0ICovCi0jZGVmaW5lIEJSQ01GX1BSSU1BUllfS0VZCSgxIDw8IDEpCS8qIHByaW1hcnkgKGllIHR4KSBrZXkgKi8KLSNkZWZpbmUgV0xfS0ZfUkVTXzQJKDEgPDwgNCkJLyogUmVzZXJ2ZWQgZm9yIGJhY2t3YXJkIGNvbXBhdCAqLwotI2RlZmluZSBXTF9LRl9SRVNfNQkoMSA8PCA1KQkvKiBSZXNlcnZlZCBmb3IgYmFja3dhcmQgY29tcGF0ICovCi0jZGVmaW5lIFdMX0lCU1NfUEVFUl9HUk9VUF9LRVkJKDEgPDwgNikJLyogSW5kaWNhdGVzIGEgZ3JvdXAga2V5IGZvciBhIElCU1MgUEVFUiAqLwotCi0vKiBGb3Igc3VwcG9ydGluZyBtdWx0aXBsZSBpbnRlcmZhY2VzICovCi0jZGVmaW5lIEJSQ01GX01BWF9JRlMJMTYKLSNkZWZpbmUgQlJDTUZfREVMX0lGCS0weGUKLSNkZWZpbmUgQlJDTUZfQkFEX0lGCS0weGYKLQotI2RlZmluZSBET1QxMV9CU1NUWVBFX0FOWQkJCTIKLSNkZWZpbmUgRE9UMTFfTUFYX0RFRkFVTFRfS0VZUwk0Ci0KLSNkZWZpbmUgQlJDTUZfRVZFTlRfTVNHX0xJTksJCTB4MDEKLSNkZWZpbmUgQlJDTUZfRVZFTlRfTVNHX0ZMVVNIVFhRCTB4MDIKLSNkZWZpbmUgQlJDTUZfRVZFTlRfTVNHX0dST1VQCQkweDA0Ci0KLXN0cnVjdCBicmNtZl9ldmVudF9tc2cgewotCXUxNiB2ZXJzaW9uOwotCXUxNiBmbGFnczsKLQl1MzIgZXZlbnRfdHlwZTsKLQl1MzIgc3RhdHVzOwotCXUzMiByZWFzb247Ci0JdTMyIGF1dGhfdHlwZTsKLQl1MzIgZGF0YWxlbjsKLQl1OCBhZGRyW0VUSF9BTEVOXTsKLQljaGFyIGlmbmFtZVtJRk5BTVNJWl07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYnJjbV9ldGhoZHIgewotCXUxNiBzdWJ0eXBlOwotCXUxNiBsZW5ndGg7Ci0JdTggdmVyc2lvbjsKLQl1OCBvdWlbM107Ci0JdTE2IHVzcl9zdWJ0eXBlOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGJyY21mX2V2ZW50IHsKLQlzdHJ1Y3QgZXRoaGRyIGV0aDsKLQlzdHJ1Y3QgYnJjbV9ldGhoZHIgaGRyOwotCXN0cnVjdCBicmNtZl9ldmVudF9tc2cgbXNnOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGRuZ2xfc3RhdHMgewotCXVuc2lnbmVkIGxvbmcgcnhfcGFja2V0czsJLyogdG90YWwgcGFja2V0cyByZWNlaXZlZCAqLwotCXVuc2lnbmVkIGxvbmcgdHhfcGFja2V0czsJLyogdG90YWwgcGFja2V0cyB0cmFuc21pdHRlZCAqLwotCXVuc2lnbmVkIGxvbmcgcnhfYnl0ZXM7CS8qIHRvdGFsIGJ5dGVzIHJlY2VpdmVkICovCi0JdW5zaWduZWQgbG9uZyB0eF9ieXRlczsJLyogdG90YWwgYnl0ZXMgdHJhbnNtaXR0ZWQgKi8KLQl1bnNpZ25lZCBsb25nIHJ4X2Vycm9yczsJLyogYmFkIHBhY2tldHMgcmVjZWl2ZWQgKi8KLQl1bnNpZ25lZCBsb25nIHR4X2Vycm9yczsJLyogcGFja2V0IHRyYW5zbWl0IHByb2JsZW1zICovCi0JdW5zaWduZWQgbG9uZyByeF9kcm9wcGVkOwkvKiBwYWNrZXRzIGRyb3BwZWQgYnkgZG9uZ2xlICovCi0JdW5zaWduZWQgbG9uZyB0eF9kcm9wcGVkOwkvKiBwYWNrZXRzIGRyb3BwZWQgYnkgZG9uZ2xlICovCi0JdW5zaWduZWQgbG9uZyBtdWx0aWNhc3Q7CS8qIG11bHRpY2FzdCBwYWNrZXRzIHJlY2VpdmVkICovCi19OwotCi0jZGVmaW5lIEJSQ01GX0VfU0VUX1NTSUQJCQkwCi0jZGVmaW5lIEJSQ01GX0VfSk9JTgkJCQkxCi0jZGVmaW5lIEJSQ01GX0VfU1RBUlQJCQkJMgotI2RlZmluZSBCUkNNRl9FX0FVVEgJCQkJMwotI2RlZmluZSBCUkNNRl9FX0FVVEhfSU5ECQkJNAotI2RlZmluZSBCUkNNRl9FX0RFQVVUSAkJCQk1Ci0jZGVmaW5lIEJSQ01GX0VfREVBVVRIX0lORAkJCTYKLSNkZWZpbmUgQlJDTUZfRV9BU1NPQwkJCQk3Ci0jZGVmaW5lIEJSQ01GX0VfQVNTT0NfSU5ECQkJOAotI2RlZmluZSBCUkNNRl9FX1JFQVNTT0MJCQkJOQotI2RlZmluZSBCUkNNRl9FX1JFQVNTT0NfSU5ECQkJMTAKLSNkZWZpbmUgQlJDTUZfRV9ESVNBU1NPQwkJCTExCi0jZGVmaW5lIEJSQ01GX0VfRElTQVNTT0NfSU5ECQkJMTIKLSNkZWZpbmUgQlJDTUZfRV9RVUlFVF9TVEFSVAkJCTEzCi0jZGVmaW5lIEJSQ01GX0VfUVVJRVRfRU5ECQkJMTQKLSNkZWZpbmUgQlJDTUZfRV9CRUFDT05fUlgJCQkxNQotI2RlZmluZSBCUkNNRl9FX0xJTksJCQkJMTYKLSNkZWZpbmUgQlJDTUZfRV9NSUNfRVJST1IJCQkxNwotI2RlZmluZSBCUkNNRl9FX05ESVNfTElOSwkJCTE4Ci0jZGVmaW5lIEJSQ01GX0VfUk9BTQkJCQkxOQotI2RlZmluZSBCUkNNRl9FX1RYRkFJTAkJCQkyMAotI2RlZmluZSBCUkNNRl9FX1BNS0lEX0NBQ0hFCQkJMjEKLSNkZWZpbmUgQlJDTUZfRV9SRVRST0dSQURFX1RTRgkJCTIyCi0jZGVmaW5lIEJSQ01GX0VfUFJVTkUJCQkJMjMKLSNkZWZpbmUgQlJDTUZfRV9BVVRPQVVUSAkJCTI0Ci0jZGVmaW5lIEJSQ01GX0VfRUFQT0xfTVNHCQkJMjUKLSNkZWZpbmUgQlJDTUZfRV9TQ0FOX0NPTVBMRVRFCQkJMjYKLSNkZWZpbmUgQlJDTUZfRV9BRERUU19JTkQJCQkyNwotI2RlZmluZSBCUkNNRl9FX0RFTFRTX0lORAkJCTI4Ci0jZGVmaW5lIEJSQ01GX0VfQkNOU0VOVF9JTkQJCQkyOQotI2RlZmluZSBCUkNNRl9FX0JDTlJYX01TRwkJCTMwCi0jZGVmaW5lIEJSQ01GX0VfQkNOTE9TVF9NU0cJCQkzMQotI2RlZmluZSBCUkNNRl9FX1JPQU1fUFJFUAkJCTMyCi0jZGVmaW5lIEJSQ01GX0VfUEZOX05FVF9GT1VORAkJCTMzCi0jZGVmaW5lIEJSQ01GX0VfUEZOX05FVF9MT1NUCQkJMzQKLSNkZWZpbmUgQlJDTUZfRV9SRVNFVF9DT01QTEVURQkJCTM1Ci0jZGVmaW5lIEJSQ01GX0VfSk9JTl9TVEFSVAkJCTM2Ci0jZGVmaW5lIEJSQ01GX0VfUk9BTV9TVEFSVAkJCTM3Ci0jZGVmaW5lIEJSQ01GX0VfQVNTT0NfU1RBUlQJCQkzOAotI2RlZmluZSBCUkNNRl9FX0lCU1NfQVNTT0MJCQkzOQotI2RlZmluZSBCUkNNRl9FX1JBRElPCQkJCTQwCi0jZGVmaW5lIEJSQ01GX0VfUFNNX1dBVENIRE9HCQkJNDEKLSNkZWZpbmUgQlJDTUZfRV9QUk9CUkVRX01TRwkJCTQ0Ci0jZGVmaW5lIEJSQ01GX0VfU0NBTl9DT05GSVJNX0lORAkJNDUKLSNkZWZpbmUgQlJDTUZfRV9QU0tfU1VQCQkJCTQ2Ci0jZGVmaW5lIEJSQ01GX0VfQ09VTlRSWV9DT0RFX0NIQU5HRUQJCTQ3Ci0jZGVmaW5lCUJSQ01GX0VfRVhDRUVERURfTUVESVVNX1RJTUUJCTQ4Ci0jZGVmaW5lIEJSQ01GX0VfSUNWX0VSUk9SCQkJNDkKLSNkZWZpbmUgQlJDTUZfRV9VTklDQVNUX0RFQ09ERV9FUlJPUgkJNTAKLSNkZWZpbmUgQlJDTUZfRV9NVUxUSUNBU1RfREVDT0RFX0VSUk9SCQk1MQotI2RlZmluZSBCUkNNRl9FX1RSQUNFCQkJCTUyCi0jZGVmaW5lIEJSQ01GX0VfSUYJCQkJNTQKLSNkZWZpbmUgQlJDTUZfRV9SU1NJCQkJCTU2Ci0jZGVmaW5lIEJSQ01GX0VfUEZOX1NDQU5fQ09NUExFVEUJCTU3Ci0jZGVmaW5lIEJSQ01GX0VfRVhUTE9HX01TRwkJCTU4Ci0jZGVmaW5lIEJSQ01GX0VfQUNUSU9OX0ZSQU1FCQkJNTkKLSNkZWZpbmUgQlJDTUZfRV9BQ1RJT05fRlJBTUVfQ09NUExFVEUJCTYwCi0jZGVmaW5lIEJSQ01GX0VfUFJFX0FTU09DX0lORAkJCTYxCi0jZGVmaW5lIEJSQ01GX0VfUFJFX1JFQVNTT0NfSU5ECQkJNjIKLSNkZWZpbmUgQlJDTUZfRV9DSEFOTkVMX0FET1BURUQJCQk2MwotI2RlZmluZSBCUkNNRl9FX0FQX1NUQVJURUQJCQk2NAotI2RlZmluZSBCUkNNRl9FX0RGU19BUF9TVE9QCQkJNjUKLSNkZWZpbmUgQlJDTUZfRV9ERlNfQVBfUkVTVU1FCQkJNjYKLSNkZWZpbmUgQlJDTUZfRV9SRVNFUlZFRDEJCQk2NwotI2RlZmluZSBCUkNNRl9FX1JFU0VSVkVEMgkJCTY4Ci0jZGVmaW5lIEJSQ01GX0VfRVNDQU5fUkVTVUxUCQkJNjkKLSNkZWZpbmUgQlJDTUZfRV9BQ1RJT05fRlJBTUVfT0ZGX0NIQU5fQ09NUExFVEUJNzAKLSNkZWZpbmUgQlJDTUZfRV9EQ1NfUkVRVUVTVAkJCTczCi0KLSNkZWZpbmUgQlJDTUZfRV9GSUZPX0NSRURJVF9NQVAJCQk3NAotCi0jZGVmaW5lIEJSQ01GX0VfTEFTVAkJCQk3NQotCi0jZGVmaW5lIEJSQ01GX0VfU1RBVFVTX1NVQ0NFU1MJCQkwCi0jZGVmaW5lIEJSQ01GX0VfU1RBVFVTX0ZBSUwJCQkxCi0jZGVmaW5lIEJSQ01GX0VfU1RBVFVTX1RJTUVPVVQJCQkyCi0jZGVmaW5lIEJSQ01GX0VfU1RBVFVTX05PX05FVFdPUktTCQkzCi0jZGVmaW5lIEJSQ01GX0VfU1RBVFVTX0FCT1JUCQkJNAotI2RlZmluZSBCUkNNRl9FX1NUQVRVU19OT19BQ0sJCQk1Ci0jZGVmaW5lIEJSQ01GX0VfU1RBVFVTX1VOU09MSUNJVEVECQk2Ci0jZGVmaW5lIEJSQ01GX0VfU1RBVFVTX0FUVEVNUFQJCQk3Ci0jZGVmaW5lIEJSQ01GX0VfU1RBVFVTX1BBUlRJQUwJCQk4Ci0jZGVmaW5lIEJSQ01GX0VfU1RBVFVTX05FV1NDQU4JCQk5Ci0jZGVmaW5lIEJSQ01GX0VfU1RBVFVTX05FV0FTU09DCQkJMTAKLSNkZWZpbmUgQlJDTUZfRV9TVEFUVVNfMTFIUVVJRVQJCQkxMQotI2RlZmluZSBCUkNNRl9FX1NUQVRVU19TVVBQUkVTUwkJCTEyCi0jZGVmaW5lIEJSQ01GX0VfU1RBVFVTX05PQ0hBTlMJCQkxMwotI2RlZmluZSBCUkNNRl9FX1NUQVRVU19DU19BQk9SVAkJCTE1Ci0jZGVmaW5lIEJSQ01GX0VfU1RBVFVTX0VSUk9SCQkJMTYKLQotI2RlZmluZSBCUkNNRl9FX1JFQVNPTl9JTklUSUFMX0FTU09DCQkwCi0jZGVmaW5lIEJSQ01GX0VfUkVBU09OX0xPV19SU1NJCQkJMQotI2RlZmluZSBCUkNNRl9FX1JFQVNPTl9ERUFVVEgJCQkyCi0jZGVmaW5lIEJSQ01GX0VfUkVBU09OX0RJU0FTU09DCQkJMwotI2RlZmluZSBCUkNNRl9FX1JFQVNPTl9CQ05TX0xPU1QJCTQKLSNkZWZpbmUgQlJDTUZfRV9SRUFTT05fTUlOVFhSQVRFCQk5Ci0jZGVmaW5lIEJSQ01GX0VfUkVBU09OX1RYRkFJTAkJCTEwCi0KLSNkZWZpbmUgQlJDTUZfRV9SRUFTT05fRkFTVF9ST0FNX0ZBSUxFRAkJNQotI2RlZmluZSBCUkNNRl9FX1JFQVNPTl9ESVJFQ1RFRF9ST0FNCQk2Ci0jZGVmaW5lIEJSQ01GX0VfUkVBU09OX1RTUEVDX1JFSkVDVEVECQk3Ci0jZGVmaW5lIEJSQ01GX0VfUkVBU09OX0JFVFRFUl9BUAkJOAotCi0jZGVmaW5lIEJSQ01GX0VfUFJVTkVfRU5DUl9NSVNNQVRDSAkJMQotI2RlZmluZSBCUkNNRl9FX1BSVU5FX0JDQVNUX0JTU0lECQkyCi0jZGVmaW5lIEJSQ01GX0VfUFJVTkVfTUFDX0RFTlkJCQkzCi0jZGVmaW5lIEJSQ01GX0VfUFJVTkVfTUFDX05BCQkJNAotI2RlZmluZSBCUkNNRl9FX1BSVU5FX1JFR19QQVNTVgkJCTUKLSNkZWZpbmUgQlJDTUZfRV9QUlVORV9TUENUX01HTVQJCQk2Ci0jZGVmaW5lIEJSQ01GX0VfUFJVTkVfUkFEQVIJCQk3Ci0jZGVmaW5lIEJSQ01GX0VfUlNOX01JU01BVENICQkJOAotI2RlZmluZSBCUkNNRl9FX1BSVU5FX05PX0NPTU1PTl9SQVRFUwkJOQotI2RlZmluZSBCUkNNRl9FX1BSVU5FX0JBU0lDX1JBVEVTCQkxMAotI2RlZmluZSBCUkNNRl9FX1BSVU5FX0NJUEhFUl9OQQkJCTEyCi0jZGVmaW5lIEJSQ01GX0VfUFJVTkVfS05PV05fU1RBCQkJMTMKLSNkZWZpbmUgQlJDTUZfRV9QUlVORV9XRFNfUEVFUgkJCTE1Ci0jZGVmaW5lIEJSQ01GX0VfUFJVTkVfUUJTU19MT0FECQkJMTYKLSNkZWZpbmUgQlJDTUZfRV9QUlVORV9IT01FX0FQCQkJMTcKLQotI2RlZmluZSBCUkNNRl9FX1NVUF9PVEhFUgkJCTAKLSNkZWZpbmUgQlJDTUZfRV9TVVBfREVDUllQVF9LRVlfREFUQQkJMQotI2RlZmluZSBCUkNNRl9FX1NVUF9CQURfVUNBU1RfV0VQMTI4CQkyCi0jZGVmaW5lIEJSQ01GX0VfU1VQX0JBRF9VQ0FTVF9XRVA0MAkJMwotI2RlZmluZSBCUkNNRl9FX1NVUF9VTlNVUF9LRVlfTEVOCQk0Ci0jZGVmaW5lIEJSQ01GX0VfU1VQX1BXX0tFWV9DSVBIRVIJCTUKLSNkZWZpbmUgQlJDTUZfRV9TVVBfTVNHM19UT09fTUFOWV9JRQkJNgotI2RlZmluZSBCUkNNRl9FX1NVUF9NU0czX0lFX01JU01BVENICQk3Ci0jZGVmaW5lIEJSQ01GX0VfU1VQX05PX0lOU1RBTExfRkxBRwkJOAotI2RlZmluZSBCUkNNRl9FX1NVUF9NU0czX05PX0dUSwkJCTkKLSNkZWZpbmUgQlJDTUZfRV9TVVBfR1JQX0tFWV9DSVBIRVIJCTEwCi0jZGVmaW5lIEJSQ01GX0VfU1VQX0dSUF9NU0cxX05PX0dUSwkJMTEKLSNkZWZpbmUgQlJDTUZfRV9TVVBfR1RLX0RFQ1JZUFRfRkFJTAkJMTIKLSNkZWZpbmUgQlJDTUZfRV9TVVBfU0VORF9GQUlMCQkJMTMKLSNkZWZpbmUgQlJDTUZfRV9TVVBfREVBVVRICQkJMTQKLQotI2RlZmluZSBCUkNNRl9FX0lGX0FERAkJCQkxCi0jZGVmaW5lIEJSQ01GX0VfSUZfREVMCQkJCTIKLSNkZWZpbmUgQlJDTUZfRV9JRl9DSEFOR0UJCQkzCi0KLSNkZWZpbmUgQlJDTUZfRV9JRl9ST0xFX1NUQQkJCTAKLSNkZWZpbmUgQlJDTUZfRV9JRl9ST0xFX0FQCQkJMQotI2RlZmluZSBCUkNNRl9FX0lGX1JPTEVfV0RTCQkJMgotCi0jZGVmaW5lIEJSQ01GX0VfTElOS19CQ05fTE9TUwkJCTEKLSNkZWZpbmUgQlJDTUZfRV9MSU5LX0RJU0FTU09DCQkJMgotI2RlZmluZSBCUkNNRl9FX0xJTktfQVNTT0NfUkVDCQkJMwotI2RlZmluZSBCUkNNRl9FX0xJTktfQlNTQ0ZHX0RJUwkJCTQKLQotLyogVGhlIGxldmVsIG9mIGJ1cyBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGRvbmdsZSAqLwotZW51bSBicmNtZl9idXNfc3RhdGUgewotCUJSQ01GX0JVU19ET1dOLAkJLyogTm90IHJlYWR5IGZvciBmcmFtZSB0cmFuc2ZlcnMgKi8KLQlCUkNNRl9CVVNfTE9BRCwJCS8qIERvd25sb2FkIGFjY2VzcyBvbmx5IChDUFUgcmVzZXQpICovCi0JQlJDTUZfQlVTX0RBVEEJCS8qIFJlYWR5IGZvciBmcmFtZSB0cmFuc2ZlcnMgKi8KLX07Ci0KLS8qIFBhdHRlcm4gbWF0Y2hpbmcgZmlsdGVyLiBTcGVjaWZpZXMgYW4gb2Zmc2V0IHdpdGhpbiByZWNlaXZlZCBwYWNrZXRzIHRvCi0gKiBzdGFydCBtYXRjaGluZywgdGhlIHBhdHRlcm4gdG8gbWF0Y2gsIHRoZSBzaXplIG9mIHRoZSBwYXR0ZXJuLCBhbmQgYSBiaXRtYXNrCi0gKiB0aGF0IGluZGljYXRlcyB3aGljaCBiaXRzIHdpdGhpbiB0aGUgcGF0dGVybiBzaG91bGQgYmUgbWF0Y2hlZC4KLSAqLwotc3RydWN0IGJyY21mX3BrdF9maWx0ZXJfcGF0dGVybiB7Ci0JdTMyIG9mZnNldDsJCS8qIE9mZnNldCB3aXRoaW4gcmVjZWl2ZWQgcGFja2V0IHRvIHN0YXJ0IHBhdHRlcm4gbWF0Y2hpbmcuCi0JCQkJICogT2Zmc2V0ICcwJyBpcyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgZXRoZXJuZXQgaGVhZGVyLgotCQkJCSAqLwotCXUzMiBzaXplX2J5dGVzOwkvKiBTaXplIG9mIHRoZSBwYXR0ZXJuLiAgQml0bWFzayBtdXN0IGJlIHRoZSBzYW1lIHNpemUuICovCi0JdTggbWFza19hbmRfcGF0dGVyblsxXTsJLyogVmFyaWFibGUgbGVuZ3RoIG1hc2sgYW5kIHBhdHRlcm4gZGF0YS4gIG1hc2sgc3RhcnRzCi0JCQkJCSAqIGF0IG9mZnNldCAwLiAgUGF0dGVybiBpbW1lZGlhdGVseSBmb2xsb3dzIG1hc2suCi0JCQkJCSAqLwotfTsKLQotLyogSU9WQVIgInBrdF9maWx0ZXJfYWRkIiBwYXJhbWV0ZXIuIFVzZWQgdG8gaW5zdGFsbCBwYWNrZXQgZmlsdGVycy4gKi8KLXN0cnVjdCBicmNtZl9wa3RfZmlsdGVyIHsKLQl1MzIgaWQ7CQkvKiBVbmlxdWUgZmlsdGVyIGlkLCBzcGVjaWZpZWQgYnkgYXBwLiAqLwotCXUzMiB0eXBlOwkJLyogRmlsdGVyIHR5cGUgKFdMX1BLVF9GSUxURVJfVFlQRV94eHgpLiAqLwotCXUzMiBuZWdhdGVfbWF0Y2g7CS8qIE5lZ2F0ZSB0aGUgcmVzdWx0IG9mIGZpbHRlciBtYXRjaGVzICovCi0JdW5pb24gewkJCS8qIEZpbHRlciBkZWZpbml0aW9ucyAqLwotCQlzdHJ1Y3QgYnJjbWZfcGt0X2ZpbHRlcl9wYXR0ZXJuIHBhdHRlcm47IC8qIEZpbHRlciBwYXR0ZXJuICovCi0JfSB1OwotfTsKLQotLyogSU9WQVIgInBrdF9maWx0ZXJfZW5hYmxlIiBwYXJhbWV0ZXIuICovCi1zdHJ1Y3QgYnJjbWZfcGt0X2ZpbHRlcl9lbmFibGUgewotCXUzMiBpZDsJCS8qIFVuaXF1ZSBmaWx0ZXIgaWQgKi8KLQl1MzIgZW5hYmxlOwkJLyogRW5hYmxlL2Rpc2FibGUgYm9vbCAqLwotfTsKLQotLyogQlNTIGluZm8gc3RydWN0dXJlCi0gKiBBcHBsaWNhdGlvbnMgTVVTVCBDSEVDSyBpZV9vZmZzZXQgZmllbGQgYW5kIGxlbmd0aCBmaWVsZCB0byBhY2Nlc3MgSUVzIGFuZAotICogbmV4dCBic3NfaW5mbyBzdHJ1Y3R1cmUgaW4gYSB2ZWN0b3IgKGluIHN0cnVjdCBicmNtZl9zY2FuX3Jlc3VsdHMpCi0gKi8KLXN0cnVjdCBicmNtZl9ic3NfaW5mbyB7Ci0JdTMyIHZlcnNpb247CQkvKiB2ZXJzaW9uIGZpZWxkICovCi0JdTMyIGxlbmd0aDsJCS8qIGJ5dGUgbGVuZ3RoIG9mIGRhdGEgaW4gdGhpcyByZWNvcmQsCi0JCQkJICogc3RhcnRpbmcgYXQgdmVyc2lvbiBhbmQgaW5jbHVkaW5nIElFcwotCQkJCSAqLwotCXU4IEJTU0lEW0VUSF9BTEVOXTsKLQl1MTYgYmVhY29uX3BlcmlvZDsJLyogdW5pdHMgYXJlIEt1c2VjICovCi0JdTE2IGNhcGFiaWxpdHk7CS8qIENhcGFiaWxpdHkgaW5mb3JtYXRpb24gKi8KLQl1OCBTU0lEX2xlbjsKLQl1OCBTU0lEWzMyXTsKLQlzdHJ1Y3QgewotCQl1aW50IGNvdW50OwkvKiAjIHJhdGVzIGluIHRoaXMgc2V0ICovCi0JCXU4IHJhdGVzWzE2XTsJLyogcmF0ZXMgaW4gNTAwa2JwcyB1bml0cyB3L2hpIGJpdCBzZXQgaWYgYmFzaWMgKi8KLQl9IHJhdGVzZXQ7CQkvKiBzdXBwb3J0ZWQgcmF0ZXMgKi8KLQljaGFuc3BlY190IGNoYW5zcGVjOwkvKiBjaGFuc3BlYyBmb3IgYnNzICovCi0JdTE2IGF0aW1fd2luZG93OwkvKiB1bml0cyBhcmUgS3VzZWMgKi8KLQl1OCBkdGltX3BlcmlvZDsJLyogRFRJTSBwZXJpb2QgKi8KLQlzMTYgUlNTSTsJCS8qIHJlY2VpdmUgc2lnbmFsIHN0cmVuZ3RoIChpbiBkQm0pICovCi0JczggcGh5X25vaXNlOwkJLyogbm9pc2UgKGluIGRCbSkgKi8KLQotCXU4IG5fY2FwOwkJLyogQlNTIGlzIDgwMi4xMU4gQ2FwYWJsZSAqLwotCXUzMiBuYnNzX2NhcDsJLyogODAyLjExTiBCU1MgQ2FwYWJpbGl0aWVzIChiYXNlZCBvbiBIVF9DQVBfKikgKi8KLQl1OCBjdGxfY2g7CQkvKiA4MDIuMTFOIEJTUyBjb250cm9sIGNoYW5uZWwgbnVtYmVyICovCi0JdTMyIHJlc2VydmVkMzJbMV07CS8qIFJlc2VydmVkIGZvciBleHBhbnNpb24gb2YgQlNTIHByb3BlcnRpZXMgKi8KLQl1OCBmbGFnczsJCS8qIGZsYWdzICovCi0JdTggcmVzZXJ2ZWRbM107CS8qIFJlc2VydmVkIGZvciBleHBhbnNpb24gb2YgQlNTIHByb3BlcnRpZXMgKi8KLQl1OCBiYXNpY19tY3NbTUNTU0VUX0xFTl07CS8qIDgwMi4xMU4gQlNTIHJlcXVpcmVkIE1DUyBzZXQgKi8KLQotCXUxNiBpZV9vZmZzZXQ7CS8qIG9mZnNldCBhdCB3aGljaCBJRXMgc3RhcnQsIGZyb20gYmVnaW5uaW5nICovCi0JdTMyIGllX2xlbmd0aDsJLyogYnl0ZSBsZW5ndGggb2YgSW5mb3JtYXRpb24gRWxlbWVudHMgKi8KLQlzMTYgU05SOwkJLyogYXZlcmFnZSBTTlIgb2YgZHVyaW5nIGZyYW1lIHJlY2VwdGlvbiAqLwotCS8qIEFkZCBuZXcgZmllbGRzIGhlcmUgKi8KLQkvKiB2YXJpYWJsZSBsZW5ndGggSW5mb3JtYXRpb24gRWxlbWVudHMgKi8KLX07Ci0KLXN0cnVjdCBicmNtZl9zc2lkIHsKLQl1MzIgU1NJRF9sZW47Ci0JdW5zaWduZWQgY2hhciBTU0lEWzMyXTsKLX07Ci0KLXN0cnVjdCBicmNtZl9zY2FuX3BhcmFtcyB7Ci0Jc3RydWN0IGJyY21mX3NzaWQgc3NpZDsJLyogZGVmYXVsdDogezAsICIifSAqLwotCXU4IGJzc2lkW0VUSF9BTEVOXTsJLyogZGVmYXVsdDogYmNhc3QgKi8KLQlzOCBic3NfdHlwZTsJCS8qIGRlZmF1bHQ6IGFueSwKLQkJCQkgKiBET1QxMV9CU1NUWVBFX0FOWS9JTkZSQVNUUlVDVFVSRS9JTkRFUEVOREVOVAotCQkJCSAqLwotCXU4IHNjYW5fdHlwZTsJLyogZmxhZ3MsIDAgdXNlIGRlZmF1bHQgKi8KLQlzMzIgbnByb2JlczsJCS8qIC0xIHVzZSBkZWZhdWx0LCBudW1iZXIgb2YgcHJvYmVzIHBlciBjaGFubmVsICovCi0JczMyIGFjdGl2ZV90aW1lOwkvKiAtMSB1c2UgZGVmYXVsdCwgZHdlbGwgdGltZSBwZXIgY2hhbm5lbCBmb3IKLQkJCQkgKiBhY3RpdmUgc2Nhbm5pbmcKLQkJCQkgKi8KLQlzMzIgcGFzc2l2ZV90aW1lOwkvKiAtMSB1c2UgZGVmYXVsdCwgZHdlbGwgdGltZSBwZXIgY2hhbm5lbAotCQkJCSAqIGZvciBwYXNzaXZlIHNjYW5uaW5nCi0JCQkJICovCi0JczMyIGhvbWVfdGltZTsJLyogLTEgdXNlIGRlZmF1bHQsIGR3ZWxsIHRpbWUgZm9yIHRoZSBob21lIGNoYW5uZWwKLQkJCQkgKiBiZXR3ZWVuIGNoYW5uZWwgc2NhbnMKLQkJCQkgKi8KLQlzMzIgY2hhbm5lbF9udW07CS8qIGNvdW50IG9mIGNoYW5uZWxzIGFuZCBzc2lkcyB0aGF0IGZvbGxvdwotCQkJCSAqCi0JCQkJICogbG93IGhhbGYgaXMgY291bnQgb2YgY2hhbm5lbHMgaW4KLQkJCQkgKiBjaGFubmVsX2xpc3QsIDAgbWVhbnMgZGVmYXVsdCAodXNlIGFsbAotCQkJCSAqIGF2YWlsYWJsZSBjaGFubmVscykKLQkJCQkgKgotCQkJCSAqIGhpZ2ggaGFsZiBpcyBlbnRyaWVzIGluIHN0cnVjdCBicmNtZl9zc2lkCi0JCQkJICogYXJyYXkgdGhhdCBmb2xsb3dzIGNoYW5uZWxfbGlzdCwgYWxpZ25lZCBmb3IKLQkJCQkgKiBzMzIgKDQgYnl0ZXMpIG1lYW5pbmcgYW4gb2RkIGNoYW5uZWwgY291bnQKLQkJCQkgKiBpbXBsaWVzIGEgMi1ieXRlIHBhZCBiZXR3ZWVuIGVuZCBvZgotCQkJCSAqIGNoYW5uZWxfbGlzdCBhbmQgZmlyc3Qgc3NpZAotCQkJCSAqCi0JCQkJICogaWYgc3NpZCBjb3VudCBpcyB6ZXJvLCBzaW5nbGUgc3NpZCBpbiB0aGUKLQkJCQkgKiBmaXhlZCBwYXJhbWV0ZXIgcG9ydGlvbiBpcyBhc3N1bWVkLCBvdGhlcndpc2UKLQkJCQkgKiBzc2lkIGluIHRoZSBmaXhlZCBwb3J0aW9uIGlzIGlnbm9yZWQKLQkJCQkgKi8KLQl1MTYgY2hhbm5lbF9saXN0WzFdOwkvKiBsaXN0IG9mIGNoYW5zcGVjcyAqLwotfTsKLQotLyogaW5jcmVtZW50YWwgc2NhbiBzdHJ1Y3QgKi8KLXN0cnVjdCBicmNtZl9pc2Nhbl9wYXJhbXMgewotCXUzMiB2ZXJzaW9uOwotCXUxNiBhY3Rpb247Ci0JdTE2IHNjYW5fZHVyYXRpb247Ci0Jc3RydWN0IGJyY21mX3NjYW5fcGFyYW1zIHBhcmFtczsKLX07Ci0KLS8qIDMgZmllbGRzICsgc2l6ZSBvZiBicmNtZl9zY2FuX3BhcmFtcywgbm90IGluY2x1ZGluZyB2YXJpYWJsZSBsZW5ndGggYXJyYXkgKi8KLSNkZWZpbmUgQlJDTUZfSVNDQU5fUEFSQU1TX0ZJWEVEX1NJWkUgXAotCShvZmZzZXRvZihzdHJ1Y3QgYnJjbWZfaXNjYW5fcGFyYW1zLCBwYXJhbXMpICsgXAotCSBzaXplb2Yoc3RydWN0IGJyY21mX3NzaWQpKQotCi1zdHJ1Y3QgYnJjbWZfc2Nhbl9yZXN1bHRzIHsKLQl1MzIgYnVmbGVuOwotCXUzMiB2ZXJzaW9uOwotCXUzMiBjb3VudDsKLQlzdHJ1Y3QgYnJjbWZfYnNzX2luZm8gYnNzX2luZm9bMV07Ci19OwotCi0vKiB1c2VkIGZvciBhc3NvY2lhdGlvbiB3aXRoIGEgc3BlY2lmaWMgQlNTSUQgYW5kIGNoYW5zcGVjIGxpc3QgKi8KLXN0cnVjdCBicmNtZl9hc3NvY19wYXJhbXMgewotCXU4IGJzc2lkW0VUSF9BTEVOXTsJLyogMDA6MDA6MDA6MDA6MDA6MDA6IGJyb2FkY2FzdCBzY2FuICovCi0JczMyIGNoYW5zcGVjX251bTsJLyogMDogYWxsIGF2YWlsYWJsZSBjaGFubmVscywKLQkJCQkgKiBvdGhlcndpc2UgY291bnQgb2YgY2hhbnNwZWNzIGluIGNoYW5zcGVjX2xpc3QKLQkJCQkgKi8KLQljaGFuc3BlY190IGNoYW5zcGVjX2xpc3RbMV07CS8qIGxpc3Qgb2YgY2hhbnNwZWNzICovCi19OwotI2RlZmluZSBCUkNNRl9BU1NPQ19QQVJBTVNfRklYRURfU0laRSBcCi0JKHNpemVvZihzdHJ1Y3QgYnJjbWZfYXNzb2NfcGFyYW1zKSAtIHNpemVvZihjaGFuc3BlY190KSkKLQotLyogdXNlZCBmb3Igam9pbiB3aXRoIG9yIHdpdGhvdXQgYSBzcGVjaWZpYyBic3NpZCBhbmQgY2hhbm5lbCBsaXN0ICovCi1zdHJ1Y3QgYnJjbWZfam9pbl9wYXJhbXMgewotCXN0cnVjdCBicmNtZl9zc2lkIHNzaWQ7Ci0Jc3RydWN0IGJyY21mX2Fzc29jX3BhcmFtcyBwYXJhbXM7Ci19OwotCi0vKiBzaXplIG9mIGJyY21mX3NjYW5fcmVzdWx0cyBub3QgaW5jbHVkaW5nIHZhcmlhYmxlIGxlbmd0aCBhcnJheSAqLwotI2RlZmluZSBCUkNNRl9TQ0FOX1JFU1VMVFNfRklYRURfU0laRSBcCi0JKHNpemVvZihzdHJ1Y3QgYnJjbWZfc2Nhbl9yZXN1bHRzKSAtIHNpemVvZihzdHJ1Y3QgYnJjbWZfYnNzX2luZm8pKQotCi0vKiBpbmNyZW1lbnRhbCBzY2FuIHJlc3VsdHMgc3RydWN0ICovCi1zdHJ1Y3QgYnJjbWZfaXNjYW5fcmVzdWx0cyB7Ci0JdTMyIHN0YXR1czsKLQlzdHJ1Y3QgYnJjbWZfc2Nhbl9yZXN1bHRzIHJlc3VsdHM7Ci19OwotCi0vKiBzaXplIG9mIGJyY21mX2lzY2FuX3Jlc3VsdHMgbm90IGluY2x1ZGluZyB2YXJpYWJsZSBsZW5ndGggYXJyYXkgKi8KLSNkZWZpbmUgQlJDTUZfSVNDQU5fUkVTVUxUU19GSVhFRF9TSVpFIFwKLQkoQlJDTUZfU0NBTl9SRVNVTFRTX0ZJWEVEX1NJWkUgKyBcCi0JIG9mZnNldG9mKHN0cnVjdCBicmNtZl9pc2Nhbl9yZXN1bHRzLCByZXN1bHRzKSkKLQotc3RydWN0IGJyY21mX3dzZWNfa2V5IHsKLQl1MzIgaW5kZXg7CQkvKiBrZXkgaW5kZXggKi8KLQl1MzIgbGVuOwkJLyoga2V5IGxlbmd0aCAqLwotCXU4IGRhdGFbV0xBTl9NQVhfS0VZX0xFTl07CS8qIGtleSBkYXRhICovCi0JdTMyIHBhZF8xWzE4XTsKLQl1MzIgYWxnbzsJCS8qIENSWVBUT19BTEdPX0FFU19DQ00sIENSWVBUT19BTEdPX1dFUDEyOCwgZXRjICovCi0JdTMyIGZsYWdzOwkJLyogbWlzYyBmbGFncyAqLwotCXUzMiBwYWRfMlsyXTsKLQlpbnQgcGFkXzM7Ci0JaW50IGl2X2luaXRpYWxpemVkOwkvKiBoYXMgSVYgYmVlbiBpbml0aWFsaXplZCBhbHJlYWR5PyAqLwotCWludCBwYWRfNDsKLQkvKiBSeCBJViAqLwotCXN0cnVjdCB7Ci0JCXUzMiBoaTsJLyogdXBwZXIgMzIgYml0cyBvZiBJViAqLwotCQl1MTYgbG87CS8qIGxvd2VyIDE2IGJpdHMgb2YgSVYgKi8KLQl9IHJ4aXY7Ci0JdTMyIHBhZF81WzJdOwotCXU4IGVhW0VUSF9BTEVOXTsJLyogcGVyIHN0YXRpb24gKi8KLX07Ci0KLS8qIFVzZWQgdG8gZ2V0IHNwZWNpZmljIFNUQSBwYXJhbWV0ZXJzICovCi1zdHJ1Y3QgYnJjbWZfc2NiX3ZhbCB7Ci0JdTMyIHZhbDsKLQl1OCBlYVtFVEhfQUxFTl07Ci19OwotCi0vKiBjaGFubmVsIGVuY29kaW5nICovCi1zdHJ1Y3QgYnJjbWZfY2hhbm5lbF9pbmZvIHsKLQlpbnQgaHdfY2hhbm5lbDsKLQlpbnQgdGFyZ2V0X2NoYW5uZWw7Ci0JaW50IHNjYW5fY2hhbm5lbDsKLX07Ci0KLS8qIExpbnV4IG5ldHdvcmsgZHJpdmVyIGlvY3RsIGVuY29kaW5nICovCi1zdHJ1Y3QgYnJjbWZfaW9jdGwgewotCXVpbnQgY21kOwkJLyogY29tbW9uIGlvY3RsIGRlZmluaXRpb24gKi8KLQl2b2lkICpidWY7CQkvKiBwb2ludGVyIHRvIHVzZXIgYnVmZmVyICovCi0JdWludCBsZW47CQkvKiBsZW5ndGggb2YgdXNlciBidWZmZXIgKi8KLQl1OCBzZXQ7CQkvKiBnZXQgb3Igc2V0IHJlcXVlc3QgKG9wdGlvbmFsKSAqLwotCXVpbnQgdXNlZDsJCS8qIGJ5dGVzIHJlYWQgb3Igd3JpdHRlbiAob3B0aW9uYWwpICovCi0JdWludCBuZWVkZWQ7CQkvKiBieXRlcyBuZWVkZWQgKG9wdGlvbmFsKSAqLwotfTsKLQotLyogRm9yd2FyZCBkZWNscyBmb3Igc3RydWN0IGJyY21mX3B1YiAoc2VlIGJlbG93KSAqLwotc3RydWN0IGJyY21mX2J1czsJCS8qIGRldmljZSBidXMgaW5mbyAqLwotc3RydWN0IGJyY21mX3Byb3RvOwkvKiBkZXZpY2UgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBpbmZvICovCi1zdHJ1Y3QgYnJjbWZfaW5mbzsJLyogZGV2aWNlIGRyaXZlciBpbmZvICovCi0KLS8qIENvbW1vbiBzdHJ1Y3R1cmUgZm9yIG1vZHVsZSBhbmQgaW5zdGFuY2UgbGlua2FnZSAqLwotc3RydWN0IGJyY21mX3B1YiB7Ci0JLyogTGlua2FnZSBwb250ZXJzICovCi0Jc3RydWN0IGJyY21mX2J1cyAqYnVzOwotCXN0cnVjdCBicmNtZl9wcm90byAqcHJvdDsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqaW5mbzsKLQotCS8qIEludGVybmFsIGJyY21mIGl0ZW1zICovCi0JYm9vbCB1cDsJCS8qIERyaXZlciB1cC9kb3duICh0byBPUykgKi8KLQlib29sIHR4b2ZmOwkJLyogVHJhbnNtaXQgZmxvdy1jb250cm9sbGVkICovCi0JYm9vbCBkb25nbGVfcmVzZXQ7CS8qIHRydWUgPSBERVZSRVNFVCBwdXQgZG9uZ2xlIGludG8gcmVzZXQgKi8KLQllbnVtIGJyY21mX2J1c19zdGF0ZSBidXNzdGF0ZTsKLQl1aW50IGhkcmxlbjsJCS8qIFRvdGFsIEJSQ01GIGhlYWRlciBsZW5ndGggKHByb3RvICsgYnVzKSAqLwotCXVpbnQgbWF4Y3RsOwkJLyogTWF4IHNpemUgcnhjdGwgcmVxdWVzdCBmcm9tIHByb3RvIHRvIGJ1cyAqLwotCXVpbnQgcnhzejsJCS8qIFJ4IGJ1ZmZlciBzaXplIGJ1cyBtb2R1bGUgc2hvdWxkIHVzZSAqLwotCXU4IHdtZV9kcDsJCS8qIHdtZSBkaXNjYXJkIHByaW9yaXR5ICovCi0KLQkvKiBEb25nbGUgbWVkaWEgaW5mbyAqLwotCWJvb2wgaXN3bDsJCS8qIERvbmdsZS1yZXNpZGVudCBkcml2ZXIgaXMgd2wgKi8KLQl1bnNpZ25lZCBsb25nIGRydl92ZXJzaW9uOwkvKiBWZXJzaW9uIG9mIGRvbmdsZS1yZXNpZGVudCBkcml2ZXIgKi8KLQl1OCBtYWNbRVRIX0FMRU5dOwkJCS8qIE1BQyBhZGRyZXNzIG9idGFpbmVkIGZyb20gZG9uZ2xlICovCi0Jc3RydWN0IGRuZ2xfc3RhdHMgZHN0YXRzOwkvKiBTdGF0cyBmb3IgZG9uZ2xlLWJhc2VkIGRhdGEgKi8KLQotCS8qIEFkZGl0aW9uYWwgc3RhdHMgZm9yIHRoZSBidXMgbGV2ZWwgKi8KLQl1bnNpZ25lZCBsb25nIHR4X3BhY2tldHM7CS8qIERhdGEgcGFja2V0cyBzZW50IHRvIGRvbmdsZSAqLwotCXVuc2lnbmVkIGxvbmcgdHhfbXVsdGljYXN0OwkvKiBNdWx0aWNhc3QgZGF0YSBwYWNrZXRzIHNlbnQgdG8gZG9uZ2xlICovCi0JdW5zaWduZWQgbG9uZyB0eF9lcnJvcnM7CS8qIEVycm9ycyBpbiBzZW5kaW5nIGRhdGEgdG8gZG9uZ2xlICovCi0JdW5zaWduZWQgbG9uZyB0eF9jdGxwa3RzOwkvKiBDb250cm9sIHBhY2tldHMgc2VudCB0byBkb25nbGUgKi8KLQl1bnNpZ25lZCBsb25nIHR4X2N0bGVycnM7CS8qIEVycm9ycyBzZW5kaW5nIGNvbnRyb2wgZnJhbWVzIHRvIGRvbmdsZSAqLwotCXVuc2lnbmVkIGxvbmcgcnhfcGFja2V0czsJLyogUGFja2V0cyBzZW50IHVwIHRoZSBuZXR3b3JrIGludGVyZmFjZSAqLwotCXVuc2lnbmVkIGxvbmcgcnhfbXVsdGljYXN0OwkvKiBNdWx0aWNhc3QgcGFja2V0cyBzZW50IHVwIHRoZSBuZXR3b3JrCi0JCQkJCSBpbnRlcmZhY2UgKi8KLQl1bnNpZ25lZCBsb25nIHJ4X2Vycm9yczsJLyogRXJyb3JzIHByb2Nlc3NpbmcgcnggZGF0YSBwYWNrZXRzICovCi0JdW5zaWduZWQgbG9uZyByeF9jdGxwa3RzOwkvKiBDb250cm9sIGZyYW1lcyBwcm9jZXNzZWQgZnJvbSBkb25nbGUgKi8KLQl1bnNpZ25lZCBsb25nIHJ4X2N0bGVycnM7CS8qIEVycm9ycyBpbiBwcm9jZXNzaW5nIHJ4IGNvbnRyb2wgZnJhbWVzICovCi0JdW5zaWduZWQgbG9uZyByeF9kcm9wcGVkOwkvKiBQYWNrZXRzIGRyb3BwZWQgbG9jYWxseSAobm8gbWVtb3J5KSAqLwotCXVuc2lnbmVkIGxvbmcgcnhfZmx1c2hlZDsJLyogUGFja2V0cyBmbHVzaGVkIGR1ZSB0bwotCQkJCXVuc2NoZWR1bGVkIHNlbmR1cCB0aHJlYWQgKi8KLQl1bnNpZ25lZCBsb25nIHdkX2RwY19zY2hlZDsJLyogTnVtYmVyIG9mIHRpbWVzIGRwYyBzY2hlZHVsZWQgYnkKLQkJCQkJIHdhdGNoZG9nIHRpbWVyICovCi0KLQl1bnNpZ25lZCBsb25nIHJ4X3JlYWRhaGVhZF9jbnQ7CS8qIE51bWJlciBvZiBwYWNrZXRzIHdoZXJlIGhlYWRlciByZWFkLWFoZWFkCi0JCQkJCSB3YXMgdXNlZC4gKi8KLQl1bnNpZ25lZCBsb25nIHR4X3JlYWxsb2M7CS8qIE51bWJlciBvZiB0eCBwYWNrZXRzIHdlIGhhZCB0byByZWFsbG9jIGZvcgotCQkJCQkgaGVhZHJvb20gKi8KLQl1bnNpZ25lZCBsb25nIGZjX3BhY2tldHM7CS8qIE51bWJlciBvZiBmbG93IGNvbnRyb2wgcGt0cyByZWN2ZCAqLwotCi0JLyogTGFzdCBlcnJvciByZXR1cm4gKi8KLQlpbnQgYmNtZXJyb3I7Ci0JdWludCB0aWNrY250OwotCi0JLyogTGFzdCBlcnJvciBmcm9tIGRvbmdsZSAqLwotCWludCBkb25nbGVfZXJyb3I7Ci0KLQkvKiBTdXNwZW5kIGRpc2FibGUgZmxhZyAgZmxhZyAqLwotCWludCBzdXNwZW5kX2Rpc2FibGVfZmxhZzsJLyogIjEiIHRvIGRpc2FibGUgYWxsIGV4dHJhIHBvd2Vyc2F2aW5nCi0JCQkJCSBkdXJpbmcgc3VzcGVuZCAqLwotCWludCBpbl9zdXNwZW5kOwkJLyogZmxhZyBzZXQgdG8gMSB3aGVuIGVhcmx5IHN1c3BlbmQgY2FsbGVkICovCi0JaW50IGR0aW1fc2tpcDsJCS8qIGR0aW0gc2tpcCAsIGRlZmF1bHQgMCBtZWFucyB3YWtlIGVhY2ggZHRpbSAqLwotCi0JLyogUGt0IGZpbHRlciBkZWZpbmF0aW9uICovCi0JY2hhciAqcGt0ZmlsdGVyWzEwMF07Ci0JaW50IHBrdGZpbHRlcl9jb3VudDsKLQotCXU4IGNvdW50cnlfY29kZVtCUkNNX0NOVFJZX0JVRl9TWl07Ci0JY2hhciBldmVudG1hc2tbQlJDTUZfRVZFTlRJTkdfTUFTS19MRU5dOwotCi19OwotCi1zdHJ1Y3QgYnJjbWZfaWZfZXZlbnQgewotCXU4IGlmaWR4OwotCXU4IGFjdGlvbjsKLQl1OCBmbGFnczsKLQl1OCBic3NpZHg7Ci19OwotCi1zdHJ1Y3QgYnJjbWZfdGltZW91dCB7Ci0JdTMyIGxpbWl0OwkJLyogRXhwaXJhdGlvbiB0aW1lICh1c2VjKSAqLwotCXUzMiBpbmNyZW1lbnQ7CS8qIEN1cnJlbnQgZXhwaXJhdGlvbiBpbmNyZW1lbnQgKHVzZWMpICovCi0JdTMyIGVsYXBzZWQ7CQkvKiBDdXJyZW50IGVsYXBzZWQgdGltZSAodXNlYykgKi8KLQl1MzIgdGljazsJCS8qIE8vUyB0aWNrIHRpbWUgKHVzZWMpICovCi19OwotCi1zdHJ1Y3QgYmNtZXZlbnRfbmFtZSB7Ci0JdWludCBldmVudDsKLQljb25zdCBjaGFyICpuYW1lOwotfTsKLQotI2lmIGRlZmluZWQoQ09ORklHX1BNX1NMRUVQKQotZXh0ZXJuIGF0b21pY190IGJyY21mX21tY19zdXNwZW5kOwotI2RlZmluZSBCUkNNRl9QTV9SRVNVTUVfV0FJVF9JTklUKGEpIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGEpOwotI2RlZmluZSBfQlJDTUZfUE1fUkVTVU1FX1dBSVQoYSwgYikgZG8geyBcCi0JCWludCByZXRyeSA9IDA7IFwKLQkJd2hpbGUgKGF0b21pY19yZWFkKCZicmNtZl9tbWNfc3VzcGVuZCkgJiYgcmV0cnkrKyAhPSBiKSB7IFwKLQkJCXdhaXRfZXZlbnRfdGltZW91dChhLCBmYWxzZSwgSFovMTAwKTsgXAotCQl9IFwKLQl9CXdoaWxlICgwKQotI2RlZmluZSBCUkNNRl9QTV9SRVNVTUVfV0FJVChhKQlfQlJDTUZfUE1fUkVTVU1FX1dBSVQoYSwgMzApCi0jZGVmaW5lIEJSQ01GX1BNX1JFU1VNRV9SRVRVUk5fRVJST1IoYSkJXAotCWRvIHsgaWYgKGF0b21pY19yZWFkKCZicmNtZl9tbWNfc3VzcGVuZCkpIHJldHVybiBhOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIEJSQ01GX1NQSU5XQUlUX1NMRUVQX0lOSVQoYSkgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoYSk7Ci0jZGVmaW5lIEJSQ01GX1NQSU5XQUlUX1NMRUVQKGEsIGV4cCwgdXMpIGRvIHsgXAotCQl1aW50IGNvdW50ZG93biA9ICh1cykgKyA5OTk5OyBcCi0JCXdoaWxlICgoZXhwKSAmJiAoY291bnRkb3duID49IDEwMDAwKSkgeyBcCi0JCQl3YWl0X2V2ZW50X3RpbWVvdXQoYSwgZmFsc2UsIEhaLzEwMCk7IFwKLQkJCWNvdW50ZG93biAtPSAxMDAwMDsgXAotCQl9IFwKLQl9IHdoaWxlICgwKQotCi0jZWxzZQotCi0jZGVmaW5lIEJSQ01GX1BNX1JFU1VNRV9XQUlUX0lOSVQoYSkKLSNkZWZpbmUgQlJDTUZfUE1fUkVTVU1FX1dBSVQoYSkKLSNkZWZpbmUgQlJDTUZfUE1fUkVTVU1FX1JFVFVSTl9FUlJPUihhKQotCi0jZGVmaW5lIEJSQ01GX1NQSU5XQUlUX1NMRUVQX0lOSVQoYSkKLSNkZWZpbmUgQlJDTUZfU1BJTldBSVRfU0xFRVAoYSwgZXhwLCB1cykgIGRvIHsgXAotCQl1aW50IGNvdW50ZG93biA9ICh1cykgKyA5OyBcCi0JCXdoaWxlICgoZXhwKSAmJiAoY291bnRkb3duID49IDEwKSkgeyBcCi0JCQl1ZGVsYXkoMTApOyAgXAotCQkJY291bnRkb3duIC09IDEwOyAgXAotCQl9IFwKLQl9IHdoaWxlICgwKQotCi0jZW5kaWYJLyogZGVmaW5lZChDT05GSUdfUE1fU0xFRVApICovCi0KLS8qCi0gKiBJbnNtb2QgcGFyYW1ldGVycyBmb3IgZGVidWcvdGVzdAotICovCi0KLS8qIFVzZSBpbnRlcnJ1cHRzICovCi1leHRlcm4gdWludCBicmNtZl9pbnRyOwotCi0vKiBVc2UgcG9sbGluZyAqLwotZXh0ZXJuIHVpbnQgYnJjbWZfcG9sbDsKLQotLyogQVJQIG9mZmxvYWQgYWdlbnQgbW9kZSAqLwotZXh0ZXJuIHVpbnQgYnJjbWZfYXJwX21vZGU7Ci0KLS8qIEFSUCBvZmZsb2FkIGVuYWJsZSAqLwotZXh0ZXJuIHVpbnQgYnJjbWZfYXJwX2VuYWJsZTsKLQotLyogUGt0IGZpbHRlIGVuYWJsZSBjb250cm9sICovCi1leHRlcm4gdWludCBicmNtZl9wa3RfZmlsdGVyX2VuYWJsZTsKLQotLyogIFBrdCBmaWx0ZXIgaW5pdCBzZXR1cCAqLwotZXh0ZXJuIHVpbnQgYnJjbWZfcGt0X2ZpbHRlcl9pbml0OwotCi0vKiBQa3QgZmlsdGVyIG1vZGUgY29udHJvbCAqLwotZXh0ZXJuIHVpbnQgYnJjbWZfbWFzdGVyX21vZGU7Ci0KLS8qIFJvYW1pbmcgbW9kZSBjb250cm9sICovCi1leHRlcm4gdWludCBicmNtZl9yb2FtOwotCi0vKiBSb2FtaW5nIG1vZGUgY29udHJvbCAqLwotZXh0ZXJuIHVpbnQgYnJjbWZfcmFkaW9fdXA7Ci0KLS8qIEluaXRpYWwgaWRsZXRpbWUgdGlja3MgKG1heSBiZSAtMSBmb3IgaW1tZWRpYXRlIGlkbGUsIDAgZm9yIG5vIGlkbGUpICovCi1leHRlcm4gaW50IGJyY21mX2lkbGV0aW1lOwotI2RlZmluZSBCUkNNRl9JRExFVElNRV9USUNLUyAxCi0KLS8qIFNESU8gRHJpdmUgU3RyZW5ndGggKi8KLWV4dGVybiB1aW50IGJyY21mX3NkaW9kX2RyaXZlX3N0cmVuZ3RoOwotCi0vKiBPdmVycmlkZSB0byBmb3JjZSB0eCBxdWV1ZWluZyBhbGwgdGhlIHRpbWUgKi8KLWV4dGVybiB1aW50IGJyY21mX2ZvcmNlX3R4X3F1ZXVlaW5nOwotCi0jaWZkZWYgU0RURVNUCi0vKiBFY2hvIHBhY2tldCBnZW5lcmF0b3IgKFNESU8pLCBwa3RzL3MgKi8KLWV4dGVybiB1aW50IGJyY21mX3BrdGdlbjsKLQotLyogRWNobyBwYWNrZXQgbGVuICgwID0+IHNhd3Rvb3RoLCBtYXggMTgwMCkgKi8KLWV4dGVybiB1aW50IGJyY21mX3BrdGdlbl9sZW47Ci0jZGVmaW5lIEJSQ01GX01BWF9QS1RHRU5fTEVOIDE4MDAKLSNlbmRpZgotCi1leHRlcm4gY29uc3Qgc3RydWN0IGJjbWV2ZW50X25hbWUgYmNtZXZlbnRfbmFtZXNbXTsKLWV4dGVybiBjb25zdCBpbnQgYmNtZXZlbnRfbmFtZXNfc2l6ZTsKLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgTVVURVhfTE9DS19JTklUKHN0cnVjdCBicmNtZl9wdWIgKmRydnIpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBNVVRFWF9MT0NLKHN0cnVjdCBicmNtZl9wdWIgKmRydnIpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBNVVRFWF9VTkxPQ0soc3RydWN0IGJyY21mX3B1YiAqZHJ2cikKLXsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIE1VVEVYX0xPQ0tfU09GVEFQX1NFVF9JTklUKHN0cnVjdCBicmNtZl9wdWIgKmRydnIpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBNVVRFWF9MT0NLX1NPRlRBUF9TRVQoc3RydWN0IGJyY21mX3B1YiAqZHJ2cikKLXsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIE1VVEVYX1VOTE9DS19TT0ZUQVBfU0VUKHN0cnVjdCBicmNtZl9wdWIgKmRydnIpCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBNVVRFWF9MT0NLX1dMX1NDQU5fU0VUX0lOSVQodm9pZCkKLXsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIE1VVEVYX0xPQ0tfV0xfU0NBTl9TRVQodm9pZCkKLXsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIE1VVEVYX1VOTE9DS19XTF9TQ0FOX1NFVCh2b2lkKQotewotfQotCi0vKiBJbmRpY2F0aW9uIGZyb20gYnVzIG1vZHVsZSByZWdhcmRpbmcgcHJlc2VuY2UvaW5zZXJ0aW9uIG9mIGRvbmdsZS4KLSAqIFJldHVybiBzdHJ1Y3QgYnJjbWZfcHViIHBvaW50ZXIsIHVzZWQgYXMgaGFuZGxlIHRvIE9TIG1vZHVsZSBpbiBsYXRlciBjYWxscy4KLSAqIFJldHVybmVkIHN0cnVjdHVyZSBzaG91bGQgaGF2ZSBidXMgYW5kIHByb3QgcG9pbnRlcnMgZmlsbGVkIGluLgotICogYnVzX2hkcmxlbiBzcGVjaWZpZXMgcmVxdWlyZWQgaGVhZHJvb20gZm9yIGJ1cyBtb2R1bGUgaGVhZGVyLgotICovCi1leHRlcm4gc3RydWN0IGJyY21mX3B1YiAqYnJjbWZfYXR0YWNoKHN0cnVjdCBicmNtZl9idXMgKmJ1cywKLQkJCQkgICAgICB1aW50IGJ1c19oZHJsZW4pOwotZXh0ZXJuIGludCBicmNtZl9uZXRfYXR0YWNoKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZHgpOwotZXh0ZXJuIGludCBicmNtZl9uZXRkZXZfd2FpdF9wZW5kODAyMXgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci0KLS8qIEluZGljYXRpb24gZnJvbSBidXMgbW9kdWxlIHJlZ2FyZGluZyByZW1vdmFsL2Fic2VuY2Ugb2YgZG9uZ2xlICovCi1leHRlcm4gdm9pZCBicmNtZl9kZXRhY2goc3RydWN0IGJyY21mX3B1YiAqZHJ2cik7Ci0KLS8qIEluZGljYXRpb24gZnJvbSBidXMgbW9kdWxlIHRvIGNoYW5nZSBmbG93LWNvbnRyb2wgc3RhdGUgKi8KLWV4dGVybiB2b2lkIGJyY21mX3R4Zmxvd2NvbnRyb2woc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgaW50IGlmaWR4LCBib29sIG9uKTsKLQotZXh0ZXJuIGJvb2wgYnJjbWZfY19wcmVjX2VucShzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBzdHJ1Y3QgcGt0cSAqcSwKLQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCBpbnQgcHJlYyk7Ci0KLS8qIFJlY2VpdmUgZnJhbWUgZm9yIGRlbGl2ZXJ5IHRvIE9TLiAgQ2FsbGVlIGRpc3Bvc2VzIG9mIHJ4cC4gKi8KLWV4dGVybiB2b2lkIGJyY21mX3J4X2ZyYW1lKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZmlkeCwKLQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqcnhwLCBpbnQgbnVtcGt0KTsKLQotLyogUmV0dXJuIHBvaW50ZXIgdG8gaW50ZXJmYWNlIG5hbWUgKi8KLWV4dGVybiBjaGFyICpicmNtZl9pZm5hbWUoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgaW50IGlkeCk7Ci0KLS8qIE5vdGlmeSB0eCBjb21wbGV0aW9uICovCi1leHRlcm4gdm9pZCBicmNtZl90eGNvbXBsZXRlKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIHN0cnVjdCBza19idWZmICp0eHAsCi0JCQkgICAgIGJvb2wgc3VjY2Vzcyk7Ci0KLS8qIFF1ZXJ5IGlvY3RsICovCi1leHRlcm4gaW50IGJyY21mX3Byb3RvX2NkY19xdWVyeV9pb2N0bChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBpbnQgaWZpZHgsCi0JCQkJICAgICAgIHVpbnQgY21kLCB2b2lkICpidWYsIHVpbnQgbGVuKTsKLQotLyogT1MgaW5kZXBlbmRlbnQgbGF5ZXIgZnVuY3Rpb25zICovCi1leHRlcm4gaW50IGJyY21mX29zX3Byb3RvX2Jsb2NrKHN0cnVjdCBicmNtZl9wdWIgKmRydnIpOwotZXh0ZXJuIGludCBicmNtZl9vc19wcm90b191bmJsb2NrKHN0cnVjdCBicmNtZl9wdWIgKmRydnIpOwotZXh0ZXJuIGludCBicmNtZl9vc19pb2N0bF9yZXNwX3dhaXQoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgdWludCAqY29uZGl0aW9uLAotCQkJCSAgYm9vbCAqcGVuZGluZyk7Ci1leHRlcm4gaW50IGJyY21mX29zX2lvY3RsX3Jlc3Bfd2FrZShzdHJ1Y3QgYnJjbWZfcHViICpkcnZyKTsKLWV4dGVybiB1bnNpZ25lZCBpbnQgYnJjbWZfb3NfZ2V0X2lvY3RsX3Jlc3BfdGltZW91dCh2b2lkKTsKLWV4dGVybiB2b2lkIGJyY21mX29zX3NldF9pb2N0bF9yZXNwX3RpbWVvdXQodW5zaWduZWQgaW50IHRpbWVvdXRfbXNlYyk7Ci0jaWZkZWYgQkNNREJHCi1leHRlcm4gaW50IGJyY21mX3dyaXRlX3RvX2ZpbGUoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgdTggKmJ1ZiwgaW50IHNpemUpOwotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwotCi1leHRlcm4gdm9pZCBicmNtZl90aW1lb3V0X3N0YXJ0KHN0cnVjdCBicmNtZl90aW1lb3V0ICp0bW8sIHVpbnQgdXNlYyk7Ci1leHRlcm4gaW50IGJyY21mX3RpbWVvdXRfZXhwaXJlZChzdHJ1Y3QgYnJjbWZfdGltZW91dCAqdG1vKTsKLQotZXh0ZXJuIGludCBicmNtZl9pZm5hbWUyaWR4KHN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYsIGNoYXIgKm5hbWUpOwotZXh0ZXJuIGludCBicmNtZl9jX2hvc3RfZXZlbnQoc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiwgaW50ICppZHgsCi0JCQkgICAgICB2b2lkICpwa3RkYXRhLCBzdHJ1Y3QgYnJjbWZfZXZlbnRfbXNnICosCi0JCQkgICAgICB2b2lkICoqZGF0YV9wdHIpOwotCi1leHRlcm4gdm9pZCBicmNtZl9jX2luaXQodm9pZCk7Ci0KLWV4dGVybiBpbnQgYnJjbWZfYWRkX2lmKHN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYsIGludCBpZmlkeCwgdm9pZCAqaGFuZGxlLAotCQkgICAgICBjaGFyICpuYW1lLCB1OCAqbWFjX2FkZHIsIHUzMiBmbGFncywgdTggYnNzaWR4KTsKLWV4dGVybiB2b2lkIGJyY21mX2RlbF9pZihzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2LCBpbnQgaWZpZHgpOwotCi0vKiBTZW5kIHBhY2tldCB0byBkb25nbGUgdmlhIGRhdGEgY2hhbm5lbCAqLwotZXh0ZXJuIGludCBicmNtZl9zZW5kcGt0KHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZmlkeCxcCi0JCQkgc3RydWN0IHNrX2J1ZmYgKnBrdCk7Ci0KLWV4dGVybiBpbnQgYnJjbWZfYnVzX2RldnJlc2V0KHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIHU4IGZsYWcpOwotZXh0ZXJuIGludCBicmNtZl9idXNfc3RhcnQoc3RydWN0IGJyY21mX3B1YiAqZHJ2cik7Ci0KLWV4dGVybiB2b2lkIGJyY21mX2NfcGt0ZmlsdGVyX29mZmxvYWRfc2V0KHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGNoYXIgKmFyZyk7Ci1leHRlcm4gdm9pZCBicmNtZl9jX3BrdGZpbHRlcl9vZmZsb2FkX2VuYWJsZShzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBjaGFyICphcmcsCi0JCQkJCSAgICAgaW50IGVuYWJsZSwgaW50IG1hc3Rlcl9tb2RlKTsKLQotLyogTGludXggbmV0d29yayBkcml2ZXIgaW9jdGwgZW5jb2RpbmcgKi8KLXN0cnVjdCBicmNtZl9jX2lvY3RsIHsKLQl1aW50IGNtZDsJCS8qIGNvbW1vbiBpb2N0bCBkZWZpbml0aW9uICovCi0Jdm9pZCAqYnVmOwkJLyogcG9pbnRlciB0byB1c2VyIGJ1ZmZlciAqLwotCXVpbnQgbGVuOwkJLyogbGVuZ3RoIG9mIHVzZXIgYnVmZmVyICovCi0JYm9vbCBzZXQ7CQkvKiBnZXQgb3Igc2V0IHJlcXVlc3QgKG9wdGlvbmFsKSAqLwotCXVpbnQgdXNlZDsJCS8qIGJ5dGVzIHJlYWQgb3Igd3JpdHRlbiAob3B0aW9uYWwpICovCi0JdWludCBuZWVkZWQ7CQkvKiBieXRlcyBuZWVkZWQgKG9wdGlvbmFsKSAqLwotCXVpbnQgZHJpdmVyOwkJLyogdG8gaWRlbnRpZnkgdGFyZ2V0IGRyaXZlciAqLwotfTsKLQotLyogcGVyLWRyaXZlciBtYWdpYyBudW1iZXJzICovCi0jZGVmaW5lIEJSQ01GX0lPQ1RMX01BR0lDCQkweDAwNDQ0OTQ0Ci0KLS8qIGJ1bXAgdGhpcyBudW1iZXIgaWYgeW91IGNoYW5nZSB0aGUgaW9jdGwgaW50ZXJmYWNlICovCi0jZGVmaW5lIEJSQ01GX0lPQ1RMX1ZFUlNJT04JMQotI2RlZmluZQlCUkNNRl9JT0NUTF9NQVhMRU4JODE5MgkvKiBtYXggbGVuZ3RoIGlvY3RsIGJ1ZmZlciByZXF1aXJlZCAqLwotCi0vKiBjb21tb24gaW9jdGwgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgQlJDTUZfR0VUX01BR0lDCQkJCTAKLSNkZWZpbmUgQlJDTUZfR0VUX1ZFUlNJT04JCQkJMQotI2RlZmluZSBCUkNNRl9HRVRfVkFSCQkJCTIKLSNkZWZpbmUgQlJDTUZfU0VUX1ZBUgkJCQkzCi0KLS8qIG1lc3NhZ2UgbGV2ZWxzICovCi0jZGVmaW5lIEJSQ01GX0VSUk9SX1ZBTAkweDAwMDEKLSNkZWZpbmUgQlJDTUZfVFJBQ0VfVkFMCTB4MDAwMgotI2RlZmluZSBCUkNNRl9JTkZPX1ZBTAkweDAwMDQKLSNkZWZpbmUgQlJDTUZfREFUQV9WQUwJMHgwMDA4Ci0jZGVmaW5lIEJSQ01GX0NUTF9WQUwJMHgwMDEwCi0jZGVmaW5lIEJSQ01GX1RJTUVSX1ZBTAkweDAwMjAKLSNkZWZpbmUgQlJDTUZfSERSU19WQUwJMHgwMDQwCi0jZGVmaW5lIEJSQ01GX0JZVEVTX1ZBTAkweDAwODAKLSNkZWZpbmUgQlJDTUZfSU5UUl9WQUwJMHgwMTAwCi0jZGVmaW5lIEJSQ01GX0dMT01fVkFMCTB4MDQwMAotI2RlZmluZSBCUkNNRl9FVkVOVF9WQUwJMHgwODAwCi0jZGVmaW5lIEJSQ01GX0JUQV9WQUwJMHgxMDAwCi0jZGVmaW5lIEJSQ01GX0lTQ0FOX1ZBTCAweDIwMDAKLQotI2lmZGVmIFNEVEVTVAotLyogRm9yIHBrdGdlbiBpb3ZhciAqLwotc3RydWN0IGJyY21mX3BrdGdlbiB7Ci0JdWludCB2ZXJzaW9uOwkJLyogVG8gYWxsb3cgc3RydWN0dXJlIGNoYW5nZSB0cmFja2luZyAqLwotCXVpbnQgZnJlcTsJCS8qIE1heCB0aWNrcyBiZXR3ZWVuIHR4L3J4IGF0dGVtcHRzICovCi0JdWludCBjb3VudDsJCS8qIFRlc3QgcGFja2V0cyB0byBzZW5kL3JjdiBlYWNoIGF0dGVtcHQgKi8KLQl1aW50IHByaW50OwkJLyogUHJpbnQgY291bnRzIGV2ZXJ5IDxwcmludD4gYXR0ZW1wdHMgKi8KLQl1aW50IHRvdGFsOwkJLyogVG90YWwgcGFja2V0cyAob3IgYnVyc3RzKSAqLwotCXVpbnQgbWlubGVuOwkJLyogTWluaW11bSBsZW5ndGggb2YgcGFja2V0cyB0byBzZW5kICovCi0JdWludCBtYXhsZW47CQkvKiBNYXhpbXVtIGxlbmd0aCBvZiBwYWNrZXRzIHRvIHNlbmQgKi8KLQl1aW50IG51bXNlbnQ7CQkvKiBDb3VudCBvZiB0ZXN0IHBhY2tldHMgc2VudCAqLwotCXVpbnQgbnVtcmN2ZDsJCS8qIENvdW50IG9mIHRlc3QgcGFja2V0cyByZWNlaXZlZCAqLwotCXVpbnQgbnVtZmFpbDsJCS8qIENvdW50IG9mIHRlc3Qgc2VuZCBmYWlsdXJlcyAqLwotCXVpbnQgbW9kZTsJCS8qIFRlc3QgbW9kZSAodHlwZSBvZiB0ZXN0IHBhY2tldHMpICovCi0JdWludCBzdG9wOwkJLyogU3RvcCBhZnRlciB0aGlzIG1hbnkgdHggZmFpbHVyZXMgKi8KLX07Ci0KLS8qIFZlcnNpb24gaW4gY2FzZSBzdHJ1Y3R1cmUgY2hhbmdlcyAqLwotI2RlZmluZSBCUkNNRl9QS1RHRU5fVkVSU0lPTgkyCi0KLS8qIFR5cGUgb2YgdGVzdCBwYWNrZXRzIHRvIHVzZSAqLwotI2RlZmluZSBCUkNNRl9QS1RHRU5fRUNITwkxCS8qIFNlbmQgZWNobyByZXF1ZXN0cyAqLwotI2RlZmluZSBCUkNNRl9QS1RHRU5fU0VORAkyCS8qIFNlbmQgZGlzY2FyZCBwYWNrZXRzICovCi0jZGVmaW5lIEJSQ01GX1BLVEdFTl9SWEJVUlNUCTMJLyogUmVxdWVzdCBkb25nbGUgc2VuZCBOIHBhY2tldHMgKi8KLSNkZWZpbmUgQlJDTUZfUEtUR0VOX1JFQ1YJCTQJLyogQ29udGludW91cyByeCBmcm9tIGNvbnRpbnVvdXMKLQkJCQkJIHR4IGRvbmdsZSAqLwotI2VuZGlmCQkJCS8qIFNEVEVTVCAqLwotCi0vKiBFbnRlciBpZGxlIGltbWVkaWF0ZWx5IChubyB0aW1lb3V0KSAqLwotI2RlZmluZSBCUkNNRl9JRExFX0lNTUVESUFURQkoLTEpCi0KLS8qIFZhbHVlcyBmb3IgaWRsZWNsb2NrIGlvdmFyOiBvdGhlciB2YWx1ZXMgYXJlIHRoZSBzZF9kaXZpc29yIHRvIHVzZQotCSB3aGVuIGlkbGUgKi8KLSNkZWZpbmUgQlJDTUZfSURMRV9BQ1RJVkUJMAkvKiBEbyBub3QgcmVxdWVzdCBhbnkgU0QgY2xvY2sgY2hhbmdlCi0JCQkJIHdoZW4gaWRsZSAqLwotCi0jZW5kaWYJCQkJLyogX0JSQ01GX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9idXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2J1cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTNjZjBkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2J1cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYgX0JSQ01GX0JVU19IXwotI2RlZmluZSBfQlJDTUZfQlVTX0hfCi0KLS8qIFBhY2tldCBhbGlnbm1lbnQgZm9yIG1vc3QgZWZmaWNpZW50IFNESU8gKGNhbiBjaGFuZ2UgYmFzZWQgb24gcGxhdGZvcm0pICovCi0jaWZuZGVmIEJSQ01GX1NEQUxJR04KLSNkZWZpbmUgQlJDTUZfU0RBTElHTgkzMgotI2VuZGlmCi0jaWYgIUlTUE9XRVJPRjIoQlJDTUZfU0RBTElHTikKLSNlcnJvciBCUkNNRl9TREFMSUdOIGlzIG5vdCBhIHBvd2VyIG9mIDIhCi0jZW5kaWYKLQotLyoKLSAqIEV4cG9ydGVkIGZyb20gYnJjbWYgYnVzIG1vZHVsZSAoYnJjbWZfdXNiLCBicmNtZl9zZGlvKQotICovCi0KLS8qIGRvbmdsZSByYW0gbW9kdWxlIHBhcmFtZXRlciAqLwotZXh0ZXJuIGludCBicmNtZl9kb25nbGVfbWVtc2l6ZTsKLQotLyogVHgvUnggYm91bmRzIG1vZHVsZSBwYXJhbWV0ZXJzICovCi1leHRlcm4gdWludCBicmNtZl90eGJvdW5kOwotZXh0ZXJuIHVpbnQgYnJjbWZfcnhib3VuZDsKLQotLyogV2F0Y2hkb2cgdGltZXIgaW50ZXJ2YWwgKi8KLWV4dGVybiB1aW50IGJyY21mX3dhdGNoZG9nX21zOwotCi0vKiBJbmRpY2F0ZSAoZGlzKWludGVyZXN0IGluIGZpbmRpbmcgZG9uZ2xlcy4gKi8KLWV4dGVybiBpbnQgYnJjbWZfYnVzX3JlZ2lzdGVyKHZvaWQpOwotZXh0ZXJuIHZvaWQgYnJjbWZfYnVzX3VucmVnaXN0ZXIodm9pZCk7Ci0KLS8qIFN0b3AgYnVzIG1vZHVsZTogY2xlYXIgcGVuZGluZyBmcmFtZXMsIGRpc2FibGUgZGF0YSBmbG93ICovCi1leHRlcm4gdm9pZCBicmNtZl9zZGJyY21fYnVzX3N0b3Aoc3RydWN0IGJyY21mX2J1cyAqYnVzLCBib29sIGVuZm9yY2VfbXV0ZXgpOwotCi0vKiBJbml0aWFsaXplIGJ1cyBtb2R1bGU6IHByZXBhcmUgZm9yIGNvbW11bmljYXRpb24gdy9kb25nbGUgKi8KLWV4dGVybiBpbnQgYnJjbWZfc2RicmNtX2J1c19pbml0KHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGJvb2wgZW5mb3JjZV9tdXRleCk7Ci0KLS8qIFNlbmQgYSBkYXRhIGZyYW1lIHRvIHRoZSBkb25nbGUuICBDYWxsZWUgZGlzcG9zZXMgb2YgdHhwLiAqLwotZXh0ZXJuIGludCBicmNtZl9zZGJyY21fYnVzX3R4ZGF0YShzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHN0cnVjdCBza19idWZmICp0eHApOwotCi0vKiBTZW5kL3JlY2VpdmUgYSBjb250cm9sIG1lc3NhZ2UgdG8vZnJvbSB0aGUgZG9uZ2xlLgotICogRXhwZWN0cyBjYWxsZXIgdG8gZW5mb3JjZSBhIHNpbmdsZSBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbi4KLSAqLwotZXh0ZXJuIGludAotYnJjbWZfc2RicmNtX2J1c190eGN0bChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHVuc2lnbmVkIGNoYXIgKm1zZywgdWludCBtc2dsZW4pOwotCi1leHRlcm4gaW50Ci1icmNtZl9zZGJyY21fYnVzX3J4Y3RsKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdW5zaWduZWQgY2hhciAqbXNnLCB1aW50IG1zZ2xlbik7Ci0KLS8qIENoZWNrIGZvciBhbmQgaGFuZGxlIGxvY2FsIHByb3Qtc3BlY2lmaWMgaW92YXIgY29tbWFuZHMgKi8KLWV4dGVybiBpbnQgYnJjbWZfc2RicmNtX2J1c19pb3Zhcl9vcChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBjb25zdCBjaGFyICpuYW1lLAotCQkJICAgIHZvaWQgKnBhcmFtcywgaW50IHBsZW4sIHZvaWQgKmFyZywgaW50IGxlbiwKLQkJCSAgICBib29sIHNldCk7Ci0KLS8qIEFkZCBidXMgZHVtcCBvdXRwdXQgdG8gYSBidWZmZXIgKi8KLWV4dGVybiB2b2lkIGJyY21mX3NkYnJjbV9idXNfZHVtcChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLAotCQkJCSAgc3RydWN0IGJyY211X3N0cmJ1ZiAqc3RyYnVmKTsKLQotLyogQ2xlYXIgYW55IGJ1cyBjb3VudGVycyAqLwotZXh0ZXJuIHZvaWQgYnJjbWZfYnVzX2NsZWFyY291bnRzKHN0cnVjdCBicmNtZl9wdWIgKmRydnIpOwotCi1leHRlcm4gdm9pZCBicmNtZl9zZGJyY21fd2RfdGltZXIoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1aW50IHdkdGljayk7Ci0KLSNlbmRpZgkJCQkvKiBfQlJDTUZfQlVTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jZGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2NkYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDVhY2FiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2NkYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGRlZnMuaD4KLQotI2luY2x1ZGUgPGJyY211X3V0aWxzLmg+Ci0jaW5jbHVkZSA8YnJjbXVfd2lmaS5oPgotCi0jaW5jbHVkZSAiZGhkLmgiCi0jaW5jbHVkZSAiZGhkX3Byb3RvLmgiCi0jaW5jbHVkZSAiZGhkX2J1cy5oIgotI2luY2x1ZGUgImRoZF9kYmcuaCIKLQotc3RydWN0IGJyY21mX3Byb3RvX2NkY19pb2N0bCB7Ci0JdTMyIGNtZDsJLyogaW9jdGwgY29tbWFuZCB2YWx1ZSAqLwotCXUzMiBsZW47CS8qIGxvd2VyIDE2OiBvdXRwdXQgYnVmbGVuOwotCQkJICogdXBwZXIgMTY6IGlucHV0IGJ1ZmxlbiAoZXhjbHVkZXMgaGVhZGVyKSAqLwotCXUzMiBmbGFnczsJLyogZmxhZyBkZWZucyBnaXZlbiBiZWxvdyAqLwotCXUzMiBzdGF0dXM7CS8qIHN0YXR1cyBjb2RlIHJldHVybmVkIGZyb20gdGhlIGRldmljZSAqLwotfTsKLQotLyogTWF4IHZhbGlkIGJ1ZmZlciBzaXplIHRoYXQgY2FuIGJlIHNlbnQgdG8gdGhlIGRvbmdsZSAqLwotI2RlZmluZSBDRENfTUFYX01TR19TSVpFCShFVEhfRlJBTUVfTEVOK0VUSF9GQ1NfTEVOKQotCi0vKiBDREMgZmxhZyBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBDRENGX0lPQ19FUlJPUgkJMHgwMQkJLyogMT1pb2N0bCBjbWQgZmFpbGVkICovCi0jZGVmaW5lIENEQ0ZfSU9DX1NFVAkJMHgwMgkJLyogMD1nZXQsIDE9c2V0IGNtZCAqLwotI2RlZmluZSBDRENGX0lPQ19JRl9NQVNLCTB4RjAwMAkJLyogSS9GIGluZGV4ICovCi0jZGVmaW5lIENEQ0ZfSU9DX0lGX1NISUZUCTEyCi0jZGVmaW5lIENEQ0ZfSU9DX0lEX01BU0sJMHhGRkZGMDAwMAkvKiBpZCBhbiBpb2N0bCBwYWlyaW5nICovCi0jZGVmaW5lIENEQ0ZfSU9DX0lEX1NISUZUCTE2CQkvKiBJRCBNYXNrIHNoaWZ0IGJpdHMgKi8KLSNkZWZpbmUgQ0RDX0lPQ19JRChmbGFncykJXAotCSgoKGZsYWdzKSAmIENEQ0ZfSU9DX0lEX01BU0spID4+IENEQ0ZfSU9DX0lEX1NISUZUKQotI2RlZmluZSBDRENfU0VUX0lGX0lEWChoZHIsIGlkeCkgXAotCSgoaGRyKS0+ZmxhZ3MgPSAoKChoZHIpLT5mbGFncyAmIH5DRENGX0lPQ19JRl9NQVNLKSB8IFwKLQkoKGlkeCkgPDwgQ0RDRl9JT0NfSUZfU0hJRlQpKSkKLQotLyoKLSAqIEJEQyBoZWFkZXIgLSBCcm9hZGNvbSBzcGVjaWZpYyBleHRlbnNpb24gb2YgQ0RDLgotICogVXNlZCBvbiBkYXRhIHBhY2tldHMgdG8gY29udmV5IHByaW9yaXR5IGFjcm9zcyBVU0IuCi0gKi8KLSNkZWZpbmUJQkRDX0hFQURFUl9MRU4JCTQKLSNkZWZpbmUgQkRDX1BST1RPX1ZFUgkJMQkvKiBQcm90b2NvbCB2ZXJzaW9uICovCi0jZGVmaW5lIEJEQ19GTEFHX1ZFUl9NQVNLCTB4ZjAJLyogUHJvdG9jb2wgdmVyc2lvbiBtYXNrICovCi0jZGVmaW5lIEJEQ19GTEFHX1ZFUl9TSElGVAk0CS8qIFByb3RvY29sIHZlcnNpb24gc2hpZnQgKi8KLSNkZWZpbmUgQkRDX0ZMQUdfU1VNX0dPT0QJMHgwNAkvKiBHb29kIFJYIGNoZWNrc3VtcyAqLwotI2RlZmluZSBCRENfRkxBR19TVU1fTkVFREVECTB4MDgJLyogRG9uZ2xlIG5lZWRzIHRvIGRvIFRYIGNoZWNrc3VtcyAqLwotI2RlZmluZSBCRENfUFJJT1JJVFlfTUFTSwkweDcKLSNkZWZpbmUgQkRDX0ZMQUcyX0lGX01BU0sJMHgwZgkvKiBwYWNrZXQgcnggaW50ZXJmYWNlIGluIEFQU1RBICovCi0jZGVmaW5lIEJEQ19GTEFHMl9JRl9TSElGVAkwCi0KLSNkZWZpbmUgQkRDX0dFVF9JRl9JRFgoaGRyKSBcCi0JKChpbnQpKCgoKGhkciktPmZsYWdzMikgJiBCRENfRkxBRzJfSUZfTUFTSykgPj4gQkRDX0ZMQUcyX0lGX1NISUZUKSkKLSNkZWZpbmUgQkRDX1NFVF9JRl9JRFgoaGRyLCBpZHgpIFwKLQkoKGhkciktPmZsYWdzMiA9ICgoKGhkciktPmZsYWdzMiAmIH5CRENfRkxBRzJfSUZfTUFTSykgfCBcCi0JKChpZHgpIDw8IEJEQ19GTEFHMl9JRl9TSElGVCkpKQotCi1zdHJ1Y3QgYnJjbWZfcHJvdG9fYmRjX2hlYWRlciB7Ci0JdTggZmxhZ3M7Ci0JdTggcHJpb3JpdHk7CS8qIDgwMi4xZCBQcmlvcml0eSwgNDo3IGZsb3cgY29udHJvbCBpbmZvIGZvciB1c2IgKi8KLQl1OCBmbGFnczI7Ci0JdTggcnNzaTsKLX07Ci0KLQotI2RlZmluZSBSRVRSSUVTIDIJLyogIyBvZiByZXRyaWVzIHRvIHJldHJpZXZlIG1hdGNoaW5nIGlvY3RsIHJlc3BvbnNlICovCi0jZGVmaW5lIEJVU19IRUFERVJfTEVOCSgxNitCUkNNRl9TREFMSUdOKSAvKiBNdXN0IGJlIGF0bGVhc3QgU0RQQ01fUkVTRVJWRQotCQkJCQkgKiAoYW1vdW50IG9mIGhlYWRlciB0aGEgbWlnaHQgYmUgYWRkZWQpCi0JCQkJCSAqIHBsdXMgYW55IHNwYWNlIHRoYXQgbWlnaHQgYmUgbmVlZGVkCi0JCQkJCSAqIGZvciBhbGlnbm1lbnQgcGFkZGluZy4KLQkJCQkJICovCi0jZGVmaW5lIFJPVU5EX1VQX01BUkdJTgkyMDQ4CS8qIEJpZ2dlc3QgU0RJTyBibG9jayBzaXplIHBvc3NpYmxlIGZvcgotCQkJCSAqIHJvdW5kIG9mZiBhdCB0aGUgZW5kIG9mIGJ1ZmZlcgotCQkJCSAqLwotCi1zdHJ1Y3QgYnJjbWZfcHJvdG8gewotCXUxNiByZXFpZDsKLQl1OCBwZW5kaW5nOwotCXUzMiBsYXN0Y21kOwotCXU4IGJ1c19oZWFkZXJbQlVTX0hFQURFUl9MRU5dOwotCXN0cnVjdCBicmNtZl9wcm90b19jZGNfaW9jdGwgbXNnOwotCXVuc2lnbmVkIGNoYXIgYnVmW0JSQ01GX0NfSU9DVExfTUFYTEVOICsgUk9VTkRfVVBfTUFSR0lOXTsKLX07Ci0KLXN0YXRpYyBpbnQgYnJjbWZfcHJvdG9fY2RjX21zZyhzdHJ1Y3QgYnJjbWZfcHViICpkcnZyKQotewotCXN0cnVjdCBicmNtZl9wcm90byAqcHJvdCA9IGRydnItPnByb3Q7Ci0JaW50IGxlbiA9IGxlMzJfdG9fY3B1KHByb3QtPm1zZy5sZW4pICsKLQkJCXNpemVvZihzdHJ1Y3QgYnJjbWZfcHJvdG9fY2RjX2lvY3RsKTsKLQotCUJSQ01GX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwotCi0JLyogTk9URSA6IGNkYy0+bXNnLmxlbiBob2xkcyB0aGUgZGVzaXJlZCBsZW5ndGggb2YgdGhlIGJ1ZmZlciB0byBiZQotCSAqICAgICAgICByZXR1cm5lZC4gT25seSB1cCB0byBDRENfTUFYX01TR19TSVpFIG9mIHRoaXMgYnVmZmVyIGFyZWEKLQkgKiAgICAgICAgaXMgYWN0dWFsbHkgc2VudCB0byB0aGUgZG9uZ2xlCi0JICovCi0JaWYgKGxlbiA+IENEQ19NQVhfTVNHX1NJWkUpCi0JCWxlbiA9IENEQ19NQVhfTVNHX1NJWkU7Ci0KLQkvKiBTZW5kIHJlcXVlc3QgKi8KLQlyZXR1cm4gYnJjbWZfc2RicmNtX2J1c190eGN0bChkcnZyLT5idXMsICh1bnNpZ25lZCBjaGFyICopJnByb3QtPm1zZywKLQkJCQkgICAgICBsZW4pOwotfQotCi1zdGF0aWMgaW50IGJyY21mX3Byb3RvX2NkY19jbXBsdChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCB1MzIgaWQsIHUzMiBsZW4pCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgYnJjbWZfcHJvdG8gKnByb3QgPSBkcnZyLT5wcm90OwotCi0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQlkbyB7Ci0JCXJldCA9IGJyY21mX3NkYnJjbV9idXNfcnhjdGwoZHJ2ci0+YnVzLAotCQkJCSh1bnNpZ25lZCBjaGFyICopJnByb3QtPm1zZywKLQkJCQlsZW4gKyBzaXplb2Yoc3RydWN0IGJyY21mX3Byb3RvX2NkY19pb2N0bCkpOwotCQlpZiAocmV0IDwgMCkKLQkJCWJyZWFrOwotCX0gd2hpbGUgKENEQ19JT0NfSUQobGUzMl90b19jcHUocHJvdC0+bXNnLmZsYWdzKSkgIT0gaWQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50Ci1icmNtZl9wcm90b19jZGNfcXVlcnlfaW9jdGwoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgaW50IGlmaWR4LCB1aW50IGNtZCwKLQkJCSAgICB2b2lkICpidWYsIHVpbnQgbGVuKQotewotCXN0cnVjdCBicmNtZl9wcm90byAqcHJvdCA9IGRydnItPnByb3Q7Ci0Jc3RydWN0IGJyY21mX3Byb3RvX2NkY19pb2N0bCAqbXNnID0gJnByb3QtPm1zZzsKLQl2b2lkICppbmZvOwotCWludCByZXQgPSAwLCByZXRyaWVzID0gMDsKLQl1MzIgaWQsIGZsYWdzID0gMDsKLQotCUJSQ01GX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwotCUJSQ01GX0NUTCgoIiVzOiBjbWQgJWQgbGVuICVkXG4iLCBfX2Z1bmNfXywgY21kLCBsZW4pKTsKLQotCS8qIFJlc3BvbmQgImJjbWVycm9yIiBhbmQgImJjbWVycm9yc3RyIiB3aXRoIGxvY2FsIGNhY2hlICovCi0JaWYgKGNtZCA9PSBCUkNNRl9DX0dFVF9WQVIgJiYgYnVmKSB7Ci0JCWlmICghc3RyY21wKChjaGFyICopYnVmLCAiYmNtZXJyb3JzdHIiKSkgewotCQkJc3RybmNweSgoY2hhciAqKWJ1ZiwgImJjbV9lcnJvciIsCi0JCQkJQkNNRV9TVFJMRU4pOwotCQkJZ290byBkb25lOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAoKGNoYXIgKilidWYsICJiY21lcnJvciIpKSB7Ci0JCQkqKGludCAqKWJ1ZiA9IGRydnItPmRvbmdsZV9lcnJvcjsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0KLQotCW1lbXNldChtc2csIDAsIHNpemVvZihzdHJ1Y3QgYnJjbWZfcHJvdG9fY2RjX2lvY3RsKSk7Ci0KLQltc2ctPmNtZCA9IGNwdV90b19sZTMyKGNtZCk7Ci0JbXNnLT5sZW4gPSBjcHVfdG9fbGUzMihsZW4pOwotCW1zZy0+ZmxhZ3MgPSAoKytwcm90LT5yZXFpZCA8PCBDRENGX0lPQ19JRF9TSElGVCk7Ci0JQ0RDX1NFVF9JRl9JRFgobXNnLCBpZmlkeCk7Ci0JbXNnLT5mbGFncyA9IGNwdV90b19sZTMyKG1zZy0+ZmxhZ3MpOwotCi0JaWYgKGJ1ZikKLQkJbWVtY3B5KHByb3QtPmJ1ZiwgYnVmLCBsZW4pOwotCi0JcmV0ID0gYnJjbWZfcHJvdG9fY2RjX21zZyhkcnZyKTsKLQlpZiAocmV0IDwgMCkgewotCQlCUkNNRl9FUlJPUigoImJyY21mX3Byb3RvX2NkY19xdWVyeV9pb2N0bDogYnJjbWZfcHJvdG9fY2RjX21zZyAiCi0JCQkgICAgICJmYWlsZWQgdy9zdGF0dXMgJWRcbiIsIHJldCkpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi1yZXRyeToKLQkvKiB3YWl0IGZvciBpbnRlcnJ1cHQgYW5kIGdldCBmaXJzdCBmcmFnbWVudCAqLwotCXJldCA9IGJyY21mX3Byb3RvX2NkY19jbXBsdChkcnZyLCBwcm90LT5yZXFpZCwgbGVuKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBkb25lOwotCi0JZmxhZ3MgPSBsZTMyX3RvX2NwdShtc2ctPmZsYWdzKTsKLQlpZCA9IChmbGFncyAmIENEQ0ZfSU9DX0lEX01BU0spID4+IENEQ0ZfSU9DX0lEX1NISUZUOwotCi0JaWYgKChpZCA8IHByb3QtPnJlcWlkKSAmJiAoKytyZXRyaWVzIDwgUkVUUklFUykpCi0JCWdvdG8gcmV0cnk7Ci0JaWYgKGlkICE9IHByb3QtPnJlcWlkKSB7Ci0JCUJSQ01GX0VSUk9SKCgiJXM6ICVzOiB1bmV4cGVjdGVkIHJlcXVlc3QgaWQgJWQgKGV4cGVjdGVkICVkKVxuIiwKLQkJCSAgICAgYnJjbWZfaWZuYW1lKGRydnIsIGlmaWR4KSwgX19mdW5jX18sIGlkLAotCQkJICAgICBwcm90LT5yZXFpZCkpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogQ2hlY2sgaW5mbyBidWZmZXIgKi8KLQlpbmZvID0gKHZvaWQgKikmbXNnWzFdOwotCi0JLyogQ29weSBpbmZvIGJ1ZmZlciAqLwotCWlmIChidWYpIHsKLQkJaWYgKHJldCA8IChpbnQpbGVuKQotCQkJbGVuID0gcmV0OwotCQltZW1jcHkoYnVmLCBpbmZvLCBsZW4pOwotCX0KLQotCS8qIENoZWNrIHRoZSBFUlJPUiBmbGFnICovCi0JaWYgKGZsYWdzICYgQ0RDRl9JT0NfRVJST1IpIHsKLQkJcmV0ID0gbGUzMl90b19jcHUobXNnLT5zdGF0dXMpOwotCQkvKiBDYWNoZSBlcnJvciBmcm9tIGRvbmdsZSAqLwotCQlkcnZyLT5kb25nbGVfZXJyb3IgPSByZXQ7Ci0JfQotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLWludCBicmNtZl9wcm90b19jZGNfc2V0X2lvY3RsKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZmlkeCwgdWludCBjbWQsCi0JCQkgICAgICB2b2lkICpidWYsIHVpbnQgbGVuKQotewotCXN0cnVjdCBicmNtZl9wcm90byAqcHJvdCA9IGRydnItPnByb3Q7Ci0Jc3RydWN0IGJyY21mX3Byb3RvX2NkY19pb2N0bCAqbXNnID0gJnByb3QtPm1zZzsKLQlpbnQgcmV0ID0gMDsKLQl1MzIgZmxhZ3MsIGlkOwotCi0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0JQlJDTUZfQ1RMKCgiJXM6IGNtZCAlZCBsZW4gJWRcbiIsIF9fZnVuY19fLCBjbWQsIGxlbikpOwotCi0JbWVtc2V0KG1zZywgMCwgc2l6ZW9mKHN0cnVjdCBicmNtZl9wcm90b19jZGNfaW9jdGwpKTsKLQotCW1zZy0+Y21kID0gY3B1X3RvX2xlMzIoY21kKTsKLQltc2ctPmxlbiA9IGNwdV90b19sZTMyKGxlbik7Ci0JbXNnLT5mbGFncyA9ICgrK3Byb3QtPnJlcWlkIDw8IENEQ0ZfSU9DX0lEX1NISUZUKSB8IENEQ0ZfSU9DX1NFVDsKLQlDRENfU0VUX0lGX0lEWChtc2csIGlmaWR4KTsKLQltc2ctPmZsYWdzID0gY3B1X3RvX2xlMzIobXNnLT5mbGFncyk7Ci0KLQlpZiAoYnVmKQotCQltZW1jcHkocHJvdC0+YnVmLCBidWYsIGxlbik7Ci0KLQlyZXQgPSBicmNtZl9wcm90b19jZGNfbXNnKGRydnIpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGRvbmU7Ci0KLQlyZXQgPSBicmNtZl9wcm90b19jZGNfY21wbHQoZHJ2ciwgcHJvdC0+cmVxaWQsIGxlbik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZG9uZTsKLQotCWZsYWdzID0gbGUzMl90b19jcHUobXNnLT5mbGFncyk7Ci0JaWQgPSAoZmxhZ3MgJiBDRENGX0lPQ19JRF9NQVNLKSA+PiBDRENGX0lPQ19JRF9TSElGVDsKLQotCWlmIChpZCAhPSBwcm90LT5yZXFpZCkgewotCQlCUkNNRl9FUlJPUigoIiVzOiAlczogdW5leHBlY3RlZCByZXF1ZXN0IGlkICVkIChleHBlY3RlZCAlZClcbiIsCi0JCQkgICAgIGJyY21mX2lmbmFtZShkcnZyLCBpZmlkeCksIF9fZnVuY19fLCBpZCwKLQkJCSAgICAgcHJvdC0+cmVxaWQpKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIENoZWNrIHRoZSBFUlJPUiBmbGFnICovCi0JaWYgKGZsYWdzICYgQ0RDRl9JT0NfRVJST1IpIHsKLQkJcmV0ID0gbGUzMl90b19jcHUobXNnLT5zdGF0dXMpOwotCQkvKiBDYWNoZSBlcnJvciBmcm9tIGRvbmdsZSAqLwotCQlkcnZyLT5kb25nbGVfZXJyb3IgPSByZXQ7Ci0JfQotCi1kb25lOgotCXJldHVybiByZXQ7Ci19Ci0KLWludAotYnJjbWZfcHJvdG9faW9jdGwoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgaW50IGlmaWR4LCBzdHJ1Y3QgYnJjbWZfaW9jdGwgKmlvYywKLQkJICB2b2lkICpidWYsIGludCBsZW4pCi17Ci0Jc3RydWN0IGJyY21mX3Byb3RvICpwcm90ID0gZHJ2ci0+cHJvdDsKLQlpbnQgcmV0ID0gLTE7Ci0KLQlpZiAoZHJ2ci0+YnVzc3RhdGUgPT0gQlJDTUZfQlVTX0RPV04pIHsKLQkJQlJDTUZfRVJST1IoKCIlcyA6IGJ1cyBpcyBkb3duLiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG9cbiIsCi0JCQkgICAgIF9fZnVuY19fKSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCWJyY21mX29zX3Byb3RvX2Jsb2NrKGRydnIpOwotCi0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQlpZiAobGVuID4gQlJDTUZfQ19JT0NUTF9NQVhMRU4pCi0JCWdvdG8gZG9uZTsKLQotCWlmIChwcm90LT5wZW5kaW5nID09IHRydWUpIHsKLQkJQlJDTUZfVFJBQ0UoKCJDREMgcGFja2V0IGlzIHBlbmRpbmchISEhIGNtZD0weCV4ICglbHUpICIKLQkJCSAgICAgImxhc3RjbWQ9MHgleCAoJWx1KVxuIiwKLQkJCSAgICAgaW9jLT5jbWQsICh1bnNpZ25lZCBsb25nKWlvYy0+Y21kLCBwcm90LT5sYXN0Y21kLAotCQkJICAgICAodW5zaWduZWQgbG9uZylwcm90LT5sYXN0Y21kKSk7Ci0JCWlmICgoaW9jLT5jbWQgPT0gQlJDTUZfQ19TRVRfVkFSKSB8fAotCQkgICAgKGlvYy0+Y21kID09IEJSQ01GX0NfR0VUX1ZBUikpCi0JCQlCUkNNRl9UUkFDRSgoImlvdmFyIGNtZD0lc1xuIiwgKGNoYXIgKilidWYpKTsKLQotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcHJvdC0+cGVuZGluZyA9IHRydWU7Ci0JcHJvdC0+bGFzdGNtZCA9IGlvYy0+Y21kOwotCWlmIChpb2MtPnNldCkKLQkJcmV0ID0gYnJjbWZfcHJvdG9fY2RjX3NldF9pb2N0bChkcnZyLCBpZmlkeCwgaW9jLT5jbWQsCi0JCQkJCQlidWYsIGxlbik7Ci0JZWxzZSB7Ci0JCXJldCA9IGJyY21mX3Byb3RvX2NkY19xdWVyeV9pb2N0bChkcnZyLCBpZmlkeCwgaW9jLT5jbWQsCi0JCQkJCQkgIGJ1ZiwgbGVuKTsKLQkJaWYgKHJldCA+IDApCi0JCQlpb2MtPnVzZWQgPSByZXQgLSBzaXplb2Yoc3RydWN0IGJyY21mX3Byb3RvX2NkY19pb2N0bCk7Ci0JfQotCi0JLyogVG9vIG1hbnkgcHJvZ3JhbXMgYXNzdW1lIGlvY3RsKCkgcmV0dXJucyAwIG9uIHN1Y2Nlc3MgKi8KLQlpZiAocmV0ID49IDApCi0JCXJldCA9IDA7Ci0JZWxzZSB7Ci0JCXN0cnVjdCBicmNtZl9wcm90b19jZGNfaW9jdGwgKm1zZyA9ICZwcm90LT5tc2c7Ci0JCS8qIGxlbiA9PSBuZWVkZWQgd2hlbiBzZXQvcXVlcnkgZmFpbHMgZnJvbSBkb25nbGUgKi8KLQkJaW9jLT5uZWVkZWQgPSBsZTMyX3RvX2NwdShtc2ctPmxlbik7Ci0JfQotCi0JLyogSW50ZXJjZXB0IHRoZSB3bWVfZHAgaW9jdGwgaGVyZSAqLwotCWlmICghcmV0ICYmIGlvYy0+Y21kID09IEJSQ01GX0NfU0VUX1ZBUiAmJgotCSAgICAhc3RyY21wKGJ1ZiwgIndtZV9kcCIpKSB7Ci0JCWludCBzbGVuLCB2YWwgPSAwOwotCi0JCXNsZW4gPSBzdHJsZW4oIndtZV9kcCIpICsgMTsKLQkJaWYgKGxlbiA+PSAoaW50KShzbGVuICsgc2l6ZW9mKGludCkpKQotCQkJbWVtY3B5KCZ2YWwsIChjaGFyICopYnVmICsgc2xlbiwgc2l6ZW9mKGludCkpOwotCQlkcnZyLT53bWVfZHAgPSAodTgpIGxlMzJfdG9fY3B1KHZhbCk7Ci0JfQotCi0JcHJvdC0+cGVuZGluZyA9IGZhbHNlOwotCi1kb25lOgotCWJyY21mX29zX3Byb3RvX3VuYmxvY2soZHJ2cik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0jZGVmaW5lIFBLVFNVTU5FRURFRChza2IpIFwKLQkJKCgoc3RydWN0IHNrX2J1ZmYgKikoc2tiKSktPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKQotI2RlZmluZSBQS1RTRVRTVU1HT09EKHNrYiwgeCkgXAotCQkoKChzdHJ1Y3Qgc2tfYnVmZiAqKShza2IpKS0+aXBfc3VtbWVkID0gXAotCQkoKHgpID8gQ0hFQ0tTVU1fVU5ORUNFU1NBUlkgOiBDSEVDS1NVTV9OT05FKSkKLQotdm9pZCBicmNtZl9wcm90b19kdW1wKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIHN0cnVjdCBicmNtdV9zdHJidWYgKnN0cmJ1ZikKLXsKLQlicmNtdV9icHJpbnRmKHN0cmJ1ZiwgIlByb3RvY29sIENEQzogcmVxaWQgJWRcbiIsIGRydnItPnByb3QtPnJlcWlkKTsKLX0KLQotdm9pZCBicmNtZl9wcm90b19oZHJwdXNoKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZmlkeCwKLQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqcGt0YnVmKQotewotCXN0cnVjdCBicmNtZl9wcm90b19iZGNfaGVhZGVyICpoOwotCi0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQkvKiBQdXNoIEJEQyBoZWFkZXIgdXNlZCB0byBjb252ZXkgcHJpb3JpdHkgZm9yIGJ1c2VzIHRoYXQgZG9uJ3QgKi8KLQotCXNrYl9wdXNoKHBrdGJ1ZiwgQkRDX0hFQURFUl9MRU4pOwotCi0JaCA9IChzdHJ1Y3QgYnJjbWZfcHJvdG9fYmRjX2hlYWRlciAqKShwa3RidWYtPmRhdGEpOwotCi0JaC0+ZmxhZ3MgPSAoQkRDX1BST1RPX1ZFUiA8PCBCRENfRkxBR19WRVJfU0hJRlQpOwotCWlmIChQS1RTVU1ORUVERUQocGt0YnVmKSkKLQkJaC0+ZmxhZ3MgfD0gQkRDX0ZMQUdfU1VNX05FRURFRDsKLQotCWgtPnByaW9yaXR5ID0gKHBrdGJ1Zi0+cHJpb3JpdHkgJiBCRENfUFJJT1JJVFlfTUFTSyk7Ci0JaC0+ZmxhZ3MyID0gMDsKLQloLT5yc3NpID0gMDsKLQlCRENfU0VUX0lGX0lEWChoLCBpZmlkeCk7Ci19Ci0KLWludCBicmNtZl9wcm90b19oZHJwdWxsKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCAqaWZpZHgsCi0JCQlzdHJ1Y3Qgc2tfYnVmZiAqcGt0YnVmKQotewotCXN0cnVjdCBicmNtZl9wcm90b19iZGNfaGVhZGVyICpoOwotCi0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQkvKiBQb3AgQkRDIGhlYWRlciB1c2VkIHRvIGNvbnZleSBwcmlvcml0eSBmb3IgYnVzZXMgdGhhdCBkb24ndCAqLwotCi0JaWYgKHBrdGJ1Zi0+bGVuIDwgQkRDX0hFQURFUl9MRU4pIHsKLQkJQlJDTUZfRVJST1IoKCIlczogcnggZGF0YSB0b28gc2hvcnQgKCVkIDwgJWQpXG4iLCBfX2Z1bmNfXywKLQkJCSAgICAgcGt0YnVmLT5sZW4sIEJEQ19IRUFERVJfTEVOKSk7Ci0JCXJldHVybiAtRUJBREU7Ci0JfQotCi0JaCA9IChzdHJ1Y3QgYnJjbWZfcHJvdG9fYmRjX2hlYWRlciAqKShwa3RidWYtPmRhdGEpOwotCi0JKmlmaWR4ID0gQkRDX0dFVF9JRl9JRFgoaCk7Ci0JaWYgKCppZmlkeCA+PSBCUkNNRl9NQVhfSUZTKSB7Ci0JCUJSQ01GX0VSUk9SKCgiJXM6IHJ4IGRhdGEgaWZudW0gb3V0IG9mIHJhbmdlICglZClcbiIsCi0JCQkgICAgIF9fZnVuY19fLCAqaWZpZHgpKTsKLQkJcmV0dXJuIC1FQkFERTsKLQl9Ci0KLQlpZiAoKChoLT5mbGFncyAmIEJEQ19GTEFHX1ZFUl9NQVNLKSA+PiBCRENfRkxBR19WRVJfU0hJRlQpICE9Ci0JICAgIEJEQ19QUk9UT19WRVIpIHsKLQkJQlJDTUZfRVJST1IoKCIlczogbm9uLUJEQyBwYWNrZXQgcmVjZWl2ZWQsIGZsYWdzIDB4JXhcbiIsCi0JCQkgICAgIGJyY21mX2lmbmFtZShkcnZyLCAqaWZpZHgpLCBoLT5mbGFncykpOwotCQlyZXR1cm4gLUVCQURFOwotCX0KLQotCWlmIChoLT5mbGFncyAmIEJEQ19GTEFHX1NVTV9HT09EKSB7Ci0JCUJSQ01GX0lORk8oKCIlczogQkRDIHBhY2tldCByZWNlaXZlZCB3aXRoIGdvb2QgcngtY3N1bSwgIgotCQkJICAgICJmbGFncyAweCV4XG4iLAotCQkJICAgIGJyY21mX2lmbmFtZShkcnZyLCAqaWZpZHgpLCBoLT5mbGFncykpOwotCQlQS1RTRVRTVU1HT09EKHBrdGJ1ZiwgdHJ1ZSk7Ci0JfQotCi0JcGt0YnVmLT5wcmlvcml0eSA9IGgtPnByaW9yaXR5ICYgQkRDX1BSSU9SSVRZX01BU0s7Ci0KLQlza2JfcHVsbChwa3RidWYsIEJEQ19IRUFERVJfTEVOKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgYnJjbWZfcHJvdG9fYXR0YWNoKHN0cnVjdCBicmNtZl9wdWIgKmRydnIpCi17Ci0Jc3RydWN0IGJyY21mX3Byb3RvICpjZGM7Ci0KLQljZGMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnJjbWZfcHJvdG8pLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWNkYykgewotCQlCUkNNRl9FUlJPUigoIiVzOiBrbWFsbG9jIGZhaWxlZFxuIiwgX19mdW5jX18pKTsKLQkJZ290byBmYWlsOwotCX0KLQotCS8qIGVuc3VyZSB0aGF0IHRoZSBtc2cgYnVmIGRpcmVjdGx5IGZvbGxvd3MgdGhlIGNkYyBtc2cgc3RydWN0ICovCi0JaWYgKCh1bnNpZ25lZCBsb25nKSgmY2RjLT5tc2cgKyAxKSAhPSAodW5zaWduZWQgbG9uZyljZGMtPmJ1ZikgewotCQlCUkNNRl9FUlJPUigoInN0cnVjdCBicmNtZl9wcm90byBpcyBub3QgY29ycmVjdGx5IGRlZmluZWRcbiIpKTsKLQkJZ290byBmYWlsOwotCX0KLQotCWRydnItPnByb3QgPSBjZGM7Ci0JZHJ2ci0+aGRybGVuICs9IEJEQ19IRUFERVJfTEVOOwotCWRydnItPm1heGN0bCA9IEJSQ01GX0NfSU9DVExfTUFYTEVOICsKLQkJCXNpemVvZihzdHJ1Y3QgYnJjbWZfcHJvdG9fY2RjX2lvY3RsKSArIFJPVU5EX1VQX01BUkdJTjsKLQlyZXR1cm4gMDsKLQotZmFpbDoKLQlrZnJlZShjZGMpOwotCXJldHVybiAtRU5PTUVNOwotfQotCi0vKiB+Tk9URX4gV2hhdCBpZiBhbm90aGVyIHRocmVhZCBpcyB3YWl0aW5nIG9uIHRoZSBzZW1hcGhvcmU/ICBIb2xkaW5nIGl0PyAqLwotdm9pZCBicmNtZl9wcm90b19kZXRhY2goc3RydWN0IGJyY21mX3B1YiAqZHJ2cikKLXsKLQlrZnJlZShkcnZyLT5wcm90KTsKLQlkcnZyLT5wcm90ID0gTlVMTDsKLX0KLQotdm9pZCBicmNtZl9wcm90b19kc3RhdHMoc3RydWN0IGJyY21mX3B1YiAqZHJ2cikKLXsKLQkvKiBObyBzdGF0cyBmcm9tIGRvbmdsZSBhZGRlZCB5ZXQsIGNvcHkgYnVzIHN0YXRzICovCi0JZHJ2ci0+ZHN0YXRzLnR4X3BhY2tldHMgPSBkcnZyLT50eF9wYWNrZXRzOwotCWRydnItPmRzdGF0cy50eF9lcnJvcnMgPSBkcnZyLT50eF9lcnJvcnM7Ci0JZHJ2ci0+ZHN0YXRzLnJ4X3BhY2tldHMgPSBkcnZyLT5yeF9wYWNrZXRzOwotCWRydnItPmRzdGF0cy5yeF9lcnJvcnMgPSBkcnZyLT5yeF9lcnJvcnM7Ci0JZHJ2ci0+ZHN0YXRzLnJ4X2Ryb3BwZWQgPSBkcnZyLT5yeF9kcm9wcGVkOwotCWRydnItPmRzdGF0cy5tdWx0aWNhc3QgPSBkcnZyLT5yeF9tdWx0aWNhc3Q7Ci0JcmV0dXJuOwotfQotCi1pbnQgYnJjbWZfcHJvdG9faW5pdChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyKQotewotCWludCByZXQgPSAwOwotCWNoYXIgYnVmWzEyOF07Ci0KLQlCUkNNRl9UUkFDRSgoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKLQotCWJyY21mX29zX3Byb3RvX2Jsb2NrKGRydnIpOwotCi0JLyogR2V0IHRoZSBkZXZpY2UgTUFDIGFkZHJlc3MgKi8KLQlzdHJjcHkoYnVmLCAiY3VyX2V0aGVyYWRkciIpOwotCXJldCA9IGJyY21mX3Byb3RvX2NkY19xdWVyeV9pb2N0bChkcnZyLCAwLCBCUkNNRl9DX0dFVF9WQVIsCi0JCQkJCSAgYnVmLCBzaXplb2YoYnVmKSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJYnJjbWZfb3NfcHJvdG9fdW5ibG9jayhkcnZyKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JbWVtY3B5KGRydnItPm1hYywgYnVmLCBFVEhfQUxFTik7Ci0KLQlicmNtZl9vc19wcm90b191bmJsb2NrKGRydnIpOwotCi0JcmV0ID0gYnJjbWZfY19wcmVpbml0X2lvY3RscyhkcnZyKTsKLQotCS8qIEFsd2F5cyBhc3N1bWVzIHdsIGZvciBub3cgKi8KLQlkcnZyLT5pc3dsID0gdHJ1ZTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgYnJjbWZfcHJvdG9fc3RvcChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyKQotewotCS8qIE5vdGhpbmcgdG8gZG8gZm9yIENEQyAqLwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfY29tbW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jb21tb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRlYzQ2OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jb21tb24uYworKysgL2Rldi9udWxsCkBAIC0xLDExOTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+Ci0jaW5jbHVkZSA8ZGVmcy5oPgotI2luY2x1ZGUgPGJyY211X3dpZmkuaD4KLSNpbmNsdWRlIDxicmNtdV91dGlscy5oPgotI2luY2x1ZGUgImRoZC5oIgotI2luY2x1ZGUgImRoZF9idXMuaCIKLSNpbmNsdWRlICJkaGRfcHJvdG8uaCIKLSNpbmNsdWRlICJkaGRfZGJnLmgiCi0KLSNkZWZpbmUgQlJDTV9PVUkJCQkiXHgwMFx4MTBceDE4IgotI2RlZmluZSBET1QxMV9PVUlfTEVOCQkJMwotI2RlZmluZSBCQ01JTENQX0JDTV9TVUJUWVBFX0VWRU5UCTEKLSNkZWZpbmUgUEtURklMVEVSX0JVRl9TSVpFCQkyMDQ4Ci0KLWludCBicmNtZl9tc2dfbGV2ZWw7Ci0KLSNkZWZpbmUgTVNHVFJBQ0VfVkVSU0lPTgkxCi0KLSNpZmRlZiBCQ01EQkcKLWNvbnN0IGNoYXIgYnJjbWZfdmVyc2lvbltdID0KLSJEb25nbGUgSG9zdCBEcml2ZXIsIHZlcnNpb24gIiBCUkNNRl9WRVJTSU9OX1NUUiAiXG5Db21waWxlZCBvbiAiIF9fREFURV9fCi0iIGF0ICIgX19USU1FX187Ci0jZWxzZQotY29uc3QgY2hhciBicmNtZl92ZXJzaW9uW10gPSAiRG9uZ2xlIEhvc3QgRHJpdmVyLCB2ZXJzaW9uICIgQlJDTUZfVkVSU0lPTl9TVFI7Ci0jZW5kaWYKLQotLyogSU9WYXIgdGFibGUgKi8KLWVudW0gewotCUlPVl9WRVJTSU9OID0gMSwKLQlJT1ZfTVNHTEVWRUwsCi0JSU9WX0JDTUVSUk9SU1RSLAotCUlPVl9CQ01FUlJPUiwKLQlJT1ZfRFVNUCwKLQlJT1ZfQ0xFQVJDT1VOVFMsCi0JSU9WX0xPR0RVTVAsCi0JSU9WX0xPR0NBTCwKLQlJT1ZfTE9HU1RBTVAsCi0JSU9WX0dQSU9PQiwKLQlJT1ZfSU9DVExUSU1FT1VULAotCUlPVl9MQVNUCi19OwotCi1jb25zdCBzdHJ1Y3QgYnJjbXVfaW92YXIgYnJjbWZfaW92YXJzW10gPSB7Ci0JeyJ2ZXJzaW9uIiwgSU9WX1ZFUlNJT04sIDAsIElPVlRfQlVGRkVSLCBzaXplb2YoYnJjbWZfdmVyc2lvbil9Ci0JLAotI2lmZGVmIEJDTURCRwotCXsibXNnbGV2ZWwiLCBJT1ZfTVNHTEVWRUwsIDAsIElPVlRfVUlOVDMyLCAwfQotCSwKLSNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KLQl7ImJjbWVycm9yc3RyIiwgSU9WX0JDTUVSUk9SU1RSLCAwLCBJT1ZUX0JVRkZFUiwgQkNNRV9TVFJMRU59Ci0JLAotCXsiYmNtZXJyb3IiLCBJT1ZfQkNNRVJST1IsIDAsIElPVlRfSU5UOCwgMH0KLQksCi0JeyJkdW1wIiwgSU9WX0RVTVAsIDAsIElPVlRfQlVGRkVSLCBCUkNNRl9JT0NUTF9NQVhMRU59Ci0JLAotCXsiY2xlYXJjb3VudHMiLCBJT1ZfQ0xFQVJDT1VOVFMsIDAsIElPVlRfVk9JRCwgMH0KLQksCi0JeyJncGlvb2IiLCBJT1ZfR1BJT09CLCAwLCBJT1ZUX1VJTlQzMiwgMH0KLQksCi0JeyJpb2N0bF90aW1lb3V0IiwgSU9WX0lPQ1RMVElNRU9VVCwgMCwgSU9WVF9VSU5UMzIsIDB9Ci0JLAotCXtOVUxMLCAwLCAwLCAwLCAwfQotfTsKLQotLyogTWVzc2FnZSB0cmFjZSBoZWFkZXIgKi8KLXN0cnVjdCBtc2d0cmFjZV9oZHIgewotCXU4IHZlcnNpb247Ci0JdTggc3BhcmU7Ci0JdTE2IGxlbjsJCS8qIExlbiBvZiB0aGUgdHJhY2UgKi8KLQl1MzIgc2VxbnVtOwkJLyogU2VxdWVuY2UgbnVtYmVyIG9mIG1lc3NhZ2UuIFVzZWZ1bAotCQkJCSAqIGlmIHRoZSBtZXNzc2FnZSBoYXMgYmVlbiBsb3N0Ci0JCQkJICogYmVjYXVzZSBvZiBETUEgZXJyb3Igb3IgYSBidXMgcmVzZXQKLQkJCQkgKiAoZXg6IFNESU8gRnVuYzIpCi0JCQkJICovCi0JdTMyIGRpc2NhcmRlZF9ieXRlczsJLyogTnVtYmVyIG9mIGRpc2NhcmRlZCBieXRlcyBiZWNhdXNlIG9mCi0JCQkJIHRyYWNlIG92ZXJmbG93ICAqLwotCXUzMiBkaXNjYXJkZWRfcHJpbnRmOwkvKiBOdW1iZXIgb2YgZGlzY2FyZGVkIHByaW50ZgotCQkJCSBiZWNhdXNlIG9mIHRyYWNlIG92ZXJmbG93ICovCi19IF9fcGFja2VkOwotCi12b2lkIGJyY21mX2NfaW5pdCh2b2lkKQotewotCS8qIEluaXQgZ2xvYmFsIHZhcmlhYmxlcyBhdCBydW4tdGltZSwgbm90IGFzIHBhcnQgb2YgdGhlIGRlY2xhcmF0aW9uLgotCSAqIFRoaXMgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBpbml0L2RlLWluaXQgb2YgdGhlIGRyaXZlci4KLQkgKiBJbml0aWFsaXphdGlvbgotCSAqIG9mIGdsb2JhbHMgYXMgcGFydCBvZiB0aGUgZGVjbGFyYXRpb24gcmVzdWx0cyBpbiBub24tZGV0ZXJtaW5pc3RpYwotCSAqIGJlaGF2aW91ciBzaW5jZSB0aGUgdmFsdWUgb2YgdGhlIGdsb2JhbHMgbWF5IGJlIGRpZmZlcmVudCBvbiB0aGUKLQkgKiBmaXJzdCB0aW1lIHRoYXQgdGhlIGRyaXZlciBpcyBpbml0aWFsaXplZCB2cyBzdWJzZXF1ZW50Ci0JICogaW5pdGlhbGl6YXRpb25zLgotCSAqLwotCWJyY21mX21zZ19sZXZlbCA9IEJSQ01GX0VSUk9SX1ZBTDsKLX0KLQotc3RhdGljIGludCBicmNtZl9jX2R1bXAoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKQotewotCXN0cnVjdCBicmNtdV9zdHJidWYgYjsKLQlzdHJ1Y3QgYnJjbXVfc3RyYnVmICpzdHJidWYgPSAmYjsKLQotCWJyY211X2Jpbml0KHN0cmJ1ZiwgYnVmLCBidWZsZW4pOwotCi0JLyogQmFzZSBpbmZvICovCi0JYnJjbXVfYnByaW50ZihzdHJidWYsICIlc1xuIiwgYnJjbWZfdmVyc2lvbik7Ci0JYnJjbXVfYnByaW50ZihzdHJidWYsICJcbiIpOwotCWJyY211X2JwcmludGYoc3RyYnVmLCAicHViLnVwICVkIHB1Yi50eG9mZiAlZCBwdWIuYnVzc3RhdGUgJWRcbiIsCi0JCSAgICBkcnZyLT51cCwgZHJ2ci0+dHhvZmYsIGRydnItPmJ1c3N0YXRlKTsKLQlicmNtdV9icHJpbnRmKHN0cmJ1ZiwgInB1Yi5oZHJsZW4gJWQgcHViLm1heGN0bCAlZCBwdWIucnhzeiAlZFxuIiwKLQkJICAgIGRydnItPmhkcmxlbiwgZHJ2ci0+bWF4Y3RsLCBkcnZyLT5yeHN6KTsKLQlicmNtdV9icHJpbnRmKHN0cmJ1ZiwgInB1Yi5pc3dsICVkIHB1Yi5kcnZfdmVyc2lvbiAlbGQgcHViLm1hYyAlcE1cbiIsCi0JCSAgICBkcnZyLT5pc3dsLCBkcnZyLT5kcnZfdmVyc2lvbiwgJmRydnItPm1hYyk7Ci0JYnJjbXVfYnByaW50ZihzdHJidWYsICJwdWIuYmNtZXJyb3IgJWQgdGlja2NudCAlZFxuIiwgZHJ2ci0+YmNtZXJyb3IsCi0JCSAgICBkcnZyLT50aWNrY250KTsKLQotCWJyY211X2JwcmludGYoc3RyYnVmLCAiZG9uZ2xlIHN0YXRzOlxuIik7Ci0JYnJjbXVfYnByaW50ZihzdHJidWYsCi0JCSAgICAidHhfcGFja2V0cyAlbGQgdHhfYnl0ZXMgJWxkIHR4X2Vycm9ycyAlbGQgdHhfZHJvcHBlZCAlbGRcbiIsCi0JCSAgICBkcnZyLT5kc3RhdHMudHhfcGFja2V0cywgZHJ2ci0+ZHN0YXRzLnR4X2J5dGVzLAotCQkgICAgZHJ2ci0+ZHN0YXRzLnR4X2Vycm9ycywgZHJ2ci0+ZHN0YXRzLnR4X2Ryb3BwZWQpOwotCWJyY211X2JwcmludGYoc3RyYnVmLAotCQkgICAgInJ4X3BhY2tldHMgJWxkIHJ4X2J5dGVzICVsZCByeF9lcnJvcnMgJWxkIHJ4X2Ryb3BwZWQgJWxkXG4iLAotCQkgICAgZHJ2ci0+ZHN0YXRzLnJ4X3BhY2tldHMsIGRydnItPmRzdGF0cy5yeF9ieXRlcywKLQkJICAgIGRydnItPmRzdGF0cy5yeF9lcnJvcnMsIGRydnItPmRzdGF0cy5yeF9kcm9wcGVkKTsKLQlicmNtdV9icHJpbnRmKHN0cmJ1ZiwgIm11bHRpY2FzdCAlbGRcbiIsIGRydnItPmRzdGF0cy5tdWx0aWNhc3QpOwotCi0JYnJjbXVfYnByaW50ZihzdHJidWYsICJidXMgc3RhdHM6XG4iKTsKLQlicmNtdV9icHJpbnRmKHN0cmJ1ZiwgInR4X3BhY2tldHMgJWxkIHR4X211bHRpY2FzdCAlbGQgdHhfZXJyb3JzICVsZFxuIiwKLQkJICAgIGRydnItPnR4X3BhY2tldHMsIGRydnItPnR4X211bHRpY2FzdCwgZHJ2ci0+dHhfZXJyb3JzKTsKLQlicmNtdV9icHJpbnRmKHN0cmJ1ZiwgInR4X2N0bHBrdHMgJWxkIHR4X2N0bGVycnMgJWxkXG4iLAotCQkgICAgZHJ2ci0+dHhfY3RscGt0cywgZHJ2ci0+dHhfY3RsZXJycyk7Ci0JYnJjbXVfYnByaW50ZihzdHJidWYsICJyeF9wYWNrZXRzICVsZCByeF9tdWx0aWNhc3QgJWxkIHJ4X2Vycm9ycyAlbGRcbiIsCi0JCSAgICBkcnZyLT5yeF9wYWNrZXRzLCBkcnZyLT5yeF9tdWx0aWNhc3QsIGRydnItPnJ4X2Vycm9ycyk7Ci0JYnJjbXVfYnByaW50ZihzdHJidWYsCi0JCSAgICAicnhfY3RscGt0cyAlbGQgcnhfY3RsZXJycyAlbGQgcnhfZHJvcHBlZCAlbGQgcnhfZmx1c2hlZCAlbGRcbiIsCi0JCSAgICBkcnZyLT5yeF9jdGxwa3RzLCBkcnZyLT5yeF9jdGxlcnJzLCBkcnZyLT5yeF9kcm9wcGVkLAotCQkgICAgZHJ2ci0+cnhfZmx1c2hlZCk7Ci0JYnJjbXVfYnByaW50ZihzdHJidWYsCi0JCSAgICAicnhfcmVhZGFoZWFkX2NudCAlbGQgdHhfcmVhbGxvYyAlbGQgZmNfcGFja2V0cyAlbGRcbiIsCi0JCSAgICBkcnZyLT5yeF9yZWFkYWhlYWRfY250LCBkcnZyLT50eF9yZWFsbG9jLCBkcnZyLT5mY19wYWNrZXRzKTsKLQlicmNtdV9icHJpbnRmKHN0cmJ1ZiwgIndkX2RwY19zY2hlZCAlbGRcbiIsIGRydnItPndkX2RwY19zY2hlZCk7Ci0JYnJjbXVfYnByaW50ZihzdHJidWYsICJcbiIpOwotCi0JLyogQWRkIGFueSBwcm90IGluZm8gKi8KLQlicmNtZl9wcm90b19kdW1wKGRydnIsIHN0cmJ1Zik7Ci0JYnJjbXVfYnByaW50ZihzdHJidWYsICJcbiIpOwotCi0JLyogQWRkIGFueSBidXMgaW5mbyAqLwotCWJyY21mX3NkYnJjbV9idXNfZHVtcChkcnZyLCBzdHJidWYpOwotCi0JcmV0dXJuICFzdHJidWYtPnNpemUgPyAtRU9WRVJGTE9XIDogMDsKLX0KLQotc3RhdGljIGludAotYnJjbWZfY19kb2lvdmFyKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGNvbnN0IHN0cnVjdCBicmNtdV9pb3ZhciAqdmksCi0JCXUzMiBhY3Rpb25pZCwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqcGFyYW1zLCBpbnQgcGxlbiwKLQkJdm9pZCAqYXJnLCBpbnQgbGVuLCBpbnQgdmFsX3NpemUpCi17Ci0JaW50IGJjbWVycm9yID0gMDsKLQlzMzIgaW50X3ZhbCA9IDA7Ci0KLQlCUkNNRl9UUkFDRSgoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKLQotCWJjbWVycm9yID0gYnJjbXVfaW92YXJfbGVuY2hlY2sodmksIGFyZywgbGVuLCBJT1ZfSVNTRVQoYWN0aW9uaWQpKTsKLQlpZiAoYmNtZXJyb3IgIT0gMCkKLQkJZ290byBleGl0OwotCi0JaWYgKHBsZW4gPj0gKGludClzaXplb2YoaW50X3ZhbCkpCi0JCW1lbWNweSgmaW50X3ZhbCwgcGFyYW1zLCBzaXplb2YoaW50X3ZhbCkpOwotCi0Jc3dpdGNoIChhY3Rpb25pZCkgewotCWNhc2UgSU9WX0dWQUwoSU9WX1ZFUlNJT04pOgotCQkvKiBOZWVkIHRvIGhhdmUgY2hlY2tlZCBidWZmZXIgbGVuZ3RoICovCi0JCXN0cm5jcHkoKGNoYXIgKilhcmcsIGJyY21mX3ZlcnNpb24sIGxlbik7Ci0JCWJyZWFrOwotCi0JY2FzZSBJT1ZfR1ZBTChJT1ZfTVNHTEVWRUwpOgotCQlpbnRfdmFsID0gKHMzMikgYnJjbWZfbXNnX2xldmVsOwotCQltZW1jcHkoYXJnLCAmaW50X3ZhbCwgdmFsX3NpemUpOwotCQlicmVhazsKLQotCWNhc2UgSU9WX1NWQUwoSU9WX01TR0xFVkVMKToKLQkJYnJjbWZfbXNnX2xldmVsID0gaW50X3ZhbDsKLQkJYnJlYWs7Ci0KLQljYXNlIElPVl9HVkFMKElPVl9CQ01FUlJPUlNUUik6Ci0JCXN0cm5jcHkoKGNoYXIgKilhcmcsICJiY21fZXJyb3IiLAotCQkJQkNNRV9TVFJMRU4pOwotCQkoKGNoYXIgKilhcmcpW0JDTUVfU1RSTEVOIC0gMV0gPSAweDAwOwotCQlicmVhazsKLQotCWNhc2UgSU9WX0dWQUwoSU9WX0JDTUVSUk9SKToKLQkJaW50X3ZhbCA9IChzMzIpIGRydnItPmJjbWVycm9yOwotCQltZW1jcHkoYXJnLCAmaW50X3ZhbCwgdmFsX3NpemUpOwotCQlicmVhazsKLQotCWNhc2UgSU9WX0dWQUwoSU9WX0RVTVApOgotCQliY21lcnJvciA9IGJyY21mX2NfZHVtcChkcnZyLCBhcmcsIGxlbik7Ci0JCWJyZWFrOwotCi0JY2FzZSBJT1ZfU1ZBTChJT1ZfQ0xFQVJDT1VOVFMpOgotCQlkcnZyLT50eF9wYWNrZXRzID0gZHJ2ci0+cnhfcGFja2V0cyA9IDA7Ci0JCWRydnItPnR4X2Vycm9ycyA9IGRydnItPnJ4X2Vycm9ycyA9IDA7Ci0JCWRydnItPnR4X2N0bHBrdHMgPSBkcnZyLT5yeF9jdGxwa3RzID0gMDsKLQkJZHJ2ci0+dHhfY3RsZXJycyA9IGRydnItPnJ4X2N0bGVycnMgPSAwOwotCQlkcnZyLT5yeF9kcm9wcGVkID0gMDsKLQkJZHJ2ci0+cnhfcmVhZGFoZWFkX2NudCA9IDA7Ci0JCWRydnItPnR4X3JlYWxsb2MgPSAwOwotCQlkcnZyLT53ZF9kcGNfc2NoZWQgPSAwOwotCQltZW1zZXQoJmRydnItPmRzdGF0cywgMCwgc2l6ZW9mKGRydnItPmRzdGF0cykpOwotCQlicmNtZl9idXNfY2xlYXJjb3VudHMoZHJ2cik7Ci0JCWJyZWFrOwotCi0JY2FzZSBJT1ZfR1ZBTChJT1ZfSU9DVExUSU1FT1VUKTp7Ci0JCQlpbnRfdmFsID0gKHMzMikgYnJjbWZfb3NfZ2V0X2lvY3RsX3Jlc3BfdGltZW91dCgpOwotCQkJbWVtY3B5KGFyZywgJmludF92YWwsIHNpemVvZihpbnRfdmFsKSk7Ci0JCQlicmVhazsKLQkJfQotCi0JY2FzZSBJT1ZfU1ZBTChJT1ZfSU9DVExUSU1FT1VUKTp7Ci0JCQlpZiAoaW50X3ZhbCA8PSAwKQotCQkJCWJjbWVycm9yID0gLUVJTlZBTDsKLQkJCWVsc2UKLQkJCQlicmNtZl9vc19zZXRfaW9jdGxfcmVzcF90aW1lb3V0KCh1bnNpZ25lZCBpbnQpCi0JCQkJCQkJICAgICAgaW50X3ZhbCk7Ci0JCQlicmVhazsKLQkJfQotCi0JZGVmYXVsdDoKLQkJYmNtZXJyb3IgPSAtRU5PVFNVUFA7Ci0JCWJyZWFrOwotCX0KLQotZXhpdDoKLQlyZXR1cm4gYmNtZXJyb3I7Ci19Ci0KLWJvb2wgYnJjbWZfY19wcmVjX2VucShzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBzdHJ1Y3QgcGt0cSAqcSwKLQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnBrdCwgaW50IHByZWMpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnA7Ci0JaW50IGVwcmVjID0gLTE7CQkvKiBwcmVjZWRlbmNlIHRvIGV2aWN0IGZyb20gKi8KLQlib29sIGRpc2NhcmRfb2xkZXN0OwotCi0JLyogRmFzdCBjYXNlLCBwcmVjZWRlbmNlIHF1ZXVlIGlzIG5vdCBmdWxsIGFuZCB3ZSBhcmUgYWxzbyBub3QKLQkgKiBleGNlZWRpbmcgdG90YWwgcXVldWUgbGVuZ3RoCi0JICovCi0JaWYgKCFwa3RxX3BmdWxsKHEsIHByZWMpICYmICFwa3RxX2Z1bGwocSkpIHsKLQkJYnJjbXVfcGt0cV9wZW5xKHEsIHByZWMsIHBrdCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIERldGVybWluZSBwcmVjZWRlbmNlIGZyb20gd2hpY2ggdG8gZXZpY3QgcGFja2V0LCBpZiBhbnkgKi8KLQlpZiAocGt0cV9wZnVsbChxLCBwcmVjKSkKLQkJZXByZWMgPSBwcmVjOwotCWVsc2UgaWYgKHBrdHFfZnVsbChxKSkgewotCQlwID0gYnJjbXVfcGt0cV9wZWVrX3RhaWwocSwgJmVwcmVjKTsKLQkJaWYgKGVwcmVjID4gcHJlYykKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiBFdmljdCBpZiBuZWVkZWQgKi8KLQlpZiAoZXByZWMgPj0gMCkgewotCQkvKiBEZXRlY3QgcXVldWVpbmcgdG8gdW5jb25maWd1cmVkIHByZWNlZGVuY2UgKi8KLQkJZGlzY2FyZF9vbGRlc3QgPSBBQ19CSVRNQVBfVFNUKGRydnItPndtZV9kcCwgZXByZWMpOwotCQlpZiAoZXByZWMgPT0gcHJlYyAmJiAhZGlzY2FyZF9vbGRlc3QpCi0JCQlyZXR1cm4gZmFsc2U7CS8qIHJlZnVzZSBuZXdlciAoaW5jb21pbmcpIHBhY2tldCAqLwotCQkvKiBFdmljdCBwYWNrZXQgYWNjb3JkaW5nIHRvIGRpc2NhcmQgcG9saWN5ICovCi0JCXAgPSBkaXNjYXJkX29sZGVzdCA/IGJyY211X3BrdHFfcGRlcShxLCBlcHJlYykgOgotCQkJYnJjbXVfcGt0cV9wZGVxX3RhaWwocSwgZXByZWMpOwotCQlpZiAocCA9PSBOVUxMKSB7Ci0JCQlCUkNNRl9FUlJPUigoIiVzOiBicmNtdV9wa3RxX3BlbnEoKSBmYWlsZWQsIG9sZGVzdCAlZC4iLAotCQkJCSAgICAgX19mdW5jX18sIGRpc2NhcmRfb2xkZXN0KSk7Ci0JCX0KLQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihwKTsKLQl9Ci0KLQkvKiBFbnF1ZXVlICovCi0JcCA9IGJyY211X3BrdHFfcGVucShxLCBwcmVjLCBwa3QpOwotCWlmIChwID09IE5VTEwpIHsKLQkJQlJDTUZfRVJST1IoKCIlczogYnJjbXVfcGt0cV9wZW5xKCkgZmFpbGVkLiIsIF9fZnVuY19fKSk7Ci0JfQotCi0JcmV0dXJuIHAgIT0gTlVMTDsKLX0KLQotc3RhdGljIGludAotYnJjbWZfY19pb3Zhcl9vcChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBjb25zdCBjaGFyICpuYW1lLAotCSAgICAgdm9pZCAqcGFyYW1zLCBpbnQgcGxlbiwgdm9pZCAqYXJnLCBpbnQgbGVuLCBib29sIHNldCkKLXsKLQlpbnQgYmNtZXJyb3IgPSAwOwotCWludCB2YWxfc2l6ZTsKLQljb25zdCBzdHJ1Y3QgYnJjbXVfaW92YXIgKnZpID0gTlVMTDsKLQl1MzIgYWN0aW9uaWQ7Ci0KLQlCUkNNRl9UUkFDRSgoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKLQotCWlmIChuYW1lID09IE5VTEwgfHwgbGVuIDw9IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogU2V0IGRvZXMgbm90IHRha2UgcXVhbGlmaWVycyAqLwotCWlmIChzZXQgJiYgKHBhcmFtcyB8fCBwbGVuKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBHZXQgbXVzdCBoYXZlIHJldHVybiBzcGFjZTsqLwotCWlmICghc2V0ICYmICEoYXJnICYmIGxlbikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdmkgPSBicmNtdV9pb3Zhcl9sb29rdXAoYnJjbWZfaW92YXJzLCBuYW1lKTsKLQlpZiAodmkgPT0gTlVMTCkgewotCQliY21lcnJvciA9IC1FTk9UU1VQUDsKLQkJZ290byBleGl0OwotCX0KLQotCUJSQ01GX0NUTCgoIiVzOiAlcyAlcywgbGVuICVkIHBsZW4gJWRcbiIsIF9fZnVuY19fLAotCQkgICBuYW1lLCAoc2V0ID8gInNldCIgOiAiZ2V0IiksIGxlbiwgcGxlbikpOwotCi0JLyogc2V0IHVwICdwYXJhbXMnIHBvaW50ZXIgaW4gY2FzZSB0aGlzIGlzIGEgc2V0IGNvbW1hbmQgc28gdGhhdAotCSAqIHRoZSBjb252ZW5pZW5jZSBpbnQgYW5kIGJvb2wgY29kZSBjYW4gYmUgY29tbW9uIHRvIHNldCBhbmQgZ2V0Ci0JICovCi0JaWYgKHBhcmFtcyA9PSBOVUxMKSB7Ci0JCXBhcmFtcyA9IGFyZzsKLQkJcGxlbiA9IGxlbjsKLQl9Ci0KLQlpZiAodmktPnR5cGUgPT0gSU9WVF9WT0lEKQotCQl2YWxfc2l6ZSA9IDA7Ci0JZWxzZSBpZiAodmktPnR5cGUgPT0gSU9WVF9CVUZGRVIpCi0JCXZhbF9zaXplID0gbGVuOwotCWVsc2UKLQkJLyogYWxsIG90aGVyIHR5cGVzIGFyZSBpbnRlZ2VyIHNpemVkICovCi0JCXZhbF9zaXplID0gc2l6ZW9mKGludCk7Ci0KLQlhY3Rpb25pZCA9IHNldCA/IElPVl9TVkFMKHZpLT52YXJpZCkgOiBJT1ZfR1ZBTCh2aS0+dmFyaWQpOwotCWJjbWVycm9yID0KLQkgICAgYnJjbWZfY19kb2lvdmFyKGRydnIsIHZpLCBhY3Rpb25pZCwgbmFtZSwgcGFyYW1zLCBwbGVuLCBhcmcsIGxlbiwKLQkJCXZhbF9zaXplKTsKLQotZXhpdDoKLQlyZXR1cm4gYmNtZXJyb3I7Ci19Ci0KLWludCBicmNtZl9jX2lvY3RsKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIHN0cnVjdCBicmNtZl9jX2lvY3RsICppb2MsIHZvaWQgKmJ1ZiwKLQkJICB1aW50IGJ1ZmxlbikKLXsKLQlpbnQgYmNtZXJyb3IgPSAwOwotCi0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzd2l0Y2ggKGlvYy0+Y21kKSB7Ci0JY2FzZSBCUkNNRl9HRVRfTUFHSUM6Ci0JCWlmIChidWZsZW4gPCBzaXplb2YoaW50KSkKLQkJCWJjbWVycm9yID0gLUVPVkVSRkxPVzsKLQkJZWxzZQotCQkJKihpbnQgKilidWYgPSBCUkNNRl9JT0NUTF9NQUdJQzsKLQkJYnJlYWs7Ci0KLQljYXNlIEJSQ01GX0dFVF9WRVJTSU9OOgotCQlpZiAoYnVmbGVuIDwgc2l6ZW9mKGludCkpCi0JCQliY21lcnJvciA9IC1FT1ZFUkZMT1c7Ci0JCWVsc2UKLQkJCSooaW50ICopYnVmID0gQlJDTUZfSU9DVExfVkVSU0lPTjsKLQkJYnJlYWs7Ci0KLQljYXNlIEJSQ01GX0dFVF9WQVI6Ci0JY2FzZSBCUkNNRl9TRVRfVkFSOnsKLQkJCWNoYXIgKmFyZzsKLQkJCXVpbnQgYXJnbGVuOwotCi0JCQkvKiBzY2FuIHBhc3QgdGhlIG5hbWUgdG8gYW55IGFyZ3VtZW50cyAqLwotCQkJZm9yIChhcmcgPSBidWYsIGFyZ2xlbiA9IGJ1ZmxlbjsgKmFyZyAmJiBhcmdsZW47Ci0JCQkgICAgIGFyZysrLCBhcmdsZW4tLSkKLQkJCQk7Ci0KLQkJCWlmICgqYXJnKSB7Ci0JCQkJYmNtZXJyb3IgPSAtRU9WRVJGTE9XOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBhY2NvdW50IGZvciB0aGUgTlVMIHRlcm1pbmF0b3IgKi8KLQkJCWFyZysrLCBhcmdsZW4tLTsKLQotCQkJLyogY2FsbCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBhcmd1bWVudHMgKi8KLQkJCWlmIChpb2MtPmNtZCA9PSBCUkNNRl9HRVRfVkFSKQotCQkJCWJjbWVycm9yID0gYnJjbWZfY19pb3Zhcl9vcChkcnZyLCBidWYsIGFyZywKLQkJCQkJCWFyZ2xlbiwgYnVmLCBidWZsZW4sIElPVl9HRVQpOwotCQkJZWxzZQotCQkJCWJjbWVycm9yID0KLQkJCQkgICAgYnJjbWZfY19pb3Zhcl9vcChkcnZyLCBidWYsIE5VTEwsIDAsIGFyZywKLQkJCQkJCSAgICAgYXJnbGVuLCBJT1ZfU0VUKTsKLQkJCWlmIChiY21lcnJvciAhPSAtRU5PVFNVUFApCi0JCQkJYnJlYWs7Ci0KLQkJCS8qIGlmIHN0aWxsIG5vdCBmb3VuZCwgdHJ5IGJ1cyBtb2R1bGUgKi8KLQkJCWlmIChpb2MtPmNtZCA9PSBCUkNNRl9HRVRfVkFSKQotCQkJCWJjbWVycm9yID0gYnJjbWZfc2RicmNtX2J1c19pb3Zhcl9vcChkcnZyLAotCQkJCQkJYnVmLCBhcmcsIGFyZ2xlbiwgYnVmLCBidWZsZW4sCi0JCQkJCQlJT1ZfR0VUKTsKLQkJCWVsc2UKLQkJCQliY21lcnJvciA9IGJyY21mX3NkYnJjbV9idXNfaW92YXJfb3AoZHJ2ciwKLQkJCQkJCWJ1ZiwgTlVMTCwgMCwgYXJnLCBhcmdsZW4sCi0JCQkJCQlJT1ZfU0VUKTsKLQotCQkJYnJlYWs7Ci0JCX0KLQotCWRlZmF1bHQ6Ci0JCWJjbWVycm9yID0gLUVOT1RTVVBQOwotCX0KLQotCXJldHVybiBiY21lcnJvcjsKLX0KLQotI2lmZGVmIFNIT1dfRVZFTlRTCi1zdGF0aWMgdm9pZAotYnJjbWZfY19zaG93X2hvc3RfZXZlbnQoc3RydWN0IGJyY21mX2V2ZW50X21zZyAqZXZlbnQsIHZvaWQgKmV2ZW50X2RhdGEpCi17Ci0JdWludCBpLCBzdGF0dXMsIHJlYXNvbjsKLQlib29sIGdyb3VwID0gZmFsc2UsIGZsdXNoX3R4cSA9IGZhbHNlLCBsaW5rID0gZmFsc2U7Ci0JY2hhciAqYXV0aF9zdHIsICpldmVudF9uYW1lOwotCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKLQljaGFyIGVycl9tc2dbMjU2XSwgZWFidWZbRVRIRVJfQUREUl9TVFJfTEVOXTsKLQlzdGF0aWMgc3RydWN0IHsKLQkJdWludCBldmVudDsKLQkJY2hhciAqZXZlbnRfbmFtZTsKLQl9IGV2ZW50X25hbWVzW10gPSB7Ci0JCXsKLQkJQlJDTUZfRV9TRVRfU1NJRCwgIlNFVF9TU0lEIn0sIHsKLQkJQlJDTUZfRV9KT0lOLCAiSk9JTiJ9LCB7Ci0JCUJSQ01GX0VfU1RBUlQsICJTVEFSVCJ9LCB7Ci0JCUJSQ01GX0VfQVVUSCwgIkFVVEgifSwgewotCQlCUkNNRl9FX0FVVEhfSU5ELCAiQVVUSF9JTkQifSwgewotCQlCUkNNRl9FX0RFQVVUSCwgIkRFQVVUSCJ9LCB7Ci0JCUJSQ01GX0VfREVBVVRIX0lORCwgIkRFQVVUSF9JTkQifSwgewotCQlCUkNNRl9FX0FTU09DLCAiQVNTT0MifSwgewotCQlCUkNNRl9FX0FTU09DX0lORCwgIkFTU09DX0lORCJ9LCB7Ci0JCUJSQ01GX0VfUkVBU1NPQywgIlJFQVNTT0MifSwgewotCQlCUkNNRl9FX1JFQVNTT0NfSU5ELCAiUkVBU1NPQ19JTkQifSwgewotCQlCUkNNRl9FX0RJU0FTU09DLCAiRElTQVNTT0MifSwgewotCQlCUkNNRl9FX0RJU0FTU09DX0lORCwgIkRJU0FTU09DX0lORCJ9LCB7Ci0JCUJSQ01GX0VfUVVJRVRfU1RBUlQsICJTVEFSVF9RVUlFVCJ9LCB7Ci0JCUJSQ01GX0VfUVVJRVRfRU5ELCAiRU5EX1FVSUVUIn0sIHsKLQkJQlJDTUZfRV9CRUFDT05fUlgsICJCRUFDT05fUlgifSwgewotCQlCUkNNRl9FX0xJTkssICJMSU5LIn0sIHsKLQkJQlJDTUZfRV9NSUNfRVJST1IsICJNSUNfRVJST1IifSwgewotCQlCUkNNRl9FX05ESVNfTElOSywgIk5ESVNfTElOSyJ9LCB7Ci0JCUJSQ01GX0VfUk9BTSwgIlJPQU0ifSwgewotCQlCUkNNRl9FX1RYRkFJTCwgIlRYRkFJTCJ9LCB7Ci0JCUJSQ01GX0VfUE1LSURfQ0FDSEUsICJQTUtJRF9DQUNIRSJ9LCB7Ci0JCUJSQ01GX0VfUkVUUk9HUkFERV9UU0YsICJSRVRST0dSQURFX1RTRiJ9LCB7Ci0JCUJSQ01GX0VfUFJVTkUsICJQUlVORSJ9LCB7Ci0JCUJSQ01GX0VfQVVUT0FVVEgsICJBVVRPQVVUSCJ9LCB7Ci0JCUJSQ01GX0VfRUFQT0xfTVNHLCAiRUFQT0xfTVNHIn0sIHsKLQkJQlJDTUZfRV9TQ0FOX0NPTVBMRVRFLCAiU0NBTl9DT01QTEVURSJ9LCB7Ci0JCUJSQ01GX0VfQUREVFNfSU5ELCAiQUREVFNfSU5EIn0sIHsKLQkJQlJDTUZfRV9ERUxUU19JTkQsICJERUxUU19JTkQifSwgewotCQlCUkNNRl9FX0JDTlNFTlRfSU5ELCAiQkNOU0VOVF9JTkQifSwgewotCQlCUkNNRl9FX0JDTlJYX01TRywgIkJDTlJYX01TRyJ9LCB7Ci0JCUJSQ01GX0VfQkNOTE9TVF9NU0csICJCQ05MT1NUX01TRyJ9LCB7Ci0JCUJSQ01GX0VfUk9BTV9QUkVQLCAiUk9BTV9QUkVQIn0sIHsKLQkJQlJDTUZfRV9QRk5fTkVUX0ZPVU5ELCAiUE5PX05FVF9GT1VORCJ9LCB7Ci0JCUJSQ01GX0VfUEZOX05FVF9MT1NULCAiUE5PX05FVF9MT1NUIn0sIHsKLQkJQlJDTUZfRV9SRVNFVF9DT01QTEVURSwgIlJFU0VUX0NPTVBMRVRFIn0sIHsKLQkJQlJDTUZfRV9KT0lOX1NUQVJULCAiSk9JTl9TVEFSVCJ9LCB7Ci0JCUJSQ01GX0VfUk9BTV9TVEFSVCwgIlJPQU1fU1RBUlQifSwgewotCQlCUkNNRl9FX0FTU09DX1NUQVJULCAiQVNTT0NfU1RBUlQifSwgewotCQlCUkNNRl9FX0lCU1NfQVNTT0MsICJJQlNTX0FTU09DIn0sIHsKLQkJQlJDTUZfRV9SQURJTywgIlJBRElPIn0sIHsKLQkJQlJDTUZfRV9QU01fV0FUQ0hET0csICJQU01fV0FUQ0hET0cifSwgewotCQlCUkNNRl9FX1BST0JSRVFfTVNHLCAiUFJPQlJFUV9NU0cifSwgewotCQlCUkNNRl9FX1NDQU5fQ09ORklSTV9JTkQsICJTQ0FOX0NPTkZJUk1fSU5EIn0sIHsKLQkJQlJDTUZfRV9QU0tfU1VQLCAiUFNLX1NVUCJ9LCB7Ci0JCUJSQ01GX0VfQ09VTlRSWV9DT0RFX0NIQU5HRUQsICJDT1VOVFJZX0NPREVfQ0hBTkdFRCJ9LCB7Ci0JCUJSQ01GX0VfRVhDRUVERURfTUVESVVNX1RJTUUsICJFWENFRURFRF9NRURJVU1fVElNRSJ9LCB7Ci0JCUJSQ01GX0VfSUNWX0VSUk9SLCAiSUNWX0VSUk9SIn0sIHsKLQkJQlJDTUZfRV9VTklDQVNUX0RFQ09ERV9FUlJPUiwgIlVOSUNBU1RfREVDT0RFX0VSUk9SIn0sIHsKLQkJQlJDTUZfRV9NVUxUSUNBU1RfREVDT0RFX0VSUk9SLCAiTVVMVElDQVNUX0RFQ09ERV9FUlJPUiJ9LCB7Ci0JCUJSQ01GX0VfVFJBQ0UsICJUUkFDRSJ9LCB7Ci0JCUJSQ01GX0VfQUNUSU9OX0ZSQU1FLCAiQUNUSU9OIEZSQU1FIn0sIHsKLQkJQlJDTUZfRV9BQ1RJT05fRlJBTUVfQ09NUExFVEUsICJBQ1RJT04gRlJBTUUgVFggQ09NUExFVEUifSwgewotCQlCUkNNRl9FX0lGLCAiSUYifSwgewotCQlCUkNNRl9FX1JTU0ksICJSU1NJIn0sIHsKLQkJQlJDTUZfRV9QRk5fU0NBTl9DT01QTEVURSwgIlNDQU5fQ09NUExFVEUifQotCX07Ci0JdWludCBldmVudF90eXBlLCBmbGFncywgYXV0aF90eXBlLCBkYXRhbGVuOwotCWV2ZW50X3R5cGUgPSBiZTMyX3RvX2NwdShldmVudC0+ZXZlbnRfdHlwZSk7Ci0JZmxhZ3MgPSBiZTE2X3RvX2NwdShldmVudC0+ZmxhZ3MpOwotCXN0YXR1cyA9IGJlMzJfdG9fY3B1KGV2ZW50LT5zdGF0dXMpOwotCXJlYXNvbiA9IGJlMzJfdG9fY3B1KGV2ZW50LT5yZWFzb24pOwotCWF1dGhfdHlwZSA9IGJlMzJfdG9fY3B1KGV2ZW50LT5hdXRoX3R5cGUpOwotCWRhdGFsZW4gPSBiZTMyX3RvX2NwdShldmVudC0+ZGF0YWxlbik7Ci0JLyogZGVidWcgZHVtcCBvZiBldmVudCBtZXNzYWdlcyAqLwotCXNwcmludGYoZWFidWYsICIlcE0iLCBldmVudC0+YWRkcik7Ci0KLQlldmVudF9uYW1lID0gIlVOS05PV04iOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGV2ZW50X25hbWVzKTsgaSsrKSB7Ci0JCWlmIChldmVudF9uYW1lc1tpXS5ldmVudCA9PSBldmVudF90eXBlKQotCQkJZXZlbnRfbmFtZSA9IGV2ZW50X25hbWVzW2ldLmV2ZW50X25hbWU7Ci0JfQotCi0JQlJDTUZfRVZFTlQoKCJFVkVOVDogJXMsIGV2ZW50IElEID0gJWRcbiIsIGV2ZW50X25hbWUsIGV2ZW50X3R5cGUpKTsKLQlCUkNNRl9FVkVOVCgoImZsYWdzIDB4JTA0eCwgc3RhdHVzICVkLCByZWFzb24gJWQsIGF1dGhfdHlwZSAlZCIKLQkJICAgICAiIE1BQyAlc1xuIiwgZmxhZ3MsIHN0YXR1cywgcmVhc29uLCBhdXRoX3R5cGUsIGVhYnVmKSk7Ci0KLQlpZiAoZmxhZ3MgJiBCUkNNRl9FVkVOVF9NU0dfTElOSykKLQkJbGluayA9IHRydWU7Ci0JaWYgKGZsYWdzICYgQlJDTUZfRVZFTlRfTVNHX0dST1VQKQotCQlncm91cCA9IHRydWU7Ci0JaWYgKGZsYWdzICYgQlJDTUZfRVZFTlRfTVNHX0ZMVVNIVFhRKQotCQlmbHVzaF90eHEgPSB0cnVlOwotCi0Jc3dpdGNoIChldmVudF90eXBlKSB7Ci0JY2FzZSBCUkNNRl9FX1NUQVJUOgotCWNhc2UgQlJDTUZfRV9ERUFVVEg6Ci0JY2FzZSBCUkNNRl9FX0RJU0FTU09DOgotCQlCUkNNRl9FVkVOVCgoIk1BQ0VWRU5UOiAlcywgTUFDICVzXG4iLCBldmVudF9uYW1lLCBlYWJ1ZikpOwotCQlicmVhazsKLQotCWNhc2UgQlJDTUZfRV9BU1NPQ19JTkQ6Ci0JY2FzZSBCUkNNRl9FX1JFQVNTT0NfSU5EOgotCQlCUkNNRl9FVkVOVCgoIk1BQ0VWRU5UOiAlcywgTUFDICVzXG4iLCBldmVudF9uYW1lLCBlYWJ1ZikpOwotCQlicmVhazsKLQotCWNhc2UgQlJDTUZfRV9BU1NPQzoKLQljYXNlIEJSQ01GX0VfUkVBU1NPQzoKLQkJaWYgKHN0YXR1cyA9PSBCUkNNRl9FX1NUQVRVU19TVUNDRVNTKSB7Ci0JCQlCUkNNRl9FVkVOVCgoIk1BQ0VWRU5UOiAlcywgTUFDICVzLCBTVUNDRVNTXG4iLAotCQkJCSAgICAgZXZlbnRfbmFtZSwgZWFidWYpKTsKLQkJfSBlbHNlIGlmIChzdGF0dXMgPT0gQlJDTUZfRV9TVEFUVVNfVElNRU9VVCkgewotCQkJQlJDTUZfRVZFTlQoKCJNQUNFVkVOVDogJXMsIE1BQyAlcywgVElNRU9VVFxuIiwKLQkJCQkgICAgIGV2ZW50X25hbWUsIGVhYnVmKSk7Ci0JCX0gZWxzZSBpZiAoc3RhdHVzID09IEJSQ01GX0VfU1RBVFVTX0ZBSUwpIHsKLQkJCUJSQ01GX0VWRU5UKCgiTUFDRVZFTlQ6ICVzLCBNQUMgJXMsIEZBSUxVUkUsIgotCQkJCSAgICAgIiByZWFzb24gJWRcbiIsIGV2ZW50X25hbWUsIGVhYnVmLAotCQkJCSAgICAgKGludClyZWFzb24pKTsKLQkJfSBlbHNlIHsKLQkJCUJSQ01GX0VWRU5UKCgiTUFDRVZFTlQ6ICVzLCBNQUMgJXMsIHVuZXhwZWN0ZWQgc3RhdHVzICIKLQkJCQkgICAgICIlZFxuIiwgZXZlbnRfbmFtZSwgZWFidWYsIChpbnQpc3RhdHVzKSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEJSQ01GX0VfREVBVVRIX0lORDoKLQljYXNlIEJSQ01GX0VfRElTQVNTT0NfSU5EOgotCQlCUkNNRl9FVkVOVCgoIk1BQ0VWRU5UOiAlcywgTUFDICVzLCByZWFzb24gJWRcbiIsIGV2ZW50X25hbWUsCi0JCQkgICAgIGVhYnVmLCAoaW50KXJlYXNvbikpOwotCQlicmVhazsKLQotCWNhc2UgQlJDTUZfRV9BVVRIOgotCWNhc2UgQlJDTUZfRV9BVVRIX0lORDoKLQkJaWYgKGF1dGhfdHlwZSA9PSBXTEFOX0FVVEhfT1BFTikKLQkJCWF1dGhfc3RyID0gIk9wZW4gU3lzdGVtIjsKLQkJZWxzZSBpZiAoYXV0aF90eXBlID09IFdMQU5fQVVUSF9TSEFSRURfS0VZKQotCQkJYXV0aF9zdHIgPSAiU2hhcmVkIEtleSI7Ci0JCWVsc2UgewotCQkJc3ByaW50ZihlcnJfbXNnLCAiQVVUSCB1bmtub3duOiAlZCIsIChpbnQpYXV0aF90eXBlKTsKLQkJCWF1dGhfc3RyID0gZXJyX21zZzsKLQkJfQotCQlpZiAoZXZlbnRfdHlwZSA9PSBCUkNNRl9FX0FVVEhfSU5EKSB7Ci0JCQlCUkNNRl9FVkVOVCgoIk1BQ0VWRU5UOiAlcywgTUFDICVzLCAlc1xuIiwgZXZlbnRfbmFtZSwKLQkJCQkgICAgIGVhYnVmLCBhdXRoX3N0cikpOwotCQl9IGVsc2UgaWYgKHN0YXR1cyA9PSBCUkNNRl9FX1NUQVRVU19TVUNDRVNTKSB7Ci0JCQlCUkNNRl9FVkVOVCgoIk1BQ0VWRU5UOiAlcywgTUFDICVzLCAlcywgU1VDQ0VTU1xuIiwKLQkJCQkgICAgIGV2ZW50X25hbWUsIGVhYnVmLCBhdXRoX3N0cikpOwotCQl9IGVsc2UgaWYgKHN0YXR1cyA9PSBCUkNNRl9FX1NUQVRVU19USU1FT1VUKSB7Ci0JCQlCUkNNRl9FVkVOVCgoIk1BQ0VWRU5UOiAlcywgTUFDICVzLCAlcywgVElNRU9VVFxuIiwKLQkJCQkgICAgIGV2ZW50X25hbWUsIGVhYnVmLCBhdXRoX3N0cikpOwotCQl9IGVsc2UgaWYgKHN0YXR1cyA9PSBCUkNNRl9FX1NUQVRVU19GQUlMKSB7Ci0JCQlCUkNNRl9FVkVOVCgoIk1BQ0VWRU5UOiAlcywgTUFDICVzLCAlcywgRkFJTFVSRSwgIgotCQkJCSAgICAgInJlYXNvbiAlZFxuIiwKLQkJCQkgICAgIGV2ZW50X25hbWUsIGVhYnVmLCBhdXRoX3N0ciwgKGludClyZWFzb24pKTsKLQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBCUkNNRl9FX0pPSU46Ci0JY2FzZSBCUkNNRl9FX1JPQU06Ci0JY2FzZSBCUkNNRl9FX1NFVF9TU0lEOgotCQlpZiAoc3RhdHVzID09IEJSQ01GX0VfU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCUJSQ01GX0VWRU5UKCgiTUFDRVZFTlQ6ICVzLCBNQUMgJXNcbiIsIGV2ZW50X25hbWUsCi0JCQkJICAgICBlYWJ1ZikpOwotCQl9IGVsc2UgaWYgKHN0YXR1cyA9PSBCUkNNRl9FX1NUQVRVU19GQUlMKSB7Ci0JCQlCUkNNRl9FVkVOVCgoIk1BQ0VWRU5UOiAlcywgZmFpbGVkXG4iLCBldmVudF9uYW1lKSk7Ci0JCX0gZWxzZSBpZiAoc3RhdHVzID09IEJSQ01GX0VfU1RBVFVTX05PX05FVFdPUktTKSB7Ci0JCQlCUkNNRl9FVkVOVCgoIk1BQ0VWRU5UOiAlcywgbm8gbmV0d29ya3MgZm91bmRcbiIsCi0JCQkJICAgICBldmVudF9uYW1lKSk7Ci0JCX0gZWxzZSB7Ci0JCQlCUkNNRl9FVkVOVCgoIk1BQ0VWRU5UOiAlcywgdW5leHBlY3RlZCBzdGF0dXMgJWRcbiIsCi0JCQkJICAgICBldmVudF9uYW1lLCAoaW50KXN0YXR1cykpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBCUkNNRl9FX0JFQUNPTl9SWDoKLQkJaWYgKHN0YXR1cyA9PSBCUkNNRl9FX1NUQVRVU19TVUNDRVNTKSB7Ci0JCQlCUkNNRl9FVkVOVCgoIk1BQ0VWRU5UOiAlcywgU1VDQ0VTU1xuIiwgZXZlbnRfbmFtZSkpOwotCQl9IGVsc2UgaWYgKHN0YXR1cyA9PSBCUkNNRl9FX1NUQVRVU19GQUlMKSB7Ci0JCQlCUkNNRl9FVkVOVCgoIk1BQ0VWRU5UOiAlcywgRkFJTFxuIiwgZXZlbnRfbmFtZSkpOwotCQl9IGVsc2UgewotCQkJQlJDTUZfRVZFTlQoKCJNQUNFVkVOVDogJXMsIHN0YXR1cyAlZFxuIiwgZXZlbnRfbmFtZSwKLQkJCQkgICAgIHN0YXR1cykpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBCUkNNRl9FX0xJTks6Ci0JCUJSQ01GX0VWRU5UKCgiTUFDRVZFTlQ6ICVzICVzXG4iLCBldmVudF9uYW1lLAotCQkJICAgICBsaW5rID8gIlVQIiA6ICJET1dOIikpOwotCQlicmVhazsKLQotCWNhc2UgQlJDTUZfRV9NSUNfRVJST1I6Ci0JCUJSQ01GX0VWRU5UKCgiTUFDRVZFTlQ6ICVzLCBNQUMgJXMsIEdyb3VwICVkLCBGbHVzaCAlZFxuIiwKLQkJCSAgICAgZXZlbnRfbmFtZSwgZWFidWYsIGdyb3VwLCBmbHVzaF90eHEpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEJSQ01GX0VfSUNWX0VSUk9SOgotCWNhc2UgQlJDTUZfRV9VTklDQVNUX0RFQ09ERV9FUlJPUjoKLQljYXNlIEJSQ01GX0VfTVVMVElDQVNUX0RFQ09ERV9FUlJPUjoKLQkJQlJDTUZfRVZFTlQoKCJNQUNFVkVOVDogJXMsIE1BQyAlc1xuIiwgZXZlbnRfbmFtZSwgZWFidWYpKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEJSQ01GX0VfVFhGQUlMOgotCQlCUkNNRl9FVkVOVCgoIk1BQ0VWRU5UOiAlcywgUkEgJXNcbiIsIGV2ZW50X25hbWUsIGVhYnVmKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBCUkNNRl9FX1NDQU5fQ09NUExFVEU6Ci0JY2FzZSBCUkNNRl9FX1BNS0lEX0NBQ0hFOgotCQlCUkNNRl9FVkVOVCgoIk1BQ0VWRU5UOiAlc1xuIiwgZXZlbnRfbmFtZSkpOwotCQlicmVhazsKLQotCWNhc2UgQlJDTUZfRV9QRk5fTkVUX0ZPVU5EOgotCWNhc2UgQlJDTUZfRV9QRk5fTkVUX0xPU1Q6Ci0JY2FzZSBCUkNNRl9FX1BGTl9TQ0FOX0NPTVBMRVRFOgotCQlCUkNNRl9FVkVOVCgoIlBOT0VWRU5UOiAlc1xuIiwgZXZlbnRfbmFtZSkpOwotCQlicmVhazsKLQotCWNhc2UgQlJDTUZfRV9QU0tfU1VQOgotCWNhc2UgQlJDTUZfRV9QUlVORToKLQkJQlJDTUZfRVZFTlQoKCJNQUNFVkVOVDogJXMsIHN0YXR1cyAlZCwgcmVhc29uICVkXG4iLAotCQkJICAgZXZlbnRfbmFtZSwgKGludClzdGF0dXMsIChpbnQpcmVhc29uKSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBCUkNNRl9FX1RSQUNFOgotCQl7Ci0JCQlzdGF0aWMgdTMyIHNlcW51bV9wcmV2OwotCQkJc3RydWN0IG1zZ3RyYWNlX2hkciBoZHI7Ci0JCQl1MzIgbmJsb3N0OwotCQkJY2hhciAqcywgKnA7Ci0KLQkJCWJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGV2ZW50X2RhdGE7Ci0JCQltZW1jcHkoJmhkciwgYnVmLCBzaXplb2Yoc3RydWN0IG1zZ3RyYWNlX2hkcikpOwotCi0JCQlpZiAoaGRyLnZlcnNpb24gIT0gTVNHVFJBQ0VfVkVSU0lPTikgewotCQkJCUJSQ01GX0VSUk9SKAotCQkJCSAgICAoIlxuTUFDRVZFTlQ6ICVzIFt1bnN1cHBvcnRlZCB2ZXJzaW9uIC0tPiAiCi0JCQkJICAgICAiYnJjbWYgdmVyc2lvbjolZCBkb25nbGUgdmVyc2lvbjolZF1cbiIsCi0JCQkJICAgICBldmVudF9uYW1lLCBNU0dUUkFDRV9WRVJTSU9OLCBoZHIudmVyc2lvbikKLQkJCQkpOwotCQkJCS8qIFJlc2V0IGRhdGFsZW4gdG8gYXZvaWQgZGlzcGxheSBiZWxvdyAqLwotCQkJCWRhdGFsZW4gPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBUaGVyZSBhcmUgMiBieXRlcyBhdmFpbGFibGUgYXQgdGhlIGVuZCBvZiBkYXRhICovCi0JCQkqKGJ1ZiArIHNpemVvZihzdHJ1Y3QgbXNndHJhY2VfaGRyKQotCQkJCSArIGJlMTZfdG9fY3B1KGhkci5sZW4pKSA9ICdcMCc7Ci0KLQkJCWlmIChiZTMyX3RvX2NwdShoZHIuZGlzY2FyZGVkX2J5dGVzKQotCQkJICAgIHx8IGJlMzJfdG9fY3B1KGhkci5kaXNjYXJkZWRfcHJpbnRmKSkgewotCQkJCUJSQ01GX0VSUk9SKAotCQkJCSAgICAoIlxuV0xDX0VfVFJBQ0U6IFtEaXNjYXJkZWQgdHJhY2VzIGluIGRvbmdsZSAtLT4iCi0JCQkJICAgICAiZGlzY2FyZGVkX2J5dGVzICVkIGRpc2NhcmRlZF9wcmludGYgJWRdXG4iLAotCQkJCSAgICAgYmUzMl90b19jcHUoaGRyLmRpc2NhcmRlZF9ieXRlcyksCi0JCQkJICAgICBiZTMyX3RvX2NwdShoZHIuZGlzY2FyZGVkX3ByaW50ZikpKTsKLQkJCX0KLQotCQkJbmJsb3N0ID0gYmUzMl90b19jcHUoaGRyLnNlcW51bSkgLSBzZXFudW1fcHJldiAtIDE7Ci0JCQlpZiAobmJsb3N0ID4gMCkgewotCQkJCUJSQ01GX0VSUk9SKAotCQkJCSAgICAoIlxuV0xDX0VfVFJBQ0U6IFtFdmVudCBsb3N0IC0tPiBzZXFudW0gJWQgbmJsb3N0ICVkXG4iLAotCQkJCSAgICAgYmUzMl90b19jcHUoaGRyLnNlcW51bSksIG5ibG9zdCkpOwotCQkJfQotCQkJc2VxbnVtX3ByZXYgPSBiZTMyX3RvX2NwdShoZHIuc2VxbnVtKTsKLQotCQkJLyogRGlzcGxheSB0aGUgdHJhY2UgYnVmZmVyLiBBZHZhbmNlIGZyb20gXG4gdG8gXG4gdG8KLQkJCSAqIGF2b2lkIGRpc3BsYXkgYmlnCi0JCQkgKiBwcmludGYgKGlzc3VlIHdpdGggTGludXggcHJpbnRrICkKLQkJCSAqLwotCQkJcCA9IChjaGFyICopJmJ1ZltzaXplb2Yoc3RydWN0IG1zZ3RyYWNlX2hkcildOwotCQkJd2hpbGUgKChzID0gc3Ryc3RyKHAsICJcbiIpKSAhPSBOVUxMKSB7Ci0JCQkJKnMgPSAnXDAnOwotCQkJCXByaW50ayhLRVJOX0RFQlVHIiVzXG4iLCBwKTsKLQkJCQlwID0gcyArIDE7Ci0JCQl9Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIHApOwotCi0JCQkvKiBSZXNldCBkYXRhbGVuIHRvIGF2b2lkIGRpc3BsYXkgYmVsb3cgKi8KLQkJCWRhdGFsZW4gPSAwOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBCUkNNRl9FX1JTU0k6Ci0JCUJSQ01GX0VWRU5UKCgiTUFDRVZFTlQ6ICVzICVkXG4iLCBldmVudF9uYW1lLAotCQkJICAgICBiZTMyX3RvX2NwdSgqKChpbnQgKilldmVudF9kYXRhKSkpKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlCUkNNRl9FVkVOVCgoIk1BQ0VWRU5UOiAlcyAlZCwgTUFDICVzLCBzdGF0dXMgJWQsIHJlYXNvbiAlZCwgIgotCQkJICAgICAiYXV0aCAlZFxuIiwgZXZlbnRfbmFtZSwgZXZlbnRfdHlwZSwgZWFidWYsCi0JCQkgICAgIChpbnQpc3RhdHVzLCAoaW50KXJlYXNvbiwgKGludClhdXRoX3R5cGUpKTsKLQkJYnJlYWs7Ci0JfQotCi0JLyogc2hvdyBhbnkgYXBwZW5kZWQgZGF0YSAqLwotCWlmIChkYXRhbGVuKSB7Ci0JCWJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopIGV2ZW50X2RhdGE7Ci0JCUJSQ01GX0VWRU5UKCgiIGRhdGEgKCVkKSA6ICIsIGRhdGFsZW4pKTsKLQkJZm9yIChpID0gMDsgaSA8IGRhdGFsZW47IGkrKykKLQkJCUJSQ01GX0VWRU5UKCgiIDB4JTAyeCAiLCAqYnVmKyspKTsKLQkJQlJDTUZfRVZFTlQoKCJcbiIpKTsKLQl9Ci19Ci0jZW5kaWYJCQkJLyogU0hPV19FVkVOVFMgKi8KLQotaW50Ci1icmNtZl9jX2hvc3RfZXZlbnQoc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiwgaW50ICppZmlkeCwgdm9pZCAqcGt0ZGF0YSwKLQkJICAgc3RydWN0IGJyY21mX2V2ZW50X21zZyAqZXZlbnQsIHZvaWQgKipkYXRhX3B0cikKLXsKLQkvKiBjaGVjayB3aGV0aGVyIHBhY2tldCBpcyBhIEJSQ00gZXZlbnQgcGt0ICovCi0Jc3RydWN0IGJyY21mX2V2ZW50ICpwdnRfZGF0YSA9IChzdHJ1Y3QgYnJjbWZfZXZlbnQgKikgcGt0ZGF0YTsKLQljaGFyICpldmVudF9kYXRhOwotCXUzMiB0eXBlLCBzdGF0dXM7Ci0JdTE2IGZsYWdzOwotCWludCBldmxlbjsKLQotCWlmIChtZW1jbXAoQlJDTV9PVUksICZwdnRfZGF0YS0+aGRyLm91aVswXSwgRE9UMTFfT1VJX0xFTikpIHsKLQkJQlJDTUZfRVJST1IoKCIlczogbWlzbWF0Y2hlZCBPVUksIGJhaWxpbmdcbiIsIF9fZnVuY19fKSk7Ci0JCXJldHVybiAtRUJBREU7Ci0JfQotCi0JLyogQlJDTSBldmVudCBwa3QgbWF5IGJlIHVuYWxpZ25lZCAtIHVzZSB4eHhfdWEgdG8gbG9hZCB1c2VyX3N1YnR5cGUuICovCi0JaWYgKGdldF91bmFsaWduZWRfYmUxNigmcHZ0X2RhdGEtPmhkci51c3Jfc3VidHlwZSkgIT0KLQkgICAgQkNNSUxDUF9CQ01fU1VCVFlQRV9FVkVOVCkgewotCQlCUkNNRl9FUlJPUigoIiVzOiBtaXNtYXRjaGVkIHN1YnR5cGUsIGJhaWxpbmdcbiIsIF9fZnVuY19fKSk7Ci0JCXJldHVybiAtRUJBREU7Ci0JfQotCi0JKmRhdGFfcHRyID0gJnB2dF9kYXRhWzFdOwotCWV2ZW50X2RhdGEgPSAqZGF0YV9wdHI7Ci0KLQkvKiBtZW1jcHkgc2luY2UgQlJDTSBldmVudCBwa3QgbWF5IGJlIHVuYWxpZ25lZC4gKi8KLQltZW1jcHkoZXZlbnQsICZwdnRfZGF0YS0+bXNnLCBzaXplb2Yoc3RydWN0IGJyY21mX2V2ZW50X21zZykpOwotCi0JdHlwZSA9IGdldF91bmFsaWduZWRfYmUzMigmZXZlbnQtPmV2ZW50X3R5cGUpOwotCWZsYWdzID0gZ2V0X3VuYWxpZ25lZF9iZTE2KCZldmVudC0+ZmxhZ3MpOwotCXN0YXR1cyA9IGdldF91bmFsaWduZWRfYmUzMigmZXZlbnQtPnN0YXR1cyk7Ci0JZXZsZW4gPSBnZXRfdW5hbGlnbmVkX2JlMzIoJmV2ZW50LT5kYXRhbGVuKSArCi0JCXNpemVvZihzdHJ1Y3QgYnJjbWZfZXZlbnQpOwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBCUkNNRl9FX0lGOgotCQl7Ci0JCQlzdHJ1Y3QgYnJjbWZfaWZfZXZlbnQgKmlmZXZlbnQgPQotCQkJCQkoc3RydWN0IGJyY21mX2lmX2V2ZW50ICopIGV2ZW50X2RhdGE7Ci0JCQlCUkNNRl9UUkFDRSgoIiVzOiBpZiBldmVudFxuIiwgX19mdW5jX18pKTsKLQotCQkJaWYgKGlmZXZlbnQtPmlmaWR4ID4gMCAmJgotCQkJCSBpZmV2ZW50LT5pZmlkeCA8IEJSQ01GX01BWF9JRlMpIHsKLQkJCQlpZiAoaWZldmVudC0+YWN0aW9uID09IEJSQ01GX0VfSUZfQUREKQotCQkJCQlicmNtZl9hZGRfaWYoZHJ2cl9wcml2LCBpZmV2ZW50LT5pZmlkeCwKLQkJCQkJCSAgIE5VTEwsIGV2ZW50LT5pZm5hbWUsCi0JCQkJCQkgICBwdnRfZGF0YS0+ZXRoLmhfZGVzdCwKLQkJCQkJCSAgIGlmZXZlbnQtPmZsYWdzLAotCQkJCQkJICAgaWZldmVudC0+YnNzaWR4KTsKLQkJCQllbHNlCi0JCQkJCWJyY21mX2RlbF9pZihkcnZyX3ByaXYsIGlmZXZlbnQtPmlmaWR4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJQlJDTUZfRVJST1IoKCIlczogSW52YWxpZCBpZmlkeCAlZCBmb3IgJXNcbiIsCi0JCQkJCSAgICAgX19mdW5jX18sIGlmZXZlbnQtPmlmaWR4LAotCQkJCQkgICAgIGV2ZW50LT5pZm5hbWUpKTsKLQkJCX0KLQkJfQotCQkvKiBzZW5kIHVwIHRoZSBpZiBldmVudDogYnRhbXAgdXNlciBuZWVkcyBpdCAqLwotCQkqaWZpZHggPSBicmNtZl9pZm5hbWUyaWR4KGRydnJfcHJpdiwgZXZlbnQtPmlmbmFtZSk7Ci0JCWJyZWFrOwotCi0JCS8qIFRoZXNlIGFyZSB3aGF0IGV4dGVybmFsIHN1cHBsaWNhbnQvYXV0aGVudGljYXRvciB3YW50cyAqLwotCWNhc2UgQlJDTUZfRV9MSU5LOgotCWNhc2UgQlJDTUZfRV9BU1NPQ19JTkQ6Ci0JY2FzZSBCUkNNRl9FX1JFQVNTT0NfSU5EOgotCWNhc2UgQlJDTUZfRV9ESVNBU1NPQ19JTkQ6Ci0JY2FzZSBCUkNNRl9FX01JQ19FUlJPUjoKLQlkZWZhdWx0OgotCQkvKiBGYWxsIHRocm91Z2g6IHRoaXMgc2hvdWxkIGdldCBfZXZlcnl0aGluZ18gICovCi0KLQkJKmlmaWR4ID0gYnJjbWZfaWZuYW1lMmlkeChkcnZyX3ByaXYsIGV2ZW50LT5pZm5hbWUpOwotCQlCUkNNRl9UUkFDRSgoIiVzOiBNQUMgZXZlbnQgJWQsIGZsYWdzICV4LCBzdGF0dXMgJXhcbiIsCi0JCQkgICAgIF9fZnVuY19fLCB0eXBlLCBmbGFncywgc3RhdHVzKSk7Ci0KLQkJLyogcHV0IGl0IGJhY2sgdG8gQlJDTUZfRV9ORElTX0xJTksgKi8KLQkJaWYgKHR5cGUgPT0gQlJDTUZfRV9ORElTX0xJTkspIHsKLQkJCXUzMiB0ZW1wOwotCi0JCQl0ZW1wID0gZ2V0X3VuYWxpZ25lZF9iZTMyKCZldmVudC0+ZXZlbnRfdHlwZSk7Ci0JCQlCUkNNRl9UUkFDRSgoIkNvbnZlcnRlZCB0byBXTENfRV9MSU5LIHR5cGUgJWRcbiIsCi0JCQkJICAgICB0ZW1wKSk7Ci0KLQkJCXRlbXAgPSBiZTMyX3RvX2NwdShCUkNNRl9FX05ESVNfTElOSyk7Ci0JCQltZW1jcHkoKHZvaWQgKikoJnB2dF9kYXRhLT5tc2cuZXZlbnRfdHlwZSksICZ0ZW1wLAotCQkJICAgICAgIHNpemVvZihwdnRfZGF0YS0+bXNnLmV2ZW50X3R5cGUpKTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLSNpZmRlZiBTSE9XX0VWRU5UUwotCWJyY21mX2Nfc2hvd19ob3N0X2V2ZW50KGV2ZW50LCBldmVudF9kYXRhKTsKLSNlbmRpZgkJCQkvKiBTSE9XX0VWRU5UUyAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIENvbnZlcnQgdXNlcidzIGlucHV0IGluIGhleCBwYXR0ZXJuIHRvIGJ5dGUtc2l6ZSBtYXNrICovCi1zdGF0aWMgaW50IGJyY21mX2NfcGF0dGVybl9hdG9oKGNoYXIgKnNyYywgY2hhciAqZHN0KQotewotCWludCBpOwotCWlmIChzdHJuY21wKHNyYywgIjB4IiwgMikgIT0gMCAmJiBzdHJuY21wKHNyYywgIjBYIiwgMikgIT0gMCkgewotCQlCUkNNRl9FUlJPUigoIk1hc2sgaW52YWxpZCBmb3JtYXQuIE5lZWRzIHRvIHN0YXJ0IHdpdGggMHhcbiIpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlzcmMgPSBzcmMgKyAyOwkJLyogU2tpcCBwYXN0IDB4ICovCi0JaWYgKHN0cmxlbihzcmMpICUgMiAhPSAwKSB7Ci0JCUJSQ01GX0VSUk9SKCgiTWFzayBpbnZhbGlkIGZvcm1hdC4gTGVuZ3RoIG11c3QgYmUgZXZlbi5cbiIpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlmb3IgKGkgPSAwOyAqc3JjICE9ICdcMCc7IGkrKykgewotCQljaGFyIG51bVszXTsKLQkJc3RybmNweShudW0sIHNyYywgMik7Ci0JCW51bVsyXSA9ICdcMCc7Ci0JCWRzdFtpXSA9ICh1OCkgc2ltcGxlX3N0cnRvdWwobnVtLCBOVUxMLCAxNik7Ci0JCXNyYyArPSAyOwotCX0KLQlyZXR1cm4gaTsKLX0KLQotdm9pZAotYnJjbWZfY19wa3RmaWx0ZXJfb2ZmbG9hZF9lbmFibGUoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgY2hhciAqYXJnLCBpbnQgZW5hYmxlLAotCQkJICAgICBpbnQgbWFzdGVyX21vZGUpCi17Ci0JY2hhciAqYXJndls4XTsKLQlpbnQgaSA9IDA7Ci0JY29uc3QgY2hhciAqc3RyOwotCWludCBidWZfbGVuOwotCWludCBzdHJfbGVuOwotCWNoYXIgKmFyZ19zYXZlID0gMCwgKmFyZ19vcmcgPSAwOwotCWludCByYzsKLQljaGFyIGJ1ZlsxMjhdOwotCXN0cnVjdCBicmNtZl9wa3RfZmlsdGVyX2VuYWJsZSBlbmFibGVfcGFybTsKLQlzdHJ1Y3QgYnJjbWZfcGt0X2ZpbHRlcl9lbmFibGUgKnBrdF9maWx0ZXJwOwotCi0JYXJnX3NhdmUgPSBrbWFsbG9jKHN0cmxlbihhcmcpICsgMSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFhcmdfc2F2ZSkgewotCQlCUkNNRl9FUlJPUigoIiVzOiBrbWFsbG9jIGZhaWxlZFxuIiwgX19mdW5jX18pKTsKLQkJZ290byBmYWlsOwotCX0KLQlhcmdfb3JnID0gYXJnX3NhdmU7Ci0JbWVtY3B5KGFyZ19zYXZlLCBhcmcsIHN0cmxlbihhcmcpICsgMSk7Ci0KLQlhcmd2W2ldID0gc3Ryc2VwKCZhcmdfc2F2ZSwgIiAiKTsKLQotCWkgPSAwOwotCWlmIChOVUxMID09IGFyZ3ZbaV0pIHsKLQkJQlJDTUZfRVJST1IoKCJObyBhcmdzIHByb3ZpZGVkXG4iKSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlzdHIgPSAicGt0X2ZpbHRlcl9lbmFibGUiOwotCXN0cl9sZW4gPSBzdHJsZW4oc3RyKTsKLQlzdHJuY3B5KGJ1Ziwgc3RyLCBzdHJfbGVuKTsKLQlidWZbc3RyX2xlbl0gPSAnXDAnOwotCWJ1Zl9sZW4gPSBzdHJfbGVuICsgMTsKLQotCXBrdF9maWx0ZXJwID0gKHN0cnVjdCBicmNtZl9wa3RfZmlsdGVyX2VuYWJsZSAqKSAoYnVmICsgc3RyX2xlbiArIDEpOwotCi0JLyogUGFyc2UgcGFja2V0IGZpbHRlciBpZC4gKi8KLQllbmFibGVfcGFybS5pZCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbaV0sIE5VTEwsIDApOwotCi0JLyogUGFyc2UgZW5hYmxlL2Rpc2FibGUgdmFsdWUuICovCi0JZW5hYmxlX3Bhcm0uZW5hYmxlID0gZW5hYmxlOwotCi0JYnVmX2xlbiArPSBzaXplb2YoZW5hYmxlX3Bhcm0pOwotCW1lbWNweSgoY2hhciAqKXBrdF9maWx0ZXJwLCAmZW5hYmxlX3Bhcm0sIHNpemVvZihlbmFibGVfcGFybSkpOwotCi0JLyogRW5hYmxlL2Rpc2FibGUgdGhlIHNwZWNpZmllZCBmaWx0ZXIuICovCi0JcmMgPSBicmNtZl9wcm90b19jZGNfc2V0X2lvY3RsKGRydnIsIDAsIEJSQ01GX0NfU0VUX1ZBUiwgYnVmLCBidWZfbGVuKTsKLQlyYyA9IHJjID49IDAgPyAwIDogcmM7Ci0JaWYgKHJjKQotCQlCUkNNRl9UUkFDRSgoIiVzOiBmYWlsZWQgdG8gYWRkIHBrdGZpbHRlciAlcywgcmV0Y29kZSA9ICVkXG4iLAotCQkJICAgICBfX2Z1bmNfXywgYXJnLCByYykpOwotCWVsc2UKLQkJQlJDTUZfVFJBQ0UoKCIlczogc3VjY2Vzc2Z1bGx5IGFkZGVkIHBrdGZpbHRlciAlc1xuIiwKLQkJCSAgICAgX19mdW5jX18sIGFyZykpOwotCi0JLyogQ29udG9ybCB0aGUgbWFzdGVyIG1vZGUgKi8KLQlicmNtdV9ta2lvdmFyKCJwa3RfZmlsdGVyX21vZGUiLCAoY2hhciAqKSZtYXN0ZXJfbW9kZSwgNCwgYnVmLAotCQkgICAgc2l6ZW9mKGJ1ZikpOwotCXJjID0gYnJjbWZfcHJvdG9fY2RjX3NldF9pb2N0bChkcnZyLCAwLCBCUkNNRl9DX1NFVF9WQVIsIGJ1ZiwKLQkJCQkgICAgICAgc2l6ZW9mKGJ1ZikpOwotCXJjID0gcmMgPj0gMCA/IDAgOiByYzsKLQlpZiAocmMpCi0JCUJSQ01GX1RSQUNFKCgiJXM6IGZhaWxlZCB0byBhZGQgcGt0ZmlsdGVyICVzLCByZXRjb2RlID0gJWRcbiIsCi0JCQkgICAgIF9fZnVuY19fLCBhcmcsIHJjKSk7Ci0KLWZhaWw6Ci0Ja2ZyZWUoYXJnX29yZyk7Ci19Ci0KLXZvaWQgYnJjbWZfY19wa3RmaWx0ZXJfb2ZmbG9hZF9zZXQoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgY2hhciAqYXJnKQotewotCWNvbnN0IGNoYXIgKnN0cjsKLQlzdHJ1Y3QgYnJjbWZfcGt0X2ZpbHRlciBwa3RfZmlsdGVyOwotCXN0cnVjdCBicmNtZl9wa3RfZmlsdGVyICpwa3RfZmlsdGVycDsKLQlpbnQgYnVmX2xlbjsKLQlpbnQgc3RyX2xlbjsKLQlpbnQgcmM7Ci0JdTMyIG1hc2tfc2l6ZTsKLQl1MzIgcGF0dGVybl9zaXplOwotCWNoYXIgKmFyZ3ZbOF0sICpidWYgPSAwOwotCWludCBpID0gMDsKLQljaGFyICphcmdfc2F2ZSA9IDAsICphcmdfb3JnID0gMDsKLQotCWFyZ19zYXZlID0ga21hbGxvYyhzdHJsZW4oYXJnKSArIDEsIEdGUF9BVE9NSUMpOwotCWlmICghYXJnX3NhdmUpIHsKLQkJQlJDTUZfRVJST1IoKCIlczoga21hbGxvYyBmYWlsZWRcbiIsIF9fZnVuY19fKSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlhcmdfb3JnID0gYXJnX3NhdmU7Ci0KLQlidWYgPSBrbWFsbG9jKFBLVEZJTFRFUl9CVUZfU0laRSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFidWYpIHsKLQkJQlJDTUZfRVJST1IoKCIlczoga21hbGxvYyBmYWlsZWRcbiIsIF9fZnVuY19fKSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlzdHJjcHkoYXJnX3NhdmUsIGFyZyk7Ci0KLQlhcmd2W2ldID0gc3Ryc2VwKCZhcmdfc2F2ZSwgIiAiKTsKLQl3aGlsZSAoYXJndltpKytdKQotCQlhcmd2W2ldID0gc3Ryc2VwKCZhcmdfc2F2ZSwgIiAiKTsKLQotCWkgPSAwOwotCWlmIChOVUxMID09IGFyZ3ZbaV0pIHsKLQkJQlJDTUZfRVJST1IoKCJObyBhcmdzIHByb3ZpZGVkXG4iKSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlzdHIgPSAicGt0X2ZpbHRlcl9hZGQiOwotCXN0cmNweShidWYsIHN0cik7Ci0Jc3RyX2xlbiA9IHN0cmxlbihzdHIpOwotCWJ1Zl9sZW4gPSBzdHJfbGVuICsgMTsKLQotCXBrdF9maWx0ZXJwID0gKHN0cnVjdCBicmNtZl9wa3RfZmlsdGVyICopIChidWYgKyBzdHJfbGVuICsgMSk7Ci0KLQkvKiBQYXJzZSBwYWNrZXQgZmlsdGVyIGlkLiAqLwotCXBrdF9maWx0ZXIuaWQgPSBzaW1wbGVfc3RydG91bChhcmd2W2ldLCBOVUxMLCAwKTsKLQotCWlmIChOVUxMID09IGFyZ3ZbKytpXSkgewotCQlCUkNNRl9FUlJPUigoIlBvbGFyaXR5IG5vdCBwcm92aWRlZFxuIikpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogUGFyc2UgZmlsdGVyIHBvbGFyaXR5LiAqLwotCXBrdF9maWx0ZXIubmVnYXRlX21hdGNoID0gc2ltcGxlX3N0cnRvdWwoYXJndltpXSwgTlVMTCwgMCk7Ci0KLQlpZiAoTlVMTCA9PSBhcmd2WysraV0pIHsKLQkJQlJDTUZfRVJST1IoKCJGaWx0ZXIgdHlwZSBub3QgcHJvdmlkZWRcbiIpKTsKLQkJZ290byBmYWlsOwotCX0KLQotCS8qIFBhcnNlIGZpbHRlciB0eXBlLiAqLwotCXBrdF9maWx0ZXIudHlwZSA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbaV0sIE5VTEwsIDApOwotCi0JaWYgKE5VTEwgPT0gYXJndlsrK2ldKSB7Ci0JCUJSQ01GX0VSUk9SKCgiT2Zmc2V0IG5vdCBwcm92aWRlZFxuIikpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogUGFyc2UgcGF0dGVybiBmaWx0ZXIgb2Zmc2V0LiAqLwotCXBrdF9maWx0ZXIudS5wYXR0ZXJuLm9mZnNldCA9IHNpbXBsZV9zdHJ0b3VsKGFyZ3ZbaV0sIE5VTEwsIDApOwotCi0JaWYgKE5VTEwgPT0gYXJndlsrK2ldKSB7Ci0JCUJSQ01GX0VSUk9SKCgiQml0bWFzayBub3QgcHJvdmlkZWRcbiIpKTsKLQkJZ290byBmYWlsOwotCX0KLQotCS8qIFBhcnNlIHBhdHRlcm4gZmlsdGVyIG1hc2suICovCi0JbWFza19zaXplID0KLQkgICAgYnJjbWZfY19wYXR0ZXJuX2F0b2gKLQkJICAgKGFyZ3ZbaV0sIChjaGFyICopcGt0X2ZpbHRlcnAtPnUucGF0dGVybi5tYXNrX2FuZF9wYXR0ZXJuKTsKLQotCWlmIChOVUxMID09IGFyZ3ZbKytpXSkgewotCQlCUkNNRl9FUlJPUigoIlBhdHRlcm4gbm90IHByb3ZpZGVkXG4iKSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBQYXJzZSBwYXR0ZXJuIGZpbHRlciBwYXR0ZXJuLiAqLwotCXBhdHRlcm5fc2l6ZSA9Ci0JICAgIGJyY21mX2NfcGF0dGVybl9hdG9oKGFyZ3ZbaV0sCi0JCQkJICAgKGNoYXIgKikmcGt0X2ZpbHRlcnAtPnUucGF0dGVybi4KLQkJCQkgICBtYXNrX2FuZF9wYXR0ZXJuW21hc2tfc2l6ZV0pOwotCi0JaWYgKG1hc2tfc2l6ZSAhPSBwYXR0ZXJuX3NpemUpIHsKLQkJQlJDTUZfRVJST1IoKCJNYXNrIGFuZCBwYXR0ZXJuIG5vdCB0aGUgc2FtZSBzaXplXG4iKSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlwa3RfZmlsdGVyLnUucGF0dGVybi5zaXplX2J5dGVzID0gbWFza19zaXplOwotCWJ1Zl9sZW4gKz0gQlJDTUZfUEtUX0ZJTFRFUl9GSVhFRF9MRU47Ci0JYnVmX2xlbiArPSAoQlJDTUZfUEtUX0ZJTFRFUl9QQVRURVJOX0ZJWEVEX0xFTiArIDIgKiBtYXNrX3NpemUpOwotCi0JLyogS2VlcC1hbGl2ZSBhdHRyaWJ1dGVzIGFyZSBzZXQgaW4gbG9jYWwKLQkgKiB2YXJpYWJsZSAoa2VlcF9hbGl2ZV9wa3QpLCBhbmQKLQkgKiogdGhlbiBtZW1jcHknZWQgaW50byBidWZmZXIgKGtlZXBfYWxpdmVfcGt0cCkgc2luY2UgdGhlcmUgaXMgbm8KLQkgKiogZ3VhcmFudGVlIHRoYXQgdGhlIGJ1ZmZlciBpcyBwcm9wZXJseSBhbGlnbmVkLgotCSAqLwotCW1lbWNweSgoY2hhciAqKXBrdF9maWx0ZXJwLAotCSAgICAgICAmcGt0X2ZpbHRlciwKLQkgICAgICAgQlJDTUZfUEtUX0ZJTFRFUl9GSVhFRF9MRU4gKyBCUkNNRl9QS1RfRklMVEVSX1BBVFRFUk5fRklYRURfTEVOKTsKLQotCXJjID0gYnJjbWZfcHJvdG9fY2RjX3NldF9pb2N0bChkcnZyLCAwLCBCUkNNRl9DX1NFVF9WQVIsIGJ1ZiwgYnVmX2xlbik7Ci0JcmMgPSByYyA+PSAwID8gMCA6IHJjOwotCi0JaWYgKHJjKQotCQlCUkNNRl9UUkFDRSgoIiVzOiBmYWlsZWQgdG8gYWRkIHBrdGZpbHRlciAlcywgcmV0Y29kZSA9ICVkXG4iLAotCQkJICAgICBfX2Z1bmNfXywgYXJnLCByYykpOwotCWVsc2UKLQkJQlJDTUZfVFJBQ0UoKCIlczogc3VjY2Vzc2Z1bGx5IGFkZGVkIHBrdGZpbHRlciAlc1xuIiwKLQkJCSAgICAgX19mdW5jX18sIGFyZykpOwotCi1mYWlsOgotCWtmcmVlKGFyZ19vcmcpOwotCi0Ja2ZyZWUoYnVmKTsKLX0KLQotdm9pZCBicmNtZl9jX2FycF9vZmZsb2FkX3NldChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBpbnQgYXJwX21vZGUpCi17Ci0JY2hhciBpb3ZidWZbMzJdOwotCWludCByZXRjb2RlOwotCi0JYnJjbXVfbWtpb3ZhcigiYXJwX29sIiwgKGNoYXIgKikmYXJwX21vZGUsIDQsIGlvdmJ1Ziwgc2l6ZW9mKGlvdmJ1ZikpOwotCXJldGNvZGUgPSBicmNtZl9wcm90b19jZGNfc2V0X2lvY3RsKGRydnIsIDAsIEJSQ01GX0NfU0VUX1ZBUiwKLQkJCQkgICBpb3ZidWYsIHNpemVvZihpb3ZidWYpKTsKLQlyZXRjb2RlID0gcmV0Y29kZSA+PSAwID8gMCA6IHJldGNvZGU7Ci0JaWYgKHJldGNvZGUpCi0JCUJSQ01GX1RSQUNFKCgiJXM6IGZhaWxlZCB0byBzZXQgQVJQIG9mZmxvYWQgbW9kZSB0byAweCV4LCAiCi0JCQkgICAgICJyZXRjb2RlID0gJWRcbiIsIF9fZnVuY19fLCBhcnBfbW9kZSwgcmV0Y29kZSkpOwotCWVsc2UKLQkJQlJDTUZfVFJBQ0UoKCIlczogc3VjY2Vzc2Z1bGx5IHNldCBBUlAgb2ZmbG9hZCBtb2RlIHRvIDB4JXhcbiIsCi0JCQkgICAgIF9fZnVuY19fLCBhcnBfbW9kZSkpOwotfQotCi12b2lkIGJyY21mX2NfYXJwX29mZmxvYWRfZW5hYmxlKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBhcnBfZW5hYmxlKQotewotCWNoYXIgaW92YnVmWzMyXTsKLQlpbnQgcmV0Y29kZTsKLQotCWJyY211X21raW92YXIoImFycG9lIiwgKGNoYXIgKikmYXJwX2VuYWJsZSwgNCwgaW92YnVmLCBzaXplb2YoaW92YnVmKSk7Ci0JcmV0Y29kZSA9IGJyY21mX3Byb3RvX2NkY19zZXRfaW9jdGwoZHJ2ciwgMCwgQlJDTUZfQ19TRVRfVkFSLAotCQkJCSAgIGlvdmJ1Ziwgc2l6ZW9mKGlvdmJ1ZikpOwotCXJldGNvZGUgPSByZXRjb2RlID49IDAgPyAwIDogcmV0Y29kZTsKLQlpZiAocmV0Y29kZSkKLQkJQlJDTUZfVFJBQ0UoKCIlczogZmFpbGVkIHRvIGVuYWJlIEFSUCBvZmZsb2FkIHRvICVkLCAiCi0JCQkgICAgICJyZXRjb2RlID0gJWRcbiIsIF9fZnVuY19fLCBhcnBfZW5hYmxlLCByZXRjb2RlKSk7Ci0JZWxzZQotCQlCUkNNRl9UUkFDRSgoIiVzOiBzdWNjZXNzZnVsbHkgZW5hYmVkIEFSUCBvZmZsb2FkIHRvICVkXG4iLAotCQkJICAgICBfX2Z1bmNfXywgYXJwX2VuYWJsZSkpOwotfQotCi1pbnQgYnJjbWZfY19wcmVpbml0X2lvY3RscyhzdHJ1Y3QgYnJjbWZfcHViICpkcnZyKQotewotCWNoYXIgaW92YnVmW0JSQ01GX0VWRU5USU5HX01BU0tfTEVOICsgMTJdOwkvKiAgUm9vbSBmb3IKLQkJCQkgImV2ZW50X21zZ3MiICsgJ1wwJyArIGJpdHZlYyAgKi8KLQl1aW50IHVwID0gMDsKLQljaGFyIGJ1ZlsxMjhdLCAqcHRyOwotCXVpbnQgcG93ZXJfbW9kZSA9IFBNX0ZBU1Q7Ci0JdTMyIGRvbmdsZV9hbGlnbiA9IEJSQ01GX1NEQUxJR047Ci0JdTMyIGdsb20gPSAwOwotCXVpbnQgYmNuX3RpbWVvdXQgPSAzOwotCWludCBzY2FuX2Fzc29jX3RpbWUgPSA0MDsKLQlpbnQgc2Nhbl91bmFzc29jX3RpbWUgPSA0MDsKLQlpbnQgaTsKLQotCWJyY21mX29zX3Byb3RvX2Jsb2NrKGRydnIpOwotCi0JLyogU2V0IENvdW50cnkgY29kZSAqLwotCWlmIChkcnZyLT5jb3VudHJ5X2NvZGVbMF0gIT0gMCkgewotCQlpZiAoYnJjbWZfcHJvdG9fY2RjX3NldF9pb2N0bChkcnZyLCAwLCBCUkNNRl9DX1NFVF9DT1VOVFJZLAotCQkJCSAgICAgZHJ2ci0+Y291bnRyeV9jb2RlLAotCQkJCSAgICAgc2l6ZW9mKGRydnItPmNvdW50cnlfY29kZSkpIDwgMCkgewotCQkJQlJDTUZfRVJST1IoKCIlczogY291bnRyeSBjb2RlIHNldHRpbmcgZmFpbGVkXG4iLAotCQkJCSAgICAgX19mdW5jX18pKTsKLQkJfQotCX0KLQotCS8qIHF1ZXJ5IGZvciAndmVyJyB0byBnZXQgdmVyc2lvbiBpbmZvIGZyb20gZmlybXdhcmUgKi8KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JcHRyID0gYnVmOwotCWJyY211X21raW92YXIoInZlciIsIDAsIDAsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCWJyY21mX3Byb3RvX2NkY19xdWVyeV9pb2N0bChkcnZyLCAwLCBCUkNNRl9DX0dFVF9WQVIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCXN0cnNlcCgmcHRyLCAiXG4iKTsKLQkvKiBQcmludCBmdyB2ZXJzaW9uIGluZm8gKi8KLQlCUkNNRl9FUlJPUigoIkZpcm13YXJlIHZlcnNpb24gPSAlc1xuIiwgYnVmKSk7Ci0KLQkvKiBTZXQgUG93ZXJTYXZlIG1vZGUgKi8KLQlicmNtZl9wcm90b19jZGNfc2V0X2lvY3RsKGRydnIsIDAsIEJSQ01GX0NfU0VUX1BNLCAoY2hhciAqKSZwb3dlcl9tb2RlLAotCQkJIHNpemVvZihwb3dlcl9tb2RlKSk7Ci0KLQkvKiBNYXRjaCBIb3N0IGFuZCBEb25nbGUgcnggYWxpZ25tZW50ICovCi0JYnJjbXVfbWtpb3ZhcigiYnVzOnR4Z2xvbWFsaWduIiwgKGNoYXIgKikmZG9uZ2xlX2FsaWduLCA0LCBpb3ZidWYsCi0JCSAgICBzaXplb2YoaW92YnVmKSk7Ci0JYnJjbWZfcHJvdG9fY2RjX3NldF9pb2N0bChkcnZyLCAwLCBCUkNNRl9DX1NFVF9WQVIsIGlvdmJ1ZiwKLQkJCQkgIHNpemVvZihpb3ZidWYpKTsKLQotCS8qIGRpc2FibGUgZ2xvbSBvcHRpb24gcGVyIGRlZmF1bHQgKi8KLQlicmNtdV9ta2lvdmFyKCJidXM6dHhnbG9tIiwgKGNoYXIgKikmZ2xvbSwgNCwgaW92YnVmLCBzaXplb2YoaW92YnVmKSk7Ci0JYnJjbWZfcHJvdG9fY2RjX3NldF9pb2N0bChkcnZyLCAwLCBCUkNNRl9DX1NFVF9WQVIsIGlvdmJ1ZiwKLQkJCQkgIHNpemVvZihpb3ZidWYpKTsKLQotCS8qIFNldHVwIHRpbWVvdXQgaWYgQmVhY29ucyBhcmUgbG9zdCBhbmQgcm9hbSBpcyBvZmYgdG8gcmVwb3J0Ci0JCSBsaW5rIGRvd24gKi8KLQlicmNtdV9ta2lvdmFyKCJiY25fdGltZW91dCIsIChjaGFyICopJmJjbl90aW1lb3V0LCA0LCBpb3ZidWYsCi0JCSAgICBzaXplb2YoaW92YnVmKSk7Ci0JYnJjbWZfcHJvdG9fY2RjX3NldF9pb2N0bChkcnZyLCAwLCBCUkNNRl9DX1NFVF9WQVIsIGlvdmJ1ZiwKLQkJCQkgIHNpemVvZihpb3ZidWYpKTsKLQotCS8qIEVuYWJsZS9EaXNhYmxlIGJ1aWxkLWluIHJvYW1pbmcgdG8gYWxsb3dlZCBleHQgc3VwcGxpY2FudCB0byB0YWtlCi0JCSBvZiByb21haW5nICovCi0JYnJjbXVfbWtpb3Zhcigicm9hbV9vZmYiLCAoY2hhciAqKSZicmNtZl9yb2FtLCA0LAotCQkgICAgICBpb3ZidWYsIHNpemVvZihpb3ZidWYpKTsKLQlicmNtZl9wcm90b19jZGNfc2V0X2lvY3RsKGRydnIsIDAsIEJSQ01GX0NfU0VUX1ZBUiwgaW92YnVmLAotCQkJCSAgc2l6ZW9mKGlvdmJ1ZikpOwotCi0JLyogRm9yY2UgU1RBIFVQICovCi0JaWYgKGJyY21mX3JhZGlvX3VwKQotCQlicmNtZl9wcm90b19jZGNfc2V0X2lvY3RsKGRydnIsIDAsIEJSQ01GX0NfVVAsIChjaGFyICopJnVwLAotCQkJCQkgIHNpemVvZih1cCkpOwotCi0JLyogU2V0dXAgZXZlbnRfbXNncyAqLwotCWJyY211X21raW92YXIoImV2ZW50X21zZ3MiLCBkcnZyLT5ldmVudG1hc2ssIEJSQ01GX0VWRU5USU5HX01BU0tfTEVOLAotCQkgICAgICBpb3ZidWYsIHNpemVvZihpb3ZidWYpKTsKLQlicmNtZl9wcm90b19jZGNfc2V0X2lvY3RsKGRydnIsIDAsIEJSQ01GX0NfU0VUX1ZBUiwgaW92YnVmLAotCQkJCSAgc2l6ZW9mKGlvdmJ1ZikpOwotCi0JYnJjbWZfcHJvdG9fY2RjX3NldF9pb2N0bChkcnZyLCAwLCBCUkNNRl9DX1NFVF9TQ0FOX0NIQU5ORUxfVElNRSwKLQkJCSAoY2hhciAqKSZzY2FuX2Fzc29jX3RpbWUsIHNpemVvZihzY2FuX2Fzc29jX3RpbWUpKTsKLQlicmNtZl9wcm90b19jZGNfc2V0X2lvY3RsKGRydnIsIDAsIEJSQ01GX0NfU0VUX1NDQU5fVU5BU1NPQ19USU1FLAotCQkJIChjaGFyICopJnNjYW5fdW5hc3NvY190aW1lLCBzaXplb2Yoc2Nhbl91bmFzc29jX3RpbWUpKTsKLQotCS8qIFNldCBhbmQgZW5hYmxlIEFSUCBvZmZsb2FkIGZlYXR1cmUgKi8KLQlpZiAoYnJjbWZfYXJwX2VuYWJsZSkKLQkJYnJjbWZfY19hcnBfb2ZmbG9hZF9zZXQoZHJ2ciwgYnJjbWZfYXJwX21vZGUpOwotCWJyY21mX2NfYXJwX29mZmxvYWRfZW5hYmxlKGRydnIsIGJyY21mX2FycF9lbmFibGUpOwotCi0JLyogU2V0IHVwIHBrdCBmaWx0ZXIgKi8KLQlpZiAoYnJjbWZfcGt0X2ZpbHRlcl9lbmFibGUpIHsKLQkJZm9yIChpID0gMDsgaSA8IGRydnItPnBrdGZpbHRlcl9jb3VudDsgaSsrKSB7Ci0JCQlicmNtZl9jX3BrdGZpbHRlcl9vZmZsb2FkX3NldChkcnZyLAotCQkJCQkJICBkcnZyLT5wa3RmaWx0ZXJbaV0pOwotCQkJYnJjbWZfY19wa3RmaWx0ZXJfb2ZmbG9hZF9lbmFibGUoZHJ2ciwKLQkJCSAgICAgZHJ2ci0+cGt0ZmlsdGVyW2ldLAotCQkJICAgICBicmNtZl9wa3RfZmlsdGVyX2luaXQsCi0JCQkgICAgIGJyY21mX21hc3Rlcl9tb2RlKTsKLQkJfQotCX0KLQotCWJyY21mX29zX3Byb3RvX3VuYmxvY2soZHJ2cik7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2RiZy5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfZGJnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZTRkN2EuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfZGJnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfQlJDTUZfREJHX0hfCi0jZGVmaW5lIF9CUkNNRl9EQkdfSF8KLQotI2lmIGRlZmluZWQoQkNNREJHKQotCi0jZGVmaW5lIEJSQ01GX0VSUk9SKGFyZ3MpIFwKLQlkbyB7aWYgKChicmNtZl9tc2dfbGV2ZWwgJiBCUkNNRl9FUlJPUl9WQUwpICYmIChuZXRfcmF0ZWxpbWl0KCkpKSBcCi0JCXByaW50ayBhcmdzOyB9IHdoaWxlICgwKQotI2RlZmluZSBCUkNNRl9UUkFDRShhcmdzKQlkbyB7aWYgKGJyY21mX21zZ19sZXZlbCAmIEJSQ01GX1RSQUNFX1ZBTCkgXAotCQkJCQlwcmludGsgYXJnczsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgQlJDTUZfSU5GTyhhcmdzKQlkbyB7aWYgKGJyY21mX21zZ19sZXZlbCAmIEJSQ01GX0lORk9fVkFMKSBcCi0JCQkJCXByaW50ayBhcmdzOyB9IHdoaWxlICgwKQotI2RlZmluZSBCUkNNRl9EQVRBKGFyZ3MpCWRvIHtpZiAoYnJjbWZfbXNnX2xldmVsICYgQlJDTUZfREFUQV9WQUwpIFwKLQkJCQkJcHJpbnRrIGFyZ3M7IH0gd2hpbGUgKDApCi0jZGVmaW5lIEJSQ01GX0NUTChhcmdzKQkJZG8ge2lmIChicmNtZl9tc2dfbGV2ZWwgJiBCUkNNRl9DVExfVkFMKSBcCi0JCQkJCXByaW50ayBhcmdzOyB9IHdoaWxlICgwKQotI2RlZmluZSBCUkNNRl9USU1FUihhcmdzKQlkbyB7aWYgKGJyY21mX21zZ19sZXZlbCAmIEJSQ01GX1RJTUVSX1ZBTCkgXAotCQkJCQlwcmludGsgYXJnczsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgQlJDTUZfSU5UUihhcmdzKQlkbyB7aWYgKGJyY21mX21zZ19sZXZlbCAmIEJSQ01GX0lOVFJfVkFMKSBcCi0JCQkJCXByaW50ayBhcmdzOyB9IHdoaWxlICgwKQotI2RlZmluZSBCUkNNRl9HTE9NKGFyZ3MpCWRvIHtpZiAoYnJjbWZfbXNnX2xldmVsICYgQlJDTUZfR0xPTV9WQUwpIFwKLQkJCQkJcHJpbnRrIGFyZ3M7IH0gd2hpbGUgKDApCi0jZGVmaW5lIEJSQ01GX0VWRU5UKGFyZ3MpCWRvIHtpZiAoYnJjbWZfbXNnX2xldmVsICYgQlJDTUZfRVZFTlRfVkFMKSBcCi0JCQkJCXByaW50ayBhcmdzOyB9IHdoaWxlICgwKQotCi0jZGVmaW5lIEJSQ01GX0RBVEFfT04oKQkJKGJyY21mX21zZ19sZXZlbCAmIEJSQ01GX0RBVEFfVkFMKQotI2RlZmluZSBCUkNNRl9DVExfT04oKQkJKGJyY21mX21zZ19sZXZlbCAmIEJSQ01GX0NUTF9WQUwpCi0jZGVmaW5lIEJSQ01GX0hEUlNfT04oKQkJKGJyY21mX21zZ19sZXZlbCAmIEJSQ01GX0hEUlNfVkFMKQotI2RlZmluZSBCUkNNRl9CWVRFU19PTigpCShicmNtZl9tc2dfbGV2ZWwgJiBCUkNNRl9CWVRFU19WQUwpCi0jZGVmaW5lIEJSQ01GX0dMT01fT04oKQkJKGJyY21mX21zZ19sZXZlbCAmIEJSQ01GX0dMT01fVkFMKQotCi0jZWxzZQkvKiAoZGVmaW5lZCBCQ01EQkcpIHx8IChkZWZpbmVkIEJDTURCRykgKi8KLQotI2RlZmluZSBCUkNNRl9FUlJPUihhcmdzKSAgZG8ge2lmIChuZXRfcmF0ZWxpbWl0KCkpIHByaW50ayBhcmdzOyB9IHdoaWxlICgwKQotI2RlZmluZSBCUkNNRl9UUkFDRShhcmdzKQotI2RlZmluZSBCUkNNRl9JTkZPKGFyZ3MpCi0jZGVmaW5lIEJSQ01GX0RBVEEoYXJncykKLSNkZWZpbmUgQlJDTUZfQ1RMKGFyZ3MpCi0jZGVmaW5lIEJSQ01GX1RJTUVSKGFyZ3MpCi0jZGVmaW5lIEJSQ01GX0lOVFIoYXJncykKLSNkZWZpbmUgQlJDTUZfR0xPTShhcmdzKQotI2RlZmluZSBCUkNNRl9FVkVOVChhcmdzKQotCi0jZGVmaW5lIEJSQ01GX0RBVEFfT04oKQkJMAotI2RlZmluZSBCUkNNRl9DVExfT04oKQkJMAotI2RlZmluZSBCUkNNRl9IRFJTX09OKCkJCTAKLSNkZWZpbmUgQlJDTUZfQllURVNfT04oKQkJMAotI2RlZmluZSBCUkNNRl9HTE9NX09OKCkJCTAKLQotI2VuZGlmCQkJCS8qIGRlZmluZWQoQkNNREJHKSAqLwotCi1leHRlcm4gaW50IGJyY21mX21zZ19sZXZlbDsKLQotI2VuZGlmCQkJCS8qIF9CUkNNRl9EQkdfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9saW51eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTI5NDAxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2xpbnV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpb19mdW5jLmg+Ci0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+Ci0jaW5jbHVkZSA8bGludXgvZmNudGwuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+Ci0jaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+Ci0jaW5jbHVkZSA8ZGVmcy5oPgotI2luY2x1ZGUgPGJyY211X3V0aWxzLmg+Ci0jaW5jbHVkZSA8YnJjbXVfd2lmaS5oPgotCi0jaW5jbHVkZSAiZGhkLmgiCi0jaW5jbHVkZSAiZGhkX2J1cy5oIgotI2luY2x1ZGUgImRoZF9wcm90by5oIgotI2luY2x1ZGUgImRoZF9kYmcuaCIKLSNpbmNsdWRlICJ3bF9jZmc4MDIxMS5oIgotI2luY2x1ZGUgImJjbWNoaXAuaCIKLQotI2lmIGRlZmluZWQoQ09ORklHX1BNX1NMRUVQKQotI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KLWF0b21pY190IGJyY21mX21tY19zdXNwZW5kOwotI2VuZGlmCS8qICBkZWZpbmVkKENPTkZJR19QTV9TTEVFUCkgKi8KLQotTU9EVUxFX0FVVEhPUigiQnJvYWRjb20gQ29ycG9yYXRpb24iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQnJvYWRjb20gODAyLjExbiB3aXJlbGVzcyBMQU4gZnVsbG1hYyBkcml2ZXIuIik7Ci1NT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiQnJvYWRjb20gODAyLjExbiBXTEFOIGZ1bGxtYWMgY2FyZHMiKTsKLU1PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKLQotCi0vKiBJbnRlcmZhY2UgY29udHJvbCBpbmZvcm1hdGlvbiAqLwotc3RydWN0IGJyY21mX2lmIHsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqaW5mbzsJLyogYmFjayBwb2ludGVyIHRvIGJyY21mX2luZm8gKi8KLQkvKiBPUy9zdGFjayBzcGVjaWZpY3MgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0OwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwotCWludCBpZHg7CQkvKiBpZmFjZSBpZHggaW4gZG9uZ2xlICovCi0JaW50IHN0YXRlOwkJLyogaW50ZXJmYWNlIHN0YXRlICovCi0JdWludCBzdWJ1bml0OwkJLyogc3VidW5pdCAqLwotCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsJLyogYXNzaWduZWQgTUFDIGFkZHJlc3MgKi8KLQlib29sIGF0dGFjaGVkOwkJLyogRGVsYXllZCBhdHRhY2htZW50IHdoZW4gdW5zZXQgKi8KLQlib29sIHR4Zmxvd2NvbnRyb2w7CS8qIFBlciBpbnRlcmZhY2UgZmxvdyBjb250cm9sIGluZGljYXRvciAqLwotCWNoYXIgbmFtZVtJRk5BTVNJWl07CS8qIGxpbnV4IGludGVyZmFjZSBuYW1lICovCi19OwotCi0vKiBMb2NhbCBwcml2YXRlIHN0cnVjdHVyZSAoZXh0ZW5zaW9uIG9mIHB1YikgKi8KLXN0cnVjdCBicmNtZl9pbmZvIHsKLQlzdHJ1Y3QgYnJjbWZfcHViIHB1YjsKLQotCS8qIE9TL3N0YWNrIHNwZWNpZmljcyAqLwotCXN0cnVjdCBicmNtZl9pZiAqaWZsaXN0W0JSQ01GX01BWF9JRlNdOwotCi0Jc3RydWN0IHNlbWFwaG9yZSBwcm90b19zZW07Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QgaW9jdGxfcmVzcF93YWl0OwotCi0JLyogVGhyZWFkIHRvIGlzc3VlIGlvY3RsIGZvciBtdWx0aWNhc3QgKi8KLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnN5c2lvY190c2s7Ci0Jc3RydWN0IHNlbWFwaG9yZSBzeXNpb2Nfc2VtOwotCWJvb2wgc2V0X211bHRpY2FzdDsKLQlib29sIHNldF9tYWNhZGRyZXNzOwotCXU4IG1hY3ZhbHVlW0VUSF9BTEVOXTsKLQlhdG9taWNfdCBwZW5kXzgwMjF4X2NudDsKLX07Ci0KLS8qIEVycm9yIGJpdHMgKi8KLW1vZHVsZV9wYXJhbShicmNtZl9tc2dfbGV2ZWwsIGludCwgMCk7Ci0KLS8qIFNwYXduIGEgdGhyZWFkIGZvciBzeXN0ZW0gaW9jdGxzIChzZXQgbWFjLCBzZXQgbWNhc3QpICovCi11aW50IGJyY21mX3N5c2lvYyA9IHRydWU7Ci1tb2R1bGVfcGFyYW0oYnJjbWZfc3lzaW9jLCB1aW50LCAwKTsKLQotLyogQVJQIG9mZmxvYWQgYWdlbnQgbW9kZSA6IEVuYWJsZSBBUlAgSG9zdCBBdXRvLVJlcGx5Ci1hbmQgQVJQIFBlZXIgQXV0by1SZXBseSAqLwotdWludCBicmNtZl9hcnBfbW9kZSA9IDB4YjsKLW1vZHVsZV9wYXJhbShicmNtZl9hcnBfbW9kZSwgdWludCwgMCk7Ci0KLS8qIEFSUCBvZmZsb2FkIGVuYWJsZSAqLwotdWludCBicmNtZl9hcnBfZW5hYmxlID0gdHJ1ZTsKLW1vZHVsZV9wYXJhbShicmNtZl9hcnBfZW5hYmxlLCB1aW50LCAwKTsKLQotLyogR2xvYmFsIFBrdCBmaWx0ZXIgZW5hYmxlIGNvbnRyb2wgKi8KLXVpbnQgYnJjbWZfcGt0X2ZpbHRlcl9lbmFibGUgPSB0cnVlOwotbW9kdWxlX3BhcmFtKGJyY21mX3BrdF9maWx0ZXJfZW5hYmxlLCB1aW50LCAwKTsKLQotLyogIFBrdCBmaWx0ZXIgaW5pdCBzZXR1cCAqLwotdWludCBicmNtZl9wa3RfZmlsdGVyX2luaXQ7Ci1tb2R1bGVfcGFyYW0oYnJjbWZfcGt0X2ZpbHRlcl9pbml0LCB1aW50LCAwKTsKLQotLyogUGt0IGZpbHRlciBtb2RlIGNvbnRyb2wgKi8KLXVpbnQgYnJjbWZfbWFzdGVyX21vZGUgPSB0cnVlOwotbW9kdWxlX3BhcmFtKGJyY21mX21hc3Rlcl9tb2RlLCB1aW50LCAwKTsKLQotbW9kdWxlX3BhcmFtKGJyY21mX2RvbmdsZV9tZW1zaXplLCBpbnQsIDApOwotCi0vKiBDb250b3JsIGZ3IHJvYW1pbmcgKi8KLXVpbnQgYnJjbWZfcm9hbSA9IDE7Ci0KLS8qIENvbnRyb2wgcmFkaW8gc3RhdGUgKi8KLXVpbnQgYnJjbWZfcmFkaW9fdXAgPSAxOwotCi0vKiBOZXR3b3JrIGludGVmYWNlIG5hbWUgKi8KLWNoYXIgaWZhY2VfbmFtZVtJRk5BTVNJWl0gPSAid2xhbiI7Ci1tb2R1bGVfcGFyYW1fc3RyaW5nKGlmYWNlX25hbWUsIGlmYWNlX25hbWUsIElGTkFNU0laLCAwKTsKLQotLyogVGhlIGZvbGxvd2luZyBhcmUgc3BlY2lmaWMgdG8gdGhlIFNESU8gZG9uZ2xlICovCi0KLS8qIElPQ1RMIHJlc3BvbnNlIHRpbWVvdXQgKi8KLWludCBicmNtZl9pb2N0bF90aW1lb3V0X21zZWMgPSBJT0NUTF9SRVNQX1RJTUVPVVQ7Ci0KLS8qIElkbGUgdGltZW91dCBmb3IgYmFja3BsYW5lIGNsb2NrICovCi1pbnQgYnJjbWZfaWRsZXRpbWUgPSBCUkNNRl9JRExFVElNRV9USUNLUzsKLW1vZHVsZV9wYXJhbShicmNtZl9pZGxldGltZSwgaW50LCAwKTsKLQotLyogVXNlIHBvbGxpbmcgKi8KLXVpbnQgYnJjbWZfcG9sbDsKLW1vZHVsZV9wYXJhbShicmNtZl9wb2xsLCB1aW50LCAwKTsKLQotLyogVXNlIGludGVycnVwdHMgKi8KLXVpbnQgYnJjbWZfaW50ciA9IHRydWU7Ci1tb2R1bGVfcGFyYW0oYnJjbWZfaW50ciwgdWludCwgMCk7Ci0KLS8qIFNESU8gRHJpdmUgU3RyZW5ndGggKGluIG1pbGxpYW1wcykgKi8KLXVpbnQgYnJjbWZfc2Rpb2RfZHJpdmVfc3RyZW5ndGggPSA2OwotbW9kdWxlX3BhcmFtKGJyY21mX3NkaW9kX2RyaXZlX3N0cmVuZ3RoLCB1aW50LCAwKTsKLQotLyogVHgvUnggYm91bmRzICovCi1tb2R1bGVfcGFyYW0oYnJjbWZfdHhib3VuZCwgdWludCwgMCk7Ci1tb2R1bGVfcGFyYW0oYnJjbWZfcnhib3VuZCwgdWludCwgMCk7Ci0KLSNpZmRlZiBTRFRFU1QKLS8qIEVjaG8gcGFja2V0IGdlbmVyYXRvciAocGt0cy9zKSAqLwotdWludCBicmNtZl9wa3RnZW47Ci1tb2R1bGVfcGFyYW0oYnJjbWZfcGt0Z2VuLCB1aW50LCAwKTsKLQotLyogRWNobyBwYWNrZXQgbGVuICgwID0+IHNhd3Rvb3RoLCBtYXggMjA0MCkgKi8KLXVpbnQgYnJjbWZfcGt0Z2VuX2xlbjsKLW1vZHVsZV9wYXJhbShicmNtZl9wa3RnZW5fbGVuLCB1aW50LCAwKTsKLSNlbmRpZgotCi1zdGF0aWMgaW50IGJyY21mX3RvZV9nZXQoc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiwgaW50IGlkeCwgdTMyICp0b2Vfb2wpOwotc3RhdGljIGludCBicmNtZl90b2Vfc2V0KHN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYsIGludCBpZHgsIHUzMiB0b2Vfb2wpOwotc3RhdGljIGludCBicmNtZl9ob3N0X2V2ZW50KHN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYsIGludCAqaWZpZHgsIHZvaWQgKnBrdGRhdGEsCi0JCQkgICAgc3RydWN0IGJyY21mX2V2ZW50X21zZyAqZXZlbnRfcHRyLAotCQkJICAgIHZvaWQgKipkYXRhX3B0cik7Ci0KLS8qCi0gKiBHZW5lcmFsaXplZCB0aW1lb3V0IG1lY2hhbmlzbS4gIFVzZXMgc3BpbiBzbGVlcCB3aXRoIGV4cG9uZW50aWFsCi0gKiBiYWNrLW9mZiB1bnRpbAotICogdGhlIHNsZWVwIHRpbWUgcmVhY2hlcyBvbmUgamlmZnksIHRoZW4gc3dpdGNoZXMgb3ZlciB0byB0YXNrIGRlbGF5LiAgVXNhZ2U6Ci0gKgotICogICAgICBicmNtZl90aW1lb3V0X3N0YXJ0KCZ0bW8sIHVzZWMpOwotICogICAgICB3aGlsZSAoIWJyY21mX3RpbWVvdXRfZXhwaXJlZCgmdG1vKSkKLSAqICAgICAgICAgICAgICBpZiAocG9sbF9zb21ldGhpbmcoKSkKLSAqICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICogICAgICBpZiAoYnJjbWZfdGltZW91dF9leHBpcmVkKCZ0bW8pKQotICogICAgICAgICAgICAgIGZhdGFsKCk7Ci0gKi8KLQotdm9pZCBicmNtZl90aW1lb3V0X3N0YXJ0KHN0cnVjdCBicmNtZl90aW1lb3V0ICp0bW8sIHVpbnQgdXNlYykKLXsKLQl0bW8tPmxpbWl0ID0gdXNlYzsKLQl0bW8tPmluY3JlbWVudCA9IDA7Ci0JdG1vLT5lbGFwc2VkID0gMDsKLQl0bW8tPnRpY2sgPSAxMDAwMDAwIC8gSFo7Ci19Ci0KLWludCBicmNtZl90aW1lb3V0X2V4cGlyZWQoc3RydWN0IGJyY21mX3RpbWVvdXQgKnRtbykKLXsKLQkvKiBEb2VzIG5vdGhpbmcgdGhlIGZpcnN0IGNhbGwgKi8KLQlpZiAodG1vLT5pbmNyZW1lbnQgPT0gMCkgewotCQl0bW8tPmluY3JlbWVudCA9IDE7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICh0bW8tPmVsYXBzZWQgPj0gdG1vLT5saW1pdCkKLQkJcmV0dXJuIDE7Ci0KLQkvKiBBZGQgdGhlIGRlbGF5IHRoYXQncyBhYm91dCB0byB0YWtlIHBsYWNlICovCi0JdG1vLT5lbGFwc2VkICs9IHRtby0+aW5jcmVtZW50OwotCi0JaWYgKHRtby0+aW5jcmVtZW50IDwgdG1vLT50aWNrKSB7Ci0JCXVkZWxheSh0bW8tPmluY3JlbWVudCk7Ci0JCXRtby0+aW5jcmVtZW50ICo9IDI7Ci0JCWlmICh0bW8tPmluY3JlbWVudCA+IHRtby0+dGljaykKLQkJCXRtby0+aW5jcmVtZW50ID0gdG1vLT50aWNrOwotCX0gZWxzZSB7Ci0JCXdhaXRfcXVldWVfaGVhZF90IGRlbGF5X3dhaXQ7Ci0JCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCQlpbnQgcGVuZGluZzsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmZGVsYXlfd2FpdCk7Ci0JCWFkZF93YWl0X3F1ZXVlKCZkZWxheV93YWl0LCAmd2FpdCk7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoMSk7Ci0JCXBlbmRpbmcgPSBzaWduYWxfcGVuZGluZyhjdXJyZW50KTsKLQkJcmVtb3ZlX3dhaXRfcXVldWUoJmRlbGF5X3dhaXQsICZ3YWl0KTsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQkJaWYgKHBlbmRpbmcpCi0JCQlyZXR1cm4gMTsJLyogSW50ZXJydXB0ZWQgKi8KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBicmNtZl9uZXQyaWR4KHN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXQpCi17Ci0JaW50IGkgPSAwOwotCi0Jd2hpbGUgKGkgPCBCUkNNRl9NQVhfSUZTKSB7Ci0JCWlmIChkcnZyX3ByaXYtPmlmbGlzdFtpXSAmJiAoZHJ2cl9wcml2LT5pZmxpc3RbaV0tPm5ldCA9PSBuZXQpKQotCQkJcmV0dXJuIGk7Ci0JCWkrKzsKLQl9Ci0KLQlyZXR1cm4gQlJDTUZfQkFEX0lGOwotfQotCi1pbnQgYnJjbWZfaWZuYW1lMmlkeChzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2LCBjaGFyICpuYW1lKQotewotCWludCBpID0gQlJDTUZfTUFYX0lGUzsKLQotCWlmIChuYW1lID09IE5VTEwgfHwgKm5hbWUgPT0gJ1wwJykKLQkJcmV0dXJuIDA7Ci0KLQl3aGlsZSAoLS1pID4gMCkKLQkJaWYgKGRydnJfcHJpdi0+aWZsaXN0W2ldCi0JCSAgICAmJiAhc3RybmNtcChkcnZyX3ByaXYtPmlmbGlzdFtpXS0+bmFtZSwgbmFtZSwgSUZOQU1TSVopKQotCQkJYnJlYWs7Ci0KLQlCUkNNRl9UUkFDRSgoIiVzOiByZXR1cm4gaWR4ICVkIGZvciBcIiVzXCJcbiIsIF9fZnVuY19fLCBpLCBuYW1lKSk7Ci0KLQlyZXR1cm4gaTsJCS8qIGRlZmF1bHQgLSB0aGUgcHJpbWFyeSBpbnRlcmZhY2UgKi8KLX0KLQotY2hhciAqYnJjbWZfaWZuYW1lKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZmlkeCkKLXsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gZHJ2ci0+aW5mbzsKLQotCWlmIChpZmlkeCA8IDAgfHwgaWZpZHggPj0gQlJDTUZfTUFYX0lGUykgewotCQlCUkNNRl9FUlJPUigoIiVzOiBpZmlkeCAlZCBvdXQgb2YgcmFuZ2VcbiIsIF9fZnVuY19fLCBpZmlkeCkpOwotCQlyZXR1cm4gIjxpZl9iYWQ+IjsKLQl9Ci0KLQlpZiAoZHJ2cl9wcml2LT5pZmxpc3RbaWZpZHhdID09IE5VTEwpIHsKLQkJQlJDTUZfRVJST1IoKCIlczogbnVsbCBpL2YgJWRcbiIsIF9fZnVuY19fLCBpZmlkeCkpOwotCQlyZXR1cm4gIjxpZl9udWxsPiI7Ci0JfQotCi0JaWYgKGRydnJfcHJpdi0+aWZsaXN0W2lmaWR4XS0+bmV0KQotCQlyZXR1cm4gZHJ2cl9wcml2LT5pZmxpc3RbaWZpZHhdLT5uZXQtPm5hbWU7Ci0KLQlyZXR1cm4gIjxpZl9ub25lPiI7Ci19Ci0KLXN0YXRpYyB2b2lkIF9icmNtZl9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiwgaW50IGlmaWR4KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKLQl1MzIgYWxsbXVsdGksIGNudDsKLQotCXN0cnVjdCBicmNtZl9pb2N0bCBpb2M7Ci0JY2hhciAqYnVmLCAqYnVmcDsKLQl1aW50IGJ1ZmxlbjsKLQlpbnQgcmV0OwotCi0JZGV2ID0gZHJ2cl9wcml2LT5pZmxpc3RbaWZpZHhdLT5uZXQ7Ci0JY250ID0gbmV0ZGV2X21jX2NvdW50KGRldik7Ci0KLQkvKiBEZXRlcm1pbmUgaW5pdGlhbCB2YWx1ZSBvZiBhbGxtdWx0aSBmbGFnICovCi0JYWxsbXVsdGkgPSAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgPyB0cnVlIDogZmFsc2U7Ci0KLQkvKiBTZW5kIGRvd24gdGhlIG11bHRpY2FzdCBsaXN0IGZpcnN0LiAqLwotCi0JYnVmbGVuID0gc2l6ZW9mKCJtY2FzdF9saXN0IikgKyBzaXplb2YoY250KSArIChjbnQgKiBFVEhfQUxFTik7Ci0JYnVmcCA9IGJ1ZiA9IGttYWxsb2MoYnVmbGVuLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWJ1ZnApIHsKLQkJQlJDTUZfRVJST1IoKCIlczogb3V0IG9mIG1lbW9yeSBmb3IgbWNhc3RfbGlzdCwgY250ICVkXG4iLAotCQkJICAgICBicmNtZl9pZm5hbWUoJmRydnJfcHJpdi0+cHViLCBpZmlkeCksIGNudCkpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3RyY3B5KGJ1ZnAsICJtY2FzdF9saXN0Iik7Ci0JYnVmcCArPSBzdHJsZW4oIm1jYXN0X2xpc3QiKSArIDE7Ci0KLQljbnQgPSBjcHVfdG9fbGUzMihjbnQpOwotCW1lbWNweShidWZwLCAmY250LCBzaXplb2YoY250KSk7Ci0JYnVmcCArPSBzaXplb2YoY250KTsKLQotCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpIHsKLQkJaWYgKCFjbnQpCi0JCQlicmVhazsKLQkJbWVtY3B5KGJ1ZnAsIGhhLT5hZGRyLCBFVEhfQUxFTik7Ci0JCWJ1ZnAgKz0gRVRIX0FMRU47Ci0JCWNudC0tOwotCX0KLQotCW1lbXNldCgmaW9jLCAwLCBzaXplb2YoaW9jKSk7Ci0JaW9jLmNtZCA9IEJSQ01GX0NfU0VUX1ZBUjsKLQlpb2MuYnVmID0gYnVmOwotCWlvYy5sZW4gPSBidWZsZW47Ci0JaW9jLnNldCA9IHRydWU7Ci0KLQlyZXQgPSBicmNtZl9wcm90b19pb2N0bCgmZHJ2cl9wcml2LT5wdWIsIGlmaWR4LCAmaW9jLCBpb2MuYnVmLCBpb2MubGVuKTsKLQlpZiAocmV0IDwgMCkgewotCQlCUkNNRl9FUlJPUigoIiVzOiBzZXQgbWNhc3RfbGlzdCBmYWlsZWQsIGNudCAlZFxuIiwKLQkJCSAgICAgYnJjbWZfaWZuYW1lKCZkcnZyX3ByaXYtPnB1YiwgaWZpZHgpLCBjbnQpKTsKLQkJYWxsbXVsdGkgPSBjbnQgPyB0cnVlIDogYWxsbXVsdGk7Ci0JfQotCi0Ja2ZyZWUoYnVmKTsKLQotCS8qIE5vdyBzZW5kIHRoZSBhbGxtdWx0aSBzZXR0aW5nLiAgVGhpcyBpcyBiYXNlZCBvbiB0aGUgc2V0dGluZyBpbiB0aGUKLQkgKiBuZXRfZGV2aWNlIGZsYWdzLCBidXQgbWlnaHQgYmUgbW9kaWZpZWQgYWJvdmUgdG8gYmUgdHVybmVkIG9uIGlmIHdlCi0JICogd2VyZSB0cnlpbmcgdG8gc2V0IHNvbWUgYWRkcmVzc2VzIGFuZCBkb25nbGUgcmVqZWN0ZWQgaXQuLi4KLQkgKi8KLQotCWJ1ZmxlbiA9IHNpemVvZigiYWxsbXVsdGkiKSArIHNpemVvZihhbGxtdWx0aSk7Ci0JYnVmID0ga21hbGxvYyhidWZsZW4sIEdGUF9BVE9NSUMpOwotCWlmICghYnVmKSB7Ci0JCUJSQ01GX0VSUk9SKCgiJXM6IG91dCBvZiBtZW1vcnkgZm9yIGFsbG11bHRpXG4iLAotCQkJICAgICBicmNtZl9pZm5hbWUoJmRydnJfcHJpdi0+cHViLCBpZmlkeCkpKTsKLQkJcmV0dXJuOwotCX0KLQlhbGxtdWx0aSA9IGNwdV90b19sZTMyKGFsbG11bHRpKTsKLQotCWlmICghYnJjbXVfbWtpb3ZhcgotCSAgICAoImFsbG11bHRpIiwgKHZvaWQgKikmYWxsbXVsdGksIHNpemVvZihhbGxtdWx0aSksIGJ1ZiwgYnVmbGVuKSkgewotCQlCUkNNRl9FUlJPUigoIiVzOiBta2lvdmFyIGZhaWxlZCBmb3IgYWxsbXVsdGksIGRhdGFsZW4gJWQgIgotCQkJICAgICAiYnVmbGVuICV1XG4iLAotCQkJICAgICBicmNtZl9pZm5hbWUoJmRydnJfcHJpdi0+cHViLCBpZmlkeCksCi0JCQkgICAgIChpbnQpc2l6ZW9mKGFsbG11bHRpKSwgYnVmbGVuKSk7Ci0JCWtmcmVlKGJ1Zik7Ci0JCXJldHVybjsKLQl9Ci0KLQltZW1zZXQoJmlvYywgMCwgc2l6ZW9mKGlvYykpOwotCWlvYy5jbWQgPSBCUkNNRl9DX1NFVF9WQVI7Ci0JaW9jLmJ1ZiA9IGJ1ZjsKLQlpb2MubGVuID0gYnVmbGVuOwotCWlvYy5zZXQgPSB0cnVlOwotCi0JcmV0ID0gYnJjbWZfcHJvdG9faW9jdGwoJmRydnJfcHJpdi0+cHViLCBpZmlkeCwgJmlvYywgaW9jLmJ1ZiwgaW9jLmxlbik7Ci0JaWYgKHJldCA8IDApIHsKLQkJQlJDTUZfRVJST1IoKCIlczogc2V0IGFsbG11bHRpICVkIGZhaWxlZFxuIiwKLQkJCSAgICAgYnJjbWZfaWZuYW1lKCZkcnZyX3ByaXYtPnB1YiwgaWZpZHgpLAotCQkJICAgICBsZTMyX3RvX2NwdShhbGxtdWx0aSkpKTsKLQl9Ci0KLQlrZnJlZShidWYpOwotCi0JLyogRmluYWxseSwgcGljayB1cCB0aGUgUFJPTUlTQyBmbGFnIGFzIHdlbGwsIGxpa2UgdGhlIE5JQwotCQkgZHJpdmVyIGRvZXMgKi8KLQotCWFsbG11bHRpID0gKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgPyB0cnVlIDogZmFsc2U7Ci0JYWxsbXVsdGkgPSBjcHVfdG9fbGUzMihhbGxtdWx0aSk7Ci0KLQltZW1zZXQoJmlvYywgMCwgc2l6ZW9mKGlvYykpOwotCWlvYy5jbWQgPSBCUkNNRl9DX1NFVF9QUk9NSVNDOwotCWlvYy5idWYgPSAmYWxsbXVsdGk7Ci0JaW9jLmxlbiA9IHNpemVvZihhbGxtdWx0aSk7Ci0JaW9jLnNldCA9IHRydWU7Ci0KLQlyZXQgPSBicmNtZl9wcm90b19pb2N0bCgmZHJ2cl9wcml2LT5wdWIsIGlmaWR4LCAmaW9jLCBpb2MuYnVmLCBpb2MubGVuKTsKLQlpZiAocmV0IDwgMCkgewotCQlCUkNNRl9FUlJPUigoIiVzOiBzZXQgcHJvbWlzYyAlZCBmYWlsZWRcbiIsCi0JCQkgICAgIGJyY21mX2lmbmFtZSgmZHJ2cl9wcml2LT5wdWIsIGlmaWR4KSwKLQkJCSAgICAgbGUzMl90b19jcHUoYWxsbXVsdGkpKSk7Ci0JfQotfQotCi1zdGF0aWMgaW50IF9icmNtZl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiwgaW50IGlmaWR4LCB1OCAqYWRkcikKLXsKLQljaGFyIGJ1ZlszMl07Ci0Jc3RydWN0IGJyY21mX2lvY3RsIGlvYzsKLQlpbnQgcmV0OwotCi0JQlJDTUZfVFJBQ0UoKCIlcyBlbnRlclxuIiwgX19mdW5jX18pKTsKLQlpZiAoIWJyY211X21raW92YXIKLQkgICAgKCJjdXJfZXRoZXJhZGRyIiwgKGNoYXIgKilhZGRyLCBFVEhfQUxFTiwgYnVmLCAzMikpIHsKLQkJQlJDTUZfRVJST1IoKCIlczogbWtpb3ZhciBmYWlsZWQgZm9yIGN1cl9ldGhlcmFkZHJcbiIsCi0JCQkgICAgIGJyY21mX2lmbmFtZSgmZHJ2cl9wcml2LT5wdWIsIGlmaWR4KSkpOwotCQlyZXR1cm4gLTE7Ci0JfQotCW1lbXNldCgmaW9jLCAwLCBzaXplb2YoaW9jKSk7Ci0JaW9jLmNtZCA9IEJSQ01GX0NfU0VUX1ZBUjsKLQlpb2MuYnVmID0gYnVmOwotCWlvYy5sZW4gPSAzMjsKLQlpb2Muc2V0ID0gdHJ1ZTsKLQotCXJldCA9IGJyY21mX3Byb3RvX2lvY3RsKCZkcnZyX3ByaXYtPnB1YiwgaWZpZHgsICZpb2MsIGlvYy5idWYsIGlvYy5sZW4pOwotCWlmIChyZXQgPCAwKSB7Ci0JCUJSQ01GX0VSUk9SKCgiJXM6IHNldCBjdXJfZXRoZXJhZGRyIGZhaWxlZFxuIiwKLQkJCSAgICAgYnJjbWZfaWZuYW1lKCZkcnZyX3ByaXYtPnB1YiwgaWZpZHgpKSk7Ci0JfSBlbHNlIHsKLQkJbWVtY3B5KGRydnJfcHJpdi0+aWZsaXN0W2lmaWR4XS0+bmV0LT5kZXZfYWRkciwgYWRkciwgRVRIX0FMRU4pOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLSNpZmRlZiBTT0ZUQVAKLWV4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqYXBfbmV0X2RldjsKLSNlbmRpZgotCi0vKiBWaXJ0dWFsIGludGVyZmFjZXMgb25seSAoKGlmcCAmJiBpZnAtPmluZm8gJiYgaWZwLT5pZHggPT0gdHJ1ZSkgKi8KLXN0YXRpYyB2b2lkIGJyY21mX29wX2lmKHN0cnVjdCBicmNtZl9pZiAqaWZwKQotewotCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXY7Ci0JaW50IHJldCA9IDAsIGVyciA9IDA7Ci0KLQlkcnZyX3ByaXYgPSBpZnAtPmluZm87Ci0KLQlCUkNNRl9UUkFDRSgoIiVzOiBpZHggJWQsIHN0YXRlICVkXG4iLCBfX2Z1bmNfXywgaWZwLT5pZHgsIGlmcC0+c3RhdGUpKTsKLQotCXN3aXRjaCAoaWZwLT5zdGF0ZSkgewotCWNhc2UgQlJDTUZfRV9JRl9BREQ6Ci0JCS8qCi0JCSAqIERlbGV0ZSB0aGUgZXhpc3RpbmcgaW50ZXJmYWNlIGJlZm9yZSBvdmVyd3JpdGluZyBpdAotCQkgKiBpbiBjYXNlIHdlIG1pc3NlZCB0aGUgQlJDTUZfRV9JRl9ERUwgZXZlbnQuCi0JCSAqLwotCQlpZiAoaWZwLT5uZXQgIT0gTlVMTCkgewotCQkJQlJDTUZfRVJST1IoKCIlczogRVJST1I6IG5ldGRldjolcyBhbHJlYWR5IGV4aXN0cywgIgotCQkJCSAgICAgInRyeSBmcmVlICYgdW5yZWdpc3RlclxuIiwKLQkJCQkgICAgIF9fZnVuY19fLCBpZnAtPm5ldC0+bmFtZSkpOwotCQkJbmV0aWZfc3RvcF9xdWV1ZShpZnAtPm5ldCk7Ci0JCQl1bnJlZ2lzdGVyX25ldGRldihpZnAtPm5ldCk7Ci0JCQlmcmVlX25ldGRldihpZnAtPm5ldCk7Ci0JCX0KLQkJLyogQWxsb2NhdGUgZXRoZXJkZXYsIGluY2x1ZGluZyBzcGFjZSBmb3IgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KLQkJaWZwLT5uZXQgPSBhbGxvY19ldGhlcmRldihzaXplb2YoZHJ2cl9wcml2KSk7Ci0JCWlmICghaWZwLT5uZXQpIHsKLQkJCUJSQ01GX0VSUk9SKCgiJXM6IE9PTSAtIGFsbG9jX2V0aGVyZGV2XG4iLCBfX2Z1bmNfXykpOwotCQkJcmV0ID0gLUVOT01FTTsKLQkJfQotCQlpZiAocmV0ID09IDApIHsKLQkJCXN0cmNweShpZnAtPm5ldC0+bmFtZSwgaWZwLT5uYW1lKTsKLQkJCW1lbWNweShuZXRkZXZfcHJpdihpZnAtPm5ldCksICZkcnZyX3ByaXYsIHNpemVvZihkcnZyX3ByaXYpKTsKLQkJCWVyciA9IGJyY21mX25ldF9hdHRhY2goJmRydnJfcHJpdi0+cHViLCBpZnAtPmlkeCk7Ci0JCQlpZiAoZXJyICE9IDApIHsKLQkJCQlCUkNNRl9FUlJPUigoIiVzOiBicmNtZl9uZXRfYXR0YWNoIGZhaWxlZCwgIgotCQkJCQkgICAgICJlcnIgJWRcbiIsCi0JCQkJCSAgICAgX19mdW5jX18sIGVycikpOwotCQkJCXJldCA9IC1FT1BOT1RTVVBQOwotCQkJfSBlbHNlIHsKLSNpZmRlZiBTT0ZUQVAKLQkJCQkvKiBzZW1hcGhvcmUgdGhhdCB0aGUgc29mdCBBUCBDT0RFCi0JCQkJCSB3YWl0cyBvbiAqLwotCQkJCWV4dGVybiBzdHJ1Y3Qgc2VtYXBob3JlIGFwX2V0aF9zZW1hOwotCi0JCQkJLyogc2F2ZSBwdHIgdG8gd2wwLjEgbmV0ZGV2IGZvciB1c2UKLQkJCQkJIGluIHdsX2l3LmMgICovCi0JCQkJYXBfbmV0X2RldiA9IGlmcC0+bmV0OwotCQkJCS8qIHNpZ25hbCB0byB0aGUgU09GVEFQICdzbGVlcGVyJyB0aHJlYWQsCi0JCQkJCSB3bDAuMSBpcyByZWFkeSAqLwotCQkJCXVwKCZhcF9ldGhfc2VtYSk7Ci0jZW5kaWYKLQkJCQlCUkNNRl9UUkFDRSgoIlxuID09PT0gcGlkOiV4LCBuZXRfZGV2aWNlIGZvciAiCi0JCQkJCSAgICAgImlmOiVzIGNyZWF0ZWQgPT09XG5cbiIsCi0JCQkJCSAgICAgY3VycmVudC0+cGlkLCBpZnAtPm5ldC0+bmFtZSkpOwotCQkJCWlmcC0+c3RhdGUgPSAwOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQlJDTUZfRV9JRl9ERUw6Ci0JCWlmIChpZnAtPm5ldCAhPSBOVUxMKSB7Ci0JCQlCUkNNRl9UUkFDRSgoIlxuJXM6IGdvdCAnV0xDX0VfSUZfREVMJyBzdGF0ZVxuIiwKLQkJCQkgICAgIF9fZnVuY19fKSk7Ci0JCQluZXRpZl9zdG9wX3F1ZXVlKGlmcC0+bmV0KTsKLQkJCXVucmVnaXN0ZXJfbmV0ZGV2KGlmcC0+bmV0KTsKLQkJCXJldCA9IEJSQ01GX0RFTF9JRjsJLyogTWFrZSBzdXJlIHRoZSBmcmVlX25ldGRldigpCi0JCQkJCQkJIGlzIGNhbGxlZCAqLwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJSQ01GX0VSUk9SKCgiJXM6IGJhZCBvcCAlZFxuIiwgX19mdW5jX18sIGlmcC0+c3RhdGUpKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHJldCA8IDApIHsKLQkJaWYgKGlmcC0+bmV0KQotCQkJZnJlZV9uZXRkZXYoaWZwLT5uZXQpOwotCi0JCWRydnJfcHJpdi0+aWZsaXN0W2lmcC0+aWR4XSA9IE5VTEw7Ci0JCWtmcmVlKGlmcCk7Ci0jaWZkZWYgU09GVEFQCi0JCWlmIChpZnAtPm5ldCA9PSBhcF9uZXRfZGV2KQotCQkJYXBfbmV0X2RldiA9IE5VTEw7CS8qICBOVUxMICBTT0ZUQVAgZ2xvYmFsCi0JCQkJCQkJIHdsMC4xIGFzIHdlbGwgKi8KLSNlbmRpZgkJCQkvKiAgU09GVEFQICovCi0JfQotfQotCi1zdGF0aWMgaW50IF9icmNtZl9zeXNpb2NfdGhyZWFkKHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9IChzdHJ1Y3QgYnJjbWZfaW5mbyAqKSBkYXRhOwotCWludCBpOwotI2lmZGVmIFNPRlRBUAotCWJvb2wgaW5fYXAgPSBmYWxzZTsKLSNlbmRpZgotCi0JYWxsb3dfc2lnbmFsKFNJR1RFUk0pOwotCi0Jd2hpbGUgKGRvd25faW50ZXJydXB0aWJsZSgmZHJ2cl9wcml2LT5zeXNpb2Nfc2VtKSA9PSAwKSB7Ci0JCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCi0JCQlicmVhazsKLQkJZm9yIChpID0gMDsgaSA8IEJSQ01GX01BWF9JRlM7IGkrKykgewotCQkJc3RydWN0IGJyY21mX2lmICppZmVudHJ5ID0gZHJ2cl9wcml2LT5pZmxpc3RbaV07Ci0JCQlpZiAoaWZlbnRyeSkgewotI2lmZGVmIFNPRlRBUAotCQkJCWluX2FwID0gKGFwX25ldF9kZXYgIT0gTlVMTCk7Ci0jZW5kaWYJCQkJLyogU09GVEFQICovCi0JCQkJaWYgKGlmZW50cnktPnN0YXRlKQotCQkJCQlicmNtZl9vcF9pZihpZmVudHJ5KTsKLSNpZmRlZiBTT0ZUQVAKLQkJCQlpZiAoZHJ2cl9wcml2LT5pZmxpc3RbaV0gPT0gTlVMTCkgewotCQkJCQlCUkNNRl9UUkFDRSgoIlxuXG4gJXM6IGludGVyZmFjZSAlZCAiCi0JCQkJCQkgICAgICJyZW1vdmVkIVxuIiwgX19mdW5jX18sCi0JCQkJCQkgICAgIGkpKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKGluX2FwICYmIGRydnJfcHJpdi0+c2V0X21hY2FkZHJlc3MpIHsKLQkJCQkJQlJDTUZfVFJBQ0UoKCJhdHRlbXB0IHRvIHNldCBNQUMgZm9yIgotCQkJCQkJICAgICAiICVzIGluIEFQIE1vZGUsIgotCQkJCQkJICAgICAiIGJsb2NrZWQuXG4iLAotCQkJCQkJICAgICBpZmVudHJ5LT5uZXQtPm5hbWUpKTsKLQkJCQkJZHJ2cl9wcml2LT5zZXRfbWFjYWRkcmVzcyA9IGZhbHNlOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoaW5fYXAgJiYgZHJ2cl9wcml2LT5zZXRfbXVsdGljYXN0KSB7Ci0JCQkJCUJSQ01GX1RSQUNFKCgiYXR0ZW1wdCB0byBzZXQgTVVMVElDQVNUICIKLQkJCQkJCSAgICAgImxpc3QgZm9yICVzIGluIEFQIE1vZGUsICIKLQkJCQkJCSAgICAgImJsb2NrZWQuXG4iLAotCQkJCQkJICAgICBpZmVudHJ5LT5uZXQtPm5hbWUpKTsKLQkJCQkJZHJ2cl9wcml2LT5zZXRfbXVsdGljYXN0ID0gZmFsc2U7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLSNlbmRpZgkJCQkvKiBTT0ZUQVAgKi8KLQkJCQlpZiAoZHJ2cl9wcml2LT5zZXRfbXVsdGljYXN0KSB7Ci0JCQkJCWRydnJfcHJpdi0+c2V0X211bHRpY2FzdCA9IGZhbHNlOwotCQkJCQlfYnJjbWZfc2V0X211bHRpY2FzdF9saXN0KGRydnJfcHJpdiwgaSk7Ci0JCQkJfQotCQkJCWlmIChkcnZyX3ByaXYtPnNldF9tYWNhZGRyZXNzKSB7Ci0JCQkJCWRydnJfcHJpdi0+c2V0X21hY2FkZHJlc3MgPSBmYWxzZTsKLQkJCQkJX2JyY21mX3NldF9tYWNfYWRkcmVzcyhkcnZyX3ByaXYsIGksCi0JCQkJCQlkcnZyX3ByaXYtPm1hY3ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYnJjbWZfbmV0ZGV2X3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICphZGRyKQotewotCWludCByZXQgPSAwOwotCi0Jc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9ICooc3RydWN0IGJyY21mX2luZm8gKiopIG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHNvY2thZGRyICpzYSA9IChzdHJ1Y3Qgc29ja2FkZHIgKilhZGRyOwotCWludCBpZmlkeDsKLQotCWlmaWR4ID0gYnJjbWZfbmV0MmlkeChkcnZyX3ByaXYsIGRldik7Ci0JaWYgKGlmaWR4ID09IEJSQ01GX0JBRF9JRikKLQkJcmV0dXJuIC0xOwotCi0JbWVtY3B5KCZkcnZyX3ByaXYtPm1hY3ZhbHVlLCBzYS0+c2FfZGF0YSwgRVRIX0FMRU4pOwotCWRydnJfcHJpdi0+c2V0X21hY2FkZHJlc3MgPSB0cnVlOwotCXVwKCZkcnZyX3ByaXYtPnN5c2lvY19zZW0pOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgYnJjbWZfbmV0ZGV2X3NldF9tdWx0aWNhc3RfbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYgPSAqKHN0cnVjdCBicmNtZl9pbmZvICoqKSBuZXRkZXZfcHJpdihkZXYpOwotCWludCBpZmlkeDsKLQotCWlmaWR4ID0gYnJjbWZfbmV0MmlkeChkcnZyX3ByaXYsIGRldik7Ci0JaWYgKGlmaWR4ID09IEJSQ01GX0JBRF9JRikKLQkJcmV0dXJuOwotCi0JZHJ2cl9wcml2LT5zZXRfbXVsdGljYXN0ID0gdHJ1ZTsKLQl1cCgmZHJ2cl9wcml2LT5zeXNpb2Nfc2VtKTsKLX0KLQotaW50IGJyY21mX3NlbmRwa3Qoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgaW50IGlmaWR4LCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0YnVmKQotewotCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYgPSBkcnZyLT5pbmZvOwotCi0JLyogUmVqZWN0IGlmIGRvd24gKi8KLQlpZiAoIWRydnItPnVwIHx8IChkcnZyLT5idXNzdGF0ZSA9PSBCUkNNRl9CVVNfRE9XTikpCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyogVXBkYXRlIG11bHRpY2FzdCBzdGF0aXN0aWMgKi8KLQlpZiAocGt0YnVmLT5sZW4gPj0gRVRIX0FMRU4pIHsKLQkJdTggKnBrdGRhdGEgPSAodTggKikgKHBrdGJ1Zi0+ZGF0YSk7Ci0JCXN0cnVjdCBldGhoZHIgKmVoID0gKHN0cnVjdCBldGhoZHIgKilwa3RkYXRhOwotCi0JCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihlaC0+aF9kZXN0KSkKLQkJCWRydnItPnR4X211bHRpY2FzdCsrOwotCQlpZiAobnRvaHMoZWgtPmhfcHJvdG8pID09IEVUSF9QX1BBRSkKLQkJCWF0b21pY19pbmMoJmRydnJfcHJpdi0+cGVuZF84MDIxeF9jbnQpOwotCX0KLQotCS8qIElmIHRoZSBwcm90b2NvbCB1c2VzIGEgZGF0YSBoZWFkZXIsIGFwcGx5IGl0ICovCi0JYnJjbWZfcHJvdG9faGRycHVzaChkcnZyLCBpZmlkeCwgcGt0YnVmKTsKLQotCS8qIFVzZSBidXMgbW9kdWxlIHRvIHNlbmQgZGF0YSBmcmFtZSAqLwotCXJldHVybiBicmNtZl9zZGJyY21fYnVzX3R4ZGF0YShkcnZyLT5idXMsIHBrdGJ1Zik7Ci19Ci0KLXN0YXRpYyBpbnQgYnJjbWZfbmV0ZGV2X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYgPSAqKHN0cnVjdCBicmNtZl9pbmZvICoqKSBuZXRkZXZfcHJpdihuZXQpOwotCWludCBpZmlkeDsKLQotCUJSQ01GX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwotCi0JLyogUmVqZWN0IGlmIGRvd24gKi8KLQlpZiAoIWRydnJfcHJpdi0+cHViLnVwIHx8IChkcnZyX3ByaXYtPnB1Yi5idXNzdGF0ZSA9PSBCUkNNRl9CVVNfRE9XTikpIHsKLQkJQlJDTUZfRVJST1IoKCIlczogeG1pdCByZWplY3RlZCBwdWIudXA9JWQgYnVzc3RhdGU9JWRcbiIsCi0JCQkgICAgIF9fZnVuY19fLCBkcnZyX3ByaXYtPnB1Yi51cCwKLQkJCSAgICAgZHJ2cl9wcml2LT5wdWIuYnVzc3RhdGUpKTsKLQkJbmV0aWZfc3RvcF9xdWV1ZShuZXQpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlpZmlkeCA9IGJyY21mX25ldDJpZHgoZHJ2cl9wcml2LCBuZXQpOwotCWlmIChpZmlkeCA9PSBCUkNNRl9CQURfSUYpIHsKLQkJQlJDTUZfRVJST1IoKCIlczogYmFkIGlmaWR4ICVkXG4iLCBfX2Z1bmNfXywgaWZpZHgpKTsKLQkJbmV0aWZfc3RvcF9xdWV1ZShuZXQpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQkvKiBNYWtlIHN1cmUgdGhlcmUncyBlbm91Z2ggcm9vbSBmb3IgYW55IGhlYWRlciAqLwotCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IGRydnJfcHJpdi0+cHViLmhkcmxlbikgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKLQotCQlCUkNNRl9JTkZPKCgiJXM6IGluc3VmZmljaWVudCBoZWFkcm9vbVxuIiwKLQkJCSAgICBicmNtZl9pZm5hbWUoJmRydnJfcHJpdi0+cHViLCBpZmlkeCkpKTsKLQkJZHJ2cl9wcml2LT5wdWIudHhfcmVhbGxvYysrOwotCQlza2IyID0gc2tiX3JlYWxsb2NfaGVhZHJvb20oc2tiLCBkcnZyX3ByaXYtPnB1Yi5oZHJsZW4pOwotCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCXNrYiA9IHNrYjI7Ci0JCWlmIChza2IgPT0gTlVMTCkgewotCQkJQlJDTUZfRVJST1IoKCIlczogc2tiX3JlYWxsb2NfaGVhZHJvb20gZmFpbGVkXG4iLAotCQkJCSAgICAgYnJjbWZfaWZuYW1lKCZkcnZyX3ByaXYtPnB1YiwgaWZpZHgpKSk7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBkb25lOwotCQl9Ci0JfQotCi0JcmV0ID0gYnJjbWZfc2VuZHBrdCgmZHJ2cl9wcml2LT5wdWIsIGlmaWR4LCBza2IpOwotCi1kb25lOgotCWlmIChyZXQpCi0JCWRydnJfcHJpdi0+cHViLmRzdGF0cy50eF9kcm9wcGVkKys7Ci0JZWxzZQotCQlkcnZyX3ByaXYtPnB1Yi50eF9wYWNrZXRzKys7Ci0KLQkvKiBSZXR1cm4gb2s6IHdlIGFsd2F5cyBlYXQgdGhlIHBhY2tldCAqLwotCXJldHVybiAwOwotfQotCi12b2lkIGJyY21mX3R4Zmxvd2NvbnRyb2woc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgaW50IGlmaWR4LCBib29sIHN0YXRlKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQ7Ci0Jc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9IGRydnItPmluZm87Ci0KLQlCUkNNRl9UUkFDRSgoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKLQotCWRydnItPnR4b2ZmID0gc3RhdGU7Ci0JbmV0ID0gZHJ2cl9wcml2LT5pZmxpc3RbaWZpZHhdLT5uZXQ7Ci0JaWYgKHN0YXRlID09IE9OKQotCQluZXRpZl9zdG9wX3F1ZXVlKG5ldCk7Ci0JZWxzZQotCQluZXRpZl93YWtlX3F1ZXVlKG5ldCk7Ci19Ci0KLXZvaWQgYnJjbWZfcnhfZnJhbWUoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgaW50IGlmaWR4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgIGludCBudW1wa3QpCi17Ci0Jc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9IGRydnItPmluZm87Ci0JdW5zaWduZWQgY2hhciAqZXRoOwotCXVpbnQgbGVuOwotCXZvaWQgKmRhdGE7Ci0Jc3RydWN0IHNrX2J1ZmYgKnBuZXh0LCAqc2F2ZV9wa3RidWY7Ci0JaW50IGk7Ci0Jc3RydWN0IGJyY21mX2lmICppZnA7Ci0Jc3RydWN0IGJyY21mX2V2ZW50X21zZyBldmVudDsKLQotCUJSQ01GX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwotCi0Jc2F2ZV9wa3RidWYgPSBza2I7Ci0KLQlmb3IgKGkgPSAwOyBza2IgJiYgaSA8IG51bXBrdDsgaSsrLCBza2IgPSBwbmV4dCkgewotCi0JCXBuZXh0ID0gc2tiLT5uZXh0OwotCQlza2ItPm5leHQgPSBOVUxMOwotCi0JCS8qIEdldCB0aGUgcHJvdG9jb2wsIG1haW50YWluIHNrYiBhcm91bmQgZXRoX3R5cGVfdHJhbnMoKQotCQkgKiBUaGUgbWFpbiByZWFzb24gZm9yIHRoaXMgaGFjayBpcyBmb3IgdGhlIGxpbWl0YXRpb24gb2YKLQkJICogTGludXggMi40IHdoZXJlICdldGhfdHlwZV90cmFucycgdXNlcyB0aGUKLQkJICogJ25ldC0+aGFyZF9oZWFkZXJfbGVuJwotCQkgKiB0byBwZXJmb3JtIHNrYl9wdWxsIGluc2lkZSB2cyBFVEhfSExFTi4gU2luY2UgdG8gYXZvaWQKLQkJICogY29waW5nIG9mIHRoZSBwYWNrZXQgY29taW5nIGZyb20gdGhlIG5ldHdvcmsgc3RhY2sgdG8gYWRkCi0JCSAqIEJEQywgSGFyZHdhcmUgaGVhZGVyIGV0YywgZHVyaW5nIG5ldHdvcmsgaW50ZXJmYWNlCi0JCSAqIHJlZ2lzdHJhdGlvbgotCQkgKiB3ZSBzZXQgdGhlICduZXQtPmhhcmRfaGVhZGVyX2xlbicgdG8gRVRIX0hMRU4gKyBleHRyYSBzcGFjZQotCQkgKiByZXF1aXJlZAotCQkgKiBmb3IgQkRDLCBIYXJkd2FyZSBoZWFkZXIgZXRjLiBhbmQgbm90IGp1c3QgdGhlIEVUSF9ITEVOCi0JCSAqLwotCQlldGggPSBza2ItPmRhdGE7Ci0JCWxlbiA9IHNrYi0+bGVuOwotCi0JCWlmcCA9IGRydnJfcHJpdi0+aWZsaXN0W2lmaWR4XTsKLQkJaWYgKGlmcCA9PSBOVUxMKQotCQkJaWZwID0gZHJ2cl9wcml2LT5pZmxpc3RbMF07Ci0KLQkJc2tiLT5kZXYgPSBpZnAtPm5ldDsKLQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgc2tiLT5kZXYpOwotCi0JCWlmIChza2ItPnBrdF90eXBlID09IFBBQ0tFVF9NVUxUSUNBU1QpCi0JCQlkcnZyX3ByaXYtPnB1Yi5yeF9tdWx0aWNhc3QrKzsKLQotCQlza2ItPmRhdGEgPSBldGg7Ci0JCXNrYi0+bGVuID0gbGVuOwotCi0JCS8qIFN0cmlwIGhlYWRlciwgY291bnQsIGRlbGl2ZXIgdXB3YXJkICovCi0JCXNrYl9wdWxsKHNrYiwgRVRIX0hMRU4pOwotCi0JCS8qIFByb2Nlc3Mgc3BlY2lhbCBldmVudCBwYWNrZXRzIGFuZCB0aGVuIGRpc2NhcmQgdGhlbSAqLwotCQlpZiAobnRvaHMoc2tiLT5wcm90b2NvbCkgPT0gRVRIX1BfTElOS19DVEwpCi0JCQlicmNtZl9ob3N0X2V2ZW50KGRydnJfcHJpdiwgJmlmaWR4LAotCQkJCQkgIHNrYl9tYWNfaGVhZGVyKHNrYiksCi0JCQkJCSAgJmV2ZW50LCAmZGF0YSk7Ci0KLQkJaWYgKGRydnJfcHJpdi0+aWZsaXN0W2lmaWR4XSAmJgotCQkgICAgIWRydnJfcHJpdi0+aWZsaXN0W2lmaWR4XS0+c3RhdGUpCi0JCQlpZnAgPSBkcnZyX3ByaXYtPmlmbGlzdFtpZmlkeF07Ci0KLQkJaWYgKGlmcC0+bmV0KQotCQkJaWZwLT5uZXQtPmxhc3RfcnggPSBqaWZmaWVzOwotCi0JCWRydnItPmRzdGF0cy5yeF9ieXRlcyArPSBza2ItPmxlbjsKLQkJZHJ2ci0+cnhfcGFja2V0cysrOwkvKiBMb2NhbCBjb3VudCAqLwotCi0JCWlmIChpbl9pbnRlcnJ1cHQoKSkgewotCQkJbmV0aWZfcngoc2tiKTsKLQkJfSBlbHNlIHsKLQkJCS8qIElmIHRoZSByZWNlaXZlIGlzIG5vdCBwcm9jZXNzZWQgaW5zaWRlIGFuIElTUiwKLQkJCSAqIHRoZSBzb2Z0aXJxZCBtdXN0IGJlIHdva2VuIGV4cGxpY2l0bHkgdG8gc2VydmljZQotCQkJICogdGhlIE5FVF9SWF9TT0ZUSVJRLiAgSW4gMi42IGtlcm5lbHMsIHRoaXMgaXMgaGFuZGxlZAotCQkJICogYnkgbmV0aWZfcnhfbmkoKSwgYnV0IGluIGVhcmxpZXIga2VybmVscywgd2UgbmVlZAotCQkJICogdG8gZG8gaXQgbWFudWFsbHkuCi0JCQkgKi8KLQkJCW5ldGlmX3J4X25pKHNrYik7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgYnJjbWZfdHhjb21wbGV0ZShzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBzdHJ1Y3Qgc2tfYnVmZiAqdHhwLCBib29sIHN1Y2Nlc3MpCi17Ci0JdWludCBpZmlkeDsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gZHJ2ci0+aW5mbzsKLQlzdHJ1Y3QgZXRoaGRyICplaDsKLQl1MTYgdHlwZTsKLQotCWJyY21mX3Byb3RvX2hkcnB1bGwoZHJ2ciwgJmlmaWR4LCB0eHApOwotCi0JZWggPSAoc3RydWN0IGV0aGhkciAqKSh0eHAtPmRhdGEpOwotCXR5cGUgPSBudG9ocyhlaC0+aF9wcm90byk7Ci0KLQlpZiAodHlwZSA9PSBFVEhfUF9QQUUpCi0JCWF0b21pY19kZWMoJmRydnJfcHJpdi0+cGVuZF84MDIxeF9jbnQpOwotCi19Ci0KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYnJjbWZfbmV0ZGV2X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQotewotCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYgPSAqKHN0cnVjdCBicmNtZl9pbmZvICoqKSBuZXRkZXZfcHJpdihuZXQpOwotCXN0cnVjdCBicmNtZl9pZiAqaWZwOwotCWludCBpZmlkeDsKLQotCUJSQ01GX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwotCi0JaWZpZHggPSBicmNtZl9uZXQyaWR4KGRydnJfcHJpdiwgbmV0KTsKLQlpZiAoaWZpZHggPT0gQlJDTUZfQkFEX0lGKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmcCA9IGRydnJfcHJpdi0+aWZsaXN0W2lmaWR4XTsKLQotCWlmIChkcnZyX3ByaXYtPnB1Yi51cCkgewotCQkvKiBVc2UgdGhlIHByb3RvY29sIHRvIGdldCBkb25nbGUgc3RhdHMgKi8KLQkJYnJjbWZfcHJvdG9fZHN0YXRzKCZkcnZyX3ByaXYtPnB1Yik7Ci0JfQotCi0JLyogQ29weSBkb25nbGUgc3RhdHMgdG8gbmV0IGRldmljZSBzdGF0cyAqLwotCWlmcC0+c3RhdHMucnhfcGFja2V0cyA9IGRydnJfcHJpdi0+cHViLmRzdGF0cy5yeF9wYWNrZXRzOwotCWlmcC0+c3RhdHMudHhfcGFja2V0cyA9IGRydnJfcHJpdi0+cHViLmRzdGF0cy50eF9wYWNrZXRzOwotCWlmcC0+c3RhdHMucnhfYnl0ZXMgPSBkcnZyX3ByaXYtPnB1Yi5kc3RhdHMucnhfYnl0ZXM7Ci0JaWZwLT5zdGF0cy50eF9ieXRlcyA9IGRydnJfcHJpdi0+cHViLmRzdGF0cy50eF9ieXRlczsKLQlpZnAtPnN0YXRzLnJ4X2Vycm9ycyA9IGRydnJfcHJpdi0+cHViLmRzdGF0cy5yeF9lcnJvcnM7Ci0JaWZwLT5zdGF0cy50eF9lcnJvcnMgPSBkcnZyX3ByaXYtPnB1Yi5kc3RhdHMudHhfZXJyb3JzOwotCWlmcC0+c3RhdHMucnhfZHJvcHBlZCA9IGRydnJfcHJpdi0+cHViLmRzdGF0cy5yeF9kcm9wcGVkOwotCWlmcC0+c3RhdHMudHhfZHJvcHBlZCA9IGRydnJfcHJpdi0+cHViLmRzdGF0cy50eF9kcm9wcGVkOwotCWlmcC0+c3RhdHMubXVsdGljYXN0ID0gZHJ2cl9wcml2LT5wdWIuZHN0YXRzLm11bHRpY2FzdDsKLQotCXJldHVybiAmaWZwLT5zdGF0czsKLX0KLQotLyogUmV0cmlldmUgY3VycmVudCB0b2UgY29tcG9uZW50IGVuYWJsZXMsIHdoaWNoIGFyZSBrZXB0Ci0JIGFzIGEgYml0bWFwIGluIHRvZV9vbCBpb3ZhciAqLwotc3RhdGljIGludCBicmNtZl90b2VfZ2V0KHN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYsIGludCBpZmlkeCwgdTMyICp0b2Vfb2wpCi17Ci0Jc3RydWN0IGJyY21mX2lvY3RsIGlvYzsKLQljaGFyIGJ1ZlszMl07Ci0JaW50IHJldDsKLQotCW1lbXNldCgmaW9jLCAwLCBzaXplb2YoaW9jKSk7Ci0KLQlpb2MuY21kID0gQlJDTUZfQ19HRVRfVkFSOwotCWlvYy5idWYgPSBidWY7Ci0JaW9jLmxlbiA9ICh1aW50KSBzaXplb2YoYnVmKTsKLQlpb2Muc2V0ID0gZmFsc2U7Ci0KLQlzdHJjcHkoYnVmLCAidG9lX29sIik7Ci0JcmV0ID0gYnJjbWZfcHJvdG9faW9jdGwoJmRydnJfcHJpdi0+cHViLCBpZmlkeCwgJmlvYywgaW9jLmJ1ZiwgaW9jLmxlbik7Ci0JaWYgKHJldCA8IDApIHsKLQkJLyogQ2hlY2sgZm9yIG9sZGVyIGRvbmdsZSBpbWFnZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0b2Vfb2wgKi8KLQkJaWYgKHJldCA9PSAtRUlPKSB7Ci0JCQlCUkNNRl9FUlJPUigoIiVzOiB0b2Ugbm90IHN1cHBvcnRlZCBieSBkZXZpY2VcbiIsCi0JCQkJICAgICBicmNtZl9pZm5hbWUoJmRydnJfcHJpdi0+cHViLCBpZmlkeCkpKTsKLQkJCXJldHVybiAtRU9QTk9UU1VQUDsKLQkJfQotCi0JCUJSQ01GX0lORk8oKCIlczogY291bGQgbm90IGdldCB0b2Vfb2w6IHJldD0lZFxuIiwKLQkJCSAgICBicmNtZl9pZm5hbWUoJmRydnJfcHJpdi0+cHViLCBpZmlkeCksIHJldCkpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCW1lbWNweSh0b2Vfb2wsIGJ1Ziwgc2l6ZW9mKHUzMikpOwotCXJldHVybiAwOwotfQotCi0vKiBTZXQgY3VycmVudCB0b2UgY29tcG9uZW50IGVuYWJsZXMgaW4gdG9lX29sIGlvdmFyLAotCSBhbmQgc2V0IHRvZSBnbG9iYWwgZW5hYmxlIGlvdmFyICovCi1zdGF0aWMgaW50IGJyY21mX3RvZV9zZXQoc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiwgaW50IGlmaWR4LCB1MzIgdG9lX29sKQotewotCXN0cnVjdCBicmNtZl9pb2N0bCBpb2M7Ci0JY2hhciBidWZbMzJdOwotCWludCB0b2UsIHJldDsKLQotCW1lbXNldCgmaW9jLCAwLCBzaXplb2YoaW9jKSk7Ci0KLQlpb2MuY21kID0gQlJDTUZfQ19TRVRfVkFSOwotCWlvYy5idWYgPSBidWY7Ci0JaW9jLmxlbiA9ICh1aW50KSBzaXplb2YoYnVmKTsKLQlpb2Muc2V0ID0gdHJ1ZTsKLQotCS8qIFNldCB0b2Vfb2wgYXMgcmVxdWVzdGVkICovCi0KLQlzdHJjcHkoYnVmLCAidG9lX29sIik7Ci0JbWVtY3B5KCZidWZbc2l6ZW9mKCJ0b2Vfb2wiKV0sICZ0b2Vfb2wsIHNpemVvZih1MzIpKTsKLQotCXJldCA9IGJyY21mX3Byb3RvX2lvY3RsKCZkcnZyX3ByaXYtPnB1YiwgaWZpZHgsICZpb2MsIGlvYy5idWYsIGlvYy5sZW4pOwotCWlmIChyZXQgPCAwKSB7Ci0JCUJSQ01GX0VSUk9SKCgiJXM6IGNvdWxkIG5vdCBzZXQgdG9lX29sOiByZXQ9JWRcbiIsCi0JCQkgICAgIGJyY21mX2lmbmFtZSgmZHJ2cl9wcml2LT5wdWIsIGlmaWR4KSwgcmV0KSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogRW5hYmxlIHRvZSBnbG9iYWxseSBvbmx5IGlmIGFueSBjb21wb25lbnRzIGFyZSBlbmFibGVkLiAqLwotCi0JdG9lID0gKHRvZV9vbCAhPSAwKTsKLQotCXN0cmNweShidWYsICJ0b2UiKTsKLQltZW1jcHkoJmJ1ZltzaXplb2YoInRvZSIpXSwgJnRvZSwgc2l6ZW9mKHUzMikpOwotCi0JcmV0ID0gYnJjbWZfcHJvdG9faW9jdGwoJmRydnJfcHJpdi0+cHViLCBpZmlkeCwgJmlvYywgaW9jLmJ1ZiwgaW9jLmxlbik7Ci0JaWYgKHJldCA8IDApIHsKLQkJQlJDTUZfRVJST1IoKCIlczogY291bGQgbm90IHNldCB0b2U6IHJldD0lZFxuIiwKLQkJCSAgICAgYnJjbWZfaWZuYW1lKCZkcnZyX3ByaXYtPnB1YiwgaWZpZHgpLCByZXQpKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYnJjbWZfZXRodG9vbF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LAotCQkJCSAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQotewotCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYgPSAqKHN0cnVjdCBicmNtZl9pbmZvICoqKSBuZXRkZXZfcHJpdihuZXQpOwotCi0Jc3ByaW50ZihpbmZvLT5kcml2ZXIsIEtCVUlMRF9NT0ROQU1FKTsKLQlzcHJpbnRmKGluZm8tPnZlcnNpb24sICIlbHUiLCBkcnZyX3ByaXYtPnB1Yi5kcnZfdmVyc2lvbik7Ci0Jc3ByaW50ZihpbmZvLT5md192ZXJzaW9uLCAiJXMiLCBCQ000MzI5X0ZXX05BTUUpOwotCXNwcmludGYoaW5mby0+YnVzX2luZm8sICIlcyIsCi0JCWRldl9uYW1lKCZicmNtZl9jZmc4MDIxMV9nZXRfc2Rpb19mdW5jKCktPmRldikpOwotfQotCi1zdHJ1Y3QgZXRodG9vbF9vcHMgYnJjbWZfZXRodG9vbF9vcHMgPSB7Ci0JLmdldF9kcnZpbmZvID0gYnJjbWZfZXRodG9vbF9nZXRfZHJ2aW5mbwotfTsKLQotc3RhdGljIGludCBicmNtZl9ldGh0b29sKHN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYsIHZvaWQgKnVhZGRyKQotewotCXN0cnVjdCBldGh0b29sX2RydmluZm8gaW5mbzsKLQljaGFyIGRydm5hbWVbc2l6ZW9mKGluZm8uZHJpdmVyKV07Ci0JdTMyIGNtZDsKLQlzdHJ1Y3QgZXRodG9vbF92YWx1ZSBlZGF0YTsKLQl1MzIgdG9lX2NtcG50LCBjc3VtX2RpcjsKLQlpbnQgcmV0OwotCi0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQkvKiBhbGwgZXRodG9vbCBjYWxscyBzdGFydCB3aXRoIGEgY21kIHdvcmQgKi8KLQlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgdWFkZHIsIHNpemVvZih1MzIpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgRVRIVE9PTF9HRFJWSU5GTzoKLQkJLyogQ29weSBvdXQgYW55IHJlcXVlc3QgZHJpdmVyIG5hbWUgKi8KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCB1YWRkciwgc2l6ZW9mKGluZm8pKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlzdHJuY3B5KGRydm5hbWUsIGluZm8uZHJpdmVyLCBzaXplb2YoaW5mby5kcml2ZXIpKTsKLQkJZHJ2bmFtZVtzaXplb2YoaW5mby5kcml2ZXIpIC0gMV0gPSAnXDAnOwotCi0JCS8qIGNsZWFyIHN0cnVjdCBmb3IgcmV0dXJuICovCi0JCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKLQkJaW5mby5jbWQgPSBjbWQ7Ci0KLQkJLyogaWYgcmVxdWVzdGVkLCBpZGVudGlmeSBvdXJzZWx2ZXMgKi8KLQkJaWYgKHN0cmNtcChkcnZuYW1lLCAiP2RoZCIpID09IDApIHsKLQkJCXNwcmludGYoaW5mby5kcml2ZXIsICJkaGQiKTsKLQkJCXN0cmNweShpbmZvLnZlcnNpb24sIEJSQ01GX1ZFUlNJT05fU1RSKTsKLQkJfQotCi0JCS8qIG90aGVyd2lzZSwgcmVxdWlyZSBkb25nbGUgdG8gYmUgdXAgKi8KLQkJZWxzZSBpZiAoIWRydnJfcHJpdi0+cHViLnVwKSB7Ci0JCQlCUkNNRl9FUlJPUigoIiVzOiBkb25nbGUgaXMgbm90IHVwXG4iLCBfX2Z1bmNfXykpOwotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KLQotCQkvKiBmaW5hbGx5LCByZXBvcnQgZG9uZ2xlIGRyaXZlciB0eXBlICovCi0JCWVsc2UgaWYgKGRydnJfcHJpdi0+cHViLmlzd2wpCi0JCQlzcHJpbnRmKGluZm8uZHJpdmVyLCAid2wiKTsKLQkJZWxzZQotCQkJc3ByaW50ZihpbmZvLmRyaXZlciwgInh4Iik7Ci0KLQkJc3ByaW50ZihpbmZvLnZlcnNpb24sICIlbHUiLCBkcnZyX3ByaXYtPnB1Yi5kcnZfdmVyc2lvbik7Ci0JCWlmIChjb3B5X3RvX3VzZXIodWFkZHIsICZpbmZvLCBzaXplb2YoaW5mbykpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCUJSQ01GX0NUTCgoIiVzOiBnaXZlbiAlKnMsIHJldHVybmluZyAlc1xuIiwgX19mdW5jX18sCi0JCQkgICAoaW50KXNpemVvZihkcnZuYW1lKSwgZHJ2bmFtZSwgaW5mby5kcml2ZXIpKTsKLQkJYnJlYWs7Ci0KLQkJLyogR2V0IHRvZSBvZmZsb2FkIGNvbXBvbmVudHMgZnJvbSBkb25nbGUgKi8KLQljYXNlIEVUSFRPT0xfR1JYQ1NVTToKLQljYXNlIEVUSFRPT0xfR1RYQ1NVTToKLQkJcmV0ID0gYnJjbWZfdG9lX2dldChkcnZyX3ByaXYsIDAsICZ0b2VfY21wbnQpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJY3N1bV9kaXIgPQotCQkgICAgKGNtZCA9PSBFVEhUT09MX0dUWENTVU0pID8gVE9FX1RYX0NTVU1fT0wgOiBUT0VfUlhfQ1NVTV9PTDsKLQotCQllZGF0YS5jbWQgPSBjbWQ7Ci0JCWVkYXRhLmRhdGEgPSAodG9lX2NtcG50ICYgY3N1bV9kaXIpID8gMSA6IDA7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcih1YWRkciwgJmVkYXRhLCBzaXplb2YoZWRhdGEpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlicmVhazsKLQotCQkvKiBTZXQgdG9lIG9mZmxvYWQgY29tcG9uZW50cyBpbiBkb25nbGUgKi8KLQljYXNlIEVUSFRPT0xfU1JYQ1NVTToKLQljYXNlIEVUSFRPT0xfU1RYQ1NVTToKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZlZGF0YSwgdWFkZHIsIHNpemVvZihlZGF0YSkpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJLyogUmVhZCB0aGUgY3VycmVudCBzZXR0aW5ncywgdXBkYXRlIGFuZCB3cml0ZSBiYWNrICovCi0JCXJldCA9IGJyY21mX3RvZV9nZXQoZHJ2cl9wcml2LCAwLCAmdG9lX2NtcG50KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCi0JCWNzdW1fZGlyID0KLQkJICAgIChjbWQgPT0gRVRIVE9PTF9TVFhDU1VNKSA/IFRPRV9UWF9DU1VNX09MIDogVE9FX1JYX0NTVU1fT0w7Ci0KLQkJaWYgKGVkYXRhLmRhdGEgIT0gMCkKLQkJCXRvZV9jbXBudCB8PSBjc3VtX2RpcjsKLQkJZWxzZQotCQkJdG9lX2NtcG50ICY9IH5jc3VtX2RpcjsKLQotCQlyZXQgPSBicmNtZl90b2Vfc2V0KGRydnJfcHJpdiwgMCwgdG9lX2NtcG50KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCi0JCS8qIElmIHNldHRpbmcgVFggY2hlY2tzdW0gbW9kZSwgdGVsbCBMaW51eCB0aGUgbmV3IG1vZGUgKi8KLQkJaWYgKGNtZCA9PSBFVEhUT09MX1NUWENTVU0pIHsKLQkJCWlmIChlZGF0YS5kYXRhKQotCQkJCWRydnJfcHJpdi0+aWZsaXN0WzBdLT5uZXQtPmZlYXR1cmVzIHw9Ci0JCQkJICAgIE5FVElGX0ZfSVBfQ1NVTTsKLQkJCWVsc2UKLQkJCQlkcnZyX3ByaXYtPmlmbGlzdFswXS0+bmV0LT5mZWF0dXJlcyAmPQotCQkJCSAgICB+TkVUSUZfRl9JUF9DU1VNOwotCQl9Ci0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYnJjbWZfbmV0ZGV2X2lvY3RsX2VudHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIHN0cnVjdCBpZnJlcSAqaWZyLAotCQkJCSAgICBpbnQgY21kKQotewotCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYgPSAqKHN0cnVjdCBicmNtZl9pbmZvICoqKSBuZXRkZXZfcHJpdihuZXQpOwotCXN0cnVjdCBicmNtZl9jX2lvY3RsIGlvYzsKLQlpbnQgYmNtZXJyb3IgPSAwOwotCWludCBidWZsZW4gPSAwOwotCXZvaWQgKmJ1ZiA9IE5VTEw7Ci0JdWludCBkcml2ZXIgPSAwOwotCWludCBpZmlkeDsKLQlib29sIGlzX3NldF9rZXlfY21kOwotCi0JaWZpZHggPSBicmNtZl9uZXQyaWR4KGRydnJfcHJpdiwgbmV0KTsKLQlCUkNNRl9UUkFDRSgoIiVzOiBpZmlkeCAlZCwgY21kIDB4JTA0eFxuIiwgX19mdW5jX18sIGlmaWR4LCBjbWQpKTsKLQotCWlmIChpZmlkeCA9PSBCUkNNRl9CQURfSUYpCi0JCXJldHVybiAtMTsKLQotCWlmIChjbWQgPT0gU0lPQ0VUSFRPT0wpCi0JCXJldHVybiBicmNtZl9ldGh0b29sKGRydnJfcHJpdiwgKHZvaWQgKilpZnItPmlmcl9kYXRhKTsKLQotCWlmIChjbWQgIT0gU0lPQ0RFVlBSSVZBVEUpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCW1lbXNldCgmaW9jLCAwLCBzaXplb2YoaW9jKSk7Ci0KLQkvKiBDb3B5IHRoZSBpb2MgY29udHJvbCBzdHJ1Y3R1cmUgcGFydCBvZiBpb2N0bCByZXF1ZXN0ICovCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZpb2MsIGlmci0+aWZyX2RhdGEsIHNpemVvZihzdHJ1Y3QgYnJjbWZfaW9jdGwpKSkgewotCQliY21lcnJvciA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQkvKiBDb3B5IG91dCBhbnkgYnVmZmVyIHBhc3NlZCAqLwotCWlmIChpb2MuYnVmKSB7Ci0JCWJ1ZmxlbiA9IG1pbl90KGludCwgaW9jLmxlbiwgQlJDTUZfSU9DVExfTUFYTEVOKTsKLQkJLyogb3B0aW1pemF0aW9uIGZvciBkaXJlY3QgaW9jdGwgY2FsbHMgZnJvbSBrZXJuZWwgKi8KLQkJLyoKLQkJICAgaWYgKHNlZ21lbnRfZXEoZ2V0X2ZzKCksIEtFUk5FTF9EUykpIHsKLQkJICAgYnVmID0gaW9jLmJ1ZjsKLQkJICAgfSBlbHNlIHsKLQkJICovCi0JCXsKLQkJCWJ1ZiA9IGttYWxsb2MoYnVmbGVuLCBHRlBfQVRPTUlDKTsKLQkJCWlmICghYnVmKSB7Ci0JCQkJYmNtZXJyb3IgPSAtRU5PTUVNOwotCQkJCWdvdG8gZG9uZTsKLQkJCX0KLQkJCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGlvYy5idWYsIGJ1ZmxlbikpIHsKLQkJCQliY21lcnJvciA9IC1FSU5WQUw7Ci0JCQkJZ290byBkb25lOwotCQkJfQotCQl9Ci0JfQotCi0JLyogVG8gZGlmZmVyZW50aWF0ZSByZWFkIDQgbW9yZSBieWVzICovCi0JaWYgKChjb3B5X2Zyb21fdXNlcigmZHJpdmVyLCAoY2hhciAqKWlmci0+aWZyX2RhdGEgKwotCQkJICAgIHNpemVvZihzdHJ1Y3QgYnJjbWZfaW9jdGwpLCBzaXplb2YodWludCkpICE9IDApKSB7Ci0JCWJjbWVycm9yID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgewotCQliY21lcnJvciA9IC1FUEVSTTsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIGNoZWNrIGZvciBsb2NhbCBicmNtZiBpb2N0bCBhbmQgaGFuZGxlIGl0ICovCi0JaWYgKGRyaXZlciA9PSBCUkNNRl9JT0NUTF9NQUdJQykgewotCQliY21lcnJvciA9IGJyY21mX2NfaW9jdGwoKHZvaWQgKikmZHJ2cl9wcml2LT5wdWIsICZpb2MsIGJ1ZiwgYnVmbGVuKTsKLQkJaWYgKGJjbWVycm9yKQotCQkJZHJ2cl9wcml2LT5wdWIuYmNtZXJyb3IgPSBiY21lcnJvcjsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIHNlbmQgdG8gZG9uZ2xlIChtdXN0IGJlIHVwLCBhbmQgd2wpICovCi0JaWYgKChkcnZyX3ByaXYtPnB1Yi5idXNzdGF0ZSAhPSBCUkNNRl9CVVNfREFUQSkpIHsKLQkJQlJDTUZfRVJST1IoKCIlcyBET05HTEVfRE9XTixfX2Z1bmNfX1xuIiwgX19mdW5jX18pKTsKLQkJYmNtZXJyb3IgPSAtRUlPOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKCFkcnZyX3ByaXYtPnB1Yi5pc3dsKSB7Ci0JCWJjbWVycm9yID0gLUVJTzsKLQkJZ290byBkb25lOwotCX0KLQotCS8qCi0JICogSW50ZXJjZXB0IEJSQ01GX0NfU0VUX0tFWSBJT0NUTCAtIHNlcmlhbGl6ZSBNNCBzZW5kIGFuZAotCSAqIHNldCBrZXkgSU9DVEwgdG8gcHJldmVudCBNNCBlbmNyeXB0aW9uLgotCSAqLwotCWlzX3NldF9rZXlfY21kID0gKChpb2MuY21kID09IEJSQ01GX0NfU0VUX0tFWSkgfHwKLQkJCSAgKChpb2MuY21kID09IEJSQ01GX0NfU0VUX1ZBUikgJiYKLQkJCSAgICEoc3RybmNtcCgid3NlY19rZXkiLCBpb2MuYnVmLCA5KSkpIHx8Ci0JCQkgICgoaW9jLmNtZCA9PSBCUkNNRl9DX1NFVF9WQVIpICYmCi0JCQkgICAhKHN0cm5jbXAoImJzc2NmZzp3c2VjX2tleSIsIGlvYy5idWYsIDE1KSkpKTsKLQlpZiAoaXNfc2V0X2tleV9jbWQpCi0JCWJyY21mX25ldGRldl93YWl0X3BlbmQ4MDIxeChuZXQpOwotCi0JYmNtZXJyb3IgPQotCSAgICBicmNtZl9wcm90b19pb2N0bCgmZHJ2cl9wcml2LT5wdWIsIGlmaWR4LCAoc3RydWN0IGJyY21mX2lvY3RsICopJmlvYywKLQkJCSAgICAgIGJ1ZiwgYnVmbGVuKTsKLQotZG9uZToKLQlpZiAoIWJjbWVycm9yICYmIGJ1ZiAmJiBpb2MuYnVmKSB7Ci0JCWlmIChjb3B5X3RvX3VzZXIoaW9jLmJ1ZiwgYnVmLCBidWZsZW4pKQotCQkJYmNtZXJyb3IgPSAtRUZBVUxUOwotCX0KLQotCWtmcmVlKGJ1Zik7Ci0KLQlpZiAoYmNtZXJyb3IgPiAwKQotCQliY21lcnJvciA9IDA7Ci0KLQlyZXR1cm4gYmNtZXJyb3I7Ci19Ci0KLXN0YXRpYyBpbnQgYnJjbWZfbmV0ZGV2X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKLXsKLSNpZiAhZGVmaW5lZChJR05PUkVfRVRIMF9ET1dOKQotCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYgPSAqKHN0cnVjdCBicmNtZl9pbmZvICoqKSBuZXRkZXZfcHJpdihuZXQpOwotCi0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0JYnJjbWZfY2ZnODAyMTFfZG93bigpOwotCWlmIChkcnZyX3ByaXYtPnB1Yi51cCA9PSAwKQotCQlyZXR1cm4gMDsKLQotCS8qIFNldCBzdGF0ZSBhbmQgc3RvcCBPUyB0cmFuc21pc3Npb25zICovCi0JZHJ2cl9wcml2LT5wdWIudXAgPSAwOwotCW5ldGlmX3N0b3BfcXVldWUobmV0KTsKLSNlbHNlCi0JQlJDTUZfRVJST1IoKCJCWVBBU1MgJXM6ZHVlIHRvIEJSQ00gY29tcGlsYXRpb246IHVuZGVyIGludmVzdGlnYXRpb25cbiIsCi0JCSAgICAgX19mdW5jX18pKTsKLSNlbmRpZgkJCQkvKiAhZGVmaW5lZChJR05PUkVfRVRIMF9ET1dOKSAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYnJjbWZfbmV0ZGV2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldCkKLXsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gKihzdHJ1Y3QgYnJjbWZfaW5mbyAqKikgbmV0ZGV2X3ByaXYobmV0KTsKLQl1MzIgdG9lX29sOwotCWludCBpZmlkeCA9IGJyY21mX25ldDJpZHgoZHJ2cl9wcml2LCBuZXQpOwotCXMzMiByZXQgPSAwOwotCi0JQlJDTUZfVFJBQ0UoKCIlczogaWZpZHggJWRcbiIsIF9fZnVuY19fLCBpZmlkeCkpOwotCi0JaWYgKGlmaWR4ID09IDApIHsJLyogZG8gaXQgb25seSBmb3IgcHJpbWFyeSBldGgwICovCi0KLQkJLyogdHJ5IHRvIGJyaW5nIHVwIGJ1cyAqLwotCQlyZXQgPSBicmNtZl9idXNfc3RhcnQoJmRydnJfcHJpdi0+cHViKTsKLQkJaWYgKHJldCAhPSAwKSB7Ci0JCQlCUkNNRl9FUlJPUigoIiVzOiBmYWlsZWQgd2l0aCBjb2RlICVkXG4iLAotCQkJCSAgICAgX19mdW5jX18sIHJldCkpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCWF0b21pY19zZXQoJmRydnJfcHJpdi0+cGVuZF84MDIxeF9jbnQsIDApOwotCi0JCW1lbWNweShuZXQtPmRldl9hZGRyLCBkcnZyX3ByaXYtPnB1Yi5tYWMsIEVUSF9BTEVOKTsKLQotCQkvKiBHZXQgY3VycmVudCBUT0UgbW9kZSBmcm9tIGRvbmdsZSAqLwotCQlpZiAoYnJjbWZfdG9lX2dldChkcnZyX3ByaXYsIGlmaWR4LCAmdG9lX29sKSA+PSAwCi0JCSAgICAmJiAodG9lX29sICYgVE9FX1RYX0NTVU1fT0wpICE9IDApCi0JCQlkcnZyX3ByaXYtPmlmbGlzdFtpZmlkeF0tPm5ldC0+ZmVhdHVyZXMgfD0KLQkJCQlORVRJRl9GX0lQX0NTVU07Ci0JCWVsc2UKLQkJCWRydnJfcHJpdi0+aWZsaXN0W2lmaWR4XS0+bmV0LT5mZWF0dXJlcyAmPQotCQkJCX5ORVRJRl9GX0lQX0NTVU07Ci0JfQotCS8qIEFsbG93IHRyYW5zbWl0IGNhbGxzICovCi0JbmV0aWZfc3RhcnRfcXVldWUobmV0KTsKLQlkcnZyX3ByaXYtPnB1Yi51cCA9IDE7Ci0JaWYgKHVubGlrZWx5KGJyY21mX2NmZzgwMjExX3VwKCkpKSB7Ci0JCUJSQ01GX0VSUk9SKCgiJXM6IGZhaWxlZCB0byBicmluZyB1cCBjZmc4MDIxMVxuIiwKLQkJCSAgICAgX19mdW5jX18pKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLWludAotYnJjbWZfYWRkX2lmKHN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYsIGludCBpZmlkeCwgdm9pZCAqaGFuZGxlLCBjaGFyICpuYW1lLAotCSAgIHU4ICptYWNfYWRkciwgdTMyIGZsYWdzLCB1OCBic3NpZHgpCi17Ci0Jc3RydWN0IGJyY21mX2lmICppZnA7Ci0KLQlCUkNNRl9UUkFDRSgoIiVzOiBpZHggJWQsIGhhbmRsZS0+JXBcbiIsIF9fZnVuY19fLCBpZmlkeCwgaGFuZGxlKSk7Ci0KLQlpZnAgPSBkcnZyX3ByaXYtPmlmbGlzdFtpZmlkeF07Ci0JaWYgKCFpZnApIHsKLQkJaWZwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGJyY21mX2lmKSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghaWZwKSB7Ci0JCQlCUkNNRl9FUlJPUigoIiVzOiBPT00gLSBzdHJ1Y3QgYnJjbWZfaWZcbiIsIF9fZnVuY19fKSk7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCX0KLQotCW1lbXNldChpZnAsIDAsIHNpemVvZihzdHJ1Y3QgYnJjbWZfaWYpKTsKLQlpZnAtPmluZm8gPSBkcnZyX3ByaXY7Ci0JZHJ2cl9wcml2LT5pZmxpc3RbaWZpZHhdID0gaWZwOwotCXN0cmxjcHkoaWZwLT5uYW1lLCBuYW1lLCBJRk5BTVNJWik7Ci0JaWYgKG1hY19hZGRyICE9IE5VTEwpCi0JCW1lbWNweSgmaWZwLT5tYWNfYWRkciwgbWFjX2FkZHIsIEVUSF9BTEVOKTsKLQotCWlmIChoYW5kbGUgPT0gTlVMTCkgewotCQlpZnAtPnN0YXRlID0gQlJDTUZfRV9JRl9BREQ7Ci0JCWlmcC0+aWR4ID0gaWZpZHg7Ci0JCXVwKCZkcnZyX3ByaXYtPnN5c2lvY19zZW0pOwotCX0gZWxzZQotCQlpZnAtPm5ldCA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWhhbmRsZTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIGJyY21mX2RlbF9pZihzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2LCBpbnQgaWZpZHgpCi17Ci0Jc3RydWN0IGJyY21mX2lmICppZnA7Ci0KLQlCUkNNRl9UUkFDRSgoIiVzOiBpZHggJWRcbiIsIF9fZnVuY19fLCBpZmlkeCkpOwotCi0JaWZwID0gZHJ2cl9wcml2LT5pZmxpc3RbaWZpZHhdOwotCWlmICghaWZwKSB7Ci0JCUJSQ01GX0VSUk9SKCgiJXM6IE51bGwgaW50ZXJmYWNlXG4iLCBfX2Z1bmNfXykpOwotCQlyZXR1cm47Ci0JfQotCi0JaWZwLT5zdGF0ZSA9IEJSQ01GX0VfSUZfREVMOwotCWlmcC0+aWR4ID0gaWZpZHg7Ci0JdXAoJmRydnJfcHJpdi0+c3lzaW9jX3NlbSk7Ci19Ci0KLXN0cnVjdCBicmNtZl9wdWIgKmJyY21mX2F0dGFjaChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHVpbnQgYnVzX2hkcmxlbikKLXsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gTlVMTDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0OwotCi0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQkvKiBBbGxvY2F0ZSBldGhlcmRldiwgaW5jbHVkaW5nIHNwYWNlIGZvciBwcml2YXRlIHN0cnVjdHVyZSAqLwotCW5ldCA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihkcnZyX3ByaXYpKTsKLQlpZiAoIW5ldCkgewotCQlCUkNNRl9FUlJPUigoIiVzOiBPT00gLSBhbGxvY19ldGhlcmRldlxuIiwgX19mdW5jX18pKTsKLQkJZ290byBmYWlsOwotCX0KLQotCS8qIEFsbG9jYXRlIHByaW1hcnkgYnJjbWZfaW5mbyAqLwotCWRydnJfcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicmNtZl9pbmZvKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFkcnZyX3ByaXYpIHsKLQkJQlJDTUZfRVJST1IoKCIlczogT09NIC0gYWxsb2MgYnJjbWZfaW5mb1xuIiwgX19mdW5jX18pKTsKLQkJZ290byBmYWlsOwotCX0KLQotCS8qCi0JICogU2F2ZSB0aGUgYnJjbWZfaW5mbyBpbnRvIHRoZSBwcml2Ci0JICovCi0JbWVtY3B5KG5ldGRldl9wcml2KG5ldCksICZkcnZyX3ByaXYsIHNpemVvZihkcnZyX3ByaXYpKTsKLQotCS8qIFNldCBuZXR3b3JrIGludGVyZmFjZSBuYW1lIGlmIGl0IHdhcyBwcm92aWRlZCBhcyBtb2R1bGUgcGFyYW1ldGVyICovCi0JaWYgKGlmYWNlX25hbWVbMF0pIHsKLQkJaW50IGxlbjsKLQkJY2hhciBjaDsKLQkJc3RybmNweShuZXQtPm5hbWUsIGlmYWNlX25hbWUsIElGTkFNU0laKTsKLQkJbmV0LT5uYW1lW0lGTkFNU0laIC0gMV0gPSAwOwotCQlsZW4gPSBzdHJsZW4obmV0LT5uYW1lKTsKLQkJY2ggPSBuZXQtPm5hbWVbbGVuIC0gMV07Ci0JCWlmICgoY2ggPiAnOScgfHwgY2ggPCAnMCcpICYmIChsZW4gPCBJRk5BTVNJWiAtIDIpKQotCQkJc3RyY2F0KG5ldC0+bmFtZSwgIiVkIik7Ci0JfQotCi0JaWYgKGJyY21mX2FkZF9pZihkcnZyX3ByaXYsIDAsICh2b2lkICopbmV0LCBuZXQtPm5hbWUsIE5VTEwsIDAsIDApID09Ci0JICAgIEJSQ01GX0JBRF9JRikKLQkJZ290byBmYWlsOwotCi0JbmV0LT5uZXRkZXZfb3BzID0gTlVMTDsKLQlzZW1hX2luaXQoJmRydnJfcHJpdi0+cHJvdG9fc2VtLCAxKTsKLQkvKiBJbml0aWFsaXplIG90aGVyIHN0cnVjdHVyZSBjb250ZW50ICovCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmZHJ2cl9wcml2LT5pb2N0bF9yZXNwX3dhaXQpOwotCi0JLyogTGluayB0byBpbmZvIG1vZHVsZSAqLwotCWRydnJfcHJpdi0+cHViLmluZm8gPSBkcnZyX3ByaXY7Ci0KLQkvKiBMaW5rIHRvIGJ1cyBtb2R1bGUgKi8KLQlkcnZyX3ByaXYtPnB1Yi5idXMgPSBidXM7Ci0JZHJ2cl9wcml2LT5wdWIuaGRybGVuID0gYnVzX2hkcmxlbjsKLQotCS8qIEF0dGFjaCBhbmQgbGluayBpbiB0aGUgcHJvdG9jb2wgKi8KLQlpZiAoYnJjbWZfcHJvdG9fYXR0YWNoKCZkcnZyX3ByaXYtPnB1YikgIT0gMCkgewotCQlCUkNNRl9FUlJPUigoImJyY21mX3Byb3RfYXR0YWNoIGZhaWxlZFxuIikpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogQXR0YWNoIGFuZCBsaW5rIGluIHRoZSBjZmc4MDIxMSAqLwotCWlmICh1bmxpa2VseShicmNtZl9jZmc4MDIxMV9hdHRhY2gobmV0LCAmZHJ2cl9wcml2LT5wdWIpKSkgewotCQlCUkNNRl9FUlJPUigoIndsX2NmZzgwMjExX2F0dGFjaCBmYWlsZWRcbiIpKTsKLQkJZ290byBmYWlsOwotCX0KLQotCWlmIChicmNtZl9zeXNpb2MpIHsKLQkJc2VtYV9pbml0KCZkcnZyX3ByaXYtPnN5c2lvY19zZW0sIDApOwotCQlkcnZyX3ByaXYtPnN5c2lvY190c2sgPSBrdGhyZWFkX3J1bihfYnJjbWZfc3lzaW9jX3RocmVhZCwgZHJ2cl9wcml2LAotCQkJCQkJIl9icmNtZl9zeXNpb2MiKTsKLQkJaWYgKElTX0VSUihkcnZyX3ByaXYtPnN5c2lvY190c2spKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkJIl9icmNtZl9zeXNpb2MgdGhyZWFkIGZhaWxlZCB0byBzdGFydFxuIik7Ci0JCQlkcnZyX3ByaXYtPnN5c2lvY190c2sgPSBOVUxMOwotCQl9Ci0JfSBlbHNlCi0JCWRydnJfcHJpdi0+c3lzaW9jX3RzayA9IE5VTEw7Ci0KLQkvKgotCSAqIFNhdmUgdGhlIGJyY21mX2luZm8gaW50byB0aGUgcHJpdgotCSAqLwotCW1lbWNweShuZXRkZXZfcHJpdihuZXQpLCAmZHJ2cl9wcml2LCBzaXplb2YoZHJ2cl9wcml2KSk7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19QTV9TTEVFUCkKLQlhdG9taWNfc2V0KCZicmNtZl9tbWNfc3VzcGVuZCwgZmFsc2UpOwotI2VuZGlmCS8qIGRlZmluZWQoQ09ORklHX1BNX1NMRUVQKSAqLwotCXJldHVybiAmZHJ2cl9wcml2LT5wdWI7Ci0KLWZhaWw6Ci0JaWYgKG5ldCkKLQkJZnJlZV9uZXRkZXYobmV0KTsKLQlpZiAoZHJ2cl9wcml2KQotCQlicmNtZl9kZXRhY2goJmRydnJfcHJpdi0+cHViKTsKLQotCXJldHVybiBOVUxMOwotfQotCi1pbnQgYnJjbWZfYnVzX3N0YXJ0KHN0cnVjdCBicmNtZl9wdWIgKmRydnIpCi17Ci0JaW50IHJldCA9IC0xOwotCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYgPSBkcnZyLT5pbmZvOwotCS8qIFJvb20gZm9yICJldmVudF9tc2dzIiArICdcMCcgKyBiaXR2ZWMgKi8KLQljaGFyIGlvdmJ1ZltCUkNNRl9FVkVOVElOR19NQVNLX0xFTiArIDEyXTsKLQotCUJSQ01GX1RSQUNFKCgiJXM6XG4iLCBfX2Z1bmNfXykpOwotCi0JLyogQnJpbmcgdXAgdGhlIGJ1cyAqLwotCXJldCA9IGJyY21mX3NkYnJjbV9idXNfaW5pdCgmZHJ2cl9wcml2LT5wdWIsIHRydWUpOwotCWlmIChyZXQgIT0gMCkgewotCQlCUkNNRl9FUlJPUigoIiVzLCBicmNtZl9zZGJyY21fYnVzX2luaXQgZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywKLQkJCSAgICAgcmV0KSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogSWYgYnVzIGlzIG5vdCByZWFkeSwgY2FuJ3QgY29tZSB1cCAqLwotCWlmIChkcnZyX3ByaXYtPnB1Yi5idXNzdGF0ZSAhPSBCUkNNRl9CVVNfREFUQSkgewotCQlCUkNNRl9FUlJPUigoIiVzIGZhaWxlZCBidXMgaXMgbm90IHJlYWR5XG4iLCBfX2Z1bmNfXykpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlicmNtdV9ta2lvdmFyKCJldmVudF9tc2dzIiwgZHJ2ci0+ZXZlbnRtYXNrLCBCUkNNRl9FVkVOVElOR19NQVNLX0xFTiwKLQkJICAgICAgaW92YnVmLCBzaXplb2YoaW92YnVmKSk7Ci0JYnJjbWZfcHJvdG9fY2RjX3F1ZXJ5X2lvY3RsKGRydnIsIDAsIEJSQ01GX0NfR0VUX1ZBUiwgaW92YnVmLAotCQkJCSAgICBzaXplb2YoaW92YnVmKSk7Ci0JbWVtY3B5KGRydnItPmV2ZW50bWFzaywgaW92YnVmLCBCUkNNRl9FVkVOVElOR19NQVNLX0xFTik7Ci0KLQlzZXRiaXQoZHJ2ci0+ZXZlbnRtYXNrLCBCUkNNRl9FX1NFVF9TU0lEKTsKLQlzZXRiaXQoZHJ2ci0+ZXZlbnRtYXNrLCBCUkNNRl9FX1BSVU5FKTsKLQlzZXRiaXQoZHJ2ci0+ZXZlbnRtYXNrLCBCUkNNRl9FX0FVVEgpOwotCXNldGJpdChkcnZyLT5ldmVudG1hc2ssIEJSQ01GX0VfUkVBU1NPQyk7Ci0Jc2V0Yml0KGRydnItPmV2ZW50bWFzaywgQlJDTUZfRV9SRUFTU09DX0lORCk7Ci0Jc2V0Yml0KGRydnItPmV2ZW50bWFzaywgQlJDTUZfRV9ERUFVVEhfSU5EKTsKLQlzZXRiaXQoZHJ2ci0+ZXZlbnRtYXNrLCBCUkNNRl9FX0RJU0FTU09DX0lORCk7Ci0Jc2V0Yml0KGRydnItPmV2ZW50bWFzaywgQlJDTUZfRV9ESVNBU1NPQyk7Ci0Jc2V0Yml0KGRydnItPmV2ZW50bWFzaywgQlJDTUZfRV9KT0lOKTsKLQlzZXRiaXQoZHJ2ci0+ZXZlbnRtYXNrLCBCUkNNRl9FX0FTU09DX0lORCk7Ci0Jc2V0Yml0KGRydnItPmV2ZW50bWFzaywgQlJDTUZfRV9QU0tfU1VQKTsKLQlzZXRiaXQoZHJ2ci0+ZXZlbnRtYXNrLCBCUkNNRl9FX0xJTkspOwotCXNldGJpdChkcnZyLT5ldmVudG1hc2ssIEJSQ01GX0VfTkRJU19MSU5LKTsKLQlzZXRiaXQoZHJ2ci0+ZXZlbnRtYXNrLCBCUkNNRl9FX01JQ19FUlJPUik7Ci0Jc2V0Yml0KGRydnItPmV2ZW50bWFzaywgQlJDTUZfRV9QTUtJRF9DQUNIRSk7Ci0Jc2V0Yml0KGRydnItPmV2ZW50bWFzaywgQlJDTUZfRV9UWEZBSUwpOwotCXNldGJpdChkcnZyLT5ldmVudG1hc2ssIEJSQ01GX0VfSk9JTl9TVEFSVCk7Ci0Jc2V0Yml0KGRydnItPmV2ZW50bWFzaywgQlJDTUZfRV9TQ0FOX0NPTVBMRVRFKTsKLQotLyogZW5hYmxlIGRvbmdsZSByb2FtaW5nIGV2ZW50ICovCi0KLQlkcnZyLT5wa3RmaWx0ZXJfY291bnQgPSAxOwotCS8qIFNldHVwIGZpbHRlciB0byBhbGxvdyBvbmx5IHVuaWNhc3QgKi8KLQlkcnZyLT5wa3RmaWx0ZXJbMF0gPSAiMTAwIDAgMCAwIDB4MDEgMHgwMCI7Ci0KLQkvKiBCdXMgaXMgcmVhZHksIGRvIGFueSBwcm90b2NvbCBpbml0aWFsaXphdGlvbiAqLwotCXJldCA9IGJyY21mX3Byb3RvX2luaXQoJmRydnJfcHJpdi0+cHViKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGJyY21mX25ldGRldl9vcHNfcHJpID0gewotCS5uZG9fb3BlbiA9IGJyY21mX25ldGRldl9vcGVuLAotCS5uZG9fc3RvcCA9IGJyY21mX25ldGRldl9zdG9wLAotCS5uZG9fZ2V0X3N0YXRzID0gYnJjbWZfbmV0ZGV2X2dldF9zdGF0cywKLQkubmRvX2RvX2lvY3RsID0gYnJjbWZfbmV0ZGV2X2lvY3RsX2VudHJ5LAotCS5uZG9fc3RhcnRfeG1pdCA9IGJyY21mX25ldGRldl9zdGFydF94bWl0LAotCS5uZG9fc2V0X21hY19hZGRyZXNzID0gYnJjbWZfbmV0ZGV2X3NldF9tYWNfYWRkcmVzcywKLQkubmRvX3NldF9yeF9tb2RlID0gYnJjbWZfbmV0ZGV2X3NldF9tdWx0aWNhc3RfbGlzdCwKLX07Ci0KLWludCBicmNtZl9uZXRfYXR0YWNoKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZmlkeCkKLXsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gZHJ2ci0+aW5mbzsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0OwotCXU4IHRlbXBfYWRkcltFVEhfQUxFTl0gPSB7Ci0JCTB4MDAsIDB4OTAsIDB4NGMsIDB4MTEsIDB4MjIsIDB4MzN9OwotCi0JQlJDTUZfVFJBQ0UoKCIlczogaWZpZHggJWRcbiIsIF9fZnVuY19fLCBpZmlkeCkpOwotCi0JbmV0ID0gZHJ2cl9wcml2LT5pZmxpc3RbaWZpZHhdLT5uZXQ7Ci0JbmV0LT5uZXRkZXZfb3BzID0gJmJyY21mX25ldGRldl9vcHNfcHJpOwotCi0JLyoKLQkgKiBXZSBoYXZlIHRvIHVzZSB0aGUgcHJpbWFyeSBNQUMgZm9yIHZpcnR1YWwgaW50ZXJmYWNlcwotCSAqLwotCWlmIChpZmlkeCAhPSAwKSB7Ci0JCS8qIGZvciB2aXJ0dWFsIGludGVyZmFjZXMgdXNlIHRoZSBwcmltYXJ5IE1BQyAgKi8KLQkJbWVtY3B5KHRlbXBfYWRkciwgZHJ2cl9wcml2LT5wdWIubWFjLCBFVEhfQUxFTik7Ci0KLQl9Ci0KLQlpZiAoaWZpZHggPT0gMSkgewotCQlCUkNNRl9UUkFDRSgoIiVzIEFDQ0VTUyBQT0lOVCBNQUM6XG4iLCBfX2Z1bmNfXykpOwotCQkvKiAgQUNDRVNTUE9JTlQgSU5URVJGQUNFIENBU0UgKi8KLQkJdGVtcF9hZGRyWzBdIHw9IDBYMDI7CS8qIHNldCBiaXQgMiAsCi0JCQkgLSBMb2NhbGx5IEFkbWluaXN0ZXJlZCBhZGRyZXNzICAqLwotCi0JfQotCW5ldC0+aGFyZF9oZWFkZXJfbGVuID0gRVRIX0hMRU4gKyBkcnZyX3ByaXYtPnB1Yi5oZHJsZW47Ci0JbmV0LT5ldGh0b29sX29wcyA9ICZicmNtZl9ldGh0b29sX29wczsKLQotCWRydnJfcHJpdi0+cHViLnJ4c3ogPSBuZXQtPm10dSArIG5ldC0+aGFyZF9oZWFkZXJfbGVuICsKLQkJCQlkcnZyX3ByaXYtPnB1Yi5oZHJsZW47Ci0KLQltZW1jcHkobmV0LT5kZXZfYWRkciwgdGVtcF9hZGRyLCBFVEhfQUxFTik7Ci0KLQlpZiAocmVnaXN0ZXJfbmV0ZGV2KG5ldCkgIT0gMCkgewotCQlCUkNNRl9FUlJPUigoIiVzOiBjb3VsZG4ndCByZWdpc3RlciB0aGUgbmV0IGRldmljZVxuIiwKLQkJCSAgICAgX19mdW5jX18pKTsKLQkJZ290byBmYWlsOwotCX0KLQotCUJSQ01GX0lORk8oKCIlczogQnJvYWRjb20gRG9uZ2xlIEhvc3QgRHJpdmVyXG4iLCBuZXQtPm5hbWUpKTsKLQotCXJldHVybiAwOwotCi1mYWlsOgotCW5ldC0+bmV0ZGV2X29wcyA9IE5VTEw7Ci0JcmV0dXJuIC1FQkFERTsKLX0KLQotc3RhdGljIHZvaWQgYnJjbWZfYnVzX2RldGFjaChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyKQotewotCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXY7Ci0KLQlCUkNNRl9UUkFDRSgoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKLQotCWlmIChkcnZyKSB7Ci0JCWRydnJfcHJpdiA9IGRydnItPmluZm87Ci0JCWlmIChkcnZyX3ByaXYpIHsKLQkJCS8qIFN0b3AgdGhlIHByb3RvY29sIG1vZHVsZSAqLwotCQkJYnJjbWZfcHJvdG9fc3RvcCgmZHJ2cl9wcml2LT5wdWIpOwotCi0JCQkvKiBTdG9wIHRoZSBidXMgbW9kdWxlICovCi0JCQlicmNtZl9zZGJyY21fYnVzX3N0b3AoZHJ2cl9wcml2LT5wdWIuYnVzLCB0cnVlKTsKLQkJfQotCX0KLX0KLQotdm9pZCBicmNtZl9kZXRhY2goc3RydWN0IGJyY21mX3B1YiAqZHJ2cikKLXsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2OwotCi0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQlpZiAoZHJ2cikgewotCQlkcnZyX3ByaXYgPSBkcnZyLT5pbmZvOwotCQlpZiAoZHJ2cl9wcml2KSB7Ci0JCQlzdHJ1Y3QgYnJjbWZfaWYgKmlmcDsKLQkJCWludCBpOwotCi0JCQlmb3IgKGkgPSAxOyBpIDwgQlJDTUZfTUFYX0lGUzsgaSsrKQotCQkJCWlmIChkcnZyX3ByaXYtPmlmbGlzdFtpXSkKLQkJCQkJYnJjbWZfZGVsX2lmKGRydnJfcHJpdiwgaSk7Ci0KLQkJCWlmcCA9IGRydnJfcHJpdi0+aWZsaXN0WzBdOwotCQkJaWYgKGlmcC0+bmV0LT5uZXRkZXZfb3BzID09ICZicmNtZl9uZXRkZXZfb3BzX3ByaSkgewotCQkJCWJyY21mX25ldGRldl9zdG9wKGlmcC0+bmV0KTsKLQkJCQl1bnJlZ2lzdGVyX25ldGRldihpZnAtPm5ldCk7Ci0JCQl9Ci0KLQkJCWlmIChkcnZyX3ByaXYtPnN5c2lvY190c2spIHsKLQkJCQlzZW5kX3NpZyhTSUdURVJNLCBkcnZyX3ByaXYtPnN5c2lvY190c2ssIDEpOwotCQkJCWt0aHJlYWRfc3RvcChkcnZyX3ByaXYtPnN5c2lvY190c2spOwotCQkJCWRydnJfcHJpdi0+c3lzaW9jX3RzayA9IE5VTEw7Ci0JCQl9Ci0KLQkJCWJyY21mX2J1c19kZXRhY2goZHJ2cik7Ci0KLQkJCWlmIChkcnZyLT5wcm90KQotCQkJCWJyY21mX3Byb3RvX2RldGFjaChkcnZyKTsKLQotCQkJYnJjbWZfY2ZnODAyMTFfZGV0YWNoKCk7Ci0KLQkJCWZyZWVfbmV0ZGV2KGlmcC0+bmV0KTsKLQkJCWtmcmVlKGlmcCk7Ci0JCQlrZnJlZShkcnZyX3ByaXYpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYnJjbWZfbW9kdWxlX2NsZWFudXAodm9pZCkKLXsKLQlCUkNNRl9UUkFDRSgoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKLQotCWJyY21mX2J1c191bnJlZ2lzdGVyKCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGJyY21mX21vZHVsZV9pbml0KHZvaWQpCi17Ci0JaW50IGVycm9yOwotCi0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQllcnJvciA9IGJyY21mX2J1c19yZWdpc3RlcigpOwotCi0JaWYgKGVycm9yKSB7Ci0JCUJSQ01GX0VSUk9SKCgiJXM6IGJyY21mX2J1c19yZWdpc3RlciBmYWlsZWRcbiIsIF9fZnVuY19fKSk7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQlyZXR1cm4gMDsKLQotZmFpbGVkOgotCXJldHVybiAtRUlOVkFMOwotfQotCi1tb2R1bGVfaW5pdChicmNtZl9tb2R1bGVfaW5pdCk7Ci1tb2R1bGVfZXhpdChicmNtZl9tb2R1bGVfY2xlYW51cCk7Ci0KLWludCBicmNtZl9vc19wcm90b19ibG9jayhzdHJ1Y3QgYnJjbWZfcHViICpkcnZyKQotewotCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYgPSBkcnZyLT5pbmZvOwotCi0JaWYgKGRydnJfcHJpdikgewotCQlkb3duKCZkcnZyX3ByaXYtPnByb3RvX3NlbSk7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGJyY21mX29zX3Byb3RvX3VuYmxvY2soc3RydWN0IGJyY21mX3B1YiAqZHJ2cikKLXsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gZHJ2ci0+aW5mbzsKLQotCWlmIChkcnZyX3ByaXYpIHsKLQkJdXAoJmRydnJfcHJpdi0+cHJvdG9fc2VtKTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIGludCBicmNtZl9vc19nZXRfaW9jdGxfcmVzcF90aW1lb3V0KHZvaWQpCi17Ci0JcmV0dXJuICh1bnNpZ25lZCBpbnQpYnJjbWZfaW9jdGxfdGltZW91dF9tc2VjOwotfQotCi12b2lkIGJyY21mX29zX3NldF9pb2N0bF9yZXNwX3RpbWVvdXQodW5zaWduZWQgaW50IHRpbWVvdXRfbXNlYykKLXsKLQlicmNtZl9pb2N0bF90aW1lb3V0X21zZWMgPSAoaW50KXRpbWVvdXRfbXNlYzsKLX0KLQotaW50IGJyY21mX29zX2lvY3RsX3Jlc3Bfd2FpdChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCB1aW50ICpjb25kaXRpb24sCi0JCQkgICAgIGJvb2wgKnBlbmRpbmcpCi17Ci0Jc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9IGRydnItPmluZm87Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0JaW50IHRpbWVvdXQgPSBicmNtZl9pb2N0bF90aW1lb3V0X21zZWM7Ci0KLQkvKiBDb252ZXJ0IHRpbWVvdXQgaW4gbWlsbHNlY29uZCB0byBqaWZmaWVzICovCi0JdGltZW91dCA9IHRpbWVvdXQgKiBIWiAvIDEwMDA7Ci0KLQkvKiBXYWl0IHVudGlsIGNvbnRyb2wgZnJhbWUgaXMgYXZhaWxhYmxlICovCi0JYWRkX3dhaXRfcXVldWUoJmRydnJfcHJpdi0+aW9jdGxfcmVzcF93YWl0LCAmd2FpdCk7Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQotCXdoaWxlICghKCpjb25kaXRpb24pICYmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgJiYgdGltZW91dCkpCi0JCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOwotCi0JaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkqcGVuZGluZyA9IHRydWU7Ci0KLQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCXJlbW92ZV93YWl0X3F1ZXVlKCZkcnZyX3ByaXYtPmlvY3RsX3Jlc3Bfd2FpdCwgJndhaXQpOwotCi0JcmV0dXJuIHRpbWVvdXQ7Ci19Ci0KLWludCBicmNtZl9vc19pb2N0bF9yZXNwX3dha2Uoc3RydWN0IGJyY21mX3B1YiAqZHJ2cikKLXsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gZHJ2ci0+aW5mbzsKLQotCWlmICh3YWl0cXVldWVfYWN0aXZlKCZkcnZyX3ByaXYtPmlvY3RsX3Jlc3Bfd2FpdCkpCi0JCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZHJ2cl9wcml2LT5pb2N0bF9yZXNwX3dhaXQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYnJjbWZfaG9zdF9ldmVudChzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2LCBpbnQgKmlmaWR4LCB2b2lkICpwa3RkYXRhLAotCQkJICAgIHN0cnVjdCBicmNtZl9ldmVudF9tc2cgKmV2ZW50LCB2b2lkICoqZGF0YSkKLXsKLQlpbnQgYmNtZXJyb3IgPSAwOwotCi0JYmNtZXJyb3IgPSBicmNtZl9jX2hvc3RfZXZlbnQoZHJ2cl9wcml2LCBpZmlkeCwgcGt0ZGF0YSwgZXZlbnQsIGRhdGEpOwotCWlmIChiY21lcnJvciAhPSAwKQotCQlyZXR1cm4gYmNtZXJyb3I7Ci0KLQlpZiAoZHJ2cl9wcml2LT5pZmxpc3RbKmlmaWR4XS0+bmV0KQotCQlicmNtZl9jZmc4MDIxMV9ldmVudChkcnZyX3ByaXYtPmlmbGlzdFsqaWZpZHhdLT5uZXQsCi0JCQkJICAgICBldmVudCwgKmRhdGEpOwotCi0JcmV0dXJuIGJjbWVycm9yOwotfQotCi1pbnQgYnJjbWZfbmV0ZGV2X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGZsYWcpCi17Ci0Jc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9ICooc3RydWN0IGJyY21mX2luZm8gKiopbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWJyY21mX2J1c19kZXZyZXNldCgmZHJ2cl9wcml2LT5wdWIsIGZsYWcpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgYnJjbWZfZ2V0X3BlbmRfODAyMXhfY250KHN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYpCi17Ci0JcmV0dXJuIGF0b21pY19yZWFkKCZkcnZyX3ByaXYtPnBlbmRfODAyMXhfY250KTsKLX0KLQotI2RlZmluZSBNQVhfV0FJVF9GT1JfODAyMVhfVFgJMTAKLQotaW50IGJyY21mX25ldGRldl93YWl0X3BlbmQ4MDIxeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYgPSAqKHN0cnVjdCBicmNtZl9pbmZvICoqKW5ldGRldl9wcml2KGRldik7Ci0JaW50IHRpbWVvdXQgPSAxMCAqIEhaIC8gMTAwMDsKLQlpbnQgbnRpbWVzID0gTUFYX1dBSVRfRk9SXzgwMjFYX1RYOwotCWludCBwZW5kID0gYnJjbWZfZ2V0X3BlbmRfODAyMXhfY250KGRydnJfcHJpdik7Ci0KLQl3aGlsZSAobnRpbWVzICYmIHBlbmQpIHsKLQkJaWYgKHBlbmQpIHsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQlzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOwotCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQkJCW50aW1lcy0tOwotCQl9Ci0JCXBlbmQgPSBicmNtZl9nZXRfcGVuZF84MDIxeF9jbnQoZHJ2cl9wcml2KTsKLQl9Ci0JcmV0dXJuIHBlbmQ7Ci19Ci0KLSNpZmRlZiBCQ01EQkcKLWludCBicmNtZl93cml0ZV90b19maWxlKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIHU4ICpidWYsIGludCBzaXplKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBmaWxlICpmcDsKLQltbV9zZWdtZW50X3Qgb2xkX2ZzOwotCWxvZmZfdCBwb3MgPSAwOwotCi0JLyogY2hhbmdlIHRvIEtFUk5FTF9EUyBhZGRyZXNzIGxpbWl0ICovCi0Jb2xkX2ZzID0gZ2V0X2ZzKCk7Ci0Jc2V0X2ZzKEtFUk5FTF9EUyk7Ci0KLQkvKiBvcGVuIGZpbGUgdG8gd3JpdGUgKi8KLQlmcCA9IGZpbHBfb3BlbigiL3RtcC9tZW1fZHVtcCIsIE9fV1JPTkxZIHwgT19DUkVBVCwgMDY0MCk7Ci0JaWYgKCFmcCkgewotCQlCUkNNRl9FUlJPUigoIiVzOiBvcGVuIGZpbGUgZXJyb3JcbiIsIF9fZnVuY19fKSk7Ci0JCXJldCA9IC0xOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogV3JpdGUgYnVmIHRvIGZpbGUgKi8KLQlmcC0+Zl9vcC0+d3JpdGUoZnAsIGJ1Ziwgc2l6ZSwgJnBvcyk7Ci0KLWV4aXQ6Ci0JLyogZnJlZSBidWYgYmVmb3JlIHJldHVybiAqLwotCWtmcmVlKGJ1Zik7Ci0JLyogY2xvc2UgZmlsZSBiZWZvcmUgcmV0dXJuICovCi0JaWYgKGZwKQotCQlmaWxwX2Nsb3NlKGZwLCBjdXJyZW50LT5maWxlcyk7Ci0JLyogcmVzdG9yZSBwcmV2aW91cyBhZGRyZXNzIGxpbWl0ICovCi0Jc2V0X2ZzKG9sZF9mcyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfcHJvdG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX3Byb3RvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNzg4YjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfcHJvdG8uaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmIF9CUkNNRl9QUk9UT19IXwotI2RlZmluZSBfQlJDTUZfUFJPVE9fSF8KLQotI2lmbmRlZiBJT0NUTF9SRVNQX1RJTUVPVVQKLSNkZWZpbmUgSU9DVExfUkVTUF9USU1FT1VUICAyMDAwCS8qIEluIG1pbGxpIHNlY29uZCAqLwotI2VuZGlmCi0KLSNpZm5kZWYgSU9DVExfQ0hJUF9BQ1RJVkVfVElNRU9VVAotI2RlZmluZSBJT0NUTF9DSElQX0FDVElWRV9USU1FT1VUICAxMAkvKiBJbiBtaWxsaSBzZWNvbmQgKi8KLSNlbmRpZgotCi0vKgotICogRXhwb3J0ZWQgZnJvbSB0aGUgYnJjbWYgcHJvdG9jb2wgbW9kdWxlIChicmNtZl9jZGMpCi0gKi8KLQotLyogTGlua2FnZSwgc2V0cyBwcm90IGxpbmsgYW5kIHVwZGF0ZXMgaGRybGVuIGluIHB1YiAqLwotZXh0ZXJuIGludCBicmNtZl9wcm90b19hdHRhY2goc3RydWN0IGJyY21mX3B1YiAqZHJ2cik7Ci0KLS8qIFVubGluaywgZnJlZXMgYWxsb2NhdGVkIHByb3RvY29sIG1lbW9yeSAoaW5jbHVkaW5nIGJyY21mX3Byb3RvKSAqLwotZXh0ZXJuIHZvaWQgYnJjbWZfcHJvdG9fZGV0YWNoKHN0cnVjdCBicmNtZl9wdWIgKmRydnIpOwotCi0vKiBJbml0aWFsaXplIHByb3RvY29sOiBzeW5jIHcvZG9uZ2xlIHN0YXRlLgotICogU2V0cyBkb25nbGUgbWVkaWEgaW5mbyAoaXN3bCwgZHJ2X3ZlcnNpb24sIG1hYyBhZGRyZXNzKS4KLSAqLwotZXh0ZXJuIGludCBicmNtZl9wcm90b19pbml0KHN0cnVjdCBicmNtZl9wdWIgKmRydnIpOwotCi0vKiBTdG9wIHByb3RvY29sOiBzeW5jIHcvZG9uZ2xlIHN0YXRlLiAqLwotZXh0ZXJuIHZvaWQgYnJjbWZfcHJvdG9fc3RvcChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyKTsKLQotLyogQWRkIGFueSBwcm90b2NvbC1zcGVjaWZpYyBkYXRhIGhlYWRlci4KLSAqIENhbGxlciBtdXN0IHJlc2VydmUgcHJvdF9oZHJsZW4gcHJlcGVuZCBzcGFjZS4KLSAqLwotZXh0ZXJuIHZvaWQgYnJjbWZfcHJvdG9faGRycHVzaChzdHJ1Y3QgYnJjbWZfcHViICosIGludCBpZmlkeCwKLQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqdHhwKTsKLQotLyogUmVtb3ZlIGFueSBwcm90b2NvbC1zcGVjaWZpYyBkYXRhIGhlYWRlci4gKi8KLWV4dGVybiBpbnQgYnJjbWZfcHJvdG9faGRycHVsbChzdHJ1Y3QgYnJjbWZfcHViICosIGludCAqaWZpZHgsCi0JCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnJ4cCk7Ci0KLS8qIFVzZSBwcm90b2NvbCB0byBpc3N1ZSBpb2N0bCB0byBkb25nbGUgKi8KLWV4dGVybiBpbnQgYnJjbWZfcHJvdG9faW9jdGwoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgaW50IGlmaWR4LAotCQkJICAgICBzdHJ1Y3QgYnJjbWZfaW9jdGwgKmlvYywgdm9pZCAqYnVmLCBpbnQgbGVuKTsKLQotLyogQWRkIHByb3QgZHVtcCBvdXRwdXQgdG8gYSBidWZmZXIgKi8KLWV4dGVybiB2b2lkIGJyY21mX3Byb3RvX2R1bXAoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwKLQkJCSAgICAgc3RydWN0IGJyY211X3N0cmJ1ZiAqc3RyYnVmKTsKLQotLyogVXBkYXRlIGxvY2FsIGNvcHkgb2YgZG9uZ2xlIHN0YXRpc3RpY3MgKi8KLWV4dGVybiB2b2lkIGJyY21mX3Byb3RvX2RzdGF0cyhzdHJ1Y3QgYnJjbWZfcHViICpkcnZyKTsKLQotZXh0ZXJuIGludCBicmNtZl9jX2lvY3RsKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIHN0cnVjdCBicmNtZl9jX2lvY3RsICppb2MsCi0JCQkgdm9pZCAqYnVmLCB1aW50IGJ1Zmxlbik7Ci0KLWV4dGVybiBpbnQgYnJjbWZfY19wcmVpbml0X2lvY3RscyhzdHJ1Y3QgYnJjbWZfcHViICpkcnZyKTsKLQotZXh0ZXJuIGludCBicmNtZl9wcm90b19jZGNfc2V0X2lvY3RsKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZmlkeCwKLQkJCQkgICAgIHVpbnQgY21kLCB2b2lkICpidWYsIHVpbnQgbGVuKTsKLQotI2VuZGlmCQkJCS8qIF9CUkNNRl9QUk9UT19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfc2Rpby5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy9kaGRfc2Rpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmE5NWI2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX3NkaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDY3NzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpby5oPgotI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2Z1bmMuaD4KLSNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KLSNpbmNsdWRlIDxkZWZzLmg+Ci0jaW5jbHVkZSA8YnJjbXVfd2lmaS5oPgotI2luY2x1ZGUgPGJyY211X3V0aWxzLmg+Ci0jaW5jbHVkZSA8YnJjbV9od19pZHMuaD4KLSNpbmNsdWRlIDxzb2MuaD4KLSNpbmNsdWRlICJzZGlvX2hvc3QuaCIKLQotLyogcmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyAqLwotI2lmbmRlZiBfX0JJR19FTkRJQU4KLSNpZm5kZWYgX19taXBzX18KLSNkZWZpbmUgUl9SRUcociwgdHlwKSBcCi0JYnJjbWZfc2RjYXJkX3JlZ19yZWFkKE5VTEwsIChyKSwgc2l6ZW9mKHR5cCkpCi0jZWxzZQkJCQkvKiBfX21pcHNfXyAqLwotI2RlZmluZSBSX1JFRyhyLCB0eXApIFwKLQkoeyBcCi0JCV9fdHlwZW9mKCoocikpIF9fb3NsX3Y7IFwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsgXAotCQlfX29zbF92ID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKE5VTEwsIChyKSxcCi0JCQkJCSAgc2l6ZW9mKHR5cCkpOyBcCi0JCV9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIik7IFwKLQkJX19vc2xfdjsgXAotCX0pCi0jZW5kaWYJCQkJLyogX19taXBzX18gKi8KLQotI2Vsc2UJCQkJLyogX19CSUdfRU5ESUFOICovCi0jZGVmaW5lIFJfUkVHKHIsIHR5cCkgXAotCWJyY21mX3NkY2FyZF9yZWdfcmVhZChOVUxMLCAociksIHNpemVvZih0eXApKQotI2VuZGlmCQkJCS8qIF9fQklHX0VORElBTiAqLwotCi0jZGVmaW5lIE9SX1JFRyhyLCB2LCB0eXApIFwKLQlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKE5VTEwsIChyKSwgc2l6ZW9mKHR5cCksIFJfUkVHKHIsIHR5cCkgfCAodikpCi0KLSNpZmRlZiBCQ01EQkcKLQotLyogQVJNIHRyYXAgaGFuZGxpbmcgKi8KLQotLyogVHJhcCB0eXBlcyBkZWZpbmVkIGJ5IEFSTSAoc2VlIGFybWluYy5oKSAqLwotCi0jaWYgZGVmaW5lZChfX0FSTV9BUkNIXzRUX18pCi0jZGVmaW5lCU1BWF9UUkFQX1RZUEUJKFRSX0ZJUSArIDEpCi0jZWxpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfN01fXykKLSNkZWZpbmUJTUFYX1RSQVBfVFlQRQkoVFJfSVNSICsgQVJNQ00zX05VTUlOVFMpCi0jZW5kaWYJCQkJLyogX19BUk1fQVJDSF83TV9fICovCi0KLS8qIFRoZSB0cmFwIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGhlcmUgYXMgb2Zmc2V0cyBmb3IgYXNzZW1ibHkgKi8KLSNkZWZpbmUJVFJfVFlQRQkJMHgwMAotI2RlZmluZQlUUl9FUEMJCTB4MDQKLSNkZWZpbmUJVFJfQ1BTUgkJMHgwOAotI2RlZmluZQlUUl9TUFNSCQkweDBjCi0jZGVmaW5lCVRSX1JFR1MJCTB4MTAKLSNkZWZpbmUJVFJfUkVHKG4pCShUUl9SRUdTICsgKG4pICogNCkKLSNkZWZpbmUJVFJfU1AJCVRSX1JFRygxMykKLSNkZWZpbmUJVFJfTFIJCVRSX1JFRygxNCkKLSNkZWZpbmUJVFJfUEMJCVRSX1JFRygxNSkKLQotI2RlZmluZQlUUkFQX1RfU0laRQk4MAotCi1zdHJ1Y3QgYnJjbWZfdHJhcCB7Ci0JdTMyIHR5cGU7Ci0JdTMyIGVwYzsKLQl1MzIgY3BzcjsKLQl1MzIgc3BzcjsKLQl1MzIgcjA7Ci0JdTMyIHIxOwotCXUzMiByMjsKLQl1MzIgcjM7Ci0JdTMyIHI0OwotCXUzMiByNTsKLQl1MzIgcjY7Ci0JdTMyIHI3OwotCXUzMiByODsKLQl1MzIgcjk7Ci0JdTMyIHIxMDsKLQl1MzIgcjExOwotCXUzMiByMTI7Ci0JdTMyIHIxMzsKLQl1MzIgcjE0OwotCXUzMiBwYzsKLX07Ci0KLSNkZWZpbmUgQ0JVRl9MRU4JKDEyOCkKLQotc3RydWN0IHJ0ZV9sb2cgewotCXUzMiBidWY7CQkvKiBDYW4ndCBiZSBwb2ludGVyIG9uICg2NC1iaXQpIGhvc3RzICovCi0JdWludCBidWZfc2l6ZTsKLQl1aW50IGlkeDsKLQljaGFyICpfYnVmX2NvbXBhdDsJLyogUmVkdW5kYW50IHBvaW50ZXIgZm9yIGJhY2t3YXJkIGNvbXBhdC4gKi8KLX07Ci0KLXN0cnVjdCBydGVfY29uc29sZSB7Ci0JLyogVmlydHVhbCBVQVJUCi0JICogV2hlbiB0aGVyZSBpcyBubyBVQVJUIChlLmcuIFF1aWNrdHVybiksCi0JICogdGhlIGhvc3Qgc2hvdWxkIHdyaXRlIGEgY29tcGxldGUKLQkgKiBpbnB1dCBsaW5lIGRpcmVjdGx5IGludG8gY2J1ZiBhbmQgdGhlbiB3cml0ZQotCSAqIHRoZSBsZW5ndGggaW50byB2Y29uc19pbi4KLQkgKiBUaGlzIG1heSBhbHNvIGJlIHVzZWQgd2hlbiB0aGVyZSBpcyBhIHJlYWwgVUFSVAotCSAqIChhdCByaXNrIG9mIGNvbmZsaWN0aW5nIHdpdGgKLQkgKiB0aGUgcmVhbCBVQVJUKS4gIHZjb25zX291dCBpcyBjdXJyZW50bHkgdW51c2VkLgotCSAqLwotCXZvbGF0aWxlIHVpbnQgdmNvbnNfaW47Ci0Jdm9sYXRpbGUgdWludCB2Y29uc19vdXQ7Ci0KLQkvKiBPdXRwdXQgKGxvZ2dpbmcpIGJ1ZmZlcgotCSAqIENvbnNvbGUgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gYSByaW5nIGJ1ZmZlciBsb2dfYnVmIGF0IGluZGV4IGxvZ19pZHguCi0JICogVGhlIGhvc3QgbWF5IHJlYWQgdGhlIG91dHB1dCB3aGVuIGl0IHNlZXMgbG9nX2lkeCBhZHZhbmNlLgotCSAqIE91dHB1dCB3aWxsIGJlIGxvc3QgaWYgdGhlIG91dHB1dCB3cmFwcyBhcm91bmQgZmFzdGVyIHRoYW4gdGhlIGhvc3QKLQkgKiBwb2xscy4KLQkgKi8KLQlzdHJ1Y3QgcnRlX2xvZyBsb2c7Ci0KLQkvKiBDb25zb2xlIGlucHV0IGxpbmUgYnVmZmVyCi0JICogQ2hhcmFjdGVycyBhcmUgcmVhZCBvbmUgYXQgYSB0aW1lIGludG8gY2J1ZgotCSAqIHVudGlsIDxDUj4gaXMgcmVjZWl2ZWQsIHRoZW4KLQkgKiB0aGUgYnVmZmVyIGlzIHByb2Nlc3NlZCBhcyBhIGNvbW1hbmQgbGluZS4KLQkgKiBBbHNvIHVzZWQgZm9yIHZpcnR1YWwgVUFSVC4KLQkgKi8KLQl1aW50IGNidWZfaWR4OwotCWNoYXIgY2J1ZltDQlVGX0xFTl07Ci19OwotCi0jZW5kaWYJCQkJLyogQkNNREJHICovCi0jaW5jbHVkZSA8Y2hpcGNvbW1vbi5oPgotCi0jaW5jbHVkZSAiZGhkLmgiCi0jaW5jbHVkZSAiZGhkX2J1cy5oIgotI2luY2x1ZGUgImRoZF9wcm90by5oIgotI2luY2x1ZGUgImRoZF9kYmcuaCIKLSNpbmNsdWRlIDxiY21jaGlwLmg+Ci0KLSNkZWZpbmUgVFhRTEVOCQkyMDQ4CS8qIGJ1bGsgdHggcXVldWUgbGVuZ3RoICovCi0jZGVmaW5lIFRYSEkJCShUWFFMRU4gLSAyNTYpCS8qIHR1cm4gb24gZmxvdyBjb250cm9sIGFib3ZlIFRYSEkgKi8KLSNkZWZpbmUgVFhMT1cJCShUWEhJIC0gMjU2KQkvKiB0dXJuIG9mZiBmbG93IGNvbnRyb2wgYmVsb3cgVFhMT1cgKi8KLSNkZWZpbmUgUFJJT01BU0sJNwotCi0jZGVmaW5lIFRYUkVUUklFUwkyCS8qICMgb2YgcmV0cmllcyBmb3IgdHggZnJhbWVzICovCi0KLSNkZWZpbmUgQlJDTUZfUlhCT1VORAk1MAkvKiBEZWZhdWx0IGZvciBtYXggcnggZnJhbWVzIGluCi0JCQkJIG9uZSBzY2hlZHVsaW5nICovCi0KLSNkZWZpbmUgQlJDTUZfVFhCT1VORAkyMAkvKiBEZWZhdWx0IGZvciBtYXggdHggZnJhbWVzIGluCi0JCQkJIG9uZSBzY2hlZHVsaW5nICovCi0KLSNkZWZpbmUgQlJDTUZfVFhNSU5NQVgJMQkvKiBNYXggdHggZnJhbWVzIGlmIHJ4IHN0aWxsIHBlbmRpbmcgKi8KLQotI2RlZmluZSBNRU1CTE9DSwkyMDQ4CS8qIEJsb2NrIHNpemUgdXNlZCBmb3IgZG93bmxvYWRpbmcKLQkJCQkgb2YgZG9uZ2xlIGltYWdlICovCi0jZGVmaW5lIE1BWF9EQVRBX0JVRgkoMzIgKiAxMDI0KQkvKiBNdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkCi0JCQkJIGJpZ2dlc3QgcG9zc2libGUgZ2xvbSAqLwotCi0jaWZuZGVmIEJSQ01GX0ZJUlNUUkVBRAotI2RlZmluZSBCUkNNRl9GSVJTVFJFQUQJMzIKLSNlbmRpZgotCi0jaWYgIUlTUE9XRVJPRjIoQlJDTUZfRklSU1RSRUFEKQotI2Vycm9yIEJSQ01GX0ZJUlNUUkVBRCBpcyBub3QgYSBwb3dlciBvZiAyIQotI2VuZGlmCi0KLS8qIFNCU0RJT19ERVZJQ0VfQ1RMICovCi0jZGVmaW5lIFNCU0RJT19ERVZDVExfU0VUQlVTWQkJMHgwMQkvKiAxOiBkZXZpY2Ugd2lsbCBhc3NlcnQgYnVzeSBzaWduYWwgd2hlbgotCQkJCQkJICogcmVjZWl2aW5nIENNRDUzCi0JCQkJCQkgKi8KLSNkZWZpbmUgU0JTRElPX0RFVkNUTF9TUElfSU5UUl9TWU5DCTB4MDIJLyogMTogYXNzZXJ0aW9uIG9mIHNkaW8gaW50ZXJydXB0IGlzCi0JCQkJCQkgKiBzeW5jaHJvbm91cyB0byB0aGUgc2RpbyBjbG9jawotCQkJCQkJICovCi0jZGVmaW5lIFNCU0RJT19ERVZDVExfQ0FfSU5UX09OTFkJMHgwNAkvKiAxOiBtYXNrIGFsbCBpbnRlcnJ1cHRzIHRvIGhvc3QKLQkJCQkJCSAqIGV4Y2VwdCB0aGUgY2hpcEFjdGl2ZSAocmV2IDgpCi0JCQkJCQkgKi8KLSNkZWZpbmUgU0JTRElPX0RFVkNUTF9QQURTX0lTTwkJMHgwOAkvKiAxOiBpc29sYXRlIGludGVybmFsIHNkaW8gc2lnbmFscywgcHV0Ci0JCQkJCQkgKiBleHRlcm5hbCBwYWRzIGluIHRyaS1zdGF0ZTsgcmVxdWlyZXMKLQkJCQkJCSAqIHNkaW8gYnVzIHBvd2VyIGN5Y2xlIHRvIGNsZWFyIChyZXYgOSkKLQkJCQkJCSAqLwotI2RlZmluZSBTQlNESU9fREVWQ1RMX1NCX1JTVF9DVEwJMHgzMAkvKiBGb3JjZSBTRC0+U0IgcmVzZXQgbWFwcGluZyAocmV2IDExKSAqLwotI2RlZmluZSBTQlNESU9fREVWQ1RMX1JTVF9DT1JFQ1RMCTB4MDAJLyogICBEZXRlcm1pbmVkIGJ5IENvcmVDb250cm9sIGJpdCAqLwotI2RlZmluZSBTQlNESU9fREVWQ1RMX1JTVF9CUFJFU0VUCTB4MTAJLyogICBGb3JjZSBiYWNrcGxhbmUgcmVzZXQgKi8KLSNkZWZpbmUgU0JTRElPX0RFVkNUTF9SU1RfTk9CUFJFU0VUCTB4MjAJLyogICBGb3JjZSBubyBiYWNrcGxhbmUgcmVzZXQgKi8KLQotLyogU0JTRElPX0ZVTkMxX0NISVBDTEtDU1IgKi8KLSNkZWZpbmUgU0JTRElPX0ZPUkNFX0FMUAkJMHgwMQkvKiBGb3JjZSBBTFAgcmVxdWVzdCB0byBiYWNrcGxhbmUgKi8KLSNkZWZpbmUgU0JTRElPX0ZPUkNFX0hUCQkJMHgwMgkvKiBGb3JjZSBIVCByZXF1ZXN0IHRvIGJhY2twbGFuZSAqLwotI2RlZmluZSBTQlNESU9fRk9SQ0VfSUxQCQkweDA0CS8qIEZvcmNlIElMUCByZXF1ZXN0IHRvIGJhY2twbGFuZSAqLwotI2RlZmluZSBTQlNESU9fQUxQX0FWQUlMX1JFUQkJMHgwOAkvKiBNYWtlIEFMUCByZWFkeSAocG93ZXIgdXAgeHRhbCkgKi8KLSNkZWZpbmUgU0JTRElPX0hUX0FWQUlMX1JFUQkJMHgxMAkvKiBNYWtlIEhUIHJlYWR5IChwb3dlciB1cCBQTEwpICovCi0jZGVmaW5lIFNCU0RJT19GT1JDRV9IV19DTEtSRVFfT0ZGCTB4MjAJLyogU3F1ZWxjaCBjbG9jayByZXF1ZXN0cyBmcm9tIEhXICovCi0jZGVmaW5lIFNCU0RJT19BTFBfQVZBSUwJCTB4NDAJLyogU3RhdHVzOiBBTFAgaXMgcmVhZHkgKi8KLSNkZWZpbmUgU0JTRElPX0hUX0FWQUlMCQkJMHg4MAkvKiBTdGF0dXM6IEhUIGlzIHJlYWR5ICovCi0KLSNkZWZpbmUgU0JTRElPX0FWQklUUwkJCShTQlNESU9fSFRfQVZBSUwgfCBTQlNESU9fQUxQX0FWQUlMKQotI2RlZmluZSBTQlNESU9fQUxQQVYocmVndmFsKQkJKChyZWd2YWwpICYgU0JTRElPX0FWQklUUykKLSNkZWZpbmUgU0JTRElPX0hUQVYocmVndmFsKQkJKCgocmVndmFsKSAmIFNCU0RJT19BVkJJVFMpID09IFNCU0RJT19BVkJJVFMpCi0jZGVmaW5lIFNCU0RJT19BTFBPTkxZKHJlZ3ZhbCkJCShTQlNESU9fQUxQQVYocmVndmFsKSAmJiAhU0JTRElPX0hUQVYocmVndmFsKSkKLSNkZWZpbmUgU0JTRElPX0NMS0FWKHJlZ3ZhbCwgYWxwb25seSkJKFNCU0RJT19BTFBBVihyZWd2YWwpICYmIFwKLQkJCQkJKGFscG9ubHkgPyAxIDogU0JTRElPX0hUQVYocmVndmFsKSkpCi0vKiBkaXJlY3QobWFwcGVkKSBjaXMgc3BhY2UgKi8KLSNkZWZpbmUgU0JTRElPX0NJU19CQVNFX0NPTU1PTgkJMHgxMDAwCS8qIE1BUFBFRCBjb21tb24gQ0lTIGFkZHJlc3MgKi8KLSNkZWZpbmUgU0JTRElPX0NJU19TSVpFX0xJTUlUCQkweDIwMAkvKiBtYXhpbXVtIGJ5dGVzIGluIG9uZSBDSVMgKi8KLSNkZWZpbmUgU0JTRElPX0NJU19PRlRfQUREUl9NQVNLCTB4MUZGRkYJLyogY2lzIG9mZnNldCBhZGRyIGlzIDwgMTcgYml0cyAqLwotCi0jZGVmaW5lIFNCU0RJT19DSVNfTUFORklEX1RVUExFX0xFTgk2CS8qIG1hbmZpZCB0dXBsZSBsZW5ndGgsIGluY2x1ZGUgdHVwbGUsCi0JCQkJCQkgKiBsaW5rIGJ5dGVzCi0JCQkJCQkgKi8KLQotLyogaW50c3RhdHVzICovCi0jZGVmaW5lIElfU01CX1NXMAkoMSA8PCAwKQkvKiBUbyBTQiBNYWlsIFMvVyBpbnRlcnJ1cHQgMCAqLwotI2RlZmluZSBJX1NNQl9TVzEJKDEgPDwgMSkJLyogVG8gU0IgTWFpbCBTL1cgaW50ZXJydXB0IDEgKi8KLSNkZWZpbmUgSV9TTUJfU1cyCSgxIDw8IDIpCS8qIFRvIFNCIE1haWwgUy9XIGludGVycnVwdCAyICovCi0jZGVmaW5lIElfU01CX1NXMwkoMSA8PCAzKQkvKiBUbyBTQiBNYWlsIFMvVyBpbnRlcnJ1cHQgMyAqLwotI2RlZmluZSBJX1NNQl9TV19NQVNLCTB4MDAwMDAwMGYJLyogVG8gU0IgTWFpbCBTL1cgaW50ZXJydXB0cyBtYXNrICovCi0jZGVmaW5lIElfU01CX1NXX1NISUZUCTAJLyogVG8gU0IgTWFpbCBTL1cgaW50ZXJydXB0cyBzaGlmdCAqLwotI2RlZmluZSBJX0hNQl9TVzAJKDEgPDwgNCkJLyogVG8gSG9zdCBNYWlsIFMvVyBpbnRlcnJ1cHQgMCAqLwotI2RlZmluZSBJX0hNQl9TVzEJKDEgPDwgNSkJLyogVG8gSG9zdCBNYWlsIFMvVyBpbnRlcnJ1cHQgMSAqLwotI2RlZmluZSBJX0hNQl9TVzIJKDEgPDwgNikJLyogVG8gSG9zdCBNYWlsIFMvVyBpbnRlcnJ1cHQgMiAqLwotI2RlZmluZSBJX0hNQl9TVzMJKDEgPDwgNykJLyogVG8gSG9zdCBNYWlsIFMvVyBpbnRlcnJ1cHQgMyAqLwotI2RlZmluZSBJX0hNQl9TV19NQVNLCTB4MDAwMDAwZjAJLyogVG8gSG9zdCBNYWlsIFMvVyBpbnRlcnJ1cHRzIG1hc2sgKi8KLSNkZWZpbmUgSV9ITUJfU1dfU0hJRlQJNAkvKiBUbyBIb3N0IE1haWwgUy9XIGludGVycnVwdHMgc2hpZnQgKi8KLSNkZWZpbmUgSV9XUl9PT1NZTkMJKDEgPDwgOCkJLyogV3JpdGUgRnJhbWUgT3V0IE9mIFN5bmMgKi8KLSNkZWZpbmUgSV9SRF9PT1NZTkMJKDEgPDwgOSkJLyogUmVhZCBGcmFtZSBPdXQgT2YgU3luYyAqLwotI2RlZmluZQlJX1BDCQkoMSA8PCAxMCkJLyogZGVzY3JpcHRvciBlcnJvciAqLwotI2RlZmluZQlJX1BECQkoMSA8PCAxMSkJLyogZGF0YSBlcnJvciAqLwotI2RlZmluZQlJX0RFCQkoMSA8PCAxMikJLyogRGVzY3JpcHRvciBwcm90b2NvbCBFcnJvciAqLwotI2RlZmluZQlJX1JVCQkoMSA8PCAxMykJLyogUmVjZWl2ZSBkZXNjcmlwdG9yIFVuZGVyZmxvdyAqLwotI2RlZmluZQlJX1JPCQkoMSA8PCAxNCkJLyogUmVjZWl2ZSBmaWZvIE92ZXJmbG93ICovCi0jZGVmaW5lCUlfWFUJCSgxIDw8IDE1KQkvKiBUcmFuc21pdCBmaWZvIFVuZGVyZmxvdyAqLwotI2RlZmluZQlJX1JJCQkoMSA8PCAxNikJLyogUmVjZWl2ZSBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgSV9CVVNQV1IJKDEgPDwgMTcpCS8qIFNESU8gQnVzIFBvd2VyIENoYW5nZSAocmV2IDkpICovCi0jZGVmaW5lIElfWE1UREFUQV9BVkFJTCAoMSA8PCAyMykJLyogYml0cyBpbiBmaWZvICovCi0jZGVmaW5lCUlfWEkJCSgxIDw8IDI0KQkvKiBUcmFuc21pdCBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgSV9SRl9URVJNCSgxIDw8IDI1KQkvKiBSZWFkIEZyYW1lIFRlcm1pbmF0ZSAqLwotI2RlZmluZSBJX1dGX1RFUk0JKDEgPDwgMjYpCS8qIFdyaXRlIEZyYW1lIFRlcm1pbmF0ZSAqLwotI2RlZmluZSBJX1BDTUNJQV9YVQkoMSA8PCAyNykJLyogUENNQ0lBIFRyYW5zbWl0IEZJRk8gVW5kZXJmbG93ICovCi0jZGVmaW5lIElfU0JJTlQJCSgxIDw8IDI4KQkvKiBzYmludHN0YXR1cyBJbnRlcnJ1cHQgKi8KLSNkZWZpbmUgSV9DSElQQUNUSVZFCSgxIDw8IDI5KQkvKiBjaGlwIGZyb20gZG96ZSB0byBhY3RpdmUgc3RhdGUgKi8KLSNkZWZpbmUgSV9TUkVTRVQJKDEgPDwgMzApCS8qIENDQ1IgUkVTIGludGVycnVwdCAqLwotI2RlZmluZSBJX0lPRTIJCSgxVSA8PCAzMSkJLyogQ0NDUiBJT0UyIEJpdCBDaGFuZ2VkICovCi0jZGVmaW5lCUlfRVJST1JTCShJX1BDIHwgSV9QRCB8IElfREUgfCBJX1JVIHwgSV9STyB8IElfWFUpCi0jZGVmaW5lIElfRE1BCQkoSV9SSSB8IElfWEkgfCBJX0VSUk9SUykKLQotLyogY29yZWNvbnRyb2wgKi8KLSNkZWZpbmUgQ0NfQ0lTUkRZCQkoMSA8PCAwKQkvKiBDSVMgUmVhZHkgKi8KLSNkZWZpbmUgQ0NfQlBSRVNFTgkJKDEgPDwgMSkJLyogQ0NDUiBSRVMgc2lnbmFsICovCi0jZGVmaW5lIENDX0YyUkRZCQkoMSA8PCAyKQkvKiBzZXQgQ0NDUiBJT1IyIGJpdCAqLwotI2RlZmluZSBDQ19DTFJQQURTSVNPCQkoMSA8PCAzKQkvKiBjbGVhciBTRElPIHBhZHMgaXNvbGF0aW9uICovCi0jZGVmaW5lIENDX1hNVERBVEFBVkFJTF9NT0RFCSgxIDw8IDQpCi0jZGVmaW5lIENDX1hNVERBVEFBVkFJTF9DVFJMCSgxIDw8IDUpCi0KLS8qIFNEQV9GUkFNRUNUUkwgKi8KLSNkZWZpbmUgU0ZDX1JGX1RFUk0JKDEgPDwgMCkJLyogUmVhZCBGcmFtZSBUZXJtaW5hdGUgKi8KLSNkZWZpbmUgU0ZDX1dGX1RFUk0JKDEgPDwgMSkJLyogV3JpdGUgRnJhbWUgVGVybWluYXRlICovCi0jZGVmaW5lIFNGQ19DUkM0V09PUwkoMSA8PCAyKQkvKiBDUkMgZXJyb3IgZm9yIHdyaXRlIG91dCBvZiBzeW5jICovCi0jZGVmaW5lIFNGQ19BQk9SVEFMTAkoMSA8PCAzKQkvKiBBYm9ydCBhbGwgaW4tcHJvZ3Jlc3MgZnJhbWVzICovCi0KLS8qIEhXIGZyYW1lIHRhZyAqLwotI2RlZmluZSBTRFBDTV9GUkFNRVRBR19MRU4JNAkvKiAyIGJ5dGVzIGxlbiwgMiBieXRlcyBjaGVjayB2YWwgKi8KLQotLyogVG90YWwgbGVuZ3RoIG9mIGZyYW1lIGhlYWRlciBmb3IgZG9uZ2xlIHByb3RvY29sICovCi0jZGVmaW5lIFNEUENNX0hEUkxFTgkoU0RQQ01fRlJBTUVUQUdfTEVOICsgU0RQQ01fU1dIRUFERVJfTEVOKQotI2lmZGVmIFNEVEVTVAotI2RlZmluZSBTRFBDTV9SRVNFUlZFCShTRFBDTV9IRFJMRU4gKyBTRFBDTV9URVNUX0hEUkxFTiArIEJSQ01GX1NEQUxJR04pCi0jZWxzZQotI2RlZmluZSBTRFBDTV9SRVNFUlZFCShTRFBDTV9IRFJMRU4gKyBCUkNNRl9TREFMSUdOKQotI2VuZGlmCi0KLS8qCi0gKiBTb2Z0d2FyZSBhbGxvY2F0aW9uIG9mIFRvIFNCIE1haWxib3ggcmVzb3VyY2VzCi0gKi8KLQotLyogdG9zYm1haWxib3ggYml0cyBjb3JyZXNwb25kaW5nIHRvIGludHN0YXR1cyBiaXRzICovCi0jZGVmaW5lIFNNQl9OQUsJCSgxIDw8IDApCS8qIEZyYW1lIE5BSyAqLwotI2RlZmluZSBTTUJfSU5UX0FDSwkoMSA8PCAxKQkvKiBIb3N0IEludGVycnVwdCBBQ0sgKi8KLSNkZWZpbmUgU01CX1VTRV9PT0IJKDEgPDwgMikJLyogVXNlIE9PQiBXYWtldXAgKi8KLSNkZWZpbmUgU01CX0RFVl9JTlQJKDEgPDwgMykJLyogTWlzY2VsbGFuZW91cyBJbnRlcnJ1cHQgKi8KLQotLyogdG9zYm1haWxib3hkYXRhICovCi0jZGVmaW5lIFNNQl9EQVRBX1ZFUlNJT05fU0hJRlQJMTYJLyogaG9zdCBwcm90b2NvbCB2ZXJzaW9uICovCi0KLS8qCi0gKiBTb2Z0d2FyZSBhbGxvY2F0aW9uIG9mIFRvIEhvc3QgTWFpbGJveCByZXNvdXJjZXMKLSAqLwotCi0vKiBpbnRzdGF0dXMgYml0cyAqLwotI2RlZmluZSBJX0hNQl9GQ19TVEFURQlJX0hNQl9TVzAJLyogRmxvdyBDb250cm9sIFN0YXRlICovCi0jZGVmaW5lIElfSE1CX0ZDX0NIQU5HRQlJX0hNQl9TVzEJLyogRmxvdyBDb250cm9sIFN0YXRlIENoYW5nZWQgKi8KLSNkZWZpbmUgSV9ITUJfRlJBTUVfSU5ECUlfSE1CX1NXMgkvKiBGcmFtZSBJbmRpY2F0aW9uICovCi0jZGVmaW5lIElfSE1CX0hPU1RfSU5UCUlfSE1CX1NXMwkvKiBNaXNjZWxsYW5lb3VzIEludGVycnVwdCAqLwotCi0vKiB0b2hvc3RtYWlsYm94ZGF0YSAqLwotI2RlZmluZSBITUJfREFUQV9OQUtIQU5ETEVECTEJLyogcmV0cmFuc21pdCBOQUsnZCBmcmFtZSAqLwotI2RlZmluZSBITUJfREFUQV9ERVZSRUFEWQkyCS8qIHRhbGsgdG8gaG9zdCBhZnRlciBlbmFibGUgKi8KLSNkZWZpbmUgSE1CX0RBVEFfRkMJCTQJLyogcGVyIHByaW8gZmxvd2NvbnRyb2wgdXBkYXRlIGZsYWcgKi8KLSNkZWZpbmUgSE1CX0RBVEFfRldSRUFEWQk4CS8qIGZ3IHJlYWR5IGZvciBwcm90b2NvbCBhY3Rpdml0eSAqLwotCi0jZGVmaW5lIEhNQl9EQVRBX0ZDREFUQV9NQVNLCTB4ZmYwMDAwMDAKLSNkZWZpbmUgSE1CX0RBVEFfRkNEQVRBX1NISUZUCTI0Ci0KLSNkZWZpbmUgSE1CX0RBVEFfVkVSU0lPTl9NQVNLCTB4MDBmZjAwMDAKLSNkZWZpbmUgSE1CX0RBVEFfVkVSU0lPTl9TSElGVAkxNgotCi0vKgotICogU29mdHdhcmUtZGVmaW5lZCBwcm90b2NvbCBoZWFkZXIKLSAqLwotCi0vKiBDdXJyZW50IHByb3RvY29sIHZlcnNpb24gKi8KLSNkZWZpbmUgU0RQQ01fUFJPVF9WRVJTSU9OCTQKLQotLyogU1cgZnJhbWUgaGVhZGVyICovCi0jZGVmaW5lIFNEUENNX1BBQ0tFVF9TRVFVRU5DRShwKQkoKCh1OCAqKXApWzBdICYgMHhmZikKLQotI2RlZmluZSBTRFBDTV9DSEFOTkVMX01BU0sJCTB4MDAwMDBmMDAKLSNkZWZpbmUgU0RQQ01fQ0hBTk5FTF9TSElGVAkJOAotI2RlZmluZSBTRFBDTV9QQUNLRVRfQ0hBTk5FTChwKQkJKCgodTggKilwKVsxXSAmIDB4MGYpCi0KLSNkZWZpbmUgU0RQQ01fTkVYVExFTl9PRkZTRVQJCTIKLQotLyogRGF0YSBPZmZzZXQgZnJvbSBTT0YgKEhXIFRhZywgU1cgVGFnLCBQYWQpICovCi0jZGVmaW5lIFNEUENNX0RPRkZTRVRfT0ZGU0VUCQkzCS8qIERhdGEgT2Zmc2V0ICovCi0jZGVmaW5lIFNEUENNX0RPRkZTRVRfVkFMVUUocCkJCSgoKHU4ICopcClbU0RQQ01fRE9GRlNFVF9PRkZTRVRdICYgMHhmZikKLSNkZWZpbmUgU0RQQ01fRE9GRlNFVF9NQVNLCQkweGZmMDAwMDAwCi0jZGVmaW5lIFNEUENNX0RPRkZTRVRfU0hJRlQJCTI0Ci0jZGVmaW5lIFNEUENNX0ZDTUFTS19PRkZTRVQJCTQJLyogRmxvdyBjb250cm9sICovCi0jZGVmaW5lIFNEUENNX0ZDTUFTS19WQUxVRShwKQkJKCgodTggKilwKVtTRFBDTV9GQ01BU0tfT0ZGU0VUXSAmIDB4ZmYpCi0jZGVmaW5lIFNEUENNX1dJTkRPV19PRkZTRVQJCTUJLyogQ3JlZGl0IGJhc2VkIGZjICovCi0jZGVmaW5lIFNEUENNX1dJTkRPV19WQUxVRShwKQkJKCgodTggKilwKVtTRFBDTV9XSU5ET1dfT0ZGU0VUXSAmIDB4ZmYpCi0KLSNkZWZpbmUgU0RQQ01fU1dIRUFERVJfTEVOCTgJLyogU1cgaGVhZGVyIGlzIDY0IGJpdHMgKi8KLQotLyogbG9naWNhbCBjaGFubmVsIG51bWJlcnMgKi8KLSNkZWZpbmUgU0RQQ01fQ09OVFJPTF9DSEFOTkVMCTAJLyogQ29udHJvbCBjaGFubmVsIElkICovCi0jZGVmaW5lIFNEUENNX0VWRU5UX0NIQU5ORUwJMQkvKiBBc3ljIEV2ZW50IEluZGljYXRpb24gQ2hhbm5lbCBJZCAqLwotI2RlZmluZSBTRFBDTV9EQVRBX0NIQU5ORUwJMgkvKiBEYXRhIFhtaXQvUmVjdiBDaGFubmVsIElkICovCi0jZGVmaW5lIFNEUENNX0dMT01fQ0hBTk5FTAkzCS8qIEZvciBjb2FsZXNjZWQgcGFja2V0cyAqLwotI2RlZmluZSBTRFBDTV9URVNUX0NIQU5ORUwJMTUJLyogUmVzZXJ2ZWQgZm9yIHRlc3QvZGVidWcgcGFja2V0cyAqLwotCi0jZGVmaW5lIFNEUENNX1NFUVVFTkNFX1dSQVAJMjU2CS8qIHdyYXAtYXJvdW5kIHZhbCBmb3IgOGJpdCBmcmFtZSBzZXEgKi8KLQotI2RlZmluZSBTRFBDTV9HTE9NREVTQyhwKQkoKCh1OCAqKXApWzFdICYgMHg4MCkKLQotLyogRm9yIFRFU1RfQ0hBTk5FTCBwYWNrZXRzLCBkZWZpbmUgYW5vdGhlciA0LWJ5dGUgaGVhZGVyICovCi0jZGVmaW5lIFNEUENNX1RFU1RfSERSTEVOCTQJLyoKLQkJCQkJICogR2VuZXJhbGx5OiBDbWQoMSksIEV4dCgxKSwgTGVuKDIpOwotCQkJCQkgKiBTZW1hbnRpY3Mgb2YgRXh0IGJ5dGUgZGVwZW5kIG9uCi0JCQkJCSAqIGNvbW1hbmQuIExlbiBpcyBjdXJyZW50IG9yIHJlcXVlc3RlZAotCQkJCQkgKiBmcmFtZSBsZW5ndGgsIG5vdCBpbmNsdWRpbmcgdGVzdAotCQkJCQkgKiBoZWFkZXI7IHNlbnQgbGl0dGxlLWVuZGlhbi4KLQkJCQkJICovCi0jZGVmaW5lIFNEUENNX1RFU1RfRElTQ0FSRAkweDAxCS8qIFJlY2VpdmVyIGRpc2NhcmRzLiBFeHQ6cGF0dGVybiBpZC4gKi8KLSNkZWZpbmUgU0RQQ01fVEVTVF9FQ0hPUkVRCTB4MDIJLyogRWNobyByZXF1ZXN0LiBFeHQ6cGF0dGVybiBpZC4gKi8KLSNkZWZpbmUgU0RQQ01fVEVTVF9FQ0hPUlNQCTB4MDMJLyogRWNobyByZXNwb25zZS4gRXh0OnBhdHRlcm4gaWQuICovCi0jZGVmaW5lIFNEUENNX1RFU1RfQlVSU1QJMHgwNAkvKgotCQkJCQkgKiBSZWNlaXZlciB0byBzZW5kIGEgYnVyc3QuCi0JCQkJCSAqIEV4dCBpcyBhIGZyYW1lIGNvdW50Ci0JCQkJCSAqLwotI2RlZmluZSBTRFBDTV9URVNUX1NFTkQJCTB4MDUJLyoKLQkJCQkJICogUmVjZWl2ZXIgc2V0cyBzZW5kIG1vZGUuCi0JCQkJCSAqIEV4dCBpcyBib29sZWFuIG9uL29mZgotCQkJCQkgKi8KLQotLyogSGFuZHkgbWFjcm8gZm9yIGZpbGxpbmcgaW4gZGF0YWdlbiBwYWNrZXRzIHdpdGggYSBwYXR0ZXJuICovCi0jZGVmaW5lIFNEUENNX1RFU1RfRklMTChieXRlbm8sIGlkKQkoKHU4KShpZCArIGJ5dGVubykpCi0KLS8qCi0gKiBTaGFyZWQgc3RydWN0dXJlIGJldHdlZW4gZG9uZ2xlIGFuZCB0aGUgaG9zdC4KLSAqIFRoZSBzdHJ1Y3R1cmUgY29udGFpbnMgcG9pbnRlcnMgdG8gdHJhcCBvciBhc3NlcnQgaW5mb3JtYXRpb24uCi0gKi8KLSNkZWZpbmUgU0RQQ01fU0hBUkVEX1ZFUlNJT04gICAgICAgMHgwMDAyCi0jZGVmaW5lIFNEUENNX1NIQVJFRF9WRVJTSU9OX01BU0sgIDB4MDBGRgotI2RlZmluZSBTRFBDTV9TSEFSRURfQVNTRVJUX0JVSUxUICAweDAxMDAKLSNkZWZpbmUgU0RQQ01fU0hBUkVEX0FTU0VSVCAgICAgICAgMHgwMjAwCi0jZGVmaW5lIFNEUENNX1NIQVJFRF9UUkFQICAgICAgICAgIDB4MDQwMAotCi0KLS8qIFNwYWNlIGZvciBoZWFkZXIgcmVhZCwgbGltaXQgZm9yIGRhdGEgcGFja2V0cyAqLwotI2lmbmRlZiBNQVhfSERSX1JFQUQKLSNkZWZpbmUgTUFYX0hEUl9SRUFECTMyCi0jZW5kaWYKLSNpZiAhSVNQT1dFUk9GMihNQVhfSERSX1JFQUQpCi0jZXJyb3IgTUFYX0hEUl9SRUFEIGlzIG5vdCBhIHBvd2VyIG9mIDIhCi0jZW5kaWYKLQotI2RlZmluZSBNQVhfUlhfREFUQVNaCTIwNDgKLQotLyogTWF4aW11bSBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgRjIgdG8gY29tZSB1cCAqLwotI2RlZmluZSBCUkNNRl9XQUlUX0YyUkRZCTMwMDAKLQotLyogQnVtcCB1cCBsaW1pdCBvbiB3YWl0aW5nIGZvciBIVCB0byBhY2NvdW50IGZvciBmaXJzdCBzdGFydHVwOwotICogaWYgdGhlIGltYWdlIGlzIGRvaW5nIGEgQ1JDIGNhbGN1bGF0aW9uIGJlZm9yZSBwcm9ncmFtbWluZyB0aGUgUE1VCi0gKiBmb3IgSFQgYXZhaWxhYmlsaXR5LCBpdCBjb3VsZCB0YWtlIGEgY291cGxlIGh1bmRyZWQgbXMgbW9yZSwgc28KLSAqIG1heCBvdXQgYXQgYSAxIHNlY29uZCAoMTAwMDAwMHVzKS4KLSAqLwotI2lmIChQTVVfTUFYX1RSQU5TSVRJT05fRExZIDw9IDEwMDAwMDApCi0jdW5kZWYgUE1VX01BWF9UUkFOU0lUSU9OX0RMWQotI2RlZmluZSBQTVVfTUFYX1RSQU5TSVRJT05fRExZIDEwMDAwMDAKLSNlbmRpZgotCi0vKiBWYWx1ZSBmb3IgQ2hpcENsb2NrQ1NSIGR1cmluZyBpbml0aWFsIHNldHVwICovCi0jZGVmaW5lIEJSQ01GX0lOSVRfQ0xLQ1RMMQkoU0JTRElPX0ZPUkNFX0hXX0NMS1JFUV9PRkYgfAlcCi0JCQkJCVNCU0RJT19BTFBfQVZBSUxfUkVRKQotCi0vKiBGbGFncyBmb3IgU0RIIGNhbGxzICovCi0jZGVmaW5lIEYyU1lOQwkoU0RJT19SRVFfNEJZVEUgfCBTRElPX1JFUV9GSVhFRCkKLQotLyogc2JpbXN0YXRlICovCi0jZGVmaW5lCVNCSU1fSUJFCQkweDIwMDAwCS8qIGluYmFuZGVycm9yICovCi0jZGVmaW5lCVNCSU1fVE8JCQkweDQwMDAwCS8qIHRpbWVvdXQgKi8KLSNkZWZpbmUJU0JJTV9CWQkJCTB4MDE4MDAwMDAJLyogYnVzeSAoc29uaWNzID49IDIuMykgKi8KLSNkZWZpbmUJU0JJTV9SSgkJCTB4MDIwMDAwMDAJLyogcmVqZWN0IChzb25pY3MgPj0gMi4zKSAqLwotCi0vKiBzYnRtc3RhdGVsb3cgKi8KLSNkZWZpbmUJU0JUTUxfUkVTRVQJCTB4MDAwMQkvKiByZXNldCAqLwotI2RlZmluZQlTQlRNTF9SRUpfTUFTSwkJMHgwMDA2CS8qIHJlamVjdCBmaWVsZCAqLwotI2RlZmluZQlTQlRNTF9SRUoJCTB4MDAwMgkvKiByZWplY3QgKi8KLSNkZWZpbmUJU0JUTUxfVE1QUkVKCQkweDAwMDQJLyogdGVtcG9yYXJ5IHJlamVjdCwgZm9yIGVycm9yIHJlY292ZXJ5ICovCi0KLSNkZWZpbmUJU0JUTUxfU0lDRl9TSElGVAkxNgkvKiBTaGlmdCB0byBsb2NhdGUgdGhlIFNJIGNvbnRyb2wgZmxhZ3MgaW4gc2J0bWwgKi8KLQotLyogc2J0bXN0YXRlaGlnaCAqLwotI2RlZmluZQlTQlRNSF9TRVJSCQkweDAwMDEJLyogc2Vycm9yICovCi0jZGVmaW5lCVNCVE1IX0lOVAkJMHgwMDAyCS8qIGludGVycnVwdCAqLwotI2RlZmluZQlTQlRNSF9CVVNZCQkweDAwMDQJLyogYnVzeSAqLwotI2RlZmluZQlTQlRNSF9UTwkJMHgwMDIwCS8qIHRpbWVvdXQgKHNvbmljcyA+PSAyLjMpICovCi0KLSNkZWZpbmUJU0JUTUhfU0lTRl9TSElGVAkxNgkvKiBTaGlmdCB0byBsb2NhdGUgdGhlIFNJIHN0YXR1cyBmbGFncyBpbiBzYnRtaCAqLwotCi0vKiBzYmlkbG93ICovCi0jZGVmaW5lCVNCSURMX0lOSVQJCTB4ODAJLyogaW5pdGlhdG9yICovCi0KLS8qIHNiaWRoaWdoICovCi0jZGVmaW5lCVNCSURIX1JDX01BU0sJCTB4MDAwZgkvKiByZXZpc2lvbiBjb2RlICovCi0jZGVmaW5lCVNCSURIX1JDRV9NQVNLCQkweDcwMDAJLyogcmV2aXNpb24gY29kZSBleHRlbnNpb24gZmllbGQgKi8KLSNkZWZpbmUJU0JJREhfUkNFX1NISUZUCQk4Ci0jZGVmaW5lCVNCQ09SRVJFVihzYmlkaCkgXAotCSgoKChzYmlkaCkgJiBTQklESF9SQ0VfTUFTSykgPj4gU0JJREhfUkNFX1NISUZUKSB8ICgoc2JpZGgpICYgU0JJREhfUkNfTUFTSykpCi0jZGVmaW5lCVNCSURIX0NDX01BU0sJCTB4OGZmMAkvKiBjb3JlIGNvZGUgKi8KLSNkZWZpbmUJU0JJREhfQ0NfU0hJRlQJCTQKLSNkZWZpbmUJU0JJREhfVkNfTUFTSwkJMHhmZmZmMDAwMAkvKiB2ZW5kb3IgY29kZSAqLwotI2RlZmluZQlTQklESF9WQ19TSElGVAkJMTYKLQotLyoKLSAqIENvbnZlcnNpb24gb2YgODAyLjFEIHByaW9yaXR5IHRvIHByZWNlZGVuY2UgbGV2ZWwKLSAqLwotI2RlZmluZSBQUklPMlBSRUMocHJpbykgXAotCSgoKHByaW8pID09IFBSSU9fODAyMURfTk9ORSB8fCAocHJpbykgPT0gUFJJT184MDIxRF9CRSkgPyBcCi0JKChwcmlvXjIpKSA6IChwcmlvKSkKLQotQlJDTUZfU1BJTldBSVRfU0xFRVBfSU5JVChzZGlvaF9zcGlud2FpdF9zbGVlcCk7Ci0KLS8qCi0gKiBDb3JlIHJlZyBhZGRyZXNzIHRyYW5zbGF0aW9uLgotICogQm90aCBtYWNybydzIHJldHVybnMgYSAzMiBiaXRzIGJ5dGUgYWRkcmVzcyBvbiB0aGUgYmFja3BsYW5lIGJ1cy4KLSAqLwotI2RlZmluZSBDT1JFX0NDX1JFRyhiYXNlLCBmaWVsZCkJKGJhc2UgKyBvZmZzZXRvZihjaGlwY3JlZ3NfdCwgZmllbGQpKQotI2RlZmluZSBDT1JFX0JVU19SRUcoYmFzZSwgZmllbGQpIFwKLQkJKGJhc2UgKyBvZmZzZXRvZihzdHJ1Y3Qgc2RwY21kX3JlZ3MsIGZpZWxkKSkKLSNkZWZpbmUgQ09SRV9TQihiYXNlLCBmaWVsZCkgXAotCQkoYmFzZSArIFNCQ09ORklHT0ZGICsgb2Zmc2V0b2Yoc3RydWN0IHNiY29uZmlnLCBmaWVsZCkpCi0KLS8qIGNvcmUgcmVnaXN0ZXJzICovCi1zdHJ1Y3Qgc2RwY21kX3JlZ3MgewotCXUzMiBjb3JlY29udHJvbDsJCS8qIDB4MDAsIHJldjggKi8KLQl1MzIgY29yZXN0YXR1czsJCQkvKiByZXY4ICovCi0JdTMyIFBBRFsxXTsKLQl1MzIgYmlzdHN0YXR1czsJCQkvKiByZXY4ICovCi0KLQkvKiBQQ01DSUEgYWNjZXNzICovCi0JdTE2IHBjbWNpYW1lc3BvcnRhbGFkZHI7CS8qIDB4MDEwLCByZXY4ICovCi0JdTE2IFBBRFsxXTsKLQl1MTYgcGNtY2lhbWVzcG9ydGFsbWFzazsJLyogcmV2OCAqLwotCXUxNiBQQURbMV07Ci0JdTE2IHBjbWNpYXdyZnJhbWViYzsJCS8qIHJldjggKi8KLQl1MTYgUEFEWzFdOwotCXUxNiBwY21jaWF1bmRlcmZsb3d0aW1lcjsJLyogcmV2OCAqLwotCXUxNiBQQURbMV07Ci0KLQkvKiBpbnRlcnJ1cHQgKi8KLQl1MzIgaW50c3RhdHVzOwkJCS8qIDB4MDIwLCByZXY4ICovCi0JdTMyIGhvc3RpbnRtYXNrOwkJLyogcmV2OCAqLwotCXUzMiBpbnRtYXNrOwkJCS8qIHJldjggKi8KLQl1MzIgc2JpbnRzdGF0dXM7CQkvKiByZXY4ICovCi0JdTMyIHNiaW50bWFzazsJCQkvKiByZXY4ICovCi0JdTMyIGZ1bmNpbnRtYXNrOwkJLyogcmV2NCAqLwotCXUzMiBQQURbMl07Ci0JdTMyIHRvc2JtYWlsYm94OwkJLyogMHgwNDAsIHJldjggKi8KLQl1MzIgdG9ob3N0bWFpbGJveDsJCS8qIHJldjggKi8KLQl1MzIgdG9zYm1haWxib3hkYXRhOwkJLyogcmV2OCAqLwotCXUzMiB0b2hvc3RtYWlsYm94ZGF0YTsJCS8qIHJldjggKi8KLQotCS8qIHN5bmNocm9uaXplZCBhY2Nlc3MgdG8gcmVnaXN0ZXJzIGluIFNESU8gY2xvY2sgZG9tYWluICovCi0JdTMyIHNkaW9hY2Nlc3M7CQkJLyogMHgwNTAsIHJldjggKi8KLQl1MzIgUEFEWzNdOwotCi0JLyogUENNQ0lBIGZyYW1lIGNvbnRyb2wgKi8KLQl1OCBwY21jaWFmcmFtZWN0cmw7CQkvKiAweDA2MCwgcmV2OCAqLwotCXU4IFBBRFszXTsKLQl1OCBwY21jaWF3YXRlcm1hcms7CQkvKiByZXY4ICovCi0JdTggUEFEWzE1NV07Ci0KLQkvKiBpbnRlcnJ1cHQgYmF0Y2hpbmcgY29udHJvbCAqLwotCXUzMiBpbnRyY3ZsYXp5OwkJCS8qIDB4MTAwLCByZXY4ICovCi0JdTMyIFBBRFszXTsKLQotCS8qIGNvdW50ZXJzICovCi0JdTMyIGNtZDUycmQ7CQkJLyogMHgxMTAsIHJldjggKi8KLQl1MzIgY21kNTJ3cjsJCQkvKiByZXY4ICovCi0JdTMyIGNtZDUzcmQ7CQkJLyogcmV2OCAqLwotCXUzMiBjbWQ1M3dyOwkJCS8qIHJldjggKi8KLQl1MzIgYWJvcnQ7CQkJLyogcmV2OCAqLwotCXUzMiBkYXRhY3JjZXJyb3I7CQkvKiByZXY4ICovCi0JdTMyIHJkb3V0b2ZzeW5jOwkJLyogcmV2OCAqLwotCXUzMiB3cm91dG9mc3luYzsJCS8qIHJldjggKi8KLQl1MzIgd3JpdGVidXN5OwkJCS8qIHJldjggKi8KLQl1MzIgcmVhZHdhaXQ7CQkJLyogcmV2OCAqLwotCXUzMiByZWFkdGVybTsJCQkvKiByZXY4ICovCi0JdTMyIHdyaXRldGVybTsJCQkvKiByZXY4ICovCi0JdTMyIFBBRFs0MF07Ci0JdTMyIGNsb2NrY3Rsc3RhdHVzOwkJLyogcmV2OCAqLwotCXUzMiBQQURbN107Ci0KLQl1MzIgUEFEWzEyOF07CQkJLyogRE1BIGVuZ2luZXMgKi8KLQotCS8qIFNESU8vUENNQ0lBIENJUyByZWdpb24gKi8KLQljaGFyIGNpc1s1MTJdOwkJCS8qIDB4NDAwLTB4NWZmLCByZXY2ICovCi0KLQkvKiBQQ01DSUEgZnVuY3Rpb24gY29udHJvbCByZWdpc3RlcnMgKi8KLQljaGFyIHBjbWNpYWZjclsyNTZdOwkJLyogMHg2MDAtNmZmLCByZXY2ICovCi0JdTE2IFBBRFs1NV07Ci0KLQkvKiBQQ01DSUEgYmFja3BsYW5lIGFjY2VzcyAqLwotCXUxNiBiYWNrcGxhbmVjc3I7CQkvKiAweDc2RSwgcmV2NiAqLwotCXUxNiBiYWNrcGxhbmVhZGRyMDsJCS8qIHJldjYgKi8KLQl1MTYgYmFja3BsYW5lYWRkcjE7CQkvKiByZXY2ICovCi0JdTE2IGJhY2twbGFuZWFkZHIyOwkJLyogcmV2NiAqLwotCXUxNiBiYWNrcGxhbmVhZGRyMzsJCS8qIHJldjYgKi8KLQl1MTYgYmFja3BsYW5lZGF0YTA7CQkvKiByZXY2ICovCi0JdTE2IGJhY2twbGFuZWRhdGExOwkJLyogcmV2NiAqLwotCXUxNiBiYWNrcGxhbmVkYXRhMjsJCS8qIHJldjYgKi8KLQl1MTYgYmFja3BsYW5lZGF0YTM7CQkvKiByZXY2ICovCi0JdTE2IFBBRFszMV07Ci0KLQkvKiBzcHJvbSAic2l6ZSIgJiAiYmxhbmsiIGluZm8gKi8KLQl1MTYgc3Byb21zdGF0dXM7CQkvKiAweDdCRSwgcmV2MiAqLwotCXUzMiBQQURbNDY0XTsKLQotCXUxNiBQQURbMHg4MF07Ci19OwotCi0jaWZkZWYgQkNNREJHCi0vKiBEZXZpY2UgY29uc29sZSBsb2cgYnVmZmVyIHN0YXRlICovCi1zdHJ1Y3QgYnJjbWZfY29uc29sZSB7Ci0JdWludCBjb3VudDsJCS8qIFBvbGwgaW50ZXJ2YWwgbXNlYyBjb3VudGVyICovCi0JdWludCBsb2dfYWRkcjsJCS8qIExvZyBzdHJ1Y3QgYWRkcmVzcyAoZml4ZWQpICovCi0Jc3RydWN0IHJ0ZV9sb2cgbG9nOwkvKiBMb2cgc3RydWN0IChob3N0IGNvcHkpICovCi0JdWludCBidWZzaXplOwkJLyogU2l6ZSBvZiBsb2cgYnVmZmVyICovCi0JdTggKmJ1ZjsJCS8qIExvZyBidWZmZXIgKGhvc3QgY29weSkgKi8KLQl1aW50IGxhc3Q7CQkvKiBMYXN0IGJ1ZmZlciByZWFkIGluZGV4ICovCi19OwotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwotCi1zdHJ1Y3Qgc2RwY21fc2hhcmVkIHsKLQl1MzIgZmxhZ3M7Ci0JdTMyIHRyYXBfYWRkcjsKLQl1MzIgYXNzZXJ0X2V4cF9hZGRyOwotCXUzMiBhc3NlcnRfZmlsZV9hZGRyOwotCXUzMiBhc3NlcnRfbGluZTsKLQl1MzIgY29uc29sZV9hZGRyOwkvKiBBZGRyZXNzIG9mIHN0cnVjdCBydGVfY29uc29sZSAqLwotCXUzMiBtc2d0cmFjZV9hZGRyOwotCXU4IHRhZ1szMl07Ci19OwotCi0KLS8qIG1pc2MgY2hpcCBpbmZvIG5lZWRlZCBieSBzb21lIG9mIHRoZSByb3V0aW5lcyAqLwotc3RydWN0IGNoaXBfaW5mbyB7Ci0JdTMyIGNoaXA7Ci0JdTMyIGNoaXByZXY7Ci0JdTMyIGNjY29yZWJhc2U7Ci0JdTMyIGNjcmV2OwotCXUzMiBjY2NhcHM7Ci0JdTMyIGJ1c2NvcmViYXNlOyAvKiAzMiBiaXRzIGJhY2twbGFuZSBidXMgYWRkcmVzcyAqLwotCXUzMiBidXNjb3JlcmV2OwotCXUzMiBidXNjb3JldHlwZTsKLQl1MzIgcmFtY29yZWJhc2U7Ci0JdTMyIGFybWNvcmViYXNlOwotCXUzMiBwbXVyZXY7Ci0JdTMyIHJhbXNpemU7Ci19OwotCi0vKiBQcml2YXRlIGRhdGEgZm9yIFNESU8gYnVzIGludGVyYWN0aW9uICovCi1zdHJ1Y3QgYnJjbWZfYnVzIHsKLQlzdHJ1Y3QgYnJjbWZfcHViICpkcnZyOwotCi0Jc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZDsJLyogSGFuZGxlIGZvciBzZGlvIGNhcmQgY2FsbHMgKi8KLQlzdHJ1Y3QgY2hpcF9pbmZvICpjaTsJLyogQ2hpcCBpbmZvIHN0cnVjdCAqLwotCWNoYXIgKnZhcnM7CQkvKiBWYXJpYWJsZXMgKGZyb20gQ0lTIGFuZC9vciBvdGhlcikgKi8KLQl1aW50IHZhcnN6OwkJLyogU2l6ZSBvZiB2YXJpYWJsZXMgYnVmZmVyICovCi0KLQl1MzIgcmFtc2l6ZTsJCS8qIFNpemUgb2YgUkFNIGluIFNPQ1JBTSAoYnl0ZXMpICovCi0JdTMyIG9yaWdfcmFtc2l6ZTsJLyogU2l6ZSBvZiBSQU0gaW4gU09DUkFNIChieXRlcykgKi8KLQotCXUzMiBidXM7CQkvKiBnU1BJIG9yIFNESU8gYnVzICovCi0JdTMyIGhvc3RpbnRtYXNrOwkvKiBDb3B5IG9mIEhvc3QgSW50ZXJydXB0IE1hc2sgKi8KLQl1MzIgaW50c3RhdHVzOwkvKiBJbnRzdGF0dXMgYml0cyAoZXZlbnRzKSBwZW5kaW5nICovCi0JYm9vbCBkcGNfc2NoZWQ7CQkvKiBJbmRpY2F0ZXMgRFBDIHNjaGVkdWxlIChpbnRycHQgcmN2ZCkgKi8KLQlib29sIGZjc3RhdGU7CQkvKiBTdGF0ZSBvZiBkb25nbGUgZmxvdy1jb250cm9sICovCi0KLQl1MTYgY2xfZGV2aWQ7CS8qIGNhY2hlZCBkZXZpZCBmb3IgYnJjbWZfc2Rpb19wcm9iZV9hdHRhY2goKSAqLwotCi0JdWludCBibG9ja3NpemU7CQkvKiBCbG9jayBzaXplIG9mIFNESU8gdHJhbnNmZXJzICovCi0JdWludCByb3VuZHVwOwkJLyogTWF4IHJvdW5kdXAgbGltaXQgKi8KLQotCXN0cnVjdCBwa3RxIHR4cTsJLyogUXVldWUgbGVuZ3RoIHVzZWQgZm9yIGZsb3ctY29udHJvbCAqLwotCXU4IGZsb3djb250cm9sOwkvKiBwZXIgcHJpbyBmbG93IGNvbnRyb2wgYml0bWFzayAqLwotCXU4IHR4X3NlcTsJCS8qIFRyYW5zbWl0IHNlcXVlbmNlIG51bWJlciAobmV4dCkgKi8KLQl1OCB0eF9tYXg7CQkvKiBNYXhpbXVtIHRyYW5zbWl0IHNlcXVlbmNlIGFsbG93ZWQgKi8KLQotCXU4IGhkcmJ1ZltNQVhfSERSX1JFQUQgKyBCUkNNRl9TREFMSUdOXTsKLQl1OCAqcnhoZHI7CQkvKiBIZWFkZXIgb2YgY3VycmVudCByeCBmcmFtZSAoaW4gaGRyYnVmKSAqLwotCXUxNiBuZXh0bGVuOwkJLyogTmV4dCBSZWFkIExlbiBmcm9tIGxhc3QgaGVhZGVyICovCi0JdTggcnhfc2VxOwkJLyogUmVjZWl2ZSBzZXF1ZW5jZSBudW1iZXIgKGV4cGVjdGVkKSAqLwotCWJvb2wgcnhza2lwOwkJLyogU2tpcCByZWNlaXZlIChhd2FpdGluZyBOQUsgQUNLKSAqLwotCi0Jc3RydWN0IHNrX2J1ZmYgKmdsb21kOwkvKiBQYWNrZXQgY29udGFpbmluZyBnbG9tbWluZyBkZXNjcmlwdG9yICovCi0Jc3RydWN0IHNrX2J1ZmYgKmdsb207CS8qIFBhY2tldCBjaGFpbiBmb3IgZ2xvbW1lZCBzdXBlcmZyYW1lICovCi0JdWludCBnbG9tZXJyOwkJLyogR2xvbSBwYWNrZXQgcmVhZCBlcnJvcnMgKi8KLQotCXU4ICpyeGJ1ZjsJCS8qIEJ1ZmZlciBmb3IgcmVjZWl2aW5nIGNvbnRyb2wgcGFja2V0cyAqLwotCXVpbnQgcnhibGVuOwkJLyogQWxsb2NhdGVkIGxlbmd0aCBvZiByeGJ1ZiAqLwotCXU4ICpyeGN0bDsJCS8qIEFsaWduZWQgcG9pbnRlciBpbnRvIHJ4YnVmICovCi0JdTggKmRhdGFidWY7CQkvKiBCdWZmZXIgZm9yIHJlY2VpdmluZyBiaWcgZ2xvbSBwYWNrZXQgKi8KLQl1OCAqZGF0YXB0cjsJCS8qIEFsaWduZWQgcG9pbnRlciBpbnRvIGRhdGFidWYgKi8KLQl1aW50IHJ4bGVuOwkJLyogTGVuZ3RoIG9mIHZhbGlkIGRhdGEgaW4gYnVmZmVyICovCi0KLQl1OCBzZHBjbV92ZXI7CS8qIEJ1cyBwcm90b2NvbCByZXBvcnRlZCBieSBkb25nbGUgKi8KLQotCWJvb2wgaW50cjsJCS8qIFVzZSBpbnRlcnJ1cHRzICovCi0JYm9vbCBwb2xsOwkJLyogVXNlIHBvbGxpbmcgKi8KLQlib29sIGlwZW5kOwkJLyogRGV2aWNlIGludGVycnVwdCBpcyBwZW5kaW5nICovCi0JYm9vbCBpbnRkaXM7CQkvKiBJbnRlcnJ1cHRzIGRpc2FibGVkIGJ5IGlzciAqLwotCXVpbnQgaW50cmNvdW50OwkJLyogQ291bnQgb2YgZGV2aWNlIGludGVycnVwdCBjYWxsYmFja3MgKi8KLQl1aW50IGxhc3RpbnRyczsJCS8qIENvdW50IGFzIG9mIGxhc3Qgd2F0Y2hkb2cgdGltZXIgKi8KLQl1aW50IHNwdXJpb3VzOwkJLyogQ291bnQgb2Ygc3B1cmlvdXMgaW50ZXJydXB0cyAqLwotCXVpbnQgcG9sbHJhdGU7CQkvKiBUaWNrcyBiZXR3ZWVuIGRldmljZSBwb2xscyAqLwotCXVpbnQgcG9sbHRpY2s7CQkvKiBUaWNrIGNvdW50ZXIgKi8KLQl1aW50IHBvbGxjbnQ7CQkvKiBDb3VudCBvZiBhY3RpdmUgcG9sbHMgKi8KLQotI2lmZGVmIEJDTURCRwotCXN0cnVjdCBicmNtZl9jb25zb2xlIGNvbnNvbGU7CS8qIENvbnNvbGUgb3V0cHV0IHBvbGxpbmcgc3VwcG9ydCAqLwotCXVpbnQgY29uc29sZV9hZGRyOwkvKiBDb25zb2xlIGFkZHJlc3MgZnJvbSBzaGFyZWQgc3RydWN0ICovCi0jZW5kaWYJCQkJLyogQkNNREJHICovCi0KLQl1aW50IHJlZ2ZhaWxzOwkJLyogQ291bnQgb2YgUl9SRUcgZmFpbHVyZXMgKi8KLQotCXVpbnQgY2xrc3RhdGU7CQkvKiBTdGF0ZSBvZiBzZCBhbmQgYmFja3BsYW5lIGNsb2NrKHMpICovCi0JYm9vbCBhY3Rpdml0eTsJCS8qIEFjdGl2aXR5IGZsYWcgZm9yIGNsb2NrIGRvd24gKi8KLQlzMzIgaWRsZXRpbWU7CQkvKiBDb250cm9sIGZvciBhY3Rpdml0eSB0aW1lb3V0ICovCi0JczMyIGlkbGVjb3VudDsJLyogQWN0aXZpdHkgdGltZW91dCBjb3VudGVyICovCi0JczMyIGlkbGVjbG9jazsJLyogSG93IHRvIHNldCBidXMgZHJpdmVyIHdoZW4gaWRsZSAqLwotCXMzMiBzZF9yeGNoYWluOwotCWJvb2wgdXNlX3J4Y2hhaW47CS8qIElmIGJyY21mIHNob3VsZCB1c2UgUEtUIGNoYWlucyAqLwotCWJvb2wgc2xlZXBpbmc7CQkvKiBJcyBTRElPIGJ1cyBzbGVlcGluZz8gKi8KLQlib29sIHJ4Zmxvd19tb2RlOwkvKiBSeCBmbG93IGNvbnRyb2wgbW9kZSAqLwotCWJvb2wgcnhmbG93OwkJLyogSXMgcnggZmxvdyBjb250cm9sIG9uICovCi0JYm9vbCBhbHBfb25seTsJCS8qIERvbid0IHVzZSBIVCBjbG9jayAoQUxQIG9ubHkpICovCi0vKiBGaWVsZCB0byBkZWNpZGUgaWYgcnggb2YgY29udHJvbCBmcmFtZXMgaGFwcGVuIGluIHJ4YnVmIG9yIGxiLXBvb2wgKi8KLQlib29sIHVzZWJ1ZnBvb2w7Ci0KLSNpZmRlZiBTRFRFU1QKLQkvKiBleHRlcm5hbCBsb29wYmFjayAqLwotCWJvb2wgZXh0X2xvb3A7Ci0JdTggbG9vcGlkOwotCi0JLyogcGt0Z2VuIGNvbmZpZ3VyYXRpb24gKi8KLQl1aW50IHBrdGdlbl9mcmVxOwkvKiBUaWNrcyBiZXR3ZWVuIGJ1cnN0cyAqLwotCXVpbnQgcGt0Z2VuX2NvdW50OwkvKiBQYWNrZXRzIHRvIHNlbmQgZWFjaCBidXJzdCAqLwotCXVpbnQgcGt0Z2VuX3ByaW50OwkvKiBCdXJzdHMgYmV0d2VlbiBjb3VudCBkaXNwbGF5cyAqLwotCXVpbnQgcGt0Z2VuX3RvdGFsOwkvKiBTdG9wIGFmdGVyIHRoaXMgbWFueSAqLwotCXVpbnQgcGt0Z2VuX21pbmxlbjsJLyogTWluaW11bSBwYWNrZXQgZGF0YSBsZW4gKi8KLQl1aW50IHBrdGdlbl9tYXhsZW47CS8qIE1heGltdW0gcGFja2V0IGRhdGEgbGVuICovCi0JdWludCBwa3RnZW5fbW9kZTsJLyogQ29uZmlndXJlZCBtb2RlOiB0eCwgcngsIG9yIGVjaG8gKi8KLQl1aW50IHBrdGdlbl9zdG9wOwkvKiBOdW1iZXIgb2YgdHggZmFpbHVyZXMgY2F1c2luZyBzdG9wICovCi0KLQkvKiBhY3RpdmUgcGt0Z2VuIGZpZWxkcyAqLwotCXVpbnQgcGt0Z2VuX3RpY2s7CS8qIFRpY2sgY291bnRlciBmb3IgYnVyc3RzICovCi0JdWludCBwa3RnZW5fcHRpY2s7CS8qIEJ1cnN0IGNvdW50ZXIgZm9yIHByaW50aW5nICovCi0JdWludCBwa3RnZW5fc2VudDsJLyogTnVtYmVyIG9mIHRlc3QgcGFja2V0cyBnZW5lcmF0ZWQgKi8KLQl1aW50IHBrdGdlbl9yY3ZkOwkvKiBOdW1iZXIgb2YgdGVzdCBwYWNrZXRzIHJlY2VpdmVkICovCi0JdWludCBwa3RnZW5fZmFpbDsJLyogTnVtYmVyIG9mIGZhaWxlZCBzZW5kIGF0dGVtcHRzICovCi0JdTE2IHBrdGdlbl9sZW47CS8qIExlbmd0aCBvZiBuZXh0IHBhY2tldCB0byBzZW5kICovCi0jZW5kaWYJCQkJLyogU0RURVNUICovCi0KLQkvKiBTb21lIGFkZGl0aW9uYWwgY291bnRlcnMgKi8KLQl1aW50IHR4X3NkZXJyczsJCS8qIENvdW50IG9mIHR4IGF0dGVtcHRzIHdpdGggc2QgZXJyb3JzICovCi0JdWludCBmY3F1ZXVlZDsJCS8qIFR4IHBhY2tldHMgdGhhdCBnb3QgcXVldWVkICovCi0JdWludCByeHJ0eDsJCS8qIENvdW50IG9mIHJ0eCByZXF1ZXN0cyAoTkFLIHRvIGRvbmdsZSkgKi8KLQl1aW50IHJ4X3Rvb2xvbmc7CS8qIFJlY2VpdmUgZnJhbWVzIHRvbyBsb25nIHRvIHJlY2VpdmUgKi8KLQl1aW50IHJ4Y19lcnJvcnM7CS8qIFNESU8gZXJyb3JzIHdoZW4gcmVhZGluZyBjb250cm9sIGZyYW1lcyAqLwotCXVpbnQgcnhfaGRyZmFpbDsJLyogU0RJTyBlcnJvcnMgb24gaGVhZGVyIHJlYWRzICovCi0JdWludCByeF9iYWRoZHI7CQkvKiBCYWQgcmVjZWl2ZWQgaGVhZGVycyAocm9vc3luYz8pICovCi0JdWludCByeF9iYWRzZXE7CQkvKiBNaXNtYXRjaGVkIHJ4IHNlcXVlbmNlIG51bWJlciAqLwotCXVpbnQgZmNfcmN2ZDsJCS8qIE51bWJlciBvZiBmbG93LWNvbnRyb2wgZXZlbnRzIHJlY2VpdmVkICovCi0JdWludCBmY194b2ZmOwkJLyogTnVtYmVyIHdoaWNoIHR1cm5lZCBvbiBmbG93LWNvbnRyb2wgKi8KLQl1aW50IGZjX3hvbjsJCS8qIE51bWJlciB3aGljaCB0dXJuZWQgb2ZmIGZsb3ctY29udHJvbCAqLwotCXVpbnQgcnhnbG9tZmFpbDsJLyogRmFpbGVkIGRlZ2xvbSBhdHRlbXB0cyAqLwotCXVpbnQgcnhnbG9tZnJhbWVzOwkvKiBOdW1iZXIgb2YgZ2xvbSBmcmFtZXMgKHN1cGVyZnJhbWVzKSAqLwotCXVpbnQgcnhnbG9tcGt0czsJLyogTnVtYmVyIG9mIHBhY2tldHMgZnJvbSBnbG9tIGZyYW1lcyAqLwotCXVpbnQgZjJyeGhkcnM7CQkvKiBOdW1iZXIgb2YgaGVhZGVyIHJlYWRzICovCi0JdWludCBmMnJ4ZGF0YTsJCS8qIE51bWJlciBvZiBmcmFtZSBkYXRhIHJlYWRzICovCi0JdWludCBmMnR4ZGF0YTsJCS8qIE51bWJlciBvZiBmMiBmcmFtZSB3cml0ZXMgKi8KLQl1aW50IGYxcmVnZGF0YTsJCS8qIE51bWJlciBvZiBmMSByZWdpc3RlciBhY2Nlc3NlcyAqLwotCi0JdTggKmN0cmxfZnJhbWVfYnVmOwotCXUzMiBjdHJsX2ZyYW1lX2xlbjsKLQlib29sIGN0cmxfZnJhbWVfc3RhdDsKLQotCXNwaW5sb2NrX3QgdHhxbG9jazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCBjdHJsX3dhaXQ7Ci0KLQlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKLQlzdHJ1Y3QgY29tcGxldGlvbiB3YXRjaGRvZ193YWl0OwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqd2F0Y2hkb2dfdHNrOwotCWJvb2wgd2RfdGltZXJfdmFsaWQ7Ci0KLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGFza2xldDsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmRwY190c2s7Ci0Jc3RydWN0IGNvbXBsZXRpb24gZHBjX3dhaXQ7Ci0KLQlib29sIHRocmVhZHNfb25seTsKLQlzdHJ1Y3Qgc2VtYXBob3JlIHNkc2VtOwotCXNwaW5sb2NrX3Qgc2Rsb2NrOwotCi0JY29uc3QgY2hhciAqZndfbmFtZTsKLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlOwotCWNvbnN0IGNoYXIgKm52X25hbWU7Ci0JdTMyIGZ3X3B0cjsKLX07Ci0KLXN0cnVjdCBzYmNvbmZpZyB7Ci0JdTMyIFBBRFsyXTsKLQl1MzIgc2JpcHNmbGFnOwkvKiBpbml0aWF0b3IgcG9ydCBvY3Agc2xhdmUgZmxhZyAqLwotCXUzMiBQQURbM107Ci0JdTMyIHNidHBzZmxhZzsJLyogdGFyZ2V0IHBvcnQgb2NwIHNsYXZlIGZsYWcgKi8KLQl1MzIgUEFEWzExXTsKLQl1MzIgc2J0bWVycmxvZ2E7CS8qIChzb25pY3MgPj0gMi4zKSAqLwotCXUzMiBQQUQ7Ci0JdTMyIHNidG1lcnJsb2c7CS8qIChzb25pY3MgPj0gMi4zKSAqLwotCXUzMiBQQURbM107Ci0JdTMyIHNiYWRtYXRjaDM7CS8qIGFkZHJlc3MgbWF0Y2gzICovCi0JdTMyIFBBRDsKLQl1MzIgc2JhZG1hdGNoMjsJLyogYWRkcmVzcyBtYXRjaDIgKi8KLQl1MzIgUEFEOwotCXUzMiBzYmFkbWF0Y2gxOwkvKiBhZGRyZXNzIG1hdGNoMSAqLwotCXUzMiBQQURbN107Ci0JdTMyIHNiaW1zdGF0ZTsJLyogaW5pdGlhdG9yIGFnZW50IHN0YXRlICovCi0JdTMyIHNiaW50dmVjOwkvKiBpbnRlcnJ1cHQgbWFzayAqLwotCXUzMiBzYnRtc3RhdGVsb3c7CS8qIHRhcmdldCBzdGF0ZSAqLwotCXUzMiBzYnRtc3RhdGVoaWdoOwkvKiB0YXJnZXQgc3RhdGUgKi8KLQl1MzIgc2Jid2EwOwkJLyogYmFuZHdpZHRoIGFsbG9jYXRpb24gdGFibGUwICovCi0JdTMyIFBBRDsKLQl1MzIgc2JpbWNvbmZpZ2xvdzsJLyogaW5pdGlhdG9yIGNvbmZpZ3VyYXRpb24gKi8KLQl1MzIgc2JpbWNvbmZpZ2hpZ2g7CS8qIGluaXRpYXRvciBjb25maWd1cmF0aW9uICovCi0JdTMyIHNiYWRtYXRjaDA7CS8qIGFkZHJlc3MgbWF0Y2gwICovCi0JdTMyIFBBRDsKLQl1MzIgc2J0bWNvbmZpZ2xvdzsJLyogdGFyZ2V0IGNvbmZpZ3VyYXRpb24gKi8KLQl1MzIgc2J0bWNvbmZpZ2hpZ2g7CS8qIHRhcmdldCBjb25maWd1cmF0aW9uICovCi0JdTMyIHNiYmNvbmZpZzsJLyogYnJvYWRjYXN0IGNvbmZpZ3VyYXRpb24gKi8KLQl1MzIgUEFEOwotCXUzMiBzYmJzdGF0ZTsJLyogYnJvYWRjYXN0IHN0YXRlICovCi0JdTMyIFBBRFszXTsKLQl1MzIgc2JhY3RjbmZnOwkvKiBhY3RpdmF0ZSBjb25maWd1cmF0aW9uICovCi0JdTMyIFBBRFszXTsKLQl1MzIgc2JmbGFnc3Q7CS8qIGN1cnJlbnQgc2JmbGFncyAqLwotCXUzMiBQQURbM107Ci0JdTMyIHNiaWRsb3c7CQkvKiBpZGVudGlmaWNhdGlvbiAqLwotCXUzMiBzYmlkaGlnaDsJLyogaWRlbnRpZmljYXRpb24gKi8KLX07Ci0KLS8qIGNsa3N0YXRlICovCi0jZGVmaW5lIENMS19OT05FCTAKLSNkZWZpbmUgQ0xLX1NET05MWQkxCi0jZGVmaW5lIENMS19QRU5ESU5HCTIJLyogTm90IHVzZWQgeWV0ICovCi0jZGVmaW5lIENMS19BVkFJTAkzCi0KLSNkZWZpbmUgQlJDTUZfTk9QTVUoYnJjbWYpCShmYWxzZSkKLQotI2lmZGVmIEJDTURCRwotc3RhdGljIGludCBxY291bnRbTlVNUFJJT107Ci1zdGF0aWMgaW50IHR4X3BhY2tldHNbTlVNUFJJT107Ci0jZW5kaWYJCQkJLyogQkNNREJHICovCi0KLS8qIERlZmVycmVkIHRyYW5zbWl0ICovCi11aW50IGJyY21mX2RlZmVycmVkX3R4ID0gMTsKLW1vZHVsZV9wYXJhbShicmNtZl9kZWZlcnJlZF90eCwgdWludCwgMCk7Ci0KLS8qIFdhdGNoZG9nIHRocmVhZCBwcmlvcml0eSwgLTEgdG8gdXNlIGtlcm5lbCB0aW1lciAqLwotaW50IGJyY21mX3dhdGNoZG9nX3ByaW8gPSA5NzsKLW1vZHVsZV9wYXJhbShicmNtZl93YXRjaGRvZ19wcmlvLCBpbnQsIDApOwotCi0vKiBXYXRjaGRvZyBpbnRlcnZhbCAqLwotdWludCBicmNtZl93YXRjaGRvZ19tcyA9IDEwOwotbW9kdWxlX3BhcmFtKGJyY21mX3dhdGNoZG9nX21zLCB1aW50LCAwKTsKLQotLyogRFBDIHRocmVhZCBwcmlvcml0eSwgLTEgdG8gdXNlIHRhc2tsZXQgKi8KLWludCBicmNtZl9kcGNfcHJpbyA9IDk4OwotbW9kdWxlX3BhcmFtKGJyY21mX2RwY19wcmlvLCBpbnQsIDApOwotCi0jaWZkZWYgQkNNREJHCi0vKiBDb25zb2xlIHBvbGwgaW50ZXJ2YWwgKi8KLXVpbnQgYnJjbWZfY29uc29sZV9tczsKLW1vZHVsZV9wYXJhbShicmNtZl9jb25zb2xlX21zLCB1aW50LCAwKTsKLSNlbmRpZgkJLyogQkNNREJHICovCi0KLS8qIFR4L1J4IGJvdW5kcyAqLwotdWludCBicmNtZl90eGJvdW5kOwotdWludCBicmNtZl9yeGJvdW5kOwotdWludCBicmNtZl90eG1pbm1heDsKLQotLyogb3ZlcnJpZGUgdGhlIFJBTSBzaXplIGlmIHBvc3NpYmxlICovCi0jZGVmaW5lIERPTkdMRV9NSU5fTUVNU0laRSAoMTI4ICogMTAyNCkKLWludCBicmNtZl9kb25nbGVfbWVtc2l6ZTsKLQotc3RhdGljIGJvb2wgYnJjbWZfYWxpZ25jdGw7Ci0KLXN0YXRpYyBib29sIHNkMWlkbGU7Ci0KLXN0YXRpYyBib29sIHJldHJ5ZGF0YTsKLSNkZWZpbmUgUkVUUllDSEFOKGNoYW4pICgoKGNoYW4pID09IFNEUENNX0VWRU5UX0NIQU5ORUwpIHx8IHJldHJ5ZGF0YSkKLQotc3RhdGljIGNvbnN0IHVpbnQgd2F0ZXJtYXJrID0gODsKLXN0YXRpYyBjb25zdCB1aW50IGZpcnN0cmVhZCA9IEJSQ01GX0ZJUlNUUkVBRDsKLQotLyogUmV0cnkgY291bnQgZm9yIHJlZ2lzdGVyIGFjY2VzcyBmYWlsdXJlcyAqLwotc3RhdGljIGNvbnN0IHVpbnQgcmV0cnlfbGltaXQgPSAyOwotCi0vKiBGb3JjZSBldmVuIFNEIGxlbmd0aHMgKHNvbWUgaG9zdCBjb250cm9sbGVycyBtZXNzIHVwIG9uIG9kZCBieXRlcykgKi8KLXN0YXRpYyBib29sIGZvcmNlYWxpZ247Ci0KLSNkZWZpbmUgQUxJR05NRU5UICA0Ci0KLSNkZWZpbmUgUEtUQUxJR04oX3AsIF9sZW4sIF9hbGlnbikJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJdWludCBkYXRhbGlnbjsJCQkJCQlcCi0JCWRhdGFsaWduID0gKHVuc2lnbmVkIGxvbmcpKChfcCktPmRhdGEpOwkJCVwKLQkJZGF0YWxpZ24gPSByb3VuZHVwKGRhdGFsaWduLCAoX2FsaWduKSkgLSBkYXRhbGlnbjsJXAotCQlpZiAoZGF0YWxpZ24pCQkJCQkJXAotCQkJc2tiX3B1bGwoKF9wKSwgZGF0YWxpZ24pOwkJCVwKLQkJX19za2JfdHJpbSgoX3ApLCAoX2xlbikpOwkJCQlcCi0JfSB3aGlsZSAoMCkKLQotLyogTGltaXQgb24gcm91bmRpbmcgdXAgZnJhbWVzICovCi1zdGF0aWMgY29uc3QgdWludCBtYXhfcm91bmR1cCA9IDUxMjsKLQotLyogVHJ5IGRvaW5nIHJlYWRhaGVhZCAqLwotc3RhdGljIGJvb2wgYnJjbWZfcmVhZGFoZWFkOwotCi0vKiBUbyBjaGVjayBpZiB0aGVyZSdzIHdpbmRvdyBvZmZlcmVkICovCi0jZGVmaW5lIERBVEFPSyhidXMpIFwKLQkoKCh1OCkoYnVzLT50eF9tYXggLSBidXMtPnR4X3NlcSkgIT0gMCkgJiYgXAotCSgoKHU4KShidXMtPnR4X21heCAtIGJ1cy0+dHhfc2VxKSAmIDB4ODApID09IDApKQotCi0vKgotICogUmVhZHMgYSByZWdpc3RlciBpbiB0aGUgU0RJTyBoYXJkd2FyZSBibG9jay4gVGhpcyBibG9jayBvY2N1cGllcyBhIHNlcmllcyBvZgotICogYWRyZXNzZXMgb24gdGhlIDMyIGJpdCBiYWNrcGxhbmUgYnVzLgotICovCi1zdGF0aWMgdm9pZAotcl9zZHJlZzMyKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdTMyICpyZWd2YXIsIHUzMiByZWdfb2Zmc2V0LCB1MzIgKnJldHJ5dmFyKQotewotCSpyZXRyeXZhciA9IDA7Ci0JZG8gewotCQkqcmVndmFyID0gUl9SRUcoYnVzLT5jaS0+YnVzY29yZWJhc2UgKyByZWdfb2Zmc2V0LCB1MzIpOwotCX0gd2hpbGUgKGJyY21mX3NkY2FyZF9yZWdmYWlsKGJ1cy0+Y2FyZCkgJiYKLQkJICgrKygqcmV0cnl2YXIpIDw9IHJldHJ5X2xpbWl0KSk7Ci0JaWYgKCpyZXRyeXZhcikgewotCQlidXMtPnJlZ2ZhaWxzICs9ICgqcmV0cnl2YXItMSk7Ci0JCWlmICgqcmV0cnl2YXIgPiByZXRyeV9saW1pdCkgewotCQkJQlJDTUZfRVJST1IoKCJGQUlMRUQgUkVBRCAlWGhcbiIsIHJlZ19vZmZzZXQpKTsKLQkJCSpyZWd2YXIgPSAwOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotd19zZHJlZzMyKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdTMyIHJlZ3ZhbCwgdTMyIHJlZ19vZmZzZXQsIHUzMiAqcmV0cnl2YXIpCi17Ci0JKnJldHJ5dmFyID0gMDsKLQlkbyB7Ci0JCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoTlVMTCwgYnVzLT5jaS0+YnVzY29yZWJhc2UgKyByZWdfb2Zmc2V0LAotCQkJCSAgICAgICBzaXplb2YodTMyKSwgcmVndmFsKTsKLQl9IHdoaWxlIChicmNtZl9zZGNhcmRfcmVnZmFpbChidXMtPmNhcmQpICYmCi0JCSAoKysoKnJldHJ5dmFyKSA8PSByZXRyeV9saW1pdCkpOwotCWlmICgqcmV0cnl2YXIpIHsKLQkJYnVzLT5yZWdmYWlscyArPSAoKnJldHJ5dmFyLTEpOwotCQlpZiAoKnJldHJ5dmFyID4gcmV0cnlfbGltaXQpCi0JCQlCUkNNRl9FUlJPUigoIkZBSUxFRCBSRUdJU1RFUiBXUklURSIKLQkJCQkgICAgICIgJVhoXG4iLCByZWdfb2Zmc2V0KSk7Ci0JfQotfQotCi0jZGVmaW5lIEJSQ01GX0JVUwkJCVNESU9fQlVTCi0KLSNkZWZpbmUgUEtUX0FWQUlMQUJMRSgpCQkoaW50c3RhdHVzICYgSV9ITUJfRlJBTUVfSU5EKQotCi0jZGVmaW5lIEhPU1RJTlRNQVNLCQkoSV9ITUJfU1dfTUFTSyB8IElfQ0hJUEFDVElWRSkKLQotI2lmZGVmIFNEVEVTVAotc3RhdGljIHZvaWQgYnJjbWZfc2RicmNtX2NoZWNrZGllZChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHZvaWQgKnBrdCwgdWludCBzZXEpOwotc3RhdGljIHZvaWQgYnJjbWZfc2RicmNtX3NkdGVzdF9zZXQoc3RydWN0IGJyY21mX2J1cyAqYnVzLCBib29sIHN0YXJ0KTsKLSNlbmRpZgotCi0jaWZkZWYgQkNNREJHCi1zdGF0aWMgaW50IGJyY21mX3NkYnJjbV9idXNfY29uc29sZV9pbihzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLAotCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICptc2csIHVpbnQgbXNnbGVuKTsKLXN0YXRpYyBpbnQgYnJjbWZfc2RicmNtX2NoZWNrZGllZChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHU4ICpkYXRhLCB1aW50IHNpemUpOwotc3RhdGljIGludCBicmNtZl9zZGJyY21fbWVtX2R1bXAoc3RydWN0IGJyY21mX2J1cyAqYnVzKTsKLSNlbmRpZgkJCQkvKiBCQ01EQkcgICovCi1zdGF0aWMgaW50IGJyY21mX3NkYnJjbV9kb3dubG9hZF9zdGF0ZShzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIGJvb2wgZW50ZXIpOwotCi1zdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fcmVsZWFzZShzdHJ1Y3QgYnJjbWZfYnVzICpidXMpOwotc3RhdGljIHZvaWQgYnJjbWZfc2RicmNtX3JlbGVhc2VfbWFsbG9jKHN0cnVjdCBicmNtZl9idXMgKmJ1cyk7Ci1zdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fZGlzY29ubmVjdCh2b2lkICpwdHIpOwotc3RhdGljIGJvb2wgYnJjbWZfc2RicmNtX2NoaXBtYXRjaCh1MTYgY2hpcGlkKTsKLXN0YXRpYyBib29sIGJyY21mX3NkYnJjbV9wcm9iZV9hdHRhY2goc3RydWN0IGJyY21mX2J1cyAqYnVzLCB2b2lkICpjYXJkLAotCQkJCSAgICAgIHUzMiByZWdzdmEsIHUxNiBkZXZpZCk7Ci1zdGF0aWMgYm9vbCBicmNtZl9zZGJyY21fcHJvYmVfbWFsbG9jKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdm9pZCAqY2FyZCk7Ci1zdGF0aWMgYm9vbCBicmNtZl9zZGJyY21fcHJvYmVfaW5pdChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHZvaWQgKmNhcmQpOwotc3RhdGljIHZvaWQgYnJjbWZfc2RicmNtX3JlbGVhc2VfZG9uZ2xlKHN0cnVjdCBicmNtZl9idXMgKmJ1cyk7Ci0KLXN0YXRpYyB1aW50IGJyY21mX3Byb2Nlc3NfbnZyYW1fdmFycyhjaGFyICp2YXJidWYsIHVpbnQgbGVuKTsKLQotc3RhdGljIHZvaWQgYnJjbWZfc2RicmNtX3NldG1lbXNpemUoc3RydWN0IGJyY21mX2J1cyAqYnVzLCBpbnQgbWVtX3NpemUpOwotc3RhdGljIGludCBicmNtZl9zZGJyY21fc2VuZF9idWYoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1MzIgYWRkciwgdWludCBmbiwKLQkJCSAgICAgICB1aW50IGZsYWdzLCB1OCAqYnVmLCB1aW50IG5ieXRlcywKLQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LAotCQkJICAgICAgIHZvaWQgKCpjb21wbGV0ZSkodm9pZCAqaGFuZGxlLCBpbnQgc3RhdHVzLAotCQkJCQkJICAgICAgYm9vbCBzeW5jX3dhaXRpbmcpLAotCQkJICAgICAgIHZvaWQgKmhhbmRsZSk7Ci0KLXN0YXRpYyBib29sIGJyY21mX3NkYnJjbV9kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHZvaWQgKmNhcmQpOwotc3RhdGljIGludCAgX2JyY21mX3NkYnJjbV9kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgYnJjbWZfYnVzICpidXMpOwotCi1zdGF0aWMgaW50IGJyY21mX3NkYnJjbV9kb3dubG9hZF9jb2RlX2ZpbGUoc3RydWN0IGJyY21mX2J1cyAqYnVzKTsKLXN0YXRpYyBpbnQgYnJjbWZfc2RicmNtX2Rvd25sb2FkX252cmFtKHN0cnVjdCBicmNtZl9idXMgKmJ1cyk7Ci0KLXN0YXRpYyB2b2lkCi1icmNtZl9zZGJyY21fY2hpcF9kaXNhYmxlY29yZShzdHJ1Y3QgYnJjbWZfc2Rpb19jYXJkICpjYXJkLCB1MzIgY29yZWJhc2UpOwotCi1zdGF0aWMgaW50IGJyY21mX3NkYnJjbV9jaGlwX2F0dGFjaChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHUzMiByZWdzKTsKLQotc3RhdGljIHZvaWQKLWJyY21mX3NkYnJjbV9jaGlwX3Jlc2V0Y29yZShzdHJ1Y3QgYnJjbWZfc2Rpb19jYXJkICpjYXJkLCB1MzIgY29yZWJhc2UpOwotCi1zdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fc2Rpb2RfZHJpdmVfc3RyZW5ndGhfaW5pdChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsCi0JCQkJCXUzMiBkcml2ZXN0cmVuZ3RoKTsKLXN0YXRpYyB2b2lkIGJyY21mX3NkYnJjbV9jaGlwX2RldGFjaChzdHJ1Y3QgYnJjbWZfYnVzICpidXMpOwotc3RhdGljIHZvaWQgYnJjbWZfc2RicmNtX3dhaXRfZm9yX2V2ZW50KHN0cnVjdCBicmNtZl9idXMgKmJ1cywgYm9vbCAqbG9ja3Zhcik7Ci1zdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fd2FpdF9ldmVudF93YWtldXAoc3RydWN0IGJyY21mX2J1cyAqYnVzKTsKLXN0YXRpYyB2b2lkIGJyY21mX3NkYnJjbV93YXRjaGRvZyh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIGludCBicmNtZl9zZGJyY21fd2F0Y2hkb2dfdGhyZWFkKHZvaWQgKmRhdGEpOwotc3RhdGljIGludCBicmNtZl9zZGJyY21fZHBjX3RocmVhZCh2b2lkICpkYXRhKTsKLXN0YXRpYyB2b2lkIGJyY21mX3NkYnJjbV9kcGNfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpOwotc3RhdGljIHZvaWQgYnJjbWZfc2RicmNtX3NjaGVkX2RwYyhzdHJ1Y3QgYnJjbWZfYnVzICpidXMpOwotc3RhdGljIHZvaWQgYnJjbWZfc2RicmNtX3NkbG9jayhzdHJ1Y3QgYnJjbWZfYnVzICpidXMpOwotc3RhdGljIHZvaWQgYnJjbWZfc2RicmNtX3NkdW5sb2NrKHN0cnVjdCBicmNtZl9idXMgKmJ1cyk7Ci1zdGF0aWMgaW50IGJyY21mX3NkYnJjbV9nZXRfaW1hZ2UoY2hhciAqYnVmLCBpbnQgbGVuLCBzdHJ1Y3QgYnJjbWZfYnVzICpidXMpOwotCi0vKiBQYWNrZXQgZnJlZSBhcHBsaWNhYmxlIHVuY29uZGl0aW9uYWxseSBmb3Igc2RpbyBhbmQgc2RzcGkuCi0gKiBDb25kaXRpb25hbCBpZiBidWZwb29sIHdhcyBwcmVzZW50IGZvciBnc3BpIGJ1cy4KLSAqLwotc3RhdGljIHZvaWQgYnJjbWZfc2RicmNtX3BrdGZyZWUyKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgc3RydWN0IHNrX2J1ZmYgKnBrdCkKLXsKLQlpZiAoKGJ1cy0+YnVzICE9IFNQSV9CVVMpIHx8IGJ1cy0+dXNlYnVmcG9vbCkKLQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihwa3QpOwotfQotCi1zdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fc2V0bWVtc2l6ZShzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIGludCBtZW1fc2l6ZSkKLXsKLQlzMzIgbWluX3NpemUgPSBET05HTEVfTUlOX01FTVNJWkU7Ci0JLyogUmVzdHJpY3QgdGhlIG1lbXNpemUgdG8gdXNlciBzcGVjaWZpZWQgbGltaXQgKi8KLQlCUkNNRl9FUlJPUigoInVzZXI6IFJlc3RyaWN0IHRoZSBkb25nbGUgcmFtIHNpemUgdG8gJWQsIG1pbiAlZFxuIiwKLQkJICAgICBicmNtZl9kb25nbGVfbWVtc2l6ZSwgbWluX3NpemUpKTsKLQlpZiAoKGJyY21mX2RvbmdsZV9tZW1zaXplID4gbWluX3NpemUpICYmCi0JICAgIChicmNtZl9kb25nbGVfbWVtc2l6ZSA8IChzMzIpIGJ1cy0+b3JpZ19yYW1zaXplKSkKLQkJYnVzLT5yYW1zaXplID0gYnJjbWZfZG9uZ2xlX21lbXNpemU7Ci19Ci0KLXN0YXRpYyBpbnQgYnJjbWZfc2RicmNtX3NldF9zaWFkZHJfd2luZG93KHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdTMyIGFkZHJlc3MpCi17Ci0JaW50IGVyciA9IDA7Ci0JYnJjbWZfc2RjYXJkX2NmZ193cml0ZShidXMtPmNhcmQsIFNESU9fRlVOQ18xLCBTQlNESU9fRlVOQzFfU0JBRERSTE9XLAotCQkJIChhZGRyZXNzID4+IDgpICYgU0JTRElPX1NCQUREUkxPV19NQVNLLCAmZXJyKTsKLQlpZiAoIWVycikKLQkJYnJjbWZfc2RjYXJkX2NmZ193cml0ZShidXMtPmNhcmQsIFNESU9fRlVOQ18xLAotCQkJCSBTQlNESU9fRlVOQzFfU0JBRERSTUlELAotCQkJCSAoYWRkcmVzcyA+PiAxNikgJiBTQlNESU9fU0JBRERSTUlEX01BU0ssICZlcnIpOwotCWlmICghZXJyKQotCQlicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKGJ1cy0+Y2FyZCwgU0RJT19GVU5DXzEsCi0JCQkJICAgICAgIFNCU0RJT19GVU5DMV9TQkFERFJISUdILAotCQkJCSAgICAgICAoYWRkcmVzcyA+PiAyNCkgJiBTQlNESU9fU0JBRERSSElHSF9NQVNLLAotCQkJCSAgICAgICAmZXJyKTsKLQlyZXR1cm4gZXJyOwotfQotCi0vKiBUdXJuIGJhY2twbGFuZSBjbG9jayBvbiBvciBvZmYgKi8KLXN0YXRpYyBpbnQgYnJjbWZfc2RicmNtX2h0Y2xrKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgYm9vbCBvbiwgYm9vbCBwZW5kb2spCi17Ci0JaW50IGVycjsKLQl1OCBjbGtjdGwsIGNsa3JlcSwgZGV2Y3RsOwotCXN0cnVjdCBicmNtZl9zZGlvX2NhcmQgKmNhcmQ7Ci0KLQlCUkNNRl9UUkFDRSgoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKLQotCWNsa2N0bCA9IDA7Ci0JY2FyZCA9IGJ1cy0+Y2FyZDsKLQotCWlmIChvbikgewotCQkvKiBSZXF1ZXN0IEhUIEF2YWlsICovCi0JCWNsa3JlcSA9Ci0JCSAgICBidXMtPmFscF9vbmx5ID8gU0JTRElPX0FMUF9BVkFJTF9SRVEgOiBTQlNESU9fSFRfQVZBSUxfUkVROwotCi0JCWlmICgoYnVzLT5jaS0+Y2hpcCA9PSBCQ000MzI5X0NISVBfSUQpCi0JCSAgICAmJiAoYnVzLT5jaS0+Y2hpcHJldiA9PSAwKSkKLQkJCWNsa3JlcSB8PSBTQlNESU9fRk9SQ0VfQUxQOwotCi0JCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoY2FyZCwgU0RJT19GVU5DXzEsCi0JCQkJICAgICAgIFNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSLCBjbGtyZXEsICZlcnIpOwotCQlpZiAoZXJyKSB7Ci0JCQlCUkNNRl9FUlJPUigoIiVzOiBIVCBBdmFpbCByZXF1ZXN0IGVycm9yOiAlZFxuIiwKLQkJCQkgICAgIF9fZnVuY19fLCBlcnIpKTsKLQkJCXJldHVybiAtRUJBREU7Ci0JCX0KLQotCQlpZiAocGVuZG9rICYmICgoYnVzLT5jaS0+YnVzY29yZXR5cGUgPT0gUENNQ0lBX0NPUkVfSUQpCi0JCQkgICAgICAgJiYgKGJ1cy0+Y2ktPmJ1c2NvcmVyZXYgPT0gOSkpKSB7Ci0JCQl1MzIgZHVtbXksIHJldHJpZXM7Ci0JCQlyX3NkcmVnMzIoYnVzLCAmZHVtbXksCi0JCQkJICBvZmZzZXRvZihzdHJ1Y3Qgc2RwY21kX3JlZ3MsIGNsb2NrY3Rsc3RhdHVzKSwKLQkJCQkgICZyZXRyaWVzKTsKLQkJfQotCi0JCS8qIENoZWNrIGN1cnJlbnQgc3RhdHVzICovCi0JCWNsa2N0bCA9IGJyY21mX3NkY2FyZF9jZmdfcmVhZChjYXJkLCBTRElPX0ZVTkNfMSwKLQkJCQkJICAgICAgIFNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSLCAmZXJyKTsKLQkJaWYgKGVycikgewotCQkJQlJDTUZfRVJST1IoKCIlczogSFQgQXZhaWwgcmVhZCBlcnJvcjogJWRcbiIsCi0JCQkJICAgICBfX2Z1bmNfXywgZXJyKSk7Ci0JCQlyZXR1cm4gLUVCQURFOwotCQl9Ci0KLQkJLyogR28gdG8gcGVuZGluZyBhbmQgYXdhaXQgaW50ZXJydXB0IGlmIGFwcHJvcHJpYXRlICovCi0JCWlmICghU0JTRElPX0NMS0FWKGNsa2N0bCwgYnVzLT5hbHBfb25seSkgJiYgcGVuZG9rKSB7Ci0JCQkvKiBBbGxvdyBvbmx5IGNsb2NrLWF2YWlsYWJsZSBpbnRlcnJ1cHQgKi8KLQkJCWRldmN0bCA9IGJyY21mX3NkY2FyZF9jZmdfcmVhZChjYXJkLCBTRElPX0ZVTkNfMSwKLQkJCQkJU0JTRElPX0RFVklDRV9DVEwsICZlcnIpOwotCQkJaWYgKGVycikgewotCQkJCUJSQ01GX0VSUk9SKCgiJXM6IERldmN0bCBlcnJvciBzZXR0aW5nIENBOiIKLQkJCQkJICAgICAiICVkXG4iLCBfX2Z1bmNfXywgZXJyKSk7Ci0JCQkJcmV0dXJuIC1FQkFERTsKLQkJCX0KLQotCQkJZGV2Y3RsIHw9IFNCU0RJT19ERVZDVExfQ0FfSU5UX09OTFk7Ci0JCQlicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKGNhcmQsIFNESU9fRlVOQ18xLAotCQkJCQkgICAgICAgU0JTRElPX0RFVklDRV9DVEwsIGRldmN0bCwgJmVycik7Ci0JCQlCUkNNRl9JTkZPKCgiQ0xLQ1RMOiBzZXQgUEVORElOR1xuIikpOwotCQkJYnVzLT5jbGtzdGF0ZSA9IENMS19QRU5ESU5HOwotCi0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChidXMtPmNsa3N0YXRlID09IENMS19QRU5ESU5HKSB7Ci0JCQkvKiBDYW5jZWwgQ0Etb25seSBpbnRlcnJ1cHQgZmlsdGVyICovCi0JCQlkZXZjdGwgPQotCQkJICAgIGJyY21mX3NkY2FyZF9jZmdfcmVhZChjYXJkLCBTRElPX0ZVTkNfMSwKLQkJCQkJCSAgU0JTRElPX0RFVklDRV9DVEwsICZlcnIpOwotCQkJZGV2Y3RsICY9IH5TQlNESU9fREVWQ1RMX0NBX0lOVF9PTkxZOwotCQkJYnJjbWZfc2RjYXJkX2NmZ193cml0ZShjYXJkLCBTRElPX0ZVTkNfMSwKLQkJCQlTQlNESU9fREVWSUNFX0NUTCwgZGV2Y3RsLCAmZXJyKTsKLQkJfQotCi0JCS8qIE90aGVyd2lzZSwgd2FpdCBoZXJlIChwb2xsaW5nKSBmb3IgSFQgQXZhaWwgKi8KLQkJaWYgKCFTQlNESU9fQ0xLQVYoY2xrY3RsLCBidXMtPmFscF9vbmx5KSkgewotCQkJQlJDTUZfU1BJTldBSVRfU0xFRVAoc2Rpb2hfc3BpbndhaXRfc2xlZXAsCi0JCQkgICAgICAgKChjbGtjdGwgPQotCQkJCSBicmNtZl9zZGNhcmRfY2ZnX3JlYWQoY2FyZCwgU0RJT19GVU5DXzEsCi0JCQkJCSBTQlNESU9fRlVOQzFfQ0hJUENMS0NTUiwKLQkJCQkJCSAmZXJyKSksCi0JCQkJIVNCU0RJT19DTEtBVihjbGtjdGwsIGJ1cy0+YWxwX29ubHkpKSwKLQkJCSAgICAgICBQTVVfTUFYX1RSQU5TSVRJT05fRExZKTsKLQkJfQotCQlpZiAoZXJyKSB7Ci0JCQlCUkNNRl9FUlJPUigoIiVzOiBIVCBBdmFpbCByZXF1ZXN0IGVycm9yOiAlZFxuIiwKLQkJCQkgICAgIF9fZnVuY19fLCBlcnIpKTsKLQkJCXJldHVybiAtRUJBREU7Ci0JCX0KLQkJaWYgKCFTQlNESU9fQ0xLQVYoY2xrY3RsLCBidXMtPmFscF9vbmx5KSkgewotCQkJQlJDTUZfRVJST1IoKCIlczogSFQgQXZhaWwgdGltZW91dCAoJWQpOiAiCi0JCQkJICAgICAiY2xrY3RsIDB4JTAyeFxuIiwgX19mdW5jX18sCi0JCQkJICAgICBQTVVfTUFYX1RSQU5TSVRJT05fRExZLCBjbGtjdGwpKTsKLQkJCXJldHVybiAtRUJBREU7Ci0JCX0KLQotCQkvKiBNYXJrIGNsb2NrIGF2YWlsYWJsZSAqLwotCQlidXMtPmNsa3N0YXRlID0gQ0xLX0FWQUlMOwotCQlCUkNNRl9JTkZPKCgiQ0xLQ1RMOiB0dXJuZWQgT05cbiIpKTsKLQotI2lmIGRlZmluZWQoQkNNREJHKQotCQlpZiAoYnVzLT5hbHBfb25seSAhPSB0cnVlKSB7Ci0JCQlpZiAoU0JTRElPX0FMUE9OTFkoY2xrY3RsKSkgewotCQkJCUJSQ01GX0VSUk9SKCgiJXM6IEhUIENsb2NrIHNob3VsZCBiZSBvbi5cbiIsCi0JCQkJCSAgICAgX19mdW5jX18pKTsKLQkJCX0KLQkJfQotI2VuZGlmCQkJCS8qIGRlZmluZWQgKEJDTURCRykgKi8KLQotCQlidXMtPmFjdGl2aXR5ID0gdHJ1ZTsKLQl9IGVsc2UgewotCQljbGtyZXEgPSAwOwotCi0JCWlmIChidXMtPmNsa3N0YXRlID09IENMS19QRU5ESU5HKSB7Ci0JCQkvKiBDYW5jZWwgQ0Etb25seSBpbnRlcnJ1cHQgZmlsdGVyICovCi0JCQlkZXZjdGwgPSBicmNtZl9zZGNhcmRfY2ZnX3JlYWQoY2FyZCwgU0RJT19GVU5DXzEsCi0JCQkJCVNCU0RJT19ERVZJQ0VfQ1RMLCAmZXJyKTsKLQkJCWRldmN0bCAmPSB+U0JTRElPX0RFVkNUTF9DQV9JTlRfT05MWTsKLQkJCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoY2FyZCwgU0RJT19GVU5DXzEsCi0JCQkJU0JTRElPX0RFVklDRV9DVEwsIGRldmN0bCwgJmVycik7Ci0JCX0KLQotCQlidXMtPmNsa3N0YXRlID0gQ0xLX1NET05MWTsKLQkJYnJjbWZfc2RjYXJkX2NmZ193cml0ZShjYXJkLCBTRElPX0ZVTkNfMSwKLQkJCVNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSLCBjbGtyZXEsICZlcnIpOwotCQlCUkNNRl9JTkZPKCgiQ0xLQ1RMOiB0dXJuZWQgT0ZGXG4iKSk7Ci0JCWlmIChlcnIpIHsKLQkJCUJSQ01GX0VSUk9SKCgiJXM6IEZhaWxlZCBhY2Nlc3MgdHVybmluZyBjbG9jayBvZmY6IgotCQkJCSAgICAgIiAlZFxuIiwgX19mdW5jX18sIGVycikpOwotCQkJcmV0dXJuIC1FQkFERTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogQ2hhbmdlIGlkbGUvYWN0aXZlIFNEIHN0YXRlICovCi1zdGF0aWMgaW50IGJyY21mX3NkYnJjbV9zZGNsayhzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIGJvb2wgb24pCi17Ci0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQlpZiAob24pCi0JCWJ1cy0+Y2xrc3RhdGUgPSBDTEtfU0RPTkxZOwotCWVsc2UKLQkJYnVzLT5jbGtzdGF0ZSA9IENMS19OT05FOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFRyYW5zaXRpb24gU0QgYW5kIGJhY2twbGFuZSBjbG9jayByZWFkaW5lc3MgKi8KLXN0YXRpYyBpbnQgYnJjbWZfc2RicmNtX2Nsa2N0bChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHVpbnQgdGFyZ2V0LCBib29sIHBlbmRvaykKLXsKLSNpZmRlZiBCQ01EQkcKLQl1aW50IG9sZHN0YXRlID0gYnVzLT5jbGtzdGF0ZTsKLSNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KLQotCUJSQ01GX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwotCi0JLyogRWFybHkgZXhpdCBpZiB3ZSdyZSBhbHJlYWR5IHRoZXJlICovCi0JaWYgKGJ1cy0+Y2xrc3RhdGUgPT0gdGFyZ2V0KSB7Ci0JCWlmICh0YXJnZXQgPT0gQ0xLX0FWQUlMKSB7Ci0JCQlicmNtZl9zZGJyY21fd2RfdGltZXIoYnVzLCBicmNtZl93YXRjaGRvZ19tcyk7Ci0JCQlidXMtPmFjdGl2aXR5ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzd2l0Y2ggKHRhcmdldCkgewotCWNhc2UgQ0xLX0FWQUlMOgotCQkvKiBNYWtlIHN1cmUgU0QgY2xvY2sgaXMgYXZhaWxhYmxlICovCi0JCWlmIChidXMtPmNsa3N0YXRlID09IENMS19OT05FKQotCQkJYnJjbWZfc2RicmNtX3NkY2xrKGJ1cywgdHJ1ZSk7Ci0JCS8qIE5vdyByZXF1ZXN0IEhUIEF2YWlsIG9uIHRoZSBiYWNrcGxhbmUgKi8KLQkJYnJjbWZfc2RicmNtX2h0Y2xrKGJ1cywgdHJ1ZSwgcGVuZG9rKTsKLQkJYnJjbWZfc2RicmNtX3dkX3RpbWVyKGJ1cywgYnJjbWZfd2F0Y2hkb2dfbXMpOwotCQlidXMtPmFjdGl2aXR5ID0gdHJ1ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIENMS19TRE9OTFk6Ci0JCS8qIFJlbW92ZSBIVCByZXF1ZXN0LCBvciBicmluZyB1cCBTRCBjbG9jayAqLwotCQlpZiAoYnVzLT5jbGtzdGF0ZSA9PSBDTEtfTk9ORSkKLQkJCWJyY21mX3NkYnJjbV9zZGNsayhidXMsIHRydWUpOwotCQllbHNlIGlmIChidXMtPmNsa3N0YXRlID09IENMS19BVkFJTCkKLQkJCWJyY21mX3NkYnJjbV9odGNsayhidXMsIGZhbHNlLCBmYWxzZSk7Ci0JCWVsc2UKLQkJCUJSQ01GX0VSUk9SKCgiYnJjbWZfc2RicmNtX2Nsa2N0bDogcmVxdWVzdCBmb3IgJWQgLT4gJWQiCi0JCQkJICAgICAiXG4iLCBidXMtPmNsa3N0YXRlLCB0YXJnZXQpKTsKLQkJYnJjbWZfc2RicmNtX3dkX3RpbWVyKGJ1cywgYnJjbWZfd2F0Y2hkb2dfbXMpOwotCQlicmVhazsKLQotCWNhc2UgQ0xLX05PTkU6Ci0JCS8qIE1ha2Ugc3VyZSB0byByZW1vdmUgSFQgcmVxdWVzdCAqLwotCQlpZiAoYnVzLT5jbGtzdGF0ZSA9PSBDTEtfQVZBSUwpCi0JCQlicmNtZl9zZGJyY21faHRjbGsoYnVzLCBmYWxzZSwgZmFsc2UpOwotCQkvKiBOb3cgcmVtb3ZlIHRoZSBTRCBjbG9jayAqLwotCQlicmNtZl9zZGJyY21fc2RjbGsoYnVzLCBmYWxzZSk7Ci0JCWJyY21mX3NkYnJjbV93ZF90aW1lcihidXMsIDApOwotCQlicmVhazsKLQl9Ci0jaWZkZWYgQkNNREJHCi0JQlJDTUZfSU5GTygoImJyY21mX3NkYnJjbV9jbGtjdGw6ICVkIC0+ICVkXG4iLAotCQkgICAgb2xkc3RhdGUsIGJ1cy0+Y2xrc3RhdGUpKTsKLSNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KLQotCXJldHVybiAwOwotfQotCi1pbnQgYnJjbWZfc2RicmNtX2J1c3NsZWVwKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgYm9vbCBzbGVlcCkKLXsKLQlzdHJ1Y3QgYnJjbWZfc2Rpb19jYXJkICpjYXJkID0gYnVzLT5jYXJkOwotCXVpbnQgcmV0cmllcyA9IDA7Ci0KLQlCUkNNRl9JTkZPKCgiYnJjbWZfc2RicmNtX2J1c3NsZWVwOiByZXF1ZXN0ICVzIChjdXJyZW50bHkgJXMpXG4iLAotCQkgICAgKHNsZWVwID8gIlNMRUVQIiA6ICJXQUtFIiksCi0JCSAgICAoYnVzLT5zbGVlcGluZyA/ICJTTEVFUCIgOiAiV0FLRSIpKSk7Ci0KLQkvKiBEb25lIGlmIHdlJ3JlIGFscmVhZHkgaW4gdGhlIHJlcXVlc3RlZCBzdGF0ZSAqLwotCWlmIChzbGVlcCA9PSBidXMtPnNsZWVwaW5nKQotCQlyZXR1cm4gMDsKLQotCS8qIEdvaW5nIHRvIHNsZWVwOiBzZXQgdGhlIGFsYXJtIGFuZCB0dXJuIG9mZiB0aGUgbGlnaHRzLi4uICovCi0JaWYgKHNsZWVwKSB7Ci0JCS8qIERvbid0IHNsZWVwIGlmIHNvbWV0aGluZyBpcyBwZW5kaW5nICovCi0JCWlmIChidXMtPmRwY19zY2hlZCB8fCBidXMtPnJ4c2tpcCB8fCBwa3RxX2xlbigmYnVzLT50eHEpKQotCQkJcmV0dXJuIC1FQlVTWTsKLQotCQkvKiBEaXNhYmxlIFNESU8gaW50ZXJydXB0cyAobm8gbG9uZ2VyIGludGVyZXN0ZWQpICovCi0JCWJyY21mX3NkY2FyZF9pbnRyX2Rpc2FibGUoYnVzLT5jYXJkKTsKLQotCQkvKiBNYWtlIHN1cmUgdGhlIGNvbnRyb2xsZXIgaGFzIHRoZSBidXMgdXAgKi8KLQkJYnJjbWZfc2RicmNtX2Nsa2N0bChidXMsIENMS19BVkFJTCwgZmFsc2UpOwotCi0JCS8qIFRlbGwgZGV2aWNlIHRvIHN0YXJ0IHVzaW5nIE9PQiB3YWtldXAgKi8KLQkJd19zZHJlZzMyKGJ1cywgU01CX1VTRV9PT0IsCi0JCQkgIG9mZnNldG9mKHN0cnVjdCBzZHBjbWRfcmVncywgdG9zYm1haWxib3gpLCAmcmV0cmllcyk7Ci0JCWlmIChyZXRyaWVzID4gcmV0cnlfbGltaXQpCi0JCQlCUkNNRl9FUlJPUigoIkNBTk5PVCBTSUdOQUwgQ0hJUCwgIgotCQkJCSAgICAgIldJTEwgTk9UIFdBS0UgVVAhIVxuIikpOwotCi0JCS8qIFR1cm4gb2ZmIG91ciBjb250cmlidXRpb24gdG8gdGhlIEhUIGNsb2NrIHJlcXVlc3QgKi8KLQkJYnJjbWZfc2RicmNtX2Nsa2N0bChidXMsIENMS19TRE9OTFksIGZhbHNlKTsKLQotCQlicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKGNhcmQsIFNESU9fRlVOQ18xLAotCQkJU0JTRElPX0ZVTkMxX0NISVBDTEtDU1IsCi0JCQlTQlNESU9fRk9SQ0VfSFdfQ0xLUkVRX09GRiwgTlVMTCk7Ci0KLQkJLyogSXNvbGF0ZSB0aGUgYnVzICovCi0JCWlmIChidXMtPmNpLT5jaGlwICE9IEJDTTQzMjlfQ0hJUF9JRAotCQkgICAgJiYgYnVzLT5jaS0+Y2hpcCAhPSBCQ000MzE5X0NISVBfSUQpIHsKLQkJCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoY2FyZCwgU0RJT19GVU5DXzEsCi0JCQkJU0JTRElPX0RFVklDRV9DVEwsCi0JCQkJU0JTRElPX0RFVkNUTF9QQURTX0lTTywgTlVMTCk7Ci0JCX0KLQotCQkvKiBDaGFuZ2Ugc3RhdGUgKi8KLQkJYnVzLT5zbGVlcGluZyA9IHRydWU7Ci0KLQl9IGVsc2UgewotCQkvKiBXYWtpbmcgdXA6IGJ1cyBwb3dlciB1cCBpcyBvaywgc2V0IGxvY2FsIHN0YXRlICovCi0KLQkJYnJjbWZfc2RjYXJkX2NmZ193cml0ZShjYXJkLCBTRElPX0ZVTkNfMSwKLQkJCVNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSLCAwLCBOVUxMKTsKLQotCQkvKiBGb3JjZSBwYWQgaXNvbGF0aW9uIG9mZiBpZiBwb3NzaWJsZQotCQkJIChpbiBjYXNlIHBvd2VyIG5ldmVyIHRvZ2dsZWQpICovCi0JCWlmICgoYnVzLT5jaS0+YnVzY29yZXR5cGUgPT0gUENNQ0lBX0NPUkVfSUQpCi0JCSAgICAmJiAoYnVzLT5jaS0+YnVzY29yZXJldiA+PSAxMCkpCi0JCQlicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKGNhcmQsIFNESU9fRlVOQ18xLAotCQkJCVNCU0RJT19ERVZJQ0VfQ1RMLCAwLCBOVUxMKTsKLQotCQkvKiBNYWtlIHN1cmUgdGhlIGNvbnRyb2xsZXIgaGFzIHRoZSBidXMgdXAgKi8KLQkJYnJjbWZfc2RicmNtX2Nsa2N0bChidXMsIENMS19BVkFJTCwgZmFsc2UpOwotCi0JCS8qIFNlbmQgbWlzYyBpbnRlcnJ1cHQgdG8gaW5kaWNhdGUgT09CIG5vdCBuZWVkZWQgKi8KLQkJd19zZHJlZzMyKGJ1cywgMCwgb2Zmc2V0b2Yoc3RydWN0IHNkcGNtZF9yZWdzLCB0b3NibWFpbGJveGRhdGEpLAotCQkJICAmcmV0cmllcyk7Ci0JCWlmIChyZXRyaWVzIDw9IHJldHJ5X2xpbWl0KQotCQkJd19zZHJlZzMyKGJ1cywgU01CX0RFVl9JTlQsCi0JCQkJICBvZmZzZXRvZihzdHJ1Y3Qgc2RwY21kX3JlZ3MsIHRvc2JtYWlsYm94KSwKLQkJCQkgICZyZXRyaWVzKTsKLQotCQlpZiAocmV0cmllcyA+IHJldHJ5X2xpbWl0KQotCQkJQlJDTUZfRVJST1IoKCJDQU5OT1QgU0lHTkFMIENISVAgVE8gQ0xFQVIgT09CISFcbiIpKTsKLQotCQkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBTRCBidXMgYWNjZXNzICovCi0JCWJyY21mX3NkYnJjbV9jbGtjdGwoYnVzLCBDTEtfU0RPTkxZLCBmYWxzZSk7Ci0KLQkJLyogQ2hhbmdlIHN0YXRlICovCi0JCWJ1cy0+c2xlZXBpbmcgPSBmYWxzZTsKLQotCQkvKiBFbmFibGUgaW50ZXJydXB0cyBhZ2FpbiAqLwotCQlpZiAoYnVzLT5pbnRyICYmIChidXMtPmRydnItPmJ1c3N0YXRlID09IEJSQ01GX0JVU19EQVRBKSkgewotCQkJYnVzLT5pbnRkaXMgPSBmYWxzZTsKLQkJCWJyY21mX3NkY2FyZF9pbnRyX2VuYWJsZShidXMtPmNhcmQpOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgQlVTX1dBS0UoYnVzKSBcCi0JZG8geyBcCi0JCWlmICgoYnVzKS0+c2xlZXBpbmcpIFwKLQkJCWJyY21mX3NkYnJjbV9idXNzbGVlcCgoYnVzKSwgZmFsc2UpOyBcCi0JfSB3aGlsZSAoMCk7Ci0KLS8qIFdyaXRlcyBhIEhXL1NXIGhlYWRlciBpbnRvIHRoZSBwYWNrZXQgYW5kIHNlbmRzIGl0LiAqLwotLyogQXNzdW1lczogKGEpIGhlYWRlciBzcGFjZSBhbHJlYWR5IHRoZXJlLCAoYikgY2FsbGVyIGhvbGRzIGxvY2sgKi8KLXN0YXRpYyBpbnQgYnJjbWZfc2RicmNtX3R4cGt0KHN0cnVjdCBicmNtZl9idXMgKmJ1cywgc3RydWN0IHNrX2J1ZmYgKnBrdCwgdWludCBjaGFuLAotCQkJIGJvb2wgZnJlZV9wa3QpCi17Ci0JaW50IHJldDsKLQl1OCAqZnJhbWU7Ci0JdTE2IGxlbiwgcGFkID0gMDsKLQl1MzIgc3doZWFkZXI7Ci0JdWludCByZXRyaWVzID0gMDsKLQlzdHJ1Y3QgYnJjbWZfc2Rpb19jYXJkICpjYXJkOwotCXN0cnVjdCBza19idWZmICpuZXc7Ci0JaW50IGk7Ci0KLQlCUkNNRl9UUkFDRSgoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKLQotCWNhcmQgPSBidXMtPmNhcmQ7Ci0KLQlpZiAoYnVzLT5kcnZyLT5kb25nbGVfcmVzZXQpIHsKLQkJcmV0ID0gLUVQRVJNOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZnJhbWUgPSAodTggKikgKHBrdC0+ZGF0YSk7Ci0KLQkvKiBBZGQgYWxpZ25tZW50IHBhZGRpbmcsIGFsbG9jYXRlIG5ldyBwYWNrZXQgaWYgbmVlZGVkICovCi0JcGFkID0gKCh1bnNpZ25lZCBsb25nKWZyYW1lICUgQlJDTUZfU0RBTElHTik7Ci0JaWYgKHBhZCkgewotCQlpZiAoc2tiX2hlYWRyb29tKHBrdCkgPCBwYWQpIHsKLQkJCUJSQ01GX0lORk8oKCIlczogaW5zdWZmaWNpZW50IGhlYWRyb29tICVkIGZvciAlZCBwYWRcbiIsCi0JCQkJICAgIF9fZnVuY19fLCBza2JfaGVhZHJvb20ocGt0KSwgcGFkKSk7Ci0JCQlidXMtPmRydnItPnR4X3JlYWxsb2MrKzsKLQkJCW5ldyA9IGJyY211X3BrdF9idWZfZ2V0X3NrYihwa3QtPmxlbiArIEJSQ01GX1NEQUxJR04pOwotCQkJaWYgKCFuZXcpIHsKLQkJCQlCUkNNRl9FUlJPUigoIiVzOiBjb3VsZG4ndCBhbGxvY2F0ZSBuZXcgIgotCQkJCQkgICAgICIlZC1ieXRlIHBhY2tldFxuIiwgX19mdW5jX18sCi0JCQkJCSAgICAgcGt0LT5sZW4gKyBCUkNNRl9TREFMSUdOKSk7Ci0JCQkJcmV0ID0gLUVOT01FTTsKLQkJCQlnb3RvIGRvbmU7Ci0JCQl9Ci0KLQkJCVBLVEFMSUdOKG5ldywgcGt0LT5sZW4sIEJSQ01GX1NEQUxJR04pOwotCQkJbWVtY3B5KG5ldy0+ZGF0YSwgcGt0LT5kYXRhLCBwa3QtPmxlbik7Ci0JCQlpZiAoZnJlZV9wa3QpCi0JCQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihwa3QpOwotCQkJLyogZnJlZSB0aGUgcGt0IGlmIGNhbm5lZCBvbmUgaXMgbm90IHVzZWQgKi8KLQkJCWZyZWVfcGt0ID0gdHJ1ZTsKLQkJCXBrdCA9IG5ldzsKLQkJCWZyYW1lID0gKHU4ICopIChwa3QtPmRhdGEpOwotCQkJLyogcHJlY29uZGl0aW9uOiAoZnJhbWUgJSBCUkNNRl9TREFMSUdOKSA9PSAwKSAqLwotCQkJcGFkID0gMDsKLQkJfSBlbHNlIHsKLQkJCXNrYl9wdXNoKHBrdCwgcGFkKTsKLQkJCWZyYW1lID0gKHU4ICopIChwa3QtPmRhdGEpOwotCQkJLyogcHJlY29uZGl0aW9uOiBwYWQgKyBTRFBDTV9IRFJMRU4gPD0gcGt0LT5sZW4gKi8KLQkJCW1lbXNldChmcmFtZSwgMCwgcGFkICsgU0RQQ01fSERSTEVOKTsKLQkJfQotCX0KLQkvKiBwcmVjb25kaXRpb246IHBhZCA8IEJSQ01GX1NEQUxJR04gKi8KLQotCS8qIEhhcmR3YXJlIHRhZzogMiBieXRlIGxlbiBmb2xsb3dlZCBieSAyIGJ5dGUgfmxlbiBjaGVjayAoYWxsIExFKSAqLwotCWxlbiA9ICh1MTYpIChwa3QtPmxlbik7Ci0JKih1MTYgKikgZnJhbWUgPSBjcHVfdG9fbGUxNihsZW4pOwotCSooKCh1MTYgKikgZnJhbWUpICsgMSkgPSBjcHVfdG9fbGUxNih+bGVuKTsKLQotCS8qIFNvZnR3YXJlIHRhZzogY2hhbm5lbCwgc2VxdWVuY2UgbnVtYmVyLCBkYXRhIG9mZnNldCAqLwotCXN3aGVhZGVyID0KLQkgICAgKChjaGFuIDw8IFNEUENNX0NIQU5ORUxfU0hJRlQpICYgU0RQQ01fQ0hBTk5FTF9NQVNLKSB8IGJ1cy0+dHhfc2VxIHwKLQkgICAgKCgocGFkICsKLQkgICAgICAgU0RQQ01fSERSTEVOKSA8PCBTRFBDTV9ET0ZGU0VUX1NISUZUKSAmIFNEUENNX0RPRkZTRVRfTUFTSyk7Ci0KLQlwdXRfdW5hbGlnbmVkX2xlMzIoc3doZWFkZXIsIGZyYW1lICsgU0RQQ01fRlJBTUVUQUdfTEVOKTsKLQlwdXRfdW5hbGlnbmVkX2xlMzIoMCwgZnJhbWUgKyBTRFBDTV9GUkFNRVRBR19MRU4gKyBzaXplb2Yoc3doZWFkZXIpKTsKLQotI2lmZGVmIEJDTURCRwotCXR4X3BhY2tldHNbcGt0LT5wcmlvcml0eV0rKzsKLQlpZiAoQlJDTUZfQllURVNfT04oKSAmJgotCSAgICAoKChCUkNNRl9DVExfT04oKSAmJiAoY2hhbiA9PSBTRFBDTV9DT05UUk9MX0NIQU5ORUwpKSB8fAotCSAgICAgIChCUkNNRl9EQVRBX09OKCkgJiYgKGNoYW4gIT0gU0RQQ01fQ09OVFJPTF9DSEFOTkVMKSkpKSkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiVHggRnJhbWU6XG4iKTsKLQkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIiIsIERVTVBfUFJFRklYX09GRlNFVCwgZnJhbWUsIGxlbik7Ci0JfSBlbHNlIGlmIChCUkNNRl9IRFJTX09OKCkpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlR4SGRyOlxuIik7Ci0JCXByaW50X2hleF9kdW1wX2J5dGVzKCIiLCBEVU1QX1BSRUZJWF9PRkZTRVQsCi0JCQkJICAgICBmcmFtZSwgbWluX3QodTE2LCBsZW4sIDE2KSk7Ci0JfQotI2VuZGlmCi0KLQkvKiBSYWlzZSBsZW4gdG8gbmV4dCBTRElPIGJsb2NrIHRvIGVsaW1pbmF0ZSB0YWlsIGNvbW1hbmQgKi8KLQlpZiAoYnVzLT5yb3VuZHVwICYmIGJ1cy0+YmxvY2tzaXplICYmIChsZW4gPiBidXMtPmJsb2Nrc2l6ZSkpIHsKLQkJdTE2IHBhZCA9IGJ1cy0+YmxvY2tzaXplIC0gKGxlbiAlIGJ1cy0+YmxvY2tzaXplKTsKLQkJaWYgKChwYWQgPD0gYnVzLT5yb3VuZHVwKSAmJiAocGFkIDwgYnVzLT5ibG9ja3NpemUpKQotCQkJCWxlbiArPSBwYWQ7Ci0JfSBlbHNlIGlmIChsZW4gJSBCUkNNRl9TREFMSUdOKSB7Ci0JCWxlbiArPSBCUkNNRl9TREFMSUdOIC0gKGxlbiAlIEJSQ01GX1NEQUxJR04pOwotCX0KLQotCS8qIFNvbWUgY29udHJvbGxlcnMgaGF2ZSB0cm91YmxlIHdpdGggb2RkIGJ5dGVzIC0tIHJvdW5kIHRvIGV2ZW4gKi8KLQlpZiAoZm9yY2VhbGlnbiAmJiAobGVuICYgKEFMSUdOTUVOVCAtIDEpKSkgewotCQkJbGVuID0gcm91bmR1cChsZW4sIEFMSUdOTUVOVCk7Ci0JfQotCi0JZG8gewotCQlyZXQgPSBicmNtZl9zZGJyY21fc2VuZF9idWYoYnVzLCBicmNtZl9zZGNhcmRfY3VyX3Nid2FkKGNhcmQpLAotCQkJU0RJT19GVU5DXzIsIEYyU1lOQywgZnJhbWUsIGxlbiwgcGt0LCBOVUxMLCBOVUxMKTsKLQkJYnVzLT5mMnR4ZGF0YSsrOwotCi0JCWlmIChyZXQgPCAwKSB7Ci0JCQkvKiBPbiBmYWlsdXJlLCBhYm9ydCB0aGUgY29tbWFuZAotCQkJIGFuZCB0ZXJtaW5hdGUgdGhlIGZyYW1lICovCi0JCQlCUkNNRl9JTkZPKCgiJXM6IHNkaW8gZXJyb3IgJWQsIGFib3J0IGNvbW1hbmQgYW5kICIKLQkJCQkgICAgInRlcm1pbmF0ZSBmcmFtZS5cbiIsIF9fZnVuY19fLCByZXQpKTsKLQkJCWJ1cy0+dHhfc2RlcnJzKys7Ci0KLQkJCWJyY21mX3NkY2FyZF9hYm9ydChjYXJkLCBTRElPX0ZVTkNfMik7Ci0JCQlicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKGNhcmQsIFNESU9fRlVOQ18xLAotCQkJCQkgU0JTRElPX0ZVTkMxX0ZSQU1FQ1RSTCwgU0ZDX1dGX1RFUk0sCi0JCQkJCSBOVUxMKTsKLQkJCWJ1cy0+ZjFyZWdkYXRhKys7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCQl1OCBoaSwgbG87Ci0JCQkJaGkgPSBicmNtZl9zZGNhcmRfY2ZnX3JlYWQoY2FyZCwgU0RJT19GVU5DXzEsCi0JCQkJCQkgICAgIFNCU0RJT19GVU5DMV9XRlJBTUVCQ0hJLAotCQkJCQkJICAgICBOVUxMKTsKLQkJCQlsbyA9IGJyY21mX3NkY2FyZF9jZmdfcmVhZChjYXJkLCBTRElPX0ZVTkNfMSwKLQkJCQkJCSAgICAgU0JTRElPX0ZVTkMxX1dGUkFNRUJDTE8sCi0JCQkJCQkgICAgIE5VTEwpOwotCQkJCWJ1cy0+ZjFyZWdkYXRhICs9IDI7Ci0JCQkJaWYgKChoaSA9PSAwKSAmJiAobG8gPT0gMCkpCi0JCQkJCWJyZWFrOwotCQkJfQotCi0JCX0KLQkJaWYgKHJldCA9PSAwKQotCQkJYnVzLT50eF9zZXEgPSAoYnVzLT50eF9zZXEgKyAxKSAlIFNEUENNX1NFUVVFTkNFX1dSQVA7Ci0KLQl9IHdoaWxlICgocmV0IDwgMCkgJiYgcmV0cnlkYXRhICYmIHJldHJpZXMrKyA8IFRYUkVUUklFUyk7Ci0KLWRvbmU6Ci0JLyogcmVzdG9yZSBwa3QgYnVmZmVyIHBvaW50ZXIgYmVmb3JlIGNhbGxpbmcgdHggY29tcGxldGUgcm91dGluZSAqLwotCXNrYl9wdWxsKHBrdCwgU0RQQ01fSERSTEVOICsgcGFkKTsKLQlicmNtZl9zZGJyY21fc2R1bmxvY2soYnVzKTsKLQlicmNtZl90eGNvbXBsZXRlKGJ1cy0+ZHJ2ciwgcGt0LCByZXQgIT0gMCk7Ci0JYnJjbWZfc2RicmNtX3NkbG9jayhidXMpOwotCi0JaWYgKGZyZWVfcGt0KQotCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKHBrdCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgYnJjbWZfc2RicmNtX2J1c190eGRhdGEoc3RydWN0IGJyY21mX2J1cyAqYnVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQotewotCWludCByZXQgPSAtRUJBREU7Ci0JdWludCBkYXRhbGVuLCBwcmVjOwotCi0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQlkYXRhbGVuID0gcGt0LT5sZW47Ci0KLSNpZmRlZiBTRFRFU1QKLQkvKiBQdXNoIHRoZSB0ZXN0IGhlYWRlciBpZiBkb2luZyBsb29wYmFjayAqLwotCWlmIChidXMtPmV4dF9sb29wKSB7Ci0JCXU4ICpkYXRhOwotCQlza2JfcHVzaChwa3QsIFNEUENNX1RFU1RfSERSTEVOKTsKLQkJZGF0YSA9IHBrdC0+ZGF0YTsKLQkJKmRhdGErKyA9IFNEUENNX1RFU1RfRUNIT1JFUTsKLQkJKmRhdGErKyA9ICh1OCkgYnVzLT5sb29waWQrKzsKLQkJKmRhdGErKyA9IChkYXRhbGVuID4+IDApOwotCQkqZGF0YSsrID0gKGRhdGFsZW4gPj4gOCk7Ci0JCWRhdGFsZW4gKz0gU0RQQ01fVEVTVF9IRFJMRU47Ci0JfQotI2VuZGlmCQkJCS8qIFNEVEVTVCAqLwotCi0JLyogQWRkIHNwYWNlIGZvciB0aGUgaGVhZGVyICovCi0Jc2tiX3B1c2gocGt0LCBTRFBDTV9IRFJMRU4pOwotCS8qIHByZWNvbmRpdGlvbjogSVNfQUxJR05FRCgodW5zaWduZWQgbG9uZykocGt0LT5kYXRhKSwgMikgKi8KLQotCXByZWMgPSBQUklPMlBSRUMoKHBrdC0+cHJpb3JpdHkgJiBQUklPTUFTSykpOwotCi0JLyogQ2hlY2sgZm9yIGV4aXN0aW5nIHF1ZXVlLCBjdXJyZW50IGZsb3ctY29udHJvbCwKLQkJCSBwZW5kaW5nIGV2ZW50LCBvciBwZW5kaW5nIGNsb2NrICovCi0JaWYgKGJyY21mX2RlZmVycmVkX3R4IHx8IGJ1cy0+ZmNzdGF0ZSB8fCBwa3RxX2xlbigmYnVzLT50eHEpCi0JICAgIHx8IGJ1cy0+ZHBjX3NjaGVkIHx8ICghREFUQU9LKGJ1cykpCi0JICAgIHx8IChidXMtPmZsb3djb250cm9sICYgTkJJVFZBTChwcmVjKSkKLQkgICAgfHwgKGJ1cy0+Y2xrc3RhdGUgIT0gQ0xLX0FWQUlMKSkgewotCQlCUkNNRl9UUkFDRSgoIiVzOiBkZWZlcnJpbmcgcGt0cSBsZW4gJWRcbiIsIF9fZnVuY19fLAotCQkJICAgICBwa3RxX2xlbigmYnVzLT50eHEpKSk7Ci0JCWJ1cy0+ZmNxdWV1ZWQrKzsKLQotCQkvKiBQcmlvcml0eSBiYXNlZCBlbnEgKi8KLQkJc3Bpbl9sb2NrX2JoKCZidXMtPnR4cWxvY2spOwotCQlpZiAoYnJjbWZfY19wcmVjX2VucShidXMtPmRydnIsICZidXMtPnR4cSwgcGt0LCBwcmVjKSA9PSBmYWxzZSkgewotCQkJc2tiX3B1bGwocGt0LCBTRFBDTV9IRFJMRU4pOwotCQkJYnJjbWZfdHhjb21wbGV0ZShidXMtPmRydnIsIHBrdCwgZmFsc2UpOwotCQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihwa3QpOwotCQkJQlJDTUZfRVJST1IoKCIlczogb3V0IG9mIGJ1cy0+dHhxICEhIVxuIiwgX19mdW5jX18pKTsKLQkJCXJldCA9IC1FTk9TUjsKLQkJfSBlbHNlIHsKLQkJCXJldCA9IDA7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfYmgoJmJ1cy0+dHhxbG9jayk7Ci0KLQkJaWYgKHBrdHFfbGVuKCZidXMtPnR4cSkgPj0gVFhISSkKLQkJCWJyY21mX3R4Zmxvd2NvbnRyb2woYnVzLT5kcnZyLCAwLCBPTik7Ci0KLSNpZmRlZiBCQ01EQkcKLQkJaWYgKHBrdHFfcGxlbigmYnVzLT50eHEsIHByZWMpID4gcWNvdW50W3ByZWNdKQotCQkJcWNvdW50W3ByZWNdID0gcGt0cV9wbGVuKCZidXMtPnR4cSwgcHJlYyk7Ci0jZW5kaWYKLQkJLyogU2NoZWR1bGUgRFBDIGlmIG5lZWRlZCB0byBzZW5kIHF1ZXVlZCBwYWNrZXQocykgKi8KLQkJaWYgKGJyY21mX2RlZmVycmVkX3R4ICYmICFidXMtPmRwY19zY2hlZCkgewotCQkJYnVzLT5kcGNfc2NoZWQgPSB0cnVlOwotCQkJYnJjbWZfc2RicmNtX3NjaGVkX2RwYyhidXMpOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogTG9jazogd2UncmUgYWJvdXQgdG8gdXNlIHNoYXJlZCBkYXRhL2NvZGUgKGFuZCBTRElPKSAqLwotCQlicmNtZl9zZGJyY21fc2Rsb2NrKGJ1cyk7Ci0KLQkJLyogT3RoZXJ3aXNlLCBzZW5kIGl0IG5vdyAqLwotCQlCVVNfV0FLRShidXMpOwotCQkvKiBNYWtlIHN1cmUgYmFjayBwbGFuZSBodCBjbGsgaXMgb24sIG5vIHBlbmRpbmcgYWxsb3dlZCAqLwotCQlicmNtZl9zZGJyY21fY2xrY3RsKGJ1cywgQ0xLX0FWQUlMLCB0cnVlKTsKLQotI2lmbmRlZiBTRFRFU1QKLQkJQlJDTUZfVFJBQ0UoKCIlczogY2FsbGluZyB0eHBrdFxuIiwgX19mdW5jX18pKTsKLQkJcmV0ID0gYnJjbWZfc2RicmNtX3R4cGt0KGJ1cywgcGt0LCBTRFBDTV9EQVRBX0NIQU5ORUwsIHRydWUpOwotI2Vsc2UKLQkJcmV0ID0gYnJjbWZfc2RicmNtX3R4cGt0KGJ1cywgcGt0LAotCQkJCSAgICAoYnVzLT5leHRfbG9vcCA/IFNEUENNX1RFU1RfQ0hBTk5FTCA6Ci0JCQkJICAgICBTRFBDTV9EQVRBX0NIQU5ORUwpLCB0cnVlKTsKLSNlbmRpZgotCQlpZiAocmV0KQotCQkJYnVzLT5kcnZyLT50eF9lcnJvcnMrKzsKLQkJZWxzZQotCQkJYnVzLT5kcnZyLT5kc3RhdHMudHhfYnl0ZXMgKz0gZGF0YWxlbjsKLQotCQlpZiAoYnVzLT5pZGxldGltZSA9PSBCUkNNRl9JRExFX0lNTUVESUFURSAmJgotCQkgICAgIWJ1cy0+ZHBjX3NjaGVkKSB7Ci0JCQlidXMtPmFjdGl2aXR5ID0gZmFsc2U7Ci0JCQlicmNtZl9zZGJyY21fY2xrY3RsKGJ1cywgQ0xLX05PTkUsIHRydWUpOwotCQl9Ci0KLQkJYnJjbWZfc2RicmNtX3NkdW5sb2NrKGJ1cyk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHVpbnQgYnJjbWZfc2RicmNtX3NlbmRmcm9tcShzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHVpbnQgbWF4ZnJhbWVzKQotewotCXN0cnVjdCBza19idWZmICpwa3Q7Ci0JdTMyIGludHN0YXR1cyA9IDA7Ci0JdWludCByZXRyaWVzID0gMDsKLQlpbnQgcmV0ID0gMCwgcHJlY19vdXQ7Ci0JdWludCBjbnQgPSAwOwotCXVpbnQgZGF0YWxlbjsKLQl1OCB0eF9wcmVjX21hcDsKLQotCXN0cnVjdCBicmNtZl9wdWIgKmRydnIgPSBidXMtPmRydnI7Ci0KLQlCUkNNRl9UUkFDRSgoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKLQotCXR4X3ByZWNfbWFwID0gfmJ1cy0+Zmxvd2NvbnRyb2w7Ci0KLQkvKiBTZW5kIGZyYW1lcyB1bnRpbCB0aGUgbGltaXQgb3Igc29tZSBvdGhlciBldmVudCAqLwotCWZvciAoY250ID0gMDsgKGNudCA8IG1heGZyYW1lcykgJiYgREFUQU9LKGJ1cyk7IGNudCsrKSB7Ci0JCXNwaW5fbG9ja19iaCgmYnVzLT50eHFsb2NrKTsKLQkJcGt0ID0gYnJjbXVfcGt0cV9tZGVxKCZidXMtPnR4cSwgdHhfcHJlY19tYXAsICZwcmVjX291dCk7Ci0JCWlmIChwa3QgPT0gTlVMTCkgewotCQkJc3Bpbl91bmxvY2tfYmgoJmJ1cy0+dHhxbG9jayk7Ci0JCQlicmVhazsKLQkJfQotCQlzcGluX3VubG9ja19iaCgmYnVzLT50eHFsb2NrKTsKLQkJZGF0YWxlbiA9IHBrdC0+bGVuIC0gU0RQQ01fSERSTEVOOwotCi0jaWZuZGVmIFNEVEVTVAotCQlyZXQgPSBicmNtZl9zZGJyY21fdHhwa3QoYnVzLCBwa3QsIFNEUENNX0RBVEFfQ0hBTk5FTCwgdHJ1ZSk7Ci0jZWxzZQotCQlyZXQgPSBicmNtZl9zZGJyY21fdHhwa3QoYnVzLCBwa3QsCi0JCQkJICAgIChidXMtPmV4dF9sb29wID8gU0RQQ01fVEVTVF9DSEFOTkVMIDoKLQkJCQkgICAgIFNEUENNX0RBVEFfQ0hBTk5FTCksIHRydWUpOwotI2VuZGlmCi0JCWlmIChyZXQpCi0JCQlidXMtPmRydnItPnR4X2Vycm9ycysrOwotCQllbHNlCi0JCQlidXMtPmRydnItPmRzdGF0cy50eF9ieXRlcyArPSBkYXRhbGVuOwotCi0JCS8qIEluIHBvbGwgbW9kZSwgbmVlZCB0byBjaGVjayBmb3Igb3RoZXIgZXZlbnRzICovCi0JCWlmICghYnVzLT5pbnRyICYmIGNudCkgewotCQkJLyogQ2hlY2sgZGV2aWNlIHN0YXR1cywgc2lnbmFsIHBlbmRpbmcgaW50ZXJydXB0ICovCi0JCQlyX3NkcmVnMzIoYnVzLCAmaW50c3RhdHVzLAotCQkJCSAgb2Zmc2V0b2Yoc3RydWN0IHNkcGNtZF9yZWdzLCBpbnRzdGF0dXMpLAotCQkJCSAgJnJldHJpZXMpOwotCQkJYnVzLT5mMnR4ZGF0YSsrOwotCQkJaWYgKGJyY21mX3NkY2FyZF9yZWdmYWlsKGJ1cy0+Y2FyZCkpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoaW50c3RhdHVzICYgYnVzLT5ob3N0aW50bWFzaykKLQkJCQlidXMtPmlwZW5kID0gdHJ1ZTsKLQkJfQotCX0KLQotCS8qIERlZmxvdy1jb250cm9sIHN0YWNrIGlmIG5lZWRlZCAqLwotCWlmIChkcnZyLT51cCAmJiAoZHJ2ci0+YnVzc3RhdGUgPT0gQlJDTUZfQlVTX0RBVEEpICYmCi0JICAgIGRydnItPnR4b2ZmICYmIChwa3RxX2xlbigmYnVzLT50eHEpIDwgVFhMT1cpKQotCQlicmNtZl90eGZsb3djb250cm9sKGRydnIsIDAsIE9GRik7Ci0KLQlyZXR1cm4gY250OwotfQotCi1pbnQKLWJyY21mX3NkYnJjbV9idXNfdHhjdGwoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1bnNpZ25lZCBjaGFyICptc2csIHVpbnQgbXNnbGVuKQotewotCXU4ICpmcmFtZTsKLQl1MTYgbGVuOwotCXUzMiBzd2hlYWRlcjsKLQl1aW50IHJldHJpZXMgPSAwOwotCXN0cnVjdCBicmNtZl9zZGlvX2NhcmQgKmNhcmQgPSBidXMtPmNhcmQ7Ci0JdTggZG9mZiA9IDA7Ci0JaW50IHJldCA9IC0xOwotCWludCBpOwotCi0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQlpZiAoYnVzLT5kcnZyLT5kb25nbGVfcmVzZXQpCi0JCXJldHVybiAtRUlPOwotCi0JLyogQmFjayB0aGUgcG9pbnRlciB0byBtYWtlIGEgcm9vbSBmb3IgYnVzIGhlYWRlciAqLwotCWZyYW1lID0gbXNnIC0gU0RQQ01fSERSTEVOOwotCWxlbiA9IChtc2dsZW4gKz0gU0RQQ01fSERSTEVOKTsKLQotCS8qIEFkZCBhbGlnbm1lbnQgcGFkZGluZyAob3B0aW9uYWwgZm9yIGN0bCBmcmFtZXMpICovCi0JaWYgKGJyY21mX2FsaWduY3RsKSB7Ci0JCWRvZmYgPSAoKHVuc2lnbmVkIGxvbmcpZnJhbWUgJSBCUkNNRl9TREFMSUdOKTsKLQkJaWYgKGRvZmYpIHsKLQkJCWZyYW1lIC09IGRvZmY7Ci0JCQlsZW4gKz0gZG9mZjsKLQkJCW1zZ2xlbiArPSBkb2ZmOwotCQkJbWVtc2V0KGZyYW1lLCAwLCBkb2ZmICsgU0RQQ01fSERSTEVOKTsKLQkJfQotCQkvKiBwcmVjb25kaXRpb246IGRvZmYgPCBCUkNNRl9TREFMSUdOICovCi0JfQotCWRvZmYgKz0gU0RQQ01fSERSTEVOOwotCi0JLyogUm91bmQgc2VuZCBsZW5ndGggdG8gbmV4dCBTRElPIGJsb2NrICovCi0JaWYgKGJ1cy0+cm91bmR1cCAmJiBidXMtPmJsb2Nrc2l6ZSAmJiAobGVuID4gYnVzLT5ibG9ja3NpemUpKSB7Ci0JCXUxNiBwYWQgPSBidXMtPmJsb2Nrc2l6ZSAtIChsZW4gJSBidXMtPmJsb2Nrc2l6ZSk7Ci0JCWlmICgocGFkIDw9IGJ1cy0+cm91bmR1cCkgJiYgKHBhZCA8IGJ1cy0+YmxvY2tzaXplKSkKLQkJCWxlbiArPSBwYWQ7Ci0JfSBlbHNlIGlmIChsZW4gJSBCUkNNRl9TREFMSUdOKSB7Ci0JCWxlbiArPSBCUkNNRl9TREFMSUdOIC0gKGxlbiAlIEJSQ01GX1NEQUxJR04pOwotCX0KLQotCS8qIFNhdGlzZnkgbGVuZ3RoLWFsaWdubWVudCByZXF1aXJlbWVudHMgKi8KLQlpZiAoZm9yY2VhbGlnbiAmJiAobGVuICYgKEFMSUdOTUVOVCAtIDEpKSkKLQkJbGVuID0gcm91bmR1cChsZW4sIEFMSUdOTUVOVCk7Ci0KLQkvKiBwcmVjb25kaXRpb246IElTX0FMSUdORUQoKHVuc2lnbmVkIGxvbmcpZnJhbWUsIDIpICovCi0KLQkvKiBOZWVkIHRvIGxvY2sgaGVyZSB0byBwcm90ZWN0IHR4c2VxIGFuZCBTRElPIHR4IGNhbGxzICovCi0JYnJjbWZfc2RicmNtX3NkbG9jayhidXMpOwotCi0JQlVTX1dBS0UoYnVzKTsKLQotCS8qIE1ha2Ugc3VyZSBiYWNrcGxhbmUgY2xvY2sgaXMgb24gKi8KLQlicmNtZl9zZGJyY21fY2xrY3RsKGJ1cywgQ0xLX0FWQUlMLCBmYWxzZSk7Ci0KLQkvKiBIYXJkd2FyZSB0YWc6IDIgYnl0ZSBsZW4gZm9sbG93ZWQgYnkgMiBieXRlIH5sZW4gY2hlY2sgKGFsbCBMRSkgKi8KLQkqKHUxNiAqKSBmcmFtZSA9IGNwdV90b19sZTE2KCh1MTYpIG1zZ2xlbik7Ci0JKigoKHUxNiAqKSBmcmFtZSkgKyAxKSA9IGNwdV90b19sZTE2KH5tc2dsZW4pOwotCi0JLyogU29mdHdhcmUgdGFnOiBjaGFubmVsLCBzZXF1ZW5jZSBudW1iZXIsIGRhdGEgb2Zmc2V0ICovCi0Jc3doZWFkZXIgPQotCSAgICAoKFNEUENNX0NPTlRST0xfQ0hBTk5FTCA8PCBTRFBDTV9DSEFOTkVMX1NISUZUKSAmCi0JICAgICBTRFBDTV9DSEFOTkVMX01BU0spCi0JICAgIHwgYnVzLT50eF9zZXEgfCAoKGRvZmYgPDwgU0RQQ01fRE9GRlNFVF9TSElGVCkgJgotCQkJICAgICBTRFBDTV9ET0ZGU0VUX01BU0spOwotCXB1dF91bmFsaWduZWRfbGUzMihzd2hlYWRlciwgZnJhbWUgKyBTRFBDTV9GUkFNRVRBR19MRU4pOwotCXB1dF91bmFsaWduZWRfbGUzMigwLCBmcmFtZSArIFNEUENNX0ZSQU1FVEFHX0xFTiArIHNpemVvZihzd2hlYWRlcikpOwotCi0JaWYgKCFEQVRBT0soYnVzKSkgewotCQlCUkNNRl9JTkZPKCgiJXM6IE5vIGJ1cyBjcmVkaXQgYnVzLT50eF9tYXggJWQsIgotCQkJICAgICIgYnVzLT50eF9zZXEgJWRcbiIsIF9fZnVuY19fLAotCQkJICAgIGJ1cy0+dHhfbWF4LCBidXMtPnR4X3NlcSkpOwotCQlidXMtPmN0cmxfZnJhbWVfc3RhdCA9IHRydWU7Ci0JCS8qIFNlbmQgZnJvbSBkcGMgKi8KLQkJYnVzLT5jdHJsX2ZyYW1lX2J1ZiA9IGZyYW1lOwotCQlidXMtPmN0cmxfZnJhbWVfbGVuID0gbGVuOwotCi0JCWJyY21mX3NkYnJjbV93YWl0X2Zvcl9ldmVudChidXMsICZidXMtPmN0cmxfZnJhbWVfc3RhdCk7Ci0KLQkJaWYgKGJ1cy0+Y3RybF9mcmFtZV9zdGF0ID09IGZhbHNlKSB7Ci0JCQlCUkNNRl9JTkZPKCgiJXM6IGN0cmxfZnJhbWVfc3RhdCA9PSBmYWxzZVxuIiwKLQkJCQkgICAgX19mdW5jX18pKTsKLQkJCXJldCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlCUkNNRl9JTkZPKCgiJXM6IGN0cmxfZnJhbWVfc3RhdCA9PSB0cnVlXG4iLCBfX2Z1bmNfXykpOwotCQkJcmV0ID0gLTE7Ci0JCX0KLQl9Ci0KLQlpZiAocmV0ID09IC0xKSB7Ci0jaWZkZWYgQkNNREJHCi0JCWlmIChCUkNNRl9CWVRFU19PTigpICYmIEJSQ01GX0NUTF9PTigpKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiVHggRnJhbWU6XG4iKTsKLQkJCXByaW50X2hleF9kdW1wX2J5dGVzKCIiLCBEVU1QX1BSRUZJWF9PRkZTRVQsCi0JCQkJCSAgICAgZnJhbWUsIGxlbik7Ci0JCX0gZWxzZSBpZiAoQlJDTUZfSERSU19PTigpKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiVHhIZHI6XG4iKTsKLQkJCXByaW50X2hleF9kdW1wX2J5dGVzKCIiLCBEVU1QX1BSRUZJWF9PRkZTRVQsCi0JCQkJCSAgICAgZnJhbWUsIG1pbl90KHUxNiwgbGVuLCAxNikpOwotCQl9Ci0jZW5kaWYKLQotCQlkbyB7Ci0JCQlidXMtPmN0cmxfZnJhbWVfc3RhdCA9IGZhbHNlOwotCQkJcmV0ID0gYnJjbWZfc2RicmNtX3NlbmRfYnVmKGJ1cywKLQkJCQlicmNtZl9zZGNhcmRfY3VyX3Nid2FkKGNhcmQpLCBTRElPX0ZVTkNfMiwKLQkJCQlGMlNZTkMsIGZyYW1lLCBsZW4sIE5VTEwsIE5VTEwsIE5VTEwpOwotCi0JCQlpZiAocmV0IDwgMCkgewotCQkJCS8qIE9uIGZhaWx1cmUsIGFib3J0IHRoZSBjb21tYW5kIGFuZAotCQkJCSB0ZXJtaW5hdGUgdGhlIGZyYW1lICovCi0JCQkJQlJDTUZfSU5GTygoIiVzOiBzZGlvIGVycm9yICVkLCBhYm9ydCBjb21tYW5kICIKLQkJCQkJICAgICJhbmQgdGVybWluYXRlIGZyYW1lLlxuIiwKLQkJCQkJICAgIF9fZnVuY19fLCByZXQpKTsKLQkJCQlidXMtPnR4X3NkZXJycysrOwotCi0JCQkJYnJjbWZfc2RjYXJkX2Fib3J0KGNhcmQsIFNESU9fRlVOQ18yKTsKLQotCQkJCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoY2FyZCwgU0RJT19GVU5DXzEsCi0JCQkJCQkgU0JTRElPX0ZVTkMxX0ZSQU1FQ1RSTCwKLQkJCQkJCSBTRkNfV0ZfVEVSTSwgTlVMTCk7Ci0JCQkJYnVzLT5mMXJlZ2RhdGErKzsKLQotCQkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCQkJdTggaGksIGxvOwotCQkJCQloaSA9IGJyY21mX3NkY2FyZF9jZmdfcmVhZChjYXJkLAotCQkJCQkgICAgIFNESU9fRlVOQ18xLAotCQkJCQkgICAgIFNCU0RJT19GVU5DMV9XRlJBTUVCQ0hJLAotCQkJCQkgICAgIE5VTEwpOwotCQkJCQlsbyA9IGJyY21mX3NkY2FyZF9jZmdfcmVhZChjYXJkLAotCQkJCQkgICAgIFNESU9fRlVOQ18xLAotCQkJCQkgICAgIFNCU0RJT19GVU5DMV9XRlJBTUVCQ0xPLAotCQkJCQkgICAgIE5VTEwpOwotCQkJCQlidXMtPmYxcmVnZGF0YSArPSAyOwotCQkJCQlpZiAoKGhpID09IDApICYmIChsbyA9PSAwKSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJfQotCQkJaWYgKHJldCA9PSAwKSB7Ci0JCQkJYnVzLT50eF9zZXEgPQotCQkJCSAgICAoYnVzLT50eF9zZXEgKyAxKSAlIFNEUENNX1NFUVVFTkNFX1dSQVA7Ci0JCQl9Ci0JCX0gd2hpbGUgKChyZXQgPCAwKSAmJiByZXRyaWVzKysgPCBUWFJFVFJJRVMpOwotCX0KLQotCWlmICgoYnVzLT5pZGxldGltZSA9PSBCUkNNRl9JRExFX0lNTUVESUFURSkgJiYgIWJ1cy0+ZHBjX3NjaGVkKSB7Ci0JCWJ1cy0+YWN0aXZpdHkgPSBmYWxzZTsKLQkJYnJjbWZfc2RicmNtX2Nsa2N0bChidXMsIENMS19OT05FLCB0cnVlKTsKLQl9Ci0KLQlicmNtZl9zZGJyY21fc2R1bmxvY2soYnVzKTsKLQotCWlmIChyZXQpCi0JCWJ1cy0+ZHJ2ci0+dHhfY3RsZXJycysrOwotCWVsc2UKLQkJYnVzLT5kcnZyLT50eF9jdGxwa3RzKys7Ci0KLQlyZXR1cm4gcmV0ID8gLUVJTyA6IDA7Ci19Ci0KLWludCBicmNtZl9zZGJyY21fYnVzX3J4Y3RsKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdW5zaWduZWQgY2hhciAqbXNnLCB1aW50IG1zZ2xlbikKLXsKLQlpbnQgdGltZWxlZnQ7Ci0JdWludCByeGxlbiA9IDA7Ci0JYm9vbCBwZW5kaW5nOwotCi0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQlpZiAoYnVzLT5kcnZyLT5kb25nbGVfcmVzZXQpCi0JCXJldHVybiAtRUlPOwotCi0JLyogV2FpdCB1bnRpbCBjb250cm9sIGZyYW1lIGlzIGF2YWlsYWJsZSAqLwotCXRpbWVsZWZ0ID0gYnJjbWZfb3NfaW9jdGxfcmVzcF93YWl0KGJ1cy0+ZHJ2ciwgJmJ1cy0+cnhsZW4sICZwZW5kaW5nKTsKLQotCWJyY21mX3NkYnJjbV9zZGxvY2soYnVzKTsKLQlyeGxlbiA9IGJ1cy0+cnhsZW47Ci0JbWVtY3B5KG1zZywgYnVzLT5yeGN0bCwgbWluKG1zZ2xlbiwgcnhsZW4pKTsKLQlidXMtPnJ4bGVuID0gMDsKLQlicmNtZl9zZGJyY21fc2R1bmxvY2soYnVzKTsKLQotCWlmIChyeGxlbikgewotCQlCUkNNRl9DVEwoKCIlczogcmVzdW1lZCBvbiByeGN0bCBmcmFtZSwgZ290ICVkIGV4cGVjdGVkICVkXG4iLAotCQkJICAgX19mdW5jX18sIHJ4bGVuLCBtc2dsZW4pKTsKLQl9IGVsc2UgaWYgKHRpbWVsZWZ0ID09IDApIHsKLQkJQlJDTUZfRVJST1IoKCIlczogcmVzdW1lZCBvbiB0aW1lb3V0XG4iLCBfX2Z1bmNfXykpOwotI2lmZGVmIEJDTURCRwotCQlicmNtZl9zZGJyY21fc2Rsb2NrKGJ1cyk7Ci0JCWJyY21mX3NkYnJjbV9jaGVja2RpZWQoYnVzLCBOVUxMLCAwKTsKLQkJYnJjbWZfc2RicmNtX3NkdW5sb2NrKGJ1cyk7Ci0jZW5kaWYJCQkJLyogQkNNREJHICovCi0JfSBlbHNlIGlmIChwZW5kaW5nID09IHRydWUpIHsKLQkJQlJDTUZfQ1RMKCgiJXM6IGNhbmNlbGxlZFxuIiwgX19mdW5jX18pKTsKLQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKLQl9IGVsc2UgewotCQlCUkNNRl9DVEwoKCIlczogcmVzdW1lZCBmb3IgdW5rbm93biByZWFzb24/XG4iLCBfX2Z1bmNfXykpOwotI2lmZGVmIEJDTURCRwotCQlicmNtZl9zZGJyY21fc2Rsb2NrKGJ1cyk7Ci0JCWJyY21mX3NkYnJjbV9jaGVja2RpZWQoYnVzLCBOVUxMLCAwKTsKLQkJYnJjbWZfc2RicmNtX3NkdW5sb2NrKGJ1cyk7Ci0jZW5kaWYJCQkJLyogQkNNREJHICovCi0JfQotCi0JaWYgKHJ4bGVuKQotCQlidXMtPmRydnItPnJ4X2N0bHBrdHMrKzsKLQllbHNlCi0JCWJ1cy0+ZHJ2ci0+cnhfY3RsZXJycysrOwotCi0JcmV0dXJuIHJ4bGVuID8gKGludClyeGxlbiA6IC1FVElNRURPVVQ7Ci19Ci0KLS8qIElPVmFyIHRhYmxlICovCi1lbnVtIHsKLQlJT1ZfSU5UUiA9IDEsCi0JSU9WX1BPTExSQVRFLAotCUlPVl9TRFJFRywKLQlJT1ZfU0JSRUcsCi0JSU9WX1NEQ0lTLAotCUlPVl9NRU1CWVRFUywKLQlJT1ZfTUVNU0laRSwKLSNpZmRlZiBCQ01EQkcKLQlJT1ZfQ0hFQ0tESUVELAotCUlPVl9DT05TLAotCUlPVl9EQ09OU09MRV9QT0xMLAotI2VuZGlmCi0JSU9WX0RPV05MT0FELAotCUlPVl9GT1JDRUVWRU4sCi0JSU9WX1NESU9EX0RSSVZFLAotCUlPVl9SRUFEQUhFQUQsCi0JSU9WX1NEUlhDSEFJTiwKLQlJT1ZfQUxJR05DVEwsCi0JSU9WX1NEQUxJR04sCi0JSU9WX0RFVlJFU0VULAotCUlPVl9DUFUsCi0jaWZkZWYgU0RURVNUCi0JSU9WX1BLVEdFTiwKLQlJT1ZfRVhUTE9PUCwKLSNlbmRpZgkJCQkvKiBTRFRFU1QgKi8KLQlJT1ZfU1BST00sCi0JSU9WX1RYQk9VTkQsCi0JSU9WX1JYQk9VTkQsCi0JSU9WX1RYTUlOTUFYLAotCUlPVl9JRExFVElNRSwKLQlJT1ZfSURMRUNMT0NLLAotCUlPVl9TRDFJRExFLAotCUlPVl9TTEVFUCwKLQlJT1ZfV0RUSUNLLAotCUlPVl9WQVJTCi19OwotCi1jb25zdCBzdHJ1Y3QgYnJjbXVfaW92YXIgYnJjbWZfc2Rpb19pb3ZhcnNbXSA9IHsKLQl7ImludHIiLCBJT1ZfSU5UUiwgMCwgSU9WVF9CT09MLCAwfSwKLQl7InNsZWVwIiwgSU9WX1NMRUVQLCAwLCBJT1ZUX0JPT0wsIDB9LAotCXsicG9sbHJhdGUiLCBJT1ZfUE9MTFJBVEUsIDAsIElPVlRfVUlOVDMyLCAwfSwKLQl7ImlkbGV0aW1lIiwgSU9WX0lETEVUSU1FLCAwLCBJT1ZUX0lOVDMyLCAwfSwKLQl7ImlkbGVjbG9jayIsIElPVl9JRExFQ0xPQ0ssIDAsIElPVlRfSU5UMzIsIDB9LAotCXsic2QxaWRsZSIsIElPVl9TRDFJRExFLCAwLCBJT1ZUX0JPT0wsIDB9LAotCXsibWVtYnl0ZXMiLCBJT1ZfTUVNQllURVMsIDAsIElPVlRfQlVGRkVSLCAyICogc2l6ZW9mKGludCl9LAotCXsibWVtc2l6ZSIsIElPVl9NRU1TSVpFLCAwLCBJT1ZUX1VJTlQzMiwgMH0sCi0JeyJkb3dubG9hZCIsIElPVl9ET1dOTE9BRCwgMCwgSU9WVF9CT09MLCAwfSwKLQl7InZhcnMiLCBJT1ZfVkFSUywgMCwgSU9WVF9CVUZGRVIsIDB9LAotCXsic2Rpb2RfZHJpdmUiLCBJT1ZfU0RJT0RfRFJJVkUsIDAsIElPVlRfVUlOVDMyLCAwfSwKLQl7InJlYWRhaGVhZCIsIElPVl9SRUFEQUhFQUQsIDAsIElPVlRfQk9PTCwgMH0sCi0JeyJzZHJ4Y2hhaW4iLCBJT1ZfU0RSWENIQUlOLCAwLCBJT1ZUX0JPT0wsIDB9LAotCXsiYWxpZ25jdGwiLCBJT1ZfQUxJR05DVEwsIDAsIElPVlRfQk9PTCwgMH0sCi0JeyJzZGFsaWduIiwgSU9WX1NEQUxJR04sIDAsIElPVlRfQk9PTCwgMH0sCi0JeyJkZXZyZXNldCIsIElPVl9ERVZSRVNFVCwgMCwgSU9WVF9CT09MLCAwfSwKLQl7IndkdGljayIsIElPVl9XRFRJQ0ssIDAsIElPVlRfVUlOVDMyLCAwfSwKLSNpZmRlZiBCQ01EQkcKLQl7ImNvbnMiLCBJT1ZfQ09OUywgMCwgSU9WVF9CVUZGRVIsIDB9Ci0JLAotCXsiZGNvbnBvbGwiLCBJT1ZfRENPTlNPTEVfUE9MTCwgMCwgSU9WVF9VSU5UMzIsIDB9Ci0JLAotCXsic2RyZWciLCBJT1ZfU0RSRUcsIDAsIElPVlRfQlVGRkVSLCBzaXplb2Yoc3RydWN0IGJyY21mX3NkcmVnKX0KLQksCi0JeyJzYnJlZyIsIElPVl9TQlJFRywgMCwgSU9WVF9CVUZGRVIsIHNpemVvZihzdHJ1Y3QgYnJjbWZfc2RyZWcpfQotCSwKLQl7InNkX2NpcyIsIElPVl9TRENJUywgMCwgSU9WVF9CVUZGRVIsIEJSQ01GX0lPQ1RMX01BWExFTn0KLQksCi0JeyJmb3JjZWFsaWduIiwgSU9WX0ZPUkNFRVZFTiwgMCwgSU9WVF9CT09MLCAwfQotCSwKLQl7InR4Ym91bmQiLCBJT1ZfVFhCT1VORCwgMCwgSU9WVF9VSU5UMzIsIDB9Ci0JLAotCXsicnhib3VuZCIsIElPVl9SWEJPVU5ELCAwLCBJT1ZUX1VJTlQzMiwgMH0KLQksCi0JeyJ0eG1pbm1heCIsIElPVl9UWE1JTk1BWCwgMCwgSU9WVF9VSU5UMzIsIDB9Ci0JLAotCXsiY3B1IiwgSU9WX0NQVSwgMCwgSU9WVF9CT09MLCAwfQotCSwKLQl7ImNoZWNrZGllZCIsIElPVl9DSEVDS0RJRUQsIDAsIElPVlRfQlVGRkVSLCAwfQotCSwKLSNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KLSNpZmRlZiBTRFRFU1QKLQl7ImV4dGxvb3AiLCBJT1ZfRVhUTE9PUCwgMCwgSU9WVF9CT09MLCAwfQotCSwKLQl7InBrdGdlbiIsIElPVl9QS1RHRU4sIDAsIElPVlRfQlVGRkVSLCBzaXplb2Yoc3RydWN0IGJyY21mX3BrdGdlbil9Ci0JLAotI2VuZGlmCQkJCS8qIFNEVEVTVCAqLwotCi0Je05VTEwsIDAsIDAsIDAsIDB9Ci19OwotCi1zdGF0aWMgdm9pZAotYnJjbWZfZHVtcF9wY3Qoc3RydWN0IGJyY211X3N0cmJ1ZiAqc3RyYnVmLCBjaGFyICpkZXNjLCB1aW50IG51bSwgdWludCBkaXYpCi17Ci0JdWludCBxMSwgcTI7Ci0KLQlpZiAoIWRpdikgewotCQlicmNtdV9icHJpbnRmKHN0cmJ1ZiwgIiVzIE4vQSIsIGRlc2MpOwotCX0gZWxzZSB7Ci0JCXExID0gbnVtIC8gZGl2OwotCQlxMiA9ICgxMDAgKiAobnVtIC0gKHExICogZGl2KSkpIC8gZGl2OwotCQlicmNtdV9icHJpbnRmKHN0cmJ1ZiwgIiVzICVkLiUwMmQiLCBkZXNjLCBxMSwgcTIpOwotCX0KLX0KLQotdm9pZCBicmNtZl9zZGJyY21fYnVzX2R1bXAoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgc3RydWN0IGJyY211X3N0cmJ1ZiAqc3RyYnVmKQotewotCXN0cnVjdCBicmNtZl9idXMgKmJ1cyA9IGRydnItPmJ1czsKLQotCWJyY211X2JwcmludGYoc3RyYnVmLCAiQnVzIFNESU8gc3RydWN0dXJlOlxuIik7Ci0JYnJjbXVfYnByaW50ZihzdHJidWYsCi0JCSAgICAiaG9zdGludG1hc2sgMHglMDh4IGludHN0YXR1cyAweCUwOHggc2RwY21fdmVyICVkXG4iLAotCQkgICAgYnVzLT5ob3N0aW50bWFzaywgYnVzLT5pbnRzdGF0dXMsIGJ1cy0+c2RwY21fdmVyKTsKLQlicmNtdV9icHJpbnRmKHN0cmJ1ZiwKLQkJICAgICJmY3N0YXRlICVkIHFsZW4gJWQgdHhfc2VxICVkLCBtYXggJWQsIHJ4c2tpcCAlZCByeGxlbiAlZCByeF9zZXEgJWRcbiIsCi0JCSAgICBidXMtPmZjc3RhdGUsIHBrdHFfbGVuKCZidXMtPnR4cSksIGJ1cy0+dHhfc2VxLCBidXMtPnR4X21heCwKLQkJICAgIGJ1cy0+cnhza2lwLCBidXMtPnJ4bGVuLCBidXMtPnJ4X3NlcSk7Ci0JYnJjbXVfYnByaW50ZihzdHJidWYsICJpbnRyICVkIGludHJjb3VudCAlZCBsYXN0aW50cnMgJWQgc3B1cmlvdXMgJWRcbiIsCi0JCSAgICBidXMtPmludHIsIGJ1cy0+aW50cmNvdW50LCBidXMtPmxhc3RpbnRycywgYnVzLT5zcHVyaW91cyk7Ci0JYnJjbXVfYnByaW50ZihzdHJidWYsICJwb2xscmF0ZSAlZCBwb2xsY250ICVkIHJlZ2ZhaWxzICVkXG4iLAotCQkgICAgYnVzLT5wb2xscmF0ZSwgYnVzLT5wb2xsY250LCBidXMtPnJlZ2ZhaWxzKTsKLQotCWJyY211X2JwcmludGYoc3RyYnVmLCAiXG5BZGRpdGlvbmFsIGNvdW50ZXJzOlxuIik7Ci0JYnJjbXVfYnByaW50ZihzdHJidWYsCi0JCSAgICAidHhfc2RlcnJzICVkIGZjcXVldWVkICVkIHJ4cnR4ICVkIHJ4X3Rvb2xvbmcgJWQgcnhjX2Vycm9ycyAlZFxuIiwKLQkJICAgIGJ1cy0+dHhfc2RlcnJzLCBidXMtPmZjcXVldWVkLCBidXMtPnJ4cnR4LCBidXMtPnJ4X3Rvb2xvbmcsCi0JCSAgICBidXMtPnJ4Y19lcnJvcnMpOwotCWJyY211X2JwcmludGYoc3RyYnVmLCAicnhfaGRyZmFpbCAlZCBiYWRoZHIgJWQgYmFkc2VxICVkXG4iLAotCQkgICAgYnVzLT5yeF9oZHJmYWlsLCBidXMtPnJ4X2JhZGhkciwgYnVzLT5yeF9iYWRzZXEpOwotCWJyY211X2JwcmludGYoc3RyYnVmLCAiZmNfcmN2ZCAlZCwgZmNfeG9mZiAlZCwgZmNfeG9uICVkXG4iLAotCQkgICAgICBidXMtPmZjX3JjdmQsIGJ1cy0+ZmNfeG9mZiwgYnVzLT5mY194b24pOwotCWJyY211X2JwcmludGYoc3RyYnVmLCAicnhnbG9tZmFpbCAlZCwgcnhnbG9tZnJhbWVzICVkLCByeGdsb21wa3RzICVkXG4iLAotCQkgICAgYnVzLT5yeGdsb21mYWlsLCBidXMtPnJ4Z2xvbWZyYW1lcywgYnVzLT5yeGdsb21wa3RzKTsKLQlicmNtdV9icHJpbnRmKHN0cmJ1ZiwgImYycnggKGhkcnMvZGF0YSkgJWQgKCVkLyVkKSwgZjJ0eCAlZCBmMXJlZ3MiCi0JCSAgICAgICIgJWRcbiIsCi0JCSAgICAgIChidXMtPmYycnhoZHJzICsgYnVzLT5mMnJ4ZGF0YSksIGJ1cy0+ZjJyeGhkcnMsCi0JCSAgICAgIGJ1cy0+ZjJyeGRhdGEsIGJ1cy0+ZjJ0eGRhdGEsIGJ1cy0+ZjFyZWdkYXRhKTsKLQl7Ci0JCWJyY21mX2R1bXBfcGN0KHN0cmJ1ZiwgIlxuUng6IHBrdHMvZjJyZCIsIGJ1cy0+ZHJ2ci0+cnhfcGFja2V0cywKLQkJCSAgICAgKGJ1cy0+ZjJyeGhkcnMgKyBidXMtPmYycnhkYXRhKSk7Ci0JCWJyY21mX2R1bXBfcGN0KHN0cmJ1ZiwgIiwgcGt0cy9mMXNkIiwgYnVzLT5kcnZyLT5yeF9wYWNrZXRzLAotCQkJICAgICBidXMtPmYxcmVnZGF0YSk7Ci0JCWJyY21mX2R1bXBfcGN0KHN0cmJ1ZiwgIiwgcGt0cy9zZCIsIGJ1cy0+ZHJ2ci0+cnhfcGFja2V0cywKLQkJCSAgICAgKGJ1cy0+ZjJyeGhkcnMgKyBidXMtPmYycnhkYXRhICsgYnVzLT5mMXJlZ2RhdGEpKTsKLQkJYnJjbWZfZHVtcF9wY3Qoc3RyYnVmLCAiLCBwa3RzL2ludCIsIGJ1cy0+ZHJ2ci0+cnhfcGFja2V0cywKLQkJCSAgICAgYnVzLT5pbnRyY291bnQpOwotCQlicmNtdV9icHJpbnRmKHN0cmJ1ZiwgIlxuIik7Ci0KLQkJYnJjbWZfZHVtcF9wY3Qoc3RyYnVmLCAiUng6IGdsb20gcGN0IiwgKDEwMCAqIGJ1cy0+cnhnbG9tcGt0cyksCi0JCQkgICAgIGJ1cy0+ZHJ2ci0+cnhfcGFja2V0cyk7Ci0JCWJyY21mX2R1bXBfcGN0KHN0cmJ1ZiwgIiwgcGt0cy9nbG9tIiwgYnVzLT5yeGdsb21wa3RzLAotCQkJICAgICBidXMtPnJ4Z2xvbWZyYW1lcyk7Ci0JCWJyY211X2JwcmludGYoc3RyYnVmLCAiXG4iKTsKLQotCQlicmNtZl9kdW1wX3BjdChzdHJidWYsICJUeDogcGt0cy9mMndyIiwgYnVzLT5kcnZyLT50eF9wYWNrZXRzLAotCQkJICAgICBidXMtPmYydHhkYXRhKTsKLQkJYnJjbWZfZHVtcF9wY3Qoc3RyYnVmLCAiLCBwa3RzL2Yxc2QiLCBidXMtPmRydnItPnR4X3BhY2tldHMsCi0JCQkgICAgIGJ1cy0+ZjFyZWdkYXRhKTsKLQkJYnJjbWZfZHVtcF9wY3Qoc3RyYnVmLCAiLCBwa3RzL3NkIiwgYnVzLT5kcnZyLT50eF9wYWNrZXRzLAotCQkJICAgICAoYnVzLT5mMnR4ZGF0YSArIGJ1cy0+ZjFyZWdkYXRhKSk7Ci0JCWJyY21mX2R1bXBfcGN0KHN0cmJ1ZiwgIiwgcGt0cy9pbnQiLCBidXMtPmRydnItPnR4X3BhY2tldHMsCi0JCQkgICAgIGJ1cy0+aW50cmNvdW50KTsKLQkJYnJjbXVfYnByaW50ZihzdHJidWYsICJcbiIpOwotCi0JCWJyY21mX2R1bXBfcGN0KHN0cmJ1ZiwgIlRvdGFsOiBwa3RzL2YycnciLAotCQkJICAgICAoYnVzLT5kcnZyLT50eF9wYWNrZXRzICsgYnVzLT5kcnZyLT5yeF9wYWNrZXRzKSwKLQkJCSAgICAgKGJ1cy0+ZjJ0eGRhdGEgKyBidXMtPmYycnhoZHJzICsgYnVzLT5mMnJ4ZGF0YSkpOwotCQlicmNtZl9kdW1wX3BjdChzdHJidWYsICIsIHBrdHMvZjFzZCIsCi0JCQkgICAgIChidXMtPmRydnItPnR4X3BhY2tldHMgKyBidXMtPmRydnItPnJ4X3BhY2tldHMpLAotCQkJICAgICBidXMtPmYxcmVnZGF0YSk7Ci0JCWJyY21mX2R1bXBfcGN0KHN0cmJ1ZiwgIiwgcGt0cy9zZCIsCi0JCQkgICAgIChidXMtPmRydnItPnR4X3BhY2tldHMgKyBidXMtPmRydnItPnJ4X3BhY2tldHMpLAotCQkJICAgICAoYnVzLT5mMnR4ZGF0YSArIGJ1cy0+ZjJyeGhkcnMgKyBidXMtPmYycnhkYXRhICsKLQkJCSAgICAgIGJ1cy0+ZjFyZWdkYXRhKSk7Ci0JCWJyY21mX2R1bXBfcGN0KHN0cmJ1ZiwgIiwgcGt0cy9pbnQiLAotCQkJICAgICAoYnVzLT5kcnZyLT50eF9wYWNrZXRzICsgYnVzLT5kcnZyLT5yeF9wYWNrZXRzKSwKLQkJCSAgICAgYnVzLT5pbnRyY291bnQpOwotCQlicmNtdV9icHJpbnRmKHN0cmJ1ZiwgIlxuXG4iKTsKLQl9Ci0KLSNpZmRlZiBTRFRFU1QKLQlpZiAoYnVzLT5wa3RnZW5fY291bnQpIHsKLQkJYnJjbXVfYnByaW50ZihzdHJidWYsICJwa3RnZW4gY29uZmlnIGFuZCBjb3VudDpcbiIpOwotCQlicmNtdV9icHJpbnRmKHN0cmJ1ZiwKLQkJCSAgICAiZnJlcSAlZCBjb3VudCAlZCBwcmludCAlZCB0b3RhbCAlZCBtaW4gJWQgbGVuICVkXG4iLAotCQkJICAgIGJ1cy0+cGt0Z2VuX2ZyZXEsIGJ1cy0+cGt0Z2VuX2NvdW50LAotCQkJICAgIGJ1cy0+cGt0Z2VuX3ByaW50LCBidXMtPnBrdGdlbl90b3RhbCwKLQkJCSAgICBidXMtPnBrdGdlbl9taW5sZW4sIGJ1cy0+cGt0Z2VuX21heGxlbik7Ci0JCWJyY211X2JwcmludGYoc3RyYnVmLCAic2VuZCBhdHRlbXB0cyAlZCByY3ZkICVkIGZhaWwgJWRcbiIsCi0JCQkgICAgYnVzLT5wa3RnZW5fc2VudCwgYnVzLT5wa3RnZW5fcmN2ZCwKLQkJCSAgICBidXMtPnBrdGdlbl9mYWlsKTsKLQl9Ci0jZW5kaWYJCQkJLyogU0RURVNUICovCi0jaWZkZWYgQkNNREJHCi0JYnJjbXVfYnByaW50ZihzdHJidWYsICJkcGNfc2NoZWQgJWQgaG9zdCBpbnRlcnJ1cHQlc3BlbmRpbmdcbiIsCi0JCSAgICAgIGJ1cy0+ZHBjX3NjaGVkLCAiIG5vdCAiKTsKLQlicmNtdV9icHJpbnRmKHN0cmJ1ZiwgImJsb2Nrc2l6ZSAlZCByb3VuZHVwICVkXG4iLCBidXMtPmJsb2Nrc2l6ZSwKLQkJICAgIGJ1cy0+cm91bmR1cCk7Ci0jZW5kaWYJCQkJLyogQkNNREJHICovCi0JYnJjbXVfYnByaW50ZihzdHJidWYsCi0JCSAgICAiY2xrc3RhdGUgJWQgYWN0aXZpdHkgJWQgaWRsZXRpbWUgJWQgaWRsZWNvdW50ICVkIHNsZWVwaW5nICVkXG4iLAotCQkgICAgYnVzLT5jbGtzdGF0ZSwgYnVzLT5hY3Rpdml0eSwgYnVzLT5pZGxldGltZSwgYnVzLT5pZGxlY291bnQsCi0JCSAgICBidXMtPnNsZWVwaW5nKTsKLX0KLQotdm9pZCBicmNtZl9idXNfY2xlYXJjb3VudHMoc3RydWN0IGJyY21mX3B1YiAqZHJ2cikKLXsKLQlzdHJ1Y3QgYnJjbWZfYnVzICpidXMgPSAoc3RydWN0IGJyY21mX2J1cyAqKSBkcnZyLT5idXM7Ci0KLQlidXMtPmludHJjb3VudCA9IGJ1cy0+bGFzdGludHJzID0gYnVzLT5zcHVyaW91cyA9IGJ1cy0+cmVnZmFpbHMgPSAwOwotCWJ1cy0+cnhydHggPSBidXMtPnJ4X3Rvb2xvbmcgPSBidXMtPnJ4Y19lcnJvcnMgPSAwOwotCWJ1cy0+cnhfaGRyZmFpbCA9IGJ1cy0+cnhfYmFkaGRyID0gYnVzLT5yeF9iYWRzZXEgPSAwOwotCWJ1cy0+dHhfc2RlcnJzID0gYnVzLT5mY19yY3ZkID0gYnVzLT5mY194b2ZmID0gYnVzLT5mY194b24gPSAwOwotCWJ1cy0+cnhnbG9tZmFpbCA9IGJ1cy0+cnhnbG9tZnJhbWVzID0gYnVzLT5yeGdsb21wa3RzID0gMDsKLQlidXMtPmYycnhoZHJzID0gYnVzLT5mMnJ4ZGF0YSA9IGJ1cy0+ZjJ0eGRhdGEgPSBidXMtPmYxcmVnZGF0YSA9IDA7Ci19Ci0KLSNpZmRlZiBTRFRFU1QKLXN0YXRpYyBpbnQgYnJjbWZfc2RicmNtX3BrdGdlbl9nZXQoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1OCAqYXJnKQotewotCXN0cnVjdCBicmNtZl9wa3RnZW4gcGt0Z2VuOwotCi0JcGt0Z2VuLnZlcnNpb24gPSBCUkNNRl9QS1RHRU5fVkVSU0lPTjsKLQlwa3RnZW4uZnJlcSA9IGJ1cy0+cGt0Z2VuX2ZyZXE7Ci0JcGt0Z2VuLmNvdW50ID0gYnVzLT5wa3RnZW5fY291bnQ7Ci0JcGt0Z2VuLnByaW50ID0gYnVzLT5wa3RnZW5fcHJpbnQ7Ci0JcGt0Z2VuLnRvdGFsID0gYnVzLT5wa3RnZW5fdG90YWw7Ci0JcGt0Z2VuLm1pbmxlbiA9IGJ1cy0+cGt0Z2VuX21pbmxlbjsKLQlwa3RnZW4ubWF4bGVuID0gYnVzLT5wa3RnZW5fbWF4bGVuOwotCXBrdGdlbi5udW1zZW50ID0gYnVzLT5wa3RnZW5fc2VudDsKLQlwa3RnZW4ubnVtcmN2ZCA9IGJ1cy0+cGt0Z2VuX3JjdmQ7Ci0JcGt0Z2VuLm51bWZhaWwgPSBidXMtPnBrdGdlbl9mYWlsOwotCXBrdGdlbi5tb2RlID0gYnVzLT5wa3RnZW5fbW9kZTsKLQlwa3RnZW4uc3RvcCA9IGJ1cy0+cGt0Z2VuX3N0b3A7Ci0KLQltZW1jcHkoYXJnLCAmcGt0Z2VuLCBzaXplb2YocGt0Z2VuKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBicmNtZl9zZGJyY21fcGt0Z2VuX3NldChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHU4ICphcmcpCi17Ci0Jc3RydWN0IGJyY21mX3BrdGdlbiBwa3RnZW47Ci0JdWludCBvbGRjbnQsIG9sZG1vZGU7Ci0KLQltZW1jcHkoJnBrdGdlbiwgYXJnLCBzaXplb2YocGt0Z2VuKSk7Ci0JaWYgKHBrdGdlbi52ZXJzaW9uICE9IEJSQ01GX1BLVEdFTl9WRVJTSU9OKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW9sZGNudCA9IGJ1cy0+cGt0Z2VuX2NvdW50OwotCW9sZG1vZGUgPSBidXMtPnBrdGdlbl9tb2RlOwotCi0JYnVzLT5wa3RnZW5fZnJlcSA9IHBrdGdlbi5mcmVxOwotCWJ1cy0+cGt0Z2VuX2NvdW50ID0gcGt0Z2VuLmNvdW50OwotCWJ1cy0+cGt0Z2VuX3ByaW50ID0gcGt0Z2VuLnByaW50OwotCWJ1cy0+cGt0Z2VuX3RvdGFsID0gcGt0Z2VuLnRvdGFsOwotCWJ1cy0+cGt0Z2VuX21pbmxlbiA9IHBrdGdlbi5taW5sZW47Ci0JYnVzLT5wa3RnZW5fbWF4bGVuID0gcGt0Z2VuLm1heGxlbjsKLQlidXMtPnBrdGdlbl9tb2RlID0gcGt0Z2VuLm1vZGU7Ci0JYnVzLT5wa3RnZW5fc3RvcCA9IHBrdGdlbi5zdG9wOwotCi0JYnVzLT5wa3RnZW5fdGljayA9IGJ1cy0+cGt0Z2VuX3B0aWNrID0gMDsKLQlidXMtPnBrdGdlbl9sZW4gPSBtYXgoYnVzLT5wa3RnZW5fbGVuLCBidXMtPnBrdGdlbl9taW5sZW4pOwotCWJ1cy0+cGt0Z2VuX2xlbiA9IG1pbihidXMtPnBrdGdlbl9sZW4sIGJ1cy0+cGt0Z2VuX21heGxlbik7Ci0KLQkvKiBDbGVhciBjb3VudHMgZm9yIGEgbmV3IHBrdGdlbiAobW9kZSBjaGFuZ2UsIG9yIHdhcyBzdG9wcGVkKSAqLwotCWlmIChidXMtPnBrdGdlbl9jb3VudCAmJiAoIW9sZGNudCB8fCBvbGRtb2RlICE9IGJ1cy0+cGt0Z2VuX21vZGUpKQotCQlidXMtPnBrdGdlbl9zZW50ID0gYnVzLT5wa3RnZW5fcmN2ZCA9IGJ1cy0+cGt0Z2VuX2ZhaWwgPSAwOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYJCQkJLyogU0RURVNUICovCi0KLXN0YXRpYyBpbnQKLWJyY21mX3NkYnJjbV9tZW1ieXRlcyhzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIGJvb2wgd3JpdGUsIHUzMiBhZGRyZXNzLCB1OCAqZGF0YSwKLQkJIHVpbnQgc2l6ZSkKLXsKLQlpbnQgYmNtZXJyb3IgPSAwOwotCXUzMiBzZGFkZHI7Ci0JdWludCBkc2l6ZTsKLQotCS8qIERldGVybWluZSBpbml0aWFsIHRyYW5zZmVyIHBhcmFtZXRlcnMgKi8KLQlzZGFkZHIgPSBhZGRyZXNzICYgU0JTRElPX1NCX09GVF9BRERSX01BU0s7Ci0JaWYgKChzZGFkZHIgKyBzaXplKSAmIFNCU0RJT19TQldJTkRPV19NQVNLKQotCQlkc2l6ZSA9IChTQlNESU9fU0JfT0ZUX0FERFJfTElNSVQgLSBzZGFkZHIpOwotCWVsc2UKLQkJZHNpemUgPSBzaXplOwotCi0JLyogU2V0IHRoZSBiYWNrcGxhbmUgd2luZG93IHRvIGluY2x1ZGUgdGhlIHN0YXJ0IGFkZHJlc3MgKi8KLQliY21lcnJvciA9IGJyY21mX3NkYnJjbV9zZXRfc2lhZGRyX3dpbmRvdyhidXMsIGFkZHJlc3MpOwotCWlmIChiY21lcnJvcikgewotCQlCUkNNRl9FUlJPUigoIiVzOiB3aW5kb3cgY2hhbmdlIGZhaWxlZFxuIiwgX19mdW5jX18pKTsKLQkJZ290byB4ZmVyX2RvbmU7Ci0JfQotCi0JLyogRG8gdGhlIHRyYW5zZmVyKHMpICovCi0Jd2hpbGUgKHNpemUpIHsKLQkJQlJDTUZfSU5GTygoIiVzOiAlcyAlZCBieXRlcyBhdCBvZmZzZXQgMHglMDh4IGluIHdpbmRvdyIKLQkJCSAgICAiIDB4JTA4eFxuIiwgX19mdW5jX18sICh3cml0ZSA/ICJ3cml0ZSIgOiAicmVhZCIpLAotCQkJICAgIGRzaXplLCBzZGFkZHIsIChhZGRyZXNzICYgU0JTRElPX1NCV0lORE9XX01BU0spKSk7Ci0JCWJjbWVycm9yID0KLQkJICAgICBicmNtZl9zZGNhcmRfcndkYXRhKGJ1cy0+Y2FyZCwgd3JpdGUsIHNkYWRkciwgZGF0YSwgZHNpemUpOwotCQlpZiAoYmNtZXJyb3IpIHsKLQkJCUJSQ01GX0VSUk9SKCgiJXM6IG1lbWJ5dGVzIHRyYW5zZmVyIGZhaWxlZFxuIiwKLQkJCQkgICAgIF9fZnVuY19fKSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIEFkanVzdCBmb3IgbmV4dCB0cmFuc2ZlciAoaWYgYW55KSAqLwotCQlzaXplIC09IGRzaXplOwotCQlpZiAoc2l6ZSkgewotCQkJZGF0YSArPSBkc2l6ZTsKLQkJCWFkZHJlc3MgKz0gZHNpemU7Ci0JCQliY21lcnJvciA9IGJyY21mX3NkYnJjbV9zZXRfc2lhZGRyX3dpbmRvdyhidXMsIGFkZHJlc3MpOwotCQkJaWYgKGJjbWVycm9yKSB7Ci0JCQkJQlJDTUZfRVJST1IoKCIlczogd2luZG93IGNoYW5nZSBmYWlsZWRcbiIsCi0JCQkJCSAgICAgX19mdW5jX18pKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXNkYWRkciA9IDA7Ci0JCQlkc2l6ZSA9IG1pbl90KHVpbnQsIFNCU0RJT19TQl9PRlRfQUREUl9MSU1JVCwgc2l6ZSk7Ci0JCX0KLQl9Ci0KLXhmZXJfZG9uZToKLQkvKiBSZXR1cm4gdGhlIHdpbmRvdyB0byBiYWNrcGxhbmUgZW51bWVyYXRpb24gc3BhY2UgZm9yIGNvcmUgYWNjZXNzICovCi0JaWYgKGJyY21mX3NkYnJjbV9zZXRfc2lhZGRyX3dpbmRvdyhidXMsCi0JCQkJCSAgIGJyY21mX3NkY2FyZF9jdXJfc2J3YWQoYnVzLT5jYXJkKSkpIHsKLQkJQlJDTUZfRVJST1IoKCIlczogRkFJTEVEIHRvIHNldCB3aW5kb3cgYmFjayB0byAweCV4XG4iLAotCQkJICAgICBfX2Z1bmNfXywgYnJjbWZfc2RjYXJkX2N1cl9zYndhZChidXMtPmNhcmQpKSk7Ci0JfQotCi0JcmV0dXJuIGJjbWVycm9yOwotfQotCi0jaWZkZWYgQkNNREJHCi1zdGF0aWMgaW50IGJyY21mX3NkYnJjbV9yZWFkc2hhcmVkKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgc3RydWN0IHNkcGNtX3NoYXJlZCAqc2gpCi17Ci0JdTMyIGFkZHI7Ci0JaW50IHJ2OwotCi0JLyogUmVhZCBsYXN0IHdvcmQgaW4gbWVtb3J5IHRvIGRldGVybWluZSBhZGRyZXNzIG9mCi0JCQkgc2RwY21fc2hhcmVkIHN0cnVjdHVyZSAqLwotCXJ2ID0gYnJjbWZfc2RicmNtX21lbWJ5dGVzKGJ1cywgZmFsc2UsIGJ1cy0+cmFtc2l6ZSAtIDQsICh1OCAqKSZhZGRyLAotCQkJCSAgIDQpOwotCWlmIChydiA8IDApCi0JCXJldHVybiBydjsKLQotCWFkZHIgPSBsZTMyX3RvX2NwdShhZGRyKTsKLQotCUJSQ01GX0lORk8oKCJzZHBjbV9zaGFyZWQgYWRkcmVzcyAweCUwOFhcbiIsIGFkZHIpKTsKLQotCS8qCi0JICogQ2hlY2sgaWYgYWRkciBpcyB2YWxpZC4KLQkgKiBOVlJBTSBsZW5ndGggYXQgdGhlIGVuZCBvZiBtZW1vcnkgc2hvdWxkIGhhdmUgYmVlbiBvdmVyd3JpdHRlbi4KLQkgKi8KLQlpZiAoYWRkciA9PSAwIHx8ICgofmFkZHIgPj4gMTYpICYgMHhmZmZmKSA9PSAoYWRkciAmIDB4ZmZmZikpIHsKLQkJQlJDTUZfRVJST1IoKCIlczogYWRkcmVzcyAoMHglMDh4KSBvZiBzZHBjbV9zaGFyZWQgaW52YWxpZFxuIiwKLQkJCSAgICAgX19mdW5jX18sIGFkZHIpKTsKLQkJcmV0dXJuIC1FQkFERTsKLQl9Ci0KLQkvKiBSZWFkIHJ0ZV9zaGFyZWQgc3RydWN0dXJlICovCi0JcnYgPSBicmNtZl9zZGJyY21fbWVtYnl0ZXMoYnVzLCBmYWxzZSwgYWRkciwgKHU4ICopIHNoLAotCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzZHBjbV9zaGFyZWQpKTsKLQlpZiAocnYgPCAwKQotCQlyZXR1cm4gcnY7Ci0KLQkvKiBFbmRpYW5uZXNzICovCi0Jc2gtPmZsYWdzID0gbGUzMl90b19jcHUoc2gtPmZsYWdzKTsKLQlzaC0+dHJhcF9hZGRyID0gbGUzMl90b19jcHUoc2gtPnRyYXBfYWRkcik7Ci0Jc2gtPmFzc2VydF9leHBfYWRkciA9IGxlMzJfdG9fY3B1KHNoLT5hc3NlcnRfZXhwX2FkZHIpOwotCXNoLT5hc3NlcnRfZmlsZV9hZGRyID0gbGUzMl90b19jcHUoc2gtPmFzc2VydF9maWxlX2FkZHIpOwotCXNoLT5hc3NlcnRfbGluZSA9IGxlMzJfdG9fY3B1KHNoLT5hc3NlcnRfbGluZSk7Ci0Jc2gtPmNvbnNvbGVfYWRkciA9IGxlMzJfdG9fY3B1KHNoLT5jb25zb2xlX2FkZHIpOwotCXNoLT5tc2d0cmFjZV9hZGRyID0gbGUzMl90b19jcHUoc2gtPm1zZ3RyYWNlX2FkZHIpOwotCi0JaWYgKChzaC0+ZmxhZ3MgJiBTRFBDTV9TSEFSRURfVkVSU0lPTl9NQVNLKSAhPSBTRFBDTV9TSEFSRURfVkVSU0lPTikgewotCQlCUkNNRl9FUlJPUigoIiVzOiBzZHBjbV9zaGFyZWQgdmVyc2lvbiAlZCBpbiBicmNtZiAiCi0JCQkgICAgICJpcyBkaWZmZXJlbnQgdGhhbiBzZHBjbV9zaGFyZWQgdmVyc2lvbiAlZCBpbiBkb25nbGVcbiIsCi0JCQkgICAgIF9fZnVuY19fLCBTRFBDTV9TSEFSRURfVkVSU0lPTiwKLQkJCSAgICAgc2gtPmZsYWdzICYgU0RQQ01fU0hBUkVEX1ZFUlNJT05fTUFTSykpOwotCQlyZXR1cm4gLUVCQURFOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJyY21mX3NkYnJjbV9jaGVja2RpZWQoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1OCAqZGF0YSwgdWludCBzaXplKQotewotCWludCBiY21lcnJvciA9IDA7Ci0JdWludCBtc2l6ZSA9IDUxMjsKLQljaGFyICptYnVmZmVyID0gTlVMTDsKLQl1aW50IG1heHN0cmxlbiA9IDI1NjsKLQljaGFyICpzdHIgPSBOVUxMOwotCXN0cnVjdCBicmNtZl90cmFwIHRyOwotCXN0cnVjdCBzZHBjbV9zaGFyZWQgc2RwY21fc2hhcmVkOwotCXN0cnVjdCBicmNtdV9zdHJidWYgc3RyYnVmOwotCi0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQlpZiAoZGF0YSA9PSBOVUxMKSB7Ci0JCS8qCi0JCSAqIENhbGxlZCBhZnRlciBhIHJ4IGN0cmwgdGltZW91dC4gImRhdGEiIGlzIE5VTEwuCi0JCSAqIGFsbG9jYXRlIG1lbW9yeSB0byB0cmFjZSB0aGUgdHJhcCBvciBhc3NlcnQuCi0JCSAqLwotCQlzaXplID0gbXNpemU7Ci0JCW1idWZmZXIgPSBkYXRhID0ga21hbGxvYyhtc2l6ZSwgR0ZQX0FUT01JQyk7Ci0JCWlmIChtYnVmZmVyID09IE5VTEwpIHsKLQkJCUJSQ01GX0VSUk9SKCgiJXM6IGttYWxsb2MoJWQpIGZhaWxlZFxuIiwgX19mdW5jX18sCi0JCQkJICAgICBtc2l6ZSkpOwotCQkJYmNtZXJyb3IgPSAtRU5PTUVNOwotCQkJZ290byBkb25lOwotCQl9Ci0JfQotCi0Jc3RyID0ga21hbGxvYyhtYXhzdHJsZW4sIEdGUF9BVE9NSUMpOwotCWlmIChzdHIgPT0gTlVMTCkgewotCQlCUkNNRl9FUlJPUigoIiVzOiBrbWFsbG9jKCVkKSBmYWlsZWRcbiIsIF9fZnVuY19fLCBtYXhzdHJsZW4pKTsKLQkJYmNtZXJyb3IgPSAtRU5PTUVNOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JYmNtZXJyb3IgPSBicmNtZl9zZGJyY21fcmVhZHNoYXJlZChidXMsICZzZHBjbV9zaGFyZWQpOwotCWlmIChiY21lcnJvciA8IDApCi0JCWdvdG8gZG9uZTsKLQotCWJyY211X2Jpbml0KCZzdHJidWYsIGRhdGEsIHNpemUpOwotCi0JYnJjbXVfYnByaW50Zigmc3RyYnVmLAotCQkgICAgIm1zZ3RyYWNlIGFkZHJlc3MgOiAweCUwOFhcbmNvbnNvbGUgYWRkcmVzcyAgOiAweCUwOFhcbiIsCi0JCSAgICBzZHBjbV9zaGFyZWQubXNndHJhY2VfYWRkciwgc2RwY21fc2hhcmVkLmNvbnNvbGVfYWRkcik7Ci0KLQlpZiAoKHNkcGNtX3NoYXJlZC5mbGFncyAmIFNEUENNX1NIQVJFRF9BU1NFUlRfQlVJTFQpID09IDApIHsKLQkJLyogTk9URTogTWlzc3BlbGxlZCBhc3NlcnQgaXMgaW50ZW50aW9uYWwgLSBETyBOT1QgRklYLgotCQkgKiAoQXZvaWRzIGNvbmZsaWN0IHdpdGggcmVhbCBhc3NlcnRzIGZvciBwcm9ncmFtbWF0aWMKLQkJICogcGFyc2luZyBvZiBvdXRwdXQuKQotCQkgKi8KLQkJYnJjbXVfYnByaW50Zigmc3RyYnVmLCAiQXNzcnQgbm90IGJ1aWx0IGluIGRvbmdsZVxuIik7Ci0JfQotCi0JaWYgKChzZHBjbV9zaGFyZWQuZmxhZ3MgJiAoU0RQQ01fU0hBUkVEX0FTU0VSVCB8IFNEUENNX1NIQVJFRF9UUkFQKSkgPT0KLQkgICAgMCkgewotCQkvKiBOT1RFOiBNaXNzcGVsbGVkIGFzc2VydCBpcyBpbnRlbnRpb25hbCAtIERPIE5PVCBGSVguCi0JCSAqIChBdm9pZHMgY29uZmxpY3Qgd2l0aCByZWFsIGFzc2VydHMgZm9yIHByb2dyYW1tYXRpYwotCQkgKiBwYXJzaW5nIG9mIG91dHB1dC4pCi0JCSAqLwotCQlicmNtdV9icHJpbnRmKCZzdHJidWYsICJObyB0cmFwJXMgaW4gZG9uZ2xlIiwKLQkJCSAgICAoc2RwY21fc2hhcmVkLmZsYWdzICYgU0RQQ01fU0hBUkVEX0FTU0VSVF9CVUlMVCkKLQkJCSAgICA/ICIvYXNzcnQiIDogIiIpOwotCX0gZWxzZSB7Ci0JCWlmIChzZHBjbV9zaGFyZWQuZmxhZ3MgJiBTRFBDTV9TSEFSRURfQVNTRVJUKSB7Ci0JCQkvKiBEb3dubG9hZCBhc3NlcnQgKi8KLQkJCWJyY211X2JwcmludGYoJnN0cmJ1ZiwgIkRvbmdsZSBhc3NlcnQiKTsKLQkJCWlmIChzZHBjbV9zaGFyZWQuYXNzZXJ0X2V4cF9hZGRyICE9IDApIHsKLQkJCQlzdHJbMF0gPSAnXDAnOwotCQkJCWJjbWVycm9yID0gYnJjbWZfc2RicmNtX21lbWJ5dGVzKGJ1cywgZmFsc2UsCi0JCQkJCQlzZHBjbV9zaGFyZWQuYXNzZXJ0X2V4cF9hZGRyLAotCQkJCQkJKHU4ICopIHN0ciwgbWF4c3RybGVuKTsKLQkJCQlpZiAoYmNtZXJyb3IgPCAwKQotCQkJCQlnb3RvIGRvbmU7Ci0KLQkJCQlzdHJbbWF4c3RybGVuIC0gMV0gPSAnXDAnOwotCQkJCWJyY211X2JwcmludGYoJnN0cmJ1ZiwgIiBleHByIFwiJXNcIiIsIHN0cik7Ci0JCQl9Ci0KLQkJCWlmIChzZHBjbV9zaGFyZWQuYXNzZXJ0X2ZpbGVfYWRkciAhPSAwKSB7Ci0JCQkJc3RyWzBdID0gJ1wwJzsKLQkJCQliY21lcnJvciA9IGJyY21mX3NkYnJjbV9tZW1ieXRlcyhidXMsIGZhbHNlLAotCQkJCQkJc2RwY21fc2hhcmVkLmFzc2VydF9maWxlX2FkZHIsCi0JCQkJCQkodTggKikgc3RyLCBtYXhzdHJsZW4pOwotCQkJCWlmIChiY21lcnJvciA8IDApCi0JCQkJCWdvdG8gZG9uZTsKLQotCQkJCXN0clttYXhzdHJsZW4gLSAxXSA9ICdcMCc7Ci0JCQkJYnJjbXVfYnByaW50Zigmc3RyYnVmLCAiIGZpbGUgXCIlc1wiIiwgc3RyKTsKLQkJCX0KLQotCQkJYnJjbXVfYnByaW50Zigmc3RyYnVmLCAiIGxpbmUgJWQgIiwKLQkJCQkgICAgc2RwY21fc2hhcmVkLmFzc2VydF9saW5lKTsKLQkJfQotCi0JCWlmIChzZHBjbV9zaGFyZWQuZmxhZ3MgJiBTRFBDTV9TSEFSRURfVFJBUCkgewotCQkJYmNtZXJyb3IgPSBicmNtZl9zZGJyY21fbWVtYnl0ZXMoYnVzLCBmYWxzZSwKLQkJCQkJc2RwY21fc2hhcmVkLnRyYXBfYWRkciwgKHU4ICopJnRyLAotCQkJCQlzaXplb2Yoc3RydWN0IGJyY21mX3RyYXApKTsKLQkJCWlmIChiY21lcnJvciA8IDApCi0JCQkJZ290byBkb25lOwotCi0JCQlicmNtdV9icHJpbnRmKCZzdHJidWYsCi0JCQkJICAgICJEb25nbGUgdHJhcCB0eXBlIDB4JXggQCBlcGMgMHgleCwgY3BzciAweCV4LCBzcHNyIDB4JXgsIHNwIDB4JXgsIgotCQkJCSAgICAibHAgMHgleCwgcnBjIDB4JXggVHJhcCBvZmZzZXQgMHgleCwgIgotCQkJCSAgICAicjAgMHgleCwgcjEgMHgleCwgcjIgMHgleCwgcjMgMHgleCwgcjQgMHgleCwgcjUgMHgleCwgcjYgMHgleCwgcjcgMHgleFxuIiwKLQkJCQkgICAgdHIudHlwZSwgdHIuZXBjLCB0ci5jcHNyLCB0ci5zcHNyLCB0ci5yMTMsCi0JCQkJICAgIHRyLnIxNCwgdHIucGMsIHNkcGNtX3NoYXJlZC50cmFwX2FkZHIsCi0JCQkJICAgIHRyLnIwLCB0ci5yMSwgdHIucjIsIHRyLnIzLCB0ci5yNCwgdHIucjUsCi0JCQkJICAgIHRyLnI2LCB0ci5yNyk7Ci0JCX0KLQl9Ci0KLQlpZiAoc2RwY21fc2hhcmVkLmZsYWdzICYgKFNEUENNX1NIQVJFRF9BU1NFUlQgfCBTRFBDTV9TSEFSRURfVFJBUCkpCi0JCUJSQ01GX0VSUk9SKCgiJXM6ICVzXG4iLCBfX2Z1bmNfXywgc3RyYnVmLm9yaWdidWYpKTsKLQotI2lmZGVmIEJDTURCRwotCWlmIChzZHBjbV9zaGFyZWQuZmxhZ3MgJiBTRFBDTV9TSEFSRURfVFJBUCkgewotCQkvKiBNZW0gZHVtcCB0byBhIGZpbGUgb24gZGV2aWNlICovCi0JCWJyY21mX3NkYnJjbV9tZW1fZHVtcChidXMpOwotCX0KLSNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KLQotZG9uZToKLQlrZnJlZShtYnVmZmVyKTsKLQlrZnJlZShzdHIpOwotCi0JcmV0dXJuIGJjbWVycm9yOwotfQotCi1zdGF0aWMgaW50IGJyY21mX3NkYnJjbV9tZW1fZHVtcChzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IHNpemU7CQkvKiBGdWxsIG1lbSBzaXplICovCi0JaW50IHN0YXJ0ID0gMDsJCS8qIFN0YXJ0IGFkZHJlc3MgKi8KLQlpbnQgcmVhZF9zaXplID0gMDsJLyogUmVhZCBzaXplIG9mIGVhY2ggaXRlcmF0aW9uICovCi0JdTggKmJ1ZiA9IE5VTEwsICpkYXRhYnVmID0gTlVMTDsKLQotCS8qIEdldCBmdWxsIG1lbSBzaXplICovCi0Jc2l6ZSA9IGJ1cy0+cmFtc2l6ZTsKLQlidWYgPSBrbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwotCWlmICghYnVmKSB7Ci0JCUJSQ01GX0VSUk9SKCgiJXM6IE91dCBvZiBtZW1vcnkgKCVkIGJ5dGVzKVxuIiwgX19mdW5jX18sIHNpemUpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIFJlYWQgbWVtIGNvbnRlbnQgKi8KLQlwcmludGsoS0VSTl9ERUJVRyAiRHVtcCBkb25nbGUgbWVtb3J5Iik7Ci0JZGF0YWJ1ZiA9IGJ1ZjsKLQl3aGlsZSAoc2l6ZSkgewotCQlyZWFkX3NpemUgPSBtaW4oTUVNQkxPQ0ssIHNpemUpOwotCQlyZXQgPSBicmNtZl9zZGJyY21fbWVtYnl0ZXMoYnVzLCBmYWxzZSwgc3RhcnQsIGRhdGFidWYsCi0JCQkJCSAgcmVhZF9zaXplKTsKLQkJaWYgKHJldCkgewotCQkJQlJDTUZfRVJST1IoKCIlczogRXJyb3IgbWVtYnl0ZXMgJWRcbiIsIF9fZnVuY19fLCByZXQpKTsKLQkJCWtmcmVlKGJ1Zik7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcHJpbnRrKCIuIik7Ci0KLQkJLyogRGVjcmVtZW50IHNpemUgYW5kIGluY3JlbWVudCBzdGFydCBhZGRyZXNzICovCi0JCXNpemUgLT0gcmVhZF9zaXplOwotCQlzdGFydCArPSByZWFkX3NpemU7Ci0JCWRhdGFidWYgKz0gcmVhZF9zaXplOwotCX0KLQlwcmludGsoS0VSTl9ERUJVRyAiRG9uZVxuIik7Ci0KLQkvKiBmcmVlIGJ1ZiBiZWZvcmUgcmV0dXJuICEhISAqLwotCWlmIChicmNtZl93cml0ZV90b19maWxlKGJ1cy0+ZHJ2ciwgYnVmLCBidXMtPnJhbXNpemUpKSB7Ci0JCUJSQ01GX0VSUk9SKCgiJXM6IEVycm9yIHdyaXRpbmcgdG8gZmlsZXNcbiIsIF9fZnVuY19fKSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKiBidWYgZnJlZSBoYW5kbGVkIGluIGJyY21mX3dyaXRlX3RvX2ZpbGUsIG5vdCBoZXJlICovCi0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgQ09OU09MRV9MSU5FX01BWAkxOTIKLQotc3RhdGljIGludCBicmNtZl9zZGJyY21fcmVhZGNvbnNvbGUoc3RydWN0IGJyY21mX2J1cyAqYnVzKQotewotCXN0cnVjdCBicmNtZl9jb25zb2xlICpjID0gJmJ1cy0+Y29uc29sZTsKLQl1OCBsaW5lW0NPTlNPTEVfTElORV9NQVhdLCBjaDsKLQl1MzIgbiwgaWR4LCBhZGRyOwotCWludCBydjsKLQotCS8qIERvbid0IGRvIGFueXRoaW5nIHVudGlsIEZXUkVBRFkgdXBkYXRlcyBjb25zb2xlIGFkZHJlc3MgKi8KLQlpZiAoYnVzLT5jb25zb2xlX2FkZHIgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBSZWFkIGNvbnNvbGUgbG9nIHN0cnVjdCAqLwotCWFkZHIgPSBidXMtPmNvbnNvbGVfYWRkciArIG9mZnNldG9mKHN0cnVjdCBydGVfY29uc29sZSwgbG9nKTsKLQlydiA9IGJyY21mX3NkYnJjbV9tZW1ieXRlcyhidXMsIGZhbHNlLCBhZGRyLCAodTggKikmYy0+bG9nLAotCQkJCXNpemVvZihjLT5sb2cpKTsKLQlpZiAocnYgPCAwKQotCQlyZXR1cm4gcnY7Ci0KLQkvKiBBbGxvY2F0ZSBjb25zb2xlIGJ1ZmZlciAob25lIHRpbWUgb25seSkgKi8KLQlpZiAoYy0+YnVmID09IE5VTEwpIHsKLQkJYy0+YnVmc2l6ZSA9IGxlMzJfdG9fY3B1KGMtPmxvZy5idWZfc2l6ZSk7Ci0JCWMtPmJ1ZiA9IGttYWxsb2MoYy0+YnVmc2l6ZSwgR0ZQX0FUT01JQyk7Ci0JCWlmIChjLT5idWYgPT0gTlVMTCkKLQkJCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWlkeCA9IGxlMzJfdG9fY3B1KGMtPmxvZy5pZHgpOwotCi0JLyogUHJvdGVjdCBhZ2FpbnN0IGNvcnJ1cHQgdmFsdWUgKi8KLQlpZiAoaWR4ID4gYy0+YnVmc2l6ZSkKLQkJcmV0dXJuIC1FQkFERTsKLQotCS8qIFNraXAgcmVhZGluZyB0aGUgY29uc29sZSBidWZmZXIgaWYgdGhlIGluZGV4IHBvaW50ZXIKLQkgaGFzIG5vdCBtb3ZlZCAqLwotCWlmIChpZHggPT0gYy0+bGFzdCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBSZWFkIHRoZSBjb25zb2xlIGJ1ZmZlciAqLwotCWFkZHIgPSBsZTMyX3RvX2NwdShjLT5sb2cuYnVmKTsKLQlydiA9IGJyY21mX3NkYnJjbV9tZW1ieXRlcyhidXMsIGZhbHNlLCBhZGRyLCBjLT5idWYsIGMtPmJ1ZnNpemUpOwotCWlmIChydiA8IDApCi0JCXJldHVybiBydjsKLQotCXdoaWxlIChjLT5sYXN0ICE9IGlkeCkgewotCQlmb3IgKG4gPSAwOyBuIDwgQ09OU09MRV9MSU5FX01BWCAtIDI7IG4rKykgewotCQkJaWYgKGMtPmxhc3QgPT0gaWR4KSB7Ci0JCQkJLyogVGhpcyB3b3VsZCBvdXRwdXQgYSBwYXJ0aWFsIGxpbmUuCi0JCQkJICogSW5zdGVhZCwgYmFjayB1cAotCQkJCSAqIHRoZSBidWZmZXIgcG9pbnRlciBhbmQgb3V0cHV0IHRoaXMKLQkJCQkgKiBsaW5lIG5leHQgdGltZSBhcm91bmQuCi0JCQkJICovCi0JCQkJaWYgKGMtPmxhc3QgPj0gbikKLQkJCQkJYy0+bGFzdCAtPSBuOwotCQkJCWVsc2UKLQkJCQkJYy0+bGFzdCA9IGMtPmJ1ZnNpemUgLSBuOwotCQkJCWdvdG8gYnJlYWsyOwotCQkJfQotCQkJY2ggPSBjLT5idWZbYy0+bGFzdF07Ci0JCQljLT5sYXN0ID0gKGMtPmxhc3QgKyAxKSAlIGMtPmJ1ZnNpemU7Ci0JCQlpZiAoY2ggPT0gJ1xuJykKLQkJCQlicmVhazsKLQkJCWxpbmVbbl0gPSBjaDsKLQkJfQotCi0JCWlmIChuID4gMCkgewotCQkJaWYgKGxpbmVbbiAtIDFdID09ICdccicpCi0JCQkJbi0tOwotCQkJbGluZVtuXSA9IDA7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiQ09OU09MRTogJXNcbiIsIGxpbmUpOwotCQl9Ci0JfQotYnJlYWsyOgotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYJCQkJLyogQkNNREJHICovCi0KLWludCBicmNtZl9zZGJyY21fZG93bmxvYWR2YXJzKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdm9pZCAqYXJnLCBpbnQgbGVuKQotewotCWludCBiY21lcnJvciA9IDA7Ci0KLQlCUkNNRl9UUkFDRSgoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKLQotCS8qIEJhc2ljIHNhbml0eSBjaGVja3MgKi8KLQlpZiAoYnVzLT5kcnZyLT51cCkgewotCQliY21lcnJvciA9IC1FSVNDT05OOwotCQlnb3RvIGVycjsKLQl9Ci0JaWYgKCFsZW4pIHsKLQkJYmNtZXJyb3IgPSAtRU9WRVJGTE9XOwotCQlnb3RvIGVycjsKLQl9Ci0KLQkvKiBGcmVlIHRoZSBvbGQgb25lcyBhbmQgcmVwbGFjZSB3aXRoIHBhc3NlZCB2YXJpYWJsZXMgKi8KLQlrZnJlZShidXMtPnZhcnMpOwotCi0JYnVzLT52YXJzID0ga21hbGxvYyhsZW4sIEdGUF9BVE9NSUMpOwotCWJ1cy0+dmFyc3ogPSBidXMtPnZhcnMgPyBsZW4gOiAwOwotCWlmIChidXMtPnZhcnMgPT0gTlVMTCkgewotCQliY21lcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyOwotCX0KLQotCS8qIENvcHkgdGhlIHBhc3NlZCB2YXJpYWJsZXMsIHdoaWNoIHNob3VsZCBpbmNsdWRlIHRoZQotCQkgdGVybWluYXRpbmcgZG91YmxlLW51bGwgKi8KLQltZW1jcHkoYnVzLT52YXJzLCBhcmcsIGJ1cy0+dmFyc3opOwotZXJyOgotCXJldHVybiBiY21lcnJvcjsKLX0KLQotc3RhdGljIGludAotYnJjbWZfc2RicmNtX2RvaW92YXIoc3RydWN0IGJyY21mX2J1cyAqYnVzLCBjb25zdCBzdHJ1Y3QgYnJjbXVfaW92YXIgKnZpLCB1MzIgYWN0aW9uaWQsCi0JCWNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnBhcmFtcywgaW50IHBsZW4sIHZvaWQgKmFyZywgaW50IGxlbiwKLQkJaW50IHZhbF9zaXplKQotewotCWludCBiY21lcnJvciA9IDA7Ci0JczMyIGludF92YWwgPSAwOwotCWJvb2wgYm9vbF92YWwgPSAwOwotCi0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXIsIGFjdGlvbiAlZCBuYW1lICVzIHBhcmFtcyAlcCBwbGVuICVkIGFyZyAlcCAiCi0JCSAgICAgImxlbiAlZCB2YWxfc2l6ZSAlZFxuIiwgX19mdW5jX18sIGFjdGlvbmlkLCBuYW1lLCBwYXJhbXMsCi0JCSAgICAgcGxlbiwgYXJnLCBsZW4sIHZhbF9zaXplKSk7Ci0KLQliY21lcnJvciA9IGJyY211X2lvdmFyX2xlbmNoZWNrKHZpLCBhcmcsIGxlbiwgSU9WX0lTU0VUKGFjdGlvbmlkKSk7Ci0JaWYgKGJjbWVycm9yICE9IDApCi0JCWdvdG8gZXhpdDsKLQotCWlmIChwbGVuID49IChpbnQpc2l6ZW9mKGludF92YWwpKQotCQltZW1jcHkoJmludF92YWwsIHBhcmFtcywgc2l6ZW9mKGludF92YWwpKTsKLQotCWJvb2xfdmFsID0gKGludF92YWwgIT0gMCkgPyB0cnVlIDogZmFsc2U7Ci0KLQkvKiBTb21lIGlvY3RscyB1c2UgdGhlIGJ1cyAqLwotCWJyY21mX3NkYnJjbV9zZGxvY2soYnVzKTsKLQotCS8qIENoZWNrIGlmIGRvbmdsZSBpcyBpbiByZXNldC4gSWYgc28sIG9ubHkgYWxsb3cgREVWUkVTRVQgaW92YXJzICovCi0JaWYgKGJ1cy0+ZHJ2ci0+ZG9uZ2xlX3Jlc2V0ICYmICEoYWN0aW9uaWQgPT0gSU9WX1NWQUwoSU9WX0RFVlJFU0VUKSB8fAotCQkJCQlhY3Rpb25pZCA9PSBJT1ZfR1ZBTChJT1ZfREVWUkVTRVQpKSkgewotCQliY21lcnJvciA9IC1FUEVSTTsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIEhhbmRsZSBzbGVlcCBzdHVmZiBiZWZvcmUgYW55IGNsb2NrIG11Y2tpbmcgKi8KLQlpZiAodmktPnZhcmlkID09IElPVl9TTEVFUCkgewotCQlpZiAoSU9WX0lTU0VUKGFjdGlvbmlkKSkgewotCQkJYmNtZXJyb3IgPSBicmNtZl9zZGJyY21fYnVzc2xlZXAoYnVzLCBib29sX3ZhbCk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnRfdmFsID0gKHMzMikgYnVzLT5zbGVlcGluZzsKLQkJCW1lbWNweShhcmcsICZpbnRfdmFsLCB2YWxfc2l6ZSk7Ci0JCX0KLQkJZ290byBleGl0OwotCX0KLQotCS8qIFJlcXVlc3QgY2xvY2sgdG8gYWxsb3cgU0RJTyBhY2Nlc3NlcyAqLwotCWlmICghYnVzLT5kcnZyLT5kb25nbGVfcmVzZXQpIHsKLQkJQlVTX1dBS0UoYnVzKTsKLQkJYnJjbWZfc2RicmNtX2Nsa2N0bChidXMsIENMS19BVkFJTCwgZmFsc2UpOwotCX0KLQotCXN3aXRjaCAoYWN0aW9uaWQpIHsKLQljYXNlIElPVl9HVkFMKElPVl9JTlRSKToKLQkJaW50X3ZhbCA9IChzMzIpIGJ1cy0+aW50cjsKLQkJbWVtY3B5KGFyZywgJmludF92YWwsIHZhbF9zaXplKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElPVl9TVkFMKElPVl9JTlRSKToKLQkJYnVzLT5pbnRyID0gYm9vbF92YWw7Ci0JCWJ1cy0+aW50ZGlzID0gZmFsc2U7Ci0JCWlmIChidXMtPmRydnItPnVwKSB7Ci0JCQlCUkNNRl9JTlRSKCgiJXM6ICVzIFNESU8gaW50ZXJydXB0c1xuIiwgX19mdW5jX18sCi0JCQkJICAgIGJ1cy0+aW50ciA/ICJlbmFibGUiIDogImRpc2FibGUiKSk7Ci0JCQlpZiAoYnVzLT5pbnRyKSB7Ci0JCQkJYnJjbWZfc2RjYXJkX2ludHJfZW5hYmxlKGJ1cy0+Y2FyZCk7Ci0JCQl9IGVsc2UgewotCQkJCWJyY21mX3NkY2FyZF9pbnRyX2Rpc2FibGUoYnVzLT5jYXJkKTsKLQkJCX0KLQkJfQotCQlicmVhazsKLQotCWNhc2UgSU9WX0dWQUwoSU9WX1BPTExSQVRFKToKLQkJaW50X3ZhbCA9IChzMzIpIGJ1cy0+cG9sbHJhdGU7Ci0JCW1lbWNweShhcmcsICZpbnRfdmFsLCB2YWxfc2l6ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJT1ZfU1ZBTChJT1ZfUE9MTFJBVEUpOgotCQlidXMtPnBvbGxyYXRlID0gKHVpbnQpIGludF92YWw7Ci0JCWJ1cy0+cG9sbCA9IChidXMtPnBvbGxyYXRlICE9IDApOwotCQlicmVhazsKLQotCWNhc2UgSU9WX0dWQUwoSU9WX0lETEVUSU1FKToKLQkJaW50X3ZhbCA9IGJ1cy0+aWRsZXRpbWU7Ci0JCW1lbWNweShhcmcsICZpbnRfdmFsLCB2YWxfc2l6ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJT1ZfU1ZBTChJT1ZfSURMRVRJTUUpOgotCQlpZiAoKGludF92YWwgPCAwKSAmJiAoaW50X3ZhbCAhPSBCUkNNRl9JRExFX0lNTUVESUFURSkpCi0JCQliY21lcnJvciA9IC1FSU5WQUw7Ci0JCWVsc2UKLQkJCWJ1cy0+aWRsZXRpbWUgPSBpbnRfdmFsOwotCQlicmVhazsKLQotCWNhc2UgSU9WX0dWQUwoSU9WX0lETEVDTE9DSyk6Ci0JCWludF92YWwgPSAoczMyKSBidXMtPmlkbGVjbG9jazsKLQkJbWVtY3B5KGFyZywgJmludF92YWwsIHZhbF9zaXplKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElPVl9TVkFMKElPVl9JRExFQ0xPQ0spOgotCQlidXMtPmlkbGVjbG9jayA9IGludF92YWw7Ci0JCWJyZWFrOwotCi0JY2FzZSBJT1ZfR1ZBTChJT1ZfU0QxSURMRSk6Ci0JCWludF92YWwgPSAoczMyKSBzZDFpZGxlOwotCQltZW1jcHkoYXJnLCAmaW50X3ZhbCwgdmFsX3NpemUpOwotCQlicmVhazsKLQotCWNhc2UgSU9WX1NWQUwoSU9WX1NEMUlETEUpOgotCQlzZDFpZGxlID0gYm9vbF92YWw7Ci0JCWJyZWFrOwotCi0JY2FzZSBJT1ZfU1ZBTChJT1ZfTUVNQllURVMpOgotCWNhc2UgSU9WX0dWQUwoSU9WX01FTUJZVEVTKToKLQkJewotCQkJdTMyIGFkZHJlc3M7Ci0JCQl1aW50IHNpemUsIGRzaXplOwotCQkJdTggKmRhdGE7Ci0KLQkJCWJvb2wgc2V0ID0gKGFjdGlvbmlkID09IElPVl9TVkFMKElPVl9NRU1CWVRFUykpOwotCi0JCQlhZGRyZXNzID0gKHUzMikgaW50X3ZhbDsKLQkJCW1lbWNweSgmaW50X3ZhbCwgKGNoYXIgKilwYXJhbXMgKyBzaXplb2YoaW50X3ZhbCksCi0JCQkgICAgICAgc2l6ZW9mKGludF92YWwpKTsKLQkJCXNpemUgPSAodWludCkgaW50X3ZhbDsKLQotCQkJLyogRG8gc29tZSB2YWxpZGF0aW9uICovCi0JCQlkc2l6ZSA9IHNldCA/IHBsZW4gLSAoMiAqIHNpemVvZihpbnQpKSA6IGxlbjsKLQkJCWlmIChkc2l6ZSA8IHNpemUpIHsKLQkJCQlCUkNNRl9FUlJPUigoIiVzOiBlcnJvciBvbiAlcyBtZW1ieXRlcywgYWRkciAiCi0JCQkJCSAgICAgIjB4JTA4eCBzaXplICVkIGRzaXplICVkXG4iLAotCQkJCQkgICAgIF9fZnVuY19fLCAoc2V0ID8gInNldCIgOiAiZ2V0IiksCi0JCQkJCSAgICAgYWRkcmVzcywgc2l6ZSwgZHNpemUpKTsKLQkJCQliY21lcnJvciA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCUJSQ01GX0lORk8oKCIlczogUmVxdWVzdCB0byAlcyAlZCBieXRlcyBhdCBhZGRyZXNzICIKLQkJCQkgICAgIjB4JTA4eFxuIiwgX19mdW5jX18sCi0JCQkJICAgIChzZXQgPyAid3JpdGUiIDogInJlYWQiKSwgc2l6ZSwgYWRkcmVzcykpOwotCi0JCQkvKiBJZiB3ZSBrbm93IGFib3V0IFNPQ1JBTSwgY2hlY2sgZm9yIGEgZml0ICovCi0JCQlpZiAoKGJ1cy0+b3JpZ19yYW1zaXplKSAmJgotCQkJICAgICgoYWRkcmVzcyA+IGJ1cy0+b3JpZ19yYW1zaXplKQotCQkJICAgICB8fCAoYWRkcmVzcyArIHNpemUgPiBidXMtPm9yaWdfcmFtc2l6ZSkpKSB7Ci0JCQkJQlJDTUZfRVJST1IoKCIlczogcmFtc2l6ZSAweCUwOHggZG9lc24ndCBoYXZlIgotCQkJCQkgICAgICIgJWQgYnl0ZXMgYXQgMHglMDh4XG4iLCBfX2Z1bmNfXywKLQkJCQkJICAgICBidXMtPm9yaWdfcmFtc2l6ZSwgc2l6ZSwgYWRkcmVzcykpOwotCQkJCWJjbWVycm9yID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogR2VuZXJhdGUgdGhlIGFjdHVhbCBkYXRhIHBvaW50ZXIgKi8KLQkJCWRhdGEgPQotCQkJICAgIHNldCA/ICh1OCAqKSBwYXJhbXMgKwotCQkJICAgIDIgKiBzaXplb2YoaW50KSA6ICh1OCAqKSBhcmc7Ci0KLQkJCS8qIENhbGwgdG8gZG8gdGhlIHRyYW5zZmVyICovCi0JCQliY21lcnJvciA9IGJyY21mX3NkYnJjbV9tZW1ieXRlcyhidXMsIHNldCwgYWRkcmVzcywKLQkJCQkJCQkgZGF0YSwgc2l6ZSk7Ci0KLQkJCWJyZWFrOwotCQl9Ci0KLQljYXNlIElPVl9HVkFMKElPVl9NRU1TSVpFKToKLQkJaW50X3ZhbCA9IChzMzIpIGJ1cy0+cmFtc2l6ZTsKLQkJbWVtY3B5KGFyZywgJmludF92YWwsIHZhbF9zaXplKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElPVl9HVkFMKElPVl9TRElPRF9EUklWRSk6Ci0JCWludF92YWwgPSAoczMyKSBicmNtZl9zZGlvZF9kcml2ZV9zdHJlbmd0aDsKLQkJbWVtY3B5KGFyZywgJmludF92YWwsIHZhbF9zaXplKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElPVl9TVkFMKElPVl9TRElPRF9EUklWRSk6Ci0JCWJyY21mX3NkaW9kX2RyaXZlX3N0cmVuZ3RoID0gaW50X3ZhbDsKLQkJYnJjbWZfc2RicmNtX3NkaW9kX2RyaXZlX3N0cmVuZ3RoX2luaXQoYnVzLAotCQkJCQkgICAgIGJyY21mX3NkaW9kX2RyaXZlX3N0cmVuZ3RoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElPVl9TVkFMKElPVl9ET1dOTE9BRCk6Ci0JCWJjbWVycm9yID0gYnJjbWZfc2RicmNtX2Rvd25sb2FkX3N0YXRlKGJ1cywgYm9vbF92YWwpOwotCQlicmVhazsKLQotCWNhc2UgSU9WX1NWQUwoSU9WX1ZBUlMpOgotCQliY21lcnJvciA9IGJyY21mX3NkYnJjbV9kb3dubG9hZHZhcnMoYnVzLCBhcmcsIGxlbik7Ci0JCWJyZWFrOwotCi0JY2FzZSBJT1ZfR1ZBTChJT1ZfUkVBREFIRUFEKToKLQkJaW50X3ZhbCA9IChzMzIpIGJyY21mX3JlYWRhaGVhZDsKLQkJbWVtY3B5KGFyZywgJmludF92YWwsIHZhbF9zaXplKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElPVl9TVkFMKElPVl9SRUFEQUhFQUQpOgotCQlpZiAoYm9vbF92YWwgJiYgIWJyY21mX3JlYWRhaGVhZCkKLQkJCWJ1cy0+bmV4dGxlbiA9IDA7Ci0JCWJyY21mX3JlYWRhaGVhZCA9IGJvb2xfdmFsOwotCQlicmVhazsKLQotCWNhc2UgSU9WX0dWQUwoSU9WX1NEUlhDSEFJTik6Ci0JCWludF92YWwgPSAoczMyKSBidXMtPnVzZV9yeGNoYWluOwotCQltZW1jcHkoYXJnLCAmaW50X3ZhbCwgdmFsX3NpemUpOwotCQlicmVhazsKLQotCWNhc2UgSU9WX1NWQUwoSU9WX1NEUlhDSEFJTik6Ci0JCWlmIChib29sX3ZhbCAmJiAhYnVzLT5zZF9yeGNoYWluKQotCQkJYmNtZXJyb3IgPSAtRU5PVFNVUFA7Ci0JCWVsc2UKLQkJCWJ1cy0+dXNlX3J4Y2hhaW4gPSBib29sX3ZhbDsKLQkJYnJlYWs7Ci0JY2FzZSBJT1ZfR1ZBTChJT1ZfQUxJR05DVEwpOgotCQlpbnRfdmFsID0gKHMzMikgYnJjbWZfYWxpZ25jdGw7Ci0JCW1lbWNweShhcmcsICZpbnRfdmFsLCB2YWxfc2l6ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJT1ZfU1ZBTChJT1ZfQUxJR05DVEwpOgotCQlicmNtZl9hbGlnbmN0bCA9IGJvb2xfdmFsOwotCQlicmVhazsKLQotCWNhc2UgSU9WX0dWQUwoSU9WX1NEQUxJR04pOgotCQlpbnRfdmFsID0gQlJDTUZfU0RBTElHTjsKLQkJbWVtY3B5KGFyZywgJmludF92YWwsIHZhbF9zaXplKTsKLQkJYnJlYWs7Ci0KLSNpZmRlZiBCQ01EQkcKLQljYXNlIElPVl9HVkFMKElPVl9WQVJTKToKLQkJaWYgKGJ1cy0+dmFyc3ogPCAodWludCkgbGVuKQotCQkJbWVtY3B5KGFyZywgYnVzLT52YXJzLCBidXMtPnZhcnN6KTsKLQkJZWxzZQotCQkJYmNtZXJyb3IgPSAtRU9WRVJGTE9XOwotCQlicmVhazsKLSNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KLQotI2lmZGVmIEJDTURCRwotCWNhc2UgSU9WX0dWQUwoSU9WX0RDT05TT0xFX1BPTEwpOgotCQlpbnRfdmFsID0gKHMzMikgYnJjbWZfY29uc29sZV9tczsKLQkJbWVtY3B5KGFyZywgJmludF92YWwsIHZhbF9zaXplKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElPVl9TVkFMKElPVl9EQ09OU09MRV9QT0xMKToKLQkJYnJjbWZfY29uc29sZV9tcyA9ICh1aW50KSBpbnRfdmFsOwotCQlicmVhazsKLQotCWNhc2UgSU9WX1NWQUwoSU9WX0NPTlMpOgotCQlpZiAobGVuID4gMCkKLQkJCWJjbWVycm9yID0gYnJjbWZfc2RicmNtX2J1c19jb25zb2xlX2luKGJ1cy0+ZHJ2ciwKLQkJCQkJCQkgICAgICAgYXJnLCBsZW4gLSAxKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElPVl9HVkFMKElPVl9TRFJFRyk6Ci0JCXsKLQkJCXN0cnVjdCBicmNtZl9zZHJlZyAqc2RfcHRyOwotCQkJdTMyIGFkZHIsIHNpemU7Ci0KLQkJCXNkX3B0ciA9IChzdHJ1Y3QgYnJjbWZfc2RyZWcgKikgcGFyYW1zOwotCi0JCQlhZGRyID0gYnVzLT5jaS0+YnVzY29yZWJhc2UgKyBzZF9wdHItPm9mZnNldDsKLQkJCXNpemUgPSBzZF9wdHItPmZ1bmM7Ci0JCQlpbnRfdmFsID0gKHMzMikgYnJjbWZfc2RjYXJkX3JlZ19yZWFkKGJ1cy0+Y2FyZCwgYWRkciwKLQkJCQkJCQkgICAgICBzaXplKTsKLQkJCWlmIChicmNtZl9zZGNhcmRfcmVnZmFpbChidXMtPmNhcmQpKQotCQkJCWJjbWVycm9yID0gLUVJTzsKLQkJCW1lbWNweShhcmcsICZpbnRfdmFsLCBzaXplb2YoczMyKSk7Ci0JCQlicmVhazsKLQkJfQotCi0JY2FzZSBJT1ZfU1ZBTChJT1ZfU0RSRUcpOgotCQl7Ci0JCQlzdHJ1Y3QgYnJjbWZfc2RyZWcgKnNkX3B0cjsKLQkJCXUzMiBhZGRyLCBzaXplOwotCi0JCQlzZF9wdHIgPSAoc3RydWN0IGJyY21mX3NkcmVnICopIHBhcmFtczsKLQotCQkJYWRkciA9IGJ1cy0+Y2ktPmJ1c2NvcmViYXNlICsgc2RfcHRyLT5vZmZzZXQ7Ci0JCQlzaXplID0gc2RfcHRyLT5mdW5jOwotCQkJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShidXMtPmNhcmQsIGFkZHIsIHNpemUsCi0JCQkJCSAgICAgICBzZF9wdHItPnZhbHVlKTsKLQkJCWlmIChicmNtZl9zZGNhcmRfcmVnZmFpbChidXMtPmNhcmQpKQotCQkJCWJjbWVycm9yID0gLUVJTzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogU2FtZSBhcyBhYm92ZSwgYnV0IG9mZnNldCBpcyBub3QgYmFja3BsYW5lCi0JCSAobm90IFNESU8gY29yZSkgKi8KLQljYXNlIElPVl9HVkFMKElPVl9TQlJFRyk6Ci0JCXsKLQkJCXN0cnVjdCBicmNtZl9zZHJlZyBzZHJlZzsKLQkJCXUzMiBhZGRyLCBzaXplOwotCi0JCQltZW1jcHkoJnNkcmVnLCBwYXJhbXMsIHNpemVvZihzZHJlZykpOwotCi0JCQlhZGRyID0gU0lfRU5VTV9CQVNFICsgc2RyZWcub2Zmc2V0OwotCQkJc2l6ZSA9IHNkcmVnLmZ1bmM7Ci0JCQlpbnRfdmFsID0gKHMzMikgYnJjbWZfc2RjYXJkX3JlZ19yZWFkKGJ1cy0+Y2FyZCwgYWRkciwKLQkJCQkJCQkgICAgICBzaXplKTsKLQkJCWlmIChicmNtZl9zZGNhcmRfcmVnZmFpbChidXMtPmNhcmQpKQotCQkJCWJjbWVycm9yID0gLUVJTzsKLQkJCW1lbWNweShhcmcsICZpbnRfdmFsLCBzaXplb2YoczMyKSk7Ci0JCQlicmVhazsKLQkJfQotCi0JY2FzZSBJT1ZfU1ZBTChJT1ZfU0JSRUcpOgotCQl7Ci0JCQlzdHJ1Y3QgYnJjbWZfc2RyZWcgc2RyZWc7Ci0JCQl1MzIgYWRkciwgc2l6ZTsKLQotCQkJbWVtY3B5KCZzZHJlZywgcGFyYW1zLCBzaXplb2Yoc2RyZWcpKTsKLQotCQkJYWRkciA9IFNJX0VOVU1fQkFTRSArIHNkcmVnLm9mZnNldDsKLQkJCXNpemUgPSBzZHJlZy5mdW5jOwotCQkJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShidXMtPmNhcmQsIGFkZHIsIHNpemUsCi0JCQkJCSAgICAgICBzZHJlZy52YWx1ZSk7Ci0JCQlpZiAoYnJjbWZfc2RjYXJkX3JlZ2ZhaWwoYnVzLT5jYXJkKSkKLQkJCQliY21lcnJvciA9IC1FSU87Ci0JCQlicmVhazsKLQkJfQotCi0JY2FzZSBJT1ZfR1ZBTChJT1ZfU0RDSVMpOgotCQl7Ci0JCQkqKGNoYXIgKilhcmcgPSAwOwotCi0JCQlzdHJjYXQoYXJnLCAiXG5GdW5jIDBcbiIpOwotCQkJYnJjbWZfc2RjYXJkX2Npc19yZWFkKGJ1cy0+Y2FyZCwgMHgxMCwKLQkJCQkJKHU4ICopIGFyZyArIHN0cmxlbihhcmcpLAotCQkJCQlTQlNESU9fQ0lTX1NJWkVfTElNSVQpOwotCQkJc3RyY2F0KGFyZywgIlxuRnVuYyAxXG4iKTsKLQkJCWJyY21mX3NkY2FyZF9jaXNfcmVhZChidXMtPmNhcmQsIDB4MTEsCi0JCQkJCSh1OCAqKSBhcmcgKyBzdHJsZW4oYXJnKSwKLQkJCQkJU0JTRElPX0NJU19TSVpFX0xJTUlUKTsKLQkJCXN0cmNhdChhcmcsICJcbkZ1bmMgMlxuIik7Ci0JCQlicmNtZl9zZGNhcmRfY2lzX3JlYWQoYnVzLT5jYXJkLCAweDEyLAotCQkJCQkodTggKikgYXJnICsgc3RybGVuKGFyZyksCi0JCQkJCVNCU0RJT19DSVNfU0laRV9MSU1JVCk7Ci0JCQlicmVhazsKLQkJfQotCi0JY2FzZSBJT1ZfR1ZBTChJT1ZfRk9SQ0VFVkVOKToKLQkJaW50X3ZhbCA9IChzMzIpIGZvcmNlYWxpZ247Ci0JCW1lbWNweShhcmcsICZpbnRfdmFsLCB2YWxfc2l6ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJT1ZfU1ZBTChJT1ZfRk9SQ0VFVkVOKToKLQkJZm9yY2VhbGlnbiA9IGJvb2xfdmFsOwotCQlicmVhazsKLQotCWNhc2UgSU9WX0dWQUwoSU9WX1RYQk9VTkQpOgotCQlpbnRfdmFsID0gKHMzMikgYnJjbWZfdHhib3VuZDsKLQkJbWVtY3B5KGFyZywgJmludF92YWwsIHZhbF9zaXplKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElPVl9TVkFMKElPVl9UWEJPVU5EKToKLQkJYnJjbWZfdHhib3VuZCA9ICh1aW50KSBpbnRfdmFsOwotCQlicmVhazsKLQotCWNhc2UgSU9WX0dWQUwoSU9WX1JYQk9VTkQpOgotCQlpbnRfdmFsID0gKHMzMikgYnJjbWZfcnhib3VuZDsKLQkJbWVtY3B5KGFyZywgJmludF92YWwsIHZhbF9zaXplKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElPVl9TVkFMKElPVl9SWEJPVU5EKToKLQkJYnJjbWZfcnhib3VuZCA9ICh1aW50KSBpbnRfdmFsOwotCQlicmVhazsKLQotCWNhc2UgSU9WX0dWQUwoSU9WX1RYTUlOTUFYKToKLQkJaW50X3ZhbCA9IChzMzIpIGJyY21mX3R4bWlubWF4OwotCQltZW1jcHkoYXJnLCAmaW50X3ZhbCwgdmFsX3NpemUpOwotCQlicmVhazsKLQotCWNhc2UgSU9WX1NWQUwoSU9WX1RYTUlOTUFYKToKLQkJYnJjbWZfdHhtaW5tYXggPSAodWludCkgaW50X3ZhbDsKLQkJYnJlYWs7Ci0jZW5kaWYJCQkJLyogQkNNREJHICovCi0KLSNpZmRlZiBTRFRFU1QKLQljYXNlIElPVl9HVkFMKElPVl9FWFRMT09QKToKLQkJaW50X3ZhbCA9IChzMzIpIGJ1cy0+ZXh0X2xvb3A7Ci0JCW1lbWNweShhcmcsICZpbnRfdmFsLCB2YWxfc2l6ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJT1ZfU1ZBTChJT1ZfRVhUTE9PUCk6Ci0JCWJ1cy0+ZXh0X2xvb3AgPSBib29sX3ZhbDsKLQkJYnJlYWs7Ci0KLQljYXNlIElPVl9HVkFMKElPVl9QS1RHRU4pOgotCQliY21lcnJvciA9IGJyY21mX3NkYnJjbV9wa3RnZW5fZ2V0KGJ1cywgYXJnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElPVl9TVkFMKElPVl9QS1RHRU4pOgotCQliY21lcnJvciA9IGJyY21mX3NkYnJjbV9wa3RnZW5fc2V0KGJ1cywgYXJnKTsKLQkJYnJlYWs7Ci0jZW5kaWYJCQkJLyogU0RURVNUICovCi0KLQljYXNlIElPVl9TVkFMKElPVl9ERVZSRVNFVCk6Ci0JCUJSQ01GX1RSQUNFKCgiJXM6IENhbGxlZCBzZXQgSU9WX0RFVlJFU0VUPSVkIGRvbmdsZV9yZXNldD0lZCAiCi0JCQkgICAgICJidXNzdGF0ZT0lZFxuIiwKLQkJCSAgICAgX19mdW5jX18sIGJvb2xfdmFsLCBidXMtPmRydnItPmRvbmdsZV9yZXNldCwKLQkJCSAgICAgYnVzLT5kcnZyLT5idXNzdGF0ZSkpOwotCi0JCWJyY21mX2J1c19kZXZyZXNldChidXMtPmRydnIsICh1OCkgYm9vbF92YWwpOwotCi0JCWJyZWFrOwotCi0JY2FzZSBJT1ZfR1ZBTChJT1ZfREVWUkVTRVQpOgotCQlCUkNNRl9UUkFDRSgoIiVzOiBDYWxsZWQgZ2V0IElPVl9ERVZSRVNFVFxuIiwgX19mdW5jX18pKTsKLQotCQkvKiBHZXQgaXRzIHN0YXR1cyAqLwotCQlpbnRfdmFsID0gKGJvb2wpIGJ1cy0+ZHJ2ci0+ZG9uZ2xlX3Jlc2V0OwotCQltZW1jcHkoYXJnLCAmaW50X3ZhbCwgdmFsX3NpemUpOwotCi0JCWJyZWFrOwotCi0JY2FzZSBJT1ZfR1ZBTChJT1ZfV0RUSUNLKToKLQkJaW50X3ZhbCA9IChzMzIpIGJyY21mX3dhdGNoZG9nX21zOwotCQltZW1jcHkoYXJnLCAmaW50X3ZhbCwgdmFsX3NpemUpOwotCQlicmVhazsKLQotCWNhc2UgSU9WX1NWQUwoSU9WX1dEVElDSyk6Ci0JCWlmICghYnVzLT5kcnZyLT51cCkgewotCQkJYmNtZXJyb3IgPSAtRU5PTElOSzsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyY21mX3NkYnJjbV93ZF90aW1lcihidXMsICh1aW50KSBpbnRfdmFsKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQliY21lcnJvciA9IC1FTk9UU1VQUDsKLQkJYnJlYWs7Ci0JfQotCi1leGl0OgotCWlmICgoYnVzLT5pZGxldGltZSA9PSBCUkNNRl9JRExFX0lNTUVESUFURSkgJiYgIWJ1cy0+ZHBjX3NjaGVkKSB7Ci0JCWJ1cy0+YWN0aXZpdHkgPSBmYWxzZTsKLQkJYnJjbWZfc2RicmNtX2Nsa2N0bChidXMsIENMS19OT05FLCB0cnVlKTsKLQl9Ci0KLQlicmNtZl9zZGJyY21fc2R1bmxvY2soYnVzKTsKLQotCWlmIChhY3Rpb25pZCA9PSBJT1ZfU1ZBTChJT1ZfREVWUkVTRVQpICYmIGJvb2xfdmFsID09IGZhbHNlKQotCQlicmNtZl9jX3ByZWluaXRfaW9jdGxzKGJ1cy0+ZHJ2cik7Ci0KLQlyZXR1cm4gYmNtZXJyb3I7Ci19Ci0KLXN0YXRpYyBpbnQgYnJjbWZfc2RicmNtX3dyaXRlX3ZhcnMoc3RydWN0IGJyY21mX2J1cyAqYnVzKQotewotCWludCBiY21lcnJvciA9IDA7Ci0JdTMyIHZhcnNpemU7Ci0JdTMyIHZhcmFkZHI7Ci0JdTggKnZidWZmZXI7Ci0JdTMyIHZhcnNpemV3OwotI2lmZGVmIEJDTURCRwotCWNoYXIgKm52cmFtX3VsYXJyYXk7Ci0jZW5kaWYJCQkJLyogQkNNREJHICovCi0KLQkvKiBFdmVuIGlmIHRoZXJlIGFyZSBubyB2YXJzIGFyZSB0byBiZSB3cml0dGVuLCB3ZSBzdGlsbAotCQkgbmVlZCB0byBzZXQgdGhlIHJhbXNpemUuICovCi0JdmFyc2l6ZSA9IGJ1cy0+dmFyc3ogPyByb3VuZHVwKGJ1cy0+dmFyc3osIDQpIDogMDsKLQl2YXJhZGRyID0gKGJ1cy0+cmFtc2l6ZSAtIDQpIC0gdmFyc2l6ZTsKLQotCWlmIChidXMtPnZhcnMpIHsKLQkJdmJ1ZmZlciA9IGt6YWxsb2ModmFyc2l6ZSwgR0ZQX0FUT01JQyk7Ci0JCWlmICghdmJ1ZmZlcikKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCW1lbWNweSh2YnVmZmVyLCBidXMtPnZhcnMsIGJ1cy0+dmFyc3opOwotCi0JCS8qIFdyaXRlIHRoZSB2YXJzIGxpc3QgKi8KLQkJYmNtZXJyb3IgPQotCQkgICAgYnJjbWZfc2RicmNtX21lbWJ5dGVzKGJ1cywgdHJ1ZSwgdmFyYWRkciwgdmJ1ZmZlciwgdmFyc2l6ZSk7Ci0jaWZkZWYgQkNNREJHCi0JCS8qIFZlcmlmeSBOVlJBTSBieXRlcyAqLwotCQlCUkNNRl9JTkZPKCgiQ29tcGFyZSBOVlJBTSBkbCAmIHVsOyB2YXJzaXplPSVkXG4iLCB2YXJzaXplKSk7Ci0JCW52cmFtX3VsYXJyYXkgPSBrbWFsbG9jKHZhcnNpemUsIEdGUF9BVE9NSUMpOwotCQlpZiAoIW52cmFtX3VsYXJyYXkpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQkvKiBVcGxvYWQgaW1hZ2UgdG8gdmVyaWZ5IGRvd25sb2FkZWQgY29udGVudHMuICovCi0JCW1lbXNldChudnJhbV91bGFycmF5LCAweGFhLCB2YXJzaXplKTsKLQotCQkvKiBSZWFkIHRoZSB2YXJzIGxpc3QgdG8gdGVtcCBidWZmZXIgZm9yIGNvbXBhcmlzb24gKi8KLQkJYmNtZXJyb3IgPQotCQkgICAgYnJjbWZfc2RicmNtX21lbWJ5dGVzKGJ1cywgZmFsc2UsIHZhcmFkZHIsIG52cmFtX3VsYXJyYXksCi0JCQkJICAgICB2YXJzaXplKTsKLQkJaWYgKGJjbWVycm9yKSB7Ci0JCQlCUkNNRl9FUlJPUigoIiVzOiBlcnJvciAlZCBvbiByZWFkaW5nICVkIG52cmFtIGJ5dGVzIgotCQkJCSAgICAgIiBhdCAweCUwOHhcbiIsIF9fZnVuY19fLCBiY21lcnJvciwKLQkJCQkgICAgIHZhcnNpemUsIHZhcmFkZHIpKTsKLQkJfQotCQkvKiBDb21wYXJlIHRoZSBvcmcgTlZSQU0gd2l0aCB0aGUgb25lIHJlYWQgZnJvbSBSQU0gKi8KLQkJaWYgKG1lbWNtcCh2YnVmZmVyLCBudnJhbV91bGFycmF5LCB2YXJzaXplKSkgewotCQkJQlJDTUZfRVJST1IoKCIlczogRG93bmxvYWRlZCBOVlJBTSBpbWFnZSBpcyAiCi0JCQkJICAgICAiY29ycnVwdGVkLlxuIiwgX19mdW5jX18pKTsKLQkJfSBlbHNlCi0JCQlCUkNNRl9FUlJPUigoIiVzOiBEb3dubG9hZC9VcGxvYWQvQ29tcGFyZSBvZiIKLQkJCQkgICAgICIgTlZSQU0gb2suXG4iLCBfX2Z1bmNfXykpOwotCi0JCWtmcmVlKG52cmFtX3VsYXJyYXkpOwotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwotCi0JCWtmcmVlKHZidWZmZXIpOwotCX0KLQotCS8qIGFkanVzdCB0byB0aGUgdXNlciBzcGVjaWZpZWQgUkFNICovCi0JQlJDTUZfSU5GTygoIlBoeXNpY2FsIG1lbW9yeSBzaXplOiAlZCwgdXNhYmxlIG1lbW9yeSBzaXplOiAlZFxuIiwKLQkJICAgIGJ1cy0+b3JpZ19yYW1zaXplLCBidXMtPnJhbXNpemUpKTsKLQlCUkNNRl9JTkZPKCgiVmFycyBhcmUgYXQgJWQsIG9yaWcgdmFyc2l6ZSBpcyAlZFxuIiwgdmFyYWRkciwgdmFyc2l6ZSkpOwotCXZhcnNpemUgPSAoKGJ1cy0+b3JpZ19yYW1zaXplIC0gNCkgLSB2YXJhZGRyKTsKLQotCS8qCi0JICogRGV0ZXJtaW5lIHRoZSBsZW5ndGggdG9rZW46Ci0JICogVmFyc2l6ZSwgY29udmVydGVkIHRvIHdvcmRzLCBpbiBsb3dlciAxNi1iaXRzLCBjaGVja3N1bQotCSAqIGluIHVwcGVyIDE2LWJpdHMuCi0JICovCi0JaWYgKGJjbWVycm9yKSB7Ci0JCXZhcnNpemV3ID0gMDsKLQl9IGVsc2UgewotCQl2YXJzaXpldyA9IHZhcnNpemUgLyA0OwotCQl2YXJzaXpldyA9ICh+dmFyc2l6ZXcgPDwgMTYpIHwgKHZhcnNpemV3ICYgMHgwMDAwRkZGRik7Ci0JCXZhcnNpemV3ID0gY3B1X3RvX2xlMzIodmFyc2l6ZXcpOwotCX0KLQotCUJSQ01GX0lORk8oKCJOZXcgdmFyc2l6ZSBpcyAlZCwgbGVuZ3RoIHRva2VuPTB4JTA4eFxuIiwgdmFyc2l6ZSwKLQkJICAgIHZhcnNpemV3KSk7Ci0KLQkvKiBXcml0ZSB0aGUgbGVuZ3RoIHRva2VuIHRvIHRoZSBsYXN0IHdvcmQgKi8KLQliY21lcnJvciA9IGJyY21mX3NkYnJjbV9tZW1ieXRlcyhidXMsIHRydWUsIChidXMtPm9yaWdfcmFtc2l6ZSAtIDQpLAotCQkJCSAgICAodTggKikmdmFyc2l6ZXcsIDQpOwotCi0JcmV0dXJuIGJjbWVycm9yOwotfQotCi1zdGF0aWMgaW50IGJyY21mX3NkYnJjbV9kb3dubG9hZF9zdGF0ZShzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIGJvb2wgZW50ZXIpCi17Ci0JdWludCByZXRyaWVzOwotCXUzMiByZWdkYXRhOwotCWludCBiY21lcnJvciA9IDA7Ci0KLQkvKiBUbyBlbnRlciBkb3dubG9hZCBzdGF0ZSwgZGlzYWJsZSBBUk0gYW5kIHJlc2V0IFNPQ1JBTS4KLQkgKiBUbyBleGl0IGRvd25sb2FkIHN0YXRlLCBzaW1wbHkgcmVzZXQgQVJNIChkZWZhdWx0IGlzIFJBTSBib290KS4KLQkgKi8KLQlpZiAoZW50ZXIpIHsKLQkJYnVzLT5hbHBfb25seSA9IHRydWU7Ci0KLQkJYnJjbWZfc2RicmNtX2NoaXBfZGlzYWJsZWNvcmUoYnVzLT5jYXJkLCBidXMtPmNpLT5hcm1jb3JlYmFzZSk7Ci0KLQkJYnJjbWZfc2RicmNtX2NoaXBfcmVzZXRjb3JlKGJ1cy0+Y2FyZCwgYnVzLT5jaS0+cmFtY29yZWJhc2UpOwotCi0JCS8qIENsZWFyIHRoZSB0b3AgYml0IG9mIG1lbW9yeSAqLwotCQlpZiAoYnVzLT5yYW1zaXplKSB7Ci0JCQl1MzIgemVyb3MgPSAwOwotCQkJYnJjbWZfc2RicmNtX21lbWJ5dGVzKGJ1cywgdHJ1ZSwgYnVzLT5yYW1zaXplIC0gNCwKLQkJCQkJICh1OCAqKSZ6ZXJvcywgNCk7Ci0JCX0KLQl9IGVsc2UgewotCQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKGJ1cy0+Y2FyZCwKLQkJCUNPUkVfU0IoYnVzLT5jaS0+cmFtY29yZWJhc2UsIHNidG1zdGF0ZWxvdyksIDQpOwotCQlyZWdkYXRhICY9IChTQlRNTF9SRVNFVCB8IFNCVE1MX1JFSl9NQVNLIHwKLQkJCShTSUNGX0NMT0NLX0VOIDw8IFNCVE1MX1NJQ0ZfU0hJRlQpKTsKLQkJaWYgKChTSUNGX0NMT0NLX0VOIDw8IFNCVE1MX1NJQ0ZfU0hJRlQpICE9IHJlZ2RhdGEpIHsKLQkJCUJSQ01GX0VSUk9SKCgiJXM6IFNPQ1JBTSBjb3JlIGlzIGRvd24gYWZ0ZXIgcmVzZXQ/XG4iLAotCQkJCSAgICAgX19mdW5jX18pKTsKLQkJCWJjbWVycm9yID0gLUVCQURFOwotCQkJZ290byBmYWlsOwotCQl9Ci0KLQkJYmNtZXJyb3IgPSBicmNtZl9zZGJyY21fd3JpdGVfdmFycyhidXMpOwotCQlpZiAoYmNtZXJyb3IpIHsKLQkJCUJSQ01GX0VSUk9SKCgiJXM6IG5vIHZhcnMgd3JpdHRlbiB0byBSQU1cbiIsIF9fZnVuY19fKSk7Ci0JCQliY21lcnJvciA9IDA7Ci0JCX0KLQotCQl3X3NkcmVnMzIoYnVzLCAweEZGRkZGRkZGLAotCQkJICBvZmZzZXRvZihzdHJ1Y3Qgc2RwY21kX3JlZ3MsIGludHN0YXR1cyksICZyZXRyaWVzKTsKLQotCQlicmNtZl9zZGJyY21fY2hpcF9yZXNldGNvcmUoYnVzLT5jYXJkLCBidXMtPmNpLT5hcm1jb3JlYmFzZSk7Ci0KLQkJLyogQWxsb3cgSFQgQ2xvY2sgbm93IHRoYXQgdGhlIEFSTSBpcyBydW5uaW5nLiAqLwotCQlidXMtPmFscF9vbmx5ID0gZmFsc2U7Ci0KLQkJYnVzLT5kcnZyLT5idXNzdGF0ZSA9IEJSQ01GX0JVU19MT0FEOwotCX0KLWZhaWw6Ci0JcmV0dXJuIGJjbWVycm9yOwotfQotCi1pbnQKLWJyY21mX3NkYnJjbV9idXNfaW92YXJfb3Aoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgY29uc3QgY2hhciAqbmFtZSwKLQkJCSAgdm9pZCAqcGFyYW1zLCBpbnQgcGxlbiwgdm9pZCAqYXJnLCBpbnQgbGVuLCBib29sIHNldCkKLXsKLQlzdHJ1Y3QgYnJjbWZfYnVzICpidXMgPSBkcnZyLT5idXM7Ci0JY29uc3Qgc3RydWN0IGJyY211X2lvdmFyICp2aSA9IE5VTEw7Ci0JaW50IGJjbWVycm9yID0gMDsKLQlpbnQgdmFsX3NpemU7Ci0JdTMyIGFjdGlvbmlkOwotCi0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQlpZiAobmFtZSA9PSBOVUxMIHx8IGxlbiA8PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIFNldCBkb2VzIG5vdCB0YWtlIHF1YWxpZmllcnMgKi8KLQlpZiAoc2V0ICYmIChwYXJhbXMgfHwgcGxlbikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogR2V0IG11c3QgaGF2ZSByZXR1cm4gc3BhY2U7Ki8KLQlpZiAoIXNldCAmJiAhKGFyZyAmJiBsZW4pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIExvb2sgdXAgdmFyIGxvY2FsbHk7IGlmIG5vdCBmb3VuZCBwYXNzIHRvIGhvc3QgZHJpdmVyICovCi0JdmkgPSBicmNtdV9pb3Zhcl9sb29rdXAoYnJjbWZfc2Rpb19pb3ZhcnMsIG5hbWUpOwotCWlmICh2aSA9PSBOVUxMKSB7Ci0JCWJyY21mX3NkYnJjbV9zZGxvY2soYnVzKTsKLQotCQlCVVNfV0FLRShidXMpOwotCi0JCS8qIFR1cm4gb24gY2xvY2sgaW4gY2FzZSBTRCBjb21tYW5kIG5lZWRzIGJhY2twbGFuZSAqLwotCQlicmNtZl9zZGJyY21fY2xrY3RsKGJ1cywgQ0xLX0FWQUlMLCBmYWxzZSk7Ci0KLQkJYmNtZXJyb3IgPSBicmNtZl9zZGNhcmRfaW92YXJfb3AoYnVzLT5jYXJkLCBuYW1lLCBwYXJhbXMsIHBsZW4sCi0JCQkJCQkgYXJnLCBsZW4sIHNldCk7Ci0KLQkJLyogU2ltaWxhciBjaGVjayBmb3IgYmxvY2tzaXplIGNoYW5nZSAqLwotCQlpZiAoc2V0ICYmIHN0cmNtcChuYW1lLCAic2RfYmxvY2tzaXplIikgPT0gMCkgewotCQkJczMyIGZudW0gPSAyOwotCQkJaWYgKGJyY21mX3NkY2FyZF9pb3Zhcl9vcAotCQkJICAgIChidXMtPmNhcmQsICJzZF9ibG9ja3NpemUiLCAmZm51bSwgc2l6ZW9mKHMzMiksCi0JCQkgICAgICZidXMtPmJsb2Nrc2l6ZSwgc2l6ZW9mKHMzMiksCi0JCQkgICAgIGZhbHNlKSAhPSAwKSB7Ci0JCQkJYnVzLT5ibG9ja3NpemUgPSAwOwotCQkJCUJSQ01GX0VSUk9SKCgiJXM6IGZhaWwgb24gJXMgZ2V0XG4iLCBfX2Z1bmNfXywKLQkJCQkJICAgICAic2RfYmxvY2tzaXplIikpOwotCQkJfSBlbHNlIHsKLQkJCQlCUkNNRl9JTkZPKCgiJXM6IG5vdGVkIHNkX2Jsb2Nrc2l6ZSB1cGRhdGUsIgotCQkJCQkgICAgIiB2YWx1ZSBub3cgJWRcbiIsIF9fZnVuY19fLAotCQkJCQkgICAgYnVzLT5ibG9ja3NpemUpKTsKLQkJCX0KLQkJfQotCQlidXMtPnJvdW5kdXAgPSBtaW4obWF4X3JvdW5kdXAsIGJ1cy0+YmxvY2tzaXplKTsKLQotCQlpZiAoYnVzLT5pZGxldGltZSA9PSBCUkNNRl9JRExFX0lNTUVESUFURSAmJgotCQkgICAgIWJ1cy0+ZHBjX3NjaGVkKSB7Ci0JCQlidXMtPmFjdGl2aXR5ID0gZmFsc2U7Ci0JCQlicmNtZl9zZGJyY21fY2xrY3RsKGJ1cywgQ0xLX05PTkUsIHRydWUpOwotCQl9Ci0KLQkJYnJjbWZfc2RicmNtX3NkdW5sb2NrKGJ1cyk7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQlCUkNNRl9DVEwoKCIlczogJXMgJXMsIGxlbiAlZCBwbGVuICVkXG4iLCBfX2Z1bmNfXywKLQkJICAgbmFtZSwgKHNldCA/ICJzZXQiIDogImdldCIpLCBsZW4sIHBsZW4pKTsKLQotCS8qIHNldCB1cCAncGFyYW1zJyBwb2ludGVyIGluIGNhc2UgdGhpcyBpcyBhIHNldCBjb21tYW5kIHNvIHRoYXQKLQkgKiB0aGUgY29udmVuaWVuY2UgaW50IGFuZCBib29sIGNvZGUgY2FuIGJlIGNvbW1vbiB0byBzZXQgYW5kIGdldAotCSAqLwotCWlmIChwYXJhbXMgPT0gTlVMTCkgewotCQlwYXJhbXMgPSBhcmc7Ci0JCXBsZW4gPSBsZW47Ci0JfQotCi0JaWYgKHZpLT50eXBlID09IElPVlRfVk9JRCkKLQkJdmFsX3NpemUgPSAwOwotCWVsc2UgaWYgKHZpLT50eXBlID09IElPVlRfQlVGRkVSKQotCQl2YWxfc2l6ZSA9IGxlbjsKLQllbHNlCi0JCS8qIGFsbCBvdGhlciB0eXBlcyBhcmUgaW50ZWdlciBzaXplZCAqLwotCQl2YWxfc2l6ZSA9IHNpemVvZihpbnQpOwotCi0JYWN0aW9uaWQgPSBzZXQgPyBJT1ZfU1ZBTCh2aS0+dmFyaWQpIDogSU9WX0dWQUwodmktPnZhcmlkKTsKLQliY21lcnJvciA9IGJyY21mX3NkYnJjbV9kb2lvdmFyKGJ1cywgdmksIGFjdGlvbmlkLCBuYW1lLCBwYXJhbXMsIHBsZW4sCi0JCQkJCWFyZywgbGVuLCB2YWxfc2l6ZSk7Ci0KLWV4aXQ6Ci0JcmV0dXJuIGJjbWVycm9yOwotfQotCi12b2lkIGJyY21mX3NkYnJjbV9idXNfc3RvcChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIGJvb2wgZW5mb3JjZV9tdXRleCkKLXsKLQl1MzIgbG9jYWxfaG9zdGludG1hc2s7Ci0JdTggc2F2ZWNsazsKLQl1aW50IHJldHJpZXM7Ci0JaW50IGVycjsKLQotCUJSQ01GX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwotCi0JaWYgKGVuZm9yY2VfbXV0ZXgpCi0JCWJyY21mX3NkYnJjbV9zZGxvY2soYnVzKTsKLQotCUJVU19XQUtFKGJ1cyk7Ci0KLQkvKiBFbmFibGUgY2xvY2sgZm9yIGRldmljZSBpbnRlcnJ1cHRzICovCi0JYnJjbWZfc2RicmNtX2Nsa2N0bChidXMsIENMS19BVkFJTCwgZmFsc2UpOwotCi0JaWYgKGJ1cy0+d2F0Y2hkb2dfdHNrKSB7Ci0JCXNlbmRfc2lnKFNJR1RFUk0sIGJ1cy0+d2F0Y2hkb2dfdHNrLCAxKTsKLQkJa3RocmVhZF9zdG9wKGJ1cy0+d2F0Y2hkb2dfdHNrKTsKLQkJYnVzLT53YXRjaGRvZ190c2sgPSBOVUxMOwotCX0KLQotCWlmIChidXMtPmRwY190c2spIHsKLQkJc2VuZF9zaWcoU0lHVEVSTSwgYnVzLT5kcGNfdHNrLCAxKTsKLQkJa3RocmVhZF9zdG9wKGJ1cy0+ZHBjX3Rzayk7Ci0JCWJ1cy0+ZHBjX3RzayA9IE5VTEw7Ci0JfSBlbHNlCi0JCXRhc2tsZXRfa2lsbCgmYnVzLT50YXNrbGV0KTsKLQotCS8qIERpc2FibGUgYW5kIGNsZWFyIGludGVycnVwdHMgYXQgdGhlIGNoaXAgbGV2ZWwgYWxzbyAqLwotCXdfc2RyZWczMihidXMsIDAsIG9mZnNldG9mKHN0cnVjdCBzZHBjbWRfcmVncywgaG9zdGludG1hc2spLCAmcmV0cmllcyk7Ci0JbG9jYWxfaG9zdGludG1hc2sgPSBidXMtPmhvc3RpbnRtYXNrOwotCWJ1cy0+aG9zdGludG1hc2sgPSAwOwotCi0JLyogQ2hhbmdlIG91ciBpZGVhIG9mIGJ1cyBzdGF0ZSAqLwotCWJ1cy0+ZHJ2ci0+YnVzc3RhdGUgPSBCUkNNRl9CVVNfRE9XTjsKLQotCS8qIEZvcmNlIGNsb2NrcyBvbiBiYWNrcGxhbmUgdG8gYmUgc3VyZSBGMiBpbnRlcnJ1cHQgcHJvcGFnYXRlcyAqLwotCXNhdmVjbGsgPSBicmNtZl9zZGNhcmRfY2ZnX3JlYWQoYnVzLT5jYXJkLCBTRElPX0ZVTkNfMSwKLQkJCQkJU0JTRElPX0ZVTkMxX0NISVBDTEtDU1IsICZlcnIpOwotCWlmICghZXJyKSB7Ci0JCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoYnVzLT5jYXJkLCBTRElPX0ZVTkNfMSwKLQkJCQkgICAgICAgU0JTRElPX0ZVTkMxX0NISVBDTEtDU1IsCi0JCQkJICAgICAgIChzYXZlY2xrIHwgU0JTRElPX0ZPUkNFX0hUKSwgJmVycik7Ci0JfQotCWlmIChlcnIpIHsKLQkJQlJDTUZfRVJST1IoKCIlczogRmFpbGVkIHRvIGZvcmNlIGNsb2NrIGZvciBGMjogZXJyICVkXG4iLAotCQkJICAgICBfX2Z1bmNfXywgZXJyKSk7Ci0JfQotCi0JLyogVHVybiBvZmYgdGhlIGJ1cyAoRjIpLCBmcmVlIGFueSBwZW5kaW5nIHBhY2tldHMgKi8KLQlCUkNNRl9JTlRSKCgiJXM6IGRpc2FibGUgU0RJTyBpbnRlcnJ1cHRzXG4iLCBfX2Z1bmNfXykpOwotCWJyY21mX3NkY2FyZF9pbnRyX2Rpc2FibGUoYnVzLT5jYXJkKTsKLQlicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKGJ1cy0+Y2FyZCwgU0RJT19GVU5DXzAsIFNESU9fQ0NDUl9JT0V4LAotCQkJIFNESU9fRlVOQ19FTkFCTEVfMSwgTlVMTCk7Ci0KLQkvKiBDbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzIG5vdyB0aGF0IEYyIGlzIGRpc2FibGVkICovCi0Jd19zZHJlZzMyKGJ1cywgbG9jYWxfaG9zdGludG1hc2ssCi0JCSAgb2Zmc2V0b2Yoc3RydWN0IHNkcGNtZF9yZWdzLCBpbnRzdGF0dXMpLCAmcmV0cmllcyk7Ci0KLQkvKiBUdXJuIG9mZiB0aGUgYmFja3BsYW5lIGNsb2NrIChvbmx5KSAqLwotCWJyY21mX3NkYnJjbV9jbGtjdGwoYnVzLCBDTEtfU0RPTkxZLCBmYWxzZSk7Ci0KLQkvKiBDbGVhciB0aGUgZGF0YSBwYWNrZXQgcXVldWVzICovCi0JYnJjbXVfcGt0cV9mbHVzaCgmYnVzLT50eHEsIHRydWUsIE5VTEwsIE5VTEwpOwotCi0JLyogQ2xlYXIgYW55IGhlbGQgZ2xvbW1pbmcgc3R1ZmYgKi8KLQlpZiAoYnVzLT5nbG9tZCkKLQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihidXMtPmdsb21kKTsKLQotCWlmIChidXMtPmdsb20pCi0JCWJyY211X3BrdF9idWZfZnJlZV9za2IoYnVzLT5nbG9tKTsKLQotCWJ1cy0+Z2xvbSA9IGJ1cy0+Z2xvbWQgPSBOVUxMOwotCi0JLyogQ2xlYXIgcnggY29udHJvbCBhbmQgd2FrZSBhbnkgd2FpdGVycyAqLwotCWJ1cy0+cnhsZW4gPSAwOwotCWJyY21mX29zX2lvY3RsX3Jlc3Bfd2FrZShidXMtPmRydnIpOwotCi0JLyogUmVzZXQgc29tZSBGMiBzdGF0ZSBzdHVmZiAqLwotCWJ1cy0+cnhza2lwID0gZmFsc2U7Ci0JYnVzLT50eF9zZXEgPSBidXMtPnJ4X3NlcSA9IDA7Ci0KLQlpZiAoZW5mb3JjZV9tdXRleCkKLQkJYnJjbWZfc2RicmNtX3NkdW5sb2NrKGJ1cyk7Ci19Ci0KLWludCBicmNtZl9zZGJyY21fYnVzX2luaXQoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgYm9vbCBlbmZvcmNlX211dGV4KQotewotCXN0cnVjdCBicmNtZl9idXMgKmJ1cyA9IGRydnItPmJ1czsKLQlzdHJ1Y3QgYnJjbWZfdGltZW91dCB0bW87Ci0JdWludCByZXRyaWVzID0gMDsKLQl1OCByZWFkeSwgZW5hYmxlOwotCWludCBlcnIsIHJldCA9IDA7Ci0JdTggc2F2ZWNsazsKLQotCUJSQ01GX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwotCi0JLyogdHJ5IHRvIGRvd25sb2FkIGltYWdlIGFuZCBudnJhbSB0byB0aGUgZG9uZ2xlICovCi0JaWYgKGRydnItPmJ1c3N0YXRlID09IEJSQ01GX0JVU19ET1dOKSB7Ci0JCWlmICghKGJyY21mX3NkYnJjbV9kb3dubG9hZF9maXJtd2FyZShidXMsIGJ1cy0+Y2FyZCkpKQotCQkJcmV0dXJuIC0xOwotCX0KLQotCWlmICghYnVzLT5kcnZyKQotCQlyZXR1cm4gMDsKLQotCS8qIFN0YXJ0IHRoZSB3YXRjaGRvZyB0aW1lciAqLwotCWJ1cy0+ZHJ2ci0+dGlja2NudCA9IDA7Ci0JYnJjbWZfc2RicmNtX3dkX3RpbWVyKGJ1cywgYnJjbWZfd2F0Y2hkb2dfbXMpOwotCi0JaWYgKGVuZm9yY2VfbXV0ZXgpCi0JCWJyY21mX3NkYnJjbV9zZGxvY2soYnVzKTsKLQotCS8qIE1ha2Ugc3VyZSBiYWNrcGxhbmUgY2xvY2sgaXMgb24sIG5lZWRlZCB0byBnZW5lcmF0ZSBGMiBpbnRlcnJ1cHQgKi8KLQlicmNtZl9zZGJyY21fY2xrY3RsKGJ1cywgQ0xLX0FWQUlMLCBmYWxzZSk7Ci0JaWYgKGJ1cy0+Y2xrc3RhdGUgIT0gQ0xLX0FWQUlMKQotCQlnb3RvIGV4aXQ7Ci0KLQkvKiBGb3JjZSBjbG9ja3Mgb24gYmFja3BsYW5lIHRvIGJlIHN1cmUgRjIgaW50ZXJydXB0IHByb3BhZ2F0ZXMgKi8KLQlzYXZlY2xrID0KLQkgICAgYnJjbWZfc2RjYXJkX2NmZ19yZWFkKGJ1cy0+Y2FyZCwgU0RJT19GVU5DXzEsCi0JCQkJICBTQlNESU9fRlVOQzFfQ0hJUENMS0NTUiwgJmVycik7Ci0JaWYgKCFlcnIpIHsKLQkJYnJjbWZfc2RjYXJkX2NmZ193cml0ZShidXMtPmNhcmQsIFNESU9fRlVOQ18xLAotCQkJCSAgICAgICBTQlNESU9fRlVOQzFfQ0hJUENMS0NTUiwKLQkJCQkgICAgICAgKHNhdmVjbGsgfCBTQlNESU9fRk9SQ0VfSFQpLCAmZXJyKTsKLQl9Ci0JaWYgKGVycikgewotCQlCUkNNRl9FUlJPUigoIiVzOiBGYWlsZWQgdG8gZm9yY2UgY2xvY2sgZm9yIEYyOiBlcnIgJWRcbiIsCi0JCQkgICAgIF9fZnVuY19fLCBlcnIpKTsKLQkJZ290byBleGl0OwotCX0KLQotCS8qIEVuYWJsZSBmdW5jdGlvbiAyIChmcmFtZSB0cmFuc2ZlcnMpICovCi0Jd19zZHJlZzMyKGJ1cywgU0RQQ01fUFJPVF9WRVJTSU9OIDw8IFNNQl9EQVRBX1ZFUlNJT05fU0hJRlQsCi0JCSAgb2Zmc2V0b2Yoc3RydWN0IHNkcGNtZF9yZWdzLCB0b3NibWFpbGJveGRhdGEpLCAmcmV0cmllcyk7Ci0JZW5hYmxlID0gKFNESU9fRlVOQ19FTkFCTEVfMSB8IFNESU9fRlVOQ19FTkFCTEVfMik7Ci0KLQlicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKGJ1cy0+Y2FyZCwgU0RJT19GVU5DXzAsIFNESU9fQ0NDUl9JT0V4LCBlbmFibGUsCi0JCQkgICAgICAgTlVMTCk7Ci0KLQkvKiBHaXZlIHRoZSBkb25nbGUgc29tZSB0aW1lIHRvIGRvIGl0cyB0aGluZyBhbmQgc2V0IElPUjIgKi8KLQlicmNtZl90aW1lb3V0X3N0YXJ0KCZ0bW8sIEJSQ01GX1dBSVRfRjJSRFkgKiAxMDAwKTsKLQotCXJlYWR5ID0gMDsKLQl3aGlsZSAocmVhZHkgIT0gZW5hYmxlICYmICFicmNtZl90aW1lb3V0X2V4cGlyZWQoJnRtbykpCi0JCXJlYWR5ID0gYnJjbWZfc2RjYXJkX2NmZ19yZWFkKGJ1cy0+Y2FyZCwgU0RJT19GVU5DXzAsCi0JCQkJCSAgICAgIFNESU9fQ0NDUl9JT1J4LCBOVUxMKTsKLQotCUJSQ01GX0lORk8oKCIlczogZW5hYmxlIDB4JTAyeCwgcmVhZHkgMHglMDJ4ICh3YWl0ZWQgJXV1cylcbiIsCi0JCSAgICBfX2Z1bmNfXywgZW5hYmxlLCByZWFkeSwgdG1vLmVsYXBzZWQpKTsKLQotCS8qIElmIEYyIHN1Y2Nlc3NmdWxseSBlbmFibGVkLCBzZXQgY29yZSBhbmQgZW5hYmxlIGludGVycnVwdHMgKi8KLQlpZiAocmVhZHkgPT0gZW5hYmxlKSB7Ci0JCS8qIFNldCB1cCB0aGUgaW50ZXJydXB0IG1hc2sgYW5kIGVuYWJsZSBpbnRlcnJ1cHRzICovCi0JCWJ1cy0+aG9zdGludG1hc2sgPSBIT1NUSU5UTUFTSzsKLQkJd19zZHJlZzMyKGJ1cywgYnVzLT5ob3N0aW50bWFzaywKLQkJCSAgb2Zmc2V0b2Yoc3RydWN0IHNkcGNtZF9yZWdzLCBob3N0aW50bWFzayksICZyZXRyaWVzKTsKLQotCQlicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKGJ1cy0+Y2FyZCwgU0RJT19GVU5DXzEsIFNCU0RJT19XQVRFUk1BUkssCi0JCQkJICh1OCkgd2F0ZXJtYXJrLCAmZXJyKTsKLQotCQkvKiBTZXQgYnVzIHN0YXRlIGFjY29yZGluZyB0byBlbmFibGUgcmVzdWx0ICovCi0JCWRydnItPmJ1c3N0YXRlID0gQlJDTUZfQlVTX0RBVEE7Ci0KLQkJYnVzLT5pbnRkaXMgPSBmYWxzZTsKLQkJaWYgKGJ1cy0+aW50cikgewotCQkJQlJDTUZfSU5UUigoIiVzOiBlbmFibGUgU0RJTyBkZXZpY2UgaW50ZXJydXB0c1xuIiwKLQkJCQkgICAgX19mdW5jX18pKTsKLQkJCWJyY21mX3NkY2FyZF9pbnRyX2VuYWJsZShidXMtPmNhcmQpOwotCQl9IGVsc2UgewotCQkJQlJDTUZfSU5UUigoIiVzOiBkaXNhYmxlIFNESU8gaW50ZXJydXB0c1xuIiwgX19mdW5jX18pKTsKLQkJCWJyY21mX3NkY2FyZF9pbnRyX2Rpc2FibGUoYnVzLT5jYXJkKTsKLQkJfQotCi0JfQotCi0JZWxzZSB7Ci0JCS8qIERpc2FibGUgRjIgYWdhaW4gKi8KLQkJZW5hYmxlID0gU0RJT19GVU5DX0VOQUJMRV8xOwotCQlicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKGJ1cy0+Y2FyZCwgU0RJT19GVU5DXzAsIFNESU9fQ0NDUl9JT0V4LAotCQkJCSAgICAgICBlbmFibGUsIE5VTEwpOwotCX0KLQotCS8qIFJlc3RvcmUgcHJldmlvdXMgY2xvY2sgc2V0dGluZyAqLwotCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoYnVzLT5jYXJkLCBTRElPX0ZVTkNfMSwgU0JTRElPX0ZVTkMxX0NISVBDTEtDU1IsCi0JCQkgc2F2ZWNsaywgJmVycik7Ci0KLSNpZiBkZWZpbmVkKE9PQl9JTlRSX09OTFkpCi0JLyogSG9zdCByZWdpc3RyYXRpb24gZm9yIE9PQiBpbnRlcnJ1cHQgKi8KLQlpZiAoYnJjbWZfc2Rpb19yZWdpc3Rlcl9vb2JfaW50cihidXMtPmRoZCkpIHsKLQkJYnJjbWZfc2RicmNtX3dkX3RpbWVyKGJ1cywgMCk7Ci0JCUJSQ01GX0VSUk9SKCgiJXMgSG9zdCBmYWlsZWQgdG8gcmVzZ2lzdGVyIGZvciBPT0JcbiIsCi0JCQkgICAgIF9fZnVuY19fKSk7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0KLQkvKiBFbmFibGUgb29iIGF0IGZpcm13YXJlICovCi0JYnJjbWZfc2RicmNtX2VuYWJsZV9vb2JfaW50cihidXMsIHRydWUpOwotI2VuZGlmCQkvKiBkZWZpbmVkKE9PQl9JTlRSX09OTFkpICovCi0KLQkvKiBJZiB3ZSBkaWRuJ3QgY29tZSB1cCwgdHVybiBvZmYgYmFja3BsYW5lIGNsb2NrICovCi0JaWYgKGRydnItPmJ1c3N0YXRlICE9IEJSQ01GX0JVU19EQVRBKQotCQlicmNtZl9zZGJyY21fY2xrY3RsKGJ1cywgQ0xLX05PTkUsIGZhbHNlKTsKLQotZXhpdDoKLQlpZiAoZW5mb3JjZV9tdXRleCkKLQkJYnJjbWZfc2RicmNtX3NkdW5sb2NrKGJ1cyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fcnhmYWlsKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgYm9vbCBhYm9ydCwgYm9vbCBydHgpCi17Ci0Jc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCA9IGJ1cy0+Y2FyZDsKLQl1aW50IHJldHJpZXMgPSAwOwotCXUxNiBsYXN0cmJjOwotCXU4IGhpLCBsbzsKLQlpbnQgZXJyOwotCi0JQlJDTUZfRVJST1IoKCIlczogJXN0ZXJtaW5hdGUgZnJhbWUlc1xuIiwgX19mdW5jX18sCi0JCSAgICAgKGFib3J0ID8gImFib3J0IGNvbW1hbmQsICIgOiAiIiksCi0JCSAgICAgKHJ0eCA/ICIsIHNlbmQgTkFLIiA6ICIiKSkpOwotCi0JaWYgKGFib3J0KQotCQlicmNtZl9zZGNhcmRfYWJvcnQoY2FyZCwgU0RJT19GVU5DXzIpOwotCi0JYnJjbWZfc2RjYXJkX2NmZ193cml0ZShjYXJkLCBTRElPX0ZVTkNfMSwgU0JTRElPX0ZVTkMxX0ZSQU1FQ1RSTCwKLQkJCSAgICAgICBTRkNfUkZfVEVSTSwgJmVycik7Ci0JYnVzLT5mMXJlZ2RhdGErKzsKLQotCS8qIFdhaXQgdW50aWwgdGhlIHBhY2tldCBoYXMgYmVlbiBmbHVzaGVkIChkZXZpY2UvRklGTyBzdGFibGUpICovCi0JZm9yIChsYXN0cmJjID0gcmV0cmllcyA9IDB4ZmZmZjsgcmV0cmllcyA+IDA7IHJldHJpZXMtLSkgewotCQloaSA9IGJyY21mX3NkY2FyZF9jZmdfcmVhZChjYXJkLCBTRElPX0ZVTkNfMSwKLQkJCQkJICAgU0JTRElPX0ZVTkMxX1JGUkFNRUJDSEksIE5VTEwpOwotCQlsbyA9IGJyY21mX3NkY2FyZF9jZmdfcmVhZChjYXJkLCBTRElPX0ZVTkNfMSwKLQkJCQkJICAgU0JTRElPX0ZVTkMxX1JGUkFNRUJDTE8sIE5VTEwpOwotCQlidXMtPmYxcmVnZGF0YSArPSAyOwotCi0JCWlmICgoaGkgPT0gMCkgJiYgKGxvID09IDApKQotCQkJYnJlYWs7Ci0KLQkJaWYgKChoaSA+IChsYXN0cmJjID4+IDgpKSAmJiAobG8gPiAobGFzdHJiYyAmIDB4MDBmZikpKSB7Ci0JCQlCUkNNRl9FUlJPUigoIiVzOiBjb3VudCBncm93aW5nOiBsYXN0IDB4JTA0eCBub3cgIgotCQkJCSAgICAgIjB4JTA0eFxuIiwKLQkJCQkgICAgIF9fZnVuY19fLCBsYXN0cmJjLCAoKGhpIDw8IDgpICsgbG8pKSk7Ci0JCX0KLQkJbGFzdHJiYyA9IChoaSA8PCA4KSArIGxvOwotCX0KLQotCWlmICghcmV0cmllcykgewotCQlCUkNNRl9FUlJPUigoIiVzOiBjb3VudCBuZXZlciB6ZXJvZWQ6IGxhc3QgMHglMDR4XG4iLAotCQkJICAgICBfX2Z1bmNfXywgbGFzdHJiYykpOwotCX0gZWxzZSB7Ci0JCUJSQ01GX0lORk8oKCIlczogZmx1c2ggdG9vayAlZCBpdGVyYXRpb25zXG4iLCBfX2Z1bmNfXywKLQkJCSAgICAoMHhmZmZmIC0gcmV0cmllcykpKTsKLQl9Ci0KLQlpZiAocnR4KSB7Ci0JCWJ1cy0+cnhydHgrKzsKLQkJd19zZHJlZzMyKGJ1cywgU01CX05BSywKLQkJCSAgb2Zmc2V0b2Yoc3RydWN0IHNkcGNtZF9yZWdzLCB0b3NibWFpbGJveCksICZyZXRyaWVzKTsKLQotCQlidXMtPmYxcmVnZGF0YSsrOwotCQlpZiAocmV0cmllcyA8PSByZXRyeV9saW1pdCkKLQkJCWJ1cy0+cnhza2lwID0gdHJ1ZTsKLQl9Ci0KLQkvKiBDbGVhciBwYXJ0aWFsIGluIGFueSBjYXNlICovCi0JYnVzLT5uZXh0bGVuID0gMDsKLQotCS8qIElmIHdlIGNhbid0IHJlYWNoIHRoZSBkZXZpY2UsIHNpZ25hbCBmYWlsdXJlICovCi0JaWYgKGVyciB8fCBicmNtZl9zZGNhcmRfcmVnZmFpbChjYXJkKSkKLQkJYnVzLT5kcnZyLT5idXNzdGF0ZSA9IEJSQ01GX0JVU19ET1dOOwotfQotCi1zdGF0aWMgdm9pZAotYnJjbWZfc2RicmNtX3JlYWRfY29udHJvbChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHU4ICpoZHIsIHVpbnQgbGVuLCB1aW50IGRvZmYpCi17Ci0Jc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCA9IGJ1cy0+Y2FyZDsKLQl1aW50IHJkbGVuLCBwYWQ7Ci0KLQlpbnQgc2RyZXQ7Ci0KLQlCUkNNRl9UUkFDRSgoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKLQotCS8qIENvbnRyb2wgZGF0YSBhbHJlYWR5IHJlY2VpdmVkIGluIGFsaWduZWQgcnhjdGwgKi8KLQlpZiAoKGJ1cy0+YnVzID09IFNQSV9CVVMpICYmICghYnVzLT51c2VidWZwb29sKSkKLQkJZ290byBnb3Rwa3Q7Ci0KLQkvKiBTZXQgcnhjdGwgZm9yIGZyYW1lICh3L29wdGlvbmFsIGFsaWdubWVudCkgKi8KLQlidXMtPnJ4Y3RsID0gYnVzLT5yeGJ1ZjsKLQlpZiAoYnJjbWZfYWxpZ25jdGwpIHsKLQkJYnVzLT5yeGN0bCArPSBmaXJzdHJlYWQ7Ci0JCXBhZCA9ICgodW5zaWduZWQgbG9uZylidXMtPnJ4Y3RsICUgQlJDTUZfU0RBTElHTik7Ci0JCWlmIChwYWQpCi0JCQlidXMtPnJ4Y3RsICs9IChCUkNNRl9TREFMSUdOIC0gcGFkKTsKLQkJYnVzLT5yeGN0bCAtPSBmaXJzdHJlYWQ7Ci0JfQotCi0JLyogQ29weSB0aGUgYWxyZWFkeS1yZWFkIHBvcnRpb24gb3ZlciAqLwotCW1lbWNweShidXMtPnJ4Y3RsLCBoZHIsIGZpcnN0cmVhZCk7Ci0JaWYgKGxlbiA8PSBmaXJzdHJlYWQpCi0JCWdvdG8gZ290cGt0OwotCi0JLyogQ29weSB0aGUgZnVsbCBkYXRhIHBrdCBpbiBnU1BJIGNhc2UgYW5kIHByb2Nlc3MgaW9jdGwuICovCi0JaWYgKGJ1cy0+YnVzID09IFNQSV9CVVMpIHsKLQkJbWVtY3B5KGJ1cy0+cnhjdGwsIGhkciwgbGVuKTsKLQkJZ290byBnb3Rwa3Q7Ci0JfQotCi0JLyogUmFpc2UgcmRsZW4gdG8gbmV4dCBTRElPIGJsb2NrIHRvIGF2b2lkIHRhaWwgY29tbWFuZCAqLwotCXJkbGVuID0gbGVuIC0gZmlyc3RyZWFkOwotCWlmIChidXMtPnJvdW5kdXAgJiYgYnVzLT5ibG9ja3NpemUgJiYgKHJkbGVuID4gYnVzLT5ibG9ja3NpemUpKSB7Ci0JCXBhZCA9IGJ1cy0+YmxvY2tzaXplIC0gKHJkbGVuICUgYnVzLT5ibG9ja3NpemUpOwotCQlpZiAoKHBhZCA8PSBidXMtPnJvdW5kdXApICYmIChwYWQgPCBidXMtPmJsb2Nrc2l6ZSkgJiYKLQkJICAgICgobGVuICsgcGFkKSA8IGJ1cy0+ZHJ2ci0+bWF4Y3RsKSkKLQkJCXJkbGVuICs9IHBhZDsKLQl9IGVsc2UgaWYgKHJkbGVuICUgQlJDTUZfU0RBTElHTikgewotCQlyZGxlbiArPSBCUkNNRl9TREFMSUdOIC0gKHJkbGVuICUgQlJDTUZfU0RBTElHTik7Ci0JfQotCi0JLyogU2F0aXNmeSBsZW5ndGgtYWxpZ25tZW50IHJlcXVpcmVtZW50cyAqLwotCWlmIChmb3JjZWFsaWduICYmIChyZGxlbiAmIChBTElHTk1FTlQgLSAxKSkpCi0JCXJkbGVuID0gcm91bmR1cChyZGxlbiwgQUxJR05NRU5UKTsKLQotCS8qIERyb3AgaWYgdGhlIHJlYWQgaXMgdG9vIGJpZyBvciBpdCBleGNlZWRzIG91ciBtYXhpbXVtICovCi0JaWYgKChyZGxlbiArIGZpcnN0cmVhZCkgPiBidXMtPmRydnItPm1heGN0bCkgewotCQlCUkNNRl9FUlJPUigoIiVzOiAlZC1ieXRlIGNvbnRyb2wgcmVhZCBleGNlZWRzICVkLWJ5dGUiCi0JCQkgICAgICIgYnVmZmVyXG4iLCBfX2Z1bmNfXywgcmRsZW4sIGJ1cy0+ZHJ2ci0+bWF4Y3RsKSk7Ci0JCWJ1cy0+ZHJ2ci0+cnhfZXJyb3JzKys7Ci0JCWJyY21mX3NkYnJjbV9yeGZhaWwoYnVzLCBmYWxzZSwgZmFsc2UpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKChsZW4gLSBkb2ZmKSA+IGJ1cy0+ZHJ2ci0+bWF4Y3RsKSB7Ci0JCUJSQ01GX0VSUk9SKCgiJXM6ICVkLWJ5dGUgY3RsIGZyYW1lICglZC1ieXRlIGN0bCBkYXRhKSBleGNlZWRzICIKLQkJCSAgICAgIiVkLWJ5dGUgbGltaXRcbiIsCi0JCQkgICAgIF9fZnVuY19fLCBsZW4sIChsZW4gLSBkb2ZmKSwgYnVzLT5kcnZyLT5tYXhjdGwpKTsKLQkJYnVzLT5kcnZyLT5yeF9lcnJvcnMrKzsKLQkJYnVzLT5yeF90b29sb25nKys7Ci0JCWJyY21mX3NkYnJjbV9yeGZhaWwoYnVzLCBmYWxzZSwgZmFsc2UpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogUmVhZCByZW1haW5kZXIgb2YgZnJhbWUgYm9keSBpbnRvIHRoZSByeGN0bCBidWZmZXIgKi8KLQlzZHJldCA9IGJyY21mX3NkY2FyZF9yZWN2X2J1ZihjYXJkLCBicmNtZl9zZGNhcmRfY3VyX3Nid2FkKGNhcmQpLAotCQkJCVNESU9fRlVOQ18yLAotCQkJCUYyU1lOQywgKGJ1cy0+cnhjdGwgKyBmaXJzdHJlYWQpLCByZGxlbiwKLQkJCQlOVUxMLCBOVUxMLCBOVUxMKTsKLQlidXMtPmYycnhkYXRhKys7Ci0KLQkvKiBDb250cm9sIGZyYW1lIGZhaWx1cmVzIG5lZWQgcmV0cmFuc21pc3Npb24gKi8KLQlpZiAoc2RyZXQgPCAwKSB7Ci0JCUJSQ01GX0VSUk9SKCgiJXM6IHJlYWQgJWQgY29udHJvbCBieXRlcyBmYWlsZWQ6ICVkXG4iLAotCQkJICAgICBfX2Z1bmNfXywgcmRsZW4sIHNkcmV0KSk7Ci0JCWJ1cy0+cnhjX2Vycm9ycysrOwotCQlicmNtZl9zZGJyY21fcnhmYWlsKGJ1cywgdHJ1ZSwgdHJ1ZSk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLWdvdHBrdDoKLQotI2lmZGVmIEJDTURCRwotCWlmIChCUkNNRl9CWVRFU19PTigpICYmIEJSQ01GX0NUTF9PTigpKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJSeEN0cmw6XG4iKTsKLQkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIiIsIERVTVBfUFJFRklYX09GRlNFVCwgYnVzLT5yeGN0bCwgbGVuKTsKLQl9Ci0jZW5kaWYKLQotCS8qIFBvaW50IHRvIHZhbGlkIGRhdGEgYW5kIGluZGljYXRlIGl0cyBsZW5ndGggKi8KLQlidXMtPnJ4Y3RsICs9IGRvZmY7Ci0JYnVzLT5yeGxlbiA9IGxlbiAtIGRvZmY7Ci0KLWRvbmU6Ci0JLyogQXdha2UgYW55IHdhaXRlcnMgKi8KLQlicmNtZl9vc19pb2N0bF9yZXNwX3dha2UoYnVzLT5kcnZyKTsKLX0KLQotc3RhdGljIHU4IGJyY21mX3NkYnJjbV9yeGdsb20oc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1OCByeHNlcSkKLXsKLQl1MTYgZGxlbiwgdG90bGVuOwotCXU4ICpkcHRyLCBudW0gPSAwOwotCi0JdTE2IHN1YmxlbiwgY2hlY2s7Ci0Jc3RydWN0IHNrX2J1ZmYgKnBmaXJzdCwgKnBsYXN0LCAqcG5leHQsICpzYXZlX3BmaXJzdDsKLQotCWludCBlcnJjb2RlOwotCXU4IGNoYW4sIHNlcSwgZG9mZiwgc2Zkb2ZmOwotCXU4IHR4bWF4OwotCi0JaW50IGlmaWR4ID0gMDsKLQlib29sIHVzZWNoYWluID0gYnVzLT51c2VfcnhjaGFpbjsKLQotCS8qIElmIHBhY2tldHMsIGlzc3VlIHJlYWQocykgYW5kIHNlbmQgdXAgcGFja2V0IGNoYWluICovCi0JLyogUmV0dXJuIHNlcXVlbmNlIG51bWJlcnMgY29uc3VtZWQ/ICovCi0KLQlCUkNNRl9UUkFDRSgoImJyY21mX3NkYnJjbV9yeGdsb206IHN0YXJ0OiBnbG9tZCAlcCBnbG9tICVwXG4iLAotCQkgICAgIGJ1cy0+Z2xvbWQsIGJ1cy0+Z2xvbSkpOwotCi0JLyogSWYgdGhlcmUncyBhIGRlc2NyaXB0b3IsIGdlbmVyYXRlIHRoZSBwYWNrZXQgY2hhaW4gKi8KLQlpZiAoYnVzLT5nbG9tZCkgewotCQlwZmlyc3QgPSBwbGFzdCA9IHBuZXh0ID0gTlVMTDsKLQkJZGxlbiA9ICh1MTYpIChidXMtPmdsb21kLT5sZW4pOwotCQlkcHRyID0gYnVzLT5nbG9tZC0+ZGF0YTsKLQkJaWYgKCFkbGVuIHx8IChkbGVuICYgMSkpIHsKLQkJCUJSQ01GX0VSUk9SKCgiJXM6IGJhZCBnbG9tZCBsZW4oJWQpLCIKLQkJCQkgICAgICIgaWdub3JlIGRlc2NyaXB0b3JcbiIsCi0JCQkJICAgICBfX2Z1bmNfXywgZGxlbikpOwotCQkJZGxlbiA9IDA7Ci0JCX0KLQotCQlmb3IgKHRvdGxlbiA9IG51bSA9IDA7IGRsZW47IG51bSsrKSB7Ci0JCQkvKiBHZXQgKGFuZCBtb3ZlIHBhc3QpIG5leHQgbGVuZ3RoICovCi0JCQlzdWJsZW4gPSBnZXRfdW5hbGlnbmVkX2xlMTYoZHB0cik7Ci0JCQlkbGVuIC09IHNpemVvZih1MTYpOwotCQkJZHB0ciArPSBzaXplb2YodTE2KTsKLQkJCWlmICgoc3VibGVuIDwgU0RQQ01fSERSTEVOKSB8fAotCQkJICAgICgobnVtID09IDApICYmIChzdWJsZW4gPCAoMiAqIFNEUENNX0hEUkxFTikpKSkgewotCQkJCUJSQ01GX0VSUk9SKCgiJXM6IGRlc2NyaXB0b3IgbGVuICVkIGJhZDogJWRcbiIsCi0JCQkJCSAgICAgX19mdW5jX18sIG51bSwgc3VibGVuKSk7Ci0JCQkJcG5leHQgPSBOVUxMOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHN1YmxlbiAlIEJSQ01GX1NEQUxJR04pIHsKLQkJCQlCUkNNRl9FUlJPUigoIiVzOiBzdWJsZW4gJWQgbm90IG11bHRpcGxlIG9mIgotCQkJCQkgICAgICIgJWRcbiIsIF9fZnVuY19fLCBzdWJsZW4sCi0JCQkJCSAgICAgQlJDTUZfU0RBTElHTikpOwotCQkJCXVzZWNoYWluID0gZmFsc2U7Ci0JCQl9Ci0JCQl0b3RsZW4gKz0gc3VibGVuOwotCi0JCQkvKiBGb3IgbGFzdCBmcmFtZSwgYWRqdXN0IHJlYWQgbGVuIHNvIHRvdGFsCi0JCQkJIGlzIGEgYmxvY2sgbXVsdGlwbGUgKi8KLQkJCWlmICghZGxlbikgewotCQkJCXN1YmxlbiArPQotCQkJCSAgICAocm91bmR1cCh0b3RsZW4sIGJ1cy0+YmxvY2tzaXplKSAtIHRvdGxlbik7Ci0JCQkJdG90bGVuID0gcm91bmR1cCh0b3RsZW4sIGJ1cy0+YmxvY2tzaXplKTsKLQkJCX0KLQotCQkJLyogQWxsb2NhdGUvY2hhaW4gcGFja2V0IGZvciBuZXh0IHN1YmZyYW1lICovCi0JCQlwbmV4dCA9IGJyY211X3BrdF9idWZfZ2V0X3NrYihzdWJsZW4gKyBCUkNNRl9TREFMSUdOKTsKLQkJCWlmIChwbmV4dCA9PSBOVUxMKSB7Ci0JCQkJQlJDTUZfRVJST1IoKCIlczogYmNtX3BrdF9idWZfZ2V0X3NrYiBmYWlsZWQsICIKLQkJCQkJICAgICAibnVtICVkIGxlbiAlZFxuIiwgX19mdW5jX18sCi0JCQkJCSAgICAgbnVtLCBzdWJsZW4pKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICghcGZpcnN0KSB7Ci0JCQkJcGZpcnN0ID0gcGxhc3QgPSBwbmV4dDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGxhc3QtPm5leHQgPSBwbmV4dDsKLQkJCQlwbGFzdCA9IHBuZXh0OwotCQkJfQotCi0JCQkvKiBBZGhlcmUgdG8gc3RhcnQgYWxpZ25tZW50IHJlcXVpcmVtZW50cyAqLwotCQkJUEtUQUxJR04ocG5leHQsIHN1YmxlbiwgQlJDTUZfU0RBTElHTik7Ci0JCX0KLQotCQkvKiBJZiBhbGwgYWxsb2NhdGlvbnMgc3VjY2VlZGVkLCBzYXZlIHBhY2tldCBjaGFpbgotCQkJIGluIGJ1cyBzdHJ1Y3R1cmUgKi8KLQkJaWYgKHBuZXh0KSB7Ci0JCQlCUkNNRl9HTE9NKCgiJXM6IGFsbG9jYXRlZCAlZC1ieXRlIHBhY2tldCBjaGFpbiBmb3IgJWQgIgotCQkJCSAgICAic3ViZnJhbWVzXG4iLCBfX2Z1bmNfXywgdG90bGVuLCBudW0pKTsKLQkJCWlmIChCUkNNRl9HTE9NX09OKCkgJiYgYnVzLT5uZXh0bGVuKSB7Ci0JCQkJaWYgKHRvdGxlbiAhPSBidXMtPm5leHRsZW4pIHsKLQkJCQkJQlJDTUZfR0xPTSgoIiVzOiBnbG9tZGVzYyBtaXNtYXRjaDogIgotCQkJCQkJICAgICJuZXh0bGVuICVkIGdsb21kZXNjICVkICIKLQkJCQkJCSAgICAicnhzZXEgJWRcbiIsIF9fZnVuY19fLAotCQkJCQkJICAgIGJ1cy0+bmV4dGxlbiwKLQkJCQkJCSAgICB0b3RsZW4sIHJ4c2VxKSk7Ci0JCQkJfQotCQkJfQotCQkJYnVzLT5nbG9tID0gcGZpcnN0OwotCQkJcGZpcnN0ID0gcG5leHQgPSBOVUxMOwotCQl9IGVsc2UgewotCQkJaWYgKHBmaXJzdCkKLQkJCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKHBmaXJzdCk7Ci0JCQlidXMtPmdsb20gPSBOVUxMOwotCQkJbnVtID0gMDsKLQkJfQotCi0JCS8qIERvbmUgd2l0aCBkZXNjcmlwdG9yIHBhY2tldCAqLwotCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKGJ1cy0+Z2xvbWQpOwotCQlidXMtPmdsb21kID0gTlVMTDsKLQkJYnVzLT5uZXh0bGVuID0gMDsKLQl9Ci0KLQkvKiBPayAtLSBlaXRoZXIgd2UganVzdCBnZW5lcmF0ZWQgYSBwYWNrZXQgY2hhaW4sCi0JCSBvciBoYWQgb25lIGZyb20gYmVmb3JlICovCi0JaWYgKGJ1cy0+Z2xvbSkgewotCQlpZiAoQlJDTUZfR0xPTV9PTigpKSB7Ci0JCQlCUkNNRl9HTE9NKCgiJXM6IHRyeSBzdXBlcmZyYW1lIHJlYWQsIHBhY2tldCBjaGFpbjpcbiIsCi0JCQkJICAgIF9fZnVuY19fKSk7Ci0JCQlmb3IgKHBuZXh0ID0gYnVzLT5nbG9tOyBwbmV4dDsgcG5leHQgPSBwbmV4dC0+bmV4dCkgewotCQkJCUJSQ01GX0dMT00oKCIgICAgJXA6ICVwIGxlbiAweCUwNHggKCVkKVxuIiwKLQkJCQkJICAgIHBuZXh0LCAodTggKikgKHBuZXh0LT5kYXRhKSwKLQkJCQkJICAgIHBuZXh0LT5sZW4sIHBuZXh0LT5sZW4pKTsKLQkJCX0KLQkJfQotCi0JCXBmaXJzdCA9IGJ1cy0+Z2xvbTsKLQkJZGxlbiA9ICh1MTYpIGJyY211X3BrdHRvdGxlbihwZmlyc3QpOwotCi0JCS8qIERvIGFuIFNESU8gcmVhZCBmb3IgdGhlIHN1cGVyZnJhbWUuICBDb25maWd1cmFibGUgaW92YXIgdG8KLQkJICogcmVhZCBkaXJlY3RseSBpbnRvIHRoZSBjaGFpbmVkIHBhY2tldCwgb3IgYWxsb2NhdGUgYSBsYXJnZQotCQkgKiBwYWNrZXQgYW5kIGFuZCBjb3B5IGludG8gdGhlIGNoYWluLgotCQkgKi8KLQkJaWYgKHVzZWNoYWluKSB7Ci0JCQllcnJjb2RlID0gYnJjbWZfc2RjYXJkX3JlY3ZfYnVmKGJ1cy0+Y2FyZCwKLQkJCQkJYnJjbWZfc2RjYXJkX2N1cl9zYndhZChidXMtPmNhcmQpLAotCQkJCQlTRElPX0ZVTkNfMiwKLQkJCQkJRjJTWU5DLCAodTggKikgcGZpcnN0LT5kYXRhLCBkbGVuLAotCQkJCQlwZmlyc3QsIE5VTEwsIE5VTEwpOwotCQl9IGVsc2UgaWYgKGJ1cy0+ZGF0YXB0cikgewotCQkJZXJyY29kZSA9IGJyY21mX3NkY2FyZF9yZWN2X2J1ZihidXMtPmNhcmQsCi0JCQkJCWJyY21mX3NkY2FyZF9jdXJfc2J3YWQoYnVzLT5jYXJkKSwKLQkJCQkJU0RJT19GVU5DXzIsCi0JCQkJCUYyU1lOQywgYnVzLT5kYXRhcHRyLCBkbGVuLAotCQkJCQlOVUxMLCBOVUxMLCBOVUxMKTsKLQkJCXN1YmxlbiA9ICh1MTYpIGJyY211X3BrdGZyb21idWYocGZpcnN0LCAwLCBkbGVuLAotCQkJCQkJYnVzLT5kYXRhcHRyKTsKLQkJCWlmIChzdWJsZW4gIT0gZGxlbikgewotCQkJCUJSQ01GX0VSUk9SKCgiJXM6IEZBSUxFRCBUTyBDT1BZLCBkbGVuICVkICIKLQkJCQkJICAgICAic3VibGVuICVkXG4iLAotCQkJCQkgICAgIF9fZnVuY19fLCBkbGVuLCBzdWJsZW4pKTsKLQkJCQllcnJjb2RlID0gLTE7Ci0JCQl9Ci0JCQlwbmV4dCA9IE5VTEw7Ci0JCX0gZWxzZSB7Ci0JCQlCUkNNRl9FUlJPUigoIkNPVUxETidUIEFMTE9DICVkLUJZVEUgR0xPTSwgIgotCQkJCSAgICAgIkZPUkNFIEZBSUxVUkVcbiIsIGRsZW4pKTsKLQkJCWVycmNvZGUgPSAtMTsKLQkJfQotCQlidXMtPmYycnhkYXRhKys7Ci0KLQkJLyogT24gZmFpbHVyZSwga2lsbCB0aGUgc3VwZXJmcmFtZSwgYWxsb3cgYSBjb3VwbGUgcmV0cmllcyAqLwotCQlpZiAoZXJyY29kZSA8IDApIHsKLQkJCUJSQ01GX0VSUk9SKCgiJXM6IGdsb20gcmVhZCBvZiAlZCBieXRlcyBmYWlsZWQ6ICVkXG4iLAotCQkJCSAgICAgX19mdW5jX18sIGRsZW4sIGVycmNvZGUpKTsKLQkJCWJ1cy0+ZHJ2ci0+cnhfZXJyb3JzKys7Ci0KLQkJCWlmIChidXMtPmdsb21lcnIrKyA8IDMpIHsKLQkJCQlicmNtZl9zZGJyY21fcnhmYWlsKGJ1cywgdHJ1ZSwgdHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCWJ1cy0+Z2xvbWVyciA9IDA7Ci0JCQkJYnJjbWZfc2RicmNtX3J4ZmFpbChidXMsIHRydWUsIGZhbHNlKTsKLQkJCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKGJ1cy0+Z2xvbSk7Ci0JCQkJYnVzLT5yeGdsb21mYWlsKys7Ci0JCQkJYnVzLT5nbG9tID0gTlVMTDsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0jaWZkZWYgQkNNREJHCi0JCWlmIChCUkNNRl9HTE9NX09OKCkpIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICJTVVBFUkZSQU1FOlxuIik7Ci0JCQlwcmludF9oZXhfZHVtcF9ieXRlcygiIiwgRFVNUF9QUkVGSVhfT0ZGU0VULAotCQkJCXBmaXJzdC0+ZGF0YSwgbWluX3QoaW50LCBwZmlyc3QtPmxlbiwgNDgpKTsKLQkJfQotI2VuZGlmCi0KLQkJLyogVmFsaWRhdGUgdGhlIHN1cGVyZnJhbWUgaGVhZGVyICovCi0JCWRwdHIgPSAodTggKikgKHBmaXJzdC0+ZGF0YSk7Ci0JCXN1YmxlbiA9IGdldF91bmFsaWduZWRfbGUxNihkcHRyKTsKLQkJY2hlY2sgPSBnZXRfdW5hbGlnbmVkX2xlMTYoZHB0ciArIHNpemVvZih1MTYpKTsKLQotCQljaGFuID0gU0RQQ01fUEFDS0VUX0NIQU5ORUwoJmRwdHJbU0RQQ01fRlJBTUVUQUdfTEVOXSk7Ci0JCXNlcSA9IFNEUENNX1BBQ0tFVF9TRVFVRU5DRSgmZHB0cltTRFBDTV9GUkFNRVRBR19MRU5dKTsKLQkJYnVzLT5uZXh0bGVuID0gZHB0cltTRFBDTV9GUkFNRVRBR19MRU4gKyBTRFBDTV9ORVhUTEVOX09GRlNFVF07Ci0JCWlmICgoYnVzLT5uZXh0bGVuIDw8IDQpID4gTUFYX1JYX0RBVEFTWikgewotCQkJQlJDTUZfSU5GTygoIiVzOiBuZXh0bGVuIHRvbyBsYXJnZSAoJWQpIHNlcSAlZFxuIiwKLQkJCQkgICAgX19mdW5jX18sIGJ1cy0+bmV4dGxlbiwgc2VxKSk7Ci0JCQlidXMtPm5leHRsZW4gPSAwOwotCQl9Ci0JCWRvZmYgPSBTRFBDTV9ET0ZGU0VUX1ZBTFVFKCZkcHRyW1NEUENNX0ZSQU1FVEFHX0xFTl0pOwotCQl0eG1heCA9IFNEUENNX1dJTkRPV19WQUxVRSgmZHB0cltTRFBDTV9GUkFNRVRBR19MRU5dKTsKLQotCQllcnJjb2RlID0gMDsKLQkJaWYgKCh1MTYpfihzdWJsZW4gXiBjaGVjaykpIHsKLQkJCUJSQ01GX0VSUk9SKCgiJXMgKHN1cGVyZnJhbWUpOiBIVyBoZHIgZXJyb3I6IGxlbi9jaGVjayAiCi0JCQkJICAgICAiMHglMDR4LzB4JTA0eFxuIiwgX19mdW5jX18sIHN1YmxlbiwKLQkJCQkgICAgIGNoZWNrKSk7Ci0JCQllcnJjb2RlID0gLTE7Ci0JCX0gZWxzZSBpZiAocm91bmR1cChzdWJsZW4sIGJ1cy0+YmxvY2tzaXplKSAhPSBkbGVuKSB7Ci0JCQlCUkNNRl9FUlJPUigoIiVzIChzdXBlcmZyYW1lKTogbGVuIDB4JTA0eCwgcm91bmRlZCAiCi0JCQkJICAgICAiMHglMDR4LCBleHBlY3QgMHglMDR4XG4iLAotCQkJCSAgICAgX19mdW5jX18sIHN1YmxlbiwKLQkJCQkgICAgIHJvdW5kdXAoc3VibGVuLCBidXMtPmJsb2Nrc2l6ZSksIGRsZW4pKTsKLQkJCWVycmNvZGUgPSAtMTsKLQkJfSBlbHNlIGlmIChTRFBDTV9QQUNLRVRfQ0hBTk5FTCgmZHB0cltTRFBDTV9GUkFNRVRBR19MRU5dKSAhPQotCQkJICAgU0RQQ01fR0xPTV9DSEFOTkVMKSB7Ci0JCQlCUkNNRl9FUlJPUigoIiVzIChzdXBlcmZyYW1lKTogYmFkIGNoYW5uZWwgJWRcbiIsCi0JCQkJICAgX19mdW5jX18sCi0JCQkJICAgU0RQQ01fUEFDS0VUX0NIQU5ORUwoJmRwdHIKLQkJCQkJCQlbU0RQQ01fRlJBTUVUQUdfTEVOXSkpKTsKLQkJCWVycmNvZGUgPSAtMTsKLQkJfSBlbHNlIGlmIChTRFBDTV9HTE9NREVTQygmZHB0cltTRFBDTV9GUkFNRVRBR19MRU5dKSkgewotCQkJQlJDTUZfRVJST1IoKCIlcyAoc3VwZXJmcmFtZSk6IGdvdCAybmQgZGVzY3JpcHRvcj9cbiIsCi0JCQkJICAgICBfX2Z1bmNfXykpOwotCQkJZXJyY29kZSA9IC0xOwotCQl9IGVsc2UgaWYgKChkb2ZmIDwgU0RQQ01fSERSTEVOKSB8fAotCQkJICAgKGRvZmYgPiAocGZpcnN0LT5sZW4gLSBTRFBDTV9IRFJMRU4pKSkgewotCQkJQlJDTUZfRVJST1IoKCIlcyAoc3VwZXJmcmFtZSk6IEJhZCBkYXRhIG9mZnNldCAlZDogIgotCQkJCSAgICAgIkhXICVkIHBrdCAlZCBtaW4gJWRcbiIsCi0JCQkJICAgICBfX2Z1bmNfXywgZG9mZiwgc3VibGVuLAotCQkJCSAgICAgcGZpcnN0LT5sZW4sIFNEUENNX0hEUkxFTikpOwotCQkJZXJyY29kZSA9IC0xOwotCQl9Ci0KLQkJLyogQ2hlY2sgc2VxdWVuY2UgbnVtYmVyIG9mIHN1cGVyZnJhbWUgU1cgaGVhZGVyICovCi0JCWlmIChyeHNlcSAhPSBzZXEpIHsKLQkJCUJSQ01GX0lORk8oKCIlczogKHN1cGVyZnJhbWUpIHJ4X3NlcSAlZCwgZXhwZWN0ZWQgJWRcbiIsCi0JCQkJICAgIF9fZnVuY19fLCBzZXEsIHJ4c2VxKSk7Ci0JCQlidXMtPnJ4X2JhZHNlcSsrOwotCQkJcnhzZXEgPSBzZXE7Ci0JCX0KLQotCQkvKiBDaGVjayB3aW5kb3cgZm9yIHNhbml0eSAqLwotCQlpZiAoKHU4KSAodHhtYXggLSBidXMtPnR4X3NlcSkgPiAweDQwKSB7Ci0JCQlCUkNNRl9FUlJPUigoIiVzOiB1bmxpa2VseSB0eCBtYXggJWQgd2l0aCB0eF9zZXEgJWRcbiIsCi0JCQkJICAgICBfX2Z1bmNfXywgdHhtYXgsIGJ1cy0+dHhfc2VxKSk7Ci0JCQl0eG1heCA9IGJ1cy0+dHhfc2VxICsgMjsKLQkJfQotCQlidXMtPnR4X21heCA9IHR4bWF4OwotCi0JCS8qIFJlbW92ZSBzdXBlcmZyYW1lIGhlYWRlciwgcmVtZW1iZXIgb2Zmc2V0ICovCi0JCXNrYl9wdWxsKHBmaXJzdCwgZG9mZik7Ci0JCXNmZG9mZiA9IGRvZmY7Ci0KLQkJLyogVmFsaWRhdGUgYWxsIHRoZSBzdWJmcmFtZSBoZWFkZXJzICovCi0JCWZvciAobnVtID0gMCwgcG5leHQgPSBwZmlyc3Q7IHBuZXh0ICYmICFlcnJjb2RlOwotCQkgICAgIG51bSsrLCBwbmV4dCA9IHBuZXh0LT5uZXh0KSB7Ci0JCQlkcHRyID0gKHU4ICopIChwbmV4dC0+ZGF0YSk7Ci0JCQlkbGVuID0gKHUxNikgKHBuZXh0LT5sZW4pOwotCQkJc3VibGVuID0gZ2V0X3VuYWxpZ25lZF9sZTE2KGRwdHIpOwotCQkJY2hlY2sgPSBnZXRfdW5hbGlnbmVkX2xlMTYoZHB0ciArIHNpemVvZih1MTYpKTsKLQkJCWNoYW4gPSBTRFBDTV9QQUNLRVRfQ0hBTk5FTCgmZHB0cltTRFBDTV9GUkFNRVRBR19MRU5dKTsKLQkJCWRvZmYgPSBTRFBDTV9ET0ZGU0VUX1ZBTFVFKCZkcHRyW1NEUENNX0ZSQU1FVEFHX0xFTl0pOwotI2lmZGVmIEJDTURCRwotCQkJaWYgKEJSQ01GX0dMT01fT04oKSkgewotCQkJCXByaW50ayhLRVJOX0RFQlVHICJzdWJmcmFtZTpcbiIpOwotCQkJCXByaW50X2hleF9kdW1wX2J5dGVzKCIiLCBEVU1QX1BSRUZJWF9PRkZTRVQsCi0JCQkJCQkgICAgIGRwdHIsIDMyKTsKLQkJCX0KLSNlbmRpZgotCi0JCQlpZiAoKHUxNil+KHN1YmxlbiBeIGNoZWNrKSkgewotCQkJCUJSQ01GX0VSUk9SKCgiJXMgKHN1YmZyYW1lICVkKTogSFcgaGRyIGVycm9yOiAiCi0JCQkJCSAgICAgImxlbi9jaGVjayAweCUwNHgvMHglMDR4XG4iLAotCQkJCQkgICAgIF9fZnVuY19fLCBudW0sIHN1YmxlbiwgY2hlY2spKTsKLQkJCQllcnJjb2RlID0gLTE7Ci0JCQl9IGVsc2UgaWYgKChzdWJsZW4gPiBkbGVuKSB8fCAoc3VibGVuIDwgU0RQQ01fSERSTEVOKSkgewotCQkJCUJSQ01GX0VSUk9SKCgiJXMgKHN1YmZyYW1lICVkKTogbGVuZ3RoIG1pc21hdGNoIgotCQkJCQkgICAgICI6IGxlbiAweCUwNHgsIGV4cGVjdCAweCUwNHhcbiIsCi0JCQkJCSAgICAgX19mdW5jX18sIG51bSwgc3VibGVuLCBkbGVuKSk7Ci0JCQkJZXJyY29kZSA9IC0xOwotCQkJfSBlbHNlIGlmICgoY2hhbiAhPSBTRFBDTV9EQVRBX0NIQU5ORUwpICYmCi0JCQkJICAgKGNoYW4gIT0gU0RQQ01fRVZFTlRfQ0hBTk5FTCkpIHsKLQkJCQlCUkNNRl9FUlJPUigoIiVzIChzdWJmcmFtZSAlZCk6IGJhZCBjaGFubmVsIgotCQkJCQkgICAgICIgJWRcbiIsIF9fZnVuY19fLCBudW0sIGNoYW4pKTsKLQkJCQllcnJjb2RlID0gLTE7Ci0JCQl9IGVsc2UgaWYgKChkb2ZmIDwgU0RQQ01fSERSTEVOKSB8fCAoZG9mZiA+IHN1YmxlbikpIHsKLQkJCQlCUkNNRl9FUlJPUigoIiVzIChzdWJmcmFtZSAlZCk6IEJhZCBkYXRhIG9mZnNldCIKLQkJCQkJICAgICAiICVkOiBIVyAlZCBtaW4gJWRcbiIsCi0JCQkJCSAgICAgX19mdW5jX18sIG51bSwgZG9mZiwgc3VibGVuLAotCQkJCQkgICAgIFNEUENNX0hEUkxFTikpOwotCQkJCWVycmNvZGUgPSAtMTsKLQkJCX0KLQkJfQotCi0JCWlmIChlcnJjb2RlKSB7Ci0JCQkvKiBUZXJtaW5hdGUgZnJhbWUgb24gZXJyb3IsIHJlcXVlc3QKLQkJCQkgYSBjb3VwbGUgcmV0cmllcyAqLwotCQkJaWYgKGJ1cy0+Z2xvbWVycisrIDwgMykgewotCQkJCS8qIFJlc3RvcmUgc3VwZXJmcmFtZSBoZWFkZXIgc3BhY2UgKi8KLQkJCQlza2JfcHVzaChwZmlyc3QsIHNmZG9mZik7Ci0JCQkJYnJjbWZfc2RicmNtX3J4ZmFpbChidXMsIHRydWUsIHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQlidXMtPmdsb21lcnIgPSAwOwotCQkJCWJyY21mX3NkYnJjbV9yeGZhaWwoYnVzLCB0cnVlLCBmYWxzZSk7Ci0JCQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihidXMtPmdsb20pOwotCQkJCWJ1cy0+cnhnbG9tZmFpbCsrOwotCQkJCWJ1cy0+Z2xvbSA9IE5VTEw7Ci0JCQl9Ci0JCQlidXMtPm5leHRsZW4gPSAwOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQkvKiBCYXNpYyBTRCBmcmFtaW5nIGxvb2tzIG9rIC0gcHJvY2VzcyBlYWNoIHBhY2tldCAoaGVhZGVyKSAqLwotCQlzYXZlX3BmaXJzdCA9IHBmaXJzdDsKLQkJYnVzLT5nbG9tID0gTlVMTDsKLQkJcGxhc3QgPSBOVUxMOwotCi0JCWZvciAobnVtID0gMDsgcGZpcnN0OyByeHNlcSsrLCBwZmlyc3QgPSBwbmV4dCkgewotCQkJcG5leHQgPSBwZmlyc3QtPm5leHQ7Ci0JCQlwZmlyc3QtPm5leHQgPSBOVUxMOwotCi0JCQlkcHRyID0gKHU4ICopIChwZmlyc3QtPmRhdGEpOwotCQkJc3VibGVuID0gZ2V0X3VuYWxpZ25lZF9sZTE2KGRwdHIpOwotCQkJY2hhbiA9IFNEUENNX1BBQ0tFVF9DSEFOTkVMKCZkcHRyW1NEUENNX0ZSQU1FVEFHX0xFTl0pOwotCQkJc2VxID0gU0RQQ01fUEFDS0VUX1NFUVVFTkNFKCZkcHRyW1NEUENNX0ZSQU1FVEFHX0xFTl0pOwotCQkJZG9mZiA9IFNEUENNX0RPRkZTRVRfVkFMVUUoJmRwdHJbU0RQQ01fRlJBTUVUQUdfTEVOXSk7Ci0KLQkJCUJSQ01GX0dMT00oKCIlczogR2V0IHN1YmZyYW1lICVkLCAlcCglcC8lZCksIHN1YmxlbiAlZCAiCi0JCQkJICAgICJjaGFuICVkIHNlcSAlZFxuIiwKLQkJCQkgICAgX19mdW5jX18sIG51bSwgcGZpcnN0LCBwZmlyc3QtPmRhdGEsCi0JCQkJICAgIHBmaXJzdC0+bGVuLCBzdWJsZW4sIGNoYW4sIHNlcSkpOwotCi0JCQkvKiBwcmVjb25kaXRpb246IGNoYW4gPT0gU0RQQ01fREFUQV9DSEFOTkVMIHx8Ci0JCQkJCSBjaGFuID09IFNEUENNX0VWRU5UX0NIQU5ORUwgKi8KLQotCQkJaWYgKHJ4c2VxICE9IHNlcSkgewotCQkJCUJSQ01GX0dMT00oKCIlczogcnhfc2VxICVkLCBleHBlY3RlZCAlZFxuIiwKLQkJCQkJICAgIF9fZnVuY19fLCBzZXEsIHJ4c2VxKSk7Ci0JCQkJYnVzLT5yeF9iYWRzZXErKzsKLQkJCQlyeHNlcSA9IHNlcTsKLQkJCX0KLSNpZmRlZiBCQ01EQkcKLQkJCWlmIChCUkNNRl9CWVRFU19PTigpICYmIEJSQ01GX0RBVEFfT04oKSkgewotCQkJCXByaW50ayhLRVJOX0RFQlVHICJSeCBTdWJmcmFtZSBEYXRhOlxuIik7Ci0JCQkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIiIsIERVTVBfUFJFRklYX09GRlNFVCwKLQkJCQkJCSAgICAgZHB0ciwgZGxlbik7Ci0JCQl9Ci0jZW5kaWYKLQotCQkJX19za2JfdHJpbShwZmlyc3QsIHN1Ymxlbik7Ci0JCQlza2JfcHVsbChwZmlyc3QsIGRvZmYpOwotCi0JCQlpZiAocGZpcnN0LT5sZW4gPT0gMCkgewotCQkJCWJyY211X3BrdF9idWZfZnJlZV9za2IocGZpcnN0KTsKLQkJCQlpZiAocGxhc3QpIHsKLQkJCQkJcGxhc3QtPm5leHQgPSBwbmV4dDsKLQkJCQl9IGVsc2UgewotCQkJCQlzYXZlX3BmaXJzdCA9IHBuZXh0OwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSBpZiAoYnJjbWZfcHJvdG9faGRycHVsbChidXMtPmRydnIsICZpZmlkeCwgcGZpcnN0KQotCQkJCQkhPSAwKSB7Ci0JCQkJQlJDTUZfRVJST1IoKCIlczogcnggcHJvdG9jb2wgZXJyb3JcbiIsCi0JCQkJCSAgICAgX19mdW5jX18pKTsKLQkJCQlidXMtPmRydnItPnJ4X2Vycm9ycysrOwotCQkJCWJyY211X3BrdF9idWZfZnJlZV9za2IocGZpcnN0KTsKLQkJCQlpZiAocGxhc3QpIHsKLQkJCQkJcGxhc3QtPm5leHQgPSBwbmV4dDsKLQkJCQl9IGVsc2UgewotCQkJCQlzYXZlX3BmaXJzdCA9IHBuZXh0OwotCQkJCX0KLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLyogdGhpcyBwYWNrZXQgd2lsbCBnbyB1cCwgbGluayBiYWNrIGludG8KLQkJCQkgY2hhaW4gYW5kIGNvdW50IGl0ICovCi0JCQlwZmlyc3QtPm5leHQgPSBwbmV4dDsKLQkJCXBsYXN0ID0gcGZpcnN0OwotCQkJbnVtKys7Ci0KLSNpZmRlZiBCQ01EQkcKLQkJCWlmIChCUkNNRl9HTE9NX09OKCkpIHsKLQkJCQlCUkNNRl9HTE9NKCgiJXMgc3ViZnJhbWUgJWQgdG8gc3RhY2ssICVwIgotCQkJCQkgICAgIiglcC8lZCkgbnh0L2xuayAlcC8lcFxuIiwKLQkJCQkJICAgIF9fZnVuY19fLCBudW0sIHBmaXJzdCwgcGZpcnN0LT5kYXRhLAotCQkJCQkgICAgcGZpcnN0LT5sZW4sIHBmaXJzdC0+bmV4dCwKLQkJCQkJICAgIHBmaXJzdC0+cHJldikpOwotCQkJCXByaW50X2hleF9kdW1wX2J5dGVzKCIiLCBEVU1QX1BSRUZJWF9PRkZTRVQsCi0JCQkJCQlwZmlyc3QtPmRhdGEsCi0JCQkJCQltaW5fdChpbnQsIHBmaXJzdC0+bGVuLCAzMikpOwotCQkJfQotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwotCQl9Ci0JCWlmIChudW0pIHsKLQkJCWJyY21mX3NkYnJjbV9zZHVubG9jayhidXMpOwotCQkJYnJjbWZfcnhfZnJhbWUoYnVzLT5kcnZyLCBpZmlkeCwgc2F2ZV9wZmlyc3QsIG51bSk7Ci0JCQlicmNtZl9zZGJyY21fc2Rsb2NrKGJ1cyk7Ci0JCX0KLQotCQlidXMtPnJ4Z2xvbWZyYW1lcysrOwotCQlidXMtPnJ4Z2xvbXBrdHMgKz0gbnVtOwotCX0KLQlyZXR1cm4gbnVtOwotfQotCi0vKiBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBtYXkgYmUgbW9yZSBmcmFtZXMgdG8gcmVhZCAqLwotc3RhdGljIHVpbnQKLWJyY21mX3NkYnJjbV9yZWFkZnJhbWVzKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdWludCBtYXhmcmFtZXMsIGJvb2wgKmZpbmlzaGVkKQotewotCXN0cnVjdCBicmNtZl9zZGlvX2NhcmQgKmNhcmQgPSBidXMtPmNhcmQ7Ci0KLQl1MTYgbGVuLCBjaGVjazsJLyogRXh0cmFjdGVkIGhhcmR3YXJlIGhlYWRlciBmaWVsZHMgKi8KLQl1OCBjaGFuLCBzZXEsIGRvZmY7CS8qIEV4dHJhY3RlZCBzb2Z0d2FyZSBoZWFkZXIgZmllbGRzICovCi0JdTggZmNiaXRzOwkJLyogRXh0cmFjdGVkIGZjYml0cyBmcm9tIHNvZnR3YXJlIGhlYWRlciAqLwotCi0Jc3RydWN0IHNrX2J1ZmYgKnBrdDsJCS8qIFBhY2tldCBmb3IgZXZlbnQgb3IgZGF0YSBmcmFtZXMgKi8KLQl1MTYgcGFkOwkJLyogTnVtYmVyIG9mIHBhZCBieXRlcyB0byByZWFkICovCi0JdTE2IHJkbGVuOwkJLyogVG90YWwgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgKi8KLQl1OCByeHNlcTsJCS8qIE5leHQgc2VxdWVuY2UgbnVtYmVyIHRvIGV4cGVjdCAqLwotCXVpbnQgcnhsZWZ0ID0gMDsJLyogUmVtYWluaW5nIG51bWJlciBvZiBmcmFtZXMgYWxsb3dlZCAqLwotCWludCBzZHJldDsJCS8qIFJldHVybiBjb2RlIGZyb20gY2FsbHMgKi8KLQl1OCB0eG1heDsJCS8qIE1heGltdW0gdHggc2VxdWVuY2Ugb2ZmZXJlZCAqLwotCWJvb2wgbGVuX2NvbnNpc3RlbnQ7CS8qIFJlc3VsdCBvZiBjb21wYXJpbmcgcmVhZGFoZWFkIGxlbiBhbmQKLQkJCQkJIGxlbiBmcm9tIGh3LWhkciAqLwotCXU4ICpyeGJ1ZjsKLQlpbnQgaWZpZHggPSAwOwotCXVpbnQgcnhjb3VudCA9IDA7CS8qIFRvdGFsIGZyYW1lcyByZWFkICovCi0KLSNpZiBkZWZpbmVkKEJDTURCRykgfHwgZGVmaW5lZChTRFRFU1QpCi0JYm9vbCBzZHRlc3QgPSBmYWxzZTsJLyogVG8gbGltaXQgbWVzc2FnZSBzcGV3IGZyb20gdGVzdCBtb2RlICovCi0jZW5kaWYKLQotCUJSQ01GX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwotCi0jaWZkZWYgU0RURVNUCi0JLyogQWxsb3cgcGt0Z2VuIHRvIG92ZXJyaWRlIG1heGZyYW1lcyAqLwotCWlmIChidXMtPnBrdGdlbl9jb3VudCAmJiAoYnVzLT5wa3RnZW5fbW9kZSA9PSBCUkNNRl9QS1RHRU5fUkVDVikpIHsKLQkJbWF4ZnJhbWVzID0gYnVzLT5wa3RnZW5fY291bnQ7Ci0JCXNkdGVzdCA9IHRydWU7Ci0JfQotI2VuZGlmCi0KLQkvKiBOb3QgZmluaXNoZWQgdW5sZXNzIHdlIGVuY291bnRlciBubyBtb3JlIGZyYW1lcyBpbmRpY2F0aW9uICovCi0JKmZpbmlzaGVkID0gZmFsc2U7Ci0KLQlmb3IgKHJ4c2VxID0gYnVzLT5yeF9zZXEsIHJ4bGVmdCA9IG1heGZyYW1lczsKLQkgICAgICFidXMtPnJ4c2tpcCAmJiByeGxlZnQgJiYgYnVzLT5kcnZyLT5idXNzdGF0ZSAhPSBCUkNNRl9CVVNfRE9XTjsKLQkgICAgIHJ4c2VxKyssIHJ4bGVmdC0tKSB7Ci0KLQkJLyogSGFuZGxlIGdsb21taW5nIHNlcGFyYXRlbHkgKi8KLQkJaWYgKGJ1cy0+Z2xvbSB8fCBidXMtPmdsb21kKSB7Ci0JCQl1OCBjbnQ7Ci0JCQlCUkNNRl9HTE9NKCgiJXM6IGNhbGxpbmcgcnhnbG9tOiBnbG9tZCAlcCwgZ2xvbSAlcFxuIiwKLQkJCQkgICAgX19mdW5jX18sIGJ1cy0+Z2xvbWQsIGJ1cy0+Z2xvbSkpOwotCQkJY250ID0gYnJjbWZfc2RicmNtX3J4Z2xvbShidXMsIHJ4c2VxKTsKLQkJCUJSQ01GX0dMT00oKCIlczogcnhnbG9tIHJldHVybmVkICVkXG4iLCBfX2Z1bmNfXywgY250KSk7Ci0JCQlyeHNlcSArPSBjbnQgLSAxOwotCQkJcnhsZWZ0ID0gKHJ4bGVmdCA+IGNudCkgPyAocnhsZWZ0IC0gY250KSA6IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIFRyeSBkb2luZyBzaW5nbGUgcmVhZCBpZiB3ZSBjYW4gKi8KLQkJaWYgKGJyY21mX3JlYWRhaGVhZCAmJiBidXMtPm5leHRsZW4pIHsKLQkJCXUxNiBuZXh0bGVuID0gYnVzLT5uZXh0bGVuOwotCQkJYnVzLT5uZXh0bGVuID0gMDsKLQotCQkJaWYgKGJ1cy0+YnVzID09IFNQSV9CVVMpIHsKLQkJCQlyZGxlbiA9IGxlbiA9IG5leHRsZW47Ci0JCQl9IGVsc2UgewotCQkJCXJkbGVuID0gbGVuID0gbmV4dGxlbiA8PCA0OwotCi0JCQkJLyogUGFkIHJlYWQgdG8gYmxvY2tzaXplIGZvciBlZmZpY2llbmN5ICovCi0JCQkJaWYgKGJ1cy0+cm91bmR1cCAmJiBidXMtPmJsb2Nrc2l6ZQotCQkJCSAgICAmJiAocmRsZW4gPiBidXMtPmJsb2Nrc2l6ZSkpIHsKLQkJCQkJcGFkID0KLQkJCQkJICAgIGJ1cy0+YmxvY2tzaXplIC0KLQkJCQkJICAgIChyZGxlbiAlIGJ1cy0+YmxvY2tzaXplKTsKLQkJCQkJaWYgKChwYWQgPD0gYnVzLT5yb3VuZHVwKQotCQkJCQkgICAgJiYgKHBhZCA8IGJ1cy0+YmxvY2tzaXplKQotCQkJCQkgICAgJiYgKChyZGxlbiArIHBhZCArIGZpcnN0cmVhZCkgPAotCQkJCQkJTUFYX1JYX0RBVEFTWikpCi0JCQkJCQlyZGxlbiArPSBwYWQ7Ci0JCQkJfSBlbHNlIGlmIChyZGxlbiAlIEJSQ01GX1NEQUxJR04pIHsKLQkJCQkJcmRsZW4gKz0KLQkJCQkJICAgIEJSQ01GX1NEQUxJR04gLSAocmRsZW4gJSBCUkNNRl9TREFMSUdOKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIFdlIHVzZSBidXMtPnJ4Y3RsIGJ1ZmZlciBpbiBXaW5YUCBmb3IgaW5pdGlhbAotCQkJICogY29udHJvbCBwa3QgcmVjZWl2ZXMuCi0JCQkgKiBMYXRlciB3ZSB1c2UgYnVmZmVyLXBvbGwgZm9yIGRhdGEgYXMgd2VsbAotCQkJICogYXMgY29udHJvbCBwYWNrZXRzLgotCQkJICogVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIGRoZCByZWNlaXZlcyBmdWxsCi0JCQkgKiBmcmFtZSBpbiBnU1BJIHVubGlrZSBTRElPLgotCQkJICogQWZ0ZXIgdGhlIGZyYW1lIGlzIHJlY2VpdmVkIHdlIGhhdmUgdG8KLQkJCSAqIGRpc3Rpbmd1aXNoIHdoZXRoZXIgaXQgaXMgZGF0YQotCQkJICogb3Igbm9uLWRhdGEgZnJhbWUuCi0JCQkgKi8KLQkJCS8qIEFsbG9jYXRlIGEgcGFja2V0IGJ1ZmZlciAqLwotCQkJcGt0ID0gYnJjbXVfcGt0X2J1Zl9nZXRfc2tiKHJkbGVuICsgQlJDTUZfU0RBTElHTik7Ci0JCQlpZiAoIXBrdCkgewotCQkJCWlmIChidXMtPmJ1cyA9PSBTUElfQlVTKSB7Ci0JCQkJCWJ1cy0+dXNlYnVmcG9vbCA9IGZhbHNlOwotCQkJCQlidXMtPnJ4Y3RsID0gYnVzLT5yeGJ1ZjsKLQkJCQkJaWYgKGJyY21mX2FsaWduY3RsKSB7Ci0JCQkJCQlidXMtPnJ4Y3RsICs9IGZpcnN0cmVhZDsKLQkJCQkJCXBhZCA9ICgodW5zaWduZWQgbG9uZylidXMtPnJ4Y3RsICUKLQkJCQkJCSAgICAgIEJSQ01GX1NEQUxJR04pOwotCQkJCQkJaWYgKHBhZCkKLQkJCQkJCQlidXMtPnJ4Y3RsICs9Ci0JCQkJCQkJICAgIChCUkNNRl9TREFMSUdOIC0gcGFkKTsKLQkJCQkJCWJ1cy0+cnhjdGwgLT0gZmlyc3RyZWFkOwotCQkJCQl9Ci0JCQkJCXJ4YnVmID0gYnVzLT5yeGN0bDsKLQkJCQkJLyogUmVhZCB0aGUgZW50aXJlIGZyYW1lICovCi0JCQkJCXNkcmV0ID0gYnJjbWZfc2RjYXJkX3JlY3ZfYnVmKGNhcmQsCi0JCQkJCQkgICBicmNtZl9zZGNhcmRfY3VyX3Nid2FkKGNhcmQpLAotCQkJCQkJICAgU0RJT19GVU5DXzIsIEYyU1lOQywKLQkJCQkJCSAgIHJ4YnVmLCByZGxlbiwKLQkJCQkJCSAgIE5VTEwsIE5VTEwsIE5VTEwpOwotCQkJCQlidXMtPmYycnhkYXRhKys7Ci0KLQkJCQkJLyogQ29udHJvbCBmcmFtZSBmYWlsdXJlcyBuZWVkCi0JCQkJCSByZXRyYW5zbWlzc2lvbiAqLwotCQkJCQlpZiAoc2RyZXQgPCAwKSB7Ci0JCQkJCQlCUkNNRl9FUlJPUigoIiVzOiByZWFkICVkICIKLQkJCQkJCQkgICAgICJjb250cm9sIGJ5dGVzICIKLQkJCQkJCQkgICAgICJmYWlsZWQ6ICVkXG4iLAotCQkJCQkJCSAgICAgX19mdW5jX18sCi0JCQkJCQkJICAgICByZGxlbiwgc2RyZXQpKTsKLQkJCQkJCS8qIGRoZC5yeF9jdGxlcnJzIGlzIGhpZ2hlciAqLwotCQkJCQkJYnVzLT5yeGNfZXJyb3JzKys7Ci0JCQkJCQlicmNtZl9zZGJyY21fcnhmYWlsKGJ1cywgdHJ1ZSwKLQkJCQkJCSAgICAgICAoYnVzLT5idXMgPT0KLQkJCQkJCQlTUElfQlVTKSA/IGZhbHNlCi0JCQkJCQkgICAgICAgOiB0cnVlKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLyogR2l2ZSB1cCBvbiBkYXRhLAotCQkJCQlyZXF1ZXN0IHJ0eCBvZiBldmVudHMgKi8KLQkJCQkJQlJDTUZfRVJST1IoKCIlcyAobmV4dGxlbik6ICIKLQkJCQkJCSAgICAgImJyY211X3BrdF9idWZfZ2V0X3NrYiAiCi0JCQkJCQkgICAgICJmYWlsZWQ6IgotCQkJCQkJICAgICAiIGxlbiAlZCByZGxlbiAlZCBleHBlY3RlZCIKLQkJCQkJCSAgICAgIiByeHNlcSAlZFxuIiwgX19mdW5jX18sCi0JCQkJCQkgICAgIGxlbiwgcmRsZW4sIHJ4c2VxKSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGJ1cy0+YnVzID09IFNQSV9CVVMpCi0JCQkJCWJ1cy0+dXNlYnVmcG9vbCA9IHRydWU7Ci0KLQkJCQlQS1RBTElHTihwa3QsIHJkbGVuLCBCUkNNRl9TREFMSUdOKTsKLQkJCQlyeGJ1ZiA9ICh1OCAqKSAocGt0LT5kYXRhKTsKLQkJCQkvKiBSZWFkIHRoZSBlbnRpcmUgZnJhbWUgKi8KLQkJCQlzZHJldCA9IGJyY21mX3NkY2FyZF9yZWN2X2J1ZihjYXJkLAotCQkJCQkJYnJjbWZfc2RjYXJkX2N1cl9zYndhZChjYXJkKSwKLQkJCQkJCVNESU9fRlVOQ18yLCBGMlNZTkMsCi0JCQkJCQlyeGJ1ZiwgcmRsZW4sCi0JCQkJCQlwa3QsIE5VTEwsIE5VTEwpOwotCQkJCWJ1cy0+ZjJyeGRhdGErKzsKLQotCQkJCWlmIChzZHJldCA8IDApIHsKLQkJCQkJQlJDTUZfRVJST1IoKCIlcyAobmV4dGxlbik6IHJlYWQgJWQiCi0JCQkJCQkgICAgICIgYnl0ZXMgZmFpbGVkOiAlZFxuIiwKLQkJCQkJCSAgICAgX19mdW5jX18sIHJkbGVuLCBzZHJldCkpOwotCQkJCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKHBrdCk7Ci0JCQkJCWJ1cy0+ZHJ2ci0+cnhfZXJyb3JzKys7Ci0JCQkJCS8qIEZvcmNlIHJldHJ5IHcvbm9ybWFsIGhlYWRlciByZWFkLgotCQkJCQkgKiBEb24ndCBhdHRlbXB0IE5BSyBmb3IKLQkJCQkJICogZ1NQSQotCQkJCQkgKi8KLQkJCQkJYnJjbWZfc2RicmNtX3J4ZmFpbChidXMsIHRydWUsCi0JCQkJCQkgICAgICAgKGJ1cy0+YnVzID09Ci0JCQkJCQkJU1BJX0JVUykgPyBmYWxzZSA6Ci0JCQkJCQkgICAgICAgdHJ1ZSk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQotCQkJLyogTm93IGNoZWNrIHRoZSBoZWFkZXIgKi8KLQkJCW1lbWNweShidXMtPnJ4aGRyLCByeGJ1ZiwgU0RQQ01fSERSTEVOKTsKLQotCQkJLyogRXh0cmFjdCBoYXJkd2FyZSBoZWFkZXIgZmllbGRzICovCi0JCQlsZW4gPSBnZXRfdW5hbGlnbmVkX2xlMTYoYnVzLT5yeGhkcik7Ci0JCQljaGVjayA9IGdldF91bmFsaWduZWRfbGUxNihidXMtPnJ4aGRyICsgc2l6ZW9mKHUxNikpOwotCi0JCQkvKiBBbGwgemVyb3MgbWVhbnMgcmVhZGFoZWFkIGluZm8gd2FzIGJhZCAqLwotCQkJaWYgKCEobGVuIHwgY2hlY2spKSB7Ci0JCQkJQlJDTUZfSU5GTygoIiVzIChuZXh0bGVuKTogcmVhZCB6ZXJvcyBpbiBIVyAiCi0JCQkJCSAgICAiaGVhZGVyPz8/XG4iLCBfX2Z1bmNfXykpOwotCQkJCWJyY21mX3NkYnJjbV9wa3RmcmVlMihidXMsIHBrdCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qIFZhbGlkYXRlIGNoZWNrIGJ5dGVzICovCi0JCQlpZiAoKHUxNil+KGxlbiBeIGNoZWNrKSkgewotCQkJCUJSQ01GX0VSUk9SKCgiJXMgKG5leHRsZW4pOiBIVyBoZHIgZXJyb3I6IgotCQkJCQkgICAgICIgbmV4dGxlbi9sZW4vY2hlY2siCi0JCQkJCSAgICAgIiAweCUwNHgvMHglMDR4LzB4JTA0eFxuIiwKLQkJCQkJICAgICBfX2Z1bmNfXywgbmV4dGxlbiwgbGVuLCBjaGVjaykpOwotCQkJCWJ1cy0+cnhfYmFkaGRyKys7Ci0JCQkJYnJjbWZfc2RicmNtX3J4ZmFpbChidXMsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJYnJjbWZfc2RicmNtX3BrdGZyZWUyKGJ1cywgcGt0KTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLyogVmFsaWRhdGUgZnJhbWUgbGVuZ3RoICovCi0JCQlpZiAobGVuIDwgU0RQQ01fSERSTEVOKSB7Ci0JCQkJQlJDTUZfRVJST1IoKCIlcyAobmV4dGxlbik6IEhXIGhkciBsZW5ndGggIgotCQkJCQkgICAgICJpbnZhbGlkOiAlZFxuIiwgX19mdW5jX18sIGxlbikpOwotCQkJCWJyY21mX3NkYnJjbV9wa3RmcmVlMihidXMsIHBrdCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qIENoZWNrIGZvciBjb25zaXN0ZW5jeSB3aXRocmVhZGFoZWFkIGluZm8gKi8KLQkJCWxlbl9jb25zaXN0ZW50ID0gKG5leHRsZW4gIT0gKHJvdW5kdXAobGVuLCAxNikgPj4gNCkpOwotCQkJaWYgKGxlbl9jb25zaXN0ZW50KSB7Ci0JCQkJLyogTWlzbWF0Y2gsIGZvcmNlIHJldHJ5IHcvbm9ybWFsCi0JCQkJCWhlYWRlciAobWF5IGJlID40SykgKi8KLQkJCQlCUkNNRl9FUlJPUigoIiVzIChuZXh0bGVuKTogbWlzbWF0Y2gsICIKLQkJCQkJICAgICAibmV4dGxlbiAlZCBsZW4gJWQgcm5kICVkOyAiCi0JCQkJCSAgICAgImV4cGVjdGVkIHJ4c2VxICVkXG4iLAotCQkJCQkgICAgIF9fZnVuY19fLCBuZXh0bGVuLAotCQkJCQkgICAgIGxlbiwgcm91bmR1cChsZW4sIDE2KSwgcnhzZXEpKTsKLQkJCQlicmNtZl9zZGJyY21fcnhmYWlsKGJ1cywgdHJ1ZSwKLQkJCQkJCSAgYnVzLT5idXMgIT0gU1BJX0JVUyk7Ci0JCQkJYnJjbWZfc2RicmNtX3BrdGZyZWUyKGJ1cywgcGt0KTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLyogRXh0cmFjdCBzb2Z0d2FyZSBoZWFkZXIgZmllbGRzICovCi0JCQljaGFuID0gU0RQQ01fUEFDS0VUX0NIQU5ORUwoCi0JCQkJCSZidXMtPnJ4aGRyW1NEUENNX0ZSQU1FVEFHX0xFTl0pOwotCQkJc2VxID0gU0RQQ01fUEFDS0VUX1NFUVVFTkNFKAotCQkJCQkmYnVzLT5yeGhkcltTRFBDTV9GUkFNRVRBR19MRU5dKTsKLQkJCWRvZmYgPSBTRFBDTV9ET0ZGU0VUX1ZBTFVFKAotCQkJCQkmYnVzLT5yeGhkcltTRFBDTV9GUkFNRVRBR19MRU5dKTsKLQkJCXR4bWF4ID0gU0RQQ01fV0lORE9XX1ZBTFVFKAotCQkJCQkmYnVzLT5yeGhkcltTRFBDTV9GUkFNRVRBR19MRU5dKTsKLQotCQkJYnVzLT5uZXh0bGVuID0KLQkJCSAgICBidXMtPnJ4aGRyW1NEUENNX0ZSQU1FVEFHX0xFTiArCi0JCQkJICAgICAgIFNEUENNX05FWFRMRU5fT0ZGU0VUXTsKLQkJCWlmICgoYnVzLT5uZXh0bGVuIDw8IDQpID4gTUFYX1JYX0RBVEFTWikgewotCQkJCUJSQ01GX0lORk8oKCIlcyAobmV4dGxlbik6IGdvdCBmcmFtZSB3L25leHRsZW4iCi0JCQkJCSAgICAiIHRvbyBsYXJnZSAoJWQpLCBzZXEgJWRcbiIsCi0JCQkJCSAgICBfX2Z1bmNfXywgYnVzLT5uZXh0bGVuLCBzZXEpKTsKLQkJCQlidXMtPm5leHRsZW4gPSAwOwotCQkJfQotCi0JCQlidXMtPmRydnItPnJ4X3JlYWRhaGVhZF9jbnQrKzsKLQotCQkJLyogSGFuZGxlIEZsb3cgQ29udHJvbCAqLwotCQkJZmNiaXRzID0gU0RQQ01fRkNNQVNLX1ZBTFVFKAotCQkJCQkmYnVzLT5yeGhkcltTRFBDTV9GUkFNRVRBR19MRU5dKTsKLQotCQkJaWYgKGJ1cy0+Zmxvd2NvbnRyb2wgIT0gZmNiaXRzKSB7Ci0JCQkJaWYgKH5idXMtPmZsb3djb250cm9sICYgZmNiaXRzKQotCQkJCQlidXMtPmZjX3hvZmYrKzsKLQotCQkJCWlmIChidXMtPmZsb3djb250cm9sICYgfmZjYml0cykKLQkJCQkJYnVzLT5mY194b24rKzsKLQotCQkJCWJ1cy0+ZmNfcmN2ZCsrOwotCQkJCWJ1cy0+Zmxvd2NvbnRyb2wgPSBmY2JpdHM7Ci0JCQl9Ci0KLQkJCS8qIENoZWNrIGFuZCB1cGRhdGUgc2VxdWVuY2UgbnVtYmVyICovCi0JCQlpZiAocnhzZXEgIT0gc2VxKSB7Ci0JCQkJQlJDTUZfSU5GTygoIiVzIChuZXh0bGVuKTogcnhfc2VxICVkLCBleHBlY3RlZCAiCi0JCQkJCSAgICAiJWRcbiIsIF9fZnVuY19fLCBzZXEsIHJ4c2VxKSk7Ci0JCQkJYnVzLT5yeF9iYWRzZXErKzsKLQkJCQlyeHNlcSA9IHNlcTsKLQkJCX0KLQotCQkJLyogQ2hlY2sgd2luZG93IGZvciBzYW5pdHkgKi8KLQkJCWlmICgodTgpICh0eG1heCAtIGJ1cy0+dHhfc2VxKSA+IDB4NDApIHsKLQkJCQlCUkNNRl9FUlJPUigoIiVzOiBnb3QgdW5saWtlbHkgdHggbWF4ICVkIHdpdGggIgotCQkJCQkgICAgICJ0eF9zZXEgJWRcbiIsCi0JCQkJCSAgICAgX19mdW5jX18sIHR4bWF4LCBidXMtPnR4X3NlcSkpOwotCQkJCXR4bWF4ID0gYnVzLT50eF9zZXEgKyAyOwotCQkJfQotCQkJYnVzLT50eF9tYXggPSB0eG1heDsKLQotI2lmZGVmIEJDTURCRwotCQkJaWYgKEJSQ01GX0JZVEVTX09OKCkgJiYgQlJDTUZfREFUQV9PTigpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fREVCVUcgIlJ4IERhdGE6XG4iKTsKLQkJCQlwcmludF9oZXhfZHVtcF9ieXRlcygiIiwgRFVNUF9QUkVGSVhfT0ZGU0VULAotCQkJCQkJICAgICByeGJ1ZiwgbGVuKTsKLQkJCX0gZWxzZSBpZiAoQlJDTUZfSERSU19PTigpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fREVCVUcgIlJ4SGRyOlxuIik7Ci0JCQkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIiIsIERVTVBfUFJFRklYX09GRlNFVCwKLQkJCQkJCSAgICAgYnVzLT5yeGhkciwgU0RQQ01fSERSTEVOKTsKLQkJCX0KLSNlbmRpZgotCi0JCQlpZiAoY2hhbiA9PSBTRFBDTV9DT05UUk9MX0NIQU5ORUwpIHsKLQkJCQlpZiAoYnVzLT5idXMgPT0gU1BJX0JVUykgewotCQkJCQlicmNtZl9zZGJyY21fcmVhZF9jb250cm9sKGJ1cywgcnhidWYsCi0JCQkJCQkJCSAgbGVuLCBkb2ZmKTsKLQkJCQl9IGVsc2UgewotCQkJCQlCUkNNRl9FUlJPUigoIiVzIChuZXh0bGVuKTogcmVhZGFoZWFkIgotCQkJCQkJICAgICAiIG9uIGNvbnRyb2wgcGFja2V0ICVkP1xuIiwKLQkJCQkJCSAgICAgX19mdW5jX18sIHNlcSkpOwotCQkJCQkvKiBGb3JjZSByZXRyeSB3L25vcm1hbCBoZWFkZXIgcmVhZCAqLwotCQkJCQlidXMtPm5leHRsZW4gPSAwOwotCQkJCQlicmNtZl9zZGJyY21fcnhmYWlsKGJ1cywgZmFsc2UsIHRydWUpOwotCQkJCX0KLQkJCQlicmNtZl9zZGJyY21fcGt0ZnJlZTIoYnVzLCBwa3QpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoKGJ1cy0+YnVzID09IFNQSV9CVVMpICYmICFidXMtPnVzZWJ1ZnBvb2wpIHsKLQkJCQlCUkNNRl9FUlJPUigoIlJlY2VpdmVkICVkIGJ5dGVzIG9uICVkIGNoYW5uZWwuIgotCQkJCQkgICAgICIgUnVubmluZyBvdXQgb2YgIiAicnggcGt0YnVmJ3Mgb3IiCi0JCQkJCSAgICAgIiBub3QgeWV0IG1hbGxvY2VkLlxuIiwKLQkJCQkJICAgICBsZW4sIGNoYW4pKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLyogVmFsaWRhdGUgZGF0YSBvZmZzZXQgKi8KLQkJCWlmICgoZG9mZiA8IFNEUENNX0hEUkxFTikgfHwgKGRvZmYgPiBsZW4pKSB7Ci0JCQkJQlJDTUZfRVJST1IoKCIlcyAobmV4dGxlbik6IGJhZCBkYXRhIG9mZnNldCAlZDoiCi0JCQkJCSAgICAgIiBIVyBsZW4gJWQgbWluICVkXG4iLCBfX2Z1bmNfXywKLQkJCQkJICAgICBkb2ZmLCBsZW4sIFNEUENNX0hEUkxFTikpOwotCQkJCWJyY21mX3NkYnJjbV9yeGZhaWwoYnVzLCBmYWxzZSwgZmFsc2UpOwotCQkJCWJyY21mX3NkYnJjbV9wa3RmcmVlMihidXMsIHBrdCk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qIEFsbCBkb25lIHdpdGggdGhpcyBvbmUgLS0gbm93IGRlbGl2ZXIgdGhlIHBhY2tldCAqLwotCQkJZ290byBkZWxpdmVyOwotCQl9Ci0JCS8qIGdTUEkgZnJhbWVzIHNob3VsZCBub3QgYmUgaGFuZGxlZCBpbiBmcmFjdGlvbnMgKi8KLQkJaWYgKGJ1cy0+YnVzID09IFNQSV9CVVMpCi0JCQlicmVhazsKLQotCQkvKiBSZWFkIGZyYW1lIGhlYWRlciAoaGFyZHdhcmUgYW5kIHNvZnR3YXJlKSAqLwotCQlzZHJldCA9IGJyY21mX3NkY2FyZF9yZWN2X2J1ZihjYXJkLAotCQkJCWJyY21mX3NkY2FyZF9jdXJfc2J3YWQoY2FyZCksCi0JCQkJU0RJT19GVU5DXzIsIEYyU1lOQywgYnVzLT5yeGhkciwgZmlyc3RyZWFkLAotCQkJCU5VTEwsIE5VTEwsIE5VTEwpOwotCQlidXMtPmYycnhoZHJzKys7Ci0KLQkJaWYgKHNkcmV0IDwgMCkgewotCQkJQlJDTUZfRVJST1IoKCIlczogUlhIRUFERVIgRkFJTEVEOiAlZFxuIiwgX19mdW5jX18sCi0JCQkJICAgICBzZHJldCkpOwotCQkJYnVzLT5yeF9oZHJmYWlsKys7Ci0JCQlicmNtZl9zZGJyY21fcnhmYWlsKGJ1cywgdHJ1ZSwgdHJ1ZSk7Ci0JCQljb250aW51ZTsKLQkJfQotI2lmZGVmIEJDTURCRwotCQlpZiAoQlJDTUZfQllURVNfT04oKSB8fCBCUkNNRl9IRFJTX09OKCkpIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICJSeEhkcjpcbiIpOwotCQkJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIiIsIERVTVBfUFJFRklYX09GRlNFVCwKLQkJCQkJICAgICBidXMtPnJ4aGRyLCBTRFBDTV9IRFJMRU4pOwotCQl9Ci0jZW5kaWYKLQotCQkvKiBFeHRyYWN0IGhhcmR3YXJlIGhlYWRlciBmaWVsZHMgKi8KLQkJbGVuID0gZ2V0X3VuYWxpZ25lZF9sZTE2KGJ1cy0+cnhoZHIpOwotCQljaGVjayA9IGdldF91bmFsaWduZWRfbGUxNihidXMtPnJ4aGRyICsgc2l6ZW9mKHUxNikpOwotCi0JCS8qIEFsbCB6ZXJvcyBtZWFucyBubyBtb3JlIGZyYW1lcyAqLwotCQlpZiAoIShsZW4gfCBjaGVjaykpIHsKLQkJCSpmaW5pc2hlZCA9IHRydWU7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIFZhbGlkYXRlIGNoZWNrIGJ5dGVzICovCi0JCWlmICgodTE2KSB+KGxlbiBeIGNoZWNrKSkgewotCQkJQlJDTUZfRVJST1IoKCIlczogSFcgaGRyIGVycjogbGVuL2NoZWNrICIKLQkJCQkgICAgICIweCUwNHgvMHglMDR4XG4iLCBfX2Z1bmNfXywgbGVuLCBjaGVjaykpOwotCQkJYnVzLT5yeF9iYWRoZHIrKzsKLQkJCWJyY21mX3NkYnJjbV9yeGZhaWwoYnVzLCBmYWxzZSwgZmFsc2UpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBWYWxpZGF0ZSBmcmFtZSBsZW5ndGggKi8KLQkJaWYgKGxlbiA8IFNEUENNX0hEUkxFTikgewotCQkJQlJDTUZfRVJST1IoKCIlczogSFcgaGRyIGxlbmd0aCBpbnZhbGlkOiAlZFxuIiwKLQkJCQkgICAgIF9fZnVuY19fLCBsZW4pKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogRXh0cmFjdCBzb2Z0d2FyZSBoZWFkZXIgZmllbGRzICovCi0JCWNoYW4gPSBTRFBDTV9QQUNLRVRfQ0hBTk5FTCgmYnVzLT5yeGhkcltTRFBDTV9GUkFNRVRBR19MRU5dKTsKLQkJc2VxID0gU0RQQ01fUEFDS0VUX1NFUVVFTkNFKCZidXMtPnJ4aGRyW1NEUENNX0ZSQU1FVEFHX0xFTl0pOwotCQlkb2ZmID0gU0RQQ01fRE9GRlNFVF9WQUxVRSgmYnVzLT5yeGhkcltTRFBDTV9GUkFNRVRBR19MRU5dKTsKLQkJdHhtYXggPSBTRFBDTV9XSU5ET1dfVkFMVUUoJmJ1cy0+cnhoZHJbU0RQQ01fRlJBTUVUQUdfTEVOXSk7Ci0KLQkJLyogVmFsaWRhdGUgZGF0YSBvZmZzZXQgKi8KLQkJaWYgKChkb2ZmIDwgU0RQQ01fSERSTEVOKSB8fCAoZG9mZiA+IGxlbikpIHsKLQkJCUJSQ01GX0VSUk9SKCgiJXM6IEJhZCBkYXRhIG9mZnNldCAlZDogSFcgbGVuICVkLCIKLQkJCQkgICAgICIgbWluICVkIHNlcSAlZFxuIiwgX19mdW5jX18sIGRvZmYsCi0JCQkJICAgICBsZW4sIFNEUENNX0hEUkxFTiwgc2VxKSk7Ci0JCQlidXMtPnJ4X2JhZGhkcisrOwotCQkJYnJjbWZfc2RicmNtX3J4ZmFpbChidXMsIGZhbHNlLCBmYWxzZSk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIFNhdmUgdGhlIHJlYWRhaGVhZCBsZW5ndGggaWYgdGhlcmUgaXMgb25lICovCi0JCWJ1cy0+bmV4dGxlbiA9Ci0JCSAgICBidXMtPnJ4aGRyW1NEUENNX0ZSQU1FVEFHX0xFTiArIFNEUENNX05FWFRMRU5fT0ZGU0VUXTsKLQkJaWYgKChidXMtPm5leHRsZW4gPDwgNCkgPiBNQVhfUlhfREFUQVNaKSB7Ci0JCQlCUkNNRl9JTkZPKCgiJXMgKG5leHRsZW4pOiBnb3QgZnJhbWUgdy9uZXh0bGVuIHRvbyIKLQkJCQkgICAgIiBsYXJnZSAoJWQpLCBzZXEgJWRcbiIsCi0JCQkJICAgIF9fZnVuY19fLCBidXMtPm5leHRsZW4sIHNlcSkpOwotCQkJYnVzLT5uZXh0bGVuID0gMDsKLQkJfQotCi0JCS8qIEhhbmRsZSBGbG93IENvbnRyb2wgKi8KLQkJZmNiaXRzID0gU0RQQ01fRkNNQVNLX1ZBTFVFKCZidXMtPnJ4aGRyW1NEUENNX0ZSQU1FVEFHX0xFTl0pOwotCi0JCWlmIChidXMtPmZsb3djb250cm9sICE9IGZjYml0cykgewotCQkJaWYgKH5idXMtPmZsb3djb250cm9sICYgZmNiaXRzKQotCQkJCWJ1cy0+ZmNfeG9mZisrOwotCi0JCQlpZiAoYnVzLT5mbG93Y29udHJvbCAmIH5mY2JpdHMpCi0JCQkJYnVzLT5mY194b24rKzsKLQotCQkJYnVzLT5mY19yY3ZkKys7Ci0JCQlidXMtPmZsb3djb250cm9sID0gZmNiaXRzOwotCQl9Ci0KLQkJLyogQ2hlY2sgYW5kIHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXIgKi8KLQkJaWYgKHJ4c2VxICE9IHNlcSkgewotCQkJQlJDTUZfSU5GTygoIiVzOiByeF9zZXEgJWQsIGV4cGVjdGVkICVkXG4iLCBfX2Z1bmNfXywKLQkJCQkgICAgc2VxLCByeHNlcSkpOwotCQkJYnVzLT5yeF9iYWRzZXErKzsKLQkJCXJ4c2VxID0gc2VxOwotCQl9Ci0KLQkJLyogQ2hlY2sgd2luZG93IGZvciBzYW5pdHkgKi8KLQkJaWYgKCh1OCkgKHR4bWF4IC0gYnVzLT50eF9zZXEpID4gMHg0MCkgewotCQkJQlJDTUZfRVJST1IoKCIlczogdW5saWtlbHkgdHggbWF4ICVkIHdpdGggdHhfc2VxICVkXG4iLAotCQkJCSAgICAgX19mdW5jX18sIHR4bWF4LCBidXMtPnR4X3NlcSkpOwotCQkJdHhtYXggPSBidXMtPnR4X3NlcSArIDI7Ci0JCX0KLQkJYnVzLT50eF9tYXggPSB0eG1heDsKLQotCQkvKiBDYWxsIGEgc2VwYXJhdGUgZnVuY3Rpb24gZm9yIGNvbnRyb2wgZnJhbWVzICovCi0JCWlmIChjaGFuID09IFNEUENNX0NPTlRST0xfQ0hBTk5FTCkgewotCQkJYnJjbWZfc2RicmNtX3JlYWRfY29udHJvbChidXMsIGJ1cy0+cnhoZHIsIGxlbiwgZG9mZik7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIHByZWNvbmRpdGlvbjogY2hhbiBpcyBlaXRoZXIgU0RQQ01fREFUQV9DSEFOTkVMLAotCQkgICBTRFBDTV9FVkVOVF9DSEFOTkVMLCBTRFBDTV9URVNUX0NIQU5ORUwgb3IKLQkJICAgU0RQQ01fR0xPTV9DSEFOTkVMICovCi0KLQkJLyogTGVuZ3RoIHRvIHJlYWQgKi8KLQkJcmRsZW4gPSAobGVuID4gZmlyc3RyZWFkKSA/IChsZW4gLSBmaXJzdHJlYWQpIDogMDsKLQotCQkvKiBNYXkgcGFkIHJlYWQgdG8gYmxvY2tzaXplIGZvciBlZmZpY2llbmN5ICovCi0JCWlmIChidXMtPnJvdW5kdXAgJiYgYnVzLT5ibG9ja3NpemUgJiYKLQkJCShyZGxlbiA+IGJ1cy0+YmxvY2tzaXplKSkgewotCQkJcGFkID0gYnVzLT5ibG9ja3NpemUgLSAocmRsZW4gJSBidXMtPmJsb2Nrc2l6ZSk7Ci0JCQlpZiAoKHBhZCA8PSBidXMtPnJvdW5kdXApICYmIChwYWQgPCBidXMtPmJsb2Nrc2l6ZSkgJiYKLQkJCSAgICAoKHJkbGVuICsgcGFkICsgZmlyc3RyZWFkKSA8IE1BWF9SWF9EQVRBU1opKQotCQkJCXJkbGVuICs9IHBhZDsKLQkJfSBlbHNlIGlmIChyZGxlbiAlIEJSQ01GX1NEQUxJR04pIHsKLQkJCXJkbGVuICs9IEJSQ01GX1NEQUxJR04gLSAocmRsZW4gJSBCUkNNRl9TREFMSUdOKTsKLQkJfQotCi0JCS8qIFNhdGlzZnkgbGVuZ3RoLWFsaWdubWVudCByZXF1aXJlbWVudHMgKi8KLQkJaWYgKGZvcmNlYWxpZ24gJiYgKHJkbGVuICYgKEFMSUdOTUVOVCAtIDEpKSkKLQkJCXJkbGVuID0gcm91bmR1cChyZGxlbiwgQUxJR05NRU5UKTsKLQotCQlpZiAoKHJkbGVuICsgZmlyc3RyZWFkKSA+IE1BWF9SWF9EQVRBU1opIHsKLQkJCS8qIFRvbyBsb25nIC0tIHNraXAgdGhpcyBmcmFtZSAqLwotCQkJQlJDTUZfRVJST1IoKCIlczogdG9vIGxvbmc6IGxlbiAlZCByZGxlbiAlZFxuIiwKLQkJCQkgICAgIF9fZnVuY19fLCBsZW4sIHJkbGVuKSk7Ci0JCQlidXMtPmRydnItPnJ4X2Vycm9ycysrOwotCQkJYnVzLT5yeF90b29sb25nKys7Ci0JCQlicmNtZl9zZGJyY21fcnhmYWlsKGJ1cywgZmFsc2UsIGZhbHNlKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJcGt0ID0gYnJjbXVfcGt0X2J1Zl9nZXRfc2tiKHJkbGVuICsgZmlyc3RyZWFkICsgQlJDTUZfU0RBTElHTik7Ci0JCWlmICghcGt0KSB7Ci0JCQkvKiBHaXZlIHVwIG9uIGRhdGEsIHJlcXVlc3QgcnR4IG9mIGV2ZW50cyAqLwotCQkJQlJDTUZfRVJST1IoKCIlczogYnJjbXVfcGt0X2J1Zl9nZXRfc2tiIGZhaWxlZDoiCi0JCQkJICAgICAiIHJkbGVuICVkIGNoYW4gJWRcbiIsIF9fZnVuY19fLCByZGxlbiwKLQkJCQkgICAgIGNoYW4pKTsKLQkJCWJ1cy0+ZHJ2ci0+cnhfZHJvcHBlZCsrOwotCQkJYnJjbWZfc2RicmNtX3J4ZmFpbChidXMsIGZhbHNlLCBSRVRSWUNIQU4oY2hhbikpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBMZWF2ZSByb29tIGZvciB3aGF0IHdlIGFscmVhZHkgcmVhZCwgYW5kIGFsaWduIHJlbWFpbmRlciAqLwotCQlza2JfcHVsbChwa3QsIGZpcnN0cmVhZCk7Ci0JCVBLVEFMSUdOKHBrdCwgcmRsZW4sIEJSQ01GX1NEQUxJR04pOwotCi0JCS8qIFJlYWQgdGhlIHJlbWFpbmluZyBmcmFtZSBkYXRhICovCi0JCXNkcmV0ID0gYnJjbWZfc2RjYXJkX3JlY3ZfYnVmKGNhcmQsCi0JCQkJYnJjbWZfc2RjYXJkX2N1cl9zYndhZChjYXJkKSwKLQkJCQlTRElPX0ZVTkNfMiwgRjJTWU5DLCAoKHU4ICopIChwa3QtPmRhdGEpKSwKLQkJCQlyZGxlbiwgcGt0LCBOVUxMLCBOVUxMKTsKLQkJYnVzLT5mMnJ4ZGF0YSsrOwotCi0JCWlmIChzZHJldCA8IDApIHsKLQkJCUJSQ01GX0VSUk9SKCgiJXM6IHJlYWQgJWQgJXMgYnl0ZXMgZmFpbGVkOiAlZFxuIiwKLQkJCQkgICAgIF9fZnVuY19fLCByZGxlbiwKLQkJCQkgICAgICgoY2hhbiA9PSBTRFBDTV9FVkVOVF9DSEFOTkVMKSA/ICJldmVudCIKLQkJCQkgICAgIDogKChjaGFuID09IFNEUENNX0RBVEFfQ0hBTk5FTCkgPyAiZGF0YSIKLQkJCQkgICAgIDogInRlc3QiKSksIHNkcmV0KSk7Ci0JCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKHBrdCk7Ci0JCQlidXMtPmRydnItPnJ4X2Vycm9ycysrOwotCQkJYnJjbWZfc2RicmNtX3J4ZmFpbChidXMsIHRydWUsIFJFVFJZQ0hBTihjaGFuKSk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIENvcHkgdGhlIGFscmVhZHktcmVhZCBwb3J0aW9uICovCi0JCXNrYl9wdXNoKHBrdCwgZmlyc3RyZWFkKTsKLQkJbWVtY3B5KHBrdC0+ZGF0YSwgYnVzLT5yeGhkciwgZmlyc3RyZWFkKTsKLQotI2lmZGVmIEJDTURCRwotCQlpZiAoQlJDTUZfQllURVNfT04oKSAmJiBCUkNNRl9EQVRBX09OKCkpIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICJSeCBEYXRhOlxuIik7Ci0JCQlwcmludF9oZXhfZHVtcF9ieXRlcygiIiwgRFVNUF9QUkVGSVhfT0ZGU0VULAotCQkJCQkgICAgIHBrdC0+ZGF0YSwgbGVuKTsKLQkJfQotI2VuZGlmCi0KLWRlbGl2ZXI6Ci0JCS8qIFNhdmUgc3VwZXJmcmFtZSBkZXNjcmlwdG9yIGFuZCBhbGxvY2F0ZSBwYWNrZXQgZnJhbWUgKi8KLQkJaWYgKGNoYW4gPT0gU0RQQ01fR0xPTV9DSEFOTkVMKSB7Ci0JCQlpZiAoU0RQQ01fR0xPTURFU0MoJmJ1cy0+cnhoZHJbU0RQQ01fRlJBTUVUQUdfTEVOXSkpIHsKLQkJCQlCUkNNRl9HTE9NKCgiJXM6IGdsb20gZGVzY3JpcHRvciwgJWQgYnl0ZXM6XG4iLAotCQkJCQkgICAgX19mdW5jX18sIGxlbikpOwotI2lmZGVmIEJDTURCRwotCQkJCWlmIChCUkNNRl9HTE9NX09OKCkpIHsKLQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgIkdsb20gRGF0YTpcbiIpOwotCQkJCQlwcmludF9oZXhfZHVtcF9ieXRlcygiIiwKLQkJCQkJCQkgICAgIERVTVBfUFJFRklYX09GRlNFVCwKLQkJCQkJCQkgICAgIHBrdC0+ZGF0YSwgbGVuKTsKLQkJCQl9Ci0jZW5kaWYKLQkJCQlfX3NrYl90cmltKHBrdCwgbGVuKTsKLQkJCQlza2JfcHVsbChwa3QsIFNEUENNX0hEUkxFTik7Ci0JCQkJYnVzLT5nbG9tZCA9IHBrdDsKLQkJCX0gZWxzZSB7Ci0JCQkJQlJDTUZfRVJST1IoKCIlczogZ2xvbSBzdXBlcmZyYW1lIHcvbyAiCi0JCQkJCSAgICAgImRlc2NyaXB0b3IhXG4iLCBfX2Z1bmNfXykpOwotCQkJCWJyY21mX3NkYnJjbV9yeGZhaWwoYnVzLCBmYWxzZSwgZmFsc2UpOwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBGaWxsIGluIHBhY2tldCBsZW4gYW5kIHByaW8sIGRlbGl2ZXIgdXB3YXJkICovCi0JCV9fc2tiX3RyaW0ocGt0LCBsZW4pOwotCQlza2JfcHVsbChwa3QsIGRvZmYpOwotCi0jaWZkZWYgU0RURVNUCi0JCS8qIFRlc3QgY2hhbm5lbCBwYWNrZXRzIGFyZSBwcm9jZXNzZWQgc2VwYXJhdGVseSAqLwotCQlpZiAoY2hhbiA9PSBTRFBDTV9URVNUX0NIQU5ORUwpIHsKLQkJCWJyY21mX3NkYnJjbV9jaGVja2RpZWQoYnVzLCBwa3QsIHNlcSk7Ci0JCQljb250aW51ZTsKLQkJfQotI2VuZGlmCQkJCS8qIFNEVEVTVCAqLwotCi0JCWlmIChwa3QtPmxlbiA9PSAwKSB7Ci0JCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKHBrdCk7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIGlmIChicmNtZl9wcm90b19oZHJwdWxsKGJ1cy0+ZHJ2ciwgJmlmaWR4LCBwa3QpICE9IDApIHsKLQkJCUJSQ01GX0VSUk9SKCgiJXM6IHJ4IHByb3RvY29sIGVycm9yXG4iLCBfX2Z1bmNfXykpOwotCQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihwa3QpOwotCQkJYnVzLT5kcnZyLT5yeF9lcnJvcnMrKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogVW5sb2NrIGR1cmluZyByeCBjYWxsICovCi0JCWJyY21mX3NkYnJjbV9zZHVubG9jayhidXMpOwotCQlicmNtZl9yeF9mcmFtZShidXMtPmRydnIsIGlmaWR4LCBwa3QsIDEpOwotCQlicmNtZl9zZGJyY21fc2Rsb2NrKGJ1cyk7Ci0JfQotCXJ4Y291bnQgPSBtYXhmcmFtZXMgLSByeGxlZnQ7Ci0jaWZkZWYgQkNNREJHCi0JLyogTWVzc2FnZSBpZiB3ZSBoaXQgdGhlIGxpbWl0ICovCi0JaWYgKCFyeGxlZnQgJiYgIXNkdGVzdCkKLQkJQlJDTUZfREFUQSgoIiVzOiBoaXQgcnggbGltaXQgb2YgJWQgZnJhbWVzXG4iLCBfX2Z1bmNfXywKLQkJCSAgICBtYXhmcmFtZXMpKTsKLQllbHNlCi0jZW5kaWYJCQkJLyogQkNNREJHICovCi0JCUJSQ01GX0RBVEEoKCIlczogcHJvY2Vzc2VkICVkIGZyYW1lc1xuIiwgX19mdW5jX18sIHJ4Y291bnQpKTsKLQkvKiBCYWNrIG9mZiByeHNlcSBpZiBhd2FpdGluZyBydHgsIHVwZGF0ZSByeF9zZXEgKi8KLQlpZiAoYnVzLT5yeHNraXApCi0JCXJ4c2VxLS07Ci0JYnVzLT5yeF9zZXEgPSByeHNlcTsKLQotCXJldHVybiByeGNvdW50OwotfQotCi1zdGF0aWMgdTMyIGJyY21mX3NkYnJjbV9ob3N0bWFpbChzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCi17Ci0JdTMyIGludHN0YXR1cyA9IDA7Ci0JdTMyIGhtYl9kYXRhOwotCXU4IGZjYml0czsKLQl1aW50IHJldHJpZXMgPSAwOwotCi0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQkvKiBSZWFkIG1haWxib3ggZGF0YSBhbmQgYWNrIHRoYXQgd2UgZGlkIHNvICovCi0Jcl9zZHJlZzMyKGJ1cywgJmhtYl9kYXRhLAotCQkgIG9mZnNldG9mKHN0cnVjdCBzZHBjbWRfcmVncywgdG9ob3N0bWFpbGJveGRhdGEpLCAmcmV0cmllcyk7Ci0KLQlpZiAocmV0cmllcyA8PSByZXRyeV9saW1pdCkKLQkJd19zZHJlZzMyKGJ1cywgU01CX0lOVF9BQ0ssCi0JCQkgIG9mZnNldG9mKHN0cnVjdCBzZHBjbWRfcmVncywgdG9zYm1haWxib3gpLCAmcmV0cmllcyk7Ci0JYnVzLT5mMXJlZ2RhdGEgKz0gMjsKLQotCS8qIERvbmdsZSByZWNvbXBvc2VkIHJ4IGZyYW1lcywgYWNjZXB0IHRoZW0gYWdhaW4gKi8KLQlpZiAoaG1iX2RhdGEgJiBITUJfREFUQV9OQUtIQU5ETEVEKSB7Ci0JCUJSQ01GX0lORk8oKCJEb25nbGUgcmVwb3J0cyBOQUsgaGFuZGxlZCwgZXhwZWN0IHJ0eCBvZiAlZFxuIiwKLQkJCSAgICBidXMtPnJ4X3NlcSkpOwotCQlpZiAoIWJ1cy0+cnhza2lwKQotCQkJQlJDTUZfRVJST1IoKCIlczogdW5leHBlY3RlZCBOQUtIQU5ETEVEIVxuIiwgX19mdW5jX18pKTsKLQotCQlidXMtPnJ4c2tpcCA9IGZhbHNlOwotCQlpbnRzdGF0dXMgfD0gSV9ITUJfRlJBTUVfSU5EOwotCX0KLQotCS8qCi0JICogREVWUkVBRFkgZG9lcyBub3Qgb2NjdXIgd2l0aCBnU1BJLgotCSAqLwotCWlmIChobWJfZGF0YSAmIChITUJfREFUQV9ERVZSRUFEWSB8IEhNQl9EQVRBX0ZXUkVBRFkpKSB7Ci0JCWJ1cy0+c2RwY21fdmVyID0KLQkJICAgIChobWJfZGF0YSAmIEhNQl9EQVRBX1ZFUlNJT05fTUFTSykgPj4KLQkJICAgIEhNQl9EQVRBX1ZFUlNJT05fU0hJRlQ7Ci0JCWlmIChidXMtPnNkcGNtX3ZlciAhPSBTRFBDTV9QUk9UX1ZFUlNJT04pCi0JCQlCUkNNRl9FUlJPUigoIlZlcnNpb24gbWlzbWF0Y2gsIGRvbmdsZSByZXBvcnRzICVkLCAiCi0JCQkJICAgICAiZXhwZWN0aW5nICVkXG4iLAotCQkJCSAgICAgYnVzLT5zZHBjbV92ZXIsIFNEUENNX1BST1RfVkVSU0lPTikpOwotCQllbHNlCi0JCQlCUkNNRl9JTkZPKCgiRG9uZ2xlIHJlYWR5LCBwcm90b2NvbCB2ZXJzaW9uICVkXG4iLAotCQkJCSAgICBidXMtPnNkcGNtX3ZlcikpOwotCX0KLQotCS8qCi0JICogRmxvdyBDb250cm9sIGhhcyBiZWVuIG1vdmVkIGludG8gdGhlIFJYIGhlYWRlcnMgYW5kIHRoaXMgb3V0IG9mIGJhbmQKLQkgKiBtZXRob2QgaXNuJ3QgdXNlZCBhbnkgbW9yZS4KLQkgKiByZW1haW5pbmcgYmFja3dhcmQgY29tcGF0aWJsZSB3aXRoIG9sZGVyIGRvbmdsZXMuCi0JICovCi0JaWYgKGhtYl9kYXRhICYgSE1CX0RBVEFfRkMpIHsKLQkJZmNiaXRzID0gKGhtYl9kYXRhICYgSE1CX0RBVEFfRkNEQVRBX01BU0spID4+Ci0JCQkJCQkJSE1CX0RBVEFfRkNEQVRBX1NISUZUOwotCi0JCWlmIChmY2JpdHMgJiB+YnVzLT5mbG93Y29udHJvbCkKLQkJCWJ1cy0+ZmNfeG9mZisrOwotCi0JCWlmIChidXMtPmZsb3djb250cm9sICYgfmZjYml0cykKLQkJCWJ1cy0+ZmNfeG9uKys7Ci0KLQkJYnVzLT5mY19yY3ZkKys7Ci0JCWJ1cy0+Zmxvd2NvbnRyb2wgPSBmY2JpdHM7Ci0JfQotCi0JLyogU2hvdWxkbid0IGJlIGFueSBvdGhlcnMgKi8KLQlpZiAoaG1iX2RhdGEgJiB+KEhNQl9EQVRBX0RFVlJFQURZIHwKLQkJCSBITUJfREFUQV9OQUtIQU5ETEVEIHwKLQkJCSBITUJfREFUQV9GQyB8Ci0JCQkgSE1CX0RBVEFfRldSRUFEWSB8Ci0JCQkgSE1CX0RBVEFfRkNEQVRBX01BU0sgfCBITUJfREFUQV9WRVJTSU9OX01BU0spKSB7Ci0JCUJSQ01GX0VSUk9SKCgiVW5rbm93biBtYWlsYm94IGRhdGEgY29udGVudDogMHglMDJ4XG4iLAotCQkJICAgICBobWJfZGF0YSkpOwotCX0KLQotCXJldHVybiBpbnRzdGF0dXM7Ci19Ci0KLXN0YXRpYyBib29sIGJyY21mX3NkYnJjbV9kcGMoc3RydWN0IGJyY21mX2J1cyAqYnVzKQotewotCXN0cnVjdCBicmNtZl9zZGlvX2NhcmQgKmNhcmQgPSBidXMtPmNhcmQ7Ci0JdTMyIGludHN0YXR1cywgbmV3c3RhdHVzID0gMDsKLQl1aW50IHJldHJpZXMgPSAwOwotCXVpbnQgcnhsaW1pdCA9IGJyY21mX3J4Ym91bmQ7CS8qIFJ4IGZyYW1lcyB0byByZWFkIGJlZm9yZSByZXNjaGVkICovCi0JdWludCB0eGxpbWl0ID0gYnJjbWZfdHhib3VuZDsJLyogVHggZnJhbWVzIHRvIHNlbmQgYmVmb3JlIHJlc2NoZWQgKi8KLQl1aW50IGZyYW1lY250ID0gMDsJLyogVGVtcG9yYXJ5IGNvdW50ZXIgb2YgdHgvcnggZnJhbWVzICovCi0JYm9vbCByeGRvbmUgPSB0cnVlOwkvKiBGbGFnIGZvciBubyBtb3JlIHJlYWQgZGF0YSAqLwotCWJvb2wgcmVzY2hlZCA9IGZhbHNlOwkvKiBGbGFnIGluZGljYXRpbmcgcmVzY2hlZCB3YW50ZWQgKi8KLQotCUJSQ01GX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwotCi0JLyogU3RhcnQgd2l0aCBsZWZ0b3ZlciBzdGF0dXMgYml0cyAqLwotCWludHN0YXR1cyA9IGJ1cy0+aW50c3RhdHVzOwotCi0JYnJjbWZfc2RicmNtX3NkbG9jayhidXMpOwotCi0JLyogSWYgd2FpdGluZyBmb3IgSFRBVkFJTCwgY2hlY2sgc3RhdHVzICovCi0JaWYgKGJ1cy0+Y2xrc3RhdGUgPT0gQ0xLX1BFTkRJTkcpIHsKLQkJaW50IGVycjsKLQkJdTggY2xrY3RsLCBkZXZjdGwgPSAwOwotCi0jaWZkZWYgQkNNREJHCi0JCS8qIENoZWNrIGZvciBpbmNvbnNpc3RlbnQgZGV2aWNlIGNvbnRyb2wgKi8KLQkJZGV2Y3RsID0gYnJjbWZfc2RjYXJkX2NmZ19yZWFkKGNhcmQsIFNESU9fRlVOQ18xLAotCQkJCQkgICAgICAgU0JTRElPX0RFVklDRV9DVEwsICZlcnIpOwotCQlpZiAoZXJyKSB7Ci0JCQlCUkNNRl9FUlJPUigoIiVzOiBlcnJvciByZWFkaW5nIERFVkNUTDogJWRcbiIsCi0JCQkJICAgICBfX2Z1bmNfXywgZXJyKSk7Ci0JCQlidXMtPmRydnItPmJ1c3N0YXRlID0gQlJDTUZfQlVTX0RPV047Ci0JCX0KLSNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KLQotCQkvKiBSZWFkIENTUiwgaWYgY2xvY2sgb24gc3dpdGNoIHRvIEFWQUlMLCBlbHNlIGlnbm9yZSAqLwotCQljbGtjdGwgPSBicmNtZl9zZGNhcmRfY2ZnX3JlYWQoY2FyZCwgU0RJT19GVU5DXzEsCi0JCQkJCSAgICAgICBTQlNESU9fRlVOQzFfQ0hJUENMS0NTUiwgJmVycik7Ci0JCWlmIChlcnIpIHsKLQkJCUJSQ01GX0VSUk9SKCgiJXM6IGVycm9yIHJlYWRpbmcgQ1NSOiAlZFxuIiwgX19mdW5jX18sCi0JCQkJICAgICBlcnIpKTsKLQkJCWJ1cy0+ZHJ2ci0+YnVzc3RhdGUgPSBCUkNNRl9CVVNfRE9XTjsKLQkJfQotCi0JCUJSQ01GX0lORk8oKCJEUEM6IFBFTkRJTkcsIGRldmN0bCAweCUwMnggY2xrY3RsIDB4JTAyeFxuIiwKLQkJCSAgICBkZXZjdGwsIGNsa2N0bCkpOwotCi0JCWlmIChTQlNESU9fSFRBVihjbGtjdGwpKSB7Ci0JCQlkZXZjdGwgPSBicmNtZl9zZGNhcmRfY2ZnX3JlYWQoY2FyZCwgU0RJT19GVU5DXzEsCi0JCQkJCQkgICAgICAgU0JTRElPX0RFVklDRV9DVEwsICZlcnIpOwotCQkJaWYgKGVycikgewotCQkJCUJSQ01GX0VSUk9SKCgiJXM6IGVycm9yIHJlYWRpbmcgREVWQ1RMOiAlZFxuIiwKLQkJCQkJICAgICBfX2Z1bmNfXywgZXJyKSk7Ci0JCQkJYnVzLT5kcnZyLT5idXNzdGF0ZSA9IEJSQ01GX0JVU19ET1dOOwotCQkJfQotCQkJZGV2Y3RsICY9IH5TQlNESU9fREVWQ1RMX0NBX0lOVF9PTkxZOwotCQkJYnJjbWZfc2RjYXJkX2NmZ193cml0ZShjYXJkLCBTRElPX0ZVTkNfMSwKLQkJCQlTQlNESU9fREVWSUNFX0NUTCwgZGV2Y3RsLCAmZXJyKTsKLQkJCWlmIChlcnIpIHsKLQkJCQlCUkNNRl9FUlJPUigoIiVzOiBlcnJvciB3cml0aW5nIERFVkNUTDogJWRcbiIsCi0JCQkJCSAgICAgX19mdW5jX18sIGVycikpOwotCQkJCWJ1cy0+ZHJ2ci0+YnVzc3RhdGUgPSBCUkNNRl9CVVNfRE9XTjsKLQkJCX0KLQkJCWJ1cy0+Y2xrc3RhdGUgPSBDTEtfQVZBSUw7Ci0JCX0gZWxzZSB7Ci0JCQlnb3RvIGNsa3dhaXQ7Ci0JCX0KLQl9Ci0KLQlCVVNfV0FLRShidXMpOwotCi0JLyogTWFrZSBzdXJlIGJhY2twbGFuZSBjbG9jayBpcyBvbiAqLwotCWJyY21mX3NkYnJjbV9jbGtjdGwoYnVzLCBDTEtfQVZBSUwsIHRydWUpOwotCWlmIChidXMtPmNsa3N0YXRlID09IENMS19QRU5ESU5HKQotCQlnb3RvIGNsa3dhaXQ7Ci0KLQkvKiBQZW5kaW5nIGludGVycnVwdCBpbmRpY2F0ZXMgbmV3IGRldmljZSBzdGF0dXMgKi8KLQlpZiAoYnVzLT5pcGVuZCkgewotCQlidXMtPmlwZW5kID0gZmFsc2U7Ci0JCXJfc2RyZWczMihidXMsICZuZXdzdGF0dXMsCi0JCQkgIG9mZnNldG9mKHN0cnVjdCBzZHBjbWRfcmVncywgaW50c3RhdHVzKSwgJnJldHJpZXMpOwotCQlidXMtPmYxcmVnZGF0YSsrOwotCQlpZiAoYnJjbWZfc2RjYXJkX3JlZ2ZhaWwoYnVzLT5jYXJkKSkKLQkJCW5ld3N0YXR1cyA9IDA7Ci0JCW5ld3N0YXR1cyAmPSBidXMtPmhvc3RpbnRtYXNrOwotCQlidXMtPmZjc3RhdGUgPSAhIShuZXdzdGF0dXMgJiBJX0hNQl9GQ19TVEFURSk7Ci0JCWlmIChuZXdzdGF0dXMpIHsKLQkJCXdfc2RyZWczMihidXMsIG5ld3N0YXR1cywKLQkJCQkgIG9mZnNldG9mKHN0cnVjdCBzZHBjbWRfcmVncywgaW50c3RhdHVzKSwKLQkJCQkgICZyZXRyaWVzKTsKLQkJCWJ1cy0+ZjFyZWdkYXRhKys7Ci0JCX0KLQl9Ci0KLQkvKiBNZXJnZSBuZXcgYml0cyB3aXRoIHByZXZpb3VzICovCi0JaW50c3RhdHVzIHw9IG5ld3N0YXR1czsKLQlidXMtPmludHN0YXR1cyA9IDA7Ci0KLQkvKiBIYW5kbGUgZmxvdy1jb250cm9sIGNoYW5nZTogcmVhZCBuZXcgc3RhdGUgaW4gY2FzZSBvdXIgYWNrCi0JICogY3Jvc3NlZCBhbm90aGVyIGNoYW5nZSBpbnRlcnJ1cHQuICBJZiBjaGFuZ2Ugc3RpbGwgc2V0LCBhc3N1bWUKLQkgKiBGQyBPTiBmb3Igc2FmZXR5LCBsZXQgbmV4dCBsb29wIHRocm91Z2ggZG8gdGhlIGRlYm91bmNlLgotCSAqLwotCWlmIChpbnRzdGF0dXMgJiBJX0hNQl9GQ19DSEFOR0UpIHsKLQkJaW50c3RhdHVzICY9IH5JX0hNQl9GQ19DSEFOR0U7Ci0JCXdfc2RyZWczMihidXMsIElfSE1CX0ZDX0NIQU5HRSwKLQkJCSAgb2Zmc2V0b2Yoc3RydWN0IHNkcGNtZF9yZWdzLCBpbnRzdGF0dXMpLCAmcmV0cmllcyk7Ci0KLQkJcl9zZHJlZzMyKGJ1cywgJm5ld3N0YXR1cywKLQkJCSAgb2Zmc2V0b2Yoc3RydWN0IHNkcGNtZF9yZWdzLCBpbnRzdGF0dXMpLCAmcmV0cmllcyk7Ci0JCWJ1cy0+ZjFyZWdkYXRhICs9IDI7Ci0JCWJ1cy0+ZmNzdGF0ZSA9Ci0JCSAgICAhIShuZXdzdGF0dXMgJiAoSV9ITUJfRkNfU1RBVEUgfCBJX0hNQl9GQ19DSEFOR0UpKTsKLQkJaW50c3RhdHVzIHw9IChuZXdzdGF0dXMgJiBidXMtPmhvc3RpbnRtYXNrKTsKLQl9Ci0KLQkvKiBIYW5kbGUgaG9zdCBtYWlsYm94IGluZGljYXRpb24gKi8KLQlpZiAoaW50c3RhdHVzICYgSV9ITUJfSE9TVF9JTlQpIHsKLQkJaW50c3RhdHVzICY9IH5JX0hNQl9IT1NUX0lOVDsKLQkJaW50c3RhdHVzIHw9IGJyY21mX3NkYnJjbV9ob3N0bWFpbChidXMpOwotCX0KLQotCS8qIEdlbmVyYWxseSBkb24ndCBhc2sgZm9yIHRoZXNlLCBjYW4gZ2V0IENSQyBlcnJvcnMuLi4gKi8KLQlpZiAoaW50c3RhdHVzICYgSV9XUl9PT1NZTkMpIHsKLQkJQlJDTUZfRVJST1IoKCJEb25nbGUgcmVwb3J0cyBXUl9PT1NZTkNcbiIpKTsKLQkJaW50c3RhdHVzICY9IH5JX1dSX09PU1lOQzsKLQl9Ci0KLQlpZiAoaW50c3RhdHVzICYgSV9SRF9PT1NZTkMpIHsKLQkJQlJDTUZfRVJST1IoKCJEb25nbGUgcmVwb3J0cyBSRF9PT1NZTkNcbiIpKTsKLQkJaW50c3RhdHVzICY9IH5JX1JEX09PU1lOQzsKLQl9Ci0KLQlpZiAoaW50c3RhdHVzICYgSV9TQklOVCkgewotCQlCUkNNRl9FUlJPUigoIkRvbmdsZSByZXBvcnRzIFNCSU5UXG4iKSk7Ci0JCWludHN0YXR1cyAmPSB+SV9TQklOVDsKLQl9Ci0KLQkvKiBXb3VsZCBiZSBhY3RpdmUgZHVlIHRvIHdha2Utd2xhbiBpbiBnU1BJICovCi0JaWYgKGludHN0YXR1cyAmIElfQ0hJUEFDVElWRSkgewotCQlCUkNNRl9JTkZPKCgiRG9uZ2xlIHJlcG9ydHMgQ0hJUEFDVElWRVxuIikpOwotCQlpbnRzdGF0dXMgJj0gfklfQ0hJUEFDVElWRTsKLQl9Ci0KLQkvKiBJZ25vcmUgZnJhbWUgaW5kaWNhdGlvbnMgaWYgcnhza2lwIGlzIHNldCAqLwotCWlmIChidXMtPnJ4c2tpcCkKLQkJaW50c3RhdHVzICY9IH5JX0hNQl9GUkFNRV9JTkQ7Ci0KLQkvKiBPbiBmcmFtZSBpbmRpY2F0aW9uLCByZWFkIGF2YWlsYWJsZSBmcmFtZXMgKi8KLQlpZiAoUEtUX0FWQUlMQUJMRSgpKSB7Ci0JCWZyYW1lY250ID0gYnJjbWZfc2RicmNtX3JlYWRmcmFtZXMoYnVzLCByeGxpbWl0LCAmcnhkb25lKTsKLQkJaWYgKHJ4ZG9uZSB8fCBidXMtPnJ4c2tpcCkKLQkJCWludHN0YXR1cyAmPSB+SV9ITUJfRlJBTUVfSU5EOwotCQlyeGxpbWl0IC09IG1pbihmcmFtZWNudCwgcnhsaW1pdCk7Ci0JfQotCi0JLyogS2VlcCBzdGlsbC1wZW5kaW5nIGV2ZW50cyBmb3IgbmV4dCBzY2hlZHVsaW5nICovCi0JYnVzLT5pbnRzdGF0dXMgPSBpbnRzdGF0dXM7Ci0KLWNsa3dhaXQ6Ci0JLyogUmUtZW5hYmxlIGludGVycnVwdHMgdG8gZGV0ZWN0IG5ldyBkZXZpY2UgZXZlbnRzIChtYWlsYm94LCByeCBmcmFtZSkKLQkgKiBvciBjbG9jayBhdmFpbGFiaWxpdHkuICAoQWxsb3dzIHR4IGxvb3AgdG8gY2hlY2sgaXBlbmQgaWYgZGVzaXJlZC4pCi0JICogKFVubGVzcyByZWdpc3RlciBhY2Nlc3Mgc2VlbXMgaG9zZWQsIGFzIHdlIG1heSBub3QgYmUgYWJsZSB0byBBQ0suLi4pCi0JICovCi0JaWYgKGJ1cy0+aW50ciAmJiBidXMtPmludGRpcyAmJiAhYnJjbWZfc2RjYXJkX3JlZ2ZhaWwoY2FyZCkpIHsKLQkJQlJDTUZfSU5UUigoIiVzOiBlbmFibGUgU0RJTyBpbnRlcnJ1cHRzLCByeGRvbmUgJWQiCi0JCQkgICAgIiBmcmFtZWNudCAlZFxuIiwgX19mdW5jX18sIHJ4ZG9uZSwgZnJhbWVjbnQpKTsKLQkJYnVzLT5pbnRkaXMgPSBmYWxzZTsKLQkJYnJjbWZfc2RjYXJkX2ludHJfZW5hYmxlKGNhcmQpOwotCX0KLQotCWlmIChEQVRBT0soYnVzKSAmJiBidXMtPmN0cmxfZnJhbWVfc3RhdCAmJgotCQkoYnVzLT5jbGtzdGF0ZSA9PSBDTEtfQVZBSUwpKSB7Ci0JCWludCByZXQsIGk7Ci0KLQkJcmV0ID0gYnJjbWZfc2RicmNtX3NlbmRfYnVmKGJ1cywgYnJjbWZfc2RjYXJkX2N1cl9zYndhZChjYXJkKSwKLQkJCVNESU9fRlVOQ18yLCBGMlNZTkMsICh1OCAqKSBidXMtPmN0cmxfZnJhbWVfYnVmLAotCQkJKHUzMikgYnVzLT5jdHJsX2ZyYW1lX2xlbiwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0KLQkJaWYgKHJldCA8IDApIHsKLQkJCS8qIE9uIGZhaWx1cmUsIGFib3J0IHRoZSBjb21tYW5kIGFuZAotCQkJCXRlcm1pbmF0ZSB0aGUgZnJhbWUgKi8KLQkJCUJSQ01GX0lORk8oKCIlczogc2RpbyBlcnJvciAlZCwgYWJvcnQgY29tbWFuZCBhbmQgIgotCQkJCSAgICAidGVybWluYXRlIGZyYW1lLlxuIiwgX19mdW5jX18sIHJldCkpOwotCQkJYnVzLT50eF9zZGVycnMrKzsKLQotCQkJYnJjbWZfc2RjYXJkX2Fib3J0KGNhcmQsIFNESU9fRlVOQ18yKTsKLQotCQkJYnJjbWZfc2RjYXJkX2NmZ193cml0ZShjYXJkLCBTRElPX0ZVTkNfMSwKLQkJCQkJIFNCU0RJT19GVU5DMV9GUkFNRUNUUkwsIFNGQ19XRl9URVJNLAotCQkJCQkgTlVMTCk7Ci0JCQlidXMtPmYxcmVnZGF0YSsrOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCQkJdTggaGksIGxvOwotCQkJCWhpID0gYnJjbWZfc2RjYXJkX2NmZ19yZWFkKGNhcmQsIFNESU9fRlVOQ18xLAotCQkJCQkJICAgICBTQlNESU9fRlVOQzFfV0ZSQU1FQkNISSwKLQkJCQkJCSAgICAgTlVMTCk7Ci0JCQkJbG8gPSBicmNtZl9zZGNhcmRfY2ZnX3JlYWQoY2FyZCwgU0RJT19GVU5DXzEsCi0JCQkJCQkgICAgIFNCU0RJT19GVU5DMV9XRlJBTUVCQ0xPLAotCQkJCQkJICAgICBOVUxMKTsKLQkJCQlidXMtPmYxcmVnZGF0YSArPSAyOwotCQkJCWlmICgoaGkgPT0gMCkgJiYgKGxvID09IDApKQotCQkJCQlicmVhazsKLQkJCX0KLQotCQl9Ci0JCWlmIChyZXQgPT0gMCkKLQkJCWJ1cy0+dHhfc2VxID0gKGJ1cy0+dHhfc2VxICsgMSkgJSBTRFBDTV9TRVFVRU5DRV9XUkFQOwotCi0JCUJSQ01GX0lORk8oKCJSZXR1cm5fZHBjIHZhbHVlIGlzIDogJWRcbiIsIHJldCkpOwotCQlidXMtPmN0cmxfZnJhbWVfc3RhdCA9IGZhbHNlOwotCQlicmNtZl9zZGJyY21fd2FpdF9ldmVudF93YWtldXAoYnVzKTsKLQl9Ci0JLyogU2VuZCBxdWV1ZWQgZnJhbWVzIChsaW1pdCAxIGlmIHJ4IG1heSBzdGlsbCBiZSBwZW5kaW5nKSAqLwotCWVsc2UgaWYgKChidXMtPmNsa3N0YXRlID09IENMS19BVkFJTCkgJiYgIWJ1cy0+ZmNzdGF0ZSAmJgotCQkgYnJjbXVfcGt0cV9tbGVuKCZidXMtPnR4cSwgfmJ1cy0+Zmxvd2NvbnRyb2wpICYmIHR4bGltaXQKLQkJICYmIERBVEFPSyhidXMpKSB7Ci0JCWZyYW1lY250ID0gcnhkb25lID8gdHhsaW1pdCA6IG1pbih0eGxpbWl0LCBicmNtZl90eG1pbm1heCk7Ci0JCWZyYW1lY250ID0gYnJjbWZfc2RicmNtX3NlbmRmcm9tcShidXMsIGZyYW1lY250KTsKLQkJdHhsaW1pdCAtPSBmcmFtZWNudDsKLQl9Ci0KLQkvKiBSZXNjaGVkIGlmIGV2ZW50cyBvciB0eCBmcmFtZXMgYXJlIHBlbmRpbmcsCi0JCSBlbHNlIGF3YWl0IG5leHQgaW50ZXJydXB0ICovCi0JLyogT24gZmFpbGVkIHJlZ2lzdGVyIGFjY2VzcywgYWxsIGJldHMgYXJlIG9mZjoKLQkJIG5vIHJlc2NoZWQgb3IgaW50ZXJydXB0cyAqLwotCWlmICgoYnVzLT5kcnZyLT5idXNzdGF0ZSA9PSBCUkNNRl9CVVNfRE9XTikgfHwKLQkgICAgYnJjbWZfc2RjYXJkX3JlZ2ZhaWwoY2FyZCkpIHsKLQkJQlJDTUZfRVJST1IoKCIlczogZmFpbGVkIGJhY2twbGFuZSBhY2Nlc3Mgb3ZlciBTRElPLCBoYWx0aW5nICIKLQkJCSAgICAgIm9wZXJhdGlvbiAlZFxuIiwgX19mdW5jX18sCi0JCQkgICAgIGJyY21mX3NkY2FyZF9yZWdmYWlsKGNhcmQpKSk7Ci0JCWJ1cy0+ZHJ2ci0+YnVzc3RhdGUgPSBCUkNNRl9CVVNfRE9XTjsKLQkJYnVzLT5pbnRzdGF0dXMgPSAwOwotCX0gZWxzZSBpZiAoYnVzLT5jbGtzdGF0ZSA9PSBDTEtfUEVORElORykgewotCQlCUkNNRl9JTkZPKCgiJXM6IHJlc2NoZWR1bGVkIGR1ZSB0byBDTEtfUEVORElORyBhd2FpdGluZyAiCi0JCQkgICAgIklfQ0hJUEFDVElWRSBpbnRlcnJ1cHRcbiIsIF9fZnVuY19fKSk7Ci0JCXJlc2NoZWQgPSB0cnVlOwotCX0gZWxzZSBpZiAoYnVzLT5pbnRzdGF0dXMgfHwgYnVzLT5pcGVuZCB8fAotCQkoIWJ1cy0+ZmNzdGF0ZSAmJiBicmNtdV9wa3RxX21sZW4oJmJ1cy0+dHhxLCB+YnVzLT5mbG93Y29udHJvbCkKLQkJICYmIERBVEFPSyhidXMpKSB8fCBQS1RfQVZBSUxBQkxFKCkpIHsKLQkJcmVzY2hlZCA9IHRydWU7Ci0JfQotCi0JYnVzLT5kcGNfc2NoZWQgPSByZXNjaGVkOwotCi0JLyogSWYgd2UncmUgZG9uZSBmb3Igbm93LCB0dXJuIG9mZiBjbG9jayByZXF1ZXN0LiAqLwotCWlmICgoYnVzLT5jbGtzdGF0ZSAhPSBDTEtfUEVORElORykKLQkgICAgJiYgYnVzLT5pZGxldGltZSA9PSBCUkNNRl9JRExFX0lNTUVESUFURSkgewotCQlidXMtPmFjdGl2aXR5ID0gZmFsc2U7Ci0JCWJyY21mX3NkYnJjbV9jbGtjdGwoYnVzLCBDTEtfTk9ORSwgZmFsc2UpOwotCX0KLQotCWJyY21mX3NkYnJjbV9zZHVubG9jayhidXMpOwotCi0JcmV0dXJuIHJlc2NoZWQ7Ci19Ci0KLXZvaWQgYnJjbWZfc2RicmNtX2lzcih2b2lkICphcmcpCi17Ci0Jc3RydWN0IGJyY21mX2J1cyAqYnVzID0gKHN0cnVjdCBicmNtZl9idXMgKikgYXJnOwotCXN0cnVjdCBicmNtZl9zZGlvX2NhcmQgKmNhcmQ7Ci0KLQlCUkNNRl9UUkFDRSgoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKLQotCWlmICghYnVzKSB7Ci0JCUJSQ01GX0VSUk9SKCgiJXMgOiBidXMgaXMgbnVsbCBwb2ludGVyICwgZXhpdFxuIiwgX19mdW5jX18pKTsKLQkJcmV0dXJuOwotCX0KLQljYXJkID0gYnVzLT5jYXJkOwotCi0JaWYgKGJ1cy0+ZHJ2ci0+YnVzc3RhdGUgPT0gQlJDTUZfQlVTX0RPV04pIHsKLQkJQlJDTUZfRVJST1IoKCIlcyA6IGJ1cyBpcyBkb3duLiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG9cbiIsCi0JCQkgICBfX2Z1bmNfXykpOwotCQlyZXR1cm47Ci0JfQotCS8qIENvdW50IHRoZSBpbnRlcnJ1cHQgY2FsbCAqLwotCWJ1cy0+aW50cmNvdW50Kys7Ci0JYnVzLT5pcGVuZCA9IHRydWU7Ci0KLQkvKiBTaG91bGRuJ3QgZ2V0IHRoaXMgaW50ZXJydXB0IGlmIHdlJ3JlIHNsZWVwaW5nPyAqLwotCWlmIChidXMtPnNsZWVwaW5nKSB7Ci0JCUJSQ01GX0VSUk9SKCgiSU5URVJSVVBUIFdISUxFIFNMRUVQSU5HPz9cbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIERpc2FibGUgYWRkaXRpb25hbCBpbnRlcnJ1cHRzIChpcyB0aGlzIG5lZWRlZCBub3cpPyAqLwotCWlmIChidXMtPmludHIpCi0JCUJSQ01GX0lOVFIoKCIlczogZGlzYWJsZSBTRElPIGludGVycnVwdHNcbiIsIF9fZnVuY19fKSk7Ci0JZWxzZQotCQlCUkNNRl9FUlJPUigoImJyY21mX3NkYnJjbV9pc3IoKSB3L28gaW50ZXJydXB0IGNvbmZpZ3VyZWQhXG4iKSk7Ci0KLQlicmNtZl9zZGNhcmRfaW50cl9kaXNhYmxlKGNhcmQpOwotCWJ1cy0+aW50ZGlzID0gdHJ1ZTsKLQotI2lmIGRlZmluZWQoU0RJT19JU1JfVEhSRUFEKQotCUJSQ01GX1RSQUNFKCgiQ2FsbGluZyBicmNtZl9zZGJyY21fZHBjKCkgZnJvbSAlc1xuIiwgX19mdW5jX18pKTsKLQl3aGlsZSAoYnJjbWZfc2RicmNtX2RwYyhidXMpKQotCQk7Ci0jZWxzZQotCWJ1cy0+ZHBjX3NjaGVkID0gdHJ1ZTsKLQlicmNtZl9zZGJyY21fc2NoZWRfZHBjKGJ1cyk7Ci0jZW5kaWYKLQotfQotCi0jaWZkZWYgU0RURVNUCi1zdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fcGt0Z2VuX2luaXQoc3RydWN0IGJyY21mX2J1cyAqYnVzKQotewotCS8qIERlZmF1bHQgdG8gc3BlY2lmaWVkIGxlbmd0aCwgb3IgZnVsbCByYW5nZSAqLwotCWlmIChicmNtZl9wa3RnZW5fbGVuKSB7Ci0JCWJ1cy0+cGt0Z2VuX21heGxlbiA9IG1pbihicmNtZl9wa3RnZW5fbGVuLAotCQkJCQkgQlJDTUZfTUFYX1BLVEdFTl9MRU4pOwotCQlidXMtPnBrdGdlbl9taW5sZW4gPSBidXMtPnBrdGdlbl9tYXhsZW47Ci0JfSBlbHNlIHsKLQkJYnVzLT5wa3RnZW5fbWF4bGVuID0gQlJDTUZfTUFYX1BLVEdFTl9MRU47Ci0JCWJ1cy0+cGt0Z2VuX21pbmxlbiA9IDA7Ci0JfQotCWJ1cy0+cGt0Z2VuX2xlbiA9ICh1MTYpIGJ1cy0+cGt0Z2VuX21pbmxlbjsKLQotCS8qIERlZmF1bHQgdG8gcGVyLXdhdGNoZG9nIGJ1cnN0IHdpdGggMTBzIHByaW50IHRpbWUgKi8KLQlidXMtPnBrdGdlbl9mcmVxID0gMTsKLQlidXMtPnBrdGdlbl9wcmludCA9IDEwMDAwIC8gYnJjbWZfd2F0Y2hkb2dfbXM7Ci0JYnVzLT5wa3RnZW5fY291bnQgPSAoYnJjbWZfcGt0Z2VuICogYnJjbWZfd2F0Y2hkb2dfbXMgKyA5OTkpIC8gMTAwMDsKLQotCS8qIERlZmF1bHQgdG8gZWNobyBtb2RlICovCi0JYnVzLT5wa3RnZW5fbW9kZSA9IEJSQ01GX1BLVEdFTl9FQ0hPOwotCWJ1cy0+cGt0Z2VuX3N0b3AgPSAxOwotfQotCi1zdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fcGt0Z2VuKHN0cnVjdCBicmNtZl9idXMgKmJ1cykKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OwotCXU4ICpkYXRhOwotCXVpbnQgcGt0Y291bnQ7Ci0JdWludCBmaWxsYnl0ZTsKLQl1MTYgbGVuOwotCi0JLyogRGlzcGxheSBjdXJyZW50IGNvdW50IGlmIGFwcHJvcHJpYXRlICovCi0JaWYgKGJ1cy0+cGt0Z2VuX3ByaW50ICYmICgrK2J1cy0+cGt0Z2VuX3B0aWNrID49IGJ1cy0+cGt0Z2VuX3ByaW50KSkgewotCQlidXMtPnBrdGdlbl9wdGljayA9IDA7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlczogc2VuZCBhdHRlbXB0cyAlZCByY3ZkICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIGJ1cy0+cGt0Z2VuX3NlbnQsIGJ1cy0+cGt0Z2VuX3JjdmQpOwotCX0KLQotCS8qIEZvciByZWN2IG1vZGUsIGp1c3QgbWFrZSBzdXJlIGRvbmdsZSBoYXMgc3RhcnRlZCBzZW5kaW5nICovCi0JaWYgKGJ1cy0+cGt0Z2VuX21vZGUgPT0gQlJDTUZfUEtUR0VOX1JFQ1YpIHsKLQkJaWYgKCFidXMtPnBrdGdlbl9yY3ZkKQotCQkJYnJjbWZfc2RicmNtX3NkdGVzdF9zZXQoYnVzLCB0cnVlKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIE90aGVyd2lzZSwgZ2VuZXJhdGUgb3IgcmVxdWVzdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBwYWNrZXRzICovCi0JZm9yIChwa3Rjb3VudCA9IDA7IHBrdGNvdW50IDwgYnVzLT5wa3RnZW5fY291bnQ7IHBrdGNvdW50KyspIHsKLQkJLyogU3RvcCBpZiB0b3RhbCBoYXMgYmVlbiByZWFjaGVkICovCi0JCWlmIChidXMtPnBrdGdlbl90b3RhbAotCQkgICAgJiYgKGJ1cy0+cGt0Z2VuX3NlbnQgPj0gYnVzLT5wa3RnZW5fdG90YWwpKSB7Ci0JCQlidXMtPnBrdGdlbl9jb3VudCA9IDA7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIEFsbG9jYXRlIGFuIGFwcHJvcHJpYXRlLXNpemVkIHBhY2tldCAqLwotCQlsZW4gPSBidXMtPnBrdGdlbl9sZW47Ci0JCXBrdCA9IGJyY211X3BrdF9idWZfZ2V0X3NrYigKLQkJCWxlbiArIFNEUENNX0hEUkxFTiArIFNEUENNX1RFU1RfSERSTEVOICsgQlJDTUZfU0RBTElHTiwKLQkJCXRydWUpOwotCQlpZiAoIXBrdCkgewotCQkJQlJDTUZfRVJST1IoKCIlczogYnJjbXVfcGt0X2J1Zl9nZXRfc2tiIGZhaWxlZCFcbiIsCi0JCQkJICAgICBfX2Z1bmNfXykpOwotCQkJYnJlYWs7Ci0JCX0KLQkJUEtUQUxJR04ocGt0LCAobGVuICsgU0RQQ01fSERSTEVOICsgU0RQQ01fVEVTVF9IRFJMRU4pLAotCQkJIEJSQ01GX1NEQUxJR04pOwotCQlkYXRhID0gKHU4ICopIChwa3QtPmRhdGEpICsgU0RQQ01fSERSTEVOOwotCi0JCS8qIFdyaXRlIHRlc3QgaGVhZGVyIGNtZCBhbmQgZXh0cmEgYmFzZWQgb24gbW9kZSAqLwotCQlzd2l0Y2ggKGJ1cy0+cGt0Z2VuX21vZGUpIHsKLQkJY2FzZSBCUkNNRl9QS1RHRU5fRUNITzoKLQkJCSpkYXRhKysgPSBTRFBDTV9URVNUX0VDSE9SRVE7Ci0JCQkqZGF0YSsrID0gKHU4KSBidXMtPnBrdGdlbl9zZW50OwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBCUkNNRl9QS1RHRU5fU0VORDoKLQkJCSpkYXRhKysgPSBTRFBDTV9URVNUX0RJU0NBUkQ7Ci0JCQkqZGF0YSsrID0gKHU4KSBidXMtPnBrdGdlbl9zZW50OwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBCUkNNRl9QS1RHRU5fUlhCVVJTVDoKLQkJCSpkYXRhKysgPSBTRFBDTV9URVNUX0JVUlNUOwotCQkJKmRhdGErKyA9ICh1OCkgYnVzLT5wa3RnZW5fY291bnQ7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJQlJDTUZfRVJST1IoKCJVbnJlY29nbml6ZWQgcGt0Z2VuIG1vZGUgJWRcbiIsCi0JCQkJICAgICBidXMtPnBrdGdlbl9tb2RlKSk7Ci0JCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKHBrdCwgdHJ1ZSk7Ci0JCQlidXMtPnBrdGdlbl9jb3VudCA9IDA7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKiBXcml0ZSB0ZXN0IGhlYWRlciBsZW5ndGggZmllbGQgKi8KLQkJKmRhdGErKyA9IChsZW4gPj4gMCk7Ci0JCSpkYXRhKysgPSAobGVuID4+IDgpOwotCi0JCS8qIFRoZW4gZmlsbCBpbiB0aGUgcmVtYWluZGVyIC0tIE4vQSBmb3IgYnVyc3QsCi0JCQkgYnV0IHdobyBjYXJlcy4uLiAqLwotCQlmb3IgKGZpbGxieXRlID0gMDsgZmlsbGJ5dGUgPCBsZW47IGZpbGxieXRlKyspCi0JCQkqZGF0YSsrID0KLQkJCSAgICBTRFBDTV9URVNUX0ZJTEwoZmlsbGJ5dGUsICh1OCkgYnVzLT5wa3RnZW5fc2VudCk7Ci0KLSNpZmRlZiBCQ01EQkcKLQkJaWYgKEJSQ01GX0JZVEVTX09OKCkgJiYgQlJDTUZfREFUQV9PTigpKSB7Ci0JCQlkYXRhID0gKHU4ICopIChwa3QtPmRhdGEpICsgU0RQQ01fSERSTEVOOwotCQkJcHJpbnRrKEtFUk5fREVCVUcgImJyY21mX3NkYnJjbV9wa3RnZW46IFR4IERhdGE6XG4iKTsKLQkJCXByaW50X2hleF9kdW1wX2J5dGVzKCIiLCBEVU1QX1BSRUZJWF9PRkZTRVQsIGRhdGEsCi0JCQkJCSAgICAgcGt0LT5sZW4gLSBTRFBDTV9IRFJMRU4pOwotCQl9Ci0jZW5kaWYKLQotCQkvKiBTZW5kIGl0ICovCi0JCWlmIChicmNtZl9zZGJyY21fdHhwa3QoYnVzLCBwa3QsIFNEUENNX1RFU1RfQ0hBTk5FTCwgdHJ1ZSkpIHsKLQkJCWJ1cy0+cGt0Z2VuX2ZhaWwrKzsKLQkJCWlmIChidXMtPnBrdGdlbl9zdG9wCi0JCQkgICAgJiYgYnVzLT5wa3RnZW5fc3RvcCA9PSBidXMtPnBrdGdlbl9mYWlsKQotCQkJCWJ1cy0+cGt0Z2VuX2NvdW50ID0gMDsKLQkJfQotCQlidXMtPnBrdGdlbl9zZW50Kys7Ci0KLQkJLyogQnVtcCBsZW5ndGggaWYgbm90IGZpeGVkLCB3cmFwIGF0IG1heCAqLwotCQlpZiAoKytidXMtPnBrdGdlbl9sZW4gPiBidXMtPnBrdGdlbl9tYXhsZW4pCi0JCQlidXMtPnBrdGdlbl9sZW4gPSAodTE2KSBidXMtPnBrdGdlbl9taW5sZW47Ci0KLQkJLyogU3BlY2lhbCBjYXNlIGZvciBidXJzdCBtb2RlOiBqdXN0IHNlbmQgb25lIHJlcXVlc3QhICovCi0JCWlmIChidXMtPnBrdGdlbl9tb2RlID09IEJSQ01GX1BLVEdFTl9SWEJVUlNUKQotCQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fc2R0ZXN0X3NldChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIGJvb2wgc3RhcnQpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnBrdDsKLQl1OCAqZGF0YTsKLQotCS8qIEFsbG9jYXRlIHRoZSBwYWNrZXQgKi8KLQlwa3QgPSBicmNtdV9wa3RfYnVmX2dldF9za2IoU0RQQ01fSERSTEVOICsgU0RQQ01fVEVTVF9IRFJMRU4gKwotCQlCUkNNRl9TREFMSUdOLCB0cnVlKTsKLQlpZiAoIXBrdCkgewotCQlCUkNNRl9FUlJPUigoIiVzOiBicmNtdV9wa3RfYnVmX2dldF9za2IgZmFpbGVkIVxuIiwgX19mdW5jX18pKTsKLQkJcmV0dXJuOwotCX0KLQlQS1RBTElHTihwa3QsIChTRFBDTV9IRFJMRU4gKyBTRFBDTV9URVNUX0hEUkxFTiksIEJSQ01GX1NEQUxJR04pOwotCWRhdGEgPSAodTggKikgKHBrdC0+ZGF0YSkgKyBTRFBDTV9IRFJMRU47Ci0KLQkvKiBGaWxsIGluIHRoZSB0ZXN0IGhlYWRlciAqLwotCSpkYXRhKysgPSBTRFBDTV9URVNUX1NFTkQ7Ci0JKmRhdGErKyA9IHN0YXJ0OwotCSpkYXRhKysgPSAoYnVzLT5wa3RnZW5fbWF4bGVuID4+IDApOwotCSpkYXRhKysgPSAoYnVzLT5wa3RnZW5fbWF4bGVuID4+IDgpOwotCi0JLyogU2VuZCBpdCAqLwotCWlmIChicmNtZl9zZGJyY21fdHhwa3QoYnVzLCBwa3QsIFNEUENNX1RFU1RfQ0hBTk5FTCwgdHJ1ZSkpCi0JCWJ1cy0+cGt0Z2VuX2ZhaWwrKzsKLX0KLQotc3RhdGljIHZvaWQKLWJyY21mX3NkYnJjbV9jaGVja2RpZWQoc3RydWN0IGJyY21mX2J1cyAqYnVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCB1aW50IHNlcSkKLXsKLQl1OCAqZGF0YTsKLQl1aW50IHBrdGxlbjsKLQotCXU4IGNtZDsKLQl1OCBleHRyYTsKLQl1MTYgbGVuOwotCXUxNiBvZmZzZXQ7Ci0KLQkvKiBDaGVjayBmb3IgbWluIGxlbmd0aCAqLwotCXBrdGxlbiA9IHBrdC0+bGVuOwotCWlmIChwa3RsZW4gPCBTRFBDTV9URVNUX0hEUkxFTikgewotCQlCUkNNRl9FUlJPUigoImJyY21mX3NkYnJjbV9jaGVja2RpZWQ6IHRvc3MgcnVudCBmcmFtZSwgcGt0bGVuICIKLQkJCSAgICAgIiVkXG4iLCBwa3RsZW4pKTsKLQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihwa3QsIGZhbHNlKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIEV4dHJhY3QgaGVhZGVyIGZpZWxkcyAqLwotCWRhdGEgPSBwa3QtPmRhdGE7Ci0JY21kID0gKmRhdGErKzsKLQlleHRyYSA9ICpkYXRhKys7Ci0JbGVuID0gKmRhdGErKzsKLQlsZW4gKz0gKmRhdGErKyA8PCA4OwotCi0JLyogQ2hlY2sgbGVuZ3RoIGZvciByZWxldmFudCBjb21tYW5kcyAqLwotCWlmIChjbWQgPT0gU0RQQ01fVEVTVF9ESVNDQVJEIHx8IGNtZCA9PSBTRFBDTV9URVNUX0VDSE9SRVEKLQkgICAgfHwgY21kID09IFNEUENNX1RFU1RfRUNIT1JTUCkgewotCQlpZiAocGt0bGVuICE9IGxlbiArIFNEUENNX1RFU1RfSERSTEVOKSB7Ci0JCQlCUkNNRl9FUlJPUigoImJyY21mX3NkYnJjbV9jaGVja2RpZWQ6IGZyYW1lIGxlbmd0aCAiCi0JCQkJICAgICAibWlzbWF0Y2gsIHBrdGxlbiAlZCBzZXEgJWQiCi0JCQkJICAgICAiIGNtZCAlZCBleHRyYSAlZCBsZW4gJWRcbiIsCi0JCQkJICAgICBwa3RsZW4sIHNlcSwgY21kLCBleHRyYSwgbGVuKSk7Ci0JCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKHBrdCwgZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyogUHJvY2VzcyBhcyBwZXIgY29tbWFuZCAqLwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTRFBDTV9URVNUX0VDSE9SRVE6Ci0JCS8qIFJ4LT5UeCB0dXJuYXJvdW5kIG9rIChldmVuIG9uIE5ESVMgdy9jdXJyZW50Ci0JCQkgaW1wbGVtZW50YXRpb24pICovCi0JCSoodTggKikgKHBrdC0+ZGF0YSkgPSBTRFBDTV9URVNUX0VDSE9SU1A7Ci0JCWlmIChicmNtZl9zZGJyY21fdHhwa3QoYnVzLCBwa3QsIFNEUENNX1RFU1RfQ0hBTk5FTCwgdHJ1ZSkgPT0gMCkKLQkJCWJ1cy0+cGt0Z2VuX3NlbnQrKzsKLQkJZWxzZSB7Ci0JCQlidXMtPnBrdGdlbl9mYWlsKys7Ci0JCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKHBrdCwgZmFsc2UpOwotCQl9Ci0JCWJ1cy0+cGt0Z2VuX3JjdmQrKzsKLQkJYnJlYWs7Ci0KLQljYXNlIFNEUENNX1RFU1RfRUNIT1JTUDoKLQkJaWYgKGJ1cy0+ZXh0X2xvb3ApIHsKLQkJCWJyY211X3BrdF9idWZfZnJlZV9za2IocGt0LCBmYWxzZSk7Ci0JCQlidXMtPnBrdGdlbl9yY3ZkKys7Ci0JCQlicmVhazsKLQkJfQotCi0JCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgbGVuOyBvZmZzZXQrKywgZGF0YSsrKSB7Ci0JCQlpZiAoKmRhdGEgIT0gU0RQQ01fVEVTVF9GSUxMKG9mZnNldCwgZXh0cmEpKSB7Ci0JCQkJQlJDTUZfRVJST1IoKCJicmNtZl9zZGJyY21fY2hlY2tkaWVkOiBlY2hvIgotCQkJCQkgICAgICIgZGF0YSBtaXNtYXRjaDogIgotCQkJCQkgICAgICJvZmZzZXQgJWQgKGxlbiAlZCkgIgotCQkJCQkgICAgICJleHBlY3QgMHglMDJ4IHJjdmQgMHglMDJ4XG4iLAotCQkJCQkgICAgIG9mZnNldCwgbGVuLAotCQkJCQkgICAgIFNEUENNX1RFU1RfRklMTChvZmZzZXQsIGV4dHJhKSwKLQkJCQkJICAgICAqZGF0YSkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWJyY211X3BrdF9idWZfZnJlZV9za2IocGt0LCBmYWxzZSk7Ci0JCWJ1cy0+cGt0Z2VuX3JjdmQrKzsKLQkJYnJlYWs7Ci0KLQljYXNlIFNEUENNX1RFU1RfRElTQ0FSRDoKLQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihwa3QsIGZhbHNlKTsKLQkJYnVzLT5wa3RnZW5fcmN2ZCsrOwotCQlicmVhazsKLQotCWNhc2UgU0RQQ01fVEVTVF9CVVJTVDoKLQljYXNlIFNEUENNX1RFU1RfU0VORDoKLQlkZWZhdWx0OgotCQlCUkNNRl9JTkZPKCgiYnJjbWZfc2RicmNtX2NoZWNrZGllZDogdW5zdXBwb3J0ZWQgb3IgdW5rbm93biAiCi0JCQkgICAgImNvbW1hbmQsIHBrdGxlbiAlZCBzZXEgJWQiICIgY21kICVkIGV4dHJhICVkIgotCQkJICAgICIgbGVuICVkXG4iLCBwa3RsZW4sIHNlcSwgY21kLCBleHRyYSwgbGVuKSk7Ci0JCWJyY211X3BrdF9idWZfZnJlZV9za2IocGt0LCBmYWxzZSk7Ci0JCWJyZWFrOwotCX0KLQotCS8qIEZvciByZWN2IG1vZGUsIHN0b3AgYXQgbGltaWUgKGFuZCB0ZWxsIGRvbmdsZSB0byBzdG9wIHNlbmRpbmcpICovCi0JaWYgKGJ1cy0+cGt0Z2VuX21vZGUgPT0gQlJDTUZfUEtUR0VOX1JFQ1YpIHsKLQkJaWYgKGJ1cy0+cGt0Z2VuX3RvdGFsCi0JCSAgICAmJiAoYnVzLT5wa3RnZW5fcmN2ZCA+PSBidXMtPnBrdGdlbl90b3RhbCkpIHsKLQkJCWJ1cy0+cGt0Z2VuX2NvdW50ID0gMDsKLQkJCWJyY21mX3NkYnJjbV9zZHRlc3Rfc2V0KGJ1cywgZmFsc2UpOwotCQl9Ci0JfQotfQotI2VuZGlmCQkJCS8qIFNEVEVTVCAqLwotCi1leHRlcm4gYm9vbCBicmNtZl9zZGJyY21fYnVzX3dhdGNoZG9nKHN0cnVjdCBicmNtZl9wdWIgKmRydnIpCi17Ci0Jc3RydWN0IGJyY21mX2J1cyAqYnVzOwotCi0JQlJDTUZfVElNRVIoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQlidXMgPSBkcnZyLT5idXM7Ci0KLQlpZiAoYnVzLT5kcnZyLT5kb25nbGVfcmVzZXQpCi0JCXJldHVybiBmYWxzZTsKLQotCS8qIElnbm9yZSB0aGUgdGltZXIgaWYgc2ltdWxhdGluZyBidXMgZG93biAqLwotCWlmIChidXMtPnNsZWVwaW5nKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlicmNtZl9zZGJyY21fc2Rsb2NrKGJ1cyk7Ci0KLQkvKiBQb2xsIHBlcmlvZDogY2hlY2sgZGV2aWNlIGlmIGFwcHJvcHJpYXRlLiAqLwotCWlmIChidXMtPnBvbGwgJiYgKCsrYnVzLT5wb2xsdGljayA+PSBidXMtPnBvbGxyYXRlKSkgewotCQl1MzIgaW50c3RhdHVzID0gMDsKLQotCQkvKiBSZXNldCBwb2xsIHRpY2sgKi8KLQkJYnVzLT5wb2xsdGljayA9IDA7Ci0KLQkJLyogQ2hlY2sgZGV2aWNlIGlmIG5vIGludGVycnVwdHMgKi8KLQkJaWYgKCFidXMtPmludHIgfHwgKGJ1cy0+aW50cmNvdW50ID09IGJ1cy0+bGFzdGludHJzKSkgewotCi0JCQlpZiAoIWJ1cy0+ZHBjX3NjaGVkKSB7Ci0JCQkJdTggZGV2cGVuZDsKLQkJCQlkZXZwZW5kID0gYnJjbWZfc2RjYXJkX2NmZ19yZWFkKGJ1cy0+Y2FyZCwKLQkJCQkJCVNESU9fRlVOQ18wLCBTRElPX0NDQ1JfSU5UeCwKLQkJCQkJCU5VTEwpOwotCQkJCWludHN0YXR1cyA9Ci0JCQkJICAgIGRldnBlbmQgJiAoSU5UUl9TVEFUVVNfRlVOQzEgfAotCQkJCQkgICAgICAgSU5UUl9TVEFUVVNfRlVOQzIpOwotCQkJfQotCi0JCQkvKiBJZiB0aGVyZSBpcyBzb21ldGhpbmcsIG1ha2UgbGlrZSB0aGUgSVNSIGFuZAotCQkJCSBzY2hlZHVsZSB0aGUgRFBDICovCi0JCQlpZiAoaW50c3RhdHVzKSB7Ci0JCQkJYnVzLT5wb2xsY250Kys7Ci0JCQkJYnVzLT5pcGVuZCA9IHRydWU7Ci0JCQkJaWYgKGJ1cy0+aW50cikKLQkJCQkJYnJjbWZfc2RjYXJkX2ludHJfZGlzYWJsZShidXMtPmNhcmQpOwotCi0JCQkJYnVzLT5kcGNfc2NoZWQgPSB0cnVlOwotCQkJCWJyY21mX3NkYnJjbV9zY2hlZF9kcGMoYnVzKTsKLQotCQkJfQotCQl9Ci0KLQkJLyogVXBkYXRlIGludGVycnVwdCB0cmFja2luZyAqLwotCQlidXMtPmxhc3RpbnRycyA9IGJ1cy0+aW50cmNvdW50OwotCX0KLSNpZmRlZiBCQ01EQkcKLQkvKiBQb2xsIGZvciBjb25zb2xlIG91dHB1dCBwZXJpb2RpY2FsbHkgKi8KLQlpZiAoZHJ2ci0+YnVzc3RhdGUgPT0gQlJDTUZfQlVTX0RBVEEgJiYgYnJjbWZfY29uc29sZV9tcyAhPSAwKSB7Ci0JCWJ1cy0+Y29uc29sZS5jb3VudCArPSBicmNtZl93YXRjaGRvZ19tczsKLQkJaWYgKGJ1cy0+Y29uc29sZS5jb3VudCA+PSBicmNtZl9jb25zb2xlX21zKSB7Ci0JCQlidXMtPmNvbnNvbGUuY291bnQgLT0gYnJjbWZfY29uc29sZV9tczsKLQkJCS8qIE1ha2Ugc3VyZSBiYWNrcGxhbmUgY2xvY2sgaXMgb24gKi8KLQkJCWJyY21mX3NkYnJjbV9jbGtjdGwoYnVzLCBDTEtfQVZBSUwsIGZhbHNlKTsKLQkJCWlmIChicmNtZl9zZGJyY21fcmVhZGNvbnNvbGUoYnVzKSA8IDApCi0JCQkJYnJjbWZfY29uc29sZV9tcyA9IDA7CS8qIE9uIGVycm9yLAotCQkJCQkJCSBzdG9wIHRyeWluZyAqLwotCQl9Ci0JfQotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwotCi0jaWZkZWYgU0RURVNUCi0JLyogR2VuZXJhdGUgcGFja2V0cyBpZiBjb25maWd1cmVkICovCi0JaWYgKGJ1cy0+cGt0Z2VuX2NvdW50ICYmICgrK2J1cy0+cGt0Z2VuX3RpY2sgPj0gYnVzLT5wa3RnZW5fZnJlcSkpIHsKLQkJLyogTWFrZSBzdXJlIGJhY2twbGFuZSBjbG9jayBpcyBvbiAqLwotCQlicmNtZl9zZGJyY21fY2xrY3RsKGJ1cywgQ0xLX0FWQUlMLCBmYWxzZSk7Ci0JCWJ1cy0+cGt0Z2VuX3RpY2sgPSAwOwotCQlicmNtZl9zZGJyY21fcGt0Z2VuKGJ1cyk7Ci0JfQotI2VuZGlmCi0KLQkvKiBPbiBpZGxlIHRpbWVvdXQgY2xlYXIgYWN0aXZpdHkgZmxhZyBhbmQvb3IgdHVybiBvZmYgY2xvY2sgKi8KLQlpZiAoKGJ1cy0+aWRsZXRpbWUgPiAwKSAmJiAoYnVzLT5jbGtzdGF0ZSA9PSBDTEtfQVZBSUwpKSB7Ci0JCWlmICgrK2J1cy0+aWRsZWNvdW50ID49IGJ1cy0+aWRsZXRpbWUpIHsKLQkJCWJ1cy0+aWRsZWNvdW50ID0gMDsKLQkJCWlmIChidXMtPmFjdGl2aXR5KSB7Ci0JCQkJYnVzLT5hY3Rpdml0eSA9IGZhbHNlOwotCQkJCWJyY21mX3NkYnJjbV93ZF90aW1lcihidXMsIGJyY21mX3dhdGNoZG9nX21zKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnJjbWZfc2RicmNtX2Nsa2N0bChidXMsIENMS19OT05FLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlicmNtZl9zZGJyY21fc2R1bmxvY2soYnVzKTsKLQotCXJldHVybiBidXMtPmlwZW5kOwotfQotCi0jaWZkZWYgQkNNREJHCi1zdGF0aWMgaW50IGJyY21mX3NkYnJjbV9idXNfY29uc29sZV9pbihzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLAotCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICptc2csIHVpbnQgbXNnbGVuKQotewotCXN0cnVjdCBicmNtZl9idXMgKmJ1cyA9IGRydnItPmJ1czsKLQl1MzIgYWRkciwgdmFsOwotCWludCBydjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcGt0OwotCi0JLyogQWRkcmVzcyBjb3VsZCBiZSB6ZXJvIGlmIENPTlNPTEUgOj0gMCBpbiBkb25nbGUgTWFrZWZpbGUgKi8KLQlpZiAoYnVzLT5jb25zb2xlX2FkZHIgPT0gMCkKLQkJcmV0dXJuIC1FTk9UU1VQUDsKLQotCS8qIEV4Y2x1c2l2ZSBidXMgYWNjZXNzICovCi0JYnJjbWZfc2RicmNtX3NkbG9jayhidXMpOwotCi0JLyogRG9uJ3QgYWxsb3cgaW5wdXQgaWYgZG9uZ2xlIGlzIGluIHJlc2V0ICovCi0JaWYgKGJ1cy0+ZHJ2ci0+ZG9uZ2xlX3Jlc2V0KSB7Ci0JCWJyY21mX3NkYnJjbV9zZHVubG9jayhidXMpOwotCQlyZXR1cm4gLUVQRVJNOwotCX0KLQotCS8qIFJlcXVlc3QgY2xvY2sgdG8gYWxsb3cgU0RJTyBhY2Nlc3NlcyAqLwotCUJVU19XQUtFKGJ1cyk7Ci0JLyogTm8gcGVuZCBhbGxvd2VkIHNpbmNlIHR4cGt0IGlzIGNhbGxlZCBsYXRlciwgaHQgY2xrIGhhcyB0byBiZSBvbiAqLwotCWJyY21mX3NkYnJjbV9jbGtjdGwoYnVzLCBDTEtfQVZBSUwsIGZhbHNlKTsKLQotCS8qIFplcm8gY2J1Zl9pbmRleCAqLwotCWFkZHIgPSBidXMtPmNvbnNvbGVfYWRkciArIG9mZnNldG9mKHN0cnVjdCBydGVfY29uc29sZSwgY2J1Zl9pZHgpOwotCXZhbCA9IGNwdV90b19sZTMyKDApOwotCXJ2ID0gYnJjbWZfc2RicmNtX21lbWJ5dGVzKGJ1cywgdHJ1ZSwgYWRkciwgKHU4ICopJnZhbCwgc2l6ZW9mKHZhbCkpOwotCWlmIChydiA8IDApCi0JCWdvdG8gZG9uZTsKLQotCS8qIFdyaXRlIG1lc3NhZ2UgaW50byBjYnVmICovCi0JYWRkciA9IGJ1cy0+Y29uc29sZV9hZGRyICsgb2Zmc2V0b2Yoc3RydWN0IHJ0ZV9jb25zb2xlLCBjYnVmKTsKLQlydiA9IGJyY21mX3NkYnJjbV9tZW1ieXRlcyhidXMsIHRydWUsIGFkZHIsICh1OCAqKW1zZywgbXNnbGVuKTsKLQlpZiAocnYgPCAwKQotCQlnb3RvIGRvbmU7Ci0KLQkvKiBXcml0ZSBsZW5ndGggaW50byB2Y29uc19pbiAqLwotCWFkZHIgPSBidXMtPmNvbnNvbGVfYWRkciArIG9mZnNldG9mKHN0cnVjdCBydGVfY29uc29sZSwgdmNvbnNfaW4pOwotCXZhbCA9IGNwdV90b19sZTMyKG1zZ2xlbik7Ci0JcnYgPSBicmNtZl9zZGJyY21fbWVtYnl0ZXMoYnVzLCB0cnVlLCBhZGRyLCAodTggKikmdmFsLCBzaXplb2YodmFsKSk7Ci0JaWYgKHJ2IDwgMCkKLQkJZ290byBkb25lOwotCi0JLyogQnVtcCBkb25nbGUgYnkgc2VuZGluZyBhbiBlbXB0eSBldmVudCBwa3QuCi0JICogc2RwY21fc2VuZHVwIChSWCkgY2hlY2tzIGZvciB2aXJ0dWFsIGNvbnNvbGUgaW5wdXQuCi0JICovCi0JcGt0ID0gYnJjbXVfcGt0X2J1Zl9nZXRfc2tiKDQgKyBTRFBDTV9SRVNFUlZFKTsKLQlpZiAoKHBrdCAhPSBOVUxMKSAmJiBidXMtPmNsa3N0YXRlID09IENMS19BVkFJTCkKLQkJYnJjbWZfc2RicmNtX3R4cGt0KGJ1cywgcGt0LCBTRFBDTV9FVkVOVF9DSEFOTkVMLCB0cnVlKTsKLQotZG9uZToKLQlpZiAoKGJ1cy0+aWRsZXRpbWUgPT0gQlJDTUZfSURMRV9JTU1FRElBVEUpICYmICFidXMtPmRwY19zY2hlZCkgewotCQlidXMtPmFjdGl2aXR5ID0gZmFsc2U7Ci0JCWJyY21mX3NkYnJjbV9jbGtjdGwoYnVzLCBDTEtfTk9ORSwgdHJ1ZSk7Ci0JfQotCi0JYnJjbWZfc2RicmNtX3NkdW5sb2NrKGJ1cyk7Ci0KLQlyZXR1cm4gcnY7Ci19Ci0jZW5kaWYJCQkJLyogQkNNREJHICovCi0KLXN0YXRpYyBib29sIGJyY21mX3NkYnJjbV9jaGlwbWF0Y2godTE2IGNoaXBpZCkKLXsKLQlpZiAoY2hpcGlkID09IEJDTTQzMjVfQ0hJUF9JRCkKLQkJcmV0dXJuIHRydWU7Ci0JaWYgKGNoaXBpZCA9PSBCQ000MzI5X0NISVBfSUQpCi0JCXJldHVybiB0cnVlOwotCWlmIChjaGlwaWQgPT0gQkNNNDMxOV9DSElQX0lEKQotCQlyZXR1cm4gdHJ1ZTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkICpicmNtZl9zZGJyY21fcHJvYmUodTE2IHZlbmlkLCB1MTYgZGV2aWQsIHUxNiBidXNfbm8sCi0JCQkgICB1MTYgc2xvdCwgdTE2IGZ1bmMsIHVpbnQgYnVzdHlwZSwgdTMyIHJlZ3N2YSwKLQkJCSAgIHZvaWQgKmNhcmQpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgYnJjbWZfYnVzICpidXM7Ci0KLQkvKiBJbml0IGdsb2JhbCB2YXJpYWJsZXMgYXQgcnVuLXRpbWUsIG5vdCBhcyBwYXJ0IG9mIHRoZSBkZWNsYXJhdGlvbi4KLQkgKiBUaGlzIGlzIHJlcXVpcmVkIHRvIHN1cHBvcnQgaW5pdC9kZS1pbml0IG9mIHRoZSBkcml2ZXIuCi0JICogSW5pdGlhbGl6YXRpb24KLQkgKiBvZiBnbG9iYWxzIGFzIHBhcnQgb2YgdGhlIGRlY2xhcmF0aW9uIHJlc3VsdHMgaW4gbm9uLWRldGVybWluaXN0aWMKLQkgKiBiZWhhdmlvciBzaW5jZSB0aGUgdmFsdWUgb2YgdGhlIGdsb2JhbHMgbWF5IGJlIGRpZmZlcmVudCBvbiB0aGUKLQkgKiBmaXJzdCB0aW1lIHRoYXQgdGhlIGRyaXZlciBpcyBpbml0aWFsaXplZCB2cyBzdWJzZXF1ZW50Ci0JICogaW5pdGlhbGl6YXRpb25zLgotCSAqLwotCWJyY21mX3R4Ym91bmQgPSBCUkNNRl9UWEJPVU5EOwotCWJyY21mX3J4Ym91bmQgPSBCUkNNRl9SWEJPVU5EOwotCWJyY21mX2FsaWduY3RsID0gdHJ1ZTsKLQlzZDFpZGxlID0gdHJ1ZTsKLQlicmNtZl9yZWFkYWhlYWQgPSB0cnVlOwotCXJldHJ5ZGF0YSA9IGZhbHNlOwotCWJyY21mX2RvbmdsZV9tZW1zaXplID0gMDsKLQlicmNtZl90eG1pbm1heCA9IEJSQ01GX1RYTUlOTUFYOwotCi0JZm9yY2VhbGlnbiA9IHRydWU7Ci0KLQlicmNtZl9jX2luaXQoKTsKLQotCUJSQ01GX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwotCUJSQ01GX0lORk8oKCIlczogdmVuaWQgMHglMDR4IGRldmlkIDB4JTA0eFxuIiwgX19mdW5jX18sIHZlbmlkLCBkZXZpZCkpOwotCi0JLyogV2UgbWFrZSBhbiBhc3N1bXB0aW9uIGFib3V0IGFkZHJlc3Mgd2luZG93IG1hcHBpbmdzOgotCSAqIHJlZ3N2YSA9PSBTSV9FTlVNX0JBU0UqLwotCi0JLyogU0RJTyBjYXIgcGFzc2VzIHZlbmlkIGFuZCBkZXZpZCBiYXNlZCBvbiBDSVMgcGFyc2luZyAtLSBidXQKLQkgKiBsb3ctcG93ZXIgc3RhcnQKLQkgKiBtZWFucyBlYXJseSBwYXJzZSBjb3VsZCBmYWlsLCBzbyBoZXJlIHdlIHNob3VsZCBnZXQgZWl0aGVyIGFuIElECi0JICogd2UgcmVjb2duaXplIE9SICgtMSkgaW5kaWNhdGluZyB3ZSBtdXN0IHJlcXVlc3QgcG93ZXIgZmlyc3QuCi0JICovCi0JLyogQ2hlY2sgdGhlIFZlbmRvciBJRCAqLwotCXN3aXRjaCAodmVuaWQpIHsKLQljYXNlIDB4MDAwMDoKLQljYXNlIFBDSV9WRU5ET1JfSURfQlJPQURDT006Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJSQ01GX0VSUk9SKCgiJXM6IHVua25vd24gdmVuZG9yOiAweCUwNHhcbiIsIF9fZnVuY19fLCB2ZW5pZCkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiBDaGVjayB0aGUgRGV2aWNlIElEIGFuZCBtYWtlIHN1cmUgaXQncyBvbmUgdGhhdCB3ZSBzdXBwb3J0ICovCi0Jc3dpdGNoIChkZXZpZCkgewotCWNhc2UgQkNNNDMyNV9EMTFEVUFMX0lEOgkvKiA0MzI1IDgwMi4xMWEvZyBpZCAqLwotCWNhc2UgQkNNNDMyNV9EMTFHX0lEOgkvKiA0MzI1IDgwMi4xMWcgMi40R2h6IGJhbmQgaWQgKi8KLQljYXNlIEJDTTQzMjVfRDExQV9JRDoJLyogNDMyNSA4MDIuMTFhIDVHaHogYmFuZCBpZCAqLwotCQlCUkNNRl9JTkZPKCgiJXM6IGZvdW5kIDQzMjUgRG9uZ2xlXG4iLCBfX2Z1bmNfXykpOwotCQlicmVhazsKLQljYXNlIEJDTTQzMjlfRDExTkRVQUxfSUQ6CS8qIDQzMjkgODAyLjExbiBkdWFsYmFuZCBkZXZpY2UgKi8KLQljYXNlIEJDTTQzMjlfRDExTjJHX0lEOgkvKiA0MzI5IDgwMi4xMW4gMi40RyBkZXZpY2UgKi8KLQljYXNlIEJDTTQzMjlfRDExTjVHX0lEOgkvKiA0MzI5IDgwMi4xMW4gNUcgZGV2aWNlICovCi0JY2FzZSAweDQzMjk6Ci0JCUJSQ01GX0lORk8oKCIlczogZm91bmQgNDMyOSBEb25nbGVcbiIsIF9fZnVuY19fKSk7Ci0JCWJyZWFrOwotCWNhc2UgQkNNNDMxOV9EMTFOX0lEOgkvKiA0MzE5IDgwMi4xMW4gaWQgKi8KLQljYXNlIEJDTTQzMTlfRDExTjJHX0lEOgkvKiA0MzE5IDgwMi4xMW4yZyBpZCAqLwotCWNhc2UgQkNNNDMxOV9EMTFONUdfSUQ6CS8qIDQzMTkgODAyLjExbjVnIGlkICovCi0JCUJSQ01GX0lORk8oKCIlczogZm91bmQgNDMxOSBEb25nbGVcbiIsIF9fZnVuY19fKSk7Ci0JCWJyZWFrOwotCWNhc2UgMDoKLQkJQlJDTUZfSU5GTygoIiVzOiBhbGxvdyBkZXZpY2UgaWQgMCwgd2lsbCBjaGVjayBjaGlwIgotCQkJICAgICIgaW50ZXJuYWxzXG4iLCBfX2Z1bmNfXykpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCUJSQ01GX0VSUk9SKCgiJXM6IHNraXBwaW5nIDB4JTA0eC8weCUwNHgsIG5vdCBhIGRvbmdsZVxuIiwKLQkJCSAgICAgX19mdW5jX18sIHZlbmlkLCBkZXZpZCkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSBwcml2YXRlIGJ1cyBpbnRlcmZhY2Ugc3RhdGUgKi8KLQlidXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnJjbWZfYnVzKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFidXMpIHsKLQkJQlJDTUZfRVJST1IoKCIlczoga21hbGxvYyBvZiBzdHJ1Y3QgZGhkX2J1cyBmYWlsZWRcbiIsCi0JCQkgICAgIF9fZnVuY19fKSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0JYnVzLT5jYXJkID0gY2FyZDsKLQlidXMtPmNsX2RldmlkID0gKHUxNikgZGV2aWQ7Ci0JYnVzLT5idXMgPSBCUkNNRl9CVVM7Ci0JYnVzLT50eF9zZXEgPSBTRFBDTV9TRVFVRU5DRV9XUkFQIC0gMTsKLQlidXMtPnVzZWJ1ZnBvb2wgPSBmYWxzZTsJLyogVXNlIGJ1ZnBvb2wgaWYgYWxsb2NhdGVkLAotCQkJCQkgZWxzZSB1c2UgbG9jYWxseSBtYWxsb2NlZCByeGJ1ZiAqLwotCi0JLyogYXR0ZW1wdCB0byBhdHRhY2ggdG8gdGhlIGRvbmdsZSAqLwotCWlmICghKGJyY21mX3NkYnJjbV9wcm9iZV9hdHRhY2goYnVzLCBjYXJkLCByZWdzdmEsIGRldmlkKSkpIHsKLQkJQlJDTUZfRVJST1IoKCIlczogYnJjbWZfc2RicmNtX3Byb2JlX2F0dGFjaCBmYWlsZWRcbiIsCi0JCQkgICAgIF9fZnVuY19fKSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlzcGluX2xvY2tfaW5pdCgmYnVzLT50eHFsb2NrKTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZidXMtPmN0cmxfd2FpdCk7Ci0KLQkvKiBTZXQgdXAgdGhlIHdhdGNoZG9nIHRpbWVyICovCi0JaW5pdF90aW1lcigmYnVzLT50aW1lcik7Ci0JYnVzLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpYnVzOwotCWJ1cy0+dGltZXIuZnVuY3Rpb24gPSBicmNtZl9zZGJyY21fd2F0Y2hkb2c7Ci0KLQkvKiBJbml0aWFsaXplIHRocmVhZCBiYXNlZCBvcGVyYXRpb24gYW5kIGxvY2sgKi8KLQlpZiAoKGJyY21mX3dhdGNoZG9nX3ByaW8gPj0gMCkgJiYgKGJyY21mX2RwY19wcmlvID49IDApKSB7Ci0JCWJ1cy0+dGhyZWFkc19vbmx5ID0gdHJ1ZTsKLQkJc2VtYV9pbml0KCZidXMtPnNkc2VtLCAxKTsKLQl9IGVsc2UgewotCQlidXMtPnRocmVhZHNfb25seSA9IGZhbHNlOwotCQlzcGluX2xvY2tfaW5pdCgmYnVzLT5zZGxvY2spOwotCX0KLQotCWlmIChicmNtZl9kcGNfcHJpbyA+PSAwKSB7Ci0JCS8qIEluaXRpYWxpemUgd2F0Y2hkb2cgdGhyZWFkICovCi0JCWluaXRfY29tcGxldGlvbigmYnVzLT53YXRjaGRvZ193YWl0KTsKLQkJYnVzLT53YXRjaGRvZ190c2sgPSBrdGhyZWFkX3J1bihicmNtZl9zZGJyY21fd2F0Y2hkb2dfdGhyZWFkLAotCQkJCQkJYnVzLCAiYnJjbWZfd2F0Y2hkb2ciKTsKLQkJaWYgKElTX0VSUihidXMtPndhdGNoZG9nX3RzaykpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAgICAiYnJjbWZfd2F0Y2hkb2cgdGhyZWFkIGZhaWxlZCB0byBzdGFydFxuIik7Ci0JCQlidXMtPndhdGNoZG9nX3RzayA9IE5VTEw7Ci0JCX0KLQl9IGVsc2UKLQkJYnVzLT53YXRjaGRvZ190c2sgPSBOVUxMOwotCi0JLyogU2V0IHVwIHRoZSBib3R0b20gaGFsZiBoYW5kbGVyICovCi0JaWYgKGJyY21mX2RwY19wcmlvID49IDApIHsKLQkJLyogSW5pdGlhbGl6ZSBEUEMgdGhyZWFkICovCi0JCWluaXRfY29tcGxldGlvbigmYnVzLT5kcGNfd2FpdCk7Ci0JCWJ1cy0+ZHBjX3RzayA9IGt0aHJlYWRfcnVuKGJyY21mX3NkYnJjbV9kcGNfdGhyZWFkLAotCQkJCQkgICBidXMsICJicmNtZl9kcGMiKTsKLQkJaWYgKElTX0VSUihidXMtPmRwY190c2spKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgImJyY21mX2RwYyB0aHJlYWQgZmFpbGVkIHRvIHN0YXJ0XG4iKTsKLQkJCWJ1cy0+ZHBjX3RzayA9IE5VTEw7Ci0JCX0KLQl9IGVsc2UgewotCQl0YXNrbGV0X2luaXQoJmJ1cy0+dGFza2xldCwgYnJjbWZfc2RicmNtX2RwY190YXNrbGV0LAotCQkJICAgICAodW5zaWduZWQgbG9uZylidXMpOwotCQlidXMtPmRwY190c2sgPSBOVUxMOwotCX0KLQotCS8qIEF0dGFjaCB0byB0aGUgYnJjbWYvT1MvbmV0d29yayBpbnRlcmZhY2UgKi8KLQlidXMtPmRydnIgPSBicmNtZl9hdHRhY2goYnVzLCBTRFBDTV9SRVNFUlZFKTsKLQlpZiAoIWJ1cy0+ZHJ2cikgewotCQlCUkNNRl9FUlJPUigoIiVzOiBicmNtZl9hdHRhY2ggZmFpbGVkXG4iLCBfX2Z1bmNfXykpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogQWxsb2NhdGUgYnVmZmVycyAqLwotCWlmICghKGJyY21mX3NkYnJjbV9wcm9iZV9tYWxsb2MoYnVzLCBjYXJkKSkpIHsKLQkJQlJDTUZfRVJST1IoKCIlczogYnJjbWZfc2RicmNtX3Byb2JlX21hbGxvYyBmYWlsZWRcbiIsCi0JCQkgICAgIF9fZnVuY19fKSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlpZiAoIShicmNtZl9zZGJyY21fcHJvYmVfaW5pdChidXMsIGNhcmQpKSkgewotCQlCUkNNRl9FUlJPUigoIiVzOiBicmNtZl9zZGJyY21fcHJvYmVfaW5pdCBmYWlsZWRcbiIsIF9fZnVuY19fKSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBSZWdpc3RlciBpbnRlcnJ1cHQgY2FsbGJhY2ssIGJ1dCBtYXNrIGl0IChub3Qgb3BlcmF0aW9uYWwgeWV0KS4gKi8KLQlCUkNNRl9JTlRSKCgiJXM6IGRpc2FibGUgU0RJTyBpbnRlcnJ1cHRzIChub3QgaW50ZXJlc3RlZCB5ZXQpXG4iLAotCQkgICAgX19mdW5jX18pKTsKLQlicmNtZl9zZGNhcmRfaW50cl9kaXNhYmxlKGNhcmQpOwotCXJldCA9IGJyY21mX3NkY2FyZF9pbnRyX3JlZyhjYXJkLCBicmNtZl9zZGJyY21faXNyLCBidXMpOwotCWlmIChyZXQgIT0gMCkgewotCQlCUkNNRl9FUlJPUigoIiVzOiBGQUlMRUQ6IHNkY2FyZF9pbnRyX3JlZyByZXR1cm5lZCAlZFxuIiwKLQkJCSAgICAgX19mdW5jX18sIHJldCkpOwotCQlnb3RvIGZhaWw7Ci0JfQotCUJSQ01GX0lOVFIoKCIlczogcmVnaXN0ZXJlZCBTRElPIGludGVycnVwdCBmdW5jdGlvbiBva1xuIiwgX19mdW5jX18pKTsKLQotCUJSQ01GX0lORk8oKCIlczogY29tcGxldGVkISFcbiIsIF9fZnVuY19fKSk7Ci0KLQkvKiBpZiBmaXJtd2FyZSBwYXRoIHByZXNlbnQgdHJ5IHRvIGRvd25sb2FkIGFuZCBicmluZyB1cCBidXMgKi8KLQlyZXQgPSBicmNtZl9idXNfc3RhcnQoYnVzLT5kcnZyKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJaWYgKHJldCA9PSAtRU5PTElOSykgewotCQkJQlJDTUZfRVJST1IoKCIlczogZG9uZ2xlIGlzIG5vdCByZXNwb25kaW5nXG4iLAotCQkJCSAgICAgX19mdW5jX18pKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCX0KLQkvKiBPaywgaGF2ZSB0aGUgcGVyLXBvcnQgdGVsbCB0aGUgc3RhY2sgd2UncmUgb3BlbiBmb3IgYnVzaW5lc3MgKi8KLQlpZiAoYnJjbWZfbmV0X2F0dGFjaChidXMtPmRydnIsIDApICE9IDApIHsKLQkJQlJDTUZfRVJST1IoKCIlczogTmV0IGF0dGFjaCBmYWlsZWQhIVxuIiwgX19mdW5jX18pKTsKLQkJZ290byBmYWlsOwotCX0KLQotCXJldHVybiBidXM7Ci0KLWZhaWw6Ci0JYnJjbWZfc2RicmNtX3JlbGVhc2UoYnVzKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGJvb2wKLWJyY21mX3NkYnJjbV9wcm9iZV9hdHRhY2goc3RydWN0IGJyY21mX2J1cyAqYnVzLCB2b2lkICpjYXJkLCB1MzIgcmVnc3ZhLAotCQkJICB1MTYgZGV2aWQpCi17Ci0JdTggY2xrY3RsID0gMDsKLQlpbnQgZXJyID0gMDsKLQotCWJ1cy0+YWxwX29ubHkgPSB0cnVlOwotCi0JLyogUmV0dXJuIHRoZSB3aW5kb3cgdG8gYmFja3BsYW5lIGVudW1lcmF0aW9uIHNwYWNlIGZvciBjb3JlIGFjY2VzcyAqLwotCWlmIChicmNtZl9zZGJyY21fc2V0X3NpYWRkcl93aW5kb3coYnVzLCBTSV9FTlVNX0JBU0UpKQotCQlCUkNNRl9FUlJPUigoIiVzOiBGQUlMRUQgdG8gcmV0dXJuIHRvIFNJX0VOVU1fQkFTRVxuIiwKLQkJCSAgICAgX19mdW5jX18pKTsKLQotI2lmZGVmIEJDTURCRwotCXByaW50ayhLRVJOX0RFQlVHICJGMSBzaWduYXR1cmUgcmVhZCBAMHgxODAwMDAwMD0weCU0eFxuIiwKLQkgICAgICAgYnJjbWZfc2RjYXJkX3JlZ19yZWFkKGJ1cy0+Y2FyZCwgU0lfRU5VTV9CQVNFLCA0KSk7Ci0KLSNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KLQotCS8qCi0JICogRm9yY2UgUExMIG9mZiB1bnRpbCBicmNtZl9zZGJyY21fY2hpcF9hdHRhY2goKQotCSAqIHByb2dyYW1zIFBMTCBjb250cm9sIHJlZ3MKLQkgKi8KLQotCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoY2FyZCwgU0RJT19GVU5DXzEsIFNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSLAotCQkJIEJSQ01GX0lOSVRfQ0xLQ1RMMSwgJmVycik7Ci0JaWYgKCFlcnIpCi0JCWNsa2N0bCA9Ci0JCSAgICBicmNtZl9zZGNhcmRfY2ZnX3JlYWQoY2FyZCwgU0RJT19GVU5DXzEsCi0JCQkJCSAgU0JTRElPX0ZVTkMxX0NISVBDTEtDU1IsICZlcnIpOwotCi0JaWYgKGVyciB8fCAoKGNsa2N0bCAmIH5TQlNESU9fQVZCSVRTKSAhPSBCUkNNRl9JTklUX0NMS0NUTDEpKSB7Ci0JCUJSQ01GX0VSUk9SKCgiYnJjbWZfc2RicmNtX3Byb2JlOiBDaGlwQ2xrQ1NSIGFjY2VzczogZXJyICVkIgotCQkJICAgICAiIHdyb3RlIDB4JTAyeCByZWFkIDB4JTAyeFxuIiwKLQkJCSAgICAgZXJyLCBCUkNNRl9JTklUX0NMS0NUTDEsIGNsa2N0bCkpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JaWYgKGJyY21mX3NkYnJjbV9jaGlwX2F0dGFjaChidXMsIHJlZ3N2YSkpIHsKLQkJQlJDTUZfRVJST1IoKCIlczogYnJjbWZfc2RicmNtX2NoaXBfYXR0YWNoIGZhaWxlZCFcbiIsCi0JCQkgICAgIF9fZnVuY19fKSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlpZiAoIWJyY21mX3NkYnJjbV9jaGlwbWF0Y2goKHUxNikgYnVzLT5jaS0+Y2hpcCkpIHsKLQkJQlJDTUZfRVJST1IoKCIlczogdW5zdXBwb3J0ZWQgY2hpcDogMHglMDR4XG4iLAotCQkJICAgICBfX2Z1bmNfXywgYnVzLT5jaS0+Y2hpcCkpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JYnJjbWZfc2RicmNtX3NkaW9kX2RyaXZlX3N0cmVuZ3RoX2luaXQoYnVzLCBicmNtZl9zZGlvZF9kcml2ZV9zdHJlbmd0aCk7Ci0KLQkvKiBHZXQgaW5mbyBvbiB0aGUgQVJNIGFuZCBTT0NSQU0gY29yZXMuLi4gKi8KLQlpZiAoIUJSQ01GX05PUE1VKGJ1cykpIHsKLQkJYnJjbWZfc2RjYXJkX3JlZ19yZWFkKGJ1cy0+Y2FyZCwKLQkJCSAgQ09SRV9TQihidXMtPmNpLT5hcm1jb3JlYmFzZSwgc2JpZGhpZ2gpLCA0KTsKLQkJYnVzLT5vcmlnX3JhbXNpemUgPSBidXMtPmNpLT5yYW1zaXplOwotCQlpZiAoIShidXMtPm9yaWdfcmFtc2l6ZSkpIHsKLQkJCUJSQ01GX0VSUk9SKCgiJXM6IGZhaWxlZCB0byBmaW5kIFNPQ1JBTSBtZW1vcnkhXG4iLAotCQkJCSAgICAgX19mdW5jX18pKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlidXMtPnJhbXNpemUgPSBidXMtPm9yaWdfcmFtc2l6ZTsKLQkJaWYgKGJyY21mX2RvbmdsZV9tZW1zaXplKQotCQkJYnJjbWZfc2RicmNtX3NldG1lbXNpemUoYnVzLCBicmNtZl9kb25nbGVfbWVtc2l6ZSk7Ci0KLQkJQlJDTUZfRVJST1IoKCJESEQ6IGRvbmdsZSByYW0gc2l6ZSBpcyBzZXQgdG8gJWQob3JpZyAlZClcbiIsCi0JCQkgICAgIGJ1cy0+cmFtc2l6ZSwgYnVzLT5vcmlnX3JhbXNpemUpKTsKLQl9Ci0KLQkvKiBTZXQgY29yZSBjb250cm9sIHNvIGFuIFNESU8gcmVzZXQgZG9lcyBhIGJhY2twbGFuZSByZXNldCAqLwotCU9SX1JFRyhidXMtPmNpLT5idXNjb3JlYmFzZSArIG9mZnNldG9mKHN0cnVjdCBzZHBjbWRfcmVncywKLQkJCQkJCSAgICAgICBjb3JlY29udHJvbCksCi0JICAgICAgIENDX0JQUkVTRU4sIHUzMik7Ci0KLQlicmNtdV9wa3RxX2luaXQoJmJ1cy0+dHhxLCAoUFJJT01BU0sgKyAxKSwgVFhRTEVOKTsKLQotCS8qIExvY2F0ZSBhbiBhcHByb3ByaWF0ZWx5LWFsaWduZWQgcG9ydGlvbiBvZiBoZHJidWYgKi8KLQlidXMtPnJ4aGRyID0gKHU4ICopIHJvdW5kdXAoKHVuc2lnbmVkIGxvbmcpJmJ1cy0+aGRyYnVmWzBdLAotCQkJCSAgICBCUkNNRl9TREFMSUdOKTsKLQotCS8qIFNldCB0aGUgcG9sbCBhbmQvb3IgaW50ZXJydXB0IGZsYWdzICovCi0JYnVzLT5pbnRyID0gKGJvb2wpIGJyY21mX2ludHI7Ci0JYnVzLT5wb2xsID0gKGJvb2wpIGJyY21mX3BvbGw7Ci0JaWYgKGJ1cy0+cG9sbCkKLQkJYnVzLT5wb2xscmF0ZSA9IDE7Ci0KLQlyZXR1cm4gdHJ1ZTsKLQotZmFpbDoKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sIGJyY21mX3NkYnJjbV9wcm9iZV9tYWxsb2Moc3RydWN0IGJyY21mX2J1cyAqYnVzLCB2b2lkICpjYXJkKQotewotCUJSQ01GX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwotCi0JaWYgKGJ1cy0+ZHJ2ci0+bWF4Y3RsKSB7Ci0JCWJ1cy0+cnhibGVuID0KLQkJICAgIHJvdW5kdXAoKGJ1cy0+ZHJ2ci0+bWF4Y3RsICsgU0RQQ01fSERSTEVOKSwKLQkJCSAgICBBTElHTk1FTlQpICsgQlJDTUZfU0RBTElHTjsKLQkJYnVzLT5yeGJ1ZiA9IGttYWxsb2MoYnVzLT5yeGJsZW4sIEdGUF9BVE9NSUMpOwotCQlpZiAoIShidXMtPnJ4YnVmKSkgewotCQkJQlJDTUZfRVJST1IoKCIlczoga21hbGxvYyBvZiAlZC1ieXRlIHJ4YnVmIGZhaWxlZFxuIiwKLQkJCQkgICAgIF9fZnVuY19fLCBidXMtPnJ4YmxlbikpOwotCQkJZ290byBmYWlsOwotCQl9Ci0JfQotCi0JLyogQWxsb2NhdGUgYnVmZmVyIHRvIHJlY2VpdmUgZ2xvbWVkIHBhY2tldCAqLwotCWJ1cy0+ZGF0YWJ1ZiA9IGttYWxsb2MoTUFYX0RBVEFfQlVGLCBHRlBfQVRPTUlDKTsKLQlpZiAoIShidXMtPmRhdGFidWYpKSB7Ci0JCUJSQ01GX0VSUk9SKCgiJXM6IGttYWxsb2Mgb2YgJWQtYnl0ZSBkYXRhYnVmIGZhaWxlZFxuIiwKLQkJCSAgICAgX19mdW5jX18sIE1BWF9EQVRBX0JVRikpOwotCQkvKiByZWxlYXNlIHJ4YnVmIHdoaWNoIHdhcyBhbHJlYWR5IGxvY2F0ZWQgYXMgYWJvdmUgKi8KLQkJaWYgKCFidXMtPnJ4YmxlbikKLQkJCWtmcmVlKGJ1cy0+cnhidWYpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogQWxpZ24gdGhlIGJ1ZmZlciAqLwotCWlmICgodW5zaWduZWQgbG9uZylidXMtPmRhdGFidWYgJSBCUkNNRl9TREFMSUdOKQotCQlidXMtPmRhdGFwdHIgPSBidXMtPmRhdGFidWYgKyAoQlJDTUZfU0RBTElHTiAtCi0JCQkgICAgICAgKCh1bnNpZ25lZCBsb25nKWJ1cy0+ZGF0YWJ1ZiAlIEJSQ01GX1NEQUxJR04pKTsKLQllbHNlCi0JCWJ1cy0+ZGF0YXB0ciA9IGJ1cy0+ZGF0YWJ1ZjsKLQotCXJldHVybiB0cnVlOwotCi1mYWlsOgotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgYnJjbWZfc2RicmNtX3Byb2JlX2luaXQoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB2b2lkICpjYXJkKQotewotCXMzMiBmbnVtOwotCi0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLSNpZmRlZiBTRFRFU1QKLQlicmNtZl9zZGJyY21fcGt0Z2VuX2luaXQoYnVzKTsKLSNlbmRpZgkJCQkvKiBTRFRFU1QgKi8KLQotCS8qIERpc2FibGUgRjIgdG8gY2xlYXIgYW55IGludGVybWVkaWF0ZSBmcmFtZSBzdGF0ZSBvbiB0aGUgZG9uZ2xlICovCi0JYnJjbWZfc2RjYXJkX2NmZ193cml0ZShjYXJkLCBTRElPX0ZVTkNfMCwgU0RJT19DQ0NSX0lPRXgsCi0JCQkgICAgICAgU0RJT19GVU5DX0VOQUJMRV8xLCBOVUxMKTsKLQotCWJ1cy0+ZHJ2ci0+YnVzc3RhdGUgPSBCUkNNRl9CVVNfRE9XTjsKLQlidXMtPnNsZWVwaW5nID0gZmFsc2U7Ci0JYnVzLT5yeGZsb3cgPSBmYWxzZTsKLQotCS8qIERvbmUgd2l0aCBiYWNrcGxhbmUtZGVwZW5kZW50IGFjY2Vzc2VzLCBjYW4gZHJvcCBjbG9jay4uLiAqLwotCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoY2FyZCwgU0RJT19GVU5DXzEsIFNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSLCAwLAotCQkJICAgICAgIE5VTEwpOwotCi0JLyogLi4uYW5kIGluaXRpYWxpemUgY2xvY2svcG93ZXIgc3RhdGVzICovCi0JYnVzLT5jbGtzdGF0ZSA9IENMS19TRE9OTFk7Ci0JYnVzLT5pZGxldGltZSA9IChzMzIpIGJyY21mX2lkbGV0aW1lOwotCWJ1cy0+aWRsZWNsb2NrID0gQlJDTUZfSURMRV9BQ1RJVkU7Ci0KLQkvKiBRdWVyeSB0aGUgRjIgYmxvY2sgc2l6ZSwgc2V0IHJvdW5kdXAgYWNjb3JkaW5nbHkgKi8KLQlmbnVtID0gMjsKLQlpZiAoYnJjbWZfc2RjYXJkX2lvdmFyX29wKGNhcmQsICJzZF9ibG9ja3NpemUiLCAmZm51bSwgc2l6ZW9mKHMzMiksCi0JCQkgICAgJmJ1cy0+YmxvY2tzaXplLCBzaXplb2YoczMyKSwgZmFsc2UpICE9IDApIHsKLQkJYnVzLT5ibG9ja3NpemUgPSAwOwotCQlCUkNNRl9FUlJPUigoIiVzOiBmYWlsIG9uICVzIGdldFxuIiwgX19mdW5jX18sICJzZF9ibG9ja3NpemUiKSk7Ci0JfSBlbHNlIHsKLQkJQlJDTUZfSU5GTygoIiVzOiBJbml0aWFsIHZhbHVlIGZvciAlcyBpcyAlZFxuIiwKLQkJCSAgICBfX2Z1bmNfXywgInNkX2Jsb2Nrc2l6ZSIsIGJ1cy0+YmxvY2tzaXplKSk7Ci0JfQotCWJ1cy0+cm91bmR1cCA9IG1pbihtYXhfcm91bmR1cCwgYnVzLT5ibG9ja3NpemUpOwotCi0JLyogUXVlcnkgaWYgYnVzIG1vZHVsZSBzdXBwb3J0cyBwYWNrZXQgY2hhaW5pbmcsCi0JCSBkZWZhdWx0IHRvIHVzZSBpZiBzdXBwb3J0ZWQgKi8KLQlpZiAoYnJjbWZfc2RjYXJkX2lvdmFyX29wKGNhcmQsICJzZF9yeGNoYWluIiwgTlVMTCwgMCwKLQkJCSAgICAmYnVzLT5zZF9yeGNoYWluLCBzaXplb2YoczMyKSwKLQkJCSAgICBmYWxzZSkgIT0gMCkgewotCQlidXMtPnNkX3J4Y2hhaW4gPSBmYWxzZTsKLQl9IGVsc2UgewotCQlCUkNNRl9JTkZPKCgiJXM6IGJ1cyBtb2R1bGUgKHRocm91Z2ggc2Rpb2NhcmQgQVBJKSAlcyIKLQkJCSAgICAiIGNoYWluaW5nXG4iLCBfX2Z1bmNfXywgYnVzLT5zZF9yeGNoYWluCi0JCQkgICAgPyAic3VwcG9ydHMiIDogImRvZXMgbm90IHN1cHBvcnQiKSk7Ci0JfQotCWJ1cy0+dXNlX3J4Y2hhaW4gPSAoYm9vbCkgYnVzLT5zZF9yeGNoYWluOwotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sCi1icmNtZl9zZGJyY21fZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB2b2lkICpjYXJkKQotewotCWJvb2wgcmV0OwotCi0JLyogRG93bmxvYWQgdGhlIGZpcm13YXJlICovCi0JYnJjbWZfc2RicmNtX2Nsa2N0bChidXMsIENMS19BVkFJTCwgZmFsc2UpOwotCi0JcmV0ID0gX2JyY21mX3NkYnJjbV9kb3dubG9hZF9maXJtd2FyZShidXMpID09IDA7Ci0KLQlicmNtZl9zZGJyY21fY2xrY3RsKGJ1cywgQ0xLX1NET05MWSwgZmFsc2UpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyogRGV0YWNoIGFuZCBmcmVlIGV2ZXJ5dGhpbmcgKi8KLXN0YXRpYyB2b2lkIGJyY21mX3NkYnJjbV9yZWxlYXNlKHN0cnVjdCBicmNtZl9idXMgKmJ1cykKLXsKLQlCUkNNRl9UUkFDRSgoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKLQotCWlmIChidXMpIHsKLQkJLyogRGUtcmVnaXN0ZXIgaW50ZXJydXB0IGhhbmRsZXIgKi8KLQkJYnJjbWZfc2RjYXJkX2ludHJfZGlzYWJsZShidXMtPmNhcmQpOwotCQlicmNtZl9zZGNhcmRfaW50cl9kZXJlZyhidXMtPmNhcmQpOwotCi0JCWlmIChidXMtPmRydnIpIHsKLQkJCWJyY21mX2RldGFjaChidXMtPmRydnIpOwotCQkJYnJjbWZfc2RicmNtX3JlbGVhc2VfZG9uZ2xlKGJ1cyk7Ci0JCQlidXMtPmRydnIgPSBOVUxMOwotCQl9Ci0KLQkJYnJjbWZfc2RicmNtX3JlbGVhc2VfbWFsbG9jKGJ1cyk7Ci0KLQkJa2ZyZWUoYnVzKTsKLQl9Ci0KLQlCUkNNRl9UUkFDRSgoIiVzOiBEaXNjb25uZWN0ZWRcbiIsIF9fZnVuY19fKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21mX3NkYnJjbV9yZWxlYXNlX21hbGxvYyhzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCi17Ci0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQlpZiAoYnVzLT5kcnZyICYmIGJ1cy0+ZHJ2ci0+ZG9uZ2xlX3Jlc2V0KQotCQlyZXR1cm47Ci0KLQlrZnJlZShidXMtPnJ4YnVmKTsKLQlidXMtPnJ4Y3RsID0gYnVzLT5yeGJ1ZiA9IE5VTEw7Ci0JYnVzLT5yeGxlbiA9IDA7Ci0KLQlrZnJlZShidXMtPmRhdGFidWYpOwotCWJ1cy0+ZGF0YWJ1ZiA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21mX3NkYnJjbV9yZWxlYXNlX2RvbmdsZShzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCi17Ci0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQlpZiAoYnVzLT5kcnZyICYmIGJ1cy0+ZHJ2ci0+ZG9uZ2xlX3Jlc2V0KQotCQlyZXR1cm47Ci0KLQlpZiAoYnVzLT5jaSkgewotCQlicmNtZl9zZGJyY21fY2xrY3RsKGJ1cywgQ0xLX0FWQUlMLCBmYWxzZSk7Ci0JCWJyY21mX3NkYnJjbV9jbGtjdGwoYnVzLCBDTEtfTk9ORSwgZmFsc2UpOwotCQlicmNtZl9zZGJyY21fY2hpcF9kZXRhY2goYnVzKTsKLQkJaWYgKGJ1cy0+dmFycyAmJiBidXMtPnZhcnN6KQotCQkJa2ZyZWUoYnVzLT52YXJzKTsKLQkJYnVzLT52YXJzID0gTlVMTDsKLQl9Ci0KLQlCUkNNRl9UUkFDRSgoIiVzOiBEaXNjb25uZWN0ZWRcbiIsIF9fZnVuY19fKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21mX3NkYnJjbV9kaXNjb25uZWN0KHZvaWQgKnB0cikKLXsKLQlzdHJ1Y3QgYnJjbWZfYnVzICpidXMgPSAoc3RydWN0IGJyY21mX2J1cyAqKXB0cjsKLQotCUJSQ01GX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwotCi0JaWYgKGJ1cykgewotCQlicmNtZl9zZGJyY21fcmVsZWFzZShidXMpOwotCX0KLQotCUJSQ01GX1RSQUNFKCgiJXM6IERpc2Nvbm5lY3RlZFxuIiwgX19mdW5jX18pKTsKLX0KLQotLyogUmVnaXN0ZXIvVW5yZWdpc3RlciBmdW5jdGlvbnMgYXJlIGNhbGxlZCBieSB0aGUgbWFpbiBESEQgZW50cnkKLSAqIHBvaW50IChlLmcuIG1vZHVsZSBpbnNlcnRpb24pIHRvIGxpbmsgd2l0aCB0aGUgYnVzIGRyaXZlciwgaW4KLSAqIG9yZGVyIHRvIGxvb2sgZm9yIG9yIGF3YWl0IHRoZSBkZXZpY2UuCi0gKi8KLQotc3RhdGljIHN0cnVjdCBicmNtZl9zZGlvaF9kcml2ZXIgYnJjbWZfc2RpbyA9IHsKLQlicmNtZl9zZGJyY21fcHJvYmUsCi0JYnJjbWZfc2RicmNtX2Rpc2Nvbm5lY3QKLX07Ci0KLWludCBicmNtZl9idXNfcmVnaXN0ZXIodm9pZCkKLXsKLQlCUkNNRl9UUkFDRSgoIiVzOiBFbnRlclxuIiwgX19mdW5jX18pKTsKLQotCS8qIFNhbml0eSBjaGVjayBvbiB0aGUgbW9kdWxlIHBhcmFtZXRlcnMgKi8KLQlkbyB7Ci0JCS8qIEJvdGggd2F0Y2hkb2cgYW5kIERQQyBhcyB0YXNrbGV0cyBhcmUgb2sgKi8KLQkJaWYgKChicmNtZl93YXRjaGRvZ19wcmlvIDwgMCkgJiYgKGJyY21mX2RwY19wcmlvIDwgMCkpCi0JCQlicmVhazsKLQotCQkvKiBJZiBib3RoIHdhdGNoZG9nIGFuZCBEUEMgYXJlIHRocmVhZHMsIFRYIG11c3QgYmUgZGVmZXJyZWQgKi8KLQkJaWYgKChicmNtZl93YXRjaGRvZ19wcmlvID49IDApICYmIChicmNtZl9kcGNfcHJpbyA+PSAwKQotCQkgICAgJiYgYnJjbWZfZGVmZXJyZWRfdHgpCi0JCQlicmVhazsKLQotCQlCUkNNRl9FUlJPUigoIkludmFsaWQgbW9kdWxlIHBhcmFtZXRlcnMuXG4iKSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0gd2hpbGUgKDApOwotCi0JcmV0dXJuIGJyY21mX3NkaW9fcmVnaXN0ZXIoJmJyY21mX3NkaW8pOwotfQotCi12b2lkIGJyY21mX2J1c191bnJlZ2lzdGVyKHZvaWQpCi17Ci0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQlicmNtZl9zZGlvX3VucmVnaXN0ZXIoKTsKLX0KLQotc3RhdGljIGludCBicmNtZl9zZGJyY21fZG93bmxvYWRfY29kZV9maWxlKHN0cnVjdCBicmNtZl9idXMgKmJ1cykKLXsKLQlpbnQgb2Zmc2V0ID0gMDsKLQl1aW50IGxlbjsKLQl1OCAqbWVtYmxvY2sgPSBOVUxMLCAqbWVtcHRyOwotCWludCByZXQ7Ci0KLQlCUkNNRl9JTkZPKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwotCi0JYnVzLT5md19uYW1lID0gQkNNNDMyOV9GV19OQU1FOwotCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmJ1cy0+ZmlybXdhcmUsIGJ1cy0+ZndfbmFtZSwKLQkJCSAgICAgICAmZ0luc3RhbmNlLT5mdW5jWzJdLT5kZXYpOwotCWlmIChyZXQpIHsKLQkJQlJDTUZfRVJST1IoKCIlczogRmFpbCB0byByZXF1ZXN0IGZpcm13YXJlICVkXG4iLAotCQkJICAgICBfX2Z1bmNfXywgcmV0KSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCWJ1cy0+ZndfcHRyID0gMDsKLQotCW1lbXB0ciA9IG1lbWJsb2NrID0ga21hbGxvYyhNRU1CTE9DSyArIEJSQ01GX1NEQUxJR04sIEdGUF9BVE9NSUMpOwotCWlmIChtZW1ibG9jayA9PSBOVUxMKSB7Ci0JCUJSQ01GX0VSUk9SKCgiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgJWQgYnl0ZXNcbiIsCi0JCQkgICAgIF9fZnVuY19fLCBNRU1CTE9DSykpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycjsKLQl9Ci0JaWYgKCh1MzIpKHVuc2lnbmVkIGxvbmcpbWVtYmxvY2sgJSBCUkNNRl9TREFMSUdOKQotCQltZW1wdHIgKz0gKEJSQ01GX1NEQUxJR04gLQotCQkJICAgKCh1MzIpKHVuc2lnbmVkIGxvbmcpbWVtYmxvY2sgJSBCUkNNRl9TREFMSUdOKSk7Ci0KLQkvKiBEb3dubG9hZCBpbWFnZSAqLwotCXdoaWxlICgobGVuID0KLQkJYnJjbWZfc2RicmNtX2dldF9pbWFnZSgoY2hhciAqKW1lbXB0ciwgTUVNQkxPQ0ssIGJ1cykpKSB7Ci0JCXJldCA9IGJyY21mX3NkYnJjbV9tZW1ieXRlcyhidXMsIHRydWUsIG9mZnNldCwgbWVtcHRyLCBsZW4pOwotCQlpZiAocmV0KSB7Ci0JCQlCUkNNRl9FUlJPUigoIiVzOiBlcnJvciAlZCBvbiB3cml0aW5nICVkIG1lbWJ5dGVzIGF0ICIKLQkJCQkgICAgICIweCUwOHhcbiIsIF9fZnVuY19fLCByZXQsIE1FTUJMT0NLLAotCQkJCSAgICAgb2Zmc2V0KSk7Ci0JCQlnb3RvIGVycjsKLQkJfQotCi0JCW9mZnNldCArPSBNRU1CTE9DSzsKLQl9Ci0KLWVycjoKLQlrZnJlZShtZW1ibG9jayk7Ci0KLQlyZWxlYXNlX2Zpcm13YXJlKGJ1cy0+ZmlybXdhcmUpOwotCWJ1cy0+ZndfcHRyID0gMDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBQcm9jZXNzVmFyczpUYWtlcyBhIGJ1ZmZlciBvZiAiPHZhcj49PHZhbHVlPlxuIiBsaW5lcyByZWFkIGZyb20gYSBmaWxlCi0gKiBhbmQgZW5kaW5nIGluIGEgTlVMLgotICogUmVtb3ZlcyBjYXJyaWFnZSByZXR1cm5zLCBlbXB0eSBsaW5lcywgY29tbWVudCBsaW5lcywgYW5kIGNvbnZlcnRzCi0gKiBuZXdsaW5lcyB0byBOVUxzLgotICogU2hvcnRlbnMgYnVmZmVyIGFzIG5lZWRlZCBhbmQgcGFkcyB3aXRoIE5VTHMuICBFbmQgb2YgYnVmZmVyIGlzIG1hcmtlZAotICogYnkgdHdvIE5VTHMuCi0qLwotCi1zdGF0aWMgdWludCBicmNtZl9wcm9jZXNzX252cmFtX3ZhcnMoY2hhciAqdmFyYnVmLCB1aW50IGxlbikKLXsKLQljaGFyICpkcDsKLQlib29sIGZpbmROZXdsaW5lOwotCWludCBjb2x1bW47Ci0JdWludCBidWZfbGVuLCBuOwotCi0JZHAgPSB2YXJidWY7Ci0KLQlmaW5kTmV3bGluZSA9IGZhbHNlOwotCWNvbHVtbiA9IDA7Ci0KLQlmb3IgKG4gPSAwOyBuIDwgbGVuOyBuKyspIHsKLQkJaWYgKHZhcmJ1ZltuXSA9PSAwKQotCQkJYnJlYWs7Ci0JCWlmICh2YXJidWZbbl0gPT0gJ1xyJykKLQkJCWNvbnRpbnVlOwotCQlpZiAoZmluZE5ld2xpbmUgJiYgdmFyYnVmW25dICE9ICdcbicpCi0JCQljb250aW51ZTsKLQkJZmluZE5ld2xpbmUgPSBmYWxzZTsKLQkJaWYgKHZhcmJ1ZltuXSA9PSAnIycpIHsKLQkJCWZpbmROZXdsaW5lID0gdHJ1ZTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICh2YXJidWZbbl0gPT0gJ1xuJykgewotCQkJaWYgKGNvbHVtbiA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJKmRwKysgPSAwOwotCQkJY29sdW1uID0gMDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCSpkcCsrID0gdmFyYnVmW25dOwotCQljb2x1bW4rKzsKLQl9Ci0JYnVmX2xlbiA9IGRwIC0gdmFyYnVmOwotCi0Jd2hpbGUgKGRwIDwgdmFyYnVmICsgbikKLQkJKmRwKysgPSAwOwotCi0JcmV0dXJuIGJ1Zl9sZW47Ci19Ci0KLXN0YXRpYyBpbnQgYnJjbWZfc2RicmNtX2Rvd25sb2FkX252cmFtKHN0cnVjdCBicmNtZl9idXMgKmJ1cykKLXsKLQl1aW50IGxlbjsKLQljaGFyICptZW1ibG9jayA9IE5VTEw7Ci0JY2hhciAqYnVmcDsKLQlpbnQgcmV0OwotCi0JYnVzLT5udl9uYW1lID0gQkNNNDMyOV9OVl9OQU1FOwotCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmJ1cy0+ZmlybXdhcmUsIGJ1cy0+bnZfbmFtZSwKLQkJCSAgICAgICAmZ0luc3RhbmNlLT5mdW5jWzJdLT5kZXYpOwotCWlmIChyZXQpIHsKLQkJQlJDTUZfRVJST1IoKCIlczogRmFpbCB0byByZXF1ZXN0IG52cmFtICVkXG4iLCBfX2Z1bmNfXywgcmV0KSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCWJ1cy0+ZndfcHRyID0gMDsKLQotCW1lbWJsb2NrID0ga21hbGxvYyhNRU1CTE9DSywgR0ZQX0FUT01JQyk7Ci0JaWYgKG1lbWJsb2NrID09IE5VTEwpIHsKLQkJQlJDTUZfRVJST1IoKCIlczogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSAlZCBieXRlc1xuIiwKLQkJCSAgICAgX19mdW5jX18sIE1FTUJMT0NLKSk7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyOwotCX0KLQotCWxlbiA9IGJyY21mX3NkYnJjbV9nZXRfaW1hZ2UobWVtYmxvY2ssIE1FTUJMT0NLLCBidXMpOwotCi0JaWYgKGxlbiA+IDAgJiYgbGVuIDwgTUVNQkxPQ0spIHsKLQkJYnVmcCA9IChjaGFyICopbWVtYmxvY2s7Ci0JCWJ1ZnBbbGVuXSA9IDA7Ci0JCWxlbiA9IGJyY21mX3Byb2Nlc3NfbnZyYW1fdmFycyhidWZwLCBsZW4pOwotCQlidWZwICs9IGxlbjsKLQkJKmJ1ZnArKyA9IDA7Ci0JCWlmIChsZW4pCi0JCQlyZXQgPSBicmNtZl9zZGJyY21fZG93bmxvYWR2YXJzKGJ1cywgbWVtYmxvY2ssIGxlbiArIDEpOwotCQlpZiAocmV0KQotCQkJQlJDTUZfRVJST1IoKCIlczogZXJyb3IgZG93bmxvYWRpbmcgdmFyczogJWRcbiIsCi0JCQkJICAgICBfX2Z1bmNfXywgcmV0KSk7Ci0JfSBlbHNlIHsKLQkJQlJDTUZfRVJST1IoKCIlczogZXJyb3IgcmVhZGluZyBudnJhbSBmaWxlOiAlZFxuIiwKLQkJCSAgICAgX19mdW5jX18sIGxlbikpOwotCQlyZXQgPSAtRUlPOwotCX0KLQotZXJyOgotCWtmcmVlKG1lbWJsb2NrKTsKLQotCXJlbGVhc2VfZmlybXdhcmUoYnVzLT5maXJtd2FyZSk7Ci0JYnVzLT5md19wdHIgPSAwOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfYnJjbWZfc2RicmNtX2Rvd25sb2FkX2Zpcm13YXJlKHN0cnVjdCBicmNtZl9idXMgKmJ1cykKLXsKLQlpbnQgYmNtZXJyb3IgPSAtMTsKLQotCS8qIEtlZXAgYXJtIGluIHJlc2V0ICovCi0JaWYgKGJyY21mX3NkYnJjbV9kb3dubG9hZF9zdGF0ZShidXMsIHRydWUpKSB7Ci0JCUJSQ01GX0VSUk9SKCgiJXM6IGVycm9yIHBsYWNpbmcgQVJNIGNvcmUgaW4gcmVzZXRcbiIsCi0JCQkgICAgIF9fZnVuY19fKSk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCS8qIEV4dGVybmFsIGltYWdlIHRha2VzIHByZWNlZGVuY2UgaWYgc3BlY2lmaWVkICovCi0JaWYgKGJyY21mX3NkYnJjbV9kb3dubG9hZF9jb2RlX2ZpbGUoYnVzKSkgewotCQlCUkNNRl9FUlJPUigoIiVzOiBkb25nbGUgaW1hZ2UgZmlsZSBkb3dubG9hZCBmYWlsZWRcbiIsCi0JCQkgICAgIF9fZnVuY19fKSk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCS8qIEV4dGVybmFsIG52cmFtIHRha2VzIHByZWNlZGVuY2UgaWYgc3BlY2lmaWVkICovCi0JaWYgKGJyY21mX3NkYnJjbV9kb3dubG9hZF9udnJhbShidXMpKSB7Ci0JCUJSQ01GX0VSUk9SKCgiJXM6IGRvbmdsZSBudnJhbSBmaWxlIGRvd25sb2FkIGZhaWxlZFxuIiwKLQkJCSAgICAgX19mdW5jX18pKTsKLQl9Ci0KLQkvKiBUYWtlIGFybSBvdXQgb2YgcmVzZXQgKi8KLQlpZiAoYnJjbWZfc2RicmNtX2Rvd25sb2FkX3N0YXRlKGJ1cywgZmFsc2UpKSB7Ci0JCUJSQ01GX0VSUk9SKCgiJXM6IGVycm9yIGdldHRpbmcgb3V0IG9mIEFSTSBjb3JlIHJlc2V0XG4iLAotCQkJICAgICBfX2Z1bmNfXykpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQliY21lcnJvciA9IDA7Ci0KLWVycjoKLQlyZXR1cm4gYmNtZXJyb3I7Ci19Ci0KLQotc3RhdGljIGludAotYnJjbWZfc2RicmNtX3NlbmRfYnVmKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdTMyIGFkZHIsIHVpbnQgZm4sIHVpbnQgZmxhZ3MsCi0JCSAgICB1OCAqYnVmLCB1aW50IG5ieXRlcywgc3RydWN0IHNrX2J1ZmYgKnBrdCwKLQkJICAgIHZvaWQgKCpjb21wbGV0ZSkodm9pZCAqaGFuZGxlLCBpbnQgc3RhdHVzLAotCQkJCSAgICAgYm9vbCBzeW5jX3dhaXRpbmcpLAotCQkgICAgdm9pZCAqaGFuZGxlKQotewotCXJldHVybiBicmNtZl9zZGNhcmRfc2VuZF9idWYKLQkJKGJ1cy0+Y2FyZCwgYWRkciwgZm4sIGZsYWdzLCBidWYsIG5ieXRlcywgcGt0LCBjb21wbGV0ZSwKLQkJIGhhbmRsZSk7Ci19Ci0KLWludCBicmNtZl9idXNfZGV2cmVzZXQoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgdTggZmxhZykKLXsKLQlpbnQgYmNtZXJyb3IgPSAwOwotCXN0cnVjdCBicmNtZl9idXMgKmJ1czsKLQotCWJ1cyA9IGRydnItPmJ1czsKLQotCWlmIChmbGFnID09IHRydWUpIHsKLQkJYnJjbWZfc2RicmNtX3dkX3RpbWVyKGJ1cywgMCk7Ci0JCWlmICghYnVzLT5kcnZyLT5kb25nbGVfcmVzZXQpIHsKLQkJCS8qIEV4cGVjdCBhcHAgdG8gaGF2ZSB0b3JuIGRvd24gYW55Ci0JCQkgY29ubmVjdGlvbiBiZWZvcmUgY2FsbGluZyAqLwotCQkJLyogU3RvcCB0aGUgYnVzLCBkaXNhYmxlIEYyICovCi0JCQlicmNtZl9zZGJyY21fYnVzX3N0b3AoYnVzLCBmYWxzZSk7Ci0KLQkJCS8qIENsZWFuIHR4L3J4IGJ1ZmZlciBwb2ludGVycywKLQkJCSBkZXRhY2ggZnJvbSB0aGUgZG9uZ2xlICovCi0JCQlicmNtZl9zZGJyY21fcmVsZWFzZV9kb25nbGUoYnVzKTsKLQotCQkJYnVzLT5kcnZyLT5kb25nbGVfcmVzZXQgPSB0cnVlOwotCQkJYnVzLT5kcnZyLT51cCA9IGZhbHNlOwotCi0JCQlCUkNNRl9UUkFDRSgoIiVzOiAgV0xBTiBPRkYgRE9ORVxuIiwgX19mdW5jX18pKTsKLQkJCS8qIEFwcCBjYW4gbm93IHJlbW92ZSBwb3dlciBmcm9tIGRldmljZSAqLwotCQl9IGVsc2UKLQkJCWJjbWVycm9yID0gLUVJTzsKLQl9IGVsc2UgewotCQkvKiBBcHAgbXVzdCBoYXZlIHJlc3RvcmVkIHBvd2VyIHRvIGRldmljZSBiZWZvcmUgY2FsbGluZyAqLwotCi0JCUJSQ01GX1RSQUNFKCgiXG5cbiVzOiA9PSBXTEFOIE9OID09XG4iLCBfX2Z1bmNfXykpOwotCi0JCWlmIChidXMtPmRydnItPmRvbmdsZV9yZXNldCkgewotCQkJLyogVHVybiBvbiBXTEFOICovCi0KLQkJCS8qIEF0dGVtcHQgdG8gcmUtYXR0YWNoICYgZG93bmxvYWQgKi8KLQkJCWlmIChicmNtZl9zZGJyY21fcHJvYmVfYXR0YWNoKGJ1cywgYnVzLT5jYXJkLAotCQkJCQkJICAgICAgU0lfRU5VTV9CQVNFLAotCQkJCQkJICAgICAgYnVzLT5jbF9kZXZpZCkpIHsKLQkJCQkvKiBBdHRlbXB0IHRvIGRvd25sb2FkIGJpbmFyeSB0byB0aGUgZG9uZ2xlICovCi0JCQkJaWYgKGJyY21mX3NkYnJjbV9wcm9iZV9pbml0KGJ1cywgYnVzLT5jYXJkKSkgewotCQkJCQkvKiBSZS1pbml0IGJ1cywgZW5hYmxlIEYyIHRyYW5zZmVyICovCi0JCQkJCWJyY21mX3NkYnJjbV9idXNfaW5pdChidXMtPmRydnIsIGZhbHNlKTsKLQotCQkJCQlidXMtPmRydnItPmRvbmdsZV9yZXNldCA9IGZhbHNlOwotCQkJCQlidXMtPmRydnItPnVwID0gdHJ1ZTsKLQotCQkJCQlCUkNNRl9UUkFDRSgoIiVzOiBXTEFOIE9OIERPTkVcbiIsCi0JCQkJCQkgICAgIF9fZnVuY19fKSk7Ci0JCQkJfSBlbHNlCi0JCQkJCWJjbWVycm9yID0gLUVJTzsKLQkJCX0gZWxzZQotCQkJCWJjbWVycm9yID0gLUVJTzsKLQkJfSBlbHNlIHsKLQkJCWJjbWVycm9yID0gLUVJU0NPTk47Ci0JCQlCUkNNRl9FUlJPUigoIiVzOiBTZXQgREVWUkVTRVQ9ZmFsc2UgaW52b2tlZCB3aGVuIgotCQkJCSAgICAgIiBkZXZpY2UgaXMgb25cbiIsIF9fZnVuY19fKSk7Ci0JCQliY21lcnJvciA9IC1FSU87Ci0JCX0KLQkJYnJjbWZfc2RicmNtX3dkX3RpbWVyKGJ1cywgYnJjbWZfd2F0Y2hkb2dfbXMpOwotCX0KLQlyZXR1cm4gYmNtZXJyb3I7Ci19Ci0KLXN0YXRpYyBpbnQKLWJyY21mX3NkYnJjbV9jaGlwX3JlY29nbml0aW9uKHN0cnVjdCBicmNtZl9zZGlvX2NhcmQgKmNhcmQsCi0JCQkgICAgICBzdHJ1Y3QgY2hpcF9pbmZvICpjaSwgdTMyIHJlZ3MpCi17Ci0JdTMyIHJlZ2RhdGE7Ci0KLQkvKgotCSAqIEdldCBDQyBjb3JlIHJldgotCSAqIENoaXBpZCBpcyBhc3N1bWUgdG8gYmUgYXQgb2Zmc2V0IDAgZnJvbSByZWdzIGFyZwotCSAqIEZvciBkaWZmZXJlbnQgY2hpcHR5cGVzIG9yIG9sZCBzZGlvIGhvc3RzIHcvbyBjaGlwY29tbW9uLAotCSAqIG90aGVyIHdheXMgb2YgcmVjb2duaXRpb24gc2hvdWxkIGJlIGFkZGVkIGhlcmUuCi0JICovCi0JY2ktPmNjY29yZWJhc2UgPSByZWdzOwotCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoY2FyZCwKLQkJCQlDT1JFX0NDX1JFRyhjaS0+Y2Njb3JlYmFzZSwgY2hpcGlkKSwgNCk7Ci0JY2ktPmNoaXAgPSByZWdkYXRhICYgQ0lEX0lEX01BU0s7Ci0JY2ktPmNoaXByZXYgPSAocmVnZGF0YSAmIENJRF9SRVZfTUFTSykgPj4gQ0lEX1JFVl9TSElGVDsKLQotCUJSQ01GX0lORk8oKCIlczogY2hpcGlkPTB4JXggY2hpcHJldj0lZFxuIiwKLQkJICAgIF9fZnVuY19fLCBjaS0+Y2hpcCwgY2ktPmNoaXByZXYpKTsKLQotCS8qIEFkZHJlc3Mgb2YgY29yZXMgZm9yIG5ldyBjaGlwcyBzaG91bGQgYmUgYWRkZWQgaGVyZSAqLwotCXN3aXRjaCAoY2ktPmNoaXApIHsKLQljYXNlIEJDTTQzMjlfQ0hJUF9JRDoKLQkJY2ktPmJ1c2NvcmViYXNlID0gQkNNNDMyOV9DT1JFX0JVU19CQVNFOwotCQljaS0+cmFtY29yZWJhc2UgPSBCQ000MzI5X0NPUkVfU09DUkFNX0JBU0U7Ci0JCWNpLT5hcm1jb3JlYmFzZQk9IEJDTTQzMjlfQ09SRV9BUk1fQkFTRTsKLQkJY2ktPnJhbXNpemUgPSBCQ000MzI5X1JBTVNJWkU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJSQ01GX0VSUk9SKCgiJXM6IGNoaXBpZCAweCV4IGlzIG5vdCBzdXBwb3J0ZWRcbiIsCi0JCQkgICAgIF9fZnVuY19fLCBjaS0+Y2hpcCkpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKGNhcmQsCi0JCUNPUkVfU0IoY2ktPmNjY29yZWJhc2UsIHNiaWRoaWdoKSwgNCk7Ci0JY2ktPmNjcmV2ID0gU0JDT1JFUkVWKHJlZ2RhdGEpOwotCi0JcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChjYXJkLAotCQlDT1JFX0NDX1JFRyhjaS0+Y2Njb3JlYmFzZSwgcG11Y2FwYWJpbGl0aWVzKSwgNCk7Ci0JY2ktPnBtdXJldiA9IHJlZ2RhdGEgJiBQQ0FQX1JFVl9NQVNLOwotCi0JcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChjYXJkLAotCQkJCQlDT1JFX1NCKGNpLT5idXNjb3JlYmFzZSwgc2JpZGhpZ2gpLCA0KTsKLQljaS0+YnVzY29yZXJldiA9IFNCQ09SRVJFVihyZWdkYXRhKTsKLQljaS0+YnVzY29yZXR5cGUgPSAocmVnZGF0YSAmIFNCSURIX0NDX01BU0spID4+IFNCSURIX0NDX1NISUZUOwotCi0JQlJDTUZfSU5GTygoIiVzOiBjY3Jldj0lZCwgcG11cmV2PSVkLCBidXNjb3JlIHJldi90eXBlPSVkLzB4JXhcbiIsCi0JCSAgICBfX2Z1bmNfXywgY2ktPmNjcmV2LCBjaS0+cG11cmV2LAotCQkgICAgY2ktPmJ1c2NvcmVyZXYsIGNpLT5idXNjb3JldHlwZSkpOwotCi0JLyogZ2V0IGNoaXBjb21tb24gY2FwYWJpbGl0ZXMgKi8KLQljaS0+Y2NjYXBzID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKGNhcmQsCi0JCUNPUkVfQ0NfUkVHKGNpLT5jY2NvcmViYXNlLCBjYXBhYmlsaXRpZXMpLCA0KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotYnJjbWZfc2RicmNtX2NoaXBfZGlzYWJsZWNvcmUoc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCwgdTMyIGNvcmViYXNlKQotewotCXUzMiByZWdkYXRhOwotCi0JcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChjYXJkLAotCQlDT1JFX1NCKGNvcmViYXNlLCBzYnRtc3RhdGVsb3cpLCA0KTsKLQlpZiAocmVnZGF0YSAmIFNCVE1MX1JFU0VUKQotCQlyZXR1cm47Ci0KLQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKGNhcmQsCi0JCUNPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWxvdyksIDQpOwotCWlmICgocmVnZGF0YSAmIChTSUNGX0NMT0NLX0VOIDw8IFNCVE1MX1NJQ0ZfU0hJRlQpKSAhPSAwKSB7Ci0JCS8qCi0JCSAqIHNldCB0YXJnZXQgcmVqZWN0IGFuZCBzcGluIHVudGlsIGJ1c3kgaXMgY2xlYXIKLQkJICogKHByZXNlcnZlIGNvcmUtc3BlY2lmaWMgYml0cykKLQkJICovCi0JCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoY2FyZCwKLQkJCUNPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWxvdyksIDQpOwotCQlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKGNhcmQsIENPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWxvdyksIDQsCi0JCQlyZWdkYXRhIHwgU0JUTUxfUkVKKTsKLQotCQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKGNhcmQsCi0JCQlDT1JFX1NCKGNvcmViYXNlLCBzYnRtc3RhdGVsb3cpLCA0KTsKLQkJdWRlbGF5KDEpOwotCQlTUElOV0FJVCgoYnJjbWZfc2RjYXJkX3JlZ19yZWFkKGNhcmQsCi0JCQlDT1JFX1NCKGNvcmViYXNlLCBzYnRtc3RhdGVoaWdoKSwgNCkgJgotCQkJU0JUTUhfQlVTWSksIDEwMDAwMCk7Ci0KLQkJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChjYXJkLAotCQkJQ09SRV9TQihjb3JlYmFzZSwgc2J0bXN0YXRlaGlnaCksIDQpOwotCQlpZiAocmVnZGF0YSAmIFNCVE1IX0JVU1kpCi0JCQlCUkNNRl9FUlJPUigoIiVzOiBBUk0gY29yZSBzdGlsbCBidXN5XG4iLCBfX2Z1bmNfXykpOwotCi0JCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoY2FyZCwKLQkJCUNPUkVfU0IoY29yZWJhc2UsIHNiaWRsb3cpLCA0KTsKLQkJaWYgKHJlZ2RhdGEgJiBTQklETF9JTklUKSB7Ci0JCQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKGNhcmQsCi0JCQkJQ09SRV9TQihjb3JlYmFzZSwgc2JpbXN0YXRlKSwgNCkgfAotCQkJCVNCSU1fUko7Ci0JCQlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKGNhcmQsCi0JCQkJQ09SRV9TQihjb3JlYmFzZSwgc2JpbXN0YXRlKSwgNCwKLQkJCQlyZWdkYXRhKTsKLQkJCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoY2FyZCwKLQkJCQlDT1JFX1NCKGNvcmViYXNlLCBzYmltc3RhdGUpLCA0KTsKLQkJCXVkZWxheSgxKTsKLQkJCVNQSU5XQUlUKChicmNtZl9zZGNhcmRfcmVnX3JlYWQoY2FyZCwKLQkJCQlDT1JFX1NCKGNvcmViYXNlLCBzYmltc3RhdGUpLCA0KSAmCi0JCQkJU0JJTV9CWSksIDEwMDAwMCk7Ci0JCX0KLQotCQkvKiBzZXQgcmVzZXQgYW5kIHJlamVjdCB3aGlsZSBlbmFibGluZyB0aGUgY2xvY2tzICovCi0JCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoY2FyZCwKLQkJCUNPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWxvdyksIDQsCi0JCQkoKChTSUNGX0ZHQyB8IFNJQ0ZfQ0xPQ0tfRU4pIDw8IFNCVE1MX1NJQ0ZfU0hJRlQpIHwKLQkJCVNCVE1MX1JFSiB8IFNCVE1MX1JFU0VUKSk7Ci0JCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoY2FyZCwKLQkJCUNPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWxvdyksIDQpOwotCQl1ZGVsYXkoMTApOwotCi0JCS8qIGNsZWFyIHRoZSBpbml0aWF0b3IgcmVqZWN0IGJpdCAqLwotCQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKGNhcmQsCi0JCQlDT1JFX1NCKGNvcmViYXNlLCBzYmlkbG93KSwgNCk7Ci0JCWlmIChyZWdkYXRhICYgU0JJRExfSU5JVCkgewotCQkJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChjYXJkLAotCQkJCUNPUkVfU0IoY29yZWJhc2UsIHNiaW1zdGF0ZSksIDQpICYKLQkJCQl+U0JJTV9SSjsKLQkJCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoY2FyZCwKLQkJCQlDT1JFX1NCKGNvcmViYXNlLCBzYmltc3RhdGUpLCA0LAotCQkJCXJlZ2RhdGEpOwotCQl9Ci0JfQotCi0JLyogbGVhdmUgcmVzZXQgYW5kIHJlamVjdCBhc3NlcnRlZCAqLwotCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoY2FyZCwgQ09SRV9TQihjb3JlYmFzZSwgc2J0bXN0YXRlbG93KSwgNCwKLQkJKFNCVE1MX1JFSiB8IFNCVE1MX1JFU0VUKSk7Ci0JdWRlbGF5KDEpOwotfQotCi1zdGF0aWMgaW50Ci1icmNtZl9zZGJyY21fY2hpcF9hdHRhY2goc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1MzIgcmVncykKLXsKLQlzdHJ1Y3QgY2hpcF9pbmZvICpjaTsKLQlpbnQgZXJyOwotCXU4IGNsa3ZhbCwgY2xrc2V0OwotCi0JQlJDTUZfVFJBQ0UoKCIlczogRW50ZXJcbiIsIF9fZnVuY19fKSk7Ci0KLQkvKiBhbGxvYyBjaGlwX2luZm9fdCAqLwotCWNpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNoaXBfaW5mbyksIEdGUF9BVE9NSUMpOwotCWlmIChOVUxMID09IGNpKSB7Ci0JCUJSQ01GX0VSUk9SKCgiJXM6IG1hbGxvYyBmYWlsZWQhXG4iLCBfX2Z1bmNfXykpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQltZW1zZXQoKHVuc2lnbmVkIGNoYXIgKiljaSwgMCwgc2l6ZW9mKHN0cnVjdCBjaGlwX2luZm8pKTsKLQotCS8qIGJ1cy9jb3JlL2NsayBzZXR1cCBmb3IgcmVnaXN0ZXIgYWNjZXNzICovCi0JLyogVHJ5IGZvcmNpbmcgU0RJTyBjb3JlIHRvIGRvIEFMUEF2YWlsIHJlcXVlc3Qgb25seSAqLwotCWNsa3NldCA9IFNCU0RJT19GT1JDRV9IV19DTEtSRVFfT0ZGIHwgU0JTRElPX0FMUF9BVkFJTF9SRVE7Ci0JYnJjbWZfc2RjYXJkX2NmZ193cml0ZShidXMtPmNhcmQsIFNESU9fRlVOQ18xLCBTQlNESU9fRlVOQzFfQ0hJUENMS0NTUiwKLQkJCWNsa3NldCwgJmVycik7Ci0JaWYgKGVycikgewotCQlCUkNNRl9FUlJPUigoIiVzOiBlcnJvciB3cml0aW5nIGZvciBIVCBvZmZcbiIsIF9fZnVuY19fKSk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBJZiByZWdpc3RlciBzdXBwb3J0ZWQsIHdhaXQgZm9yIEFMUEF2YWlsIGFuZCB0aGVuIGZvcmNlIEFMUCAqLwotCS8qIFRoaXMgbWF5IHRha2UgdXAgdG8gMTUgbWlsbGlzZWNvbmRzICovCi0JY2xrdmFsID0gYnJjbWZfc2RjYXJkX2NmZ19yZWFkKGJ1cy0+Y2FyZCwgU0RJT19GVU5DXzEsCi0JCQlTQlNESU9fRlVOQzFfQ0hJUENMS0NTUiwgTlVMTCk7Ci0JaWYgKChjbGt2YWwgJiB+U0JTRElPX0FWQklUUykgPT0gY2xrc2V0KSB7Ci0JCVNQSU5XQUlUKCgoY2xrdmFsID0KLQkJCQlicmNtZl9zZGNhcmRfY2ZnX3JlYWQoYnVzLT5jYXJkLCBTRElPX0ZVTkNfMSwKLQkJCQkJCVNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSLAotCQkJCQkJTlVMTCkpLAotCQkJCSFTQlNESU9fQUxQQVYoY2xrdmFsKSksCi0JCQkJUE1VX01BWF9UUkFOU0lUSU9OX0RMWSk7Ci0JCWlmICghU0JTRElPX0FMUEFWKGNsa3ZhbCkpIHsKLQkJCUJSQ01GX0VSUk9SKCgiJXM6IHRpbWVvdXQgb24gQUxQQVYgd2FpdCwiCi0JCQkJICAgICAiIGNsa3ZhbCAweCUwMnhcbiIsIF9fZnVuY19fLCBjbGt2YWwpKTsKLQkJCWVyciA9IC1FQlVTWTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQljbGtzZXQgPSBTQlNESU9fRk9SQ0VfSFdfQ0xLUkVRX09GRiB8Ci0JCQkJU0JTRElPX0ZPUkNFX0FMUDsKLQkJYnJjbWZfc2RjYXJkX2NmZ193cml0ZShidXMtPmNhcmQsIFNESU9fRlVOQ18xLAotCQkJCVNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSLAotCQkJCWNsa3NldCwgJmVycik7Ci0JCXVkZWxheSg2NSk7Ci0JfSBlbHNlIHsKLQkJQlJDTUZfRVJST1IoKCIlczogQ2hpcENsa0NTUiBhY2Nlc3M6IHdyb3RlIDB4JTAyeCIKLQkJCSAgICAgIiByZWFkIDB4JTAyeFxuIiwgX19mdW5jX18sIGNsa3NldCwgY2xrdmFsKSk7Ci0JCWVyciA9IC1FQUNDRVM7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBBbHNvLCBkaXNhYmxlIHRoZSBleHRyYSBTRElPIHB1bGwtdXBzICovCi0JYnJjbWZfc2RjYXJkX2NmZ193cml0ZShidXMtPmNhcmQsIFNESU9fRlVOQ18xLCBTQlNESU9fRlVOQzFfU0RJT1BVTExVUCwKLQkJCSAgICAgICAwLCBOVUxMKTsKLQotCWVyciA9IGJyY21mX3NkYnJjbV9jaGlwX3JlY29nbml0aW9uKGJ1cy0+Y2FyZCwgY2ksIHJlZ3MpOwotCWlmIChlcnIpCi0JCWdvdG8gZmFpbDsKLQotCS8qCi0JICogTWFrZSBzdXJlIGFueSBvbi1jaGlwIEFSTSBpcyBvZmYgKGluIGNhc2Ugc3RyYXBwaW5nIGlzIHdyb25nKSwKLQkgKiBvciBkb3dubG9hZGVkIGNvZGUgd2FzIGFscmVhZHkgcnVubmluZy4KLQkgKi8KLQlicmNtZl9zZGJyY21fY2hpcF9kaXNhYmxlY29yZShidXMtPmNhcmQsIGNpLT5hcm1jb3JlYmFzZSk7Ci0KLQlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKGJ1cy0+Y2FyZCwKLQkJQ09SRV9DQ19SRUcoY2ktPmNjY29yZWJhc2UsIGdwaW9wdWxsdXApLCA0LCAwKTsKLQlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKGJ1cy0+Y2FyZCwKLQkJQ09SRV9DQ19SRUcoY2ktPmNjY29yZWJhc2UsIGdwaW9wdWxsZG93biksIDQsIDApOwotCi0JLyogRGlzYWJsZSBGMiB0byBjbGVhciBhbnkgaW50ZXJtZWRpYXRlIGZyYW1lIHN0YXRlIG9uIHRoZSBkb25nbGUgKi8KLQlicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKGJ1cy0+Y2FyZCwgU0RJT19GVU5DXzAsIFNESU9fQ0NDUl9JT0V4LAotCQlTRElPX0ZVTkNfRU5BQkxFXzEsIE5VTEwpOwotCi0JLyogV0FSOiBjbWQ1MiBiYWNrcGxhbmUgcmVhZCBzbyBjb3JlIEhXIHdpbGwgZHJvcCBBTFBSZXEgKi8KLQljbGt2YWwgPSBicmNtZl9zZGNhcmRfY2ZnX3JlYWQoYnVzLT5jYXJkLCBTRElPX0ZVTkNfMSwKLQkJCTAsIE5VTEwpOwotCi0JLyogRG9uZSB3aXRoIGJhY2twbGFuZS1kZXBlbmRlbnQgYWNjZXNzZXMsIGNhbiBkcm9wIGNsb2NrLi4uICovCi0JYnJjbWZfc2RjYXJkX2NmZ193cml0ZShidXMtPmNhcmQsIFNESU9fRlVOQ18xLCBTQlNESU9fRlVOQzFfQ0hJUENMS0NTUiwKLQkJCSAgICAgICAwLCBOVUxMKTsKLQotCWJ1cy0+Y2kgPSBjaTsKLQlyZXR1cm4gMDsKLWZhaWw6Ci0JYnVzLT5jaSA9IE5VTEw7Ci0Ja2ZyZWUoY2kpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1icmNtZl9zZGJyY21fY2hpcF9yZXNldGNvcmUoc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCwgdTMyIGNvcmViYXNlKQotewotCXUzMiByZWdkYXRhOwotCi0JLyoKLQkgKiBNdXN0IGRvIHRoZSBkaXNhYmxlIHNlcXVlbmNlIGZpcnN0IHRvIHdvcmsgZm9yCi0JICogYXJiaXRyYXJ5IGN1cnJlbnQgY29yZSBzdGF0ZS4KLQkgKi8KLQlicmNtZl9zZGJyY21fY2hpcF9kaXNhYmxlY29yZShjYXJkLCBjb3JlYmFzZSk7Ci0KLQkvKgotCSAqIE5vdyBkbyB0aGUgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UuCi0JICogc2V0IHJlc2V0IHdoaWxlIGVuYWJsaW5nIHRoZSBjbG9jayBhbmQKLQkgKiBmb3JjaW5nIHRoZW0gb24gdGhyb3VnaG91dCB0aGUgY29yZQotCSAqLwotCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoY2FyZCwgQ09SRV9TQihjb3JlYmFzZSwgc2J0bXN0YXRlbG93KSwgNCwKLQkJKChTSUNGX0ZHQyB8IFNJQ0ZfQ0xPQ0tfRU4pIDw8IFNCVE1MX1NJQ0ZfU0hJRlQpIHwKLQkJU0JUTUxfUkVTRVQpOwotCXVkZWxheSgxKTsKLQotCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoY2FyZCwgQ09SRV9TQihjb3JlYmFzZSwgc2J0bXN0YXRlaGlnaCksCi0JCQkJCTQpOwotCWlmIChyZWdkYXRhICYgU0JUTUhfU0VSUikKLQkJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShjYXJkLCBDT1JFX1NCKGNvcmViYXNlLCBzYnRtc3RhdGVoaWdoKSwKLQkJCQkgICAgICAgNCwgMCk7Ci0KLQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKGNhcmQsIENPUkVfU0IoY29yZWJhc2UsIHNiaW1zdGF0ZSksIDQpOwotCWlmIChyZWdkYXRhICYgKFNCSU1fSUJFIHwgU0JJTV9UTykpCi0JCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoY2FyZCwgQ09SRV9TQihjb3JlYmFzZSwgc2JpbXN0YXRlKSwgNCwKLQkJCXJlZ2RhdGEgJiB+KFNCSU1fSUJFIHwgU0JJTV9UTykpOwotCi0JLyogY2xlYXIgcmVzZXQgYW5kIGFsbG93IGl0IHRvIHByb3BhZ2F0ZSB0aHJvdWdob3V0IHRoZSBjb3JlICovCi0JYnJjbWZfc2RjYXJkX3JlZ193cml0ZShjYXJkLCBDT1JFX1NCKGNvcmViYXNlLCBzYnRtc3RhdGVsb3cpLCA0LAotCQkoU0lDRl9GR0MgPDwgU0JUTUxfU0lDRl9TSElGVCkgfAotCQkoU0lDRl9DTE9DS19FTiA8PCBTQlRNTF9TSUNGX1NISUZUKSk7Ci0JdWRlbGF5KDEpOwotCi0JLyogbGVhdmUgY2xvY2sgZW5hYmxlZCAqLwotCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoY2FyZCwgQ09SRV9TQihjb3JlYmFzZSwgc2J0bXN0YXRlbG93KSwgNCwKLQkJKFNJQ0ZfQ0xPQ0tfRU4gPDwgU0JUTUxfU0lDRl9TSElGVCkpOwotCXVkZWxheSgxKTsKLX0KLQotLyogU0RJTyBQYWQgZHJpdmUgc3RyZW5ndGggdG8gc2VsZWN0IHZhbHVlIG1hcHBpbmdzICovCi1zdHJ1Y3Qgc2Rpb2RfZHJpdmVfc3RyIHsKLQl1OCBzdHJlbmd0aDsJLyogUGFkIERyaXZlIFN0cmVuZ3RoIGluIG1BICovCi0JdTggc2VsOwkJLyogQ2hpcC1zcGVjaWZpYyBzZWxlY3QgdmFsdWUgKi8KLX07Ci0KLS8qIFNESU8gRHJpdmUgU3RyZW5ndGggdG8gc2VsIHZhbHVlIHRhYmxlIGZvciBQTVUgUmV2IDEgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Rpb2RfZHJpdmVfc3RyIHNkaW9kX2RyaXZlX3N0cmVuZ3RoX3RhYjFbXSA9IHsKLQl7Ci0JNCwgMHgyfSwgewotCTIsIDB4M30sIHsKLQkxLCAweDB9LCB7Ci0JMCwgMHgwfQotCX07Ci0KLS8qIFNESU8gRHJpdmUgU3RyZW5ndGggdG8gc2VsIHZhbHVlIHRhYmxlIGZvciBQTVUgUmV2IDIsIDMgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Rpb2RfZHJpdmVfc3RyIHNkaW9kX2RyaXZlX3N0cmVuZ3RoX3RhYjJbXSA9IHsKLQl7Ci0JMTIsIDB4N30sIHsKLQkxMCwgMHg2fSwgewotCTgsIDB4NX0sIHsKLQk2LCAweDR9LCB7Ci0JNCwgMHgyfSwgewotCTIsIDB4MX0sIHsKLQkwLCAweDB9Ci0JfTsKLQotLyogU0RJTyBEcml2ZSBTdHJlbmd0aCB0byBzZWwgdmFsdWUgdGFibGUgZm9yIFBNVSBSZXYgOCAoMS44VikgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Rpb2RfZHJpdmVfc3RyIHNkaW9kX2RyaXZlX3N0cmVuZ3RoX3RhYjNbXSA9IHsKLQl7Ci0JMzIsIDB4N30sIHsKLQkyNiwgMHg2fSwgewotCTIyLCAweDV9LCB7Ci0JMTYsIDB4NH0sIHsKLQkxMiwgMHgzfSwgewotCTgsIDB4Mn0sIHsKLQk0LCAweDF9LCB7Ci0JMCwgMHgwfQotCX07Ci0KLSNkZWZpbmUgU0RJT0RfRFJWU1RSX0tFWShjaGlwLCBwbXUpICAgICAoKChjaGlwKSA8PCAxNikgfCAocG11KSkKLQotc3RhdGljIHZvaWQKLWJyY21mX3NkYnJjbV9zZGlvZF9kcml2ZV9zdHJlbmd0aF9pbml0KHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdTMyIGRyaXZlc3RyZW5ndGgpIHsKLQlzdHJ1Y3Qgc2Rpb2RfZHJpdmVfc3RyICpzdHJfdGFiID0gTlVMTDsKLQl1MzIgc3RyX21hc2sgPSAwOwotCXUzMiBzdHJfc2hpZnQgPSAwOwotCWNoYXIgY2huWzhdOwotCi0JaWYgKCEoYnVzLT5jaS0+Y2NjYXBzICYgQ0NfQ0FQX1BNVSkpCi0JCXJldHVybjsKLQotCXN3aXRjaCAoU0RJT0RfRFJWU1RSX0tFWShidXMtPmNpLT5jaGlwLCBidXMtPmNpLT5wbXVyZXYpKSB7Ci0JY2FzZSBTRElPRF9EUlZTVFJfS0VZKEJDTTQzMjVfQ0hJUF9JRCwgMSk6Ci0JCXN0cl90YWIgPSAoc3RydWN0IHNkaW9kX2RyaXZlX3N0ciAqKSZzZGlvZF9kcml2ZV9zdHJlbmd0aF90YWIxOwotCQlzdHJfbWFzayA9IDB4MzAwMDAwMDA7Ci0JCXN0cl9zaGlmdCA9IDI4OwotCQlicmVhazsKLQljYXNlIFNESU9EX0RSVlNUUl9LRVkoQkNNNDMyNV9DSElQX0lELCAyKToKLQljYXNlIFNESU9EX0RSVlNUUl9LRVkoQkNNNDMyNV9DSElQX0lELCAzKToKLQkJc3RyX3RhYiA9IChzdHJ1Y3Qgc2Rpb2RfZHJpdmVfc3RyICopJnNkaW9kX2RyaXZlX3N0cmVuZ3RoX3RhYjI7Ci0JCXN0cl9tYXNrID0gMHgwMDAwMzgwMDsKLQkJc3RyX3NoaWZ0ID0gMTE7Ci0JCWJyZWFrOwotCWNhc2UgU0RJT0RfRFJWU1RSX0tFWShCQ000MzM2X0NISVBfSUQsIDgpOgotCQlzdHJfdGFiID0gKHN0cnVjdCBzZGlvZF9kcml2ZV9zdHIgKikmc2Rpb2RfZHJpdmVfc3RyZW5ndGhfdGFiMzsKLQkJc3RyX21hc2sgPSAweDAwMDAzODAwOwotCQlzdHJfc2hpZnQgPSAxMTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQlJDTUZfRVJST1IoKCJObyBTRElPIERyaXZlIHN0cmVuZ3RoIGluaXQiCi0JCQkgICAgICJkb25lIGZvciBjaGlwICVzIHJldiAlZCBwbXVyZXYgJWRcbiIsCi0JCQkgICAgIGJyY211X2NoaXBuYW1lKGJ1cy0+Y2ktPmNoaXAsIGNobiwgOCksCi0JCQkgICAgIGJ1cy0+Y2ktPmNoaXByZXYsIGJ1cy0+Y2ktPnBtdXJldikpOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoc3RyX3RhYiAhPSBOVUxMKSB7Ci0JCXUzMiBkcml2ZXN0cmVuZ3RoX3NlbCA9IDA7Ci0JCXUzMiBjY19kYXRhX3RlbXA7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IHN0cl90YWJbaV0uc3RyZW5ndGggIT0gMDsgaSsrKSB7Ci0JCQlpZiAoZHJpdmVzdHJlbmd0aCA+PSBzdHJfdGFiW2ldLnN0cmVuZ3RoKSB7Ci0JCQkJZHJpdmVzdHJlbmd0aF9zZWwgPSBzdHJfdGFiW2ldLnNlbDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoYnVzLT5jYXJkLAotCQkJQ09SRV9DQ19SRUcoYnVzLT5jaS0+Y2Njb3JlYmFzZSwgY2hpcGNvbnRyb2xfYWRkciksCi0JCQk0LCAxKTsKLQkJY2NfZGF0YV90ZW1wID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKGJ1cy0+Y2FyZCwKLQkJCUNPUkVfQ0NfUkVHKGJ1cy0+Y2ktPmNjY29yZWJhc2UsIGNoaXBjb250cm9sX2FkZHIpLCA0KTsKLQkJY2NfZGF0YV90ZW1wICY9IH5zdHJfbWFzazsKLQkJZHJpdmVzdHJlbmd0aF9zZWwgPDw9IHN0cl9zaGlmdDsKLQkJY2NfZGF0YV90ZW1wIHw9IGRyaXZlc3RyZW5ndGhfc2VsOwotCQlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKGJ1cy0+Y2FyZCwKLQkJCUNPUkVfQ0NfUkVHKGJ1cy0+Y2ktPmNjY29yZWJhc2UsIGNoaXBjb250cm9sX2FkZHIpLAotCQkJNCwgY2NfZGF0YV90ZW1wKTsKLQotCQlCUkNNRl9JTkZPKCgiU0RJTzogJWRtQSBkcml2ZSBzdHJlbmd0aCBzZWxlY3RlZCwgIgotCQkJICAgICJzZXQgdG8gMHglMDh4XG4iLCBkcml2ZXN0cmVuZ3RoLCBjY19kYXRhX3RlbXApKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1icmNtZl9zZGJyY21fY2hpcF9kZXRhY2goc3RydWN0IGJyY21mX2J1cyAqYnVzKQotewotCUJSQ01GX1RSQUNFKCgiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXykpOwotCi0Ja2ZyZWUoYnVzLT5jaSk7Ci0JYnVzLT5jaSA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1icmNtZl9zZGJyY21fd2FpdF9mb3JfZXZlbnQoc3RydWN0IGJyY21mX2J1cyAqYnVzLCBib29sICpsb2NrdmFyKQotewotCWJyY21mX3NkYnJjbV9zZHVubG9jayhidXMpOwotCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGJ1cy0+Y3RybF93YWl0LAotCQkJCQkgKCpsb2NrdmFyID09IGZhbHNlKSwgSFogKiAyKTsKLQlicmNtZl9zZGJyY21fc2Rsb2NrKGJ1cyk7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotYnJjbWZfc2RicmNtX3dhaXRfZXZlbnRfd2FrZXVwKHN0cnVjdCBicmNtZl9idXMgKmJ1cykKLXsKLQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmYnVzLT5jdHJsX3dhaXQpKQotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmJ1cy0+Y3RybF93YWl0KTsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQKLWJyY21mX3NkYnJjbV93YXRjaGRvZ190aHJlYWQodm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgYnJjbWZfYnVzICpidXMgPSAoc3RydWN0IGJyY21mX2J1cyAqKWRhdGE7Ci0KLQkvKiBUaGlzIHRocmVhZCBkb2Vzbid0IG5lZWQgYW55IHVzZXItbGV2ZWwgYWNjZXNzLAotCSogc28gZ2V0IHJpZCBvZiBhbGwgb3VyIHJlc291cmNlcwotCSovCi0JaWYgKGJyY21mX3dhdGNoZG9nX3ByaW8gPiAwKSB7Ci0JCXN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbTsKLQkJcGFyYW0uc2NoZWRfcHJpb3JpdHkgPSAoYnJjbWZfd2F0Y2hkb2dfcHJpbyA8IE1BWF9SVF9QUklPKSA/Ci0JCQkJICAgICAgIGJyY21mX3dhdGNoZG9nX3ByaW8gOiAoTUFYX1JUX1BSSU8gLSAxKTsKLQkJc2NoZWRfc2V0c2NoZWR1bGVyKGN1cnJlbnQsIFNDSEVEX0ZJRk8sICZwYXJhbSk7Ci0JfQotCi0JYWxsb3dfc2lnbmFsKFNJR1RFUk0pOwotCS8qIFJ1biB1bnRpbCBzaWduYWwgcmVjZWl2ZWQgKi8KLQl3aGlsZSAoMSkgewotCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQotCQkJYnJlYWs7Ci0JCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZidXMtPndhdGNoZG9nX3dhaXQpKSB7Ci0JCQlpZiAoYnVzLT5kcnZyLT5kb25nbGVfcmVzZXQgPT0gZmFsc2UpCi0JCQkJYnJjbWZfc2RicmNtX2J1c193YXRjaGRvZyhidXMtPmRydnIpOwotCQkJLyogQ291bnQgdGhlIHRpY2sgZm9yIHJlZmVyZW5jZSAqLwotCQkJYnVzLT5kcnZyLT50aWNrY250Kys7Ci0JCX0gZWxzZQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotYnJjbWZfc2RicmNtX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgYnJjbWZfYnVzICpidXMgPSAoc3RydWN0IGJyY21mX2J1cyAqKWRhdGE7Ci0KLQlpZiAoYnJjbWZfd2F0Y2hkb2dfcHJpbyA+PSAwKSB7Ci0JCWlmIChidXMtPndhdGNoZG9nX3RzaykKLQkJCWNvbXBsZXRlKCZidXMtPndhdGNoZG9nX3dhaXQpOwotCQllbHNlCi0JCQlyZXR1cm47Ci0JfSBlbHNlIHsKLQkJYnJjbWZfc2RicmNtX2J1c193YXRjaGRvZyhidXMtPmRydnIpOwotCi0JCS8qIENvdW50IHRoZSB0aWNrIGZvciByZWZlcmVuY2UgKi8KLQkJYnVzLT5kcnZyLT50aWNrY250Kys7Ci0JfQotCi0JLyogUmVzY2hlZHVsZSB0aGUgd2F0Y2hkb2cgKi8KLQlpZiAoYnVzLT53ZF90aW1lcl92YWxpZCkKLQkJbW9kX3RpbWVyKCZidXMtPnRpbWVyLCBqaWZmaWVzICsgYnJjbWZfd2F0Y2hkb2dfbXMgKiBIWiAvIDEwMDApOwotfQotCi12b2lkCi1icmNtZl9zZGJyY21fd2RfdGltZXIoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1aW50IHdkdGljaykKLXsKLQlzdGF0aWMgdWludCBzYXZlX21zOwotCi0JLyogZG9uJ3Qgc3RhcnQgdGhlIHdkIHVudGlsIGZ3IGlzIGxvYWRlZCAqLwotCWlmIChidXMtPmRydnItPmJ1c3N0YXRlID09IEJSQ01GX0JVU19ET1dOKQotCQlyZXR1cm47Ci0KLQkvKiBUb3RhbGx5IHN0b3AgdGhlIHRpbWVyICovCi0JaWYgKCF3ZHRpY2sgJiYgYnVzLT53ZF90aW1lcl92YWxpZCA9PSB0cnVlKSB7Ci0JCWRlbF90aW1lcl9zeW5jKCZidXMtPnRpbWVyKTsKLQkJYnVzLT53ZF90aW1lcl92YWxpZCA9IGZhbHNlOwotCQlzYXZlX21zID0gd2R0aWNrOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHdkdGljaykgewotCQlicmNtZl93YXRjaGRvZ19tcyA9ICh1aW50KSB3ZHRpY2s7Ci0KLQkJaWYgKHNhdmVfbXMgIT0gYnJjbWZfd2F0Y2hkb2dfbXMpIHsKLQkJCWlmIChidXMtPndkX3RpbWVyX3ZhbGlkID09IHRydWUpCi0JCQkJLyogU3RvcCB0aW1lciBhbmQgcmVzdGFydCBhdCBuZXcgdmFsdWUgKi8KLQkJCQlkZWxfdGltZXJfc3luYygmYnVzLT50aW1lcik7Ci0KLQkJCS8qIENyZWF0ZSB0aW1lciBhZ2FpbiB3aGVuIHdhdGNoZG9nIHBlcmlvZCBpcwotCQkJICAgZHluYW1pY2FsbHkgY2hhbmdlZCBvciBpbiB0aGUgZmlyc3QgaW5zdGFuY2UKLQkJCSAqLwotCQkJYnVzLT50aW1lci5leHBpcmVzID0KLQkJCQlqaWZmaWVzICsgYnJjbWZfd2F0Y2hkb2dfbXMgKiBIWiAvIDEwMDA7Ci0JCQlhZGRfdGltZXIoJmJ1cy0+dGltZXIpOwotCi0JCX0gZWxzZSB7Ci0JCQkvKiBSZSBhcm0gdGhlIHRpbWVyLCBhdCBsYXN0IHdhdGNoZG9nIHBlcmlvZCAqLwotCQkJbW9kX3RpbWVyKCZidXMtPnRpbWVyLAotCQkJCWppZmZpZXMgKyBicmNtZl93YXRjaGRvZ19tcyAqIEhaIC8gMTAwMCk7Ci0JCX0KLQotCQlidXMtPndkX3RpbWVyX3ZhbGlkID0gdHJ1ZTsKLQkJc2F2ZV9tcyA9IHdkdGljazsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgYnJjbWZfc2RicmNtX2RwY190aHJlYWQodm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgYnJjbWZfYnVzICpidXMgPSAoc3RydWN0IGJyY21mX2J1cyAqKSBkYXRhOwotCi0JLyogVGhpcyB0aHJlYWQgZG9lc24ndCBuZWVkIGFueSB1c2VyLWxldmVsIGFjY2VzcywKLQkgKiBzbyBnZXQgcmlkIG9mIGFsbCBvdXIgcmVzb3VyY2VzCi0JICovCi0JaWYgKGJyY21mX2RwY19wcmlvID4gMCkgewotCQlzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW07Ci0JCXBhcmFtLnNjaGVkX3ByaW9yaXR5ID0gKGJyY21mX2RwY19wcmlvIDwgTUFYX1JUX1BSSU8pID8KLQkJCQkgICAgICAgYnJjbWZfZHBjX3ByaW8gOiAoTUFYX1JUX1BSSU8gLSAxKTsKLQkJc2NoZWRfc2V0c2NoZWR1bGVyKGN1cnJlbnQsIFNDSEVEX0ZJRk8sICZwYXJhbSk7Ci0JfQotCi0JYWxsb3dfc2lnbmFsKFNJR1RFUk0pOwotCS8qIFJ1biB1bnRpbCBzaWduYWwgcmVjZWl2ZWQgKi8KLQl3aGlsZSAoMSkgewotCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQotCQkJYnJlYWs7Ci0JCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZidXMtPmRwY193YWl0KSkgewotCQkJLyogQ2FsbCBidXMgZHBjIHVubGVzcyBpdCBpbmRpY2F0ZWQgZG93bgotCQkJKHRoZW4gY2xlYW4gc3RvcCkgKi8KLQkJCWlmIChidXMtPmRydnItPmJ1c3N0YXRlICE9IEJSQ01GX0JVU19ET1dOKSB7Ci0JCQkJaWYgKGJyY21mX3NkYnJjbV9kcGMoYnVzKSkKLQkJCQkJY29tcGxldGUoJmJ1cy0+ZHBjX3dhaXQpOwotCQkJfSBlbHNlIHsKLQkJCQlicmNtZl9zZGJyY21fYnVzX3N0b3AoYnVzLCB0cnVlKTsKLQkJCX0KLQkJfSBlbHNlCi0JCQlicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21mX3NkYnJjbV9kcGNfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IGJyY21mX2J1cyAqYnVzID0gKHN0cnVjdCBicmNtZl9idXMgKikgZGF0YTsKLQotCS8qIENhbGwgYnVzIGRwYyB1bmxlc3MgaXQgaW5kaWNhdGVkIGRvd24gKHRoZW4gY2xlYW4gc3RvcCkgKi8KLQlpZiAoYnVzLT5kcnZyLT5idXNzdGF0ZSAhPSBCUkNNRl9CVVNfRE9XTikgewotCQlpZiAoYnJjbWZfc2RicmNtX2RwYyhidXMpKQotCQkJdGFza2xldF9zY2hlZHVsZSgmYnVzLT50YXNrbGV0KTsKLQl9IGVsc2UKLQkJYnJjbWZfc2RicmNtX2J1c19zdG9wKGJ1cywgdHJ1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21mX3NkYnJjbV9zY2hlZF9kcGMoc3RydWN0IGJyY21mX2J1cyAqYnVzKQotewotCWlmIChidXMtPmRwY190c2spIHsKLQkJY29tcGxldGUoJmJ1cy0+ZHBjX3dhaXQpOwotCQlyZXR1cm47Ci0JfQotCi0JdGFza2xldF9zY2hlZHVsZSgmYnVzLT50YXNrbGV0KTsKLX0KLQotc3RhdGljIHZvaWQgYnJjbWZfc2RicmNtX3NkbG9jayhzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCi17Ci0JaWYgKGJ1cy0+dGhyZWFkc19vbmx5KQotCQlkb3duKCZidXMtPnNkc2VtKTsKLQllbHNlCi0JCXNwaW5fbG9ja19iaCgmYnVzLT5zZGxvY2spOwotfQotCi1zdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fc2R1bmxvY2soc3RydWN0IGJyY21mX2J1cyAqYnVzKQotewotCWlmIChidXMtPnRocmVhZHNfb25seSkKLQkJdXAoJmJ1cy0+c2RzZW0pOwotCWVsc2UKLQkJc3Bpbl91bmxvY2tfYmgoJmJ1cy0+c2Rsb2NrKTsKLX0KLQotc3RhdGljIGludCBicmNtZl9zZGJyY21fZ2V0X2ltYWdlKGNoYXIgKmJ1ZiwgaW50IGxlbiwgc3RydWN0IGJyY21mX2J1cyAqYnVzKQotewotCWlmIChidXMtPmZpcm13YXJlLT5zaXplIDwgYnVzLT5md19wdHIgKyBsZW4pCi0JCWxlbiA9IGJ1cy0+ZmlybXdhcmUtPnNpemUgLSBidXMtPmZ3X3B0cjsKLQotCW1lbWNweShidWYsICZidXMtPmZpcm13YXJlLT5kYXRhW2J1cy0+ZndfcHRyXSwgbGVuKTsKLQlidXMtPmZ3X3B0ciArPSBsZW47Ci0JcmV0dXJuIGxlbjsKLX0KLQotTU9EVUxFX0ZJUk1XQVJFKEJDTTQzMjlfRldfTkFNRSk7Ci1NT0RVTEVfRklSTVdBUkUoQkNNNDMyOV9OVl9OQU1FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvc2Rpb19ob3N0LmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3NkaW9faG9zdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzQ1NDcyLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvc2Rpb19ob3N0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYJX0JSQ01fU0RIX0hfCi0jZGVmaW5lCV9CUkNNX1NESF9IXwotCi0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci1leHRlcm4gY29uc3QgdWludCBicmNtZl9zZGlvX21zZ2xldmVsOwotCi0jZGVmaW5lIFNESU9fRlVOQ18wCQkwCi0jZGVmaW5lIFNESU9fRlVOQ18xCQkxCi0jZGVmaW5lIFNESU9fRlVOQ18yCQkyCi0KLSNkZWZpbmUgU0RJT0RfRkJSX1NJWkUJCTB4MTAwCi0KLS8qIGlvX2VuICovCi0jZGVmaW5lIFNESU9fRlVOQ19FTkFCTEVfMQkweDAyCi0jZGVmaW5lIFNESU9fRlVOQ19FTkFCTEVfMgkweDA0Ci0KLS8qIGlvX3JkeXMgKi8KLSNkZWZpbmUgU0RJT19GVU5DX1JFQURZXzEJMHgwMgotI2RlZmluZSBTRElPX0ZVTkNfUkVBRFlfMgkweDA0Ci0KLS8qIGludHJfc3RhdHVzICovCi0jZGVmaW5lIElOVFJfU1RBVFVTX0ZVTkMxCTB4MgotI2RlZmluZSBJTlRSX1NUQVRVU19GVU5DMgkweDQKLQotLyogTWF4aW11bSBudW1iZXIgb2YgSS9PIGZ1bmNzICovCi0jZGVmaW5lIFNESU9EX01BWF9JT0ZVTkNTCTcKLQotI2RlZmluZSBTQlNESU9fTlVNX0ZVTkNUSU9OCQkzCS8qIGFzIG9mIHNkaW9kIHJldiAwLCBzdXBwb3J0cyAzIGZ1bmN0aW9ucyAqLwotCi0vKiBmdW5jdGlvbiAxIG1pc2NlbGxhbmVvdXMgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFNCU0RJT19TUFJPTV9DUwkJCTB4MTAwMDAJLyogc3Byb20gY29tbWFuZCBhbmQgc3RhdHVzICovCi0jZGVmaW5lIFNCU0RJT19TUFJPTV9JTkZPCQkweDEwMDAxCS8qIHNwcm9tIGluZm8gcmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0JTRElPX1NQUk9NX0RBVEFfTE9XCQkweDEwMDAyCS8qIHNwcm9tIGluZGlyZWN0IGFjY2VzcyBkYXRhIGJ5dGUgMCAqLwotI2RlZmluZSBTQlNESU9fU1BST01fREFUQV9ISUdICQkweDEwMDAzCS8qIHNwcm9tIGluZGlyZWN0IGFjY2VzcyBkYXRhIGJ5dGUgMSAqLwotI2RlZmluZSBTQlNESU9fU1BST01fQUREUl9MT1cJCTB4MTAwMDQJLyogc3Byb20gaW5kaXJlY3QgYWNjZXNzIGFkZHIgYnl0ZSAwICovCi0jZGVmaW5lIFNCU0RJT19TUFJPTV9BRERSX0hJR0gJCTB4MTAwMDUJLyogc3Byb20gaW5kaXJlY3QgYWNjZXNzIGFkZHIgYnl0ZSAwICovCi0jZGVmaW5lIFNCU0RJT19DSElQX0NUUkxfREFUQQkJMHgxMDAwNgkvKiB4dGFsX3B1IChncGlvKSBvdXRwdXQgKi8KLSNkZWZpbmUgU0JTRElPX0NISVBfQ1RSTF9FTgkJMHgxMDAwNwkvKiB4dGFsX3B1IChncGlvKSBlbmFibGUgKi8KLSNkZWZpbmUgU0JTRElPX1dBVEVSTUFSSwkJMHgxMDAwOAkvKiByZXYgPCA3LCB3YXRlcm1hcmsgZm9yIHNkaW8gZGV2aWNlICovCi0jZGVmaW5lIFNCU0RJT19ERVZJQ0VfQ1RMCQkweDEwMDA5CS8qIGNvbnRyb2wgYnVzeSBzaWduYWwgZ2VuZXJhdGlvbiAqLwotCi0vKiByZWdpc3RlcnMgaW50cm9kdWNlZCBpbiByZXYgOCwgc29tZSBjb250ZW50IChtYXNrL2JpdHMpIGRlZnMgaW4gc2JzZHBjbWRldi5oICovCi0jZGVmaW5lIFNCU0RJT19GVU5DMV9TQkFERFJMT1cJCTB4MTAwMEEJLyogU0IgQWRkcmVzcyBXaW5kb3cgTG93IChiMTUpICovCi0jZGVmaW5lIFNCU0RJT19GVU5DMV9TQkFERFJNSUQJCTB4MTAwMEIJLyogU0IgQWRkcmVzcyBXaW5kb3cgTWlkIChiMjM6YjE2KSAqLwotI2RlZmluZSBTQlNESU9fRlVOQzFfU0JBRERSSElHSAkJMHgxMDAwQwkvKiBTQiBBZGRyZXNzIFdpbmRvdyBIaWdoIChiMzE6YjI0KSAgICAqLwotI2RlZmluZSBTQlNESU9fRlVOQzFfRlJBTUVDVFJMCQkweDEwMDBECS8qIEZyYW1lIENvbnRyb2wgKGZyYW1lIHRlcm0vYWJvcnQpICovCi0jZGVmaW5lIFNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSCQkweDEwMDBFCS8qIENoaXBDbG9ja0NTUiAoQUxQL0hUIGN0bC9zdGF0dXMpICovCi0jZGVmaW5lIFNCU0RJT19GVU5DMV9TRElPUFVMTFVQCQkweDEwMDBGCS8qIFNkaW9QdWxsVXAgKG9uIGNtZCwgZDAtZDIpICovCi0jZGVmaW5lIFNCU0RJT19GVU5DMV9XRlJBTUVCQ0xPCQkweDEwMDE5CS8qIFdyaXRlIEZyYW1lIEJ5dGUgQ291bnQgTG93ICovCi0jZGVmaW5lIFNCU0RJT19GVU5DMV9XRlJBTUVCQ0hJCQkweDEwMDFBCS8qIFdyaXRlIEZyYW1lIEJ5dGUgQ291bnQgSGlnaCAqLwotI2RlZmluZSBTQlNESU9fRlVOQzFfUkZSQU1FQkNMTwkJMHgxMDAxQgkvKiBSZWFkIEZyYW1lIEJ5dGUgQ291bnQgTG93ICovCi0jZGVmaW5lIFNCU0RJT19GVU5DMV9SRlJBTUVCQ0hJCQkweDEwMDFDCS8qIFJlYWQgRnJhbWUgQnl0ZSBDb3VudCBIaWdoICovCi0KLSNkZWZpbmUgU0JTRElPX0ZVTkMxX01JU0NfUkVHX1NUQVJUCTB4MTAwMDAJLyogZjEgbWlzYyByZWdpc3RlciBzdGFydCAqLwotI2RlZmluZSBTQlNESU9fRlVOQzFfTUlTQ19SRUdfTElNSVQJMHgxMDAxQwkvKiBmMSBtaXNjIHJlZ2lzdGVyIGVuZCAqLwotCi0vKiBmdW5jdGlvbiAxIE9DUCBzcGFjZSAqLwotI2RlZmluZSBTQlNESU9fU0JfT0ZUX0FERFJfTUFTSwkJMHgwN0ZGRgkvKiBzYiBvZmZzZXQgYWRkciBpcyA8PSAxNSBiaXRzLCAzMmsgKi8KLSNkZWZpbmUgU0JTRElPX1NCX09GVF9BRERSX0xJTUlUCTB4MDgwMDAKLSNkZWZpbmUgU0JTRElPX1NCX0FDQ0VTU18yXzRCX0ZMQUcJMHgwODAwMAkvKiB3aXRoIGIxNSwgbWFwcyB0byAzMi1iaXQgU0IgYWNjZXNzICovCi0KLS8qIHNvbWUgZHVwbGljYXRpb24gd2l0aCBzYnNkcGNtZGV2LmggaGVyZSAqLwotLyogdmFsaWQgYml0cyBpbiBTQlNESU9fRlVOQzFfU0JBRERSeHh4IHJlZ3MgKi8KLSNkZWZpbmUgU0JTRElPX1NCQUREUkxPV19NQVNLCQkweDgwCS8qIFZhbGlkIGJpdHMgaW4gU0JBRERSTE9XICovCi0jZGVmaW5lIFNCU0RJT19TQkFERFJNSURfTUFTSwkJMHhmZgkvKiBWYWxpZCBiaXRzIGluIFNCQUREUk1JRCAqLwotI2RlZmluZSBTQlNESU9fU0JBRERSSElHSF9NQVNLCQkweGZmVQkvKiBWYWxpZCBiaXRzIGluIFNCQUREUkhJR0ggKi8KLSNkZWZpbmUgU0JTRElPX1NCV0lORE9XX01BU0sJCTB4ZmZmZjgwMDAJLyogQWRkcmVzcyBiaXRzIGZyb20gU0JBRERSIHJlZ3MgKi8KLQotI2RlZmluZSBTRElPSF9SRUFEICAgICAgICAgICAgICAwCS8qIFJlYWQgcmVxdWVzdCAqLwotI2RlZmluZSBTRElPSF9XUklURSAgICAgICAgICAgICAxCS8qIFdyaXRlIHJlcXVlc3QgKi8KLQotI2RlZmluZSBTRElPSF9EQVRBX0ZJWCAgICAgICAgICAwCS8qIEZpeGVkIGFkZHJlc3NpbmcgKi8KLSNkZWZpbmUgU0RJT0hfREFUQV9JTkMgICAgICAgICAgMQkvKiBJbmNyZW1lbnRhbCBhZGRyZXNzaW5nICovCi0KLS8qIGludGVybmFsIHJldHVybiBjb2RlICovCi0jZGVmaW5lIFNVQ0NFU1MJMAotI2RlZmluZSBFUlJPUgkxCi0KLS8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCi1zdHJ1Y3QgYnJjbWZfc2Rpb19jYXJkOwotCi1zdHJ1Y3QgYnJjbWZfc2RyZWcgewotCWludCBmdW5jOwotCWludCBvZmZzZXQ7Ci0JaW50IHZhbHVlOwotfTsKLQotc3RydWN0IHNkaW9oX2luZm8gewotCXN0cnVjdCBvc2xfaW5mbyAqb3NoOwkJLyogb3NoIGhhbmRsZXIgKi8KLQlib29sIGNsaWVudF9pbnRyX2VuYWJsZWQ7CS8qIGludGVycnVwdCBjb25ubmVjdGVkIGZsYWcgKi8KLQlib29sIGludHJfaGFuZGxlcl92YWxpZDsJLyogY2xpZW50IGRyaXZlciBpbnRlcnJ1cHQgaGFuZGxlciB2YWxpZCAqLwotCXZvaWQgKCppbnRyX2hhbmRsZXIpKHZvaWQgKik7CS8qIHJlZ2lzdGVyZWQgaW50ZXJydXB0IGhhbmRsZXIgKi8KLQl2b2lkICppbnRyX2hhbmRsZXJfYXJnOwkvKiBhcmd1bWVudCB0byBjYWxsIGludGVycnVwdCBoYW5kbGVyICovCi0JdTE2IGludG1hc2s7CQkvKiBDdXJyZW50IGFjdGl2ZSBpbnRlcnJ1cHRzICovCi0Jdm9pZCAqc2Rvc19pbmZvOwkvKiBQb2ludGVyIHRvIHBlci1PUyBwcml2YXRlIGRhdGEgKi8KLQotCXVpbnQgaXJxOwkJLyogQ2xpZW50IGlycSAqLwotCWludCBpbnRyY291bnQ7CQkvKiBDbGllbnQgaW50ZXJydXB0cyAqLwotCWJvb2wgc2RfYmxvY2ttb2RlOwkvKiBzZF9ibG9ja21vZGUgPT0gZmFsc2UgPT4gNjQgQnl0ZSBDbWQgNTNzLiAqLwotCS8qICBNdXN0IGJlIG9uIGZvciBzZF9tdWx0aWJsb2NrIHRvIGJlIGVmZmVjdGl2ZSAqLwotCWJvb2wgdXNlX2NsaWVudF9pbnRzOwkvKiBJZiB0aGlzIGlzIGZhbHNlLCBtYWtlIHN1cmUgdG8gcmVzdG9yZSAqLwotCWludCBjbGllbnRfYmxvY2tfc2l6ZVtTRElPRF9NQVhfSU9GVU5DU107CS8qIEJsb2Nrc2l6ZSAqLwotCXU4IG51bV9mdW5jczsJLyogU3VwcG9ydGVkIGZ1bmNzIG9uIGNsaWVudCAqLwotCXUzMiBjb21fY2lzX3B0cjsKLQl1MzIgZnVuY19jaXNfcHRyW1NESU9EX01BWF9JT0ZVTkNTXTsKLQl1aW50IG1heF9kbWFfbGVuOwotCXVpbnQgbWF4X2RtYV9kZXNjcmlwdG9yczsJLyogRE1BIERlc2NyaXB0b3JzIHN1cHBvcnRlZCBieSB0aGlzIGNvbnRyb2xsZXIuICovCi0JLyoJU0RETUFfREVTQ1JJUFRPUglTR0xpc3RbMzJdOyAqLy8qIFNjYXR0ZXIvR2F0aGVyIERNQSBMaXN0ICovCi19OwotCi1zdHJ1Y3QgYnJjbWZfc2RtbWNfaW5zdGFuY2UgewotCXN0cnVjdCBzZGlvaF9pbmZvICpzZDsKLQlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jW1NESU9EX01BWF9JT0ZVTkNTXTsKLQl1MzIgaG9zdF9jbGFpbWVkOwotfTsKLQotLyogQXR0YWNoIGFuZCBidWlsZCBhbiBpbnRlcmZhY2UgdG8gdGhlIHVuZGVybHlpbmcgU0QgaG9zdCBkcml2ZXIuCi0gKiAgLSBBbGxvY2F0ZXMgcmVzb3VyY2VzIChzdHJ1Y3RzLCBhcnJheXMsIG1lbSwgT1MgaGFuZGxlcywgZXRjKSBuZWVkZWQgYnkKLSAqICAgIGJyY21mX3NkY2FyZC4KLSAqICAtIFJldHVybnMgdGhlIHNkaW8gY2FyZCBoYW5kbGUgYW5kIHZpcnR1YWwgYWRkcmVzcyBiYXNlIGZvciByZWdpc3RlciBhY2Nlc3MuCi0gKiAgICBUaGUgcmV0dXJuZWQgaGFuZGxlIHNob3VsZCBiZSB1c2VkIGluIGFsbCBzdWJzZXF1ZW50IGNhbGxzLCBidXQgdGhlIGJjbXNoCi0gKiAgICBpbXBsZW1lbnRhdGlvbiBtYXkgbWFpbnRhaW4gYSBzaW5nbGUgImRlZmF1bHQiIGhhbmRsZSAoZS5nLiB0aGUgZmlyc3Qgb3IKLSAqICAgIG1vc3QgcmVjZW50IG9uZSkgdG8gZW5hYmxlIHNpbmdsZS1pbnN0YW5jZSBpbXBsZW1lbnRhdGlvbnMgdG8gcGFzcyBOVUxMLgotICovCi1leHRlcm4gc3RydWN0IGJyY21mX3NkaW9fY2FyZCoKLWJyY21mX3NkY2FyZF9hdHRhY2godm9pZCAqY2ZnaGRsLCB1MzIgKnJlZ3N2YSwgdWludCBpcnEpOwotCi0vKiBEZXRhY2ggLSBmcmVldXAgcmVzb3VyY2VzIGFsbG9jYXRlZCBpbiBhdHRhY2ggKi8KLWV4dGVybiBpbnQgYnJjbWZfc2RjYXJkX2RldGFjaChzdHJ1Y3QgYnJjbWZfc2Rpb19jYXJkICpjYXJkKTsKLQotLyogRW5hYmxlL2Rpc2FibGUgU0QgaW50ZXJydXB0ICovCi1leHRlcm4gaW50IGJyY21mX3NkY2FyZF9pbnRyX2VuYWJsZShzdHJ1Y3QgYnJjbWZfc2Rpb19jYXJkICpjYXJkKTsKLWV4dGVybiBpbnQgYnJjbWZfc2RjYXJkX2ludHJfZGlzYWJsZShzdHJ1Y3QgYnJjbWZfc2Rpb19jYXJkICpjYXJkKTsKLQotLyogUmVnaXN0ZXIvZGVyZWdpc3RlciBkZXZpY2UgaW50ZXJydXB0IGhhbmRsZXIuICovCi1leHRlcm4gaW50Ci1icmNtZl9zZGNhcmRfaW50cl9yZWcoc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCwKLQkJICAgICAgdm9pZCAoKmZuKSh2b2lkICopLCB2b2lkICphcmdoKTsKLQotZXh0ZXJuIGludCBicmNtZl9zZGNhcmRfaW50cl9kZXJlZyhzdHJ1Y3QgYnJjbWZfc2Rpb19jYXJkICpjYXJkKTsKLQotLyogQWNjZXNzIFNESU8gYWRkcmVzcyBzcGFjZSAoZS5nLiBDQ0NSKSB1c2luZyBDTUQ1MiAoc2luZ2xlLWJ5dGUgaW50ZXJmYWNlKS4KLSAqICAgZm46ICAgZnVuY3Rpb24gbnVtYmVyCi0gKiAgIGFkZHI6IHVubW9kaWZpZWQgU0RJTy1zcGFjZSBhZGRyZXNzCi0gKiAgIGRhdGE6IGRhdGEgYnl0ZSB0byB3cml0ZQotICogICBlcnI6ICBwb2ludGVyIHRvIGVycm9yIGNvZGUgKG9yIE5VTEwpCi0gKi8KLWV4dGVybiB1OCBicmNtZl9zZGNhcmRfY2ZnX3JlYWQoc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCwgdWludCBmdW5jLAotCQkJCXUzMiBhZGRyLCBpbnQgKmVycik7Ci1leHRlcm4gdm9pZCBicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKHN0cnVjdCBicmNtZl9zZGlvX2NhcmQgKmNhcmQsIHVpbnQgZnVuYywKLQkJCQkgICB1MzIgYWRkciwgdTggZGF0YSwgaW50ICplcnIpOwotCi0vKiBSZWFkL1dyaXRlIDRieXRlcyBmcm9tL3RvIGNmZyBzcGFjZSAqLwotZXh0ZXJuIHUzMgotYnJjbWZfc2RjYXJkX2NmZ19yZWFkX3dvcmQoc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCwgdWludCBmbmNfbnVtLAotCQkJICAgdTMyIGFkZHIsIGludCAqZXJyKTsKLQotZXh0ZXJuIHZvaWQgYnJjbWZfc2RjYXJkX2NmZ193cml0ZV93b3JkKHN0cnVjdCBicmNtZl9zZGlvX2NhcmQgKmNhcmQsCi0JCQkJCXVpbnQgZm5jX251bSwgdTMyIGFkZHIsCi0JCQkJCXUzMiBkYXRhLCBpbnQgKmVycik7Ci0KLS8qIFJlYWQgQ0lTIGNvbnRlbnQgZm9yIHNwZWNpZmllZCBmdW5jdGlvbi4KLSAqICAgZm46ICAgICBmdW5jdGlvbiB3aG9zZSBDSVMgaXMgYmVpbmcgcmVxdWVzdGVkICgwIGlzIGNvbW1vbiBDSVMpCi0gKiAgIGNpczogICAgcG9pbnRlciB0byBtZW1vcnkgbG9jYXRpb24gdG8gcGxhY2UgcmVzdWx0cwotICogICBsZW5ndGg6IG51bWJlciBvZiBieXRlcyB0byByZWFkCi0gKiBJbnRlcm5hbGx5LCB0aGlzIHJvdXRpbmUgdXNlcyB0aGUgdmFsdWVzIGZyb20gdGhlIGNpcyBiYXNlIHJlZ3MgKDB4OS0weEIpCi0gKiB0byBmb3JtIGFuIFNESU8tc3BhY2UgYWRkcmVzcyB0byByZWFkIHRoZSBkYXRhIGZyb20uCi0gKi8KLWV4dGVybiBpbnQgYnJjbWZfc2RjYXJkX2Npc19yZWFkKHN0cnVjdCBicmNtZl9zZGlvX2NhcmQgKmNhcmQsIHVpbnQgZnVuYywKLQkJCQkgdTggKmNpcywgdWludCBsZW5ndGgpOwotCi0vKiBTeW5jaHJvbm91cyBhY2Nlc3MgdG8gZGV2aWNlIChjbGllbnQpIGNvcmUgcmVnaXN0ZXJzIHZpYSBDTUQ1MyB0byBGMS4KLSAqICAgYWRkcjogYmFja3BsYW5lIGFkZHJlc3MgKGkuZS4gPj0gcmVnc3ZhIGZyb20gYXR0YWNoKQotICogICBzaXplOiByZWdpc3RlciB3aWR0aCBpbiBieXRlcyAoMiBvciA0KQotICogICBkYXRhOiBkYXRhIGZvciByZWdpc3RlciB3cml0ZQotICovCi1leHRlcm4gdTMyCi1icmNtZl9zZGNhcmRfcmVnX3JlYWQoc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCwgdTMyIGFkZHIsIHVpbnQgc2l6ZSk7Ci0KLWV4dGVybiB1MzIKLWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCwgdTMyIGFkZHIsIHVpbnQgc2l6ZSwKLQkJICAgICAgIHUzMiBkYXRhKTsKLQotLyogSW5kaWNhdGUgaWYgbGFzdCByZWcgcmVhZC93cml0ZSBmYWlsZWQgKi8KLWV4dGVybiBib29sIGJyY21mX3NkY2FyZF9yZWdmYWlsKHN0cnVjdCBicmNtZl9zZGlvX2NhcmQgKmNhcmQpOwotCi0vKiBCdWZmZXIgdHJhbnNmZXIgdG8vZnJvbSBkZXZpY2UgKGNsaWVudCkgY29yZSB2aWEgY21kNTMuCi0gKiAgIGZuOiAgICAgICBmdW5jdGlvbiBudW1iZXIKLSAqICAgYWRkcjogICAgIGJhY2twbGFuZSBhZGRyZXNzIChpLmUuID49IHJlZ3N2YSBmcm9tIGF0dGFjaCkKLSAqICAgZmxhZ3M6ICAgIGJhY2twbGFuZSB3aWR0aCwgYWRkcmVzcyBpbmNyZW1lbnQsIHN5bmMvYXN5bmMKLSAqICAgYnVmOiAgICAgIHBvaW50ZXIgdG8gbWVtb3J5IGRhdGEgYnVmZmVyCi0gKiAgIG5ieXRlczogICBudW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIgdG8vZnJvbSBidWYKLSAqICAgcGt0OiAgICAgIHBvaW50ZXIgdG8gcGFja2V0IGFzc29jaWF0ZWQgd2l0aCBidWYgKGlmIGFueSkKLSAqICAgY29tcGxldGU6IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBjb21tYW5kIGNvbXBsZXRpb24gKGFzeW5jIG9ubHkpCi0gKiAgIGhhbmRsZTogICBoYW5kbGUgZm9yIGNvbXBsZXRpb24gY2FsbGJhY2sgKGZpcnN0IGFyZyBpbiBjYWxsYmFjaykKLSAqIFJldHVybnMgMCBvciBlcnJvciBjb2RlLgotICogTk9URTogQXN5bmMgb3BlcmF0aW9uIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgotICovCi1leHRlcm4gaW50Ci1icmNtZl9zZGNhcmRfc2VuZF9idWYoc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCwgdTMyIGFkZHIsIHVpbnQgZm4sCi0JCSAgICAgIHVpbnQgZmxhZ3MsIHU4ICpidWYsIHVpbnQgbmJ5dGVzLCB2b2lkICpwa3QsCi0JCSAgICAgIHZvaWQgKCpjb21wbGV0ZSkodm9pZCAqaGFuZGxlLCBpbnQgc3RhdHVzLAotCQkJCSAgICAgICBib29sIHN5bmNfd2FpdGluZyksCi0JCSAgICAgIHZvaWQgKmhhbmRsZSk7Ci1leHRlcm4gaW50Ci1icmNtZl9zZGNhcmRfcmVjdl9idWYoc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCwgdTMyIGFkZHIsIHVpbnQgZm4sCi0JCSAgICAgIHVpbnQgZmxhZ3MsIHU4ICpidWYsIHVpbnQgbmJ5dGVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LAotCQkgICAgICB2b2lkICgqY29tcGxldGUpKHZvaWQgKmhhbmRsZSwgaW50IHN0YXR1cywKLQkJCQkgICAgICAgYm9vbCBzeW5jX3dhaXRpbmcpLAotCQkgICAgICB2b2lkICpoYW5kbGUpOwotCi0vKiBGbGFncyBiaXRzICovCi0jZGVmaW5lIFNESU9fUkVRXzRCWVRFCTB4MQkvKiBGb3VyLWJ5dGUgdGFyZ2V0IChiYWNrcGxhbmUpIHdpZHRoICh2cy4gdHdvLWJ5dGUpICovCi0jZGVmaW5lIFNESU9fUkVRX0ZJWEVECTB4MgkvKiBGaXhlZCBhZGRyZXNzIChGSUZPKSAodnMuIGluY3JlbWVudGluZyBhZGRyZXNzKSAqLwotI2RlZmluZSBTRElPX1JFUV9BU1lOQwkweDQJLyogQXN5bmMgcmVxdWVzdCAodnMuIHN5bmMgcmVxdWVzdCkgKi8KLQotLyogUGVuZGluZyAobm9uLWVycm9yKSByZXR1cm4gY29kZSAqLwotI2RlZmluZSBCQ01FX1BFTkRJTkcJMQotCi0vKiBSZWFkL3dyaXRlIHRvIG1lbW9yeSBibG9jayAoRjEsIG5vIEZJRk8pIHZpYSBDTUQ1MyAoc3luYyBvbmx5KS4KLSAqICAgcnc6ICAgICAgIHJlYWQgb3Igd3JpdGUgKDAvMSkKLSAqICAgYWRkcjogICAgIGRpcmVjdCBTRElPIGFkZHJlc3MKLSAqICAgYnVmOiAgICAgIHBvaW50ZXIgdG8gbWVtb3J5IGRhdGEgYnVmZmVyCi0gKiAgIG5ieXRlczogICBudW1iZXIgb2YgYnl0ZXMgdG8gdHJhbnNmZXIgdG8vZnJvbSBidWYKLSAqIFJldHVybnMgMCBvciBlcnJvciBjb2RlLgotICovCi1leHRlcm4gaW50IGJyY21mX3NkY2FyZF9yd2RhdGEoc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCwgdWludCBydywgdTMyIGFkZHIsCi0JCQkgICAgICAgdTggKmJ1ZiwgdWludCBuYnl0ZXMpOwotCi0vKiBJc3N1ZSBhbiBhYm9ydCB0byB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uICovCi1leHRlcm4gaW50IGJyY21mX3NkY2FyZF9hYm9ydChzdHJ1Y3QgYnJjbWZfc2Rpb19jYXJkICpjYXJkLCB1aW50IGZuKTsKLQotLyogUmV0dXJucyB0aGUgIkRldmljZSBJRCIgb2YgdGFyZ2V0IGRldmljZSBvbiB0aGUgU0RJTyBidXMuICovCi1leHRlcm4gaW50IGJyY21mX3NkY2FyZF9xdWVyeV9kZXZpY2Uoc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCk7Ci0KLS8qIE1pc2NlbGxhbmVvdXMga25vYiB0d2Vha2VyLiAqLwotZXh0ZXJuIGludCBicmNtZl9zZGNhcmRfaW92YXJfb3Aoc3RydWN0IGJyY21mX3NkaW9fY2FyZCAqY2FyZCwgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkgdm9pZCAqcGFyYW1zLCBpbnQgcGxlbiwgdm9pZCAqYXJnLCBpbnQgbGVuLAotCQkJCSBib29sIHNldCk7Ci0KLS8qIGhlbHBlciBmdW5jdGlvbnMgKi8KLQotLyogY2FsbGJhY2sgZnVuY3Rpb25zICovCi1zdHJ1Y3QgYnJjbWZfc2Rpb2hfZHJpdmVyIHsKLQkvKiBhdHRhY2ggdG8gZGV2aWNlICovCi0Jdm9pZCAqKCphdHRhY2gpICh1MTYgdmVuZF9pZCwgdTE2IGRldl9pZCwgdTE2IGJ1cywgdTE2IHNsb3QsCi0JCQkgdTE2IGZ1bmMsIHVpbnQgYnVzdHlwZSwgdTMyIHJlZ3N2YSwgdm9pZCAqcGFyYW0pOwotCS8qIGRldGFjaCBmcm9tIGRldmljZSAqLwotCXZvaWQgKCpkZXRhY2gpICh2b2lkICpjaCk7Ci19OwotCi1zdHJ1Y3Qgc2Rpb2hfaW5mbzsKLQotLyogcGxhdGZvcm0gc3BlY2lmaWMvaGlnaCBsZXZlbCBmdW5jdGlvbnMgKi8KLWV4dGVybiBpbnQgYnJjbWZfc2Rpb19mdW5jdGlvbl9pbml0KHZvaWQpOwotZXh0ZXJuIGludCBicmNtZl9zZGlvX3JlZ2lzdGVyKHN0cnVjdCBicmNtZl9zZGlvaF9kcml2ZXIgKmRyaXZlcik7Ci1leHRlcm4gdm9pZCBicmNtZl9zZGlvX3VucmVnaXN0ZXIodm9pZCk7Ci1leHRlcm4gdm9pZCBicmNtZl9zZGlvX2Z1bmN0aW9uX2NsZWFudXAodm9pZCk7Ci1leHRlcm4gaW50IGJyY21mX3NkaW9fcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KTsKLWV4dGVybiBpbnQgYnJjbWZfc2Rpb19yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KTsKLQotLyogRnVuY3Rpb24gdG8gcmV0dXJuIGN1cnJlbnQgd2luZG93IGFkZHIgKi8KLWV4dGVybiB1MzIgYnJjbWZfc2RjYXJkX2N1cl9zYndhZChzdHJ1Y3QgYnJjbWZfc2Rpb19jYXJkICpjYXJkKTsKLQotLyogQWxsb2NhdGUvaW5pdC9mcmVlIHBlci1PUyBwcml2YXRlIGRhdGEgKi8KLWV4dGVybiBpbnQgIGJyY21mX3NkaW9oX29zaW5pdChzdHJ1Y3Qgc2Rpb2hfaW5mbyAqc2QpOwotZXh0ZXJuIHZvaWQgYnJjbWZfc2Rpb2hfb3NmcmVlKHN0cnVjdCBzZGlvaF9pbmZvICpzZCk7Ci0KLS8qIENvcmUgaW50ZXJydXB0IGVuYWJsZS9kaXNhYmxlIG9mIGRldmljZSBpbnRlcnJ1cHRzICovCi1leHRlcm4gdm9pZCBicmNtZl9zZGlvaF9kZXZfaW50cl9vbihzdHJ1Y3Qgc2Rpb2hfaW5mbyAqc2QpOwotZXh0ZXJuIHZvaWQgYnJjbWZfc2Rpb2hfZGV2X2ludHJfb2ZmKHN0cnVjdCBzZGlvaF9pbmZvICpzZCk7Ci0KLS8qIGF0dGFjaCwgcmV0dXJuIGhhbmRsZXIgb24gc3VjY2VzcywgTlVMTCBpZiBmYWlsZWQuCi0gKiAgVGhlIGhhbmRsZXIgc2hhbGwgYmUgcHJvdmlkZWQgYnkgYWxsIHN1YnNlcXVlbnQgY2FsbHMuIE5vIGxvY2FsIGNhY2hlCi0gKiAgY2ZnaGRsIHBvaW50cyB0byB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiBwY2kgZGV2aWNlIG1hcHBlZCBtZW1vcnkKLSAqLwotZXh0ZXJuIHN0cnVjdCBzZGlvaF9pbmZvICpicmNtZl9zZGlvaF9hdHRhY2godm9pZCAqY2ZnaGRsLCB1aW50IGlycSk7Ci1leHRlcm4gaW50IGJyY21mX3NkaW9oX2RldGFjaChzdHJ1Y3Qgc2Rpb2hfaW5mbyAqc2kpOwotCi1leHRlcm4gaW50Ci1icmNtZl9zZGlvaF9pbnRlcnJ1cHRfcmVnaXN0ZXIoc3RydWN0IHNkaW9oX2luZm8gKnNpLAotCQkJICAgICAgIHZvaWQgKCpzZGlvaF9jYl9mbikodm9pZCAqKSwgdm9pZCAqYXJnaCk7Ci0KLWV4dGVybiBpbnQgYnJjbWZfc2Rpb2hfaW50ZXJydXB0X2RlcmVnaXN0ZXIoc3RydWN0IHNkaW9oX2luZm8gKnNpKTsKLQotLyogZW5hYmxlIG9yIGRpc2FibGUgU0QgaW50ZXJydXB0ICovCi1leHRlcm4gaW50Ci1icmNtZl9zZGlvaF9pbnRlcnJ1cHRfc2V0KHN0cnVjdCBzZGlvaF9pbmZvICpzaSwgYm9vbCBlbmFibGVfZGlzYWJsZSk7Ci0KLS8qIHJlYWQgb3Igd3JpdGUgb25lIGJ5dGUgdXNpbmcgY21kNTIgKi8KLWV4dGVybiBpbnQKLWJyY21mX3NkaW9oX3JlcXVlc3RfYnl0ZShzdHJ1Y3Qgc2Rpb2hfaW5mbyAqc2ksIHVpbnQgcncsIHVpbnQgZm5jLCB1aW50IGFkZHIsCi0JCQkgdTggKmJ5dGUpOwotCi0vKiByZWFkIG9yIHdyaXRlIDIvNCBieXRlcyB1c2luZyBjbWQ1MyAqLwotZXh0ZXJuIGludAotYnJjbWZfc2Rpb2hfcmVxdWVzdF93b3JkKHN0cnVjdCBzZGlvaF9pbmZvICpzaSwgdWludCBjbWRfdHlwZSwKLQkJCSB1aW50IHJ3LCB1aW50IGZuYywgdWludCBhZGRyLAotCQkJIHUzMiAqd29yZCwgdWludCBuYnl0ZSk7Ci0KLS8qIHJlYWQgb3Igd3JpdGUgYW55IGJ1ZmZlciB1c2luZyBjbWQ1MyAqLwotZXh0ZXJuIGludAotYnJjbWZfc2Rpb2hfcmVxdWVzdF9idWZmZXIoc3RydWN0IHNkaW9oX2luZm8gKnNpLCB1aW50IHBpb19kbWEsCi0JCQkgICB1aW50IGZpeF9pbmMsIHVpbnQgcncsIHVpbnQgZm5jX251bSwKLQkJCSAgIHUzMiBhZGRyLCB1aW50IHJlZ3dpZHRoLAotCQkJICAgdTMyIGJ1ZmxlbiwgdTggKmJ1ZmZlciwgc3RydWN0IHNrX2J1ZmYgKnBrdCk7Ci0KLS8qIGdldCBjaXMgZGF0YSAqLwotZXh0ZXJuIGludAotYnJjbWZfc2Rpb2hfY2lzX3JlYWQoc3RydWN0IHNkaW9oX2luZm8gKnNpLCB1aW50IGZ1YywgdTggKmNpcywgdTMyIGxlbmd0aCk7Ci0KLWV4dGVybiBpbnQKLWJyY21mX3NkaW9oX2NmZ19yZWFkKHN0cnVjdCBzZGlvaF9pbmZvICpzaSwgdWludCBmdWMsIHUzMiBhZGRyLCB1OCAqZGF0YSk7Ci1leHRlcm4gaW50Ci1icmNtZl9zZGlvaF9jZmdfd3JpdGUoc3RydWN0IHNkaW9oX2luZm8gKnNpLCB1aW50IGZ1YywgdTMyIGFkZHIsIHU4ICpkYXRhKTsKLQotLyogaGFuZGxlIGlvdmFycyAqLwotZXh0ZXJuIGludCBicmNtZl9zZGlvaF9pb3Zhcl9vcChzdHJ1Y3Qgc2Rpb2hfaW5mbyAqc2ksIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkgIHZvaWQgKnBhcmFtcywgaW50IHBsZW4sIHZvaWQgKmFyZywgaW50IGxlbiwgYm9vbCBzZXQpOwotCi0vKiBJc3N1ZSBhYm9ydCB0byB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGFuZCBjbGVhciBjb250cm9sbGVyIGFzIG5lZWRlZCAqLwotZXh0ZXJuIGludCBicmNtZl9zZGlvaF9hYm9ydChzdHJ1Y3Qgc2Rpb2hfaW5mbyAqc2ksIHVpbnQgZm5jKTsKLQotLyogV2F0Y2hkb2cgdGltZXIgaW50ZXJmYWNlIGZvciBwbSBvcHMgKi8KLWV4dGVybiB2b2lkIGJyY21mX3NkaW9fd2R0bXJfZW5hYmxlKGJvb2wgZW5hYmxlKTsKLQotZXh0ZXJuIHVpbnQgc2RfbXNnbGV2ZWw7CS8qIERlYnVnIG1lc3NhZ2UgbGV2ZWwgKi8KLQotZXh0ZXJuIHN0cnVjdCBicmNtZl9zZG1tY19pbnN0YW5jZSAqZ0luc3RhbmNlOwotCi0jZW5kaWYJCQkJLyogX0JSQ01fU0RIX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2NmZzgwMjExLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2NmZzgwMjExLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMTIwNmQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtZm1hYy93bF9jZmc4MDIxMS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDE1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgotI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2Z1bmMuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+Ci0jaW5jbHVkZSA8bmV0L3J0bmV0bGluay5oPgotCi0jaW5jbHVkZSA8YnJjbXVfdXRpbHMuaD4KLSNpbmNsdWRlIDxkZWZzLmg+Ci0jaW5jbHVkZSA8YnJjbXVfd2lmaS5oPgotI2luY2x1ZGUgImRoZC5oIgotI2luY2x1ZGUgIndsX2NmZzgwMjExLmgiCi0KLXN0YXRpYyBzdHJ1Y3Qgc2Rpb19mdW5jICpjZmc4MDIxMV9zZGlvX2Z1bmM7Ci1zdGF0aWMgc3RydWN0IGJyY21mX2NmZzgwMjExX2RldiAqY2ZnODAyMTFfZGV2Owotc3RhdGljIGNvbnN0IHU4IGV0aGVyX2JjYXN0W0VUSF9BTEVOXSA9IHsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1fTsKLQotdTMyIGJyY21mX2RiZ19sZXZlbCA9IFdMX0RCR19FUlI7Ci0KLS8qCi0qKiBjZmc4MDIxMV9vcHMgYXBpL2NhbGxiYWNrIGxpc3QKLSovCi1zdGF0aWMgczMyIGJyY21mX2NmZzgwMjExX2NoYW5nZV9pZmFjZShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCQkgICAgICAgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLCB1MzIgKmZsYWdzLAotCQkJCSAgICAgICBzdHJ1Y3QgdmlmX3BhcmFtcyAqcGFyYW1zKTsKLXN0YXRpYyBzMzIgX19icmNtZl9jZmc4MDIxMV9zY2FuKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCQkJCSBzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpyZXF1ZXN0LAotCQkJCSBzdHJ1Y3QgY2ZnODAyMTFfc3NpZCAqdGhpc19zc2lkKTsKLXN0YXRpYyBzMzIgYnJjbWZfY2ZnODAyMTFfc2NhbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpyZXF1ZXN0KTsKLXN0YXRpYyBzMzIgYnJjbWZfY2ZnODAyMTFfc2V0X3dpcGh5X3BhcmFtcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCB1MzIgY2hhbmdlZCk7Ci1zdGF0aWMgczMyIGJyY21mX2NmZzgwMjExX2pvaW5faWJzcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgY2ZnODAyMTFfaWJzc19wYXJhbXMgKnBhcmFtcyk7Ci1zdGF0aWMgczMyIGJyY21mX2NmZzgwMjExX2xlYXZlX2lic3Moc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHMzMiBicmNtZl9jZmc4MDIxMV9nZXRfc3RhdGlvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICptYWMsCi0JCQkJICAgICAgc3RydWN0IHN0YXRpb25faW5mbyAqc2luZm8pOwotc3RhdGljIHMzMiBicmNtZl9jZmc4MDIxMV9zZXRfcG93ZXJfbWdtdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYm9vbCBlbmFibGVkLAotCQkJCQkgczMyIHRpbWVvdXQpOwotc3RhdGljIHMzMiBicmNtZl9jZmc4MDIxMV9zZXRfYml0cmF0ZV9tYXNrKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCSAgIGNvbnN0IHU4ICphZGRyLAotCQkJCQkgICBjb25zdCBzdHJ1Y3QgY2ZnODAyMTFfYml0cmF0ZV9tYXNrCi0JCQkJCSAgICptYXNrKTsKLXN0YXRpYyBpbnQgYnJjbWZfY2ZnODAyMTFfY29ubmVjdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgc3RydWN0IGNmZzgwMjExX2Nvbm5lY3RfcGFyYW1zICpzbWUpOwotc3RhdGljIHMzMiBicmNtZl9jZmc4MDIxMV9kaXNjb25uZWN0KHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgICAgdTE2IHJlYXNvbl9jb2RlKTsKLXN0YXRpYyBzMzIgYnJjbWZfY2ZnODAyMTFfc2V0X3R4X3Bvd2VyKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJICAgICAgZW51bSBubDgwMjExX3R4X3Bvd2VyX3NldHRpbmcgdHlwZSwKLQkJCQkgICAgICBzMzIgZGJtKTsKLXN0YXRpYyBzMzIgYnJjbWZfY2ZnODAyMTFfZ2V0X3R4X3Bvd2VyKHN0cnVjdCB3aXBoeSAqd2lwaHksIHMzMiAqZGJtKTsKLXN0YXRpYyBzMzIgYnJjbWZfY2ZnODAyMTFfY29uZmlnX2RlZmF1bHRfa2V5KHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTgga2V5X2lkeCwKLQkJCQkJICBib29sIHVuaWNhc3QsIGJvb2wgbXVsdGljYXN0KTsKLXN0YXRpYyBzMzIgYnJjbWZfY2ZnODAyMTFfYWRkX2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSB1OCBrZXlfaWR4LCBib29sIHBhaXJ3aXNlLCBjb25zdCB1OCAqbWFjX2FkZHIsCi0JCQkJIHN0cnVjdCBrZXlfcGFyYW1zICpwYXJhbXMpOwotc3RhdGljIHMzMiBicmNtZl9jZmc4MDIxMV9kZWxfa2V5KHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJIHU4IGtleV9pZHgsIGJvb2wgcGFpcndpc2UsIGNvbnN0IHU4ICptYWNfYWRkcik7Ci1zdGF0aWMgczMyIGJyY21mX2NmZzgwMjExX2dldF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgdTgga2V5X2lkeCwgYm9vbCBwYWlyd2lzZSwgY29uc3QgdTggKm1hY19hZGRyLAotCQkJCSB2b2lkICpjb29raWUsIHZvaWQgKCpjYWxsYmFjaykgKHZvaWQgKmNvb2tpZSwKLQkJCQkJCQkJIHN0cnVjdAotCQkJCQkJCQkga2V5X3BhcmFtcyAqCi0JCQkJCQkJCSBwYXJhbXMpKTsKLXN0YXRpYyBzMzIgYnJjbWZfY2ZnODAyMTFfY29uZmlnX2RlZmF1bHRfbWdtdF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkJIHU4IGtleV9pZHgpOwotc3RhdGljIHMzMiBicmNtZl9jZmc4MDIxMV9yZXN1bWUoc3RydWN0IHdpcGh5ICp3aXBoeSk7Ci1zdGF0aWMgczMyIGJyY21mX2NmZzgwMjExX3N1c3BlbmQoc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkgc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293KTsKLXN0YXRpYyBzMzIgYnJjbWZfY2ZnODAyMTFfc2V0X3Bta3NhKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICAgc3RydWN0IGNmZzgwMjExX3Bta3NhICpwbWtzYSk7Ci1zdGF0aWMgczMyIGJyY21mX2NmZzgwMjExX2RlbF9wbWtzYShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgIHN0cnVjdCBjZmc4MDIxMV9wbWtzYSAqcG1rc2EpOwotc3RhdGljIHMzMiBicmNtZl9jZmc4MDIxMV9mbHVzaF9wbWtzYShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci0vKgotKiogZXZlbnQgJiBldmVudCBRIGhhbmRsZXJzIGZvciBjZmc4MDIxMSBpbnRlcmZhY2VzCi0qLwotc3RhdGljIHMzMiBicmNtZl9jcmVhdGVfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpOwotc3RhdGljIHZvaWQgYnJjbWZfZGVzdHJveV9ldmVudF9oYW5kbGVyKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdik7Ci1zdGF0aWMgczMyIGJyY21mX2V2ZW50X2hhbmRsZXIodm9pZCAqZGF0YSk7Ci1zdGF0aWMgdm9pZCBicmNtZl9pbml0X2VxKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdik7Ci1zdGF0aWMgdm9pZCBicmNtZl9mbHVzaF9lcShzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpOwotc3RhdGljIHZvaWQgYnJjbWZfbG9ja19lcShzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpOwotc3RhdGljIHZvaWQgYnJjbWZfdW5sb2NrX2VxKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdik7Ci1zdGF0aWMgdm9pZCBicmNtZl9pbml0X2VxX2xvY2soc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2KTsKLXN0YXRpYyB2b2lkIGJyY21mX2luaXRfZWxvb3BfaGFuZGxlcihzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfZXZlbnRfbG9vcCAqZWwpOwotc3RhdGljIHN0cnVjdCBicmNtZl9jZmc4MDIxMV9ldmVudF9xICoKLWJyY21mX2RlcV9ldmVudChzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpOwotc3RhdGljIHMzMiBicmNtZl9lbnFfZXZlbnQoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2LCB1MzIgdHlwZSwKLQkJCSAgY29uc3Qgc3RydWN0IGJyY21mX2V2ZW50X21zZyAqbXNnLCB2b2lkICpkYXRhKTsKLXN0YXRpYyB2b2lkIGJyY21mX3B1dF9ldmVudChzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfZXZlbnRfcSAqZSk7Ci1zdGF0aWMgdm9pZCBicmNtZl93YWtldXBfZXZlbnQoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2KTsKLXN0YXRpYyBzMzIgYnJjbWZfbm90aWZ5X2Nvbm5lY3Rfc3RhdHVzKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiwKLQkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JCQkJICAgICAgIGNvbnN0IHN0cnVjdCBicmNtZl9ldmVudF9tc2cgKmUsCi0JCQkJICAgICAgIHZvaWQgKmRhdGEpOwotc3RhdGljIHMzMiBicmNtZl9ub3RpZnlfcm9hbWluZ19zdGF0dXMoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2LAotCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCQkgICAgICAgY29uc3Qgc3RydWN0IGJyY21mX2V2ZW50X21zZyAqZSwKLQkJCQkgICAgICAgdm9pZCAqZGF0YSk7Ci1zdGF0aWMgczMyIGJyY21mX25vdGlmeV9zY2FuX3N0YXR1cyhzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYsCi0JCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgYnJjbWZfZXZlbnRfbXNnICplLAotCQkJCSAgICB2b2lkICpkYXRhKTsKLXN0YXRpYyBzMzIgYnJjbWZfYnNzX2Nvbm5lY3RfZG9uZShzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYsCi0JCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCQkgIGNvbnN0IHN0cnVjdCBicmNtZl9ldmVudF9tc2cgKmUsIHZvaWQgKmRhdGEsCi0JCQkJICBib29sIGNvbXBsZXRlZCk7Ci1zdGF0aWMgczMyIGJyY21mX2Jzc19yb2FtaW5nX2RvbmUoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2LAotCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JCQkJICBjb25zdCBzdHJ1Y3QgYnJjbWZfZXZlbnRfbXNnICplLCB2b2lkICpkYXRhKTsKLXN0YXRpYyBzMzIgYnJjbWZfbm90aWZ5X21pY19zdGF0dXMoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2LAotCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCQkJCSAgIGNvbnN0IHN0cnVjdCBicmNtZl9ldmVudF9tc2cgKmUsIHZvaWQgKmRhdGEpOwotCi0vKgotKiogcmVnaXN0ZXIvZGVyZWdpc3RlciBzZGlvIGZ1bmN0aW9uCi0qLwotc3RhdGljIHZvaWQgYnJjbWZfY2xlYXJfc2Rpb19mdW5jKHZvaWQpOwotCi0vKgotKiogaW9jdGwgdXRpbGl0ZXMKLSovCi1zdGF0aWMgczMyIGJyY21mX2Rldl9idWZ2YXJfZ2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHM4ICpuYW1lLCBzOCAqYnVmLAotCQkJICAgICAgIHMzMiBidWZfbGVuKTsKLXN0YXRpYyBfX3VzZWQgczMyIGJyY21mX2Rldl9idWZ2YXJfc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHM4ICpuYW1lLAotCQkJCSAgICAgIHM4ICpidWYsIHMzMiBsZW4pOwotc3RhdGljIHMzMiBicmNtZl9kZXZfaW50dmFyX3NldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzOCAqbmFtZSwgczMyIHZhbCk7Ci1zdGF0aWMgczMyIGJyY21mX2Rldl9pbnR2YXJfZ2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHM4ICpuYW1lLAotCQkJICAgICAgIHMzMiAqcmV0dmFsKTsKLXN0YXRpYyBzMzIgYnJjbWZfZGV2X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBjbWQsIHZvaWQgKmFyZywKLQkJCSAgdTMyIGxlbik7Ci0KLS8qCi0qKiBjZmc4MDIxMSBzZXRfd2lwaHlfcGFyYW1zIHV0aWxpdGllcwotKi8KLXN0YXRpYyBzMzIgYnJjbWZfc2V0X2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZyYWdfdGhyZXNob2xkKTsKLXN0YXRpYyBzMzIgYnJjbWZfc2V0X3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZnJhZ190aHJlc2hvbGQpOwotc3RhdGljIHMzMiBicmNtZl9zZXRfcmV0cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHJldHJ5LCBib29sIGwpOwotCi0vKgotKiogd2wgcHJvZmlsZSB1dGlsaXRpZXMKLSovCi1zdGF0aWMgczMyIGJyY21mX3VwZGF0ZV9wcm9mKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiwKLQkJCSAgICAgY29uc3Qgc3RydWN0IGJyY21mX2V2ZW50X21zZyAqZSwKLQkJCSAgICAgdm9pZCAqZGF0YSwgczMyIGl0ZW0pOwotc3RhdGljIHZvaWQgKmJyY21mX3JlYWRfcHJvZihzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYsIHMzMiBpdGVtKTsKLXN0YXRpYyB2b2lkIGJyY21mX2luaXRfcHJvZihzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJvZmlsZSAqcHJvZik7Ci0KLS8qCi0qKiBjZmc4MDIxMSBjb25uZWN0IHV0aWxpdGVzCi0qLwotc3RhdGljIHMzMiBicmNtZl9zZXRfd3BhX3ZlcnNpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBjZmc4MDIxMV9jb25uZWN0X3BhcmFtcyAqc21lKTsKLXN0YXRpYyBzMzIgYnJjbWZfc2V0X2F1dGhfdHlwZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJc3RydWN0IGNmZzgwMjExX2Nvbm5lY3RfcGFyYW1zICpzbWUpOwotc3RhdGljIHMzMiBicmNtZl9zZXRfc2V0X2NpcGhlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJc3RydWN0IGNmZzgwMjExX2Nvbm5lY3RfcGFyYW1zICpzbWUpOwotc3RhdGljIHMzMiBicmNtZl9zZXRfa2V5X21nbXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBjZmc4MDIxMV9jb25uZWN0X3BhcmFtcyAqc21lKTsKLXN0YXRpYyBzMzIgYnJjbWZfc2V0X3NldF9zaGFyZWRrZXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCXN0cnVjdCBjZmc4MDIxMV9jb25uZWN0X3BhcmFtcyAqc21lKTsKLXN0YXRpYyBzMzIgYnJjbWZfZ2V0X2Fzc29jX2llcyhzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpOwotc3RhdGljIHZvaWQgYnJjbWZfY2xlYXJfYXNzb2NfaWVzKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdik7Ci1zdGF0aWMgdm9pZCBicmNtZl9jaF90b19jaGFuc3BlYyhpbnQgY2gsCi0Jc3RydWN0IGJyY21mX2pvaW5fcGFyYW1zICpqb2luX3BhcmFtcywgc2l6ZV90ICpqb2luX3BhcmFtc19zaXplKTsKLQotLyoKLSoqIGluZm9ybWF0aW9uIGVsZW1lbnQgdXRpbGl0aWVzCi0qLwotc3RhdGljIF9fdXNlZCBzMzIgYnJjbWZfYWRkX2llKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiwKLQkJCSAgICAgICB1OCB0LCB1OCBsLCB1OCAqdik7Ci1zdGF0aWMgczMyIGJyY21mX21vZGVfdG9fbmw4MDIxMV9pZnR5cGUoczMyIG1vZGUpOwotc3RhdGljIHN0cnVjdCB3aXJlbGVzc19kZXYgKmJyY21mX2FsbG9jX3dkZXYoczMyIHNpemVvZl9pZmFjZSwKLQkJCXN0cnVjdCBkZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBicmNtZl9mcmVlX3dkZXYoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2KTsKLXN0YXRpYyBzMzIgYnJjbWZfaW5mb3JtX2JzcyhzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpOwotc3RhdGljIHMzMiBicmNtZl9pbmZvcm1fc2luZ2xlX2JzcyhzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYsCi0JCQkJICAgc3RydWN0IGJyY21mX2Jzc19pbmZvICpiaSk7Ci1zdGF0aWMgczMyIGJyY21mX3VwZGF0ZV9ic3NfaW5mbyhzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpOwotc3RhdGljIHMzMiBicmNtZl9hZGRfa2V5ZXh0KHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQl1OCBrZXlfaWR4LCBjb25zdCB1OCAqbWFjX2FkZHIsCi0JCQlzdHJ1Y3Qga2V5X3BhcmFtcyAqcGFyYW1zKTsKLQotLyoKLSoqIGtleSBpbmRpYW5lc3Mgc3dhcCB1dGlsaXRpZXMKLSovCi1zdGF0aWMgdm9pZCBzd2FwX2tleV9mcm9tX0JFKHN0cnVjdCBicmNtZl93c2VjX2tleSAqa2V5KTsKLXN0YXRpYyB2b2lkIHN3YXBfa2V5X3RvX0JFKHN0cnVjdCBicmNtZl93c2VjX2tleSAqa2V5KTsKLQotLyoKLSoqIGJyY21mX2NmZzgwMjExX3ByaXYgbWVtb3J5IGluaXQvZGVpbml0IHV0aWxpdGllcwotKi8KLXN0YXRpYyBzMzIgYnJjbWZfaW5pdF9wcml2X21lbShzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpOwotc3RhdGljIHZvaWQgYnJjbWZfZGVpbml0X3ByaXZfbWVtKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdik7Ci0KLXN0YXRpYyB2b2lkIGJyY21mX2RlbGF5KHUzMiBtcyk7Ci0KLS8qCi0qKiBzdG9yZS9yZXN0b3JlIGNmZzgwMjExIGluc3RhbmNlIGRhdGEKLSovCi1zdGF0aWMgdm9pZCBicmNtZl9zZXRfZHJ2ZGF0YShzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfZGV2ICpkZXYsIHZvaWQgKmRhdGEpOwotc3RhdGljIHZvaWQgKmJyY21mX2dldF9kcnZkYXRhKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9kZXYgKmRldik7Ci0KLS8qCi0qKiBpYnNzIG1vZGUgdXRpbGl0aWVzCi0qLwotc3RhdGljIGJvb2wgYnJjbWZfaXNfaWJzc21vZGUoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2KTsKLQotLyoKLSoqIGRvbmdsZSB1cC9kb3duICwgZGVmYXVsdCBjb25maWd1cmF0aW9uIHV0aWxpdGllcwotKi8KLXN0YXRpYyBib29sIGJyY21mX2lzX2xpbmtkb3duKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBicmNtZl9ldmVudF9tc2cgKmUpOwotc3RhdGljIGJvb2wgYnJjbWZfaXNfbGlua3VwKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgYnJjbWZfZXZlbnRfbXNnICplKTsKLXN0YXRpYyBib29sIGJyY21mX2lzX25vbmV0d29yayhzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGJyY21mX2V2ZW50X21zZyAqZSk7Ci1zdGF0aWMgdm9pZCBicmNtZl9saW5rX2Rvd24oc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2KTsKLXN0YXRpYyBzMzIgYnJjbWZfZG9uZ2xlX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHMzMiBpZnR5cGUpOwotc3RhdGljIHMzMiBfX2JyY21mX2NmZzgwMjExX3VwKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdik7Ci1zdGF0aWMgczMyIF9fYnJjbWZfY2ZnODAyMTFfZG93bihzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpOwotc3RhdGljIHMzMiBicmNtZl9kb25nbGVfcHJvYmVjYXAoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2KTsKLXN0YXRpYyB2b2lkIGJyY21mX2luaXRfY29uZihzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfY29uZiAqY29uZik7Ci0KLS8qCi0qKiBkb25nbGUgY29uZmlndXJhdGlvbiB1dGlsaXRpZXMKLSovCi1zdGF0aWMgczMyIGJyY21mX2RvbmdsZV9ldmVudG1zZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldik7Ci1zdGF0aWMgczMyIGJyY21mX2RvbmdsZV9zY2FudGltZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgczMyIHNjYW5fYXNzb2NfdGltZSwKLQkJCQkgczMyIHNjYW5fdW5hc3NvY190aW1lLCBzMzIgc2Nhbl9wYXNzaXZlX3RpbWUpOwotc3RhdGljIHMzMiBicmNtZl9jb25maWdfZG9uZ2xlKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiwKLQkJCSAgICAgICBib29sIG5lZWRfbG9jayk7Ci1zdGF0aWMgczMyIGJyY21mX2RvbmdsZV9yb2FtKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB1MzIgcm9hbXZhciwKLQkJCSAgICB1MzIgYmNuX3RpbWVvdXQpOwotCi0vKgotKiogaXNjYW4gaGFuZGxlcgotKi8KLXN0YXRpYyB2b2lkIGJyY21mX2lzY2FuX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBicmNtZl90ZXJtX2lzY2FuKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdik7Ci1zdGF0aWMgczMyIGJyY21mX2luaXRfaXNjYW4oc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2KTsKLXN0YXRpYyBzMzIgYnJjbWZfaXNjYW5fdGhyZWFkKHZvaWQgKmRhdGEpOwotc3RhdGljIHMzMiBicmNtZl9kZXZfaW92YXJfc2V0YnVmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHM4ICppb3ZhciwKLQkJCQkgdm9pZCAqcGFyYW0sIHMzMiBwYXJhbWxlbiwgdm9pZCAqYnVmcHRyLAotCQkJCSBzMzIgYnVmbGVuKTsKLXN0YXRpYyBzMzIgYnJjbWZfZGV2X2lvdmFyX2dldGJ1ZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzOCAqaW92YXIsCi0JCQkJIHZvaWQgKnBhcmFtLCBzMzIgcGFyYW1sZW4sIHZvaWQgKmJ1ZnB0ciwKLQkJCQkgczMyIGJ1Zmxlbik7Ci1zdGF0aWMgczMyIGJyY21mX3J1bl9pc2NhbihzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfaXNjYW5fY3RybCAqaXNjYW4sCi0JCQkgICBzdHJ1Y3QgYnJjbWZfc3NpZCAqc3NpZCwgdTE2IGFjdGlvbik7Ci1zdGF0aWMgczMyIGJyY21mX2RvX2lzY2FuKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdik7Ci1zdGF0aWMgczMyIGJyY21mX3dha2V1cF9pc2NhbihzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfaXNjYW5fY3RybCAqaXNjYW4pOwotc3RhdGljIHMzMiBicmNtZl9pbnZva2VfaXNjYW4oc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2KTsKLXN0YXRpYyBzMzIgYnJjbWZfZ2V0X2lzY2FuX3Jlc3VsdHMoc3RydWN0IGJyY21mX2NmZzgwMjExX2lzY2FuX2N0cmwgKmlzY2FuLAotCQkJCSAgIHUzMiAqc3RhdHVzLAotCQkJCSAgIHN0cnVjdCBicmNtZl9zY2FuX3Jlc3VsdHMgKipic3NfbGlzdCk7Ci1zdGF0aWMgdm9pZCBicmNtZl9ub3RpZnlfaXNjYW5fY29tcGxldGUoc3RydWN0IGJyY21mX2NmZzgwMjExX2lzY2FuX2N0cmwgKmlzY2FuLAotCQkJCQlib29sIGFib3J0ZWQpOwotc3RhdGljIHZvaWQgYnJjbWZfaW5pdF9pc2Nhbl9lbG9vcChzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfaXNjYW5fZWxvb3AgKmVsKTsKLXN0YXRpYyBzMzIgYnJjbWZfaXNjYW5fZG9uZShzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpOwotc3RhdGljIHMzMiBicmNtZl9pc2Nhbl9wZW5kaW5nKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdik7Ci1zdGF0aWMgczMyIGJyY21mX2lzY2FuX2lucHJvZ3Jlc3Moc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2KTsKLXN0YXRpYyBzMzIgYnJjbWZfaXNjYW5fYWJvcnRlZChzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpOwotCi0vKgotKiBmaW5kIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHNldAotKi8KLXN0YXRpYyBfX3VzZWQgdTMyIGJyY21mX2ZpbmRfbXNiKHUxNiBiaXQxNik7Ci0KLS8qCi0qIHVwZGF0ZSBwbWtsaXN0IHRvIGRvbmdsZQotKi8KLXN0YXRpYyBfX3VzZWQgczMyIGJyY21mX3VwZGF0ZV9wbWtsaXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJICAgICAgIHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wbWtfbGlzdCAqcG1rX2xpc3QsCi0JCQkJICAgICAgIHMzMiBlcnIpOwotCi1zdGF0aWMgdm9pZCBicmNtZl9zZXRfbXBjKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBpbnQgbXBjKTsKLQotLyoKLSogZGVidWZzIHN1cHBvcnQKLSovCi1zdGF0aWMgaW50Ci1icmNtZl9kZWJ1Z2ZzX2FkZF9uZXRkZXZfcGFyYW1zKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdik7Ci1zdGF0aWMgdm9pZCBicmNtZl9kZWJ1Z2ZzX3JlbW92ZV9uZXRkZXYoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2KTsKLQotI2RlZmluZSBXTF9QUklWX0dFVCgpCQkJCQkJCVwKLQkoewkJCQkJCQkJXAotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9pZmFjZSAqY2kgPSBicmNtZl9nZXRfZHJ2ZGF0YShjZmc4MDIxMV9kZXYpOyBcCi0JaWYgKHVubGlrZWx5KCFjaSkpIHsJCQkJCQlcCi0JCVdMX0VSUigid2xfY2ZnODAyMTFfZGV2IGlzIHVuYXZhaWxhYmxlXG4iKTsJCVwKLQkJQlVHKCk7CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JY2ktPmNmZ19wcml2OwkJCQkJCQlcCi19KQotCi0jZGVmaW5lIENIRUNLX1NZU19VUCgpCQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0Jc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2ID0gd2lwaHlfdG9fY2ZnKHdpcGh5KTsJXAotCWlmICh1bmxpa2VseSghdGVzdF9iaXQoV0xfU1RBVFVTX1JFQURZLCAmY2ZnX3ByaXYtPnN0YXR1cykpKSB7CVwKLQkJV0xfSU5GTygiZGV2aWNlIGlzIG5vdCByZWFkeSA6IHN0YXR1cyAoJWQpXG4iLAkJXAotCQkJKGludCljZmdfcHJpdi0+c3RhdHVzKTsJCQkJXAotCQlyZXR1cm4gLUVJTzsJCQkJCQlcCi0JfQkJCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBDSEFOMkcoX2NoYW5uZWwsIF9mcmVxLCBfZmxhZ3MpIHsJCQlcCi0JLmJhbmQJCQk9IElFRUU4MDIxMV9CQU5EXzJHSFosCQlcCi0JLmNlbnRlcl9mcmVxCQk9IChfZnJlcSksCQkJXAotCS5od192YWx1ZQkJPSAoX2NoYW5uZWwpLAkJCVwKLQkuZmxhZ3MJCQk9IChfZmxhZ3MpLAkJCVwKLQkubWF4X2FudGVubmFfZ2Fpbgk9IDAsCQkJCVwKLQkubWF4X3Bvd2VyCQk9IDMwLAkJCQlcCi19Ci0KLSNkZWZpbmUgQ0hBTjVHKF9jaGFubmVsLCBfZmxhZ3MpIHsJCQkJXAotCS5iYW5kCQkJPSBJRUVFODAyMTFfQkFORF81R0haLAkJXAotCS5jZW50ZXJfZnJlcQkJPSA1MDAwICsgKDUgKiAoX2NoYW5uZWwpKSwJXAotCS5od192YWx1ZQkJPSAoX2NoYW5uZWwpLAkJCVwKLQkuZmxhZ3MJCQk9IChfZmxhZ3MpLAkJCVwKLQkubWF4X2FudGVubmFfZ2Fpbgk9IDAsCQkJCVwKLQkubWF4X3Bvd2VyCQk9IDMwLAkJCQlcCi19Ci0KLSNkZWZpbmUgUkFURV9UT19CQVNFMTAwS0JQUyhyYXRlKSAgICgoKHJhdGUpICogMTApIC8gMikKLSNkZWZpbmUgUkFURVRBQl9FTlQoX3JhdGVpZCwgX2ZsYWdzKSBcCi0JeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJLmJpdHJhdGUgICAgICAgID0gUkFURV9UT19CQVNFMTAwS0JQUyhfcmF0ZWlkKSwgICAgIFwKLQkJLmh3X3ZhbHVlICAgICAgID0gKF9yYXRlaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCS5mbGFncyAgICAgICAgICA9IChfZmxhZ3MpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCX0KLQotc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfcmF0ZSBfX3dsX3JhdGVzW10gPSB7Ci0JUkFURVRBQl9FTlQoQlJDTV9SQVRFXzFNLCAwKSwKLQlSQVRFVEFCX0VOVChCUkNNX1JBVEVfMk0sIElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFKSwKLQlSQVRFVEFCX0VOVChCUkNNX1JBVEVfNU01LCBJRUVFODAyMTFfUkFURV9TSE9SVF9QUkVBTUJMRSksCi0JUkFURVRBQl9FTlQoQlJDTV9SQVRFXzExTSwgSUVFRTgwMjExX1JBVEVfU0hPUlRfUFJFQU1CTEUpLAotCVJBVEVUQUJfRU5UKEJSQ01fUkFURV82TSwgMCksCi0JUkFURVRBQl9FTlQoQlJDTV9SQVRFXzlNLCAwKSwKLQlSQVRFVEFCX0VOVChCUkNNX1JBVEVfMTJNLCAwKSwKLQlSQVRFVEFCX0VOVChCUkNNX1JBVEVfMThNLCAwKSwKLQlSQVRFVEFCX0VOVChCUkNNX1JBVEVfMjRNLCAwKSwKLQlSQVRFVEFCX0VOVChCUkNNX1JBVEVfMzZNLCAwKSwKLQlSQVRFVEFCX0VOVChCUkNNX1JBVEVfNDhNLCAwKSwKLQlSQVRFVEFCX0VOVChCUkNNX1JBVEVfNTRNLCAwKSwKLX07Ci0KLSNkZWZpbmUgd2xfYV9yYXRlcwkJKF9fd2xfcmF0ZXMgKyA0KQotI2RlZmluZSB3bF9hX3JhdGVzX3NpemUJOAotI2RlZmluZSB3bF9nX3JhdGVzCQkoX193bF9yYXRlcyArIDApCi0jZGVmaW5lIHdsX2dfcmF0ZXNfc2l6ZQkxMgotCi1zdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIF9fd2xfMmdoel9jaGFubmVsc1tdID0gewotCUNIQU4yRygxLCAyNDEyLCAwKSwKLQlDSEFOMkcoMiwgMjQxNywgMCksCi0JQ0hBTjJHKDMsIDI0MjIsIDApLAotCUNIQU4yRyg0LCAyNDI3LCAwKSwKLQlDSEFOMkcoNSwgMjQzMiwgMCksCi0JQ0hBTjJHKDYsIDI0MzcsIDApLAotCUNIQU4yRyg3LCAyNDQyLCAwKSwKLQlDSEFOMkcoOCwgMjQ0NywgMCksCi0JQ0hBTjJHKDksIDI0NTIsIDApLAotCUNIQU4yRygxMCwgMjQ1NywgMCksCi0JQ0hBTjJHKDExLCAyNDYyLCAwKSwKLQlDSEFOMkcoMTIsIDI0NjcsIDApLAotCUNIQU4yRygxMywgMjQ3MiwgMCksCi0JQ0hBTjJHKDE0LCAyNDg0LCAwKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgX193bF81Z2h6X2FfY2hhbm5lbHNbXSA9IHsKLQlDSEFONUcoMzQsIDApLCBDSEFONUcoMzYsIDApLAotCUNIQU41RygzOCwgMCksIENIQU41Ryg0MCwgMCksCi0JQ0hBTjVHKDQyLCAwKSwgQ0hBTjVHKDQ0LCAwKSwKLQlDSEFONUcoNDYsIDApLCBDSEFONUcoNDgsIDApLAotCUNIQU41Ryg1MiwgMCksIENIQU41Ryg1NiwgMCksCi0JQ0hBTjVHKDYwLCAwKSwgQ0hBTjVHKDY0LCAwKSwKLQlDSEFONUcoMTAwLCAwKSwgQ0hBTjVHKDEwNCwgMCksCi0JQ0hBTjVHKDEwOCwgMCksIENIQU41RygxMTIsIDApLAotCUNIQU41RygxMTYsIDApLCBDSEFONUcoMTIwLCAwKSwKLQlDSEFONUcoMTI0LCAwKSwgQ0hBTjVHKDEyOCwgMCksCi0JQ0hBTjVHKDEzMiwgMCksIENIQU41RygxMzYsIDApLAotCUNIQU41RygxNDAsIDApLCBDSEFONUcoMTQ5LCAwKSwKLQlDSEFONUcoMTUzLCAwKSwgQ0hBTjVHKDE1NywgMCksCi0JQ0hBTjVHKDE2MSwgMCksIENIQU41RygxNjUsIDApLAotCUNIQU41RygxODQsIDApLCBDSEFONUcoMTg4LCAwKSwKLQlDSEFONUcoMTkyLCAwKSwgQ0hBTjVHKDE5NiwgMCksCi0JQ0hBTjVHKDIwMCwgMCksIENIQU41RygyMDQsIDApLAotCUNIQU41RygyMDgsIDApLCBDSEFONUcoMjEyLCAwKSwKLQlDSEFONUcoMjE2LCAwKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgX193bF81Z2h6X25fY2hhbm5lbHNbXSA9IHsKLQlDSEFONUcoMzIsIDApLCBDSEFONUcoMzQsIDApLAotCUNIQU41RygzNiwgMCksIENIQU41RygzOCwgMCksCi0JQ0hBTjVHKDQwLCAwKSwgQ0hBTjVHKDQyLCAwKSwKLQlDSEFONUcoNDQsIDApLCBDSEFONUcoNDYsIDApLAotCUNIQU41Ryg0OCwgMCksIENIQU41Ryg1MCwgMCksCi0JQ0hBTjVHKDUyLCAwKSwgQ0hBTjVHKDU0LCAwKSwKLQlDSEFONUcoNTYsIDApLCBDSEFONUcoNTgsIDApLAotCUNIQU41Ryg2MCwgMCksIENIQU41Ryg2MiwgMCksCi0JQ0hBTjVHKDY0LCAwKSwgQ0hBTjVHKDY2LCAwKSwKLQlDSEFONUcoNjgsIDApLCBDSEFONUcoNzAsIDApLAotCUNIQU41Ryg3MiwgMCksIENIQU41Ryg3NCwgMCksCi0JQ0hBTjVHKDc2LCAwKSwgQ0hBTjVHKDc4LCAwKSwKLQlDSEFONUcoODAsIDApLCBDSEFONUcoODIsIDApLAotCUNIQU41Ryg4NCwgMCksIENIQU41Ryg4NiwgMCksCi0JQ0hBTjVHKDg4LCAwKSwgQ0hBTjVHKDkwLCAwKSwKLQlDSEFONUcoOTIsIDApLCBDSEFONUcoOTQsIDApLAotCUNIQU41Ryg5NiwgMCksIENIQU41Ryg5OCwgMCksCi0JQ0hBTjVHKDEwMCwgMCksIENIQU41RygxMDIsIDApLAotCUNIQU41RygxMDQsIDApLCBDSEFONUcoMTA2LCAwKSwKLQlDSEFONUcoMTA4LCAwKSwgQ0hBTjVHKDExMCwgMCksCi0JQ0hBTjVHKDExMiwgMCksIENIQU41RygxMTQsIDApLAotCUNIQU41RygxMTYsIDApLCBDSEFONUcoMTE4LCAwKSwKLQlDSEFONUcoMTIwLCAwKSwgQ0hBTjVHKDEyMiwgMCksCi0JQ0hBTjVHKDEyNCwgMCksIENIQU41RygxMjYsIDApLAotCUNIQU41RygxMjgsIDApLCBDSEFONUcoMTMwLCAwKSwKLQlDSEFONUcoMTMyLCAwKSwgQ0hBTjVHKDEzNCwgMCksCi0JQ0hBTjVHKDEzNiwgMCksIENIQU41RygxMzgsIDApLAotCUNIQU41RygxNDAsIDApLCBDSEFONUcoMTQyLCAwKSwKLQlDSEFONUcoMTQ0LCAwKSwgQ0hBTjVHKDE0NSwgMCksCi0JQ0hBTjVHKDE0NiwgMCksIENIQU41RygxNDcsIDApLAotCUNIQU41RygxNDgsIDApLCBDSEFONUcoMTQ5LCAwKSwKLQlDSEFONUcoMTUwLCAwKSwgQ0hBTjVHKDE1MSwgMCksCi0JQ0hBTjVHKDE1MiwgMCksIENIQU41RygxNTMsIDApLAotCUNIQU41RygxNTQsIDApLCBDSEFONUcoMTU1LCAwKSwKLQlDSEFONUcoMTU2LCAwKSwgQ0hBTjVHKDE1NywgMCksCi0JQ0hBTjVHKDE1OCwgMCksIENIQU41RygxNTksIDApLAotCUNIQU41RygxNjAsIDApLCBDSEFONUcoMTYxLCAwKSwKLQlDSEFONUcoMTYyLCAwKSwgQ0hBTjVHKDE2MywgMCksCi0JQ0hBTjVHKDE2NCwgMCksIENIQU41RygxNjUsIDApLAotCUNIQU41RygxNjYsIDApLCBDSEFONUcoMTY4LCAwKSwKLQlDSEFONUcoMTcwLCAwKSwgQ0hBTjVHKDE3MiwgMCksCi0JQ0hBTjVHKDE3NCwgMCksIENIQU41RygxNzYsIDApLAotCUNIQU41RygxNzgsIDApLCBDSEFONUcoMTgwLCAwKSwKLQlDSEFONUcoMTgyLCAwKSwgQ0hBTjVHKDE4NCwgMCksCi0JQ0hBTjVHKDE4NiwgMCksIENIQU41RygxODgsIDApLAotCUNIQU41RygxOTAsIDApLCBDSEFONUcoMTkyLCAwKSwKLQlDSEFONUcoMTk0LCAwKSwgQ0hBTjVHKDE5NiwgMCksCi0JQ0hBTjVHKDE5OCwgMCksIENIQU41RygyMDAsIDApLAotCUNIQU41RygyMDIsIDApLCBDSEFONUcoMjA0LCAwKSwKLQlDSEFONUcoMjA2LCAwKSwgQ0hBTjVHKDIwOCwgMCksCi0JQ0hBTjVHKDIxMCwgMCksIENIQU41RygyMTIsIDApLAotCUNIQU41RygyMTQsIDApLCBDSEFONUcoMjE2LCAwKSwKLQlDSEFONUcoMjE4LCAwKSwgQ0hBTjVHKDIyMCwgMCksCi0JQ0hBTjVHKDIyMiwgMCksIENIQU41RygyMjQsIDApLAotCUNIQU41RygyMjYsIDApLCBDSEFONUcoMjI4LCAwKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kIF9fd2xfYmFuZF8yZ2h6ID0gewotCS5iYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWiwKLQkuY2hhbm5lbHMgPSBfX3dsXzJnaHpfY2hhbm5lbHMsCi0JLm5fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKF9fd2xfMmdoel9jaGFubmVscyksCi0JLmJpdHJhdGVzID0gd2xfZ19yYXRlcywKLQkubl9iaXRyYXRlcyA9IHdsX2dfcmF0ZXNfc2l6ZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kIF9fd2xfYmFuZF81Z2h6X2EgPSB7Ci0JLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haLAotCS5jaGFubmVscyA9IF9fd2xfNWdoel9hX2NoYW5uZWxzLAotCS5uX2NoYW5uZWxzID0gQVJSQVlfU0laRShfX3dsXzVnaHpfYV9jaGFubmVscyksCi0JLmJpdHJhdGVzID0gd2xfYV9yYXRlcywKLQkubl9iaXRyYXRlcyA9IHdsX2FfcmF0ZXNfc2l6ZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kIF9fd2xfYmFuZF81Z2h6X24gPSB7Ci0JLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haLAotCS5jaGFubmVscyA9IF9fd2xfNWdoel9uX2NoYW5uZWxzLAotCS5uX2NoYW5uZWxzID0gQVJSQVlfU0laRShfX3dsXzVnaHpfbl9jaGFubmVscyksCi0JLmJpdHJhdGVzID0gd2xfYV9yYXRlcywKLQkubl9iaXRyYXRlcyA9IHdsX2FfcmF0ZXNfc2l6ZSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1MzIgX193bF9jaXBoZXJfc3VpdGVzW10gPSB7Ci0JV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAsCi0JV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0LAotCVdMQU5fQ0lQSEVSX1NVSVRFX1RLSVAsCi0JV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUCwKLQlXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQywKLX07Ci0KLXN0YXRpYyB2b2lkIHN3YXBfa2V5X2Zyb21fQkUoc3RydWN0IGJyY21mX3dzZWNfa2V5ICprZXkpCi17Ci0Ja2V5LT5pbmRleCA9IGNwdV90b19sZTMyKGtleS0+aW5kZXgpOwotCWtleS0+bGVuID0gY3B1X3RvX2xlMzIoa2V5LT5sZW4pOwotCWtleS0+YWxnbyA9IGNwdV90b19sZTMyKGtleS0+YWxnbyk7Ci0Ja2V5LT5mbGFncyA9IGNwdV90b19sZTMyKGtleS0+ZmxhZ3MpOwotCWtleS0+cnhpdi5oaSA9IGNwdV90b19sZTMyKGtleS0+cnhpdi5oaSk7Ci0Ja2V5LT5yeGl2LmxvID0gY3B1X3RvX2xlMTYoa2V5LT5yeGl2LmxvKTsKLQlrZXktPml2X2luaXRpYWxpemVkID0gY3B1X3RvX2xlMzIoa2V5LT5pdl9pbml0aWFsaXplZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN3YXBfa2V5X3RvX0JFKHN0cnVjdCBicmNtZl93c2VjX2tleSAqa2V5KQotewotCWtleS0+aW5kZXggPSBsZTMyX3RvX2NwdShrZXktPmluZGV4KTsKLQlrZXktPmxlbiA9IGxlMzJfdG9fY3B1KGtleS0+bGVuKTsKLQlrZXktPmFsZ28gPSBsZTMyX3RvX2NwdShrZXktPmFsZ28pOwotCWtleS0+ZmxhZ3MgPSBsZTMyX3RvX2NwdShrZXktPmZsYWdzKTsKLQlrZXktPnJ4aXYuaGkgPSBsZTMyX3RvX2NwdShrZXktPnJ4aXYuaGkpOwotCWtleS0+cnhpdi5sbyA9IGxlMTZfdG9fY3B1KGtleS0+cnhpdi5sbyk7Ci0Ja2V5LT5pdl9pbml0aWFsaXplZCA9IGxlMzJfdG9fY3B1KGtleS0+aXZfaW5pdGlhbGl6ZWQpOwotfQotCi1zdGF0aWMgczMyCi1icmNtZl9kZXZfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGNtZCwgdm9pZCAqYXJnLCB1MzIgbGVuKQotewotCXN0cnVjdCBpZnJlcSBpZnI7Ci0Jc3RydWN0IGJyY21mX2lvY3RsIGlvYzsKLQltbV9zZWdtZW50X3QgZnM7Ci0JczMyIGVyciA9IDA7Ci0KLQltZW1zZXQoJmlvYywgMCwgc2l6ZW9mKGlvYykpOwotCWlvYy5jbWQgPSBjbWQ7Ci0JaW9jLmJ1ZiA9IGFyZzsKLQlpb2MubGVuID0gbGVuOwotCXN0cmNweShpZnIuaWZyX25hbWUsIGRldi0+bmFtZSk7Ci0JaWZyLmlmcl9kYXRhID0gKGNhZGRyX3QpJmlvYzsKLQotCWZzID0gZ2V0X2ZzKCk7Ci0Jc2V0X2ZzKGdldF9kcygpKTsKLQllcnIgPSBkZXYtPm5ldGRldl9vcHMtPm5kb19kb19pb2N0bChkZXYsICZpZnIsIFNJT0NERVZQUklWQVRFKTsKLQlzZXRfZnMoZnMpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHMzMgotYnJjbWZfY2ZnODAyMTFfY2hhbmdlX2lmYWNlKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCQkJIGVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSwgdTMyICpmbGFncywKLQkJCSBzdHJ1Y3QgdmlmX3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiA9IHdpcGh5X3RvX2NmZyh3aXBoeSk7Ci0Jc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldjsKLQlzMzIgaW5mcmEgPSAwOwotCXMzMiBlcnIgPSAwOwotCi0JV0xfVFJBQ0UoIkVudGVyXG4iKTsKLQlDSEVDS19TWVNfVVAoKTsKLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKLQljYXNlIE5MODAyMTFfSUZUWVBFX1dEUzoKLQkJV0xfRVJSKCJ0eXBlICglZCkgOiBjdXJyZW50bHkgd2UgZG8gbm90IHN1cHBvcnQgdGhpcyB0eXBlXG4iLAotCQkgICAgICAgdHlwZSk7Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgotCQljZmdfcHJpdi0+Y29uZi0+bW9kZSA9IFdMX01PREVfSUJTUzsKLQkJaW5mcmEgPSAwOwotCQlicmVhazsKLQljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046Ci0JCWNmZ19wcml2LT5jb25mLT5tb2RlID0gV0xfTU9ERV9CU1M7Ci0JCWluZnJhID0gMTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCWluZnJhID0gY3B1X3RvX2xlMzIoaW5mcmEpOwotCWVyciA9IGJyY21mX2Rldl9pb2N0bChuZGV2LCBCUkNNRl9DX1NFVF9JTkZSQSwgJmluZnJhLCBzaXplb2YoaW5mcmEpKTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoIldMQ19TRVRfSU5GUkEgZXJyb3IgKCVkKVxuIiwgZXJyKTsKLQkJZXJyID0gLUVBR0FJTjsKLQl9IGVsc2UgewotCQl3ZGV2ID0gbmRldi0+aWVlZTgwMjExX3B0cjsKLQkJd2Rldi0+aWZ0eXBlID0gdHlwZTsKLQl9Ci0KLQlXTF9JTkZPKCJJRiBUeXBlID0gJXNcbiIsCi0JCShjZmdfcHJpdi0+Y29uZi0+bW9kZSA9PSBXTF9NT0RFX0lCU1MpID8gIkFkaG9jIiA6ICJJbmZyYSIpOwotCi1kb25lOgotCVdMX1RSQUNFKCJFeGl0XG4iKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsX2lzY2FuX3ByZXAoc3RydWN0IGJyY21mX3NjYW5fcGFyYW1zICpwYXJhbXMsCi0JCQkgIHN0cnVjdCBicmNtZl9zc2lkICpzc2lkKQotewotCW1lbWNweShwYXJhbXMtPmJzc2lkLCBldGhlcl9iY2FzdCwgRVRIX0FMRU4pOwotCXBhcmFtcy0+YnNzX3R5cGUgPSBET1QxMV9CU1NUWVBFX0FOWTsKLQlwYXJhbXMtPnNjYW5fdHlwZSA9IDA7Ci0JcGFyYW1zLT5ucHJvYmVzID0gLTE7Ci0JcGFyYW1zLT5hY3RpdmVfdGltZSA9IC0xOwotCXBhcmFtcy0+cGFzc2l2ZV90aW1lID0gLTE7Ci0JcGFyYW1zLT5ob21lX3RpbWUgPSAtMTsKLQlwYXJhbXMtPmNoYW5uZWxfbnVtID0gMDsKLQotCXBhcmFtcy0+bnByb2JlcyA9IGNwdV90b19sZTMyKHBhcmFtcy0+bnByb2Jlcyk7Ci0JcGFyYW1zLT5hY3RpdmVfdGltZSA9IGNwdV90b19sZTMyKHBhcmFtcy0+YWN0aXZlX3RpbWUpOwotCXBhcmFtcy0+cGFzc2l2ZV90aW1lID0gY3B1X3RvX2xlMzIocGFyYW1zLT5wYXNzaXZlX3RpbWUpOwotCXBhcmFtcy0+aG9tZV90aW1lID0gY3B1X3RvX2xlMzIocGFyYW1zLT5ob21lX3RpbWUpOwotCWlmIChzc2lkICYmIHNzaWQtPlNTSURfbGVuKQotCQltZW1jcHkoJnBhcmFtcy0+c3NpZCwgc3NpZCwgc2l6ZW9mKHN0cnVjdCBicmNtZl9zc2lkKSk7Ci0KLX0KLQotc3RhdGljIHMzMgotYnJjbWZfZGV2X2lvdmFyX3NldGJ1ZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzOCAqIGlvdmFyLCB2b2lkICpwYXJhbSwKLQkJICAgIHMzMiBwYXJhbWxlbiwgdm9pZCAqYnVmcHRyLCBzMzIgYnVmbGVuKQotewotCXMzMiBpb2xlbjsKLQotCWlvbGVuID0gYnJjbXVfbWtpb3Zhcihpb3ZhciwgcGFyYW0sIHBhcmFtbGVuLCBidWZwdHIsIGJ1Zmxlbik7Ci0JQlVHX09OKCFpb2xlbik7Ci0KLQlyZXR1cm4gYnJjbWZfZGV2X2lvY3RsKGRldiwgQlJDTUZfQ19TRVRfVkFSLCBidWZwdHIsIGlvbGVuKTsKLX0KLQotc3RhdGljIHMzMgotYnJjbWZfZGV2X2lvdmFyX2dldGJ1ZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzOCAqIGlvdmFyLCB2b2lkICpwYXJhbSwKLQkJICAgIHMzMiBwYXJhbWxlbiwgdm9pZCAqYnVmcHRyLCBzMzIgYnVmbGVuKQotewotCXMzMiBpb2xlbjsKLQotCWlvbGVuID0gYnJjbXVfbWtpb3Zhcihpb3ZhciwgcGFyYW0sIHBhcmFtbGVuLCBidWZwdHIsIGJ1Zmxlbik7Ci0JQlVHX09OKCFpb2xlbik7Ci0KLQlyZXR1cm4gYnJjbWZfZGV2X2lvY3RsKGRldiwgQlJDTUZfQ19HRVRfVkFSLCBidWZwdHIsIGJ1Zmxlbik7Ci19Ci0KLXN0YXRpYyBzMzIKLWJyY21mX3J1bl9pc2NhbihzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfaXNjYW5fY3RybCAqaXNjYW4sCi0JCXN0cnVjdCBicmNtZl9zc2lkICpzc2lkLCB1MTYgYWN0aW9uKQotewotCXMzMiBwYXJhbXNfc2l6ZSA9IChCUkNNRl9TQ0FOX1BBUkFNU19GSVhFRF9TSVpFICsKLQkJCQlvZmZzZXRvZihzdHJ1Y3QgYnJjbWZfaXNjYW5fcGFyYW1zLCBwYXJhbXMpKTsKLQlzdHJ1Y3QgYnJjbWZfaXNjYW5fcGFyYW1zICpwYXJhbXM7Ci0JczMyIGVyciA9IDA7Ci0KLQlpZiAoc3NpZCAmJiBzc2lkLT5TU0lEX2xlbikKLQkJcGFyYW1zX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCBicmNtZl9zc2lkKTsKLQlwYXJhbXMgPSBremFsbG9jKHBhcmFtc19zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAodW5saWtlbHkoIXBhcmFtcykpCi0JCXJldHVybiAtRU5PTUVNOwotCUJVR19PTihwYXJhbXNfc2l6ZSA+PSBCUkNNRl9DX0lPQ1RMX1NNTEVOKTsKLQotCXdsX2lzY2FuX3ByZXAoJnBhcmFtcy0+cGFyYW1zLCBzc2lkKTsKLQotCXBhcmFtcy0+dmVyc2lvbiA9IGNwdV90b19sZTMyKEJSQ01GX0lTQ0FOX1JFUV9WRVJTSU9OKTsKLQlwYXJhbXMtPmFjdGlvbiA9IGNwdV90b19sZTE2KGFjdGlvbik7Ci0JcGFyYW1zLT5zY2FuX2R1cmF0aW9uID0gY3B1X3RvX2xlMTYoMCk7Ci0KLQkvKiBwYXJhbXNfc2l6ZSArPSBvZmZzZXRvZihzdHJ1Y3QgYnJjbWZfaXNjYW5fcGFyYW1zLCBwYXJhbXMpOyAqLwotCWVyciA9IGJyY21mX2Rldl9pb3Zhcl9zZXRidWYoaXNjYW4tPmRldiwgImlzY2FuIiwgcGFyYW1zLCBwYXJhbXNfc2l6ZSwKLQkJCQlpc2Nhbi0+aW9jdGxfYnVmLCBCUkNNRl9DX0lPQ1RMX1NNTEVOKTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQlpZiAoZXJyID09IC1FQlVTWSkgewotCQkJV0xfSU5GTygic3lzdGVtIGJ1c3kgOiBpc2NhbiBjYW5jZWxlZFxuIik7Ci0JCX0gZWxzZSB7Ci0JCQlXTF9FUlIoImVycm9yICglZClcbiIsIGVycik7Ci0JCX0KLQl9Ci0Ja2ZyZWUocGFyYW1zKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgczMyIGJyY21mX2RvX2lzY2FuKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdikKLXsKLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfaXNjYW5fY3RybCAqaXNjYW4gPSBjZmdfdG9faXNjYW4oY2ZnX3ByaXYpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gY2ZnX3RvX25kZXYoY2ZnX3ByaXYpOwotCXN0cnVjdCBicmNtZl9zc2lkIHNzaWQ7Ci0JczMyIHBhc3NpdmVfc2NhbjsKLQlzMzIgZXJyID0gMDsKLQotCS8qIEJyb2FkY2FzdCBzY2FuIGJ5IGRlZmF1bHQgKi8KLQltZW1zZXQoJnNzaWQsIDAsIHNpemVvZihzc2lkKSk7Ci0KLQlpc2Nhbi0+c3RhdGUgPSBXTF9JU0NBTl9TVEFURV9TQ0FOSU5HOwotCi0JcGFzc2l2ZV9zY2FuID0gY2ZnX3ByaXYtPmFjdGl2ZV9zY2FuID8gMCA6IDE7Ci0JZXJyID0gYnJjbWZfZGV2X2lvY3RsKGNmZ190b19uZGV2KGNmZ19wcml2KSwgQlJDTUZfQ19TRVRfUEFTU0lWRV9TQ0FOLAotCQkJJnBhc3NpdmVfc2Nhbiwgc2l6ZW9mKHBhc3NpdmVfc2NhbikpOwotCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigiZXJyb3IgKCVkKVxuIiwgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0JYnJjbWZfc2V0X21wYyhuZGV2LCAwKTsKLQljZmdfcHJpdi0+aXNjYW5fa2lja3N0YXJ0ID0gdHJ1ZTsKLQlicmNtZl9ydW5faXNjYW4oaXNjYW4sICZzc2lkLCBCUkNNRl9TQ0FOX0FDVElPTl9TVEFSVCk7Ci0JbW9kX3RpbWVyKCZpc2Nhbi0+dGltZXIsIGppZmZpZXMgKyBpc2Nhbi0+dGltZXJfbXMgKiBIWiAvIDEwMDApOwotCWlzY2FuLT50aW1lcl9vbiA9IDE7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgczMyCi1fX2JyY21mX2NmZzgwMjExX3NjYW4oc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JCSAgIHN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcXVlc3QsCi0JCSAgIHN0cnVjdCBjZmc4MDIxMV9zc2lkICp0aGlzX3NzaWQpCi17Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2ID0gbmRldl90b19jZmcobmRldik7Ci0Jc3RydWN0IGNmZzgwMjExX3NzaWQgKnNzaWRzOwotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9zY2FuX3JlcSAqc3IgPSBjZmdfcHJpdi0+c2Nhbl9yZXFfaW50OwotCXMzMiBwYXNzaXZlX3NjYW47Ci0JYm9vbCBpc2Nhbl9yZXE7Ci0JYm9vbCBzcGVjX3NjYW47Ci0JczMyIGVyciA9IDA7Ci0KLQlpZiAodW5saWtlbHkodGVzdF9iaXQoV0xfU1RBVFVTX1NDQU5OSU5HLCAmY2ZnX3ByaXYtPnN0YXR1cykpKSB7Ci0JCVdMX0VSUigiU2Nhbm5pbmcgYWxyZWFkeSA6IHN0YXR1cyAoJWx1KVxuIiwgY2ZnX3ByaXYtPnN0YXR1cyk7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KLQlpZiAodW5saWtlbHkodGVzdF9iaXQoV0xfU1RBVFVTX1NDQU5fQUJPUlRJTkcsICZjZmdfcHJpdi0+c3RhdHVzKSkpIHsKLQkJV0xfRVJSKCJTY2FubmluZyBiZWluZyBhYm9ydGVkIDogc3RhdHVzICglbHUpXG4iLAotCQkgICAgICAgY2ZnX3ByaXYtPnN0YXR1cyk7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KLQlpZiAodGVzdF9iaXQoV0xfU1RBVFVTX0NPTk5FQ1RJTkcsICZjZmdfcHJpdi0+c3RhdHVzKSkgewotCQlXTF9FUlIoIkNvbm5lY3RpbmcgOiBzdGF0dXMgKCVsdSlcbiIsCi0JCSAgICAgICBjZmdfcHJpdi0+c3RhdHVzKTsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCi0JaXNjYW5fcmVxID0gZmFsc2U7Ci0Jc3BlY19zY2FuID0gZmFsc2U7Ci0JaWYgKHJlcXVlc3QpIHsKLQkJLyogc2NhbiBic3MgKi8KLQkJc3NpZHMgPSByZXF1ZXN0LT5zc2lkczsKLQkJaWYgKGNmZ19wcml2LT5pc2Nhbl9vbiAmJiAoIXNzaWRzIHx8ICFzc2lkcy0+c3NpZF9sZW4pKQotCQkJaXNjYW5fcmVxID0gdHJ1ZTsKLQl9IGVsc2UgewotCQkvKiBzY2FuIGluIGlic3MgKi8KLQkJLyogd2UgZG9uJ3QgZG8gaXNjYW4gaW4gaWJzcyAqLwotCQlzc2lkcyA9IHRoaXNfc3NpZDsKLQl9Ci0KLQljZmdfcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gcmVxdWVzdDsKLQlzZXRfYml0KFdMX1NUQVRVU19TQ0FOTklORywgJmNmZ19wcml2LT5zdGF0dXMpOwotCWlmIChpc2Nhbl9yZXEpIHsKLQkJZXJyID0gYnJjbWZfZG9faXNjYW4oY2ZnX3ByaXYpOwotCQlpZiAobGlrZWx5KCFlcnIpKQotCQkJcmV0dXJuIGVycjsKLQkJZWxzZQotCQkJZ290byBzY2FuX291dDsKLQl9IGVsc2UgewotCQlXTF9TQ0FOKCJzc2lkIFwiJXNcIiwgc3NpZF9sZW4gKCVkKVxuIiwKLQkJICAgICAgIHNzaWRzLT5zc2lkLCBzc2lkcy0+c3NpZF9sZW4pOwotCQltZW1zZXQoJnNyLT5zc2lkLCAwLCBzaXplb2Yoc3ItPnNzaWQpKTsKLQkJc3ItPnNzaWQuU1NJRF9sZW4gPQotCQkJICAgIG1pbl90KHU4LCBzaXplb2Yoc3ItPnNzaWQuU1NJRCksIHNzaWRzLT5zc2lkX2xlbik7Ci0JCWlmIChzci0+c3NpZC5TU0lEX2xlbikgewotCQkJbWVtY3B5KHNyLT5zc2lkLlNTSUQsIHNzaWRzLT5zc2lkLCBzci0+c3NpZC5TU0lEX2xlbik7Ci0JCQlzci0+c3NpZC5TU0lEX2xlbiA9IGNwdV90b19sZTMyKHNyLT5zc2lkLlNTSURfbGVuKTsKLQkJCXNwZWNfc2NhbiA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlXTF9TQ0FOKCJCcm9hZGNhc3Qgc2NhblxuIik7Ci0JCX0KLQotCQlwYXNzaXZlX3NjYW4gPSBjZmdfcHJpdi0+YWN0aXZlX3NjYW4gPyAwIDogMTsKLQkJZXJyID0gYnJjbWZfZGV2X2lvY3RsKG5kZXYsIEJSQ01GX0NfU0VUX1BBU1NJVkVfU0NBTiwKLQkJCQkmcGFzc2l2ZV9zY2FuLCBzaXplb2YocGFzc2l2ZV9zY2FuKSk7Ci0JCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoIldMQ19TRVRfUEFTU0lWRV9TQ0FOIGVycm9yICglZClcbiIsIGVycik7Ci0JCQlnb3RvIHNjYW5fb3V0OwotCQl9Ci0JCWJyY21mX3NldF9tcGMobmRldiwgMCk7Ci0JCWVyciA9IGJyY21mX2Rldl9pb2N0bChuZGV2LCBCUkNNRl9DX1NDQU4sICZzci0+c3NpZCwKLQkJCQlzaXplb2Yoc3ItPnNzaWQpKTsKLQkJaWYgKGVycikgewotCQkJaWYgKGVyciA9PSAtRUJVU1kpIHsKLQkJCQlXTF9JTkZPKCJzeXN0ZW0gYnVzeSA6IHNjYW4gZm9yIFwiJXNcIiBjYW5jZWxlZFxuIiwKLQkJCQkJc3ItPnNzaWQuU1NJRCk7Ci0JCQl9IGVsc2UgewotCQkJCVdMX0VSUigiV0xDX1NDQU4gZXJyb3IgKCVkKVxuIiwgZXJyKTsKLQkJCX0KLQkJCWJyY21mX3NldF9tcGMobmRldiwgMSk7Ci0JCQlnb3RvIHNjYW5fb3V0OwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLXNjYW5fb3V0OgotCWNsZWFyX2JpdChXTF9TVEFUVVNfU0NBTk5JTkcsICZjZmdfcHJpdi0+c3RhdHVzKTsKLQljZmdfcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gTlVMTDsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgczMyCi1icmNtZl9jZmc4MDIxMV9zY2FuKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCQkgc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxdWVzdCkKLXsKLQlzMzIgZXJyID0gMDsKLQotCVdMX1RSQUNFKCJFbnRlclxuIik7Ci0KLQlDSEVDS19TWVNfVVAoKTsKLQotCWVyciA9IF9fYnJjbWZfY2ZnODAyMTFfc2Nhbih3aXBoeSwgbmRldiwgcmVxdWVzdCwgTlVMTCk7Ci0JaWYgKHVubGlrZWx5KGVycikpCi0JCVdMX0VSUigic2NhbiBlcnJvciAoJWQpXG4iLCBlcnIpOwotCi0JV0xfVFJBQ0UoIkV4aXRcbiIpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBzMzIgYnJjbWZfZGV2X2ludHZhcl9zZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgczggKm5hbWUsIHMzMiB2YWwpCi17Ci0JczggYnVmW0JSQ01GX0NfSU9DVExfU01MRU5dOwotCXUzMiBsZW47Ci0JczMyIGVyciA9IDA7Ci0KLQl2YWwgPSBjcHVfdG9fbGUzMih2YWwpOwotCWxlbiA9IGJyY211X21raW92YXIobmFtZSwgKGNoYXIgKikoJnZhbCksIHNpemVvZih2YWwpLCBidWYsCi0JCQkgICAgc2l6ZW9mKGJ1ZikpOwotCUJVR19PTighbGVuKTsKLQotCWVyciA9IGJyY21mX2Rldl9pb2N0bChkZXYsIEJSQ01GX0NfU0VUX1ZBUiwgYnVmLCBsZW4pOwotCWlmICh1bmxpa2VseShlcnIpKQotCQlXTF9FUlIoImVycm9yICglZClcbiIsIGVycik7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgczMyCi1icmNtZl9kZXZfaW50dmFyX2dldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzOCAqbmFtZSwgczMyICpyZXR2YWwpCi17Ci0JdW5pb24gewotCQlzOCBidWZbQlJDTUZfQ19JT0NUTF9TTUxFTl07Ci0JCXMzMiB2YWw7Ci0JfSB2YXI7Ci0JdTMyIGxlbjsKLQl1MzIgZGF0YV9udWxsOwotCXMzMiBlcnIgPSAwOwotCi0JbGVuID0KLQkgICAgYnJjbXVfbWtpb3ZhcihuYW1lLCAoY2hhciAqKSgmZGF0YV9udWxsKSwgMCwgKGNoYXIgKikoJnZhciksCi0JCQlzaXplb2YodmFyLmJ1ZikpOwotCUJVR19PTighbGVuKTsKLQllcnIgPSBicmNtZl9kZXZfaW9jdGwoZGV2LCBCUkNNRl9DX0dFVF9WQVIsICZ2YXIsIGxlbik7Ci0JaWYgKHVubGlrZWx5KGVycikpCi0JCVdMX0VSUigiZXJyb3IgKCVkKVxuIiwgZXJyKTsKLQotCSpyZXR2YWwgPSBsZTMyX3RvX2NwdSh2YXIudmFsKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBzMzIgYnJjbWZfc2V0X3J0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgcnRzX3RocmVzaG9sZCkKLXsKLQlzMzIgZXJyID0gMDsKLQotCWVyciA9IGJyY21mX2Rldl9pbnR2YXJfc2V0KGRldiwgInJ0c3RocmVzaCIsIHJ0c190aHJlc2hvbGQpOwotCWlmICh1bmxpa2VseShlcnIpKQotCQlXTF9FUlIoIkVycm9yICglZClcbiIsIGVycik7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgczMyIGJyY21mX3NldF9mcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmcmFnX3RocmVzaG9sZCkKLXsKLQlzMzIgZXJyID0gMDsKLQotCWVyciA9IGJyY21mX2Rldl9pbnR2YXJfc2V0KGRldiwgImZyYWd0aHJlc2giLCBmcmFnX3RocmVzaG9sZCk7Ci0JaWYgKHVubGlrZWx5KGVycikpCi0JCVdMX0VSUigiRXJyb3IgKCVkKVxuIiwgZXJyKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBzMzIgYnJjbWZfc2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiByZXRyeSwgYm9vbCBsKQotewotCXMzMiBlcnIgPSAwOwotCXUzMiBjbWQgPSAobCA/IEJSQ01fU0VUX0xSTCA6IEJSQ01fU0VUX1NSTCk7Ci0KLQlyZXRyeSA9IGNwdV90b19sZTMyKHJldHJ5KTsKLQllcnIgPSBicmNtZl9kZXZfaW9jdGwoZGV2LCBjbWQsICZyZXRyeSwgc2l6ZW9mKHJldHJ5KSk7Ci0JaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCJjbWQgKCVkKSAsIGVycm9yICglZClcbiIsIGNtZCwgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHMzMiBicmNtZl9jZmc4MDIxMV9zZXRfd2lwaHlfcGFyYW1zKHN0cnVjdCB3aXBoeSAqd2lwaHksIHUzMiBjaGFuZ2VkKQotewotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiA9IHdpcGh5X3RvX2NmZyh3aXBoeSk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBjZmdfdG9fbmRldihjZmdfcHJpdik7Ci0JczMyIGVyciA9IDA7Ci0KLQlXTF9UUkFDRSgiRW50ZXJcbiIpOwotCUNIRUNLX1NZU19VUCgpOwotCi0JaWYgKGNoYW5nZWQgJiBXSVBIWV9QQVJBTV9SVFNfVEhSRVNIT0xEICYmCi0JICAgIChjZmdfcHJpdi0+Y29uZi0+cnRzX3RocmVzaG9sZCAhPSB3aXBoeS0+cnRzX3RocmVzaG9sZCkpIHsKLQkJY2ZnX3ByaXYtPmNvbmYtPnJ0c190aHJlc2hvbGQgPSB3aXBoeS0+cnRzX3RocmVzaG9sZDsKLQkJZXJyID0gYnJjbWZfc2V0X3J0cyhuZGV2LCBjZmdfcHJpdi0+Y29uZi0+cnRzX3RocmVzaG9sZCk7Ci0JCWlmICghZXJyKQotCQkJZ290byBkb25lOwotCX0KLQlpZiAoY2hhbmdlZCAmIFdJUEhZX1BBUkFNX0ZSQUdfVEhSRVNIT0xEICYmCi0JICAgIChjZmdfcHJpdi0+Y29uZi0+ZnJhZ190aHJlc2hvbGQgIT0gd2lwaHktPmZyYWdfdGhyZXNob2xkKSkgewotCQljZmdfcHJpdi0+Y29uZi0+ZnJhZ190aHJlc2hvbGQgPSB3aXBoeS0+ZnJhZ190aHJlc2hvbGQ7Ci0JCWVyciA9IGJyY21mX3NldF9mcmFnKG5kZXYsIGNmZ19wcml2LT5jb25mLT5mcmFnX3RocmVzaG9sZCk7Ci0JCWlmICghZXJyKQotCQkJZ290byBkb25lOwotCX0KLQlpZiAoY2hhbmdlZCAmIFdJUEhZX1BBUkFNX1JFVFJZX0xPTkcKLQkgICAgJiYgKGNmZ19wcml2LT5jb25mLT5yZXRyeV9sb25nICE9IHdpcGh5LT5yZXRyeV9sb25nKSkgewotCQljZmdfcHJpdi0+Y29uZi0+cmV0cnlfbG9uZyA9IHdpcGh5LT5yZXRyeV9sb25nOwotCQllcnIgPSBicmNtZl9zZXRfcmV0cnkobmRldiwgY2ZnX3ByaXYtPmNvbmYtPnJldHJ5X2xvbmcsIHRydWUpOwotCQlpZiAoIWVycikKLQkJCWdvdG8gZG9uZTsKLQl9Ci0JaWYgKGNoYW5nZWQgJiBXSVBIWV9QQVJBTV9SRVRSWV9TSE9SVAotCSAgICAmJiAoY2ZnX3ByaXYtPmNvbmYtPnJldHJ5X3Nob3J0ICE9IHdpcGh5LT5yZXRyeV9zaG9ydCkpIHsKLQkJY2ZnX3ByaXYtPmNvbmYtPnJldHJ5X3Nob3J0ID0gd2lwaHktPnJldHJ5X3Nob3J0OwotCQllcnIgPSBicmNtZl9zZXRfcmV0cnkobmRldiwgY2ZnX3ByaXYtPmNvbmYtPnJldHJ5X3Nob3J0LCBmYWxzZSk7Ci0JCWlmICghZXJyKQotCQkJZ290byBkb25lOwotCX0KLQotZG9uZToKLQlXTF9UUkFDRSgiRXhpdFxuIik7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHMzMgotYnJjbWZfY2ZnODAyMTFfam9pbl9pYnNzKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgICAgIHN0cnVjdCBjZmc4MDIxMV9pYnNzX3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiA9IHdpcGh5X3RvX2NmZyh3aXBoeSk7Ci0Jc3RydWN0IGJyY21mX2pvaW5fcGFyYW1zIGpvaW5fcGFyYW1zOwotCXNpemVfdCBqb2luX3BhcmFtc19zaXplID0gMDsKLQlzMzIgZXJyID0gMDsKLQlzMzIgd3NlYyA9IDA7Ci0JczMyIGJjbnByZDsKLQotCVdMX1RSQUNFKCJFbnRlclxuIik7Ci0JQ0hFQ0tfU1lTX1VQKCk7Ci0KLQlpZiAocGFyYW1zLT5zc2lkKQotCQlXTF9DT05OKCJTU0lEOiAlc1xuIiwgcGFyYW1zLT5zc2lkKTsKLQllbHNlIHsKLQkJV0xfQ09OTigiU1NJRDogTlVMTCwgTm90IHN1cHBvcnRlZFxuIik7Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci0KLQlzZXRfYml0KFdMX1NUQVRVU19DT05ORUNUSU5HLCAmY2ZnX3ByaXYtPnN0YXR1cyk7Ci0KLQlpZiAocGFyYW1zLT5ic3NpZCkKLQkJV0xfQ09OTigiQlNTSUQ6ICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYXG4iLAotCQlwYXJhbXMtPmJzc2lkWzBdLCBwYXJhbXMtPmJzc2lkWzFdLCBwYXJhbXMtPmJzc2lkWzJdLAotCQlwYXJhbXMtPmJzc2lkWzNdLCBwYXJhbXMtPmJzc2lkWzRdLCBwYXJhbXMtPmJzc2lkWzVdKTsKLQllbHNlCi0JCVdMX0NPTk4oIk5vIEJTU0lEIHNwZWNpZmllZFxuIik7Ci0KLQlpZiAocGFyYW1zLT5jaGFubmVsKQotCQlXTF9DT05OKCJjaGFubmVsOiAlZFxuIiwgcGFyYW1zLT5jaGFubmVsLT5jZW50ZXJfZnJlcSk7Ci0JZWxzZQotCQlXTF9DT05OKCJubyBjaGFubmVsIHNwZWNpZmllZFxuIik7Ci0KLQlpZiAocGFyYW1zLT5jaGFubmVsX2ZpeGVkKQotCQlXTF9DT05OKCJmaXhlZCBjaGFubmVsIHJlcXVpcmVkXG4iKTsKLQllbHNlCi0JCVdMX0NPTk4oIm5vIGZpeGVkIGNoYW5uZWwgcmVxdWlyZWRcbiIpOwotCi0JaWYgKHBhcmFtcy0+aWUgJiYgcGFyYW1zLT5pZV9sZW4pCi0JCVdMX0NPTk4oImllIGxlbjogJWRcbiIsIHBhcmFtcy0+aWVfbGVuKTsKLQllbHNlCi0JCVdMX0NPTk4oIm5vIGllIHNwZWNpZmllZFxuIik7Ci0KLQlpZiAocGFyYW1zLT5iZWFjb25faW50ZXJ2YWwpCi0JCVdMX0NPTk4oImJlYWNvbiBpbnRlcnZhbDogJWRcbiIsIHBhcmFtcy0+YmVhY29uX2ludGVydmFsKTsKLQllbHNlCi0JCVdMX0NPTk4oIm5vIGJlYWNvbiBpbnRlcnZhbCBzcGVjaWZpZWRcbiIpOwotCi0JaWYgKHBhcmFtcy0+YmFzaWNfcmF0ZXMpCi0JCVdMX0NPTk4oImJhc2ljIHJhdGVzOiAlMDhYXG4iLCBwYXJhbXMtPmJhc2ljX3JhdGVzKTsKLQllbHNlCi0JCVdMX0NPTk4oIm5vIGJhc2ljIHJhdGVzIHNwZWNpZmllZFxuIik7Ci0KLQlpZiAocGFyYW1zLT5wcml2YWN5KQotCQlXTF9DT05OKCJwcml2YWN5IHJlcXVpcmVkXG4iKTsKLQllbHNlCi0JCVdMX0NPTk4oIm5vIHByaXZhY3kgcmVxdWlyZWRcbiIpOwotCi0JLyogQ29uZmlndXJlIFByaXZhY3kgZm9yIHN0YXJ0ZXIgKi8KLQlpZiAocGFyYW1zLT5wcml2YWN5KQotCQl3c2VjIHw9IFdFUF9FTkFCTEVEOwotCi0JZXJyID0gYnJjbWZfZGV2X2ludHZhcl9zZXQoZGV2LCAid3NlYyIsIHdzZWMpOwotCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigid3NlYyBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIENvbmZpZ3VyZSBCZWFjb24gSW50ZXJ2YWwgZm9yIHN0YXJ0ZXIgKi8KLQlpZiAocGFyYW1zLT5iZWFjb25faW50ZXJ2YWwpCi0JCWJjbnByZCA9IGNwdV90b19sZTMyKHBhcmFtcy0+YmVhY29uX2ludGVydmFsKTsKLQllbHNlCi0JCWJjbnByZCA9IGNwdV90b19sZTMyKDEwMCk7Ci0KLQllcnIgPSBicmNtZl9kZXZfaW9jdGwoZGV2LCBCUkNNX1NFVF9CQ05QUkQsICZiY25wcmQsIHNpemVvZihiY25wcmQpKTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoIldMQ19TRVRfQkNOUFJEIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogQ29uZmlndXJlIHJlcXVpcmVkIGpvaW4gcGFyYW1ldGVyICovCi0JbWVtc2V0KCZqb2luX3BhcmFtcywgMCwgc2l6ZW9mKHN0cnVjdCBicmNtZl9qb2luX3BhcmFtcykpOwotCi0JLyogU1NJRCAqLwotCWpvaW5fcGFyYW1zLnNzaWQuU1NJRF9sZW4gPQotCQkJKHBhcmFtcy0+c3NpZF9sZW4gPiAzMikgPyAzMiA6IHBhcmFtcy0+c3NpZF9sZW47Ci0JbWVtY3B5KGpvaW5fcGFyYW1zLnNzaWQuU1NJRCwgcGFyYW1zLT5zc2lkLCBqb2luX3BhcmFtcy5zc2lkLlNTSURfbGVuKTsKLQlqb2luX3BhcmFtcy5zc2lkLlNTSURfbGVuID0gY3B1X3RvX2xlMzIoam9pbl9wYXJhbXMuc3NpZC5TU0lEX2xlbik7Ci0Jam9pbl9wYXJhbXNfc2l6ZSA9IHNpemVvZihqb2luX3BhcmFtcy5zc2lkKTsKLQlicmNtZl91cGRhdGVfcHJvZihjZmdfcHJpdiwgTlVMTCwgJmpvaW5fcGFyYW1zLnNzaWQsIFdMX1BST0ZfU1NJRCk7Ci0KLQkvKiBCU1NJRCAqLwotCWlmIChwYXJhbXMtPmJzc2lkKSB7Ci0JCW1lbWNweShqb2luX3BhcmFtcy5wYXJhbXMuYnNzaWQsIHBhcmFtcy0+YnNzaWQsIEVUSF9BTEVOKTsKLQkJam9pbl9wYXJhbXNfc2l6ZSA9IHNpemVvZihqb2luX3BhcmFtcy5zc2lkKSArCi0JCQkJCUJSQ01GX0FTU09DX1BBUkFNU19GSVhFRF9TSVpFOwotCX0gZWxzZSB7Ci0JCW1lbWNweShqb2luX3BhcmFtcy5wYXJhbXMuYnNzaWQsIGV0aGVyX2JjYXN0LCBFVEhfQUxFTik7Ci0JfQotCWJyY21mX3VwZGF0ZV9wcm9mKGNmZ19wcml2LCBOVUxMLAotCQkJICAmam9pbl9wYXJhbXMucGFyYW1zLmJzc2lkLCBXTF9QUk9GX0JTU0lEKTsKLQotCS8qIENoYW5uZWwgKi8KLQlpZiAocGFyYW1zLT5jaGFubmVsKSB7Ci0JCXUzMiB0YXJnZXRfY2hhbm5lbDsKLQotCQljZmdfcHJpdi0+Y2hhbm5lbCA9Ci0JCQlpZWVlODAyMTFfZnJlcXVlbmN5X3RvX2NoYW5uZWwoCi0JCQkJcGFyYW1zLT5jaGFubmVsLT5jZW50ZXJfZnJlcSk7Ci0JCWlmIChwYXJhbXMtPmNoYW5uZWxfZml4ZWQpIHsKLQkJCS8qIGFkZGluZyBjaGFuc3BlYyAqLwotCQkJYnJjbWZfY2hfdG9fY2hhbnNwZWMoY2ZnX3ByaXYtPmNoYW5uZWwsCi0JCQkJJmpvaW5fcGFyYW1zLCAmam9pbl9wYXJhbXNfc2l6ZSk7Ci0JCX0KLQotCQkvKiBzZXQgY2hhbm5lbCBmb3Igc3RhcnRlciAqLwotCQl0YXJnZXRfY2hhbm5lbCA9IGNwdV90b19sZTMyKGNmZ19wcml2LT5jaGFubmVsKTsKLQkJZXJyID0gYnJjbWZfZGV2X2lvY3RsKGRldiwgQlJDTV9TRVRfQ0hBTk5FTCwKLQkJCSZ0YXJnZXRfY2hhbm5lbCwgc2l6ZW9mKHRhcmdldF9jaGFubmVsKSk7Ci0JCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoIldMQ19TRVRfQ0hBTk5FTCBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCX0gZWxzZQotCQljZmdfcHJpdi0+Y2hhbm5lbCA9IDA7Ci0KLQljZmdfcHJpdi0+aWJzc19zdGFydGVyID0gZmFsc2U7Ci0KLQotCWVyciA9IGJyY21mX2Rldl9pb2N0bChkZXYsIEJSQ01GX0NfU0VUX1NTSUQsCi0JCQkgICAmam9pbl9wYXJhbXMsIGpvaW5fcGFyYW1zX3NpemUpOwotCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigiV0xDX1NFVF9TU0lEIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi1kb25lOgotCWlmIChlcnIpCi0JCWNsZWFyX2JpdChXTF9TVEFUVVNfQ09OTkVDVElORywgJmNmZ19wcml2LT5zdGF0dXMpOwotCVdMX1RSQUNFKCJFeGl0XG4iKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgczMyIGJyY21mX2NmZzgwMjExX2xlYXZlX2lic3Moc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYgPSB3aXBoeV90b19jZmcod2lwaHkpOwotCXMzMiBlcnIgPSAwOwotCi0JV0xfVFJBQ0UoIkVudGVyXG4iKTsKLQlDSEVDS19TWVNfVVAoKTsKLQotCWJyY21mX2xpbmtfZG93bihjZmdfcHJpdik7Ci0KLQlXTF9UUkFDRSgiRXhpdFxuIik7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgczMyCi1icmNtZl9zZXRfd3BhX3ZlcnNpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGNmZzgwMjExX2Nvbm5lY3RfcGFyYW1zICpzbWUpCi17Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2ID0gbmRldl90b19jZmcoZGV2KTsKLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfc2VjdXJpdHkgKnNlYzsKLQlzMzIgdmFsID0gMDsKLQlzMzIgZXJyID0gMDsKLQotCWlmIChzbWUtPmNyeXB0by53cGFfdmVyc2lvbnMgJiBOTDgwMjExX1dQQV9WRVJTSU9OXzEpCi0JCXZhbCA9IFdQQV9BVVRIX1BTSyB8IFdQQV9BVVRIX1VOU1BFQ0lGSUVEOwotCWVsc2UgaWYgKHNtZS0+Y3J5cHRvLndwYV92ZXJzaW9ucyAmIE5MODAyMTFfV1BBX1ZFUlNJT05fMikKLQkJdmFsID0gV1BBMl9BVVRIX1BTSyB8IFdQQTJfQVVUSF9VTlNQRUNJRklFRDsKLQllbHNlCi0JCXZhbCA9IFdQQV9BVVRIX0RJU0FCTEVEOwotCVdMX0NPTk4oInNldHRpbmcgd3BhX2F1dGggdG8gMHglMHhcbiIsIHZhbCk7Ci0JZXJyID0gYnJjbWZfZGV2X2ludHZhcl9zZXQoZGV2LCAid3BhX2F1dGgiLCB2YWwpOwotCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigic2V0IHdwYV9hdXRoIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQlzZWMgPSBicmNtZl9yZWFkX3Byb2YoY2ZnX3ByaXYsIFdMX1BST0ZfU0VDKTsKLQlzZWMtPndwYV92ZXJzaW9ucyA9IHNtZS0+Y3J5cHRvLndwYV92ZXJzaW9uczsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgczMyCi1icmNtZl9zZXRfYXV0aF90eXBlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBjZmc4MDIxMV9jb25uZWN0X3BhcmFtcyAqc21lKQotewotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiA9IG5kZXZfdG9fY2ZnKGRldik7Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX3NlY3VyaXR5ICpzZWM7Ci0JczMyIHZhbCA9IDA7Ci0JczMyIGVyciA9IDA7Ci0KLQlzd2l0Y2ggKHNtZS0+YXV0aF90eXBlKSB7Ci0JY2FzZSBOTDgwMjExX0FVVEhUWVBFX09QRU5fU1lTVEVNOgotCQl2YWwgPSAwOwotCQlXTF9DT05OKCJvcGVuIHN5c3RlbVxuIik7Ci0JCWJyZWFrOwotCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9TSEFSRURfS0VZOgotCQl2YWwgPSAxOwotCQlXTF9DT05OKCJzaGFyZWQga2V5XG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBOTDgwMjExX0FVVEhUWVBFX0FVVE9NQVRJQzoKLQkJdmFsID0gMjsKLQkJV0xfQ09OTigiYXV0b21hdGljXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBOTDgwMjExX0FVVEhUWVBFX05FVFdPUktfRUFQOgotCQlXTF9DT05OKCJuZXR3b3JrIGVhcFxuIik7Ci0JZGVmYXVsdDoKLQkJdmFsID0gMjsKLQkJV0xfRVJSKCJpbnZhbGlkIGF1dGggdHlwZSAoJWQpXG4iLCBzbWUtPmF1dGhfdHlwZSk7Ci0JCWJyZWFrOwotCX0KLQotCWVyciA9IGJyY21mX2Rldl9pbnR2YXJfc2V0KGRldiwgImF1dGgiLCB2YWwpOwotCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigic2V0IGF1dGggZmFpbGVkICglZClcbiIsIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCXNlYyA9IGJyY21mX3JlYWRfcHJvZihjZmdfcHJpdiwgV0xfUFJPRl9TRUMpOwotCXNlYy0+YXV0aF90eXBlID0gc21lLT5hdXRoX3R5cGU7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHMzMgotYnJjbWZfc2V0X3NldF9jaXBoZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGNmZzgwMjExX2Nvbm5lY3RfcGFyYW1zICpzbWUpCi17Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2ID0gbmRldl90b19jZmcoZGV2KTsKLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfc2VjdXJpdHkgKnNlYzsKLQlzMzIgcHZhbCA9IDA7Ci0JczMyIGd2YWwgPSAwOwotCXMzMiBlcnIgPSAwOwotCi0JaWYgKHNtZS0+Y3J5cHRvLm5fY2lwaGVyc19wYWlyd2lzZSkgewotCQlzd2l0Y2ggKHNtZS0+Y3J5cHRvLmNpcGhlcnNfcGFpcndpc2VbMF0pIHsKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6Ci0JCQlwdmFsID0gV0VQX0VOQUJMRUQ7Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQkJcHZhbCA9IFRLSVBfRU5BQkxFRDsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6Ci0JCQlwdmFsID0gQUVTX0VOQUJMRUQ7Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQzoKLQkJCXB2YWwgPSBBRVNfRU5BQkxFRDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJV0xfRVJSKCJpbnZhbGlkIGNpcGhlciBwYWlyd2lzZSAoJWQpXG4iLAotCQkJICAgICAgIHNtZS0+Y3J5cHRvLmNpcGhlcnNfcGFpcndpc2VbMF0pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQl9Ci0JaWYgKHNtZS0+Y3J5cHRvLmNpcGhlcl9ncm91cCkgewotCQlzd2l0Y2ggKHNtZS0+Y3J5cHRvLmNpcGhlcl9ncm91cCkgewotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKLQkJCWd2YWwgPSBXRVBfRU5BQkxFRDsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6Ci0JCQlndmFsID0gVEtJUF9FTkFCTEVEOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKLQkJCWd2YWwgPSBBRVNfRU5BQkxFRDsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDOgotCQkJZ3ZhbCA9IEFFU19FTkFCTEVEOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlXTF9FUlIoImludmFsaWQgY2lwaGVyIGdyb3VwICglZClcbiIsCi0JCQkgICAgICAgc21lLT5jcnlwdG8uY2lwaGVyX2dyb3VwKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0JV0xfQ09OTigicHZhbCAoJWQpIGd2YWwgKCVkKVxuIiwgcHZhbCwgZ3ZhbCk7Ci0JZXJyID0gYnJjbWZfZGV2X2ludHZhcl9zZXQoZGV2LCAid3NlYyIsIHB2YWwgfCBndmFsKTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoImVycm9yICglZClcbiIsIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0Jc2VjID0gYnJjbWZfcmVhZF9wcm9mKGNmZ19wcml2LCBXTF9QUk9GX1NFQyk7Ci0Jc2VjLT5jaXBoZXJfcGFpcndpc2UgPSBzbWUtPmNyeXB0by5jaXBoZXJzX3BhaXJ3aXNlWzBdOwotCXNlYy0+Y2lwaGVyX2dyb3VwID0gc21lLT5jcnlwdG8uY2lwaGVyX2dyb3VwOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHMzMgotYnJjbWZfc2V0X2tleV9tZ210KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBjZmc4MDIxMV9jb25uZWN0X3BhcmFtcyAqc21lKQotewotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiA9IG5kZXZfdG9fY2ZnKGRldik7Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX3NlY3VyaXR5ICpzZWM7Ci0JczMyIHZhbCA9IDA7Ci0JczMyIGVyciA9IDA7Ci0KLQlpZiAoc21lLT5jcnlwdG8ubl9ha21fc3VpdGVzKSB7Ci0JCWVyciA9IGJyY21mX2Rldl9pbnR2YXJfZ2V0KGRldiwgIndwYV9hdXRoIiwgJnZhbCk7Ci0JCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoImNvdWxkIG5vdCBnZXQgd3BhX2F1dGggKCVkKVxuIiwgZXJyKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KLQkJaWYgKHZhbCAmIChXUEFfQVVUSF9QU0sgfCBXUEFfQVVUSF9VTlNQRUNJRklFRCkpIHsKLQkJCXN3aXRjaCAoc21lLT5jcnlwdG8uYWttX3N1aXRlc1swXSkgewotCQkJY2FzZSBXTEFOX0FLTV9TVUlURV84MDIxWDoKLQkJCQl2YWwgPSBXUEFfQVVUSF9VTlNQRUNJRklFRDsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0xBTl9BS01fU1VJVEVfUFNLOgotCQkJCXZhbCA9IFdQQV9BVVRIX1BTSzsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJV0xfRVJSKCJpbnZhbGlkIGNpcGhlciBncm91cCAoJWQpXG4iLAotCQkJCSAgICAgICBzbWUtPmNyeXB0by5jaXBoZXJfZ3JvdXApOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQl9IGVsc2UgaWYgKHZhbCAmIChXUEEyX0FVVEhfUFNLIHwgV1BBMl9BVVRIX1VOU1BFQ0lGSUVEKSkgewotCQkJc3dpdGNoIChzbWUtPmNyeXB0by5ha21fc3VpdGVzWzBdKSB7Ci0JCQljYXNlIFdMQU5fQUtNX1NVSVRFXzgwMjFYOgotCQkJCXZhbCA9IFdQQTJfQVVUSF9VTlNQRUNJRklFRDsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0xBTl9BS01fU1VJVEVfUFNLOgotCQkJCXZhbCA9IFdQQTJfQVVUSF9QU0s7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCVdMX0VSUigiaW52YWxpZCBjaXBoZXIgZ3JvdXAgKCVkKVxuIiwKLQkJCQkgICAgICAgc21lLT5jcnlwdG8uY2lwaGVyX2dyb3VwKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJfQotCi0JCVdMX0NPTk4oInNldHRpbmcgd3BhX2F1dGggdG8gJWRcbiIsIHZhbCk7Ci0JCWVyciA9IGJyY21mX2Rldl9pbnR2YXJfc2V0KGRldiwgIndwYV9hdXRoIiwgdmFsKTsKLQkJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJCVdMX0VSUigiY291bGQgbm90IHNldCB3cGFfYXV0aCAoJWQpXG4iLCBlcnIpOwotCQkJcmV0dXJuIGVycjsKLQkJfQotCX0KLQlzZWMgPSBicmNtZl9yZWFkX3Byb2YoY2ZnX3ByaXYsIFdMX1BST0ZfU0VDKTsKLQlzZWMtPndwYV9hdXRoID0gc21lLT5jcnlwdG8uYWttX3N1aXRlc1swXTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBzMzIKLWJyY21mX3NldF9zZXRfc2hhcmVka2V5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgICAgc3RydWN0IGNmZzgwMjExX2Nvbm5lY3RfcGFyYW1zICpzbWUpCi17Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2ID0gbmRldl90b19jZmcoZGV2KTsKLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfc2VjdXJpdHkgKnNlYzsKLQlzdHJ1Y3QgYnJjbWZfd3NlY19rZXkga2V5OwotCXMzMiB2YWw7Ci0JczMyIGVyciA9IDA7Ci0KLQlXTF9DT05OKCJrZXkgbGVuICglZClcbiIsIHNtZS0+a2V5X2xlbik7Ci0JaWYgKHNtZS0+a2V5X2xlbikgewotCQlzZWMgPSBicmNtZl9yZWFkX3Byb2YoY2ZnX3ByaXYsIFdMX1BST0ZfU0VDKTsKLQkJV0xfQ09OTigid3BhX3ZlcnNpb25zIDB4JXggY2lwaGVyX3BhaXJ3aXNlIDB4JXhcbiIsCi0JCSAgICAgICBzZWMtPndwYV92ZXJzaW9ucywgc2VjLT5jaXBoZXJfcGFpcndpc2UpOwotCQlpZiAoIQotCQkgICAgKHNlYy0+d3BhX3ZlcnNpb25zICYgKE5MODAyMTFfV1BBX1ZFUlNJT05fMSB8Ci0JCQkJCSAgTkw4MDIxMV9XUEFfVkVSU0lPTl8yKSkKLSYmIChzZWMtPmNpcGhlcl9wYWlyd2lzZSAmIChXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCB8Ci0JCQkgICAgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KSkpIHsKLQkJCW1lbXNldCgma2V5LCAwLCBzaXplb2Yoa2V5KSk7Ci0JCQlrZXkubGVuID0gKHUzMikgc21lLT5rZXlfbGVuOwotCQkJa2V5LmluZGV4ID0gKHUzMikgc21lLT5rZXlfaWR4OwotCQkJaWYgKHVubGlrZWx5KGtleS5sZW4gPiBzaXplb2Yoa2V5LmRhdGEpKSkgewotCQkJCVdMX0VSUigiVG9vIGxvbmcga2V5IGxlbmd0aCAoJXUpXG4iLCBrZXkubGVuKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJCW1lbWNweShrZXkuZGF0YSwgc21lLT5rZXksIGtleS5sZW4pOwotCQkJa2V5LmZsYWdzID0gQlJDTUZfUFJJTUFSWV9LRVk7Ci0JCQlzd2l0Y2ggKHNlYy0+Y2lwaGVyX3BhaXJ3aXNlKSB7Ci0JCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgotCQkJCWtleS5hbGdvID0gQ1JZUFRPX0FMR09fV0VQMTsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgotCQkJCWtleS5hbGdvID0gQ1JZUFRPX0FMR09fV0VQMTI4OwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlXTF9FUlIoIkludmFsaWQgYWxnb3JpdGhtICglZClcbiIsCi0JCQkJICAgICAgIHNtZS0+Y3J5cHRvLmNpcGhlcnNfcGFpcndpc2VbMF0pOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQkJLyogU2V0IHRoZSBuZXcga2V5L2luZGV4ICovCi0JCQlXTF9DT05OKCJrZXkgbGVuZ3RoICglZCkga2V5IGluZGV4ICglZCkgYWxnbyAoJWQpXG4iLAotCQkJICAgICAgIGtleS5sZW4sIGtleS5pbmRleCwga2V5LmFsZ28pOwotCQkJV0xfQ09OTigia2V5IFwiJXNcIlxuIiwga2V5LmRhdGEpOwotCQkJc3dhcF9rZXlfZnJvbV9CRSgma2V5KTsKLQkJCWVyciA9IGJyY21mX2Rldl9pb2N0bChkZXYsIEJSQ01GX0NfU0VUX0tFWSwgJmtleSwKLQkJCQkJc2l6ZW9mKGtleSkpOwotCQkJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJCQlXTF9FUlIoIldMQ19TRVRfS0VZIGVycm9yICglZClcbiIsIGVycik7Ci0JCQkJcmV0dXJuIGVycjsKLQkJCX0KLQkJCWlmIChzZWMtPmF1dGhfdHlwZSA9PSBOTDgwMjExX0FVVEhUWVBFX09QRU5fU1lTVEVNKSB7Ci0JCQkJV0xfQ09OTigic2V0IGF1dGhfdHlwZSB0byBzaGFyZWQga2V5XG4iKTsKLQkJCQl2YWwgPSAxOwkvKiBzaGFyZWQga2V5ICovCi0JCQkJZXJyID0gYnJjbWZfZGV2X2ludHZhcl9zZXQoZGV2LCAiYXV0aCIsIHZhbCk7Ci0JCQkJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJCQkJV0xfRVJSKCJzZXQgYXV0aCBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKLQkJCQkJcmV0dXJuIGVycjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHMzMgotYnJjbWZfY2ZnODAyMTFfY29ubmVjdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICAgc3RydWN0IGNmZzgwMjExX2Nvbm5lY3RfcGFyYW1zICpzbWUpCi17Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2ID0gd2lwaHlfdG9fY2ZnKHdpcGh5KTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4gPSBzbWUtPmNoYW5uZWw7Ci0Jc3RydWN0IGJyY21mX2pvaW5fcGFyYW1zIGpvaW5fcGFyYW1zOwotCXNpemVfdCBqb2luX3BhcmFtc19zaXplOwotCi0JczMyIGVyciA9IDA7Ci0KLQlXTF9UUkFDRSgiRW50ZXJcbiIpOwotCUNIRUNLX1NZU19VUCgpOwotCi0JaWYgKHVubGlrZWx5KCFzbWUtPnNzaWQpKSB7Ci0JCVdMX0VSUigiSW52YWxpZCBzc2lkXG4iKTsKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCX0KLQotCXNldF9iaXQoV0xfU1RBVFVTX0NPTk5FQ1RJTkcsICZjZmdfcHJpdi0+c3RhdHVzKTsKLQotCWlmIChjaGFuKSB7Ci0JCWNmZ19wcml2LT5jaGFubmVsID0KLQkJCWllZWU4MDIxMV9mcmVxdWVuY3lfdG9fY2hhbm5lbChjaGFuLT5jZW50ZXJfZnJlcSk7Ci0JCVdMX0NPTk4oImNoYW5uZWwgKCVkKSwgY2VudGVyX3JlcSAoJWQpXG4iLAotCQkJCWNmZ19wcml2LT5jaGFubmVsLCBjaGFuLT5jZW50ZXJfZnJlcSk7Ci0JfSBlbHNlCi0JCWNmZ19wcml2LT5jaGFubmVsID0gMDsKLQotCVdMX0lORk8oImllICglcCksIGllX2xlbiAoJXpkKVxuIiwgc21lLT5pZSwgc21lLT5pZV9sZW4pOwotCi0JZXJyID0gYnJjbWZfc2V0X3dwYV92ZXJzaW9uKGRldiwgc21lKTsKLQlpZiAoZXJyKSB7Ci0JCVdMX0VSUigid2xfc2V0X3dwYV92ZXJzaW9uIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZXJyID0gYnJjbWZfc2V0X2F1dGhfdHlwZShkZXYsIHNtZSk7Ci0JaWYgKGVycikgewotCQlXTF9FUlIoIndsX3NldF9hdXRoX3R5cGUgZmFpbGVkICglZClcbiIsIGVycik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQllcnIgPSBicmNtZl9zZXRfc2V0X2NpcGhlcihkZXYsIHNtZSk7Ci0JaWYgKGVycikgewotCQlXTF9FUlIoIndsX3NldF9zZXRfY2lwaGVyIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZXJyID0gYnJjbWZfc2V0X2tleV9tZ210KGRldiwgc21lKTsKLQlpZiAoZXJyKSB7Ci0JCVdMX0VSUigid2xfc2V0X2tleV9tZ210IGZhaWxlZCAoJWQpXG4iLCBlcnIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JZXJyID0gYnJjbWZfc2V0X3NldF9zaGFyZWRrZXkoZGV2LCBzbWUpOwotCWlmIChlcnIpIHsKLQkJV0xfRVJSKCJ3bF9zZXRfc2V0X3NoYXJlZGtleSBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKLQkJZ290byBkb25lOwotCX0KLQotCWJyY21mX3VwZGF0ZV9wcm9mKGNmZ19wcml2LCBOVUxMLCBzbWUtPmJzc2lkLCBXTF9QUk9GX0JTU0lEKTsKLQkvKgotCSAqKiAgSm9pbiB3aXRoIHNwZWNpZmljIEJTU0lEIGFuZCBjYWNoZWQgU1NJRAotCSAqKiAgSWYgU1NJRCBpcyB6ZXJvIGpvaW4gYmFzZWQgb24gQlNTSUQgb25seQotCSAqLwotCW1lbXNldCgmam9pbl9wYXJhbXMsIDAsIHNpemVvZihqb2luX3BhcmFtcykpOwotCWpvaW5fcGFyYW1zX3NpemUgPSBzaXplb2Yoam9pbl9wYXJhbXMuc3NpZCk7Ci0KLQlqb2luX3BhcmFtcy5zc2lkLlNTSURfbGVuID0gbWluKHNpemVvZihqb2luX3BhcmFtcy5zc2lkLlNTSUQpLCBzbWUtPnNzaWRfbGVuKTsKLQltZW1jcHkoJmpvaW5fcGFyYW1zLnNzaWQuU1NJRCwgc21lLT5zc2lkLCBqb2luX3BhcmFtcy5zc2lkLlNTSURfbGVuKTsKLQlqb2luX3BhcmFtcy5zc2lkLlNTSURfbGVuID0gY3B1X3RvX2xlMzIoam9pbl9wYXJhbXMuc3NpZC5TU0lEX2xlbik7Ci0JYnJjbWZfdXBkYXRlX3Byb2YoY2ZnX3ByaXYsIE5VTEwsICZqb2luX3BhcmFtcy5zc2lkLCBXTF9QUk9GX1NTSUQpOwotCi0JaWYgKHNtZS0+YnNzaWQpCi0JCW1lbWNweShqb2luX3BhcmFtcy5wYXJhbXMuYnNzaWQsIHNtZS0+YnNzaWQsIEVUSF9BTEVOKTsKLQllbHNlCi0JCW1lbWNweShqb2luX3BhcmFtcy5wYXJhbXMuYnNzaWQsIGV0aGVyX2JjYXN0LCBFVEhfQUxFTik7Ci0KLQlpZiAoam9pbl9wYXJhbXMuc3NpZC5TU0lEX2xlbiA8IElFRUU4MDIxMV9NQVhfU1NJRF9MRU4pIHsKLQkJV0xfQ09OTigic3NpZCBcIiVzXCIsIGxlbiAoJWQpXG4iLAotCQkgICAgICAgam9pbl9wYXJhbXMuc3NpZC5TU0lELCBqb2luX3BhcmFtcy5zc2lkLlNTSURfbGVuKTsKLQl9Ci0KLQlicmNtZl9jaF90b19jaGFuc3BlYyhjZmdfcHJpdi0+Y2hhbm5lbCwKLQkJCSAgICAgJmpvaW5fcGFyYW1zLCAmam9pbl9wYXJhbXNfc2l6ZSk7Ci0JZXJyID0gYnJjbWZfZGV2X2lvY3RsKGRldiwgQlJDTUZfQ19TRVRfU1NJRCwKLQkJCSAgICZqb2luX3BhcmFtcywgam9pbl9wYXJhbXNfc2l6ZSk7Ci0JaWYgKGVycikKLQkJV0xfRVJSKCJXTENfU0VUX1NTSUQgZmFpbGVkICglZClcbiIsIGVycik7Ci0KLWRvbmU6Ci0JaWYgKGVycikKLQkJY2xlYXJfYml0KFdMX1NUQVRVU19DT05ORUNUSU5HLCAmY2ZnX3ByaXYtPnN0YXR1cyk7Ci0JV0xfVFJBQ0UoIkV4aXRcbiIpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBzMzIKLWJyY21mX2NmZzgwMjExX2Rpc2Nvbm5lY3Qoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgICAgIHUxNiByZWFzb25fY29kZSkKLXsKLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYgPSB3aXBoeV90b19jZmcod2lwaHkpOwotCXN0cnVjdCBicmNtZl9zY2JfdmFsIHNjYnZhbDsKLQlzMzIgZXJyID0gMDsKLQotCVdMX1RSQUNFKCJFbnRlci4gUmVhc29uIGNvZGUgPSAlZFxuIiwgcmVhc29uX2NvZGUpOwotCUNIRUNLX1NZU19VUCgpOwotCi0JY2xlYXJfYml0KFdMX1NUQVRVU19DT05ORUNURUQsICZjZmdfcHJpdi0+c3RhdHVzKTsKLQotCXNjYnZhbC52YWwgPSByZWFzb25fY29kZTsKLQltZW1jcHkoJnNjYnZhbC5lYSwgYnJjbWZfcmVhZF9wcm9mKGNmZ19wcml2LCBXTF9QUk9GX0JTU0lEKSwgRVRIX0FMRU4pOwotCXNjYnZhbC52YWwgPSBjcHVfdG9fbGUzMihzY2J2YWwudmFsKTsKLQllcnIgPSBicmNtZl9kZXZfaW9jdGwoZGV2LCBCUkNNRl9DX0RJU0FTU09DLCAmc2NidmFsLAotCQkJc2l6ZW9mKHN0cnVjdCBicmNtZl9zY2JfdmFsKSk7Ci0JaWYgKHVubGlrZWx5KGVycikpCi0JCVdMX0VSUigiZXJyb3IgKCVkKVxuIiwgZXJyKTsKLQotCWNmZ19wcml2LT5saW5rX3VwID0gZmFsc2U7Ci0KLQlXTF9UUkFDRSgiRXhpdFxuIik7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHMzMgotYnJjbWZfY2ZnODAyMTFfc2V0X3R4X3Bvd2VyKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkgZW51bSBubDgwMjExX3R4X3Bvd2VyX3NldHRpbmcgdHlwZSwgczMyIGRibSkKLXsKLQotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiA9IHdpcGh5X3RvX2NmZyh3aXBoeSk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBjZmdfdG9fbmRldihjZmdfcHJpdik7Ci0JdTE2IHR4cHdybXc7Ci0JczMyIGVyciA9IDA7Ci0JczMyIGRpc2FibGUgPSAwOwotCi0JV0xfVFJBQ0UoIkVudGVyXG4iKTsKLQlDSEVDS19TWVNfVVAoKTsKLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgTkw4MDIxMV9UWF9QT1dFUl9BVVRPTUFUSUM6Ci0JCWJyZWFrOwotCWNhc2UgTkw4MDIxMV9UWF9QT1dFUl9MSU1JVEVEOgotCQlpZiAoZGJtIDwgMCkgewotCQkJV0xfRVJSKCJUWF9QT1dFUl9MSU1JVEVEIC0gZGJtIGlzIG5lZ2F0aXZlXG4iKTsKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBOTDgwMjExX1RYX1BPV0VSX0ZJWEVEOgotCQlpZiAoZGJtIDwgMCkgewotCQkJV0xfRVJSKCJUWF9QT1dFUl9GSVhFRCAtIGRibSBpcyBuZWdhdGl2ZVxuIik7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0JCWJyZWFrOwotCX0KLQkvKiBNYWtlIHN1cmUgcmFkaW8gaXMgb2ZmIG9yIG9uIGFzIGZhciBhcyBzb2Z0d2FyZSBpcyBjb25jZXJuZWQgKi8KLQlkaXNhYmxlID0gV0xfUkFESU9fU1dfRElTQUJMRSA8PCAxNjsKLQlkaXNhYmxlID0gY3B1X3RvX2xlMzIoZGlzYWJsZSk7Ci0JZXJyID0gYnJjbWZfZGV2X2lvY3RsKG5kZXYsIEJSQ01GX0NfU0VUX1JBRElPLCAmZGlzYWJsZSwgc2l6ZW9mKGRpc2FibGUpKTsKLQlpZiAodW5saWtlbHkoZXJyKSkKLQkJV0xfRVJSKCJXTENfU0VUX1JBRElPIGVycm9yICglZClcbiIsIGVycik7Ci0KLQlpZiAoZGJtID4gMHhmZmZmKQotCQl0eHB3cm13ID0gMHhmZmZmOwotCWVsc2UKLQkJdHhwd3JtdyA9ICh1MTYpIGRibTsKLQllcnIgPSBicmNtZl9kZXZfaW50dmFyX3NldChuZGV2LCAicXR4cG93ZXIiLAotCQkJKHMzMikgKGJyY211X213X3RvX3FkYm0odHhwd3JtdykpKTsKLQlpZiAodW5saWtlbHkoZXJyKSkKLQkJV0xfRVJSKCJxdHhwb3dlciBlcnJvciAoJWQpXG4iLCBlcnIpOwotCWNmZ19wcml2LT5jb25mLT50eF9wb3dlciA9IGRibTsKLQotZG9uZToKLQlXTF9UUkFDRSgiRXhpdFxuIik7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHMzMiBicmNtZl9jZmc4MDIxMV9nZXRfdHhfcG93ZXIoc3RydWN0IHdpcGh5ICp3aXBoeSwgczMyICpkYm0pCi17Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2ID0gd2lwaHlfdG9fY2ZnKHdpcGh5KTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGNmZ190b19uZGV2KGNmZ19wcml2KTsKLQlzMzIgdHhwd3JkYm07Ci0JdTggcmVzdWx0OwotCXMzMiBlcnIgPSAwOwotCi0JV0xfVFJBQ0UoIkVudGVyXG4iKTsKLQlDSEVDS19TWVNfVVAoKTsKLQotCWVyciA9IGJyY21mX2Rldl9pbnR2YXJfZ2V0KG5kZXYsICJxdHhwb3dlciIsICZ0eHB3cmRibSk7Ci0JaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCJlcnJvciAoJWQpXG4iLCBlcnIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JcmVzdWx0ID0gKHU4KSAodHhwd3JkYm0gJiB+V0xfVFhQV1JfT1ZFUlJJREUpOwotCSpkYm0gPSAoczMyKSBicmNtdV9xZGJtX3RvX213KHJlc3VsdCk7Ci0KLWRvbmU6Ci0JV0xfVFJBQ0UoIkV4aXRcbiIpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBzMzIKLWJyY21mX2NmZzgwMjExX2NvbmZpZ19kZWZhdWx0X2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgIHU4IGtleV9pZHgsIGJvb2wgdW5pY2FzdCwgYm9vbCBtdWx0aWNhc3QpCi17Ci0JdTMyIGluZGV4OwotCXMzMiB3c2VjOwotCXMzMiBlcnIgPSAwOwotCi0JV0xfVFJBQ0UoIkVudGVyXG4iKTsKLQlXTF9DT05OKCJrZXkgaW5kZXggKCVkKVxuIiwga2V5X2lkeCk7Ci0JQ0hFQ0tfU1lTX1VQKCk7Ci0KLQllcnIgPSBicmNtZl9kZXZfaW9jdGwoZGV2LCBCUkNNRl9DX0dFVF9XU0VDLCAmd3NlYywgc2l6ZW9mKHdzZWMpKTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoIldMQ19HRVRfV1NFQyBlcnJvciAoJWQpXG4iLCBlcnIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0Jd3NlYyA9IGxlMzJfdG9fY3B1KHdzZWMpOwotCWlmICh3c2VjICYgV0VQX0VOQUJMRUQpIHsKLQkJLyogSnVzdCBzZWxlY3QgYSBuZXcgY3VycmVudCBrZXkgKi8KLQkJaW5kZXggPSAodTMyKSBrZXlfaWR4OwotCQlpbmRleCA9IGNwdV90b19sZTMyKGluZGV4KTsKLQkJZXJyID0gYnJjbWZfZGV2X2lvY3RsKGRldiwgQlJDTUZfQ19TRVRfS0VZX1BSSU1BUlksICZpbmRleCwKLQkJCQlzaXplb2YoaW5kZXgpKTsKLQkJaWYgKHVubGlrZWx5KGVycikpCi0JCQlXTF9FUlIoImVycm9yICglZClcbiIsIGVycik7Ci0JfQotZG9uZToKLQlXTF9UUkFDRSgiRXhpdFxuIik7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHMzMgotYnJjbWZfYWRkX2tleWV4dChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCSAgICAgIHU4IGtleV9pZHgsIGNvbnN0IHU4ICptYWNfYWRkciwgc3RydWN0IGtleV9wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3QgYnJjbWZfd3NlY19rZXkga2V5OwotCXMzMiBlcnIgPSAwOwotCi0JbWVtc2V0KCZrZXksIDAsIHNpemVvZihrZXkpKTsKLQlrZXkuaW5kZXggPSAodTMyKSBrZXlfaWR4OwotCS8qIEluc3RlYWQgb2YgYmNhc3QgZm9yIGVhIGFkZHJlc3MgZm9yIGRlZmF1bHQgd2VwIGtleXMsCi0JCSBkcml2ZXIgbmVlZHMgaXQgdG8gYmUgTnVsbCAqLwotCWlmICghaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIobWFjX2FkZHIpKQotCQltZW1jcHkoKGNoYXIgKikma2V5LmVhLCAodm9pZCAqKW1hY19hZGRyLCBFVEhfQUxFTik7Ci0Ja2V5LmxlbiA9ICh1MzIpIHBhcmFtcy0+a2V5X2xlbjsKLQkvKiBjaGVjayBmb3Iga2V5IGluZGV4IGNoYW5nZSAqLwotCWlmIChrZXkubGVuID09IDApIHsKLQkJLyoga2V5IGRlbGV0ZSAqLwotCQlzd2FwX2tleV9mcm9tX0JFKCZrZXkpOwotCQllcnIgPSBicmNtZl9kZXZfaW9jdGwoZGV2LCBCUkNNRl9DX1NFVF9LRVksICZrZXksIHNpemVvZihrZXkpKTsKLQkJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJCVdMX0VSUigia2V5IGRlbGV0ZSBlcnJvciAoJWQpXG4iLCBlcnIpOwotCQkJcmV0dXJuIGVycjsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChrZXkubGVuID4gc2l6ZW9mKGtleS5kYXRhKSkgewotCQkJV0xfRVJSKCJJbnZhbGlkIGtleSBsZW5ndGggKCVkKVxuIiwga2V5Lmxlbik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCVdMX0NPTk4oIlNldHRpbmcgdGhlIGtleSBpbmRleCAlZFxuIiwga2V5LmluZGV4KTsKLQkJbWVtY3B5KGtleS5kYXRhLCBwYXJhbXMtPmtleSwga2V5Lmxlbik7Ci0KLQkJaWYgKHBhcmFtcy0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVApIHsKLQkJCXU4IGtleWJ1Zls4XTsKLQkJCW1lbWNweShrZXlidWYsICZrZXkuZGF0YVsyNF0sIHNpemVvZihrZXlidWYpKTsKLQkJCW1lbWNweSgma2V5LmRhdGFbMjRdLCAma2V5LmRhdGFbMTZdLCBzaXplb2Yoa2V5YnVmKSk7Ci0JCQltZW1jcHkoJmtleS5kYXRhWzE2XSwga2V5YnVmLCBzaXplb2Yoa2V5YnVmKSk7Ci0JCX0KLQotCQkvKiBpZiBJV19FTkNPREVfRVhUX1JYX1NFUV9WQUxJRCBzZXQgKi8KLQkJaWYgKHBhcmFtcy0+c2VxICYmIHBhcmFtcy0+c2VxX2xlbiA9PSA2KSB7Ci0JCQkvKiByeCBpdiAqLwotCQkJdTggKml2cHRyOwotCQkJaXZwdHIgPSAodTggKikgcGFyYW1zLT5zZXE7Ci0JCQlrZXkucnhpdi5oaSA9IChpdnB0cls1XSA8PCAyNCkgfCAoaXZwdHJbNF0gPDwgMTYpIHwKLQkJCSAgICAoaXZwdHJbM10gPDwgOCkgfCBpdnB0clsyXTsKLQkJCWtleS5yeGl2LmxvID0gKGl2cHRyWzFdIDw8IDgpIHwgaXZwdHJbMF07Ci0JCQlrZXkuaXZfaW5pdGlhbGl6ZWQgPSB0cnVlOwotCQl9Ci0KLQkJc3dpdGNoIChwYXJhbXMtPmNpcGhlcikgewotCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgotCQkJa2V5LmFsZ28gPSBDUllQVE9fQUxHT19XRVAxOwotCQkJV0xfQ09OTigiV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDBcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgotCQkJa2V5LmFsZ28gPSBDUllQVE9fQUxHT19XRVAxMjg7Ci0JCQlXTF9DT05OKCJXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDRcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoKLQkJCWtleS5hbGdvID0gQ1JZUFRPX0FMR09fVEtJUDsKLQkJCVdMX0NPTk4oIldMQU5fQ0lQSEVSX1NVSVRFX1RLSVBcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUM6Ci0JCQlrZXkuYWxnbyA9IENSWVBUT19BTEdPX0FFU19DQ007Ci0JCQlXTF9DT05OKCJXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQ1xuIik7Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgotCQkJa2V5LmFsZ28gPSBDUllQVE9fQUxHT19BRVNfQ0NNOwotCQkJV0xfQ09OTigiV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUFxuIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCVdMX0VSUigiSW52YWxpZCBjaXBoZXIgKDB4JXgpXG4iLCBwYXJhbXMtPmNpcGhlcik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlzd2FwX2tleV9mcm9tX0JFKCZrZXkpOwotCi0JCWJyY21mX25ldGRldl93YWl0X3BlbmQ4MDIxeChkZXYpOwotCQllcnIgPSBicmNtZl9kZXZfaW9jdGwoZGV2LCBCUkNNRl9DX1NFVF9LRVksICZrZXksIHNpemVvZihrZXkpKTsKLQkJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJCVdMX0VSUigiV0xDX1NFVF9LRVkgZXJyb3IgKCVkKVxuIiwgZXJyKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KLQl9Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHMzMgotYnJjbWZfY2ZnODAyMTFfYWRkX2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICAgdTgga2V5X2lkeCwgYm9vbCBwYWlyd2lzZSwgY29uc3QgdTggKm1hY19hZGRyLAotCQkgICAgc3RydWN0IGtleV9wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3QgYnJjbWZfd3NlY19rZXkga2V5OwotCXMzMiB2YWw7Ci0JczMyIHdzZWM7Ci0JczMyIGVyciA9IDA7Ci0JdTgga2V5YnVmWzhdOwotCi0JV0xfVFJBQ0UoIkVudGVyXG4iKTsKLQlXTF9DT05OKCJrZXkgaW5kZXggKCVkKVxuIiwga2V5X2lkeCk7Ci0JQ0hFQ0tfU1lTX1VQKCk7Ci0KLQlpZiAobWFjX2FkZHIpIHsKLQkJV0xfVFJBQ0UoIkV4aXQiKTsKLQkJcmV0dXJuIGJyY21mX2FkZF9rZXlleHQod2lwaHksIGRldiwga2V5X2lkeCwgbWFjX2FkZHIsIHBhcmFtcyk7Ci0JfQotCW1lbXNldCgma2V5LCAwLCBzaXplb2Yoa2V5KSk7Ci0KLQlrZXkubGVuID0gKHUzMikgcGFyYW1zLT5rZXlfbGVuOwotCWtleS5pbmRleCA9ICh1MzIpIGtleV9pZHg7Ci0KLQlpZiAodW5saWtlbHkoa2V5LmxlbiA+IHNpemVvZihrZXkuZGF0YSkpKSB7Ci0JCVdMX0VSUigiVG9vIGxvbmcga2V5IGxlbmd0aCAoJXUpXG4iLCBrZXkubGVuKTsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQltZW1jcHkoa2V5LmRhdGEsIHBhcmFtcy0+a2V5LCBrZXkubGVuKTsKLQotCWtleS5mbGFncyA9IEJSQ01GX1BSSU1BUllfS0VZOwotCXN3aXRjaCAocGFyYW1zLT5jaXBoZXIpIHsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgotCQlrZXkuYWxnbyA9IENSWVBUT19BTEdPX1dFUDE7Ci0JCVdMX0NPTk4oIldMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6Ci0JCWtleS5hbGdvID0gQ1JZUFRPX0FMR09fV0VQMTI4OwotCQlXTF9DT05OKCJXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDRcbiIpOwotCQlicmVhazsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6Ci0JCW1lbWNweShrZXlidWYsICZrZXkuZGF0YVsyNF0sIHNpemVvZihrZXlidWYpKTsKLQkJbWVtY3B5KCZrZXkuZGF0YVsyNF0sICZrZXkuZGF0YVsxNl0sIHNpemVvZihrZXlidWYpKTsKLQkJbWVtY3B5KCZrZXkuZGF0YVsxNl0sIGtleWJ1Ziwgc2l6ZW9mKGtleWJ1ZikpOwotCQlrZXkuYWxnbyA9IENSWVBUT19BTEdPX1RLSVA7Ci0JCVdMX0NPTk4oIldMQU5fQ0lQSEVSX1NVSVRFX1RLSVBcbiIpOwotCQlicmVhazsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDOgotCQlrZXkuYWxnbyA9IENSWVBUT19BTEdPX0FFU19DQ007Ci0JCVdMX0NPTk4oIldMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgotCQlrZXkuYWxnbyA9IENSWVBUT19BTEdPX0FFU19DQ007Ci0JCVdMX0NPTk4oIldMQU5fQ0lQSEVSX1NVSVRFX0NDTVBcbiIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlXTF9FUlIoIkludmFsaWQgY2lwaGVyICgweCV4KVxuIiwgcGFyYW1zLT5jaXBoZXIpOwotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogU2V0IHRoZSBuZXcga2V5L2luZGV4ICovCi0Jc3dhcF9rZXlfZnJvbV9CRSgma2V5KTsKLQllcnIgPSBicmNtZl9kZXZfaW9jdGwoZGV2LCBCUkNNRl9DX1NFVF9LRVksICZrZXksIHNpemVvZihrZXkpKTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoIldMQ19TRVRfS0VZIGVycm9yICglZClcbiIsIGVycik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQl2YWwgPSBXRVBfRU5BQkxFRDsKLQllcnIgPSBicmNtZl9kZXZfaW50dmFyX2dldChkZXYsICJ3c2VjIiwgJndzZWMpOwotCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigiZ2V0IHdzZWMgZXJyb3IgKCVkKVxuIiwgZXJyKTsKLQkJZ290byBkb25lOwotCX0KLQl3c2VjICY9IH4oV0VQX0VOQUJMRUQpOwotCXdzZWMgfD0gdmFsOwotCWVyciA9IGJyY21mX2Rldl9pbnR2YXJfc2V0KGRldiwgIndzZWMiLCB3c2VjKTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoInNldCB3c2VjIGVycm9yICglZClcbiIsIGVycik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQl2YWwgPSAxOwkJLyogYXNzdW1lIHNoYXJlZCBrZXkuIG90aGVyd2lzZSAwICovCi0JdmFsID0gY3B1X3RvX2xlMzIodmFsKTsKLQllcnIgPSBicmNtZl9kZXZfaW9jdGwoZGV2LCBCUkNNRl9DX1NFVF9BVVRILCAmdmFsLCBzaXplb2YodmFsKSk7Ci0JaWYgKHVubGlrZWx5KGVycikpCi0JCVdMX0VSUigiV0xDX1NFVF9BVVRIIGVycm9yICglZClcbiIsIGVycik7Ci1kb25lOgotCVdMX1RSQUNFKCJFeGl0XG4iKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgczMyCi1icmNtZl9jZmc4MDIxMV9kZWxfa2V5KHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgICB1OCBrZXlfaWR4LCBib29sIHBhaXJ3aXNlLCBjb25zdCB1OCAqbWFjX2FkZHIpCi17Ci0Jc3RydWN0IGJyY21mX3dzZWNfa2V5IGtleTsKLQlzMzIgZXJyID0gMDsKLQlzMzIgdmFsOwotCXMzMiB3c2VjOwotCi0JV0xfVFJBQ0UoIkVudGVyXG4iKTsKLQlDSEVDS19TWVNfVVAoKTsKLQltZW1zZXQoJmtleSwgMCwgc2l6ZW9mKGtleSkpOwotCi0Ja2V5LmluZGV4ID0gKHUzMikga2V5X2lkeDsKLQlrZXkuZmxhZ3MgPSBCUkNNRl9QUklNQVJZX0tFWTsKLQlrZXkuYWxnbyA9IENSWVBUT19BTEdPX09GRjsKLQotCVdMX0NPTk4oImtleSBpbmRleCAoJWQpXG4iLCBrZXlfaWR4KTsKLQkvKiBTZXQgdGhlIG5ldyBrZXkvaW5kZXggKi8KLQlzd2FwX2tleV9mcm9tX0JFKCZrZXkpOwotCWVyciA9IGJyY21mX2Rldl9pb2N0bChkZXYsIEJSQ01GX0NfU0VUX0tFWSwgJmtleSwgc2l6ZW9mKGtleSkpOwotCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCWlmIChlcnIgPT0gLUVJTlZBTCkgewotCQkJaWYgKGtleS5pbmRleCA+PSBET1QxMV9NQVhfREVGQVVMVF9LRVlTKQotCQkJCS8qIHdlIGlnbm9yZSB0aGlzIGtleSBpbmRleCBpbiB0aGlzIGNhc2UgKi8KLQkJCQlXTF9FUlIoImludmFsaWQga2V5IGluZGV4ICglZClcbiIsIGtleV9pZHgpOwotCQl9IGVsc2UKLQkJCVdMX0VSUigiV0xDX1NFVF9LRVkgZXJyb3IgKCVkKVxuIiwgZXJyKTsKLQotCQkvKiBJZ25vcmUgdGhpcyBlcnJvciwgbWF5IGhhcHBlbiBkdXJpbmcgRElTQVNTT0MgKi8KLQkJZXJyID0gLUVBR0FJTjsKLQkJZ290byBkb25lOwotCX0KLQotCXZhbCA9IDA7Ci0JZXJyID0gYnJjbWZfZGV2X2ludHZhcl9nZXQoZGV2LCAid3NlYyIsICZ3c2VjKTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoImdldCB3c2VjIGVycm9yICglZClcbiIsIGVycik7Ci0JCS8qIElnbm9yZSB0aGlzIGVycm9yLCBtYXkgaGFwcGVuIGR1cmluZyBESVNBU1NPQyAqLwotCQllcnIgPSAtRUFHQUlOOwotCQlnb3RvIGRvbmU7Ci0JfQotCXdzZWMgJj0gfihXRVBfRU5BQkxFRCk7Ci0Jd3NlYyB8PSB2YWw7Ci0JZXJyID0gYnJjbWZfZGV2X2ludHZhcl9zZXQoZGV2LCAid3NlYyIsIHdzZWMpOwotCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigic2V0IHdzZWMgZXJyb3IgKCVkKVxuIiwgZXJyKTsKLQkJLyogSWdub3JlIHRoaXMgZXJyb3IsIG1heSBoYXBwZW4gZHVyaW5nIERJU0FTU09DICovCi0JCWVyciA9IC1FQUdBSU47Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQl2YWwgPSAwOwkJLyogYXNzdW1lIG9wZW4ga2V5LiBvdGhlcndpc2UgMSAqLwotCXZhbCA9IGNwdV90b19sZTMyKHZhbCk7Ci0JZXJyID0gYnJjbWZfZGV2X2lvY3RsKGRldiwgQlJDTUZfQ19TRVRfQVVUSCwgJnZhbCwgc2l6ZW9mKHZhbCkpOwotCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigiV0xDX1NFVF9BVVRIIGVycm9yICglZClcbiIsIGVycik7Ci0JCS8qIElnbm9yZSB0aGlzIGVycm9yLCBtYXkgaGFwcGVuIGR1cmluZyBESVNBU1NPQyAqLwotCQllcnIgPSAtRUFHQUlOOwotCX0KLWRvbmU6Ci0JV0xfVFJBQ0UoIkV4aXRcbiIpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBzMzIKLWJyY21mX2NmZzgwMjExX2dldF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgIHU4IGtleV9pZHgsIGJvb2wgcGFpcndpc2UsIGNvbnN0IHU4ICptYWNfYWRkciwgdm9pZCAqY29va2llLAotCQkgICAgdm9pZCAoKmNhbGxiYWNrKSAodm9pZCAqY29va2llLCBzdHJ1Y3Qga2V5X3BhcmFtcyAqIHBhcmFtcykpCi17Ci0Jc3RydWN0IGtleV9wYXJhbXMgcGFyYW1zOwotCXN0cnVjdCBicmNtZl93c2VjX2tleSBrZXk7Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2ID0gd2lwaHlfdG9fY2ZnKHdpcGh5KTsKLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfc2VjdXJpdHkgKnNlYzsKLQlzMzIgd3NlYzsKLQlzMzIgZXJyID0gMDsKLQotCVdMX1RSQUNFKCJFbnRlclxuIik7Ci0JV0xfQ09OTigia2V5IGluZGV4ICglZClcbiIsIGtleV9pZHgpOwotCUNIRUNLX1NZU19VUCgpOwotCi0JbWVtc2V0KCZrZXksIDAsIHNpemVvZihrZXkpKTsKLQlrZXkuaW5kZXggPSBrZXlfaWR4OwotCXN3YXBfa2V5X3RvX0JFKCZrZXkpOwotCW1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7Ci0JcGFyYW1zLmtleV9sZW4gPSAodTgpIG1pbl90KHU4LCBXTEFOX01BWF9LRVlfTEVOLCBrZXkubGVuKTsKLQltZW1jcHkocGFyYW1zLmtleSwga2V5LmRhdGEsIHBhcmFtcy5rZXlfbGVuKTsKLQotCWVyciA9IGJyY21mX2Rldl9pb2N0bChkZXYsIEJSQ01GX0NfR0VUX1dTRUMsICZ3c2VjLCBzaXplb2Yod3NlYykpOwotCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigiV0xDX0dFVF9XU0VDIGVycm9yICglZClcbiIsIGVycik7Ci0JCS8qIElnbm9yZSB0aGlzIGVycm9yLCBtYXkgaGFwcGVuIGR1cmluZyBESVNBU1NPQyAqLwotCQllcnIgPSAtRUFHQUlOOwotCQlnb3RvIGRvbmU7Ci0JfQotCXdzZWMgPSBsZTMyX3RvX2NwdSh3c2VjKTsKLQlzd2l0Y2ggKHdzZWMpIHsKLQljYXNlIFdFUF9FTkFCTEVEOgotCQlzZWMgPSBicmNtZl9yZWFkX3Byb2YoY2ZnX3ByaXYsIFdMX1BST0ZfU0VDKTsKLQkJaWYgKHNlYy0+Y2lwaGVyX3BhaXJ3aXNlICYgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDApIHsKLQkJCXBhcmFtcy5jaXBoZXIgPSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDsKLQkJCVdMX0NPTk4oIldMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwXG4iKTsKLQkJfSBlbHNlIGlmIChzZWMtPmNpcGhlcl9wYWlyd2lzZSAmIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkgewotCQkJcGFyYW1zLmNpcGhlciA9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDsKLQkJCVdMX0NPTk4oIldMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNFxuIik7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBUS0lQX0VOQUJMRUQ6Ci0JCXBhcmFtcy5jaXBoZXIgPSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOwotCQlXTF9DT05OKCJXTEFOX0NJUEhFUl9TVUlURV9US0lQXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRVNfRU5BQkxFRDoKLQkJcGFyYW1zLmNpcGhlciA9IFdMQU5fQ0lQSEVSX1NVSVRFX0FFU19DTUFDOwotCQlXTF9DT05OKCJXTEFOX0NJUEhFUl9TVUlURV9BRVNfQ01BQ1xuIik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVdMX0VSUigiSW52YWxpZCBhbGdvICgweCV4KVxuIiwgd3NlYyk7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0JY2FsbGJhY2soY29va2llLCAmcGFyYW1zKTsKLQotZG9uZToKLQlXTF9UUkFDRSgiRXhpdFxuIik7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHMzMgotYnJjbWZfY2ZnODAyMTFfY29uZmlnX2RlZmF1bHRfbWdtdF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTgga2V5X2lkeCkKLXsKLQlXTF9JTkZPKCJOb3Qgc3VwcG9ydGVkXG4iKTsKLQotCUNIRUNLX1NZU19VUCgpOwotCXJldHVybiAtRU9QTk9UU1VQUDsKLX0KLQotc3RhdGljIHMzMgotYnJjbWZfY2ZnODAyMTFfZ2V0X3N0YXRpb24oc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCXU4ICptYWMsIHN0cnVjdCBzdGF0aW9uX2luZm8gKnNpbmZvKQotewotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiA9IHdpcGh5X3RvX2NmZyh3aXBoeSk7Ci0Jc3RydWN0IGJyY21mX3NjYl92YWwgc2NiX3ZhbDsKLQlpbnQgcnNzaTsKLQlzMzIgcmF0ZTsKLQlzMzIgZXJyID0gMDsKLQl1OCAqYnNzaWQgPSBicmNtZl9yZWFkX3Byb2YoY2ZnX3ByaXYsIFdMX1BST0ZfQlNTSUQpOwotCi0JV0xfVFJBQ0UoIkVudGVyXG4iKTsKLQlDSEVDS19TWVNfVVAoKTsKLQotCWlmICh1bmxpa2VseQotCSAgICAobWVtY21wKG1hYywgYnNzaWQsIEVUSF9BTEVOKSkpIHsKLQkJV0xfRVJSKCJXcm9uZyBNYWMgYWRkcmVzcyBjZmdfbWFjLSVYOiVYOiVYOiVYOiVYOiVYIgotCQkJIndsX2Jzc2lkLSVYOiVYOiVYOiVYOiVYOiVYXG4iLAotCQkJbWFjWzBdLCBtYWNbMV0sIG1hY1syXSwgbWFjWzNdLCBtYWNbNF0sIG1hY1s1XSwKLQkJCWJzc2lkWzBdLCBic3NpZFsxXSwgYnNzaWRbMl0sIGJzc2lkWzNdLAotCQkJYnNzaWRbNF0sIGJzc2lkWzVdKTsKLQkJZXJyID0gLUVOT0VOVDsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIFJlcG9ydCB0aGUgY3VycmVudCB0eCByYXRlICovCi0JZXJyID0gYnJjbWZfZGV2X2lvY3RsKGRldiwgQlJDTUZfQ19HRVRfUkFURSwgJnJhdGUsIHNpemVvZihyYXRlKSk7Ci0JaWYgKGVycikgewotCQlXTF9FUlIoIkNvdWxkIG5vdCBnZXQgcmF0ZSAoJWQpXG4iLCBlcnIpOwotCX0gZWxzZSB7Ci0JCXJhdGUgPSBsZTMyX3RvX2NwdShyYXRlKTsKLQkJc2luZm8tPmZpbGxlZCB8PSBTVEFUSU9OX0lORk9fVFhfQklUUkFURTsKLQkJc2luZm8tPnR4cmF0ZS5sZWdhY3kgPSByYXRlICogNTsKLQkJV0xfQ09OTigiUmF0ZSAlZCBNYnBzXG4iLCByYXRlIC8gMik7Ci0JfQotCi0JaWYgKHRlc3RfYml0KFdMX1NUQVRVU19DT05ORUNURUQsICZjZmdfcHJpdi0+c3RhdHVzKSkgewotCQlzY2JfdmFsLnZhbCA9IDA7Ci0JCWVyciA9IGJyY21mX2Rldl9pb2N0bChkZXYsIEJSQ01GX0NfR0VUX1JTU0ksICZzY2JfdmFsLAotCQkJCXNpemVvZihzdHJ1Y3QgYnJjbWZfc2NiX3ZhbCkpOwotCQlpZiAodW5saWtlbHkoZXJyKSkgewotCQkJV0xfRVJSKCJDb3VsZCBub3QgZ2V0IHJzc2kgKCVkKVxuIiwgZXJyKTsKLQkJfQotCQlyc3NpID0gbGUzMl90b19jcHUoc2NiX3ZhbC52YWwpOwotCQlzaW5mby0+ZmlsbGVkIHw9IFNUQVRJT05fSU5GT19TSUdOQUw7Ci0JCXNpbmZvLT5zaWduYWwgPSByc3NpOwotCQlXTF9DT05OKCJSU1NJICVkIGRCbVxuIiwgcnNzaSk7Ci0JfQotCi1kb25lOgotCVdMX1RSQUNFKCJFeGl0XG4iKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgczMyCi1icmNtZl9jZmc4MDIxMV9zZXRfcG93ZXJfbWdtdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgYm9vbCBlbmFibGVkLCBzMzIgdGltZW91dCkKLXsKLQlzMzIgcG07Ci0JczMyIGVyciA9IDA7Ci0KLQlXTF9UUkFDRSgiRW50ZXJcbiIpOwotCUNIRUNLX1NZU19VUCgpOwotCi0JcG0gPSBlbmFibGVkID8gUE1fRkFTVCA6IFBNX09GRjsKLQlwbSA9IGNwdV90b19sZTMyKHBtKTsKLQlXTF9JTkZPKCJwb3dlciBzYXZlICVzXG4iLCAocG0gPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKSk7Ci0KLQllcnIgPSBicmNtZl9kZXZfaW9jdGwoZGV2LCBCUkNNRl9DX1NFVF9QTSwgJnBtLCBzaXplb2YocG0pKTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQlpZiAoZXJyID09IC1FTk9ERVYpCi0JCQlXTF9FUlIoIm5ldF9kZXZpY2UgaXMgbm90IHJlYWR5IHlldFxuIik7Ci0JCWVsc2UKLQkJCVdMX0VSUigiZXJyb3IgKCVkKVxuIiwgZXJyKTsKLQl9Ci0JV0xfVFJBQ0UoIkV4aXRcbiIpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBfX3VzZWQgdTMyIGJyY21mX2ZpbmRfbXNiKHUxNiBiaXQxNikKLXsKLQl1MzIgcmV0ID0gMDsKLQotCWlmIChiaXQxNiAmIDB4ZmYwMCkgewotCQlyZXQgKz0gODsKLQkJYml0MTYgPj49IDg7Ci0JfQotCi0JaWYgKGJpdDE2ICYgMHhmMCkgewotCQlyZXQgKz0gNDsKLQkJYml0MTYgPj49IDQ7Ci0JfQotCi0JaWYgKGJpdDE2ICYgMHhjKSB7Ci0JCXJldCArPSAyOwotCQliaXQxNiA+Pj0gMjsKLQl9Ci0KLQlpZiAoYml0MTYgJiAyKQotCQlyZXQgKz0gYml0MTYgJiAyOwotCWVsc2UgaWYgKGJpdDE2KQotCQlyZXQgKz0gYml0MTY7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgczMyCi1icmNtZl9jZmc4MDIxMV9zZXRfYml0cmF0ZV9tYXNrKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgIGNvbnN0IHU4ICphZGRyLAotCQkJICAgICBjb25zdCBzdHJ1Y3QgY2ZnODAyMTFfYml0cmF0ZV9tYXNrICptYXNrKQotewotCXN0cnVjdCB3bF9yYXRlc2V0IHJhdGVzZXQ7Ci0JczMyIHJhdGU7Ci0JczMyIHZhbDsKLQlzMzIgZXJyX2JnOwotCXMzMiBlcnJfYTsKLQl1MzIgbGVnYWN5OwotCXMzMiBlcnIgPSAwOwotCi0JV0xfVFJBQ0UoIkVudGVyXG4iKTsKLQlDSEVDS19TWVNfVVAoKTsKLQotCS8qIGFkZHIgcGFyYW0gaXMgYWx3YXlzIE5VTEwuIGlnbm9yZSBpdCAqLwotCS8qIEdldCBjdXJyZW50IHJhdGVzZXQgKi8KLQllcnIgPSBicmNtZl9kZXZfaW9jdGwoZGV2LCBCUkNNX0dFVF9DVVJSX1JBVEVTRVQsICZyYXRlc2V0LAotCQkJc2l6ZW9mKHJhdGVzZXQpKTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoImNvdWxkIG5vdCBnZXQgY3VycmVudCByYXRlc2V0ICglZClcbiIsIGVycik7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlyYXRlc2V0LmNvdW50ID0gbGUzMl90b19jcHUocmF0ZXNldC5jb3VudCk7Ci0KLQlsZWdhY3kgPSBicmNtZl9maW5kX21zYihtYXNrLT5jb250cm9sW0lFRUU4MDIxMV9CQU5EXzJHSFpdLmxlZ2FjeSk7Ci0JaWYgKCFsZWdhY3kpCi0JCWxlZ2FjeSA9IGJyY21mX2ZpbmRfbXNiKG1hc2stPmNvbnRyb2xbSUVFRTgwMjExX0JBTkRfNUdIWl0ubGVnYWN5KTsKLQotCXZhbCA9IHdsX2dfcmF0ZXNbbGVnYWN5IC0gMV0uYml0cmF0ZSAqIDEwMDAwMDsKLQotCWlmICh2YWwgPCByYXRlc2V0LmNvdW50KQotCQkvKiBTZWxlY3QgcmF0ZSBieSByYXRlc2V0IGluZGV4ICovCi0JCXJhdGUgPSByYXRlc2V0LnJhdGVzW3ZhbF0gJiAweDdmOwotCWVsc2UKLQkJLyogU3BlY2lmaWVkIHJhdGUgaW4gYnBzICovCi0JCXJhdGUgPSB2YWwgLyA1MDAwMDA7Ci0KLQlXTF9DT05OKCJyYXRlICVkIG1icHNcbiIsIHJhdGUgLyAyKTsKLQotCS8qCi0JICoKLQkgKiAgICAgIFNldCByYXRlIG92ZXJyaWRlLAotCSAqICAgICAgU2luY2UgdGhlIGlzIGEvYi9nLWJsaW5kLCBib3RoIGEvYmdfcmF0ZSBhcmUgZW5mb3JjZWQuCi0JICovCi0JZXJyX2JnID0gYnJjbWZfZGV2X2ludHZhcl9zZXQoZGV2LCAiYmdfcmF0ZSIsIHJhdGUpOwotCWVycl9hID0gYnJjbWZfZGV2X2ludHZhcl9zZXQoZGV2LCAiYV9yYXRlIiwgcmF0ZSk7Ci0JaWYgKHVubGlrZWx5KGVycl9iZyAmJiBlcnJfYSkpIHsKLQkJV0xfRVJSKCJjb3VsZCBub3Qgc2V0IGZpeGVkIHJhdGUgKCVkKSAoJWQpXG4iLCBlcnJfYmcsIGVycl9hKTsKLQkJZXJyID0gZXJyX2JnIHwgZXJyX2E7Ci0JfQotCi1kb25lOgotCVdMX1RSQUNFKCJFeGl0XG4iKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgczMyIGJyY21mX2NmZzgwMjExX3Jlc3VtZShzdHJ1Y3Qgd2lwaHkgKndpcGh5KQotewotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiA9IHdpcGh5X3RvX2NmZyh3aXBoeSk7Ci0KLQkvKgotCSAqIENoZWNrIGZvciBXTF9TVEFUVVNfUkVBRFkgYmVmb3JlIGFueSBmdW5jdGlvbiBjYWxsIHdoaWNoCi0JICogY291bGQgcmVzdWx0IGlzIGJ1cyBhY2Nlc3MuIERvbid0IGJsb2NrIHRoZSByZXN1bWUgZm9yCi0JICogYW55IGRyaXZlciBlcnJvciBjb25kaXRpb25zCi0JICovCi0JV0xfVFJBQ0UoIkVudGVyXG4iKTsKLQotI2lmIGRlZmluZWQoQ09ORklHX1BNX1NMRUVQKQotCWF0b21pY19zZXQoJmJyY21mX21tY19zdXNwZW5kLCBmYWxzZSk7Ci0jZW5kaWYJLyogIGRlZmluZWQoQ09ORklHX1BNX1NMRUVQKSAqLwotCi0JaWYgKHRlc3RfYml0KFdMX1NUQVRVU19SRUFEWSwgJmNmZ19wcml2LT5zdGF0dXMpKQotCQlicmNtZl9pbnZva2VfaXNjYW4od2lwaHlfdG9fY2ZnKHdpcGh5KSk7Ci0KLQlXTF9UUkFDRSgiRXhpdFxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzMzIgYnJjbWZfY2ZnODAyMTFfc3VzcGVuZChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCQkJCSAgc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293KQotewotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiA9IHdpcGh5X3RvX2NmZyh3aXBoeSk7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBjZmdfdG9fbmRldihjZmdfcHJpdik7Ci0KLQlXTF9UUkFDRSgiRW50ZXJcbiIpOwotCi0JLyoKLQkgKiBDaGVjayBmb3IgV0xfU1RBVFVTX1JFQURZIGJlZm9yZSBhbnkgZnVuY3Rpb24gY2FsbCB3aGljaAotCSAqIGNvdWxkIHJlc3VsdCBpcyBidXMgYWNjZXNzLiBEb24ndCBibG9jayB0aGUgc3VzcGVuZCBmb3IKLQkgKiBhbnkgZHJpdmVyIGVycm9yIGNvbmRpdGlvbnMKLQkgKi8KLQotCS8qCi0JICogV2hpbGUgZ29pbmcgdG8gc3VzcGVuZCBpZiBhc3NvY2lhdGVkIHdpdGggQVAgZGlzYXNzb2NpYXRlCi0JICogZnJvbSBBUCB0byBzYXZlIHBvd2VyIHdoaWxlIHN5c3RlbSBpcyBpbiBzdXNwZW5kZWQgc3RhdGUKLQkgKi8KLQlpZiAoKHRlc3RfYml0KFdMX1NUQVRVU19DT05ORUNURUQsICZjZmdfcHJpdi0+c3RhdHVzKSB8fAotCSAgICAgdGVzdF9iaXQoV0xfU1RBVFVTX0NPTk5FQ1RJTkcsICZjZmdfcHJpdi0+c3RhdHVzKSkgJiYKLQkgICAgIHRlc3RfYml0KFdMX1NUQVRVU19SRUFEWSwgJmNmZ19wcml2LT5zdGF0dXMpKSB7Ci0JCVdMX0lORk8oIkRpc2Fzc29jaWF0aW5nIGZyb20gQVAiCi0JCQkiIHdoaWxlIGVudGVyaW5nIHN1c3BlbmQgc3RhdGVcbiIpOwotCQlicmNtZl9saW5rX2Rvd24oY2ZnX3ByaXYpOwotCi0JCS8qCi0JCSAqIE1ha2Ugc3VyZSBXUEFfU3VwcGxpY2FudCByZWNlaXZlcyBhbGwgdGhlIGV2ZW50Ci0JCSAqIGdlbmVyYXRlZCBkdWUgdG8gRElTQVNTT0MgY2FsbCB0byB0aGUgZncgdG8ga2VlcAotCQkgKiB0aGUgc3RhdGUgZncgYW5kIFdQQV9TdXBwbGljYW50IHN0YXRlIGNvbnNpc3RlbnQKLQkJICovCi0JCXJ0bmxfdW5sb2NrKCk7Ci0JCWJyY21mX2RlbGF5KDUwMCk7Ci0JCXJ0bmxfbG9jaygpOwotCX0KLQotCXNldF9iaXQoV0xfU1RBVFVTX1NDQU5fQUJPUlRJTkcsICZjZmdfcHJpdi0+c3RhdHVzKTsKLQlpZiAodGVzdF9iaXQoV0xfU1RBVFVTX1JFQURZLCAmY2ZnX3ByaXYtPnN0YXR1cykpCi0JCWJyY21mX3Rlcm1faXNjYW4oY2ZnX3ByaXYpOwotCi0JaWYgKGNmZ19wcml2LT5zY2FuX3JlcXVlc3QpIHsKLQkJLyogSW5kaWRhdGUgc2NhbiBhYm9ydCB0byBjZmc4MDIxMSBsYXllciAqLwotCQlXTF9JTkZPKCJUZXJtaW5hdGluZyBzY2FuIGluIHByb2dyZXNzXG4iKTsKLQkJY2ZnODAyMTFfc2Nhbl9kb25lKGNmZ19wcml2LT5zY2FuX3JlcXVlc3QsIHRydWUpOwotCQljZmdfcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gTlVMTDsKLQl9Ci0JY2xlYXJfYml0KFdMX1NUQVRVU19TQ0FOTklORywgJmNmZ19wcml2LT5zdGF0dXMpOwotCWNsZWFyX2JpdChXTF9TVEFUVVNfU0NBTl9BQk9SVElORywgJmNmZ19wcml2LT5zdGF0dXMpOwotCi0JLyogVHVybiBvZmYgd2F0Y2hkb2cgdGltZXIgKi8KLQlpZiAodGVzdF9iaXQoV0xfU1RBVFVTX1JFQURZLCAmY2ZnX3ByaXYtPnN0YXR1cykpIHsKLQkJV0xfSU5GTygiRW5hYmxlIE1QQ1xuIik7Ci0JCWJyY21mX3NldF9tcGMobmRldiwgMSk7Ci0JfQotCi0jaWYgZGVmaW5lZChDT05GSUdfUE1fU0xFRVApCi0JYXRvbWljX3NldCgmYnJjbWZfbW1jX3N1c3BlbmQsIHRydWUpOwotI2VuZGlmCS8qICBkZWZpbmVkKENPTkZJR19QTV9TTEVFUCkgKi8KLQotCVdMX1RSQUNFKCJFeGl0XG4iKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgX191c2VkIHMzMgotYnJjbWZfdXBkYXRlX3Bta2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgICBzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcG1rX2xpc3QgKnBta19saXN0LCBzMzIgZXJyKQotewotCWludCBpLCBqOwotCi0JV0xfQ09OTigiTm8gb2YgZWxlbWVudHMgJWRcbiIsIHBta19saXN0LT5wbWtpZHMubnBta2lkKTsKLQlmb3IgKGkgPSAwOyBpIDwgcG1rX2xpc3QtPnBta2lkcy5ucG1raWQ7IGkrKykgewotCQlXTF9DT05OKCJQTUtJRFslZF06ICVwTSA9XG4iLCBpLAotCQkJJnBta19saXN0LT5wbWtpZHMucG1raWRbaV0uQlNTSUQpOwotCQlmb3IgKGogPSAwOyBqIDwgV0xBTl9QTUtJRF9MRU47IGorKykKLQkJCVdMX0NPTk4oIiUwMnhcbiIsIHBta19saXN0LT5wbWtpZHMucG1raWRbaV0uUE1LSURbal0pOwotCX0KLQotCWlmIChsaWtlbHkoIWVycikpCi0JCWJyY21mX2Rldl9idWZ2YXJfc2V0KGRldiwgInBta2lkX2luZm8iLCAoY2hhciAqKXBta19saXN0LAotCQkJCQlzaXplb2YoKnBta19saXN0KSk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgczMyCi1icmNtZl9jZmc4MDIxMV9zZXRfcG1rc2Eoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgY2ZnODAyMTFfcG1rc2EgKnBta3NhKQotewotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiA9IHdpcGh5X3RvX2NmZyh3aXBoeSk7Ci0Jc3RydWN0IF9wbWtpZF9saXN0ICpwbWtpZHMgPSAmY2ZnX3ByaXYtPnBta19saXN0LT5wbWtpZHM7Ci0JczMyIGVyciA9IDA7Ci0JaW50IGk7Ci0KLQlXTF9UUkFDRSgiRW50ZXJcbiIpOwotCUNIRUNLX1NZU19VUCgpOwotCi0JZm9yIChpID0gMDsgaSA8IHBta2lkcy0+bnBta2lkOyBpKyspCi0JCWlmICghbWVtY21wKHBta3NhLT5ic3NpZCwgcG1raWRzLT5wbWtpZFtpXS5CU1NJRCwgRVRIX0FMRU4pKQotCQkJYnJlYWs7Ci0JaWYgKGkgPCBXTF9OVU1fUE1LSURTX01BWCkgewotCQltZW1jcHkocG1raWRzLT5wbWtpZFtpXS5CU1NJRCwgcG1rc2EtPmJzc2lkLCBFVEhfQUxFTik7Ci0JCW1lbWNweShwbWtpZHMtPnBta2lkW2ldLlBNS0lELCBwbWtzYS0+cG1raWQsIFdMQU5fUE1LSURfTEVOKTsKLQkJaWYgKGkgPT0gcG1raWRzLT5ucG1raWQpCi0JCQlwbWtpZHMtPm5wbWtpZCsrOwotCX0gZWxzZQotCQllcnIgPSAtRUlOVkFMOwotCi0JV0xfQ09OTigic2V0X3Bta3NhLElXX1BNS1NBX0FERCAtIFBNS0lEOiAlcE0gPVxuIiwKLQkJcG1raWRzLT5wbWtpZFtwbWtpZHMtPm5wbWtpZF0uQlNTSUQpOwotCWZvciAoaSA9IDA7IGkgPCBXTEFOX1BNS0lEX0xFTjsgaSsrKQotCQlXTF9DT05OKCIlMDJ4XG4iLCBwbWtpZHMtPnBta2lkW3Bta2lkcy0+bnBta2lkXS5QTUtJRFtpXSk7Ci0KLQllcnIgPSBicmNtZl91cGRhdGVfcG1rbGlzdChkZXYsIGNmZ19wcml2LT5wbWtfbGlzdCwgZXJyKTsKLQotCVdMX1RSQUNFKCJFeGl0XG4iKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgczMyCi1icmNtZl9jZmc4MDIxMV9kZWxfcG1rc2Eoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgICAgc3RydWN0IGNmZzgwMjExX3Bta3NhICpwbWtzYSkKLXsKLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYgPSB3aXBoeV90b19jZmcod2lwaHkpOwotCXN0cnVjdCBfcG1raWRfbGlzdCBwbWtpZDsKLQlzMzIgZXJyID0gMDsKLQlpbnQgaTsKLQotCVdMX1RSQUNFKCJFbnRlclxuIik7Ci0JQ0hFQ0tfU1lTX1VQKCk7Ci0JbWVtY3B5KCZwbWtpZC5wbWtpZFswXS5CU1NJRCwgcG1rc2EtPmJzc2lkLCBFVEhfQUxFTik7Ci0JbWVtY3B5KCZwbWtpZC5wbWtpZFswXS5QTUtJRCwgcG1rc2EtPnBta2lkLCBXTEFOX1BNS0lEX0xFTik7Ci0KLQlXTF9DT05OKCJkZWxfcG1rc2EsSVdfUE1LU0FfUkVNT1ZFIC0gUE1LSUQ6ICVwTSA9XG4iLAotCSAgICAgICAmcG1raWQucG1raWRbMF0uQlNTSUQpOwotCWZvciAoaSA9IDA7IGkgPCBXTEFOX1BNS0lEX0xFTjsgaSsrKQotCQlXTF9DT05OKCIlMDJ4XG4iLCBwbWtpZC5wbWtpZFswXS5QTUtJRFtpXSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY2ZnX3ByaXYtPnBta19saXN0LT5wbWtpZHMubnBta2lkOyBpKyspCi0JCWlmICghbWVtY21wCi0JCSAgICAocG1rc2EtPmJzc2lkLCAmY2ZnX3ByaXYtPnBta19saXN0LT5wbWtpZHMucG1raWRbaV0uQlNTSUQsCi0JCSAgICAgRVRIX0FMRU4pKQotCQkJYnJlYWs7Ci0KLQlpZiAoKGNmZ19wcml2LT5wbWtfbGlzdC0+cG1raWRzLm5wbWtpZCA+IDApCi0JICAgICYmIChpIDwgY2ZnX3ByaXYtPnBta19saXN0LT5wbWtpZHMubnBta2lkKSkgewotCQltZW1zZXQoJmNmZ19wcml2LT5wbWtfbGlzdC0+cG1raWRzLnBta2lkW2ldLCAwLAotCQkgICAgICAgc2l6ZW9mKHBta2lkX3QpKTsKLQkJZm9yICg7IGkgPCAoY2ZnX3ByaXYtPnBta19saXN0LT5wbWtpZHMubnBta2lkIC0gMSk7IGkrKykgewotCQkJbWVtY3B5KCZjZmdfcHJpdi0+cG1rX2xpc3QtPnBta2lkcy5wbWtpZFtpXS5CU1NJRCwKLQkJCSAgICAgICAmY2ZnX3ByaXYtPnBta19saXN0LT5wbWtpZHMucG1raWRbaSArIDFdLkJTU0lELAotCQkJICAgICAgIEVUSF9BTEVOKTsKLQkJCW1lbWNweSgmY2ZnX3ByaXYtPnBta19saXN0LT5wbWtpZHMucG1raWRbaV0uUE1LSUQsCi0JCQkgICAgICAgJmNmZ19wcml2LT5wbWtfbGlzdC0+cG1raWRzLnBta2lkW2kgKyAxXS5QTUtJRCwKLQkJCSAgICAgICBXTEFOX1BNS0lEX0xFTik7Ci0JCX0KLQkJY2ZnX3ByaXYtPnBta19saXN0LT5wbWtpZHMubnBta2lkLS07Ci0JfSBlbHNlCi0JCWVyciA9IC1FSU5WQUw7Ci0KLQllcnIgPSBicmNtZl91cGRhdGVfcG1rbGlzdChkZXYsIGNmZ19wcml2LT5wbWtfbGlzdCwgZXJyKTsKLQotCVdMX1RSQUNFKCJFeGl0XG4iKTsKLQlyZXR1cm4gZXJyOwotCi19Ci0KLXN0YXRpYyBzMzIKLWJyY21mX2NmZzgwMjExX2ZsdXNoX3Bta3NhKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2ID0gd2lwaHlfdG9fY2ZnKHdpcGh5KTsKLQlzMzIgZXJyID0gMDsKLQotCVdMX1RSQUNFKCJFbnRlclxuIik7Ci0JQ0hFQ0tfU1lTX1VQKCk7Ci0KLQltZW1zZXQoY2ZnX3ByaXYtPnBta19saXN0LCAwLCBzaXplb2YoKmNmZ19wcml2LT5wbWtfbGlzdCkpOwotCWVyciA9IGJyY21mX3VwZGF0ZV9wbWtsaXN0KGRldiwgY2ZnX3ByaXYtPnBta19saXN0LCBlcnIpOwotCi0JV0xfVFJBQ0UoIkV4aXRcbiIpOwotCXJldHVybiBlcnI7Ci0KLX0KLQotc3RhdGljIHN0cnVjdCBjZmc4MDIxMV9vcHMgd2xfY2ZnODAyMTFfb3BzID0gewotCS5jaGFuZ2VfdmlydHVhbF9pbnRmID0gYnJjbWZfY2ZnODAyMTFfY2hhbmdlX2lmYWNlLAotCS5zY2FuID0gYnJjbWZfY2ZnODAyMTFfc2NhbiwKLQkuc2V0X3dpcGh5X3BhcmFtcyA9IGJyY21mX2NmZzgwMjExX3NldF93aXBoeV9wYXJhbXMsCi0JLmpvaW5faWJzcyA9IGJyY21mX2NmZzgwMjExX2pvaW5faWJzcywKLQkubGVhdmVfaWJzcyA9IGJyY21mX2NmZzgwMjExX2xlYXZlX2lic3MsCi0JLmdldF9zdGF0aW9uID0gYnJjbWZfY2ZnODAyMTFfZ2V0X3N0YXRpb24sCi0JLnNldF90eF9wb3dlciA9IGJyY21mX2NmZzgwMjExX3NldF90eF9wb3dlciwKLQkuZ2V0X3R4X3Bvd2VyID0gYnJjbWZfY2ZnODAyMTFfZ2V0X3R4X3Bvd2VyLAotCS5hZGRfa2V5ID0gYnJjbWZfY2ZnODAyMTFfYWRkX2tleSwKLQkuZGVsX2tleSA9IGJyY21mX2NmZzgwMjExX2RlbF9rZXksCi0JLmdldF9rZXkgPSBicmNtZl9jZmc4MDIxMV9nZXRfa2V5LAotCS5zZXRfZGVmYXVsdF9rZXkgPSBicmNtZl9jZmc4MDIxMV9jb25maWdfZGVmYXVsdF9rZXksCi0JLnNldF9kZWZhdWx0X21nbXRfa2V5ID0gYnJjbWZfY2ZnODAyMTFfY29uZmlnX2RlZmF1bHRfbWdtdF9rZXksCi0JLnNldF9wb3dlcl9tZ210ID0gYnJjbWZfY2ZnODAyMTFfc2V0X3Bvd2VyX21nbXQsCi0JLnNldF9iaXRyYXRlX21hc2sgPSBicmNtZl9jZmc4MDIxMV9zZXRfYml0cmF0ZV9tYXNrLAotCS5jb25uZWN0ID0gYnJjbWZfY2ZnODAyMTFfY29ubmVjdCwKLQkuZGlzY29ubmVjdCA9IGJyY21mX2NmZzgwMjExX2Rpc2Nvbm5lY3QsCi0JLnN1c3BlbmQgPSBicmNtZl9jZmc4MDIxMV9zdXNwZW5kLAotCS5yZXN1bWUgPSBicmNtZl9jZmc4MDIxMV9yZXN1bWUsCi0JLnNldF9wbWtzYSA9IGJyY21mX2NmZzgwMjExX3NldF9wbWtzYSwKLQkuZGVsX3Bta3NhID0gYnJjbWZfY2ZnODAyMTFfZGVsX3Bta3NhLAotCS5mbHVzaF9wbWtzYSA9IGJyY21mX2NmZzgwMjExX2ZsdXNoX3Bta3NhCi19OwotCi1zdGF0aWMgczMyIGJyY21mX21vZGVfdG9fbmw4MDIxMV9pZnR5cGUoczMyIG1vZGUpCi17Ci0JczMyIGVyciA9IDA7Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIFdMX01PREVfQlNTOgotCQlyZXR1cm4gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKLQljYXNlIFdMX01PREVfSUJTUzoKLQkJcmV0dXJuIE5MODAyMTFfSUZUWVBFX0FESE9DOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRDsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgc3RydWN0IHdpcmVsZXNzX2RldiAqYnJjbWZfYWxsb2Nfd2RldihzMzIgc2l6ZW9mX2lmYWNlLAotCQkJCQkgIHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2OwotCXMzMiBlcnIgPSAwOwotCi0Jd2RldiA9IGt6YWxsb2Moc2l6ZW9mKCp3ZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHVubGlrZWx5KCF3ZGV2KSkgewotCQlXTF9FUlIoIkNvdWxkIG5vdCBhbGxvY2F0ZSB3aXJlbGVzcyBkZXZpY2VcbiIpOwotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQl9Ci0Jd2Rldi0+d2lwaHkgPQotCSAgICB3aXBoeV9uZXcoJndsX2NmZzgwMjExX29wcywKLQkJICAgICAgc2l6ZW9mKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2KSArIHNpemVvZl9pZmFjZSk7Ci0JaWYgKHVubGlrZWx5KCF3ZGV2LT53aXBoeSkpIHsKLQkJV0xfRVJSKCJDb3VsZG4gbm90IGFsbG9jYXRlIHdpcGh5IGRldmljZVxuIik7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gd2lwaHlfbmV3X291dDsKLQl9Ci0Jc2V0X3dpcGh5X2Rldih3ZGV2LT53aXBoeSwgZGV2KTsKLQl3ZGV2LT53aXBoeS0+bWF4X3NjYW5fc3NpZHMgPSBXTF9OVU1fU0NBTl9NQVg7Ci0Jd2Rldi0+d2lwaHktPm1heF9udW1fcG1raWRzID0gV0xfTlVNX1BNS0lEU19NQVg7Ci0Jd2Rldi0+d2lwaHktPmludGVyZmFjZV9tb2RlcyA9Ci0JICAgIEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB8IEJJVChOTDgwMjExX0lGVFlQRV9BREhPQyk7Ci0Jd2Rldi0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gJl9fd2xfYmFuZF8yZ2h6OwotCXdkZXYtPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXSA9ICZfX3dsX2JhbmRfNWdoel9hOwkvKiBTZXQKLQkJCQkJCSogaXQgYXMgMTFhIGJ5IGRlZmF1bHQuCi0JCQkJCQkqIFRoaXMgd2lsbCBiZSB1cGRhdGVkIHdpdGgKLQkJCQkJCSogMTFuIHBoeSB0YWJsZXMgaW4KLQkJCQkJCSogImlmY29uZmlnIHVwIgotCQkJCQkJKiBpZiBwaHkgaGFzIDExbiBjYXBhYmlsaXR5Ci0JCQkJCQkqLwotCXdkZXYtPndpcGh5LT5zaWduYWxfdHlwZSA9IENGRzgwMjExX1NJR05BTF9UWVBFX01CTTsKLQl3ZGV2LT53aXBoeS0+Y2lwaGVyX3N1aXRlcyA9IF9fd2xfY2lwaGVyX3N1aXRlczsKLQl3ZGV2LT53aXBoeS0+bl9jaXBoZXJfc3VpdGVzID0gQVJSQVlfU0laRShfX3dsX2NpcGhlcl9zdWl0ZXMpOwotI2lmbmRlZiBXTF9QT1dFUlNBVkVfRElTQUJMRUQKLQl3ZGV2LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19QU19PTl9CWV9ERUZBVUxUOwkvKiBlbmFibGUgcG93ZXIKLQkJCQkJCQkJICogc2F2ZSBtb2RlCi0JCQkJCQkJCSAqIGJ5IGRlZmF1bHQKLQkJCQkJCQkJICovCi0jZWxzZQotCXdkZXYtPndpcGh5LT5mbGFncyAmPSB+V0lQSFlfRkxBR19QU19PTl9CWV9ERUZBVUxUOwotI2VuZGlmCQkJCS8qICFXTF9QT1dFUlNBVkVfRElTQUJMRUQgKi8KLQllcnIgPSB3aXBoeV9yZWdpc3Rlcih3ZGV2LT53aXBoeSk7Ci0JaWYgKHVubGlrZWx5KGVyciA8IDApKSB7Ci0JCVdMX0VSUigiQ291bGRuIG5vdCByZWdpc3RlciB3aXBoeSBkZXZpY2UgKCVkKVxuIiwgZXJyKTsKLQkJZ290byB3aXBoeV9yZWdpc3Rlcl9vdXQ7Ci0JfQotCXJldHVybiB3ZGV2OwotCi13aXBoeV9yZWdpc3Rlcl9vdXQ6Ci0Jd2lwaHlfZnJlZSh3ZGV2LT53aXBoeSk7Ci0KLXdpcGh5X25ld19vdXQ6Ci0Ja2ZyZWUod2Rldik7Ci0KLQlyZXR1cm4gRVJSX1BUUihlcnIpOwotfQotCi1zdGF0aWMgdm9pZCBicmNtZl9mcmVlX3dkZXYoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2KQotewotCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBjZmdfdG9fd2RldihjZmdfcHJpdik7Ci0KLQlpZiAodW5saWtlbHkoIXdkZXYpKSB7Ci0JCVdMX0VSUigid2RldiBpcyBpbnZhbGlkXG4iKTsKLQkJcmV0dXJuOwotCX0KLQl3aXBoeV91bnJlZ2lzdGVyKHdkZXYtPndpcGh5KTsKLQl3aXBoeV9mcmVlKHdkZXYtPndpcGh5KTsKLQlrZnJlZSh3ZGV2KTsKLQljZmdfdG9fd2RldihjZmdfcHJpdikgPSBOVUxMOwotfQotCi1zdGF0aWMgczMyIGJyY21mX2luZm9ybV9ic3Moc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2KQotewotCXN0cnVjdCBicmNtZl9zY2FuX3Jlc3VsdHMgKmJzc19saXN0OwotCXN0cnVjdCBicmNtZl9ic3NfaW5mbyAqYmkgPSBOVUxMOwkvKiBtdXN0IGJlIGluaXRpYWxpemVkICovCi0JczMyIGVyciA9IDA7Ci0JaW50IGk7Ci0KLQlic3NfbGlzdCA9IGNmZ19wcml2LT5ic3NfbGlzdDsKLQlpZiAodW5saWtlbHkoYnNzX2xpc3QtPnZlcnNpb24gIT0gQlJDTUZfQlNTX0lORk9fVkVSU0lPTikpIHsKLQkJV0xfRVJSKCJWZXJzaW9uICVkICE9IFdMX0JTU19JTkZPX1ZFUlNJT05cbiIsCi0JCSAgICAgICBic3NfbGlzdC0+dmVyc2lvbik7Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci0JV0xfU0NBTigic2Nhbm5lZCBBUCBjb3VudCAoJWQpXG4iLCBic3NfbGlzdC0+Y291bnQpOwotCWJpID0gbmV4dF9ic3MoYnNzX2xpc3QsIGJpKTsKLQlmb3JfZWFjaF9ic3MoYnNzX2xpc3QsIGJpLCBpKSB7Ci0JCWVyciA9IGJyY21mX2luZm9ybV9zaW5nbGVfYnNzKGNmZ19wcml2LCBiaSk7Ci0JCWlmICh1bmxpa2VseShlcnIpKQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiBlcnI7Ci19Ci0KLQotc3RhdGljIHMzMiBicmNtZl9pbmZvcm1fc2luZ2xlX2JzcyhzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYsCi0JCQkJICAgc3RydWN0IGJyY21mX2Jzc19pbmZvICpiaSkKLXsKLQlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gY2ZnX3RvX3dpcGh5KGNmZ19wcml2KTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKm5vdGlmeV9jaGFubmVsOwotCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzczsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpiYW5kOwotCXMzMiBlcnIgPSAwOwotCXUxNiBjaGFubmVsOwotCXUzMiBmcmVxOwotCXU2NCBub3RpZnlfdGltZXN0YW1wOwotCXUxNiBub3RpZnlfY2FwYWJpbGl0eTsKLQl1MTYgbm90aWZ5X2ludGVydmFsOwotCXU4ICpub3RpZnlfaWU7Ci0Jc2l6ZV90IG5vdGlmeV9pZWxlbjsKLQlzMzIgbm90aWZ5X3NpZ25hbDsKLQotCWlmICh1bmxpa2VseShsZTMyX3RvX2NwdShiaS0+bGVuZ3RoKSA+IFdMX0JTU19JTkZPX01BWCkpIHsKLQkJV0xfRVJSKCJCc3MgaW5mbyBpcyBsYXJnZXIgdGhhbiBidWZmZXIuIERpc2NhcmRpbmdcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQljaGFubmVsID0gYmktPmN0bF9jaCA/IGJpLT5jdGxfY2ggOgotCQkJCUNIU1BFQ19DSEFOTkVMKGxlMTZfdG9fY3B1KGJpLT5jaGFuc3BlYykpOwotCi0JaWYgKGNoYW5uZWwgPD0gQ0hfTUFYXzJHX0NIQU5ORUwpCi0JCWJhbmQgPSB3aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl07Ci0JZWxzZQotCQliYW5kID0gd2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdOwotCi0JZnJlcSA9IGllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShjaGFubmVsLCBiYW5kLT5iYW5kKTsKLQlub3RpZnlfY2hhbm5lbCA9IGllZWU4MDIxMV9nZXRfY2hhbm5lbCh3aXBoeSwgZnJlcSk7Ci0KLQlub3RpZnlfdGltZXN0YW1wID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzKSoxMDAwOyAvKiB1U2VjICovCi0Jbm90aWZ5X2NhcGFiaWxpdHkgPSBsZTE2X3RvX2NwdShiaS0+Y2FwYWJpbGl0eSk7Ci0Jbm90aWZ5X2ludGVydmFsID0gbGUxNl90b19jcHUoYmktPmJlYWNvbl9wZXJpb2QpOwotCW5vdGlmeV9pZSA9ICh1OCAqKWJpICsgbGUxNl90b19jcHUoYmktPmllX29mZnNldCk7Ci0Jbm90aWZ5X2llbGVuID0gbGUxNl90b19jcHUoYmktPmllX2xlbmd0aCk7Ci0Jbm90aWZ5X3NpZ25hbCA9IChzMTYpbGUxNl90b19jcHUoYmktPlJTU0kpICogMTAwOwotCi0JV0xfQ09OTigiYnNzaWQ6ICUyLjJYOiUyLjJYOiUyLjJYOiUyLjJYOiUyLjJYOiUyLjJYXG4iLAotCQkJYmktPkJTU0lEWzBdLCBiaS0+QlNTSURbMV0sIGJpLT5CU1NJRFsyXSwKLQkJCWJpLT5CU1NJRFszXSwgYmktPkJTU0lEWzRdLCBiaS0+QlNTSURbNV0pOwotCVdMX0NPTk4oIkNoYW5uZWw6ICVkKCVkKVxuIiwgY2hhbm5lbCwgZnJlcSk7Ci0JV0xfQ09OTigiQ2FwYWJpbGl0eTogJVhcbiIsIG5vdGlmeV9jYXBhYmlsaXR5KTsKLQlXTF9DT05OKCJCZWFjb24gaW50ZXJ2YWw6ICVkXG4iLCBub3RpZnlfaW50ZXJ2YWwpOwotCVdMX0NPTk4oIlNpZ25hbDogJWRcbiIsIG5vdGlmeV9zaWduYWwpOwotCVdMX0NPTk4oIm5vdGlmeV90aW1lc3RhbXA6ICUjMDE4bGx4XG4iLCBub3RpZnlfdGltZXN0YW1wKTsKLQotCWJzcyA9IGNmZzgwMjExX2luZm9ybV9ic3Mod2lwaHksIG5vdGlmeV9jaGFubmVsLCAoY29uc3QgdTggKiliaS0+QlNTSUQsCi0JCW5vdGlmeV90aW1lc3RhbXAsIG5vdGlmeV9jYXBhYmlsaXR5LCBub3RpZnlfaW50ZXJ2YWwsIG5vdGlmeV9pZSwKLQkJbm90aWZ5X2llbGVuLCBub3RpZnlfc2lnbmFsLCBHRlBfS0VSTkVMKTsKLQotCWlmICh1bmxpa2VseSghYnNzKSkgewotCQlXTF9FUlIoImNmZzgwMjExX2luZm9ybV9ic3NfZnJhbWUgZXJyb3JcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgczMyIHdsX2luZm9ybV9pYnNzKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiwKLQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdTggKmJzc2lkKQotewotCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSBjZmdfdG9fd2lwaHkoY2ZnX3ByaXYpOwotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqbm90aWZ5X2NoYW5uZWw7Ci0Jc3RydWN0IGJyY21mX2Jzc19pbmZvICpiaSA9IE5VTEw7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqYmFuZDsKLQl1OCAqYnVmID0gTlVMTDsKLQlzMzIgZXJyID0gMDsKLQl1MTYgY2hhbm5lbDsKLQl1MzIgZnJlcTsKLQl1NjQgbm90aWZ5X3RpbWVzdGFtcDsKLQl1MTYgbm90aWZ5X2NhcGFiaWxpdHk7Ci0JdTE2IG5vdGlmeV9pbnRlcnZhbDsKLQl1OCAqbm90aWZ5X2llOwotCXNpemVfdCBub3RpZnlfaWVsZW47Ci0JczMyIG5vdGlmeV9zaWduYWw7Ci0KLQlXTF9UUkFDRSgiRW50ZXJcbiIpOwotCi0JYnVmID0ga3phbGxvYyhXTF9CU1NfSU5GT19NQVgsIEdGUF9LRVJORUwpOwotCWlmIChidWYgPT0gTlVMTCkgewotCQlXTF9FUlIoImt6YWxsb2MoKSBmYWlsZWRcbiIpOwotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIENsZWFuVXA7Ci0JfQotCi0JKih1MzIgKilidWYgPSBjcHVfdG9fbGUzMihXTF9CU1NfSU5GT19NQVgpOwotCi0JZXJyID0gYnJjbWZfZGV2X2lvY3RsKGRldiwgQlJDTUZfQ19HRVRfQlNTX0lORk8sIGJ1ZiwgV0xfQlNTX0lORk9fTUFYKTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoIldMQ19HRVRfQlNTX0lORk8gZmFpbGVkOiAlZFxuIiwgZXJyKTsKLQkJZ290byBDbGVhblVwOwotCX0KLQotCWJpID0gKHN0cnVjdCBicmNtZl9ic3NfaW5mbyAqKShidWYgKyA0KTsKLQotCWNoYW5uZWwgPSBiaS0+Y3RsX2NoID8gYmktPmN0bF9jaCA6Ci0JCQkJQ0hTUEVDX0NIQU5ORUwobGUxNl90b19jcHUoYmktPmNoYW5zcGVjKSk7Ci0KLQlpZiAoY2hhbm5lbCA8PSBDSF9NQVhfMkdfQ0hBTk5FTCkKLQkJYmFuZCA9IHdpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXTsKLQllbHNlCi0JCWJhbmQgPSB3aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl07Ci0KLQlmcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGNoYW5uZWwsIGJhbmQtPmJhbmQpOwotCW5vdGlmeV9jaGFubmVsID0gaWVlZTgwMjExX2dldF9jaGFubmVsKHdpcGh5LCBmcmVxKTsKLQotCW5vdGlmeV90aW1lc3RhbXAgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMpKjEwMDA7IC8qIHVTZWMgKi8KLQlub3RpZnlfY2FwYWJpbGl0eSA9IGxlMTZfdG9fY3B1KGJpLT5jYXBhYmlsaXR5KTsKLQlub3RpZnlfaW50ZXJ2YWwgPSBsZTE2X3RvX2NwdShiaS0+YmVhY29uX3BlcmlvZCk7Ci0Jbm90aWZ5X2llID0gKHU4ICopYmkgKyBsZTE2X3RvX2NwdShiaS0+aWVfb2Zmc2V0KTsKLQlub3RpZnlfaWVsZW4gPSBsZTE2X3RvX2NwdShiaS0+aWVfbGVuZ3RoKTsKLQlub3RpZnlfc2lnbmFsID0gKHMxNilsZTE2X3RvX2NwdShiaS0+UlNTSSkgKiAxMDA7Ci0KLQlXTF9DT05OKCJjaGFubmVsOiAlZCglZClcbiIsIGNoYW5uZWwsIGZyZXEpOwotCVdMX0NPTk4oImNhcGFiaWxpdHk6ICVYXG4iLCBub3RpZnlfY2FwYWJpbGl0eSk7Ci0JV0xfQ09OTigiYmVhY29uIGludGVydmFsOiAlZFxuIiwgbm90aWZ5X2ludGVydmFsKTsKLQlXTF9DT05OKCJzaWduYWw6ICVkXG4iLCBub3RpZnlfc2lnbmFsKTsKLQlXTF9DT05OKCJub3RpZnlfdGltZXN0YW1wOiAlIzAxOGxseFxuIiwgbm90aWZ5X3RpbWVzdGFtcCk7Ci0KLQljZmc4MDIxMV9pbmZvcm1fYnNzKHdpcGh5LCBub3RpZnlfY2hhbm5lbCwgYnNzaWQsCi0JCW5vdGlmeV90aW1lc3RhbXAsIG5vdGlmeV9jYXBhYmlsaXR5LCBub3RpZnlfaW50ZXJ2YWwsCi0JCW5vdGlmeV9pZSwgbm90aWZ5X2llbGVuLCBub3RpZnlfc2lnbmFsLCBHRlBfS0VSTkVMKTsKLQotQ2xlYW5VcDoKLQotCWtmcmVlKGJ1Zik7Ci0KLQlXTF9UUkFDRSgiRXhpdFxuIik7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgYm9vbCBicmNtZl9pc19saW5rdXAoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2LAotCQkJICAgIGNvbnN0IHN0cnVjdCBicmNtZl9ldmVudF9tc2cgKmUpCi17Ci0JdTMyIGV2ZW50ID0gYmUzMl90b19jcHUoZS0+ZXZlbnRfdHlwZSk7Ci0JdTMyIHN0YXR1cyA9IGJlMzJfdG9fY3B1KGUtPnN0YXR1cyk7Ci0KLQlpZiAoZXZlbnQgPT0gQlJDTUZfRV9TRVRfU1NJRCAmJiBzdGF0dXMgPT0gQlJDTUZfRV9TVEFUVVNfU1VDQ0VTUykgewotCQlXTF9DT05OKCJQcm9jZXNzaW5nIHNldCBzc2lkXG4iKTsKLQkJY2ZnX3ByaXYtPmxpbmtfdXAgPSB0cnVlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBib29sIGJyY21mX2lzX2xpbmtkb3duKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBicmNtZl9ldmVudF9tc2cgKmUpCi17Ci0JdTMyIGV2ZW50ID0gYmUzMl90b19jcHUoZS0+ZXZlbnRfdHlwZSk7Ci0JdTE2IGZsYWdzID0gYmUxNl90b19jcHUoZS0+ZmxhZ3MpOwotCi0JaWYgKGV2ZW50ID09IEJSQ01GX0VfTElOSyAmJiAoIShmbGFncyAmIEJSQ01GX0VWRU5UX01TR19MSU5LKSkpIHsKLQkJV0xfQ09OTigiUHJvY2Vzc2luZyBsaW5rIGRvd25cbiIpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCBicmNtZl9pc19ub25ldHdvcmsoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2LAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBicmNtZl9ldmVudF9tc2cgKmUpCi17Ci0JdTMyIGV2ZW50ID0gYmUzMl90b19jcHUoZS0+ZXZlbnRfdHlwZSk7Ci0JdTMyIHN0YXR1cyA9IGJlMzJfdG9fY3B1KGUtPnN0YXR1cyk7Ci0KLQlpZiAoZXZlbnQgPT0gQlJDTUZfRV9MSU5LICYmIHN0YXR1cyA9PSBCUkNNRl9FX1NUQVRVU19OT19ORVRXT1JLUykgewotCQlXTF9DT05OKCJQcm9jZXNzaW5nIExpbmsgJXMgJiBubyBuZXR3b3JrIGZvdW5kXG4iLAotCQkJCWJlMTZfdG9fY3B1KGUtPmZsYWdzKSAmIEJSQ01GX0VWRU5UX01TR19MSU5LID8KLQkJCQkidXAiIDogImRvd24iKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JaWYgKGV2ZW50ID09IEJSQ01GX0VfU0VUX1NTSUQgJiYgc3RhdHVzICE9IEJSQ01GX0VfU1RBVFVTX1NVQ0NFU1MpIHsKLQkJV0xfQ09OTigiUHJvY2Vzc2luZyBjb25uZWN0aW5nICYgbm8gbmV0d29yayBmb3VuZFxuIik7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHMzMgotYnJjbWZfbm90aWZ5X2Nvbm5lY3Rfc3RhdHVzKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiwKLQkJCSAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgYnJjbWZfZXZlbnRfbXNnICplLCB2b2lkICpkYXRhKQotewotCXMzMiBlcnIgPSAwOwotCi0JaWYgKGJyY21mX2lzX2xpbmt1cChjZmdfcHJpdiwgZSkpIHsKLQkJV0xfQ09OTigiTGlua3VwXG4iKTsKLQkJaWYgKGJyY21mX2lzX2lic3Ntb2RlKGNmZ19wcml2KSkgewotCQkJYnJjbWZfdXBkYXRlX3Byb2YoY2ZnX3ByaXYsIE5VTEwsICh2b2lkICopZS0+YWRkciwKLQkJCQlXTF9QUk9GX0JTU0lEKTsKLQkJCXdsX2luZm9ybV9pYnNzKGNmZ19wcml2LCBuZGV2LCBlLT5hZGRyKTsKLQkJCWNmZzgwMjExX2lic3Nfam9pbmVkKG5kZXYsIGUtPmFkZHIsIEdGUF9LRVJORUwpOwotCQkJY2xlYXJfYml0KFdMX1NUQVRVU19DT05ORUNUSU5HLCAmY2ZnX3ByaXYtPnN0YXR1cyk7Ci0JCQlzZXRfYml0KFdMX1NUQVRVU19DT05ORUNURUQsICZjZmdfcHJpdi0+c3RhdHVzKTsKLQkJfSBlbHNlCi0JCQlicmNtZl9ic3NfY29ubmVjdF9kb25lKGNmZ19wcml2LCBuZGV2LCBlLCBkYXRhLCB0cnVlKTsKLQl9IGVsc2UgaWYgKGJyY21mX2lzX2xpbmtkb3duKGNmZ19wcml2LCBlKSkgewotCQlXTF9DT05OKCJMaW5rZG93blxuIik7Ci0JCWlmIChicmNtZl9pc19pYnNzbW9kZShjZmdfcHJpdikpIHsKLQkJCWNsZWFyX2JpdChXTF9TVEFUVVNfQ09OTkVDVElORywgJmNmZ19wcml2LT5zdGF0dXMpOwotCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChXTF9TVEFUVVNfQ09OTkVDVEVELAotCQkJCSZjZmdfcHJpdi0+c3RhdHVzKSkKLQkJCQlicmNtZl9saW5rX2Rvd24oY2ZnX3ByaXYpOwotCQl9IGVsc2UgewotCQkJYnJjbWZfYnNzX2Nvbm5lY3RfZG9uZShjZmdfcHJpdiwgbmRldiwgZSwgZGF0YSwgZmFsc2UpOwotCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChXTF9TVEFUVVNfQ09OTkVDVEVELAotCQkJCSZjZmdfcHJpdi0+c3RhdHVzKSkgewotCQkJCWNmZzgwMjExX2Rpc2Nvbm5lY3RlZChuZGV2LCAwLCBOVUxMLCAwLAotCQkJCQlHRlBfS0VSTkVMKTsKLQkJCQlicmNtZl9saW5rX2Rvd24oY2ZnX3ByaXYpOwotCQkJfQotCQl9Ci0JCWJyY21mX2luaXRfcHJvZihjZmdfcHJpdi0+cHJvZmlsZSk7Ci0JfSBlbHNlIGlmIChicmNtZl9pc19ub25ldHdvcmsoY2ZnX3ByaXYsIGUpKSB7Ci0JCWlmIChicmNtZl9pc19pYnNzbW9kZShjZmdfcHJpdikpCi0JCQljbGVhcl9iaXQoV0xfU1RBVFVTX0NPTk5FQ1RJTkcsICZjZmdfcHJpdi0+c3RhdHVzKTsKLQkJZWxzZQotCQkJYnJjbWZfYnNzX2Nvbm5lY3RfZG9uZShjZmdfcHJpdiwgbmRldiwgZSwgZGF0YSwgZmFsc2UpOwotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBzMzIKLWJyY21mX25vdGlmeV9yb2FtaW5nX3N0YXR1cyhzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYsCi0JCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JCQkgICAgY29uc3Qgc3RydWN0IGJyY21mX2V2ZW50X21zZyAqZSwgdm9pZCAqZGF0YSkKLXsKLQlzMzIgZXJyID0gMDsKLQl1MzIgZXZlbnQgPSBiZTMyX3RvX2NwdShlLT5ldmVudF90eXBlKTsKLQl1MzIgc3RhdHVzID0gYmUzMl90b19jcHUoZS0+c3RhdHVzKTsKLQotCWlmIChldmVudCA9PSBCUkNNRl9FX1JPQU0gJiYgc3RhdHVzID09IEJSQ01GX0VfU1RBVFVTX1NVQ0NFU1MpIHsKLQkJaWYgKHRlc3RfYml0KFdMX1NUQVRVU19DT05ORUNURUQsICZjZmdfcHJpdi0+c3RhdHVzKSkKLQkJCWJyY21mX2Jzc19yb2FtaW5nX2RvbmUoY2ZnX3ByaXYsIG5kZXYsIGUsIGRhdGEpOwotCQllbHNlCi0JCQlicmNtZl9ic3NfY29ubmVjdF9kb25lKGNmZ19wcml2LCBuZGV2LCBlLCBkYXRhLCB0cnVlKTsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgX191c2VkIHMzMgotYnJjbWZfZGV2X2J1ZnZhcl9zZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgczggKm5hbWUsIHM4ICpidWYsIHMzMiBsZW4pCi17Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2ID0gbmRldl90b19jZmcoZGV2KTsKLQl1MzIgYnVmbGVuOwotCi0JYnVmbGVuID0gYnJjbXVfbWtpb3ZhcihuYW1lLCBidWYsIGxlbiwgY2ZnX3ByaXYtPmlvY3RsX2J1ZiwKLQkJCSAgICAgICBXTF9JT0NUTF9MRU5fTUFYKTsKLQlCVUdfT04oIWJ1Zmxlbik7Ci0KLQlyZXR1cm4gYnJjbWZfZGV2X2lvY3RsKGRldiwgQlJDTUZfQ19TRVRfVkFSLCBjZmdfcHJpdi0+aW9jdGxfYnVmLAotCQkJICAgICAgIGJ1Zmxlbik7Ci19Ci0KLXN0YXRpYyBzMzIKLWJyY21mX2Rldl9idWZ2YXJfZ2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHM4ICpuYW1lLCBzOCAqYnVmLAotCQkgIHMzMiBidWZfbGVuKQotewotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiA9IG5kZXZfdG9fY2ZnKGRldik7Ci0JdTMyIGxlbjsKLQlzMzIgZXJyID0gMDsKLQotCWxlbiA9IGJyY211X21raW92YXIobmFtZSwgTlVMTCwgMCwgY2ZnX3ByaXYtPmlvY3RsX2J1ZiwKLQkJCSAgICBXTF9JT0NUTF9MRU5fTUFYKTsKLQlCVUdfT04oIWxlbik7Ci0JZXJyID0gYnJjbWZfZGV2X2lvY3RsKGRldiwgQlJDTUZfQ19HRVRfVkFSLCAodm9pZCAqKWNmZ19wcml2LT5pb2N0bF9idWYsCi0JCQlXTF9JT0NUTF9MRU5fTUFYKTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoImVycm9yICglZClcbiIsIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCW1lbWNweShidWYsIGNmZ19wcml2LT5pb2N0bF9idWYsIGJ1Zl9sZW4pOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHMzMiBicmNtZl9nZXRfYXNzb2NfaWVzKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGNmZ190b19uZGV2KGNmZ19wcml2KTsKLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfYXNzb2NfaWVsZW4gKmFzc29jX2luZm87Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX2Nvbm5lY3RfaW5mbyAqY29ubl9pbmZvID0gY2ZnX3RvX2Nvbm4oY2ZnX3ByaXYpOwotCXUzMiByZXFfbGVuOwotCXUzMiByZXNwX2xlbjsKLQlzMzIgZXJyID0gMDsKLQotCWJyY21mX2NsZWFyX2Fzc29jX2llcyhjZmdfcHJpdik7Ci0KLQllcnIgPSBicmNtZl9kZXZfYnVmdmFyX2dldChuZGV2LCAiYXNzb2NfaW5mbyIsIGNmZ19wcml2LT5leHRyYV9idWYsCi0JCQkJV0xfQVNTT0NfSU5GT19NQVgpOwotCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigiY291bGQgbm90IGdldCBhc3NvYyBpbmZvICglZClcbiIsIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCWFzc29jX2luZm8gPSAoc3RydWN0IGJyY21mX2NmZzgwMjExX2Fzc29jX2llbGVuICopY2ZnX3ByaXYtPmV4dHJhX2J1ZjsKLQlyZXFfbGVuID0gYXNzb2NfaW5mby0+cmVxX2xlbjsKLQlyZXNwX2xlbiA9IGFzc29jX2luZm8tPnJlc3BfbGVuOwotCWlmIChyZXFfbGVuKSB7Ci0JCWVyciA9IGJyY21mX2Rldl9idWZ2YXJfZ2V0KG5kZXYsICJhc3NvY19yZXFfaWVzIiwKLQkJCQkJICAgY2ZnX3ByaXYtPmV4dHJhX2J1ZiwKLQkJCQkJICAgV0xfQVNTT0NfSU5GT19NQVgpOwotCQlpZiAodW5saWtlbHkoZXJyKSkgewotCQkJV0xfRVJSKCJjb3VsZCBub3QgZ2V0IGFzc29jIHJlcSAoJWQpXG4iLCBlcnIpOwotCQkJcmV0dXJuIGVycjsKLQkJfQotCQljb25uX2luZm8tPnJlcV9pZV9sZW4gPSByZXFfbGVuOwotCQljb25uX2luZm8tPnJlcV9pZSA9Ci0JCSAgICBrbWVtZHVwKGNmZ19wcml2LT5leHRyYV9idWYsIGNvbm5faW5mby0+cmVxX2llX2xlbiwKLQkJCSAgICBHRlBfS0VSTkVMKTsKLQl9IGVsc2UgewotCQljb25uX2luZm8tPnJlcV9pZV9sZW4gPSAwOwotCQljb25uX2luZm8tPnJlcV9pZSA9IE5VTEw7Ci0JfQotCWlmIChyZXNwX2xlbikgewotCQllcnIgPSBicmNtZl9kZXZfYnVmdmFyX2dldChuZGV2LCAiYXNzb2NfcmVzcF9pZXMiLAotCQkJCQkgICBjZmdfcHJpdi0+ZXh0cmFfYnVmLAotCQkJCQkgICBXTF9BU1NPQ19JTkZPX01BWCk7Ci0JCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoImNvdWxkIG5vdCBnZXQgYXNzb2MgcmVzcCAoJWQpXG4iLCBlcnIpOwotCQkJcmV0dXJuIGVycjsKLQkJfQotCQljb25uX2luZm8tPnJlc3BfaWVfbGVuID0gcmVzcF9sZW47Ci0JCWNvbm5faW5mby0+cmVzcF9pZSA9Ci0JCSAgICBrbWVtZHVwKGNmZ19wcml2LT5leHRyYV9idWYsIGNvbm5faW5mby0+cmVzcF9pZV9sZW4sCi0JCQkgICAgR0ZQX0tFUk5FTCk7Ci0JfSBlbHNlIHsKLQkJY29ubl9pbmZvLT5yZXNwX2llX2xlbiA9IDA7Ci0JCWNvbm5faW5mby0+cmVzcF9pZSA9IE5VTEw7Ci0JfQotCVdMX0NPTk4oInJlcSBsZW4gKCVkKSByZXNwIGxlbiAoJWQpXG4iLAotCSAgICAgICBjb25uX2luZm8tPnJlcV9pZV9sZW4sIGNvbm5faW5mby0+cmVzcF9pZV9sZW4pOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgYnJjbWZfY2xlYXJfYXNzb2NfaWVzKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdikKLXsKLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfY29ubmVjdF9pbmZvICpjb25uX2luZm8gPSBjZmdfdG9fY29ubihjZmdfcHJpdik7Ci0KLQlrZnJlZShjb25uX2luZm8tPnJlcV9pZSk7Ci0JY29ubl9pbmZvLT5yZXFfaWUgPSBOVUxMOwotCWNvbm5faW5mby0+cmVxX2llX2xlbiA9IDA7Ci0Ja2ZyZWUoY29ubl9pbmZvLT5yZXNwX2llKTsKLQljb25uX2luZm8tPnJlc3BfaWUgPSBOVUxMOwotCWNvbm5faW5mby0+cmVzcF9pZV9sZW4gPSAwOwotfQotCi0KLXN0YXRpYyB2b2lkIGJyY21mX2NoX3RvX2NoYW5zcGVjKGludCBjaCwgc3RydWN0IGJyY21mX2pvaW5fcGFyYW1zICpqb2luX3BhcmFtcywKLQlzaXplX3QgKmpvaW5fcGFyYW1zX3NpemUpCi17Ci0JY2hhbnNwZWNfdCBjaGFuc3BlYyA9IDA7Ci0KLQlpZiAoY2ggIT0gMCkgewotCQlqb2luX3BhcmFtcy0+cGFyYW1zLmNoYW5zcGVjX251bSA9IDE7Ci0JCWpvaW5fcGFyYW1zLT5wYXJhbXMuY2hhbnNwZWNfbGlzdFswXSA9IGNoOwotCi0JCWlmIChqb2luX3BhcmFtcy0+cGFyYW1zLmNoYW5zcGVjX2xpc3RbMF0gPD0gQ0hfTUFYXzJHX0NIQU5ORUwpCi0JCQljaGFuc3BlYyB8PSBXTF9DSEFOU1BFQ19CQU5EXzJHOwotCQllbHNlCi0JCQljaGFuc3BlYyB8PSBXTF9DSEFOU1BFQ19CQU5EXzVHOwotCi0JCWNoYW5zcGVjIHw9IFdMX0NIQU5TUEVDX0JXXzIwOwotCQljaGFuc3BlYyB8PSBXTF9DSEFOU1BFQ19DVExfU0JfTk9ORTsKLQotCQkqam9pbl9wYXJhbXNfc2l6ZSArPSBCUkNNRl9BU1NPQ19QQVJBTVNfRklYRURfU0laRSArCi0JCQlqb2luX3BhcmFtcy0+cGFyYW1zLmNoYW5zcGVjX251bSAqIHNpemVvZihjaGFuc3BlY190KTsKLQotCQlqb2luX3BhcmFtcy0+cGFyYW1zLmNoYW5zcGVjX2xpc3RbMF0gJj0gV0xfQ0hBTlNQRUNfQ0hBTl9NQVNLOwotCQlqb2luX3BhcmFtcy0+cGFyYW1zLmNoYW5zcGVjX2xpc3RbMF0gfD0gY2hhbnNwZWM7Ci0JCWpvaW5fcGFyYW1zLT5wYXJhbXMuY2hhbnNwZWNfbGlzdFswXSA9Ci0JCWNwdV90b19sZTE2KGpvaW5fcGFyYW1zLT5wYXJhbXMuY2hhbnNwZWNfbGlzdFswXSk7Ci0KLQkJam9pbl9wYXJhbXMtPnBhcmFtcy5jaGFuc3BlY19udW0gPQotCQkJY3B1X3RvX2xlMzIoam9pbl9wYXJhbXMtPnBhcmFtcy5jaGFuc3BlY19udW0pOwotCi0JCVdMX0NPTk4oImpvaW5fcGFyYW1zLT5wYXJhbXMuY2hhbnNwZWNfbGlzdFswXT0gJSNYLCIKLQkJCSJjaGFubmVsICVkLCBjaGFuc3BlYyAlI1hcbiIsCi0JCSAgICAgICBqb2luX3BhcmFtcy0+cGFyYW1zLmNoYW5zcGVjX2xpc3RbMF0sIGNoLCBjaGFuc3BlYyk7Ci0JfQotfQotCi1zdGF0aWMgczMyIGJyY21mX3VwZGF0ZV9ic3NfaW5mbyhzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpCi17Ci0Jc3RydWN0IGJyY21mX2Jzc19pbmZvICpiaTsKLQlzdHJ1Y3QgYnJjbWZfc3NpZCAqc3NpZDsKLQlzdHJ1Y3QgYnJjbXVfdGx2ICp0aW07Ci0JdTE2IGJlYWNvbl9pbnRlcnZhbDsKLQl1OCBkdGltX3BlcmlvZDsKLQlzaXplX3QgaWVfbGVuOwotCXU4ICppZTsKLQlzMzIgZXJyID0gMDsKLQotCVdMX1RSQUNFKCJFbnRlclxuIik7Ci0JaWYgKGJyY21mX2lzX2lic3Ntb2RlKGNmZ19wcml2KSkKLQkJcmV0dXJuIGVycjsKLQotCXNzaWQgPSAoc3RydWN0IGJyY21mX3NzaWQgKilicmNtZl9yZWFkX3Byb2YoY2ZnX3ByaXYsIFdMX1BST0ZfU1NJRCk7Ci0KLQkqKHUzMiAqKWNmZ19wcml2LT5leHRyYV9idWYgPSBjcHVfdG9fbGUzMihXTF9FWFRSQV9CVUZfTUFYKTsKLQllcnIgPSBicmNtZl9kZXZfaW9jdGwoY2ZnX3RvX25kZXYoY2ZnX3ByaXYpLCBCUkNNRl9DX0dFVF9CU1NfSU5GTywKLQkJCWNmZ19wcml2LT5leHRyYV9idWYsIFdMX0VYVFJBX0JVRl9NQVgpOwotCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigiQ291bGQgbm90IGdldCBic3MgaW5mbyAlZFxuIiwgZXJyKTsKLQkJZ290byB1cGRhdGVfYnNzX2luZm9fb3V0OwotCX0KLQotCWJpID0gKHN0cnVjdCBicmNtZl9ic3NfaW5mbyAqKShjZmdfcHJpdi0+ZXh0cmFfYnVmICsgNCk7Ci0JZXJyID0gYnJjbWZfaW5mb3JtX3NpbmdsZV9ic3MoY2ZnX3ByaXYsIGJpKTsKLQlpZiAodW5saWtlbHkoZXJyKSkKLQkJZ290byB1cGRhdGVfYnNzX2luZm9fb3V0OwotCi0JaWUgPSAoKHU4ICopYmkpICsgYmktPmllX29mZnNldDsKLQlpZV9sZW4gPSBiaS0+aWVfbGVuZ3RoOwotCWJlYWNvbl9pbnRlcnZhbCA9IGNwdV90b19sZTE2KGJpLT5iZWFjb25fcGVyaW9kKTsKLQotCXRpbSA9IGJyY211X3BhcnNlX3RsdnMoaWUsIGllX2xlbiwgV0xBTl9FSURfVElNKTsKLQlpZiAodGltKQotCQlkdGltX3BlcmlvZCA9IHRpbS0+ZGF0YVsxXTsKLQllbHNlIHsKLQkJLyoKLQkJKiBhY3RpdmUgc2NhbiB3YXMgZG9uZSBzbyB3ZSBjb3VsZCBub3QgZ2V0IGR0aW0KLQkJKiBpbmZvcm1hdGlvbiBvdXQgb2YgcHJvYmUgcmVzcG9uc2UuCi0JCSogc28gd2Ugc3BlZmljaWFsbHkgcXVlcnkgZHRpbSBpbmZvcm1hdGlvbiB0byBkb25nbGUuCi0JCSovCi0JCXUzMiB2YXI7Ci0JCWVyciA9IGJyY21mX2Rldl9pbnR2YXJfZ2V0KGNmZ190b19uZGV2KGNmZ19wcml2KSwKLQkJCQkJICAgImR0aW1fYXNzb2MiLCAmdmFyKTsKLQkJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJCVdMX0VSUigid2wgZHRpbV9hc3NvYyBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKLQkJCWdvdG8gdXBkYXRlX2Jzc19pbmZvX291dDsKLQkJfQotCQlkdGltX3BlcmlvZCA9ICh1OCl2YXI7Ci0JfQotCi0JYnJjbWZfdXBkYXRlX3Byb2YoY2ZnX3ByaXYsIE5VTEwsICZiZWFjb25faW50ZXJ2YWwsIFdMX1BST0ZfQkVBQ09OSU5UKTsKLQlicmNtZl91cGRhdGVfcHJvZihjZmdfcHJpdiwgTlVMTCwgJmR0aW1fcGVyaW9kLCBXTF9QUk9GX0RUSU1QRVJJT0QpOwotCi11cGRhdGVfYnNzX2luZm9fb3V0OgotCVdMX1RSQUNFKCJFeGl0Iik7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHMzMgotYnJjbWZfYnNzX3JvYW1pbmdfZG9uZShzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYsCi0JCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJICAgICAgIGNvbnN0IHN0cnVjdCBicmNtZl9ldmVudF9tc2cgKmUsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX2Nvbm5lY3RfaW5mbyAqY29ubl9pbmZvID0gY2ZnX3RvX2Nvbm4oY2ZnX3ByaXYpOwotCXMzMiBlcnIgPSAwOwotCi0JV0xfVFJBQ0UoIkVudGVyXG4iKTsKLQotCWJyY21mX2dldF9hc3NvY19pZXMoY2ZnX3ByaXYpOwotCWJyY21mX3VwZGF0ZV9wcm9mKGNmZ19wcml2LCBOVUxMLCAmZS0+YWRkciwgV0xfUFJPRl9CU1NJRCk7Ci0JYnJjbWZfdXBkYXRlX2Jzc19pbmZvKGNmZ19wcml2KTsKLQotCWNmZzgwMjExX3JvYW1lZChuZGV2LCBOVUxMLAotCQkJKHU4ICopYnJjbWZfcmVhZF9wcm9mKGNmZ19wcml2LCBXTF9QUk9GX0JTU0lEKSwKLQkJCWNvbm5faW5mby0+cmVxX2llLCBjb25uX2luZm8tPnJlcV9pZV9sZW4sCi0JCQljb25uX2luZm8tPnJlc3BfaWUsIGNvbm5faW5mby0+cmVzcF9pZV9sZW4sIEdGUF9LRVJORUwpOwotCVdMX0NPTk4oIlJlcG9ydCByb2FtaW5nIHJlc3VsdFxuIik7Ci0KLQlzZXRfYml0KFdMX1NUQVRVU19DT05ORUNURUQsICZjZmdfcHJpdi0+c3RhdHVzKTsKLQlXTF9UUkFDRSgiRXhpdFxuIik7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHMzMgotYnJjbWZfYnNzX2Nvbm5lY3RfZG9uZShzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYsCi0JCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgY29uc3Qgc3RydWN0IGJyY21mX2V2ZW50X21zZyAqZSwKLQkJICAgICAgIHZvaWQgKmRhdGEsIGJvb2wgY29tcGxldGVkKQotewotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9jb25uZWN0X2luZm8gKmNvbm5faW5mbyA9IGNmZ190b19jb25uKGNmZ19wcml2KTsKLQlzMzIgZXJyID0gMDsKLQotCVdMX1RSQUNFKCJFbnRlclxuIik7Ci0KLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFdMX1NUQVRVU19DT05ORUNUSU5HLCAmY2ZnX3ByaXYtPnN0YXR1cykpIHsKLQkJaWYgKGNvbXBsZXRlZCkgewotCQkJYnJjbWZfZ2V0X2Fzc29jX2llcyhjZmdfcHJpdik7Ci0JCQlicmNtZl91cGRhdGVfcHJvZihjZmdfcHJpdiwgTlVMTCwgJmUtPmFkZHIsCi0JCQkJCSAgV0xfUFJPRl9CU1NJRCk7Ci0JCQlicmNtZl91cGRhdGVfYnNzX2luZm8oY2ZnX3ByaXYpOwotCQl9Ci0JCWNmZzgwMjExX2Nvbm5lY3RfcmVzdWx0KG5kZXYsCi0JCQkJCSh1OCAqKWJyY21mX3JlYWRfcHJvZihjZmdfcHJpdiwKLQkJCQkJCQkgICAgICBXTF9QUk9GX0JTU0lEKSwKLQkJCQkJY29ubl9pbmZvLT5yZXFfaWUsCi0JCQkJCWNvbm5faW5mby0+cmVxX2llX2xlbiwKLQkJCQkJY29ubl9pbmZvLT5yZXNwX2llLAotCQkJCQljb25uX2luZm8tPnJlc3BfaWVfbGVuLAotCQkJCQljb21wbGV0ZWQgPyBXTEFOX1NUQVRVU19TVUNDRVNTIDoKLQkJCQkJCSAgICBXTEFOX1NUQVRVU19BVVRIX1RJTUVPVVQsCi0JCQkJCUdGUF9LRVJORUwpOwotCQlpZiAoY29tcGxldGVkKQotCQkJc2V0X2JpdChXTF9TVEFUVVNfQ09OTkVDVEVELCAmY2ZnX3ByaXYtPnN0YXR1cyk7Ci0JCVdMX0NPTk4oIlJlcG9ydCBjb25uZWN0IHJlc3VsdCAtIGNvbm5lY3Rpb24gJXNcbiIsCi0JCQkJY29tcGxldGVkID8gInN1Y2NlZWRlZCIgOiAiZmFpbGVkIik7Ci0JfQotCVdMX1RSQUNFKCJFeGl0XG4iKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgczMyCi1icmNtZl9ub3RpZnlfbWljX3N0YXR1cyhzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYsCi0JCQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCWNvbnN0IHN0cnVjdCBicmNtZl9ldmVudF9tc2cgKmUsIHZvaWQgKmRhdGEpCi17Ci0JdTE2IGZsYWdzID0gYmUxNl90b19jcHUoZS0+ZmxhZ3MpOwotCWVudW0gbmw4MDIxMV9rZXlfdHlwZSBrZXlfdHlwZTsKLQotCXJ0bmxfbG9jaygpOwotCWlmIChmbGFncyAmIEJSQ01GX0VWRU5UX01TR19HUk9VUCkKLQkJa2V5X3R5cGUgPSBOTDgwMjExX0tFWVRZUEVfR1JPVVA7Ci0JZWxzZQotCQlrZXlfdHlwZSA9IE5MODAyMTFfS0VZVFlQRV9QQUlSV0lTRTsKLQotCWNmZzgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUobmRldiwgKHU4ICopJmUtPmFkZHIsIGtleV90eXBlLCAtMSwKLQkJCQkgICAgIE5VTEwsIEdGUF9LRVJORUwpOwotCXJ0bmxfdW5sb2NrKCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHMzMgotYnJjbWZfbm90aWZ5X3NjYW5fc3RhdHVzKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiwKLQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCSBjb25zdCBzdHJ1Y3QgYnJjbWZfZXZlbnRfbXNnICplLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBicmNtZl9jaGFubmVsX2luZm8gY2hhbm5lbF9pbmZvcm07Ci0Jc3RydWN0IGJyY21mX3NjYW5fcmVzdWx0cyAqYnNzX2xpc3Q7Ci0JdTMyIGxlbiA9IFdMX1NDQU5fQlVGX01BWDsKLQlzMzIgZXJyID0gMDsKLQlib29sIHNjYW5fYWJvcnQgPSBmYWxzZTsKLQotCVdMX1RSQUNFKCJFbnRlclxuIik7Ci0KLQlpZiAoY2ZnX3ByaXYtPmlzY2FuX29uICYmIGNmZ19wcml2LT5pc2Nhbl9raWNrc3RhcnQpIHsKLQkJV0xfVFJBQ0UoIkV4aXRcbiIpOwotCQlyZXR1cm4gYnJjbWZfd2FrZXVwX2lzY2FuKGNmZ190b19pc2NhbihjZmdfcHJpdikpOwotCX0KLQotCWlmICh1bmxpa2VseSghdGVzdF9hbmRfY2xlYXJfYml0KFdMX1NUQVRVU19TQ0FOTklORywKLQkJCQkJICZjZmdfcHJpdi0+c3RhdHVzKSkpIHsKLQkJV0xfRVJSKCJTY2FuIGNvbXBsZXRlIHdoaWxlIGRldmljZSBub3Qgc2Nhbm5pbmdcbiIpOwotCQlzY2FuX2Fib3J0ID0gdHJ1ZTsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBzY2FuX2RvbmVfb3V0OwotCX0KLQotCWVyciA9IGJyY21mX2Rldl9pb2N0bChuZGV2LCBCUkNNRl9DX0dFVF9DSEFOTkVMLCAmY2hhbm5lbF9pbmZvcm0sCi0JCQlzaXplb2YoY2hhbm5lbF9pbmZvcm0pKTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoInNjYW4gYnVzeSAoJWQpXG4iLCBlcnIpOwotCQlzY2FuX2Fib3J0ID0gdHJ1ZTsKLQkJZ290byBzY2FuX2RvbmVfb3V0OwotCX0KLQljaGFubmVsX2luZm9ybS5zY2FuX2NoYW5uZWwgPSBsZTMyX3RvX2NwdShjaGFubmVsX2luZm9ybS5zY2FuX2NoYW5uZWwpOwotCWlmICh1bmxpa2VseShjaGFubmVsX2luZm9ybS5zY2FuX2NoYW5uZWwpKSB7Ci0KLQkJV0xfQ09OTigiY2hhbm5lbF9pbmZvcm0uc2Nhbl9jaGFubmVsICglZClcbiIsCi0JCSAgICAgICBjaGFubmVsX2luZm9ybS5zY2FuX2NoYW5uZWwpOwotCX0KLQljZmdfcHJpdi0+YnNzX2xpc3QgPSBjZmdfcHJpdi0+c2Nhbl9yZXN1bHRzOwotCWJzc19saXN0ID0gY2ZnX3ByaXYtPmJzc19saXN0OwotCW1lbXNldChic3NfbGlzdCwgMCwgbGVuKTsKLQlic3NfbGlzdC0+YnVmbGVuID0gY3B1X3RvX2xlMzIobGVuKTsKLQotCWVyciA9IGJyY21mX2Rldl9pb2N0bChuZGV2LCBCUkNNRl9DX1NDQU5fUkVTVUxUUywgYnNzX2xpc3QsIGxlbik7Ci0JaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCIlcyBTY2FuX3Jlc3VsdHMgZXJyb3IgKCVkKVxuIiwgbmRldi0+bmFtZSwgZXJyKTsKLQkJZXJyID0gLUVJTlZBTDsKLQkJc2Nhbl9hYm9ydCA9IHRydWU7Ci0JCWdvdG8gc2Nhbl9kb25lX291dDsKLQl9Ci0JYnNzX2xpc3QtPmJ1ZmxlbiA9IGxlMzJfdG9fY3B1KGJzc19saXN0LT5idWZsZW4pOwotCWJzc19saXN0LT52ZXJzaW9uID0gbGUzMl90b19jcHUoYnNzX2xpc3QtPnZlcnNpb24pOwotCWJzc19saXN0LT5jb3VudCA9IGxlMzJfdG9fY3B1KGJzc19saXN0LT5jb3VudCk7Ci0KLQllcnIgPSBicmNtZl9pbmZvcm1fYnNzKGNmZ19wcml2KTsKLQlpZiAoZXJyKSB7Ci0JCXNjYW5fYWJvcnQgPSB0cnVlOwotCQlnb3RvIHNjYW5fZG9uZV9vdXQ7Ci0JfQotCi1zY2FuX2RvbmVfb3V0OgotCWlmIChjZmdfcHJpdi0+c2Nhbl9yZXF1ZXN0KSB7Ci0JCVdMX1NDQU4oImNhbGxpbmcgY2ZnODAyMTFfc2Nhbl9kb25lXG4iKTsKLQkJY2ZnODAyMTFfc2Nhbl9kb25lKGNmZ19wcml2LT5zY2FuX3JlcXVlc3QsIHNjYW5fYWJvcnQpOwotCQlicmNtZl9zZXRfbXBjKG5kZXYsIDEpOwotCQljZmdfcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gTlVMTDsKLQl9Ci0KLQlXTF9UUkFDRSgiRXhpdFxuIik7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBicmNtZl9pbml0X2NvbmYoc3RydWN0IGJyY21mX2NmZzgwMjExX2NvbmYgKmNvbmYpCi17Ci0JY29uZi0+bW9kZSA9ICh1MzIpLTE7Ci0JY29uZi0+ZnJhZ190aHJlc2hvbGQgPSAodTMyKS0xOwotCWNvbmYtPnJ0c190aHJlc2hvbGQgPSAodTMyKS0xOwotCWNvbmYtPnJldHJ5X3Nob3J0ID0gKHUzMiktMTsKLQljb25mLT5yZXRyeV9sb25nID0gKHUzMiktMTsKLQljb25mLT50eF9wb3dlciA9IC0xOwotfQotCi1zdGF0aWMgdm9pZCBicmNtZl9pbml0X3Byb2Yoc3RydWN0IGJyY21mX2NmZzgwMjExX3Byb2ZpbGUgKnByb2YpCi17Ci0JbWVtc2V0KHByb2YsIDAsIHNpemVvZigqcHJvZikpOwotfQotCi1zdGF0aWMgdm9pZCBicmNtZl9pbml0X2Vsb29wX2hhbmRsZXIoc3RydWN0IGJyY21mX2NmZzgwMjExX2V2ZW50X2xvb3AgKmVsKQotewotCW1lbXNldChlbCwgMCwgc2l6ZW9mKCplbCkpOwotCWVsLT5oYW5kbGVyW0JSQ01GX0VfU0NBTl9DT01QTEVURV0gPSBicmNtZl9ub3RpZnlfc2Nhbl9zdGF0dXM7Ci0JZWwtPmhhbmRsZXJbQlJDTUZfRV9MSU5LXSA9IGJyY21mX25vdGlmeV9jb25uZWN0X3N0YXR1czsKLQllbC0+aGFuZGxlcltCUkNNRl9FX1JPQU1dID0gYnJjbWZfbm90aWZ5X3JvYW1pbmdfc3RhdHVzOwotCWVsLT5oYW5kbGVyW0JSQ01GX0VfTUlDX0VSUk9SXSA9IGJyY21mX25vdGlmeV9taWNfc3RhdHVzOwotCWVsLT5oYW5kbGVyW0JSQ01GX0VfU0VUX1NTSURdID0gYnJjbWZfbm90aWZ5X2Nvbm5lY3Rfc3RhdHVzOwotfQotCi1zdGF0aWMgczMyIGJyY21mX2luaXRfcHJpdl9tZW0oc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2KQotewotCWNmZ19wcml2LT5zY2FuX3Jlc3VsdHMgPSBremFsbG9jKFdMX1NDQU5fQlVGX01BWCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHVubGlrZWx5KCFjZmdfcHJpdi0+c2Nhbl9yZXN1bHRzKSkgewotCQlXTF9FUlIoIlNjYW4gcmVzdWx0cyBhbGxvYyBmYWlsZWRcbiIpOwotCQlnb3RvIGluaXRfcHJpdl9tZW1fb3V0OwotCX0KLQljZmdfcHJpdi0+Y29uZiA9IGt6YWxsb2Moc2l6ZW9mKCpjZmdfcHJpdi0+Y29uZiksIEdGUF9LRVJORUwpOwotCWlmICh1bmxpa2VseSghY2ZnX3ByaXYtPmNvbmYpKSB7Ci0JCVdMX0VSUigid2xfY29uZiBhbGxvYyBmYWlsZWRcbiIpOwotCQlnb3RvIGluaXRfcHJpdl9tZW1fb3V0OwotCX0KLQljZmdfcHJpdi0+cHJvZmlsZSA9IGt6YWxsb2Moc2l6ZW9mKCpjZmdfcHJpdi0+cHJvZmlsZSksIEdGUF9LRVJORUwpOwotCWlmICh1bmxpa2VseSghY2ZnX3ByaXYtPnByb2ZpbGUpKSB7Ci0JCVdMX0VSUigid2xfcHJvZmlsZSBhbGxvYyBmYWlsZWRcbiIpOwotCQlnb3RvIGluaXRfcHJpdl9tZW1fb3V0OwotCX0KLQljZmdfcHJpdi0+YnNzX2luZm8gPSBremFsbG9jKFdMX0JTU19JTkZPX01BWCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHVubGlrZWx5KCFjZmdfcHJpdi0+YnNzX2luZm8pKSB7Ci0JCVdMX0VSUigiQnNzIGluZm9ybWF0aW9uIGFsbG9jIGZhaWxlZFxuIik7Ci0JCWdvdG8gaW5pdF9wcml2X21lbV9vdXQ7Ci0JfQotCWNmZ19wcml2LT5zY2FuX3JlcV9pbnQgPSBremFsbG9jKHNpemVvZigqY2ZnX3ByaXYtPnNjYW5fcmVxX2ludCksCi0JCQkJCSBHRlBfS0VSTkVMKTsKLQlpZiAodW5saWtlbHkoIWNmZ19wcml2LT5zY2FuX3JlcV9pbnQpKSB7Ci0JCVdMX0VSUigiU2NhbiByZXEgYWxsb2MgZmFpbGVkXG4iKTsKLQkJZ290byBpbml0X3ByaXZfbWVtX291dDsKLQl9Ci0JY2ZnX3ByaXYtPmlvY3RsX2J1ZiA9IGt6YWxsb2MoV0xfSU9DVExfTEVOX01BWCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHVubGlrZWx5KCFjZmdfcHJpdi0+aW9jdGxfYnVmKSkgewotCQlXTF9FUlIoIklvY3RsIGJ1ZiBhbGxvYyBmYWlsZWRcbiIpOwotCQlnb3RvIGluaXRfcHJpdl9tZW1fb3V0OwotCX0KLQljZmdfcHJpdi0+ZXh0cmFfYnVmID0ga3phbGxvYyhXTF9FWFRSQV9CVUZfTUFYLCBHRlBfS0VSTkVMKTsKLQlpZiAodW5saWtlbHkoIWNmZ19wcml2LT5leHRyYV9idWYpKSB7Ci0JCVdMX0VSUigiRXh0cmEgYnVmIGFsbG9jIGZhaWxlZFxuIik7Ci0JCWdvdG8gaW5pdF9wcml2X21lbV9vdXQ7Ci0JfQotCWNmZ19wcml2LT5pc2NhbiA9IGt6YWxsb2Moc2l6ZW9mKCpjZmdfcHJpdi0+aXNjYW4pLCBHRlBfS0VSTkVMKTsKLQlpZiAodW5saWtlbHkoIWNmZ19wcml2LT5pc2NhbikpIHsKLQkJV0xfRVJSKCJJc2NhbiBidWYgYWxsb2MgZmFpbGVkXG4iKTsKLQkJZ290byBpbml0X3ByaXZfbWVtX291dDsKLQl9Ci0JY2ZnX3ByaXYtPnBta19saXN0ID0ga3phbGxvYyhzaXplb2YoKmNmZ19wcml2LT5wbWtfbGlzdCksIEdGUF9LRVJORUwpOwotCWlmICh1bmxpa2VseSghY2ZnX3ByaXYtPnBta19saXN0KSkgewotCQlXTF9FUlIoInBtayBsaXN0IGFsbG9jIGZhaWxlZFxuIik7Ci0JCWdvdG8gaW5pdF9wcml2X21lbV9vdXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWluaXRfcHJpdl9tZW1fb3V0OgotCWJyY21mX2RlaW5pdF9wcml2X21lbShjZmdfcHJpdik7Ci0KLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotc3RhdGljIHZvaWQgYnJjbWZfZGVpbml0X3ByaXZfbWVtKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdikKLXsKLQlrZnJlZShjZmdfcHJpdi0+c2Nhbl9yZXN1bHRzKTsKLQljZmdfcHJpdi0+c2Nhbl9yZXN1bHRzID0gTlVMTDsKLQlrZnJlZShjZmdfcHJpdi0+YnNzX2luZm8pOwotCWNmZ19wcml2LT5ic3NfaW5mbyA9IE5VTEw7Ci0Ja2ZyZWUoY2ZnX3ByaXYtPmNvbmYpOwotCWNmZ19wcml2LT5jb25mID0gTlVMTDsKLQlrZnJlZShjZmdfcHJpdi0+cHJvZmlsZSk7Ci0JY2ZnX3ByaXYtPnByb2ZpbGUgPSBOVUxMOwotCWtmcmVlKGNmZ19wcml2LT5zY2FuX3JlcV9pbnQpOwotCWNmZ19wcml2LT5zY2FuX3JlcV9pbnQgPSBOVUxMOwotCWtmcmVlKGNmZ19wcml2LT5pb2N0bF9idWYpOwotCWNmZ19wcml2LT5pb2N0bF9idWYgPSBOVUxMOwotCWtmcmVlKGNmZ19wcml2LT5leHRyYV9idWYpOwotCWNmZ19wcml2LT5leHRyYV9idWYgPSBOVUxMOwotCWtmcmVlKGNmZ19wcml2LT5pc2Nhbik7Ci0JY2ZnX3ByaXYtPmlzY2FuID0gTlVMTDsKLQlrZnJlZShjZmdfcHJpdi0+cG1rX2xpc3QpOwotCWNmZ19wcml2LT5wbWtfbGlzdCA9IE5VTEw7Ci19Ci0KLXN0YXRpYyBzMzIgYnJjbWZfY3JlYXRlX2V2ZW50X2hhbmRsZXIoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2KQotewotCXNlbWFfaW5pdCgmY2ZnX3ByaXYtPmV2ZW50X3N5bmMsIDApOwotCWNmZ19wcml2LT5ldmVudF90c2sgPSBrdGhyZWFkX3J1bihicmNtZl9ldmVudF9oYW5kbGVyLCBjZmdfcHJpdiwKLQkJCQkJICAid2xfZXZlbnRfaGFuZGxlciIpOwotCWlmIChJU19FUlIoY2ZnX3ByaXYtPmV2ZW50X3RzaykpIHsKLQkJY2ZnX3ByaXYtPmV2ZW50X3RzayA9IE5VTEw7Ci0JCVdMX0VSUigiZmFpbGVkIHRvIGNyZWF0ZSBldmVudCB0aHJlYWRcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21mX2Rlc3Ryb3lfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpCi17Ci0JaWYgKGNmZ19wcml2LT5ldmVudF90c2spIHsKLQkJc2VuZF9zaWcoU0lHVEVSTSwgY2ZnX3ByaXYtPmV2ZW50X3RzaywgMSk7Ci0JCWt0aHJlYWRfc3RvcChjZmdfcHJpdi0+ZXZlbnRfdHNrKTsKLQkJY2ZnX3ByaXYtPmV2ZW50X3RzayA9IE5VTEw7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBicmNtZl90ZXJtX2lzY2FuKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdikKLXsKLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfaXNjYW5fY3RybCAqaXNjYW4gPSBjZmdfdG9faXNjYW4oY2ZnX3ByaXYpOwotCi0JaWYgKGNmZ19wcml2LT5pc2Nhbl9vbiAmJiBpc2Nhbi0+dHNrKSB7Ci0JCWlzY2FuLT5zdGF0ZSA9IFdMX0lTQ0FOX1NUQVRFX0lETEU7Ci0JCXNlbmRfc2lnKFNJR1RFUk0sIGlzY2FuLT50c2ssIDEpOwotCQlrdGhyZWFkX3N0b3AoaXNjYW4tPnRzayk7Ci0JCWlzY2FuLT50c2sgPSBOVUxMOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYnJjbWZfbm90aWZ5X2lzY2FuX2NvbXBsZXRlKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9pc2Nhbl9jdHJsICppc2NhbiwKLQkJCQkJYm9vbCBhYm9ydGVkKQotewotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiA9IGlzY2FuX3RvX2NmZyhpc2Nhbik7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBjZmdfdG9fbmRldihjZmdfcHJpdik7Ci0KLQlpZiAodW5saWtlbHkoIXRlc3RfYW5kX2NsZWFyX2JpdChXTF9TVEFUVVNfU0NBTk5JTkcsCi0JCQkJCSAmY2ZnX3ByaXYtPnN0YXR1cykpKSB7Ci0JCVdMX0VSUigiU2NhbiBjb21wbGV0ZSB3aGlsZSBkZXZpY2Ugbm90IHNjYW5uaW5nXG4iKTsKLQkJcmV0dXJuOwotCX0KLQlpZiAobGlrZWx5KGNmZ19wcml2LT5zY2FuX3JlcXVlc3QpKSB7Ci0JCVdMX1NDQU4oIklTQ0FOIENvbXBsZXRlZCBzY2FuOiAlc1xuIiwKLQkJCQlhYm9ydGVkID8gIkFib3J0ZWQiIDogIkRvbmUiKTsKLQkJY2ZnODAyMTFfc2Nhbl9kb25lKGNmZ19wcml2LT5zY2FuX3JlcXVlc3QsIGFib3J0ZWQpOwotCQlicmNtZl9zZXRfbXBjKG5kZXYsIDEpOwotCQljZmdfcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gTlVMTDsKLQl9Ci0JY2ZnX3ByaXYtPmlzY2FuX2tpY2tzdGFydCA9IGZhbHNlOwotfQotCi1zdGF0aWMgczMyIGJyY21mX3dha2V1cF9pc2NhbihzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfaXNjYW5fY3RybCAqaXNjYW4pCi17Ci0JaWYgKGxpa2VseShpc2Nhbi0+c3RhdGUgIT0gV0xfSVNDQU5fU1RBVEVfSURMRSkpIHsKLQkJV0xfU0NBTigid2FrZSB1cCBpc2NhblxuIik7Ci0JCXVwKCZpc2Nhbi0+c3luYyk7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiAtRUlPOwotfQotCi1zdGF0aWMgczMyCi1icmNtZl9nZXRfaXNjYW5fcmVzdWx0cyhzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfaXNjYW5fY3RybCAqaXNjYW4sIHUzMiAqc3RhdHVzLAotCQkgICAgIHN0cnVjdCBicmNtZl9zY2FuX3Jlc3VsdHMgKipic3NfbGlzdCkKLXsKLQlzdHJ1Y3QgYnJjbWZfaXNjYW5fcmVzdWx0cyBsaXN0OwotCXN0cnVjdCBicmNtZl9zY2FuX3Jlc3VsdHMgKnJlc3VsdHM7Ci0Jc3RydWN0IGJyY21mX2lzY2FuX3Jlc3VsdHMgKmxpc3RfYnVmOwotCXMzMiBlcnIgPSAwOwotCi0JbWVtc2V0KGlzY2FuLT5zY2FuX2J1ZiwgMCwgV0xfSVNDQU5fQlVGX01BWCk7Ci0JbGlzdF9idWYgPSAoc3RydWN0IGJyY21mX2lzY2FuX3Jlc3VsdHMgKilpc2Nhbi0+c2Nhbl9idWY7Ci0JcmVzdWx0cyA9ICZsaXN0X2J1Zi0+cmVzdWx0czsKLQlyZXN1bHRzLT5idWZsZW4gPSBCUkNNRl9JU0NBTl9SRVNVTFRTX0ZJWEVEX1NJWkU7Ci0JcmVzdWx0cy0+dmVyc2lvbiA9IDA7Ci0JcmVzdWx0cy0+Y291bnQgPSAwOwotCi0JbWVtc2V0KCZsaXN0LCAwLCBzaXplb2YobGlzdCkpOwotCWxpc3QucmVzdWx0cy5idWZsZW4gPSBjcHVfdG9fbGUzMihXTF9JU0NBTl9CVUZfTUFYKTsKLQllcnIgPSBicmNtZl9kZXZfaW92YXJfZ2V0YnVmKGlzY2FuLT5kZXYsICJpc2NhbnJlc3VsdHMiLCAmbGlzdCwKLQkJCQlCUkNNRl9JU0NBTl9SRVNVTFRTX0ZJWEVEX1NJWkUsIGlzY2FuLT5zY2FuX2J1ZiwKLQkJCQlXTF9JU0NBTl9CVUZfTUFYKTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoImVycm9yICglZClcbiIsIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCXJlc3VsdHMtPmJ1ZmxlbiA9IGxlMzJfdG9fY3B1KHJlc3VsdHMtPmJ1Zmxlbik7Ci0JcmVzdWx0cy0+dmVyc2lvbiA9IGxlMzJfdG9fY3B1KHJlc3VsdHMtPnZlcnNpb24pOwotCXJlc3VsdHMtPmNvdW50ID0gbGUzMl90b19jcHUocmVzdWx0cy0+Y291bnQpOwotCVdMX1NDQU4oInJlc3VsdHMtPmNvdW50ID0gJWRcbiIsIHJlc3VsdHMtPmNvdW50KTsKLQlXTF9TQ0FOKCJyZXN1bHRzLT5idWZsZW4gPSAlZFxuIiwgcmVzdWx0cy0+YnVmbGVuKTsKLQkqc3RhdHVzID0gbGUzMl90b19jcHUobGlzdF9idWYtPnN0YXR1cyk7Ci0JKmJzc19saXN0ID0gcmVzdWx0czsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBzMzIgYnJjbWZfaXNjYW5fZG9uZShzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpCi17Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX2lzY2FuX2N0cmwgKmlzY2FuID0gY2ZnX3ByaXYtPmlzY2FuOwotCXMzMiBlcnIgPSAwOwotCi0JaXNjYW4tPnN0YXRlID0gV0xfSVNDQU5fU1RBVEVfSURMRTsKLQlydG5sX2xvY2soKTsKLQlicmNtZl9pbmZvcm1fYnNzKGNmZ19wcml2KTsKLQlicmNtZl9ub3RpZnlfaXNjYW5fY29tcGxldGUoaXNjYW4sIGZhbHNlKTsKLQlydG5sX3VubG9jaygpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHMzMiBicmNtZl9pc2Nhbl9wZW5kaW5nKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdikKLXsKLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfaXNjYW5fY3RybCAqaXNjYW4gPSBjZmdfcHJpdi0+aXNjYW47Ci0JczMyIGVyciA9IDA7Ci0KLQkvKiBSZXNjaGVkdWxlIHRoZSB0aW1lciAqLwotCW1vZF90aW1lcigmaXNjYW4tPnRpbWVyLCBqaWZmaWVzICsgaXNjYW4tPnRpbWVyX21zICogSFogLyAxMDAwKTsKLQlpc2Nhbi0+dGltZXJfb24gPSAxOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHMzMiBicmNtZl9pc2Nhbl9pbnByb2dyZXNzKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdikKLXsKLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfaXNjYW5fY3RybCAqaXNjYW4gPSBjZmdfcHJpdi0+aXNjYW47Ci0JczMyIGVyciA9IDA7Ci0KLQlydG5sX2xvY2soKTsKLQlicmNtZl9pbmZvcm1fYnNzKGNmZ19wcml2KTsKLQlicmNtZl9ydW5faXNjYW4oaXNjYW4sIE5VTEwsIEJSQ01GX1NDQU5fQUNUSU9OX0NPTlRJTlVFKTsKLQlydG5sX3VubG9jaygpOwotCS8qIFJlc2NoZWR1bGUgdGhlIHRpbWVyICovCi0JbW9kX3RpbWVyKCZpc2Nhbi0+dGltZXIsIGppZmZpZXMgKyBpc2Nhbi0+dGltZXJfbXMgKiBIWiAvIDEwMDApOwotCWlzY2FuLT50aW1lcl9vbiA9IDE7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgczMyIGJyY21mX2lzY2FuX2Fib3J0ZWQoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2KQotewotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9pc2Nhbl9jdHJsICppc2NhbiA9IGNmZ19wcml2LT5pc2NhbjsKLQlzMzIgZXJyID0gMDsKLQotCWlzY2FuLT5zdGF0ZSA9IFdMX0lTQ0FOX1NUQVRFX0lETEU7Ci0JcnRubF9sb2NrKCk7Ci0JYnJjbWZfbm90aWZ5X2lzY2FuX2NvbXBsZXRlKGlzY2FuLCB0cnVlKTsKLQlydG5sX3VubG9jaygpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHMzMiBicmNtZl9pc2Nhbl90aHJlYWQodm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW0gPSB7LnNjaGVkX3ByaW9yaXR5ID0gTUFYX1JUX1BSSU8gLSAxIH07Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX2lzY2FuX2N0cmwgKmlzY2FuID0KLQkJCShzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfaXNjYW5fY3RybCAqKWRhdGE7Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2ID0gaXNjYW5fdG9fY2ZnKGlzY2FuKTsKLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfaXNjYW5fZWxvb3AgKmVsID0gJmlzY2FuLT5lbDsKLQl1MzIgc3RhdHVzOwotCWludCBlcnIgPSAwOwotCi0Jc2NoZWRfc2V0c2NoZWR1bGVyKGN1cnJlbnQsIFNDSEVEX0ZJRk8sICZwYXJhbSk7Ci0JYWxsb3dfc2lnbmFsKFNJR1RFUk0pOwotCXN0YXR1cyA9IEJSQ01GX1NDQU5fUkVTVUxUU19QQVJUSUFMOwotCXdoaWxlIChsaWtlbHkoIWRvd25faW50ZXJydXB0aWJsZSgmaXNjYW4tPnN5bmMpKSkgewotCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQotCQkJYnJlYWs7Ci0JCWlmIChpc2Nhbi0+dGltZXJfb24pIHsKLQkJCWRlbF90aW1lcl9zeW5jKCZpc2Nhbi0+dGltZXIpOwotCQkJaXNjYW4tPnRpbWVyX29uID0gMDsKLQkJfQotCQlydG5sX2xvY2soKTsKLQkJZXJyID0gYnJjbWZfZ2V0X2lzY2FuX3Jlc3VsdHMoaXNjYW4sICZzdGF0dXMsCi0JCQkJCSAgICAgICZjZmdfcHJpdi0+YnNzX2xpc3QpOwotCQlpZiAodW5saWtlbHkoZXJyKSkgewotCQkJc3RhdHVzID0gQlJDTUZfU0NBTl9SRVNVTFRTX0FCT1JURUQ7Ci0JCQlXTF9FUlIoIkFib3J0IGlzY2FuXG4iKTsKLQkJfQotCQlydG5sX3VubG9jaygpOwotCQllbC0+aGFuZGxlcltzdGF0dXNdKGNmZ19wcml2KTsKLQl9Ci0JaWYgKGlzY2FuLT50aW1lcl9vbikgewotCQlkZWxfdGltZXJfc3luYygmaXNjYW4tPnRpbWVyKTsKLQkJaXNjYW4tPnRpbWVyX29uID0gMDsKLQl9Ci0JV0xfU0NBTigiSVNDQU4gdGhyZWFkIHRlcm1pbmF0ZWRcbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21mX2lzY2FuX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfaXNjYW5fY3RybCAqaXNjYW4gPQotCQkJKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9pc2Nhbl9jdHJsICopZGF0YTsKLQotCWlmIChpc2NhbikgewotCQlpc2Nhbi0+dGltZXJfb24gPSAwOwotCQlXTF9TQ0FOKCJ0aW1lciBleHBpcmVkXG4iKTsKLQkJYnJjbWZfd2FrZXVwX2lzY2FuKGlzY2FuKTsKLQl9Ci19Ci0KLXN0YXRpYyBzMzIgYnJjbWZfaW52b2tlX2lzY2FuKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdikKLXsKLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfaXNjYW5fY3RybCAqaXNjYW4gPSBjZmdfdG9faXNjYW4oY2ZnX3ByaXYpOwotCWludCBlcnIgPSAwOwotCi0JaWYgKGNmZ19wcml2LT5pc2Nhbl9vbiAmJiAhaXNjYW4tPnRzaykgewotCQlpc2Nhbi0+c3RhdGUgPSBXTF9JU0NBTl9TVEFURV9JRExFOwotCQlzZW1hX2luaXQoJmlzY2FuLT5zeW5jLCAwKTsKLQkJaXNjYW4tPnRzayA9IGt0aHJlYWRfcnVuKGJyY21mX2lzY2FuX3RocmVhZCwgaXNjYW4sICJ3bF9pc2NhbiIpOwotCQlpZiAoSVNfRVJSKGlzY2FuLT50c2spKSB7Ci0JCQlXTF9FUlIoIkNvdWxkIG5vdCBjcmVhdGUgaXNjYW4gdGhyZWFkXG4iKTsKLQkJCWlzY2FuLT50c2sgPSBOVUxMOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBicmNtZl9pbml0X2lzY2FuX2Vsb29wKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9pc2Nhbl9lbG9vcCAqZWwpCi17Ci0JbWVtc2V0KGVsLCAwLCBzaXplb2YoKmVsKSk7Ci0JZWwtPmhhbmRsZXJbQlJDTUZfU0NBTl9SRVNVTFRTX1NVQ0NFU1NdID0gYnJjbWZfaXNjYW5fZG9uZTsKLQllbC0+aGFuZGxlcltCUkNNRl9TQ0FOX1JFU1VMVFNfUEFSVElBTF0gPSBicmNtZl9pc2Nhbl9pbnByb2dyZXNzOwotCWVsLT5oYW5kbGVyW0JSQ01GX1NDQU5fUkVTVUxUU19QRU5ESU5HXSA9IGJyY21mX2lzY2FuX3BlbmRpbmc7Ci0JZWwtPmhhbmRsZXJbQlJDTUZfU0NBTl9SRVNVTFRTX0FCT1JURURdID0gYnJjbWZfaXNjYW5fYWJvcnRlZDsKLQllbC0+aGFuZGxlcltCUkNNRl9TQ0FOX1JFU1VMVFNfTk9fTUVNXSA9IGJyY21mX2lzY2FuX2Fib3J0ZWQ7Ci19Ci0KLXN0YXRpYyBzMzIgYnJjbWZfaW5pdF9pc2NhbihzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpCi17Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX2lzY2FuX2N0cmwgKmlzY2FuID0gY2ZnX3RvX2lzY2FuKGNmZ19wcml2KTsKLQlpbnQgZXJyID0gMDsKLQotCWlmIChjZmdfcHJpdi0+aXNjYW5fb24pIHsKLQkJaXNjYW4tPmRldiA9IGNmZ190b19uZGV2KGNmZ19wcml2KTsKLQkJaXNjYW4tPnN0YXRlID0gV0xfSVNDQU5fU1RBVEVfSURMRTsKLQkJYnJjbWZfaW5pdF9pc2Nhbl9lbG9vcCgmaXNjYW4tPmVsKTsKLQkJaXNjYW4tPnRpbWVyX21zID0gV0xfSVNDQU5fVElNRVJfSU5URVJWQUxfTVM7Ci0JCWluaXRfdGltZXIoJmlzY2FuLT50aW1lcik7Ci0JCWlzY2FuLT50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGlzY2FuOwotCQlpc2Nhbi0+dGltZXIuZnVuY3Rpb24gPSBicmNtZl9pc2Nhbl90aW1lcjsKLQkJc2VtYV9pbml0KCZpc2Nhbi0+c3luYywgMCk7Ci0JCWlzY2FuLT50c2sgPSBrdGhyZWFkX3J1bihicmNtZl9pc2Nhbl90aHJlYWQsIGlzY2FuLCAid2xfaXNjYW4iKTsKLQkJaWYgKElTX0VSUihpc2Nhbi0+dHNrKSkgewotCQkJV0xfRVJSKCJDb3VsZCBub3QgY3JlYXRlIGlzY2FuIHRocmVhZFxuIik7Ci0JCQlpc2Nhbi0+dHNrID0gTlVMTDsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCWlzY2FuLT5kYXRhID0gY2ZnX3ByaXY7Ci0JfQotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHMzMiB3bF9pbml0X3ByaXYoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2KQotewotCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSBjZmdfdG9fd2lwaHkoY2ZnX3ByaXYpOwotCXMzMiBlcnIgPSAwOwotCi0JY2ZnX3ByaXYtPnNjYW5fcmVxdWVzdCA9IE5VTEw7Ci0JY2ZnX3ByaXYtPnB3cl9zYXZlID0gISEod2lwaHktPmZsYWdzICYgV0lQSFlfRkxBR19QU19PTl9CWV9ERUZBVUxUKTsKLQljZmdfcHJpdi0+aXNjYW5fb24gPSB0cnVlOwkvKiBpc2NhbiBvbiAmIG9mZiBzd2l0Y2guCi0JCQkJIHdlIGVuYWJsZSBpc2NhbiBwZXIgZGVmYXVsdCAqLwotCWNmZ19wcml2LT5yb2FtX29uID0gZmFsc2U7CS8qIHJvYW0gb24gJiBvZmYgc3dpdGNoLgotCQkJCSB3ZSBlbmFibGUgcm9hbSBwZXIgZGVmYXVsdCAqLwotCi0JY2ZnX3ByaXYtPmlzY2FuX2tpY2tzdGFydCA9IGZhbHNlOwotCWNmZ19wcml2LT5hY3RpdmVfc2NhbiA9IHRydWU7CS8qIHdlIGRvIGFjdGl2ZSBzY2FuIGZvcgotCQkJCSBzcGVjaWZpYyBzY2FuIHBlciBkZWZhdWx0ICovCi0JY2ZnX3ByaXYtPmRvbmdsZV91cCA9IGZhbHNlOwkvKiBkb25nbGUgaXMgbm90IHVwIHlldCAqLwotCWJyY21mX2luaXRfZXEoY2ZnX3ByaXYpOwotCWVyciA9IGJyY21mX2luaXRfcHJpdl9tZW0oY2ZnX3ByaXYpOwotCWlmICh1bmxpa2VseShlcnIpKQotCQlyZXR1cm4gZXJyOwotCWlmICh1bmxpa2VseShicmNtZl9jcmVhdGVfZXZlbnRfaGFuZGxlcihjZmdfcHJpdikpKQotCQlyZXR1cm4gLUVOT01FTTsKLQlicmNtZl9pbml0X2Vsb29wX2hhbmRsZXIoJmNmZ19wcml2LT5lbCk7Ci0JbXV0ZXhfaW5pdCgmY2ZnX3ByaXYtPnVzcl9zeW5jKTsKLQllcnIgPSBicmNtZl9pbml0X2lzY2FuKGNmZ19wcml2KTsKLQlpZiAodW5saWtlbHkoZXJyKSkKLQkJcmV0dXJuIGVycjsKLQlicmNtZl9pbml0X2NvbmYoY2ZnX3ByaXYtPmNvbmYpOwotCWJyY21mX2luaXRfcHJvZihjZmdfcHJpdi0+cHJvZmlsZSk7Ci0JYnJjbWZfbGlua19kb3duKGNmZ19wcml2KTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsX2RlaW5pdF9wcml2KHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdikKLXsKLQlicmNtZl9kZXN0cm95X2V2ZW50X2hhbmRsZXIoY2ZnX3ByaXYpOwotCWNmZ19wcml2LT5kb25nbGVfdXAgPSBmYWxzZTsJLyogZG9uZ2xlIGRvd24gKi8KLQlicmNtZl9mbHVzaF9lcShjZmdfcHJpdik7Ci0JYnJjbWZfbGlua19kb3duKGNmZ19wcml2KTsKLQlicmNtZl90ZXJtX2lzY2FuKGNmZ19wcml2KTsKLQlicmNtZl9kZWluaXRfcHJpdl9tZW0oY2ZnX3ByaXYpOwotfQotCi1zMzIgYnJjbWZfY2ZnODAyMTFfYXR0YWNoKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB2b2lkICpkYXRhKQotewotCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXY7Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2OwotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9pZmFjZSAqY2k7Ci0JczMyIGVyciA9IDA7Ci0KLQlpZiAodW5saWtlbHkoIW5kZXYpKSB7Ci0JCVdMX0VSUigibmRldiBpcyBpbnZhbGlkXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWNmZzgwMjExX2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9kZXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAodW5saWtlbHkoIWNmZzgwMjExX2RldikpIHsKLQkJV0xfRVJSKCJ3bF9jZmc4MDIxMV9kZXYgaXMgaW52YWxpZFxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlXTF9JTkZPKCJmdW5jICVwXG4iLCBicmNtZl9jZmc4MDIxMV9nZXRfc2Rpb19mdW5jKCkpOwotCXdkZXYgPSBicmNtZl9hbGxvY193ZGV2KHNpemVvZihzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfaWZhY2UpLAotCQkJCSZicmNtZl9jZmc4MDIxMV9nZXRfc2Rpb19mdW5jKCktPmRldik7Ci0JaWYgKElTX0VSUih3ZGV2KSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQl3ZGV2LT5pZnR5cGUgPSBicmNtZl9tb2RlX3RvX25sODAyMTFfaWZ0eXBlKFdMX01PREVfQlNTKTsKLQljZmdfcHJpdiA9IHdkZXZfdG9fY2ZnKHdkZXYpOwotCWNmZ19wcml2LT53ZGV2ID0gd2RldjsKLQljZmdfcHJpdi0+cHViID0gZGF0YTsKLQljaSA9IChzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfaWZhY2UgKikmY2ZnX3ByaXYtPmNpOwotCWNpLT5jZmdfcHJpdiA9IGNmZ19wcml2OwotCW5kZXYtPmllZWU4MDIxMV9wdHIgPSB3ZGV2OwotCVNFVF9ORVRERVZfREVWKG5kZXYsIHdpcGh5X2Rldih3ZGV2LT53aXBoeSkpOwotCXdkZXYtPm5ldGRldiA9IG5kZXY7Ci0JZXJyID0gd2xfaW5pdF9wcml2KGNmZ19wcml2KTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoIkZhaWxlZCB0byBpbml0IGl3bV9wcml2ICglZClcbiIsIGVycik7Ci0JCWdvdG8gY2ZnODAyMTFfYXR0YWNoX291dDsKLQl9Ci0JYnJjbWZfc2V0X2RydmRhdGEoY2ZnODAyMTFfZGV2LCBjaSk7Ci0KLQlyZXR1cm4gZXJyOwotCi1jZmc4MDIxMV9hdHRhY2hfb3V0OgotCWJyY21mX2ZyZWVfd2RldihjZmdfcHJpdik7Ci0JcmV0dXJuIGVycjsKLX0KLQotdm9pZCBicmNtZl9jZmc4MDIxMV9kZXRhY2godm9pZCkKLXsKLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXY7Ci0KLQljZmdfcHJpdiA9IFdMX1BSSVZfR0VUKCk7Ci0KLQl3bF9kZWluaXRfcHJpdihjZmdfcHJpdik7Ci0JYnJjbWZfZnJlZV93ZGV2KGNmZ19wcml2KTsKLQlicmNtZl9zZXRfZHJ2ZGF0YShjZmc4MDIxMV9kZXYsIE5VTEwpOwotCWtmcmVlKGNmZzgwMjExX2Rldik7Ci0JY2ZnODAyMTFfZGV2ID0gTlVMTDsKLQlicmNtZl9jbGVhcl9zZGlvX2Z1bmMoKTsKLX0KLQotc3RhdGljIHZvaWQgYnJjbWZfd2FrZXVwX2V2ZW50KHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdikKLXsKLQl1cCgmY2ZnX3ByaXYtPmV2ZW50X3N5bmMpOwotfQotCi1zdGF0aWMgczMyIGJyY21mX2V2ZW50X2hhbmRsZXIodm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYgPQotCQkJKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICopZGF0YTsKLQlzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW0gPSB7LnNjaGVkX3ByaW9yaXR5ID0gTUFYX1JUX1BSSU8gLSAxIH07Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX2V2ZW50X3EgKmU7Ci0KLQlzY2hlZF9zZXRzY2hlZHVsZXIoY3VycmVudCwgU0NIRURfRklGTywgJnBhcmFtKTsKLQlhbGxvd19zaWduYWwoU0lHVEVSTSk7Ci0Jd2hpbGUgKGxpa2VseSghZG93bl9pbnRlcnJ1cHRpYmxlKCZjZmdfcHJpdi0+ZXZlbnRfc3luYykpKSB7Ci0JCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCi0JCQlicmVhazsKLQkJZSA9IGJyY21mX2RlcV9ldmVudChjZmdfcHJpdik7Ci0JCWlmICh1bmxpa2VseSghZSkpIHsKLQkJCVdMX0VSUigiZXZlbnQgcXVldWUgZW1wdHkuLi5cbiIpOwotCQkJQlVHKCk7Ci0JCX0KLQkJV0xfSU5GTygiZXZlbnQgdHlwZSAoJWQpXG4iLCBlLT5ldHlwZSk7Ci0JCWlmIChjZmdfcHJpdi0+ZWwuaGFuZGxlcltlLT5ldHlwZV0pIHsKLQkJCWNmZ19wcml2LT5lbC5oYW5kbGVyW2UtPmV0eXBlXShjZmdfcHJpdiwKLQkJCQkJCSAgICAgICBjZmdfdG9fbmRldihjZmdfcHJpdiksCi0JCQkJCQkgICAgICAgJmUtPmVtc2csIGUtPmVkYXRhKTsKLQkJfSBlbHNlIHsKLQkJCVdMX0lORk8oIlVua25vd24gRXZlbnQgKCVkKTogaWdub3JpbmdcbiIsIGUtPmV0eXBlKTsKLQkJfQotCQlicmNtZl9wdXRfZXZlbnQoZSk7Ci0JfQotCVdMX0lORk8oIndhcyB0ZXJtaW5hdGVkXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZAotYnJjbWZfY2ZnODAyMTFfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JCSAgY29uc3Qgc3RydWN0IGJyY21mX2V2ZW50X21zZyAqZSwgdm9pZCAqZGF0YSkKLXsKLQl1MzIgZXZlbnRfdHlwZSA9IGJlMzJfdG9fY3B1KGUtPmV2ZW50X3R5cGUpOwotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiA9IG5kZXZfdG9fY2ZnKG5kZXYpOwotCi0JaWYgKGxpa2VseSghYnJjbWZfZW5xX2V2ZW50KGNmZ19wcml2LCBldmVudF90eXBlLCBlLCBkYXRhKSkpCi0JCWJyY21mX3dha2V1cF9ldmVudChjZmdfcHJpdik7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21mX2luaXRfZXEoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2KQotewotCWJyY21mX2luaXRfZXFfbG9jayhjZmdfcHJpdik7Ci0JSU5JVF9MSVNUX0hFQUQoJmNmZ19wcml2LT5lcV9saXN0KTsKLX0KLQotc3RhdGljIHZvaWQgYnJjbWZfZmx1c2hfZXEoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2KQotewotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9ldmVudF9xICplOwotCi0JYnJjbWZfbG9ja19lcShjZmdfcHJpdik7Ci0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZjZmdfcHJpdi0+ZXFfbGlzdCkpIHsKLQkJZSA9IGxpc3RfZmlyc3RfZW50cnkoJmNmZ19wcml2LT5lcV9saXN0LAotCQkJCSAgICAgc3RydWN0IGJyY21mX2NmZzgwMjExX2V2ZW50X3EsIGVxX2xpc3QpOwotCQlsaXN0X2RlbCgmZS0+ZXFfbGlzdCk7Ci0JCWtmcmVlKGUpOwotCX0KLQlicmNtZl91bmxvY2tfZXEoY2ZnX3ByaXYpOwotfQotCi0vKgotKiByZXRyaWV2ZSBmaXJzdCBxdWV1ZWQgZXZlbnQgZnJvbSBoZWFkCi0qLwotCi1zdGF0aWMgc3RydWN0IGJyY21mX2NmZzgwMjExX2V2ZW50X3EgKmJyY21mX2RlcV9ldmVudCgKLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpCi17Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX2V2ZW50X3EgKmUgPSBOVUxMOwotCi0JYnJjbWZfbG9ja19lcShjZmdfcHJpdik7Ci0JaWYgKGxpa2VseSghbGlzdF9lbXB0eSgmY2ZnX3ByaXYtPmVxX2xpc3QpKSkgewotCQllID0gbGlzdF9maXJzdF9lbnRyeSgmY2ZnX3ByaXYtPmVxX2xpc3QsCi0JCQkJICAgICBzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfZXZlbnRfcSwgZXFfbGlzdCk7Ci0JCWxpc3RfZGVsKCZlLT5lcV9saXN0KTsKLQl9Ci0JYnJjbWZfdW5sb2NrX2VxKGNmZ19wcml2KTsKLQotCXJldHVybiBlOwotfQotCi0vKgotKiogcHVzaCBldmVudCB0byB0YWlsIG9mIHRoZSBxdWV1ZQotKi8KLQotc3RhdGljIHMzMgotYnJjbWZfZW5xX2V2ZW50KHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiwgdTMyIGV2ZW50LAotCQljb25zdCBzdHJ1Y3QgYnJjbWZfZXZlbnRfbXNnICptc2csIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX2V2ZW50X3EgKmU7Ci0JczMyIGVyciA9IDA7Ci0KLQllID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJyY21mX2NmZzgwMjExX2V2ZW50X3EpLCBHRlBfS0VSTkVMKTsKLQlpZiAodW5saWtlbHkoIWUpKSB7Ci0JCVdMX0VSUigiZXZlbnQgYWxsb2MgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZS0+ZXR5cGUgPSBldmVudDsKLQltZW1jcHkoJmUtPmVtc2csIG1zZywgc2l6ZW9mKHN0cnVjdCBicmNtZl9ldmVudF9tc2cpKTsKLQotCWJyY21mX2xvY2tfZXEoY2ZnX3ByaXYpOwotCWxpc3RfYWRkX3RhaWwoJmUtPmVxX2xpc3QsICZjZmdfcHJpdi0+ZXFfbGlzdCk7Ci0JYnJjbWZfdW5sb2NrX2VxKGNmZ19wcml2KTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21mX3B1dF9ldmVudChzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfZXZlbnRfcSAqZSkKLXsKLQlrZnJlZShlKTsKLX0KLQotdm9pZCBicmNtZl9jZmc4MDIxMV9zZGlvX2Z1bmModm9pZCAqZnVuYykKLXsKLQljZmc4MDIxMV9zZGlvX2Z1bmMgPSAoc3RydWN0IHNkaW9fZnVuYyAqKWZ1bmM7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21mX2NsZWFyX3NkaW9fZnVuYyh2b2lkKQotewotCWNmZzgwMjExX3NkaW9fZnVuYyA9IE5VTEw7Ci19Ci0KLXN0cnVjdCBzZGlvX2Z1bmMgKmJyY21mX2NmZzgwMjExX2dldF9zZGlvX2Z1bmModm9pZCkKLXsKLQlyZXR1cm4gY2ZnODAyMTFfc2Rpb19mdW5jOwotfQotCi1zdGF0aWMgczMyIGJyY21mX2RvbmdsZV9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzMzIgaWZ0eXBlKQotewotCXMzMiBpbmZyYSA9IDA7Ci0JczMyIGVyciA9IDA7Ci0KLQlzd2l0Y2ggKGlmdHlwZSkgewotCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKLQljYXNlIE5MODAyMTFfSUZUWVBFX1dEUzoKLQkJV0xfRVJSKCJ0eXBlICglZCkgOiBjdXJyZW50bHkgd2UgZG8gbm90IHN1cHBvcnQgdGhpcyBtb2RlXG4iLAotCQkgICAgICAgaWZ0eXBlKTsKLQkJZXJyID0gLUVJTlZBTDsKLQkJcmV0dXJuIGVycjsKLQljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgotCQlpbmZyYSA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJaW5mcmEgPSAxOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQllcnIgPSAtRUlOVkFMOwotCQlXTF9FUlIoImludmFsaWQgdHlwZSAoJWQpXG4iLCBpZnR5cGUpOwotCQlyZXR1cm4gZXJyOwotCX0KLQlpbmZyYSA9IGNwdV90b19sZTMyKGluZnJhKTsKLQllcnIgPSBicmNtZl9kZXZfaW9jdGwobmRldiwgQlJDTUZfQ19TRVRfSU5GUkEsICZpbmZyYSwgc2l6ZW9mKGluZnJhKSk7Ci0JaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0xfRVJSKCJXTENfU0VUX0lORlJBIGVycm9yICglZClcbiIsIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzMzIgYnJjbWZfZG9uZ2xlX2V2ZW50bXNnKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQotewotCS8qIFJvb20gZm9yICJldmVudF9tc2dzIiArICdcMCcgKyBiaXR2ZWMgKi8KLQlzOCBpb3ZidWZbQlJDTUZfRVZFTlRJTkdfTUFTS19MRU4gKyAxMl07Ci0JczggZXZlbnRtYXNrW0JSQ01GX0VWRU5USU5HX01BU0tfTEVOXTsKLQlzMzIgZXJyID0gMDsKLQotCVdMX1RSQUNFKCJFbnRlclxuIik7Ci0KLQkvKiBTZXR1cCBldmVudF9tc2dzICovCi0JYnJjbXVfbWtpb3ZhcigiZXZlbnRfbXNncyIsIGV2ZW50bWFzaywgQlJDTUZfRVZFTlRJTkdfTUFTS19MRU4sIGlvdmJ1ZiwKLQkJICAgIHNpemVvZihpb3ZidWYpKTsKLQllcnIgPSBicmNtZl9kZXZfaW9jdGwobmRldiwgQlJDTUZfQ19HRVRfVkFSLCBpb3ZidWYsIHNpemVvZihpb3ZidWYpKTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoIkdldCBldmVudF9tc2dzIGVycm9yICglZClcbiIsIGVycik7Ci0JCWdvdG8gZG9uZ2xlX2V2ZW50bXNnX291dDsKLQl9Ci0JbWVtY3B5KGV2ZW50bWFzaywgaW92YnVmLCBCUkNNRl9FVkVOVElOR19NQVNLX0xFTik7Ci0KLQlzZXRiaXQoZXZlbnRtYXNrLCBCUkNNRl9FX1NFVF9TU0lEKTsKLQlzZXRiaXQoZXZlbnRtYXNrLCBCUkNNRl9FX1JPQU0pOwotCXNldGJpdChldmVudG1hc2ssIEJSQ01GX0VfUFJVTkUpOwotCXNldGJpdChldmVudG1hc2ssIEJSQ01GX0VfQVVUSCk7Ci0Jc2V0Yml0KGV2ZW50bWFzaywgQlJDTUZfRV9SRUFTU09DKTsKLQlzZXRiaXQoZXZlbnRtYXNrLCBCUkNNRl9FX1JFQVNTT0NfSU5EKTsKLQlzZXRiaXQoZXZlbnRtYXNrLCBCUkNNRl9FX0RFQVVUSF9JTkQpOwotCXNldGJpdChldmVudG1hc2ssIEJSQ01GX0VfRElTQVNTT0NfSU5EKTsKLQlzZXRiaXQoZXZlbnRtYXNrLCBCUkNNRl9FX0RJU0FTU09DKTsKLQlzZXRiaXQoZXZlbnRtYXNrLCBCUkNNRl9FX0pPSU4pOwotCXNldGJpdChldmVudG1hc2ssIEJSQ01GX0VfQVNTT0NfSU5EKTsKLQlzZXRiaXQoZXZlbnRtYXNrLCBCUkNNRl9FX1BTS19TVVApOwotCXNldGJpdChldmVudG1hc2ssIEJSQ01GX0VfTElOSyk7Ci0Jc2V0Yml0KGV2ZW50bWFzaywgQlJDTUZfRV9ORElTX0xJTkspOwotCXNldGJpdChldmVudG1hc2ssIEJSQ01GX0VfTUlDX0VSUk9SKTsKLQlzZXRiaXQoZXZlbnRtYXNrLCBCUkNNRl9FX1BNS0lEX0NBQ0hFKTsKLQlzZXRiaXQoZXZlbnRtYXNrLCBCUkNNRl9FX1RYRkFJTCk7Ci0Jc2V0Yml0KGV2ZW50bWFzaywgQlJDTUZfRV9KT0lOX1NUQVJUKTsKLQlzZXRiaXQoZXZlbnRtYXNrLCBCUkNNRl9FX1NDQU5fQ09NUExFVEUpOwotCi0JYnJjbXVfbWtpb3ZhcigiZXZlbnRfbXNncyIsIGV2ZW50bWFzaywgQlJDTUZfRVZFTlRJTkdfTUFTS19MRU4sIGlvdmJ1ZiwKLQkJICAgIHNpemVvZihpb3ZidWYpKTsKLQllcnIgPSBicmNtZl9kZXZfaW9jdGwobmRldiwgQlJDTUZfQ19TRVRfVkFSLCBpb3ZidWYsIHNpemVvZihpb3ZidWYpKTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoIlNldCBldmVudF9tc2dzIGVycm9yICglZClcbiIsIGVycik7Ci0JCWdvdG8gZG9uZ2xlX2V2ZW50bXNnX291dDsKLQl9Ci0KLWRvbmdsZV9ldmVudG1zZ19vdXQ6Ci0JV0xfVFJBQ0UoIkV4aXRcbiIpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBzMzIKLWJyY21mX2RvbmdsZV9yb2FtKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB1MzIgcm9hbXZhciwgdTMyIGJjbl90aW1lb3V0KQotewotCXM4IGlvdmJ1ZlszMl07Ci0JczMyIHJvYW10cmlnZ2VyWzJdOwotCXMzMiByb2FtX2RlbHRhWzJdOwotCXMzMiBlcnIgPSAwOwotCi0JLyoKLQkgKiBTZXR1cCB0aW1lb3V0IGlmIEJlYWNvbnMgYXJlIGxvc3QgYW5kIHJvYW0gaXMKLQkgKiBvZmYgdG8gcmVwb3J0IGxpbmsgZG93bgotCSAqLwotCWlmIChyb2FtdmFyKSB7Ci0JCWJyY211X21raW92YXIoImJjbl90aW1lb3V0IiwgKGNoYXIgKikmYmNuX3RpbWVvdXQsCi0JCQlzaXplb2YoYmNuX3RpbWVvdXQpLCBpb3ZidWYsIHNpemVvZihpb3ZidWYpKTsKLQkJZXJyID0gYnJjbWZfZGV2X2lvY3RsKG5kZXYsIEJSQ01GX0NfU0VUX1ZBUiwKLQkJCQkgICBpb3ZidWYsIHNpemVvZihpb3ZidWYpKTsKLQkJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJCVdMX0VSUigiYmNuX3RpbWVvdXQgZXJyb3IgKCVkKVxuIiwgZXJyKTsKLQkJCWdvdG8gZG9uZ2xlX3JvbV9vdXQ7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEVuYWJsZS9EaXNhYmxlIGJ1aWx0LWluIHJvYW1pbmcgdG8gYWxsb3cgc3VwcGxpY2FudAotCSAqIHRvIHRha2UgY2FyZSBvZiByb2FtaW5nCi0JICovCi0JV0xfSU5GTygiSW50ZXJuYWwgUm9hbWluZyA9ICVzXG4iLCByb2FtdmFyID8gIk9mZiIgOiAiT24iKTsKLQlicmNtdV9ta2lvdmFyKCJyb2FtX29mZiIsIChjaGFyICopJnJvYW12YXIsCi0JCQkJc2l6ZW9mKHJvYW12YXIpLCBpb3ZidWYsIHNpemVvZihpb3ZidWYpKTsKLQllcnIgPSBicmNtZl9kZXZfaW9jdGwobmRldiwgQlJDTUZfQ19TRVRfVkFSLCBpb3ZidWYsIHNpemVvZihpb3ZidWYpKTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoInJvYW1fb2ZmIGVycm9yICglZClcbiIsIGVycik7Ci0JCWdvdG8gZG9uZ2xlX3JvbV9vdXQ7Ci0JfQotCi0Jcm9hbXRyaWdnZXJbMF0gPSBXTF9ST0FNX1RSSUdHRVJfTEVWRUw7Ci0Jcm9hbXRyaWdnZXJbMV0gPSBCUkNNX0JBTkRfQUxMOwotCWVyciA9IGJyY21mX2Rldl9pb2N0bChuZGV2LCBCUkNNRl9DX1NFVF9ST0FNX1RSSUdHRVIsCi0JCQkodm9pZCAqKXJvYW10cmlnZ2VyLCBzaXplb2Yocm9hbXRyaWdnZXIpKTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQlXTF9FUlIoIldMQ19TRVRfUk9BTV9UUklHR0VSIGVycm9yICglZClcbiIsIGVycik7Ci0JCWdvdG8gZG9uZ2xlX3JvbV9vdXQ7Ci0JfQotCi0Jcm9hbV9kZWx0YVswXSA9IFdMX1JPQU1fREVMVEE7Ci0Jcm9hbV9kZWx0YVsxXSA9IEJSQ01fQkFORF9BTEw7Ci0JZXJyID0gYnJjbWZfZGV2X2lvY3RsKG5kZXYsIEJSQ01GX0NfU0VUX1JPQU1fREVMVEEsCi0JCQkJKHZvaWQgKilyb2FtX2RlbHRhLCBzaXplb2Yocm9hbV9kZWx0YSkpOwotCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigiV0xDX1NFVF9ST0FNX0RFTFRBIGVycm9yICglZClcbiIsIGVycik7Ci0JCWdvdG8gZG9uZ2xlX3JvbV9vdXQ7Ci0JfQotCi1kb25nbGVfcm9tX291dDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgczMyCi1icmNtZl9kb25nbGVfc2NhbnRpbWUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHMzMiBzY2FuX2Fzc29jX3RpbWUsCi0JCXMzMiBzY2FuX3VuYXNzb2NfdGltZSwgczMyIHNjYW5fcGFzc2l2ZV90aW1lKQotewotCXMzMiBlcnIgPSAwOwotCi0JZXJyID0gYnJjbWZfZGV2X2lvY3RsKG5kZXYsIEJSQ01GX0NfU0VUX1NDQU5fQ0hBTk5FTF9USU1FLAotCQkJICAgJnNjYW5fYXNzb2NfdGltZSwgc2l6ZW9mKHNjYW5fYXNzb2NfdGltZSkpOwotCWlmIChlcnIpIHsKLQkJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkKLQkJCVdMX0lORk8oIlNjYW4gYXNzb2MgdGltZSBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKLQkJZWxzZQotCQkJV0xfRVJSKCJTY2FuIGFzc29jIHRpbWUgZXJyb3IgKCVkKVxuIiwgZXJyKTsKLQkJZ290byBkb25nbGVfc2NhbnRpbWVfb3V0OwotCX0KLQllcnIgPSBicmNtZl9kZXZfaW9jdGwobmRldiwgQlJDTUZfQ19TRVRfU0NBTl9VTkFTU09DX1RJTUUsCi0JCQkgICAmc2Nhbl91bmFzc29jX3RpbWUsIHNpemVvZihzY2FuX3VuYXNzb2NfdGltZSkpOwotCWlmIChlcnIpIHsKLQkJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkKLQkJCVdMX0lORk8oIlNjYW4gdW5hc3NvYyB0aW1lIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOwotCQllbHNlCi0JCQlXTF9FUlIoIlNjYW4gdW5hc3NvYyB0aW1lIGVycm9yICglZClcbiIsIGVycik7Ci0JCWdvdG8gZG9uZ2xlX3NjYW50aW1lX291dDsKLQl9Ci0KLQllcnIgPSBicmNtZl9kZXZfaW9jdGwobmRldiwgQlJDTUZfQ19TRVRfU0NBTl9QQVNTSVZFX1RJTUUsCi0JCQkgICAmc2Nhbl9wYXNzaXZlX3RpbWUsIHNpemVvZihzY2FuX3Bhc3NpdmVfdGltZSkpOwotCWlmIChlcnIpIHsKLQkJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkKLQkJCVdMX0lORk8oIlNjYW4gcGFzc2l2ZSB0aW1lIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOwotCQllbHNlCi0JCQlXTF9FUlIoIlNjYW4gcGFzc2l2ZSB0aW1lIGVycm9yICglZClcbiIsIGVycik7Ci0JCWdvdG8gZG9uZ2xlX3NjYW50aW1lX291dDsKLQl9Ci0KLWRvbmdsZV9zY2FudGltZV9vdXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotczMyIGJyY21mX2NvbmZpZ19kb25nbGUoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2LCBib29sIG5lZWRfbG9jaykKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2OwotCXMzMiBlcnIgPSAwOwotCi0JaWYgKGNmZ19wcml2LT5kb25nbGVfdXApCi0JCXJldHVybiBlcnI7Ci0KLQluZGV2ID0gY2ZnX3RvX25kZXYoY2ZnX3ByaXYpOwotCXdkZXYgPSBuZGV2LT5pZWVlODAyMTFfcHRyOwotCWlmIChuZWVkX2xvY2spCi0JCXJ0bmxfbG9jaygpOwotCi0JYnJjbWZfZG9uZ2xlX3NjYW50aW1lKG5kZXYsIFdMX1NDQU5fQ0hBTk5FTF9USU1FLAotCQkJV0xfU0NBTl9VTkFTU09DX1RJTUUsIFdMX1NDQU5fUEFTU0lWRV9USU1FKTsKLQotCWVyciA9IGJyY21mX2RvbmdsZV9ldmVudG1zZyhuZGV2KTsKLQlpZiAodW5saWtlbHkoZXJyKSkKLQkJZ290byBkZWZhdWx0X2NvbmZfb3V0OwotCWVyciA9IGJyY21mX2RvbmdsZV9yb2FtKG5kZXYsIChjZmdfcHJpdi0+cm9hbV9vbiA/IDAgOiAxKSwKLQkJCQlXTF9CRUFDT05fVElNRU9VVCk7Ci0JaWYgKHVubGlrZWx5KGVycikpCi0JCWdvdG8gZGVmYXVsdF9jb25mX291dDsKLQllcnIgPSBicmNtZl9kb25nbGVfbW9kZShuZGV2LCB3ZGV2LT5pZnR5cGUpOwotCWlmICh1bmxpa2VseShlcnIgJiYgZXJyICE9IC1FSU5QUk9HUkVTUykpCi0JCWdvdG8gZGVmYXVsdF9jb25mX291dDsKLQllcnIgPSBicmNtZl9kb25nbGVfcHJvYmVjYXAoY2ZnX3ByaXYpOwotCWlmICh1bmxpa2VseShlcnIpKQotCQlnb3RvIGRlZmF1bHRfY29uZl9vdXQ7Ci0KLQkvKiAtRUlOUFJPR1JFU1M6IENhbGwgY29tbWl0IGhhbmRsZXIgKi8KLQotZGVmYXVsdF9jb25mX291dDoKLQlpZiAobmVlZF9sb2NrKQotCQlydG5sX3VubG9jaygpOwotCi0JY2ZnX3ByaXYtPmRvbmdsZV91cCA9IHRydWU7Ci0KLQlyZXR1cm4gZXJyOwotCi19Ci0KLXN0YXRpYyBzMzIgd2xfdXBkYXRlX3dpcGh5YmFuZHMoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2KQotewotCXN0cnVjdCB3aXBoeSAqd2lwaHk7Ci0JczMyIHBoeV9saXN0OwotCXM4IHBoeTsKLQlzMzIgZXJyID0gMDsKLQotCWVyciA9IGJyY21mX2Rldl9pb2N0bChjZmdfdG9fbmRldihjZmdfcHJpdiksIEJSQ01fR0VUX1BIWUxJU1QsCi0JCQkgICAgICAmcGh5X2xpc3QsIHNpemVvZihwaHlfbGlzdCkpOwotCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCVdMX0VSUigiZXJyb3IgKCVkKVxuIiwgZXJyKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlwaHkgPSAoKGNoYXIgKikmcGh5X2xpc3QpWzFdOwotCVdMX0lORk8oIiVjIHBoeVxuIiwgcGh5KTsKLQlpZiAocGh5ID09ICduJyB8fCBwaHkgPT0gJ2EnKSB7Ci0JCXdpcGh5ID0gY2ZnX3RvX3dpcGh5KGNmZ19wcml2KTsKLQkJd2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdID0gJl9fd2xfYmFuZF81Z2h6X247Ci0JfQotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHMzMiBfX2JyY21mX2NmZzgwMjExX3VwKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdikKLXsKLQlzMzIgZXJyID0gMDsKLQotCXNldF9iaXQoV0xfU1RBVFVTX1JFQURZLCAmY2ZnX3ByaXYtPnN0YXR1cyk7Ci0KLQlicmNtZl9kZWJ1Z2ZzX2FkZF9uZXRkZXZfcGFyYW1zKGNmZ19wcml2KTsKLQotCWVyciA9IGJyY21mX2NvbmZpZ19kb25nbGUoY2ZnX3ByaXYsIGZhbHNlKTsKLQlpZiAodW5saWtlbHkoZXJyKSkKLQkJcmV0dXJuIGVycjsKLQotCWJyY21mX2ludm9rZV9pc2NhbihjZmdfcHJpdik7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgczMyIF9fYnJjbWZfY2ZnODAyMTFfZG93bihzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpCi17Ci0JLyoKLQkgKiBXaGlsZSBnb2luZyBkb3duLCBpZiBhc3NvY2lhdGVkIHdpdGggQVAgZGlzYXNzb2NpYXRlCi0JICogZnJvbSBBUCB0byBzYXZlIHBvd2VyCi0JICovCi0JaWYgKCh0ZXN0X2JpdChXTF9TVEFUVVNfQ09OTkVDVEVELCAmY2ZnX3ByaXYtPnN0YXR1cykgfHwKLQkgICAgIHRlc3RfYml0KFdMX1NUQVRVU19DT05ORUNUSU5HLCAmY2ZnX3ByaXYtPnN0YXR1cykpICYmCi0JICAgICB0ZXN0X2JpdChXTF9TVEFUVVNfUkVBRFksICZjZmdfcHJpdi0+c3RhdHVzKSkgewotCQlXTF9JTkZPKCJEaXNhc3NvY2lhdGluZyBmcm9tIEFQIik7Ci0JCWJyY21mX2xpbmtfZG93bihjZmdfcHJpdik7Ci0KLQkJLyogTWFrZSBzdXJlIFdQQV9TdXBwbGljYW50IHJlY2VpdmVzIGFsbCB0aGUgZXZlbnQKLQkJICAgZ2VuZXJhdGVkIGR1ZSB0byBESVNBU1NPQyBjYWxsIHRvIHRoZSBmdyB0byBrZWVwCi0JCSAgIHRoZSBzdGF0ZSBmdyBhbmQgV1BBX1N1cHBsaWNhbnQgc3RhdGUgY29uc2lzdGVudAotCQkgKi8KLQkJcnRubF91bmxvY2soKTsKLQkJYnJjbWZfZGVsYXkoNTAwKTsKLQkJcnRubF9sb2NrKCk7Ci0JfQotCi0Jc2V0X2JpdChXTF9TVEFUVVNfU0NBTl9BQk9SVElORywgJmNmZ19wcml2LT5zdGF0dXMpOwotCWJyY21mX3Rlcm1faXNjYW4oY2ZnX3ByaXYpOwotCWlmIChjZmdfcHJpdi0+c2Nhbl9yZXF1ZXN0KSB7Ci0JCWNmZzgwMjExX3NjYW5fZG9uZShjZmdfcHJpdi0+c2Nhbl9yZXF1ZXN0LCB0cnVlKTsKLQkJLyogTWF5IG5lZWQgdG8gcGVyZm9ybSB0aGlzIHRvIGNvdmVyIHJtbW9kICovCi0JCS8qIHdsX3NldF9tcGMoY2ZnX3RvX25kZXYod2wpLCAxKTsgKi8KLQkJY2ZnX3ByaXYtPnNjYW5fcmVxdWVzdCA9IE5VTEw7Ci0JfQotCWNsZWFyX2JpdChXTF9TVEFUVVNfUkVBRFksICZjZmdfcHJpdi0+c3RhdHVzKTsKLQljbGVhcl9iaXQoV0xfU1RBVFVTX1NDQU5OSU5HLCAmY2ZnX3ByaXYtPnN0YXR1cyk7Ci0JY2xlYXJfYml0KFdMX1NUQVRVU19TQ0FOX0FCT1JUSU5HLCAmY2ZnX3ByaXYtPnN0YXR1cyk7Ci0KLQlicmNtZl9kZWJ1Z2ZzX3JlbW92ZV9uZXRkZXYoY2ZnX3ByaXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXMzMiBicmNtZl9jZmc4MDIxMV91cCh2b2lkKQotewotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdjsKLQlzMzIgZXJyID0gMDsKLQotCWNmZ19wcml2ID0gV0xfUFJJVl9HRVQoKTsKLQltdXRleF9sb2NrKCZjZmdfcHJpdi0+dXNyX3N5bmMpOwotCWVyciA9IF9fYnJjbWZfY2ZnODAyMTFfdXAoY2ZnX3ByaXYpOwotCW11dGV4X3VubG9jaygmY2ZnX3ByaXYtPnVzcl9zeW5jKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXMzMiBicmNtZl9jZmc4MDIxMV9kb3duKHZvaWQpCi17Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2OwotCXMzMiBlcnIgPSAwOwotCi0JY2ZnX3ByaXYgPSBXTF9QUklWX0dFVCgpOwotCW11dGV4X2xvY2soJmNmZ19wcml2LT51c3Jfc3luYyk7Ci0JZXJyID0gX19icmNtZl9jZmc4MDIxMV9kb3duKGNmZ19wcml2KTsKLQltdXRleF91bmxvY2soJmNmZ19wcml2LT51c3Jfc3luYyk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgczMyIGJyY21mX2RvbmdsZV9wcm9iZWNhcChzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpCi17Ci0JcmV0dXJuIHdsX3VwZGF0ZV93aXBoeWJhbmRzKGNmZ19wcml2KTsKLX0KLQotc3RhdGljIHZvaWQgKmJyY21mX3JlYWRfcHJvZihzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYsIHMzMiBpdGVtKQotewotCXN3aXRjaCAoaXRlbSkgewotCWNhc2UgV0xfUFJPRl9TRUM6Ci0JCXJldHVybiAmY2ZnX3ByaXYtPnByb2ZpbGUtPnNlYzsKLQljYXNlIFdMX1BST0ZfQlNTSUQ6Ci0JCXJldHVybiAmY2ZnX3ByaXYtPnByb2ZpbGUtPmJzc2lkOwotCWNhc2UgV0xfUFJPRl9TU0lEOgotCQlyZXR1cm4gJmNmZ19wcml2LT5wcm9maWxlLT5zc2lkOwotCX0KLQlXTF9FUlIoImludmFsaWQgaXRlbSAoJWQpXG4iLCBpdGVtKTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIHMzMgotYnJjbWZfdXBkYXRlX3Byb2Yoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2LAotCQkgIGNvbnN0IHN0cnVjdCBicmNtZl9ldmVudF9tc2cgKmUsIHZvaWQgKmRhdGEsIHMzMiBpdGVtKQotewotCXMzMiBlcnIgPSAwOwotCXN0cnVjdCBicmNtZl9zc2lkICpzc2lkOwotCi0Jc3dpdGNoIChpdGVtKSB7Ci0JY2FzZSBXTF9QUk9GX1NTSUQ6Ci0JCXNzaWQgPSAoc3RydWN0IGJyY21mX3NzaWQgKikgZGF0YTsKLQkJbWVtc2V0KGNmZ19wcml2LT5wcm9maWxlLT5zc2lkLlNTSUQsIDAsCi0JCSAgICAgICBzaXplb2YoY2ZnX3ByaXYtPnByb2ZpbGUtPnNzaWQuU1NJRCkpOwotCQltZW1jcHkoY2ZnX3ByaXYtPnByb2ZpbGUtPnNzaWQuU1NJRCwKLQkJICAgICAgIHNzaWQtPlNTSUQsIHNzaWQtPlNTSURfbGVuKTsKLQkJY2ZnX3ByaXYtPnByb2ZpbGUtPnNzaWQuU1NJRF9sZW4gPSBzc2lkLT5TU0lEX2xlbjsKLQkJYnJlYWs7Ci0JY2FzZSBXTF9QUk9GX0JTU0lEOgotCQlpZiAoZGF0YSkKLQkJCW1lbWNweShjZmdfcHJpdi0+cHJvZmlsZS0+YnNzaWQsIGRhdGEsIEVUSF9BTEVOKTsKLQkJZWxzZQotCQkJbWVtc2V0KGNmZ19wcml2LT5wcm9maWxlLT5ic3NpZCwgMCwgRVRIX0FMRU4pOwotCQlicmVhazsKLQljYXNlIFdMX1BST0ZfU0VDOgotCQltZW1jcHkoJmNmZ19wcml2LT5wcm9maWxlLT5zZWMsIGRhdGEsCi0JCSAgICAgICBzaXplb2YoY2ZnX3ByaXYtPnByb2ZpbGUtPnNlYykpOwotCQlicmVhazsKLQljYXNlIFdMX1BST0ZfQkVBQ09OSU5UOgotCQljZmdfcHJpdi0+cHJvZmlsZS0+YmVhY29uX2ludGVydmFsID0gKih1MTYgKilkYXRhOwotCQlicmVhazsKLQljYXNlIFdMX1BST0ZfRFRJTVBFUklPRDoKLQkJY2ZnX3ByaXYtPnByb2ZpbGUtPmR0aW1fcGVyaW9kID0gKih1OCAqKWRhdGE7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCVdMX0VSUigidW5zdXBwb3J0ZWQgaXRlbSAoJWQpXG4iLCBpdGVtKTsKLQkJZXJyID0gLUVPUE5PVFNVUFA7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBib29sIGJyY21mX2lzX2lic3Ntb2RlKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdikKLXsKLQlyZXR1cm4gY2ZnX3ByaXYtPmNvbmYtPm1vZGUgPT0gV0xfTU9ERV9JQlNTOwotfQotCi1zdGF0aWMgX191c2VkIHMzMiBicmNtZl9hZGRfaWUoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2LAotCQkJICAgICAgIHU4IHQsIHU4IGwsIHU4ICp2KQotewotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9pZSAqaWUgPSAmY2ZnX3ByaXYtPmllOwotCXMzMiBlcnIgPSAwOwotCi0JaWYgKHVubGlrZWx5KGllLT5vZmZzZXQgKyBsICsgMiA+IFdMX1RMVl9JTkZPX01BWCkpIHsKLQkJV0xfRVJSKCJlaSBjcm9zc2VzIGJ1ZmZlciBib3VuZGFyeVxuIik7Ci0JCXJldHVybiAtRU5PU1BDOwotCX0KLQlpZS0+YnVmW2llLT5vZmZzZXRdID0gdDsKLQlpZS0+YnVmW2llLT5vZmZzZXQgKyAxXSA9IGw7Ci0JbWVtY3B5KCZpZS0+YnVmW2llLT5vZmZzZXQgKyAyXSwgdiwgbCk7Ci0JaWUtPm9mZnNldCArPSBsICsgMjsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21mX2xpbmtfZG93bihzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7Ci0JczMyIGVyciA9IDA7Ci0KLQlXTF9UUkFDRSgiRW50ZXJcbiIpOwotCi0JaWYgKGNmZ19wcml2LT5saW5rX3VwKSB7Ci0JCWRldiA9IGNmZ190b19uZGV2KGNmZ19wcml2KTsKLQkJV0xfSU5GTygiQ2FsbCBXTENfRElTQVNTT0MgdG8gc3RvcCBleGNlc3Mgcm9hbWluZ1xuICIpOwotCQllcnIgPSBicmNtZl9kZXZfaW9jdGwoZGV2LCBCUkNNRl9DX0RJU0FTU09DLCBOVUxMLCAwKTsKLQkJaWYgKHVubGlrZWx5KGVycikpCi0JCQlXTF9FUlIoIldMQ19ESVNBU1NPQyBmYWlsZWQgKCVkKVxuIiwgZXJyKTsKLQkJY2ZnX3ByaXYtPmxpbmtfdXAgPSBmYWxzZTsKLQl9Ci0JV0xfVFJBQ0UoIkV4aXRcbiIpOwotfQotCi1zdGF0aWMgdm9pZCBicmNtZl9sb2NrX2VxKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdikKLXsKLQlzcGluX2xvY2tfaXJxKCZjZmdfcHJpdi0+ZXFfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21mX3VubG9ja19lcShzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpCi17Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjZmdfcHJpdi0+ZXFfbG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21mX2luaXRfZXFfbG9jayhzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpCi17Ci0Jc3Bpbl9sb2NrX2luaXQoJmNmZ19wcml2LT5lcV9sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgYnJjbWZfZGVsYXkodTMyIG1zKQotewotCWlmIChtcyA8IDEwMDAgLyBIWikgewotCQljb25kX3Jlc2NoZWQoKTsKLQkJbWRlbGF5KG1zKTsKLQl9IGVsc2UgewotCQltc2xlZXAobXMpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYnJjbWZfc2V0X2RydmRhdGEoc3RydWN0IGJyY21mX2NmZzgwMjExX2RldiAqZGV2LCB2b2lkICpkYXRhKQotewotCWRldi0+ZHJpdmVyX2RhdGEgPSBkYXRhOwotfQotCi1zdGF0aWMgdm9pZCAqYnJjbWZfZ2V0X2RydmRhdGEoc3RydWN0IGJyY21mX2NmZzgwMjExX2RldiAqZGV2KQotewotCXZvaWQgKmRhdGEgPSBOVUxMOwotCi0JaWYgKGRldikKLQkJZGF0YSA9IGRldi0+ZHJpdmVyX2RhdGE7Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21mX3NldF9tcGMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGludCBtcGMpCi17Ci0JczMyIGVyciA9IDA7Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2ID0gbmRldl90b19jZmcobmRldik7Ci0KLQlpZiAodGVzdF9iaXQoV0xfU1RBVFVTX1JFQURZLCAmY2ZnX3ByaXYtPnN0YXR1cykpIHsKLQkJZXJyID0gYnJjbWZfZGV2X2ludHZhcl9zZXQobmRldiwgIm1wYyIsIG1wYyk7Ci0JCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCQlXTF9FUlIoImZhaWwgdG8gc2V0IG1wY1xuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJV0xfSU5GTygiTVBDIDogJWRcbiIsIG1wYyk7Ci0JfQotfQotCi1zdGF0aWMgaW50IGJyY21mX2RlYnVnZnNfYWRkX25ldGRldl9wYXJhbXMoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2KQotewotCWNoYXIgYnVmWzEwK0lGTkFNU0laXTsKLQlzdHJ1Y3QgZGVudHJ5ICpmZDsKLQlzMzIgZXJyID0gMDsKLQotCXNwcmludGYoYnVmLCAibmV0ZGV2OiVzIiwgY2ZnX3RvX25kZXYoY2ZnX3ByaXYpLT5uYW1lKTsKLQljZmdfcHJpdi0+ZGVidWdmc2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihidWYsCi0JCQkJCWNmZ190b193aXBoeShjZmdfcHJpdiktPmRlYnVnZnNkaXIpOwotCi0JZmQgPSBkZWJ1Z2ZzX2NyZWF0ZV91MTYoImJlYWNvbl9pbnQiLCBTX0lSVUdPLCBjZmdfcHJpdi0+ZGVidWdmc2RpciwKLQkJKHUxNiAqKSZjZmdfcHJpdi0+cHJvZmlsZS0+YmVhY29uX2ludGVydmFsKTsKLQlpZiAoIWZkKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQlmZCA9IGRlYnVnZnNfY3JlYXRlX3U4KCJkdGltX3BlcmlvZCIsIFNfSVJVR08sIGNmZ19wcml2LT5kZWJ1Z2ZzZGlyLAotCQkodTggKikmY2ZnX3ByaXYtPnByb2ZpbGUtPmR0aW1fcGVyaW9kKTsKLQlpZiAoIWZkKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLWVycl9vdXQ6Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgYnJjbWZfZGVidWdmc19yZW1vdmVfbmV0ZGV2KHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdikKLXsKLQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoY2ZnX3ByaXYtPmRlYnVnZnNkaXIpOwotCWNmZ19wcml2LT5kZWJ1Z2ZzZGlyID0gTlVMTDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2ZDA4Ny4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21mbWFjL3dsX2NmZzgwMjExLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYgX3dsX2NmZzgwMjExX2hfCi0jZGVmaW5lIF93bF9jZmc4MDIxMV9oXwotCi1zdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfY29uZjsKLXN0cnVjdCBicmNtZl9jZmc4MDIxMV9pZmFjZTsKLXN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2Owotc3RydWN0IGJyY21mX2NmZzgwMjExX3NlY3VyaXR5Owotc3RydWN0IGJyY21mX2NmZzgwMjExX2lic3M7Ci0KLSNkZWZpbmUgV0xfREJHX05PTkUJCTAKLSNkZWZpbmUgV0xfREJHX0NPTk4JCSgxIDw8IDUpCi0jZGVmaW5lIFdMX0RCR19TQ0FOCQkoMSA8PCA0KQotI2RlZmluZSBXTF9EQkdfVFJBQ0UJCSgxIDw8IDMpCi0jZGVmaW5lIFdMX0RCR19JTkZPCQkoMSA8PCAxKQotI2RlZmluZSBXTF9EQkdfRVJSCQkoMSA8PCAwKQotI2RlZmluZSBXTF9EQkdfTUFTSwkJKChXTF9EQkdfSU5GTyB8IFdMX0RCR19FUlIgfCBXTF9EQkdfVFJBQ0UpIHwgXAotCQkJCShXTF9EQkdfU0NBTikgfCAoV0xfREJHX0NPTk4pKQotCi0jZGVmaW5lCVdMX0VSUihmbXQsIGFyZ3MuLi4pCQkJCQlcCi1kbyB7CQkJCQkJCQlcCi0JaWYgKGJyY21mX2RiZ19sZXZlbCAmIFdMX0RCR19FUlIpIHsJCQlcCi0JCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsJCQkJXAotCQkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUiBAJXMgOiAiIGZtdCwJXAotCQkJCV9fZnVuY19fLCAjI2FyZ3MpOwkJXAotCQl9CQkJCQkJXAotCX0JCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2lmIChkZWZpbmVkIEJDTURCRykKLSNkZWZpbmUJV0xfSU5GTyhmbXQsIGFyZ3MuLi4pCQkJCQlcCi1kbyB7CQkJCQkJCQlcCi0JaWYgKGJyY21mX2RiZ19sZXZlbCAmIFdMX0RCR19JTkZPKSB7CQkJXAotCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CQkJCVwKLQkJCXByaW50ayhLRVJOX0VSUiAiSU5GTyBAJXMgOiAiIGZtdCwJXAotCQkJCV9fZnVuY19fLCAjI2FyZ3MpOwkJXAotCQl9CQkJCQkJXAotCX0JCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZQlXTF9UUkFDRShmbXQsIGFyZ3MuLi4pCQkJCQlcCi1kbyB7CQkJCQkJCQlcCi0JaWYgKGJyY21mX2RiZ19sZXZlbCAmIFdMX0RCR19UUkFDRSkgewkJCVwKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkgewkJCQlcCi0JCQlwcmludGsoS0VSTl9FUlIgIlRSQUNFIEAlcyA6ICIgZm10LAlcCi0JCQkJX19mdW5jX18sICMjYXJncyk7CQlcCi0JCX0JCQkJCQlcCi0JfQkJCQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lCVdMX1NDQU4oZm10LCBhcmdzLi4uKQkJCQkJXAotZG8gewkJCQkJCQkJXAotCWlmIChicmNtZl9kYmdfbGV2ZWwgJiBXTF9EQkdfU0NBTikgewkJCVwKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkgewkJCQlcCi0JCQlwcmludGsoS0VSTl9FUlIgIlNDQU4gQCVzIDogIiBmbXQsCVwKLQkJCQlfX2Z1bmNfXywgIyNhcmdzKTsJCVwKLQkJfQkJCQkJCVwKLQl9CQkJCQkJCVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUJV0xfQ09OTihmbXQsIGFyZ3MuLi4pCQkJCQlcCi1kbyB7CQkJCQkJCQlcCi0JaWYgKGJyY21mX2RiZ19sZXZlbCAmIFdMX0RCR19DT05OKSB7CQkJXAotCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CQkJCVwKLQkJCXByaW50ayhLRVJOX0VSUiAiQ09OTiBAJXMgOiAiIGZtdCwJXAotCQkJCV9fZnVuY19fLCAjI2FyZ3MpOwkJXAotCQl9CQkJCQkJXAotCX0JCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2Vsc2UgLyogKGRlZmluZWQgQkNNREJHKSAqLwotI2RlZmluZQlXTF9JTkZPKGZtdCwgYXJncy4uLikKLSNkZWZpbmUJV0xfVFJBQ0UoZm10LCBhcmdzLi4uKQotI2RlZmluZQlXTF9TQ0FOKGZtdCwgYXJncy4uLikKLSNkZWZpbmUJV0xfQ09OTihmbXQsIGFyZ3MuLi4pCi0jZW5kaWYgLyogKGRlZmluZWQgQkNNREJHKSAqLwotCi0jZGVmaW5lIFdMX05VTV9TQ0FOX01BWAkJMQotI2RlZmluZSBXTF9OVU1fUE1LSURTX01BWAlNQVhQTUtJRAkvKiB3aWxsIGJlIHVzZWQKLQkJCQkJCSAqIGZvciAyLjYuMzMga2VybmVsCi0JCQkJCQkgKiBvciBsYXRlcgotCQkJCQkJICovCi0jZGVmaW5lIFdMX1NDQU5fQlVGX01BWAkJCSgxMDI0ICogOCkKLSNkZWZpbmUgV0xfVExWX0lORk9fTUFYCQkJMTAyNAotI2RlZmluZSBXTF9CU1NfSU5GT19NQVgJCQkyMDQ4Ci0jZGVmaW5lIFdMX0FTU09DX0lORk9fTUFYCTUxMgkvKgotCQkJCSAqIG5lZWRzIHRvIGdyYWIgYXNzb2MgaW5mbyBmcm9tIGRvbmdsZSB0bwotCQkJCSAqIHJlcG9ydCBpdCB0byBjZmc4MDIxMSB0aHJvdWdoICJjb25uZWN0IgotCQkJCSAqIGV2ZW50Ci0JCQkJICovCi0jZGVmaW5lIFdMX0lPQ1RMX0xFTl9NQVgJMTAyNAotI2RlZmluZSBXTF9FWFRSQV9CVUZfTUFYCTIwNDgKLSNkZWZpbmUgV0xfSVNDQU5fQlVGX01BWAkyMDQ4CS8qCi0JCQkJICogdGhlIGJ1ZiBsZW5ndGggY2FuIGJlIEJSQ01GX0NfSU9DVExfTUFYTEVOCi0JCQkJICogdG8gcmVkdWNlIGl0ZXJhdGlvbgotCQkJCSAqLwotI2RlZmluZSBXTF9JU0NBTl9USU1FUl9JTlRFUlZBTF9NUwkzMDAwCi0jZGVmaW5lIFdMX1NDQU5fRVJTVUxUU19MQVNUCShCUkNNRl9TQ0FOX1JFU1VMVFNfTk9fTUVNKzEpCi0jZGVmaW5lIFdMX0FQX01BWAkyNTYJLyogdmlydHVhbGx5IHVubGltaXR0ZWQgYXMgbG9uZwotCQkJCSAqIGFzIGtlcm5lbCBtZW1vcnkgYWxsb3dzCi0JCQkJICovCi0KLSNkZWZpbmUgV0xfUk9BTV9UUklHR0VSX0xFVkVMCQktNzUKLSNkZWZpbmUgV0xfUk9BTV9ERUxUQQkJCTIwCi0jZGVmaW5lIFdMX0JFQUNPTl9USU1FT1VUCQkzCi0KLSNkZWZpbmUgV0xfU0NBTl9DSEFOTkVMX1RJTUUJCTQwCi0jZGVmaW5lIFdMX1NDQU5fVU5BU1NPQ19USU1FCQk0MAotI2RlZmluZSBXTF9TQ0FOX1BBU1NJVkVfVElNRQkJMTIwCi0KLS8qIGRvbmdsZSBzdGF0dXMgKi8KLWVudW0gd2xfc3RhdHVzIHsKLQlXTF9TVEFUVVNfUkVBRFksCi0JV0xfU1RBVFVTX1NDQU5OSU5HLAotCVdMX1NUQVRVU19TQ0FOX0FCT1JUSU5HLAotCVdMX1NUQVRVU19DT05ORUNUSU5HLAotCVdMX1NUQVRVU19DT05ORUNURUQKLX07Ci0KLS8qIHdpLWZpIG1vZGUgKi8KLWVudW0gd2xfbW9kZSB7Ci0JV0xfTU9ERV9CU1MsCi0JV0xfTU9ERV9JQlNTLAotCVdMX01PREVfQVAKLX07Ci0KLS8qIGRvbmdsZSBwcm9maWxlIGxpc3QgKi8KLWVudW0gd2xfcHJvZl9saXN0IHsKLQlXTF9QUk9GX01PREUsCi0JV0xfUFJPRl9TU0lELAotCVdMX1BST0ZfU0VDLAotCVdMX1BST0ZfSUJTUywKLQlXTF9QUk9GX0JBTkQsCi0JV0xfUFJPRl9CU1NJRCwKLQlXTF9QUk9GX0FDVCwKLQlXTF9QUk9GX0JFQUNPTklOVCwKLQlXTF9QUk9GX0RUSU1QRVJJT0QKLX07Ci0KLS8qIGRvbmdsZSBpc2NhbiBzdGF0ZSAqLwotZW51bSB3bF9pc2Nhbl9zdGF0ZSB7Ci0JV0xfSVNDQU5fU1RBVEVfSURMRSwKLQlXTF9JU0NBTl9TVEFURV9TQ0FOSU5HCi19OwotCi0vKiBkb25nbGUgY29uZmlndXJhdGlvbiAqLwotc3RydWN0IGJyY21mX2NmZzgwMjExX2NvbmYgewotCXUzMiBtb2RlOwkJLyogYWRob2MgLCBpbmZyYXN0cnVjdHVyZSBvciBhcCAqLwotCXUzMiBmcmFnX3RocmVzaG9sZDsKLQl1MzIgcnRzX3RocmVzaG9sZDsKLQl1MzIgcmV0cnlfc2hvcnQ7Ci0JdTMyIHJldHJ5X2xvbmc7Ci0JczMyIHR4X3Bvd2VyOwotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBjaGFubmVsOwotfTsKLQotLyogY2ZnODAyMTEgbWFpbiBldmVudCBsb29wICovCi1zdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfZXZlbnRfbG9vcCB7Ci0JczMyKCpoYW5kbGVyW0JSQ01GX0VfTEFTVF0pIChzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYsCi0JCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCQkgICAgIGNvbnN0IHN0cnVjdCBicmNtZl9ldmVudF9tc2cgKmUsCi0JCQkJICAgICB2b2lkICpkYXRhKTsKLX07Ci0KLS8qIHJlcHJlc2VudGluZyBpbnRlcmZhY2Ugb2YgY2ZnODAyMTEgcGxhbmUgKi8KLXN0cnVjdCBicmNtZl9jZmc4MDIxMV9pZmFjZSB7Ci0Jc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2OwotfTsKLQotc3RydWN0IGJyY21mX2NmZzgwMjExX2RldiB7Ci0Jdm9pZCAqZHJpdmVyX2RhdGE7CS8qIHRvIHN0b3JlIGNmZzgwMjExIG9iamVjdCBpbmZvcm1hdGlvbiAqLwotfTsKLQotLyogYmFzaWMgc3RydWN0dXJlIG9mIHNjYW4gcmVxdWVzdCAqLwotc3RydWN0IGJyY21mX2NmZzgwMjExX3NjYW5fcmVxIHsKLQlzdHJ1Y3QgYnJjbWZfc3NpZCBzc2lkOwotfTsKLQotLyogYmFzaWMgc3RydWN0dXJlIG9mIGluZm9ybWF0aW9uIGVsZW1lbnQgKi8KLXN0cnVjdCBicmNtZl9jZmc4MDIxMV9pZSB7Ci0JdTE2IG9mZnNldDsKLQl1OCBidWZbV0xfVExWX0lORk9fTUFYXTsKLX07Ci0KLS8qIGV2ZW50IHF1ZXVlIGZvciBjZmc4MDIxMSBtYWluIGV2ZW50ICovCi1zdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfZXZlbnRfcSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBlcV9saXN0OwotCXUzMiBldHlwZTsKLQlzdHJ1Y3QgYnJjbWZfZXZlbnRfbXNnIGVtc2c7Ci0JczggZWRhdGFbMV07Ci19OwotCi0vKiBzZWN1cml0eSBpbmZvcm1hdGlvbiB3aXRoIGN1cnJlbnRseSBhc3NvY2lhdGVkIGFwICovCi1zdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfc2VjdXJpdHkgewotCXUzMiB3cGFfdmVyc2lvbnM7Ci0JdTMyIGF1dGhfdHlwZTsKLQl1MzIgY2lwaGVyX3BhaXJ3aXNlOwotCXUzMiBjaXBoZXJfZ3JvdXA7Ci0JdTMyIHdwYV9hdXRoOwotfTsKLQotLyogaWJzcyBpbmZvcm1hdGlvbiBmb3IgY3VycmVudGx5IGpvaW5lZCBpYnNzIG5ldHdvcmsgKi8KLXN0cnVjdCBicmNtZl9jZmc4MDIxMV9pYnNzIHsKLQl1OCBiZWFjb25faW50ZXJ2YWw7CS8qIGluIG1pbGxpc2Vjb25kICovCi0JdTggYXRpbTsJCS8qIGluIG1pbGxpc2Vjb25kICovCi0Jczggam9pbl9vbmx5OwotCXU4IGJhbmQ7Ci0JdTggY2hhbm5lbDsKLX07Ci0KLS8qIGRvbmdsZSBwcm9maWxlICovCi1zdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJvZmlsZSB7Ci0JdTMyIG1vZGU7Ci0Jc3RydWN0IGJyY21mX3NzaWQgc3NpZDsKLQl1OCBic3NpZFtFVEhfQUxFTl07Ci0JdTE2IGJlYWNvbl9pbnRlcnZhbDsKLQl1OCBkdGltX3BlcmlvZDsKLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfc2VjdXJpdHkgc2VjOwotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9pYnNzIGlic3M7Ci0JczMyIGJhbmQ7Ci19OwotCi0vKiBkb25nbGUgaXNjYW4gZXZlbnQgbG9vcCAqLwotc3RydWN0IGJyY21mX2NmZzgwMjExX2lzY2FuX2Vsb29wIHsKLQlzMzIgKCpoYW5kbGVyW1dMX1NDQU5fRVJTVUxUU19MQVNUXSkKLQkJKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdik7Ci19OwotCi0vKiBkb25nbGUgaXNjYW4gY29udHJvbGxlciAqLwotc3RydWN0IGJyY21mX2NmZzgwMjExX2lzY2FuX2N0cmwgewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7Ci0JdTMyIHRpbWVyX21zOwotCXUzMiB0aW1lcl9vbjsKLQlzMzIgc3RhdGU7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7Ci0Jc3RydWN0IHNlbWFwaG9yZSBzeW5jOwotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9pc2Nhbl9lbG9vcCBlbDsKLQl2b2lkICpkYXRhOwotCXM4IGlvY3RsX2J1ZltCUkNNRl9DX0lPQ1RMX1NNTEVOXTsKLQlzOCBzY2FuX2J1ZltXTF9JU0NBTl9CVUZfTUFYXTsKLX07Ci0KLS8qIGFzc29jaWF0aW9uIGluZm9ybSAqLwotc3RydWN0IGJyY21mX2NmZzgwMjExX2Nvbm5lY3RfaW5mbyB7Ci0JdTggKnJlcV9pZTsKLQlzMzIgcmVxX2llX2xlbjsKLQl1OCAqcmVzcF9pZTsKLQlzMzIgcmVzcF9pZV9sZW47Ci19OwotCi0vKiBhc3NvYyBpZSBsZW5ndGggKi8KLXN0cnVjdCBicmNtZl9jZmc4MDIxMV9hc3NvY19pZWxlbiB7Ci0JdTMyIHJlcV9sZW47Ci0JdTMyIHJlc3BfbGVuOwotfTsKLQotLyogd3BhMiBwbWsgbGlzdCAqLwotc3RydWN0IGJyY21mX2NmZzgwMjExX3Bta19saXN0IHsKLQlwbWtpZF9saXN0X3QgcG1raWRzOwotCXBta2lkX3QgZm9vW01BWFBNS0lEIC0gMV07Ci19OwotCi0vKiBkb25nbGUgcHJpdmF0ZSBkYXRhIG9mIGNmZzgwMjExIGludGVyZmFjZSAqLwotc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgewotCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXY7CS8qIHJlcHJlc2VudGluZyB3bCBjZmc4MDIxMSBkZXZpY2UgKi8KLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfY29uZiAqY29uZjsJLyogZG9uZ2xlIGNvbmZpZ3VyYXRpb24gKi8KLQlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpzY2FuX3JlcXVlc3Q7CS8qIHNjYW4gcmVxdWVzdAotCQkJCQkJCSBvYmplY3QgKi8KLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfZXZlbnRfbG9vcCBlbDsJLyogbWFpbiBldmVudCBsb29wICovCi0Jc3RydWN0IGxpc3RfaGVhZCBlcV9saXN0OwkvKiB1c2VkIGZvciBldmVudCBxdWV1ZSAqLwotCXNwaW5sb2NrX3QgZXFfbG9jazsJLyogZm9yIGV2ZW50IHF1ZXVlIHN5bmNocm9uaXphdGlvbiAqLwotCXN0cnVjdCBtdXRleCB1c3Jfc3luYzsJLyogbWFpbHkgZm9yIGRvbmdsZSB1cC9kb3duIHN5bmNocm9uaXphdGlvbiAqLwotCXN0cnVjdCBicmNtZl9zY2FuX3Jlc3VsdHMgKmJzc19saXN0OwkvKiBic3NfbGlzdCBob2xkaW5nIHNjYW5uZWQKLQkJCQkJCSBhcCBpbmZvcm1hdGlvbiAqLwotCXN0cnVjdCBicmNtZl9zY2FuX3Jlc3VsdHMgKnNjYW5fcmVzdWx0czsKLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfc2Nhbl9yZXEgKnNjYW5fcmVxX2ludDsJLyogc2NhbiByZXF1ZXN0IG9iamVjdAotCQkJCQkJIGZvciBpbnRlcm5hbCBwdXJwb3NlICovCi0Jc3RydWN0IHdsX2NmZzgwMjExX2Jzc19pbmZvICpic3NfaW5mbzsJLyogYnNzIGluZm9ybWF0aW9uIGZvcgotCQkJCQkJIGNmZzgwMjExIGxheWVyICovCi0Jc3RydWN0IGJyY21mX2NmZzgwMjExX2llIGllOwkvKiBpbmZvcm1hdGlvbiBlbGVtZW50IG9iamVjdCBmb3IKLQkJCQkJIGludGVybmFsIHB1cnBvc2UgKi8KLQlzdHJ1Y3Qgc2VtYXBob3JlIGV2ZW50X3N5bmM7CS8qIGZvciBzeW5jaHJvbml6YXRpb24gb2YgbWFpbiBldmVudAotCQkJCQkgdGhyZWFkICovCi0Jc3RydWN0IGJyY21mX2NmZzgwMjExX3Byb2ZpbGUgKnByb2ZpbGU7CS8qIGhvbGRpbmcgZG9uZ2xlIHByb2ZpbGUgKi8KLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfaXNjYW5fY3RybCAqaXNjYW47CS8qIGlzY2FuIGNvbnRyb2xsZXIgKi8KLQlzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfY29ubmVjdF9pbmZvIGNvbm5faW5mbzsgLyogYXNzb2NpYXRpb24gaW5mbyAqLwotCXN0cnVjdCBicmNtZl9jZmc4MDIxMV9wbWtfbGlzdCAqcG1rX2xpc3Q7CS8qIHdwYTIgcG1rIGxpc3QgKi8KLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmV2ZW50X3RzazsJLyogdGFzayBvZiBtYWluIGV2ZW50IGhhbmRsZXIgdGhyZWFkICovCi0JdW5zaWduZWQgbG9uZyBzdGF0dXM7CQkvKiBjdXJyZW50IGRvbmdsZSBzdGF0dXMgKi8KLQl2b2lkICpwdWI7Ci0JdTMyIGNoYW5uZWw7CQkvKiBjdXJyZW50IGNoYW5uZWwgKi8KLQlib29sIGlzY2FuX29uOwkJLyogaXNjYW4gb24vb2ZmIHN3aXRjaCAqLwotCWJvb2wgaXNjYW5fa2lja3N0YXJ0OwkvKiBpbmRpY2F0ZSBpc2NhbiBhbHJlYWR5IHN0YXJ0ZWQgKi8KLQlib29sIGFjdGl2ZV9zY2FuOwkvKiBjdXJyZW50IHNjYW4gbW9kZSAqLwotCWJvb2wgaWJzc19zdGFydGVyOwkvKiBpbmRpY2F0ZXMgdGhpcyBzdGEgaXMgaWJzcyBzdGFydGVyICovCi0JYm9vbCBsaW5rX3VwOwkJLyogbGluay9jb25uZWN0aW9uIHVwIGZsYWcgKi8KLQlib29sIHB3cl9zYXZlOwkJLyogaW5kaWNhdGUgd2hldGhlciBkb25nbGUgdG8gc3VwcG9ydAotCQkJCQkgcG93ZXIgc2F2ZSBtb2RlICovCi0JYm9vbCBkb25nbGVfdXA7CQkvKiBpbmRpY2F0ZSB3aGV0aGVyIGRvbmdsZSB1cCBvciBub3QgKi8KLQlib29sIHJvYW1fb247CQkvKiBvbi9vZmYgc3dpdGNoIGZvciBkb25nbGUgc2VsZi1yb2FtaW5nICovCi0JYm9vbCBzY2FuX3RyaWVkOwkvKiBpbmRpY2F0ZXMgaWYgZmlyc3Qgc2NhbiBhdHRlbXB0ZWQgKi8KLQl1OCAqaW9jdGxfYnVmOwkvKiBpb2N0bCBidWZmZXIgKi8KLQl1OCAqZXh0cmFfYnVmOwkvKiBtYWlseSB0byBncmFiIGFzc29jIGluZm9ybWF0aW9uICovCi0Jc3RydWN0IGRlbnRyeSAqZGVidWdmc2RpcjsKLQl1OCBjaVswXSBfX2F0dHJpYnV0ZV9fICgoX19hbGlnbmVkX18oTkVUREVWX0FMSUdOKSkpOwotfTsKLQotI2RlZmluZSBjZmdfdG9fd2lwaHkodykgKHctPndkZXYtPndpcGh5KQotI2RlZmluZSB3aXBoeV90b19jZmcodykgKChzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqKSh3aXBoeV9wcml2KHcpKSkKLSNkZWZpbmUgY2ZnX3RvX3dkZXYodykgKHctPndkZXYpCi0jZGVmaW5lIHdkZXZfdG9fY2ZnKHcpICgoc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKikod2Rldl9wcml2KHcpKSkKLSNkZWZpbmUgY2ZnX3RvX25kZXYodykgKHctPndkZXYtPm5ldGRldikKLSNkZWZpbmUgbmRldl90b19jZmcobikgKHdkZXZfdG9fY2ZnKG4tPmllZWU4MDIxMV9wdHIpKQotI2RlZmluZSBpc2Nhbl90b19jZmcoaSkgKChzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqKShpLT5kYXRhKSkKLSNkZWZpbmUgY2ZnX3RvX2lzY2FuKHcpICh3LT5pc2NhbikKLSNkZWZpbmUgY2ZnX3RvX2Nvbm4odykgKCZ3LT5jb25uX2luZm8pCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGJyY21mX2Jzc19pbmZvICpuZXh0X2JzcyhzdHJ1Y3QgYnJjbWZfc2Nhbl9yZXN1bHRzICpsaXN0LAotCQkJCQkgICBzdHJ1Y3QgYnJjbWZfYnNzX2luZm8gKmJzcykKLXsKLQlyZXR1cm4gYnNzID0gYnNzID8KLQkJKHN0cnVjdCBicmNtZl9ic3NfaW5mbyAqKSgodW5zaWduZWQgbG9uZylic3MgKwotCQkJCSAgICAgICBsZTMyX3RvX2NwdShic3MtPmxlbmd0aCkpIDoKLQkJbGlzdC0+YnNzX2luZm87Ci19Ci0KLSNkZWZpbmUgZm9yX2VhY2hfYnNzKGxpc3QsIGJzcywgX19pKQlcCi0JZm9yIChfX2kgPSAwOyBfX2kgPCBsaXN0LT5jb3VudCAmJiBfX2kgPCBXTF9BUF9NQVg7IF9faSsrLCBic3MgPSBuZXh0X2JzcyhsaXN0LCBic3MpKQotCi1leHRlcm4gczMyIGJyY21mX2NmZzgwMjExX2F0dGFjaChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdm9pZCAqZGF0YSk7Ci1leHRlcm4gdm9pZCBicmNtZl9jZmc4MDIxMV9kZXRhY2godm9pZCk7Ci0vKiBldmVudCBoYW5kbGVyIGZyb20gZG9uZ2xlICovCi1leHRlcm4gdm9pZCBicmNtZl9jZmc4MDIxMV9ldmVudChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLQkJCQkgY29uc3Qgc3RydWN0IGJyY21mX2V2ZW50X21zZyAqZSwgdm9pZCAqZGF0YSk7Ci1leHRlcm4gdm9pZCBicmNtZl9jZmc4MDIxMV9zZGlvX2Z1bmModm9pZCAqZnVuYyk7IC8qIHNldCBzZGlvIGZ1bmN0aW9uIGluZm8gKi8KLWV4dGVybiBzdHJ1Y3Qgc2Rpb19mdW5jICpicmNtZl9jZmc4MDIxMV9nZXRfc2Rpb19mdW5jKHZvaWQpOwotZXh0ZXJuIHMzMiBicmNtZl9jZmc4MDIxMV91cCh2b2lkKTsJLyogZG9uZ2xlIHVwICovCi1leHRlcm4gczMyIGJyY21mX2NmZzgwMjExX2Rvd24odm9pZCk7CS8qIGRvbmdsZSBkb3duICovCi0KLSNlbmRpZgkJCQkvKiBfd2xfY2ZnODAyMTFfaF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWEzZTBjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZyYWdtZW50IGZvciBCcm9hZGNvbSA4MDIuMTFuIE5ldHdvcmtpbmcgRGV2aWNlIERyaXZlcgotIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSMKLSMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0jIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSMKLSMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0jIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSMgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0jIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotIyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0jIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSMgQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLQotY2NmbGFncy15IDo9CQkJCVwKLQktRFdMQ19ISUdICQkJCVwKLQktRFdMQ19MT1cJCQkJXAotCS1EU1RBCQkJCQlcCi0JLURXTUUJCQkJCVwKLQktRFdMMTFOCQkJCQlcCi0JLUREQkFORAkJCQkJXAotCS1EQkNNTlZSQU1SCQkJCVwKLQktSWRyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMgXAotCS1JZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHkgXAotCS1JZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlCi0KLUJSQ01TTUFDX09GSUxFUyA6PSBcCi0JbWFjODAyMTFfaWYubyBcCi0JdWNvZGVfbG9hZGVyLm8gXAotCWFsbG9jLm8gXAotCWFtcGR1Lm8gXAotCWFudHNlbC5vIFwKLQlibWFjLm8gXAotCWNoYW5uZWwubyBcCi0JbWFpbi5vIFwKLQlwaHlfc2hpbS5vIFwKLQlwbXUubyBcCi0JcmF0ZS5vIFwKLQlzdGYubyBcCi0JYWl1dGlscy5vIFwKLQlwaHkvcGh5X2Ntbi5vIFwKLQlwaHkvcGh5X2xjbi5vIFwKLQlwaHkvcGh5X24ubyBcCi0JcGh5L3BoeXRibF9sY24ubyBcCi0JcGh5L3BoeXRibF9uLm8gXAotCXBoeS9waHlfcW1hdGgubyBcCi0Jb3RwLm8gXAotCXNyb20ubyBcCi0JZG1hLm8gXAotCW5pY3BjaS5vCi0KLU1PRFVMRVBGWCA6PSBicmNtc21hYwotCi1vYmotJChDT05GSUdfQlJDTVNNQUMpCSs9ICQoTU9EVUxFUEZYKS5vCi0kKE1PRFVMRVBGWCktb2Jqcwk9ICQoQlJDTVNNQUNfT0ZJTEVTKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9haXV0aWxzLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL2FpdXRpbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI1OTAxZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL2FpdXRpbHMuYworKysgL2Rldi9udWxsCkBAIC0xLDIyNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLQotI2luY2x1ZGUgPGRlZnMuaD4KLSNpbmNsdWRlIDxjaGlwY29tbW9uLmg+Ci0jaW5jbHVkZSA8YnJjbXVfdXRpbHMuaD4KLSNpbmNsdWRlIDxicmNtX2h3X2lkcy5oPgotI2luY2x1ZGUgInR5cGVzLmgiCi0jaW5jbHVkZSAicHViLmgiCi0jaW5jbHVkZSAicG11LmgiCi0jaW5jbHVkZSAic3JvbS5oIgotI2luY2x1ZGUgIm5pY3BjaS5oIgotI2luY2x1ZGUgImFpdXRpbHMuaCIKLQotLyogc2xvd19jbGtfY3RsICovCi0jZGVmaW5lIFNDQ19TU19NQVNLCQkweDAwMDAwMDA3CS8qIHNsb3cgY2xvY2sgc291cmNlIG1hc2sgKi8KLSNkZWZpbmUJU0NDX1NTX0xQTwkJMHgwMDAwMDAwMAkvKiBzb3VyY2Ugb2Ygc2xvdyBjbG9jayBpcyBMUE8gKi8KLSNkZWZpbmUJU0NDX1NTX1hUQUwJCTB4MDAwMDAwMDEJLyogc291cmNlIG9mIHNsb3cgY2xvY2sgaXMgY3J5c3RhbCAqLwotI2RlZmluZQlTQ0NfU1NfUENJCQkweDAwMDAwMDAyCS8qIHNvdXJjZSBvZiBzbG93IGNsb2NrIGlzIFBDSSAqLwotI2RlZmluZSBTQ0NfTEYJCQkweDAwMDAwMjAwCS8qIExQT0ZyZXFTZWwsIDE6IDE2MEtoeiwgMDogMzJLSHogKi8KLSNkZWZpbmUgU0NDX0xQCQkJMHgwMDAwMDQwMAkvKiBMUE9Qb3dlckRvd24sIDE6IExQTyBpcyBkaXNhYmxlZCwKLQkJCQkJCSAqIDA6IExQTyBpcyBlbmFibGVkCi0JCQkJCQkgKi8KLSNkZWZpbmUgU0NDX0ZTCQkJMHgwMDAwMDgwMAkvKiBGb3JjZVNsb3dDbGssIDE6IHNiL2NvcmVzIHJ1bm5pbmcgb24gc2xvdyBjbG9jaywKLQkJCQkJCSAqIDA6IHBvd2VyIGxvZ2ljIGNvbnRyb2wKLQkJCQkJCSAqLwotI2RlZmluZSBTQ0NfSVAJCQkweDAwMDAxMDAwCS8qIElnbm9yZVBsbE9mZlJlcSwgMS8wOiBwb3dlciBsb2dpYyBpZ25vcmVzL2hvbm9ycwotCQkJCQkJICogUExMIGNsb2NrIGRpc2FibGUgcmVxdWVzdHMgZnJvbSBjb3JlCi0JCQkJCQkgKi8KLSNkZWZpbmUgU0NDX1hDCQkJMHgwMDAwMjAwMAkvKiBYdGFsQ29udHJvbEVuLCAxLzA6IHBvd2VyIGxvZ2ljIGRvZXMvZG9lc24ndAotCQkJCQkJICogZGlzYWJsZSBjcnlzdGFsIHdoZW4gYXBwcm9wcmlhdGUKLQkJCQkJCSAqLwotI2RlZmluZSBTQ0NfWFAJCQkweDAwMDA0MDAwCS8qIFh0YWxQVSAoUk8pLCAxLzA6IGNyeXN0YWwgcnVubmluZy9kaXNhYmxlZCAqLwotI2RlZmluZSBTQ0NfQ0RfTUFTSwkJMHhmZmZmMDAwMAkvKiBDbG9ja0RpdmlkZXIgKFNsb3dDbGsgPSAxLyg0K2Rpdmlzb3IpKSAqLwotI2RlZmluZSBTQ0NfQ0RfU0hJRlQJCTE2Ci0KLS8qIHN5c3RlbV9jbGtfY3RsICovCi0jZGVmaW5lCVNZQ0NfSUUJCQkweDAwMDAwMDAxCS8qIElMUGVuOiBFbmFibGUgSWRsZSBMb3cgUG93ZXIgKi8KLSNkZWZpbmUJU1lDQ19BRQkJCTB4MDAwMDAwMDIJLyogQUxQZW46IEVuYWJsZSBBY3RpdmUgTG93IFBvd2VyICovCi0jZGVmaW5lCVNZQ0NfRlAJCQkweDAwMDAwMDA0CS8qIEZvcmNlUExMT24gKi8KLSNkZWZpbmUJU1lDQ19BUgkJCTB4MDAwMDAwMDgJLyogRm9yY2UgQUxQIChvciBIVCBpZiBBTFBlbiBpcyBub3Qgc2V0ICovCi0jZGVmaW5lCVNZQ0NfSFIJCQkweDAwMDAwMDEwCS8qIEZvcmNlIEhUICovCi0jZGVmaW5lIFNZQ0NfQ0RfTUFTSwkJMHhmZmZmMDAwMAkvKiBDbGtEaXYgIChJTFAgPSAxLyg0ICogKGRpdmlzb3IgKyAxKSkgKi8KLSNkZWZpbmUgU1lDQ19DRF9TSElGVAkJMTYKLQotI2RlZmluZSBDU1Q0MzI5X1NQUk9NX09UUF9TRUxfTUFTSwkweDAwMDAwMDAzCi0jZGVmaW5lIENTVDQzMjlfREVGQ0lTX1NFTAkJMAkvKiBPVFAgaXMgcG93ZXJlZCB1cCwgdXNlIGRlZi4gQ0lTLCBubyBTUFJPTSAqLwotI2RlZmluZSBDU1Q0MzI5X1NQUk9NX1NFTAkJMQkvKiBPVFAgaXMgcG93ZXJlZCB1cCwgU1BST00gaXMgcHJlc2VudCAqLwotI2RlZmluZSBDU1Q0MzI5X09UUF9TRUwJCQkyCS8qIE9UUCBpcyBwb3dlcmVkIHVwLCBubyBTUFJPTSAqLwotI2RlZmluZSBDU1Q0MzI5X09UUF9QV1JETgkJMwkvKiBPVFAgaXMgcG93ZXJlZCBkb3duLCBTUFJPTSBpcyBwcmVzZW50ICovCi0jZGVmaW5lIENTVDQzMjlfU1BJX1NESU9fTU9ERV9NQVNLCTB4MDAwMDAwMDQKLSNkZWZpbmUgQ1NUNDMyOV9TUElfU0RJT19NT0RFX1NISUZUCTIKLQotLyogNDMyMjQgY2hpcC1zcGVjaWZpYyBDaGlwQ29udHJvbCByZWdpc3RlciBiaXRzICovCi0jZGVmaW5lIENDVFJMNDMyMjRfR1BJT19UT0dHTEUgICAgICAgICAgMHg4MDAwCi0jZGVmaW5lIENDVFJMXzQzMjI0QTBfMTJNQV9MRURfRFJJVkUgICAgMHgwMEYwMDBGMAkvKiAxMiBtQSBkcml2ZSBzdHJlbmd0aCAqLwotI2RlZmluZSBDQ1RSTF80MzIyNEIwXzEyTUFfTEVEX0RSSVZFICAgIDB4RjAJLyogMTIgbUEgZHJpdmUgc3RyZW5ndGggZm9yIGxhdGVyIDQzMjI0cyAqLwotCi0vKiA0MzIzNiBDaGlwIHNwZWNpZmljIENoaXBTdGF0dXMgcmVnaXN0ZXIgYml0cyAqLwotI2RlZmluZSBDU1Q0MzIzNl9TRkxBU0hfTUFTSwkJMHgwMDAwMDA0MAotI2RlZmluZSBDU1Q0MzIzNl9PVFBfTUFTSwkJMHgwMDAwMDA4MAotI2RlZmluZSBDU1Q0MzIzNl9IU0lDX01BU0sJCTB4MDAwMDAxMDAJLyogVVNCL0hTSUMgKi8KLSNkZWZpbmUgQ1NUNDMyMzZfQlBfQ0xLCQkJMHgwMDAwMDIwMAkvKiAxMjAvOTZNYnBzICovCi0jZGVmaW5lIENTVDQzMjM2X0JPT1RfTUFTSwkJMHgwMDAwMTgwMAotI2RlZmluZSBDU1Q0MzIzNl9CT09UX1NISUZUCQkxMQotI2RlZmluZSBDU1Q0MzIzNl9CT09UX0ZST01fU1JBTQkJMAkvKiBib290IGZyb20gU1JBTSwgQVJNIGluIHJlc2V0ICovCi0jZGVmaW5lIENTVDQzMjM2X0JPT1RfRlJPTV9ST00JCTEJLyogYm9vdCBmcm9tIFJPTSAqLwotI2RlZmluZSBDU1Q0MzIzNl9CT09UX0ZST01fRkxBU0gJMgkvKiBib290IGZyb20gRkxBU0ggKi8KLSNkZWZpbmUgQ1NUNDMyMzZfQk9PVF9GUk9NX0lOVkFMSUQJMwotCi0vKiA0MzMxIGNoaXAtc3BlY2lmaWMgQ2hpcENvbnRyb2wgcmVnaXN0ZXIgYml0cyAqLwotI2RlZmluZSBDQ1RSTDQzMzFfQlRfQ09FWElTVAkJKDE8PDApCS8qIDAgZGlzYWJsZSAqLwotI2RlZmluZSBDQ1RSTDQzMzFfU0VDSQkJCSgxPDwxKQkvKiAwIFNFQ0kgaXMgZGlzYWJsZWQgKEpBVEcgZnVuY3Rpb25hbCkgKi8KLSNkZWZpbmUgQ0NUUkw0MzMxX0VYVF9MTkEJCSgxPDwyKQkvKiAwIGRpc2FibGUgKi8KLSNkZWZpbmUgQ0NUUkw0MzMxX1NQUk9NX0dQSU8xM18xNSAgICAgICAoMTw8MykJLyogc3Byb20vZ3BpbzEzLTE1IG11eCAqLwotI2RlZmluZSBDQ1RSTDQzMzFfRVhUUEFfRU4JCSgxPDw0KQkvKiAwIGV4dCBwYSBkaXNhYmxlLCAxIGV4dCBwYSBlbmFibGVkICovCi0jZGVmaW5lIENDVFJMNDMzMV9HUElPQ0xLX09OX1NQUk9NQ1MJKDE8PDUpCS8qIHNldCBkcml2ZSBvdXQgR1BJT19DTEsgb24gc3Byb21fY3MgcGluICovCi0jZGVmaW5lIENDVFJMNDMzMV9QQ0lFX01ESU9fT05fU1BST01DUwkoMTw8NikJLyogdXNlIHNwcm9tX2NzIHBpbiBhcyBQQ0lFIG1kaW8gaW50ZXJmYWNlICovCi0jZGVmaW5lIENDVFJMNDMzMV9FWFRQQV9PTl9HUElPMl81CSgxPDw3KQkvKiBhYmFuZCBleHRwYSB3aWxsIGJlIGF0IGdwaW8yLzUgYW5kIHNwcm9tX2RvdXQgKi8KLSNkZWZpbmUgQ0NUUkw0MzMxX09WUl9QSVBFQVVYQ0xLRU4JKDE8PDgpCS8qIG92ZXJyaWRlIGNvcmUgY29udHJvbCBvbiBwaXBlX0F1eENsa0VuYWJsZSAqLwotI2RlZmluZSBDQ1RSTDQzMzFfT1ZSX1BJUEVBVVhQV1JET1dOCSgxPDw5KQkvKiBvdmVycmlkZSBjb3JlIGNvbnRyb2wgb24gcGlwZV9BdXhQb3dlckRvd24gKi8KLSNkZWZpbmUgQ0NUUkw0MzMxX1BDSUVfQVVYQ0xLRU4JCSgxPDwxMCkJLyogcGNpZV9hdXhjbGtlbmFibGUgKi8KLSNkZWZpbmUgQ0NUUkw0MzMxX1BDSUVfUElQRV9QTExET1dOCSgxPDwxMSkJLyogcGNpZV9waXBlX3BsbHBvd2VyZG93biAqLwotI2RlZmluZSBDQ1RSTDQzMzFfQlRfU0hEMF9PTl9HUElPNAkoMTw8MTYpCS8qIGVuYWJsZSBidF9zaGQwIGF0IGdwaW80ICovCi0jZGVmaW5lIENDVFJMNDMzMV9CVF9TSEQxX09OX0dQSU81CSgxPDwxNykJLyogZW5hYmxlIGJ0X3NoZDEgYXQgZ3BpbzUgKi8KLQotLyogNDMzMSBDaGlwIHNwZWNpZmljIENoaXBTdGF0dXMgcmVnaXN0ZXIgYml0cyAqLwotI2RlZmluZQlDU1Q0MzMxX1hUQUxfRlJFUQkJMHgwMDAwMDAwMQkvKiBjcnlzdGFsIGZyZXF1ZW5jeSAyMC80ME1oeiAqLwotI2RlZmluZQlDU1Q0MzMxX1NQUk9NX1BSRVNFTlQJCTB4MDAwMDAwMDIKLSNkZWZpbmUJQ1NUNDMzMV9PVFBfUFJFU0VOVAkJMHgwMDAwMDAwNAotI2RlZmluZQlDU1Q0MzMxX0xET19SRgkJCTB4MDAwMDAwMDgKLSNkZWZpbmUJQ1NUNDMzMV9MRE9fUEFSCQkJMHgwMDAwMDAxMAotCi0vKiA0MzE5IGNoaXAtc3BlY2lmaWMgQ2hpcFN0YXR1cyByZWdpc3RlciBiaXRzICovCi0jZGVmaW5lCUNTVDQzMTlfU1BJX0NQVUxFU1NVU0IJCTB4MDAwMDAwMDEKLSNkZWZpbmUJQ1NUNDMxOV9TUElfQ0xLX1BPTAkJMHgwMDAwMDAwMgotI2RlZmluZQlDU1Q0MzE5X1NQSV9DTEtfUEgJCTB4MDAwMDAwMDgKLSNkZWZpbmUJQ1NUNDMxOV9TUFJPTV9PVFBfU0VMX01BU0sJMHgwMDAwMDBjMAkvKiBncGlvIFs3OjZdLCBTRElPIENJUyBzZWxlY3Rpb24gKi8KLSNkZWZpbmUJQ1NUNDMxOV9TUFJPTV9PVFBfU0VMX1NISUZUCTYKLSNkZWZpbmUJQ1NUNDMxOV9ERUZDSVNfU0VMCQkweDAwMDAwMDAwCS8qIHVzZSBkZWZhdWx0IENJUywgT1RQIGlzIHBvd2VyZWQgdXAgKi8KLSNkZWZpbmUJQ1NUNDMxOV9TUFJPTV9TRUwJCTB4MDAwMDAwNDAJLyogdXNlIFNQUk9NLCBPVFAgaXMgcG93ZXJlZCB1cCAqLwotI2RlZmluZQlDU1Q0MzE5X09UUF9TRUwJCQkweDAwMDAwMDgwCS8qIHVzZSBPVFAsIE9UUCBpcyBwb3dlcmVkIHVwICovCi0jZGVmaW5lCUNTVDQzMTlfT1RQX1BXUkROCQkweDAwMDAwMGMwCS8qIHVzZSBTUFJPTSwgT1RQIGlzIHBvd2VyZWQgZG93biAqLwotI2RlZmluZQlDU1Q0MzE5X1NESU9fVVNCX01PREUJCTB4MDAwMDAxMDAJLyogZ3BpbyBbOF0sIHNkaW8vdXNiIG1vZGUgKi8KLSNkZWZpbmUJQ1NUNDMxOV9SRU1BUF9TRUxfTUFTSwkJMHgwMDAwMDYwMAotI2RlZmluZQlDU1Q0MzE5X0lMUERJVl9FTgkJMHgwMDAwMDgwMAotI2RlZmluZQlDU1Q0MzE5X1hUQUxfUERfUE9MCQkweDAwMDAxMDAwCi0jZGVmaW5lCUNTVDQzMTlfTFBPX1NFTAkJCTB4MDAwMDIwMDAKLSNkZWZpbmUJQ1NUNDMxOV9SRVNfSU5JVF9NT0RFCQkweDAwMDBjMDAwCi0jZGVmaW5lCUNTVDQzMTlfUEFMRE9fRVhUUE5QCQkweDAwMDEwMDAwCS8qIFBBTERPIGlzIGNvbmZpZ3VyZWQgd2l0aCBleHRlcm5hbCBQTlAgKi8KLSNkZWZpbmUJQ1NUNDMxOV9DQlVDS19NT0RFX01BU0sJCTB4MDAwNjAwMDAKLSNkZWZpbmUgQ1NUNDMxOV9DQlVDS19NT0RFX0JVUlNUCTB4MDAwMjAwMDAKLSNkZWZpbmUgQ1NUNDMxOV9DQlVDS19NT0RFX0xQQlVSU1QJMHgwMDA2MDAwMAotI2RlZmluZQlDU1Q0MzE5X1JDQUxfVkFMSUQJCTB4MDEwMDAwMDAKLSNkZWZpbmUJQ1NUNDMxOV9SQ0FMX1ZBTFVFX01BU0sJCTB4M2UwMDAwMDAKLSNkZWZpbmUJQ1NUNDMxOV9SQ0FMX1ZBTFVFX1NISUZUCTI1Ci0KLS8qIDQzMzYgY2hpcC1zcGVjaWZpYyBDaGlwU3RhdHVzIHJlZ2lzdGVyIGJpdHMgKi8KLSNkZWZpbmUJQ1NUNDMzNl9TUElfTU9ERV9NQVNLCQkweDAwMDAwMDAxCi0jZGVmaW5lCUNTVDQzMzZfU1BST01fUFJFU0VOVAkJMHgwMDAwMDAwMgotI2RlZmluZQlDU1Q0MzM2X09UUF9QUkVTRU5UCQkweDAwMDAwMDA0Ci0jZGVmaW5lCUNTVDQzMzZfQVJNUkVNQVBfMAkJMHgwMDAwMDAwOAotI2RlZmluZQlDU1Q0MzM2X0lMUERJVl9FTl9NQVNLCQkweDAwMDAwMDEwCi0jZGVmaW5lCUNTVDQzMzZfSUxQRElWX0VOX1NISUZUCQk0Ci0jZGVmaW5lCUNTVDQzMzZfWFRBTF9QRF9QT0xfTUFTSwkweDAwMDAwMDIwCi0jZGVmaW5lCUNTVDQzMzZfWFRBTF9QRF9QT0xfU0hJRlQJNQotI2RlZmluZQlDU1Q0MzM2X0xQT19TRUxfTUFTSwkJMHgwMDAwMDA0MAotI2RlZmluZQlDU1Q0MzM2X0xQT19TRUxfU0hJRlQJCTYKLSNkZWZpbmUJQ1NUNDMzNl9SRVNfSU5JVF9NT0RFX01BU0sJMHgwMDAwMDE4MAotI2RlZmluZQlDU1Q0MzM2X1JFU19JTklUX01PREVfU0hJRlQJNwotI2RlZmluZQlDU1Q0MzM2X0NCVUNLX01PREVfTUFTSwkJMHgwMDAwMDYwMAotI2RlZmluZQlDU1Q0MzM2X0NCVUNLX01PREVfU0hJRlQJOQotCi0vKiA0MzEzIGNoaXAtc3BlY2lmaWMgQ2hpcFN0YXR1cyByZWdpc3RlciBiaXRzICovCi0jZGVmaW5lCUNTVDQzMTNfU1BST01fUFJFU0VOVAkJCTEKLSNkZWZpbmUJQ1NUNDMxM19PVFBfUFJFU0VOVAkJCTIKLSNkZWZpbmUJQ1NUNDMxM19TUFJPTV9PVFBfU0VMX01BU0sJCTB4MDAwMDAwMDIKLSNkZWZpbmUJQ1NUNDMxM19TUFJPTV9PVFBfU0VMX1NISUZUCQkwCi0KLS8qIDQzMTMgQ2hpcCBzcGVjaWZpYyBDaGlwQ29udHJvbCByZWdpc3RlciBiaXRzICovCi0jZGVmaW5lIENDVFJMXzQzMTNfMTJNQV9MRURfRFJJVkUgICAgMHgwMDAwMDAwNwkvKiAxMiBtQSBkcml2ZSBzdHJlbmdoIGZvciBsYXRlciA0MzEzICovCi0KLSNkZWZpbmUgQkNNNDcxNjJfRE1QKCkgKChzaWgtPmNoaXAgPT0gQkNNNDcxNjJfQ0hJUF9JRCkgJiYgXAotCQkoc2loLT5jaGlwcmV2ID09IDApICYmIFwKLQkJKHNpaS0+Y29yZWlkW3NpaS0+Y3VyaWR4XSA9PSBNSVBTNzRLX0NPUkVfSUQpKQotCi0vKiBNYW51ZmFjdHVyZXIgSWRzICovCi0jZGVmaW5lCU1GR0lEX0FSTQkJMHg0M2IKLSNkZWZpbmUJTUZHSURfQlJDTQkJMHg0YmYKLSNkZWZpbmUJTUZHSURfTUlQUwkJMHg0YTcKLQotLyogRW51bWVyYXRpb24gUk9NIHJlZ2lzdGVycyAqLwotI2RlZmluZQlFUl9FUk9NRU5UUlkJCTB4MDAwCi0jZGVmaW5lCUVSX1JFTUFQQ09OVFJPTAkJMHhlMDAKLSNkZWZpbmUJRVJfUkVNQVBTRUxFQ1QJCTB4ZTA0Ci0jZGVmaW5lCUVSX01BU1RFUlNFTEVDVAkJMHhlMTAKLSNkZWZpbmUJRVJfSVRDUgkJCTB4ZjAwCi0jZGVmaW5lCUVSX0lUSVAJCQkweGYwNAotCi0vKiBFcm9tIGVudHJpZXMgKi8KLSNkZWZpbmUJRVJfVEFHCQkJMHhlCi0jZGVmaW5lCUVSX1RBRzEJCQkweDYKLSNkZWZpbmUJRVJfVkFMSUQJCTEKLSNkZWZpbmUJRVJfQ0kJCQkwCi0jZGVmaW5lCUVSX01QCQkJMgotI2RlZmluZQlFUl9BREQJCQk0Ci0jZGVmaW5lCUVSX0VORAkJCTB4ZQotI2RlZmluZQlFUl9CQUQJCQkweGZmZmZmZmZmCi0KLS8qIEVST00gQ29tcElkZW50QSAqLwotI2RlZmluZQlDSUFfTUZHX01BU0sJCTB4ZmZmMDAwMDAKLSNkZWZpbmUJQ0lBX01GR19TSElGVAkJMjAKLSNkZWZpbmUJQ0lBX0NJRF9NQVNLCQkweDAwMGZmZjAwCi0jZGVmaW5lCUNJQV9DSURfU0hJRlQJCTgKLSNkZWZpbmUJQ0lBX0NDTF9NQVNLCQkweDAwMDAwMGYwCi0jZGVmaW5lCUNJQV9DQ0xfU0hJRlQJCTQKLQotLyogRVJPTSBDb21wSWRlbnRCICovCi0jZGVmaW5lCUNJQl9SRVZfTUFTSwkJMHhmZjAwMDAwMAotI2RlZmluZQlDSUJfUkVWX1NISUZUCQkyNAotI2RlZmluZQlDSUJfTlNXX01BU0sJCTB4MDBmODAwMDAKLSNkZWZpbmUJQ0lCX05TV19TSElGVAkJMTkKLSNkZWZpbmUJQ0lCX05NV19NQVNLCQkweDAwMDdjMDAwCi0jZGVmaW5lCUNJQl9OTVdfU0hJRlQJCTE0Ci0jZGVmaW5lCUNJQl9OU1BfTUFTSwkJMHgwMDAwM2UwMAotI2RlZmluZQlDSUJfTlNQX1NISUZUCQk5Ci0jZGVmaW5lCUNJQl9OTVBfTUFTSwkJMHgwMDAwMDFmMAotI2RlZmluZQlDSUJfTk1QX1NISUZUCQk0Ci0KLS8qIEVST00gQWRkckRlc2MgKi8KLSNkZWZpbmUJQURfQUREUl9NQVNLCQkweGZmZmZmMDAwCi0jZGVmaW5lCUFEX1NQX01BU0sJCTB4MDAwMDBmMDAKLSNkZWZpbmUJQURfU1BfU0hJRlQJCTgKLSNkZWZpbmUJQURfU1RfTUFTSwkJMHgwMDAwMDBjMAotI2RlZmluZQlBRF9TVF9TSElGVAkJNgotI2RlZmluZQlBRF9TVF9TTEFWRQkJMHgwMDAwMDAwMAotI2RlZmluZQlBRF9TVF9CUklER0UJCTB4MDAwMDAwNDAKLSNkZWZpbmUJQURfU1RfU1dSQVAJCTB4MDAwMDAwODAKLSNkZWZpbmUJQURfU1RfTVdSQVAJCTB4MDAwMDAwYzAKLSNkZWZpbmUJQURfU1pfTUFTSwkJMHgwMDAwMDAzMAotI2RlZmluZQlBRF9TWl9TSElGVAkJNAotI2RlZmluZQlBRF9TWl80SwkJMHgwMDAwMDAwMAotI2RlZmluZQlBRF9TWl84SwkJMHgwMDAwMDAxMAotI2RlZmluZQlBRF9TWl8xNksJCTB4MDAwMDAwMjAKLSNkZWZpbmUJQURfU1pfU1pECQkweDAwMDAwMDMwCi0jZGVmaW5lCUFEX0FHMzIJCQkweDAwMDAwMDA4Ci0jZGVmaW5lCUFEX0FERFJfQUxJR04JCTB4MDAwMDBmZmYKLSNkZWZpbmUJQURfU1pfQkFTRQkJMHgwMDAwMTAwMAkvKiA0S0IgKi8KLQotLyogRVJPTSBTaXplRGVzYyAqLwotI2RlZmluZQlTRF9TWl9NQVNLCQkweGZmZmZmMDAwCi0jZGVmaW5lCVNEX1NHMzIJCQkweDAwMDAwMDA4Ci0jZGVmaW5lCVNEX1NaX0FMSUdOCQkweDAwMDAwZmZmCi0KLSNkZWZpbmUJUENJX0NGR19HUElPX1NDUwkweDEwCS8qIFBDSSBjb25maWcgc3BhY2UgYml0IDQgZm9yIDQzMDZjMCBzbG93IGNsb2NrIHNvdXJjZSAqLwotI2RlZmluZSBQQ0lfQ0ZHX0dQSU9fWFRBTAkweDQwCS8qIFBDSSBjb25maWcgc3BhY2UgR1BJTyAxNCBmb3IgWHRhbCBwb3dlci11cCAqLwotI2RlZmluZSBQQ0lfQ0ZHX0dQSU9fUExMCTB4ODAJLyogUENJIGNvbmZpZyBzcGFjZSBHUElPIDE1IGZvciBQTEwgcG93ZXItZG93biAqLwotCi0vKiBwb3dlciBjb250cm9sIGRlZmluZXMgKi8KLSNkZWZpbmUgUExMX0RFTEFZCQkxNTAJLyogdXMgcGxsIG9uIGRlbGF5ICovCi0jZGVmaW5lIEZSRUZfREVMQVkJCTIwMAkvKiB1cyBmcmVmIGNoYW5nZSBkZWxheSAqLwotI2RlZmluZQlYVEFMX09OX0RFTEFZCQkxMDAwCS8qIHVzIGNyeXN0YWwgcG93ZXItb24gZGVsYXkgKi8KLQotLyogcmVzZXRjdHJsICovCi0jZGVmaW5lCUFJUkNfUkVTRVQJCTEKLQotc3RydWN0IGFpZG1wIHsKLQl1MzIgb29ic2VsaW5hMzA7CS8qIDB4MDAwICovCi0JdTMyIG9vYnNlbGluYTc0OwkvKiAweDAwNCAqLwotCXUzMiBQQURbNl07Ci0JdTMyIG9vYnNlbGluYjMwOwkvKiAweDAyMCAqLwotCXUzMiBvb2JzZWxpbmI3NDsJLyogMHgwMjQgKi8KLQl1MzIgUEFEWzZdOwotCXUzMiBvb2JzZWxpbmMzMDsJLyogMHgwNDAgKi8KLQl1MzIgb29ic2VsaW5jNzQ7CS8qIDB4MDQ0ICovCi0JdTMyIFBBRFs2XTsKLQl1MzIgb29ic2VsaW5kMzA7CS8qIDB4MDYwICovCi0JdTMyIG9vYnNlbGluZDc0OwkvKiAweDA2NCAqLwotCXUzMiBQQURbMzhdOwotCXUzMiBvb2JzZWxvdXRhMzA7CS8qIDB4MTAwICovCi0JdTMyIG9vYnNlbG91dGE3NDsJLyogMHgxMDQgKi8KLQl1MzIgUEFEWzZdOwotCXUzMiBvb2JzZWxvdXRiMzA7CS8qIDB4MTIwICovCi0JdTMyIG9vYnNlbG91dGI3NDsJLyogMHgxMjQgKi8KLQl1MzIgUEFEWzZdOwotCXUzMiBvb2JzZWxvdXRjMzA7CS8qIDB4MTQwICovCi0JdTMyIG9vYnNlbG91dGM3NDsJLyogMHgxNDQgKi8KLQl1MzIgUEFEWzZdOwotCXUzMiBvb2JzZWxvdXRkMzA7CS8qIDB4MTYwICovCi0JdTMyIG9vYnNlbG91dGQ3NDsJLyogMHgxNjQgKi8KLQl1MzIgUEFEWzM4XTsKLQl1MzIgb29ic3luY2E7CS8qIDB4MjAwICovCi0JdTMyIG9vYnNlbG91dGFlbjsJLyogMHgyMDQgKi8KLQl1MzIgUEFEWzZdOwotCXUzMiBvb2JzeW5jYjsJLyogMHgyMjAgKi8KLQl1MzIgb29ic2Vsb3V0YmVuOwkvKiAweDIyNCAqLwotCXUzMiBQQURbNl07Ci0JdTMyIG9vYnN5bmNjOwkvKiAweDI0MCAqLwotCXUzMiBvb2JzZWxvdXRjZW47CS8qIDB4MjQ0ICovCi0JdTMyIFBBRFs2XTsKLQl1MzIgb29ic3luY2Q7CS8qIDB4MjYwICovCi0JdTMyIG9vYnNlbG91dGRlbjsJLyogMHgyNjQgKi8KLQl1MzIgUEFEWzM4XTsKLQl1MzIgb29iYWV4dHdpZHRoOwkvKiAweDMwMCAqLwotCXUzMiBvb2JhaW53aWR0aDsJLyogMHgzMDQgKi8KLQl1MzIgb29iYW91dHdpZHRoOwkvKiAweDMwOCAqLwotCXUzMiBQQURbNV07Ci0JdTMyIG9vYmJleHR3aWR0aDsJLyogMHgzMjAgKi8KLQl1MzIgb29iYmlud2lkdGg7CS8qIDB4MzI0ICovCi0JdTMyIG9vYmJvdXR3aWR0aDsJLyogMHgzMjggKi8KLQl1MzIgUEFEWzVdOwotCXUzMiBvb2JjZXh0d2lkdGg7CS8qIDB4MzQwICovCi0JdTMyIG9vYmNpbndpZHRoOwkvKiAweDM0NCAqLwotCXUzMiBvb2Jjb3V0d2lkdGg7CS8qIDB4MzQ4ICovCi0JdTMyIFBBRFs1XTsKLQl1MzIgb29iZGV4dHdpZHRoOwkvKiAweDM2MCAqLwotCXUzMiBvb2JkaW53aWR0aDsJLyogMHgzNjQgKi8KLQl1MzIgb29iZG91dHdpZHRoOwkvKiAweDM2OCAqLwotCXUzMiBQQURbMzddOwotCXUzMiBpb2N0cmxzZXQ7CS8qIDB4NDAwICovCi0JdTMyIGlvY3RybGNsZWFyOwkvKiAweDQwNCAqLwotCXUzMiBpb2N0cmw7CQkvKiAweDQwOCAqLwotCXUzMiBQQURbNjFdOwotCXUzMiBpb3N0YXR1czsJLyogMHg1MDAgKi8KLQl1MzIgUEFEWzEyN107Ci0JdTMyIGlvY3RybHdpZHRoOwkvKiAweDcwMCAqLwotCXUzMiBpb3N0YXR1c3dpZHRoOwkvKiAweDcwNCAqLwotCXUzMiBQQURbNjJdOwotCXUzMiByZXNldGN0cmw7CS8qIDB4ODAwICovCi0JdTMyIHJlc2V0c3RhdHVzOwkvKiAweDgwNCAqLwotCXUzMiByZXNldHJlYWRpZDsJLyogMHg4MDggKi8KLQl1MzIgcmVzZXR3cml0ZWlkOwkvKiAweDgwYyAqLwotCXUzMiBQQURbNjBdOwotCXUzMiBlcnJsb2djdHJsOwkvKiAweDkwMCAqLwotCXUzMiBlcnJsb2dkb25lOwkvKiAweDkwNCAqLwotCXUzMiBlcnJsb2dzdGF0dXM7CS8qIDB4OTA4ICovCi0JdTMyIGVycmxvZ2FkZHJsbzsJLyogMHg5MGMgKi8KLQl1MzIgZXJybG9nYWRkcmhpOwkvKiAweDkxMCAqLwotCXUzMiBlcnJsb2dpZDsJLyogMHg5MTQgKi8KLQl1MzIgZXJybG9ndXNlcjsJLyogMHg5MTggKi8KLQl1MzIgZXJybG9nZmxhZ3M7CS8qIDB4OTFjICovCi0JdTMyIFBBRFs1Nl07Ci0JdTMyIGludHN0YXR1czsJLyogMHhhMDAgKi8KLQl1MzIgUEFEWzEyN107Ci0JdTMyIGNvbmZpZzsJCS8qIDB4ZTAwICovCi0JdTMyIFBBRFs2M107Ci0JdTMyIGl0Y3I7CQkvKiAweGYwMCAqLwotCXUzMiBQQURbM107Ci0JdTMyIGl0aXBvb2JhOwkvKiAweGYxMCAqLwotCXUzMiBpdGlwb29iYjsJLyogMHhmMTQgKi8KLQl1MzIgaXRpcG9vYmM7CS8qIDB4ZjE4ICovCi0JdTMyIGl0aXBvb2JkOwkvKiAweGYxYyAqLwotCXUzMiBQQURbNF07Ci0JdTMyIGl0aXBvb2Jhb3V0OwkvKiAweGYzMCAqLwotCXUzMiBpdGlwb29iYm91dDsJLyogMHhmMzQgKi8KLQl1MzIgaXRpcG9vYmNvdXQ7CS8qIDB4ZjM4ICovCi0JdTMyIGl0aXBvb2Jkb3V0OwkvKiAweGYzYyAqLwotCXUzMiBQQURbNF07Ci0JdTMyIGl0b3Bvb2JhOwkvKiAweGY1MCAqLwotCXUzMiBpdG9wb29iYjsJLyogMHhmNTQgKi8KLQl1MzIgaXRvcG9vYmM7CS8qIDB4ZjU4ICovCi0JdTMyIGl0b3Bvb2JkOwkvKiAweGY1YyAqLwotCXUzMiBQQURbNF07Ci0JdTMyIGl0b3Bvb2JhaW47CS8qIDB4ZjcwICovCi0JdTMyIGl0b3Bvb2JiaW47CS8qIDB4Zjc0ICovCi0JdTMyIGl0b3Bvb2JjaW47CS8qIDB4Zjc4ICovCi0JdTMyIGl0b3Bvb2JkaW47CS8qIDB4ZjdjICovCi0JdTMyIFBBRFs0XTsKLQl1MzIgaXRvcHJlc2V0OwkvKiAweGY5MCAqLwotCXUzMiBQQURbMTVdOwotCXUzMiBwZXJpcGhlcmlhbGlkNDsJLyogMHhmZDAgKi8KLQl1MzIgcGVyaXBoZXJpYWxpZDU7CS8qIDB4ZmQ0ICovCi0JdTMyIHBlcmlwaGVyaWFsaWQ2OwkvKiAweGZkOCAqLwotCXUzMiBwZXJpcGhlcmlhbGlkNzsJLyogMHhmZGMgKi8KLQl1MzIgcGVyaXBoZXJpYWxpZDA7CS8qIDB4ZmUwICovCi0JdTMyIHBlcmlwaGVyaWFsaWQxOwkvKiAweGZlNCAqLwotCXUzMiBwZXJpcGhlcmlhbGlkMjsJLyogMHhmZTggKi8KLQl1MzIgcGVyaXBoZXJpYWxpZDM7CS8qIDB4ZmVjICovCi0JdTMyIGNvbXBvbmVudGlkMDsJLyogMHhmZjAgKi8KLQl1MzIgY29tcG9uZW50aWQxOwkvKiAweGZmNCAqLwotCXUzMiBjb21wb25lbnRpZDI7CS8qIDB4ZmY4ICovCi0JdTMyIGNvbXBvbmVudGlkMzsJLyogMHhmZmMgKi8KLX07Ci0KLS8qIEVST00gcGFyc2luZyAqLwotCi1zdGF0aWMgdTMyCi1nZXRfZXJvbV9lbnQoc3RydWN0IHNpX3B1YiAqc2loLCB1MzIgKiplcm9tcHRyLCB1MzIgbWFzaywgdTMyIG1hdGNoKQotewotCXUzMiBlbnQ7Ci0JdWludCBpbnYgPSAwLCBub20gPSAwOwotCi0Jd2hpbGUgKHRydWUpIHsKLQkJZW50ID0gUl9SRUcoKmVyb21wdHIpOwotCQkoKmVyb21wdHIpKys7Ci0KLQkJaWYgKG1hc2sgPT0gMCkKLQkJCWJyZWFrOwotCi0JCWlmICgoZW50ICYgRVJfVkFMSUQpID09IDApIHsKLQkJCWludisrOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoZW50ID09IChFUl9FTkQgfCBFUl9WQUxJRCkpCi0JCQlicmVhazsKLQotCQlpZiAoKGVudCAmIG1hc2spID09IG1hdGNoKQotCQkJYnJlYWs7Ci0KLQkJbm9tKys7Ci0JfQotCi0JU0lfVk1TRygoIiVzOiBSZXR1cm5pbmcgZW50IDB4JTA4eFxuIiwgX19mdW5jX18sIGVudCkpOwotCWlmIChpbnYgKyBub20pIHsKLQkJU0lfVk1TRygoIiAgYWZ0ZXIgJWQgaW52YWxpZCBhbmQgJWQgbm9uLW1hdGNoaW5nIGVudHJpZXNcbiIsCi0JCQkgaW52LCBub20pKTsKLQl9Ci0JcmV0dXJuIGVudDsKLX0KLQotc3RhdGljIHUzMgotZ2V0X2FzZChzdHJ1Y3Qgc2lfcHViICpzaWgsIHUzMiAqKmVyb21wdHIsIHVpbnQgc3AsIHVpbnQgYWQsIHVpbnQgc3QsCi0JdTMyICphZGRybCwgdTMyICphZGRyaCwgdTMyICpzaXplbCwgdTMyICpzaXplaCkKLXsKLQl1MzIgYXNkLCBzeiwgc3pkOwotCi0JYXNkID0gZ2V0X2Vyb21fZW50KHNpaCwgZXJvbXB0ciwgRVJfVkFMSUQsIEVSX1ZBTElEKTsKLQlpZiAoKChhc2QgJiBFUl9UQUcxKSAhPSBFUl9BREQpIHx8Ci0JICAgICgoKGFzZCAmIEFEX1NQX01BU0spID4+IEFEX1NQX1NISUZUKSAhPSBzcCkgfHwKLQkgICAgKChhc2QgJiBBRF9TVF9NQVNLKSAhPSBzdCkpIHsKLQkJLyogVGhpcyBpcyBub3Qgd2hhdCB3ZSB3YW50LCAicHVzaCIgaXQgYmFjayAqLwotCQkoKmVyb21wdHIpLS07Ci0JCXJldHVybiAwOwotCX0KLQkqYWRkcmwgPSBhc2QgJiBBRF9BRERSX01BU0s7Ci0JaWYgKGFzZCAmIEFEX0FHMzIpCi0JCSphZGRyaCA9IGdldF9lcm9tX2VudChzaWgsIGVyb21wdHIsIDAsIDApOwotCWVsc2UKLQkJKmFkZHJoID0gMDsKLQkqc2l6ZWggPSAwOwotCXN6ID0gYXNkICYgQURfU1pfTUFTSzsKLQlpZiAoc3ogPT0gQURfU1pfU1pEKSB7Ci0JCXN6ZCA9IGdldF9lcm9tX2VudChzaWgsIGVyb21wdHIsIDAsIDApOwotCQkqc2l6ZWwgPSBzemQgJiBTRF9TWl9NQVNLOwotCQlpZiAoc3pkICYgU0RfU0czMikKLQkJCSpzaXplaCA9IGdldF9lcm9tX2VudChzaWgsIGVyb21wdHIsIDAsIDApOwotCX0gZWxzZQotCQkqc2l6ZWwgPSBBRF9TWl9CQVNFIDw8IChzeiA+PiBBRF9TWl9TSElGVCk7Ci0KLQlTSV9WTVNHKCgiICBTUCAlZCwgYWQgJWQ6IHN0ID0gJWQsIDB4JTA4eF8weCUwOHggQCAweCUwOHhfMHglMDh4XG4iLAotCQkgc3AsIGFkLCBzdCwgKnNpemVoLCAqc2l6ZWwsICphZGRyaCwgKmFkZHJsKSk7Ci0KLQlyZXR1cm4gYXNkOwotfQotCi1zdGF0aWMgdm9pZCBhaV9od2ZpeHVwKHN0cnVjdCBzaV9pbmZvICpzaWkpCi17Ci19Ci0KLS8qIHBhcnNlIHRoZSBlbnVtZXJhdGlvbiByb20gdG8gaWRlbnRpZnkgYWxsIGNvcmVzICovCi12b2lkIGFpX3NjYW4oc3RydWN0IHNpX3B1YiAqc2loLCB2b2lkICpyZWdzKQotewotCXN0cnVjdCBzaV9pbmZvICpzaWkgPSBTSV9JTkZPKHNpaCk7Ci0JY2hpcGNyZWdzX3QgKmNjID0gKGNoaXBjcmVnc190ICopIHJlZ3M7Ci0JdTMyIGVyb21iYXNlLCAqZXJvbXB0ciwgKmVyb21saW07Ci0KLQllcm9tYmFzZSA9IFJfUkVHKCZjYy0+ZXJvbXB0cik7Ci0KLQlzd2l0Y2ggKHNpaC0+YnVzdHlwZSkgewotCWNhc2UgU0lfQlVTOgotCQllcm9tcHRyID0gKHUzMiAqKSBSRUdfTUFQKGVyb21iYXNlLCBTSV9DT1JFX1NJWkUpOwotCQlicmVhazsKLQotCWNhc2UgUENJX0JVUzoKLQkJLyogU2V0IHdyYXBwZXJzIGFkZHJlc3MgKi8KLQkJc2lpLT5jdXJ3cmFwID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpcmVncyArIFNJX0NPUkVfU0laRSk7Ci0KLQkJLyogTm93IHBvaW50IHRoZSB3aW5kb3cgYXQgdGhlIGVyb20gKi8KLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPnBidXMsIFBDSV9CQVIwX1dJTiwgZXJvbWJhc2UpOwotCQllcm9tcHRyID0gcmVnczsKLQkJYnJlYWs7Ci0KLQljYXNlIFNQSV9CVVM6Ci0JY2FzZSBTRElPX0JVUzoKLQkJZXJvbXB0ciA9ICh1MzIgKikodW5zaWduZWQgbG9uZyllcm9tYmFzZTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlTSV9FUlJPUigoIkRvbid0IGtub3cgaG93IHRvIGRvIEFYSSBlbnVtZXJ0aW9uIG9uIGJ1cyAlZFxuIiwKLQkJCSAgc2loLT5idXN0eXBlKSk7Ci0JCXJldHVybjsKLQl9Ci0JZXJvbWxpbSA9IGVyb21wdHIgKyAoRVJfUkVNQVBDT05UUk9MIC8gc2l6ZW9mKHUzMikpOwotCi0JU0lfVk1TRygoImFpX3NjYW46IHJlZ3MgPSAweCVwLCBlcm9tYmFzZSA9IDB4JTA4eCwgZXJvbXB0ciA9IDB4JXAsIGVyb21saW0gPSAweCVwXG4iLCByZWdzLCBlcm9tYmFzZSwgZXJvbXB0ciwgZXJvbWxpbSkpOwotCXdoaWxlIChlcm9tcHRyIDwgZXJvbWxpbSkgewotCQl1MzIgY2lhLCBjaWIsIGNpZCwgbWZnLCBjcmV2LCBubXcsIG5zdywgbm1wLCBuc3A7Ci0JCXUzMiBtcGQsIGFzZCwgYWRkcmwsIGFkZHJoLCBzaXplbCwgc2l6ZWg7Ci0JCXUzMiAqYmFzZTsKLQkJdWludCBpLCBqLCBpZHg7Ci0JCWJvb2wgYnI7Ci0KLQkJYnIgPSBmYWxzZTsKLQotCQkvKiBHcm9rIGEgY29tcG9uZW50ICovCi0JCWNpYSA9IGdldF9lcm9tX2VudChzaWgsICZlcm9tcHRyLCBFUl9UQUcsIEVSX0NJKTsKLQkJaWYgKGNpYSA9PSAoRVJfRU5EIHwgRVJfVkFMSUQpKSB7Ci0JCQlTSV9WTVNHKCgiRm91bmQgRU5EIG9mIGVyb20gYWZ0ZXIgJWQgY29yZXNcbiIsCi0JCQkJIHNpaS0+bnVtY29yZXMpKTsKLQkJCWFpX2h3Zml4dXAoc2lpKTsKLQkJCXJldHVybjsKLQkJfQotCQliYXNlID0gZXJvbXB0ciAtIDE7Ci0JCWNpYiA9IGdldF9lcm9tX2VudChzaWgsICZlcm9tcHRyLCAwLCAwKTsKLQotCQlpZiAoKGNpYiAmIEVSX1RBRykgIT0gRVJfQ0kpIHsKLQkJCVNJX0VSUk9SKCgiQ0lBIG5vdCBmb2xsb3dlZCBieSBDSUJcbiIpKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQotCQljaWQgPSAoY2lhICYgQ0lBX0NJRF9NQVNLKSA+PiBDSUFfQ0lEX1NISUZUOwotCQltZmcgPSAoY2lhICYgQ0lBX01GR19NQVNLKSA+PiBDSUFfTUZHX1NISUZUOwotCQljcmV2ID0gKGNpYiAmIENJQl9SRVZfTUFTSykgPj4gQ0lCX1JFVl9TSElGVDsKLQkJbm13ID0gKGNpYiAmIENJQl9OTVdfTUFTSykgPj4gQ0lCX05NV19TSElGVDsKLQkJbnN3ID0gKGNpYiAmIENJQl9OU1dfTUFTSykgPj4gQ0lCX05TV19TSElGVDsKLQkJbm1wID0gKGNpYiAmIENJQl9OTVBfTUFTSykgPj4gQ0lCX05NUF9TSElGVDsKLQkJbnNwID0gKGNpYiAmIENJQl9OU1BfTUFTSykgPj4gQ0lCX05TUF9TSElGVDsKLQotCQlTSV9WTVNHKCgiRm91bmQgY29tcG9uZW50IDB4JTA0eC8weCUwNHggcmV2ICVkIGF0IGVyb20gYWRkciAweCVwLCB3aXRoIG5tdyA9ICVkLCAiICJuc3cgPSAlZCwgbm1wID0gJWQgJiBuc3AgPSAlZFxuIiwgbWZnLCBjaWQsIGNyZXYsIGJhc2UsIG5tdywgbnN3LCBubXAsIG5zcCkpOwotCi0JCWlmICgoKG1mZyA9PSBNRkdJRF9BUk0pICYmIChjaWQgPT0gREVGX0FJX0NPTVApKSB8fCAobnNwID09IDApKQotCQkJY29udGludWU7Ci0JCWlmICgobm13ICsgbnN3ID09IDApKSB7Ci0JCQkvKiBBIGNvbXBvbmVudCB3aGljaCBpcyBub3QgYSBjb3JlICovCi0JCQlpZiAoY2lkID09IE9PQl9ST1VURVJfQ09SRV9JRCkgewotCQkJCWFzZCA9IGdldF9hc2Qoc2loLCAmZXJvbXB0ciwgMCwgMCwgQURfU1RfU0xBVkUsCi0JCQkJCSAgICAgICZhZGRybCwgJmFkZHJoLCAmc2l6ZWwsICZzaXplaCk7Ci0JCQkJaWYgKGFzZCAhPSAwKSB7Ci0JCQkJCXNpaS0+b29iX3JvdXRlciA9IGFkZHJsOwotCQkJCX0KLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWR4ID0gc2lpLT5udW1jb3JlczsKLS8qCQlzaWktPmVyb21wdHJbaWR4XSA9IGJhc2U7ICovCi0JCXNpaS0+Y2lhW2lkeF0gPSBjaWE7Ci0JCXNpaS0+Y2liW2lkeF0gPSBjaWI7Ci0JCXNpaS0+Y29yZWlkW2lkeF0gPSBjaWQ7Ci0KLQkJZm9yIChpID0gMDsgaSA8IG5tcDsgaSsrKSB7Ci0JCQltcGQgPSBnZXRfZXJvbV9lbnQoc2loLCAmZXJvbXB0ciwgRVJfVkFMSUQsIEVSX1ZBTElEKTsKLQkJCWlmICgobXBkICYgRVJfVEFHKSAhPSBFUl9NUCkgewotCQkJCVNJX0VSUk9SKCgiTm90IGVub3VnaCBNUCBlbnRyaWVzIGZvciBjb21wb25lbnQgMHgleFxuIiwgY2lkKSk7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCVNJX1ZNU0coKCIgIE1hc3RlciBwb3J0ICVkLCBtcDogJWQgaWQ6ICVkXG4iLCBpLAotCQkJCSAobXBkICYgTVBEX01QX01BU0spID4+IE1QRF9NUF9TSElGVCwKLQkJCQkgKG1wZCAmIE1QRF9NVUlfTUFTSykgPj4gTVBEX01VSV9TSElGVCkpOwotCQl9Ci0KLQkJLyogRmlyc3QgU2xhdmUgQWRkcmVzcyBEZXNjcmlwdG9yIHNob3VsZCBiZSBwb3J0IDA6Ci0JCSAqIHRoZSBtYWluIHJlZ2lzdGVyIHNwYWNlIGZvciB0aGUgY29yZQotCQkgKi8KLQkJYXNkID0KLQkJICAgIGdldF9hc2Qoc2loLCAmZXJvbXB0ciwgMCwgMCwgQURfU1RfU0xBVkUsICZhZGRybCwgJmFkZHJoLAotCQkJICAgICZzaXplbCwgJnNpemVoKTsKLQkJaWYgKGFzZCA9PSAwKSB7Ci0JCQkvKiBUcnkgYWdhaW4gdG8gc2VlIGlmIGl0IGlzIGEgYnJpZGdlICovCi0JCQlhc2QgPQotCQkJICAgIGdldF9hc2Qoc2loLCAmZXJvbXB0ciwgMCwgMCwgQURfU1RfQlJJREdFLCAmYWRkcmwsCi0JCQkJICAgICZhZGRyaCwgJnNpemVsLCAmc2l6ZWgpOwotCQkJaWYgKGFzZCAhPSAwKQotCQkJCWJyID0gdHJ1ZTsKLQkJCWVsc2UgaWYgKChhZGRyaCAhPSAwKSB8fCAoc2l6ZWggIT0gMCkKLQkJCQkgfHwgKHNpemVsICE9IFNJX0NPUkVfU0laRSkpIHsKLQkJCQlTSV9FUlJPUigoIkZpcnN0IFNsYXZlIEFTRCBmb3IgY29yZSAweCUwNHggbWFsZm9ybWVkICIgIigweCUwOHgpXG4iLCBjaWQsIGFzZCkpOwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCX0KLQkJc2lpLT5jb3Jlc2JhW2lkeF0gPSBhZGRybDsKLQkJc2lpLT5jb3Jlc2JhX3NpemVbaWR4XSA9IHNpemVsOwotCQkvKiBHZXQgYW55IG1vcmUgQVNEcyBpbiBwb3J0IDAgKi8KLQkJaiA9IDE7Ci0JCWRvIHsKLQkJCWFzZCA9Ci0JCQkgICAgZ2V0X2FzZChzaWgsICZlcm9tcHRyLCAwLCBqLCBBRF9TVF9TTEFWRSwgJmFkZHJsLAotCQkJCSAgICAmYWRkcmgsICZzaXplbCwgJnNpemVoKTsKLQkJCWlmICgoYXNkICE9IDApICYmIChqID09IDEpICYmIChzaXplbCA9PSBTSV9DT1JFX1NJWkUpKSB7Ci0JCQkJc2lpLT5jb3Jlc2JhMltpZHhdID0gYWRkcmw7Ci0JCQkJc2lpLT5jb3Jlc2JhMl9zaXplW2lkeF0gPSBzaXplbDsKLQkJCX0KLQkJCWorKzsKLQkJfSB3aGlsZSAoYXNkICE9IDApOwotCi0JCS8qIEdvIHRocm91Z2ggdGhlIEFTRHMgZm9yIG90aGVyIHNsYXZlIHBvcnRzICovCi0JCWZvciAoaSA9IDE7IGkgPCBuc3A7IGkrKykgewotCQkJaiA9IDA7Ci0JCQlkbyB7Ci0JCQkJYXNkID0KLQkJCQkgICAgZ2V0X2FzZChzaWgsICZlcm9tcHRyLCBpLCBqKyssIEFEX1NUX1NMQVZFLAotCQkJCQkgICAgJmFkZHJsLCAmYWRkcmgsICZzaXplbCwgJnNpemVoKTsKLQkJCX0gd2hpbGUgKGFzZCAhPSAwKTsKLQkJCWlmIChqID09IDApIHsKLQkJCQlTSV9FUlJPUigoIiBTUCAlZCBoYXMgbm8gYWRkcmVzcyBkZXNjcmlwdG9yc1xuIiwKLQkJCQkJICBpKSk7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJfQotCi0JCS8qIE5vdyBnZXQgbWFzdGVyIHdyYXBwZXJzICovCi0JCWZvciAoaSA9IDA7IGkgPCBubXc7IGkrKykgewotCQkJYXNkID0KLQkJCSAgICBnZXRfYXNkKHNpaCwgJmVyb21wdHIsIGksIDAsIEFEX1NUX01XUkFQLCAmYWRkcmwsCi0JCQkJICAgICZhZGRyaCwgJnNpemVsLCAmc2l6ZWgpOwotCQkJaWYgKGFzZCA9PSAwKSB7Ci0JCQkJU0lfRVJST1IoKCJNaXNzaW5nIGRlc2NyaXB0b3IgZm9yIE1XICVkXG4iLCBpKSk7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCWlmICgoc2l6ZWggIT0gMCkgfHwgKHNpemVsICE9IFNJX0NPUkVfU0laRSkpIHsKLQkJCQlTSV9FUlJPUigoIk1hc3RlciB3cmFwcGVyICVkIGlzIG5vdCA0S0JcbiIsIGkpKTsKLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJaWYgKGkgPT0gMCkKLQkJCQlzaWktPndyYXBiYVtpZHhdID0gYWRkcmw7Ci0JCX0KLQotCQkvKiBBbmQgZmluYWxseSBzbGF2ZSB3cmFwcGVycyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgbnN3OyBpKyspIHsKLQkJCXVpbnQgZndwID0gKG5zcCA9PSAxKSA/IDAgOiAxOwotCQkJYXNkID0KLQkJCSAgICBnZXRfYXNkKHNpaCwgJmVyb21wdHIsIGZ3cCArIGksIDAsIEFEX1NUX1NXUkFQLAotCQkJCSAgICAmYWRkcmwsICZhZGRyaCwgJnNpemVsLCAmc2l6ZWgpOwotCQkJaWYgKGFzZCA9PSAwKSB7Ci0JCQkJU0lfRVJST1IoKCJNaXNzaW5nIGRlc2NyaXB0b3IgZm9yIFNXICVkXG4iLCBpKSk7Ci0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCWlmICgoc2l6ZWggIT0gMCkgfHwgKHNpemVsICE9IFNJX0NPUkVfU0laRSkpIHsKLQkJCQlTSV9FUlJPUigoIlNsYXZlIHdyYXBwZXIgJWQgaXMgbm90IDRLQlxuIiwgaSkpOwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQlpZiAoKG5tdyA9PSAwKSAmJiAoaSA9PSAwKSkKLQkJCQlzaWktPndyYXBiYVtpZHhdID0gYWRkcmw7Ci0JCX0KLQotCQkvKiBEb24ndCByZWNvcmQgYnJpZGdlcyAqLwotCQlpZiAoYnIpCi0JCQljb250aW51ZTsKLQotCQkvKiBEb25lIHdpdGggY29yZSAqLwotCQlzaWktPm51bWNvcmVzKys7Ci0JfQotCi0JU0lfRVJST1IoKCJSZWFjaGVkIGVuZCBvZiBlcm9tIHdpdGhvdXQgZmluZGluZyBFTkQiKSk7Ci0KLSBlcnJvcjoKLQlzaWktPm51bWNvcmVzID0gMDsKLQlyZXR1cm47Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgbG9naWNhbCAiZm9jdXMiIHRvIHRoZSBpbmRpY2F0ZWQgY29yZS4KLSAqIFJldHVybiB0aGUgY3VycmVudCBjb3JlJ3MgdmlydHVhbCBhZGRyZXNzLgotICovCi12b2lkICphaV9zZXRjb3JlaWR4KHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCBjb3JlaWR4KQotewotCXN0cnVjdCBzaV9pbmZvICpzaWkgPSBTSV9JTkZPKHNpaCk7Ci0JdTMyIGFkZHIgPSBzaWktPmNvcmVzYmFbY29yZWlkeF07Ci0JdTMyIHdyYXAgPSBzaWktPndyYXBiYVtjb3JlaWR4XTsKLQl2b2lkICpyZWdzOwotCi0JaWYgKGNvcmVpZHggPj0gc2lpLT5udW1jb3JlcykKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzd2l0Y2ggKHNpaC0+YnVzdHlwZSkgewotCWNhc2UgU0lfQlVTOgotCQkvKiBtYXAgbmV3IG9uZSAqLwotCQlpZiAoIXNpaS0+cmVnc1tjb3JlaWR4XSkgewotCQkJc2lpLT5yZWdzW2NvcmVpZHhdID0gUkVHX01BUChhZGRyLCBTSV9DT1JFX1NJWkUpOwotCQl9Ci0JCXNpaS0+Y3VybWFwID0gcmVncyA9IHNpaS0+cmVnc1tjb3JlaWR4XTsKLQkJaWYgKCFzaWktPndyYXBwZXJzW2NvcmVpZHhdKSB7Ci0JCQlzaWktPndyYXBwZXJzW2NvcmVpZHhdID0gUkVHX01BUCh3cmFwLCBTSV9DT1JFX1NJWkUpOwotCQl9Ci0JCXNpaS0+Y3Vyd3JhcCA9IHNpaS0+d3JhcHBlcnNbY29yZWlkeF07Ci0JCWJyZWFrOwotCi0JY2FzZSBQQ0lfQlVTOgotCQkvKiBwb2ludCBiYXIwIHdpbmRvdyAqLwotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+cGJ1cywgUENJX0JBUjBfV0lOLCBhZGRyKTsKLQkJcmVncyA9IHNpaS0+Y3VybWFwOwotCQkvKiBwb2ludCBiYXIwIDJuZCA0S0Igd2luZG93ICovCi0JCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc2lpLT5wYnVzLCBQQ0lfQkFSMF9XSU4yLCB3cmFwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNQSV9CVVM6Ci0JY2FzZSBTRElPX0JVUzoKLQkJc2lpLT5jdXJtYXAgPSByZWdzID0gKHZvaWQgKikodW5zaWduZWQgbG9uZylhZGRyOwotCQlzaWktPmN1cndyYXAgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXdyYXA7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmVncyA9IE5VTEw7Ci0JCWJyZWFrOwotCX0KLQotCXNpaS0+Y3VybWFwID0gcmVnczsKLQlzaWktPmN1cmlkeCA9IGNvcmVpZHg7Ci0KLQlyZXR1cm4gcmVnczsKLX0KLQotLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYWRkcmVzcyBzcGFjZXMgaW4gY3VycmVudCBjb3JlICovCi1pbnQgYWlfbnVtYWRkcnNwYWNlcyhzdHJ1Y3Qgc2lfcHViICpzaWgpCi17Ci0JcmV0dXJuIDI7Ci19Ci0KLS8qIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgbnRoIGFkZHJlc3Mgc3BhY2UgaW4gdGhlIGN1cnJlbnQgY29yZSAqLwotdTMyIGFpX2FkZHJzcGFjZShzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgYXNpZHgpCi17Ci0Jc3RydWN0IHNpX2luZm8gKnNpaTsKLQl1aW50IGNpZHg7Ci0KLQlzaWkgPSBTSV9JTkZPKHNpaCk7Ci0JY2lkeCA9IHNpaS0+Y3VyaWR4OwotCi0JaWYgKGFzaWR4ID09IDApCi0JCXJldHVybiBzaWktPmNvcmVzYmFbY2lkeF07Ci0JZWxzZSBpZiAoYXNpZHggPT0gMSkKLQkJcmV0dXJuIHNpaS0+Y29yZXNiYTJbY2lkeF07Ci0JZWxzZSB7Ci0JCVNJX0VSUk9SKCgiJXM6IE5lZWQgdG8gcGFyc2UgdGhlIGVyb20gYWdhaW4gdG8gZmluZCBhZGRyIHNwYWNlICVkXG4iLCBfX2Z1bmNfXywgYXNpZHgpKTsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi0vKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIG50aCBhZGRyZXNzIHNwYWNlIGluIHRoZSBjdXJyZW50IGNvcmUgKi8KLXUzMiBhaV9hZGRyc3BhY2VzaXplKHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCBhc2lkeCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCXVpbnQgY2lkeDsKLQotCXNpaSA9IFNJX0lORk8oc2loKTsKLQljaWR4ID0gc2lpLT5jdXJpZHg7Ci0KLQlpZiAoYXNpZHggPT0gMCkKLQkJcmV0dXJuIHNpaS0+Y29yZXNiYV9zaXplW2NpZHhdOwotCWVsc2UgaWYgKGFzaWR4ID09IDEpCi0JCXJldHVybiBzaWktPmNvcmVzYmEyX3NpemVbY2lkeF07Ci0JZWxzZSB7Ci0JCVNJX0VSUk9SKCgiJXM6IE5lZWQgdG8gcGFyc2UgdGhlIGVyb20gYWdhaW4gdG8gZmluZCBhZGRyIHNwYWNlICVkXG4iLCBfX2Z1bmNfXywgYXNpZHgpKTsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi11aW50IGFpX2ZsYWcoc3RydWN0IHNpX3B1YiAqc2loKQotewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0Jc3RydWN0IGFpZG1wICphaTsKLQotCXNpaSA9IFNJX0lORk8oc2loKTsKLQlpZiAoQkNNNDcxNjJfRE1QKCkpIHsKLQkJU0lfRVJST1IoKCIlczogQXR0ZW1wdGluZyB0byByZWFkIE1JUFMgRE1QIHJlZ2lzdGVycyBvbiA0NzE2MmEwIiwgX19mdW5jX18pKTsKLQkJcmV0dXJuIHNpaS0+Y3VyaWR4OwotCX0KLQlhaSA9IHNpaS0+Y3Vyd3JhcDsKLQotCXJldHVybiBSX1JFRygmYWktPm9vYnNlbG91dGEzMCkgJiAweDFmOwotfQotCi12b2lkIGFpX3NldGludChzdHJ1Y3Qgc2lfcHViICpzaWgsIGludCBzaWZsYWcpCi17Ci19Ci0KLXVpbnQgYWlfY29yZXZlbmRvcihzdHJ1Y3Qgc2lfcHViICpzaWgpCi17Ci0Jc3RydWN0IHNpX2luZm8gKnNpaTsKLQl1MzIgY2lhOwotCi0Jc2lpID0gU0lfSU5GTyhzaWgpOwotCWNpYSA9IHNpaS0+Y2lhW3NpaS0+Y3VyaWR4XTsKLQlyZXR1cm4gKGNpYSAmIENJQV9NRkdfTUFTSykgPj4gQ0lBX01GR19TSElGVDsKLX0KLQotdWludCBhaV9jb3JlcmV2KHN0cnVjdCBzaV9wdWIgKnNpaCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCXUzMiBjaWI7Ci0KLQlzaWkgPSBTSV9JTkZPKHNpaCk7Ci0JY2liID0gc2lpLT5jaWJbc2lpLT5jdXJpZHhdOwotCXJldHVybiAoY2liICYgQ0lCX1JFVl9NQVNLKSA+PiBDSUJfUkVWX1NISUZUOwotfQotCi1ib29sIGFpX2lzY29yZXVwKHN0cnVjdCBzaV9wdWIgKnNpaCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCXN0cnVjdCBhaWRtcCAqYWk7Ci0KLQlzaWkgPSBTSV9JTkZPKHNpaCk7Ci0JYWkgPSBzaWktPmN1cndyYXA7Ci0KLQlyZXR1cm4gKCgoUl9SRUcoJmFpLT5pb2N0cmwpICYgKFNJQ0ZfRkdDIHwgU0lDRl9DTE9DS19FTikpID09Ci0JCSBTSUNGX0NMT0NLX0VOKQotCQkmJiAoKFJfUkVHKCZhaS0+cmVzZXRjdHJsKSAmIEFJUkNfUkVTRVQpID09IDApKTsKLX0KLQotdm9pZCBhaV9jb3JlX2NmbGFnc193byhzdHJ1Y3Qgc2lfcHViICpzaWgsIHUzMiBtYXNrLCB1MzIgdmFsKQotewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0Jc3RydWN0IGFpZG1wICphaTsKLQl1MzIgdzsKLQotCXNpaSA9IFNJX0lORk8oc2loKTsKLQotCWlmIChCQ000NzE2Ml9ETVAoKSkgewotCQlTSV9FUlJPUigoIiVzOiBBY2Nlc3NpbmcgTUlQUyBETVAgcmVnaXN0ZXIgKGlvY3RybCkgb24gNDcxNjJhMCIsCi0JCQkgIF9fZnVuY19fKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlhaSA9IHNpaS0+Y3Vyd3JhcDsKLQotCWlmIChtYXNrIHx8IHZhbCkgewotCQl3ID0gKChSX1JFRygmYWktPmlvY3RybCkgJiB+bWFzaykgfCB2YWwpOwotCQlXX1JFRygmYWktPmlvY3RybCwgdyk7Ci0JfQotfQotCi11MzIgYWlfY29yZV9jZmxhZ3Moc3RydWN0IHNpX3B1YiAqc2loLCB1MzIgbWFzaywgdTMyIHZhbCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCXN0cnVjdCBhaWRtcCAqYWk7Ci0JdTMyIHc7Ci0KLQlzaWkgPSBTSV9JTkZPKHNpaCk7Ci0JaWYgKEJDTTQ3MTYyX0RNUCgpKSB7Ci0JCVNJX0VSUk9SKCgiJXM6IEFjY2Vzc2luZyBNSVBTIERNUCByZWdpc3RlciAoaW9jdHJsKSBvbiA0NzE2MmEwIiwKLQkJCSAgX19mdW5jX18pKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JYWkgPSBzaWktPmN1cndyYXA7Ci0KLQlpZiAobWFzayB8fCB2YWwpIHsKLQkJdyA9ICgoUl9SRUcoJmFpLT5pb2N0cmwpICYgfm1hc2spIHwgdmFsKTsKLQkJV19SRUcoJmFpLT5pb2N0cmwsIHcpOwotCX0KLQotCXJldHVybiBSX1JFRygmYWktPmlvY3RybCk7Ci19Ci0KLXUzMiBhaV9jb3JlX3NmbGFncyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHUzMiBtYXNrLCB1MzIgdmFsKQotewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0Jc3RydWN0IGFpZG1wICphaTsKLQl1MzIgdzsKLQotCXNpaSA9IFNJX0lORk8oc2loKTsKLQlpZiAoQkNNNDcxNjJfRE1QKCkpIHsKLQkJU0lfRVJST1IoKCIlczogQWNjZXNzaW5nIE1JUFMgRE1QIHJlZ2lzdGVyIChpb3N0YXR1cykgb24gNDcxNjJhMCIsIF9fZnVuY19fKSk7Ci0JCXJldHVybiAwOwotCX0KLQotCWFpID0gc2lpLT5jdXJ3cmFwOwotCi0JaWYgKG1hc2sgfHwgdmFsKSB7Ci0JCXcgPSAoKFJfUkVHKCZhaS0+aW9zdGF0dXMpICYgfm1hc2spIHwgdmFsKTsKLQkJV19SRUcoJmFpLT5pb3N0YXR1cywgdyk7Ci0JfQotCi0JcmV0dXJuIFJfUkVHKCZhaS0+aW9zdGF0dXMpOwotfQotCi0vKiAqKioqKioqKioqKioqKiogZnJvbSBzaXV0aWxzLmMgKioqKioqKioqKioqKiogKi8KLS8qIGxvY2FsIHByb3RvdHlwZXMgKi8KLXN0YXRpYyBzdHJ1Y3Qgc2lfaW5mbyAqYWlfZG9hdHRhY2goc3RydWN0IHNpX2luZm8gKnNpaSwgdm9pZCAqcmVncywKLQkJCSAgICAgIHVpbnQgYnVzdHlwZSwgdm9pZCAqc2RoLCBjaGFyICoqdmFycywKLQkJCSAgICAgIHVpbnQgKnZhcnN6KTsKLXN0YXRpYyBib29sIGFpX2J1c2NvcmVfcHJlcChzdHJ1Y3Qgc2lfaW5mbyAqc2lpLCB1aW50IGJ1c3R5cGUpOwotc3RhdGljIGJvb2wgYWlfYnVzY29yZV9zZXR1cChzdHJ1Y3Qgc2lfaW5mbyAqc2lpLCBjaGlwY3JlZ3NfdCAqY2MsIHVpbnQgYnVzdHlwZSwKLQkJCSAgICAgdTMyIHNhdmV3aW4sIHVpbnQgKm9yaWdpZHgsIHZvaWQgKnJlZ3MpOwotc3RhdGljIHZvaWQgYWlfbnZyYW1fcHJvY2VzcyhzdHJ1Y3Qgc2lfaW5mbyAqc2lpLCBjaGFyICpwdmFycyk7Ci0KLS8qIGRldiBwYXRoIGNvbmNhdGVuYXRpb24gdXRpbCAqLwotc3RhdGljIGNoYXIgKmFpX2RldnBhdGh2YXIoc3RydWN0IHNpX3B1YiAqc2loLCBjaGFyICp2YXIsIGludCBsZW4sCi0JCQkgICBjb25zdCBjaGFyICpuYW1lKTsKLXN0YXRpYyBib29sIF9haV9jbGtjdGxfY2Moc3RydWN0IHNpX2luZm8gKnNpaSwgdWludCBtb2RlKTsKLXN0YXRpYyBib29sIGFpX2lzcGNpZShzdHJ1Y3Qgc2lfaW5mbyAqc2lpKTsKLQotLyogZ2xvYmFsIHZhcmlhYmxlIHRvIGluZGljYXRlIHJlc2VydmF0aW9uL3JlbGVhc2Ugb2YgZ3BpbydzICovCi1zdGF0aWMgdTMyIGFpX2dwaW9yZXNlcnZhdGlvbjsKLQotLyoKLSAqIEFsbG9jYXRlIGEgc2kgaGFuZGxlLgotICogZGV2aWQgLSBwY2kgZGV2aWNlIGlkICh1c2VkIHRvIGRldGVybWluZSBjaGlwIykKLSAqIG9zaCAtIG9wYXF1ZSBPUyBoYW5kbGUKLSAqIHJlZ3MgLSB2aXJ0dWFsIGFkZHJlc3Mgb2YgaW5pdGlhbCBjb3JlIHJlZ2lzdGVycwotICogYnVzdHlwZSAtIHBjaS9zYi9zZGlvL2V0YwotICogdmFycyAtIHBvaW50ZXIgdG8gYSBwb2ludGVyIGFyZWEgZm9yICJlbnZpcm9ubWVudCIgdmFyaWFibGVzCi0gKiB2YXJzeiAtIHBvaW50ZXIgdG8gaW50IHRvIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgdmFycwotICovCi1zdHJ1Y3Qgc2lfcHViICphaV9hdHRhY2godm9pZCAqcmVncywgdWludCBidXN0eXBlLAotCQl2b2lkICpzZGgsIGNoYXIgKip2YXJzLCB1aW50ICp2YXJzeikKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCi0JLyogYWxsb2Mgc3RydWN0IHNpX2luZm8gKi8KLQlzaWkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2lfaW5mbyksIEdGUF9BVE9NSUMpOwotCWlmIChzaWkgPT0gTlVMTCkgewotCQlTSV9FUlJPUigoInNpX2F0dGFjaDogbWFsbG9jIGZhaWxlZCFcbiIpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKGFpX2RvYXR0YWNoKHNpaSwgcmVncywgYnVzdHlwZSwgc2RoLCB2YXJzLCB2YXJzeikgPT0KLQkgICAgTlVMTCkgewotCQlrZnJlZShzaWkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0Jc2lpLT52YXJzID0gdmFycyA/ICp2YXJzIDogTlVMTDsKLQlzaWktPnZhcnN6ID0gdmFyc3ogPyAqdmFyc3ogOiAwOwotCi0JcmV0dXJuIChzdHJ1Y3Qgc2lfcHViICopIHNpaTsKLX0KLQotLyogZ2xvYmFsIGtlcm5lbCByZXNvdXJjZSAqLwotc3RhdGljIHN0cnVjdCBzaV9pbmZvIGtzaWk7Ci0KLXN0YXRpYyBib29sIGFpX2J1c2NvcmVfcHJlcChzdHJ1Y3Qgc2lfaW5mbyAqc2lpLCB1aW50IGJ1c3R5cGUpCi17Ci0JLyoga2x1ZGdlIHRvIGVuYWJsZSB0aGUgY2xvY2sgb24gdGhlIDQzMDYgd2hpY2ggbGFja3MgYSBzbG93Y2xvY2sgKi8KLQlpZiAoYnVzdHlwZSA9PSBQQ0lfQlVTICYmICFhaV9pc3BjaWUoc2lpKSkKLQkJYWlfY2xrY3RsX3h0YWwoJnNpaS0+cHViLCBYVEFMIHwgUExMLCBPTik7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIGFpX2J1c2NvcmVfc2V0dXAoc3RydWN0IHNpX2luZm8gKnNpaSwgY2hpcGNyZWdzX3QgKmNjLCB1aW50IGJ1c3R5cGUsCi0JCQkgICAgIHUzMiBzYXZld2luLCB1aW50ICpvcmlnaWR4LCB2b2lkICpyZWdzKQotewotCWJvb2wgcGNpLCBwY2llOwotCXVpbnQgaTsKLQl1aW50IHBjaWlkeCwgcGNpZWlkeCwgcGNpcmV2LCBwY2llcmV2OwotCi0JY2MgPSBhaV9zZXRjb3JlaWR4KCZzaWktPnB1YiwgU0lfQ0NfSURYKTsKLQotCS8qIGdldCBjaGlwY29tbW9uIHJldiAqLwotCXNpaS0+cHViLmNjcmV2ID0gKGludClhaV9jb3JlcmV2KCZzaWktPnB1Yik7Ci0KLQkvKiBnZXQgY2hpcGNvbW1vbiBjaGlwc3RhdHVzICovCi0JaWYgKHNpaS0+cHViLmNjcmV2ID49IDExKQotCQlzaWktPnB1Yi5jaGlwc3QgPSBSX1JFRygmY2MtPmNoaXBzdGF0dXMpOwotCi0JLyogZ2V0IGNoaXBjb21tb24gY2FwYWJpbGl0ZXMgKi8KLQlzaWktPnB1Yi5jY2NhcHMgPSBSX1JFRygmY2MtPmNhcGFiaWxpdGllcyk7Ci0JLyogZ2V0IGNoaXBjb21tb24gZXh0ZW5kZWQgY2FwYWJpbGl0aWVzICovCi0KLQlpZiAoc2lpLT5wdWIuY2NyZXYgPj0gMzUpCi0JCXNpaS0+cHViLmNjY2Fwc19leHQgPSBSX1JFRygmY2MtPmNhcGFiaWxpdGllc19leHQpOwotCi0JLyogZ2V0IHBtdSByZXYgYW5kIGNhcHMgKi8KLQlpZiAoc2lpLT5wdWIuY2NjYXBzICYgQ0NfQ0FQX1BNVSkgewotCQlzaWktPnB1Yi5wbXVjYXBzID0gUl9SRUcoJmNjLT5wbXVjYXBhYmlsaXRpZXMpOwotCQlzaWktPnB1Yi5wbXVyZXYgPSBzaWktPnB1Yi5wbXVjYXBzICYgUENBUF9SRVZfTUFTSzsKLQl9Ci0KLQkvKiBmaWd1cmUgb3V0IGJ1cy9vcmlnbmFsIGNvcmUgaWR4ICovCi0Jc2lpLT5wdWIuYnVzY29yZXR5cGUgPSBOT0RFVl9DT1JFX0lEOwotCXNpaS0+cHViLmJ1c2NvcmVyZXYgPSBOT1JFVjsKLQlzaWktPnB1Yi5idXNjb3JlaWR4ID0gQkFESURYOwotCi0JcGNpID0gcGNpZSA9IGZhbHNlOwotCXBjaXJldiA9IHBjaWVyZXYgPSBOT1JFVjsKLQlwY2lpZHggPSBwY2llaWR4ID0gQkFESURYOwotCi0JZm9yIChpID0gMDsgaSA8IHNpaS0+bnVtY29yZXM7IGkrKykgewotCQl1aW50IGNpZCwgY3JldjsKLQotCQlhaV9zZXRjb3JlaWR4KCZzaWktPnB1YiwgaSk7Ci0JCWNpZCA9IGFpX2NvcmVpZCgmc2lpLT5wdWIpOwotCQljcmV2ID0gYWlfY29yZXJldigmc2lpLT5wdWIpOwotCi0JCS8qIERpc3BsYXkgY29yZXMgZm91bmQgKi8KLQkJU0lfVk1TRygoIkNPUkVbJWRdOiBpZCAweCV4IHJldiAlZCBiYXNlIDB4JXggcmVncyAweCVwXG4iLAotCQkJIGksIGNpZCwgY3Jldiwgc2lpLT5jb3Jlc2JhW2ldLCBzaWktPnJlZ3NbaV0pKTsKLQotCQlpZiAoYnVzdHlwZSA9PSBQQ0lfQlVTKSB7Ci0JCQlpZiAoY2lkID09IFBDSV9DT1JFX0lEKSB7Ci0JCQkJcGNpaWR4ID0gaTsKLQkJCQlwY2lyZXYgPSBjcmV2OwotCQkJCXBjaSA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKGNpZCA9PSBQQ0lFX0NPUkVfSUQpIHsKLQkJCQlwY2llaWR4ID0gaTsKLQkJCQlwY2llcmV2ID0gY3JldjsKLQkJCQlwY2llID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCS8qIGZpbmQgdGhlIGNvcmUgaWR4IGJlZm9yZSBlbnRlcmluZyB0aGlzIGZ1bmMuICovCi0JCWlmICgoc2F2ZXdpbiAmJiAoc2F2ZXdpbiA9PSBzaWktPmNvcmVzYmFbaV0pKSB8fAotCQkgICAgKHJlZ3MgPT0gc2lpLT5yZWdzW2ldKSkKLQkJCSpvcmlnaWR4ID0gaTsKLQl9Ci0KLQlpZiAocGNpICYmIHBjaWUpIHsKLQkJaWYgKGFpX2lzcGNpZShzaWkpKQotCQkJcGNpID0gZmFsc2U7Ci0JCWVsc2UKLQkJCXBjaWUgPSBmYWxzZTsKLQl9Ci0JaWYgKHBjaSkgewotCQlzaWktPnB1Yi5idXNjb3JldHlwZSA9IFBDSV9DT1JFX0lEOwotCQlzaWktPnB1Yi5idXNjb3JlcmV2ID0gcGNpcmV2OwotCQlzaWktPnB1Yi5idXNjb3JlaWR4ID0gcGNpaWR4OwotCX0gZWxzZSBpZiAocGNpZSkgewotCQlzaWktPnB1Yi5idXNjb3JldHlwZSA9IFBDSUVfQ09SRV9JRDsKLQkJc2lpLT5wdWIuYnVzY29yZXJldiA9IHBjaWVyZXY7Ci0JCXNpaS0+cHViLmJ1c2NvcmVpZHggPSBwY2llaWR4OwotCX0KLQotCVNJX1ZNU0coKCJCdXNjb3JlIGlkL3R5cGUvcmV2ICVkLzB4JXgvJWRcbiIsIHNpaS0+cHViLmJ1c2NvcmVpZHgsCi0JCSBzaWktPnB1Yi5idXNjb3JldHlwZSwgc2lpLT5wdWIuYnVzY29yZXJldikpOwotCi0JLyogZml4dXAgbmVjZXNzYXJ5IGNoaXAvY29yZSBjb25maWd1cmF0aW9ucyAqLwotCWlmIChzaWktPnB1Yi5idXN0eXBlID09IFBDSV9CVVMpIHsKLQkJaWYgKFNJX0ZBU1Qoc2lpKSkgewotCQkJaWYgKCFzaWktPnBjaCkgewotCQkJCXNpaS0+cGNoID0gKHZvaWQgKilwY2ljb3JlX2luaXQoCi0JCQkJCSZzaWktPnB1Yiwgc2lpLT5wYnVzLAotCQkJCQkodm9pZCAqKVBDSUVSRUdTKHNpaSkpOwotCQkJCWlmIChzaWktPnBjaCA9PSBOVUxMKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFpX3BjaV9maXhjZmcoJnNpaS0+cHViKSkgewotCQkJU0lfRVJST1IoKCJzaV9kb2F0dGFjaDogc2lfcGNpX2ZpeGNmZyBmYWlsZWRcbiIpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qIHJldHVybiB0byB0aGUgb3JpZ2luYWwgY29yZSAqLwotCWFpX3NldGNvcmVpZHgoJnNpaS0+cHViLCAqb3JpZ2lkeCk7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIF9fdXNlZCB2b2lkIGFpX252cmFtX3Byb2Nlc3Moc3RydWN0IHNpX2luZm8gKnNpaSwgY2hhciAqcHZhcnMpCi17Ci0JdWludCB3ID0gMDsKLQotCS8qIGdldCBib2FyZHR5cGUgYW5kIGJvYXJkcmV2ICovCi0Jc3dpdGNoIChzaWktPnB1Yi5idXN0eXBlKSB7Ci0JY2FzZSBQQ0lfQlVTOgotCQkvKiBkbyBhIHBjaSBjb25maWcgcmVhZCB0byBnZXQgc3Vic3lzdGVtIGlkIGFuZCBzdWJ2ZW5kb3IgaWQgKi8KLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNpaS0+cGJ1cywgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZ3KTsKLQkJLyogTGV0IG52cmFtIHZhcmlhYmxlcyBvdmVycmlkZSBzdWJzeXN0ZW0gVmVuZC9JRCAqLwotCQlzaWktPnB1Yi5ib2FyZHZlbmRvciA9ICh1MTYpYWlfZ2V0ZGV2cGF0aGludHZhcigmc2lpLT5wdWIsCi0JCQkiYm9hcmR2ZW5kb3IiKTsKLQkJaWYgKHNpaS0+cHViLmJvYXJkdmVuZG9yID09IDApCi0JCQlzaWktPnB1Yi5ib2FyZHZlbmRvciA9IHcgJiAweGZmZmY7Ci0JCWVsc2UKLQkJCVNJX0VSUk9SKCgiT3ZlcnJpZGluZyBib2FyZHZlbmRvcjogMHgleCBpbnN0ZWFkIG9mICIKLQkJCQkgICIweCV4XG4iLCBzaWktPnB1Yi5ib2FyZHZlbmRvciwgdyAmIDB4ZmZmZikpOwotCQlzaWktPnB1Yi5ib2FyZHR5cGUgPSAodTE2KWFpX2dldGRldnBhdGhpbnR2YXIoJnNpaS0+cHViLAotCQkJImJvYXJkdHlwZSIpOwotCQlpZiAoc2lpLT5wdWIuYm9hcmR0eXBlID09IDApCi0JCQlzaWktPnB1Yi5ib2FyZHR5cGUgPSAodyA+PiAxNikgJiAweGZmZmY7Ci0JCWVsc2UKLQkJCVNJX0VSUk9SKCgiT3ZlcnJpZGluZyBib2FyZHR5cGU6IDB4JXggaW5zdGVhZCBvZiAweCV4XG4iCi0JCQkJICAsIHNpaS0+cHViLmJvYXJkdHlwZSwgKHcgPj4gMTYpICYgMHhmZmZmKSk7Ci0JCWJyZWFrOwotCi0JCXNpaS0+cHViLmJvYXJkdmVuZG9yID0gZ2V0aW50dmFyKHB2YXJzLCAibWFuZmlkIik7Ci0JCXNpaS0+cHViLmJvYXJkdHlwZSA9IGdldGludHZhcihwdmFycywgInByb2RpZCIpOwotCQlicmVhazsKLQotCWNhc2UgU0lfQlVTOgotCWNhc2UgSlRBR19CVVM6Ci0JCXNpaS0+cHViLmJvYXJkdmVuZG9yID0gUENJX1ZFTkRPUl9JRF9CUk9BRENPTTsKLQkJc2lpLT5wdWIuYm9hcmR0eXBlID0gZ2V0aW50dmFyKHB2YXJzLCAicHJvZGlkIik7Ci0JCWlmIChwdmFycyA9PSBOVUxMIHx8IChzaWktPnB1Yi5ib2FyZHR5cGUgPT0gMCkpIHsKLQkJCXNpaS0+cHViLmJvYXJkdHlwZSA9IGdldGludHZhcihOVUxMLCAiYm9hcmR0eXBlIik7Ci0JCQlpZiAoc2lpLT5wdWIuYm9hcmR0eXBlID09IDApCi0JCQkJc2lpLT5wdWIuYm9hcmR0eXBlID0gMHhmZmZmOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCWlmIChzaWktPnB1Yi5ib2FyZHR5cGUgPT0gMCkgewotCQlTSV9FUlJPUigoInNpX2RvYXR0YWNoOiB1bmtub3duIGJvYXJkIHR5cGVcbiIpKTsKLQl9Ci0KLQlzaWktPnB1Yi5ib2FyZGZsYWdzID0gZ2V0aW50dmFyKHB2YXJzLCAiYm9hcmRmbGFncyIpOwotfQotCi1zdGF0aWMgc3RydWN0IHNpX2luZm8gKmFpX2RvYXR0YWNoKHN0cnVjdCBzaV9pbmZvICpzaWksCi0JCQkgICAgICB2b2lkICpyZWdzLCB1aW50IGJ1c3R5cGUsIHZvaWQgKnBidXMsCi0JCQkgICAgICBjaGFyICoqdmFycywgdWludCAqdmFyc3opCi17Ci0Jc3RydWN0IHNpX3B1YiAqc2loID0gJnNpaS0+cHViOwotCXUzMiB3LCBzYXZld2luOwotCWNoaXBjcmVnc190ICpjYzsKLQljaGFyICpwdmFycyA9IE5VTEw7Ci0JdWludCBzb2NpdHlwZTsKLQl1aW50IG9yaWdpZHg7Ci0KLQltZW1zZXQoKHVuc2lnbmVkIGNoYXIgKikgc2lpLCAwLCBzaXplb2Yoc3RydWN0IHNpX2luZm8pKTsKLQotCXNhdmV3aW4gPSAwOwotCi0Jc2loLT5idXNjb3JlaWR4ID0gQkFESURYOwotCi0Jc2lpLT5jdXJtYXAgPSByZWdzOwotCXNpaS0+cGJ1cyA9IHBidXM7Ci0KLQkvKiBjaGVjayB0byBzZWUgaWYgd2UgYXJlIGEgc2kgY29yZSBtaW1pYydpbmcgYSBwY2kgY29yZSAqLwotCWlmIChidXN0eXBlID09IFBDSV9CVVMpIHsKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNpaS0+cGJ1cywgUENJX1NQUk9NX0NPTlRST0wsICAmdyk7Ci0JCWlmICh3ID09IDB4ZmZmZmZmZmYpIHsKLQkJCVNJX0VSUk9SKCgiJXM6IGluY29taW5nIGJ1cyBpcyBQQ0kgYnV0IGl0J3MgYSBsaWUsICIKLQkJCQkiIHN3aXRjaGluZyB0byBTSSBkZXZpZDoweCV4XG4iLAotCQkJCV9fZnVuY19fLCBkZXZpZCkpOwotCQkJYnVzdHlwZSA9IFNJX0JVUzsKLQkJfQotCX0KLQotCS8qIGZpbmQgQ2hpcGNvbW1vbiBhZGRyZXNzICovCi0JaWYgKGJ1c3R5cGUgPT0gUENJX0JVUykgewotCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2lpLT5wYnVzLCBQQ0lfQkFSMF9XSU4sICZzYXZld2luKTsKLQkJaWYgKCFHT09EQ09SRUFERFIoc2F2ZXdpbiwgU0lfRU5VTV9CQVNFKSkKLQkJCXNhdmV3aW4gPSBTSV9FTlVNX0JBU0U7Ci0JCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc2lpLT5wYnVzLCBQQ0lfQkFSMF9XSU4sCi0JCQkJICAgICAgIFNJX0VOVU1fQkFTRSk7Ci0JCWNjID0gKGNoaXBjcmVnc190ICopIHJlZ3M7Ci0JfSBlbHNlIHsKLQkJY2MgPSAoY2hpcGNyZWdzX3QgKikgUkVHX01BUChTSV9FTlVNX0JBU0UsIFNJX0NPUkVfU0laRSk7Ci0JfQotCi0Jc2loLT5idXN0eXBlID0gYnVzdHlwZTsKLQotCS8qIGJ1cy9jb3JlL2NsayBzZXR1cCBmb3IgcmVnaXN0ZXIgYWNjZXNzICovCi0JaWYgKCFhaV9idXNjb3JlX3ByZXAoc2lpLCBidXN0eXBlKSkgewotCQlTSV9FUlJPUigoInNpX2RvYXR0YWNoOiBzaV9jb3JlX2Nsa19wcmVwIGZhaWxlZCAlZFxuIiwKLQkJCSAgYnVzdHlwZSkpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKgotCSAqIENoaXBJRCByZWNvZ25pdGlvbi4KLQkgKiAgIFdlIGFzc3VtZSB3ZSBjYW4gcmVhZCBjaGlwaWQgYXQgb2Zmc2V0IDAgZnJvbSB0aGUgcmVncyBhcmcuCi0JICogICBJZiB3ZSBhZGQgb3RoZXIgY2hpcHR5cGVzIChvciBpZiB3ZSBuZWVkIHRvIHN1cHBvcnQgb2xkIHNkaW8KLQkgKiAgIGhvc3RzIHcvbyBjaGlwY29tbW9uKSwgc29tZSB3YXkgb2YgcmVjb2duaXppbmcgdGhlbSBuZWVkcyB0bwotCSAqICAgYmUgYWRkZWQgaGVyZS4KLQkgKi8KLQl3ID0gUl9SRUcoJmNjLT5jaGlwaWQpOwotCXNvY2l0eXBlID0gKHcgJiBDSURfVFlQRV9NQVNLKSA+PiBDSURfVFlQRV9TSElGVDsKLQkvKiBNaWdodCBhcyB3bGwgZmlsbCBpbiBjaGlwIGlkIHJldiAmIHBrZyAqLwotCXNpaC0+Y2hpcCA9IHcgJiBDSURfSURfTUFTSzsKLQlzaWgtPmNoaXByZXYgPSAodyAmIENJRF9SRVZfTUFTSykgPj4gQ0lEX1JFVl9TSElGVDsKLQlzaWgtPmNoaXBwa2cgPSAodyAmIENJRF9QS0dfTUFTSykgPj4gQ0lEX1BLR19TSElGVDsKLQotCXNpaC0+aXNzaW0gPSBJU19TSU0oc2loLT5jaGlwcGtnKTsKLQotCS8qIHNjYW4gZm9yIGNvcmVzICovCi0JaWYgKHNvY2l0eXBlID09IFNPQ0lfQUkpIHsKLQkJU0lfTVNHKCgiRm91bmQgY2hpcCB0eXBlIEFJICgweCUwOHgpXG4iLCB3KSk7Ci0JCS8qIHBhc3MgY2hpcGMgYWRkcmVzcyBpbnN0ZWFkIG9mIG9yaWdpbmFsIGNvcmUgYmFzZSAqLwotCQlhaV9zY2FuKCZzaWktPnB1YiwgKHZvaWQgKiljYyk7Ci0JfSBlbHNlIHsKLQkJU0lfRVJST1IoKCJGb3VuZCBjaGlwIG9mIHVua25vd24gdHlwZSAoMHglMDh4KVxuIiwgdykpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogbm8gY29yZXMgZm91bmQsIGJhaWwgb3V0ICovCi0JaWYgKHNpaS0+bnVtY29yZXMgPT0gMCkgewotCQlTSV9FUlJPUigoInNpX2RvYXR0YWNoOiBjb3VsZCBub3QgZmluZCBhbnkgY29yZXNcbiIpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCS8qIGJ1cy9jb3JlL2NsayBzZXR1cCAqLwotCW9yaWdpZHggPSBTSV9DQ19JRFg7Ci0JaWYgKCFhaV9idXNjb3JlX3NldHVwKHNpaSwgY2MsIGJ1c3R5cGUsIHNhdmV3aW4sICZvcmlnaWR4LCByZWdzKSkgewotCQlTSV9FUlJPUigoInNpX2RvYXR0YWNoOiBzaV9idXNjb3JlX3NldHVwIGZhaWxlZFxuIikpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogSW5pdCBudnJhbSBmcm9tIHNwcm9tL290cCBpZiB0aGV5IGV4aXN0ICovCi0JaWYgKHNyb21fdmFyX2luaXQKLQkgICAgKCZzaWktPnB1YiwgYnVzdHlwZSwgcmVncywgdmFycywgdmFyc3opKSB7Ci0JCVNJX0VSUk9SKCgic2lfZG9hdHRhY2g6IHNyb21fdmFyX2luaXQgZmFpbGVkOiBiYWQgc3JvbVxuIikpOwotCQlnb3RvIGV4aXQ7Ci0JfQotCXB2YXJzID0gdmFycyA/ICp2YXJzIDogTlVMTDsKLQlhaV9udnJhbV9wcm9jZXNzKHNpaSwgcHZhcnMpOwotCi0JLyogPT09IE5WUkFNLCBjbG9jayBpcyByZWFkeSA9PT0gKi8KLQljYyA9IChjaGlwY3JlZ3NfdCAqKSBhaV9zZXRjb3JlKHNpaCwgQ0NfQ09SRV9JRCwgMCk7Ci0JV19SRUcoJmNjLT5ncGlvcHVsbHVwLCAwKTsKLQlXX1JFRygmY2MtPmdwaW9wdWxsZG93biwgMCk7Ci0JYWlfc2V0Y29yZWlkeChzaWgsIG9yaWdpZHgpOwotCi0JLyogUE1VIHNwZWNpZmljIGluaXRpYWxpemF0aW9ucyAqLwotCWlmIChQTVVDVExfRU5BQihzaWgpKSB7Ci0JCXUzMiB4dGFsZnJlcTsKLQkJc2lfcG11X2luaXQoc2loKTsKLQkJc2lfcG11X2NoaXBfaW5pdChzaWgpOwotCQl4dGFsZnJlcSA9IGdldGludHZhcihwdmFycywgInh0YWxmcmVxIik7Ci0JCS8qIElmIHh0YWxmcmVxIHZhciBub3QgYXZhaWxhYmxlLCB0cnkgdG8gbWVhc3VyZSBpdCAqLwotCQlpZiAoeHRhbGZyZXEgPT0gMCkKLQkJCXh0YWxmcmVxID0gc2lfcG11X21lYXN1cmVfYWxwY2xrKHNpaCk7Ci0JCXNpX3BtdV9wbGxfaW5pdChzaWgsIHh0YWxmcmVxKTsKLQkJc2lfcG11X3Jlc19pbml0KHNpaCk7Ci0JCXNpX3BtdV9zd3JlZ19pbml0KHNpaCk7Ci0JfQotCi0JLyogc2V0dXAgdGhlIEdQSU8gYmFzZWQgTEVEIHBvd2Vyc2F2ZSByZWdpc3RlciAqLwotCXcgPSBnZXRpbnR2YXIocHZhcnMsICJsZWRkYyIpOwotCWlmICh3ID09IDApCi0JCXcgPSBERUZBVUxUX0dQSU9USU1FUlZBTDsKLQlhaV9jb3JlcmVnKHNpaCwgU0lfQ0NfSURYLCBvZmZzZXRvZihjaGlwY3JlZ3NfdCwgZ3Bpb3RpbWVydmFsKSwgfjAsIHcpOwotCi0JaWYgKFBDSUUoc2lpKSkgewotCQlwY2ljb3JlX2F0dGFjaChzaWktPnBjaCwgcHZhcnMsIFNJX0RPQVRUQUNIKTsKLQl9Ci0KLQlpZiAoc2loLT5jaGlwID09IEJDTTQzMjI0X0NISVBfSUQpIHsKLQkJLyoKLQkJICogZW5hYmxlIDEyIG1BIGRyaXZlIHN0cmVudGggZm9yIDQzMjI0IGFuZAotCQkgKiBzZXQgY2hpcENvbnRyb2wgcmVnaXN0ZXIgYml0IDE1Ci0JCSAqLwotCQlpZiAoc2loLT5jaGlwcmV2ID09IDApIHsKLQkJCVNJX01TRygoIkFwcGx5aW5nIDQzMjI0QTAgV0FSc1xuIikpOwotCQkJYWlfY29yZXJlZyhzaWgsIFNJX0NDX0lEWCwKLQkJCQkgICBvZmZzZXRvZihjaGlwY3JlZ3NfdCwgY2hpcGNvbnRyb2wpLAotCQkJCSAgIENDVFJMNDMyMjRfR1BJT19UT0dHTEUsCi0JCQkJICAgQ0NUUkw0MzIyNF9HUElPX1RPR0dMRSk7Ci0JCQlzaV9wbXVfY2hpcGNvbnRyb2woc2loLCAwLCBDQ1RSTF80MzIyNEEwXzEyTUFfTEVEX0RSSVZFLAotCQkJCQkgICBDQ1RSTF80MzIyNEEwXzEyTUFfTEVEX0RSSVZFKTsKLQkJfQotCQlpZiAoc2loLT5jaGlwcmV2ID49IDEpIHsKLQkJCVNJX01TRygoIkFwcGx5aW5nIDQzMjI0QjArIFdBUnNcbiIpKTsKLQkJCXNpX3BtdV9jaGlwY29udHJvbChzaWgsIDAsIENDVFJMXzQzMjI0QjBfMTJNQV9MRURfRFJJVkUsCi0JCQkJCSAgIENDVFJMXzQzMjI0QjBfMTJNQV9MRURfRFJJVkUpOwotCQl9Ci0JfQotCi0JaWYgKHNpaC0+Y2hpcCA9PSBCQ000MzEzX0NISVBfSUQpIHsKLQkJLyoKLQkJICogZW5hYmxlIDEyIG1BIGRyaXZlIHN0cmVudGggZm9yIDQzMTMgYW5kCi0JCSAqIHNldCBjaGlwQ29udHJvbCByZWdpc3RlciBiaXQgMQotCQkgKi8KLQkJU0lfTVNHKCgiQXBwbHlpbmcgNDMxMyBXQVJzXG4iKSk7Ci0JCXNpX3BtdV9jaGlwY29udHJvbChzaWgsIDAsIENDVFJMXzQzMTNfMTJNQV9MRURfRFJJVkUsCi0JCQkJICAgQ0NUUkxfNDMxM18xMk1BX0xFRF9EUklWRSk7Ci0JfQotCi0JcmV0dXJuIHNpaTsKLSBleGl0OgotCWlmIChzaWgtPmJ1c3R5cGUgPT0gUENJX0JVUykgewotCQlpZiAoc2lpLT5wY2gpCi0JCQlwY2ljb3JlX2RlaW5pdChzaWktPnBjaCk7Ci0JCXNpaS0+cGNoID0gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyogbWF5IGJlIGNhbGxlZCB3aXRoIGNvcmUgaW4gcmVzZXQgKi8KLXZvaWQgYWlfZGV0YWNoKHN0cnVjdCBzaV9wdWIgKnNpaCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCXVpbnQgaWR4OwotCi0Jc3RydWN0IHNpX3B1YiAqc2lfbG9jYWwgPSBOVUxMOwotCW1lbWNweSgmc2lfbG9jYWwsICZzaWgsIHNpemVvZihzdHJ1Y3Qgc2lfcHViICoqKSk7Ci0KLQlzaWkgPSBTSV9JTkZPKHNpaCk7Ci0KLQlpZiAoc2lpID09IE5VTEwpCi0JCXJldHVybjsKLQotCWlmIChzaWgtPmJ1c3R5cGUgPT0gU0lfQlVTKQotCQlmb3IgKGlkeCA9IDA7IGlkeCA8IFNJX01BWENPUkVTOyBpZHgrKykKLQkJCWlmIChzaWktPnJlZ3NbaWR4XSkgewotCQkJCWlvdW5tYXAoc2lpLT5yZWdzW2lkeF0pOwotCQkJCXNpaS0+cmVnc1tpZHhdID0gTlVMTDsKLQkJCX0KLQotCWlmIChzaWgtPmJ1c3R5cGUgPT0gUENJX0JVUykgewotCQlpZiAoc2lpLT5wY2gpCi0JCQlwY2ljb3JlX2RlaW5pdChzaWktPnBjaCk7Ci0JCXNpaS0+cGNoID0gTlVMTDsKLQl9Ci0KLQlpZiAoc2lpICE9ICZrc2lpKQotCQlrZnJlZShzaWkpOwotfQotCi0vKiByZWdpc3RlciBkcml2ZXIgaW50ZXJydXB0IGRpc2FibGluZyBhbmQgcmVzdG9yaW5nIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLwotdm9pZAotYWlfcmVnaXN0ZXJfaW50cl9jYWxsYmFjayhzdHJ1Y3Qgc2lfcHViICpzaWgsIHZvaWQgKmludHJzb2ZmX2ZuLAotCQkJICB2b2lkICppbnRyc3Jlc3RvcmVfZm4sCi0JCQkgIHZvaWQgKmludHJzZW5hYmxlZF9mbiwgdm9pZCAqaW50cl9hcmcpCi17Ci0Jc3RydWN0IHNpX2luZm8gKnNpaTsKLQotCXNpaSA9IFNJX0lORk8oc2loKTsKLQlzaWktPmludHJfYXJnID0gaW50cl9hcmc7Ci0Jc2lpLT5pbnRyc29mZl9mbiA9IChzaV9pbnRyc29mZl90KSBpbnRyc29mZl9mbjsKLQlzaWktPmludHJzcmVzdG9yZV9mbiA9IChzaV9pbnRyc3Jlc3RvcmVfdCkgaW50cnNyZXN0b3JlX2ZuOwotCXNpaS0+aW50cnNlbmFibGVkX2ZuID0gKHNpX2ludHJzZW5hYmxlZF90KSBpbnRyc2VuYWJsZWRfZm47Ci0JLyogc2F2ZSBjdXJyZW50IGNvcmUgaWQuICB3aGVuIHRoaXMgZnVuY3Rpb24gY2FsbGVkLCB0aGUgY3VycmVudCBjb3JlCi0JICogbXVzdCBiZSB0aGUgY29yZSB3aGljaCBwcm92aWRlcyBkcml2ZXIgZnVuY3Rpb25zKGlsLCBldCwgd2wsIGV0Yy4pCi0JICovCi0Jc2lpLT5kZXZfY29yZWlkID0gc2lpLT5jb3JlaWRbc2lpLT5jdXJpZHhdOwotfQotCi12b2lkIGFpX2RlcmVnaXN0ZXJfaW50cl9jYWxsYmFjayhzdHJ1Y3Qgc2lfcHViICpzaWgpCi17Ci0Jc3RydWN0IHNpX2luZm8gKnNpaTsKLQotCXNpaSA9IFNJX0lORk8oc2loKTsKLQlzaWktPmludHJzb2ZmX2ZuID0gTlVMTDsKLX0KLQotdWludCBhaV9jb3JlaWQoc3RydWN0IHNpX3B1YiAqc2loKQotewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0KLQlzaWkgPSBTSV9JTkZPKHNpaCk7Ci0JcmV0dXJuIHNpaS0+Y29yZWlkW3NpaS0+Y3VyaWR4XTsKLX0KLQotdWludCBhaV9jb3JlaWR4KHN0cnVjdCBzaV9wdWIgKnNpaCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCi0Jc2lpID0gU0lfSU5GTyhzaWgpOwotCXJldHVybiBzaWktPmN1cmlkeDsKLX0KLQotYm9vbCBhaV9iYWNrcGxhbmU2NChzdHJ1Y3Qgc2lfcHViICpzaWgpCi17Ci0JcmV0dXJuIChzaWgtPmNjY2FwcyAmIENDX0NBUF9CS1BMTjY0KSAhPSAwOwotfQotCi0vKiByZXR1cm4gaW5kZXggb2YgY29yZWlkIG9yIEJBRElEWCBpZiBub3QgZm91bmQgKi8KLXVpbnQgYWlfZmluZGNvcmVpZHgoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGNvcmVpZCwgdWludCBjb3JldW5pdCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCXVpbnQgZm91bmQ7Ci0JdWludCBpOwotCi0Jc2lpID0gU0lfSU5GTyhzaWgpOwotCi0JZm91bmQgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IHNpaS0+bnVtY29yZXM7IGkrKykKLQkJaWYgKHNpaS0+Y29yZWlkW2ldID09IGNvcmVpZCkgewotCQkJaWYgKGZvdW5kID09IGNvcmV1bml0KQotCQkJCXJldHVybiBpOwotCQkJZm91bmQrKzsKLQkJfQotCi0JcmV0dXJuIEJBRElEWDsKLX0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyBsb2dpY2FsICJmb2N1cyIgdG8gdGhlIGluZGljYXRlZCBjb3JlOwotICogbXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIG9mZi4KLSAqIE1vcmVvdmVyLCBjYWxsZXJzIHNob3VsZCBrZWVwIGludGVycnVwdHMgb2ZmIGR1cmluZyBzd2l0Y2hpbmcKLSAqIG91dCBvZiBhbmQgYmFjayB0byBkMTEgY29yZS4KLSAqLwotdm9pZCAqYWlfc2V0Y29yZShzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgY29yZWlkLCB1aW50IGNvcmV1bml0KQotewotCXVpbnQgaWR4OwotCi0JaWR4ID0gYWlfZmluZGNvcmVpZHgoc2loLCBjb3JlaWQsIGNvcmV1bml0KTsKLQlpZiAoIUdPT0RJRFgoaWR4KSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gYWlfc2V0Y29yZWlkeChzaWgsIGlkeCk7Ci19Ci0KLS8qIFR1cm4gb2ZmIGludGVycnVwdCBhcyByZXF1aXJlZCBieSBhaV9zZXRjb3JlLCBiZWZvcmUgc3dpdGNoIGNvcmUgKi8KLXZvaWQgKmFpX3N3aXRjaF9jb3JlKHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCBjb3JlaWQsIHVpbnQgKm9yaWdpZHgsCi0JCSAgICAgdWludCAqaW50cl92YWwpCi17Ci0Jdm9pZCAqY2M7Ci0Jc3RydWN0IHNpX2luZm8gKnNpaTsKLQotCXNpaSA9IFNJX0lORk8oc2loKTsKLQotCWlmIChTSV9GQVNUKHNpaSkpIHsKLQkJLyogT3ZlcmxvYWRpbmcgdGhlIG9yaWdpZHggdmFyaWFibGUgdG8gcmVtZW1iZXIgdGhlIGNvcmVpZCwKLQkJICogdGhpcyB3b3JrcyBiZWNhdXNlIHRoZSBjb3JlIGlkcyBjYW5ub3QgYmUgY29uZnVzZWQgd2l0aAotCQkgKiBjb3JlIGluZGljZXMuCi0JCSAqLwotCQkqb3JpZ2lkeCA9IGNvcmVpZDsKLQkJaWYgKGNvcmVpZCA9PSBDQ19DT1JFX0lEKQotCQkJcmV0dXJuICh2b2lkICopQ0NSRUdTX0ZBU1Qoc2lpKTsKLQkJZWxzZSBpZiAoY29yZWlkID09IHNpaC0+YnVzY29yZXR5cGUpCi0JCQlyZXR1cm4gKHZvaWQgKilQQ0lFUkVHUyhzaWkpOwotCX0KLQlJTlRSX09GRihzaWksICppbnRyX3ZhbCk7Ci0JKm9yaWdpZHggPSBzaWktPmN1cmlkeDsKLQljYyA9IGFpX3NldGNvcmUoc2loLCBjb3JlaWQsIDApOwotCXJldHVybiBjYzsKLX0KLQotLyogcmVzdG9yZSBjb3JlaWR4IGFuZCByZXN0b3JlIGludGVycnVwdCAqLwotdm9pZCBhaV9yZXN0b3JlX2NvcmUoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGNvcmVpZCwgdWludCBpbnRyX3ZhbCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCi0Jc2lpID0gU0lfSU5GTyhzaWgpOwotCWlmIChTSV9GQVNUKHNpaSkKLQkgICAgJiYgKChjb3JlaWQgPT0gQ0NfQ09SRV9JRCkgfHwgKGNvcmVpZCA9PSBzaWgtPmJ1c2NvcmV0eXBlKSkpCi0JCXJldHVybjsKLQotCWFpX3NldGNvcmVpZHgoc2loLCBjb3JlaWQpOwotCUlOVFJfUkVTVE9SRShzaWksIGludHJfdmFsKTsKLX0KLQotdm9pZCBhaV93cml0ZV93cmFwcGVycmVnKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTMyIG9mZnNldCwgdTMyIHZhbCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpID0gU0lfSU5GTyhzaWgpOwotCXUzMiAqdyA9ICh1MzIgKikgc2lpLT5jdXJ3cmFwOwotCVdfUkVHKHcgKyAob2Zmc2V0IC8gNCksIHZhbCk7Ci0JcmV0dXJuOwotfQotCi0vKgotICogU3dpdGNoIHRvICdjb3JlaWR4JywgaXNzdWUgYSBzaW5nbGUgYXJiaXRyYXJ5IDMyYml0IHJlZ2lzdGVyIG1hc2smc2V0Ci0gKiBvcGVyYXRpb24sIHN3aXRjaCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjb3JlLCBhbmQgcmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0gKgotICogV2hlbiB1c2luZyB0aGUgc2lsaWNvbiBiYWNrcGxhbmUsIG5vIGZpZGRsaW5nIHdpdGggaW50ZXJydXB0cyBvciBjb3JlCi0gKiBzd2l0Y2hlcyBpcyBuZWVkZWQuCi0gKgotICogQWxzbywgd2hlbiB1c2luZyBwY2kvcGNpZSwgd2UgY2FuIG9wdGltaXplIGF3YXkgdGhlIGNvcmUgc3dpdGNoaW5nIGZvciBwY2kKLSAqIHJlZ2lzdGVycyBhbmQgKG9uIG5ld2VyIHBjaSBjb3JlcykgY2hpcGNvbW1vbiByZWdpc3RlcnMuCi0gKi8KLXVpbnQgYWlfY29yZXJlZyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgY29yZWlkeCwgdWludCByZWdvZmYsIHVpbnQgbWFzaywKLQkJdWludCB2YWwpCi17Ci0JdWludCBvcmlnaWR4ID0gMDsKLQl1MzIgKnIgPSBOVUxMOwotCXVpbnQgdzsKLQl1aW50IGludHJfdmFsID0gMDsKLQlib29sIGZhc3QgPSBmYWxzZTsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCi0Jc2lpID0gU0lfSU5GTyhzaWgpOwotCi0JaWYgKGNvcmVpZHggPj0gU0lfTUFYQ09SRVMpCi0JCXJldHVybiAwOwotCi0JaWYgKHNpaC0+YnVzdHlwZSA9PSBTSV9CVVMpIHsKLQkJLyogSWYgaW50ZXJuYWwgYnVzLCB3ZSBjYW4gYWx3YXlzIGdldCBhdCBldmVyeXRoaW5nICovCi0JCWZhc3QgPSB0cnVlOwotCQkvKiBtYXAgaWYgZG9lcyBub3QgZXhpc3QgKi8KLQkJaWYgKCFzaWktPnJlZ3NbY29yZWlkeF0pIHsKLQkJCXNpaS0+cmVnc1tjb3JlaWR4XSA9IFJFR19NQVAoc2lpLT5jb3Jlc2JhW2NvcmVpZHhdLAotCQkJCQkJICAgICBTSV9DT1JFX1NJWkUpOwotCQl9Ci0JCXIgPSAodTMyICopICgodW5zaWduZWQgY2hhciAqKSBzaWktPnJlZ3NbY29yZWlkeF0gKyByZWdvZmYpOwotCX0gZWxzZSBpZiAoc2loLT5idXN0eXBlID09IFBDSV9CVVMpIHsKLQkJLyoKLQkJICogSWYgcGNpL3BjaWUsIHdlIGNhbiBnZXQgYXQgcGNpL3BjaWUgcmVncwotCQkgKiBhbmQgb24gbmV3ZXIgY29yZXMgdG8gY2hpcGMKLQkJICovCi0JCWlmICgoc2lpLT5jb3JlaWRbY29yZWlkeF0gPT0gQ0NfQ09SRV9JRCkgJiYgU0lfRkFTVChzaWkpKSB7Ci0JCQkvKiBDaGlwYyByZWdpc3RlcnMgYXJlIG1hcHBlZCBhdCAxMktCICovCi0KLQkJCWZhc3QgPSB0cnVlOwotCQkJciA9ICh1MzIgKikgKChjaGFyICopc2lpLT5jdXJtYXAgKwotCQkJCQlQQ0lfMTZLQjBfQ0NSRUdTX09GRlNFVCArIHJlZ29mZik7Ci0JCX0gZWxzZSBpZiAoc2lpLT5wdWIuYnVzY29yZWlkeCA9PSBjb3JlaWR4KSB7Ci0JCQkvKgotCQkJICogcGNpIHJlZ2lzdGVycyBhcmUgYXQgZWl0aGVyIGluIHRoZSBsYXN0IDJLQiBvZgotCQkJICogYW4gOEtCIHdpbmRvdyBvciwgaW4gcGNpZSBhbmQgcGNpIHJldiAxMyBhdCA4S0IKLQkJCSAqLwotCQkJZmFzdCA9IHRydWU7Ci0JCQlpZiAoU0lfRkFTVChzaWkpKQotCQkJCXIgPSAodTMyICopICgoY2hhciAqKXNpaS0+Y3VybWFwICsKLQkJCQkJCVBDSV8xNktCMF9QQ0lSRUdTX09GRlNFVCArCi0JCQkJCQlyZWdvZmYpOwotCQkJZWxzZQotCQkJCXIgPSAodTMyICopICgoY2hhciAqKXNpaS0+Y3VybWFwICsKLQkJCQkJCSgocmVnb2ZmID49IFNCQ09ORklHT0ZGKSA/Ci0JCQkJCQkgUENJX0JBUjBfUENJU0JSX09GRlNFVCA6Ci0JCQkJCQkgUENJX0JBUjBfUENJUkVHU19PRkZTRVQpICsKLQkJCQkJCXJlZ29mZik7Ci0JCX0KLQl9Ci0KLQlpZiAoIWZhc3QpIHsKLQkJSU5UUl9PRkYoc2lpLCBpbnRyX3ZhbCk7Ci0KLQkJLyogc2F2ZSBjdXJyZW50IGNvcmUgaW5kZXggKi8KLQkJb3JpZ2lkeCA9IGFpX2NvcmVpZHgoJnNpaS0+cHViKTsKLQotCQkvKiBzd2l0Y2ggY29yZSAqLwotCQlyID0gKHUzMiAqKSAoKHVuc2lnbmVkIGNoYXIgKikgYWlfc2V0Y29yZWlkeCgmc2lpLT5wdWIsIGNvcmVpZHgpCi0JCQkJKyByZWdvZmYpOwotCX0KLQotCS8qIG1hc2sgYW5kIHNldCAqLwotCWlmIChtYXNrIHx8IHZhbCkgewotCQl3ID0gKFJfUkVHKHIpICYgfm1hc2spIHwgdmFsOwotCQlXX1JFRyhyLCB3KTsKLQl9Ci0KLQkvKiByZWFkYmFjayAqLwotCXcgPSBSX1JFRyhyKTsKLQotCWlmICghZmFzdCkgewotCQkvKiByZXN0b3JlIGNvcmUgaW5kZXggKi8KLQkJaWYgKG9yaWdpZHggIT0gY29yZWlkeCkKLQkJCWFpX3NldGNvcmVpZHgoJnNpaS0+cHViLCBvcmlnaWR4KTsKLQotCQlJTlRSX1JFU1RPUkUoc2lpLCBpbnRyX3ZhbCk7Ci0JfQotCi0JcmV0dXJuIHc7Ci19Ci0KLXZvaWQgYWlfY29yZV9kaXNhYmxlKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTMyIGJpdHMpCi17Ci0Jc3RydWN0IHNpX2luZm8gKnNpaTsKLQl1MzIgZHVtbXk7Ci0Jc3RydWN0IGFpZG1wICphaTsKLQotCXNpaSA9IFNJX0lORk8oc2loKTsKLQotCWFpID0gc2lpLT5jdXJ3cmFwOwotCi0JLyogaWYgY29yZSBpcyBhbHJlYWR5IGluIHJlc2V0LCBqdXN0IHJldHVybiAqLwotCWlmIChSX1JFRygmYWktPnJlc2V0Y3RybCkgJiBBSVJDX1JFU0VUKQotCQlyZXR1cm47Ci0KLQlXX1JFRygmYWktPmlvY3RybCwgYml0cyk7Ci0JZHVtbXkgPSBSX1JFRygmYWktPmlvY3RybCk7Ci0JdWRlbGF5KDEwKTsKLQotCVdfUkVHKCZhaS0+cmVzZXRjdHJsLCBBSVJDX1JFU0VUKTsKLQl1ZGVsYXkoMSk7Ci19Ci0KLS8qIHJlc2V0IGFuZCByZS1lbmFibGUgYSBjb3JlCi0gKiBpbnB1dHM6Ci0gKiBiaXRzIC0gY29yZSBzcGVjaWZpYyBiaXRzIHRoYXQgYXJlIHNldCBkdXJpbmcgYW5kIGFmdGVyIHJlc2V0IHNlcXVlbmNlCi0gKiByZXNldGJpdHMgLSBjb3JlIHNwZWNpZmljIGJpdHMgdGhhdCBhcmUgc2V0IG9ubHkgZHVyaW5nIHJlc2V0IHNlcXVlbmNlCi0gKi8KLXZvaWQgYWlfY29yZV9yZXNldChzdHJ1Y3Qgc2lfcHViICpzaWgsIHUzMiBiaXRzLCB1MzIgcmVzZXRiaXRzKQotewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0Jc3RydWN0IGFpZG1wICphaTsKLQl1MzIgZHVtbXk7Ci0KLQlzaWkgPSBTSV9JTkZPKHNpaCk7Ci0JYWkgPSBzaWktPmN1cndyYXA7Ci0KLQkvKgotCSAqIE11c3QgZG8gdGhlIGRpc2FibGUgc2VxdWVuY2UgZmlyc3QgdG8gd29yawotCSAqIGZvciBhcmJpdHJhcnkgY3VycmVudCBjb3JlIHN0YXRlLgotCSAqLwotCWFpX2NvcmVfZGlzYWJsZShzaWgsIChiaXRzIHwgcmVzZXRiaXRzKSk7Ci0KLQkvKgotCSAqIE5vdyBkbyB0aGUgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UuCi0JICovCi0JV19SRUcoJmFpLT5pb2N0cmwsIChiaXRzIHwgU0lDRl9GR0MgfCBTSUNGX0NMT0NLX0VOKSk7Ci0JZHVtbXkgPSBSX1JFRygmYWktPmlvY3RybCk7Ci0JV19SRUcoJmFpLT5yZXNldGN0cmwsIDApOwotCXVkZWxheSgxKTsKLQotCVdfUkVHKCZhaS0+aW9jdHJsLCAoYml0cyB8IFNJQ0ZfQ0xPQ0tfRU4pKTsKLQlkdW1teSA9IFJfUkVHKCZhaS0+aW9jdHJsKTsKLQl1ZGVsYXkoMSk7Ci19Ci0KLS8qIHJldHVybiB0aGUgc2xvdyBjbG9jayBzb3VyY2UgLSBMUE8sIFhUQUwsIG9yIFBDSSAqLwotc3RhdGljIHVpbnQgYWlfc2xvd2Nsa19zcmMoc3RydWN0IHNpX2luZm8gKnNpaSkKLXsKLQljaGlwY3JlZ3NfdCAqY2M7Ci0JdTMyIHZhbDsKLQotCWlmIChzaWktPnB1Yi5jY3JldiA8IDYpIHsKLQkJaWYgKHNpaS0+cHViLmJ1c3R5cGUgPT0gUENJX0JVUykgewotCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNpaS0+cGJ1cywgUENJX0dQSU9fT1VULAotCQkJCQkgICAgICAmdmFsKTsKLQkJCWlmICh2YWwgJiBQQ0lfQ0ZHX0dQSU9fU0NTKQotCQkJCXJldHVybiBTQ0NfU1NfUENJOwotCQl9Ci0JCXJldHVybiBTQ0NfU1NfWFRBTDsKLQl9IGVsc2UgaWYgKHNpaS0+cHViLmNjcmV2IDwgMTApIHsKLQkJY2MgPSAoY2hpcGNyZWdzX3QgKikgYWlfc2V0Y29yZWlkeCgmc2lpLT5wdWIsIHNpaS0+Y3VyaWR4KTsKLQkJcmV0dXJuIFJfUkVHKCZjYy0+c2xvd19jbGtfY3RsKSAmIFNDQ19TU19NQVNLOwotCX0gZWxzZQkJCS8qIEluc3RhLWNsb2NrICovCi0JCXJldHVybiBTQ0NfU1NfWFRBTDsKLX0KLQotLyoKLSogcmV0dXJuIHRoZSBJTFAgKHNsb3djbG9jaykgbWluIG9yIG1heCBmcmVxdWVuY3kKLSogcHJlY29uZGl0aW9uOiB3ZSd2ZSBlc3RhYmxpc2hlZCB0aGUgY2hpcCBoYXMgZHluYW1pYyBjbGsgY29udHJvbAotKi8KLXN0YXRpYyB1aW50IGFpX3Nsb3djbGtfZnJlcShzdHJ1Y3Qgc2lfaW5mbyAqc2lpLCBib29sIG1heF9mcmVxLCBjaGlwY3JlZ3NfdCAqY2MpCi17Ci0JdTMyIHNsb3djbGs7Ci0JdWludCBkaXY7Ci0KLQlzbG93Y2xrID0gYWlfc2xvd2Nsa19zcmMoc2lpKTsKLQlpZiAoc2lpLT5wdWIuY2NyZXYgPCA2KSB7Ci0JCWlmIChzbG93Y2xrID09IFNDQ19TU19QQ0kpCi0JCQlyZXR1cm4gbWF4X2ZyZXEgPyAoUENJTUFYRlJFUSAvIDY0KQotCQkJCTogKFBDSU1JTkZSRVEgLyA2NCk7Ci0JCWVsc2UKLQkJCXJldHVybiBtYXhfZnJlcSA/IChYVEFMTUFYRlJFUSAvIDMyKQotCQkJCTogKFhUQUxNSU5GUkVRIC8gMzIpOwotCX0gZWxzZSBpZiAoc2lpLT5wdWIuY2NyZXYgPCAxMCkgewotCQlkaXYgPSA0ICoKLQkJICAgICgoKFJfUkVHKCZjYy0+c2xvd19jbGtfY3RsKSAmIFNDQ19DRF9NQVNLKSA+PgotCQkgICAgICBTQ0NfQ0RfU0hJRlQpICsgMSk7Ci0JCWlmIChzbG93Y2xrID09IFNDQ19TU19MUE8pCi0JCQlyZXR1cm4gbWF4X2ZyZXEgPyBMUE9NQVhGUkVRIDogTFBPTUlORlJFUTsKLQkJZWxzZSBpZiAoc2xvd2NsayA9PSBTQ0NfU1NfWFRBTCkKLQkJCXJldHVybiBtYXhfZnJlcSA/IChYVEFMTUFYRlJFUSAvIGRpdikKLQkJCQk6IChYVEFMTUlORlJFUSAvIGRpdik7Ci0JCWVsc2UgaWYgKHNsb3djbGsgPT0gU0NDX1NTX1BDSSkKLQkJCXJldHVybiBtYXhfZnJlcSA/IChQQ0lNQVhGUkVRIC8gZGl2KQotCQkJCTogKFBDSU1JTkZSRVEgLyBkaXYpOwotCX0gZWxzZSB7Ci0JCS8qIENoaXBjIHJldiAxMCBpcyBJbnN0YUNsb2NrICovCi0JCWRpdiA9IFJfUkVHKCZjYy0+c3lzdGVtX2Nsa19jdGwpID4+IFNZQ0NfQ0RfU0hJRlQ7Ci0JCWRpdiA9IDQgKiAoZGl2ICsgMSk7Ci0JCXJldHVybiBtYXhfZnJlcSA/IFhUQUxNQVhGUkVRIDogKFhUQUxNSU5GUkVRIC8gZGl2KTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGFpX2Nsa2N0bF9zZXRkZWxheShzdHJ1Y3Qgc2lfaW5mbyAqc2lpLCB2b2lkICpjaGlwY3JlZ3MpCi17Ci0JY2hpcGNyZWdzX3QgKmNjID0gKGNoaXBjcmVnc190ICopIGNoaXBjcmVnczsKLQl1aW50IHNsb3dtYXhmcmVxLCBwbGxfZGVsYXksIHNsb3djbGs7Ci0JdWludCBwbGxfb25fZGVsYXksIGZyZWZfc2VsX2RlbGF5OwotCi0JcGxsX2RlbGF5ID0gUExMX0RFTEFZOwotCi0JLyoKLQkgKiBJZiB0aGUgc2xvdyBjbG9jayBpcyBub3Qgc291cmNlZCBieSB0aGUgeHRhbCB0aGVuCi0JICogYWRkIHRoZSB4dGFsX29uX2RlbGF5IHNpbmNlIHRoZSB4dGFsIHdpbGwgYWxzbyBiZQotCSAqIHBvd2VyZWQgZG93biBieSBkeW5hbWljIGNsayBjb250cm9sIGxvZ2ljLgotCSAqLwotCi0Jc2xvd2NsayA9IGFpX3Nsb3djbGtfc3JjKHNpaSk7Ci0JaWYgKHNsb3djbGsgIT0gU0NDX1NTX1hUQUwpCi0JCXBsbF9kZWxheSArPSBYVEFMX09OX0RFTEFZOwotCi0JLyogU3RhcnRpbmcgd2l0aCA0MzE4IGl0IGlzIElMUCB0aGF0IGlzIHVzZWQgZm9yIHRoZSBkZWxheXMgKi8KLQlzbG93bWF4ZnJlcSA9Ci0JICAgIGFpX3Nsb3djbGtfZnJlcShzaWksIChzaWktPnB1Yi5jY3JldiA+PSAxMCkgPyBmYWxzZSA6IHRydWUsIGNjKTsKLQotCXBsbF9vbl9kZWxheSA9ICgoc2xvd21heGZyZXEgKiBwbGxfZGVsYXkpICsgOTk5OTk5KSAvIDEwMDAwMDA7Ci0JZnJlZl9zZWxfZGVsYXkgPSAoKHNsb3dtYXhmcmVxICogRlJFRl9ERUxBWSkgKyA5OTk5OTkpIC8gMTAwMDAwMDsKLQotCVdfUkVHKCZjYy0+cGxsX29uX2RlbGF5LCBwbGxfb25fZGVsYXkpOwotCVdfUkVHKCZjYy0+ZnJlZl9zZWxfZGVsYXksIGZyZWZfc2VsX2RlbGF5KTsKLX0KLQotLyogaW5pdGlhbGl6ZSBwb3dlciBjb250cm9sIGRlbGF5IHJlZ2lzdGVycyAqLwotdm9pZCBhaV9jbGtjdGxfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgpCi17Ci0Jc3RydWN0IHNpX2luZm8gKnNpaTsKLQl1aW50IG9yaWdpZHggPSAwOwotCWNoaXBjcmVnc190ICpjYzsKLQlib29sIGZhc3Q7Ci0KLQlpZiAoIUNDQ1RMX0VOQUIoc2loKSkKLQkJcmV0dXJuOwotCi0Jc2lpID0gU0lfSU5GTyhzaWgpOwotCWZhc3QgPSBTSV9GQVNUKHNpaSk7Ci0JaWYgKCFmYXN0KSB7Ci0JCW9yaWdpZHggPSBzaWktPmN1cmlkeDsKLQkJY2MgPSAoY2hpcGNyZWdzX3QgKikgYWlfc2V0Y29yZShzaWgsIENDX0NPUkVfSUQsIDApOwotCQlpZiAoY2MgPT0gTlVMTCkKLQkJCXJldHVybjsKLQl9IGVsc2UgewotCQljYyA9IChjaGlwY3JlZ3NfdCAqKSBDQ1JFR1NfRkFTVChzaWkpOwotCQlpZiAoY2MgPT0gTlVMTCkKLQkJCXJldHVybjsKLQl9Ci0KLQkvKiBzZXQgYWxsIEluc3RhY2xrIGNoaXAgSUxQIHRvIDEgTUh6ICovCi0JaWYgKHNpaC0+Y2NyZXYgPj0gMTApCi0JCVNFVF9SRUcoJmNjLT5zeXN0ZW1fY2xrX2N0bCwgU1lDQ19DRF9NQVNLLAotCQkJKElMUF9ESVZfMU1IWiA8PCBTWUNDX0NEX1NISUZUKSk7Ci0KLQlhaV9jbGtjdGxfc2V0ZGVsYXkoc2lpLCAodm9pZCAqKWNjKTsKLQotCWlmICghZmFzdCkKLQkJYWlfc2V0Y29yZWlkeChzaWgsIG9yaWdpZHgpOwotfQotCi0vKgotICogcmV0dXJuIHRoZSB2YWx1ZSBzdWl0YWJsZSBmb3Igd3JpdGluZyB0byB0aGUKLSAqIGRvdDExIGNvcmUgRkFTVF9QV1JVUF9ERUxBWSByZWdpc3RlcgotICovCi11MTYgYWlfY2xrY3RsX2Zhc3RfcHdydXBfZGVsYXkoc3RydWN0IHNpX3B1YiAqc2loKQotewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0JdWludCBvcmlnaWR4ID0gMDsKLQljaGlwY3JlZ3NfdCAqY2M7Ci0JdWludCBzbG93bWluZnJlcTsKLQl1MTYgZnBkZWxheTsKLQl1aW50IGludHJfdmFsID0gMDsKLQlib29sIGZhc3Q7Ci0KLQlzaWkgPSBTSV9JTkZPKHNpaCk7Ci0JaWYgKFBNVUNUTF9FTkFCKHNpaCkpIHsKLQkJSU5UUl9PRkYoc2lpLCBpbnRyX3ZhbCk7Ci0JCWZwZGVsYXkgPSBzaV9wbXVfZmFzdF9wd3J1cF9kZWxheShzaWgpOwotCQlJTlRSX1JFU1RPUkUoc2lpLCBpbnRyX3ZhbCk7Ci0JCXJldHVybiBmcGRlbGF5OwotCX0KLQotCWlmICghQ0NDVExfRU5BQihzaWgpKQotCQlyZXR1cm4gMDsKLQotCWZhc3QgPSBTSV9GQVNUKHNpaSk7Ci0JZnBkZWxheSA9IDA7Ci0JaWYgKCFmYXN0KSB7Ci0JCW9yaWdpZHggPSBzaWktPmN1cmlkeDsKLQkJSU5UUl9PRkYoc2lpLCBpbnRyX3ZhbCk7Ci0JCWNjID0gKGNoaXBjcmVnc190ICopIGFpX3NldGNvcmUoc2loLCBDQ19DT1JFX0lELCAwKTsKLQkJaWYgKGNjID09IE5VTEwpCi0JCQlnb3RvIGRvbmU7Ci0JfSBlbHNlIHsKLQkJY2MgPSAoY2hpcGNyZWdzX3QgKikgQ0NSRUdTX0ZBU1Qoc2lpKTsKLQkJaWYgKGNjID09IE5VTEwpCi0JCQlnb3RvIGRvbmU7Ci0JfQotCi0Jc2xvd21pbmZyZXEgPSBhaV9zbG93Y2xrX2ZyZXEoc2lpLCBmYWxzZSwgY2MpOwotCWZwZGVsYXkgPSAoKChSX1JFRygmY2MtPnBsbF9vbl9kZWxheSkgKyAyKSAqIDEwMDAwMDApICsKLQkJICAgKHNsb3dtaW5mcmVxIC0gMSkpIC8gc2xvd21pbmZyZXE7Ci0KLSBkb25lOgotCWlmICghZmFzdCkgewotCQlhaV9zZXRjb3JlaWR4KHNpaCwgb3JpZ2lkeCk7Ci0JCUlOVFJfUkVTVE9SRShzaWksIGludHJfdmFsKTsKLQl9Ci0JcmV0dXJuIGZwZGVsYXk7Ci19Ci0KLS8qIHR1cm4gcHJpbWFyeSB4dGFsIGFuZC9vciBwbGwgb2ZmL29uICovCi1pbnQgYWlfY2xrY3RsX3h0YWwoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IHdoYXQsIGJvb2wgb24pCi17Ci0Jc3RydWN0IHNpX2luZm8gKnNpaTsKLQl1MzIgaW4sIG91dCwgb3V0ZW47Ci0KLQlzaWkgPSBTSV9JTkZPKHNpaCk7Ci0KLQlzd2l0Y2ggKHNpaC0+YnVzdHlwZSkgewotCi0JY2FzZSBQQ0lfQlVTOgotCQkvKiBwY2llIGNvcmUgZG9lc24ndCBoYXZlIGFueSBtYXBwaW5nIHRvIGNvbnRyb2wgdGhlIHh0YWwgcHUgKi8KLQkJaWYgKFBDSUUoc2lpKSkKLQkJCXJldHVybiAtMTsKLQotCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2lpLT5wYnVzLCBQQ0lfR1BJT19JTiwgJmluKTsKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNpaS0+cGJ1cywgUENJX0dQSU9fT1VULCAmb3V0KTsKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNpaS0+cGJ1cywgUENJX0dQSU9fT1VURU4sICZvdXRlbik7Ci0KLQkJLyoKLQkJICogQXZvaWQgZ2xpdGNoaW5nIHRoZSBjbG9jayBpZiBHUFJTIGlzIGFscmVhZHkgdXNpbmcgaXQuCi0JCSAqIFdlIGNhbid0IGFjdHVhbGx5IHJlYWQgdGhlIHN0YXRlIG9mIHRoZSBQTExQRCBzbyB3ZSBpbmZlciBpdAotCQkgKiBieSB0aGUgdmFsdWUgb2YgWFRBTF9QVSB3aGljaCAqaXMqIHJlYWRhYmxlIHZpYSBncGlvaW4uCi0JCSAqLwotCQlpZiAob24gJiYgKGluICYgUENJX0NGR19HUElPX1hUQUwpKQotCQkJcmV0dXJuIDA7Ci0KLQkJaWYgKHdoYXQgJiBYVEFMKQotCQkJb3V0ZW4gfD0gUENJX0NGR19HUElPX1hUQUw7Ci0JCWlmICh3aGF0ICYgUExMKQotCQkJb3V0ZW4gfD0gUENJX0NGR19HUElPX1BMTDsKLQotCQlpZiAob24pIHsKLQkJCS8qIHR1cm4gcHJpbWFyeSB4dGFsIG9uICovCi0JCQlpZiAod2hhdCAmIFhUQUwpIHsKLQkJCQlvdXQgfD0gUENJX0NGR19HUElPX1hUQUw7Ci0JCQkJaWYgKHdoYXQgJiBQTEwpCi0JCQkJCW91dCB8PSBQQ0lfQ0ZHX0dQSU9fUExMOwotCQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc2lpLT5wYnVzLAotCQkJCQkJICAgICAgIFBDSV9HUElPX09VVCwgb3V0KTsKLQkJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+cGJ1cywKLQkJCQkJCSAgICAgICBQQ0lfR1BJT19PVVRFTiwgb3V0ZW4pOwotCQkJCXVkZWxheShYVEFMX09OX0RFTEFZKTsKLQkJCX0KLQotCQkJLyogdHVybiBwbGwgb24gKi8KLQkJCWlmICh3aGF0ICYgUExMKSB7Ci0JCQkJb3V0ICY9IH5QQ0lfQ0ZHX0dQSU9fUExMOwotCQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc2lpLT5wYnVzLAotCQkJCQkJICAgICAgIFBDSV9HUElPX09VVCwgb3V0KTsKLQkJCQltZGVsYXkoMik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAod2hhdCAmIFhUQUwpCi0JCQkJb3V0ICY9IH5QQ0lfQ0ZHX0dQSU9fWFRBTDsKLQkJCWlmICh3aGF0ICYgUExMKQotCQkJCW91dCB8PSBQQ0lfQ0ZHX0dQSU9fUExMOwotCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPnBidXMsCi0JCQkJCSAgICAgICBQQ0lfR1BJT19PVVQsIG91dCk7Ci0JCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+cGJ1cywKLQkJCQkJICAgICAgIFBDSV9HUElPX09VVEVOLCBvdXRlbik7Ci0JCX0KLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqICBjbG9jayBjb250cm9sIHBvbGljeSBmdW5jdGlvbiB0aHJvdWdodCBjaGlwY29tbW9uCi0gKgotICogICAgc2V0IGR5bmFtaWMgY2xrIGNvbnRyb2wgbW9kZSAoZm9yY2VzbG93LCBmb3JjZWZhc3QsIGR5bmFtaWMpCi0gKiAgICByZXR1cm5zIHRydWUgaWYgd2UgYXJlIGZvcmNpbmcgZmFzdCBjbG9jawotICogICAgdGhpcyBpcyBhIHdyYXBwZXIgb3ZlciB0aGUgbmV4dCBpbnRlcm5hbCBmdW5jdGlvbgotICogICAgICB0byBhbGxvdyBmbGV4aWJsZSBwb2xpY3kgc2V0dGluZ3MgZm9yIG91dHNpZGUgY2FsbGVyCi0gKi8KLWJvb2wgYWlfY2xrY3RsX2NjKHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCBtb2RlKQotewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0KLQlzaWkgPSBTSV9JTkZPKHNpaCk7Ci0KLQkvKiBjaGlwY29tbW9uIGNvcmVzIHByaW9yIHRvIHJldjYgZG9uJ3Qgc3VwcG9ydCBkeW5hbWljIGNsb2NrIGNvbnRyb2wgKi8KLQlpZiAoc2loLT5jY3JldiA8IDYpCi0JCXJldHVybiBmYWxzZTsKLQotCWlmIChQQ0lfRk9SQ0VIVChzaWkpKQotCQlyZXR1cm4gbW9kZSA9PSBDTEtfRkFTVDsKLQotCXJldHVybiBfYWlfY2xrY3RsX2NjKHNpaSwgbW9kZSk7Ci19Ci0KLS8qIGNsayBjb250cm9sIG1lY2hhbmlzbSB0aHJvdWdoIGNoaXBjb21tb24sIG5vIHBvbGljeSBjaGVja2luZyAqLwotc3RhdGljIGJvb2wgX2FpX2Nsa2N0bF9jYyhzdHJ1Y3Qgc2lfaW5mbyAqc2lpLCB1aW50IG1vZGUpCi17Ci0JdWludCBvcmlnaWR4ID0gMDsKLQljaGlwY3JlZ3NfdCAqY2M7Ci0JdTMyIHNjYzsKLQl1aW50IGludHJfdmFsID0gMDsKLQlib29sIGZhc3QgPSBTSV9GQVNUKHNpaSk7Ci0KLQkvKiBjaGlwY29tbW9uIGNvcmVzIHByaW9yIHRvIHJldjYgZG9uJ3Qgc3VwcG9ydCBkeW5hbWljIGNsb2NrIGNvbnRyb2wgKi8KLQlpZiAoc2lpLT5wdWIuY2NyZXYgPCA2KQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlpZiAoIWZhc3QpIHsKLQkJSU5UUl9PRkYoc2lpLCBpbnRyX3ZhbCk7Ci0JCW9yaWdpZHggPSBzaWktPmN1cmlkeDsKLQotCQlpZiAoKHNpaS0+cHViLmJ1c3R5cGUgPT0gU0lfQlVTKSAmJgotCQkgICAgYWlfc2V0Y29yZSgmc2lpLT5wdWIsIE1JUFMzM19DT1JFX0lELCAwKSAmJgotCQkgICAgKGFpX2NvcmVyZXYoJnNpaS0+cHViKSA8PSA3KSAmJiAoc2lpLT5wdWIuY2NyZXYgPj0gMTApKQotCQkJZ290byBkb25lOwotCi0JCWNjID0gKGNoaXBjcmVnc190ICopIGFpX3NldGNvcmUoJnNpaS0+cHViLCBDQ19DT1JFX0lELCAwKTsKLQl9IGVsc2UgewotCQljYyA9IChjaGlwY3JlZ3NfdCAqKSBDQ1JFR1NfRkFTVChzaWkpOwotCQlpZiAoY2MgPT0gTlVMTCkKLQkJCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoIUNDQ1RMX0VOQUIoJnNpaS0+cHViKSAmJiAoc2lpLT5wdWIuY2NyZXYgPCAyMCkpCi0JCWdvdG8gZG9uZTsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgQ0xLX0ZBU1Q6CQkvKiBGT1JDRUhULCBmYXN0IChwbGwpIGNsb2NrICovCi0JCWlmIChzaWktPnB1Yi5jY3JldiA8IDEwKSB7Ci0JCQkvKgotCQkJICogZG9uJ3QgZm9yZ2V0IHRvIGZvcmNlIHh0YWwgYmFjawotCQkJICogb24gYmVmb3JlIHdlIGNsZWFyIFNDQ19EWU5fWFRBTC4uCi0JCQkgKi8KLQkJCWFpX2Nsa2N0bF94dGFsKCZzaWktPnB1YiwgWFRBTCwgT04pOwotCQkJU0VUX1JFRygmY2MtPnNsb3dfY2xrX2N0bCwKLQkJCQkoU0NDX1hDIHwgU0NDX0ZTIHwgU0NDX0lQKSwgU0NDX0lQKTsKLQkJfSBlbHNlIGlmIChzaWktPnB1Yi5jY3JldiA8IDIwKSB7Ci0JCQlPUl9SRUcoJmNjLT5zeXN0ZW1fY2xrX2N0bCwgU1lDQ19IUik7Ci0JCX0gZWxzZSB7Ci0JCQlPUl9SRUcoJmNjLT5jbGtfY3RsX3N0LCBDQ1NfRk9SQ0VIVCk7Ci0JCX0KLQotCQkvKiB3YWl0IGZvciB0aGUgUExMICovCi0JCWlmIChQTVVDVExfRU5BQigmc2lpLT5wdWIpKSB7Ci0JCQl1MzIgaHRhdmFpbCA9IENDU19IVEFWQUlMOwotCQkJU1BJTldBSVQoKChSX1JFRygmY2MtPmNsa19jdGxfc3QpICYgaHRhdmFpbCkKLQkJCQkgID09IDApLCBQTVVfTUFYX1RSQU5TSVRJT05fRExZKTsKLQkJfSBlbHNlIHsKLQkJCXVkZWxheShQTExfREVMQVkpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBDTEtfRFlOQU1JQzoJLyogZW5hYmxlIGR5bmFtaWMgY2xvY2sgY29udHJvbCAqLwotCQlpZiAoc2lpLT5wdWIuY2NyZXYgPCAxMCkgewotCQkJc2NjID0gUl9SRUcoJmNjLT5zbG93X2Nsa19jdGwpOwotCQkJc2NjICY9IH4oU0NDX0ZTIHwgU0NDX0lQIHwgU0NDX1hDKTsKLQkJCWlmICgoc2NjICYgU0NDX1NTX01BU0spICE9IFNDQ19TU19YVEFMKQotCQkJCXNjYyB8PSBTQ0NfWEM7Ci0JCQlXX1JFRygmY2MtPnNsb3dfY2xrX2N0bCwgc2NjKTsKLQotCQkJLyoKLQkJCSAqIGZvciBkeW5hbWljIGNvbnRyb2wsIHdlIGhhdmUgdG8KLQkJCSAqIHJlbGVhc2Ugb3VyIHh0YWxfcHUgImZvcmNlIG9uIgotCQkJICovCi0JCQlpZiAoc2NjICYgU0NDX1hDKQotCQkJCWFpX2Nsa2N0bF94dGFsKCZzaWktPnB1YiwgWFRBTCwgT0ZGKTsKLQkJfSBlbHNlIGlmIChzaWktPnB1Yi5jY3JldiA8IDIwKSB7Ci0JCQkvKiBJbnN0YWNsb2NrICovCi0JCQlBTkRfUkVHKCZjYy0+c3lzdGVtX2Nsa19jdGwsIH5TWUNDX0hSKTsKLQkJfSBlbHNlIHsKLQkJCUFORF9SRUcoJmNjLT5jbGtfY3RsX3N0LCB+Q0NTX0ZPUkNFSFQpOwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0gZG9uZToKLQlpZiAoIWZhc3QpIHsKLQkJYWlfc2V0Y29yZWlkeCgmc2lpLT5wdWIsIG9yaWdpZHgpOwotCQlJTlRSX1JFU1RPUkUoc2lpLCBpbnRyX3ZhbCk7Ci0JfQotCXJldHVybiBtb2RlID09IENMS19GQVNUOwotfQotCi0vKiBCdWlsZCBkZXZpY2UgcGF0aC4gU3VwcG9ydCBTSSwgUENJLCBhbmQgSlRBRyBmb3Igbm93LiAqLwotaW50IGFpX2RldnBhdGgoc3RydWN0IHNpX3B1YiAqc2loLCBjaGFyICpwYXRoLCBpbnQgc2l6ZSkKLXsKLQlpbnQgc2xlbjsKLQotCWlmICghcGF0aCB8fCBzaXplIDw9IDApCi0JCXJldHVybiAtMTsKLQotCXN3aXRjaCAoc2loLT5idXN0eXBlKSB7Ci0JY2FzZSBTSV9CVVM6Ci0JY2FzZSBKVEFHX0JVUzoKLQkJc2xlbiA9IHNucHJpbnRmKHBhdGgsIChzaXplX3QpIHNpemUsICJzYi8ldS8iLCBhaV9jb3JlaWR4KHNpaCkpOwotCQlicmVhazsKLQljYXNlIFBDSV9CVVM6Ci0JCXNsZW4gPSBzbnByaW50ZihwYXRoLCAoc2l6ZV90KSBzaXplLCAicGNpLyV1LyV1LyIsCi0JCQkoKHN0cnVjdCBwY2lfZGV2ICopKChTSV9JTkZPKHNpaCkpLT5wYnVzKSktPmJ1cy0+bnVtYmVyLAotCQkJUENJX1NMT1QoCi0JCQkgICAgKChzdHJ1Y3QgcGNpX2RldiAqKSgoU0lfSU5GTyhzaWgpKS0+cGJ1cykpLT5kZXZmbikpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXNsZW4gPSAtMTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHNsZW4gPCAwIHx8IHNsZW4gPj0gc2l6ZSkgewotCQlwYXRoWzBdID0gJ1wwJzsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBHZXQgYSB2YXJpYWJsZSwgYnV0IG9ubHkgaWYgaXQgaGFzIGEgZGV2cGF0aCBwcmVmaXggKi8KLWNoYXIgKmFpX2dldGRldnBhdGh2YXIoc3RydWN0IHNpX3B1YiAqc2loLCBjb25zdCBjaGFyICpuYW1lKQotewotCWNoYXIgdmFybmFtZVtTSV9ERVZQQVRIX0JVRlNaICsgMzJdOwotCi0JYWlfZGV2cGF0aHZhcihzaWgsIHZhcm5hbWUsIHNpemVvZih2YXJuYW1lKSwgbmFtZSk7Ci0KLQlyZXR1cm4gZ2V0dmFyKE5VTEwsIHZhcm5hbWUpOwotfQotCi0vKiBHZXQgYSB2YXJpYWJsZSwgYnV0IG9ubHkgaWYgaXQgaGFzIGEgZGV2cGF0aCBwcmVmaXggKi8KLWludCBhaV9nZXRkZXZwYXRoaW50dmFyKHN0cnVjdCBzaV9wdWIgKnNpaCwgY29uc3QgY2hhciAqbmFtZSkKLXsKLSNpZiBkZWZpbmVkKEJDTUJVU1RZUEUpICYmIChCQ01CVVNUWVBFID09IFNJX0JVUykKLQlyZXR1cm4gZ2V0aW50dmFyKE5VTEwsIG5hbWUpOwotI2Vsc2UKLQljaGFyIHZhcm5hbWVbU0lfREVWUEFUSF9CVUZTWiArIDMyXTsKLQotCWFpX2RldnBhdGh2YXIoc2loLCB2YXJuYW1lLCBzaXplb2YodmFybmFtZSksIG5hbWUpOwotCi0JcmV0dXJuIGdldGludHZhcihOVUxMLCB2YXJuYW1lKTsKLSNlbmRpZgotfQotCi1jaGFyICphaV9nZXRudnJhbWZsdmFyKHN0cnVjdCBzaV9wdWIgKnNpaCwgY29uc3QgY2hhciAqbmFtZSkKLXsKLQlyZXR1cm4gZ2V0dmFyKE5VTEwsIG5hbWUpOwotfQotCi0vKiBDb25jYXRlbmF0ZSB0aGUgZGV2IHBhdGggd2l0aCBhIHZhcm5hbWUgaW50byB0aGUgZ2l2ZW4gJ3ZhcicgYnVmZmVyCi0gKiBhbmQgcmV0dXJuIHRoZSAndmFyJyBwb2ludGVyLiBOb3RoaW5nIGlzIGRvbmUgdG8gdGhlIGFyZ3VtZW50cyBpZgotICogbGVuID09IDAgb3IgdmFyIGlzIE5VTEwsIHZhciBpcyBzdGlsbCByZXR1cm5lZC4gT24gb3ZlcmZsb3csIHRoZQotICogZmlyc3QgY2hhciB3aWxsIGJlIHNldCB0byAnXDAnLgotICovCi1zdGF0aWMgY2hhciAqYWlfZGV2cGF0aHZhcihzdHJ1Y3Qgc2lfcHViICpzaWgsIGNoYXIgKnZhciwgaW50IGxlbiwKLQkJCSAgIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JdWludCBwYXRoX2xlbjsKLQotCWlmICghdmFyIHx8IGxlbiA8PSAwKQotCQlyZXR1cm4gdmFyOwotCi0JaWYgKGFpX2RldnBhdGgoc2loLCB2YXIsIGxlbikgPT0gMCkgewotCQlwYXRoX2xlbiA9IHN0cmxlbih2YXIpOwotCi0JCWlmIChzdHJsZW4obmFtZSkgKyAxID4gKHVpbnQpIChsZW4gLSBwYXRoX2xlbikpCi0JCQl2YXJbMF0gPSAnXDAnOwotCQllbHNlCi0JCQlzdHJuY3B5KHZhciArIHBhdGhfbGVuLCBuYW1lLCBsZW4gLSBwYXRoX2xlbiAtIDEpOwotCX0KLQotCXJldHVybiB2YXI7Ci19Ci0KLS8qIHJldHVybiB0cnVlIGlmIFBDSUUgY2FwYWJpbGl0eSBleGlzdHMgaW4gdGhlIHBjaSBjb25maWcgc3BhY2UgKi8KLXN0YXRpYyBib29sIGFpX2lzcGNpZShzdHJ1Y3Qgc2lfaW5mbyAqc2lpKQotewotCXU4IGNhcF9wdHI7Ci0KLQlpZiAoc2lpLT5wdWIuYnVzdHlwZSAhPSBQQ0lfQlVTKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQljYXBfcHRyID0KLQkgICAgcGNpY29yZV9maW5kX3BjaV9jYXBhYmlsaXR5KHNpaS0+cGJ1cywgUENJX0NBUF9JRF9FWFAsIE5VTEwsCi0JCQkJCU5VTEwpOwotCWlmICghY2FwX3B0cikKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgYWlfcGNpX3dhcjE2MTY1KHN0cnVjdCBzaV9wdWIgKnNpaCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCi0Jc2lpID0gU0lfSU5GTyhzaWgpOwotCi0JcmV0dXJuIFBDSShzaWkpICYmIChzaWgtPmJ1c2NvcmVyZXYgPD0gMTApOwotfQotCi12b2lkIGFpX3BjaV91cChzdHJ1Y3Qgc2lfcHViICpzaWgpCi17Ci0Jc3RydWN0IHNpX2luZm8gKnNpaTsKLQotCXNpaSA9IFNJX0lORk8oc2loKTsKLQotCS8qIGlmIG5vdCBwY2kgYnVzLCB3ZSdyZSBkb25lICovCi0JaWYgKHNpaC0+YnVzdHlwZSAhPSBQQ0lfQlVTKQotCQlyZXR1cm47Ci0KLQlpZiAoUENJX0ZPUkNFSFQoc2lpKSkKLQkJX2FpX2Nsa2N0bF9jYyhzaWksIENMS19GQVNUKTsKLQotCWlmIChQQ0lFKHNpaSkpCi0JCXBjaWNvcmVfdXAoc2lpLT5wY2gsIFNJX1BDSVVQKTsKLQotfQotCi0vKiBVbmNvbmZpZ3VyZSBhbmQvb3IgYXBwbHkgdmFyaW91cyBXQVJzIHdoZW4gc3lzdGVtIGlzIGdvaW5nIHRvIHNsZWVwIG1vZGUgKi8KLXZvaWQgYWlfcGNpX3NsZWVwKHN0cnVjdCBzaV9wdWIgKnNpaCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCi0Jc2lpID0gU0lfSU5GTyhzaWgpOwotCi0JcGNpY29yZV9zbGVlcChzaWktPnBjaCk7Ci19Ci0KLS8qIFVuY29uZmlndXJlIGFuZC9vciBhcHBseSB2YXJpb3VzIFdBUnMgd2hlbiBnb2luZyBkb3duICovCi12b2lkIGFpX3BjaV9kb3duKHN0cnVjdCBzaV9wdWIgKnNpaCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCi0Jc2lpID0gU0lfSU5GTyhzaWgpOwotCi0JLyogaWYgbm90IHBjaSBidXMsIHdlJ3JlIGRvbmUgKi8KLQlpZiAoc2loLT5idXN0eXBlICE9IFBDSV9CVVMpCi0JCXJldHVybjsKLQotCS8qIHJlbGVhc2UgRk9SQ0VIVCBzaW5jZSBjaGlwIGlzIGdvaW5nIHRvICJkb3duIiBzdGF0ZSAqLwotCWlmIChQQ0lfRk9SQ0VIVChzaWkpKQotCQlfYWlfY2xrY3RsX2NjKHNpaSwgQ0xLX0RZTkFNSUMpOwotCi0JcGNpY29yZV9kb3duKHNpaS0+cGNoLCBTSV9QQ0lET1dOKTsKLX0KLQotLyoKLSAqIENvbmZpZ3VyZSB0aGUgcGNpIGNvcmUgZm9yIHBjaSBjbGllbnQgKE5JQykgYWN0aW9uCi0gKiBjb3JlbWFzayBpcyB0aGUgYml0dmVjIG9mIGNvcmVzIGJ5IGluZGV4IHRvIGJlIGVuYWJsZWQuCi0gKi8KLXZvaWQgYWlfcGNpX3NldHVwKHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCBjb3JlbWFzaykKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCXZvaWQgKnJlZ3MgPSBOVUxMOwotCXUzMiBzaWZsYWcgPSAwLCB3OwotCXVpbnQgaWR4ID0gMDsKLQotCXNpaSA9IFNJX0lORk8oc2loKTsKLQotCWlmIChzaWktPnB1Yi5idXN0eXBlICE9IFBDSV9CVVMpCi0JCXJldHVybjsKLQotCWlmIChQQ0koc2lpKSkgewotCQkvKiBnZXQgY3VycmVudCBjb3JlIGluZGV4ICovCi0JCWlkeCA9IHNpaS0+Y3VyaWR4OwotCi0JCS8qIHdlIGludGVycnVwdCBvbiB0aGlzIGJhY2twbGFuZSBmbGFnIG51bWJlciAqLwotCQlzaWZsYWcgPSBhaV9mbGFnKHNpaCk7Ci0KLQkJLyogc3dpdGNoIG92ZXIgdG8gcGNpIGNvcmUgKi8KLQkJcmVncyA9IGFpX3NldGNvcmVpZHgoc2loLCBzaWktPnB1Yi5idXNjb3JlaWR4KTsKLQl9Ci0KLQkvKgotCSAqIEVuYWJsZSBzYi0+cGNpIGludGVycnVwdHMuICBBc3N1bWUKLQkgKiBQQ0kgcmV2IDIuMyBzdXBwb3J0IHdhcyBhZGRlZCBpbiBwY2kgY29yZSByZXYgNiBhbmQgdGhpbmdzIGNoYW5nZWQuLgotCSAqLwotCWlmIChQQ0lFKHNpaSkgfHwgKFBDSShzaWkpICYmICgoc2lpLT5wdWIuYnVzY29yZXJldikgPj0gNikpKSB7Ci0JCS8qIHBjaSBjb25maWcgd3JpdGUgdG8gc2V0IHRoaXMgY29yZSBiaXQgaW4gUENJSW50TWFzayAqLwotCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2lpLT5wYnVzLCBQQ0lfSU5UX01BU0ssICZ3KTsKLQkJdyB8PSAoY29yZW1hc2sgPDwgUENJX1NCSU1fU0hJRlQpOwotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+cGJ1cywgUENJX0lOVF9NQVNLLCB3KTsKLQl9IGVsc2UgewotCQkvKiBzZXQgc2JpbnR2ZWMgYml0IGZvciBvdXIgZmxhZyBudW1iZXIgKi8KLQkJYWlfc2V0aW50KHNpaCwgc2lmbGFnKTsKLQl9Ci0KLQlpZiAoUENJKHNpaSkpIHsKLQkJcGNpY29yZV9wY2lfc2V0dXAoc2lpLT5wY2gsIHJlZ3MpOwotCi0JCS8qIHN3aXRjaCBiYWNrIHRvIHByZXZpb3VzIGNvcmUgKi8KLQkJYWlfc2V0Y29yZWlkeChzaWgsIGlkeCk7Ci0JfQotfQotCi0vKgotICogRml4dXAgU1JPTWxlc3MgUENJIGRldmljZSdzIGNvbmZpZ3VyYXRpb24uCi0gKiBUaGUgY3VycmVudCBjb3JlIG1heSBiZSBjaGFuZ2VkIHVwb24gcmV0dXJuLgotICovCi1pbnQgYWlfcGNpX2ZpeGNmZyhzdHJ1Y3Qgc2lfcHViICpzaWgpCi17Ci0JdWludCBvcmlnaWR4OwotCXZvaWQgKnJlZ3MgPSBOVUxMOwotCi0Jc3RydWN0IHNpX2luZm8gKnNpaSA9IFNJX0lORk8oc2loKTsKLQotCS8qIEZpeHVwIFBJIGluIFNST00gc2hhZG93IGFyZWEgdG8gZW5hYmxlIHRoZSBjb3JyZWN0IFBDSSBjb3JlIGFjY2VzcyAqLwotCS8qIHNhdmUgdGhlIGN1cnJlbnQgaW5kZXggKi8KLQlvcmlnaWR4ID0gYWlfY29yZWlkeCgmc2lpLT5wdWIpOwotCi0JLyogY2hlY2sgJ3BpJyBpcyBjb3JyZWN0IGFuZCBmaXggaXQgaWYgbm90ICovCi0JcmVncyA9IGFpX3NldGNvcmUoJnNpaS0+cHViLCBzaWktPnB1Yi5idXNjb3JldHlwZSwgMCk7Ci0JcGNpY29yZV9maXhjZmcoc2lpLT5wY2gsIHJlZ3MpOwotCi0JLyogcmVzdG9yZSB0aGUgb3JpZ2luYWwgaW5kZXggKi8KLQlhaV9zZXRjb3JlaWR4KCZzaWktPnB1Yiwgb3JpZ2lkeCk7Ci0KLQlwY2ljb3JlX2h3dXAoc2lpLT5wY2gpOwotCXJldHVybiAwOwotfQotCi0vKiBtYXNrJnNldCBncGlvY29udHJvbCBiaXRzICovCi11MzIgYWlfZ3Bpb2NvbnRyb2woc3RydWN0IHNpX3B1YiAqc2loLCB1MzIgbWFzaywgdTMyIHZhbCwgdTggcHJpb3JpdHkpCi17Ci0JdWludCByZWdvZmY7Ci0KLQlyZWdvZmYgPSAwOwotCi0JLyogZ3Bpb3MgY291bGQgYmUgc2hhcmVkIG9uIHJvdXRlciBwbGF0Zm9ybXMKLQkgKiBpZ25vcmUgcmVzZXJ2YXRpb24gaWYgaXQncyBoaWdoIHByaW9yaXR5IChlLmcuLCB0ZXN0IGFwcHMpCi0JICovCi0JaWYgKChwcmlvcml0eSAhPSBHUElPX0hJX1BSSU9SSVRZKSAmJgotCSAgICAoc2loLT5idXN0eXBlID09IFNJX0JVUykgJiYgKHZhbCB8fCBtYXNrKSkgewotCQltYXNrID0gcHJpb3JpdHkgPyAoYWlfZ3Bpb3Jlc2VydmF0aW9uICYgbWFzaykgOgotCQkgICAgKChhaV9ncGlvcmVzZXJ2YXRpb24gfCBtYXNrKSAmIH4oYWlfZ3Bpb3Jlc2VydmF0aW9uKSk7Ci0JCXZhbCAmPSBtYXNrOwotCX0KLQotCXJlZ29mZiA9IG9mZnNldG9mKGNoaXBjcmVnc190LCBncGlvY29udHJvbCk7Ci0JcmV0dXJuIGFpX2NvcmVyZWcoc2loLCBTSV9DQ19JRFgsIHJlZ29mZiwgbWFzaywgdmFsKTsKLX0KLQotdm9pZCBhaV9jaGlwY29udHJsX2VwYTQzMzEoc3RydWN0IHNpX3B1YiAqc2loLCBib29sIG9uKQotewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0JY2hpcGNyZWdzX3QgKmNjOwotCXVpbnQgb3JpZ2lkeDsKLQl1MzIgdmFsOwotCi0Jc2lpID0gU0lfSU5GTyhzaWgpOwotCW9yaWdpZHggPSBhaV9jb3JlaWR4KHNpaCk7Ci0KLQljYyA9IChjaGlwY3JlZ3NfdCAqKSBhaV9zZXRjb3JlKHNpaCwgQ0NfQ09SRV9JRCwgMCk7Ci0KLQl2YWwgPSBSX1JFRygmY2MtPmNoaXBjb250cm9sKTsKLQotCWlmIChvbikgewotCQlpZiAoc2loLT5jaGlwcGtnID09IDkgfHwgc2loLT5jaGlwcGtnID09IDB4YikgewotCQkJLyogRXh0IFBBIENvbnRyb2xzIGZvciA0MzMxIDEyeDkgUGFja2FnZSAqLwotCQkJV19SRUcoJmNjLT5jaGlwY29udHJvbCwgdmFsIHwKLQkJCSAgICAgIChDQ1RSTDQzMzFfRVhUUEFfRU4gfAotCQkJICAgICAgIENDVFJMNDMzMV9FWFRQQV9PTl9HUElPMl81KSk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBFeHQgUEEgQ29udHJvbHMgZm9yIDQzMzEgMTJ4MTIgUGFja2FnZSAqLwotCQkJV19SRUcoJmNjLT5jaGlwY29udHJvbCwKLQkJCSAgICAgIHZhbCB8IChDQ1RSTDQzMzFfRVhUUEFfRU4pKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXZhbCAmPSB+KENDVFJMNDMzMV9FWFRQQV9FTiB8IENDVFJMNDMzMV9FWFRQQV9PTl9HUElPMl81KTsKLQkJV19SRUcoJmNjLT5jaGlwY29udHJvbCwgdmFsKTsKLQl9Ci0KLQlhaV9zZXRjb3JlaWR4KHNpaCwgb3JpZ2lkeCk7Ci19Ci0KLS8qIEVuYWJsZSBCVC1DT0VYICYgRXgtUEEgZm9yIDQzMTMgKi8KLXZvaWQgYWlfZXBhXzQzMTN3YXIoc3RydWN0IHNpX3B1YiAqc2loKQotewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0JY2hpcGNyZWdzX3QgKmNjOwotCXVpbnQgb3JpZ2lkeDsKLQotCXNpaSA9IFNJX0lORk8oc2loKTsKLQlvcmlnaWR4ID0gYWlfY29yZWlkeChzaWgpOwotCi0JY2MgPSAoY2hpcGNyZWdzX3QgKikgYWlfc2V0Y29yZShzaWgsIENDX0NPUkVfSUQsIDApOwotCi0JLyogRVBBIEZpeCAqLwotCVdfUkVHKCZjYy0+Z3Bpb2NvbnRyb2wsCi0JICAgICAgUl9SRUcoJmNjLT5ncGlvY29udHJvbCkgfCBHUElPX0NUUkxfRVBBX0VOX01BU0spOwotCi0JYWlfc2V0Y29yZWlkeChzaWgsIG9yaWdpZHgpOwotfQotCi0vKiBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIHJlbW92ZWQgKi8KLWJvb2wgYWlfZGV2aWNlcmVtb3ZlZChzdHJ1Y3Qgc2lfcHViICpzaWgpCi17Ci0JdTMyIHc7Ci0Jc3RydWN0IHNpX2luZm8gKnNpaTsKLQotCXNpaSA9IFNJX0lORk8oc2loKTsKLQotCXN3aXRjaCAoc2loLT5idXN0eXBlKSB7Ci0JY2FzZSBQQ0lfQlVTOgotCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2lpLT5wYnVzLCBQQ0lfVkVORE9SX0lELCAmdyk7Ci0JCWlmICgodyAmIDB4RkZGRikgIT0gUENJX1ZFTkRPUl9JRF9CUk9BRENPTSkKLQkJCXJldHVybiB0cnVlOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIGFpX2lzX3Nwcm9tX2F2YWlsYWJsZShzdHJ1Y3Qgc2lfcHViICpzaWgpCi17Ci0JaWYgKHNpaC0+Y2NyZXYgPj0gMzEpIHsKLQkJc3RydWN0IHNpX2luZm8gKnNpaTsKLQkJdWludCBvcmlnaWR4OwotCQljaGlwY3JlZ3NfdCAqY2M7Ci0JCXUzMiBzcm9tY3RybDsKLQotCQlpZiAoKHNpaC0+Y2NjYXBzICYgQ0NfQ0FQX1NST00pID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJc2lpID0gU0lfSU5GTyhzaWgpOwotCQlvcmlnaWR4ID0gc2lpLT5jdXJpZHg7Ci0JCWNjID0gYWlfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7Ci0JCXNyb21jdHJsID0gUl9SRUcoJmNjLT5zcm9tY29udHJvbCk7Ci0JCWFpX3NldGNvcmVpZHgoc2loLCBvcmlnaWR4KTsKLQkJcmV0dXJuIHNyb21jdHJsICYgU1JDX1BSRVNFTlQ7Ci0JfQotCi0Jc3dpdGNoIChzaWgtPmNoaXApIHsKLQljYXNlIEJDTTQzMTNfQ0hJUF9JRDoKLQkJcmV0dXJuIChzaWgtPmNoaXBzdCAmIENTVDQzMTNfU1BST01fUFJFU0VOVCkgIT0gMDsKLQlkZWZhdWx0OgotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19Ci0KLWJvb2wgYWlfaXNfb3RwX2Rpc2FibGVkKHN0cnVjdCBzaV9wdWIgKnNpaCkKLXsKLQlzd2l0Y2ggKHNpaC0+Y2hpcCkgewotCWNhc2UgQkNNNDMxM19DSElQX0lEOgotCQlyZXR1cm4gKHNpaC0+Y2hpcHN0ICYgQ1NUNDMxM19PVFBfUFJFU0VOVCkgPT0gMDsKLQkJLyogVGhlc2UgY2hpcHMgYWx3YXlzIGhhdmUgdGhlaXIgT1RQIG9uICovCi0JY2FzZSBCQ000MzIyNF9DSElQX0lEOgotCWNhc2UgQkNNNDMyMjVfQ0hJUF9JRDoKLQlkZWZhdWx0OgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9haXV0aWxzLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL2FpdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI0NWMyNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL2FpdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDExIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZglfQlJDTV9BSVVUSUxTX0hfCi0jZGVmaW5lCV9CUkNNX0FJVVRJTFNfSF8KLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLS8qCi0gKiBTT0MgSW50ZXJjb25uZWN0IEFkZHJlc3MgTWFwLgotICogQWxsIHJlZ2lvbnMgbWF5IG5vdCBleGlzdCBvbiBhbGwgY2hpcHMuCi0gKi8KLS8qIFBoeXNpY2FsIFNEUkFNICovCi0jZGVmaW5lIFNJX1NEUkFNX0JBU0UJCTB4MDAwMDAwMDAKLS8qIEhvc3QgTW9kZSBzYjJwY2l0cmFuc2xhdGlvbjAgKDY0IE1CKSAqLwotI2RlZmluZSBTSV9QQ0lfTUVNCQkweDA4MDAwMDAwCi0jZGVmaW5lIFNJX1BDSV9NRU1fU1oJCSg2NCAqIDEwMjQgKiAxMDI0KQotLyogSG9zdCBNb2RlIHNiMnBjaXRyYW5zbGF0aW9uMSAoNjQgTUIpICovCi0jZGVmaW5lIFNJX1BDSV9DRkcJCTB4MGMwMDAwMDAKLS8qIEJ5dGVzd2FwcGVkIFBoeXNpY2FsIFNEUkFNICovCi0jZGVmaW5lCVNJX1NEUkFNX1NXQVBQRUQJMHgxMDAwMDAwMAotLyogUmVnaW9uIDIgZm9yIHNkcmFtICg1MTIgTUIpICovCi0jZGVmaW5lIFNJX1NEUkFNX1IyCQkweDgwMDAwMDAwCi0KLSNpZmRlZiBTSV9FTlVNX0JBU0VfVkFSSUFCTEUKLSNkZWZpbmUgU0lfRU5VTV9CQVNFCQkoc2lpLT5wdWIuc2lfZW51bV9iYXNlKQotI2Vsc2UKLSNkZWZpbmUgU0lfRU5VTV9CQVNFCQkweDE4MDAwMDAwCS8qIEVudW1lcmF0aW9uIHNwYWNlIGJhc2UgKi8KLSNlbmRpZgkJCQkvKiBTSV9FTlVNX0JBU0VfVkFSSUFCTEUgKi8KLQotLyogV3JhcHBlciBzcGFjZSBiYXNlICovCi0jZGVmaW5lIFNJX1dSQVBfQkFTRQkJMHgxODEwMDAwMAotLyogZWFjaCBjb3JlIGdldHMgNEtieXRlcyBmb3IgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFNJX0NPUkVfU0laRQkJMHgxMDAwCi0vKgotICogTWF4IGNvcmVzICh0aGlzIGlzIGFyYml0cmFyeSwgZm9yIHNvZnR3YXJlCi0gKiBjb252ZW5pZW5jZSBhbmQgY291bGQgYmUgY2hhbmdlZCBpZiB3ZQotICogbWFrZSBhbnkgbGFyZ2VyIGNoaXBzCi0gKi8KLSNkZWZpbmUJU0lfTUFYQ09SRVMJCTE2Ci0KLS8qIE9uLWNoaXAgUkFNIG9uIGNoaXBzIHRoYXQgYWxzbyBoYXZlIEREUiAqLwotI2RlZmluZQlTSV9GQVNUUkFNCQkweDE5MDAwMDAwCi0jZGVmaW5lCVNJX0ZBU1RSQU1fU1dBUFBFRAkweDE5ODAwMDAwCi0KLS8qIEZsYXNoIFJlZ2lvbiAyIChyZWdpb24gMSBzaGFkb3dlZCBoZXJlKSAqLwotI2RlZmluZQlTSV9GTEFTSDIJCTB4MWMwMDAwMDAKLS8qIFNpemUgb2YgRmxhc2ggUmVnaW9uIDIgKi8KLSNkZWZpbmUJU0lfRkxBU0gyX1NaCQkweDAyMDAwMDAwCi0vKiBBUk0gQ29ydGV4LU0zIFJPTSAqLwotI2RlZmluZQlTSV9BUk1DTTNfUk9NCQkweDFlMDAwMDAwCi0vKiBNSVBTIEZsYXNoIFJlZ2lvbiAxICovCi0jZGVmaW5lCVNJX0ZMQVNIMQkJMHgxZmMwMDAwMAotLyogTUlQUyBTaXplIG9mIEZsYXNoIFJlZ2lvbiAxICovCi0jZGVmaW5lCVNJX0ZMQVNIMV9TWgkJMHgwMDQwMDAwMAotLyogQVJNN1RETUktUyBST00gKi8KLSNkZWZpbmUJU0lfQVJNN1NfUk9NCQkweDIwMDAwMDAwCi0vKiBBUk0gQ29ydGV4LU0zIFNSQU0gUmVnaW9uIDIgKi8KLSNkZWZpbmUJU0lfQVJNQ00zX1NSQU0yCQkweDYwMDAwMDAwCi0vKiBBUk03VERNSS1TIFNSQU0gUmVnaW9uIDIgKi8KLSNkZWZpbmUJU0lfQVJNN1NfU1JBTTIJCTB4ODAwMDAwMDAKLS8qIEFSTSBGbGFzaCBSZWdpb24gMSAqLwotI2RlZmluZQlTSV9BUk1fRkxBU0gxCQkweGZmZmYwMDAwCi0vKiBBUk0gU2l6ZSBvZiBGbGFzaCBSZWdpb24gMSAqLwotI2RlZmluZQlTSV9BUk1fRkxBU0gxX1NaCTB4MDAwMTAwMDAKLQotLyogQ2xpZW50IE1vZGUgc2IycGNpdHJhbnNsYXRpb24yICgxIEdCKSAqLwotI2RlZmluZSBTSV9QQ0lfRE1BCQkweDQwMDAwMDAwCi0vKiBDbGllbnQgTW9kZSBzYjJwY2l0cmFuc2xhdGlvbjIgKDEgR0IpICovCi0jZGVmaW5lIFNJX1BDSV9ETUEyCQkweDgwMDAwMDAwCi0vKiBDbGllbnQgTW9kZSBzYjJwY2l0cmFuc2xhdGlvbjIgc2l6ZSBpbiBieXRlcyAqLwotI2RlZmluZSBTSV9QQ0lfRE1BX1NaCQkweDQwMDAwMDAwCi0vKiBQQ0lFIENsaWVudCBNb2RlIHNiMnBjaXRyYW5zbGF0aW9uMiAoMiBaZXR0YUJ5dGVzKSwgbG93IDMyIGJpdHMgKi8KLSNkZWZpbmUgU0lfUENJRV9ETUFfTDMyCQkweDAwMDAwMDAwCi0vKiBQQ0lFIENsaWVudCBNb2RlIHNiMnBjaXRyYW5zbGF0aW9uMiAoMiBaZXR0YUJ5dGVzKSwgaGlnaCAzMiBiaXRzICovCi0jZGVmaW5lIFNJX1BDSUVfRE1BX0gzMgkJMHg4MDAwMDAwMAotCi0vKiBjb3JlIGNvZGVzICovCi0jZGVmaW5lCU5PREVWX0NPUkVfSUQJCTB4NzAwCS8qIEludmFsaWQgY29yZWlkICovCi0jZGVmaW5lCUNDX0NPUkVfSUQJCTB4ODAwCS8qIGNoaXBjb21tb24gY29yZSAqLwotI2RlZmluZQlJTElORTIwX0NPUkVfSUQJCTB4ODAxCS8qIGlsaW5lMjAgY29yZSAqLwotI2RlZmluZQlTUkFNX0NPUkVfSUQJCTB4ODAyCS8qIHNyYW0gY29yZSAqLwotI2RlZmluZQlTRFJBTV9DT1JFX0lECQkweDgwMwkvKiBzZHJhbSBjb3JlICovCi0jZGVmaW5lCVBDSV9DT1JFX0lECQkweDgwNAkvKiBwY2kgY29yZSAqLwotI2RlZmluZQlNSVBTX0NPUkVfSUQJCTB4ODA1CS8qIG1pcHMgY29yZSAqLwotI2RlZmluZQlFTkVUX0NPUkVfSUQJCTB4ODA2CS8qIGVuZXQgbWFjIGNvcmUgKi8KLSNkZWZpbmUJQ09ERUNfQ09SRV9JRAkJMHg4MDcJLyogdjkwIGNvZGVjIGNvcmUgKi8KLSNkZWZpbmUJVVNCX0NPUkVfSUQJCTB4ODA4CS8qIHVzYiAxLjEgaG9zdC9kZXZpY2UgY29yZSAqLwotI2RlZmluZQlBRFNMX0NPUkVfSUQJCTB4ODA5CS8qIEFEU0wgY29yZSAqLwotI2RlZmluZQlJTElORTEwMF9DT1JFX0lECTB4ODBhCS8qIGlsaW5lMTAwIGNvcmUgKi8KLSNkZWZpbmUJSVBTRUNfQ09SRV9JRAkJMHg4MGIJLyogaXBzZWMgY29yZSAqLwotI2RlZmluZQlVVE9QSUFfQ09SRV9JRAkJMHg4MGMJLyogdXRvcGlhIGNvcmUgKi8KLSNkZWZpbmUJUENNQ0lBX0NPUkVfSUQJCTB4ODBkCS8qIHBjbWNpYSBjb3JlICovCi0jZGVmaW5lCVNPQ1JBTV9DT1JFX0lECQkweDgwZQkvKiBpbnRlcm5hbCBtZW1vcnkgY29yZSAqLwotI2RlZmluZQlNRU1DX0NPUkVfSUQJCTB4ODBmCS8qIG1lbWMgc2RyYW0gY29yZSAqLwotI2RlZmluZQlPRkRNX0NPUkVfSUQJCTB4ODEwCS8qIE9GRE0gcGh5IGNvcmUgKi8KLSNkZWZpbmUJRVhUSUZfQ09SRV9JRAkJMHg4MTEJLyogZXh0ZXJuYWwgaW50ZXJmYWNlIGNvcmUgKi8KLSNkZWZpbmUJRDExX0NPUkVfSUQJCTB4ODEyCS8qIDgwMi4xMSBNQUMgY29yZSAqLwotI2RlZmluZQlBUEhZX0NPUkVfSUQJCTB4ODEzCS8qIDgwMi4xMWEgcGh5IGNvcmUgKi8KLSNkZWZpbmUJQlBIWV9DT1JFX0lECQkweDgxNAkvKiA4MDIuMTFiIHBoeSBjb3JlICovCi0jZGVmaW5lCUdQSFlfQ09SRV9JRAkJMHg4MTUJLyogODAyLjExZyBwaHkgY29yZSAqLwotI2RlZmluZQlNSVBTMzNfQ09SRV9JRAkJMHg4MTYJLyogbWlwczMzMDIgY29yZSAqLwotI2RlZmluZQlVU0IxMUhfQ09SRV9JRAkJMHg4MTcJLyogdXNiIDEuMSBob3N0IGNvcmUgKi8KLSNkZWZpbmUJVVNCMTFEX0NPUkVfSUQJCTB4ODE4CS8qIHVzYiAxLjEgZGV2aWNlIGNvcmUgKi8KLSNkZWZpbmUJVVNCMjBIX0NPUkVfSUQJCTB4ODE5CS8qIHVzYiAyLjAgaG9zdCBjb3JlICovCi0jZGVmaW5lCVVTQjIwRF9DT1JFX0lECQkweDgxYQkvKiB1c2IgMi4wIGRldmljZSBjb3JlICovCi0jZGVmaW5lCVNESU9IX0NPUkVfSUQJCTB4ODFiCS8qIHNkaW8gaG9zdCBjb3JlICovCi0jZGVmaW5lCVJPQk9fQ09SRV9JRAkJMHg4MWMJLyogcm9ib3N3aXRjaCBjb3JlICovCi0jZGVmaW5lCUFUQTEwMF9DT1JFX0lECQkweDgxZAkvKiBwYXJhbGxlbCBBVEEgY29yZSAqLwotI2RlZmluZQlTQVRBWE9SX0NPUkVfSUQJCTB4ODFlCS8qIHNlcmlhbCBBVEEgJiBYT1IgRE1BIGNvcmUgKi8KLSNkZWZpbmUJR0lHRVRIX0NPUkVfSUQJCTB4ODFmCS8qIGdpZ2FiaXQgZXRoZXJuZXQgY29yZSAqLwotI2RlZmluZQlQQ0lFX0NPUkVfSUQJCTB4ODIwCS8qIHBjaSBleHByZXNzIGNvcmUgKi8KLSNkZWZpbmUJTlBIWV9DT1JFX0lECQkweDgyMQkvKiA4MDIuMTFuIDJ4MiBwaHkgY29yZSAqLwotI2RlZmluZQlTUkFNQ19DT1JFX0lECQkweDgyMgkvKiBTUkFNIGNvbnRyb2xsZXIgY29yZSAqLwotI2RlZmluZQlNSU5JTUFDX0NPUkVfSUQJCTB4ODIzCS8qIE1JTkkgTUFDL3BoeSBjb3JlICovCi0jZGVmaW5lCUFSTTExX0NPUkVfSUQJCTB4ODI0CS8qIEFSTSAxMTc2IGNvcmUgKi8KLSNkZWZpbmUJQVJNN1NfQ09SRV9JRAkJMHg4MjUJLyogQVJNN3RkbWktcyBjb3JlICovCi0jZGVmaW5lCUxQUEhZX0NPUkVfSUQJCTB4ODI2CS8qIDgwMi4xMWEvYi9nIHBoeSBjb3JlICovCi0jZGVmaW5lCVBNVV9DT1JFX0lECQkweDgyNwkvKiBQTVUgY29yZSAqLwotI2RlZmluZQlTU05QSFlfQ09SRV9JRAkJMHg4MjgJLyogODAyLjExbiBzaW5nbGUtc3RyZWFtIHBoeSBjb3JlICovCi0jZGVmaW5lCVNESU9EX0NPUkVfSUQJCTB4ODI5CS8qIFNESU8gZGV2aWNlIGNvcmUgKi8KLSNkZWZpbmUJQVJNQ00zX0NPUkVfSUQJCTB4ODJhCS8qIEFSTSBDb3J0ZXggTTMgY29yZSAqLwotI2RlZmluZQlIVFBIWV9DT1JFX0lECQkweDgyYgkvKiA4MDIuMTFuIDR4NCBwaHkgY29yZSAqLwotI2RlZmluZQlNSVBTNzRLX0NPUkVfSUQJCTB4ODJjCS8qIG1pcHMgNzRrIGNvcmUgKi8KLSNkZWZpbmUJR01BQ19DT1JFX0lECQkweDgyZAkvKiBHaWdhYml0IE1BQyBjb3JlICovCi0jZGVmaW5lCURNRU1DX0NPUkVfSUQJCTB4ODJlCS8qIEREUjEvMiBtZW1vcnkgY29udHJvbGxlciBjb3JlICovCi0jZGVmaW5lCVBDSUVSQ19DT1JFX0lECQkweDgyZgkvKiBQQ0lFIFJvb3QgQ29tcGxleCBjb3JlICovCi0jZGVmaW5lCU9DUF9DT1JFX0lECQkweDgzMAkvKiBPQ1AyT0NQIGJyaWRnZSBjb3JlICovCi0jZGVmaW5lCVNDX0NPUkVfSUQJCTB4ODMxCS8qIHNoYXJlZCBjb21tb24gY29yZSAqLwotI2RlZmluZQlBSEJfQ09SRV9JRAkJMHg4MzIJLyogT0NQMkFIQiBicmlkZ2UgY29yZSAqLwotI2RlZmluZQlTUElIX0NPUkVfSUQJCTB4ODMzCS8qIFNQSSBob3N0IGNvcmUgKi8KLSNkZWZpbmUJSTJTX0NPUkVfSUQJCTB4ODM0CS8qIEkyUyBjb3JlICovCi0jZGVmaW5lCURNRU1TX0NPUkVfSUQJCTB4ODM1CS8qIFNEUi9ERFIxIG1lbW9yeSBjb250cm9sbGVyIGNvcmUgKi8KLSNkZWZpbmUJREVGX1NISU1fQ09NUAkJMHg4MzcJLyogU0hJTSBjb21wb25lbnQgaW4gdWJ1cy82MzYyICovCi0jZGVmaW5lIE9PQl9ST1VURVJfQ09SRV9JRAkweDM2NwkvKiBPT0Igcm91dGVyIGNvcmUgSUQgKi8KLSNkZWZpbmUJREVGX0FJX0NPTVAJCTB4ZmZmCS8qIERlZmF1bHQgY29tcG9uZW50LCBpbiBhaSBjaGlwcyBpdAotCQkJCQkgKiBtYXBzIGFsbCB1bnVzZWQgYWRkcmVzcyByYW5nZXMKLQkJCQkJICovCi0KLS8qIGNoaXBjb21tb24gYmVpbmcgdGhlIGZpcnN0IGNvcmU6ICovCi0jZGVmaW5lCVNJX0NDX0lEWAkJMAotCi0vKiBTT0MgSW50ZXJjb25uZWN0IHR5cGVzIChha2EgY2hpcCB0eXBlcykgKi8KLSNkZWZpbmUJU09DSV9BSQkJCTEKLQotLyogQ29tbW9uIGNvcmUgY29udHJvbCBmbGFncyAqLwotI2RlZmluZQlTSUNGX0JJU1RfRU4JCTB4ODAwMAotI2RlZmluZQlTSUNGX1BNRV9FTgkJMHg0MDAwCi0jZGVmaW5lCVNJQ0ZfQ09SRV9CSVRTCQkweDNmZmMKLSNkZWZpbmUJU0lDRl9GR0MJCTB4MDAwMgotI2RlZmluZQlTSUNGX0NMT0NLX0VOCQkweDAwMDEKLQotLyogQ29tbW9uIGNvcmUgc3RhdHVzIGZsYWdzICovCi0jZGVmaW5lCVNJU0ZfQklTVF9ET05FCQkweDgwMDAKLSNkZWZpbmUJU0lTRl9CSVNUX0VSUk9SCQkweDQwMDAKLSNkZWZpbmUJU0lTRl9HQVRFRF9DTEsJCTB4MjAwMAotI2RlZmluZQlTSVNGX0RNQTY0CQkweDEwMDAKLSNkZWZpbmUJU0lTRl9DT1JFX0JJVFMJCTB4MGZmZgotCi0vKiBBIHJlZ2lzdGVyIHRoYXQgaXMgY29tbW9uIHRvIGFsbCBjb3JlcyB0bwotICogY29tbXVuaWNhdGUgdy9QTVUgcmVnYXJkaW5nIGNsb2NrIGNvbnRyb2wuCi0gKi8KLSNkZWZpbmUgU0lfQ0xLX0NUTF9TVAkJMHgxZTAJLyogY2xvY2sgY29udHJvbCBhbmQgc3RhdHVzICovCi0KLS8qIGNsa19jdGxfc3QgcmVnaXN0ZXIgKi8KLSNkZWZpbmUJQ0NTX0ZPUkNFQUxQCQkweDAwMDAwMDAxCS8qIGZvcmNlIEFMUCByZXF1ZXN0ICovCi0jZGVmaW5lCUNDU19GT1JDRUhUCQkweDAwMDAwMDAyCS8qIGZvcmNlIEhUIHJlcXVlc3QgKi8KLSNkZWZpbmUJQ0NTX0ZPUkNFSUxQCQkweDAwMDAwMDA0CS8qIGZvcmNlIElMUCByZXF1ZXN0ICovCi0jZGVmaW5lCUNDU19BTFBBUkVRCQkweDAwMDAwMDA4CS8qIEFMUCBBdmFpbCBSZXF1ZXN0ICovCi0jZGVmaW5lCUNDU19IVEFSRVEJCTB4MDAwMDAwMTAJLyogSFQgQXZhaWwgUmVxdWVzdCAqLwotI2RlZmluZQlDQ1NfRk9SQ0VIV1JFUU9GRgkweDAwMDAwMDIwCS8qIEZvcmNlIEhXIENsb2NrIFJlcXVlc3QgT2ZmICovCi0jZGVmaW5lIENDU19FUlNSQ19SRVFfTUFTSwkweDAwMDAwNzAwCS8qIGV4dGVybmFsIHJlc291cmNlIHJlcXVlc3RzICovCi0jZGVmaW5lIENDU19FUlNSQ19SRVFfU0hJRlQJOAotI2RlZmluZQlDQ1NfQUxQQVZBSUwJCTB4MDAwMTAwMDAJLyogQUxQIGlzIGF2YWlsYWJsZSAqLwotI2RlZmluZQlDQ1NfSFRBVkFJTAkJMHgwMDAyMDAwMAkvKiBIVCBpcyBhdmFpbGFibGUgKi8KLSNkZWZpbmUgQ0NTX0JQX09OX0FQTAkJMHgwMDA0MDAwMAkvKiBSTzogcnVubmluZyBvbiBBTFAgY2xvY2sgKi8KLSNkZWZpbmUgQ0NTX0JQX09OX0hUCQkweDAwMDgwMDAwCS8qIFJPOiBydW5uaW5nIG9uIEhUIGNsb2NrICovCi0jZGVmaW5lIENDU19FUlNSQ19TVFNfTUFTSwkweDA3MDAwMDAwCS8qIGV4dGVybmFsIHJlc291cmNlIHN0YXR1cyAqLwotI2RlZmluZSBDQ1NfRVJTUkNfU1RTX1NISUZUCTI0Ci0KLS8qIEhUIGF2YWlsIGluIGNoaXBjIGFuZCBwY21jaWEgb24gNDMyOGEwICovCi0jZGVmaW5lCUNDUzBfSFRBVkFJTAkJMHgwMDAxMDAwMAotLyogQUxQIGF2YWlsIGluIGNoaXBjIGFuZCBwY21jaWEgb24gNDMyOGEwICovCi0jZGVmaW5lCUNDUzBfQUxQQVZBSUwJCTB4MDAwMjAwMDAKLQotLyogTm90IHJlYWxseSByZWxhdGVkIHRvIFNPQyBJbnRlcmNvbm5lY3QsIGJ1dCBhIGNvdXBsZSBvZiBzb2Z0d2FyZQotICogY29udmVudGlvbnMgZm9yIHRoZSB1c2UgdGhlIGZsYXNoIHNwYWNlOgotICovCi0KLS8qIE1pbnVtdW0gYW1vdW50IG9mIGZsYXNoIHdlIHN1cHBvcnQgKi8KLSNkZWZpbmUgRkxBU0hfTUlOCQkweDAwMDIwMDAwCS8qIE1pbmltdW0gZmxhc2ggc2l6ZSAqLwotCi0vKiBBIGJvb3QvYmluYXJ5IG1heSBoYXZlIGFuIGVtYmVkZGVkIGJsb2NrIHRoYXQgZGVzY3JpYmVzIGl0cyBzaXplICAqLwotI2RlZmluZQlCSVNaX09GRlNFVAkJMHgzZTAJLyogQXQgdGhpcyBvZmZzZXQgaW50byB0aGUgYmluYXJ5ICovCi0jZGVmaW5lCUJJU1pfTUFHSUMJCTB4NDI0OTUzNWEJLyogTWFya2VkIHdpdGggdmFsdWU6ICdCSVNaJyAqLwotI2RlZmluZQlCSVNaX01BR0lDX0lEWAkJMAkvKiBXb3JkIDA6IG1hZ2ljICovCi0jZGVmaW5lCUJJU1pfVFhUU1RfSURYCQkxCS8qICAgICAgMTogdGV4dCBzdGFydCAqLwotI2RlZmluZQlCSVNaX1RYVEVORF9JRFgJCTIJLyogICAgICAyOiB0ZXh0IGVuZCAqLwotI2RlZmluZQlCSVNaX0RBVEFTVF9JRFgJCTMJLyogICAgICAzOiBkYXRhIHN0YXJ0ICovCi0jZGVmaW5lCUJJU1pfREFUQUVORF9JRFgJNAkvKiAgICAgIDQ6IGRhdGEgZW5kICovCi0jZGVmaW5lCUJJU1pfQlNTU1RfSURYCQk1CS8qICAgICAgNTogYnNzIHN0YXJ0ICovCi0jZGVmaW5lCUJJU1pfQlNTRU5EX0lEWAkJNgkvKiAgICAgIDY6IGJzcyBlbmQgKi8KLSNkZWZpbmUgQklTWl9TSVpFCQk3CS8qIGRlc2NyaXB0b3Igc2l6ZSBpbiAzMi1iaXQgaW50ZWdlcnMgKi8KLQotI2RlZmluZQlDQ19TUk9NX09UUAkJMHg4MDAJLyogU1JPTS9PVFAgYWRkcmVzcyBzcGFjZSAqLwotCi0vKiBncGlvdGltZXJ2YWwgKi8KLSNkZWZpbmUgR1BJT19PTlRJTUVfU0hJRlQJMTYKLQotLyogRmllbGRzIGluIGNsa2RpdiAqLwotI2RlZmluZQlDTEtEX09UUAkJMHgwMDBmMDAwMAotI2RlZmluZQlDTEtEX09UUF9TSElGVAkJMTYKLQotLyogV2hlbiBTcm9tIHN1cHBvcnQgcHJlc2VudCwgZmllbGRzIGluIHNyb21jb250cm9sICovCi0jZGVmaW5lCVNSQ19TVEFSVAkJMHg4MDAwMDAwMAotI2RlZmluZQlTUkNfQlVTWQkJMHg4MDAwMDAwMAotI2RlZmluZQlTUkNfT1BDT0RFCQkweDYwMDAwMDAwCi0jZGVmaW5lCVNSQ19PUF9SRUFECQkweDAwMDAwMDAwCi0jZGVmaW5lCVNSQ19PUF9XUklURQkJMHgyMDAwMDAwMAotI2RlZmluZQlTUkNfT1BfV1JESVMJCTB4NDAwMDAwMDAKLSNkZWZpbmUJU1JDX09QX1dSRU4JCTB4NjAwMDAwMDAKLSNkZWZpbmUJU1JDX09UUFNFTAkJMHgwMDAwMDAxMAotI2RlZmluZQlTUkNfTE9DSwkJMHgwMDAwMDAwOAotI2RlZmluZQlTUkNfU0laRV9NQVNLCQkweDAwMDAwMDA2Ci0jZGVmaW5lCVNSQ19TSVpFXzFLCQkweDAwMDAwMDAwCi0jZGVmaW5lCVNSQ19TSVpFXzRLCQkweDAwMDAwMDAyCi0jZGVmaW5lCVNSQ19TSVpFXzE2SwkJMHgwMDAwMDAwNAotI2RlZmluZQlTUkNfU0laRV9TSElGVAkJMQotI2RlZmluZQlTUkNfUFJFU0VOVAkJMHgwMDAwMDAwMQotCi0vKiA0MzMwIGNoaXAtc3BlY2lmaWMgQ2hpcFN0YXR1cyByZWdpc3RlciBiaXRzICovCi0jZGVmaW5lIENTVDQzMzBfQ0hJUE1PREVfU0RJT0QoY3MpCSgoKGNzKSAmIDB4NykgPCA2KQkvKiBTRElPIHx8IGdTUEkgKi8KLSNkZWZpbmUgQ1NUNDMzMF9DSElQTU9ERV9VU0IyMEQoY3MpCSgoKGNzKSAmIDB4NykgPj0gNikJLyogVVNCIHx8IFVTQkRBICovCi0jZGVmaW5lIENTVDQzMzBfQ0hJUE1PREVfU0RJTyhjcykJKCgoY3MpICYgMHg0KSA9PSAwKQkvKiBTRElPICovCi0jZGVmaW5lIENTVDQzMzBfQ0hJUE1PREVfR1NQSShjcykJKCgoY3MpICYgMHg2KSA9PSA0KQkvKiBnU1BJICovCi0jZGVmaW5lIENTVDQzMzBfQ0hJUE1PREVfVVNCKGNzKQkoKChjcykgJiAweDcpID09IDYpCS8qIFVTQiBwYWNrZXQtb3JpZW50ZWQgKi8KLSNkZWZpbmUgQ1NUNDMzMF9DSElQTU9ERV9VU0JEQShjcykJKCgoY3MpICYgMHg3KSA9PSA3KQkvKiBVU0IgRGlyZWN0IEFjY2VzcyAqLwotI2RlZmluZQlDU1Q0MzMwX09UUF9QUkVTRU5UCQkweDAwMDAwMDEwCi0jZGVmaW5lCUNTVDQzMzBfTFBPX0FVVE9ERVRfRU4JCTB4MDAwMDAwMjAKLSNkZWZpbmUJQ1NUNDMzMF9BUk1SRU1BUF8wCQkweDAwMDAwMDQwCi0jZGVmaW5lCUNTVDQzMzBfU1BST01fUFJFU0VOVAkJMHgwMDAwMDA4MAkvKiB0YWtlcyBwcmlvcml0eSBvdmVyIE9UUCBpZiBib3RoIHNldCAqLwotI2RlZmluZQlDU1Q0MzMwX0lMUERJVl9FTgkJMHgwMDAwMDEwMAotI2RlZmluZQlDU1Q0MzMwX0xQT19TRUwJCQkweDAwMDAwMjAwCi0jZGVmaW5lCUNTVDQzMzBfUkVTX0lOSVRfTU9ERV9TSElGVAkxMAotI2RlZmluZQlDU1Q0MzMwX1JFU19JTklUX01PREVfTUFTSwkweDAwMDAwYzAwCi0jZGVmaW5lIENTVDQzMzBfQ0JVQ0tfTU9ERV9TSElGVAkxMgotI2RlZmluZSBDU1Q0MzMwX0NCVUNLX01PREVfTUFTSwkJMHgwMDAwMzAwMAotI2RlZmluZQlDU1Q0MzMwX0NCVUNLX1BPV0VSX09LCQkweDAwMDA0MDAwCi0jZGVmaW5lCUNTVDQzMzBfQkJfUExMX0xPQ0tFRAkJMHgwMDAwODAwMAotCi0vKiBQYWNrYWdlIElEcyAqLwotI2RlZmluZSBCQ000MzI5XzI4OVBJTl9QS0dfSUQJMAkvKiA0MzI5IDI4OS1waW4gcGFja2FnZSBpZCAqLwotI2RlZmluZSBCQ000MzI5XzE4MlBJTl9QS0dfSUQJMQkvKiA0MzI5TiAxODItcGluIHBhY2thZ2UgaWQgKi8KLSNkZWZpbmUJQkNNNDcxN19QS0dfSUQJCTkJLyogNDcxNyBwYWNrYWdlIGlkICovCi0jZGVmaW5lCUJDTTQ3MThfUEtHX0lECQkxMAkvKiA0NzE4IHBhY2thZ2UgaWQgKi8KLSNkZWZpbmUgSERMU0lNX1BLR19JRAkJMTQJLyogSERMIHNpbXVsYXRvciBwYWNrYWdlIGlkICovCi0jZGVmaW5lIEhXU0lNX1BLR19JRAkJMTUJLyogSGFyZHdhcmUgc2ltdWxhdG9yIHBhY2thZ2UgaWQgKi8KLSNkZWZpbmUgQkNNNDMyMjRfRkFCX1NNSUMJMHhhCS8qIHRoZSBjaGlwIGlzIG1hbnVmYWN0dXJlZCBieSBTTUlDICovCi0KLS8qIHRoZXNlIGFyZSByb3V0ZXIgY2hpcHMgKi8KLSNkZWZpbmUJQkNNNDcxNl9DSElQX0lECQkweDQ3MTYJLyogNDcxNiBjaGlwY29tbW9uIGNoaXBpZCAqLwotI2RlZmluZQlCQ000NzE2Ml9DSElQX0lECTQ3MTYyCS8qIDQ3MTYyIGNoaXBjb21tb24gY2hpcGlkICovCi0jZGVmaW5lCUJDTTQ3NDhfQ0hJUF9JRAkJMHg0NzQ4CS8qIDQ3MTYgY2hpcGNvbW1vbiBjaGlwaWQgKE9UUCwgUkJCVSkgKi8KLSNkZWZpbmUJQkNNNTM1Nl9DSElQX0lECQkweDUzNTYJLyogNTM1NiBjaGlwY29tbW9uIGNoaXBpZCAqLwotI2RlZmluZQlCQ001MzU3X0NISVBfSUQJCTB4NTM1NwkvKiA1MzU3IGNoaXBjb21tb24gY2hpcGlkICovCi0KLQotI2RlZmluZQlTSV9JTkZPKHNpaCkJKChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaCkKLQotI2RlZmluZQlHT09EQ09SRUFERFIoeCwgYikgXAotCSgoKHgpID49IChiKSkgJiYgKCh4KSA8ICgoYikgKyBTSV9NQVhDT1JFUyAqIFNJX0NPUkVfU0laRSkpICYmIFwKLQkJSVNfQUxJR05FRCgoeCksIFNJX0NPUkVfU0laRSkpCi0jZGVmaW5lCUdPT0RSRUdTKHJlZ3MpIFwKLQkoKHJlZ3MpICE9IE5VTEwgJiYgSVNfQUxJR05FRCgodW5zaWduZWQgbG9uZykocmVncyksIFNJX0NPUkVfU0laRSkpCi0jZGVmaW5lIEJBRENPUkVBRERSCTAKLSNkZWZpbmUJR09PRElEWChpZHgpCSgoKHVpbnQpaWR4KSA8IFNJX01BWENPUkVTKQotI2RlZmluZQlOT1JFVgkJLTEJLyogSW52YWxpZCByZXYgKi8KLQotLyogTmV3ZXIgY2hpcHMgY2FuIGFjY2VzcyBQQ0kvUENJRSBhbmQgQ0MgY29yZSB3aXRob3V0IHJlcXVpcmluZyB0byBjaGFuZ2UKLSAqIFBDSSBCQVIwIFdJTgotICovCi0jZGVmaW5lIFNJX0ZBU1Qoc2kpICgoKHNpKS0+cHViLmJ1c2NvcmV0eXBlID09IFBDSUVfQ09SRV9JRCkgfHwJXAotCQkgICAgICgoKHNpKS0+cHViLmJ1c2NvcmV0eXBlID09IFBDSV9DT1JFX0lEKSAmJiBcCi0JCSAgICAgIChzaSktPnB1Yi5idXNjb3JlcmV2ID49IDEzKSkKLQotI2RlZmluZSBQQ0lFUkVHUyhzaSkgKCgoY2hhciAqKSgoc2kpLT5jdXJtYXApICsgUENJXzE2S0IwX1BDSVJFR1NfT0ZGU0VUKSkKLSNkZWZpbmUgQ0NSRUdTX0ZBU1Qoc2kpICgoKGNoYXIgKikoKHNpKS0+Y3VybWFwKSArIFBDSV8xNktCMF9DQ1JFR1NfT0ZGU0VUKSkKLQotLyoKLSAqIE1hY3JvcyB0byBkaXNhYmxlL3Jlc3RvcmUgZnVuY3Rpb24gY29yZShEMTEsIEVORVQsIElMSU5FMjAsIGV0YykgaW50ZXJydXB0cwotICogYmVmb3JlIGFmdGVyIGNvcmUgc3dpdGNoaW5nIHRvIGF2b2lkIGludmFsaWQgcmVnaXN0ZXIgYWNjZXNzcyBpbnNpZGUgSVNSLgotICovCi0jZGVmaW5lIElOVFJfT0ZGKHNpLCBpbnRyX3ZhbCkgXAotCWlmICgoc2kpLT5pbnRyc29mZl9mbiAmJiBcCi0JICAgIChzaSktPmNvcmVpZFsoc2kpLT5jdXJpZHhdID09IChzaSktPmRldl9jb3JlaWQpIFwKLQkJaW50cl92YWwgPSAoKihzaSktPmludHJzb2ZmX2ZuKSgoc2kpLT5pbnRyX2FyZykKLSNkZWZpbmUgSU5UUl9SRVNUT1JFKHNpLCBpbnRyX3ZhbCkgXAotCWlmICgoc2kpLT5pbnRyc3Jlc3RvcmVfZm4gJiYgXAotCSAgICAoc2kpLT5jb3JlaWRbKHNpKS0+Y3VyaWR4XSA9PSAoc2kpLT5kZXZfY29yZWlkKSBcCi0JCSgqKHNpKS0+aW50cnNyZXN0b3JlX2ZuKSgoc2kpLT5pbnRyX2FyZywgaW50cl92YWwpCi0KLS8qIGR5bmFtaWMgY2xvY2sgY29udHJvbCBkZWZpbmVzICovCi0jZGVmaW5lCUxQT01JTkZSRVEJCTI1MDAwCS8qIGxvdyBwb3dlciBvc2NpbGxhdG9yIG1pbiAqLwotI2RlZmluZQlMUE9NQVhGUkVRCQk0MzAwMAkvKiBsb3cgcG93ZXIgb3NjaWxsYXRvciBtYXggKi8KLSNkZWZpbmUJWFRBTE1JTkZSRVEJCTE5ODAwMDAwCS8qIDIwIE1IeiAtIDElICovCi0jZGVmaW5lCVhUQUxNQVhGUkVRCQkyMDIwMDAwMAkvKiAyMCBNSHogKyAxJSAqLwotI2RlZmluZQlQQ0lNSU5GUkVRCQkyNTAwMDAwMAkvKiAyNSBNSHogKi8KLSNkZWZpbmUJUENJTUFYRlJFUQkJMzQwMDAwMDAJLyogMzMgTUh6ICsgZnVkZ2UgKi8KLQotI2RlZmluZQlJTFBfRElWXzVNSFoJCTAJLyogSUxQID0gNSBNSHogKi8KLSNkZWZpbmUJSUxQX0RJVl8xTUhaCQk0CS8qIElMUCA9IDEgTUh6ICovCi0KLSNkZWZpbmUgUENJKHNpKQkJKCgoc2kpLT5wdWIuYnVzdHlwZSA9PSBQQ0lfQlVTKSAmJglcCi0JCQkgKChzaSktPnB1Yi5idXNjb3JldHlwZSA9PSBQQ0lfQ09SRV9JRCkpCi0jZGVmaW5lIFBDSUUoc2kpCSgoKHNpKS0+cHViLmJ1c3R5cGUgPT0gUENJX0JVUykgJiYJXAotCQkJICgoc2kpLT5wdWIuYnVzY29yZXR5cGUgPT0gUENJRV9DT1JFX0lEKSkKLSNkZWZpbmUgUENJX0ZPUkNFSFQoc2kpCVwKLQkoUENJRShzaSkgJiYgKHNpLT5wdWIuY2hpcCA9PSBCQ000NzE2X0NISVBfSUQpKQotCi0vKiBHUElPIEJhc2VkIExFRCBwb3dlcnNhdmUgZGVmaW5lcyAqLwotI2RlZmluZSBERUZBVUxUX0dQSU9fT05USU1FCTEwCS8qIERlZmF1bHQ6IDEwJSBvbiAqLwotI2RlZmluZSBERUZBVUxUX0dQSU9fT0ZGVElNRQk5MAkvKiBEZWZhdWx0OiAxMCUgb24gKi8KLQotI2lmbmRlZiBERUZBVUxUX0dQSU9USU1FUlZBTAotI2RlZmluZSBERUZBVUxUX0dQSU9USU1FUlZBTCBcCi0JKChERUZBVUxUX0dQSU9fT05USU1FIDw8IEdQSU9fT05USU1FX1NISUZUKSB8IERFRkFVTFRfR1BJT19PRkZUSU1FKQotI2VuZGlmCi0KLS8qCi0gKiBEYXRhIHN0cnVjdHVyZSB0byBleHBvcnQgYWxsIGNoaXAgc3BlY2lmaWMgY29tbW9uIHZhcmlhYmxlcwotICogICBwdWJsaWMgKHJlYWQtb25seSkgcG9ydGlvbiBvZiBhaXV0aWxzIGhhbmRsZSByZXR1cm5lZCBieSBzaV9hdHRhY2goKQotICovCi1zdHJ1Y3Qgc2lfcHViIHsKLQl1aW50IGJ1c3R5cGU7CQkvKiBTSV9CVVMsIFBDSV9CVVMgKi8KLQl1aW50IGJ1c2NvcmV0eXBlOwkvKiBQQ0lfQ09SRV9JRCwgUENJRV9DT1JFX0lELCBQQ01DSUFfQ09SRV9JRCAqLwotCXVpbnQgYnVzY29yZXJldjsJLyogYnVzY29yZSByZXYgKi8KLQl1aW50IGJ1c2NvcmVpZHg7CS8qIGJ1c2NvcmUgaW5kZXggKi8KLQlpbnQgY2NyZXY7CQkvKiBjaGlwIGNvbW1vbiBjb3JlIHJldiAqLwotCXUzMiBjY2NhcHM7CQkvKiBjaGlwIGNvbW1vbiBjYXBhYmlsaXRpZXMgKi8KLQl1MzIgY2NjYXBzX2V4dDsJLyogY2hpcCBjb21tb24gY2FwYWJpbGl0aWVzIGV4dGVuc2lvbiAqLwotCWludCBwbXVyZXY7CQkvKiBwbXUgY29yZSByZXYgKi8KLQl1MzIgcG11Y2FwczsJCS8qIHBtdSBjYXBhYmlsaXRpZXMgKi8KLQl1aW50IGJvYXJkdHlwZTsJCS8qIGJvYXJkIHR5cGUgKi8KLQl1aW50IGJvYXJkdmVuZG9yOwkvKiBib2FyZCB2ZW5kb3IgKi8KLQl1aW50IGJvYXJkZmxhZ3M7CS8qIGJvYXJkIGZsYWdzICovCi0JdWludCBib2FyZGZsYWdzMjsJLyogYm9hcmQgZmxhZ3MyICovCi0JdWludCBjaGlwOwkJLyogY2hpcCBudW1iZXIgKi8KLQl1aW50IGNoaXByZXY7CQkvKiBjaGlwIHJldmlzaW9uICovCi0JdWludCBjaGlwcGtnOwkJLyogY2hpcCBwYWNrYWdlIG9wdGlvbiAqLwotCXUzMiBjaGlwc3Q7CQkvKiBjaGlwIHN0YXR1cyAqLwotCWJvb2wgaXNzaW07CQkvKiBjaGlwIGlzIGluIHNpbXVsYXRpb24gb3IgZW11bGF0aW9uICovCi0JdWludCBzb2NpcmV2OwkJLyogU09DIGludGVyY29ubmVjdCByZXYgKi8KLQlib29sIHBjaV9wcjMyNDE0OwotCi19OwotCi0vKgotICogTWFueSBvZiB0aGUgcm91dGluZXMgYmVsb3cgdGFrZSBhbiAnc2loJyBoYW5kbGUgYXMgdGhlaXIgZmlyc3QgYXJnLgotICogQWxsb2NhdGUgdGhpcyBieSBjYWxsaW5nIHNpX2F0dGFjaCgpLiAgRnJlZSBpdCBieSBjYWxsaW5nIHNpX2RldGFjaCgpLgotICogQXQgYW55IG9uZSB0aW1lLCB0aGUgc2loIGlzIGxvZ2ljYWxseSBmb2N1c2VkIG9uIG9uZSBwYXJ0aWN1bGFyIHNpIGNvcmUKLSAqICh0aGUgImN1cnJlbnQgY29yZSIpLgotICogVXNlIHNpX3NldGNvcmUoKSBvciBzaV9zZXRjb3JlaWR4KCkgdG8gY2hhbmdlIHRoZSBhc3NvY2lhdGlvbiB0byBhbm90aGVyIGNvcmUKLSAqLwotCi0jZGVmaW5lCUJBRElEWAkJKFNJX01BWENPUkVTICsgMSkKLQotLyogY2xrY3RsIHh0YWwgd2hhdCBmbGFncyAqLwotI2RlZmluZQlYVEFMCQkJMHgxCS8qIHByaW1hcnkgY3J5c3RhbCBvc2NpbGxhdG9yICgyMDUwKSAqLwotI2RlZmluZQlQTEwJCQkweDIJLyogbWFpbiBjaGlwIHBsbCAqLwotCi0vKiBjbGtjdGwgY2xrIG1vZGUgKi8KLSNkZWZpbmUJQ0xLX0ZBU1QJCTAJLyogZm9yY2UgZmFzdCAocGxsKSBjbG9jayAqLwotI2RlZmluZQlDTEtfRFlOQU1JQwkJMgkvKiBlbmFibGUgZHluYW1pYyBjbG9jayBjb250cm9sICovCi0KLS8qIEdQSU8gdXNhZ2UgcHJpb3JpdGllcyAqLwotI2RlZmluZSBHUElPX0RSVl9QUklPUklUWQkwCS8qIERyaXZlciAqLwotI2RlZmluZSBHUElPX0FQUF9QUklPUklUWQkxCS8qIEFwcGxpY2F0aW9uICovCi0jZGVmaW5lIEdQSU9fSElfUFJJT1JJVFkJMgkvKiBIaWdoZXN0IHByaW9yaXR5LiBJZ25vcmUgR1BJTwotCQkJCQkgKiByZXNlcnZhdGlvbgotCQkJCQkgKi8KLQotLyogR1BJTyBwdWxsIHVwL2Rvd24gKi8KLSNkZWZpbmUgR1BJT19QVUxMVVAJCTAKLSNkZWZpbmUgR1BJT19QVUxMRE4JCTEKLQotLyogR1BJTyBldmVudCByZWd0eXBlICovCi0jZGVmaW5lIEdQSU9fUkVHRVZUCQkwCS8qIEdQSU8gcmVnaXN0ZXIgZXZlbnQgKi8KLSNkZWZpbmUgR1BJT19SRUdFVlRfSU5UTVNLCTEJLyogR1BJTyByZWdpc3RlciBldmVudCBpbnQgbWFzayAqLwotI2RlZmluZSBHUElPX1JFR0VWVF9JTlRQT0wJMgkvKiBHUElPIHJlZ2lzdGVyIGV2ZW50IGludCBwb2xhcml0eSAqLwotCi0vKiBkZXZpY2UgcGF0aCAqLwotI2RlZmluZSBTSV9ERVZQQVRIX0JVRlNaCTE2CS8qIG1pbiBidWZmZXIgc2l6ZSBpbiBieXRlcyAqLwotCi0vKiBTSSByb3V0aW5lIGVudW1lcmF0aW9uOiB0byBiZSB1c2VkIGJ5IHVwZGF0ZSBmdW5jdGlvbiB3aXRoIG11bHRpcGxlIGhvb2tzICovCi0jZGVmaW5lCVNJX0RPQVRUQUNICTEKLSNkZWZpbmUgU0lfUENJRE9XTgkyCi0jZGVmaW5lIFNJX1BDSVVQCTMKLQotLyogUE1VIGNsb2NrL3Bvd2VyIGNvbnRyb2wgKi8KLSNpZiBkZWZpbmVkKEJDTVBNVUNUTCkKLSNkZWZpbmUgUE1VQ1RMX0VOQUIoc2loKQkoQkNNUE1VQ1RMKQotI2Vsc2UKLSNkZWZpbmUgUE1VQ1RMX0VOQUIoc2loKQkoKHNpaCktPmNjY2FwcyAmIENDX0NBUF9QTVUpCi0jZW5kaWYKLQotLyogY2hpcGNvbW1vbiBjbG9jay9wb3dlciBjb250cm9sIChleGNsdXNpdmUgd2l0aCBQTVUncykgKi8KLSNpZiBkZWZpbmVkKEJDTVBNVUNUTCkgJiYgQkNNUE1VQ1RMCi0jZGVmaW5lIENDQ1RMX0VOQUIoc2loKQkJKDApCi0jZGVmaW5lIENDUExMX0VOQUIoc2loKQkJKDApCi0jZWxzZQotI2RlZmluZSBDQ0NUTF9FTkFCKHNpaCkJCSgoc2loKS0+Y2NjYXBzICYgQ0NfQ0FQX1BXUl9DVEwpCi0jZGVmaW5lIENDUExMX0VOQUIoc2loKQkJKChzaWgpLT5jY2NhcHMgJiBDQ19DQVBfUExMX01BU0spCi0jZW5kaWYKLQotdHlwZWRlZiB2b2lkICgqZ3Bpb19oYW5kbGVyX3QpICh1MzIgc3RhdCwgdm9pZCAqYXJnKTsKLQotLyogRXh0ZXJuYWwgUEEgZW5hYmxlIG1hc2sgKi8KLSNkZWZpbmUgR1BJT19DVFJMX0VQQV9FTl9NQVNLIDB4NDAKLQotI2RlZmluZQlTSV9FUlJPUihhcmdzKQotCi0jaWZkZWYgQkNNREJHCi0jZGVmaW5lCVNJX01TRyhhcmdzKQlwcmludGsgYXJncwotI2Vsc2UKLSNkZWZpbmUJU0lfTVNHKGFyZ3MpCi0jZW5kaWYJCQkJLyogQkNNREJHICovCi0KLS8qIERlZmluZSBTSV9WTVNHIHRvIHByaW50ZiBmb3IgdmVyYm9zZSBkZWJ1Z2dpbmcsIGJ1dCBkb24ndCBjaGVjayBpdCBpbiAqLwotI2RlZmluZQlTSV9WTVNHKGFyZ3MpCi0KLSNkZWZpbmUJSVNfU0lNKGNoaXBwa2cpCVwKLQkoKGNoaXBwa2cgPT0gSERMU0lNX1BLR19JRCkgfHwgKGNoaXBwa2cgPT0gSFdTSU1fUEtHX0lEKSkKLQotdHlwZWRlZiB1MzIoKnNpX2ludHJzb2ZmX3QpICh2b2lkICppbnRyX2FyZyk7Ci10eXBlZGVmIHZvaWQgKCpzaV9pbnRyc3Jlc3RvcmVfdCkgKHZvaWQgKmludHJfYXJnLCB1MzIgYXJnKTsKLXR5cGVkZWYgYm9vbCgqc2lfaW50cnNlbmFibGVkX3QpICh2b2lkICppbnRyX2FyZyk7Ci0KLXN0cnVjdCBncGlvaF9pdGVtIHsKLQl2b2lkICphcmc7Ci0JYm9vbCBsZXZlbDsKLQlncGlvX2hhbmRsZXJfdCBoYW5kbGVyOwotCXUzMiBldmVudDsKLQlzdHJ1Y3QgZ3Bpb2hfaXRlbSAqbmV4dDsKLX07Ci0KLS8qIG1pc2Mgc2kgaW5mbyBuZWVkZWQgYnkgc29tZSBvZiB0aGUgcm91dGluZXMgKi8KLXN0cnVjdCBzaV9pbmZvIHsKLQlzdHJ1Y3Qgc2lfcHViIHB1YjsJLyogYmFjayBwbGFuZSBwdWJsaWMgc3RhdGUgKG11c3QgYmUgZmlyc3QpICovCi0Jdm9pZCAqcGJ1czsJCS8qIGhhbmRsZSB0byBidXMgKHBjaS9zZGlvLy4uKSAqLwotCXVpbnQgZGV2X2NvcmVpZDsJLyogdGhlIGNvcmUgcHJvdmlkZXMgZHJpdmVyIGZ1bmN0aW9ucyAqLwotCXZvaWQgKmludHJfYXJnOwkJLyogaW50ZXJydXB0IGNhbGxiYWNrIGZ1bmN0aW9uIGFyZyAqLwotCXNpX2ludHJzb2ZmX3QgaW50cnNvZmZfZm47CS8qIHR1cm5zIGNoaXAgaW50ZXJydXB0cyBvZmYgKi8KLQlzaV9pbnRyc3Jlc3RvcmVfdCBpbnRyc3Jlc3RvcmVfZm47IC8qIHJlc3RvcmUgY2hpcCBpbnRlcnJ1cHRzICovCi0Jc2lfaW50cnNlbmFibGVkX3QgaW50cnNlbmFibGVkX2ZuOyAvKiBjaGVjayBpZiBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkICovCi0KLQl2b2lkICpwY2g7CQkvKiBQQ0kvRSBjb3JlIGhhbmRsZSAqLwotCi0JY2hhciAqdmFyczsKLQl1aW50IHZhcnN6OwotCi0Jdm9pZCAqY3VybWFwOwkJLyogY3VycmVudCByZWdzIHZhICovCi0Jdm9pZCAqcmVnc1tTSV9NQVhDT1JFU107CS8qIG90aGVyIHJlZ3MgdmEgKi8KLQotCXVpbnQgY3VyaWR4OwkJLyogY3VycmVudCBjb3JlIGluZGV4ICovCi0JdWludCBudW1jb3JlczsJCS8qICMgZGlzY292ZXJlZCBjb3JlcyAqLwotCXVpbnQgY29yZWlkW1NJX01BWENPUkVTXTsgLyogaWQgb2YgZWFjaCBjb3JlICovCi0JdTMyIGNvcmVzYmFbU0lfTUFYQ09SRVNdOyAvKiBiYWNrcGxhbmUgYWRkcmVzcyBvZiBlYWNoIGNvcmUgKi8KLQl2b2lkICpyZWdzMltTSV9NQVhDT1JFU107IC8qIDJuZCB2aXJ0dWFsIGFkZHJlc3MgcGVyIGNvcmUgKHVzYmgyMCkgKi8KLQl1MzIgY29yZXNiYTJbU0lfTUFYQ09SRVNdOyAvKiAybmQgcGh5cyBhZGRyZXNzIHBlciBjb3JlICh1c2JoMjApICovCi0JdTMyIGNvcmVzYmFfc2l6ZVtTSV9NQVhDT1JFU107IC8qIGJhY2twbGFuZSBhZGRyZXNzIHNwYWNlIHNpemUgKi8KLQl1MzIgY29yZXNiYTJfc2l6ZVtTSV9NQVhDT1JFU107CS8qIHNlY29uZCBhZGRyZXNzIHNwYWNlIHNpemUgKi8KLQotCXZvaWQgKmN1cndyYXA7CQkvKiBjdXJyZW50IHdyYXBwZXIgdmEgKi8KLQl2b2lkICp3cmFwcGVyc1tTSV9NQVhDT1JFU107CS8qIG90aGVyIGNvcmVzIHdyYXBwZXIgdmEgKi8KLQl1MzIgd3JhcGJhW1NJX01BWENPUkVTXTsJLyogYWRkcmVzcyBvZiBjb250cm9sbGluZyB3cmFwcGVyICovCi0KLQl1MzIgY2lhW1NJX01BWENPUkVTXTsJLyogZXJvbSBjaWEgZW50cnkgZm9yIGVhY2ggY29yZSAqLwotCXUzMiBjaWJbU0lfTUFYQ09SRVNdOwkvKiBlcm9tIGNpYSBlbnRyeSBmb3IgZWFjaCBjb3JlICovCi0JdTMyIG9vYl9yb3V0ZXI7CS8qIG9vYiByb3V0ZXIgcmVnaXN0ZXJzIGZvciBheGkgKi8KLX07Ci0KLS8qIEFNQkEgSW50ZXJjb25uZWN0IGV4cG9ydGVkIGV4dGVybnMgKi8KLWV4dGVybiB2b2lkIGFpX3NjYW4oc3RydWN0IHNpX3B1YiAqc2loLCB2b2lkICpyZWdzKTsKLQotZXh0ZXJuIHVpbnQgYWlfZmxhZyhzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHZvaWQgYWlfc2V0aW50KHN0cnVjdCBzaV9wdWIgKnNpaCwgaW50IHNpZmxhZyk7Ci1leHRlcm4gdWludCBhaV9jb3JlaWR4KHN0cnVjdCBzaV9wdWIgKnNpaCk7Ci1leHRlcm4gdWludCBhaV9jb3JldmVuZG9yKHN0cnVjdCBzaV9wdWIgKnNpaCk7Ci1leHRlcm4gdWludCBhaV9jb3JlcmV2KHN0cnVjdCBzaV9wdWIgKnNpaCk7Ci1leHRlcm4gYm9vbCBhaV9pc2NvcmV1cChzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHZvaWQgKmFpX3NldGNvcmVpZHgoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGNvcmVpZHgpOwotZXh0ZXJuIHUzMiBhaV9jb3JlX2NmbGFncyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHUzMiBtYXNrLCB1MzIgdmFsKTsKLWV4dGVybiB2b2lkIGFpX2NvcmVfY2ZsYWdzX3dvKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTMyIG1hc2ssIHUzMiB2YWwpOwotZXh0ZXJuIHUzMiBhaV9jb3JlX3NmbGFncyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHUzMiBtYXNrLCB1MzIgdmFsKTsKLWV4dGVybiB1aW50IGFpX2NvcmVyZWcoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGNvcmVpZHgsIHVpbnQgcmVnb2ZmLCB1aW50IG1hc2ssCi0JCSAgICAgICB1aW50IHZhbCk7Ci1leHRlcm4gdm9pZCBhaV9jb3JlX3Jlc2V0KHN0cnVjdCBzaV9wdWIgKnNpaCwgdTMyIGJpdHMsIHUzMiByZXNldGJpdHMpOwotZXh0ZXJuIHZvaWQgYWlfY29yZV9kaXNhYmxlKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTMyIGJpdHMpOwotZXh0ZXJuIGludCBhaV9udW1hZGRyc3BhY2VzKHN0cnVjdCBzaV9wdWIgKnNpaCk7Ci1leHRlcm4gdTMyIGFpX2FkZHJzcGFjZShzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgYXNpZHgpOwotZXh0ZXJuIHUzMiBhaV9hZGRyc3BhY2VzaXplKHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCBhc2lkeCk7Ci1leHRlcm4gdm9pZCBhaV93cml0ZV93cmFwX3JlZyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHUzMiBvZmZzZXQsIHUzMiB2YWwpOwotCi0vKiA9PT0gZXhwb3J0ZWQgZnVuY3Rpb25zID09PSAqLwotZXh0ZXJuIHN0cnVjdCBzaV9wdWIgKmFpX2F0dGFjaCh2b2lkICpyZWdzLCB1aW50IGJ1c3R5cGUsCi0JCSAgICAgICB2b2lkICpzZGgsIGNoYXIgKip2YXJzLCB1aW50ICp2YXJzeik7Ci0KLWV4dGVybiB2b2lkIGFpX2RldGFjaChzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIGJvb2wgYWlfcGNpX3dhcjE2MTY1KHN0cnVjdCBzaV9wdWIgKnNpaCk7Ci0KLWV4dGVybiB1aW50IGFpX2NvcmVpZChzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHVpbnQgYWlfY29yZXJldihzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHVpbnQgYWlfY29yZXJlZyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgY29yZWlkeCwgdWludCByZWdvZmYsIHVpbnQgbWFzaywKLQkJdWludCB2YWwpOwotZXh0ZXJuIHZvaWQgYWlfd3JpdGVfd3JhcHBlcnJlZyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHUzMiBvZmZzZXQsIHUzMiB2YWwpOwotZXh0ZXJuIHUzMiBhaV9jb3JlX2NmbGFncyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHUzMiBtYXNrLCB1MzIgdmFsKTsKLWV4dGVybiB1MzIgYWlfY29yZV9zZmxhZ3Moc3RydWN0IHNpX3B1YiAqc2loLCB1MzIgbWFzaywgdTMyIHZhbCk7Ci1leHRlcm4gYm9vbCBhaV9pc2NvcmV1cChzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHVpbnQgYWlfZmluZGNvcmVpZHgoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGNvcmVpZCwgdWludCBjb3JldW5pdCk7Ci1leHRlcm4gdm9pZCAqYWlfc2V0Y29yZWlkeChzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgY29yZWlkeCk7Ci1leHRlcm4gdm9pZCAqYWlfc2V0Y29yZShzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgY29yZWlkLCB1aW50IGNvcmV1bml0KTsKLWV4dGVybiB2b2lkICphaV9zd2l0Y2hfY29yZShzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgY29yZWlkLCB1aW50ICpvcmlnaWR4LAotCQkJICAgIHVpbnQgKmludHJfdmFsKTsKLWV4dGVybiB2b2lkIGFpX3Jlc3RvcmVfY29yZShzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgY29yZWlkLCB1aW50IGludHJfdmFsKTsKLWV4dGVybiB2b2lkIGFpX2NvcmVfcmVzZXQoc3RydWN0IHNpX3B1YiAqc2loLCB1MzIgYml0cywgdTMyIHJlc2V0Yml0cyk7Ci1leHRlcm4gdm9pZCBhaV9jb3JlX2Rpc2FibGUoc3RydWN0IHNpX3B1YiAqc2loLCB1MzIgYml0cyk7Ci1leHRlcm4gdTMyIGFpX2FscF9jbG9jayhzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHUzMiBhaV9pbHBfY2xvY2soc3RydWN0IHNpX3B1YiAqc2loKTsKLWV4dGVybiB2b2lkIGFpX3BjaV9zZXR1cChzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgY29yZW1hc2spOwotZXh0ZXJuIHZvaWQgYWlfc2V0aW50KHN0cnVjdCBzaV9wdWIgKnNpaCwgaW50IHNpZmxhZyk7Ci1leHRlcm4gYm9vbCBhaV9iYWNrcGxhbmU2NChzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHZvaWQgYWlfcmVnaXN0ZXJfaW50cl9jYWxsYmFjayhzdHJ1Y3Qgc2lfcHViICpzaWgsIHZvaWQgKmludHJzb2ZmX2ZuLAotCQkJCSAgICAgIHZvaWQgKmludHJzcmVzdG9yZV9mbiwKLQkJCQkgICAgICB2b2lkICppbnRyc2VuYWJsZWRfZm4sIHZvaWQgKmludHJfYXJnKTsKLWV4dGVybiB2b2lkIGFpX2RlcmVnaXN0ZXJfaW50cl9jYWxsYmFjayhzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHZvaWQgYWlfY2xrY3RsX2luaXQoc3RydWN0IHNpX3B1YiAqc2loKTsKLWV4dGVybiB1MTYgYWlfY2xrY3RsX2Zhc3RfcHdydXBfZGVsYXkoc3RydWN0IHNpX3B1YiAqc2loKTsKLWV4dGVybiBib29sIGFpX2Nsa2N0bF9jYyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgbW9kZSk7Ci1leHRlcm4gaW50IGFpX2Nsa2N0bF94dGFsKHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCB3aGF0LCBib29sIG9uKTsKLWV4dGVybiBib29sIGFpX2RldmljZXJlbW92ZWQoc3RydWN0IHNpX3B1YiAqc2loKTsKLWV4dGVybiB1MzIgYWlfZ3Bpb2NvbnRyb2woc3RydWN0IHNpX3B1YiAqc2loLCB1MzIgbWFzaywgdTMyIHZhbCwKLQkJCSAgICAgdTggcHJpb3JpdHkpOwotCi0vKiBPVFAgc3RhdHVzICovCi1leHRlcm4gYm9vbCBhaV9pc19vdHBfZGlzYWJsZWQoc3RydWN0IHNpX3B1YiAqc2loKTsKLQotLyogU1BST00gYXZhaWxhYmlsaXR5ICovCi1leHRlcm4gYm9vbCBhaV9pc19zcHJvbV9hdmFpbGFibGUoc3RydWN0IHNpX3B1YiAqc2loKTsKLQotLyoKLSAqIEJ1aWxkIGRldmljZSBwYXRoLiBQYXRoIHNpemUgbXVzdCBiZSA+PSBTSV9ERVZQQVRIX0JVRlNaLgotICogVGhlIHJldHVybmVkIHBhdGggaXMgTlVMTCB0ZXJtaW5hdGVkIGFuZCBoYXMgdHJhaWxpbmcgJy8nLgotICogUmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uemVybyBvdGhlcndpc2UuCi0gKi8KLWV4dGVybiBpbnQgYWlfZGV2cGF0aChzdHJ1Y3Qgc2lfcHViICpzaWgsIGNoYXIgKnBhdGgsIGludCBzaXplKTsKLS8qIFJlYWQgdmFyaWFibGUgd2l0aCBwcmVwZW5kaW5nIHRoZSBkZXZwYXRoIHRvIHRoZSBuYW1lICovCi1leHRlcm4gY2hhciAqYWlfZ2V0ZGV2cGF0aHZhcihzdHJ1Y3Qgc2lfcHViICpzaWgsIGNvbnN0IGNoYXIgKm5hbWUpOwotZXh0ZXJuIGludCBhaV9nZXRkZXZwYXRoaW50dmFyKHN0cnVjdCBzaV9wdWIgKnNpaCwgY29uc3QgY2hhciAqbmFtZSk7Ci0KLWV4dGVybiB2b2lkIGFpX3BjaV9zbGVlcChzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHZvaWQgYWlfcGNpX2Rvd24oc3RydWN0IHNpX3B1YiAqc2loKTsKLWV4dGVybiB2b2lkIGFpX3BjaV91cChzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIGludCBhaV9wY2lfZml4Y2ZnKHN0cnVjdCBzaV9wdWIgKnNpaCk7Ci0KLWV4dGVybiB2b2lkIGFpX2NoaXBjb250cmxfZXBhNDMzMShzdHJ1Y3Qgc2lfcHViICpzaWgsIGJvb2wgb24pOwotLyogRW5hYmxlIEV4LVBBIGZvciA0MzEzICovCi1leHRlcm4gdm9pZCBhaV9lcGFfNDMxM3dhcihzdHJ1Y3Qgc2lfcHViICpzaWgpOwotCi1jaGFyICphaV9nZXRudnJhbWZsdmFyKHN0cnVjdCBzaV9wdWIgKnNpaCwgY29uc3QgY2hhciAqbmFtZSk7Ci0KLSNlbmRpZgkJCQkvKiBfQlJDTV9BSVVUSUxTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL2FsbG9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL2FsbG9jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmOGRkN2IuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9hbGxvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSA8YnJjbXVfdXRpbHMuaD4KLSNpbmNsdWRlICJ0eXBlcy5oIgotI2luY2x1ZGUgInB1Yi5oIgotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJhbGxvYy5oIgotCi1zdGF0aWMgc3RydWN0IGJyY21zX2Jzc19jZmcgKmJyY21zX2NfYnNzY2ZnX21hbGxvYyh1aW50IHVuaXQpOwotc3RhdGljIHZvaWQgYnJjbXNfY19ic3NjZmdfbWZyZWUoc3RydWN0IGJyY21zX2Jzc19jZmcgKmNmZyk7Ci1zdGF0aWMgc3RydWN0IGJyY21zX3B1YiAqYnJjbXNfY19wdWJfbWFsbG9jKHVpbnQgdW5pdCwKLQkJCQkgICAgICB1aW50ICplcnIsIHVpbnQgZGV2aWQpOwotc3RhdGljIHZvaWQgYnJjbXNfY19wdWJfbWZyZWUoc3RydWN0IGJyY21zX3B1YiAqcHViKTsKLXN0YXRpYyB2b2lkIGJyY21zX2NfdHVuYWJsZXNfaW5pdChzdHJ1Y3QgYnJjbXNfdHVuYWJsZXMgKnR1bmFibGVzLCB1aW50IGRldmlkKTsKLQotc3RhdGljIHZvaWQgYnJjbXNfY190dW5hYmxlc19pbml0KHN0cnVjdCBicmNtc190dW5hYmxlcyAqdHVuYWJsZXMsIHVpbnQgZGV2aWQpCi17Ci0JdHVuYWJsZXMtPm50eGQgPSBOVFhEOwotCXR1bmFibGVzLT5ucnhkID0gTlJYRDsKLQl0dW5hYmxlcy0+cnhidWZzeiA9IFJYQlVGU1o7Ci0JdHVuYWJsZXMtPm5yeGJ1ZnBvc3QgPSBOUlhCVUZQT1NUOwotCXR1bmFibGVzLT5tYXhzY2IgPSBNQVhTQ0I7Ci0JdHVuYWJsZXMtPmFtcGR1bnVtbXBkdSA9IEFNUERVX05VTV9NUERVOwotCXR1bmFibGVzLT5tYXhwa3RjYiA9IE1BWFBLVENCOwotCXR1bmFibGVzLT5tYXh1Y29kZWJzcyA9IEJSQ01TX01BWF9VQ09ERV9CU1M7Ci0JdHVuYWJsZXMtPm1heHVjb2RlYnNzNCA9IEJSQ01TX01BWF9VQ09ERV9CU1M0OwotCXR1bmFibGVzLT5tYXhic3MgPSBNQVhCU1M7Ci0JdHVuYWJsZXMtPmRhdGFoaXdhdCA9IEJSQ01TX0RBVEFISVdBVDsKLQl0dW5hYmxlcy0+YW1wZHVkYXRhaGl3YXQgPSBCUkNNU19BTVBEVURBVEFISVdBVDsKLQl0dW5hYmxlcy0+cnhibmQgPSBSWEJORDsKLQl0dW5hYmxlcy0+dHhzYm5kID0gVFhTQk5EOwotfQotCi1zdGF0aWMgc3RydWN0IGJyY21zX3B1YiAqYnJjbXNfY19wdWJfbWFsbG9jKHVpbnQgdW5pdCwgdWludCAqZXJyLCB1aW50IGRldmlkKQotewotCXN0cnVjdCBicmNtc19wdWIgKnB1YjsKLQotCXB1YiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicmNtc19wdWIpLCBHRlBfQVRPTUlDKTsKLQlpZiAocHViID09IE5VTEwpIHsKLQkJKmVyciA9IDEwMDE7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlwdWItPnR1bmFibGVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJyY21zX3R1bmFibGVzKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHB1Yi0+dHVuYWJsZXMgPT0gTlVMTCkgewotCQkqZXJyID0gMTAyODsKLQkJZ290byBmYWlsOwotCX0KLQotCS8qIG5lZWQgdG8gaW5pdCB0aGUgdHVuYWJsZXMgbm93ICovCi0JYnJjbXNfY190dW5hYmxlc19pbml0KHB1Yi0+dHVuYWJsZXMsIGRldmlkKTsKLQotCXB1Yi0+bXVsdGljYXN0ID0ga3phbGxvYyhFVEhfQUxFTiAqIE1BWE1VTFRJTElTVCwgR0ZQX0FUT01JQyk7Ci0JaWYgKHB1Yi0+bXVsdGljYXN0ID09IE5VTEwpIHsKLQkJKmVyciA9IDEwMDM7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlyZXR1cm4gcHViOwotCi0gZmFpbDoKLQlicmNtc19jX3B1Yl9tZnJlZShwdWIpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBicmNtc19jX3B1Yl9tZnJlZShzdHJ1Y3QgYnJjbXNfcHViICpwdWIpCi17Ci0JaWYgKHB1YiA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlrZnJlZShwdWItPm11bHRpY2FzdCk7Ci0Ja2ZyZWUocHViLT50dW5hYmxlcyk7Ci0Ja2ZyZWUocHViKTsKLX0KLQotc3RhdGljIHN0cnVjdCBicmNtc19ic3NfY2ZnICpicmNtc19jX2Jzc2NmZ19tYWxsb2ModWludCB1bml0KQotewotCXN0cnVjdCBicmNtc19ic3NfY2ZnICpjZmc7Ci0KLQljZmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnJjbXNfYnNzX2NmZyksIEdGUF9BVE9NSUMpOwotCWlmIChjZmcgPT0gTlVMTCkKLQkJZ290byBmYWlsOwotCi0JY2ZnLT5jdXJyZW50X2JzcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicmNtc19ic3NfaW5mbyksIEdGUF9BVE9NSUMpOwotCWlmIChjZmctPmN1cnJlbnRfYnNzID09IE5VTEwpCi0JCWdvdG8gZmFpbDsKLQotCXJldHVybiBjZmc7Ci0KLSBmYWlsOgotCWJyY21zX2NfYnNzY2ZnX21mcmVlKGNmZyk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21zX2NfYnNzY2ZnX21mcmVlKHN0cnVjdCBicmNtc19ic3NfY2ZnICpjZmcpCi17Ci0JaWYgKGNmZyA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlrZnJlZShjZmctPm1hY2xpc3QpOwotCWtmcmVlKGNmZy0+Y3VycmVudF9ic3MpOwotCWtmcmVlKGNmZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21zX2NfYnNzY2ZnX0lEX2Fzc2lnbihzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsCi0JCQkJIHN0cnVjdCBicmNtc19ic3NfY2ZnICpic3NjZmcpCi17Ci0JYnNzY2ZnLT5JRCA9IHdsYy0+bmV4dF9ic3NjZmdfSUQ7Ci0Jd2xjLT5uZXh0X2Jzc2NmZ19JRCsrOwotfQotCi0vKgotICogVGhlIGNvbW1vbiBkcml2ZXIgZW50cnkgcm91dGluZS4gRXJyb3IgY29kZXMgc2hvdWxkIGJlIHVuaXF1ZQotICovCi1zdHJ1Y3QgYnJjbXNfY19pbmZvICpicmNtc19jX2F0dGFjaF9tYWxsb2ModWludCB1bml0LCB1aW50ICplcnIsIHVpbnQgZGV2aWQpCi17Ci0Jc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjOwotCi0Jd2xjID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJyY21zX2NfaW5mbyksIEdGUF9BVE9NSUMpOwotCWlmICh3bGMgPT0gTlVMTCkgewotCQkqZXJyID0gMTAwMjsKLQkJZ290byBmYWlsOwotCX0KLQotCS8qIGFsbG9jYXRlIHN0cnVjdCBicmNtc19jX3B1YiBzdGF0ZSBzdHJ1Y3R1cmUgKi8KLQl3bGMtPnB1YiA9IGJyY21zX2NfcHViX21hbGxvYyh1bml0LCBlcnIsIGRldmlkKTsKLQlpZiAod2xjLT5wdWIgPT0gTlVMTCkgewotCQkqZXJyID0gMTAwMzsKLQkJZ290byBmYWlsOwotCX0KLQl3bGMtPnB1Yi0+d2xjID0gd2xjOwotCi0JLyogYWxsb2NhdGUgc3RydWN0IGJyY21zX2hhcmR3YXJlIHN0YXRlIHN0cnVjdHVyZSAqLwotCi0Jd2xjLT5odyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicmNtc19oYXJkd2FyZSksIEdGUF9BVE9NSUMpOwotCWlmICh3bGMtPmh3ID09IE5VTEwpIHsKLQkJKmVyciA9IDEwMDU7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0Jd2xjLT5ody0+d2xjID0gd2xjOwotCi0Jd2xjLT5ody0+YmFuZHN0YXRlWzBdID0KLQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IGJyY21zX2h3X2JhbmQpICogTUFYQkFORFMsIEdGUF9BVE9NSUMpOwotCWlmICh3bGMtPmh3LT5iYW5kc3RhdGVbMF0gPT0gTlVMTCkgewotCQkqZXJyID0gMTAwNjsKLQkJZ290byBmYWlsOwotCX0gZWxzZSB7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDE7IGkgPCBNQVhCQU5EUzsgaSsrKSB7Ci0JCQl3bGMtPmh3LT5iYW5kc3RhdGVbaV0gPSAoc3RydWN0IGJyY21zX2h3X2JhbmQgKikKLQkJCSAgICAoKHVuc2lnbmVkIGxvbmcpd2xjLT5ody0+YmFuZHN0YXRlWzBdICsKLQkJCSAgICAgKHNpemVvZihzdHJ1Y3QgYnJjbXNfaHdfYmFuZCkgKiBpKSk7Ci0JCX0KLQl9Ci0KLQl3bGMtPm1vZHVsZWNiID0KLQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IG1vZHVsZWNiKSAqIEJSQ01TX01BWE1PRFVMRVMsIEdGUF9BVE9NSUMpOwotCWlmICh3bGMtPm1vZHVsZWNiID09IE5VTEwpIHsKLQkJKmVyciA9IDEwMDk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQl3bGMtPmRlZmF1bHRfYnNzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJyY21zX2Jzc19pbmZvKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHdsYy0+ZGVmYXVsdF9ic3MgPT0gTlVMTCkgewotCQkqZXJyID0gMTAxMDsKLQkJZ290byBmYWlsOwotCX0KLQotCXdsYy0+Y2ZnID0gYnJjbXNfY19ic3NjZmdfbWFsbG9jKHVuaXQpOwotCWlmICh3bGMtPmNmZyA9PSBOVUxMKSB7Ci0JCSplcnIgPSAxMDExOwotCQlnb3RvIGZhaWw7Ci0JfQotCWJyY21zX2NfYnNzY2ZnX0lEX2Fzc2lnbih3bGMsIHdsYy0+Y2ZnKTsKLQotCXdsYy0+d3NlY19kZWZfa2V5c1swXSA9Ci0JCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3c2VjX2tleSkgKiBCUkNNU19ERUZBVUxUX0tFWVMsCi0JCQlHRlBfQVRPTUlDKTsKLQlpZiAod2xjLT53c2VjX2RlZl9rZXlzWzBdID09IE5VTEwpIHsKLQkJKmVyciA9IDEwMTU7Ci0JCWdvdG8gZmFpbDsKLQl9IGVsc2UgewotCQlpbnQgaTsKLQkJZm9yIChpID0gMTsgaSA8IEJSQ01TX0RFRkFVTFRfS0VZUzsgaSsrKSB7Ci0JCQl3bGMtPndzZWNfZGVmX2tleXNbaV0gPSAoc3RydWN0IHdzZWNfa2V5ICopCi0JCQkgICAgKCh1bnNpZ25lZCBsb25nKXdsYy0+d3NlY19kZWZfa2V5c1swXSArCi0JCQkgICAgIChzaXplb2Yoc3RydWN0IHdzZWNfa2V5KSAqIGkpKTsKLQkJfQotCX0KLQotCXdsYy0+cHJvdGVjdGlvbiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicmNtc19wcm90ZWN0aW9uKSwKLQkJCQkgIEdGUF9BVE9NSUMpOwotCWlmICh3bGMtPnByb3RlY3Rpb24gPT0gTlVMTCkgewotCQkqZXJyID0gMTAxNjsKLQkJZ290byBmYWlsOwotCX0KLQotCXdsYy0+c3RmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJyY21zX3N0ZiksIEdGUF9BVE9NSUMpOwotCWlmICh3bGMtPnN0ZiA9PSBOVUxMKSB7Ci0JCSplcnIgPSAxMDE3OwotCQlnb3RvIGZhaWw7Ci0JfQotCi0Jd2xjLT5iYW5kc3RhdGVbMF0gPQotCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgYnJjbXNfYmFuZCkqTUFYQkFORFMsIEdGUF9BVE9NSUMpOwotCWlmICh3bGMtPmJhbmRzdGF0ZVswXSA9PSBOVUxMKSB7Ci0JCSplcnIgPSAxMDI1OwotCQlnb3RvIGZhaWw7Ci0JfSBlbHNlIHsKLQkJaW50IGk7Ci0KLQkJZm9yIChpID0gMTsgaSA8IE1BWEJBTkRTOyBpKyspIHsKLQkJCXdsYy0+YmFuZHN0YXRlW2ldID0gKHN0cnVjdCBicmNtc19iYW5kICopCi0JCQkJKCh1bnNpZ25lZCBsb25nKXdsYy0+YmFuZHN0YXRlWzBdCi0JCQkJKyAoc2l6ZW9mKHN0cnVjdCBicmNtc19iYW5kKSppKSk7Ci0JCX0KLQl9Ci0KLQl3bGMtPmNvcmVzdGF0ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicmNtc19jb3JlKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHdsYy0+Y29yZXN0YXRlID09IE5VTEwpIHsKLQkJKmVyciA9IDEwMjY7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQl3bGMtPmNvcmVzdGF0ZS0+bWFjc3RhdF9zbmFwc2hvdCA9Ci0JCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtYWNzdGF0KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHdsYy0+Y29yZXN0YXRlLT5tYWNzdGF0X3NuYXBzaG90ID09IE5VTEwpIHsKLQkJKmVyciA9IDEwMjc7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlyZXR1cm4gd2xjOwotCi0gZmFpbDoKLQlicmNtc19jX2RldGFjaF9tZnJlZSh3bGMpOwotCXJldHVybiBOVUxMOwotfQotCi12b2lkIGJyY21zX2NfZGV0YWNoX21mcmVlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlpZiAod2xjID09IE5VTEwpCi0JCXJldHVybjsKLQotCWJyY21zX2NfYnNzY2ZnX21mcmVlKHdsYy0+Y2ZnKTsKLQlicmNtc19jX3B1Yl9tZnJlZSh3bGMtPnB1Yik7Ci0Ja2ZyZWUod2xjLT5tb2R1bGVjYik7Ci0Ja2ZyZWUod2xjLT5kZWZhdWx0X2Jzcyk7Ci0Ja2ZyZWUod2xjLT53c2VjX2RlZl9rZXlzWzBdKTsKLQlrZnJlZSh3bGMtPnByb3RlY3Rpb24pOwotCWtmcmVlKHdsYy0+c3RmKTsKLQlrZnJlZSh3bGMtPmJhbmRzdGF0ZVswXSk7Ci0Ja2ZyZWUod2xjLT5jb3Jlc3RhdGUtPm1hY3N0YXRfc25hcHNob3QpOwotCWtmcmVlKHdsYy0+Y29yZXN0YXRlKTsKLQlrZnJlZSh3bGMtPmh3LT5iYW5kc3RhdGVbMF0pOwotCWtmcmVlKHdsYy0+aHcpOwotCi0JLyogZnJlZSB0aGUgd2xjICovCi0Ja2ZyZWUod2xjKTsKLQl3bGMgPSBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9hbGxvYy5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9hbGxvYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDY1ZDMwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvYWxsb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi1leHRlcm4gc3RydWN0IGJyY21zX2NfaW5mbyAqYnJjbXNfY19hdHRhY2hfbWFsbG9jKHVpbnQgdW5pdCwgdWludCAqZXJyLAotCQkJCQkJICB1aW50IGRldmlkKTsKLWV4dGVybiB2b2lkIGJyY21zX2NfZGV0YWNoX21mcmVlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL2FtcGR1LmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL2FtcGR1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYWY2MWUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9hbXBkdS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgInJhdGUuaCIKLSNpbmNsdWRlICJzY2IuaCIKLSNpbmNsdWRlICJwaHkvcGh5X2hhbC5oIgotI2luY2x1ZGUgImFudHNlbC5oIgotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJhbXBkdS5oIgotCi0jZGVmaW5lIEFNUERVX01BWF9NUERVCQkzMgkvKiBtYXggbnVtYmVyIG9mIG1wZHVzIGluIGFuIGFtcGR1ICovCi0jZGVmaW5lIEFNUERVX05VTV9NUERVX0xFR0FDWQkxNgkvKiBtYXggbnVtYmVyIG9mIG1wZHVzIGluIGFuIGFtcGR1IHRvIGEgbGVnYWN5ICovCi0jZGVmaW5lIEFNUERVX1RYX0JBX01BWF9XU0laRQk2NAkvKiBtYXggVHggYmEgd2luZG93IHNpemUgKGluIHBkdSkgKi8KLSNkZWZpbmUgQU1QRFVfVFhfQkFfREVGX1dTSVpFCTY0CS8qIGRlZmF1bHQgVHggYmEgd2luZG93IHNpemUgKGluIHBkdSkgKi8KLSNkZWZpbmUgQU1QRFVfUlhfQkFfREVGX1dTSVpFICAgNjQJLyogbWF4IFJ4IGJhIHdpbmRvdyBzaXplIChpbiBwZHUpICovCi0jZGVmaW5lIEFNUERVX1JYX0JBX01BWF9XU0laRSAgIDY0CS8qIGRlZmF1bHQgUnggYmEgd2luZG93IHNpemUgKGluIHBkdSkgKi8KLSNkZWZpbmUJQU1QRFVfTUFYX0RVUgkJNQkvKiBtYXggZHVyIG9mIHR4IGFtcGR1IChpbiBtc2VjKSAqLwotI2RlZmluZSBBTVBEVV9ERUZfUkVUUllfTElNSVQJNQkvKiBkZWZhdWx0IHR4IHJldHJ5IGxpbWl0ICovCi0jZGVmaW5lIEFNUERVX0RFRl9SUl9SRVRSWV9MSU1JVAkyCS8qIGRlZmF1bHQgdHggcmV0cnkgbGltaXQgYXQgcmVnIHJhdGUgKi8KLSNkZWZpbmUgQU1QRFVfREVGX1RYUEtUX1dFSUdIVAkyCS8qIGRlZmF1bHQgd2VpZ2h0IG9mIGFtcGR1IGluIHR4ZmlmbyAqLwotI2RlZmluZSBBTVBEVV9ERUZfRkZQTERfUlNWRAkyMDQ4CS8qIGRlZmF1bHQgZmZwbGQgcmVzZXJ2ZWQgYnl0ZXMgKi8KLSNkZWZpbmUgQU1QRFVfSU5JX0ZSRUUJCTEwCS8qICMgb2YgaW5pcyB0byBiZSBmcmVlZCBvbiBkZXRhY2ggKi8KLSNkZWZpbmUJQU1QRFVfU0NCX01BWF9SRUxFQVNFCTIwCS8qIG1heCAjIG9mIG1wZHVzIHJlbGVhc2VkIGF0IGEgdGltZSAqLwotCi0jZGVmaW5lIE5VTV9GRlBMRF9GSUZPIDQJLyogbnVtYmVyIG9mIGZpZm8gY29uY2VybmVkIGJ5IHByZS1sb2FkaW5nICovCi0jZGVmaW5lIEZGUExEX1RYX01BWF9VTkZMICAgMjAwCS8qIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGFtcGR1Ci0JCQkJICogd2l0aG91dCB1bmRlcmZsb3dzCi0JCQkJICovCi0jZGVmaW5lIEZGUExEX01QRFVfU0laRSAxODAwCS8qIGVzdGltYXRlIG9mIG1heGltdW0gbXBkdSBzaXplICovCi0jZGVmaW5lIEZGUExEX01BWF9NQ1MgMjMJLyogd2UgZG9uJ3QgZGVhbCB3aXRoIG1jcyAzMiAqLwotI2RlZmluZSBGRlBMRF9QTERfSU5DUiAxMDAwCS8qIGluY3JlbWVudHMgaW4gYnl0ZXMgKi8KLSNkZWZpbmUgRkZQTERfTUFYX0FNUERVX0NOVCA1MDAwCS8qIG1heGltdW0gbnVtYmVyIG9mIGFtcGR1IHdlCi0JCQkJCSAqIGFjY3VtdWxhdGUgYmV0d2VlbiByZXNldHMuCi0JCQkJCSAqLwotCi0jZGVmaW5lIFRYX1NFUV9UT19JTkRFWChzZXEpICgoc2VxKSAlIEFNUERVX1RYX0JBX01BWF9XU0laRSkKLQotLyogbWF4IHBvc3NpYmxlIG92ZXJoZWFkIHBlciBtcGR1IGluIHRoZSBhbXBkdTsgMyBpcyBmb3Igcm91bmR1cCBpZiBuZWVkZWQgKi8KLSNkZWZpbmUgQU1QRFVfTUFYX01QRFVfT1ZFUkhFQUQgKEZDU19MRU4gKyBET1QxMV9JQ1ZfQUVTX0xFTiArXAotCUFNUERVX0RFTElNSVRFUl9MRU4gKyAzXAotCSsgRE9UMTFfQTRfSERSX0xFTiArIERPVDExX1FPU19MRU4gKyBET1QxMV9JVl9NQVhfTEVOKQotCi0vKiBzdHJ1Y3R1cmUgdG8gaG9sZCB0eCBmaWZvIGluZm9ybWF0aW9uIGFuZCBwcmUtbG9hZGluZyBzdGF0ZQotICogY291bnRlcnMgc3BlY2lmaWMgdG8gdHggdW5kZXJmbG93cyBvZiBhbXBkdXMKLSAqIHNvbWUgY291bnRlcnMgbWlnaHQgYmUgcmVkdW5kYW50IHdpdGggdGhlIG9uZXMgaW4gd2xjIG9yIGFtcGR1IHN0cnVjdHVyZXMuCi0gKiBUaGlzIGFsbG93cyB0byBtYWludGFpbiBhIHNwZWNpZmljIHN0YXRlIGluZGVwZW5kZW50bHkgb2YKLSAqIGhvdyBvZnRlbiBhbmQvb3Igd2hlbiB0aGUgd2xjIGNvdW50ZXJzIGFyZSB1cGRhdGVkLgotICovCi1zdHJ1Y3QgYnJjbXNfZmlmb19pbmZvIHsKLQl1MTYgYW1wZHVfcGxkX3NpemU7CS8qIG51bWJlciBvZiBieXRlcyB0byBiZSBwcmUtbG9hZGVkICovCi0JdTggbWNzMmFtcGR1X3RhYmxlW0ZGUExEX01BWF9NQ1MgKyAxXTsJLyogcGVyLW1jcyBtYXggIyBvZiBtcGR1cyBpbiBhbiBhbXBkdSAqLwotCXUxNiBwcmV2X3R4ZnVuZmw7CS8qIG51bSBvZiB1bmRlcmZsb3dzIGxhc3QgcmVhZCBmcm9tIHRoZSBIVyBtYWNzdGF0cyBjb3VudGVyICovCi0JdTMyIGFjY3VtX3R4ZnVuZmw7CS8qIG51bSBvZiB1bmRlcmZsb3dzIHNpbmNlIHdlIG1vZGlmaWVkIHBsZCBwYXJhbXMgKi8KLQl1MzIgYWNjdW1fdHhhbXBkdTsJLyogbnVtIG9mIHR4IGFtcGR1IHNpbmNlIHdlIG1vZGlmaWVkIHBsZCBwYXJhbXMgICovCi0JdTMyIHByZXZfdHhhbXBkdTsJLyogcHJldmlvdXMgcmVhZGluZyBvZiB0eCBhbXBkdSAqLwotCXUzMiBkbWF4ZmVycmF0ZTsJLyogZXN0aW1hdGVkIGRtYSBhdmcgeGZlciByYXRlIGluIGtiaXRzL3NlYyAqLwotfTsKLQotLyogQU1QRFUgbW9kdWxlIHNwZWNpZmljIHN0YXRlICovCi1zdHJ1Y3QgYW1wZHVfaW5mbyB7Ci0Jc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjOwkvKiBwb2ludGVyIHRvIG1haW4gd2xjIHN0cnVjdHVyZSAqLwotCWludCBzY2JfaGFuZGxlOwkJLyogc2NiIGN1YmJ5IGhhbmRsZSB0byByZXRyaWV2ZSBkYXRhIGZyb20gc2NiICovCi0JdTggaW5pX2VuYWJsZVtBTVBEVV9NQVhfU0NCX1RJRF07CS8qIHBlci10aWQgaW5pdGlhdG9yIGVuYWJsZS9kaXNhYmxlIG9mIGFtcGR1ICovCi0JdTggYmFfdHhfd3NpemU7CS8qIFR4IGJhIHdpbmRvdyBzaXplIChpbiBwZHUpICovCi0JdTggYmFfcnhfd3NpemU7CS8qIFJ4IGJhIHdpbmRvdyBzaXplIChpbiBwZHUpICovCi0JdTggcmV0cnlfbGltaXQ7CS8qIG1wZHUgdHJhbnNtaXQgcmV0cnkgbGltaXQgKi8KLQl1OCBycl9yZXRyeV9saW1pdDsJLyogbXBkdSB0cmFuc21pdCByZXRyeSBsaW1pdCBhdCByZWd1bGFyIHJhdGUgKi8KLQl1OCByZXRyeV9saW1pdF90aWRbQU1QRFVfTUFYX1NDQl9USURdOwkvKiBwZXItdGlkIG1wZHUgdHJhbnNtaXQgcmV0cnkgbGltaXQgKi8KLQkvKiBwZXItdGlkIG1wZHUgdHJhbnNtaXQgcmV0cnkgbGltaXQgYXQgcmVndWxhciByYXRlICovCi0JdTggcnJfcmV0cnlfbGltaXRfdGlkW0FNUERVX01BWF9TQ0JfVElEXTsKLQl1OCBtcGR1X2RlbnNpdHk7CS8qIG1pbiBtcGR1IHNwYWNpbmcgKDAtNykgPT0+IDJeKHgtMSkvOCB1c2VjICovCi0JczggbWF4X3BkdTsJCS8qIG1heCBwZHVzIGFsbG93ZWQgaW4gYW1wZHUgKi8KLQl1OCBkdXI7CQkvKiBtYXggZHVyYXRpb24gb2YgYW4gYW1wZHUgKGluIG1zZWMpICovCi0JdTggdHhwa3Rfd2VpZ2h0OwkvKiB3ZWlnaHQgb2YgYW1wZHUgaW4gdHhmaWZvOyByZWR1Y2VzIHJhdGUgbGFnICovCi0JdTggcnhfZmFjdG9yOwkvKiBtYXhpbXVtIHJ4IGFtcGR1IGZhY3RvciAoMC0zKSA9PT4gMl4oMTMreCkgYnl0ZXMgKi8KLQl1MzIgZmZwbGRfcnN2ZDsJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHJlc2VydmUgZm9yIHByZWxvYWQgKi8KLQl1MzIgbWF4X3R4bGVuW01DU19UQUJMRV9TSVpFXVsyXVsyXTsJLyogbWF4IHNpemUgb2YgYW1wZHUgcGVyIG1jcywgYncgYW5kIHNnaSAqLwotCXZvaWQgKmluaV9mcmVlW0FNUERVX0lOSV9GUkVFXTsJLyogYXJyYXkgb2YgaW5pJ3MgdG8gYmUgZnJlZWQgb24gZGV0YWNoICovCi0JYm9vbCBtZmJyOwkJLyogZW5hYmxlIG11bHRpcGxlIGZhbGxiYWNrIHJhdGUgKi8KLQl1MzIgdHhfbWF4X2Z1bmw7CS8qIHVuZGVyZmxvd3Mgc2hvdWxkIGJlIGtlcHQgc3VjaCB0aGF0Ci0JCQkJICogKHR4X21heF9mdW5mbCp1bmRlcmZsb3dzKSA8IHR4IGZyYW1lcwotCQkJCSAqLwotCS8qIHRhYmxlIG9mIGZpZm8gaW5mb3MgKi8KLQlzdHJ1Y3QgYnJjbXNfZmlmb19pbmZvIGZpZm9fdGJbTlVNX0ZGUExEX0ZJRk9dOwotCi19OwotCi0vKiB1c2VkIGZvciBmbHVzaGluZyBhbXBkdSBwYWNrZXRzICovCi1zdHJ1Y3QgY2JfZGVsX2FtcGR1X3BhcnMgewotCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7Ci0JdTE2IHRpZDsKLX07Ci0KLSNkZWZpbmUgQU1QRFVfQ0xFQU5VUEZMQUdfUlggICAoMHgxKQotI2RlZmluZSBBTVBEVV9DTEVBTlVQRkxBR19UWCAgICgweDIpCi0KLSNkZWZpbmUgU0NCX0FNUERVX0NVQkJZKGFtcGR1LCBzY2IpICgmKHNjYi0+c2NiX2FtcGR1KSkKLSNkZWZpbmUgU0NCX0FNUERVX0lOSShzY2JfYW1wZHUsIHRpZCkgKCYoc2NiX2FtcGR1LT5pbmlbdGlkXSkpCi0KLXN0YXRpYyB2b2lkIGJyY21zX2NfZmZwbGRfaW5pdChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpOwotc3RhdGljIGludCBicmNtc19jX2ZmcGxkX2NoZWNrX3R4ZnVuZmwoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBpbnQgZik7Ci1zdGF0aWMgdm9pZCBicmNtc19jX2ZmcGxkX2NhbGNfbWNzMmFtcGR1X3RhYmxlKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgaW50IGYpOwotCi1zdGF0aWMgdm9pZCBicmNtc19jX3NjYl9hbXBkdV91cGRhdGVfbWF4X3R4bGVuKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwKLQkJCQkJICAgICAgIHU4IGR1cik7Ci1zdGF0aWMgdm9pZCBicmNtc19jX3NjYl9hbXBkdV91cGRhdGVfY29uZmlnKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwKLQkJCQkJICAgIHN0cnVjdCBzY2IgKnNjYik7Ci1zdGF0aWMgdm9pZCBicmNtc19jX3NjYl9hbXBkdV91cGRhdGVfY29uZmlnX2FsbChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpOwotCi0jZGVmaW5lIGJyY21zX2NfYW1wZHVfdHhmbG93Y29udHJvbChhLCBiLCBjKQlkbyB7fSB3aGlsZSAoMCkKLQotc3RhdGljIHZvaWQKLWJyY21zX2NfYW1wZHVfZG90eHN0YXR1c19jb21wbGV0ZShzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsCi0JCQkJICBzdHJ1Y3Qgc2NiICpzY2IsCi0JCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqcCwgc3RydWN0IHR4X3N0YXR1cyAqdHhzLAotCQkJCSAgdTMyIGZybXR4c3RhdHVzLCB1MzIgZnJtdHhzdGF0dXMyKTsKLQotc3RhdGljIGJvb2wgYnJjbXNfY19hbXBkdV9jYXAoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1KTsKLXN0YXRpYyBpbnQgYnJjbXNfY19hbXBkdV9zZXQoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LCBib29sIG9uKTsKLQotc3RydWN0IGFtcGR1X2luZm8gKmJyY21zX2NfYW1wZHVfYXR0YWNoKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHU7Ci0JaW50IGk7Ci0KLQlhbXBkdSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhbXBkdV9pbmZvKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFhbXBkdSkgewotCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIndsJWQ6IGJyY21zX2NfYW1wZHVfYXR0YWNoOiBvdXQgb2YgbWVtIgotCQkJICAiXG4iLCB3bGMtPnB1Yi0+dW5pdCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlhbXBkdS0+d2xjID0gd2xjOwotCi0JZm9yIChpID0gMDsgaSA8IEFNUERVX01BWF9TQ0JfVElEOyBpKyspCi0JCWFtcGR1LT5pbmlfZW5hYmxlW2ldID0gdHJ1ZTsKLQkvKiBEaXNhYmxlIGFtcGR1IGZvciBWTyBieSBkZWZhdWx0ICovCi0JYW1wZHUtPmluaV9lbmFibGVbUFJJT184MDIxRF9WT10gPSBmYWxzZTsKLQlhbXBkdS0+aW5pX2VuYWJsZVtQUklPXzgwMjFEX05DXSA9IGZhbHNlOwotCi0JLyogRGlzYWJsZSBhbXBkdSBmb3IgQksgYnkgZGVmYXVsdCBzaW5jZSBub3QgZW5vdWdoIGZpZm8gc3BhY2UgKi8KLQlhbXBkdS0+aW5pX2VuYWJsZVtQUklPXzgwMjFEX05PTkVdID0gZmFsc2U7Ci0JYW1wZHUtPmluaV9lbmFibGVbUFJJT184MDIxRF9CS10gPSBmYWxzZTsKLQotCWFtcGR1LT5iYV90eF93c2l6ZSA9IEFNUERVX1RYX0JBX0RFRl9XU0laRTsKLQlhbXBkdS0+YmFfcnhfd3NpemUgPSBBTVBEVV9SWF9CQV9ERUZfV1NJWkU7Ci0JYW1wZHUtPm1wZHVfZGVuc2l0eSA9IEFNUERVX0RFRl9NUERVX0RFTlNJVFk7Ci0JYW1wZHUtPm1heF9wZHUgPSBBVVRPOwotCWFtcGR1LT5kdXIgPSBBTVBEVV9NQVhfRFVSOwotCWFtcGR1LT50eHBrdF93ZWlnaHQgPSBBTVBEVV9ERUZfVFhQS1RfV0VJR0hUOwotCi0JYW1wZHUtPmZmcGxkX3JzdmQgPSBBTVBEVV9ERUZfRkZQTERfUlNWRDsKLQkvKiBidW1wIG1heCBhbXBkdSByY3Ygc2l6ZSB0byA2NGsgZm9yIGFsbCAxMW4gZGV2aWNlcyBleGNlcHQgNDMyMUEwIGFuZCA0MzIxQTEgKi8KLQlpZiAoQlJDTVNfSVNOUEhZKHdsYy0+YmFuZCkgJiYgTlJFVl9MVCh3bGMtPmJhbmQtPnBoeXJldiwgMikpCi0JCWFtcGR1LT5yeF9mYWN0b3IgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzMySzsKLQllbHNlCi0JCWFtcGR1LT5yeF9mYWN0b3IgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SzsKLQlhbXBkdS0+cmV0cnlfbGltaXQgPSBBTVBEVV9ERUZfUkVUUllfTElNSVQ7Ci0JYW1wZHUtPnJyX3JldHJ5X2xpbWl0ID0gQU1QRFVfREVGX1JSX1JFVFJZX0xJTUlUOwotCi0JZm9yIChpID0gMDsgaSA8IEFNUERVX01BWF9TQ0JfVElEOyBpKyspIHsKLQkJYW1wZHUtPnJldHJ5X2xpbWl0X3RpZFtpXSA9IGFtcGR1LT5yZXRyeV9saW1pdDsKLQkJYW1wZHUtPnJyX3JldHJ5X2xpbWl0X3RpZFtpXSA9IGFtcGR1LT5ycl9yZXRyeV9saW1pdDsKLQl9Ci0KLQlicmNtc19jX3NjYl9hbXBkdV91cGRhdGVfbWF4X3R4bGVuKGFtcGR1LCBhbXBkdS0+ZHVyKTsKLQlhbXBkdS0+bWZiciA9IGZhbHNlOwotCS8qIHRyeSB0byBzZXQgYW1wZHUgdG8gdGhlIGRlZmF1bHQgdmFsdWUgKi8KLQlicmNtc19jX2FtcGR1X3NldChhbXBkdSwgd2xjLT5wdWItPl9hbXBkdSk7Ci0KLQlhbXBkdS0+dHhfbWF4X2Z1bmwgPSBGRlBMRF9UWF9NQVhfVU5GTDsKLQlicmNtc19jX2ZmcGxkX2luaXQoYW1wZHUpOwotCi0JcmV0dXJuIGFtcGR1OwotfQotCi12b2lkIGJyY21zX2NfYW1wZHVfZGV0YWNoKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSkKLXsKLQlpbnQgaTsKLQotCWlmICghYW1wZHUpCi0JCXJldHVybjsKLQotCS8qIGZyZWUgYWxsIGluaSdzIHdoaWNoIHdlcmUgdG8gYmUgZnJlZWQgb24gY2FsbGJhY2tzIHdoaWNoIHdlcmUgbmV2ZXIgY2FsbGVkICovCi0JZm9yIChpID0gMDsgaSA8IEFNUERVX0lOSV9GUkVFOyBpKyspIHsKLQkJa2ZyZWUoYW1wZHUtPmluaV9mcmVlW2ldKTsKLQl9Ci0KLQlicmNtc19jX21vZHVsZV91bnJlZ2lzdGVyKGFtcGR1LT53bGMtPnB1YiwgImFtcGR1IiwgYW1wZHUpOwotCWtmcmVlKGFtcGR1KTsKLX0KLQotc3RhdGljIHZvaWQgYnJjbXNfY19zY2JfYW1wZHVfdXBkYXRlX2NvbmZpZyhzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsCi0JCQkJCSAgICBzdHJ1Y3Qgc2NiICpzY2IpCi17Ci0Jc3RydWN0IHNjYl9hbXBkdSAqc2NiX2FtcGR1ID0gU0NCX0FNUERVX0NVQkJZKGFtcGR1LCBzY2IpOwotCWludCBpOwotCi0Jc2NiX2FtcGR1LT5tYXhfcGR1ID0gKHU4KSBhbXBkdS0+d2xjLT5wdWItPnR1bmFibGVzLT5hbXBkdW51bW1wZHU7Ci0KLQkvKiBnbyBiYWNrIHRvIGxlZ2FjeSBzaXplIGlmIHNvbWUgcHJlbG9hZGluZyBpcyBvY2N1cnJpbmcgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0ZGUExEX0ZJRk87IGkrKykgewotCQlpZiAoYW1wZHUtPmZpZm9fdGJbaV0uYW1wZHVfcGxkX3NpemUgPiBGRlBMRF9QTERfSU5DUikKLQkJCXNjYl9hbXBkdS0+bWF4X3BkdSA9IEFNUERVX05VTV9NUERVX0xFR0FDWTsKLQl9Ci0KLQkvKiBhcHBseSB1c2VyIG92ZXJyaWRlICovCi0JaWYgKGFtcGR1LT5tYXhfcGR1ICE9IEFVVE8pCi0JCXNjYl9hbXBkdS0+bWF4X3BkdSA9ICh1OCkgYW1wZHUtPm1heF9wZHU7Ci0KLQlzY2JfYW1wZHUtPnJlbGVhc2UgPSBtaW5fdCh1OCwgc2NiX2FtcGR1LT5tYXhfcGR1LCBBTVBEVV9TQ0JfTUFYX1JFTEVBU0UpOwotCi0JaWYgKHNjYl9hbXBkdS0+bWF4X3J4X2FtcGR1X2J5dGVzKQotCQlzY2JfYW1wZHUtPnJlbGVhc2UgPSBtaW5fdCh1OCwgc2NiX2FtcGR1LT5yZWxlYXNlLAotCQkJc2NiX2FtcGR1LT5tYXhfcnhfYW1wZHVfYnl0ZXMgLyAxNjAwKTsKLQotCXNjYl9hbXBkdS0+cmVsZWFzZSA9IG1pbihzY2JfYW1wZHUtPnJlbGVhc2UsCi0JCQkJIGFtcGR1LT5maWZvX3RiW1RYX0FDX0JFX0ZJRk9dLgotCQkJCSBtY3MyYW1wZHVfdGFibGVbRkZQTERfTUFYX01DU10pOwotfQotCi1zdGF0aWMgdm9pZCBicmNtc19jX3NjYl9hbXBkdV91cGRhdGVfY29uZmlnX2FsbChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpCi17Ci0JYnJjbXNfY19zY2JfYW1wZHVfdXBkYXRlX2NvbmZpZyhhbXBkdSwgYW1wZHUtPndsYy0+cHViLT5nbG9iYWxfc2NiKTsKLX0KLQotc3RhdGljIHZvaWQgYnJjbXNfY19mZnBsZF9pbml0KHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSkKLXsKLQlpbnQgaSwgajsKLQlzdHJ1Y3QgYnJjbXNfZmlmb19pbmZvICpmaWZvOwotCi0JZm9yIChqID0gMDsgaiA8IE5VTV9GRlBMRF9GSUZPOyBqKyspIHsKLQkJZmlmbyA9IChhbXBkdS0+Zmlmb190YiArIGopOwotCQlmaWZvLT5hbXBkdV9wbGRfc2l6ZSA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPD0gRkZQTERfTUFYX01DUzsgaSsrKQotCQkJZmlmby0+bWNzMmFtcGR1X3RhYmxlW2ldID0gMjU1OwotCQlmaWZvLT5kbWF4ZmVycmF0ZSA9IDA7Ci0JCWZpZm8tPmFjY3VtX3R4YW1wZHUgPSAwOwotCQlmaWZvLT5wcmV2X3R4ZnVuZmwgPSAwOwotCQlmaWZvLT5hY2N1bV90eGZ1bmZsID0gMDsKLQotCX0KLX0KLQotLyogZXZhbHVhdGUgdGhlIGRtYSB0cmFuc2ZlciByYXRlIHVzaW5nIHRoZSB0eCB1bmRlcmZsb3dzIGFzIGZlZWRiYWNrLgotICogSWYgbmVjZXNzYXJ5LCBpbmNyZWFzZSB0eCBmaWZvIHByZWxvYWRpbmcuIElmIG5vdCBlbm91Z2gsCi0gKiBkZWNyZWFzZSBtYXhpbXVtIGFtcGR1IHNpemUgZm9yIGVhY2ggbWNzIHRpbGwgdW5kZXJmbG93cyBzdG9wCi0gKiBSZXR1cm4gMSBpZiBwcmUtbG9hZGluZyBub3QgYWN0aXZlLCAtMSBpZiBub3QgYW4gdW5kZXJmbG93IGV2ZW50LAotICogMCBpZiBwcmUtbG9hZGluZyBtb2R1bGUgdG9vayBjYXJlIG9mIHRoZSBldmVudC4KLSAqLwotc3RhdGljIGludCBicmNtc19jX2ZmcGxkX2NoZWNrX3R4ZnVuZmwoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBpbnQgZmlkKQotewotCXN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSA9IHdsYy0+YW1wZHU7Ci0JdTMyIHBoeV9yYXRlID0gTUNTX1JBVEUoRkZQTERfTUFYX01DUywgdHJ1ZSwgZmFsc2UpOwotCXUzMiB0eHVuZmxfcmF0aW87Ci0JdTggbWF4X21wZHU7Ci0JdTMyIGN1cnJlbnRfYW1wZHVfY250ID0gMDsKLQl1MTYgbWF4X3BsZF9zaXplOwotCXUzMiBuZXdfdHh1bmZsOwotCXN0cnVjdCBicmNtc19maWZvX2luZm8gKmZpZm8gPSAoYW1wZHUtPmZpZm9fdGIgKyBmaWQpOwotCXVpbnQgeG10Zmlmb19zejsKLQl1MTYgY3VyX3R4dW5mbDsKLQotCS8qIHJldHVybiBpZiB3ZSBnb3QgaGVyZSBmb3IgYSBkaWZmZXJlbnQgcmVhc29uIHRoYW4gdW5kZXJmbG93cyAqLwotCWN1cl90eHVuZmwgPSBicmNtc19jX3JlYWRfc2htKHdsYywKLQkJCQkgICAgICBNX1VDT0RFX01BQ1NUQVQgKwotCQkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCBtYWNzdGF0LCB0eGZ1bmZsW2ZpZF0pKTsKLQluZXdfdHh1bmZsID0gKHUxNikgKGN1cl90eHVuZmwgLSBmaWZvLT5wcmV2X3R4ZnVuZmwpOwotCWlmIChuZXdfdHh1bmZsID09IDApIHsKLQkJQkNNTVNHKHdsYy0+d2lwaHksICJUWCBzdGF0dXMgRlJBRyBzZXQgYnV0IG5vIHR4IHVuZGVyZmxvd3NcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWZpZm8tPnByZXZfdHhmdW5mbCA9IGN1cl90eHVuZmw7Ci0KLQlpZiAoIWFtcGR1LT50eF9tYXhfZnVubCkKLQkJcmV0dXJuIDE7Ci0KLQkvKiBjaGVjayBpZiBmaWZvIGlzIGJpZyBlbm91Z2ggKi8KLQlpZiAoYnJjbXNfY194bXRmaWZvX3N6X2dldCh3bGMsIGZpZCwgJnhtdGZpZm9fc3opKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAoKFRYRklGT19TSVpFX1VOSVQgKiAodTMyKSB4bXRmaWZvX3N6KSA8PSBhbXBkdS0+ZmZwbGRfcnN2ZCkKLQkJcmV0dXJuIDE7Ci0KLQltYXhfcGxkX3NpemUgPSBUWEZJRk9fU0laRV9VTklUICogeG10Zmlmb19zeiAtIGFtcGR1LT5mZnBsZF9yc3ZkOwotCWZpZm8tPmFjY3VtX3R4ZnVuZmwgKz0gbmV3X3R4dW5mbDsKLQotCS8qIHdlIG5lZWQgdG8gd2FpdCBmb3IgYXQgbGVhc3QgMTAgdW5kZXJmbG93cyAqLwotCWlmIChmaWZvLT5hY2N1bV90eGZ1bmZsIDwgMTApCi0JCXJldHVybiAwOwotCi0JQkNNTVNHKHdsYy0+d2lwaHksICJhbXBkdV9jb3VudCAlZCAgdHhfdW5kZXJmbG93cyAlZFxuIiwKLQkJY3VycmVudF9hbXBkdV9jbnQsIGZpZm8tPmFjY3VtX3R4ZnVuZmwpOwotCi0JLyoKLQkgICBjb21wdXRlIHRoZSBjdXJyZW50IHJhdGlvIG9mIHR4IHVuZmwgcGVyIGFtcGR1LgotCSAgIFdoZW4gdGhlIGN1cnJlbnQgYW1wZHUgY291bnQgYmVjb21lcyB0b28KLQkgICBiaWcgd2hpbGUgdGhlIHJhdGlvIHJlbWFpbnMgc21hbGwsIHdlIHJlc2V0Ci0JICAgdGhlIGN1cnJlbnQgY291bnQgaW4gb3JkZXIgdG8gbm90Ci0JICAgaW50cm9kdWNlIHRvbyBiaWcgb2YgYSBsYXRlbmN5IGluIGRldGVjdGluZyBhCi0JICAgbGFyZ2UgYW1vdW50IG9mIHR4IHVuZGVyZmxvd3MgbGF0ZXIuCi0JICovCi0KLQl0eHVuZmxfcmF0aW8gPSBjdXJyZW50X2FtcGR1X2NudCAvIGZpZm8tPmFjY3VtX3R4ZnVuZmw7Ci0KLQlpZiAodHh1bmZsX3JhdGlvID4gYW1wZHUtPnR4X21heF9mdW5sKSB7Ci0JCWlmIChjdXJyZW50X2FtcGR1X2NudCA+PSBGRlBMRF9NQVhfQU1QRFVfQ05UKSB7Ci0JCQlmaWZvLT5hY2N1bV90eGZ1bmZsID0gMDsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JbWF4X21wZHUgPQotCSAgICBtaW5fdCh1OCwgZmlmby0+bWNzMmFtcGR1X3RhYmxlW0ZGUExEX01BWF9NQ1NdLCBBTVBEVV9OVU1fTVBEVV9MRUdBQ1kpOwotCi0JLyogSW4gY2FzZSBtYXggdmFsdWUgbWF4X3BkdSBpcyBhbHJlYWR5IGxvd2VyIHRoYW4KLQkgICB0aGUgZmlmbyBkZXB0aCwgdGhlcmUgaXMgbm90aGluZyBtb3JlIHdlIGNhbiBkby4KLQkgKi8KLQotCWlmIChmaWZvLT5hbXBkdV9wbGRfc2l6ZSA+PSBtYXhfbXBkdSAqIEZGUExEX01QRFVfU0laRSkgewotCQlmaWZvLT5hY2N1bV90eGZ1bmZsID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKGZpZm8tPmFtcGR1X3BsZF9zaXplIDwgbWF4X3BsZF9zaXplKSB7Ci0KLQkJLyogaW5jcmVtZW50IGJ5IFRYX0ZJRk9fUExEX0lOQyBieXRlcyAqLwotCQlmaWZvLT5hbXBkdV9wbGRfc2l6ZSArPSBGRlBMRF9QTERfSU5DUjsKLQkJaWYgKGZpZm8tPmFtcGR1X3BsZF9zaXplID4gbWF4X3BsZF9zaXplKQotCQkJZmlmby0+YW1wZHVfcGxkX3NpemUgPSBtYXhfcGxkX3NpemU7Ci0KLQkJLyogdXBkYXRlIHNjYiByZWxlYXNlIHNpemUgKi8KLQkJYnJjbXNfY19zY2JfYW1wZHVfdXBkYXRlX2NvbmZpZ19hbGwoYW1wZHUpOwotCi0JCS8qCi0JCSAgIGNvbXB1dGUgYSBuZXcgZG1hIHhmZXIgcmF0ZSBmb3IgbWF4X21wZHUgQCBtYXggbWNzLgotCQkgICBUaGlzIGlzIHRoZSBtaW5pbXVtIGRtYSByYXRlIHRoYXQKLQkJICAgY2FuIGFjaGlldmUgbm8gdW5kZXJmbG93IGNvbmRpdGlvbiBmb3IgdGhlIGN1cnJlbnQgbXBkdSBzaXplLgotCQkgKi8KLQkJLyogbm90ZSA6IHdlIGRpdmlkZS9tdWx0aXBseSBieSAxMDAgdG8gYXZvaWQgaW50ZWdlciBvdmVyZmxvd3MgKi8KLQkJZmlmby0+ZG1heGZlcnJhdGUgPQotCQkgICAgKCgocGh5X3JhdGUgLyAxMDApICoKLQkJICAgICAgKG1heF9tcGR1ICogRkZQTERfTVBEVV9TSVpFIC0gZmlmby0+YW1wZHVfcGxkX3NpemUpKQotCQkgICAgIC8gKG1heF9tcGR1ICogRkZQTERfTVBEVV9TSVpFKSkgKiAxMDA7Ci0KLQkJQkNNTVNHKHdsYy0+d2lwaHksICJETUEgZXN0aW1hdGVkIHRyYW5zZmVyIHJhdGUgJWQ7ICIKLQkJCSJwcmUtbG9hZCBzaXplICVkXG4iLAotCQkJZmlmby0+ZG1heGZlcnJhdGUsIGZpZm8tPmFtcGR1X3BsZF9zaXplKTsKLQl9IGVsc2UgewotCi0JCS8qIGRlY3JlYXNlIGFtcGR1IHNpemUgKi8KLQkJaWYgKGZpZm8tPm1jczJhbXBkdV90YWJsZVtGRlBMRF9NQVhfTUNTXSA+IDEpIHsKLQkJCWlmIChmaWZvLT5tY3MyYW1wZHVfdGFibGVbRkZQTERfTUFYX01DU10gPT0gMjU1KQotCQkJCWZpZm8tPm1jczJhbXBkdV90YWJsZVtGRlBMRF9NQVhfTUNTXSA9Ci0JCQkJICAgIEFNUERVX05VTV9NUERVX0xFR0FDWSAtIDE7Ci0JCQllbHNlCi0JCQkJZmlmby0+bWNzMmFtcGR1X3RhYmxlW0ZGUExEX01BWF9NQ1NdIC09IDE7Ci0KLQkJCS8qIHJlY29tcHV0ZSB0aGUgdGFibGUgKi8KLQkJCWJyY21zX2NfZmZwbGRfY2FsY19tY3MyYW1wZHVfdGFibGUoYW1wZHUsIGZpZCk7Ci0KLQkJCS8qIHVwZGF0ZSBzY2IgcmVsZWFzZSBzaXplICovCi0JCQlicmNtc19jX3NjYl9hbXBkdV91cGRhdGVfY29uZmlnX2FsbChhbXBkdSk7Ci0JCX0KLQl9Ci0JZmlmby0+YWNjdW1fdHhmdW5mbCA9IDA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21zX2NfZmZwbGRfY2FsY19tY3MyYW1wZHVfdGFibGUoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LCBpbnQgZikKLXsKLQlpbnQgaTsKLQl1MzIgcGh5X3JhdGUsIGRtYV9yYXRlLCB0bXA7Ci0JdTggbWF4X21wZHU7Ci0Jc3RydWN0IGJyY21zX2ZpZm9faW5mbyAqZmlmbyA9IChhbXBkdS0+Zmlmb190YiArIGYpOwotCi0JLyogcmVjb21wdXRlIHRoZSBkbWEgcmF0ZSAqLwotCS8qIG5vdGUgOiB3ZSBkaXZpZGUvbXVsdGlwbHkgYnkgMTAwIHRvIGF2b2lkIGludGVnZXIgb3ZlcmZsb3dzICovCi0JbWF4X21wZHUgPQotCSAgICBtaW5fdCh1OCwgZmlmby0+bWNzMmFtcGR1X3RhYmxlW0ZGUExEX01BWF9NQ1NdLCBBTVBEVV9OVU1fTVBEVV9MRUdBQ1kpOwotCXBoeV9yYXRlID0gTUNTX1JBVEUoRkZQTERfTUFYX01DUywgdHJ1ZSwgZmFsc2UpOwotCWRtYV9yYXRlID0KLQkgICAgKCgocGh5X3JhdGUgLyAxMDApICoKLQkgICAgICAobWF4X21wZHUgKiBGRlBMRF9NUERVX1NJWkUgLSBmaWZvLT5hbXBkdV9wbGRfc2l6ZSkpCi0JICAgICAvIChtYXhfbXBkdSAqIEZGUExEX01QRFVfU0laRSkpICogMTAwOwotCWZpZm8tPmRtYXhmZXJyYXRlID0gZG1hX3JhdGU7Ci0KLQkvKiBmaWxsIHVwIHRoZSBtY3MyYW1wZHUgdGFibGU7IGRvIG5vdCByZWNhbGMgdGhlIGxhc3QgbWNzICovCi0JZG1hX3JhdGUgPSBkbWFfcmF0ZSA+PiA3OwotCWZvciAoaSA9IDA7IGkgPCBGRlBMRF9NQVhfTUNTOyBpKyspIHsKLQkJLyogc2hpZnRpbmcgdG8ga2VlcCBpdCB3aXRoaW4gaW50ZWdlciByYW5nZSAqLwotCQlwaHlfcmF0ZSA9IE1DU19SQVRFKGksIHRydWUsIGZhbHNlKSA+PiA3OwotCQlpZiAocGh5X3JhdGUgPiBkbWFfcmF0ZSkgewotCQkJdG1wID0gKChmaWZvLT5hbXBkdV9wbGRfc2l6ZSAqIHBoeV9yYXRlKSAvCi0JCQkgICAgICAgKChwaHlfcmF0ZSAtIGRtYV9yYXRlKSAqIEZGUExEX01QRFVfU0laRSkpICsgMTsKLQkJCXRtcCA9IG1pbl90KHUzMiwgdG1wLCAyNTUpOwotCQkJZmlmby0+bWNzMmFtcGR1X3RhYmxlW2ldID0gKHU4KSB0bXA7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQKLWJyY21zX2NfYW1wZHVfdHhfb3BlcmF0aW9uYWwoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB1OCB0aWQsCi0JdTggYmFfd3NpemUsCQkvKiBuZWdvdGlhdGVkIGJhIHdpbmRvdyBzaXplIChpbiBwZHUpICovCi0JdWludCBtYXhfcnhfYW1wZHVfYnl0ZXMpIC8qIGZyb20gaHRfY2FwIGluIGJlYWNvbiAqLwotewotCXN0cnVjdCBzY2JfYW1wZHUgKnNjYl9hbXBkdTsKLQlzdHJ1Y3Qgc2NiX2FtcGR1X3RpZF9pbmkgKmluaTsKLQlzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUgPSB3bGMtPmFtcGR1OwotCXN0cnVjdCBzY2IgKnNjYiA9IHdsYy0+cHViLT5nbG9iYWxfc2NiOwotCXNjYl9hbXBkdSA9IFNDQl9BTVBEVV9DVUJCWShhbXBkdSwgc2NiKTsKLQotCWlmICghYW1wZHUtPmluaV9lbmFibGVbdGlkXSkgewotCQl3aXBoeV9lcnIoYW1wZHUtPndsYy0+d2lwaHksICIlczogUmVqZWN0aW5nIHRpZCAlZFxuIiwKLQkJCSAgX19mdW5jX18sIHRpZCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpbmkgPSBTQ0JfQU1QRFVfSU5JKHNjYl9hbXBkdSwgdGlkKTsKLQlpbmktPnRpZCA9IHRpZDsKLQlpbmktPnNjYiA9IHNjYl9hbXBkdS0+c2NiOwotCWluaS0+YmFfd3NpemUgPSBiYV93c2l6ZTsKLQlzY2JfYW1wZHUtPm1heF9yeF9hbXBkdV9ieXRlcyA9IG1heF9yeF9hbXBkdV9ieXRlczsKLX0KLQotaW50Ci1icmNtc19jX3NlbmRhbXBkdShzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsIHN0cnVjdCBicmNtc190eHFfaW5mbyAqcWksCi0JICAgICAgc3RydWN0IHNrX2J1ZmYgKipwZHUsIGludCBwcmVjKQotewotCXN0cnVjdCBicmNtc19jX2luZm8gKndsYzsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcCwgKnBrdFtBTVBEVV9NQVhfTVBEVV07Ci0JdTggdGlkLCBuZGVsaW07Ci0JaW50IGVyciA9IDA7Ci0JdTggcHJlYW1ibGVfdHlwZSA9IEJSQ01TX0dGX1BSRUFNQkxFOwotCXU4IGZicl9wcmVhbWJsZV90eXBlID0gQlJDTVNfR0ZfUFJFQU1CTEU7Ci0JdTggcnRzX3ByZWFtYmxlX3R5cGUgPSBCUkNNU19MT05HX1BSRUFNQkxFOwotCXU4IHJ0c19mYnJfcHJlYW1ibGVfdHlwZSA9IEJSQ01TX0xPTkdfUFJFQU1CTEU7Ci0KLQlib29sIHJyID0gdHJ1ZSwgZmJyID0gZmFsc2U7Ci0JdWludCBpLCBjb3VudCA9IDAsIGZpZm8sIHNlZ19jbnQgPSAwOwotCXUxNiBwbGVuLCBsZW4sIHNlcSA9IDAsIG1jbCwgbWNoLCBpbmRleCwgZnJhbWVpZCwgZG1hX2xlbiA9IDA7Ci0JdTMyIGFtcGR1X2xlbiwgbWF4X2FtcGR1X2J5dGVzID0gMDsKLQlzdHJ1Y3QgZDExdHhoICp0eGggPSBOVUxMOwotCXU4ICpwbGNwOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoOwotCXN0cnVjdCBzY2IgKnNjYjsKLQlzdHJ1Y3Qgc2NiX2FtcGR1ICpzY2JfYW1wZHU7Ci0Jc3RydWN0IHNjYl9hbXBkdV90aWRfaW5pICppbmk7Ci0JdTggbWNzID0gMDsKLQlib29sIHVzZV9ydHMgPSBmYWxzZSwgdXNlX2N0cyA9IGZhbHNlOwotCXJhdGVzcGVjX3QgcnNwZWMgPSAwLCByc3BlY19mYWxsYmFjayA9IDA7Ci0JcmF0ZXNwZWNfdCBydHNfcnNwZWMgPSAwLCBydHNfcnNwZWNfZmFsbGJhY2sgPSAwOwotCXUxNiBtaW1vX2N0bGNoYncgPSBQSFlfVFhDMV9CV18yME1IWjsKLQlzdHJ1Y3QgaWVlZTgwMjExX3J0cyAqcnRzOwotCXU4IHJyX3JldHJ5X2xpbWl0OwotCXN0cnVjdCBicmNtc19maWZvX2luZm8gKmY7Ci0JYm9vbCBmYnJfaXNjY2s7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eF9pbmZvOwotCXUxNiBxbGVuOwotCXN0cnVjdCB3aXBoeSAqd2lwaHk7Ci0KLQl3bGMgPSBhbXBkdS0+d2xjOwotCXdpcGh5ID0gd2xjLT53aXBoeTsKLQlwID0gKnBkdTsKLQotCXRpZCA9ICh1OCkgKHAtPnByaW9yaXR5KTsKLQotCWYgPSBhbXBkdS0+Zmlmb190YiArIHByaW8yZmlmb1t0aWRdOwotCi0Jc2NiID0gd2xjLT5wdWItPmdsb2JhbF9zY2I7Ci0Jc2NiX2FtcGR1ID0gU0NCX0FNUERVX0NVQkJZKGFtcGR1LCBzY2IpOwotCWluaSA9ICZzY2JfYW1wZHUtPmluaVt0aWRdOwotCi0JLyogTGV0IHByZXNzdXJlIGNvbnRpbnVlIHRvIGJ1aWxkIC4uLiAqLwotCXFsZW4gPSBwa3RxX3BsZW4oJnFpLT5xLCBwcmVjKTsKLQlpZiAoaW5pLT50eF9pbl90cmFuc2l0ID4gMCAmJgotCSAgICBxbGVuIDwgbWluKHNjYl9hbXBkdS0+bWF4X3BkdSwgaW5pLT5iYV93c2l6ZSkpIHsKLQkJLyogQ29sbGVjdCBtdWx0aXBsZSBNUERVJ3MgdG8gYmUgc2VudCBpbiB0aGUgbmV4dCBBTVBEVSAqLwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCS8qIGF0IHRoaXMgcG9pbnQgd2UgaW50ZW5kIHRvIHRyYW5zbWl0IGFuIEFNUERVICovCi0JcnJfcmV0cnlfbGltaXQgPSBhbXBkdS0+cnJfcmV0cnlfbGltaXRfdGlkW3RpZF07Ci0JYW1wZHVfbGVuID0gMDsKLQlkbWFfbGVuID0gMDsKLQl3aGlsZSAocCkgewotCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUgKnR4cmF0ZTsKLQotCQl0eF9pbmZvID0gSUVFRTgwMjExX1NLQl9DQihwKTsKLQkJdHhyYXRlID0gdHhfaW5mby0+c3RhdHVzLnJhdGVzOwotCi0JCWlmICh0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpIHsKLQkJCWVyciA9IGJyY21zX2NfcHJlcF9wZHUod2xjLCBwLCAmZmlmbyk7Ci0JCX0gZWxzZSB7Ci0JCQl3aXBoeV9lcnIod2lwaHksICIlczogQU1QRFUgZmxhZyBpcyBvZmYhXG4iLCBfX2Z1bmNfXyk7Ci0JCQkqcGR1ID0gTlVMTDsKLQkJCWVyciA9IDA7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChlcnIpIHsKLQkJCWlmIChlcnIgPT0gLUVCVVNZKSB7Ci0JCQkJd2lwaHlfZXJyKHdpcGh5LCAid2wlZDogc2VuZGFtcGR1OiAiCi0JCQkJCSAgInByZXBfeGR1IHJldHJ5OyBzZXEgMHgleFxuIiwKLQkJCQkJICB3bGMtPnB1Yi0+dW5pdCwgc2VxKTsKLQkJCQkqcGR1ID0gcDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJLyogZXJyb3IgaW4gdGhlIHBhY2tldDsgcmVqZWN0IGl0ICovCi0JCQl3aXBoeV9lcnIod2lwaHksICJ3bCVkOiBzZW5kYW1wZHU6IHByZXBfeGR1ICIKLQkJCQkgICJyZWplY3RlZDsgc2VxIDB4JXhcbiIsIHdsYy0+cHViLT51bml0LCBzZXEpOwotCQkJKnBkdSA9IE5VTEw7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIHBrdCBpcyBnb29kIHRvIGJlIGFnZ3JlZ2F0ZWQgKi8KLQkJdHhoID0gKHN0cnVjdCBkMTF0eGggKikgcC0+ZGF0YTsKLQkJcGxjcCA9ICh1OCAqKSAodHhoICsgMSk7Ci0JCWggPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikocGxjcCArIEQxMV9QSFlfSERSX0xFTik7Ci0JCXNlcSA9IGxlMTZfdG9fY3B1KGgtPnNlcV9jdHJsKSA+PiBTRVFOVU1fU0hJRlQ7Ci0JCWluZGV4ID0gVFhfU0VRX1RPX0lOREVYKHNlcSk7Ci0KLQkJLyogY2hlY2sgbWNsIGZpZWxkcyBhbmQgdGVzdCB3aGV0aGVyIGl0IGNhbiBiZSBhZ2cnZCAqLwotCQltY2wgPSBsZTE2X3RvX2NwdSh0eGgtPk1hY1R4Q29udHJvbExvdyk7Ci0JCW1jbCAmPSB+VFhDX0FNUERVX01BU0s7Ci0JCWZicl9pc2NjayA9ICEobGUxNl90b19jcHUodHhoLT5YdHJhRnJhbWVUeXBlcykgJiAweDMpOwotCQl0eGgtPlByZWxvYWRTaXplID0gMDsJLyogYWx3YXlzIGRlZmF1bHQgdG8gMCAqLwotCi0JCS8qICBIYW5kbGUgcmV0cnkgbGltaXRzICovCi0JCWlmICh0eHJhdGVbMF0uY291bnQgPD0gcnJfcmV0cnlfbGltaXQpIHsKLQkJCXR4cmF0ZVswXS5jb3VudCsrOwotCQkJcnIgPSB0cnVlOwotCQkJZmJyID0gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlmYnIgPSB0cnVlOwotCQkJcnIgPSBmYWxzZTsKLQkJCXR4cmF0ZVsxXS5jb3VudCsrOwotCQl9Ci0KLQkJLyogZXh0cmFjdCB0aGUgbGVuZ3RoIGluZm8gKi8KLQkJbGVuID0gZmJyX2lzY2NrID8gQlJDTVNfR0VUX0NDS19QTENQX0xFTih0eGgtPkZyYWdQTENQRmFsbGJhY2spCi0JCSAgICA6IEJSQ01TX0dFVF9NSU1PX1BMQ1BfTEVOKHR4aC0+RnJhZ1BMQ1BGYWxsYmFjayk7Ci0KLQkJLyogcmV0cmlldmUgbnVsbCBkZWxpbWl0ZXIgY291bnQgKi8KLQkJbmRlbGltID0gdHhoLT5SVFNQTENQRmFsbGJhY2tbQU1QRFVfRkJSX05VTExfREVMSU1dOwotCQlzZWdfY250ICs9IDE7Ci0KLQkJQkNNTVNHKHdsYy0+d2lwaHksICJ3bCVkOiBtcGR1ICVkIHBsY3BfbGVuICVkXG4iLAotCQkJd2xjLT5wdWItPnVuaXQsIGNvdW50LCBsZW4pOwotCi0JCS8qCi0JCSAqIGFnZ3JlZ2F0ZWFibGUgbXBkdS4gRm9yIHVjb2RlL2h3IGFnZywKLQkJICogdGVzdCB3aGV0aGVyIG5lZWQgdG8gYnJlYWsgb3IgY2hhbmdlIHRoZSBlcG9jaAotCQkgKi8KLQkJaWYgKGNvdW50ID09IDApIHsKLQkJCW1jbCB8PSAoVFhDX0FNUERVX0ZJUlNUIDw8IFRYQ19BTVBEVV9TSElGVCk7Ci0JCQkvKiByZWZpbGwgdGhlIGJpdHMgc2luY2UgbWlnaHQgYmUgYSByZXR4IG1wZHUgKi8KLQkJCW1jbCB8PSBUWENfU1RBUlRNU0RVOwotCQkJcnRzID0gKHN0cnVjdCBpZWVlODAyMTFfcnRzICopJnR4aC0+cnRzX2ZyYW1lOwotCi0JCQlpZiAoaWVlZTgwMjExX2lzX3J0cyhydHMtPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCQkJbWNsIHw9IFRYQ19TRU5EUlRTOwotCQkJCXVzZV9ydHMgPSB0cnVlOwotCQkJfQotCQkJaWYgKGllZWU4MDIxMV9pc19jdHMocnRzLT5mcmFtZV9jb250cm9sKSkgewotCQkJCW1jbCB8PSBUWENfU0VORENUUzsKLQkJCQl1c2VfY3RzID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW1jbCB8PSAoVFhDX0FNUERVX01JRERMRSA8PCBUWENfQU1QRFVfU0hJRlQpOwotCQkJbWNsICY9IH4oVFhDX1NUQVJUTVNEVSB8IFRYQ19TRU5EUlRTIHwgVFhDX1NFTkRDVFMpOwotCQl9Ci0KLQkJbGVuID0gcm91bmR1cChsZW4sIDQpOwotCQlhbXBkdV9sZW4gKz0gKGxlbiArIChuZGVsaW0gKyAxKSAqIEFNUERVX0RFTElNSVRFUl9MRU4pOwotCi0JCWRtYV9sZW4gKz0gKHUxNikgYnJjbXVfcGt0dG90bGVuKHApOwotCi0JCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZDogYW1wZHVfbGVuICVkIgotCQkJIiBzZWdfY250ICVkIG51bGwgZGVsaW0gJWRcbiIsCi0JCQl3bGMtPnB1Yi0+dW5pdCwgYW1wZHVfbGVuLCBzZWdfY250LCBuZGVsaW0pOwotCi0JCXR4aC0+TWFjVHhDb250cm9sTG93ID0gY3B1X3RvX2xlMTYobWNsKTsKLQotCQkvKiB0aGlzIHBhY2tldCBpcyBhZGRlZCAqLwotCQlwa3RbY291bnQrK10gPSBwOwotCi0JCS8qIHBhdGNoIHRoZSBmaXJzdCBNUERVICovCi0JCWlmIChjb3VudCA9PSAxKSB7Ci0JCQl1OCBwbGNwMCwgcGxjcDMsIGlzNDAsIHNnaTsKLQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7Ci0KLQkJCXN0YSA9IHR4X2luZm8tPmNvbnRyb2wuc3RhOwotCi0JCQlpZiAocnIpIHsKLQkJCQlwbGNwMCA9IHBsY3BbMF07Ci0JCQkJcGxjcDMgPSBwbGNwWzNdOwotCQkJfSBlbHNlIHsKLQkJCQlwbGNwMCA9IHR4aC0+RnJhZ1BMQ1BGYWxsYmFja1swXTsKLQkJCQlwbGNwMyA9IHR4aC0+RnJhZ1BMQ1BGYWxsYmFja1szXTsKLQotCQkJfQotCQkJaXM0MCA9IChwbGNwMCAmIE1JTU9fUExDUF80ME1IWikgPyAxIDogMDsKLQkJCXNnaSA9IFBMQ1AzX0lTU0dJKHBsY3AzKSA/IDEgOiAwOwotCQkJbWNzID0gcGxjcDAgJiB+TUlNT19QTENQXzQwTUhaOwotCQkJbWF4X2FtcGR1X2J5dGVzID0KLQkJCSAgICBtaW4oc2NiX2FtcGR1LT5tYXhfcnhfYW1wZHVfYnl0ZXMsCi0JCQkJYW1wZHUtPm1heF90eGxlblttY3NdW2lzNDBdW3NnaV0pOwotCi0JCQlpZiAoaXM0MCkKLQkJCQltaW1vX2N0bGNoYncgPQotCQkJCSAgIENIU1BFQ19TQl9VUFBFUihCUkNNU19CQU5EX1BJX1JBRElPX0NIQU5TUEVDKQotCQkJCSAgID8gUEhZX1RYQzFfQldfMjBNSFpfVVAgOiBQSFlfVFhDMV9CV18yME1IWjsKLQotCQkJLyogcmVidWlsZCB0aGUgcnNwZWMgYW5kIHJzcGVjX2ZhbGxiYWNrICovCi0JCQlyc3BlYyA9IFJTUEVDX01JTU9SQVRFOwotCQkJcnNwZWMgfD0gcGxjcFswXSAmIH5NSU1PX1BMQ1BfNDBNSFo7Ci0JCQlpZiAocGxjcFswXSAmIE1JTU9fUExDUF80ME1IWikKLQkJCQlyc3BlYyB8PSAoUEhZX1RYQzFfQldfNDBNSFogPDwgUlNQRUNfQldfU0hJRlQpOwotCi0JCQlpZiAoZmJyX2lzY2NrKQkvKiBDQ0sgKi8KLQkJCQlyc3BlY19mYWxsYmFjayA9Ci0JCQkJICAgIENDS19SU1BFQyhDQ0tfUEhZMk1BQ19SQVRFCi0JCQkJCSAgICAgICh0eGgtPkZyYWdQTENQRmFsbGJhY2tbMF0pKTsKLQkJCWVsc2UgewkvKiBNSU1PICovCi0JCQkJcnNwZWNfZmFsbGJhY2sgPSBSU1BFQ19NSU1PUkFURTsKLQkJCQlyc3BlY19mYWxsYmFjayB8PQotCQkJCSAgICB0eGgtPkZyYWdQTENQRmFsbGJhY2tbMF0gJiB+TUlNT19QTENQXzQwTUhaOwotCQkJCWlmICh0eGgtPkZyYWdQTENQRmFsbGJhY2tbMF0gJiBNSU1PX1BMQ1BfNDBNSFopCi0JCQkJCXJzcGVjX2ZhbGxiYWNrIHw9Ci0JCQkJCSAgICAoUEhZX1RYQzFfQldfNDBNSFogPDwKLQkJCQkJICAgICBSU1BFQ19CV19TSElGVCk7Ci0JCQl9Ci0KLQkJCWlmICh1c2VfcnRzIHx8IHVzZV9jdHMpIHsKLQkJCQlydHNfcnNwZWMgPQotCQkJCSAgICBicmNtc19jX3JzcGVjX3RvX3J0c19yc3BlYyh3bGMsCi0JCQkJCXJzcGVjLCBmYWxzZSwgbWltb19jdGxjaGJ3KTsKLQkJCQlydHNfcnNwZWNfZmFsbGJhY2sgPQotCQkJCSAgICBicmNtc19jX3JzcGVjX3RvX3J0c19yc3BlYyh3bGMsCi0JCQkJCXJzcGVjX2ZhbGxiYWNrLCBmYWxzZSwgbWltb19jdGxjaGJ3KTsKLQkJCX0KLQkJfQotCi0JCS8qIGlmIChmaXJzdCBtcGR1IGZvciBob3N0IGFnZykgKi8KLQkJLyogdGVzdCB3aGV0aGVyIHRvIGFkZCBtb3JlICovCi0JCWlmICgoTUNTX1JBVEUobWNzLCB0cnVlLCBmYWxzZSkgPj0gZi0+ZG1heGZlcnJhdGUpICYmCi0JCSAgICAoY291bnQgPT0gZi0+bWNzMmFtcGR1X3RhYmxlW21jc10pKSB7Ci0JCQlCQ01NU0cod2xjLT53aXBoeSwgIndsJWQ6IFBSIDM3NjQ0OiBzdG9wcGluZyIKLQkJCQkiIGFtcGR1IGF0ICVkIGZvciBtY3MgJWRcbiIsCi0JCQkJd2xjLT5wdWItPnVuaXQsIGNvdW50LCBtY3MpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoY291bnQgPT0gc2NiX2FtcGR1LT5tYXhfcGR1KSB7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIGNoZWNrIHRvIHNlZSBpZiB0aGUgbmV4dCBwa3QgaXMgYSBjYW5kaWRhdGUgZm9yIGFnZ3JlZ2F0aW9uICovCi0JCXAgPSBwa3RxX3BwZWVrKCZxaS0+cSwgcHJlYyk7Ci0JCXR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKHApOwkvKiB0eF9pbmZvIG11c3QgYmUgY2hlY2tlZCB3aXRoIGN1cnJlbnQgcCAqLwotCi0JCWlmIChwKSB7Ci0JCQlpZiAoKHR4X2luZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkgJiYKLQkJCSAgICAoKHU4KSAocC0+cHJpb3JpdHkpID09IHRpZCkpIHsKLQotCQkJCXBsZW4gPSBicmNtdV9wa3R0b3RsZW4ocCkgKwotCQkJCSAgICAgICBBTVBEVV9NQVhfTVBEVV9PVkVSSEVBRDsKLQkJCQlwbGVuID0gbWF4KHNjYl9hbXBkdS0+bWluX2xlbiwgcGxlbik7Ci0KLQkJCQlpZiAoKHBsZW4gKyBhbXBkdV9sZW4pID4gbWF4X2FtcGR1X2J5dGVzKSB7Ci0JCQkJCXAgPSBOVUxMOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQkvKiBjaGVjayBpZiB0aGVyZSBhcmUgZW5vdWdoIGRlc2NyaXB0b3JzIGF2YWlsYWJsZSAqLwotCQkJCWlmIChUWEFWQUlMKHdsYywgZmlmbykgPD0gKHNlZ19jbnQgKyAxKSkgewotCQkJCQl3aXBoeV9lcnIod2lwaHksICIlczogTm8gZmlmbyBzcGFjZSAgIgotCQkJCQkJICAiISFcbiIsIF9fZnVuY19fKTsKLQkJCQkJcCA9IE5VTEw7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlwID0gYnJjbXVfcGt0cV9wZGVxKCZxaS0+cSwgcHJlYyk7Ci0JCQl9IGVsc2UgewotCQkJCXAgPSBOVUxMOwotCQkJfQotCQl9Ci0JfQkJCS8qIGVuZCB3aGlsZShwKSAqLwotCi0JaW5pLT50eF9pbl90cmFuc2l0ICs9IGNvdW50OwotCi0JaWYgKGNvdW50KSB7Ci0JCS8qIHBhdGNoIHVwIHRoZSBsYXN0IHR4aCAqLwotCQl0eGggPSAoc3RydWN0IGQxMXR4aCAqKSBwa3RbY291bnQgLSAxXS0+ZGF0YTsKLQkJbWNsID0gbGUxNl90b19jcHUodHhoLT5NYWNUeENvbnRyb2xMb3cpOwotCQltY2wgJj0gflRYQ19BTVBEVV9NQVNLOwotCQltY2wgfD0gKFRYQ19BTVBEVV9MQVNUIDw8IFRYQ19BTVBEVV9TSElGVCk7Ci0JCXR4aC0+TWFjVHhDb250cm9sTG93ID0gY3B1X3RvX2xlMTYobWNsKTsKLQotCQkvKiByZW1vdmUgdGhlIG51bGwgZGVsaW1pdGVyIGFmdGVyIGxhc3QgbXBkdSAqLwotCQluZGVsaW0gPSB0eGgtPlJUU1BMQ1BGYWxsYmFja1tBTVBEVV9GQlJfTlVMTF9ERUxJTV07Ci0JCXR4aC0+UlRTUExDUEZhbGxiYWNrW0FNUERVX0ZCUl9OVUxMX0RFTElNXSA9IDA7Ci0JCWFtcGR1X2xlbiAtPSBuZGVsaW0gKiBBTVBEVV9ERUxJTUlURVJfTEVOOwotCi0JCS8qIHJlbW92ZSB0aGUgcGFkIGxlbiBmcm9tIGxhc3QgbXBkdSAqLwotCQlmYnJfaXNjY2sgPSAoKGxlMTZfdG9fY3B1KHR4aC0+WHRyYUZyYW1lVHlwZXMpICYgMHgzKSA9PSAwKTsKLQkJbGVuID0gZmJyX2lzY2NrID8gQlJDTVNfR0VUX0NDS19QTENQX0xFTih0eGgtPkZyYWdQTENQRmFsbGJhY2spCi0JCSAgICA6IEJSQ01TX0dFVF9NSU1PX1BMQ1BfTEVOKHR4aC0+RnJhZ1BMQ1BGYWxsYmFjayk7Ci0JCWFtcGR1X2xlbiAtPSByb3VuZHVwKGxlbiwgNCkgLSBsZW47Ci0KLQkJLyogcGF0Y2ggdXAgdGhlIGZpcnN0IHR4aCAmIHBsY3AgKi8KLQkJdHhoID0gKHN0cnVjdCBkMTF0eGggKikgcGt0WzBdLT5kYXRhOwotCQlwbGNwID0gKHU4ICopICh0eGggKyAxKTsKLQotCQlCUkNNU19TRVRfTUlNT19QTENQX0xFTihwbGNwLCBhbXBkdV9sZW4pOwotCQkvKiBtYXJrIHBsY3AgdG8gaW5kaWNhdGUgYW1wZHUgKi8KLQkJQlJDTVNfU0VUX01JTU9fUExDUF9BTVBEVShwbGNwKTsKLQotCQkvKiByZXNldCB0aGUgbWl4ZWQgbW9kZSBoZWFkZXIgZHVyYXRpb25zICovCi0JCWlmICh0eGgtPk1Nb2RlTGVuKSB7Ci0JCQl1MTYgbW1vZGVsZW4gPQotCQkJICAgIGJyY21zX2NfY2FsY19sc2lnX2xlbih3bGMsIHJzcGVjLCBhbXBkdV9sZW4pOwotCQkJdHhoLT5NTW9kZUxlbiA9IGNwdV90b19sZTE2KG1tb2RlbGVuKTsKLQkJCXByZWFtYmxlX3R5cGUgPSBCUkNNU19NTV9QUkVBTUJMRTsKLQkJfQotCQlpZiAodHhoLT5NTW9kZUZickxlbikgewotCQkJdTE2IG1tZmJybGVuID0KLQkJCSAgICBicmNtc19jX2NhbGNfbHNpZ19sZW4od2xjLCByc3BlY19mYWxsYmFjaywKLQkJCQkJCSAgYW1wZHVfbGVuKTsKLQkJCXR4aC0+TU1vZGVGYnJMZW4gPSBjcHVfdG9fbGUxNihtbWZicmxlbik7Ci0JCQlmYnJfcHJlYW1ibGVfdHlwZSA9IEJSQ01TX01NX1BSRUFNQkxFOwotCQl9Ci0KLQkJLyogc2V0IHRoZSBwcmVsb2FkIGxlbmd0aCAqLwotCQlpZiAoTUNTX1JBVEUobWNzLCB0cnVlLCBmYWxzZSkgPj0gZi0+ZG1heGZlcnJhdGUpIHsKLQkJCWRtYV9sZW4gPSBtaW4oZG1hX2xlbiwgZi0+YW1wZHVfcGxkX3NpemUpOwotCQkJdHhoLT5QcmVsb2FkU2l6ZSA9IGNwdV90b19sZTE2KGRtYV9sZW4pOwotCQl9IGVsc2UKLQkJCXR4aC0+UHJlbG9hZFNpemUgPSAwOwotCi0JCW1jaCA9IGxlMTZfdG9fY3B1KHR4aC0+TWFjVHhDb250cm9sSGlnaCk7Ci0KLQkJLyogdXBkYXRlIFJUUyBkdXIgZmllbGRzICovCi0JCWlmICh1c2VfcnRzIHx8IHVzZV9jdHMpIHsKLQkJCXUxNiBkdXJpZDsKLQkJCXJ0cyA9IChzdHJ1Y3QgaWVlZTgwMjExX3J0cyAqKSZ0eGgtPnJ0c19mcmFtZTsKLQkJCWlmICgobWNoICYgVFhDX1BSRUFNQkxFX1JUU19NQUlOX1NIT1JUKSA9PQotCQkJICAgIFRYQ19QUkVBTUJMRV9SVFNfTUFJTl9TSE9SVCkKLQkJCQlydHNfcHJlYW1ibGVfdHlwZSA9IEJSQ01TX1NIT1JUX1BSRUFNQkxFOwotCi0JCQlpZiAoKG1jaCAmIFRYQ19QUkVBTUJMRV9SVFNfRkJfU0hPUlQpID09Ci0JCQkgICAgVFhDX1BSRUFNQkxFX1JUU19GQl9TSE9SVCkKLQkJCQlydHNfZmJyX3ByZWFtYmxlX3R5cGUgPSBCUkNNU19TSE9SVF9QUkVBTUJMRTsKLQotCQkJZHVyaWQgPQotCQkJICAgIGJyY21zX2NfY29tcHV0ZV9ydHNjdHNfZHVyKHdsYywgdXNlX2N0cywgcnRzX3JzcGVjLAotCQkJCQkJICAgcnNwZWMsIHJ0c19wcmVhbWJsZV90eXBlLAotCQkJCQkJICAgcHJlYW1ibGVfdHlwZSwgYW1wZHVfbGVuLAotCQkJCQkJICAgdHJ1ZSk7Ci0JCQlydHMtPmR1cmF0aW9uID0gY3B1X3RvX2xlMTYoZHVyaWQpOwotCQkJZHVyaWQgPSBicmNtc19jX2NvbXB1dGVfcnRzY3RzX2R1cih3bGMsIHVzZV9jdHMsCi0JCQkJCQkgICAgICAgcnRzX3JzcGVjX2ZhbGxiYWNrLAotCQkJCQkJICAgICAgIHJzcGVjX2ZhbGxiYWNrLAotCQkJCQkJICAgICAgIHJ0c19mYnJfcHJlYW1ibGVfdHlwZSwKLQkJCQkJCSAgICAgICBmYnJfcHJlYW1ibGVfdHlwZSwKLQkJCQkJCSAgICAgICBhbXBkdV9sZW4sIHRydWUpOwotCQkJdHhoLT5SVFNEdXJGYWxsYmFjayA9IGNwdV90b19sZTE2KGR1cmlkKTsKLQkJCS8qIHNldCBUeEZlc1RpbWVOb3JtYWwgKi8KLQkJCXR4aC0+VHhGZXNUaW1lTm9ybWFsID0gcnRzLT5kdXJhdGlvbjsKLQkJCS8qIHNldCBmYWxsYmFjayByYXRlIHZlcnNpb24gb2YgVHhGZXNUaW1lTm9ybWFsICovCi0JCQl0eGgtPlR4RmVzVGltZUZhbGxiYWNrID0gdHhoLT5SVFNEdXJGYWxsYmFjazsKLQkJfQotCi0JCS8qIHNldCBmbGFnIGFuZCBwbGNwIGZvciBmYWxsYmFjayByYXRlICovCi0JCWlmIChmYnIpIHsKLQkJCW1jaCB8PSBUWENfQU1QRFVfRkJSOwotCQkJdHhoLT5NYWNUeENvbnRyb2xIaWdoID0gY3B1X3RvX2xlMTYobWNoKTsKLQkJCUJSQ01TX1NFVF9NSU1PX1BMQ1BfQU1QRFUocGxjcCk7Ci0JCQlCUkNNU19TRVRfTUlNT19QTENQX0FNUERVKHR4aC0+RnJhZ1BMQ1BGYWxsYmFjayk7Ci0JCX0KLQotCQlCQ01NU0cod2xjLT53aXBoeSwgIndsJWQ6IGNvdW50ICVkIGFtcGR1X2xlbiAlZFxuIiwKLQkJCXdsYy0+cHViLT51bml0LCBjb3VudCwgYW1wZHVfbGVuKTsKLQotCQkvKiBpbmZvcm0gcmF0ZV9zZWwgaWYgaXQgdGhpcyBpcyBhIHJhdGUgcHJvYmUgcGt0ICovCi0JCWZyYW1laWQgPSBsZTE2X3RvX2NwdSh0eGgtPlR4RnJhbWVJRCk7Ci0JCWlmIChmcmFtZWlkICYgVFhGSURfUkFURV9QUk9CRV9NQVNLKSB7Ci0JCQl3aXBoeV9lcnIod2lwaHksICIlczogWFhYIHdoYXQgdG8gZG8gd2l0aCAiCi0JCQkJICAiVFhGSURfUkFURV9QUk9CRV9NQVNLIT9cbiIsIF9fZnVuY19fKTsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJCWJyY21zX2NfdHhmaWZvKHdsYywgZmlmbywgcGt0W2ldLCBpID09IChjb3VudCAtIDEpLAotCQkJCSAgIGFtcGR1LT50eHBrdF93ZWlnaHQpOwotCi0JfQotCS8qIGVuZGlmIChjb3VudCkgKi8KLQlyZXR1cm4gZXJyOwotfQotCi12b2lkCi1icmNtc19jX2FtcGR1X2RvdHhzdGF0dXMoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IsCi0JCSAgICAgc3RydWN0IHNrX2J1ZmYgKnAsIHN0cnVjdCB0eF9zdGF0dXMgKnR4cykKLXsKLQlzdHJ1Y3Qgc2NiX2FtcGR1ICpzY2JfYW1wZHU7Ci0Jc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjID0gYW1wZHUtPndsYzsKLQlzdHJ1Y3Qgc2NiX2FtcGR1X3RpZF9pbmkgKmluaTsKLQl1MzIgczEgPSAwLCBzMiA9IDA7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eF9pbmZvOwotCi0JdHhfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IocCk7Ci0KLQkvKiBCTUFDX05PVEU6IEZvciB0aGUgc3BsaXQgZHJpdmVyLCBzZWNvbmQgbGV2ZWwgdHhzdGF0dXMgY29tZXMgbGF0ZXIKLQkgKiBTbyBpZiB0aGUgQUNLIHdhcyByZWNlaXZlZCB0aGVuIHdhaXQgZm9yIHRoZSBzZWNvbmQgbGV2ZWwgZWxzZSBqdXN0Ci0JICogY2FsbCB0aGUgZmlyc3Qgb25lCi0JICovCi0JaWYgKHR4cy0+c3RhdHVzICYgVFhfU1RBVFVTX0FDS19SQ1YpIHsKLQkJdTggc3RhdHVzX2RlbGF5ID0gMDsKLQotCQkvKiB3YWl0IHRpbGwgdGhlIG5leHQgOCBieXRlcyBvZiB0eHN0YXR1cyBpcyBhdmFpbGFibGUgKi8KLQkJd2hpbGUgKCgoczEgPSBSX1JFRygmd2xjLT5yZWdzLT5mcm10eHN0YXR1cykpICYgVFhTX1YpID09IDApIHsKLQkJCXVkZWxheSgxKTsKLQkJCXN0YXR1c19kZWxheSsrOwotCQkJaWYgKHN0YXR1c19kZWxheSA+IDEwKSB7Ci0JCQkJcmV0dXJuOyAvKiBlcnJvciBjb25kaXRpb24gKi8KLQkJCX0KLQkJfQotCi0JCXMyID0gUl9SRUcoJndsYy0+cmVncy0+ZnJtdHhzdGF0dXMyKTsKLQl9Ci0KLQlpZiAobGlrZWx5KHNjYikpIHsKLQkJc2NiX2FtcGR1ID0gU0NCX0FNUERVX0NVQkJZKGFtcGR1LCBzY2IpOwotCQlpbmkgPSBTQ0JfQU1QRFVfSU5JKHNjYl9hbXBkdSwgcC0+cHJpb3JpdHkpOwotCQlicmNtc19jX2FtcGR1X2RvdHhzdGF0dXNfY29tcGxldGUoYW1wZHUsIHNjYiwgcCwgdHhzLCBzMSwgczIpOwotCX0gZWxzZSB7Ci0JCS8qIGxvb3AgdGhyb3VnaCBhbGwgcGt0cyBhbmQgZnJlZSAqLwotCQl1OCBxdWV1ZSA9IHR4cy0+ZnJhbWVpZCAmIFRYRklEX1FVRVVFX01BU0s7Ci0JCXN0cnVjdCBkMTF0eGggKnR4aDsKLQkJdTE2IG1jbDsKLQkJd2hpbGUgKHApIHsKLQkJCXR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKHApOwotCQkJdHhoID0gKHN0cnVjdCBkMTF0eGggKikgcC0+ZGF0YTsKLQkJCW1jbCA9IGxlMTZfdG9fY3B1KHR4aC0+TWFjVHhDb250cm9sTG93KTsKLQkJCWJyY211X3BrdF9idWZfZnJlZV9za2IocCk7Ci0JCQkvKiBicmVhayBvdXQgaWYgbGFzdCBwYWNrZXQgb2YgYW1wZHUgKi8KLQkJCWlmICgoKG1jbCAmIFRYQ19BTVBEVV9NQVNLKSA+PiBUWENfQU1QRFVfU0hJRlQpID09Ci0JCQkgICAgVFhDX0FNUERVX0xBU1QpCi0JCQkJYnJlYWs7Ci0JCQlwID0gR0VUTkVYVFRYUCh3bGMsIHF1ZXVlKTsKLQkJfQotCQlicmNtc19jX3R4Zmlmb19jb21wbGV0ZSh3bGMsIHF1ZXVlLCBhbXBkdS0+dHhwa3Rfd2VpZ2h0KTsKLQl9Ci0JYnJjbXNfY19hbXBkdV90eGZsb3djb250cm9sKHdsYywgc2NiX2FtcGR1LCBpbmkpOwotfQotCi1zdGF0aWMgdm9pZAotYnJjbXNfY19hbXBkdV9yYXRlX3N0YXR1cyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsCi0JCQkgIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbywKLQkJCSAgc3RydWN0IHR4X3N0YXR1cyAqdHhzLCB1OCBtY3MpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9yYXRlICp0eHJhdGUgPSB0eF9pbmZvLT5zdGF0dXMucmF0ZXM7Ci0JaW50IGk7Ci0KLQkvKiBjbGVhciB0aGUgcmVzdCBvZiB0aGUgcmF0ZXMgKi8KLQlmb3IgKGkgPSAyOyBpIDwgSUVFRTgwMjExX1RYX01BWF9SQVRFUzsgaSsrKSB7Ci0JCXR4cmF0ZVtpXS5pZHggPSAtMTsKLQkJdHhyYXRlW2ldLmNvdW50ID0gMDsKLQl9Ci19Ci0KLSNkZWZpbmUgU0hPUlROQU1FICJBTVBEVSBzdGF0dXMiCi0KLXN0YXRpYyB2b2lkCi1icmNtc19jX2FtcGR1X2RvdHhzdGF0dXNfY29tcGxldGUoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LCBzdHJ1Y3Qgc2NiICpzY2IsCi0JCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcCwgc3RydWN0IHR4X3N0YXR1cyAqdHhzLAotCQkJICAgICAgdTMyIHMxLCB1MzIgczIpCi17Ci0Jc3RydWN0IHNjYl9hbXBkdSAqc2NiX2FtcGR1OwotCXN0cnVjdCBicmNtc19jX2luZm8gKndsYyA9IGFtcGR1LT53bGM7Ci0Jc3RydWN0IHNjYl9hbXBkdV90aWRfaW5pICppbmk7Ci0JdTggYml0bWFwWzhdLCBxdWV1ZSwgdGlkOwotCXN0cnVjdCBkMTF0eGggKnR4aDsKLQl1OCAqcGxjcDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaDsKLQl1MTYgc2VxLCBzdGFydF9zZXEgPSAwLCBiaW5kZXgsIGluZGV4LCBtY2w7Ci0JdTggbWNzID0gMDsKLQlib29sIGJhX3JlY2QgPSBmYWxzZSwgYWNrX3JlY2QgPSBmYWxzZTsKLQl1OCBzdWNfbXBkdSA9IDAsIHRvdF9tcGR1ID0gMDsKLQl1aW50IHN1cHJfc3RhdHVzOwotCWJvb2wgdXBkYXRlX3JhdGUgPSB0cnVlLCByZXRyeSA9IHRydWUsIHR4X2Vycm9yID0gZmFsc2U7Ci0JdTE2IG1pbW9hbnRzZWwgPSAwOwotCXU4IGFudHNlbGlkID0gMDsKLQl1OCByZXRyeV9saW1pdCwgcnJfcmV0cnlfbGltaXQ7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eF9pbmZvID0gSUVFRTgwMjExX1NLQl9DQihwKTsKLQlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2xjLT53aXBoeTsKLQotI2lmZGVmIEJDTURCRwotCXU4IGhvbGVbQU1QRFVfTUFYX01QRFVdOwotCW1lbXNldChob2xlLCAwLCBzaXplb2YoaG9sZSkpOwotI2VuZGlmCi0KLQlzY2JfYW1wZHUgPSBTQ0JfQU1QRFVfQ1VCQlkoYW1wZHUsIHNjYik7Ci0JdGlkID0gKHU4KSAocC0+cHJpb3JpdHkpOwotCi0JaW5pID0gU0NCX0FNUERVX0lOSShzY2JfYW1wZHUsIHRpZCk7Ci0JcmV0cnlfbGltaXQgPSBhbXBkdS0+cmV0cnlfbGltaXRfdGlkW3RpZF07Ci0JcnJfcmV0cnlfbGltaXQgPSBhbXBkdS0+cnJfcmV0cnlfbGltaXRfdGlkW3RpZF07Ci0JbWVtc2V0KGJpdG1hcCwgMCwgc2l6ZW9mKGJpdG1hcCkpOwotCXF1ZXVlID0gdHhzLT5mcmFtZWlkICYgVFhGSURfUVVFVUVfTUFTSzsKLQlzdXByX3N0YXR1cyA9IHR4cy0+c3RhdHVzICYgVFhfU1RBVFVTX1NVUFJfTUFTSzsKLQotCWlmICh0eHMtPnN0YXR1cyAmIFRYX1NUQVRVU19BQ0tfUkNWKSB7Ci0JCWlmIChUWF9TVEFUVVNfU1VQUl9VRiA9PSBzdXByX3N0YXR1cykgewotCQkJdXBkYXRlX3JhdGUgPSBmYWxzZTsKLQkJfQotCi0JCVdBUk5fT04oISh0eHMtPnN0YXR1cyAmIFRYX1NUQVRVU19JTlRFUk1FRElBVEUpKTsKLQkJc3RhcnRfc2VxID0gdHhzLT5zZXF1ZW5jZSA+PiBTRVFOVU1fU0hJRlQ7Ci0JCWJpdG1hcFswXSA9ICh0eHMtPnN0YXR1cyAmIFRYX1NUQVRVU19CQV9CTUFQMDNfTUFTSykgPj4KLQkJICAgIFRYX1NUQVRVU19CQV9CTUFQMDNfU0hJRlQ7Ci0KLQkJV0FSTl9PTihzMSAmIFRYX1NUQVRVU19JTlRFUk1FRElBVEUpOwotCQlXQVJOX09OKCEoczEgJiBUWF9TVEFUVVNfQU1QRFUpKTsKLQotCQliaXRtYXBbMF0gfD0KLQkJICAgIChzMSAmIFRYX1NUQVRVU19CQV9CTUFQNDdfTUFTSykgPDwKLQkJICAgIFRYX1NUQVRVU19CQV9CTUFQNDdfU0hJRlQ7Ci0JCWJpdG1hcFsxXSA9IChzMSA+PiA4KSAmIDB4ZmY7Ci0JCWJpdG1hcFsyXSA9IChzMSA+PiAxNikgJiAweGZmOwotCQliaXRtYXBbM10gPSAoczEgPj4gMjQpICYgMHhmZjsKLQotCQliaXRtYXBbNF0gPSBzMiAmIDB4ZmY7Ci0JCWJpdG1hcFs1XSA9IChzMiA+PiA4KSAmIDB4ZmY7Ci0JCWJpdG1hcFs2XSA9IChzMiA+PiAxNikgJiAweGZmOwotCQliaXRtYXBbN10gPSAoczIgPj4gMjQpICYgMHhmZjsKLQotCQliYV9yZWNkID0gdHJ1ZTsKLQl9IGVsc2UgewotCQlpZiAoc3Vwcl9zdGF0dXMpIHsKLQkJCXVwZGF0ZV9yYXRlID0gZmFsc2U7Ci0JCQlpZiAoc3Vwcl9zdGF0dXMgPT0gVFhfU1RBVFVTX1NVUFJfQkFEQ0gpIHsKLQkJCQl3aXBoeV9lcnIod2lwaHksICIlczogUGt0IHR4IHN1cHByZXNzZWQsICIKLQkJCQkJICAiaWxsZWdhbCBjaGFubmVsIHBvc3NpYmx5ICVkXG4iLAotCQkJCQkgIF9fZnVuY19fLCBDSFNQRUNfQ0hBTk5FTCgKLQkJCQkJICB3bGMtPmRlZmF1bHRfYnNzLT5jaGFuc3BlYykpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoc3Vwcl9zdGF0dXMgIT0gVFhfU1RBVFVTX1NVUFJfRlJBRykKLQkJCQkJd2lwaHlfZXJyKHdpcGh5LCAiJXM6IgotCQkJCQkJICAic3Vwcl9zdGF0dXMgMHgleFxuIiwKLQkJCQkJCSAgX19mdW5jX18sIHN1cHJfc3RhdHVzKTsKLQkJCX0KLQkJCS8qIG5vIG5lZWQgdG8gcmV0cnkgZm9yIGJhZGNoOyB3aWxsIGZhaWwgYWdhaW4gKi8KLQkJCWlmIChzdXByX3N0YXR1cyA9PSBUWF9TVEFUVVNfU1VQUl9CQURDSCB8fAotCQkJICAgIHN1cHJfc3RhdHVzID09IFRYX1NUQVRVU19TVVBSX0VYUFRJTUUpIHsKLQkJCQlyZXRyeSA9IGZhbHNlOwotCQkJfSBlbHNlIGlmIChzdXByX3N0YXR1cyA9PSBUWF9TVEFUVVNfU1VQUl9FWFBUSU1FKSB7Ci0JCQkJLyogVFggdW5kZXJmbG93IDogdHJ5IHR1bmluZyBwcmUtbG9hZGluZyBvciBhbXBkdSBzaXplICovCi0JCQl9IGVsc2UgaWYgKHN1cHJfc3RhdHVzID09IFRYX1NUQVRVU19TVVBSX0ZSQUcpIHsKLQkJCQkvKiBpZiB0aGVyZSB3ZXJlIHVuZGVyZmxvd3MsIGJ1dCBwcmUtbG9hZGluZyBpcyBub3QgYWN0aXZlLAotCQkJCSAgIG5vdGlmeSByYXRlIGFkYXB0YXRpb24uCi0JCQkJICovCi0JCQkJaWYgKGJyY21zX2NfZmZwbGRfY2hlY2tfdHhmdW5mbCh3bGMsCi0JCQkJCQkJcHJpbzJmaWZvW3RpZF0pID4gMCkgewotCQkJCQl0eF9lcnJvciA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKHR4cy0+cGh5ZXJyKSB7Ci0JCQl1cGRhdGVfcmF0ZSA9IGZhbHNlOwotCQkJd2lwaHlfZXJyKHdpcGh5LCAid2wlZDogYW1wZHUgdHggcGh5ICIKLQkJCQkgICJlcnJvciAoMHgleClcbiIsIHdsYy0+cHViLT51bml0LAotCQkJCSAgdHhzLT5waHllcnIpOwotCi0JCQlpZiAoV0xfRVJST1JfT04oKSkgewotCQkJCWJyY211X3BycGt0KCJ0eHBrdCAoQU1QRFUpIiwgcCk7Ci0JCQkJYnJjbXNfY19wcmludF90eGRlc2MoKHN0cnVjdCBkMTF0eGggKikgcC0+ZGF0YSk7Ci0JCQl9Ci0JCQlicmNtc19jX3ByaW50X3R4c3RhdHVzKHR4cyk7Ci0JCX0KLQl9Ci0KLQkvKiBsb29wIHRocm91Z2ggYWxsIHBrdHMgYW5kIHJldHJ5IGlmIG5vdCBhY2tlZCAqLwotCXdoaWxlIChwKSB7Ci0JCXR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKHApOwotCQl0eGggPSAoc3RydWN0IGQxMXR4aCAqKSBwLT5kYXRhOwotCQltY2wgPSBsZTE2X3RvX2NwdSh0eGgtPk1hY1R4Q29udHJvbExvdyk7Ci0JCXBsY3AgPSAodTggKikgKHR4aCArIDEpOwotCQloID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopKHBsY3AgKyBEMTFfUEhZX0hEUl9MRU4pOwotCQlzZXEgPSBsZTE2X3RvX2NwdShoLT5zZXFfY3RybCkgPj4gU0VRTlVNX1NISUZUOwotCi0JCWlmICh0b3RfbXBkdSA9PSAwKSB7Ci0JCQltY3MgPSBwbGNwWzBdICYgTUlNT19QTENQX01DU19NQVNLOwotCQkJbWltb2FudHNlbCA9IGxlMTZfdG9fY3B1KHR4aC0+QUJJX01pbW9BbnRTZWwpOwotCQl9Ci0KLQkJaW5kZXggPSBUWF9TRVFfVE9fSU5ERVgoc2VxKTsKLQkJYWNrX3JlY2QgPSBmYWxzZTsKLQkJaWYgKGJhX3JlY2QpIHsKLQkJCWJpbmRleCA9IE1PRFNVQl9QT1cyKHNlcSwgc3RhcnRfc2VxLCBTRVFOVU1fTUFYKTsKLQkJCUJDTU1TRyh3bGMtPndpcGh5LCAidGlkICVkIHNlcSAlZCwiCi0JCQkJIiBzdGFydF9zZXEgJWQsIGJpbmRleCAlZCBzZXQgJWQsIGluZGV4ICVkXG4iLAotCQkJCXRpZCwgc2VxLCBzdGFydF9zZXEsIGJpbmRleCwKLQkJCQlpc3NldChiaXRtYXAsIGJpbmRleCksIGluZGV4KTsKLQkJCS8qIGlmIGFja2VkIHRoZW4gY2xlYXIgYml0IGFuZCBmcmVlIHBhY2tldCAqLwotCQkJaWYgKChiaW5kZXggPCBBTVBEVV9UWF9CQV9NQVhfV1NJWkUpCi0JCQkgICAgJiYgaXNzZXQoYml0bWFwLCBiaW5kZXgpKSB7Ci0JCQkJaW5pLT50eF9pbl90cmFuc2l0LS07Ci0JCQkJaW5pLT50eHJldHJ5W2luZGV4XSA9IDA7Ci0KLQkJCQkvKiBhbXBkdV9hY2tfbGVuOiBudW1iZXIgb2YgYWNrZWQgYWdncmVnYXRlZCBmcmFtZXMgKi8KLQkJCQkvKiBhbXBkdV9sZW46IG51bWJlciBvZiBhZ2dyZWdhdGVkIGZyYW1lcyAqLwotCQkJCWJyY21zX2NfYW1wZHVfcmF0ZV9zdGF0dXMod2xjLCB0eF9pbmZvLCB0eHMsCi0JCQkJCQkJICBtY3MpOwotCQkJCXR4X2luZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX0FDSzsKLQkJCQl0eF9pbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfU1RBVF9BTVBEVTsKLQkJCQl0eF9pbmZvLT5zdGF0dXMuYW1wZHVfYWNrX2xlbiA9Ci0JCQkJCXR4X2luZm8tPnN0YXR1cy5hbXBkdV9sZW4gPSAxOwotCi0JCQkJc2tiX3B1bGwocCwgRDExX1BIWV9IRFJfTEVOKTsKLQkJCQlza2JfcHVsbChwLCBEMTFfVFhIX0xFTik7Ci0KLQkJCQlpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUod2xjLT5wdWItPmllZWVfaHcsCi0JCQkJCQkJICAgIHApOwotCQkJCWFja19yZWNkID0gdHJ1ZTsKLQkJCQlzdWNfbXBkdSsrOwotCQkJfQotCQl9Ci0JCS8qIGVpdGhlciByZXRyYW5zbWl0IG9yIHNlbmQgYmFyIGlmIGFjayBub3QgcmVjZCAqLwotCQlpZiAoIWFja19yZWNkKSB7Ci0JCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUgKnR4cmF0ZSA9Ci0JCQkgICAgdHhfaW5mby0+c3RhdHVzLnJhdGVzOwotCQkJaWYgKHJldHJ5ICYmICh0eHJhdGVbMF0uY291bnQgPCAoaW50KXJldHJ5X2xpbWl0KSkgewotCQkJCWluaS0+dHhyZXRyeVtpbmRleF0rKzsKLQkJCQlpbmktPnR4X2luX3RyYW5zaXQtLTsKLQkJCQkvKiBVc2UgaGlnaCBwcmVkZWRlbmNlIGZvciByZXRyYW5zbWl0IHRvIGdpdmUgc29tZSBwdW5jaCAqLwotCQkJCS8qIGJyY21zX2NfdHhxX2VucSh3bGMsIHNjYiwgcCwKLQkJCQkgKiBCUkNNU19QUklPX1RPX1BSRUModGlkKSk7ICovCi0JCQkJYnJjbXNfY190eHFfZW5xKHdsYywgc2NiLCBwLAotCQkJCQkgICAgQlJDTVNfUFJJT19UT19ISV9QUkVDKHRpZCkpOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBSZXRyeSB0aW1lb3V0ICovCi0JCQkJaW5pLT50eF9pbl90cmFuc2l0LS07Ci0JCQkJaWVlZTgwMjExX3R4X2luZm9fY2xlYXJfc3RhdHVzKHR4X2luZm8pOwotCQkJCXR4X2luZm8tPnN0YXR1cy5hbXBkdV9hY2tfbGVuID0gMDsKLQkJCQl0eF9pbmZvLT5zdGF0dXMuYW1wZHVfbGVuID0gMTsKLQkJCQl0eF9pbmZvLT5mbGFncyB8PQotCQkJCSAgICBJRUVFODAyMTFfVFhfU1RBVF9BTVBEVV9OT19CQUNLOwotCQkJCXNrYl9wdWxsKHAsIEQxMV9QSFlfSERSX0xFTik7Ci0JCQkJc2tiX3B1bGwocCwgRDExX1RYSF9MRU4pOwotCQkJCXdpcGh5X2Vycih3aXBoeSwgIiVzOiBCQSBUaW1lb3V0LCBzZXEgJWQsIGluXyIKLQkJCQkJInRyYW5zaXQgJWRcbiIsIFNIT1JUTkFNRSwgc2VxLAotCQkJCQlpbmktPnR4X2luX3RyYW5zaXQpOwotCQkJCWllZWU4MDIxMV90eF9zdGF0dXNfaXJxc2FmZSh3bGMtPnB1Yi0+aWVlZV9odywKLQkJCQkJCQkgICAgcCk7Ci0JCQl9Ci0JCX0KLQkJdG90X21wZHUrKzsKLQotCQkvKiBicmVhayBvdXQgaWYgbGFzdCBwYWNrZXQgb2YgYW1wZHUgKi8KLQkJaWYgKCgobWNsICYgVFhDX0FNUERVX01BU0spID4+IFRYQ19BTVBEVV9TSElGVCkgPT0KLQkJICAgIFRYQ19BTVBEVV9MQVNUKQotCQkJYnJlYWs7Ci0KLQkJcCA9IEdFVE5FWFRUWFAod2xjLCBxdWV1ZSk7Ci0JfQotCWJyY21zX2Nfc2VuZF9xKHdsYyk7Ci0KLQkvKiB1cGRhdGUgcmF0ZSBzdGF0ZSAqLwotCWFudHNlbGlkID0gYnJjbXNfY19hbnRzZWxfYW50c2VsMmlkKHdsYy0+YXNpLCBtaW1vYW50c2VsKTsKLQotCWJyY21zX2NfdHhmaWZvX2NvbXBsZXRlKHdsYywgcXVldWUsIGFtcGR1LT50eHBrdF93ZWlnaHQpOwotfQotCi1zdGF0aWMgaW50IGJyY21zX2NfYW1wZHVfc2V0KHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgYm9vbCBvbikKLXsKLQlzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMgPSBhbXBkdS0+d2xjOwotCi0Jd2xjLT5wdWItPl9hbXBkdSA9IGZhbHNlOwotCi0JaWYgKG9uKSB7Ci0JCWlmICghTl9FTkFCKHdsYy0+cHViKSkgewotCQkJd2lwaHlfZXJyKGFtcGR1LT53bGMtPndpcGh5LCAid2wlZDogZHJpdmVyIG5vdCAiCi0JCQkJIm5tb2RlIGVuYWJsZWRcbiIsIHdsYy0+cHViLT51bml0KTsKLQkJCXJldHVybiAtRU5PVFNVUFA7Ci0JCX0KLQkJaWYgKCFicmNtc19jX2FtcGR1X2NhcChhbXBkdSkpIHsKLQkJCXdpcGh5X2VycihhbXBkdS0+d2xjLT53aXBoeSwgIndsJWQ6IGRldmljZSBub3QgIgotCQkJCSJhbXBkdSBjYXBhYmxlXG4iLCB3bGMtPnB1Yi0+dW5pdCk7Ci0JCQlyZXR1cm4gLUVOT1RTVVBQOwotCQl9Ci0JCXdsYy0+cHViLT5fYW1wZHUgPSBvbjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGJvb2wgYnJjbXNfY19hbXBkdV9jYXAoc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1KQotewotCWlmIChCUkNNU19QSFlfMTFOX0NBUChhbXBkdS0+d2xjLT5iYW5kKSkKLQkJcmV0dXJuIHRydWU7Ci0JZWxzZQotCQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21zX2Nfc2NiX2FtcGR1X3VwZGF0ZV9tYXhfdHhsZW4oc3RydWN0IGFtcGR1X2luZm8gKmFtcGR1LCB1OCBkdXIpCi17Ci0JdTMyIHJhdGUsIG1jczsKLQotCWZvciAobWNzID0gMDsgbWNzIDwgTUNTX1RBQkxFX1NJWkU7IG1jcysrKSB7Ci0JCS8qIHJhdGUgaXMgaW4gS2JwczsgZHVyIGlzIGluIG1zZWMgPT0+IGxlbiA9IChyYXRlICogZHVyKSAvIDggKi8KLQkJLyogMjBNSHosIE5vIFNHSSAqLwotCQlyYXRlID0gTUNTX1JBVEUobWNzLCBmYWxzZSwgZmFsc2UpOwotCQlhbXBkdS0+bWF4X3R4bGVuW21jc11bMF1bMF0gPSAocmF0ZSAqIGR1cikgPj4gMzsKLQkJLyogNDAgTUh6LCBObyBTR0kgKi8KLQkJcmF0ZSA9IE1DU19SQVRFKG1jcywgdHJ1ZSwgZmFsc2UpOwotCQlhbXBkdS0+bWF4X3R4bGVuW21jc11bMV1bMF0gPSAocmF0ZSAqIGR1cikgPj4gMzsKLQkJLyogMjBNSHosIFNHSSAqLwotCQlyYXRlID0gTUNTX1JBVEUobWNzLCBmYWxzZSwgdHJ1ZSk7Ci0JCWFtcGR1LT5tYXhfdHhsZW5bbWNzXVswXVsxXSA9IChyYXRlICogZHVyKSA+PiAzOwotCQkvKiA0MCBNSHosIFNHSSAqLwotCQlyYXRlID0gTUNTX1JBVEUobWNzLCB0cnVlLCB0cnVlKTsKLQkJYW1wZHUtPm1heF90eGxlblttY3NdWzFdWzFdID0gKHJhdGUgKiBkdXIpID4+IDM7Ci0JfQotfQotCi12b2lkIGJyY21zX2NfYW1wZHVfbWFjYWRkcl91cGQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCWNoYXIgdGVtcGxhdGVbVF9SQU1fQUNDRVNTX1NaICogMl07Ci0KLQkvKiBkcml2ZXIgbmVlZHMgdG8gd3JpdGUgdGhlIHRhIGluIHRoZSB0ZW1wbGF0ZTsgdGEgaXMgYXQgb2Zmc2V0IDE2ICovCi0JbWVtc2V0KHRlbXBsYXRlLCAwLCBzaXplb2YodGVtcGxhdGUpKTsKLQltZW1jcHkodGVtcGxhdGUsIHdsYy0+cHViLT5jdXJfZXRoZXJhZGRyLCBFVEhfQUxFTik7Ci0JYnJjbXNfY193cml0ZV90ZW1wbGF0ZV9yYW0od2xjLCAoVF9CQV9UUExfQkFTRSArIDE2KSwKLQkJCQkgIChUX1JBTV9BQ0NFU1NfU1ogKiAyKSwKLQkJCQkgIHRlbXBsYXRlKTsKLX0KLQotYm9vbCBicmNtc19jX2FnZ3JlZ2F0YWJsZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHU4IHRpZCkKLXsKLQlyZXR1cm4gd2xjLT5hbXBkdS0+aW5pX2VuYWJsZVt0aWRdOwotfQotCi12b2lkIGJyY21zX2NfYW1wZHVfc2htX3VwZChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpCi17Ci0Jc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjID0gYW1wZHUtPndsYzsKLQotCS8qIEV4dGVuZCB1Y29kZSBpbnRlcm5hbCB3YXRjaGRvZyB0aW1lciB0byBtYXRjaCBsYXJnZXIgcmVjZWl2ZWQgZnJhbWVzICovCi0JaWYgKChhbXBkdS0+cnhfZmFjdG9yICYgSUVFRTgwMjExX0hUX0FNUERVX1BBUk1fRkFDVE9SKSA9PQotCSAgICBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SykgewotCQlicmNtc19jX3dyaXRlX3NobSh3bGMsIE1fTUlNT19NQVhTWU0sIE1JTU9fTUFYU1lNX01BWCk7Ci0JCWJyY21zX2Nfd3JpdGVfc2htKHdsYywgTV9XQVRDSERPR184VFUsIFdBVENIRE9HXzhUVV9NQVgpOwotCX0gZWxzZSB7Ci0JCWJyY21zX2Nfd3JpdGVfc2htKHdsYywgTV9NSU1PX01BWFNZTSwgTUlNT19NQVhTWU1fREVGKTsKLQkJYnJjbXNfY193cml0ZV9zaG0od2xjLCBNX1dBVENIRE9HXzhUVSwgV0FUQ0hET0dfOFRVX0RFRik7Ci0JfQotfQotCi0vKgotICogY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBoZWxwcyBmbHVzaGluZyBhbXBkdSBwYWNrZXRzIGZyb20gYSBwcmlvcml0eSBxdWV1ZQotICovCi1zdGF0aWMgYm9vbCBjYl9kZWxfYW1wZHVfcGt0KHN0cnVjdCBza19idWZmICptcGR1LCB2b2lkICphcmdfYSkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKG1wZHUpOwotCXN0cnVjdCBjYl9kZWxfYW1wZHVfcGFycyAqYW1wZHVfcGFycyA9Ci0JCQkJIChzdHJ1Y3QgY2JfZGVsX2FtcGR1X3BhcnMgKilhcmdfYTsKLQlib29sIHJjOwotCi0JcmMgPSB0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUgPyB0cnVlIDogZmFsc2U7Ci0JcmMgPSByYyAmJiAodHhfaW5mby0+Y29udHJvbC5zdGEgPT0gTlVMTCB8fCBhbXBkdV9wYXJzLT5zdGEgPT0gTlVMTCB8fAotCQkgICAgdHhfaW5mby0+Y29udHJvbC5zdGEgPT0gYW1wZHVfcGFycy0+c3RhKTsKLQlyYyA9IHJjICYmICgodTgpKG1wZHUtPnByaW9yaXR5KSA9PSBhbXBkdV9wYXJzLT50aWQpOwotCXJldHVybiByYzsKLX0KLQotLyoKLSAqIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgaGVscHMgaW52YWxpZGF0aW5nIGFtcGR1IHBhY2tldHMgaW4gYSBETUEgcXVldWUKLSAqLwotc3RhdGljIHZvaWQgZG1hX2NiX2ZuX2FtcGR1KHZvaWQgKnR4aSwgdm9pZCAqYXJnX2EpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSA9IGFyZ19hOwotCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbyA9IChzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKil0eGk7Ci0KLQlpZiAoKHR4X2luZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkgJiYKLQkgICAgKHR4X2luZm8tPmNvbnRyb2wuc3RhID09IHN0YSB8fCBzdGEgPT0gTlVMTCkpCi0JCXR4X2luZm8tPmNvbnRyb2wuc3RhID0gTlVMTDsKLX0KLQotLyoKLSAqIFdoZW4gYSByZW1vdGUgcGFydHkgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSBmb3IgYW1wZHUgY29tbXVuaWNhdGlvbiwgYW55Ci0gKiBwZW5kaW5nIHR4IGFtcGR1IHBhY2tldHMgaW4gdGhlIGRyaXZlciBoYXZlIHRvIGJlIGZsdXNoZWQuCi0gKi8KLXZvaWQgYnJjbXNfY19hbXBkdV9mbHVzaChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsCi0JCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCkKLXsKLQlzdHJ1Y3QgYnJjbXNfdHhxX2luZm8gKnFpID0gd2xjLT5wa3RfcXVldWU7Ci0Jc3RydWN0IHBrdHEgKnBxID0gJnFpLT5xOwotCWludCBwcmVjOwotCXN0cnVjdCBjYl9kZWxfYW1wZHVfcGFycyBhbXBkdV9wYXJzOwotCi0JYW1wZHVfcGFycy5zdGEgPSBzdGE7Ci0JYW1wZHVfcGFycy50aWQgPSB0aWQ7Ci0JZm9yIChwcmVjID0gMDsgcHJlYyA8IHBxLT5udW1fcHJlYzsgcHJlYysrKSB7Ci0JCWJyY211X3BrdHFfcGZsdXNoKHBxLCBwcmVjLCB0cnVlLCBjYl9kZWxfYW1wZHVfcGt0LAotCQkJICAgICh2b2lkICopJmFtcGR1X3BhcnMpOwotCX0KLQlicmNtc19jX2ludmFsX2RtYV9wa3RzKHdsYy0+aHcsIHN0YSwgZG1hX2NiX2ZuX2FtcGR1KTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvYW1wZHUuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvYW1wZHUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxZjRiYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL2FtcGR1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfQlJDTV9BTVBEVV9IXwotI2RlZmluZSBfQlJDTV9BTVBEVV9IXwotCi1leHRlcm4gc3RydWN0IGFtcGR1X2luZm8gKmJyY21zX2NfYW1wZHVfYXR0YWNoKHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1leHRlcm4gdm9pZCBicmNtc19jX2FtcGR1X2RldGFjaChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpOwotZXh0ZXJuIGludCBicmNtc19jX3NlbmRhbXBkdShzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUsCi0JCQkgICAgIHN0cnVjdCBicmNtc190eHFfaW5mbyAqcWksCi0JCQkgICAgIHN0cnVjdCBza19idWZmICoqYWdncCwgaW50IHByZWMpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19hbXBkdV9kb3R4c3RhdHVzKHN0cnVjdCBhbXBkdV9pbmZvICphbXBkdSwgc3RydWN0IHNjYiAqc2NiLAotCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqcCwgc3RydWN0IHR4X3N0YXR1cyAqdHhzKTsKLWV4dGVybiB2b2lkIGJyY21zX2NfYW1wZHVfbWFjYWRkcl91cGQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKLWV4dGVybiB2b2lkIGJyY21zX2NfYW1wZHVfc2htX3VwZChzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHUpOwotCi0jZW5kaWYJCQkJLyogX0JSQ01fQU1QRFVfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvYW50c2VsLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL2FudHNlbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGU3NmMwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvYW50c2VsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0KLSNpbmNsdWRlICJ0eXBlcy5oIgotI2luY2x1ZGUgImJtYWMuaCIKLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAicGh5X3NoaW0uaCIKLSNpbmNsdWRlICJhbnRzZWwuaCIKLQotI2RlZmluZSBBTlRfU0VMQ0ZHX0FVVE8JCTB4ODAJLyogYml0IGluZGljYXRlcyBhbnRlbm5hIHNlbCBBVVRPICovCi0jZGVmaW5lIEFOVF9TRUxDRkdfTUFTSwkJMHgzMwkvKiBhbnRlbm5hIGNvbmZpZ3VyYXRpb24gbWFzayAqLwotI2RlZmluZSBBTlRfU0VMQ0ZHX1RYX1VOSUNBU1QJMAkvKiB1bmljYXN0IHR4IGFudGVubmEgY29uZmlndXJhdGlvbiAqLwotI2RlZmluZSBBTlRfU0VMQ0ZHX1JYX1VOSUNBU1QJMQkvKiB1bmljYXN0IHJ4IGFudGVubmEgY29uZmlndXJhdGlvbiAqLwotI2RlZmluZSBBTlRfU0VMQ0ZHX1RYX0RFRgkyCS8qIGRlZmF1bHQgdHggYW50ZW5uYSBjb25maWd1cmF0aW9uICovCi0jZGVmaW5lIEFOVF9TRUxDRkdfUlhfREVGCTMJLyogZGVmYXVsdCByeCBhbnRlbm5hIGNvbmZpZ3VyYXRpb24gKi8KLQotLyogdXNlZnVsIG1hY3JvcyAqLwotI2RlZmluZSBCUkNNU19BTlRTRUxfMTFOXzAoYW50KQkoKCgoYW50KSAmIEFOVF9TRUxDRkdfTUFTSykgPj4gNCkgJiAweGYpCi0jZGVmaW5lIEJSQ01TX0FOVFNFTF8xMU5fMShhbnQpCSgoKGFudCkgJiBBTlRfU0VMQ0ZHX01BU0spICYgMHhmKQotI2RlZmluZSBCUkNNU19BTlRJRFhfMTFOKGFudCkJKCgoQlJDTVNfQU5UU0VMXzExTl8wKGFudCkpIDw8IDIpICtcCi0JCQkJKEJSQ01TX0FOVFNFTF8xMU5fMShhbnQpKSkKLSNkZWZpbmUgQlJDTVNfQU5UX0lTQVVUT18xMU4oYW50KSAoKChhbnQpICYgQU5UX1NFTENGR19BVVRPKSA9PSBBTlRfU0VMQ0ZHX0FVVE8pCi0jZGVmaW5lIEJSQ01TX0FOVFNFTF8xMU4oYW50KQkoKGFudCkgJiBBTlRfU0VMQ0ZHX01BU0spCi0KLS8qIGFudGVubmEgc3dpdGNoICovCi0vKiBkZWZpbmVzIGZvciBubyBib2FyZGxldmVsIGFudGVubmEgZGl2ZXJzaXR5ICovCi0jZGVmaW5lIEFOVF9TRUxDRkdfREVGXzJ4MgkweDAxCS8qIGRlZmF1bHQgYW50ZW5uYSBjb25maWd1cmF0aW9uICovCi0KLS8qIDJ4MyBhbnRkaXYgZGVmaW5lcyBhbmQgdGFibGVzIGZvciBHUElPIGNvbW11bmljYXRpb24gKi8KLSNkZWZpbmUgQU5UX1NFTENGR19OVU1fMngzCTMKLSNkZWZpbmUgQU5UX1NFTENGR19ERUZfMngzCTB4MDEJLyogZGVmYXVsdCBhbnRlbm5hIGNvbmZpZ3VyYXRpb24gKi8KLQotLyogMng0IGFudGRpdiByZXY0IGRlZmluZXMgYW5kIHRhYmxlcyBmb3IgR1BJTyBjb21tdW5pY2F0aW9uICovCi0jZGVmaW5lIEFOVF9TRUxDRkdfTlVNXzJ4NAk0Ci0jZGVmaW5lIEFOVF9TRUxDRkdfREVGXzJ4NAkweDAyCS8qIGRlZmF1bHQgYW50ZW5uYSBjb25maWd1cmF0aW9uICovCi0KLS8qIHN0YXRpYyBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgYnJjbXNfY19hbnRzZWxfY2ZndXBkKHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpLAotCQkJCSBzdHJ1Y3QgYnJjbXNfYW50c2VsY2ZnICphbnRzZWwpOwotc3RhdGljIHU4IGJyY21zX2NfYW50c2VsX2lkMmFudGNmZyhzdHJ1Y3QgYW50c2VsX2luZm8gKmFzaSwgdTggaWQpOwotc3RhdGljIHUxNiBicmNtc19jX2FudHNlbF9hbnRjZmcyYW50c2VsKHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpLCB1OCBhbnRfY2ZnKTsKLXN0YXRpYyB2b2lkIGJyY21zX2NfYW50c2VsX2luaXRfY2ZnKHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpLAotCQkJCXN0cnVjdCBicmNtc19hbnRzZWxjZmcgKmFudHNlbCwKLQkJCQlib29sIGF1dG9fc2VsKTsKLQotY29uc3QgdTE2IG1pbW9fMng0X2Rpdl9hbnRzZWxwYXRfdGJsW10gPSB7Ci0JMCwgMCwgMHg5LCAweGEsCQkvKiBhbnQwOiAwIGFudDE6IDIsMyAqLwotCTAsIDAsIDB4NSwgMHg2LAkJLyogYW50MDogMSBhbnQxOiAyLDMgKi8KLQkwLCAwLCAwLCAwLAkJLyogbi5hLiAgICAgICAgICAgICAgKi8KLQkwLCAwLCAwLCAwCQkvKiBuLmEuICAgICAgICAgICAgICAqLwotfTsKLQotY29uc3QgdTggbWltb18yeDRfZGl2X2FudHNlbGlkX3RibFsxNl0gPSB7Ci0JMCwgMCwgMCwgMCwgMCwgMiwgMywgMCwKLQkwLCAwLCAxLCAwLCAwLCAwLCAwLCAwCS8qIHBhdCB0byBhbnRzZWxpZCAqLwotfTsKLQotY29uc3QgdTE2IG1pbW9fMngzX2Rpdl9hbnRzZWxwYXRfdGJsW10gPSB7Ci0JMTYsIDAsIDEsIDE2LAkJLyogYW50MDogMCBhbnQxOiAxLDIgKi8KLQkxNiwgMTYsIDE2LCAxNiwJCS8qIG4uYS4gICAgICAgICAgICAgICovCi0JMTYsIDIsIDE2LCAxNiwJCS8qIGFudDA6IDIgYW50MTogMSAgICovCi0JMTYsIDE2LCAxNiwgMTYJCS8qIG4uYS4gICAgICAgICAgICAgICovCi19OwotCi1jb25zdCB1OCBtaW1vXzJ4M19kaXZfYW50c2VsaWRfdGJsWzE2XSA9IHsKLQkwLCAxLCAyLCAwLCAwLCAwLCAwLCAwLAotCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAJLyogcGF0IHRvIGFudHNlbGlkICovCi19OwotCi1zdHJ1Y3QgYW50c2VsX2luZm8gKmJyY21zX2NfYW50c2VsX2F0dGFjaChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0Jc3RydWN0IGFudHNlbF9pbmZvICphc2k7Ci0KLQlhc2kgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYW50c2VsX2luZm8pLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWFzaSkgewotCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIndsJWQ6IGJyY21zX2NfYW50c2VsX2F0dGFjaDogb3V0IG9mICIKLQkJCSAgIm1lbVxuIiwgd2xjLT5wdWItPnVuaXQpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlhc2ktPndsYyA9IHdsYzsKLQlhc2ktPnB1YiA9IHdsYy0+cHViOwotCWFzaS0+YW50c2VsX3R5cGUgPSBBTlRTRUxfTkE7Ci0JYXNpLT5hbnRzZWxfYXZhaWwgPSBmYWxzZTsKLQlhc2ktPmFudHNlbF9hbnRzd2l0Y2ggPSAodTgpIGdldGludHZhcihhc2ktPnB1Yi0+dmFycywgImFudHN3aXRjaCIpOwotCi0JaWYgKChhc2ktPnB1Yi0+c3JvbXJldiA+PSA0KSAmJiAoYXNpLT5hbnRzZWxfYW50c3dpdGNoICE9IDApKSB7Ci0JCXN3aXRjaCAoYXNpLT5hbnRzZWxfYW50c3dpdGNoKSB7Ci0JCWNhc2UgQU5UU1dJVENIX1RZUEVfMToKLQkJY2FzZSBBTlRTV0lUQ0hfVFlQRV8yOgotCQljYXNlIEFOVFNXSVRDSF9UWVBFXzM6Ci0JCQkvKiA0MzIxLzIgYm9hcmQgd2l0aCAyeDMgc3dpdGNoIGxvZ2ljICovCi0JCQlhc2ktPmFudHNlbF90eXBlID0gQU5UU0VMXzJ4MzsKLQkJCS8qIEFudGVubmEgc2VsZWN0aW9uIGF2YWlsYWJpbGl0eSAqLwotCQkJaWYgKCgodTE2KSBnZXRpbnR2YXIoYXNpLT5wdWItPnZhcnMsICJhYTJnIikgPT0gNykgfHwKLQkJCSAgICAoKHUxNikgZ2V0aW50dmFyKGFzaS0+cHViLT52YXJzLCAiYWE1ZyIpID09IDcpKSB7Ci0JCQkJYXNpLT5hbnRzZWxfYXZhaWwgPSB0cnVlOwotCQkJfSBlbHNlCi0JCQkgICAgaWYgKCgodTE2KSBnZXRpbnR2YXIoYXNpLT5wdWItPnZhcnMsICJhYTJnIikgPT0KLQkJCQkgMykKLQkJCQl8fCAoKHUxNikgZ2V0aW50dmFyKGFzaS0+cHViLT52YXJzLCAiYWE1ZyIpCi0JCQkJICAgID09IDMpKSB7Ci0JCQkJYXNpLT5hbnRzZWxfYXZhaWwgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNpLT5hbnRzZWxfYXZhaWwgPSBmYWxzZTsKLQkJCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgImFudHNlbF9hdHRhY2g6IDJvMyAiCi0JCQkJCSAgImJvYXJkIGNmZyBpbnZhbGlkXG4iKTsKLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgaWYgKChhc2ktPnB1Yi0+c3JvbXJldiA9PSA0KSAmJgotCQkgICAoKHUxNikgZ2V0aW50dmFyKGFzaS0+cHViLT52YXJzLCAiYWEyZyIpID09IDcpICYmCi0JCSAgICgodTE2KSBnZXRpbnR2YXIoYXNpLT5wdWItPnZhcnMsICJhYTVnIikgPT0gMCkpIHsKLQkJLyogaGFjayB0byBtYXRjaCBvbGQgNDMyMUNCMiBjYXJkcyB3aXRoIDJvZjMgYW50ZW5uYSBzd2l0Y2ggKi8KLQkJYXNpLT5hbnRzZWxfdHlwZSA9IEFOVFNFTF8yeDM7Ci0JCWFzaS0+YW50c2VsX2F2YWlsID0gdHJ1ZTsKLQl9IGVsc2UgaWYgKGFzaS0+cHViLT5ib2FyZGZsYWdzMiAmIEJGTDJfMlg0X0RJVikgewotCQlhc2ktPmFudHNlbF90eXBlID0gQU5UU0VMXzJ4NDsKLQkJYXNpLT5hbnRzZWxfYXZhaWwgPSB0cnVlOwotCX0KLQotCS8qIFNldCB0aGUgYW50ZW5uYSBzZWxlY3Rpb24gdHlwZSBmb3IgdGhlIGxvdyBkcml2ZXIgKi8KLQlicmNtc19iX2FudHNlbF90eXBlX3NldCh3bGMtPmh3LCBhc2ktPmFudHNlbF90eXBlKTsKLQotCS8qIEluaXQgKGF1dG8vbWFudWFsKSBhbnRlbm5hIHNlbGVjdGlvbiAqLwotCWJyY21zX2NfYW50c2VsX2luaXRfY2ZnKGFzaSwgJmFzaS0+YW50Y2ZnXzExbiwgdHJ1ZSk7Ci0JYnJjbXNfY19hbnRzZWxfaW5pdF9jZmcoYXNpLCAmYXNpLT5hbnRjZmdfY3VyLCB0cnVlKTsKLQotCXJldHVybiBhc2k7Ci19Ci0KLXZvaWQgYnJjbXNfY19hbnRzZWxfZGV0YWNoKHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpKQotewotCWtmcmVlKGFzaSk7Ci19Ci0KLXZvaWQgYnJjbXNfY19hbnRzZWxfaW5pdChzdHJ1Y3QgYW50c2VsX2luZm8gKmFzaSkKLXsKLQlpZiAoKGFzaS0+YW50c2VsX3R5cGUgPT0gQU5UU0VMXzJ4MykgfHwKLQkgICAgKGFzaS0+YW50c2VsX3R5cGUgPT0gQU5UU0VMXzJ4NCkpCi0JCWJyY21zX2NfYW50c2VsX2NmZ3VwZChhc2ksICZhc2ktPmFudGNmZ18xMW4pOwotfQotCi0vKiBib2FyZGxldmVsIGFudGVubmEgc2VsZWN0aW9uOiBpbml0IGFudGVubmEgc2VsZWN0aW9uIHN0cnVjdHVyZSAqLwotc3RhdGljIHZvaWQKLWJyY21zX2NfYW50c2VsX2luaXRfY2ZnKHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpLCBzdHJ1Y3QgYnJjbXNfYW50c2VsY2ZnICphbnRzZWwsCi0JCSAgICBib29sIGF1dG9fc2VsKQotewotCWlmIChhc2ktPmFudHNlbF90eXBlID09IEFOVFNFTF8yeDMpIHsKLQkJdTggYW50Y2ZnX2RlZiA9IEFOVF9TRUxDRkdfREVGXzJ4MyB8Ci0JCSAgICAoKGFzaS0+YW50c2VsX2F2YWlsICYmIGF1dG9fc2VsKSA/IEFOVF9TRUxDRkdfQVVUTyA6IDApOwotCQlhbnRzZWwtPmFudF9jb25maWdbQU5UX1NFTENGR19UWF9ERUZdID0gYW50Y2ZnX2RlZjsKLQkJYW50c2VsLT5hbnRfY29uZmlnW0FOVF9TRUxDRkdfVFhfVU5JQ0FTVF0gPSBhbnRjZmdfZGVmOwotCQlhbnRzZWwtPmFudF9jb25maWdbQU5UX1NFTENGR19SWF9ERUZdID0gYW50Y2ZnX2RlZjsKLQkJYW50c2VsLT5hbnRfY29uZmlnW0FOVF9TRUxDRkdfUlhfVU5JQ0FTVF0gPSBhbnRjZmdfZGVmOwotCQlhbnRzZWwtPm51bV9hbnRjZmcgPSBBTlRfU0VMQ0ZHX05VTV8yeDM7Ci0KLQl9IGVsc2UgaWYgKGFzaS0+YW50c2VsX3R5cGUgPT0gQU5UU0VMXzJ4NCkgewotCi0JCWFudHNlbC0+YW50X2NvbmZpZ1tBTlRfU0VMQ0ZHX1RYX0RFRl0gPSBBTlRfU0VMQ0ZHX0RFRl8yeDQ7Ci0JCWFudHNlbC0+YW50X2NvbmZpZ1tBTlRfU0VMQ0ZHX1RYX1VOSUNBU1RdID0gQU5UX1NFTENGR19ERUZfMng0OwotCQlhbnRzZWwtPmFudF9jb25maWdbQU5UX1NFTENGR19SWF9ERUZdID0gQU5UX1NFTENGR19ERUZfMng0OwotCQlhbnRzZWwtPmFudF9jb25maWdbQU5UX1NFTENGR19SWF9VTklDQVNUXSA9IEFOVF9TRUxDRkdfREVGXzJ4NDsKLQkJYW50c2VsLT5udW1fYW50Y2ZnID0gQU5UX1NFTENGR19OVU1fMng0OwotCi0JfSBlbHNlIHsJCS8qIG5vIGFudGVubmEgc2VsZWN0aW9uIGF2YWlsYWJsZSAqLwotCi0JCWFudHNlbC0+YW50X2NvbmZpZ1tBTlRfU0VMQ0ZHX1RYX0RFRl0gPSBBTlRfU0VMQ0ZHX0RFRl8yeDI7Ci0JCWFudHNlbC0+YW50X2NvbmZpZ1tBTlRfU0VMQ0ZHX1RYX1VOSUNBU1RdID0gQU5UX1NFTENGR19ERUZfMngyOwotCQlhbnRzZWwtPmFudF9jb25maWdbQU5UX1NFTENGR19SWF9ERUZdID0gQU5UX1NFTENGR19ERUZfMngyOwotCQlhbnRzZWwtPmFudF9jb25maWdbQU5UX1NFTENGR19SWF9VTklDQVNUXSA9IEFOVF9TRUxDRkdfREVGXzJ4MjsKLQkJYW50c2VsLT5udW1fYW50Y2ZnID0gMDsKLQl9Ci19Ci0KLXZvaWQKLWJyY21zX2NfYW50c2VsX2FudGNmZ19nZXQoc3RydWN0IGFudHNlbF9pbmZvICphc2ksIGJvb2wgdXNlZGVmLCBib29sIHNlbCwKLQkJICAgICAgdTggYW50c2VsaWQsIHU4IGZiYW50c2VsaWQsIHU4ICphbnRjZmcsCi0JCSAgICAgIHU4ICpmYmFudGNmZykKLXsKLQl1OCBhbnQ7Ci0KLQkvKiBpZiB1c2UgZGVmYXVsdCwgYXNzaWduIGl0IGFuZCByZXR1cm4gKi8KLQlpZiAodXNlZGVmKSB7Ci0JCSphbnRjZmcgPSBhc2ktPmFudGNmZ18xMW4uYW50X2NvbmZpZ1tBTlRfU0VMQ0ZHX1RYX0RFRl07Ci0JCSpmYmFudGNmZyA9ICphbnRjZmc7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoIXNlbCkgewotCQkqYW50Y2ZnID0gYXNpLT5hbnRjZmdfMTFuLmFudF9jb25maWdbQU5UX1NFTENGR19UWF9VTklDQVNUXTsKLQkJKmZiYW50Y2ZnID0gKmFudGNmZzsKLQotCX0gZWxzZSB7Ci0JCWFudCA9IGFzaS0+YW50Y2ZnXzExbi5hbnRfY29uZmlnW0FOVF9TRUxDRkdfVFhfVU5JQ0FTVF07Ci0JCWlmICgoYW50ICYgQU5UX1NFTENGR19BVVRPKSA9PSBBTlRfU0VMQ0ZHX0FVVE8pIHsKLQkJCSphbnRjZmcgPSBicmNtc19jX2FudHNlbF9pZDJhbnRjZmcoYXNpLCBhbnRzZWxpZCk7Ci0JCQkqZmJhbnRjZmcgPSBicmNtc19jX2FudHNlbF9pZDJhbnRjZmcoYXNpLCBmYmFudHNlbGlkKTsKLQkJfSBlbHNlIHsKLQkJCSphbnRjZmcgPQotCQkJICAgIGFzaS0+YW50Y2ZnXzExbi5hbnRfY29uZmlnW0FOVF9TRUxDRkdfVFhfVU5JQ0FTVF07Ci0JCQkqZmJhbnRjZmcgPSAqYW50Y2ZnOwotCQl9Ci0JfQotCXJldHVybjsKLX0KLQotLyogYm9hcmRsZXZlbCBhbnRlbm5hIHNlbGVjdGlvbjogY29udmVydCBtaW1vX2FudHNlbCAodWNvZGUgaW50ZXJmYWNlKSB0byBpZCAqLwotdTggYnJjbXNfY19hbnRzZWxfYW50c2VsMmlkKHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpLCB1MTYgYW50c2VsKQotewotCXU4IGFudHNlbGlkID0gMDsKLQotCWlmIChhc2ktPmFudHNlbF90eXBlID09IEFOVFNFTF8yeDQpIHsKLQkJLyogMng0IGFudGVubmEgZGl2ZXJzaXR5IGJvYXJkLCA0IGNmZ3M6IDAtMiAwLTMgMS0yIDEtMyAqLwotCQlhbnRzZWxpZCA9IG1pbW9fMng0X2Rpdl9hbnRzZWxpZF90YmxbKGFudHNlbCAmIDB4ZildOwotCQlyZXR1cm4gYW50c2VsaWQ7Ci0KLQl9IGVsc2UgaWYgKGFzaS0+YW50c2VsX3R5cGUgPT0gQU5UU0VMXzJ4MykgewotCQkvKiAyeDMgYW50ZW5uYSBzZWxlY3Rpb24sIDMgY2ZnczogMC0xIDAtMiAyLTEgKi8KLQkJYW50c2VsaWQgPSBtaW1vXzJ4M19kaXZfYW50c2VsaWRfdGJsWyhhbnRzZWwgJiAweGYpXTsKLQkJcmV0dXJuIGFudHNlbGlkOwotCX0KLQotCXJldHVybiBhbnRzZWxpZDsKLX0KLQotLyogYm9hcmRsZXZlbCBhbnRlbm5hIHNlbGVjdGlvbjogY29udmVydCBpZCB0byBhbnRfY2ZnICovCi1zdGF0aWMgdTggYnJjbXNfY19hbnRzZWxfaWQyYW50Y2ZnKHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpLCB1OCBpZCkKLXsKLQl1OCBhbnRjZmcgPSBBTlRfU0VMQ0ZHX0RFRl8yeDI7Ci0KLQlpZiAoYXNpLT5hbnRzZWxfdHlwZSA9PSBBTlRTRUxfMng0KSB7Ci0JCS8qIDJ4NCBhbnRlbm5hIGRpdmVyc2l0eSBib2FyZCwgNCBjZmdzOiAwLTIgMC0zIDEtMiAxLTMgKi8KLQkJYW50Y2ZnID0gKCgoaWQgJiAweDIpIDw8IDMpIHwgKChpZCAmIDB4MSkgKyAyKSk7Ci0JCXJldHVybiBhbnRjZmc7Ci0KLQl9IGVsc2UgaWYgKGFzaS0+YW50c2VsX3R5cGUgPT0gQU5UU0VMXzJ4MykgewotCQkvKiAyeDMgYW50ZW5uYSBzZWxlY3Rpb24sIDMgY2ZnczogMC0xIDAtMiAyLTEgKi8KLQkJYW50Y2ZnID0gKCgoaWQgJiAweDAyKSA8PCA0KSB8ICgoaWQgJiAweDEpICsgMSkpOwotCQlyZXR1cm4gYW50Y2ZnOwotCX0KLQotCXJldHVybiBhbnRjZmc7Ci19Ci0KLS8qIGJvYXJkbGV2ZWwgYW50ZW5uYSBzZWxlY3Rpb246IGNvbnZlcnQgYW50X2NmZyB0byBtaW1vX2FudHNlbCAodWNvZGUgaW50ZXJmYWNlKSAqLwotc3RhdGljIHUxNiBicmNtc19jX2FudHNlbF9hbnRjZmcyYW50c2VsKHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpLCB1OCBhbnRfY2ZnKQotewotCXU4IGlkeCA9IEJSQ01TX0FOVElEWF8xMU4oQlJDTVNfQU5UU0VMXzExTihhbnRfY2ZnKSk7Ci0JdTE2IG1pbW9fYW50c2VsID0gMDsKLQotCWlmIChhc2ktPmFudHNlbF90eXBlID09IEFOVFNFTF8yeDQpIHsKLQkJLyogMng0IGFudGVubmEgZGl2ZXJzaXR5IGJvYXJkLCA0IGNmZ3M6IDAtMiAwLTMgMS0yIDEtMyAqLwotCQltaW1vX2FudHNlbCA9IChtaW1vXzJ4NF9kaXZfYW50c2VscGF0X3RibFtpZHhdICYgMHhmKTsKLQkJcmV0dXJuIG1pbW9fYW50c2VsOwotCi0JfSBlbHNlIGlmIChhc2ktPmFudHNlbF90eXBlID09IEFOVFNFTF8yeDMpIHsKLQkJLyogMngzIGFudGVubmEgc2VsZWN0aW9uLCAzIGNmZ3M6IDAtMSAwLTIgMi0xICovCi0JCW1pbW9fYW50c2VsID0gKG1pbW9fMngzX2Rpdl9hbnRzZWxwYXRfdGJsW2lkeF0gJiAweGYpOwotCQlyZXR1cm4gbWltb19hbnRzZWw7Ci0JfQotCi0JcmV0dXJuIG1pbW9fYW50c2VsOwotfQotCi0vKiBib2FyZGxldmVsIGFudGVubmEgc2VsZWN0aW9uOiB1Y29kZSBpbnRlcmZhY2UgY29udHJvbCAqLwotc3RhdGljIGludCBicmNtc19jX2FudHNlbF9jZmd1cGQoc3RydWN0IGFudHNlbF9pbmZvICphc2ksCi0JCQkJIHN0cnVjdCBicmNtc19hbnRzZWxjZmcgKmFudHNlbCkKLXsKLQlzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMgPSBhc2ktPndsYzsKLQl1OCBhbnRfY2ZnOwotCXUxNiBtaW1vX2FudHNlbDsKLQotCS8qIDEpIFVwZGF0ZSBUWCBhbnRjb25maWcgZm9yIGFsbCBmcmFtZXMgdGhhdCBhcmUgbm90IHVuaWNhc3QgZGF0YQotCSAqICAgIChha2EgZGVmYXVsdCBUWCkKLQkgKi8KLQlhbnRfY2ZnID0gYW50c2VsLT5hbnRfY29uZmlnW0FOVF9TRUxDRkdfVFhfREVGXTsKLQltaW1vX2FudHNlbCA9IGJyY21zX2NfYW50c2VsX2FudGNmZzJhbnRzZWwoYXNpLCBhbnRfY2ZnKTsKLQlicmNtc19jX3dyaXRlX3NobSh3bGMsIE1fTUlNT19BTlRTRUxfVFhERkxULCBtaW1vX2FudHNlbCk7Ci0JLyogVXBkYXRlIGRyaXZlciBzdGF0cyBmb3IgY3VycmVudGx5IHNlbGVjdGVkIGRlZmF1bHQgdHgvcnggYW50ZW5uYSBjb25maWcgKi8KLQlhc2ktPmFudGNmZ19jdXIuYW50X2NvbmZpZ1tBTlRfU0VMQ0ZHX1RYX0RFRl0gPSBhbnRfY2ZnOwotCi0JLyogMikgVXBkYXRlIFJYIGFudGNvbmZpZyBmb3IgYWxsIGZyYW1lcyB0aGF0IGFyZSBub3QgdW5pY2FzdCBkYXRhCi0JICogICAgKGFrYSBkZWZhdWx0IFJYKQotCSAqLwotCWFudF9jZmcgPSBhbnRzZWwtPmFudF9jb25maWdbQU5UX1NFTENGR19SWF9ERUZdOwotCW1pbW9fYW50c2VsID0gYnJjbXNfY19hbnRzZWxfYW50Y2ZnMmFudHNlbChhc2ksIGFudF9jZmcpOwotCWJyY21zX2Nfd3JpdGVfc2htKHdsYywgTV9NSU1PX0FOVFNFTF9SWERGTFQsIG1pbW9fYW50c2VsKTsKLQkvKiBVcGRhdGUgZHJpdmVyIHN0YXRzIGZvciBjdXJyZW50bHkgc2VsZWN0ZWQgZGVmYXVsdCB0eC9yeCBhbnRlbm5hIGNvbmZpZyAqLwotCWFzaS0+YW50Y2ZnX2N1ci5hbnRfY29uZmlnW0FOVF9TRUxDRkdfUlhfREVGXSA9IGFudF9jZmc7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvYW50c2VsLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL2FudHNlbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2VhMzg4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvYW50c2VsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfQlJDTV9BTlRTRUxfSF8KLSNkZWZpbmUgX0JSQ01fQU5UU0VMX0hfCi0KLWV4dGVybiBzdHJ1Y3QgYW50c2VsX2luZm8gKmJyY21zX2NfYW50c2VsX2F0dGFjaChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19hbnRzZWxfZGV0YWNoKHN0cnVjdCBhbnRzZWxfaW5mbyAqYXNpKTsKLWV4dGVybiB2b2lkIGJyY21zX2NfYW50c2VsX2luaXQoc3RydWN0IGFudHNlbF9pbmZvICphc2kpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19hbnRzZWxfYW50Y2ZnX2dldChzdHJ1Y3QgYW50c2VsX2luZm8gKmFzaSwgYm9vbCB1c2VkZWYsCi0JCQkJICBib29sIHNlbCwKLQkJCQkgIHU4IGlkLCB1OCBmYmlkLCB1OCAqYW50Y2ZnLAotCQkJCSAgdTggKmZiYW50Y2ZnKTsKLWV4dGVybiB1OCBicmNtc19jX2FudHNlbF9hbnRzZWwyaWQoc3RydWN0IGFudHNlbF9pbmZvICphc2ksIHUxNiBhbnRzZWwpOwotCi0jZW5kaWYgLyogX0JSQ01fQU5UU0VMX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL2JtYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvYm1hYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjVjNTE3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvYm1hYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzU5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgPGJyY21faHdfaWRzLmg+Ci0jaW5jbHVkZSA8YWl1dGlscy5oPgotI2luY2x1ZGUgPGNoaXBjb21tb24uaD4KLSNpbmNsdWRlICJ0eXBlcy5oIgotI2luY2x1ZGUgInJhdGUuaCIKLSNpbmNsdWRlICJwaHkvcGh5X2hhbC5oIgotI2luY2x1ZGUgImNoYW5uZWwuaCIKLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAidWNvZGVfbG9hZGVyLmgiCi0jaW5jbHVkZSAibWFjODAyMTFfaWYuaCIKLSNpbmNsdWRlICJibWFjLmgiCi0KLSNkZWZpbmUJVElNRVJfSU5URVJWQUxfV0FUQ0hET0dfQk1BQwkxMDAwCS8qIHdhdGNoZG9nIHRpbWVyLCBpbiB1bml0IG9mIG1zICovCi0KLSNkZWZpbmUJU1lOVEhQVV9ETFlfQVBIWV9VUwkzNzAwCS8qIGEgcGh5IHN5bnRocHVfZGx5IHRpbWUgaW4gdXMgKi8KLSNkZWZpbmUJU1lOVEhQVV9ETFlfQlBIWV9VUwkxMDUwCS8qIGIvZyBwaHkgc3ludGhwdV9kbHkgdGltZSBpbiB1cywgZGVmYXVsdCAqLwotI2RlZmluZQlTWU5USFBVX0RMWV9OUEhZX1VTCTIwNDgJLyogbiBwaHkgUkVWMyBzeW50aHB1X2RseSB0aW1lIGluIHVzLCBkZWZhdWx0ICovCi0jZGVmaW5lCVNZTlRIUFVfRExZX0xQUEhZX1VTCTMwMAkvKiBscHBoeSBzeW50aHB1X2RseSB0aW1lIGluIHVzICovCi0KLSNkZWZpbmUJU1lOVEhQVV9ETFlfUEhZX1VTX1FUCTEwMAkvKiBRVCBzeW50aHB1X2RseSB0aW1lIGluIHVzICovCi0KLSNpZm5kZWYgQk1BQ19EVVBfVE9fUkVNT1ZFCi0KLSNkZWZpbmUJQU5UQ05UCQkJMTAJLyogdmFuaWxsYSBNX01BWF9BTlRDTlQgdmFsdWUgKi8KLQotI2VuZGlmCQkJCS8qIEJNQUNfRFVQX1RPX1JFTU9WRSAqLwotCi0jZGVmaW5lIERNQVJFRyh3bGNfaHcsIGRpcmVjdGlvbiwgZmlmb251bSkgXAotCSgoZGlyZWN0aW9uID09IERNQV9UWCkgPyBcCi0JCSh2b2lkICopJih3bGNfaHctPnJlZ3MtPmZpZm82NHJlZ3NbZmlmb251bV0uZG1heG10KSA6IFwKLQkJKHZvaWQgKikmKHdsY19ody0+cmVncy0+ZmlmbzY0cmVnc1tmaWZvbnVtXS5kbWFyY3YpKQotCi0jZGVmaW5lIEFQSFlfU0xPVF9USU1FCQk5Ci0jZGVmaW5lIEJQSFlfU0xPVF9USU1FCQkyMAotCi0vKgotICogVGhlIGZvbGxvd2luZyB0YWJsZSBsaXN0cyB0aGUgYnVmZmVyIG1lbW9yeSBhbGxvY2F0ZWQgdG8geG10IGZpZm9zIGluIEhXLgotICogdGhlIHNpemUgaXMgaW4gdW5pdHMgb2YgMjU2Ynl0ZXMob25lIGJsb2NrKSwgdG90YWwgc2l6ZSBpcyBIVyBkZXBlbmRlbnQKLSAqIHVjb2RlIGhhcyBkZWZhdWx0IGZpZm8gcGFydGl0aW9uLCBzdyBjYW4gb3ZlcndyaXRlIGlmIG5lY2Vzc2FyeQotICoKLSAqIFRoaXMgaXMgZG9jdW1lbnRlZCBpbiB0d2lraSB1bmRlciB0aGUgdG9waWMgVWNvZGVUeEZpZm8uIFBsZWFzZSBlbnN1cmUKLSAqIHRoZSB0d2lraSBpcyB1cGRhdGVkIGJlZm9yZSBtYWtpbmcgY2hhbmdlcy4KLSAqLwotCi0jZGVmaW5lIFhNVEZJRk9UQkxfU1RBUlRSRVYJMjAJLyogU3RhcnRpbmcgY29yZXJldiBmb3IgdGhlIGZpZm8gc2l6ZSB0YWJsZSAqLwotCi1zdGF0aWMgdTE2IHhtdGZpZm9fc3pbXVtORklGT10gPSB7Ci0JezIwLCAxOTIsIDE5MiwgMjEsIDE3LCA1fSwJLyogY29yZXJldiAyMDogNTEyMCwgNDkxNTIsIDQ5MTUyLCA1Mzc2LCA0MzUyLCAxMjgwICovCi0JezksIDU4LCAyMiwgMTQsIDE0LCA1fSwJLyogY29yZXJldiAyMTogMjMwNCwgMTQ4NDgsIDU2MzIsIDM1ODQsIDM1ODQsIDEyODAgKi8KLQl7MjAsIDE5MiwgMTkyLCAyMSwgMTcsIDV9LAkvKiBjb3JlcmV2IDIyOiA1MTIwLCA0OTE1MiwgNDkxNTIsIDUzNzYsIDQzNTIsIDEyODAgKi8KLQl7MjAsIDE5MiwgMTkyLCAyMSwgMTcsIDV9LAkvKiBjb3JlcmV2IDIzOiA1MTIwLCA0OTE1MiwgNDkxNTIsIDUzNzYsIDQzNTIsIDEyODAgKi8KLQl7OSwgNTgsIDIyLCAxNCwgMTQsIDV9LAkvKiBjb3JlcmV2IDI0OiAyMzA0LCAxNDg0OCwgNTYzMiwgMzU4NCwgMzU4NCwgMTI4MCAqLwotfTsKLQotc3RhdGljIHZvaWQgYnJjbXNfYl9jbGtjdGxfY2xrKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjLCB1aW50IG1vZGUpOwotc3RhdGljIHZvaWQgYnJjbXNfYl9jb3JlaW5pdChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotCi0vKiB1c2VkIGJ5IHdsY193YWtldWNvZGVfaW5pdCgpICovCi1zdGF0aWMgdm9pZCBicmNtc19jX3dyaXRlX2luaXRzKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LAotCQkJICAgIGNvbnN0IHN0cnVjdCBkMTFpbml0ICppbml0cyk7Ci1zdGF0aWMgdm9pZCBicmNtc191Y29kZV93cml0ZShzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgY29uc3QgdTMyIHVjb2RlW10sCi0JCQkgICAgY29uc3QgdWludCBuYnl0ZXMpOwotc3RhdGljIHZvaWQgYnJjbXNfdWNvZGVfZG93bmxvYWQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGMpOwotc3RhdGljIHZvaWQgYnJjbXNfY191Y29kZV90eGFudF9zZXQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcpOwotCi0vKiB1c2VkIGJ5IGJyY21zX2NfZHBjKCkgKi8KLXN0YXRpYyBib29sIGJyY21zX2JfZG90eHN0YXR1cyhzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsYywKLQkJCSAgICAgICBzdHJ1Y3QgdHhfc3RhdHVzICp0eHMsIHUzMiBzMik7Ci1zdGF0aWMgYm9vbCBicmNtc19iX3R4c3RhdHVzKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjLCBib29sIGJvdW5kLAotCQkJICAgICBib29sICpmYXRhbCk7Ci1zdGF0aWMgYm9vbCBicmNtc19iX3JlY3Yoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHVpbnQgZmlmbywgYm9vbCBib3VuZCk7Ci0KLS8qIHVzZWQgYnkgYnJjbXNfY19kb3duKCkgKi8KLXN0YXRpYyB2b2lkIGJyY21zX2NfZmx1c2hxdWV1ZXMoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKLQotc3RhdGljIHZvaWQgYnJjbXNfY193cml0ZV9taGYoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHUxNiAqbWhmcyk7Ci1zdGF0aWMgdm9pZCBicmNtc19jX21jdHJsX3Jlc2V0KHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KTsKLXN0YXRpYyB2b2lkIGJyY21zX2JfY29yZXJldl9maWZvZml4dXAoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcpOwotc3RhdGljIGJvb2wgYnJjbXNfYl90eF9maWZvX3N1c3BlbmRlZChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywKLQkJCQkgICAgICAgdWludCB0eF9maWZvKTsKLXN0YXRpYyB2b2lkIGJyY21zX2JfdHhfZmlmb19zdXNwZW5kKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LAotCQkJCSAgICB1aW50IHR4X2ZpZm8pOwotc3RhdGljIHZvaWQgYnJjbXNfYl90eF9maWZvX3Jlc3VtZShzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywKLQkJCQkgICB1aW50IHR4X2ZpZm8pOwotCi0vKiBMb3cgTGV2ZWwgUHJvdG90eXBlcyAqLwotc3RhdGljIGludCBicmNtc19iX2JhbmR0eXBlKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KTsKLXN0YXRpYyB2b2lkIGJyY21zX2JfaW5mb19pbml0KHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KTsKLXN0YXRpYyB2b2lkIGJyY21zX2JfeHRhbChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgYm9vbCB3YW50KTsKLXN0YXRpYyB1MTYgYnJjbXNfYl9yZWFkX29iam1lbShzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdWludCBvZmZzZXQsCi0JCQkJICAgdTMyIHNlbCk7Ci1zdGF0aWMgdm9pZCBicmNtc19iX3dyaXRlX29iam1lbShzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdWludCBvZmZzZXQsCi0JCQkJICB1MTYgdiwgdTMyIHNlbCk7Ci1zdGF0aWMgdm9pZCBicmNtc19iX2NvcmVfcGh5X2NsayhzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgYm9vbCBjbGspOwotc3RhdGljIGJvb2wgYnJjbXNfYl9hdHRhY2hfZG1hcGlvKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdWludCBqLCBib29sIHdtZSk7Ci1zdGF0aWMgdm9pZCBicmNtc19iX2RldGFjaF9kbWFwaW8oc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcpOwotc3RhdGljIHZvaWQgYnJjbXNfY191Y29kZV9ic2luaXQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcpOwotc3RhdGljIGJvb2wgYnJjbXNfY192YWxpZGJvYXJkdHlwZShzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsYyk7Ci1zdGF0aWMgYm9vbCBicmNtc19jX2lzZ29vZGNoaXAoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcpOwotc3RhdGljIGJvb2wgYnJjbXNfYl92YWxpZGF0ZV9jaGlwX2FjY2VzcyhzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odyk7Ci1zdGF0aWMgY2hhciAqYnJjbXNfY19nZXRfbWFjYWRkcihzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odyk7Ci1zdGF0aWMgdm9pZCBicmNtc19jX21oZmRlZihzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHUxNiAqbWhmcywgdTE2IG1oZjJfaW5pdCk7Ci1zdGF0aWMgdm9pZCBicmNtc19jX21jdHJsX3dyaXRlKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KTsKLXN0YXRpYyB2b2lkIGJyY21zX2JfbXV0ZShzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgYm9vbCB3YW50LAotCQkJIG1ib29sIGZsYWdzKTsKLXN0YXRpYyB2b2lkIGJyY21zX2NfdWNvZGVfbXV0ZV9vdmVycmlkZV9zZXQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcpOwotc3RhdGljIHZvaWQgYnJjbXNfY191Y29kZV9tdXRlX292ZXJyaWRlX2NsZWFyKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KTsKLXN0YXRpYyB1MzIgYnJjbXNfY193bGludHJzb2ZmKHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1zdGF0aWMgdm9pZCBicmNtc19jX3dsaW50cnNyZXN0b3JlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdTMyIG1hY2ludG1hc2spOwotc3RhdGljIHZvaWQgYnJjbXNfY19ncGlvX2luaXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKLXN0YXRpYyB2b2lkIGJyY21zX2Nfd3JpdGVfaHdfYmNudGVtcGxhdGUwKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LAotCQkJCQkgIHZvaWQgKmJjbiwgaW50IGxlbik7Ci1zdGF0aWMgdm9pZCBicmNtc19jX3dyaXRlX2h3X2JjbnRlbXBsYXRlMShzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywKLQkJCQkJICB2b2lkICpiY24sIGludCBsZW4pOwotc3RhdGljIHZvaWQgYnJjbXNfYl9ic2luaXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKTsKLXN0YXRpYyB1MzIgYnJjbXNfY19zZXRiYW5kX2luYWN0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdWludCBiYW5kdW5pdCk7Ci1zdGF0aWMgdm9pZCBicmNtc19iX3NldGJhbmQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHVpbnQgYmFuZHVuaXQsCi0JCQkgICAgIGNoYW5zcGVjX3QgY2hhbnNwZWMpOwotc3RhdGljIHZvaWQgYnJjbXNfYl91cGRhdGVfc2xvdF90aW1pbmcoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsCi0JCQkJCWJvb2wgc2hvcnRzbG90KTsKLXN0YXRpYyB2b2lkIGJyY21zX3VwZF9vZmRtX3BjdGwxX3RhYmxlKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KTsKLXN0YXRpYyB1MTYgYnJjbXNfYl9vZmRtX3JhdGV0YWJsZV9vZmZzZXQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsCi0JCQkJCSAgICAgdTggcmF0ZSk7Ci0KLS8qID09PSBMb3cgTGV2ZWwgZnVuY3Rpb25zID09PSAqLwotCi12b2lkIGJyY21zX2Jfc2V0X3Nob3J0c2xvdChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgYm9vbCBzaG9ydHNsb3QpCi17Ci0Jd2xjX2h3LT5zaG9ydHNsb3QgPSBzaG9ydHNsb3Q7Ci0KLQlpZiAoQkFORF8yRyhicmNtc19iX2JhbmR0eXBlKHdsY19odykpICYmIHdsY19ody0+dXApIHsKLQkJYnJjbXNfY19zdXNwZW5kX21hY19hbmRfd2FpdCh3bGNfaHctPndsYyk7Ci0JCWJyY21zX2JfdXBkYXRlX3Nsb3RfdGltaW5nKHdsY19odywgc2hvcnRzbG90KTsKLQkJYnJjbXNfY19lbmFibGVfbWFjKHdsY19ody0+d2xjKTsKLQl9Ci19Ci0KLS8qCi0gKiBVcGRhdGUgdGhlIHNsb3QgdGltaW5nIGZvciBzdGFuZGFyZCAxMWIvZyAoMjB1cyBzbG90cykKLSAqIG9yIHNob3J0c2xvdCAxMWcgKDl1cyBzbG90cykKLSAqIFRoZSBQU00gbmVlZHMgdG8gYmUgc3VzcGVuZGVkIGZvciB0aGlzIGNhbGwuCi0gKi8KLXN0YXRpYyB2b2lkIGJyY21zX2JfdXBkYXRlX3Nsb3RfdGltaW5nKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LAotCQkJCQlib29sIHNob3J0c2xvdCkKLXsKLQlkMTFyZWdzX3QgKnJlZ3M7Ci0KLQlyZWdzID0gd2xjX2h3LT5yZWdzOwotCi0JaWYgKHNob3J0c2xvdCkgewotCQkvKiAxMWcgc2hvcnQgc2xvdDogMTFhIHRpbWluZyAqLwotCQlXX1JFRygmcmVncy0+aWZzX3Nsb3QsIDB4MDIwNyk7CS8qIEFQSFlfU0xPVF9USU1FICovCi0JCWJyY21zX2Jfd3JpdGVfc2htKHdsY19odywgTV9ET1QxMV9TTE9ULCBBUEhZX1NMT1RfVElNRSk7Ci0JfSBlbHNlIHsKLQkJLyogMTFnIGxvbmcgc2xvdDogMTFiIHRpbWluZyAqLwotCQlXX1JFRygmcmVncy0+aWZzX3Nsb3QsIDB4MDIxMik7CS8qIEJQSFlfU0xPVF9USU1FICovCi0JCWJyY21zX2Jfd3JpdGVfc2htKHdsY19odywgTV9ET1QxMV9TTE9ULCBCUEhZX1NMT1RfVElNRSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBicmNtc19jX3Vjb2RlX2JzaW5pdChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odykKLXsKLQlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2xjX2h3LT53bGMtPndpcGh5OwotCi0JLyogaW5pdCBtaWNyb2NvZGUgaG9zdCBmbGFncyAqLwotCWJyY21zX2Nfd3JpdGVfbWhmKHdsY19odywgd2xjX2h3LT5iYW5kLT5taGZzKTsKLQotCS8qIGRvIGJhbmQtc3BlY2lmaWMgdWNvZGUgSUhSLCBTSE0sIGFuZCBTQ1IgaW5pdHMgKi8KLQlpZiAoRDExUkVWX0lTKHdsY19ody0+Y29yZXJldiwgMjMpKSB7Ci0JCWlmIChCUkNNU19JU05QSFkod2xjX2h3LT5iYW5kKSkgewotCQkJYnJjbXNfY193cml0ZV9pbml0cyh3bGNfaHcsIGQxMW4wYnNpbml0dmFsczE2KTsKLQkJfSBlbHNlIHsKLQkJCXdpcGh5X2Vycih3aXBoeSwgIiVzOiB3bCVkOiB1bnN1cHBvcnRlZCBwaHkgaW4gY29yZXJldiIKLQkJCQkgICIgJWRcbiIsIF9fZnVuY19fLCB3bGNfaHctPnVuaXQsCi0JCQkJICB3bGNfaHctPmNvcmVyZXYpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKEQxMVJFVl9JUyh3bGNfaHctPmNvcmVyZXYsIDI0KSkgewotCQkJaWYgKEJSQ01TX0lTTENOUEhZKHdsY19ody0+YmFuZCkpIHsKLQkJCQlicmNtc19jX3dyaXRlX2luaXRzKHdsY19odywKLQkJCQkJCSAgICBkMTFsY24wYnNpbml0dmFsczI0KTsKLQkJCX0gZWxzZQotCQkJCXdpcGh5X2Vycih3aXBoeSwgIiVzOiB3bCVkOiB1bnN1cHBvcnRlZCBwaHkgaW4iCi0JCQkJCSAgIiBjb3JlIHJldiAlZFxuIiwgX19mdW5jX18sCi0JCQkJCSAgd2xjX2h3LT51bml0LCB3bGNfaHctPmNvcmVyZXYpOwotCQl9IGVsc2UgewotCQkJd2lwaHlfZXJyKHdpcGh5LCAiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIGNvcmVyZXYgJWRcbiIsCi0JCQkJX19mdW5jX18sIHdsY19ody0+dW5pdCwgd2xjX2h3LT5jb3JlcmV2KTsKLQkJfQotCX0KLX0KLQotLyogc3dpdGNoIHRvIG5ldyBiYW5kIGJ1dCBsZWF2ZSBpdCBpbmFjdGl2ZSAqLwotc3RhdGljIHUzMiBicmNtc19jX3NldGJhbmRfaW5hY3Qoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJCQkgICAgdWludCBiYW5kdW5pdCkKLXsKLQlzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odyA9IHdsYy0+aHc7Ci0JdTMyIG1hY2ludG1hc2s7Ci0KLQlCQ01NU0cod2xjLT53aXBoeSwgIndsJWRcbiIsIHdsY19ody0+dW5pdCk7Ci0KLQlXQVJOX09OKChSX1JFRygmd2xjX2h3LT5yZWdzLT5tYWNjb250cm9sKSAmIE1DVExfRU5fTUFDKSAhPSAwKTsKLQotCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLwotCW1hY2ludG1hc2sgPSBicmNtc19pbnRyc29mZih3bGMtPndsKTsKLQotCS8qIHJhZGlvIG9mZiAqLwotCXdsY19waHlfc3dpdGNoX3JhZGlvKHdsY19ody0+YmFuZC0+cGksIE9GRik7Ci0KLQlicmNtc19iX2NvcmVfcGh5X2Nsayh3bGNfaHcsIE9GRik7Ci0KLQlicmNtc19jX3NldHhiYW5kKHdsY19odywgYmFuZHVuaXQpOwotCi0JcmV0dXJuIG1hY2ludG1hc2s7Ci19Ci0KLS8qIFByb2Nlc3MgcmVjZWl2ZWQgZnJhbWVzICovCi0vKgotICogUmV0dXJuIHRydWUgaWYgbW9yZSBmcmFtZXMgbmVlZCB0byBiZSBwcm9jZXNzZWQuIGZhbHNlIG90aGVyd2lzZS4KLSAqIFBhcmFtICdib3VuZCcgaW5kaWNhdGVzIG1heC4gIyBmcmFtZXMgdG8gcHJvY2VzcyBiZWZvcmUgYnJlYWsgb3V0LgotICovCi1zdGF0aWMgYm9vbAotYnJjbXNfYl9yZWN2KHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCB1aW50IGZpZm8sIGJvb2wgYm91bmQpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnA7Ci0Jc3RydWN0IHNrX2J1ZmYgKmhlYWQgPSBOVUxMOwotCXN0cnVjdCBza19idWZmICp0YWlsID0gTlVMTDsKLQl1aW50IG4gPSAwOwotCXVpbnQgYm91bmRfbGltaXQgPSBib3VuZCA/IHdsY19ody0+d2xjLT5wdWItPnR1bmFibGVzLT5yeGJuZCA6IC0xOwotCXN0cnVjdCBicmNtc19kMTFyeGhkciAqd2xjX3J4aGRyID0gTlVMTDsKLQotCUJDTU1TRyh3bGNfaHctPndsYy0+d2lwaHksICJ3bCVkXG4iLCB3bGNfaHctPnVuaXQpOwotCS8qIGdhdGhlciByZWNlaXZlZCBmcmFtZXMgKi8KLQl3aGlsZSAoKHAgPSBkbWFfcngod2xjX2h3LT5kaVtmaWZvXSkpKSB7Ci0KLQkJaWYgKCF0YWlsKQotCQkJaGVhZCA9IHRhaWwgPSBwOwotCQllbHNlIHsKLQkJCXRhaWwtPnByZXYgPSBwOwotCQkJdGFpbCA9IHA7Ci0JCX0KLQotCQkvKiAhZ2l2ZSBvdGhlcnMgc29tZSB0aW1lIHRvIHJ1biEgKi8KLQkJaWYgKCsrbiA+PSBib3VuZF9saW1pdCkKLQkJCWJyZWFrOwotCX0KLQotCS8qIHBvc3QgbW9yZSByYnVmcyAqLwotCWRtYV9yeGZpbGwod2xjX2h3LT5kaVtmaWZvXSk7Ci0KLQkvKiBwcm9jZXNzIGVhY2ggZnJhbWUgKi8KLQl3aGlsZSAoKHAgPSBoZWFkKSAhPSBOVUxMKSB7Ci0JCWhlYWQgPSBoZWFkLT5wcmV2OwotCQlwLT5wcmV2ID0gTlVMTDsKLQotCQl3bGNfcnhoZHIgPSAoc3RydWN0IGJyY21zX2QxMXJ4aGRyICopIHAtPmRhdGE7Ci0KLQkJLyogY29tcHV0ZSB0aGUgUlNTSSBmcm9tIGQxMXJ4aGRyIGFuZCByZWNvcmQgaXQgaW4gd2xjX3J4ZDExaHIgKi8KLQkJd2xjX3BoeV9yc3NpX2NvbXB1dGUod2xjX2h3LT5iYW5kLT5waSwgd2xjX3J4aGRyKTsKLQotCQlicmNtc19jX3JlY3Yod2xjX2h3LT53bGMsIHApOwotCX0KLQotCXJldHVybiBuID49IGJvdW5kX2xpbWl0OwotfQotCi0vKiBzZWNvbmQtbGV2ZWwgaW50ZXJydXB0IHByb2Nlc3NpbmcKLSAqICAgUmV0dXJuIHRydWUgaWYgYW5vdGhlciBkcGMgbmVlZHMgdG8gYmUgcmUtc2NoZWR1bGVkLiBmYWxzZSBvdGhlcndpc2UuCi0gKiAgIFBhcmFtICdib3VuZGVkJyBpbmRpY2F0ZXMgaWYgYXBwbGljYWJsZSBsb29wcyBzaG91bGQgYmUgYm91bmRlZC4KLSAqLwotYm9vbCBicmNtc19jX2RwYyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGJvb2wgYm91bmRlZCkKLXsKLQl1MzIgbWFjaW50c3RhdHVzOwotCXN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3ID0gd2xjLT5odzsKLQlkMTFyZWdzX3QgKnJlZ3MgPSB3bGNfaHctPnJlZ3M7Ci0JYm9vbCBmYXRhbCA9IGZhbHNlOwotCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSB3bGMtPndpcGh5OwotCi0JaWYgKERFVklDRVJFTU9WRUQod2xjKSkgewotCQl3aXBoeV9lcnIod2lwaHksICJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLCB3bGNfaHctPnVuaXQsCi0JCQkgIF9fZnVuY19fKTsKLQkJYnJjbXNfZG93bih3bGMtPndsKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIGdyYWIgYW5kIGNsZWFyIHRoZSBzYXZlZCBzb2Z0d2FyZSBpbnRzdGF0dXMgYml0cyAqLwotCW1hY2ludHN0YXR1cyA9IHdsYy0+bWFjaW50c3RhdHVzOwotCXdsYy0+bWFjaW50c3RhdHVzID0gMDsKLQotCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZDogbWFjaW50c3RhdHVzIDB4JXhcbiIsCi0JICAgICAgIHdsY19ody0+dW5pdCwgbWFjaW50c3RhdHVzKTsKLQotCVdBUk5fT04obWFjaW50c3RhdHVzICYgTUlfUFJRKTsgLyogUFJRIEludGVycnVwdCBpbiBub24tTUJTUyAqLwotCi0JLyogQkNOIHRlbXBsYXRlIGlzIGF2YWlsYWJsZSAqLwotCS8qIFpaWjogVXNlIEFQX0FDVElWRSA/ICovCi0JaWYgKEFQX0VOQUIod2xjLT5wdWIpICYmICghQVBTVEFfRU5BQih3bGMtPnB1YikpCi0JICAgICYmIChtYWNpbnRzdGF0dXMgJiBNSV9CQ05UUEwpKSB7Ci0JCWJyY21zX2NfdXBkYXRlX2JlYWNvbih3bGMpOwotCX0KLQotCS8qIHR4IHN0YXR1cyAqLwotCWlmIChtYWNpbnRzdGF0dXMgJiBNSV9URlMpIHsKLQkJaWYgKGJyY21zX2JfdHhzdGF0dXMod2xjLT5odywgYm91bmRlZCwgJmZhdGFsKSkKLQkJCXdsYy0+bWFjaW50c3RhdHVzIHw9IE1JX1RGUzsKLQkJaWYgKGZhdGFsKSB7Ci0JCQl3aXBoeV9lcnIod2lwaHksICJNSV9URlM6IGZhdGFsXG4iKTsKLQkJCWdvdG8gZmF0YWw7Ci0JCX0KLQl9Ci0KLQlpZiAobWFjaW50c3RhdHVzICYgKE1JX1RCVFQgfCBNSV9EVElNX1RCVFQpKQotCQlicmNtc19jX3RidHQod2xjKTsKLQotCS8qIEFUSU0gd2luZG93IGVuZCAqLwotCWlmIChtYWNpbnRzdGF0dXMgJiBNSV9BVElNV0lORU5EKSB7Ci0JCUJDTU1TRyh3bGMtPndpcGh5LCAiZW5kIG9mIEFUSU0gd2luZG93XG4iKTsKLQkJT1JfUkVHKCZyZWdzLT5tYWNjb21tYW5kLCB3bGMtPnF2YWxpZCk7Ci0JCXdsYy0+cXZhbGlkID0gMDsKLQl9Ci0KLQkvKiByZWNlaXZlZCBkYXRhIG9yIGNvbnRyb2wgZnJhbWUsIE1JX0RNQUlOVCBpcyBpbmRpY2F0aW9uIG9mIFJYX0ZJRk8gaW50ZXJydXB0ICovCi0JaWYgKG1hY2ludHN0YXR1cyAmIE1JX0RNQUlOVCkKLQkJaWYgKGJyY21zX2JfcmVjdih3bGNfaHcsIFJYX0ZJRk8sIGJvdW5kZWQpKQotCQkJd2xjLT5tYWNpbnRzdGF0dXMgfD0gTUlfRE1BSU5UOwotCi0JLyogVFggRklGTyBzdXNwZW5kL2ZsdXNoIGNvbXBsZXRpb24gKi8KLQlpZiAobWFjaW50c3RhdHVzICYgTUlfVFhTVE9QKQotCQlicmNtc19iX3R4X2ZpZm9fc3VzcGVuZGVkKHdsY19odywgVFhfREFUQV9GSUZPKTsKLQotCS8qIG5vaXNlIHNhbXBsZSBjb2xsZWN0ZWQgKi8KLQlpZiAobWFjaW50c3RhdHVzICYgTUlfQkdfTk9JU0UpIHsKLQkJd2xjX3BoeV9ub2lzZV9zYW1wbGVfaW50cih3bGNfaHctPmJhbmQtPnBpKTsKLQl9Ci0KLQlpZiAobWFjaW50c3RhdHVzICYgTUlfR1AwKSB7Ci0JCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6IFBTTSBtaWNyb2NvZGUgd2F0Y2hkb2cgZmlyZWQgYXQgJWQgIgotCQkJIihzZWNvbmRzKS4gUmVzZXR0aW5nLlxuIiwgd2xjX2h3LT51bml0LCB3bGNfaHctPm5vdyk7Ci0KLQkJcHJpbnRrX29uY2UoIiVzIDogUFNNIFdhdGNoZG9nLCBjaGlwaWQgMHgleCwgY2hpcHJldiAweCV4XG4iLAotCQkJCQlfX2Z1bmNfXywgd2xjX2h3LT5zaWgtPmNoaXAsCi0JCQkJCXdsY19ody0+c2loLT5jaGlwcmV2KTsKLQkJLyogYmlnIGhhbW1lciAqLwotCQlicmNtc19pbml0KHdsYy0+d2wpOwotCX0KLQotCS8qIGdwdGltZXIgdGltZW91dCAqLwotCWlmIChtYWNpbnRzdGF0dXMgJiBNSV9UTykgewotCQlXX1JFRygmcmVncy0+Z3B0aW1lciwgMCk7Ci0JfQotCi0JaWYgKG1hY2ludHN0YXR1cyAmIE1JX1JGRElTQUJMRSkgewotCQlCQ01NU0cod2xjLT53aXBoeSwgIndsJWQ6IEJNQUMgRGV0ZWN0ZWQgYSBjaGFuZ2Ugb24gdGhlIgotCQkgICAgICAgIiBSRiBEaXNhYmxlIElucHV0XG4iLCB3bGNfaHctPnVuaXQpOwotCQlicmNtc19yZmtpbGxfc2V0X2h3X3N0YXRlKHdsYy0+d2wpOwotCX0KLQotCS8qIHNlbmQgYW55IGVucSdkIHR4IHBhY2tldHMuIEp1c3QgbWFrZXMgc3VyZSB0byBqdW1wIHN0YXJ0IHR4ICovCi0JaWYgKCFwa3RxX2VtcHR5KCZ3bGMtPnBrdF9xdWV1ZS0+cSkpCi0JCWJyY21zX2Nfc2VuZF9xKHdsYyk7Ci0KLQkvKiBpdCBpc24ndCBkb25lIGFuZCBuZWVkcyB0byBiZSByZXNjaGVkIGlmIG1hY2ludHN0YXR1cyBpcyBub24temVybyAqLwotCXJldHVybiB3bGMtPm1hY2ludHN0YXR1cyAhPSAwOwotCi0gZmF0YWw6Ci0JYnJjbXNfaW5pdCh3bGMtPndsKTsKLQlyZXR1cm4gd2xjLT5tYWNpbnRzdGF0dXMgIT0gMDsKLX0KLQotLyogY29tbW9uIGxvdy1sZXZlbCB3YXRjaGRvZyBjb2RlICovCi12b2lkIGJyY21zX2Jfd2F0Y2hkb2codm9pZCAqYXJnKQotewotCXN0cnVjdCBicmNtc19jX2luZm8gKndsYyA9IChzdHJ1Y3QgYnJjbXNfY19pbmZvICopIGFyZzsKLQlzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odyA9IHdsYy0+aHc7Ci0KLQlCQ01NU0cod2xjLT53aXBoeSwgIndsJWRcbiIsIHdsY19ody0+dW5pdCk7Ci0KLQlpZiAoIXdsY19ody0+dXApCi0JCXJldHVybjsKLQotCS8qIGluY3JlbWVudCBzZWNvbmQgY291bnQgKi8KLQl3bGNfaHctPm5vdysrOwotCi0JLyogQ2hlY2sgZm9yIEZJRk8gZXJyb3IgaW50ZXJydXB0cyAqLwotCWJyY21zX2JfZmlmb2Vycm9ycyh3bGNfaHcpOwotCi0JLyogbWFrZSBzdXJlIFJYIGRtYSBoYXMgYnVmZmVycyAqLwotCWRtYV9yeGZpbGwod2xjLT5ody0+ZGlbUlhfRklGT10pOwotCi0Jd2xjX3BoeV93YXRjaGRvZyh3bGNfaHctPmJhbmQtPnBpKTsKLX0KLQotdm9pZAotYnJjbXNfYl9zZXRfY2hhbnNwZWMoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIGNoYW5zcGVjX3QgY2hhbnNwZWMsCi0JCSAgICAgIGJvb2wgbXV0ZSwgc3RydWN0IHR4cHdyX2xpbWl0cyAqdHhwd3IpCi17Ci0JdWludCBiYW5kdW5pdDsKLQotCUJDTU1TRyh3bGNfaHctPndsYy0+d2lwaHksICJ3bCVkOiAweCV4XG4iLCB3bGNfaHctPnVuaXQsIGNoYW5zcGVjKTsKLQotCXdsY19ody0+Y2hhbnNwZWMgPSBjaGFuc3BlYzsKLQotCS8qIFN3aXRjaCBiYW5kcyBpZiBuZWNlc3NhcnkgKi8KLQlpZiAoTkJBTkRTX0hXKHdsY19odykgPiAxKSB7Ci0JCWJhbmR1bml0ID0gQ0hTUEVDX0JBTkRVTklUKGNoYW5zcGVjKTsKLQkJaWYgKHdsY19ody0+YmFuZC0+YmFuZHVuaXQgIT0gYmFuZHVuaXQpIHsKLQkJCS8qIGJyY21zX2Jfc2V0YmFuZCBkaXNhYmxlcyBvdGhlciBiYW5kdW5pdCwKLQkJCSAqICB1c2UgbGlnaHQgYmFuZCBzd2l0Y2ggaWYgbm90IHVwIHlldAotCQkJICovCi0JCQlpZiAod2xjX2h3LT51cCkgewotCQkJCXdsY19waHlfY2hhbnNwZWNfcmFkaW9fc2V0KHdsY19ody0+Ci0JCQkJCQkJICAgYmFuZHN0YXRlW2JhbmR1bml0XS0+Ci0JCQkJCQkJICAgcGksIGNoYW5zcGVjKTsKLQkJCQlicmNtc19iX3NldGJhbmQod2xjX2h3LCBiYW5kdW5pdCwgY2hhbnNwZWMpOwotCQkJfSBlbHNlIHsKLQkJCQlicmNtc19jX3NldHhiYW5kKHdsY19odywgYmFuZHVuaXQpOwotCQkJfQotCQl9Ci0JfQotCi0Jd2xjX3BoeV9pbml0Y2FsX2VuYWJsZSh3bGNfaHctPmJhbmQtPnBpLCAhbXV0ZSk7Ci0KLQlpZiAoIXdsY19ody0+dXApIHsKLQkJaWYgKHdsY19ody0+Y2xrKQotCQkJd2xjX3BoeV90eHBvd2VyX2xpbWl0X3NldCh3bGNfaHctPmJhbmQtPnBpLCB0eHB3ciwKLQkJCQkJCSAgY2hhbnNwZWMpOwotCQl3bGNfcGh5X2NoYW5zcGVjX3JhZGlvX3NldCh3bGNfaHctPmJhbmQtPnBpLCBjaGFuc3BlYyk7Ci0JfSBlbHNlIHsKLQkJd2xjX3BoeV9jaGFuc3BlY19zZXQod2xjX2h3LT5iYW5kLT5waSwgY2hhbnNwZWMpOwotCQl3bGNfcGh5X3R4cG93ZXJfbGltaXRfc2V0KHdsY19ody0+YmFuZC0+cGksIHR4cHdyLCBjaGFuc3BlYyk7Ci0KLQkJLyogVXBkYXRlIG11dGluZyBvZiB0aGUgY2hhbm5lbCAqLwotCQlicmNtc19iX211dGUod2xjX2h3LCBtdXRlLCAwKTsKLQl9Ci19Ci0KLWludCBicmNtc19iX3N0YXRlX2dldChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywKLQkJICAgICAgc3RydWN0IGJyY21zX2Jfc3RhdGUgKnN0YXRlKQotewotCXN0YXRlLT5tYWNod2NhcCA9IHdsY19ody0+bWFjaHdjYXA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGJvb2wgYnJjbXNfYl9hdHRhY2hfZG1hcGlvKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdWludCBqLCBib29sIHdtZSkKLXsKLQl1aW50IGk7Ci0JY2hhciBuYW1lWzhdOwotCS8qIHVjb2RlIGhvc3QgZmxhZyAyIG5lZWRlZCBmb3IgcGlvIG1vZGUsIGluZGVwZW5kZW50IG9mIGJhbmQgYW5kIGZpZm8gKi8KLQl1MTYgcGlvX21oZjIgPSAwOwotCXN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3ID0gd2xjLT5odzsKLQl1aW50IHVuaXQgPSB3bGNfaHctPnVuaXQ7Ci0Jc3RydWN0IGJyY21zX3R1bmFibGVzICp0dW5lID0gd2xjLT5wdWItPnR1bmFibGVzOwotCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSB3bGMtPndpcGh5OwotCi0JLyogbmFtZSBhbmQgb2Zmc2V0cyBmb3IgZG1hX2F0dGFjaCAqLwotCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIndsJWQiLCB1bml0KTsKLQotCWlmICh3bGNfaHctPmRpWzBdID09IDApIHsJLyogSW5pdCBGSUZPcyAqLwotCQl1aW50IGFkZHJ3aWR0aDsKLQkJaW50IGRtYV9hdHRhY2hfZXJyID0gMDsKLQkJLyogRmluZCBvdXQgdGhlIERNQSBhZGRyZXNzaW5nIGNhcGFiaWxpdHkgYW5kIGxldCBPUyBrbm93Ci0JCSAqIEFsbCB0aGUgY2hhbm5lbHMgd2l0aGluIG9uZSBETUEgY29yZSBoYXZlICdjb21tb24tbWluaW11bScgc2FtZQotCQkgKiBjYXBhYmlsaXR5Ci0JCSAqLwotCQlhZGRyd2lkdGggPQotCQkgICAgZG1hX2FkZHJ3aWR0aCh3bGNfaHctPnNpaCwgRE1BUkVHKHdsY19odywgRE1BX1RYLCAwKSk7Ci0KLQkJaWYgKCF3bF9hbGxvY19kbWFfcmVzb3VyY2VzKHdsY19ody0+d2xjLT53bCwgYWRkcndpZHRoKSkgewotCQkJd2lwaHlfZXJyKHdpcGh5LCAid2wlZDogd2xjX2F0dGFjaDogYWxsb2NfZG1hXyIKLQkJCQkgICJyZXNvdXJjZXMgZmFpbGVkXG4iLCB1bml0KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8qCi0JCSAqIEZJRk8gMAotCQkgKiBUWDogVFhfQUNfQktfRklGTyAoVFggQUMgQmFja2dyb3VuZCBkYXRhIHBhY2tldHMpCi0JCSAqIFJYOiBSWF9GSUZPIChSWCBkYXRhIHBhY2tldHMpCi0JCSAqLwotCQl3bGNfaHctPmRpWzBdID0gZG1hX2F0dGFjaChuYW1lLCB3bGNfaHctPnNpaCwKLQkJCQkJICAgKHdtZSA/IERNQVJFRyh3bGNfaHcsIERNQV9UWCwgMCkgOgotCQkJCQkgICAgTlVMTCksIERNQVJFRyh3bGNfaHcsIERNQV9SWCwgMCksCi0JCQkJCSAgICh3bWUgPyB0dW5lLT5udHhkIDogMCksIHR1bmUtPm5yeGQsCi0JCQkJCSAgIHR1bmUtPnJ4YnVmc3osIC0xLCB0dW5lLT5ucnhidWZwb3N0LAotCQkJCQkgICBCUkNNU19IV1JYT0ZGLCAmYnJjbV9tc2dfbGV2ZWwpOwotCQlkbWFfYXR0YWNoX2VyciB8PSAoTlVMTCA9PSB3bGNfaHctPmRpWzBdKTsKLQotCQkvKgotCQkgKiBGSUZPIDEKLQkJICogVFg6IFRYX0FDX0JFX0ZJRk8gKFRYIEFDIEJlc3QtRWZmb3J0IGRhdGEgcGFja2V0cykKLQkJICogICAobGVnYWN5KSBUWF9EQVRBX0ZJRk8gKFRYIGRhdGEgcGFja2V0cykKLQkJICogUlg6IFVOVVNFRAotCQkgKi8KLQkJd2xjX2h3LT5kaVsxXSA9IGRtYV9hdHRhY2gobmFtZSwgd2xjX2h3LT5zaWgsCi0JCQkJCSAgIERNQVJFRyh3bGNfaHcsIERNQV9UWCwgMSksIE5VTEwsCi0JCQkJCSAgIHR1bmUtPm50eGQsIDAsIDAsIC0xLCAwLCAwLAotCQkJCQkgICAmYnJjbV9tc2dfbGV2ZWwpOwotCQlkbWFfYXR0YWNoX2VyciB8PSAoTlVMTCA9PSB3bGNfaHctPmRpWzFdKTsKLQotCQkvKgotCQkgKiBGSUZPIDIKLQkJICogVFg6IFRYX0FDX1ZJX0ZJRk8gKFRYIEFDIFZpZGVvIGRhdGEgcGFja2V0cykKLQkJICogUlg6IFVOVVNFRAotCQkgKi8KLQkJd2xjX2h3LT5kaVsyXSA9IGRtYV9hdHRhY2gobmFtZSwgd2xjX2h3LT5zaWgsCi0JCQkJCSAgIERNQVJFRyh3bGNfaHcsIERNQV9UWCwgMiksIE5VTEwsCi0JCQkJCSAgIHR1bmUtPm50eGQsIDAsIDAsIC0xLCAwLCAwLAotCQkJCQkgICAmYnJjbV9tc2dfbGV2ZWwpOwotCQlkbWFfYXR0YWNoX2VyciB8PSAoTlVMTCA9PSB3bGNfaHctPmRpWzJdKTsKLQkJLyoKLQkJICogRklGTyAzCi0JCSAqIFRYOiBUWF9BQ19WT19GSUZPIChUWCBBQyBWb2ljZSBkYXRhIHBhY2tldHMpCi0JCSAqICAgKGxlZ2FjeSkgVFhfQ1RMX0ZJRk8gKFRYIGNvbnRyb2wgJiBtZ210IHBhY2tldHMpCi0JCSAqLwotCQl3bGNfaHctPmRpWzNdID0gZG1hX2F0dGFjaChuYW1lLCB3bGNfaHctPnNpaCwKLQkJCQkJICAgRE1BUkVHKHdsY19odywgRE1BX1RYLCAzKSwKLQkJCQkJICAgTlVMTCwgdHVuZS0+bnR4ZCwgMCwgMCwgLTEsCi0JCQkJCSAgIDAsIDAsICZicmNtX21zZ19sZXZlbCk7Ci0JCWRtYV9hdHRhY2hfZXJyIHw9IChOVUxMID09IHdsY19ody0+ZGlbM10pOwotLyogQ2xlYW5lciB0byBsZWF2ZSB0aGlzIGFzIGlmIHdpdGggQVAgZGVmaW5lZCAqLwotCi0JCWlmIChkbWFfYXR0YWNoX2VycikgewotCQkJd2lwaHlfZXJyKHdpcGh5LCAid2wlZDogd2xjX2F0dGFjaDogZG1hX2F0dGFjaCBmYWlsZWQiCi0JCQkJICAiXG4iLCB1bml0KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8qIGdldCBwb2ludGVyIHRvIGRtYSBlbmdpbmUgdHggZmxvdyBjb250cm9sIHZhcmlhYmxlICovCi0JCWZvciAoaSA9IDA7IGkgPCBORklGTzsgaSsrKQotCQkJaWYgKHdsY19ody0+ZGlbaV0pCi0JCQkJd2xjX2h3LT50eGF2YWlsW2ldID0KLQkJCQkgICAgKHVpbnQgKikgZG1hX2dldHZhcih3bGNfaHctPmRpW2ldLAotCQkJCQkJCSImdHhhdmFpbCIpOwotCX0KLQotCS8qIGluaXRpYWwgdWNvZGUgaG9zdCBmbGFncyAqLwotCWJyY21zX2NfbWhmZGVmKHdsYywgd2xjX2h3LT5iYW5kLT5taGZzLCBwaW9fbWhmMik7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgYnJjbXNfYl9kZXRhY2hfZG1hcGlvKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KQotewotCXVpbnQgajsKLQotCWZvciAoaiA9IDA7IGogPCBORklGTzsgaisrKSB7Ci0JCWlmICh3bGNfaHctPmRpW2pdKSB7Ci0JCQlkbWFfZGV0YWNoKHdsY19ody0+ZGlbal0pOwotCQkJd2xjX2h3LT5kaVtqXSA9IE5VTEw7Ci0JCX0KLQl9Ci19Ci0KLS8qIGxvdyBsZXZlbCBhdHRhY2gKLSAqICAgIHJ1biBiYWNrcGxhbmUgYXR0YWNoLCBpbml0IG52cmFtCi0gKiAgICBydW4gcGh5IGF0dGFjaAotICogICAgaW5pdGlhbGl6ZSBzb2Z0d2FyZSBzdGF0ZSBmb3IgZWFjaCBjb3JlIGFuZCBiYW5kCi0gKiAgICBwdXQgdGhlIHdob2xlIGNoaXAgaW4gcmVzZXQoZHJpdmVyIGRvd24gc3RhdGUpLCBubyBjbG9jawotICovCi1pbnQgYnJjbXNfYl9hdHRhY2goc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB1MTYgdmVuZG9yLCB1MTYgZGV2aWNlLCB1aW50IHVuaXQsCi0JCSAgICBib29sIHBpb21vZGUsIHZvaWQgKnJlZ3N2YSwgdWludCBidXN0eXBlLCB2b2lkICpidHBhcmFtKQotewotCXN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3OwotCWQxMXJlZ3NfdCAqcmVnczsKLQljaGFyICptYWNhZGRyID0gTlVMTDsKLQljaGFyICp2YXJzOwotCXVpbnQgZXJyID0gMDsKLQl1aW50IGo7Ci0JYm9vbCB3bWUgPSBmYWxzZTsKLQlzdHJ1Y3Qgc2hhcmVkX3BoeV9wYXJhbXMgc2hhX3BhcmFtczsKLQlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2xjLT53aXBoeTsKLQotCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZDogdmVuZG9yIDB4JXggZGV2aWNlIDB4JXhcbiIsIHVuaXQsIHZlbmRvciwKLQkJZGV2aWNlKTsKLQotCXdtZSA9IHRydWU7Ci0KLQl3bGNfaHcgPSB3bGMtPmh3OwotCXdsY19ody0+d2xjID0gd2xjOwotCXdsY19ody0+dW5pdCA9IHVuaXQ7Ci0Jd2xjX2h3LT5iYW5kID0gd2xjX2h3LT5iYW5kc3RhdGVbMF07Ci0Jd2xjX2h3LT5fcGlvbW9kZSA9IHBpb21vZGU7Ci0KLQkvKiBwb3B1bGF0ZSBzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgd2l0aCBkZWZhdWx0IHZhbHVlcyAgKi8KLQlicmNtc19iX2luZm9faW5pdCh3bGNfaHcpOwotCi0JLyoKLQkgKiBEbyB0aGUgaGFyZHdhcmUgcG9ydGlvbiBvZiB0aGUgYXR0YWNoLgotCSAqIEFsc28gaW5pdGlhbGl6ZSBzb2Z0d2FyZSBzdGF0ZSB0aGF0IGRlcGVuZHMgb24gdGhlIHBhcnRpY3VsYXIgaGFyZHdhcmUKLQkgKiB3ZSBhcmUgcnVubmluZy4KLQkgKi8KLQl3bGNfaHctPnNpaCA9IGFpX2F0dGFjaChyZWdzdmEsIGJ1c3R5cGUsIGJ0cGFyYW0sCi0JCQkJJndsY19ody0+dmFycywgJndsY19ody0+dmFyc19zaXplKTsKLQlpZiAod2xjX2h3LT5zaWggPT0gTlVMTCkgewotCQl3aXBoeV9lcnIod2lwaHksICJ3bCVkOiBicmNtc19iX2F0dGFjaDogc2lfYXR0YWNoIGZhaWxlZFxuIiwKLQkJCSAgdW5pdCk7Ci0JCWVyciA9IDExOwotCQlnb3RvIGZhaWw7Ci0JfQotCXZhcnMgPSB3bGNfaHctPnZhcnM7Ci0KLQkvKgotCSAqIEdldCB2ZW5kaWQvZGV2aWQgbnZyYW0gb3ZlcndyaXRlcywgd2hpY2ggY291bGQgYmUgZGlmZmVyZW50Ci0JICogdGhhbiB0aG9zZSB0aGUgQklPUyByZWNvZ25pemVzIGZvciBkZXZpY2VzIG9uIFBDTUNJQV9CVVMsCi0JICogU0RJT19CVVMsIGFuZCBTUk9NbGVzcyBkZXZpY2VzIG9uIFBDSV9CVVMuCi0JICovCi0jaWZkZWYgQkNNQlVTVFlQRQotCWJ1c3R5cGUgPSBCQ01CVVNUWVBFOwotI2VuZGlmCi0JaWYgKGJ1c3R5cGUgIT0gU0lfQlVTKSB7Ci0JCWNoYXIgKnZhcjsKLQotCQl2YXIgPSBnZXR2YXIodmFycywgInZlbmRpZCIpOwotCQlpZiAodmFyKSB7Ci0JCQl2ZW5kb3IgPSAodTE2KSBzaW1wbGVfc3RydG91bCh2YXIsIE5VTEwsIDApOwotCQkJd2lwaHlfZXJyKHdpcGh5LCAiT3ZlcnJpZGluZyB2ZW5kb3IgaWQgPSAweCV4XG4iLAotCQkJCSAgdmVuZG9yKTsKLQkJfQotCQl2YXIgPSBnZXR2YXIodmFycywgImRldmlkIik7Ci0JCWlmICh2YXIpIHsKLQkJCXUxNiBkZXZpZCA9ICh1MTYpIHNpbXBsZV9zdHJ0b3VsKHZhciwgTlVMTCwgMCk7Ci0JCQlpZiAoZGV2aWQgIT0gMHhmZmZmKSB7Ci0JCQkJZGV2aWNlID0gZGV2aWQ7Ci0JCQkJd2lwaHlfZXJyKHdpcGh5LCAiT3ZlcnJpZGluZyBkZXZpY2UgaWQgPSAweCV4IgotCQkJCQkgICJcbiIsIGRldmljZSk7Ci0JCQl9Ci0JCX0KLQotCQkvKiB2ZXJpZnkgYWdhaW4gdGhlIGRldmljZSBpcyBzdXBwb3J0ZWQgKi8KLQkJaWYgKCFicmNtc19jX2NoaXBtYXRjaCh2ZW5kb3IsIGRldmljZSkpIHsKLQkJCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6IGJyY21zX2JfYXR0YWNoOiBVbnN1cHBvcnRlZCAiCi0JCQkJInZlbmRvci9kZXZpY2UgKDB4JXgvMHgleClcbiIsCi0JCQkJIHVuaXQsIHZlbmRvciwgZGV2aWNlKTsKLQkJCWVyciA9IDEyOwotCQkJZ290byBmYWlsOwotCQl9Ci0JfQotCi0Jd2xjX2h3LT52ZW5kb3JpZCA9IHZlbmRvcjsKLQl3bGNfaHctPmRldmljZWlkID0gZGV2aWNlOwotCi0JLyogc2V0IGJhcjAgd2luZG93IHRvIHBvaW50IGF0IEQxMSBjb3JlICovCi0Jd2xjX2h3LT5yZWdzID0gKGQxMXJlZ3NfdCAqKSBhaV9zZXRjb3JlKHdsY19ody0+c2loLCBEMTFfQ09SRV9JRCwgMCk7Ci0Jd2xjX2h3LT5jb3JlcmV2ID0gYWlfY29yZXJldih3bGNfaHctPnNpaCk7Ci0KLQlyZWdzID0gd2xjX2h3LT5yZWdzOwotCi0Jd2xjLT5yZWdzID0gd2xjX2h3LT5yZWdzOwotCi0JLyogdmFsaWRhdGUgY2hpcCwgY2hpcHJldiBhbmQgY29yZXJldiAqLwotCWlmICghYnJjbXNfY19pc2dvb2RjaGlwKHdsY19odykpIHsKLQkJZXJyID0gMTM7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBpbml0aWFsaXplIHBvd2VyIGNvbnRyb2wgcmVnaXN0ZXJzICovCi0JYWlfY2xrY3RsX2luaXQod2xjX2h3LT5zaWgpOwotCi0JLyogcmVxdWVzdCBmYXN0Y2xvY2sgYW5kIGZvcmNlIGZhc3RjbG9jayBmb3IgdGhlIHJlc3Qgb2YgYXR0YWNoCi0JICogYnJpbmcgdGhlIGQxMSBjb3JlIG91dCBvZiByZXNldC4KLQkgKiAgIEZvciBQTVUgY2hpcHMsIHRoZSBmaXJzdCB3bGNfY2xrY3RsX2NsayBpcyBuby1vcCBzaW5jZSBjb3JlLWNsayBpcyBzdGlsbCBmYWxzZTsKLQkgKiAgIEJ1dCBpdCB3aWxsIGJlIGNhbGxlZCBhZ2FpbiBpbnNpZGUgd2xjX2NvcmVyZXNldCwgYWZ0ZXIgZDExIGlzIG91dCBvZiByZXNldC4KLQkgKi8KLQlicmNtc19iX2Nsa2N0bF9jbGsod2xjX2h3LCBDTEtfRkFTVCk7Ci0JYnJjbXNfYl9jb3JlcmVzZXQod2xjX2h3LCBCUkNNU19VU0VfQ09SRUZMQUdTKTsKLQotCWlmICghYnJjbXNfYl92YWxpZGF0ZV9jaGlwX2FjY2Vzcyh3bGNfaHcpKSB7Ci0JCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6IGJyY21zX2JfYXR0YWNoOiB2YWxpZGF0ZV9jaGlwX2FjY2VzcyAiCi0JCQkiZmFpbGVkXG4iLCB1bml0KTsKLQkJZXJyID0gMTQ7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBnZXQgdGhlIGJvYXJkIHJldiwgdXNlZCBqdXN0IGJlbG93ICovCi0JaiA9IGdldGludHZhcih2YXJzLCAiYm9hcmRyZXYiKTsKLQkvKiBwcm9tb3RlIHNyb20gYm9hcmRyZXYgb2YgMHhGRiB0byAxICovCi0JaWYgKGogPT0gQk9BUkRSRVZfUFJPTU9UQUJMRSkKLQkJaiA9IEJPQVJEUkVWX1BST01PVEVEOwotCXdsY19ody0+Ym9hcmRyZXYgPSAodTE2KSBqOwotCWlmICghYnJjbXNfY192YWxpZGJvYXJkdHlwZSh3bGNfaHcpKSB7Ci0JCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6IGJyY21zX2JfYXR0YWNoOiBVbnN1cHBvcnRlZCBCcm9hZGNvbSAiCi0JCQkiYm9hcmQgdHlwZSAoMHgleCkiICIgb3IgcmV2aXNpb24gbGV2ZWwgKDB4JXgpXG4iLAotCQkJIHVuaXQsIHdsY19ody0+c2loLT5ib2FyZHR5cGUsIHdsY19ody0+Ym9hcmRyZXYpOwotCQllcnIgPSAxNTsKLQkJZ290byBmYWlsOwotCX0KLQl3bGNfaHctPnNyb21yZXYgPSAodTgpIGdldGludHZhcih2YXJzLCAic3JvbXJldiIpOwotCXdsY19ody0+Ym9hcmRmbGFncyA9ICh1MzIpIGdldGludHZhcih2YXJzLCAiYm9hcmRmbGFncyIpOwotCXdsY19ody0+Ym9hcmRmbGFnczIgPSAodTMyKSBnZXRpbnR2YXIodmFycywgImJvYXJkZmxhZ3MyIik7Ci0KLQlpZiAod2xjX2h3LT5ib2FyZGZsYWdzICYgQkZMX05PUExMRE9XTikKLQkJYnJjbXNfYl9wbGxyZXEod2xjX2h3LCB0cnVlLCBCUkNNU19QTExSRVFfU0hBUkVEKTsKLQotCWlmICgod2xjX2h3LT5zaWgtPmJ1c3R5cGUgPT0gUENJX0JVUykKLQkgICAgJiYgKGFpX3BjaV93YXIxNjE2NSh3bGNfaHctPnNpaCkpKQotCQl3bGMtPndhcjE2MTY1ID0gdHJ1ZTsKLQotCS8qIGNoZWNrIGRldmljZSBpZChzcm9tLCBudnJhbSBldGMuKSB0byBzZXQgYmFuZHMgKi8KLQlpZiAod2xjX2h3LT5kZXZpY2VpZCA9PSBCQ000MzIyNF9EMTFOX0lEIHx8Ci0JICAgIHdsY19ody0+ZGV2aWNlaWQgPT0gQkNNNDMyMjRfRDExTl9JRF9WRU4xKSB7Ci0JCS8qIER1YWxiYW5kIGJvYXJkcyAqLwotCQl3bGNfaHctPl9uYmFuZHMgPSAyOwotCX0gZWxzZQotCQl3bGNfaHctPl9uYmFuZHMgPSAxOwotCi0JaWYgKCh3bGNfaHctPnNpaC0+Y2hpcCA9PSBCQ000MzIyNV9DSElQX0lEKSkKLQkJd2xjX2h3LT5fbmJhbmRzID0gMTsKLQotCS8qIEJNQUNfTk9URTogcmVtb3ZlIGluaXQgb2YgcHViIHZhbHVlcyB3aGVuIGJyY21zX2NfYXR0YWNoKCkKLQkgKiB1bmNvbmRpdGlvbmFsbHkgZG9lcyB0aGUgaW5pdCBvZiB0aGVzZSB2YWx1ZXMKLQkgKi8KLQl3bGMtPnZlbmRvcmlkID0gd2xjX2h3LT52ZW5kb3JpZDsKLQl3bGMtPmRldmljZWlkID0gd2xjX2h3LT5kZXZpY2VpZDsKLQl3bGMtPnB1Yi0+c2loID0gd2xjX2h3LT5zaWg7Ci0Jd2xjLT5wdWItPmNvcmVyZXYgPSB3bGNfaHctPmNvcmVyZXY7Ci0Jd2xjLT5wdWItPnNyb21yZXYgPSB3bGNfaHctPnNyb21yZXY7Ci0Jd2xjLT5wdWItPmJvYXJkcmV2ID0gd2xjX2h3LT5ib2FyZHJldjsKLQl3bGMtPnB1Yi0+Ym9hcmRmbGFncyA9IHdsY19ody0+Ym9hcmRmbGFnczsKLQl3bGMtPnB1Yi0+Ym9hcmRmbGFnczIgPSB3bGNfaHctPmJvYXJkZmxhZ3MyOwotCXdsYy0+cHViLT5fbmJhbmRzID0gd2xjX2h3LT5fbmJhbmRzOwotCi0Jd2xjX2h3LT5waHlzaGltID0gd2xjX3BoeV9zaGltX2F0dGFjaCh3bGNfaHcsIHdsYy0+d2wsIHdsYyk7Ci0KLQlpZiAod2xjX2h3LT5waHlzaGltID09IE5VTEwpIHsKLQkJd2lwaHlfZXJyKHdpcGh5LCAid2wlZDogYnJjbXNfYl9hdHRhY2g6IHdsY19waHlfc2hpbV9hdHRhY2ggIgotCQkJImZhaWxlZFxuIiwgdW5pdCk7Ci0JCWVyciA9IDI1OwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JLyogcGFzcyBhbGwgdGhlIHBhcmFtZXRlcnMgdG8gd2xjX3BoeV9zaGFyZWRfYXR0YWNoIGluIG9uZSBzdHJ1Y3QgKi8KLQlzaGFfcGFyYW1zLnNpaCA9IHdsY19ody0+c2loOwotCXNoYV9wYXJhbXMucGh5c2hpbSA9IHdsY19ody0+cGh5c2hpbTsKLQlzaGFfcGFyYW1zLnVuaXQgPSB1bml0OwotCXNoYV9wYXJhbXMuY29yZXJldiA9IHdsY19ody0+Y29yZXJldjsKLQlzaGFfcGFyYW1zLnZhcnMgPSB2YXJzOwotCXNoYV9wYXJhbXMudmlkID0gd2xjX2h3LT52ZW5kb3JpZDsKLQlzaGFfcGFyYW1zLmRpZCA9IHdsY19ody0+ZGV2aWNlaWQ7Ci0Jc2hhX3BhcmFtcy5jaGlwID0gd2xjX2h3LT5zaWgtPmNoaXA7Ci0Jc2hhX3BhcmFtcy5jaGlwcmV2ID0gd2xjX2h3LT5zaWgtPmNoaXByZXY7Ci0Jc2hhX3BhcmFtcy5jaGlwcGtnID0gd2xjX2h3LT5zaWgtPmNoaXBwa2c7Ci0Jc2hhX3BhcmFtcy5zcm9tcmV2ID0gd2xjX2h3LT5zcm9tcmV2OwotCXNoYV9wYXJhbXMuYm9hcmR0eXBlID0gd2xjX2h3LT5zaWgtPmJvYXJkdHlwZTsKLQlzaGFfcGFyYW1zLmJvYXJkcmV2ID0gd2xjX2h3LT5ib2FyZHJldjsKLQlzaGFfcGFyYW1zLmJvYXJkdmVuZG9yID0gd2xjX2h3LT5zaWgtPmJvYXJkdmVuZG9yOwotCXNoYV9wYXJhbXMuYm9hcmRmbGFncyA9IHdsY19ody0+Ym9hcmRmbGFnczsKLQlzaGFfcGFyYW1zLmJvYXJkZmxhZ3MyID0gd2xjX2h3LT5ib2FyZGZsYWdzMjsKLQlzaGFfcGFyYW1zLmJ1c3R5cGUgPSB3bGNfaHctPnNpaC0+YnVzdHlwZTsKLQlzaGFfcGFyYW1zLmJ1c2NvcmVyZXYgPSB3bGNfaHctPnNpaC0+YnVzY29yZXJldjsKLQotCS8qIGFsbG9jIGFuZCBzYXZlIHBvaW50ZXIgdG8gc2hhcmVkIHBoeSBzdGF0ZSBhcmVhICovCi0Jd2xjX2h3LT5waHlfc2ggPSB3bGNfcGh5X3NoYXJlZF9hdHRhY2goJnNoYV9wYXJhbXMpOwotCWlmICghd2xjX2h3LT5waHlfc2gpIHsKLQkJZXJyID0gMTY7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBpbml0aWFsaXplIHNvZnR3YXJlIHN0YXRlIGZvciBlYWNoIGNvcmUgYW5kIGJhbmQgKi8KLQlmb3IgKGogPSAwOyBqIDwgTkJBTkRTX0hXKHdsY19odyk7IGorKykgewotCQkvKgotCQkgKiBiYW5kMCBpcyBhbHdheXMgMi40R2h6Ci0JCSAqIGJhbmQxLCBpZiBwcmVzZW50LCBpcyA1R2h6Ci0JCSAqLwotCi0JCS8qIFNvIGlmIHRoaXMgaXMgYSBzaW5nbGUgYmFuZCAxMWEgY2FyZCwgdXNlIGJhbmQgMSAqLwotCQlpZiAoSVNfU0lOR0xFQkFORF81Ryh3bGNfaHctPmRldmljZWlkKSkKLQkJCWogPSBCQU5EXzVHX0lOREVYOwotCi0JCWJyY21zX2Nfc2V0eGJhbmQod2xjX2h3LCBqKTsKLQotCQl3bGNfaHctPmJhbmQtPmJhbmR1bml0ID0gajsKLQkJd2xjX2h3LT5iYW5kLT5iYW5kdHlwZSA9IGogPyBCUkNNX0JBTkRfNUcgOiBCUkNNX0JBTkRfMkc7Ci0JCXdsYy0+YmFuZC0+YmFuZHVuaXQgPSBqOwotCQl3bGMtPmJhbmQtPmJhbmR0eXBlID0gaiA/IEJSQ01fQkFORF81RyA6IEJSQ01fQkFORF8yRzsKLQkJd2xjLT5jb3JlLT5jb3JlaWR4ID0gYWlfY29yZWlkeCh3bGNfaHctPnNpaCk7Ci0KLQkJd2xjX2h3LT5tYWNod2NhcCA9IFJfUkVHKCZyZWdzLT5tYWNod2NhcCk7Ci0JCXdsY19ody0+bWFjaHdjYXBfYmFja3VwID0gd2xjX2h3LT5tYWNod2NhcDsKLQotCQkvKiBpbml0IHR4IGZpZm8gc2l6ZSAqLwotCQl3bGNfaHctPnhtdGZpZm9fc3ogPQotCQkgICAgeG10Zmlmb19zelsod2xjX2h3LT5jb3JlcmV2IC0gWE1URklGT1RCTF9TVEFSVFJFVildOwotCi0JCS8qIEdldCBhIHBoeSBmb3IgdGhpcyBiYW5kICovCi0JCXdsY19ody0+YmFuZC0+cGkgPSB3bGNfcGh5X2F0dGFjaCh3bGNfaHctPnBoeV9zaCwKLQkJCSh2b2lkICopcmVncywgYnJjbXNfYl9iYW5kdHlwZSh3bGNfaHcpLCB2YXJzLAotCQkJd2xjLT53aXBoeSk7Ci0JCWlmICh3bGNfaHctPmJhbmQtPnBpID09IE5VTEwpIHsKLQkJCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6IGJyY21zX2JfYXR0YWNoOiB3bGNfcGh5XyIKLQkJCQkgICJhdHRhY2ggZmFpbGVkXG4iLCB1bml0KTsKLQkJCWVyciA9IDE3OwotCQkJZ290byBmYWlsOwotCQl9Ci0KLQkJd2xjX3BoeV9tYWNod2NhcF9zZXQod2xjX2h3LT5iYW5kLT5waSwgd2xjX2h3LT5tYWNod2NhcCk7Ci0KLQkJd2xjX3BoeV9nZXRfcGh5dmVyc2lvbih3bGNfaHctPmJhbmQtPnBpLCAmd2xjX2h3LT5iYW5kLT5waHl0eXBlLAotCQkJCSAgICAgICAmd2xjX2h3LT5iYW5kLT5waHlyZXYsCi0JCQkJICAgICAgICZ3bGNfaHctPmJhbmQtPnJhZGlvaWQsCi0JCQkJICAgICAgICZ3bGNfaHctPmJhbmQtPnJhZGlvcmV2KTsKLQkJd2xjX2h3LT5iYW5kLT5hYmdwaHlfZW5jb3JlID0KLQkJICAgIHdsY19waHlfZ2V0X2VuY29yZSh3bGNfaHctPmJhbmQtPnBpKTsKLQkJd2xjLT5iYW5kLT5hYmdwaHlfZW5jb3JlID0gd2xjX3BoeV9nZXRfZW5jb3JlKHdsY19ody0+YmFuZC0+cGkpOwotCQl3bGNfaHctPmJhbmQtPmNvcmVfZmxhZ3MgPQotCQkgICAgd2xjX3BoeV9nZXRfY29yZWZsYWdzKHdsY19ody0+YmFuZC0+cGkpOwotCi0JCS8qIHZlcmlmeSBnb29kIHBoeV90eXBlICYgc3VwcG9ydGVkIHBoeSByZXZpc2lvbiAqLwotCQlpZiAoQlJDTVNfSVNOUEhZKHdsY19ody0+YmFuZCkpIHsKLQkJCWlmIChOQ09ORl9IQVMod2xjX2h3LT5iYW5kLT5waHlyZXYpKQotCQkJCWdvdG8gZ29vZF9waHk7Ci0JCQllbHNlCi0JCQkJZ290byBiYWRfcGh5OwotCQl9IGVsc2UgaWYgKEJSQ01TX0lTTENOUEhZKHdsY19ody0+YmFuZCkpIHsKLQkJCWlmIChMQ05DT05GX0hBUyh3bGNfaHctPmJhbmQtPnBoeXJldikpCi0JCQkJZ290byBnb29kX3BoeTsKLQkJCWVsc2UKLQkJCQlnb3RvIGJhZF9waHk7Ci0JCX0gZWxzZSB7Ci0gYmFkX3BoeToKLQkJCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6IGJyY21zX2JfYXR0YWNoOiB1bnN1cHBvcnRlZCAiCi0JCQkJICAicGh5IHR5cGUvcmV2ICglZC8lZClcbiIsIHVuaXQsCi0JCQkJICB3bGNfaHctPmJhbmQtPnBoeXR5cGUsIHdsY19ody0+YmFuZC0+cGh5cmV2KTsKLQkJCWVyciA9IDE4OwotCQkJZ290byBmYWlsOwotCQl9Ci0KLSBnb29kX3BoeToKLQkJLyogQk1BQ19OT1RFOiB3bGMtPmJhbmQtPnBpIHNob3VsZCBub3QgYmUgc2V0IGJlbG93IGFuZCBzaG91bGQgYmUgZG9uZSBpbiB0aGUKLQkJICogaGlnaCBsZXZlbCBhdHRhY2guIEhvd2V2ZXIgd2UgY2FuIG5vdCBtYWtlIHRoYXQgY2hhbmdlIHVudGlsIGFsbCBsb3cgbGV2ZWwgYWNjZXNzCi0JCSAqIGlzIGNoYW5nZWQgdG8gd2xjX2h3LT5iYW5kLT5waS4gSW5zdGVhZCBkbyB0aGUgd2xjLT5iYW5kLT5waSBpbml0IGJlbG93LCBrZWVwaW5nCi0JCSAqIHdsY19ody0+YmFuZC0+cGkgYXMgd2VsbCBmb3IgaW5jcmVtZW50YWwgdXBkYXRlIG9mIGxvdyBsZXZlbCBmbnMsIGFuZCBjdXQgb3ZlcgotCQkgKiBsb3cgb25seSBpbml0IHdoZW4gYWxsIGZucyB1cGRhdGVkLgotCQkgKi8KLQkJd2xjLT5iYW5kLT5waSA9IHdsY19ody0+YmFuZC0+cGk7Ci0JCXdsYy0+YmFuZC0+cGh5dHlwZSA9IHdsY19ody0+YmFuZC0+cGh5dHlwZTsKLQkJd2xjLT5iYW5kLT5waHlyZXYgPSB3bGNfaHctPmJhbmQtPnBoeXJldjsKLQkJd2xjLT5iYW5kLT5yYWRpb2lkID0gd2xjX2h3LT5iYW5kLT5yYWRpb2lkOwotCQl3bGMtPmJhbmQtPnJhZGlvcmV2ID0gd2xjX2h3LT5iYW5kLT5yYWRpb3JldjsKLQotCQkvKiBkZWZhdWx0IGNvbnRlbnRpb24gd2luZG93cyBzaXplIGxpbWl0cyAqLwotCQl3bGNfaHctPmJhbmQtPkNXbWluID0gQVBIWV9DV01JTjsKLQkJd2xjX2h3LT5iYW5kLT5DV21heCA9IFBIWV9DV01BWDsKLQotCQlpZiAoIWJyY21zX2JfYXR0YWNoX2RtYXBpbyh3bGMsIGosIHdtZSkpIHsKLQkJCWVyciA9IDE5OwotCQkJZ290byBmYWlsOwotCQl9Ci0JfQotCi0JLyogZGlzYWJsZSBjb3JlIHRvIG1hdGNoIGRyaXZlciAiZG93biIgc3RhdGUgKi8KLQlicmNtc19jX2NvcmVkaXNhYmxlKHdsY19odyk7Ci0KLQkvKiBNYXRjaCBkcml2ZXIgImRvd24iIHN0YXRlICovCi0JaWYgKHdsY19ody0+c2loLT5idXN0eXBlID09IFBDSV9CVVMpCi0JCWFpX3BjaV9kb3duKHdsY19ody0+c2loKTsKLQotCS8qIHJlZ2lzdGVyIHNiIGludGVycnVwdCBjYWxsYmFjayBmdW5jdGlvbnMgKi8KLQlhaV9yZWdpc3Rlcl9pbnRyX2NhbGxiYWNrKHdsY19ody0+c2loLCAodm9pZCAqKWJyY21zX2Nfd2xpbnRyc29mZiwKLQkJCQkgICh2b2lkICopYnJjbXNfY193bGludHJzcmVzdG9yZSwgTlVMTCwgd2xjKTsKLQotCS8qIHR1cm4gb2ZmIHBsbCBhbmQgeHRhbCB0byBtYXRjaCBkcml2ZXIgImRvd24iIHN0YXRlICovCi0JYnJjbXNfYl94dGFsKHdsY19odywgT0ZGKTsKLQotCS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIFRoZSBoYXJkd2FyZSBpcyBpbiB0aGUgRE9XTiBzdGF0ZSBhdCB0aGlzIHBvaW50LiBEMTEgY29yZQotCSAqIG9yIGNvcmVzIGFyZSBpbiByZXNldCB3aXRoIGNsb2NrcyBvZmYsIGFuZCB0aGUgYm9hcmQgUExMcwotCSAqIGFyZSBvZmYgaWYgcG9zc2libGUuCi0JICoKLQkgKiBCZXlvbmQgdGhpcyBwb2ludCwgd2xjLT5zYmNsayA9PSBmYWxzZSBhbmQgY2hpcCByZWdpc3RlcnMKLQkgKiBzaG91bGQgbm90IGJlIHRvdWNoZWQuCi0JICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSAqLwotCi0JLyogaW5pdCBldGhlcmFkZHIgc3RhdGUgdmFyaWFibGVzICovCi0JbWFjYWRkciA9IGJyY21zX2NfZ2V0X21hY2FkZHIod2xjX2h3KTsKLQlpZiAobWFjYWRkciA9PSBOVUxMKSB7Ci0JCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6IGJyY21zX2JfYXR0YWNoOiBtYWNhZGRyIG5vdCBmb3VuZFxuIiwKLQkJCSAgdW5pdCk7Ci0JCWVyciA9IDIxOwotCQlnb3RvIGZhaWw7Ci0JfQotCWJyY211X2V0aGVyX2F0b2UobWFjYWRkciwgd2xjX2h3LT5ldGhlcmFkZHIpOwotCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcih3bGNfaHctPmV0aGVyYWRkcikgfHwKLQkgICAgaXNfemVyb19ldGhlcl9hZGRyKHdsY19ody0+ZXRoZXJhZGRyKSkgewotCQl3aXBoeV9lcnIod2lwaHksICJ3bCVkOiBicmNtc19iX2F0dGFjaDogYmFkIG1hY2FkZHIgJXNcbiIsCi0JCQkgIHVuaXQsIG1hY2FkZHIpOwotCQllcnIgPSAyMjsKLQkJZ290byBmYWlsOwotCX0KLQotCUJDTU1TRyh3bGMtPndpcGh5LAotCQkgImRldmljZWlkIDB4JXggbmJhbmRzICVkIGJvYXJkIDB4JXggbWFjYWRkcjogJXNcbiIsCi0JCSB3bGNfaHctPmRldmljZWlkLCB3bGNfaHctPl9uYmFuZHMsCi0JCSB3bGNfaHctPnNpaC0+Ym9hcmR0eXBlLCBtYWNhZGRyKTsKLQotCXJldHVybiBlcnI7Ci0KLSBmYWlsOgotCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6IGJyY21zX2JfYXR0YWNoOiBmYWlsZWQgd2l0aCBlcnIgJWRcbiIsIHVuaXQsCi0JCSAgZXJyKTsKLQlyZXR1cm4gZXJyOwotfQotCi0vKgotICogSW5pdGlhbGl6ZSBicmNtc19jX2luZm8gZGVmYXVsdCB2YWx1ZXMgLi4uCi0gKiBtYXkgZ2V0IG92ZXJyaWRlcyBsYXRlciBpbiB0aGlzIGZ1bmN0aW9uCi0gKiAgQk1BQ19OT1RFUywgbW92ZSBsb3cgb3V0IGFuZCByZXNvbHZlIHRoZSBkYW5nbGluZyBvbmVzCi0gKi8KLXN0YXRpYyB2b2lkIGJyY21zX2JfaW5mb19pbml0KHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KQotewotCXN0cnVjdCBicmNtc19jX2luZm8gKndsYyA9IHdsY19ody0+d2xjOwotCi0JLyogc2V0IGRlZmF1bHQgc3cgbWFjaW50bWFzayB2YWx1ZSAqLwotCXdsYy0+ZGVmbWFjaW50bWFzayA9IERFRl9NQUNJTlRNQVNLOwotCi0JLyogdmFyaW91cyA4MDIuMTFnIG1vZGVzICovCi0Jd2xjX2h3LT5zaG9ydHNsb3QgPSBmYWxzZTsKLQotCXdsY19ody0+U0ZCTCA9IFJFVFJZX1NIT1JUX0ZCOwotCXdsY19ody0+TEZCTCA9IFJFVFJZX0xPTkdfRkI7Ci0KLQkvKiBkZWZhdWx0IG1hYyByZXRyeSBsaW1pdHMgKi8KLQl3bGNfaHctPlNSTCA9IFJFVFJZX1NIT1JUX0RFRjsKLQl3bGNfaHctPkxSTCA9IFJFVFJZX0xPTkdfREVGOwotCXdsY19ody0+Y2hhbnNwZWMgPSBDSDIwTUhaX0NIU1BFQygxKTsKLX0KLQotLyoKLSAqIGxvdyBsZXZlbCBkZXRhY2gKLSAqLwotaW50IGJyY21zX2JfZGV0YWNoKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQl1aW50IGk7Ci0Jc3RydWN0IGJyY21zX2h3X2JhbmQgKmJhbmQ7Ci0Jc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcgPSB3bGMtPmh3OwotCWludCBjYWxsYmFja3M7Ci0KLQljYWxsYmFja3MgPSAwOwotCi0JaWYgKHdsY19ody0+c2loKSB7Ci0JCS8qIGRldGFjaCBpbnRlcnJ1cHQgc3luYyBtZWNoYW5pc20gc2luY2UgaW50ZXJydXB0IGlzIGRpc2FibGVkIGFuZCBwZXItcG9ydAotCQkgKiBpbnRlcnJ1cHQgb2JqZWN0IG1heSBoYXMgYmVlbiBmcmVlZC4gdGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIHNiIGNvcmUgc3dpdGNoCi0JCSAqLwotCQlhaV9kZXJlZ2lzdGVyX2ludHJfY2FsbGJhY2sod2xjX2h3LT5zaWgpOwotCi0JCWlmICh3bGNfaHctPnNpaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKQotCQkJYWlfcGNpX3NsZWVwKHdsY19ody0+c2loKTsKLQl9Ci0KLQlicmNtc19iX2RldGFjaF9kbWFwaW8od2xjX2h3KTsKLQotCWJhbmQgPSB3bGNfaHctPmJhbmQ7Ci0JZm9yIChpID0gMDsgaSA8IE5CQU5EU19IVyh3bGNfaHcpOyBpKyspIHsKLQkJaWYgKGJhbmQtPnBpKSB7Ci0JCQkvKiBEZXRhY2ggdGhpcyBiYW5kJ3MgcGh5ICovCi0JCQl3bGNfcGh5X2RldGFjaChiYW5kLT5waSk7Ci0JCQliYW5kLT5waSA9IE5VTEw7Ci0JCX0KLQkJYmFuZCA9IHdsY19ody0+YmFuZHN0YXRlW09USEVSQkFORFVOSVQod2xjKV07Ci0JfQotCi0JLyogRnJlZSBzaGFyZWQgcGh5IHN0YXRlICovCi0Ja2ZyZWUod2xjX2h3LT5waHlfc2gpOwotCi0Jd2xjX3BoeV9zaGltX2RldGFjaCh3bGNfaHctPnBoeXNoaW0pOwotCi0JLyogZnJlZSB2YXJzICovCi0Ja2ZyZWUod2xjX2h3LT52YXJzKTsKLQl3bGNfaHctPnZhcnMgPSBOVUxMOwotCi0JaWYgKHdsY19ody0+c2loKSB7Ci0JCWFpX2RldGFjaCh3bGNfaHctPnNpaCk7Ci0JCXdsY19ody0+c2loID0gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gY2FsbGJhY2tzOwotCi19Ci0KLXZvaWQgYnJjbXNfYl9yZXNldChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odykKLXsKLQlCQ01NU0cod2xjX2h3LT53bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjX2h3LT51bml0KTsKLQotCS8qIHJlc2V0IHRoZSBjb3JlICovCi0JaWYgKCFERVZJQ0VSRU1PVkVEKHdsY19ody0+d2xjKSkKLQkJYnJjbXNfYl9jb3JlcmVzZXQod2xjX2h3LCBCUkNNU19VU0VfQ09SRUZMQUdTKTsKLQotCS8qIHB1cmdlIHRoZSBkbWEgcmluZ3MgKi8KLQlicmNtc19jX2ZsdXNocXVldWVzKHdsY19ody0+d2xjKTsKLQotCWJyY21zX2NfcmVzZXRfYm1hY19kb25lKHdsY19ody0+d2xjKTsKLX0KLQotdm9pZAotYnJjbXNfYl9pbml0KHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCBjaGFuc3BlY190IGNoYW5zcGVjLAotCQkJICBib29sIG11dGUpIHsKLQl1MzIgbWFjaW50bWFzazsKLQlib29sIGZhc3RjbGs7Ci0Jc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjID0gd2xjX2h3LT53bGM7Ci0KLQlCQ01NU0cod2xjX2h3LT53bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjX2h3LT51bml0KTsKLQotCS8qIHJlcXVlc3QgRkFTVCBjbG9jayBpZiBub3Qgb24gKi8KLQlmYXN0Y2xrID0gd2xjX2h3LT5mb3JjZWZhc3RjbGs7Ci0JaWYgKCFmYXN0Y2xrKQotCQlicmNtc19iX2Nsa2N0bF9jbGsod2xjX2h3LCBDTEtfRkFTVCk7Ci0KLQkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KLQltYWNpbnRtYXNrID0gYnJjbXNfaW50cnNvZmYod2xjLT53bCk7Ci0KLQkvKiBzZXQgdXAgdGhlIHNwZWNpZmllZCBiYW5kIGFuZCBjaGFuc3BlYyAqLwotCWJyY21zX2Nfc2V0eGJhbmQod2xjX2h3LCBDSFNQRUNfQkFORFVOSVQoY2hhbnNwZWMpKTsKLQl3bGNfcGh5X2NoYW5zcGVjX3JhZGlvX3NldCh3bGNfaHctPmJhbmQtPnBpLCBjaGFuc3BlYyk7Ci0KLQkvKiBkbyBvbmUtdGltZSBwaHkgaW5pdHMgYW5kIGNhbGlicmF0aW9uICovCi0Jd2xjX3BoeV9jYWxfaW5pdCh3bGNfaHctPmJhbmQtPnBpKTsKLQotCS8qIGNvcmUtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gKi8KLQlicmNtc19iX2NvcmVpbml0KHdsYyk7Ci0KLQkvKiBzdXNwZW5kIHRoZSB0eCBmaWZvcyBhbmQgbXV0ZSB0aGUgcGh5IGZvciBwcmVpc20gY2FjIHRpbWUgKi8KLQlpZiAobXV0ZSkKLQkJYnJjbXNfYl9tdXRlKHdsY19odywgT04sIFBIWV9NVVRFX0ZPUl9QUkVJU00pOwotCi0JLyogYmFuZC1zcGVjaWZpYyBpbml0cyAqLwotCWJyY21zX2JfYnNpbml0KHdsYywgY2hhbnNwZWMpOwotCi0JLyogcmVzdG9yZSBtYWNpbnRtYXNrICovCi0JYnJjbXNfaW50cnNyZXN0b3JlKHdsYy0+d2wsIG1hY2ludG1hc2spOwotCi0JLyogc2VlZCB3YWtlX292ZXJyaWRlIHdpdGggQlJDTVNfV0FLRV9PVkVSUklERV9NQUNTVVNQRU5EIHNpbmNlIHRoZSBtYWMKLQkgKiBpcyBzdXNwZW5kZWQgYW5kIGJyY21zX2NfZW5hYmxlX21hYygpIHdpbGwgY2xlYXIgdGhpcyBvdmVycmlkZSBiaXQuCi0JICovCi0JbWJvb2xzZXQod2xjX2h3LT53YWtlX292ZXJyaWRlLCBCUkNNU19XQUtFX09WRVJSSURFX01BQ1NVU1BFTkQpOwotCi0JLyoKLQkgKiBpbml0aWFsaXplIG1hY19zdXNwZW5kX2RlcHRoIHRvIDEgdG8gbWF0Y2ggdWNvZGUgaW5pdGlhbCBzdXNwZW5kZWQgc3RhdGUKLQkgKi8KLQl3bGNfaHctPm1hY19zdXNwZW5kX2RlcHRoID0gMTsKLQotCS8qIHJlc3RvcmUgdGhlIGNsayAqLwotCWlmICghZmFzdGNsaykKLQkJYnJjbXNfYl9jbGtjdGxfY2xrKHdsY19odywgQ0xLX0RZTkFNSUMpOwotfQotCi1pbnQgYnJjbXNfYl91cF9wcmVwKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KQotewotCXVpbnQgY29yZW1hc2s7Ci0KLQlCQ01NU0cod2xjX2h3LT53bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjX2h3LT51bml0KTsKLQotCS8qCi0JICogRW5hYmxlIHBsbCBhbmQgeHRhbCwgaW5pdGlhbGl6ZSB0aGUgcG93ZXIgY29udHJvbCByZWdpc3RlcnMsCi0JICogYW5kIGZvcmNlIGZhc3RjbG9jayBmb3IgdGhlIHJlbWFpbmRlciBvZiBicmNtc19jX3VwKCkuCi0JICovCi0JYnJjbXNfYl94dGFsKHdsY19odywgT04pOwotCWFpX2Nsa2N0bF9pbml0KHdsY19ody0+c2loKTsKLQlicmNtc19iX2Nsa2N0bF9jbGsod2xjX2h3LCBDTEtfRkFTVCk7Ci0KLQkvKgotCSAqIENvbmZpZ3VyZSBwY2kvcGNtY2lhIGhlcmUgaW5zdGVhZCBvZiBpbiBicmNtc19jX2F0dGFjaCgpCi0JICogdG8gYWxsb3cgbWZnIGhvdHN3YXA6ICBkb3duLCBob3Rzd2FwIChjaGlwIHBvd2VyIGN5Y2xlKSwgdXAuCi0JICovCi0JY29yZW1hc2sgPSAoMSA8PCB3bGNfaHctPndsYy0+Y29yZS0+Y29yZWlkeCk7Ci0KLQlpZiAod2xjX2h3LT5zaWgtPmJ1c3R5cGUgPT0gUENJX0JVUykKLQkJYWlfcGNpX3NldHVwKHdsY19ody0+c2loLCBjb3JlbWFzayk7Ci0KLQkvKgotCSAqIE5lZWQgdG8gcmVhZCB0aGUgaHdyYWRpbyBzdGF0dXMgaGVyZSB0byBjb3ZlciB0aGUgY2FzZSB3aGVyZSB0aGUgc3lzdGVtCi0JICogaXMgbG9hZGVkIHdpdGggdGhlIGh3IHJhZGlvIGRpc2FibGVkLiBXZSBkbyBub3Qgd2FudCB0byBicmluZyB0aGUgZHJpdmVyIHVwIGluIHRoaXMgY2FzZS4KLQkgKi8KLQlpZiAoYnJjbXNfYl9yYWRpb19yZWFkX2h3ZGlzYWJsZWQod2xjX2h3KSkgewotCQkvKiBwdXQgU0IgUENJIGluIGRvd24gc3RhdGUgYWdhaW4gKi8KLQkJaWYgKHdsY19ody0+c2loLT5idXN0eXBlID09IFBDSV9CVVMpCi0JCQlhaV9wY2lfZG93bih3bGNfaHctPnNpaCk7Ci0JCWJyY21zX2JfeHRhbCh3bGNfaHcsIE9GRik7Ci0JCXJldHVybiAtRU5PTUVESVVNOwotCX0KLQotCWlmICh3bGNfaHctPnNpaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKQotCQlhaV9wY2lfdXAod2xjX2h3LT5zaWgpOwotCi0JLyogcmVzZXQgdGhlIGQxMSBjb3JlICovCi0JYnJjbXNfYl9jb3JlcmVzZXQod2xjX2h3LCBCUkNNU19VU0VfQ09SRUZMQUdTKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgYnJjbXNfYl91cF9maW5pc2goc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcpCi17Ci0JQkNNTVNHKHdsY19ody0+d2xjLT53aXBoeSwgIndsJWRcbiIsIHdsY19ody0+dW5pdCk7Ci0KLQl3bGNfaHctPnVwID0gdHJ1ZTsKLQl3bGNfcGh5X2h3X3N0YXRlX3VwZCh3bGNfaHctPmJhbmQtPnBpLCB0cnVlKTsKLQotCS8qIEZVTExZIGVuYWJsZSBkeW5hbWljIHBvd2VyIGNvbnRyb2wgYW5kIGQxMSBjb3JlIGludGVycnVwdCAqLwotCWJyY21zX2JfY2xrY3RsX2Nsayh3bGNfaHcsIENMS19EWU5BTUlDKTsKLQlicmNtc19pbnRyc29uKHdsY19ody0+d2xjLT53bCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBicmNtc19iX2JtYWNfZG93bl9wcmVwKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KQotewotCWJvb2wgZGV2X2dvbmU7Ci0JdWludCBjYWxsYmFja3MgPSAwOwotCi0JQkNNTVNHKHdsY19ody0+d2xjLT53aXBoeSwgIndsJWRcbiIsIHdsY19ody0+dW5pdCk7Ci0KLQlpZiAoIXdsY19ody0+dXApCi0JCXJldHVybiBjYWxsYmFja3M7Ci0KLQlkZXZfZ29uZSA9IERFVklDRVJFTU9WRUQod2xjX2h3LT53bGMpOwotCi0JLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCi0JaWYgKGRldl9nb25lKQotCQl3bGNfaHctPndsYy0+bWFjaW50bWFzayA9IDA7Ci0JZWxzZSB7Ci0JCS8qIG5vdyBkaXNhYmxlIGludGVycnVwdHMgKi8KLQkJYnJjbXNfaW50cnNvZmYod2xjX2h3LT53bGMtPndsKTsKLQotCQkvKiBlbnN1cmUgd2UncmUgcnVubmluZyBvbiB0aGUgcGxsIGNsb2NrIGFnYWluICovCi0JCWJyY21zX2JfY2xrY3RsX2Nsayh3bGNfaHcsIENMS19GQVNUKTsKLQl9Ci0JLyogZG93biBwaHkgYXQgdGhlIGxhc3Qgb2YgdGhpcyBzdGFnZSAqLwotCWNhbGxiYWNrcyArPSB3bGNfcGh5X2Rvd24od2xjX2h3LT5iYW5kLT5waSk7Ci0KLQlyZXR1cm4gY2FsbGJhY2tzOwotfQotCi1pbnQgYnJjbXNfYl9kb3duX2ZpbmlzaChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odykKLXsKLQl1aW50IGNhbGxiYWNrcyA9IDA7Ci0JYm9vbCBkZXZfZ29uZTsKLQotCUJDTU1TRyh3bGNfaHctPndsYy0+d2lwaHksICJ3bCVkXG4iLCB3bGNfaHctPnVuaXQpOwotCi0JaWYgKCF3bGNfaHctPnVwKQotCQlyZXR1cm4gY2FsbGJhY2tzOwotCi0Jd2xjX2h3LT51cCA9IGZhbHNlOwotCXdsY19waHlfaHdfc3RhdGVfdXBkKHdsY19ody0+YmFuZC0+cGksIGZhbHNlKTsKLQotCWRldl9nb25lID0gREVWSUNFUkVNT1ZFRCh3bGNfaHctPndsYyk7Ci0KLQlpZiAoZGV2X2dvbmUpIHsKLQkJd2xjX2h3LT5zYmNsayA9IGZhbHNlOwotCQl3bGNfaHctPmNsayA9IGZhbHNlOwotCQl3bGNfcGh5X2h3X2Nsa19zdGF0ZV91cGQod2xjX2h3LT5iYW5kLT5waSwgZmFsc2UpOwotCi0JCS8qIHJlY2xhaW0gYW55IHBvc3RlZCBwYWNrZXRzICovCi0JCWJyY21zX2NfZmx1c2hxdWV1ZXMod2xjX2h3LT53bGMpOwotCX0gZWxzZSB7Ci0KLQkJLyogUmVzZXQgYW5kIGRpc2FibGUgdGhlIGNvcmUgKi8KLQkJaWYgKGFpX2lzY29yZXVwKHdsY19ody0+c2loKSkgewotCQkJaWYgKFJfUkVHKCZ3bGNfaHctPnJlZ3MtPm1hY2NvbnRyb2wpICYKLQkJCSAgICBNQ1RMX0VOX01BQykKLQkJCQlicmNtc19jX3N1c3BlbmRfbWFjX2FuZF93YWl0KHdsY19ody0+d2xjKTsKLQkJCWNhbGxiYWNrcyArPSBicmNtc19yZXNldCh3bGNfaHctPndsYy0+d2wpOwotCQkJYnJjbXNfY19jb3JlZGlzYWJsZSh3bGNfaHcpOwotCQl9Ci0KLQkJLyogdHVybiBvZmYgcHJpbWFyeSB4dGFsIGFuZCBwbGwgKi8KLQkJaWYgKCF3bGNfaHctPm5vcmVzZXQpIHsKLQkJCWlmICh3bGNfaHctPnNpaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKQotCQkJCWFpX3BjaV9kb3duKHdsY19ody0+c2loKTsKLQkJCWJyY21zX2JfeHRhbCh3bGNfaHcsIE9GRik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gY2FsbGJhY2tzOwotfQotCi12b2lkIGJyY21zX2Jfd2FpdF9mb3Jfd2FrZShzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odykKLXsKLQkvKiBkZWxheSBiZWZvcmUgZmlyc3QgcmVhZCBvZiB1Y29kZSBzdGF0ZSAqLwotCXVkZWxheSg0MCk7Ci0KLQkvKiB3YWl0IHVudGlsIHVjb2RlIGlzIG5vIGxvbmdlciBhc2xlZXAgKi8KLQlTUElOV0FJVCgoYnJjbXNfYl9yZWFkX3NobSh3bGNfaHcsIE1fVUNPREVfREJHU1QpID09Ci0JCSAgREJHU1RfQVNMRUVQKSwgd2xjX2h3LT53bGMtPmZhc3Rwd3J1cF9kbHkpOwotfQotCi12b2lkIGJyY21zX2JfaHdfZXRoZXJhZGRyKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCB1OCAqZWEpCi17Ci0JbWVtY3B5KGVhLCB3bGNfaHctPmV0aGVyYWRkciwgRVRIX0FMRU4pOwotfQotCi1zdGF0aWMgaW50IGJyY21zX2JfYmFuZHR5cGUoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcpCi17Ci0JcmV0dXJuIHdsY19ody0+YmFuZC0+YmFuZHR5cGU7Ci19Ci0KLS8qIGNvbnRyb2wgY2hpcCBjbG9jayB0byBzYXZlIHBvd2VyLCBlbmFibGUgZHluYW1pYyBjbG9jayBvciBmb3JjZSBmYXN0IGNsb2NrICovCi1zdGF0aWMgdm9pZCBicmNtc19iX2Nsa2N0bF9jbGsoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHVpbnQgbW9kZSkKLXsKLQlpZiAoUE1VQ1RMX0VOQUIod2xjX2h3LT5zaWgpKSB7Ci0JCS8qIG5ldyBjaGlwcyB3aXRoIFBNVSwgQ0NTX0ZPUkNFSFQgd2lsbCBkaXN0cmlidXRlIHRoZSBIVCBjbG9jayBvbiBiYWNrcGxhbmUsCi0JCSAqICBidXQgbWFjIGNvcmUgd2lsbCBzdGlsbCBydW4gb24gQUxQKG5vdCBIVCkgd2hlbiBpdCBlbnRlcnMgcG93ZXJzYXZlIG1vZGUsCi0JCSAqICAgICAgd2hpY2ggbWVhbnMgdGhlIEZDQSBiaXQgbWF5IG5vdCBiZSBzZXQuCi0JCSAqICAgICAgc2hvdWxkIHdha2V1cCBtYWMgaWYgZHJpdmVyIHdhbnRzIGl0IHRvIHJ1biBvbiBIVC4KLQkJICovCi0KLQkJaWYgKHdsY19ody0+Y2xrKSB7Ci0JCQlpZiAobW9kZSA9PSBDTEtfRkFTVCkgewotCQkJCU9SX1JFRygmd2xjX2h3LT5yZWdzLT5jbGtfY3RsX3N0LAotCQkJCSAgICAgICBDQ1NfRk9SQ0VIVCk7Ci0KLQkJCQl1ZGVsYXkoNjQpOwotCi0JCQkJU1BJTldBSVQoKChSX1JFRwotCQkJCQkgICAoJndsY19ody0+cmVncy0+Ci0JCQkJCSAgICBjbGtfY3RsX3N0KSAmIENDU19IVEFWQUlMKSA9PSAwKSwKLQkJCQkJIFBNVV9NQVhfVFJBTlNJVElPTl9ETFkpOwotCQkJCVdBUk5fT04oIShSX1JFRwotCQkJCQkgICgmd2xjX2h3LT5yZWdzLT4KLQkJCQkJICAgY2xrX2N0bF9zdCkgJiBDQ1NfSFRBVkFJTCkpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoKHdsY19ody0+c2loLT5wbXVyZXYgPT0gMCkgJiYKLQkJCQkgICAgKFJfUkVHCi0JCQkJICAgICAoJndsY19ody0+cmVncy0+Ci0JCQkJICAgICAgY2xrX2N0bF9zdCkgJiAoQ0NTX0ZPUkNFSFQgfCBDQ1NfSFRBUkVRKSkpCi0JCQkJCVNQSU5XQUlUKCgoUl9SRUcKLQkJCQkJCSAgICgmd2xjX2h3LT5yZWdzLT4KLQkJCQkJCSAgICBjbGtfY3RsX3N0KSAmIENDU19IVEFWQUlMKQotCQkJCQkJICA9PSAwKSwKLQkJCQkJCSBQTVVfTUFYX1RSQU5TSVRJT05fRExZKTsKLQkJCQlBTkRfUkVHKCZ3bGNfaHctPnJlZ3MtPmNsa19jdGxfc3QsCi0JCQkJCX5DQ1NfRk9SQ0VIVCk7Ci0JCQl9Ci0JCX0KLQkJd2xjX2h3LT5mb3JjZWZhc3RjbGsgPSAobW9kZSA9PSBDTEtfRkFTVCk7Ci0JfSBlbHNlIHsKLQotCQkvKiBvbGQgY2hpcHMgdy9vIFBNVSwgZm9yY2UgSFQgdGhyb3VnaCBjYywKLQkJICogdGhlbiB1c2UgRkNBIHRvIHZlcmlmeSBtYWMgaXMgcnVubmluZyBmYXN0IGNsb2NrCi0JCSAqLwotCi0JCXdsY19ody0+Zm9yY2VmYXN0Y2xrID0gYWlfY2xrY3RsX2NjKHdsY19ody0+c2loLCBtb2RlKTsKLQotCQkvKiBjaGVjayBmYXN0IGNsb2NrIGlzIGF2YWlsYWJsZSAoaWYgY29yZSBpcyBub3QgaW4gcmVzZXQpICovCi0JCWlmICh3bGNfaHctPmZvcmNlZmFzdGNsayAmJiB3bGNfaHctPmNsaykKLQkJCVdBUk5fT04oIShhaV9jb3JlX3NmbGFncyh3bGNfaHctPnNpaCwgMCwgMCkgJgotCQkJCSAgU0lTRl9GQ0xLQSkpOwotCi0JCS8qIGtlZXAgdGhlIHVjb2RlIHdha2UgYml0IG9uIGlmIGZvcmNlZmFzdGNsayBpcyBvbgotCQkgKiBzaW5jZSB3ZSBkbyBub3Qgd2FudCB1Y29kZSB0byBwdXQgdXMgYmFjayB0byBzbG93IGNsb2NrCi0JCSAqIHdoZW4gaXQgZG96ZXMgZm9yIFBNIG1vZGUuCi0JCSAqIENvZGUgYmVsb3cgbWF0Y2hlcyB0aGUgd2FrZSBvdmVycmlkZSBiaXQgd2l0aCBjdXJyZW50IGZvcmNlZmFzdGNsayBzdGF0ZQotCQkgKiBPbmx5IHNldHRpbmcgYml0IGluIHdha2Vfb3ZlcnJpZGUgaW5zdGVhZCBvZiB3YWtpbmcgdWNvZGUgaW1tZWRpYXRlbHkKLQkJICogc2luY2Ugb2xkIGNvZGUgKHdsYy5jIDEuNDQ5OSkgaGFkIHRoaXMgYmVoYXZpb3IuIE9sZGVyIGNvZGUgc2V0Ci0JCSAqIHdsYy0+Zm9yY2VmYXN0Y2xrIGJ1dCBvbmx5IGhhZCB0aGUgd2FrZSBoYXBwZW4gaWYgdGhlIHdha3VwX3Vjb2RlIHdvcmsKLQkJICogKHByb3RlY3RlZCBieSBhbiB1cCBjaGVjaykgd2FzIGV4ZWN1dGVkIGp1c3QgYmVsb3cuCi0JCSAqLwotCQlpZiAod2xjX2h3LT5mb3JjZWZhc3RjbGspCi0JCQltYm9vbHNldCh3bGNfaHctPndha2Vfb3ZlcnJpZGUsCi0JCQkJIEJSQ01TX1dBS0VfT1ZFUlJJREVfRk9SQ0VGQVNUKTsKLQkJZWxzZQotCQkJbWJvb2xjbHIod2xjX2h3LT53YWtlX292ZXJyaWRlLAotCQkJCSBCUkNNU19XQUtFX09WRVJSSURFX0ZPUkNFRkFTVCk7Ci0JfQotfQotCi0vKiBzZXQgaW5pdGlhbCBob3N0IGZsYWdzIHZhbHVlICovCi1zdGF0aWMgdm9pZAotYnJjbXNfY19taGZkZWYoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB1MTYgKm1oZnMsIHUxNiBtaGYyX2luaXQpCi17Ci0Jc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcgPSB3bGMtPmh3OwotCi0JbWVtc2V0KG1oZnMsIDAsIE1IRk1BWCAqIHNpemVvZih1MTYpKTsKLQotCW1oZnNbTUhGMl0gfD0gbWhmMl9pbml0OwotCi0JLyogcHJvaGliaXQgdXNlIG9mIHNsb3djbG9jayBvbiBtdWx0aWZ1bmN0aW9uIGJvYXJkcyAqLwotCWlmICh3bGNfaHctPmJvYXJkZmxhZ3MgJiBCRkxfTk9QTExET1dOKQotCQltaGZzW01IRjFdIHw9IE1IRjFfRk9SQ0VGQVNUQ0xLOwotCi0JaWYgKEJSQ01TX0lTTlBIWSh3bGNfaHctPmJhbmQpICYmIE5SRVZfTFQod2xjX2h3LT5iYW5kLT5waHlyZXYsIDIpKSB7Ci0JCW1oZnNbTUhGMl0gfD0gTUhGMl9OUEhZNDBNSFpfV0FSOwotCQltaGZzW01IRjFdIHw9IE1IRjFfSVFTV0FQX1dBUjsKLQl9Ci19Ci0KLS8qIHNldCBvciBjbGVhciB1Y29kZSBob3N0IGZsYWcgYml0cwotICogaXQgaGFzIGFuIG9wdGltaXphdGlvbiBmb3Igbm8tY2hhbmdlIHdyaXRlCi0gKiBpdCBvbmx5IHdyaXRlcyB0aHJvdWdoIHNoYXJlZCBtZW1vcnkgd2hlbiB0aGUgY29yZSBoYXMgY2xvY2s7Ci0gKiBwcmUtQ0xLIGNoYW5nZXMgc2hvdWxkIHVzZSB3bGNfd3JpdGVfbWhmIHRvIGdldCBhcm91bmQgdGhlIG9wdGltaXphdGlvbgotICoKLSAqCi0gKiBiYW5kcyB2YWx1ZXMgYXJlOiBCUkNNX0JBTkRfQVVUTyA8LS0tIEN1cnJlbnQgYmFuZCBvbmx5Ci0gKiAgICAgICAgICAgICAgICAgICBCUkNNX0JBTkRfNUcgICA8LS0tIDVHIGJhbmQgb25seQotICogICAgICAgICAgICAgICAgICAgQlJDTV9CQU5EXzJHICAgPC0tLSAyRyBiYW5kIG9ubHkKLSAqICAgICAgICAgICAgICAgICAgIEJSQ01fQkFORF9BTEwgIDwtLS0gQWxsIGJhbmRzCi0gKi8KLXZvaWQKLWJyY21zX2JfbWhmKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCB1OCBpZHgsIHUxNiBtYXNrLCB1MTYgdmFsLAotCSAgICAgaW50IGJhbmRzKQotewotCXUxNiBzYXZlOwotCXUxNiBhZGRyW01IRk1BWF0gPSB7Ci0JCU1fSE9TVF9GTEFHUzEsIE1fSE9TVF9GTEFHUzIsIE1fSE9TVF9GTEFHUzMsIE1fSE9TVF9GTEFHUzQsCi0JCU1fSE9TVF9GTEFHUzUKLQl9OwotCXN0cnVjdCBicmNtc19od19iYW5kICpiYW5kOwotCi0JaWYgKCh2YWwgJiB+bWFzaykgfHwgaWR4ID49IE1IRk1BWCkKLQkJcmV0dXJuOyAvKiBlcnJvciBjb25kaXRpb24gKi8KLQotCXN3aXRjaCAoYmFuZHMpIHsKLQkJLyogQ3VycmVudCBiYW5kIG9ubHkgb3IgYWxsIGJhbmRzLAotCQkgKiB0aGVuIHNldCB0aGUgYmFuZCB0byBjdXJyZW50IGJhbmQKLQkJICovCi0JY2FzZSBCUkNNX0JBTkRfQVVUTzoKLQljYXNlIEJSQ01fQkFORF9BTEw6Ci0JCWJhbmQgPSB3bGNfaHctPmJhbmQ7Ci0JCWJyZWFrOwotCWNhc2UgQlJDTV9CQU5EXzVHOgotCQliYW5kID0gd2xjX2h3LT5iYW5kc3RhdGVbQkFORF81R19JTkRFWF07Ci0JCWJyZWFrOwotCWNhc2UgQlJDTV9CQU5EXzJHOgotCQliYW5kID0gd2xjX2h3LT5iYW5kc3RhdGVbQkFORF8yR19JTkRFWF07Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJhbmQgPSBOVUxMOwkvKiBlcnJvciBjb25kaXRpb24gKi8KLQl9Ci0KLQlpZiAoYmFuZCkgewotCQlzYXZlID0gYmFuZC0+bWhmc1tpZHhdOwotCQliYW5kLT5taGZzW2lkeF0gPSAoYmFuZC0+bWhmc1tpZHhdICYgfm1hc2spIHwgdmFsOwotCi0JCS8qIG9wdGltaXphdGlvbjogb25seSB3cml0ZSB0aHJvdWdoIGlmIGNoYW5nZWQsIGFuZAotCQkgKiBjaGFuZ2VkIGJhbmQgaXMgdGhlIGN1cnJlbnQgYmFuZAotCQkgKi8KLQkJaWYgKHdsY19ody0+Y2xrICYmIChiYW5kLT5taGZzW2lkeF0gIT0gc2F2ZSkKLQkJICAgICYmIChiYW5kID09IHdsY19ody0+YmFuZCkpCi0JCQlicmNtc19iX3dyaXRlX3NobSh3bGNfaHcsIGFkZHJbaWR4XSwKLQkJCQkJICAgKHUxNikgYmFuZC0+bWhmc1tpZHhdKTsKLQl9Ci0KLQlpZiAoYmFuZHMgPT0gQlJDTV9CQU5EX0FMTCkgewotCQl3bGNfaHctPmJhbmRzdGF0ZVswXS0+bWhmc1tpZHhdID0KLQkJICAgICh3bGNfaHctPmJhbmRzdGF0ZVswXS0+bWhmc1tpZHhdICYgfm1hc2spIHwgdmFsOwotCQl3bGNfaHctPmJhbmRzdGF0ZVsxXS0+bWhmc1tpZHhdID0KLQkJICAgICh3bGNfaHctPmJhbmRzdGF0ZVsxXS0+bWhmc1tpZHhdICYgfm1hc2spIHwgdmFsOwotCX0KLX0KLQotdTE2IGJyY21zX2JfbWhmX2dldChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdTggaWR4LCBpbnQgYmFuZHMpCi17Ci0Jc3RydWN0IGJyY21zX2h3X2JhbmQgKmJhbmQ7Ci0KLQlpZiAoaWR4ID49IE1IRk1BWCkKLQkJcmV0dXJuIDA7IC8qIGVycm9yIGNvbmRpdGlvbiAqLwotCXN3aXRjaCAoYmFuZHMpIHsKLQljYXNlIEJSQ01fQkFORF9BVVRPOgotCQliYW5kID0gd2xjX2h3LT5iYW5kOwotCQlicmVhazsKLQljYXNlIEJSQ01fQkFORF81RzoKLQkJYmFuZCA9IHdsY19ody0+YmFuZHN0YXRlW0JBTkRfNUdfSU5ERVhdOwotCQlicmVhazsKLQljYXNlIEJSQ01fQkFORF8yRzoKLQkJYmFuZCA9IHdsY19ody0+YmFuZHN0YXRlW0JBTkRfMkdfSU5ERVhdOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQliYW5kID0gTlVMTDsJCS8qIGVycm9yIGNvbmRpdGlvbiAqLwotCX0KLQotCWlmICghYmFuZCkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gYmFuZC0+bWhmc1tpZHhdOwotfQotCi1zdGF0aWMgdm9pZCBicmNtc19jX3dyaXRlX21oZihzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdTE2ICptaGZzKQotewotCXU4IGlkeDsKLQl1MTYgYWRkcltdID0gewotCQlNX0hPU1RfRkxBR1MxLCBNX0hPU1RfRkxBR1MyLCBNX0hPU1RfRkxBR1MzLCBNX0hPU1RfRkxBR1M0LAotCQlNX0hPU1RfRkxBR1M1Ci0JfTsKLQotCWZvciAoaWR4ID0gMDsgaWR4IDwgTUhGTUFYOyBpZHgrKykgewotCQlicmNtc19iX3dyaXRlX3NobSh3bGNfaHcsIGFkZHJbaWR4XSwgbWhmc1tpZHhdKTsKLQl9Ci19Ci0KLS8qIHNldCB0aGUgbWFjY29udHJvbCByZWdpc3RlciB0byBkZXNpcmVkIHJlc2V0IHN0YXRlIGFuZAotICogaW5pdGlhbGl6ZSB0aGUgc3cgY2FjaGUgb2YgdGhlIHJlZ2lzdGVyCi0gKi8KLXN0YXRpYyB2b2lkIGJyY21zX2NfbWN0cmxfcmVzZXQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcpCi17Ci0JLyogSUhSIGFjY2Vzc2VzIGFyZSBhbHdheXMgZW5hYmxlZCwgUFNNIGRpc2FibGVkLCBIUFMgb2ZmIGFuZCBXQUtFIG9uICovCi0Jd2xjX2h3LT5tYWNjb250cm9sID0gMDsKLQl3bGNfaHctPnN1c3BlbmRlZF9maWZvcyA9IDA7Ci0Jd2xjX2h3LT53YWtlX292ZXJyaWRlID0gMDsKLQl3bGNfaHctPm11dGVfb3ZlcnJpZGUgPSAwOwotCWJyY21zX2JfbWN0cmwod2xjX2h3LCB+MCwgTUNUTF9JSFJfRU4gfCBNQ1RMX1dBS0UpOwotfQotCi0vKiBzZXQgb3IgY2xlYXIgbWFjY29udHJvbCBiaXRzICovCi12b2lkIGJyY21zX2JfbWN0cmwoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHUzMiBtYXNrLCB1MzIgdmFsKQotewotCXUzMiBtYWNjb250cm9sOwotCXUzMiBuZXdfbWFjY29udHJvbDsKLQotCWlmICh2YWwgJiB+bWFzaykKLQkJcmV0dXJuOyAvKiBlcnJvciBjb25kaXRpb24gKi8KLQltYWNjb250cm9sID0gd2xjX2h3LT5tYWNjb250cm9sOwotCW5ld19tYWNjb250cm9sID0gKG1hY2NvbnRyb2wgJiB+bWFzaykgfCB2YWw7Ci0KLQkvKiBpZiB0aGUgbmV3IG1hY2NvbnRyb2wgdmFsdWUgaXMgdGhlIHNhbWUgYXMgdGhlIG9sZCwgbm90aGluZyB0byBkbyAqLwotCWlmIChuZXdfbWFjY29udHJvbCA9PSBtYWNjb250cm9sKQotCQlyZXR1cm47Ci0KLQkvKiBzb21ldGhpbmcgY2hhbmdlZCwgY2FjaGUgdGhlIG5ldyB2YWx1ZSAqLwotCXdsY19ody0+bWFjY29udHJvbCA9IG5ld19tYWNjb250cm9sOwotCi0JLyogd3JpdGUgdGhlIG5ldyB2YWx1ZXMgd2l0aCBvdmVycmlkZXMgYXBwbGllZCAqLwotCWJyY21zX2NfbWN0cmxfd3JpdGUod2xjX2h3KTsKLX0KLQotLyogd3JpdGUgdGhlIHNvZnR3YXJlIHN0YXRlIG9mIG1hY2NvbnRyb2wgYW5kIG92ZXJyaWRlcyB0byB0aGUgbWFjY29udHJvbCByZWdpc3RlciAqLwotc3RhdGljIHZvaWQgYnJjbXNfY19tY3RybF93cml0ZShzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odykKLXsKLQl1MzIgbWFjY29udHJvbCA9IHdsY19ody0+bWFjY29udHJvbDsKLQotCS8qIE9SIGluIHRoZSB3YWtlIGJpdCBpZiBvdmVycmlkZGVuICovCi0JaWYgKHdsY19ody0+d2FrZV9vdmVycmlkZSkKLQkJbWFjY29udHJvbCB8PSBNQ1RMX1dBS0U7Ci0KLQkvKiBzZXQgQVAgYW5kIElORlJBIGJpdHMgZm9yIG11dGUgaWYgbmVlZGVkICovCi0JaWYgKHdsY19ody0+bXV0ZV9vdmVycmlkZSkgewotCQltYWNjb250cm9sICY9IH4oTUNUTF9BUCk7Ci0JCW1hY2NvbnRyb2wgfD0gTUNUTF9JTkZSQTsKLQl9Ci0KLQlXX1JFRygmd2xjX2h3LT5yZWdzLT5tYWNjb250cm9sLCBtYWNjb250cm9sKTsKLX0KLQotdm9pZCBicmNtc19jX3Vjb2RlX3dha2Vfb3ZlcnJpZGVfc2V0KHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LAotCQkJCSB1MzIgb3ZlcnJpZGVfYml0KQotewotCWlmICh3bGNfaHctPndha2Vfb3ZlcnJpZGUgfHwgKHdsY19ody0+bWFjY29udHJvbCAmIE1DVExfV0FLRSkpIHsKLQkJbWJvb2xzZXQod2xjX2h3LT53YWtlX292ZXJyaWRlLCBvdmVycmlkZV9iaXQpOwotCQlyZXR1cm47Ci0JfQotCi0JbWJvb2xzZXQod2xjX2h3LT53YWtlX292ZXJyaWRlLCBvdmVycmlkZV9iaXQpOwotCi0JYnJjbXNfY19tY3RybF93cml0ZSh3bGNfaHcpOwotCWJyY21zX2Jfd2FpdF9mb3Jfd2FrZSh3bGNfaHcpOwotCi0JcmV0dXJuOwotfQotCi12b2lkIGJyY21zX2NfdWNvZGVfd2FrZV9vdmVycmlkZV9jbGVhcihzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywKLQkJCQkgICB1MzIgb3ZlcnJpZGVfYml0KQotewotCW1ib29sY2xyKHdsY19ody0+d2FrZV9vdmVycmlkZSwgb3ZlcnJpZGVfYml0KTsKLQotCWlmICh3bGNfaHctPndha2Vfb3ZlcnJpZGUgfHwgKHdsY19ody0+bWFjY29udHJvbCAmIE1DVExfV0FLRSkpCi0JCXJldHVybjsKLQotCWJyY21zX2NfbWN0cmxfd3JpdGUod2xjX2h3KTsKLQotCXJldHVybjsKLX0KLQotLyogV2hlbiBkcml2ZXIgbmVlZHMgdWNvZGUgdG8gc3RvcCBiZWFjb25pbmcsIGl0IGhhcyB0byBtYWtlIHN1cmUgdGhhdAotICogTUNUTF9BUCBpcyBjbGVhciBhbmQgTUNUTF9JTkZSQSBpcyBzZXQKLSAqIE1vZGUgICAgICAgICAgIE1DVExfQVAgICAgICAgIE1DVExfSU5GUkEKLSAqIEFQICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgIDEKLSAqIFNUQSAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgIDEgPC0tLSBUaGlzIHdpbGwgZW5zdXJlIG5vIGJlYWNvbnMKLSAqIElCU1MgICAgICAgICAgICAgIDAgICAgICAgICAgICAgIDAKLSAqLwotc3RhdGljIHZvaWQgYnJjbXNfY191Y29kZV9tdXRlX292ZXJyaWRlX3NldChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odykKLXsKLQl3bGNfaHctPm11dGVfb3ZlcnJpZGUgPSAxOwotCi0JLyogaWYgbWFjY29udHJvbCBhbHJlYWR5IGhhcyBBUCA9PSAwIGFuZCBJTkZSQSA9PSAxIHdpdGhvdXQgdGhpcwotCSAqIG92ZXJyaWRlLCB0aGVuIHRoZXJlIGlzIG5vIGNoYW5nZSB0byB3cml0ZQotCSAqLwotCWlmICgod2xjX2h3LT5tYWNjb250cm9sICYgKE1DVExfQVAgfCBNQ1RMX0lORlJBKSkgPT0gTUNUTF9JTkZSQSkKLQkJcmV0dXJuOwotCi0JYnJjbXNfY19tY3RybF93cml0ZSh3bGNfaHcpOwotCi0JcmV0dXJuOwotfQotCi0vKiBDbGVhciB0aGUgb3ZlcnJpZGUgb24gQVAgYW5kIElORlJBIGJpdHMgKi8KLXN0YXRpYyB2b2lkIGJyY21zX2NfdWNvZGVfbXV0ZV9vdmVycmlkZV9jbGVhcihzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odykKLXsKLQlpZiAod2xjX2h3LT5tdXRlX292ZXJyaWRlID09IDApCi0JCXJldHVybjsKLQotCXdsY19ody0+bXV0ZV9vdmVycmlkZSA9IDA7Ci0KLQkvKiBpZiBtYWNjb250cm9sIGFscmVhZHkgaGFzIEFQID09IDAgYW5kIElORlJBID09IDEgd2l0aG91dCB0aGlzCi0JICogb3ZlcnJpZGUsIHRoZW4gdGhlcmUgaXMgbm8gY2hhbmdlIHRvIHdyaXRlCi0JICovCi0JaWYgKCh3bGNfaHctPm1hY2NvbnRyb2wgJiAoTUNUTF9BUCB8IE1DVExfSU5GUkEpKSA9PSBNQ1RMX0lORlJBKQotCQlyZXR1cm47Ci0KLQlicmNtc19jX21jdHJsX3dyaXRlKHdsY19odyk7Ci19Ci0KLS8qCi0gKiBXcml0ZSBhIE1BQyBhZGRyZXNzIHRvIHRoZSBnaXZlbiBtYXRjaCByZWcgb2Zmc2V0IGluIHRoZSBSWEUgbWF0Y2ggZW5naW5lLgotICovCi12b2lkCi1icmNtc19iX3NldF9hZGRybWF0Y2goc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIGludCBtYXRjaF9yZWdfb2Zmc2V0LAotCQkgICAgICAgY29uc3QgdTggKmFkZHIpCi17Ci0JZDExcmVnc190ICpyZWdzOwotCXUxNiBtYWNfbDsKLQl1MTYgbWFjX207Ci0JdTE2IG1hY19oOwotCi0JQkNNTVNHKHdsY19ody0+d2xjLT53aXBoeSwgIndsJWQ6IGJyY21zX2Jfc2V0X2FkZHJtYXRjaFxuIiwKLQkJIHdsY19ody0+dW5pdCk7Ci0KLQlyZWdzID0gd2xjX2h3LT5yZWdzOwotCW1hY19sID0gYWRkclswXSB8IChhZGRyWzFdIDw8IDgpOwotCW1hY19tID0gYWRkclsyXSB8IChhZGRyWzNdIDw8IDgpOwotCW1hY19oID0gYWRkcls0XSB8IChhZGRyWzVdIDw8IDgpOwotCi0JLyogZW50ZXIgdGhlIE1BQyBhZGRyIGludG8gdGhlIFJYRSBtYXRjaCByZWdpc3RlcnMgKi8KLQlXX1JFRygmcmVncy0+cmNtX2N0bCwgUkNNX0lOQ19EQVRBIHwgbWF0Y2hfcmVnX29mZnNldCk7Ci0JV19SRUcoJnJlZ3MtPnJjbV9tYXRfZGF0YSwgbWFjX2wpOwotCVdfUkVHKCZyZWdzLT5yY21fbWF0X2RhdGEsIG1hY19tKTsKLQlXX1JFRygmcmVncy0+cmNtX21hdF9kYXRhLCBtYWNfaCk7Ci0KLX0KLQotdm9pZAotYnJjbXNfYl93cml0ZV90ZW1wbGF0ZV9yYW0oc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIGludCBvZmZzZXQsIGludCBsZW4sCi0JCQkgICAgdm9pZCAqYnVmKQotewotCWQxMXJlZ3NfdCAqcmVnczsKLQl1MzIgd29yZDsKLQlib29sIGJlX2JpdDsKLQlCQ01NU0cod2xjX2h3LT53bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjX2h3LT51bml0KTsKLQotCXJlZ3MgPSB3bGNfaHctPnJlZ3M7Ci0JV19SRUcoJnJlZ3MtPnRwbGF0ZXdycHRyLCBvZmZzZXQpOwotCi0JLyogaWYgTUNUTF9CSUdFTkQgYml0IHNldCBpbiBtYWMgY29udHJvbCByZWdpc3RlciwKLQkgKiB0aGUgY2hpcCBzd2FwcyBkYXRhIGluIGZpZm8sIGFzIHdlbGwgYXMgZGF0YSBpbgotCSAqIHRlbXBsYXRlIHJhbQotCSAqLwotCWJlX2JpdCA9IChSX1JFRygmcmVncy0+bWFjY29udHJvbCkgJiBNQ1RMX0JJR0VORCkgIT0gMDsKLQotCXdoaWxlIChsZW4gPiAwKSB7Ci0JCW1lbWNweSgmd29yZCwgYnVmLCBzaXplb2YodTMyKSk7Ci0KLQkJaWYgKGJlX2JpdCkKLQkJCXdvcmQgPSBjcHVfdG9fYmUzMih3b3JkKTsKLQkJZWxzZQotCQkJd29yZCA9IGNwdV90b19sZTMyKHdvcmQpOwotCi0JCVdfUkVHKCZyZWdzLT50cGxhdGV3cmRhdGEsIHdvcmQpOwotCi0JCWJ1ZiA9ICh1OCAqKSBidWYgKyBzaXplb2YodTMyKTsKLQkJbGVuIC09IHNpemVvZih1MzIpOwotCX0KLX0KLQotdm9pZCBicmNtc19iX3NldF9jd21pbihzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdTE2IG5ld21pbikKLXsKLQl3bGNfaHctPmJhbmQtPkNXbWluID0gbmV3bWluOwotCi0JV19SRUcoJndsY19ody0+cmVncy0+b2JqYWRkciwgT0JKQUREUl9TQ1JfU0VMIHwgU19ET1QxMV9DV01JTik7Ci0JKHZvaWQpUl9SRUcoJndsY19ody0+cmVncy0+b2JqYWRkcik7Ci0JV19SRUcoJndsY19ody0+cmVncy0+b2JqZGF0YSwgbmV3bWluKTsKLX0KLQotdm9pZCBicmNtc19iX3NldF9jd21heChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdTE2IG5ld21heCkKLXsKLQl3bGNfaHctPmJhbmQtPkNXbWF4ID0gbmV3bWF4OwotCi0JV19SRUcoJndsY19ody0+cmVncy0+b2JqYWRkciwgT0JKQUREUl9TQ1JfU0VMIHwgU19ET1QxMV9DV01BWCk7Ci0JKHZvaWQpUl9SRUcoJndsY19ody0+cmVncy0+b2JqYWRkcik7Ci0JV19SRUcoJndsY19ody0+cmVncy0+b2JqZGF0YSwgbmV3bWF4KTsKLX0KLQotdm9pZCBicmNtc19iX2J3X3NldChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdTE2IGJ3KQotewotCWJvb2wgZmFzdGNsazsKLQotCS8qIHJlcXVlc3QgRkFTVCBjbG9jayBpZiBub3Qgb24gKi8KLQlmYXN0Y2xrID0gd2xjX2h3LT5mb3JjZWZhc3RjbGs7Ci0JaWYgKCFmYXN0Y2xrKQotCQlicmNtc19iX2Nsa2N0bF9jbGsod2xjX2h3LCBDTEtfRkFTVCk7Ci0KLQl3bGNfcGh5X2J3X3N0YXRlX3NldCh3bGNfaHctPmJhbmQtPnBpLCBidyk7Ci0KLQlicmNtc19iX3BoeV9yZXNldCh3bGNfaHcpOwotCXdsY19waHlfaW5pdCh3bGNfaHctPmJhbmQtPnBpLCB3bGNfcGh5X2NoYW5zcGVjX2dldCh3bGNfaHctPmJhbmQtPnBpKSk7Ci0KLQkvKiByZXN0b3JlIHRoZSBjbGsgKi8KLQlpZiAoIWZhc3RjbGspCi0JCWJyY21zX2JfY2xrY3RsX2Nsayh3bGNfaHcsIENMS19EWU5BTUlDKTsKLX0KLQotc3RhdGljIHZvaWQKLWJyY21zX2Nfd3JpdGVfaHdfYmNudGVtcGxhdGUwKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCB2b2lkICpiY24sCi0JCQkgICAgICBpbnQgbGVuKQotewotCWQxMXJlZ3NfdCAqcmVncyA9IHdsY19ody0+cmVnczsKLQotCWJyY21zX2Jfd3JpdGVfdGVtcGxhdGVfcmFtKHdsY19odywgVF9CQ04wX1RQTF9CQVNFLCAobGVuICsgMykgJiB+MywKLQkJCQkgICAgYmNuKTsKLQkvKiB3cml0ZSBiZWFjb24gbGVuZ3RoIHRvIFNDUiAqLwotCWJyY21zX2Jfd3JpdGVfc2htKHdsY19odywgTV9CQ04wX0ZSTV9CWVRFU1osICh1MTYpIGxlbik7Ci0JLyogbWFyayBiZWFjb24wIHZhbGlkICovCi0JT1JfUkVHKCZyZWdzLT5tYWNjb21tYW5kLCBNQ01EX0JDTjBWTEQpOwotfQotCi1zdGF0aWMgdm9pZAotYnJjbXNfY193cml0ZV9od19iY250ZW1wbGF0ZTEoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHZvaWQgKmJjbiwKLQkJCSAgICAgIGludCBsZW4pCi17Ci0JZDExcmVnc190ICpyZWdzID0gd2xjX2h3LT5yZWdzOwotCi0JYnJjbXNfYl93cml0ZV90ZW1wbGF0ZV9yYW0od2xjX2h3LCBUX0JDTjFfVFBMX0JBU0UsIChsZW4gKyAzKSAmIH4zLAotCQkJCSAgICBiY24pOwotCS8qIHdyaXRlIGJlYWNvbiBsZW5ndGggdG8gU0NSICovCi0JYnJjbXNfYl93cml0ZV9zaG0od2xjX2h3LCBNX0JDTjFfRlJNX0JZVEVTWiwgKHUxNikgbGVuKTsKLQkvKiBtYXJrIGJlYWNvbjEgdmFsaWQgKi8KLQlPUl9SRUcoJnJlZ3MtPm1hY2NvbW1hbmQsIE1DTURfQkNOMVZMRCk7Ci19Ci0KLS8qIG1hYyBpcyBhc3N1bWVkIHRvIGJlIHN1c3BlbmRlZCBhdCB0aGlzIHBvaW50ICovCi12b2lkCi1icmNtc19iX3dyaXRlX2h3X2JjbnRlbXBsYXRlcyhzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdm9pZCAqYmNuLAotCQkJICAgICAgaW50IGxlbiwgYm9vbCBib3RoKQotewotCWQxMXJlZ3NfdCAqcmVncyA9IHdsY19ody0+cmVnczsKLQotCWlmIChib3RoKSB7Ci0JCWJyY21zX2Nfd3JpdGVfaHdfYmNudGVtcGxhdGUwKHdsY19odywgYmNuLCBsZW4pOwotCQlicmNtc19jX3dyaXRlX2h3X2JjbnRlbXBsYXRlMSh3bGNfaHcsIGJjbiwgbGVuKTsKLQl9IGVsc2UgewotCQkvKiBiY24gMCAqLwotCQlpZiAoIShSX1JFRygmcmVncy0+bWFjY29tbWFuZCkgJiBNQ01EX0JDTjBWTEQpKQotCQkJYnJjbXNfY193cml0ZV9od19iY250ZW1wbGF0ZTAod2xjX2h3LCBiY24sIGxlbik7Ci0JCS8qIGJjbiAxICovCi0JCWVsc2UgaWYgKCEKLQkJCSAoUl9SRUcoJnJlZ3MtPm1hY2NvbW1hbmQpICYgTUNNRF9CQ04xVkxEKSkKLQkJCWJyY21zX2Nfd3JpdGVfaHdfYmNudGVtcGxhdGUxKHdsY19odywgYmNuLCBsZW4pOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYnJjbXNfYl91cGRfc3ludGhwdShzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odykKLXsKLQl1MTYgdjsKLQlzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMgPSB3bGNfaHctPndsYzsKLQkvKiB1cGRhdGUgU1lOVEhQVV9ETFkgKi8KLQotCWlmIChCUkNNU19JU0xDTlBIWSh3bGMtPmJhbmQpKSB7Ci0JCXYgPSBTWU5USFBVX0RMWV9MUFBIWV9VUzsKLQl9IGVsc2UgaWYgKEJSQ01TX0lTTlBIWSh3bGMtPmJhbmQpICYmIChOUkVWX0dFKHdsYy0+YmFuZC0+cGh5cmV2LCAzKSkpIHsKLQkJdiA9IFNZTlRIUFVfRExZX05QSFlfVVM7Ci0JfSBlbHNlIHsKLQkJdiA9IFNZTlRIUFVfRExZX0JQSFlfVVM7Ci0JfQotCi0JYnJjbXNfYl93cml0ZV9zaG0od2xjX2h3LCBNX1NZTlRIUFVfRExZLCB2KTsKLX0KLQotLyogYmFuZC1zcGVjaWZpYyBpbml0ICovCi1zdGF0aWMgdm9pZAotYnJjbXNfYl9ic2luaXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBjaGFuc3BlY190IGNoYW5zcGVjKQotewotCXN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3ID0gd2xjLT5odzsKLQotCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZDogYmFuZHVuaXQgJWRcbiIsIHdsY19ody0+dW5pdCwKLQkJd2xjX2h3LT5iYW5kLT5iYW5kdW5pdCk7Ci0KLQlicmNtc19jX3Vjb2RlX2JzaW5pdCh3bGNfaHcpOwotCi0Jd2xjX3BoeV9pbml0KHdsY19ody0+YmFuZC0+cGksIGNoYW5zcGVjKTsKLQotCWJyY21zX2NfdWNvZGVfdHhhbnRfc2V0KHdsY19odyk7Ci0KLQkvKiBjd21pbiBpcyBiYW5kLXNwZWNpZmljLCB1cGRhdGUgaGFyZHdhcmUgd2l0aCB2YWx1ZSBmb3IgY3VycmVudCBiYW5kICovCi0JYnJjbXNfYl9zZXRfY3dtaW4od2xjX2h3LCB3bGNfaHctPmJhbmQtPkNXbWluKTsKLQlicmNtc19iX3NldF9jd21heCh3bGNfaHcsIHdsY19ody0+YmFuZC0+Q1dtYXgpOwotCi0JYnJjbXNfYl91cGRhdGVfc2xvdF90aW1pbmcod2xjX2h3LAotCQkJCSAgICBCQU5EXzVHKHdsY19ody0+YmFuZC0+Ci0JCQkJCSAgICBiYW5kdHlwZSkgPyB0cnVlIDogd2xjX2h3LT4KLQkJCQkgICAgc2hvcnRzbG90KTsKLQotCS8qIHdyaXRlIHBoeXR5cGUgYW5kIHBoeXZlcnMgKi8KLQlicmNtc19iX3dyaXRlX3NobSh3bGNfaHcsIE1fUEhZVFlQRSwgKHUxNikgd2xjX2h3LT5iYW5kLT5waHl0eXBlKTsKLQlicmNtc19iX3dyaXRlX3NobSh3bGNfaHcsIE1fUEhZVkVSLCAodTE2KSB3bGNfaHctPmJhbmQtPnBoeXJldik7Ci0KLQkvKiBpbml0aWFsaXplIHRoZSB0eHBoeWN0bDEgcmF0ZSB0YWJsZSBzaW5jZSBzaG1lbSBpcyBzaGFyZWQgYmV0d2VlbiBiYW5kcyAqLwotCWJyY21zX3VwZF9vZmRtX3BjdGwxX3RhYmxlKHdsY19odyk7Ci0KLQlicmNtc19iX3VwZF9zeW50aHB1KHdsY19odyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21zX2JfY29yZV9waHlfY2xrKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCBib29sIGNsaykKLXsKLQlCQ01NU0cod2xjX2h3LT53bGMtPndpcGh5LCAid2wlZDogY2xrICVkXG4iLCB3bGNfaHctPnVuaXQsIGNsayk7Ci0KLQl3bGNfaHctPnBoeWNsayA9IGNsazsKLQotCWlmIChPRkYgPT0gY2xrKSB7CS8qIGNsZWFyIGdtb2RlIGJpdCwgcHV0IHBoeSBpbnRvIHJlc2V0ICovCi0KLQkJYWlfY29yZV9jZmxhZ3Mod2xjX2h3LT5zaWgsIChTSUNGX1BSU1QgfCBTSUNGX0ZHQyB8IFNJQ0ZfR01PREUpLAotCQkJICAgICAgIChTSUNGX1BSU1QgfCBTSUNGX0ZHQykpOwotCQl1ZGVsYXkoMSk7Ci0JCWFpX2NvcmVfY2ZsYWdzKHdsY19ody0+c2loLCAoU0lDRl9QUlNUIHwgU0lDRl9GR0MpLCBTSUNGX1BSU1QpOwotCQl1ZGVsYXkoMSk7Ci0KLQl9IGVsc2UgewkJLyogdGFrZSBwaHkgb3V0IG9mIHJlc2V0ICovCi0KLQkJYWlfY29yZV9jZmxhZ3Mod2xjX2h3LT5zaWgsIChTSUNGX1BSU1QgfCBTSUNGX0ZHQyksIFNJQ0ZfRkdDKTsKLQkJdWRlbGF5KDEpOwotCQlhaV9jb3JlX2NmbGFncyh3bGNfaHctPnNpaCwgKFNJQ0ZfRkdDKSwgMCk7Ci0JCXVkZWxheSgxKTsKLQotCX0KLX0KLQotLyogUGVyZm9ybSBhIHNvZnQgcmVzZXQgb2YgdGhlIFBIWSBQTEwgKi8KLXZvaWQgYnJjbXNfYl9jb3JlX3BoeXBsbF9yZXNldChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odykKLXsKLQlCQ01NU0cod2xjX2h3LT53bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjX2h3LT51bml0KTsKLQotCWFpX2NvcmVyZWcod2xjX2h3LT5zaWgsIFNJX0NDX0lEWCwKLQkJICAgb2Zmc2V0b2YoY2hpcGNyZWdzX3QsIGNoaXBjb250cm9sX2FkZHIpLCB+MCwgMCk7Ci0JdWRlbGF5KDEpOwotCWFpX2NvcmVyZWcod2xjX2h3LT5zaWgsIFNJX0NDX0lEWCwKLQkJICAgb2Zmc2V0b2YoY2hpcGNyZWdzX3QsIGNoaXBjb250cm9sX2RhdGEpLCAweDQsIDApOwotCXVkZWxheSgxKTsKLQlhaV9jb3JlcmVnKHdsY19ody0+c2loLCBTSV9DQ19JRFgsCi0JCSAgIG9mZnNldG9mKGNoaXBjcmVnc190LCBjaGlwY29udHJvbF9kYXRhKSwgMHg0LCA0KTsKLQl1ZGVsYXkoMSk7Ci0JYWlfY29yZXJlZyh3bGNfaHctPnNpaCwgU0lfQ0NfSURYLAotCQkgICBvZmZzZXRvZihjaGlwY3JlZ3NfdCwgY2hpcGNvbnRyb2xfZGF0YSksIDB4NCwgMCk7Ci0JdWRlbGF5KDEpOwotfQotCi0vKiBsaWdodCB3YXkgdG8gdHVybiBvbiBwaHkgY2xvY2sgd2l0aG91dCByZXNldCBmb3IgTlBIWSBvbmx5Ci0gKiAgcmVmZXIgdG8gYnJjbXNfYl9jb3JlX3BoeV9jbGsgZm9yIGZ1bGwgdmVyc2lvbgotICovCi12b2lkIGJyY21zX2JfcGh5Y2xrX2ZnYyhzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgYm9vbCBjbGspCi17Ci0JLyogc3VwcG9ydChuZWNlc3NhcnkgZm9yIE5QSFkgYW5kIEhZUEhZKSBvbmx5ICovCi0JaWYgKCFCUkNNU19JU05QSFkod2xjX2h3LT5iYW5kKSkKLQkJcmV0dXJuOwotCi0JaWYgKE9OID09IGNsaykKLQkJYWlfY29yZV9jZmxhZ3Mod2xjX2h3LT5zaWgsIFNJQ0ZfRkdDLCBTSUNGX0ZHQyk7Ci0JZWxzZQotCQlhaV9jb3JlX2NmbGFncyh3bGNfaHctPnNpaCwgU0lDRl9GR0MsIDApOwotCi19Ci0KLXZvaWQgYnJjbXNfYl9tYWNwaHljbGtfc2V0KHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCBib29sIGNsaykKLXsKLQlpZiAoT04gPT0gY2xrKQotCQlhaV9jb3JlX2NmbGFncyh3bGNfaHctPnNpaCwgU0lDRl9NUENMS0UsIFNJQ0ZfTVBDTEtFKTsKLQllbHNlCi0JCWFpX2NvcmVfY2ZsYWdzKHdsY19ody0+c2loLCBTSUNGX01QQ0xLRSwgMCk7Ci19Ci0KLXZvaWQgYnJjbXNfYl9waHlfcmVzZXQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcpCi17Ci0Jc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCA9IHdsY19ody0+YmFuZC0+cGk7Ci0JdTMyIHBoeV9id19jbGtiaXRzOwotCWJvb2wgcGh5X2luX3Jlc2V0ID0gZmFsc2U7Ci0KLQlCQ01NU0cod2xjX2h3LT53bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjX2h3LT51bml0KTsKLQotCWlmIChwaWggPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JcGh5X2J3X2Nsa2JpdHMgPSB3bGNfcGh5X2Nsa19id2JpdHMod2xjX2h3LT5iYW5kLT5waSk7Ci0KLQkvKiBTcGVjaWZpYyByZXNldCBzZXF1ZW5jZSByZXF1aXJlZCBmb3IgTlBIWSByZXYgMyBhbmQgNCAqLwotCWlmIChCUkNNU19JU05QSFkod2xjX2h3LT5iYW5kKSAmJiBOUkVWX0dFKHdsY19ody0+YmFuZC0+cGh5cmV2LCAzKSAmJgotCSAgICBOUkVWX0xFKHdsY19ody0+YmFuZC0+cGh5cmV2LCA0KSkgewotCQkvKiBTZXQgdGhlIFBIWSBiYW5kd2lkdGggKi8KLQkJYWlfY29yZV9jZmxhZ3Mod2xjX2h3LT5zaWgsIFNJQ0ZfQldNQVNLLCBwaHlfYndfY2xrYml0cyk7Ci0KLQkJdWRlbGF5KDEpOwotCi0JCS8qIFBlcmZvcm0gYSBzb2Z0IHJlc2V0IG9mIHRoZSBQSFkgUExMICovCi0JCWJyY21zX2JfY29yZV9waHlwbGxfcmVzZXQod2xjX2h3KTsKLQotCQkvKiByZXNldCB0aGUgUEhZICovCi0JCWFpX2NvcmVfY2ZsYWdzKHdsY19ody0+c2loLCAoU0lDRl9QUlNUIHwgU0lDRl9QQ0xLRSksCi0JCQkgICAgICAgKFNJQ0ZfUFJTVCB8IFNJQ0ZfUENMS0UpKTsKLQkJcGh5X2luX3Jlc2V0ID0gdHJ1ZTsKLQl9IGVsc2UgewotCi0JCWFpX2NvcmVfY2ZsYWdzKHdsY19ody0+c2loLAotCQkJICAgICAgIChTSUNGX1BSU1QgfCBTSUNGX1BDTEtFIHwgU0lDRl9CV01BU0spLAotCQkJICAgICAgIChTSUNGX1BSU1QgfCBTSUNGX1BDTEtFIHwgcGh5X2J3X2Nsa2JpdHMpKTsKLQl9Ci0KLQl1ZGVsYXkoMik7Ci0JYnJjbXNfYl9jb3JlX3BoeV9jbGsod2xjX2h3LCBPTik7Ci0KLQlpZiAocGloKQotCQl3bGNfcGh5X2FuYWNvcmUocGloLCBPTik7Ci19Ci0KLS8qIHN3aXRjaCB0byBhbmQgaW5pdGlhbGl6ZSBuZXcgYmFuZCAqLwotc3RhdGljIHZvaWQKLWJyY21zX2Jfc2V0YmFuZChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdWludCBiYW5kdW5pdCwKLQkJCQljaGFuc3BlY190IGNoYW5zcGVjKSB7Ci0Jc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjID0gd2xjX2h3LT53bGM7Ci0JdTMyIG1hY2ludG1hc2s7Ci0KLQkvKiBFbmFibGUgdGhlIGQxMSBjb3JlIGJlZm9yZSBhY2Nlc3NpbmcgaXQgKi8KLQlpZiAoIWFpX2lzY29yZXVwKHdsY19ody0+c2loKSkgewotCQlhaV9jb3JlX3Jlc2V0KHdsY19ody0+c2loLCAwLCAwKTsKLQkJYnJjbXNfY19tY3RybF9yZXNldCh3bGNfaHcpOwotCX0KLQotCW1hY2ludG1hc2sgPSBicmNtc19jX3NldGJhbmRfaW5hY3Qod2xjLCBiYW5kdW5pdCk7Ci0KLQlpZiAoIXdsY19ody0+dXApCi0JCXJldHVybjsKLQotCWJyY21zX2JfY29yZV9waHlfY2xrKHdsY19odywgT04pOwotCi0JLyogYmFuZC1zcGVjaWZpYyBpbml0aWFsaXphdGlvbnMgKi8KLQlicmNtc19iX2JzaW5pdCh3bGMsIGNoYW5zcGVjKTsKLQotCS8qCi0JICogSWYgdGhlcmUgYXJlIGFueSBwZW5kaW5nIHNvZnR3YXJlIGludGVycnVwdCBiaXRzLAotCSAqIHRoZW4gcmVwbGFjZSB0aGVzZSB3aXRoIGEgaGFybWxlc3Mgbm9uemVybyB2YWx1ZQotCSAqIHNvIGJyY21zX2NfZHBjKCkgd2lsbCByZS1lbmFibGUgaW50ZXJydXB0cyB3aGVuIGRvbmUuCi0JICovCi0JaWYgKHdsYy0+bWFjaW50c3RhdHVzKQotCQl3bGMtPm1hY2ludHN0YXR1cyA9IE1JX0RNQUlOVDsKLQotCS8qIHJlc3RvcmUgbWFjaW50bWFzayAqLwotCWJyY21zX2ludHJzcmVzdG9yZSh3bGMtPndsLCBtYWNpbnRtYXNrKTsKLQotCS8qIHVjb2RlIHNob3VsZCBzdGlsbCBiZSBzdXNwZW5kZWQuLiAqLwotCVdBUk5fT04oKFJfUkVHKCZ3bGNfaHctPnJlZ3MtPm1hY2NvbnRyb2wpICYgTUNUTF9FTl9NQUMpICE9IDApOwotfQotCi0vKiBsb3ctbGV2ZWwgYmFuZCBzd2l0Y2ggdXRpbGl0eSByb3V0aW5lICovCi12b2lkIGJyY21zX2Nfc2V0eGJhbmQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsCi0JCQkJICAgICB1aW50IGJhbmR1bml0KQotewotCUJDTU1TRyh3bGNfaHctPndsYy0+d2lwaHksICJ3bCVkOiBiYW5kdW5pdCAlZFxuIiwgd2xjX2h3LT51bml0LAotCQliYW5kdW5pdCk7Ci0KLQl3bGNfaHctPmJhbmQgPSB3bGNfaHctPmJhbmRzdGF0ZVtiYW5kdW5pdF07Ci0KLQkvKiBCTUFDX05PVEU6IHVudGlsIHdlIGVsaW1pbmF0ZSBuZWVkIGZvciB3bGMtPmJhbmQgcmVmcyBpbiBsb3cgbGV2ZWwgY29kZSAqLwotCXdsY19ody0+d2xjLT5iYW5kID0gd2xjX2h3LT53bGMtPmJhbmRzdGF0ZVtiYW5kdW5pdF07Ci0KLQkvKiBzZXQgZ21vZGUgY29yZSBmbGFnICovCi0JaWYgKHdsY19ody0+c2JjbGsgJiYgIXdsY19ody0+bm9yZXNldCkgewotCQlhaV9jb3JlX2NmbGFncyh3bGNfaHctPnNpaCwgU0lDRl9HTU9ERSwKLQkJCSAgICAgICAoKGJhbmR1bml0ID09IDApID8gU0lDRl9HTU9ERSA6IDApKTsKLQl9Ci19Ci0KLXN0YXRpYyBib29sIGJyY21zX2NfaXNnb29kY2hpcChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odykKLXsKLQotCS8qIHJlamVjdCB1bnN1cHBvcnRlZCBjb3JlcmV2ICovCi0JaWYgKCFWQUxJRF9DT1JFUkVWKHdsY19ody0+Y29yZXJldikpIHsKLQkJd2lwaHlfZXJyKHdsY19ody0+d2xjLT53aXBoeSwgInVuc3VwcG9ydGVkIGNvcmUgcmV2ICVkXG4iLAotCQkJICB3bGNfaHctPmNvcmVyZXYpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFZhbGlkYXRlIHNvbWUgYm9hcmQgaW5mbyBwYXJhbWV0ZXJzICovCi1zdGF0aWMgYm9vbCBicmNtc19jX3ZhbGlkYm9hcmR0eXBlKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KQotewotCXVpbnQgYm9hcmRyZXYgPSB3bGNfaHctPmJvYXJkcmV2OwotCi0JLyogNCBiaXRzIGVhY2ggZm9yIGJvYXJkIHR5cGUsIG1ham9yLCBtaW5vciwgYW5kIHRpbnkgdmVyc2lvbiAqLwotCXVpbnQgYnJ0ID0gKGJvYXJkcmV2ICYgMHhmMDAwKSA+PiAxMjsKLQl1aW50IGIwID0gKGJvYXJkcmV2ICYgMHhmMDApID4+IDg7Ci0JdWludCBiMSA9IChib2FyZHJldiAmIDB4ZjApID4+IDQ7Ci0JdWludCBiMiA9IGJvYXJkcmV2ICYgMHhmOwotCi0JLyogdm9hcmRzIGZyb20gb3RoZXIgdmVuZG9ycyBhcmUgYWx3YXlzIGNvbnNpZGVyZWQgdmFsaWQgKi8KLQlpZiAod2xjX2h3LT5zaWgtPmJvYXJkdmVuZG9yICE9IFBDSV9WRU5ET1JfSURfQlJPQURDT00pCi0JCXJldHVybiB0cnVlOwotCi0JLyogZG8gc29tZSBib2FyZHJldiBzYW5pdHkgY2hlY2tzIHdoZW4gYm9hcmR2ZW5kb3IgaXMgQnJvYWRjb20gKi8KLQlpZiAoYm9hcmRyZXYgPT0gMCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaWYgKGJvYXJkcmV2IDw9IDB4ZmYpCi0JCXJldHVybiB0cnVlOwotCi0JaWYgKChicnQgPiAyKSB8fCAoYnJ0ID09IDApIHx8IChiMCA+IDkpIHx8IChiMCA9PSAwKSB8fCAoYjEgPiA5KQotCQl8fCAoYjIgPiA5KSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBjaGFyICpicmNtc19jX2dldF9tYWNhZGRyKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KQotewotCWNvbnN0IGNoYXIgKnZhcm5hbWUgPSAibWFjYWRkciI7Ci0JY2hhciAqbWFjYWRkcjsKLQotCS8qIElmIG1hY2FkZHIgZXhpc3RzLCB1c2UgaXQgKFNyb21yZXY0LCBDSVMsIC4uLikuICovCi0JbWFjYWRkciA9IGdldHZhcih3bGNfaHctPnZhcnMsIHZhcm5hbWUpOwotCWlmIChtYWNhZGRyICE9IE5VTEwpCi0JCXJldHVybiBtYWNhZGRyOwotCi0JaWYgKE5CQU5EU19IVyh3bGNfaHcpID4gMSkKLQkJdmFybmFtZSA9ICJldDFtYWNhZGRyIjsKLQllbHNlCi0JCXZhcm5hbWUgPSAiaWwwbWFjYWRkciI7Ci0KLQltYWNhZGRyID0gZ2V0dmFyKHdsY19ody0+dmFycywgdmFybmFtZSk7Ci0JaWYgKG1hY2FkZHIgPT0gTlVMTCkgewotCQl3aXBoeV9lcnIod2xjX2h3LT53bGMtPndpcGh5LCAid2wlZDogd2xjX2dldF9tYWNhZGRyOiBtYWNhZGRyICIKLQkJCSAgImdldHZhciglcykgbm90IGZvdW5kXG4iLCB3bGNfaHctPnVuaXQsIHZhcm5hbWUpOwotCX0KLQotCXJldHVybiBtYWNhZGRyOwotfQotCi0vKgotICogUmV0dXJuIHRydWUgaWYgcmFkaW8gaXMgZGlzYWJsZWQsIG90aGVyd2lzZSBmYWxzZS4KLSAqIGh3IHJhZGlvIGRpc2FibGUgc2lnbmFsIGlzIGFuIGV4dGVybmFsIHBpbiwgdXNlcnMgYWN0aXZhdGUgaXQgYXN5bmNocm9ub3VzbHkKLSAqIHRoaXMgZnVuY3Rpb24gY291bGQgYmUgY2FsbGVkIHdoZW4gZHJpdmVyIGlzIGRvd24gYW5kIHcvbyBjbG9jawotICogaXQgb3BlcmF0ZXMgb24gZGlmZmVyZW50IHJlZ2lzdGVycyBkZXBlbmRpbmcgb24gY29yZXJldiBhbmQgYm9hcmRmbGFnLgotICovCi1ib29sIGJyY21zX2JfcmFkaW9fcmVhZF9od2Rpc2FibGVkKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KQotewotCWJvb2wgdiwgY2xrLCB4dGFsOwotCXUzMiByZXNldGJpdHMgPSAwLCBmbGFncyA9IDA7Ci0KLQl4dGFsID0gd2xjX2h3LT5zYmNsazsKLQlpZiAoIXh0YWwpCi0JCWJyY21zX2JfeHRhbCh3bGNfaHcsIE9OKTsKLQotCS8qIG1heSBuZWVkIHRvIHRha2UgY29yZSBvdXQgb2YgcmVzZXQgZmlyc3QgKi8KLQljbGsgPSB3bGNfaHctPmNsazsKLQlpZiAoIWNsaykgewotCQkvKgotCQkgKiBtYWMgbm8gbG9uZ2VyIGVuYWJsZXMgcGh5Y2xrIGF1dG9tYXRpY2FsbHkgd2hlbiBkcml2ZXIKLQkJICogYWNjZXNzZXMgcGh5cmVnIHRocm91Z2hwdXQgbWFjLiBUaGlzIGNhbiBiZSBza2lwcGVkIHNpbmNlCi0JCSAqIG9ubHkgbWFjIHJlZyBpcyBhY2Nlc3NlZCBiZWxvdwotCQkgKi8KLQkJZmxhZ3MgfD0gU0lDRl9QQ0xLRTsKLQotCQkvKiBBSSBjaGlwIGRvZXNuJ3QgcmVzdG9yZSBiYXIwd2luMiBvbiBoaWJlcm5hdGlvbi9yZXN1bWUsIG5lZWQgc3cgZml4dXAgKi8KLQkJaWYgKCh3bGNfaHctPnNpaC0+Y2hpcCA9PSBCQ000MzIyNF9DSElQX0lEKSB8fAotCQkgICAgKHdsY19ody0+c2loLT5jaGlwID09IEJDTTQzMjI1X0NISVBfSUQpKQotCQkJd2xjX2h3LT5yZWdzID0KLQkJCSAgICAoZDExcmVnc190ICopIGFpX3NldGNvcmUod2xjX2h3LT5zaWgsIEQxMV9DT1JFX0lELAotCQkJCQkJICAgICAwKTsKLQkJYWlfY29yZV9yZXNldCh3bGNfaHctPnNpaCwgZmxhZ3MsIHJlc2V0Yml0cyk7Ci0JCWJyY21zX2NfbWN0cmxfcmVzZXQod2xjX2h3KTsKLQl9Ci0KLQl2ID0gKChSX1JFRygmd2xjX2h3LT5yZWdzLT5waHlkZWJ1ZykgJiBQREJHX1JGRCkgIT0gMCk7Ci0KLQkvKiBwdXQgY29yZSBiYWNrIGludG8gcmVzZXQgKi8KLQlpZiAoIWNsaykKLQkJYWlfY29yZV9kaXNhYmxlKHdsY19ody0+c2loLCAwKTsKLQotCWlmICgheHRhbCkKLQkJYnJjbXNfYl94dGFsKHdsY19odywgT0ZGKTsKLQotCXJldHVybiB2OwotfQotCi0vKiBJbml0aWFsaXplIGp1c3QgdGhlIGhhcmR3YXJlIHdoZW4gY29taW5nIG91dCBvZiBQT1Igb3IgUzMvUzUgc3lzdGVtIHN0YXRlcyAqLwotdm9pZCBicmNtc19iX2h3X3VwKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KQotewotCWlmICh3bGNfaHctPndsYy0+cHViLT5od191cCkKLQkJcmV0dXJuOwotCi0JQkNNTVNHKHdsY19ody0+d2xjLT53aXBoeSwgIndsJWRcbiIsIHdsY19ody0+dW5pdCk7Ci0KLQkvKgotCSAqIEVuYWJsZSBwbGwgYW5kIHh0YWwsIGluaXRpYWxpemUgdGhlIHBvd2VyIGNvbnRyb2wgcmVnaXN0ZXJzLAotCSAqIGFuZCBmb3JjZSBmYXN0Y2xvY2sgZm9yIHRoZSByZW1haW5kZXIgb2YgYnJjbXNfY191cCgpLgotCSAqLwotCWJyY21zX2JfeHRhbCh3bGNfaHcsIE9OKTsKLQlhaV9jbGtjdGxfaW5pdCh3bGNfaHctPnNpaCk7Ci0JYnJjbXNfYl9jbGtjdGxfY2xrKHdsY19odywgQ0xLX0ZBU1QpOwotCi0JaWYgKHdsY19ody0+c2loLT5idXN0eXBlID09IFBDSV9CVVMpIHsKLQkJYWlfcGNpX2ZpeGNmZyh3bGNfaHctPnNpaCk7Ci0KLQkJLyogQUkgY2hpcCBkb2Vzbid0IHJlc3RvcmUgYmFyMHdpbjIgb24gaGliZXJuYXRpb24vcmVzdW1lLCBuZWVkIHN3IGZpeHVwICovCi0JCWlmICgod2xjX2h3LT5zaWgtPmNoaXAgPT0gQkNNNDMyMjRfQ0hJUF9JRCkgfHwKLQkJICAgICh3bGNfaHctPnNpaC0+Y2hpcCA9PSBCQ000MzIyNV9DSElQX0lEKSkKLQkJCXdsY19ody0+cmVncyA9Ci0JCQkgICAgKGQxMXJlZ3NfdCAqKSBhaV9zZXRjb3JlKHdsY19ody0+c2loLCBEMTFfQ09SRV9JRCwKLQkJCQkJCSAgICAgMCk7Ci0JfQotCi0JLyogSW5mb3JtIHBoeSB0aGF0IGEgUE9SIHJlc2V0IGhhcyBvY2N1cnJlZCBzbyBpdCBkb2VzIGEgY29tcGxldGUgcGh5IGluaXQgKi8KLQl3bGNfcGh5X3Bvcl9pbmZvcm0od2xjX2h3LT5iYW5kLT5waSk7Ci0KLQl3bGNfaHctPnVjb2RlX2xvYWRlZCA9IGZhbHNlOwotCXdsY19ody0+d2xjLT5wdWItPmh3X3VwID0gdHJ1ZTsKLQotCWlmICgod2xjX2h3LT5ib2FyZGZsYWdzICYgQkZMX0ZFTSkKLQkgICAgJiYgKHdsY19ody0+c2loLT5jaGlwID09IEJDTTQzMTNfQ0hJUF9JRCkpIHsKLQkJaWYgKCEKLQkJICAgICh3bGNfaHctPmJvYXJkcmV2ID49IDB4MTI1MAotCQkgICAgICYmICh3bGNfaHctPmJvYXJkZmxhZ3MgJiBCRkxfRkVNX0JUKSkpCi0JCQlhaV9lcGFfNDMxM3dhcih3bGNfaHctPnNpaCk7Ci0JfQotfQotCi1zdGF0aWMgYm9vbCB3bGNfZG1hX3J4cmVzZXQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHVpbnQgZmlmbykKLXsKLQlzdHJ1Y3QgZG1hX3B1YiAqZGkgPSB3bGNfaHctPmRpW2ZpZm9dOwotCXJldHVybiBkbWFfcnhyZXNldChkaSk7Ci19Ci0KLS8qIGQxMSBjb3JlIHJlc2V0Ci0gKiAgIGVuc3VyZSBmYXNrIGNsb2NrIGR1cmluZyByZXNldAotICogICByZXNldCBkbWEKLSAqICAgcmVzZXQgZDExKG91dCBvZiByZXNldCkKLSAqICAgcmVzZXQgcGh5KG91dCBvZiByZXNldCkKLSAqICAgY2xlYXIgc29mdHdhcmUgbWFjaW50c3RhdHVzIGZvciBmcmVzaCBuZXcgc3RhcnQKLSAqIG9uZSB0ZXN0aW5nIGhhY2sgd2xjX2h3LT5ub3Jlc2V0IHdpbGwgYnlwYXNzIHRoZSBkMTEvcGh5IHJlc2V0Ci0gKi8KLXZvaWQgYnJjbXNfYl9jb3JlcmVzZXQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHUzMiBmbGFncykKLXsKLQlkMTFyZWdzX3QgKnJlZ3M7Ci0JdWludCBpOwotCWJvb2wgZmFzdGNsazsKLQl1MzIgcmVzZXRiaXRzID0gMDsKLQotCWlmIChmbGFncyA9PSBCUkNNU19VU0VfQ09SRUZMQUdTKQotCQlmbGFncyA9ICh3bGNfaHctPmJhbmQtPnBpID8gd2xjX2h3LT5iYW5kLT5jb3JlX2ZsYWdzIDogMCk7Ci0KLQlCQ01NU0cod2xjX2h3LT53bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjX2h3LT51bml0KTsKLQotCXJlZ3MgPSB3bGNfaHctPnJlZ3M7Ci0KLQkvKiByZXF1ZXN0IEZBU1QgY2xvY2sgaWYgbm90IG9uICAqLwotCWZhc3RjbGsgPSB3bGNfaHctPmZvcmNlZmFzdGNsazsKLQlpZiAoIWZhc3RjbGspCi0JCWJyY21zX2JfY2xrY3RsX2Nsayh3bGNfaHcsIENMS19GQVNUKTsKLQotCS8qIHJlc2V0IHRoZSBkbWEgZW5naW5lcyBleGNlcHQgZmlyc3QgdGltZSB0aHJ1ICovCi0JaWYgKGFpX2lzY29yZXVwKHdsY19ody0+c2loKSkgewotCQlmb3IgKGkgPSAwOyBpIDwgTkZJRk87IGkrKykKLQkJCWlmICgod2xjX2h3LT5kaVtpXSkgJiYgKCFkbWFfdHhyZXNldCh3bGNfaHctPmRpW2ldKSkpIHsKLQkJCQl3aXBoeV9lcnIod2xjX2h3LT53bGMtPndpcGh5LCAid2wlZDogJXM6ICIKLQkJCQkJICAiZG1hX3R4cmVzZXRbJWRdOiBjYW5ub3Qgc3RvcCBkbWFcbiIsCi0JCQkJCSAgIHdsY19ody0+dW5pdCwgX19mdW5jX18sIGkpOwotCQkJfQotCi0JCWlmICgod2xjX2h3LT5kaVtSWF9GSUZPXSkKLQkJICAgICYmICghd2xjX2RtYV9yeHJlc2V0KHdsY19odywgUlhfRklGTykpKSB7Ci0JCQl3aXBoeV9lcnIod2xjX2h3LT53bGMtPndpcGh5LCAid2wlZDogJXM6IGRtYV9yeHJlc2V0IgotCQkJCSAgIlslZF06IGNhbm5vdCBzdG9wIGRtYVxuIiwKLQkJCQkgIHdsY19ody0+dW5pdCwgX19mdW5jX18sIFJYX0ZJRk8pOwotCQl9Ci0JfQotCS8qIGlmIG5vcmVzZXQsIGp1c3Qgc3RvcCB0aGUgcHNtIGFuZCByZXR1cm4gKi8KLQlpZiAod2xjX2h3LT5ub3Jlc2V0KSB7Ci0JCXdsY19ody0+d2xjLT5tYWNpbnRzdGF0dXMgPSAwOwkvKiBza2lwIHdsX2RwYyBhZnRlciBkb3duICovCi0JCWJyY21zX2JfbWN0cmwod2xjX2h3LCBNQ1RMX1BTTV9SVU4gfCBNQ1RMX0VOX01BQywgMCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIG1hYyBubyBsb25nZXIgZW5hYmxlcyBwaHljbGsgYXV0b21hdGljYWxseSB3aGVuIGRyaXZlciBhY2Nlc3NlcwotCSAqIHBoeXJlZyB0aHJvdWdocHV0IG1hYywgQU5EIHBoeV9yZXNldCBpcyBza2lwcGVkIGF0IGVhcmx5IHN0YWdlIHdoZW4KLQkgKiBiYW5kLT5waSBpcyBpbnZhbGlkLiBuZWVkIHRvIGVuYWJsZSBQSFkgQ0xLCi0JICovCi0JZmxhZ3MgfD0gU0lDRl9QQ0xLRTsKLQotCS8qIHJlc2V0IHRoZSBjb3JlCi0JICogSW4gY2hpcHMgd2l0aCBQTVUsIHRoZSBmYXN0Y2xrIHJlcXVlc3QgZ29lcyB0aHJvdWdoIGQxMSBjb3JlIHJlZyAweDFlMCwgd2hpY2gKLQkgKiAgaXMgY2xlYXJlZCBieSB0aGUgY29yZV9yZXNldC4gaGF2ZSB0byByZS1yZXF1ZXN0IGl0LgotCSAqICBUaGlzIGFkZHMgc29tZSBkZWxheSBhbmQgd2UgY2FuIG9wdGltaXplIGl0IGJ5IGFsc28gcmVxdWVzdGluZyBmYXN0Y2xrIHRocm91Z2gKLQkgKiAgY2hpcGNvbW1vbiBkdXJpbmcgdGhpcyBwZXJpb2QgaWYgbmVjZXNzYXJ5LiBCdXQgdGhhdCBoYXMgdG8gd29yayBjb29yZGluYXRlCi0JICogIHdpdGggb3RoZXIgZHJpdmVyIGxpa2UgbWlwcy9hcm0gc2luY2UgdGhleSBtYXkgdG91Y2ggY2hpcGNvbW1vbiBhcyB3ZWxsLgotCSAqLwotCXdsY19ody0+Y2xrID0gZmFsc2U7Ci0JYWlfY29yZV9yZXNldCh3bGNfaHctPnNpaCwgZmxhZ3MsIHJlc2V0Yml0cyk7Ci0Jd2xjX2h3LT5jbGsgPSB0cnVlOwotCWlmICh3bGNfaHctPmJhbmQgJiYgd2xjX2h3LT5iYW5kLT5waSkKLQkJd2xjX3BoeV9od19jbGtfc3RhdGVfdXBkKHdsY19ody0+YmFuZC0+cGksIHRydWUpOwotCi0JYnJjbXNfY19tY3RybF9yZXNldCh3bGNfaHcpOwotCi0JaWYgKFBNVUNUTF9FTkFCKHdsY19ody0+c2loKSkKLQkJYnJjbXNfYl9jbGtjdGxfY2xrKHdsY19odywgQ0xLX0ZBU1QpOwotCi0JYnJjbXNfYl9waHlfcmVzZXQod2xjX2h3KTsKLQotCS8qIHR1cm4gb24gUEhZX1BMTCAqLwotCWJyY21zX2JfY29yZV9waHlwbGxfY3RsKHdsY19odywgdHJ1ZSk7Ci0KLQkvKiBjbGVhciBzdyBpbnRzdGF0dXMgKi8KLQl3bGNfaHctPndsYy0+bWFjaW50c3RhdHVzID0gMDsKLQotCS8qIHJlc3RvcmUgdGhlIGNsayBzZXR0aW5nICovCi0JaWYgKCFmYXN0Y2xrKQotCQlicmNtc19iX2Nsa2N0bF9jbGsod2xjX2h3LCBDTEtfRFlOQU1JQyk7Ci19Ci0KLS8qIHR4ZmlmbyBzaXplcyBuZWVkcyB0byBiZSBtb2RpZmllZChpbmNyZWFzZWQpIHNpbmNlIHRoZSBuZXdlciBjb3JlcwotICogaGF2ZSBtb3JlIG1lbW9yeS4KLSAqLwotc3RhdGljIHZvaWQgYnJjbXNfYl9jb3JlcmV2X2ZpZm9maXh1cChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odykKLXsKLQlkMTFyZWdzX3QgKnJlZ3MgPSB3bGNfaHctPnJlZ3M7Ci0JdTE2IGZpZm9fbnU7Ci0JdTE2IHR4Zmlmb19zdGFydGJsayA9IFRYRklGT19TVEFSVF9CTEssIHR4Zmlmb19lbmRibGs7Ci0JdTE2IHR4Zmlmb19kZWYsIHR4Zmlmb19kZWYxOwotCXUxNiB0eGZpZm9fY21kOwotCi0JLyogdHggZmlmb3Mgc3RhcnQgYXQgVFhGSUZPX1NUQVJUX0JMSyBmcm9tIHRoZSBCYXNlIGFkZHJlc3MgKi8KLQl0eGZpZm9fc3RhcnRibGsgPSBUWEZJRk9fU1RBUlRfQkxLOwotCi0JLyogc2VxdWVuY2Ugb2Ygb3BlcmF0aW9uczogIHJlc2V0IGZpZm8sIHNldCBmaWZvIHNpemUsIHJlc2V0IGZpZm8gKi8KLQlmb3IgKGZpZm9fbnUgPSAwOyBmaWZvX251IDwgTkZJRk87IGZpZm9fbnUrKykgewotCi0JCXR4Zmlmb19lbmRibGsgPSB0eGZpZm9fc3RhcnRibGsgKyB3bGNfaHctPnhtdGZpZm9fc3pbZmlmb19udV07Ci0JCXR4Zmlmb19kZWYgPSAodHhmaWZvX3N0YXJ0YmxrICYgMHhmZikgfAotCQkgICAgKCgodHhmaWZvX2VuZGJsayAtIDEpICYgMHhmZikgPDwgVFhGSUZPX0ZJRk9UT1BfU0hJRlQpOwotCQl0eGZpZm9fZGVmMSA9ICgodHhmaWZvX3N0YXJ0YmxrID4+IDgpICYgMHgxKSB8Ci0JCSAgICAoKCgodHhmaWZvX2VuZGJsayAtCi0JCQkxKSA+PiA4KSAmIDB4MSkgPDwgVFhGSUZPX0ZJRk9UT1BfU0hJRlQpOwotCQl0eGZpZm9fY21kID0KLQkJICAgIFRYRklGT0NNRF9SRVNFVF9NQVNLIHwgKGZpZm9fbnUgPDwgVFhGSUZPQ01EX0ZJRk9TRUxfU0hJRlQpOwotCi0JCVdfUkVHKCZyZWdzLT54bXRmaWZvY21kLCB0eGZpZm9fY21kKTsKLQkJV19SRUcoJnJlZ3MtPnhtdGZpZm9kZWYsIHR4Zmlmb19kZWYpOwotCQlXX1JFRygmcmVncy0+eG10Zmlmb2RlZjEsIHR4Zmlmb19kZWYxKTsKLQotCQlXX1JFRygmcmVncy0+eG10Zmlmb2NtZCwgdHhmaWZvX2NtZCk7Ci0KLQkJdHhmaWZvX3N0YXJ0YmxrICs9IHdsY19ody0+eG10Zmlmb19zeltmaWZvX251XTsKLQl9Ci0JLyoKLQkgKiBuZWVkIHRvIHByb3BhZ2F0ZSB0byBzaG0gbG9jYXRpb24gdG8gYmUgaW4gc3luYyBzaW5jZSB1Y29kZS9odyB3b24ndAotCSAqIGRvIHRoaXMKLQkgKi8KLQlicmNtc19iX3dyaXRlX3NobSh3bGNfaHcsIE1fRklGT1NJWkUwLAotCQkJICAgd2xjX2h3LT54bXRmaWZvX3N6W1RYX0FDX0JFX0ZJRk9dKTsKLQlicmNtc19iX3dyaXRlX3NobSh3bGNfaHcsIE1fRklGT1NJWkUxLAotCQkJICAgd2xjX2h3LT54bXRmaWZvX3N6W1RYX0FDX1ZJX0ZJRk9dKTsKLQlicmNtc19iX3dyaXRlX3NobSh3bGNfaHcsIE1fRklGT1NJWkUyLAotCQkJICAgKCh3bGNfaHctPnhtdGZpZm9fc3pbVFhfQUNfVk9fRklGT10gPDwgOCkgfCB3bGNfaHctPgotCQkJICAgIHhtdGZpZm9fc3pbVFhfQUNfQktfRklGT10pKTsKLQlicmNtc19iX3dyaXRlX3NobSh3bGNfaHcsIE1fRklGT1NJWkUzLAotCQkJICAgKCh3bGNfaHctPnhtdGZpZm9fc3pbVFhfQVRJTV9GSUZPXSA8PCA4KSB8IHdsY19ody0+Ci0JCQkgICAgeG10Zmlmb19zeltUWF9CQ01DX0ZJRk9dKSk7Ci19Ci0KLS8qIGQxMSBjb3JlIGluaXQKLSAqICAgcmVzZXQgUFNNCi0gKiAgIGRvd25sb2FkIHVjb2RlL1BDTQotICogICBsZXQgdWNvZGUgcnVuIHRvIHN1c3BlbmRlZAotICogICBkb3dubG9hZCB1Y29kZSBpbml0cwotICogICBjb25maWcgb3RoZXIgY29yZSByZWdpc3RlcnMKLSAqICAgaW5pdCBkbWEKLSAqLwotc3RhdGljIHZvaWQgYnJjbXNfYl9jb3JlaW5pdChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0Jc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcgPSB3bGMtPmh3OwotCWQxMXJlZ3NfdCAqcmVnczsKLQl1MzIgc2ZsYWdzOwotCXVpbnQgYmNuaW50X3VzOwotCXVpbnQgaSA9IDA7Ci0JYm9vbCBmaWZvc3pfZml4dXAgPSBmYWxzZTsKLQlpbnQgZXJyID0gMDsKLQl1MTYgYnVmW05GSUZPXTsKLQlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2xjLT53aXBoeTsKLQotCXJlZ3MgPSB3bGNfaHctPnJlZ3M7Ci0KLQlCQ01NU0cod2xjLT53aXBoeSwgIndsJWRcbiIsIHdsY19ody0+dW5pdCk7Ci0KLQkvKiByZXNldCBQU00gKi8KLQlicmNtc19iX21jdHJsKHdsY19odywgfjAsIChNQ1RMX0lIUl9FTiB8IE1DVExfUFNNX0pNUF8wIHwgTUNUTF9XQUtFKSk7Ci0KLQlicmNtc191Y29kZV9kb3dubG9hZCh3bGNfaHcpOwotCS8qCi0JICogRklGT1NaIGZpeHVwLiBkcml2ZXIgd2FudHMgdG8gY29udHJvbHMgdGhlIGZpZm8gYWxsb2NhdGlvbi4KLQkgKi8KLQlmaWZvc3pfZml4dXAgPSB0cnVlOwotCi0JLyogbGV0IHRoZSBQU00gcnVuIHRvIHRoZSBzdXNwZW5kZWQgc3RhdGUsIHNldCBtb2RlIHRvIEJTUyBTVEEgKi8KLQlXX1JFRygmcmVncy0+bWFjaW50c3RhdHVzLCAtMSk7Ci0JYnJjbXNfYl9tY3RybCh3bGNfaHcsIH4wLAotCQkgICAgICAgKE1DVExfSUhSX0VOIHwgTUNUTF9JTkZSQSB8IE1DVExfUFNNX1JVTiB8IE1DVExfV0FLRSkpOwotCi0JLyogd2FpdCBmb3IgdWNvZGUgdG8gc2VsZi1zdXNwZW5kIGFmdGVyIGF1dG8taW5pdCAqLwotCVNQSU5XQUlUKCgoUl9SRUcoJnJlZ3MtPm1hY2ludHN0YXR1cykgJiBNSV9NQUNTU1BOREQpID09IDApLAotCQkgMTAwMCAqIDEwMDApOwotCWlmICgoUl9SRUcoJnJlZ3MtPm1hY2ludHN0YXR1cykgJiBNSV9NQUNTU1BOREQpID09IDApCi0JCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6IHdsY19jb3JlaW5pdDogdWNvZGUgZGlkIG5vdCBzZWxmLSIKLQkJCSAgInN1c3BlbmQhXG4iLCB3bGNfaHctPnVuaXQpOwotCi0JYnJjbXNfY19ncGlvX2luaXQod2xjKTsKLQotCXNmbGFncyA9IGFpX2NvcmVfc2ZsYWdzKHdsY19ody0+c2loLCAwLCAwKTsKLQotCWlmIChEMTFSRVZfSVMod2xjX2h3LT5jb3JlcmV2LCAyMykpIHsKLQkJaWYgKEJSQ01TX0lTTlBIWSh3bGNfaHctPmJhbmQpKQotCQkJYnJjbXNfY193cml0ZV9pbml0cyh3bGNfaHcsIGQxMW4waW5pdHZhbHMxNik7Ci0JCWVsc2UKLQkJCXdpcGh5X2Vycih3aXBoeSwgIiVzOiB3bCVkOiB1bnN1cHBvcnRlZCBwaHkgaW4gY29yZXJldiIKLQkJCQkgICIgJWRcbiIsIF9fZnVuY19fLCB3bGNfaHctPnVuaXQsCi0JCQkJICB3bGNfaHctPmNvcmVyZXYpOwotCX0gZWxzZSBpZiAoRDExUkVWX0lTKHdsY19ody0+Y29yZXJldiwgMjQpKSB7Ci0JCWlmIChCUkNNU19JU0xDTlBIWSh3bGNfaHctPmJhbmQpKSB7Ci0JCQlicmNtc19jX3dyaXRlX2luaXRzKHdsY19odywgZDExbGNuMGluaXR2YWxzMjQpOwotCQl9IGVsc2UgewotCQkJd2lwaHlfZXJyKHdpcGh5LCAiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIHBoeSBpbiBjb3JlcmV2IgotCQkJCSAgIiAlZFxuIiwgX19mdW5jX18sIHdsY19ody0+dW5pdCwKLQkJCQkgIHdsY19ody0+Y29yZXJldik7Ci0JCX0KLQl9IGVsc2UgewotCQl3aXBoeV9lcnIod2lwaHksICIlczogd2wlZDogdW5zdXBwb3J0ZWQgY29yZXJldiAlZFxuIiwKLQkJCSAgX19mdW5jX18sIHdsY19ody0+dW5pdCwgd2xjX2h3LT5jb3JlcmV2KTsKLQl9Ci0KLQkvKiBGb3Igb2xkIHVjb2RlLCB0eGZpZm8gc2l6ZXMgbmVlZHMgdG8gYmUgbW9kaWZpZWQoaW5jcmVhc2VkKSAqLwotCWlmIChmaWZvc3pfZml4dXAgPT0gdHJ1ZSkgewotCQlicmNtc19iX2NvcmVyZXZfZmlmb2ZpeHVwKHdsY19odyk7Ci0JfQotCi0JLyogY2hlY2sgdHhmaWZvIGFsbG9jYXRpb25zIG1hdGNoIGJldHdlZW4gdWNvZGUgYW5kIGRyaXZlciAqLwotCWJ1ZltUWF9BQ19CRV9GSUZPXSA9IGJyY21zX2JfcmVhZF9zaG0od2xjX2h3LCBNX0ZJRk9TSVpFMCk7Ci0JaWYgKGJ1ZltUWF9BQ19CRV9GSUZPXSAhPSB3bGNfaHctPnhtdGZpZm9fc3pbVFhfQUNfQkVfRklGT10pIHsKLQkJaSA9IFRYX0FDX0JFX0ZJRk87Ci0JCWVyciA9IC0xOwotCX0KLQlidWZbVFhfQUNfVklfRklGT10gPSBicmNtc19iX3JlYWRfc2htKHdsY19odywgTV9GSUZPU0laRTEpOwotCWlmIChidWZbVFhfQUNfVklfRklGT10gIT0gd2xjX2h3LT54bXRmaWZvX3N6W1RYX0FDX1ZJX0ZJRk9dKSB7Ci0JCWkgPSBUWF9BQ19WSV9GSUZPOwotCQllcnIgPSAtMTsKLQl9Ci0JYnVmW1RYX0FDX0JLX0ZJRk9dID0gYnJjbXNfYl9yZWFkX3NobSh3bGNfaHcsIE1fRklGT1NJWkUyKTsKLQlidWZbVFhfQUNfVk9fRklGT10gPSAoYnVmW1RYX0FDX0JLX0ZJRk9dID4+IDgpICYgMHhmZjsKLQlidWZbVFhfQUNfQktfRklGT10gJj0gMHhmZjsKLQlpZiAoYnVmW1RYX0FDX0JLX0ZJRk9dICE9IHdsY19ody0+eG10Zmlmb19zeltUWF9BQ19CS19GSUZPXSkgewotCQlpID0gVFhfQUNfQktfRklGTzsKLQkJZXJyID0gLTE7Ci0JfQotCWlmIChidWZbVFhfQUNfVk9fRklGT10gIT0gd2xjX2h3LT54bXRmaWZvX3N6W1RYX0FDX1ZPX0ZJRk9dKSB7Ci0JCWkgPSBUWF9BQ19WT19GSUZPOwotCQllcnIgPSAtMTsKLQl9Ci0JYnVmW1RYX0JDTUNfRklGT10gPSBicmNtc19iX3JlYWRfc2htKHdsY19odywgTV9GSUZPU0laRTMpOwotCWJ1ZltUWF9BVElNX0ZJRk9dID0gKGJ1ZltUWF9CQ01DX0ZJRk9dID4+IDgpICYgMHhmZjsKLQlidWZbVFhfQkNNQ19GSUZPXSAmPSAweGZmOwotCWlmIChidWZbVFhfQkNNQ19GSUZPXSAhPSB3bGNfaHctPnhtdGZpZm9fc3pbVFhfQkNNQ19GSUZPXSkgewotCQlpID0gVFhfQkNNQ19GSUZPOwotCQllcnIgPSAtMTsKLQl9Ci0JaWYgKGJ1ZltUWF9BVElNX0ZJRk9dICE9IHdsY19ody0+eG10Zmlmb19zeltUWF9BVElNX0ZJRk9dKSB7Ci0JCWkgPSBUWF9BVElNX0ZJRk87Ci0JCWVyciA9IC0xOwotCX0KLQlpZiAoZXJyICE9IDApIHsKLQkJd2lwaHlfZXJyKHdpcGh5LCAid2xjX2NvcmVpbml0OiB0eGZpZm8gbWlzbWF0Y2g6IHVjb2RlIHNpemUgJWQiCi0JCQkgICIgZHJpdmVyIHNpemUgJWQgaW5kZXggJWRcbiIsIGJ1ZltpXSwKLQkJCSAgd2xjX2h3LT54bXRmaWZvX3N6W2ldLCBpKTsKLQl9Ci0KLQkvKiBtYWtlIHN1cmUgd2UgY2FuIHN0aWxsIHRhbGsgdG8gdGhlIG1hYyAqLwotCVdBUk5fT04oUl9SRUcoJnJlZ3MtPm1hY2NvbnRyb2wpID09IDB4ZmZmZmZmZmYpOwotCi0JLyogYmFuZC1zcGVjaWZpYyBpbml0cyBkb25lIGJ5IHdsY19ic2luaXQoKSAqLwotCi0JLyogU2V0IHVwIGZyYW1lIGJ1cnN0IHNpemUgYW5kIGFudGVubmEgc3dhcCB0aHJlc2hvbGQgaW5pdCB2YWx1ZXMgKi8KLQlicmNtc19iX3dyaXRlX3NobSh3bGNfaHcsIE1fTUJVUlNUX1NJWkUsIE1BWFRYRlJBTUVCVVJTVCk7Ci0JYnJjbXNfYl93cml0ZV9zaG0od2xjX2h3LCBNX01BWF9BTlRDTlQsIEFOVENOVCk7Ci0KLQkvKiBlbmFibGUgb25lIHJ4IGludGVycnVwdCBwZXIgcmVjZWl2ZWQgZnJhbWUgKi8KLQlXX1JFRygmcmVncy0+aW50cmN2bGF6eVswXSwgKDEgPDwgSVJMX0ZDX1NISUZUKSk7Ci0KLQkvKiBzZXQgdGhlIHN0YXRpb24gbW9kZSAoQlNTIFNUQSkgKi8KLQlicmNtc19iX21jdHJsKHdsY19odywKLQkJICAgICAgIChNQ1RMX0lORlJBIHwgTUNUTF9ESVNDQVJEX1BNUSB8IE1DVExfQVApLAotCQkgICAgICAgKE1DVExfSU5GUkEgfCBNQ1RMX0RJU0NBUkRfUE1RKSk7Ci0KLQkvKiBzZXQgdXAgQmVhY29uIGludGVydmFsICovCi0JYmNuaW50X3VzID0gMHg4MDAwIDw8IDEwOwotCVdfUkVHKCZyZWdzLT50c2ZfY2ZwcmVwLCAoYmNuaW50X3VzIDw8IENGUFJFUF9DQklfU0hJRlQpKTsKLQlXX1JFRygmcmVncy0+dHNmX2NmcHN0YXJ0LCBiY25pbnRfdXMpOwotCVdfUkVHKCZyZWdzLT5tYWNpbnRzdGF0dXMsIE1JX0dQMSk7Ci0KLQkvKiB3cml0ZSBpbnRlcnJ1cHQgbWFzayAqLwotCVdfUkVHKCZyZWdzLT5pbnRjdHJscmVnc1tSWF9GSUZPXS5pbnRtYXNrLCBERUZfUlhJTlRNQVNLKTsKLQotCS8qIGFsbG93IHRoZSBNQUMgdG8gY29udHJvbCB0aGUgUEhZIGNsb2NrIChkeW5hbWljIG9uL29mZikgKi8KLQlicmNtc19iX21hY3BoeWNsa19zZXQod2xjX2h3LCBPTik7Ci0KLQkvKiBwcm9ncmFtIGR5bmFtaWMgY2xvY2sgY29udHJvbCBmYXN0IHBvd2VydXAgZGVsYXkgcmVnaXN0ZXIgKi8KLQl3bGMtPmZhc3Rwd3J1cF9kbHkgPSBhaV9jbGtjdGxfZmFzdF9wd3J1cF9kZWxheSh3bGNfaHctPnNpaCk7Ci0JV19SRUcoJnJlZ3MtPnNjY19mYXN0cHdydXBfZGx5LCB3bGMtPmZhc3Rwd3J1cF9kbHkpOwotCi0JLyogdGVsbCB0aGUgdWNvZGUgdGhlIGNvcmVyZXYgKi8KLQlicmNtc19iX3dyaXRlX3NobSh3bGNfaHcsIE1fTUFDSFdfVkVSLCAodTE2KSB3bGNfaHctPmNvcmVyZXYpOwotCi0JLyogdGVsbCB0aGUgdWNvZGUgTUFDIGNhcGFiaWxpdGllcyAqLwotCWJyY21zX2Jfd3JpdGVfc2htKHdsY19odywgTV9NQUNIV19DQVBfTCwKLQkJCSAgICh1MTYpICh3bGNfaHctPm1hY2h3Y2FwICYgMHhmZmZmKSk7Ci0JYnJjbXNfYl93cml0ZV9zaG0od2xjX2h3LCBNX01BQ0hXX0NBUF9ILAotCQkJICAgKHUxNikgKCh3bGNfaHctPgotCQkJCSAgICAgIG1hY2h3Y2FwID4+IDE2KSAmIDB4ZmZmZikpOwotCi0JLyogd3JpdGUgcmV0cnkgbGltaXRzIHRvIFNDUiwgdGhpcyBkb25lIGFmdGVyIFBTTSBpbml0ICovCi0JV19SRUcoJnJlZ3MtPm9iamFkZHIsIE9CSkFERFJfU0NSX1NFTCB8IFNfRE9UMTFfU1JDX0xNVCk7Ci0JKHZvaWQpUl9SRUcoJnJlZ3MtPm9iamFkZHIpOwotCVdfUkVHKCZyZWdzLT5vYmpkYXRhLCB3bGNfaHctPlNSTCk7Ci0JV19SRUcoJnJlZ3MtPm9iamFkZHIsIE9CSkFERFJfU0NSX1NFTCB8IFNfRE9UMTFfTFJDX0xNVCk7Ci0JKHZvaWQpUl9SRUcoJnJlZ3MtPm9iamFkZHIpOwotCVdfUkVHKCZyZWdzLT5vYmpkYXRhLCB3bGNfaHctPkxSTCk7Ci0KLQkvKiB3cml0ZSByYXRlIGZhbGxiYWNrIHJldHJ5IGxpbWl0cyAqLwotCWJyY21zX2Jfd3JpdGVfc2htKHdsY19odywgTV9TRlJNVFhDTlRGQlJUSFNELCB3bGNfaHctPlNGQkwpOwotCWJyY21zX2Jfd3JpdGVfc2htKHdsY19odywgTV9MRlJNVFhDTlRGQlJUSFNELCB3bGNfaHctPkxGQkwpOwotCi0JQU5EX1JFRygmcmVncy0+aWZzX2N0bCwgMHgwRkZGKTsKLQlXX1JFRygmcmVncy0+aWZzX2FpZnNuLCBFRENGX0FJRlNOX01JTik7Ci0KLQkvKiBkbWEgaW5pdGlhbGl6YXRpb25zICovCi0Jd2xjLT50eHBlbmQxNjE2NXdhciA9IDA7Ci0KLQkvKiBpbml0IHRoZSB0eCBkbWEgZW5naW5lcyAqLwotCWZvciAoaSA9IDA7IGkgPCBORklGTzsgaSsrKSB7Ci0JCWlmICh3bGNfaHctPmRpW2ldKQotCQkJZG1hX3R4aW5pdCh3bGNfaHctPmRpW2ldKTsKLQl9Ci0KLQkvKiBpbml0IHRoZSByeCBkbWEgZW5naW5lKHMpIGFuZCBwb3N0IHJlY2VpdmUgYnVmZmVycyAqLwotCWRtYV9yeGluaXQod2xjX2h3LT5kaVtSWF9GSUZPXSk7Ci0JZG1hX3J4ZmlsbCh3bGNfaHctPmRpW1JYX0ZJRk9dKTsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBjaGFuZ2luZyB0aGUgdHNmIGZyYWMgcmVnaXN0ZXIKLSAqIElmIHNwdXIgYXZvaWRhbmNlIG1vZGUgaXMgb2ZmLCB0aGUgbWFjIGZyZXEgd2lsbCBiZSA4MC8xMjAvMTYwTWh6Ci0gKiBJZiBzcHVyIGF2b2lkYW5jZSBtb2RlIGlzIG9uMSwgdGhlIG1hYyBmcmVxIHdpbGwgYmUgODIvMTIzLzE2NE1oegotICogSWYgc3B1ciBhdm9pZGFuY2UgbW9kZSBpcyBvbjIsIHRoZSBtYWMgZnJlcSB3aWxsIGJlIDg0LzEyNi8xNjhNaHoKLSAqIEhUUEhZIEZvcm11bGEgaXMgMl4yNi9mcmVxKE1IeikgZS5nLgotICogRm9yIHNwdXJvbjIgLSAxMjZNSHogLT4gMl4yNi8xMjYgPSA1MzI2MTAuMAotICogIC0gNTMyNjEwID0gMHg4MjA4MiA9PiB0c2ZfY2xrX2ZyYWNfaCA9IDB4OCwgdHNmX2Nsa19mcmFjX2wgPSAweDIwODIKLSAqIEZvciBzcHVyb246IDEyM01IeiAtPiAyXjI2LzEyMyAgICA9IDU0NTYwMC41Ci0gKiAgLSA1NDU2MDEgPSAweDg1MzQxID0+IHRzZl9jbGtfZnJhY19oID0gMHg4LCB0c2ZfY2xrX2ZyYWNfbCA9IDB4NTM0MQotICogRm9yIHNwdXIgb2ZmOiAxMjBNSHogLT4gMl4yNi8xMjAgICAgPSA1NTkyNDAuNQotICogIC0gNTU5MjQxID0gMHg4ODg4OSA9PiB0c2ZfY2xrX2ZyYWNfaCA9IDB4OCwgdHNmX2Nsa19mcmFjX2wgPSAweDg4ODkKLSAqLwotCi12b2lkIGJyY21zX2Jfc3dpdGNoX21hY2ZyZXEoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHU4IHNwdXJtb2RlKQotewotCWQxMXJlZ3NfdCAqcmVnczsKLQlyZWdzID0gd2xjX2h3LT5yZWdzOwotCi0JaWYgKCh3bGNfaHctPnNpaC0+Y2hpcCA9PSBCQ000MzIyNF9DSElQX0lEKSB8fAotCSAgICAod2xjX2h3LT5zaWgtPmNoaXAgPT0gQkNNNDMyMjVfQ0hJUF9JRCkpIHsKLQkJaWYgKHNwdXJtb2RlID09IFdMX1NQVVJBVk9JRF9PTjIpIHsJLyogMTI2TWh6ICovCi0JCQlXX1JFRygmcmVncy0+dHNmX2Nsa19mcmFjX2wsIDB4MjA4Mik7Ci0JCQlXX1JFRygmcmVncy0+dHNmX2Nsa19mcmFjX2gsIDB4OCk7Ci0JCX0gZWxzZSBpZiAoc3B1cm1vZGUgPT0gV0xfU1BVUkFWT0lEX09OMSkgewkvKiAxMjNNaHogKi8KLQkJCVdfUkVHKCZyZWdzLT50c2ZfY2xrX2ZyYWNfbCwgMHg1MzQxKTsKLQkJCVdfUkVHKCZyZWdzLT50c2ZfY2xrX2ZyYWNfaCwgMHg4KTsKLQkJfSBlbHNlIHsJLyogMTIwTWh6ICovCi0JCQlXX1JFRygmcmVncy0+dHNmX2Nsa19mcmFjX2wsIDB4ODg4OSk7Ci0JCQlXX1JFRygmcmVncy0+dHNmX2Nsa19mcmFjX2gsIDB4OCk7Ci0JCX0KLQl9IGVsc2UgaWYgKEJSQ01TX0lTTENOUEhZKHdsY19ody0+YmFuZCkpIHsKLQkJaWYgKHNwdXJtb2RlID09IFdMX1NQVVJBVk9JRF9PTjEpIHsJLyogODJNaHogKi8KLQkJCVdfUkVHKCZyZWdzLT50c2ZfY2xrX2ZyYWNfbCwgMHg3Q0UwKTsKLQkJCVdfUkVHKCZyZWdzLT50c2ZfY2xrX2ZyYWNfaCwgMHhDKTsKLQkJfSBlbHNlIHsJLyogODBNaHogKi8KLQkJCVdfUkVHKCZyZWdzLT50c2ZfY2xrX2ZyYWNfbCwgMHhDQ0NEKTsKLQkJCVdfUkVHKCZyZWdzLT50c2ZfY2xrX2ZyYWNfaCwgMHhDKTsKLQkJfQotCX0KLX0KLQotLyogSW5pdGlhbGl6ZSBHUElPcyB0aGF0IGFyZSBjb250cm9sbGVkIGJ5IEQxMSBjb3JlICovCi1zdGF0aWMgdm9pZCBicmNtc19jX2dwaW9faW5pdChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0Jc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcgPSB3bGMtPmh3OwotCWQxMXJlZ3NfdCAqcmVnczsKLQl1MzIgZ2MsIGdtOwotCi0JcmVncyA9IHdsY19ody0+cmVnczsKLQotCS8qIHVzZSBHUElPIHNlbGVjdCAwIHRvIGdldCBhbGwgZ3BpbyBzaWduYWxzIGZyb20gdGhlIGdwaW8gb3V0IHJlZyAqLwotCWJyY21zX2JfbWN0cmwod2xjX2h3LCBNQ1RMX0dQT1VUX1NFTF9NQVNLLCAwKTsKLQotCS8qCi0JICogQ29tbW9uIEdQSU8gc2V0dXA6Ci0JICogICAgICBHMCA9IExFRCAwID0gV0xBTiBBY3Rpdml0eQotCSAqICAgICAgRzEgPSBMRUQgMSA9IFdMQU4gMi40IEdIeiBSYWRpbyBTdGF0ZQotCSAqICAgICAgRzIgPSBMRUQgMiA9IFdMQU4gNSBHSHogUmFkaW8gU3RhdGUKLQkgKiAgICAgIEc0ID0gcmFkaW8gZGlzYWJsZSBpbnB1dCAoSEkgZW5hYmxlZCwgTE8gZGlzYWJsZWQpCi0JICovCi0KLQlnYyA9IGdtID0gMDsKLQotCS8qIEFsbG9jYXRlIEdQSU9zIGZvciBtaW1vIGFudGVubmEgZGl2ZXJzaXR5IGZlYXR1cmUgKi8KLQlpZiAod2xjX2h3LT5hbnRzZWxfdHlwZSA9PSBBTlRTRUxfMngzKSB7Ci0JCS8qIEVuYWJsZSBhbnRlbm5hIGRpdmVyc2l0eSwgdXNlIDJ4MyBtb2RlICovCi0JCWJyY21zX2JfbWhmKHdsY19odywgTUhGMywgTUhGM19BTlRTRUxfRU4sCi0JCQkgICAgIE1IRjNfQU5UU0VMX0VOLCBCUkNNX0JBTkRfQUxMKTsKLQkJYnJjbXNfYl9taGYod2xjX2h3LCBNSEYzLCBNSEYzX0FOVFNFTF9NT0RFLAotCQkJICAgICBNSEYzX0FOVFNFTF9NT0RFLCBCUkNNX0JBTkRfQUxMKTsKLQotCQkvKiBpbml0IHN1cGVyc3dpdGNoIGNvbnRyb2wgKi8KLQkJd2xjX3BoeV9hbnRzZWxfaW5pdCh3bGNfaHctPmJhbmQtPnBpLCBmYWxzZSk7Ci0KLQl9IGVsc2UgaWYgKHdsY19ody0+YW50c2VsX3R5cGUgPT0gQU5UU0VMXzJ4NCkgewotCQlnbSB8PSBnYyB8PSAoQk9BUkRfR1BJT18xMiB8IEJPQVJEX0dQSU9fMTMpOwotCQkvKgotCQkgKiBUaGUgYm9hcmQgaXRzZWxmIGlzIHBvd2VyZWQgYnkgdGhlc2UgR1BJT3MKLQkJICogKHdoZW4gbm90IHNlbmRpbmcgcGF0dGVybikgc28gc2V0IHRoZW0gaGlnaAotCQkgKi8KLQkJT1JfUkVHKCZyZWdzLT5wc21fZ3Bpb19vZSwKLQkJICAgICAgIChCT0FSRF9HUElPXzEyIHwgQk9BUkRfR1BJT18xMykpOwotCQlPUl9SRUcoJnJlZ3MtPnBzbV9ncGlvX291dCwKLQkJICAgICAgIChCT0FSRF9HUElPXzEyIHwgQk9BUkRfR1BJT18xMykpOwotCi0JCS8qIEVuYWJsZSBhbnRlbm5hIGRpdmVyc2l0eSwgdXNlIDJ4NCBtb2RlICovCi0JCWJyY21zX2JfbWhmKHdsY19odywgTUhGMywgTUhGM19BTlRTRUxfRU4sCi0JCQkgICAgIE1IRjNfQU5UU0VMX0VOLCBCUkNNX0JBTkRfQUxMKTsKLQkJYnJjbXNfYl9taGYod2xjX2h3LCBNSEYzLCBNSEYzX0FOVFNFTF9NT0RFLCAwLAotCQkJICAgICBCUkNNX0JBTkRfQUxMKTsKLQotCQkvKiBDb25maWd1cmUgdGhlIGRlc2lyZWQgY2xvY2sgdG8gYmUgNE1oeiAqLwotCQlicmNtc19iX3dyaXRlX3NobSh3bGNfaHcsIE1fQU5UU0VMX0NMS0RJViwKLQkJCQkgICBBTlRTRUxfQ0xLRElWXzRNSFopOwotCX0KLQotCS8qIGdwaW8gOSBjb250cm9scyB0aGUgUEEuICB1Y29kZSBpcyByZXNwb25zaWJsZSBmb3Igd2lnZ2xpbmcgb3V0IGFuZCBvZSAqLwotCWlmICh3bGNfaHctPmJvYXJkZmxhZ3MgJiBCRkxfUEFDVFJMKQotCQlnbSB8PSBnYyB8PSBCT0FSRF9HUElPX1BBQ1RSTDsKLQotCS8qIGFwcGx5IHRvIGdwaW9jb250cm9sIHJlZ2lzdGVyICovCi0JYWlfZ3Bpb2NvbnRyb2wod2xjX2h3LT5zaWgsIGdtLCBnYywgR1BJT19EUlZfUFJJT1JJVFkpOwotfQotCi1zdGF0aWMgdm9pZCBicmNtc191Y29kZV9kb3dubG9hZChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odykKLXsKLQlzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGM7Ci0Jd2xjID0gd2xjX2h3LT53bGM7Ci0KLQlpZiAod2xjX2h3LT51Y29kZV9sb2FkZWQpCi0JCXJldHVybjsKLQotCWlmIChEMTFSRVZfSVMod2xjX2h3LT5jb3JlcmV2LCAyMykpIHsKLQkJaWYgKEJSQ01TX0lTTlBIWSh3bGNfaHctPmJhbmQpKSB7Ci0JCQlicmNtc191Y29kZV93cml0ZSh3bGNfaHcsIGJjbTQzeHhfMTZfbWltbywKLQkJCQkJYmNtNDN4eF8xNl9taW1vc3opOwotCQkJd2xjX2h3LT51Y29kZV9sb2FkZWQgPSB0cnVlOwotCQl9IGVsc2UKLQkJCXdpcGh5X2Vycih3bGMtPndpcGh5LCAiJXM6IHdsJWQ6IHVuc3VwcG9ydGVkIHBoeSBpbiAiCi0JCQkJICAiY29yZXJldiAlZFxuIiwKLQkJCQkgIF9fZnVuY19fLCB3bGNfaHctPnVuaXQsIHdsY19ody0+Y29yZXJldik7Ci0JfSBlbHNlIGlmIChEMTFSRVZfSVMod2xjX2h3LT5jb3JlcmV2LCAyNCkpIHsKLQkJaWYgKEJSQ01TX0lTTENOUEhZKHdsY19ody0+YmFuZCkpIHsKLQkJCWJyY21zX3Vjb2RlX3dyaXRlKHdsY19odywgYmNtNDN4eF8yNF9sY24sCi0JCQkJCWJjbTQzeHhfMjRfbGNuc3opOwotCQkJd2xjX2h3LT51Y29kZV9sb2FkZWQgPSB0cnVlOwotCQl9IGVsc2UgewotCQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICIlczogd2wlZDogdW5zdXBwb3J0ZWQgcGh5IGluICIKLQkJCQkgICJjb3JlcmV2ICVkXG4iLAotCQkJCSAgX19mdW5jX18sIHdsY19ody0+dW5pdCwgd2xjX2h3LT5jb3JlcmV2KTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgYnJjbXNfdWNvZGVfd3JpdGUoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIGNvbnN0IHUzMiB1Y29kZVtdLAotCQkJICAgICAgY29uc3QgdWludCBuYnl0ZXMpIHsKLQlkMTFyZWdzX3QgKnJlZ3MgPSB3bGNfaHctPnJlZ3M7Ci0JdWludCBpOwotCXVpbnQgY291bnQ7Ci0KLQlCQ01NU0cod2xjX2h3LT53bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjX2h3LT51bml0KTsKLQotCWNvdW50ID0gKG5ieXRlcyAvIHNpemVvZih1MzIpKTsKLQotCVdfUkVHKCZyZWdzLT5vYmphZGRyLCAoT0JKQUREUl9BVVRPX0lOQyB8IE9CSkFERFJfVUNNX1NFTCkpOwotCSh2b2lkKVJfUkVHKCZyZWdzLT5vYmphZGRyKTsKLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJV19SRUcoJnJlZ3MtPm9iamRhdGEsIHVjb2RlW2ldKTsKLX0KLQotc3RhdGljIHZvaWQgYnJjbXNfY193cml0ZV9pbml0cyhzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywKLQkJCSAgICBjb25zdCBzdHJ1Y3QgZDExaW5pdCAqaW5pdHMpCi17Ci0JaW50IGk7Ci0Jdm9sYXRpbGUgdTggKmJhc2U7Ci0KLQlCQ01NU0cod2xjX2h3LT53bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjX2h3LT51bml0KTsKLQotCWJhc2UgPSAodm9sYXRpbGUgdTggKil3bGNfaHctPnJlZ3M7Ci0KLQlmb3IgKGkgPSAwOyBpbml0c1tpXS5hZGRyICE9IDB4ZmZmZjsgaSsrKSB7Ci0JCWlmIChpbml0c1tpXS5zaXplID09IDIpCi0JCQlXX1JFRygodTE2ICopKGJhc2UgKyBpbml0c1tpXS5hZGRyKSwKLQkJCSAgICAgIGluaXRzW2ldLnZhbHVlKTsKLQkJZWxzZSBpZiAoaW5pdHNbaV0uc2l6ZSA9PSA0KQotCQkJV19SRUcoKHUzMiAqKShiYXNlICsgaW5pdHNbaV0uYWRkciksCi0JCQkgICAgICBpbml0c1tpXS52YWx1ZSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBicmNtc19jX3Vjb2RlX3R4YW50X3NldChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odykKLXsKLQl1MTYgcGh5Y3RsOwotCXUxNiBwaHl0eGFudCA9IHdsY19ody0+Ym1hY19waHl0eGFudDsKLQl1MTYgbWFzayA9IFBIWV9UWENfQU5UX01BU0s7Ci0KLQkvKiBzZXQgdGhlIFByb2JlIFJlc3BvbnNlIGZyYW1lIHBoeSBjb250cm9sIHdvcmQgKi8KLQlwaHljdGwgPSBicmNtc19iX3JlYWRfc2htKHdsY19odywgTV9DVFhQUlNfQkxLICsgQ19DVFhfUENUTFdEX1BPUyk7Ci0JcGh5Y3RsID0gKHBoeWN0bCAmIH5tYXNrKSB8IHBoeXR4YW50OwotCWJyY21zX2Jfd3JpdGVfc2htKHdsY19odywgTV9DVFhQUlNfQkxLICsgQ19DVFhfUENUTFdEX1BPUywgcGh5Y3RsKTsKLQotCS8qIHNldCB0aGUgUmVzcG9uc2UgKEFDSy9DVFMpIGZyYW1lIHBoeSBjb250cm9sIHdvcmQgKi8KLQlwaHljdGwgPSBicmNtc19iX3JlYWRfc2htKHdsY19odywgTV9SU1BfUENUTFdEKTsKLQlwaHljdGwgPSAocGh5Y3RsICYgfm1hc2spIHwgcGh5dHhhbnQ7Ci0JYnJjbXNfYl93cml0ZV9zaG0od2xjX2h3LCBNX1JTUF9QQ1RMV0QsIHBoeWN0bCk7Ci19Ci0KLXZvaWQgYnJjbXNfYl90eGFudF9zZXQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHUxNiBwaHl0eGFudCkKLXsKLQkvKiB1cGRhdGUgc3cgc3RhdGUgKi8KLQl3bGNfaHctPmJtYWNfcGh5dHhhbnQgPSBwaHl0eGFudDsKLQotCS8qIHB1c2ggdG8gdWNvZGUgaWYgdXAgKi8KLQlpZiAoIXdsY19ody0+dXApCi0JCXJldHVybjsKLQlicmNtc19jX3Vjb2RlX3R4YW50X3NldCh3bGNfaHcpOwotCi19Ci0KLXUxNiBicmNtc19iX2dldF90eGFudChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odykKLXsKLQlyZXR1cm4gKHUxNikgd2xjX2h3LT53bGMtPnN0Zi0+dHhhbnQ7Ci19Ci0KLXZvaWQgYnJjbXNfYl9hbnRzZWxfdHlwZV9zZXQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHU4IGFudHNlbF90eXBlKQotewotCXdsY19ody0+YW50c2VsX3R5cGUgPSBhbnRzZWxfdHlwZTsKLQotCS8qIFVwZGF0ZSB0aGUgYW50c2VsIHR5cGUgZm9yIHBoeSBtb2R1bGUgdG8gdXNlICovCi0Jd2xjX3BoeV9hbnRzZWxfdHlwZV9zZXQod2xjX2h3LT5iYW5kLT5waSwgYW50c2VsX3R5cGUpOwotfQotCi12b2lkIGJyY21zX2JfZmlmb2Vycm9ycyhzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odykKLXsKLQlib29sIGZhdGFsID0gZmFsc2U7Ci0JdWludCB1bml0OwotCXVpbnQgaW50c3RhdHVzLCBpZHg7Ci0JZDExcmVnc190ICpyZWdzID0gd2xjX2h3LT5yZWdzOwotCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSB3bGNfaHctPndsYy0+d2lwaHk7Ci0KLQl1bml0ID0gd2xjX2h3LT51bml0OwotCi0JZm9yIChpZHggPSAwOyBpZHggPCBORklGTzsgaWR4KyspIHsKLQkJLyogcmVhZCBpbnRzdGF0dXMgcmVnaXN0ZXIgYW5kIGlnbm9yZSBhbnkgbm9uLWVycm9yIGJpdHMgKi8KLQkJaW50c3RhdHVzID0KLQkJICAgIFJfUkVHKCZyZWdzLT5pbnRjdHJscmVnc1tpZHhdLmludHN0YXR1cykgJiBJX0VSUk9SUzsKLQkJaWYgKCFpbnRzdGF0dXMpCi0JCQljb250aW51ZTsKLQotCQlCQ01NU0cod2xjX2h3LT53bGMtPndpcGh5LCAid2wlZDogaW50c3RhdHVzJWQgMHgleFxuIiwKLQkJCXVuaXQsIGlkeCwgaW50c3RhdHVzKTsKLQotCQlpZiAoaW50c3RhdHVzICYgSV9STykgewotCQkJd2lwaHlfZXJyKHdpcGh5LCAid2wlZDogZmlmbyAlZDogcmVjZWl2ZSBmaWZvICIKLQkJCQkgICJvdmVyZmxvd1xuIiwgdW5pdCwgaWR4KTsKLQkJCWZhdGFsID0gdHJ1ZTsKLQkJfQotCi0JCWlmIChpbnRzdGF0dXMgJiBJX1BDKSB7Ci0JCQl3aXBoeV9lcnIod2lwaHksICJ3bCVkOiBmaWZvICVkOiBkZXNjcmlwdG9yIGVycm9yXG4iLAotCQkJCSB1bml0LCBpZHgpOwotCQkJZmF0YWwgPSB0cnVlOwotCQl9Ci0KLQkJaWYgKGludHN0YXR1cyAmIElfUEQpIHsKLQkJCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6IGZpZm8gJWQ6IGRhdGEgZXJyb3JcbiIsIHVuaXQsCi0JCQkJICBpZHgpOwotCQkJZmF0YWwgPSB0cnVlOwotCQl9Ci0KLQkJaWYgKGludHN0YXR1cyAmIElfREUpIHsKLQkJCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6IGZpZm8gJWQ6IGRlc2NyaXB0b3IgcHJvdG9jb2wgIgotCQkJCSAgImVycm9yXG4iLCB1bml0LCBpZHgpOwotCQkJZmF0YWwgPSB0cnVlOwotCQl9Ci0KLQkJaWYgKGludHN0YXR1cyAmIElfUlUpIHsKLQkJCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6IGZpZm8gJWQ6IHJlY2VpdmUgZGVzY3JpcHRvciAiCi0JCQkJICAidW5kZXJmbG93XG4iLCBpZHgsIHVuaXQpOwotCQl9Ci0KLQkJaWYgKGludHN0YXR1cyAmIElfWFUpIHsKLQkJCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6IGZpZm8gJWQ6IHRyYW5zbWl0IGZpZm8gIgotCQkJCSAgInVuZGVyZmxvd1xuIiwgaWR4LCB1bml0KTsKLQkJCWZhdGFsID0gdHJ1ZTsKLQkJfQotCi0JCWlmIChmYXRhbCkgewotCQkJYnJjbXNfY19mYXRhbF9lcnJvcih3bGNfaHctPndsYyk7CS8qIGJpZyBoYW1tZXIgKi8KLQkJCWJyZWFrOwotCQl9IGVsc2UKLQkJCVdfUkVHKCZyZWdzLT5pbnRjdHJscmVnc1tpZHhdLmludHN0YXR1cywKLQkJCSAgICAgIGludHN0YXR1cyk7Ci0JfQotfQotCi12b2lkIGJyY21zX2NfaW50cnNvbihzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0Jc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcgPSB3bGMtPmh3OwotCXdsYy0+bWFjaW50bWFzayA9IHdsYy0+ZGVmbWFjaW50bWFzazsKLQlXX1JFRygmd2xjX2h3LT5yZWdzLT5tYWNpbnRtYXNrLCB3bGMtPm1hY2ludG1hc2spOwotfQotCi0vKiBjYWxsYmFjayBmb3Igc2l1dGlscy5jLCB3aGljaCBoYXMgb25seSB3bGMgaGFuZGxlciwgbm8gd2wKLSAqIHRoZXkgYm90aCBjaGVjayB1cCwgbm90IG9ubHkgYmVjYXVzZSB0aGVyZSBpcyBubyBuZWVkIHRvIG9mZi9yZXN0b3JlIGQxMSBpbnRlcnJ1cHQKLSAqICBidXQgYWxzbyBiZWNhdXNlIHBlci1wb3J0IGNvZGUgbWF5IHJlcXVpcmUgc3luYyB3aXRoIHZhbGlkIGludGVycnVwdC4KLSAqLwotCi1zdGF0aWMgdTMyIGJyY21zX2Nfd2xpbnRyc29mZihzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0JaWYgKCF3bGMtPmh3LT51cCkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gYnJjbXNfaW50cnNvZmYod2xjLT53bCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21zX2Nfd2xpbnRyc3Jlc3RvcmUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB1MzIgbWFjaW50bWFzaykKLXsKLQlpZiAoIXdsYy0+aHctPnVwKQotCQlyZXR1cm47Ci0KLQlicmNtc19pbnRyc3Jlc3RvcmUod2xjLT53bCwgbWFjaW50bWFzayk7Ci19Ci0KLXUzMiBicmNtc19jX2ludHJzb2ZmKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odyA9IHdsYy0+aHc7Ci0JdTMyIG1hY2ludG1hc2s7Ci0KLQlpZiAoIXdsY19ody0+Y2xrKQotCQlyZXR1cm4gMDsKLQotCW1hY2ludG1hc2sgPSB3bGMtPm1hY2ludG1hc2s7CS8qIGlzciBjYW4gc3RpbGwgaGFwcGVuICovCi0KLQlXX1JFRygmd2xjX2h3LT5yZWdzLT5tYWNpbnRtYXNrLCAwKTsKLQkodm9pZClSX1JFRygmd2xjX2h3LT5yZWdzLT5tYWNpbnRtYXNrKTsJLyogc3luYyByZWFkYmFjayAqLwotCXVkZWxheSgxKTsJCS8qIGVuc3VyZSBpbnQgbGluZSBpcyBubyBsb25nZXIgZHJpdmVuICovCi0Jd2xjLT5tYWNpbnRtYXNrID0gMDsKLQotCS8qIHJldHVybiBwcmV2aW91cyBtYWNpbnRtYXNrOyByZXNvbHZlIHJhY2UgYmV0d2VlbiB1cyBhbmQgb3VyIGlzciAqLwotCXJldHVybiB3bGMtPm1hY2ludHN0YXR1cyA/IDAgOiBtYWNpbnRtYXNrOwotfQotCi12b2lkIGJyY21zX2NfaW50cnNyZXN0b3JlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdTMyIG1hY2ludG1hc2spCi17Ci0Jc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcgPSB3bGMtPmh3OwotCWlmICghd2xjX2h3LT5jbGspCi0JCXJldHVybjsKLQotCXdsYy0+bWFjaW50bWFzayA9IG1hY2ludG1hc2s7Ci0JV19SRUcoJndsY19ody0+cmVncy0+bWFjaW50bWFzaywgd2xjLT5tYWNpbnRtYXNrKTsKLX0KLQotc3RhdGljIHZvaWQgYnJjbXNfYl9tdXRlKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCBib29sIG9uLCBtYm9vbCBmbGFncykKLXsKLQl1OCBudWxsX2V0aGVyX2FkZHJbRVRIX0FMRU5dID0gezAsIDAsIDAsIDAsIDAsIDB9OwotCi0JaWYgKG9uKSB7Ci0JCS8qIHN1c3BlbmQgdHggZmlmb3MgKi8KLQkJYnJjbXNfYl90eF9maWZvX3N1c3BlbmQod2xjX2h3LCBUWF9EQVRBX0ZJRk8pOwotCQlicmNtc19iX3R4X2ZpZm9fc3VzcGVuZCh3bGNfaHcsIFRYX0NUTF9GSUZPKTsKLQkJYnJjbXNfYl90eF9maWZvX3N1c3BlbmQod2xjX2h3LCBUWF9BQ19CS19GSUZPKTsKLQkJYnJjbXNfYl90eF9maWZvX3N1c3BlbmQod2xjX2h3LCBUWF9BQ19WSV9GSUZPKTsKLQotCQkvKiB6ZXJvIHRoZSBhZGRyZXNzIG1hdGNoIHJlZ2lzdGVyIHNvIHdlIGRvIG5vdCBzZW5kIEFDS3MgKi8KLQkJYnJjbXNfYl9zZXRfYWRkcm1hdGNoKHdsY19odywgUkNNX01BQ19PRkZTRVQsCi0JCQkJICAgICAgIG51bGxfZXRoZXJfYWRkcik7Ci0JfSBlbHNlIHsKLQkJLyogcmVzdW1lIHR4IGZpZm9zICovCi0JCWlmICghd2xjX2h3LT53bGMtPnR4X3N1c3BlbmRlZCkgewotCQkJYnJjbXNfYl90eF9maWZvX3Jlc3VtZSh3bGNfaHcsIFRYX0RBVEFfRklGTyk7Ci0JCX0KLQkJYnJjbXNfYl90eF9maWZvX3Jlc3VtZSh3bGNfaHcsIFRYX0NUTF9GSUZPKTsKLQkJYnJjbXNfYl90eF9maWZvX3Jlc3VtZSh3bGNfaHcsIFRYX0FDX0JLX0ZJRk8pOwotCQlicmNtc19iX3R4X2ZpZm9fcmVzdW1lKHdsY19odywgVFhfQUNfVklfRklGTyk7Ci0KLQkJLyogUmVzdG9yZSBhZGRyZXNzICovCi0JCWJyY21zX2Jfc2V0X2FkZHJtYXRjaCh3bGNfaHcsIFJDTV9NQUNfT0ZGU0VULAotCQkJCSAgICAgICB3bGNfaHctPmV0aGVyYWRkcik7Ci0JfQotCi0Jd2xjX3BoeV9tdXRlX3VwZCh3bGNfaHctPmJhbmQtPnBpLCBvbiwgZmxhZ3MpOwotCi0JaWYgKG9uKQotCQlicmNtc19jX3Vjb2RlX211dGVfb3ZlcnJpZGVfc2V0KHdsY19odyk7Ci0JZWxzZQotCQlicmNtc19jX3Vjb2RlX211dGVfb3ZlcnJpZGVfY2xlYXIod2xjX2h3KTsKLX0KLQotaW50IGJyY21zX2JfeG10Zmlmb19zel9nZXQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHVpbnQgZmlmbywKLQkJCSAgIHVpbnQgKmJsb2NrcykKLXsKLQlpZiAoZmlmbyA+PSBORklGTykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkqYmxvY2tzID0gd2xjX2h3LT54bXRmaWZvX3N6W2ZpZm9dOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGJyY21zX2JfdHhfZmlmb19zdXNwZW5kZWQ6Ci0gKiBDaGVjayB0aGUgTUFDJ3MgdHggc3VzcGVuZCBzdGF0dXMgZm9yIGEgdHggZmlmby4KLSAqCi0gKiBXaGVuIHRoZSBNQUMgYWNrbm93bGVkZ2VzIGEgdHggc3VzcGVuZCwgaXQgaW5kaWNhdGVzIHRoYXQgbm8gbW9yZQotICogcGFja2V0cyB3aWxsIGJlIHRyYW5zbWl0dGVkIG91dCB0aGUgcmFkaW8uIFRoaXMgaXMgaW5kZXBlbmRlbnQgb2YKLSAqIERNQSBjaGFubmVsIHN1c3BlbnNpb24tLS10aGUgRE1BIG1heSBoYXZlIGZpbmlzaGVkIHN1c3BlbmRpbmcsIG9yIG1heSBzdGlsbAotICogYmUgcHVsbGluZyBkYXRhIGludG8gYSB0eCBmaWZvLCBieSB0aGUgdGltZSB0aGUgTUFDIGFja3MgdGhlIHN1c3BlbmQKLSAqIHJlcXVlc3QuCi0gKi8KLXN0YXRpYyBib29sIGJyY21zX2JfdHhfZmlmb19zdXNwZW5kZWQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsCi0JCQkJICAgICAgdWludCB0eF9maWZvKQotewotCS8qIGNoZWNrIHRoYXQgYSBzdXNwZW5kIGhhcyBiZWVuIHJlcXVlc3RlZCBhbmQgaXMgbm8gbG9uZ2VyIHBlbmRpbmcgKi8KLQotCS8qCi0JICogZm9yIERNQSBtb2RlLCB0aGUgc3VzcGVuZCByZXF1ZXN0IGlzIHNldCBpbiB4bXRjb250cm9sIG9mIHRoZSBETUEgZW5naW5lLAotCSAqIGFuZCB0aGUgdHggZmlmbyBzdXNwZW5kIGF0IHRoZSBsb3dlciBlbmQgb2YgdGhlIE1BQyBpcyBhY2tub3dsZWRnZWQgaW4gdGhlCi0JICogY2huc3RhdHVzIHJlZ2lzdGVyLgotCSAqIFRoZSB0eCBmaWZvIHN1c3BlbmQgY29tcGxldGlvbiBpcyBpbmRlcGVuZGVudCBvZiB0aGUgRE1BIHN1c3BlbmQgY29tcGxldGlvbiBhbmQKLQkgKiAgIG1heSBiZSBhY2tlZCBiZWZvcmUgb3IgYWZ0ZXIgdGhlIERNQSBpcyBzdXNwZW5kZWQuCi0JICovCi0JaWYgKGRtYV90eHN1c3BlbmRlZCh3bGNfaHctPmRpW3R4X2ZpZm9dKSAmJgotCSAgICAoUl9SRUcoJndsY19ody0+cmVncy0+Y2huc3RhdHVzKSAmCi0JICAgICAoMSA8PCB0eF9maWZvKSkgPT0gMCkKLQkJcmV0dXJuIHRydWU7Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21zX2JfdHhfZmlmb19zdXNwZW5kKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LAotCQkJCSAgICB1aW50IHR4X2ZpZm8pCi17Ci0JdTggZmlmbyA9IDEgPDwgdHhfZmlmbzsKLQotCS8qIFR3byBjbGllbnRzIG9mIHRoaXMgY29kZSwgMTFoIFF1aWV0IHBlcmlvZCBhbmQgc2Nhbm5pbmcuICovCi0KLQkvKiBvbmx5IHN1c3BlbmQgaWYgbm90IGFscmVhZHkgc3VzcGVuZGVkICovCi0JaWYgKCh3bGNfaHctPnN1c3BlbmRlZF9maWZvcyAmIGZpZm8pID09IGZpZm8pCi0JCXJldHVybjsKLQotCS8qIGZvcmNlIHRoZSBjb3JlIGF3YWtlIG9ubHkgaWYgbm90IGFscmVhZHkgKi8KLQlpZiAod2xjX2h3LT5zdXNwZW5kZWRfZmlmb3MgPT0gMCkKLQkJYnJjbXNfY191Y29kZV93YWtlX292ZXJyaWRlX3NldCh3bGNfaHcsCi0JCQkJCQlCUkNNU19XQUtFX09WRVJSSURFX1RYRklGTyk7Ci0KLQl3bGNfaHctPnN1c3BlbmRlZF9maWZvcyB8PSBmaWZvOwotCi0JaWYgKHdsY19ody0+ZGlbdHhfZmlmb10pIHsKLQkJLyogU3VzcGVuZGluZyBBTVBEVSB0cmFuc21pc3Npb25zIGluIHRoZSBtaWRkbGUgY2FuIGNhdXNlIHVuZGVyZmxvdwotCQkgKiB3aGljaCBtYXkgcmVzdWx0IGluIG1pc21hdGNoIGJldHdlZW4gdWNvZGUgYW5kIGRyaXZlcgotCQkgKiBzbyBzdXNwZW5kIHRoZSBtYWMgYmVmb3JlIHN1c3BlbmRpbmcgdGhlIEZJRk8KLQkJICovCi0JCWlmIChCUkNNU19QSFlfMTFOX0NBUCh3bGNfaHctPmJhbmQpKQotCQkJYnJjbXNfY19zdXNwZW5kX21hY19hbmRfd2FpdCh3bGNfaHctPndsYyk7Ci0KLQkJZG1hX3R4c3VzcGVuZCh3bGNfaHctPmRpW3R4X2ZpZm9dKTsKLQotCQlpZiAoQlJDTVNfUEhZXzExTl9DQVAod2xjX2h3LT5iYW5kKSkKLQkJCWJyY21zX2NfZW5hYmxlX21hYyh3bGNfaHctPndsYyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBicmNtc19iX3R4X2ZpZm9fcmVzdW1lKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LAotCQkJCSAgIHVpbnQgdHhfZmlmbykKLXsKLQkvKiBCTUFDX05PVEU6IEJSQ01TX1RYX0ZJRk9fRU5BQiBpcyBkb25lIGluIGJyY21zX2NfZHBjKCkgZm9yIERNQSBjYXNlCi0JICogYnV0IG5lZWQgdG8gYmUgZG9uZSBoZXJlIGZvciBQSU8gb3RoZXJ3aXNlIHRoZSB3YXRjaGRvZyB3aWxsIGNhdGNoCi0JICogdGhlIGluY29uc2lzdGVuY3kgYW5kIGZpcmUKLQkgKi8KLQkvKiBUd28gY2xpZW50cyBvZiB0aGlzIGNvZGUsIDExaCBRdWlldCBwZXJpb2QgYW5kIHNjYW5uaW5nLiAqLwotCWlmICh3bGNfaHctPmRpW3R4X2ZpZm9dKQotCQlkbWFfdHhyZXN1bWUod2xjX2h3LT5kaVt0eF9maWZvXSk7Ci0KLQkvKiBhbGxvdyBjb3JlIHRvIHNsZWVwIGFnYWluICovCi0JaWYgKHdsY19ody0+c3VzcGVuZGVkX2ZpZm9zID09IDApCi0JCXJldHVybjsKLQllbHNlIHsKLQkJd2xjX2h3LT5zdXNwZW5kZWRfZmlmb3MgJj0gfigxIDw8IHR4X2ZpZm8pOwotCQlpZiAod2xjX2h3LT5zdXNwZW5kZWRfZmlmb3MgPT0gMCkKLQkJCWJyY21zX2NfdWNvZGVfd2FrZV9vdmVycmlkZV9jbGVhcih3bGNfaHcsCi0JCQkJCQlCUkNNU19XQUtFX09WRVJSSURFX1RYRklGTyk7Ci0JfQotfQotCi0vKgotICogUmVhZCBhbmQgY2xlYXIgbWFjaW50bWFzayBhbmQgbWFjaW50c3RhdHVzIGFuZCBpbnRzdGF0dXMgcmVnaXN0ZXJzLgotICogVGhpcyByb3V0aW5lIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIG9mZgotICogUmV0dXJuOgotICogICAtMSBpZiBERVZJQ0VSRU1PVkVEKHdsYykgZXZhbHVhdGVzIHRvIHRydWU7Ci0gKiAgIDAgaWYgdGhlIGludGVycnVwdCBpcyBub3QgZm9yIHVzLCBvciB3ZSBhcmUgaW4gc29tZSBzcGVjaWFsIGNhc2VzOwotICogICBkZXZpY2UgaW50ZXJydXB0IHN0YXR1cyBiaXRzIG90aGVyd2lzZS4KLSAqLwotc3RhdGljIGlubGluZSB1MzIgd2xjX2ludHN0YXR1cyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGJvb2wgaW5faXNyKQotewotCXN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3ID0gd2xjLT5odzsKLQlkMTFyZWdzX3QgKnJlZ3MgPSB3bGNfaHctPnJlZ3M7Ci0JdTMyIG1hY2ludHN0YXR1czsKLQotCS8qIG1hY2ludHN0YXR1cyBpbmNsdWRlcyBhIERNQSBpbnRlcnJ1cHQgc3VtbWFyeSBiaXQgKi8KLQltYWNpbnRzdGF0dXMgPSBSX1JFRygmcmVncy0+bWFjaW50c3RhdHVzKTsKLQotCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZDogbWFjaW50c3RhdHVzOiAweCV4XG4iLCB3bGNfaHctPnVuaXQsCi0JCSBtYWNpbnRzdGF0dXMpOwotCi0JLyogZGV0ZWN0IGNhcmRidXMgcmVtb3ZlZCwgaW4gcG93ZXIgZG93bihzdXNwZW5kKSBhbmQgaW4gcmVzZXQgKi8KLQlpZiAoREVWSUNFUkVNT1ZFRCh3bGMpKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBERVZJQ0VSRU1PVkVEIHN1Y2NlZWRzIGV2ZW4gd2hlbiB0aGUgY29yZSBpcyBzdGlsbCByZXNldHRpbmcsCi0JICogaGFuZGxlIHRoYXQgY2FzZSBoZXJlLgotCSAqLwotCWlmIChtYWNpbnRzdGF0dXMgPT0gMHhmZmZmZmZmZikKLQkJcmV0dXJuIDA7Ci0KLQkvKiBkZWZlciB1bnNvbGljaXRlZCBpbnRlcnJ1cHRzICovCi0JbWFjaW50c3RhdHVzICY9IChpbl9pc3IgPyB3bGMtPm1hY2ludG1hc2sgOiB3bGMtPmRlZm1hY2ludG1hc2spOwotCi0JLyogaWYgbm90IGZvciB1cyAqLwotCWlmIChtYWNpbnRzdGF0dXMgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBpbnRlcnJ1cHRzIGFyZSBhbHJlYWR5IHR1cm5lZCBvZmYgZm9yIENGRSBidWlsZAotCSAqIENhdXRpb246IEZvciBDRkUgVHVybmluZyBvZmYgdGhlIGludGVycnVwdHMgYWdhaW4gaGFzIHNvbWUgdW5kZXNpcmVkCi0JICogY29uc2VxdWVuY2VzCi0JICovCi0JLyogdHVybiBvZmYgdGhlIGludGVycnVwdHMgKi8KLQlXX1JFRygmcmVncy0+bWFjaW50bWFzaywgMCk7Ci0JKHZvaWQpUl9SRUcoJnJlZ3MtPm1hY2ludG1hc2spOwkvKiBzeW5jIHJlYWRiYWNrICovCi0Jd2xjLT5tYWNpbnRtYXNrID0gMDsKLQotCS8qIGNsZWFyIGRldmljZSBpbnRlcnJ1cHRzICovCi0JV19SRUcoJnJlZ3MtPm1hY2ludHN0YXR1cywgbWFjaW50c3RhdHVzKTsKLQotCS8qIE1JX0RNQUlOVCBpcyBpbmRpY2F0aW9uIG9mIG5vbi16ZXJvIGludHN0YXR1cyAqLwotCWlmIChtYWNpbnRzdGF0dXMgJiBNSV9ETUFJTlQpIHsKLQkJLyoKLQkJICogb25seSBmaWZvIGludGVycnVwdCBlbmFibGVkIGlzIElfUkkgaW4KLQkJICogUlhfRklGTy4gSWYgTUlfRE1BSU5UIGlzIHNldCwgYXNzdW1lIGl0Ci0JCSAqIGlzIHNldCBhbmQgY2xlYXIgdGhlIGludGVycnVwdC4KLQkJICovCi0JCVdfUkVHKCZyZWdzLT5pbnRjdHJscmVnc1tSWF9GSUZPXS5pbnRzdGF0dXMsCi0JCSAgICAgIERFRl9SWElOVE1BU0spOwotCX0KLQotCXJldHVybiBtYWNpbnRzdGF0dXM7Ci19Ci0KLS8qIFVwZGF0ZSB3bGMtPm1hY2ludHN0YXR1cyBhbmQgd2xjLT5pbnRzdGF0dXNbXS4gKi8KLS8qIFJldHVybiB0cnVlIGlmIHRoZXkgYXJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LiBmYWxzZSBvdGhlcndpc2UgKi8KLWJvb2wgYnJjbXNfY19pbnRyc3VwZChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0JdTMyIG1hY2ludHN0YXR1czsKLQotCS8qIHJlYWQgYW5kIGNsZWFyIG1hY2ludHN0YXR1cyBhbmQgaW50c3RhdHVzIHJlZ2lzdGVycyAqLwotCW1hY2ludHN0YXR1cyA9IHdsY19pbnRzdGF0dXMod2xjLCBmYWxzZSk7Ci0KLQkvKiBkZXZpY2UgaXMgcmVtb3ZlZCAqLwotCWlmIChtYWNpbnRzdGF0dXMgPT0gMHhmZmZmZmZmZikKLQkJcmV0dXJuIGZhbHNlOwotCi0JLyogdXBkYXRlIGludGVycnVwdCBzdGF0dXMgaW4gc29mdHdhcmUgKi8KLQl3bGMtPm1hY2ludHN0YXR1cyB8PSBtYWNpbnRzdGF0dXM7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLSAqIEZpcnN0LWxldmVsIGludGVycnVwdCBwcm9jZXNzaW5nLgotICogUmV0dXJuIHRydWUgaWYgdGhpcyB3YXMgb3VyIGludGVycnVwdCwgZmFsc2Ugb3RoZXJ3aXNlLgotICogKndhbnRkcGMgd2lsbCBiZSBzZXQgdG8gdHJ1ZSBpZiBmdXJ0aGVyIGJyY21zX2NfZHBjKCkgcHJvY2Vzc2luZyBpcyByZXF1aXJlZCwKLSAqIGZhbHNlIG90aGVyd2lzZS4KLSAqLwotYm9vbCBicmNtc19jX2lzcihzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGJvb2wgKndhbnRkcGMpCi17Ci0Jc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcgPSB3bGMtPmh3OwotCXUzMiBtYWNpbnRzdGF0dXM7Ci0KLQkqd2FudGRwYyA9IGZhbHNlOwotCi0JaWYgKCF3bGNfaHctPnVwIHx8ICF3bGMtPm1hY2ludG1hc2spCi0JCXJldHVybiBmYWxzZTsKLQotCS8qIHJlYWQgYW5kIGNsZWFyIG1hY2ludHN0YXR1cyBhbmQgaW50c3RhdHVzIHJlZ2lzdGVycyAqLwotCW1hY2ludHN0YXR1cyA9IHdsY19pbnRzdGF0dXMod2xjLCB0cnVlKTsKLQotCWlmIChtYWNpbnRzdGF0dXMgPT0gMHhmZmZmZmZmZikKLQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICJERVZJQ0VSRU1PVkVEIGRldGVjdGVkIGluIHRoZSBJU1IgY29kZSIKLQkJCSAgIiBwYXRoXG4iKTsKLQotCS8qIGl0IGlzIG5vdCBmb3IgdXMgKi8KLQlpZiAobWFjaW50c3RhdHVzID09IDApCi0JCXJldHVybiBmYWxzZTsKLQotCSp3YW50ZHBjID0gdHJ1ZTsKLQotCS8qIHNhdmUgaW50ZXJydXB0IHN0YXR1cyBiaXRzICovCi0Jd2xjLT5tYWNpbnRzdGF0dXMgPSBtYWNpbnRzdGF0dXM7Ci0KLQlyZXR1cm4gdHJ1ZTsKLQotfQotCi1zdGF0aWMgYm9vbAotYnJjbXNfYl9kb3R4c3RhdHVzKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCBzdHJ1Y3QgdHhfc3RhdHVzICp0eHMsCi0JCSAgIHUzMiBzMikKLXsKLQkvKiBkaXNjYXJkIGludGVybWVkaWF0ZSBpbmRpY2F0aW9ucyBmb3IgdWNvZGUgd2l0aCBvbmUgbGVnaXRpbWF0ZSBjYXNlOgotCSAqICAgZS5nLiBpZiAidXNlUlRTIiBpcyBzZXQuIHVjb2RlIGRpZCBhIHN1Y2Nlc3NmdWwgcnRzL2N0cyBleGNoYW5nZSwgYnV0IHRoZSBzdWJzZXF1ZW50Ci0JICogICB0eCBvZiBEQVRBIGZhaWxlZC4gc28gaXQgd2lsbCBzdGFydCBydHMvY3RzIGZyb20gdGhlIGJlZ2lubmluZyAocmVzZXR0aW5nIHRoZSBydHMKLQkgKiAgIHRyYW5zbWlzc2lvbiBjb3VudCkKLQkgKi8KLQlpZiAoISh0eHMtPnN0YXR1cyAmIFRYX1NUQVRVU19BTVBEVSkKLQkgICAgJiYgKHR4cy0+c3RhdHVzICYgVFhfU1RBVFVTX0lOVEVSTUVESUFURSkpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXJldHVybiBicmNtc19jX2RvdHhzdGF0dXMod2xjX2h3LT53bGMsIHR4cywgczIpOwotfQotCi0vKiBwcm9jZXNzIHR4IGNvbXBsZXRpb24gZXZlbnRzIGluIEJNQUMKLSAqIFJldHVybiB0cnVlIGlmIG1vcmUgdHggc3RhdHVzIG5lZWQgdG8gYmUgcHJvY2Vzc2VkLiBmYWxzZSBvdGhlcndpc2UuCi0gKi8KLXN0YXRpYyBib29sCi1icmNtc19iX3R4c3RhdHVzKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCBib29sIGJvdW5kLCBib29sICpmYXRhbCkKLXsKLQlib29sIG1vcmVwZW5kaW5nID0gZmFsc2U7Ci0Jc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjID0gd2xjX2h3LT53bGM7Ci0JZDExcmVnc190ICpyZWdzOwotCXN0cnVjdCB0eF9zdGF0dXMgdHhzdGF0dXMsICp0eHM7Ci0JdTMyIHMxLCBzMjsKLQl1aW50IG4gPSAwOwotCS8qCi0JICogUGFyYW0gJ21heF90eF9udW0nIGluZGljYXRlcyBtYXguICMgdHggc3RhdHVzIHRvIHByb2Nlc3MgYmVmb3JlCi0JICogYnJlYWsgb3V0LgotCSAqLwotCXVpbnQgbWF4X3R4X251bSA9IGJvdW5kID8gd2xjLT5wdWItPnR1bmFibGVzLT50eHNibmQgOiAtMTsKLQotCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjX2h3LT51bml0KTsKLQotCXR4cyA9ICZ0eHN0YXR1czsKLQlyZWdzID0gd2xjX2h3LT5yZWdzOwotCXdoaWxlICghKCpmYXRhbCkKLQkgICAgICAgJiYgKHMxID0gUl9SRUcoJnJlZ3MtPmZybXR4c3RhdHVzKSkgJiBUWFNfVikgewotCi0JCWlmIChzMSA9PSAweGZmZmZmZmZmKSB7Ci0JCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIndsJWQ6ICVzOiBkZWFkIGNoaXBcbiIsCi0JCQkJd2xjX2h3LT51bml0LCBfX2Z1bmNfXyk7Ci0JCQlyZXR1cm4gbW9yZXBlbmRpbmc7Ci0JCX0KLQotCQkJczIgPSBSX1JFRygmcmVncy0+ZnJtdHhzdGF0dXMyKTsKLQotCQl0eHMtPnN0YXR1cyA9IHMxICYgVFhTX1NUQVRVU19NQVNLOwotCQl0eHMtPmZyYW1laWQgPSAoczEgJiBUWFNfRklEX01BU0spID4+IFRYU19GSURfU0hJRlQ7Ci0JCXR4cy0+c2VxdWVuY2UgPSBzMiAmIFRYU19TRVFfTUFTSzsKLQkJdHhzLT5waHllcnIgPSAoczIgJiBUWFNfUFRYX01BU0spID4+IFRYU19QVFhfU0hJRlQ7Ci0JCXR4cy0+bGFzdHR4dGltZSA9IDA7Ci0KLQkJKmZhdGFsID0gYnJjbXNfYl9kb3R4c3RhdHVzKHdsY19odywgdHhzLCBzMik7Ci0KLQkJLyogIWdpdmUgb3RoZXJzIHNvbWUgdGltZSB0byBydW4hICovCi0JCWlmICgrK24gPj0gbWF4X3R4X251bSkKLQkJCWJyZWFrOwotCX0KLQotCWlmICgqZmF0YWwpCi0JCXJldHVybiAwOwotCi0JaWYgKG4gPj0gbWF4X3R4X251bSkKLQkJbW9yZXBlbmRpbmcgPSB0cnVlOwotCi0JaWYgKCFwa3RxX2VtcHR5KCZ3bGMtPnBrdF9xdWV1ZS0+cSkpCi0JCWJyY21zX2Nfc2VuZF9xKHdsYyk7Ci0KLQlyZXR1cm4gbW9yZXBlbmRpbmc7Ci19Ci0KLXZvaWQgYnJjbXNfY19zdXNwZW5kX21hY19hbmRfd2FpdChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0Jc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcgPSB3bGMtPmh3OwotCWQxMXJlZ3NfdCAqcmVncyA9IHdsY19ody0+cmVnczsKLQl1MzIgbWMsIG1pOwotCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSB3bGMtPndpcGh5OwotCi0JQkNNTVNHKHdsYy0+d2lwaHksICJ3bCVkOiBiYW5kdW5pdCAlZFxuIiwgd2xjX2h3LT51bml0LAotCQl3bGNfaHctPmJhbmQtPmJhbmR1bml0KTsKLQotCS8qCi0JICogVHJhY2sgb3ZlcmxhcHBpbmcgc3VzcGVuZCByZXF1ZXN0cwotCSAqLwotCXdsY19ody0+bWFjX3N1c3BlbmRfZGVwdGgrKzsKLQlpZiAod2xjX2h3LT5tYWNfc3VzcGVuZF9kZXB0aCA+IDEpCi0JCXJldHVybjsKLQotCS8qIGZvcmNlIHRoZSBjb3JlIGF3YWtlICovCi0JYnJjbXNfY191Y29kZV93YWtlX292ZXJyaWRlX3NldCh3bGNfaHcsIEJSQ01TX1dBS0VfT1ZFUlJJREVfTUFDU1VTUEVORCk7Ci0KLQltYyA9IFJfUkVHKCZyZWdzLT5tYWNjb250cm9sKTsKLQotCWlmIChtYyA9PSAweGZmZmZmZmZmKSB7Ci0JCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6ICVzOiBkZWFkIGNoaXBcbiIsIHdsY19ody0+dW5pdCwKLQkJCSAgX19mdW5jX18pOwotCQlicmNtc19kb3duKHdsYy0+d2wpOwotCQlyZXR1cm47Ci0JfQotCVdBUk5fT04obWMgJiBNQ1RMX1BTTV9KTVBfMCk7Ci0JV0FSTl9PTighKG1jICYgTUNUTF9QU01fUlVOKSk7Ci0JV0FSTl9PTighKG1jICYgTUNUTF9FTl9NQUMpKTsKLQotCW1pID0gUl9SRUcoJnJlZ3MtPm1hY2ludHN0YXR1cyk7Ci0JaWYgKG1pID09IDB4ZmZmZmZmZmYpIHsKLQkJd2lwaHlfZXJyKHdpcGh5LCAid2wlZDogJXM6IGRlYWQgY2hpcFxuIiwgd2xjX2h3LT51bml0LAotCQkJICBfX2Z1bmNfXyk7Ci0JCWJyY21zX2Rvd24od2xjLT53bCk7Ci0JCXJldHVybjsKLQl9Ci0JV0FSTl9PTihtaSAmIE1JX01BQ1NTUE5ERCk7Ci0KLQlicmNtc19iX21jdHJsKHdsY19odywgTUNUTF9FTl9NQUMsIDApOwotCi0JU1BJTldBSVQoIShSX1JFRygmcmVncy0+bWFjaW50c3RhdHVzKSAmIE1JX01BQ1NTUE5ERCksCi0JCSBCUkNNU19NQVhfTUFDX1NVU1BFTkQpOwotCi0JaWYgKCEoUl9SRUcoJnJlZ3MtPm1hY2ludHN0YXR1cykgJiBNSV9NQUNTU1BOREQpKSB7Ci0JCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6IHdsY19zdXNwZW5kX21hY19hbmRfd2FpdDogd2FpdGVkICVkIHVTIgotCQkJICAiIGFuZCBNSV9NQUNTU1BOREQgaXMgc3RpbGwgbm90IG9uLlxuIiwKLQkJCSAgd2xjX2h3LT51bml0LCBCUkNNU19NQVhfTUFDX1NVU1BFTkQpOwotCQl3aXBoeV9lcnIod2lwaHksICJ3bCVkOiBwc21kZWJ1ZyAweCUwOHgsIHBoeWRlYnVnIDB4JTA4eCwgIgotCQkJICAicHNtX2JyYyAweCUwNHhcbiIsIHdsY19ody0+dW5pdCwKLQkJCSAgUl9SRUcoJnJlZ3MtPnBzbWRlYnVnKSwKLQkJCSAgUl9SRUcoJnJlZ3MtPnBoeWRlYnVnKSwKLQkJCSAgUl9SRUcoJnJlZ3MtPnBzbV9icmMpKTsKLQl9Ci0KLQltYyA9IFJfUkVHKCZyZWdzLT5tYWNjb250cm9sKTsKLQlpZiAobWMgPT0gMHhmZmZmZmZmZikgewotCQl3aXBoeV9lcnIod2lwaHksICJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLCB3bGNfaHctPnVuaXQsCi0JCQkgIF9fZnVuY19fKTsKLQkJYnJjbXNfZG93bih3bGMtPndsKTsKLQkJcmV0dXJuOwotCX0KLQlXQVJOX09OKG1jICYgTUNUTF9QU01fSk1QXzApOwotCVdBUk5fT04oIShtYyAmIE1DVExfUFNNX1JVTikpOwotCVdBUk5fT04obWMgJiBNQ1RMX0VOX01BQyk7Ci19Ci0KLXZvaWQgYnJjbXNfY19lbmFibGVfbWFjKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odyA9IHdsYy0+aHc7Ci0JZDExcmVnc190ICpyZWdzID0gd2xjX2h3LT5yZWdzOwotCXUzMiBtYywgbWk7Ci0KLQlCQ01NU0cod2xjLT53aXBoeSwgIndsJWQ6IGJhbmR1bml0ICVkXG4iLCB3bGNfaHctPnVuaXQsCi0JCXdsYy0+YmFuZC0+YmFuZHVuaXQpOwotCi0JLyoKLQkgKiBUcmFjayBvdmVybGFwcGluZyBzdXNwZW5kIHJlcXVlc3RzCi0JICovCi0Jd2xjX2h3LT5tYWNfc3VzcGVuZF9kZXB0aC0tOwotCWlmICh3bGNfaHctPm1hY19zdXNwZW5kX2RlcHRoID4gMCkKLQkJcmV0dXJuOwotCi0JbWMgPSBSX1JFRygmcmVncy0+bWFjY29udHJvbCk7Ci0JV0FSTl9PTihtYyAmIE1DVExfUFNNX0pNUF8wKTsKLQlXQVJOX09OKG1jICYgTUNUTF9FTl9NQUMpOwotCVdBUk5fT04oIShtYyAmIE1DVExfUFNNX1JVTikpOwotCi0JYnJjbXNfYl9tY3RybCh3bGNfaHcsIE1DVExfRU5fTUFDLCBNQ1RMX0VOX01BQyk7Ci0JV19SRUcoJnJlZ3MtPm1hY2ludHN0YXR1cywgTUlfTUFDU1NQTkREKTsKLQotCW1jID0gUl9SRUcoJnJlZ3MtPm1hY2NvbnRyb2wpOwotCVdBUk5fT04obWMgJiBNQ1RMX1BTTV9KTVBfMCk7Ci0JV0FSTl9PTighKG1jICYgTUNUTF9FTl9NQUMpKTsKLQlXQVJOX09OKCEobWMgJiBNQ1RMX1BTTV9SVU4pKTsKLQotCW1pID0gUl9SRUcoJnJlZ3MtPm1hY2ludHN0YXR1cyk7Ci0JV0FSTl9PTihtaSAmIE1JX01BQ1NTUE5ERCk7Ci0KLQlicmNtc19jX3Vjb2RlX3dha2Vfb3ZlcnJpZGVfY2xlYXIod2xjX2h3LAotCQkJCQkgIEJSQ01TX1dBS0VfT1ZFUlJJREVfTUFDU1VTUEVORCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21zX3VwZF9vZmRtX3BjdGwxX3RhYmxlKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KQotewotCXU4IHJhdGU7Ci0JdTggcmF0ZXNbOF0gPSB7Ci0JCUJSQ01fUkFURV82TSwgQlJDTV9SQVRFXzlNLCBCUkNNX1JBVEVfMTJNLCBCUkNNX1JBVEVfMThNLAotCQlCUkNNX1JBVEVfMjRNLCBCUkNNX1JBVEVfMzZNLCBCUkNNX1JBVEVfNDhNLCBCUkNNX1JBVEVfNTRNCi0JfTsKLQl1MTYgZW50cnlfcHRyOwotCXUxNiBwY3RsMTsKLQl1aW50IGk7Ci0KLQlpZiAoIUJSQ01TX1BIWV8xMU5fQ0FQKHdsY19ody0+YmFuZCkpCi0JCXJldHVybjsKLQotCS8qIHdhbGsgdGhlIHBoeSByYXRlIHRhYmxlIGFuZCB1cGRhdGUgdGhlIGVudHJpZXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyYXRlcyk7IGkrKykgewotCQlyYXRlID0gcmF0ZXNbaV07Ci0KLQkJZW50cnlfcHRyID0gYnJjbXNfYl9vZmRtX3JhdGV0YWJsZV9vZmZzZXQod2xjX2h3LCByYXRlKTsKLQotCQkvKiByZWFkIHRoZSBTSE0gUmF0ZSBUYWJsZSBlbnRyeSBPRkRNIFBDVEwxIHZhbHVlcyAqLwotCQlwY3RsMSA9Ci0JCSAgICBicmNtc19iX3JlYWRfc2htKHdsY19odywgZW50cnlfcHRyICsgTV9SVF9PRkRNX1BDVEwxX1BPUyk7Ci0KLQkJLyogbW9kaWZ5IHRoZSB2YWx1ZSAqLwotCQlwY3RsMSAmPSB+UEhZX1RYQzFfTU9ERV9NQVNLOwotCQlwY3RsMSB8PSAod2xjX2h3LT5od19zdGZfc3Nfb3Btb2RlIDw8IFBIWV9UWEMxX01PREVfU0hJRlQpOwotCi0JCS8qIFVwZGF0ZSB0aGUgU0hNIFJhdGUgVGFibGUgZW50cnkgT0ZETSBQQ1RMMSB2YWx1ZXMgKi8KLQkJYnJjbXNfYl93cml0ZV9zaG0od2xjX2h3LCBlbnRyeV9wdHIgKyBNX1JUX09GRE1fUENUTDFfUE9TLAotCQkJCSAgIHBjdGwxKTsKLQl9Ci19Ci0KLXN0YXRpYyB1MTYgYnJjbXNfYl9vZmRtX3JhdGV0YWJsZV9vZmZzZXQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsCi0JCQkJCSB1OCByYXRlKQotewotCXVpbnQgaTsKLQl1OCBwbGNwX3JhdGUgPSAwOwotCXN0cnVjdCBwbGNwX3NpZ25hbF9yYXRlX2xvb2t1cCB7Ci0JCXU4IHJhdGU7Ci0JCXU4IHNpZ25hbF9yYXRlOwotCX07Ci0JLyogT0ZETSBSQVRFIHN1Yi1maWVsZCBvZiBQTENQIFNJR05BTCBmaWVsZCwgcGVyIDgwMi4xMSBzZWMgMTcuMy40LjEgKi8KLQljb25zdCBzdHJ1Y3QgcGxjcF9zaWduYWxfcmF0ZV9sb29rdXAgcmF0ZV9sb29rdXBbXSA9IHsKLQkJe0JSQ01fUkFURV82TSwgMHhCfSwKLQkJe0JSQ01fUkFURV85TSwgMHhGfSwKLQkJe0JSQ01fUkFURV8xMk0sIDB4QX0sCi0JCXtCUkNNX1JBVEVfMThNLCAweEV9LAotCQl7QlJDTV9SQVRFXzI0TSwgMHg5fSwKLQkJe0JSQ01fUkFURV8zNk0sIDB4RH0sCi0JCXtCUkNNX1JBVEVfNDhNLCAweDh9LAotCQl7QlJDTV9SQVRFXzU0TSwgMHhDfQotCX07Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyYXRlX2xvb2t1cCk7IGkrKykgewotCQlpZiAocmF0ZSA9PSByYXRlX2xvb2t1cFtpXS5yYXRlKSB7Ci0JCQlwbGNwX3JhdGUgPSByYXRlX2xvb2t1cFtpXS5zaWduYWxfcmF0ZTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogRmluZCB0aGUgU0hNIHBvaW50ZXIgdG8gdGhlIHJhdGUgdGFibGUgZW50cnkgYnkgbG9va2luZyBpbiB0aGUKLQkgKiBEaXJlY3QtbWFwIFRhYmxlCi0JICovCi0JcmV0dXJuIDIgKiBicmNtc19iX3JlYWRfc2htKHdsY19odywgTV9SVF9ESVJNQVBfQSArIChwbGNwX3JhdGUgKiAyKSk7Ci19Ci0KLXZvaWQgYnJjbXNfYl9iYW5kX3N0Zl9zc19zZXQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHU4IHN0Zl9tb2RlKQotewotCXdsY19ody0+aHdfc3RmX3NzX29wbW9kZSA9IHN0Zl9tb2RlOwotCi0JaWYgKHdsY19ody0+Y2xrKQotCQlicmNtc191cGRfb2ZkbV9wY3RsMV90YWJsZSh3bGNfaHcpOwotfQotCi12b2lkCi1icmNtc19iX3JlYWRfdHNmKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCB1MzIgKnRzZl9sX3B0ciwKLQkJICB1MzIgKnRzZl9oX3B0cikKLXsKLQlkMTFyZWdzX3QgKnJlZ3MgPSB3bGNfaHctPnJlZ3M7Ci0KLQkvKiByZWFkIHRoZSB0c2YgdGltZXIgbG93LCB0aGVuIGhpZ2ggdG8gZ2V0IGFuIGF0b21pYyByZWFkICovCi0JKnRzZl9sX3B0ciA9IFJfUkVHKCZyZWdzLT50c2ZfdGltZXJsb3cpOwotCSp0c2ZfaF9wdHIgPSBSX1JFRygmcmVncy0+dHNmX3RpbWVyaGlnaCk7Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBib29sIGJyY21zX2JfdmFsaWRhdGVfY2hpcF9hY2Nlc3Moc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcpCi17Ci0JZDExcmVnc190ICpyZWdzOwotCXUzMiB3LCB2YWw7Ci0Jc3RydWN0IHdpcGh5ICp3aXBoeSA9IHdsY19ody0+d2xjLT53aXBoeTsKLQotCUJDTU1TRyh3aXBoeSwgIndsJWRcbiIsIHdsY19ody0+dW5pdCk7Ci0KLQlyZWdzID0gd2xjX2h3LT5yZWdzOwotCi0JLyogVmFsaWRhdGUgZGNoaXAgcmVnaXN0ZXIgYWNjZXNzICovCi0KLQlXX1JFRygmcmVncy0+b2JqYWRkciwgT0JKQUREUl9TSE1fU0VMIHwgMCk7Ci0JKHZvaWQpUl9SRUcoJnJlZ3MtPm9iamFkZHIpOwotCXcgPSBSX1JFRygmcmVncy0+b2JqZGF0YSk7Ci0KLQkvKiBDYW4gd2Ugd3JpdGUgYW5kIHJlYWQgYmFjayBhIDMyYml0IHJlZ2lzdGVyPyAqLwotCVdfUkVHKCZyZWdzLT5vYmphZGRyLCBPQkpBRERSX1NITV9TRUwgfCAwKTsKLQkodm9pZClSX1JFRygmcmVncy0+b2JqYWRkcik7Ci0JV19SRUcoJnJlZ3MtPm9iamRhdGEsICh1MzIpIDB4YWE1NTU1YWEpOwotCi0JV19SRUcoJnJlZ3MtPm9iamFkZHIsIE9CSkFERFJfU0hNX1NFTCB8IDApOwotCSh2b2lkKVJfUkVHKCZyZWdzLT5vYmphZGRyKTsKLQl2YWwgPSBSX1JFRygmcmVncy0+b2JqZGF0YSk7Ci0JaWYgKHZhbCAhPSAodTMyKSAweGFhNTU1NWFhKSB7Ci0JCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6IHZhbGlkYXRlX2NoaXBfYWNjZXNzOiBTSE0gPSAweCV4LCAiCi0JCQkgICJleHBlY3RlZCAweGFhNTU1NWFhXG4iLCB3bGNfaHctPnVuaXQsIHZhbCk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlXX1JFRygmcmVncy0+b2JqYWRkciwgT0JKQUREUl9TSE1fU0VMIHwgMCk7Ci0JKHZvaWQpUl9SRUcoJnJlZ3MtPm9iamFkZHIpOwotCVdfUkVHKCZyZWdzLT5vYmpkYXRhLCAodTMyKSAweDU1YWFhYTU1KTsKLQotCVdfUkVHKCZyZWdzLT5vYmphZGRyLCBPQkpBRERSX1NITV9TRUwgfCAwKTsKLQkodm9pZClSX1JFRygmcmVncy0+b2JqYWRkcik7Ci0JdmFsID0gUl9SRUcoJnJlZ3MtPm9iamRhdGEpOwotCWlmICh2YWwgIT0gKHUzMikgMHg1NWFhYWE1NSkgewotCQl3aXBoeV9lcnIod2lwaHksICJ3bCVkOiB2YWxpZGF0ZV9jaGlwX2FjY2VzczogU0hNID0gMHgleCwgIgotCQkJICAiZXhwZWN0ZWQgMHg1NWFhYWE1NVxuIiwgd2xjX2h3LT51bml0LCB2YWwpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JV19SRUcoJnJlZ3MtPm9iamFkZHIsIE9CSkFERFJfU0hNX1NFTCB8IDApOwotCSh2b2lkKVJfUkVHKCZyZWdzLT5vYmphZGRyKTsKLQlXX1JFRygmcmVncy0+b2JqZGF0YSwgdyk7Ci0KLQkvKiBjbGVhciBDRlBTdGFydCAqLwotCVdfUkVHKCZyZWdzLT50c2ZfY2Zwc3RhcnQsIDApOwotCi0JdyA9IFJfUkVHKCZyZWdzLT5tYWNjb250cm9sKTsKLQlpZiAoKHcgIT0gKE1DVExfSUhSX0VOIHwgTUNUTF9XQUtFKSkgJiYKLQkgICAgKHcgIT0gKE1DVExfSUhSX0VOIHwgTUNUTF9HTU9ERSB8IE1DVExfV0FLRSkpKSB7Ci0JCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6IHZhbGlkYXRlX2NoaXBfYWNjZXNzOiBtYWNjb250cm9sID0gIgotCQkJICAiMHgleCwgZXhwZWN0ZWQgMHgleCBvciAweCV4XG4iLCB3bGNfaHctPnVuaXQsIHcsCi0JCQkgIChNQ1RMX0lIUl9FTiB8IE1DVExfV0FLRSksCi0JCQkgIChNQ1RMX0lIUl9FTiB8IE1DVExfR01PREUgfCBNQ1RMX1dBS0UpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIFBIWVBMTF9XQUlUX1VTCTEwMDAwMAotCi12b2lkIGJyY21zX2JfY29yZV9waHlwbGxfY3RsKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCBib29sIG9uKQotewotCWQxMXJlZ3NfdCAqcmVnczsKLQl1MzIgdG1wOwotCi0JQkNNTVNHKHdsY19ody0+d2xjLT53aXBoeSwgIndsJWRcbiIsIHdsY19ody0+dW5pdCk7Ci0KLQl0bXAgPSAwOwotCXJlZ3MgPSB3bGNfaHctPnJlZ3M7Ci0KLQlpZiAob24pIHsKLQkJaWYgKCh3bGNfaHctPnNpaC0+Y2hpcCA9PSBCQ000MzEzX0NISVBfSUQpKSB7Ci0JCQlPUl9SRUcoJnJlZ3MtPmNsa19jdGxfc3QsCi0JCQkgICAgICAgKENDU19FUlNSQ19SRVFfSFQgfCBDQ1NfRVJTUkNfUkVRX0QxMVBMTCB8Ci0JCQkJQ0NTX0VSU1JDX1JFUV9QSFlQTEwpKTsKLQkJCVNQSU5XQUlUKChSX1JFRygmcmVncy0+Y2xrX2N0bF9zdCkgJgotCQkJCSAgKENDU19FUlNSQ19BVkFJTF9IVCkpICE9IChDQ1NfRVJTUkNfQVZBSUxfSFQpLAotCQkJCSBQSFlQTExfV0FJVF9VUyk7Ci0KLQkJCXRtcCA9IFJfUkVHKCZyZWdzLT5jbGtfY3RsX3N0KTsKLQkJCWlmICgodG1wICYgKENDU19FUlNSQ19BVkFJTF9IVCkpICE9Ci0JCQkgICAgKENDU19FUlNSQ19BVkFJTF9IVCkpIHsKLQkJCQl3aXBoeV9lcnIod2xjX2h3LT53bGMtPndpcGh5LCAiJXM6IHR1cm4gb24gUEhZIgotCQkJCQkgICIgUExMIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQkJfQotCQl9IGVsc2UgewotCQkJT1JfUkVHKCZyZWdzLT5jbGtfY3RsX3N0LAotCQkJICAgICAgIChDQ1NfRVJTUkNfUkVRX0QxMVBMTCB8IENDU19FUlNSQ19SRVFfUEhZUExMKSk7Ci0JCQlTUElOV0FJVCgoUl9SRUcoJnJlZ3MtPmNsa19jdGxfc3QpICYKLQkJCQkgIChDQ1NfRVJTUkNfQVZBSUxfRDExUExMIHwKLQkJCQkgICBDQ1NfRVJTUkNfQVZBSUxfUEhZUExMKSkgIT0KLQkJCQkgKENDU19FUlNSQ19BVkFJTF9EMTFQTEwgfAotCQkJCSAgQ0NTX0VSU1JDX0FWQUlMX1BIWVBMTCksIFBIWVBMTF9XQUlUX1VTKTsKLQotCQkJdG1wID0gUl9SRUcoJnJlZ3MtPmNsa19jdGxfc3QpOwotCQkJaWYgKCh0bXAgJgotCQkJICAgICAoQ0NTX0VSU1JDX0FWQUlMX0QxMVBMTCB8IENDU19FUlNSQ19BVkFJTF9QSFlQTEwpKQotCQkJICAgICE9Ci0JCQkgICAgKENDU19FUlNSQ19BVkFJTF9EMTFQTEwgfCBDQ1NfRVJTUkNfQVZBSUxfUEhZUExMKSkgewotCQkJCXdpcGh5X2Vycih3bGNfaHctPndsYy0+d2lwaHksICIlczogdHVybiBvbiAiCi0JCQkJCSAgIlBIWSBQTEwgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBTaW5jZSB0aGUgUExMIG1heSBiZSBzaGFyZWQsIG90aGVyIGNvcmVzIGNhbiBzdGlsbCBiZSByZXF1ZXN0aW5nIGl0OwotCQkgKiBzbyB3ZSdsbCBkZWFzc2VydCB0aGUgcmVxdWVzdCBidXQgbm90IHdhaXQgZm9yIHN0YXR1cyB0byBjb21wbHkuCi0JCSAqLwotCQlBTkRfUkVHKCZyZWdzLT5jbGtfY3RsX3N0LCB+Q0NTX0VSU1JDX1JFUV9QSFlQTEwpOwotCQl0bXAgPSBSX1JFRygmcmVncy0+Y2xrX2N0bF9zdCk7Ci0JfQotfQotCi12b2lkIGJyY21zX2NfY29yZWRpc2FibGUoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcpCi17Ci0JYm9vbCBkZXZfZ29uZTsKLQotCUJDTU1TRyh3bGNfaHctPndsYy0+d2lwaHksICJ3bCVkXG4iLCB3bGNfaHctPnVuaXQpOwotCi0JZGV2X2dvbmUgPSBERVZJQ0VSRU1PVkVEKHdsY19ody0+d2xjKTsKLQotCWlmIChkZXZfZ29uZSkKLQkJcmV0dXJuOwotCi0JaWYgKHdsY19ody0+bm9yZXNldCkKLQkJcmV0dXJuOwotCi0JLyogcmFkaW8gb2ZmICovCi0Jd2xjX3BoeV9zd2l0Y2hfcmFkaW8od2xjX2h3LT5iYW5kLT5waSwgT0ZGKTsKLQotCS8qIHR1cm4gb2ZmIGFuYWxvZyBjb3JlICovCi0Jd2xjX3BoeV9hbmFjb3JlKHdsY19ody0+YmFuZC0+cGksIE9GRik7Ci0KLQkvKiB0dXJuIG9mZiBQSFlQTEwgdG8gc2F2ZSBwb3dlciAqLwotCWJyY21zX2JfY29yZV9waHlwbGxfY3RsKHdsY19odywgZmFsc2UpOwotCi0JLyogTm8gbmVlZCB0byBzZXQgd2xjLT5wdWItPnJhZGlvX2FjdGl2ZSA9IE9GRgotCSAqIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBuZWVkcyBkb3duIGNhcGFiaWxpdHkgYW5kCi0JICogcmFkaW9fYWN0aXZlIGlzIGRlc2lnbmVkIGZvciBCQ01OT0RPV04uCi0JICovCi0KLQkvKiByZW1vdmUgZ3BpbyBjb250cm9scyAqLwotCWlmICh3bGNfaHctPnVjb2RlX2RiZ3NlbCkKLQkJYWlfZ3Bpb2NvbnRyb2wod2xjX2h3LT5zaWgsIH4wLCAwLCBHUElPX0RSVl9QUklPUklUWSk7Ci0KLQl3bGNfaHctPmNsayA9IGZhbHNlOwotCWFpX2NvcmVfZGlzYWJsZSh3bGNfaHctPnNpaCwgMCk7Ci0Jd2xjX3BoeV9od19jbGtfc3RhdGVfdXBkKHdsY19ody0+YmFuZC0+cGksIGZhbHNlKTsKLX0KLQotLyogcG93ZXIgYm90aCB0aGUgcGxsIGFuZCBleHRlcm5hbCBvc2NpbGxhdG9yIG9uL29mZiAqLwotc3RhdGljIHZvaWQgYnJjbXNfYl94dGFsKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCBib29sIHdhbnQpCi17Ci0JQkNNTVNHKHdsY19ody0+d2xjLT53aXBoeSwgIndsJWQ6IHdhbnQgJWRcbiIsIHdsY19ody0+dW5pdCwgd2FudCk7Ci0KLQkvKiBkb250IHBvd2VyIGRvd24gaWYgcGxsZG93biBpcyBmYWxzZSBvciB3ZSBtdXN0IHBvbGwgaHcgcmFkaW8gZGlzYWJsZSAqLwotCWlmICghd2FudCAmJiB3bGNfaHctPnBsbHJlcSkKLQkJcmV0dXJuOwotCi0JaWYgKHdsY19ody0+c2loKQotCQlhaV9jbGtjdGxfeHRhbCh3bGNfaHctPnNpaCwgWFRBTCB8IFBMTCwgd2FudCk7Ci0KLQl3bGNfaHctPnNiY2xrID0gd2FudDsKLQlpZiAoIXdsY19ody0+c2JjbGspIHsKLQkJd2xjX2h3LT5jbGsgPSBmYWxzZTsKLQkJaWYgKHdsY19ody0+YmFuZCAmJiB3bGNfaHctPmJhbmQtPnBpKQotCQkJd2xjX3BoeV9od19jbGtfc3RhdGVfdXBkKHdsY19ody0+YmFuZC0+cGksIGZhbHNlKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21zX2NfZmx1c2hxdWV1ZXMoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCXN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3ID0gd2xjLT5odzsKLQl1aW50IGk7Ci0KLQl3bGMtPnR4cGVuZDE2MTY1d2FyID0gMDsKLQotCS8qIGZyZWUgYW55IHBvc3RlZCB0eCBwYWNrZXRzICovCi0JZm9yIChpID0gMDsgaSA8IE5GSUZPOyBpKyspCi0JCWlmICh3bGNfaHctPmRpW2ldKSB7Ci0JCQlkbWFfdHhyZWNsYWltKHdsY19ody0+ZGlbaV0sIERNQV9SQU5HRV9BTEwpOwotCQkJVFhQS1RQRU5EQ0xSKHdsYywgaSk7Ci0JCQlCQ01NU0cod2xjLT53aXBoeSwgInBrdHBlbmQgZmlmbyAlZCBjbHJkXG4iLCBpKTsKLQkJfQotCi0JLyogZnJlZSBhbnkgcG9zdGVkIHJ4IHBhY2tldHMgKi8KLQlkbWFfcnhyZWNsYWltKHdsY19ody0+ZGlbUlhfRklGT10pOwotfQotCi11MTYgYnJjbXNfYl9yZWFkX3NobShzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdWludCBvZmZzZXQpCi17Ci0JcmV0dXJuIGJyY21zX2JfcmVhZF9vYmptZW0od2xjX2h3LCBvZmZzZXQsIE9CSkFERFJfU0hNX1NFTCk7Ci19Ci0KLXZvaWQgYnJjbXNfYl93cml0ZV9zaG0oc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHVpbnQgb2Zmc2V0LCB1MTYgdikKLXsKLQlicmNtc19iX3dyaXRlX29iam1lbSh3bGNfaHcsIG9mZnNldCwgdiwgT0JKQUREUl9TSE1fU0VMKTsKLX0KLQotc3RhdGljIHUxNgotYnJjbXNfYl9yZWFkX29iam1lbShzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdWludCBvZmZzZXQsIHUzMiBzZWwpCi17Ci0JZDExcmVnc190ICpyZWdzID0gd2xjX2h3LT5yZWdzOwotCXZvbGF0aWxlIHUxNiAqb2JqZGF0YV9sbyA9ICh2b2xhdGlsZSB1MTYgKikmcmVncy0+b2JqZGF0YTsKLQl2b2xhdGlsZSB1MTYgKm9iamRhdGFfaGkgPSBvYmpkYXRhX2xvICsgMTsKLQl1MTYgdjsKLQotCVdfUkVHKCZyZWdzLT5vYmphZGRyLCBzZWwgfCAob2Zmc2V0ID4+IDIpKTsKLQkodm9pZClSX1JFRygmcmVncy0+b2JqYWRkcik7Ci0JaWYgKG9mZnNldCAmIDIpIHsKLQkJdiA9IFJfUkVHKG9iamRhdGFfaGkpOwotCX0gZWxzZSB7Ci0JCXYgPSBSX1JFRyhvYmpkYXRhX2xvKTsKLQl9Ci0KLQlyZXR1cm4gdjsKLX0KLQotc3RhdGljIHZvaWQKLWJyY21zX2Jfd3JpdGVfb2JqbWVtKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCB1aW50IG9mZnNldCwgdTE2IHYsCi0JCSAgICAgdTMyIHNlbCkKLXsKLQlkMTFyZWdzX3QgKnJlZ3MgPSB3bGNfaHctPnJlZ3M7Ci0Jdm9sYXRpbGUgdTE2ICpvYmpkYXRhX2xvID0gKHZvbGF0aWxlIHUxNiAqKSZyZWdzLT5vYmpkYXRhOwotCXZvbGF0aWxlIHUxNiAqb2JqZGF0YV9oaSA9IG9iamRhdGFfbG8gKyAxOwotCi0JV19SRUcoJnJlZ3MtPm9iamFkZHIsIHNlbCB8IChvZmZzZXQgPj4gMikpOwotCSh2b2lkKVJfUkVHKCZyZWdzLT5vYmphZGRyKTsKLQlpZiAob2Zmc2V0ICYgMikgewotCQlXX1JFRyhvYmpkYXRhX2hpLCB2KTsKLQl9IGVsc2UgewotCQlXX1JFRyhvYmpkYXRhX2xvLCB2KTsKLQl9Ci19Ci0KLS8qIENvcHkgYSBidWZmZXIgdG8gc2hhcmVkIG1lbW9yeSBvZiBzcGVjaWZpZWQgdHlwZSAuCi0gKiBTSE0gJ29mZnNldCcgbmVlZHMgdG8gYmUgYW4gZXZlbiBhZGRyZXNzIGFuZAotICogQnVmZmVyIGxlbmd0aCAnbGVuJyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGJ5dGVzCi0gKiAnc2VsJyBzZWxlY3RzIHRoZSB0eXBlIG9mIG1lbW9yeQotICovCi12b2lkCi1icmNtc19iX2NvcHl0b19vYmptZW0oc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHVpbnQgb2Zmc2V0LAotCQkgICAgICBjb25zdCB2b2lkICpidWYsIGludCBsZW4sIHUzMiBzZWwpCi17Ci0JdTE2IHY7Ci0JY29uc3QgdTggKnAgPSAoY29uc3QgdTggKilidWY7Ci0JaW50IGk7Ci0KLQlpZiAobGVuIDw9IDAgfHwgKG9mZnNldCAmIDEpIHx8IChsZW4gJiAxKSkKLQkJcmV0dXJuOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7Ci0JCXYgPSBwW2ldIHwgKHBbaSArIDFdIDw8IDgpOwotCQlicmNtc19iX3dyaXRlX29iam1lbSh3bGNfaHcsIG9mZnNldCArIGksIHYsIHNlbCk7Ci0JfQotfQotCi0vKiBDb3B5IGEgcGllY2Ugb2Ygc2hhcmVkIG1lbW9yeSBvZiBzcGVjaWZpZWQgdHlwZSB0byBhIGJ1ZmZlciAuCi0gKiBTSE0gJ29mZnNldCcgbmVlZHMgdG8gYmUgYW4gZXZlbiBhZGRyZXNzIGFuZAotICogQnVmZmVyIGxlbmd0aCAnbGVuJyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGJ5dGVzCi0gKiAnc2VsJyBzZWxlY3RzIHRoZSB0eXBlIG9mIG1lbW9yeQotICovCi12b2lkCi1icmNtc19iX2NvcHlmcm9tX29iam1lbShzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdWludCBvZmZzZXQsIHZvaWQgKmJ1ZiwKLQkJCSBpbnQgbGVuLCB1MzIgc2VsKQotewotCXUxNiB2OwotCXU4ICpwID0gKHU4ICopIGJ1ZjsKLQlpbnQgaTsKLQotCWlmIChsZW4gPD0gMCB8fCAob2Zmc2V0ICYgMSkgfHwgKGxlbiAmIDEpKQotCQlyZXR1cm47Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHsKLQkJdiA9IGJyY21zX2JfcmVhZF9vYmptZW0od2xjX2h3LCBvZmZzZXQgKyBpLCBzZWwpOwotCQlwW2ldID0gdiAmIDB4RkY7Ci0JCXBbaSArIDFdID0gKHYgPj4gOCkgJiAweEZGOwotCX0KLX0KLQotdm9pZCBicmNtc19iX2NvcHlmcm9tX3ZhcnMoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIGNoYXIgKipidWYsCi0JCQkgICB1aW50ICpsZW4pCi17Ci0JQkNNTVNHKHdsY19ody0+d2xjLT53aXBoeSwgIm52cmFtIHZhcnMgdG90bGVuPSVkXG4iLAotCQl3bGNfaHctPnZhcnNfc2l6ZSk7Ci0KLQkqYnVmID0gd2xjX2h3LT52YXJzOwotCSpsZW4gPSB3bGNfaHctPnZhcnNfc2l6ZTsKLX0KLQotdm9pZCBicmNtc19iX3JldHJ5bGltaXRfdXBkKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCB1MTYgU1JMLCB1MTYgTFJMKQotewotCXdsY19ody0+U1JMID0gU1JMOwotCXdsY19ody0+TFJMID0gTFJMOwotCi0JLyogd3JpdGUgcmV0cnkgbGltaXQgdG8gU0NSLCBzaG91bGRuJ3QgbmVlZCB0byBzdXNwZW5kICovCi0JaWYgKHdsY19ody0+dXApIHsKLQkJV19SRUcoJndsY19ody0+cmVncy0+b2JqYWRkciwKLQkJICAgICAgT0JKQUREUl9TQ1JfU0VMIHwgU19ET1QxMV9TUkNfTE1UKTsKLQkJKHZvaWQpUl9SRUcoJndsY19ody0+cmVncy0+b2JqYWRkcik7Ci0JCVdfUkVHKCZ3bGNfaHctPnJlZ3MtPm9iamRhdGEsIHdsY19ody0+U1JMKTsKLQkJV19SRUcoJndsY19ody0+cmVncy0+b2JqYWRkciwKLQkJICAgICAgT0JKQUREUl9TQ1JfU0VMIHwgU19ET1QxMV9MUkNfTE1UKTsKLQkJKHZvaWQpUl9SRUcoJndsY19ody0+cmVncy0+b2JqYWRkcik7Ci0JCVdfUkVHKCZ3bGNfaHctPnJlZ3MtPm9iamRhdGEsIHdsY19ody0+TFJMKTsKLQl9Ci19Ci0KLXZvaWQgYnJjbXNfYl9wbGxyZXEoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIGJvb2wgc2V0LCBtYm9vbCByZXFfYml0KQotewotCWlmIChzZXQpIHsKLQkJaWYgKG1ib29saXNzZXQod2xjX2h3LT5wbGxyZXEsIHJlcV9iaXQpKQotCQkJcmV0dXJuOwotCi0JCW1ib29sc2V0KHdsY19ody0+cGxscmVxLCByZXFfYml0KTsKLQotCQlpZiAobWJvb2xpc3NldCh3bGNfaHctPnBsbHJlcSwgQlJDTVNfUExMUkVRX0ZMSVApKSB7Ci0JCQlpZiAoIXdsY19ody0+c2JjbGspIHsKLQkJCQlicmNtc19iX3h0YWwod2xjX2h3LCBPTik7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoIW1ib29saXNzZXQod2xjX2h3LT5wbGxyZXEsIHJlcV9iaXQpKQotCQkJcmV0dXJuOwotCi0JCW1ib29sY2xyKHdsY19ody0+cGxscmVxLCByZXFfYml0KTsKLQotCQlpZiAobWJvb2xpc3NldCh3bGNfaHctPnBsbHJlcSwgQlJDTVNfUExMUkVRX0ZMSVApKSB7Ci0JCQlpZiAod2xjX2h3LT5zYmNsaykgewotCQkJCWJyY21zX2JfeHRhbCh3bGNfaHcsIE9GRik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLXUxNiBicmNtc19iX3JhdGVfc2htX29mZnNldChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdTggcmF0ZSkKLXsKLQl1MTYgdGFibGVfcHRyOwotCXU4IHBoeV9yYXRlLCBpbmRleDsKLQotCS8qIGdldCB0aGUgcGh5IHNwZWNpZmljIHJhdGUgZW5jb2RpbmcgZm9yIHRoZSBQTENQIFNJR05BTCBmaWVsZCAqLwotCWlmIChJU19PRkRNKHJhdGUpKQotCQl0YWJsZV9wdHIgPSBNX1JUX0RJUk1BUF9BOwotCWVsc2UKLQkJdGFibGVfcHRyID0gTV9SVF9ESVJNQVBfQjsKLQotCS8qIGZvciBhIGdpdmVuIHJhdGUsIHRoZSBMUy1uaWJibGUgb2YgdGhlIFBMQ1AgU0lHTkFMIGZpZWxkIGlzCi0JICogdGhlIGluZGV4IGludG8gdGhlIHJhdGUgdGFibGUuCi0JICovCi0JcGh5X3JhdGUgPSByYXRlX2luZm9bcmF0ZV0gJiBCUkNNU19SQVRFX01BU0s7Ci0JaW5kZXggPSBwaHlfcmF0ZSAmIDB4ZjsKLQotCS8qIEZpbmQgdGhlIFNITSBwb2ludGVyIHRvIHRoZSByYXRlIHRhYmxlIGVudHJ5IGJ5IGxvb2tpbmcgaW4gdGhlCi0JICogRGlyZWN0LW1hcCBUYWJsZQotCSAqLwotCXJldHVybiAyICogYnJjbXNfYl9yZWFkX3NobSh3bGNfaHcsIHRhYmxlX3B0ciArIChpbmRleCAqIDIpKTsKLX0KLQotdm9pZCBicmNtc19iX2FudHNlbF9zZXQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHUzMiBhbnRzZWxfYXZhaWwpCi17Ci0Jd2xjX2h3LT5hbnRzZWxfYXZhaWwgPSBhbnRzZWxfYXZhaWw7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL2JtYWMuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvYm1hYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzlhZDRmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvYm1hYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotI2lmbmRlZiBfQlJDTV9CT1RUT01fTUFDX0hfCi0jZGVmaW5lIF9CUkNNX0JPVFRPTV9NQUNfSF8KLQotI2luY2x1ZGUgPGJyY211X3dpZmkuaD4KLSNpbmNsdWRlICJ0eXBlcy5oIgotCi0vKiBkdXAgc3RhdGUgYmV0d2VlbiBCTUFDKHN0cnVjdCBicmNtc19oYXJkd2FyZSkgYW5kIEhJR0goc3RydWN0IGJyY21zX2NfaW5mbykKLSAgIGRyaXZlciAqLwotc3RydWN0IGJyY21zX2Jfc3RhdGUgewotCXUzMiBtYWNod2NhcDsJLyogbWFjIGh3IGNhcGliaWxpdHkgKi8KLQl1MzIgcHJlYW1ibGVfb3ZyOwkvKiBwcmVhbWJsZSBvdmVycmlkZSAqLwotfTsKLQotZW51bSB7Ci0JSU9WX0JNQUNfRElBRywKLQlJT1ZfQk1BQ19TQkdQSU9USU1FUlZBTCwKLQlJT1ZfQk1BQ19TQkdQSU9PVVQsCi0JSU9WX0JNQUNfQ0NHUElPQ1RSTCwJLyogQ0MgR1BJT0NUUkwgUkVHICovCi0JSU9WX0JNQUNfQ0NHUElPT1VULAkvKiBDQyBHUElPT1VUIFJFRyAqLwotCUlPVl9CTUFDX0NDR1BJT09VVEVOLAkvKiBDQyBHUElPT1VURU4gUkVHICovCi0JSU9WX0JNQUNfQ0NHUElPSU4sCS8qIENDIEdQSU9JTiBSRUcgKi8KLQlJT1ZfQk1BQ19XUFNHUElPLAkvKiBXUFMgcHVzaCBidXR0b24gR1BJTyBwaW4gKi8KLQlJT1ZfQk1BQ19PVFBEVU1QLAotCUlPVl9CTUFDX09UUFNUQVQsCi0JSU9WX0JNQUNfUENJRUFTUE0sCS8qIG9iZnVzY2F0aW9uIGNsa3JlcS9hc3BtIGNvbnRyb2wgKi8KLQlJT1ZfQk1BQ19QQ0lFQURWQ09SUk1BU0ssCS8qIGFkdmFuY2VkIGNvcnJlY3RhYmxlIGVycm9yIG1hc2sgKi8KLQlJT1ZfQk1BQ19QQ0lFQ0xLUkVRLAkvKiBQQ0lFIDEuMSBjbG9ja3JlcSBlbmFiIHN1cHBvcnQgKi8KLQlJT1ZfQk1BQ19QQ0lFTENSRUcsCS8qIFBDSUUgTENSRUcgKi8KLQlJT1ZfQk1BQ19TQkdQSU9USU1FUk1BU0ssCi0JSU9WX0JNQUNfUkZESVNBQkxFRExZLAotCUlPVl9CTUFDX1BDSUVSRUcsCS8qIFBDSUUgUkVHICovCi0JSU9WX0JNQUNfUENJQ0ZHUkVHLAkvKiBQQ0kgQ29uZmlnIHJlZ2lzdGVyICovCi0JSU9WX0JNQUNfUENJRVNFUkRFU1JFRywJLyogUENJRSBTRVJERVMgUkVHIChkZXYsIDB9b2Zmc2V0KSAqLwotCUlPVl9CTUFDX1BDSUVHUElPT1VULAkvKiBQQ0lFT1VUIFJFRyAqLwotCUlPVl9CTUFDX1BDSUVHUElPT1VURU4sCS8qIFBDSUVPVVRFTiBSRUcgKi8KLQlJT1ZfQk1BQ19QQ0lFQ0xLUkVRRU5DVFJMLAkvKiBjbGtyZXFlbmN0cmwgUkVHIChQQ0lFIFJFViA+IDYuMCAqLwotCUlPVl9CTUFDX0RNQUxQQkssCi0JSU9WX0JNQUNfQ0NSRUcsCi0JSU9WX0JNQUNfQ09SRVJFRywKLQlJT1ZfQk1BQ19TRENJUywKLQlJT1ZfQk1BQ19TRElPX0RSSVZFLAotCUlPVl9CTUFDX09UUFcsCi0JSU9WX0JNQUNfTlZPVFBXLAotCUlPVl9CTUFDX1NST00sCi0JSU9WX0JNQUNfU1JDUkMsCi0JSU9WX0JNQUNfQ0lTX1NPVVJDRSwKLQlJT1ZfQk1BQ19DSVNWQVIsCi0JSU9WX0JNQUNfT1RQTE9DSywKLQlJT1ZfQk1BQ19PVFBfQ0hJUElELAotCUlPVl9CTUFDX0NVU1RPTVZBUjEsCi0JSU9WX0JNQUNfQk9BUkRGTEFHUywKLQlJT1ZfQk1BQ19CT0FSREZMQUdTMiwKLQlJT1ZfQk1BQ19XUFNMRUQsCi0JSU9WX0JNQUNfTlZSQU1fU09VUkNFLAotCUlPVl9CTUFDX09UUF9SQVdfUkVBRCwKLQlJT1ZfQk1BQ19MQVNUCi19OwotCi1leHRlcm4gaW50IGJyY21zX2JfYXR0YWNoKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdTE2IHZlbmRvciwgdTE2IGRldmljZSwKLQkJCSAgIHVpbnQgdW5pdCwgYm9vbCBwaW9tb2RlLCB2b2lkICpyZWdzdmEsIHVpbnQgYnVzdHlwZSwKLQkJCSAgIHZvaWQgKmJ0cGFyYW0pOwotZXh0ZXJuIGludCBicmNtc19iX2RldGFjaChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotZXh0ZXJuIHZvaWQgYnJjbXNfYl93YXRjaGRvZyh2b2lkICphcmcpOwotCi0vKiB1cC9kb3duLCByZXNldCwgY2xrICovCi1leHRlcm4gdm9pZCBicmNtc19iX2NvcHl0b19vYmptZW0oc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsCi0JCQkJICAgdWludCBvZmZzZXQsIGNvbnN0IHZvaWQgKmJ1ZiwgaW50IGxlbiwKLQkJCQkgICB1MzIgc2VsKTsKLWV4dGVybiB2b2lkIGJyY21zX2JfY29weWZyb21fb2JqbWVtKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCB1aW50IG9mZnNldCwKLQkJCQkgICAgIHZvaWQgKmJ1ZiwgaW50IGxlbiwgdTMyIHNlbCk7Ci0jZGVmaW5lIGJyY21zX2JfY29weWZyb21fc2htKHdsY19odywgb2Zmc2V0LCBidWYsIGxlbikgICAgICAgICAgICAgICAgIFwKLQlicmNtc19iX2NvcHlmcm9tX29iam1lbSh3bGNfaHcsIG9mZnNldCwgYnVmLCBsZW4sIE9CSkFERFJfU0hNX1NFTCkKLSNkZWZpbmUgYnJjbXNfYl9jb3B5dG9fc2htKHdsY19odywgb2Zmc2V0LCBidWYsIGxlbikgICAgICAgICAgICAgICAgICAgXAotCWJyY21zX2JfY29weXRvX29iam1lbSh3bGNfaHcsIG9mZnNldCwgYnVmLCBsZW4sIE9CSkFERFJfU0hNX1NFTCkKLQotZXh0ZXJuIHZvaWQgYnJjbXNfYl9jb3JlX3BoeXBsbF9yZXNldChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odyk7Ci1leHRlcm4gdm9pZCBicmNtc19iX2NvcmVfcGh5cGxsX2N0bChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgYm9vbCBvbik7Ci1leHRlcm4gdm9pZCBicmNtc19iX3BoeWNsa19mZ2Moc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIGJvb2wgY2xrKTsKLWV4dGVybiB2b2lkIGJyY21zX2JfbWFjcGh5Y2xrX3NldChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgYm9vbCBjbGspOwotZXh0ZXJuIHZvaWQgYnJjbXNfYl9waHlfcmVzZXQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcpOwotZXh0ZXJuIHZvaWQgYnJjbXNfYl9jb3JlcmVzZXQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHUzMiBmbGFncyk7Ci1leHRlcm4gdm9pZCBicmNtc19iX3Jlc2V0KHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KTsKLWV4dGVybiB2b2lkIGJyY21zX2JfaW5pdChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgY2hhbnNwZWNfdCBjaGFuc3BlYywKLQkJCSAgYm9vbCBtdXRlKTsKLWV4dGVybiBpbnQgYnJjbXNfYl91cF9wcmVwKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KTsKLWV4dGVybiBpbnQgYnJjbXNfYl91cF9maW5pc2goc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcpOwotZXh0ZXJuIGludCBicmNtc19iX2JtYWNfZG93bl9wcmVwKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KTsKLWV4dGVybiBpbnQgYnJjbXNfYl9kb3duX2ZpbmlzaChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odyk7Ci1leHRlcm4gdm9pZCBicmNtc19iX3N3aXRjaF9tYWNmcmVxKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCB1OCBzcHVybW9kZSk7Ci0KLS8qIGNoYW5zcGVjLCB1Y29kZSBpbnRlcmZhY2UgKi8KLWV4dGVybiB2b2lkIGJyY21zX2Jfc2V0X2NoYW5zcGVjKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LAotCQkJCSAgY2hhbnNwZWNfdCBjaGFuc3BlYywKLQkJCQkgIGJvb2wgbXV0ZSwgc3RydWN0IHR4cHdyX2xpbWl0cyAqdHhwd3IpOwotCi1leHRlcm4gaW50IGJyY21zX2JfeG10Zmlmb19zel9nZXQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHVpbnQgZmlmbywKLQkJCQkgICB1aW50ICpibG9ja3MpOwotZXh0ZXJuIHZvaWQgYnJjbXNfYl9taGYoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHU4IGlkeCwgdTE2IG1hc2ssCi0JCQkgdTE2IHZhbCwgaW50IGJhbmRzKTsKLWV4dGVybiB2b2lkIGJyY21zX2JfbWN0cmwoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHUzMiBtYXNrLCB1MzIgdmFsKTsKLWV4dGVybiB1MTYgYnJjbXNfYl9taGZfZ2V0KHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCB1OCBpZHgsIGludCBiYW5kcyk7Ci1leHRlcm4gdm9pZCBicmNtc19iX3R4YW50X3NldChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdTE2IHBoeXR4YW50KTsKLWV4dGVybiB1MTYgYnJjbXNfYl9nZXRfdHhhbnQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcpOwotZXh0ZXJuIHZvaWQgYnJjbXNfYl9hbnRzZWxfdHlwZV9zZXQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsCi0JCQkJICAgICB1OCBhbnRzZWxfdHlwZSk7Ci1leHRlcm4gaW50IGJyY21zX2Jfc3RhdGVfZ2V0KHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LAotCQkJICAgICAgc3RydWN0IGJyY21zX2Jfc3RhdGUgKnN0YXRlKTsKLWV4dGVybiB2b2lkIGJyY21zX2Jfd3JpdGVfc2htKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCB1aW50IG9mZnNldCwKLQkJCSAgICAgIHUxNiB2KTsKLWV4dGVybiB1MTYgYnJjbXNfYl9yZWFkX3NobShzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdWludCBvZmZzZXQpOwotZXh0ZXJuIHZvaWQgYnJjbXNfYl93cml0ZV90ZW1wbGF0ZV9yYW0oc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsCi0JCQkJICAgICAgIGludCBvZmZzZXQsIGludCBsZW4sIHZvaWQgKmJ1Zik7Ci1leHRlcm4gdm9pZCBicmNtc19iX2NvcHlmcm9tX3ZhcnMoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIGNoYXIgKipidWYsCi0JCQkJICAgdWludCAqbGVuKTsKLQotZXh0ZXJuIHZvaWQgYnJjbXNfYl9od19ldGhlcmFkZHIoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsCi0JCQkJICB1OCAqZWEpOwotCi1leHRlcm4gYm9vbCBicmNtc19iX3JhZGlvX3JlYWRfaHdkaXNhYmxlZChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odyk7Ci1leHRlcm4gdm9pZCBicmNtc19iX3NldF9zaG9ydHNsb3Qoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsCi0JCQkJICBib29sIHNob3J0c2xvdCk7Ci1leHRlcm4gdm9pZCBicmNtc19iX2JhbmRfc3RmX3NzX3NldChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywKLQkJCQkgICAgdTggc3RmX21vZGUpOwotCi1leHRlcm4gdm9pZCBicmNtc19iX3dhaXRfZm9yX3dha2Uoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcpOwotCi1leHRlcm4gdm9pZCBicmNtc19jX3Vjb2RlX3dha2Vfb3ZlcnJpZGVfc2V0KHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LAotCQkJCQl1MzIgb3ZlcnJpZGVfYml0KTsKLWV4dGVybiB2b2lkIGJyY21zX2NfdWNvZGVfd2FrZV9vdmVycmlkZV9jbGVhcihzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywKLQkJCQkJICB1MzIgb3ZlcnJpZGVfYml0KTsKLQotZXh0ZXJuIHZvaWQgYnJjbXNfYl9zZXRfYWRkcm1hdGNoKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LAotCQkJCSAgIGludCBtYXRjaF9yZWdfb2Zmc2V0LAotCQkJCSAgIGNvbnN0IHU4ICphZGRyKTsKLWV4dGVybiB2b2lkIGJyY21zX2Jfd3JpdGVfaHdfYmNudGVtcGxhdGVzKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LAotCQkJCQkgICB2b2lkICpiY24sIGludCBsZW4sIGJvb2wgYm90aCk7Ci0KLWV4dGVybiB2b2lkIGJyY21zX2JfcmVhZF90c2Yoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHUzMiAqdHNmX2xfcHRyLAotCQkJICAgICAgdTMyICp0c2ZfaF9wdHIpOwotZXh0ZXJuIHZvaWQgYnJjbXNfYl9zZXRfY3dtaW4oc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHUxNiBuZXdtaW4pOwotZXh0ZXJuIHZvaWQgYnJjbXNfYl9zZXRfY3dtYXgoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHUxNiBuZXdtYXgpOwotCi1leHRlcm4gdm9pZCBicmNtc19iX3JldHJ5bGltaXRfdXBkKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCB1MTYgU1JMLAotCQkJCSAgICB1MTYgTFJMKTsKLQotZXh0ZXJuIHZvaWQgYnJjbXNfYl9maWZvZXJyb3JzKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KTsKLQotCi0vKiBBUEkgZm9yIEJNQUMgZHJpdmVyIChlLmcuIHdsY19waHkuYyBldGMpICovCi0KLWV4dGVybiB2b2lkIGJyY21zX2JfYndfc2V0KHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCB1MTYgYncpOwotZXh0ZXJuIHZvaWQgYnJjbXNfYl9wbGxyZXEoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIGJvb2wgc2V0LAotCQkJICAgIG1ib29sIHJlcV9iaXQpOwotZXh0ZXJuIHZvaWQgYnJjbXNfYl9od191cChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odyk7Ci1leHRlcm4gdTE2IGJyY21zX2JfcmF0ZV9zaG1fb2Zmc2V0KHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCB1OCByYXRlKTsKLWV4dGVybiB2b2lkIGJyY21zX2JfYW50c2VsX3NldChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywKLQkJCSAgICAgICB1MzIgYW50c2VsX2F2YWlsKTsKLQotI2VuZGlmIC8qIF9CUkNNX0JPVFRPTV9NQUNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvY2hhbm5lbC5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9jaGFubmVsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OTY5M2UuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9jaGFubmVsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgPGRlZnMuaD4KLSNpbmNsdWRlICJwdWIuaCIKLSNpbmNsdWRlICJwaHkvcGh5X2hhbC5oIgotI2luY2x1ZGUgImJtYWMuaCIKLSNpbmNsdWRlICJtYWluLmgiCi0jaW5jbHVkZSAic3RmLmgiCi0jaW5jbHVkZSAiY2hhbm5lbC5oIgotCi0jZGVmaW5lCVZBTElEX0NIQU5ORUwyMF9EQih3bGMsIHZhbCkgYnJjbXNfY192YWxpZF9jaGFubmVsMjBfZGIoKHdsYyktPmNtaSwgdmFsKQotI2RlZmluZQlWQUxJRF9DSEFOTkVMMjBfSU5fQkFORCh3bGMsIGJhbmR1bml0LCB2YWwpIFwKLQlicmNtc19jX3ZhbGlkX2NoYW5uZWwyMF9pbl9iYW5kKCh3bGMpLT5jbWksIGJhbmR1bml0LCB2YWwpCi0jZGVmaW5lCVZBTElEX0NIQU5ORUwyMCh3bGMsIHZhbCkgYnJjbXNfY192YWxpZF9jaGFubmVsMjAoKHdsYyktPmNtaSwgdmFsKQotCi1zdHJ1Y3QgYnJjbXNfY21fYmFuZCB7Ci0JdTggbG9jYWxlX2ZsYWdzOwkvKiBzdHJ1Y3QgbG9jYWxlX2luZm8gZmxhZ3MgKi8KLQljaGFudmVjX3QgdmFsaWRfY2hhbm5lbHM7CS8qIExpc3Qgb2YgdmFsaWQgY2hhbm5lbHMgaW4gdGhlIGNvdW50cnkgKi8KLQljb25zdCBjaGFudmVjX3QgKnJlc3RyaWN0ZWRfY2hhbm5lbHM7CS8qIExpc3Qgb2YgcmVzdHJpY3RlZCB1c2UgY2hhbm5lbHMgKi8KLQljb25zdCBjaGFudmVjX3QgKnJhZGFyX2NoYW5uZWxzOwkvKiBMaXN0IG9mIHJhZGFyIHNlbnNpdGl2ZSBjaGFubmVscyAqLwotCXU4IFBBRFs4XTsKLX07Ci0KLXN0cnVjdCBicmNtc19jbV9pbmZvIHsKLQlzdHJ1Y3QgYnJjbXNfcHViICpwdWI7Ci0Jc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjOwotCWNoYXIgc3JvbV9jY29kZVtCUkNNX0NOVFJZX0JVRl9TWl07CS8qIENvdW50cnkgQ29kZSBpbiBTUk9NICovCi0JdWludCBzcm9tX3JlZ3JldjsJLyogUmVndWxhdG9yeSBSZXYgZm9yIHRoZSBTUk9NIGNjb2RlICovCi0JY29uc3Qgc3RydWN0IGNvdW50cnlfaW5mbyAqY291bnRyeTsJLyogY3VycmVudCBjb3VudHJ5IGRlZiAqLwotCWNoYXIgY2NvZGVbQlJDTV9DTlRSWV9CVUZfU1pdOwkvKiBjdXJyZW50IGludGVybmFsIENvdW50cnkgQ29kZSAqLwotCXVpbnQgcmVncmV2OwkJLyogY3VycmVudCBSZWd1bGF0b3J5IFJldmlzaW9uICovCi0JY2hhciBjb3VudHJ5X2FiYnJldltCUkNNX0NOVFJZX0JVRl9TWl07CS8qIGN1cnJlbnQgYWR2ZXJ0aXNlZCBjY29kZSAqLwotCS8qIHBlci1iYW5kIHN0YXRlIChvbmUgcGVyIHBoeS9yYWRpbykgKi8KLQlzdHJ1Y3QgYnJjbXNfY21fYmFuZCBiYW5kc3RhdGVbTUFYQkFORFNdOwotCS8qIHF1aWV0IGNoYW5uZWxzIGN1cnJlbnRseSBmb3IgcmFkYXIgc2Vuc2l0aXZpdHkgb3IgMTFoIHN1cHBvcnQgKi8KLQljaGFudmVjX3QgcXVpZXRfY2hhbm5lbHM7CS8qIGNoYW5uZWxzIG9uIHdoaWNoIHdlIGNhbm5vdCB0cmFuc21pdCAqLwotfTsKLQotc3RhdGljIGludCBicmNtc19jX2NoYW5uZWxzX2luaXQoc3RydWN0IGJyY21zX2NtX2luZm8gKndsY19jbSwKLQkJCSAgICAgY29uc3Qgc3RydWN0IGNvdW50cnlfaW5mbyAqY291bnRyeSk7Ci1zdGF0aWMgdm9pZCBicmNtc19jX3NldF9jb3VudHJ5X2NvbW1vbihzdHJ1Y3QgYnJjbXNfY21faW5mbyAqd2xjX2NtLAotCQkJCSAgIGNvbnN0IGNoYXIgKmNvdW50cnlfYWJicmV2LAotCQkJCSAgIGNvbnN0IGNoYXIgKmNjb2RlLCB1aW50IHJlZ3JldiwKLQkJCQkgICBjb25zdCBzdHJ1Y3QgY291bnRyeV9pbmZvICpjb3VudHJ5KTsKLXN0YXRpYyBpbnQgYnJjbXNfY19zZXRfY291bnRyeWNvZGUoc3RydWN0IGJyY21zX2NtX2luZm8gKndsY19jbSwKLQkJCQkgICBjb25zdCBjaGFyICpjY29kZSk7Ci1zdGF0aWMgaW50IGJyY21zX2Nfc2V0X2NvdW50cnljb2RlX3JldihzdHJ1Y3QgYnJjbXNfY21faW5mbyAqd2xjX2NtLAotCQkJCSAgIGNvbnN0IGNoYXIgKmNvdW50cnlfYWJicmV2LAotCQkJCSAgIGNvbnN0IGNoYXIgKmNjb2RlLCBpbnQgcmVncmV2KTsKLXN0YXRpYyBpbnQgYnJjbXNfY19jb3VudHJ5X2FnZ3JlZ2F0ZV9tYXAoc3RydWN0IGJyY21zX2NtX2luZm8gKndsY19jbSwKLQkJCQljb25zdCBjaGFyICpjY29kZSwKLQkJCQljaGFyICptYXBwZWRfY2NvZGUsIHVpbnQgKm1hcHBlZF9yZWdyZXYpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNvdW50cnlfaW5mbyAqCi1icmNtc19jX2NvdW50cnlfbG9va3VwX2RpcmVjdChjb25zdCBjaGFyICpjY29kZSwgdWludCByZWdyZXYpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNvdW50cnlfaW5mbyAqCi1icmNtc19jX2NvdW50cnljb2RlX21hcChzdHJ1Y3QgYnJjbXNfY21faW5mbyAqd2xjX2NtLAotCQkJY29uc3QgY2hhciAqY2NvZGUsIGNoYXIgKm1hcHBlZF9jY29kZSwKLQkJCXVpbnQgKm1hcHBlZF9yZWdyZXYpOwotCi1zdGF0aWMgdm9pZCBicmNtc19jX2NoYW5uZWxzX2NvbW1pdChzdHJ1Y3QgYnJjbXNfY21faW5mbyAqd2xjX2NtKTsKLXN0YXRpYyB2b2lkIGJyY21zX2NfcXVpZXRfY2hhbm5lbHNfcmVzZXQoc3RydWN0IGJyY21zX2NtX2luZm8gKndsY19jbSk7Ci1zdGF0aWMgYm9vbCBicmNtc19jX3F1aWV0X2NoYW5zcGVjKHN0cnVjdCBicmNtc19jbV9pbmZvICp3bGNfY20sCi0JCQkJICAgY2hhbnNwZWNfdCBjaHNwZWMpOwotc3RhdGljIGJvb2wgYnJjbXNfY192YWxpZF9jaGFubmVsMjBfZGIoc3RydWN0IGJyY21zX2NtX2luZm8gKndsY19jbSwgdWludCB2YWwpOwotc3RhdGljIGJvb2wgYnJjbXNfY192YWxpZF9jaGFubmVsMjBfaW5fYmFuZChzdHJ1Y3QgYnJjbXNfY21faW5mbyAqd2xjX2NtLAotCQkJCQkgICAgdWludCBiYW5kdW5pdCwgdWludCB2YWwpOwotc3RhdGljIGJvb2wgYnJjbXNfY192YWxpZF9jaGFubmVsMjAoc3RydWN0IGJyY21zX2NtX2luZm8gKndsY19jbSwgdWludCB2YWwpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNvdW50cnlfaW5mbyAqCi1icmNtc19jX2NvdW50cnlfbG9va3VwKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgY29uc3QgY2hhciAqY2NvZGUpOwotCi1zdGF0aWMgdm9pZCBicmNtc19jX2xvY2FsZV9nZXRfY2hhbm5lbHMoY29uc3Qgc3RydWN0IGxvY2FsZV9pbmZvICpsb2NhbGUsCi0JCQkJICAgIGNoYW52ZWNfdCAqdmFsaWRfY2hhbm5lbHMpOwotc3RhdGljIGNvbnN0IHN0cnVjdCBsb2NhbGVfaW5mbyAqYnJjbXNfY19nZXRfbG9jYWxlXzJnKHU4IGxvY2FsZV9pZHgpOwotc3RhdGljIGNvbnN0IHN0cnVjdCBsb2NhbGVfaW5mbyAqYnJjbXNfY19nZXRfbG9jYWxlXzVnKHU4IGxvY2FsZV9pZHgpOwotc3RhdGljIGJvb2wgYnJjbXNfY19qYXBhbihzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotc3RhdGljIGJvb2wgYnJjbXNfY19qYXBhbl9jY29kZShjb25zdCBjaGFyICpjY29kZSk7Ci1zdGF0aWMgdm9pZCBicmNtc19jX2NoYW5uZWxfbWluX3R4cG93ZXJfbGltaXRzX3dpdGhfbG9jYWxfY29uc3RyYWludCgKLQlzdHJ1Y3QgYnJjbXNfY21faW5mbyAqd2xjX2NtLCBzdHJ1Y3QgdHhwd3JfbGltaXRzICp0eHB3ciwKLQl1OCBsb2NhbF9jb25zdHJhaW50X3FkYm0pOwotc3RhdGljIHZvaWQgYnJjbXNfY19sb2NhbGVfYWRkX2NoYW5uZWxzKGNoYW52ZWNfdCAqdGFyZ2V0LAotCQkJCSAgICBjb25zdCBjaGFudmVjX3QgKmNoYW5uZWxzKTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbG9jYWxlX21pbW9faW5mbyAqYnJjbXNfY19nZXRfbWltb18yZyh1OCBsb2NhbGVfaWR4KTsKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbG9jYWxlX21pbW9faW5mbyAqYnJjbXNfY19nZXRfbWltb181Zyh1OCBsb2NhbGVfaWR4KTsKLQotLyogUURCKCkgbWFjcm8gdGFrZXMgYSBkQiB2YWx1ZSBhbmQgY29udmVydHMgdG8gYSBxdWFydGVyIGRCIHZhbHVlICovCi0jaWZkZWYgUURCCi0jdW5kZWYgUURCCi0jZW5kaWYKLSNkZWZpbmUgUURCKG4pICgobikgKiBCUkNNU19UWFBXUl9EQl9GQUNUT1IpCi0KLS8qIFJlZ3VsYXRvcnkgTWF0cml4IFNwcmVhZHNoZWV0IChDTE0pIE1JTU8gdjMuNy45ICovCi0KLS8qCi0gKiBTb21lIGNvbW1vbiBjaGFubmVsIHNldHMKLSAqLwotCi0vKiBObyBjaGFubmVscyAqLwotc3RhdGljIGNvbnN0IGNoYW52ZWNfdCBjaGFudmVjX25vbmUgPSB7Ci0JezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9Ci19OwotCi0vKiBBbGwgMi40IEdIeiBIVyBjaGFubmVscyAqLwotY29uc3QgY2hhbnZlY190IGNoYW52ZWNfYWxsXzJHID0gewotCXsweGZlLCAweDdmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwfQotfTsKLQotLyogQWxsIDUgR0h6IEhXIGNoYW5uZWxzICovCi1jb25zdCBjaGFudmVjX3QgY2hhbnZlY19hbGxfNUcgPSB7Ci0JezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTQsIDB4NTUsIDB4MTEsIDB4MTEsCi0JIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTEsIDB4MTEsIDB4MTEsCi0JIDB4MTEsIDB4MTEsIDB4MjAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MTEsCi0JIDB4MTEsIDB4MTEsIDB4MTEsIDB4MDF9Ci19OwotCi0vKgotICogUmFkYXIgY2hhbm5lbCBzZXRzCi0gKi8KLQotLyogTm8gcmFkYXIgKi8KLSNkZWZpbmUgcmFkYXJfc2V0X25vbmUgY2hhbnZlY19ub25lCi0KLXN0YXRpYyBjb25zdCBjaGFudmVjX3QgcmFkYXJfc2V0MSA9IHsJLyogQ2hhbm5lbHMgNTIgLSA2NCwgMTAwIC0gMTQwICovCi0JezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTEsCS8qIDUyIC0gNjAgKi8KLQkgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMSwgMHgxMSwgMHgxMSwJLyogNjQsIDEwMCAtIDEyNCAqLwotCSAweDExLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAkvKiAxMjggLSAxNDAgKi8KLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0KLX07Ci0KLS8qCi0gKiBSZXN0cmljdGVkIGNoYW5uZWwgc2V0cwotICovCi0KLSNkZWZpbmUgcmVzdHJpY3RlZF9zZXRfbm9uZSBjaGFudmVjX25vbmUKLQotLyogQ2hhbm5lbHMgMzQsIDM4LCA0MiwgNDYgKi8KLXN0YXRpYyBjb25zdCBjaGFudmVjX3QgcmVzdHJpY3RlZF9zZXRfamFwYW5fbGVnYWN5ID0gewotCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwfQotfTsKLQotLyogQ2hhbm5lbHMgMTIsIDEzICovCi1zdGF0aWMgY29uc3QgY2hhbnZlY190IHJlc3RyaWN0ZWRfc2V0XzJnX3Nob3J0ID0gewotCXsweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwfQotfTsKLQotLyogQ2hhbm5lbCAxNjUgKi8KLXN0YXRpYyBjb25zdCBjaGFudmVjX3QgcmVzdHJpY3RlZF9jaGFuXzE2NSA9IHsKLQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0KLX07Ci0KLS8qIENoYW5uZWxzIDM2IC0gNDggJiAxNDkgLSAxNjUgKi8KLXN0YXRpYyBjb25zdCBjaGFudmVjX3QgcmVzdHJpY3RlZF9sb3dfaGkgPSB7Ci0JezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTEsIDB4MDEsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjIsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9Ci19OwotCi0vKiBDaGFubmVscyAxMiAtIDE0ICovCi1zdGF0aWMgY29uc3QgY2hhbnZlY190IHJlc3RyaWN0ZWRfc2V0XzEyXzEzXzE0ID0gewotCXsweDAwLCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwfQotfTsKLQotI2RlZmluZSAgTE9DQUxFX0NIQU5fMDFfMTEJICgxPDwwKQotI2RlZmluZSAgTE9DQUxFX0NIQU5fMTJfMTMJICgxPDwxKQotI2RlZmluZSAgTE9DQUxFX0NIQU5fMTQJCSAoMTw8MikKLSNkZWZpbmUgIExPQ0FMRV9TRVRfNUdfTE9XX0pQMSAgICgxPDwzKQkvKiAzNC00OCwgc3RlcCAyICovCi0jZGVmaW5lICBMT0NBTEVfU0VUXzVHX0xPV19KUDIgICAoMTw8NCkJLyogMzQtNDYsIHN0ZXAgNCAqLwotI2RlZmluZSAgTE9DQUxFX1NFVF81R19MT1cxICAgICAgKDE8PDUpCS8qIDM2LTQ4LCBzdGVwIDQgKi8KLSNkZWZpbmUgIExPQ0FMRV9TRVRfNUdfTE9XMiAgICAgICgxPDw2KQkvKiA1MiAqLwotI2RlZmluZSAgTE9DQUxFX1NFVF81R19MT1czICAgICAgKDE8PDcpCS8qIDU2LTY0LCBzdGVwIDQgKi8KLSNkZWZpbmUgIExPQ0FMRV9TRVRfNUdfTUlEMSAgICAgICgxPDw4KQkvKiAxMDAtMTE2LCBzdGVwIDQgKi8KLSNkZWZpbmUgIExPQ0FMRV9TRVRfNUdfTUlEMgkgKDE8PDkpCS8qIDEyMC0xMjQsIHN0ZXAgNCAqLwotI2RlZmluZSAgTE9DQUxFX1NFVF81R19NSUQzICAgICAgKDE8PDEwKQkvKiAxMjggKi8KLSNkZWZpbmUgIExPQ0FMRV9TRVRfNUdfSElHSDEgICAgICgxPDwxMSkJLyogMTMyLTE0MCwgc3RlcCA0ICovCi0jZGVmaW5lICBMT0NBTEVfU0VUXzVHX0hJR0gyICAgICAoMTw8MTIpCS8qIDE0OS0xNjEsIHN0ZXAgNCAqLwotI2RlZmluZSAgTE9DQUxFX1NFVF81R19ISUdIMyAgICAgKDE8PDEzKQkvKiAxNjUgKi8KLSNkZWZpbmUgIExPQ0FMRV9DSEFOXzUyXzE0MF9BTEwgICgxPDwxNCkKLSNkZWZpbmUgIExPQ0FMRV9TRVRfNUdfSElHSDQgICAgICgxPDwxNSkJLyogMTg0LTIxNiAqLwotCi0jZGVmaW5lICBMT0NBTEVfQ0hBTl8zNl82NCAgICAgICAoTE9DQUxFX1NFVF81R19MT1cxIHwgTE9DQUxFX1NFVF81R19MT1cyIHwgTE9DQUxFX1NFVF81R19MT1czKQotI2RlZmluZSAgTE9DQUxFX0NIQU5fNTJfNjQgICAgICAgKExPQ0FMRV9TRVRfNUdfTE9XMiB8IExPQ0FMRV9TRVRfNUdfTE9XMykKLSNkZWZpbmUgIExPQ0FMRV9DSEFOXzEwMF8xMjQJIChMT0NBTEVfU0VUXzVHX01JRDEgfCBMT0NBTEVfU0VUXzVHX01JRDIpCi0jZGVmaW5lICBMT0NBTEVfQ0hBTl8xMDBfMTQwICAgICBcCi0JKExPQ0FMRV9TRVRfNUdfTUlEMSB8IExPQ0FMRV9TRVRfNUdfTUlEMiB8IExPQ0FMRV9TRVRfNUdfTUlEMyB8IExPQ0FMRV9TRVRfNUdfSElHSDEpCi0jZGVmaW5lICBMT0NBTEVfQ0hBTl8xNDlfMTY1ICAgICAoTE9DQUxFX1NFVF81R19ISUdIMiB8IExPQ0FMRV9TRVRfNUdfSElHSDMpCi0jZGVmaW5lICBMT0NBTEVfQ0hBTl8xODRfMjE2ICAgICBMT0NBTEVfU0VUXzVHX0hJR0g0Ci0KLSNkZWZpbmUgIExPQ0FMRV9DSEFOXzAxXzE0CShMT0NBTEVfQ0hBTl8wMV8xMSB8IExPQ0FMRV9DSEFOXzEyXzEzIHwgTE9DQUxFX0NIQU5fMTQpCi0KLSNkZWZpbmUgIExPQ0FMRV9SQURBUl9TRVRfTk9ORQkJICAwCi0jZGVmaW5lICBMT0NBTEVfUkFEQVJfU0VUXzEJCSAgMQotCi0jZGVmaW5lICBMT0NBTEVfUkVTVFJJQ1RFRF9OT05FCQkgIDAKLSNkZWZpbmUgIExPQ0FMRV9SRVNUUklDVEVEX1NFVF8yR19TSE9SVCAgIDEKLSNkZWZpbmUgIExPQ0FMRV9SRVNUUklDVEVEX0NIQU5fMTY1ICAgICAgIDIKLSNkZWZpbmUgIExPQ0FMRV9DSEFOX0FMTF81RwkJICAzCi0jZGVmaW5lICBMT0NBTEVfUkVTVFJJQ1RFRF9KQVBBTl9MRUdBQ1kgICA0Ci0jZGVmaW5lICBMT0NBTEVfUkVTVFJJQ1RFRF8xMURfMkcJICA1Ci0jZGVmaW5lICBMT0NBTEVfUkVTVFJJQ1RFRF8xMURfNUcJICA2Ci0jZGVmaW5lICBMT0NBTEVfUkVTVFJJQ1RFRF9MT1dfSEkJICA3Ci0jZGVmaW5lICBMT0NBTEVfUkVTVFJJQ1RFRF8xMl8xM18xNAkgIDgKLQotLyogZ2xvYmFsIG1lbW9yeSB0byBwcm92aWRlIHdvcmtpbmcgYnVmZmVyIGZvciBleHBhbmRlZCBsb2NhbGUgKi8KLQotc3RhdGljIGNvbnN0IGNoYW52ZWNfdCAqZ190YWJsZV9yYWRhcl9zZXRbXSA9IHsKLQkmY2hhbnZlY19ub25lLAotCSZyYWRhcl9zZXQxCi19OwotCi1zdGF0aWMgY29uc3QgY2hhbnZlY190ICpnX3RhYmxlX3Jlc3RyaWN0ZWRfY2hhbltdID0gewotCSZjaGFudmVjX25vbmUsCQkvKiByZXN0cmljdGVkX3NldF9ub25lICovCi0JJnJlc3RyaWN0ZWRfc2V0XzJnX3Nob3J0LAotCSZyZXN0cmljdGVkX2NoYW5fMTY1LAotCSZjaGFudmVjX2FsbF81RywKLQkmcmVzdHJpY3RlZF9zZXRfamFwYW5fbGVnYWN5LAotCSZjaGFudmVjX2FsbF8yRywJLyogcmVzdHJpY3RlZF9zZXRfMTFkXzJHICovCi0JJmNoYW52ZWNfYWxsXzVHLAkvKiByZXN0cmljdGVkX3NldF8xMWRfNUcgKi8KLQkmcmVzdHJpY3RlZF9sb3dfaGksCi0JJnJlc3RyaWN0ZWRfc2V0XzEyXzEzXzE0Ci19OwotCi1zdGF0aWMgY29uc3QgY2hhbnZlY190IGxvY2FsZV8yZ18wMV8xMSA9IHsKLQl7MHhmZSwgMHgwZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFudmVjX3QgbG9jYWxlXzJnXzEyXzEzID0gewotCXsweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwfQotfTsKLQotc3RhdGljIGNvbnN0IGNoYW52ZWNfdCBsb2NhbGVfMmdfMTQgPSB7Ci0JezB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9Ci19OwotCi1zdGF0aWMgY29uc3QgY2hhbnZlY190IGxvY2FsZV81Z19MT1dfSlAxID0gewotCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDU0LCAweDU1LCAweDAxLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwfQotfTsKLQotc3RhdGljIGNvbnN0IGNoYW52ZWNfdCBsb2NhbGVfNWdfTE9XX0pQMiA9IHsKLQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFudmVjX3QgbG9jYWxlXzVnX0xPVzEgPSB7Ci0JezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTEsIDB4MDEsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9Ci19OwotCi1zdGF0aWMgY29uc3QgY2hhbnZlY190IGxvY2FsZV81Z19MT1cyID0gewotCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwfQotfTsKLQotc3RhdGljIGNvbnN0IGNoYW52ZWNfdCBsb2NhbGVfNWdfTE9XMyA9IHsKLQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMSwKLQkgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFudmVjX3QgbG9jYWxlXzVnX01JRDEgPSB7Ci0JezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTEsIDB4MTEsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9Ci19OwotCi1zdGF0aWMgY29uc3QgY2hhbnZlY190IGxvY2FsZV81Z19NSUQyID0gewotCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDExLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwfQotfTsKLQotc3RhdGljIGNvbnN0IGNoYW52ZWNfdCBsb2NhbGVfNWdfTUlEMyA9IHsKLQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFudmVjX3QgbG9jYWxlXzVnX0hJR0gxID0gewotCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDEwLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwfQotfTsKLQotc3RhdGljIGNvbnN0IGNoYW52ZWNfdCBsb2NhbGVfNWdfSElHSDIgPSB7Ci0JezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9Ci19OwotCi1zdGF0aWMgY29uc3QgY2hhbnZlY190IGxvY2FsZV81Z19ISUdIMyA9IHsKLQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFudmVjX3QgbG9jYWxlXzVnXzUyXzE0MF9BTEwgPSB7Ci0JezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MTEsCi0JIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsCi0JIDB4MTEsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9Ci19OwotCi1zdGF0aWMgY29uc3QgY2hhbnZlY190IGxvY2FsZV81Z19ISUdINCA9IHsKLQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMSwKLQkgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMX0KLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFudmVjX3QgKmdfdGFibGVfbG9jYWxlX2Jhc2VbXSA9IHsKLQkmbG9jYWxlXzJnXzAxXzExLAotCSZsb2NhbGVfMmdfMTJfMTMsCi0JJmxvY2FsZV8yZ18xNCwKLQkmbG9jYWxlXzVnX0xPV19KUDEsCi0JJmxvY2FsZV81Z19MT1dfSlAyLAotCSZsb2NhbGVfNWdfTE9XMSwKLQkmbG9jYWxlXzVnX0xPVzIsCi0JJmxvY2FsZV81Z19MT1czLAotCSZsb2NhbGVfNWdfTUlEMSwKLQkmbG9jYWxlXzVnX01JRDIsCi0JJmxvY2FsZV81Z19NSUQzLAotCSZsb2NhbGVfNWdfSElHSDEsCi0JJmxvY2FsZV81Z19ISUdIMiwKLQkmbG9jYWxlXzVnX0hJR0gzLAotCSZsb2NhbGVfNWdfNTJfMTQwX0FMTCwKLQkmbG9jYWxlXzVnX0hJR0g0Ci19OwotCi1zdGF0aWMgdm9pZCBicmNtc19jX2xvY2FsZV9hZGRfY2hhbm5lbHMoY2hhbnZlY190ICp0YXJnZXQsCi0JCQkJICAgIGNvbnN0IGNoYW52ZWNfdCAqY2hhbm5lbHMpCi17Ci0JdTggaTsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGNoYW52ZWNfdCk7IGkrKykgewotCQl0YXJnZXQtPnZlY1tpXSB8PSBjaGFubmVscy0+dmVjW2ldOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYnJjbXNfY19sb2NhbGVfZ2V0X2NoYW5uZWxzKGNvbnN0IHN0cnVjdCBsb2NhbGVfaW5mbyAqbG9jYWxlLAotCQkJCSAgICBjaGFudmVjX3QgKmNoYW5uZWxzKQotewotCXU4IGk7Ci0KLQltZW1zZXQoY2hhbm5lbHMsIDAsIHNpemVvZihjaGFudmVjX3QpKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGdfdGFibGVfbG9jYWxlX2Jhc2UpOyBpKyspIHsKLQkJaWYgKGxvY2FsZS0+dmFsaWRfY2hhbm5lbHMgJiAoMSA8PCBpKSkgewotCQkJYnJjbXNfY19sb2NhbGVfYWRkX2NoYW5uZWxzKGNoYW5uZWxzLAotCQkJCQkJZ190YWJsZV9sb2NhbGVfYmFzZVtpXSk7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBMb2NhbGUgRGVmaW5pdGlvbnMgLSAyLjQgR0h6Ci0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbG9jYWxlX2luZm8gbG9jYWxlX2kgPSB7CS8qIGxvY2FsZSBpLiBjaGFubmVsIDEgLSAxMyAqLwotCUxPQ0FMRV9DSEFOXzAxXzExIHwgTE9DQUxFX0NIQU5fMTJfMTMsCi0JTE9DQUxFX1JBREFSX1NFVF9OT05FLAotCUxPQ0FMRV9SRVNUUklDVEVEX1NFVF8yR19TSE9SVCwKLQl7UURCKDE5KSwgUURCKDE5KSwgUURCKDE5KSwKLQkgUURCKDE5KSwgUURCKDE5KSwgUURCKDE5KX0sCi0JezIwLCAyMCwgMjAsIDB9LAotCUJSQ01TX0VJUlAKLX07Ci0KLS8qCi0gKiBMb2NhbGUgRGVmaW5pdGlvbnMgLSA1IEdIegotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGxvY2FsZV9pbmZvIGxvY2FsZV8xMSA9IHsKLQkvKiBsb2NhbGUgMTEuIGNoYW5uZWwgMzYgLSA0OCwgNTIgLSA2NCwgMTAwIC0gMTQwLCAxNDkgLSAxNjUgKi8KLQlMT0NBTEVfQ0hBTl8zNl82NCB8IExPQ0FMRV9DSEFOXzEwMF8xNDAgfCBMT0NBTEVfQ0hBTl8xNDlfMTY1LAotCUxPQ0FMRV9SQURBUl9TRVRfMSwKLQlMT0NBTEVfUkVTVFJJQ1RFRF9OT05FLAotCXtRREIoMjEpLCBRREIoMjEpLCBRREIoMjEpLCBRREIoMjEpLCBRREIoMjEpfSwKLQl7MjMsIDIzLCAyMywgMzAsIDMwfSwKLQlCUkNNU19FSVJQIHwgQlJDTVNfREZTX0VVCi19OwotCi0jZGVmaW5lIExPQ0FMRV8yR19JRFhfaQkJCTAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbG9jYWxlX2luZm8gKmdfbG9jYWxlXzJnX3RhYmxlW10gPSB7Ci0JJmxvY2FsZV9pCi19OwotCi0jZGVmaW5lIExPQ0FMRV81R19JRFhfMTEJMAotc3RhdGljIGNvbnN0IHN0cnVjdCBsb2NhbGVfaW5mbyAqZ19sb2NhbGVfNWdfdGFibGVbXSA9IHsKLQkmbG9jYWxlXzExCi19OwotCi0vKgotICogTUlNTyBMb2NhbGUgRGVmaW5pdGlvbnMgLSAyLjQgR0h6Ci0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbG9jYWxlX21pbW9faW5mbyBsb2NhbGVfYm4gPSB7Ci0Je1FEQigxMyksIFFEQigxMyksIFFEQigxMyksIFFEQigxMyksIFFEQigxMyksCi0JIFFEQigxMyksIFFEQigxMyksIFFEQigxMyksIFFEQigxMyksIFFEQigxMyksCi0JIFFEQigxMyksIFFEQigxMyksIFFEQigxMyl9LAotCXswLCAwLCBRREIoMTMpLCBRREIoMTMpLCBRREIoMTMpLAotCSBRREIoMTMpLCBRREIoMTMpLCBRREIoMTMpLCBRREIoMTMpLCBRREIoMTMpLAotCSBRREIoMTMpLCAwLCAwfSwKLQkwCi19OwotCi0vKiBsb2NhbGUgbWltbyAyZyBpbmRleGVzICovCi0jZGVmaW5lIExPQ0FMRV9NSU1PX0lEWF9ibgkJCTAKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBsb2NhbGVfbWltb19pbmZvICpnX21pbW9fMmdfdGFibGVbXSA9IHsKLQkmbG9jYWxlX2JuCi19OwotCi0vKgotICogTUlNTyBMb2NhbGUgRGVmaW5pdGlvbnMgLSA1IEdIegotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGxvY2FsZV9taW1vX2luZm8gbG9jYWxlXzExbiA9IHsKLQl7IC8qIDEyLjUgZEJtICovIDUwLCA1MCwgNTAsIFFEQigxNSksIFFEQigxNSl9LAotCXtRREIoMTQpLCBRREIoMTUpLCBRREIoMTUpLCBRREIoMTUpLCBRREIoMTUpfSwKLQkwCi19OwotCi0jZGVmaW5lIExPQ0FMRV9NSU1PX0lEWF8xMW4JCQkwCi1zdGF0aWMgY29uc3Qgc3RydWN0IGxvY2FsZV9taW1vX2luZm8gKmdfbWltb181Z190YWJsZVtdID0gewotCSZsb2NhbGVfMTFuCi19OwotCi0jaWZkZWYgTEMKLSN1bmRlZiBMQwotI2VuZGlmCi0jZGVmaW5lIExDKGlkKQlMT0NBTEVfTUlNT19JRFhfICMjIGlkCi0KLSNpZmRlZiBMQ18yRwotI3VuZGVmIExDXzJHCi0jZW5kaWYKLSNkZWZpbmUgTENfMkcoaWQpCUxPQ0FMRV8yR19JRFhfICMjIGlkCi0KLSNpZmRlZiBMQ181RwotI3VuZGVmIExDXzVHCi0jZW5kaWYKLSNkZWZpbmUgTENfNUcoaWQpCUxPQ0FMRV81R19JRFhfICMjIGlkCi0KLSNkZWZpbmUgTE9DQUxFUyhiYW5kMiwgYmFuZDUsIG1pbW8yLCBtaW1vNSkgICAgIHtMQ18yRyhiYW5kMiksIExDXzVHKGJhbmQ1KSwgTEMobWltbzIpLCBMQyhtaW1vNSl9Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgewotCWNoYXIgYWJicmV2W0JSQ01fQ05UUllfQlVGX1NaXTsJLyogY291bnRyeSBhYmJyZXZpYXRpb24gKi8KLQlzdHJ1Y3QgY291bnRyeV9pbmZvIGNvdW50cnk7Ci19IGNudHJ5X2xvY2FsZXNbXSA9IHsKLQl7Ci0JIlgyIiwgTE9DQUxFUyhpLCAxMSwgYm4sIDExbil9LAkvKiBXb3JsZHdpZGUgUm9XIDIgKi8KLX07Ci0KLSNpZmRlZiBTVVBQT1JUXzQwTUhaCi0vKiAyME1IeiBjaGFubmVsIGluZm8gZm9yIDQwTUh6IHBhaXJpbmcgc3VwcG9ydCAqLwotc3RydWN0IGNoYW4yMF9pbmZvIHsKLQl1OCBzYjsKLQl1OCBhZGpfc2JzOwotfTsKLQotLyogaW5kaWNhdGVzIGFkamFjZW50IGNoYW5uZWxzIHRoYXQgYXJlIGFsbG93ZWQgZm9yIGEgNDAgTWh6IGNoYW5uZWwgYW5kCi0gKiB0aG9zZSB0aGF0IHBlcm1pdHRlZCBieSB0aGUgSFQKLSAqLwotc3RydWN0IGNoYW4yMF9pbmZvIGNoYW4yMF9pbmZvW10gPSB7Ci0JLyogMTFiLzExZyAqLwotLyogMCAqLyB7MSwgKENIX1VQUEVSX1NCIHwgQ0hfRVdBX1ZBTElEKX0sCi0vKiAxICovIHsyLCAoQ0hfVVBQRVJfU0IgfCBDSF9FV0FfVkFMSUQpfSwKLS8qIDIgKi8gezMsIChDSF9VUFBFUl9TQiB8IENIX0VXQV9WQUxJRCl9LAotLyogMyAqLyB7NCwgKENIX1VQUEVSX1NCIHwgQ0hfRVdBX1ZBTElEKX0sCi0vKiA0ICovIHs1LCAoQ0hfVVBQRVJfU0IgfCBDSF9MT1dFUl9TQiB8IENIX0VXQV9WQUxJRCl9LAotLyogNSAqLyB7NiwgKENIX1VQUEVSX1NCIHwgQ0hfTE9XRVJfU0IgfCBDSF9FV0FfVkFMSUQpfSwKLS8qIDYgKi8gezcsIChDSF9VUFBFUl9TQiB8IENIX0xPV0VSX1NCIHwgQ0hfRVdBX1ZBTElEKX0sCi0vKiA3ICovIHs4LCAoQ0hfVVBQRVJfU0IgfCBDSF9MT1dFUl9TQiB8IENIX0VXQV9WQUxJRCl9LAotLyogOCAqLyB7OSwgKENIX1VQUEVSX1NCIHwgQ0hfTE9XRVJfU0IgfCBDSF9FV0FfVkFMSUQpfSwKLS8qIDkgKi8gezEwLCAoQ0hfTE9XRVJfU0IgfCBDSF9FV0FfVkFMSUQpfSwKLS8qIDEwICovIHsxMSwgKENIX0xPV0VSX1NCIHwgQ0hfRVdBX1ZBTElEKX0sCi0vKiAxMSAqLyB7MTIsIChDSF9MT1dFUl9TQil9LAotLyogMTIgKi8gezEzLCAoQ0hfTE9XRVJfU0IpfSwKLS8qIDEzICovIHsxNCwgKENIX0xPV0VSX1NCKX0sCi0KLS8qIDExYSBqYXBhbiBoaWdoICovCi0vKiAxNCAqLyB7MzQsIChDSF9VUFBFUl9TQil9LAotLyogMTUgKi8gezM4LCAoQ0hfTE9XRVJfU0IpfSwKLS8qIDE2ICovIHs0MiwgKENIX0xPV0VSX1NCKX0sCi0vKiAxNyAqLyB7NDYsIChDSF9MT1dFUl9TQil9LAotCi0vKiAxMWEgdXNhIGxvdyAqLwotLyogMTggKi8gezM2LCAoQ0hfVVBQRVJfU0IgfCBDSF9FV0FfVkFMSUQpfSwKLS8qIDE5ICovIHs0MCwgKENIX0xPV0VSX1NCIHwgQ0hfRVdBX1ZBTElEKX0sCi0vKiAyMCAqLyB7NDQsIChDSF9VUFBFUl9TQiB8IENIX0VXQV9WQUxJRCl9LAotLyogMjEgKi8gezQ4LCAoQ0hfTE9XRVJfU0IgfCBDSF9FV0FfVkFMSUQpfSwKLS8qIDIyICovIHs1MiwgKENIX1VQUEVSX1NCIHwgQ0hfRVdBX1ZBTElEKX0sCi0vKiAyMyAqLyB7NTYsIChDSF9MT1dFUl9TQiB8IENIX0VXQV9WQUxJRCl9LAotLyogMjQgKi8gezYwLCAoQ0hfVVBQRVJfU0IgfCBDSF9FV0FfVkFMSUQpfSwKLS8qIDI1ICovIHs2NCwgKENIX0xPV0VSX1NCIHwgQ0hfRVdBX1ZBTElEKX0sCi0KLS8qIDExYSBFdXJvcGUgKi8KLS8qIDI2ICovIHsxMDAsIChDSF9VUFBFUl9TQiB8IENIX0VXQV9WQUxJRCl9LAotLyogMjcgKi8gezEwNCwgKENIX0xPV0VSX1NCIHwgQ0hfRVdBX1ZBTElEKX0sCi0vKiAyOCAqLyB7MTA4LCAoQ0hfVVBQRVJfU0IgfCBDSF9FV0FfVkFMSUQpfSwKLS8qIDI5ICovIHsxMTIsIChDSF9MT1dFUl9TQiB8IENIX0VXQV9WQUxJRCl9LAotLyogMzAgKi8gezExNiwgKENIX1VQUEVSX1NCIHwgQ0hfRVdBX1ZBTElEKX0sCi0vKiAzMSAqLyB7MTIwLCAoQ0hfTE9XRVJfU0IgfCBDSF9FV0FfVkFMSUQpfSwKLS8qIDMyICovIHsxMjQsIChDSF9VUFBFUl9TQiB8IENIX0VXQV9WQUxJRCl9LAotLyogMzMgKi8gezEyOCwgKENIX0xPV0VSX1NCIHwgQ0hfRVdBX1ZBTElEKX0sCi0vKiAzNCAqLyB7MTMyLCAoQ0hfVVBQRVJfU0IgfCBDSF9FV0FfVkFMSUQpfSwKLS8qIDM1ICovIHsxMzYsIChDSF9MT1dFUl9TQiB8IENIX0VXQV9WQUxJRCl9LAotLyogMzYgKi8gezE0MCwgKENIX0xPV0VSX1NCKX0sCi0KLS8qIDExYSB1c2EgaGlnaCwgcmVmNSBvbmx5ICovCi0vKiBUaGUgMHg4MCBiaXQgaW4gcGRpdiBtZWFucyB0aGVzZSBhcmUgUkVGNSwgb3RoZXIgZW50cmllcyBhcmUgUkVGMjAgKi8KLS8qIDM3ICovIHsxNDksIChDSF9VUFBFUl9TQiB8IENIX0VXQV9WQUxJRCl9LAotLyogMzggKi8gezE1MywgKENIX0xPV0VSX1NCIHwgQ0hfRVdBX1ZBTElEKX0sCi0vKiAzOSAqLyB7MTU3LCAoQ0hfVVBQRVJfU0IgfCBDSF9FV0FfVkFMSUQpfSwKLS8qIDQwICovIHsxNjEsIChDSF9MT1dFUl9TQiB8IENIX0VXQV9WQUxJRCl9LAotLyogNDEgKi8gezE2NSwgKENIX0xPV0VSX1NCKX0sCi0KLS8qIDExYSBqYXBhbiAqLwotLyogNDIgKi8gezE4NCwgKENIX1VQUEVSX1NCKX0sCi0vKiA0MyAqLyB7MTg4LCAoQ0hfTE9XRVJfU0IpfSwKLS8qIDQ0ICovIHsxOTIsIChDSF9VUFBFUl9TQil9LAotLyogNDUgKi8gezE5NiwgKENIX0xPV0VSX1NCKX0sCi0vKiA0NiAqLyB7MjAwLCAoQ0hfVVBQRVJfU0IpfSwKLS8qIDQ3ICovIHsyMDQsIChDSF9MT1dFUl9TQil9LAotLyogNDggKi8gezIwOCwgKENIX1VQUEVSX1NCKX0sCi0vKiA0OSAqLyB7MjEyLCAoQ0hfTE9XRVJfU0IpfSwKLS8qIDUwICovIHsyMTYsIChDSF9MT1dFUl9TQil9Ci19OwotI2VuZGlmCQkJCS8qIFNVUFBPUlRfNDBNSFogKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBsb2NhbGVfaW5mbyAqYnJjbXNfY19nZXRfbG9jYWxlXzJnKHU4IGxvY2FsZV9pZHgpCi17Ci0JaWYgKGxvY2FsZV9pZHggPj0gQVJSQVlfU0laRShnX2xvY2FsZV8yZ190YWJsZSkpIHsKLQkJcmV0dXJuIE5VTEw7IC8qIGVycm9yIGNvbmRpdGlvbiAqLwotCX0KLQlyZXR1cm4gZ19sb2NhbGVfMmdfdGFibGVbbG9jYWxlX2lkeF07Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbG9jYWxlX2luZm8gKmJyY21zX2NfZ2V0X2xvY2FsZV81Zyh1OCBsb2NhbGVfaWR4KQotewotCWlmIChsb2NhbGVfaWR4ID49IEFSUkFZX1NJWkUoZ19sb2NhbGVfNWdfdGFibGUpKSB7Ci0JCXJldHVybiBOVUxMOyAvKiBlcnJvciBjb25kaXRpb24gKi8KLQl9Ci0JcmV0dXJuIGdfbG9jYWxlXzVnX3RhYmxlW2xvY2FsZV9pZHhdOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGxvY2FsZV9taW1vX2luZm8gKmJyY21zX2NfZ2V0X21pbW9fMmcodTggbG9jYWxlX2lkeCkKLXsKLQlpZiAobG9jYWxlX2lkeCA+PSBBUlJBWV9TSVpFKGdfbWltb18yZ190YWJsZSkpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXJldHVybiBnX21pbW9fMmdfdGFibGVbbG9jYWxlX2lkeF07Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbG9jYWxlX21pbW9faW5mbyAqYnJjbXNfY19nZXRfbWltb181Zyh1OCBsb2NhbGVfaWR4KQotewotCWlmIChsb2NhbGVfaWR4ID49IEFSUkFZX1NJWkUoZ19taW1vXzVnX3RhYmxlKSkgewotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JcmV0dXJuIGdfbWltb181Z190YWJsZVtsb2NhbGVfaWR4XTsKLX0KLQotc3RydWN0IGJyY21zX2NtX2luZm8gKmJyY21zX2NfY2hhbm5lbF9tZ3JfYXR0YWNoKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlzdHJ1Y3QgYnJjbXNfY21faW5mbyAqd2xjX2NtOwotCWNoYXIgY291bnRyeV9hYmJyZXZbQlJDTV9DTlRSWV9CVUZfU1pdOwotCWNvbnN0IHN0cnVjdCBjb3VudHJ5X2luZm8gKmNvdW50cnk7Ci0Jc3RydWN0IGJyY21zX3B1YiAqcHViID0gd2xjLT5wdWI7Ci0JY2hhciAqY2NvZGU7Ci0KLQlCQ01NU0cod2xjLT53aXBoeSwgIndsJWRcbiIsIHdsYy0+cHViLT51bml0KTsKLQotCXdsY19jbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicmNtc19jbV9pbmZvKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHdsY19jbSA9PSBOVUxMKSB7Ci0JCXdpcGh5X2Vycih3bGMtPndpcGh5LCAid2wlZDogJXM6IG91dCBvZiBtZW1vcnkiLCBwdWItPnVuaXQsCi0JCQkgIF9fZnVuY19fKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXdsY19jbS0+cHViID0gcHViOwotCXdsY19jbS0+d2xjID0gd2xjOwotCXdsYy0+Y21pID0gd2xjX2NtOwotCi0JLyogc3RvcmUgdGhlIGNvdW50cnkgY29kZSBmb3IgcGFzc2luZyB1cCBhcyBhIHJlZ3VsYXRvcnkgaGludCAqLwotCWNjb2RlID0gZ2V0dmFyKHdsYy0+cHViLT52YXJzLCAiY2NvZGUiKTsKLQlpZiAoY2NvZGUpIHsKLQkJc3RybmNweSh3bGMtPnB1Yi0+c3JvbV9jY29kZSwgY2NvZGUsIEJSQ01fQ05UUllfQlVGX1NaIC0gMSk7Ci0JfQotCi0JLyogaW50ZXJuYWwgY291bnRyeSBpbmZvcm1hdGlvbiB3aGljaCBtdXN0IG1hdGNoIHJlZ3VsYXRvcnkgY29uc3RyYWludHMgaW4gZmlybXdhcmUgKi8KLQltZW1zZXQoY291bnRyeV9hYmJyZXYsIDAsIEJSQ01fQ05UUllfQlVGX1NaKTsKLQlzdHJuY3B5KGNvdW50cnlfYWJicmV2LCAiWDIiLCBzaXplb2YoY291bnRyeV9hYmJyZXYpIC0gMSk7Ci0JY291bnRyeSA9IGJyY21zX2NfY291bnRyeV9sb29rdXAod2xjLCBjb3VudHJ5X2FiYnJldik7Ci0KLQkvKiBzYXZlIGRlZmF1bHQgY291bnRyeSBmb3IgZXhpdGluZyAxMWQgcmVndWxhdG9yeSBtb2RlICovCi0Jc3RybmNweSh3bGMtPmNvdW50cnlfZGVmYXVsdCwgY291bnRyeV9hYmJyZXYsIEJSQ01fQ05UUllfQlVGX1NaIC0gMSk7Ci0KLQkvKiBpbml0aWFsaXplIGF1dG9jb3VudHJ5X2RlZmF1bHQgdG8gZHJpdmVyIGRlZmF1bHQgKi8KLQlzdHJuY3B5KHdsYy0+YXV0b2NvdW50cnlfZGVmYXVsdCwgIlgyIiwgQlJDTV9DTlRSWV9CVUZfU1ogLSAxKTsKLQotCWJyY21zX2Nfc2V0X2NvdW50cnljb2RlKHdsY19jbSwgY291bnRyeV9hYmJyZXYpOwotCi0JcmV0dXJuIHdsY19jbTsKLX0KLQotdm9pZCBicmNtc19jX2NoYW5uZWxfbWdyX2RldGFjaChzdHJ1Y3QgYnJjbXNfY21faW5mbyAqd2xjX2NtKQotewotCWtmcmVlKHdsY19jbSk7Ci19Ci0KLXU4Ci1icmNtc19jX2NoYW5uZWxfbG9jYWxlX2ZsYWdzX2luX2JhbmQoc3RydWN0IGJyY21zX2NtX2luZm8gKndsY19jbSwKLQkJCQkgICAgIHVpbnQgYmFuZHVuaXQpCi17Ci0JcmV0dXJuIHdsY19jbS0+YmFuZHN0YXRlW2JhbmR1bml0XS5sb2NhbGVfZmxhZ3M7Ci19Ci0KLS8qIHNldCB0aGUgZHJpdmVyJ3MgY3VycmVudCBjb3VudHJ5IGFuZCByZWd1bGF0b3J5IGluZm9ybWF0aW9uIHVzaW5nIGEgY291bnRyeSBjb2RlCi0gKiBhcyB0aGUgc291cmNlLiBMb29rdXAgYnVpbHQgaW4gY291bnRyeSBpbmZvcm1hdGlvbiBmb3VuZCB3aXRoIHRoZSBjb3VudHJ5IGNvZGUuCi0gKi8KLXN0YXRpYyBpbnQKLWJyY21zX2Nfc2V0X2NvdW50cnljb2RlKHN0cnVjdCBicmNtc19jbV9pbmZvICp3bGNfY20sIGNvbnN0IGNoYXIgKmNjb2RlKQotewotCWNoYXIgY291bnRyeV9hYmJyZXZbQlJDTV9DTlRSWV9CVUZfU1pdOwotCXN0cm5jcHkoY291bnRyeV9hYmJyZXYsIGNjb2RlLCBCUkNNX0NOVFJZX0JVRl9TWik7Ci0JcmV0dXJuIGJyY21zX2Nfc2V0X2NvdW50cnljb2RlX3Jldih3bGNfY20sIGNvdW50cnlfYWJicmV2LCBjY29kZSwgLTEpOwotfQotCi1zdGF0aWMgaW50Ci1icmNtc19jX3NldF9jb3VudHJ5Y29kZV9yZXYoc3RydWN0IGJyY21zX2NtX2luZm8gKndsY19jbSwKLQkJCWNvbnN0IGNoYXIgKmNvdW50cnlfYWJicmV2LAotCQkJY29uc3QgY2hhciAqY2NvZGUsIGludCByZWdyZXYpCi17Ci0JY29uc3Qgc3RydWN0IGNvdW50cnlfaW5mbyAqY291bnRyeTsKLQljaGFyIG1hcHBlZF9jY29kZVtCUkNNX0NOVFJZX0JVRl9TWl07Ci0JdWludCBtYXBwZWRfcmVncmV2OwotCi0JLyogaWYgcmVncmV2IGlzIC0xLCBsb29rdXAgdGhlIG1hcHBlZCBjb3VudHJ5IGNvZGUsCi0JICogb3RoZXJ3aXNlIHVzZSB0aGUgY2NvZGUgYW5kIHJlZ3JldiBkaXJlY3RseQotCSAqLwotCWlmIChyZWdyZXYgPT0gLTEpIHsKLQkJLyogbWFwIHRoZSBjb3VudHJ5IGNvZGUgdG8gYSBidWlsdC1pbiBjb3VudHJ5IGNvZGUsIHJlZ3JldiwgYW5kIGNvdW50cnlfaW5mbyAqLwotCQljb3VudHJ5ID0KLQkJICAgIGJyY21zX2NfY291bnRyeWNvZGVfbWFwKHdsY19jbSwgY2NvZGUsIG1hcHBlZF9jY29kZSwKLQkJCQkJJm1hcHBlZF9yZWdyZXYpOwotCX0gZWxzZSB7Ci0JCS8qIGZpbmQgdGhlIG1hdGNoaW5nIGJ1aWx0LWluIGNvdW50cnkgZGVmaW5pdGlvbiAqLwotCQljb3VudHJ5ID0gYnJjbXNfY19jb3VudHJ5X2xvb2t1cF9kaXJlY3QoY2NvZGUsIHJlZ3Jldik7Ci0JCXN0cm5jcHkobWFwcGVkX2Njb2RlLCBjY29kZSwgQlJDTV9DTlRSWV9CVUZfU1opOwotCQltYXBwZWRfcmVncmV2ID0gcmVncmV2OwotCX0KLQotCWlmIChjb3VudHJ5ID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogc2V0IHRoZSBkcml2ZXIgc3RhdGUgZm9yIHRoZSBjb3VudHJ5ICovCi0JYnJjbXNfY19zZXRfY291bnRyeV9jb21tb24od2xjX2NtLCBjb3VudHJ5X2FiYnJldiwgbWFwcGVkX2Njb2RlLAotCQkJICAgICAgIG1hcHBlZF9yZWdyZXYsIGNvdW50cnkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIHNldCB0aGUgZHJpdmVyJ3MgY3VycmVudCBjb3VudHJ5IGFuZCByZWd1bGF0b3J5IGluZm9ybWF0aW9uIHVzaW5nIGEgY291bnRyeSBjb2RlCi0gKiBhcyB0aGUgc291cmNlLiBMb29rIHVwIGJ1aWx0IGluIGNvdW50cnkgaW5mb3JtYXRpb24gZm91bmQgd2l0aCB0aGUgY291bnRyeSBjb2RlLgotICovCi1zdGF0aWMgdm9pZAotYnJjbXNfY19zZXRfY291bnRyeV9jb21tb24oc3RydWN0IGJyY21zX2NtX2luZm8gKndsY19jbSwKLQkJICAgICAgIGNvbnN0IGNoYXIgKmNvdW50cnlfYWJicmV2LAotCQkgICAgICAgY29uc3QgY2hhciAqY2NvZGUsIHVpbnQgcmVncmV2LAotCQkgICAgICAgY29uc3Qgc3RydWN0IGNvdW50cnlfaW5mbyAqY291bnRyeSkKLXsKLQljb25zdCBzdHJ1Y3QgbG9jYWxlX21pbW9faW5mbyAqbGlfbWltbzsKLQljb25zdCBzdHJ1Y3QgbG9jYWxlX2luZm8gKmxvY2FsZTsKLQlzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMgPSB3bGNfY20tPndsYzsKLQljaGFyIHByZXZfY291bnRyeV9hYmJyZXZbQlJDTV9DTlRSWV9CVUZfU1pdOwotCi0JLyogc2F2ZSBjdXJyZW50IGNvdW50cnkgc3RhdGUgKi8KLQl3bGNfY20tPmNvdW50cnkgPSBjb3VudHJ5OwotCi0JbWVtc2V0KCZwcmV2X2NvdW50cnlfYWJicmV2LCAwLCBCUkNNX0NOVFJZX0JVRl9TWik7Ci0Jc3RybmNweShwcmV2X2NvdW50cnlfYWJicmV2LCB3bGNfY20tPmNvdW50cnlfYWJicmV2LAotCQlCUkNNX0NOVFJZX0JVRl9TWiAtIDEpOwotCi0Jc3RybmNweSh3bGNfY20tPmNvdW50cnlfYWJicmV2LCBjb3VudHJ5X2FiYnJldiwgQlJDTV9DTlRSWV9CVUZfU1ogLSAxKTsKLQlzdHJuY3B5KHdsY19jbS0+Y2NvZGUsIGNjb2RlLCBCUkNNX0NOVFJZX0JVRl9TWiAtIDEpOwotCXdsY19jbS0+cmVncmV2ID0gcmVncmV2OwotCi0JLyogZGlzYWJsZS9yZXN0b3JlIG5tb2RlIGJhc2VkIG9uIGNvdW50cnkgcmVndWxhdGlvbnMgKi8KLQlsaV9taW1vID0gYnJjbXNfY19nZXRfbWltb18yZyhjb3VudHJ5LT5sb2NhbGVfbWltb18yRyk7Ci0JaWYgKGxpX21pbW8gJiYgKGxpX21pbW8tPmZsYWdzICYgQlJDTVNfTk9fTUlNTykpIHsKLQkJYnJjbXNfY19zZXRfbm1vZGUod2xjLCBPRkYpOwotCQl3bGMtPnN0Zi0+bm9fY2Rkc3RiYyA9IHRydWU7Ci0JfSBlbHNlIHsKLQkJd2xjLT5zdGYtPm5vX2NkZHN0YmMgPSBmYWxzZTsKLQkJaWYgKE5fRU5BQih3bGMtPnB1YikgIT0gd2xjLT5wcm90ZWN0aW9uLT5ubW9kZV91c2VyKQotCQkJYnJjbXNfY19zZXRfbm1vZGUod2xjLCB3bGMtPnByb3RlY3Rpb24tPm5tb2RlX3VzZXIpOwotCX0KLQotCWJyY21zX2Nfc3RmX3NzX3VwZGF0ZSh3bGMsIHdsYy0+YmFuZHN0YXRlW0JBTkRfMkdfSU5ERVhdKTsKLQlicmNtc19jX3N0Zl9zc191cGRhdGUod2xjLCB3bGMtPmJhbmRzdGF0ZVtCQU5EXzVHX0lOREVYXSk7Ci0JLyogc2V0IG9yIHJlc3RvcmUgZ21vZGUgYXMgcmVxdWlyZWQgYnkgcmVndWxhdG9yeSAqLwotCWxvY2FsZSA9IGJyY21zX2NfZ2V0X2xvY2FsZV8yZyhjb3VudHJ5LT5sb2NhbGVfMkcpOwotCWlmIChsb2NhbGUgJiYgKGxvY2FsZS0+ZmxhZ3MgJiBCUkNNU19OT19PRkRNKSkgewotCQlicmNtc19jX3NldF9nbW9kZSh3bGMsIEdNT0RFX0xFR0FDWV9CLCBmYWxzZSk7Ci0JfSBlbHNlIHsKLQkJYnJjbXNfY19zZXRfZ21vZGUod2xjLCB3bGMtPnByb3RlY3Rpb24tPmdtb2RlX3VzZXIsIGZhbHNlKTsKLQl9Ci0KLQlicmNtc19jX2NoYW5uZWxzX2luaXQod2xjX2NtLCBjb3VudHJ5KTsKLQotCXJldHVybjsKLX0KLQotLyogTG9va3VwIGEgY291bnRyeSBpbmZvIHN0cnVjdHVyZSBmcm9tIGEgbnVsbCB0ZXJtaW5hdGVkIGNvdW50cnkgY29kZQotICogVGhlIGxvb2t1cCBpcyBjYXNlIHNlbnNpdGl2ZS4KLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBjb3VudHJ5X2luZm8gKgotYnJjbXNfY19jb3VudHJ5X2xvb2t1cChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGNvbnN0IGNoYXIgKmNjb2RlKQotewotCWNvbnN0IHN0cnVjdCBjb3VudHJ5X2luZm8gKmNvdW50cnk7Ci0JY2hhciBtYXBwZWRfY2NvZGVbQlJDTV9DTlRSWV9CVUZfU1pdOwotCXVpbnQgbWFwcGVkX3JlZ3JldjsKLQotCS8qIG1hcCB0aGUgY291bnRyeSBjb2RlIHRvIGEgYnVpbHQtaW4gY291bnRyeSBjb2RlLCByZWdyZXYsIGFuZCBjb3VudHJ5X2luZm8gc3RydWN0ICovCi0JY291bnRyeSA9IGJyY21zX2NfY291bnRyeWNvZGVfbWFwKHdsYy0+Y21pLCBjY29kZSwgbWFwcGVkX2Njb2RlLAotCQkJCQkgICZtYXBwZWRfcmVncmV2KTsKLQotCXJldHVybiBjb3VudHJ5OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNvdW50cnlfaW5mbyAqCi1icmNtc19jX2NvdW50cnljb2RlX21hcChzdHJ1Y3QgYnJjbXNfY21faW5mbyAqd2xjX2NtLCBjb25zdCBjaGFyICpjY29kZSwKLQkJCWNoYXIgKm1hcHBlZF9jY29kZSwgdWludCAqbWFwcGVkX3JlZ3JldikKLXsKLQlzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMgPSB3bGNfY20tPndsYzsKLQljb25zdCBzdHJ1Y3QgY291bnRyeV9pbmZvICpjb3VudHJ5OwotCXVpbnQgc3JvbV9yZWdyZXYgPSB3bGNfY20tPnNyb21fcmVncmV2OwotCWNvbnN0IGNoYXIgKnNyb21fY2NvZGUgPSB3bGNfY20tPnNyb21fY2NvZGU7Ci0JaW50IG1hcHBlZDsKLQotCS8qIGNoZWNrIGZvciBjdXJyZW50bHkgc3VwcG9ydGVkIGNjb2RlIHNpemUgKi8KLQlpZiAoc3RybGVuKGNjb2RlKSA+IChCUkNNX0NOVFJZX0JVRl9TWiAtIDEpKSB7Ci0JCXdpcGh5X2Vycih3bGMtPndpcGh5LCAid2wlZDogJXM6IGNjb2RlIFwiJXNcIiB0b28gbG9uZyBmb3IgIgotCQkJICAibWF0Y2hcbiIsIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXywgY2NvZGUpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQkvKiBkZWZhdWx0IG1hcHBpbmcgaXMgdGhlIGdpdmVuIGNjb2RlIGFuZCByZWdyZXYgMCAqLwotCXN0cm5jcHkobWFwcGVkX2Njb2RlLCBjY29kZSwgQlJDTV9DTlRSWV9CVUZfU1opOwotCSptYXBwZWRfcmVncmV2ID0gMDsKLQotCS8qIElmIHRoZSBkZXNpcmVkIGNvdW50cnkgY29kZSBtYXRjaGVzIHRoZSBzcm9tIGNvdW50cnkgY29kZSwKLQkgKiB0aGVuIHRoZSBtYXBwZWQgY291bnRyeSBpcyB0aGUgc3JvbSByZWd1bGF0b3J5IHJldi4KLQkgKiBPdGhlcndpc2UgbG9vayBmb3IgYW4gYWdncmVnYXRlIG1hcHBpbmcuCi0JICovCi0JaWYgKCFzdHJjbXAoc3JvbV9jY29kZSwgY2NvZGUpKSB7Ci0JCSptYXBwZWRfcmVncmV2ID0gc3JvbV9yZWdyZXY7Ci0JCW1hcHBlZCA9IDA7Ci0JCXdpcGh5X2Vycih3bGMtPndpcGh5LCAic3JvbV9jb2RlID09IGNjb2RlICVzXG4iLCBfX2Z1bmNfXyk7Ci0JfSBlbHNlIHsKLQkJbWFwcGVkID0KLQkJICAgIGJyY21zX2NfY291bnRyeV9hZ2dyZWdhdGVfbWFwKHdsY19jbSwgY2NvZGUsIG1hcHBlZF9jY29kZSwKLQkJCQkJICAgICAgbWFwcGVkX3JlZ3Jldik7Ci0JfQotCi0JLyogZmluZCB0aGUgbWF0Y2hpbmcgYnVpbHQtaW4gY291bnRyeSBkZWZpbml0aW9uICovCi0JY291bnRyeSA9IGJyY21zX2NfY291bnRyeV9sb29rdXBfZGlyZWN0KG1hcHBlZF9jY29kZSwgKm1hcHBlZF9yZWdyZXYpOwotCi0JLyogaWYgdGhlcmUgaXMgbm90IGFuIGV4YWN0IHJldiBtYXRjaCwgZGVmYXVsdCB0byByZXYgemVybyAqLwotCWlmIChjb3VudHJ5ID09IE5VTEwgJiYgKm1hcHBlZF9yZWdyZXYgIT0gMCkgewotCQkqbWFwcGVkX3JlZ3JldiA9IDA7Ci0JCWNvdW50cnkgPQotCQkgICAgYnJjbXNfY19jb3VudHJ5X2xvb2t1cF9kaXJlY3QobWFwcGVkX2Njb2RlLCAqbWFwcGVkX3JlZ3Jldik7Ci0JfQotCi0JcmV0dXJuIGNvdW50cnk7Ci19Ci0KLXN0YXRpYyBpbnQKLWJyY21zX2NfY291bnRyeV9hZ2dyZWdhdGVfbWFwKHN0cnVjdCBicmNtc19jbV9pbmZvICp3bGNfY20sIGNvbnN0IGNoYXIgKmNjb2RlLAotCQkJICBjaGFyICptYXBwZWRfY2NvZGUsIHVpbnQgKm1hcHBlZF9yZWdyZXYpCi17Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKiBMb29rdXAgYSBjb3VudHJ5IGluZm8gc3RydWN0dXJlIGZyb20gYSBudWxsIHRlcm1pbmF0ZWQgY291bnRyeQotICogYWJicmV2aWF0aW9uIGFuZCByZWdyZXYgZGlyZWN0bHkgd2l0aCBubyB0cmFuc2xhdGlvbi4KLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBjb3VudHJ5X2luZm8gKgotYnJjbXNfY19jb3VudHJ5X2xvb2t1cF9kaXJlY3QoY29uc3QgY2hhciAqY2NvZGUsIHVpbnQgcmVncmV2KQotewotCXVpbnQgc2l6ZSwgaTsKLQotCS8qIFNob3VsZCBqdXN0IHJldHVybiAwIGZvciBzaW5nbGUgbG9jYWxlIGRyaXZlci4gKi8KLQkvKiBLZWVwIGl0IHRoaXMgd2F5IGluIGNhc2Ugd2UgYWRkIG1vcmUgbG9jYWxlcy4gKGZvciBub3cgYW55d2F5KSAqLwotCi0JLyogYWxsIG90aGVyIGNvdW50cnkgZGVmIGFycmF5cyBhcmUgZm9yIHJlZ3JldiA9PSAwLCBzbyBpZiByZWdyZXYgaXMgbm9uLXplcm8sIGZhaWwgKi8KLQlpZiAocmVncmV2ID4gMCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiBmaW5kIG1hdGNoZWQgdGFibGUgZW50cnkgZnJvbSBjb3VudHJ5IGNvZGUgKi8KLQlzaXplID0gQVJSQVlfU0laRShjbnRyeV9sb2NhbGVzKTsKLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCWlmIChzdHJjbXAoY2NvZGUsIGNudHJ5X2xvY2FsZXNbaV0uYWJicmV2KSA9PSAwKSB7Ci0JCQlyZXR1cm4gJmNudHJ5X2xvY2FsZXNbaV0uY291bnRyeTsKLQkJfQotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludAotYnJjbXNfY19jaGFubmVsc19pbml0KHN0cnVjdCBicmNtc19jbV9pbmZvICp3bGNfY20sCi0JCSAgICAgIGNvbnN0IHN0cnVjdCBjb3VudHJ5X2luZm8gKmNvdW50cnkpCi17Ci0Jc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjID0gd2xjX2NtLT53bGM7Ci0JdWludCBpLCBqOwotCXN0cnVjdCBicmNtc19iYW5kICpiYW5kOwotCWNvbnN0IHN0cnVjdCBsb2NhbGVfaW5mbyAqbGk7Ci0JY2hhbnZlY190IHN1cF9jaGFuOwotCWNvbnN0IHN0cnVjdCBsb2NhbGVfbWltb19pbmZvICpsaV9taW1vOwotCi0JYmFuZCA9IHdsYy0+YmFuZDsKLQlmb3IgKGkgPSAwOyBpIDwgTkJBTkRTKHdsYyk7Ci0JICAgICBpKyssIGJhbmQgPSB3bGMtPmJhbmRzdGF0ZVtPVEhFUkJBTkRVTklUKHdsYyldKSB7Ci0KLQkJbGkgPSBCQU5EXzVHKGJhbmQtPmJhbmR0eXBlKSA/Ci0JCSAgICBicmNtc19jX2dldF9sb2NhbGVfNWcoY291bnRyeS0+bG9jYWxlXzVHKSA6Ci0JCSAgICBicmNtc19jX2dldF9sb2NhbGVfMmcoY291bnRyeS0+bG9jYWxlXzJHKTsKLQkJd2xjX2NtLT5iYW5kc3RhdGVbYmFuZC0+YmFuZHVuaXRdLmxvY2FsZV9mbGFncyA9IGxpLT5mbGFnczsKLQkJbGlfbWltbyA9IEJBTkRfNUcoYmFuZC0+YmFuZHR5cGUpID8KLQkJICAgIGJyY21zX2NfZ2V0X21pbW9fNWcoY291bnRyeS0+bG9jYWxlX21pbW9fNUcpIDoKLQkJICAgIGJyY21zX2NfZ2V0X21pbW9fMmcoY291bnRyeS0+bG9jYWxlX21pbW9fMkcpOwotCi0JCS8qIG1lcmdlIHRoZSBtaW1vIG5vbi1taW1vIGxvY2FsZSBmbGFncyAqLwotCQl3bGNfY20tPmJhbmRzdGF0ZVtiYW5kLT5iYW5kdW5pdF0ubG9jYWxlX2ZsYWdzIHw9Ci0JCSAgICBsaV9taW1vLT5mbGFnczsKLQotCQl3bGNfY20tPmJhbmRzdGF0ZVtiYW5kLT5iYW5kdW5pdF0ucmVzdHJpY3RlZF9jaGFubmVscyA9Ci0JCSAgICBnX3RhYmxlX3Jlc3RyaWN0ZWRfY2hhbltsaS0+cmVzdHJpY3RlZF9jaGFubmVsc107Ci0JCXdsY19jbS0+YmFuZHN0YXRlW2JhbmQtPmJhbmR1bml0XS5yYWRhcl9jaGFubmVscyA9Ci0JCSAgICBnX3RhYmxlX3JhZGFyX3NldFtsaS0+cmFkYXJfY2hhbm5lbHNdOwotCi0JCS8qIHNldCB0aGUgY2hhbm5lbCBhdmFpbGFiaWxpdHksCi0JCSAqIG1hc2tpbmcgb3V0IHRoZSBjaGFubmVscyB0aGF0IG1heSBub3QgYmUgc3VwcG9ydGVkIG9uIHRoaXMgcGh5Ci0JCSAqLwotCQl3bGNfcGh5X2NoYW5zcGVjX2JhbmRfdmFsaWRjaChiYW5kLT5waSwgYmFuZC0+YmFuZHR5cGUsCi0JCQkJCSAgICAgICZzdXBfY2hhbik7Ci0JCWJyY21zX2NfbG9jYWxlX2dldF9jaGFubmVscyhsaSwKLQkJCQkJJndsY19jbS0+YmFuZHN0YXRlW2JhbmQtPmJhbmR1bml0XS4KLQkJCQkJdmFsaWRfY2hhbm5lbHMpOwotCQlmb3IgKGogPSAwOyBqIDwgc2l6ZW9mKGNoYW52ZWNfdCk7IGorKykKLQkJCXdsY19jbS0+YmFuZHN0YXRlW2JhbmQtPmJhbmR1bml0XS52YWxpZF9jaGFubmVscy4KLQkJCSAgICB2ZWNbal0gJj0gc3VwX2NoYW4udmVjW2pdOwotCX0KLQotCWJyY21zX2NfcXVpZXRfY2hhbm5lbHNfcmVzZXQod2xjX2NtKTsKLQlicmNtc19jX2NoYW5uZWxzX2NvbW1pdCh3bGNfY20pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFVwZGF0ZSB0aGUgcmFkaW8gc3RhdGUgKGVuYWJsZS9kaXNhYmxlKSBhbmQgdHggcG93ZXIgdGFyZ2V0cwotICogYmFzZWQgb24gYSBuZXcgc2V0IG9mIGNoYW5uZWwvcmVndWxhdG9yeSBpbmZvcm1hdGlvbgotICovCi1zdGF0aWMgdm9pZCBicmNtc19jX2NoYW5uZWxzX2NvbW1pdChzdHJ1Y3QgYnJjbXNfY21faW5mbyAqd2xjX2NtKQotewotCXN0cnVjdCBicmNtc19jX2luZm8gKndsYyA9IHdsY19jbS0+d2xjOwotCXVpbnQgY2hhbjsKLQlzdHJ1Y3QgdHhwd3JfbGltaXRzIHR4cHdyOwotCi0JLyogc2VhcmNoIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFueSB2YWxpZCBjaGFubmVsICovCi0JZm9yIChjaGFuID0gMDsgY2hhbiA8IE1BWENIQU5ORUw7IGNoYW4rKykgewotCQlpZiAoVkFMSURfQ0hBTk5FTDIwX0RCKHdsYywgY2hhbikpIHsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChjaGFuID09IE1BWENIQU5ORUwpCi0JCWNoYW4gPSBJTlZDSEFOTkVMOwotCi0JLyogYmFzZWQgb24gdGhlIGNoYW5uZWwgc2VhcmNoIGFib3ZlLCBzZXQgb3IgY2xlYXIgV0xfUkFESU9fQ09VTlRSWV9ESVNBQkxFICovCi0JaWYgKGNoYW4gPT0gSU5WQ0hBTk5FTCkgewotCQkvKiBjb3VudHJ5L2xvY2FsZSB3aXRoIG5vIHZhbGlkIGNoYW5uZWxzLCBzZXQgdGhlIHJhZGlvIGRpc2FibGUgYml0ICovCi0JCW1ib29sc2V0KHdsYy0+cHViLT5yYWRpb19kaXNhYmxlZCwgV0xfUkFESU9fQ09VTlRSWV9ESVNBQkxFKTsKLQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICJ3bCVkOiAlczogbm8gdmFsaWQgY2hhbm5lbCBmb3IgXCIlc1wiICIKLQkJCSAgIm5iYW5kcyAlZCBiYW5kbG9ja2VkICVkXG4iLCB3bGMtPnB1Yi0+dW5pdCwKLQkJCSAgX19mdW5jX18sIHdsY19jbS0+Y291bnRyeV9hYmJyZXYsIE5CQU5EUyh3bGMpLAotCQkJICB3bGMtPmJhbmRsb2NrZWQpOwotCX0gZWxzZQotCSAgICBpZiAobWJvb2xpc3NldCh3bGMtPnB1Yi0+cmFkaW9fZGlzYWJsZWQsCi0JCVdMX1JBRElPX0NPVU5UUllfRElTQUJMRSkpIHsKLQkJLyogY291bnRyeS9sb2NhbGUgd2l0aCB2YWxpZCBjaGFubmVsLCBjbGVhciB0aGUgcmFkaW8gZGlzYWJsZSBiaXQgKi8KLQkJbWJvb2xjbHIod2xjLT5wdWItPnJhZGlvX2Rpc2FibGVkLCBXTF9SQURJT19DT1VOVFJZX0RJU0FCTEUpOwotCX0KLQotCS8qIE5vdyB0aGF0IHRoZSBjb3VudHJ5IGFiYnJldmlhdGlvbiBpcyBzZXQsIGlmIHRoZSByYWRpbyBzdXBwb3J0cyAyRywgdGhlbgotCSAqIHNldCBjaGFubmVsIDE0IHJlc3RyaWN0aW9ucyBiYXNlZCBvbiB0aGUgbmV3IGxvY2FsZS4KLQkgKi8KLQlpZiAoTkJBTkRTKHdsYykgPiAxIHx8IEJBTkRfMkcod2xjLT5iYW5kLT5iYW5kdHlwZSkpIHsKLQkJd2xjX3BoeV9jaGFuc3BlY19jaDE0X3dpZGVmaWx0ZXJfc2V0KHdsYy0+YmFuZC0+cGksCi0JCQkJCQkgICAgIGJyY21zX2NfamFwYW4od2xjKSA/IHRydWUgOgotCQkJCQkJICAgICBmYWxzZSk7Ci0JfQotCi0JaWYgKHdsYy0+cHViLT51cCAmJiBjaGFuICE9IElOVkNIQU5ORUwpIHsKLQkJYnJjbXNfY19jaGFubmVsX3JlZ19saW1pdHMod2xjX2NtLCB3bGMtPmNoYW5zcGVjLCAmdHhwd3IpOwotCQlicmNtc19jX2NoYW5uZWxfbWluX3R4cG93ZXJfbGltaXRzX3dpdGhfbG9jYWxfY29uc3RyYWludCh3bGNfY20sCi0JCQkmdHhwd3IsIEJSQ01TX1RYUFdSX01BWCk7Ci0JCXdsY19waHlfdHhwb3dlcl9saW1pdF9zZXQod2xjLT5iYW5kLT5waSwgJnR4cHdyLCB3bGMtPmNoYW5zcGVjKTsKLQl9Ci19Ci0KLS8qIHJlc2V0IHRoZSBxdWlldCBjaGFubmVscyB2ZWN0b3IgdG8gdGhlIHVuaW9uIG9mIHRoZSByZXN0cmljdGVkIGFuZCByYWRhciBjaGFubmVsIHNldHMgKi8KLXN0YXRpYyB2b2lkIGJyY21zX2NfcXVpZXRfY2hhbm5lbHNfcmVzZXQoc3RydWN0IGJyY21zX2NtX2luZm8gKndsY19jbSkKLXsKLQlzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMgPSB3bGNfY20tPndsYzsKLQl1aW50IGksIGo7Ci0Jc3RydWN0IGJyY21zX2JhbmQgKmJhbmQ7Ci0JY29uc3QgY2hhbnZlY190ICpjaGFudmVjOwotCi0JbWVtc2V0KCZ3bGNfY20tPnF1aWV0X2NoYW5uZWxzLCAwLCBzaXplb2YoY2hhbnZlY190KSk7Ci0KLQliYW5kID0gd2xjLT5iYW5kOwotCWZvciAoaSA9IDA7IGkgPCBOQkFORFMod2xjKTsKLQkgICAgIGkrKywgYmFuZCA9IHdsYy0+YmFuZHN0YXRlW09USEVSQkFORFVOSVQod2xjKV0pIHsKLQotCQkvKiBpbml0aWFsaXplIHF1aWV0IGNoYW5uZWxzIGZvciByZXN0cmljdGVkIGNoYW5uZWxzICovCi0JCWNoYW52ZWMgPSB3bGNfY20tPmJhbmRzdGF0ZVtiYW5kLT5iYW5kdW5pdF0ucmVzdHJpY3RlZF9jaGFubmVsczsKLQkJZm9yIChqID0gMDsgaiA8IHNpemVvZihjaGFudmVjX3QpOyBqKyspCi0JCQl3bGNfY20tPnF1aWV0X2NoYW5uZWxzLnZlY1tqXSB8PSBjaGFudmVjLT52ZWNbal07Ci0KLQl9Ci19Ci0KLXN0YXRpYyBib29sCi1icmNtc19jX3F1aWV0X2NoYW5zcGVjKHN0cnVjdCBicmNtc19jbV9pbmZvICp3bGNfY20sIGNoYW5zcGVjX3QgY2hzcGVjKQotewotCXJldHVybiBOX0VOQUIod2xjX2NtLT53bGMtPnB1YikgJiYgQ0hTUEVDX0lTNDAoY2hzcGVjKSA/Ci0JCShpc3NldAotCQkgKHdsY19jbS0+cXVpZXRfY2hhbm5lbHMudmVjLAotCQkgIExPV0VSXzIwX1NCKENIU1BFQ19DSEFOTkVMKGNoc3BlYykpKQotCQkgfHwgaXNzZXQod2xjX2NtLT5xdWlldF9jaGFubmVscy52ZWMsCi0JCQkgIFVQUEVSXzIwX1NCKENIU1BFQ19DSEFOTkVMKGNoc3BlYykpKSkgOiBpc3NldCh3bGNfY20tPgotCQkJCQkJCQkJcXVpZXRfY2hhbm5lbHMuCi0JCQkJCQkJCQl2ZWMsCi0JCQkJCQkJCQlDSFNQRUNfQ0hBTk5FTAotCQkJCQkJCQkJKGNoc3BlYykpOwotfQotCi0vKiBJcyB0aGUgY2hhbm5lbCB2YWxpZCBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlPyAoYnV0IGRvbid0IGNvbnNpZGVyIGNoYW5uZWxzIG5vdAotICogICBhdmFpbGFibGUgZHVlIHRvIGJhbmRsb2NraW5nKQotICovCi1zdGF0aWMgYm9vbCBicmNtc19jX3ZhbGlkX2NoYW5uZWwyMF9kYihzdHJ1Y3QgYnJjbXNfY21faW5mbyAqd2xjX2NtLCB1aW50IHZhbCkKLXsKLQlzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMgPSB3bGNfY20tPndsYzsKLQotCXJldHVybiBWQUxJRF9DSEFOTkVMMjAod2xjLCB2YWwpIHx8Ci0JCSghd2xjLT5iYW5kbG9ja2VkCi0JCSAmJiBWQUxJRF9DSEFOTkVMMjBfSU5fQkFORCh3bGMsIE9USEVSQkFORFVOSVQod2xjKSwgdmFsKSk7Ci19Ci0KLS8qIElzIHRoZSBjaGFubmVsIHZhbGlkIGZvciB0aGUgY3VycmVudCBsb2NhbGUgYW5kIHNwZWNpZmllZCBiYW5kPyAqLwotc3RhdGljIGJvb2wgYnJjbXNfY192YWxpZF9jaGFubmVsMjBfaW5fYmFuZChzdHJ1Y3QgYnJjbXNfY21faW5mbyAqd2xjX2NtLAotCQkJCQkgICAgdWludCBiYW5kdW5pdCwgdWludCB2YWwpCi17Ci0JcmV0dXJuICgodmFsIDwgTUFYQ0hBTk5FTCkKLQkJJiYgaXNzZXQod2xjX2NtLT5iYW5kc3RhdGVbYmFuZHVuaXRdLnZhbGlkX2NoYW5uZWxzLnZlYywgdmFsKSk7Ci19Ci0KLS8qIElzIHRoZSBjaGFubmVsIHZhbGlkIGZvciB0aGUgY3VycmVudCBsb2NhbGUgYW5kIGN1cnJlbnQgYmFuZD8gKi8KLXN0YXRpYyBib29sIGJyY21zX2NfdmFsaWRfY2hhbm5lbDIwKHN0cnVjdCBicmNtc19jbV9pbmZvICp3bGNfY20sIHVpbnQgdmFsKQotewotCXN0cnVjdCBicmNtc19jX2luZm8gKndsYyA9IHdsY19jbS0+d2xjOwotCi0JcmV0dXJuICgodmFsIDwgTUFYQ0hBTk5FTCkgJiYKLQkJaXNzZXQod2xjX2NtLT5iYW5kc3RhdGVbd2xjLT5iYW5kLT5iYW5kdW5pdF0udmFsaWRfY2hhbm5lbHMudmVjLAotCQkgICAgICB2YWwpKTsKLX0KLQotc3RhdGljIHZvaWQKLWJyY21zX2NfY2hhbm5lbF9taW5fdHhwb3dlcl9saW1pdHNfd2l0aF9sb2NhbF9jb25zdHJhaW50KAotCQlzdHJ1Y3QgYnJjbXNfY21faW5mbyAqd2xjX2NtLCBzdHJ1Y3QgdHhwd3JfbGltaXRzICp0eHB3ciwKLQkJdTggbG9jYWxfY29uc3RyYWludF9xZGJtKQotewotCWludCBqOwotCi0JLyogQ0NLIFJhdGVzICovCi0JZm9yIChqID0gMDsgaiA8IFdMX1RYX1BPV0VSX0NDS19OVU07IGorKykgewotCQl0eHB3ci0+Y2NrW2pdID0gbWluKHR4cHdyLT5jY2tbal0sIGxvY2FsX2NvbnN0cmFpbnRfcWRibSk7Ci0JfQotCi0JLyogMjAgTUh6IExlZ2FjeSBPRkRNIFNJU08gKi8KLQlmb3IgKGogPSAwOyBqIDwgV0xfVFhfUE9XRVJfT0ZETV9OVU07IGorKykgewotCQl0eHB3ci0+b2ZkbVtqXSA9IG1pbih0eHB3ci0+b2ZkbVtqXSwgbG9jYWxfY29uc3RyYWludF9xZGJtKTsKLQl9Ci0KLQkvKiAyMCBNSHogTGVnYWN5IE9GRE0gQ0REICovCi0JZm9yIChqID0gMDsgaiA8IEJSQ01TX05VTV9SQVRFU19PRkRNOyBqKyspIHsKLQkJdHhwd3ItPm9mZG1fY2RkW2pdID0KLQkJICAgIG1pbih0eHB3ci0+b2ZkbV9jZGRbal0sIGxvY2FsX2NvbnN0cmFpbnRfcWRibSk7Ci0JfQotCi0JLyogNDAgTUh6IExlZ2FjeSBPRkRNIFNJU08gKi8KLQlmb3IgKGogPSAwOyBqIDwgQlJDTVNfTlVNX1JBVEVTX09GRE07IGorKykgewotCQl0eHB3ci0+b2ZkbV80MF9zaXNvW2pdID0KLQkJICAgIG1pbih0eHB3ci0+b2ZkbV80MF9zaXNvW2pdLCBsb2NhbF9jb25zdHJhaW50X3FkYm0pOwotCX0KLQotCS8qIDQwIE1IeiBMZWdhY3kgT0ZETSBDREQgKi8KLQlmb3IgKGogPSAwOyBqIDwgQlJDTVNfTlVNX1JBVEVTX09GRE07IGorKykgewotCQl0eHB3ci0+b2ZkbV80MF9jZGRbal0gPQotCQkgICAgbWluKHR4cHdyLT5vZmRtXzQwX2NkZFtqXSwgbG9jYWxfY29uc3RyYWludF9xZGJtKTsKLQl9Ci0KLQkvKiAyME1IeiBNQ1MgMC03IFNJU08gKi8KLQlmb3IgKGogPSAwOyBqIDwgQlJDTVNfTlVNX1JBVEVTX01DU18xX1NUUkVBTTsgaisrKSB7Ci0JCXR4cHdyLT5tY3NfMjBfc2lzb1tqXSA9Ci0JCSAgICBtaW4odHhwd3ItPm1jc18yMF9zaXNvW2pdLCBsb2NhbF9jb25zdHJhaW50X3FkYm0pOwotCX0KLQotCS8qIDIwTUh6IE1DUyAwLTcgQ0REICovCi0JZm9yIChqID0gMDsgaiA8IEJSQ01TX05VTV9SQVRFU19NQ1NfMV9TVFJFQU07IGorKykgewotCQl0eHB3ci0+bWNzXzIwX2NkZFtqXSA9Ci0JCSAgICBtaW4odHhwd3ItPm1jc18yMF9jZGRbal0sIGxvY2FsX2NvbnN0cmFpbnRfcWRibSk7Ci0JfQotCi0JLyogMjBNSHogTUNTIDAtNyBTVEJDICovCi0JZm9yIChqID0gMDsgaiA8IEJSQ01TX05VTV9SQVRFU19NQ1NfMV9TVFJFQU07IGorKykgewotCQl0eHB3ci0+bWNzXzIwX3N0YmNbal0gPQotCQkgICAgbWluKHR4cHdyLT5tY3NfMjBfc3RiY1tqXSwgbG9jYWxfY29uc3RyYWludF9xZGJtKTsKLQl9Ci0KLQkvKiAyME1IeiBNQ1MgOC0xNSBNSU1PICovCi0JZm9yIChqID0gMDsgaiA8IEJSQ01TX05VTV9SQVRFU19NQ1NfMl9TVFJFQU07IGorKykKLQkJdHhwd3ItPm1jc18yMF9taW1vW2pdID0KLQkJICAgIG1pbih0eHB3ci0+bWNzXzIwX21pbW9bal0sIGxvY2FsX2NvbnN0cmFpbnRfcWRibSk7Ci0KLQkvKiA0ME1IeiBNQ1MgMC03IFNJU08gKi8KLQlmb3IgKGogPSAwOyBqIDwgQlJDTVNfTlVNX1JBVEVTX01DU18xX1NUUkVBTTsgaisrKSB7Ci0JCXR4cHdyLT5tY3NfNDBfc2lzb1tqXSA9Ci0JCSAgICBtaW4odHhwd3ItPm1jc180MF9zaXNvW2pdLCBsb2NhbF9jb25zdHJhaW50X3FkYm0pOwotCX0KLQotCS8qIDQwTUh6IE1DUyAwLTcgQ0REICovCi0JZm9yIChqID0gMDsgaiA8IEJSQ01TX05VTV9SQVRFU19NQ1NfMV9TVFJFQU07IGorKykgewotCQl0eHB3ci0+bWNzXzQwX2NkZFtqXSA9Ci0JCSAgICBtaW4odHhwd3ItPm1jc180MF9jZGRbal0sIGxvY2FsX2NvbnN0cmFpbnRfcWRibSk7Ci0JfQotCi0JLyogNDBNSHogTUNTIDAtNyBTVEJDICovCi0JZm9yIChqID0gMDsgaiA8IEJSQ01TX05VTV9SQVRFU19NQ1NfMV9TVFJFQU07IGorKykgewotCQl0eHB3ci0+bWNzXzQwX3N0YmNbal0gPQotCQkgICAgbWluKHR4cHdyLT5tY3NfNDBfc3RiY1tqXSwgbG9jYWxfY29uc3RyYWludF9xZGJtKTsKLQl9Ci0KLQkvKiA0ME1IeiBNQ1MgOC0xNSBNSU1PICovCi0JZm9yIChqID0gMDsgaiA8IEJSQ01TX05VTV9SQVRFU19NQ1NfMl9TVFJFQU07IGorKykKLQkJdHhwd3ItPm1jc180MF9taW1vW2pdID0KLQkJICAgIG1pbih0eHB3ci0+bWNzXzQwX21pbW9bal0sIGxvY2FsX2NvbnN0cmFpbnRfcWRibSk7Ci0KLQkvKiA0ME1IeiBNQ1MgMzIgKi8KLQl0eHB3ci0+bWNzMzIgPSBtaW4odHhwd3ItPm1jczMyLCBsb2NhbF9jb25zdHJhaW50X3FkYm0pOwotCi19Ci0KLXZvaWQKLWJyY21zX2NfY2hhbm5lbF9zZXRfY2hhbnNwZWMoc3RydWN0IGJyY21zX2NtX2luZm8gKndsY19jbSwgY2hhbnNwZWNfdCBjaGFuc3BlYywKLQkJCSB1OCBsb2NhbF9jb25zdHJhaW50X3FkYm0pCi17Ci0Jc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjID0gd2xjX2NtLT53bGM7Ci0Jc3RydWN0IHR4cHdyX2xpbWl0cyB0eHB3cjsKLQotCWJyY21zX2NfY2hhbm5lbF9yZWdfbGltaXRzKHdsY19jbSwgY2hhbnNwZWMsICZ0eHB3cik7Ci0KLQlicmNtc19jX2NoYW5uZWxfbWluX3R4cG93ZXJfbGltaXRzX3dpdGhfbG9jYWxfY29uc3RyYWludCh3bGNfY20sICZ0eHB3ciwKLQkJCQkJCQkgICAgIGxvY2FsX2NvbnN0cmFpbnRfcWRibSk7Ci0KLQlicmNtc19iX3NldF9jaGFuc3BlYyh3bGMtPmh3LCBjaGFuc3BlYywKLQkJCSAgICAgIChicmNtc19jX3F1aWV0X2NoYW5zcGVjKHdsY19jbSwgY2hhbnNwZWMpICE9IDApLAotCQkJICAgICAgJnR4cHdyKTsKLX0KLQotI2lmZGVmIFBPV0VSX0RCRwotc3RhdGljIHZvaWQgd2xjX3BoeV90eHBvd2VyX2xpbWl0c19kdW1wKHN0cnVjdCB0eHB3cl9saW1pdHMgKnR4cHdyKQotewotCWludCBpOwotCWNoYXIgYnVmWzgwXTsKLQljaGFyIGZyYWN0aW9uWzRdWzRdID0geyAiICAgIiwgIi4yNSIsICIuNSAiLCAiLjc1IiB9OwotCi0Jc3ByaW50ZihidWYsICJDQ0sgICAgICAgICAgICAgICAgIik7Ci0JZm9yIChpID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19DQ0s7IGkrKykgewotCQlzcHJpbnRmKGJ1ZltzdHJsZW4oYnVmKV0sICIgJTJkJXMiLAotCQkJdHhwd3ItPmNja1tpXSAvIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUiwKLQkJCWZyYWN0aW9uW3R4cHdyLT5jY2tbaV0gJSBCUkNNU19UWFBXUl9EQl9GQUNUT1JdKTsKLQl9Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBidWYpOwotCi0Jc3ByaW50ZihidWYsICIyMCBNSHogT0ZETSBTSVNPICAgIik7Ci0JZm9yIChpID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19PRkRNOyBpKyspIHsKLQkJc3ByaW50ZihidWZbc3RybGVuKGJ1ZildLCAiICUyZCVzIiwKLQkJCXR4cHdyLT5vZmRtW2ldIC8gQlJDTVNfVFhQV1JfREJfRkFDVE9SLAotCQkJZnJhY3Rpb25bdHhwd3ItPm9mZG1baV0gJSBCUkNNU19UWFBXUl9EQl9GQUNUT1JdKTsKLQl9Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBidWYpOwotCi0Jc3ByaW50ZihidWYsICIyMCBNSHogT0ZETSBDREQgICAgIik7Ci0JZm9yIChpID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19PRkRNOyBpKyspIHsKLQkJc3ByaW50ZihidWZbc3RybGVuKGJ1ZildLCAiICUyZCVzIiwKLQkJCXR4cHdyLT5vZmRtX2NkZFtpXSAvIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUiwKLQkJCWZyYWN0aW9uW3R4cHdyLT5vZmRtX2NkZFtpXSAlIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUl0pOwotCX0KLQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIGJ1Zik7Ci0KLQlzcHJpbnRmKGJ1ZiwgIjQwIE1IeiBPRkRNIFNJU08gICAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgQlJDTVNfTlVNX1JBVEVTX09GRE07IGkrKykgewotCQlzcHJpbnRmKGJ1ZltzdHJsZW4oYnVmKV0sICIgJTJkJXMiLAotCQkJdHhwd3ItPm9mZG1fNDBfc2lzb1tpXSAvIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUiwKLQkJCWZyYWN0aW9uW3R4cHdyLT5vZmRtXzQwX3Npc29baV0gJQotCQkJCQkJCUJSQ01TX1RYUFdSX0RCX0ZBQ1RPUl0pOwotCX0KLQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIGJ1Zik7Ci0KLQlzcHJpbnRmKGJ1ZiwgIjQwIE1IeiBPRkRNIENERCAgICAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgQlJDTVNfTlVNX1JBVEVTX09GRE07IGkrKykgewotCQlzcHJpbnRmKGJ1ZltzdHJsZW4oYnVmKV0sICIgJTJkJXMiLAotCQkJdHhwd3ItPm9mZG1fNDBfY2RkW2ldIC8gQlJDTVNfVFhQV1JfREJfRkFDVE9SLAotCQkJZnJhY3Rpb25bdHhwd3ItPm9mZG1fNDBfY2RkW2ldICUKLQkJCQkJCQlCUkNNU19UWFBXUl9EQl9GQUNUT1JdKTsKLQl9Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBidWYpOwotCi0Jc3ByaW50ZihidWYsICIyMCBNSHogTUNTMC03IFNJU08gIik7Ci0JZm9yIChpID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19NQ1NfMV9TVFJFQU07IGkrKykgewotCQlzcHJpbnRmKGJ1ZltzdHJsZW4oYnVmKV0sICIgJTJkJXMiLAotCQkJdHhwd3ItPm1jc18yMF9zaXNvW2ldIC8gQlJDTVNfVFhQV1JfREJfRkFDVE9SLAotCQkJZnJhY3Rpb25bdHhwd3ItPm1jc18yMF9zaXNvW2ldICUKLQkJCQkJCQlCUkNNU19UWFBXUl9EQl9GQUNUT1JdKTsKLQl9Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBidWYpOwotCi0Jc3ByaW50ZihidWYsICIyMCBNSHogTUNTMC03IENERCAgIik7Ci0JZm9yIChpID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19NQ1NfMV9TVFJFQU07IGkrKykgewotCQlzcHJpbnRmKGJ1ZltzdHJsZW4oYnVmKV0sICIgJTJkJXMiLAotCQkJdHhwd3ItPm1jc18yMF9jZGRbaV0gLyBCUkNNU19UWFBXUl9EQl9GQUNUT1IsCi0JCQlmcmFjdGlvblt0eHB3ci0+bWNzXzIwX2NkZFtpXSAlCi0JCQkJCQkJQlJDTVNfVFhQV1JfREJfRkFDVE9SXSk7Ci0JfQotCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgYnVmKTsKLQotCXNwcmludGYoYnVmLCAiMjAgTUh6IE1DUzAtNyBTVEJDICIpOwotCWZvciAoaSA9IDA7IGkgPCBCUkNNU19OVU1fUkFURVNfTUNTXzFfU1RSRUFNOyBpKyspIHsKLQkJc3ByaW50ZihidWZbc3RybGVuKGJ1ZildLCAiICUyZCVzIiwKLQkJCXR4cHdyLT5tY3NfMjBfc3RiY1tpXSAvIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUiwKLQkJCWZyYWN0aW9uW3R4cHdyLT5tY3NfMjBfc3RiY1tpXSAlCi0JCQkJCQkJQlJDTVNfVFhQV1JfREJfRkFDVE9SXSk7Ci0JfQotCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgYnVmKTsKLQotCXNwcmludGYoYnVmLCAiMjAgTUh6IE1DUzgtMTUgU0RNICIpOwotCWZvciAoaSA9IDA7IGkgPCBCUkNNU19OVU1fUkFURVNfTUNTXzJfU1RSRUFNOyBpKyspIHsKLQkJc3ByaW50ZihidWZbc3RybGVuKGJ1ZildLCAiICUyZCVzIiwKLQkJCXR4cHdyLT5tY3NfMjBfbWltb1tpXSAvIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUiwKLQkJCWZyYWN0aW9uW3R4cHdyLT5tY3NfMjBfbWltb1tpXSAlCi0JCQkJCQkJQlJDTVNfVFhQV1JfREJfRkFDVE9SXSk7Ci0JfQotCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgYnVmKTsKLQotCXNwcmludGYoYnVmLCAiNDAgTUh6IE1DUzAtNyBTSVNPICIpOwotCWZvciAoaSA9IDA7IGkgPCBCUkNNU19OVU1fUkFURVNfTUNTXzFfU1RSRUFNOyBpKyspIHsKLQkJc3ByaW50ZihidWZbc3RybGVuKGJ1ZildLCAiICUyZCVzIiwKLQkJCXR4cHdyLT5tY3NfNDBfc2lzb1tpXSAvIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUiwKLQkJCWZyYWN0aW9uW3R4cHdyLT5tY3NfNDBfc2lzb1tpXSAlCi0JCQkJCQkJQlJDTVNfVFhQV1JfREJfRkFDVE9SXSk7Ci0JfQotCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgYnVmKTsKLQotCXNwcmludGYoYnVmLCAiNDAgTUh6IE1DUzAtNyBDREQgICIpOwotCWZvciAoaSA9IDA7IGkgPCBCUkNNU19OVU1fUkFURVNfTUNTXzFfU1RSRUFNOyBpKyspIHsKLQkJc3ByaW50ZihidWZbc3RybGVuKGJ1ZildLCAiICUyZCVzIiwKLQkJCXR4cHdyLT5tY3NfNDBfY2RkW2ldIC8gQlJDTVNfVFhQV1JfREJfRkFDVE9SLAotCQkJZnJhY3Rpb25bdHhwd3ItPm1jc180MF9jZGRbaV0gJQotCQkJCQkJCUJSQ01TX1RYUFdSX0RCX0ZBQ1RPUl0pOwotCX0KLQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIGJ1Zik7Ci0KLQlzcHJpbnRmKGJ1ZiwgIjQwIE1IeiBNQ1MwLTcgU1RCQyAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgQlJDTVNfTlVNX1JBVEVTX01DU18xX1NUUkVBTTsgaSsrKSB7Ci0JCXNwcmludGYoYnVmW3N0cmxlbihidWYpXSwgIiAlMmQlcyIsCi0JCQl0eHB3ci0+bWNzXzQwX3N0YmNbaV0gLyBCUkNNU19UWFBXUl9EQl9GQUNUT1IsCi0JCQlmcmFjdGlvblt0eHB3ci0+bWNzXzQwX3N0YmNbaV0gJQotCQkJCQkJCUJSQ01TX1RYUFdSX0RCX0ZBQ1RPUl0pOwotCX0KLQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIGJ1Zik7Ci0KLQlzcHJpbnRmKGJ1ZiwgIjQwIE1IeiBNQ1M4LTE1IFNETSAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgQlJDTVNfTlVNX1JBVEVTX01DU18yX1NUUkVBTTsgaSsrKSB7Ci0JCXNwcmludGYoYnVmW3N0cmxlbihidWYpXSwgIiAlMmQlcyIsCi0JCQl0eHB3ci0+bWNzXzQwX21pbW9baV0gLyBCUkNNU19UWFBXUl9EQl9GQUNUT1IsCi0JCQlmcmFjdGlvblt0eHB3ci0+bWNzXzQwX21pbW9baV0gJQotCQkJCQkJCUJSQ01TX1RYUFdSX0RCX0ZBQ1RPUl0pOwotCX0KLQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIGJ1Zik7Ci0KLQlwcmludGsoS0VSTl9ERUJVRyAiTUNTMzIgICAgICAgICAgICAgICAlMmQlc1xuIiwKLQkgICAgICAgdHhwd3ItPm1jczMyIC8gQlJDTVNfVFhQV1JfREJfRkFDVE9SLAotCSAgICAgICBmcmFjdGlvblt0eHB3ci0+bWNzMzIgJSBCUkNNU19UWFBXUl9EQl9GQUNUT1JdKTsKLX0KLSNlbmRpZgkJCQkvKiBQT1dFUl9EQkcgKi8KLQotdm9pZAotYnJjbXNfY19jaGFubmVsX3JlZ19saW1pdHMoc3RydWN0IGJyY21zX2NtX2luZm8gKndsY19jbSwgY2hhbnNwZWNfdCBjaGFuc3BlYywKLQkJICAgICAgIHN0cnVjdCB0eHB3cl9saW1pdHMgKnR4cHdyKQotewotCXN0cnVjdCBicmNtc19jX2luZm8gKndsYyA9IHdsY19jbS0+d2xjOwotCXVpbnQgaTsKLQl1aW50IGNoYW47Ci0JaW50IG1heHB3cjsKLQlpbnQgZGVsdGE7Ci0JY29uc3Qgc3RydWN0IGNvdW50cnlfaW5mbyAqY291bnRyeTsKLQlzdHJ1Y3QgYnJjbXNfYmFuZCAqYmFuZDsKLQljb25zdCBzdHJ1Y3QgbG9jYWxlX2luZm8gKmxpOwotCWludCBjb25kdWN0ZWRfbWF4OwotCWludCBjb25kdWN0ZWRfb2ZkbV9tYXg7Ci0JY29uc3Qgc3RydWN0IGxvY2FsZV9taW1vX2luZm8gKmxpX21pbW87Ci0JaW50IG1heHB3cjIwLCBtYXhwd3I0MDsKLQlpbnQgbWF4cHdyX2lkeDsKLQl1aW50IGo7Ci0KLQltZW1zZXQodHhwd3IsIDAsIHNpemVvZihzdHJ1Y3QgdHhwd3JfbGltaXRzKSk7Ci0KLQlpZiAoIWJyY21zX2NfdmFsaWRfY2hhbnNwZWNfZGIod2xjX2NtLCBjaGFuc3BlYykpIHsKLQkJY291bnRyeSA9IGJyY21zX2NfY291bnRyeV9sb29rdXAod2xjLCB3bGMtPmF1dG9jb3VudHJ5X2RlZmF1bHQpOwotCQlpZiAoY291bnRyeSA9PSBOVUxMKQotCQkJcmV0dXJuOwotCX0gZWxzZSB7Ci0JCWNvdW50cnkgPSB3bGNfY20tPmNvdW50cnk7Ci0JfQotCi0JY2hhbiA9IENIU1BFQ19DSEFOTkVMKGNoYW5zcGVjKTsKLQliYW5kID0gd2xjLT5iYW5kc3RhdGVbQ0hTUEVDX0JBTkRVTklUKGNoYW5zcGVjKV07Ci0JbGkgPSBCQU5EXzVHKGJhbmQtPmJhbmR0eXBlKSA/Ci0JICAgIGJyY21zX2NfZ2V0X2xvY2FsZV81Zyhjb3VudHJ5LT5sb2NhbGVfNUcpIDoKLQkgICAgYnJjbXNfY19nZXRfbG9jYWxlXzJnKGNvdW50cnktPmxvY2FsZV8yRyk7Ci0KLQlsaV9taW1vID0gQkFORF81RyhiYW5kLT5iYW5kdHlwZSkgPwotCSAgICBicmNtc19jX2dldF9taW1vXzVnKGNvdW50cnktPmxvY2FsZV9taW1vXzVHKSA6Ci0JICAgIGJyY21zX2NfZ2V0X21pbW9fMmcoY291bnRyeS0+bG9jYWxlX21pbW9fMkcpOwotCi0JaWYgKGxpLT5mbGFncyAmIEJSQ01TX0VJUlApIHsKLQkJZGVsdGEgPSBiYW5kLT5hbnRnYWluOwotCX0gZWxzZSB7Ci0JCWRlbHRhID0gMDsKLQkJaWYgKGJhbmQtPmFudGdhaW4gPiBRREIoNikpCi0JCQlkZWx0YSA9IGJhbmQtPmFudGdhaW4gLSBRREIoNik7CS8qIEV4Y2VzcyBvdmVyIDYgZEIgKi8KLQl9Ci0KLQlpZiAobGkgPT0gJmxvY2FsZV9pKSB7Ci0JCWNvbmR1Y3RlZF9tYXggPSBRREIoMjIpOwotCQljb25kdWN0ZWRfb2ZkbV9tYXggPSBRREIoMjIpOwotCX0KLQotCS8qIENDSyB0eHB3ciBsaW1pdHMgZm9yIDIuNEcgYmFuZCAqLwotCWlmIChCQU5EXzJHKGJhbmQtPmJhbmR0eXBlKSkgewotCQltYXhwd3IgPSBsaS0+bWF4cHdyW0NIQU5ORUxfUE9XRVJfSURYXzJHX0NDSyhjaGFuKV07Ci0KLQkJbWF4cHdyID0gbWF4cHdyIC0gZGVsdGE7Ci0JCW1heHB3ciA9IG1heChtYXhwd3IsIDApOwotCQltYXhwd3IgPSBtaW4obWF4cHdyLCBjb25kdWN0ZWRfbWF4KTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgQlJDTVNfTlVNX1JBVEVTX0NDSzsgaSsrKQotCQkJdHhwd3ItPmNja1tpXSA9ICh1OCkgbWF4cHdyOwotCX0KLQotCS8qIE9GRE0gdHhwd3IgbGltaXRzIGZvciAyLjRHIG9yIDVHIGJhbmRzICovCi0JaWYgKEJBTkRfMkcoYmFuZC0+YmFuZHR5cGUpKSB7Ci0JCW1heHB3ciA9IGxpLT5tYXhwd3JbQ0hBTk5FTF9QT1dFUl9JRFhfMkdfT0ZETShjaGFuKV07Ci0KLQl9IGVsc2UgewotCQltYXhwd3IgPSBsaS0+bWF4cHdyW0NIQU5ORUxfUE9XRVJfSURYXzVHKGNoYW4pXTsKLQl9Ci0KLQltYXhwd3IgPSBtYXhwd3IgLSBkZWx0YTsKLQltYXhwd3IgPSBtYXgobWF4cHdyLCAwKTsKLQltYXhwd3IgPSBtaW4obWF4cHdyLCBjb25kdWN0ZWRfb2ZkbV9tYXgpOwotCi0JLyogS2VlcCBPRkRNIGxtaXQgYmVsb3cgQ0NLIGxpbWl0ICovCi0JaWYgKEJBTkRfMkcoYmFuZC0+YmFuZHR5cGUpKQotCQltYXhwd3IgPSBtaW5fdChpbnQsIG1heHB3ciwgdHhwd3ItPmNja1swXSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQlJDTVNfTlVNX1JBVEVTX09GRE07IGkrKykKLQkJdHhwd3ItPm9mZG1baV0gPSAodTgpIG1heHB3cjsKLQotCWZvciAoaSA9IDA7IGkgPCBCUkNNU19OVU1fUkFURVNfT0ZETTsgaSsrKSB7Ci0JCS8qIE9GRE0gNDAgTUh6IFNJU08gaGFzIHRoZSBzYW1lIHBvd2VyIGFzIHRoZSBjb3JyZXNwb25kaW5nIE1DUzAtNyByYXRlIHVubGVzcwotCQkgKiBvdmVycmlkZW4gYnkgdGhlIGxvY2FsZSBzcGVjaWZpYyBjb2RlLiBXZSBzZXQgdGhpcyB2YWx1ZSB0byAwIGFzIGEKLQkJICogZmxhZyAocHJlc3VtYWJseSAwIGRCbSBpc24ndCBhIHBvc3NpYmlsaXR5KSBhbmQgdGhlbiBjb3B5IHRoZSBNQ1MwLTcgdmFsdWUKLQkJICogdG8gdGhlIDQwIE1IeiB2YWx1ZSBpZiBpdCB3YXNuJ3QgZXhwbGljaXRseSBzZXQuCi0JCSAqLwotCQl0eHB3ci0+b2ZkbV80MF9zaXNvW2ldID0gMDsKLQotCQl0eHB3ci0+b2ZkbV9jZGRbaV0gPSAodTgpIG1heHB3cjsKLQotCQl0eHB3ci0+b2ZkbV80MF9jZGRbaV0gPSAwOwotCX0KLQotCS8qIE1JTU8vSFQgc3BlY2lmaWMgbGltaXRzICovCi0JaWYgKGxpX21pbW8tPmZsYWdzICYgQlJDTVNfRUlSUCkgewotCQlkZWx0YSA9IGJhbmQtPmFudGdhaW47Ci0JfSBlbHNlIHsKLQkJZGVsdGEgPSAwOwotCQlpZiAoYmFuZC0+YW50Z2FpbiA+IFFEQig2KSkKLQkJCWRlbHRhID0gYmFuZC0+YW50Z2FpbiAtIFFEQig2KTsJLyogRXhjZXNzIG92ZXIgNiBkQiAqLwotCX0KLQotCWlmIChCQU5EXzJHKGJhbmQtPmJhbmR0eXBlKSkKLQkJbWF4cHdyX2lkeCA9IChjaGFuIC0gMSk7Ci0JZWxzZQotCQltYXhwd3JfaWR4ID0gQ0hBTk5FTF9QT1dFUl9JRFhfNUcoY2hhbik7Ci0KLQltYXhwd3IyMCA9IGxpX21pbW8tPm1heHB3cjIwW21heHB3cl9pZHhdOwotCW1heHB3cjQwID0gbGlfbWltby0+bWF4cHdyNDBbbWF4cHdyX2lkeF07Ci0KLQltYXhwd3IyMCA9IG1heHB3cjIwIC0gZGVsdGE7Ci0JbWF4cHdyMjAgPSBtYXgobWF4cHdyMjAsIDApOwotCW1heHB3cjQwID0gbWF4cHdyNDAgLSBkZWx0YTsKLQltYXhwd3I0MCA9IG1heChtYXhwd3I0MCwgMCk7Ci0KLQkvKiBGaWxsIGluIHRoZSBNQ1MgMC03IChTSVNPKSByYXRlcyAqLwotCWZvciAoaSA9IDA7IGkgPCBCUkNNU19OVU1fUkFURVNfTUNTXzFfU1RSRUFNOyBpKyspIHsKLQotCQkvKiAyMCBNSHogaGFzIHRoZSBzYW1lIHBvd2VyIGFzIHRoZSBjb3JyZXNwb25kaW5nIE9GRE0gcmF0ZSB1bmxlc3MKLQkJICogb3ZlcnJpZGVuIGJ5IHRoZSBsb2NhbGUgc3BlY2lmaWMgY29kZS4KLQkJICovCi0JCXR4cHdyLT5tY3NfMjBfc2lzb1tpXSA9IHR4cHdyLT5vZmRtW2ldOwotCQl0eHB3ci0+bWNzXzQwX3Npc29baV0gPSAwOwotCX0KLQotCS8qIEZpbGwgaW4gdGhlIE1DUyAwLTcgQ0REIHJhdGVzICovCi0JZm9yIChpID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19NQ1NfMV9TVFJFQU07IGkrKykgewotCQl0eHB3ci0+bWNzXzIwX2NkZFtpXSA9ICh1OCkgbWF4cHdyMjA7Ci0JCXR4cHdyLT5tY3NfNDBfY2RkW2ldID0gKHU4KSBtYXhwd3I0MDsKLQl9Ci0KLQkvKiBUaGVzZSBsb2NhbGVzIGhhdmUgU0lTTyBleHByZXNzZWQgaW4gdGhlIHRhYmxlIGFuZCBvdmVycmlkZSBDREQgbGF0ZXIgKi8KLQlpZiAobGlfbWltbyA9PSAmbG9jYWxlX2JuKSB7Ci0JCWlmIChsaV9taW1vID09ICZsb2NhbGVfYm4pIHsKLQkJCW1heHB3cjIwID0gUURCKDE2KTsKLQkJCW1heHB3cjQwID0gMDsKLQotCQkJaWYgKGNoYW4gPj0gMyAmJiBjaGFuIDw9IDExKSB7Ci0JCQkJbWF4cHdyNDAgPSBRREIoMTYpOwotCQkJfQotCQl9Ci0KLQkJZm9yIChpID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19NQ1NfMV9TVFJFQU07IGkrKykgewotCQkJdHhwd3ItPm1jc18yMF9zaXNvW2ldID0gKHU4KSBtYXhwd3IyMDsKLQkJCXR4cHdyLT5tY3NfNDBfc2lzb1tpXSA9ICh1OCkgbWF4cHdyNDA7Ci0JCX0KLQl9Ci0KLQkvKiBGaWxsIGluIHRoZSBNQ1MgMC03IFNUQkMgcmF0ZXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQlJDTVNfTlVNX1JBVEVTX01DU18xX1NUUkVBTTsgaSsrKSB7Ci0JCXR4cHdyLT5tY3NfMjBfc3RiY1tpXSA9IDA7Ci0JCXR4cHdyLT5tY3NfNDBfc3RiY1tpXSA9IDA7Ci0JfQotCi0JLyogRmlsbCBpbiB0aGUgTUNTIDgtMTUgU0RNIHJhdGVzICovCi0JZm9yIChpID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19NQ1NfMl9TVFJFQU07IGkrKykgewotCQl0eHB3ci0+bWNzXzIwX21pbW9baV0gPSAodTgpIG1heHB3cjIwOwotCQl0eHB3ci0+bWNzXzQwX21pbW9baV0gPSAodTgpIG1heHB3cjQwOwotCX0KLQotCS8qIEZpbGwgaW4gTUNTMzIgKi8KLQl0eHB3ci0+bWNzMzIgPSAodTgpIG1heHB3cjQwOwotCi0JZm9yIChpID0gMCwgaiA9IDA7IGkgPCBCUkNNU19OVU1fUkFURVNfT0ZETTsgaSsrLCBqKyspIHsKLQkJaWYgKHR4cHdyLT5vZmRtXzQwX2NkZFtpXSA9PSAwKQotCQkJdHhwd3ItPm9mZG1fNDBfY2RkW2ldID0gdHhwd3ItPm1jc180MF9jZGRbal07Ci0JCWlmIChpID09IDApIHsKLQkJCWkgPSBpICsgMTsKLQkJCWlmICh0eHB3ci0+b2ZkbV80MF9jZGRbaV0gPT0gMCkKLQkJCQl0eHB3ci0+b2ZkbV80MF9jZGRbaV0gPSB0eHB3ci0+bWNzXzQwX2NkZFtqXTsKLQkJfQotCX0KLQotCS8qIENvcHkgdGhlIDQwIE1IWiBNQ1MgMC03IENERCB2YWx1ZSB0byB0aGUgNDAgTUhaIE1DUyAwLTcgU0lTTyB2YWx1ZSBpZiBpdCB3YXNuJ3QKLQkgKiBwcm92aWRlZCBleHBsaWNpdGx5LgotCSAqLwotCi0JZm9yIChpID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19NQ1NfMV9TVFJFQU07IGkrKykgewotCQlpZiAodHhwd3ItPm1jc180MF9zaXNvW2ldID09IDApCi0JCQl0eHB3ci0+bWNzXzQwX3Npc29baV0gPSB0eHB3ci0+bWNzXzQwX2NkZFtpXTsKLQl9Ci0KLQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19PRkRNOyBpKyssIGorKykgewotCQlpZiAodHhwd3ItPm9mZG1fNDBfc2lzb1tpXSA9PSAwKQotCQkJdHhwd3ItPm9mZG1fNDBfc2lzb1tpXSA9IHR4cHdyLT5tY3NfNDBfc2lzb1tqXTsKLQkJaWYgKGkgPT0gMCkgewotCQkJaSA9IGkgKyAxOwotCQkJaWYgKHR4cHdyLT5vZmRtXzQwX3Npc29baV0gPT0gMCkKLQkJCQl0eHB3ci0+b2ZkbV80MF9zaXNvW2ldID0gdHhwd3ItPm1jc180MF9zaXNvW2pdOwotCQl9Ci0JfQotCi0JLyogQ29weSB0aGUgMjAgYW5kIDQwIE1IeiBNQ1MwLTcgQ0REIHZhbHVlcyB0byB0aGUgY29ycmVzcG9uZGluZyBTVEJDIHZhbHVlcyBpZiB0aGV5IHdlcmVuJ3QKLQkgKiBwcm92aWRlZCBleHBsaWNpdGx5LgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBCUkNNU19OVU1fUkFURVNfTUNTXzFfU1RSRUFNOyBpKyspIHsKLQkJaWYgKHR4cHdyLT5tY3NfMjBfc3RiY1tpXSA9PSAwKQotCQkJdHhwd3ItPm1jc18yMF9zdGJjW2ldID0gdHhwd3ItPm1jc18yMF9jZGRbaV07Ci0KLQkJaWYgKHR4cHdyLT5tY3NfNDBfc3RiY1tpXSA9PSAwKQotCQkJdHhwd3ItPm1jc180MF9zdGJjW2ldID0gdHhwd3ItPm1jc180MF9jZGRbaV07Ci0JfQotCi0jaWZkZWYgUE9XRVJfREJHCi0Jd2xjX3BoeV90eHBvd2VyX2xpbWl0c19kdW1wKHR4cHdyKTsKLSNlbmRpZgotCXJldHVybjsKLX0KLQotLyogUmV0dXJucyB0cnVlIGlmIGN1cnJlbnRseSBzZXQgY291bnRyeSBpcyBKYXBhbiBvciB2YXJpYW50ICovCi1zdGF0aWMgYm9vbCBicmNtc19jX2phcGFuKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlyZXR1cm4gYnJjbXNfY19qYXBhbl9jY29kZSh3bGMtPmNtaS0+Y291bnRyeV9hYmJyZXYpOwotfQotCi0vKiBKUCwgSjEgLSBKMTAgYXJlIEphcGFuIGNjb2RlcyAqLwotc3RhdGljIGJvb2wgYnJjbXNfY19qYXBhbl9jY29kZShjb25zdCBjaGFyICpjY29kZSkKLXsKLQlyZXR1cm4gKGNjb2RlWzBdID09ICdKJyAmJgotCQkoY2NvZGVbMV0gPT0gJ1AnIHx8IChjY29kZVsxXSA+PSAnMScgJiYgY2NvZGVbMV0gPD0gJzknKSkpOwotfQotCi0vKgotICogVmFsaWRhdGUgdGhlIGNoYW5zcGVjIGZvciB0aGlzIGxvY2FsZSwgZm9yIDQwTUhaIHdlIG5lZWQgdG8gYWxzbyBjaGVjayB0aGF0IHRoZSBzaWRlYmFuZHMKLSAqIGFyZSB2YWxpZCAyME1aSCBjaGFubmVscyBpbiB0aGlzIGxvY2FsZSBhbmQgdGhleSBhcmUgYWxzbyBhIGxlZ2FsIEhUIGNvbWJpbmF0aW9uCi0gKi8KLXN0YXRpYyBib29sCi1icmNtc19jX3ZhbGlkX2NoYW5zcGVjX2V4dChzdHJ1Y3QgYnJjbXNfY21faW5mbyAqd2xjX2NtLCBjaGFuc3BlY190IGNoc3BlYywKLQkJCSAgIGJvb2wgZHVhbGJhbmQpCi17Ci0Jc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjID0gd2xjX2NtLT53bGM7Ci0JdTggY2hhbm5lbCA9IENIU1BFQ19DSEFOTkVMKGNoc3BlYyk7Ci0KLQkvKiBjaGVjayB0aGUgY2hhbnNwZWMgKi8KLQlpZiAoYnJjbXVfY2hzcGVjX21hbGZvcm1lZChjaHNwZWMpKSB7Ci0JCXdpcGh5X2Vycih3bGMtPndpcGh5LCAid2wlZDogbWFsZm9ybWVkIGNoYW5zcGVjIDB4JXhcbiIsCi0JCQl3bGMtPnB1Yi0+dW5pdCwgY2hzcGVjKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCWlmIChDSEFOTkVMX0JBTkRVTklUKHdsY19jbS0+d2xjLCBjaGFubmVsKSAhPQotCSAgICBDSFNQRUNfQkFORFVOSVQoY2hzcGVjKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JLyogQ2hlY2sgYSAyME1oeiBjaGFubmVsICovCi0JaWYgKENIU1BFQ19JUzIwKGNoc3BlYykpIHsKLQkJaWYgKGR1YWxiYW5kKQotCQkJcmV0dXJuIFZBTElEX0NIQU5ORUwyMF9EQih3bGNfY20tPndsYywgY2hhbm5lbCk7Ci0JCWVsc2UKLQkJCXJldHVybiBWQUxJRF9DSEFOTkVMMjAod2xjX2NtLT53bGMsIGNoYW5uZWwpOwotCX0KLSNpZmRlZiBTVVBQT1JUXzQwTUhaCi0JLyogV2Uga25vdyB3ZSBhcmUgbm93IGNoZWNraW5nIGEgNDBNSFogY2hhbm5lbCwgc28gd2Ugc2hvdWxkIG9ubHkgYmUgaGVyZQotCSAqIGZvciBOUEhZUwotCSAqLwotCWlmIChCUkNNU19JU05QSFkod2xjLT5iYW5kKSB8fCBCUkNNU19JU1NTTFBOUEhZKHdsYy0+YmFuZCkpIHsKLQkJdTggdXBwZXJfc2lkZWJhbmQgPSAwLCBpZHg7Ci0JCXU4IG51bV9jaDIwX2VudHJpZXMgPQotCQkgICAgc2l6ZW9mKGNoYW4yMF9pbmZvKSAvIHNpemVvZihzdHJ1Y3QgY2hhbjIwX2luZm8pOwotCi0JCWlmICghVkFMSURfNDBDSEFOU1BFQ19JTl9CQU5EKHdsYywgQ0hTUEVDX0JBTkRVTklUKGNoc3BlYykpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChkdWFsYmFuZCkgewotCQkJaWYgKCFWQUxJRF9DSEFOTkVMMjBfREIod2xjLCBMT1dFUl8yMF9TQihjaGFubmVsKSkgfHwKLQkJCSAgICAhVkFMSURfQ0hBTk5FTDIwX0RCKHdsYywgVVBQRVJfMjBfU0IoY2hhbm5lbCkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCWlmICghVkFMSURfQ0hBTk5FTDIwKHdsYywgTE9XRVJfMjBfU0IoY2hhbm5lbCkpIHx8Ci0JCQkgICAgIVZBTElEX0NIQU5ORUwyMCh3bGMsIFVQUEVSXzIwX1NCKGNoYW5uZWwpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvKiBmaW5kIHRoZSBsb3dlciBzaWRlYmFuZCBpbmZvIGluIHRoZSBzaWRlYmFuZCBhcnJheSAqLwotCQlmb3IgKGlkeCA9IDA7IGlkeCA8IG51bV9jaDIwX2VudHJpZXM7IGlkeCsrKSB7Ci0JCQlpZiAoY2hhbjIwX2luZm9baWR4XS5zYiA9PSBMT1dFUl8yMF9TQihjaGFubmVsKSkKLQkJCQl1cHBlcl9zaWRlYmFuZCA9IGNoYW4yMF9pbmZvW2lkeF0uYWRqX3NiczsKLQkJfQotCQkvKiBjaGVjayB0aGF0IHRoZSBsb3dlciBzaWRlYmFuZCBhbGxvd3MgYW4gdXBwZXIgc2lkZWJhbmQgKi8KLQkJaWYgKCh1cHBlcl9zaWRlYmFuZCAmIChDSF9VUFBFUl9TQiB8IENIX0VXQV9WQUxJRCkpID09Ci0JCSAgICAoQ0hfVVBQRVJfU0IgfCBDSF9FV0FfVkFMSUQpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0jZW5kaWYJCQkJLyogNDAgTUhaICovCi0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgYnJjbXNfY192YWxpZF9jaGFuc3BlY19kYihzdHJ1Y3QgYnJjbXNfY21faW5mbyAqd2xjX2NtLCBjaGFuc3BlY190IGNoc3BlYykKLXsKLQlyZXR1cm4gYnJjbXNfY192YWxpZF9jaGFuc3BlY19leHQod2xjX2NtLCBjaHNwZWMsIHRydWUpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9jaGFubmVsLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL2NoYW5uZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIyZjJmNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL2NoYW5uZWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfQlJDTV9DSEFOTkVMX0hfCi0jZGVmaW5lIF9CUkNNX0NIQU5ORUxfSF8KLQotLyogY29udmVyc2lvbiBmb3IgcGh5IHR4cHdyIGNhbGN1bGF0aW9ucyB0aGF0IHVzZSAuMjUgZEIgdW5pdHMgKi8KLSNkZWZpbmUgQlJDTVNfVFhQV1JfREJfRkFDVE9SIDQKLQotCi0vKiBtYXhwd3IgbWFwcGluZyB0byA1R0h6IGJhbmQgY2hhbm5lbHM6Ci0gKiBtYXhwd3JbMF0gLSBjaGFubmVscyBbMzQtNDhdCi0gKiBtYXhwd3JbMV0gLSBjaGFubmVscyBbNTItNjBdCi0gKiBtYXhwd3JbMl0gLSBjaGFubmVscyBbNjItNjRdCi0gKiBtYXhwd3JbM10gLSBjaGFubmVscyBbMTAwLTE0MF0KLSAqIG1heHB3cls0XSAtIGNoYW5uZWxzIFsxNDktMTY1XQotICovCi0jZGVmaW5lIEJBTkRfNUdfUFdSX0xWTFMJNQkvKiA1IHBvd2VyIGxldmVscyBmb3IgNUcgKi8KLQotLyogcG93ZXIgbGV2ZWwgaW4gZ3JvdXAgb2YgMi40R0h6IGJhbmQgY2hhbm5lbHM6Ci0gKiBtYXhwd3JbMF0gLSBDQ0sgIGNoYW5uZWxzIFsxXQotICogbWF4cHdyWzFdIC0gQ0NLICBjaGFubmVscyBbMi0xMF0KLSAqIG1heHB3clsyXSAtIENDSyAgY2hhbm5lbHMgWzExLTE0XQotICogbWF4cHdyWzNdIC0gT0ZETSBjaGFubmVscyBbMV0KLSAqIG1heHB3cls0XSAtIE9GRE0gY2hhbm5lbHMgWzItMTBdCi0gKiBtYXhwd3JbNV0gLSBPRkRNIGNoYW5uZWxzIFsxMS0xNF0KLSAqLwotCi0vKiBtYWNybyB0byBnZXQgMi40IEdIeiBjaGFubmVsIGdyb3VwIGluZGV4IGZvciB0eCBwb3dlciAqLwotI2RlZmluZSBDSEFOTkVMX1BPV0VSX0lEWF8yR19DQ0soYykgKCgoYykgPCAyKSA/IDAgOiAoKChjKSA8IDExKSA/IDEgOiAyKSkJLyogY2NrIGluZGV4ICovCi0jZGVmaW5lIENIQU5ORUxfUE9XRVJfSURYXzJHX09GRE0oYykgKCgoYykgPCAyKSA/IDMgOiAoKChjKSA8IDExKSA/IDQgOiA1KSkJLyogb2ZkbSBpbmRleCAqLwotCi0vKiBtYWNybyB0byBnZXQgNSBHSHogY2hhbm5lbCBncm91cCBpbmRleCBmb3IgdHggcG93ZXIgKi8KLSNkZWZpbmUgQ0hBTk5FTF9QT1dFUl9JRFhfNUcoYykgXAotCSgoKGMpIDwgNTIpID8gMCA6ICgoKGMpIDwgNjIpID8gMSA6ICgoKGMpIDwgMTAwKSA/IDIgOiAoKChjKSA8IDE0OSkgPyAzIDogNCkpKSkKLQotLyogbWF4IG9mIEJBTkRfNUdfUFdSX0xWTFMgYW5kIDYgZm9yIDIuNCBHSHogKi8KLSNkZWZpbmUgQlJDTVNfTUFYUFdSX1RCTF9TSVpFCQk2Ci0vKiBtYXggb2YgQkFORF81R19QV1JfTFZMUyBhbmQgMTQgZm9yIDIuNCBHSHogKi8KLSNkZWZpbmUgQlJDTVNfTUFYUFdSX01JTU9fVEJMX1NJWkUJMTQKLQotI2RlZmluZSBOQkFORFMod2xjKSAoKHdsYyktPnB1Yi0+X25iYW5kcykKLSNkZWZpbmUgTkJBTkRTX1BVQihwdWIpICgocHViKS0+X25iYW5kcykKLSNkZWZpbmUgTkJBTkRTX0hXKGh3KSAoKGh3KS0+X25iYW5kcykKLQotI2RlZmluZSBJU19TSU5HTEVCQU5EXzVHKGRldmljZSkJMAotCi0vKiBsb2NhbGUgY2hhbm5lbCBhbmQgcG93ZXIgaW5mby4gKi8KLXN0cnVjdCBsb2NhbGVfaW5mbyB7Ci0JdTMyIHZhbGlkX2NoYW5uZWxzOwotCS8qIExpc3Qgb2YgcmFkYXIgc2Vuc2l0aXZlIGNoYW5uZWxzICovCi0JdTggcmFkYXJfY2hhbm5lbHM7Ci0JLyogTGlzdCBvZiBjaGFubmVscyB1c2VkIG9ubHkgaWYgQVBzIGFyZSBkZXRlY3RlZCAqLwotCXU4IHJlc3RyaWN0ZWRfY2hhbm5lbHM7Ci0JLyogTWF4IHR4IHB3ciBpbiBxZEJtIGZvciBlYWNoIHN1Yi1iYW5kICovCi0JczggbWF4cHdyW0JSQ01TX01BWFBXUl9UQkxfU0laRV07Ci0JczggcHViX21heHB3cltCQU5EXzVHX1BXUl9MVkxTXTsJLyogQ291bnRyeSBJRSBhZHZlcnRpc2VkIG1heCB0eCBwd3IgaW4gZEJtCi0JCQkJCQkgKiBwZXIgc3ViLWJhbmQKLQkJCQkJCSAqLwotCXU4IGZsYWdzOwotfTsKLQotLyogYml0cyBmb3IgbG9jYWxlX2luZm8gZmxhZ3MgKi8KLSNkZWZpbmUgQlJDTVNfUEVBS19DT05EVUNURUQJMHgwMAkvKiBQZWFrIGZvciBsb2NhbHMgKi8KLSNkZWZpbmUgQlJDTVNfRUlSUAkJMHgwMQkvKiBGbGFnIGZvciBFSVJQICovCi0jZGVmaW5lIEJSQ01TX0RGU19UUEMJCTB4MDIJLyogRmxhZyBmb3IgREZTIFRQQyAqLwotI2RlZmluZSBCUkNNU19OT19PRkRNCQkweDA0CS8qIEZsYWcgZm9yIE5vIE9GRE0gKi8KLSNkZWZpbmUgQlJDTVNfTk9fNDBNSFoJCTB4MDgJLyogRmxhZyBmb3IgTm8gTUlNTyA0ME1IeiAqLwotI2RlZmluZSBCUkNNU19OT19NSU1PCQkweDEwCS8qIEZsYWcgZm9yIE5vIE1JTU8sIDIwIG9yIDQwIE1IeiAqLwotI2RlZmluZSBCUkNNU19SQURBUl9UWVBFX0VVICAgICAgIDB4MjAJLyogRmxhZyBmb3IgRVUgKi8KLSNkZWZpbmUgQlJDTVNfREZTX0ZDQyAgICAgICAgICAgICBCUkNNU19ERlNfVFBDCS8qIEZsYWcgZm9yIERGUyBGQ0MgKi8KLSNkZWZpbmUgQlJDTVNfREZTX0VVIChCUkNNU19ERlNfVFBDIHwgQlJDTVNfUkFEQVJfVFlQRV9FVSkgLyogRmxhZyBmb3IgREZTIEVVICovCi0KLSNkZWZpbmUgSVNERlNfRVUoZmwpCQkoKChmbCkgJiBCUkNNU19ERlNfRVUpID09IEJSQ01TX0RGU19FVSkKLQotLyogbG9jYWxlIHBlci1jaGFubmVsIHR4IHBvd2VyIGxpbWl0cyBmb3IgTUlNTyBmcmFtZXMKLSAqIG1heHB3ciBhcnJheXMgYXJlIGluZGV4IGJ5IGNoYW5uZWwgZm9yIDIuNCBHSHogbGltaXRzLCBhbmQKLSAqIGJ5IHN1Yi1iYW5kIGZvciA1IEdIeiBsaW1pdHMgdXNpbmcgQ0hBTk5FTF9QT1dFUl9JRFhfNUcoY2hhbm5lbCkKLSAqLwotc3RydWN0IGxvY2FsZV9taW1vX2luZm8gewotCS8qIHR4IDIwIE1IeiBwb3dlciBsaW1pdHMsIHFkQm0gdW5pdHMgKi8KLQlzOCBtYXhwd3IyMFtCUkNNU19NQVhQV1JfTUlNT19UQkxfU0laRV07Ci0JLyogdHggNDAgTUh6IHBvd2VyIGxpbWl0cywgcWRCbSB1bml0cyAqLwotCXM4IG1heHB3cjQwW0JSQ01TX01BWFBXUl9NSU1PX1RCTF9TSVpFXTsKLQl1OCBmbGFnczsKLX07Ci0KLWV4dGVybiBjb25zdCBjaGFudmVjX3QgY2hhbnZlY19hbGxfMkc7Ci1leHRlcm4gY29uc3QgY2hhbnZlY190IGNoYW52ZWNfYWxsXzVHOwotCi0vKgotICogQ291bnRyeSBuYW1lcyBhbmQgYWJicmV2aWF0aW9ucyB3aXRoIGxvY2FsZSBkZWZpbmVkIGZyb20gSVNPIDMxNjYKLSAqLwotc3RydWN0IGNvdW50cnlfaW5mbyB7Ci0JY29uc3QgdTggbG9jYWxlXzJHOwkvKiAyLjRHIGJhbmQgbG9jYWxlICovCi0JY29uc3QgdTggbG9jYWxlXzVHOwkvKiA1RyBiYW5kIGxvY2FsZSAqLwotCWNvbnN0IHU4IGxvY2FsZV9taW1vXzJHOwkvKiAyLjRHIG1pbW8gaW5mbyAqLwotCWNvbnN0IHU4IGxvY2FsZV9taW1vXzVHOwkvKiA1RyBtaW1vIGluZm8gKi8KLX07Ci0KLWV4dGVybiBzdHJ1Y3QgYnJjbXNfY21faW5mbyAqCi1icmNtc19jX2NoYW5uZWxfbWdyX2F0dGFjaChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotCi1leHRlcm4gdm9pZCBicmNtc19jX2NoYW5uZWxfbWdyX2RldGFjaChzdHJ1Y3QgYnJjbXNfY21faW5mbyAqd2xjX2NtKTsKLQotZXh0ZXJuIHU4IGJyY21zX2NfY2hhbm5lbF9sb2NhbGVfZmxhZ3NfaW5fYmFuZChzdHJ1Y3QgYnJjbXNfY21faW5mbyAqd2xjX2NtLAotCQkJCQkgICB1aW50IGJhbmR1bml0KTsKLQotZXh0ZXJuIGJvb2wgYnJjbXNfY192YWxpZF9jaGFuc3BlY19kYihzdHJ1Y3QgYnJjbXNfY21faW5mbyAqd2xjX2NtLAotCQkJCSAgICAgIGNoYW5zcGVjX3QgY2hzcGVjKTsKLQotZXh0ZXJuIHZvaWQgYnJjbXNfY19jaGFubmVsX3JlZ19saW1pdHMoc3RydWN0IGJyY21zX2NtX2luZm8gKndsY19jbSwKLQkJCQkgICBjaGFuc3BlY190IGNoYW5zcGVjLAotCQkJCSAgIHN0cnVjdCB0eHB3cl9saW1pdHMgKnR4cHdyKTsKLWV4dGVybiB2b2lkIGJyY21zX2NfY2hhbm5lbF9zZXRfY2hhbnNwZWMoc3RydWN0IGJyY21zX2NtX2luZm8gKndsY19jbSwKLQkJCQkgICAgIGNoYW5zcGVjX3QgY2hhbnNwZWMsCi0JCQkJICAgICB1OCBsb2NhbF9jb25zdHJhaW50X3FkYm0pOwotCi0jZW5kaWYJCQkJLyogX1dMQ19DSEFOTkVMX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvZDExLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL2QxMS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2ZmMGU2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvZDExLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmCV9CUkNNX0QxMV9IXwotI2RlZmluZQlfQlJDTV9EMTFfSF8KLQotI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgotCi0jaW5jbHVkZSA8ZGVmcy5oPgotI2luY2x1ZGUgInB1Yi5oIgotI2luY2x1ZGUgImRtYS5oIgotCi0jZGVmaW5lCUJDTl9UTVBMX0xFTgkJNTEyCS8qIGxlbmd0aCBvZiB0aGUgQkNOIHRlbXBsYXRlIGFyZWEgKi8KLQotLyogUlggRklGTyBudW1iZXJzICovCi0jZGVmaW5lCVJYX0ZJRk8JCQkwCS8qIGRhdGEgYW5kIGN0bCBmcmFtZXMgKi8KLSNkZWZpbmUJUlhfVFhTVEFUVVNfRklGTwkzCS8qIFJYIGZpZm8gZm9yIHR4IHN0YXR1cyBwYWNrYWdlcyAqLwotCi0vKiBUWCBGSUZPIG51bWJlcnMgdXNpbmcgV01FIEFjY2VzcyBDbGFzc2VzICovCi0jZGVmaW5lCVRYX0FDX0JLX0ZJRk8JCTAJLyogQWNjZXNzIENhdGVnb3J5IEJhY2tncm91bmQgVFggRklGTyAqLwotI2RlZmluZQlUWF9BQ19CRV9GSUZPCQkxCS8qIEFjY2VzcyBDYXRlZ29yeSBCZXN0LUVmZm9ydCBUWCBGSUZPICovCi0jZGVmaW5lCVRYX0FDX1ZJX0ZJRk8JCTIJLyogQWNjZXNzIENsYXNzIFZpZGVvIFRYIEZJRk8gKi8KLSNkZWZpbmUJVFhfQUNfVk9fRklGTwkJMwkvKiBBY2Nlc3MgQ2xhc3MgVm9pY2UgVFggRklGTyAqLwotI2RlZmluZQlUWF9CQ01DX0ZJRk8JCTQJLyogQnJvYWRjYXN0L011bHRpY2FzdCBUWCBGSUZPICovCi0jZGVmaW5lCVRYX0FUSU1fRklGTwkJNQkvKiBUWCBmaWZvIGZvciBBVElNIHdpbmRvdyBpbmZvICovCi0KLS8qIEFkZHIgaXMgYnl0ZSBhZGRyZXNzIHVzZWQgYnkgU1c7IG9mZnNldCBpcyB3b3JkIG9mZnNldCB1c2VkIGJ5IHVDb2RlICovCi0KLS8qIFBlciBBQyBUWCBsaW1pdCBzZXR0aW5ncyAqLwotI2RlZmluZSBNX0FDX1RYTE1UX0JBU0VfQUREUiAgICAgICAgICgweDE4MCAqIDIpCi0jZGVmaW5lIE1fQUNfVFhMTVRfQUREUihfYWMpICAgICAgICAgKE1fQUNfVFhMTVRfQkFTRV9BRERSICsgKDIgKiAoX2FjKSkpCi0KLS8qIExlZ2FjeSBUWCBGSUZPIG51bWJlcnMgKi8KLSNkZWZpbmUJVFhfREFUQV9GSUZPCQlUWF9BQ19CRV9GSUZPCi0jZGVmaW5lCVRYX0NUTF9GSUZPCQlUWF9BQ19WT19GSUZPCi0KLSNpZm5kZWYgV0xfUlNTSV9BTlRfTUFYCi0jZGVmaW5lIFdMX1JTU0lfQU5UX01BWAkJNAkvKiBtYXggcG9zc2libGUgcnggYW50ZW5uYXMgKi8KLSNlbGlmIFdMX1JTU0lfQU5UX01BWCAhPSA0Ci0jZXJyb3IgIldMX1JTU0lfQU5UX01BWCBkb2VzIG5vdCBtYXRjaCIKLSNlbmRpZgotCi1zdHJ1Y3QgaW50Y3RybHJlZ3MgewotCXUzMiBpbnRzdGF0dXM7Ci0JdTMyIGludG1hc2s7Ci19OwotCi0vKiBQSU8gc3RydWN0dXJlLAotICogIHN1cHBvcnQgdHdvIFBJTyBmb3JtYXQ6IDIgYnl0ZXMgYWNjZXNzIGFuZCA0IGJ5dGVzIGFjY2VzcwotICogIGJhc2ljIEZJRk8gcmVnaXN0ZXIgc2V0IGlzIHBlciBjaGFubmVsKHRyYW5zbWl0IG9yIHJlY2VpdmUpCi0gKiAgYSBwYWlyIG9mIGNoYW5uZWxzIGlzIGRlZmluZWQgZm9yIGNvbnZlbmllbmNlCi0gKi8KLS8qIDJieXRlLXdpZGUgcGlvIHJlZ2lzdGVyIHNldCBwZXIgY2hhbm5lbCh4bXQgb3IgcmN2KSAqLwotc3RydWN0IHBpbzJyZWdzIHsKLQl1MTYgZmlmb2NvbnRyb2w7Ci0JdTE2IGZpZm9kYXRhOwotCXUxNiBmaWZvZnJlZTsJLyogb25seSB2YWxpZCBpbiB4bXQgY2hhbm5lbCwgbm90IGluIHJjdiBjaGFubmVsICovCi0JdTE2IFBBRDsKLX07Ci0KLS8qIGEgcGFpciBvZiBwaW8gY2hhbm5lbHModHggYW5kIHJ4KSAqLwotc3RydWN0IHBpbzJyZWdwIHsKLQlwaW8ycmVnc190IHR4OwotCXBpbzJyZWdzX3Qgcng7Ci19OwotCi0vKiA0Ynl0ZS13aWRlIHBpbyByZWdpc3RlciBzZXQgcGVyIGNoYW5uZWwoeG10IG9yIHJjdikgKi8KLXN0cnVjdCBwaW80cmVncyB7Ci0JdTMyIGZpZm9jb250cm9sOwotCXUzMiBmaWZvZGF0YTsKLX07Ci0KLS8qIGEgcGFpciBvZiBwaW8gY2hhbm5lbHModHggYW5kIHJ4KSAqLwotc3RydWN0IHBpbzRyZWdwIHsKLQlwaW80cmVnc190IHR4OwotCXBpbzRyZWdzX3Qgcng7Ci19OwotCi0vKiByZWFkOiAzMi1iaXQgcmVnaXN0ZXIgdGhhdCBjYW4gYmUgcmVhZCBhcyAzMi1iaXQgb3IgYXMgMiAxNi1iaXQKLSAqIHdyaXRlOiBvbmx5IGxvdyAxNmItaXQgaGFsZiBjYW4gYmUgd3JpdHRlbgotICovCi11bmlvbiBwbXFyZWcgewotCXUzMiBwbXFob3N0ZGF0YTsJLyogcmVhZCBvbmx5ISAqLwotCXN0cnVjdCB7Ci0JCXUxNiBwbXFjdHJsc3RhdHVzOwkvKiByZWFkL3dyaXRlICovCi0JCXUxNiBQQUQ7Ci0JfSB3OwotfTsKLQotc3RydWN0IGZpZm82NCB7Ci0JZG1hNjRyZWdzX3QgZG1heG10OwkvKiBkbWEgdHggKi8KLQlwaW80cmVnc190IHBpb3R4OwkvKiBwaW8gdHggKi8KLQlkbWE2NHJlZ3NfdCBkbWFyY3Y7CS8qIGRtYSByeCAqLwotCXBpbzRyZWdzX3QgcGlvcng7CS8qIHBpbyByeCAqLwotfTsKLQotLyoKLSAqIEhvc3QgSW50ZXJmYWNlIFJlZ2lzdGVycwotICovCi1zdHJ1Y3QgZDExcmVncyB7Ci0JLyogRGV2aWNlIENvbnRyb2wgKCJzZW1pLXN0YW5kYXJkIGhvc3QgcmVnaXN0ZXJzIikgKi8KLQl1MzIgUEFEWzNdOwkJLyogMHgwIC0gMHg4ICovCi0JdTMyIGJpc3RzdGF0dXM7CS8qIDB4QyAqLwotCXUzMiBiaXN0c3RhdHVzMjsJLyogMHgxMCAqLwotCXUzMiBQQUQ7CQkvKiAweDE0ICovCi0JdTMyIGdwdGltZXI7CQkvKiAweDE4ICovCi0JdTMyIHVzZWN0aW1lcjsJLyogMHgxYyAqLy8qIGZvciBjb3JlcmV2ID49IDI2ICovCi0KLQkvKiBJbnRlcnJ1cHQgQ29udHJvbCAqLy8qIDB4MjAgKi8KLQlpbnRjdHJscmVnc190IGludGN0cmxyZWdzWzhdOwotCi0JdTMyIFBBRFs0MF07CQkvKiAweDYwIC0gMHhGQyAqLwotCi0JdTMyIGludHJjdmxhenlbNF07CS8qIDB4MTAwIC0gMHgxMEMgKi8KLQotCXUzMiBQQURbNF07CQkvKiAweDExMCAtIDB4MTFjICovCi0KLQl1MzIgbWFjY29udHJvbDsJLyogMHgxMjAgKi8KLQl1MzIgbWFjY29tbWFuZDsJLyogMHgxMjQgKi8KLQl1MzIgbWFjaW50c3RhdHVzOwkvKiAweDEyOCAqLwotCXUzMiBtYWNpbnRtYXNrOwkvKiAweDEyQyAqLwotCi0JLyogVHJhbnNtaXQgVGVtcGxhdGUgQWNjZXNzICovCi0JdTMyIHRwbGF0ZXdycHRyOwkvKiAweDEzMCAqLwotCXUzMiB0cGxhdGV3cmRhdGE7CS8qIDB4MTM0ICovCi0JdTMyIFBBRFsyXTsJCS8qIDB4MTM4IC0gMHgxM0MgKi8KLQotCS8qIFBNUSByZWdpc3RlcnMgKi8KLQlwbXFyZWdfdCBwbXFyZWc7CS8qIDB4MTQwICovCi0JdTMyIHBtcXBhdGw7CQkvKiAweDE0NCAqLwotCXUzMiBwbXFwYXRoOwkJLyogMHgxNDggKi8KLQl1MzIgUEFEOwkJLyogMHgxNEMgKi8KLQotCXUzMiBjaG5zdGF0dXM7CS8qIDB4MTUwICovCi0JdTMyIHBzbWRlYnVnOwkvKiAweDE1NCAqLwotCXUzMiBwaHlkZWJ1ZzsJLyogMHgxNTggKi8KLQl1MzIgbWFjaHdjYXA7CS8qIDB4MTVDICovCi0KLQkvKiBFeHRlbmRlZCBJbnRlcm5hbCBPYmplY3RzICovCi0JdTMyIG9iamFkZHI7CQkvKiAweDE2MCAqLwotCXUzMiBvYmpkYXRhOwkJLyogMHgxNjQgKi8KLQl1MzIgUEFEWzJdOwkJLyogMHgxNjggLSAweDE2YyAqLwotCi0JdTMyIGZybXR4c3RhdHVzOwkvKiAweDE3MCAqLwotCXUzMiBmcm10eHN0YXR1czI7CS8qIDB4MTc0ICovCi0JdTMyIFBBRFsyXTsJCS8qIDB4MTc4IC0gMHgxN2MgKi8KLQotCS8qIFRTRiBob3N0IGFjY2VzcyAqLwotCXUzMiB0c2ZfdGltZXJsb3c7CS8qIDB4MTgwICovCi0JdTMyIHRzZl90aW1lcmhpZ2g7CS8qIDB4MTg0ICovCi0JdTMyIHRzZl9jZnByZXA7CS8qIDB4MTg4ICovCi0JdTMyIHRzZl9jZnBzdGFydDsJLyogMHgxOGMgKi8KLQl1MzIgdHNmX2NmcG1heGR1cjMyOwkvKiAweDE5MCAqLwotCXUzMiBQQURbM107CQkvKiAweDE5NCAtIDB4MTljICovCi0KLQl1MzIgbWFjY29udHJvbDE7CS8qIDB4MWEwICovCi0JdTMyIG1hY2h3Y2FwMTsJLyogMHgxYTQgKi8KLQl1MzIgUEFEWzE0XTsJCS8qIDB4MWE4IC0gMHgxZGMgKi8KLQotCS8qIENsb2NrIGNvbnRyb2wgYW5kIGhhcmR3YXJlIHdvcmthcm91bmRzKi8KLQl1MzIgY2xrX2N0bF9zdDsJLyogMHgxZTAgKi8KLQl1MzIgaHdfd2FyOwotCXUzMiBkMTFfcGh5cGxsY3RsOwkvKiB0aGUgcGh5cGxsIHJlcXVlc3QvYXZhaWwgYml0cyBhcmUKLQkJCQkgKiBtb3ZlZCB0byBjbGtfY3RsX3N0Ci0JCQkJICovCi0JdTMyIFBBRFs1XTsJCS8qIDB4MWVjIC0gMHgxZmMgKi8KLQotCS8qIDB4MjAwLTB4MzdGIGRtYS9waW8gcmVnaXN0ZXJzICovCi0JZmlmbzY0X3QgZmlmbzY0cmVnc1s2XTsKLQotCS8qIEZJRk8gZGlhZ25vc3RpYyBwb3J0IGFjY2VzcyAqLwotCWRtYTMyZGlhZ190IGRtYWZpZm87CS8qIDB4MzgwIC0gMHgzOEMgKi8KLQotCXUzMiBhZ2dmaWZvY250OwkvKiAweDM5MCAqLwotCXUzMiBhZ2dmaWZvZGF0YTsJLyogMHgzOTQgKi8KLQl1MzIgUEFEWzE2XTsJCS8qIDB4Mzk4IC0gMHgzZDQgKi8KLQl1MTYgcmFkaW9yZWdhZGRyOwkvKiAweDNkOCAqLwotCXUxNiByYWRpb3JlZ2RhdGE7CS8qIDB4M2RhICovCi0KLQkvKgotCSAqIHRpbWUgZGVsYXkgYmV0d2VlbiB0aGUgY2hhbmdlIG9uIHJmIGRpc2FibGUgaW5wdXQgYW5kCi0JICogcmFkaW8gc2h1dGRvd24KLQkgKi8KLQl1MzIgcmZkaXNhYmxlZGx5OwkvKiAweDNEQyAqLwotCi0JLyogUEhZIHJlZ2lzdGVyIGFjY2VzcyAqLwotCXUxNiBwaHl2ZXJzaW9uOwkvKiAweDNlMCAtIDB4MCAqLwotCXUxNiBwaHliYmNvbmZpZzsJLyogMHgzZTIgLSAweDEgKi8KLQl1MTYgcGh5YWRjYmlhczsJLyogMHgzZTQgLSAweDIgIEJwaHkgb25seSAqLwotCXUxNiBwaHlhbmFjb3JlOwkvKiAweDNlNiAtIDB4MyAgcHd3cmR3biBvbiBhcGh5ICovCi0JdTE2IHBoeXJ4c3RhdHVzMDsJLyogMHgzZTggLSAweDQgKi8KLQl1MTYgcGh5cnhzdGF0dXMxOwkvKiAweDNlYSAtIDB4NSAqLwotCXUxNiBwaHljcnN0aDsJLyogMHgzZWMgLSAweDYgKi8KLQl1MTYgcGh5dHhlcnJvcjsJLyogMHgzZWUgLSAweDcgKi8KLQl1MTYgcGh5Y2hhbm5lbDsJLyogMHgzZjAgLSAweDggKi8KLQl1MTYgUEFEWzFdOwkJLyogMHgzZjIgLSAweDkgKi8KLQl1MTYgcGh5dGVzdDsJCS8qIDB4M2Y0IC0gMHhhICovCi0JdTE2IHBoeTR3YWRkcjsJLyogMHgzZjYgLSAweGIgKi8KLQl1MTYgcGh5NHdkYXRhaGk7CS8qIDB4M2Y4IC0gMHhjICovCi0JdTE2IHBoeTR3ZGF0YWxvOwkvKiAweDNmYSAtIDB4ZCAqLwotCXUxNiBwaHlyZWdhZGRyOwkvKiAweDNmYyAtIDB4ZSAqLwotCXUxNiBwaHlyZWdkYXRhOwkvKiAweDNmZSAtIDB4ZiAqLwotCi0JLyogSUhSICovLyogMHg0MDAgLSAweDdGRSAqLwotCi0JLyogUlhFIEJsb2NrICovCi0JdTE2IFBBRFszXTsJCS8qIDB4NDAwIC0gMHg0MDYgKi8KLQl1MTYgcmN2X2ZpZm9fY3RsOwkvKiAweDQwNiAqLwotCXUxNiBQQUQ7CQkvKiAweDQwOCAtIDB4NDBhICovCi0JdTE2IHJjdl9mcm1fY250OwkvKiAweDQwYSAqLwotCXUxNiBQQURbNF07CQkvKiAweDQwYSAtIDB4NDE0ICovCi0JdTE2IHJzc2k7CQkvKiAweDQxNCAqLwotCXUxNiBQQURbNV07CQkvKiAweDQxNCAtIDB4NDIwICovCi0JdTE2IHJjbV9jdGw7CQkvKiAweDQyMCAqLwotCXUxNiByY21fbWF0X2RhdGE7CS8qIDB4NDIyICovCi0JdTE2IHJjbV9tYXRfbWFzazsJLyogMHg0MjQgKi8KLQl1MTYgcmNtX21hdF9kbHk7CS8qIDB4NDI2ICovCi0JdTE2IHJjbV9jb25kX21hc2tfbDsJLyogMHg0MjggKi8KLQl1MTYgcmNtX2NvbmRfbWFza19oOwkvKiAweDQyQSAqLwotCXUxNiByY21fY29uZF9kbHk7CS8qIDB4NDJDICovCi0JdTE2IFBBRFsxXTsJCS8qIDB4NDJFICovCi0JdTE2IGV4dF9paHJfYWRkcjsJLyogMHg0MzAgKi8KLQl1MTYgZXh0X2locl9kYXRhOwkvKiAweDQzMiAqLwotCXUxNiByeGVfcGh5cnNfMjsJLyogMHg0MzQgKi8KLQl1MTYgcnhlX3BoeXJzXzM7CS8qIDB4NDM2ICovCi0JdTE2IHBoeV9tb2RlOwkvKiAweDQzOCAqLwotCXUxNiByY210YV9jdGw7CS8qIDB4NDNhICovCi0JdTE2IHJjbXRhX3NpemU7CS8qIDB4NDNjICovCi0JdTE2IHJjbXRhX2FkZHIwOwkvKiAweDQzZSAqLwotCXUxNiByY210YV9hZGRyMTsJLyogMHg0NDAgKi8KLQl1MTYgcmNtdGFfYWRkcjI7CS8qIDB4NDQyICovCi0JdTE2IFBBRFszMF07CQkvKiAweDQ0NCAtIDB4NDgwICovCi0KLQkvKiBQU00gQmxvY2sgKi8vKiAweDQ4MCAtIDB4NTAwICovCi0KLQl1MTYgUEFEOwkJLyogMHg0ODAgKi8KLQl1MTYgcHNtX21hY2NvbnRyb2xfaDsJLyogMHg0ODIgKi8KLQl1MTYgcHNtX21hY2ludHN0YXR1c19sOwkvKiAweDQ4NCAqLwotCXUxNiBwc21fbWFjaW50c3RhdHVzX2g7CS8qIDB4NDg2ICovCi0JdTE2IHBzbV9tYWNpbnRtYXNrX2w7CS8qIDB4NDg4ICovCi0JdTE2IHBzbV9tYWNpbnRtYXNrX2g7CS8qIDB4NDhBICovCi0JdTE2IFBBRDsJCS8qIDB4NDhDICovCi0JdTE2IHBzbV9tYWNjb21tYW5kOwkvKiAweDQ4RSAqLwotCXUxNiBwc21fYnJjOwkJLyogMHg0OTAgKi8KLQl1MTYgcHNtX3BoeV9oZHJfcGFyYW07CS8qIDB4NDkyICovCi0JdTE2IHBzbV9wb3N0Y2FyZDsJLyogMHg0OTQgKi8KLQl1MTYgcHNtX3BjYXJkX2xvY19sOwkvKiAweDQ5NiAqLwotCXUxNiBwc21fcGNhcmRfbG9jX2g7CS8qIDB4NDk4ICovCi0JdTE2IHBzbV9ncGlvX2luOwkvKiAweDQ5QSAqLwotCXUxNiBwc21fZ3Bpb19vdXQ7CS8qIDB4NDlDICovCi0JdTE2IHBzbV9ncGlvX29lOwkvKiAweDQ5RSAqLwotCi0JdTE2IHBzbV9icmVkXzA7CS8qIDB4NEEwICovCi0JdTE2IHBzbV9icmVkXzE7CS8qIDB4NEEyICovCi0JdTE2IHBzbV9icmVkXzI7CS8qIDB4NEE0ICovCi0JdTE2IHBzbV9icmVkXzM7CS8qIDB4NEE2ICovCi0JdTE2IHBzbV9icmNsXzA7CS8qIDB4NEE4ICovCi0JdTE2IHBzbV9icmNsXzE7CS8qIDB4NEFBICovCi0JdTE2IHBzbV9icmNsXzI7CS8qIDB4NEFDICovCi0JdTE2IHBzbV9icmNsXzM7CS8qIDB4NEFFICovCi0JdTE2IHBzbV9icnBvXzA7CS8qIDB4NEIwICovCi0JdTE2IHBzbV9icnBvXzE7CS8qIDB4NEIyICovCi0JdTE2IHBzbV9icnBvXzI7CS8qIDB4NEI0ICovCi0JdTE2IHBzbV9icnBvXzM7CS8qIDB4NEI2ICovCi0JdTE2IHBzbV9icndrXzA7CS8qIDB4NEI4ICovCi0JdTE2IHBzbV9icndrXzE7CS8qIDB4NEJBICovCi0JdTE2IHBzbV9icndrXzI7CS8qIDB4NEJDICovCi0JdTE2IHBzbV9icndrXzM7CS8qIDB4NEJFICovCi0KLQl1MTYgcHNtX2Jhc2VfMDsJLyogMHg0QzAgKi8KLQl1MTYgcHNtX2Jhc2VfMTsJLyogMHg0QzIgKi8KLQl1MTYgcHNtX2Jhc2VfMjsJLyogMHg0QzQgKi8KLQl1MTYgcHNtX2Jhc2VfMzsJLyogMHg0QzYgKi8KLQl1MTYgcHNtX2Jhc2VfNDsJLyogMHg0QzggKi8KLQl1MTYgcHNtX2Jhc2VfNTsJLyogMHg0Q0EgKi8KLQl1MTYgcHNtX2Jhc2VfNjsJLyogMHg0Q0MgKi8KLQl1MTYgcHNtX3BjX3JlZ18wOwkvKiAweDRDRSAqLwotCXUxNiBwc21fcGNfcmVnXzE7CS8qIDB4NEQwICovCi0JdTE2IHBzbV9wY19yZWdfMjsJLyogMHg0RDIgKi8KLQl1MTYgcHNtX3BjX3JlZ18zOwkvKiAweDRENCAqLwotCXUxNiBQQURbMHhEXTsJLyogMHg0RDYgLSAweDRERSAqLwotCXUxNiBwc21fY29yZWN0bHN0czsJLyogMHg0ZjAgKi8vKiBDb3JlcmV2ID49IDEzICovCi0JdTE2IFBBRFsweDddOwkvKiAweDRmMiAtIDB4NGZFICovCi0KLQkvKiBUWEUwIEJsb2NrICovLyogMHg1MDAgLSAweDU4MCAqLwotCXUxNiB0eGVfY3RsOwkJLyogMHg1MDAgKi8KLQl1MTYgdHhlX2F1eDsJCS8qIDB4NTAyICovCi0JdTE2IHR4ZV90c19sb2M7CS8qIDB4NTA0ICovCi0JdTE2IHR4ZV90aW1lX291dDsJLyogMHg1MDYgKi8KLQl1MTYgdHhlX3dtXzA7CS8qIDB4NTA4ICovCi0JdTE2IHR4ZV93bV8xOwkvKiAweDUwQSAqLwotCXUxNiB0eGVfcGh5Y3RsOwkvKiAweDUwQyAqLwotCXUxNiB0eGVfc3RhdHVzOwkvKiAweDUwRSAqLwotCXUxNiB0eGVfbW1wbGNwMDsJLyogMHg1MTAgKi8KLQl1MTYgdHhlX21tcGxjcDE7CS8qIDB4NTEyICovCi0JdTE2IHR4ZV9waHljdGwxOwkvKiAweDUxNCAqLwotCi0JdTE2IFBBRFsweDA1XTsJLyogMHg1MTAgLSAweDUxRSAqLwotCi0JLyogVHJhbnNtaXQgY29udHJvbCAqLwotCXUxNiB4bXRmaWZvZGVmOwkvKiAweDUyMCAqLwotCXUxNiB4bXRmaWZvX2ZyYW1lX2NudDsJLyogMHg1MjIgKi8vKiBDb3JlcmV2ID49IDE2ICovCi0JdTE2IHhtdGZpZm9fYnl0ZV9jbnQ7CS8qIDB4NTI0ICovLyogQ29yZXJldiA+PSAxNiAqLwotCXUxNiB4bXRmaWZvX2hlYWQ7CS8qIDB4NTI2ICovLyogQ29yZXJldiA+PSAxNiAqLwotCXUxNiB4bXRmaWZvX3JkX3B0cjsJLyogMHg1MjggKi8vKiBDb3JlcmV2ID49IDE2ICovCi0JdTE2IHhtdGZpZm9fd3JfcHRyOwkvKiAweDUyQSAqLy8qIENvcmVyZXYgPj0gMTYgKi8KLQl1MTYgeG10Zmlmb2RlZjE7CS8qIDB4NTJDICovLyogQ29yZXJldiA+PSAxNiAqLwotCi0JdTE2IFBBRFsweDA5XTsJLyogMHg1MkUgLSAweDUzRSAqLwotCi0JdTE2IHhtdGZpZm9jbWQ7CS8qIDB4NTQwICovCi0JdTE2IHhtdGZpZm9mbHVzaDsJLyogMHg1NDIgKi8KLQl1MTYgeG10Zmlmb3RocmVzaDsJLyogMHg1NDQgKi8KLQl1MTYgeG10Zmlmb3JkeTsJLyogMHg1NDYgKi8KLQl1MTYgeG10Zmlmb3ByaXJkeTsJLyogMHg1NDggKi8KLQl1MTYgeG10Zmlmb3JxcHJpOwkvKiAweDU0QSAqLwotCXUxNiB4bXR0cGxhdGV0eHB0cjsJLyogMHg1NEMgKi8KLQl1MTYgUEFEOwkJLyogMHg1NEUgKi8KLQl1MTYgeG10dHBsYXRlcHRyOwkvKiAweDU1MCAqLwotCXUxNiBzbXBsX2NsY3Rfc3RycHRyOwkvKiAweDU1MiAqLy8qIENvcmVyZXYgPj0gMjIgKi8KLQl1MTYgc21wbF9jbGN0X3N0cHB0cjsJLyogMHg1NTQgKi8vKiBDb3JlcmV2ID49IDIyICovCi0JdTE2IHNtcGxfY2xjdF9jdXJwdHI7CS8qIDB4NTU2ICovLyogQ29yZXJldiA+PSAyMiAqLwotCXUxNiBQQURbMHgwNF07CS8qIDB4NTU4IC0gMHg1NUUgKi8KLQl1MTYgeG10dHBsYXRlZGF0YWxvOwkvKiAweDU2MCAqLwotCXUxNiB4bXR0cGxhdGVkYXRhaGk7CS8qIDB4NTYyICovCi0KLQl1MTYgUEFEWzJdOwkJLyogMHg1NjQgLSAweDU2NiAqLwotCi0JdTE2IHhtdHNlbDsJCS8qIDB4NTY4ICovCi0JdTE2IHhtdHR4Y250OwkvKiAweDU2QSAqLwotCXUxNiB4bXR0eHNobWFkZHI7CS8qIDB4NTZDICovCi0KLQl1MTYgUEFEWzB4MDldOwkvKiAweDU2RSAtIDB4NTdFICovCi0KLQkvKiBUWEUxIEJsb2NrICovCi0JdTE2IFBBRFsweDQwXTsJLyogMHg1ODAgLSAweDVGRSAqLwotCi0JLyogVFNGIEJsb2NrICovCi0JdTE2IFBBRFswWDAyXTsJLyogMHg2MDAgLSAweDYwMiAqLwotCXUxNiB0c2ZfY2Zwc3RydF9sOwkvKiAweDYwNCAqLwotCXUxNiB0c2ZfY2Zwc3RydF9oOwkvKiAweDYwNiAqLwotCXUxNiBQQURbMFgwNV07CS8qIDB4NjA4IC0gMHg2MTAgKi8KLQl1MTYgdHNmX2NmcHByZXRidHQ7CS8qIDB4NjEyICovCi0JdTE2IFBBRFswWERdOwkvKiAweDYxNCAtIDB4NjJDICovCi0JdTE2IHRzZl9jbGtfZnJhY19sOwkvKiAweDYyRSAqLwotCXUxNiB0c2ZfY2xrX2ZyYWNfaDsJLyogMHg2MzAgKi8KLQl1MTYgUEFEWzBYMTRdOwkvKiAweDYzMiAtIDB4NjU4ICovCi0JdTE2IHRzZl9yYW5kb207CS8qIDB4NjVBICovCi0JdTE2IFBBRFsweDA1XTsJLyogMHg2NUMgLSAweDY2NCAqLwotCS8qIEdQVGltZXIgMiByZWdpc3RlcnMgKi8KLQl1MTYgdHNmX2dwdDJfc3RhdDsJLyogMHg2NjYgKi8KLQl1MTYgdHNmX2dwdDJfY3RyX2w7CS8qIDB4NjY4ICovCi0JdTE2IHRzZl9ncHQyX2N0cl9oOwkvKiAweDY2QSAqLwotCXUxNiB0c2ZfZ3B0Ml92YWxfbDsJLyogMHg2NkMgKi8KLQl1MTYgdHNmX2dwdDJfdmFsX2g7CS8qIDB4NjZFICovCi0JdTE2IHRzZl9ncHRhbGxfc3RhdDsJLyogMHg2NzAgKi8KLQl1MTYgUEFEWzB4MDddOwkvKiAweDY3MiAtIDB4NjdFICovCi0KLQkvKiBJRlMgQmxvY2sgKi8KLQl1MTYgaWZzX3NpZnNfcnhfdHhfdHg7CS8qIDB4NjgwICovCi0JdTE2IGlmc19zaWZzX25hdl90eDsJLyogMHg2ODIgKi8KLQl1MTYgaWZzX3Nsb3Q7CS8qIDB4Njg0ICovCi0JdTE2IFBBRDsJCS8qIDB4Njg2ICovCi0JdTE2IGlmc19jdGw7CQkvKiAweDY4OCAqLwotCXUxNiBQQURbMHgzXTsJLyogMHg2OGEgLSAweDY4RiAqLwotCXUxNiBpZnNzdGF0OwkJLyogMHg2OTAgKi8KLQl1MTYgaWZzbWVkYnVzeWN0bDsJLyogMHg2OTIgKi8KLQl1MTYgaWZ0eGR1cjsJCS8qIDB4Njk0ICovCi0JdTE2IFBBRFsweDNdOwkvKiAweDY5NiAtIDB4NjliICovCi0JLyogRURDRiBzdXBwb3J0IGluIGRvdDExbWFjcyAqLwotCXUxNiBpZnNfYWlmc247CS8qIDB4NjljICovCi0JdTE2IGlmc19jdGwxOwkvKiAweDY5ZSAqLwotCi0JLyogc2xvdyBjbG9jayByZWdpc3RlcnMgKi8KLQl1MTYgc2NjX2N0bDsJCS8qIDB4NmEwICovCi0JdTE2IHNjY190aW1lcl9sOwkvKiAweDZhMiAqLwotCXUxNiBzY2NfdGltZXJfaDsJLyogMHg2YTQgKi8KLQl1MTYgc2NjX2ZyYWM7CS8qIDB4NmE2ICovCi0JdTE2IHNjY19mYXN0cHdydXBfZGx5OwkvKiAweDZhOCAqLwotCXUxNiBzY2NfcGVyOwkJLyogMHg2YWEgKi8KLQl1MTYgc2NjX3Blcl9mcmFjOwkvKiAweDZhYyAqLwotCXUxNiBzY2NfY2FsX3RpbWVyX2w7CS8qIDB4NmFlICovCi0JdTE2IHNjY19jYWxfdGltZXJfaDsJLyogMHg2YjAgKi8KLQl1MTYgUEFEOwkJLyogMHg2YjIgKi8KLQotCXUxNiBQQURbMHgyNl07Ci0KLQkvKiBOQVYgQmxvY2sgKi8KLQl1MTYgbmF2X2N0bDsJCS8qIDB4NzAwICovCi0JdTE2IG5hdnN0YXQ7CQkvKiAweDcwMiAqLwotCXUxNiBQQURbMHgzZV07CS8qIDB4NzAyIC0gMHg3N0UgKi8KLQotCS8qIFdFUC9QTVEgQmxvY2sgKi8vKiAweDc4MCAtIDB4N0ZFICovCi0JdTE2IFBBRFsweDIwXTsJLyogMHg3ODAgLSAweDdCRSAqLwotCi0JdTE2IHdlcGN0bDsJCS8qIDB4N0MwICovCi0JdTE2IHdlcGl2bG9jOwkvKiAweDdDMiAqLwotCXUxNiB3ZXBpdmtleTsJLyogMHg3QzQgKi8KLQl1MTYgd2Vwd2tleTsJCS8qIDB4N0M2ICovCi0KLQl1MTYgUEFEWzRdOwkJLyogMHg3QzggLSAweDdDRSAqLwotCXUxNiBwY21jdGw7CQkvKiAwWDdEMCAqLwotCXUxNiBwY21zdGF0OwkJLyogMFg3RDIgKi8KLQl1MTYgUEFEWzZdOwkJLyogMHg3RDQgLSAweDdERSAqLwotCi0JdTE2IHBtcWN0bDsJCS8qIDB4N0UwICovCi0JdTE2IHBtcXN0YXR1czsJLyogMHg3RTIgKi8KLQl1MTYgcG1xcGF0MDsJCS8qIDB4N0U0ICovCi0JdTE2IHBtcXBhdDE7CQkvKiAweDdFNiAqLwotCXUxNiBwbXFwYXQyOwkJLyogMHg3RTggKi8KLQotCXUxNiBwbXFkYXQ7CQkvKiAweDdFQSAqLwotCXUxNiBwbXFkYXRvcjsJLyogMHg3RUMgKi8KLQl1MTYgcG1xaHN0OwkJLyogMHg3RUUgKi8KLQl1MTYgcG1xcGF0aDA7CS8qIDB4N0YwICovCi0JdTE2IHBtcXBhdGgxOwkvKiAweDdGMiAqLwotCXUxNiBwbXFwYXRoMjsJLyogMHg3RjQgKi8KLQl1MTYgcG1xZGF0aDsJCS8qIDB4N0Y2ICovCi0KLQl1MTYgUEFEWzB4MDRdOwkvKiAweDdGOCAtIDB4N0ZFICovCi0KLQkvKiBTSE0gKi8vKiAweDgwMCAtIDB4RUZFICovCi0JdTE2IFBBRFsweDM4MF07CS8qIDB4ODAwIC0gMHhFRkUgKi8KLX07Ci0KLSNkZWZpbmUJUElIUl9CQVNFCTB4MDQwMAkvKiBieXRlIGFkZHJlc3Mgb2YgcGFja2VkIElIUiByZWdpb24gKi8KLQotLyogYmlzdHN0YXR1cyAqLwotI2RlZmluZQlCVF9ET05FCQkoMVUgPDwgMzEpCS8qIGJpc3QgZG9uZSAqLwotI2RlZmluZQlCVF9CMlMJCSgxIDw8IDMwKQkvKiBiaXN0MiByYW0gc3VtbWFyeSBiaXQgKi8KLQotLyogaW50c3RhdHVzIGFuZCBpbnRtYXNrICovCi0jZGVmaW5lCUlfUEMJCSgxIDw8IDEwKQkvKiBwY2kgZGVzY3JpcHRvciBlcnJvciAqLwotI2RlZmluZQlJX1BECQkoMSA8PCAxMSkJLyogcGNpIGRhdGEgZXJyb3IgKi8KLSNkZWZpbmUJSV9ERQkJKDEgPDwgMTIpCS8qIGRlc2NyaXB0b3IgcHJvdG9jb2wgZXJyb3IgKi8KLSNkZWZpbmUJSV9SVQkJKDEgPDwgMTMpCS8qIHJlY2VpdmUgZGVzY3JpcHRvciB1bmRlcmZsb3cgKi8KLSNkZWZpbmUJSV9STwkJKDEgPDwgMTQpCS8qIHJlY2VpdmUgZmlmbyBvdmVyZmxvdyAqLwotI2RlZmluZQlJX1hVCQkoMSA8PCAxNSkJLyogdHJhbnNtaXQgZmlmbyB1bmRlcmZsb3cgKi8KLSNkZWZpbmUJSV9SSQkJKDEgPDwgMTYpCS8qIHJlY2VpdmUgaW50ZXJydXB0ICovCi0jZGVmaW5lCUlfWEkJCSgxIDw8IDI0KQkvKiB0cmFuc21pdCBpbnRlcnJ1cHQgKi8KLQotLyogaW50ZXJydXB0IHJlY2VpdmUgbGF6eSAqLwotI2RlZmluZQlJUkxfVE9fTUFTSwkJMHgwMGZmZmZmZgkvKiB0aW1lb3V0ICovCi0jZGVmaW5lCUlSTF9GQ19NQVNLCQkweGZmMDAwMDAwCS8qIGZyYW1lIGNvdW50ICovCi0jZGVmaW5lCUlSTF9GQ19TSElGVAkJMjQJLyogZnJhbWUgY291bnQgKi8KLQotLyogbWFjY29udHJvbCByZWdpc3RlciAqLwotI2RlZmluZQlNQ1RMX0dNT0RFCQkoMVUgPDwgMzEpCi0jZGVmaW5lCU1DVExfRElTQ0FSRF9QTVEJKDEgPDwgMzApCi0jZGVmaW5lCU1DVExfV0FLRQkJKDEgPDwgMjYpCi0jZGVmaW5lCU1DVExfSFBTCQkoMSA8PCAyNSkKLSNkZWZpbmUJTUNUTF9QUk9NSVNDCQkoMSA8PCAyNCkKLSNkZWZpbmUJTUNUTF9LRUVQQkFERkNTCQkoMSA8PCAyMykKLSNkZWZpbmUJTUNUTF9LRUVQQ09OVFJPTAkoMSA8PCAyMikKLSNkZWZpbmUJTUNUTF9QSFlMT0NLCQkoMSA8PCAyMSkKLSNkZWZpbmUJTUNUTF9CQ05TX1BST01JU0MJKDEgPDwgMjApCi0jZGVmaW5lCU1DVExfTE9DS19SQURJTwkJKDEgPDwgMTkpCi0jZGVmaW5lCU1DVExfQVAJCQkoMSA8PCAxOCkKLSNkZWZpbmUJTUNUTF9JTkZSQQkJKDEgPDwgMTcpCi0jZGVmaW5lCU1DVExfQklHRU5ECQkoMSA8PCAxNikKLSNkZWZpbmUJTUNUTF9HUE9VVF9TRUxfTUFTSwkoMyA8PCAxNCkKLSNkZWZpbmUJTUNUTF9HUE9VVF9TRUxfU0hJRlQJMTQKLSNkZWZpbmUJTUNUTF9FTl9QU01EQkcJCSgxIDw8IDEzKQotI2RlZmluZQlNQ1RMX0lIUl9FTgkJKDEgPDwgMTApCi0jZGVmaW5lCU1DVExfU0hNX1VQUEVSCQkoMSA8PCAgOSkKLSNkZWZpbmUJTUNUTF9TSE1fRU4JCSgxIDw8ICA4KQotI2RlZmluZQlNQ1RMX1BTTV9KTVBfMAkJKDEgPDwgIDIpCi0jZGVmaW5lCU1DVExfUFNNX1JVTgkJKDEgPDwgIDEpCi0jZGVmaW5lCU1DVExfRU5fTUFDCQkoMSA8PCAgMCkKLQotLyogbWFjY29tbWFuZCByZWdpc3RlciAqLwotI2RlZmluZQlNQ01EX0JDTjBWTEQJCSgxIDw8ICAwKQotI2RlZmluZQlNQ01EX0JDTjFWTEQJCSgxIDw8ICAxKQotI2RlZmluZQlNQ01EX0RJUkZSTVFWQUwJCSgxIDw8ICAyKQotI2RlZmluZQlNQ01EX0NDQQkJKDEgPDwgIDMpCi0jZGVmaW5lCU1DTURfQkdfTk9JU0UJCSgxIDw8ICA0KQotI2RlZmluZQlNQ01EX1NLSVBfU0hNSU5JVAkoMSA8PCAgNSkJLyogb25seSB1c2VkIGZvciBzaW11bGF0aW9uICovCi0jZGVmaW5lIE1DTURfU0FNUExFQ09MTAkJTUNNRF9TS0lQX1NITUlOSVQJLyogcmV1c2UgZm9yIHNhbXBsZSBjb2xsZWN0ICovCi0KLS8qIG1hY2ludHN0YXR1cy9tYWNpbnRtYXNrICovCi0jZGVmaW5lCU1JX01BQ1NTUE5ERAkJKDEgPDwgIDApCS8qIE1BQyBoYXMgZ3JhY2VmdWxseSBzdXNwZW5kZWQgKi8KLSNkZWZpbmUJTUlfQkNOVFBMCQkoMSA8PCAgMSkJLyogYmVhY29uIHRlbXBsYXRlIGF2YWlsYWJsZSAqLwotI2RlZmluZQlNSV9UQlRUCQkJKDEgPDwgIDIpCS8qIFRCVFQgaW5kaWNhdGlvbiAqLwotI2RlZmluZQlNSV9CQ05TVUNDRVNTCQkoMSA8PCAgMykJLyogYmVhY29uIHN1Y2Nlc3NmdWxseSB0eCdkICovCi0jZGVmaW5lCU1JX0JDTkNBTkNMRAkJKDEgPDwgIDQpCS8qIGJlYWNvbiBjYW5jZWxlZCAoSUJTUykgKi8KLSNkZWZpbmUJTUlfQVRJTVdJTkVORAkJKDEgPDwgIDUpCS8qIGVuZCBvZiBBVElNLXdpbmRvdyAoSUJTUykgKi8KLSNkZWZpbmUJTUlfUE1RCQkJKDEgPDwgIDYpCS8qIFBNUSBlbnRyaWVzIGF2YWlsYWJsZSAqLwotI2RlZmluZQlNSV9OU1BFQ0dFTl8wCQkoMSA8PCAgNykJLyogbm9uLXNwZWNpZmljIGdlbi1zdGF0IGJpdHMgdGhhdCBhcmUgc2V0IGJ5IFBTTSAqLwotI2RlZmluZQlNSV9OU1BFQ0dFTl8xCQkoMSA8PCAgOCkJLyogbm9uLXNwZWNpZmljIGdlbi1zdGF0IGJpdHMgdGhhdCBhcmUgc2V0IGJ5IFBTTSAqLwotI2RlZmluZQlNSV9NQUNUWEVSUgkJKDEgPDwgIDkpCS8qIE1BQyBsZXZlbCBUeCBlcnJvciAqLwotI2RlZmluZQlNSV9OU1BFQ0dFTl8zCQkoMSA8PCAxMCkJLyogbm9uLXNwZWNpZmljIGdlbi1zdGF0IGJpdHMgdGhhdCBhcmUgc2V0IGJ5IFBTTSAqLwotI2RlZmluZQlNSV9QSFlUWEVSUgkJKDEgPDwgMTEpCS8qIFBIWSBUeCBlcnJvciAqLwotI2RlZmluZQlNSV9QTUUJCQkoMSA8PCAxMikJLyogUG93ZXIgTWFuYWdlbWVudCBFdmVudCAqLwotI2RlZmluZQlNSV9HUDAJCQkoMSA8PCAxMykJLyogR2VuZXJhbC1wdXJwb3NlIHRpbWVyMCAqLwotI2RlZmluZQlNSV9HUDEJCQkoMSA8PCAxNCkJLyogR2VuZXJhbC1wdXJwb3NlIHRpbWVyMSAqLwotI2RlZmluZQlNSV9ETUFJTlQJCSgxIDw8IDE1KQkvKiAoT1JlZCkgRE1BLWludGVycnVwdHMgKi8KLSNkZWZpbmUJTUlfVFhTVE9QCQkoMSA8PCAxNikJLyogTUFDIGhhcyBjb21wbGV0ZWQgYSBUWCBGSUZPIFN1c3BlbmQvRmx1c2ggKi8KLSNkZWZpbmUJTUlfQ0NBCQkJKDEgPDwgMTcpCS8qIE1BQyBoYXMgY29tcGxldGVkIGEgQ0NBIG1lYXN1cmVtZW50ICovCi0jZGVmaW5lCU1JX0JHX05PSVNFCQkoMSA8PCAxOCkJLyogTUFDIGhhcyBjb2xsZWN0ZWQgYmFja2dyb3VuZCBub2lzZSBzYW1wbGVzICovCi0jZGVmaW5lCU1JX0RUSU1fVEJUVAkJKDEgPDwgMTkpCS8qIE1CU1MgRFRJTSBUQlRUIGluZGljYXRpb24gKi8KLSNkZWZpbmUgTUlfUFJRCQkJKDEgPDwgMjApCS8qIFByb2JlIHJlc3BvbnNlIHF1ZXVlIG5lZWRzIGF0dGVudGlvbiAqLwotI2RlZmluZQlNSV9QV1JVUAkJKDEgPDwgMjEpCS8qIFJhZGlvL1BIWSBoYXMgYmVlbiBwb3dlcmVkIGJhY2sgdXAuICovCi0jZGVmaW5lCU1JX1JFU0VSVkVEMwkJKDEgPDwgMjIpCi0jZGVmaW5lCU1JX1JFU0VSVkVEMgkJKDEgPDwgMjMpCi0jZGVmaW5lIE1JX1JFU0VSVkVEMQkJKDEgPDwgMjUpCi0vKiBNQUMgZGV0ZWN0ZWQgY2hhbmdlIG9uIFJGIERpc2FibGUgaW5wdXQqLwotI2RlZmluZSBNSV9SRkRJU0FCTEUJCSgxIDw8IDI4KQotI2RlZmluZQlNSV9URlMJCQkoMSA8PCAyOSkJLyogTUFDIGhhcyBjb21wbGV0ZWQgYSBUWCAqLwotI2RlZmluZQlNSV9QSFlDSEFOR0VECQkoMSA8PCAzMCkJLyogQSBwaHkgc3RhdHVzIGNoYW5nZSB3cnQgRyBtb2RlICovCi0jZGVmaW5lCU1JX1RPCQkJKDFVIDw8IDMxKQkvKiBnZW5lcmFsIHB1cnBvc2UgdGltZW91dCAqLwotCi0vKiBNYWMgY2FwYWJpbGl0aWVzIHJlZ2lzdGVycyAqLwotLyogbWFjaHdjYXAgKi8KLSNkZWZpbmUJTUNBUF9US0lQTUlDCQkweDgwMDAwMDAwCS8qIFRLSVAgTUlDIGhhcmR3YXJlIHByZXNlbnQgKi8KLQotLyogcG1xaG9zdCBkYXRhICovCi0jZGVmaW5lCVBNUUhfREFUQV9NQVNLCQkweGZmZmYwMDAwCS8qIGRhdGEgZW50cnkgb2YgaGVhZCBwbXEgZW50cnkgKi8KLSNkZWZpbmUJUE1RSF9CU1NDRkcJCTB4MDAxMDAwMDAJLyogUE0gZW50cnkgZm9yIEJTUyBjb25maWcgKi8KLSNkZWZpbmUJUE1RSF9QTU9GRgkJMHgwMDAxMDAwMAkvKiBQTSBNb2RlIE9GRjogcG93ZXIgc2F2ZSBvZmYgKi8KLSNkZWZpbmUJUE1RSF9QTU9OCQkweDAwMDIwMDAwCS8qIFBNIE1vZGUgT046IHBvd2VyIHNhdmUgb24gKi8KLSNkZWZpbmUJUE1RSF9EQVNBVAkJMHgwMDA0MDAwMAkvKiBEaXMtYXNzb2NpYXRlZCBvciBEZS1hdXRoZW50aWNhdGVkICovCi0jZGVmaW5lCVBNUUhfQVRJTUZBSUwJCTB4MDAwODAwMDAJLyogQVRJTSBub3QgYWNrbm93bGVkZ2VkICovCi0jZGVmaW5lCVBNUUhfREVMX0VOVFJZCQkweDAwMDAwMDAxCS8qIGRlbGV0ZSBoZWFkIGVudHJ5ICovCi0jZGVmaW5lCVBNUUhfREVMX01VTFQJCTB4MDAwMDAwMDIJLyogZGVsZXRlIGhlYWQgZW50cnkgdG8gY3VyIHJlYWQgcG9pbnRlciAtMSAqLwotI2RlZmluZQlQTVFIX09GTE8JCTB4MDAwMDAwMDQJLyogcG1xIG92ZXJmbG93IGluZGljYXRpb24gKi8KLSNkZWZpbmUJUE1RSF9OT1RfRU1QVFkJCTB4MDAwMDAwMDgJLyogZW50cmllcyBhcmUgcHJlc2VudCBpbiBwbXEgKi8KLQotLyogcGh5ZGVidWcgKi8KLSNkZWZpbmUJUERCR19DUlMJCSgxIDw8IDApCS8qIHBoeSBpcyBhc3NlcnRpbmcgY2FycmllciBzZW5zZSAqLwotI2RlZmluZQlQREJHX1RYQQkJKDEgPDwgMSkJLyogcGh5IGlzIHRha2luZyB4bWl0IGJ5dGUgZnJvbSBtYWMgdGhpcyBjeWNsZSAqLwotI2RlZmluZQlQREJHX1RYRgkJKDEgPDwgMikJLyogbWFjIGlzIGluc3RydWN0aW5nIHRoZSBwaHkgdG8gdHJhbnNtaXQgYSBmcmFtZSAqLwotI2RlZmluZQlQREJHX1RYRQkJKDEgPDwgMykJLyogcGh5IGlzIHNpZ25hbGxpbmcgYSB0cmFuc21pdCBFcnJvciB0byB0aGUgbWFjICovCi0jZGVmaW5lCVBEQkdfUlhGCQkoMSA8PCA0KQkvKiBwaHkgZGV0ZWN0ZWQgdGhlIGVuZCBvZiBhIHZhbGlkIGZyYW1lIHByZWFtYmxlICovCi0jZGVmaW5lCVBEQkdfUlhTCQkoMSA8PCA1KQkvKiBwaHkgZGV0ZWN0ZWQgdGhlIGVuZCBvZiBhIHZhbGlkIFBMQ1AgaGVhZGVyICovCi0jZGVmaW5lCVBEQkdfUlhGUkcJCSgxIDw8IDYpCS8qIHJ4IHN0YXJ0IG5vdCBhc3NlcnRlZCAqLwotI2RlZmluZQlQREJHX1JYVgkJKDEgPDwgNykJLyogbWFjIGlzIHRha2luZyByZWNlaXZlIGJ5dGUgZnJvbSBwaHkgdGhpcyBjeWNsZSAqLwotI2RlZmluZQlQREJHX1JGRAkJKDEgPDwgMTYpCS8qIFJGIHBvcnRpb24gb2YgdGhlIHJhZGlvIGlzIGRpc2FibGVkICovCi0KLS8qIG9iamFkZHIgcmVnaXN0ZXIgKi8KLSNkZWZpbmUJT0JKQUREUl9TRUxfTUFTSwkweDAwMEYwMDAwCi0jZGVmaW5lCU9CSkFERFJfVUNNX1NFTAkJMHgwMDAwMDAwMAotI2RlZmluZQlPQkpBRERSX1NITV9TRUwJCTB4MDAwMTAwMDAKLSNkZWZpbmUJT0JKQUREUl9TQ1JfU0VMCQkweDAwMDIwMDAwCi0jZGVmaW5lCU9CSkFERFJfSUhSX1NFTAkJMHgwMDAzMDAwMAotI2RlZmluZQlPQkpBRERSX1JDTVRBX1NFTAkweDAwMDQwMDAwCi0jZGVmaW5lCU9CSkFERFJfU1JDSE1fU0VMCTB4MDAwNjAwMDAKLSNkZWZpbmUJT0JKQUREUl9XSU5DCQkweDAxMDAwMDAwCi0jZGVmaW5lCU9CSkFERFJfUklOQwkJMHgwMjAwMDAwMAotI2RlZmluZQlPQkpBRERSX0FVVE9fSU5DCTB4MDMwMDAwMDAKLQotI2RlZmluZQlXRVBfUENNQUREUgkJMHgwN2Q0Ci0jZGVmaW5lCVdFUF9QQ01EQVRBCQkweDA3ZDYKLQotLyogZnJtdHhzdGF0dXMgKi8KLSNkZWZpbmUJVFhTX1YJCQkoMSA8PCAwKQkvKiB2YWxpZCBiaXQgKi8KLSNkZWZpbmUJVFhTX1NUQVRVU19NQVNLCQkweGZmZmYKLSNkZWZpbmUJVFhTX0ZJRF9NQVNLCQkweGZmZmYwMDAwCi0jZGVmaW5lCVRYU19GSURfU0hJRlQJCTE2Ci0KLS8qIGZybXR4c3RhdHVzMiAqLwotI2RlZmluZQlUWFNfU0VRX01BU0sJCTB4ZmZmZgotI2RlZmluZQlUWFNfUFRYX01BU0sJCTB4ZmYwMDAwCi0jZGVmaW5lCVRYU19QVFhfU0hJRlQJCTE2Ci0jZGVmaW5lCVRYU19NVV9NQVNLCQkweDAxMDAwMDAwCi0jZGVmaW5lCVRYU19NVV9TSElGVAkJMjQKLQotLyogY2xrX2N0bF9zdCAqLwotI2RlZmluZSBDQ1NfRVJTUkNfUkVRX0QxMVBMTAkweDAwMDAwMTAwCS8qIGQxMSBjb3JlIHBsbCByZXF1ZXN0ICovCi0jZGVmaW5lIENDU19FUlNSQ19SRVFfUEhZUExMCTB4MDAwMDAyMDAJLyogUEhZIHBsbCByZXF1ZXN0ICovCi0jZGVmaW5lIENDU19FUlNSQ19BVkFJTF9EMTFQTEwJMHgwMTAwMDAwMAkvKiBkMTEgY29yZSBwbGwgYXZhaWxhYmxlICovCi0jZGVmaW5lIENDU19FUlNSQ19BVkFJTF9QSFlQTEwJMHgwMjAwMDAwMAkvKiBQSFkgcGxsIGF2YWlsYWJsZSAqLwotCi0vKiBIVCBDbG9jbGsgQ3RybCBhbmQgQ2xvY2sgQXZhaWwgZm9yIDQzMTMgKi8KLSNkZWZpbmUgQ0NTX0VSU1JDX1JFUV9IVCAgICAweDAwMDAwMDEwCS8qIEhUIGF2YWlsIHJlcXVlc3QgKi8KLSNkZWZpbmUgQ0NTX0VSU1JDX0FWQUlMX0hUICAweDAwMDIwMDAwCS8qIEhUIGNsb2NrIGF2YWlsYWJsZSAqLwotCi0vKiB0c2ZfY2ZwcmVwIHJlZ2lzdGVyICovCi0jZGVmaW5lCUNGUFJFUF9DQklfTUFTSwkJMHhmZmZmZmZjMAotI2RlZmluZQlDRlBSRVBfQ0JJX1NISUZUCTYKLSNkZWZpbmUJQ0ZQUkVQX0NGUFAJCTB4MDAwMDAwMDEKLQotLyogdHggZmlmbyBzaXplcyB2YWx1ZXMgYXJlIGluIHRlcm1zIG9mIDI1NiBieXRlIGJsb2NrcyAqLwotI2RlZmluZSBUWEZJRk9DTURfUkVTRVRfTUFTSwkoMSA8PCAxNSkJLyogcmVzZXQgKi8KLSNkZWZpbmUgVFhGSUZPQ01EX0ZJRk9TRUxfU0hJRlQJOAkvKiBmaWZvICovCi0jZGVmaW5lIFRYRklGT19GSUZPVE9QX1NISUZUCTgJLyogZmlmbyBzdGFydCAqLwotCi0jZGVmaW5lIFRYRklGT19TVEFSVF9CTEsxNgkgNjUJLyogQmFzZSBhZGRyZXNzICsgMzIgKiA1MTIgQi9QICovCi0jZGVmaW5lIFRYRklGT19TVEFSVF9CTEsJIDYJLyogQmFzZSBhZGRyZXNzICsgNiAqIDI1NiBCICovCi0jZGVmaW5lIFRYRklGT19TSVpFX1VOSVQJMjU2CS8qIG9uZSB1bml0IGNvcnJlc3BvbmRzIHRvIDI1NiBieXRlcyAqLwotI2RlZmluZSBNQlNTMTZfVEVNUExNRU1fTUlOQkxLUwk2NQkvKiBvbmUgdW5pdCBjb3JyZXNwb25kcyB0byAyNTYgYnl0ZXMgKi8KLQotLyogcGh5IHZlcnNpb25zLCBQaHlWZXJzaW9uOlJldmlzaW9uIGZpZWxkICovCi0jZGVmaW5lCVBWX0FWX01BU0sJCTB4ZjAwMAkvKiBhbmFsb2cgYmxvY2sgdmVyc2lvbiAqLwotI2RlZmluZQlQVl9BVl9TSElGVAkJMTIJLyogYW5hbG9nIGJsb2NrIHZlcnNpb24gYml0ZmllbGQgb2Zmc2V0ICovCi0jZGVmaW5lCVBWX1BUX01BU0sJCTB4MGYwMAkvKiBwaHkgdHlwZSAqLwotI2RlZmluZQlQVl9QVF9TSElGVAkJOAkvKiBwaHkgdHlwZSBiaXRmaWVsZCBvZmZzZXQgKi8KLSNkZWZpbmUJUFZfUFZfTUFTSwkJMHgwMDBmCS8qIHBoeSB2ZXJzaW9uICovCi0jZGVmaW5lCVBIWV9UWVBFKHYpCQkoKHYgJiBQVl9QVF9NQVNLKSA+PiBQVl9QVF9TSElGVCkKLQotLyogcGh5IHR5cGVzLCBQaHlWZXJzaW9uOlBoeVR5cGUgZmllbGQgKi8KLSNkZWZpbmUJUEhZX1RZUEVfTgkJNAkvKiBOLVBoeSB2YWx1ZSAqLwotI2RlZmluZQlQSFlfVFlQRV9TU04JCTYJLyogU1NMUE4tUGh5IHZhbHVlICovCi0jZGVmaW5lCVBIWV9UWVBFX0xDTgkJOAkvKiBMQ04tUGh5IHZhbHVlICovCi0jZGVmaW5lCVBIWV9UWVBFX0xDTlhOCQk5CS8qIExDTlhOLVBoeSB2YWx1ZSAqLwotI2RlZmluZQlQSFlfVFlQRV9OVUxMCQkweGYJLyogSW52YWxpZCBQaHkgdmFsdWUgKi8KLQotLyogYW5hbG9nIHR5cGVzLCBQaHlWZXJzaW9uOkFuYWxvZ1R5cGUgZmllbGQgKi8KLSNkZWZpbmUJQU5BXzExTl8wMTMJCTUKLQotLyogODAyLjExYSBQTENQIGhlYWRlciBkZWYgKi8KLXN0cnVjdCBvZmRtX3BoeV9oZHIgewotCXU4IHJscHRbM107CQkvKiByYXRlLCBsZW5ndGgsIHBhcml0eSwgdGFpbCAqLwotCXUxNiBzZXJ2aWNlOwotCXU4IHBhZDsKLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUJRDExQV9QSFlfSERSX0dSQVRFKHBoZHIpCSgocGhkciktPnJscHRbMF0gJiAweDBmKQotI2RlZmluZQlEMTFBX1BIWV9IRFJfR1JFUyhwaGRyKQkJKCgocGhkciktPnJscHRbMF0gPj4gNCkgJiAweDAxKQotI2RlZmluZQlEMTFBX1BIWV9IRFJfR0xFTkdUSChwaGRyKQkoKCh1MzIgKikoKHBoZHIpLT5ybHB0KSA+PiA1KSAmIDB4MGZmZikKLSNkZWZpbmUJRDExQV9QSFlfSERSX0dQQVJJVFkocGhkcikJKCgocGhkciktPnJscHRbM10gPj4gMSkgJiAweDAxKQotI2RlZmluZQlEMTFBX1BIWV9IRFJfR1RBSUwocGhkcikJKCgocGhkciktPnJscHRbM10gPj4gMikgJiAweDNmKQotCi0vKiByYXRlIGVuY29kZWQgcGVyIDgwMi4xMWEtMTk5OSBzZWMgMTcuMy40LjEgKi8KLSNkZWZpbmUJRDExQV9QSFlfSERSX1NSQVRFKHBoZHIsIHJhdGUpCQlcCi0JKChwaGRyKS0+cmxwdFswXSA9ICgocGhkciktPnJscHRbMF0gJiAweGYwKSB8ICgocmF0ZSkgJiAweGYpKQotLyogc2V0IHJlc2VydmVkIGZpZWxkIHRvIHplcm8gKi8KLSNkZWZpbmUJRDExQV9QSFlfSERSX1NSRVMocGhkcikJCSgocGhkciktPnJscHRbMF0gJj0gMHhlZikKLS8qIGxlbmd0aCBpcyBudW1iZXIgb2Ygb2N0ZXRzIGluIFBTRFUgKi8KLSNkZWZpbmUJRDExQV9QSFlfSERSX1NMRU5HVEgocGhkciwgbGVuZ3RoKQlcCi0JKCoodTMyICopKChwaGRyKS0+cmxwdCkgPSAqKHUzMiAqKSgocGhkciktPnJscHQpIHwgXAotCSgoKGxlbmd0aCkgJiAweDBmZmYpIDw8IDUpKQotLyogc2V0IHRoZSB0YWlsIHRvIGFsbCB6ZXJvcyAqLwotI2RlZmluZQlEMTFBX1BIWV9IRFJfU1RBSUwocGhkcikJKChwaGRyKS0+cmxwdFszXSAmPSAweDAzKQotCi0jZGVmaW5lCUQxMUFfUEhZX0hEUl9MRU5fTAkzCS8qIGxvdy1yYXRlIHBhcnQgb2YgUExDUCBoZWFkZXIgKi8KLSNkZWZpbmUJRDExQV9QSFlfSERSX0xFTl9SCTIJLyogaGlnaC1yYXRlIHBhcnQgb2YgUExDUCBoZWFkZXIgKi8KLQotI2RlZmluZQlEMTFBX1BIWV9UWF9ERUxBWQkoMikJLyogMi4xIHVzZWMgKi8KLQotI2RlZmluZQlEMTFBX1BIWV9IRFJfVElNRQkoNCkJLyogbG93LXJhdGUgcGFydCBvZiBQTENQIGhlYWRlciAqLwotI2RlZmluZQlEMTFBX1BIWV9QUkVfVElNRQkoMTYpCi0jZGVmaW5lCUQxMUFfUEhZX1BSRUhEUl9USU1FCShEMTFBX1BIWV9QUkVfVElNRSArIEQxMUFfUEhZX0hEUl9USU1FKQotCi0vKiA4MDIuMTFiIFBMQ1AgaGVhZGVyIGRlZiAqLwotc3RydWN0IGNja19waHlfaGRyIHsKLQl1OCBzaWduYWw7Ci0JdTggc2VydmljZTsKLQl1MTYgbGVuZ3RoOwotCXUxNiBjcmM7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lCUQxMUJfUEhZX0hEUl9MRU4JNgotCi0jZGVmaW5lCUQxMUJfUEhZX1RYX0RFTEFZCSgzKQkvKiAzLjQgdXNlYyAqLwotCi0jZGVmaW5lCUQxMUJfUEhZX0xIRFJfVElNRQkoRDExQl9QSFlfSERSX0xFTiA8PCAzKQotI2RlZmluZQlEMTFCX1BIWV9MUFJFX1RJTUUJKDE0NCkKLSNkZWZpbmUJRDExQl9QSFlfTFBSRUhEUl9USU1FCShEMTFCX1BIWV9MUFJFX1RJTUUgKyBEMTFCX1BIWV9MSERSX1RJTUUpCi0KLSNkZWZpbmUJRDExQl9QSFlfU0hEUl9USU1FCShEMTFCX1BIWV9MSERSX1RJTUUgPj4gMSkKLSNkZWZpbmUJRDExQl9QSFlfU1BSRV9USU1FCShEMTFCX1BIWV9MUFJFX1RJTUUgPj4gMSkKLSNkZWZpbmUJRDExQl9QSFlfU1BSRUhEUl9USU1FCShEMTFCX1BIWV9TUFJFX1RJTUUgKyBEMTFCX1BIWV9TSERSX1RJTUUpCi0KLSNkZWZpbmUJRDExQl9QTENQX1NJR05BTF9MT0NLRUQJKDEgPDwgMikKLSNkZWZpbmUJRDExQl9QTENQX1NJR05BTF9MRQkoMSA8PCA3KQotCi0jZGVmaW5lIE1JTU9fUExDUF9NQ1NfTUFTSwkweDdmCS8qIG1jcyBpbmRleCAqLwotI2RlZmluZSBNSU1PX1BMQ1BfNDBNSFoJCTB4ODAJLyogNDAgSHogZnJhbWUgKi8KLSNkZWZpbmUgTUlNT19QTENQX0FNUERVCQkweDA4CS8qIGFtcGR1ICovCi0KLSNkZWZpbmUgQlJDTVNfR0VUX0NDS19QTENQX0xFTihwbGNwKSAocGxjcFs0XSArIChwbGNwWzVdIDw8IDgpKQotI2RlZmluZSBCUkNNU19HRVRfTUlNT19QTENQX0xFTihwbGNwKSAocGxjcFsxXSArIChwbGNwWzJdIDw8IDgpKQotI2RlZmluZSBCUkNNU19TRVRfTUlNT19QTENQX0xFTihwbGNwLCBsZW4pIFwKLQlkbyB7IFwKLQkJcGxjcFsxXSA9IGxlbiAmIDB4ZmY7IFwKLQkJcGxjcFsyXSA9ICgobGVuID4+IDgpICYgMHhmZik7IFwKLQl9IHdoaWxlICgwKTsKLQotI2RlZmluZSBCUkNNU19TRVRfTUlNT19QTENQX0FNUERVKHBsY3ApIChwbGNwWzNdIHw9IE1JTU9fUExDUF9BTVBEVSkKLSNkZWZpbmUgQlJDTVNfQ0xSX01JTU9fUExDUF9BTVBEVShwbGNwKSAocGxjcFszXSAmPSB+TUlNT19QTENQX0FNUERVKQotI2RlZmluZSBCUkNNU19JU19NSU1PX1BMQ1BfQU1QRFUocGxjcCkgKHBsY3BbM10gJiBNSU1PX1BMQ1BfQU1QRFUpCi0KLS8qIFRoZSBkb3QxMWEgUExDUCBoZWFkZXIgaXMgNSBieXRlcy4gIFRvIHNpbXBsaWZ5IHRoZSBzb2Z0d2FyZSAoc28gdGhhdCB3ZQotICogZG9uJ3QgbmVlZCBlLmcuIGRpZmZlcmVudCB0eCBETUEgaGVhZGVycyBmb3IgMTFhIGFuZCAxMWIpLCB0aGUgUExDUCBoZWFkZXIgaGFzCi0gKiBwYWRkaW5nIGFkZGVkIGluIHRoZSB1Y29kZS4KLSAqLwotI2RlZmluZQlEMTFfUEhZX0hEUl9MRU4JNgotCi0vKiBUWCBETUEgYnVmZmVyIGhlYWRlciAqLwotc3RydWN0IGQxMXR4aCB7Ci0JdTE2IE1hY1R4Q29udHJvbExvdzsJLyogMHgwICovCi0JdTE2IE1hY1R4Q29udHJvbEhpZ2g7CS8qIDB4MSAqLwotCXUxNiBNYWNGcmFtZUNvbnRyb2w7CS8qIDB4MiAqLwotCXUxNiBUeEZlc1RpbWVOb3JtYWw7CS8qIDB4MyAqLwotCXUxNiBQaHlUeENvbnRyb2xXb3JkOwkvKiAweDQgKi8KLQl1MTYgUGh5VHhDb250cm9sV29yZF8xOwkvKiAweDUgKi8KLQl1MTYgUGh5VHhDb250cm9sV29yZF8xX0ZicjsJLyogMHg2ICovCi0JdTE2IFBoeVR4Q29udHJvbFdvcmRfMV9SdHM7CS8qIDB4NyAqLwotCXUxNiBQaHlUeENvbnRyb2xXb3JkXzFfRmJyUnRzOwkvKiAweDggKi8KLQl1MTYgTWFpblJhdGVzOwkvKiAweDkgKi8KLQl1MTYgWHRyYUZyYW1lVHlwZXM7CS8qIDB4YSAqLwotCXU4IElWWzE2XTsJCS8qIDB4MGIgLSAweDEyICovCi0JdTggVHhGcmFtZVJBWzZdOwkvKiAweDEzIC0gMHgxNSAqLwotCXUxNiBUeEZlc1RpbWVGYWxsYmFjazsJLyogMHgxNiAqLwotCXU4IFJUU1BMQ1BGYWxsYmFja1s2XTsJLyogMHgxNyAtIDB4MTkgKi8KLQl1MTYgUlRTRHVyRmFsbGJhY2s7CS8qIDB4MWEgKi8KLQl1OCBGcmFnUExDUEZhbGxiYWNrWzZdOwkvKiAweDFiIC0gMWQgKi8KLQl1MTYgRnJhZ0R1ckZhbGxiYWNrOwkvKiAweDFlICovCi0JdTE2IE1Nb2RlTGVuOwkvKiAweDFmICovCi0JdTE2IE1Nb2RlRmJyTGVuOwkvKiAweDIwICovCi0JdTE2IFRzdGFtcExvdzsJLyogMHgyMSAqLwotCXUxNiBUc3RhbXBIaWdoOwkvKiAweDIyICovCi0JdTE2IEFCSV9NaW1vQW50U2VsOwkvKiAweDIzICovCi0JdTE2IFByZWxvYWRTaXplOwkvKiAweDI0ICovCi0JdTE2IEFtcGR1U2VxQ3RsOwkvKiAweDI1ICovCi0JdTE2IFR4RnJhbWVJRDsJLyogMHgyNiAqLwotCXUxNiBUeFN0YXR1czsJLyogMHgyNyAqLwotCXUxNiBNYXhOTXBkdXM7CS8qIDB4MjggKi8KLQl1MTYgTWF4QUJ5dGVzX01SVDsJLyogMHgyOSAqLwotCXUxNiBNYXhBQnl0ZXNfRkJSOwkvKiAweDJhICovCi0JdTE2IE1pbk1CeXRlczsJLyogMHgyYiAqLwotCXU4IFJUU1BoeUhlYWRlcltEMTFfUEhZX0hEUl9MRU5dOwkvKiAweDJjIC0gMHgyZSAqLwotCXN0cnVjdCBpZWVlODAyMTFfcnRzIHJ0c19mcmFtZTsJLyogMHgyZiAtIDB4MzYgKi8KLQl1MTYgUEFEOwkJLyogMHgzNyAqLwotfSBfX3BhY2tlZDsKLQotI2RlZmluZQlEMTFfVFhIX0xFTgkJMTEyCS8qIGJ5dGVzICovCi0KLS8qIEZyYW1lIFR5cGVzICovCi0jZGVmaW5lIEZUX0NDSwkwCi0jZGVmaW5lIEZUX09GRE0JMQotI2RlZmluZSBGVF9IVAkyCi0jZGVmaW5lIEZUX04JMwotCi0vKiBQb3NpdGlvbiBvZiBNUERVIGluc2lkZSBBLU1QRFU7IGluZGljYXRlZCB3aXRoIGJpdHMgMTA6OSBvZiBNYWNUeENvbnRyb2xMb3cgKi8KLSNkZWZpbmUgVFhDX0FNUERVX1NISUZUCQk5CS8qIHNoaWZ0IGZvciBhbXBkdSBzZXR0aW5ncyAqLwotI2RlZmluZSBUWENfQU1QRFVfTk9ORQkJMAkvKiBSZWd1bGFyIE1QRFUsIG5vdCBhbiBBLU1QRFUgKi8KLSNkZWZpbmUgVFhDX0FNUERVX0ZJUlNUCQkxCS8qIGZpcnN0IE1QRFUgb2YgYW4gQS1NUERVICovCi0jZGVmaW5lIFRYQ19BTVBEVV9NSURETEUJMgkvKiBpbnRlcm1lZGlhdGUgTVBEVSBvZiBhbiBBLU1QRFUgKi8KLSNkZWZpbmUgVFhDX0FNUERVX0xBU1QJCTMJLyogbGFzdCAob3Igc2luZ2xlKSBNUERVIG9mIGFuIEEtTVBEVSAqLwotCi0vKiBNYWNUeENvbnRyb2xMb3cgKi8KLSNkZWZpbmUgVFhDX0FNSUMJCTB4ODAwMAotI2RlZmluZQlUWENfU0VORENUUwkJMHgwODAwCi0jZGVmaW5lIFRYQ19BTVBEVV9NQVNLCQkweDA2MDAKLSNkZWZpbmUgVFhDX0JXXzQwCQkweDAxMDAKLSNkZWZpbmUgVFhDX0ZSRVFCQU5EXzVHCQkweDAwODAKLSNkZWZpbmUJVFhDX0RGQ1MJCTB4MDA0MAotI2RlZmluZQlUWENfSUdOT1JFUE1RCQkweDAwMjAKLSNkZWZpbmUJVFhDX0hXU0VRCQkweDAwMTAKLSNkZWZpbmUJVFhDX1NUQVJUTVNEVQkJMHgwMDA4Ci0jZGVmaW5lCVRYQ19TRU5EUlRTCQkweDAwMDQKLSNkZWZpbmUJVFhDX0xPTkdGUkFNRQkJMHgwMDAyCi0jZGVmaW5lCVRYQ19JTU1FREFDSwkJMHgwMDAxCi0KLS8qIE1hY1R4Q29udHJvbEhpZ2ggKi8KLSNkZWZpbmUgVFhDX1BSRUFNQkxFX1JUU19GQl9TSE9SVAkweDgwMDAJLyogUlRTIGZhbGxiYWNrIHByZWFtYmxlIHR5cGUgMSA9IFNIT1JUIDAgPSBMT05HICovCi0jZGVmaW5lIFRYQ19QUkVBTUJMRV9SVFNfTUFJTl9TSE9SVAkweDQwMDAJLyogUlRTIG1haW4gcmF0ZSBwcmVhbWJsZSB0eXBlIDEgPSBTSE9SVCAwID0gTE9ORyAqLwotI2RlZmluZSBUWENfUFJFQU1CTEVfREFUQV9GQl9TSE9SVAkweDIwMDAJLyogTWFpbiBmYWxsYmFjayByYXRlIHByZWFtYmxlIHR5cGUKLQkJCQkJCSAqIDEgPSBTSE9SVCBmb3IgT0ZETS9HRiBmb3IgTUlNTwotCQkJCQkJICogMCA9IExPTkcgZm9yIENDSy9NTSBmb3IgTUlNTwotCQkJCQkJICovCi0vKiBUWENfUFJFQU1CTEVfREFUQV9NQUlOIGlzIGluIFBoeVR4Q29udHJvbCBiaXQgNSAqLwotI2RlZmluZQlUWENfQU1QRFVfRkJSCQkweDEwMDAJLyogdXNlIGZhbGxiYWNrIHJhdGUgZm9yIHRoaXMgQU1QRFUgKi8KLSNkZWZpbmUJVFhDX1NFQ0tFWV9NQVNLCQkweDBGRjAKLSNkZWZpbmUJVFhDX1NFQ0tFWV9TSElGVAk0Ci0jZGVmaW5lCVRYQ19BTFRfVFhQV1IJCTB4MDAwOAkvKiBVc2UgYWx0ZXJuYXRlIHR4cHdyIGRlZmluZWQgYXQgbG9jLiBNX0FMVF9UWFBXUl9JRFggKi8KLSNkZWZpbmUJVFhDX1NFQ1RZUEVfTUFTSwkweDAwMDcKLSNkZWZpbmUJVFhDX1NFQ1RZUEVfU0hJRlQJMAotCi0vKiBOdWxsIGRlbGltaXRlciBmb3IgRmFsbGJhY2sgcmF0ZSAqLwotI2RlZmluZSBBTVBEVV9GQlJfTlVMTF9ERUxJTSAgNQkvKiBMb2NhdGlvbiBvZiBOdWxsIGRlbGltaXRlciBjb3VudCBmb3IgQU1QRFUgKi8KLQotLyogUGh5VHhDb250cm9sIGZvciBNaW1vcGh5ICovCi0jZGVmaW5lCVBIWV9UWENfUFdSX01BU0sJMHhGQzAwCi0jZGVmaW5lCVBIWV9UWENfUFdSX1NISUZUCTEwCi0jZGVmaW5lCVBIWV9UWENfQU5UX01BU0sJMHgwM0MwCS8qIGJpdCA2LCA3LCA4LCA5ICovCi0jZGVmaW5lCVBIWV9UWENfQU5UX1NISUZUCTYKLSNkZWZpbmUJUEhZX1RYQ19BTlRfMF8xCQkweDAwQzAJLyogYXV0bywgbGFzdCByeCAqLwotI2RlZmluZQlQSFlfVFhDX0xDTlBIWV9BTlRfTEFTVAkweDAwMDAKLSNkZWZpbmUJUEhZX1RYQ19BTlRfMwkJMHgwMjAwCS8qIHZpcnR1YWwgYW50ZW5uYSAzICovCi0jZGVmaW5lCVBIWV9UWENfQU5UXzIJCTB4MDEwMAkvKiB2aXJ0dWFsIGFudGVubmEgMiAqLwotI2RlZmluZQlQSFlfVFhDX0FOVF8xCQkweDAwODAJLyogdmlydHVhbCBhbnRlbm5hIDEgKi8KLSNkZWZpbmUJUEhZX1RYQ19BTlRfMAkJMHgwMDQwCS8qIHZpcnR1YWwgYW50ZW5uYSAwICovCi0jZGVmaW5lCVBIWV9UWENfU0hPUlRfSERSCTB4MDAxMAotCi0jZGVmaW5lCVBIWV9UWENfT0xEX0FOVF8wCTB4MDAwMAotI2RlZmluZQlQSFlfVFhDX09MRF9BTlRfMQkweDAxMDAKLSNkZWZpbmUJUEhZX1RYQ19PTERfQU5UX0xBU1QJMHgwMzAwCi0KLS8qIFBoeVR4Q29udHJvbF8xIGZvciBNaW1vcGh5ICovCi0jZGVmaW5lIFBIWV9UWEMxX0JXX01BU0sJCTB4MDAwNwotI2RlZmluZSBQSFlfVFhDMV9CV18xME1IWgkJMAotI2RlZmluZSBQSFlfVFhDMV9CV18xME1IWl9VUAkJMQotI2RlZmluZSBQSFlfVFhDMV9CV18yME1IWgkJMgotI2RlZmluZSBQSFlfVFhDMV9CV18yME1IWl9VUAkJMwotI2RlZmluZSBQSFlfVFhDMV9CV180ME1IWgkJNAotI2RlZmluZSBQSFlfVFhDMV9CV180ME1IWl9EVVAJCTUKLSNkZWZpbmUgUEhZX1RYQzFfTU9ERV9TSElGVAkJMwotI2RlZmluZSBQSFlfVFhDMV9NT0RFX01BU0sJCTB4MDAzOAotI2RlZmluZSBQSFlfVFhDMV9NT0RFX1NJU08JCTAKLSNkZWZpbmUgUEhZX1RYQzFfTU9ERV9DREQJCTEKLSNkZWZpbmUgUEhZX1RYQzFfTU9ERV9TVEJDCQkyCi0jZGVmaW5lIFBIWV9UWEMxX01PREVfU0RNCQkzCi0KLS8qIFBoeVR4Q29udHJvbCBmb3IgSFRwaHkgdGhhdCBhcmUgZGlmZmVyZW50IGZyb20gTWltb3BoeSAqLwotI2RlZmluZQlQSFlfVFhDX0hUQU5UX01BU0sJCTB4M2ZDMAkvKiBiaXQgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMgKi8KLQotLyogWHRyYUZyYW1lVHlwZXMgKi8KLSNkZWZpbmUgWEZUU19SVFNfRlRfU0hJRlQJMgotI2RlZmluZSBYRlRTX0ZCUlJUU19GVF9TSElGVAk0Ci0jZGVmaW5lIFhGVFNfQ0hBTk5FTF9TSElGVAk4Ci0KLS8qIEFudGVubmEgZGl2ZXJzaXR5IGJpdCBpbiBhbnRfd3Jfc2V0dGxlICovCi0jZGVmaW5lCVBIWV9BV1NfQU5URElWCQkweDIwMDAKLQotLyogSUZTIGN0bCAqLwotI2RlZmluZSBJRlNfVVNFRURDRgkoMSA8PCAyKQotCi0vKiBJRlMgY3RsMSAqLwotI2RlZmluZSBJRlNfQ1RMMV9FRENSUwkoMSA8PCAzKQotI2RlZmluZSBJRlNfQ1RMMV9FRENSU18yMEwgKDEgPDwgNCkKLSNkZWZpbmUgSUZTX0NUTDFfRURDUlNfNDAgKDEgPDwgNSkKLQotLyogQUJJX01pbW9BbnRTZWwgKi8KLSNkZWZpbmUgQUJJX01BU19BRERSX0JNUF9JRFhfTUFTSwkweDBmMDAKLSNkZWZpbmUgQUJJX01BU19BRERSX0JNUF9JRFhfU0hJRlQJOAotI2RlZmluZSBBQklfTUFTX0ZCUl9BTlRfUFROX01BU0sJMHgwMGYwCi0jZGVmaW5lIEFCSV9NQVNfRkJSX0FOVF9QVE5fU0hJRlQJNAotI2RlZmluZSBBQklfTUFTX01SVF9BTlRfUFROX01BU0sJMHgwMDBmCi0KLS8qIHR4IHN0YXR1cyBwYWNrZXQgKi8KLXN0cnVjdCB0eF9zdGF0dXMgewotCXUxNiBmcmFtZWxlbjsKLQl1MTYgUEFEOwotCXUxNiBmcmFtZWlkOwotCXUxNiBzdGF0dXM7Ci0JdTE2IGxhc3R0eHRpbWU7Ci0JdTE2IHNlcXVlbmNlOwotCXUxNiBwaHllcnI7Ci0JdTE2IGFja3BoeXJ4c2g7Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lCVRYU1RBVFVTX0xFTgkxNgotCi0vKiBzdGF0dXMgZmllbGQgYml0IGRlZmluaXRpb25zICovCi0jZGVmaW5lCVRYX1NUQVRVU19GUk1fUlRYX01BU0sJMHhGMDAwCi0jZGVmaW5lCVRYX1NUQVRVU19GUk1fUlRYX1NISUZUCTEyCi0jZGVmaW5lCVRYX1NUQVRVU19SVFNfUlRYX01BU0sJMHgwRjAwCi0jZGVmaW5lCVRYX1NUQVRVU19SVFNfUlRYX1NISUZUCTgKLSNkZWZpbmUgVFhfU1RBVFVTX01BU0sJCTB4MDBGRQotI2RlZmluZQlUWF9TVEFUVVNfUE1JTkRDVEQJKDEgPDwgNykJLyogUE0gbW9kZSBpbmRpY2F0ZWQgdG8gQVAgKi8KLSNkZWZpbmUJVFhfU1RBVFVTX0lOVEVSTUVESUFURQkoMSA8PCA2KQkvKiBpbnRlcm1lZGlhdGUgb3IgMXN0IGFtcGR1IHBrZyAqLwotI2RlZmluZQlUWF9TVEFUVVNfQU1QRFUJCSgxIDw8IDUpCS8qIEFNUERVIHN0YXR1cyAqLwotI2RlZmluZSBUWF9TVEFUVVNfU1VQUl9NQVNLCTB4MUMJLyogc3VwcHJlc3Mgc3RhdHVzIGJpdHMgKDQ6MikgKi8KLSNkZWZpbmUgVFhfU1RBVFVTX1NVUFJfU0hJRlQJMgotI2RlZmluZQlUWF9TVEFUVVNfQUNLX1JDVgkoMSA8PCAxKQkvKiBBQ0sgcmVjZWl2ZWQgKi8KLSNkZWZpbmUJVFhfU1RBVFVTX1ZBTElECQkoMSA8PCAwKQkvKiBUeCBzdGF0dXMgdmFsaWQgKi8KLSNkZWZpbmUJVFhfU1RBVFVTX05PX0FDSwkwCi0KLS8qIHN1cHByZXNzIHN0YXR1cyByZWFzb24gY29kZXMgKi8KLSNkZWZpbmUJVFhfU1RBVFVTX1NVUFJfUE1RCSgxIDw8IDIpCS8qIFBNUSBlbnRyeSAqLwotI2RlZmluZQlUWF9TVEFUVVNfU1VQUl9GTFVTSAkoMiA8PCAyKQkvKiBmbHVzaCByZXF1ZXN0ICovCi0jZGVmaW5lCVRYX1NUQVRVU19TVVBSX0ZSQUcJKDMgPDwgMikJLyogcHJldmlvdXMgZnJhZyBmYWlsdXJlICovCi0jZGVmaW5lCVRYX1NUQVRVU19TVVBSX1RCVFQJKDMgPDwgMikJLyogU0hBUkVEOiBQcm9iZSByZXNwb25zZSBzdXByIGZvciBUQlRUICovCi0jZGVmaW5lCVRYX1NUQVRVU19TVVBSX0JBRENICSg0IDw8IDIpCS8qIGNoYW5uZWwgbWlzbWF0Y2ggKi8KLSNkZWZpbmUJVFhfU1RBVFVTX1NVUFJfRVhQVElNRQkoNSA8PCAyKQkvKiBsaWZldGltZSBleHBpcnkgKi8KLSNkZWZpbmUJVFhfU1RBVFVTX1NVUFJfVUYJKDYgPDwgMikJLyogdW5kZXJmbG93ICovCi0KLS8qIFVuZXhwZWN0ZWQgdHggc3RhdHVzIGZvciByYXRlIHVwZGF0ZSAqLwotI2RlZmluZSBUWF9TVEFUVVNfVU5FWFAoc3RhdHVzKSBcCi0JKCgoKHN0YXR1cykgJiBUWF9TVEFUVVNfSU5URVJNRURJQVRFKSAhPSAwKSAmJiBcCi0JIFRYX1NUQVRVU19VTkVYUF9BTVBEVShzdGF0dXMpKQotCi0vKiBVbmV4cGVjdGVkIHR4IHN0YXR1cyBmb3IgQS1NUERVIHJhdGUgdXBkYXRlICovCi0jZGVmaW5lIFRYX1NUQVRVU19VTkVYUF9BTVBEVShzdGF0dXMpIFwKLQkoKCgoc3RhdHVzKSAmIFRYX1NUQVRVU19TVVBSX01BU0spICE9IDApICYmIFwKLQkgKCgoc3RhdHVzKSAmIFRYX1NUQVRVU19TVVBSX01BU0spICE9IFRYX1NUQVRVU19TVVBSX0VYUFRJTUUpKQotCi0jZGVmaW5lIFRYX1NUQVRVU19CQV9CTUFQMDNfTUFTSwkweEYwMDAJLyogYmEgYml0bWFwIDA6MyBpbiAxc3QgcGtnICovCi0jZGVmaW5lIFRYX1NUQVRVU19CQV9CTUFQMDNfU0hJRlQJMTIJLyogYmEgYml0bWFwIDA6MyBpbiAxc3QgcGtnICovCi0jZGVmaW5lIFRYX1NUQVRVU19CQV9CTUFQNDdfTUFTSwkweDAwMUUJLyogYmEgYml0bWFwIDQ6NyBpbiAybmQgcGtnICovCi0jZGVmaW5lIFRYX1NUQVRVU19CQV9CTUFQNDdfU0hJRlQJMwkvKiBiYSBiaXRtYXAgNDo3IGluIDJuZCBwa2cgKi8KLQotLyogUlhFIChSZWNlaXZlIEVuZ2luZSkgKi8KLQotLyogUkNNX0NUTCAqLwotI2RlZmluZQlSQ01fSU5DX01BU0tfSAkJMHgwMDgwCi0jZGVmaW5lCVJDTV9JTkNfTUFTS19MCQkweDAwNDAKLSNkZWZpbmUJUkNNX0lOQ19EQVRBCQkweDAwMjAKLSNkZWZpbmUJUkNNX0lOREVYX01BU0sJCTB4MDAxRgotI2RlZmluZQlSQ01fU0laRQkJMTUKLQotI2RlZmluZQlSQ01fTUFDX09GRlNFVAkJMAkvKiBjdXJyZW50IE1BQyBhZGRyZXNzICovCi0jZGVmaW5lCVJDTV9CU1NJRF9PRkZTRVQJMwkvKiBjdXJyZW50IEJTU0lEIGFkZHJlc3MgKi8KLSNkZWZpbmUJUkNNX0ZfQlNTSURfMF9PRkZTRVQJNgkvKiBmb3JlaWduIEJTUyBDRlAgdHJhY2tpbmcgKi8KLSNkZWZpbmUJUkNNX0ZfQlNTSURfMV9PRkZTRVQJOQkvKiBmb3JlaWduIEJTUyBDRlAgdHJhY2tpbmcgKi8KLSNkZWZpbmUJUkNNX0ZfQlNTSURfMl9PRkZTRVQJMTIJLyogZm9yZWlnbiBCU1MgQ0ZQIHRyYWNraW5nICovCi0KLSNkZWZpbmUgUkNNX1dFUF9UQTBfT0ZGU0VUCTE2Ci0jZGVmaW5lIFJDTV9XRVBfVEExX09GRlNFVAkxOQotI2RlZmluZSBSQ01fV0VQX1RBMl9PRkZTRVQJMjIKLSNkZWZpbmUgUkNNX1dFUF9UQTNfT0ZGU0VUCTI1Ci0KLS8qIFBTTSBCbG9jayAqLwotCi0vKiBwc21fcGh5X2hkcl9wYXJhbSBiaXRzICovCi0jZGVmaW5lIE1BQ19QSFlfUkVTRVQJCTEKLSNkZWZpbmUgTUFDX1BIWV9DTE9DS19FTgkyCi0jZGVmaW5lIE1BQ19QSFlfRk9SQ0VfQ0xLCTQKLQotLyogV0VQIEJsb2NrICovCi0KLS8qIFdFUF9XS0VZICovCi0jZGVmaW5lCVdLRVlfU1RBUlQJCSgxIDw8IDgpCi0jZGVmaW5lCVdLRVlfU0VMX01BU0sJCTB4MUYKLQotLyogV0VQIGRhdGEgZm9ybWF0cyAqLwotCi0vKiB0aGUgbnVtYmVyIG9mIFJDTVRBIGVudHJpZXMgKi8KLSNkZWZpbmUgUkNNVEFfU0laRSA1MAotCi0jZGVmaW5lIE1fQUREUl9CTVBfQkxLCQkoMHgzN2UgKiAyKQotI2RlZmluZSBNX0FERFJfQk1QX0JMS19TWgkxMgotCi0jZGVmaW5lIEFERFJfQk1QX1JBCQkoMSA8PCAwKQkvKiBSZWNlaXZlciBBZGRyZXNzIChSQSkgKi8KLSNkZWZpbmUgQUREUl9CTVBfVEEJCSgxIDw8IDEpCS8qIFRyYW5zbWl0dGVyIEFkZHJlc3MgKFRBKSAqLwotI2RlZmluZSBBRERSX0JNUF9CU1NJRAkJKDEgPDwgMikJLyogQlNTSUQgKi8KLSNkZWZpbmUgQUREUl9CTVBfQVAJCSgxIDw8IDMpCS8qIEluZnJhLUJTUyBBY2Nlc3MgUG9pbnQgKEFQKSAqLwotI2RlZmluZSBBRERSX0JNUF9TVEEJCSgxIDw8IDQpCS8qIEluZnJhLUJTUyBTdGF0aW9uIChTVEEpICovCi0jZGVmaW5lIEFERFJfQk1QX1JFU0VSVkVEMQkoMSA8PCA1KQotI2RlZmluZSBBRERSX0JNUF9SRVNFUlZFRDIJKDEgPDwgNikKLSNkZWZpbmUgQUREUl9CTVBfUkVTRVJWRUQzCSgxIDw8IDcpCi0jZGVmaW5lIEFERFJfQk1QX0JTU19JRFhfTUFTSwkoMyA8PCA4KQkvKiBCU1MgY29udHJvbCBibG9jayBpbmRleCAqLwotI2RlZmluZSBBRERSX0JNUF9CU1NfSURYX1NISUZUCTgKLQotI2RlZmluZQlXU0VDX01BWF9SQ01UQV9LRVlTCTU0Ci0KLS8qIG1heCBrZXlzIGluIE1fVEtNSUNLRVlTX0JMSyAqLwotI2RlZmluZQlXU0VDX01BWF9US01JQ19FTkdJTkVfS0VZUwkJMTIJLyogOCArIDQgZGVmYXVsdCAqLwotCi0vKiBtYXggUlhFIG1hdGNoIHJlZ2lzdGVycyAqLwotI2RlZmluZSBXU0VDX01BWF9SWEVfS0VZUwk0Ci0KLS8qIFNFQ0tJTkRYQUxHTyAoU2VjdXJpdHkgS2V5IEluZGV4ICYgQWxnb3JpdGhtIEJsb2NrKSB3b3JkIGZvcm1hdCAqLwotLyogU0tMIChTZWN1cml0eSBLZXkgTG9va3VwKSAqLwotI2RlZmluZQlTS0xfQUxHT19NQVNLCQkweDAwMDcKLSNkZWZpbmUJU0tMX0FMR09fU0hJRlQJCTAKLSNkZWZpbmUJU0tMX0tFWUlEX01BU0sJCTB4MDAwOAotI2RlZmluZQlTS0xfS0VZSURfU0hJRlQJCTMKLSNkZWZpbmUJU0tMX0lOREVYX01BU0sJCTB4MDNGMAotI2RlZmluZQlTS0xfSU5ERVhfU0hJRlQJCTQKLSNkZWZpbmUJU0tMX0dSUF9BTEdPX01BU0sJMHgxYzAwCi0jZGVmaW5lCVNLTF9HUlBfQUxHT19TSElGVAkxMAotCi0vKiBhZGRpdGlvbmFsIGJpdHMgZGVmaW5lZCBmb3IgSUJTUyBncm91cCBrZXkgc3VwcG9ydCAqLwotI2RlZmluZQlTS0xfSUJTU19JTkRFWF9NQVNLCTB4MDFGMAotI2RlZmluZQlTS0xfSUJTU19JTkRFWF9TSElGVAk0Ci0jZGVmaW5lCVNLTF9JQlNTX0tFWUlEMV9NQVNLCTB4MDYwMAotI2RlZmluZQlTS0xfSUJTU19LRVlJRDFfU0hJRlQJOQotI2RlZmluZQlTS0xfSUJTU19LRVlJRDJfTUFTSwkweDE4MDAKLSNkZWZpbmUJU0tMX0lCU1NfS0VZSUQyX1NISUZUCTExCi0jZGVmaW5lCVNLTF9JQlNTX0tFWUFMR09fTUFTSwkweEUwMDAKLSNkZWZpbmUJU0tMX0lCU1NfS0VZQUxHT19TSElGVAkxMwotCi0jZGVmaW5lCVdTRUNfTU9ERV9PRkYJCTAKLSNkZWZpbmUJV1NFQ19NT0RFX0hXCQkxCi0jZGVmaW5lCVdTRUNfTU9ERV9TVwkJMgotCi0jZGVmaW5lCVdTRUNfQUxHT19PRkYJCTAKLSNkZWZpbmUJV1NFQ19BTEdPX1dFUDEJCTEKLSNkZWZpbmUJV1NFQ19BTEdPX1RLSVAJCTIKLSNkZWZpbmUJV1NFQ19BTEdPX0FFUwkJMwotI2RlZmluZQlXU0VDX0FMR09fV0VQMTI4CTQKLSNkZWZpbmUJV1NFQ19BTEdPX0FFU19MRUdBQ1kJNQotI2RlZmluZQlXU0VDX0FMR09fTkFMRwkJNgotCi0jZGVmaW5lCUFFU19NT0RFX05PTkUJCTAKLSNkZWZpbmUJQUVTX01PREVfQ0NNCQkxCi0KLS8qIFdFUF9DVEwgKFJldiAwKSAqLwotI2RlZmluZQlXRUNSMF9LRVlSRUdfU0hJRlQJMAotI2RlZmluZQlXRUNSMF9LRVlSRUdfTUFTSwkweDcKLSNkZWZpbmUJV0VDUjBfREVDUllQVAkJKDEgPDwgMykKLSNkZWZpbmUJV0VDUjBfSVZJTkxJTkUJCSgxIDw8IDQpCi0jZGVmaW5lCVdFQ1IwX1dFUEFMR19TSElGVAk1Ci0jZGVmaW5lCVdFQ1IwX1dFUEFMR19NQVNLCSgweDcgPDwgNSkKLSNkZWZpbmUJV0VDUjBfV0tFWVNFTF9TSElGVAk4Ci0jZGVmaW5lCVdFQ1IwX1dLRVlTRUxfTUFTSwkoMHg3IDw8IDgpCi0jZGVmaW5lCVdFQ1IwX1dLRVlTVEFSVAkJKDEgPDwgMTEpCi0jZGVmaW5lCVdFQ1IwX1dFUElOSVQJCSgxIDw8IDE0KQotI2RlZmluZQlXRUNSMF9JQ1ZFUlIJCSgxIDw8IDE1KQotCi0vKiBGcmFtZSB0ZW1wbGF0ZSBtYXAgYnl0ZSBvZmZzZXRzICovCi0jZGVmaW5lCVRfQUNUU19UUExfQkFTRQkJKDApCi0jZGVmaW5lCVRfTlVMTF9UUExfQkFTRQkJKDB4YyAqIDIpCi0jZGVmaW5lCVRfUU5VTExfVFBMX0JBU0UJKDB4MWMgKiAyKQotI2RlZmluZQlUX1JSX1RQTF9CQVNFCQkoMHgyYyAqIDIpCi0jZGVmaW5lCVRfQkNOMF9UUExfQkFTRQkJKDB4MzQgKiAyKQotI2RlZmluZQlUX1BSU19UUExfQkFTRQkJKDB4MTM0ICogMikKLSNkZWZpbmUJVF9CQ04xX1RQTF9CQVNFCQkoMHgyMzQgKiAyKQotI2RlZmluZSBUX1RYX0ZJRk9fVFhSQU1fQkFTRQkoVF9BQ1RTX1RQTF9CQVNFICsgKFRYRklGT19TVEFSVF9CTEsgKiBUWEZJRk9fU0laRV9VTklUKSkKLQotI2RlZmluZSBUX0JBX1RQTF9CQVNFCQlUX1FOVUxMX1RQTF9CQVNFCS8qIHRlbXBsYXRlIGFyZWEgZm9yIEJBICovCi0KLSNkZWZpbmUgVF9SQU1fQUNDRVNTX1NaCQk0CS8qIHRlbXBsYXRlIHJhbSBpcyA0IGJ5dGUgYWNjZXNzIG9ubHkgKi8KLQotLyogU2hhcmVkIE1lbSBieXRlIG9mZnNldHMgKi8KLQotLyogTG9jYXRpb24gd2hlcmUgdGhlIHVjb2RlIGV4cGVjdHMgdGhlIGNvcmVyZXYgKi8KLSNkZWZpbmUJTV9NQUNIV19WRVIJCSgweDAwYiAqIDIpCi0KLS8qIExvY2F0aW9uIHdoZXJlIHRoZSB1Y29kZSBleHBlY3RzIHRoZSBNQUMgY2FwYWJpbGl0aWVzICovCi0jZGVmaW5lCU1fTUFDSFdfQ0FQX0wJCSgweDA2MCAqIDIpCi0jZGVmaW5lCU1fTUFDSFdfQ0FQX0gJKDB4MDYxICogMikKLQotLyogV01FIHNoYXJlZCBtZW1vcnkgKi8KLSNkZWZpbmUgTV9FRENGX1NUQVRVU19PRkYJKDB4MDA3ICogMikKLSNkZWZpbmUgTV9UWEZfQ1VSX0lOREVYCQkoMHgwMTggKiAyKQotI2RlZmluZSBNX0VEQ0ZfUUlORk8JCSgweDEyMCAqIDIpCi0KLS8qIFBTLW1vZGUgcmVsYXRlZCBwYXJhbWV0ZXJzICovCi0jZGVmaW5lCU1fRE9UMTFfU0xPVAkJKDB4MDA4ICogMikKLSNkZWZpbmUJTV9ET1QxMV9EVElNUEVSSU9ECSgweDAwOSAqIDIpCi0jZGVmaW5lCU1fTk9TTFBaTkFURFRJTQkJKDB4MDI2ICogMikKLQotLyogQmVhY29uLXJlbGF0ZWQgcGFyYW1ldGVycyAqLwotI2RlZmluZQlNX0JDTjBfRlJNX0JZVEVTWgkoMHgwMGMgKiAyKQkvKiBCY24gMCB0ZW1wbGF0ZSBsZW5ndGggKi8KLSNkZWZpbmUJTV9CQ04xX0ZSTV9CWVRFU1oJKDB4MDBkICogMikJLyogQmNuIDEgdGVtcGxhdGUgbGVuZ3RoICovCi0jZGVmaW5lCU1fQkNOX1RYVFNGX09GRlNFVAkoMHgwMGUgKiAyKQotI2RlZmluZQlNX1RJTUJQT1NfSU5CRUFDT04JKDB4MDBmICogMikKLSNkZWZpbmUJTV9TRlJNVFhDTlRGQlJUSFNECSgweDAyMiAqIDIpCi0jZGVmaW5lCU1fTEZSTVRYQ05URkJSVEhTRAkoMHgwMjMgKiAyKQotI2RlZmluZQlNX0JDTl9QQ1RMV0QJCSgweDAyYSAqIDIpCi0jZGVmaW5lIE1fQkNOX0xJCQkoMHgwNWIgKiAyKQkvKiBiZWFjb24gbGlzdGVuIGludGVydmFsICovCi0KLS8qIE1BWCBSeCBGcmFtZSBsZW4gKi8KLSNkZWZpbmUgTV9NQVhSWEZSTV9MRU4JCSgweDAxMCAqIDIpCi0KLS8qIEFDSy9DVFMgcmVsYXRlZCBwYXJhbXMgKi8KLSNkZWZpbmUJTV9SU1BfUENUTFdECQkoMHgwMTEgKiAyKQotCi0vKiBIYXJkd2FyZSBQb3dlciBDb250cm9sICovCi0jZGVmaW5lIE1fVFhQV1JfTgkJKDB4MDEyICogMikKLSNkZWZpbmUgTV9UWFBXUl9UQVJHRVQJCSgweDAxMyAqIDIpCi0jZGVmaW5lIE1fVFhQV1JfTUFYCQkoMHgwMTQgKiAyKQotI2RlZmluZSBNX1RYUFdSX0NVUgkJKDB4MDE5ICogMikKLQotLyogUngtcmVsYXRlZCBwYXJhbWV0ZXJzICovCi0jZGVmaW5lCU1fUlhfUEFEX0RBVEFfT0ZGU0VUCSgweDAxYSAqIDIpCi0KLS8qIFdFUCBTaGFyZWQgbWVtIGRhdGEgKi8KLSNkZWZpbmUJTV9TRUNfREVGSVZMT0MJCSgweDAxZSAqIDIpCi0jZGVmaW5lCU1fU0VDX1ZBTE5VTVNPRlRNQ0hUQQkoMHgwMWYgKiAyKQotI2RlZmluZQlNX1BIWVZFUgkJKDB4MDI4ICogMikKLSNkZWZpbmUJTV9QSFlUWVBFCQkoMHgwMjkgKiAyKQotI2RlZmluZQlNX1NFQ1JYS0VZU19QVFIJCSgweDAyYiAqIDIpCi0jZGVmaW5lCU1fVEtNSUNLRVlTX1BUUgkJKDB4MDU5ICogMikKLSNkZWZpbmUJTV9TRUNLSU5EWEFMR09fQkxLCSgweDJlYSAqIDIpCi0jZGVmaW5lIE1fU0VDS0lORFhBTEdPX0JMS19TWgk1NAotI2RlZmluZQlNX1NFQ1BTTVJYVEFNQ0hfQkxLCSgweDJmYSAqIDIpCi0jZGVmaW5lCU1fVEtJUF9UU0NfVFRBSwkJKDB4MThjICogMikKLSNkZWZpbmUJRDExX01BWF9LRVlfU0laRQkxNgotCi0jZGVmaW5lCU1fTUFYX0FOVENOVAkJKDB4MDJlICogMikJLyogYW50ZW5uYSBzd2FwIHRocmVzaG9sZCAqLwotCi0vKiBQcm9iZSByZXNwb25zZSByZWxhdGVkIHBhcmFtZXRlcnMgKi8KLSNkZWZpbmUJTV9TU0lETEVOCQkoMHgwMjQgKiAyKQotI2RlZmluZQlNX1BSQl9SRVNQX0ZSTV9MRU4JKDB4MDI1ICogMikKLSNkZWZpbmUJTV9QUlNfTUFYVElNRQkJKDB4MDNhICogMikKLSNkZWZpbmUJTV9TU0lECQkJKDB4YjAgKiAyKQotI2RlZmluZQlNX0NUWFBSU19CTEsJCSgweGMwICogMikKLSNkZWZpbmUJQ19DVFhfUENUTFdEX1BPUwkoMHg0ICogMikKLQotLyogRGVsdGEgYmV0d2VlbiBPRkRNIGFuZCBDQ0sgcG93ZXIgaW4gQ0NLIHBvd2VyIGJvb3N0IG1vZGUgKi8KLSNkZWZpbmUgTV9PRkRNX09GRlNFVAkJKDB4MDI3ICogMikKLQotLyogVFNTSSBmb3IgbGFzdCA0IDExYi9nIENDSyBwYWNrZXRzIHRyYW5zbWl0dGVkICovCi0jZGVmaW5lCU1fQl9UU1NJXzAJCSgweDAyYyAqIDIpCi0jZGVmaW5lCU1fQl9UU1NJXzEJCSgweDAyZCAqIDIpCi0KLS8qIEhvc3QgZmxhZ3MgdG8gdHVybiBvbiB1Y29kZSBvcHRpb25zICovCi0jZGVmaW5lCU1fSE9TVF9GTEFHUzEJCSgweDAyZiAqIDIpCi0jZGVmaW5lCU1fSE9TVF9GTEFHUzIJCSgweDAzMCAqIDIpCi0jZGVmaW5lCU1fSE9TVF9GTEFHUzMJCSgweDAzMSAqIDIpCi0jZGVmaW5lCU1fSE9TVF9GTEFHUzQJCSgweDAzYyAqIDIpCi0jZGVmaW5lCU1fSE9TVF9GTEFHUzUJCSgweDA2YSAqIDIpCi0jZGVmaW5lCU1fSE9TVF9GTEFHU19TWgkJMTYKLQotI2RlZmluZSBNX1JBREFSX1JFRwkJKDB4MDMzICogMikKLQotLyogVFNTSSBmb3IgbGFzdCA0IDExYSBPRkRNIHBhY2tldHMgdHJhbnNtaXR0ZWQgKi8KLSNkZWZpbmUJTV9BX1RTU0lfMAkJKDB4MDM0ICogMikKLSNkZWZpbmUJTV9BX1RTU0lfMQkJKDB4MDM1ICogMikKLQotLyogbm9pc2UgaW50ZXJmZXJlbmNlIG1lYXN1cmVtZW50ICovCi0jZGVmaW5lIE1fTk9JU0VfSUZfQ09VTlQJKDB4MDM0ICogMikKLSNkZWZpbmUgTV9OT0lTRV9JRl9USU1FT1VUCSgweDAzNSAqIDIpCi0KLSNkZWZpbmUJTV9SRl9SWF9TUF9SRUcxCQkoMHgwMzYgKiAyKQotCi0vKiBUU1NJIGZvciBsYXN0IDQgMTFnIE9GRE0gcGFja2V0cyB0cmFuc21pdHRlZCAqLwotI2RlZmluZQlNX0dfVFNTSV8wCQkoMHgwMzggKiAyKQotI2RlZmluZQlNX0dfVFNTSV8xCQkoMHgwMzkgKiAyKQotCi0vKiBCYWNrZ3JvdW5kIG5vaXNlIG1lYXN1cmUgKi8KLSNkZWZpbmUJTV9KU1NJXzAJCSgweDQ0ICogMikKLSNkZWZpbmUJTV9KU1NJXzEJCSgweDQ1ICogMikKLSNkZWZpbmUJTV9KU1NJX0FVWAkJKDB4NDYgKiAyKQotCi0jZGVmaW5lCU1fQ1VSXzIwNTBfUkFESU9DT0RFCSgweDQ3ICogMikKLQotLyogVFggZmlmbyBzaXplcyAqLwotI2RlZmluZSBNX0ZJRk9TSVpFMAkJKDB4NGMgKiAyKQotI2RlZmluZSBNX0ZJRk9TSVpFMQkJKDB4NGQgKiAyKQotI2RlZmluZSBNX0ZJRk9TSVpFMgkJKDB4NGUgKiAyKQotI2RlZmluZSBNX0ZJRk9TSVpFMwkJKDB4NGYgKiAyKQotI2RlZmluZSBEMTFfTUFYX1RYX0ZSTVMJCTMyCS8qIG1heCBmcmFtZXMgYWxsb3dlZCBpbiB0eCBmaWZvICovCi0KLS8qIEN1cnJlbnQgY2hhbm5lbCBudW1iZXIgcGx1cyB1cHBlciBiaXRzICovCi0jZGVmaW5lIE1fQ1VSQ0hBTk5FTAkJKDB4NTAgKiAyKQotI2RlZmluZSBEMTFfQ1VSQ0hBTk5FTF81RwkweDAxMDA7Ci0jZGVmaW5lIEQxMV9DVVJDSEFOTkVMXzQwCTB4MDIwMDsKLSNkZWZpbmUgRDExX0NVUkNIQU5ORUxfTUFYCTB4MDBGRjsKLQotLyogbGFzdCBwb3N0ZWQgZnJhbWVpZCBvbiB0aGUgYmNtYyBmaWZvICovCi0jZGVmaW5lIE1fQkNNQ19GSUQJCSgweDU0ICogMikKLSNkZWZpbmUgSU5WQUxJREZJRAkJMHhmZmZmCi0KLS8qIGV4dGVuZGVkIGJlYWNvbiBwaHljdGwgYnl0ZXMgZm9yIDExTiAqLwotI2RlZmluZQlNX0JDTl9QQ1RMMVdECQkoMHgwNTggKiAyKQotCi0vKiBpZGxlIGJ1c3kgcmF0aW8gdG8gZHV0eV9jeWNsZSByZXF1aXJlbWVudCAgKi8KLSNkZWZpbmUgTV9UWF9JRExFX0JVU1lfUkFUSU9fWF8xNl9DQ0sgICgweDUyICogMikKLSNkZWZpbmUgTV9UWF9JRExFX0JVU1lfUkFUSU9fWF8xNl9PRkRNICgweDVBICogMikKLQotLyogQ1cgUlNTSSBmb3IgTENOUEhZICovCi0jZGVmaW5lIE1fTENOX1JTU0lfMAkJMHgxMzMyCi0jZGVmaW5lIE1fTENOX1JTU0lfMQkJMHgxMzM4Ci0jZGVmaW5lIE1fTENOX1JTU0lfMgkJMHgxMzNlCi0jZGVmaW5lIE1fTENOX1JTU0lfMwkJMHgxMzQ0Ci0KLS8qIFNOUiBmb3IgTENOUEhZICovCi0jZGVmaW5lIE1fTENOX1NOUl9BXzAJMHgxMzM0Ci0jZGVmaW5lIE1fTENOX1NOUl9CXzAJMHgxMzM2Ci0KLSNkZWZpbmUgTV9MQ05fU05SX0FfMQkweDEzM2EKLSNkZWZpbmUgTV9MQ05fU05SX0JfMQkweDEzM2MKLQotI2RlZmluZSBNX0xDTl9TTlJfQV8yCTB4MTM0MAotI2RlZmluZSBNX0xDTl9TTlJfQl8yCTB4MTM0MgotCi0jZGVmaW5lIE1fTENOX1NOUl9BXzMJMHgxMzQ2Ci0jZGVmaW5lIE1fTENOX1NOUl9CXzMJMHgxMzQ4Ci0KLSNkZWZpbmUgTV9MQ05fTEFTVF9SRVNFVAkoODEqMikKLSNkZWZpbmUgTV9MQ05fTEFTVF9MT0MJKDYzKjIpCi0jZGVmaW5lIE1fTENOUEhZX1JFU0VUX1NUQVRVUyAoNDkwMikKLSNkZWZpbmUgTV9MQ05QSFlfRFNDX1RJTUUJKDB4OThkKjIpCi0jZGVmaW5lIE1fTENOUEhZX1JFU0VUX0NOVF9EU0MgKDB4OThiKjIpCi0jZGVmaW5lIE1fTENOUEhZX1JFU0VUX0NOVAkoMHg5OGMqMikKLQotLyogUmF0ZSB0YWJsZSBvZmZzZXRzICovCi0jZGVmaW5lCU1fUlRfRElSTUFQX0EJCSgweGUwICogMikKLSNkZWZpbmUJTV9SVF9CQlJTTUFQX0EJCSgweGYwICogMikKLSNkZWZpbmUJTV9SVF9ESVJNQVBfQgkJKDB4MTAwICogMikKLSNkZWZpbmUJTV9SVF9CQlJTTUFQX0IJCSgweDExMCAqIDIpCi0KLS8qIFJhdGUgdGFibGUgZW50cnkgb2Zmc2V0cyAqLwotI2RlZmluZQlNX1JUX1BSU19QTENQX1BPUwkxMAotI2RlZmluZQlNX1JUX1BSU19EVVJfUE9TCTE2Ci0jZGVmaW5lCU1fUlRfT0ZETV9QQ1RMMV9QT1MJMTgKLQotI2RlZmluZSBNXzIwSU40MF9JUQkJCSgweDM4MCAqIDIpCi0KLS8qIFNITSBsb2NhdGlvbnMgd2hlcmUgdWNvZGUgc3RvcmVzIHRoZSBjdXJyZW50IHBvd2VyIGluZGV4ICovCi0jZGVmaW5lIE1fQ1VSUl9JRFgxCQkoMHgzODQgKiAyKQotI2RlZmluZSBNX0NVUlJfSURYMgkJKDB4Mzg3ICogMikKLQotI2RlZmluZSBNX0JTQ0FMRV9BTlQwCSgweDVlICogMikKLSNkZWZpbmUgTV9CU0NBTEVfQU5UMQkoMHg1ZiAqIDIpCi0KLS8qIEFudGVubmEgRGl2ZXJzaXR5IFRlc3RpbmcgKi8KLSNkZWZpbmUgTV9NSU1PX0FOVFNFTF9SWERGTFQJKDB4NjMgKiAyKQotI2RlZmluZSBNX0FOVFNFTF9DTEtESVYJKDB4NjEgKiAyKQotI2RlZmluZSBNX01JTU9fQU5UU0VMX1RYREZMVAkoMHg2NCAqIDIpCi0KLSNkZWZpbmUgTV9NSU1PX01BWFNZTQkoMHg1ZCAqIDIpCi0jZGVmaW5lIE1JTU9fTUFYU1lNX0RFRgkJMHg4MDAwCS8qIDMyayAqLwotI2RlZmluZSBNSU1PX01BWFNZTV9NQVgJCTB4ZmZmZgkvKiA2NGsgKi8KLQotI2RlZmluZSBNX1dBVENIRE9HXzhUVQkJKDB4MWUgKiAyKQotI2RlZmluZSBXQVRDSERPR184VFVfREVGCTUKLSNkZWZpbmUgV0FUQ0hET0dfOFRVX01BWAkxMAotCi0vKiBNYW51ZmFjdHVyaW5nIFRlc3QgVmFyaWFibGVzICovCi0jZGVmaW5lIE1fUEtURU5HX0NUUkwJCSgweDZjICogMikJLyogUEVSIHRlc3QgbW9kZSAqLwotI2RlZmluZSBNX1BLVEVOR19JRlMJCSgweDZkICogMikJLyogSUZTIGZvciBUWCBtb2RlICovCi0jZGVmaW5lIE1fUEtURU5HX0ZSTUNOVF9MTwkJKDB4NmUgKiAyKQkvKiBMb3dlciB3b3JkIG9mIHR4IGZybWNudC9yeCBsb3N0Y250ICovCi0jZGVmaW5lIE1fUEtURU5HX0ZSTUNOVF9ISQkJKDB4NmYgKiAyKQkvKiBVcHBlciB3b3JkIG9mIHR4IGZybWNudC9yeCBsb3N0Y250ICovCi0KLS8qIEluZGV4IHZhcmlhdGlvbiBpbiB2YmF0IHJpcHBsZSAqLwotI2RlZmluZSBNX0xDTl9QV1JfSURYX01BWAkoMHg2NyAqIDIpCS8qIGhpZ2hlc3QgaW5kZXggcmVhZCBieSB1Y29kZSAqLwotI2RlZmluZSBNX0xDTl9QV1JfSURYX01JTgkoMHg2NiAqIDIpCS8qIGxvd2VzdCBpbmRleCByZWFkIGJ5IHVjb2RlICovCi0KLS8qIE1fUEtURU5HX0NUUkwgYml0IGRlZmluaXRpb25zICovCi0jZGVmaW5lIE1fUEtURU5HX01PREVfVFgJCTB4MDAwMQotI2RlZmluZSBNX1BLVEVOR19NT0RFX1RYX1JJRlMJICAgICAgICAweDAwMDQKLSNkZWZpbmUgTV9QS1RFTkdfTU9ERV9UWF9DVFMgICAgICAgICAgICAweDAwMDgKLSNkZWZpbmUgTV9QS1RFTkdfTU9ERV9SWAkJMHgwMDAyCi0jZGVmaW5lIE1fUEtURU5HX01PREVfUlhfV0lUSF9BQ0sJMHgwNDAyCi0jZGVmaW5lIE1fUEtURU5HX01PREVfTUFTSwkJMHgwMDAzCi0jZGVmaW5lIE1fUEtURU5HX0ZSTUNOVF9WTEQJCTB4MDEwMAkvKiBUWCBmcmFtZXMgaW5kaWNhdGVkIGluIHRoZSBmcm1jbnQgcmVnICovCi0KLS8qIFNhbXBsZSBDb2xsZWN0IHBhcmFtZXRlcnMgKGJpdG1hcCBhbmQgdHlwZSkgKi8KLSNkZWZpbmUgTV9TTVBMX0NPTF9CTVAJCSgweDM3ZCAqIDIpCS8qIFRyaWdnZXIgYml0bWFwIGZvciBzYW1wbGUgY29sbGVjdCAqLwotI2RlZmluZSBNX1NNUExfQ09MX0NUTAkJKDB4M2IyICogMikJLyogU2FtcGxlIGNvbGxlY3QgdHlwZSAqLwotCi0jZGVmaW5lIEFOVFNFTF9DTEtESVZfNE1IWgk2Ci0jZGVmaW5lIE1JTU9fQU5UU0VMX0JVU1kJMHg0MDAwCS8qIGJpdCAxNCAoYnVzeSkgKi8KLSNkZWZpbmUgTUlNT19BTlRTRUxfU0VMCQkweDgwMDAJLyogYml0IDE1IHdyaXRlIHRoZSB2YWx1ZSAqLwotI2RlZmluZSBNSU1PX0FOVFNFTF9XQUlUCTUwCS8qIDUwdXMgd2FpdCAqLwotI2RlZmluZSBNSU1PX0FOVFNFTF9PVkVSUklERQkweDgwMDAJLyogZmxhZyAqLwotCi1zdHJ1Y3Qgc2htX2FjcGFyYW1zIHsKLQl1MTYgdHhvcDsKLQl1MTYgY3dtaW47Ci0JdTE2IGN3bWF4OwotCXUxNiBjd2N1cjsKLQl1MTYgYWlmczsKLQl1MTYgYnNsb3RzOwotCXUxNiByZWdnYXA7Ci0JdTE2IHN0YXR1czsKLQl1MTYgcnN2ZFs4XTsKLX0gX19wYWNrZWQ7Ci0jZGVmaW5lIE1fRURDRl9RTEVOCSgxNiAqIDIpCi0KLSNkZWZpbmUgV01FX1NUQVRVU19ORVdBQwkoMSA8PCA4KQotCi0vKiBNX0hPU1RfRkxBR1MgKi8KLSNkZWZpbmUgTUhGTUFYCQk1CS8qIE51bWJlciBvZiB2YWxpZCBob3N0ZmxhZyBoYWxmLXdvcmQgKHUxNikgKi8KLSNkZWZpbmUgTUhGMQkJMAkvKiBIb3N0ZmxhZyAxIGluZGV4ICovCi0jZGVmaW5lIE1IRjIJCTEJLyogSG9zdGZsYWcgMiBpbmRleCAqLwotI2RlZmluZSBNSEYzCQkyCS8qIEhvc3RmbGFnIDMgaW5kZXggKi8KLSNkZWZpbmUgTUhGNAkJMwkvKiBIb3N0ZmxhZyA0IGluZGV4ICovCi0jZGVmaW5lIE1IRjUJCTQJLyogSG9zdGZsYWcgNSBpbmRleCAqLwotCi0vKiBGbGFncyBpbiBNX0hPU1RfRkxBR1MgKi8KLSNkZWZpbmUJTUhGMV9BTlRESVYJCTB4MDAwMQkvKiBFbmFibGUgdWNvZGUgYW50ZW5uYSBkaXZlcnNpdHkgaGVscCAqLwotI2RlZmluZQlNSEYxX0VEQ0YJCTB4MDEwMAkvKiBFbmFibGUgRURDRiBhY2Nlc3MgY29udHJvbCAqLwotI2RlZmluZSBNSEYxX0lRU1dBUF9XQVIJCTB4MDIwMAotI2RlZmluZQlNSEYxX0ZPUkNFRkFTVENMSwkweDA0MDAJLyogRGlzYWJsZSBTbG93IGNsb2NrIHJlcXVlc3QsIGZvciBjb3JlcmV2IDwgMTEgKi8KLQotLyogRmxhZ3MgaW4gTV9IT1NUX0ZMQUdTMiAqLwotI2RlZmluZSBNSEYyX1BDSVNMT1dDTEtXQVIJMHgwMDA4CS8qIFBSMTYxNjVXQVIgOiBFbmFibGUgdWNvZGUgUENJIHNsb3cgY2xvY2sgV0FSICovCi0jZGVmaW5lIE1IRjJfVFhCQ01DX05PVwkJMHgwMDQwCS8qIEZsdXNoIEJDTUMgRklGTyBpbW1lZGlhdGVseSAqLwotI2RlZmluZSBNSEYyX0hXUFdSQ1RMCQkweDAwODAJLyogRW5hYmxlIHVjb2RlL2h3IHBvd2VyIGNvbnRyb2wgKi8KLSNkZWZpbmUgTUhGMl9OUEhZNDBNSFpfV0FSCTB4MDgwMAotCi0vKiBGbGFncyBpbiBNX0hPU1RfRkxBR1MzICovCi0jZGVmaW5lIE1IRjNfQU5UU0VMX0VOCQkweDAwMDEJLyogZW5hYmxlZCBtaW1vIGFudGVubmEgc2VsZWN0aW9uICovCi0jZGVmaW5lIE1IRjNfQU5UU0VMX01PREUJMHgwMDAyCS8qIGFudGVubmEgc2VsZWN0aW9uIG1vZGU6IDA6IDJ4MywgMTogMng0ICovCi0jZGVmaW5lIE1IRjNfUkVTRVJWRUQxCQkweDAwMDQKLSNkZWZpbmUgTUhGM19SRVNFUlZFRDIJCTB4MDAwOAotI2RlZmluZSBNSEYzX05QSFlfTUxBRFZfV0FSCTB4MDAxMAotCi0vKiBGbGFncyBpbiBNX0hPU1RfRkxBR1M0ICovCi0jZGVmaW5lIE1IRjRfQlBIWV9UWENPUkUwCTB4MDA4MAkvKiBmb3JjZSBicGh5IFR4IG9uIGNvcmUgMCAoYm9hcmQgbGV2ZWwgV0FSKSAqLwotI2RlZmluZSBNSEY0X0VYVFBBX0VOQUJMRQkweDQwMDAJLyogZm9yIDQzMTNBMCBGRU0gYm9hcmRzICovCi0KLS8qIEZsYWdzIGluIE1fSE9TVF9GTEFHUzUgKi8KLSNkZWZpbmUgTUhGNV80MzEzX0dQSU9DVFJMCTB4MDAwMQotI2RlZmluZSBNSEY1X1JFU0VSVkVEMQkJMHgwMDAyCi0jZGVmaW5lIE1IRjVfUkVTRVJWRUQyCQkweDAwMDQKLS8qIFJhZGlvIHBvd2VyIHNldHRpbmcgZm9yIHVjb2RlICovCi0jZGVmaW5lCU1fUkFESU9fUFdSCQkoMHgzMiAqIDIpCi0KLS8qIHBoeSBub2lzZSByZWNvcmRlZCBieSB1Y29kZSByaWdodCBhZnRlciB0eCAqLwotI2RlZmluZQlNX1BIWV9OT0lTRQkJKDB4MDM3ICogMikKLSNkZWZpbmUJUEhZX05PSVNFX01BU0sJCTB4MDBmZgotCi0vKiBSZWNlaXZlIEZyYW1lIERhdGEgSGVhZGVyIGZvciA4MDIuMTFiIERDRi1vbmx5IGZyYW1lcyAqLwotc3RydWN0IGQxMXJ4aGRyIHsKLQl1MTYgUnhGcmFtZVNpemU7CS8qIEFjdHVhbCBieXRlIGxlbmd0aCBvZiB0aGUgZnJhbWUgZGF0YSByZWNlaXZlZCAqLwotCXUxNiBQQUQ7Ci0JdTE2IFBoeVJ4U3RhdHVzXzA7CS8qIFBoeVJ4U3RhdHVzIDE1OjAgKi8KLQl1MTYgUGh5UnhTdGF0dXNfMTsJLyogUGh5UnhTdGF0dXMgMzE6MTYgKi8KLQl1MTYgUGh5UnhTdGF0dXNfMjsJLyogUGh5UnhTdGF0dXMgNDc6MzIgKi8KLQl1MTYgUGh5UnhTdGF0dXNfMzsJLyogUGh5UnhTdGF0dXMgNjM6NDggKi8KLQl1MTYgUGh5UnhTdGF0dXNfNDsJLyogUGh5UnhTdGF0dXMgNzk6NjQgKi8KLQl1MTYgUGh5UnhTdGF0dXNfNTsJLyogUGh5UnhTdGF0dXMgOTU6ODAgKi8KLQl1MTYgUnhTdGF0dXMxOwkvKiBNQUMgUnggU3RhdHVzICovCi0JdTE2IFJ4U3RhdHVzMjsJLyogZXh0ZW5kZWQgTUFDIFJ4IHN0YXR1cyAqLwotCXUxNiBSeFRTRlRpbWU7CS8qIFJ4VFNGVGltZSB0aW1lIG9mIGZpcnN0IE1BQyBzeW1ib2wgKyBNX1BIWV9QTENQUlhfRExZICovCi0JdTE2IFJ4Q2hhbjsJCS8qIGdhaW4gY29kZSwgY2hhbm5lbCByYWRpbyBjb2RlLCBhbmQgcGh5IHR5cGUgKi8KLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUJUlhIRFJfTEVOCQkyNAkvKiBzaXplb2Ygc3RydWN0IGQxMXJ4aGRyICovCi0jZGVmaW5lCUZSQU1FTEVOKGgpCQkoKGgpLT5SeEZyYW1lU2l6ZSkKLQotc3RydWN0IGJyY21zX2QxMXJ4aGRyIHsKLQlzdHJ1Y3QgZDExcnhoZHIgcnhoZHI7Ci0JdTMyIHRzZl9sOwkJLyogVFNGX0wgcmVhZGluZyAqLwotCXM4IHJzc2k7CQkvKiBjb21wdXRlZCBpbnN0YW50ZW5lb3VzIHJzc2kgaW4gQk1BQyAqLwotCXM4IHJ4cHdyMDsJCS8qIG9ic29sZXRlZCwgcGxhY2UgaG9sZGVyIGZvciBsZWdhY3kgUk9NIGNvZGUuIHVzZSByeHB3cltdICovCi0Jczggcnhwd3IxOwkJLyogb2Jzb2xldGVkLCBwbGFjZSBob2xkZXIgZm9yIGxlZ2FjeSBST00gY29kZS4gdXNlIHJ4cHdyW10gKi8KLQlzOCBkb19yc3NpX21hOwkvKiBkbyBwZXItcGt0IHNhbXBsaW5nIGZvciBwZXItYW50ZW5uYSBtYSBpbiBISUdIICovCi0Jczggcnhwd3JbV0xfUlNTSV9BTlRfTUFYXTsJLyogcnNzaSBmb3Igc3VwcG9ydGVkIGFudGVubmFzICovCi19IF9fcGFja2VkOwotCi0vKiBQaHlSeFN0YXR1c18wOiAqLwotI2RlZmluZQlQUlhTMF9GVF9NQVNLCQkweDAwMDMJLyogTlBIWSBvbmx5OiBDQ0ssIE9GRE0sIHByZU4sIE4gKi8KLSNkZWZpbmUJUFJYUzBfQ0xJUF9NQVNLCQkweDAwMEMJLyogTlBIWSBvbmx5OiBjbGlwIGNvdW50IGFkanVzdG1lbnQgc3RlcHMgYnkgQUdDICovCi0jZGVmaW5lCVBSWFMwX0NMSVBfU0hJRlQJMgotI2RlZmluZQlQUlhTMF9VTlNSQVRFCQkweDAwMTAJLyogUEhZIHJlY2VpdmVkIGEgZnJhbWUgd2l0aCB1bnN1cHBvcnRlZCByYXRlICovCi0jZGVmaW5lCVBSWFMwX1JYQU5UX1VQU1VCQkFORAkweDAwMjAJLyogR1BIWTogcnggYW50LCBOUEhZOiB1cHBlciBzaWRlYmFuZCAqLwotI2RlZmluZQlQUlhTMF9MQ1JTCQkweDAwNDAJLyogQ0NLIGZyYW1lIG9ubHk6IGxvc3QgY3JzIGR1cmluZyBjY2sgZnJhbWUgcmVjZXB0aW9uICovCi0jZGVmaW5lCVBSWFMwX1NIT1JUSAkJMHgwMDgwCS8qIFNob3J0IFByZWFtYmxlICovCi0jZGVmaW5lCVBSWFMwX1BMQ1BGVgkJMHgwMTAwCS8qIFBMQ1AgdmlvbGF0aW9uICovCi0jZGVmaW5lCVBSWFMwX1BMQ1BIQ0YJCTB4MDIwMAkvKiBQTENQIGhlYWRlciBpbnRlZ3JpdHkgY2hlY2sgZmFpbGVkICovCi0jZGVmaW5lCVBSWFMwX0dBSU5fQ1RMCQkweDQwMDAJLyogbGVnYWN5IFBIWSBnYWluIGNvbnRyb2wgKi8KLSNkZWZpbmUgUFJYUzBfQU5UU0VMX01BU0sJMHhGMDAwCS8qIE5QSFk6IEFudGVubmFzIHVzZWQgZm9yIHJlY2VpdmVkIGZyYW1lLCBiaXRtYXNrICovCi0jZGVmaW5lIFBSWFMwX0FOVFNFTF9TSElGVAkweDEyCi0KLS8qIHN1YmZpZWxkIFBSWFMwX0ZUX01BU0sgKi8KLSNkZWZpbmUJUFJYUzBfQ0NLCQkweDAwMDAKLSNkZWZpbmUJUFJYUzBfT0ZETQkJMHgwMDAxCS8qIHZhbGlkIG9ubHkgZm9yIEcgcGh5LCB1c2UgcnhoLT5SeENoYW4gZm9yIEEgcGh5ICovCi0jZGVmaW5lCVBSWFMwX1BSRU4JCTB4MDAwMgotI2RlZmluZQlQUlhTMF9TVEROCQkweDAwMDMKLQotLyogc3ViZmllbGQgUFJYUzBfQU5UU0VMX01BU0sgKi8KLSNkZWZpbmUgUFJYUzBfQU5UU0VMXzAJCTB4MAkvKiBhbnRlbm5hIDAgaXMgdXNlZCAqLwotI2RlZmluZSBQUlhTMF9BTlRTRUxfMQkJMHgyCS8qIGFudGVubmEgMSBpcyB1c2VkICovCi0jZGVmaW5lIFBSWFMwX0FOVFNFTF8yCQkweDQJLyogYW50ZW5uYSAyIGlzIHVzZWQgKi8KLSNkZWZpbmUgUFJYUzBfQU5UU0VMXzMJCTB4OAkvKiBhbnRlbm5hIDMgaXMgdXNlZCAqLwotCi0vKiBQaHlSeFN0YXR1c18xOiAqLwotI2RlZmluZQlQUlhTMV9KU1NJX01BU0sJCTB4MDBGRgotI2RlZmluZQlQUlhTMV9KU1NJX1NISUZUCTAKLSNkZWZpbmUJUFJYUzFfU1FfTUFTSwkJMHhGRjAwCi0jZGVmaW5lCVBSWFMxX1NRX1NISUZUCQk4Ci0KLS8qIG5waHkgUGh5UnhTdGF0dXNfMTogKi8KLSNkZWZpbmUgUFJYUzFfbnBoeV9QV1IwX01BU0sJMHgwMEZGCi0jZGVmaW5lIFBSWFMxX25waHlfUFdSMV9NQVNLCTB4RkYwMAotCi0vKiBIVFBIWSBSeCBTdGF0dXMgZGVmaW5lcyAqLwotLyogaHRwaHkgUGh5UnhTdGF0dXNfMDogdGhvc2UgYml0IGFyZSBvdmVybGFwcGVkIHdpdGggUGh5UnhTdGF0dXNfMCAqLwotI2RlZmluZSBQUlhTMF9CQU5ECSAgICAgICAgMHgwNDAwCS8qIDAgPSAyLjRHLCAxID0gNUcgKi8KLSNkZWZpbmUgUFJYUzBfUlNWRAkgICAgICAgIDB4MDgwMAkvKiByZXNlcnZlZDsgc2V0IHRvIDAgKi8KLSNkZWZpbmUgUFJYUzBfVU5VU0VECSAgICAgICAgMHhGMDAwCS8qIHVudXNlZCBhbmQgbm90IGRlZmluZWQ7IHNldCB0byAwICovCi0KLS8qIGh0cGh5IFBoeVJ4U3RhdHVzXzE6ICovCi0jZGVmaW5lIFBSWFMxX0hUUEhZX0NPUkVfTUFTSwkweDAwMEYJLyogY29yZSBlbmFibGVzIGZvciB7My4uMH0sIDA9ZGlzYWJsZWQsIDE9ZW5hYmxlZCAqLwotI2RlZmluZSBQUlhTMV9IVFBIWV9BTlRDRkdfTUFTSwkweDAwRjAJLyogYW50ZW5uYSBjb25maWdhdGlvbiAqLwotI2RlZmluZSBQUlhTMV9IVFBIWV9NTVBMQ1BMZW5MX01BU0sJMHhGRjAwCS8qIE1peG1vZGUgUExDUCBMZW5ndGggbG93IGJ5dGUgbWFzayAqLwotCi0vKiBodHBoeSBQaHlSeFN0YXR1c18yOiAqLwotI2RlZmluZSBQUlhTMl9IVFBIWV9NTVBMQ1BMZW5IX01BU0sJMHgwMDBGCS8qIE1peG1vZGUgUExDUCBMZW5ndGggaGlnaCBieXRlIG1hc2t3ICovCi0jZGVmaW5lIFBSWFMyX0hUUEhZX01NUExDSF9SQVRFX01BU0sJMHgwMEYwCS8qIE1peG1vZGUgUExDUCByYXRlIG1hc2sgKi8KLSNkZWZpbmUgUFJYUzJfSFRQSFlfUlhQV1JfQU5UMAkweEZGMDAJLyogUnggcG93ZXIgb24gY29yZSAwICovCi0KLS8qIGh0cGh5IFBoeVJ4U3RhdHVzXzM6ICovCi0jZGVmaW5lIFBSWFMzX0hUUEhZX1JYUFdSX0FOVDEJMHgwMEZGCS8qIFJ4IHBvd2VyIG9uIGNvcmUgMSAqLwotI2RlZmluZSBQUlhTM19IVFBIWV9SWFBXUl9BTlQyCTB4RkYwMAkvKiBSeCBwb3dlciBvbiBjb3JlIDIgKi8KLQotLyogaHRwaHkgUGh5UnhTdGF0dXNfNDogKi8KLSNkZWZpbmUgUFJYUzRfSFRQSFlfUlhQV1JfQU5UMwkweDAwRkYJLyogUnggcG93ZXIgb24gY29yZSAzICovCi0jZGVmaW5lIFBSWFM0X0hUUEhZX0NGTwkJMHhGRjAwCS8qIENvYXJzZSBmcmVxdWVuY3kgb2Zmc2V0ICovCi0KLS8qIGh0cGh5IFBoeVJ4U3RhdHVzXzU6ICovCi0jZGVmaW5lIFBSWFM1X0hUUEhZX0ZGTwkgICAgICAgIDB4MDBGRgkvKiBGaW5lIGZyZXF1ZW5jeSBvZmZzZXQgKi8KLSNkZWZpbmUgUFJYUzVfSFRQSFlfQVIJICAgICAgICAweEZGMDAJLyogQWR2YW5jZSBSZXRhcmQgKi8KLQotI2RlZmluZSBIVFBIWV9NTVBMQ1BMZW4ocnhzKQkoKCgocnhzKS0+UGh5UnhTdGF0dXNfMSAmIFBSWFMxX0hUUEhZX01NUExDUExlbkxfTUFTSykgPj4gOCkgfCBcCi0JKCgocnhzKS0+UGh5UnhTdGF0dXNfMiAmIFBSWFMyX0hUUEhZX01NUExDUExlbkhfTUFTSykgPDwgOCkpCi0vKiBHZXQgUnggcG93ZXIgb24gY29yZSAwICovCi0jZGVmaW5lIEhUUEhZX1JYUFdSX0FOVDAocnhzKQkoKCgocnhzKS0+UGh5UnhTdGF0dXNfMikgJiBQUlhTMl9IVFBIWV9SWFBXUl9BTlQwKSA+PiA4KQotLyogR2V0IFJ4IHBvd2VyIG9uIGNvcmUgMSAqLwotI2RlZmluZSBIVFBIWV9SWFBXUl9BTlQxKHJ4cykJKCgocnhzKS0+UGh5UnhTdGF0dXNfMykgJiBQUlhTM19IVFBIWV9SWFBXUl9BTlQxKQotLyogR2V0IFJ4IHBvd2VyIG9uIGNvcmUgMiAqLwotI2RlZmluZSBIVFBIWV9SWFBXUl9BTlQyKHJ4cykJKCgoKHJ4cyktPlBoeVJ4U3RhdHVzXzMpICYgUFJYUzNfSFRQSFlfUlhQV1JfQU5UMikgPj4gOCkKLQotLyogdWNvZGUgUnhTdGF0dXMxOiAqLwotI2RlZmluZQlSWFNfQkNOU0VOVAkJMHg4MDAwCi0jZGVmaW5lCVJYU19TRUNLSU5EWF9NQVNLCTB4MDdlMAotI2RlZmluZQlSWFNfU0VDS0lORFhfU0hJRlQJNQotI2RlZmluZQlSWFNfREVDRVJSCQkoMSA8PCA0KQotI2RlZmluZQlSWFNfREVDQVRNUFQJCSgxIDw8IDMpCi0jZGVmaW5lCVJYU19QQlBSRVMJCSgxIDw8IDIpCS8qIFBBRCBieXRlcyB0byBtYWtlIElQIGRhdGEgNCBieXRlcyBhbGlnbmVkICovCi0jZGVmaW5lCVJYU19SRVNQRlJBTUVUWAkJKDEgPDwgMSkKLSNkZWZpbmUJUlhTX0ZDU0VSUgkJKDEgPDwgMCkKLQotLyogdWNvZGUgUnhTdGF0dXMyOiAqLwotI2RlZmluZSBSWFNfQU1TRFVfTUFTSwkJMQotI2RlZmluZQlSWFNfQUdHVFlQRV9NQVNLCTB4NgotI2RlZmluZQlSWFNfQUdHVFlQRV9TSElGVAkxCi0jZGVmaW5lCVJYU19QSFlSWFNUX1ZBTElECSgxIDw8IDgpCi0jZGVmaW5lIFJYU19SWEFOVF9NQVNLCQkweDMKLSNkZWZpbmUgUlhTX1JYQU5UX1NISUZUCQkxMgotCi0vKiBSeENoYW4gKi8KLSNkZWZpbmUgUlhTX0NIQU5fNDAJCTB4MTAwMAotI2RlZmluZSBSWFNfQ0hBTl81RwkJMHgwODAwCi0jZGVmaW5lCVJYU19DSEFOX0lEX01BU0sJMHgwN2Y4Ci0jZGVmaW5lCVJYU19DSEFOX0lEX1NISUZUCTMKLSNkZWZpbmUJUlhTX0NIQU5fUEhZVFlQRV9NQVNLCTB4MDAwNwotI2RlZmluZQlSWFNfQ0hBTl9QSFlUWVBFX1NISUZUCTAKLQotLyogSW5kZXggb2YgYXR0ZW51YXRpb25zIHVzZWQgZHVyaW5nIHVjb2RlIHBvd2VyIGNvbnRyb2wuICovCi0jZGVmaW5lIE1fUFdSSU5EX0JMS1MJKDB4MTg0ICogMikKLSNkZWZpbmUgTV9QV1JJTkRfTUFQMAkoTV9QV1JJTkRfQkxLUyArIDB4MCkKLSNkZWZpbmUgTV9QV1JJTkRfTUFQMQkoTV9QV1JJTkRfQkxLUyArIDB4MikKLSNkZWZpbmUgTV9QV1JJTkRfTUFQMgkoTV9QV1JJTkRfQkxLUyArIDB4NCkKLSNkZWZpbmUgTV9QV1JJTkRfTUFQMwkoTV9QV1JJTkRfQkxLUyArIDB4NikKLS8qIE1fUFdSSU5EX01BUChjb3JlKSBtYWNybyAqLwotI2RlZmluZSBNX1BXUklORF9NQVAoY29yZSkgIChNX1BXUklORF9CTEtTICsgKChjb3JlKTw8MSkpCi0KLS8qIFBTTSBTSE0gdmFyaWFibGUgb2Zmc2V0cyAqLwotI2RlZmluZQlNX1BTTV9TT0ZUX1JFR1MJMHgwCi0jZGVmaW5lCU1fQk9NX1JFVl9NQUpPUgkoTV9QU01fU09GVF9SRUdTICsgMHgwKQotI2RlZmluZQlNX0JPTV9SRVZfTUlOT1IJKE1fUFNNX1NPRlRfUkVHUyArIDB4MikKLSNkZWZpbmUJTV9VQ09ERV9EQkdTVAkoTV9QU01fU09GVF9SRUdTICsgMHg0MCkJLyogdWNvZGUgZGVidWcgc3RhdHVzIGNvZGUgKi8KLSNkZWZpbmUJTV9VQ09ERV9NQUNTVEFUCShNX1BTTV9TT0ZUX1JFR1MgKyAweEUwKQkvKiBtYWNzdGF0IGNvdW50ZXJzICovCi0KLSNkZWZpbmUgTV9BR0lOR19USFJTSAkoMHgzZSAqIDIpCS8qIG1heCB0aW1lIHdhaXRpbmcgZm9yIG1lZGl1bSBiZWZvcmUgdHggKi8KLSNkZWZpbmUJTV9NQlVSU1RfU0laRQkoMHg0MCAqIDIpCS8qIG1heCBmcmFtZXMgaW4gYSBmcmFtZWJ1cnN0ICovCi0jZGVmaW5lCU1fTUJVUlNUX1RYT1AJKDB4NDEgKiAyKQkvKiBtYXggZnJhbWVidXJzdCBUWE9QIGluIHVuaXQgb2YgdXMgKi8KLSNkZWZpbmUgTV9TWU5USFBVX0RMWQkoMHg0YSAqIDIpCS8qIHByZS13YWtldXAgZm9yIHN5bnRocHUsIGRlZmF1bHQ6IDUwMCAqLwotI2RlZmluZQlNX1BSRVRCVFQJKDB4NGIgKiAyKQotCi0jZGVmaW5lIE1fQUxUX1RYUFdSX0lEWAkJKE1fUFNNX1NPRlRfUkVHUyArICgweDNiICogMikpCS8qIG9mZnNldCB0byB0aGUgdGFyZ2V0IHR4cHdyICovCi0jZGVmaW5lIE1fUEhZX1RYX0ZMVF9QVFIJKE1fUFNNX1NPRlRfUkVHUyArICgweDNkICogMikpCi0jZGVmaW5lIE1fQ1RTX0RVUkFUSU9OCQkoTV9QU01fU09GVF9SRUdTICsgKDB4NWMgKiAyKSkKLSNkZWZpbmUgTV9MUF9SQ0NBTF9PVlIJCShNX1BTTV9TT0ZUX1JFR1MgKyAoMHg2YiAqIDIpKQotCi0vKiBQS1RFTkcgUnggU3RhdHMgQmxvY2sgKi8KLSNkZWZpbmUgTV9SWFNUQVRTX0JMS19QVFIJKE1fUFNNX1NPRlRfUkVHUyArICgweDY1ICogMikpCi0KLS8qIHVjb2RlIGRlYnVnIHN0YXR1cyBjb2RlcyAqLwotI2RlZmluZQlEQkdTVF9JTkFDVElWRQkJMAkvKiBub3QgdmFsaWQgcmVhbGx5ICovCi0jZGVmaW5lCURCR1NUX0lOSVQJCTEJLyogYWZ0ZXIgemVyb2luZyBTSE0sIGJlZm9yZSBzdXNwZW5kaW5nIGF0IGluaXQgKi8KLSNkZWZpbmUJREJHU1RfQUNUSVZFCQkyCS8qICJub3JtYWwiIHN0YXRlICovCi0jZGVmaW5lCURCR1NUX1NVU1BFTkRFRAkJMwkvKiBzdXNwZW5kZWQgKi8KLSNkZWZpbmUJREJHU1RfQVNMRUVQCQk0CS8qIGFzbGVlcCAoUFMgbW9kZSkgKi8KLQotLyogU2NyYXRjaCBSZWcgZGVmcyAqLwotZW51bSBfZVBzbVNjcmF0Y2hQYWRSZWdEZWZpbml0aW9ucyB7Ci0JU19SU1YwID0gMCwKLQlTX1JTVjEsCi0JU19SU1YyLAotCi0JLyogc2NyYXRjaCByZWdpc3RlcnMgZm9yIERvdDExLWNvbnRhbnRzICovCi0JU19ET1QxMV9DV01JTiwJCS8qIENXLW1pbmltdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMgKi8KLQlTX0RPVDExX0NXTUFYLAkJLyogQ1ctbWF4aW11bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNCAqLwotCVNfRE9UMTFfQ1dDVVIsCQkvKiBDVy1jdXJyZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1ICovCi0JU19ET1QxMV9TUkNfTE1ULAkvKiBzaG9ydCByZXRyeSBjb3VudCBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAweDA2ICovCi0JU19ET1QxMV9MUkNfTE1ULAkvKiBsb25nIHJldHJ5IGNvdW50IGxpbWl0ICAgICAgICAgICAgICAgICAgICAgICAweDA3ICovCi0JU19ET1QxMV9EVElNQ09VTlQsCS8qIERUSU0tY291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDggKi8KLQotCS8qIFR4LXNpZGUgc2NyYXRjaCByZWdpc3RlcnMgKi8KLQlTX1NFUV9OVU0sCQkvKiBoYXJkd2FyZSBzZXF1ZW5jZSBudW1iZXIgcmVnICAgICAgICAgICAgICAgICAweDA5ICovCi0JU19TRVFfTlVNX0ZSQUcsCQkvKiBzZXEtbnVtIGZvciBmcmFncyAoU2V0IGF0IHRoZSBzdGFydCBvcyBNU0RVICAweDBBICovCi0JU19GUk1SRVRYX0NOVCwJCS8qIGZyYW1lIHJldHggY291bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEIgKi8KLQlTX1NTUkMsCQkJLyogU3RhdGlvbiBzaG9ydCByZXRyeSBjb3VudCAgICAgICAgICAgICAgICAgICAgMHgwQyAqLwotCVNfU0xSQywJCQkvKiBTdGF0aW9uIGxvbmcgcmV0cnkgY291bnQgICAgICAgICAgICAgICAgICAgICAweDBEICovCi0JU19FWFBfUlNQLAkJLyogRXhwZWN0ZWQgcmVzcG9uc2UgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgMHgwRSAqLwotCVNfT0xEX0JSRU0sCQkvKiBSZW1haW5pbmcgYmFja29mZiBjdHIgICAgICAgICAgICAgICAgICAgICAgICAweDBGICovCi0JU19PTERfQ1dXSU4sCQkvKiBzYXZlZC1vZmYgQ1ctY3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwICovCi0JU19UWEVDVEwsCQkvKiBUWEUtQ3RsIHdvcmQgY29uc3RydWN0ZWQgaW4gc2NyLXBhZCAgICAgICAgICAweDExICovCi0JU19DVFhUU1QsCQkvKiBmcm0gdHlwZS1zdWJ0eXBlIGFzIHJlYWQgZnJvbSBUeC1kZXNjciAgICAgICAweDEyICovCi0KLQkvKiBSeC1zaWRlIHNjcmF0Y2ggcmVnaXN0ZXJzICovCi0JU19SWFRTVCwJCS8qIFR5cGUgYW5kIHN1YnR5cGUgaW4gUnhmcmFtZSAgICAgICAgICAgICAgICAgIDB4MTMgKi8KLQotCS8qIEdsb2JhbCBzdGF0ZSByZWdpc3RlciAqLwotCVNfU1RSRUcsCQkvKiBzdGF0ZSBzdG9yYWdlIGFjdHVhbCBiaXQgbWFwcyBiZWxvdyAgICAgICAgICAweDE0ICovCi0KLQlTX1RYUFdSX1NVTSwJCS8qIFR4IHBvd2VyIGNvbnRyb2w6IGFjY3VtdWxhdG9yICAgICAgICAgICAgICAgIDB4MTUgKi8KLQlTX1RYUFdSX0lURVIsCQkvKiBUeCBwb3dlciBjb250cm9sOiBpdGVyYXRpb24gICAgICAgICAgICAgICAgICAweDE2ICovCi0JU19SWF9GUk1UWVBFLAkJLyogUmF0ZSBhbmQgUEhZIHR5cGUgZm9yIGZyYW1lcyAgICAgICAgICAgICAgICAgMHgxNyAqLwotCVNfVEhJU19BR0csCQkvKiBTaXplIG9mIHRoaXMgQUdHIChBLU1TRFUpICAgICAgICAgICAgICAgICAgICAweDE4ICovCi0KLQlTX0tFWUlORFgsCQkvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5ICovCi0JU19SWEZSTUxFTiwJCS8qIFJlY2VpdmUgTVBEVSBsZW5ndGggaW4gYnl0ZXMgICAgICAgICAgICAgICAgIDB4MUEgKi8KLQotCS8qIFJlY2VpdmUgVFNGIHRpbWUgc3RvcmVkIGluIFNDUiAqLwotCVNfUlhUU0ZUTVJWQUxfV0QzLAkvKiBUU0YgdmFsdWUgYXQgdGhlIHN0YXJ0IG9mIHJ4ICAgICAgICAgICAgICAgICAweDFCICovCi0JU19SWFRTRlRNUlZBTF9XRDIsCS8qIFRTRiB2YWx1ZSBhdCB0aGUgc3RhcnQgb2YgcnggICAgICAgICAgICAgICAgIDB4MUMgKi8KLQlTX1JYVFNGVE1SVkFMX1dEMSwJLyogVFNGIHZhbHVlIGF0IHRoZSBzdGFydCBvZiByeCAgICAgICAgICAgICAgICAgMHgxRCAqLwotCVNfUlhUU0ZUTVJWQUxfV0QwLAkvKiBUU0YgdmFsdWUgYXQgdGhlIHN0YXJ0IG9mIHJ4ICAgICAgICAgICAgICAgICAweDFFICovCi0JU19SWFNTTiwJCS8qIFJlY2VpdmVkIHN0YXJ0IHNlcSBudW1iZXIgZm9yIEEtTVBEVSBCQSAgICAgIDB4MUYgKi8KLQlTX1JYUU9TRkxELAkJLyogUngtUW9TIGZpZWxkIChpZiBwcmVzZW50KSAgICAgICAgICAgICAgICAgICAgMHgyMCAqLwotCi0JLyogU2NyYXRjaCBwYWQgcmVncyB1c2VkIGluIG1pY3JvY29kZSBhcyB0ZW1wIHN0b3JhZ2UgKi8KLQlTX1RNUDAsCQkJLyogc3RtcDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMSAqLwotCVNfVE1QMSwJCQkvKiBzdG1wMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIyICovCi0JU19UTVAyLAkJCS8qIHN0bXAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjMgKi8KLQlTX1RNUDMsCQkJLyogc3RtcDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNCAqLwotCVNfVE1QNCwJCQkvKiBzdG1wNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDI1ICovCi0JU19UTVA1LAkJCS8qIHN0bXA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjYgKi8KLQlTX1BSUVBFTkFMVFlfQ1RSLAkvKiBQcm9iZSByZXNwb25zZSBxdWV1ZSBwZW5hbHR5IGNvdW50ZXIgICAgICAgICAweDI3ICovCi0JU19BTlRDTlQsCQkvKiB1bnN1Y2Nlc3NmdWwgYXR0ZW1wdHMgb24gY3VycmVudCBhbnQuICAgICAgICAweDI4ICovCi0JU19TWU1CT0wsCQkvKiBmbGFnIGZvciBwb3NzaWJsZSBzeW1ib2wgY3RsIGZyYW1lcyAgICAgICAgICAweDI5ICovCi0JU19SWFRQLAkJCS8qIHJ4IGZyYW1lIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MkEgKi8KLQlTX1NUUkVHMiwJCS8qIGV4dHJhIHN0YXRlIHN0b3JhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MkIgKi8KLQlTX1NUUkVHMywJCS8qIGV2ZW4gbW9yZSBleHRyYSBzdGF0ZSBzdG9yYWdlICAgICAgICAgICAgICAgIDB4MkMgKi8KLQlTX1NUUkVHNCwJCS8qIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MkQgKi8KLQlTX1NUUkVHNSwJCS8qIHJlbWVtYmVyIHRvIGluaXRpYWxpemUgaXQgdG8gemVybyAgICAgICAgICAgIDB4MkUgKi8KLQotCVNfQURKUFdSX0lEWCwKLQlTX0NVUl9QVFIsCQkvKiBUZW1wIHBvaW50ZXIgZm9yIEEtTVBEVSByZS1UeCBTSE0gdGFibGUgICAgICAweDMyICovCi0JU19SRVZJRDQsCQkvKiAweDMzICovCi0JU19JTkRYLAkJCS8qIDB4MzQgKi8KLQlTX0FERFIwLAkJLyogMHgzNSAqLwotCVNfQUREUjEsCQkvKiAweDM2ICovCi0JU19BRERSMiwJCS8qIDB4MzcgKi8KLQlTX0FERFIzLAkJLyogMHgzOCAqLwotCVNfQUREUjQsCQkvKiAweDM5ICovCi0JU19BRERSNSwJCS8qIDB4M0EgKi8KLQlTX1RNUDYsCQkJLyogMHgzQiAqLwotCVNfS0VZSU5EWF9CVSwJCS8qIEJhY2t1cCBmb3IgS2V5IGluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0MgKi8KLQlTX01GR1RFU1RfVE1QMCwJCS8qIFRlbXAgcmVnaXN0ZXIgdXNlZCBmb3IgUlggdGVzdCBjYWxjdWxhdGlvbnMgIDB4M0QgKi8KLQlTX1JYRVNOLAkJLyogUmVjZWl2ZWQgZW5kIHNlcXVlbmNlIG51bWJlciBmb3IgQS1NUERVIEJBICAgMHgzRSAqLwotCVNfU1RSRUc2LAkJLyogMHgzRiAqLwotfTsKLQotI2RlZmluZSBTX0JFQUNPTl9JTkRYCVNfT0xEX0JSRU0KLSNkZWZpbmUgU19QUlNfSU5EWAlTX09MRF9DV1dJTgotI2RlZmluZSBTX1BIWVRZUEUJU19TU1JDCi0jZGVmaW5lIFNfUEhZVkVSCVNfU0xSQwotCi0vKiBJSFIgU0xPV19DVFJMIHZhbHVlcyAqLwotI2RlZmluZSBTTE9XX0NUUkxfUERFCQkoMSA8PCAwKQotI2RlZmluZSBTTE9XX0NUUkxfRkQJCSgxIDw8IDgpCi0KLS8qIHVjb2RlIG1hYyBzdGF0aXN0aWMgY291bnRlcnMgaW4gc2hhcmVkIG1lbW9yeSAqLwotc3RydWN0IG1hY3N0YXQgewotCXUxNiB0eGFsbGZybTsJLyogMHg4MCAqLwotCXUxNiB0eHJ0c2ZybTsJLyogMHg4MiAqLwotCXUxNiB0eGN0c2ZybTsJLyogMHg4NCAqLwotCXUxNiB0eGFja2ZybTsJLyogMHg4NiAqLwotCXUxNiB0eGRubGZybTsJLyogMHg4OCAqLwotCXUxNiB0eGJjbmZybTsJLyogMHg4YSAqLwotCXUxNiB0eGZ1bmZsWzhdOwkvKiAweDhjIC0gMHg5YiAqLwotCXUxNiB0eHRwbHVuZmw7CS8qIDB4OWMgKi8KLQl1MTYgdHhwaHllcnI7CS8qIDB4OWUgKi8KLQl1MTYgcGt0ZW5ncnhkdWNhc3Q7CS8qIDB4YTAgKi8KLQl1MTYgcGt0ZW5ncnhkbWNhc3Q7CS8qIDB4YTIgKi8KLQl1MTYgcnhmcm10b29sb25nOwkvKiAweGE0ICovCi0JdTE2IHJ4ZnJtdG9vc2hydDsJLyogMHhhNiAqLwotCXUxNiByeGludm1hY2hkcjsJLyogMHhhOCAqLwotCXUxNiByeGJhZGZjczsJLyogMHhhYSAqLwotCXUxNiByeGJhZHBsY3A7CS8qIDB4YWMgKi8KLQl1MTYgcnhjcnNnbGl0Y2g7CS8qIDB4YWUgKi8KLQl1MTYgcnhzdHJ0OwkJLyogMHhiMCAqLwotCXUxNiByeGRmcm11Y2FzdG1ic3M7CS8qIDB4YjIgKi8KLQl1MTYgcnhtZnJtdWNhc3RtYnNzOwkvKiAweGI0ICovCi0JdTE2IHJ4Y2ZybXVjYXN0OwkvKiAweGI2ICovCi0JdTE2IHJ4cnRzdWNhc3Q7CS8qIDB4YjggKi8KLQl1MTYgcnhjdHN1Y2FzdDsJLyogMHhiYSAqLwotCXUxNiByeGFja3VjYXN0OwkvKiAweGJjICovCi0JdTE2IHJ4ZGZybW9jYXN0OwkvKiAweGJlICovCi0JdTE2IHJ4bWZybW9jYXN0OwkvKiAweGMwICovCi0JdTE2IHJ4Y2ZybW9jYXN0OwkvKiAweGMyICovCi0JdTE2IHJ4cnRzb2Nhc3Q7CS8qIDB4YzQgKi8KLQl1MTYgcnhjdHNvY2FzdDsJLyogMHhjNiAqLwotCXUxNiByeGRmcm1tY2FzdDsJLyogMHhjOCAqLwotCXUxNiByeG1mcm1tY2FzdDsJLyogMHhjYSAqLwotCXUxNiByeGNmcm1tY2FzdDsJLyogMHhjYyAqLwotCXUxNiByeGJlYWNvbm1ic3M7CS8qIDB4Y2UgKi8KLQl1MTYgcnhkZnJtdWNhc3RvYnNzOwkvKiAweGQwICovCi0JdTE2IHJ4YmVhY29ub2JzczsJLyogMHhkMiAqLwotCXUxNiByeHJzcHRtb3V0OwkvKiAweGQ0ICovCi0JdTE2IGJjbnR4Y2FuY2w7CS8qIDB4ZDYgKi8KLQl1MTYgUEFEOwotCXUxNiByeGYwb3ZmbDsJLyogMHhkYSAqLwotCXUxNiByeGYxb3ZmbDsJLyogMHhkYyAqLwotCXUxNiByeGYyb3ZmbDsJLyogMHhkZSAqLwotCXUxNiB0eHNmb3ZmbDsJLyogMHhlMCAqLwotCXUxNiBwbXFvdmZsOwkJLyogMHhlMiAqLwotCXUxNiByeGNncHJxZnJtOwkvKiAweGU0ICovCi0JdTE2IHJ4Y2dwcnNxb3ZmbDsJLyogMHhlNiAqLwotCXUxNiB0eGNncHJzZmFpbDsJLyogMHhlOCAqLwotCXUxNiB0eGNncHJzc3VjOwkvKiAweGVhICovCi0JdTE2IHByc190aW1lb3V0OwkvKiAweGVjICovCi0JdTE2IHJ4bmFjazsKLQl1MTYgZnJtc2NvbnM7Ci0JdTE2IHR4bmFjazsKLQl1MTYgdHhnbGl0Y2hfbmFjazsKLQl1MTYgdHhidXJzdDsJCS8qIDB4ZjYgIyB0eCBidXJzdHMgKi8KLQl1MTYgYnBoeV9yeGNyc2dsaXRjaDsJLyogYnBoeSByeCBjcnMgZ2xpdGNoICovCi0JdTE2IHBoeXdhdGNoZG9nOwkvKiAweGZhICMgb2YgcGh5IHdhdGNoZG9nIGV2ZW50cyAqLwotCXUxNiBQQUQ7Ci0JdTE2IGJwaHlfYmFkcGxjcDsJLyogYnBoeSBiYWQgcGxjcCAqLwotfTsKLQotLyogZG90MTEgY29yZS1zcGVjaWZpYyBjb250cm9sIGZsYWdzICovCi0jZGVmaW5lCVNJQ0ZfUENMS0UJCTB4MDAwNAkvKiBQSFkgY2xvY2sgZW5hYmxlICovCi0jZGVmaW5lCVNJQ0ZfUFJTVAkJMHgwMDA4CS8qIFBIWSByZXNldCAqLwotI2RlZmluZQlTSUNGX01QQ0xLRQkJMHgwMDEwCS8qIE1BQyBQSFkgY2xvY2tjb250cm9sIGVuYWJsZSAqLwotI2RlZmluZQlTSUNGX0ZSRUYJCTB4MDAyMAkvKiBQTEwgRnJlcVJlZlNlbGVjdCAqLwotLyogTk9URTogdGhlIGZvbGxvd2luZyBidyBiaXRzIG9ubHkgYXBwbHkgd2hlbiB0aGUgY29yZSBpcyBhdHRhY2hlZAotICogdG8gYSBOUEhZCi0gKi8KLSNkZWZpbmUJU0lDRl9CV01BU0sJCTB4MDBjMAkvKiBwaHkgY2xvY2sgbWFzayAoYjYgJiBiNykgKi8KLSNkZWZpbmUJU0lDRl9CVzQwCQkweDAwODAJLyogNDBNSHogQlcgKDE2ME1IeiBwaHljbGspICovCi0jZGVmaW5lCVNJQ0ZfQlcyMAkJMHgwMDQwCS8qIDIwTUh6IEJXICg4ME1IeiBwaHljbGspICovCi0jZGVmaW5lCVNJQ0ZfQlcxMAkJMHgwMDAwCS8qIDEwTUh6IEJXICg0ME1IeiBwaHljbGspICovCi0jZGVmaW5lCVNJQ0ZfR01PREUJCTB4MjAwMAkvKiBnbW9kZSBlbmFibGUgKi8KLQotLyogZG90MTEgY29yZS1zcGVjaWZpYyBzdGF0dXMgZmxhZ3MgKi8KLSNkZWZpbmUJU0lTRl8yR19QSFkJCTB4MDAwMQkvKiAyLjRHIGNhcGFibGUgcGh5ICovCi0jZGVmaW5lCVNJU0ZfNUdfUEhZCQkweDAwMDIJLyogNUcgY2FwYWJsZSBwaHkgKi8KLSNkZWZpbmUJU0lTRl9GQ0xLQQkJMHgwMDA0CS8qIEZhc3RDbGtBdmFpbGFibGUgKi8KLSNkZWZpbmUJU0lTRl9EQl9QSFkJCTB4MDAwOAkvKiBEdWFsYmFuZCBwaHkgKi8KLQotLyogPT09IEVuZCBvZiBNQUMgcmVnLCBCZWdpbm5pbmcgb2YgUEhZKGIvYS9nL24pIHJlZywgcmFkaW8gYW5kIExQUEhZIHJlZ3MgYXJlIHNlcGFyYXRlZCA9PT0gKi8KLQotI2RlZmluZQlCUEhZX1JFR19PRlRfQkFTRQkweDAKLS8qIG9mZnNldHMgZm9yIGluZGlyZWN0IGFjY2VzcyB0byBicGh5IHJlZ2lzdGVycyAqLwotI2RlZmluZQlCUEhZX0JCX0NPTkZJRwkJMHgwMQotI2RlZmluZQlCUEhZX0FEQ0JJQVMJCTB4MDIKLSNkZWZpbmUJQlBIWV9BTkFDT1JFCQkweDAzCi0jZGVmaW5lCUJQSFlfUEhZQ1JTVEgJCTB4MDYKLSNkZWZpbmUJQlBIWV9URVNUCQkweDBhCi0jZGVmaW5lCUJQSFlfUEFfVFhfVE8JCTB4MTAKLSNkZWZpbmUJQlBIWV9TWU5USF9EQ19UTwkweDExCi0jZGVmaW5lCUJQSFlfUEFfVFhfVElNRV9VUAkweDEyCi0jZGVmaW5lCUJQSFlfUlhfRkxUUl9USU1FX1VQCTB4MTMKLSNkZWZpbmUJQlBIWV9UWF9QT1dFUl9PVkVSUklERQkweDE0Ci0jZGVmaW5lCUJQSFlfUkZfT1ZFUlJJREUJMHgxNQotI2RlZmluZQlCUEhZX1JGX1RSX0xPT0tVUDEJMHgxNgotI2RlZmluZQlCUEhZX1JGX1RSX0xPT0tVUDIJMHgxNwotI2RlZmluZQlCUEhZX0NPRUZGUwkJMHgxOAotI2RlZmluZQlCUEhZX1BMTF9PVVQJCTB4MTkKLSNkZWZpbmUJQlBIWV9SRUZSRVNIX01BSU4JMHgxYQotI2RlZmluZQlCUEhZX1JFRlJFU0hfVE8wCTB4MWIKLSNkZWZpbmUJQlBIWV9SRUZSRVNIX1RPMQkweDFjCi0jZGVmaW5lCUJQSFlfUlNTSV9UUkVTSAkJMHgyMAotI2RlZmluZQlCUEhZX0lRX1RSRVNIX0hICTB4MjEKLSNkZWZpbmUJQlBIWV9JUV9UUkVTSF9ICQkweDIyCi0jZGVmaW5lCUJQSFlfSVFfVFJFU0hfTAkJMHgyMwotI2RlZmluZQlCUEhZX0lRX1RSRVNIX0xMCTB4MjQKLSNkZWZpbmUJQlBIWV9HQUlOCQkweDI1Ci0jZGVmaW5lCUJQSFlfTE5BX0dBSU5fUkFOR0UJMHgyNgotI2RlZmluZQlCUEhZX0pTU0kJCTB4MjcKLSNkZWZpbmUJQlBIWV9UU1NJX0NUTAkJMHgyOAotI2RlZmluZQlCUEhZX1RTU0kJCTB4MjkKLSNkZWZpbmUJQlBIWV9UUl9MT1NTX0NUTAkweDJhCi0jZGVmaW5lCUJQSFlfTE9fTEVBS0FHRQkJMHgyYgotI2RlZmluZQlCUEhZX0xPX1JTU0lfQUNDCTB4MmMKLSNkZWZpbmUJQlBIWV9MT19JUU1BR19BQ0MJMHgyZAotI2RlZmluZQlCUEhZX1RYX0RDX09GRjEJCTB4MmUKLSNkZWZpbmUJQlBIWV9UWF9EQ19PRkYyCQkweDJmCi0jZGVmaW5lCUJQSFlfUEVBS19DTlRfVEhSRVNICTB4MzAKLSNkZWZpbmUJQlBIWV9GUkVRX09GRlNFVAkweDMxCi0jZGVmaW5lCUJQSFlfRElWRVJTSVRZX0NUTAkweDMyCi0jZGVmaW5lCUJQSFlfUEVBS19FTkVSR1lfTE8JMHgzMwotI2RlZmluZQlCUEhZX1BFQUtfRU5FUkdZX0hJCTB4MzQKLSNkZWZpbmUJQlBIWV9TWU5DX0NUTAkJMHgzNQotI2RlZmluZQlCUEhZX1RYX1BXUl9DVFJMCTB4MzYKLSNkZWZpbmUgQlBIWV9UWF9FU1RfUFdSCQkweDM3Ci0jZGVmaW5lCUJQSFlfU1RFUAkJMHgzOAotI2RlZmluZQlCUEhZX1dBUk1VUAkJMHgzOQotI2RlZmluZQlCUEhZX0xNU19DRkZfUkVBRAkweDNhCi0jZGVmaW5lCUJQSFlfTE1TX0NPRUZGX0kJMHgzYgotI2RlZmluZQlCUEhZX0xNU19DT0VGRl9RCTB4M2MKLSNkZWZpbmUJQlBIWV9TSUdfUE9XCQkweDNkCi0jZGVmaW5lCUJQSFlfUkZEQ19DQU5DRUxfQ1RMCTB4M2UKLSNkZWZpbmUJQlBIWV9IRFJfVFlQRQkJMHg0MAotI2RlZmluZQlCUEhZX1NGRF9UTwkJMHg0MQotI2RlZmluZQlCUEhZX1NGRF9DVEwJCTB4NDIKLSNkZWZpbmUJQlBIWV9ERUJVRwkJMHg0MwotI2RlZmluZQlCUEhZX1JYX0RFTEFZX0NPTVAJMHg0NAotI2RlZmluZQlCUEhZX0NSU19EUk9QX1RPCTB4NDUKLSNkZWZpbmUJQlBIWV9TSE9SVF9TRkRfTlpFUk9TCTB4NDYKLSNkZWZpbmUJQlBIWV9EU1NTX0NPRUZGMQkweDQ4Ci0jZGVmaW5lCUJQSFlfRFNTU19DT0VGRjIJMHg0OQotI2RlZmluZQlCUEhZX0NDS19DT0VGRjEJCTB4NGEKLSNkZWZpbmUJQlBIWV9DQ0tfQ09FRkYyCQkweDRiCi0jZGVmaW5lCUJQSFlfVFJfQ09SUgkJMHg0YwotI2RlZmluZQlCUEhZX0FOR0xFX1NDQUxFCTB4NGQKLSNkZWZpbmUJQlBIWV9UWF9QV1JfQkFTRV9JRFgJMHg0ZQotI2RlZmluZQlCUEhZX09QVElPTkFMX01PREVTMgkweDRmCi0jZGVmaW5lCUJQSFlfQ0NLX0xNU19TVEVQCTB4NTAKLSNkZWZpbmUJQlBIWV9CWVBBU1MJCTB4NTEKLSNkZWZpbmUJQlBIWV9DQ0tfREVMQVlfTE9ORwkweDUyCi0jZGVmaW5lCUJQSFlfQ0NLX0RFTEFZX1NIT1JUCTB4NTMKLSNkZWZpbmUJQlBIWV9QUFJPQ19DSEFOX0RFTEFZCTB4NTQKLSNkZWZpbmUJQlBIWV9EREZTX0VOQUJMRQkweDU4Ci0jZGVmaW5lCUJQSFlfUEhBU0VfU0NBTEUJMHg1OQotI2RlZmluZQlCUEhZX0ZSRVFfQ09OVFJPTAkweDVhCi0jZGVmaW5lCUJQSFlfTE5BX0dBSU5fUkFOR0VfMTAJMHg1YgotI2RlZmluZQlCUEhZX0xOQV9HQUlOX1JBTkdFXzMyCTB4NWMKLSNkZWZpbmUJQlBIWV9PUFRJT05BTF9NT0RFUwkweDVkCi0jZGVmaW5lCUJQSFlfUlhfU1RBVFVTMgkJMHg1ZQotI2RlZmluZQlCUEhZX1JYX1NUQVRVUzMJCTB4NWYKLSNkZWZpbmUJQlBIWV9EQUNfQ09OVFJPTAkweDYwCi0jZGVmaW5lCUJQSFlfQU5BMTFHX0ZJTFRfQ1RSTAkweDYyCi0jZGVmaW5lCUJQSFlfUkVGUkVTSF9DVFJMCTB4NjQKLSNkZWZpbmUJQlBIWV9SRl9PVkVSUklERTIJMHg2NQotI2RlZmluZQlCUEhZX1NQVVJfQ0FOQ0VMX0NUUkwJMHg2NgotI2RlZmluZQlCUEhZX0ZJTkVfRElHSUdBSU5fQ1RSTAkweDY3Ci0jZGVmaW5lCUJQSFlfUlNTSV9MVVQJCTB4ODgKLSNkZWZpbmUJQlBIWV9SU1NJX0xVVF9FTkQJMHhhNwotI2RlZmluZQlCUEhZX1RTU0lfTFVUCQkweGE4Ci0jZGVmaW5lCUJQSFlfVFNTSV9MVVRfRU5ECTB4YzcKLSNkZWZpbmUJQlBIWV9UU1NJMlBXUl9MVVQJMHgzODAKLSNkZWZpbmUJQlBIWV9UU1NJMlBXUl9MVVRfRU5ECTB4MzlmCi0jZGVmaW5lCUJQSFlfTE9DT01QX0xVVAkJMHgzYTAKLSNkZWZpbmUJQlBIWV9MT0NPTVBfTFVUX0VORAkweDNiZgotI2RlZmluZQlCUEhZX1RYR0FJTl9MVVQJCTB4M2MwCi0jZGVmaW5lCUJQSFlfVFhHQUlOX0xVVF9FTkQJMHgzZmYKLQotLyogQml0cyBpbiBCQl9DT05GSUc6ICovCi0jZGVmaW5lCVBIWV9CQkNfQU5UX01BU0sJMHgwMTgwCi0jZGVmaW5lCVBIWV9CQkNfQU5UX1NISUZUCTcKLSNkZWZpbmUJQkJfREFSV0lOCQkweDEwMDAKLSNkZWZpbmUgQkJDRkdfUkVTRVRDQ0EJCTB4NDAwMAotI2RlZmluZSBCQkNGR19SRVNFVFJYCQkweDgwMDAKLQotLyogQml0cyBpbiBwaHl0ZXN0KDB4MGEpOiAqLwotI2RlZmluZQlUU1RfRERGUwkJMHgyMDAwCi0jZGVmaW5lCVRTVF9UWEZJTFQxCQkweDA4MDAKLSNkZWZpbmUJVFNUX1VOU0NSQU0JCTB4MDQwMAotI2RlZmluZQlUU1RfQ0FSUl9TVVBQCQkweDAyMDAKLSNkZWZpbmUJVFNUX0RDX0NPTVBfTE9PUAkweDAxMDAKLSNkZWZpbmUJVFNUX0xPT1BCQUNLCQkweDAwODAKLSNkZWZpbmUJVFNUX1RYRklMVDAJCTB4MDA0MAotI2RlZmluZQlUU1RfVFhURVNUX0VOQUJMRQkweDAwMjAKLSNkZWZpbmUJVFNUX1RYVEVTVF9SQVRFCQkweDAwMTgKLSNkZWZpbmUJVFNUX1RYVEVTVF9QSEFTRQkweDAwMDcKLQotLyogcGh5dGVzdCB0eFRlc3RSYXRlIHZhbHVlcyAqLwotI2RlZmluZQlUU1RfVFhURVNUX1JBVEVfMU1CUFMJMAotI2RlZmluZQlUU1RfVFhURVNUX1JBVEVfMk1CUFMJMQotI2RlZmluZQlUU1RfVFhURVNUX1JBVEVfNV81TUJQUwkyCi0jZGVmaW5lCVRTVF9UWFRFU1RfUkFURV8xMU1CUFMJMwotI2RlZmluZQlUU1RfVFhURVNUX1JBVEVfU0hJRlQJMwotCi0jZGVmaW5lIFNITV9CWVRfQ05UCTB4MgkvKiBJSFIgbG9jYXRpb24gKi8KLSNkZWZpbmUgTUFYX0JZVF9DTlQJMHg2MDAJLyogTWF4aW11bSBmcmFtZSBsZW4gKi8KLQotc3RydWN0IGQxMWNudCB7Ci0JdTMyIHR4ZnJhZzsKLQl1MzIgdHhtdWx0aTsKLQl1MzIgdHhmYWlsOwotCXUzMiB0eHJldHJ5OwotCXUzMiB0eHJldHJpZTsKLQl1MzIgcnhkdXA7Ci0JdTMyIHR4cnRzOwotCXUzMiB0eG5vY3RzOwotCXUzMiB0eG5vYWNrOwotCXUzMiByeGZyYWc7Ci0JdTMyIHJ4bXVsdGk7Ci0JdTMyIHJ4Y3JjOwotCXUzMiB0eGZybXNudDsKLQl1MzIgcnh1bmRlYzsKLX07Ci0KLSNlbmRpZgkJCQkvKiBfQlJDTV9EMTFfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvZG1hLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL2RtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTE3NjcxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvZG1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotCi0jaWYgZGVmaW5lZChfX21pcHNfXykKLSNpbmNsdWRlIDxhc20vYWRkcnNwYWNlLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGJyY211X3V0aWxzLmg+Ci0jaW5jbHVkZSA8YWl1dGlscy5oPgotI2luY2x1ZGUgInR5cGVzLmgiCi0jaW5jbHVkZSAiZG1hLmgiCi0KLS8qCi0gKiBFYWNoIGRlc2NyaXB0b3IgcmluZyBtdXN0IGJlIDhrQiBhbGlnbmVkLCBhbmQgZml0IHdpdGhpbiBhIGNvbnRpZ3VvdXMgOGtCIHBoeXNpY2FsIGFkZHJlc3MuCi0gKi8KLSNkZWZpbmUgRDY0UklOR0FMSUdOX0JJVFMJMTMKLSNkZWZpbmUJRDY0TUFYUklOR1NaCQkoMSA8PCBENjRSSU5HQUxJR05fQklUUykKLSNkZWZpbmUJRDY0UklOR0FMSUdOCQkoMSA8PCBENjRSSU5HQUxJR05fQklUUykKLQotI2RlZmluZQlENjRNQVhERAkoRDY0TUFYUklOR1NaIC8gc2l6ZW9mKHN0cnVjdCBkbWE2NGRlc2MpKQotCi0vKiB0cmFuc21pdCBjaGFubmVsIGNvbnRyb2wgKi8KLSNkZWZpbmUJRDY0X1hDX1hFCQkweDAwMDAwMDAxCS8qIHRyYW5zbWl0IGVuYWJsZSAqLwotI2RlZmluZQlENjRfWENfU0UJCTB4MDAwMDAwMDIJLyogdHJhbnNtaXQgc3VzcGVuZCByZXF1ZXN0ICovCi0jZGVmaW5lCUQ2NF9YQ19MRQkJMHgwMDAwMDAwNAkvKiBsb29wYmFjayBlbmFibGUgKi8KLSNkZWZpbmUJRDY0X1hDX0ZMCQkweDAwMDAwMDEwCS8qIGZsdXNoIHJlcXVlc3QgKi8KLSNkZWZpbmUJRDY0X1hDX1BECQkweDAwMDAwODAwCS8qIHBhcml0eSBjaGVjayBkaXNhYmxlICovCi0jZGVmaW5lCUQ2NF9YQ19BRQkJMHgwMDAzMDAwMAkvKiBhZGRyZXNzIGV4dGVuc2lvbiBiaXRzICovCi0jZGVmaW5lCUQ2NF9YQ19BRV9TSElGVAkJMTYKLQotLyogdHJhbnNtaXQgZGVzY3JpcHRvciB0YWJsZSBwb2ludGVyICovCi0jZGVmaW5lCUQ2NF9YUF9MRF9NQVNLCQkweDAwMDAwZmZmCS8qIGxhc3QgdmFsaWQgZGVzY3JpcHRvciAqLwotCi0vKiB0cmFuc21pdCBjaGFubmVsIHN0YXR1cyAqLwotI2RlZmluZQlENjRfWFMwX0NEX01BU0sJCTB4MDAwMDFmZmYJLyogY3VycmVudCBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KLSNkZWZpbmUJRDY0X1hTMF9YU19NQVNLCQkweGYwMDAwMDAwCS8qIHRyYW5zbWl0IHN0YXRlICovCi0jZGVmaW5lCUQ2NF9YUzBfWFNfU0hJRlQJCTI4Ci0jZGVmaW5lCUQ2NF9YUzBfWFNfRElTQUJMRUQJMHgwMDAwMDAwMAkvKiBkaXNhYmxlZCAqLwotI2RlZmluZQlENjRfWFMwX1hTX0FDVElWRQkweDEwMDAwMDAwCS8qIGFjdGl2ZSAqLwotI2RlZmluZQlENjRfWFMwX1hTX0lETEUJCTB4MjAwMDAwMDAJLyogaWRsZSB3YWl0ICovCi0jZGVmaW5lCUQ2NF9YUzBfWFNfU1RPUFBFRAkweDMwMDAwMDAwCS8qIHN0b3BwZWQgKi8KLSNkZWZpbmUJRDY0X1hTMF9YU19TVVNQCQkweDQwMDAwMDAwCS8qIHN1c3BlbmQgcGVuZGluZyAqLwotCi0jZGVmaW5lCUQ2NF9YUzFfQURfTUFTSwkJMHgwMDAwMWZmZgkvKiBhY3RpdmUgZGVzY3JpcHRvciAqLwotI2RlZmluZQlENjRfWFMxX1hFX01BU0sJCTB4ZjAwMDAwMDAJLyogdHJhbnNtaXQgZXJyb3JzICovCi0jZGVmaW5lCUQ2NF9YUzFfWEVfU0hJRlQJCTI4Ci0jZGVmaW5lCUQ2NF9YUzFfWEVfTk9FUlIJMHgwMDAwMDAwMAkvKiBubyBlcnJvciAqLwotI2RlZmluZQlENjRfWFMxX1hFX0RQRQkJMHgxMDAwMDAwMAkvKiBkZXNjcmlwdG9yIHByb3RvY29sIGVycm9yICovCi0jZGVmaW5lCUQ2NF9YUzFfWEVfREZVCQkweDIwMDAwMDAwCS8qIGRhdGEgZmlmbyB1bmRlcnJ1biAqLwotI2RlZmluZQlENjRfWFMxX1hFX0RURQkJMHgzMDAwMDAwMAkvKiBkYXRhIHRyYW5zZmVyIGVycm9yICovCi0jZGVmaW5lCUQ2NF9YUzFfWEVfREVTUkUJMHg0MDAwMDAwMAkvKiBkZXNjcmlwdG9yIHJlYWQgZXJyb3IgKi8KLSNkZWZpbmUJRDY0X1hTMV9YRV9DT1JFRQkweDUwMDAwMDAwCS8qIGNvcmUgZXJyb3IgKi8KLQotLyogcmVjZWl2ZSBjaGFubmVsIGNvbnRyb2wgKi8KLSNkZWZpbmUJRDY0X1JDX1JFCQkweDAwMDAwMDAxCS8qIHJlY2VpdmUgZW5hYmxlICovCi0jZGVmaW5lCUQ2NF9SQ19ST19NQVNLCQkweDAwMDAwMGZlCS8qIHJlY2VpdmUgZnJhbWUgb2Zmc2V0ICovCi0jZGVmaW5lCUQ2NF9SQ19ST19TSElGVAkJMQotI2RlZmluZQlENjRfUkNfRk0JCTB4MDAwMDAxMDAJLyogZGlyZWN0IGZpZm8gcmVjZWl2ZSAocGlvKSBtb2RlICovCi0jZGVmaW5lCUQ2NF9SQ19TSAkJMHgwMDAwMDIwMAkvKiBzZXBhcmF0ZSByeCBoZWFkZXIgZGVzY3JpcHRvciBlbmFibGUgKi8KLSNkZWZpbmUJRDY0X1JDX09DCQkweDAwMDAwNDAwCS8qIG92ZXJmbG93IGNvbnRpbnVlICovCi0jZGVmaW5lCUQ2NF9SQ19QRAkJMHgwMDAwMDgwMAkvKiBwYXJpdHkgY2hlY2sgZGlzYWJsZSAqLwotI2RlZmluZQlENjRfUkNfQUUJCTB4MDAwMzAwMDAJLyogYWRkcmVzcyBleHRlbnNpb24gYml0cyAqLwotI2RlZmluZQlENjRfUkNfQUVfU0hJRlQJCTE2Ci0KLS8qIGZsYWdzIGZvciBkbWEgY29udHJvbGxlciAqLwotI2RlZmluZSBETUFfQ1RSTF9QRU4JCSgxIDw8IDApCS8qIHBhcnRpdHkgZW5hYmxlICovCi0jZGVmaW5lIERNQV9DVFJMX1JPQwkJKDEgPDwgMSkJLyogcnggb3ZlcmZsb3cgY29udGludWUgKi8KLSNkZWZpbmUgRE1BX0NUUkxfUlhNVUxUSQkoMSA8PCAyKQkvKiBhbGxvdyByeCBzY2F0dGVyIHRvIG11bHRpcGxlIGRlc2NyaXB0b3JzICovCi0jZGVmaW5lIERNQV9DVFJMX1VORlJBTUVECSgxIDw8IDMpCS8qIFVuZnJhbWVkIFJ4L1R4IGRhdGEgKi8KLQotLyogcmVjZWl2ZSBkZXNjcmlwdG9yIHRhYmxlIHBvaW50ZXIgKi8KLSNkZWZpbmUJRDY0X1JQX0xEX01BU0sJCTB4MDAwMDBmZmYJLyogbGFzdCB2YWxpZCBkZXNjcmlwdG9yICovCi0KLS8qIHJlY2VpdmUgY2hhbm5lbCBzdGF0dXMgKi8KLSNkZWZpbmUJRDY0X1JTMF9DRF9NQVNLCQkweDAwMDAxZmZmCS8qIGN1cnJlbnQgZGVzY3JpcHRvciBwb2ludGVyICovCi0jZGVmaW5lCUQ2NF9SUzBfUlNfTUFTSwkJMHhmMDAwMDAwMAkvKiByZWNlaXZlIHN0YXRlICovCi0jZGVmaW5lCUQ2NF9SUzBfUlNfU0hJRlQJCTI4Ci0jZGVmaW5lCUQ2NF9SUzBfUlNfRElTQUJMRUQJMHgwMDAwMDAwMAkvKiBkaXNhYmxlZCAqLwotI2RlZmluZQlENjRfUlMwX1JTX0FDVElWRQkweDEwMDAwMDAwCS8qIGFjdGl2ZSAqLwotI2RlZmluZQlENjRfUlMwX1JTX0lETEUJCTB4MjAwMDAwMDAJLyogaWRsZSB3YWl0ICovCi0jZGVmaW5lCUQ2NF9SUzBfUlNfU1RPUFBFRAkweDMwMDAwMDAwCS8qIHN0b3BwZWQgKi8KLSNkZWZpbmUJRDY0X1JTMF9SU19TVVNQCQkweDQwMDAwMDAwCS8qIHN1c3BlbmQgcGVuZGluZyAqLwotCi0jZGVmaW5lCUQ2NF9SUzFfQURfTUFTSwkJMHgwMDAxZmZmZgkvKiBhY3RpdmUgZGVzY3JpcHRvciAqLwotI2RlZmluZQlENjRfUlMxX1JFX01BU0sJCTB4ZjAwMDAwMDAJLyogcmVjZWl2ZSBlcnJvcnMgKi8KLSNkZWZpbmUJRDY0X1JTMV9SRV9TSElGVAkJMjgKLSNkZWZpbmUJRDY0X1JTMV9SRV9OT0VSUgkweDAwMDAwMDAwCS8qIG5vIGVycm9yICovCi0jZGVmaW5lCUQ2NF9SUzFfUkVfRFBPCQkweDEwMDAwMDAwCS8qIGRlc2NyaXB0b3IgcHJvdG9jb2wgZXJyb3IgKi8KLSNkZWZpbmUJRDY0X1JTMV9SRV9ERlUJCTB4MjAwMDAwMDAJLyogZGF0YSBmaWZvIG92ZXJmbG93ICovCi0jZGVmaW5lCUQ2NF9SUzFfUkVfRFRFCQkweDMwMDAwMDAwCS8qIGRhdGEgdHJhbnNmZXIgZXJyb3IgKi8KLSNkZWZpbmUJRDY0X1JTMV9SRV9ERVNSRQkweDQwMDAwMDAwCS8qIGRlc2NyaXB0b3IgcmVhZCBlcnJvciAqLwotI2RlZmluZQlENjRfUlMxX1JFX0NPUkVFCTB4NTAwMDAwMDAJLyogY29yZSBlcnJvciAqLwotCi0vKiBmaWZvYWRkciAqLwotI2RlZmluZQlENjRfRkFfT0ZGX01BU0sJCTB4ZmZmZgkvKiBvZmZzZXQgKi8KLSNkZWZpbmUJRDY0X0ZBX1NFTF9NQVNLCQkweGYwMDAwCS8qIHNlbGVjdCAqLwotI2RlZmluZQlENjRfRkFfU0VMX1NISUZUCTE2Ci0jZGVmaW5lCUQ2NF9GQV9TRUxfWERECQkweDAwMDAwCS8qIHRyYW5zbWl0IGRtYSBkYXRhICovCi0jZGVmaW5lCUQ2NF9GQV9TRUxfWERQCQkweDEwMDAwCS8qIHRyYW5zbWl0IGRtYSBwb2ludGVycyAqLwotI2RlZmluZQlENjRfRkFfU0VMX1JERAkJMHg0MDAwMAkvKiByZWNlaXZlIGRtYSBkYXRhICovCi0jZGVmaW5lCUQ2NF9GQV9TRUxfUkRQCQkweDUwMDAwCS8qIHJlY2VpdmUgZG1hIHBvaW50ZXJzICovCi0jZGVmaW5lCUQ2NF9GQV9TRUxfWEZECQkweDgwMDAwCS8qIHRyYW5zbWl0IGZpZm8gZGF0YSAqLwotI2RlZmluZQlENjRfRkFfU0VMX1hGUAkJMHg5MDAwMAkvKiB0cmFuc21pdCBmaWZvIHBvaW50ZXJzICovCi0jZGVmaW5lCUQ2NF9GQV9TRUxfUkZECQkweGMwMDAwCS8qIHJlY2VpdmUgZmlmbyBkYXRhICovCi0jZGVmaW5lCUQ2NF9GQV9TRUxfUkZQCQkweGQwMDAwCS8qIHJlY2VpdmUgZmlmbyBwb2ludGVycyAqLwotI2RlZmluZQlENjRfRkFfU0VMX1JTRAkJMHhlMDAwMAkvKiByZWNlaXZlIGZyYW1lIHN0YXR1cyBkYXRhICovCi0jZGVmaW5lCUQ2NF9GQV9TRUxfUlNQCQkweGYwMDAwCS8qIHJlY2VpdmUgZnJhbWUgc3RhdHVzIHBvaW50ZXJzICovCi0KLS8qIGRlc2NyaXB0b3IgY29udHJvbCBmbGFncyAxICovCi0jZGVmaW5lIEQ2NF9DVFJMX0NPUkVGTEFHUwkweDBmZjAwMDAwCS8qIGNvcmUgc3BlY2lmaWMgZmxhZ3MgKi8KLSNkZWZpbmUJRDY0X0NUUkwxX0VPVAkJKCh1MzIpMSA8PCAyOCkJLyogZW5kIG9mIGRlc2NyaXB0b3IgdGFibGUgKi8KLSNkZWZpbmUJRDY0X0NUUkwxX0lPQwkJKCh1MzIpMSA8PCAyOSkJLyogaW50ZXJydXB0IG9uIGNvbXBsZXRpb24gKi8KLSNkZWZpbmUJRDY0X0NUUkwxX0VPRgkJKCh1MzIpMSA8PCAzMCkJLyogZW5kIG9mIGZyYW1lICovCi0jZGVmaW5lCUQ2NF9DVFJMMV9TT0YJCSgodTMyKTEgPDwgMzEpCS8qIHN0YXJ0IG9mIGZyYW1lICovCi0KLS8qIGRlc2NyaXB0b3IgY29udHJvbCBmbGFncyAyICovCi0jZGVmaW5lCUQ2NF9DVFJMMl9CQ19NQVNLCTB4MDAwMDdmZmYJLyogYnVmZmVyIGJ5dGUgY291bnQuIHJlYWwgZGF0YSBsZW4gbXVzdCA8PSAxNktCICovCi0jZGVmaW5lCUQ2NF9DVFJMMl9BRQkJMHgwMDAzMDAwMAkvKiBhZGRyZXNzIGV4dGVuc2lvbiBiaXRzICovCi0jZGVmaW5lCUQ2NF9DVFJMMl9BRV9TSElGVAkxNgotI2RlZmluZSBENjRfQ1RSTDJfUEFSSVRZCTB4MDAwNDAwMDAJLyogcGFyaXR5IGJpdCAqLwotCi0vKiBjb250cm9sIGZsYWdzIGluIHRoZSByYW5nZSBbMjc6MjBdIGFyZSBjb3JlLXNwZWNpZmljIGFuZCBub3QgZGVmaW5lZCBoZXJlICovCi0jZGVmaW5lCUQ2NF9DVFJMX0NPUkVfTUFTSwkweDBmZjAwMDAwCi0KLSNkZWZpbmUgRDY0X1JYX0ZSTV9TVFNfTEVOCTB4MDAwMGZmZmYJLyogZnJhbWUgbGVuZ3RoIG1hc2sgKi8KLSNkZWZpbmUgRDY0X1JYX0ZSTV9TVFNfT1ZGTAkweDAwODAwMDAwCS8qIFJ4T3ZlckZsb3cgKi8KLSNkZWZpbmUgRDY0X1JYX0ZSTV9TVFNfRFNDUkNOVAkweDBmMDAwMDAwICAvKiBuby4gb2YgZGVzY3JpcHRvcnMgdXNlZCAtIDEgKi8KLSNkZWZpbmUgRDY0X1JYX0ZSTV9TVFNfREFUQVRZUEUJMHhmMDAwMDAwMAkvKiBjb3JlLWRlcGVuZGVudCBkYXRhIHR5cGUgKi8KLQotI2RlZmluZQlETUFERFJXSURUSF8zMCAgMzAJLyogMzAtYml0IGFkZHJlc3NpbmcgY2FwYWJpbGl0eSAqLwotI2RlZmluZQlETUFERFJXSURUSF8zMiAgMzIJLyogMzItYml0IGFkZHJlc3NpbmcgY2FwYWJpbGl0eSAqLwotI2RlZmluZQlETUFERFJXSURUSF82MyAgNjMJLyogNjQtYml0IGFkZHJlc3NpbmcgY2FwYWJpbGl0eSAqLwotI2RlZmluZQlETUFERFJXSURUSF82NCAgNjQJLyogNjQtYml0IGFkZHJlc3NpbmcgY2FwYWJpbGl0eSAqLwotCi0vKiBwYWNrZXQgaGVhZHJvb20gbmVjZXNzYXJ5IHRvIGFjY29tbW9kYXRlIHRoZSBsYXJnZXN0IGhlYWRlciBpbiB0aGUgc3lzdGVtLCAoaS5lIFRYT0ZGKS4KLSAqIEJ5IGRvaW5nLCB3ZSBhdm9pZCB0aGUgbmVlZCAgdG8gYWxsb2NhdGUgYW4gZXh0cmEgYnVmZmVyIGZvciB0aGUgaGVhZGVyIHdoZW4gYnJpZGdpbmcgdG8gV0wuCi0gKiBUaGVyZSBpcyBhIGNvbXBpbGUgdGltZSBjaGVjayBpbiB3bGMuYyB3aGljaCBlbnN1cmUgdGhhdCB0aGlzIHZhbHVlIGlzIGF0IGxlYXN0IGFzIGJpZwotICogYXMgVFhPRkYuIFRoaXMgdmFsdWUgaXMgdXNlZCBpbiBkbWFfcnhmaWxsIChkbWEuYykuCi0gKi8KLQotI2RlZmluZSBCQ01FWFRSQUhEUk9PTSAxNzIKLQotLyogZGVidWcvdHJhY2UgKi8KLSNpZmRlZiBCQ01EQkcKLSNkZWZpbmUJRE1BX0VSUk9SKGFyZ3MpIFwKLQlkbyB7IFwKLQkJaWYgKCEoKmRpLT5tc2dfbGV2ZWwgJiAxKSkgXAotCQkJOyBcCi0JCWVsc2UgXAotCQkJcHJpbnRrIGFyZ3M7IFwKLQl9IHdoaWxlICgwKQotI2RlZmluZQlETUFfVFJBQ0UoYXJncykgXAotCWRvIHsgXAotCQlpZiAoISgqZGktPm1zZ19sZXZlbCAmIDIpKSBcCi0JCQk7IFwKLQkJZWxzZSBcCi0JCQlwcmludGsgYXJnczsgXAotCX0gd2hpbGUgKDApCi0jZWxzZQotI2RlZmluZQlETUFfRVJST1IoYXJncykKLSNkZWZpbmUJRE1BX1RSQUNFKGFyZ3MpCi0jZW5kaWYJCQkJLyogQkNNREJHICovCi0KLSNkZWZpbmUJRE1BX05PTkUoYXJncykKLQotdHlwZWRlZiB1bnNpZ25lZCBsb25nIGRtYWFkZHJfdDsKLSNkZWZpbmUgUEhZU0FERFJISShfcGEpICgwKQotI2RlZmluZSBQSFlTQUREUkhJU0VUKF9wYSwgX3ZhbCkKLSNkZWZpbmUgUEhZU0FERFJMTyhfcGEpICgoX3BhKSkKLSNkZWZpbmUgUEhZU0FERFJMT1NFVChfcGEsIF92YWwpIFwKLQlkbyB7IFwKLQkJKF9wYSkgPSAoX3ZhbCk7CQkJXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgZDY0dHhyZWdzCWRyZWdzLmQ2NF91LnR4cmVnc182NAotI2RlZmluZSBkNjRyeHJlZ3MJZHJlZ3MuZDY0X3UucnhyZWdzXzY0Ci0jZGVmaW5lIHR4ZDY0CQlkcmVncy5kNjRfdS50eGRfNjQKLSNkZWZpbmUgcnhkNjQJCWRyZWdzLmQ2NF91LnJ4ZF82NAotCi0vKiBkZWZhdWx0IGRtYSBtZXNzYWdlIGxldmVsIChpZiBpbnB1dCBtc2dfbGV2ZWwgcG9pbnRlciBpcyBudWxsIGluIGRtYV9hdHRhY2goKSkgKi8KLXN0YXRpYyB1aW50IGRtYV9tc2dfbGV2ZWw7Ci0KLSNkZWZpbmUJTUFYTkFNRUwJOAkvKiA4IGNoYXIgbmFtZXMgKi8KLQotI2RlZmluZQlESV9JTkZPKGRtYWgpCSgoZG1hX2luZm9fdCAqKWRtYWgpCi0KLSNkZWZpbmUgUl9TTShyKQkJKCoocikpCi0jZGVmaW5lIFdfU00ociwgdikJKCoocikgPSAodikpCi0KLS8qIE9uZSBwaHlzaWNhbCBETUEgc2VnbWVudCAqLwotc3RydWN0IGRtYV9zZWcgewotCWRtYWFkZHJfdCBhZGRyOwotCXUzMiBsZW5ndGg7Ci19OwotCi1zdHJ1Y3QgZG1hX3NlZ19tYXAgewotCXZvaWQgKm9zaGRtYWg7CQkvKiBPcGFxdWUgaGFuZGxlIGZvciBPU0wgdG8gc3RvcmUgaXRzIGluZm9ybWF0aW9uICovCi0JdWludCBvcmlnc2l6ZTsJCS8qIFNpemUgb2YgdGhlIHZpcnR1YWwgcGFja2V0ICovCi0JdWludCBuc2VnczsKLQlzdHJ1Y3QgZG1hX3NlZyBzZWdzW01BWF9ETUFfU0VHU107Ci19OwotCi0vKgotICogRE1BIERlc2NyaXB0b3IKLSAqIERlc2NyaXB0b3JzIGFyZSBvbmx5IHJlYWQgYnkgdGhlIGhhcmR3YXJlLCBuZXZlciB3cml0dGVuIGJhY2suCi0gKi8KLXN0cnVjdCBkbWE2NGRlc2MgewotCXUzMiBjdHJsMTsJCS8qIG1pc2MgY29udHJvbCBiaXRzICYgYnVmY291bnQgKi8KLQl1MzIgY3RybDI7CQkvKiBidWZmZXIgY291bnQgYW5kIGFkZHJlc3MgZXh0ZW5zaW9uICovCi0JdTMyIGFkZHJsb3c7CQkvKiBtZW1vcnkgYWRkcmVzcyBvZiB0aGUgZGF0ZSBidWZmZXIsIGJpdHMgMzE6MCAqLwotCXUzMiBhZGRyaGlnaDsJLyogbWVtb3J5IGFkZHJlc3Mgb2YgdGhlIGRhdGUgYnVmZmVyLCBiaXRzIDYzOjMyICovCi19OwotCi0vKiBkbWEgZW5naW5lIHNvZnR3YXJlIHN0YXRlICovCi1zdHJ1Y3QgZG1hX2luZm8gewotCXN0cnVjdCBkbWFfcHViIGRtYTsgLyogZXhwb3J0ZWQgc3RydWN0dXJlICovCi0JdWludCAqbXNnX2xldmVsOwkvKiBtZXNzYWdlIGxldmVsIHBvaW50ZXIgKi8KLQljaGFyIG5hbWVbTUFYTkFNRUxdOwkvKiBjYWxsZXJzIG5hbWUgZm9yIGRpYWcgbXNncyAqLwotCi0Jdm9pZCAqcGJ1czsJCS8qIGJ1cyBoYW5kbGUgKi8KLQotCWJvb2wgZG1hNjQ7CQkvKiB0aGlzIGRtYSBlbmdpbmUgaXMgb3BlcmF0aW5nIGluIDY0LWJpdCBtb2RlICovCi0JYm9vbCBhZGRyZXh0OwkJLyogdGhpcyBkbWEgZW5naW5lIHN1cHBvcnRzIERtYUV4dGVuZGVkQWRkckNoYW5nZXMgKi8KLQotCXVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCWRtYTY0cmVnc190ICp0eHJlZ3NfNjQ7CS8qIDY0LWJpdCBkbWEgdHggZW5naW5lIHJlZ2lzdGVycyAqLwotCQkJZG1hNjRyZWdzX3QgKnJ4cmVnc182NDsJLyogNjQtYml0IGRtYSByeCBlbmdpbmUgcmVnaXN0ZXJzICovCi0JCQkvKiBwb2ludGVyIHRvIGRtYTY0IHR4IGRlc2NyaXB0b3IgcmluZyAqLwotCQkJc3RydWN0IGRtYTY0ZGVzYyAqdHhkXzY0OwotCQkJLyogcG9pbnRlciB0byBkbWE2NCByeCBkZXNjcmlwdG9yIHJpbmcgKi8KLQkJCXN0cnVjdCBkbWE2NGRlc2MgKnJ4ZF82NDsKLQkJfSBkNjRfdTsKLQl9IGRyZWdzOwotCi0JdTE2IGRtYWRlc2NfYWxpZ247CS8qIGFsaWdubWVudCByZXF1aXJlbWVudCBmb3IgZG1hIGRlc2NyaXB0b3JzICovCi0KLQl1MTYgbnR4ZDsJCS8qICMgdHggZGVzY3JpcHRvcnMgdHVuYWJsZSAqLwotCXUxNiB0eGluOwkJLyogaW5kZXggb2YgbmV4dCBkZXNjcmlwdG9yIHRvIHJlY2xhaW0gKi8KLQl1MTYgdHhvdXQ7CQkvKiBpbmRleCBvZiBuZXh0IGRlc2NyaXB0b3IgdG8gcG9zdCAqLwotCXZvaWQgKip0eHA7CQkvKiBwb2ludGVyIHRvIHBhcmFsbGVsIGFycmF5IG9mIHBvaW50ZXJzIHRvIHBhY2tldHMgKi8KLQlzdHJ1Y3QgZG1hX3NlZ19tYXAgKnR4cF9kbWFoOwkvKiBETUEgTUFQIG1ldGEtZGF0YSBoYW5kbGUgKi8KLQlkbWFhZGRyX3QgdHhkcGE7CS8qIEFsaWduZWQgcGh5c2ljYWwgYWRkcmVzcyBvZiBkZXNjcmlwdG9yIHJpbmcgKi8KLQlkbWFhZGRyX3QgdHhkcGFvcmlnOwkvKiBPcmlnaW5hbCBwaHlzaWNhbCBhZGRyZXNzIG9mIGRlc2NyaXB0b3IgcmluZyAqLwotCXUxNiB0eGRhbGlnbjsJLyogI2J5dGVzIGFkZGVkIHRvIGFsbG9jJ2QgbWVtIHRvIGFsaWduIHR4ZCAqLwotCXUzMiB0eGRhbGxvYzsJLyogI2J5dGVzIGFsbG9jYXRlZCBmb3IgdGhlIHJpbmcgKi8KLQl1MzIgeG10cHRyYmFzZTsJLyogV2hlbiB1c2luZyB1bmFsaWduZWQgZGVzY3JpcHRvcnMsIHRoZSBwdHIgcmVnaXN0ZXIKLQkJCQkgKiBpcyBub3QganVzdCBhbiBpbmRleCwgaXQgbmVlZHMgYWxsIDEzIGJpdHMgdG8gYmUKLQkJCQkgKiBhbiBvZmZzZXQgZnJvbSB0aGUgYWRkciByZWdpc3Rlci4KLQkJCQkgKi8KLQotCXUxNiBucnhkOwkJLyogIyByeCBkZXNjcmlwdG9ycyB0dW5hYmxlICovCi0JdTE2IHJ4aW47CQkvKiBpbmRleCBvZiBuZXh0IGRlc2NyaXB0b3IgdG8gcmVjbGFpbSAqLwotCXUxNiByeG91dDsJCS8qIGluZGV4IG9mIG5leHQgZGVzY3JpcHRvciB0byBwb3N0ICovCi0Jdm9pZCAqKnJ4cDsJCS8qIHBvaW50ZXIgdG8gcGFyYWxsZWwgYXJyYXkgb2YgcG9pbnRlcnMgdG8gcGFja2V0cyAqLwotCXN0cnVjdCBkbWFfc2VnX21hcCAqcnhwX2RtYWg7CS8qIERNQSBNQVAgbWV0YS1kYXRhIGhhbmRsZSAqLwotCWRtYWFkZHJfdCByeGRwYTsJLyogQWxpZ25lZCBwaHlzaWNhbCBhZGRyZXNzIG9mIGRlc2NyaXB0b3IgcmluZyAqLwotCWRtYWFkZHJfdCByeGRwYW9yaWc7CS8qIE9yaWdpbmFsIHBoeXNpY2FsIGFkZHJlc3Mgb2YgZGVzY3JpcHRvciByaW5nICovCi0JdTE2IHJ4ZGFsaWduOwkvKiAjYnl0ZXMgYWRkZWQgdG8gYWxsb2MnZCBtZW0gdG8gYWxpZ24gcnhkICovCi0JdTMyIHJ4ZGFsbG9jOwkvKiAjYnl0ZXMgYWxsb2NhdGVkIGZvciB0aGUgcmluZyAqLwotCXUzMiByY3ZwdHJiYXNlOwkvKiBCYXNlIGZvciBwdHIgcmVnIHdoZW4gdXNpbmcgdW5hbGlnbmVkIGRlc2NyaXB0b3JzICovCi0KLQkvKiB0dW5hYmxlcyAqLwotCXVuc2lnbmVkIGludCByeGJ1ZnNpemU7CS8qIHJ4IGJ1ZmZlciBzaXplIGluIGJ5dGVzLAotCQkJCSAqIG5vdCBpbmNsdWRpbmcgdGhlIGV4dHJhIGhlYWRyb29tCi0JCQkJICovCi0JdWludCByeGV4dHJhaGRycm9vbTsJLyogZXh0cmEgcnggaGVhZHJvb20sIHJldmVyc2V2ZWQgdG8gYXNzaXN0IHVwcGVyIHN0YWNrCi0JCQkJICogIGUuZy4gc29tZSByeCBwa3QgYnVmZmVycyB3aWxsIGJlIGJyaWRnZWQgdG8gdHggc2lkZQotCQkJCSAqICB3aXRob3V0IGJ5dGUgY29weWluZy4gVGhlIGV4dHJhIGhlYWRyb29tIG5lZWRzIHRvIGJlCi0JCQkJICogIGxhcmdlIGVub3VnaCB0byBmaXQgdHhoZWFkZXIgbmVlZHMuCi0JCQkJICogIFNvbWUgZG9uZ2xlIGRyaXZlciBtYXkgbm90IG5lZWQgaXQuCi0JCQkJICovCi0JdWludCBucnhwb3N0OwkJLyogIyByeCBidWZmZXJzIHRvIGtlZXAgcG9zdGVkICovCi0JdW5zaWduZWQgaW50IHJ4b2Zmc2V0OwkvKiByeGNvbnRyb2wgb2Zmc2V0ICovCi0JdWludCBkZG9mZnNldGxvdzsJLyogYWRkIHRvIGdldCBkbWEgYWRkcmVzcyBvZiBkZXNjcmlwdG9yIHJpbmcsIGxvdyAzMiBiaXRzICovCi0JdWludCBkZG9mZnNldGhpZ2g7CS8qICAgaGlnaCAzMiBiaXRzICovCi0JdWludCBkYXRhb2Zmc2V0bG93OwkvKiBhZGQgdG8gZ2V0IGRtYSBhZGRyZXNzIG9mIGRhdGEgYnVmZmVyLCBsb3cgMzIgYml0cyAqLwotCXVpbnQgZGF0YW9mZnNldGhpZ2g7CS8qICAgaGlnaCAzMiBiaXRzICovCi0JYm9vbCBhbGlnbmRlc2NfNGs7CS8qIGRlc2NyaXB0b3IgYmFzZSBuZWVkIHRvIGJlIGFsaWduZWQgb3Igbm90ICovCi19OwotCi0vKiBETUEgU2NhdHRlci1nYXRoZXIgbGlzdCBpcyBzdXBwb3J0ZWQuIE5vdGUgdGhpcyBpcyBsaW1pdGVkIHRvIFRYIGRpcmVjdGlvbiBvbmx5ICovCi0jaWZkZWYgQkNNRE1BU0dMSVNUT1NMCi0jZGVmaW5lIERNQVNHTElTVF9FTkFCIHRydWUKLSNlbHNlCi0jZGVmaW5lIERNQVNHTElTVF9FTkFCIGZhbHNlCi0jZW5kaWYJCQkJLyogQkNNRE1BU0dMSVNUT1NMICovCi0KLS8qIGRlc2NyaXB0b3IgYnVtcGluZyBtYWNyb3MgKi8KLSNkZWZpbmUJWFhEKHgsIG4pCSgoeCkgJiAoKG4pIC0gMSkpCS8qIGZhc3RlciB0aGFuICUsIGJ1dCBuIG11c3QgYmUgcG93ZXIgb2YgMiAqLwotI2RlZmluZQlUWEQoeCkJCVhYRCgoeCksIGRpLT5udHhkKQotI2RlZmluZQlSWEQoeCkJCVhYRCgoeCksIGRpLT5ucnhkKQotI2RlZmluZQlORVhUVFhEKGkpCVRYRCgoaSkgKyAxKQotI2RlZmluZQlQUkVWVFhEKGkpCVRYRCgoaSkgLSAxKQotI2RlZmluZQlORVhUUlhEKGkpCVJYRCgoaSkgKyAxKQotI2RlZmluZQlQUkVWUlhEKGkpCVJYRCgoaSkgLSAxKQotCi0jZGVmaW5lCU5UWERBQ1RJVkUoaCwgdCkJVFhEKCh0KSAtIChoKSkKLSNkZWZpbmUJTlJYREFDVElWRShoLCB0KQlSWEQoKHQpIC0gKGgpKQotCi0vKiBtYWNyb3MgdG8gY29udmVydCBiZXR3ZWVuIGJ5dGUgb2Zmc2V0cyBhbmQgaW5kZXhlcyAqLwotI2RlZmluZQlCMkkoYnl0ZXMsIHR5cGUpCSgoYnl0ZXMpIC8gc2l6ZW9mKHR5cGUpKQotI2RlZmluZQlJMkIoaW5kZXgsIHR5cGUpCSgoaW5kZXgpICogc2l6ZW9mKHR5cGUpKQotCi0jZGVmaW5lCVBDSTMyQUREUl9ISUdICQkweGMwMDAwMDAwCS8qIGFkZHJlc3NbMzE6MzBdICovCi0jZGVmaW5lCVBDSTMyQUREUl9ISUdIX1NISUZUCTMwCS8qIGFkZHJlc3NbMzE6MzBdICovCi0KLSNkZWZpbmUJUENJNjRBRERSX0hJR0gJCTB4ODAwMDAwMDAJLyogYWRkcmVzc1s2M10gKi8KLSNkZWZpbmUJUENJNjRBRERSX0hJR0hfU0hJRlQJMzEJLyogYWRkcmVzc1s2M10gKi8KLQotLyogQ29tbW9uIHByb3RvdHlwZXMgKi8KLXN0YXRpYyBib29sIF9kbWFfaXNhZGRyZXh0KHN0cnVjdCBkbWFfaW5mbyAqZGkpOwotc3RhdGljIGJvb2wgX2RtYV9kZXNjcmlwdG9yX2FsaWduKHN0cnVjdCBkbWFfaW5mbyAqZGkpOwotc3RhdGljIGJvb2wgX2RtYV9hbGxvYyhzdHJ1Y3QgZG1hX2luZm8gKmRpLCB1aW50IGRpcmVjdGlvbik7Ci1zdGF0aWMgdm9pZCBfZG1hX2RldGFjaChzdHJ1Y3QgZG1hX2luZm8gKmRpKTsKLXN0YXRpYyB2b2lkIF9kbWFfZGR0YWJsZV9pbml0KHN0cnVjdCBkbWFfaW5mbyAqZGksIHVpbnQgZGlyZWN0aW9uLAotCQkJICAgICAgZG1hYWRkcl90IHBhKTsKLXN0YXRpYyB2b2lkIF9kbWFfcnhpbml0KHN0cnVjdCBkbWFfaW5mbyAqZGkpOwotc3RhdGljIHZvaWQgKl9kbWFfcngoc3RydWN0IGRtYV9pbmZvICpkaSk7Ci1zdGF0aWMgYm9vbCBfZG1hX3J4ZmlsbChzdHJ1Y3QgZG1hX2luZm8gKmRpKTsKLXN0YXRpYyB2b2lkIF9kbWFfcnhyZWNsYWltKHN0cnVjdCBkbWFfaW5mbyAqZGkpOwotc3RhdGljIHZvaWQgX2RtYV9yeGVuYWJsZShzdHJ1Y3QgZG1hX2luZm8gKmRpKTsKLXN0YXRpYyB2b2lkICpfZG1hX2dldG5leHRyeHAoc3RydWN0IGRtYV9pbmZvICpkaSwgYm9vbCBmb3JjZWFsbCk7Ci1zdGF0aWMgdm9pZCBfZG1hX3J4X3BhcmFtX2dldChzdHJ1Y3QgZG1hX2luZm8gKmRpLCB1MTYgKnJ4b2Zmc2V0LAotCQkJICAgICAgdTE2ICpyeGJ1ZnNpemUpOwotCi1zdGF0aWMgdm9pZCBfZG1hX3R4YmxvY2soc3RydWN0IGRtYV9pbmZvICpkaSk7Ci1zdGF0aWMgdm9pZCBfZG1hX3R4dW5ibG9jayhzdHJ1Y3QgZG1hX2luZm8gKmRpKTsKLXN0YXRpYyB1aW50IF9kbWFfdHhhY3RpdmUoc3RydWN0IGRtYV9pbmZvICpkaSk7Ci1zdGF0aWMgdWludCBfZG1hX3J4YWN0aXZlKHN0cnVjdCBkbWFfaW5mbyAqZGkpOwotc3RhdGljIHVpbnQgX2RtYV90eHBlbmRpbmcoc3RydWN0IGRtYV9pbmZvICpkaSk7Ci1zdGF0aWMgdWludCBfZG1hX3R4Y29tbWl0dGVkKHN0cnVjdCBkbWFfaW5mbyAqZGkpOwotCi1zdGF0aWMgdm9pZCAqX2RtYV9wZWVrbmV4dHR4cChzdHJ1Y3QgZG1hX2luZm8gKmRpKTsKLXN0YXRpYyB2b2lkICpfZG1hX3BlZWtuZXh0cnhwKHN0cnVjdCBkbWFfaW5mbyAqZGkpOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgX2RtYV9nZXR2YXIoc3RydWN0IGRtYV9pbmZvICpkaSwgY29uc3QgY2hhciAqbmFtZSk7Ci1zdGF0aWMgdm9pZCBfZG1hX2NvdW50ZXJyZXNldChzdHJ1Y3QgZG1hX2luZm8gKmRpKTsKLXN0YXRpYyB2b2lkIF9kbWFfZmlmb2xvb3BiYWNrZW5hYmxlKHN0cnVjdCBkbWFfaW5mbyAqZGkpOwotc3RhdGljIHVpbnQgX2RtYV9jdHJsZmxhZ3Moc3RydWN0IGRtYV9pbmZvICpkaSwgdWludCBtYXNrLCB1aW50IGZsYWdzKTsKLXN0YXRpYyB1OCBkbWFfYWxpZ25fc2l6ZXRvYml0cyh1aW50IHNpemUpOwotc3RhdGljIHZvaWQgKmRtYV9yaW5nYWxsb2Moc3RydWN0IGRtYV9pbmZvICpkaSwgdTMyIGJvdW5kYXJ5LCB1aW50IHNpemUsCi0JCQkgICB1MTYgKmFsaWduYml0cywgdWludCAqYWxsb2NlZCwKLQkJCSAgIGRtYWFkZHJfdCAqZGVzY3BhKTsKLQotLyogUHJvdG90eXBlcyBmb3IgNjQtYml0IHJvdXRpbmVzICovCi1zdGF0aWMgYm9vbCBkbWE2NF9hbGxvYyhzdHJ1Y3QgZG1hX2luZm8gKmRpLCB1aW50IGRpcmVjdGlvbik7Ci1zdGF0aWMgYm9vbCBkbWE2NF90eHJlc2V0KHN0cnVjdCBkbWFfaW5mbyAqZGkpOwotc3RhdGljIGJvb2wgZG1hNjRfcnhyZXNldChzdHJ1Y3QgZG1hX2luZm8gKmRpKTsKLXN0YXRpYyBib29sIGRtYTY0X3R4c3VzcGVuZGVkaWRsZShzdHJ1Y3QgZG1hX2luZm8gKmRpKTsKLXN0YXRpYyBpbnQgZG1hNjRfdHhmYXN0KHN0cnVjdCBkbWFfaW5mbyAqZGksIHN0cnVjdCBza19idWZmICpwMCwgYm9vbCBjb21taXQpOwotc3RhdGljIGludCBkbWE2NF90eHVuZnJhbWVkKHN0cnVjdCBkbWFfaW5mbyAqZGksIHZvaWQgKnAwLCB1aW50IGxlbiwKLQkJCSAgICBib29sIGNvbW1pdCk7Ci1zdGF0aWMgdm9pZCAqZG1hNjRfZ2V0cG9zKHN0cnVjdCBkbWFfaW5mbyAqZGksIGJvb2wgZGlyZWN0aW9uKTsKLXN0YXRpYyB2b2lkICpkbWE2NF9nZXRuZXh0dHhwKHN0cnVjdCBkbWFfaW5mbyAqZGksIGVudW0gdHhkX3JhbmdlIHJhbmdlKTsKLXN0YXRpYyB2b2lkICpkbWE2NF9nZXRuZXh0cnhwKHN0cnVjdCBkbWFfaW5mbyAqZGksIGJvb2wgZm9yY2VhbGwpOwotc3RhdGljIHZvaWQgZG1hNjRfdHhyb3RhdGUoc3RydWN0IGRtYV9pbmZvICpkaSk7Ci0KLXN0YXRpYyBib29sIGRtYTY0X3J4aWRsZShzdHJ1Y3QgZG1hX2luZm8gKmRpKTsKLXN0YXRpYyB2b2lkIGRtYTY0X3R4aW5pdChzdHJ1Y3QgZG1hX2luZm8gKmRpKTsKLXN0YXRpYyBib29sIGRtYTY0X3R4ZW5hYmxlZChzdHJ1Y3QgZG1hX2luZm8gKmRpKTsKLXN0YXRpYyB2b2lkIGRtYTY0X3R4c3VzcGVuZChzdHJ1Y3QgZG1hX2luZm8gKmRpKTsKLXN0YXRpYyB2b2lkIGRtYTY0X3R4cmVzdW1lKHN0cnVjdCBkbWFfaW5mbyAqZGkpOwotc3RhdGljIGJvb2wgZG1hNjRfdHhzdXNwZW5kZWQoc3RydWN0IGRtYV9pbmZvICpkaSk7Ci1zdGF0aWMgdm9pZCBkbWE2NF90eHJlY2xhaW0oc3RydWN0IGRtYV9pbmZvICpkaSwgZW51bSB0eGRfcmFuZ2UgcmFuZ2UpOwotc3RhdGljIGJvb2wgZG1hNjRfdHhzdG9wcGVkKHN0cnVjdCBkbWFfaW5mbyAqZGkpOwotc3RhdGljIGJvb2wgZG1hNjRfcnhzdG9wcGVkKHN0cnVjdCBkbWFfaW5mbyAqZGkpOwotc3RhdGljIGJvb2wgZG1hNjRfcnhlbmFibGVkKHN0cnVjdCBkbWFfaW5mbyAqZGkpOwotc3RhdGljIGJvb2wgX2RtYTY0X2FkZHJleHQoZG1hNjRyZWdzX3QgKmRtYTY0cmVncyk7Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIHBhcml0eTMyKHUzMiBkYXRhKTsKLQotY29uc3Qgc3RydWN0IGRpX2Zjbl9zIGRtYTY0cHJvYyA9IHsKLQkoZGlfZGV0YWNoX3QpIF9kbWFfZGV0YWNoLAotCShkaV90eGluaXRfdCkgZG1hNjRfdHhpbml0LAotCShkaV90eHJlc2V0X3QpIGRtYTY0X3R4cmVzZXQsCi0JKGRpX3R4ZW5hYmxlZF90KSBkbWE2NF90eGVuYWJsZWQsCi0JKGRpX3R4c3VzcGVuZF90KSBkbWE2NF90eHN1c3BlbmQsCi0JKGRpX3R4cmVzdW1lX3QpIGRtYTY0X3R4cmVzdW1lLAotCShkaV90eHN1c3BlbmRlZF90KSBkbWE2NF90eHN1c3BlbmRlZCwKLQkoZGlfdHhzdXNwZW5kZWRpZGxlX3QpIGRtYTY0X3R4c3VzcGVuZGVkaWRsZSwKLQkoZGlfdHhmYXN0X3QpIGRtYTY0X3R4ZmFzdCwKLQkoZGlfdHh1bmZyYW1lZF90KSBkbWE2NF90eHVuZnJhbWVkLAotCShkaV9nZXRwb3NfdCkgZG1hNjRfZ2V0cG9zLAotCShkaV90eHN0b3BwZWRfdCkgZG1hNjRfdHhzdG9wcGVkLAotCShkaV90eHJlY2xhaW1fdCkgZG1hNjRfdHhyZWNsYWltLAotCShkaV9nZXRuZXh0dHhwX3QpIGRtYTY0X2dldG5leHR0eHAsCi0JKGRpX3BlZWtuZXh0dHhwX3QpIF9kbWFfcGVla25leHR0eHAsCi0JKGRpX3R4YmxvY2tfdCkgX2RtYV90eGJsb2NrLAotCShkaV90eHVuYmxvY2tfdCkgX2RtYV90eHVuYmxvY2ssCi0JKGRpX3R4YWN0aXZlX3QpIF9kbWFfdHhhY3RpdmUsCi0JKGRpX3R4cm90YXRlX3QpIGRtYTY0X3R4cm90YXRlLAotCi0JKGRpX3J4aW5pdF90KSBfZG1hX3J4aW5pdCwKLQkoZGlfcnhyZXNldF90KSBkbWE2NF9yeHJlc2V0LAotCShkaV9yeGlkbGVfdCkgZG1hNjRfcnhpZGxlLAotCShkaV9yeHN0b3BwZWRfdCkgZG1hNjRfcnhzdG9wcGVkLAotCShkaV9yeGVuYWJsZV90KSBfZG1hX3J4ZW5hYmxlLAotCShkaV9yeGVuYWJsZWRfdCkgZG1hNjRfcnhlbmFibGVkLAotCShkaV9yeF90KSBfZG1hX3J4LAotCShkaV9yeGZpbGxfdCkgX2RtYV9yeGZpbGwsCi0JKGRpX3J4cmVjbGFpbV90KSBfZG1hX3J4cmVjbGFpbSwKLQkoZGlfZ2V0bmV4dHJ4cF90KSBfZG1hX2dldG5leHRyeHAsCi0JKGRpX3BlZWtuZXh0cnhwX3QpIF9kbWFfcGVla25leHRyeHAsCi0JKGRpX3J4cGFyYW1fZ2V0X3QpIF9kbWFfcnhfcGFyYW1fZ2V0LAotCi0JKGRpX2ZpZm9sb29wYmFja2VuYWJsZV90KSBfZG1hX2ZpZm9sb29wYmFja2VuYWJsZSwKLQkoZGlfZ2V0dmFyX3QpIF9kbWFfZ2V0dmFyLAotCShkaV9jb3VudGVycmVzZXRfdCkgX2RtYV9jb3VudGVycmVzZXQsCi0JKGRpX2N0cmxmbGFnc190KSBfZG1hX2N0cmxmbGFncywKLQlOVUxMLAotCU5VTEwsCi0JTlVMTCwKLQkoZGlfcnhhY3RpdmVfdCkgX2RtYV9yeGFjdGl2ZSwKLQkoZGlfdHhwZW5kaW5nX3QpIF9kbWFfdHhwZW5kaW5nLAotCShkaV90eGNvbW1pdHRlZF90KSBfZG1hX3R4Y29tbWl0dGVkLAotCTM5Ci19OwotCi1zdHJ1Y3QgZG1hX3B1YiAqZG1hX2F0dGFjaChjaGFyICpuYW1lLCBzdHJ1Y3Qgc2lfcHViICpzaWgsCi0JCSAgICAgdm9pZCAqZG1hcmVnc3R4LCB2b2lkICpkbWFyZWdzcngsIHVpbnQgbnR4ZCwKLQkJICAgICB1aW50IG5yeGQsIHVpbnQgcnhidWZzaXplLCBpbnQgcnhleHRoZWFkcm9vbSwKLQkJICAgICB1aW50IG5yeHBvc3QsIHVpbnQgcnhvZmZzZXQsIHVpbnQgKm1zZ19sZXZlbCkKLXsKLQlzdHJ1Y3QgZG1hX2luZm8gKmRpOwotCXVpbnQgc2l6ZTsKLQotCS8qIGFsbG9jYXRlIHByaXZhdGUgaW5mbyBzdHJ1Y3R1cmUgKi8KLQlkaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbWFfaW5mbyksIEdGUF9BVE9NSUMpOwotCWlmIChkaSA9PSBOVUxMKSB7Ci0jaWZkZWYgQkNNREJHCi0JCXByaW50ayhLRVJOX0VSUiAiZG1hX2F0dGFjaDogb3V0IG9mIG1lbW9yeVxuIik7Ci0jZW5kaWYKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JZGktPm1zZ19sZXZlbCA9IG1zZ19sZXZlbCA/IG1zZ19sZXZlbCA6ICZkbWFfbXNnX2xldmVsOwotCi0KLQlkaS0+ZG1hNjQgPSAoKGFpX2NvcmVfc2ZsYWdzKHNpaCwgMCwgMCkgJiBTSVNGX0RNQTY0KSA9PSBTSVNGX0RNQTY0KTsKLQotCS8qIGluaXQgZG1hIHJlZyBwb2ludGVyICovCi0JZGktPmQ2NHR4cmVncyA9IChkbWE2NHJlZ3NfdCAqKSBkbWFyZWdzdHg7Ci0JZGktPmQ2NHJ4cmVncyA9IChkbWE2NHJlZ3NfdCAqKSBkbWFyZWdzcng7Ci0JZGktPmRtYS5kaV9mbiA9IChjb25zdCBzdHJ1Y3QgZGlfZmNuX3MgKikmZG1hNjRwcm9jOwotCi0JLyogRGVmYXVsdCBmbGFncyAod2hpY2ggY2FuIGJlIGNoYW5nZWQgYnkgdGhlIGRyaXZlciBjYWxsaW5nIGRtYV9jdHJsZmxhZ3MKLQkgKiBiZWZvcmUgZW5hYmxlKTogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGJvdGggUnggT3ZlcmZsb3cgQ29udGludWUKLQkgKiBhbmQgUGFyaXR5IGFyZSBESVNBQkxFRC4KLQkgKiBzdXBwb3J0cyBpdC4KLQkgKi8KLQlkaS0+ZG1hLmRpX2ZuLT5jdHJsZmxhZ3MoJmRpLT5kbWEsIERNQV9DVFJMX1JPQyB8IERNQV9DVFJMX1BFTiwKLQkJCQkgMCk7Ci0KLQlETUFfVFJBQ0UoKCIlczogZG1hX2F0dGFjaDogJXMgZmxhZ3MgMHgleCBudHhkICVkIG5yeGQgJWQgIgotCQkgICAicnhidWZzaXplICVkIHJ4ZXh0aGVhZHJvb20gJWQgbnJ4cG9zdCAlZCByeG9mZnNldCAlZCAiCi0JCSAgICJkbWFyZWdzdHggJXAgZG1hcmVnc3J4ICVwXG4iLCBuYW1lLCAiRE1BNjQiLAotCQkgICBkaS0+ZG1hLmRtYWN0cmxmbGFncywgbnR4ZCwgbnJ4ZCwgcnhidWZzaXplLAotCQkgICByeGV4dGhlYWRyb29tLCBucnhwb3N0LCByeG9mZnNldCwgZG1hcmVnc3R4LCBkbWFyZWdzcngpKTsKLQotCS8qIG1ha2UgYSBwcml2YXRlIGNvcHkgb2Ygb3VyIGNhbGxlcnMgbmFtZSAqLwotCXN0cm5jcHkoZGktPm5hbWUsIG5hbWUsIE1BWE5BTUVMKTsKLQlkaS0+bmFtZVtNQVhOQU1FTCAtIDFdID0gJ1wwJzsKLQotCWRpLT5wYnVzID0gKChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaCktPnBidXM7Ci0KLQkvKiBzYXZlIHR1bmFibGVzICovCi0JZGktPm50eGQgPSAodTE2KSBudHhkOwotCWRpLT5ucnhkID0gKHUxNikgbnJ4ZDsKLQotCS8qIHRoZSBhY3R1YWwgZG1hIHNpemUgZG9lc24ndCBpbmNsdWRlIHRoZSBleHRyYSBoZWFkcm9vbSAqLwotCWRpLT5yeGV4dHJhaGRycm9vbSA9Ci0JICAgIChyeGV4dGhlYWRyb29tID09IC0xKSA/IEJDTUVYVFJBSERST09NIDogcnhleHRoZWFkcm9vbTsKLQlpZiAocnhidWZzaXplID4gQkNNRVhUUkFIRFJPT00pCi0JCWRpLT5yeGJ1ZnNpemUgPSAodTE2KSAocnhidWZzaXplIC0gZGktPnJ4ZXh0cmFoZHJyb29tKTsKLQllbHNlCi0JCWRpLT5yeGJ1ZnNpemUgPSAodTE2KSByeGJ1ZnNpemU7Ci0KLQlkaS0+bnJ4cG9zdCA9ICh1MTYpIG5yeHBvc3Q7Ci0JZGktPnJ4b2Zmc2V0ID0gKHU4KSByeG9mZnNldDsKLQotCS8qCi0JICogZmlndXJlIG91dCB0aGUgRE1BIHBoeXNpY2FsIGFkZHJlc3Mgb2Zmc2V0IGZvciBkZCBhbmQgZGF0YQotCSAqICAgICBQQ0kvUENJRTogdGhleSBtYXAgc2lsaWNvbiBiYWNrcGxhY2UgYWRkcmVzcyB0byB6ZXJvIGJhc2VkIG1lbW9yeSwgbmVlZCBvZmZzZXQKLQkgKiAgICAgT3RoZXIgYnVzOiB1c2UgemVybwotCSAqICAgICBTSV9CVVMgQklHRU5ESUFOIGtsdWRnZTogdXNlIHNkcmFtIHN3YXBwZWQgcmVnaW9uIGZvciBkYXRhIGJ1ZmZlciwgbm90IGRlc2NyaXB0b3IKLQkgKi8KLQlkaS0+ZGRvZmZzZXRsb3cgPSAwOwotCWRpLT5kYXRhb2Zmc2V0bG93ID0gMDsKLQkvKiBmb3IgcGNpIGJ1cywgYWRkIG9mZnNldCAqLwotCWlmIChzaWgtPmJ1c3R5cGUgPT0gUENJX0JVUykgewotCQkvKiBwY2llIHdpdGggRE1BNjQgKi8KLQkJZGktPmRkb2Zmc2V0bG93ID0gMDsKLQkJZGktPmRkb2Zmc2V0aGlnaCA9IFNJX1BDSUVfRE1BX0gzMjsKLQkJZGktPmRhdGFvZmZzZXRsb3cgPSBkaS0+ZGRvZmZzZXRsb3c7Ci0JCWRpLT5kYXRhb2Zmc2V0aGlnaCA9IGRpLT5kZG9mZnNldGhpZ2g7Ci0JfQotI2lmIGRlZmluZWQoX19taXBzX18pICYmIGRlZmluZWQoSUxfQklHRU5ESUFOKQotCWRpLT5kYXRhb2Zmc2V0bG93ID0gZGktPmRhdGFvZmZzZXRsb3cgKyBTSV9TRFJBTV9TV0FQUEVEOwotI2VuZGlmCQkJCS8qIGRlZmluZWQoX19taXBzX18pICYmIGRlZmluZWQoSUxfQklHRU5ESUFOKSAqLwotCS8qIFdBUjY0NDUwIDogRE1BQ3RsLkFkZHIgZXh0IGZpZWxkcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBTRElPRCBjb3JlLiAqLwotCWlmICgoYWlfY29yZWlkKHNpaCkgPT0gU0RJT0RfQ09SRV9JRCkKLQkgICAgJiYgKChhaV9jb3JlcmV2KHNpaCkgPiAwKSAmJiAoYWlfY29yZXJldihzaWgpIDw9IDIpKSkKLQkJZGktPmFkZHJleHQgPSAwOwotCWVsc2UgaWYgKChhaV9jb3JlaWQoc2loKSA9PSBJMlNfQ09SRV9JRCkgJiYKLQkJICgoYWlfY29yZXJldihzaWgpID09IDApIHx8IChhaV9jb3JlcmV2KHNpaCkgPT0gMSkpKQotCQlkaS0+YWRkcmV4dCA9IDA7Ci0JZWxzZQotCQlkaS0+YWRkcmV4dCA9IF9kbWFfaXNhZGRyZXh0KGRpKTsKLQotCS8qIGRvZXMgdGhlIGRlc2NyaXB0b3JzIG5lZWQgdG8gYmUgYWxpZ25lZCBhbmQgaWYgeWVzLCBvbiA0Sy84SyBvciBub3QgKi8KLQlkaS0+YWxpZ25kZXNjXzRrID0gX2RtYV9kZXNjcmlwdG9yX2FsaWduKGRpKTsKLQlpZiAoZGktPmFsaWduZGVzY180aykgewotCQlkaS0+ZG1hZGVzY19hbGlnbiA9IEQ2NFJJTkdBTElHTl9CSVRTOwotCQlpZiAoKG50eGQgPCBENjRNQVhERCAvIDIpICYmIChucnhkIDwgRDY0TUFYREQgLyAyKSkgewotCQkJLyogZm9yIHNtYWxsZXIgZGQgdGFibGUsIEhXIHJlbGF4IGFsaWdubWVudCByZXFtbnQgKi8KLQkJCWRpLT5kbWFkZXNjX2FsaWduID0gRDY0UklOR0FMSUdOX0JJVFMgLSAxOwotCQl9Ci0JfSBlbHNlCi0JCWRpLT5kbWFkZXNjX2FsaWduID0gNDsJLyogMTYgYnl0ZSBhbGlnbm1lbnQgKi8KLQotCURNQV9OT05FKCgiRE1BIGRlc2NyaXB0b3IgYWxpZ25fbmVlZGVkICVkLCBhbGlnbiAlZFxuIiwKLQkJICBkaS0+YWxpZ25kZXNjXzRrLCBkaS0+ZG1hZGVzY19hbGlnbikpOwotCi0JLyogYWxsb2NhdGUgdHggcGFja2V0IHBvaW50ZXIgdmVjdG9yICovCi0JaWYgKG50eGQpIHsKLQkJc2l6ZSA9IG50eGQgKiBzaXplb2Yodm9pZCAqKTsKLQkJZGktPnR4cCA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7Ci0JCWlmIChkaS0+dHhwID09IE5VTEwpIHsKLQkJCURNQV9FUlJPUigoIiVzOiBkbWFfYXR0YWNoOiBvdXQgb2YgdHggbWVtb3J5XG4iLCBkaS0+bmFtZSkpOwotCQkJZ290byBmYWlsOwotCQl9Ci0JfQotCi0JLyogYWxsb2NhdGUgcnggcGFja2V0IHBvaW50ZXIgdmVjdG9yICovCi0JaWYgKG5yeGQpIHsKLQkJc2l6ZSA9IG5yeGQgKiBzaXplb2Yodm9pZCAqKTsKLQkJZGktPnJ4cCA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7Ci0JCWlmIChkaS0+cnhwID09IE5VTEwpIHsKLQkJCURNQV9FUlJPUigoIiVzOiBkbWFfYXR0YWNoOiBvdXQgb2YgcnggbWVtb3J5XG4iLCBkaS0+bmFtZSkpOwotCQkJZ290byBmYWlsOwotCQl9Ci0JfQotCi0JLyogYWxsb2NhdGUgdHJhbnNtaXQgZGVzY3JpcHRvciByaW5nLCBvbmx5IG5lZWQgbnR4ZCBkZXNjcmlwdG9ycyBidXQgaXQgbXVzdCBiZSBhbGlnbmVkICovCi0JaWYgKG50eGQpIHsKLQkJaWYgKCFfZG1hX2FsbG9jKGRpLCBETUFfVFgpKQotCQkJZ290byBmYWlsOwotCX0KLQotCS8qIGFsbG9jYXRlIHJlY2VpdmUgZGVzY3JpcHRvciByaW5nLCBvbmx5IG5lZWQgbnJ4ZCBkZXNjcmlwdG9ycyBidXQgaXQgbXVzdCBiZSBhbGlnbmVkICovCi0JaWYgKG5yeGQpIHsKLQkJaWYgKCFfZG1hX2FsbG9jKGRpLCBETUFfUlgpKQotCQkJZ290byBmYWlsOwotCX0KLQotCWlmICgoZGktPmRkb2Zmc2V0bG93ICE9IDApICYmICFkaS0+YWRkcmV4dCkgewotCQlpZiAoUEhZU0FERFJMTyhkaS0+dHhkcGEpID4gU0lfUENJX0RNQV9TWikgewotCQkJRE1BX0VSUk9SKCgiJXM6IGRtYV9hdHRhY2g6IHR4ZHBhIDB4JXg6IGFkZHJleHQgbm90IHN1cHBvcnRlZFxuIiwgZGktPm5hbWUsICh1MzIpIFBIWVNBRERSTE8oZGktPnR4ZHBhKSkpOwotCQkJZ290byBmYWlsOwotCQl9Ci0JCWlmIChQSFlTQUREUkxPKGRpLT5yeGRwYSkgPiBTSV9QQ0lfRE1BX1NaKSB7Ci0JCQlETUFfRVJST1IoKCIlczogZG1hX2F0dGFjaDogcnhkcGEgMHgleDogYWRkcmV4dCBub3Qgc3VwcG9ydGVkXG4iLCBkaS0+bmFtZSwgKHUzMikgUEhZU0FERFJMTyhkaS0+cnhkcGEpKSk7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQl9Ci0KLQlETUFfVFJBQ0UoKCJkZG9mZnNldGxvdyAweCV4IGRkb2Zmc2V0aGlnaCAweCV4IGRhdGFvZmZzZXRsb3cgMHgleCBkYXRhb2Zmc2V0aGlnaCAiICIweCV4IGFkZHJleHQgJWRcbiIsIGRpLT5kZG9mZnNldGxvdywgZGktPmRkb2Zmc2V0aGlnaCwgZGktPmRhdGFvZmZzZXRsb3csIGRpLT5kYXRhb2Zmc2V0aGlnaCwgZGktPmFkZHJleHQpKTsKLQotCS8qIGFsbG9jYXRlIERNQSBtYXBwaW5nIHZlY3RvcnMgKi8KLQlpZiAoRE1BU0dMSVNUX0VOQUIpIHsKLQkJaWYgKG50eGQpIHsKLQkJCXNpemUgPSBudHhkICogc2l6ZW9mKHN0cnVjdCBkbWFfc2VnX21hcCk7Ci0JCQlkaS0+dHhwX2RtYWggPSBremFsbG9jKHNpemUsIEdGUF9BVE9NSUMpOwotCQkJaWYgKGRpLT50eHBfZG1haCA9PSBOVUxMKQotCQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCWlmIChucnhkKSB7Ci0JCQlzaXplID0gbnJ4ZCAqIHNpemVvZihzdHJ1Y3QgZG1hX3NlZ19tYXApOwotCQkJZGktPnJ4cF9kbWFoID0ga3phbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKLQkJCWlmIChkaS0+cnhwX2RtYWggPT0gTlVMTCkKLQkJCQlnb3RvIGZhaWw7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gKHN0cnVjdCBkbWFfcHViICopIGRpOwotCi0gZmFpbDoKLQlfZG1hX2RldGFjaChkaSk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIENoZWNrIGZvciBvZGQgbnVtYmVyIG9mIDEncyAqLwotc3RhdGljIGlubGluZSB1MzIgcGFyaXR5MzIodTMyIGRhdGEpCi17Ci0JZGF0YSBePSBkYXRhID4+IDE2OwotCWRhdGEgXj0gZGF0YSA+PiA4OwotCWRhdGEgXj0gZGF0YSA+PiA0OwotCWRhdGEgXj0gZGF0YSA+PiAyOwotCWRhdGEgXj0gZGF0YSA+PiAxOwotCi0JcmV0dXJuIGRhdGEgJiAxOwotfQotCi0jZGVmaW5lIERNQTY0X0REX1BBUklUWShkZCkgIHBhcml0eTMyKChkZCktPmFkZHJsb3cgXiAoZGQpLT5hZGRyaGlnaCBeIChkZCktPmN0cmwxIF4gKGRkKS0+Y3RybDIpCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotZG1hNjRfZGRfdXBkKHN0cnVjdCBkbWFfaW5mbyAqZGksIHN0cnVjdCBkbWE2NGRlc2MgKmRkcmluZywKLQkgICAgIGRtYWFkZHJfdCBwYSwgdWludCBvdXRpZHgsIHUzMiAqZmxhZ3MsIHUzMiBidWZjb3VudCkKLXsKLQl1MzIgY3RybDIgPSBidWZjb3VudCAmIEQ2NF9DVFJMMl9CQ19NQVNLOwotCi0JLyogUENJIGJ1cyB3aXRoIGJpZyg+MUcpIHBoeXNpY2FsIGFkZHJlc3MsIHVzZSBhZGRyZXNzIGV4dGVuc2lvbiAqLwotI2lmIGRlZmluZWQoX19taXBzX18pICYmIGRlZmluZWQoSUxfQklHRU5ESUFOKQotCWlmICgoZGktPmRhdGFvZmZzZXRsb3cgPT0gU0lfU0RSQU1fU1dBUFBFRCkKLQkgICAgfHwgIShQSFlTQUREUkxPKHBhKSAmIFBDSTMyQUREUl9ISUdIKSkgewotI2Vsc2UKLQlpZiAoKGRpLT5kYXRhb2Zmc2V0bG93ID09IDApIHx8ICEoUEhZU0FERFJMTyhwYSkgJiBQQ0kzMkFERFJfSElHSCkpIHsKLSNlbmRpZgkJCQkvKiBkZWZpbmVkKF9fbWlwc19fKSAmJiBkZWZpbmVkKElMX0JJR0VORElBTikgKi8KLQotCQlXX1NNKCZkZHJpbmdbb3V0aWR4XS5hZGRybG93LAotCQkgICAgIEJVU19TV0FQMzIoUEhZU0FERFJMTyhwYSkgKyBkaS0+ZGF0YW9mZnNldGxvdykpOwotCQlXX1NNKCZkZHJpbmdbb3V0aWR4XS5hZGRyaGlnaCwKLQkJICAgICBCVVNfU1dBUDMyKFBIWVNBRERSSEkocGEpICsgZGktPmRhdGFvZmZzZXRoaWdoKSk7Ci0JCVdfU00oJmRkcmluZ1tvdXRpZHhdLmN0cmwxLCBCVVNfU1dBUDMyKCpmbGFncykpOwotCQlXX1NNKCZkZHJpbmdbb3V0aWR4XS5jdHJsMiwgQlVTX1NXQVAzMihjdHJsMikpOwotCX0gZWxzZSB7Ci0JCS8qIGFkZHJlc3MgZXh0ZW5zaW9uIGZvciAzMi1iaXQgUENJICovCi0JCXUzMiBhZTsKLQotCQlhZSA9IChQSFlTQUREUkxPKHBhKSAmIFBDSTMyQUREUl9ISUdIKSA+PiBQQ0kzMkFERFJfSElHSF9TSElGVDsKLQkJUEhZU0FERFJMTyhwYSkgJj0gflBDSTMyQUREUl9ISUdIOwotCi0JCWN0cmwyIHw9IChhZSA8PCBENjRfQ1RSTDJfQUVfU0hJRlQpICYgRDY0X0NUUkwyX0FFOwotCQlXX1NNKCZkZHJpbmdbb3V0aWR4XS5hZGRybG93LAotCQkgICAgIEJVU19TV0FQMzIoUEhZU0FERFJMTyhwYSkgKyBkaS0+ZGF0YW9mZnNldGxvdykpOwotCQlXX1NNKCZkZHJpbmdbb3V0aWR4XS5hZGRyaGlnaCwKLQkJICAgICBCVVNfU1dBUDMyKDAgKyBkaS0+ZGF0YW9mZnNldGhpZ2gpKTsKLQkJV19TTSgmZGRyaW5nW291dGlkeF0uY3RybDEsIEJVU19TV0FQMzIoKmZsYWdzKSk7Ci0JCVdfU00oJmRkcmluZ1tvdXRpZHhdLmN0cmwyLCBCVVNfU1dBUDMyKGN0cmwyKSk7Ci0JfQotCWlmIChkaS0+ZG1hLmRtYWN0cmxmbGFncyAmIERNQV9DVFJMX1BFTikgewotCQlpZiAoRE1BNjRfRERfUEFSSVRZKCZkZHJpbmdbb3V0aWR4XSkpIHsKLQkJCVdfU00oJmRkcmluZ1tvdXRpZHhdLmN0cmwyLAotCQkJICAgICBCVVNfU1dBUDMyKGN0cmwyIHwgRDY0X0NUUkwyX1BBUklUWSkpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgYm9vbCBfZG1hX2FsbG9jKHN0cnVjdCBkbWFfaW5mbyAqZGksIHVpbnQgZGlyZWN0aW9uKQotewotCXJldHVybiBkbWE2NF9hbGxvYyhkaSwgZGlyZWN0aW9uKTsKLX0KLQotdm9pZCAqZG1hX2FsbG9jX2NvbnNpc3RlbnQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHVpbnQgc2l6ZSwgdTE2IGFsaWduX2JpdHMsCi0JCQkgICAgICAgdWludCAqYWxsb2NlZCwgdW5zaWduZWQgbG9uZyAqcGFwKQotewotCWlmIChhbGlnbl9iaXRzKSB7Ci0JCXUxNiBhbGlnbiA9ICgxIDw8IGFsaWduX2JpdHMpOwotCQlpZiAoIUlTX0FMSUdORUQoUEFHRV9TSVpFLCBhbGlnbikpCi0JCQlzaXplICs9IGFsaWduOwotCQkqYWxsb2NlZCA9IHNpemU7Ci0JfQotCXJldHVybiBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplLCAoZG1hX2FkZHJfdCAqKSBwYXApOwotfQotCi0vKiAhISBtYXkgYmUgY2FsbGVkIHdpdGggY29yZSBpbiByZXNldCAqLwotc3RhdGljIHZvaWQgX2RtYV9kZXRhY2goc3RydWN0IGRtYV9pbmZvICpkaSkKLXsKLQotCURNQV9UUkFDRSgoIiVzOiBkbWFfZGV0YWNoXG4iLCBkaS0+bmFtZSkpOwotCi0JLyogZnJlZSBkbWEgZGVzY3JpcHRvciByaW5ncyAqLwotCWlmIChkaS0+dHhkNjQpCi0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGktPnBidXMsIGRpLT50eGRhbGxvYywKLQkJCQkgICAgKChzOCAqKWRpLT50eGQ2NCAtIGRpLT50eGRhbGlnbiksCi0JCQkJICAgIChkaS0+dHhkcGFvcmlnKSk7Ci0JaWYgKGRpLT5yeGQ2NCkKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChkaS0+cGJ1cywgZGktPnJ4ZGFsbG9jLAotCQkJCSAgICAoKHM4ICopZGktPnJ4ZDY0IC0gZGktPnJ4ZGFsaWduKSwKLQkJCQkgICAgKGRpLT5yeGRwYW9yaWcpKTsKLQotCS8qIGZyZWUgcGFja2V0IHBvaW50ZXIgdmVjdG9ycyAqLwotCWtmcmVlKGRpLT50eHApOwotCWtmcmVlKGRpLT5yeHApOwotCi0JLyogZnJlZSB0eCBwYWNrZXQgRE1BIGhhbmRsZXMgKi8KLQlrZnJlZShkaS0+dHhwX2RtYWgpOwotCi0JLyogZnJlZSByeCBwYWNrZXQgRE1BIGhhbmRsZXMgKi8KLQlrZnJlZShkaS0+cnhwX2RtYWgpOwotCi0JLyogZnJlZSBvdXIgcHJpdmF0ZSBpbmZvIHN0cnVjdHVyZSAqLwotCWtmcmVlKGRpKTsKLQotfQotCi1zdGF0aWMgYm9vbCBfZG1hX2Rlc2NyaXB0b3JfYWxpZ24oc3RydWN0IGRtYV9pbmZvICpkaSkKLXsKLQl1MzIgYWRkcmw7Ci0KLQkvKiBDaGVjayB0byBzZWUgaWYgdGhlIGRlc2NyaXB0b3JzIG5lZWQgdG8gYmUgYWxpZ25lZCBvbiA0Sy84SyBvciBub3QgKi8KLQlpZiAoZGktPmQ2NHR4cmVncyAhPSBOVUxMKSB7Ci0JCVdfUkVHKCZkaS0+ZDY0dHhyZWdzLT5hZGRybG93LCAweGZmMCk7Ci0JCWFkZHJsID0gUl9SRUcoJmRpLT5kNjR0eHJlZ3MtPmFkZHJsb3cpOwotCQlpZiAoYWRkcmwgIT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQl9IGVsc2UgaWYgKGRpLT5kNjRyeHJlZ3MgIT0gTlVMTCkgewotCQlXX1JFRygmZGktPmQ2NHJ4cmVncy0+YWRkcmxvdywgMHhmZjApOwotCQlhZGRybCA9IFJfUkVHKCZkaS0+ZDY0cnhyZWdzLT5hZGRybG93KTsKLQkJaWYgKGFkZHJsICE9IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXJldHVybiB0cnVlOwotfQotCi0vKiByZXR1cm4gdHJ1ZSBpZiB0aGlzIGRtYSBlbmdpbmUgc3VwcG9ydHMgRG1hRXh0ZW5kZWRBZGRyQ2hhbmdlcywgb3RoZXJ3aXNlIGZhbHNlICovCi1zdGF0aWMgYm9vbCBfZG1hX2lzYWRkcmV4dChzdHJ1Y3QgZG1hX2luZm8gKmRpKQotewotCS8qIERNQTY0IHN1cHBvcnRzIGZ1bGwgMzItIG9yIDY0LWJpdCBvcGVyYXRpb24uIEFFIGlzIGFsd2F5cyB2YWxpZCAqLwotCi0JLyogbm90IGFsbCB0eCBvciByeCBjaGFubmVsIGFyZSBhdmFpbGFibGUgKi8KLQlpZiAoZGktPmQ2NHR4cmVncyAhPSBOVUxMKSB7Ci0JCWlmICghX2RtYTY0X2FkZHJleHQoZGktPmQ2NHR4cmVncykpIHsKLQkJCURNQV9FUlJPUigoIiVzOiBfZG1hX2lzYWRkcmV4dDogRE1BNjQgdHggZG9lc24ndCBoYXZlICIKLQkJCQkgICAiQUUgc2V0XG4iLCBkaS0+bmFtZSkpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0gZWxzZSBpZiAoZGktPmQ2NHJ4cmVncyAhPSBOVUxMKSB7Ci0JCWlmICghX2RtYTY0X2FkZHJleHQoZGktPmQ2NHJ4cmVncykpIHsKLQkJCURNQV9FUlJPUigoIiVzOiBfZG1hX2lzYWRkcmV4dDogRE1BNjQgcnggZG9lc24ndCBoYXZlICIKLQkJCQkgICAiQUUgc2V0XG4iLCBkaS0+bmFtZSkpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIGluaXRpYWxpemUgZGVzY3JpcHRvciB0YWJsZSBiYXNlIGFkZHJlc3MgKi8KLXN0YXRpYyB2b2lkIF9kbWFfZGR0YWJsZV9pbml0KHN0cnVjdCBkbWFfaW5mbyAqZGksIHVpbnQgZGlyZWN0aW9uLCBkbWFhZGRyX3QgcGEpCi17Ci0JaWYgKCFkaS0+YWxpZ25kZXNjXzRrKSB7Ci0JCWlmIChkaXJlY3Rpb24gPT0gRE1BX1RYKQotCQkJZGktPnhtdHB0cmJhc2UgPSBQSFlTQUREUkxPKHBhKTsKLQkJZWxzZQotCQkJZGktPnJjdnB0cmJhc2UgPSBQSFlTQUREUkxPKHBhKTsKLQl9Ci0KLQlpZiAoKGRpLT5kZG9mZnNldGxvdyA9PSAwKQotCSAgICB8fCAhKFBIWVNBRERSTE8ocGEpICYgUENJMzJBRERSX0hJR0gpKSB7Ci0JCWlmIChkaXJlY3Rpb24gPT0gRE1BX1RYKSB7Ci0JCQlXX1JFRygmZGktPmQ2NHR4cmVncy0+YWRkcmxvdywKLQkJCSAgICAgIChQSFlTQUREUkxPKHBhKSArIGRpLT5kZG9mZnNldGxvdykpOwotCQkJV19SRUcoJmRpLT5kNjR0eHJlZ3MtPmFkZHJoaWdoLAotCQkJICAgICAgKFBIWVNBRERSSEkocGEpICsgZGktPmRkb2Zmc2V0aGlnaCkpOwotCQl9IGVsc2UgewotCQkJV19SRUcoJmRpLT5kNjRyeHJlZ3MtPmFkZHJsb3csCi0JCQkgICAgICAoUEhZU0FERFJMTyhwYSkgKyBkaS0+ZGRvZmZzZXRsb3cpKTsKLQkJCVdfUkVHKCZkaS0+ZDY0cnhyZWdzLT5hZGRyaGlnaCwKLQkJCQkoUEhZU0FERFJISShwYSkgKyBkaS0+ZGRvZmZzZXRoaWdoKSk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBETUE2NCAzMmJpdHMgYWRkcmVzcyBleHRlbnNpb24gKi8KLQkJdTMyIGFlOwotCi0JCS8qIHNoaWZ0IHRoZSBoaWdoIGJpdChzKSBmcm9tIHBhIHRvIGFlICovCi0JCWFlID0gKFBIWVNBRERSTE8ocGEpICYgUENJMzJBRERSX0hJR0gpID4+Ci0JCSAgICBQQ0kzMkFERFJfSElHSF9TSElGVDsKLQkJUEhZU0FERFJMTyhwYSkgJj0gflBDSTMyQUREUl9ISUdIOwotCi0JCWlmIChkaXJlY3Rpb24gPT0gRE1BX1RYKSB7Ci0JCQlXX1JFRygmZGktPmQ2NHR4cmVncy0+YWRkcmxvdywKLQkJCSAgICAgIChQSFlTQUREUkxPKHBhKSArIGRpLT5kZG9mZnNldGxvdykpOwotCQkJV19SRUcoJmRpLT5kNjR0eHJlZ3MtPmFkZHJoaWdoLAotCQkJICAgICAgZGktPmRkb2Zmc2V0aGlnaCk7Ci0JCQlTRVRfUkVHKCZkaS0+ZDY0dHhyZWdzLT5jb250cm9sLAotCQkJCUQ2NF9YQ19BRSwgKGFlIDw8IEQ2NF9YQ19BRV9TSElGVCkpOwotCQl9IGVsc2UgewotCQkJV19SRUcoJmRpLT5kNjRyeHJlZ3MtPmFkZHJsb3csCi0JCQkgICAgICAoUEhZU0FERFJMTyhwYSkgKyBkaS0+ZGRvZmZzZXRsb3cpKTsKLQkJCVdfUkVHKCZkaS0+ZDY0cnhyZWdzLT5hZGRyaGlnaCwKLQkJCSAgICAgIGRpLT5kZG9mZnNldGhpZ2gpOwotCQkJU0VUX1JFRygmZGktPmQ2NHJ4cmVncy0+Y29udHJvbCwKLQkJCQlENjRfUkNfQUUsIChhZSA8PCBENjRfUkNfQUVfU0hJRlQpKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgX2RtYV9maWZvbG9vcGJhY2tlbmFibGUoc3RydWN0IGRtYV9pbmZvICpkaSkKLXsKLQlETUFfVFJBQ0UoKCIlczogZG1hX2ZpZm9sb29wYmFja2VuYWJsZVxuIiwgZGktPm5hbWUpKTsKLQotCU9SX1JFRygmZGktPmQ2NHR4cmVncy0+Y29udHJvbCwgRDY0X1hDX0xFKTsKLX0KLQotc3RhdGljIHZvaWQgX2RtYV9yeGluaXQoc3RydWN0IGRtYV9pbmZvICpkaSkKLXsKLQlETUFfVFJBQ0UoKCIlczogZG1hX3J4aW5pdFxuIiwgZGktPm5hbWUpKTsKLQotCWlmIChkaS0+bnJ4ZCA9PSAwKQotCQlyZXR1cm47Ci0KLQlkaS0+cnhpbiA9IGRpLT5yeG91dCA9IDA7Ci0KLQkvKiBjbGVhciByeCBkZXNjcmlwdG9yIHJpbmcgKi8KLQltZW1zZXQoKHZvaWQgKilkaS0+cnhkNjQsICdcMCcsCi0JCShkaS0+bnJ4ZCAqIHNpemVvZihzdHJ1Y3QgZG1hNjRkZXNjKSkpOwotCi0JLyogRE1BIGVuZ2luZSB3aXRoIG91dCBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgcmVxdWlyZXMgdGFibGUgdG8gYmUgaW5pdGVkCi0JICogYmVmb3JlIGVuYWJsaW5nIHRoZSBlbmdpbmUKLQkgKi8KLQlpZiAoIWRpLT5hbGlnbmRlc2NfNGspCi0JCV9kbWFfZGR0YWJsZV9pbml0KGRpLCBETUFfUlgsIGRpLT5yeGRwYSk7Ci0KLQlfZG1hX3J4ZW5hYmxlKGRpKTsKLQotCWlmIChkaS0+YWxpZ25kZXNjXzRrKQotCQlfZG1hX2RkdGFibGVfaW5pdChkaSwgRE1BX1JYLCBkaS0+cnhkcGEpOwotfQotCi1zdGF0aWMgdm9pZCBfZG1hX3J4ZW5hYmxlKHN0cnVjdCBkbWFfaW5mbyAqZGkpCi17Ci0JdWludCBkbWFjdHJsZmxhZ3MgPSBkaS0+ZG1hLmRtYWN0cmxmbGFnczsKLQl1MzIgY29udHJvbDsKLQotCURNQV9UUkFDRSgoIiVzOiBkbWFfcnhlbmFibGVcbiIsIGRpLT5uYW1lKSk7Ci0KLQljb250cm9sID0KLQkgICAgKFJfUkVHKCZkaS0+ZDY0cnhyZWdzLT5jb250cm9sKSAmIEQ2NF9SQ19BRSkgfAotCSAgICBENjRfUkNfUkU7Ci0KLQlpZiAoKGRtYWN0cmxmbGFncyAmIERNQV9DVFJMX1BFTikgPT0gMCkKLQkJY29udHJvbCB8PSBENjRfUkNfUEQ7Ci0KLQlpZiAoZG1hY3RybGZsYWdzICYgRE1BX0NUUkxfUk9DKQotCQljb250cm9sIHw9IEQ2NF9SQ19PQzsKLQotCVdfUkVHKCZkaS0+ZDY0cnhyZWdzLT5jb250cm9sLAotCQkoKGRpLT5yeG9mZnNldCA8PCBENjRfUkNfUk9fU0hJRlQpIHwgY29udHJvbCkpOwotfQotCi1zdGF0aWMgdm9pZAotX2RtYV9yeF9wYXJhbV9nZXQoc3RydWN0IGRtYV9pbmZvICpkaSwgdTE2ICpyeG9mZnNldCwgdTE2ICpyeGJ1ZnNpemUpCi17Ci0JLyogdGhlIG5vcm1hbCB2YWx1ZXMgZml0IGludG8gMTYgYml0cyAqLwotCSpyeG9mZnNldCA9ICh1MTYpIGRpLT5yeG9mZnNldDsKLQkqcnhidWZzaXplID0gKHUxNikgZGktPnJ4YnVmc2l6ZTsKLX0KLQotLyogISEgcnggZW50cnkgcm91dGluZQotICogcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG5leHQgZnJhbWUgcmVjZWl2ZWQsIG9yIE5VTEwgaWYgdGhlcmUgYXJlIG5vIG1vcmUKLSAqICAgaWYgRE1BX0NUUkxfUlhNVUxUSSBpcyBkZWZpbmVkLCBETUEgc2NhdHRlcmluZyhtdWx0aXBsZSBidWZmZXJzKSBpcyBzdXBwb3J0ZWQKLSAqICAgICAgd2l0aCBwa3RzIGNoYWluCi0gKiAgIG90aGVyd2lzZSwgaXQncyB0cmVhdGVkIGFzIGdpYW50IHBrdCBhbmQgd2lsbCBiZSB0b3NzZWQuCi0gKiAgIFRoZSBETUEgc2NhdHRlcmluZyBzdGFydHMgd2l0aCBub3JtYWwgRE1BIGhlYWRlciwgZm9sbG93ZWQgYnkgZmlyc3QgYnVmZmVyIGRhdGEuCi0gKiAgIEFmdGVyIGl0IHJlYWNoZXMgdGhlIG1heCBzaXplIG9mIGJ1ZmZlciwgdGhlIGRhdGEgY29udGludWVzIGluIG5leHQgRE1BIGRlc2NyaXB0b3IKLSAqICAgYnVmZmVyIFdJVEhPVVQgRE1BIGhlYWRlcgotICovCi1zdGF0aWMgdm9pZCAqX2RtYV9yeChzdHJ1Y3QgZG1hX2luZm8gKmRpKQotewotCXN0cnVjdCBza19idWZmICpwLCAqaGVhZCwgKnRhaWw7Ci0JdWludCBsZW47Ci0JdWludCBwa3RfbGVuOwotCWludCByZXNpZCA9IDA7Ci0KLSBuZXh0X2ZyYW1lOgotCWhlYWQgPSBfZG1hX2dldG5leHRyeHAoZGksIGZhbHNlKTsKLQlpZiAoaGVhZCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCWxlbiA9IGxlMTZfdG9fY3B1KCoodTE2ICopIChoZWFkLT5kYXRhKSk7Ci0JRE1BX1RSQUNFKCgiJXM6IGRtYV9yeCBsZW4gJWRcbiIsIGRpLT5uYW1lLCBsZW4pKTsKLQlkbWFfc3Bpbl9mb3JfbGVuKGxlbiwgaGVhZCk7Ci0KLQkvKiBzZXQgYWN0dWFsIGxlbmd0aCAqLwotCXBrdF9sZW4gPSBtaW4oKGRpLT5yeG9mZnNldCArIGxlbiksIGRpLT5yeGJ1ZnNpemUpOwotCV9fc2tiX3RyaW0oaGVhZCwgcGt0X2xlbik7Ci0JcmVzaWQgPSBsZW4gLSAoZGktPnJ4YnVmc2l6ZSAtIGRpLT5yeG9mZnNldCk7Ci0KLQkvKiBjaGVjayBmb3Igc2luZ2xlIG9yIG11bHRpLWJ1ZmZlciByeCAqLwotCWlmIChyZXNpZCA+IDApIHsKLQkJdGFpbCA9IGhlYWQ7Ci0JCXdoaWxlICgocmVzaWQgPiAwKSAmJiAocCA9IF9kbWFfZ2V0bmV4dHJ4cChkaSwgZmFsc2UpKSkgewotCQkJdGFpbC0+bmV4dCA9IHA7Ci0JCQlwa3RfbGVuID0gbWluKHJlc2lkLCAoaW50KWRpLT5yeGJ1ZnNpemUpOwotCQkJX19za2JfdHJpbShwLCBwa3RfbGVuKTsKLQotCQkJdGFpbCA9IHA7Ci0JCQlyZXNpZCAtPSBkaS0+cnhidWZzaXplOwotCQl9Ci0KLSNpZmRlZiBCQ01EQkcKLQkJaWYgKHJlc2lkID4gMCkgewotCQkJdWludCBjdXI7Ci0JCQljdXIgPQotCQkJICAgIEIySSgoKFJfUkVHKCZkaS0+ZDY0cnhyZWdzLT5zdGF0dXMwKSAmCi0JCQkJICBENjRfUlMwX0NEX01BU0spIC0KLQkJCQkgZGktPnJjdnB0cmJhc2UpICYgRDY0X1JTMF9DRF9NQVNLLAotCQkJCXN0cnVjdCBkbWE2NGRlc2MpOwotCQkJRE1BX0VSUk9SKCgiX2RtYV9yeCwgcnhpbiAlZCByeG91dCAlZCwgaHdfY3VyciAlZFxuIiwKLQkJCQkgICBkaS0+cnhpbiwgZGktPnJ4b3V0LCBjdXIpKTsKLQkJfQotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwotCi0JCWlmICgoZGktPmRtYS5kbWFjdHJsZmxhZ3MgJiBETUFfQ1RSTF9SWE1VTFRJKSA9PSAwKSB7Ci0JCQlETUFfRVJST1IoKCIlczogZG1hX3J4OiBiYWQgZnJhbWUgbGVuZ3RoICglZClcbiIsCi0JCQkJICAgZGktPm5hbWUsIGxlbikpOwotCQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihoZWFkKTsKLQkJCWRpLT5kbWEucnhnaWFudHMrKzsKLQkJCWdvdG8gbmV4dF9mcmFtZTsKLQkJfQotCX0KLQotCXJldHVybiBoZWFkOwotfQotCi0vKiBwb3N0IHJlY2VpdmUgYnVmZmVycwotICogIHJldHVybiBmYWxzZSBpcyByZWZpbGwgZmFpbGVkIGNvbXBsZXRlbHkgYW5kIHJpbmcgaXMgZW1wdHkKLSAqICB0aGlzIHdpbGwgc3RhbGwgdGhlIHJ4IGRtYSBhbmQgdXNlciBtaWdodCB3YW50IHRvIGNhbGwgcnhmaWxsIGFnYWluIGFzYXAKLSAqICBUaGlzIHVubGlrZWx5IGhhcHBlbnMgb24gbWVtb3J5LXJpY2ggTklDLCBidXQgb2Z0ZW4gb24gbWVtb3J5LWNvbnN0cmFpbmVkIGRvbmdsZQotICovCi1zdGF0aWMgYm9vbCBfZG1hX3J4ZmlsbChzdHJ1Y3QgZG1hX2luZm8gKmRpKQotewotCXN0cnVjdCBza19idWZmICpwOwotCXUxNiByeGluLCByeG91dDsKLQl1MzIgZmxhZ3MgPSAwOwotCXVpbnQgbjsKLQl1aW50IGk7Ci0JZG1hYWRkcl90IHBhOwotCXVpbnQgZXh0cmFfb2Zmc2V0ID0gMDsKLQlib29sIHJpbmdfZW1wdHk7Ci0KLQlyaW5nX2VtcHR5ID0gZmFsc2U7Ci0KLQkvKgotCSAqIERldGVybWluZSBob3cgbWFueSByZWNlaXZlIGJ1ZmZlcnMgd2UncmUgbGFja2luZwotCSAqIGZyb20gdGhlIGZ1bGwgY29tcGxlbWVudCwgYWxsb2NhdGUsIGluaXRpYWxpemUsCi0JICogYW5kIHBvc3QgdGhlbSwgdGhlbiB1cGRhdGUgdGhlIGNoaXAgcnggbGFzdGRzY3IuCi0JICovCi0KLQlyeGluID0gZGktPnJ4aW47Ci0JcnhvdXQgPSBkaS0+cnhvdXQ7Ci0KLQluID0gZGktPm5yeHBvc3QgLSBOUlhEQUNUSVZFKHJ4aW4sIHJ4b3V0KTsKLQotCURNQV9UUkFDRSgoIiVzOiBkbWFfcnhmaWxsOiBwb3N0ICVkXG4iLCBkaS0+bmFtZSwgbikpOwotCi0JaWYgKGRpLT5yeGJ1ZnNpemUgPiBCQ01FWFRSQUhEUk9PTSkKLQkJZXh0cmFfb2Zmc2V0ID0gZGktPnJ4ZXh0cmFoZHJyb29tOwotCi0JZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkvKiB0aGUgZGktPnJ4YnVmc2l6ZSBkb2Vzbid0IGluY2x1ZGUgdGhlIGV4dHJhIGhlYWRyb29tLCB3ZSBuZWVkIHRvIGFkZCBpdCB0byB0aGUKLQkJICAgc2l6ZSB0byBiZSBhbGxvY2F0ZWQKLQkJICovCi0KLQkJcCA9IGJyY211X3BrdF9idWZfZ2V0X3NrYihkaS0+cnhidWZzaXplICsgZXh0cmFfb2Zmc2V0KTsKLQotCQlpZiAocCA9PSBOVUxMKSB7Ci0JCQlETUFfRVJST1IoKCIlczogZG1hX3J4ZmlsbDogb3V0IG9mIHJ4YnVmc1xuIiwKLQkJCQkgICBkaS0+bmFtZSkpOwotCQkJaWYgKGkgPT0gMCAmJiBkbWE2NF9yeGlkbGUoZGkpKSB7Ci0JCQkJRE1BX0VSUk9SKCgiJXM6IHJ4ZmlsbDY0OiByaW5nIGlzIGVtcHR5ICFcbiIsCi0JCQkJCSAgIGRpLT5uYW1lKSk7Ci0JCQkJcmluZ19lbXB0eSA9IHRydWU7Ci0JCQl9Ci0JCQlkaS0+ZG1hLnJ4bm9idWYrKzsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIHJlc2VydmUgYW4gZXh0cmEgaGVhZHJvb20sIGlmIGFwcGxpY2FibGUgKi8KLQkJaWYgKGV4dHJhX29mZnNldCkKLQkJCXNrYl9wdWxsKHAsIGV4dHJhX29mZnNldCk7Ci0KLQkJLyogRG8gYSBjYWNoZWQgd3JpdGUgaW5zdGVhZCBvZiB1bmNhY2hlZCB3cml0ZSBzaW5jZSBETUFfTUFQCi0JCSAqIHdpbGwgZmx1c2ggdGhlIGNhY2hlLgotCQkgKi8KLQkJKih1MzIgKikgKHAtPmRhdGEpID0gMDsKLQotCQlpZiAoRE1BU0dMSVNUX0VOQUIpCi0JCQltZW1zZXQoJmRpLT5yeHBfZG1haFtyeG91dF0sIDAsCi0JCQkJc2l6ZW9mKHN0cnVjdCBkbWFfc2VnX21hcCkpOwotCi0JCXBhID0gcGNpX21hcF9zaW5nbGUoZGktPnBidXMsIHAtPmRhdGEsCi0JCQlkaS0+cnhidWZzaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCi0JCS8qIHNhdmUgdGhlIGZyZWUgcGFja2V0IHBvaW50ZXIgKi8KLQkJZGktPnJ4cFtyeG91dF0gPSBwOwotCi0JCS8qIHJlc2V0IGZsYWdzIGZvciBlYWNoIGRlc2NyaXB0b3IgKi8KLQkJZmxhZ3MgPSAwOwotCQlpZiAocnhvdXQgPT0gKGRpLT5ucnhkIC0gMSkpCi0JCQlmbGFncyA9IEQ2NF9DVFJMMV9FT1Q7Ci0KLQkJZG1hNjRfZGRfdXBkKGRpLCBkaS0+cnhkNjQsIHBhLCByeG91dCwgJmZsYWdzLAotCQkJICAgICBkaS0+cnhidWZzaXplKTsKLQkJcnhvdXQgPSBORVhUUlhEKHJ4b3V0KTsKLQl9Ci0KLQlkaS0+cnhvdXQgPSByeG91dDsKLQotCS8qIHVwZGF0ZSB0aGUgY2hpcCBsYXN0ZHNjciBwb2ludGVyICovCi0JV19SRUcoJmRpLT5kNjRyeHJlZ3MtPnB0ciwKLQkgICAgICBkaS0+cmN2cHRyYmFzZSArIEkyQihyeG91dCwgc3RydWN0IGRtYTY0ZGVzYykpOwotCi0JcmV0dXJuIHJpbmdfZW1wdHk7Ci19Ci0KLS8qIGxpa2UgZ2V0bmV4dHR4cCBidXQgbm8gcmVjbGFpbSAqLwotc3RhdGljIHZvaWQgKl9kbWFfcGVla25leHR0eHAoc3RydWN0IGRtYV9pbmZvICpkaSkKLXsKLQl1aW50IGVuZCwgaTsKLQotCWlmIChkaS0+bnR4ZCA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQotCWVuZCA9Ci0JICAgIEIySSgoKFJfUkVHKCZkaS0+ZDY0dHhyZWdzLT5zdGF0dXMwKSAmCi0JCSAgRDY0X1hTMF9DRF9NQVNLKSAtIGRpLT54bXRwdHJiYXNlKSAmIEQ2NF9YUzBfQ0RfTUFTSywKLQkJICBzdHJ1Y3QgZG1hNjRkZXNjKTsKLQotCWZvciAoaSA9IGRpLT50eGluOyBpICE9IGVuZDsgaSA9IE5FWFRUWEQoaSkpCi0JCWlmIChkaS0+dHhwW2ldKQotCQkJcmV0dXJuIGRpLT50eHBbaV07Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotLyogbGlrZSBnZXRuZXh0cnhwIGJ1dCBub3QgdGFrZSBvZmYgdGhlIHJpbmcgKi8KLXN0YXRpYyB2b2lkICpfZG1hX3BlZWtuZXh0cnhwKHN0cnVjdCBkbWFfaW5mbyAqZGkpCi17Ci0JdWludCBlbmQsIGk7Ci0KLQlpZiAoZGktPm5yeGQgPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQllbmQgPQotCSAgICBCMkkoKChSX1JFRygmZGktPmQ2NHJ4cmVncy0+c3RhdHVzMCkgJgotCQkgIEQ2NF9SUzBfQ0RfTUFTSykgLSBkaS0+cmN2cHRyYmFzZSkgJiBENjRfUlMwX0NEX01BU0ssCi0JCSAgc3RydWN0IGRtYTY0ZGVzYyk7Ci0KLQlmb3IgKGkgPSBkaS0+cnhpbjsgaSAhPSBlbmQ7IGkgPSBORVhUUlhEKGkpKQotCQlpZiAoZGktPnJ4cFtpXSkKLQkJCXJldHVybiBkaS0+cnhwW2ldOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIF9kbWFfcnhyZWNsYWltKHN0cnVjdCBkbWFfaW5mbyAqZGkpCi17Ci0Jdm9pZCAqcDsKLQotCURNQV9UUkFDRSgoIiVzOiBkbWFfcnhyZWNsYWltXG4iLCBkaS0+bmFtZSkpOwotCi0Jd2hpbGUgKChwID0gX2RtYV9nZXRuZXh0cnhwKGRpLCB0cnVlKSkpCi0JCWJyY211X3BrdF9idWZfZnJlZV9za2IocCk7Ci19Ci0KLXN0YXRpYyB2b2lkICpfZG1hX2dldG5leHRyeHAoc3RydWN0IGRtYV9pbmZvICpkaSwgYm9vbCBmb3JjZWFsbCkKLXsKLQlpZiAoZGktPm5yeGQgPT0gMCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gZG1hNjRfZ2V0bmV4dHJ4cChkaSwgZm9yY2VhbGwpOwotfQotCi1zdGF0aWMgdm9pZCBfZG1hX3R4YmxvY2soc3RydWN0IGRtYV9pbmZvICpkaSkKLXsKLQlkaS0+ZG1hLnR4YXZhaWwgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBfZG1hX3R4dW5ibG9jayhzdHJ1Y3QgZG1hX2luZm8gKmRpKQotewotCWRpLT5kbWEudHhhdmFpbCA9IGRpLT5udHhkIC0gTlRYREFDVElWRShkaS0+dHhpbiwgZGktPnR4b3V0KSAtIDE7Ci19Ci0KLXN0YXRpYyB1aW50IF9kbWFfdHhhY3RpdmUoc3RydWN0IGRtYV9pbmZvICpkaSkKLXsKLQlyZXR1cm4gTlRYREFDVElWRShkaS0+dHhpbiwgZGktPnR4b3V0KTsKLX0KLQotc3RhdGljIHVpbnQgX2RtYV90eHBlbmRpbmcoc3RydWN0IGRtYV9pbmZvICpkaSkKLXsKLQl1aW50IGN1cnI7Ci0KLQljdXJyID0KLQkgICAgQjJJKCgoUl9SRUcoJmRpLT5kNjR0eHJlZ3MtPnN0YXR1czApICYKLQkJICBENjRfWFMwX0NEX01BU0spIC0gZGktPnhtdHB0cmJhc2UpICYgRDY0X1hTMF9DRF9NQVNLLAotCQkgIHN0cnVjdCBkbWE2NGRlc2MpOwotCi0JcmV0dXJuIE5UWERBQ1RJVkUoY3VyciwgZGktPnR4b3V0KTsKLX0KLQotc3RhdGljIHVpbnQgX2RtYV90eGNvbW1pdHRlZChzdHJ1Y3QgZG1hX2luZm8gKmRpKQotewotCXVpbnQgcHRyOwotCXVpbnQgdHhpbiA9IGRpLT50eGluOwotCi0JaWYgKHR4aW4gPT0gZGktPnR4b3V0KQotCQlyZXR1cm4gMDsKLQotCXB0ciA9IEIySShSX1JFRygmZGktPmQ2NHR4cmVncy0+cHRyKSwgc3RydWN0IGRtYTY0ZGVzYyk7Ci0KLQlyZXR1cm4gTlRYREFDVElWRShkaS0+dHhpbiwgcHRyKTsKLX0KLQotc3RhdGljIHVpbnQgX2RtYV9yeGFjdGl2ZShzdHJ1Y3QgZG1hX2luZm8gKmRpKQotewotCXJldHVybiBOUlhEQUNUSVZFKGRpLT5yeGluLCBkaS0+cnhvdXQpOwotfQotCi1zdGF0aWMgdm9pZCBfZG1hX2NvdW50ZXJyZXNldChzdHJ1Y3QgZG1hX2luZm8gKmRpKQotewotCS8qIHJlc2V0IGFsbCBzb2Z0d2FyZSBjb3VudGVyICovCi0JZGktPmRtYS5yeGdpYW50cyA9IDA7Ci0JZGktPmRtYS5yeG5vYnVmID0gMDsKLQlkaS0+ZG1hLnR4bm9idWYgPSAwOwotfQotCi1zdGF0aWMgdWludCBfZG1hX2N0cmxmbGFncyhzdHJ1Y3QgZG1hX2luZm8gKmRpLCB1aW50IG1hc2ssIHVpbnQgZmxhZ3MpCi17Ci0JdWludCBkbWFjdHJsZmxhZ3MgPSBkaS0+ZG1hLmRtYWN0cmxmbGFnczsKLQotCWlmIChkaSA9PSBOVUxMKSB7Ci0JCURNQV9FUlJPUigoIiVzOiBfZG1hX2N0cmxmbGFnczogTlVMTCBkbWEgaGFuZGxlXG4iLCBkaS0+bmFtZSkpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlkbWFjdHJsZmxhZ3MgJj0gfm1hc2s7Ci0JZG1hY3RybGZsYWdzIHw9IGZsYWdzOwotCi0JLyogSWYgdHJ5aW5nIHRvIGVuYWJsZSBwYXJpdHksIGNoZWNrIGlmIHBhcml0eSBpcyBhY3R1YWxseSBzdXBwb3J0ZWQgKi8KLQlpZiAoZG1hY3RybGZsYWdzICYgRE1BX0NUUkxfUEVOKSB7Ci0JCXUzMiBjb250cm9sOwotCi0JCWNvbnRyb2wgPSBSX1JFRygmZGktPmQ2NHR4cmVncy0+Y29udHJvbCk7Ci0JCVdfUkVHKCZkaS0+ZDY0dHhyZWdzLT5jb250cm9sLAotCQkgICAgICBjb250cm9sIHwgRDY0X1hDX1BEKTsKLQkJaWYgKFJfUkVHKCZkaS0+ZDY0dHhyZWdzLT5jb250cm9sKSAmIEQ2NF9YQ19QRCkgewotCQkJLyogV2UgKmNhbiogZGlzYWJsZSBpdCBzbyBpdCBpcyBzdXBwb3J0ZWQsCi0JCQkgKiByZXN0b3JlIGNvbnRyb2wgcmVnaXN0ZXIKLQkJCSAqLwotCQkJV19SRUcoJmRpLT5kNjR0eHJlZ3MtPmNvbnRyb2wsCi0JCQljb250cm9sKTsKLQkJfSBlbHNlIHsKLQkJCS8qIE5vdCBzdXBwb3J0ZWQsIGRvbid0IGFsbG93IGl0IHRvIGJlIGVuYWJsZWQgKi8KLQkJCWRtYWN0cmxmbGFncyAmPSB+RE1BX0NUUkxfUEVOOwotCQl9Ci0JfQotCi0JZGktPmRtYS5kbWFjdHJsZmxhZ3MgPSBkbWFjdHJsZmxhZ3M7Ci0KLQlyZXR1cm4gZG1hY3RybGZsYWdzOwotfQotCi0vKiBnZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHZhciBpbiBvcmRlciB0byBjaGFuZ2UgbGF0ZXIgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIF9kbWFfZ2V0dmFyKHN0cnVjdCBkbWFfaW5mbyAqZGksIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JaWYgKCFzdHJjbXAobmFtZSwgIiZ0eGF2YWlsIikpCi0JCXJldHVybiAodW5zaWduZWQgbG9uZykmKGRpLT5kbWEudHhhdmFpbCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYwotdTggZG1hX2FsaWduX3NpemV0b2JpdHModWludCBzaXplKQotewotCXU4IGJpdHBvcyA9IDA7Ci0Jd2hpbGUgKHNpemUgPj49IDEpIHsKLQkJYml0cG9zKys7Ci0JfQotCXJldHVybiBiaXRwb3M7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gZW5zdXJlcyB0aGF0IHRoZSBETUEgZGVzY3JpcHRvciByaW5nIHdpbGwgbm90IGdldCBhbGxvY2F0ZWQKLSAqIGFjcm9zcyBQYWdlIGJvdW5kYXJ5LiBJZiB0aGUgYWxsb2NhdGlvbiBpcyBkb25lIGFjcm9zcyB0aGUgcGFnZSBib3VuZGFyeQotICogYXQgdGhlIGZpcnN0IHRpbWUsIHRoZW4gaXQgaXMgZnJlZWQgYW5kIHRoZSBhbGxvY2F0aW9uIGlzIGRvbmUgYXQKLSAqIGRlc2NyaXB0b3IgcmluZyBzaXplIGFsaWduZWQgbG9jYXRpb24uIFRoaXMgd2lsbCBlbnN1cmUgdGhhdCB0aGUgcmluZyB3aWxsCi0gKiBub3QgY3Jvc3MgcGFnZSBib3VuZGFyeQotICovCi1zdGF0aWMgdm9pZCAqZG1hX3JpbmdhbGxvYyhzdHJ1Y3QgZG1hX2luZm8gKmRpLCB1MzIgYm91bmRhcnksIHVpbnQgc2l6ZSwKLQkJCSAgIHUxNiAqYWxpZ25iaXRzLCB1aW50ICphbGxvY2VkLAotCQkJICAgZG1hYWRkcl90ICpkZXNjcGEpCi17Ci0Jdm9pZCAqdmE7Ci0JdTMyIGRlc2Nfc3RydGFkZHI7Ci0JdTMyIGFsaWduYnl0ZXMgPSAxIDw8ICphbGlnbmJpdHM7Ci0KLQl2YSA9IGRtYV9hbGxvY19jb25zaXN0ZW50KGRpLT5wYnVzLCBzaXplLCAqYWxpZ25iaXRzLCBhbGxvY2VkLCBkZXNjcGEpOwotCi0JaWYgKE5VTEwgPT0gdmEpCi0JCXJldHVybiBOVUxMOwotCi0JZGVzY19zdHJ0YWRkciA9ICh1MzIpIHJvdW5kdXAoKHVuc2lnbmVkIGxvbmcpdmEsIGFsaWduYnl0ZXMpOwotCWlmICgoKGRlc2Nfc3RydGFkZHIgKyBzaXplIC0gMSkgJiBib3VuZGFyeSkgIT0gKGRlc2Nfc3RydGFkZHIKLQkJCQkJCQkmIGJvdW5kYXJ5KSkgewotCQkqYWxpZ25iaXRzID0gZG1hX2FsaWduX3NpemV0b2JpdHMoc2l6ZSk7Ci0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGktPnBidXMsIHNpemUsIHZhLCAqZGVzY3BhKTsKLQkJdmEgPSBkbWFfYWxsb2NfY29uc2lzdGVudChkaS0+cGJ1cywgc2l6ZSwgKmFsaWduYml0cywKLQkJCWFsbG9jZWQsIGRlc2NwYSk7Ci0JfQotCXJldHVybiB2YTsKLX0KLQotLyogNjQtYml0IERNQSBmdW5jdGlvbnMgKi8KLQotc3RhdGljIHZvaWQgZG1hNjRfdHhpbml0KHN0cnVjdCBkbWFfaW5mbyAqZGkpCi17Ci0JdTMyIGNvbnRyb2wgPSBENjRfWENfWEU7Ci0KLQlETUFfVFJBQ0UoKCIlczogZG1hX3R4aW5pdFxuIiwgZGktPm5hbWUpKTsKLQotCWlmIChkaS0+bnR4ZCA9PSAwKQotCQlyZXR1cm47Ci0KLQlkaS0+dHhpbiA9IGRpLT50eG91dCA9IDA7Ci0JZGktPmRtYS50eGF2YWlsID0gZGktPm50eGQgLSAxOwotCi0JLyogY2xlYXIgdHggZGVzY3JpcHRvciByaW5nICovCi0JbWVtc2V0KCh2b2lkICopZGktPnR4ZDY0LCAnXDAnLCAoZGktPm50eGQgKiBzaXplb2Yoc3RydWN0IGRtYTY0ZGVzYykpKTsKLQotCS8qIERNQSBlbmdpbmUgd2l0aCBvdXQgYWxpZ25tZW50IHJlcXVpcmVtZW50IHJlcXVpcmVzIHRhYmxlIHRvIGJlIGluaXRlZAotCSAqIGJlZm9yZSBlbmFibGluZyB0aGUgZW5naW5lCi0JICovCi0JaWYgKCFkaS0+YWxpZ25kZXNjXzRrKQotCQlfZG1hX2RkdGFibGVfaW5pdChkaSwgRE1BX1RYLCBkaS0+dHhkcGEpOwotCi0JaWYgKChkaS0+ZG1hLmRtYWN0cmxmbGFncyAmIERNQV9DVFJMX1BFTikgPT0gMCkKLQkJY29udHJvbCB8PSBENjRfWENfUEQ7Ci0JT1JfUkVHKCZkaS0+ZDY0dHhyZWdzLT5jb250cm9sLCBjb250cm9sKTsKLQotCS8qIERNQSBlbmdpbmUgd2l0aCBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgcmVxdWlyZXMgdGFibGUgdG8gYmUgaW5pdGVkCi0JICogYmVmb3JlIGVuYWJsaW5nIHRoZSBlbmdpbmUKLQkgKi8KLQlpZiAoZGktPmFsaWduZGVzY180aykKLQkJX2RtYV9kZHRhYmxlX2luaXQoZGksIERNQV9UWCwgZGktPnR4ZHBhKTsKLX0KLQotc3RhdGljIGJvb2wgZG1hNjRfdHhlbmFibGVkKHN0cnVjdCBkbWFfaW5mbyAqZGkpCi17Ci0JdTMyIHhjOwotCi0JLyogSWYgdGhlIGNoaXAgaXMgZGVhZCwgaXQgaXMgbm90IGVuYWJsZWQgOi0pICovCi0JeGMgPSBSX1JFRygmZGktPmQ2NHR4cmVncy0+Y29udHJvbCk7Ci0JcmV0dXJuICh4YyAhPSAweGZmZmZmZmZmKSAmJiAoeGMgJiBENjRfWENfWEUpOwotfQotCi1zdGF0aWMgdm9pZCBkbWE2NF90eHN1c3BlbmQoc3RydWN0IGRtYV9pbmZvICpkaSkKLXsKLQlETUFfVFJBQ0UoKCIlczogZG1hX3R4c3VzcGVuZFxuIiwgZGktPm5hbWUpKTsKLQotCWlmIChkaS0+bnR4ZCA9PSAwKQotCQlyZXR1cm47Ci0KLQlPUl9SRUcoJmRpLT5kNjR0eHJlZ3MtPmNvbnRyb2wsIEQ2NF9YQ19TRSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYTY0X3R4cmVzdW1lKHN0cnVjdCBkbWFfaW5mbyAqZGkpCi17Ci0JRE1BX1RSQUNFKCgiJXM6IGRtYV90eHJlc3VtZVxuIiwgZGktPm5hbWUpKTsKLQotCWlmIChkaS0+bnR4ZCA9PSAwKQotCQlyZXR1cm47Ci0KLQlBTkRfUkVHKCZkaS0+ZDY0dHhyZWdzLT5jb250cm9sLCB+RDY0X1hDX1NFKTsKLX0KLQotc3RhdGljIGJvb2wgZG1hNjRfdHhzdXNwZW5kZWQoc3RydWN0IGRtYV9pbmZvICpkaSkKLXsKLQlyZXR1cm4gKGRpLT5udHhkID09IDApIHx8Ci0JICAgICgoUl9SRUcoJmRpLT5kNjR0eHJlZ3MtPmNvbnRyb2wpICYgRDY0X1hDX1NFKSA9PQotCSAgICAgRDY0X1hDX1NFKTsKLX0KLQotc3RhdGljIHZvaWQgZG1hNjRfdHhyZWNsYWltKHN0cnVjdCBkbWFfaW5mbyAqZGksIGVudW0gdHhkX3JhbmdlIHJhbmdlKQotewotCXZvaWQgKnA7Ci0KLQlETUFfVFJBQ0UoKCIlczogZG1hX3R4cmVjbGFpbSAlc1xuIiwgZGktPm5hbWUsCi0JCSAgIChyYW5nZSA9PSBETUFfUkFOR0VfQUxMKSA/ICJhbGwiIDoKLQkJICAgKChyYW5nZSA9PQotCQkgICAgIERNQV9SQU5HRV9UUkFOU01JVFRFRCkgPyAidHJhbnNtaXR0ZWQiIDoKLQkJICAgICJ0cmFuc2ZlcnJlZCIpKSk7Ci0KLQlpZiAoZGktPnR4aW4gPT0gZGktPnR4b3V0KQotCQlyZXR1cm47Ci0KLQl3aGlsZSAoKHAgPSBkbWE2NF9nZXRuZXh0dHhwKGRpLCByYW5nZSkpKSB7Ci0JCS8qIEZvciB1bmZyYW1lZCBkYXRhLCB3ZSBkb24ndCBoYXZlIGFueSBwYWNrZXRzIHRvIGZyZWUgKi8KLQkJaWYgKCEoZGktPmRtYS5kbWFjdHJsZmxhZ3MgJiBETUFfQ1RSTF9VTkZSQU1FRCkpCi0JCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKHApOwotCX0KLX0KLQotc3RhdGljIGJvb2wgZG1hNjRfdHhzdG9wcGVkKHN0cnVjdCBkbWFfaW5mbyAqZGkpCi17Ci0JcmV0dXJuICgoUl9SRUcoJmRpLT5kNjR0eHJlZ3MtPnN0YXR1czApICYgRDY0X1hTMF9YU19NQVNLKSA9PQotCQlENjRfWFMwX1hTX1NUT1BQRUQpOwotfQotCi1zdGF0aWMgYm9vbCBkbWE2NF9yeHN0b3BwZWQoc3RydWN0IGRtYV9pbmZvICpkaSkKLXsKLQlyZXR1cm4gKChSX1JFRygmZGktPmQ2NHJ4cmVncy0+c3RhdHVzMCkgJiBENjRfUlMwX1JTX01BU0spID09Ci0JCUQ2NF9SUzBfUlNfU1RPUFBFRCk7Ci19Ci0KLXN0YXRpYyBib29sIGRtYTY0X2FsbG9jKHN0cnVjdCBkbWFfaW5mbyAqZGksIHVpbnQgZGlyZWN0aW9uKQotewotCXUxNiBzaXplOwotCXVpbnQgZGRsZW47Ci0Jdm9pZCAqdmE7Ci0JdWludCBhbGxvY2VkID0gMDsKLQl1MTYgYWxpZ247Ci0JdTE2IGFsaWduX2JpdHM7Ci0KLQlkZGxlbiA9IHNpemVvZihzdHJ1Y3QgZG1hNjRkZXNjKTsKLQotCXNpemUgPSAoZGlyZWN0aW9uID09IERNQV9UWCkgPyAoZGktPm50eGQgKiBkZGxlbikgOiAoZGktPm5yeGQgKiBkZGxlbik7Ci0JYWxpZ25fYml0cyA9IGRpLT5kbWFkZXNjX2FsaWduOwotCWFsaWduID0gKDEgPDwgYWxpZ25fYml0cyk7Ci0KLQlpZiAoZGlyZWN0aW9uID09IERNQV9UWCkgewotCQl2YSA9IGRtYV9yaW5nYWxsb2MoZGksIEQ2NFJJTkdBTElHTiwgc2l6ZSwgJmFsaWduX2JpdHMsCi0JCQkmYWxsb2NlZCwgJmRpLT50eGRwYW9yaWcpOwotCQlpZiAodmEgPT0gTlVMTCkgewotCQkJRE1BX0VSUk9SKCgiJXM6IGRtYTY0X2FsbG9jOiBETUFfQUxMT0NfQ09OU0lTVEVOVChudHhkKSBmYWlsZWRcbiIsIGRpLT5uYW1lKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJYWxpZ24gPSAoMSA8PCBhbGlnbl9iaXRzKTsKLQkJZGktPnR4ZDY0ID0gKHN0cnVjdCBkbWE2NGRlc2MgKikKLQkJCQkJcm91bmR1cCgodW5zaWduZWQgbG9uZyl2YSwgYWxpZ24pOwotCQlkaS0+dHhkYWxpZ24gPSAodWludCkgKChzOCAqKWRpLT50eGQ2NCAtIChzOCAqKSB2YSk7Ci0JCVBIWVNBRERSTE9TRVQoZGktPnR4ZHBhLAotCQkJICAgICAgUEhZU0FERFJMTyhkaS0+dHhkcGFvcmlnKSArIGRpLT50eGRhbGlnbik7Ci0JCVBIWVNBRERSSElTRVQoZGktPnR4ZHBhLCBQSFlTQUREUkhJKGRpLT50eGRwYW9yaWcpKTsKLQkJZGktPnR4ZGFsbG9jID0gYWxsb2NlZDsKLQl9IGVsc2UgewotCQl2YSA9IGRtYV9yaW5nYWxsb2MoZGksIEQ2NFJJTkdBTElHTiwgc2l6ZSwgJmFsaWduX2JpdHMsCi0JCQkmYWxsb2NlZCwgJmRpLT5yeGRwYW9yaWcpOwotCQlpZiAodmEgPT0gTlVMTCkgewotCQkJRE1BX0VSUk9SKCgiJXM6IGRtYTY0X2FsbG9jOiBETUFfQUxMT0NfQ09OU0lTVEVOVChucnhkKSBmYWlsZWRcbiIsIGRpLT5uYW1lKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJYWxpZ24gPSAoMSA8PCBhbGlnbl9iaXRzKTsKLQkJZGktPnJ4ZDY0ID0gKHN0cnVjdCBkbWE2NGRlc2MgKikKLQkJCQkJcm91bmR1cCgodW5zaWduZWQgbG9uZyl2YSwgYWxpZ24pOwotCQlkaS0+cnhkYWxpZ24gPSAodWludCkgKChzOCAqKWRpLT5yeGQ2NCAtIChzOCAqKSB2YSk7Ci0JCVBIWVNBRERSTE9TRVQoZGktPnJ4ZHBhLAotCQkJICAgICAgUEhZU0FERFJMTyhkaS0+cnhkcGFvcmlnKSArIGRpLT5yeGRhbGlnbik7Ci0JCVBIWVNBRERSSElTRVQoZGktPnJ4ZHBhLCBQSFlTQUREUkhJKGRpLT5yeGRwYW9yaWcpKTsKLQkJZGktPnJ4ZGFsbG9jID0gYWxsb2NlZDsKLQl9Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgZG1hNjRfdHhyZXNldChzdHJ1Y3QgZG1hX2luZm8gKmRpKQotewotCXUzMiBzdGF0dXM7Ci0KLQlpZiAoZGktPm50eGQgPT0gMCkKLQkJcmV0dXJuIHRydWU7Ci0KLQkvKiBzdXNwZW5kIHR4IERNQSBmaXJzdCAqLwotCVdfUkVHKCZkaS0+ZDY0dHhyZWdzLT5jb250cm9sLCBENjRfWENfU0UpOwotCVNQSU5XQUlUKCgoc3RhdHVzID0KLQkJICAgKFJfUkVHKCZkaS0+ZDY0dHhyZWdzLT5zdGF0dXMwKSAmIEQ2NF9YUzBfWFNfTUFTSykpCi0JCSAgIT0gRDY0X1hTMF9YU19ESVNBQkxFRCkgJiYgKHN0YXR1cyAhPSBENjRfWFMwX1hTX0lETEUpCi0JCSAmJiAoc3RhdHVzICE9IEQ2NF9YUzBfWFNfU1RPUFBFRCksIDEwMDAwKTsKLQotCVdfUkVHKCZkaS0+ZDY0dHhyZWdzLT5jb250cm9sLCAwKTsKLQlTUElOV0FJVCgoKHN0YXR1cyA9Ci0JCSAgIChSX1JFRygmZGktPmQ2NHR4cmVncy0+c3RhdHVzMCkgJiBENjRfWFMwX1hTX01BU0spKQotCQkgICE9IEQ2NF9YUzBfWFNfRElTQUJMRUQpLCAxMDAwMCk7Ci0KLQkvKiB3YWl0IGZvciB0aGUgbGFzdCB0cmFuc2FjdGlvbiB0byBjb21wbGV0ZSAqLwotCXVkZWxheSgzMDApOwotCi0JcmV0dXJuIHN0YXR1cyA9PSBENjRfWFMwX1hTX0RJU0FCTEVEOwotfQotCi1zdGF0aWMgYm9vbCBkbWE2NF9yeGlkbGUoc3RydWN0IGRtYV9pbmZvICpkaSkKLXsKLQlETUFfVFJBQ0UoKCIlczogZG1hX3J4aWRsZVxuIiwgZGktPm5hbWUpKTsKLQotCWlmIChkaS0+bnJ4ZCA9PSAwKQotCQlyZXR1cm4gdHJ1ZTsKLQotCXJldHVybiAoKFJfUkVHKCZkaS0+ZDY0cnhyZWdzLT5zdGF0dXMwKSAmIEQ2NF9SUzBfQ0RfTUFTSykgPT0KLQkJKFJfUkVHKCZkaS0+ZDY0cnhyZWdzLT5wdHIpICYgRDY0X1JTMF9DRF9NQVNLKSk7Ci19Ci0KLXN0YXRpYyBib29sIGRtYTY0X3J4cmVzZXQoc3RydWN0IGRtYV9pbmZvICpkaSkKLXsKLQl1MzIgc3RhdHVzOwotCi0JaWYgKGRpLT5ucnhkID09IDApCi0JCXJldHVybiB0cnVlOwotCi0JV19SRUcoJmRpLT5kNjRyeHJlZ3MtPmNvbnRyb2wsIDApOwotCVNQSU5XQUlUKCgoc3RhdHVzID0KLQkJICAgKFJfUkVHKCZkaS0+ZDY0cnhyZWdzLT5zdGF0dXMwKSAmIEQ2NF9SUzBfUlNfTUFTSykpCi0JCSAgIT0gRDY0X1JTMF9SU19ESVNBQkxFRCksIDEwMDAwKTsKLQotCXJldHVybiBzdGF0dXMgPT0gRDY0X1JTMF9SU19ESVNBQkxFRDsKLX0KLQotc3RhdGljIGJvb2wgZG1hNjRfcnhlbmFibGVkKHN0cnVjdCBkbWFfaW5mbyAqZGkpCi17Ci0JdTMyIHJjOwotCi0JcmMgPSBSX1JFRygmZGktPmQ2NHJ4cmVncy0+Y29udHJvbCk7Ci0JcmV0dXJuIChyYyAhPSAweGZmZmZmZmZmKSAmJiAocmMgJiBENjRfUkNfUkUpOwotfQotCi1zdGF0aWMgYm9vbCBkbWE2NF90eHN1c3BlbmRlZGlkbGUoc3RydWN0IGRtYV9pbmZvICpkaSkKLXsKLQotCWlmIChkaS0+bnR4ZCA9PSAwKQotCQlyZXR1cm4gdHJ1ZTsKLQotCWlmICghKFJfUkVHKCZkaS0+ZDY0dHhyZWdzLT5jb250cm9sKSAmIEQ2NF9YQ19TRSkpCi0JCXJldHVybiAwOwotCi0JaWYgKChSX1JFRygmZGktPmQ2NHR4cmVncy0+c3RhdHVzMCkgJiBENjRfWFMwX1hTX01BU0spID09Ci0JICAgIEQ2NF9YUzBfWFNfSURMRSkKLQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogVXNlZnVsIHdoZW4gc2VuZGluZyB1bmZyYW1lZCBkYXRhLiAgVGhpcyBhbGxvd3MgdXMgdG8gZ2V0IGEgcHJvZ3Jlc3MgcmVwb3J0IGZyb20gdGhlIERNQS4KLSAqIFdlIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgREFUQSBidWZmZXIgb2YgdGhlIGN1cnJlbnQgZGVzY3JpcHRvci4KLSAqIElmIERNQSBpcyBpZGxlLCB3ZSByZXR1cm4gTlVMTC4KLSAqLwotc3RhdGljIHZvaWQgKmRtYTY0X2dldHBvcyhzdHJ1Y3QgZG1hX2luZm8gKmRpLCBib29sIGRpcmVjdGlvbikKLXsKLQl2b2lkICp2YTsKLQlib29sIGlkbGU7Ci0JdTMyIGNkX29mZnNldDsKLQotCWlmIChkaXJlY3Rpb24gPT0gRE1BX1RYKSB7Ci0JCWNkX29mZnNldCA9Ci0JCSAgICBSX1JFRygmZGktPmQ2NHR4cmVncy0+c3RhdHVzMCkgJiBENjRfWFMwX0NEX01BU0s7Ci0JCWlkbGUgPSAhTlRYREFDVElWRShkaS0+dHhpbiwgZGktPnR4b3V0KTsKLQkJdmEgPSBkaS0+dHhwW0IySShjZF9vZmZzZXQsIHN0cnVjdCBkbWE2NGRlc2MpXTsKLQl9IGVsc2UgewotCQljZF9vZmZzZXQgPQotCQkgICAgUl9SRUcoJmRpLT5kNjRyeHJlZ3MtPnN0YXR1czApICYgRDY0X1hTMF9DRF9NQVNLOwotCQlpZGxlID0gIU5SWERBQ1RJVkUoZGktPnJ4aW4sIGRpLT5yeG91dCk7Ci0JCXZhID0gZGktPnJ4cFtCMkkoY2Rfb2Zmc2V0LCBzdHJ1Y3QgZG1hNjRkZXNjKV07Ci0JfQotCi0JLyogSWYgRE1BIGlzIElETEUsIHJldHVybiBOVUxMICovCi0JaWYgKGlkbGUpIHsKLQkJRE1BX1RSQUNFKCgiJXM6IERNQSBpZGxlLCByZXR1cm4gTlVMTFxuIiwgX19mdW5jX18pKTsKLQkJdmEgPSBOVUxMOwotCX0KLQotCXJldHVybiB2YTsKLX0KLQotLyogVFggb2YgdW5mcmFtZWQgZGF0YQotICoKLSAqIEFkZHMgYSBETUEgcmluZyBkZXNjcmlwdG9yIGZvciB0aGUgZGF0YSBwb2ludGVkIHRvIGJ5ICJidWYiLgotICogVGhpcyBpcyBmb3IgRE1BIG9mIGEgYnVmZmVyIG9mIGRhdGEgYW5kIGlzIHVubGlrZSBvdGhlciBkbWEgVFggZnVuY3Rpb25zCi0gKiB0aGF0IHRha2UgYSBwb2ludGVyIHRvIGEgInBhY2tldCIKLSAqIEVhY2ggY2FsbCB0byB0aGlzIGlzIHJlc3VsdHMgaW4gYSBzaW5nbGUgZGVzY3JpcHRvciBiZWluZyBhZGRlZCBmb3IgImxlbiIgYnl0ZXMgb2YKLSAqIGRhdGEgc3RhcnRpbmcgYXQgImJ1ZiIsIGl0IGRvZXNuJ3QgaGFuZGxlIGNoYWluZWQgYnVmZmVycy4KLSAqLwotc3RhdGljIGludAotZG1hNjRfdHh1bmZyYW1lZChzdHJ1Y3QgZG1hX2luZm8gKmRpLCB2b2lkICpidWYsIHVpbnQgbGVuLCBib29sIGNvbW1pdCkKLXsKLQl1MTYgdHhvdXQ7Ci0JdTMyIGZsYWdzID0gMDsKLQlkbWFhZGRyX3QgcGE7CQkvKiBwaHlzIGFkZHIgKi8KLQotCXR4b3V0ID0gZGktPnR4b3V0OwotCi0JLyogcmV0dXJuIG5vbnplcm8gaWYgb3V0IG9mIHR4IGRlc2NyaXB0b3JzICovCi0JaWYgKE5FWFRUWEQodHhvdXQpID09IGRpLT50eGluKQotCQlnb3RvIG91dG9mdHhkOwotCi0JaWYgKGxlbiA9PSAwKQotCQlyZXR1cm4gMDsKLQotCXBhID0gcGNpX21hcF9zaW5nbGUoZGktPnBidXMsIGJ1ZiwgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQotCWZsYWdzID0gKEQ2NF9DVFJMMV9TT0YgfCBENjRfQ1RSTDFfSU9DIHwgRDY0X0NUUkwxX0VPRik7Ci0KLQlpZiAodHhvdXQgPT0gKGRpLT5udHhkIC0gMSkpCi0JCWZsYWdzIHw9IEQ2NF9DVFJMMV9FT1Q7Ci0KLQlkbWE2NF9kZF91cGQoZGksIGRpLT50eGQ2NCwgcGEsIHR4b3V0LCAmZmxhZ3MsIGxlbik7Ci0KLQkvKiBzYXZlIHRoZSBidWZmZXIgcG9pbnRlciAtIHVzZWQgYnkgZG1hX2dldHBvcyAqLwotCWRpLT50eHBbdHhvdXRdID0gYnVmOwotCi0JdHhvdXQgPSBORVhUVFhEKHR4b3V0KTsKLQkvKiBidW1wIHRoZSB0eCBkZXNjcmlwdG9yIGluZGV4ICovCi0JZGktPnR4b3V0ID0gdHhvdXQ7Ci0KLQkvKiBraWNrIHRoZSBjaGlwICovCi0JaWYgKGNvbW1pdCkgewotCQlXX1JFRygmZGktPmQ2NHR4cmVncy0+cHRyLAotCQkgICAgICBkaS0+eG10cHRyYmFzZSArIEkyQih0eG91dCwgc3RydWN0IGRtYTY0ZGVzYykpOwotCX0KLQotCS8qIHR4IGZsb3cgY29udHJvbCAqLwotCWRpLT5kbWEudHhhdmFpbCA9IGRpLT5udHhkIC0gTlRYREFDVElWRShkaS0+dHhpbiwgZGktPnR4b3V0KSAtIDE7Ci0KLQlyZXR1cm4gMDsKLQotIG91dG9mdHhkOgotCURNQV9FUlJPUigoIiVzOiAlczogb3V0IG9mIHR4ZHMgISEhXG4iLCBkaS0+bmFtZSwgX19mdW5jX18pKTsKLQlkaS0+ZG1hLnR4YXZhaWwgPSAwOwotCWRpLT5kbWEudHhub2J1ZisrOwotCXJldHVybiAtMTsKLX0KLQotLyogISEgdHggZW50cnkgcm91dGluZQotICogV0FSTklORzogY2FsbCBtdXN0IGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgZm9yIGVycm9yLgotICogICB0aGUgZXJyb3IodG9zcyBmcmFtZXMpIGNvdWxkIGJlIGZhdGFsIGFuZCBjYXVzZSBtYW55IHN1YnNlcXVlbnQgaGFyZCB0byBkZWJ1ZyBwcm9ibGVtcwotICovCi1zdGF0aWMgaW50IGRtYTY0X3R4ZmFzdChzdHJ1Y3QgZG1hX2luZm8gKmRpLCBzdHJ1Y3Qgc2tfYnVmZiAqcDAsCi0JCQkJICAgIGJvb2wgY29tbWl0KQotewotCXN0cnVjdCBza19idWZmICpwLCAqbmV4dDsKLQl1bnNpZ25lZCBjaGFyICpkYXRhOwotCXVpbnQgbGVuOwotCXUxNiB0eG91dDsKLQl1MzIgZmxhZ3MgPSAwOwotCWRtYWFkZHJfdCBwYTsKLQotCURNQV9UUkFDRSgoIiVzOiBkbWFfdHhmYXN0XG4iLCBkaS0+bmFtZSkpOwotCi0JdHhvdXQgPSBkaS0+dHhvdXQ7Ci0KLQkvKgotCSAqIFdhbGsgdGhlIGNoYWluIG9mIHBhY2tldCBidWZmZXJzCi0JICogYWxsb2NhdGluZyBhbmQgaW5pdGlhbGl6aW5nIHRyYW5zbWl0IGRlc2NyaXB0b3IgZW50cmllcy4KLQkgKi8KLQlmb3IgKHAgPSBwMDsgcDsgcCA9IG5leHQpIHsKLQkJdWludCBuc2VncywgajsKLQkJc3RydWN0IGRtYV9zZWdfbWFwICptYXA7Ci0KLQkJZGF0YSA9IHAtPmRhdGE7Ci0JCWxlbiA9IHAtPmxlbjsKLQkJbmV4dCA9IHAtPm5leHQ7Ci0KLQkJLyogcmV0dXJuIG5vbnplcm8gaWYgb3V0IG9mIHR4IGRlc2NyaXB0b3JzICovCi0JCWlmIChORVhUVFhEKHR4b3V0KSA9PSBkaS0+dHhpbikKLQkJCWdvdG8gb3V0b2Z0eGQ7Ci0KLQkJaWYgKGxlbiA9PSAwKQotCQkJY29udGludWU7Ci0KLQkJLyogZ2V0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgYnVmZmVyIHN0YXJ0ICovCi0JCWlmIChETUFTR0xJU1RfRU5BQikKLQkJCW1lbXNldCgmZGktPnR4cF9kbWFoW3R4b3V0XSwgMCwKLQkJCQlzaXplb2Yoc3RydWN0IGRtYV9zZWdfbWFwKSk7Ci0KLQkJcGEgPSBwY2lfbWFwX3NpbmdsZShkaS0+cGJ1cywgZGF0YSwgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQotCQlpZiAoRE1BU0dMSVNUX0VOQUIpIHsKLQkJCW1hcCA9ICZkaS0+dHhwX2RtYWhbdHhvdXRdOwotCi0JCQkvKiBTZWUgaWYgYWxsIHRoZSBzZWdtZW50cyBjYW4gYmUgYWNjb3VudGVkIGZvciAqLwotCQkJaWYgKG1hcC0+bnNlZ3MgPgotCQkJICAgICh1aW50KSAoZGktPm50eGQgLSBOVFhEQUNUSVZFKGRpLT50eGluLCBkaS0+dHhvdXQpIC0KLQkJCQkgICAgMSkpCi0JCQkJZ290byBvdXRvZnR4ZDsKLQotCQkJbnNlZ3MgPSBtYXAtPm5zZWdzOwotCQl9IGVsc2UKLQkJCW5zZWdzID0gMTsKLQotCQlmb3IgKGogPSAxOyBqIDw9IG5zZWdzOyBqKyspIHsKLQkJCWZsYWdzID0gMDsKLQkJCWlmIChwID09IHAwICYmIGogPT0gMSkKLQkJCQlmbGFncyB8PSBENjRfQ1RSTDFfU09GOwotCi0JCQkvKiBXaXRoIGEgRE1BIHNlZ21lbnQgbGlzdCwgRGVzY3JpcHRvciB0YWJsZSBpcyBmaWxsZWQKLQkJCSAqIHVzaW5nIHRoZSBzZWdtZW50IGxpc3QgaW5zdGVhZCBvZiBsb29waW5nIG92ZXIKLQkJCSAqIGJ1ZmZlcnMgaW4gbXVsdGktY2hhaW4gRE1BLiBUaGVyZWZvcmUsIEVPRiBmb3IgU0dMSVNUIGlzIHdoZW4KLQkJCSAqIGVuZCBvZiBzZWdtZW50IGxpc3QgaXMgcmVhY2hlZC4KLQkJCSAqLwotCQkJaWYgKCghRE1BU0dMSVNUX0VOQUIgJiYgbmV4dCA9PSBOVUxMKSB8fAotCQkJICAgIChETUFTR0xJU1RfRU5BQiAmJiBqID09IG5zZWdzKSkKLQkJCQlmbGFncyB8PSAoRDY0X0NUUkwxX0lPQyB8IEQ2NF9DVFJMMV9FT0YpOwotCQkJaWYgKHR4b3V0ID09IChkaS0+bnR4ZCAtIDEpKQotCQkJCWZsYWdzIHw9IEQ2NF9DVFJMMV9FT1Q7Ci0KLQkJCWlmIChETUFTR0xJU1RfRU5BQikgewotCQkJCWxlbiA9IG1hcC0+c2Vnc1tqIC0gMV0ubGVuZ3RoOwotCQkJCXBhID0gbWFwLT5zZWdzW2ogLSAxXS5hZGRyOwotCQkJfQotCQkJZG1hNjRfZGRfdXBkKGRpLCBkaS0+dHhkNjQsIHBhLCB0eG91dCwgJmZsYWdzLCBsZW4pOwotCi0JCQl0eG91dCA9IE5FWFRUWEQodHhvdXQpOwotCQl9Ci0KLQkJLyogU2VlIGFib3ZlLiBObyBuZWVkIHRvIGxvb3Agb3ZlciBpbmRpdmlkdWFsIGJ1ZmZlcnMgKi8KLQkJaWYgKERNQVNHTElTVF9FTkFCKQotCQkJYnJlYWs7Ci0JfQotCi0JLyogaWYgbGFzdCB0eGQgZW9mIG5vdCBzZXQsIGZpeCBpdCAqLwotCWlmICghKGZsYWdzICYgRDY0X0NUUkwxX0VPRikpCi0JCVdfU00oJmRpLT50eGQ2NFtQUkVWVFhEKHR4b3V0KV0uY3RybDEsCi0JCSAgICAgQlVTX1NXQVAzMihmbGFncyB8IEQ2NF9DVFJMMV9JT0MgfCBENjRfQ1RSTDFfRU9GKSk7Ci0KLQkvKiBzYXZlIHRoZSBwYWNrZXQgKi8KLQlkaS0+dHhwW1BSRVZUWEQodHhvdXQpXSA9IHAwOwotCi0JLyogYnVtcCB0aGUgdHggZGVzY3JpcHRvciBpbmRleCAqLwotCWRpLT50eG91dCA9IHR4b3V0OwotCi0JLyoga2ljayB0aGUgY2hpcCAqLwotCWlmIChjb21taXQpCi0JCVdfUkVHKCZkaS0+ZDY0dHhyZWdzLT5wdHIsCi0JCSAgICAgIGRpLT54bXRwdHJiYXNlICsgSTJCKHR4b3V0LCBzdHJ1Y3QgZG1hNjRkZXNjKSk7Ci0KLQkvKiB0eCBmbG93IGNvbnRyb2wgKi8KLQlkaS0+ZG1hLnR4YXZhaWwgPSBkaS0+bnR4ZCAtIE5UWERBQ1RJVkUoZGktPnR4aW4sIGRpLT50eG91dCkgLSAxOwotCi0JcmV0dXJuIDA7Ci0KLSBvdXRvZnR4ZDoKLQlETUFfRVJST1IoKCIlczogZG1hX3R4ZmFzdDogb3V0IG9mIHR4ZHMgISEhXG4iLCBkaS0+bmFtZSkpOwotCWJyY211X3BrdF9idWZfZnJlZV9za2IocDApOwotCWRpLT5kbWEudHhhdmFpbCA9IDA7Ci0JZGktPmRtYS50eG5vYnVmKys7Ci0JcmV0dXJuIC0xOwotfQotCi0vKgotICogUmVjbGFpbSBuZXh0IGNvbXBsZXRlZCB0eGQgKHR4ZHMgaWYgdXNpbmcgY2hhaW5lZCBidWZmZXJzKSBpbiB0aGUgcmFuZ2UKLSAqIHNwZWNpZmllZCBhbmQgcmV0dXJuIGFzc29jaWF0ZWQgcGFja2V0LgotICogSWYgcmFuZ2UgaXMgRE1BX1JBTkdFX1RSQU5TTUlUVEVELCByZWNsYWltIGRlc2NyaXB0b3JzIHRoYXQgaGF2ZSBiZQotICogdHJhbnNtaXR0ZWQgYXMgbm90ZWQgYnkgdGhlIGhhcmR3YXJlICJDdXJyRGVzY3IiIHBvaW50ZXIuCi0gKiBJZiByYW5nZSBpcyBETUFfUkFOR0VfVFJBTlNGRVJFRCwgcmVjbGFpbSBkZXNjcmlwdG9ycyB0aGF0IGhhdmUgYmUKLSAqIHRyYW5zZmVycmVkIGJ5IHRoZSBETUEgYXMgbm90ZWQgYnkgdGhlIGhhcmR3YXJlICJBY3RpdmVEZXNjciIgcG9pbnRlci4KLSAqIElmIHJhbmdlIGlzIERNQV9SQU5HRV9BTEwsIHJlY2xhaW0gYWxsIHR4ZChzKSBwb3N0ZWQgdG8gdGhlIHJpbmcgYW5kCi0gKiByZXR1cm4gYXNzb2NpYXRlZCBwYWNrZXQgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgaGFyZHdhcmUgcG9pbnRlcnMuCi0gKi8KLXN0YXRpYyB2b2lkICpkbWE2NF9nZXRuZXh0dHhwKHN0cnVjdCBkbWFfaW5mbyAqZGksIGVudW0gdHhkX3JhbmdlIHJhbmdlKQotewotCXUxNiBzdGFydCwgZW5kLCBpOwotCXUxNiBhY3RpdmVfZGVzYzsKLQl2b2lkICp0eHA7Ci0KLQlETUFfVFJBQ0UoKCIlczogZG1hX2dldG5leHR0eHAgJXNcbiIsIGRpLT5uYW1lLAotCQkgICAocmFuZ2UgPT0gRE1BX1JBTkdFX0FMTCkgPyAiYWxsIiA6Ci0JCSAgICgocmFuZ2UgPT0KLQkJICAgICBETUFfUkFOR0VfVFJBTlNNSVRURUQpID8gInRyYW5zbWl0dGVkIiA6Ci0JCSAgICAidHJhbnNmZXJyZWQiKSkpOwotCi0JaWYgKGRpLT5udHhkID09IDApCi0JCXJldHVybiBOVUxMOwotCi0JdHhwID0gTlVMTDsKLQotCXN0YXJ0ID0gZGktPnR4aW47Ci0JaWYgKHJhbmdlID09IERNQV9SQU5HRV9BTEwpCi0JCWVuZCA9IGRpLT50eG91dDsKLQllbHNlIHsKLQkJZG1hNjRyZWdzX3QgKmRyZWdzID0gZGktPmQ2NHR4cmVnczsKLQotCQllbmQgPSAodTE2KSAoQjJJKCgoUl9SRUcoJmRyZWdzLT5zdGF0dXMwKSAmCi0JCQkJIEQ2NF9YUzBfQ0RfTUFTSykgLQotCQkJCSBkaS0+eG10cHRyYmFzZSkgJiBENjRfWFMwX0NEX01BU0ssCi0JCQkJIHN0cnVjdCBkbWE2NGRlc2MpKTsKLQotCQlpZiAocmFuZ2UgPT0gRE1BX1JBTkdFX1RSQU5TRkVSRUQpIHsKLQkJCWFjdGl2ZV9kZXNjID0KLQkJCSAgICAodTE2KSAoUl9SRUcoJmRyZWdzLT5zdGF0dXMxKSAmCi0JCQkJICAgICAgRDY0X1hTMV9BRF9NQVNLKTsKLQkJCWFjdGl2ZV9kZXNjID0KLQkJCSAgICAoYWN0aXZlX2Rlc2MgLSBkaS0+eG10cHRyYmFzZSkgJiBENjRfWFMwX0NEX01BU0s7Ci0JCQlhY3RpdmVfZGVzYyA9IEIySShhY3RpdmVfZGVzYywgc3RydWN0IGRtYTY0ZGVzYyk7Ci0JCQlpZiAoZW5kICE9IGFjdGl2ZV9kZXNjKQotCQkJCWVuZCA9IFBSRVZUWEQoYWN0aXZlX2Rlc2MpOwotCQl9Ci0JfQotCi0JaWYgKChzdGFydCA9PSAwKSAmJiAoZW5kID4gZGktPnR4b3V0KSkKLQkJZ290byBib2d1czsKLQotCWZvciAoaSA9IHN0YXJ0OyBpICE9IGVuZCAmJiAhdHhwOyBpID0gTkVYVFRYRChpKSkgewotCQlkbWFhZGRyX3QgcGE7Ci0JCXN0cnVjdCBkbWFfc2VnX21hcCAqbWFwID0gTlVMTDsKLQkJdWludCBzaXplLCBqLCBuc2VnczsKLQotCQlQSFlTQUREUkxPU0VUKHBhLAotCQkJICAgICAgKEJVU19TV0FQMzIoUl9TTSgmZGktPnR4ZDY0W2ldLmFkZHJsb3cpKSAtCi0JCQkgICAgICAgZGktPmRhdGFvZmZzZXRsb3cpKTsKLQkJUEhZU0FERFJISVNFVChwYSwKLQkJCSAgICAgIChCVVNfU1dBUDMyKFJfU00oJmRpLT50eGQ2NFtpXS5hZGRyaGlnaCkpIC0KLQkJCSAgICAgICBkaS0+ZGF0YW9mZnNldGhpZ2gpKTsKLQotCQlpZiAoRE1BU0dMSVNUX0VOQUIpIHsKLQkJCW1hcCA9ICZkaS0+dHhwX2RtYWhbaV07Ci0JCQlzaXplID0gbWFwLT5vcmlnc2l6ZTsKLQkJCW5zZWdzID0gbWFwLT5uc2VnczsKLQkJfSBlbHNlIHsKLQkJCXNpemUgPQotCQkJICAgIChCVVNfU1dBUDMyKFJfU00oJmRpLT50eGQ2NFtpXS5jdHJsMikpICYKLQkJCSAgICAgRDY0X0NUUkwyX0JDX01BU0spOwotCQkJbnNlZ3MgPSAxOwotCQl9Ci0KLQkJZm9yIChqID0gbnNlZ3M7IGogPiAwOyBqLS0pIHsKLQkJCVdfU00oJmRpLT50eGQ2NFtpXS5hZGRybG93LCAweGRlYWRiZWVmKTsKLQkJCVdfU00oJmRpLT50eGQ2NFtpXS5hZGRyaGlnaCwgMHhkZWFkYmVlZik7Ci0KLQkJCXR4cCA9IGRpLT50eHBbaV07Ci0JCQlkaS0+dHhwW2ldID0gTlVMTDsKLQkJCWlmIChqID4gMSkKLQkJCQlpID0gTkVYVFRYRChpKTsKLQkJfQotCi0JCXBjaV91bm1hcF9zaW5nbGUoZGktPnBidXMsIHBhLCBzaXplLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQl9Ci0KLQlkaS0+dHhpbiA9IGk7Ci0KLQkvKiB0eCBmbG93IGNvbnRyb2wgKi8KLQlkaS0+ZG1hLnR4YXZhaWwgPSBkaS0+bnR4ZCAtIE5UWERBQ1RJVkUoZGktPnR4aW4sIGRpLT50eG91dCkgLSAxOwotCi0JcmV0dXJuIHR4cDsKLQotIGJvZ3VzOgotCURNQV9OT05FKCgiZG1hX2dldG5leHR0eHA6IGJvZ3VzIGN1cnI6IHN0YXJ0ICVkIGVuZCAlZCB0eG91dCAlZCBmb3JjZSAlZFxuIiwgc3RhcnQsIGVuZCwgZGktPnR4b3V0LCBmb3JjZWFsbCkpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCAqZG1hNjRfZ2V0bmV4dHJ4cChzdHJ1Y3QgZG1hX2luZm8gKmRpLCBib29sIGZvcmNlYWxsKQotewotCXVpbnQgaSwgY3VycjsKLQl2b2lkICpyeHA7Ci0JZG1hYWRkcl90IHBhOwotCi0JaSA9IGRpLT5yeGluOwotCi0JLyogcmV0dXJuIGlmIG5vIHBhY2tldHMgcG9zdGVkICovCi0JaWYgKGkgPT0gZGktPnJ4b3V0KQotCQlyZXR1cm4gTlVMTDsKLQotCWN1cnIgPQotCSAgICBCMkkoKChSX1JFRygmZGktPmQ2NHJ4cmVncy0+c3RhdHVzMCkgJiBENjRfUlMwX0NEX01BU0spIC0KLQkJIGRpLT5yY3ZwdHJiYXNlKSAmIEQ2NF9SUzBfQ0RfTUFTSywgc3RydWN0IGRtYTY0ZGVzYyk7Ci0KLQkvKiBpZ25vcmUgY3VyciBpZiBmb3JjZWFsbCAqLwotCWlmICghZm9yY2VhbGwgJiYgKGkgPT0gY3VycikpCi0JCXJldHVybiBOVUxMOwotCi0JLyogZ2V0IHRoZSBwYWNrZXQgcG9pbnRlciB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSByeCBkZXNjcmlwdG9yICovCi0JcnhwID0gZGktPnJ4cFtpXTsKLQlkaS0+cnhwW2ldID0gTlVMTDsKLQotCVBIWVNBRERSTE9TRVQocGEsCi0JCSAgICAgIChCVVNfU1dBUDMyKFJfU00oJmRpLT5yeGQ2NFtpXS5hZGRybG93KSkgLQotCQkgICAgICAgZGktPmRhdGFvZmZzZXRsb3cpKTsKLQlQSFlTQUREUkhJU0VUKHBhLAotCQkgICAgICAoQlVTX1NXQVAzMihSX1NNKCZkaS0+cnhkNjRbaV0uYWRkcmhpZ2gpKSAtCi0JCSAgICAgICBkaS0+ZGF0YW9mZnNldGhpZ2gpKTsKLQotCS8qIGNsZWFyIHRoaXMgcGFja2V0IGZyb20gdGhlIGRlc2NyaXB0b3IgcmluZyAqLwotCXBjaV91bm1hcF9zaW5nbGUoZGktPnBidXMsIHBhLCBkaS0+cnhidWZzaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCi0JV19TTSgmZGktPnJ4ZDY0W2ldLmFkZHJsb3csIDB4ZGVhZGJlZWYpOwotCVdfU00oJmRpLT5yeGQ2NFtpXS5hZGRyaGlnaCwgMHhkZWFkYmVlZik7Ci0KLQlkaS0+cnhpbiA9IE5FWFRSWEQoaSk7Ci0KLQlyZXR1cm4gcnhwOwotfQotCi1zdGF0aWMgYm9vbCBfZG1hNjRfYWRkcmV4dChkbWE2NHJlZ3NfdCAqZG1hNjRyZWdzKQotewotCXUzMiB3OwotCU9SX1JFRygmZG1hNjRyZWdzLT5jb250cm9sLCBENjRfWENfQUUpOwotCXcgPSBSX1JFRygmZG1hNjRyZWdzLT5jb250cm9sKTsKLQlBTkRfUkVHKCZkbWE2NHJlZ3MtPmNvbnRyb2wsIH5ENjRfWENfQUUpOwotCXJldHVybiAodyAmIEQ2NF9YQ19BRSkgPT0gRDY0X1hDX0FFOwotfQotCi0vKgotICogUm90YXRlIGFsbCBhY3RpdmUgdHggZG1hIHJpbmcgZW50cmllcyAiZm9yd2FyZCIgYnkgKEFjdGl2ZURlc2NyaXB0b3IgLSB0eGluKS4KLSAqLwotc3RhdGljIHZvaWQgZG1hNjRfdHhyb3RhdGUoc3RydWN0IGRtYV9pbmZvICpkaSkKLXsKLQl1MTYgYWQ7Ci0JdWludCBuYWN0aXZlOwotCXVpbnQgcm90OwotCXUxNiBvbGQsIG5ldzsKLQl1MzIgdzsKLQl1MTYgZmlyc3QsIGxhc3Q7Ci0KLQluYWN0aXZlID0gX2RtYV90eGFjdGl2ZShkaSk7Ci0JYWQgPSAodTE2KSAoQjJJKCgoKFJfUkVHKCZkaS0+ZDY0dHhyZWdzLT5zdGF0dXMxKSAmCi0JCQkgICBENjRfWFMxX0FEX01BU0spIC0gZGktPnhtdHB0cmJhc2UpICYKLQkJCSAgIEQ2NF9YUzFfQURfTUFTSyksIHN0cnVjdCBkbWE2NGRlc2MpKTsKLQlyb3QgPSBUWEQoYWQgLSBkaS0+dHhpbik7Ci0KLQkvKiBmdWxsLXJpbmcgY2FzZSBpcyBhIGxvdCBoYXJkZXIgLSBkb24ndCB3b3JyeSBhYm91dCB0aGlzICovCi0JaWYgKHJvdCA+PSAoZGktPm50eGQgLSBuYWN0aXZlKSkgewotCQlETUFfRVJST1IoKCIlczogZG1hX3R4cm90YXRlOiByaW5nIGZ1bGwgLSBwdW50XG4iLCBkaS0+bmFtZSkpOwotCQlyZXR1cm47Ci0JfQotCi0JZmlyc3QgPSBkaS0+dHhpbjsKLQlsYXN0ID0gUFJFVlRYRChkaS0+dHhvdXQpOwotCi0JLyogbW92ZSBlbnRyaWVzIHN0YXJ0aW5nIGF0IGxhc3QgYW5kIG1vdmluZyBiYWNrd2FyZHMgdG8gZmlyc3QgKi8KLQlmb3IgKG9sZCA9IGxhc3Q7IG9sZCAhPSBQUkVWVFhEKGZpcnN0KTsgb2xkID0gUFJFVlRYRChvbGQpKSB7Ci0JCW5ldyA9IFRYRChvbGQgKyByb3QpOwotCi0JCS8qCi0JCSAqIE1vdmUgdGhlIHR4IGRtYSBkZXNjcmlwdG9yLgotCQkgKiBFT1QgaXMgc2V0IG9ubHkgaW4gdGhlIGxhc3QgZW50cnkgaW4gdGhlIHJpbmcuCi0JCSAqLwotCQl3ID0gQlVTX1NXQVAzMihSX1NNKCZkaS0+dHhkNjRbb2xkXS5jdHJsMSkpICYgfkQ2NF9DVFJMMV9FT1Q7Ci0JCWlmIChuZXcgPT0gKGRpLT5udHhkIC0gMSkpCi0JCQl3IHw9IEQ2NF9DVFJMMV9FT1Q7Ci0JCVdfU00oJmRpLT50eGQ2NFtuZXddLmN0cmwxLCBCVVNfU1dBUDMyKHcpKTsKLQotCQl3ID0gQlVTX1NXQVAzMihSX1NNKCZkaS0+dHhkNjRbb2xkXS5jdHJsMikpOwotCQlXX1NNKCZkaS0+dHhkNjRbbmV3XS5jdHJsMiwgQlVTX1NXQVAzMih3KSk7Ci0KLQkJV19TTSgmZGktPnR4ZDY0W25ld10uYWRkcmxvdywgUl9TTSgmZGktPnR4ZDY0W29sZF0uYWRkcmxvdykpOwotCQlXX1NNKCZkaS0+dHhkNjRbbmV3XS5hZGRyaGlnaCwgUl9TTSgmZGktPnR4ZDY0W29sZF0uYWRkcmhpZ2gpKTsKLQotCQkvKiB6YXAgdGhlIG9sZCB0eCBkbWEgZGVzY3JpcHRvciBhZGRyZXNzIGZpZWxkICovCi0JCVdfU00oJmRpLT50eGQ2NFtvbGRdLmFkZHJsb3csIEJVU19TV0FQMzIoMHhkZWFkYmVlZikpOwotCQlXX1NNKCZkaS0+dHhkNjRbb2xkXS5hZGRyaGlnaCwgQlVTX1NXQVAzMigweGRlYWRiZWVmKSk7Ci0KLQkJLyogbW92ZSB0aGUgY29ycmVzcG9uZGluZyB0eHBbXSBlbnRyeSAqLwotCQlkaS0+dHhwW25ld10gPSBkaS0+dHhwW29sZF07Ci0KLQkJLyogTW92ZSB0aGUgbWFwICovCi0JCWlmIChETUFTR0xJU1RfRU5BQikgewotCQkJbWVtY3B5KCZkaS0+dHhwX2RtYWhbbmV3XSwgJmRpLT50eHBfZG1haFtvbGRdLAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZG1hX3NlZ19tYXApKTsKLQkJCW1lbXNldCgmZGktPnR4cF9kbWFoW29sZF0sIDAsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBkbWFfc2VnX21hcCkpOwotCQl9Ci0KLQkJZGktPnR4cFtvbGRdID0gTlVMTDsKLQl9Ci0KLQkvKiB1cGRhdGUgdHhpbiBhbmQgdHhvdXQgKi8KLQlkaS0+dHhpbiA9IGFkOwotCWRpLT50eG91dCA9IFRYRChkaS0+dHhvdXQgKyByb3QpOwotCWRpLT5kbWEudHhhdmFpbCA9IGRpLT5udHhkIC0gTlRYREFDVElWRShkaS0+dHhpbiwgZGktPnR4b3V0KSAtIDE7Ci0KLQkvKiBraWNrIHRoZSBjaGlwICovCi0JV19SRUcoJmRpLT5kNjR0eHJlZ3MtPnB0ciwKLQkgICAgICBkaS0+eG10cHRyYmFzZSArIEkyQihkaS0+dHhvdXQsIHN0cnVjdCBkbWE2NGRlc2MpKTsKLX0KLQotdWludCBkbWFfYWRkcndpZHRoKHN0cnVjdCBzaV9wdWIgKnNpaCwgdm9pZCAqZG1hcmVncykKLXsKLQkvKiBQZXJmb3JtIDY0LWJpdCBjaGVja3Mgb25seSBpZiB3ZSB3YW50IHRvIGFkdmVydGlzZSA2NC1iaXQgKD4gMzJiaXQpIGNhcGFiaWxpdHkpICovCi0JLyogRE1BIGVuZ2luZSBpcyA2NC1iaXQgY2FwYWJsZSAqLwotCWlmICgoYWlfY29yZV9zZmxhZ3Moc2loLCAwLCAwKSAmIFNJU0ZfRE1BNjQpID09IFNJU0ZfRE1BNjQpIHsKLQkJLyogYmFja3BsYW5lIGFyZSA2NC1iaXQgY2FwYWJsZSAqLwotCQlpZiAoYWlfYmFja3BsYW5lNjQoc2loKSkKLQkJCS8qIElmIGJ1cyBpcyBTeXN0ZW0gQmFja3BsYW5lIG9yIFBDSUUgdGhlbiB3ZSBjYW4gYWNjZXNzIDY0LWJpdHMgKi8KLQkJCWlmICgoc2loLT5idXN0eXBlID09IFNJX0JVUykgfHwKLQkJCSAgICAoKHNpaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKSAmJgotCQkJICAgICAoc2loLT5idXNjb3JldHlwZSA9PSBQQ0lFX0NPUkVfSUQpKSkKLQkJCQlyZXR1cm4gRE1BRERSV0lEVEhfNjQ7Ci0JfQotCS8qIERNQSBoYXJkd2FyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgZHJpdmVyKi8KLQlyZXR1cm4gRE1BRERSV0lEVEhfNjQ7Ci19Ci0KLS8qCi0gKiBNYWM4MDIxMSBpbml0aWF0ZWQgYWN0aW9ucyBzb21ldGltZXMgcmVxdWlyZSBwYWNrZXRzIGluIHRoZSBETUEgcXVldWUgdG8gYmUKLSAqIG1vZGlmaWVkLiBUaGUgbW9kaWZpZWQgcG9ydGlvbiBvZiB0aGUgcGFja2V0IGlzIG5vdCB1bmRlciBjb250cm9sIG9mIHRoZSBETUEKLSAqIGVuZ2luZS4gVGhpcyBmdW5jdGlvbiBjYWxscyBhIGNhbGxlci1zdXBwbGllZCBmdW5jdGlvbiBmb3IgZWFjaCBwYWNrZXQgaW4KLSAqIHRoZSBjYWxsZXIgc3BlY2lmaWVkIGRtYSBjaGFpbi4KLSAqLwotdm9pZCBkbWFfd2Fsa19wYWNrZXRzKHN0cnVjdCBkbWFfcHViICpkbWFoLCB2b2lkICgqY2FsbGJhY2tfZm5jKQotCQkgICAgICAodm9pZCAqcGt0LCB2b2lkICphcmdfYSksIHZvaWQgKmFyZ19hKQotewotCXN0cnVjdCBkbWFfaW5mbyAqZGkgPSAoc3RydWN0IGRtYV9pbmZvICopIGRtYWg7Ci0JdWludCBpID0gICBkaS0+dHhpbjsKLQl1aW50IGVuZCA9IGRpLT50eG91dDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbzsKLQotCXdoaWxlIChpICE9IGVuZCkgewotCQlza2IgPSAoc3RydWN0IHNrX2J1ZmYgKilkaS0+dHhwW2ldOwotCQlpZiAoc2tiICE9IE5VTEwpIHsKLQkJCXR4X2luZm8gPSAoc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICopc2tiLT5jYjsKLQkJCShjYWxsYmFja19mbmMpKHR4X2luZm8sIGFyZ19hKTsKLQkJfQotCQlpID0gTkVYVFRYRChpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL2RtYS5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9kbWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM4YjlhNi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL2RtYS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmCV9CUkNNX0RNQV9IXwotI2RlZmluZQlfQlJDTV9ETUFfSF8KLQotI2luY2x1ZGUgInR5cGVzLmgiCQkvKiBmb3J3YXJkIHN0cnVjdHVyZSBkZWNsYXJhdGlvbnMgKi8KLQotLyogRE1BIHN0cnVjdHVyZToKLSAqICBzdXBwb3J0IHR3byBETUEgZW5naW5lczogMzIgYml0cyBhZGRyZXNzIG9yIDY0IGJpdCBhZGRyZXNzaW5nCi0gKiAgYmFzaWMgRE1BIHJlZ2lzdGVyIHNldCBpcyBwZXIgY2hhbm5lbCh0cmFuc21pdCBvciByZWNlaXZlKQotICogIGEgcGFpciBvZiBjaGFubmVscyBpcyBkZWZpbmVkIGZvciBjb252ZW5pZW5jZQotICovCi0KLS8qIDMyIGJpdHMgYWRkcmVzc2luZyAqLwotCi1zdHJ1Y3QgZG1hMzJkaWFnIHsJLyogZGlhZyBhY2Nlc3MgKi8KLQl1MzIgZmlmb2FkZHI7CS8qIGRpYWcgYWRkcmVzcyAqLwotCXUzMiBmaWZvZGF0YWxvdzsJLyogbG93IDMyYml0cyBvZiBkYXRhICovCi0JdTMyIGZpZm9kYXRhaGlnaDsJLyogaGlnaCAzMmJpdHMgb2YgZGF0YSAqLwotCXUzMiBwYWQ7CQkvKiByZXNlcnZlZCAqLwotfTsKLQotLyogNjQgYml0cyBhZGRyZXNzaW5nICovCi0KLS8qIGRtYSByZWdpc3RlcnMgcGVyIGNoYW5uZWwoeG10IG9yIHJjdikgKi8KLXN0cnVjdCBkbWE2NHJlZ3MgewotCXUzMiBjb250cm9sOwkJLyogZW5hYmxlLCBldCBhbCAqLwotCXUzMiBwdHI7CQkvKiBsYXN0IGRlc2NyaXB0b3IgcG9zdGVkIHRvIGNoaXAgKi8KLQl1MzIgYWRkcmxvdzsJCS8qIGRlc2NyaXB0b3IgcmluZyBiYXNlIGFkZHJlc3MgbG93IDMyLWJpdHMgKDhLIGFsaWduZWQpICovCi0JdTMyIGFkZHJoaWdoOwkvKiBkZXNjcmlwdG9yIHJpbmcgYmFzZSBhZGRyZXNzIGJpdHMgNjM6MzIgKDhLIGFsaWduZWQpICovCi0JdTMyIHN0YXR1czA7CQkvKiBjdXJyZW50IGRlc2NyaXB0b3IsIHhtdCBzdGF0ZSAqLwotCXUzMiBzdGF0dXMxOwkJLyogYWN0aXZlIGRlc2NyaXB0b3IsIHhtdCBlcnJvciAqLwotfTsKLQotLyogbWFwL3VubWFwIGRpcmVjdGlvbiAqLwotI2RlZmluZQlETUFfVFgJMQkJLyogVFggZGlyZWN0aW9uIGZvciBETUEgKi8KLSNkZWZpbmUJRE1BX1JYCTIJCS8qIFJYIGRpcmVjdGlvbiBmb3IgRE1BICovCi0jZGVmaW5lIEJVU19TV0FQMzIodikJCSh2KQotCi0vKiByYW5nZSBwYXJhbSBmb3IgZG1hX2dldG5leHR0eHAoKSBhbmQgZG1hX3R4cmVjbGFpbSAqLwotZW51bSB0eGRfcmFuZ2UgewotCURNQV9SQU5HRV9BTEwgPSAxLAotCURNQV9SQU5HRV9UUkFOU01JVFRFRCwKLQlETUFfUkFOR0VfVFJBTlNGRVJFRAotfTsKLQotLyogZG1hIGZ1bmN0aW9uIHR5cGUgKi8KLXR5cGVkZWYgdm9pZCAoKmRpX2RldGFjaF90KSAoc3RydWN0IGRtYV9wdWIgKmRtYWgpOwotdHlwZWRlZiBib29sKCpkaV90eHJlc2V0X3QpIChzdHJ1Y3QgZG1hX3B1YiAqZG1haCk7Ci10eXBlZGVmIGJvb2woKmRpX3J4cmVzZXRfdCkgKHN0cnVjdCBkbWFfcHViICpkbWFoKTsKLXR5cGVkZWYgYm9vbCgqZGlfcnhpZGxlX3QpIChzdHJ1Y3QgZG1hX3B1YiAqZG1haCk7Ci10eXBlZGVmIHZvaWQgKCpkaV90eGluaXRfdCkgKHN0cnVjdCBkbWFfcHViICpkbWFoKTsKLXR5cGVkZWYgYm9vbCgqZGlfdHhlbmFibGVkX3QpIChzdHJ1Y3QgZG1hX3B1YiAqZG1haCk7Ci10eXBlZGVmIHZvaWQgKCpkaV9yeGluaXRfdCkgKHN0cnVjdCBkbWFfcHViICpkbWFoKTsKLXR5cGVkZWYgdm9pZCAoKmRpX3R4c3VzcGVuZF90KSAoc3RydWN0IGRtYV9wdWIgKmRtYWgpOwotdHlwZWRlZiB2b2lkICgqZGlfdHhyZXN1bWVfdCkgKHN0cnVjdCBkbWFfcHViICpkbWFoKTsKLXR5cGVkZWYgYm9vbCgqZGlfdHhzdXNwZW5kZWRfdCkgKHN0cnVjdCBkbWFfcHViICpkbWFoKTsKLXR5cGVkZWYgYm9vbCgqZGlfdHhzdXNwZW5kZWRpZGxlX3QpIChzdHJ1Y3QgZG1hX3B1YiAqZG1haCk7Ci10eXBlZGVmIGludCAoKmRpX3R4ZmFzdF90KSAoc3RydWN0IGRtYV9wdWIgKmRtYWgsIHN0cnVjdCBza19idWZmICpwLAotCQkJICAgIGJvb2wgY29tbWl0KTsKLXR5cGVkZWYgaW50ICgqZGlfdHh1bmZyYW1lZF90KSAoc3RydWN0IGRtYV9wdWIgKmRtYWgsIHZvaWQgKnAsIHVpbnQgbGVuLAotCQkJCWJvb2wgY29tbWl0KTsKLXR5cGVkZWYgdm9pZCAqKCpkaV9nZXRwb3NfdCkgKHN0cnVjdCBkbWFfcHViICpkaSwgYm9vbCBkaXJlY3Rpb24pOwotdHlwZWRlZiB2b2lkICgqZGlfZmlmb2xvb3BiYWNrZW5hYmxlX3QpIChzdHJ1Y3QgZG1hX3B1YiAqZG1haCk7Ci10eXBlZGVmIGJvb2woKmRpX3R4c3RvcHBlZF90KSAoc3RydWN0IGRtYV9wdWIgKmRtYWgpOwotdHlwZWRlZiBib29sKCpkaV9yeHN0b3BwZWRfdCkgKHN0cnVjdCBkbWFfcHViICpkbWFoKTsKLXR5cGVkZWYgYm9vbCgqZGlfcnhlbmFibGVfdCkgKHN0cnVjdCBkbWFfcHViICpkbWFoKTsKLXR5cGVkZWYgYm9vbCgqZGlfcnhlbmFibGVkX3QpIChzdHJ1Y3QgZG1hX3B1YiAqZG1haCk7Ci10eXBlZGVmIHZvaWQgKigqZGlfcnhfdCkgKHN0cnVjdCBkbWFfcHViICpkbWFoKTsKLXR5cGVkZWYgYm9vbCgqZGlfcnhmaWxsX3QpIChzdHJ1Y3QgZG1hX3B1YiAqZG1haCk7Ci10eXBlZGVmIHZvaWQgKCpkaV90eHJlY2xhaW1fdCkgKHN0cnVjdCBkbWFfcHViICpkbWFoLCBlbnVtIHR4ZF9yYW5nZSByYW5nZSk7Ci10eXBlZGVmIHZvaWQgKCpkaV9yeHJlY2xhaW1fdCkgKHN0cnVjdCBkbWFfcHViICpkbWFoKTsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAoKmRpX2dldHZhcl90KSAoc3RydWN0IGRtYV9wdWIgKmRtYWgsCi0JCQkJICAgICAgY29uc3QgY2hhciAqbmFtZSk7Ci10eXBlZGVmIHZvaWQgKigqZGlfZ2V0bmV4dHR4cF90KSAoc3RydWN0IGRtYV9wdWIgKmRtYWgsIGVudW0gdHhkX3JhbmdlIHJhbmdlKTsKLXR5cGVkZWYgdm9pZCAqKCpkaV9nZXRuZXh0cnhwX3QpIChzdHJ1Y3QgZG1hX3B1YiAqZG1haCwgYm9vbCBmb3JjZWFsbCk7Ci10eXBlZGVmIHZvaWQgKigqZGlfcGVla25leHR0eHBfdCkgKHN0cnVjdCBkbWFfcHViICpkbWFoKTsKLXR5cGVkZWYgdm9pZCAqKCpkaV9wZWVrbmV4dHJ4cF90KSAoc3RydWN0IGRtYV9wdWIgKmRtYWgpOwotdHlwZWRlZiB2b2lkICgqZGlfcnhwYXJhbV9nZXRfdCkgKHN0cnVjdCBkbWFfcHViICpkbWFoLCB1MTYgKnJ4b2Zmc2V0LAotCQkJCSAgdTE2ICpyeGJ1ZnNpemUpOwotdHlwZWRlZiB2b2lkICgqZGlfdHhibG9ja190KSAoc3RydWN0IGRtYV9wdWIgKmRtYWgpOwotdHlwZWRlZiB2b2lkICgqZGlfdHh1bmJsb2NrX3QpIChzdHJ1Y3QgZG1hX3B1YiAqZG1haCk7Ci10eXBlZGVmIHVpbnQoKmRpX3R4YWN0aXZlX3QpIChzdHJ1Y3QgZG1hX3B1YiAqZG1haCk7Ci10eXBlZGVmIHZvaWQgKCpkaV90eHJvdGF0ZV90KSAoc3RydWN0IGRtYV9wdWIgKmRtYWgpOwotdHlwZWRlZiB2b2lkICgqZGlfY291bnRlcnJlc2V0X3QpIChzdHJ1Y3QgZG1hX3B1YiAqZG1haCk7Ci10eXBlZGVmIHVpbnQoKmRpX2N0cmxmbGFnc190KSAoc3RydWN0IGRtYV9wdWIgKmRtYWgsIHVpbnQgbWFzaywgdWludCBmbGFncyk7Ci10eXBlZGVmIGNoYXIgKigqZGlfZHVtcF90KSAoc3RydWN0IGRtYV9wdWIgKmRtYWgsIHN0cnVjdCBicmNtdV9zdHJidWYgKmIsCi0JCQkgICAgYm9vbCBkdW1wcmluZyk7Ci10eXBlZGVmIGNoYXIgKigqZGlfZHVtcHR4X3QpIChzdHJ1Y3QgZG1hX3B1YiAqZG1haCwgc3RydWN0IGJyY211X3N0cmJ1ZiAqYiwKLQkJCSAgICAgIGJvb2wgZHVtcHJpbmcpOwotdHlwZWRlZiBjaGFyICooKmRpX2R1bXByeF90KSAoc3RydWN0IGRtYV9wdWIgKmRtYWgsIHN0cnVjdCBicmNtdV9zdHJidWYgKmIsCi0JCQkgICAgICBib29sIGR1bXByaW5nKTsKLXR5cGVkZWYgdWludCgqZGlfcnhhY3RpdmVfdCkgKHN0cnVjdCBkbWFfcHViICpkbWFoKTsKLXR5cGVkZWYgdWludCgqZGlfdHhwZW5kaW5nX3QpIChzdHJ1Y3QgZG1hX3B1YiAqZG1haCk7Ci10eXBlZGVmIHVpbnQoKmRpX3R4Y29tbWl0dGVkX3QpIChzdHJ1Y3QgZG1hX3B1YiAqZG1haCk7Ci0KLS8qIGRtYSBvcHN2ZWMgKi8KLXN0cnVjdCBkaV9mY25fcyB7Ci0JZGlfZGV0YWNoX3QgZGV0YWNoOwotCWRpX3R4aW5pdF90IHR4aW5pdDsKLQlkaV90eHJlc2V0X3QgdHhyZXNldDsKLQlkaV90eGVuYWJsZWRfdCB0eGVuYWJsZWQ7Ci0JZGlfdHhzdXNwZW5kX3QgdHhzdXNwZW5kOwotCWRpX3R4cmVzdW1lX3QgdHhyZXN1bWU7Ci0JZGlfdHhzdXNwZW5kZWRfdCB0eHN1c3BlbmRlZDsKLQlkaV90eHN1c3BlbmRlZGlkbGVfdCB0eHN1c3BlbmRlZGlkbGU7Ci0JZGlfdHhmYXN0X3QgdHhmYXN0OwotCWRpX3R4dW5mcmFtZWRfdCB0eHVuZnJhbWVkOwotCWRpX2dldHBvc190IGdldHBvczsKLQlkaV90eHN0b3BwZWRfdCB0eHN0b3BwZWQ7Ci0JZGlfdHhyZWNsYWltX3QgdHhyZWNsYWltOwotCWRpX2dldG5leHR0eHBfdCBnZXRuZXh0dHhwOwotCWRpX3BlZWtuZXh0dHhwX3QgcGVla25leHR0eHA7Ci0JZGlfdHhibG9ja190IHR4YmxvY2s7Ci0JZGlfdHh1bmJsb2NrX3QgdHh1bmJsb2NrOwotCWRpX3R4YWN0aXZlX3QgdHhhY3RpdmU7Ci0JZGlfdHhyb3RhdGVfdCB0eHJvdGF0ZTsKLQotCWRpX3J4aW5pdF90IHJ4aW5pdDsKLQlkaV9yeHJlc2V0X3QgcnhyZXNldDsKLQlkaV9yeGlkbGVfdCByeGlkbGU7Ci0JZGlfcnhzdG9wcGVkX3QgcnhzdG9wcGVkOwotCWRpX3J4ZW5hYmxlX3QgcnhlbmFibGU7Ci0JZGlfcnhlbmFibGVkX3QgcnhlbmFibGVkOwotCWRpX3J4X3Qgcng7Ci0JZGlfcnhmaWxsX3QgcnhmaWxsOwotCWRpX3J4cmVjbGFpbV90IHJ4cmVjbGFpbTsKLQlkaV9nZXRuZXh0cnhwX3QgZ2V0bmV4dHJ4cDsKLQlkaV9wZWVrbmV4dHJ4cF90IHBlZWtuZXh0cnhwOwotCWRpX3J4cGFyYW1fZ2V0X3QgcnhwYXJhbV9nZXQ7Ci0KLQlkaV9maWZvbG9vcGJhY2tlbmFibGVfdCBmaWZvbG9vcGJhY2tlbmFibGU7Ci0JZGlfZ2V0dmFyX3QgZF9nZXR2YXI7Ci0JZGlfY291bnRlcnJlc2V0X3QgY291bnRlcnJlc2V0OwotCWRpX2N0cmxmbGFnc190IGN0cmxmbGFnczsKLQlkaV9kdW1wX3QgZHVtcDsKLQlkaV9kdW1wdHhfdCBkdW1wdHg7Ci0JZGlfZHVtcHJ4X3QgZHVtcHJ4OwotCWRpX3J4YWN0aXZlX3QgcnhhY3RpdmU7Ci0JZGlfdHhwZW5kaW5nX3QgdHhwZW5kaW5nOwotCWRpX3R4Y29tbWl0dGVkX3QgdHhjb21taXR0ZWQ7Ci0JdWludCBlbmRudW07Ci19OwotCi0vKgotICogRXhwb3J0ZWQgZGF0YSBzdHJ1Y3R1cmUgKHJlYWQtb25seSkKLSAqLwotLyogZXhwb3J0IHN0cnVjdHVyZSAqLwotc3RydWN0IGRtYV9wdWIgewotCWNvbnN0IHN0cnVjdCBkaV9mY25fcyAqZGlfZm47CS8qIERNQSBmdW5jdGlvbiBwb2ludGVycyAqLwotCXVpbnQgdHhhdmFpbDsJCS8qICMgZnJlZSB0eCBkZXNjcmlwdG9ycyAqLwotCXVpbnQgZG1hY3RybGZsYWdzOwkvKiBkbWEgY29udHJvbCBmbGFncyAqLwotCi0JLyogcnggZXJyb3IgY291bnRlcnMgKi8KLQl1aW50IHJ4Z2lhbnRzOwkJLyogcnggZ2lhbnQgZnJhbWVzICovCi0JdWludCByeG5vYnVmOwkJLyogcnggb3V0IG9mIGRtYSBkZXNjcmlwdG9ycyAqLwotCS8qIHR4IGVycm9yIGNvdW50ZXJzICovCi0JdWludCB0eG5vYnVmOwkJLyogdHggb3V0IG9mIGRtYSBkZXNjcmlwdG9ycyAqLwotfTsKLQotZXh0ZXJuIHN0cnVjdCBkbWFfcHViICpkbWFfYXR0YWNoKGNoYXIgKm5hbWUsIHN0cnVjdCBzaV9wdWIgKnNpaCwKLQkJCSAgICB2b2lkICpkbWFyZWdzdHgsIHZvaWQgKmRtYXJlZ3NyeCwgdWludCBudHhkLAotCQkJICAgIHVpbnQgbnJ4ZCwgdWludCByeGJ1ZnNpemUsIGludCByeGV4dGhlYWRyb29tLAotCQkJICAgIHVpbnQgbnJ4cG9zdCwgdWludCByeG9mZnNldCwgdWludCAqbXNnX2xldmVsKTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBkaV9mY25fcyBkbWE2NHByb2M7Ci0KLSNkZWZpbmUgZG1hX2RldGFjaChkaSkJCQkoZG1hNjRwcm9jLmRldGFjaChkaSkpCi0jZGVmaW5lIGRtYV90eHJlc2V0KGRpKQkJCShkbWE2NHByb2MudHhyZXNldChkaSkpCi0jZGVmaW5lIGRtYV9yeHJlc2V0KGRpKQkJCShkbWE2NHByb2MucnhyZXNldChkaSkpCi0jZGVmaW5lIGRtYV9yeGlkbGUoZGkpCQkJKGRtYTY0cHJvYy5yeGlkbGUoZGkpKQotI2RlZmluZSBkbWFfdHhpbml0KGRpKSAgICAgICAgICAgICAgICAgIChkbWE2NHByb2MudHhpbml0KGRpKSkKLSNkZWZpbmUgZG1hX3R4ZW5hYmxlZChkaSkgICAgICAgICAgICAgICAoZG1hNjRwcm9jLnR4ZW5hYmxlZChkaSkpCi0jZGVmaW5lIGRtYV9yeGluaXQoZGkpICAgICAgICAgICAgICAgICAgKGRtYTY0cHJvYy5yeGluaXQoZGkpKQotI2RlZmluZSBkbWFfdHhzdXNwZW5kKGRpKSAgICAgICAgICAgICAgIChkbWE2NHByb2MudHhzdXNwZW5kKGRpKSkKLSNkZWZpbmUgZG1hX3R4cmVzdW1lKGRpKSAgICAgICAgICAgICAgICAoZG1hNjRwcm9jLnR4cmVzdW1lKGRpKSkKLSNkZWZpbmUgZG1hX3R4c3VzcGVuZGVkKGRpKSAgICAgICAgICAgICAoZG1hNjRwcm9jLnR4c3VzcGVuZGVkKGRpKSkKLSNkZWZpbmUgZG1hX3R4c3VzcGVuZGVkaWRsZShkaSkgICAgICAgICAoZG1hNjRwcm9jLnR4c3VzcGVuZGVkaWRsZShkaSkpCi0jZGVmaW5lIGRtYV90eGZhc3QoZGksIHAsIGNvbW1pdCkJKGRtYTY0cHJvYy50eGZhc3QoZGksIHAsIGNvbW1pdCkpCi0jZGVmaW5lIGRtYV90eHVuZnJhbWVkKGRpLCBwLCBsLCBjb21taXQpKGRtYTY0cHJvYy50eHVuZnJhbWVkKGRpLCBwLCBsLCBjb21taXQpKQotI2RlZmluZSBkbWFfZ2V0cG9zKGRpLCBkaXIpCQkoZG1hNjRwcm9jLmdldHBvcyhkaSwgZGlyKSkKLSNkZWZpbmUgZG1hX2ZpZm9sb29wYmFja2VuYWJsZShkaSkgICAgICAoZG1hNjRwcm9jLmZpZm9sb29wYmFja2VuYWJsZShkaSkpCi0jZGVmaW5lIGRtYV90eHN0b3BwZWQoZGkpICAgICAgICAgICAgICAgKGRtYTY0cHJvYy50eHN0b3BwZWQoZGkpKQotI2RlZmluZSBkbWFfcnhzdG9wcGVkKGRpKSAgICAgICAgICAgICAgIChkbWE2NHByb2MucnhzdG9wcGVkKGRpKSkKLSNkZWZpbmUgZG1hX3J4ZW5hYmxlKGRpKSAgICAgICAgICAgICAgICAoZG1hNjRwcm9jLnJ4ZW5hYmxlKGRpKSkKLSNkZWZpbmUgZG1hX3J4ZW5hYmxlZChkaSkgICAgICAgICAgICAgICAoZG1hNjRwcm9jLnJ4ZW5hYmxlZChkaSkpCi0jZGVmaW5lIGRtYV9yeChkaSkgICAgICAgICAgICAgICAgICAgICAgKGRtYTY0cHJvYy5yeChkaSkpCi0jZGVmaW5lIGRtYV9yeGZpbGwoZGkpICAgICAgICAgICAgICAgICAgKGRtYTY0cHJvYy5yeGZpbGwoZGkpKQotI2RlZmluZSBkbWFfdHhyZWNsYWltKGRpLCByYW5nZSkJKGRtYTY0cHJvYy50eHJlY2xhaW0oZGksIHJhbmdlKSkKLSNkZWZpbmUgZG1hX3J4cmVjbGFpbShkaSkgICAgICAgICAgICAgICAoZG1hNjRwcm9jLnJ4cmVjbGFpbShkaSkpCi0jZGVmaW5lIGRtYV9nZXR2YXIoZGksIG5hbWUpCQkoZG1hNjRwcm9jLmRfZ2V0dmFyKGRpLCBuYW1lKSkKLSNkZWZpbmUgZG1hX2dldG5leHR0eHAoZGksIHJhbmdlKQkoZG1hNjRwcm9jLmdldG5leHR0eHAoZGksIHJhbmdlKSkKLSNkZWZpbmUgZG1hX2dldG5leHRyeHAoZGksIGZvcmNlYWxsKSAgICAoZG1hNjRwcm9jLmdldG5leHRyeHAoZGksIGZvcmNlYWxsKSkKLSNkZWZpbmUgZG1hX3BlZWtuZXh0dHhwKGRpKSAgICAgICAgICAgICAoZG1hNjRwcm9jLnBlZWtuZXh0dHhwKGRpKSkKLSNkZWZpbmUgZG1hX3BlZWtuZXh0cnhwKGRpKSAgICAgICAgICAgICAoZG1hNjRwcm9jLnBlZWtuZXh0cnhwKGRpKSkKLSNkZWZpbmUgZG1hX3J4cGFyYW1fZ2V0KGRpLCBvZmYsIGJ1ZnMpCShkbWE2NHByb2MucnhwYXJhbV9nZXQoZGksIG9mZiwgYnVmcykpCi0KLSNkZWZpbmUgZG1hX3R4YmxvY2soZGkpICAgICAgICAgICAgICAgICAoZG1hNjRwcm9jLnR4YmxvY2soZGkpKQotI2RlZmluZSBkbWFfdHh1bmJsb2NrKGRpKSAgICAgICAgICAgICAgIChkbWE2NHByb2MudHh1bmJsb2NrKGRpKSkKLSNkZWZpbmUgZG1hX3R4YWN0aXZlKGRpKSAgICAgICAgICAgICAgICAoZG1hNjRwcm9jLnR4YWN0aXZlKGRpKSkKLSNkZWZpbmUgZG1hX3J4YWN0aXZlKGRpKSAgICAgICAgICAgICAgICAoZG1hNjRwcm9jLnJ4YWN0aXZlKGRpKSkKLSNkZWZpbmUgZG1hX3R4cm90YXRlKGRpKSAgICAgICAgICAgICAgICAoZG1hNjRwcm9jLnR4cm90YXRlKGRpKSkKLSNkZWZpbmUgZG1hX2NvdW50ZXJyZXNldChkaSkgICAgICAgICAgICAoZG1hNjRwcm9jLmNvdW50ZXJyZXNldChkaSkpCi0jZGVmaW5lIGRtYV9jdHJsZmxhZ3MoZGksIG1hc2ssIGZsYWdzKSAgKGRtYTY0cHJvYy5jdHJsZmxhZ3MoKGRpKSwgKG1hc2spLCAoZmxhZ3MpKSkKLSNkZWZpbmUgZG1hX3R4cGVuZGluZyhkaSkJCShkbWE2NHByb2MudHhwZW5kaW5nKGRpKSkKLSNkZWZpbmUgZG1hX3R4Y29tbWl0dGVkKGRpKQkJKGRtYTY0cHJvYy50eGNvbW1pdHRlZChkaSkpCi0KLQotLyogcmV0dXJuIGFkZHJlc3N3aWR0aCBhbGxvd2VkCi0gKiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgYWZ0ZXIgU0IgYXR0YWNoIGJ1dCBiZWZvcmUgZG1hIGF0dGFjaC4KLSAqIFNCIGF0dGFjaCBwcm92aWRlcyBhYmlsaXR5IHRvIHByb2JlIGJhY2twbGFuZSBhbmQgZG1hIGNvcmUgY2FwYWJpbGl0aWVzCi0gKiBUaGlzIGluZm8gaXMgbmVlZGVkIGJ5IERNQV9BTExPQ19DT05TSVNURU5UIGluIGRtYSBhdHRhY2gKLSAqLwotZXh0ZXJuIHVpbnQgZG1hX2FkZHJ3aWR0aChzdHJ1Y3Qgc2lfcHViICpzaWgsIHZvaWQgKmRtYXJlZ3MpOwotdm9pZCBkbWFfd2Fsa19wYWNrZXRzKHN0cnVjdCBkbWFfcHViICpkbWFoLCB2b2lkICgqY2FsbGJhY2tfZm5jKQotCQkgICAgICAodm9pZCAqcGt0LCB2b2lkICphcmdfYSksIHZvaWQgKmFyZ19hKTsKLQotLyoKLSAqIERNQShCdWcpIG9uIHNvbWUgY2hpcHMgc2VlbXMgdG8gZGVjbGFyZSB0aGF0IHRoZSBwYWNrZXQgaXMgcmVhZHksIGJ1dCB0aGUKLSAqIHBhY2tldCBsZW5ndGggaXMgbm90IHVwZGF0ZWQgeWV0IChieSBETUEpIG9uIHRoZSBleHBlY3RlZCB0aW1lLgotICogV29ya2Fyb3VuZCBpcyB0byBob2xkIHByb2Nlc3NvciB0aWxsIERNQSB1cGRhdGVzIHRoZSBsZW5ndGgsIGFuZCBzdGF5IG9mZgotICogdGhlIGJ1cyB0byBhbGxvdyBETUEgdXBkYXRlIHRoZSBsZW5ndGggaW4gYnVmZmVyCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBkbWFfc3Bpbl9mb3JfbGVuKHVpbnQgbGVuLCBzdHJ1Y3Qgc2tfYnVmZiAqaGVhZCkKLXsKLSNpZiBkZWZpbmVkKF9fbWlwc19fKQotCWlmICghbGVuKSB7Ci0JCXdoaWxlICghKGxlbiA9ICoodTE2ICopIEtTRUcxQUREUihoZWFkLT5kYXRhKSkpCi0JCQl1ZGVsYXkoMSk7Ci0KLQkJKih1MTYgKikgKGhlYWQtPmRhdGEpID0gY3B1X3RvX2xlMTYoKHUxNikgbGVuKTsKLQl9Ci0jZW5kaWYJCQkJLyogZGVmaW5lZChfX21pcHNfXykgKi8KLX0KLQotI2VuZGlmCQkJCS8qIF9CUkNNX0RNQV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9tYWM4MDIxMV9pZi5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9tYWM4MDIxMV9pZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDcxY2JhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvbWFjODAyMTFfaWYuYworKysgL2Rldi9udWxsCkBAIC0xLDE5MzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNkZWZpbmUgX19VTkRFRl9OT19WRVJTSU9OX18KLQotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotI2luY2x1ZGUgPGRlZnMuaD4KLSNpbmNsdWRlICJuaWNwY2kuaCIKLSNpbmNsdWRlICJwaHkvcGh5X2ludC5oIgotI2luY2x1ZGUgImQxMS5oIgotI2luY2x1ZGUgImNoYW5uZWwuaCIKLSNpbmNsdWRlICJzY2IuaCIKLSNpbmNsdWRlICJwdWIuaCIKLSNpbmNsdWRlICJ1Y29kZV9sb2FkZXIuaCIKLSNpbmNsdWRlICJtYWM4MDIxMV9pZi5oIgotCi0jZGVmaW5lIE5fVFhfUVVFVUVTCTQgLyogI3R4IHF1ZXVlcyBvbiBtYWM4MDIxMTwtPmRyaXZlciBpbnRlcmZhY2UgKi8KLQotI2RlZmluZSBMT0NLKHdsKQlzcGluX2xvY2tfYmgoJih3bCktPmxvY2spCi0jZGVmaW5lIFVOTE9DSyh3bCkJc3Bpbl91bmxvY2tfYmgoJih3bCktPmxvY2spCi0KLS8qIGxvY2tpbmcgZnJvbSBpbnNpZGUgYnJjbXNfaXNyICovCi0jZGVmaW5lIElTUl9MT0NLKHdsLCBmbGFncylcCi0JZG8ge1wKLQkJc3Bpbl9sb2NrKCYod2wpLT5pc3JfbG9jayk7XAotCQkodm9pZCkoZmxhZ3MpOyB9IFwKLQl3aGlsZSAoMCkKLQotI2RlZmluZSBJU1JfVU5MT0NLKHdsLCBmbGFncylcCi0JZG8ge1wKLQkJc3Bpbl91bmxvY2soJih3bCktPmlzcl9sb2NrKTtcCi0JCSh2b2lkKShmbGFncyk7IH0gXAotCXdoaWxlICgwKQotCi0vKiBsb2NraW5nIHVuZGVyIExPQ0soKSB0byBzeW5jaHJvbml6ZSB3aXRoIGJyY21zX2lzciAqLwotI2RlZmluZSBJTlRfTE9DSyh3bCwgZmxhZ3MpCXNwaW5fbG9ja19pcnFzYXZlKCYod2wpLT5pc3JfbG9jaywgZmxhZ3MpCi0jZGVmaW5lIElOVF9VTkxPQ0sod2wsIGZsYWdzKQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYod2wpLT5pc3JfbG9jaywgZmxhZ3MpCi0KLXN0YXRpYyB2b2lkIGJyY21zX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgdm9pZCBfYnJjbXNfdGltZXIoc3RydWN0IGJyY21zX3RpbWVyICp0KTsKLQotCi1zdGF0aWMgaW50IGllZWVfaHdfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Ci1zdGF0aWMgaW50IGllZWVfaHdfcmF0ZV9pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKLQotc3RhdGljIGludCB3bF9saW51eF93YXRjaGRvZyh2b2lkICpjdHgpOwotCi0vKiBGbGFncyB3ZSBzdXBwb3J0ICovCi0jZGVmaW5lIE1BQ19GSUxURVJTIChGSUZfUFJPTUlTQ19JTl9CU1MgfCBcCi0JRklGX0FMTE1VTFRJIHwgXAotCUZJRl9GQ1NGQUlMIHwgXAotCUZJRl9QTENQRkFJTCB8IFwKLQlGSUZfQ09OVFJPTCB8IFwKLQlGSUZfT1RIRVJfQlNTIHwgXAotCUZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDKQotCi1zdGF0aWMgaW50IG5fYWRhcHRlcnNfZm91bmQ7Ci0KLXN0YXRpYyBpbnQgYnJjbXNfcmVxdWVzdF9mdyhzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wsIHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKLXN0YXRpYyB2b2lkIGJyY21zX3JlbGVhc2VfZncoc3RydWN0IGJyY21zX2luZm8gKndsKTsKLQotLyogbG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIHZvaWQgYnJjbXNfZHBjKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgaXJxcmV0dXJuX3QgYnJjbXNfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGJyY21zX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOwotc3RhdGljIHZvaWQgYnJjbXNfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKLXN0YXRpYyB2b2lkIGJyY21zX2ZyZWUoc3RydWN0IGJyY21zX2luZm8gKndsKTsKLXN0YXRpYyB2b2lkIGJyY21zX3NldF9iYXNpY19yYXRlKHN0cnVjdCB3bF9yYXRlc2V0ICpycywgdTE2IHJhdGUsIGJvb2wgaXNfYnIpOwotCi1NT0RVTEVfQVVUSE9SKCJCcm9hZGNvbSBDb3Jwb3JhdGlvbiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJCcm9hZGNvbSA4MDIuMTFuIHdpcmVsZXNzIExBTiBkcml2ZXIuIik7Ci1NT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiQnJvYWRjb20gODAyLjExbiBXTEFOIGNhcmRzIik7Ci1NT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7Ci0KLS8qIHJlY29nbml6ZWQgUENJIElEcyAqLwotc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGJyY21zX3BjaV9pZF90YWJsZSkgPSB7Ci0Je1BDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4NDM1NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCS8qIDQzMjI1IDJHICovCi0Je1BDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4NDM1MywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCS8qIDQzMjI0IERVQUwgKi8KLQl7UENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHg0NzI3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCAwfSwJLyogNDMxMyBEVUFMICovCi0JLyogNDMyMjQgVmVuICovCi0Je1BDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4MDU3NiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCB9LAotCXswfQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGJyY21zX3BjaV9pZF90YWJsZSk7Ci0KLSNpZmRlZiBCQ01EQkcKLXN0YXRpYyBpbnQgbXNnbGV2ZWwgPSAweGRlYWRiZWVmOwotbW9kdWxlX3BhcmFtKG1zZ2xldmVsLCBpbnQsIDApOwotc3RhdGljIGludCBwaHltc2dsZXZlbCA9IDB4ZGVhZGJlZWY7Ci1tb2R1bGVfcGFyYW0ocGh5bXNnbGV2ZWwsIGludCwgMCk7Ci0jZW5kaWYJCQkJLyogQkNNREJHICovCi0KLSNkZWZpbmUgSFdfVE9fV0woaHcpCSAoaHctPnByaXYpCi0jZGVmaW5lIFdMX1RPX0hXKHdsKQkgICh3bC0+cHViLT5pZWVlX2h3KQotCi0vKiBNQUM4MDIxMSBjYWxsYmFjayBmdW5jdGlvbnMgKi8KLXN0YXRpYyBpbnQgYnJjbXNfb3BzX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKLXN0YXRpYyB2b2lkIGJyY21zX29wc19zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKLXN0YXRpYyBpbnQgYnJjbXNfb3BzX2FkZF9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Ci1zdGF0aWMgdm9pZCBicmNtc19vcHNfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Ci1zdGF0aWMgaW50IGJyY21zX29wc19jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBjaGFuZ2VkKTsKLXN0YXRpYyB2b2lkIGJyY21zX29wc19ic3NfaW5mb19jaGFuZ2VkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICppbmZvLAotCQkJCSAgICB1MzIgY2hhbmdlZCk7Ci1zdGF0aWMgdm9pZCBicmNtc19vcHNfY29uZmlndXJlX2ZpbHRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkgICAgdW5zaWduZWQgaW50IGNoYW5nZWRfZmxhZ3MsCi0JCQkJICAgIHVuc2lnbmVkIGludCAqdG90YWxfZmxhZ3MsIHU2NCBtdWx0aWNhc3QpOwotc3RhdGljIGludCBicmNtc19vcHNfc2V0X3RpbShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCSAgYm9vbCBzZXQpOwotc3RhdGljIHZvaWQgYnJjbXNfb3BzX3N3X3NjYW5fc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwotc3RhdGljIHZvaWQgYnJjbXNfb3BzX3N3X3NjYW5fY29tcGxldGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwotc3RhdGljIHZvaWQgYnJjbXNfb3BzX3NldF90c2Yoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCB1NjQgdHNmKTsKLXN0YXRpYyBpbnQgYnJjbXNfb3BzX2dldF9zdGF0cyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2xvd19sZXZlbF9zdGF0cyAqc3RhdHMpOwotc3RhdGljIHZvaWQgYnJjbXNfb3BzX3N0YV9ub3RpZnkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJICAgICAgZW51bSBzdGFfbm90aWZ5X2NtZCBjbWQsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKTsKLXN0YXRpYyBpbnQgYnJjbXNfb3BzX2NvbmZfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHUxNiBxdWV1ZSwKLQkJCSAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9wYXJhbXMgKnBhcmFtcyk7Ci1zdGF0aWMgdTY0IGJyY21zX29wc19nZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKLXN0YXRpYyBpbnQgYnJjbXNfb3BzX3N0YV9hZGQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOwotc3RhdGljIGludCBicmNtc19vcHNfc3RhX3JlbW92ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOwotc3RhdGljIGludCBicmNtc19vcHNfYW1wZHVfYWN0aW9uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkgICAgICAgZW51bSBpZWVlODAyMTFfYW1wZHVfbWxtZV9hY3Rpb24gYWN0aW9uLAotCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQsIHUxNiAqc3NuLAotCQkJICAgICAgIHU4IGJ1Zl9zaXplKTsKLXN0YXRpYyB2b2lkIGJyY21zX29wc19yZmtpbGxfcG9sbChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Ci1zdGF0aWMgdm9pZCBicmNtc19vcHNfZmx1c2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgZHJvcCk7Ci0KLXN0YXRpYyB2b2lkIGJyY21zX29wc190eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wgPSBody0+cHJpdjsKLQotCUxPQ0sod2wpOwotCWlmICghd2wtPnB1Yi0+dXApIHsKLQkJd2lwaHlfZXJyKHdsLT53aXBoeSwgIm9wcy0+dHggY2FsbGVkIHdoaWxlIGRvd25cbiIpOwotCQlrZnJlZV9za2Ioc2tiKTsKLQkJZ290byBkb25lOwotCX0KLQlicmNtc19jX3NlbmRwa3RfbWFjODAyMTEod2wtPndsYywgc2tiLCBodyk7Ci0gZG9uZToKLQlVTkxPQ0sod2wpOwotfQotCi1zdGF0aWMgaW50IGJyY21zX29wc19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wgPSBody0+cHJpdjsKLQlib29sIGJsb2NrZWQ7Ci0JLyoKLQkgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY3VyY2hhbiA9IGh3LT5jb25mLmNoYW5uZWw7Ci0JKi8KLQotCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhodyk7Ci0JTE9DSyh3bCk7Ci0JYmxvY2tlZCA9IGJyY21zX3Jma2lsbF9zZXRfaHdfc3RhdGUod2wpOwotCVVOTE9DSyh3bCk7Ci0JaWYgKCFibG9ja2VkKQotCQl3aXBoeV9yZmtpbGxfc3RvcF9wb2xsaW5nKHdsLT5wdWItPmllZWVfaHctPndpcGh5KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBicmNtc19vcHNfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlpZWVlODAyMTFfc3RvcF9xdWV1ZXMoaHcpOwotfQotCi1zdGF0aWMgaW50Ci1icmNtc19vcHNfYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKLXsKLQlzdHJ1Y3QgYnJjbXNfaW5mbyAqd2w7Ci0JaW50IGVycjsKLQotCS8qIEp1c3QgU1RBIGZvciBub3cgKi8KLQlpZiAodmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQICYmCi0JICAgIHZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UICYmCi0JICAgIHZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCi0JICAgIHZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9XRFMgJiYKLQkgICAgdmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7Ci0JCXdpcGh5X2Vycihody0+d2lwaHksICIlczogQXR0ZW1wdCB0byBhZGQgdHlwZSAlZCwgb25seSIKLQkJCSAgIiBTVEEgZm9yIG5vd1xuIiwgX19mdW5jX18sIHZpZi0+dHlwZSk7Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci0KLQl3bCA9IEhXX1RPX1dMKGh3KTsKLQlMT0NLKHdsKTsKLQllcnIgPSBicmNtc191cCh3bCk7Ci0JVU5MT0NLKHdsKTsKLQotCWlmIChlcnIgIT0gMCkgewotCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiJXM6IGJyY21zX3VwKCkgcmV0dXJuZWQgJWRcbiIsIF9fZnVuY19fLAotCQkJICBlcnIpOwotCX0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZAotYnJjbXNfb3BzX3JlbW92ZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCi17Ci0Jc3RydWN0IGJyY21zX2luZm8gKndsOwotCi0Jd2wgPSBIV19UT19XTChodyk7Ci0KLQkvKiBwdXQgZHJpdmVyIGluIGRvd24gc3RhdGUgKi8KLQlMT0NLKHdsKTsKLQlicmNtc19kb3duKHdsKTsKLQlVTkxPQ0sod2wpOwotfQotCi0vKgotICogcHJlY29uZGl0aW9uOiBwZXJpbWV0ZXIgbG9jayBoYXMgYmVlbiBhY3F1aXJlZAotICovCi1zdGF0aWMgaW50Ci1pZWVlX3NldF9jaGFubmVsKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sCi0JCSBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIHR5cGUpCi17Ci0Jc3RydWN0IGJyY21zX2luZm8gKndsID0gSFdfVE9fV0woaHcpOwotCWludCBlcnIgPSAwOwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBOTDgwMjExX0NIQU5fSFQyMDoKLQljYXNlIE5MODAyMTFfQ0hBTl9OT19IVDoKLQkJZXJyID0gYnJjbXNfY19zZXQod2wtPndsYywgQlJDTV9TRVRfQ0hBTk5FTCwgY2hhbi0+aHdfdmFsdWUpOwotCQlicmVhazsKLQljYXNlIE5MODAyMTFfQ0hBTl9IVDQwTUlOVVM6Ci0JY2FzZSBOTDgwMjExX0NIQU5fSFQ0MFBMVVM6Ci0JCXdpcGh5X2Vycihody0+d2lwaHksCi0JCQkgICIlczogTmVlZCB0byBpbXBsZW1lbnQgNDAgTWh6IENoYW5uZWxzIVxuIiwgX19mdW5jX18pOwotCQllcnIgPSAxOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoZXJyKQotCQlyZXR1cm4gLUVJTzsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IGJyY21zX29wc19jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBjaGFuZ2VkKQotewotCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZody0+Y29uZjsKLQlzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wgPSBIV19UT19XTChodyk7Ci0JaW50IGVyciA9IDA7Ci0JaW50IG5ld19pbnQ7Ci0Jc3RydWN0IHdpcGh5ICp3aXBoeSA9IGh3LT53aXBoeTsKLQotCUxPQ0sod2wpOwotCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0xJU1RFTl9JTlRFUlZBTCkgewotCQlpZiAoYnJjbXNfY19zZXRfcGFyKHdsLT53bGMsIElPVl9CQ05fTElfQkNOLAotCQkJCSAgICBjb25mLT5saXN0ZW5faW50ZXJ2YWwpIDwgMCkgewotCQkJd2lwaHlfZXJyKHdpcGh5LCAiJXM6IEVycm9yIHNldHRpbmcgbGlzdGVuX2ludGVydmFsXG4iLAotCQkJCSAgX19mdW5jX18pOwotCQkJZXJyID0gLUVJTzsKLQkJCWdvdG8gY29uZmlnX291dDsKLQkJfQotCQlicmNtc19jX2dldF9wYXIod2wtPndsYywgSU9WX0JDTl9MSV9CQ04sICZuZXdfaW50KTsKLQl9Ci0JaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfTU9OSVRPUikKLQkJd2lwaHlfZXJyKHdpcGh5LCAiJXM6IGNoYW5nZSBtb25pdG9yIG1vZGU6ICVzIChpbXBsZW1lbnQpXG4iLAotCQkJICBfX2Z1bmNfXywgY29uZi0+ZmxhZ3MgJiBJRUVFODAyMTFfQ09ORl9NT05JVE9SID8KLQkJCSAgInRydWUiIDogImZhbHNlIik7Ci0JaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfUFMpCi0JCXdpcGh5X2Vycih3aXBoeSwgIiVzOiBjaGFuZ2UgcG93ZXItc2F2ZSBtb2RlOiAlcyAoaW1wbGVtZW50KVxuIiwKLQkJCSAgX19mdW5jX18sIGNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfUFMgPwotCQkJICAidHJ1ZSIgOiAiZmFsc2UiKTsKLQotCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX1BPV0VSKSB7Ci0JCWlmIChicmNtc19jX3NldF9wYXIod2wtPndsYywgSU9WX1FUWFBPV0VSLAotCQkJCSAgICBjb25mLT5wb3dlcl9sZXZlbCAqIDQpIDwgMCkgewotCQkJd2lwaHlfZXJyKHdpcGh5LCAiJXM6IEVycm9yIHNldHRpbmcgcG93ZXJfbGV2ZWxcbiIsCi0JCQkJICBfX2Z1bmNfXyk7Ci0JCQllcnIgPSAtRUlPOwotCQkJZ290byBjb25maWdfb3V0OwotCQl9Ci0JCWJyY21zX2NfZ2V0X3Bhcih3bC0+d2xjLCBJT1ZfUVRYUE9XRVIsICZuZXdfaW50KTsKLQkJaWYgKG5ld19pbnQgIT0gKGNvbmYtPnBvd2VyX2xldmVsICogNCkpCi0JCQl3aXBoeV9lcnIod2lwaHksICIlczogUG93ZXIgbGV2ZWwgcmVxICE9IGFjdHVhbCwgJWQgJWQiCi0JCQkJICAiXG4iLCBfX2Z1bmNfXywgY29uZi0+cG93ZXJfbGV2ZWwgKiA0LAotCQkJCSAgbmV3X2ludCk7Ci0JfQotCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwpIHsKLQkJZXJyID0gaWVlZV9zZXRfY2hhbm5lbChodywgY29uZi0+Y2hhbm5lbCwgY29uZi0+Y2hhbm5lbF90eXBlKTsKLQl9Ci0JaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfUkVUUllfTElNSVRTKSB7Ci0JCWlmIChicmNtc19jX3NldAotCQkgICAgKHdsLT53bGMsIEJSQ01fU0VUX1NSTCwKLQkJICAgICBjb25mLT5zaG9ydF9mcmFtZV9tYXhfdHhfY291bnQpIDwgMCkgewotCQkJd2lwaHlfZXJyKHdpcGh5LCAiJXM6IEVycm9yIHNldHRpbmcgc3JsXG4iLCBfX2Z1bmNfXyk7Ci0JCQllcnIgPSAtRUlPOwotCQkJZ290byBjb25maWdfb3V0OwotCQl9Ci0JCWlmIChicmNtc19jX3NldCh3bC0+d2xjLCBCUkNNX1NFVF9MUkwsCi0JCQkJY29uZi0+bG9uZ19mcmFtZV9tYXhfdHhfY291bnQpIDwgMCkgewotCQkJd2lwaHlfZXJyKHdpcGh5LCAiJXM6IEVycm9yIHNldHRpbmcgbHJsXG4iLCBfX2Z1bmNfXyk7Ci0JCQllcnIgPSAtRUlPOwotCQkJZ290byBjb25maWdfb3V0OwotCQl9Ci0JfQotCi0gY29uZmlnX291dDoKLQlVTkxPQ0sod2wpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkCi1icmNtc19vcHNfYnNzX2luZm9fY2hhbmdlZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICppbmZvLCB1MzIgY2hhbmdlZCkKLXsKLQlzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wgPSBIV19UT19XTChodyk7Ci0Jc3RydWN0IHdpcGh5ICp3aXBoeSA9IGh3LT53aXBoeTsKLQlpbnQgdmFsOwotCi0JaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9BU1NPQykgewotCQkvKiBhc3NvY2lhdGlvbiBzdGF0dXMgY2hhbmdlZCAoYXNzb2NpYXRlZC9kaXNhc3NvY2lhdGVkKQotCQkgKiBhbHNvIGltcGxpZXMgYSBjaGFuZ2UgaW4gdGhlIEFJRC4KLQkJICovCi0JCXdpcGh5X2Vycih3aXBoeSwgIiVzOiAlczogJXNhc3NvY2lhdGVkXG4iLCBLQlVJTERfTU9ETkFNRSwKLQkJCSAgX19mdW5jX18sIGluZm8tPmFzc29jID8gIiIgOiAiZGlzIik7Ci0JCUxPQ0sod2wpOwotCQlicmNtc19jX2Fzc29jaWF0ZV91cGQod2wtPndsYywgaW5mby0+YXNzb2MpOwotCQlVTkxPQ0sod2wpOwotCX0KLQlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0VSUF9TTE9UKSB7Ci0JCS8qIHNsb3QgdGltaW5nIGNoYW5nZWQgKi8KLQkJaWYgKGluZm8tPnVzZV9zaG9ydF9zbG90KQotCQkJdmFsID0gMTsKLQkJZWxzZQotCQkJdmFsID0gMDsKLQkJTE9DSyh3bCk7Ci0JCWJyY21zX2Nfc2V0KHdsLT53bGMsIEJSQ01TX1NFVF9TSE9SVFNMT1RfT1ZFUlJJREUsIHZhbCk7Ci0JCVVOTE9DSyh3bCk7Ci0JfQotCi0JaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9IVCkgewotCQkvKiA4MDIuMTFuIHBhcmFtZXRlcnMgY2hhbmdlZCAqLwotCQl1MTYgbW9kZSA9IGluZm8tPmh0X29wZXJhdGlvbl9tb2RlOwotCi0JCUxPQ0sod2wpOwotCQlicmNtc19jX3Byb3RlY3Rpb25fdXBkKHdsLT53bGMsIEJSQ01TX1BST1RfTl9DRkcsCi0JCQltb2RlICYgSUVFRTgwMjExX0hUX09QX01PREVfUFJPVEVDVElPTik7Ci0JCWJyY21zX2NfcHJvdGVjdGlvbl91cGQod2wtPndsYywgQlJDTVNfUFJPVF9OX05PTkdGLAotCQkJbW9kZSAmIElFRUU4MDIxMV9IVF9PUF9NT0RFX05PTl9HRl9TVEFfUFJTTlQpOwotCQlicmNtc19jX3Byb3RlY3Rpb25fdXBkKHdsLT53bGMsIEJSQ01TX1BST1RfTl9PQlNTLAotCQkJbW9kZSAmIElFRUU4MDIxMV9IVF9PUF9NT0RFX05PTl9IVF9TVEFfUFJTTlQpOwotCQlVTkxPQ0sod2wpOwotCX0KLQlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JBU0lDX1JBVEVTKSB7Ci0JCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKmJpOwotCQl1MzIgYnJfbWFzaywgaTsKLQkJdTE2IHJhdGU7Ci0JCXN0cnVjdCB3bF9yYXRlc2V0IHJzOwotCQlpbnQgZXJyb3I7Ci0KLQkJLyogcmV0cmlldmUgdGhlIGN1cnJlbnQgcmF0ZXMgKi8KLQkJTE9DSyh3bCk7Ci0JCWVycm9yID0gYnJjbXNfY19pb2N0bCh3bC0+d2xjLCBCUkNNX0dFVF9DVVJSX1JBVEVTRVQsCi0JCQkJICAmcnMsIHNpemVvZihycyksIE5VTEwpOwotCQlVTkxPQ0sod2wpOwotCQlpZiAoZXJyb3IpIHsKLQkJCXdpcGh5X2Vycih3aXBoeSwgIiVzOiByZXRyaWV2ZSByYXRlc2V0IGZhaWxlZDogJWRcbiIsCi0JCQkJICBfX2Z1bmNfXywgZXJyb3IpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWJyX21hc2sgPSBpbmZvLT5iYXNpY19yYXRlczsKLQkJYmkgPSBody0+d2lwaHktPmJhbmRzW2JyY21zX2NfZ2V0X2N1cmJhbmQod2wtPndsYyldOwotCQlmb3IgKGkgPSAwOyBpIDwgYmktPm5fYml0cmF0ZXM7IGkrKykgewotCQkJLyogY29udmVydCB0byBpbnRlcm5hbCByYXRlIHZhbHVlICovCi0JCQlyYXRlID0gKGJpLT5iaXRyYXRlc1tpXS5iaXRyYXRlIDw8IDEpIC8gMTA7Ci0KLQkJCS8qIHNldC9jbGVhciBiYXNpYyByYXRlIGZsYWcgKi8KLQkJCWJyY21zX3NldF9iYXNpY19yYXRlKCZycywgcmF0ZSwgYnJfbWFzayAmIDEpOwotCQkJYnJfbWFzayA+Pj0gMTsKLQkJfQotCi0JCS8qIHVwZGF0ZSB0aGUgcmF0ZSBzZXQgKi8KLQkJTE9DSyh3bCk7Ci0JCWJyY21zX2NfaW9jdGwod2wtPndsYywgQlJDTV9TRVRfUkFURVNFVCwgJnJzLCBzaXplb2YocnMpLCBOVUxMKTsKLQkJVU5MT0NLKHdsKTsKLQl9Ci0JaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9CRUFDT05fSU5UKSB7Ci0JCS8qIEJlYWNvbiBpbnRlcnZhbCBjaGFuZ2VkICovCi0JCUxPQ0sod2wpOwotCQlicmNtc19jX3NldCh3bC0+d2xjLCBCUkNNX1NFVF9CQ05QUkQsIGluZm8tPmJlYWNvbl9pbnQpOwotCQlVTkxPQ0sod2wpOwotCX0KLQlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JTU0lEKSB7Ci0JCS8qIEJTU0lEIGNoYW5nZWQsIGZvciB3aGF0ZXZlciByZWFzb24gKElCU1MgYW5kIG1hbmFnZWQgbW9kZSkgKi8KLQkJTE9DSyh3bCk7Ci0JCWJyY21zX2Nfc2V0X2FkZHJtYXRjaCh3bC0+d2xjLCBSQ01fQlNTSURfT0ZGU0VULAotCQkJCSAgaW5mby0+YnNzaWQpOwotCQlVTkxPQ0sod2wpOwotCX0KLQlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JFQUNPTikgewotCQkvKiBCZWFjb24gZGF0YSBjaGFuZ2VkLCByZXRyaWV2ZSBuZXcgYmVhY29uIChiZWFjb25pbmcgbW9kZXMpICovCi0JCXdpcGh5X2Vycih3aXBoeSwgIiVzOiBiZWFjb24gY2hhbmdlZFxuIiwgX19mdW5jX18pOwotCX0KLQlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JFQUNPTl9FTkFCTEVEKSB7Ci0JCS8qIEJlYWNvbmluZyBzaG91bGQgYmUgZW5hYmxlZC9kaXNhYmxlZCAoYmVhY29uaW5nIG1vZGVzKSAqLwotCQl3aXBoeV9lcnIod2lwaHksICIlczogQmVhY29uIGVuYWJsZWQ6ICVzXG4iLCBfX2Z1bmNfXywKLQkJCSAgaW5mby0+ZW5hYmxlX2JlYWNvbiA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCX0KLQlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0NRTSkgewotCQkvKiBDb25uZWN0aW9uIHF1YWxpdHkgbW9uaXRvciBjb25maWcgY2hhbmdlZCAqLwotCQl3aXBoeV9lcnIod2lwaHksICIlczogY3FtIGNoYW5nZTogdGhyZXNob2xkICVkLCBoeXMgJWQgIgotCQkJICAiIChpbXBsZW1lbnQpXG4iLCBfX2Z1bmNfXywgaW5mby0+Y3FtX3Jzc2lfdGhvbGQsCi0JCQkgIGluZm8tPmNxbV9yc3NpX2h5c3QpOwotCX0KLQlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0lCU1MpIHsKLQkJLyogSUJTUyBqb2luIHN0YXR1cyBjaGFuZ2VkICovCi0JCXdpcGh5X2Vycih3aXBoeSwgIiVzOiBJQlNTIGpvaW5lZDogJXMgKGltcGxlbWVudClcbiIsIF9fZnVuY19fLAotCQkJICBpbmZvLT5pYnNzX2pvaW5lZCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCX0KLQlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0FSUF9GSUxURVIpIHsKLQkJLyogSGFyZHdhcmUgQVJQIGZpbHRlciBhZGRyZXNzIGxpc3Qgb3Igc3RhdGUgY2hhbmdlZCAqLwotCQl3aXBoeV9lcnIod2lwaHksICIlczogYXJwIGZpbHRlcmluZzogZW5hYmxlZCAlcywgY291bnQgJWQiCi0JCQkgICIgKGltcGxlbWVudClcbiIsIF9fZnVuY19fLCBpbmZvLT5hcnBfZmlsdGVyX2VuYWJsZWQgPwotCQkJICAidHJ1ZSIgOiAiZmFsc2UiLCBpbmZvLT5hcnBfYWRkcl9jbnQpOwotCX0KLQlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX1FPUykgewotCQkvKgotCQkgKiBRb1MgZm9yIHRoaXMgYXNzb2NpYXRpb24gd2FzIGVuYWJsZWQvZGlzYWJsZWQuCi0JCSAqIE5vdGUgdGhhdCBpdCBpcyBvbmx5IGV2ZXIgZGlzYWJsZWQgZm9yIHN0YXRpb24gbW9kZS4KLQkJICovCi0JCXdpcGh5X2Vycih3aXBoeSwgIiVzOiBxb3MgZW5hYmxlZDogJXMgKGltcGxlbWVudClcbiIsIF9fZnVuY19fLAotCQkJICBpbmZvLT5xb3MgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLQl9Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotYnJjbXNfb3BzX2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQl1bnNpZ25lZCBpbnQgY2hhbmdlZF9mbGFncywKLQkJCXVuc2lnbmVkIGludCAqdG90YWxfZmxhZ3MsIHU2NCBtdWx0aWNhc3QpCi17Ci0Jc3RydWN0IGJyY21zX2luZm8gKndsID0gaHctPnByaXY7Ci0Jc3RydWN0IHdpcGh5ICp3aXBoeSA9IGh3LT53aXBoeTsKLQotCWNoYW5nZWRfZmxhZ3MgJj0gTUFDX0ZJTFRFUlM7Ci0JKnRvdGFsX2ZsYWdzICY9IE1BQ19GSUxURVJTOwotCWlmIChjaGFuZ2VkX2ZsYWdzICYgRklGX1BST01JU0NfSU5fQlNTKQotCQl3aXBoeV9lcnIod2lwaHksICJGSUZfUFJPTUlTQ19JTl9CU1NcbiIpOwotCWlmIChjaGFuZ2VkX2ZsYWdzICYgRklGX0FMTE1VTFRJKQotCQl3aXBoeV9lcnIod2lwaHksICJGSUZfQUxMTVVMVElcbiIpOwotCWlmIChjaGFuZ2VkX2ZsYWdzICYgRklGX0ZDU0ZBSUwpCi0JCXdpcGh5X2Vycih3aXBoeSwgIkZJRl9GQ1NGQUlMXG4iKTsKLQlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9QTENQRkFJTCkKLQkJd2lwaHlfZXJyKHdpcGh5LCAiRklGX1BMQ1BGQUlMXG4iKTsKLQlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9DT05UUk9MKQotCQl3aXBoeV9lcnIod2lwaHksICJGSUZfQ09OVFJPTFxuIik7Ci0JaWYgKGNoYW5nZWRfZmxhZ3MgJiBGSUZfT1RIRVJfQlNTKQotCQl3aXBoeV9lcnIod2lwaHksICJGSUZfT1RIRVJfQlNTXG4iKTsKLQlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDKSB7Ci0JCUxPQ0sod2wpOwotCQlpZiAoKnRvdGFsX2ZsYWdzICYgRklGX0JDTl9QUkJSRVNQX1BST01JU0MpIHsKLQkJCXdsLT5wdWItPm1hYzgwMjExX3N0YXRlIHw9IE1BQzgwMjExX1BST01JU0NfQkNOUzsKLQkJCWJyY21zX2NfbWFjX2Jjbl9wcm9taXNjX2NoYW5nZSh3bC0+d2xjLCAxKTsKLQkJfSBlbHNlIHsKLQkJCWJyY21zX2NfbWFjX2Jjbl9wcm9taXNjX2NoYW5nZSh3bC0+d2xjLCAwKTsKLQkJCXdsLT5wdWItPm1hYzgwMjExX3N0YXRlICY9IH5NQUM4MDIxMV9QUk9NSVNDX0JDTlM7Ci0JCX0KLQkJVU5MT0NLKHdsKTsKLQl9Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50Ci1icmNtc19vcHNfc2V0X3RpbShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgYm9vbCBzZXQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21zX29wc19zd19zY2FuX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXN0cnVjdCBicmNtc19pbmZvICp3bCA9IGh3LT5wcml2OwotCUxPQ0sod2wpOwotCWJyY21zX2Nfc2Nhbl9zdGFydCh3bC0+d2xjKTsKLQlVTkxPQ0sod2wpOwotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgYnJjbXNfb3BzX3N3X3NjYW5fY29tcGxldGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCi17Ci0Jc3RydWN0IGJyY21zX2luZm8gKndsID0gaHctPnByaXY7Ci0JTE9DSyh3bCk7Ci0JYnJjbXNfY19zY2FuX3N0b3Aod2wtPndsYyk7Ci0JVU5MT0NLKHdsKTsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21zX29wc19zZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgdTY0IHRzZikKLXsKLQl3aXBoeV9lcnIoaHctPndpcGh5LCAiJXM6IEVudGVyXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50Ci1icmNtc19vcHNfZ2V0X3N0YXRzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkgc3RydWN0IGllZWU4MDIxMV9sb3dfbGV2ZWxfc3RhdHMgKnN0YXRzKQotewotCXN0cnVjdCBicmNtc19pbmZvICp3bCA9IGh3LT5wcml2OwotCXN0cnVjdCB3bF9jbnQgKmNudDsKLQotCUxPQ0sod2wpOwotCWNudCA9IHdsLT5wdWItPl9jbnQ7Ci0Jc3RhdHMtPmRvdDExQUNLRmFpbHVyZUNvdW50ID0gMDsKLQlzdGF0cy0+ZG90MTFSVFNGYWlsdXJlQ291bnQgPSAwOwotCXN0YXRzLT5kb3QxMUZDU0Vycm9yQ291bnQgPSAwOwotCXN0YXRzLT5kb3QxMVJUU1N1Y2Nlc3NDb3VudCA9IDA7Ci0JVU5MT0NLKHdsKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLWJyY21zX29wc19zdGFfbm90aWZ5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkgIGVudW0gc3RhX25vdGlmeV9jbWQgY21kLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQotewotCXN3aXRjaCAoY21kKSB7Ci0JZGVmYXVsdDoKLQkJd2lwaHlfZXJyKGh3LT53aXBoeSwgIiVzOiBVbmtub3duIGNtZCA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCSAgY21kKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybjsKLX0KLQotc3RhdGljIGludAotYnJjbXNfb3BzX2NvbmZfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHUxNiBxdWV1ZSwKLQkgICAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wgPSBody0+cHJpdjsKLQotCUxPQ0sod2wpOwotCWJyY21zX2Nfd21lX3NldHBhcmFtcyh3bC0+d2xjLCBxdWV1ZSwgcGFyYW1zLCB0cnVlKTsKLQlVTkxPQ0sod2wpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1NjQgYnJjbXNfb3BzX2dldF90c2Yoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCi17Ci0Jd2lwaHlfZXJyKGh3LT53aXBoeSwgIiVzOiBFbnRlclxuIiwgX19mdW5jX18pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1icmNtc19vcHNfc3RhX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKLXsKLQlzdHJ1Y3Qgc2NiICpzY2I7Ci0KLQlpbnQgaTsKLQlzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wgPSBody0+cHJpdjsKLQotCS8qIEluaXQgdGhlIHNjYiAqLwotCXNjYiA9IChzdHJ1Y3Qgc2NiICopc3RhLT5kcnZfcHJpdjsKLQltZW1zZXQoc2NiLCAwLCBzaXplb2Yoc3RydWN0IHNjYikpOwotCWZvciAoaSA9IDA7IGkgPCBOVU1QUklPOyBpKyspCi0JCXNjYi0+c2VxY3RsW2ldID0gMHhGRkZGOwotCXNjYi0+c2VxY3RsX25vbnFvcyA9IDB4RkZGRjsKLQlzY2ItPm1hZ2ljID0gU0NCX01BR0lDOwotCi0Jd2wtPnB1Yi0+Z2xvYmFsX3NjYiA9IHNjYjsKLQl3bC0+cHViLT5nbG9iYWxfYW1wZHUgPSAmKHNjYi0+c2NiX2FtcGR1KTsKLQl3bC0+cHViLT5nbG9iYWxfYW1wZHUtPnNjYiA9IHNjYjsKLQl3bC0+cHViLT5nbG9iYWxfYW1wZHUtPm1heF9wZHUgPSAxNjsKLQlicmNtdV9wa3RxX2luaXQoJnNjYi0+c2NiX2FtcGR1LnR4cSwgQU1QRFVfTUFYX1NDQl9USUQsCi0JCSAgQU1QRFVfTUFYX1NDQl9USUQgKiBQS1RRX0xFTl9ERUZBVUxUKTsKLQotCXN0YS0+aHRfY2FwLmh0X3N1cHBvcnRlZCA9IHRydWU7Ci0Jc3RhLT5odF9jYXAuYW1wZHVfZmFjdG9yID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEs7Ci0Jc3RhLT5odF9jYXAuYW1wZHVfZGVuc2l0eSA9IEFNUERVX0RFRl9NUERVX0RFTlNJVFk7Ci0Jc3RhLT5odF9jYXAuY2FwID0gSUVFRTgwMjExX0hUX0NBUF9HUk5fRkxEIHwKLQkgICAgSUVFRTgwMjExX0hUX0NBUF9TR0lfMjAgfAotCSAgICBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCB8IElFRUU4MDIxMV9IVF9DQVBfNDBNSFpfSU5UT0xFUkFOVDsKLQotCS8qIG1pbnN0cmVsX2h0IGluaXRpYXRlcyBhZGRCQSBvbiBvdXIgYmVoYWxmIGJ5IGNhbGxpbmcgaWVlZTgwMjExX3N0YXJ0X3R4X2JhX3Nlc3Npb24oKSAqLwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1icmNtc19vcHNfc3RhX3JlbW92ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1icmNtc19vcHNfYW1wZHVfYWN0aW9uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJICAgIGVudW0gaWVlZTgwMjExX2FtcGR1X21sbWVfYWN0aW9uIGFjdGlvbiwKLQkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQsIHUxNiAqc3NuLAotCQkgICAgdTggYnVmX3NpemUpCi17Ci0Jc3RydWN0IHNjYiAqc2NiID0gKHN0cnVjdCBzY2IgKilzdGEtPmRydl9wcml2OwotCXN0cnVjdCBicmNtc19pbmZvICp3bCA9IGh3LT5wcml2OwotCWludCBzdGF0dXM7Ci0KLQlpZiAoV0FSTl9PTihzY2ItPm1hZ2ljICE9IFNDQl9NQUdJQykpCi0JCXJldHVybiAtRUlEUk07Ci0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIElFRUU4MDIxMV9BTVBEVV9SWF9TVEFSVDoKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfQU1QRFVfUlhfU1RPUDoKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlQ6Ci0JCUxPQ0sod2wpOwotCQlzdGF0dXMgPSBicmNtc19jX2FnZ3JlZ2F0YWJsZSh3bC0+d2xjLCB0aWQpOwotCQlVTkxPQ0sod2wpOwotCQlpZiAoIXN0YXR1cykgewotCQkJd2lwaHlfZXJyKHdsLT53aXBoeSwgIlNUQVJUOiB0aWQgJWQgaXMgbm90IGFnZ1wnYWJsZVxuIiwKLQkJCQkgIHRpZCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQkvKiBGdXR1cmUgaW1wcm92ZW1lbnQ6IFVzZSB0aGUgc3RhcnRpbmcgc2VxdWVuY2UgbnVtYmVyIHByb3ZpZGVkIC4uLiAqLwotCQkqc3NuID0gMDsKLQkJaWVlZTgwMjExX3N0YXJ0X3R4X2JhX2NiX2lycXNhZmUodmlmLCBzdGEtPmFkZHIsIHRpZCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RPUDoKLQkJTE9DSyh3bCk7Ci0JCWJyY21zX2NfYW1wZHVfZmx1c2god2wtPndsYywgc3RhLCB0aWQpOwotCQlVTkxPQ0sod2wpOwotCQlpZWVlODAyMTFfc3RvcF90eF9iYV9jYl9pcnFzYWZlKHZpZiwgc3RhLT5hZGRyLCB0aWQpOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9PUEVSQVRJT05BTDoKLQkJLyoKLQkJICogQkEgd2luZG93IHNpemUgZnJvbSBBRERCQSByZXNwb25zZSAoJ2J1Zl9zaXplJykgZGVmaW5lcyBob3cKLQkJICogbWFueSBvdXRzdGFuZGluZyBNUERVcyBhcmUgYWxsb3dlZCBmb3IgdGhlIEJBIHN0cmVhbSBieQotCQkgKiByZWNpcGllbnQgYW5kIHRyYWZmaWMgY2xhc3MuICdhbXBkdV9mYWN0b3InIGdpdmVzIG1heGltdW0KLQkJICogQU1QRFUgc2l6ZS4KLQkJICovCi0JCUxPQ0sod2wpOwotCQlicmNtc19jX2FtcGR1X3R4X29wZXJhdGlvbmFsKHdsLT53bGMsIHRpZCwgYnVmX3NpemUsCi0JCQkoMSA8PCAoSUVFRTgwMjExX0hUX01BWF9BTVBEVV9GQUNUT1IgKwotCQkJIHN0YS0+aHRfY2FwLmFtcGR1X2ZhY3RvcikpIC0gMSk7Ci0JCVVOTE9DSyh3bCk7Ci0JCS8qIFBvd2VyIHNhdmUgd2FrZXVwICovCi0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXdpcGh5X2Vycih3bC0+d2lwaHksICIlczogSW52YWxpZCBjb21tYW5kLCBpZ25vcmluZ1xuIiwKLQkJCSAgX19mdW5jX18pOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBicmNtc19vcHNfcmZraWxsX3BvbGwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCi17Ci0Jc3RydWN0IGJyY21zX2luZm8gKndsID0gSFdfVE9fV0woaHcpOwotCWJvb2wgYmxvY2tlZDsKLQotCUxPQ0sod2wpOwotCWJsb2NrZWQgPSBicmNtc19jX2NoZWNrX3JhZGlvX2Rpc2FibGVkKHdsLT53bGMpOwotCVVOTE9DSyh3bCk7Ci0KLQl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKHdsLT5wdWItPmllZWVfaHctPndpcGh5LCBibG9ja2VkKTsKLX0KLQotc3RhdGljIHZvaWQgYnJjbXNfb3BzX2ZsdXNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGRyb3ApCi17Ci0Jc3RydWN0IGJyY21zX2luZm8gKndsID0gSFdfVE9fV0woaHcpOwotCi0Jbm9fcHJpbnRrKCIlczogZHJvcCA9ICVzXG4iLCBfX2Z1bmNfXywgZHJvcCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotCi0JLyogd2FpdCBmb3IgcGFja2V0IHF1ZXVlIGFuZCBkbWEgZmlmb3MgdG8gcnVuIGVtcHR5ICovCi0JTE9DSyh3bCk7Ci0JYnJjbXNfY193YWl0X2Zvcl90eF9jb21wbGV0aW9uKHdsLT53bGMsIGRyb3ApOwotCVVOTE9DSyh3bCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX29wcyBicmNtc19vcHMgPSB7Ci0JLnR4ID0gYnJjbXNfb3BzX3R4LAotCS5zdGFydCA9IGJyY21zX29wc19zdGFydCwKLQkuc3RvcCA9IGJyY21zX29wc19zdG9wLAotCS5hZGRfaW50ZXJmYWNlID0gYnJjbXNfb3BzX2FkZF9pbnRlcmZhY2UsCi0JLnJlbW92ZV9pbnRlcmZhY2UgPSBicmNtc19vcHNfcmVtb3ZlX2ludGVyZmFjZSwKLQkuY29uZmlnID0gYnJjbXNfb3BzX2NvbmZpZywKLQkuYnNzX2luZm9fY2hhbmdlZCA9IGJyY21zX29wc19ic3NfaW5mb19jaGFuZ2VkLAotCS5jb25maWd1cmVfZmlsdGVyID0gYnJjbXNfb3BzX2NvbmZpZ3VyZV9maWx0ZXIsCi0JLnNldF90aW0gPSBicmNtc19vcHNfc2V0X3RpbSwKLQkuc3dfc2Nhbl9zdGFydCA9IGJyY21zX29wc19zd19zY2FuX3N0YXJ0LAotCS5zd19zY2FuX2NvbXBsZXRlID0gYnJjbXNfb3BzX3N3X3NjYW5fY29tcGxldGUsCi0JLnNldF90c2YgPSBicmNtc19vcHNfc2V0X3RzZiwKLQkuZ2V0X3N0YXRzID0gYnJjbXNfb3BzX2dldF9zdGF0cywKLQkuc3RhX25vdGlmeSA9IGJyY21zX29wc19zdGFfbm90aWZ5LAotCS5jb25mX3R4ID0gYnJjbXNfb3BzX2NvbmZfdHgsCi0JLmdldF90c2YgPSBicmNtc19vcHNfZ2V0X3RzZiwKLQkuc3RhX2FkZCA9IGJyY21zX29wc19zdGFfYWRkLAotCS5zdGFfcmVtb3ZlID0gYnJjbXNfb3BzX3N0YV9yZW1vdmUsCi0JLmFtcGR1X2FjdGlvbiA9IGJyY21zX29wc19hbXBkdV9hY3Rpb24sCi0JLnJma2lsbF9wb2xsID0gYnJjbXNfb3BzX3Jma2lsbF9wb2xsLAotCS5mbHVzaCA9IGJyY21zX29wc19mbHVzaCwKLX07Ci0KLS8qCi0gKiBpcyBjYWxsZWQgaW4gYnJjbXNfcGNpX3Byb2JlKCkgY29udGV4dCwgdGhlcmVmb3JlIG5vIGxvY2tpbmcgcmVxdWlyZWQuCi0gKi8KLXN0YXRpYyBpbnQgYnJjbXNfc2V0X2hpbnQoc3RydWN0IGJyY21zX2luZm8gKndsLCBjaGFyICphYmJyZXYpCi17Ci0JcmV0dXJuIHJlZ3VsYXRvcnlfaGludCh3bC0+cHViLT5pZWVlX2h3LT53aXBoeSwgYWJicmV2KTsKLX0KLQotLyoqCi0gKiBhdHRhY2ggdG8gdGhlIFdMIGRldmljZS4KLSAqCi0gKiBBdHRhY2ggdG8gdGhlIFdMIGRldmljZSBpZGVudGlmaWVkIGJ5IHZlbmRvciBhbmQgZGV2aWNlIHBhcmFtZXRlcnMuCi0gKiByZWdzIGlzIGEgaG9zdCBhY2Nlc3NpYmxlIG1lbW9yeSBhZGRyZXNzIHBvaW50aW5nIHRvIFdMIGRldmljZSByZWdpc3RlcnMuCi0gKgotICogYnJjbXNfYXR0YWNoIGlzIG5vdCBkZWZpbmVkIGFzIHN0YXRpYyBiZWNhdXNlIGluIHRoZSBjYXNlIHdoZXJlIG5vIGJ1cwotICogaXMgZGVmaW5lZCwgd2xfYXR0YWNoIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLCBhbmQgdGh1cywgZ2NjIHdpbGwgaXNzdWUKLSAqIGEgd2FybmluZyB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgZGVmaW5lZCBidXQgbm90IHVzZWQgaWYgd2UgZGVjbGFyZQotICogaXQgYXMgc3RhdGljLgotICoKLSAqCi0gKiBpcyBjYWxsZWQgaW4gYnJjbXNfcGNpX3Byb2JlKCkgY29udGV4dCwgdGhlcmVmb3JlIG5vIGxvY2tpbmcgcmVxdWlyZWQuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgYnJjbXNfaW5mbyAqYnJjbXNfYXR0YWNoKHUxNiB2ZW5kb3IsIHUxNiBkZXZpY2UsCi0JCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgcmVncywKLQkJCSAgICB1aW50IGJ1c3R5cGUsIHZvaWQgKmJ0cGFyYW0sIHVpbnQgaXJxKQotewotCXN0cnVjdCBicmNtc19pbmZvICp3bCA9IE5VTEw7Ci0JaW50IHVuaXQsIGVycjsKLQl1bnNpZ25lZCBsb25nIGJhc2VfYWRkcjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKLQl1OCBwZXJtW0VUSF9BTEVOXTsKLQotCXVuaXQgPSBuX2FkYXB0ZXJzX2ZvdW5kOwotCWVyciA9IDA7Ci0KLQlpZiAodW5pdCA8IDApIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyogYWxsb2NhdGUgcHJpdmF0ZSBpbmZvICovCi0JaHcgPSBwY2lfZ2V0X2RydmRhdGEoYnRwYXJhbSk7CS8qIGJ0cGFyYW0gPT0gcGRldiAqLwotCWlmIChodyAhPSBOVUxMKQotCQl3bCA9IGh3LT5wcml2OwotCWlmIChXQVJOX09OKGh3ID09IE5VTEwpIHx8IFdBUk5fT04od2wgPT0gTlVMTCkpCi0JCXJldHVybiBOVUxMOwotCXdsLT53aXBoeSA9IGh3LT53aXBoeTsKLQotCWF0b21pY19zZXQoJndsLT5jYWxsYmFja3MsIDApOwotCi0JLyogc2V0dXAgdGhlIGJvdHRvbSBoYWxmIGhhbmRsZXIgKi8KLQl0YXNrbGV0X2luaXQoJndsLT50YXNrbGV0LCBicmNtc19kcGMsICh1bnNpZ25lZCBsb25nKSB3bCk7Ci0KLQotCi0JYmFzZV9hZGRyID0gcmVnczsKLQotCWlmIChidXN0eXBlID09IFBDSV9CVVMgfHwgYnVzdHlwZSA9PSBSUENfQlVTKSB7Ci0JCS8qIERvIG5vdGhpbmcgKi8KLQl9IGVsc2UgewotCQlidXN0eXBlID0gUENJX0JVUzsKLQkJQkNNTVNHKHdsLT53aXBoeSwgImZvcmNlIHRvIFBDSVxuIik7Ci0JfQotCXdsLT5iY21fYnVzdHlwZSA9IGJ1c3R5cGU7Ci0KLQl3bC0+cmVnc3ZhID0gaW9yZW1hcF9ub2NhY2hlKGJhc2VfYWRkciwgUENJX0JBUjBfV0lOU1opOwotCWlmICh3bC0+cmVnc3ZhID09IE5VTEwpIHsKLQkJd2lwaHlfZXJyKHdsLT53aXBoeSwgIndsJWQ6IGlvcmVtYXAoKSBmYWlsZWRcbiIsIHVuaXQpOwotCQlnb3RvIGZhaWw7Ci0JfQotCXNwaW5fbG9ja19pbml0KCZ3bC0+bG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJndsLT5pc3JfbG9jayk7Ci0KLQkvKiBwcmVwYXJlIHVjb2RlICovCi0JaWYgKGJyY21zX3JlcXVlc3RfZncod2wsIChzdHJ1Y3QgcGNpX2RldiAqKWJ0cGFyYW0pIDwgMCkgewotCQl3aXBoeV9lcnIod2wtPndpcGh5LCAiJXM6IEZhaWxlZCB0byBmaW5kIGZpcm13YXJlIHVzdWFsbHkgaW4gIgotCQkJICAiJXNcbiIsIEtCVUlMRF9NT0ROQU1FLCAiL2xpYi9maXJtd2FyZS9icmNtIik7Ci0JCWJyY21zX3JlbGVhc2VfZncod2wpOwotCQlicmNtc19yZW1vdmUoKHN0cnVjdCBwY2lfZGV2ICopYnRwYXJhbSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCS8qIGNvbW1vbiBsb2FkLXRpbWUgaW5pdGlhbGl6YXRpb24gKi8KLQl3bC0+d2xjID0gYnJjbXNfY19hdHRhY2goKHZvaWQgKil3bCwgdmVuZG9yLCBkZXZpY2UsIHVuaXQsIGZhbHNlLAotCQkJICAgICB3bC0+cmVnc3ZhLCB3bC0+YmNtX2J1c3R5cGUsIGJ0cGFyYW0sICZlcnIpOwotCWJyY21zX3JlbGVhc2VfZncod2wpOwotCWlmICghd2wtPndsYykgewotCQl3aXBoeV9lcnIod2wtPndpcGh5LCAiJXM6IGF0dGFjaCgpIGZhaWxlZCB3aXRoIGNvZGUgJWRcbiIsCi0JCQkgIEtCVUlMRF9NT0ROQU1FLCBlcnIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCXdsLT5wdWIgPSBicmNtc19jX3B1Yih3bC0+d2xjKTsKLQotCXdsLT5wdWItPmllZWVfaHcgPSBodzsKLQotCWlmIChicmNtc19jX3NldF9wYXIod2wtPndsYywgSU9WX01QQywgMCkgPCAwKSB7Ci0JCXdpcGh5X2Vycih3bC0+d2lwaHksICJ3bCVkOiBFcnJvciBzZXR0aW5nIE1QQyB2YXJpYWJsZSB0byAwXG4iLAotCQkJICB1bml0KTsKLQl9Ci0KLQkvKiByZWdpc3RlciBvdXIgaW50ZXJydXB0IGhhbmRsZXIgKi8KLQlpZiAocmVxdWVzdF9pcnEoaXJxLCBicmNtc19pc3IsIElSUUZfU0hBUkVELCBLQlVJTERfTU9ETkFNRSwgd2wpKSB7Ci0JCXdpcGh5X2Vycih3bC0+d2lwaHksICJ3bCVkOiByZXF1ZXN0X2lycSgpIGZhaWxlZFxuIiwgdW5pdCk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0Jd2wtPmlycSA9IGlycTsKLQotCS8qIHJlZ2lzdGVyIG1vZHVsZSAqLwotCWJyY21zX2NfbW9kdWxlX3JlZ2lzdGVyKHdsLT5wdWIsICJsaW51eCIsIHdsLCB3bF9saW51eF93YXRjaGRvZywgTlVMTCk7Ci0KLQlpZiAoaWVlZV9od19pbml0KGh3KSkgewotCQl3aXBoeV9lcnIod2wtPndpcGh5LCAid2wlZDogJXM6IGllZWVfaHdfaW5pdCBmYWlsZWQhXG4iLCB1bml0LAotCQkJICBfX2Z1bmNfXyk7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQltZW1jcHkocGVybSwgJndsLT5wdWItPmN1cl9ldGhlcmFkZHIsIEVUSF9BTEVOKTsKLQlpZiAoV0FSTl9PTighaXNfdmFsaWRfZXRoZXJfYWRkcihwZXJtKSkpCi0JCWdvdG8gZmFpbDsKLQlTRVRfSUVFRTgwMjExX1BFUk1fQUREUihodywgcGVybSk7Ci0KLQllcnIgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHcoaHcpOwotCWlmIChlcnIpIHsKLQkJd2lwaHlfZXJyKHdsLT53aXBoeSwgIiVzOiBpZWVlODAyMTFfcmVnaXN0ZXJfaHcgZmFpbGVkLCBzdGF0dXMiCi0JCQkgICIlZFxuIiwgX19mdW5jX18sIGVycik7Ci0JfQotCi0JaWYgKHdsLT5wdWItPnNyb21fY2NvZGVbMF0pCi0JCWVyciA9IGJyY21zX3NldF9oaW50KHdsLCB3bC0+cHViLT5zcm9tX2Njb2RlKTsKLQllbHNlCi0JCWVyciA9IGJyY21zX3NldF9oaW50KHdsLCAiVVMiKTsKLQlpZiAoZXJyKSB7Ci0JCXdpcGh5X2Vycih3bC0+d2lwaHksICIlczogcmVndWxhdG9yeV9oaW50IGZhaWxlZCwgc3RhdHVzICVkXG4iLAotCQkJICBfX2Z1bmNfXywgZXJyKTsKLQl9Ci0KLQluX2FkYXB0ZXJzX2ZvdW5kKys7Ci0JcmV0dXJuIHdsOwotCi1mYWlsOgotCWJyY21zX2ZyZWUod2wpOwotCXJldHVybiBOVUxMOwotfQotCi0KLQotI2RlZmluZSBDSEFOMkdIWihjaGFubmVsLCBmcmVxZW5jeSwgY2hmbGFncykgIHsgXAotCS5iYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWiwgXAotCS5jZW50ZXJfZnJlcSA9IChmcmVxZW5jeSksIFwKLQkuaHdfdmFsdWUgPSAoY2hhbm5lbCksIFwKLQkuZmxhZ3MgPSBjaGZsYWdzLCBcCi0JLm1heF9hbnRlbm5hX2dhaW4gPSAwLCBcCi0JLm1heF9wb3dlciA9IDE5LCBcCi19Ci0KLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgYnJjbXNfMmdoel9jaGFudGFibGVbXSA9IHsKLQlDSEFOMkdIWigxLCAyNDEyLCBJRUVFODAyMTFfQ0hBTl9OT19IVDQwTUlOVVMpLAotCUNIQU4yR0haKDIsIDI0MTcsIElFRUU4MDIxMV9DSEFOX05PX0hUNDBNSU5VUyksCi0JQ0hBTjJHSFooMywgMjQyMiwgSUVFRTgwMjExX0NIQU5fTk9fSFQ0ME1JTlVTKSwKLQlDSEFOMkdIWig0LCAyNDI3LCBJRUVFODAyMTFfQ0hBTl9OT19IVDQwTUlOVVMpLAotCUNIQU4yR0haKDUsIDI0MzIsIDApLAotCUNIQU4yR0haKDYsIDI0MzcsIDApLAotCUNIQU4yR0haKDcsIDI0NDIsIDApLAotCUNIQU4yR0haKDgsIDI0NDcsIElFRUU4MDIxMV9DSEFOX05PX0hUNDBQTFVTKSwKLQlDSEFOMkdIWig5LCAyNDUyLCBJRUVFODAyMTFfQ0hBTl9OT19IVDQwUExVUyksCi0JQ0hBTjJHSFooMTAsIDI0NTcsIElFRUU4MDIxMV9DSEFOX05PX0hUNDBQTFVTKSwKLQlDSEFOMkdIWigxMSwgMjQ2MiwgSUVFRTgwMjExX0NIQU5fTk9fSFQ0MFBMVVMpLAotCUNIQU4yR0haKDEyLCAyNDY3LAotCQkgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOIHwgSUVFRTgwMjExX0NIQU5fTk9fSUJTUyB8Ci0JCSBJRUVFODAyMTFfQ0hBTl9OT19IVDQwUExVUyksCi0JQ0hBTjJHSFooMTMsIDI0NzIsCi0JCSBJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU4gfCBJRUVFODAyMTFfQ0hBTl9OT19JQlNTIHwKLQkJIElFRUU4MDIxMV9DSEFOX05PX0hUNDBQTFVTKSwKLQlDSEFOMkdIWigxNCwgMjQ4NCwKLQkJIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTiB8IElFRUU4MDIxMV9DSEFOX05PX0lCU1MgfAotCQkgSUVFRTgwMjExX0NIQU5fTk9fSFQ0MFBMVVMgfCBJRUVFODAyMTFfQ0hBTl9OT19IVDQwTUlOVVMpCi19OwotCi0jZGVmaW5lIENIQU41R0haKGNoYW5uZWwsIGNoZmxhZ3MpICB7IFwKLQkuYmFuZCA9IElFRUU4MDIxMV9CQU5EXzVHSFosIFwKLQkuY2VudGVyX2ZyZXEgPSA1MDAwICsgNSooY2hhbm5lbCksIFwKLQkuaHdfdmFsdWUgPSAoY2hhbm5lbCksIFwKLQkuZmxhZ3MgPSBjaGZsYWdzLCBcCi0JLm1heF9hbnRlbm5hX2dhaW4gPSAwLCBcCi0JLm1heF9wb3dlciA9IDIxLCBcCi19Ci0KLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgYnJjbXNfNWdoel9ucGh5X2NoYW50YWJsZVtdID0gewotCS8qIFVOSUktMSAqLwotCUNIQU41R0haKDM2LCBJRUVFODAyMTFfQ0hBTl9OT19IVDQwTUlOVVMpLAotCUNIQU41R0haKDQwLCBJRUVFODAyMTFfQ0hBTl9OT19IVDQwUExVUyksCi0JQ0hBTjVHSFooNDQsIElFRUU4MDIxMV9DSEFOX05PX0hUNDBNSU5VUyksCi0JQ0hBTjVHSFooNDgsIElFRUU4MDIxMV9DSEFOX05PX0hUNDBQTFVTKSwKLQkvKiBVTklJLTIgKi8KLQlDSEFONUdIWig1MiwKLQkJIElFRUU4MDIxMV9DSEFOX1JBREFSIHwgSUVFRTgwMjExX0NIQU5fTk9fSUJTUyB8Ci0JCSBJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU4gfCBJRUVFODAyMTFfQ0hBTl9OT19IVDQwTUlOVVMpLAotCUNIQU41R0haKDU2LAotCQkgSUVFRTgwMjExX0NIQU5fUkFEQVIgfCBJRUVFODAyMTFfQ0hBTl9OT19JQlNTIHwKLQkJIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTiB8IElFRUU4MDIxMV9DSEFOX05PX0hUNDBQTFVTKSwKLQlDSEFONUdIWig2MCwKLQkJIElFRUU4MDIxMV9DSEFOX1JBREFSIHwgSUVFRTgwMjExX0NIQU5fTk9fSUJTUyB8Ci0JCSBJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU4gfCBJRUVFODAyMTFfQ0hBTl9OT19IVDQwTUlOVVMpLAotCUNIQU41R0haKDY0LAotCQkgSUVFRTgwMjExX0NIQU5fUkFEQVIgfCBJRUVFODAyMTFfQ0hBTl9OT19JQlNTIHwKLQkJIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTiB8IElFRUU4MDIxMV9DSEFOX05PX0hUNDBQTFVTKSwKLQkvKiBNSUQgKi8KLQlDSEFONUdIWigxMDAsCi0JCSBJRUVFODAyMTFfQ0hBTl9SQURBUiB8IElFRUU4MDIxMV9DSEFOX05PX0lCU1MgfAotCQkgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOIHwgSUVFRTgwMjExX0NIQU5fTk9fSFQ0ME1JTlVTKSwKLQlDSEFONUdIWigxMDQsCi0JCSBJRUVFODAyMTFfQ0hBTl9SQURBUiB8IElFRUU4MDIxMV9DSEFOX05PX0lCU1MgfAotCQkgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOIHwgSUVFRTgwMjExX0NIQU5fTk9fSFQ0MFBMVVMpLAotCUNIQU41R0haKDEwOCwKLQkJIElFRUU4MDIxMV9DSEFOX1JBREFSIHwgSUVFRTgwMjExX0NIQU5fTk9fSUJTUyB8Ci0JCSBJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU4gfCBJRUVFODAyMTFfQ0hBTl9OT19IVDQwTUlOVVMpLAotCUNIQU41R0haKDExMiwKLQkJIElFRUU4MDIxMV9DSEFOX1JBREFSIHwgSUVFRTgwMjExX0NIQU5fTk9fSUJTUyB8Ci0JCSBJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU4gfCBJRUVFODAyMTFfQ0hBTl9OT19IVDQwUExVUyksCi0JQ0hBTjVHSFooMTE2LAotCQkgSUVFRTgwMjExX0NIQU5fUkFEQVIgfCBJRUVFODAyMTFfQ0hBTl9OT19JQlNTIHwKLQkJIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTiB8IElFRUU4MDIxMV9DSEFOX05PX0hUNDBNSU5VUyksCi0JQ0hBTjVHSFooMTIwLAotCQkgSUVFRTgwMjExX0NIQU5fUkFEQVIgfCBJRUVFODAyMTFfQ0hBTl9OT19JQlNTIHwKLQkJIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTiB8IElFRUU4MDIxMV9DSEFOX05PX0hUNDBQTFVTKSwKLQlDSEFONUdIWigxMjQsCi0JCSBJRUVFODAyMTFfQ0hBTl9SQURBUiB8IElFRUU4MDIxMV9DSEFOX05PX0lCU1MgfAotCQkgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOIHwgSUVFRTgwMjExX0NIQU5fTk9fSFQ0ME1JTlVTKSwKLQlDSEFONUdIWigxMjgsCi0JCSBJRUVFODAyMTFfQ0hBTl9SQURBUiB8IElFRUU4MDIxMV9DSEFOX05PX0lCU1MgfAotCQkgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOIHwgSUVFRTgwMjExX0NIQU5fTk9fSFQ0MFBMVVMpLAotCUNIQU41R0haKDEzMiwKLQkJIElFRUU4MDIxMV9DSEFOX1JBREFSIHwgSUVFRTgwMjExX0NIQU5fTk9fSUJTUyB8Ci0JCSBJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU4gfCBJRUVFODAyMTFfQ0hBTl9OT19IVDQwTUlOVVMpLAotCUNIQU41R0haKDEzNiwKLQkJIElFRUU4MDIxMV9DSEFOX1JBREFSIHwgSUVFRTgwMjExX0NIQU5fTk9fSUJTUyB8Ci0JCSBJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU4gfCBJRUVFODAyMTFfQ0hBTl9OT19IVDQwUExVUyksCi0JQ0hBTjVHSFooMTQwLAotCQkgSUVFRTgwMjExX0NIQU5fUkFEQVIgfCBJRUVFODAyMTFfQ0hBTl9OT19JQlNTIHwKLQkJIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTiB8IElFRUU4MDIxMV9DSEFOX05PX0hUNDBQTFVTIHwKLQkJIElFRUU4MDIxMV9DSEFOX05PX0hUNDBNSU5VUyksCi0JLyogVU5JSS0zICovCi0JQ0hBTjVHSFooMTQ5LCBJRUVFODAyMTFfQ0hBTl9OT19IVDQwTUlOVVMpLAotCUNIQU41R0haKDE1MywgSUVFRTgwMjExX0NIQU5fTk9fSFQ0MFBMVVMpLAotCUNIQU41R0haKDE1NywgSUVFRTgwMjExX0NIQU5fTk9fSFQ0ME1JTlVTKSwKLQlDSEFONUdIWigxNjEsIElFRUU4MDIxMV9DSEFOX05PX0hUNDBQTFVTKSwKLQlDSEFONUdIWigxNjUsIElFRUU4MDIxMV9DSEFOX05PX0hUNDBQTFVTIHwgSUVFRTgwMjExX0NIQU5fTk9fSFQ0ME1JTlVTKQotfTsKLQotI2RlZmluZSBSQVRFKHJhdGUxMDBtLCBfZmxhZ3MpIHsgXAotCS5iaXRyYXRlID0gKHJhdGUxMDBtKSwgXAotCS5mbGFncyA9IChfZmxhZ3MpLCBcCi0JLmh3X3ZhbHVlID0gKHJhdGUxMDBtIC8gNSksIFwKLX0KLQotc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfcmF0ZSBsZWdhY3lfcmF0ZXRhYmxlW10gPSB7Ci0JUkFURSgxMCwgMCksCi0JUkFURSgyMCwgSUVFRTgwMjExX1JBVEVfU0hPUlRfUFJFQU1CTEUpLAotCVJBVEUoNTUsIElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFKSwKLQlSQVRFKDExMCwgSUVFRTgwMjExX1JBVEVfU0hPUlRfUFJFQU1CTEUpLAotCVJBVEUoNjAsIDApLAotCVJBVEUoOTAsIDApLAotCVJBVEUoMTIwLCAwKSwKLQlSQVRFKDE4MCwgMCksCi0JUkFURSgyNDAsIDApLAotCVJBVEUoMzYwLCAwKSwKLQlSQVRFKDQ4MCwgMCksCi0JUkFURSg1NDAsIDApLAotfTsKLQotc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgYnJjbXNfYmFuZF8yR0h6X25waHkgPSB7Ci0JLmJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haLAotCS5jaGFubmVscyA9IGJyY21zXzJnaHpfY2hhbnRhYmxlLAotCS5uX2NoYW5uZWxzID0gQVJSQVlfU0laRShicmNtc18yZ2h6X2NoYW50YWJsZSksCi0JLmJpdHJhdGVzID0gbGVnYWN5X3JhdGV0YWJsZSwKLQkubl9iaXRyYXRlcyA9IEFSUkFZX1NJWkUobGVnYWN5X3JhdGV0YWJsZSksCi0JLmh0X2NhcCA9IHsKLQkJICAgLyogZnJvbSBpbmNsdWRlL2xpbnV4L2llZWU4MDIxMS5oICovCi0JCSAgIC5jYXAgPSBJRUVFODAyMTFfSFRfQ0FQX0dSTl9GTEQgfAotCQkgICBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCB8Ci0JCSAgIElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwIHwgSUVFRTgwMjExX0hUX0NBUF80ME1IWl9JTlRPTEVSQU5ULAotCQkgICAuaHRfc3VwcG9ydGVkID0gdHJ1ZSwKLQkJICAgLmFtcGR1X2ZhY3RvciA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLLAotCQkgICAuYW1wZHVfZGVuc2l0eSA9IEFNUERVX0RFRl9NUERVX0RFTlNJVFksCi0JCSAgIC5tY3MgPSB7Ci0JCQkgICAvKiBwbGFjZWhvbGRlcnMgZm9yIG5vdyAqLwotCQkJICAgLnJ4X21hc2sgPSB7MHhmZiwgMHhmZiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCi0JCQkgICAucnhfaGlnaGVzdCA9IDUwMCwKLQkJCSAgIC50eF9wYXJhbXMgPSBJRUVFODAyMTFfSFRfTUNTX1RYX0RFRklORUR9Ci0JCSAgIH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kIGJyY21zX2JhbmRfNUdIel9ucGh5ID0gewotCS5iYW5kID0gSUVFRTgwMjExX0JBTkRfNUdIWiwKLQkuY2hhbm5lbHMgPSBicmNtc181Z2h6X25waHlfY2hhbnRhYmxlLAotCS5uX2NoYW5uZWxzID0gQVJSQVlfU0laRShicmNtc181Z2h6X25waHlfY2hhbnRhYmxlKSwKLQkuYml0cmF0ZXMgPSBsZWdhY3lfcmF0ZXRhYmxlICsgNCwKLQkubl9iaXRyYXRlcyA9IEFSUkFZX1NJWkUobGVnYWN5X3JhdGV0YWJsZSkgLSA0LAotCS5odF9jYXAgPSB7Ci0JCSAgIC8qIHVzZSBJRUVFODAyMTFfSFRfQ0FQXyogZnJvbSBpbmNsdWRlL2xpbnV4L2llZWU4MDIxMS5oICovCi0JCSAgIC5jYXAgPSBJRUVFODAyMTFfSFRfQ0FQX0dSTl9GTEQgfCBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCB8IElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwIHwgSUVFRTgwMjExX0hUX0NBUF80ME1IWl9JTlRPTEVSQU5ULAkvKiBObyA0MCBtaHogeWV0ICovCi0JCSAgIC5odF9zdXBwb3J0ZWQgPSB0cnVlLAotCQkgICAuYW1wZHVfZmFjdG9yID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEssCi0JCSAgIC5hbXBkdV9kZW5zaXR5ID0gQU1QRFVfREVGX01QRFVfREVOU0lUWSwKLQkJICAgLm1jcyA9IHsKLQkJCSAgIC8qIHBsYWNlaG9sZGVycyBmb3Igbm93ICovCi0JCQkgICAucnhfbWFzayA9IHsweGZmLCAweGZmLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKLQkJCSAgIC5yeF9oaWdoZXN0ID0gNTAwLAotCQkJICAgLnR4X3BhcmFtcyA9IElFRUU4MDIxMV9IVF9NQ1NfVFhfREVGSU5FRH0KLQkJICAgfQotfTsKLQotLyoKLSAqIGlzIGNhbGxlZCBpbiBicmNtc19wY2lfcHJvYmUoKSBjb250ZXh0LCB0aGVyZWZvcmUgbm8gbG9ja2luZyByZXF1aXJlZC4KLSAqLwotc3RhdGljIGludCBpZWVlX2h3X3JhdGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wgPSBIV19UT19XTChodyk7Ci0JaW50IGhhc181ZzsKLQljaGFyIHBoeV9saXN0WzRdOwotCi0JaGFzXzVnID0gMDsKLQotCWh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPSBOVUxMOwotCWh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPSBOVUxMOwotCi0JaWYgKGJyY21zX2NfZ2V0KHdsLT53bGMsIEJSQ01fR0VUX1BIWUxJU1QsIChpbnQgKikmcGh5X2xpc3QpIDwgMCkKLQkJd2lwaHlfZXJyKGh3LT53aXBoeSwgIlBoeSBsaXN0IGZhaWxlZFxuIik7Ci0KLQlpZiAocGh5X2xpc3RbMF0gPT0gJ24nIHx8IHBoeV9saXN0WzBdID09ICdjJykgewotCQlpZiAocGh5X2xpc3RbMF0gPT0gJ2MnKSB7Ci0JCQkvKiBTaW5nbGUgc3RyZWFtICovCi0JCQlicmNtc19iYW5kXzJHSHpfbnBoeS5odF9jYXAubWNzLnJ4X21hc2tbMV0gPSAwOwotCQkJYnJjbXNfYmFuZF8yR0h6X25waHkuaHRfY2FwLm1jcy5yeF9oaWdoZXN0ID0gNzI7Ci0JCX0KLQkJaHctPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9ICZicmNtc19iYW5kXzJHSHpfbnBoeTsKLQl9IGVsc2UgewotCQlyZXR1cm4gLUVQRVJNOwotCX0KLQotCS8qIEFzc3VtZSBhbGwgYmFuZHMgdXNlIHRoZSBzYW1lIHBoeS4gIFRydWUgZm9yIDExbiBkZXZpY2VzLiAqLwotCWlmIChOQkFORFNfUFVCKHdsLT5wdWIpID4gMSkgewotCQloYXNfNWcrKzsKLQkJaWYgKHBoeV9saXN0WzBdID09ICduJyB8fCBwaHlfbGlzdFswXSA9PSAnYycpIHsKLQkJCWh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPQotCQkJICAgICZicmNtc19iYW5kXzVHSHpfbnBoeTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAtRVBFUk07Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBpcyBjYWxsZWQgaW4gYnJjbXNfcGNpX3Byb2JlKCkgY29udGV4dCwgdGhlcmVmb3JlIG5vIGxvY2tpbmcgcmVxdWlyZWQuCi0gKi8KLXN0YXRpYyBpbnQgaWVlZV9od19pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCWh3LT5mbGFncyA9IElFRUU4MDIxMV9IV19TSUdOQUxfREJNCi0JICAgIC8qIHwgSUVFRTgwMjExX0hXX0NPTk5FQ1RJT05fTU9OSVRPUiAgV2hhdCBpcyB0aGlzPyAqLwotCSAgICB8IElFRUU4MDIxMV9IV19SRVBPUlRTX1RYX0FDS19TVEFUVVMKLQkgICAgfCBJRUVFODAyMTFfSFdfQU1QRFVfQUdHUkVHQVRJT047Ci0KLQlody0+ZXh0cmFfdHhfaGVhZHJvb20gPSBicmNtc19jX2dldF9oZWFkZXJfbGVuKCk7Ci0JaHctPnF1ZXVlcyA9IE5fVFhfUVVFVUVTOwotCWh3LT5tYXhfcmF0ZXMgPSAyOwkvKiBQcmltYXJ5IHJhdGUgYW5kIDEgZmFsbGJhY2sgcmF0ZSAqLwotCi0JaHctPmNoYW5uZWxfY2hhbmdlX3RpbWUgPSA3ICogMTAwMDsJLyogY2hhbm5lbCBjaGFuZ2UgdGltZSBpcyBkZXBlbmRlbnQgb24gY2hpcCBhbmQgYmFuZCAgKi8KLQlody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKTsKLQotCWh3LT5yYXRlX2NvbnRyb2xfYWxnb3JpdGhtID0gIm1pbnN0cmVsX2h0IjsKLQotCWh3LT5zdGFfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBzY2IpOwotCXJldHVybiBpZWVlX2h3X3JhdGVfaW5pdChodyk7Ci19Ci0KLS8qKgotICogZGV0ZXJtaW5lcyBpZiBhIGRldmljZSBpcyBhIFdMIGRldmljZSwgYW5kIGlmIHNvLCBhdHRhY2hlcyBpdC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgYSBkZXZpY2UgcG9pbnRlZCB0byBieSBwZGV2IGlzIGEgV0wgZGV2aWNlLAotICogYW5kIGlmIHNvLCBwZXJmb3JtcyBhIGJyY21zX2F0dGFjaCgpIG9uIGl0LgotICoKLSAqIFBlcmltZXRlciBsb2NrIGlzIGluaXRpYWxpemVkIGluIHRoZSBjb3Vyc2Ugb2YgdGhpcyBmdW5jdGlvbi4KLSAqLwotc3RhdGljIGludCBfX2RldmluaXQKLWJyY21zX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKLXsKLQlpbnQgcmM7Ci0Jc3RydWN0IGJyY21zX2luZm8gKndsOwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwotCXUzMiB2YWw7Ci0KLQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiYnVzICVkIHNsb3QgJWQgZnVuYyAlZCBpcnEgJWRcbiIsCi0JICAgICAgIHBkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChwZGV2LT5kZXZmbiksCi0JICAgICAgIFBDSV9GVU5DKHBkZXYtPmRldmZuKSwgcGRldi0+aXJxKTsKLQotCWlmICgocGRldi0+dmVuZG9yICE9IFBDSV9WRU5ET1JfSURfQlJPQURDT00pIHx8Ci0JICAgICgocGRldi0+ZGV2aWNlICE9IDB4MDU3NikgJiYKLQkgICAgICgocGRldi0+ZGV2aWNlICYgMHhmZjAwKSAhPSAweDQzMDApICYmCi0JICAgICAoKHBkZXYtPmRldmljZSAmIDB4ZmYwMCkgIT0gMHg0NzAwKSAmJgotCSAgICAgKChwZGV2LT5kZXZpY2UgPCA0MzAwMCkgfHwgKHBkZXYtPmRldmljZSA+IDQzOTk5KSkpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IENhbm5vdCBlbmFibGUgZGV2aWNlICVkLSVkXyVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHBkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChwZGV2LT5kZXZmbiksCi0JCSAgICAgICBQQ0lfRlVOQyhwZGV2LT5kZXZmbikpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JcGNpX3NldF9tYXN0ZXIocGRldik7Ci0KLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHg0MCwgJnZhbCk7Ci0JaWYgKCh2YWwgJiAweDAwMDBmZjAwKSAhPSAwKQotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4NDAsIHZhbCAmIDB4ZmZmZjAwZmYpOwotCi0JaHcgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKHN0cnVjdCBicmNtc19pbmZvKSwgJmJyY21zX29wcyk7Ci0JaWYgKCFodykgewotCQlwcl9lcnIoIiVzOiBpZWVlODAyMTFfYWxsb2NfaHcgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCVNFVF9JRUVFODAyMTFfREVWKGh3LCAmcGRldi0+ZGV2KTsKLQotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBodyk7Ci0KLQltZW1zZXQoaHctPnByaXYsIDAsIHNpemVvZigqd2wpKTsKLQotCXdsID0gYnJjbXNfYXR0YWNoKHBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlLAotCQkJICBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCksIFBDSV9CVVMsIHBkZXYsCi0JCQkgIHBkZXYtPmlycSk7Ci0KLQlpZiAoIXdsKSB7Ci0JCXByX2VycigiJXM6ICVzOiBicmNtc19hdHRhY2ggZmFpbGVkIVxuIiwgS0JVSUxEX01PRE5BTUUsCi0JCSAgICAgICBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBicmNtc19zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3RydWN0IGJyY21zX2luZm8gKndsOwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwotCi0JaHcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jd2wgPSBIV19UT19XTChodyk7Ci0JaWYgKCF3bCkgewotCQl3aXBoeV9lcnIod2wtPndpcGh5LAotCQkJICAiYnJjbXNfc3VzcGVuZDogcGNpX2dldF9kcnZkYXRhIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCS8qIG9ubHkgbmVlZCB0byBmbGFnIGh3IGlzIGRvd24gZm9yIHByb3BlciByZXN1bWUgKi8KLQlMT0NLKHdsKTsKLQl3bC0+cHViLT5od191cCA9IGZhbHNlOwotCVVOTE9DSyh3bCk7Ci0KLQlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JcmV0dXJuIHBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QzaG90KTsKLX0KLQotc3RhdGljIGludCBicmNtc19yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IGJyY21zX2luZm8gKndsOwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwotCWludCBlcnIgPSAwOwotCXUzMiB2YWw7Ci0KLQlodyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQl3bCA9IEhXX1RPX1dMKGh3KTsKLQlpZiAoIXdsKSB7Ci0JCXdpcGh5X2Vycih3bC0+d2lwaHksCi0JCQkgICJ3bDogYnJjbXNfcmVzdW1lOiBwY2lfZ2V0X2RydmRhdGEgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JZXJyID0gcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKLQotCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKLQotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDQwLCAmdmFsKTsKLQlpZiAoKHZhbCAmIDB4MDAwMGZmMDApICE9IDApCi0JCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgMHg0MCwgdmFsICYgMHhmZmZmMDBmZik7Ci0KLQkvKgotCSogIGRvbmUuIGRyaXZlciB3aWxsIGJlIHB1dCBpbiB1cCBzdGF0ZQotCSogIGluIGJyY21zX29wc19hZGRfaW50ZXJmYWNlKCkgY2FsbC4KLQkqLwotCXJldHVybiBlcnI7Ci19Ci0KLS8qCi0qIGNhbGxlZCBmcm9tIGJvdGgga2VybmVsIGFzIGZyb20gdGhpcyBrZXJuZWwgbW9kdWxlLgotKiBwcmVjb25kaXRpb246IHBlcmltZXRlciBsb2NrIGlzIG5vdCBhY3F1aXJlZC4KLSovCi1zdGF0aWMgdm9pZCBicmNtc19yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IGJyY21zX2luZm8gKndsOwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwotCWludCBzdGF0dXM7Ci0KLQlodyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQl3bCA9IEhXX1RPX1dMKGh3KTsKLQlpZiAoIXdsKSB7Ci0JCXByX2Vycigid2w6IGJyY21zX3JlbW92ZTogcGNpX2dldF9kcnZkYXRhIGZhaWxlZFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlMT0NLKHdsKTsKLQlzdGF0dXMgPSBicmNtc19jX2NoaXBtYXRjaChwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSk7Ci0JVU5MT0NLKHdsKTsKLQlpZiAoIXN0YXR1cykgewotCQl3aXBoeV9lcnIod2wtPndpcGh5LCAid2w6IGJyY21zX3JlbW92ZTogY2hpcG1hdGNoICIKLQkJCQkgICAgICJmYWlsZWRcbiIpOwotCQlyZXR1cm47Ci0JfQotCWlmICh3bC0+d2xjKSB7Ci0JCXdpcGh5X3Jma2lsbF9zZXRfaHdfc3RhdGUod2wtPnB1Yi0+aWVlZV9ody0+d2lwaHksIGZhbHNlKTsKLQkJd2lwaHlfcmZraWxsX3N0b3BfcG9sbGluZyh3bC0+cHViLT5pZWVlX2h3LT53aXBoeSk7Ci0JCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KGh3KTsKLQkJTE9DSyh3bCk7Ci0JCWJyY21zX2Rvd24od2wpOwotCQlVTkxPQ0sod2wpOwotCX0KLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0KLQlicmNtc19mcmVlKHdsKTsKLQotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQlpZWVlODAyMTFfZnJlZV9odyhodyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBicmNtc19wY2lfZHJpdmVyID0gewotCS5uYW1lICAgICA9IEtCVUlMRF9NT0ROQU1FLAotCS5wcm9iZSAgICA9IGJyY21zX3BjaV9wcm9iZSwKLQkuc3VzcGVuZCAgPSBicmNtc19zdXNwZW5kLAotCS5yZXN1bWUgICA9IGJyY21zX3Jlc3VtZSwKLQkucmVtb3ZlICAgPSBfX2RldmV4aXRfcChicmNtc19yZW1vdmUpLAotCS5pZF90YWJsZSA9IGJyY21zX3BjaV9pZF90YWJsZSwKLX07Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgdGhlIFdMIGRyaXZlci4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgaWYgYSBkZXZpY2UgcG9pbnRlZCB0byBieSBwZGV2IGlzIGEgV0wgZGV2aWNlLAotICogYW5kIGlmIHNvLCBwZXJmb3JtcyBhIGJyY21zX2F0dGFjaCgpIG9uIGl0LgotICoKLSAqLwotc3RhdGljIGludCBfX2luaXQgYnJjbXNfbW9kdWxlX2luaXQodm9pZCkKLXsKLQlpbnQgZXJyb3IgPSAtRU5PREVWOwotCi0jaWZkZWYgQkNNREJHCi0JaWYgKG1zZ2xldmVsICE9IDB4ZGVhZGJlZWYpCi0JCWJyY21fbXNnX2xldmVsID0gbXNnbGV2ZWw7Ci0JaWYgKHBoeW1zZ2xldmVsICE9IDB4ZGVhZGJlZWYpCi0JCXBoeWhhbF9tc2dfbGV2ZWwgPSBwaHltc2dsZXZlbDsKLSNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KLQotCWVycm9yID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYnJjbXNfcGNpX2RyaXZlcik7Ci0JaWYgKCFlcnJvcikKLQkJcmV0dXJuIDA7Ci0KLQotCi0JcmV0dXJuIGVycm9yOwotfQotCi0vKioKLSAqIFRoaXMgZnVuY3Rpb24gdW5sb2FkcyB0aGUgV0wgZHJpdmVyIGZyb20gdGhlIHN5c3RlbS4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHVuY29uZGl0aW9uYWxseSB1bmxvYWRzIHRoZSBXTCBkcml2ZXIgbW9kdWxlIGZyb20gdGhlCi0gKiBzeXN0ZW0uCi0gKgotICovCi1zdGF0aWMgdm9pZCBfX2V4aXQgYnJjbXNfbW9kdWxlX2V4aXQodm9pZCkKLXsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmJyY21zX3BjaV9kcml2ZXIpOwotCi19Ci0KLW1vZHVsZV9pbml0KGJyY21zX21vZHVsZV9pbml0KTsKLW1vZHVsZV9leGl0KGJyY21zX21vZHVsZV9leGl0KTsKLQotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIGZyZWVzIHRoZSBXTCBwZXItZGV2aWNlIHJlc291cmNlcy4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGZyZWVzIHJlc291cmNlcyBvd25lZCBieSB0aGUgV0wgZGV2aWNlIHBvaW50ZWQgdG8KLSAqIGJ5IHRoZSB3bCBwYXJhbWV0ZXIuCi0gKgotICogcHJlY29uZGl0aW9uOiBjYW4gYm90aCBiZSBjYWxsZWQgbG9ja2VkIGFuZCB1bmxvY2tlZAotICoKLSAqLwotc3RhdGljIHZvaWQgYnJjbXNfZnJlZShzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wpCi17Ci0Jc3RydWN0IGJyY21zX3RpbWVyICp0LCAqbmV4dDsKLQotCS8qIGZyZWUgdWNvZGUgZGF0YSAqLwotCWlmICh3bC0+ZncuZndfY250KQotCQlicmNtc191Y29kZV9kYXRhX2ZyZWUoKTsKLQlpZiAod2wtPmlycSkKLQkJZnJlZV9pcnEod2wtPmlycSwgd2wpOwotCi0JLyoga2lsbCBkcGMgKi8KLQl0YXNrbGV0X2tpbGwoJndsLT50YXNrbGV0KTsKLQotCWlmICh3bC0+cHViKSB7Ci0JCWJyY21zX2NfbW9kdWxlX3VucmVnaXN0ZXIod2wtPnB1YiwgImxpbnV4Iiwgd2wpOwotCX0KLQotCS8qIGZyZWUgY29tbW9uIHJlc291cmNlcyAqLwotCWlmICh3bC0+d2xjKSB7Ci0JCWJyY21zX2NfZGV0YWNoKHdsLT53bGMpOwotCQl3bC0+d2xjID0gTlVMTDsKLQkJd2wtPnB1YiA9IE5VTEw7Ci0JfQotCi0JLyogdmlydHVhbCBpbnRlcmZhY2UgZGVsZXRpb24gaXMgZGVmZXJyZWQgc28gd2UgY2Fubm90IHNwaW53YWl0ICovCi0KLQkvKiB3YWl0IGZvciBhbGwgcGVuZGluZyBjYWxsYmFja3MgdG8gY29tcGxldGUgKi8KLQl3aGlsZSAoYXRvbWljX3JlYWQoJndsLT5jYWxsYmFja3MpID4gMCkKLQkJc2NoZWR1bGUoKTsKLQotCS8qIGZyZWUgdGltZXJzICovCi0JZm9yICh0ID0gd2wtPnRpbWVyczsgdDsgdCA9IG5leHQpIHsKLQkJbmV4dCA9IHQtPm5leHQ7Ci0jaWZkZWYgQkNNREJHCi0JCWtmcmVlKHQtPm5hbWUpOwotI2VuZGlmCi0JCWtmcmVlKHQpOwotCX0KLQotCS8qCi0JICogdW5yZWdpc3Rlcl9uZXRkZXYoKSBjYWxscyBnZXRfc3RhdHMoKSB3aGljaCBtYXkgcmVhZCBjaGlwIHJlZ2lzdGVycwotCSAqIHNvIHdlIGNhbm5vdCB1bm1hcCB0aGUgY2hpcCByZWdpc3RlcnMgdW50aWwgYWZ0ZXIgY2FsbGluZyB1bnJlZ2lzdGVyX25ldGRldigpIC4KLQkgKi8KLQlpZiAod2wtPnJlZ3N2YSAmJiB3bC0+YmNtX2J1c3R5cGUgIT0gU0RJT19CVVMgJiYKLQkgICAgd2wtPmJjbV9idXN0eXBlICE9IEpUQUdfQlVTKSB7Ci0JCWlvdW5tYXAoKHZvaWQgKil3bC0+cmVnc3ZhKTsKLQl9Ci0Jd2wtPnJlZ3N2YSA9IE5VTEw7Ci19Ci0KLS8qIGZsYWdzIHRoZSBnaXZlbiByYXRlIGluIHJhdGVzZXQgYXMgcmVxdWVzdGVkICovCi1zdGF0aWMgdm9pZCBicmNtc19zZXRfYmFzaWNfcmF0ZShzdHJ1Y3Qgd2xfcmF0ZXNldCAqcnMsIHUxNiByYXRlLCBib29sIGlzX2JyKQotewotCXUzMiBpOwotCi0JZm9yIChpID0gMDsgaSA8IHJzLT5jb3VudDsgaSsrKSB7Ci0JCWlmIChyYXRlICE9IChycy0+cmF0ZXNbaV0gJiAweDdmKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChpc19icikKLQkJCXJzLT5yYXRlc1tpXSB8PSBCUkNNU19SQVRFX0ZMQUc7Ci0JCWVsc2UKLQkJCXJzLT5yYXRlc1tpXSAmPSBCUkNNU19SQVRFX01BU0s7Ci0JCXJldHVybjsKLQl9Ci19Ci0KLS8qCi0gKiBwcmVjb25kaXRpb246IHBlcmltZXRlciBsb2NrIGhhcyBiZWVuIGFjcXVpcmVkCi0gKi8KLXZvaWQgYnJjbXNfdHhmbG93Y29udHJvbChzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wsIHN0cnVjdCBicmNtc19pZiAqd2xpZiwKLQkJCSBib29sIHN0YXRlLCBpbnQgcHJpbykKLXsKLQl3aXBoeV9lcnIod2wtPndpcGh5LCAiU2hvdWxkbid0IGJlIGhlcmUgJXNcbiIsIF9fZnVuY19fKTsKLX0KLQotLyoKLSAqIHByZWNvbmRpdGlvbjogcGVyaW1ldGVyIGxvY2sgaGFzIGJlZW4gYWNxdWlyZWQKLSAqLwotdm9pZCBicmNtc19pbml0KHN0cnVjdCBicmNtc19pbmZvICp3bCkKLXsKLQlCQ01NU0coV0xfVE9fSFcod2wpLT53aXBoeSwgIndsJWRcbiIsIHdsLT5wdWItPnVuaXQpOwotCWJyY21zX3Jlc2V0KHdsKTsKLQotCWJyY21zX2NfaW5pdCh3bC0+d2xjKTsKLX0KLQotLyoKLSAqIHByZWNvbmRpdGlvbjogcGVyaW1ldGVyIGxvY2sgaGFzIGJlZW4gYWNxdWlyZWQKLSAqLwotdWludCBicmNtc19yZXNldChzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wpCi17Ci0JQkNNTVNHKFdMX1RPX0hXKHdsKS0+d2lwaHksICJ3bCVkXG4iLCB3bC0+cHViLT51bml0KTsKLQlicmNtc19jX3Jlc2V0KHdsLT53bGMpOwotCi0JLyogZHBjIHdpbGwgbm90IGJlIHJlc2NoZWR1bGVkICovCi0Jd2wtPnJlc2NoZWQgPSAwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBUaGVzZSBhcmUgaW50ZXJydXB0IG9uL29mZiBlbnRyeSBwb2ludHMuIERpc2FibGUgaW50ZXJydXB0cwotICogZHVyaW5nIGludGVycnVwdCBzdGF0ZSB0cmFuc2l0aW9uLgotICovCi12b2lkIGJyY21zX2ludHJzb24oc3RydWN0IGJyY21zX2luZm8gKndsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlJTlRfTE9DSyh3bCwgZmxhZ3MpOwotCWJyY21zX2NfaW50cnNvbih3bC0+d2xjKTsKLQlJTlRfVU5MT0NLKHdsLCBmbGFncyk7Ci19Ci0KLS8qCi0gKiBwcmVjb25kaXRpb246IHBlcmltZXRlciBsb2NrIGhhcyBiZWVuIGFjcXVpcmVkCi0gKi8KLWJvb2wgd2xfYWxsb2NfZG1hX3Jlc291cmNlcyhzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wsIHVpbnQgYWRkcndpZHRoKQotewotCXJldHVybiB0cnVlOwotfQotCi11MzIgYnJjbXNfaW50cnNvZmYoc3RydWN0IGJyY21zX2luZm8gKndsKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIHN0YXR1czsKLQotCUlOVF9MT0NLKHdsLCBmbGFncyk7Ci0Jc3RhdHVzID0gYnJjbXNfY19pbnRyc29mZih3bC0+d2xjKTsKLQlJTlRfVU5MT0NLKHdsLCBmbGFncyk7Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotdm9pZCBicmNtc19pbnRyc3Jlc3RvcmUoc3RydWN0IGJyY21zX2luZm8gKndsLCB1MzIgbWFjaW50bWFzaykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JSU5UX0xPQ0sod2wsIGZsYWdzKTsKLQlicmNtc19jX2ludHJzcmVzdG9yZSh3bC0+d2xjLCBtYWNpbnRtYXNrKTsKLQlJTlRfVU5MT0NLKHdsLCBmbGFncyk7Ci19Ci0KLS8qCi0gKiBwcmVjb25kaXRpb246IHBlcmltZXRlciBsb2NrIGhhcyBiZWVuIGFjcXVpcmVkCi0gKi8KLWludCBicmNtc191cChzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wpCi17Ci0JaW50IGVycm9yID0gMDsKLQotCWlmICh3bC0+cHViLT51cCkKLQkJcmV0dXJuIDA7Ci0KLQllcnJvciA9IGJyY21zX2NfdXAod2wtPndsYyk7Ci0KLQlyZXR1cm4gZXJyb3I7Ci19Ci0KLS8qCi0gKiBwcmVjb25kaXRpb246IHBlcmltZXRlciBsb2NrIGhhcyBiZWVuIGFjcXVpcmVkCi0gKi8KLXZvaWQgYnJjbXNfZG93bihzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wpCi17Ci0JdWludCBjYWxsYmFja3MsIHJldF92YWwgPSAwOwotCi0JLyogY2FsbCBjb21tb24gZG93biBmdW5jdGlvbiAqLwotCXJldF92YWwgPSBicmNtc19jX2Rvd24od2wtPndsYyk7Ci0JY2FsbGJhY2tzID0gYXRvbWljX3JlYWQoJndsLT5jYWxsYmFja3MpIC0gcmV0X3ZhbDsKLQotCS8qIHdhaXQgZm9yIGRvd24gY2FsbGJhY2tzIHRvIGNvbXBsZXRlICovCi0JVU5MT0NLKHdsKTsKLQotCS8qIEZvciBISUdIX29ubHkgZHJpdmVyLCBpdCdzIGltcG9ydGFudCB0byBhY3R1YWxseSBzY2hlZHVsZSBvdGhlciB3b3JrLAotCSAqIG5vdCBqdXN0IHNwaW4gd2FpdCBzaW5jZSBldmVyeXRoaW5nIHJ1bnMgYXQgc2NoZWR1bGUgbGV2ZWwKLQkgKi8KLQlTUElOV0FJVCgoYXRvbWljX3JlYWQoJndsLT5jYWxsYmFja3MpID4gY2FsbGJhY2tzKSwgMTAwICogMTAwMCk7Ci0KLQlMT0NLKHdsKTsKLX0KLQotc3RhdGljIGlycXJldHVybl90IGJyY21zX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IGJyY21zX2luZm8gKndsOwotCWJvb2wgb3Vycywgd2FudGRwYzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jd2wgPSAoc3RydWN0IGJyY21zX2luZm8gKikgZGV2X2lkOwotCi0JSVNSX0xPQ0sod2wsIGZsYWdzKTsKLQotCS8qIGNhbGwgY29tbW9uIGZpcnN0IGxldmVsIGludGVycnVwdCBoYW5kbGVyICovCi0Jb3VycyA9IGJyY21zX2NfaXNyKHdsLT53bGMsICZ3YW50ZHBjKTsKLQlpZiAob3VycykgewotCQkvKiBpZiBtb3JlIHRvIGRvLi4uICovCi0JCWlmICh3YW50ZHBjKSB7Ci0KLQkJCS8qIC4uLmFuZCBjYWxsIHRoZSBzZWNvbmQgbGV2ZWwgaW50ZXJydXB0IGhhbmRsZXIgKi8KLQkJCS8qIHNjaGVkdWxlIGRwYyAqLwotCQkJdGFza2xldF9zY2hlZHVsZSgmd2wtPnRhc2tsZXQpOwotCQl9Ci0JfQotCi0JSVNSX1VOTE9DSyh3bCwgZmxhZ3MpOwotCi0JcmV0dXJuIElSUV9SRVRWQUwob3Vycyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21zX2RwYyh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IGJyY21zX2luZm8gKndsOwotCi0Jd2wgPSAoc3RydWN0IGJyY21zX2luZm8gKikgZGF0YTsKLQotCUxPQ0sod2wpOwotCi0JLyogY2FsbCB0aGUgY29tbW9uIHNlY29uZCBsZXZlbCBpbnRlcnJ1cHQgaGFuZGxlciAqLwotCWlmICh3bC0+cHViLT51cCkgewotCQlpZiAod2wtPnJlc2NoZWQpIHsKLQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkJCUlOVF9MT0NLKHdsLCBmbGFncyk7Ci0JCQlicmNtc19jX2ludHJzdXBkKHdsLT53bGMpOwotCQkJSU5UX1VOTE9DSyh3bCwgZmxhZ3MpOwotCQl9Ci0KLQkJd2wtPnJlc2NoZWQgPSBicmNtc19jX2RwYyh3bC0+d2xjLCB0cnVlKTsKLQl9Ci0KLQkvKiBicmNtc19jX2RwYygpIG1heSBicmluZyB0aGUgZHJpdmVyIGRvd24gKi8KLQlpZiAoIXdsLT5wdWItPnVwKQotCQlnb3RvIGRvbmU7Ci0KLQkvKiByZS1zY2hlZHVsZSBkcGMgKi8KLQlpZiAod2wtPnJlc2NoZWQpCi0JCXRhc2tsZXRfc2NoZWR1bGUoJndsLT50YXNrbGV0KTsKLQllbHNlIHsKLQkJLyogcmUtZW5hYmxlIGludGVycnVwdHMgKi8KLQkJYnJjbXNfaW50cnNvbih3bCk7Ci0JfQotCi0gZG9uZToKLQlVTkxPQ0sod2wpOwotfQotCi0vKgotICogaXMgY2FsbGVkIGJ5IHRoZSBrZXJuZWwgZnJvbSBzb2Z0d2FyZSBpcnEgY29udGV4dAotICovCi1zdGF0aWMgdm9pZCBicmNtc190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JX2JyY21zX3RpbWVyKChzdHJ1Y3QgYnJjbXNfdGltZXIgKikgZGF0YSk7Ci19Ci0KLS8qCi0qIHByZWNvbmRpdGlvbjogcGVyaW1ldGVyIGxvY2sgaXMgbm90IGFjcXVpcmVkCi0gKi8KLXN0YXRpYyB2b2lkIF9icmNtc190aW1lcihzdHJ1Y3QgYnJjbXNfdGltZXIgKnQpCi17Ci0JTE9DSyh0LT53bCk7Ci0KLQlpZiAodC0+c2V0KSB7Ci0JCWlmICh0LT5wZXJpb2RpYykgewotCQkJdC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyB0LT5tcyAqIEhaIC8gMTAwMDsKLQkJCWF0b21pY19pbmMoJnQtPndsLT5jYWxsYmFja3MpOwotCQkJYWRkX3RpbWVyKCZ0LT50aW1lcik7Ci0JCQl0LT5zZXQgPSB0cnVlOwotCQl9IGVsc2UKLQkJCXQtPnNldCA9IGZhbHNlOwotCi0JCXQtPmZuKHQtPmFyZyk7Ci0JfQotCi0JYXRvbWljX2RlYygmdC0+d2wtPmNhbGxiYWNrcyk7Ci0KLQlVTkxPQ0sodC0+d2wpOwotfQotCi0vKgotICogQWRkcyBhIHRpbWVyIHRvIHRoZSBsaXN0LiBDYWxsZXIgc3VwcGxpZXMgYSB0aW1lciBmdW5jdGlvbi4KLSAqIElzIGNhbGxlZCBmcm9tIHdsYy4KLSAqCi0gKiBwcmVjb25kaXRpb246IHBlcmltZXRlciBsb2NrIGhhcyBiZWVuIGFjcXVpcmVkCi0gKi8KLXN0cnVjdCBicmNtc190aW1lciAqYnJjbXNfaW5pdF90aW1lcihzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wsCi0JCQkJICAgICB2b2lkICgqZm4pICh2b2lkICphcmcpLAotCQkJCSAgICAgdm9pZCAqYXJnLCBjb25zdCBjaGFyICpuYW1lKQotewotCXN0cnVjdCBicmNtc190aW1lciAqdDsKLQotCXQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnJjbXNfdGltZXIpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXQpIHsKLQkJd2lwaHlfZXJyKHdsLT53aXBoeSwgIndsJWQ6IGJyY21zX2luaXRfdGltZXI6IG91dCBvZiBtZW1vcnlcbiIsCi0JCQkgIHdsLT5wdWItPnVuaXQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpbml0X3RpbWVyKCZ0LT50aW1lcik7Ci0JdC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSB0OwotCXQtPnRpbWVyLmZ1bmN0aW9uID0gYnJjbXNfdGltZXI7Ci0JdC0+d2wgPSB3bDsKLQl0LT5mbiA9IGZuOwotCXQtPmFyZyA9IGFyZzsKLQl0LT5uZXh0ID0gd2wtPnRpbWVyczsKLQl3bC0+dGltZXJzID0gdDsKLQotI2lmZGVmIEJDTURCRwotCXQtPm5hbWUgPSBrbWFsbG9jKHN0cmxlbihuYW1lKSArIDEsIEdGUF9BVE9NSUMpOwotCWlmICh0LT5uYW1lKQotCQlzdHJjcHkodC0+bmFtZSwgbmFtZSk7Ci0jZW5kaWYKLQotCXJldHVybiB0OwotfQotCi0vKiBCTUFDX05PVEU6IEFkZCB0aW1lciBhZGRzIG9ubHkgdGhlIGtlcm5lbCB0aW1lciBzaW5jZSBpdCdzIGdvaW5nIHRvIGJlIG1vcmUgYWNjdXJhdGUKLSAqIGFzIHdlbGwgYXMgaXQncyBlYXNpZXIgdG8gbWFrZSBpdCBwZXJpb2RpYwotICoKLSAqIHByZWNvbmRpdGlvbjogcGVyaW1ldGVyIGxvY2sgaGFzIGJlZW4gYWNxdWlyZWQKLSAqLwotdm9pZCBicmNtc19hZGRfdGltZXIoc3RydWN0IGJyY21zX2luZm8gKndsLCBzdHJ1Y3QgYnJjbXNfdGltZXIgKnQsIHVpbnQgbXMsCi0JCSAgICAgaW50IHBlcmlvZGljKQotewotI2lmZGVmIEJDTURCRwotCWlmICh0LT5zZXQpIHsKLQkJd2lwaHlfZXJyKHdsLT53aXBoeSwgIiVzOiBBbHJlYWR5IHNldC4gTmFtZTogJXMsIHBlciAlZFxuIiwKLQkJCSAgX19mdW5jX18sIHQtPm5hbWUsIHBlcmlvZGljKTsKLQl9Ci0jZW5kaWYKLQl0LT5tcyA9IG1zOwotCXQtPnBlcmlvZGljID0gKGJvb2wpIHBlcmlvZGljOwotCXQtPnNldCA9IHRydWU7Ci0JdC0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtcyAqIEhaIC8gMTAwMDsKLQotCWF0b21pY19pbmMoJndsLT5jYWxsYmFja3MpOwotCWFkZF90aW1lcigmdC0+dGltZXIpOwotfQotCi0vKgotICogcmV0dXJuIHRydWUgaWYgdGltZXIgc3VjY2Vzc2Z1bGx5IGRlbGV0ZWQsIGZhbHNlIGlmIHN0aWxsIHBlbmRpbmcKLSAqCi0gKiBwcmVjb25kaXRpb246IHBlcmltZXRlciBsb2NrIGhhcyBiZWVuIGFjcXVpcmVkCi0gKi8KLWJvb2wgYnJjbXNfZGVsX3RpbWVyKHN0cnVjdCBicmNtc19pbmZvICp3bCwgc3RydWN0IGJyY21zX3RpbWVyICp0KQotewotCWlmICh0LT5zZXQpIHsKLQkJdC0+c2V0ID0gZmFsc2U7Ci0JCWlmICghZGVsX3RpbWVyKCZ0LT50aW1lcikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlhdG9taWNfZGVjKCZ3bC0+Y2FsbGJhY2tzKTsKLQl9Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotLyoKLSAqIHByZWNvbmRpdGlvbjogcGVyaW1ldGVyIGxvY2sgaGFzIGJlZW4gYWNxdWlyZWQKLSAqLwotdm9pZCBicmNtc19mcmVlX3RpbWVyKHN0cnVjdCBicmNtc19pbmZvICp3bCwgc3RydWN0IGJyY21zX3RpbWVyICp0KQotewotCXN0cnVjdCBicmNtc190aW1lciAqdG1wOwotCi0JLyogZGVsZXRlIHRoZSB0aW1lciBpbiBjYXNlIGl0IGlzIGFjdGl2ZSAqLwotCWJyY21zX2RlbF90aW1lcih3bCwgdCk7Ci0KLQlpZiAod2wtPnRpbWVycyA9PSB0KSB7Ci0JCXdsLT50aW1lcnMgPSB3bC0+dGltZXJzLT5uZXh0OwotI2lmZGVmIEJDTURCRwotCQlrZnJlZSh0LT5uYW1lKTsKLSNlbmRpZgotCQlrZnJlZSh0KTsKLQkJcmV0dXJuOwotCi0JfQotCi0JdG1wID0gd2wtPnRpbWVyczsKLQl3aGlsZSAodG1wKSB7Ci0JCWlmICh0bXAtPm5leHQgPT0gdCkgewotCQkJdG1wLT5uZXh0ID0gdC0+bmV4dDsKLSNpZmRlZiBCQ01EQkcKLQkJCWtmcmVlKHQtPm5hbWUpOwotI2VuZGlmCi0JCQlrZnJlZSh0KTsKLQkJCXJldHVybjsKLQkJfQotCQl0bXAgPSB0bXAtPm5leHQ7Ci0JfQotCi19Ci0KLS8qCi0gKiBydW5zIGluIHNvZnR3YXJlIGlycSBjb250ZXh0Ci0gKgotICogcHJlY29uZGl0aW9uOiBwZXJpbWV0ZXIgbG9jayBpcyBub3QgYWNxdWlyZWQKLSAqLwotc3RhdGljIGludCB3bF9saW51eF93YXRjaGRvZyh2b2lkICpjdHgpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBmaXJtd2FyZV9oZHIgewotCXUzMiBvZmZzZXQ7Ci0JdTMyIGxlbjsKLQl1MzIgaWR4OwotfTsKLQotY2hhciAqYnJjbXNfZmlybXdhcmVzW01BWF9GV19JTUFHRVNdID0gewotCSJicmNtL2JjbTQzeHgiLAotCU5VTEwKLX07Ci0KLS8qCi0gKiBwcmVjb25kaXRpb246IHBlcmltZXRlciBsb2NrIGhhcyBiZWVuIGFjcXVpcmVkCi0gKi8KLWludCBicmNtc191Y29kZV9pbml0X2J1ZihzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wsIHZvaWQgKipwYnVmLCB1MzIgaWR4KQotewotCWludCBpLCBlbnRyeTsKLQljb25zdCB1OCAqcGRhdGE7Ci0Jc3RydWN0IGZpcm13YXJlX2hkciAqaGRyOwotCWZvciAoaSA9IDA7IGkgPCB3bC0+ZncuZndfY250OyBpKyspIHsKLQkJaGRyID0gKHN0cnVjdCBmaXJtd2FyZV9oZHIgKil3bC0+ZncuZndfaGRyW2ldLT5kYXRhOwotCQlmb3IgKGVudHJ5ID0gMDsgZW50cnkgPCB3bC0+ZncuaGRyX251bV9lbnRyaWVzW2ldOwotCQkgICAgIGVudHJ5KyssIGhkcisrKSB7Ci0JCQlpZiAoaGRyLT5pZHggPT0gaWR4KSB7Ci0JCQkJcGRhdGEgPSB3bC0+ZncuZndfYmluW2ldLT5kYXRhICsgaGRyLT5vZmZzZXQ7Ci0JCQkJKnBidWYgPSBrbWFsbG9jKGhkci0+bGVuLCBHRlBfQVRPTUlDKTsKLQkJCQlpZiAoKnBidWYgPT0gTlVMTCkgewotCQkJCQl3aXBoeV9lcnIod2wtPndpcGh5LCAiZmFpbCB0byBhbGxvYyAlZCIKLQkJCQkJCSAgIiBieXRlc1xuIiwgaGRyLT5sZW4pOwotCQkJCQlnb3RvIGZhaWw7Ci0JCQkJfQotCQkJCW1lbWNweSgqcGJ1ZiwgcGRhdGEsIGhkci0+bGVuKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJfQotCX0KLQl3aXBoeV9lcnIod2wtPndpcGh5LCAiRVJST1I6IHVjb2RlIGJ1ZiB0YWc6JWQgY2FuIG5vdCBiZSBmb3VuZCFcbiIsCi0JCSAgaWR4KTsKLQkqcGJ1ZiA9IE5VTEw7Ci1mYWlsOgotCXJldHVybiAtRU5PREFUQTsKLX0KLQotLyoKLSAqIFByZWNvbmRpdGlvbjogU2luY2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gYnJjbXNfcGNpX3Byb2JlKCkgY29udGV4dCwKLSAqIG5vIGxvY2tpbmcgaXMgcmVxdWlyZWQuCi0gKi8KLWludCBicmNtc191Y29kZV9pbml0X3VpbnQoc3RydWN0IGJyY21zX2luZm8gKndsLCB1MzIgKmRhdGEsIHUzMiBpZHgpCi17Ci0JaW50IGksIGVudHJ5OwotCWNvbnN0IHU4ICpwZGF0YTsKLQlzdHJ1Y3QgZmlybXdhcmVfaGRyICpoZHI7Ci0JZm9yIChpID0gMDsgaSA8IHdsLT5mdy5md19jbnQ7IGkrKykgewotCQloZHIgPSAoc3RydWN0IGZpcm13YXJlX2hkciAqKXdsLT5mdy5md19oZHJbaV0tPmRhdGE7Ci0JCWZvciAoZW50cnkgPSAwOyBlbnRyeSA8IHdsLT5mdy5oZHJfbnVtX2VudHJpZXNbaV07Ci0JCSAgICAgZW50cnkrKywgaGRyKyspIHsKLQkJCWlmIChoZHItPmlkeCA9PSBpZHgpIHsKLQkJCQlwZGF0YSA9IHdsLT5mdy5md19iaW5baV0tPmRhdGEgKyBoZHItPm9mZnNldDsKLQkJCQlpZiAoaGRyLT5sZW4gIT0gNCkgewotCQkJCQl3aXBoeV9lcnIod2wtPndpcGh5LAotCQkJCQkJICAiRVJST1I6IGZ3IGhkciBsZW5cbiIpOwotCQkJCQlyZXR1cm4gLUVOT01TRzsKLQkJCQl9Ci0JCQkJKmRhdGEgPSAqKCh1MzIgKikgcGRhdGEpOwotCQkJCXJldHVybiAwOwotCQkJfQotCQl9Ci0JfQotCXdpcGh5X2Vycih3bC0+d2lwaHksICJFUlJPUjogdWNvZGUgdGFnOiVkIGNhbiBub3QgYmUgZm91bmQhXG4iLCBpZHgpOwotCXJldHVybiAtRU5PTVNHOwotfQotCi0vKgotICogUHJlY29uZGl0aW9uOiBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBicmNtc19wY2lfcHJvYmUoKSBjb250ZXh0LAotICogbm8gbG9ja2luZyBpcyByZXF1aXJlZC4KLSAqLwotc3RhdGljIGludCBicmNtc19yZXF1ZXN0X2Z3KHN0cnVjdCBicmNtc19pbmZvICp3bCwgc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0JaW50IHN0YXR1czsKLQlzdHJ1Y3QgZGV2aWNlICpkZXZpY2UgPSAmcGRldi0+ZGV2OwotCWNoYXIgZndfbmFtZVsxMDBdOwotCWludCBpOwotCi0JbWVtc2V0KCh2b2lkICopJndsLT5mdywgMCwgc2l6ZW9mKHN0cnVjdCBicmNtc19maXJtd2FyZSkpOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfRldfSU1BR0VTOyBpKyspIHsKLQkJaWYgKGJyY21zX2Zpcm13YXJlc1tpXSA9PSBOVUxMKQotCQkJYnJlYWs7Ci0JCXNwcmludGYoZndfbmFtZSwgIiVzLSVkLmZ3IiwgYnJjbXNfZmlybXdhcmVzW2ldLAotCQkJVUNPREVfTE9BREVSX0FQSV9WRVIpOwotCQlzdGF0dXMgPSByZXF1ZXN0X2Zpcm13YXJlKCZ3bC0+ZncuZndfYmluW2ldLCBmd19uYW1lLCBkZXZpY2UpOwotCQlpZiAoc3RhdHVzKSB7Ci0JCQl3aXBoeV9lcnIod2wtPndpcGh5LCAiJXM6IGZhaWwgdG8gbG9hZCBmaXJtd2FyZSAlc1xuIiwKLQkJCQkgIEtCVUlMRF9NT0ROQU1FLCBmd19uYW1lKTsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJc3ByaW50Zihmd19uYW1lLCAiJXNfaGRyLSVkLmZ3IiwgYnJjbXNfZmlybXdhcmVzW2ldLAotCQkJVUNPREVfTE9BREVSX0FQSV9WRVIpOwotCQlzdGF0dXMgPSByZXF1ZXN0X2Zpcm13YXJlKCZ3bC0+ZncuZndfaGRyW2ldLCBmd19uYW1lLCBkZXZpY2UpOwotCQlpZiAoc3RhdHVzKSB7Ci0JCQl3aXBoeV9lcnIod2wtPndpcGh5LCAiJXM6IGZhaWwgdG8gbG9hZCBmaXJtd2FyZSAlc1xuIiwKLQkJCQkgIEtCVUlMRF9NT0ROQU1FLCBmd19uYW1lKTsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJd2wtPmZ3Lmhkcl9udW1fZW50cmllc1tpXSA9Ci0JCSAgICB3bC0+ZncuZndfaGRyW2ldLT5zaXplIC8gKHNpemVvZihzdHJ1Y3QgZmlybXdhcmVfaGRyKSk7Ci0JfQotCXdsLT5mdy5md19jbnQgPSBpOwotCXJldHVybiBicmNtc191Y29kZV9kYXRhX2luaXQod2wpOwotfQotCi0vKgotICogcHJlY29uZGl0aW9uOiBjYW4gYm90aCBiZSBjYWxsZWQgbG9ja2VkIGFuZCB1bmxvY2tlZAotICovCi12b2lkIGJyY21zX3Vjb2RlX2ZyZWVfYnVmKHZvaWQgKnApCi17Ci0Ja2ZyZWUocCk7Ci19Ci0KLS8qCi0gKiBQcmVjb25kaXRpb246IFNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIGJyY21zX3BjaV9wcm9iZSgpIGNvbnRleHQsCi0gKiBubyBsb2NraW5nIGlzIHJlcXVpcmVkLgotICovCi1zdGF0aWMgdm9pZCBicmNtc19yZWxlYXNlX2Z3KHN0cnVjdCBicmNtc19pbmZvICp3bCkKLXsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0ZXX0lNQUdFUzsgaSsrKSB7Ci0JCXJlbGVhc2VfZmlybXdhcmUod2wtPmZ3LmZ3X2JpbltpXSk7Ci0JCXJlbGVhc2VfZmlybXdhcmUod2wtPmZ3LmZ3X2hkcltpXSk7Ci0JfQotfQotCi0KLS8qCi0gKiBjaGVja3MgdmFsaWRpdHkgb2YgYWxsIGZpcm13YXJlIGltYWdlcyBsb2FkZWQgZnJvbSB1c2VyIHNwYWNlCi0gKgotICogUHJlY29uZGl0aW9uOiBTaW5jZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBicmNtc19wY2lfcHJvYmUoKSBjb250ZXh0LAotICogbm8gbG9ja2luZyBpcyByZXF1aXJlZC4KLSAqLwotaW50IGJyY21zX2NoZWNrX2Zpcm13YXJlcyhzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wpCi17Ci0JaW50IGk7Ci0JaW50IGVudHJ5OwotCWludCByYyA9IDA7Ci0JY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2hkcjsKLQlzdHJ1Y3QgZmlybXdhcmVfaGRyICp1Y29kZV9oZHI7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9GV19JTUFHRVMgJiYgcmMgPT0gMDsgaSsrKSB7Ci0JCWZ3ID0gIHdsLT5mdy5md19iaW5baV07Ci0JCWZ3X2hkciA9IHdsLT5mdy5md19oZHJbaV07Ci0JCWlmIChmdyA9PSBOVUxMICYmIGZ3X2hkciA9PSBOVUxMKSB7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmIChmdyA9PSBOVUxMIHx8IGZ3X2hkciA9PSBOVUxMKSB7Ci0JCQl3aXBoeV9lcnIod2wtPndpcGh5LCAiJXM6IGludmFsaWQgYmluL2hkciBmd1xuIiwKLQkJCQkgIF9fZnVuY19fKTsKLQkJCXJjID0gLUVCQURGOwotCQl9IGVsc2UgaWYgKGZ3X2hkci0+c2l6ZSAlIHNpemVvZihzdHJ1Y3QgZmlybXdhcmVfaGRyKSkgewotCQkJd2lwaHlfZXJyKHdsLT53aXBoeSwgIiVzOiBub24gaW50ZWdyYWwgZncgaGRyIGZpbGUgIgotCQkJCSJzaXplICV6dS8lenVcbiIsIF9fZnVuY19fLCBmd19oZHItPnNpemUsCi0JCQkJc2l6ZW9mKHN0cnVjdCBmaXJtd2FyZV9oZHIpKTsKLQkJCXJjID0gLUVCQURGOwotCQl9IGVsc2UgaWYgKGZ3LT5zaXplIDwgTUlOX0ZXX1NJWkUgfHwgZnctPnNpemUgPiBNQVhfRldfU0laRSkgewotCQkJd2lwaHlfZXJyKHdsLT53aXBoeSwgIiVzOiBvdXQgb2YgYm91bmRzIGZ3IGZpbGUgc2l6ZSAiCi0JCQkJICAiJXp1XG4iLCBfX2Z1bmNfXywgZnctPnNpemUpOwotCQkJcmMgPSAtRUJBREY7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBjaGVjayBpZiB1Y29kZSBzZWN0aW9uIG92ZXJydW5zIGZpcm13YXJlIGltYWdlICovCi0JCQl1Y29kZV9oZHIgPSAoc3RydWN0IGZpcm13YXJlX2hkciAqKWZ3X2hkci0+ZGF0YTsKLQkJCWZvciAoZW50cnkgPSAwOyBlbnRyeSA8IHdsLT5mdy5oZHJfbnVtX2VudHJpZXNbaV0gJiYKLQkJCSAgICAgIXJjOyBlbnRyeSsrLCB1Y29kZV9oZHIrKykgewotCQkJCWlmICh1Y29kZV9oZHItPm9mZnNldCArIHVjb2RlX2hkci0+bGVuID4KLQkJCQkgICAgZnctPnNpemUpIHsKLQkJCQkJd2lwaHlfZXJyKHdsLT53aXBoeSwKLQkJCQkJCSAgIiVzOiBjb25mbGljdGluZyBiaW4vaGRyXG4iLAotCQkJCQkJICBfX2Z1bmNfXyk7Ci0JCQkJCXJjID0gLUVCQURGOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlpZiAocmMgPT0gMCAmJiB3bC0+ZncuZndfY250ICE9IGkpIHsKLQkJd2lwaHlfZXJyKHdsLT53aXBoeSwgIiVzOiBpbnZhbGlkIGZ3X2NudD0lZFxuIiwgX19mdW5jX18sCi0JCQl3bC0+ZncuZndfY250KTsKLQkJcmMgPSAtRUJBREY7Ci0JfQotCXJldHVybiByYzsKLX0KLQotLyoKLSAqIHByZWNvbmRpdGlvbjogcGVyaW1ldGVyIGxvY2sgaGFzIGJlZW4gYWNxdWlyZWQKLSAqLwotYm9vbCBicmNtc19yZmtpbGxfc2V0X2h3X3N0YXRlKHN0cnVjdCBicmNtc19pbmZvICp3bCkKLXsKLQlib29sIGJsb2NrZWQgPSBicmNtc19jX2NoZWNrX3JhZGlvX2Rpc2FibGVkKHdsLT53bGMpOwotCi0JVU5MT0NLKHdsKTsKLQl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKHdsLT5wdWItPmllZWVfaHctPndpcGh5LCBibG9ja2VkKTsKLQlpZiAoYmxvY2tlZCkKLQkJd2lwaHlfcmZraWxsX3N0YXJ0X3BvbGxpbmcod2wtPnB1Yi0+aWVlZV9ody0+d2lwaHkpOwotCUxPQ0sod2wpOwotCXJldHVybiBibG9ja2VkOwotfQotCi0vKgotICogcHJlY29uZGl0aW9uOiBwZXJpbWV0ZXIgbG9jayBoYXMgYmVlbiBhY3F1aXJlZAotICovCi12b2lkIGJyY21zX21zbGVlcChzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wsIHVpbnQgbXMpCi17Ci0JVU5MT0NLKHdsKTsKLQltc2xlZXAobXMpOwotCUxPQ0sod2wpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9tYWM4MDIxMV9pZi5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9tYWM4MDIxMV9pZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGUzZDM3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvbWFjODAyMTFfaWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfQlJDTV9NQUM4MDIxMV9JRl9IXwotI2RlZmluZSBfQlJDTV9NQUM4MDIxMV9JRl9IXwotCi0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLQotLyogc29mdG1hYyBpb2N0bCBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBCUkNNU19TRVRfU0hPUlRTTE9UX09WRVJSSURFCQkxNDYKLQotCi0vKiBCTUFDIE5vdGU6IEhpZ2gtb25seSBkcml2ZXIgaXMgbm8gbG9uZ2VyIHdvcmtpbmcgaW4gc29mdGlycSBjb250ZXh0IGFzIGl0IG5lZWRzIHRvIGJsb2NrIGFuZAotICogc2xlZXAgc28gcGVyaW1ldGVyIGxvY2sgaGFzIHRvIGJlIGEgc2VtYXBob3JlIGluc3RlYWQgb2Ygc3BpbmxvY2suIFRoaXMgcmVxdWlyZXMgdGltZXJzIHRvIGJlCi0gKiBzdWJtaXR0ZWQgdG8gd29ya3F1ZXVlIGluc3RlYWQgb2YgYmVpbmcgb24ga2VybmVsIHRpbWVyCi0gKi8KLXN0cnVjdCBicmNtc190aW1lciB7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7Ci0Jc3RydWN0IGJyY21zX2luZm8gKndsOwotCXZvaWQgKCpmbikgKHZvaWQgKik7Ci0Jdm9pZCAqYXJnOwkJLyogYXJndW1lbnQgdG8gZm4gKi8KLQl1aW50IG1zOwotCWJvb2wgcGVyaW9kaWM7Ci0JYm9vbCBzZXQ7Ci0Jc3RydWN0IGJyY21zX3RpbWVyICpuZXh0OwotI2lmZGVmIEJDTURCRwotCWNoYXIgKm5hbWU7CQkvKiBEZXNjcmlwdGlvbiBvZiB0aGUgdGltZXIgKi8KLSNlbmRpZgotfTsKLQotc3RydWN0IGJyY21zX2lmIHsKLQl1aW50IHN1YnVuaXQ7CQkvKiBXRFMvQlNTIHVuaXQgKi8KLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKLX07Ci0KLSNkZWZpbmUgTUFYX0ZXX0lNQUdFUwkJNAotc3RydWN0IGJyY21zX2Zpcm13YXJlIHsKLQl1MzIgZndfY250OwotCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfYmluW01BWF9GV19JTUFHRVNdOwotCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfaGRyW01BWF9GV19JTUFHRVNdOwotCXUzMiBoZHJfbnVtX2VudHJpZXNbTUFYX0ZXX0lNQUdFU107Ci19OwotCi1zdHJ1Y3QgYnJjbXNfaW5mbyB7Ci0Jc3RydWN0IGJyY21zX3B1YiAqcHViOwkJLyogcG9pbnRlciB0byBwdWJsaWMgd2xjIHN0YXRlICovCi0Jdm9pZCAqd2xjOwkJLyogcG9pbnRlciB0byBwcml2YXRlIGNvbW1vbiBvcy1pbmRlcGVuZGVudCBkYXRhICovCi0JdTMyIG1hZ2ljOwotCi0JaW50IGlycTsKLQotCXNwaW5sb2NrX3QgbG9jazsJLyogcGVyLWRldmljZSBwZXJpbWV0ZXIgbG9jayAqLwotCXNwaW5sb2NrX3QgaXNyX2xvY2s7CS8qIHBlci1kZXZpY2UgSVNSIHN5bmNocm9uaXphdGlvbiBsb2NrICovCi0KLQkvKiBidXMgdHlwZSBhbmQgcmVnc3ZhIGZvciB1bm1hcCBpbiBicmNtc19mcmVlKCkgKi8KLQl1aW50IGJjbV9idXN0eXBlOwkvKiBidXMgdHlwZSAqLwotCXZvaWQgKnJlZ3N2YTsJCS8qIG9wYXF1ZSBjaGlwIHJlZ2lzdGVycyB2aXJ0dWFsIGFkZHJlc3MgKi8KLQotCS8qIHRpbWVyIHJlbGF0ZWQgZmllbGRzICovCi0JYXRvbWljX3QgY2FsbGJhY2tzOwkvKiAjIG91dHN0YW5kaW5nIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLwotCXN0cnVjdCBicmNtc190aW1lciAqdGltZXJzOwkvKiB0aW1lciBjbGVhbnVwIHF1ZXVlICovCi0KLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGFza2xldDsJLyogZHBjIHRhc2tsZXQgKi8KLQlib29sIHJlc2NoZWQ7CQkvKiBkcGMgbmVlZHMgdG8gYmUgYW5kIGlzIHJlc2NoZWR1bGVkICovCi0jaWZkZWYgTElOVVhTVEFfUFMKLQl1MzIgcGNpX3Bzc3RhdGVbMTZdOwkvKiBwY2kgcHMtc3RhdGUgc2F2ZS9yZXN0b3JlICovCi0jZW5kaWYKLQlzdHJ1Y3QgYnJjbXNfZmlybXdhcmUgZnc7Ci0Jc3RydWN0IHdpcGh5ICp3aXBoeTsKLX07Ci0KLS8qIG1pc2MgY2FsbGJhY2tzICovCi1leHRlcm4gdm9pZCBicmNtc19pbml0KHN0cnVjdCBicmNtc19pbmZvICp3bCk7Ci1leHRlcm4gdWludCBicmNtc19yZXNldChzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wpOwotZXh0ZXJuIHZvaWQgYnJjbXNfaW50cnNvbihzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wpOwotZXh0ZXJuIHUzMiBicmNtc19pbnRyc29mZihzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wpOwotZXh0ZXJuIHZvaWQgYnJjbXNfaW50cnNyZXN0b3JlKHN0cnVjdCBicmNtc19pbmZvICp3bCwgdTMyIG1hY2ludG1hc2spOwotZXh0ZXJuIGludCBicmNtc191cChzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wpOwotZXh0ZXJuIHZvaWQgYnJjbXNfZG93bihzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wpOwotZXh0ZXJuIHZvaWQgYnJjbXNfdHhmbG93Y29udHJvbChzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wsIHN0cnVjdCBicmNtc19pZiAqd2xpZiwKLQkJCQlib29sIHN0YXRlLCBpbnQgcHJpbyk7Ci1leHRlcm4gYm9vbCB3bF9hbGxvY19kbWFfcmVzb3VyY2VzKHN0cnVjdCBicmNtc19pbmZvICp3bCwgdWludCBkbWFkZHJ3aWR0aCk7Ci1leHRlcm4gYm9vbCBicmNtc19yZmtpbGxfc2V0X2h3X3N0YXRlKHN0cnVjdCBicmNtc19pbmZvICp3bCk7Ci0KLS8qIHRpbWVyIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHN0cnVjdCBicmNtc190aW1lciAqYnJjbXNfaW5pdF90aW1lcihzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wsCi0JCQkJICAgICAgdm9pZCAoKmZuKSAodm9pZCAqYXJnKSwgdm9pZCAqYXJnLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOwotZXh0ZXJuIHZvaWQgYnJjbXNfZnJlZV90aW1lcihzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wsIHN0cnVjdCBicmNtc190aW1lciAqdGltZXIpOwotZXh0ZXJuIHZvaWQgYnJjbXNfYWRkX3RpbWVyKHN0cnVjdCBicmNtc19pbmZvICp3bCwgc3RydWN0IGJyY21zX3RpbWVyICp0aW1lciwKLQkJCSAgICB1aW50IG1zLCBpbnQgcGVyaW9kaWMpOwotZXh0ZXJuIGJvb2wgYnJjbXNfZGVsX3RpbWVyKHN0cnVjdCBicmNtc19pbmZvICp3bCwgc3RydWN0IGJyY21zX3RpbWVyICp0aW1lcik7Ci1leHRlcm4gdm9pZCBicmNtc19tc2xlZXAoc3RydWN0IGJyY21zX2luZm8gKndsLCB1aW50IG1zKTsKLQotI2VuZGlmCQkJCS8qIF9CUkNNX01BQzgwMjExX0lGX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvbWFpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzYzYzQ1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvbWFpbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgPGJyY21faHdfaWRzLmg+Ci0jaW5jbHVkZSA8YWl1dGlscy5oPgotI2luY2x1ZGUgInJhdGUuaCIKLSNpbmNsdWRlICJzY2IuaCIKLSNpbmNsdWRlICJwaHkvcGh5X2hhbC5oIgotI2luY2x1ZGUgImNoYW5uZWwuaCIKLSNpbmNsdWRlICJibWFjLmgiCi0jaW5jbHVkZSAiYW50c2VsLmgiCi0jaW5jbHVkZSAic3RmLmgiCi0jaW5jbHVkZSAiYW1wZHUuaCIKLSNpbmNsdWRlICJhbGxvYy5oIgotI2luY2x1ZGUgIm1hYzgwMjExX2lmLmgiCi0jaW5jbHVkZSAibWFpbi5oIgotCi0vKgotICogV1BBKDIpIGRlZmluaXRpb25zCi0gKi8KLSNkZWZpbmUgUlNOX0NBUF80X1JFUExBWV9DTlRSUwkJMgotI2RlZmluZSBSU05fQ0FQXzE2X1JFUExBWV9DTlRSUwkJMwotCi0jZGVmaW5lIFdQQV9DQVBfNF9SRVBMQVlfQ05UUlMJCVJTTl9DQVBfNF9SRVBMQVlfQ05UUlMKLSNkZWZpbmUgV1BBX0NBUF8xNl9SRVBMQVlfQ05UUlMJCVJTTl9DQVBfMTZfUkVQTEFZX0NOVFJTCi0KLS8qCi0gKiBJbmRpY2F0aW9uIGZvciB0eGZsb3djb250cm9sIHRoYXQgYWxsIHByaW9yaXR5IGJpdHMgaW4KLSAqIFRYUV9TVE9QX0ZPUl9QUklPRkNfTUFTSyBhcmUgdG8gYmUgY29uc2lkZXJlZC4KLSAqLwotI2RlZmluZSBBTExQUklPCQktMQotCi0vKgotICogMzIgU1NJRCBjaGFycywgbWF4IG9mIDQgY2hhcnMgZm9yIGVhY2ggU1NJRCBjaGFyICJceEZGIiwgcGx1cyBOVUxMLgotICovCi0jZGVmaW5lIFNTSURfRk1UX0JVRl9MRU4JKCg0ICogSUVFRTgwMjExX01BWF9TU0lEX0xFTikgKyAxKQotCi0jZGVmaW5lCVRJTUVSX0lOVEVSVkFMX1dBVENIRE9HCTEwMDAJLyogd2F0Y2hkb2cgdGltZXIsIGluIHVuaXQgb2YgbXMgKi8KLSNkZWZpbmUJVElNRVJfSU5URVJWQUxfUkFESU9DSEsJODAwCS8qIHJhZGlvIG1vbml0b3IgdGltZXIsIGluIHVuaXQgb2YgbXMgKi8KLQotLyogTWF4IE1QQyB0aW1lb3V0LCBpbiB1bml0IG9mIHdhdGNoZG9nICovCi0jaWZuZGVmIEJSQ01TX01QQ19NQVhfREVMQVlDTlQKLSNkZWZpbmUJQlJDTVNfTVBDX01BWF9ERUxBWUNOVAkxMAotI2VuZGlmCi0KLS8qIE1pbiBNUEMgdGltZW91dCwgaW4gdW5pdCBvZiB3YXRjaGRvZyAqLwotI2RlZmluZQlCUkNNU19NUENfTUlOX0RFTEFZQ05UCTEKLSNkZWZpbmUJQlJDTVNfTVBDX1RIUkVTSE9MRAkzCS8qIE1QQyBjb3VudCB0aHJlc2hvbGQgbGV2ZWwgKi8KLQotI2RlZmluZQlCRUFDT05fSU5URVJWQUxfREVGQVVMVAkxMDAJLyogYmVhY29uIGludGVydmFsLCBpbiB1bml0IG9mIDEwMjRUVSAqLwotI2RlZmluZQlEVElNX0lOVEVSVkFMX0RFRkFVTFQJMwkvKiBEVElNIGludGVydmFsLCBpbiB1bml0IG9mIGJlYWNvbiBpbnRlcnZhbCAqLwotCi0vKiBTY2FsZSBkb3duIGRlbGF5cyB0byBhY2NvbW1vZGF0ZSBRVCBzbG93IHNwZWVkICovCi0jZGVmaW5lCUJFQUNPTl9JTlRFUlZBTF9ERUZfUVQJMjAJLyogYmVhY29uIGludGVydmFsLCBpbiB1bml0IG9mIDEwMjRUVSAqLwotI2RlZmluZQlEVElNX0lOVEVSVkFMX0RFRl9RVAkxCS8qIERUSU0gaW50ZXJ2YWwsIGluIHVuaXQgb2YgYmVhY29uIGludGVydmFsICovCi0KLSNkZWZpbmUJVEJUVF9BTElHTl9MRUVXQVlfVVMJMTAwCS8qIG1pbiBsZWV3YXkgYmVmb3JlIGZpcnN0IFRCVFQgaW4gdXMgKi8KLQotLyogU29mdHdhcmUgZmVhdHVyZSBmbGFnIGRlZmluZXMgdXNlZCBieSB3bGZlYXR1cmVmbGFnICovCi0jZGVmaW5lIFdMX1NXRkxfTk9IV1JBRElPCTB4MDAwNAotI2RlZmluZSBXTF9TV0ZMX0ZMT1dDT05UUk9MICAgICAweDAwMDgJLyogRW5hYmxlIGJhY2twcmVzc3VyZSB0byBPUyBzdGFjayAqLwotI2RlZmluZSBXTF9TV0ZMX1dMQlNTU09SVAkweDAwMTAJLyogUGVyLXBvcnQgc3VwcG9ydHMgc29ydGluZyBvZiBCU1MgKi8KLQotLyogbi1tb2RlIHN1cHBvcnQgY2FwYWJpbGl0eSAqLwotLyogMngyIGluY2x1ZGVzIGJvdGggMXgxICYgMngyIGRldmljZXMKLSAqIHJlc2VydmVkICNkZWZpbmUgMiBmb3IgZnV0dXJlIHdoZW4gd2Ugd2FudCB0byBzZXBhcmF0ZSAxeDEgJiAyeDIgYW5kCi0gKiBjb250cm9sIGl0IGluZGVwZW5kZW50bHkKLSAqLwotI2RlZmluZSBXTF8xMU5fMngyCQkJMQotI2RlZmluZSBXTF8xMU5fM3gzCQkJMwotI2RlZmluZSBXTF8xMU5fNHg0CQkJNAotCi0vKiBkZWZpbmUgMTFuIGZlYXR1cmUgZGlzYWJsZSBmbGFncyAqLwotI2RlZmluZSBXTEZFQVRVUkVfRElTQUJMRV8xMU4JCTB4MDAwMDAwMDEKLSNkZWZpbmUgV0xGRUFUVVJFX0RJU0FCTEVfMTFOX1NUQkNfVFgJMHgwMDAwMDAwMgotI2RlZmluZSBXTEZFQVRVUkVfRElTQUJMRV8xMU5fU1RCQ19SWAkweDAwMDAwMDA0Ci0jZGVmaW5lIFdMRkVBVFVSRV9ESVNBQkxFXzExTl9TR0lfVFgJMHgwMDAwMDAwOAotI2RlZmluZSBXTEZFQVRVUkVfRElTQUJMRV8xMU5fU0dJX1JYCTB4MDAwMDAwMTAKLSNkZWZpbmUgV0xGRUFUVVJFX0RJU0FCTEVfMTFOX0FNUERVX1RYCTB4MDAwMDAwMjAKLSNkZWZpbmUgV0xGRUFUVVJFX0RJU0FCTEVfMTFOX0FNUERVX1JYCTB4MDAwMDAwNDAKLSNkZWZpbmUgV0xGRUFUVVJFX0RJU0FCTEVfMTFOX0dGCTB4MDAwMDAwODAKLQotI2RlZmluZSBFRENGX0FDSV9NQVNLICAgICAgICAgICAgICAgIDB4NjAKLSNkZWZpbmUgRURDRl9BQ0lfU0hJRlQgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIEVEQ0ZfRUNXTUlOX01BU0sgICAgICAgICAgICAgMHgwZgotI2RlZmluZSBFRENGX0VDV01BWF9TSElGVCAgICAgICAgICAgIDQKLSNkZWZpbmUgRURDRl9BSUZTTl9NQVNLICAgICAgICAgICAgICAweDBmCi0jZGVmaW5lIEVEQ0ZfQUlGU05fTUFYICAgICAgICAgICAgICAgMTUKLSNkZWZpbmUgRURDRl9FQ1dNQVhfTUFTSyAgICAgICAgICAgICAweGYwCi0KLSNkZWZpbmUgRURDRl9BQ19CRV9UWE9QX1NUQSAgICAgICAgICAweDAwMDAKLSNkZWZpbmUgRURDRl9BQ19CS19UWE9QX1NUQSAgICAgICAgICAweDAwMDAKLSNkZWZpbmUgRURDRl9BQ19WT19BQ0lfU1RBICAgICAgICAgICAweDYyCi0jZGVmaW5lIEVEQ0ZfQUNfVk9fRUNXX1NUQSAgICAgICAgICAgMHgzMgotI2RlZmluZSBFRENGX0FDX1ZJX0FDSV9TVEEgICAgICAgICAgIDB4NDIKLSNkZWZpbmUgRURDRl9BQ19WSV9FQ1dfU1RBICAgICAgICAgICAweDQzCi0jZGVmaW5lIEVEQ0ZfQUNfQktfRUNXX1NUQSAgICAgICAgICAgMHhBNAotI2RlZmluZSBFRENGX0FDX1ZJX1RYT1BfU1RBICAgICAgICAgIDB4MDA1ZQotI2RlZmluZSBFRENGX0FDX1ZPX1RYT1BfU1RBICAgICAgICAgIDB4MDAyZgotI2RlZmluZSBFRENGX0FDX0JFX0FDSV9TVEEgICAgICAgICAgIDB4MDMKLSNkZWZpbmUgRURDRl9BQ19CRV9FQ1dfU1RBICAgICAgICAgICAweEE0Ci0jZGVmaW5lIEVEQ0ZfQUNfQktfQUNJX1NUQSAgICAgICAgICAgMHgyNwotI2RlZmluZSBFRENGX0FDX1ZPX1RYT1BfQVAgICAgICAgICAgIDB4MDAyZgotCi0jZGVmaW5lIEVEQ0ZfVFhPUDJVU0VDKHR4b3ApICAgICAgICAgKCh0eG9wKSA8PCA1KQotI2RlZmluZSBFRENGX0VDVzJDVyhleHApICAgICAgICAgICAgICgoMSA8PCAoZXhwKSkgLSAxKQotCi0jZGVmaW5lIEFQSFlfU1lNQk9MX1RJTUUJNAotI2RlZmluZSBBUEhZX1BSRUFNQkxFX1RJTUUJMTYKLSNkZWZpbmUgQVBIWV9TSUdOQUxfVElNRQk0Ci0jZGVmaW5lIEFQSFlfU0lGU19USU1FCQkxNgotI2RlZmluZSBBUEhZX1NFUlZJQ0VfTkJJVFMJMTYKLSNkZWZpbmUgQVBIWV9UQUlMX05CSVRTCQk2Ci0jZGVmaW5lIEJQSFlfU0lGU19USU1FCQkxMAotI2RlZmluZSBCUEhZX1BMQ1BfU0hPUlRfVElNRQk5NgotCi0jZGVmaW5lIFBSRU5fUFJFQU1CTEUJCTI0Ci0jZGVmaW5lIFBSRU5fTU1fRVhUCQkxMgotI2RlZmluZSBQUkVOX1BSRUFNQkxFX0VYVAk0Ci0KLSNkZWZpbmUgRE9UMTFfTUFDX0hEUl9MRU4JCTI0Ci0jZGVmaW5lCURPVDExX0FDS19MRU4JCTEwCi0jZGVmaW5lIERPVDExX0JBX0xFTgkJNAotI2RlZmluZSBET1QxMV9PRkRNX1NJR05BTF9FWFRFTlNJT04JNgotI2RlZmluZSBET1QxMV9NSU5fRlJBR19MRU4JCTI1NgotI2RlZmluZQlET1QxMV9SVFNfTEVOCQkxNgotI2RlZmluZQlET1QxMV9DVFNfTEVOCQkxMAotI2RlZmluZSBET1QxMV9CQV9CSVRNQVBfTEVOCQkxMjgKLSNkZWZpbmUgRE9UMTFfTUlOX0JFQUNPTl9QRVJJT0QJCTEKLSNkZWZpbmUgRE9UMTFfTUFYX0JFQUNPTl9QRVJJT0QJCTB4RkZGRgotI2RlZmluZQlET1QxMV9NQVhOVU1GUkFHUwkxNgotI2RlZmluZSBET1QxMV9NQVhfRlJBR19MRU4JCTIzNDYKLQotI2RlZmluZSBCUEhZX1BMQ1BfVElNRQkJMTkyCi0jZGVmaW5lIFJJRlNfMTFOX1RJTUUJCTIKLQotI2RlZmluZSBXTUVfVkVSCQkJMQotI2RlZmluZSBXTUVfU1VCVFlQRV9QQVJBTV9JRQkxCi0jZGVmaW5lIFdNRV9UWVBFCQkyCi0jZGVmaW5lIFdNRV9PVUkJCQkiXHgwMFx4NTBceGYyIgotCi0jZGVmaW5lIEFDX0JFCQkJMAotI2RlZmluZSBBQ19CSwkJCTEKLSNkZWZpbmUgQUNfVkkJCQkyCi0jZGVmaW5lIEFDX1ZPCQkJMwotCi0vKgotICogZHJpdmVyIG1haW50YWlucyBpbnRlcm5hbCAndGljaycod2xjLT5wdWItPm5vdykgd2hpY2ggaW5jcmVtZW50cyBpbiAxcyBPUyB0aW1lcihzb2Z0Ci0gKiB3YXRjaGRvZykgaXQgaXMgbm90IGEgd2FsbCBjbG9jayBhbmQgd29uJ3QgaW5jcmVtZW50IHdoZW4gZHJpdmVyIGlzIGluICJkb3duIiBzdGF0ZQotICogdGhpcyBsb3cgcmVzb2x1dGlvbiBkcml2ZXIgdGljayBjYW4gYmUgdXNlZCBmb3IgbWFpbnRlbmFuY2UgdGFza3Mgc3VjaCBhcyBwaHkKLSAqIGNhbGlicmF0aW9uIGFuZCBzY2IgdXBkYXRlCi0gKi8KLQotLyogVG8gaW5mb3JtIHRoZSB1Y29kZSBvZiB0aGUgbGFzdCBtY2FzdCBmcmFtZSBwb3N0ZWQgc28gdGhhdCBpdCBjYW4gY2xlYXIgbW9yZWRhdGEgYml0ICovCi0jZGVmaW5lIEJDTUNGSUQod2xjLCBmaWQpIGJyY21zX2Jfd3JpdGVfc2htKCh3bGMpLT5odywgTV9CQ01DX0ZJRCwgKGZpZCkpCi0KLSNkZWZpbmUgQlJDTVNfV0FSMTYxNjUod2xjKSAod2xjLT5wdWItPnNpaC0+YnVzdHlwZSA9PSBQQ0lfQlVTICYmIFwKLQkJCQkoIUFQX0VOQUIod2xjLT5wdWIpKSAmJiAod2xjLT53YXIxNjE2NSkpCi0KLS8qIGRlYnVnL3RyYWNlICovCi11aW50IGJyY21fbXNnX2xldmVsID0KLSNpZiBkZWZpbmVkKEJDTURCRykKLQlMT0dfRVJST1JfVkFMOwotI2Vsc2UKLQkwOwotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwotCi0vKiBGaW5kIGJhc2ljIHJhdGUgZm9yIGEgZ2l2ZW4gcmF0ZSAqLwotI2RlZmluZSBCUkNNU19CQVNJQ19SQVRFKHdsYywgcnNwZWMpCShJU19NQ1MocnNwZWMpID8gXAotCQkJKHdsYyktPmJhbmQtPmJhc2ljX3JhdGVbbWNzX3RhYmxlW3JzcGVjICYgUlNQRUNfUkFURV9NQVNLXS5sZWdfb2ZkbV0gOiBcCi0JCQkod2xjKS0+YmFuZC0+YmFzaWNfcmF0ZVtyc3BlYyAmIFJTUEVDX1JBVEVfTUFTS10pCi0KLSNkZWZpbmUgRlJBTUVUWVBFKHIsIG1pbW9mcmFtZSkJKElTX01DUyhyKSA/IG1pbW9mcmFtZQk6IChJU19DQ0socikgPyBGVF9DQ0sgOiBGVF9PRkRNKSkKLQotI2RlZmluZSBSRkRJU0FCTEVfREVGQVVMVAkxMDAwMDAwMAkvKiByZmRpc2FibGUgZGVsYXkgdGltZXIgNTAwIG1zLCBydW5zIG9mIEFMUCBjbG9jayAqLwotCi0jZGVmaW5lIEJSQ01TX1RFTVBTRU5TRV9QRVJJT0QJCTEwCS8qIDEwIHNlY29uZCB0aW1lb3V0ICovCi0KLSNkZWZpbmUgU0NBTl9JTl9QUk9HUkVTUyh4KQkwCi0KLSNkZWZpbmUgRVBJX1ZFUlNJT05fTlVNCQkweDA1NGIwYjAwCi0KLSNpZmRlZiBCQ01EQkcKLS8qIHBvaW50ZXIgdG8gbW9zdCByZWNlbnRseSBhbGxvY2F0ZWQgd2wvd2xjICovCi1zdGF0aWMgc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjX2luZm9fZGJnID0gKHN0cnVjdCBicmNtc19jX2luZm8gKikgKE5VTEwpOwotI2VuZGlmCi0KLWNvbnN0IHU4IHByaW8yZmlmb1tOVU1QUklPXSA9IHsKLQlUWF9BQ19CRV9GSUZPLAkJLyogMCAgICBCRSAgICAgIEFDX0JFICAgQmVzdCBFZmZvcnQgKi8KLQlUWF9BQ19CS19GSUZPLAkJLyogMSAgICBCSyAgICAgIEFDX0JLICAgQmFja2dyb3VuZCAqLwotCVRYX0FDX0JLX0ZJRk8sCQkvKiAyICAgIC0tICAgICAgQUNfQksgICBCYWNrZ3JvdW5kICovCi0JVFhfQUNfQkVfRklGTywJCS8qIDMgICAgRUUgICAgICBBQ19CRSAgIEJlc3QgRWZmb3J0ICovCi0JVFhfQUNfVklfRklGTywJCS8qIDQgICAgQ0wgICAgICBBQ19WSSAgIFZpZGVvICovCi0JVFhfQUNfVklfRklGTywJCS8qIDUgICAgVkkgICAgICBBQ19WSSAgIFZpZGVvICovCi0JVFhfQUNfVk9fRklGTywJCS8qIDYgICAgVk8gICAgICBBQ19WTyAgIFZvaWNlICovCi0JVFhfQUNfVk9fRklGTwkJLyogNyAgICBOQyAgICAgIEFDX1ZPICAgVm9pY2UgKi8KLX07Ci0KLS8qIHByZWNlZGVuY2VzIG51bWJlcnMgZm9yIHdsYyBxdWV1ZXMuIFRoZXNlIGFyZSB0d2ljZSBhcyBtYXkgbGV2ZWxzIGFzCi0gKiA4MDIuMUQgcHJpb3JpdGllcy4KLSAqIE9kZCBudW1iZXJzIGFyZSB1c2VkIGZvciBISSBwcmlvcml0eSB0cmFmZmljIGF0IHNhbWUgcHJlY2VkZW5jZSBsZXZlbHMKLSAqIFRoZXNlIGNvbnN0YW50cyBhcmUgdXNlZCBPTkxZIGJ5IHdsY19wcmlvMnByZWNfbWFwLiAgRG8gbm90IHVzZSB0aGVtIGVsc2V3aGVyZS4KLSAqLwotI2RlZmluZQlfQlJDTVNfUFJFQ19OT05FCQkwCS8qIE5vbmUgPSAtICovCi0jZGVmaW5lCV9CUkNNU19QUkVDX0JLCQkyCS8qIEJLIC0gQmFja2dyb3VuZCAqLwotI2RlZmluZQlfQlJDTVNfUFJFQ19CRQkJNAkvKiBCRSAtIEJlc3QtZWZmb3J0ICovCi0jZGVmaW5lCV9CUkNNU19QUkVDX0VFCQk2CS8qIEVFIC0gRXhjZWxsZW50LWVmZm9ydCAqLwotI2RlZmluZQlfQlJDTVNfUFJFQ19DTAkJOAkvKiBDTCAtIENvbnRyb2xsZWQgTG9hZCAqLwotI2RlZmluZQlfQlJDTVNfUFJFQ19WSQkJMTAJLyogVmkgLSBWaWRlbyAqLwotI2RlZmluZQlfQlJDTVNfUFJFQ19WTwkJMTIJLyogVm8gLSBWb2ljZSAqLwotI2RlZmluZQlfQlJDTVNfUFJFQ19OQwkJMTQJLyogTkMgLSBOZXR3b3JrIENvbnRyb2wgKi8KLQotI2RlZmluZSBNQVhNQUNMSVNUCQk2NAkvKiBtYXggIyBzb3VyY2UgTUFDIG1hdGNoZXMgKi8KLSNkZWZpbmUgQkNOX1RFTVBMQVRFX0NPVU5UCTIKLQotLyogVGhlIEJTUyBpcyBnZW5lcmF0aW5nIGJlYWNvbnMgaW4gSFcgKi8KLSNkZWZpbmUgQlJDTVNfQlNTQ0ZHX0hXX0JDTgkweDIwCi0KLSNkZWZpbmUgSFdCQ05fRU5BQihjZmcpCQkoKChjZmcpLT5mbGFncyAmIEJSQ01TX0JTU0NGR19IV19CQ04pICE9IDApCi0KLSNkZWZpbmUgTUJTU19CQ05fRU5BQihjZmcpICAgICAgIDAKLSNkZWZpbmUgTUJTU19QUkJfRU5BQihjZmcpICAgICAgIDAKLSNkZWZpbmUgU09GVEJDTl9FTkFCKHB1YikgICAgKDApCi0KLS8qIDgwMi4xRCBQcmlvcml0eSB0byBwcmVjZWRlbmNlIHF1ZXVlIG1hcHBpbmcgKi8KLWNvbnN0IHU4IHdsY19wcmlvMnByZWNfbWFwW10gPSB7Ci0JX0JSQ01TX1BSRUNfQkUsCQkvKiAwIEJFIC0gQmVzdC1lZmZvcnQgKi8KLQlfQlJDTVNfUFJFQ19CSywJCS8qIDEgQksgLSBCYWNrZ3JvdW5kICovCi0JX0JSQ01TX1BSRUNfTk9ORSwJCS8qIDIgTm9uZSA9IC0gKi8KLQlfQlJDTVNfUFJFQ19FRSwJCS8qIDMgRUUgLSBFeGNlbGxlbnQtZWZmb3J0ICovCi0JX0JSQ01TX1BSRUNfQ0wsCQkvKiA0IENMIC0gQ29udHJvbGxlZCBMb2FkICovCi0JX0JSQ01TX1BSRUNfVkksCQkvKiA1IFZpIC0gVmlkZW8gKi8KLQlfQlJDTVNfUFJFQ19WTywJCS8qIDYgVm8gLSBWb2ljZSAqLwotCV9CUkNNU19QUkVDX05DLAkJLyogNyBOQyAtIE5ldHdvcmsgQ29udHJvbCAqLwotfTsKLQotLyogQ2hlY2sgaWYgYSBwYXJ0aWN1bGFyIEJTUyBjb25maWcgaXMgQVAgb3IgU1RBICovCi0jZGVmaW5lIEJTU0NGR19BUChjZmcpCQkoMCkKLSNkZWZpbmUgQlNTQ0ZHX1NUQShjZmcpCQkoMSkKLSNkZWZpbmUgQlNTQ0ZHX0lCU1MoY2ZnKQkoIShjZmcpLT5CU1MpCi0KLS8qIEFzIGFib3ZlIGZvciBhbGwgbm9uLU5VTEwgQlNTIGNvbmZpZ3MgKi8KLSNkZWZpbmUgRk9SRUFDSF9CU1Mod2xjLCBpZHgsIGNmZykgXAotCWZvciAoaWR4ID0gMDsgKGludCkgaWR4IDwgQlJDTVNfTUFYQlNTQ0ZHOyBpZHgrKykgXAotCQlpZiAoKGNmZyA9ICh3bGMpLT5ic3NjZmdbaWR4XSkpCi0KLS8qIFRYIEZJRk8gbnVtYmVyIHRvIFdNRS84MDIuMUUgQWNjZXNzIENhdGVnb3J5ICovCi1jb25zdCB1OCB3bWVfZmlmbzJhY1tdID0geyBBQ19CSywgQUNfQkUsIEFDX1ZJLCBBQ19WTywgQUNfQkUsIEFDX0JFIH07Ci0KLS8qIFdNRS84MDIuMUUgQWNjZXNzIENhdGVnb3J5IHRvIFRYIEZJRk8gbnVtYmVyICovCi1zdGF0aWMgY29uc3QgdTggd21lX2FjMmZpZm9bXSA9IHsgMSwgMCwgMiwgMyB9OwotCi1zdGF0aWMgYm9vbCBpbl9zZW5kX3E7Ci0KLS8qIFNoYXJlZCBtZW1vcnkgbG9jYXRpb24gaW5kZXggZm9yIHZhcmlvdXMgQUMgcGFyYW1zICovCi0jZGVmaW5lIHdtZV9zaG1lbWFjaW5kZXgoYWMpCXdtZV9hYzJmaWZvW2FjXQotCi0jaWZkZWYgQkNNREJHCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGZpZm9fbmFtZXNbXSA9IHsKLQkiQUNfQksiLCAiQUNfQkUiLCAiQUNfVkkiLCAiQUNfVk8iLCAiQkNNQyIsICJBVElNIiB9OwotI2Vsc2UKLXN0YXRpYyBjb25zdCBjaGFyIGZpZm9fbmFtZXNbNl1bMF07Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHU4IGFjYml0bWFwMm1heHByaW9bXSA9IHsKLQlQUklPXzgwMjFEX0JFLCBQUklPXzgwMjFEX0JFLCBQUklPXzgwMjFEX0JLLCBQUklPXzgwMjFEX0JLLAotCVBSSU9fODAyMURfVkksIFBSSU9fODAyMURfVkksIFBSSU9fODAyMURfVkksIFBSSU9fODAyMURfVkksCi0JUFJJT184MDIxRF9WTywgUFJJT184MDIxRF9WTywgUFJJT184MDIxRF9WTywgUFJJT184MDIxRF9WTywKLQlQUklPXzgwMjFEX1ZPLCBQUklPXzgwMjFEX1ZPLCBQUklPXzgwMjFEX1ZPLCBQUklPXzgwMjFEX1ZPCi19OwotCi0vKiBjdXJyZW50bHkgdGhlIGJlc3QgbWVjaGFuaXNtIGZvciBkZXRlcm1pbmluZyBTSUZTIGlzIHRoZSBiYW5kIGluIHVzZSAqLwotI2RlZmluZSBTSUZTKGJhbmQpICgoYmFuZCktPmJhbmR0eXBlID09IEJSQ01fQkFORF81RyA/IEFQSFlfU0lGU19USU1FIDogXAotCQkJCQkJICAgICAgIEJQSFlfU0lGU19USU1FKTsKLQotLyogbG9jYWwgcHJvdG90eXBlcyAqLwotc3RhdGljIHUxNiBicmNtc19jX2QxMWhkcnNfbWFjODAyMTEoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcCwKLQkJCQkJICAgICAgIHN0cnVjdCBzY2IgKnNjYiwgdWludCBmcmFnLAotCQkJCQkgICAgICAgdWludCBuZnJhZ3MsIHVpbnQgcXVldWUsCi0JCQkJCSAgICAgICB1aW50IG5leHRfZnJhZ19sZW4sCi0JCQkJCSAgICAgICBzdHJ1Y3Qgd3NlY19rZXkgKmtleSwKLQkJCQkJICAgICAgIHJhdGVzcGVjX3QgcnNwZWNfb3ZlcnJpZGUpOwotc3RhdGljIHZvaWQgYnJjbXNfY19ic3NfZGVmYXVsdF9pbml0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1zdGF0aWMgdm9pZCBicmNtc19jX3Vjb2RlX21hY191cGQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKLXN0YXRpYyByYXRlc3BlY190IG1hYzgwMjExX3dsY19zZXRfbnJhdGUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJCQkgc3RydWN0IGJyY21zX2JhbmQgKmN1cl9iYW5kLAotCQkJCQkgdTMyIGludF92YWwpOwotc3RhdGljIHZvaWQgYnJjbXNfY190eF9wcmVjX21hcF9pbml0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1zdGF0aWMgdm9pZCBicmNtc19jX3dhdGNoZG9nKHZvaWQgKmFyZyk7Ci1zdGF0aWMgdm9pZCBicmNtc19jX3dhdGNoZG9nX2J5X3RpbWVyKHZvaWQgKmFyZyk7Ci1zdGF0aWMgdTE2IGJyY21zX2NfcmF0ZV9zaG1fb2Zmc2V0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdTggcmF0ZSk7Ci1zdGF0aWMgaW50IGJyY21zX2Nfc2V0X3JhdGVzZXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB3bGNfcmF0ZXNldF90ICpyc19hcmcpOwotc3RhdGljIHU4IGJyY21zX2NfbG9jYWxfY29uc3RyYWludF9xZGJtKHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci0KLS8qIHNlbmQgYW5kIHJlY2VpdmUgKi8KLXN0YXRpYyBzdHJ1Y3QgYnJjbXNfdHhxX2luZm8gKmJyY21zX2NfdHhxX2FsbG9jKHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1zdGF0aWMgdm9pZCBicmNtc19jX3R4cV9mcmVlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywKLQkJCSBzdHJ1Y3QgYnJjbXNfdHhxX2luZm8gKnFpKTsKLXN0YXRpYyB2b2lkIGJyY21zX2NfdHhmbG93Y29udHJvbF9zaWduYWwoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJCSAgICAgc3RydWN0IGJyY21zX3R4cV9pbmZvICpxaSwKLQkJCQkgICAgIGJvb2wgb24sIGludCBwcmlvKTsKLXN0YXRpYyB2b2lkIGJyY21zX2NfdHhmbG93Y29udHJvbF9yZXNldChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotc3RhdGljIHZvaWQgYnJjbXNfY19jb21wdXRlX2Nja19wbGNwKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlLAotCQkJCSB1aW50IGxlbmd0aCwgdTggKnBsY3ApOwotc3RhdGljIHZvaWQgYnJjbXNfY19jb21wdXRlX29mZG1fcGxjcChyYXRlc3BlY190IHJhdGUsIHVpbnQgbGVuZ3RoLCB1OCAqcGxjcCk7Ci1zdGF0aWMgdm9pZCBicmNtc19jX2NvbXB1dGVfbWltb19wbGNwKHJhdGVzcGVjX3QgcmF0ZSwgdWludCBsZW5ndGgsIHU4ICpwbGNwKTsKLXN0YXRpYyB1MTYgYnJjbXNfY19jb21wdXRlX2ZyYW1lX2R1cihzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcmF0ZSwKLQkJCQkgICAgdTggcHJlYW1ibGVfdHlwZSwgdWludCBuZXh0X2ZyYWdfbGVuKTsKLXN0YXRpYyB1NjQgYnJjbXNfY19yZWNvdmVyX3RzZjY0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywKLQkJCSAgICAgc3RydWN0IGJyY21zX2QxMXJ4aGRyICpyeGgpOwotc3RhdGljIHZvaWQgYnJjbXNfY19yZWN2Y3RsKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywKLQkJCXN0cnVjdCBkMTFyeGhkciAqcnhoLCBzdHJ1Y3Qgc2tfYnVmZiAqcCk7Ci1zdGF0aWMgdWludCBicmNtc19jX2NhbGNfZnJhbWVfbGVuKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlLAotCQkJICAgICAgIHU4IHByZWFtYmxlX3R5cGUsIHVpbnQgZHVyKTsKLXN0YXRpYyB1aW50IGJyY21zX2NfY2FsY19hY2tfdGltZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcmF0ZSwKLQkJCSAgICAgIHU4IHByZWFtYmxlX3R5cGUpOwotc3RhdGljIHVpbnQgYnJjbXNfY19jYWxjX2N0c190aW1lKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlLAotCQkJICAgICAgdTggcHJlYW1ibGVfdHlwZSk7Ci0vKiBpbnRlcnJ1cHQsIHVwL2Rvd24sIGJhbmQgKi8KLXN0YXRpYyB2b2lkIGJyY21zX2Nfc2V0YmFuZChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHVpbnQgYmFuZHVuaXQpOwotc3RhdGljIGNoYW5zcGVjX3QgYnJjbXNfY19pbml0X2NoYW5zcGVjKHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1zdGF0aWMgdm9pZCBicmNtc19jX2JhbmRpbml0X29yZGVyZWQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJCSAgICAgY2hhbnNwZWNfdCBjaGFuc3BlYyk7Ci1zdGF0aWMgdm9pZCBicmNtc19jX2JzaW5pdChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotc3RhdGljIGludCBicmNtc19jX2R1dHlfY3ljbGVfc2V0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgaW50IGR1dHlfY3ljbGUsCi0JCQkgICAgICBib29sIGlzT0ZETSwgYm9vbCB3cml0ZVRvU2htKTsKLXN0YXRpYyB2b2lkIGJyY21zX2NfcmFkaW9faHdkaXNhYmxlX3VwZChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotc3RhdGljIGJvb2wgYnJjbXNfY19yYWRpb19tb25pdG9yX3N0YXJ0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1zdGF0aWMgdm9pZCBicmNtc19jX3JhZGlvX3RpbWVyKHZvaWQgKmFyZyk7Ci1zdGF0aWMgdm9pZCBicmNtc19jX3JhZGlvX2VuYWJsZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotc3RhdGljIHZvaWQgYnJjbXNfY19yYWRpb191cGQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKLQotLyogc2NhbiwgYXNzb2NpYXRpb24sIEJTUyAqLwotc3RhdGljIHVpbnQgYnJjbXNfY19jYWxjX2JhX3RpbWUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCByYXRlc3BlY190IHJhdGUsCi0JCQkgICAgIHU4IHByZWFtYmxlX3R5cGUpOwotc3RhdGljIHZvaWQgYnJjbXNfY191cGRhdGVfbWltb19iYW5kX2J3Y2FwKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdTggYndjYXApOwotc3RhdGljIHZvaWQgYnJjbXNfY19odF91cGRhdGVfc2dpX3J4KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgaW50IHZhbCk7Ci1zdGF0aWMgdm9pZCBicmNtc19jX2h0X3VwZGF0ZV9sZHBjKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgczggdmFsKTsKLXN0YXRpYyB2b2lkIGJyY21zX2Nfd2FyMTYxNjUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBib29sIHR4KTsKLQotc3RhdGljIHZvaWQgYnJjbXNfY193bWVfcmV0cmllc193cml0ZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotc3RhdGljIGJvb2wgYnJjbXNfY19hdHRhY2hfc3RmX2FudF9pbml0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1zdGF0aWMgdWludCBicmNtc19jX2F0dGFjaF9tb2R1bGUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKLXN0YXRpYyB2b2lkIGJyY21zX2NfZGV0YWNoX21vZHVsZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotc3RhdGljIHZvaWQgYnJjbXNfY190aW1lcnNfZGVpbml0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1zdGF0aWMgdm9pZCBicmNtc19jX2Rvd25fbGVkX3VwZChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotc3RhdGljIHVpbnQgYnJjbXNfY19kb3duX2RlbF90aW1lcihzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotc3RhdGljIHZvaWQgYnJjbXNfY19vZmRtX3JhdGVzZXRfd2FyKHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1zdGF0aWMgaW50IF9icmNtc19jX2lvY3RsKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgaW50IGNtZCwgdm9pZCAqYXJnLCBpbnQgbGVuLAotCQkgICAgICBzdHJ1Y3QgYnJjbXNfY19pZiAqd2xjaWYpOwotCi0vKiBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoZSBQTSBiaXQgc2hvdWxkIGJlIHNldCBpbiBvdXRnb2luZyBmcmFtZXMgYW5kIFNUQVlfQVdBS0UgaXMgbWVhbmluZ2Z1bAotICovCi1ib29sIGJyY21zX2NfcHNfYWxsb3dlZChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0JaW50IGlkeDsKLQlzdHJ1Y3QgYnJjbXNfYnNzX2NmZyAqY2ZnOwotCi0JLyogZGlzYWxsb3cgUFMgd2hlbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBnbG9iYWwgY29uZGl0aW9ucyBtZWV0cyAqLwotCWlmICghd2xjLT5wdWItPmFzc29jaWF0ZWQpCi0JCXJldHVybiBmYWxzZTsKLQotCS8qIGRpc2FsbG93IFBTIHdoZW4gb25lIG9mIHRoZXNlIG1lZXRzIHdoZW4gbm90IHNjYW5uaW5nICovCi0JaWYgKEFQX0FDVElWRSh3bGMpIHx8IHdsYy0+bW9uaXRvcikKLQkJcmV0dXJuIGZhbHNlOwotCi0JZm9yIChpZHggPSAwOyBpZHggPCBCUkNNU19NQVhCU1NDRkc7IGlkeCsrKSB7Ci0JCWNmZyA9IHdsYy0+YnNzY2ZnW2lkeF07Ci0JCWlmIChjZmcgJiYgQlNTQ0ZHX1NUQShjZmcpICYmIGNmZy0+YXNzb2NpYXRlZCkgewotCQkJLyoKLQkJCSAqIGRpc2FsbG93IFBTIHdoZW4gb25lIG9mIHRoZSBmb2xsb3dpbmcKLQkJCSAqIGJzc2NmZyBzcGVjaWZpYyBjb25kaXRpb25zIG1lZXRzCi0JCQkgKi8KLQkJCWlmICghY2ZnLT5CU1MgfHwgIUJSQ01TX1BPUlRPUEVOKGNmZykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQlpZiAoIWNmZy0+ZHRpbV9wcm9ncmFtbWVkKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXJldHVybiB0cnVlOwotfQotCi12b2lkIGJyY21zX2NfcmVzZXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjLT5wdWItPnVuaXQpOwotCi0JLyogc2x1cnAgdXAgaHcgbWFjIGNvdW50ZXJzIGJlZm9yZSBjb3JlIHJlc2V0ICovCi0JYnJjbXNfY19zdGF0c3VwZCh3bGMpOwotCi0JLyogcmVzZXQgb3VyIHNuYXBzaG90IG9mIG1hY3N0YXQgY291bnRlcnMgKi8KLQltZW1zZXQoKGNoYXIgKil3bGMtPmNvcmUtPm1hY3N0YXRfc25hcHNob3QsIDAsCi0JCXNpemVvZihzdHJ1Y3QgbWFjc3RhdCkpOwotCi0JYnJjbXNfYl9yZXNldCh3bGMtPmh3KTsKLX0KLQotdm9pZCBicmNtc19jX2ZhdGFsX2Vycm9yKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIndsJWQ6IGZhdGFsIGVycm9yLCByZWluaXRpYWxpemluZ1xuIiwKLQkJICB3bGMtPnB1Yi0+dW5pdCk7Ci0JYnJjbXNfaW5pdCh3bGMtPndsKTsKLX0KLQotLyogUmV0dXJuIHRoZSBjaGFubmVsIHRoZSBkcml2ZXIgc2hvdWxkIGluaXRpYWxpemUgZHVyaW5nIGJyY21zX2NfaW5pdC4KLSAqIHRoZSBjaGFubmVsIG1heSBoYXZlIHRvIGJlIGNoYW5nZWQgZnJvbSB0aGUgY3VycmVudGx5IGNvbmZpZ3VyZWQgY2hhbm5lbAotICogaWYgb3RoZXIgY29uZmlndXJhdGlvbnMgYXJlIGluIGNvbmZsaWN0IChiYW5kbG9ja2VkLCAxMW4gbW9kZSBkaXNhYmxlZCwKLSAqIGludmFsaWQgY2hhbm5lbCBmb3IgY3VycmVudCBjb3VudHJ5LCBldGMuKQotICovCi1zdGF0aWMgY2hhbnNwZWNfdCBicmNtc19jX2luaXRfY2hhbnNwZWMoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCWNoYW5zcGVjX3QgY2hhbnNwZWMgPQotCSAgICAxIHwgV0xfQ0hBTlNQRUNfQldfMjAgfCBXTF9DSEFOU1BFQ19DVExfU0JfTk9ORSB8Ci0JICAgIFdMX0NIQU5TUEVDX0JBTkRfMkc7Ci0KLQlyZXR1cm4gY2hhbnNwZWM7Ci19Ci0KLXN0cnVjdCBzY2IgZ2xvYmFsX3NjYjsKLQotc3RhdGljIHZvaWQgYnJjbXNfY19pbml0X3NjYihzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHN0cnVjdCBzY2IgKnNjYikKLXsKLQlpbnQgaTsKLQlzY2ItPmZsYWdzID0gU0NCX1dNRUNBUCB8IFNDQl9IVENBUDsKLQlmb3IgKGkgPSAwOyBpIDwgTlVNUFJJTzsgaSsrKQotCQlzY2ItPnNlcW51bVtpXSA9IDA7Ci19Ci0KLXZvaWQgYnJjbXNfY19pbml0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlkMTFyZWdzX3QgKnJlZ3M7Ci0JY2hhbnNwZWNfdCBjaGFuc3BlYzsKLQlpbnQgaTsKLQlzdHJ1Y3QgYnJjbXNfYnNzX2NmZyAqYnNzY2ZnOwotCWJvb2wgbXV0ZSA9IGZhbHNlOwotCi0JQkNNTVNHKHdsYy0+d2lwaHksICJ3bCVkXG4iLCB3bGMtPnB1Yi0+dW5pdCk7Ci0KLQlyZWdzID0gd2xjLT5yZWdzOwotCi0JLyogVGhpcyB3aWxsIGhhcHBlbiBpZiBhIGJpZy1oYW1tZXIgd2FzIGV4ZWN1dGVkLiBJbiB0aGF0IGNhc2UsIHdlIHdhbnQgdG8gZ28gYmFjawotCSAqIHRvIHRoZSBjaGFubmVsIHRoYXQgd2Ugd2VyZSBvbiBhbmQgbm90IG5ldyBjaGFubmVsCi0JICovCi0JaWYgKHdsYy0+cHViLT5hc3NvY2lhdGVkKQotCQljaGFuc3BlYyA9IHdsYy0+aG9tZV9jaGFuc3BlYzsKLQllbHNlCi0JCWNoYW5zcGVjID0gYnJjbXNfY19pbml0X2NoYW5zcGVjKHdsYyk7Ci0KLQlicmNtc19iX2luaXQod2xjLT5odywgY2hhbnNwZWMsIG11dGUpOwotCi0JLyogdXBkYXRlIGJlYWNvbiBsaXN0ZW4gaW50ZXJ2YWwgKi8KLQlicmNtc19jX2Jjbl9saV91cGQod2xjKTsKLQotCS8qIHRoZSB3b3JsZCBpcyBuZXcgYWdhaW4sIHNvIGlzIG91ciByZXBvcnRlZCByYXRlICovCi0JYnJjbXNfY19yZXByYXRlX2luaXQod2xjKTsKLQotCS8qIHdyaXRlIGV0aGVybmV0IGFkZHJlc3MgdG8gY29yZSAqLwotCUZPUkVBQ0hfQlNTKHdsYywgaSwgYnNzY2ZnKSB7Ci0JCWJyY21zX2Nfc2V0X21hYyhic3NjZmcpOwotCQlicmNtc19jX3NldF9ic3NpZChic3NjZmcpOwotCX0KLQotCS8qIFVwZGF0ZSB0c2ZfY2ZwcmVwIGlmIGFzc29jaWF0ZWQgYW5kIHVwICovCi0JaWYgKHdsYy0+cHViLT5hc3NvY2lhdGVkKSB7Ci0JCUZPUkVBQ0hfQlNTKHdsYywgaSwgYnNzY2ZnKSB7Ci0JCQlpZiAoYnNzY2ZnLT51cCkgewotCQkJCXUzMiBiaTsKLQotCQkJCS8qIGdldCBiZWFjb24gcGVyaW9kIGFuZCBjb252ZXJ0IHRvIHVTICovCi0JCQkJYmkgPSBic3NjZmctPmN1cnJlbnRfYnNzLT5iZWFjb25fcGVyaW9kIDw8IDEwOwotCQkJCS8qCi0JCQkJICogdXBkYXRlIHNpbmNlIGluaXQgcGF0aCB3b3VsZCByZXNldAotCQkJCSAqIHRvIGRlZmF1bHQgdmFsdWUKLQkJCQkgKi8KLQkJCQlXX1JFRygmcmVncy0+dHNmX2NmcHJlcCwKLQkJCQkgICAgICAoYmkgPDwgQ0ZQUkVQX0NCSV9TSElGVCkpOwotCi0JCQkJLyogVXBkYXRlIG1hY2NvbnRyb2wgUE0gcmVsYXRlZCBiaXRzICovCi0JCQkJYnJjbXNfY19zZXRfcHNfY3RybCh3bGMpOwotCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlicmNtc19jX2JhbmRpbml0X29yZGVyZWQod2xjLCBjaGFuc3BlYyk7Ci0KLQlicmNtc19jX2luaXRfc2NiKHdsYywgJmdsb2JhbF9zY2IpOwotCi0JLyogaW5pdCBwcm9iZSByZXNwb25zZSB0aW1lb3V0ICovCi0JYnJjbXNfY193cml0ZV9zaG0od2xjLCBNX1BSU19NQVhUSU1FLCB3bGMtPnByYl9yZXNwX3RpbWVvdXQpOwotCi0JLyogaW5pdCBtYXggYnVyc3QgdHhvcCAoZnJhbWVidXJzdGluZykgKi8KLQlicmNtc19jX3dyaXRlX3NobSh3bGMsIE1fTUJVUlNUX1RYT1AsCi0JCSAgICAgICh3bGMtPgotCQkgICAgICAgX3JpZnMgPyAoRURDRl9BQ19WT19UWE9QX0FQIDw8IDUpIDogTUFYRlJBTUVCVVJTVF9UWE9QKSk7Ci0KLQkvKiBpbml0aWFsaXplIG1heGltdW0gYWxsb3dlZCBkdXR5IGN5Y2xlICovCi0JYnJjbXNfY19kdXR5X2N5Y2xlX3NldCh3bGMsIHdsYy0+dHhfZHV0eV9jeWNsZV9vZmRtLCB0cnVlLCB0cnVlKTsKLQlicmNtc19jX2R1dHlfY3ljbGVfc2V0KHdsYywgd2xjLT50eF9kdXR5X2N5Y2xlX2NjaywgZmFsc2UsIHRydWUpOwotCi0JLyogVXBkYXRlIHNvbWUgc2hhcmVkIG1lbW9yeSBsb2NhdGlvbnMgcmVsYXRlZCB0byBtYXggQU1QRFUgc2l6ZSBhbGxvd2VkIHRvIHJlY2VpdmVkICovCi0JYnJjbXNfY19hbXBkdV9zaG1fdXBkKHdsYy0+YW1wZHUpOwotCi0JLyogYmFuZC1zcGVjaWZpYyBpbml0cyAqLwotCWJyY21zX2NfYnNpbml0KHdsYyk7Ci0KLQkvKiBFbmFibGUgRURDRiBtb2RlICh3aGlsZSB0aGUgTUFDIGlzIHN1c3BlbmRlZCkgKi8KLQlpZiAoRURDRl9FTkFCKHdsYy0+cHViKSkgewotCQlPUl9SRUcoJnJlZ3MtPmlmc19jdGwsIElGU19VU0VFRENGKTsKLQkJYnJjbXNfY19lZGNmX3NldHBhcmFtcyh3bGMsIGZhbHNlKTsKLQl9Ci0KLQkvKiBJbml0IHByZWNlZGVuY2UgbWFwcyBmb3IgZW1wdHkgRklGT3MgKi8KLQlicmNtc19jX3R4X3ByZWNfbWFwX2luaXQod2xjKTsKLQotCS8qIHJlYWQgdGhlIHVjb2RlIHZlcnNpb24gaWYgd2UgaGF2ZSBub3QgeWV0IGRvbmUgc28gKi8KLQlpZiAod2xjLT51Y29kZV9yZXYgPT0gMCkgewotCQl3bGMtPnVjb2RlX3JldiA9Ci0JCSAgICBicmNtc19jX3JlYWRfc2htKHdsYywgTV9CT01fUkVWX01BSk9SKSA8PCBOQklUUyh1MTYpOwotCQl3bGMtPnVjb2RlX3JldiB8PSBicmNtc19jX3JlYWRfc2htKHdsYywgTV9CT01fUkVWX01JTk9SKTsKLQl9Ci0KLQkvKiAuLm5vdyByZWFsbHkgdW5sZWFzaCBoZWxsIChhbGxvdyB0aGUgTUFDIG91dCBvZiBzdXNwZW5kKSAqLwotCWJyY21zX2NfZW5hYmxlX21hYyh3bGMpOwotCi0JLyogY2xlYXIgdHggZmxvdyBjb250cm9sICovCi0JYnJjbXNfY190eGZsb3djb250cm9sX3Jlc2V0KHdsYyk7Ci0KLQkvKiBjbGVhciB0eCBkYXRhIGZpZm8gc3VzcGVuZHMgKi8KLQl3bGMtPnR4X3N1c3BlbmRlZCA9IGZhbHNlOwotCi0JLyogZW5hYmxlIHRoZSBSRiBEaXNhYmxlIERlbGF5IHRpbWVyICovCi0JV19SRUcoJndsYy0+cmVncy0+cmZkaXNhYmxlZGx5LCBSRkRJU0FCTEVfREVGQVVMVCk7Ci0KLQkvKiBpbml0aWFsaXplIG1wYyBkZWxheSAqLwotCXdsYy0+bXBjX2RlbGF5X29mZiA9IHdsYy0+bXBjX2RseWNudCA9IEJSQ01TX01QQ19NSU5fREVMQVlDTlQ7Ci0KLQkvKgotCSAqIEluaXRpYWxpemUgV01FIHBhcmFtZXRlcnM7IGlmIHRoZXkgaGF2ZW4ndCBiZWVuIHNldCBieSBzb21lIG90aGVyCi0JICogbWVjaGFuaXNtIChJT1ZhciwgZXRjKSB0aGVuIHJlYWQgdGhlbSBmcm9tIHRoZSBoYXJkd2FyZS4KLQkgKi8KLQlpZiAoQlJDTVNfV01FX1JFVFJZX1NIT1JUX0dFVCh3bGMsIDApID09IDApIHsKLQkJLyogVW5pbml0aWFsaXplZDsgcmVhZCBmcm9tIEhXICovCi0JCWludCBhYzsKLQotCQlmb3IgKGFjID0gMDsgYWMgPCBBQ19DT1VOVDsgYWMrKykgewotCQkJd2xjLT53bWVfcmV0cmllc1thY10gPQotCQkJICAgIGJyY21zX2NfcmVhZF9zaG0od2xjLCBNX0FDX1RYTE1UX0FERFIoYWMpKTsKLQkJfQotCX0KLX0KLQotdm9pZCBicmNtc19jX21hY19iY25fcHJvbWlzY19jaGFuZ2Uoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBib29sIHByb21pc2MpCi17Ci0Jd2xjLT5iY25taXNjX21vbml0b3IgPSBwcm9taXNjOwotCWJyY21zX2NfbWFjX2Jjbl9wcm9taXNjKHdsYyk7Ci19Ci0KLXZvaWQgYnJjbXNfY19tYWNfYmNuX3Byb21pc2Moc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCWlmICgoQVBfRU5BQih3bGMtPnB1YikgJiYgKE5fRU5BQih3bGMtPnB1YikgfHwgd2xjLT5iYW5kLT5nbW9kZSkpIHx8Ci0JICAgIHdsYy0+YmNubWlzY19pYnNzIHx8IHdsYy0+YmNubWlzY19zY2FuIHx8IHdsYy0+YmNubWlzY19tb25pdG9yKQotCQlicmNtc19jX21jdHJsKHdsYywgTUNUTF9CQ05TX1BST01JU0MsIE1DVExfQkNOU19QUk9NSVNDKTsKLQllbHNlCi0JCWJyY21zX2NfbWN0cmwod2xjLCBNQ1RMX0JDTlNfUFJPTUlTQywgMCk7Ci19Ci0KLS8qIHNldCBvciBjbGVhciBtYWNjb250cm9sIGJpdHMgTUNUTF9QUk9NSVNDIGFuZCBNQ1RMX0tFRVBDT05UUk9MICovCi12b2lkIGJyY21zX2NfbWFjX3Byb21pc2Moc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCXUzMiBwcm9taXNjX2JpdHMgPSAwOwotCi0JLyogcHJvbWlzY3VvdXMgbW9kZSBqdXN0IHNldHMgTUNUTF9QUk9NSVNDCi0JICogTm90ZTogQVBzIGdldCBhbGwgQlNTIHRyYWZmaWMgd2l0aG91dCB0aGUgbmVlZCB0byBzZXQgdGhlIE1DVExfUFJPTUlTQyBiaXQKLQkgKiBzaW5jZSBhbGwgQlNTIGRhdGEgdHJhZmZpYyBpcyBkaXJlY3RlZCBhdCB0aGUgQVAKLQkgKi8KLQlpZiAoUFJPTUlTQ19FTkFCKHdsYy0+cHViKSAmJiAhQVBfRU5BQih3bGMtPnB1YikpCi0JCXByb21pc2NfYml0cyB8PSBNQ1RMX1BST01JU0M7Ci0KLQkvKiBtb25pdG9yIG1vZGUgbmVlZHMgYm90aCBNQ1RMX1BST01JU0MgYW5kIE1DVExfS0VFUENPTlRST0wKLQkgKiBOb3RlOiBtb25pdG9yIG1vZGUgYWxzbyBuZWVkcyBNQ1RMX0JDTlNfUFJPTUlTQywgYnV0IHRoYXQgaXMKLQkgKiBoYW5kbGVkIGluIGJyY21zX2NfbWFjX2Jjbl9wcm9taXNjKCkKLQkgKi8KLQlpZiAoTU9OSVRPUl9FTkFCKHdsYykpCi0JCXByb21pc2NfYml0cyB8PSBNQ1RMX1BST01JU0MgfCBNQ1RMX0tFRVBDT05UUk9MOwotCi0JYnJjbXNfY19tY3RybCh3bGMsIE1DVExfUFJPTUlTQyB8IE1DVExfS0VFUENPTlRST0wsIHByb21pc2NfYml0cyk7Ci19Ci0KLS8qIHB1c2ggc3cgaHBzIGFuZCB3YWtlIHN0YXRlIHRocm91Z2ggaGFyZHdhcmUgKi8KLXZvaWQgYnJjbXNfY19zZXRfcHNfY3RybChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0JdTMyIHYxLCB2MjsKLQlib29sIGhwczsKLQlib29sIGF3YWtlX2JlZm9yZTsKLQotCWhwcyA9IFBTX0FMTE9XRUQod2xjKTsKLQotCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZDogaHBzICVkXG4iLCB3bGMtPnB1Yi0+dW5pdCwgaHBzKTsKLQotCXYxID0gUl9SRUcoJndsYy0+cmVncy0+bWFjY29udHJvbCk7Ci0JdjIgPSBNQ1RMX1dBS0U7Ci0JaWYgKGhwcykKLQkJdjIgfD0gTUNUTF9IUFM7Ci0KLQlicmNtc19jX21jdHJsKHdsYywgTUNUTF9XQUtFIHwgTUNUTF9IUFMsIHYyKTsKLQotCWF3YWtlX2JlZm9yZSA9ICgodjEgJiBNQ1RMX1dBS0UpIHx8ICgodjEgJiBNQ1RMX0hQUykgPT0gMCkpOwotCi0JaWYgKCFhd2FrZV9iZWZvcmUpCi0JCWJyY21zX2Jfd2FpdF9mb3Jfd2FrZSh3bGMtPmh3KTsKLQotfQotCi0vKgotICogV3JpdGUgdGhpcyBCU1MgY29uZmlnJ3MgTUFDIGFkZHJlc3MgdG8gY29yZS4KLSAqIFVwZGF0ZXMgUlhFIG1hdGNoIGVuZ2luZS4KLSAqLwotaW50IGJyY21zX2Nfc2V0X21hYyhzdHJ1Y3QgYnJjbXNfYnNzX2NmZyAqY2ZnKQotewotCWludCBlcnIgPSAwOwotCXN0cnVjdCBicmNtc19jX2luZm8gKndsYyA9IGNmZy0+d2xjOwotCi0JaWYgKGNmZyA9PSB3bGMtPmNmZykgewotCQkvKiBlbnRlciB0aGUgTUFDIGFkZHIgaW50byB0aGUgUlhFIG1hdGNoIHJlZ2lzdGVycyAqLwotCQlicmNtc19jX3NldF9hZGRybWF0Y2god2xjLCBSQ01fTUFDX09GRlNFVCwgY2ZnLT5jdXJfZXRoZXJhZGRyKTsKLQl9Ci0KLQlicmNtc19jX2FtcGR1X21hY2FkZHJfdXBkKHdsYyk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi0vKiBXcml0ZSB0aGUgQlNTIGNvbmZpZydzIEJTU0lEIGFkZHJlc3MgdG8gY29yZSAoc2V0X2Jzc2lkIGluIGQxMXByb2NzLnRjbCkuCi0gKiBVcGRhdGVzIFJYRSBtYXRjaCBlbmdpbmUuCi0gKi8KLXZvaWQgYnJjbXNfY19zZXRfYnNzaWQoc3RydWN0IGJyY21zX2Jzc19jZmcgKmNmZykKLXsKLQlzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMgPSBjZmctPndsYzsKLQotCS8qIGlmIHByaW1hcnkgY29uZmlnLCB3ZSBuZWVkIHRvIHVwZGF0ZSBCU1NJRCBpbiBSWEUgbWF0Y2ggcmVnaXN0ZXJzICovCi0JaWYgKGNmZyA9PSB3bGMtPmNmZykgewotCQlicmNtc19jX3NldF9hZGRybWF0Y2god2xjLCBSQ01fQlNTSURfT0ZGU0VULCBjZmctPkJTU0lEKTsKLQl9Ci0jaWZkZWYgU1VQUE9SVF9IV0tFWVMKLQllbHNlIGlmIChCU1NDRkdfU1RBKGNmZykgJiYgY2ZnLT5CU1MpIHsKLQkJYnJjbXNfY19yY210YV9hZGRfYnNzaWQod2xjLCBjZmcpOwotCX0KLSNlbmRpZgotfQotCi0vKgotICogU3VzcGVuZCB0aGUgdGhlIE1BQyBhbmQgdXBkYXRlIHRoZSBzbG90IHRpbWluZwotICogZm9yIHN0YW5kYXJkIDExYi9nICgyMHVzIHNsb3RzKSBvciBzaG9ydHNsb3QgMTFnICg5dXMgc2xvdHMpLgotICovCi12b2lkIGJyY21zX2Nfc3dpdGNoX3Nob3J0c2xvdChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGJvb2wgc2hvcnRzbG90KQotewotCWludCBpZHg7Ci0Jc3RydWN0IGJyY21zX2Jzc19jZmcgKmNmZzsKLQotCS8qIHVzZSB0aGUgb3ZlcnJpZGUgaWYgaXQgaXMgc2V0ICovCi0JaWYgKHdsYy0+c2hvcnRzbG90X292ZXJyaWRlICE9IEJSQ01TX1NIT1JUU0xPVF9BVVRPKQotCQlzaG9ydHNsb3QgPSAod2xjLT5zaG9ydHNsb3Rfb3ZlcnJpZGUgPT0gQlJDTVNfU0hPUlRTTE9UX09OKTsKLQotCWlmICh3bGMtPnNob3J0c2xvdCA9PSBzaG9ydHNsb3QpCi0JCXJldHVybjsKLQotCXdsYy0+c2hvcnRzbG90ID0gc2hvcnRzbG90OwotCi0JLyogdXBkYXRlIHRoZSBjYXBhYmlsaXR5IGJhc2VkIG9uIGN1cnJlbnQgc2hvcnRzbG90IG1vZGUgKi8KLQlGT1JFQUNIX0JTUyh3bGMsIGlkeCwgY2ZnKSB7Ci0JCWlmICghY2ZnLT5hc3NvY2lhdGVkKQotCQkJY29udGludWU7Ci0JCWNmZy0+Y3VycmVudF9ic3MtPmNhcGFiaWxpdHkgJj0KLQkJCQkJfldMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UX1RJTUU7Ci0JCWlmICh3bGMtPnNob3J0c2xvdCkKLQkJCWNmZy0+Y3VycmVudF9ic3MtPmNhcGFiaWxpdHkgfD0KLQkJCQkJV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1RfVElNRTsKLQl9Ci0KLQlicmNtc19iX3NldF9zaG9ydHNsb3Qod2xjLT5odywgc2hvcnRzbG90KTsKLX0KLQotc3RhdGljIHU4IGJyY21zX2NfbG9jYWxfY29uc3RyYWludF9xZGJtKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQl1OCBsb2NhbDsKLQlzMTYgbG9jYWxfbWF4OwotCi0JbG9jYWwgPSBCUkNNU19UWFBXUl9NQVg7Ci0JaWYgKHdsYy0+cHViLT5hc3NvY2lhdGVkICYmCi0JICAgIChicmNtdV9jaHNwZWNfY3RsY2hhbih3bGMtPmNoYW5zcGVjKSA9PQotCSAgICAgYnJjbXVfY2hzcGVjX2N0bGNoYW4od2xjLT5ob21lX2NoYW5zcGVjKSkpIHsKLQotCQkvKiBnZXQgdGhlIGxvY2FsIHBvd2VyIGNvbnN0cmFpbnQgaWYgd2UgYXJlIG9uIHRoZSBBUCdzCi0JCSAqIGNoYW5uZWwgWzgwMi4xMWgsIDcuMy4yLjEzXQotCQkgKi8KLQkJLyogQ2xhbXAgdGhlIHZhbHVlIGJldHdlZW4gMCBhbmQgQlJDTVNfVFhQV1JfTUFYIHcvbwotCQkgKiBvdmVyZmxvd2luZyB0aGUgdGFyZ2V0ICovCi0JCWxvY2FsX21heCA9Ci0JCSAgICAod2xjLT50eHB3cl9sb2NhbF9tYXggLQotCQkgICAgIHdsYy0+dHhwd3JfbG9jYWxfY29uc3RyYWludCkgKiBCUkNNU19UWFBXUl9EQl9GQUNUT1I7Ci0JCWlmIChsb2NhbF9tYXggPiAwICYmIGxvY2FsX21heCA8IEJSQ01TX1RYUFdSX01BWCkKLQkJCXJldHVybiAodTgpIGxvY2FsX21heDsKLQkJaWYgKGxvY2FsX21heCA8IDApCi0JCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gbG9jYWw7Ci19Ci0KLS8qIHByb3BhZ2F0ZSBob21lIGNoYW5zcGVjIHRvIGFsbCBic3NjZmdzIGluIGNhc2UgYnNzY2ZnLT5jdXJyZW50X2Jzcy0+Y2hhbnNwZWMgaXMgcmVmZXJlbmNlZCAqLwotdm9pZCBicmNtc19jX3NldF9ob21lX2NoYW5zcGVjKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgY2hhbnNwZWNfdCBjaGFuc3BlYykKLXsKLQlpZiAod2xjLT5ob21lX2NoYW5zcGVjICE9IGNoYW5zcGVjKSB7Ci0JCWludCBpZHg7Ci0JCXN0cnVjdCBicmNtc19ic3NfY2ZnICpjZmc7Ci0KLQkJd2xjLT5ob21lX2NoYW5zcGVjID0gY2hhbnNwZWM7Ci0KLQkJRk9SRUFDSF9CU1Mod2xjLCBpZHgsIGNmZykgewotCQkJaWYgKCFjZmctPmFzc29jaWF0ZWQpCi0JCQkJY29udGludWU7Ci0KLQkJCWNmZy0+Y3VycmVudF9ic3MtPmNoYW5zcGVjID0gY2hhbnNwZWM7Ci0JCX0KLQotCX0KLX0KLQotc3RhdGljIHZvaWQgYnJjbXNfY19zZXRfcGh5X2NoYW5zcGVjKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywKLQkJCQkgICAgIGNoYW5zcGVjX3QgY2hhbnNwZWMpCi17Ci0JLyogU2F2ZSBvdXIgY29weSBvZiB0aGUgY2hhbnNwZWMgKi8KLQl3bGMtPmNoYW5zcGVjID0gY2hhbnNwZWM7Ci0KLQkvKiBTZXQgdGhlIGNoYW5zcGVjIGFuZCBwb3dlciBsaW1pdHMgZm9yIHRoaXMgbG9jYWxlIGFmdGVyIGNvbXB1dGluZwotCSAqIGFueSAxMWggbG9jYWwgdHggcG93ZXIgY29uc3RyYWludHMuCi0JICovCi0JYnJjbXNfY19jaGFubmVsX3NldF9jaGFuc3BlYyh3bGMtPmNtaSwgY2hhbnNwZWMsCi0JCQkJIGJyY21zX2NfbG9jYWxfY29uc3RyYWludF9xZGJtKHdsYykpOwotCi0JaWYgKHdsYy0+c3RmLT5zc19hbGdvc2VsX2F1dG8pCi0JCWJyY21zX2Nfc3RmX3NzX2FsZ29fY2hhbm5lbF9nZXQod2xjLCAmd2xjLT5zdGYtPnNzX2FsZ29fY2hhbm5lbCwKLQkJCQkJICAgIGNoYW5zcGVjKTsKLQotCWJyY21zX2Nfc3RmX3NzX3VwZGF0ZSh3bGMsIHdsYy0+YmFuZCk7Ci0KLX0KLQotdm9pZCBicmNtc19jX3NldF9jaGFuc3BlYyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGNoYW5zcGVjX3QgY2hhbnNwZWMpCi17Ci0JdWludCBiYW5kdW5pdDsKLQlib29sIHN3aXRjaGJhbmQgPSBmYWxzZTsKLQljaGFuc3BlY190IG9sZF9jaGFuc3BlYyA9IHdsYy0+Y2hhbnNwZWM7Ci0KLQlpZiAoIWJyY21zX2NfdmFsaWRfY2hhbnNwZWNfZGIod2xjLT5jbWksIGNoYW5zcGVjKSkgewotCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIndsJWQ6ICVzOiBCYWQgY2hhbm5lbCAlZFxuIiwKLQkJCSAgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBDSFNQRUNfQ0hBTk5FTChjaGFuc3BlYykpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogU3dpdGNoIGJhbmRzIGlmIG5lY2Vzc2FyeSAqLwotCWlmIChOQkFORFMod2xjKSA+IDEpIHsKLQkJYmFuZHVuaXQgPSBDSFNQRUNfQkFORFVOSVQoY2hhbnNwZWMpOwotCQlpZiAod2xjLT5iYW5kLT5iYW5kdW5pdCAhPSBiYW5kdW5pdCB8fCB3bGMtPmJhbmRpbml0X3BlbmRpbmcpIHsKLQkJCXN3aXRjaGJhbmQgPSB0cnVlOwotCQkJaWYgKHdsYy0+YmFuZGxvY2tlZCkgewotCQkJCXdpcGh5X2Vycih3bGMtPndpcGh5LCAid2wlZDogJXM6IGNoc3BlYyAlZCAiCi0JCQkJCSAgImJhbmQgaXMgbG9ja2VkIVxuIiwKLQkJCQkJICB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sCi0JCQkJCSAgQ0hTUEVDX0NIQU5ORUwoY2hhbnNwZWMpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvKgotCQkJICogc2hvdWxkIHRoZSBzZXRiYW5kIGNhbGwgY29tZSBhZnRlciB0aGUKLQkJCSAqIGJyY21zX2JfY2hhbnNwZWMoKSA/IGlmIHRoZSBzZXRiYW5kIHVwZGF0ZXMKLQkJCSAqIChicmNtc19jX2JzaW5pdCkgdXNlIGxvdyBsZXZlbCBjYWxscyB0byBpbnNwZWN0IGFuZAotCQkJICogc2V0IHN0YXRlLCB0aGUgc3RhdGUgaW5zcGVjdGVkIG1heSBiZSBmcm9tIHRoZSB3cm9uZwotCQkJICogYmFuZCwgb3IgdGhlIGZvbGxvd2luZyBicmNtc19iX3NldF9jaGFuc3BlYygpIG1heQotCQkJICogdW5kbyB0aGUgd29yay4KLQkJCSAqLwotCQkJYnJjbXNfY19zZXRiYW5kKHdsYywgYmFuZHVuaXQpOwotCQl9Ci0JfQotCi0JLyogc3luYyB1cCBwaHkvcmFkaW8gY2hhbnNwZWMgKi8KLQlicmNtc19jX3NldF9waHlfY2hhbnNwZWMod2xjLCBjaGFuc3BlYyk7Ci0KLQkvKiBpbml0IGFudGVubmEgc2VsZWN0aW9uICovCi0JaWYgKENIU1BFQ19XTENfQlcob2xkX2NoYW5zcGVjKSAhPSBDSFNQRUNfV0xDX0JXKGNoYW5zcGVjKSkgewotCQlicmNtc19jX2FudHNlbF9pbml0KHdsYy0+YXNpKTsKLQotCQkvKiBGaXggdGhlIGhhcmR3YXJlIHJhdGVzZXQgYmFzZWQgb24gYncuCi0JCSAqIE1haW5seSBhZGQgTUNTMzIgZm9yIDQwTWh6LCByZW1vdmUgTUNTIDMyIGZvciAyME1oegotCQkgKi8KLQkJYnJjbXNfY19yYXRlc2V0X2J3X21jc19maWx0ZXIoJndsYy0+YmFuZC0+aHdfcmF0ZXNldCwKLQkJCQkJICB3bGMtPmJhbmQtPgotCQkJCQkgIG1pbW9fY2FwXzQwID8gQ0hTUEVDX1dMQ19CVyhjaGFuc3BlYykKLQkJCQkJICA6IDApOwotCX0KLQotCS8qIHVwZGF0ZSBzb21lIG1hYyBjb25maWd1cmF0aW9uIHNpbmNlIGNoYW5zcGVjIGNoYW5nZWQgKi8KLQlicmNtc19jX3Vjb2RlX21hY191cGQod2xjKTsKLX0KLQotcmF0ZXNwZWNfdCBicmNtc19jX2xvd2VzdF9iYXNpY19yc3BlYyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsCi0JCQkJICAgICAgd2xjX3JhdGVzZXRfdCAqcnMpCi17Ci0JcmF0ZXNwZWNfdCBsb3dlc3RfYmFzaWNfcnNwZWM7Ci0JdWludCBpOwotCi0JLyogVXNlIHRoZSBsb3dlc3QgYmFzaWMgcmF0ZSAqLwotCWxvd2VzdF9iYXNpY19yc3BlYyA9IHJzLT5yYXRlc1swXSAmIEJSQ01TX1JBVEVfTUFTSzsKLQlmb3IgKGkgPSAwOyBpIDwgcnMtPmNvdW50OyBpKyspIHsKLQkJaWYgKHJzLT5yYXRlc1tpXSAmIEJSQ01TX1JBVEVfRkxBRykgewotCQkJbG93ZXN0X2Jhc2ljX3JzcGVjID0gcnMtPnJhdGVzW2ldICYgQlJDTVNfUkFURV9NQVNLOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0jaWYgTkNPTkYKLQkvKiBwaWNrIHNpc28vY2RkIGFzIGRlZmF1bHQgZm9yIE9GRE0gKG5vdGUgbm8gYmFzaWMgcmF0ZSBNQ1NzIGFyZSBzdXBwb3J0ZWQgeWV0KSAqLwotCWlmIChJU19PRkRNKGxvd2VzdF9iYXNpY19yc3BlYykpIHsKLQkJbG93ZXN0X2Jhc2ljX3JzcGVjIHw9ICh3bGMtPnN0Zi0+c3Nfb3Btb2RlIDw8IFJTUEVDX1NURl9TSElGVCk7Ci0JfQotI2VuZGlmCi0KLQlyZXR1cm4gbG93ZXN0X2Jhc2ljX3JzcGVjOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIHBoeXR4Y3RsIGZvciBiZWFjb24gYmFzZWQgb24gY3VycmVudCBiZWFjb24gcmF0ZXNwZWMgQU5EIHR4YW50Ci0gKiBzZXR0aW5nIGFzIHBlciB0aGlzIHRhYmxlOgotICogIHJhdGVzcGVjICAgICBDQ0sJCWFudCA9IHdsYy0+c3RmLT50eGFudAotICoJCU9GRE0JCWFudCA9IDMKLSAqLwotdm9pZCBicmNtc19jX2JlYWNvbl9waHl0eGN0bF90eGFudF91cGQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJCSAgICAgICByYXRlc3BlY190IGJjbl9yc3BlYykKLXsKLQl1MTYgcGh5Y3RsOwotCXUxNiBwaHl0eGFudCA9IHdsYy0+c3RmLT5waHl0eGFudDsKLQl1MTYgbWFzayA9IFBIWV9UWENfQU5UX01BU0s7Ci0KLQkvKiBmb3Igbm9uLXNpc28gcmF0ZXMgb3IgZGVmYXVsdCBzZXR0aW5nLCB1c2UgdGhlIGF2YWlsYWJsZSBjaGFpbnMgKi8KLQlpZiAoQlJDTVNfUEhZXzExTl9DQVAod2xjLT5iYW5kKSkKLQkJcGh5dHhhbnQgPSBicmNtc19jX3N0Zl9waHl0eGNoYWluX3NlbCh3bGMsIGJjbl9yc3BlYyk7Ci0KLQlwaHljdGwgPSBicmNtc19jX3JlYWRfc2htKHdsYywgTV9CQ05fUENUTFdEKTsKLQlwaHljdGwgPSAocGh5Y3RsICYgfm1hc2spIHwgcGh5dHhhbnQ7Ci0JYnJjbXNfY193cml0ZV9zaG0od2xjLCBNX0JDTl9QQ1RMV0QsIHBoeWN0bCk7Ci19Ci0KLS8qIGNlbnRyYWxpemVkIHByb3RlY3Rpb24gY29uZmlnIGNoYW5nZSBmdW5jdGlvbiB0byBzaW1wbGlmeSBkZWJ1Z2dpbmcsIG5vIGNvbnNpc3RlbmN5IGNoZWNraW5nCi0gKiB0aGlzIHNob3VsZCBiZSBjYWxsZWQgb25seSBvbiBjaGFuZ2VzIHRvIGF2b2lkIG92ZXJoZWFkIGluIHBlcmlvZGljIGZ1bmN0aW9uCi0qLwotdm9pZCBicmNtc19jX3Byb3RlY3Rpb25fdXBkKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdWludCBpZHgsIGludCB2YWwpCi17Ci0JQkNNTVNHKHdsYy0+d2lwaHksICJpZHggJWQsIHZhbCAlZFxuIiwgaWR4LCB2YWwpOwotCi0Jc3dpdGNoIChpZHgpIHsKLQljYXNlIEJSQ01TX1BST1RfR19TUEVDOgotCQl3bGMtPnByb3RlY3Rpb24tPl9nID0gKGJvb2wpIHZhbDsKLQkJYnJlYWs7Ci0JY2FzZSBCUkNNU19QUk9UX0dfT1ZSOgotCQl3bGMtPnByb3RlY3Rpb24tPmdfb3ZlcnJpZGUgPSAoczgpIHZhbDsKLQkJYnJlYWs7Ci0JY2FzZSBCUkNNU19QUk9UX0dfVVNFUjoKLQkJd2xjLT5wcm90ZWN0aW9uLT5nbW9kZV91c2VyID0gKHU4KSB2YWw7Ci0JCWJyZWFrOwotCWNhc2UgQlJDTVNfUFJPVF9PVkVSTEFQOgotCQl3bGMtPnByb3RlY3Rpb24tPm92ZXJsYXAgPSAoczgpIHZhbDsKLQkJYnJlYWs7Ci0JY2FzZSBCUkNNU19QUk9UX05fVVNFUjoKLQkJd2xjLT5wcm90ZWN0aW9uLT5ubW9kZV91c2VyID0gKHM4KSB2YWw7Ci0JCWJyZWFrOwotCWNhc2UgQlJDTVNfUFJPVF9OX0NGRzoKLQkJd2xjLT5wcm90ZWN0aW9uLT5uX2NmZyA9IChzOCkgdmFsOwotCQlicmVhazsKLQljYXNlIEJSQ01TX1BST1RfTl9DRkdfT1ZSOgotCQl3bGMtPnByb3RlY3Rpb24tPm5fY2ZnX292ZXJyaWRlID0gKHM4KSB2YWw7Ci0JCWJyZWFrOwotCWNhc2UgQlJDTVNfUFJPVF9OX05PTkdGOgotCQl3bGMtPnByb3RlY3Rpb24tPm5vbmdmID0gKGJvb2wpIHZhbDsKLQkJYnJlYWs7Ci0JY2FzZSBCUkNNU19QUk9UX05fTk9OR0ZfT1ZSOgotCQl3bGMtPnByb3RlY3Rpb24tPm5vbmdmX292ZXJyaWRlID0gKHM4KSB2YWw7Ci0JCWJyZWFrOwotCWNhc2UgQlJDTVNfUFJPVF9OX1BBTV9PVlI6Ci0JCXdsYy0+cHJvdGVjdGlvbi0+bl9wYW1fb3ZlcnJpZGUgPSAoczgpIHZhbDsKLQkJYnJlYWs7Ci0JY2FzZSBCUkNNU19QUk9UX05fT0JTUzoKLQkJd2xjLT5wcm90ZWN0aW9uLT5uX29ic3MgPSAoYm9vbCkgdmFsOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotfQotCi1zdGF0aWMgdm9pZCBicmNtc19jX2h0X3VwZGF0ZV9zZ2lfcngoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBpbnQgdmFsKQotewotCXdsYy0+aHRfY2FwLmNhcF9pbmZvICY9IH4oSUVFRTgwMjExX0hUX0NBUF9TR0lfMjAgfAotCQkJCQlJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCk7Ci0Jd2xjLT5odF9jYXAuY2FwX2luZm8gfD0gKHZhbCAmIEJSQ01TX05fU0dJXzIwKSA/Ci0JCQkJCUlFRUU4MDIxMV9IVF9DQVBfU0dJXzIwIDogMDsKLQl3bGMtPmh0X2NhcC5jYXBfaW5mbyB8PSAodmFsICYgQlJDTVNfTl9TR0lfNDApID8KLQkJCQkJSUVFRTgwMjExX0hUX0NBUF9TR0lfNDAgOiAwOwotCi0JaWYgKHdsYy0+cHViLT51cCkgewotCQlicmNtc19jX3VwZGF0ZV9iZWFjb24od2xjKTsKLQkJYnJjbXNfY191cGRhdGVfcHJvYmVfcmVzcCh3bGMsIHRydWUpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYnJjbXNfY19odF91cGRhdGVfbGRwYyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHM4IHZhbCkKLXsKLQl3bGMtPnN0Zi0+bGRwYyA9IHZhbDsKLQotCXdsYy0+aHRfY2FwLmNhcF9pbmZvICY9IH5JRUVFODAyMTFfSFRfQ0FQX0xEUENfQ09ESU5HOwotCWlmICh3bGMtPnN0Zi0+bGRwYyAhPSBPRkYpCi0JCXdsYy0+aHRfY2FwLmNhcF9pbmZvIHw9IElFRUU4MDIxMV9IVF9DQVBfTERQQ19DT0RJTkc7Ci0KLQlpZiAod2xjLT5wdWItPnVwKSB7Ci0JCWJyY21zX2NfdXBkYXRlX2JlYWNvbih3bGMpOwotCQlicmNtc19jX3VwZGF0ZV9wcm9iZV9yZXNwKHdsYywgdHJ1ZSk7Ci0JCXdsY19waHlfbGRwY19vdmVycmlkZV9zZXQod2xjLT5iYW5kLT5waSwgKHZhbCA/IHRydWUgOiBmYWxzZSkpOwotCX0KLX0KLQotLyoKLSAqIHVjb2RlLCBod21hYyB1cGRhdGUKLSAqICAgIENoYW5uZWwgZGVwZW5kZW50IHVwZGF0ZXMgZm9yIHVjb2RlIGFuZCBodwotICovCi1zdGF0aWMgdm9pZCBicmNtc19jX3Vjb2RlX21hY191cGQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCS8qIGVuYWJsZSBvciBkaXNhYmxlIGFueSBhY3RpdmUgSUJTU3MgZGVwZW5kaW5nIG9uIHdoZXRoZXIgb3Igbm90Ci0JICogd2UgYXJlIG9uIHRoZSBob21lIGNoYW5uZWwKLQkgKi8KLQlpZiAod2xjLT5ob21lX2NoYW5zcGVjID09IEJSQ01TX0JBTkRfUElfUkFESU9fQ0hBTlNQRUMpIHsKLQkJaWYgKHdsYy0+cHViLT5hc3NvY2lhdGVkKSB7Ci0JCQkvKiBCTUFDX05PVEU6IFRoaXMgaXMgc29tZXRoaW5nIHRoYXQgc2hvdWxkIGJlIGZpeGVkIGluIHVjb2RlIGluaXRzLgotCQkJICogSSB0aGluayB0aGF0IHRoZSB1Y29kZSBpbml0cyBzZXQgdXAgdGhlIGJjbiB0ZW1wbGF0ZXMgYW5kIHNobSB2YWx1ZXMKLQkJCSAqIHdpdGggYSBib2d1cyBiZWFjb24uIFRoaXMgc2hvdWxkIG5vdCBiZSBkb25lIGluIHRoZSBpbml0cy4gSWYgdWNvZGUgbmVlZHMKLQkJCSAqIHRvIHNldCB1cCBhIGJlYWNvbiBmb3IgdGVzdGluZywgdGhlIHRlc3Qgcm91dGluZXMgc2hvdWxkIHdyaXRlIGl0IGRvd24sCi0JCQkgKiBub3QgZXhwZWN0IHRoZSBpbml0cyB0byBwb3B1bGF0ZSBhIGJvZ3VzIGJlYWNvbi4KLQkJCSAqLwotCQkJaWYgKEJSQ01TX1BIWV8xMU5fQ0FQKHdsYy0+YmFuZCkpIHsKLQkJCQlicmNtc19jX3dyaXRlX3NobSh3bGMsIE1fQkNOX1RYVFNGX09GRlNFVCwKLQkJCQkJICAgICAgd2xjLT5iYW5kLT5iY250c2ZvZmYpOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJLyogZGlzYWJsZSBhbiBhY3RpdmUgSUJTUyBpZiB3ZSBhcmUgbm90IG9uIHRoZSBob21lIGNoYW5uZWwgKi8KLQl9Ci0KLQkvKiB1cGRhdGUgdGhlIHZhcmlvdXMgcHJvbWlzYyBiaXRzICovCi0JYnJjbXNfY19tYWNfYmNuX3Byb21pc2Mod2xjKTsKLQlicmNtc19jX21hY19wcm9taXNjKHdsYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21zX2NfYmFuZGluaXRfb3JkZXJlZChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsCi0JCQkJICAgICBjaGFuc3BlY190IGNoYW5zcGVjKQotewotCXdsY19yYXRlc2V0X3QgZGVmYXVsdF9yYXRlc2V0OwotCXVpbnQgcGFya2JhbmQ7Ci0JdWludCBpLCBiYW5kX29yZGVyWzJdOwotCi0JQkNNTVNHKHdsYy0+d2lwaHksICJ3bCVkXG4iLCB3bGMtPnB1Yi0+dW5pdCk7Ci0JLyoKLQkgKiBXZSBtaWdodCBoYXZlIGJlZW4gYmFuZGxvY2tlZCBkdXJpbmcgZG93biBhbmQgdGhlIGNoaXAgcG93ZXItY3ljbGVkIChoaWJlcm5hdGUpLgotCSAqIGZpZ3VyZSBvdXQgdGhlIHJpZ2h0IGJhbmQgdG8gcGFyayBvbgotCSAqLwotCWlmICh3bGMtPmJhbmRsb2NrZWQgfHwgTkJBTkRTKHdsYykgPT0gMSkgewotCQkvKiB1cGRhdGVkIGluIGJyY21zX2NfYmFuZGxvY2soKSAqLwotCQlwYXJrYmFuZCA9IHdsYy0+YmFuZC0+YmFuZHVuaXQ7Ci0JCWJhbmRfb3JkZXJbMF0gPSBiYW5kX29yZGVyWzFdID0gcGFya2JhbmQ7Ci0JfSBlbHNlIHsKLQkJLyogcGFyayBvbiB0aGUgYmFuZCBvZiB0aGUgc3BlY2lmaWVkIGNoYW5zcGVjICovCi0JCXBhcmtiYW5kID0gQ0hTUEVDX0JBTkRVTklUKGNoYW5zcGVjKTsKLQotCQkvKiBvcmRlciBzbyB0aGF0IHBhcmtiYW5kIGluaXRpYWxpemUgbGFzdCAqLwotCQliYW5kX29yZGVyWzBdID0gcGFya2JhbmQgXiAxOwotCQliYW5kX29yZGVyWzFdID0gcGFya2JhbmQ7Ci0JfQotCi0JLyogbWFrZSBlYWNoIGJhbmQgb3BlcmF0aW9uYWwsIHNvZnR3YXJlIHN0YXRlIGluaXQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTkJBTkRTKHdsYyk7IGkrKykgewotCQl1aW50IGogPSBiYW5kX29yZGVyW2ldOwotCi0JCXdsYy0+YmFuZCA9IHdsYy0+YmFuZHN0YXRlW2pdOwotCi0JCWJyY21zX2RlZmF1bHRfcmF0ZXNldCh3bGMsICZkZWZhdWx0X3JhdGVzZXQpOwotCi0JCS8qIGZpbGwgaW4gaHdfcmF0ZSAqLwotCQlicmNtc19jX3JhdGVzZXRfZmlsdGVyKCZkZWZhdWx0X3JhdGVzZXQsICZ3bGMtPmJhbmQtPmh3X3JhdGVzZXQsCi0JCQkJICAgZmFsc2UsIEJSQ01TX1JBVEVTX0NDS19PRkRNLCBCUkNNU19SQVRFX01BU0ssCi0JCQkJICAgKGJvb2wpIE5fRU5BQih3bGMtPnB1YikpOwotCi0JCS8qIGluaXQgYmFzaWMgcmF0ZSBsb29rdXAgKi8KLQkJYnJjbXNfY19yYXRlX2xvb2t1cF9pbml0KHdsYywgJmRlZmF1bHRfcmF0ZXNldCk7Ci0JfQotCi0JLyogc3luYyB1cCBwaHkvcmFkaW8gY2hhbnNwZWMgKi8KLQlicmNtc19jX3NldF9waHlfY2hhbnNwZWMod2xjLCBjaGFuc3BlYyk7Ci19Ci0KLS8qIGJhbmQtc3BlY2lmaWMgaW5pdCAqLwotc3RhdGljIHZvaWQgYnJjbXNfY19ic2luaXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZDogYmFuZHVuaXQgJWRcbiIsCi0JCSB3bGMtPnB1Yi0+dW5pdCwgd2xjLT5iYW5kLT5iYW5kdW5pdCk7Ci0KLQkvKiB3cml0ZSB1Y29kZSBBQ0svQ1RTIHJhdGUgdGFibGUgKi8KLQlicmNtc19jX3NldF9yYXRldGFibGUod2xjKTsKLQotCS8qIHVwZGF0ZSBzb21lIGJhbmQgc3BlY2lmaWMgbWFjIGNvbmZpZ3VyYXRpb24gKi8KLQlicmNtc19jX3Vjb2RlX21hY191cGQod2xjKTsKLQotCS8qIGluaXQgYW50ZW5uYSBzZWxlY3Rpb24gKi8KLQlicmNtc19jX2FudHNlbF9pbml0KHdsYy0+YXNpKTsKLQotfQotCi0vKiBzd2l0Y2ggdG8gYW5kIGluaXRpYWxpemUgbmV3IGJhbmQgKi8KLXN0YXRpYyB2b2lkIGJyY21zX2Nfc2V0YmFuZChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsCi0JCQkJCSAgIHVpbnQgYmFuZHVuaXQpCi17Ci0JaW50IGlkeDsKLQlzdHJ1Y3QgYnJjbXNfYnNzX2NmZyAqY2ZnOwotCi0Jd2xjLT5iYW5kID0gd2xjLT5iYW5kc3RhdGVbYmFuZHVuaXRdOwotCi0JaWYgKCF3bGMtPnB1Yi0+dXApCi0JCXJldHVybjsKLQotCS8qIHdhaXQgZm9yIGF0IGxlYXN0IG9uZSBiZWFjb24gYmVmb3JlIGVudGVyaW5nIHNsZWVwaW5nIHN0YXRlICovCi0JZm9yIChpZHggPSAwOyBpZHggPCBCUkNNU19NQVhCU1NDRkc7IGlkeCsrKSB7Ci0JCWNmZyA9IHdsYy0+YnNzY2ZnW2lkeF07Ci0JCWlmIChjZmcgJiYgQlNTQ0ZHX1NUQShjZmcpICYmIGNmZy0+YXNzb2NpYXRlZCkKLQkJCWNmZy0+UE1hd2FrZWJjbiA9IHRydWU7Ci0JfQotCWJyY21zX2Nfc2V0X3BzX2N0cmwod2xjKTsKLQotCS8qIGJhbmQtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb25zICovCi0JYnJjbXNfY19ic2luaXQod2xjKTsKLX0KLQotLyogSW5pdGlhbGl6ZSBhIFdNRSBQYXJhbWV0ZXIgSW5mbyBFbGVtZW50IHdpdGggZGVmYXVsdCBTVEEgcGFyYW1ldGVycyBmcm9tIFdNTSBTcGVjLCBUYWJsZSAxMiAqLwotdm9pZAotYnJjbXNfY193bWVfaW5pdHBhcmFtc19zdGEoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBzdHJ1Y3Qgd21lX3BhcmFtX2llICpwZSkKLXsKLQlzdGF0aWMgY29uc3Qgc3RydWN0IHdtZV9wYXJhbV9pZSBzdGFkZWYgPSB7Ci0JCVdNRV9PVUksCi0JCVdNRV9UWVBFLAotCQlXTUVfU1VCVFlQRV9QQVJBTV9JRSwKLQkJV01FX1ZFUiwKLQkJMCwKLQkJMCwKLQkJewotCQkge0VEQ0ZfQUNfQkVfQUNJX1NUQSwgRURDRl9BQ19CRV9FQ1dfU1RBLAotCQkgIGNwdV90b19sZTE2KEVEQ0ZfQUNfQkVfVFhPUF9TVEEpfSwKLQkJIHtFRENGX0FDX0JLX0FDSV9TVEEsIEVEQ0ZfQUNfQktfRUNXX1NUQSwKLQkJICBjcHVfdG9fbGUxNihFRENGX0FDX0JLX1RYT1BfU1RBKX0sCi0JCSB7RURDRl9BQ19WSV9BQ0lfU1RBLCBFRENGX0FDX1ZJX0VDV19TVEEsCi0JCSAgY3B1X3RvX2xlMTYoRURDRl9BQ19WSV9UWE9QX1NUQSl9LAotCQkge0VEQ0ZfQUNfVk9fQUNJX1NUQSwgRURDRl9BQ19WT19FQ1dfU1RBLAotCQkgIGNwdV90b19sZTE2KEVEQ0ZfQUNfVk9fVFhPUF9TVEEpfQotCQkgfQotCX07Ci0JbWVtY3B5KHBlLCAmc3RhZGVmLCBzaXplb2YoKnBlKSk7Ci19Ci0KLXZvaWQgYnJjbXNfY193bWVfc2V0cGFyYW1zKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdTE2IGFjaSwKLQkJICAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zICpwYXJhbXMsCi0JCSAgICAgICBib29sIHN1c3BlbmQpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHNobV9hY3BhcmFtcyBhY3Bfc2htOwotCXUxNiAqc2htX2VudHJ5OwotCi0JLyogT25seSBhcHBseSBwYXJhbXMgaWYgdGhlIGNvcmUgaXMgb3V0IG9mIHJlc2V0IGFuZCBoYXMgY2xvY2tzICovCi0JaWYgKCF3bGMtPmNsaykgewotCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIndsJWQ6ICVzIDogbm8tY2xvY2tcbiIsIHdsYy0+cHViLT51bml0LAotCQkJICBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlkbyB7Ci0JCW1lbXNldCgoY2hhciAqKSZhY3Bfc2htLCAwLCBzaXplb2Yoc3RydWN0IHNobV9hY3BhcmFtcykpOwotCQkvKiBmaWxsIGluIHNobSBhYyBwYXJhbXMgc3RydWN0ICovCi0JCWFjcF9zaG0udHhvcCA9IGxlMTZfdG9fY3B1KHBhcmFtcy0+dHhvcCk7Ci0JCS8qIGNvbnZlcnQgZnJvbSB1bml0cyBvZiAzMnVzIHRvIHVzIGZvciB1Y29kZSAqLwotCQl3bGMtPmVkY2ZfdHhvcFthY2kgJiAweDNdID0gYWNwX3NobS50eG9wID0KLQkJICAgIEVEQ0ZfVFhPUDJVU0VDKGFjcF9zaG0udHhvcCk7Ci0JCWFjcF9zaG0uYWlmcyA9IChwYXJhbXMtPmFpZnMgJiBFRENGX0FJRlNOX01BU0spOwotCi0JCWlmIChhY2kgPT0gQUNfVkkgJiYgYWNwX3NobS50eG9wID09IDAKLQkJICAgICYmIGFjcF9zaG0uYWlmcyA8IEVEQ0ZfQUlGU05fTUFYKQotCQkJYWNwX3NobS5haWZzKys7Ci0KLQkJaWYgKGFjcF9zaG0uYWlmcyA8IEVEQ0ZfQUlGU05fTUlOCi0JCSAgICB8fCBhY3Bfc2htLmFpZnMgPiBFRENGX0FJRlNOX01BWCkgewotCQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICJ3bCVkOiBlZGNmX3NldHBhcmFtczogYmFkICIKLQkJCQkgICJhaWZzICVkXG4iLCB3bGMtPnB1Yi0+dW5pdCwgYWNwX3NobS5haWZzKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJYWNwX3NobS5jd21pbiA9IHBhcmFtcy0+Y3dfbWluOwotCQlhY3Bfc2htLmN3bWF4ID0gcGFyYW1zLT5jd19tYXg7Ci0JCWFjcF9zaG0uY3djdXIgPSBhY3Bfc2htLmN3bWluOwotCQlhY3Bfc2htLmJzbG90cyA9Ci0JCSAgICBSX1JFRygmd2xjLT5yZWdzLT50c2ZfcmFuZG9tKSAmIGFjcF9zaG0uY3djdXI7Ci0JCWFjcF9zaG0ucmVnZ2FwID0gYWNwX3NobS5ic2xvdHMgKyBhY3Bfc2htLmFpZnM7Ci0JCS8qIEluZGljYXRlIHRoZSBuZXcgcGFyYW1zIHRvIHRoZSB1Y29kZSAqLwotCQlhY3Bfc2htLnN0YXR1cyA9IGJyY21zX2NfcmVhZF9zaG0od2xjLCAoTV9FRENGX1FJTkZPICsKLQkJCQkJCSAgICB3bWVfc2htZW1hY2luZGV4KGFjaSkgKgotCQkJCQkJICAgIE1fRURDRl9RTEVOICsKLQkJCQkJCSAgICBNX0VEQ0ZfU1RBVFVTX09GRikpOwotCQlhY3Bfc2htLnN0YXR1cyB8PSBXTUVfU1RBVFVTX05FV0FDOwotCi0JCS8qIEZpbGwgaW4gc2htIGFjcGFyYW0gdGFibGUgKi8KLQkJc2htX2VudHJ5ID0gKHUxNiAqKSAmYWNwX3NobTsKLQkJZm9yIChpID0gMDsgaSA8IChpbnQpc2l6ZW9mKHN0cnVjdCBzaG1fYWNwYXJhbXMpOyBpICs9IDIpCi0JCQlicmNtc19jX3dyaXRlX3NobSh3bGMsCi0JCQkJICAgICAgTV9FRENGX1FJTkZPICsKLQkJCQkgICAgICB3bWVfc2htZW1hY2luZGV4KGFjaSkgKiBNX0VEQ0ZfUUxFTiArIGksCi0JCQkJICAgICAgKnNobV9lbnRyeSsrKTsKLQotCX0gd2hpbGUgKDApOwotCi0JaWYgKHN1c3BlbmQpCi0JCWJyY21zX2Nfc3VzcGVuZF9tYWNfYW5kX3dhaXQod2xjKTsKLQotCWlmIChzdXNwZW5kKQotCQlicmNtc19jX2VuYWJsZV9tYWMod2xjKTsKLQotfQotCi12b2lkIGJyY21zX2NfZWRjZl9zZXRwYXJhbXMoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBib29sIHN1c3BlbmQpCi17Ci0JdTE2IGFjaTsKLQlpbnQgaV9hYzsKLQlzdHJ1Y3QgZWRjZl9hY3BhcmFtICplZGNmX2FjcDsKLQotCXN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zIHR4cV9wYXJzOwotCXN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zICpwYXJhbXMgPSAmdHhxX3BhcnM7Ci0KLQkvKgotCSAqIEFQIHVzZXMgQUMgcGFyYW1zIGZyb20gd21lX3BhcmFtX2llX2FwLgotCSAqIEFQIGFkdmVydGlzZXMgQUMgcGFyYW1zIGZyb20gd21lX3BhcmFtX2llLgotCSAqIFNUQSB1c2VzIEFDIHBhcmFtcyBmcm9tIHdtZV9wYXJhbV9pZS4KLQkgKi8KLQotCWVkY2ZfYWNwID0gKHN0cnVjdCBlZGNmX2FjcGFyYW0gKikgJndsYy0+d21lX3BhcmFtX2llLmFjcGFyYW1bMF07Ci0KLQlmb3IgKGlfYWMgPSAwOyBpX2FjIDwgQUNfQ09VTlQ7IGlfYWMrKywgZWRjZl9hY3ArKykgewotCQkvKiBmaW5kIG91dCB3aGljaCBhYyB0aGlzIHNldCBvZiBwYXJhbXMgYXBwbGllcyB0byAqLwotCQlhY2kgPSAoZWRjZl9hY3AtPkFDSSAmIEVEQ0ZfQUNJX01BU0spID4+IEVEQ0ZfQUNJX1NISUZUOwotCi0JCS8qIGZpbGwgaW4gc2htIGFjIHBhcmFtcyBzdHJ1Y3QgKi8KLQkJcGFyYW1zLT50eG9wID0gZWRjZl9hY3AtPlRYT1A7Ci0JCXBhcmFtcy0+YWlmcyA9IGVkY2ZfYWNwLT5BQ0k7Ci0KLQkJLyogQ1dtaW4gPSAyXihFQ1dtaW4pIC0gMSAqLwotCQlwYXJhbXMtPmN3X21pbiA9IEVEQ0ZfRUNXMkNXKGVkY2ZfYWNwLT5FQ1cgJiBFRENGX0VDV01JTl9NQVNLKTsKLQkJLyogQ1dtYXggPSAyXihFQ1dtYXgpIC0gMSAqLwotCQlwYXJhbXMtPmN3X21heCA9IEVEQ0ZfRUNXMkNXKChlZGNmX2FjcC0+RUNXICYgRURDRl9FQ1dNQVhfTUFTSykKLQkJCQkJICAgID4+IEVEQ0ZfRUNXTUFYX1NISUZUKTsKLQkJYnJjbXNfY193bWVfc2V0cGFyYW1zKHdsYywgYWNpLCBwYXJhbXMsIHN1c3BlbmQpOwotCX0KLQotCWlmIChzdXNwZW5kKQotCQlicmNtc19jX3N1c3BlbmRfbWFjX2FuZF93YWl0KHdsYyk7Ci0KLQlpZiAoQVBfRU5BQih3bGMtPnB1YikgJiYgV01FX0VOQUIod2xjLT5wdWIpKSB7Ci0JCWJyY21zX2NfdXBkYXRlX2JlYWNvbih3bGMpOwotCQlicmNtc19jX3VwZGF0ZV9wcm9iZV9yZXNwKHdsYywgZmFsc2UpOwotCX0KLQotCWlmIChzdXNwZW5kKQotCQlicmNtc19jX2VuYWJsZV9tYWMod2xjKTsKLQotfQotCi1ib29sIGJyY21zX2NfdGltZXJzX2luaXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBpbnQgdW5pdCkKLXsKLQl3bGMtPndkdGltZXIgPSBicmNtc19pbml0X3RpbWVyKHdsYy0+d2wsIGJyY21zX2Nfd2F0Y2hkb2dfYnlfdGltZXIsCi0JCXdsYywgIndhdGNoZG9nIik7Ci0JaWYgKCF3bGMtPndkdGltZXIpIHsKLQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICJ3bCVkOiAgd2xfaW5pdF90aW1lciBmb3Igd2R0aW1lciAiCi0JCQkgICJmYWlsZWRcbiIsIHVuaXQpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0Jd2xjLT5yYWRpb190aW1lciA9IGJyY21zX2luaXRfdGltZXIod2xjLT53bCwgYnJjbXNfY19yYWRpb190aW1lciwKLQkJd2xjLCAicmFkaW8iKTsKLQlpZiAoIXdsYy0+cmFkaW9fdGltZXIpIHsKLQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICJ3bCVkOiAgd2xfaW5pdF90aW1lciBmb3IgcmFkaW9fdGltZXIgIgotCQkJICAiZmFpbGVkXG4iLCB1bml0KTsKLQkJZ290byBmYWlsOwotCX0KLQotCXJldHVybiB0cnVlOwotCi0gZmFpbDoKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qCi0gKiBJbml0aWFsaXplIGJyY21zX2NfaW5mbyBkZWZhdWx0IHZhbHVlcyAuLi4KLSAqIG1heSBnZXQgb3ZlcnJpZGVzIGxhdGVyIGluIHRoaXMgZnVuY3Rpb24KLSAqLwotdm9pZCBicmNtc19jX2luZm9faW5pdChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGludCB1bml0KQotewotCWludCBpOwotCS8qIEFzc3VtZSB0aGUgZGV2aWNlIGlzIHRoZXJlIHVudGlsIHByb3ZlbiBvdGhlcndpc2UgKi8KLQl3bGMtPmRldmljZV9wcmVzZW50ID0gdHJ1ZTsKLQotCS8qIFNhdmUgb3VyIGNvcHkgb2YgdGhlIGNoYW5zcGVjICovCi0Jd2xjLT5jaGFuc3BlYyA9IENIMjBNSFpfQ0hTUEVDKDEpOwotCi0JLyogdmFyaW91cyA4MDIuMTFnIG1vZGVzICovCi0Jd2xjLT5zaG9ydHNsb3QgPSBmYWxzZTsKLQl3bGMtPnNob3J0c2xvdF9vdmVycmlkZSA9IEJSQ01TX1NIT1JUU0xPVF9BVVRPOwotCi0JYnJjbXNfY19wcm90ZWN0aW9uX3VwZCh3bGMsIEJSQ01TX1BST1RfR19PVlIsIEJSQ01TX1BST1RFQ1RJT05fQVVUTyk7Ci0JYnJjbXNfY19wcm90ZWN0aW9uX3VwZCh3bGMsIEJSQ01TX1BST1RfR19TUEVDLCBmYWxzZSk7Ci0KLQlicmNtc19jX3Byb3RlY3Rpb25fdXBkKHdsYywgQlJDTVNfUFJPVF9OX0NGR19PVlIsCi0JCQkgICAgICAgQlJDTVNfUFJPVEVDVElPTl9BVVRPKTsKLQlicmNtc19jX3Byb3RlY3Rpb25fdXBkKHdsYywgQlJDTVNfUFJPVF9OX0NGRywgQlJDTVNfTl9QUk9URUNUSU9OX09GRik7Ci0JYnJjbXNfY19wcm90ZWN0aW9uX3VwZCh3bGMsIEJSQ01TX1BST1RfTl9OT05HRl9PVlIsCi0JCQkgICAgICAgQlJDTVNfUFJPVEVDVElPTl9BVVRPKTsKLQlicmNtc19jX3Byb3RlY3Rpb25fdXBkKHdsYywgQlJDTVNfUFJPVF9OX05PTkdGLCBmYWxzZSk7Ci0JYnJjbXNfY19wcm90ZWN0aW9uX3VwZCh3bGMsIEJSQ01TX1BST1RfTl9QQU1fT1ZSLCBBVVRPKTsKLQotCWJyY21zX2NfcHJvdGVjdGlvbl91cGQod2xjLCBCUkNNU19QUk9UX09WRVJMQVAsCi0JCQkgICAgICAgQlJDTVNfUFJPVEVDVElPTl9DVExfT1ZFUkxBUCk7Ci0KLQkvKiA4MDIuMTFnIGRyYWZ0IDQuMCBOb25FUlAgZWx0IGFkdmVydGlzZW1lbnQgKi8KLQl3bGMtPmluY2x1ZGVfbGVnYWN5X2VycCA9IHRydWU7Ci0KLQl3bGMtPnN0Zi0+YW50X3J4X292ciA9IEFOVF9SWF9ESVZfREVGOwotCXdsYy0+c3RmLT50eGFudCA9IEFOVF9UWF9ERUY7Ci0KLQl3bGMtPnByYl9yZXNwX3RpbWVvdXQgPSBCUkNNU19QUkJfUkVTUF9USU1FT1VUOwotCi0Jd2xjLT51c3JfZnJhZ3RocmVzaCA9IERPVDExX0RFRkFVTFRfRlJBR19MRU47Ci0JZm9yIChpID0gMDsgaSA8IE5GSUZPOyBpKyspCi0JCXdsYy0+ZnJhZ3RocmVzaFtpXSA9IERPVDExX0RFRkFVTFRfRlJBR19MRU47Ci0Jd2xjLT5SVFNUaHJlc2ggPSBET1QxMV9ERUZBVUxUX1JUU19MRU47Ci0KLQkvKiBkZWZhdWx0IHJhdGUgZmFsbGJhY2sgcmV0cnkgbGltaXRzICovCi0Jd2xjLT5TRkJMID0gUkVUUllfU0hPUlRfRkI7Ci0Jd2xjLT5MRkJMID0gUkVUUllfTE9OR19GQjsKLQotCS8qIGRlZmF1bHQgbWFjIHJldHJ5IGxpbWl0cyAqLwotCXdsYy0+U1JMID0gUkVUUllfU0hPUlRfREVGOwotCXdsYy0+TFJMID0gUkVUUllfTE9OR19ERUY7Ci0KLQkvKiBTZXQgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IGh3IGtleXMgc2hvdWxkIGJlIHVzZWQgd2hlbiBhdmFpbGFibGUuICovCi0Jd2xjLT53c2VjX3N3a2V5cyA9IGZhbHNlOwotCi0JLyogaW5pdCB0aGUgNCBzdGF0aWMgV0VQIGRlZmF1bHQga2V5cyAqLwotCWZvciAoaSA9IDA7IGkgPCBXU0VDX01BWF9ERUZBVUxUX0tFWVM7IGkrKykgewotCQl3bGMtPndzZWNfa2V5c1tpXSA9IHdsYy0+d3NlY19kZWZfa2V5c1tpXTsKLQkJd2xjLT53c2VjX2tleXNbaV0tPmlkeCA9ICh1OCkgaTsKLQl9Ci0KLQkvKiBXTUUgUW9TIG1vZGUgaXMgQXV0byBieSBkZWZhdWx0ICovCi0Jd2xjLT5wdWItPl93bWUgPSBBVVRPOwotCi0jaWZkZWYgQkNNU0RJT0RFVl9FTkFCTEVECi0Jd2xjLT5wdWItPl9wcmlvZmMgPSB0cnVlOwkvKiBlbmFibGUgcHJpb3JpdHkgZmxvdyBjb250cm9sIGZvciBzZGlvIGRvbmdsZSAqLwotI2VuZGlmCi0KLQl3bGMtPnB1Yi0+X2FtcGR1ID0gQU1QRFVfQUdHX0hPU1Q7Ci0Jd2xjLT5wdWItPmJjbWVycm9yID0gMDsKLQl3bGMtPnB1Yi0+X2NvZXggPSBPTjsKLQotCS8qIGluaXRpYWxpemUgbXBjIGRlbGF5ICovCi0Jd2xjLT5tcGNfZGVsYXlfb2ZmID0gd2xjLT5tcGNfZGx5Y250ID0gQlJDTVNfTVBDX01JTl9ERUxBWUNOVDsKLX0KLQotc3RhdGljIGJvb2wgYnJjbXNfY19zdGF0ZV9ibWFjX3N5bmMoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCXN0cnVjdCBicmNtc19iX3N0YXRlIHN0YXRlX2JtYWM7Ci0KLQlpZiAoYnJjbXNfYl9zdGF0ZV9nZXQod2xjLT5odywgJnN0YXRlX2JtYWMpICE9IDApCi0JCXJldHVybiBmYWxzZTsKLQotCXdsYy0+bWFjaHdjYXAgPSBzdGF0ZV9ibWFjLm1hY2h3Y2FwOwotCWJyY21zX2NfcHJvdGVjdGlvbl91cGQod2xjLCBCUkNNU19QUk9UX05fUEFNX09WUiwKLQkJCSAgIChzOCkgc3RhdGVfYm1hYy5wcmVhbWJsZV9vdnIpOwotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB1aW50IGJyY21zX2NfYXR0YWNoX21vZHVsZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0JdWludCBlcnIgPSAwOwotCXVpbnQgdW5pdDsKLQl1bml0ID0gd2xjLT5wdWItPnVuaXQ7Ci0KLQl3bGMtPmFzaSA9IGJyY21zX2NfYW50c2VsX2F0dGFjaCh3bGMpOwotCWlmICh3bGMtPmFzaSA9PSBOVUxMKSB7Ci0JCXdpcGh5X2Vycih3bGMtPndpcGh5LCAid2wlZDogYXR0YWNoOiBhbnRzZWxfYXR0YWNoICIKLQkJCSAgImZhaWxlZFxuIiwgdW5pdCk7Ci0JCWVyciA9IDQ0OwotCQlnb3RvIGZhaWw7Ci0JfQotCi0Jd2xjLT5hbXBkdSA9IGJyY21zX2NfYW1wZHVfYXR0YWNoKHdsYyk7Ci0JaWYgKHdsYy0+YW1wZHUgPT0gTlVMTCkgewotCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIndsJWQ6IGF0dGFjaDogYW1wZHVfYXR0YWNoICIKLQkJCSAgImZhaWxlZFxuIiwgdW5pdCk7Ci0JCWVyciA9IDUwOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JaWYgKChicmNtc19jX3N0Zl9hdHRhY2god2xjKSAhPSAwKSkgewotCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIndsJWQ6IGF0dGFjaDogc3RmX2F0dGFjaCAiCi0JCQkgICJmYWlsZWRcbiIsIHVuaXQpOwotCQllcnIgPSA2ODsKLQkJZ290byBmYWlsOwotCX0KLSBmYWlsOgotCXJldHVybiBlcnI7Ci19Ci0KLXN0cnVjdCBicmNtc19wdWIgKmJyY21zX2NfcHViKHZvaWQgKndsYykKLXsKLQlyZXR1cm4gKChzdHJ1Y3QgYnJjbXNfY19pbmZvICopIHdsYyktPnB1YjsKLX0KLQotI2RlZmluZSBDSElQX1NVUFBPUlRTXzExTih3bGMpCTEKLQotLyoKLSAqIFRoZSBjb21tb24gZHJpdmVyIGVudHJ5IHJvdXRpbmUuIEVycm9yIGNvZGVzIHNob3VsZCBiZSB1bmlxdWUKLSAqLwotdm9pZCAqYnJjbXNfY19hdHRhY2goc3RydWN0IGJyY21zX2luZm8gKndsLCB1MTYgdmVuZG9yLCB1MTYgZGV2aWNlLCB1aW50IHVuaXQsCi0JCSBib29sIHBpb21vZGUsIHZvaWQgKnJlZ3N2YSwgdWludCBidXN0eXBlLCB2b2lkICpidHBhcmFtLAotCQkgdWludCAqcGVycikKLXsKLQlzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGM7Ci0JdWludCBlcnIgPSAwOwotCXVpbnQgajsKLQlzdHJ1Y3QgYnJjbXNfcHViICpwdWI7Ci0JdWludCBuX2Rpc2FibGVkOwotCi0JLyogYWxsb2NhdGUgc3RydWN0IGJyY21zX2NfaW5mbyBzdGF0ZSBhbmQgaXRzIHN1YnN0cnVjdHVyZXMgKi8KLQl3bGMgPSAoc3RydWN0IGJyY21zX2NfaW5mbyAqKSBicmNtc19jX2F0dGFjaF9tYWxsb2ModW5pdCwgJmVyciwgZGV2aWNlKTsKLQlpZiAod2xjID09IE5VTEwpCi0JCWdvdG8gZmFpbDsKLQl3bGMtPndpcGh5ID0gd2wtPndpcGh5OwotCXB1YiA9IHdsYy0+cHViOwotCi0jaWYgZGVmaW5lZChCQ01EQkcpCi0Jd2xjX2luZm9fZGJnID0gd2xjOwotI2VuZGlmCi0KLQl3bGMtPmJhbmQgPSB3bGMtPmJhbmRzdGF0ZVswXTsKLQl3bGMtPmNvcmUgPSB3bGMtPmNvcmVzdGF0ZTsKLQl3bGMtPndsID0gd2w7Ci0JcHViLT51bml0ID0gdW5pdDsKLQlwdWItPl9waW9tb2RlID0gcGlvbW9kZTsKLQl3bGMtPmJhbmRpbml0X3BlbmRpbmcgPSBmYWxzZTsKLQotCS8qIHBvcHVsYXRlIHN0cnVjdCBicmNtc19jX2luZm8gd2l0aCBkZWZhdWx0IHZhbHVlcyAgKi8KLQlicmNtc19jX2luZm9faW5pdCh3bGMsIHVuaXQpOwotCi0JLyogdXBkYXRlIHN0YS9hcCByZWxhdGVkIHBhcmFtZXRlcnMgKi8KLQlicmNtc19jX2FwX3VwZCh3bGMpOwotCi0JLyogMTFuX2Rpc2FibGUgbnZyYW0gKi8KLQluX2Rpc2FibGVkID0gZ2V0aW50dmFyKHB1Yi0+dmFycywgIjExbl9kaXNhYmxlIik7Ci0KLQkvKgotCSAqIGxvdyBsZXZlbCBhdHRhY2ggc3RlcHMoYWxsIGh3IGFjY2Vzc2VzIGdvCi0JICogaW5zaWRlLCBubyBtb3JlIGluIHJlc3Qgb2YgdGhlIGF0dGFjaCkKLQkgKi8KLQllcnIgPSBicmNtc19iX2F0dGFjaCh3bGMsIHZlbmRvciwgZGV2aWNlLCB1bml0LCBwaW9tb2RlLCByZWdzdmEsCi0JCQkgICAgICBidXN0eXBlLCBidHBhcmFtKTsKLQlpZiAoZXJyKQotCQlnb3RvIGZhaWw7Ci0KLQkvKiBmb3Igc29tZSBzdGF0ZXMsIGR1ZSB0byBkaWZmZXJlbnQgaW5mbyBwb2ludGVyKGUsZywgd2xjLCB3bGNfaHcpIG9yIG1hc3Rlci9zbGF2ZSBzcGxpdCwKLQkgKiBISUdIIGRyaXZlcihib3RoIG1vbm9saXRoaWMgYW5kIEhJR0hfT05MWSkgbmVlZHMgdG8gc3luYyBzdGF0ZXMgRlJPTSBCTUFDIHBvcnRpb24gZHJpdmVyCi0JICovCi0JaWYgKCFicmNtc19jX3N0YXRlX2JtYWNfc3luYyh3bGMpKSB7Ci0JCWVyciA9IDIwOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JcHViLT5waHlfMTFuY2FwYWJsZSA9IEJSQ01TX1BIWV8xMU5fQ0FQKHdsYy0+YmFuZCk7Ci0KLQkvKiBwcm9wYWdhdGUgKnZhcnMqIGZyb20gQk1BQyBkcml2ZXIgdG8gaGlnaCBkcml2ZXIgKi8KLQlicmNtc19iX2NvcHlmcm9tX3ZhcnMod2xjLT5odywgJnB1Yi0+dmFycywgJndsYy0+dmFyc19zaXplKTsKLQotCi0JLyogc2V0IG1heGltdW0gYWxsb3dlZCBkdXR5IGN5Y2xlICovCi0Jd2xjLT50eF9kdXR5X2N5Y2xlX29mZG0gPQotCSAgICAodTE2KSBnZXRpbnR2YXIocHViLT52YXJzLCAidHhfZHV0eV9jeWNsZV9vZmRtIik7Ci0Jd2xjLT50eF9kdXR5X2N5Y2xlX2NjayA9Ci0JICAgICh1MTYpIGdldGludHZhcihwdWItPnZhcnMsICJ0eF9kdXR5X2N5Y2xlX2NjayIpOwotCi0JYnJjbXNfY19zdGZfcGh5X2NoYWluX2NhbGMod2xjKTsKLQotCS8qIHR4Y2hhaW4gMTogdHhhbnQgMCwgdHhjaGFpbiAyOiB0eGFudCAxICovCi0JaWYgKEJSQ01TX0lTTlBIWSh3bGMtPmJhbmQpICYmICh3bGMtPnN0Zi0+dHhzdHJlYW1zID09IDEpKQotCQl3bGMtPnN0Zi0+dHhhbnQgPSB3bGMtPnN0Zi0+aHdfdHhjaGFpbiAtIDE7Ci0KLQkvKiBwdXNoIHRvIEJNQUMgZHJpdmVyICovCi0Jd2xjX3BoeV9zdGZfY2hhaW5faW5pdCh3bGMtPmJhbmQtPnBpLCB3bGMtPnN0Zi0+aHdfdHhjaGFpbiwKLQkJCSAgICAgICB3bGMtPnN0Zi0+aHdfcnhjaGFpbik7Ci0KLQkvKiBwdWxsIHVwIHNvbWUgaW5mbyByZXN1bHRpbmcgZnJvbSB0aGUgbG93IGF0dGFjaCAqLwotCXsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBORklGTzsgaSsrKQotCQkJd2xjLT5jb3JlLT50eGF2YWlsW2ldID0gd2xjLT5ody0+dHhhdmFpbFtpXTsKLQl9Ci0KLQlicmNtc19iX2h3X2V0aGVyYWRkcih3bGMtPmh3LCB3bGMtPnBlcm1fZXRoZXJhZGRyKTsKLQotCW1lbWNweSgmcHViLT5jdXJfZXRoZXJhZGRyLCAmd2xjLT5wZXJtX2V0aGVyYWRkciwgRVRIX0FMRU4pOwotCi0JZm9yIChqID0gMDsgaiA8IE5CQU5EUyh3bGMpOyBqKyspIHsKLQkJLyogVXNlIGJhbmQgMSBmb3Igc2luZ2xlIGJhbmQgMTFhICovCi0JCWlmIChJU19TSU5HTEVCQU5EXzVHKHdsYy0+ZGV2aWNlaWQpKQotCQkJaiA9IEJBTkRfNUdfSU5ERVg7Ci0KLQkJd2xjLT5iYW5kID0gd2xjLT5iYW5kc3RhdGVbal07Ci0KLQkJaWYgKCFicmNtc19jX2F0dGFjaF9zdGZfYW50X2luaXQod2xjKSkgewotCQkJZXJyID0gMjQ7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQotCQkvKiBkZWZhdWx0IGNvbnRlbnRpb24gd2luZG93cyBzaXplIGxpbWl0cyAqLwotCQl3bGMtPmJhbmQtPkNXbWluID0gQVBIWV9DV01JTjsKLQkJd2xjLT5iYW5kLT5DV21heCA9IFBIWV9DV01BWDsKLQotCQkvKiBpbml0IGdtb2RlIHZhbHVlICovCi0JCWlmIChCQU5EXzJHKHdsYy0+YmFuZC0+YmFuZHR5cGUpKSB7Ci0JCQl3bGMtPmJhbmQtPmdtb2RlID0gR01PREVfQVVUTzsKLQkJCWJyY21zX2NfcHJvdGVjdGlvbl91cGQod2xjLCBCUkNNU19QUk9UX0dfVVNFUiwKLQkJCQkJICAgd2xjLT5iYW5kLT5nbW9kZSk7Ci0JCX0KLQotCQkvKiBpbml0IF9uX2VuYWIgc3VwcG9ydGVkIG1vZGUgKi8KLQkJaWYgKEJSQ01TX1BIWV8xMU5fQ0FQKHdsYy0+YmFuZCkgJiYgQ0hJUF9TVVBQT1JUU18xMU4od2xjKSkgewotCQkJaWYgKG5fZGlzYWJsZWQgJiBXTEZFQVRVUkVfRElTQUJMRV8xMU4pIHsKLQkJCQlwdWItPl9uX2VuYWIgPSBPRkY7Ci0JCQkJYnJjbXNfY19wcm90ZWN0aW9uX3VwZCh3bGMsIEJSQ01TX1BST1RfTl9VU0VSLAotCQkJCQkJICAgICAgIE9GRik7Ci0JCQl9IGVsc2UgewotCQkJCXB1Yi0+X25fZW5hYiA9IFNVUFBPUlRfMTFOOwotCQkJCWJyY21zX2NfcHJvdGVjdGlvbl91cGQod2xjLCBCUkNNU19QUk9UX05fVVNFUiwKLQkJCQkJCSAgICgocHViLT5fbl9lbmFiID09Ci0JCQkJCQkgICAgIFNVUFBPUlRfMTFOKSA/IFdMXzExTl8yeDIgOgotCQkJCQkJICAgIFdMXzExTl8zeDMpKTsKLQkJCX0KLQkJfQotCi0JCS8qIGluaXQgcGVyLWJhbmQgZGVmYXVsdCByYXRlc2V0LCBkZXBlbmQgb24gYmFuZC0+Z21vZGUgKi8KLQkJYnJjbXNfZGVmYXVsdF9yYXRlc2V0KHdsYywgJndsYy0+YmFuZC0+ZGVmcmF0ZXNldCk7Ci0KLQkJLyogZmlsbCBpbiBod19yYXRlc2V0ICh1c2VkIGVhcmx5IGJ5IEJSQ01fU0VUX1JBVEVTRVQpICovCi0JCWJyY21zX2NfcmF0ZXNldF9maWx0ZXIoJndsYy0+YmFuZC0+ZGVmcmF0ZXNldCwKLQkJCQkgICAmd2xjLT5iYW5kLT5od19yYXRlc2V0LCBmYWxzZSwKLQkJCQkgICBCUkNNU19SQVRFU19DQ0tfT0ZETSwgQlJDTVNfUkFURV9NQVNLLAotCQkJCSAgIChib29sKSBOX0VOQUIod2xjLT5wdWIpKTsKLQl9Ci0KLQkvKiB1cGRhdGUgYW50ZW5uYSBjb25maWcgZHVlIHRvIHdsYy0+c3RmLT50eGFudC90eGNoYWluL2FudF9yeF9vdnIgY2hhbmdlICovCi0JYnJjbXNfY19zdGZfcGh5X3R4YW50X3VwZCh3bGMpOwotCi0JLyogYXR0YWNoIGVhY2ggbW9kdWxlcyAqLwotCWVyciA9IGJyY21zX2NfYXR0YWNoX21vZHVsZSh3bGMpOwotCWlmIChlcnIgIT0gMCkKLQkJZ290byBmYWlsOwotCi0JaWYgKCFicmNtc19jX3RpbWVyc19pbml0KHdsYywgdW5pdCkpIHsKLQkJd2lwaHlfZXJyKHdsLT53aXBoeSwgIndsJWQ6ICVzOiBpbml0X3RpbWVyIGZhaWxlZFxuIiwgdW5pdCwKLQkJCSAgX19mdW5jX18pOwotCQllcnIgPSAzMjsKLQkJZ290byBmYWlsOwotCX0KLQotCS8qIGRlcGVuZCBvbiByYXRlc2V0LCBnbW9kZSAqLwotCXdsYy0+Y21pID0gYnJjbXNfY19jaGFubmVsX21ncl9hdHRhY2god2xjKTsKLQlpZiAoIXdsYy0+Y21pKSB7Ci0JCXdpcGh5X2Vycih3bC0+d2lwaHksICJ3bCVkOiAlczogY2hhbm5lbF9tZ3JfYXR0YWNoIGZhaWxlZCIKLQkJCSAgIlxuIiwgdW5pdCwgX19mdW5jX18pOwotCQllcnIgPSAzMzsKLQkJZ290byBmYWlsOwotCX0KLQotCS8qIGluaXQgZGVmYXVsdCB3aGVuIGFsbCBwYXJhbWV0ZXJzIGFyZSByZWFkeSwgaS5lLiAtPnJhdGVzZXQgKi8KLQlicmNtc19jX2Jzc19kZWZhdWx0X2luaXQod2xjKTsKLQotCS8qCi0JICogQ29tcGxldGUgdGhlIHdsYyBkZWZhdWx0IHN0YXRlIGluaXRpYWxpemF0aW9ucy4uCi0JICovCi0KLQkvKiBhbGxvY2F0ZSBvdXIgaW5pdGlhbCBxdWV1ZSAqLwotCXdsYy0+cGt0X3F1ZXVlID0gYnJjbXNfY190eHFfYWxsb2Mod2xjKTsKLQlpZiAod2xjLT5wa3RfcXVldWUgPT0gTlVMTCkgewotCQl3aXBoeV9lcnIod2wtPndpcGh5LCAid2wlZDogJXM6IGZhaWxlZCB0byBtYWxsb2MgdHggcXVldWVcbiIsCi0JCQkgIHVuaXQsIF9fZnVuY19fKTsKLQkJZXJyID0gMTAwOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0Jd2xjLT5ic3NjZmdbMF0gPSB3bGMtPmNmZzsKLQl3bGMtPmNmZy0+X2lkeCA9IDA7Ci0Jd2xjLT5jZmctPndsYyA9IHdsYzsKLQlwdWItPnR4bWF4cGt0cyA9IE1BWFRYUEtUUzsKLQotCWJyY21zX2Nfd21lX2luaXRwYXJhbXNfc3RhKHdsYywgJndsYy0+d21lX3BhcmFtX2llKTsKLQotCXdsYy0+bWltb2Z0ID0gRlRfSFQ7Ci0Jd2xjLT5odF9jYXAuY2FwX2luZm8gPSBIVF9DQVA7Ci0JaWYgKEhUX0VOQUIod2xjLT5wdWIpKQotCQl3bGMtPnN0Zi0+bGRwYyA9IEFVVE87Ci0KLQl3bGMtPm1pbW9fNDB0eGJ3ID0gQVVUTzsKLQl3bGMtPm9mZG1fNDB0eGJ3ID0gQVVUTzsKLQl3bGMtPmNja180MHR4YncgPSBBVVRPOwotCWJyY21zX2NfdXBkYXRlX21pbW9fYmFuZF9id2NhcCh3bGMsIEJSQ01TX05fQldfMjBJTjJHXzQwSU41Ryk7Ci0KLQkvKiBTZXQgZGVmYXVsdCB2YWx1ZXMgb2YgU0dJICovCi0JaWYgKEJSQ01TX1NHSV9DQVBfUEhZKHdsYykpIHsKLQkJYnJjbXNfY19odF91cGRhdGVfc2dpX3J4KHdsYywgKEJSQ01TX05fU0dJXzIwIHwKLQkJCQkJICAgICAgIEJSQ01TX05fU0dJXzQwKSk7Ci0JCXdsYy0+c2dpX3R4ID0gQVVUTzsKLQl9IGVsc2UgaWYgKEJSQ01TX0lTU1NMUE5QSFkod2xjLT5iYW5kKSkgewotCQlicmNtc19jX2h0X3VwZGF0ZV9zZ2lfcngod2xjLCAoQlJDTVNfTl9TR0lfMjAgfAotCQkJCQkgICAgICAgQlJDTVNfTl9TR0lfNDApKTsKLQkJd2xjLT5zZ2lfdHggPSBBVVRPOwotCX0gZWxzZSB7Ci0JCWJyY21zX2NfaHRfdXBkYXRlX3NnaV9yeCh3bGMsIDApOwotCQl3bGMtPnNnaV90eCA9IE9GRjsKLQl9Ci0KLQkvKiAqKioqKioqbnZyYW0gMTFuIGNvbmZpZyBvdmVycmlkZXMgU3RhcnQgKioqKioqKioqICovCi0KLQkvKiBhcHBseSB0aGUgc2dpIG92ZXJyaWRlIGZyb20gbnZyYW0gY29uZiAqLwotCWlmIChuX2Rpc2FibGVkICYgV0xGRUFUVVJFX0RJU0FCTEVfMTFOX1NHSV9UWCkKLQkJd2xjLT5zZ2lfdHggPSBPRkY7Ci0KLQlpZiAobl9kaXNhYmxlZCAmIFdMRkVBVFVSRV9ESVNBQkxFXzExTl9TR0lfUlgpCi0JCWJyY21zX2NfaHRfdXBkYXRlX3NnaV9yeCh3bGMsIDApOwotCi0JLyogYXBwbHkgdGhlIHN0YmMgb3ZlcnJpZGUgZnJvbSBudnJhbSBjb25mICovCi0JaWYgKG5fZGlzYWJsZWQgJiBXTEZFQVRVUkVfRElTQUJMRV8xMU5fU1RCQ19UWCkgewotCQl3bGMtPmJhbmRzdGF0ZVtCQU5EXzJHX0lOREVYXS0+YmFuZF9zdGZfc3RiY190eCA9IE9GRjsKLQkJd2xjLT5iYW5kc3RhdGVbQkFORF81R19JTkRFWF0tPmJhbmRfc3RmX3N0YmNfdHggPSBPRkY7Ci0JCXdsYy0+aHRfY2FwLmNhcF9pbmZvICY9IH5JRUVFODAyMTFfSFRfQ0FQX1RYX1NUQkM7Ci0JfQotCWlmIChuX2Rpc2FibGVkICYgV0xGRUFUVVJFX0RJU0FCTEVfMTFOX1NUQkNfUlgpCi0JCWJyY21zX2Nfc3RmX3N0YmNfcnhfc2V0KHdsYywgSFRfQ0FQX1JYX1NUQkNfTk8pOwotCi0JLyogYXBwbHkgdGhlIEdGIG92ZXJyaWRlIGZyb20gbnZyYW0gY29uZiAqLwotCWlmIChuX2Rpc2FibGVkICYgV0xGRUFUVVJFX0RJU0FCTEVfMTFOX0dGKQotCQl3bGMtPmh0X2NhcC5jYXBfaW5mbyAmPSB+SUVFRTgwMjExX0hUX0NBUF9HUk5fRkxEOwotCi0JLyogaW5pdGlhbGl6ZSByYWRpb19tcGNfZGlzYWJsZSBhY2NvcmRpbmcgdG8gd2xjLT5tcGMgKi8KLQlicmNtc19jX3JhZGlvX21wY191cGQod2xjKTsKLQlicmNtc19iX2FudHNlbF9zZXQod2xjLT5odywgd2xjLT5hc2ktPmFudHNlbF9hdmFpbCk7Ci0KLQlpZiAocGVycikKLQkJKnBlcnIgPSAwOwotCi0JcmV0dXJuICh2b2lkICopd2xjOwotCi0gZmFpbDoKLQl3aXBoeV9lcnIod2wtPndpcGh5LCAid2wlZDogJXM6IGZhaWxlZCB3aXRoIGVyciAlZFxuIiwKLQkJICB1bml0LCBfX2Z1bmNfXywgZXJyKTsKLQlpZiAod2xjKQotCQlicmNtc19jX2RldGFjaCh3bGMpOwotCi0JaWYgKHBlcnIpCi0JCSpwZXJyID0gZXJyOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBicmNtc19jX2F0dGFjaF9hbnRnYWluX2luaXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCXVpbnQgdW5pdDsKLQl1bml0ID0gd2xjLT5wdWItPnVuaXQ7Ci0KLQlpZiAoKHdsYy0+YmFuZC0+YW50Z2FpbiA9PSAtMSkgJiYgKHdsYy0+cHViLT5zcm9tcmV2ID09IDEpKSB7Ci0JCS8qIGRlZmF1bHQgYW50ZW5uYSBnYWluIGZvciBzcm9tIHJldiAxIGlzIDIgZEJtICg4IHFkYm0pICovCi0JCXdsYy0+YmFuZC0+YW50Z2FpbiA9IDg7Ci0JfSBlbHNlIGlmICh3bGMtPmJhbmQtPmFudGdhaW4gPT0gLTEpIHsKLQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICJ3bCVkOiAlczogSW52YWxpZCBhbnRlbm5hcyBhdmFpbGFibGUgaW4iCi0JCQkgICIgc3JvbSwgdXNpbmcgMmRCXG4iLCB1bml0LCBfX2Z1bmNfXyk7Ci0JCXdsYy0+YmFuZC0+YW50Z2FpbiA9IDg7Ci0JfSBlbHNlIHsKLQkJczggZ2FpbiwgZnJhY3Q7Ci0JCS8qIE9sZGVyIHNyb21zIHNwZWNpZmllZCBnYWluIGluIHdob2xlIGRibSBvbmx5LiAgSW4gb3JkZXIKLQkJICogYmUgYWJsZSB0byBzcGVjaWZ5IHFkYm0gZ3JhbnVsYXJpdHkgYW5kIHJlbWFpbiBiYWNrd2FyZCBjb21wYXRpYmxlCi0JCSAqIHRoZSB3aG9sZSBkYm1zIGFyZSBub3cgZW5jb2RlZCBpbiBvbmx5IGxvdyA2IGJpdHMgYW5kIHJlbWFpbmluZyBxZGJtcwotCQkgKiBhcmUgZW5jb2RlZCBpbiB0aGUgaGkgMiBiaXRzLiA2IGJpdCBzaWduZWQgbnVtYmVyIHJhbmdlcyBmcm9tCi0JCSAqIC0zMiAtIDMxLiBFeGFtcGxlczogMHgxID0gMSBkYiwKLQkJICogMHhjMSA9IDEuNzUgZGIgKDEgKyAzIHF1YXJ0ZXJzKSwKLQkJICogMHgzZiA9IC0xICgtMSArIDAgcXVhcnRlcnMpLAotCQkgKiAweDdmID0gLS43NSAoLTEgaW4gbG93IDYgYml0cyArIDEgcXVhcnRlcnMgaW4gaGkgMiBiaXRzKSA9IC0zIHFkYm0uCi0JCSAqIDB4YmYgPSAtLjUwICgtMSBpbiBsb3cgNiBiaXRzICsgMiBxdWFydGVycyBpbiBoaSAyIGJpdHMpID0gLTIgcWRibS4KLQkJICovCi0JCWdhaW4gPSB3bGMtPmJhbmQtPmFudGdhaW4gJiAweDNmOwotCQlnYWluIDw8PSAyOwkvKiBTaWduIGV4dGVuZCAqLwotCQlnYWluID4+PSAyOwotCQlmcmFjdCA9ICh3bGMtPmJhbmQtPmFudGdhaW4gJiAweGMwKSA+PiA2OwotCQl3bGMtPmJhbmQtPmFudGdhaW4gPSA0ICogZ2FpbiArIGZyYWN0OwotCX0KLX0KLQotc3RhdGljIGJvb2wgYnJjbXNfY19hdHRhY2hfc3RmX2FudF9pbml0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlpbnQgYWE7Ci0JdWludCB1bml0OwotCWNoYXIgKnZhcnM7Ci0JaW50IGJhbmR0eXBlOwotCi0JdW5pdCA9IHdsYy0+cHViLT51bml0OwotCXZhcnMgPSB3bGMtPnB1Yi0+dmFyczsKLQliYW5kdHlwZSA9IHdsYy0+YmFuZC0+YmFuZHR5cGU7Ci0KLQkvKiBnZXQgYW50ZW5uYXMgYXZhaWxhYmxlICovCi0JYWEgPSAoczgpIGdldGludHZhcih2YXJzLCAoQkFORF81RyhiYW5kdHlwZSkgPyAiYWE1ZyIgOiAiYWEyZyIpKTsKLQlpZiAoYWEgPT0gMCkKLQkJYWEgPSAoczgpIGdldGludHZhcih2YXJzLAotCQkJCSAgICAgIChCQU5EXzVHKGJhbmR0eXBlKSA/ICJhYTEiIDogImFhMCIpKTsKLQlpZiAoKGFhIDwgMSkgfHwgKGFhID4gMTUpKSB7Ci0JCXdpcGh5X2Vycih3bGMtPndpcGh5LCAid2wlZDogJXM6IEludmFsaWQgYW50ZW5uYXMgYXZhaWxhYmxlIGluIgotCQkJICAiIHNyb20gKDB4JXgpLCB1c2luZyAzXG4iLCB1bml0LCBfX2Z1bmNfXywgYWEpOwotCQlhYSA9IDM7Ci0JfQotCi0JLyogcmVzZXQgdGhlIGRlZmF1bHRzIGlmIHdlIGhhdmUgYSBzaW5nbGUgYW50ZW5uYSAqLwotCWlmIChhYSA9PSAxKSB7Ci0JCXdsYy0+c3RmLT5hbnRfcnhfb3ZyID0gQU5UX1JYX0RJVl9GT1JDRV8wOwotCQl3bGMtPnN0Zi0+dHhhbnQgPSBBTlRfVFhfRk9SQ0VfMDsKLQl9IGVsc2UgaWYgKGFhID09IDIpIHsKLQkJd2xjLT5zdGYtPmFudF9yeF9vdnIgPSBBTlRfUlhfRElWX0ZPUkNFXzE7Ci0JCXdsYy0+c3RmLT50eGFudCA9IEFOVF9UWF9GT1JDRV8xOwotCX0gZWxzZSB7Ci0JfQotCi0JLyogQ29tcHV0ZSBBbnRlbm5hIEdhaW4gKi8KLQl3bGMtPmJhbmQtPmFudGdhaW4gPQotCSAgICAoczgpIGdldGludHZhcih2YXJzLCAoQkFORF81RyhiYW5kdHlwZSkgPyAiYWcxIiA6ICJhZzAiKSk7Ci0JYnJjbXNfY19hdHRhY2hfYW50Z2Fpbl9pbml0KHdsYyk7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotCi1zdGF0aWMgdm9pZCBicmNtc19jX3RpbWVyc19kZWluaXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCS8qIGZyZWUgdGltZXIgc3RhdGUgKi8KLQlpZiAod2xjLT53ZHRpbWVyKSB7Ci0JCWJyY21zX2ZyZWVfdGltZXIod2xjLT53bCwgd2xjLT53ZHRpbWVyKTsKLQkJd2xjLT53ZHRpbWVyID0gTlVMTDsKLQl9Ci0JaWYgKHdsYy0+cmFkaW9fdGltZXIpIHsKLQkJYnJjbXNfZnJlZV90aW1lcih3bGMtPndsLCB3bGMtPnJhZGlvX3RpbWVyKTsKLQkJd2xjLT5yYWRpb190aW1lciA9IE5VTEw7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBicmNtc19jX2RldGFjaF9tb2R1bGUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCWlmICh3bGMtPmFzaSkgewotCQlicmNtc19jX2FudHNlbF9kZXRhY2god2xjLT5hc2kpOwotCQl3bGMtPmFzaSA9IE5VTEw7Ci0JfQotCi0JaWYgKHdsYy0+YW1wZHUpIHsKLQkJYnJjbXNfY19hbXBkdV9kZXRhY2god2xjLT5hbXBkdSk7Ci0JCXdsYy0+YW1wZHUgPSBOVUxMOwotCX0KLQotCWJyY21zX2Nfc3RmX2RldGFjaCh3bGMpOwotfQotCi0vKgotICogUmV0dXJuIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBkcml2ZXIgY2FsbGJhY2tzIHN0aWxsIHBlbmRpbmcuCi0gKgotICogR2VuZXJhbCBwb2xpY3kgaXMgdGhhdCBicmNtc19jX2RldGFjaCBjYW4gb25seSBkZWFsbG9jL2ZyZWUgc29mdHdhcmUgc3RhdGVzLgotICogSXQgY2FuIE5PVCB0b3VjaCBoYXJkd2FyZSByZWdpc3RlcnMgc2luY2UgdGhlIGQxMWNvcmUgbWF5IGJlIGluIHJlc2V0IGFuZAotICogY2xvY2sgbWF5IG5vdCBiZSBhdmFpbGFibGUuCi0gKiBPbmUgZXhjZXB0aW9uIGlzIHNiIHJlZ2lzdGVyIGFjY2Vzcywgd2hpY2ggaXMgcG9zc2libGUgaWYgY3J5c3RhbCBpcyB0dXJuZWQKLSAqIG9uIGFmdGVyICJkb3duIiBzdGF0ZSwgZHJpdmVyIHNob3VsZCBhdm9pZCBzb2Z0d2FyZSB0aW1lciB3aXRoIHRoZSBleGNlcHRpb24KLSAqIG9mIHJhZGlvX21vbml0b3IuCi0gKi8KLXVpbnQgYnJjbXNfY19kZXRhY2goc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCXVpbnQgY2FsbGJhY2tzID0gMDsKLQotCWlmICh3bGMgPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0KLQlCQ01NU0cod2xjLT53aXBoeSwgIndsJWRcbiIsIHdsYy0+cHViLT51bml0KTsKLQotCWNhbGxiYWNrcyArPSBicmNtc19iX2RldGFjaCh3bGMpOwotCi0JLyogZGVsZXRlIHNvZnR3YXJlIHRpbWVycyAqLwotCWlmICghYnJjbXNfY19yYWRpb19tb25pdG9yX3N0b3Aod2xjKSkKLQkJY2FsbGJhY2tzKys7Ci0KLQlicmNtc19jX2NoYW5uZWxfbWdyX2RldGFjaCh3bGMtPmNtaSk7Ci0KLQlicmNtc19jX3RpbWVyc19kZWluaXQod2xjKTsKLQotCWJyY21zX2NfZGV0YWNoX21vZHVsZSh3bGMpOwotCi0KLQl3aGlsZSAod2xjLT50eF9xdWV1ZXMgIT0gTlVMTCkKLQkJYnJjbXNfY190eHFfZnJlZSh3bGMsIHdsYy0+dHhfcXVldWVzKTsKLQotCWJyY21zX2NfZGV0YWNoX21mcmVlKHdsYyk7Ci0JcmV0dXJuIGNhbGxiYWNrczsKLX0KLQotLyogdXBkYXRlIHN0YXRlIHRoYXQgZGVwZW5kcyBvbiB0aGUgY3VycmVudCB2YWx1ZSBvZiAiYXAiICovCi12b2lkIGJyY21zX2NfYXBfdXBkKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlpZiAoQVBfRU5BQih3bGMtPnB1YikpCi0JCS8qIEFQOiBzaG9ydCBub3QgYWxsb3dlZCwgYnV0IG5vdCBlbmZvcmNlZCAqLwotCQl3bGMtPlBMQ1BIZHJfb3ZlcnJpZGUgPSBCUkNNU19QTENQX0FVVE87Ci0JZWxzZQotCQkvKiBTVEEtQlNTOyBzaG9ydCBjYXBhYmxlICovCi0JCXdsYy0+UExDUEhkcl9vdmVycmlkZSA9IEJSQ01TX1BMQ1BfU0hPUlQ7Ci0KLQkvKiBmaXh1cCBtcGMgKi8KLQl3bGMtPm1wYyA9IHRydWU7Ci19Ci0KLS8qIHJlYWQgaHdkaXNhYmxlIHN0YXRlIGFuZCBwcm9wYWdhdGUgdG8gd2xjIGZsYWcgKi8KLXN0YXRpYyB2b2lkIGJyY21zX2NfcmFkaW9faHdkaXNhYmxlX3VwZChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0JaWYgKHdsYy0+cHViLT53bGZlYXR1cmVmbGFnICYgV0xfU1dGTF9OT0hXUkFESU8gfHwgd2xjLT5wdWItPmh3X29mZikKLQkJcmV0dXJuOwotCi0JaWYgKGJyY21zX2JfcmFkaW9fcmVhZF9od2Rpc2FibGVkKHdsYy0+aHcpKSB7Ci0JCW1ib29sc2V0KHdsYy0+cHViLT5yYWRpb19kaXNhYmxlZCwgV0xfUkFESU9fSFdfRElTQUJMRSk7Ci0JfSBlbHNlIHsKLQkJbWJvb2xjbHIod2xjLT5wdWItPnJhZGlvX2Rpc2FibGVkLCBXTF9SQURJT19IV19ESVNBQkxFKTsKLQl9Ci19Ci0KLS8qIHJldHVybiB0cnVlIGlmIE1pbmltdW0gUG93ZXIgQ29uc3VtcHRpb24gc2hvdWxkIGJlIGVudGVyZWQsIGZhbHNlIG90aGVyd2lzZSAqLwotYm9vbCBicmNtc19jX2lzX25vbl9kZWxheV9tcGMoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCXJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBicmNtc19jX2lzbXBjKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlyZXR1cm4gKHdsYy0+bXBjX2RlbGF5X29mZiA9PSAwKSAmJiAoYnJjbXNfY19pc19ub25fZGVsYXlfbXBjKHdsYykpOwotfQotCi12b2lkIGJyY21zX2NfcmFkaW9fbXBjX3VwZChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0JYm9vbCBtcGNfcmFkaW8sIHJhZGlvX3N0YXRlOwotCi0JLyoKLQkgKiBDbGVhciB0aGUgV0xfUkFESU9fTVBDX0RJU0FCTEUgYml0IHdoZW4gbXBjIGZlYXR1cmUgaXMgZGlzYWJsZWQKLQkgKiBpbiBjYXNlIHRoZSBXTF9SQURJT19NUENfRElTQUJMRSBiaXQgd2FzIHNldC4gU3RvcCB0aGUgcmFkaW8KLQkgKiBtb25pdG9yIGFsc28gd2hlbiBXTF9SQURJT19NUENfRElTQUJMRSBpcyB0aGUgb25seSByZWFzb24gdGhhdAotCSAqIHRoZSByYWRpbyBpcyBnb2luZyBkb3duLgotCSAqLwotCWlmICghd2xjLT5tcGMpIHsKLQkJaWYgKCF3bGMtPnB1Yi0+cmFkaW9fZGlzYWJsZWQpCi0JCQlyZXR1cm47Ci0JCW1ib29sY2xyKHdsYy0+cHViLT5yYWRpb19kaXNhYmxlZCwgV0xfUkFESU9fTVBDX0RJU0FCTEUpOwotCQlicmNtc19jX3JhZGlvX3VwZCh3bGMpOwotCQlpZiAoIXdsYy0+cHViLT5yYWRpb19kaXNhYmxlZCkKLQkJCWJyY21zX2NfcmFkaW9fbW9uaXRvcl9zdG9wKHdsYyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIHN5bmMgaXNtcGMgbG9naWMgd2l0aCBXTF9SQURJT19NUENfRElTQUJMRSBiaXQgaW4gd2xjLT5wdWItPnJhZGlvX2Rpc2FibGVkCi0JICogdG8gZ28gT04sIGFsd2F5cyBjYWxsIHJhZGlvX3VwZCBzeW5jaHJvbm91c2x5Ci0JICogdG8gZ28gT0ZGLCBwb3N0cG9uZSByYWRpb191cGQgdG8gbGF0ZXIgd2hlbiBjb250ZXh0IGlzIHNhZmUoZS5nLiB3YXRjaGRvZykKLQkgKi8KLQlyYWRpb19zdGF0ZSA9Ci0JICAgIChtYm9vbGlzc2V0KHdsYy0+cHViLT5yYWRpb19kaXNhYmxlZCwgV0xfUkFESU9fTVBDX0RJU0FCTEUpID8gT0ZGIDoKLQkgICAgIE9OKTsKLQltcGNfcmFkaW8gPSAoYnJjbXNfY19pc21wYyh3bGMpID09IHRydWUpID8gT0ZGIDogT047Ci0KLQlpZiAocmFkaW9fc3RhdGUgPT0gT04gJiYgbXBjX3JhZGlvID09IE9GRikKLQkJd2xjLT5tcGNfZGVsYXlfb2ZmID0gd2xjLT5tcGNfZGx5Y250OwotCWVsc2UgaWYgKHJhZGlvX3N0YXRlID09IE9GRiAmJiBtcGNfcmFkaW8gPT0gT04pIHsKLQkJbWJvb2xjbHIod2xjLT5wdWItPnJhZGlvX2Rpc2FibGVkLCBXTF9SQURJT19NUENfRElTQUJMRSk7Ci0JCWJyY21zX2NfcmFkaW9fdXBkKHdsYyk7Ci0JCWlmICh3bGMtPm1wY19vZmZjbnQgPCBCUkNNU19NUENfVEhSRVNIT0xEKQotCQkJd2xjLT5tcGNfZGx5Y250ID0gQlJDTVNfTVBDX01BWF9ERUxBWUNOVDsKLQkJZWxzZQotCQkJd2xjLT5tcGNfZGx5Y250ID0gQlJDTVNfTVBDX01JTl9ERUxBWUNOVDsKLQkJd2xjLT5tcGNfZHVyICs9IE9TTF9TWVNVUFRJTUUoKSAtIHdsYy0+bXBjX2xhc3Rvbl90czsKLQl9Ci0JLyogQmVsb3cgbG9naWMgaXMgbWVhbnQgdG8gY2FwdHVyZSB0aGUgdHJhbnNpdGlvbiBmcm9tIG1wYyBvZmYgdG8gbXBjIG9uIGZvciByZWFzb25zCi0JICogb3RoZXIgdGhhbiB3bGMtPm1wY19kZWxheV9vZmYga2VlcGluZyB0aGUgbXBjIG9mZi4gSW4gdGhhdCBjYXNlIHJlc2V0Ci0JICogd2xjLT5tcGNfZGVsYXlfb2ZmIHRvIHdsYy0+bXBjX2RseWNudCwgc28gdGhhdCB3ZSByZXN0YXJ0IHRoZSBjb3VudGRvd24gb2YgbXBjX2RlbGF5X29mZgotCSAqLwotCWlmICgod2xjLT5wcmV2X25vbl9kZWxheV9tcGMgPT0gZmFsc2UpICYmCi0JICAgIChicmNtc19jX2lzX25vbl9kZWxheV9tcGMod2xjKSA9PSB0cnVlKSAmJiB3bGMtPm1wY19kZWxheV9vZmYpIHsKLQkJd2xjLT5tcGNfZGVsYXlfb2ZmID0gd2xjLT5tcGNfZGx5Y250OwotCX0KLQl3bGMtPnByZXZfbm9uX2RlbGF5X21wYyA9IGJyY21zX2NfaXNfbm9uX2RlbGF5X21wYyh3bGMpOwotfQotCi0vKgotICogY2VudHJhbGl6ZWQgcmFkaW8gZGlzYWJsZS9lbmFibGUgZnVuY3Rpb24sCi0gKiBpbnZva2UgcmFkaW8gZW5hYmxlL2Rpc2FibGUgYWZ0ZXIgdXBkYXRpbmcgaHdyYWRpbyBzdGF0dXMKLSAqLwotc3RhdGljIHZvaWQgYnJjbXNfY19yYWRpb191cGQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCWlmICh3bGMtPnB1Yi0+cmFkaW9fZGlzYWJsZWQpIHsKLQkJYnJjbXNfY19yYWRpb19kaXNhYmxlKHdsYyk7Ci0JfSBlbHNlIHsKLQkJYnJjbXNfY19yYWRpb19lbmFibGUod2xjKTsKLQl9Ci19Ci0KLS8qIG1haW50YWluIExFRCBiZWhhdmlvciBpbiBkb3duIHN0YXRlICovCi1zdGF0aWMgdm9pZCBicmNtc19jX2Rvd25fbGVkX3VwZChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0JLyogbWFpbnRhaW4gTEVEcyB3aGlsZSBpbiBkb3duIHN0YXRlLCB0dXJuIG9uIHNiY2xrIGlmIG5vdCBhdmFpbGFibGUgeWV0ICovCi0JLyogdHVybiBvbiBzYmNsayBpZiBuZWNlc3NhcnkgKi8KLQlpZiAoIUFQX0VOQUIod2xjLT5wdWIpKSB7Ci0JCWJyY21zX2NfcGxscmVxKHdsYywgdHJ1ZSwgQlJDTVNfUExMUkVRX0ZMSVApOwotCi0JCWJyY21zX2NfcGxscmVxKHdsYywgZmFsc2UsIEJSQ01TX1BMTFJFUV9GTElQKTsKLQl9Ci19Ci0KLS8qIHVwZGF0ZSBod3JhZGlvIHN0YXR1cyBhbmQgcmV0dXJuIGl0ICovCi1ib29sIGJyY21zX2NfY2hlY2tfcmFkaW9fZGlzYWJsZWQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCWJyY21zX2NfcmFkaW9faHdkaXNhYmxlX3VwZCh3bGMpOwotCi0JcmV0dXJuIG1ib29saXNzZXQod2xjLT5wdWItPnJhZGlvX2Rpc2FibGVkLCBXTF9SQURJT19IV19ESVNBQkxFKSA/IHRydWUgOiBmYWxzZTsKLX0KLQotdm9pZCBicmNtc19jX3JhZGlvX2Rpc2FibGUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCWlmICghd2xjLT5wdWItPnVwKSB7Ci0JCWJyY21zX2NfZG93bl9sZWRfdXBkKHdsYyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlicmNtc19jX3JhZGlvX21vbml0b3Jfc3RhcnQod2xjKTsKLQlicmNtc19kb3duKHdsYy0+d2wpOwotfQotCi1zdGF0aWMgdm9pZCBicmNtc19jX3JhZGlvX2VuYWJsZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0JaWYgKHdsYy0+cHViLT51cCkKLQkJcmV0dXJuOwotCi0JaWYgKERFVklDRVJFTU9WRUQod2xjKSkKLQkJcmV0dXJuOwotCi0JYnJjbXNfdXAod2xjLT53bCk7Ci19Ci0KLS8qIHBlcmlvZGljYWwgcXVlcnkgaHcgcmFkaW8gYnV0dG9uIHdoaWxlIGRyaXZlciBpcyAiZG93biIgKi8KLXN0YXRpYyB2b2lkIGJyY21zX2NfcmFkaW9fdGltZXIodm9pZCAqYXJnKQotewotCXN0cnVjdCBicmNtc19jX2luZm8gKndsYyA9IChzdHJ1Y3QgYnJjbXNfY19pbmZvICopIGFyZzsKLQotCWlmIChERVZJQ0VSRU1PVkVEKHdsYykpIHsKLQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLCB3bGMtPnB1Yi0+dW5pdCwKLQkJCV9fZnVuY19fKTsKLQkJYnJjbXNfZG93bih3bGMtPndsKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIGNhcCBtcGMgb2ZmIGNvdW50ICovCi0JaWYgKHdsYy0+bXBjX29mZmNudCA8IEJSQ01TX01QQ19NQVhfREVMQVlDTlQpCi0JCXdsYy0+bXBjX29mZmNudCsrOwotCi0JYnJjbXNfY19yYWRpb19od2Rpc2FibGVfdXBkKHdsYyk7Ci0JYnJjbXNfY19yYWRpb191cGQod2xjKTsKLX0KLQotc3RhdGljIGJvb2wgYnJjbXNfY19yYWRpb19tb25pdG9yX3N0YXJ0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQkvKiBEb24ndCBzdGFydCB0aGUgdGltZXIgaWYgSFdSQURJTyBmZWF0dXJlIGlzIGRpc2FibGVkICovCi0JaWYgKHdsYy0+cmFkaW9fbW9uaXRvciB8fCAod2xjLT5wdWItPndsZmVhdHVyZWZsYWcgJiBXTF9TV0ZMX05PSFdSQURJTykpCi0JCXJldHVybiB0cnVlOwotCi0Jd2xjLT5yYWRpb19tb25pdG9yID0gdHJ1ZTsKLQlicmNtc19jX3BsbHJlcSh3bGMsIHRydWUsIEJSQ01TX1BMTFJFUV9SQURJT19NT04pOwotCWJyY21zX2FkZF90aW1lcih3bGMtPndsLCB3bGMtPnJhZGlvX3RpbWVyLCBUSU1FUl9JTlRFUlZBTF9SQURJT0NISywKLQkJCXRydWUpOwotCXJldHVybiB0cnVlOwotfQotCi1ib29sIGJyY21zX2NfcmFkaW9fbW9uaXRvcl9zdG9wKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlpZiAoIXdsYy0+cmFkaW9fbW9uaXRvcikKLQkJcmV0dXJuIHRydWU7Ci0KLQl3bGMtPnJhZGlvX21vbml0b3IgPSBmYWxzZTsKLQlicmNtc19jX3BsbHJlcSh3bGMsIGZhbHNlLCBCUkNNU19QTExSRVFfUkFESU9fTU9OKTsKLQlyZXR1cm4gYnJjbXNfZGVsX3RpbWVyKHdsYy0+d2wsIHdsYy0+cmFkaW9fdGltZXIpOwotfQotCi1zdGF0aWMgdm9pZCBicmNtc19jX3dhdGNoZG9nX2J5X3RpbWVyKHZvaWQgKmFyZykKLXsKLQlicmNtc19jX3dhdGNoZG9nKGFyZyk7Ci19Ci0KLS8qIGNvbW1vbiB3YXRjaGRvZyBjb2RlICovCi1zdGF0aWMgdm9pZCBicmNtc19jX3dhdGNoZG9nKHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMgPSAoc3RydWN0IGJyY21zX2NfaW5mbyAqKSBhcmc7Ci0JaW50IGk7Ci0Jc3RydWN0IGJyY21zX2Jzc19jZmcgKmNmZzsKLQotCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjLT5wdWItPnVuaXQpOwotCi0JaWYgKCF3bGMtPnB1Yi0+dXApCi0JCXJldHVybjsKLQotCWlmIChERVZJQ0VSRU1PVkVEKHdsYykpIHsKLQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLCB3bGMtPnB1Yi0+dW5pdCwKLQkJCSAgX19mdW5jX18pOwotCQlicmNtc19kb3duKHdsYy0+d2wpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogaW5jcmVtZW50IHNlY29uZCBjb3VudCAqLwotCXdsYy0+cHViLT5ub3crKzsKLQotCS8qIGRlbGF5IHJhZGlvIGRpc2FibGUgKi8KLQlpZiAod2xjLT5tcGNfZGVsYXlfb2ZmKSB7Ci0JCWlmICgtLXdsYy0+bXBjX2RlbGF5X29mZiA9PSAwKSB7Ci0JCQltYm9vbHNldCh3bGMtPnB1Yi0+cmFkaW9fZGlzYWJsZWQsCi0JCQkJIFdMX1JBRElPX01QQ19ESVNBQkxFKTsKLQkJCWlmICh3bGMtPm1wYyAmJiBicmNtc19jX2lzbXBjKHdsYykpCi0JCQkJd2xjLT5tcGNfb2ZmY250ID0gMDsKLQkJCXdsYy0+bXBjX2xhc3Rvbl90cyA9IE9TTF9TWVNVUFRJTUUoKTsKLQkJfQotCX0KLQotCS8qIG1wYyBzeW5jICovCi0JYnJjbXNfY19yYWRpb19tcGNfdXBkKHdsYyk7Ci0JLyogcmFkaW8gc3luYzogc3cvaHcvbXBjIC0tPiByYWRpb19kaXNhYmxlL3JhZGlvX2VuYWJsZSAqLwotCWJyY21zX2NfcmFkaW9faHdkaXNhYmxlX3VwZCh3bGMpOwotCWJyY21zX2NfcmFkaW9fdXBkKHdsYyk7Ci0JLyogaWYgcmFkaW8gaXMgZGlzYWJsZSwgZHJpdmVyIG1heSBiZSBkb3duLCBxdWl0IGhlcmUgKi8KLQlpZiAod2xjLT5wdWItPnJhZGlvX2Rpc2FibGVkKQotCQlyZXR1cm47Ci0KLQlicmNtc19iX3dhdGNoZG9nKHdsYyk7Ci0KLQkvKiBvY2Nhc2lvbmFsbHkgc2FtcGxlIG1hYyBzdGF0IGNvdW50ZXJzIHRvIGRldGVjdCAxNi1iaXQgY291bnRlciB3cmFwICovCi0JaWYgKCh3bGMtPnB1Yi0+bm93ICUgU1dfVElNRVJfTUFDX1NUQVRfVVBEKSA9PSAwKQotCQlicmNtc19jX3N0YXRzdXBkKHdsYyk7Ci0KLQkvKiBNYW5hZ2UgVEtJUCBjb3VudGVybWVhc3VyZXMgdGltZXJzICovCi0JRk9SRUFDSF9CU1Mod2xjLCBpLCBjZmcpIHsKLQkJaWYgKGNmZy0+dGtfY21fZHQpIHsKLQkJCWNmZy0+dGtfY21fZHQtLTsKLQkJfQotCQlpZiAoY2ZnLT50a19jbV9idCkgewotCQkJY2ZnLT50a19jbV9idC0tOwotCQl9Ci0JfQotCi0JLyogQ2FsbCBhbnkgcmVnaXN0ZXJlZCB3YXRjaGRvZyBoYW5kbGVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBCUkNNU19NQVhNT0RVTEVTOyBpKyspIHsKLQkJaWYgKHdsYy0+bW9kdWxlY2JbaV0ud2F0Y2hkb2dfZm4pCi0JCQl3bGMtPm1vZHVsZWNiW2ldLndhdGNoZG9nX2ZuKHdsYy0+bW9kdWxlY2JbaV0uaGRsKTsKLQl9Ci0KLQlpZiAoQlJDTVNfSVNOUEhZKHdsYy0+YmFuZCkgJiYgIXdsYy0+cHViLT50ZW1wc2Vuc2VfZGlzYWJsZSAmJgotCSAgICAoKHdsYy0+cHViLT5ub3cgLSB3bGMtPnRlbXBzZW5zZV9sYXN0dGltZSkgPj0KLQkgICAgIEJSQ01TX1RFTVBTRU5TRV9QRVJJT0QpKSB7Ci0JCXdsYy0+dGVtcHNlbnNlX2xhc3R0aW1lID0gd2xjLT5wdWItPm5vdzsKLQkJYnJjbXNfY190ZW1wc2Vuc2VfdXBkKHdsYyk7Ci0JfQotfQotCi0vKiBtYWtlIGludGVyZmFjZSBvcGVyYXRpb25hbCAqLwotaW50IGJyY21zX2NfdXAoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjLT5wdWItPnVuaXQpOwotCi0JLyogSFcgaXMgdHVybmVkIG9mZiBzbyBkb24ndCB0cnkgdG8gYWNjZXNzIGl0ICovCi0JaWYgKHdsYy0+cHViLT5od19vZmYgfHwgREVWSUNFUkVNT1ZFRCh3bGMpKQotCQlyZXR1cm4gLUVOT01FRElVTTsKLQotCWlmICghd2xjLT5wdWItPmh3X3VwKSB7Ci0JCWJyY21zX2JfaHdfdXAod2xjLT5odyk7Ci0JCXdsYy0+cHViLT5od191cCA9IHRydWU7Ci0JfQotCi0JaWYgKCh3bGMtPnB1Yi0+Ym9hcmRmbGFncyAmIEJGTF9GRU0pCi0JICAgICYmICh3bGMtPnB1Yi0+c2loLT5jaGlwID09IEJDTTQzMTNfQ0hJUF9JRCkpIHsKLQkJaWYgKHdsYy0+cHViLT5ib2FyZHJldiA+PSAweDEyNTAKLQkJICAgICYmICh3bGMtPnB1Yi0+Ym9hcmRmbGFncyAmIEJGTF9GRU1fQlQpKSB7Ci0JCQlicmNtc19jX21oZih3bGMsIE1IRjUsIE1IRjVfNDMxM19HUElPQ1RSTCwKLQkJCQlNSEY1XzQzMTNfR1BJT0NUUkwsIEJSQ01fQkFORF9BTEwpOwotCQl9IGVsc2UgewotCQkJYnJjbXNfY19taGYod2xjLCBNSEY0LCBNSEY0X0VYVFBBX0VOQUJMRSwKLQkJCQkgICAgTUhGNF9FWFRQQV9FTkFCTEUsIEJSQ01fQkFORF9BTEwpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBOZWVkIHRvIHJlYWQgdGhlIGh3cmFkaW8gc3RhdHVzIGhlcmUgdG8gY292ZXIgdGhlIGNhc2Ugd2hlcmUgdGhlIHN5c3RlbQotCSAqIGlzIGxvYWRlZCB3aXRoIHRoZSBodyByYWRpbyBkaXNhYmxlZC4gV2UgZG8gbm90IHdhbnQgdG8gYnJpbmcgdGhlIGRyaXZlciB1cCBpbiB0aGlzIGNhc2UuCi0JICogaWYgcmFkaW8gaXMgZGlzYWJsZWQsIGFib3J0IHVwLCBsb3dlciBwb3dlciwgc3RhcnQgcmFkaW8gdGltZXIgYW5kIHJldHVybiAwKGZvciBORElTKQotCSAqIGRvbid0IGNhbGwgcmFkaW9fdXBkYXRlIHRvIGF2b2lkIGxvb3BpbmcgYnJjbXNfY191cC4KLQkgKgotCSAqIGJyY21zX2JfdXBfcHJlcCgpIHJldHVybnMgZWl0aGVyIDAgb3IgLUJDTUVfUkFESU9PRkYgb25seQotCSAqLwotCWlmICghd2xjLT5wdWItPnJhZGlvX2Rpc2FibGVkKSB7Ci0JCWludCBzdGF0dXMgPSBicmNtc19iX3VwX3ByZXAod2xjLT5odyk7Ci0JCWlmIChzdGF0dXMgPT0gLUVOT01FRElVTSkgewotCQkJaWYgKCFtYm9vbGlzc2V0Ci0JCQkgICAgKHdsYy0+cHViLT5yYWRpb19kaXNhYmxlZCwgV0xfUkFESU9fSFdfRElTQUJMRSkpIHsKLQkJCQlpbnQgaWR4OwotCQkJCXN0cnVjdCBicmNtc19ic3NfY2ZnICpic3NjZmc7Ci0JCQkJbWJvb2xzZXQod2xjLT5wdWItPnJhZGlvX2Rpc2FibGVkLAotCQkJCQkgV0xfUkFESU9fSFdfRElTQUJMRSk7Ci0KLQkJCQlGT1JFQUNIX0JTUyh3bGMsIGlkeCwgYnNzY2ZnKSB7Ci0JCQkJCWlmICghQlNTQ0ZHX1NUQShic3NjZmcpCi0JCQkJCSAgICB8fCAhYnNzY2ZnLT5lbmFibGUgfHwgIWJzc2NmZy0+QlNTKQotCQkJCQkJY29udGludWU7Ci0JCQkJCXdpcGh5X2Vycih3bGMtPndpcGh5LCAid2wlZC4lZDogdXAiCi0JCQkJCQkgICI6IHJmZGlzYWJsZSAtPiAiCi0JCQkJCQkgICJic3NjZmdfZGlzYWJsZSgpXG4iLAotCQkJCQkJICAgd2xjLT5wdWItPnVuaXQsIGlkeCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JaWYgKHdsYy0+cHViLT5yYWRpb19kaXNhYmxlZCkgewotCQlicmNtc19jX3JhZGlvX21vbml0b3Jfc3RhcnQod2xjKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogYnJjbXNfYl91cF9wcmVwIGhhcyBkb25lIGJyY21zX2NfY29yZXJlc2V0KCkuIHNvIGNsayBpcyBvbiwgc2V0IGl0ICovCi0Jd2xjLT5jbGsgPSB0cnVlOwotCi0JYnJjbXNfY19yYWRpb19tb25pdG9yX3N0b3Aod2xjKTsKLQotCS8qIFNldCBFRENGIGhvc3RmbGFncyAqLwotCWlmIChFRENGX0VOQUIod2xjLT5wdWIpKSB7Ci0JCWJyY21zX2NfbWhmKHdsYywgTUhGMSwgTUhGMV9FRENGLCBNSEYxX0VEQ0YsIEJSQ01fQkFORF9BTEwpOwotCX0gZWxzZSB7Ci0JCWJyY21zX2NfbWhmKHdsYywgTUhGMSwgTUhGMV9FRENGLCAwLCBCUkNNX0JBTkRfQUxMKTsKLQl9Ci0KLQlpZiAoQlJDTVNfV0FSMTYxNjUod2xjKSkKLQkJYnJjbXNfY19taGYod2xjLCBNSEYyLCBNSEYyX1BDSVNMT1dDTEtXQVIsIE1IRjJfUENJU0xPV0NMS1dBUiwKLQkJCUJSQ01fQkFORF9BTEwpOwotCi0JYnJjbXNfaW5pdCh3bGMtPndsKTsKLQl3bGMtPnB1Yi0+dXAgPSB0cnVlOwotCi0JaWYgKHdsYy0+YmFuZGluaXRfcGVuZGluZykgewotCQlicmNtc19jX3N1c3BlbmRfbWFjX2FuZF93YWl0KHdsYyk7Ci0JCWJyY21zX2Nfc2V0X2NoYW5zcGVjKHdsYywgd2xjLT5kZWZhdWx0X2Jzcy0+Y2hhbnNwZWMpOwotCQl3bGMtPmJhbmRpbml0X3BlbmRpbmcgPSBmYWxzZTsKLQkJYnJjbXNfY19lbmFibGVfbWFjKHdsYyk7Ci0JfQotCi0JYnJjbXNfYl91cF9maW5pc2god2xjLT5odyk7Ci0KLQkvKiBvdGhlciBzb2Z0d2FyZSBzdGF0ZXMgdXAgYWZ0ZXIgSVNSIGlzIHJ1bm5pbmcgKi8KLQkvKiBzdGFydCBBUHMgdGhhdCB3ZXJlIHRvIGJlIGJyb3VnaHQgdXAgYnV0IGFyZSBub3QgdXAgIHlldCAqLwotCS8qIGlmIChBUF9FTkFCKHdsYy0+cHViKSkgYnJjbXNfY19yZXN0YXJ0X2FwKHdsYy0+YXApOyAqLwotCi0JLyogUHJvZ3JhbSB0aGUgVFggd21lIHBhcmFtcyB3aXRoIHRoZSBjdXJyZW50IHNldHRpbmdzICovCi0JYnJjbXNfY193bWVfcmV0cmllc193cml0ZSh3bGMpOwotCi0JLyogc3RhcnQgb25lIHNlY29uZCB3YXRjaGRvZyB0aW1lciAqLwotCWJyY21zX2FkZF90aW1lcih3bGMtPndsLCB3bGMtPndkdGltZXIsIFRJTUVSX0lOVEVSVkFMX1dBVENIRE9HLCB0cnVlKTsKLQl3bGMtPldEYXJtZWQgPSB0cnVlOwotCi0JLyogZW5zdXJlIGFudGVubmEgY29uZmlnIGlzIHVwIHRvIGRhdGUgKi8KLQlicmNtc19jX3N0Zl9waHlfdHhhbnRfdXBkKHdsYyk7Ci0JLyogZW5zdXJlIExEUEMgY29uZmlnIGlzIGluIHN5bmMgKi8KLQlicmNtc19jX2h0X3VwZGF0ZV9sZHBjKHdsYywgd2xjLT5zdGYtPmxkcGMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIEluaXRpYWxpemUgdGhlIGJhc2UgcHJlY2VkZW5jZSBtYXAgZm9yIGRlcXVldWVpbmcgZnJvbSB0eHEgYmFzZWQgb24gV01FIHNldHRpbmdzICovCi1zdGF0aWMgdm9pZCBicmNtc19jX3R4X3ByZWNfbWFwX2luaXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCXdsYy0+dHhfcHJlY19tYXAgPSBCUkNNU19QUkVDX0JNUF9BTEw7Ci0JbWVtc2V0KHdsYy0+ZmlmbzJwcmVjX21hcCwgMCwgTkZJRk8gKiBzaXplb2YodTE2KSk7Ci0KLQkvKiBGb3Igbm9uLVdNRSwgYm90aCBmaWZvcyBoYXZlIG92ZXJsYXBwaW5nIE1BWFBSSU8uIFNvIGp1c3QgZGlzYWJsZSBhbGwgcHJlY2VkZW5jZXMKLQkgKiBpZiBlaXRoZXIgaXMgZnVsbC4KLQkgKi8KLQlpZiAoIUVEQ0ZfRU5BQih3bGMtPnB1YikpIHsKLQkJd2xjLT5maWZvMnByZWNfbWFwW1RYX0RBVEFfRklGT10gPSBCUkNNU19QUkVDX0JNUF9BTEw7Ci0JCXdsYy0+ZmlmbzJwcmVjX21hcFtUWF9DVExfRklGT10gPSBCUkNNU19QUkVDX0JNUF9BTEw7Ci0JfSBlbHNlIHsKLQkJd2xjLT5maWZvMnByZWNfbWFwW1RYX0FDX0JLX0ZJRk9dID0gQlJDTVNfUFJFQ19CTVBfQUNfQks7Ci0JCXdsYy0+ZmlmbzJwcmVjX21hcFtUWF9BQ19CRV9GSUZPXSA9IEJSQ01TX1BSRUNfQk1QX0FDX0JFOwotCQl3bGMtPmZpZm8ycHJlY19tYXBbVFhfQUNfVklfRklGT10gPSBCUkNNU19QUkVDX0JNUF9BQ19WSTsKLQkJd2xjLT5maWZvMnByZWNfbWFwW1RYX0FDX1ZPX0ZJRk9dID0gQlJDTVNfUFJFQ19CTVBfQUNfVk87Ci0JfQotfQotCi1zdGF0aWMgdWludCBicmNtc19jX2Rvd25fZGVsX3RpbWVyKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQl1aW50IGNhbGxiYWNrcyA9IDA7Ci0KLQlyZXR1cm4gY2FsbGJhY2tzOwotfQotCi0vKgotICogTWFyayB0aGUgaW50ZXJmYWNlIG5vbm9wZXJhdGlvbmFsLCBzdG9wIHRoZSBzb2Z0d2FyZSBtZWNoYW5pc21zLAotICogZGlzYWJsZSB0aGUgaGFyZHdhcmUsIGZyZWUgYW55IHRyYW5zaWVudCBidWZmZXIgc3RhdGUuCi0gKiBSZXR1cm4gYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGRyaXZlciBjYWxsYmFja3Mgc3RpbGwgcGVuZGluZy4KLSAqLwotdWludCBicmNtc19jX2Rvd24oc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCi0JdWludCBjYWxsYmFja3MgPSAwOwotCWludCBpOwotCWJvb2wgZGV2X2dvbmUgPSBmYWxzZTsKLQlzdHJ1Y3QgYnJjbXNfdHhxX2luZm8gKnFpOwotCi0JQkNNTVNHKHdsYy0+d2lwaHksICJ3bCVkXG4iLCB3bGMtPnB1Yi0+dW5pdCk7Ci0KLQkvKiBjaGVjayBpZiB3ZSBhcmUgYWxyZWFkeSBpbiB0aGUgZ29pbmcgZG93biBwYXRoICovCi0JaWYgKHdsYy0+Z29pbmdfZG93bikgewotCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIndsJWQ6ICVzOiBEcml2ZXIgZ29pbmcgZG93biBzbyByZXR1cm4iCi0JCQkgICJcbiIsIHdsYy0+cHViLT51bml0LCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAwOwotCX0KLQlpZiAoIXdsYy0+cHViLT51cCkKLQkJcmV0dXJuIGNhbGxiYWNrczsKLQotCS8qIGluIGJldHdlZW4sIG1wYyBjb3VsZCB0cnkgdG8gYnJpbmcgZG93biBhZ2Fpbi4uICovCi0Jd2xjLT5nb2luZ19kb3duID0gdHJ1ZTsKLQotCWNhbGxiYWNrcyArPSBicmNtc19iX2JtYWNfZG93bl9wcmVwKHdsYy0+aHcpOwotCi0JZGV2X2dvbmUgPSBERVZJQ0VSRU1PVkVEKHdsYyk7Ci0KLQkvKiBDYWxsIGFueSByZWdpc3RlcmVkIGRvd24gaGFuZGxlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQlJDTVNfTUFYTU9EVUxFUzsgaSsrKSB7Ci0JCWlmICh3bGMtPm1vZHVsZWNiW2ldLmRvd25fZm4pCi0JCQljYWxsYmFja3MgKz0KLQkJCSAgICB3bGMtPm1vZHVsZWNiW2ldLmRvd25fZm4od2xjLT5tb2R1bGVjYltpXS5oZGwpOwotCX0KLQotCS8qIGNhbmNlbCB0aGUgd2F0Y2hkb2cgdGltZXIgKi8KLQlpZiAod2xjLT5XRGFybWVkKSB7Ci0JCWlmICghYnJjbXNfZGVsX3RpbWVyKHdsYy0+d2wsIHdsYy0+d2R0aW1lcikpCi0JCQljYWxsYmFja3MrKzsKLQkJd2xjLT5XRGFybWVkID0gZmFsc2U7Ci0JfQotCS8qIGNhbmNlbCBhbGwgb3RoZXIgdGltZXJzICovCi0JY2FsbGJhY2tzICs9IGJyY21zX2NfZG93bl9kZWxfdGltZXIod2xjKTsKLQotCXdsYy0+cHViLT51cCA9IGZhbHNlOwotCi0Jd2xjX3BoeV9tdXRlX3VwZCh3bGMtPmJhbmQtPnBpLCBmYWxzZSwgUEhZX01VVEVfQUxMKTsKLQotCS8qIGNsZWFyIHR4cSBmbG93IGNvbnRyb2wgKi8KLQlicmNtc19jX3R4Zmxvd2NvbnRyb2xfcmVzZXQod2xjKTsKLQotCS8qIGZsdXNoIHR4IHF1ZXVlcyAqLwotCWZvciAocWkgPSB3bGMtPnR4X3F1ZXVlczsgcWkgIT0gTlVMTDsgcWkgPSBxaS0+bmV4dCkgewotCQlicmNtdV9wa3RxX2ZsdXNoKCZxaS0+cSwgdHJ1ZSwgTlVMTCwgTlVMTCk7Ci0JfQotCi0JY2FsbGJhY2tzICs9IGJyY21zX2JfZG93bl9maW5pc2god2xjLT5odyk7Ci0KLQkvKiBicmNtc19iX2Rvd25fZmluaXNoIGhhcyBkb25lIGJyY21zX2NfY29yZWRpc2FibGUoKS4gc28gY2xrIGlzIG9mZiAqLwotCXdsYy0+Y2xrID0gZmFsc2U7Ci0KLQl3bGMtPmdvaW5nX2Rvd24gPSBmYWxzZTsKLQlyZXR1cm4gY2FsbGJhY2tzOwotfQotCi0vKiBTZXQgdGhlIGN1cnJlbnQgZ21vZGUgY29uZmlndXJhdGlvbiAqLwotaW50IGJyY21zX2Nfc2V0X2dtb2RlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdTggZ21vZGUsIGJvb2wgY29uZmlnKQotewotCWludCByZXQgPSAwOwotCXVpbnQgaTsKLQl3bGNfcmF0ZXNldF90IHJzOwotCS8qIERlZmF1bHQgdG8gNTRnIEF1dG8gKi8KLQkvKiBBZHZlcnRpc2UgYW5kIHVzZSBzaG9ydHNsb3QgKC0xLzAvMSBBdXRvL09mZi9PbikgKi8KLQlzOCBzaG9ydHNsb3QgPSBCUkNNU19TSE9SVFNMT1RfQVVUTzsKLQlib29sIHNob3J0c2xvdF9yZXN0cmljdCA9IGZhbHNlOwkvKiBSZXN0cmljdCBhc3NvY2lhdGlvbiB0byBzdGF0aW9ucyB0aGF0IHN1cHBvcnQgc2hvcnRzbG90Ci0JCQkJCQkgKi8KLQlib29sIG9mZG1fYmFzaWMgPSBmYWxzZTsJLyogTWFrZSA2LCAxMiwgYW5kIDI0IGJhc2ljIHJhdGVzICovCi0JLyogQWR2ZXJ0aXNlIGFuZCB1c2Ugc2hvcnQgcHJlYW1ibGVzICgtMS8wLzEgQXV0by9PZmYvT24pICovCi0JaW50IHByZWFtYmxlID0gQlJDTVNfUExDUF9MT05HOwotCWJvb2wgcHJlYW1ibGVfcmVzdHJpY3QgPSBmYWxzZTsJLyogUmVzdHJpY3QgYXNzb2NpYXRpb24gdG8gc3RhdGlvbnMgdGhhdCBzdXBwb3J0IHNob3J0Ci0JCQkJCSAqIHByZWFtYmxlcwotCQkJCQkgKi8KLQlzdHJ1Y3QgYnJjbXNfYmFuZCAqYmFuZDsKLQotCS8qIGlmIE4tc3VwcG9ydCBpcyBlbmFibGVkLCBhbGxvdyBHbW9kZSBzZXQgYXMgbG9uZyBhcyByZXF1ZXN0ZWQKLQkgKiBHbW9kZSBpcyBub3QgR01PREVfTEVHQUNZX0IKLQkgKi8KLQlpZiAoTl9FTkFCKHdsYy0+cHViKSAmJiBnbW9kZSA9PSBHTU9ERV9MRUdBQ1lfQikKLQkJcmV0dXJuIC1FTk9UU1VQUDsKLQotCS8qIHZlcmlmeSB0aGF0IHdlIGFyZSBkZWFsaW5nIHdpdGggMkcgYmFuZCBhbmQgZ3JhYiB0aGUgYmFuZCBwb2ludGVyICovCi0JaWYgKHdsYy0+YmFuZC0+YmFuZHR5cGUgPT0gQlJDTV9CQU5EXzJHKQotCQliYW5kID0gd2xjLT5iYW5kOwotCWVsc2UgaWYgKChOQkFORFMod2xjKSA+IDEpICYmCi0JCSAod2xjLT5iYW5kc3RhdGVbT1RIRVJCQU5EVU5JVCh3bGMpXS0+YmFuZHR5cGUgPT0gQlJDTV9CQU5EXzJHKSkKLQkJYmFuZCA9IHdsYy0+YmFuZHN0YXRlW09USEVSQkFORFVOSVQod2xjKV07Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIExlZ2FjeSBvciBidXN0IHdoZW4gbm8gT0ZETSBpcyBzdXBwb3J0ZWQgYnkgcmVndWxhdG9yeSAqLwotCWlmICgoYnJjbXNfY19jaGFubmVsX2xvY2FsZV9mbGFnc19pbl9iYW5kKHdsYy0+Y21pLCBiYW5kLT5iYW5kdW5pdCkgJgotCSAgICAgQlJDTVNfTk9fT0ZETSkgJiYgKGdtb2RlICE9IEdNT0RFX0xFR0FDWV9CKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiB1cGRhdGUgY29uZmlndXJhdGlvbiB2YWx1ZSAqLwotCWlmIChjb25maWcgPT0gdHJ1ZSkKLQkJYnJjbXNfY19wcm90ZWN0aW9uX3VwZCh3bGMsIEJSQ01TX1BST1RfR19VU0VSLCBnbW9kZSk7Ci0KLQkvKiBDbGVhciBzdXBwb3J0ZWQgcmF0ZXMgZmlsdGVyICovCi0JbWVtc2V0KCZ3bGMtPnN1cF9yYXRlc19vdmVycmlkZSwgMCwgc2l6ZW9mKHdsY19yYXRlc2V0X3QpKTsKLQotCS8qIENsZWFyIHJhdGVzZXQgb3ZlcnJpZGUgKi8KLQltZW1zZXQoJnJzLCAwLCBzaXplb2Yod2xjX3JhdGVzZXRfdCkpOwotCi0Jc3dpdGNoIChnbW9kZSkgewotCWNhc2UgR01PREVfTEVHQUNZX0I6Ci0JCXNob3J0c2xvdCA9IEJSQ01TX1NIT1JUU0xPVF9PRkY7Ci0JCWJyY21zX2NfcmF0ZXNldF9jb3B5KCZncGh5X2xlZ2FjeV9yYXRlcywgJnJzKTsKLQotCQlicmVhazsKLQotCWNhc2UgR01PREVfTFJTOgotCQlpZiAoQVBfRU5BQih3bGMtPnB1YikpCi0JCQlicmNtc19jX3JhdGVzZXRfY29weSgmY2NrX3JhdGVzLAotCQkJCQkgICAgICZ3bGMtPnN1cF9yYXRlc19vdmVycmlkZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBHTU9ERV9BVVRPOgotCQkvKiBBY2NlcHQgZGVmYXVsdHMgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIEdNT0RFX09OTFk6Ci0JCW9mZG1fYmFzaWMgPSB0cnVlOwotCQlwcmVhbWJsZSA9IEJSQ01TX1BMQ1BfU0hPUlQ7Ci0JCXByZWFtYmxlX3Jlc3RyaWN0ID0gdHJ1ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIEdNT0RFX1BFUkZPUk1BTkNFOgotCQlpZiAoQVBfRU5BQih3bGMtPnB1YikpCS8qIFB1dCBhbGwgcmF0ZXMgaW50byB0aGUgU3VwcG9ydGVkIFJhdGVzIGVsZW1lbnQgKi8KLQkJCWJyY21zX2NfcmF0ZXNldF9jb3B5KCZjY2tfb2ZkbV9yYXRlcywKLQkJCQkJICZ3bGMtPnN1cF9yYXRlc19vdmVycmlkZSk7Ci0KLQkJc2hvcnRzbG90ID0gQlJDTVNfU0hPUlRTTE9UX09OOwotCQlzaG9ydHNsb3RfcmVzdHJpY3QgPSB0cnVlOwotCQlvZmRtX2Jhc2ljID0gdHJ1ZTsKLQkJcHJlYW1ibGUgPSBCUkNNU19QTENQX1NIT1JUOwotCQlwcmVhbWJsZV9yZXN0cmljdCA9IHRydWU7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJLyogRXJyb3IgKi8KLQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICJ3bCVkOiAlczogaW52YWxpZCBnbW9kZSAlZFxuIiwKLQkJCSAgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBnbW9kZSk7Ci0JCXJldHVybiAtRU5PVFNVUFA7Ci0JfQotCi0JLyoKLQkgKiBJZiB3ZSBhcmUgc3dpdGNoaW5nIHRvIGdtb2RlID09IEdNT0RFX0xFR0FDWV9CLAotCSAqIGNsZWFuIHVwIHJhdGUgaW5mbyB0aGF0IG1heSByZWZlciB0byBPRkRNIHJhdGVzLgotCSAqLwotCWlmICgoZ21vZGUgPT0gR01PREVfTEVHQUNZX0IpICYmIChiYW5kLT5nbW9kZSAhPSBHTU9ERV9MRUdBQ1lfQikpIHsKLQkJYmFuZC0+Z21vZGUgPSBnbW9kZTsKLQkJaWYgKGJhbmQtPnJzcGVjX292ZXJyaWRlICYmICFJU19DQ0soYmFuZC0+cnNwZWNfb3ZlcnJpZGUpKSB7Ci0JCQliYW5kLT5yc3BlY19vdmVycmlkZSA9IDA7Ci0JCQlicmNtc19jX3JlcHJhdGVfaW5pdCh3bGMpOwotCQl9Ci0JCWlmIChiYW5kLT5tcnNwZWNfb3ZlcnJpZGUgJiYgIUlTX0NDSyhiYW5kLT5tcnNwZWNfb3ZlcnJpZGUpKSB7Ci0JCQliYW5kLT5tcnNwZWNfb3ZlcnJpZGUgPSAwOwotCQl9Ci0JfQotCi0JYmFuZC0+Z21vZGUgPSBnbW9kZTsKLQotCXdsYy0+c2hvcnRzbG90X292ZXJyaWRlID0gc2hvcnRzbG90OwotCi0JaWYgKEFQX0VOQUIod2xjLT5wdWIpKSB7Ci0JCS8qIHdsYy0+YXAtPnNob3J0c2xvdF9yZXN0cmljdCA9IHNob3J0c2xvdF9yZXN0cmljdDsgKi8KLQkJd2xjLT5QTENQSGRyX292ZXJyaWRlID0KLQkJICAgIChwcmVhbWJsZSAhPQotCQkgICAgIEJSQ01TX1BMQ1BfTE9ORykgPyBCUkNNU19QTENQX1NIT1JUIDogQlJDTVNfUExDUF9BVVRPOwotCX0KLQotCWlmICgoQVBfRU5BQih3bGMtPnB1YikgJiYgcHJlYW1ibGUgIT0gQlJDTVNfUExDUF9MT05HKQotCSAgICB8fCBwcmVhbWJsZSA9PSBCUkNNU19QTENQX1NIT1JUKQotCQl3bGMtPmRlZmF1bHRfYnNzLT5jYXBhYmlsaXR5IHw9IFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRTsKLQllbHNlCi0JCXdsYy0+ZGVmYXVsdF9ic3MtPmNhcGFiaWxpdHkgJj0gfldMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRTsKLQotCS8qIFVwZGF0ZSBzaG9ydHNsb3QgY2FwYWJpbGl0eSBiaXQgZm9yIEFQIGFuZCBJQlNTICovCi0JaWYgKChBUF9FTkFCKHdsYy0+cHViKSAmJiBzaG9ydHNsb3QgPT0gQlJDTVNfU0hPUlRTTE9UX0FVVE8pIHx8Ci0JICAgIHNob3J0c2xvdCA9PSBCUkNNU19TSE9SVFNMT1RfT04pCi0JCXdsYy0+ZGVmYXVsdF9ic3MtPmNhcGFiaWxpdHkgfD0gV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1RfVElNRTsKLQllbHNlCi0JCXdsYy0+ZGVmYXVsdF9ic3MtPmNhcGFiaWxpdHkgJj0KLQkJCQkJfldMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UX1RJTUU7Ci0KLQkvKiBVc2UgdGhlIGRlZmF1bHQgMTFnIHJhdGVzZXQgKi8KLQlpZiAoIXJzLmNvdW50KQotCQlicmNtc19jX3JhdGVzZXRfY29weSgmY2NrX29mZG1fcmF0ZXMsICZycyk7Ci0KLQlpZiAob2ZkbV9iYXNpYykgewotCQlmb3IgKGkgPSAwOyBpIDwgcnMuY291bnQ7IGkrKykgewotCQkJaWYgKHJzLnJhdGVzW2ldID09IEJSQ01fUkFURV82TQotCQkJICAgIHx8IHJzLnJhdGVzW2ldID09IEJSQ01fUkFURV8xMk0KLQkJCSAgICB8fCBycy5yYXRlc1tpXSA9PSBCUkNNX1JBVEVfMjRNKQotCQkJCXJzLnJhdGVzW2ldIHw9IEJSQ01TX1JBVEVfRkxBRzsKLQkJfQotCX0KLQotCS8qIFNldCBkZWZhdWx0IGJzcyByYXRlc2V0ICovCi0Jd2xjLT5kZWZhdWx0X2Jzcy0+cmF0ZXNldC5jb3VudCA9IHJzLmNvdW50OwotCW1lbWNweSh3bGMtPmRlZmF1bHRfYnNzLT5yYXRlc2V0LnJhdGVzLCBycy5yYXRlcywKLQkgICAgICAgc2l6ZW9mKHdsYy0+ZGVmYXVsdF9ic3MtPnJhdGVzZXQucmF0ZXMpKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYnJjbXNfY19ubW9kZV92YWxpZGF0ZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHMzMiBubW9kZSkKLXsKLQlpbnQgZXJyID0gMDsKLQotCXN3aXRjaCAobm1vZGUpIHsKLQotCWNhc2UgT0ZGOgotCQlicmVhazsKLQotCWNhc2UgQVVUTzoKLQljYXNlIFdMXzExTl8yeDI6Ci0JY2FzZSBXTF8xMU5fM3gzOgotCQlpZiAoIShCUkNNU19QSFlfMTFOX0NBUCh3bGMtPmJhbmQpKSkKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZXJyID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGVycjsKLX0KLQotaW50IGJyY21zX2Nfc2V0X25tb2RlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgczMyIG5tb2RlKQotewotCXVpbnQgaTsKLQlpbnQgZXJyOwotCi0JZXJyID0gYnJjbXNfY19ubW9kZV92YWxpZGF0ZSh3bGMsIG5tb2RlKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0Jc3dpdGNoIChubW9kZSkgewotCWNhc2UgT0ZGOgotCQl3bGMtPnB1Yi0+X25fZW5hYiA9IE9GRjsKLQkJd2xjLT5kZWZhdWx0X2Jzcy0+ZmxhZ3MgJj0gfkJSQ01TX0JTU19IVDsKLQkJLyogZGVsZXRlIHRoZSBtY3MgcmF0ZXMgZnJvbSB0aGUgZGVmYXVsdCBhbmQgaHcgcmF0ZXNldHMgKi8KLQkJYnJjbXNfY19yYXRlc2V0X21jc19jbGVhcigmd2xjLT5kZWZhdWx0X2Jzcy0+cmF0ZXNldCk7Ci0JCWZvciAoaSA9IDA7IGkgPCBOQkFORFMod2xjKTsgaSsrKSB7Ci0JCQltZW1zZXQod2xjLT5iYW5kc3RhdGVbaV0tPmh3X3JhdGVzZXQubWNzLCAwLAotCQkJICAgICAgIE1DU1NFVF9MRU4pOwotCQkJaWYgKElTX01DUyh3bGMtPmJhbmQtPnJzcGVjX292ZXJyaWRlKSkgewotCQkJCXdsYy0+YmFuZHN0YXRlW2ldLT5yc3BlY19vdmVycmlkZSA9IDA7Ci0JCQkJYnJjbXNfY19yZXByYXRlX2luaXQod2xjKTsKLQkJCX0KLQkJCWlmIChJU19NQ1Mod2xjLT5iYW5kLT5tcnNwZWNfb3ZlcnJpZGUpKQotCQkJCXdsYy0+YmFuZHN0YXRlW2ldLT5tcnNwZWNfb3ZlcnJpZGUgPSAwOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBBVVRPOgotCQlpZiAod2xjLT5zdGYtPnR4c3RyZWFtcyA9PSBXTF8xMU5fM3gzKQotCQkJbm1vZGUgPSBXTF8xMU5fM3gzOwotCQllbHNlCi0JCQlubW9kZSA9IFdMXzExTl8yeDI7Ci0JY2FzZSBXTF8xMU5fMngyOgotCWNhc2UgV0xfMTFOXzN4MzoKLQkJLyogZm9yY2UgR01PREVfQVVUTyBpZiBOTU9ERSBpcyBPTiAqLwotCQlicmNtc19jX3NldF9nbW9kZSh3bGMsIEdNT0RFX0FVVE8sIHRydWUpOwotCQlpZiAobm1vZGUgPT0gV0xfMTFOXzN4MykKLQkJCXdsYy0+cHViLT5fbl9lbmFiID0gU1VQUE9SVF9IVDsKLQkJZWxzZQotCQkJd2xjLT5wdWItPl9uX2VuYWIgPSBTVVBQT1JUXzExTjsKLQkJd2xjLT5kZWZhdWx0X2Jzcy0+ZmxhZ3MgfD0gQlJDTVNfQlNTX0hUOwotCQkvKiBhZGQgdGhlIG1jcyByYXRlcyB0byB0aGUgZGVmYXVsdCBhbmQgaHcgcmF0ZXNldHMgKi8KLQkJYnJjbXNfY19yYXRlc2V0X21jc19idWlsZCgmd2xjLT5kZWZhdWx0X2Jzcy0+cmF0ZXNldCwKLQkJCQkgICAgICB3bGMtPnN0Zi0+dHhzdHJlYW1zKTsKLQkJZm9yIChpID0gMDsgaSA8IE5CQU5EUyh3bGMpOyBpKyspCi0JCQltZW1jcHkod2xjLT5iYW5kc3RhdGVbaV0tPmh3X3JhdGVzZXQubWNzLAotCQkJICAgICAgIHdsYy0+ZGVmYXVsdF9ic3MtPnJhdGVzZXQubWNzLCBNQ1NTRVRfTEVOKTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IGJyY21zX2Nfc2V0X3JhdGVzZXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB3bGNfcmF0ZXNldF90ICpyc19hcmcpCi17Ci0Jd2xjX3JhdGVzZXRfdCBycywgbmV3OwotCXVpbnQgYmFuZHVuaXQ7Ci0KLQltZW1jcHkoJnJzLCByc19hcmcsIHNpemVvZih3bGNfcmF0ZXNldF90KSk7Ci0KLQkvKiBjaGVjayBmb3IgYmFkIGNvdW50IHZhbHVlICovCi0JaWYgKChycy5jb3VudCA9PSAwKSB8fCAocnMuY291bnQgPiBCUkNNU19OVU1SQVRFUykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogdHJ5IHRoZSBjdXJyZW50IGJhbmQgKi8KLQliYW5kdW5pdCA9IHdsYy0+YmFuZC0+YmFuZHVuaXQ7Ci0JbWVtY3B5KCZuZXcsICZycywgc2l6ZW9mKHdsY19yYXRlc2V0X3QpKTsKLQlpZiAoYnJjbXNfY19yYXRlX2h3cnNfZmlsdGVyX3NvcnRfdmFsaWRhdGUKLQkgICAgKCZuZXcsICZ3bGMtPmJhbmRzdGF0ZVtiYW5kdW5pdF0tPmh3X3JhdGVzZXQsIHRydWUsCi0JICAgICB3bGMtPnN0Zi0+dHhzdHJlYW1zKSkKLQkJZ290byBnb29kOwotCi0JLyogdHJ5IHRoZSBvdGhlciBiYW5kICovCi0JaWYgKElTX01CQU5EX1VOTE9DS0VEKHdsYykpIHsKLQkJYmFuZHVuaXQgPSBPVEhFUkJBTkRVTklUKHdsYyk7Ci0JCW1lbWNweSgmbmV3LCAmcnMsIHNpemVvZih3bGNfcmF0ZXNldF90KSk7Ci0JCWlmIChicmNtc19jX3JhdGVfaHdyc19maWx0ZXJfc29ydF92YWxpZGF0ZSgmbmV3LAotCQkJCQkJICAgICAgICZ3bGMtPgotCQkJCQkJICAgICAgIGJhbmRzdGF0ZVtiYW5kdW5pdF0tPgotCQkJCQkJICAgICAgIGh3X3JhdGVzZXQsIHRydWUsCi0JCQkJCQkgICAgICAgd2xjLT5zdGYtPnR4c3RyZWFtcykpCi0JCQlnb3RvIGdvb2Q7Ci0JfQotCi0JcmV0dXJuIC1FQkFERTsKLQotIGdvb2Q6Ci0JLyogYXBwbHkgbmV3IHJhdGVzZXQgKi8KLQltZW1jcHkoJndsYy0+ZGVmYXVsdF9ic3MtPnJhdGVzZXQsICZuZXcsIHNpemVvZih3bGNfcmF0ZXNldF90KSk7Ci0JbWVtY3B5KCZ3bGMtPmJhbmRzdGF0ZVtiYW5kdW5pdF0tPmRlZnJhdGVzZXQsICZuZXcsCi0JICAgICAgIHNpemVvZih3bGNfcmF0ZXNldF90KSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIHNpbXBsaWZpZWQgaW50ZWdlciBzZXQgaW50ZXJmYWNlIGZvciBjb21tb24gaW9jdGwgaGFuZGxlciAqLwotaW50IGJyY21zX2Nfc2V0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgaW50IGNtZCwgaW50IGFyZykKLXsKLQlyZXR1cm4gYnJjbXNfY19pb2N0bCh3bGMsIGNtZCwgKHZvaWQgKikmYXJnLCBzaXplb2YoYXJnKSwgTlVMTCk7Ci19Ci0KLS8qIHNpbXBsaWZpZWQgaW50ZWdlciBnZXQgaW50ZXJmYWNlIGZvciBjb21tb24gaW9jdGwgaGFuZGxlciAqLwotaW50IGJyY21zX2NfZ2V0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgaW50IGNtZCwgaW50ICphcmcpCi17Ci0JcmV0dXJuIGJyY21zX2NfaW9jdGwod2xjLCBjbWQsIGFyZywgc2l6ZW9mKGludCksIE5VTEwpOwotfQotCi1zdGF0aWMgdm9pZCBicmNtc19jX29mZG1fcmF0ZXNldF93YXIoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCXU4IHI7Ci0JYm9vbCB3YXIgPSBmYWxzZTsKLQotCWlmICh3bGMtPmNmZy0+YXNzb2NpYXRlZCkKLQkJciA9IHdsYy0+Y2ZnLT5jdXJyZW50X2Jzcy0+cmF0ZXNldC5yYXRlc1swXTsKLQllbHNlCi0JCXIgPSB3bGMtPmRlZmF1bHRfYnNzLT5yYXRlc2V0LnJhdGVzWzBdOwotCi0Jd2xjX3BoeV9vZmRtX3JhdGVzZXRfd2FyKHdsYy0+YmFuZC0+cGksIHdhcik7Ci0KLQlyZXR1cm47Ci19Ci0KLWludAotYnJjbXNfY19pb2N0bChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGludCBjbWQsIHZvaWQgKmFyZywgaW50IGxlbiwKLQkgICAgICBzdHJ1Y3QgYnJjbXNfY19pZiAqd2xjaWYpCi17Ci0JcmV0dXJuIF9icmNtc19jX2lvY3RsKHdsYywgY21kLCBhcmcsIGxlbiwgd2xjaWYpOwotfQotCi0vKiBjb21tb24gaW9jdGwgaGFuZGxlci4gcmV0dXJuOiAwPW9rLCAtMT1lcnJvciwgcG9zaXRpdmU9cGFydGljdWxhciBlcnJvciAqLwotc3RhdGljIGludAotX2JyY21zX2NfaW9jdGwoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBpbnQgY21kLCB2b2lkICphcmcsIGludCBsZW4sCi0JICAgICAgIHN0cnVjdCBicmNtc19jX2lmICp3bGNpZikKLXsKLQlpbnQgdmFsLCAqcHZhbDsKLQlib29sIGJvb2xfdmFsOwotCWludCBiY21lcnJvcjsKLQlzdHJ1Y3Qgc2NiICpuZXh0c2NiOwotCWJvb2wgdGFfb2s7Ci0JdWludCBiYW5kOwotCXN0cnVjdCBicmNtc19ic3NfY2ZnICpic3NjZmc7Ci0Jc3RydWN0IGJyY21zX2Jzc19pbmZvICpjdXJyZW50X2JzczsKLQotCS8qIHVwZGF0ZSBic3NjZmcgcG9pbnRlciAqLwotCWJzc2NmZyA9IHdsYy0+Y2ZnOwotCWN1cnJlbnRfYnNzID0gYnNzY2ZnLT5jdXJyZW50X2JzczsKLQotCS8qIGluaXRpYWxpemUgdGhlIGZvbGxvd2luZyB0byBnZXQgcmlkIG9mIGNvbXBpbGVyIHdhcm5pbmcgKi8KLQluZXh0c2NiID0gTlVMTDsKLQl0YV9vayA9IGZhbHNlOwotCWJhbmQgPSAwOwotCi0JLyogSWYgdGhlIGRldmljZSBpcyB0dXJuZWQgb2ZmLCB0aGVuIGl0J3Mgbm90ICJyZW1vdmVkIiAqLwotCWlmICghd2xjLT5wdWItPmh3X29mZiAmJiBERVZJQ0VSRU1PVkVEKHdsYykpIHsKLQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICJ3bCVkOiAlczogZGVhZCBjaGlwXG4iLCB3bGMtPnB1Yi0+dW5pdCwKLQkJCSAgX19mdW5jX18pOwotCQlicmNtc19kb3duKHdsYy0+d2wpOwotCQlyZXR1cm4gLUVCQURFOwotCX0KLQotCS8qIGRlZmF1bHQgYXJndW1lbnQgaXMgZ2VuZXJpYyBpbnRlZ2VyICovCi0JcHZhbCA9IGFyZyA/IChpbnQgKilhcmcgOiBOVUxMOwotCi0JLyogVGhpcyB3aWxsIHByZXZlbnQgdGhlIG1pc2FsaWduZWQgYWNjZXNzICovCi0JaWYgKHB2YWwgJiYgKHUzMikgbGVuID49IHNpemVvZih2YWwpKQotCQltZW1jcHkoJnZhbCwgcHZhbCwgc2l6ZW9mKHZhbCkpOwotCWVsc2UKLQkJdmFsID0gMDsKLQotCS8qIGJvb2wgY29udmVyc2lvbiB0byBhdm9pZCBkdXBsaWNhdGlvbiBiZWxvdyAqLwotCWJvb2xfdmFsID0gdmFsICE9IDA7Ci0JYmNtZXJyb3IgPSAwOwotCi0JaWYgKChhcmcgPT0gTlVMTCkgfHwgKGxlbiA8PSAwKSkgewotCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIndsJWQ6ICVzOiBDb21tYW5kICVkIG5lZWRzIGFyZ3VtZW50c1xuIiwKLQkJCSAgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBjbWQpOwotCQliY21lcnJvciA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlzd2l0Y2ggKGNtZCkgewotCi0JY2FzZSBCUkNNX1NFVF9DSEFOTkVMOnsKLQkJCWNoYW5zcGVjX3QgY2hzcGVjID0gQ0gyME1IWl9DSFNQRUModmFsKTsKLQotCQkJaWYgKHZhbCA8IDAgfHwgdmFsID4gTUFYQ0hBTk5FTCkgewotCQkJCWJjbWVycm9yID0gLUVJTlZBTDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKCFicmNtc19jX3ZhbGlkX2NoYW5zcGVjX2RiKHdsYy0+Y21pLCBjaHNwZWMpKSB7Ci0JCQkJYmNtZXJyb3IgPSAtRUlOVkFMOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoIXdsYy0+cHViLT51cCAmJiBJU19NQkFORF9VTkxPQ0tFRCh3bGMpKSB7Ci0JCQkJaWYgKHdsYy0+YmFuZC0+YmFuZHVuaXQgIT0KLQkJCQkgICAgQ0hTUEVDX0JBTkRVTklUKGNoc3BlYykpCi0JCQkJCXdsYy0+YmFuZGluaXRfcGVuZGluZyA9IHRydWU7Ci0JCQkJZWxzZQotCQkJCQl3bGMtPmJhbmRpbml0X3BlbmRpbmcgPSBmYWxzZTsKLQkJCX0KLQotCQkJd2xjLT5kZWZhdWx0X2Jzcy0+Y2hhbnNwZWMgPSBjaHNwZWM7Ci0JCQkvKiBicmNtc19jX0JTU2luaXQoKSB3aWxsIHNhbml0aXplIHRoZSByYXRlc2V0IGJlZm9yZQotCQkJICogdXNpbmcgaXQuLiAqLwotCQkJaWYgKHdsYy0+cHViLT51cCAmJgotCQkJICAgIChCUkNNU19CQU5EX1BJX1JBRElPX0NIQU5TUEVDICE9IGNoc3BlYykpIHsKLQkJCQlicmNtc19jX3NldF9ob21lX2NoYW5zcGVjKHdsYywgY2hzcGVjKTsKLQkJCQlicmNtc19jX3N1c3BlbmRfbWFjX2FuZF93YWl0KHdsYyk7Ci0JCQkJYnJjbXNfY19zZXRfY2hhbnNwZWMod2xjLCBjaHNwZWMpOwotCQkJCWJyY21zX2NfZW5hYmxlX21hYyh3bGMpOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCWNhc2UgQlJDTV9TRVRfU1JMOgotCQlpZiAodmFsID49IDEgJiYgdmFsIDw9IFJFVFJZX1NIT1JUX01BWCkgewotCQkJaW50IGFjOwotCQkJd2xjLT5TUkwgPSAodTE2KSB2YWw7Ci0KLQkJCWJyY21zX2JfcmV0cnlsaW1pdF91cGQod2xjLT5odywgd2xjLT5TUkwsIHdsYy0+TFJMKTsKLQotCQkJZm9yIChhYyA9IDA7IGFjIDwgQUNfQ09VTlQ7IGFjKyspIHsKLQkJCQlCUkNNU19XTUVfUkVUUllfU0hPUlRfU0VUKHdsYywgYWMsIHdsYy0+U1JMKTsKLQkJCX0KLQkJCWJyY21zX2Nfd21lX3JldHJpZXNfd3JpdGUod2xjKTsKLQkJfSBlbHNlCi0JCQliY21lcnJvciA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCi0JY2FzZSBCUkNNX1NFVF9MUkw6Ci0JCWlmICh2YWwgPj0gMSAmJiB2YWwgPD0gMjU1KSB7Ci0JCQlpbnQgYWM7Ci0JCQl3bGMtPkxSTCA9ICh1MTYpIHZhbDsKLQotCQkJYnJjbXNfYl9yZXRyeWxpbWl0X3VwZCh3bGMtPmh3LCB3bGMtPlNSTCwgd2xjLT5MUkwpOwotCi0JCQlmb3IgKGFjID0gMDsgYWMgPCBBQ19DT1VOVDsgYWMrKykgewotCQkJCUJSQ01TX1dNRV9SRVRSWV9MT05HX1NFVCh3bGMsIGFjLCB3bGMtPkxSTCk7Ci0JCQl9Ci0JCQlicmNtc19jX3dtZV9yZXRyaWVzX3dyaXRlKHdsYyk7Ci0JCX0gZWxzZQotCQkJYmNtZXJyb3IgPSAtRUlOVkFMOwotCQlicmVhazsKLQotCWNhc2UgQlJDTV9HRVRfQ1VSUl9SQVRFU0VUOnsKLQkJCXdsX3JhdGVzZXRfdCAqcmV0X3JzID0gKHdsX3JhdGVzZXRfdCAqKSBhcmc7Ci0JCQl3bGNfcmF0ZXNldF90ICpyczsKLQotCQkJaWYgKHdsYy0+cHViLT5hc3NvY2lhdGVkKQotCQkJCXJzID0gJmN1cnJlbnRfYnNzLT5yYXRlc2V0OwotCQkJZWxzZQotCQkJCXJzID0gJndsYy0+ZGVmYXVsdF9ic3MtPnJhdGVzZXQ7Ci0KLQkJCWlmIChsZW4gPCAoaW50KShycy0+Y291bnQgKyBzaXplb2YocnMtPmNvdW50KSkpIHsKLQkJCQliY21lcnJvciA9IC1FT1ZFUkZMT1c7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCS8qIENvcHkgb25seSBsZWdhY3kgcmF0ZXNldCBzZWN0aW9uICovCi0JCQlyZXRfcnMtPmNvdW50ID0gcnMtPmNvdW50OwotCQkJbWVtY3B5KCZyZXRfcnMtPnJhdGVzLCAmcnMtPnJhdGVzLCBycy0+Y291bnQpOwotCQkJYnJlYWs7Ci0JCX0KLQotCWNhc2UgQlJDTV9TRVRfUkFURVNFVDp7Ci0JCQl3bGNfcmF0ZXNldF90IHJzOwotCQkJd2xfcmF0ZXNldF90ICppbl9ycyA9ICh3bF9yYXRlc2V0X3QgKikgYXJnOwotCi0JCQlpZiAobGVuIDwgKGludCkoaW5fcnMtPmNvdW50ICsgc2l6ZW9mKGluX3JzLT5jb3VudCkpKSB7Ci0JCQkJYmNtZXJyb3IgPSAtRU9WRVJGTE9XOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoaW5fcnMtPmNvdW50ID4gQlJDTVNfTlVNUkFURVMpIHsKLQkJCQliY21lcnJvciA9IC1FTk9CVUZTOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQltZW1zZXQoJnJzLCAwLCBzaXplb2Yod2xjX3JhdGVzZXRfdCkpOwotCi0JCQkvKiBDb3B5IG9ubHkgbGVnYWN5IHJhdGVzZXQgc2VjdGlvbiAqLwotCQkJcnMuY291bnQgPSBpbl9ycy0+Y291bnQ7Ci0JCQltZW1jcHkoJnJzLnJhdGVzLCAmaW5fcnMtPnJhdGVzLCBycy5jb3VudCk7Ci0KLQkJCS8qIG1lcmdlIHJhdGVzZXQgY29taW5nIGluIHdpdGggdGhlIGN1cnJlbnQgbWNzc2V0ICovCi0JCQlpZiAoTl9FTkFCKHdsYy0+cHViKSkgewotCQkJCWlmIChic3NjZmctPmFzc29jaWF0ZWQpCi0JCQkJCW1lbWNweShycy5tY3MsCi0JCQkJCSAgICAgICAmY3VycmVudF9ic3MtPnJhdGVzZXQubWNzWzBdLAotCQkJCQkgICAgICAgTUNTU0VUX0xFTik7Ci0JCQkJZWxzZQotCQkJCQltZW1jcHkocnMubWNzLAotCQkJCQkgICAgICAgJndsYy0+ZGVmYXVsdF9ic3MtPnJhdGVzZXQubWNzWzBdLAotCQkJCQkgICAgICAgTUNTU0VUX0xFTik7Ci0JCQl9Ci0KLQkJCWJjbWVycm9yID0gYnJjbXNfY19zZXRfcmF0ZXNldCh3bGMsICZycyk7Ci0KLQkJCWlmICghYmNtZXJyb3IpCi0JCQkJYnJjbXNfY19vZmRtX3JhdGVzZXRfd2FyKHdsYyk7Ci0KLQkJCWJyZWFrOwotCQl9Ci0KLQljYXNlIEJSQ01fU0VUX0JDTlBSRDoKLQkJLyogcmFuZ2UgWzEsIDB4ZmZmZl0gKi8KLQkJaWYgKHZhbCA+PSBET1QxMV9NSU5fQkVBQ09OX1BFUklPRAotCQkgICAgJiYgdmFsIDw9IERPVDExX01BWF9CRUFDT05fUEVSSU9EKQotCQkJd2xjLT5kZWZhdWx0X2Jzcy0+YmVhY29uX3BlcmlvZCA9ICh1MTYpIHZhbDsKLQkJZWxzZQotCQkJYmNtZXJyb3IgPSAtRUlOVkFMOwotCQlicmVhazsKLQotCWNhc2UgQlJDTV9HRVRfUEhZTElTVDoKLQkJewotCQkJdW5zaWduZWQgY2hhciAqY3AgPSBhcmc7Ci0JCQlpZiAobGVuIDwgMykgewotCQkJCWJjbWVycm9yID0gLUVPVkVSRkxPVzsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKEJSQ01TX0lTTlBIWSh3bGMtPmJhbmQpKQotCQkJCSpjcCsrID0gJ24nOwotCQkJZWxzZSBpZiAoQlJDTVNfSVNMQ05QSFkod2xjLT5iYW5kKSkKLQkJCQkqY3ArKyA9ICdjJzsKLQkJCWVsc2UgaWYgKEJSQ01TX0lTU1NMUE5QSFkod2xjLT5iYW5kKSkKLQkJCQkqY3ArKyA9ICdzJzsKLQkJCSpjcCA9ICdcMCc7Ci0JCQlicmVhazsKLQkJfQotCi0JY2FzZSBCUkNNU19TRVRfU0hPUlRTTE9UX09WRVJSSURFOgotCQlpZiAodmFsICE9IEJSQ01TX1NIT1JUU0xPVF9BVVRPICYmIHZhbCAhPSBCUkNNU19TSE9SVFNMT1RfT0ZGICYmCi0JCSAgICB2YWwgIT0gQlJDTVNfU0hPUlRTTE9UX09OKSB7Ci0JCQliY21lcnJvciA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCi0JCXdsYy0+c2hvcnRzbG90X292ZXJyaWRlID0gKHM4KSB2YWw7Ci0KLQkJLyogc2hvcnRzbG90IGlzIGFuIDExZyBmZWF0dXJlLCBzbyBubyBtb3JlIHdvcmsgaWYgd2UgYXJlCi0JCSAqIGN1cnJlbnRseSBvbiB0aGUgNUcgYmFuZAotCQkgKi8KLQkJaWYgKEJBTkRfNUcod2xjLT5iYW5kLT5iYW5kdHlwZSkpCi0JCQlicmVhazsKLQotCQlpZiAod2xjLT5wdWItPnVwICYmIHdsYy0+cHViLT5hc3NvY2lhdGVkKSB7Ci0JCQkvKiBsZXQgd2F0Y2hkb2cgb3IgYmVhY29uIHByb2Nlc3NpbmcgdXBkYXRlIHNob3J0c2xvdCAqLwotCQl9IGVsc2UgaWYgKHdsYy0+cHViLT51cCkgewotCQkJLyogdW5hc3NvY2lhdGVkIHNob3J0c2xvdCBpcyBvZmYgKi8KLQkJCWJyY21zX2Nfc3dpdGNoX3Nob3J0c2xvdCh3bGMsIGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCS8qIGRyaXZlciBpcyBkb3duLCBzbyBqdXN0IHVwZGF0ZSB0aGUgYnJjbXNfY19pbmZvCi0JCQkgKiB2YWx1ZSAqLwotCQkJaWYgKHdsYy0+c2hvcnRzbG90X292ZXJyaWRlID09IEJSQ01TX1NIT1JUU0xPVF9BVVRPKSB7Ci0JCQkJd2xjLT5zaG9ydHNsb3QgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJd2xjLT5zaG9ydHNsb3QgPQotCQkJCSAgICAod2xjLT5zaG9ydHNsb3Rfb3ZlcnJpZGUgPT0KLQkJCQkgICAgIEJSQ01TX1NIT1JUU0xPVF9PTik7Ci0JCQl9Ci0JCX0KLQotCQlicmVhazsKLQotCX0KLSBkb25lOgotCi0JaWYgKGJjbWVycm9yKQotCQl3bGMtPnB1Yi0+YmNtZXJyb3IgPSBiY21lcnJvcjsKLQotCXJldHVybiBiY21lcnJvcjsKLX0KLQotLyoKLSAqIHJlZ2lzdGVyIHdhdGNoZG9nIGFuZCBkb3duIGhhbmRsZXJzLgotICovCi1pbnQgYnJjbXNfY19tb2R1bGVfcmVnaXN0ZXIoc3RydWN0IGJyY21zX3B1YiAqcHViLAotCQkJY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqaGRsLAotCQkJd2F0Y2hkb2dfZm5fdCB3X2ZuLCBkb3duX2ZuX3QgZF9mbikKLXsKLQlzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMgPSAoc3RydWN0IGJyY21zX2NfaW5mbyAqKSBwdWItPndsYzsKLQlpbnQgaTsKLQotCS8qIGZpbmQgYW4gZW1wdHkgZW50cnkgYW5kIGp1c3QgYWRkLCBubyBkdXBsaWNhdGlvbiBjaGVjayEgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQlJDTVNfTUFYTU9EVUxFUzsgaSsrKSB7Ci0JCWlmICh3bGMtPm1vZHVsZWNiW2ldLm5hbWVbMF0gPT0gJ1wwJykgewotCQkJc3RybmNweSh3bGMtPm1vZHVsZWNiW2ldLm5hbWUsIG5hbWUsCi0JCQkJc2l6ZW9mKHdsYy0+bW9kdWxlY2JbaV0ubmFtZSkgLSAxKTsKLQkJCXdsYy0+bW9kdWxlY2JbaV0uaGRsID0gaGRsOwotCQkJd2xjLT5tb2R1bGVjYltpXS53YXRjaGRvZ19mbiA9IHdfZm47Ci0JCQl3bGMtPm1vZHVsZWNiW2ldLmRvd25fZm4gPSBkX2ZuOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gLUVOT1NSOwotfQotCi0vKiB1bnJlZ2lzdGVyIG1vZHVsZSBjYWxsYmFja3MgKi8KLWludAotYnJjbXNfY19tb2R1bGVfdW5yZWdpc3RlcihzdHJ1Y3QgYnJjbXNfcHViICpwdWIsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmhkbCkKLXsKLQlzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMgPSAoc3RydWN0IGJyY21zX2NfaW5mbyAqKSBwdWItPndsYzsKLQlpbnQgaTsKLQotCWlmICh3bGMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9EQVRBOwotCi0JZm9yIChpID0gMDsgaSA8IEJSQ01TX01BWE1PRFVMRVM7IGkrKykgewotCQlpZiAoIXN0cmNtcCh3bGMtPm1vZHVsZWNiW2ldLm5hbWUsIG5hbWUpICYmCi0JCSAgICAod2xjLT5tb2R1bGVjYltpXS5oZGwgPT0gaGRsKSkgewotCQkJbWVtc2V0KCZ3bGMtPm1vZHVsZWNiW2ldLCAwLCBzaXplb2Yoc3RydWN0IG1vZHVsZWNiKSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCS8qIHRhYmxlIG5vdCBmb3VuZCEgKi8KLQlyZXR1cm4gLUVOT0RBVEE7Ci19Ci0KLS8qIFdyaXRlIFdNRSB0dW5hYmxlIHBhcmFtZXRlcnMgZm9yIHJldHJhbnNtaXQvbWF4IHJhdGUgZnJvbSB3bGMgc3RydWN0IHRvIHVjb2RlICovCi1zdGF0aWMgdm9pZCBicmNtc19jX3dtZV9yZXRyaWVzX3dyaXRlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlpbnQgYWM7Ci0KLQkvKiBOZWVkIGNsb2NrIHRvIGRvIHRoaXMgKi8KLQlpZiAoIXdsYy0+Y2xrKQotCQlyZXR1cm47Ci0KLQlmb3IgKGFjID0gMDsgYWMgPCBBQ19DT1VOVDsgYWMrKykgewotCQlicmNtc19jX3dyaXRlX3NobSh3bGMsIE1fQUNfVFhMTVRfQUREUihhYyksCi0JCQkJICB3bGMtPndtZV9yZXRyaWVzW2FjXSk7Ci0JfQotfQotCi0jaWZkZWYgQkNNREJHCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHN1cHJfcmVhc29uW10gPSB7Ci0JIk5vbmUiLCAiUE1RIEVudHJ5IiwgIkZsdXNoIHJlcXVlc3QiLAotCSJQcmV2aW91cyBmcmFnIGZhaWx1cmUiLCAiQ2hhbm5lbCBtaXNtYXRjaCIsCi0JIkxpZmV0aW1lIEV4cGlyeSIsICJVbmRlcmZsb3ciCi19OwotCi1zdGF0aWMgdm9pZCBicmNtc19jX3ByaW50X3R4c19zdGF0dXModTE2IHMpCi17Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlsxNToxMl0gICVkICBmcmFtZSBhdHRlbXB0c1xuIiwKLQkgICAgICAgKHMgJiBUWF9TVEFUVVNfRlJNX1JUWF9NQVNLKSA+PiBUWF9TVEFUVVNfRlJNX1JUWF9TSElGVCk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiBbMTE6OF0gICVkICBydHMgYXR0ZW1wdHNcbiIsCi0JICAgICAgIChzICYgVFhfU1RBVFVTX1JUU19SVFhfTUFTSykgPj4gVFhfU1RBVFVTX1JUU19SVFhfU0hJRlQpOwotCXByaW50ayhLRVJOX0RFQlVHICIgICAgWzddICAlZCAgUE0gbW9kZSBpbmRpY2F0ZWRcbiIsCi0JICAgICAgICgocyAmIFRYX1NUQVRVU19QTUlORENURCkgPyAxIDogMCkpOwotCXByaW50ayhLRVJOX0RFQlVHICIgICAgWzZdICAlZCAgaW50ZXJtZWRpYXRlIHN0YXR1c1xuIiwKLQkgICAgICAgKChzICYgVFhfU1RBVFVTX0lOVEVSTUVESUFURSkgPyAxIDogMCkpOwotCXByaW50ayhLRVJOX0RFQlVHICIgICAgWzVdICAlZCAgQU1QRFVcbiIsCi0JICAgICAgIChzICYgVFhfU1RBVFVTX0FNUERVKSA/IDEgOiAwKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiICBbNDoyXSAgJWQgIEZyYW1lIFN1cHByZXNzZWQgUmVhc29uICglcylcbiIsCi0JICAgICAgICgocyAmIFRYX1NUQVRVU19TVVBSX01BU0spID4+IFRYX1NUQVRVU19TVVBSX1NISUZUKSwKLQkgICAgICAgc3Vwcl9yZWFzb25bKHMgJiBUWF9TVEFUVVNfU1VQUl9NQVNLKSA+PiBUWF9TVEFUVVNfU1VQUl9TSElGVF0pOwotCXByaW50ayhLRVJOX0RFQlVHICIgICAgWzFdICAlZCAgYWNrZWRcbiIsCi0JICAgICAgICgocyAmIFRYX1NUQVRVU19BQ0tfUkNWKSA/IDEgOiAwKSk7Ci19Ci0jZW5kaWYJCQkJLyogQkNNREJHICovCi0KLXZvaWQgYnJjbXNfY19wcmludF90eHN0YXR1cyhzdHJ1Y3QgdHhfc3RhdHVzICp0eHMpCi17Ci0jaWYgZGVmaW5lZChCQ01EQkcpCi0JdTE2IHMgPSB0eHMtPnN0YXR1czsKLQl1MTYgYWNrcGh5cnhzaCA9IHR4cy0+YWNrcGh5cnhzaDsKLQotCXByaW50ayhLRVJOX0RFQlVHICJcbnR4cGt0IChNUERVKSBDb21wbGV0ZVxuIik7Ci0KLQlwcmludGsoS0VSTl9ERUJVRyAiRnJhbWVJRDogJTA0eCAgICIsIHR4cy0+ZnJhbWVpZCk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlR4U3RhdHVzOiAlMDR4Iiwgcyk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7Ci0KLQlicmNtc19jX3ByaW50X3R4c19zdGF0dXMocyk7Ci0KLQlwcmludGsoS0VSTl9ERUJVRyAiTGFzdFR4VGltZTogJTA0eCAiLCB0eHMtPmxhc3R0eHRpbWUpOwotCXByaW50ayhLRVJOX0RFQlVHICJTZXE6ICUwNHggIiwgdHhzLT5zZXF1ZW5jZSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlBIWVR4U3RhdHVzOiAlMDR4ICIsIHR4cy0+cGh5ZXJyKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiUnhBY2tSU1NJOiAlMDR4ICIsCi0JICAgICAgIChhY2twaHlyeHNoICYgUFJYUzFfSlNTSV9NQVNLKSA+PiBQUlhTMV9KU1NJX1NISUZUKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiUnhBY2tTUTogJTA0eCIsCi0JICAgICAgIChhY2twaHlyeHNoICYgUFJYUzFfU1FfTUFTSykgPj4gUFJYUzFfU1FfU0hJRlQpOwotCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOwotI2VuZGlmCQkJCS8qIGRlZmluZWQoQkNNREJHKSAqLwotfQotCi12b2lkIGJyY21zX2Nfc3RhdHN1cGQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCWludCBpOwotCXN0cnVjdCBtYWNzdGF0IG1hY3N0YXRzOwotI2lmZGVmIEJDTURCRwotCXUxNiBkZWx0YTsKLQl1MTYgcnhmMG92Zmw7Ci0JdTE2IHR4ZnVuZmxbTkZJRk9dOwotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwotCi0JLyogaWYgZHJpdmVyIGRvd24sIG1ha2Ugbm8gc2Vuc2UgdG8gdXBkYXRlIHN0YXRzICovCi0JaWYgKCF3bGMtPnB1Yi0+dXApCi0JCXJldHVybjsKLQotI2lmZGVmIEJDTURCRwotCS8qIHNhdmUgbGFzdCByeCBmaWZvIDAgb3ZlcmZsb3cgY291bnQgKi8KLQlyeGYwb3ZmbCA9IHdsYy0+Y29yZS0+bWFjc3RhdF9zbmFwc2hvdC0+cnhmMG92Zmw7Ci0KLQkvKiBzYXZlIGxhc3QgdHggZmlmbyAgdW5kZXJmbG93IGNvdW50ICovCi0JZm9yIChpID0gMDsgaSA8IE5GSUZPOyBpKyspCi0JCXR4ZnVuZmxbaV0gPSB3bGMtPmNvcmUtPm1hY3N0YXRfc25hcHNob3QtPnR4ZnVuZmxbaV07Ci0jZW5kaWYJCQkJLyogQkNNREJHICovCi0KLQkvKiBSZWFkIG1hYyBzdGF0cyBmcm9tIGNvbnRpZ3VvdXMgc2hhcmVkIG1lbW9yeSAqLwotCWJyY21zX2JfY29weWZyb21fc2htKHdsYy0+aHcsIE1fVUNPREVfTUFDU1RBVCwKLQkJCSAgICAgJm1hY3N0YXRzLCBzaXplb2Yoc3RydWN0IG1hY3N0YXQpKTsKLQotI2lmZGVmIEJDTURCRwotCS8qIGNoZWNrIGZvciByeCBmaWZvIDAgb3ZlcmZsb3cgKi8KLQlkZWx0YSA9ICh1MTYpICh3bGMtPmNvcmUtPm1hY3N0YXRfc25hcHNob3QtPnJ4ZjBvdmZsIC0gcnhmMG92ZmwpOwotCWlmIChkZWx0YSkKLQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICJ3bCVkOiAldSByeCBmaWZvIDAgb3ZlcmZsb3dzIVxuIiwKLQkJCSAgd2xjLT5wdWItPnVuaXQsIGRlbHRhKTsKLQotCS8qIGNoZWNrIGZvciB0eCBmaWZvIHVuZGVyZmxvd3MgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTkZJRk87IGkrKykgewotCQlkZWx0YSA9Ci0JCSAgICAodTE2KSAod2xjLT5jb3JlLT5tYWNzdGF0X3NuYXBzaG90LT50eGZ1bmZsW2ldIC0KLQkJCSAgICAgIHR4ZnVuZmxbaV0pOwotCQlpZiAoZGVsdGEpCi0JCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIndsJWQ6ICV1IHR4IGZpZm8gJWQgdW5kZXJmbG93cyEiCi0JCQkJICAiXG4iLCB3bGMtPnB1Yi0+dW5pdCwgZGVsdGEsIGkpOwotCX0KLSNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KLQotCS8qIG1lcmdlIGNvdW50ZXJzIGZyb20gZG1hIG1vZHVsZSAqLwotCWZvciAoaSA9IDA7IGkgPCBORklGTzsgaSsrKSB7Ci0JCWlmICh3bGMtPmh3LT5kaVtpXSkgewotCQkJZG1hX2NvdW50ZXJyZXNldCh3bGMtPmh3LT5kaVtpXSk7Ci0JCX0KLQl9Ci19Ci0KLWJvb2wgYnJjbXNfY19jaGlwbWF0Y2godTE2IHZlbmRvciwgdTE2IGRldmljZSkKLXsKLQlpZiAodmVuZG9yICE9IFBDSV9WRU5ET1JfSURfQlJPQURDT00pIHsKLQkJcHJfZXJyKCJjaGlwbWF0Y2g6IHVua25vd24gdmVuZG9yIGlkICUwNHhcbiIsIHZlbmRvcik7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlpZiAoZGV2aWNlID09IEJDTTQzMjI0X0QxMU5fSURfVkVOMSkKLQkJcmV0dXJuIHRydWU7Ci0JaWYgKChkZXZpY2UgPT0gQkNNNDMyMjRfRDExTl9JRCkgfHwgKGRldmljZSA9PSBCQ000MzIyNV9EMTFOMkdfSUQpKQotCQlyZXR1cm4gdHJ1ZTsKLQlpZiAoZGV2aWNlID09IEJDTTQzMTNfRDExTjJHX0lEKQotCQlyZXR1cm4gdHJ1ZTsKLQlpZiAoKGRldmljZSA9PSBCQ000MzIzNl9EMTFOX0lEKSB8fCAoZGV2aWNlID09IEJDTTQzMjM2X0QxMU4yR19JRCkpCi0JCXJldHVybiB0cnVlOwotCi0JcHJfZXJyKCJjaGlwbWF0Y2g6IHVua25vd24gZGV2aWNlIGlkICUwNHhcbiIsIGRldmljZSk7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0jaWYgZGVmaW5lZChCQ01EQkcpCi12b2lkIGJyY21zX2NfcHJpbnRfdHhkZXNjKHN0cnVjdCBkMTF0eGggKnR4aCkKLXsKLQl1MTYgbXRjbCA9IGxlMTZfdG9fY3B1KHR4aC0+TWFjVHhDb250cm9sTG93KTsKLQl1MTYgbXRjaCA9IGxlMTZfdG9fY3B1KHR4aC0+TWFjVHhDb250cm9sSGlnaCk7Ci0JdTE2IG1mYyA9IGxlMTZfdG9fY3B1KHR4aC0+TWFjRnJhbWVDb250cm9sKTsKLQl1MTYgdGZlc3QgPSBsZTE2X3RvX2NwdSh0eGgtPlR4RmVzVGltZU5vcm1hbCk7Ci0JdTE2IHB0Y3cgPSBsZTE2X3RvX2NwdSh0eGgtPlBoeVR4Q29udHJvbFdvcmQpOwotCXUxNiBwdGN3XzEgPSBsZTE2X3RvX2NwdSh0eGgtPlBoeVR4Q29udHJvbFdvcmRfMSk7Ci0JdTE2IHB0Y3dfMV9GYnIgPSBsZTE2X3RvX2NwdSh0eGgtPlBoeVR4Q29udHJvbFdvcmRfMV9GYnIpOwotCXUxNiBwdGN3XzFfUnRzID0gbGUxNl90b19jcHUodHhoLT5QaHlUeENvbnRyb2xXb3JkXzFfUnRzKTsKLQl1MTYgcHRjd18xX0ZiclJ0cyA9IGxlMTZfdG9fY3B1KHR4aC0+UGh5VHhDb250cm9sV29yZF8xX0ZiclJ0cyk7Ci0JdTE2IG1haW5yYXRlcyA9IGxlMTZfdG9fY3B1KHR4aC0+TWFpblJhdGVzKTsKLQl1MTYgeHRyYWZ0ID0gbGUxNl90b19jcHUodHhoLT5YdHJhRnJhbWVUeXBlcyk7Ci0JdTggKml2ID0gdHhoLT5JVjsKLQl1OCAqcmEgPSB0eGgtPlR4RnJhbWVSQTsKLQl1MTYgdGZlc3RmYiA9IGxlMTZfdG9fY3B1KHR4aC0+VHhGZXNUaW1lRmFsbGJhY2spOwotCXU4ICpydHNwZmIgPSB0eGgtPlJUU1BMQ1BGYWxsYmFjazsKLQl1MTYgcnRzZGZiID0gbGUxNl90b19jcHUodHhoLT5SVFNEdXJGYWxsYmFjayk7Ci0JdTggKmZyYWdwZmIgPSB0eGgtPkZyYWdQTENQRmFsbGJhY2s7Ci0JdTE2IGZyYWdkZmIgPSBsZTE2X3RvX2NwdSh0eGgtPkZyYWdEdXJGYWxsYmFjayk7Ci0JdTE2IG1tb2RlbGVuID0gbGUxNl90b19jcHUodHhoLT5NTW9kZUxlbik7Ci0JdTE2IG1tb2RlZmJybGVuID0gbGUxNl90b19jcHUodHhoLT5NTW9kZUZickxlbik7Ci0JdTE2IHRmaWQgPSBsZTE2X3RvX2NwdSh0eGgtPlR4RnJhbWVJRCk7Ci0JdTE2IHR4cyA9IGxlMTZfdG9fY3B1KHR4aC0+VHhTdGF0dXMpOwotCXUxNiBtbm1wZHUgPSBsZTE2X3RvX2NwdSh0eGgtPk1heE5NcGR1cyk7Ci0JdTE2IG1hYnl0ZSA9IGxlMTZfdG9fY3B1KHR4aC0+TWF4QUJ5dGVzX01SVCk7Ci0JdTE2IG1hYnl0ZV9mID0gbGUxNl90b19jcHUodHhoLT5NYXhBQnl0ZXNfRkJSKTsKLQl1MTYgbW1ieXRlID0gbGUxNl90b19jcHUodHhoLT5NaW5NQnl0ZXMpOwotCi0JdTggKnJ0c3BoID0gdHhoLT5SVFNQaHlIZWFkZXI7Ci0Jc3RydWN0IGllZWU4MDIxMV9ydHMgcnRzID0gdHhoLT5ydHNfZnJhbWU7Ci0JY2hhciBoZXhidWZbMjU2XTsKLQotCS8qIGFkZCBwbGNwIGhlYWRlciBhbG9uZyB3aXRoIHR4aCBkZXNjcmlwdG9yICovCi0JcHJpbnRrKEtFUk5fREVCVUcgIlJhdyBUeERlc2MgKyBwbGNwIGhlYWRlcjpcbiIpOwotCXByaW50X2hleF9kdW1wX2J5dGVzKCIiLCBEVU1QX1BSRUZJWF9PRkZTRVQsCi0JCQkgICAgIHR4aCwgc2l6ZW9mKHN0cnVjdCBkMTF0eGgpICsgNDgpOwotCi0JcHJpbnRrKEtFUk5fREVCVUcgIlR4Q3RsTG93OiAlMDR4ICIsIG10Y2wpOwotCXByaW50ayhLRVJOX0RFQlVHICJUeEN0bEhpZ2g6ICUwNHggIiwgbXRjaCk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIkZDOiAlMDR4ICIsIG1mYyk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIkZFUyBUaW1lOiAlMDR4XG4iLCB0ZmVzdCk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlBoeUN0bDogJTA0eCVzICIsIHB0Y3csCi0JICAgICAgIChwdGN3ICYgUEhZX1RYQ19TSE9SVF9IRFIpID8gIiBzaG9ydCIgOiAiIik7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlBoeUN0bF8xOiAlMDR4ICIsIHB0Y3dfMSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlBoeUN0bF8xX0ZicjogJTA0eFxuIiwgcHRjd18xX0Zicik7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlBoeUN0bF8xX1J0czogJTA0eCAiLCBwdGN3XzFfUnRzKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiUGh5Q3RsXzFfRmJyX1J0czogJTA0eFxuIiwgcHRjd18xX0ZiclJ0cyk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIk1haW5SYXRlczogJTA0eCAiLCBtYWlucmF0ZXMpOwotCXByaW50ayhLRVJOX0RFQlVHICJYdHJhRnJhbWVUeXBlczogJTA0eCAiLCB4dHJhZnQpOwotCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOwotCi0JYnJjbXVfZm9ybWF0X2hleChoZXhidWYsIGl2LCBzaXplb2YodHhoLT5JVikpOwotCXByaW50ayhLRVJOX0RFQlVHICJTZWNJVjogICAgICAgJXNcbiIsIGhleGJ1Zik7Ci0JYnJjbXVfZm9ybWF0X2hleChoZXhidWYsIHJhLCBzaXplb2YodHhoLT5UeEZyYW1lUkEpKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiUkE6ICAgICAgICAgICVzXG4iLCBoZXhidWYpOwotCi0JcHJpbnRrKEtFUk5fREVCVUcgIkZiIEZFUyBUaW1lOiAlMDR4ICIsIHRmZXN0ZmIpOwotCWJyY211X2Zvcm1hdF9oZXgoaGV4YnVmLCBydHNwZmIsIHNpemVvZih0eGgtPlJUU1BMQ1BGYWxsYmFjaykpOwotCXByaW50ayhLRVJOX0RFQlVHICJSVFMgUExDUDogJXMgIiwgaGV4YnVmKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiUlRTIERVUjogJTA0eCAiLCBydHNkZmIpOwotCWJyY211X2Zvcm1hdF9oZXgoaGV4YnVmLCBmcmFncGZiLCBzaXplb2YodHhoLT5GcmFnUExDUEZhbGxiYWNrKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlBMQ1A6ICVzICIsIGhleGJ1Zik7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIkRVUjogJTA0eCIsIGZyYWdkZmIpOwotCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOwotCi0JcHJpbnRrKEtFUk5fREVCVUcgIk1Nb2RlTGVuOiAlMDR4ICIsIG1tb2RlbGVuKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiTU1vZGVGYnJMZW46ICUwNHhcbiIsIG1tb2RlZmJybGVuKTsKLQotCXByaW50ayhLRVJOX0RFQlVHICJGcmFtZUlEOiAgICAgJTA0eFxuIiwgdGZpZCk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlR4U3RhdHVzOiAgICAlMDR4XG4iLCB0eHMpOwotCi0JcHJpbnRrKEtFUk5fREVCVUcgIk1heE51bU1wZHU6ICAlMDR4XG4iLCBtbm1wZHUpOwotCXByaW50ayhLRVJOX0RFQlVHICJNYXhBZ2dieXRlOiAgJTA0eFxuIiwgbWFieXRlKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiTWF4QWdnYnl0ZV9mYjogICUwNHhcbiIsIG1hYnl0ZV9mKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiTWluQnl0ZTogICAgICUwNHhcbiIsIG1tYnl0ZSk7Ci0KLQlicmNtdV9mb3JtYXRfaGV4KGhleGJ1ZiwgcnRzcGgsIHNpemVvZih0eGgtPlJUU1BoeUhlYWRlcikpOwotCXByaW50ayhLRVJOX0RFQlVHICJSVFMgUExDUDogJXMgIiwgaGV4YnVmKTsKLQlicmNtdV9mb3JtYXRfaGV4KGhleGJ1ZiwgKHU4ICopICZydHMsIHNpemVvZih0eGgtPnJ0c19mcmFtZSkpOwotCXByaW50ayhLRVJOX0RFQlVHICJSVFMgRnJhbWU6ICVzIiwgaGV4YnVmKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiXG4iKTsKLX0KLSNlbmRpZgkJCQkvKiBkZWZpbmVkKEJDTURCRykgKi8KLQotI2lmIGRlZmluZWQoQkNNREJHKQotdm9pZCBicmNtc19jX3ByaW50X3J4aChzdHJ1Y3QgZDExcnhoZHIgKnJ4aCkKLXsKLQl1MTYgbGVuID0gcnhoLT5SeEZyYW1lU2l6ZTsKLQl1MTYgcGh5c3RhdHVzXzAgPSByeGgtPlBoeVJ4U3RhdHVzXzA7Ci0JdTE2IHBoeXN0YXR1c18xID0gcnhoLT5QaHlSeFN0YXR1c18xOwotCXUxNiBwaHlzdGF0dXNfMiA9IHJ4aC0+UGh5UnhTdGF0dXNfMjsKLQl1MTYgcGh5c3RhdHVzXzMgPSByeGgtPlBoeVJ4U3RhdHVzXzM7Ci0JdTE2IG1hY3N0YXR1czEgPSByeGgtPlJ4U3RhdHVzMTsKLQl1MTYgbWFjc3RhdHVzMiA9IHJ4aC0+UnhTdGF0dXMyOwotCWNoYXIgZmxhZ3N0cls2NF07Ci0JY2hhciBsZW5idWZbMjBdOwotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgYnJjbXVfYml0X2Rlc2MgbWFjc3RhdF9mbGFnc1tdID0gewotCQl7UlhTX0ZDU0VSUiwgIkZDU0VyciJ9LAotCQl7UlhTX1JFU1BGUkFNRVRYLCAiUmVwbHkifSwKLQkJe1JYU19QQlBSRVMsICJQQURESU5HIn0sCi0JCXtSWFNfREVDQVRNUFQsICJEZUNyIn0sCi0JCXtSWFNfREVDRVJSLCAiRGVDckVyciJ9LAotCQl7UlhTX0JDTlNFTlQsICJCY24ifSwKLQkJezAsIE5VTEx9Ci0JfTsKLQotCXByaW50ayhLRVJOX0RFQlVHICJSYXcgUnhEZXNjOlxuIik7Ci0JcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIiIsIERVTVBfUFJFRklYX09GRlNFVCwgcnhoLAotCQkJICAgICBzaXplb2Yoc3RydWN0IGQxMXJ4aGRyKSk7Ci0KLQlicmNtdV9mb3JtYXRfZmxhZ3MobWFjc3RhdF9mbGFncywgbWFjc3RhdHVzMSwgZmxhZ3N0ciwgNjQpOwotCi0Jc25wcmludGYobGVuYnVmLCBzaXplb2YobGVuYnVmKSwgIjB4JXgiLCBsZW4pOwotCi0JcHJpbnRrKEtFUk5fREVCVUcgIlJ4RnJhbWVTaXplOiAgICAgJTZzICglZCklc1xuIiwgbGVuYnVmLCBsZW4sCi0JICAgICAgIChyeGgtPlBoeVJ4U3RhdHVzXzAgJiBQUlhTMF9TSE9SVEgpID8gIiBzaG9ydCBwcmVhbWJsZSIgOiAiIik7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlJ4UEhZU3RhdHVzOiAgICAgJTA0eCAlMDR4ICUwNHggJTA0eFxuIiwKLQkgICAgICAgcGh5c3RhdHVzXzAsIHBoeXN0YXR1c18xLCBwaHlzdGF0dXNfMiwgcGh5c3RhdHVzXzMpOwotCXByaW50ayhLRVJOX0RFQlVHICJSeE1BQ1N0YXR1czogICAgICV4ICVzXG4iLCBtYWNzdGF0dXMxLCBmbGFnc3RyKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiUlhNQUNhZ2d0eXBlOiAgICAleFxuIiwKLQkgICAgICAgKG1hY3N0YXR1czIgJiBSWFNfQUdHVFlQRV9NQVNLKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlJ4VFNGVGltZTogICAgICAgJTA0eFxuIiwgcnhoLT5SeFRTRlRpbWUpOwotfQotI2VuZGlmCQkJCS8qIGRlZmluZWQoQkNNREJHKSAqLwotCi1zdGF0aWMgdTE2IGJyY21zX2NfcmF0ZV9zaG1fb2Zmc2V0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdTggcmF0ZSkKLXsKLQlyZXR1cm4gYnJjbXNfYl9yYXRlX3NobV9vZmZzZXQod2xjLT5odywgcmF0ZSk7Ci19Ci0KLS8qIENhbGxiYWNrIGZvciBkZXZpY2UgcmVtb3ZlZCAqLwotCi0vKgotICogQXR0ZW1wdHMgdG8gcXVldWUgYSBwYWNrZXQgb250byBhIG11bHRpcGxlLXByZWNlZGVuY2UgcXVldWUsCi0gKiBpZiBuZWNlc3NhcnkgZXZpY3RpbmcgYSBsb3dlciBwcmVjZWRlbmNlIHBhY2tldCBmcm9tIHRoZSBxdWV1ZS4KLSAqCi0gKiAncHJlYycgaXMgdGhlIHByZWNlZGVuY2UgbnVtYmVyIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBtYXBwZWQKLSAqIGZyb20gdGhlIHBhY2tldCBwcmlvcml0eS4KLSAqCi0gKiBSZXR1cm5zIHRydWUgaWYgcGFja2V0IGNvbnN1bWVkIChxdWV1ZWQpLCBmYWxzZSBpZiBub3QuCi0gKi8KLWJvb2wKLWJyY21zX2NfcHJlY19lbnEoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBzdHJ1Y3QgcGt0cSAqcSwgdm9pZCAqcGt0LCBpbnQgcHJlYykKLXsKLQlyZXR1cm4gYnJjbXNfY19wcmVjX2VucV9oZWFkKHdsYywgcSwgcGt0LCBwcmVjLCBmYWxzZSk7Ci19Ci0KLWJvb2wKLWJyY21zX2NfcHJlY19lbnFfaGVhZChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHN0cnVjdCBwa3RxICpxLAotCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCBpbnQgcHJlYywgYm9vbCBoZWFkKQotewotCXN0cnVjdCBza19idWZmICpwOwotCWludCBlcHJlYyA9IC0xOwkJLyogcHJlY2VkZW5jZSB0byBldmljdCBmcm9tICovCi0KLQkvKiBEZXRlcm1pbmUgcHJlY2VkZW5jZSBmcm9tIHdoaWNoIHRvIGV2aWN0IHBhY2tldCwgaWYgYW55ICovCi0JaWYgKHBrdHFfcGZ1bGwocSwgcHJlYykpCi0JCWVwcmVjID0gcHJlYzsKLQllbHNlIGlmIChwa3RxX2Z1bGwocSkpIHsKLQkJcCA9IGJyY211X3BrdHFfcGVla190YWlsKHEsICZlcHJlYyk7Ci0JCWlmIChlcHJlYyA+IHByZWMpIHsKLQkJCXdpcGh5X2Vycih3bGMtPndpcGh5LCAiJXM6IEZhaWxpbmc6IGVwcmVjICVkID4gcHJlYyAlZCIKLQkJCQkgICJcbiIsIF9fZnVuY19fLCBlcHJlYywgcHJlYyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKiBFdmljdCBpZiBuZWVkZWQgKi8KLQlpZiAoZXByZWMgPj0gMCkgewotCQlib29sIGRpc2NhcmRfb2xkZXN0OwotCi0JCWRpc2NhcmRfb2xkZXN0ID0gQUNfQklUTUFQX1RTVCh3bGMtPndtZV9kcCwgZXByZWMpOwotCi0JCS8qIFJlZnVzZSBuZXdlciBwYWNrZXQgdW5sZXNzIGNvbmZpZ3VyZWQgdG8gZGlzY2FyZCBvbGRlc3QgKi8KLQkJaWYgKGVwcmVjID09IHByZWMgJiYgIWRpc2NhcmRfb2xkZXN0KSB7Ci0JCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIiVzOiBObyB3aGVyZSB0byBnbywgcHJlYyA9PSAlZCIKLQkJCQkgICJcbiIsIF9fZnVuY19fLCBwcmVjKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8qIEV2aWN0IHBhY2tldCBhY2NvcmRpbmcgdG8gZGlzY2FyZCBwb2xpY3kgKi8KLQkJcCA9IGRpc2NhcmRfb2xkZXN0ID8gYnJjbXVfcGt0cV9wZGVxKHEsIGVwcmVjKSA6Ci0JCQlicmNtdV9wa3RxX3BkZXFfdGFpbChxLCBlcHJlYyk7Ci0JCWJyY211X3BrdF9idWZfZnJlZV9za2IocCk7Ci0JfQotCi0JLyogRW5xdWV1ZSAqLwotCWlmIChoZWFkKQotCQlwID0gYnJjbXVfcGt0cV9wZW5xX2hlYWQocSwgcHJlYywgcGt0KTsKLQllbHNlCi0JCXAgPSBicmNtdV9wa3RxX3BlbnEocSwgcHJlYywgcGt0KTsKLQotCXJldHVybiB0cnVlOwotfQotCi12b2lkIGJyY21zX2NfdHhxX2VucSh2b2lkICpjdHgsIHN0cnVjdCBzY2IgKnNjYiwgc3RydWN0IHNrX2J1ZmYgKnNkdSwKLQkJCSAgICAgdWludCBwcmVjKQotewotCXN0cnVjdCBicmNtc19jX2luZm8gKndsYyA9IChzdHJ1Y3QgYnJjbXNfY19pbmZvICopIGN0eDsKLQlzdHJ1Y3QgYnJjbXNfdHhxX2luZm8gKnFpID0gd2xjLT5wa3RfcXVldWU7CS8qIENoZWNrIG1lICovCi0Jc3RydWN0IHBrdHEgKnEgPSAmcWktPnE7Ci0JaW50IHByaW87Ci0KLQlwcmlvID0gc2R1LT5wcmlvcml0eTsKLQotCWlmICghYnJjbXNfY19wcmVjX2VucSh3bGMsIHEsIHNkdSwgcHJlYykpIHsKLQkJaWYgKCFFRENGX0VOQUIod2xjLT5wdWIpCi0JCSAgICB8fCAod2xjLT5wdWItPndsZmVhdHVyZWZsYWcgJiBXTF9TV0ZMX0ZMT1dDT05UUk9MKSkKLQkJCXdpcGh5X2Vycih3bGMtPndpcGh5LCAid2wlZDogdHhxX2VucTogdHhxIG92ZXJmbG93IgotCQkJCSAgIlxuIiwgd2xjLT5wdWItPnVuaXQpOwotCi0JCS8qCi0JCSAqIHdlIG1pZ2h0IGhpdCB0aGlzIGNvbmR0aW9uIGluIGNhc2UKLQkJICogcGFja2V0IGZsb29kaW5nIGZyb20gbWFjODAyMTEgc3RhY2sKLQkJICovCi0JCWJyY211X3BrdF9idWZfZnJlZV9za2Ioc2R1KTsKLQl9Ci0KLQkvKiBDaGVjayBpZiBmbG93IGNvbnRyb2wgbmVlZHMgdG8gYmUgdHVybmVkIG9uIGFmdGVyIGVucXVldWluZyB0aGUgcGFja2V0Ci0JICogICBEb24ndCB0dXJuIG9uIGZsb3cgY29udHJvbCBpZiBFRENGIGlzIGVuYWJsZWQuIERyaXZlciB3b3VsZCBtYWtlIHRoZSBkZWNpc2lvbiBvbiB3aGF0Ci0JICogICB0byBkcm9wIGluc3RlYWQgb2YgcmVseWluZyBvbiBzdGFjayB0byBtYWtlIHRoZSByaWdodCBkZWNpc2lvbgotCSAqLwotCWlmICghRURDRl9FTkFCKHdsYy0+cHViKQotCSAgICB8fCAod2xjLT5wdWItPndsZmVhdHVyZWZsYWcgJiBXTF9TV0ZMX0ZMT1dDT05UUk9MKSkgewotCQlpZiAocGt0cV9sZW4ocSkgPj0gd2xjLT5wdWItPnR1bmFibGVzLT5kYXRhaGl3YXQpIHsKLQkJCWJyY21zX2NfdHhmbG93Y29udHJvbCh3bGMsIHFpLCBPTiwgQUxMUFJJTyk7Ci0JCX0KLQl9IGVsc2UgaWYgKHdsYy0+cHViLT5fcHJpb2ZjKSB7Ci0JCWlmIChwa3RxX3BsZW4ocSwgd2xjX3ByaW8ycHJlY19tYXBbcHJpb10pID49Ci0JCSAgICB3bGMtPnB1Yi0+dHVuYWJsZXMtPmRhdGFoaXdhdCkgewotCQkJYnJjbXNfY190eGZsb3djb250cm9sKHdsYywgcWksIE9OLCBwcmlvKTsKLQkJfQotCX0KLX0KLQotYm9vbAotYnJjbXNfY19zZW5kcGt0X21hYzgwMjExKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgc3RydWN0IHNrX2J1ZmYgKnNkdSwKLQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQl1OCBwcmlvOwotCXVpbnQgZmlmbzsKLQl2b2lkICpwa3Q7Ci0Jc3RydWN0IHNjYiAqc2NiID0gJmdsb2JhbF9zY2I7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmQxMV9oZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikoc2R1LT5kYXRhKTsKLQotCS8qIDgwMi4xMSBzdGFuZGFyZCByZXF1aXJlcyBtYW5hZ2VtZW50IHRyYWZmaWMgdG8gZ28gYXQgaGlnaGVzdCBwcmlvcml0eSAqLwotCXByaW8gPSBpZWVlODAyMTFfaXNfZGF0YShkMTFfaGVhZGVyLT5mcmFtZV9jb250cm9sKSA/IHNkdS0+cHJpb3JpdHkgOgotCQlNQVhQUklPOwotCWZpZm8gPSBwcmlvMmZpZm9bcHJpb107Ci0JcGt0ID0gc2R1OwotCWlmICh1bmxpa2VseQotCSAgICAoYnJjbXNfY19kMTFoZHJzX21hYzgwMjExKAotCQl3bGMsIGh3LCBwa3QsIHNjYiwgMCwgMSwgZmlmbywgMCwgTlVMTCwgMCkpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlicmNtc19jX3R4cV9lbnEod2xjLCBzY2IsIHBrdCwgQlJDTVNfUFJJT19UT19QUkVDKHByaW8pKTsKLQlicmNtc19jX3NlbmRfcSh3bGMpOwotCXJldHVybiAwOwotfQotCi12b2lkIGJyY21zX2Nfc2VuZF9xKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcGt0W0RPVDExX01BWE5VTUZSQUdTXTsKLQlpbnQgcHJlYzsKLQl1MTYgcHJlY19tYXA7Ci0JaW50IGVyciA9IDAsIGksIGNvdW50OwotCXVpbnQgZmlmbzsKLQlzdHJ1Y3QgYnJjbXNfdHhxX2luZm8gKnFpID0gd2xjLT5wa3RfcXVldWU7Ci0Jc3RydWN0IHBrdHEgKnEgPSAmcWktPnE7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eF9pbmZvOwotCi0JaWYgKGluX3NlbmRfcSkKLQkJcmV0dXJuOwotCWVsc2UKLQkJaW5fc2VuZF9xID0gdHJ1ZTsKLQotCXByZWNfbWFwID0gd2xjLT50eF9wcmVjX21hcDsKLQotCS8qIFNlbmQgYWxsIHRoZSBlbnEnZCBwa3RzIHRoYXQgd2UgY2FuLgotCSAqIERlcXVldWUgcGFja2V0cyB3aXRoIHByZWNlZGVuY2Ugd2l0aCBlbXB0eSBIVyBmaWZvIG9ubHkKLQkgKi8KLQl3aGlsZSAocHJlY19tYXAgJiYgKHBrdFswXSA9IGJyY211X3BrdHFfbWRlcShxLCBwcmVjX21hcCwgJnByZWMpKSkgewotCQl0eF9pbmZvID0gSUVFRTgwMjExX1NLQl9DQihwa3RbMF0pOwotCQlpZiAodHhfaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKSB7Ci0JCQllcnIgPSBicmNtc19jX3NlbmRhbXBkdSh3bGMtPmFtcGR1LCBxaSwgcGt0LCBwcmVjKTsKLQkJfSBlbHNlIHsKLQkJCWNvdW50ID0gMTsKLQkJCWVyciA9IGJyY21zX2NfcHJlcF9wZHUod2xjLCBwa3RbMF0sICZmaWZvKTsKLQkJCWlmICghZXJyKSB7Ci0JCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQkJYnJjbXNfY190eGZpZm8od2xjLCBmaWZvLCBwa3RbaV0sIHRydWUsCi0JCQkJCQkgICAgICAgMSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGVyciA9PSAtRUJVU1kpIHsKLQkJCWJyY211X3BrdHFfcGVucV9oZWFkKHEsIHByZWMsIHBrdFswXSk7Ci0JCQkvKiBJZiBzZW5kIGZhaWxlZCBkdWUgdG8gYW55IG90aGVyIHJlYXNvbiB0aGFuIGEgY2hhbmdlIGluCi0JCQkgKiBIVyBGSUZPIGNvbmRpdGlvbiwgcXVpdC4gT3RoZXJ3aXNlLCByZWFkIHRoZSBuZXcgcHJlY19tYXAhCi0JCQkgKi8KLQkJCWlmIChwcmVjX21hcCA9PSB3bGMtPnR4X3ByZWNfbWFwKQotCQkJCWJyZWFrOwotCQkJcHJlY19tYXAgPSB3bGMtPnR4X3ByZWNfbWFwOwotCQl9Ci0JfQotCi0JLyogQ2hlY2sgaWYgZmxvdyBjb250cm9sIG5lZWRzIHRvIGJlIHR1cm5lZCBvZmYgYWZ0ZXIgc2VuZGluZyB0aGUgcGFja2V0ICovCi0JaWYgKCFFRENGX0VOQUIod2xjLT5wdWIpCi0JICAgIHx8ICh3bGMtPnB1Yi0+d2xmZWF0dXJlZmxhZyAmIFdMX1NXRkxfRkxPV0NPTlRST0wpKSB7Ci0JCWlmIChicmNtc19jX3R4Zmxvd2NvbnRyb2xfcHJpb19pc3NldCh3bGMsIHFpLCBBTExQUklPKQotCQkgICAgJiYgKHBrdHFfbGVuKHEpIDwgd2xjLT5wdWItPnR1bmFibGVzLT5kYXRhaGl3YXQgLyAyKSkgewotCQkJYnJjbXNfY190eGZsb3djb250cm9sKHdsYywgcWksIE9GRiwgQUxMUFJJTyk7Ci0JCX0KLQl9IGVsc2UgaWYgKHdsYy0+cHViLT5fcHJpb2ZjKSB7Ci0JCWludCBwcmlvOwotCQlmb3IgKHByaW8gPSBNQVhQUklPOyBwcmlvID49IDA7IHByaW8tLSkgewotCQkJaWYgKGJyY21zX2NfdHhmbG93Y29udHJvbF9wcmlvX2lzc2V0KHdsYywgcWksIHByaW8pICYmCi0JCQkgICAgKHBrdHFfcGxlbihxLCB3bGNfcHJpbzJwcmVjX21hcFtwcmlvXSkgPAotCQkJICAgICB3bGMtPnB1Yi0+dHVuYWJsZXMtPmRhdGFoaXdhdCAvIDIpKSB7Ci0JCQkJYnJjbXNfY190eGZsb3djb250cm9sKHdsYywgcWksIE9GRiwgcHJpbyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JaW5fc2VuZF9xID0gZmFsc2U7Ci19Ci0KLS8qCi0gKiBiY21jX2ZpZF9nZW5lcmF0ZToKLSAqIEdlbmVyYXRlIGZyYW1lIElEIGZvciBhIEJDTUMgcGFja2V0LiAgVGhlIGZyYWcgZmllbGQgaXMgbm90IHVzZWQKLSAqIGZvciBNQyBmcmFtZXMgc28gaXMgdXNlZCBhcyBwYXJ0IG9mIHRoZSBzZXF1ZW5jZSBudW1iZXIuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdTE2Ci1iY21jX2ZpZF9nZW5lcmF0ZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHN0cnVjdCBicmNtc19ic3NfY2ZnICpic3NjZmcsCi0JCSAgc3RydWN0IGQxMXR4aCAqdHhoKQotewotCXUxNiBmcmFtZWlkOwotCi0JZnJhbWVpZCA9IGxlMTZfdG9fY3B1KHR4aC0+VHhGcmFtZUlEKSAmIH4oVFhGSURfU0VRX01BU0sgfAotCQkJCQkJICBUWEZJRF9RVUVVRV9NQVNLKTsKLQlmcmFtZWlkIHw9Ci0JICAgICgoKHdsYy0+Ci0JICAgICAgIG1jX2ZpZF9jb3VudGVyKyspIDw8IFRYRklEX1NFUV9TSElGVCkgJiBUWEZJRF9TRVFfTUFTSykgfAotCSAgICBUWF9CQ01DX0ZJRk87Ci0KLQlyZXR1cm4gZnJhbWVpZDsKLX0KLQotdm9pZAotYnJjbXNfY190eGZpZm8oc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB1aW50IGZpZm8sIHN0cnVjdCBza19idWZmICpwLAotCSAgICAgICBib29sIGNvbW1pdCwgczggdHhwa3RwZW5kKQotewotCXUxNiBmcmFtZWlkID0gSU5WQUxJREZJRDsKLQlzdHJ1Y3QgZDExdHhoICp0eGg7Ci0KLQl0eGggPSAoc3RydWN0IGQxMXR4aCAqKSAocC0+ZGF0YSk7Ci0KLQkvKiBXaGVuIGEgQkMvTUMgZnJhbWUgaXMgYmVpbmcgY29tbWl0dGVkIHRvIHRoZSBCQ01DIGZpZm8gdmlhIERNQSAoTk9UIFBJTyksIHVwZGF0ZQotCSAqIHVjb2RlIG9yIEJTUyBpbmZvIGFzIGFwcHJvcHJpYXRlLgotCSAqLwotCWlmIChmaWZvID09IFRYX0JDTUNfRklGTykgewotCQlmcmFtZWlkID0gbGUxNl90b19jcHUodHhoLT5UeEZyYW1lSUQpOwotCi0JfQotCi0JaWYgKEJSQ01TX1dBUjE2MTY1KHdsYykpCi0JCWJyY21zX2Nfd2FyMTYxNjUod2xjLCB0cnVlKTsKLQotCi0JLyogQnVtcCB1cCBwZW5kaW5nIGNvdW50IGZvciBpZiBub3QgdXNpbmcgcnBjLiBJZiBycGMgaXMgdXNlZCwgdGhpcyB3aWxsIGJlIGhhbmRsZWQKLQkgKiBpbiBicmNtc19iX3R4ZmlmbygpCi0JICovCi0JaWYgKGNvbW1pdCkgewotCQlUWFBLVFBFTkRJTkMod2xjLCBmaWZvLCB0eHBrdHBlbmQpOwotCQlCQ01NU0cod2xjLT53aXBoeSwgInBrdHBlbmQgaW5jICVkIHRvICVkXG4iLAotCQkJIHR4cGt0cGVuZCwgVFhQS1RQRU5ER0VUKHdsYywgZmlmbykpOwotCX0KLQotCS8qIENvbW1pdCBCQ01DIHNlcXVlbmNlIG51bWJlciBpbiB0aGUgU0hNIGZyYW1lIElEIGxvY2F0aW9uICovCi0JaWYgKGZyYW1laWQgIT0gSU5WQUxJREZJRCkKLQkJQkNNQ0ZJRCh3bGMsIGZyYW1laWQpOwotCi0JaWYgKGRtYV90eGZhc3Qod2xjLT5ody0+ZGlbZmlmb10sIHAsIGNvbW1pdCkgPCAwKSB7Ci0JCXdpcGh5X2Vycih3bGMtPndpcGh5LCAidHhmaWZvOiBmYXRhbCwgdG9zcyBmcmFtZXMgISEhXG4iKTsKLQl9Ci19Ci0KLXZvaWQKLWJyY21zX2NfY29tcHV0ZV9wbGNwKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYywKLQkJICAgICB1aW50IGxlbmd0aCwgdTggKnBsY3ApCi17Ci0JaWYgKElTX01DUyhyc3BlYykpIHsKLQkJYnJjbXNfY19jb21wdXRlX21pbW9fcGxjcChyc3BlYywgbGVuZ3RoLCBwbGNwKTsKLQl9IGVsc2UgaWYgKElTX09GRE0ocnNwZWMpKSB7Ci0JCWJyY21zX2NfY29tcHV0ZV9vZmRtX3BsY3AocnNwZWMsIGxlbmd0aCwgcGxjcCk7Ci0JfSBlbHNlIHsKLQkJYnJjbXNfY19jb21wdXRlX2Nja19wbGNwKHdsYywgcnNwZWMsIGxlbmd0aCwgcGxjcCk7Ci0JfQotCXJldHVybjsKLX0KLQotLyogUmF0ZTogODAyLjExIHJhdGUgY29kZSwgbGVuZ3RoOiBQU0RVIGxlbmd0aCBpbiBvY3RldHMgKi8KLXN0YXRpYyB2b2lkIGJyY21zX2NfY29tcHV0ZV9taW1vX3BsY3AocmF0ZXNwZWNfdCByc3BlYywgdWludCBsZW5ndGgsIHU4ICpwbGNwKQotewotCXU4IG1jcyA9ICh1OCkgKHJzcGVjICYgUlNQRUNfUkFURV9NQVNLKTsKLQlwbGNwWzBdID0gbWNzOwotCWlmIChSU1BFQ19JUzQwTUhaKHJzcGVjKSB8fCAobWNzID09IDMyKSkKLQkJcGxjcFswXSB8PSBNSU1PX1BMQ1BfNDBNSFo7Ci0JQlJDTVNfU0VUX01JTU9fUExDUF9MRU4ocGxjcCwgbGVuZ3RoKTsKLQlwbGNwWzNdID0gUlNQRUNfTUlNT1BMQ1AzKHJzcGVjKTsJLyogcnNwZWMgYWxyZWFkeSBob2xkcyB0aGlzIGJ5dGUgKi8KLQlwbGNwWzNdIHw9IDB4NzsJCS8qIHNldCBzbW9vdGhpbmcsIG5vdCBzb3VuZGluZyBwcGR1ICYgcmVzZXJ2ZWQgKi8KLQlwbGNwWzRdID0gMDsJCS8qIG51bWJlciBvZiBleHRlbnNpb24gc3BhdGlhbCBzdHJlYW1zIGJpdCAwICYgMSAqLwotCXBsY3BbNV0gPSAwOwotfQotCi0vKiBSYXRlOiA4MDIuMTEgcmF0ZSBjb2RlLCBsZW5ndGg6IFBTRFUgbGVuZ3RoIGluIG9jdGV0cyAqLwotc3RhdGljIHZvaWQKLWJyY21zX2NfY29tcHV0ZV9vZmRtX3BsY3AocmF0ZXNwZWNfdCByc3BlYywgdTMyIGxlbmd0aCwgdTggKnBsY3ApCi17Ci0JdTggcmF0ZV9zaWduYWw7Ci0JdTMyIHRtcCA9IDA7Ci0JaW50IHJhdGUgPSBSU1BFQzJSQVRFKHJzcGVjKTsKLQotCS8qIGVuY29kZSByYXRlIHBlciA4MDIuMTFhLTE5OTkgc2VjIDE3LjMuNC4xLCB3aXRoIGxzYiB0cmFuc21pdHRlZCBmaXJzdCAqLwotCXJhdGVfc2lnbmFsID0gcmF0ZV9pbmZvW3JhdGVdICYgQlJDTVNfUkFURV9NQVNLOwotCW1lbXNldChwbGNwLCAwLCBEMTFfUEhZX0hEUl9MRU4pOwotCUQxMUFfUEhZX0hEUl9TUkFURSgoc3RydWN0IG9mZG1fcGh5X2hkciAqKSBwbGNwLCByYXRlX3NpZ25hbCk7Ci0KLQl0bXAgPSAobGVuZ3RoICYgMHhmZmYpIDw8IDU7Ci0JcGxjcFsyXSB8PSAodG1wID4+IDE2KSAmIDB4ZmY7Ci0JcGxjcFsxXSB8PSAodG1wID4+IDgpICYgMHhmZjsKLQlwbGNwWzBdIHw9IHRtcCAmIDB4ZmY7Ci0KLQlyZXR1cm47Ci19Ci0KLS8qCi0gKiBDb21wdXRlIFBMQ1AsIGJ1dCBvbmx5IHJlcXVpcmVzIGFjdHVhbCByYXRlIGFuZCBsZW5ndGggb2YgcGt0LgotICogUmF0ZSBpcyBnaXZlbiBpbiB0aGUgZHJpdmVyIHN0YW5kYXJkIG11bHRpcGxlIG9mIDUwMCBrYnBzLgotICogbGUgaXMgc2V0IGZvciAxMSBNYnBzIHJhdGUgaWYgbmVjZXNzYXJ5LgotICogQnJva2VuIG91dCBmb3IgUFJRLgotICovCi0KLXN0YXRpYyB2b2lkIGJyY21zX2NfY2NrX3BsY3Bfc2V0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgaW50IHJhdGVfNTAwLAotCQkJICAgICB1aW50IGxlbmd0aCwgdTggKnBsY3ApCi17Ci0JdTE2IHVzZWMgPSAwOwotCXU4IGxlID0gMDsKLQotCXN3aXRjaCAocmF0ZV81MDApIHsKLQljYXNlIEJSQ01fUkFURV8xTToKLQkJdXNlYyA9IGxlbmd0aCA8PCAzOwotCQlicmVhazsKLQljYXNlIEJSQ01fUkFURV8yTToKLQkJdXNlYyA9IGxlbmd0aCA8PCAyOwotCQlicmVhazsKLQljYXNlIEJSQ01fUkFURV81TTU6Ci0JCXVzZWMgPSAobGVuZ3RoIDw8IDQpIC8gMTE7Ci0JCWlmICgobGVuZ3RoIDw8IDQpIC0gKHVzZWMgKiAxMSkgPiAwKQotCQkJdXNlYysrOwotCQlicmVhazsKLQljYXNlIEJSQ01fUkFURV8xMU06Ci0JCXVzZWMgPSAobGVuZ3RoIDw8IDMpIC8gMTE7Ci0JCWlmICgobGVuZ3RoIDw8IDMpIC0gKHVzZWMgKiAxMSkgPiAwKSB7Ci0JCQl1c2VjKys7Ci0JCQlpZiAoKHVzZWMgKiAxMSkgLSAobGVuZ3RoIDw8IDMpID49IDgpCi0JCQkJbGUgPSBEMTFCX1BMQ1BfU0lHTkFMX0xFOwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICJicmNtc19jX2Nja19wbGNwX3NldDogdW5zdXBwb3J0ZWQgcmF0ZSAlZCIKLQkJCSAgIlxuIiwgcmF0ZV81MDApOwotCQlyYXRlXzUwMCA9IEJSQ01fUkFURV8xTTsKLQkJdXNlYyA9IGxlbmd0aCA8PCAzOwotCQlicmVhazsKLQl9Ci0JLyogUExDUCBzaWduYWwgYnl0ZSAqLwotCXBsY3BbMF0gPSByYXRlXzUwMCAqIDU7CS8qIHIgKDUwMGticHMpICogNSA9PSByICgxMDBrYnBzKSAqLwotCS8qIFBMQ1Agc2VydmljZSBieXRlICovCi0JcGxjcFsxXSA9ICh1OCkgKGxlIHwgRDExQl9QTENQX1NJR05BTF9MT0NLRUQpOwotCS8qIFBMQ1AgbGVuZ3RoIHUxNiwgbGl0dGxlIGVuZGlhbiAqLwotCXBsY3BbMl0gPSB1c2VjICYgMHhmZjsKLQlwbGNwWzNdID0gKHVzZWMgPj4gOCkgJiAweGZmOwotCS8qIFBMQ1AgQ1JDMTYgKi8KLQlwbGNwWzRdID0gMDsKLQlwbGNwWzVdID0gMDsKLX0KLQotLyogUmF0ZTogODAyLjExIHJhdGUgY29kZSwgbGVuZ3RoOiBQU0RVIGxlbmd0aCBpbiBvY3RldHMgKi8KLXN0YXRpYyB2b2lkIGJyY21zX2NfY29tcHV0ZV9jY2tfcGxjcChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMsCi0JCQkJIHVpbnQgbGVuZ3RoLCB1OCAqcGxjcCkKLXsKLQlpbnQgcmF0ZSA9IFJTUEVDMlJBVEUocnNwZWMpOwotCi0JYnJjbXNfY19jY2tfcGxjcF9zZXQod2xjLCByYXRlLCBsZW5ndGgsIHBsY3ApOwotfQotCi0vKiBicmNtc19jX2NvbXB1dGVfZnJhbWVfZHVyKCkKLSAqCi0gKiBDYWxjdWxhdGUgdGhlIDgwMi4xMSBNQUMgaGVhZGVyIERVUiBmaWVsZCBmb3IgTVBEVQotICogRFVSIGZvciBhIHNpbmdsZSBmcmFtZSA9IDEgU0lGUyArIDEgQUNLCi0gKiBEVVIgZm9yIGEgZnJhbWUgd2l0aCBmb2xsb3dpbmcgZnJhZ3MgPSAzIFNJRlMgKyAyIEFDSyArIG5leHQgZnJhZyB0aW1lCi0gKgotICogcmF0ZQkJCU1QRFUgcmF0ZSBpbiB1bml0IG9mIDUwMGticHMKLSAqIG5leHRfZnJhZ19sZW4JbmV4dCBNUERVIGxlbmd0aCBpbiBieXRlcwotICogcHJlYW1ibGVfdHlwZQl1c2Ugc2hvcnQvR0Ygb3IgbG9uZy9NTSBQTENQIGhlYWRlcgotICovCi1zdGF0aWMgdTE2Ci1icmNtc19jX2NvbXB1dGVfZnJhbWVfZHVyKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlLAotCQkgICAgICB1OCBwcmVhbWJsZV90eXBlLCB1aW50IG5leHRfZnJhZ19sZW4pCi17Ci0JdTE2IGR1ciwgc2lmczsKLQotCXNpZnMgPSBTSUZTKHdsYy0+YmFuZCk7Ci0KLQlkdXIgPSBzaWZzOwotCWR1ciArPSAodTE2KSBicmNtc19jX2NhbGNfYWNrX3RpbWUod2xjLCByYXRlLCBwcmVhbWJsZV90eXBlKTsKLQotCWlmIChuZXh0X2ZyYWdfbGVuKSB7Ci0JCS8qIERvdWJsZSB0aGUgY3VycmVudCBEVVIgdG8gZ2V0IDIgU0lGUyArIDIgQUNLcyAqLwotCQlkdXIgKj0gMjsKLQkJLyogYWRkIGFub3RoZXIgU0lGUyBhbmQgdGhlIGZyYWcgdGltZSAqLwotCQlkdXIgKz0gc2lmczsKLQkJZHVyICs9Ci0JCSAgICAodTE2KSBicmNtc19jX2NhbGNfZnJhbWVfdGltZSh3bGMsIHJhdGUsIHByZWFtYmxlX3R5cGUsCi0JCQkJCQkgbmV4dF9mcmFnX2xlbik7Ci0JfQotCXJldHVybiBkdXI7Ci19Ci0KLS8qIGJyY21zX2NfY29tcHV0ZV9ydHNjdHNfZHVyKCkKLSAqCi0gKiBDYWxjdWxhdGUgdGhlIDgwMi4xMSBNQUMgaGVhZGVyIERVUiBmaWVsZCBmb3IgYW4gUlRTIG9yIENUUyBmcmFtZQotICogRFVSIGZvciBub3JtYWwgUlRTL0NUUyB3LyBmcmFtZSA9IDMgU0lGUyArIDEgQ1RTICsgbmV4dCBmcmFtZSB0aW1lICsgMSBBQ0sKLSAqIERVUiBmb3IgQ1RTLVRPLVNFTEYgdy8gZnJhbWUgICAgPSAyIFNJRlMgICAgICAgICArIG5leHQgZnJhbWUgdGltZSArIDEgQUNLCi0gKgotICogY3RzCQkJY3RzLXRvLXNlbGYgb3IgcnRzL2N0cwotICogcnRzX3JhdGUJCXJ0cyBvciBjdHMgcmF0ZSBpbiB1bml0IG9mIDUwMGticHMKLSAqIHJhdGUJCQluZXh0IE1QRFUgcmF0ZSBpbiB1bml0IG9mIDUwMGticHMKLSAqIGZyYW1lX2xlbgkJbmV4dCBNUERVIGZyYW1lIGxlbmd0aCBpbiBieXRlcwotICovCi11MTYKLWJyY21zX2NfY29tcHV0ZV9ydHNjdHNfZHVyKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgYm9vbCBjdHNfb25seSwKLQkJCSAgIHJhdGVzcGVjX3QgcnRzX3JhdGUsCi0JCQkgICByYXRlc3BlY190IGZyYW1lX3JhdGUsIHU4IHJ0c19wcmVhbWJsZV90eXBlLAotCQkJICAgdTggZnJhbWVfcHJlYW1ibGVfdHlwZSwgdWludCBmcmFtZV9sZW4sIGJvb2wgYmEpCi17Ci0JdTE2IGR1ciwgc2lmczsKLQotCXNpZnMgPSBTSUZTKHdsYy0+YmFuZCk7Ci0KLQlpZiAoIWN0c19vbmx5KSB7CS8qIFJUUy9DVFMgKi8KLQkJZHVyID0gMyAqIHNpZnM7Ci0JCWR1ciArPQotCQkgICAgKHUxNikgYnJjbXNfY19jYWxjX2N0c190aW1lKHdsYywgcnRzX3JhdGUsCi0JCQkJCSAgICAgICBydHNfcHJlYW1ibGVfdHlwZSk7Ci0JfSBlbHNlIHsJCS8qIENUUy1UTy1TRUxGICovCi0JCWR1ciA9IDIgKiBzaWZzOwotCX0KLQotCWR1ciArPQotCSAgICAodTE2KSBicmNtc19jX2NhbGNfZnJhbWVfdGltZSh3bGMsIGZyYW1lX3JhdGUsIGZyYW1lX3ByZWFtYmxlX3R5cGUsCi0JCQkJCSBmcmFtZV9sZW4pOwotCWlmIChiYSkKLQkJZHVyICs9Ci0JCSAgICAodTE2KSBicmNtc19jX2NhbGNfYmFfdGltZSh3bGMsIGZyYW1lX3JhdGUsCi0JCQkJCSAgICAgIEJSQ01TX1NIT1JUX1BSRUFNQkxFKTsKLQllbHNlCi0JCWR1ciArPQotCQkgICAgKHUxNikgYnJjbXNfY19jYWxjX2Fja190aW1lKHdsYywgZnJhbWVfcmF0ZSwKLQkJCQkJICAgICAgIGZyYW1lX3ByZWFtYmxlX3R5cGUpOwotCXJldHVybiBkdXI7Ci19Ci0KLXUxNiBicmNtc19jX3BoeXR4Y3RsMV9jYWxjKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYykKLXsKLQl1MTYgcGh5Y3RsMSA9IDA7Ci0JdTE2IGJ3OwotCi0JaWYgKEJSQ01TX0lTTENOUEhZKHdsYy0+YmFuZCkpIHsKLQkJYncgPSBQSFlfVFhDMV9CV18yME1IWjsKLQl9IGVsc2UgewotCQlidyA9IFJTUEVDX0dFVF9CVyhyc3BlYyk7Ci0JCS8qIDEwTWh6IGlzIG5vdCBzdXBwb3J0ZWQgeWV0ICovCi0JCWlmIChidyA8IFBIWV9UWEMxX0JXXzIwTUhaKSB7Ci0JCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgInBoeXR4Y3RsMV9jYWxjOiBidyAlZCBpcyAiCi0JCQkJICAibm90IHN1cHBvcnRlZCB5ZXQsIHNldCB0byAyMExcbiIsIGJ3KTsKLQkJCWJ3ID0gUEhZX1RYQzFfQldfMjBNSFo7Ci0JCX0KLQl9Ci0KLQlpZiAoSVNfTUNTKHJzcGVjKSkgewotCQl1aW50IG1jcyA9IHJzcGVjICYgUlNQRUNfUkFURV9NQVNLOwotCi0JCS8qIGJ3LCBzdGYsIGNvZGluZy10eXBlIGlzIHBhcnQgb2YgUlNQRUNfUEhZVFhCWVRFMiByZXR1cm5zICovCi0JCXBoeWN0bDEgPSBSU1BFQ19QSFlUWEJZVEUyKHJzcGVjKTsKLQkJLyogc2V0IHRoZSB1cHBlciBieXRlIG9mIHBoeWN0bDEgKi8KLQkJcGh5Y3RsMSB8PSAobWNzX3RhYmxlW21jc10udHhfcGh5X2N0bDMgPDwgOCk7Ci0JfSBlbHNlIGlmIChJU19DQ0socnNwZWMpICYmICFCUkNNU19JU0xDTlBIWSh3bGMtPmJhbmQpCi0JCSAgICYmICFCUkNNU19JU1NTTFBOUEhZKHdsYy0+YmFuZCkpIHsKLQkJLyogSW4gQ0NLIG1vZGUgTFBQSFkgb3ZlcmxvYWRzIE9GRE0gTW9kdWxhdGlvbiBiaXRzIHdpdGggQ0NLIERhdGEgUmF0ZSAqLwotCQkvKiBFdmVudHVhbGx5IE1JTU9QSFkgd291bGQgYWxzbyBiZSBjb252ZXJ0ZWQgdG8gdGhpcyBmb3JtYXQgKi8KLQkJLyogMCA9IDFNYnBzOyAxID0gMk1icHM7IDIgPSA1LjVNYnBzOyAzID0gMTFNYnBzICovCi0JCXBoeWN0bDEgPSAoYncgfCAoUlNQRUNfU1RGKHJzcGVjKSA8PCBQSFlfVFhDMV9NT0RFX1NISUZUKSk7Ci0JfSBlbHNlIHsJCS8qIGxlZ2FjeSBPRkRNL0NDSyAqLwotCQlzMTYgcGh5Y2ZnOwotCQkvKiBnZXQgdGhlIHBoeWN0bCBieXRlIGZyb20gcmF0ZSBwaHljZmcgdGFibGUgKi8KLQkJcGh5Y2ZnID0gYnJjbXNfY19yYXRlX2xlZ2FjeV9waHljdGwoUlNQRUMyUkFURShyc3BlYykpOwotCQlpZiAocGh5Y2ZnID09IC0xKSB7Ci0JCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgInBoeXR4Y3RsMV9jYWxjOiB3cm9uZyAiCi0JCQkJICAibGVnYWN5IE9GRE0vQ0NLIHJhdGVcbiIpOwotCQkJcGh5Y2ZnID0gMDsKLQkJfQotCQkvKiBzZXQgdGhlIHVwcGVyIGJ5dGUgb2YgcGh5Y3RsMSAqLwotCQlwaHljdGwxID0KLQkJICAgIChidyB8IChwaHljZmcgPDwgOCkgfAotCQkgICAgIChSU1BFQ19TVEYocnNwZWMpIDw8IFBIWV9UWEMxX01PREVfU0hJRlQpKTsKLQl9Ci0JcmV0dXJuIHBoeWN0bDE7Ci19Ci0KLXJhdGVzcGVjX3QKLWJyY21zX2NfcnNwZWNfdG9fcnRzX3JzcGVjKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYywKLQkJCSAgIGJvb2wgdXNlX3JzcGVjLCB1MTYgbWltb19jdGxjaGJ3KQotewotCXJhdGVzcGVjX3QgcnRzX3JzcGVjID0gMDsKLQotCWlmICh1c2VfcnNwZWMpIHsKLQkJLyogdXNlIGZyYW1lIHJhdGUgYXMgcnRzIHJhdGUgKi8KLQkJcnRzX3JzcGVjID0gcnNwZWM7Ci0KLQl9IGVsc2UgaWYgKHdsYy0+YmFuZC0+Z21vZGUgJiYgd2xjLT5wcm90ZWN0aW9uLT5fZyAmJiAhSVNfQ0NLKHJzcGVjKSkgewotCQkvKiBVc2UgMTFNYnBzIGFzIHRoZSBnIHByb3RlY3Rpb24gUlRTIHRhcmdldCByYXRlIGFuZCBmYWxsYmFjay4KLQkJICogVXNlIHRoZSBCUkNNU19CQVNJQ19SQVRFKCkgbG9va3VwIHRvIGZpbmQgdGhlIGJlc3QgYmFzaWMgcmF0ZQotCQkgKiB1bmRlciB0aGUgdGFyZ2V0IGluIGNhc2UgMTEgTWJwcyBpcyBub3QgQmFzaWMuCi0JCSAqIDYgYW5kIDkgTWJwcyBhcmUgbm90IHVzdWFsbHkgc2VsZWN0ZWQgYnkgcmF0ZSBzZWxlY3Rpb24sIGJ1dCBldmVuCi0JCSAqIGlmIHRoZSBPRkRNIHJhdGUgd2UgYXJlIHByb3RlY3RpbmcgaXMgNiBvciA5IE1icHMsIDExIGlzIG1vcmUgcm9idXN0LgotCQkgKi8KLQkJcnRzX3JzcGVjID0gQlJDTVNfQkFTSUNfUkFURSh3bGMsIEJSQ01fUkFURV8xMU0pOwotCX0gZWxzZSB7Ci0JCS8qIGNhbGN1bGF0ZSBSVFMgcmF0ZSBhbmQgZmFsbGJhY2sgcmF0ZSBiYXNlZCBvbiB0aGUgZnJhbWUgcmF0ZQotCQkgKiBSVFMgbXVzdCBiZSBzZW50IGF0IGEgYmFzaWMgcmF0ZSBzaW5jZSBpdCBpcyBhCi0JCSAqIGNvbnRyb2wgZnJhbWUsIHNlYyA5LjYgb2YgODAyLjExIHNwZWMKLQkJICovCi0JCXJ0c19yc3BlYyA9IEJSQ01TX0JBU0lDX1JBVEUod2xjLCByc3BlYyk7Ci0JfQotCi0JaWYgKEJSQ01TX1BIWV8xMU5fQ0FQKHdsYy0+YmFuZCkpIHsKLQkJLyogc2V0IHJ0cyB0eGJ3IHRvIGNvcnJlY3Qgc2lkZSBiYW5kICovCi0JCXJ0c19yc3BlYyAmPSB+UlNQRUNfQldfTUFTSzsKLQotCQkvKiBpZiByc3BlYy9yc3BlY19mYWxsYmFjayBpcyA0ME1IeiwgdGhlbiBzZW5kIFJUUyBvbiBib3RoIDIwTUh6IGNoYW5uZWwKLQkJICogKERVUCksIG90aGVyd2lzZSBzZW5kIFJUUyBvbiBjb250cm9sIGNoYW5uZWwKLQkJICovCi0JCWlmIChSU1BFQ19JUzQwTUhaKHJzcGVjKSAmJiAhSVNfQ0NLKHJ0c19yc3BlYykpCi0JCQlydHNfcnNwZWMgfD0gKFBIWV9UWEMxX0JXXzQwTUhaX0RVUCA8PCBSU1BFQ19CV19TSElGVCk7Ci0JCWVsc2UKLQkJCXJ0c19yc3BlYyB8PSAobWltb19jdGxjaGJ3IDw8IFJTUEVDX0JXX1NISUZUKTsKLQotCQkvKiBwaWNrIHNpc28vY2RkIGFzIGRlZmF1bHQgZm9yIG9mZG0gKi8KLQkJaWYgKElTX09GRE0ocnRzX3JzcGVjKSkgewotCQkJcnRzX3JzcGVjICY9IH5SU1BFQ19TVEZfTUFTSzsKLQkJCXJ0c19yc3BlYyB8PSAod2xjLT5zdGYtPnNzX29wbW9kZSA8PCBSU1BFQ19TVEZfU0hJRlQpOwotCQl9Ci0JfQotCXJldHVybiBydHNfcnNwZWM7Ci19Ci0KLS8qCi0gKiBBZGQgc3RydWN0IGQxMXR4aCwgc3RydWN0IGNja19waHlfaGRyLgotICoKLSAqICdwJyBkYXRhIG11c3Qgc3RhcnQgd2l0aCA4MDIuMTEgTUFDIGhlYWRlcgotICogJ3AnIG11c3QgYWxsb3cgZW5vdWdoIGJ5dGVzIG9mIGxvY2FsIGhlYWRlcnMgdG8gYmUgInB1c2hlZCIgb250byB0aGUgcGFja2V0Ci0gKgotICogaGVhZHJvb20gPT0gRDExX1BIWV9IRFJfTEVOICsgRDExX1RYSF9MRU4gKEQxMV9UWEhfTEVOIGlzIG5vdyAxMDQgYnl0ZXMpCi0gKgotICovCi1zdGF0aWMgdTE2Ci1icmNtc19jX2QxMWhkcnNfbWFjODAyMTEoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcCwgc3RydWN0IHNjYiAqc2NiLCB1aW50IGZyYWcsCi0JCSAgICAgdWludCBuZnJhZ3MsIHVpbnQgcXVldWUsIHVpbnQgbmV4dF9mcmFnX2xlbiwKLQkJICAgICBzdHJ1Y3Qgd3NlY19rZXkgKmtleSwgcmF0ZXNwZWNfdCByc3BlY19vdmVycmlkZSkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaDsKLQlzdHJ1Y3QgZDExdHhoICp0eGg7Ci0JdTggKnBsY3AsIHBsY3BfZmFsbGJhY2tbRDExX1BIWV9IRFJfTEVOXTsKLQlpbnQgbGVuLCBwaHlsZW4sIHJ0c19waHlsZW47Ci0JdTE2IG1jaCwgcGh5Y3RsLCB4ZnRzLCBtYWlucmF0ZXM7Ci0JdTE2IHNlcSA9IDAsIG1jbCA9IDAsIHN0YXR1cyA9IDAsIGZyYW1laWQgPSAwOwotCXJhdGVzcGVjX3QgcnNwZWNbMl0gPSB7IEJSQ01fUkFURV8xTSwgQlJDTV9SQVRFXzFNIH0sIHJ0c19yc3BlY1syXSA9IHsKLQlCUkNNX1JBVEVfMU0sIEJSQ01fUkFURV8xTX07Ci0JYm9vbCB1c2VfcnRzID0gZmFsc2U7Ci0JYm9vbCB1c2VfY3RzID0gZmFsc2U7Ci0JYm9vbCB1c2VfcmlmcyA9IGZhbHNlOwotCWJvb2wgc2hvcnRfcHJlYW1ibGVbMl0gPSB7IGZhbHNlLCBmYWxzZSB9OwotCXU4IHByZWFtYmxlX3R5cGVbMl0gPSB7IEJSQ01TX0xPTkdfUFJFQU1CTEUsIEJSQ01TX0xPTkdfUFJFQU1CTEUgfTsKLQl1OCBydHNfcHJlYW1ibGVfdHlwZVsyXSA9IHsgQlJDTVNfTE9OR19QUkVBTUJMRSwgQlJDTVNfTE9OR19QUkVBTUJMRSB9OwotCXU4ICpydHNfcGxjcCwgcnRzX3BsY3BfZmFsbGJhY2tbRDExX1BIWV9IRFJfTEVOXTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3J0cyAqcnRzID0gTlVMTDsKLQlib29sIHFvczsKLQl1aW50IGFjOwotCXUzMiByYXRlX3ZhbFsyXTsKLQlib29sIGh3dGttaWMgPSBmYWxzZTsKLQl1MTYgbWltb19jdGxjaGJ3ID0gUEhZX1RYQzFfQldfMjBNSFo7Ci0jZGVmaW5lIEFOVENGR19OT05FIDB4RkYKLQl1OCBhbnRjZmcgPSBBTlRDRkdfTk9ORTsKLQl1OCBmYmFudGNmZyA9IEFOVENGR19OT05FOwotCXVpbnQgcGh5Y3RsMV9zdGYgPSAwOwotCXUxNiBkdXJpZCA9IDA7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9yYXRlICp0eHJhdGVbMl07Ci0JaW50IGs7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eF9pbmZvOwotCWJvb2wgaXNfbWNzWzJdOwotCXUxNiBtaW1vX3R4Ync7Ci0JdTggbWltb19wcmVhbWJsZV90eXBlOwotCi0JLyogbG9jYXRlIDgwMi4xMSBNQUMgaGVhZGVyICovCi0JaCA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKShwLT5kYXRhKTsKLQlxb3MgPSBpZWVlODAyMTFfaXNfZGF0YV9xb3MoaC0+ZnJhbWVfY29udHJvbCk7Ci0KLQkvKiBjb21wdXRlIGxlbmd0aCBvZiBmcmFtZSBpbiBieXRlcyBmb3IgdXNlIGluIFBMQ1AgY29tcHV0YXRpb25zICovCi0JbGVuID0gYnJjbXVfcGt0dG90bGVuKHApOwotCXBoeWxlbiA9IGxlbiArIEZDU19MRU47Ci0KLQkvKiBJZiBXRVAgZW5hYmxlZCwgYWRkIHJvb20gaW4gcGh5bGVuIGZvciB0aGUgYWRkaXRpb25hbCBieXRlcyBvZgotCSAqIElDViB3aGljaCBNQUMgZ2VuZXJhdGVzLiAgV2UgZG8gTk9UIGFkZCB0aGUgYWRkaXRpb25hbCBieXRlcyB0bwotCSAqIHRoZSBwYWNrZXQgaXRzZWxmLCB0aHVzIHBoeWxlbiA9IHBhY2tldCBsZW5ndGggKyBJQ1ZfTEVOICsgRkNTX0xFTgotCSAqIGluIHRoaXMgY2FzZQotCSAqLwotCWlmIChrZXkpIHsKLQkJcGh5bGVuICs9IGtleS0+aWN2X2xlbjsKLQl9Ci0KLQkvKiBHZXQgdHhfaW5mbyAqLwotCXR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKHApOwotCi0JLyogYWRkIFBMQ1AgKi8KLQlwbGNwID0gc2tiX3B1c2gocCwgRDExX1BIWV9IRFJfTEVOKTsKLQotCS8qIGFkZCBCcm9hZGNvbSB0eCBkZXNjcmlwdG9yIGhlYWRlciAqLwotCXR4aCA9IChzdHJ1Y3QgZDExdHhoICopIHNrYl9wdXNoKHAsIEQxMV9UWEhfTEVOKTsKLQltZW1zZXQodHhoLCAwLCBEMTFfVFhIX0xFTik7Ci0KLQkvKiBzZXR1cCBmcmFtZWlkICovCi0JaWYgKHR4X2luZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BU1NJR05fU0VRKSB7Ci0JCS8qIG5vbi1BUCBTVEEgc2hvdWxkIG5ldmVyIHVzZSBCQ01DIHF1ZXVlICovCi0JCWlmIChxdWV1ZSA9PSBUWF9CQ01DX0ZJRk8pIHsKLQkJCXdpcGh5X2Vycih3bGMtPndpcGh5LCAid2wlZDogJXM6IEFTU0VSVCBxdWV1ZSA9PSAiCi0JCQkJICAiVFhfQkNNQyFcbiIsIEJSQ01TX1VOSVQod2xjKSwgX19mdW5jX18pOwotCQkJZnJhbWVpZCA9IGJjbWNfZmlkX2dlbmVyYXRlKHdsYywgTlVMTCwgdHhoKTsKLQkJfSBlbHNlIHsKLQkJCS8qIEluY3JlbWVudCB0aGUgY291bnRlciBmb3IgZmlyc3QgZnJhZ21lbnQgKi8KLQkJCWlmICh0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfRklSU1RfRlJBR01FTlQpIHsKLQkJCQlTQ0JfU0VRTlVNKHNjYiwgcC0+cHJpb3JpdHkpKys7Ci0JCQl9Ci0KLQkJCS8qIGV4dHJhY3QgZnJhZ21lbnQgbnVtYmVyIGZyb20gZnJhbWUgZmlyc3QgKi8KLQkJCXNlcSA9IGxlMTZfdG9fY3B1KHNlcSkgJiBGUkFHTlVNX01BU0s7Ci0JCQlzZXEgfD0gKFNDQl9TRVFOVU0oc2NiLCBwLT5wcmlvcml0eSkgPDwgU0VRTlVNX1NISUZUKTsKLQkJCWgtPnNlcV9jdHJsID0gY3B1X3RvX2xlMTYoc2VxKTsKLQotCQkJZnJhbWVpZCA9ICgoc2VxIDw8IFRYRklEX1NFUV9TSElGVCkgJiBUWEZJRF9TRVFfTUFTSykgfAotCQkJICAgIChxdWV1ZSAmIFRYRklEX1FVRVVFX01BU0spOwotCQl9Ci0JfQotCWZyYW1laWQgfD0gcXVldWUgJiBUWEZJRF9RVUVVRV9NQVNLOwotCi0JLyogc2V0IHRoZSBpZ25wbXEgYml0IGZvciBhbGwgcGt0cyB0eCdkIGluIFBTIG1vZGUgYW5kIGZvciBiZWFjb25zICovCi0JaWYgKFNDQl9QUyhzY2IpIHx8IGllZWU4MDIxMV9pc19iZWFjb24oaC0+ZnJhbWVfY29udHJvbCkpCi0JCW1jbCB8PSBUWENfSUdOT1JFUE1ROwotCi0JdHhyYXRlWzBdID0gdHhfaW5mby0+Y29udHJvbC5yYXRlczsKLQl0eHJhdGVbMV0gPSB0eHJhdGVbMF0gKyAxOwotCi0JLyogaWYgcmF0ZSBjb250cm9sIGFsZ29yaXRobSBkaWRuJ3QgZ2l2ZSB1cyBhIGZhbGxiYWNrIHJhdGUsIHVzZSB0aGUgcHJpbWFyeSByYXRlICovCi0JaWYgKHR4cmF0ZVsxXS0+aWR4IDwgMCkgewotCQl0eHJhdGVbMV0gPSB0eHJhdGVbMF07Ci0JfQotCi0JZm9yIChrID0gMDsgayA8IGh3LT5tYXhfcmF0ZXM7IGsrKykgewotCQlpc19tY3Nba10gPQotCQkgICAgdHhyYXRlW2tdLT5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MgPyB0cnVlIDogZmFsc2U7Ci0JCWlmICghaXNfbWNzW2tdKSB7Ci0JCQlpZiAoKHR4cmF0ZVtrXS0+aWR4ID49IDApCi0JCQkgICAgJiYgKHR4cmF0ZVtrXS0+aWR4IDwKLQkJCQlody0+d2lwaHktPmJhbmRzW3R4X2luZm8tPmJhbmRdLT5uX2JpdHJhdGVzKSkgewotCQkJCXJhdGVfdmFsW2tdID0KLQkJCQkgICAgaHctPndpcGh5LT5iYW5kc1t0eF9pbmZvLT5iYW5kXS0+Ci0JCQkJICAgIGJpdHJhdGVzW3R4cmF0ZVtrXS0+aWR4XS5od192YWx1ZTsKLQkJCQlzaG9ydF9wcmVhbWJsZVtrXSA9Ci0JCQkJICAgIHR4cmF0ZVtrXS0+Ci0JCQkJICAgIGZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9TSE9SVF9QUkVBTUJMRSA/Ci0JCQkJICAgIHRydWUgOiBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmF0ZV92YWxba10gPSBCUkNNX1JBVEVfMU07Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyYXRlX3ZhbFtrXSA9IHR4cmF0ZVtrXS0+aWR4OwotCQl9Ci0JCS8qIEN1cnJlbnRseSBvbmx5IHN1cHBvcnQgc2FtZSBzZXR0aW5nIGZvciBwcmltYXkgYW5kIGZhbGxiYWNrIHJhdGVzLgotCQkgKiBVbmlmeSBmbGFncyBmb3IgZWFjaCByYXRlIGludG8gYSBzaW5nbGUgdmFsdWUgZm9yIHRoZSBmcmFtZQotCQkgKi8KLQkJdXNlX3J0cyB8PQotCQkgICAgdHhyYXRlW2tdLT4KLQkJICAgIGZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9SVFNfQ1RTID8gdHJ1ZSA6IGZhbHNlOwotCQl1c2VfY3RzIHw9Ci0JCSAgICB0eHJhdGVba10tPgotCQkgICAgZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfVVNFX0NUU19QUk9URUNUID8gdHJ1ZSA6IGZhbHNlOwotCi0JCWlmIChpc19tY3Nba10pCi0JCQlyYXRlX3ZhbFtrXSB8PSBOUkFURV9NQ1NfSU5VU0U7Ci0KLQkJcnNwZWNba10gPSBtYWM4MDIxMV93bGNfc2V0X25yYXRlKHdsYywgd2xjLT5iYW5kLCByYXRlX3ZhbFtrXSk7Ci0KLQkJLyogKDEpIFJBVEU6IGRldGVybWluZSBhbmQgdmFsaWRhdGUgcHJpbWFyeSByYXRlIGFuZCBmYWxsYmFjayByYXRlcyAqLwotCQlpZiAoIVJTUEVDX0FDVElWRShyc3BlY1trXSkpIHsKLQkJCXJzcGVjW2tdID0gQlJDTV9SQVRFXzFNOwotCQl9IGVsc2UgewotCQkJaWYgKCFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoLT5hZGRyMSkpIHsKLQkJCQkvKiBzZXQgdHggYW50ZW5uYSBjb25maWcgKi8KLQkJCQlicmNtc19jX2FudHNlbF9hbnRjZmdfZ2V0KHdsYy0+YXNpLCBmYWxzZSwKLQkJCQkJZmFsc2UsIDAsIDAsICZhbnRjZmcsICZmYmFudGNmZyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwaHljdGwxX3N0ZiA9IHdsYy0+c3RmLT5zc19vcG1vZGU7Ci0KLQlpZiAoTl9FTkFCKHdsYy0+cHViKSkgewotCQlmb3IgKGsgPSAwOyBrIDwgaHctPm1heF9yYXRlczsgaysrKSB7Ci0JCQkvKiBhcHBseSBzaXNvL2NkZCB0byBzaW5nbGUgc3RyZWFtIG1jcydzIG9yIG9mZG0gaWYgcnNwZWMgaXMgYXV0byBzZWxlY3RlZCAqLwotCQkJaWYgKCgoSVNfTUNTKHJzcGVjW2tdKSAmJgotCQkJICAgICAgSVNfU0lOR0xFX1NUUkVBTShyc3BlY1trXSAmIFJTUEVDX1JBVEVfTUFTSykpIHx8Ci0JCQkgICAgIElTX09GRE0ocnNwZWNba10pKQotCQkJICAgICYmICgocnNwZWNba10gJiBSU1BFQ19PVkVSUklERV9NQ1NfT05MWSkKLQkJCQl8fCAhKHJzcGVjW2tdICYgUlNQRUNfT1ZFUlJJREUpKSkgewotCQkJCXJzcGVjW2tdICY9IH4oUlNQRUNfU1RGX01BU0sgfCBSU1BFQ19TVENfTUFTSyk7Ci0KLQkJCQkvKiBGb3IgU0lTTyBNQ1MgdXNlIFNUQkMgaWYgcG9zc2libGUgKi8KLQkJCQlpZiAoSVNfTUNTKHJzcGVjW2tdKQotCQkJCSAgICAmJiBCUkNNU19TVEZfU1NfU1RCQ19UWCh3bGMsIHNjYikpIHsKLQkJCQkJdTggc3RjOwotCi0JCQkJCXN0YyA9IDE7CS8qIE5zcyBmb3Igc2luZ2xlIHN0cmVhbSBpcyBhbHdheXMgMSAqLwotCQkJCQlyc3BlY1trXSB8PQotCQkJCQkgICAgKFBIWV9UWEMxX01PREVfU1RCQyA8PAotCQkJCQkgICAgIFJTUEVDX1NURl9TSElGVCkgfCAoc3RjIDw8Ci0JCQkJCQkJCSBSU1BFQ19TVENfU0hJRlQpOwotCQkJCX0gZWxzZQotCQkJCQlyc3BlY1trXSB8PQotCQkJCQkgICAgKHBoeWN0bDFfc3RmIDw8IFJTUEVDX1NURl9TSElGVCk7Ci0JCQl9Ci0KLQkJCS8qIElzIHRoZSBwaHkgY29uZmlndXJlZCB0byB1c2UgNDBNSFogZnJhbWVzPyBJZiBzbyB0aGVuIHBpY2sgdGhlIGRlc2lyZWQgdHhidyAqLwotCQkJaWYgKENIU1BFQ19XTENfQlcod2xjLT5jaGFuc3BlYykgPT0gQlJDTVNfNDBfTUhaKSB7Ci0JCQkJLyogZGVmYXVsdCB0eGJ3IGlzIDIwaW40MCBTQiAqLwotCQkJCW1pbW9fY3RsY2hidyA9IG1pbW9fdHhidyA9Ci0JCQkJICAgQ0hTUEVDX1NCX1VQUEVSKEJSQ01TX0JBTkRfUElfUkFESU9fQ0hBTlNQRUMpCi0JCQkJICAgPyBQSFlfVFhDMV9CV18yME1IWl9VUCA6IFBIWV9UWEMxX0JXXzIwTUhaOwotCi0JCQkJaWYgKElTX01DUyhyc3BlY1trXSkpIHsKLQkJCQkJLyogbWNzIDMyIG11c3QgYmUgNDBiL3cgRFVQICovCi0JCQkJCWlmICgocnNwZWNba10gJiBSU1BFQ19SQVRFX01BU0spID09IDMyKSB7Ci0JCQkJCQltaW1vX3R4YncgPQotCQkJCQkJICAgIFBIWV9UWEMxX0JXXzQwTUhaX0RVUDsKLQkJCQkJCS8qIHVzZSBvdmVycmlkZSAqLwotCQkJCQl9IGVsc2UgaWYgKHdsYy0+bWltb180MHR4YncgIT0gQVVUTykKLQkJCQkJCW1pbW9fdHhidyA9IHdsYy0+bWltb180MHR4Ync7Ci0JCQkJCS8qIGVsc2UgY2hlY2sgaWYgZHN0IGlzIHVzaW5nIDQwIE1oeiAqLwotCQkJCQllbHNlIGlmIChzY2ItPmZsYWdzICYgU0NCX0lTNDApCi0JCQkJCQltaW1vX3R4YncgPSBQSFlfVFhDMV9CV180ME1IWjsKLQkJCQl9IGVsc2UgaWYgKElTX09GRE0ocnNwZWNba10pKSB7Ci0JCQkJCWlmICh3bGMtPm9mZG1fNDB0eGJ3ICE9IEFVVE8pCi0JCQkJCQltaW1vX3R4YncgPSB3bGMtPm9mZG1fNDB0eGJ3OwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmICh3bGMtPmNja180MHR4YncgIT0gQVVUTykKLQkJCQkJCW1pbW9fdHhidyA9IHdsYy0+Y2NrXzQwdHhidzsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8qIG1jczMyIGlzIDQwIGIvdyBvbmx5LgotCQkJCSAqIFRoaXMgaXMgcG9zc2libGUgZm9yIHByb2JlIHBhY2tldHMgb24gYSBTVEEgZHVyaW5nIFNDQU4KLQkJCQkgKi8KLQkJCQlpZiAoKHJzcGVjW2tdICYgUlNQRUNfUkFURV9NQVNLKSA9PSAzMikgewotCQkJCQkvKiBtY3MgMCAqLwotCQkJCQlyc3BlY1trXSA9IFJTUEVDX01JTU9SQVRFOwotCQkJCX0KLQkJCQltaW1vX3R4YncgPSBQSFlfVFhDMV9CV18yME1IWjsKLQkJCX0KLQotCQkJLyogU2V0IGNoYW5uZWwgd2lkdGggKi8KLQkJCXJzcGVjW2tdICY9IH5SU1BFQ19CV19NQVNLOwotCQkJaWYgKChrID09IDApIHx8ICgoayA+IDApICYmIElTX01DUyhyc3BlY1trXSkpKQotCQkJCXJzcGVjW2tdIHw9IChtaW1vX3R4YncgPDwgUlNQRUNfQldfU0hJRlQpOwotCQkJZWxzZQotCQkJCXJzcGVjW2tdIHw9IChtaW1vX2N0bGNoYncgPDwgUlNQRUNfQldfU0hJRlQpOwotCi0JCQkvKiBTZXQgU2hvcnQgR0kgKi8KLSNpZmRlZiBOT1NHSVlFVAotCQkJaWYgKElTX01DUyhyc3BlY1trXSkKLQkJCSAgICAmJiAodHhyYXRlW2tdLT5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19TSE9SVF9HSSkpCi0JCQkJcnNwZWNba10gfD0gUlNQRUNfU0hPUlRfR0k7Ci0JCQllbHNlIGlmICghKHR4cmF0ZVtrXS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0kpKQotCQkJCXJzcGVjW2tdICY9IH5SU1BFQ19TSE9SVF9HSTsKLSNlbHNlCi0JCQlyc3BlY1trXSAmPSB+UlNQRUNfU0hPUlRfR0k7Ci0jZW5kaWYKLQotCQkJbWltb19wcmVhbWJsZV90eXBlID0gQlJDTVNfTU1fUFJFQU1CTEU7Ci0JCQlpZiAodHhyYXRlW2tdLT5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19HUkVFTl9GSUVMRCkKLQkJCQltaW1vX3ByZWFtYmxlX3R5cGUgPSBCUkNNU19HRl9QUkVBTUJMRTsKLQotCQkJaWYgKCh0eHJhdGVba10tPmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX01DUykKLQkJCSAgICAmJiAoIUlTX01DUyhyc3BlY1trXSkpKSB7Ci0JCQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICJ3bCVkOiAlczogSUVFRTgwMjExX1RYXyIKLQkJCQkJICAiUkNfTUNTICE9IElTX01DUyhyc3BlYylcbiIsCi0JCQkJCSAgQlJDTVNfVU5JVCh3bGMpLCBfX2Z1bmNfXyk7Ci0JCQl9Ci0KLQkJCWlmIChJU19NQ1MocnNwZWNba10pKSB7Ci0JCQkJcHJlYW1ibGVfdHlwZVtrXSA9IG1pbW9fcHJlYW1ibGVfdHlwZTsKLQotCQkJCS8qIGlmIFNHSSBpcyBzZWxlY3RlZCwgdGhlbiBmb3JjZWQgbW0gZm9yIHNpbmdsZSBzdHJlYW0gKi8KLQkJCQlpZiAoKHJzcGVjW2tdICYgUlNQRUNfU0hPUlRfR0kpCi0JCQkJICAgICYmIElTX1NJTkdMRV9TVFJFQU0ocnNwZWNba10gJgotCQkJCQkJCVJTUEVDX1JBVEVfTUFTSykpIHsKLQkJCQkJcHJlYW1ibGVfdHlwZVtrXSA9IEJSQ01TX01NX1BSRUFNQkxFOwotCQkJCX0KLQkJCX0KLQotCQkJLyogc2hvdWxkIGJlIGJldHRlciBjb25kaXRpb25hbGl6ZWQgKi8KLQkJCWlmICghSVNfTUNTKHJzcGVjWzBdKQotCQkJICAgICYmICh0eF9pbmZvLT5jb250cm9sLnJhdGVzWzBdLgotCQkJCWZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9TSE9SVF9QUkVBTUJMRSkpCi0JCQkJcHJlYW1ibGVfdHlwZVtrXSA9IEJSQ01TX1NIT1JUX1BSRUFNQkxFOwotCQl9Ci0JfSBlbHNlIHsKLQkJZm9yIChrID0gMDsgayA8IGh3LT5tYXhfcmF0ZXM7IGsrKykgewotCQkJLyogU2V0IGN0cmxjaGJ3IGFzIDIwTWh6ICovCi0JCQlyc3BlY1trXSAmPSB+UlNQRUNfQldfTUFTSzsKLQkJCXJzcGVjW2tdIHw9IChQSFlfVFhDMV9CV18yME1IWiA8PCBSU1BFQ19CV19TSElGVCk7Ci0KLQkJCS8qIGZvciBucGh5LCBzdGYgb2Ygb2ZkbSBmcmFtZXMgbXVzdCBmb2xsb3cgcG9saWNpZXMgKi8KLQkJCWlmIChCUkNNU19JU05QSFkod2xjLT5iYW5kKSAmJiBJU19PRkRNKHJzcGVjW2tdKSkgewotCQkJCXJzcGVjW2tdICY9IH5SU1BFQ19TVEZfTUFTSzsKLQkJCQlyc3BlY1trXSB8PSBwaHljdGwxX3N0ZiA8PCBSU1BFQ19TVEZfU0hJRlQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBSZXNldCB0aGVzZSBmb3IgdXNlIHdpdGggQU1QRFUncyAqLwotCXR4cmF0ZVswXS0+Y291bnQgPSAwOwotCXR4cmF0ZVsxXS0+Y291bnQgPSAwOwotCi0JLyogKDIpIFBST1RFQ1RJT04sIG1heSBjaGFuZ2UgcnNwZWMgKi8KLQlpZiAoKGllZWU4MDIxMV9pc19kYXRhKGgtPmZyYW1lX2NvbnRyb2wpIHx8Ci0JICAgIGllZWU4MDIxMV9pc19tZ210KGgtPmZyYW1lX2NvbnRyb2wpKSAmJgotCSAgICAocGh5bGVuID4gd2xjLT5SVFNUaHJlc2gpICYmICFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoLT5hZGRyMSkpCi0JCXVzZV9ydHMgPSB0cnVlOwotCi0JLyogKDMpIFBMQ1A6IGRldGVybWluZSBQTENQIGhlYWRlciBhbmQgTUFDIGR1cmF0aW9uLAotCSAqIGZpbGwgc3RydWN0IGQxMXR4aCAqLwotCWJyY21zX2NfY29tcHV0ZV9wbGNwKHdsYywgcnNwZWNbMF0sIHBoeWxlbiwgcGxjcCk7Ci0JYnJjbXNfY19jb21wdXRlX3BsY3Aod2xjLCByc3BlY1sxXSwgcGh5bGVuLCBwbGNwX2ZhbGxiYWNrKTsKLQltZW1jcHkoJnR4aC0+RnJhZ1BMQ1BGYWxsYmFjaywKLQkgICAgICAgcGxjcF9mYWxsYmFjaywgc2l6ZW9mKHR4aC0+RnJhZ1BMQ1BGYWxsYmFjaykpOwotCi0JLyogTGVuZ3RoIGZpZWxkIG5vdyBwdXQgaW4gQ0NLIEZCUiBDUkMgZmllbGQgKi8KLQlpZiAoSVNfQ0NLKHJzcGVjWzFdKSkgewotCQl0eGgtPkZyYWdQTENQRmFsbGJhY2tbNF0gPSBwaHlsZW4gJiAweGZmOwotCQl0eGgtPkZyYWdQTENQRmFsbGJhY2tbNV0gPSAocGh5bGVuICYgMHhmZjAwKSA+PiA4OwotCX0KLQotCS8qIE1JTU8tUkFURTogbmVlZCB2YWxpZGF0aW9uID8/ICovCi0JbWFpbnJhdGVzID0gSVNfT0ZETShyc3BlY1swXSkgPwotCQkJRDExQV9QSFlfSERSX0dSQVRFKChzdHJ1Y3Qgb2ZkbV9waHlfaGRyICopIHBsY3ApIDoKLQkJCXBsY3BbMF07Ci0KLQkvKiBEVVIgZmllbGQgZm9yIG1haW4gcmF0ZSAqLwotCWlmICghaWVlZTgwMjExX2lzX3BzcG9sbChoLT5mcmFtZV9jb250cm9sKSAmJgotCSAgICAhaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaC0+YWRkcjEpICYmICF1c2VfcmlmcykgewotCQlkdXJpZCA9Ci0JCSAgICBicmNtc19jX2NvbXB1dGVfZnJhbWVfZHVyKHdsYywgcnNwZWNbMF0sIHByZWFtYmxlX3R5cGVbMF0sCi0JCQkJCSAgbmV4dF9mcmFnX2xlbik7Ci0JCWgtPmR1cmF0aW9uX2lkID0gY3B1X3RvX2xlMTYoZHVyaWQpOwotCX0gZWxzZSBpZiAodXNlX3JpZnMpIHsKLQkJLyogTkFWIHByb3RlY3QgdG8gZW5kIG9mIG5leHQgbWF4IHBhY2tldCBzaXplICovCi0JCWR1cmlkID0KLQkJICAgICh1MTYpIGJyY21zX2NfY2FsY19mcmFtZV90aW1lKHdsYywgcnNwZWNbMF0sCi0JCQkJCQkgcHJlYW1ibGVfdHlwZVswXSwKLQkJCQkJCSBET1QxMV9NQVhfRlJBR19MRU4pOwotCQlkdXJpZCArPSBSSUZTXzExTl9USU1FOwotCQloLT5kdXJhdGlvbl9pZCA9IGNwdV90b19sZTE2KGR1cmlkKTsKLQl9Ci0KLQkvKiBEVVIgZmllbGQgZm9yIGZhbGxiYWNrIHJhdGUgKi8KLQlpZiAoaWVlZTgwMjExX2lzX3BzcG9sbChoLT5mcmFtZV9jb250cm9sKSkKLQkJdHhoLT5GcmFnRHVyRmFsbGJhY2sgPSBoLT5kdXJhdGlvbl9pZDsKLQllbHNlIGlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoLT5hZGRyMSkgfHwgdXNlX3JpZnMpCi0JCXR4aC0+RnJhZ0R1ckZhbGxiYWNrID0gMDsKLQllbHNlIHsKLQkJZHVyaWQgPSBicmNtc19jX2NvbXB1dGVfZnJhbWVfZHVyKHdsYywgcnNwZWNbMV0sCi0JCQkJCSAgICAgIHByZWFtYmxlX3R5cGVbMV0sIG5leHRfZnJhZ19sZW4pOwotCQl0eGgtPkZyYWdEdXJGYWxsYmFjayA9IGNwdV90b19sZTE2KGR1cmlkKTsKLQl9Ci0KLQkvKiAoNCkgTUFDLUhEUjogTWFjVHhDb250cm9sTG93ICovCi0JaWYgKGZyYWcgPT0gMCkKLQkJbWNsIHw9IFRYQ19TVEFSVE1TRFU7Ci0KLQlpZiAoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGgtPmFkZHIxKSkKLQkJbWNsIHw9IFRYQ19JTU1FREFDSzsKLQotCWlmIChCQU5EXzVHKHdsYy0+YmFuZC0+YmFuZHR5cGUpKQotCQltY2wgfD0gVFhDX0ZSRVFCQU5EXzVHOwotCi0JaWYgKENIU1BFQ19JUzQwKEJSQ01TX0JBTkRfUElfUkFESU9fQ0hBTlNQRUMpKQotCQltY2wgfD0gVFhDX0JXXzQwOwotCi0JLyogc2V0IEFNSUMgYml0IGlmIHVzaW5nIGhhcmR3YXJlIFRLSVAgTUlDICovCi0JaWYgKGh3dGttaWMpCi0JCW1jbCB8PSBUWENfQU1JQzsKLQotCXR4aC0+TWFjVHhDb250cm9sTG93ID0gY3B1X3RvX2xlMTYobWNsKTsKLQotCS8qIE1hY1R4Q29udHJvbEhpZ2ggKi8KLQltY2ggPSAwOwotCi0JLyogU2V0IGZhbGxiYWNrIHJhdGUgcHJlYW1ibGUgdHlwZSAqLwotCWlmICgocHJlYW1ibGVfdHlwZVsxXSA9PSBCUkNNU19TSE9SVF9QUkVBTUJMRSkgfHwKLQkgICAgKHByZWFtYmxlX3R5cGVbMV0gPT0gQlJDTVNfR0ZfUFJFQU1CTEUpKSB7Ci0JCWlmIChSU1BFQzJSQVRFKHJzcGVjWzFdKSAhPSBCUkNNX1JBVEVfMU0pCi0JCQltY2ggfD0gVFhDX1BSRUFNQkxFX0RBVEFfRkJfU0hPUlQ7Ci0JfQotCi0JLyogTWFjRnJhbWVDb250cm9sICovCi0JbWVtY3B5KCZ0eGgtPk1hY0ZyYW1lQ29udHJvbCwgJmgtPmZyYW1lX2NvbnRyb2wsIHNpemVvZih1MTYpKTsKLQl0eGgtPlR4RmVzVGltZU5vcm1hbCA9IGNwdV90b19sZTE2KDApOwotCi0JdHhoLT5UeEZlc1RpbWVGYWxsYmFjayA9IGNwdV90b19sZTE2KDApOwotCi0JLyogVHhGcmFtZVJBICovCi0JbWVtY3B5KCZ0eGgtPlR4RnJhbWVSQSwgJmgtPmFkZHIxLCBFVEhfQUxFTik7Ci0KLQkvKiBUeEZyYW1lSUQgKi8KLQl0eGgtPlR4RnJhbWVJRCA9IGNwdV90b19sZTE2KGZyYW1laWQpOwotCi0JLyogVHhTdGF0dXMsIE5vdGUgdGhlIGNhc2Ugb2YgcmVjcmVhdGluZyB0aGUgZmlyc3QgZnJhZyBvZiBhIHN1cHByZXNzZWQgZnJhbWUKLQkgKiB0aGVuIHdlIG1heSBuZWVkIHRvIHJlc2V0IHRoZSByZXRyeSBjbnQncyB2aWEgdGhlIHN0YXR1cyByZWcKLQkgKi8KLQl0eGgtPlR4U3RhdHVzID0gY3B1X3RvX2xlMTYoc3RhdHVzKTsKLQotCS8qIGV4dHJhIGZpZWxkcyBmb3IgdWNvZGUgQU1QRFUgYWdncmVnYXRpb24sIHRoZSBuZXcgZmllbGRzIGFyZSBhZGRlZCB0bwotCSAqIHRoZSBFTkQgb2YgcHJldmlvdXMgc3RydWN0dXJlIHNvIHRoYXQgaXQncyBjb21wYXRpYmxlIGluIGRyaXZlci4KLQkgKi8KLQl0eGgtPk1heE5NcGR1cyA9IGNwdV90b19sZTE2KDApOwotCXR4aC0+TWF4QUJ5dGVzX01SVCA9IGNwdV90b19sZTE2KDApOwotCXR4aC0+TWF4QUJ5dGVzX0ZCUiA9IGNwdV90b19sZTE2KDApOwotCXR4aC0+TWluTUJ5dGVzID0gY3B1X3RvX2xlMTYoMCk7Ci0KLQkvKiAoNSkgUlRTL0NUUzogZGV0ZXJtaW5lIFJUUy9DVFMgUExDUCBoZWFkZXIgYW5kIE1BQyBkdXJhdGlvbiwKLQkgKiBmdXJuaXNoIHN0cnVjdCBkMTF0eGggKi8KLQkvKiBSVFMgUExDUCBoZWFkZXIgYW5kIFJUUyBmcmFtZSAqLwotCWlmICh1c2VfcnRzIHx8IHVzZV9jdHMpIHsKLQkJaWYgKHVzZV9ydHMgJiYgdXNlX2N0cykKLQkJCXVzZV9jdHMgPSBmYWxzZTsKLQotCQlmb3IgKGsgPSAwOyBrIDwgMjsgaysrKSB7Ci0JCQlydHNfcnNwZWNba10gPSBicmNtc19jX3JzcGVjX3RvX3J0c19yc3BlYyh3bGMsIHJzcGVjW2tdLAotCQkJCQkJCSAgICAgIGZhbHNlLAotCQkJCQkJCSAgICAgIG1pbW9fY3RsY2hidyk7Ci0JCX0KLQotCQlpZiAoIUlTX09GRE0ocnRzX3JzcGVjWzBdKSAmJgotCQkgICAgISgoUlNQRUMyUkFURShydHNfcnNwZWNbMF0pID09IEJSQ01fUkFURV8xTSkgfHwKLQkJICAgICAgKHdsYy0+UExDUEhkcl9vdmVycmlkZSA9PSBCUkNNU19QTENQX0xPTkcpKSkgewotCQkJcnRzX3ByZWFtYmxlX3R5cGVbMF0gPSBCUkNNU19TSE9SVF9QUkVBTUJMRTsKLQkJCW1jaCB8PSBUWENfUFJFQU1CTEVfUlRTX01BSU5fU0hPUlQ7Ci0JCX0KLQotCQlpZiAoIUlTX09GRE0ocnRzX3JzcGVjWzFdKSAmJgotCQkgICAgISgoUlNQRUMyUkFURShydHNfcnNwZWNbMV0pID09IEJSQ01fUkFURV8xTSkgfHwKLQkJICAgICAgKHdsYy0+UExDUEhkcl9vdmVycmlkZSA9PSBCUkNNU19QTENQX0xPTkcpKSkgewotCQkJcnRzX3ByZWFtYmxlX3R5cGVbMV0gPSBCUkNNU19TSE9SVF9QUkVBTUJMRTsKLQkJCW1jaCB8PSBUWENfUFJFQU1CTEVfUlRTX0ZCX1NIT1JUOwotCQl9Ci0KLQkJLyogUlRTL0NUUyBhZGRpdGlvbnMgdG8gTWFjVHhDb250cm9sTG93ICovCi0JCWlmICh1c2VfY3RzKSB7Ci0JCQl0eGgtPk1hY1R4Q29udHJvbExvdyB8PSBjcHVfdG9fbGUxNihUWENfU0VORENUUyk7Ci0JCX0gZWxzZSB7Ci0JCQl0eGgtPk1hY1R4Q29udHJvbExvdyB8PSBjcHVfdG9fbGUxNihUWENfU0VORFJUUyk7Ci0JCQl0eGgtPk1hY1R4Q29udHJvbExvdyB8PSBjcHVfdG9fbGUxNihUWENfTE9OR0ZSQU1FKTsKLQkJfQotCi0JCS8qIFJUUyBQTENQIGhlYWRlciAqLwotCQlydHNfcGxjcCA9IHR4aC0+UlRTUGh5SGVhZGVyOwotCQlpZiAodXNlX2N0cykKLQkJCXJ0c19waHlsZW4gPSBET1QxMV9DVFNfTEVOICsgRkNTX0xFTjsKLQkJZWxzZQotCQkJcnRzX3BoeWxlbiA9IERPVDExX1JUU19MRU4gKyBGQ1NfTEVOOwotCi0JCWJyY21zX2NfY29tcHV0ZV9wbGNwKHdsYywgcnRzX3JzcGVjWzBdLCBydHNfcGh5bGVuLCBydHNfcGxjcCk7Ci0KLQkJLyogZmFsbGJhY2sgcmF0ZSB2ZXJzaW9uIG9mIFJUUyBQTENQIGhlYWRlciAqLwotCQlicmNtc19jX2NvbXB1dGVfcGxjcCh3bGMsIHJ0c19yc3BlY1sxXSwgcnRzX3BoeWxlbiwKLQkJCQkgcnRzX3BsY3BfZmFsbGJhY2spOwotCQltZW1jcHkoJnR4aC0+UlRTUExDUEZhbGxiYWNrLCBydHNfcGxjcF9mYWxsYmFjaywKLQkJICAgICAgIHNpemVvZih0eGgtPlJUU1BMQ1BGYWxsYmFjaykpOwotCi0JCS8qIFJUUyBmcmFtZSBmaWVsZHMuLi4gKi8KLQkJcnRzID0gKHN0cnVjdCBpZWVlODAyMTFfcnRzICopJnR4aC0+cnRzX2ZyYW1lOwotCi0JCWR1cmlkID0gYnJjbXNfY19jb21wdXRlX3J0c2N0c19kdXIod2xjLCB1c2VfY3RzLCBydHNfcnNwZWNbMF0sCi0JCQkJCSAgICAgICByc3BlY1swXSwgcnRzX3ByZWFtYmxlX3R5cGVbMF0sCi0JCQkJCSAgICAgICBwcmVhbWJsZV90eXBlWzBdLCBwaHlsZW4sIGZhbHNlKTsKLQkJcnRzLT5kdXJhdGlvbiA9IGNwdV90b19sZTE2KGR1cmlkKTsKLQkJLyogZmFsbGJhY2sgcmF0ZSB2ZXJzaW9uIG9mIFJUUyBEVVIgZmllbGQgKi8KLQkJZHVyaWQgPSBicmNtc19jX2NvbXB1dGVfcnRzY3RzX2R1cih3bGMsIHVzZV9jdHMsCi0JCQkJCSAgICAgICBydHNfcnNwZWNbMV0sIHJzcGVjWzFdLAotCQkJCQkgICAgICAgcnRzX3ByZWFtYmxlX3R5cGVbMV0sCi0JCQkJCSAgICAgICBwcmVhbWJsZV90eXBlWzFdLCBwaHlsZW4sIGZhbHNlKTsKLQkJdHhoLT5SVFNEdXJGYWxsYmFjayA9IGNwdV90b19sZTE2KGR1cmlkKTsKLQotCQlpZiAodXNlX2N0cykgewotCQkJcnRzLT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX0NUTCB8Ci0JCQkJCQkJIElFRUU4MDIxMV9TVFlQRV9DVFMpOwotCi0JCQltZW1jcHkoJnJ0cy0+cmEsICZoLT5hZGRyMiwgRVRIX0FMRU4pOwotCQl9IGVsc2UgewotCQkJcnRzLT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX0NUTCB8Ci0JCQkJCQkJIElFRUU4MDIxMV9TVFlQRV9SVFMpOwotCi0JCQltZW1jcHkoJnJ0cy0+cmEsICZoLT5hZGRyMSwgMiAqIEVUSF9BTEVOKTsKLQkJfQotCi0JCS8qIG1haW5yYXRlCi0JCSAqICAgIGxvdyA4IGJpdHM6IG1haW4gZnJhZyByYXRlL21jcywKLQkJICogICAgaGlnaCA4IGJpdHM6IHJ0cy9jdHMgcmF0ZS9tY3MKLQkJICovCi0JCW1haW5yYXRlcyB8PSAoSVNfT0ZETShydHNfcnNwZWNbMF0pID8KLQkJCQlEMTFBX1BIWV9IRFJfR1JBVEUoCi0JCQkJCShzdHJ1Y3Qgb2ZkbV9waHlfaGRyICopIHJ0c19wbGNwKSA6Ci0JCQkJcnRzX3BsY3BbMF0pIDw8IDg7Ci0JfSBlbHNlIHsKLQkJbWVtc2V0KChjaGFyICopdHhoLT5SVFNQaHlIZWFkZXIsIDAsIEQxMV9QSFlfSERSX0xFTik7Ci0JCW1lbXNldCgoY2hhciAqKSZ0eGgtPnJ0c19mcmFtZSwgMCwKLQkJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3J0cykpOwotCQltZW1zZXQoKGNoYXIgKil0eGgtPlJUU1BMQ1BGYWxsYmFjaywgMCwKLQkJICAgICAgc2l6ZW9mKHR4aC0+UlRTUExDUEZhbGxiYWNrKSk7Ci0JCXR4aC0+UlRTRHVyRmFsbGJhY2sgPSAwOwotCX0KLQotI2lmZGVmIFNVUFBPUlRfNDBNSFoKLQkvKiBhZGQgbnVsbCBkZWxpbWl0ZXIgY291bnQgKi8KLQlpZiAoKHR4X2luZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkgJiYgSVNfTUNTKHJzcGVjKSkgewotCQl0eGgtPlJUU1BMQ1BGYWxsYmFja1tBTVBEVV9GQlJfTlVMTF9ERUxJTV0gPQotCQkgICBicmNtX2NfYW1wZHVfbnVsbF9kZWxpbV9jbnQod2xjLT5hbXBkdSwgc2NiLCByc3BlYywgcGh5bGVuKTsKLQl9Ci0jZW5kaWYKLQotCS8qIE5vdyB0aGF0IFJUUy9SVFMgRkIgcHJlYW1ibGUgdHlwZXMgYXJlIHVwZGF0ZWQsIHdyaXRlIHRoZSBmaW5hbCB2YWx1ZSAqLwotCXR4aC0+TWFjVHhDb250cm9sSGlnaCA9IGNwdV90b19sZTE2KG1jaCk7Ci0KLQkvKiBNYWluUmF0ZXMgKGJvdGggdGhlIHJ0cyBhbmQgZnJhZyBwbGNwIHJhdGVzIGhhdmUgYmVlbiBjYWxjdWxhdGVkIG5vdykgKi8KLQl0eGgtPk1haW5SYXRlcyA9IGNwdV90b19sZTE2KG1haW5yYXRlcyk7Ci0KLQkvKiBYdHJhRnJhbWVUeXBlcyAqLwotCXhmdHMgPSBGUkFNRVRZUEUocnNwZWNbMV0sIHdsYy0+bWltb2Z0KTsKLQl4ZnRzIHw9IChGUkFNRVRZUEUocnRzX3JzcGVjWzBdLCB3bGMtPm1pbW9mdCkgPDwgWEZUU19SVFNfRlRfU0hJRlQpOwotCXhmdHMgfD0gKEZSQU1FVFlQRShydHNfcnNwZWNbMV0sIHdsYy0+bWltb2Z0KSA8PCBYRlRTX0ZCUlJUU19GVF9TSElGVCk7Ci0JeGZ0cyB8PQotCSAgICBDSFNQRUNfQ0hBTk5FTChCUkNNU19CQU5EX1BJX1JBRElPX0NIQU5TUEVDKSA8PCBYRlRTX0NIQU5ORUxfU0hJRlQ7Ci0JdHhoLT5YdHJhRnJhbWVUeXBlcyA9IGNwdV90b19sZTE2KHhmdHMpOwotCi0JLyogUGh5VHhDb250cm9sV29yZCAqLwotCXBoeWN0bCA9IEZSQU1FVFlQRShyc3BlY1swXSwgd2xjLT5taW1vZnQpOwotCWlmICgocHJlYW1ibGVfdHlwZVswXSA9PSBCUkNNU19TSE9SVF9QUkVBTUJMRSkgfHwKLQkgICAgKHByZWFtYmxlX3R5cGVbMF0gPT0gQlJDTVNfR0ZfUFJFQU1CTEUpKSB7Ci0JCWlmIChSU1BFQzJSQVRFKHJzcGVjWzBdKSAhPSBCUkNNX1JBVEVfMU0pCi0JCQlwaHljdGwgfD0gUEhZX1RYQ19TSE9SVF9IRFI7Ci0JfQotCi0JLyogcGh5dHhhbnQgaXMgcHJvcGVybHkgYml0IHNoaWZ0ZWQgKi8KLQlwaHljdGwgfD0gYnJjbXNfY19zdGZfZDExaGRyc19waHljdGxfdHhhbnQod2xjLCByc3BlY1swXSk7Ci0JdHhoLT5QaHlUeENvbnRyb2xXb3JkID0gY3B1X3RvX2xlMTYocGh5Y3RsKTsKLQotCS8qIFBoeVR4Q29udHJvbFdvcmRfMSAqLwotCWlmIChCUkNNU19QSFlfMTFOX0NBUCh3bGMtPmJhbmQpKSB7Ci0JCXUxNiBwaHljdGwxID0gMDsKLQotCQlwaHljdGwxID0gYnJjbXNfY19waHl0eGN0bDFfY2FsYyh3bGMsIHJzcGVjWzBdKTsKLQkJdHhoLT5QaHlUeENvbnRyb2xXb3JkXzEgPSBjcHVfdG9fbGUxNihwaHljdGwxKTsKLQkJcGh5Y3RsMSA9IGJyY21zX2NfcGh5dHhjdGwxX2NhbGMod2xjLCByc3BlY1sxXSk7Ci0JCXR4aC0+UGh5VHhDb250cm9sV29yZF8xX0ZiciA9IGNwdV90b19sZTE2KHBoeWN0bDEpOwotCi0JCWlmICh1c2VfcnRzIHx8IHVzZV9jdHMpIHsKLQkJCXBoeWN0bDEgPSBicmNtc19jX3BoeXR4Y3RsMV9jYWxjKHdsYywgcnRzX3JzcGVjWzBdKTsKLQkJCXR4aC0+UGh5VHhDb250cm9sV29yZF8xX1J0cyA9IGNwdV90b19sZTE2KHBoeWN0bDEpOwotCQkJcGh5Y3RsMSA9IGJyY21zX2NfcGh5dHhjdGwxX2NhbGMod2xjLCBydHNfcnNwZWNbMV0pOwotCQkJdHhoLT5QaHlUeENvbnRyb2xXb3JkXzFfRmJyUnRzID0gY3B1X3RvX2xlMTYocGh5Y3RsMSk7Ci0JCX0KLQotCQkvKgotCQkgKiBGb3IgbWNzIGZyYW1lcywgaWYgbWl4ZWRtb2RlKG92ZXJsb2FkZWQgd2l0aCBsb25nIHByZWFtYmxlKSBpcyBnb2luZyB0byBiZSBzZXQsCi0JCSAqIGZpbGwgaW4gbm9uLXplcm8gTU1vZGVMZW4gYW5kL29yIE1Nb2RlRmJyTGVuCi0JCSAqICBpdCB3aWxsIGJlIHVubmVjZXNzYXJ5IGlmIHRoZXkgYXJlIHNlcGFyYXRlZAotCQkgKi8KLQkJaWYgKElTX01DUyhyc3BlY1swXSkgJiYKLQkJICAgIChwcmVhbWJsZV90eXBlWzBdID09IEJSQ01TX01NX1BSRUFNQkxFKSkgewotCQkJdTE2IG1tb2RlbGVuID0KLQkJCSAgICBicmNtc19jX2NhbGNfbHNpZ19sZW4od2xjLCByc3BlY1swXSwgcGh5bGVuKTsKLQkJCXR4aC0+TU1vZGVMZW4gPSBjcHVfdG9fbGUxNihtbW9kZWxlbik7Ci0JCX0KLQotCQlpZiAoSVNfTUNTKHJzcGVjWzFdKSAmJgotCQkgICAgKHByZWFtYmxlX3R5cGVbMV0gPT0gQlJDTVNfTU1fUFJFQU1CTEUpKSB7Ci0JCQl1MTYgbW1vZGVmYnJsZW4gPQotCQkJICAgIGJyY21zX2NfY2FsY19sc2lnX2xlbih3bGMsIHJzcGVjWzFdLCBwaHlsZW4pOwotCQkJdHhoLT5NTW9kZUZickxlbiA9IGNwdV90b19sZTE2KG1tb2RlZmJybGVuKTsKLQkJfQotCX0KLQotCWFjID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHApOwotCWlmIChTQ0JfV01FKHNjYikgJiYgcW9zICYmIHdsYy0+ZWRjZl90eG9wW2FjXSkgewotCQl1aW50IGZyYWdfZHVyLCBkdXIsIGR1cl9mYWxsYmFjazsKLQotCQkvKiBXTUU6IFVwZGF0ZSBUWE9QIHRocmVzaG9sZCAqLwotCQlpZiAoKCEodHhfaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKSkgJiYgKGZyYWcgPT0gMCkpIHsKLQkJCWZyYWdfZHVyID0KLQkJCSAgICBicmNtc19jX2NhbGNfZnJhbWVfdGltZSh3bGMsIHJzcGVjWzBdLAotCQkJCQlwcmVhbWJsZV90eXBlWzBdLCBwaHlsZW4pOwotCi0JCQlpZiAocnRzKSB7Ci0JCQkJLyogMSBSVFMgb3IgQ1RTLXRvLXNlbGYgZnJhbWUgKi8KLQkJCQlkdXIgPQotCQkJCSAgICBicmNtc19jX2NhbGNfY3RzX3RpbWUod2xjLCBydHNfcnNwZWNbMF0sCi0JCQkJCQkgICAgICBydHNfcHJlYW1ibGVfdHlwZVswXSk7Ci0JCQkJZHVyX2ZhbGxiYWNrID0KLQkJCQkgICAgYnJjbXNfY19jYWxjX2N0c190aW1lKHdsYywgcnRzX3JzcGVjWzFdLAotCQkJCQkJICAgICAgcnRzX3ByZWFtYmxlX3R5cGVbMV0pOwotCQkJCS8qIChTSUZTICsgQ1RTKSArIFNJRlMgKyBmcmFtZSArIFNJRlMgKyBBQ0sgKi8KLQkJCQlkdXIgKz0gbGUxNl90b19jcHUocnRzLT5kdXJhdGlvbik7Ci0JCQkJZHVyX2ZhbGxiYWNrICs9Ci0JCQkJCWxlMTZfdG9fY3B1KHR4aC0+UlRTRHVyRmFsbGJhY2spOwotCQkJfSBlbHNlIGlmICh1c2VfcmlmcykgewotCQkJCWR1ciA9IGZyYWdfZHVyOwotCQkJCWR1cl9mYWxsYmFjayA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCS8qIGZyYW1lICsgU0lGUyArIEFDSyAqLwotCQkJCWR1ciA9IGZyYWdfZHVyOwotCQkJCWR1ciArPQotCQkJCSAgICBicmNtc19jX2NvbXB1dGVfZnJhbWVfZHVyKHdsYywgcnNwZWNbMF0sCi0JCQkJCQkJICBwcmVhbWJsZV90eXBlWzBdLCAwKTsKLQotCQkJCWR1cl9mYWxsYmFjayA9Ci0JCQkJICAgIGJyY21zX2NfY2FsY19mcmFtZV90aW1lKHdsYywgcnNwZWNbMV0sCi0JCQkJCQkJcHJlYW1ibGVfdHlwZVsxXSwKLQkJCQkJCQlwaHlsZW4pOwotCQkJCWR1cl9mYWxsYmFjayArPQotCQkJCSAgICBicmNtc19jX2NvbXB1dGVfZnJhbWVfZHVyKHdsYywgcnNwZWNbMV0sCi0JCQkJCQkJICBwcmVhbWJsZV90eXBlWzFdLCAwKTsKLQkJCX0KLQkJCS8qIE5FRUQgdG8gc2V0IFR4RmVzVGltZU5vcm1hbCAoaGFyZCkgKi8KLQkJCXR4aC0+VHhGZXNUaW1lTm9ybWFsID0gY3B1X3RvX2xlMTYoKHUxNikgZHVyKTsKLQkJCS8qIE5FRUQgdG8gc2V0IGZhbGxiYWNrIHJhdGUgdmVyc2lvbiBvZiBUeEZlc1RpbWVOb3JtYWwgKGhhcmQpICovCi0JCQl0eGgtPlR4RmVzVGltZUZhbGxiYWNrID0KLQkJCQljcHVfdG9fbGUxNigodTE2KSBkdXJfZmFsbGJhY2spOwotCi0JCQkvKiB1cGRhdGUgdHhvcCBieXRlIHRocmVzaG9sZCAodHhvcCBtaW51cyBpbnRyYWZyYW1lIG92ZXJoZWFkKSAqLwotCQkJaWYgKHdsYy0+ZWRjZl90eG9wW2FjXSA+PSAoZHVyIC0gZnJhZ19kdXIpKSB7Ci0JCQkJewotCQkJCQl1aW50IG5ld2ZyYWd0aHJlc2g7Ci0KLQkJCQkJbmV3ZnJhZ3RocmVzaCA9Ci0JCQkJCSAgICBicmNtc19jX2NhbGNfZnJhbWVfbGVuKHdsYywKLQkJCQkJCXJzcGVjWzBdLCBwcmVhbWJsZV90eXBlWzBdLAotCQkJCQkJKHdsYy0+ZWRjZl90eG9wW2FjXSAtCi0JCQkJCQkJKGR1ciAtIGZyYWdfZHVyKSkpOwotCQkJCQkvKiByYW5nZSBib3VuZCB0aGUgZnJhZ3RocmVzaG9sZCAqLwotCQkJCQlpZiAobmV3ZnJhZ3RocmVzaCA8IERPVDExX01JTl9GUkFHX0xFTikKLQkJCQkJCW5ld2ZyYWd0aHJlc2ggPQotCQkJCQkJICAgIERPVDExX01JTl9GUkFHX0xFTjsKLQkJCQkJZWxzZSBpZiAobmV3ZnJhZ3RocmVzaCA+Ci0JCQkJCQkgd2xjLT51c3JfZnJhZ3RocmVzaCkKLQkJCQkJCW5ld2ZyYWd0aHJlc2ggPQotCQkJCQkJICAgIHdsYy0+dXNyX2ZyYWd0aHJlc2g7Ci0JCQkJCS8qIHVwZGF0ZSB0aGUgZnJhZ3RocmVzaCBhbmQgZG8gdHhjIHVwZGF0ZSAqLwotCQkJCQlpZiAod2xjLT5mcmFndGhyZXNoW3F1ZXVlXSAhPQotCQkJCQkgICAgKHUxNikgbmV3ZnJhZ3RocmVzaCkgewotCQkJCQkJd2xjLT5mcmFndGhyZXNoW3F1ZXVlXSA9Ci0JCQkJCQkgICAgKHUxNikgbmV3ZnJhZ3RocmVzaDsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZQotCQkJCXdpcGh5X2Vycih3bGMtPndpcGh5LCAid2wlZDogJXMgdHhvcCBpbnZhbGlkICIKLQkJCQkJICAiZm9yIHJhdGUgJWRcbiIsCi0JCQkJCSAgd2xjLT5wdWItPnVuaXQsIGZpZm9fbmFtZXNbcXVldWVdLAotCQkJCQkgIFJTUEVDMlJBVEUocnNwZWNbMF0pKTsKLQotCQkJaWYgKGR1ciA+IHdsYy0+ZWRjZl90eG9wW2FjXSkKLQkJCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIndsJWQ6ICVzOiAlcyB0eG9wICIKLQkJCQkJICAiZXhjZWVkZWQgcGh5bGVuICVkLyVkIGR1ciAlZC8lZFxuIiwKLQkJCQkJICB3bGMtPnB1Yi0+dW5pdCwgX19mdW5jX18sCi0JCQkJCSAgZmlmb19uYW1lc1txdWV1ZV0sCi0JCQkJCSAgcGh5bGVuLCB3bGMtPmZyYWd0aHJlc2hbcXVldWVdLAotCQkJCQkgIGR1ciwgd2xjLT5lZGNmX3R4b3BbYWNdKTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi12b2lkIGJyY21zX2NfdGJ0dChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0Jc3RydWN0IGJyY21zX2Jzc19jZmcgKmNmZyA9IHdsYy0+Y2ZnOwotCi0JaWYgKCFjZmctPkJTUykgewotCQkvKiBEaXJGcm1RIGlzIG5vdyB2YWxpZC4uLmRlZmVyIHNldHRpbmcgdW50aWwgZW5kIG9mIEFUSU0gd2luZG93ICovCi0JCXdsYy0+cXZhbGlkIHw9IE1DTURfRElSRlJNUVZBTDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21zX2Nfd2FyMTYxNjUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBib29sIHR4KQotewotCWlmICh0eCkgewotCQkvKiB0aGUgcG9zdC1pbmNyZW1lbnQgaXMgdXNlZCBpbiBTVEFZX0FXQUtFIG1hY3JvICovCi0JCWlmICh3bGMtPnR4cGVuZDE2MTY1d2FyKysgPT0gMCkKLQkJCWJyY21zX2Nfc2V0X3BzX2N0cmwod2xjKTsKLQl9IGVsc2UgewotCQl3bGMtPnR4cGVuZDE2MTY1d2FyLS07Ci0JCWlmICh3bGMtPnR4cGVuZDE2MTY1d2FyID09IDApCi0JCQlicmNtc19jX3NldF9wc19jdHJsKHdsYyk7Ci0JfQotfQotCi0vKiBwcm9jZXNzIGFuIGluZGl2aWR1YWwgc3RydWN0IHR4X3N0YXR1cyAqLwotYm9vbAotYnJjbXNfY19kb3R4c3RhdHVzKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgc3RydWN0IHR4X3N0YXR1cyAqdHhzLCB1MzIgZnJtX3R4MikKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcDsKLQl1aW50IHF1ZXVlOwotCXN0cnVjdCBkMTF0eGggKnR4aDsKLQlzdHJ1Y3Qgc2NiICpzY2IgPSBOVUxMOwotCWJvb2wgZnJlZV9wZHU7Ci0JaW50IHR4X3J0cywgdHhfZnJhbWVfY291bnQsIHR4X3J0c19jb3VudDsKLQl1aW50IHRvdGxlbiwgc3Vwcl9zdGF0dXM7Ci0JYm9vbCBsYXN0ZnJhbWU7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmg7Ci0JdTE2IG1jbDsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4X2luZm87Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9yYXRlICp0eHJhdGU7Ci0JaW50IGk7Ci0KLQkodm9pZCkoZnJtX3R4Mik7CS8qIENvbXBpbGVyIHJlZmVyZW5jZSB0byBhdm9pZCB1bnVzZWQgdmFyaWFibGUgd2FybmluZyAqLwotCi0JLyogZGlzY2FyZCBpbnRlcm1lZGlhdGUgaW5kaWNhdGlvbnMgZm9yIHVjb2RlIHdpdGggb25lIGxlZ2l0aW1hdGUgY2FzZToKLQkgKiAgIGUuZy4gaWYgInVzZVJUUyIgaXMgc2V0LiB1Y29kZSBkaWQgYSBzdWNjZXNzZnVsIHJ0cy9jdHMgZXhjaGFuZ2UsIGJ1dCB0aGUgc3Vic2VxdWVudAotCSAqICAgdHggb2YgREFUQSBmYWlsZWQuIHNvIGl0IHdpbGwgc3RhcnQgcnRzL2N0cyBmcm9tIHRoZSBiZWdpbm5pbmcgKHJlc2V0dGluZyB0aGUgcnRzCi0JICogICB0cmFuc21pc3Npb24gY291bnQpCi0JICovCi0JaWYgKCEodHhzLT5zdGF0dXMgJiBUWF9TVEFUVVNfQU1QRFUpCi0JICAgICYmICh0eHMtPnN0YXR1cyAmIFRYX1NUQVRVU19JTlRFUk1FRElBVEUpKSB7Ci0JCXdpcGh5X2Vycih3bGMtPndpcGh5LCAiJXM6IElOVEVSTUVESUFURSBidXQgbm90IEFNUERVXG4iLAotCQkJICBfX2Z1bmNfXyk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlxdWV1ZSA9IHR4cy0+ZnJhbWVpZCAmIFRYRklEX1FVRVVFX01BU0s7Ci0JaWYgKHF1ZXVlID49IE5GSUZPKSB7Ci0JCXAgPSBOVUxMOwotCQlnb3RvIGZhdGFsOwotCX0KLQotCXAgPSBHRVRORVhUVFhQKHdsYywgcXVldWUpOwotCWlmIChCUkNNU19XQVIxNjE2NSh3bGMpKQotCQlicmNtc19jX3dhcjE2MTY1KHdsYywgZmFsc2UpOwotCWlmIChwID09IE5VTEwpCi0JCWdvdG8gZmF0YWw7Ci0KLQl0eGggPSAoc3RydWN0IGQxMXR4aCAqKSAocC0+ZGF0YSk7Ci0JbWNsID0gbGUxNl90b19jcHUodHhoLT5NYWNUeENvbnRyb2xMb3cpOwotCi0JaWYgKHR4cy0+cGh5ZXJyKSB7Ci0JCWlmIChXTF9FUlJPUl9PTigpKSB7Ci0JCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgInBoeWVyciAweCV4LCByYXRlIDB4JXhcbiIsCi0JCQkJICB0eHMtPnBoeWVyciwgdHhoLT5NYWluUmF0ZXMpOwotCQkJYnJjbXNfY19wcmludF90eGRlc2ModHhoKTsKLQkJfQotCQlicmNtc19jX3ByaW50X3R4c3RhdHVzKHR4cyk7Ci0JfQotCi0JaWYgKHR4cy0+ZnJhbWVpZCAhPSBjcHVfdG9fbGUxNih0eGgtPlR4RnJhbWVJRCkpCi0JCWdvdG8gZmF0YWw7Ci0JdHhfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IocCk7Ci0JaCA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSgodTggKikgKHR4aCArIDEpICsgRDExX1BIWV9IRFJfTEVOKTsKLQotCWlmICh0eF9pbmZvLT5jb250cm9sLnN0YSkKLQkJc2NiID0gKHN0cnVjdCBzY2IgKil0eF9pbmZvLT5jb250cm9sLnN0YS0+ZHJ2X3ByaXY7Ci0KLQlpZiAodHhfaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKSB7Ci0JCWJyY21zX2NfYW1wZHVfZG90eHN0YXR1cyh3bGMtPmFtcGR1LCBzY2IsIHAsIHR4cyk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlzdXByX3N0YXR1cyA9IHR4cy0+c3RhdHVzICYgVFhfU1RBVFVTX1NVUFJfTUFTSzsKLQlpZiAoc3Vwcl9zdGF0dXMgPT0gVFhfU1RBVFVTX1NVUFJfQkFEQ0gpCi0JCUJDTU1TRyh3bGMtPndpcGh5LAotCQkgICAgICAgIiVzOiBQa3QgdHggc3VwcHJlc3NlZCwgcG9zc2libHkgY2hhbm5lbCAlZFxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBDSFNQRUNfQ0hBTk5FTCh3bGMtPmRlZmF1bHRfYnNzLT5jaGFuc3BlYykpOwotCi0JdHhfcnRzID0gY3B1X3RvX2xlMTYodHhoLT5NYWNUeENvbnRyb2xMb3cpICYgVFhDX1NFTkRSVFM7Ci0JdHhfZnJhbWVfY291bnQgPQotCSAgICAodHhzLT5zdGF0dXMgJiBUWF9TVEFUVVNfRlJNX1JUWF9NQVNLKSA+PiBUWF9TVEFUVVNfRlJNX1JUWF9TSElGVDsKLQl0eF9ydHNfY291bnQgPQotCSAgICAodHhzLT5zdGF0dXMgJiBUWF9TVEFUVVNfUlRTX1JUWF9NQVNLKSA+PiBUWF9TVEFUVVNfUlRTX1JUWF9TSElGVDsKLQotCWxhc3RmcmFtZSA9ICFpZWVlODAyMTFfaGFzX21vcmVmcmFncyhoLT5mcmFtZV9jb250cm9sKTsKLQotCWlmICghbGFzdGZyYW1lKSB7Ci0JCXdpcGh5X2Vycih3bGMtPndpcGh5LCAiTm90IGxhc3QgZnJhbWUhXG4iKTsKLQl9IGVsc2UgewotCQkvKgotCQkgKiBTZXQgaW5mb3JtYXRpb24gdG8gYmUgY29uc3VtZWQgYnkgTWluc3RyZWwgaHQuCi0JCSAqCi0JCSAqIFRoZSAiZmFsbGJhY2sgbGltaXQiIGlzIHRoZSBudW1iZXIgb2YgdHggYXR0ZW1wdHMgYSBnaXZlbgotCQkgKiBNUERVIGlzIHNlbnQgYXQgdGhlICJwcmltYXJ5IiByYXRlLiBUeCBhdHRlbXB0cyBiZXlvbmQgdGhhdAotCQkgKiBsaW1pdCBhcmUgc2VudCBhdCB0aGUgInNlY29uZGFyeSIgcmF0ZS4KLQkJICogQSAnc2hvcnQgZnJhbWUnIGRvZXMgbm90IGV4Y2VlZCBSVFMgdHJlc2hvbGQuCi0JCSAqLwotCQl1MTYgc2ZibCwJLyogU2hvcnQgRnJhbWUgUmF0ZSBGYWxsYmFjayBMaW1pdCAqLwotCQkgICAgbGZibCwJLyogTG9uZyBGcmFtZSBSYXRlIEZhbGxiYWNrIExpbWl0ICovCi0JCSAgICBmYmw7Ci0KLQkJaWYgKHF1ZXVlIDwgQUNfQ09VTlQpIHsKLQkJCXNmYmwgPSBCUkNNU19XTUVfUkVUUllfU0ZCX0dFVCh3bGMsIHdtZV9maWZvMmFjW3F1ZXVlXSk7Ci0JCQlsZmJsID0gQlJDTVNfV01FX1JFVFJZX0xGQl9HRVQod2xjLCB3bWVfZmlmbzJhY1txdWV1ZV0pOwotCQl9IGVsc2UgewotCQkJc2ZibCA9IHdsYy0+U0ZCTDsKLQkJCWxmYmwgPSB3bGMtPkxGQkw7Ci0JCX0KLQotCQl0eHJhdGUgPSB0eF9pbmZvLT5zdGF0dXMucmF0ZXM7Ci0JCWlmICh0eHJhdGVbMF0uZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfVVNFX1JUU19DVFMpCi0JCQlmYmwgPSBsZmJsOwotCQllbHNlCi0JCQlmYmwgPSBzZmJsOwotCi0JCWllZWU4MDIxMV90eF9pbmZvX2NsZWFyX3N0YXR1cyh0eF9pbmZvKTsKLQotCQlpZiAoKHR4X2ZyYW1lX2NvdW50ID4gZmJsKSAmJiAodHhyYXRlWzFdLmlkeCA+PSAwKSkgewotCQkJLyogcmF0ZSBzZWxlY3Rpb24gcmVxdWVzdGVkIGEgZmFsbGJhY2sgcmF0ZSBhbmQgd2UgdXNlZCBpdCAqLwotCQkJdHhyYXRlWzBdLmNvdW50ID0gZmJsOwotCQkJdHhyYXRlWzFdLmNvdW50ID0gdHhfZnJhbWVfY291bnQgLSBmYmw7Ci0JCX0gZWxzZSB7Ci0JCQkvKiByYXRlIHNlbGVjdGlvbiBkaWQgbm90IHJlcXVlc3QgZmFsbGJhY2sgcmF0ZSwgb3Igd2UgZGlkbid0IG5lZWQgaXQgKi8KLQkJCXR4cmF0ZVswXS5jb3VudCA9IHR4X2ZyYW1lX2NvdW50OwotCQkJLyogcmM4MDIxMV9taW5zdHJlbC5jOm1pbnN0cmVsX3R4X3N0YXR1cygpIGV4cGVjdHMgdW51c2VkIHJhdGVzIHRvIGJlIG1hcmtlZCB3aXRoIGlkeCA9IC0xICovCi0JCQl0eHJhdGVbMV0uaWR4ID0gLTE7Ci0JCQl0eHJhdGVbMV0uY291bnQgPSAwOwotCQl9Ci0KLQkJLyogY2xlYXIgdGhlIHJlc3Qgb2YgdGhlIHJhdGVzICovCi0JCWZvciAoaSA9IDI7IGkgPCBJRUVFODAyMTFfVFhfTUFYX1JBVEVTOyBpKyspIHsKLQkJCXR4cmF0ZVtpXS5pZHggPSAtMTsKLQkJCXR4cmF0ZVtpXS5jb3VudCA9IDA7Ci0JCX0KLQotCQlpZiAodHhzLT5zdGF0dXMgJiBUWF9TVEFUVVNfQUNLX1JDVikKLQkJCXR4X2luZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX0FDSzsKLQl9Ci0KLQl0b3RsZW4gPSBicmNtdV9wa3R0b3RsZW4ocCk7Ci0JZnJlZV9wZHUgPSB0cnVlOwotCi0JYnJjbXNfY190eGZpZm9fY29tcGxldGUod2xjLCBxdWV1ZSwgMSk7Ci0KLQlpZiAobGFzdGZyYW1lKSB7Ci0JCXAtPm5leHQgPSBOVUxMOwotCQlwLT5wcmV2ID0gTlVMTDsKLQkJLyogcmVtb3ZlIFBMQ1AgJiBCcm9hZGNvbSB0eCBkZXNjcmlwdG9yIGhlYWRlciAqLwotCQlza2JfcHVsbChwLCBEMTFfUEhZX0hEUl9MRU4pOwotCQlza2JfcHVsbChwLCBEMTFfVFhIX0xFTik7Ci0JCWllZWU4MDIxMV90eF9zdGF0dXNfaXJxc2FmZSh3bGMtPnB1Yi0+aWVlZV9odywgcCk7Ci0JfSBlbHNlIHsKLQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICIlczogTm90IGxhc3QgZnJhbWUgPT4gbm90IGNhbGxpbmcgIgotCQkJICAidHhfc3RhdHVzXG4iLCBfX2Z1bmNfXyk7Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwotCi0gZmF0YWw6Ci0JaWYgKHApCi0JCWJyY211X3BrdF9idWZfZnJlZV9za2IocCk7Ci0KLQlyZXR1cm4gdHJ1ZTsKLQotfQotCi12b2lkCi1icmNtc19jX3R4Zmlmb19jb21wbGV0ZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHVpbnQgZmlmbywgczggdHhwa3RwZW5kKQotewotCVRYUEtUUEVORERFQyh3bGMsIGZpZm8sIHR4cGt0cGVuZCk7Ci0JQkNNTVNHKHdsYy0+d2lwaHksICJwa3RwZW5kIGRlYyAlZCB0byAlZFxuIiwgdHhwa3RwZW5kLAotCQlUWFBLVFBFTkRHRVQod2xjLCBmaWZvKSk7Ci0KLQkvKiBUaGVyZSBpcyBtb3JlIHJvb207IG1hcmsgcHJlY2VkZW5jZXMgcmVsYXRlZCB0byB0aGlzIEZJRk8gc2VuZGFibGUgKi8KLQlCUkNNU19UWF9GSUZPX0VOQUIod2xjLCBmaWZvKTsKLQotCS8qIENsZWFyIE1IRjJfVFhCQ01DX05PVyBmbGFnIGlmIEJDTUMgZmlmbyBoYXMgZHJhaW5lZCAqLwotCWlmIChBUF9FTkFCKHdsYy0+cHViKSAmJgotCSAgICAhVFhQS1RQRU5ER0VUKHdsYywgVFhfQkNNQ19GSUZPKSkgewotCQlicmNtc19jX21oZih3bGMsIE1IRjIsIE1IRjJfVFhCQ01DX05PVywgMCwgQlJDTV9CQU5EX0FVVE8pOwotCX0KLQotCS8qIGZpZ3VyZSBvdXQgd2hpY2ggYnNzY2ZnIGlzIGJlaW5nIHdvcmtlZCBvbi4uLiAqLwotfQotCi0vKiBVcGRhdGUgYmVhY29uIGxpc3RlbiBpbnRlcnZhbCBpbiBzaGFyZWQgbWVtb3J5ICovCi12b2lkIGJyY21zX2NfYmNuX2xpX3VwZChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0JaWYgKEFQX0VOQUIod2xjLT5wdWIpKQotCQlyZXR1cm47Ci0KLQkvKiB3YWtlIHVwIGV2ZXJ5IERUSU0gaXMgdGhlIGRlZmF1bHQgKi8KLQlpZiAod2xjLT5iY25fbGlfZHRpbSA9PSAxKQotCQlicmNtc19jX3dyaXRlX3NobSh3bGMsIE1fQkNOX0xJLCAwKTsKLQllbHNlCi0JCWJyY21zX2Nfd3JpdGVfc2htKHdsYywgTV9CQ05fTEksCi0JCQkgICAgICAod2xjLT5iY25fbGlfZHRpbSA8PCA4KSB8IHdsYy0+YmNuX2xpX2Jjbik7Ci19Ci0KLS8qCi0gKiByZWNvdmVyIDY0Yml0IFRTRiB2YWx1ZSBmcm9tIHRoZSAxNmJpdCBUU0YgdmFsdWUgaW4gdGhlIHJ4IGhlYWRlcgotICogZ2l2ZW4gdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgVFNGIHBhc3NlZCBpbiBoZWFkZXIgaXMgd2l0aGluIDY1bXMKLSAqIG9mIHRoZSBjdXJyZW50IHRzZi4KLSAqCi0gKiA2ICAgICAgIDUgICAgICAgNCAgICAgICA0ICAgICAgIDMgICAgICAgMiAgICAgICAxCi0gKiAzLi4uLi4uLjYuLi4uLi4uOC4uLi4uLi4wLi4uLi4uLjIuLi4uLi4uNC4uLi4uLi42Li4uLi4uLjguLi4uLi4wCi0gKiB8PC0tLS0tLS0tLS0gdHNmX2ggLS0tLS0tLS0tLS0+fHw8LS0tIHRzZl9sIC0tPnx8PC1SeFRTRlRpbWUgLT58Ci0gKgotICogVGhlIFJ4VFNGVGltZSBhcmUgdGhlIGxvd2VzdCAxNiBiaXRzIGFuZCBwcm92aWRlZCBieSB0aGUgdWNvZGUuIFRoZQotICogdHNmX2wgaXMgZmlsbGVkIGluIGJ5IGJyY21zX2JfcmVjdiwgd2hpY2ggaXMgZG9uZSBlYXJsaWVyIGluIHRoZQotICogcmVjZWl2ZSBjYWxsIHNlcXVlbmNlIGFmdGVyIHJ4IGludGVycnVwdC4gT25seSB0aGUgaGlnaGVyIDE2IGJpdHMKLSAqIGFyZSB1c2VkLiBGaW5hbGx5LCB0aGUgdHNmX2ggaXMgcmVhZCBmcm9tIHRoZSB0c2YgcmVnaXN0ZXIuCi0gKi8KLXN0YXRpYyB1NjQgYnJjbXNfY19yZWNvdmVyX3RzZjY0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywKLQkJCQkgc3RydWN0IGJyY21zX2QxMXJ4aGRyICpyeGgpCi17Ci0JdTMyIHRzZl9oLCB0c2ZfbDsKLQl1MTYgcnhfdHNmXzBfMTUsIHJ4X3RzZl8xNl8zMTsKLQotCWJyY21zX2JfcmVhZF90c2Yod2xjLT5odywgJnRzZl9sLCAmdHNmX2gpOwotCi0JcnhfdHNmXzE2XzMxID0gKHUxNikodHNmX2wgPj4gMTYpOwotCXJ4X3RzZl8wXzE1ID0gcnhoLT5yeGhkci5SeFRTRlRpbWU7Ci0KLQkvKgotCSAqIGEgZ3JlYXRlciB0c2YgdGltZSBpbmRpY2F0ZXMgdGhlIGxvdyAxNiBiaXRzIG9mCi0JICogdHNmX2wgd3JhcHBlZCwgc28gZGVjcmVtZW50IHRoZSBoaWdoIDE2IGJpdHMuCi0JICovCi0JaWYgKCh1MTYpdHNmX2wgPCByeF90c2ZfMF8xNSkgewotCQlyeF90c2ZfMTZfMzEgLT0gMTsKLQkJaWYgKHJ4X3RzZl8xNl8zMSA9PSAweGZmZmYpCi0JCQl0c2ZfaCAtPSAxOwotCX0KLQotCXJldHVybiAoKHU2NCl0c2ZfaCA8PCAzMikgfCAoKCh1MzIpcnhfdHNmXzE2XzMxIDw8IDE2KSArIHJ4X3RzZl8wXzE1KTsKLX0KLQotc3RhdGljIHZvaWQKLXByZXBfbWFjODAyMTFfc3RhdHVzKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgc3RydWN0IGQxMXJ4aGRyICpyeGgsCi0JCSAgICAgc3RydWN0IHNrX2J1ZmYgKnAsCi0JCSAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXR1cykKLXsKLQlzdHJ1Y3QgYnJjbXNfZDExcnhoZHIgKndsY19yeGggPSAoc3RydWN0IGJyY21zX2QxMXJ4aGRyICopIHJ4aDsKLQlpbnQgcHJlYW1ibGU7Ci0JaW50IGNoYW5uZWw7Ci0JcmF0ZXNwZWNfdCByc3BlYzsKLQl1bnNpZ25lZCBjaGFyICpwbGNwOwotCi0JLyogZmlsbCBpbiBUU0YgYW5kIGZsYWcgaXRzIHByZXNlbmNlICovCi0Jcnhfc3RhdHVzLT5tYWN0aW1lID0gYnJjbXNfY19yZWNvdmVyX3RzZjY0KHdsYywgd2xjX3J4aCk7Ci0Jcnhfc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfTUFDVElNRV9NUERVOwotCi0JY2hhbm5lbCA9IEJSQ01TX0NIQU5fQ0hBTk5FTChyeGgtPlJ4Q2hhbik7Ci0KLQlpZiAoY2hhbm5lbCA+IDE0KSB7Ci0JCXJ4X3N0YXR1cy0+YmFuZCA9IElFRUU4MDIxMV9CQU5EXzVHSFo7Ci0JCXJ4X3N0YXR1cy0+ZnJlcSA9IGllZWU4MDIxMV9vZmRtX2NoYW5fdG9fZnJlcSgKLQkJCQkJV0ZfQ0hBTl9GQUNUT1JfNV9HLzIsIGNoYW5uZWwpOwotCi0JfSBlbHNlIHsKLQkJcnhfc3RhdHVzLT5iYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWjsKLQkJcnhfc3RhdHVzLT5mcmVxID0gaWVlZTgwMjExX2Rzc3NfY2hhbl90b19mcmVxKGNoYW5uZWwpOwotCX0KLQotCXJ4X3N0YXR1cy0+c2lnbmFsID0gd2xjX3J4aC0+cnNzaTsJLyogc2lnbmFsICovCi0KLQkvKiBub2lzZSAqLwotCS8qIHF1YWwgKi8KLQlyeF9zdGF0dXMtPmFudGVubmEgPSAocnhoLT5QaHlSeFN0YXR1c18wICYgUFJYUzBfUlhBTlRfVVBTVUJCQU5EKSA/IDEgOiAwOwkvKiBhbnQgKi8KLQotCXBsY3AgPSBwLT5kYXRhOwotCi0JcnNwZWMgPSBicmNtc19jX2NvbXB1dGVfcnNwZWMocnhoLCBwbGNwKTsKLQlpZiAoSVNfTUNTKHJzcGVjKSkgewotCQlyeF9zdGF0dXMtPnJhdGVfaWR4ID0gcnNwZWMgJiBSU1BFQ19SQVRFX01BU0s7Ci0JCXJ4X3N0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX0hUOwotCQlpZiAoUlNQRUNfSVM0ME1IWihyc3BlYykpCi0JCQlyeF9zdGF0dXMtPmZsYWcgfD0gUlhfRkxBR180ME1IWjsKLQl9IGVsc2UgewotCQlzd2l0Y2ggKFJTUEVDMlJBVEUocnNwZWMpKSB7Ci0JCWNhc2UgQlJDTV9SQVRFXzFNOgotCQkJcnhfc3RhdHVzLT5yYXRlX2lkeCA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBCUkNNX1JBVEVfMk06Ci0JCQlyeF9zdGF0dXMtPnJhdGVfaWR4ID0gMTsKLQkJCWJyZWFrOwotCQljYXNlIEJSQ01fUkFURV81TTU6Ci0JCQlyeF9zdGF0dXMtPnJhdGVfaWR4ID0gMjsKLQkJCWJyZWFrOwotCQljYXNlIEJSQ01fUkFURV8xMU06Ci0JCQlyeF9zdGF0dXMtPnJhdGVfaWR4ID0gMzsKLQkJCWJyZWFrOwotCQljYXNlIEJSQ01fUkFURV82TToKLQkJCXJ4X3N0YXR1cy0+cmF0ZV9pZHggPSA0OwotCQkJYnJlYWs7Ci0JCWNhc2UgQlJDTV9SQVRFXzlNOgotCQkJcnhfc3RhdHVzLT5yYXRlX2lkeCA9IDU7Ci0JCQlicmVhazsKLQkJY2FzZSBCUkNNX1JBVEVfMTJNOgotCQkJcnhfc3RhdHVzLT5yYXRlX2lkeCA9IDY7Ci0JCQlicmVhazsKLQkJY2FzZSBCUkNNX1JBVEVfMThNOgotCQkJcnhfc3RhdHVzLT5yYXRlX2lkeCA9IDc7Ci0JCQlicmVhazsKLQkJY2FzZSBCUkNNX1JBVEVfMjRNOgotCQkJcnhfc3RhdHVzLT5yYXRlX2lkeCA9IDg7Ci0JCQlicmVhazsKLQkJY2FzZSBCUkNNX1JBVEVfMzZNOgotCQkJcnhfc3RhdHVzLT5yYXRlX2lkeCA9IDk7Ci0JCQlicmVhazsKLQkJY2FzZSBCUkNNX1JBVEVfNDhNOgotCQkJcnhfc3RhdHVzLT5yYXRlX2lkeCA9IDEwOwotCQkJYnJlYWs7Ci0JCWNhc2UgQlJDTV9SQVRFXzU0TToKLQkJCXJ4X3N0YXR1cy0+cmF0ZV9pZHggPSAxMTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICIlczogVW5rbm93biByYXRlXG4iLCBfX2Z1bmNfXyk7Ci0JCX0KLQotCQkvKiBEZXRlcm1pbmUgc2hvcnQgcHJlYW1ibGUgYW5kIHJhdGVfaWR4ICovCi0JCXByZWFtYmxlID0gMDsKLQkJaWYgKElTX0NDSyhyc3BlYykpIHsKLQkJCWlmIChyeGgtPlBoeVJ4U3RhdHVzXzAgJiBQUlhTMF9TSE9SVEgpCi0JCQkJcnhfc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfU0hPUlRQUkU7Ci0JCX0gZWxzZSBpZiAoSVNfT0ZETShyc3BlYykpIHsKLQkJCXJ4X3N0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX1NIT1JUUFJFOwotCQl9IGVsc2UgewotCQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICIlczogVW5rbm93biBtb2R1bGF0aW9uXG4iLAotCQkJCSAgX19mdW5jX18pOwotCQl9Ci0JfQotCi0JaWYgKFBMQ1AzX0lTU0dJKHBsY3BbM10pKQotCQlyeF9zdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19TSE9SVF9HSTsKLQotCWlmIChyeGgtPlJ4U3RhdHVzMSAmIFJYU19ERUNFUlIpIHsKLQkJcnhfc3RhdHVzLT5mbGFnIHw9IFJYX0ZMQUdfRkFJTEVEX1BMQ1BfQ1JDOwotCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIiVzOiAgUlhfRkxBR19GQUlMRURfUExDUF9DUkNcbiIsCi0JCQkgIF9fZnVuY19fKTsKLQl9Ci0JaWYgKHJ4aC0+UnhTdGF0dXMxICYgUlhTX0ZDU0VSUikgewotCQlyeF9zdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19GQUlMRURfRkNTX0NSQzsKLQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICIlczogIFJYX0ZMQUdfRkFJTEVEX0ZDU19DUkNcbiIsCi0JCQkgIF9fZnVuY19fKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1icmNtc19jX3JlY3ZjdGwoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBzdHJ1Y3QgZDExcnhoZHIgKnJ4aCwKLQkJc3RydWN0IHNrX2J1ZmYgKnApCi17Ci0JaW50IGxlbl9tcGR1OwotCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzIHJ4X3N0YXR1czsKLQotCW1lbXNldCgmcnhfc3RhdHVzLCAwLCBzaXplb2Yocnhfc3RhdHVzKSk7Ci0JcHJlcF9tYWM4MDIxMV9zdGF0dXMod2xjLCByeGgsIHAsICZyeF9zdGF0dXMpOwotCi0JLyogbWFjIGhlYWRlcitib2R5IGxlbmd0aCwgZXhjbHVkZSBDUkMgYW5kIHBsY3AgaGVhZGVyICovCi0JbGVuX21wZHUgPSBwLT5sZW4gLSBEMTFfUEhZX0hEUl9MRU4gLSBGQ1NfTEVOOwotCXNrYl9wdWxsKHAsIEQxMV9QSFlfSERSX0xFTik7Ci0JX19za2JfdHJpbShwLCBsZW5fbXBkdSk7Ci0KLQltZW1jcHkoSUVFRTgwMjExX1NLQl9SWENCKHApLCAmcnhfc3RhdHVzLCBzaXplb2Yocnhfc3RhdHVzKSk7Ci0JaWVlZTgwMjExX3J4X2lycXNhZmUod2xjLT5wdWItPmllZWVfaHcsIHApOwotCXJldHVybjsKLX0KLQotLyogUHJvY2VzcyByZWNlaXZlZCBmcmFtZXMgKi8KLS8qCi0gKiBSZXR1cm4gdHJ1ZSBpZiBtb3JlIGZyYW1lcyBuZWVkIHRvIGJlIHByb2Nlc3NlZC4gZmFsc2Ugb3RoZXJ3aXNlLgotICogUGFyYW0gJ2JvdW5kJyBpbmRpY2F0ZXMgbWF4LiAjIGZyYW1lcyB0byBwcm9jZXNzIGJlZm9yZSBicmVhayBvdXQuCi0gKi8KLXZvaWQgYnJjbXNfY19yZWN2KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgc3RydWN0IHNrX2J1ZmYgKnApCi17Ci0Jc3RydWN0IGQxMXJ4aGRyICpyeGg7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmg7Ci0JdWludCBsZW47Ci0JYm9vbCBpc19hbXNkdTsKLQotCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjLT5wdWItPnVuaXQpOwotCi0JLyogZnJhbWUgc3RhcnRzIHdpdGggcnhoZHIgKi8KLQlyeGggPSAoc3RydWN0IGQxMXJ4aGRyICopIChwLT5kYXRhKTsKLQotCS8qIHN0cmlwIG9mZiByeGhkciAqLwotCXNrYl9wdWxsKHAsIEJSQ01TX0hXUlhPRkYpOwotCi0JLyogZml4dXAgcnggaGVhZGVyIGVuZGlhbm5lc3MgKi8KLQlyeGgtPlJ4RnJhbWVTaXplID0gbGUxNl90b19jcHUocnhoLT5SeEZyYW1lU2l6ZSk7Ci0JcnhoLT5QaHlSeFN0YXR1c18wID0gbGUxNl90b19jcHUocnhoLT5QaHlSeFN0YXR1c18wKTsKLQlyeGgtPlBoeVJ4U3RhdHVzXzEgPSBsZTE2X3RvX2NwdShyeGgtPlBoeVJ4U3RhdHVzXzEpOwotCXJ4aC0+UGh5UnhTdGF0dXNfMiA9IGxlMTZfdG9fY3B1KHJ4aC0+UGh5UnhTdGF0dXNfMik7Ci0JcnhoLT5QaHlSeFN0YXR1c18zID0gbGUxNl90b19jcHUocnhoLT5QaHlSeFN0YXR1c18zKTsKLQlyeGgtPlBoeVJ4U3RhdHVzXzQgPSBsZTE2X3RvX2NwdShyeGgtPlBoeVJ4U3RhdHVzXzQpOwotCXJ4aC0+UGh5UnhTdGF0dXNfNSA9IGxlMTZfdG9fY3B1KHJ4aC0+UGh5UnhTdGF0dXNfNSk7Ci0JcnhoLT5SeFN0YXR1czEgPSBsZTE2X3RvX2NwdShyeGgtPlJ4U3RhdHVzMSk7Ci0JcnhoLT5SeFN0YXR1czIgPSBsZTE2X3RvX2NwdShyeGgtPlJ4U3RhdHVzMik7Ci0JcnhoLT5SeFRTRlRpbWUgPSBsZTE2X3RvX2NwdShyeGgtPlJ4VFNGVGltZSk7Ci0JcnhoLT5SeENoYW4gPSBsZTE2X3RvX2NwdShyeGgtPlJ4Q2hhbik7Ci0KLQkvKiBNQUMgaW5zZXJ0cyAyIHBhZCBieXRlcyBmb3IgYTQgaGVhZGVycyBvciBRb1Mgb3IgQS1NU0RVIHN1YmZyYW1lcyAqLwotCWlmIChyeGgtPlJ4U3RhdHVzMSAmIFJYU19QQlBSRVMpIHsKLQkJaWYgKHAtPmxlbiA8IDIpIHsKLQkJCXdpcGh5X2Vycih3bGMtPndpcGh5LCAid2wlZDogcmVjdjogcmN2ZCBydW50IG9mICIKLQkJCQkgICJsZW4gJWRcbiIsIHdsYy0+cHViLT51bml0LCBwLT5sZW4pOwotCQkJZ290byB0b3NzOwotCQl9Ci0JCXNrYl9wdWxsKHAsIDIpOwotCX0KLQotCWggPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikocC0+ZGF0YSArIEQxMV9QSFlfSERSX0xFTik7Ci0JbGVuID0gcC0+bGVuOwotCi0JaWYgKHJ4aC0+UnhTdGF0dXMxICYgUlhTX0ZDU0VSUikgewotCQlpZiAod2xjLT5wdWItPm1hYzgwMjExX3N0YXRlICYgTUFDODAyMTFfUFJPTUlTQ19CQ05TKSB7Ci0JCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIkZDU0VSUiB3aGlsZSBzY2FubmluZyoqKioqKiogLSIKLQkJCQkgICIgdG9zc2luZ1xuIik7Ci0JCQlnb3RvIHRvc3M7Ci0JCX0gZWxzZSB7Ci0JCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIlJDU0VSUiEhIVxuIik7Ci0JCQlnb3RvIHRvc3M7Ci0JCX0KLQl9Ci0KLQkvKiBjaGVjayByZWNlaXZlZCBwa3QgaGFzIGF0IGxlYXN0IGZyYW1lIGNvbnRyb2wgZmllbGQgKi8KLQlpZiAobGVuIDwgRDExX1BIWV9IRFJfTEVOICsgc2l6ZW9mKGgtPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCWdvdG8gdG9zczsKLQl9Ci0KLQlpc19hbXNkdSA9IHJ4aC0+UnhTdGF0dXMyICYgUlhTX0FNU0RVX01BU0s7Ci0KLQkvKiBleHBsaWNpdGx5IHRlc3QgYmFkIHNyYyBhZGRyZXNzIHRvIGF2b2lkIHNlbmRpbmcgYmFkIGRlYXV0aCAqLwotCWlmICghaXNfYW1zZHUpIHsKLQkJLyogQ1RTIGFuZCBBQ0sgQ1RMIGZyYW1lcyBhcmUgdy9vIGEyICovCi0KLQkJaWYgKGllZWU4MDIxMV9pc19kYXRhKGgtPmZyYW1lX2NvbnRyb2wpIHx8Ci0JCSAgICBpZWVlODAyMTFfaXNfbWdtdChoLT5mcmFtZV9jb250cm9sKSkgewotCQkJaWYgKChpc196ZXJvX2V0aGVyX2FkZHIoaC0+YWRkcjIpIHx8Ci0JCQkgICAgIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGgtPmFkZHIyKSkpIHsKLQkJCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIndsJWQ6ICVzOiBkcm9wcGluZyBhICIKLQkJCQkJICAiZnJhbWUgd2l0aCBpbnZhbGlkIHNyYyBtYWMgYWRkcmVzcywiCi0JCQkJCSAgIiBhMjogJXBNXG4iLAotCQkJCQkgd2xjLT5wdWItPnVuaXQsIF9fZnVuY19fLCBoLT5hZGRyMik7Ci0JCQkJZ290byB0b3NzOwotCQkJfQotCQl9Ci0JfQotCi0JLyogZHVlIHRvIHNoZWVyIG51bWJlcnMsIHRvc3Mgb3V0IHByb2JlIHJlcXMgZm9yIG5vdyAqLwotCWlmIChpZWVlODAyMTFfaXNfcHJvYmVfcmVxKGgtPmZyYW1lX2NvbnRyb2wpKQotCQlnb3RvIHRvc3M7Ci0KLQlpZiAoaXNfYW1zZHUpCi0JCWdvdG8gdG9zczsKLQotCWJyY21zX2NfcmVjdmN0bCh3bGMsIHJ4aCwgcCk7Ci0JcmV0dXJuOwotCi0gdG9zczoKLQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKHApOwotfQotCi0vKiBjYWxjdWxhdGUgZnJhbWUgZHVyYXRpb24gZm9yIE1peGVkLW1vZGUgTC1TSUcgc3Bvb2ZpbmcsIHJldHVybgotICogbnVtYmVyIG9mIGJ5dGVzIGdvZXMgaW4gdGhlIGxlbmd0aCBmaWVsZAotICoKLSAqIEZvcm11bGEgZ2l2ZW4gYnkgSFQgUEhZIFNwZWMgdiAxLjEzCi0gKiAgIGxlbiA9IDMobnN5bXMgKyBuc3RyZWFtICsgMykgLSAzCi0gKi8KLXUxNgotYnJjbXNfY19jYWxjX2xzaWdfbGVuKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlc3BlYywKLQkJICAgICAgdWludCBtYWNfbGVuKQotewotCXVpbnQgbnN5bXMsIGxlbiA9IDAsIGtOZHBzOwotCi0JQkNNTVNHKHdsYy0+d2lwaHksICJ3bCVkOiByYXRlICVkLCBsZW4lZFxuIiwKLQkJIHdsYy0+cHViLT51bml0LCBSU1BFQzJSQVRFKHJhdGVzcGVjKSwgbWFjX2xlbik7Ci0KLQlpZiAoSVNfTUNTKHJhdGVzcGVjKSkgewotCQl1aW50IG1jcyA9IHJhdGVzcGVjICYgUlNQRUNfUkFURV9NQVNLOwotCQkvKiBNQ1NfVFhTKG1jcykgcmV0dXJucyBudW0gdHggc3RyZWFtcyAtIDEgKi8KLQkJaW50IHRvdF9zdHJlYW1zID0gKE1DU19UWFMobWNzKSArIDEpICsgUlNQRUNfU1RDKHJhdGVzcGVjKTsKLQotCQkvKiB0aGUgcGF5bG9hZCBkdXJhdGlvbiBjYWxjdWxhdGlvbiBtYXRjaGVzIHRoYXQgb2YgcmVndWxhciBvZmRtICovCi0JCS8qIDEwMDBOZGJwcyA9IGticHMgKiA0ICovCi0JCWtOZHBzID0KLQkJICAgIE1DU19SQVRFKG1jcywgUlNQRUNfSVM0ME1IWihyYXRlc3BlYyksCi0JCQkgICAgIFJTUEVDX0lTU0dJKHJhdGVzcGVjKSkgKiA0OwotCi0JCWlmIChSU1BFQ19TVEMocmF0ZXNwZWMpID09IDApCi0JCQkvKiBOU3ltcyA9IENFSUxJTkcoKFNFUlZJQ0UgKyA4Kk5CeXRlcyArIFRBSUwpIC8gTmRicHMpICovCi0JCQluc3ltcyA9Ci0JCQkgICAgQ0VJTCgoQVBIWV9TRVJWSUNFX05CSVRTICsgOCAqIG1hY19sZW4gKwotCQkJCSAgQVBIWV9UQUlMX05CSVRTKSAqIDEwMDAsIGtOZHBzKTsKLQkJZWxzZQotCQkJLyogU1RCQyBuZWVkcyB0byBoYXZlIGV2ZW4gbnVtYmVyIG9mIHN5bWJvbHMgKi8KLQkJCW5zeW1zID0KLQkJCSAgICAyICoKLQkJCSAgICBDRUlMKChBUEhZX1NFUlZJQ0VfTkJJVFMgKyA4ICogbWFjX2xlbiArCi0JCQkJICBBUEhZX1RBSUxfTkJJVFMpICogMTAwMCwgMiAqIGtOZHBzKTsKLQotCQluc3ltcyArPSAodG90X3N0cmVhbXMgKyAzKTsJLyogKCszKSBhY2NvdW50IGZvciBIVC1TSUcoMikgYW5kIEhULVNURigxKSAqLwotCQkvKiAzIGJ5dGVzL3N5bWJvbCBAIGxlZ2FjeSA2TWJwcyByYXRlICovCi0JCWxlbiA9ICgzICogbnN5bXMpIC0gMzsJLyogKC0zKSBleGNsdWRpbmcgc2VydmljZSBiaXRzIGFuZCB0YWlsIGJpdHMgKi8KLQl9Ci0KLQlyZXR1cm4gKHUxNikgbGVuOwotfQotCi0vKiBjYWxjdWxhdGUgZnJhbWUgZHVyYXRpb24gb2YgYSBnaXZlbiByYXRlIGFuZCBsZW5ndGgsIHJldHVybiB0aW1lIGluIHVzZWMgdW5pdCAqLwotdWludAotYnJjbXNfY19jYWxjX2ZyYW1lX3RpbWUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCByYXRlc3BlY190IHJhdGVzcGVjLAotCQkJdTggcHJlYW1ibGVfdHlwZSwgdWludCBtYWNfbGVuKQotewotCXVpbnQgbnN5bXMsIGR1ciA9IDAsIE5kcHMsIGtOZHBzOwotCXVpbnQgcmF0ZSA9IFJTUEVDMlJBVEUocmF0ZXNwZWMpOwotCi0JaWYgKHJhdGUgPT0gMCkgewotCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIndsJWQ6IFdBUjogdXNpbmcgcmF0ZSBvZiAxIG1icHNcbiIsCi0JCQkgIHdsYy0+cHViLT51bml0KTsKLQkJcmF0ZSA9IEJSQ01fUkFURV8xTTsKLQl9Ci0KLQlCQ01NU0cod2xjLT53aXBoeSwgIndsJWQ6IHJzcGVjIDB4JXgsIHByZWFtYmxlX3R5cGUgJWQsIGxlbiVkXG4iLAotCQkgd2xjLT5wdWItPnVuaXQsIHJhdGVzcGVjLCBwcmVhbWJsZV90eXBlLCBtYWNfbGVuKTsKLQotCWlmIChJU19NQ1MocmF0ZXNwZWMpKSB7Ci0JCXVpbnQgbWNzID0gcmF0ZXNwZWMgJiBSU1BFQ19SQVRFX01BU0s7Ci0JCWludCB0b3Rfc3RyZWFtcyA9IE1DU19UWFMobWNzKSArIFJTUEVDX1NUQyhyYXRlc3BlYyk7Ci0KLQkJZHVyID0gUFJFTl9QUkVBTUJMRSArICh0b3Rfc3RyZWFtcyAqIFBSRU5fUFJFQU1CTEVfRVhUKTsKLQkJaWYgKHByZWFtYmxlX3R5cGUgPT0gQlJDTVNfTU1fUFJFQU1CTEUpCi0JCQlkdXIgKz0gUFJFTl9NTV9FWFQ7Ci0JCS8qIDEwMDBOZGJwcyA9IGticHMgKiA0ICovCi0JCWtOZHBzID0KLQkJICAgIE1DU19SQVRFKG1jcywgUlNQRUNfSVM0ME1IWihyYXRlc3BlYyksCi0JCQkgICAgIFJTUEVDX0lTU0dJKHJhdGVzcGVjKSkgKiA0OwotCi0JCWlmIChSU1BFQ19TVEMocmF0ZXNwZWMpID09IDApCi0JCQkvKiBOU3ltcyA9IENFSUxJTkcoKFNFUlZJQ0UgKyA4Kk5CeXRlcyArIFRBSUwpIC8gTmRicHMpICovCi0JCQluc3ltcyA9Ci0JCQkgICAgQ0VJTCgoQVBIWV9TRVJWSUNFX05CSVRTICsgOCAqIG1hY19sZW4gKwotCQkJCSAgQVBIWV9UQUlMX05CSVRTKSAqIDEwMDAsIGtOZHBzKTsKLQkJZWxzZQotCQkJLyogU1RCQyBuZWVkcyB0byBoYXZlIGV2ZW4gbnVtYmVyIG9mIHN5bWJvbHMgKi8KLQkJCW5zeW1zID0KLQkJCSAgICAyICoKLQkJCSAgICBDRUlMKChBUEhZX1NFUlZJQ0VfTkJJVFMgKyA4ICogbWFjX2xlbiArCi0JCQkJICBBUEhZX1RBSUxfTkJJVFMpICogMTAwMCwgMiAqIGtOZHBzKTsKLQotCQlkdXIgKz0gQVBIWV9TWU1CT0xfVElNRSAqIG5zeW1zOwotCQlpZiAoQkFORF8yRyh3bGMtPmJhbmQtPmJhbmR0eXBlKSkKLQkJCWR1ciArPSBET1QxMV9PRkRNX1NJR05BTF9FWFRFTlNJT047Ci0JfSBlbHNlIGlmIChJU19PRkRNKHJhdGUpKSB7Ci0JCWR1ciA9IEFQSFlfUFJFQU1CTEVfVElNRTsKLQkJZHVyICs9IEFQSFlfU0lHTkFMX1RJTUU7Ci0JCS8qIE5kYnBzID0gTWJwcyAqIDQgPSByYXRlKDUwMEticHMpICogMiAqLwotCQlOZHBzID0gcmF0ZSAqIDI7Ci0JCS8qIE5TeW1zID0gQ0VJTElORygoU0VSVklDRSArIDgqTkJ5dGVzICsgVEFJTCkgLyBOZGJwcykgKi8KLQkJbnN5bXMgPQotCQkgICAgQ0VJTCgoQVBIWV9TRVJWSUNFX05CSVRTICsgOCAqIG1hY19sZW4gKyBBUEhZX1RBSUxfTkJJVFMpLAotCQkJIE5kcHMpOwotCQlkdXIgKz0gQVBIWV9TWU1CT0xfVElNRSAqIG5zeW1zOwotCQlpZiAoQkFORF8yRyh3bGMtPmJhbmQtPmJhbmR0eXBlKSkKLQkJCWR1ciArPSBET1QxMV9PRkRNX1NJR05BTF9FWFRFTlNJT047Ci0JfSBlbHNlIHsKLQkJLyogY2FsYyAjIGJpdHMgKiAyIHNvIGZhY3RvciBvZiAyIGluIHJhdGUgKDEvMiBtYnBzKSB3aWxsIGRpdmlkZSBvdXQgKi8KLQkJbWFjX2xlbiA9IG1hY19sZW4gKiA4ICogMjsKLQkJLyogY2FsYyBjZWlsaW5nIG9mIGJpdHMvcmF0ZSA9IG1pY3Jvc2Vjb25kcyBvZiBhaXIgdGltZSAqLwotCQlkdXIgPSAobWFjX2xlbiArIHJhdGUgLSAxKSAvIHJhdGU7Ci0JCWlmIChwcmVhbWJsZV90eXBlICYgQlJDTVNfU0hPUlRfUFJFQU1CTEUpCi0JCQlkdXIgKz0gQlBIWV9QTENQX1NIT1JUX1RJTUU7Ci0JCWVsc2UKLQkJCWR1ciArPSBCUEhZX1BMQ1BfVElNRTsKLQl9Ci0JcmV0dXJuIGR1cjsKLX0KLQotLyogVGhlIG9wcG9zaXRlIG9mIGJyY21zX2NfY2FsY19mcmFtZV90aW1lICovCi1zdGF0aWMgdWludAotYnJjbXNfY19jYWxjX2ZyYW1lX2xlbihzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcmF0ZXNwZWMsCi0JCSAgIHU4IHByZWFtYmxlX3R5cGUsIHVpbnQgZHVyKQotewotCXVpbnQgbnN5bXMsIG1hY19sZW4sIE5kcHMsIGtOZHBzOwotCXVpbnQgcmF0ZSA9IFJTUEVDMlJBVEUocmF0ZXNwZWMpOwotCi0JQkNNTVNHKHdsYy0+d2lwaHksICJ3bCVkOiByc3BlYyAweCV4LCBwcmVhbWJsZV90eXBlICVkLCBkdXIgJWRcbiIsCi0JCSB3bGMtPnB1Yi0+dW5pdCwgcmF0ZXNwZWMsIHByZWFtYmxlX3R5cGUsIGR1cik7Ci0KLQlpZiAoSVNfTUNTKHJhdGVzcGVjKSkgewotCQl1aW50IG1jcyA9IHJhdGVzcGVjICYgUlNQRUNfUkFURV9NQVNLOwotCQlpbnQgdG90X3N0cmVhbXMgPSBNQ1NfVFhTKG1jcykgKyBSU1BFQ19TVEMocmF0ZXNwZWMpOwotCQlkdXIgLT0gUFJFTl9QUkVBTUJMRSArICh0b3Rfc3RyZWFtcyAqIFBSRU5fUFJFQU1CTEVfRVhUKTsKLQkJLyogcGF5bG9hZCBjYWxjdWxhdGlvbiBtYXRjaGVzIHRoYXQgb2YgcmVndWxhciBvZmRtICovCi0JCWlmIChCQU5EXzJHKHdsYy0+YmFuZC0+YmFuZHR5cGUpKQotCQkJZHVyIC09IERPVDExX09GRE1fU0lHTkFMX0VYVEVOU0lPTjsKLQkJLyoga05kYnBzID0ga2JwcyAqIDQgKi8KLQkJa05kcHMgPQotCQkgICAgTUNTX1JBVEUobWNzLCBSU1BFQ19JUzQwTUhaKHJhdGVzcGVjKSwKLQkJCSAgICAgUlNQRUNfSVNTR0kocmF0ZXNwZWMpKSAqIDQ7Ci0JCW5zeW1zID0gZHVyIC8gQVBIWV9TWU1CT0xfVElNRTsKLQkJbWFjX2xlbiA9Ci0JCSAgICAoKG5zeW1zICoga05kcHMpIC0KLQkJICAgICAoKEFQSFlfU0VSVklDRV9OQklUUyArIEFQSFlfVEFJTF9OQklUUykgKiAxMDAwKSkgLyA4MDAwOwotCX0gZWxzZSBpZiAoSVNfT0ZETShyYXRlc3BlYykpIHsKLQkJZHVyIC09IEFQSFlfUFJFQU1CTEVfVElNRTsKLQkJZHVyIC09IEFQSFlfU0lHTkFMX1RJTUU7Ci0JCS8qIE5kYnBzID0gTWJwcyAqIDQgPSByYXRlKDUwMEticHMpICogMiAqLwotCQlOZHBzID0gcmF0ZSAqIDI7Ci0JCW5zeW1zID0gZHVyIC8gQVBIWV9TWU1CT0xfVElNRTsKLQkJbWFjX2xlbiA9Ci0JCSAgICAoKG5zeW1zICogTmRwcykgLQotCQkgICAgIChBUEhZX1NFUlZJQ0VfTkJJVFMgKyBBUEhZX1RBSUxfTkJJVFMpKSAvIDg7Ci0JfSBlbHNlIHsKLQkJaWYgKHByZWFtYmxlX3R5cGUgJiBCUkNNU19TSE9SVF9QUkVBTUJMRSkKLQkJCWR1ciAtPSBCUEhZX1BMQ1BfU0hPUlRfVElNRTsKLQkJZWxzZQotCQkJZHVyIC09IEJQSFlfUExDUF9USU1FOwotCQltYWNfbGVuID0gZHVyICogcmF0ZTsKLQkJLyogZGl2aWRlIG91dCBmYWN0b3Igb2YgMiBpbiByYXRlICgxLzIgbWJwcykgKi8KLQkJbWFjX2xlbiA9IG1hY19sZW4gLyA4IC8gMjsKLQl9Ci0JcmV0dXJuIG1hY19sZW47Ci19Ci0KLXN0YXRpYyB1aW50Ci1icmNtc19jX2NhbGNfYmFfdGltZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMsCi0JCSAgICAgdTggcHJlYW1ibGVfdHlwZSkKLXsKLQlCQ01NU0cod2xjLT53aXBoeSwgIndsJWQ6IHJzcGVjIDB4JXgsICIKLQkJICJwcmVhbWJsZV90eXBlICVkXG4iLCB3bGMtPnB1Yi0+dW5pdCwgcnNwZWMsIHByZWFtYmxlX3R5cGUpOwotCS8qIFNwZWMgOS42OiBhY2sgcmF0ZSBpcyB0aGUgaGlnaGVzdCByYXRlIGluIEJTU0Jhc2ljUmF0ZVNldCB0aGF0IGlzIGxlc3MgdGhhbgotCSAqIG9yIGVxdWFsIHRvIHRoZSByYXRlIG9mIHRoZSBpbW1lZGlhdGVseSBwcmV2aW91cyBmcmFtZSBpbiB0aGUgRkVTCi0JICovCi0JcnNwZWMgPSBCUkNNU19CQVNJQ19SQVRFKHdsYywgcnNwZWMpOwotCS8qIEJBIGxlbiA9PSAzMiA9PSAxNihjdGwgaGRyKSArIDQoYmEgbGVuKSArIDgoYml0bWFwKSArIDQoZmNzKSAqLwotCXJldHVybiBicmNtc19jX2NhbGNfZnJhbWVfdGltZSh3bGMsIHJzcGVjLCBwcmVhbWJsZV90eXBlLAotCQkJCSAgIChET1QxMV9CQV9MRU4gKyBET1QxMV9CQV9CSVRNQVBfTEVOICsKLQkJCQkgICAgRkNTX0xFTikpOwotfQotCi1zdGF0aWMgdWludAotYnJjbXNfY19jYWxjX2Fja190aW1lKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYywKLQkJICAgICAgdTggcHJlYW1ibGVfdHlwZSkKLXsKLQl1aW50IGR1ciA9IDA7Ci0KLQlCQ01NU0cod2xjLT53aXBoeSwgIndsJWQ6IHJzcGVjIDB4JXgsIHByZWFtYmxlX3R5cGUgJWRcbiIsCi0JCXdsYy0+cHViLT51bml0LCByc3BlYywgcHJlYW1ibGVfdHlwZSk7Ci0JLyogU3BlYyA5LjY6IGFjayByYXRlIGlzIHRoZSBoaWdoZXN0IHJhdGUgaW4gQlNTQmFzaWNSYXRlU2V0IHRoYXQgaXMgbGVzcyB0aGFuCi0JICogb3IgZXF1YWwgdG8gdGhlIHJhdGUgb2YgdGhlIGltbWVkaWF0ZWx5IHByZXZpb3VzIGZyYW1lIGluIHRoZSBGRVMKLQkgKi8KLQlyc3BlYyA9IEJSQ01TX0JBU0lDX1JBVEUod2xjLCByc3BlYyk7Ci0JLyogQUNLIGZyYW1lIGxlbiA9PSAxNCA9PSAyKGZjKSArIDIoZHVyKSArIDYocmEpICsgNChmY3MpICovCi0JZHVyID0KLQkgICAgYnJjbXNfY19jYWxjX2ZyYW1lX3RpbWUod2xjLCByc3BlYywgcHJlYW1ibGVfdHlwZSwKLQkJCQkoRE9UMTFfQUNLX0xFTiArIEZDU19MRU4pKTsKLQlyZXR1cm4gZHVyOwotfQotCi1zdGF0aWMgdWludAotYnJjbXNfY19jYWxjX2N0c190aW1lKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYywKLQkJICAgICAgdTggcHJlYW1ibGVfdHlwZSkKLXsKLQlCQ01NU0cod2xjLT53aXBoeSwgIndsJWQ6IHJhdGVzcGVjIDB4JXgsIHByZWFtYmxlX3R5cGUgJWRcbiIsCi0JCXdsYy0+cHViLT51bml0LCByc3BlYywgcHJlYW1ibGVfdHlwZSk7Ci0JcmV0dXJuIGJyY21zX2NfY2FsY19hY2tfdGltZSh3bGMsIHJzcGVjLCBwcmVhbWJsZV90eXBlKTsKLX0KLQotLyogZGVyaXZlIHdsYy0+YmFuZC0+YmFzaWNfcmF0ZVtdIHRhYmxlIGZyb20gJ3JhdGVzZXQnICovCi12b2lkIGJyY21zX2NfcmF0ZV9sb29rdXBfaW5pdChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHdsY19yYXRlc2V0X3QgKnJhdGVzZXQpCi17Ci0JdTggcmF0ZTsKLQl1OCBtYW5kYXRvcnk7Ci0JdTggY2NrX2Jhc2ljID0gMDsKLQl1OCBvZmRtX2Jhc2ljID0gMDsKLQl1OCAqYnIgPSB3bGMtPmJhbmQtPmJhc2ljX3JhdGU7Ci0JdWludCBpOwotCi0JLyogaW5jb21pbmcgcmF0ZXMgYXJlIGluIDUwMGticHMgdW5pdHMgYXMgaW4gODAyLjExIFN1cHBvcnRlZCBSYXRlcyAqLwotCW1lbXNldChiciwgMCwgQlJDTV9NQVhSQVRFICsgMSk7Ci0KLQkvKiBGb3IgZWFjaCBiYXNpYyByYXRlIGluIHRoZSByYXRlcyBsaXN0LCBtYWtlIGFuIGVudHJ5IGluIHRoZQotCSAqIGJlc3QgYmFzaWMgbG9va3VwLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCByYXRlc2V0LT5jb3VudDsgaSsrKSB7Ci0JCS8qIG9ubHkgbWFrZSBhbiBlbnRyeSBmb3IgYSBiYXNpYyByYXRlICovCi0JCWlmICghKHJhdGVzZXQtPnJhdGVzW2ldICYgQlJDTVNfUkFURV9GTEFHKSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIG1hc2sgb2ZmIGJhc2ljIGJpdCAqLwotCQlyYXRlID0gKHJhdGVzZXQtPnJhdGVzW2ldICYgQlJDTVNfUkFURV9NQVNLKTsKLQotCQlpZiAocmF0ZSA+IEJSQ01fTUFYUkFURSkgewotCQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICJicmNtc19jX3JhdGVfbG9va3VwX2luaXQ6ICIKLQkJCQkgICJpbnZhbGlkIHJhdGUgMHglWCBpbiByYXRlIHNldFxuIiwKLQkJCQkgIHJhdGVzZXQtPnJhdGVzW2ldKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJYnJbcmF0ZV0gPSByYXRlOwotCX0KLQotCS8qIFRoZSByYXRlIGxvb2t1cCB0YWJsZSBub3cgaGFzIG5vbi16ZXJvIGVudHJpZXMgZm9yIGVhY2gKLQkgKiBiYXNpYyByYXRlLCBlcXVhbCB0byB0aGUgYmFzaWMgcmF0ZTogYnJbYmFzaWNOXSA9IGJhc2ljTgotCSAqCi0JICogVG8gbG9vayB1cCB0aGUgYmVzdCBiYXNpYyByYXRlIGNvcnJlc3BvbmRpbmcgdG8gYW55Ci0JICogcGFydGljdWxhciByYXRlLCBjb2RlIGNhbiB1c2UgdGhlIGJhc2ljX3JhdGUgdGFibGUKLQkgKiBsaWtlIHRoaXMKLQkgKgotCSAqIGJhc2ljX3JhdGUgPSB3bGMtPmJhbmQtPmJhc2ljX3JhdGVbdHhfcmF0ZV0KLQkgKgotCSAqIE1ha2Ugc3VyZSB0aGVyZSBpcyBhIGJlc3QgYmFzaWMgcmF0ZSBlbnRyeSBmb3IKLQkgKiBldmVyeSByYXRlIGJ5IHdhbGtpbmcgdXAgdGhlIHRhYmxlIGZyb20gbG93IHJhdGVzCi0JICogdG8gaGlnaCwgZmlsbGluZyBpbiBob2xlcyBpbiB0aGUgbG9va3VwIHRhYmxlCi0JICovCi0KLQlmb3IgKGkgPSAwOyBpIDwgd2xjLT5iYW5kLT5od19yYXRlc2V0LmNvdW50OyBpKyspIHsKLQkJcmF0ZSA9IHdsYy0+YmFuZC0+aHdfcmF0ZXNldC5yYXRlc1tpXTsKLQotCQlpZiAoYnJbcmF0ZV0gIT0gMCkgewotCQkJLyogVGhpcyByYXRlIGlzIGEgYmFzaWMgcmF0ZS4KLQkJCSAqIEtlZXAgdHJhY2sgb2YgdGhlIGJlc3QgYmFzaWMgcmF0ZSBzbyBmYXIgYnkKLQkJCSAqIG1vZHVsYXRpb24gdHlwZS4KLQkJCSAqLwotCQkJaWYgKElTX09GRE0ocmF0ZSkpCi0JCQkJb2ZkbV9iYXNpYyA9IHJhdGU7Ci0JCQllbHNlCi0JCQkJY2NrX2Jhc2ljID0gcmF0ZTsKLQotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBUaGlzIHJhdGUgaXMgbm90IGEgYmFzaWMgcmF0ZSBzbyBmaWd1cmUgb3V0IHRoZQotCQkgKiBiZXN0IGJhc2ljIHJhdGUgbGVzcyB0aGFuIHRoaXMgcmF0ZSBhbmQgZmlsbCBpbgotCQkgKiB0aGUgaG9sZSBpbiB0aGUgdGFibGUKLQkJICovCi0KLQkJYnJbcmF0ZV0gPSBJU19PRkRNKHJhdGUpID8gb2ZkbV9iYXNpYyA6IGNja19iYXNpYzsKLQotCQlpZiAoYnJbcmF0ZV0gIT0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChJU19PRkRNKHJhdGUpKSB7Ci0JCQkvKiBJbiAxMWcgYW5kIDExYSwgdGhlIE9GRE0gbWFuZGF0b3J5IHJhdGVzIGFyZSA2LCAxMiwgYW5kIDI0IE1icHMgKi8KLQkJCWlmIChyYXRlID49IEJSQ01fUkFURV8yNE0pCi0JCQkJbWFuZGF0b3J5ID0gQlJDTV9SQVRFXzI0TTsKLQkJCWVsc2UgaWYgKHJhdGUgPj0gQlJDTV9SQVRFXzEyTSkKLQkJCQltYW5kYXRvcnkgPSBCUkNNX1JBVEVfMTJNOwotCQkJZWxzZQotCQkJCW1hbmRhdG9yeSA9IEJSQ01fUkFURV82TTsKLQkJfSBlbHNlIHsKLQkJCS8qIEluIDExYiwgYWxsIHRoZSBDQ0sgcmF0ZXMgYXJlIG1hbmRhdG9yeSAxIC0gMTEgTWJwcyAqLwotCQkJbWFuZGF0b3J5ID0gcmF0ZTsKLQkJfQotCi0JCWJyW3JhdGVdID0gbWFuZGF0b3J5OwotCX0KLX0KLQotc3RhdGljIHZvaWQgYnJjbXNfY193cml0ZV9yYXRlX3NobShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHU4IHJhdGUsCi0JCQkJICAgdTggYmFzaWNfcmF0ZSkKLXsKLQl1OCBwaHlfcmF0ZSwgaW5kZXg7Ci0JdTggYmFzaWNfcGh5X3JhdGUsIGJhc2ljX2luZGV4OwotCXUxNiBkaXJfdGFibGUsIGJhc2ljX3RhYmxlOwotCXUxNiBiYXNpY19wdHI7Ci0KLQkvKiBTaGFyZWQgbWVtb3J5IGFkZHJlc3MgZm9yIHRoZSB0YWJsZSB3ZSBhcmUgcmVhZGluZyAqLwotCWRpcl90YWJsZSA9IElTX09GRE0oYmFzaWNfcmF0ZSkgPyBNX1JUX0RJUk1BUF9BIDogTV9SVF9ESVJNQVBfQjsKLQotCS8qIFNoYXJlZCBtZW1vcnkgYWRkcmVzcyBmb3IgdGhlIHRhYmxlIHdlIGFyZSB3cml0aW5nICovCi0JYmFzaWNfdGFibGUgPSBJU19PRkRNKHJhdGUpID8gTV9SVF9CQlJTTUFQX0EgOiBNX1JUX0JCUlNNQVBfQjsKLQotCS8qCi0JICogZm9yIGEgZ2l2ZW4gcmF0ZSwgdGhlIExTLW5pYmJsZSBvZiB0aGUgUExDUCBTSUdOQUwgZmllbGQgaXMKLQkgKiB0aGUgaW5kZXggaW50byB0aGUgcmF0ZSB0YWJsZS4KLQkgKi8KLQlwaHlfcmF0ZSA9IHJhdGVfaW5mb1tyYXRlXSAmIEJSQ01TX1JBVEVfTUFTSzsKLQliYXNpY19waHlfcmF0ZSA9IHJhdGVfaW5mb1tiYXNpY19yYXRlXSAmIEJSQ01TX1JBVEVfTUFTSzsKLQlpbmRleCA9IHBoeV9yYXRlICYgMHhmOwotCWJhc2ljX2luZGV4ID0gYmFzaWNfcGh5X3JhdGUgJiAweGY7Ci0KLQkvKiBGaW5kIHRoZSBTSE0gcG9pbnRlciB0byB0aGUgQUNLIHJhdGUgZW50cnkgYnkgbG9va2luZyBpbiB0aGUKLQkgKiBEaXJlY3QtbWFwIFRhYmxlCi0JICovCi0JYmFzaWNfcHRyID0gYnJjbXNfY19yZWFkX3NobSh3bGMsIChkaXJfdGFibGUgKyBiYXNpY19pbmRleCAqIDIpKTsKLQotCS8qIFVwZGF0ZSB0aGUgU0hNIEJTUy1iYXNpYy1yYXRlLXNldCBtYXBwaW5nIHRhYmxlIHdpdGggdGhlIHBvaW50ZXIKLQkgKiB0byB0aGUgY29ycmVjdCBiYXNpYyByYXRlIGZvciB0aGUgZ2l2ZW4gaW5jb21pbmcgcmF0ZQotCSAqLwotCWJyY21zX2Nfd3JpdGVfc2htKHdsYywgKGJhc2ljX3RhYmxlICsgaW5kZXggKiAyKSwgYmFzaWNfcHRyKTsKLX0KLQotc3RhdGljIGNvbnN0IHdsY19yYXRlc2V0X3QgKmJyY21zX2NfcmF0ZXNldF9nZXRfaHdycyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0JY29uc3Qgd2xjX3JhdGVzZXRfdCAqcnNfZGZsdDsKLQotCWlmIChCUkNNU19QSFlfMTFOX0NBUCh3bGMtPmJhbmQpKSB7Ci0JCWlmIChCQU5EXzVHKHdsYy0+YmFuZC0+YmFuZHR5cGUpKQotCQkJcnNfZGZsdCA9ICZvZmRtX21pbW9fcmF0ZXM7Ci0JCWVsc2UKLQkJCXJzX2RmbHQgPSAmY2NrX29mZG1fbWltb19yYXRlczsKLQl9IGVsc2UgaWYgKHdsYy0+YmFuZC0+Z21vZGUpCi0JCXJzX2RmbHQgPSAmY2NrX29mZG1fcmF0ZXM7Ci0JZWxzZQotCQlyc19kZmx0ID0gJmNja19yYXRlczsKLQotCXJldHVybiByc19kZmx0OwotfQotCi12b2lkIGJyY21zX2Nfc2V0X3JhdGV0YWJsZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0JY29uc3Qgd2xjX3JhdGVzZXRfdCAqcnNfZGZsdDsKLQl3bGNfcmF0ZXNldF90IHJzOwotCXU4IHJhdGUsIGJhc2ljX3JhdGU7Ci0JdWludCBpOwotCi0JcnNfZGZsdCA9IGJyY21zX2NfcmF0ZXNldF9nZXRfaHdycyh3bGMpOwotCi0JYnJjbXNfY19yYXRlc2V0X2NvcHkocnNfZGZsdCwgJnJzKTsKLQlicmNtc19jX3JhdGVzZXRfbWNzX3VwZCgmcnMsIHdsYy0+c3RmLT50eHN0cmVhbXMpOwotCi0JLyogd2FsayB0aGUgcGh5IHJhdGUgdGFibGUgYW5kIHVwZGF0ZSBTSE0gYmFzaWMgcmF0ZSBsb29rdXAgdGFibGUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcnMuY291bnQ7IGkrKykgewotCQlyYXRlID0gcnMucmF0ZXNbaV0gJiBCUkNNU19SQVRFX01BU0s7Ci0KLQkJLyogZm9yIGEgZ2l2ZW4gcmF0ZSBCUkNNU19CQVNJQ19SQVRFIHJldHVybnMgdGhlIHJhdGUgYXQKLQkJICogd2hpY2ggYSByZXNwb25zZSBBQ0svQ1RTIHNob3VsZCBiZSBzZW50LgotCQkgKi8KLQkJYmFzaWNfcmF0ZSA9IEJSQ01TX0JBU0lDX1JBVEUod2xjLCByYXRlKTsKLQkJaWYgKGJhc2ljX3JhdGUgPT0gMCkgewotCQkJLyogVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYgd2UgYXJlIHVzaW5nIGEKLQkJCSAqIHJlc3RyaWN0ZWQgcmF0ZXNldC4KLQkJCSAqLwotCQkJYmFzaWNfcmF0ZSA9IHJzLnJhdGVzWzBdICYgQlJDTVNfUkFURV9NQVNLOwotCQl9Ci0KLQkJYnJjbXNfY193cml0ZV9yYXRlX3NobSh3bGMsIHJhdGUsIGJhc2ljX3JhdGUpOwotCX0KLX0KLQotLyoKLSAqIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcmF0ZSBpcyBzdXBwb3J0ZWQgYnkgdGhlIHNwZWNpZmllZCBiYW5kLgotICogQlJDTV9CQU5EX0FVVE8gaW5kaWNhdGVzIHRoZSBjdXJyZW50IGJhbmQuCi0gKi8KLWJvb2wgYnJjbXNfY192YWxpZF9yYXRlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYywgaW50IGJhbmQsCi0JCSAgICBib29sIHZlcmJvc2UpCi17Ci0Jd2xjX3JhdGVzZXRfdCAqaHdfcmF0ZXNldDsKLQl1aW50IGk7Ci0KLQlpZiAoKGJhbmQgPT0gQlJDTV9CQU5EX0FVVE8pIHx8IChiYW5kID09IHdsYy0+YmFuZC0+YmFuZHR5cGUpKSB7Ci0JCWh3X3JhdGVzZXQgPSAmd2xjLT5iYW5kLT5od19yYXRlc2V0OwotCX0gZWxzZSBpZiAoTkJBTkRTKHdsYykgPiAxKSB7Ci0JCWh3X3JhdGVzZXQgPSAmd2xjLT5iYW5kc3RhdGVbT1RIRVJCQU5EVU5JVCh3bGMpXS0+aHdfcmF0ZXNldDsKLQl9IGVsc2UgewotCQkvKiBvdGhlciBiYW5kIHNwZWNpZmllZCBhbmQgd2UgYXJlIGEgc2luZ2xlIGJhbmQgZGV2aWNlICovCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiBjaGVjayBpZiB0aGlzIGlzIGEgbWltbyByYXRlICovCi0JaWYgKElTX01DUyhyc3BlYykpIHsKLQkJaWYgKCFWQUxJRF9NQ1MoKHJzcGVjICYgUlNQRUNfUkFURV9NQVNLKSkpCi0JCQlnb3RvIGVycm9yOwotCi0JCXJldHVybiBpc3NldChod19yYXRlc2V0LT5tY3MsIChyc3BlYyAmIFJTUEVDX1JBVEVfTUFTSykpOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBod19yYXRlc2V0LT5jb3VudDsgaSsrKQotCQlpZiAoaHdfcmF0ZXNldC0+cmF0ZXNbaV0gPT0gUlNQRUMyUkFURShyc3BlYykpCi0JCQlyZXR1cm4gdHJ1ZTsKLSBlcnJvcjoKLQlpZiAodmVyYm9zZSkgewotCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIndsJWQ6IHZhbGlkX3JhdGU6IHJhdGUgc3BlYyAweCV4ICIKLQkJCSAgIm5vdCBpbiBod19yYXRlc2V0XG4iLCB3bGMtPnB1Yi0+dW5pdCwgcnNwZWMpOwotCX0KLQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgYnJjbXNfY191cGRhdGVfbWltb19iYW5kX2J3Y2FwKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdTggYndjYXApCi17Ci0JdWludCBpOwotCXN0cnVjdCBicmNtc19iYW5kICpiYW5kOwotCi0JZm9yIChpID0gMDsgaSA8IE5CQU5EUyh3bGMpOyBpKyspIHsKLQkJaWYgKElTX1NJTkdMRUJBTkRfNUcod2xjLT5kZXZpY2VpZCkpCi0JCQlpID0gQkFORF81R19JTkRFWDsKLQkJYmFuZCA9IHdsYy0+YmFuZHN0YXRlW2ldOwotCQlpZiAoYmFuZC0+YmFuZHR5cGUgPT0gQlJDTV9CQU5EXzVHKSB7Ci0JCQlpZiAoKGJ3Y2FwID09IEJSQ01TX05fQldfNDBBTEwpCi0JCQkgICAgfHwgKGJ3Y2FwID09IEJSQ01TX05fQldfMjBJTjJHXzQwSU41RykpCi0JCQkJYmFuZC0+bWltb19jYXBfNDAgPSB0cnVlOwotCQkJZWxzZQotCQkJCWJhbmQtPm1pbW9fY2FwXzQwID0gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoYndjYXAgPT0gQlJDTVNfTl9CV180MEFMTCkKLQkJCQliYW5kLT5taW1vX2NhcF80MCA9IHRydWU7Ci0JCQllbHNlCi0JCQkJYmFuZC0+bWltb19jYXBfNDAgPSBmYWxzZTsKLQkJfQotCX0KLX0KLQotdm9pZCBicmNtc19jX21vZF9wcmJfcnNwX3JhdGVfdGFibGUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB1aW50IGZyYW1lX2xlbikKLXsKLQljb25zdCB3bGNfcmF0ZXNldF90ICpyc19kZmx0OwotCXdsY19yYXRlc2V0X3QgcnM7Ci0JdTggcmF0ZTsKLQl1MTYgZW50cnlfcHRyOwotCXU4IHBsY3BbRDExX1BIWV9IRFJfTEVOXTsKLQl1MTYgZHVyLCBzaWZzOwotCXVpbnQgaTsKLQotCXNpZnMgPSBTSUZTKHdsYy0+YmFuZCk7Ci0KLQlyc19kZmx0ID0gYnJjbXNfY19yYXRlc2V0X2dldF9od3JzKHdsYyk7Ci0KLQlicmNtc19jX3JhdGVzZXRfY29weShyc19kZmx0LCAmcnMpOwotCWJyY21zX2NfcmF0ZXNldF9tY3NfdXBkKCZycywgd2xjLT5zdGYtPnR4c3RyZWFtcyk7Ci0KLQkvKiB3YWxrIHRoZSBwaHkgcmF0ZSB0YWJsZSBhbmQgdXBkYXRlIE1BQyBjb3JlIFNITSBiYXNpYyByYXRlIHRhYmxlIGVudHJpZXMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcnMuY291bnQ7IGkrKykgewotCQlyYXRlID0gcnMucmF0ZXNbaV0gJiBCUkNNU19SQVRFX01BU0s7Ci0KLQkJZW50cnlfcHRyID0gYnJjbXNfY19yYXRlX3NobV9vZmZzZXQod2xjLCByYXRlKTsKLQotCQkvKiBDYWxjdWxhdGUgdGhlIFByb2JlIFJlc3BvbnNlIFBMQ1AgZm9yIHRoZSBnaXZlbiByYXRlICovCi0JCWJyY21zX2NfY29tcHV0ZV9wbGNwKHdsYywgcmF0ZSwgZnJhbWVfbGVuLCBwbGNwKTsKLQotCQkvKiBDYWxjdWxhdGUgdGhlIGR1cmF0aW9uIG9mIHRoZSBQcm9iZSBSZXNwb25zZSBmcmFtZSBwbHVzIFNJRlMgZm9yIHRoZSBNQUMgKi8KLQkJZHVyID0gKHUxNikgYnJjbXNfY19jYWxjX2ZyYW1lX3RpbWUod2xjLCByYXRlLAotCQkJCQkJQlJDTVNfTE9OR19QUkVBTUJMRSwgZnJhbWVfbGVuKTsKLQkJZHVyICs9IHNpZnM7Ci0KLQkJLyogVXBkYXRlIHRoZSBTSE0gUmF0ZSBUYWJsZSBlbnRyeSBQcm9iZSBSZXNwb25zZSB2YWx1ZXMgKi8KLQkJYnJjbXNfY193cml0ZV9zaG0od2xjLCBlbnRyeV9wdHIgKyBNX1JUX1BSU19QTENQX1BPUywKLQkJCSAgICAgICh1MTYpIChwbGNwWzBdICsgKHBsY3BbMV0gPDwgOCkpKTsKLQkJYnJjbXNfY193cml0ZV9zaG0od2xjLCBlbnRyeV9wdHIgKyBNX1JUX1BSU19QTENQX1BPUyArIDIsCi0JCQkgICAgICAodTE2KSAocGxjcFsyXSArIChwbGNwWzNdIDw8IDgpKSk7Ci0JCWJyY21zX2Nfd3JpdGVfc2htKHdsYywgZW50cnlfcHRyICsgTV9SVF9QUlNfRFVSX1BPUywgZHVyKTsKLQl9Ci19Ci0KLS8qCU1heCBidWZmZXJpbmcgbmVlZGVkIGZvciBiZWFjb24gdGVtcGxhdGUvcHJiIHJlc3AgdGVtcGxhdGUgaXMgMTQyIGJ5dGVzLgotICoKLSAqCVBMQ1AgaGVhZGVyIGlzIDYgYnl0ZXMuCi0gKgk4MDIuMTEgQTMgaGVhZGVyIGlzIDI0IGJ5dGVzLgotICoJTWF4IGJlYWNvbiBmcmFtZSBib2R5IHRlbXBsYXRlIGxlbmd0aCBpcyAxMTIgYnl0ZXMuCi0gKglNYXggcHJvYmUgcmVzcCBmcmFtZSBib2R5IHRlbXBsYXRlIGxlbmd0aCBpcyAxMTAgYnl0ZXMuCi0gKgotICogICAgICAqbGVuIG9uIGlucHV0IGNvbnRhaW5zIHRoZSBtYXggbGVuZ3RoIG9mIHRoZSBwYWNrZXQgYXZhaWxhYmxlLgotICoKLSAqCVRoZSAqbGVuIHZhbHVlIGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGJ1ZiB1c2VkLCBhbmQgc3RhcnRzIHdpdGggdGhlIFBMQ1AKLSAqCWFuZCBpbmNsdWRlZCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIHRoZSA0IGJ5dGUgRkNTLgotICovCi1zdGF0aWMgdm9pZAotYnJjbXNfY19iY25fcHJiX3RlbXBsYXRlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdTE2IHR5cGUsCi0JCQkgcmF0ZXNwZWNfdCBiY25fcnNwZWMsCi0JCQkgc3RydWN0IGJyY21zX2Jzc19jZmcgKmNmZywgdTE2ICpidWYsIGludCAqbGVuKQotewotCXN0YXRpYyBjb25zdCB1OCBldGhlcl9iY2FzdFtFVEhfQUxFTl0gPSB7MjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NX07Ci0Jc3RydWN0IGNja19waHlfaGRyICpwbGNwOwotCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqaDsKLQlpbnQgaGRyX2xlbiwgYm9keV9sZW47Ci0KLQlpZiAoTUJTU19CQ05fRU5BQihjZmcpICYmIHR5cGUgPT0gSUVFRTgwMjExX1NUWVBFX0JFQUNPTikKLQkJaGRyX2xlbiA9IERPVDExX01BQ19IRFJfTEVOOwotCWVsc2UKLQkJaGRyX2xlbiA9IEQxMV9QSFlfSERSX0xFTiArIERPVDExX01BQ19IRFJfTEVOOwotCWJvZHlfbGVuID0gKmxlbiAtIGhkcl9sZW47CS8qIGNhbGMgYnVmZmVyIHNpemUgcHJvdmlkZWQgZm9yIGZyYW1lIGJvZHkgKi8KLQotCSpsZW4gPSBoZHJfbGVuICsgYm9keV9sZW47CS8qIHJldHVybiBhY3R1YWwgc2l6ZSAqLwotCi0JLyogZm9ybWF0IFBIWSBhbmQgTUFDIGhlYWRlcnMgKi8KLQltZW1zZXQoKGNoYXIgKilidWYsIDAsIGhkcl9sZW4pOwotCi0JcGxjcCA9IChzdHJ1Y3QgY2NrX3BoeV9oZHIgKikgYnVmOwotCi0JLyogUExDUCBmb3IgUHJvYmUgUmVzcG9uc2UgZnJhbWVzIGFyZSBmaWxsZWQgaW4gZnJvbSBjb3JlJ3MgcmF0ZSB0YWJsZSAqLwotCWlmICh0eXBlID09IElFRUU4MDIxMV9TVFlQRV9CRUFDT04gJiYgIU1CU1NfQkNOX0VOQUIoY2ZnKSkgewotCQkvKiBmaWxsIGluIFBMQ1AgKi8KLQkJYnJjbXNfY19jb21wdXRlX3BsY3Aod2xjLCBiY25fcnNwZWMsCi0JCQkJIChET1QxMV9NQUNfSERSX0xFTiArIGJvZHlfbGVuICsgRkNTX0xFTiksCi0JCQkJICh1OCAqKSBwbGNwKTsKLQotCX0KLQkvKiAiUmVndWxhciIgYW5kIDE2IE1CU1MgYnV0IG5vdCBmb3IgNCBNQlNTICovCi0JLyogVXBkYXRlIHRoZSBwaHl0eGN0bCBmb3IgdGhlIGJlYWNvbiBiYXNlZCBvbiB0aGUgcnNwZWMgKi8KLQlpZiAoIVNPRlRCQ05fRU5BQihjZmcpKQotCQlicmNtc19jX2JlYWNvbl9waHl0eGN0bF90eGFudF91cGQod2xjLCBiY25fcnNwZWMpOwotCi0JaWYgKE1CU1NfQkNOX0VOQUIoY2ZnKSAmJiB0eXBlID09IElFRUU4MDIxMV9TVFlQRV9CRUFDT04pCi0JCWggPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopJnBsY3BbMF07Ci0JZWxzZQotCQloID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSZwbGNwWzFdOwotCi0JLyogZmlsbCBpbiA4MDIuMTEgaGVhZGVyICovCi0JaC0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9NR01UIHwgdHlwZSk7Ci0KLQkvKiBEVVIgaXMgMCBmb3IgbXVsdGljYXN0IGJjbiwgb3IgZmlsbGVkIGluIGJ5IE1BQyBmb3IgcHJiIHJlc3AgKi8KLQkvKiBBMSBmaWxsZWQgaW4gYnkgTUFDIGZvciBwcmIgcmVzcCwgYnJvYWRjYXN0IGZvciBiY24gKi8KLQlpZiAodHlwZSA9PSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OKQotCQltZW1jcHkoJmgtPmRhLCAmZXRoZXJfYmNhc3QsIEVUSF9BTEVOKTsKLQltZW1jcHkoJmgtPnNhLCAmY2ZnLT5jdXJfZXRoZXJhZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KCZoLT5ic3NpZCwgJmNmZy0+QlNTSUQsIEVUSF9BTEVOKTsKLQotCS8qIFNFUSBmaWxsZWQgaW4gYnkgTUFDICovCi0KLQlyZXR1cm47Ci19Ci0KLWludCBicmNtc19jX2dldF9oZWFkZXJfbGVuKCkKLXsKLQlyZXR1cm4gVFhPRkY7Ci19Ci0KLS8qIFVwZGF0ZSBhIGJlYWNvbiBmb3IgYSBwYXJ0aWN1bGFyIEJTUwotICogRm9yIE1CU1MsIHRoaXMgdXBkYXRlcyB0aGUgc29mdHdhcmUgdGVtcGxhdGUgYW5kIHNldHMgImxhdGVzdCIgdG8gdGhlIGluZGV4IG9mIHRoZQotICogdGVtcGxhdGUgdXBkYXRlZC4KLSAqIE90aGVyd2lzZSwgaXQgdXBkYXRlcyB0aGUgaGFyZHdhcmUgdGVtcGxhdGUuCi0gKi8KLXZvaWQgYnJjbXNfY19ic3NfdXBkYXRlX2JlYWNvbihzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsCi0JCQkgICAgICAgc3RydWN0IGJyY21zX2Jzc19jZmcgKmNmZykKLXsKLQlpbnQgbGVuID0gQkNOX1RNUExfTEVOOwotCi0JLyogQ2xlYXIgdGhlIHNvZnQgaW50bWFzayAqLwotCXdsYy0+ZGVmbWFjaW50bWFzayAmPSB+TUlfQkNOVFBMOwotCi0JaWYgKCFjZmctPnVwKSB7CQkvKiBPbmx5IGFsbG93IHVwZGF0ZXMgb24gYW4gVVAgYnNzICovCi0JCXJldHVybjsKLQl9Ci0KLQkvKiBPcHRpbWl6ZTogIFNvbWUgb2YgaWYvZWxzZSBjb3VsZCBiZSBjb21iaW5lZCAqLwotCWlmICghTUJTU19CQ05fRU5BQihjZmcpICYmIEhXQkNOX0VOQUIoY2ZnKSkgewotCQkvKiBIYXJkd2FyZSBiZWFjb25pbmcgZm9yIHRoaXMgY29uZmlnICovCi0JCXUxNiBiY25bQkNOX1RNUExfTEVOIC8gMl07Ci0JCXUzMiBib3RoX3ZhbGlkID0gTUNNRF9CQ04wVkxEIHwgTUNNRF9CQ04xVkxEOwotCQlkMTFyZWdzX3QgKnJlZ3MgPSB3bGMtPnJlZ3M7Ci0KLQkJLyogQ2hlY2sgaWYgYm90aCB0ZW1wbGF0ZXMgYXJlIGluIHVzZSwgaWYgc28gc2NoZWQuIGFuIGludGVycnVwdAotCQkgKiAgICAgIHRoYXQgd2lsbCBjYWxsIGJhY2sgaW50byB0aGlzIHJvdXRpbmUKLQkJICovCi0JCWlmICgoUl9SRUcoJnJlZ3MtPm1hY2NvbW1hbmQpICYgYm90aF92YWxpZCkgPT0gYm90aF92YWxpZCkgewotCQkJLyogY2xlYXIgYW55IHByZXZpb3VzIHN0YXR1cyAqLwotCQkJV19SRUcoJnJlZ3MtPm1hY2ludHN0YXR1cywgTUlfQkNOVFBMKTsKLQkJfQotCQkvKiBDaGVjayB0aGF0IGFmdGVyIHNjaGVkdWxpbmcgdGhlIGludGVycnVwdCBib3RoIG9mIHRoZQotCQkgKiAgICAgIHRlbXBsYXRlcyBhcmUgc3RpbGwgYnVzeS4gaWYgbm90IGNsZWFyIHRoZSBpbnQuICYgcmVtYXNrCi0JCSAqLwotCQlpZiAoKFJfUkVHKCZyZWdzLT5tYWNjb21tYW5kKSAmIGJvdGhfdmFsaWQpID09IGJvdGhfdmFsaWQpIHsKLQkJCXdsYy0+ZGVmbWFjaW50bWFzayB8PSBNSV9CQ05UUEw7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl3bGMtPmJjbl9yc3BlYyA9Ci0JCSAgICBicmNtc19jX2xvd2VzdF9iYXNpY19yc3BlYyh3bGMsICZjZmctPmN1cnJlbnRfYnNzLT5yYXRlc2V0KTsKLQkJLyogdXBkYXRlIHRoZSB0ZW1wbGF0ZSBhbmQgdWNvZGUgc2htICovCi0JCWJyY21zX2NfYmNuX3ByYl90ZW1wbGF0ZSh3bGMsIElFRUU4MDIxMV9TVFlQRV9CRUFDT04sCi0JCQkJICAgICB3bGMtPmJjbl9yc3BlYywgY2ZnLCBiY24sICZsZW4pOwotCQlicmNtc19jX3dyaXRlX2h3X2JjbnRlbXBsYXRlcyh3bGMsIGJjbiwgbGVuLCBmYWxzZSk7Ci0JfQotfQotCi0vKgotICogVXBkYXRlIGFsbCBiZWFjb25zIGZvciB0aGUgc3lzdGVtLgotICovCi12b2lkIGJyY21zX2NfdXBkYXRlX2JlYWNvbihzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0JaW50IGlkeDsKLQlzdHJ1Y3QgYnJjbXNfYnNzX2NmZyAqYnNzY2ZnOwotCi0JLyogdXBkYXRlIEFQIG9yIElCU1MgYmVhY29ucyAqLwotCUZPUkVBQ0hfQlNTKHdsYywgaWR4LCBic3NjZmcpIHsKLQkJaWYgKGJzc2NmZy0+dXAgJiYgKEJTU0NGR19BUChic3NjZmcpIHx8ICFic3NjZmctPkJTUykpCi0JCQlicmNtc19jX2Jzc191cGRhdGVfYmVhY29uKHdsYywgYnNzY2ZnKTsKLQl9Ci19Ci0KLS8qIFdyaXRlIHNzaWQgaW50byBzaGFyZWQgbWVtb3J5ICovCi12b2lkIGJyY21zX2Nfc2htX3NzaWRfdXBkKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgc3RydWN0IGJyY21zX2Jzc19jZmcgKmNmZykKLXsKLQl1OCAqc3NpZHB0ciA9IGNmZy0+U1NJRDsKLQl1MTYgYmFzZSA9IE1fU1NJRDsKLQl1OCBzc2lkYnVmW0lFRUU4MDIxMV9NQVhfU1NJRF9MRU5dOwotCi0JLyogcGFkZGluZyB0aGUgc3NpZCB3aXRoIHplcm8gYW5kIGNvcHkgaXQgaW50byBzaG0gKi8KLQltZW1zZXQoc3NpZGJ1ZiwgMCwgSUVFRTgwMjExX01BWF9TU0lEX0xFTik7Ci0JbWVtY3B5KHNzaWRidWYsIHNzaWRwdHIsIGNmZy0+U1NJRF9sZW4pOwotCi0JYnJjbXNfY19jb3B5dG9fc2htKHdsYywgYmFzZSwgc3NpZGJ1ZiwgSUVFRTgwMjExX01BWF9TU0lEX0xFTik7Ci0KLQlpZiAoIU1CU1NfQkNOX0VOQUIoY2ZnKSkKLQkJYnJjbXNfY193cml0ZV9zaG0od2xjLCBNX1NTSURMRU4sICh1MTYpIGNmZy0+U1NJRF9sZW4pOwotfQotCi12b2lkIGJyY21zX2NfdXBkYXRlX3Byb2JlX3Jlc3Aoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBib29sIHN1c3BlbmQpCi17Ci0JaW50IGlkeDsKLQlzdHJ1Y3QgYnJjbXNfYnNzX2NmZyAqYnNzY2ZnOwotCi0JLyogdXBkYXRlIEFQIG9yIElCU1MgcHJvYmUgcmVzcG9uc2VzICovCi0JRk9SRUFDSF9CU1Mod2xjLCBpZHgsIGJzc2NmZykgewotCQlpZiAoYnNzY2ZnLT51cCAmJiAoQlNTQ0ZHX0FQKGJzc2NmZykgfHwgIWJzc2NmZy0+QlNTKSkKLQkJCWJyY21zX2NfYnNzX3VwZGF0ZV9wcm9iZV9yZXNwKHdsYywgYnNzY2ZnLCBzdXNwZW5kKTsKLQl9Ci19Ci0KLXZvaWQKLWJyY21zX2NfYnNzX3VwZGF0ZV9wcm9iZV9yZXNwKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywKLQkJCSAgICAgIHN0cnVjdCBicmNtc19ic3NfY2ZnICpjZmcsCi0JCQkgICAgICBib29sIHN1c3BlbmQpCi17Ci0JdTE2IHByYl9yZXNwW0JDTl9UTVBMX0xFTiAvIDJdOwotCWludCBsZW4gPSBCQ05fVE1QTF9MRU47Ci0KLQkvKiB3cml0ZSB0aGUgcHJvYmUgcmVzcG9uc2UgdG8gaGFyZHdhcmUsIG9yIHNhdmUgaW4gdGhlIGNvbmZpZyBzdHJ1Y3R1cmUgKi8KLQlpZiAoIU1CU1NfUFJCX0VOQUIoY2ZnKSkgewotCi0JCS8qIGNyZWF0ZSB0aGUgcHJvYmUgcmVzcG9uc2UgdGVtcGxhdGUgKi8KLQkJYnJjbXNfY19iY25fcHJiX3RlbXBsYXRlKHdsYywgSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFU1AsIDAsCi0JCQkJCSBjZmcsIHByYl9yZXNwLCAmbGVuKTsKLQotCQlpZiAoc3VzcGVuZCkKLQkJCWJyY21zX2Nfc3VzcGVuZF9tYWNfYW5kX3dhaXQod2xjKTsKLQotCQkvKiB3cml0ZSB0aGUgcHJvYmUgcmVzcG9uc2UgaW50byB0aGUgdGVtcGxhdGUgcmVnaW9uICovCi0JCWJyY21zX2Jfd3JpdGVfdGVtcGxhdGVfcmFtKHdsYy0+aHcsIFRfUFJTX1RQTF9CQVNFLAotCQkJCQkgICAgKGxlbiArIDMpICYgfjMsIHByYl9yZXNwKTsKLQotCQkvKiB3cml0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBwcm9iZSByZXNwb25zZSBmcmFtZSAoK1BMQ1AvLUZDUykgKi8KLQkJYnJjbXNfY193cml0ZV9zaG0od2xjLCBNX1BSQl9SRVNQX0ZSTV9MRU4sICh1MTYpIGxlbik7Ci0KLQkJLyogd3JpdGUgdGhlIFNTSUQgYW5kIFNTSUQgbGVuZ3RoICovCi0JCWJyY21zX2Nfc2htX3NzaWRfdXBkKHdsYywgY2ZnKTsKLQotCQkvKgotCQkgKiBXcml0ZSBQTENQIGhlYWRlcnMgYW5kIGR1cmF0aW9ucyBmb3IgcHJvYmUgcmVzcG9uc2UgZnJhbWVzIGF0IGFsbCByYXRlcy4KLQkJICogVXNlIHRoZSBhY3R1YWwgZnJhbWUgbGVuZ3RoIGNvdmVyZWQgYnkgdGhlIFBMQ1AgaGVhZGVyIGZvciB0aGUgY2FsbCB0bwotCQkgKiBicmNtc19jX21vZF9wcmJfcnNwX3JhdGVfdGFibGUoKSBieSBzdWJ0cmFjdGluZyB0aGUgUExDUCBsZW4KLQkJICogYW5kIGFkZGluZyB0aGUgRkNTLgotCQkgKi8KLQkJbGVuICs9ICgtRDExX1BIWV9IRFJfTEVOICsgRkNTX0xFTik7Ci0JCWJyY21zX2NfbW9kX3ByYl9yc3BfcmF0ZV90YWJsZSh3bGMsICh1MTYpIGxlbik7Ci0KLQkJaWYgKHN1c3BlbmQpCi0JCQlicmNtc19jX2VuYWJsZV9tYWMod2xjKTsKLQl9IGVsc2UgewkJLyogR2VuZXJhdGluZyBwcm9iZSByZXNwIGluIHN3OyB1cGRhdGUgbG9jYWwgdGVtcGxhdGUgKi8KLQkJLyogZXJyb3I6IE5vIHNvZnR3YXJlIHByb2JlIHJlc3BvbnNlIHN1cHBvcnQgd2l0aG91dCBNQlNTICovCi0JfQotfQotCi0vKiBwcmVwYXJlcyBwZHUgZm9yIHRyYW5zbWlzc2lvbi4gcmV0dXJucyBCQ00gZXJyb3IgY29kZXMgKi8KLWludCBicmNtc19jX3ByZXBfcGR1KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgc3RydWN0IHNrX2J1ZmYgKnBkdSwgdWludCAqZmlmb3ApCi17Ci0JdWludCBmaWZvOwotCXN0cnVjdCBkMTF0eGggKnR4aDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaDsKLQlzdHJ1Y3Qgc2NiICpzY2I7Ci0KLQl0eGggPSAoc3RydWN0IGQxMXR4aCAqKSAocGR1LT5kYXRhKTsKLQloID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopKCh1OCAqKSAodHhoICsgMSkgKyBEMTFfUEhZX0hEUl9MRU4pOwotCi0JLyogZ2V0IHRoZSBwa3QgcXVldWUgaW5mby4gVGhpcyB3YXMgcHV0IGF0IGJyY21zX2Nfc2VuZGN0bCBvcgotCSAqIGJyY21zX2Nfc2VuZCBmb3IgUERVICovCi0JZmlmbyA9IGxlMTZfdG9fY3B1KHR4aC0+VHhGcmFtZUlEKSAmIFRYRklEX1FVRVVFX01BU0s7Ci0KLQlzY2IgPSBOVUxMOwotCi0JKmZpZm9wID0gZmlmbzsKLQotCS8qIHJldHVybiBpZiBpbnN1ZmZpY2llbnQgZG1hIHJlc291cmNlcyAqLwotCWlmIChUWEFWQUlMKHdsYywgZmlmbykgPCBNQVhfRE1BX1NFR1MpIHsKLQkJLyogTWFyayBwcmVjZWRlbmNlcyByZWxhdGVkIHRvIHRoaXMgRklGTywgdW5zZW5kYWJsZSAqLwotCQlCUkNNU19UWF9GSUZPX0NMRUFSKHdsYywgZmlmbyk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKiBpbml0IHR4IHJlcG9ydGVkIHJhdGUgbWVjaGFuaXNtICovCi12b2lkIGJyY21zX2NfcmVwcmF0ZV9pbml0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgYnJjbXNfYnNzX2NmZyAqYnNzY2ZnOwotCi0JRk9SRUFDSF9CU1Mod2xjLCBpLCBic3NjZmcpIHsKLQkJYnJjbXNfY19ic3NjZmdfcmVwcmF0ZV9pbml0KGJzc2NmZyk7Ci0JfQotfQotCi0vKiBwZXIgYnNzY2ZnIGluaXQgdHggcmVwb3J0ZWQgcmF0ZSBtZWNoYW5pc20gKi8KLXZvaWQgYnJjbXNfY19ic3NjZmdfcmVwcmF0ZV9pbml0KHN0cnVjdCBicmNtc19ic3NfY2ZnICpic3NjZmcpCi17Ci0JYnNzY2ZnLT50eHJzcGVjaWR4ID0gMDsKLQltZW1zZXQoKGNoYXIgKilic3NjZmctPnR4cnNwZWMsIDAsIHNpemVvZihic3NjZmctPnR4cnNwZWMpKTsKLX0KLQotdm9pZCBicmNtc19kZWZhdWx0X3JhdGVzZXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB3bGNfcmF0ZXNldF90ICpycykKLXsKLQlicmNtc19jX3JhdGVzZXRfZGVmYXVsdChycywgTlVMTCwgd2xjLT5iYW5kLT5waHl0eXBlLAotCQl3bGMtPmJhbmQtPmJhbmR0eXBlLCBmYWxzZSwgQlJDTVNfUkFURV9NQVNLX0ZVTEwsCi0JCShib29sKSBOX0VOQUIod2xjLT5wdWIpLAotCQlDSFNQRUNfV0xDX0JXKHdsYy0+ZGVmYXVsdF9ic3MtPmNoYW5zcGVjKSwKLQkJd2xjLT5zdGYtPnR4c3RyZWFtcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyY21zX2NfYnNzX2RlZmF1bHRfaW5pdChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0JY2hhbnNwZWNfdCBjaGFuc3BlYzsKLQlzdHJ1Y3QgYnJjbXNfYmFuZCAqYmFuZDsKLQlzdHJ1Y3QgYnJjbXNfYnNzX2luZm8gKmJpID0gd2xjLT5kZWZhdWx0X2JzczsKLQotCS8qIGluaXQgZGVmYXVsdCBhbmQgdGFyZ2V0IEJTUyB3aXRoIHNvbWUgc2FuZSBpbml0aWFsIHZhbHVlcyAqLwotCW1lbXNldCgoY2hhciAqKShiaSksIDAsIHNpemVvZihzdHJ1Y3QgYnJjbXNfYnNzX2luZm8pKTsKLQliaS0+YmVhY29uX3BlcmlvZCA9IEJFQUNPTl9JTlRFUlZBTF9ERUZBVUxUOwotCWJpLT5kdGltX3BlcmlvZCA9IERUSU1fSU5URVJWQUxfREVGQVVMVDsKLQotCS8qIGZpbGwgdGhlIGRlZmF1bHQgY2hhbm5lbCBhcyB0aGUgZmlyc3QgdmFsaWQgY2hhbm5lbAotCSAqIHN0YXJ0aW5nIGZyb20gdGhlIDJHIGNoYW5uZWxzCi0JICovCi0JY2hhbnNwZWMgPSBDSDIwTUhaX0NIU1BFQygxKTsKLQl3bGMtPmhvbWVfY2hhbnNwZWMgPSBiaS0+Y2hhbnNwZWMgPSBjaGFuc3BlYzsKLQotCS8qIGZpbmQgdGhlIGJhbmQgb2Ygb3VyIGRlZmF1bHQgY2hhbm5lbCAqLwotCWJhbmQgPSB3bGMtPmJhbmQ7Ci0JaWYgKE5CQU5EUyh3bGMpID4gMSAmJiBiYW5kLT5iYW5kdW5pdCAhPSBDSFNQRUNfQkFORFVOSVQoY2hhbnNwZWMpKQotCQliYW5kID0gd2xjLT5iYW5kc3RhdGVbT1RIRVJCQU5EVU5JVCh3bGMpXTsKLQotCS8qIGluaXQgYnNzIHJhdGVzIHRvIHRoZSBiYW5kIHNwZWNpZmljIGRlZmF1bHQgcmF0ZSBzZXQgKi8KLQlicmNtc19jX3JhdGVzZXRfZGVmYXVsdCgmYmktPnJhdGVzZXQsIE5VTEwsIGJhbmQtPnBoeXR5cGUsCi0JCWJhbmQtPmJhbmR0eXBlLCBmYWxzZSwgQlJDTVNfUkFURV9NQVNLX0ZVTEwsCi0JCShib29sKSBOX0VOQUIod2xjLT5wdWIpLCBDSFNQRUNfV0xDX0JXKGNoYW5zcGVjKSwKLQkJd2xjLT5zdGYtPnR4c3RyZWFtcyk7Ci0KLQlpZiAoTl9FTkFCKHdsYy0+cHViKSkKLQkJYmktPmZsYWdzIHw9IEJSQ01TX0JTU19IVDsKLX0KLQotc3RhdGljIHJhdGVzcGVjX3QKLW1hYzgwMjExX3dsY19zZXRfbnJhdGUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBzdHJ1Y3QgYnJjbXNfYmFuZCAqY3VyX2JhbmQsCi0JCSAgICAgICB1MzIgaW50X3ZhbCkKLXsKLQl1OCBzdGYgPSAoaW50X3ZhbCAmIE5SQVRFX1NURl9NQVNLKSA+PiBOUkFURV9TVEZfU0hJRlQ7Ci0JdTggcmF0ZSA9IGludF92YWwgJiBOUkFURV9SQVRFX01BU0s7Ci0JcmF0ZXNwZWNfdCByc3BlYzsKLQlib29sIGlzbWNzID0gKChpbnRfdmFsICYgTlJBVEVfTUNTX0lOVVNFKSA9PSBOUkFURV9NQ1NfSU5VU0UpOwotCWJvb2wgaXNzZ2kgPSAoKGludF92YWwgJiBOUkFURV9TR0lfTUFTSykgPj4gTlJBVEVfU0dJX1NISUZUKTsKLQlib29sIG92ZXJyaWRlX21jc19vbmx5ID0gKChpbnRfdmFsICYgTlJBVEVfT1ZFUlJJREVfTUNTX09OTFkpCi0JCQkJICA9PSBOUkFURV9PVkVSUklERV9NQ1NfT05MWSk7Ci0JaW50IGJjbWVycm9yID0gMDsKLQotCWlmICghaXNtY3MpIHsKLQkJcmV0dXJuIChyYXRlc3BlY190KSByYXRlOwotCX0KLQotCS8qIHZhbGlkYXRlIHRoZSBjb21iaW5hdGlvbiBvZiByYXRlL21jcy9zdGYgaXMgYWxsb3dlZCAqLwotCWlmIChOX0VOQUIod2xjLT5wdWIpICYmIGlzbWNzKSB7Ci0JCS8qIG1jcyBvbmx5IGFsbG93ZWQgd2hlbiBubW9kZSAqLwotCQlpZiAoc3RmID4gUEhZX1RYQzFfTU9ERV9TRE0pIHsKLQkJCXdpcGh5X2Vycih3bGMtPndpcGh5LCAid2wlZDogJXM6IEludmFsaWQgc3RmXG4iLAotCQkJCSBCUkNNU19VTklUKHdsYyksIF9fZnVuY19fKTsKLQkJCWJjbWVycm9yID0gLUVJTlZBTDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCS8qIG1jcyAzMiBpcyBhIHNwZWNpYWwgY2FzZSwgRFVQIG1vZGUgNDAgb25seSAqLwotCQlpZiAocmF0ZSA9PSAzMikgewotCQkJaWYgKCFDSFNQRUNfSVM0MCh3bGMtPmhvbWVfY2hhbnNwZWMpIHx8Ci0JCQkgICAgKChzdGYgIT0gUEhZX1RYQzFfTU9ERV9TSVNPKQotCQkJICAgICAmJiAoc3RmICE9IFBIWV9UWEMxX01PREVfQ0REKSkpIHsKLQkJCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIndsJWQ6ICVzOiBJbnZhbGlkIG1jcyAiCi0JCQkJCSAgIjMyXG4iLCBCUkNNU19VTklUKHdsYyksIF9fZnVuY19fKTsKLQkJCQliY21lcnJvciA9IC1FSU5WQUw7Ci0JCQkJZ290byBkb25lOwotCQkJfQotCQkJLyogbWNzID4gNyBtdXN0IHVzZSBzdGYgU0RNICovCi0JCX0gZWxzZSBpZiAocmF0ZSA+IEhJR0hFU1RfU0lOR0xFX1NUUkVBTV9NQ1MpIHsKLQkJCS8qIG1jcyA+IDcgbXVzdCB1c2Ugc3RmIFNETSAqLwotCQkJaWYgKHN0ZiAhPSBQSFlfVFhDMV9NT0RFX1NETSkgewotCQkJCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZDogZW5hYmxpbmcgIgotCQkJCQkgIlNETSBtb2RlIGZvciBtY3MgJWRcbiIsCi0JCQkJCSBCUkNNU19VTklUKHdsYyksIHJhdGUpOwotCQkJCXN0ZiA9IFBIWV9UWEMxX01PREVfU0RNOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogTUNTIDAtNyBtYXkgdXNlIFNJU08sIENERCwgYW5kIGZvciBwaHlfcmV2ID49IDMgU1RCQyAqLwotCQkJaWYgKChzdGYgPiBQSFlfVFhDMV9NT0RFX1NUQkMpIHx8Ci0JCQkgICAgKCFCUkNNU19TVEJDX0NBUF9QSFkod2xjKQotCQkJICAgICAmJiAoc3RmID09IFBIWV9UWEMxX01PREVfU1RCQykpKSB7Ci0JCQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICJ3bCVkOiAlczogSW52YWxpZCBTVEJDIgotCQkJCQkgICJcbiIsIEJSQ01TX1VOSVQod2xjKSwgX19mdW5jX18pOwotCQkJCWJjbWVycm9yID0gLUVJTlZBTDsKLQkJCQlnb3RvIGRvbmU7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKElTX09GRE0ocmF0ZSkpIHsKLQkJaWYgKChzdGYgIT0gUEhZX1RYQzFfTU9ERV9DREQpICYmIChzdGYgIT0gUEhZX1RYQzFfTU9ERV9TSVNPKSkgewotCQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICJ3bCVkOiAlczogSW52YWxpZCBPRkRNXG4iLAotCQkJCSAgQlJDTVNfVU5JVCh3bGMpLCBfX2Z1bmNfXyk7Ci0JCQliY21lcnJvciA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9IGVsc2UgaWYgKElTX0NDSyhyYXRlKSkgewotCQlpZiAoKGN1cl9iYW5kLT5iYW5kdHlwZSAhPSBCUkNNX0JBTkRfMkcpCi0JCSAgICB8fCAoc3RmICE9IFBIWV9UWEMxX01PREVfU0lTTykpIHsKLQkJCXdpcGh5X2Vycih3bGMtPndpcGh5LCAid2wlZDogJXM6IEludmFsaWQgQ0NLXG4iLAotCQkJCSAgQlJDTVNfVU5JVCh3bGMpLCBfX2Z1bmNfXyk7Ci0JCQliY21lcnJvciA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQl9IGVsc2UgewotCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIndsJWQ6ICVzOiBVbmtub3duIHJhdGUgdHlwZVxuIiwKLQkJCSAgQlJDTVNfVU5JVCh3bGMpLCBfX2Z1bmNfXyk7Ci0JCWJjbWVycm9yID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQkvKiBtYWtlIHN1cmUgbXVsdGlwbGUgYW50ZW5uYWUgYXJlIGF2YWlsYWJsZSBmb3Igbm9uLXNpc28gcmF0ZXMgKi8KLQlpZiAoKHN0ZiAhPSBQSFlfVFhDMV9NT0RFX1NJU08pICYmICh3bGMtPnN0Zi0+dHhzdHJlYW1zID09IDEpKSB7Ci0JCXdpcGh5X2Vycih3bGMtPndpcGh5LCAid2wlZDogJXM6IFNJU08gYW50ZW5uYSBidXQgIVNJU08gIgotCQkJICAicmVxdWVzdFxuIiwgQlJDTVNfVU5JVCh3bGMpLCBfX2Z1bmNfXyk7Ci0JCWJjbWVycm9yID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXJzcGVjID0gcmF0ZTsKLQlpZiAoaXNtY3MpIHsKLQkJcnNwZWMgfD0gUlNQRUNfTUlNT1JBVEU7Ci0JCS8qIEZvciBTVEJDIHBvcHVsYXRlIHRoZSBTVEMgZmllbGQgb2YgdGhlIHJhdGVzcGVjICovCi0JCWlmIChzdGYgPT0gUEhZX1RYQzFfTU9ERV9TVEJDKSB7Ci0JCQl1OCBzdGM7Ci0JCQlzdGMgPSAxOwkvKiBOc3MgZm9yIHNpbmdsZSBzdHJlYW0gaXMgYWx3YXlzIDEgKi8KLQkJCXJzcGVjIHw9IChzdGMgPDwgUlNQRUNfU1RDX1NISUZUKTsKLQkJfQotCX0KLQotCXJzcGVjIHw9IChzdGYgPDwgUlNQRUNfU1RGX1NISUZUKTsKLQotCWlmIChvdmVycmlkZV9tY3Nfb25seSkKLQkJcnNwZWMgfD0gUlNQRUNfT1ZFUlJJREVfTUNTX09OTFk7Ci0KLQlpZiAoaXNzZ2kpCi0JCXJzcGVjIHw9IFJTUEVDX1NIT1JUX0dJOwotCi0JaWYgKChyYXRlICE9IDApCi0JICAgICYmICFicmNtc19jX3ZhbGlkX3JhdGUod2xjLCByc3BlYywgY3VyX2JhbmQtPmJhbmR0eXBlLCB0cnVlKSkgewotCQlyZXR1cm4gcmF0ZTsKLQl9Ci0KLQlyZXR1cm4gcnNwZWM7Ci1kb25lOgotCXJldHVybiByYXRlOwotfQotCi0vKiBmb3JtdWxhOiAgSURMRV9CVVNZX1JBVElPX1hfMTYgPSAoMTAwLWR1dHlfY3ljbGUpL2R1dHlfY3ljbGUqMTYgKi8KLXN0YXRpYyBpbnQKLWJyY21zX2NfZHV0eV9jeWNsZV9zZXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBpbnQgZHV0eV9jeWNsZSwgYm9vbCBpc09GRE0sCi0JCSAgIGJvb2wgd3JpdGVUb1NobSkKLXsKLQlpbnQgaWRsZV9idXN5X3JhdGlvX3hfMTYgPSAwOwotCXVpbnQgb2Zmc2V0ID0KLQkgICAgaXNPRkRNID8gTV9UWF9JRExFX0JVU1lfUkFUSU9fWF8xNl9PRkRNIDoKLQkgICAgTV9UWF9JRExFX0JVU1lfUkFUSU9fWF8xNl9DQ0s7Ci0JaWYgKGR1dHlfY3ljbGUgPiAxMDAgfHwgZHV0eV9jeWNsZSA8IDApIHsKLQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICJ3bCVkOiAgZHV0eSBjeWNsZSB2YWx1ZSBvZmYgbGltaXRcbiIsCi0JCQkgIHdsYy0+cHViLT51bml0KTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmIChkdXR5X2N5Y2xlKQotCQlpZGxlX2J1c3lfcmF0aW9feF8xNiA9ICgxMDAgLSBkdXR5X2N5Y2xlKSAqIDE2IC8gZHV0eV9jeWNsZTsKLQkvKiBPbmx5IHdyaXRlIHRvIHNoYXJlZCBtZW1vcnkgIHdoZW4gd2wgaXMgdXAgKi8KLQlpZiAod3JpdGVUb1NobSkKLQkJYnJjbXNfY193cml0ZV9zaG0od2xjLCBvZmZzZXQsICh1MTYpIGlkbGVfYnVzeV9yYXRpb194XzE2KTsKLQotCWlmIChpc09GRE0pCi0JCXdsYy0+dHhfZHV0eV9jeWNsZV9vZmRtID0gKHUxNikgZHV0eV9jeWNsZTsKLQllbHNlCi0JCXdsYy0+dHhfZHV0eV9jeWNsZV9jY2sgPSAodTE2KSBkdXR5X2N5Y2xlOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFJlYWQgYSBzaW5nbGUgdTE2IGZyb20gc2hhcmVkIG1lbW9yeS4KLSAqIFNITSAnb2Zmc2V0JyBuZWVkcyB0byBiZSBhbiBldmVuIGFkZHJlc3MKLSAqLwotdTE2IGJyY21zX2NfcmVhZF9zaG0oc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB1aW50IG9mZnNldCkKLXsKLQlyZXR1cm4gYnJjbXNfYl9yZWFkX3NobSh3bGMtPmh3LCBvZmZzZXQpOwotfQotCi0vKiBXcml0ZSBhIHNpbmdsZSB1MTYgdG8gc2hhcmVkIG1lbW9yeS4KLSAqIFNITSAnb2Zmc2V0JyBuZWVkcyB0byBiZSBhbiBldmVuIGFkZHJlc3MKLSAqLwotdm9pZCBicmNtc19jX3dyaXRlX3NobShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHVpbnQgb2Zmc2V0LCB1MTYgdikKLXsKLQlicmNtc19iX3dyaXRlX3NobSh3bGMtPmh3LCBvZmZzZXQsIHYpOwotfQotCi0vKiBDb3B5IGEgYnVmZmVyIHRvIHNoYXJlZCBtZW1vcnkuCi0gKiBTSE0gJ29mZnNldCcgbmVlZHMgdG8gYmUgYW4gZXZlbiBhZGRyZXNzIGFuZAotICogQnVmZmVyIGxlbmd0aCAnbGVuJyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGJ5dGVzCi0gKi8KLXZvaWQgYnJjbXNfY19jb3B5dG9fc2htKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdWludCBvZmZzZXQsIGNvbnN0IHZvaWQgKmJ1ZiwKLQkJCWludCBsZW4pCi17Ci0JLyogb2Zmc2V0IGFuZCBsZW4gbmVlZCB0byBiZSBldmVuICovCi0JaWYgKGxlbiA8PSAwIHx8IChvZmZzZXQgJiAxKSB8fCAobGVuICYgMSkpCi0JCXJldHVybjsKLQotCWJyY21zX2JfY29weXRvX29iam1lbSh3bGMtPmh3LCBvZmZzZXQsIGJ1ZiwgbGVuLCBPQkpBRERSX1NITV9TRUwpOwotCi19Ci0KLS8qIHdyYXBwZXIgQk1BQyBmdW5jdGlvbnMgdG8gZm9yIEhJR0ggZHJpdmVyIGFjY2VzcyAqLwotdm9pZCBicmNtc19jX21jdHJsKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdTMyIG1hc2ssIHUzMiB2YWwpCi17Ci0JYnJjbXNfYl9tY3RybCh3bGMtPmh3LCBtYXNrLCB2YWwpOwotfQotCi12b2lkIGJyY21zX2NfbWhmKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdTggaWR4LCB1MTYgbWFzaywgdTE2IHZhbCwgaW50IGJhbmRzKQotewotCWJyY21zX2JfbWhmKHdsYy0+aHcsIGlkeCwgbWFzaywgdmFsLCBiYW5kcyk7Ci19Ci0KLWludCBicmNtc19jX3htdGZpZm9fc3pfZ2V0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdWludCBmaWZvLCB1aW50ICpibG9ja3MpCi17Ci0JcmV0dXJuIGJyY21zX2JfeG10Zmlmb19zel9nZXQod2xjLT5odywgZmlmbywgYmxvY2tzKTsKLX0KLQotdm9pZCBicmNtc19jX3dyaXRlX3RlbXBsYXRlX3JhbShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGludCBvZmZzZXQsIGludCBsZW4sCi0JCQkgICAgdm9pZCAqYnVmKQotewotCWJyY21zX2Jfd3JpdGVfdGVtcGxhdGVfcmFtKHdsYy0+aHcsIG9mZnNldCwgbGVuLCBidWYpOwotfQotCi12b2lkIGJyY21zX2Nfd3JpdGVfaHdfYmNudGVtcGxhdGVzKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdm9pZCAqYmNuLCBpbnQgbGVuLAotCQkJICAgICAgIGJvb2wgYm90aCkKLXsKLQlicmNtc19iX3dyaXRlX2h3X2JjbnRlbXBsYXRlcyh3bGMtPmh3LCBiY24sIGxlbiwgYm90aCk7Ci19Ci0KLXZvaWQKLWJyY21zX2Nfc2V0X2FkZHJtYXRjaChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGludCBtYXRjaF9yZWdfb2Zmc2V0LAotCQkgIGNvbnN0IHU4ICphZGRyKQotewotCWJyY21zX2Jfc2V0X2FkZHJtYXRjaCh3bGMtPmh3LCBtYXRjaF9yZWdfb2Zmc2V0LCBhZGRyKTsKLQlpZiAobWF0Y2hfcmVnX29mZnNldCA9PSBSQ01fQlNTSURfT0ZGU0VUKQotCQltZW1jcHkod2xjLT5jZmctPkJTU0lELCBhZGRyLCBFVEhfQUxFTik7Ci19Ci0KLXZvaWQgYnJjbXNfY19wbGxyZXEoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBib29sIHNldCwgbWJvb2wgcmVxX2JpdCkKLXsKLQlicmNtc19iX3BsbHJlcSh3bGMtPmh3LCBzZXQsIHJlcV9iaXQpOwotfQotCi12b2lkIGJyY21zX2NfcmVzZXRfYm1hY19kb25lKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLX0KLQotLyogY2hlY2sgZm9yIHRoZSBwYXJ0aWN1bGFyIHByaW9yaXR5IGZsb3cgY29udHJvbCBiaXQgYmVpbmcgc2V0ICovCi1ib29sCi1icmNtc19jX3R4Zmxvd2NvbnRyb2xfcHJpb19pc3NldChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsCi0JCQkJIHN0cnVjdCBicmNtc190eHFfaW5mbyAqcSwKLQkJCQkgaW50IHByaW8pCi17Ci0JdWludCBwcmlvX21hc2s7Ci0KLQlpZiAocHJpbyA9PSBBTExQUklPKSB7Ci0JCXByaW9fbWFzayA9IFRYUV9TVE9QX0ZPUl9QUklPRkNfTUFTSzsKLQl9IGVsc2UgewotCQlwcmlvX21hc2sgPSBOQklUVkFMKHByaW8pOwotCX0KLQotCXJldHVybiAocS0+c3RvcHBlZCAmIHByaW9fbWFzaykgPT0gcHJpb19tYXNrOwotfQotCi0vKiBwcm9wYWdhdGUgdGhlIGZsb3cgY29udHJvbCB0byBhbGwgaW50ZXJmYWNlcyB1c2luZyB0aGUgZ2l2ZW4gdHggcXVldWUgKi8KLXZvaWQgYnJjbXNfY190eGZsb3djb250cm9sKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywKLQkJCSAgIHN0cnVjdCBicmNtc190eHFfaW5mbyAqcWksCi0JCQkgICBib29sIG9uLCBpbnQgcHJpbykKLXsKLQl1aW50IHByaW9fYml0czsKLQl1aW50IGN1cl9iaXRzOwotCi0JQkNNTVNHKHdsYy0+d2lwaHksICJmbG93IGNvbnRyb2wga2lja3MgaW5cbiIpOwotCi0JaWYgKHByaW8gPT0gQUxMUFJJTykgewotCQlwcmlvX2JpdHMgPSBUWFFfU1RPUF9GT1JfUFJJT0ZDX01BU0s7Ci0JfSBlbHNlIHsKLQkJcHJpb19iaXRzID0gTkJJVFZBTChwcmlvKTsKLQl9Ci0KLQljdXJfYml0cyA9IHFpLT5zdG9wcGVkICYgcHJpb19iaXRzOwotCi0JLyogQ2hlY2sgZm9yIHRoZSBjYXNlIG9mIG5vIGNoYW5nZSBhbmQgcmV0dXJuIGVhcmx5Ci0JICogT3RoZXJ3aXNlIHVwZGF0ZSB0aGUgYml0IGFuZCBjb250aW51ZQotCSAqLwotCWlmIChvbikgewotCQlpZiAoY3VyX2JpdHMgPT0gcHJpb19iaXRzKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbWJvb2xzZXQocWktPnN0b3BwZWQsIHByaW9fYml0cyk7Ci0JfSBlbHNlIHsKLQkJaWYgKGN1cl9iaXRzID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQltYm9vbGNscihxaS0+c3RvcHBlZCwgcHJpb19iaXRzKTsKLQl9Ci0KLQkvKiBJZiB0aGVyZSBpcyBhIGZsb3cgY29udHJvbCBvdmVycmlkZSB3ZSB3aWxsIG5vdCBjaGFuZ2UgdGhlIGV4dGVybmFsCi0JICogZmxvdyBjb250cm9sIHN0YXRlLgotCSAqLwotCWlmIChxaS0+c3RvcHBlZCAmIH5UWFFfU1RPUF9GT1JfUFJJT0ZDX01BU0spIHsKLQkJcmV0dXJuOwotCX0KLQotCWJyY21zX2NfdHhmbG93Y29udHJvbF9zaWduYWwod2xjLCBxaSwgb24sIHByaW8pOwotfQotCi12b2lkCi1icmNtc19jX3R4Zmxvd2NvbnRyb2xfb3ZlcnJpZGUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJICAgICAgIHN0cnVjdCBicmNtc190eHFfaW5mbyAqcWksCi0JCQkgICAgICAgYm9vbCBvbiwgdWludCBvdmVycmlkZSkKLXsKLQl1aW50IHByZXZfb3ZlcnJpZGU7Ci0KLQlwcmV2X292ZXJyaWRlID0gKHFpLT5zdG9wcGVkICYgflRYUV9TVE9QX0ZPUl9QUklPRkNfTUFTSyk7Ci0KLQkvKiBVcGRhdGUgdGhlIGZsb3cgY29udHJvbCBiaXRzIGFuZCBkbyBhbiBlYXJseSByZXR1cm4gaWYgdGhlcmUgaXMKLQkgKiBubyBjaGFuZ2UgaW4gdGhlIGV4dGVybmFsIGZsb3cgY29udHJvbCBzdGF0ZS4KLQkgKi8KLQlpZiAob24pIHsKLQkJbWJvb2xzZXQocWktPnN0b3BwZWQsIG92ZXJyaWRlKTsKLQkJLyogaWYgdGhlcmUgd2FzIGEgcHJldmlvdXMgb3ZlcnJpZGUgYml0IG9uLCB0aGVuIHNldHRpbmcgdGhpcwotCQkgKiBtYWtlcyBubyBkaWZmZXJlbmNlLgotCQkgKi8KLQkJaWYgKHByZXZfb3ZlcnJpZGUpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWJyY21zX2NfdHhmbG93Y29udHJvbF9zaWduYWwod2xjLCBxaSwgT04sIEFMTFBSSU8pOwotCX0gZWxzZSB7Ci0JCW1ib29sY2xyKHFpLT5zdG9wcGVkLCBvdmVycmlkZSk7Ci0JCS8qIGNsZWFyaW5nIGFuIG92ZXJyaWRlIGJpdCB3aWxsIG9ubHkgbWFrZSBhIGRpZmZlcmVuY2UgZm9yCi0JCSAqIGZsb3cgY29udHJvbCBpZiBpdCB3YXMgdGhlIG9ubHkgYml0IHNldC4gRm9yIGFueSBvdGhlcgotCQkgKiBvdmVycmlkZSBzZXR0aW5nLCBqdXN0IHJldHVybgotCQkgKi8KLQkJaWYgKHByZXZfb3ZlcnJpZGUgIT0gb3ZlcnJpZGUpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChxaS0+c3RvcHBlZCA9PSAwKSB7Ci0JCQlicmNtc19jX3R4Zmxvd2NvbnRyb2xfc2lnbmFsKHdsYywgcWksIE9GRiwgQUxMUFJJTyk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgcHJpbzsKLQotCQkJZm9yIChwcmlvID0gTUFYUFJJTzsgcHJpbyA+PSAwOyBwcmlvLS0pIHsKLQkJCQlpZiAoIW1ib29saXNzZXQocWktPnN0b3BwZWQsIE5CSVRWQUwocHJpbykpKQotCQkJCQlicmNtc19jX3R4Zmxvd2NvbnRyb2xfc2lnbmFsKAotCQkJCQkJd2xjLCBxaSwgT0ZGLCBwcmlvKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgYnJjbXNfY190eGZsb3djb250cm9sX3Jlc2V0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlzdHJ1Y3QgYnJjbXNfdHhxX2luZm8gKnFpOwotCi0JZm9yIChxaSA9IHdsYy0+dHhfcXVldWVzOyBxaSAhPSBOVUxMOyBxaSA9IHFpLT5uZXh0KSB7Ci0JCWlmIChxaS0+c3RvcHBlZCkgewotCQkJYnJjbXNfY190eGZsb3djb250cm9sX3NpZ25hbCh3bGMsIHFpLCBPRkYsIEFMTFBSSU8pOwotCQkJcWktPnN0b3BwZWQgPSAwOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotYnJjbXNfY190eGZsb3djb250cm9sX3NpZ25hbChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsCi0JCQkgICAgIHN0cnVjdCBicmNtc190eHFfaW5mbyAqcWksIGJvb2wgb24sIGludCBwcmlvKQotewotI2lmZGVmIE5PTl9GVU5DVElPTkFMCi0JLyogd2xjaWZfbGlzdCBpcyBuZXZlciBmaWxsZWQgc28gdGhpcyBmdW5jdGlvbiBpcyBub3QgZnVuY3Rpb25hbCAqLwotCXN0cnVjdCBicmNtc19jX2lmICp3bGNpZjsKLQotCWZvciAod2xjaWYgPSB3bGMtPndsY2lmX2xpc3Q7IHdsY2lmICE9IE5VTEw7IHdsY2lmID0gd2xjaWYtPm5leHQpIHsKLQkJaWYgKHdsY2lmLT5xaSA9PSBxaSAmJiB3bGNpZi0+ZmxhZ3MgJiBCUkNNU19JRl9MSU5LRUQpCi0JCQlicmNtc190eGZsb3djb250cm9sKHdsYy0+d2wsIHdsY2lmLT53bGlmLCBvbiwgcHJpbyk7Ci0JfQotI2VuZGlmCi19Ci0KLXN0YXRpYyBzdHJ1Y3QgYnJjbXNfdHhxX2luZm8gKmJyY21zX2NfdHhxX2FsbG9jKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlzdHJ1Y3QgYnJjbXNfdHhxX2luZm8gKnFpLCAqcDsKLQotCXFpID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJyY21zX3R4cV9pbmZvKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHFpICE9IE5VTEwpIHsKLQkJLyoKLQkJICogSGF2ZSBlbm91Z2ggcm9vbSBmb3IgY29udHJvbCBwYWNrZXRzIGFsb25nIHdpdGggSEkgd2F0ZXJtYXJrCi0JCSAqIEFsc28sIGFkZCByb29tIHRvIHR4cSBmb3IgdG90YWwgcHNxIHBhY2tldHMgaWYgYWxsIHRoZSBTQ0JzCi0JCSAqIGxlYXZlIFBTIG1vZGUuIFRoZSB3YXRlcm1hcmsgZm9yIGZsb3djb250cm9sIHRvIE9TIHBhY2tldHMKLQkJICogd2lsbCByZW1haW4gdGhlIHNhbWUKLQkJICovCi0JCWJyY211X3BrdHFfaW5pdCgmcWktPnEsIEJSQ01TX1BSRUNfQ09VTlQsCi0JCQkgICgyICogd2xjLT5wdWItPnR1bmFibGVzLT5kYXRhaGl3YXQpICsgUEtUUV9MRU5fREVGQVVMVAotCQkJICArIHdsYy0+cHViLT5wc3FfcGt0c190b3RhbCk7Ci0KLQkJLyogYWRkIHRoaXMgcXVldWUgdG8gdGhlIHRoZSBnbG9iYWwgbGlzdCAqLwotCQlwID0gd2xjLT50eF9xdWV1ZXM7Ci0JCWlmIChwID09IE5VTEwpIHsKLQkJCXdsYy0+dHhfcXVldWVzID0gcWk7Ci0JCX0gZWxzZSB7Ci0JCQl3aGlsZSAocC0+bmV4dCAhPSBOVUxMKQotCQkJCXAgPSBwLT5uZXh0OwotCQkJcC0+bmV4dCA9IHFpOwotCQl9Ci0JfQotCXJldHVybiBxaTsKLX0KLQotc3RhdGljIHZvaWQgYnJjbXNfY190eHFfZnJlZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsCi0JCQkgICAgIHN0cnVjdCBicmNtc190eHFfaW5mbyAqcWkpCi17Ci0Jc3RydWN0IGJyY21zX3R4cV9pbmZvICpwOwotCi0JaWYgKHFpID09IE5VTEwpCi0JCXJldHVybjsKLQotCS8qIHJlbW92ZSB0aGUgcXVldWUgZnJvbSB0aGUgbGlua2VkIGxpc3QgKi8KLQlwID0gd2xjLT50eF9xdWV1ZXM7Ci0JaWYgKHAgPT0gcWkpCi0JCXdsYy0+dHhfcXVldWVzID0gcC0+bmV4dDsKLQllbHNlIHsKLQkJd2hpbGUgKHAgIT0gTlVMTCAmJiBwLT5uZXh0ICE9IHFpKQotCQkJcCA9IHAtPm5leHQ7Ci0JCWlmIChwICE9IE5VTEwpCi0JCQlwLT5uZXh0ID0gcC0+bmV4dC0+bmV4dDsKLQl9Ci0KLQlrZnJlZShxaSk7Ci19Ci0KLS8qCi0gKiBGbGFnICdzY2FuIGluIHByb2dyZXNzJyB0byB3aXRoaG9sZCBkeW5hbWljIHBoeSBjYWxpYnJhdGlvbgotICovCi12b2lkIGJyY21zX2Nfc2Nhbl9zdGFydChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0Jd2xjX3BoeV9ob2xkX3VwZCh3bGMtPmJhbmQtPnBpLCBQSFlfSE9MRF9GT1JfU0NBTiwgdHJ1ZSk7Ci19Ci0KLXZvaWQgYnJjbXNfY19zY2FuX3N0b3Aoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCXdsY19waHlfaG9sZF91cGQod2xjLT5iYW5kLT5waSwgUEhZX0hPTERfRk9SX1NDQU4sIGZhbHNlKTsKLX0KLQotdm9pZCBicmNtc19jX2Fzc29jaWF0ZV91cGQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBib29sIHN0YXRlKQotewotCXdsYy0+cHViLT5hc3NvY2lhdGVkID0gc3RhdGU7Ci0Jd2xjLT5jZmctPmFzc29jaWF0ZWQgPSBzdGF0ZTsKLX0KLQotLyoKLSAqIFdoZW4gYSByZW1vdGUgU1RBL0FQIGlzIHJlbW92ZWQgYnkgTWFjODAyMTEsIG9yIHdoZW4gaXQgY2FuIG5vIGxvbmdlciBhY2NlcHQKLSAqIEFNUERVIHRyYWZmaWMsIHBhY2tldHMgcGVuZGluZyBpbiBoYXJkd2FyZSBoYXZlIHRvIGJlIGludmFsaWRhdGVkIHNvIHRoYXQKLSAqIHdoZW4gbGF0ZXIgb24gaGFyZHdhcmUgcmVsZWFzZXMgdGhlbSwgdGhleSBjYW4gYmUgaGFuZGxlZCBhcHByb3ByaWF0ZWx5LgotICovCi12b2lkIGJyY21zX2NfaW52YWxfZG1hX3BrdHMoc3RydWN0IGJyY21zX2hhcmR3YXJlICpodywKLQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJICAgICAgIHZvaWQgKCpkbWFfY2FsbGJhY2tfZm4pKQotewotCXN0cnVjdCBkbWFfcHViICpkbWFoOwotCWludCBpOwotCWZvciAoaSA9IDA7IGkgPCBORklGTzsgaSsrKSB7Ci0JCWRtYWggPSBody0+ZGlbaV07Ci0JCWlmIChkbWFoICE9IE5VTEwpCi0JCQlkbWFfd2Fsa19wYWNrZXRzKGRtYWgsIGRtYV9jYWxsYmFja19mbiwgc3RhKTsKLQl9Ci19Ci0KLWludCBicmNtc19jX2dldF9jdXJiYW5kKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlyZXR1cm4gd2xjLT5iYW5kLT5iYW5kdW5pdDsKLX0KLQotdm9pZCBicmNtc19jX3dhaXRfZm9yX3R4X2NvbXBsZXRpb24oc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBib29sIGRyb3ApCi17Ci0JLyogZmx1c2ggcGFja2V0IHF1ZXVlIHdoZW4gcmVxdWVzdGVkICovCi0JaWYgKGRyb3ApCi0JCWJyY211X3BrdHFfZmx1c2goJndsYy0+cGt0X3F1ZXVlLT5xLCBmYWxzZSwgTlVMTCwgTlVMTCk7Ci0KLQkvKiB3YWl0IGZvciBxdWV1ZSBhbmQgRE1BIGZpZm9zIHRvIHJ1biBkcnkgKi8KLQl3aGlsZSAoIXBrdHFfZW1wdHkoJndsYy0+cGt0X3F1ZXVlLT5xKSB8fAotCSAgICAgICBUWFBLVFBFTkRUT1Qod2xjKSA+IDApIHsKLQkJYnJjbXNfbXNsZWVwKHdsYy0+d2wsIDEpOwotCX0KLX0KLQotaW50IGJyY21zX2Nfc2V0X3BhcihzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGVudW0gd2xjX3Bhcl9pZCBwYXJfaWQsCi0JCSAgICBpbnQgaW50X3ZhbCkKLXsKLQlpbnQgZXJyID0gMDsKLQotCXN3aXRjaCAocGFyX2lkKSB7Ci0JY2FzZSBJT1ZfQkNOX0xJX0JDTjoKLQkJd2xjLT5iY25fbGlfYmNuID0gKHU4KSBpbnRfdmFsOwotCQlpZiAod2xjLT5wdWItPnVwKQotCQkJYnJjbXNfY19iY25fbGlfdXBkKHdsYyk7Ci0JCWJyZWFrOwotCQkvKiBBcyBsb25nIGFzIG92ZXJyaWRlIGlzIGZhbHNlLCB0aGlzIG9ubHkgc2V0cyB0aGUgKnVzZXIqCi0JCSAgIHRhcmdldHMuIFVzZXIgY2FuIHR3aWRkbGUgdGhpcyBhbGwgaGUgd2FudHMgd2l0aCBubyBoYXJtLgotCQkgICB3bGNfcGh5X3R4cG93ZXJfc2V0KCkgZXhwbGljaXRseSBzZXRzIG92ZXJyaWRlIHRvIGZhbHNlIGlmCi0JCSAgIG5vdCBpbnRlcm5hbCBvciB0ZXN0LgotCQkgKi8KLQljYXNlIElPVl9RVFhQT1dFUjp7Ci0JCXU4IHFkYm07Ci0JCWJvb2wgb3ZlcnJpZGU7Ci0KLQkJLyogUmVtb3ZlIG92ZXJyaWRlIGJpdCBhbmQgY2xpcCB0byBtYXggcWRibSB2YWx1ZSAqLwotCQlxZGJtID0gKHU4KW1pbl90KHUzMiwgKGludF92YWwgJiB+V0xfVFhQV1JfT1ZFUlJJREUpLCAweGZmKTsKLQkJLyogRXh0cmFjdCBvdmVycmlkZSBzZXR0aW5nICovCi0JCW92ZXJyaWRlID0gKGludF92YWwgJiBXTF9UWFBXUl9PVkVSUklERSkgPyB0cnVlIDogZmFsc2U7Ci0JCWVyciA9Ci0JCSAgICB3bGNfcGh5X3R4cG93ZXJfc2V0KHdsYy0+YmFuZC0+cGksIHFkYm0sIG92ZXJyaWRlKTsKLQkJYnJlYWs7Ci0JCX0KLQljYXNlIElPVl9NUEM6Ci0JCXdsYy0+bXBjID0gKGJvb2wpaW50X3ZhbDsKLQkJYnJjbXNfY19yYWRpb19tcGNfdXBkKHdsYyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWVyciA9IC1FTk9UU1VQUDsKLQl9Ci0JcmV0dXJuIGVycjsKLX0KLQotaW50IGJyY21zX2NfZ2V0X3BhcihzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGVudW0gd2xjX3Bhcl9pZCBwYXJfaWQsCi0JCSAgICBpbnQgKnJldF9pbnRfcHRyKQotewotCWludCBlcnIgPSAwOwotCi0Jc3dpdGNoIChwYXJfaWQpIHsKLQljYXNlIElPVl9CQ05fTElfQkNOOgotCQkqcmV0X2ludF9wdHIgPSB3bGMtPmJjbl9saV9iY247Ci0JCWJyZWFrOwotCWNhc2UgSU9WX1FUWFBPV0VSOiB7Ci0JCXVpbnQgcWRibTsKLQkJYm9vbCBvdmVycmlkZTsKLQotCQllcnIgPSB3bGNfcGh5X3R4cG93ZXJfZ2V0KHdsYy0+YmFuZC0+cGksICZxZGJtLAotCQkJJm92ZXJyaWRlKTsKLQkJaWYgKGVyciAhPSAwKQotCQkJcmV0dXJuIGVycjsKLQotCQkvKiBSZXR1cm4gcWRibSB1bml0cyAqLwotCQkqcmV0X2ludF9wdHIgPQotCQkgICAgcWRibSB8IChvdmVycmlkZSA/IFdMX1RYUFdSX09WRVJSSURFIDogMCk7Ci0JCWJyZWFrOwotCQl9Ci0JY2FzZSBJT1ZfTVBDOgotCQkqcmV0X2ludF9wdHIgPSAoczMyKSB3bGMtPm1wYzsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZXJyID0gLUVOT1RTVVBQOwotCX0KLQlyZXR1cm4gZXJyOwotfQotCi0vKgotICogU2VhcmNoIHRoZSBuYW1lPXZhbHVlIHZhcnMgZm9yIGEgc3BlY2lmaWMgb25lIGFuZCByZXR1cm4gaXRzIHZhbHVlLgotICogUmV0dXJucyBOVUxMIGlmIG5vdCBmb3VuZC4KLSAqLwotY2hhciAqZ2V0dmFyKGNoYXIgKnZhcnMsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JY2hhciAqczsKLQlpbnQgbGVuOwotCi0JaWYgKCFuYW1lKQotCQlyZXR1cm4gTlVMTDsKLQotCWxlbiA9IHN0cmxlbihuYW1lKTsKLQlpZiAobGVuID09IDApCi0JCXJldHVybiBOVUxMOwotCi0JLyogZmlyc3QgbG9vayBpbiB2YXJzW10gKi8KLQlmb3IgKHMgPSB2YXJzOyBzICYmICpzOykgewotCQlpZiAoKG1lbWNtcChzLCBuYW1lLCBsZW4pID09IDApICYmIChzW2xlbl0gPT0gJz0nKSkKLQkJCXJldHVybiAmc1tsZW4gKyAxXTsKLQotCQl3aGlsZSAoKnMrKykKLQkJCTsKLQl9Ci0JLyogbm90aGluZyBmb3VuZCAqLwotCXJldHVybiBOVUxMOwotfQotCi0vKgotICogU2VhcmNoIHRoZSB2YXJzIGZvciBhIHNwZWNpZmljIG9uZSBhbmQgcmV0dXJuIGl0cyB2YWx1ZSBhcwotICogYW4gaW50ZWdlci4gUmV0dXJucyAwIGlmIG5vdCBmb3VuZC4KLSAqLwotaW50IGdldGludHZhcihjaGFyICp2YXJzLCBjb25zdCBjaGFyICpuYW1lKQotewotCWNoYXIgKnZhbDsKLQotCXZhbCA9IGdldHZhcih2YXJzLCBuYW1lKTsKLQlpZiAodmFsID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIHNpbXBsZV9zdHJ0b3VsKHZhbCwgTlVMTCwgMCk7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL21haW4uaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvbWFpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjA0YjFmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvbWFpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfQlJDTV9NQUlOX0hfCi0jZGVmaW5lIF9CUkNNX01BSU5fSF8KLQotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxicmNtdV91dGlscy5oPgotI2luY2x1ZGUgInR5cGVzLmgiCi0jaW5jbHVkZSAiZDExLmgiCi0KLSNkZWZpbmUgTUFfV0lORE9XX1NaCQk4CS8qIG1vdmluZyBhdmVyYWdlIHdpbmRvdyBzaXplICovCi0jZGVmaW5lCUJSQ01TX0hXUlhPRkYJCTM4CS8qIGNoaXAgcnggYnVmZmVyIG9mZnNldCAqLwotI2RlZmluZQlJTlZDSEFOTkVMCQkyNTUJLyogaW52YWxpZCBjaGFubmVsICovCi0vKiBtYXggIyBzdXBwb3J0ZWQgY29yZSByZXZpc2lvbnMgKDAgLi4gTUFYQ09SRVJFViAtIDEpICovCi0jZGVmaW5lCU1BWENPUkVSRVYJCTI4Ci0vKiBtYXggIyBicmNtc19jX21vZHVsZV9yZWdpc3RlcigpIGNhbGxzICovCi0jZGVmaW5lIEJSQ01TX01BWE1PRFVMRVMJMjIKLQotI2RlZmluZSBTRVFOVU1fU0hJRlQJCTQKLSNkZWZpbmUgQU1QRFVfREVMSU1JVEVSX0xFTgk0Ci0jZGVmaW5lIFNFUU5VTV9NQVgJCTB4MTAwMAotCi0jZGVmaW5lCUFQSFlfQ1dNSU4JCTE1Ci0jZGVmaW5lIFBIWV9DV01BWAkJMTAyMwotCi0jZGVmaW5lIEVEQ0ZfQUlGU05fTUlOICAgICAgICAgICAgICAgMQotI2RlZmluZSBGUkFHTlVNX01BU0sJCTB4RgotCi0jZGVmaW5lIE5UWFJBVEUJCQk2NAkvKiAjIHR4IE1QRFVzIHJhdGUgaXMgcmVwb3J0ZWQgZm9yICovCi0KLSNkZWZpbmUgQlJDTVNfQklUU0NOVCh4KQlicmNtdV9iaXRjb3VudCgodTggKikmKHgpLCBzaXplb2YodTgpKQotCi0vKiBNYXhpbXVtIHdhaXQgdGltZSBmb3IgYSBNQUMgc3VzcGVuZCAqLwotLyogdVM6IDgzbVMgaXMgbWF4IHBhY2tldCB0aW1lICg2NEtCIGFtcGR1IEAgNk1icHMpICovCi0jZGVmaW5lCUJSQ01TX01BWF9NQUNfU1VTUEVORAk4MzAwMAotCi0vKiBQcm9iZSBSZXNwb25zZSB0aW1lb3V0IC0gcmVzcG9uc2VzIGZvciBwcm9iZSByZXF1ZXN0cyBvbGRlciB0aGF0IHRoaXMgYXJlIHRvc3NlZCwgemVybyB0byBkaXNhYmxlCi0gKi8KLSNkZWZpbmUgQlJDTVNfUFJCX1JFU1BfVElNRU9VVAkwCS8qIERpc2FibGUgcHJvYmUgcmVzcG9uc2UgdGltZW91dCAqLwotCi0vKiB0cmFuc21pdCBidWZmZXIgbWF4IGhlYWRyb29tIGZvciBwcm90b2NvbCBoZWFkZXJzICovCi0jZGVmaW5lIFRYT0ZGIChEMTFfVFhIX0xFTiArIEQxMV9QSFlfSERSX0xFTikKLQotI2RlZmluZSBBQ19DT1VOVAkJNAotCi0vKiBNYWNyb3MgZm9yIGRvaW5nIGRlZmluaXRpb24gYW5kIGdldC9zZXQgb2YgYml0ZmllbGRzCi0gKiBVc2FnZSBleGFtcGxlLCBlLmcuIGEgdGhyZWUtYml0IGZpZWxkIChiaXRzIDQtNik6Ci0gKiAgICAjZGVmaW5lIDxOQU1FPl9NCUJJVEZJRUxEX01BU0soMykKLSAqICAgICNkZWZpbmUgPE5BTUU+X1MJNAotICogLi4uCi0gKiAgICByZWd2YWwgPSBSX1JFRyhvc2gsICZyZWdzLT5yZWdmb28pOwotICogICAgZmllbGQgPSBHRklFTEQocmVndmFsLCA8TkFNRT4pOwotICogICAgcmVndmFsID0gU0ZJRUxEKHJlZ3ZhbCwgPE5BTUU+LCAxKTsKLSAqICAgIFdfUkVHKG9zaCwgJnJlZ3MtPnJlZ2ZvbywgcmVndmFsKTsKLSAqLwotI2RlZmluZSBCSVRGSUVMRF9NQVNLKHdpZHRoKSBcCi0JCSgoKHVuc2lnbmVkKTEgPDwgKHdpZHRoKSkgLSAxKQotI2RlZmluZSBHRklFTEQodmFsLCBmaWVsZCkgXAotCQkoKCh2YWwpID4+IGZpZWxkICMjIF9TKSAmIGZpZWxkICMjIF9NKQotI2RlZmluZSBTRklFTEQodmFsLCBmaWVsZCwgYml0cykgXAotCQkoKCh2YWwpICYgKH4oZmllbGQgIyMgX00gPDwgZmllbGQgIyMgX1MpKSkgfCBcCi0JCSAoKHVuc2lnbmVkKShiaXRzKSA8PCBmaWVsZCAjIyBfUykpCi0KLSNkZWZpbmUJU1dfVElNRVJfTUFDX1NUQVRfVVBECQkzMAkvKiBwZXJpb2RpYyBNQUMgc3RhdHMgdXBkYXRlICovCi0KLS8qIERvdWJsZSBjaGVjayB0aGF0IHVuc3VwcG9ydGVkIGNvcmVzIGFyZSBub3QgZW5hYmxlZCAqLwotI2lmIENPTkZfTVNLKEQxMUNPTkYsIDB4NGYpIHx8IENPTkZfR0UoRDExQ09ORiwgTUFYQ09SRVJFVikKLSNlcnJvciAiQ29uZmlndXJhdGlvbiBmb3IgRDExQ09ORiBpbmNsdWRlcyB1bnN1cHBvcnRlZCB2ZXJzaW9ucy4iCi0jZW5kaWYJCQkJLyogQmFkIHZlcnNpb25zICovCi0KLSNkZWZpbmUJVkFMSURfQ09SRVJFVihjb3JlcmV2KQlDT05GX0hBUyhEMTFDT05GLCBjb3JlcmV2KQotCi0vKiB2YWx1ZXMgZm9yIHNob3J0c2xvdF9vdmVycmlkZSAqLwotI2RlZmluZSBCUkNNU19TSE9SVFNMT1RfQVVUTwktMSAvKiBEcml2ZXIgd2lsbCBtYW5hZ2UgU2hvcnRzbG90IHNldHRpbmcgKi8KLSNkZWZpbmUgQlJDTVNfU0hPUlRTTE9UX09GRgkwICAvKiBUdXJuIG9mZiBzaG9ydCBzbG90ICovCi0jZGVmaW5lIEJSQ01TX1NIT1JUU0xPVF9PTgkxICAvKiBUdXJuIG9uIHNob3J0IHNsb3QgKi8KLQotLyogdmFsdWUgZm9yIHNob3J0L2xvbmcgYW5kIG1peG1vZGUvZ3JlZW5maWVsZCBwcmVhbWJsZSAqLwotI2RlZmluZSBCUkNNU19MT05HX1BSRUFNQkxFCSgwKQotI2RlZmluZSBCUkNNU19TSE9SVF9QUkVBTUJMRQkoMSA8PCAwKQotI2RlZmluZSBCUkNNU19HRl9QUkVBTUJMRQkJKDEgPDwgMSkKLSNkZWZpbmUgQlJDTVNfTU1fUFJFQU1CTEUJCSgxIDw8IDIpCi0jZGVmaW5lIEJSQ01TX0lTX01JTU9fUFJFQU1CTEUoX3ByZSkgKCgoX3ByZSkgPT0gQlJDTVNfR0ZfUFJFQU1CTEUpIHx8IFwKLQkJCQkgICAgICAoKF9wcmUpID09IEJSQ01TX01NX1BSRUFNQkxFKSkKLQotLyogdmFsdWVzIGZvciBiYXJrZXJfcHJlYW1ibGUgKi8KLSNkZWZpbmUgQlJDTVNfQkFSS0VSX1NIT1JUX0FMTE9XRUQJMAkvKiBTaG9ydCBwcmUtYW1ibGUgYWxsb3dlZCAqLwotCi0vKiBBIGZpZm8gaXMgZnVsbC4gQ2xlYXIgcHJlY2VkZW5jZXMgcmVsYXRlZCB0byB0aGF0IEZJRk8gKi8KLSNkZWZpbmUgQlJDTVNfVFhfRklGT19DTEVBUih3bGMsIGZpZm8pIFwKLQkJCSgod2xjKS0+dHhfcHJlY19tYXAgJj0gfih3bGMpLT5maWZvMnByZWNfbWFwW2ZpZm9dKQotCi0vKiBGaWZvIGlzIE5PVCBmdWxsLiBFbmFibGUgcHJlY2VkZW5jZXMgZm9yIHRoYXQgRklGTyAqLwotI2RlZmluZSBCUkNNU19UWF9GSUZPX0VOQUIod2xjLCBmaWZvKSBcCi0JCQkoKHdsYyktPnR4X3ByZWNfbWFwIHw9ICh3bGMpLT5maWZvMnByZWNfbWFwW2ZpZm9dKQotCi0vKiBUeEZyYW1lSUQgKi8KLS8qIHNlcSBhbmQgZnJhZyBiaXRzOiBTRVFOVU1fU0hJRlQsIEZSQUdOVU1fTUFTSyAoODAyLjExLmgpICovCi0vKiByYXRlIGVwb2NoIGJpdHM6IFRYRklEX1JBVEVfU0hJRlQsIFRYRklEX1JBVEVfTUFTSyAoKHdsY19yYXRlLmMpICovCi0jZGVmaW5lIFRYRklEX1FVRVVFX01BU0sJMHgwMDA3CS8qIEJpdHMgMC0yICovCi0jZGVmaW5lIFRYRklEX1NFUV9NQVNLCQkweDdGRTAJLyogQml0cyA1LTE1ICovCi0jZGVmaW5lIFRYRklEX1NFUV9TSElGVAkJNQkvKiBOdW1iZXIgb2YgYml0IHNoaWZ0cyAqLwotI2RlZmluZQlUWEZJRF9SQVRFX1BST0JFX01BU0sJMHg4MDAwCS8qIEJpdCAxNSBmb3IgcmF0ZSBwcm9iZSAqLwotI2RlZmluZSBUWEZJRF9SQVRFX01BU0sJCTB4MDAxOAkvKiBNYXNrIGZvciBiaXRzIDMgYW5kIDQgKi8KLSNkZWZpbmUgVFhGSURfUkFURV9TSElGVAkzCS8qIFNoaWZ0IDMgYml0cyBmb3IgcmF0ZSBtYXNrICovCi0KLS8qIHByb21vdGUgYm9hcmRyZXYgKi8KLSNkZWZpbmUgQk9BUkRSRVZfUFJPTU9UQUJMRQkweEZGCS8qIGZyb20gKi8KLSNkZWZpbmUgQk9BUkRSRVZfUFJPTU9URUQJMQkvKiB0byAqLwotCi0vKiBpZiB3cGEgaXMgaW4gdXNlIHRoZW4gcG9ydG9wZW4gaXMgdHJ1ZSB3aGVuIHRoZSBncm91cCBrZXkgaXMgcGx1bWJlZCBvdGhlcndpc2UgaXQgaXMgYWx3YXlzIHRydWUKLSAqLwotI2RlZmluZSBXU0VDX0VOQUJMRUQod3NlYykgKCh3c2VjKSAmIChXRVBfRU5BQkxFRCB8IFRLSVBfRU5BQkxFRCB8IEFFU19FTkFCTEVEKSkKLSNkZWZpbmUgQlJDTVNfU1dfS0VZUyh3bGMsIGJzc2NmZykgKCgoKHdsYyktPndzZWNfc3drZXlzKSB8fCBcCi0JKChic3NjZmcpLT53c2VjICYgV1NFQ19TV0ZMQUcpKSkKLQotI2RlZmluZSBCUkNNU19QT1JUT1BFTihjZmcpIFwKLQkoKChjZmcpLT5XUEFfYXV0aCAhPSBXUEFfQVVUSF9ESVNBQkxFRCAmJiBXU0VDX0VOQUJMRUQoKGNmZyktPndzZWMpKSA/IFwKLQkoY2ZnKS0+d3NlY19wb3J0b3BlbiA6IHRydWUpCi0KLSNkZWZpbmUgUFNfQUxMT1dFRCh3bGMpCWJyY21zX2NfcHNfYWxsb3dlZCh3bGMpCi0KLSNkZWZpbmUgREFUQV9CTE9DS19UWF9TVVBSCSgxIDw8IDQpCi0KLS8qIDgwMi4xRCBQcmlvcml0eSB0byBUWCBGSUZPIG51bWJlciBmb3Igd21lICovCi1leHRlcm4gY29uc3QgdTggcHJpbzJmaWZvW107Ci0KLS8qIFVjb2RlIE1DVExfV0FLRSBvdmVycmlkZSBiaXRzICovCi0jZGVmaW5lIEJSQ01TX1dBS0VfT1ZFUlJJREVfQ0xLQ1RMCTB4MDEKLSNkZWZpbmUgQlJDTVNfV0FLRV9PVkVSUklERV9QSFlSRUcJMHgwMgotI2RlZmluZSBCUkNNU19XQUtFX09WRVJSSURFX01BQ1NVU1BFTkQJMHgwNAotI2RlZmluZSBCUkNNU19XQUtFX09WRVJSSURFX1RYRklGTwkweDA4Ci0jZGVmaW5lIEJSQ01TX1dBS0VfT1ZFUlJJREVfRk9SQ0VGQVNUCTB4MTAKLQotLyogc3R1ZmYgcHVsbGVkIGluIGZyb20gd2xjLmMgKi8KLQotLyogSW50ZXJydXB0IGJpdCBlcnJvciBzdW1tYXJ5LiAgRG9uJ3QgaW5jbHVkZSBJX1JVOiB3ZSByZWZpbGwgRE1BIGF0IG90aGVyCi0gKiB0aW1lczsgYW5kIGlmIHdlIHJ1biBvdXQsIGNvbnN0YW50IElfUlUgaW50ZXJydXB0cyBtYXkgY2F1c2UgbG9ja3VwLiAgV2UKLSAqIHdpbGwgc3RpbGwgZ2V0IGVycm9yIGNvdW50cyBmcm9tIHJ4MG92ZmwuCi0gKi8KLSNkZWZpbmUJSV9FUlJPUlMJKElfUEMgfCBJX1BEIHwgSV9ERSB8IElfUk8gfCBJX1hVKQotLyogZGVmYXVsdCBzb2Z0d2FyZSBpbnRtYXNrcyAqLwotI2RlZmluZQlERUZfUlhJTlRNQVNLCShJX1JJKQkvKiBlbmFibGUgcnggaW50IG9uIHJ4ZmlmbyBvbmx5ICovCi0jZGVmaW5lCURFRl9NQUNJTlRNQVNLCShNSV9UWFNUT1AgfCBNSV9UQlRUIHwgTUlfQVRJTVdJTkVORCB8IE1JX1BNUSB8IFwKLQkJCSBNSV9QSFlUWEVSUiB8IE1JX0RNQUlOVCB8IE1JX1RGUyB8IE1JX0JHX05PSVNFIHwgXAotCQkJIE1JX0NDQSB8IE1JX1RPIHwgTUlfR1AwIHwgTUlfUkZESVNBQkxFIHwgTUlfUFdSVVApCi0KLSNkZWZpbmUJUkVUUllfU0hPUlRfREVGCQkJNwkvKiBEZWZhdWx0IFNob3J0IHJldHJ5IExpbWl0ICovCi0jZGVmaW5lCVJFVFJZX1NIT1JUX01BWAkJCTI1NQkvKiBNYXhpbXVtIFNob3J0IHJldHJ5IExpbWl0ICovCi0jZGVmaW5lCVJFVFJZX0xPTkdfREVGCQkJNAkvKiBEZWZhdWx0IExvbmcgcmV0cnkgY291bnQgKi8KLSNkZWZpbmUJUkVUUllfU0hPUlRfRkIJCQkzCS8qIFNob3J0IHJldHJ5IGNvdW50IGZvciBmYWxsYmFjayByYXRlICovCi0jZGVmaW5lCVJFVFJZX0xPTkdfRkIJCQkyCS8qIExvbmcgcmV0cnkgY291bnQgZm9yIGZhbGxiYWNrIHJhdGUgKi8KLQotI2RlZmluZQlNQVhUWFBLVFMJCTYJLyogbWF4ICMgcGt0cyBwZW5kaW5nICovCi0KLS8qIGZyYW1lYnVyc3QgKi8KLSNkZWZpbmUJTUFYVFhGUkFNRUJVUlNUCQk4CS8qIHZhbmlsbGEgeHByZXNzIG1vZGU6IG1heCBmcmFtZXMvYnVyc3QgKi8KLSNkZWZpbmUJTUFYRlJBTUVCVVJTVF9UWE9QCTEwMDAwCS8qIEZyYW1lYnVyc3QgVFhPUCBpbiB1c2VjICovCi0KLS8qIFBlci1BQyByZXRyeSBsaW1pdCByZWdpc3RlciBkZWZpbml0aW9uczsgdXNlcyBkZWZzLmggYml0ZmllbGQgbWFjcm9zICovCi0jZGVmaW5lIEVEQ0ZfU0hPUlRfUyAgICAgICAgICAgIDAKLSNkZWZpbmUgRURDRl9TRkJfUyAgICAgICAgICAgICAgNAotI2RlZmluZSBFRENGX0xPTkdfUyAgICAgICAgICAgICA4Ci0jZGVmaW5lIEVEQ0ZfTEZCX1MgICAgICAgICAgICAgIDEyCi0jZGVmaW5lIEVEQ0ZfU0hPUlRfTSAgICAgICAgICAgIEJJVEZJRUxEX01BU0soNCkKLSNkZWZpbmUgRURDRl9TRkJfTSAgICAgICAgICAgICAgQklURklFTERfTUFTSyg0KQotI2RlZmluZSBFRENGX0xPTkdfTSAgICAgICAgICAgICBCSVRGSUVMRF9NQVNLKDQpCi0jZGVmaW5lIEVEQ0ZfTEZCX00gICAgICAgICAgICAgIEJJVEZJRUxEX01BU0soNCkKLQotI2RlZmluZQlORklGTwkJCTYJLyogIyB0eC9yeCBmaWZvcGFpcnMgKi8KLQotI2RlZmluZSBCUkNNU19XTUVfUkVUUllfU0hPUlRfR0VUKHdsYywgYWMpIFwKLQkJCQkJR0ZJRUxEKHdsYy0+d21lX3JldHJpZXNbYWNdLCBFRENGX1NIT1JUKQotI2RlZmluZSBCUkNNU19XTUVfUkVUUllfU0ZCX0dFVCh3bGMsIGFjKSBcCi0JCQkJCUdGSUVMRCh3bGMtPndtZV9yZXRyaWVzW2FjXSwgRURDRl9TRkIpCi0jZGVmaW5lIEJSQ01TX1dNRV9SRVRSWV9MT05HX0dFVCh3bGMsIGFjKSBcCi0JCQkJCUdGSUVMRCh3bGMtPndtZV9yZXRyaWVzW2FjXSwgRURDRl9MT05HKQotI2RlZmluZSBCUkNNU19XTUVfUkVUUllfTEZCX0dFVCh3bGMsIGFjKSBcCi0JCQkJCUdGSUVMRCh3bGMtPndtZV9yZXRyaWVzW2FjXSwgRURDRl9MRkIpCi0KLSNkZWZpbmUgQlJDTVNfV01FX1JFVFJZX1NIT1JUX1NFVCh3bGMsIGFjLCB2YWwpIFwKLQkod2xjLT53bWVfcmV0cmllc1thY10gPSBTRklFTEQod2xjLT53bWVfcmV0cmllc1thY10sIEVEQ0ZfU0hPUlQsIHZhbCkpCi0jZGVmaW5lIEJSQ01TX1dNRV9SRVRSWV9TRkJfU0VUKHdsYywgYWMsIHZhbCkgXAotCSh3bGMtPndtZV9yZXRyaWVzW2FjXSA9IFNGSUVMRCh3bGMtPndtZV9yZXRyaWVzW2FjXSwgRURDRl9TRkIsIHZhbCkpCi0jZGVmaW5lIEJSQ01TX1dNRV9SRVRSWV9MT05HX1NFVCh3bGMsIGFjLCB2YWwpIFwKLQkod2xjLT53bWVfcmV0cmllc1thY10gPSBTRklFTEQod2xjLT53bWVfcmV0cmllc1thY10sIEVEQ0ZfTE9ORywgdmFsKSkKLSNkZWZpbmUgQlJDTVNfV01FX1JFVFJZX0xGQl9TRVQod2xjLCBhYywgdmFsKSBcCi0JKHdsYy0+d21lX3JldHJpZXNbYWNdID0gU0ZJRUxEKHdsYy0+d21lX3JldHJpZXNbYWNdLCBFRENGX0xGQiwgdmFsKSkKLQotLyogUExMIHJlcXVlc3RzICovCi0KLS8qIHBsbCBpcyBzaGFyZWQgb24gb2xkIGNoaXBzICovCi0jZGVmaW5lIEJSQ01TX1BMTFJFUV9TSEFSRUQJMHgxCi0vKiBob2xkIHBsbCBmb3IgcmFkaW8gbW9uaXRvciByZWdpc3RlciBjaGVja2luZyAqLwotI2RlZmluZSBCUkNNU19QTExSRVFfUkFESU9fTU9OCTB4MgotLyogaG9sZC9yZWxlYXNlIHBsbCBmb3Igc29tZSBzaG9ydCBvcGVyYXRpb24gKi8KLSNkZWZpbmUgQlJDTVNfUExMUkVRX0ZMSVAJCTB4NAotCi0vKgotICogTWFjcm9zIHRvIGNoZWNrIGlmIEFQIG9yIFNUQSBpcyBhY3RpdmUuCi0gKiBBUCBBY3RpdmUgbWVhbnMgbW9yZSB0aGFuIGp1c3QgY29uZmlndXJlZDogZHJpdmVyIGFuZCBCU1MgYXJlICJ1cCI7Ci0gKiB0aGF0IGlzLCB3ZSBhcmUgYmVhY29uaW5nL3Jlc3BvbmRpbmcgYXMgYW4gQVAgKGFwc19hc3NvY2lhdGVkKS4KLSAqIFNUQSBBY3RpdmUgc2ltaWxhcmx5IG1lYW5zIHRoZSBkcml2ZXIgaXMgdXAgYW5kIGEgY29uZmlndXJlZCBTVEEgQlNTCi0gKiBpcyB1cDogZWl0aGVyIGFzc29jaWF0ZWQgKHN0YXNfYXNzb2NpYXRlZCkgb3IgdHJ5aW5nLgotICoKLSAqIE1hY3JvIGRlZmluaXRpb25zIHZhcnkgYXMgcGVyIEFQL1NUQSBpZmRlZnMsIGFsbG93aW5nIHJlZmVyZW5jZXMgdG8KLSAqIGlmZGVmJ2Qgc3RydWN0dXJlIGZpZWxkcyBhbmQgY29uc3RhbnQgdmFsdWVzICgwKSBmb3Igb3B0aW1pemF0aW9uLgotICogTWFrZSBzdXJlIHRvIGVuY2xvc2UgYmxvY2tzIG9mIGNvZGUgc3VjaCB0aGF0IGFueSByb3V0aW5lcyB0aGV5Ci0gKiByZWZlcmVuY2UgY2FuIGFsc28gYmUgdW51c2VkIGFuZCBvcHRpbWl6ZWQgb3V0IGJ5IHRoZSBsaW5rZXIuCi0gKi8KLS8qIE5PVEU6IFJlZmVyZW5jZXMgc3RydWN0dXJlIGZpZWxkcyBkZWZpbmVkIGluIHdsYy5oICovCi0jZGVmaW5lIEFQX0FDVElWRSh3bGMpCSgwKQotCi0vKgotICogRGV0ZWN0IENhcmQgcmVtb3ZlZC4KLSAqIEV2ZW4gY2hlY2tpbmcgYW4gc2Jjb25maWcgcmVnaXN0ZXIgcmVhZCB3aWxsIG5vdCBmYWxzZSB0cmlnZ2VyIHdoZW4gdGhlIGNvcmUgaXMgaW4gcmVzZXQuCi0gKiBpdCBicmVha3MgQ0YgYWRkcmVzcyBtZWNoYW5pc20uIEFjY2Vzc2luZyBncGh5IHBoeXZlcnNpb24gd2lsbCBjYXVzZSBTQiBlcnJvciBpZiBhcGh5Ci0gKiBpcyBpbiByZXNldCBvbiA0MzA2QjAtREIuIE5lZWQgYSBzaW1wbGUgYWNjZXNzaWJsZSByZWcgd2l0aCBmaXhlZCAwLzEgcGF0dGVybgotICogKHNvbWUgcGxhdGZvcm1zIHJldHVybiBhbGwgMCkuCi0gKiBJZiBjbG9ja3MgYXJlIHByZXNlbnQsIGNhbGwgdGhlIHNiIHJvdXRpbmUgd2hpY2ggd2lsbCBmaWd1cmUgb3V0IGlmIHRoZSBkZXZpY2UgaXMgcmVtb3ZlZC4KLSAqLwotI2RlZmluZSBERVZJQ0VSRU1PVkVEKHdsYykgICAgICBcCi0JKCh3bGMtPmh3LT5jbGspID8gICBcCi0JKChSX1JFRygmd2xjLT5ody0+cmVncy0+bWFjY29udHJvbCkgJiBcCi0JKE1DVExfUFNNX0pNUF8wIHwgTUNUTF9JSFJfRU4pKSAhPSBNQ1RMX0lIUl9FTikgOiBcCi0JKGFpX2RldmljZXJlbW92ZWQod2xjLT5ody0+c2loKSkpCi0KLSNkZWZpbmUgQlJDTVNfVU5JVCh3bGMpCQkoKHdsYyktPnB1Yi0+dW5pdCkKLQotc3RydWN0IGJyY21zX3Byb3RlY3Rpb24gewotCWJvb2wgX2c7CQkvKiB1c2UgZyBzcGVjIHByb3RlY3Rpb24sIGRyaXZlciBpbnRlcm5hbCAqLwotCXM4IGdfb3ZlcnJpZGU7CS8qIG92ZXJyaWRlIGZvciB1c2Ugb2YgZyBzcGVjIHByb3RlY3Rpb24gKi8KLQl1OCBnbW9kZV91c2VyOwkvKiB1c2VyIGNvbmZpZyBnbW9kZSwgb3BlcmF0aW5nIGJhbmQtPmdtb2RlIGlzIGRpZmZlcmVudCAqLwotCXM4IG92ZXJsYXA7CQkvKiBPdmVybGFwIEJTUy9JQlNTIHByb3RlY3Rpb24gZm9yIGJvdGggMTFnIGFuZCAxMW4gKi8KLQlzOCBubW9kZV91c2VyOwkvKiB1c2VyIGNvbmZpZyBubW9kZSwgb3BlcmF0aW5nIHB1Yi0+bm1vZGUgaXMgZGlmZmVyZW50ICovCi0Jczggbl9jZmc7CQkvKiB1c2UgT0ZETSBwcm90ZWN0aW9uIG9uIE1JTU8gZnJhbWVzICovCi0Jczggbl9jZmdfb3ZlcnJpZGU7CS8qIG92ZXJyaWRlIGZvciB1c2Ugb2YgTiBwcm90ZWN0aW9uICovCi0JYm9vbCBub25nZjsJCS8qIG5vbi1HRiBwcmVzZW50IHByb3RlY3Rpb24gKi8KLQlzOCBub25nZl9vdmVycmlkZTsJLyogb3ZlcnJpZGUgZm9yIHVzZSBvZiBHRiBwcm90ZWN0aW9uICovCi0Jczggbl9wYW1fb3ZlcnJpZGU7CS8qIG92ZXJyaWRlIGZvciBwcmVhbWJsZTogTU0gb3IgR0YgKi8KLQlib29sIG5fb2JzczsJCS8qIGluZGljYXRlZCBPQlNTIE5vbi1IVCBTVEEgcHJlc2VudCAqLwotfTsKLQotLyogYW55dGhpbmcgYWZmZWN0cyB0aGUgc2luZ2xlL2R1YWwgc3RyZWFtcy9hbnRlbm5hIG9wZXJhdGlvbiAqLwotc3RydWN0IGJyY21zX3N0ZiB7Ci0JdTggaHdfdHhjaGFpbjsJLyogSFcgdHhjaGFpbiBiaXRtYXAgY2ZnICovCi0JdTggdHhjaGFpbjsJCS8qIHR4Y2hhaW4gYml0bWFwIGJlaW5nIHVzZWQgKi8KLQl1OCB0eHN0cmVhbXM7CS8qIG51bWJlciBvZiB0eGNoYWlucyBiZWluZyB1c2VkICovCi0KLQl1OCBod19yeGNoYWluOwkvKiBIVyByeGNoYWluIGJpdG1hcCBjZmcgKi8KLQl1OCByeGNoYWluOwkJLyogcnhjaGFpbiBiaXRtYXAgYmVpbmcgdXNlZCAqLwotCXU4IHJ4c3RyZWFtczsJLyogbnVtYmVyIG9mIHJ4Y2hhaW5zIGJlaW5nIHVzZWQgKi8KLQotCXU4IGFudF9yeF9vdnI7CS8qIHJ4IGFudGVubmEgb3ZlcnJpZGUgKi8KLQlzOCB0eGFudDsJCS8qIHVzZXJUeCBhbnRlbm5hIHNldHRpbmcgKi8KLQl1MTYgcGh5dHhhbnQ7CS8qIHBoeVR4IGFudGVubmEgc2V0dGluZyBpbiB0eGhlYWRlciAqLwotCi0JdTggc3Nfb3Btb2RlOwkvKiBzaW5nbGVzdHJlYW0gT3BlcmF0aW9uYWwgbW9kZSwgMDpzaXNvOyAxOmNkZCAqLwotCWJvb2wgc3NfYWxnb3NlbF9hdXRvOwkvKiBpZiB0cnVlLCB1c2Ugd2xjLT5zdGYtPnNzX2FsZ29fY2hhbm5lbDsgKi8KLQkvKiBlbHNlIHVzZSB3bGMtPmJhbmQtPnN0Zi0+c3NfbW9kZV9iYW5kOyAqLwotCXUxNiBzc19hbGdvX2NoYW5uZWw7CS8qIHNzIGJhc2VkIG9uIHBlci1jaGFubmVsIGFsZ286IDA6IFNJU08sIDE6IENERCAyOiBTVEJDICovCi0JdTggbm9fY2Rkc3RiYzsJLyogc3RmIG92ZXJyaWRlLCAxOiBubyBDREQgKG9yIFNUQkMpIGFsbG93ZWQgKi8KLQotCXU4IHJ4Y2hhaW5fcmVzdG9yZV9kZWxheTsJLyogZGVsYXkgdGltZSB0byByZXN0b3JlIGRlZmF1bHQgcnhjaGFpbiAqLwotCi0JczggbGRwYzsJCS8qIEFVVE8vT04vT0ZGIGxkcGMgY2FwIHN1cHBvcnRlZCAqLwotCXU4IHR4Y29yZVtNQVhfU1RSRUFNU19TVVBQT1JURUQgKyAxXTsJLyogYml0bWFwIG9mIHNlbGVjdGVkIGNvcmUgZm9yIGVhY2ggTnN0cyAqLwotCXM4IHNwYXRpYWxfcG9saWN5OwotfTsKLQotI2RlZmluZSBCUkNNU19TVEZfU1NfU1RCQ19UWCh3bGMsIHNjYikgXAotCSgoKHdsYyktPnN0Zi0+dHhzdHJlYW1zID4gMSkgJiYgKCgod2xjKS0+YmFuZC0+YmFuZF9zdGZfc3RiY190eCA9PSBPTikgfHwgXAotCSAoU0NCX1NUQkNfQ0FQKChzY2IpKSAmJgkJCQkJXAotCSAgKHdsYyktPmJhbmQtPmJhbmRfc3RmX3N0YmNfdHggPT0gQVVUTyAmJgkJCVwKLQkgIGlzc2V0KCYoKHdsYyktPnN0Zi0+c3NfYWxnb19jaGFubmVsKSwgUEhZX1RYQzFfTU9ERV9TVEJDKSkpKQotCi0jZGVmaW5lIEJSQ01TX1NUQkNfQ0FQX1BIWSh3bGMpIChCUkNNU19JU05QSFkod2xjLT5iYW5kKSAmJiBcCi0JCQkJIE5SRVZfR0Uod2xjLT5iYW5kLT5waHlyZXYsIDMpKQotCi0jZGVmaW5lIEJSQ01TX1NHSV9DQVBfUEhZKHdsYykgKChCUkNNU19JU05QSFkod2xjLT5iYW5kKSAmJiBcCi0JCQkJIE5SRVZfR0Uod2xjLT5iYW5kLT5waHlyZXYsIDMpKSB8fCBcCi0JCQkJQlJDTVNfSVNMQ05QSFkod2xjLT5iYW5kKSkKLQotI2RlZmluZSBCUkNNU19DSEFOX1BIWVRZUEUoeCkgICAgICgoKHgpICYgUlhTX0NIQU5fUEhZVFlQRV9NQVNLKSBcCi0JCQkJICAgPj4gUlhTX0NIQU5fUEhZVFlQRV9TSElGVCkKLSNkZWZpbmUgQlJDTVNfQ0hBTl9DSEFOTkVMKHgpICAgICAoKCh4KSAmIFJYU19DSEFOX0lEX01BU0spIFwKLQkJCQkgICA+PiBSWFNfQ0hBTl9JRF9TSElGVCkKLSNkZWZpbmUgQlJDTVNfUlhfQ0hBTk5FTChyeGgpCShCUkNNU19DSEFOX0NIQU5ORUwoKHJ4aCktPlJ4Q2hhbikpCi0KLS8qIGJyY21zX2Jzc19pbmZvIGZsYWcgYml0IHZhbHVlcyAqLwotI2RlZmluZSBCUkNNU19CU1NfSFQJCTB4MDAyMAkvKiBCU1MgaXMgSFQgKE1JTU8pIGNhcGFibGUgKi8KLQotLyogRmxhZ3MgdXNlZCBpbiBicmNtc19jX3R4cV9pbmZvLnN0b3BwZWQgKi8KLSNkZWZpbmUgVFhRX1NUT1BfRk9SX1BSSU9GQ19NQVNLCTB4MDAwMDAwRkYJLyogcGVyIHByaW8gZmxvdyBjb250cm9sIGJpdHMgKi8KLSNkZWZpbmUgVFhRX1NUT1BfRk9SX1BLVF9EUkFJTgkJMHgwMDAwMDEwMAkvKiBzdG9wIHR4cSBlbnF1ZXVlIGZvciBwYWNrZXQgZHJhaW4gKi8KLSNkZWZpbmUgVFhRX1NUT1BfRk9SX0FNUERVX0ZMT1dfQ05UUkwJMHgwMDAwMDIwMAkvKiBzdG9wIHR4cSBlbnF1ZXVlIGZvciBhbXBkdSBmbG93IGNvbnRyb2wgKi8KLQotI2RlZmluZSBCUkNNU19IVF9XRVBfUkVTVFJJQ1QJMHgwMQkvKiByZXN0cmljdCBIVCB3aXRoIFdFUCAqLwotI2RlZmluZSBCUkNNU19IVF9US0lQX1JFU1RSSUNUCTB4MDIJLyogcmVzdHJpY3QgSFQgd2l0aCBUS0lQICovCi0KLS8qIE1heGltdW0gIyBvZiBrZXlzIHRoYXQgd2wgZHJpdmVyIHN1cHBvcnRzIGluIFMvVy4KLSAqIEtleXMgc3VwcG9ydGVkIGluIEgvVyBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gV1NFQ19NQVhfS0VZUy4KLSAqLwotI2RlZmluZSBXU0VDX01BWF9LRVlTCQk1NAkvKiBNYXggIyBvZiBrZXlzICg1MCArIDQgZGVmYXVsdCBrZXlzKSAqLwotI2RlZmluZSBCUkNNU19ERUZBVUxUX0tFWVMJNAkvKiBEZWZhdWx0ICMgb2Yga2V5cyAqLwotCi0vKgotKiBNYXggIyBvZiBrZXlzIGN1cnJlbnRseSBzdXBwb3J0ZWQ6Ci0qCi0qICAgICBzL3cga2V5cyBpZiBXU0VDX1NXKHdsYy0+d3NlYykuCi0qICAgICBoL3cga2V5cyBvdGhlcndpc2UuCi0qLwotI2RlZmluZSBCUkNNU19NQVhfV1NFQ19LRVlTKHdsYykgV1NFQ19NQVhfS0VZUwotCi0vKiBudW1iZXIgb2YgODAyLjExIGRlZmF1bHQgKG5vbi1wYWlyZWQsIGdyb3VwIGtleXMpICovCi0jZGVmaW5lIFdTRUNfTUFYX0RFRkFVTFRfS0VZUwk0CS8qICMgb2YgZGVmYXVsdCBrZXlzICovCi0KLXN0cnVjdCB3c2VjX2l2IHsKLQl1MzIgaGk7CQkvKiB1cHBlciAzMiBiaXRzIG9mIElWICovCi0JdTE2IGxvOwkJLyogbG93ZXIgMTYgYml0cyBvZiBJViAqLwotfTsKLQotI2RlZmluZSBCUkNNU19OVU1SWElWUwkxNgkvKiAjIHJ4IElWcyAob25lIHBlciA4MDIuMTFlIFRJRCkgKi8KLQotc3RydWN0IHdzZWNfa2V5IHsKLQl1OCBlYVtFVEhfQUxFTl07CS8qIHBlciBzdGF0aW9uICovCi0JdTggaWR4OwkJLyoga2V5IGluZGV4IGluIHdzZWNfa2V5cyBhcnJheSAqLwotCXU4IGlkOwkJLyoga2V5IElEIFswLTNdICovCi0JdTggYWxnbzsJCS8qIENSWVBUT19BTEdPX0FFU19DQ00sIENSWVBUT19BTEdPX1dFUDEyOCwgZXRjICovCi0JdTggcmNtdGE7CQkvKiByY210YSBlbnRyeSBpbmRleCwgc2FtZSBhcyBpZHggYnkgZGVmYXVsdCAqLwotCXUxNiBmbGFnczsJCS8qIG1pc2MgZmxhZ3MgKi8KLQl1OCBhbGdvX2h3OwkJLyogY2FjaGUgZm9yIGh3IHJlZ2lzdGVyICovCi0JdTggYWVzX21vZGU7CQkvKiBjYWNoZSBmb3IgaHcgcmVnaXN0ZXIgKi8KLQlzOCBpdl9sZW47CQkvKiBJViBsZW5ndGggKi8KLQlzOCBpY3ZfbGVuOwkJLyogSUNWIGxlbmd0aCAqLwotCXUzMiBsZW47CQkvKiBrZXkgbGVuZ3RoLi5kb24ndCBtb3ZlIHRoaXMgdmFyICovCi0JLyogZGF0YSBpcyA0Ynl0ZSBhbGlnbmVkICovCi0JdTggZGF0YVtXTEFOX01BWF9LRVlfTEVOXTsJLyoga2V5IGRhdGEgKi8KLQlzdHJ1Y3Qgd3NlY19pdiByeGl2W0JSQ01TX05VTVJYSVZTXTsJLyogUnggSVYgKG9uZSBwZXIgVElEKSAqLwotCXN0cnVjdCB3c2VjX2l2IHR4aXY7CQkvKiBUeCBJViAqLwotfTsKLQotLyoKLSAqIGNvcmUgc3RhdGUgKG1hYykKLSAqLwotc3RydWN0IGJyY21zX2NvcmUgewotCXVpbnQgY29yZWlkeDsJCS8qICMgc2IgZW51bWVyYXRlZCBjb3JlICovCi0KLQkvKiBmaWZvICovCi0JdWludCAqdHhhdmFpbFtORklGT107CS8qICMgdHggZGVzY3JpcHRvcnMgYXZhaWxhYmxlICovCi0JczE2IHR4cGt0cGVuZFtORklGT107CS8qIHR4IGFkbWlzc2lvbiBjb250cm9sICovCi0KLQlzdHJ1Y3QgbWFjc3RhdCAqbWFjc3RhdF9zbmFwc2hvdDsJLyogbWFjIGh3IHByZXYgcmVhZCB2YWx1ZXMgKi8KLX07Ci0KLS8qCi0gKiBiYW5kIHN0YXRlIChwaHkrYW5hK3JhZGlvKQotICovCi1zdHJ1Y3QgYnJjbXNfYmFuZCB7Ci0JaW50IGJhbmR0eXBlOwkJLyogQlJDTV9CQU5EXzJHLCBCUkNNX0JBTkRfNUcgKi8KLQl1aW50IGJhbmR1bml0OwkJLyogYmFuZHN0YXRlW10gaW5kZXggKi8KLQotCXUxNiBwaHl0eXBlOwkJLyogcGh5dHlwZSAqLwotCXUxNiBwaHlyZXY7Ci0JdTE2IHJhZGlvaWQ7Ci0JdTE2IHJhZGlvcmV2OwotCXN0cnVjdCBicmNtc19waHlfcHViICpwaTsgLyogcG9pbnRlciB0byBwaHkgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KLQlib29sIGFiZ3BoeV9lbmNvcmU7Ci0KLQl1OCBnbW9kZTsJCS8qIGN1cnJlbnRseSBhY3RpdmUgZ21vZGUgKi8KLQotCXN0cnVjdCBzY2IgKmh3cnNfc2NiOwkvKiBwZXJtYW5lbnQgc2NiIGZvciBodyByYXRlc2V0ICovCi0KLQl3bGNfcmF0ZXNldF90IGRlZnJhdGVzZXQ7CS8qIGJhbmQtc3BlY2lmaWMgY29weSBvZiBkZWZhdWx0X2Jzcy5yYXRlc2V0ICovCi0KLQlyYXRlc3BlY190IHJzcGVjX292ZXJyaWRlOwkvKiA4MDIuMTEgcmF0ZSBvdmVycmlkZSAqLwotCXJhdGVzcGVjX3QgbXJzcGVjX292ZXJyaWRlOwkvKiBtdWx0aWNhc3QgcmF0ZSBvdmVycmlkZSAqLwotCXU4IGJhbmRfc3RmX3NzX21vZGU7CS8qIENvbmZpZ3VyZWQgU1RGIHR5cGUsIDA6c2lzbzsgMTpjZGQgKi8KLQlzOCBiYW5kX3N0Zl9zdGJjX3R4OwkvKiBTVEJDIFRYIDA6b2ZmOyAxOmZvcmNlIG9uOyAtMTphdXRvICovCi0Jd2xjX3JhdGVzZXRfdCBod19yYXRlc2V0OwkvKiByYXRlcyBzdXBwb3J0ZWQgYnkgY2hpcCAocGh5LXNwZWNpZmljKSAqLwotCXU4IGJhc2ljX3JhdGVbQlJDTV9NQVhSQVRFICsgMV07IC8qIGJhc2ljIHJhdGVzIGluZGV4ZWQgYnkgcmF0ZSAqLwotCWJvb2wgbWltb19jYXBfNDA7CS8qIDQwIE1IeiBjYXAgZW5hYmxlZCBvbiB0aGlzIGJhbmQgKi8KLQlzOCBhbnRnYWluOwkJLyogYW50ZW5uYSBnYWluIGZyb20gc3JvbSAqLwotCi0JdTE2IENXbWluOwkJLyogVGhlIG1pbmltdW0gc2l6ZSBvZiBjb250ZW50aW9uIHdpbmRvdywgaW4gdW5pdCBvZiBhU2xvdFRpbWUgKi8KLQl1MTYgQ1dtYXg7CQkvKiBUaGUgbWF4aW11bSBzaXplIG9mIGNvbnRlbnRpb24gd2luZG93LCBpbiB1bml0IG9mIGFTbG90VGltZSAqLwotCXUxNiBiY250c2ZvZmY7CS8qIGJlYWNvbiB0c2Ygb2Zmc2V0ICovCi19OwotCi0vKiB0eCBjb21wbGV0aW9uIGNhbGxiYWNrIHRha2VzIDMgYXJncyAqLwotdHlwZWRlZiB2b2lkICgqcGtjYl9mbl90KSAoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB1aW50IHR4c3RhdHVzLCB2b2lkICphcmcpOwotCi1zdHJ1Y3QgcGt0X2NiIHsKLQlwa2NiX2ZuX3QgZm47CQkvKiBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdHggZnJhbWUgY29tcGxldGVzICovCi0Jdm9pZCAqYXJnOwkJLyogdm9pZCBhcmcgZm9yIGZuICovCi0JdTggbmV4dGlkeDsJCS8qIGluZGV4IG9mIG5leHQgY2FsbCBiYWNrIGlmIHRocmVhZGluZyAqLwotCWJvb2wgZW50ZXJlZDsJCS8qIHJlY3Vyc2lvbiBjaGVjayAqLwotfTsKLQotLyogbW9kdWxlIGNvbnRyb2wgYmxvY2tzICovCi1zdHJ1Y3QgbW9kdWxlY2IgewotCWNoYXIgbmFtZVszMl07CQkvKiBtb2R1bGUgbmFtZSA6IE5VTEwgaW5kaWNhdGVzIGVtcHR5IGFycmF5IG1lbWJlciAqLwotCWNvbnN0IHN0cnVjdCBicmNtdV9pb3ZhciAqaW92YXJzOwkvKiBpb3ZhciB0YWJsZSAqLwotCXZvaWQgKmhkbDsJCS8qIGhhbmRsZSBwYXNzZWQgd2hlbiBoYW5kbGVyICdkb2lvdmFyJyBpcyBjYWxsZWQgKi8KLQl3YXRjaGRvZ19mbl90IHdhdGNoZG9nX2ZuOwkvKiB3YXRjaGRvZyBoYW5kbGVyICovCi0JaW92YXJfZm5fdCBpb3Zhcl9mbjsJLyogaW92YXIgaGFuZGxlciAqLwotCWRvd25fZm5fdCBkb3duX2ZuOwkvKiBkb3duIGhhbmRsZXIuIE5vdGU6IHRoZSBpbnQgcmV0dXJuZWQKLQkJCQkgKiBieSB0aGUgZG93biBmdW5jdGlvbiBpcyBhIGNvdW50IG9mIHRoZQotCQkJCSAqIG51bWJlciBvZiB0aW1lcnMgdGhhdCBjb3VsZCBub3QgYmUKLQkJCQkgKiBmcmVlZC4KLQkJCQkgKi8KLX07Ci0KLS8qIGR1bXAgY29udHJvbCBibG9ja3MgKi8KLXN0cnVjdCBkdW1wY2JfcyB7Ci0JY29uc3QgY2hhciAqbmFtZTsJLyogZHVtcCBuYW1lICovCi0JZHVtcF9mbl90IGR1bXBfZm47CS8qICd3bCBkdW1wJyBoYW5kbGVyICovCi0Jdm9pZCAqZHVtcF9mbl9hcmc7Ci0Jc3RydWN0IGR1bXBjYl9zICpuZXh0OwotfTsKLQotc3RydWN0IGVkY2ZfYWNwYXJhbSB7Ci0JdTggQUNJOwotCXU4IEVDVzsKLQl1MTYgVFhPUDsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCB3bWVfcGFyYW1faWUgewotCXU4IG91aVszXTsKLQl1OCB0eXBlOwotCXU4IHN1YnR5cGU7Ci0JdTggdmVyc2lvbjsKLQl1OCBxb3NpbmZvOwotCXU4IHJzdmQ7Ci0Jc3RydWN0IGVkY2ZfYWNwYXJhbSBhY3BhcmFtW0FDX0NPVU5UXTsKLX0gX19wYWNrZWQ7Ci0KLS8qIHZpcnR1YWwgaW50ZXJmYWNlICovCi1zdHJ1Y3QgYnJjbXNfY19pZiB7Ci0Jc3RydWN0IGJyY21zX2NfaWYgKm5leHQ7Ci0JdTggdHlwZTsJCS8qIEJTUyBvciBXRFMgKi8KLQl1OCBpbmRleDsJCS8qIGFzc2lnbmVkIGluIHdsX2FkZF9pZigpLCBpbmRleCBvZiB0aGUgd2xpZiBpZiBhbnksCi0JCQkJICogbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmRpbmcgdG8gYnNzY2ZnLl9pZHggb3IKLQkJCQkgKiBBSUQyUFZCTUFQKHNjYikuCi0JCQkJICovCi0JdTggZmxhZ3M7CQkvKiBmbGFncyBmb3IgdGhlIGludGVyZmFjZSAqLwotCXN0cnVjdCBicmNtc19pZiAqd2xpZjsJCS8qIHBvaW50ZXIgdG8gd2xpZiAqLwotCXN0cnVjdCBicmNtc190eHFfaW5mbyAqcWk7CS8qIHBvaW50ZXIgdG8gYXNzb2NpYXRlZCB0eCBxdWV1ZSAqLwotCXVuaW9uIHsKLQkJLyogcG9pbnRlciB0byBzY2IgaWYgV0RTICovCi0JCXN0cnVjdCBzY2IgKnNjYjsKLQkJLyogcG9pbnRlciB0byBic3NjZmcgaWYgQlNTICovCi0JCXN0cnVjdCBicmNtc19ic3NfY2ZnICpic3NjZmc7Ci0JfSB1OwotfTsKLQotLyogZmxhZ3MgZm9yIHRoZSBpbnRlcmZhY2UsIHRoaXMgaW50ZXJmYWNlIGlzIGxpbmtlZCB0byBhIGJyY21zX2lmICovCi0jZGVmaW5lIEJSQ01TX0lGX0xJTktFRAkJMHgwMgotCi1zdHJ1Y3QgYnJjbXNfaHdfYmFuZCB7Ci0JaW50IGJhbmR0eXBlOwkJLyogQlJDTV9CQU5EXzJHLCBCUkNNX0JBTkRfNUcgKi8KLQl1aW50IGJhbmR1bml0OwkJLyogYmFuZHN0YXRlW10gaW5kZXggKi8KLQl1MTYgbWhmc1tNSEZNQVhdOwkvKiBNSEYgYXJyYXkgc2hhZG93ICovCi0JdTggYmFuZGh3X3N0Zl9zc19tb2RlOwkvKiBIVyBjb25maWd1cmVkIFNURiB0eXBlLCAwOnNpc287IDE6Y2RkICovCi0JdTE2IENXbWluOwotCXUxNiBDV21heDsKLQl1MzIgY29yZV9mbGFnczsKLQotCXUxNiBwaHl0eXBlOwkJLyogcGh5dHlwZSAqLwotCXUxNiBwaHlyZXY7Ci0JdTE2IHJhZGlvaWQ7Ci0JdTE2IHJhZGlvcmV2OwotCXN0cnVjdCBicmNtc19waHlfcHViICpwaTsgLyogcG9pbnRlciB0byBwaHkgc3BlY2lmaWMgaW5mb3JtYXRpb24gKi8KLQlib29sIGFiZ3BoeV9lbmNvcmU7Ci19OwotCi1zdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgewotCWJvb2wgX3Bpb21vZGU7CQkvKiB0cnVlIGlmIHBpbyBtb2RlICovCi0Jc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjOwotCi0JLyogZmlmbyAqLwotCXN0cnVjdCBkbWFfcHViICpkaVtORklGT107CS8qIGRtYSBoYW5kbGVzLCBwZXIgZmlmbyAqLwotCi0JdWludCB1bml0OwkJLyogZGV2aWNlIGluc3RhbmNlIG51bWJlciAqLwotCi0JLyogdmVyc2lvbiBpbmZvICovCi0JdTE2IHZlbmRvcmlkOwkvKiBQQ0kgdmVuZG9yIGlkICovCi0JdTE2IGRldmljZWlkOwkvKiBQQ0kgZGV2aWNlIGlkICovCi0JdWludCBjb3JlcmV2OwkJLyogY29yZSByZXZpc2lvbiAqLwotCXU4IHNyb21yZXY7CQkvKiB2ZXJzaW9uICMgb2YgdGhlIHNyb20gKi8KLQl1MTYgYm9hcmRyZXY7CS8qIHZlcnNpb24gIyBvZiBwYXJ0aWN1bGFyIGJvYXJkICovCi0JdTMyIGJvYXJkZmxhZ3M7CS8qIEJvYXJkIHNwZWNpZmljIGZsYWdzIGZyb20gc3JvbSAqLwotCXUzMiBib2FyZGZsYWdzMjsJLyogTW9yZSBib2FyZCBmbGFncyBpZiBzcm9tcmV2ID49IDQgKi8KLQl1MzIgbWFjaHdjYXA7CS8qIE1BQyBjYXBhYmlsaXRpZXMgKi8KLQl1MzIgbWFjaHdjYXBfYmFja3VwOwkvKiBiYWNrdXAgb2YgbWFjaHdjYXAgKi8KLQl1MTYgdWNvZGVfZGJnc2VsOwkvKiBkYmdzZWwgZm9yIHVjb2RlIGRlYnVnKGNvbmZpZyBncGlvKSAqLwotCi0Jc3RydWN0IHNpX3B1YiAqc2loOwkvKiBTSSBoYW5kbGUgKGNvb2tpZSBmb3Igc2l1dGlscyBjYWxscykgKi8KLQljaGFyICp2YXJzOwkJLyogImVudmlyb25tZW50IiBuYW1lPXZhbHVlICovCi0JdWludCB2YXJzX3NpemU7CQkvKiBzaXplIG9mIHZhcnMsIGZyZWUgdmFycyBvbiBkZXRhY2ggKi8KLQlkMTFyZWdzX3QgKnJlZ3M7CS8qIHBvaW50ZXIgdG8gZGV2aWNlIHJlZ2lzdGVycyAqLwotCXZvaWQgKnBoeXNoaW07CQkvKiBwaHkgc2hpbSBsYXllciBoYW5kbGVyICovCi0Jdm9pZCAqcGh5X3NoOwkJLyogcG9pbnRlciB0byBzaGFyZWQgcGh5IHN0YXRlICovCi0Jc3RydWN0IGJyY21zX2h3X2JhbmQgKmJhbmQ7LyogcG9pbnRlciB0byBhY3RpdmUgcGVyLWJhbmQgc3RhdGUgKi8KLQkvKiBiYW5kIHN0YXRlIHBlciBwaHkvcmFkaW8gKi8KLQlzdHJ1Y3QgYnJjbXNfaHdfYmFuZCAqYmFuZHN0YXRlW01BWEJBTkRTXTsKLQl1MTYgYm1hY19waHl0eGFudDsJLyogY2FjaGUgb2YgaGlnaCBwaHl0eGFudCBzdGF0ZSAqLwotCWJvb2wgc2hvcnRzbG90OwkJLyogY3VycmVudGx5IHVzaW5nIDExZyBTaG9ydFNsb3QgdGltaW5nICovCi0JdTE2IFNSTDsJCS8qIDgwMi4xMSBkb3QxMVNob3J0UmV0cnlMaW1pdCAqLwotCXUxNiBMUkw7CQkvKiA4MDIuMTEgZG90MTFMb25nUmV0cnlMaW1pdCAqLwotCXUxNiBTRkJMOwkJLyogU2hvcnQgRnJhbWUgUmF0ZSBGYWxsYmFjayBMaW1pdCAqLwotCXUxNiBMRkJMOwkJLyogTG9uZyBGcmFtZSBSYXRlIEZhbGxiYWNrIExpbWl0ICovCi0KLQlib29sIHVwOwkJLyogZDExIGhhcmR3YXJlIHVwIGFuZCBydW5uaW5nICovCi0JdWludCBub3c7CQkvKiAjIGVsYXBzZWQgc2Vjb25kcyAqLwotCXVpbnQgX25iYW5kczsJCS8qICMgYmFuZHMgc3VwcG9ydGVkICovCi0JY2hhbnNwZWNfdCBjaGFuc3BlYzsJLyogYm1hYyBjaGFuc3BlYyBzaGFkb3cgKi8KLQotCXVpbnQgKnR4YXZhaWxbTkZJRk9dOwkvKiAjIHR4IGRlc2NyaXB0b3JzIGF2YWlsYWJsZSAqLwotCXUxNiAqeG10Zmlmb19zejsJLyogZmlmbyBzaXplIGluIDI1NkIgZm9yIGVhY2ggeG10IGZpZm8gKi8KLQotCW1ib29sIHBsbHJlcTsJCS8qIHBsbCByZXF1ZXN0cyB0byBrZWVwIFBMTCBvbiAqLwotCi0JdTggc3VzcGVuZGVkX2ZpZm9zOwkvKiBXaGljaCBUWCBmaWZvIHRvIHJlbWFpbiBhd2FrZSBmb3IgKi8KLQl1MzIgbWFjY29udHJvbDsJLyogQ2FjaGVkIHZhbHVlIG9mIG1hY2NvbnRyb2wgKi8KLQl1aW50IG1hY19zdXNwZW5kX2RlcHRoOwkvKiBjdXJyZW50IGRlcHRoIG9mIG1hY19zdXNwZW5kIGxldmVscyAqLwotCXUzMiB3YWtlX292ZXJyaWRlOwkvKiBWYXJpb3VzIGNvbmRpdGlvbnMgdG8gZm9yY2UgTUFDIHRvIFdBS0UgbW9kZSAqLwotCXUzMiBtdXRlX292ZXJyaWRlOwkvKiBQcmV2ZW50IHVjb2RlIGZyb20gc2VuZGluZyBiZWFjb25zICovCi0JdTggZXRoZXJhZGRyW0VUSF9BTEVOXTsJLyogY3VycmVudGx5IGNvbmZpZ3VyZWQgZXRoZXJuZXQgYWRkcmVzcyAqLwotCXUzMiBsZWRfZ3Bpb19tYXNrOwkvKiBMRUQgR1BJTyBNYXNrICovCi0JYm9vbCBub3Jlc2V0OwkJLyogdHJ1ZT0gZG8gbm90IHJlc2V0IGh3LCB1c2VkIGJ5IFdMQ19PVVQgKi8KLQlib29sIGZvcmNlZmFzdGNsazsJLyogdHJ1ZSBpZiB0aGUgaC93IGlzIGZvcmNpbmcgdGhlIHVzZSBvZiBmYXN0IGNsayAqLwotCWJvb2wgY2xrOwkJLyogY29yZSBpcyBvdXQgb2YgcmVzZXQgYW5kIGhhcyBjbG9jayAqLwotCWJvb2wgc2JjbGs7CQkvKiBzYiBoYXMgY2xvY2sgKi8KLQlzdHJ1Y3QgYm1hY19wbXEgKmJtYWNfcG1xOyAvKiAgYm1hYyBQTSBzdGF0ZXMgZGVyaXZlZCBmcm9tIHVjb2RlIFBNUSAqLwotCWJvb2wgcGh5Y2xrOwkJLyogcGh5IGlzIG91dCBvZiByZXNldCBhbmQgaGFzIGNsb2NrICovCi0JYm9vbCBkbWFfbHBiazsJCS8qIGNvcmUgaXMgaW4gRE1BIGxvb3BiYWNrICovCi0KLQlib29sIHVjb2RlX2xvYWRlZDsJLyogdHJ1ZSBhZnRlciB1Y29kZSBkb3dubG9hZGVkICovCi0KLQotCXU4IGh3X3N0Zl9zc19vcG1vZGU7CS8qIFNURiBzaW5nbGUgc3RyZWFtIG9wZXJhdGlvbiBtb2RlICovCi0JdTggYW50c2VsX3R5cGU7CS8qIFR5cGUgb2YgYm9hcmRsZXZlbCBtaW1vIGFudGVubmEgc3dpdGNoLWxvZ2ljCi0JCQkJICogMCA9IE4vQSwgMSA9IDJ4NCBib2FyZCwgMiA9IDJ4MyBDQjIgYm9hcmQKLQkJCQkgKi8KLQl1MzIgYW50c2VsX2F2YWlsOwkvKgotCQkJCSAqIHB1dCBzdHJ1Y3QgYW50c2VsX2luZm8gaGVyZSBpZiBtb3JlIGluZm8gaXMKLQkJCQkgKiBuZWVkZWQKLQkJCQkgKi8KLX07Ci0KLS8qIFRYIFF1ZXVlIGluZm9ybWF0aW9uCi0gKgotICogRWFjaCBmbG93IG9mIHRyYWZmaWMgb3V0IG9mIHRoZSBkZXZpY2UgaGFzIGEgVFggUXVldWUgd2l0aCBpbmRlcGVuZGVudAotICogZmxvdyBjb250cm9sLiBTZXZlcmFsIGludGVyZmFjZXMgbWF5IGJlIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBUWCBRdWV1ZQotICogaWYgdGhleSBiZWxvbmcgdG8gdGhlIHNhbWUgZmxvdyBvZiB0cmFmZmljIGZyb20gdGhlIGRldmljZS4gRm9yIG11bHRpLWNoYW5uZWwKLSAqIG9wZXJhdGlvbiB0aGVyZSBhcmUgaW5kZXBlbmRlbnQgVFggUXVldWVzIGZvciBlYWNoIGNoYW5uZWwuCi0gKi8KLXN0cnVjdCBicmNtc190eHFfaW5mbyB7Ci0Jc3RydWN0IGJyY21zX3R4cV9pbmZvICpuZXh0OwotCXN0cnVjdCBwa3RxIHE7Ci0JdWludCBzdG9wcGVkOwkJLyogdHggZmxvdyBjb250cm9sIGJpdHMgKi8KLX07Ci0KLS8qCi0gKiBQcmluY2lwYWwgY29tbW9uIChvcy1pbmRlcGVuZGVudCkgc29mdHdhcmUgZGF0YSBzdHJ1Y3R1cmUuCi0gKi8KLXN0cnVjdCBicmNtc19jX2luZm8gewotCXN0cnVjdCBicmNtc19wdWIgKnB1YjsJCS8qIHBvaW50ZXIgdG8gd2xjIHB1YmxpYyBzdGF0ZSAqLwotCXN0cnVjdCBicmNtc19pbmZvICp3bDsJLyogcG9pbnRlciB0byBvcy1zcGVjaWZpYyBwcml2YXRlIHN0YXRlICovCi0JZDExcmVnc190ICpyZWdzOwkvKiBwb2ludGVyIHRvIGRldmljZSByZWdpc3RlcnMgKi8KLQotCS8qIEhXIHJlbGF0ZWQgc3RhdGUgdXNlZCBwcmltYXJpbHkgYnkgQk1BQyAqLwotCXN0cnVjdCBicmNtc19oYXJkd2FyZSAqaHc7Ci0KLQkvKiBjbG9jayAqLwotCWludCBjbGtyZXFfb3ZlcnJpZGU7CS8qIHNldHRpbmcgZm9yIGNsa3JlcSBmb3IgUENJRSA6IEF1dG8sIDAsIDEgKi8KLQl1MTYgZmFzdHB3cnVwX2RseTsJLyogdGltZSBpbiB1cyBuZWVkZWQgdG8gYnJpbmcgdXAgZDExIGZhc3QgY2xvY2sgKi8KLQotCS8qIGludGVycnVwdCAqLwotCXUzMiBtYWNpbnRzdGF0dXM7CS8qIGJpdCBjaGFubmVsIGJldHdlZW4gaXNyIGFuZCBkcGMgKi8KLQl1MzIgbWFjaW50bWFzazsJLyogc3cgcnVudGltZSBtYXN0ZXIgbWFjaW50bWFzayB2YWx1ZSAqLwotCXUzMiBkZWZtYWNpbnRtYXNrOwkvKiBkZWZhdWx0ICJvbiIgbWFjaW50bWFzayB2YWx1ZSAqLwotCi0JLyogdXAgYW5kIGRvd24gKi8KLQlib29sIGRldmljZV9wcmVzZW50OwkvKiAocmVtb3ZhYmxlKSBkZXZpY2UgaXMgcHJlc2VudCAqLwotCi0JYm9vbCBjbGs7CQkvKiBjb3JlIGlzIG91dCBvZiByZXNldCBhbmQgaGFzIGNsb2NrICovCi0KLQkvKiBtdWx0aWJhbmQgKi8KLQlzdHJ1Y3QgYnJjbXNfY29yZSAqY29yZTsJLyogcG9pbnRlciB0byBhY3RpdmUgaW8gY29yZSAqLwotCXN0cnVjdCBicmNtc19iYW5kICpiYW5kOwkvKiBwb2ludGVyIHRvIGFjdGl2ZSBwZXItYmFuZCBzdGF0ZSAqLwotCXN0cnVjdCBicmNtc19jb3JlICpjb3Jlc3RhdGU7CS8qIHBlci1jb3JlIHN0YXRlIChvbmUgcGVyIGh3IGNvcmUpICovCi0JLyogcGVyLWJhbmQgc3RhdGUgKG9uZSBwZXIgcGh5L3JhZGlvKTogKi8KLQlzdHJ1Y3QgYnJjbXNfYmFuZCAqYmFuZHN0YXRlW01BWEJBTkRTXTsKLQotCWJvb2wgd2FyMTYxNjU7CQkvKiBQQ0kgc2xvdyBjbG9jayAxNjE2NSB3YXIgZmxhZyAqLwotCi0JYm9vbCB0eF9zdXNwZW5kZWQ7CS8qIGRhdGEgZmlmb3MgbmVlZCB0byByZW1haW4gc3VzcGVuZGVkICovCi0KLQl1aW50IHR4cGVuZDE2MTY1d2FyOwotCi0JLyogcGFja2V0IHF1ZXVlICovCi0JdWludCBxdmFsaWQ7CQkvKiBEaXJGcm1RVmFsaWQgYW5kIEJjTWNGcm1RVmFsaWQgKi8KLQotCS8qIFJlZ3VsYXRvcnkgcG93ZXIgbGltaXRzICovCi0JczggdHhwd3JfbG9jYWxfbWF4OwkvKiByZWd1bGF0b3J5IGxvY2FsIHR4cHdyIG1heCAqLwotCXU4IHR4cHdyX2xvY2FsX2NvbnN0cmFpbnQ7CS8qIGxvY2FsIHBvd2VyIGNvbnRyYWludCBpbiBkQiAqLwotCi0KLQlzdHJ1Y3QgYW1wZHVfaW5mbyAqYW1wZHU7CS8qIGFtcGR1IG1vZHVsZSBoYW5kbGVyICovCi0Jc3RydWN0IGFudHNlbF9pbmZvICphc2k7CS8qIGFudHNlbCBtb2R1bGUgaGFuZGxlciAqLwotCXN0cnVjdCBicmNtc19jbV9pbmZvICpjbWk7CS8qIGNoYW5uZWwgbWFuYWdlciBtb2R1bGUgaGFuZGxlciAqLwotCi0JdWludCB2YXJzX3NpemU7CQkvKiBzaXplIG9mIHZhcnMsIGZyZWUgdmFycyBvbiBkZXRhY2ggKi8KLQotCXUxNiB2ZW5kb3JpZDsJLyogUENJIHZlbmRvciBpZCAqLwotCXUxNiBkZXZpY2VpZDsJLyogUENJIGRldmljZSBpZCAqLwotCXVpbnQgdWNvZGVfcmV2OwkJLyogbWljcm9jb2RlIHJldmlzaW9uICovCi0KLQl1MzIgbWFjaHdjYXA7CS8qIE1BQyBjYXBhYmlsaXRpZXMsIEJNQUMgc2hhZG93ICovCi0KLQl1OCBwZXJtX2V0aGVyYWRkcltFVEhfQUxFTl07CS8qIG9yaWdpbmFsIHNwcm9tIGxvY2FsIGV0aGVybmV0IGFkZHJlc3MgKi8KLQotCWJvb2wgYmFuZGxvY2tlZDsJLyogZGlzYWJsZSBhdXRvIG11bHRpLWJhbmQgc3dpdGNoaW5nICovCi0JYm9vbCBiYW5kaW5pdF9wZW5kaW5nOwkvKiB0cmFjayBiYW5kIGluaXQgaW4gYXV0byBiYW5kICovCi0KLQlib29sIHJhZGlvX21vbml0b3I7CS8qIHJhZGlvIHRpbWVyIGlzIHJ1bm5pbmcgKi8KLQlib29sIGdvaW5nX2Rvd247CS8qIGRvd24gcGF0aCBpbnRlcm1lZGlhdGUgdmFyaWFibGUgKi8KLQotCWJvb2wgbXBjOwkJLyogZW5hYmxlIG1pbmltdW0gcG93ZXIgY29uc3VtcHRpb24gKi8KLQl1OCBtcGNfZGx5Y250OwkvKiAjIG9mIHdhdGNoZG9nIGNudCBiZWZvcmUgdHVybiBkaXNhYmxlIHJhZGlvICovCi0JdTggbXBjX29mZmNudDsJLyogIyBvZiB3YXRjaGRvZyBjbnQgdGhhdCByYWRpbyBpcyBkaXNhYmxlZCAqLwotCXU4IG1wY19kZWxheV9vZmY7CS8qIGRlbGF5IHJhZGlvIGRpc2FibGUgYnkgIyBvZiB3YXRjaGRvZyBjbnQgKi8KLQl1OCBwcmV2X25vbl9kZWxheV9tcGM7CS8qIHByZXYgc3RhdGUgYnJjbXNfY19pc19ub25fZGVsYXlfbXBjICovCi0KLQkvKiB0aW1lciBmb3Igd2F0Y2hkb2cgcm91dGluZSAqLwotCXN0cnVjdCBicmNtc190aW1lciAqd2R0aW1lcjsKLQkvKiB0aW1lciBmb3IgaHcgcmFkaW8gYnV0dG9uIG1vbml0b3Igcm91dGluZSAqLwotCXN0cnVjdCBicmNtc190aW1lciAqcmFkaW9fdGltZXI7Ci0KLQkvKiBwcm9taXNjdW91cyAqLwotCWJvb2wgbW9uaXRvcjsJCS8qIG1vbml0b3IgKE1QRFUgc25pZmZpbmcpIG1vZGUgKi8KLQlib29sIGJjbm1pc2NfaWJzczsJLyogYmNucyBwcm9taXNjIG1vZGUgb3ZlcnJpZGUgZm9yIElCU1MgKi8KLQlib29sIGJjbm1pc2Nfc2NhbjsJLyogYmNucyBwcm9taXNjIG1vZGUgb3ZlcnJpZGUgZm9yIHNjYW4gKi8KLQlib29sIGJjbm1pc2NfbW9uaXRvcjsJLyogYmNucyBwcm9taXNjIG1vZGUgb3ZlcnJpZGUgZm9yIG1vbml0b3IgKi8KLQotCS8qIGRyaXZlciBmZWF0dXJlICovCi0JYm9vbCBfcmlmczsJCS8qIGVuYWJsZSBwZXItcGFja2V0IHJpZnMgKi8KLQlzOCBzZ2lfdHg7CQkvKiBzZ2kgdHggKi8KLQotCS8qIEFQLVNUQSBzeW5jaHJvbml6YXRpb24sIHBvd2VyIHNhdmUgKi8KLQl1OCBiY25fbGlfYmNuOwkvKiBiZWFjb24gbGlzdGVuIGludGVydmFsIGluICMgYmVhY29ucyAqLwotCXU4IGJjbl9saV9kdGltOwkvKiBiZWFjb24gbGlzdGVuIGludGVydmFsIGluICMgZHRpbXMgKi8KLQotCWJvb2wgV0Rhcm1lZDsJCS8qIHdhdGNoZG9nIHRpbWVyIGlzIGFybWVkICovCi0JdTMyIFdEbGFzdDsJCS8qIGxhc3QgdGltZSB3bGNfd2F0Y2hkb2coKSB3YXMgY2FsbGVkICovCi0KLQkvKiBXTUUgKi8KLQlhY19iaXRtYXBfdCB3bWVfZHA7CS8qIERpc2NhcmQgKG9sZGVzdCBmaXJzdCkgcG9saWN5IHBlciBBQyAqLwotCXUxNiBlZGNmX3R4b3BbQUNfQ09VTlRdOwkvKiBjdXJyZW50IHR4b3AgZm9yIGVhY2ggYWMgKi8KLQotCS8qCi0JICogV01FIHBhcmFtZXRlciBpbmZvIGVsZW1lbnQsIHdoaWNoIG9uIFNUQSBjb250YWlucyBwYXJhbWV0ZXJzIGluIHVzZQotCSAqIGxvY2FsbHksIGFuZCBvbiBBUCBjb250YWlucyBwYXJhbWV0ZXJzIGFkdmVydGlzZWQgdG8gU1RBIGluIGJlYWNvbnMKLQkgKiBhbmQgYXNzb2MgcmVzcG9uc2VzLgotCSAqLwotCXN0cnVjdCB3bWVfcGFyYW1faWUgd21lX3BhcmFtX2llOwotCXUxNiB3bWVfcmV0cmllc1tBQ19DT1VOVF07CS8qIHBlci1BQyByZXRyeSBsaW1pdHMgKi8KLQotCXUxNiB0eF9wcmVjX21hcDsJLyogUHJlY2VkZW5jZSBtYXAgYmFzZWQgb24gSFcgRklGTyBzcGFjZSAqLwotCXUxNiBmaWZvMnByZWNfbWFwW05GSUZPXTsJLyogcG9pbnRlciB0byBmaWZvMl9wcmVjIG1hcCBiYXNlZCBvbiBXTUUgKi8KLQotCS8qCi0JICogQlNTIENvbmZpZ3VyYXRpb25zIHNldCBvZiBCU1MgY29uZmlndXJhdGlvbnMsIGlkeCAwIGlzIGRlZmF1bHQgYW5kCi0JICogYWx3YXlzIHZhbGlkCi0JICovCi0Jc3RydWN0IGJyY21zX2Jzc19jZmcgKmJzc2NmZ1tCUkNNU19NQVhCU1NDRkddOwotCXN0cnVjdCBicmNtc19ic3NfY2ZnICpjZmc7IC8qIHRoZSBwcmltYXJ5IGJzc2NmZyAoY2FuIGJlIEFQIG9yIFNUQSkgKi8KLQotCS8qIHR4IHF1ZXVlICovCi0Jc3RydWN0IGJyY21zX3R4cV9pbmZvICp0eF9xdWV1ZXM7CS8qIGNvbW1vbiBUWCBRdWV1ZSBsaXN0ICovCi0KLQkvKiBzZWN1cml0eSAqLwotCXN0cnVjdCB3c2VjX2tleSAqd3NlY19rZXlzW1dTRUNfTUFYX0tFWVNdOyAvKiBkeW5hbWljIGtleSBzdG9yYWdlICovCi0JLyogZGVmYXVsdCBrZXkgc3RvcmFnZSAqLwotCXN0cnVjdCB3c2VjX2tleSAqd3NlY19kZWZfa2V5c1tCUkNNU19ERUZBVUxUX0tFWVNdOwotCWJvb2wgd3NlY19zd2tleXM7CS8qIGluZGljYXRlcyB0aGF0IGFsbCBrZXlzIHNob3VsZCBiZQotCQkJCSAqIHRyZWF0ZWQgYXMgc3cga2V5cyAodXNlZCBmb3IgZGVidWdnaW5nKQotCQkJCSAqLwotCXN0cnVjdCBtb2R1bGVjYiAqbW9kdWxlY2I7Ci0KLQl1OCBtaW1vZnQ7CQkvKiBTSUdOIG9yIDExTiAqLwotCXM4IGNja180MHR4Ync7CS8qIDExTiwgY2NrIHR4IGIvdyBvdmVycmlkZSB3aGVuIGluIDQwTUhaIG1vZGUgKi8KLQlzOCBvZmRtXzQwdHhidzsJLyogMTFOLCBvZmRtIHR4IGIvdyBvdmVycmlkZSB3aGVuIGluIDQwTUhaIG1vZGUgKi8KLQlzOCBtaW1vXzQwdHhidzsJLyogMTFOLCBtaW1vIHR4IGIvdyBvdmVycmlkZSB3aGVuIGluIDQwTUhaIG1vZGUgKi8KLQkvKiBIVCBDQVAgSUUgYmVpbmcgYWR2ZXJ0aXNlZCBieSB0aGlzIG5vZGU6ICovCi0Jc3RydWN0IGllZWU4MDIxMV9odF9jYXAgaHRfY2FwOwotCi0Jc3RydWN0IGJyY21zX2Jzc19pbmZvICpkZWZhdWx0X2JzczsJLyogY29uZmlndXJlZCBCU1MgcGFyYW1ldGVycyAqLwotCi0JdTE2IG1jX2ZpZF9jb3VudGVyOwkvKiBCQy9NQyBGSUZPIGZyYW1lIElEIGNvdW50ZXIgKi8KLQotCS8qIHNhdmVkIGNvdW50cnkgZm9yIGxlYXZpbmcgODAyLjExZCBhdXRvLWNvdW50cnkgbW9kZSAqLwotCWNoYXIgY291bnRyeV9kZWZhdWx0W0JSQ01fQ05UUllfQlVGX1NaXTsKLQkvKiBpbml0aWFsIGNvdW50cnkgZm9yIDgwMi4xMWQgYXV0by1jb3VudHJ5IG1vZGUgKi8KLQljaGFyIGF1dG9jb3VudHJ5X2RlZmF1bHRbQlJDTV9DTlRSWV9CVUZfU1pdOwotCXUxNiBwcmJfcmVzcF90aW1lb3V0OwkvKiBkbyBub3Qgc2VuZCBwcmIgcmVzcCBpZiByZXF1ZXN0IG9sZGVyIHRoYW4gdGhpcywKLQkJCQkJICogMCA9IGRpc2FibGUKLQkJCQkJICovCi0KLQl3bGNfcmF0ZXNldF90IHN1cF9yYXRlc19vdmVycmlkZTsJLyogdXNlIG9ubHkgdGhlc2UgcmF0ZXMgaW4gMTFnIHN1cHBvcnRlZCByYXRlcyBpZgotCQkJCQkJICogc3BlY2lmZWQKLQkJCQkJCSAqLwotCi0JY2hhbnNwZWNfdCBob21lX2NoYW5zcGVjOwkvKiBzaGFyZWQgaG9tZSBjaGFuc3BlYyAqLwotCi0JLyogUEhZIHBhcmFtZXRlcnMgKi8KLQljaGFuc3BlY190IGNoYW5zcGVjOwkvKiB0YXJnZXQgb3BlcmF0aW9uYWwgY2hhbm5lbCAqLwotCXUxNiB1c3JfZnJhZ3RocmVzaDsJLyogdXNlciBjb25maWd1cmVkIGZyYWdtZW50YXRpb24gdGhyZXNob2xkICovCi0JdTE2IGZyYWd0aHJlc2hbTkZJRk9dOwkvKiBwZXItZmlmbyBmcmFnbWVudGF0aW9uIHRocmVzaG9sZHMgKi8KLQl1MTYgUlRTVGhyZXNoOwkvKiA4MDIuMTEgZG90MTFSVFNUaHJlc2hvbGQgKi8KLQl1MTYgU1JMOwkJLyogODAyLjExIGRvdDExU2hvcnRSZXRyeUxpbWl0ICovCi0JdTE2IExSTDsJCS8qIDgwMi4xMSBkb3QxMUxvbmdSZXRyeUxpbWl0ICovCi0JdTE2IFNGQkw7CQkvKiBTaG9ydCBGcmFtZSBSYXRlIEZhbGxiYWNrIExpbWl0ICovCi0JdTE2IExGQkw7CQkvKiBMb25nIEZyYW1lIFJhdGUgRmFsbGJhY2sgTGltaXQgKi8KLQotCS8qIG5ldHdvcmsgY29uZmlnICovCi0JYm9vbCBzaG9ydHNsb3Q7CQkvKiBjdXJyZW50bHkgdXNpbmcgMTFnIFNob3J0U2xvdCB0aW1pbmcgKi8KLQlzOCBzaG9ydHNsb3Rfb3ZlcnJpZGU7CS8qIDExZyBTaG9ydFNsb3Qgb3ZlcnJpZGUgKi8KLQlib29sIGluY2x1ZGVfbGVnYWN5X2VycDsJLyogaW5jbHVkZSBMZWdhY3kgRVJQIGluZm8gZWx0IElEIDQ3IGFzIHdlbGwgYXMgZyBJRCA0MiAqLwotCi0Jc3RydWN0IGJyY21zX3Byb3RlY3Rpb24gKnByb3RlY3Rpb247Ci0JczggUExDUEhkcl9vdmVycmlkZTsJLyogODAyLjExYiBQcmVhbWJsZSBUeXBlIG92ZXJyaWRlICovCi0KLQlzdHJ1Y3QgYnJjbXNfc3RmICpzdGY7Ci0KLQlyYXRlc3BlY190IGJjbl9yc3BlYzsJLyogc2F2ZSBiY24gcmF0ZXNwZWMgcHVycG9zZSAqLwotCi0JdWludCB0ZW1wc2Vuc2VfbGFzdHRpbWU7Ci0KLQl1MTYgdHhfZHV0eV9jeWNsZV9vZmRtOwkvKiBtYXhpbXVtIGFsbG93ZWQgZHV0eSBjeWNsZSBmb3IgT0ZETSAqLwotCXUxNiB0eF9kdXR5X2N5Y2xlX2NjazsJLyogbWF4aW11bSBhbGxvd2VkIGR1dHkgY3ljbGUgZm9yIENDSyAqLwotCi0JdTE2IG5leHRfYnNzY2ZnX0lEOwotCi0Jc3RydWN0IGJyY21zX3R4cV9pbmZvICpwa3RfcXVldWU7IC8qIHR4cSBmb3IgdHJhbnNtaXQgcGFja2V0cyAqLwotCXUzMiBtcGNfZHVyOwkJLyogdG90YWwgdGltZSAobXMpIGluIG1wYyBtb2RlIGV4Y2VwdCBmb3IgdGhlCi0JCQkJICogcG9ydGlvbiBzaW5jZSByYWRpbyBpcyB0dXJuZWQgb2ZmIGxhc3QgdGltZQotCQkJCSAqLwotCXUzMiBtcGNfbGFzdG9uX3RzOwkvKiB0aW1lc3RhbXAgKG1zKSB3aGVuIHJhZGlvIGlzIHR1cm5lZCBvZmYgbGFzdAotCQkJCSAqIHRpbWUKLQkJCQkgKi8KLQlzdHJ1Y3Qgd2lwaHkgKndpcGh5OwotfTsKLQotLyogYW50c2VsIG1vZHVsZSBzcGVjaWZpYyBzdGF0ZSAqLwotc3RydWN0IGFudHNlbF9pbmZvIHsKLQlzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGM7CS8qIHBvaW50ZXIgdG8gbWFpbiB3bGMgc3RydWN0dXJlICovCi0Jc3RydWN0IGJyY21zX3B1YiAqcHViOwkJLyogcG9pbnRlciB0byBwdWJsaWMgZm4gKi8KLQl1OCBhbnRzZWxfdHlwZTsJLyogVHlwZSBvZiBib2FyZGxldmVsIG1pbW8gYW50ZW5uYSBzd2l0Y2gtbG9naWMKLQkJCQkgKiAwID0gTi9BLCAxID0gMng0IGJvYXJkLCAyID0gMngzIENCMiBib2FyZAotCQkJCSAqLwotCXU4IGFudHNlbF9hbnRzd2l0Y2g7CS8qIGJvYXJkIGxldmVsIGFudGVubmEgc3dpdGNoIHR5cGUgKi8KLQlib29sIGFudHNlbF9hdmFpbDsJLyogQW50IHNlbGVjdGlvbiBhdmFpbGFiaWxpdHkgKFNST00gYmFzZWQpICovCi0Jc3RydWN0IGJyY21zX2FudHNlbGNmZyBhbnRjZmdfMTFuOyAvKiBhbnRlbm5hIGNvbmZpZ3VyYXRpb24gKi8KLQlzdHJ1Y3QgYnJjbXNfYW50c2VsY2ZnIGFudGNmZ19jdXI7IC8qIGN1cnJlbnQgYW50ZW5uYSBjb25maWcgKGF1dG8pICovCi19OwotCi0vKiBCU1MgY29uZmlndXJhdGlvbiBzdGF0ZSAqLwotc3RydWN0IGJyY21zX2Jzc19jZmcgewotCXN0cnVjdCBicmNtc19jX2luZm8gKndsYzsgLyogd2xjIHRvIHdoaWNoIHRoaXMgYnNzY2ZnIGJlbG9uZ3MgdG8uICovCi0JYm9vbCB1cDsJCS8qIGlzIHRoaXMgY29uZmlndXJhdGlvbiB1cCBvcGVyYXRpb25hbCAqLwotCWJvb2wgZW5hYmxlOwkJLyogaXMgdGhpcyBjb25maWd1cmF0aW9uIGVuYWJsZWQgKi8KLQlib29sIGFzc29jaWF0ZWQ7CS8qIGlzIEJTUyBpbiBBU1NPQ0lBVEVEIHN0YXRlICovCi0JYm9vbCBCU1M7CQkvKiBpbmZyYXVzdHJ1Y3R1cmUgb3IgYWRoYWMgKi8KLQlib29sIGR0aW1fcHJvZ3JhbW1lZDsKLQotCXU4IFNTSURfbGVuOwkJLyogdGhlIGxlbmd0aCBvZiBTU0lEICovCi0JdTggU1NJRFtJRUVFODAyMTFfTUFYX1NTSURfTEVOXTsgLyogU1NJRCBzdHJpbmcgKi8KLQlzdHJ1Y3Qgc2NiICpiY21jX3NjYltNQVhCQU5EU107CS8qIG9uZSBiY21jX3NjYiBwZXIgYmFuZCAqLwotCXM4IF9pZHg7CQkvKiB0aGUgaW5kZXggb2YgdGhpcyBic3NjZmcsCi0JCQkJICogYXNzaWduZWQgYXQgd2xjX2Jzc2NmZ19hbGxvYygpCi0JCQkJICovCi0JLyogTUFDIGZpbHRlciAqLwotCXVpbnQgbm1hYzsJCS8qICMgb2YgZW50cmllcyBvbiBtYWNsaXN0IGFycmF5ICovCi0JaW50IG1hY21vZGU7CQkvKiBhbGxvdy9kZW55IHN0YXRpb25zIG9uIG1hY2xpc3QgYXJyYXkgKi8KLQlzdHJ1Y3QgZXRoZXJfYWRkciAqbWFjbGlzdDsJLyogbGlzdCBvZiBzb3VyY2UgTUFDIGFkZHJzIHRvIG1hdGNoICovCi0KLQkvKiBzZWN1cml0eSAqLwotCXUzMiB3c2VjOwkJLyogd2lyZWxlc3Mgc2VjdXJpdHkgYml0dmVjICovCi0JczE2IGF1dGg7CQkvKiA4MDIuMTEgYXV0aGVudGljYXRpb246IE9wZW4sIFNoYXJlZCBLZXksIFdQQSAqLwotCXMxNiBvcGVuc2hhcmVkOwkvKiB0cnkgT3BlbiBhdXRoIGZpcnN0LCB0aGVuIFNoYXJlZCBLZXkgKi8KLQlib29sIHdzZWNfcmVzdHJpY3Q7CS8qIGRyb3AgdW5lbmNyeXB0ZWQgcGFja2V0cyBpZiB3c2VjIGlzIGVuYWJsZWQgKi8KLQlib29sIGVhcF9yZXN0cmljdDsJLyogcmVzdHJpY3QgZGF0YSB1bnRpbCA4MDIuMVggYXV0aCBzdWNjZWVkcyAqLwotCXUxNiBXUEFfYXV0aDsJLyogV1BBOiBhdXRoZW50aWNhdGVkIGtleSBtYW5hZ2VtZW50ICovCi0JYm9vbCB3cGEyX3ByZWF1dGg7CS8qIGRlZmF1bHQgaXMgdHJ1ZSwgd3BhX2NhcCBzZXRzIHZhbHVlICovCi0JYm9vbCB3c2VjX3BvcnRvcGVuOwkvKiBpbmRpY2F0ZXMga2V5cyBhcmUgcGx1bWJlZCAqLwotCS8qIGdsb2JhbCB0eGl2IGZvciBXUEFfTk9ORSwgdGtpcCBhbmQgYWVzICovCi0Jc3RydWN0IHdzZWNfaXYgd3BhX25vbmVfdHhpdjsKLQlpbnQgd3NlY19pbmRleDsJCS8qIDAtMzogZGVmYXVsdCB0eCBrZXksIC0xOiBub3Qgc2V0ICovCi0JLyogZGVmYXVsdCBrZXkgc3RvcmFnZTogKi8KLQlzdHJ1Y3Qgd3NlY19rZXkgKmJzc19kZWZfa2V5c1tCUkNNU19ERUZBVUxUX0tFWVNdOwotCi0JLyogVEtJUCBjb3VudGVybWVhc3VyZXMgKi8KLQlib29sIHRraXBfY291bnRlcm1lYXN1cmVzOwkvKiBmbGFncyBUS0lQIG5vLWFzc29jIHBlcmlvZCAqLwotCXUzMiB0a19jbV9kdDsJLyogZGV0ZWN0IHRpbWVyICovCi0JdTMyIHRrX2NtX2J0OwkvKiBibG9ja2luZyB0aW1lciAqLwotCXUzMiB0a19jbV9idF90bXN0bXA7CS8qIFRpbWVzdGFtcCB3aGVuIFRLSVAgQlQgaXMgYWN0aXZhdGVkICovCi0JYm9vbCB0a19jbV9hY3RpdmF0ZTsJLyogYWN0aXZhdGUgY291bnRlcm1lYXN1cmVzIGFmdGVyIEVBUE9MLUtleSBzZW50ICovCi0KLQl1OCBCU1NJRFtFVEhfQUxFTl07CS8qIEJTU0lEIChhc3NvY2lhdGVkKSAqLwotCXU4IGN1cl9ldGhlcmFkZHJbRVRIX0FMRU5dOwkvKiBoL3cgYWRkcmVzcyAqLwotCXUxNiBiY21jX2ZpZDsJLyogdGhlIGxhc3QgQkNNQyBGSUQgcXVldWVkIHRvIFRYX0JDTUNfRklGTyAqLwotCXUxNiBiY21jX2ZpZF9zaG07CS8qIHRoZSBsYXN0IEJDTUMgRklEIHdyaXR0ZW4gdG8gc2hhcmVkIG1lbSAqLwotCi0JdTMyIGZsYWdzOwkJLyogQlNTQ0ZHIGZsYWdzOyBzZWUgYmVsb3cgKi8KLQotCXU4ICpiY247CQkvKiBBUCBiZWFjb24gKi8KLQl1aW50IGJjbl9sZW47CQkvKiBBUCBiZWFjb24gbGVuZ3RoICovCi0JYm9vbCBhcl9kaXNhc3NvYzsJLyogZGlzYXNzb2NpYXRlZCBpbiBhc3NvY2lhdGVkIHJlY3JlYXRpb24gKi8KLQotCWludCBhdXRoX2F0bXB0ZDsJLyogYXV0aCB0eXBlIChvcGVuL3NoYXJlZCkgYXR0ZW1wdGVkICovCi0KLQlwbWtpZF9jYW5kX3QgcG1raWRfY2FuZFtNQVhQTUtJRF07CS8qIFBNS0lEIGNhbmRpZGF0ZSBsaXN0ICovCi0JdWludCBucG1raWRfY2FuZDsJLyogbnVtIFBNS0lEIGNhbmRpZGF0ZXMgKi8KLQlwbWtpZF90IHBta2lkW01BWFBNS0lEXTsJLyogUE1LSUQgY2FjaGUgKi8KLQl1aW50IG5wbWtpZDsJCS8qIG51bSBjYWNoZWQgUE1LSURzICovCi0KLQlzdHJ1Y3QgYnJjbXNfYnNzX2luZm8gKmN1cnJlbnRfYnNzOyAvKiBCU1MgcGFybXMgaW4gQVNTT0NJQVRFRCBzdGF0ZSAqLwotCi0JLyogUE0gc3RhdGVzICovCi0JYm9vbCBQTWF3YWtlYmNuOwkvKiBiY24gcmVjdmQgZHVyaW5nIGN1cnJlbnQgd2FraW5nIHN0YXRlICovCi0JYm9vbCBQTXBlbmRpbmc7CQkvKiB3YWl0aW5nIGZvciB0eCBzdGF0dXMgd2l0aCBQTSBpbmRpY2F0ZWQgc2V0ICovCi0JYm9vbCBwcmlvclBNc3RhdGU7CS8qIERldGVjdGluZyBQTSBzdGF0ZSB0cmFuc2l0aW9ucyAqLwotCWJvb2wgUFNwb2xsOwkJLyogd2hldGhlciB0aGVyZSBpcyBhbiBvdXRzdGFuZGluZyBQUy1Qb2xsIGZyYW1lICovCi0KLQkvKiBCU1NJRCBlbnRyeSBpbiBSQ01UQSwgdXNlIHRoZSB3c2VjIGtleSBtYW5hZ2VtZW50IGluZnJhc3RydWN0dXJlIHRvCi0JICogbWFuYWdlIHRoZSBSQ01UQSBlbnRyaWVzLgotCSAqLwotCXN0cnVjdCB3c2VjX2tleSAqcmNtdGE7Ci0KLQkvKiAndW5pcXVlJyBJRCBvZiB0aGlzIGJzc2NmZywgYXNzaWduZWQgYXQgYnNzY2ZnIGFsbG9jYXRpb24gKi8KLQl1MTYgSUQ7Ci0KLQl1aW50IHR4cnNwZWNpZHg7CS8qIGluZGV4IGludG8gdHggcmF0ZSBjaXJjdWxhciBidWZmZXIgKi8KLQlyYXRlc3BlY190IHR4cnNwZWNbTlRYUkFURV1bMl07CS8qIGNpcmN1bGFyIGJ1ZmZlciBvZiBwcmV2IE1QRFVzIHR4IHJhdGVzICovCi19OwotCi0jZGVmaW5lCUNIQU5ORUxfQkFORFVOSVQod2xjLCBjaCkgKCgoY2gpIDw9IENIX01BWF8yR19DSEFOTkVMKSA/IEJBTkRfMkdfSU5ERVggOiBCQU5EXzVHX0lOREVYKQotI2RlZmluZQlPVEhFUkJBTkRVTklUKHdsYykJKCh1aW50KSgod2xjKS0+YmFuZC0+YmFuZHVuaXQgPyBCQU5EXzJHX0lOREVYIDogQkFORF81R19JTkRFWCkpCi0KLSNkZWZpbmUgSVNfTUJBTkRfVU5MT0NLRUQod2xjKSBcCi0JKChOQkFORFMod2xjKSA+IDEpICYmICEod2xjKS0+YmFuZGxvY2tlZCkKLQotI2RlZmluZSBCUkNNU19CQU5EX1BJX1JBRElPX0NIQU5TUEVDIHdsY19waHlfY2hhbnNwZWNfZ2V0KHdsYy0+YmFuZC0+cGkpCi0KLS8qIHN1bSB0aGUgaW5kaXZpZHVhbCBmaWZvIHR4IHBlbmRpbmcgcGFja2V0IGNvdW50cyAqLwotI2RlZmluZQlUWFBLVFBFTkRUT1Qod2xjKSAoKHdsYyktPmNvcmUtPnR4cGt0cGVuZFswXSArICh3bGMpLT5jb3JlLT50eHBrdHBlbmRbMV0gKyBcCi0JKHdsYyktPmNvcmUtPnR4cGt0cGVuZFsyXSArICh3bGMpLT5jb3JlLT50eHBrdHBlbmRbM10pCi0jZGVmaW5lIFRYUEtUUEVOREdFVCh3bGMsIGZpZm8pCQkoKHdsYyktPmNvcmUtPnR4cGt0cGVuZFsoZmlmbyldKQotI2RlZmluZSBUWFBLVFBFTkRJTkMod2xjLCBmaWZvLCB2YWwpCSgod2xjKS0+Y29yZS0+dHhwa3RwZW5kWyhmaWZvKV0gKz0gKHZhbCkpCi0jZGVmaW5lIFRYUEtUUEVORERFQyh3bGMsIGZpZm8sIHZhbCkJKCh3bGMpLT5jb3JlLT50eHBrdHBlbmRbKGZpZm8pXSAtPSAodmFsKSkKLSNkZWZpbmUgVFhQS1RQRU5EQ0xSKHdsYywgZmlmbykJCSgod2xjKS0+Y29yZS0+dHhwa3RwZW5kWyhmaWZvKV0gPSAwKQotI2RlZmluZSBUWEFWQUlMKHdsYywgZmlmbykJCSgqKHdsYyktPmNvcmUtPnR4YXZhaWxbKGZpZm8pXSkKLSNkZWZpbmUgR0VUTkVYVFRYUCh3bGMsIF9xdWV1ZSkJCQkJCQkJCVwKLQkJZG1hX2dldG5leHR0eHAoKHdsYyktPmh3LT5kaVsoX3F1ZXVlKV0sIERNQV9SQU5HRV9UUkFOU01JVFRFRCkKLQotI2RlZmluZSBCUkNNU19JU19NQVRDSF9TU0lEKHdsYywgc3NpZDEsIHNzaWQyLCBsZW4xLCBsZW4yKSBcCi0JKChsZW4xID09IGxlbjIpICYmICFtZW1jbXAoc3NpZDEsIHNzaWQyLCBsZW4xKSkKLQotZXh0ZXJuIHZvaWQgYnJjbXNfY19mYXRhbF9lcnJvcihzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotZXh0ZXJuIHZvaWQgYnJjbXNfYl9ycGNfd2F0Y2hkb2coc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKLWV4dGVybiB2b2lkIGJyY21zX2NfcmVjdihzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHN0cnVjdCBza19idWZmICpwKTsKLWV4dGVybiBib29sIGJyY21zX2NfZG90eHN0YXR1cyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHN0cnVjdCB0eF9zdGF0dXMgKnR4cywKLQkJCSAgICAgICB1MzIgZnJtX3R4Mik7Ci1leHRlcm4gdm9pZCBicmNtc19jX3R4ZmlmbyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHVpbnQgZmlmbywKLQkJCSAgIHN0cnVjdCBza19idWZmICpwLAotCQkJICAgYm9vbCBjb21taXQsIHM4IHR4cGt0cGVuZCk7Ci1leHRlcm4gdm9pZCBicmNtc19jX3R4Zmlmb19jb21wbGV0ZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHVpbnQgZmlmbywKLQkJCQkgICAgczggdHhwa3RwZW5kKTsKLWV4dGVybiB2b2lkIGJyY21zX2NfdHhxX2VucSh2b2lkICpjdHgsIHN0cnVjdCBzY2IgKnNjYiwgc3RydWN0IHNrX2J1ZmYgKnNkdSwKLQkJCSAgICB1aW50IHByZWMpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19pbmZvX2luaXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBpbnQgdW5pdCk7Ci1leHRlcm4gdm9pZCBicmNtc19jX3ByaW50X3R4c3RhdHVzKHN0cnVjdCB0eF9zdGF0dXMgKnR4cyk7Ci1leHRlcm4gaW50IGJyY21zX2NfeG10Zmlmb19zel9nZXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB1aW50IGZpZm8sCi0JCQkJICB1aW50ICpibG9ja3MpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY193cml0ZV90ZW1wbGF0ZV9yYW0oc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBpbnQgb2Zmc2V0LAotCQkJCSAgICAgICBpbnQgbGVuLCB2b2lkICpidWYpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY193cml0ZV9od19iY250ZW1wbGF0ZXMoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB2b2lkICpiY24sCi0JCQkJCSAgaW50IGxlbiwgYm9vbCBib3RoKTsKLWV4dGVybiB2b2lkIGJyY21zX2NfcGxscmVxKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgYm9vbCBzZXQsIG1ib29sIHJlcV9iaXQpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19yZXNldF9ibWFjX2RvbmUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKLQotI2lmIGRlZmluZWQoQkNNREJHKQotZXh0ZXJuIHZvaWQgYnJjbXNfY19wcmludF9yeGgoc3RydWN0IGQxMXJ4aGRyICpyeGgpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19wcmludF90eGRlc2Moc3RydWN0IGQxMXR4aCAqdHhoKTsKLSNlbHNlCi0jZGVmaW5lIGJyY21zX2NfcHJpbnRfdHhkZXNjKGEpCi0jZW5kaWYKLQotZXh0ZXJuIHZvaWQgYnJjbXNfY19zZXR4YmFuZChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdWludCBiYW5kdW5pdCk7Ci1leHRlcm4gdm9pZCBicmNtc19jX2NvcmVkaXNhYmxlKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KTsKLQotZXh0ZXJuIGJvb2wgYnJjbXNfY192YWxpZF9yYXRlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgcmF0ZXNwZWNfdCByYXRlLAotCQkJICAgICAgIGludCBiYW5kLCBib29sIHZlcmJvc2UpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19hcF91cGQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKLQotLyogaGVscGVyIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgYnJjbXNfY19zaG1fc3NpZF91cGQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJCSBzdHJ1Y3QgYnJjbXNfYnNzX2NmZyAqY2ZnKTsKLWV4dGVybiBpbnQgYnJjbXNfY19zZXRfZ21vZGUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB1OCBnbW9kZSwgYm9vbCBjb25maWcpOwotCi1leHRlcm4gdm9pZCBicmNtc19jX21hY19iY25fcHJvbWlzY19jaGFuZ2Uoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJCQkgICBib29sIHByb21pc2MpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19tYWNfYmNuX3Byb21pc2Moc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKLWV4dGVybiB2b2lkIGJyY21zX2NfbWFjX3Byb21pc2Moc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKLWV4dGVybiB2b2lkIGJyY21zX2NfdHhmbG93Y29udHJvbChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsCi0JCQkJICBzdHJ1Y3QgYnJjbXNfdHhxX2luZm8gKnFpLAotCQkJCSAgYm9vbCBvbiwgaW50IHByaW8pOwotZXh0ZXJuIHZvaWQgYnJjbXNfY190eGZsb3djb250cm9sX292ZXJyaWRlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywKLQkJCQkgICAgICAgc3RydWN0IGJyY21zX3R4cV9pbmZvICpxaSwKLQkJCQkgICAgICAgYm9vbCBvbiwgdWludCBvdmVycmlkZSk7Ci1leHRlcm4gYm9vbCBicmNtc19jX3R4Zmxvd2NvbnRyb2xfcHJpb19pc3NldChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsCi0JCQkJCSAgICAgc3RydWN0IGJyY21zX3R4cV9pbmZvICpxaSwKLQkJCQkJICAgICBpbnQgcHJpbyk7Ci1leHRlcm4gdm9pZCBicmNtc19jX3NlbmRfcShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotZXh0ZXJuIGludCBicmNtc19jX3ByZXBfcGR1KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgc3RydWN0IHNrX2J1ZmYgKnBkdSwKLQkJCSAgICB1aW50ICpmaWZvKTsKLQotZXh0ZXJuIHUxNiBicmNtc19jX2NhbGNfbHNpZ19sZW4oc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCByYXRlc3BlY190IHJhdGVzcGVjLAotCQkJCXVpbnQgbWFjX2xlbik7Ci1leHRlcm4gcmF0ZXNwZWNfdCBicmNtc19jX3JzcGVjX3RvX3J0c19yc3BlYyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsCi0JCQkJCSAgICAgcmF0ZXNwZWNfdCByc3BlYywKLQkJCQkJICAgICBib29sIHVzZV9yc3BlYywgdTE2IG1pbW9fY3RsY2hidyk7Ci1leHRlcm4gdTE2IGJyY21zX2NfY29tcHV0ZV9ydHNjdHNfZHVyKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgYm9vbCBjdHNfb25seSwKLQkJCQkgICAgICByYXRlc3BlY190IHJ0c19yYXRlLAotCQkJCSAgICAgIHJhdGVzcGVjX3QgZnJhbWVfcmF0ZSwKLQkJCQkgICAgICB1OCBydHNfcHJlYW1ibGVfdHlwZSwKLQkJCQkgICAgICB1OCBmcmFtZV9wcmVhbWJsZV90eXBlLCB1aW50IGZyYW1lX2xlbiwKLQkJCQkgICAgICBib29sIGJhKTsKLQotZXh0ZXJuIHZvaWQgYnJjbXNfY190YnR0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1leHRlcm4gdm9pZCBicmNtc19jX2ludmFsX2RtYV9wa3RzKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqaHcsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCSAgICAgICB2b2lkICgqZG1hX2NhbGxiYWNrX2ZuKSk7Ci0KLWV4dGVybiB2b2lkIGJyY21zX2NfcmVwcmF0ZV9pbml0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1leHRlcm4gdm9pZCBicmNtc19jX2Jzc2NmZ19yZXByYXRlX2luaXQoc3RydWN0IGJyY21zX2Jzc19jZmcgKmJzc2NmZyk7Ci0KLS8qIFNoYXJlZCBtZW1vcnkgYWNjZXNzICovCi1leHRlcm4gdm9pZCBicmNtc19jX3dyaXRlX3NobShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHVpbnQgb2Zmc2V0LCB1MTYgdik7Ci1leHRlcm4gdTE2IGJyY21zX2NfcmVhZF9zaG0oc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB1aW50IG9mZnNldCk7Ci1leHRlcm4gdm9pZCBicmNtc19jX2NvcHl0b19zaG0oc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB1aW50IG9mZnNldCwKLQkJCSAgICAgICBjb25zdCB2b2lkICpidWYsIGludCBsZW4pOwotCi1leHRlcm4gdm9pZCBicmNtc19jX3VwZGF0ZV9iZWFjb24oc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKLWV4dGVybiB2b2lkIGJyY21zX2NfYnNzX3VwZGF0ZV9iZWFjb24oc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJCSAgc3RydWN0IGJyY21zX2Jzc19jZmcgKmJzc2NmZyk7Ci0KLWV4dGVybiB2b2lkIGJyY21zX2NfdXBkYXRlX3Byb2JlX3Jlc3Aoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBib29sIHN1c3BlbmQpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19ic3NfdXBkYXRlX3Byb2JlX3Jlc3Aoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJCQkgIHN0cnVjdCBicmNtc19ic3NfY2ZnICpjZmcsCi0JCQkJCSAgYm9vbCBzdXNwZW5kKTsKLWV4dGVybiBib29sIGJyY21zX2NfaXNtcGMoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKLWV4dGVybiBib29sIGJyY21zX2NfaXNfbm9uX2RlbGF5X21wYyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19yYWRpb19tcGNfdXBkKHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1leHRlcm4gYm9vbCBicmNtc19jX3ByZWNfZW5xKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgc3RydWN0IHBrdHEgKnEsCi0JCQkgICAgIHZvaWQgKnBrdCwgaW50IHByZWMpOwotZXh0ZXJuIGJvb2wgYnJjbXNfY19wcmVjX2VucV9oZWFkKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgc3RydWN0IHBrdHEgKnEsCi0JCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCBpbnQgcHJlYywgYm9vbCBoZWFkKTsKLWV4dGVybiB1MTYgYnJjbXNfY19waHl0eGN0bDFfY2FsYyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19jb21wdXRlX3BsY3Aoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCByYXRlc3BlY190IHJhdGUsCi0JCQkJIHVpbnQgbGVuZ3RoLCB1OCAqcGxjcCk7Ci1leHRlcm4gdWludCBicmNtc19jX2NhbGNfZnJhbWVfdGltZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsCi0JCQkJICAgIHJhdGVzcGVjX3QgcmF0ZXNwZWMsCi0JCQkJICAgIHU4IHByZWFtYmxlX3R5cGUsIHVpbnQgbWFjX2xlbik7Ci0KLWV4dGVybiB2b2lkIGJyY21zX2Nfc2V0X2NoYW5zcGVjKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywKLQkJCQkgY2hhbnNwZWNfdCBjaGFuc3BlYyk7Ci0KLWV4dGVybiBib29sIGJyY21zX2NfdGltZXJzX2luaXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBpbnQgdW5pdCk7Ci0KLWV4dGVybiBpbnQgYnJjbXNfY19zZXRfbm1vZGUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBzMzIgbm1vZGUpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19taW1vcHNfYWN0aW9uX2h0X3NlbmQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJCSAgICAgIHN0cnVjdCBicmNtc19ic3NfY2ZnICpic3NjZmcsCi0JCQkJICAgICAgdTggbWltb3BzX21vZGUpOwotCi1leHRlcm4gdm9pZCBicmNtc19jX3N3aXRjaF9zaG9ydHNsb3Qoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBib29sIHNob3J0c2xvdCk7Ci1leHRlcm4gdm9pZCBicmNtc19jX3NldF9ic3NpZChzdHJ1Y3QgYnJjbXNfYnNzX2NmZyAqY2ZnKTsKLWV4dGVybiB2b2lkIGJyY21zX2NfZWRjZl9zZXRwYXJhbXMoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBib29sIHN1c3BlbmQpOwotCi1leHRlcm4gdm9pZCBicmNtc19jX3NldF9yYXRldGFibGUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKLWV4dGVybiBpbnQgYnJjbXNfY19zZXRfbWFjKHN0cnVjdCBicmNtc19ic3NfY2ZnICpjZmcpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19iZWFjb25fcGh5dHhjdGxfdHhhbnRfdXBkKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywKLQkJCQkJICByYXRlc3BlY190IGJjbl9yYXRlKTsKLWV4dGVybiB2b2lkIGJyY21zX2NfbW9kX3ByYl9yc3BfcmF0ZV90YWJsZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsCi0JCQkJCSAgIHVpbnQgZnJhbWVfbGVuKTsKLWV4dGVybiByYXRlc3BlY190IGJyY21zX2NfbG93ZXN0X2Jhc2ljX3JzcGVjKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywKLQkJCQkJICAgICB3bGNfcmF0ZXNldF90ICpycyk7Ci1leHRlcm4gdm9pZCBicmNtc19jX3JhZGlvX2Rpc2FibGUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKLWV4dGVybiB2b2lkIGJyY21zX2NfYmNuX2xpX3VwZChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19zZXRfaG9tZV9jaGFuc3BlYyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsCi0JCQkJICAgICAgY2hhbnNwZWNfdCBjaGFuc3BlYyk7Ci1leHRlcm4gYm9vbCBicmNtc19jX3BzX2FsbG93ZWQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKLWV4dGVybiBib29sIGJyY21zX2Nfc3RheV9hd2FrZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY193bWVfaW5pdHBhcmFtc19zdGEoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJCSAgICAgICBzdHJ1Y3Qgd21lX3BhcmFtX2llICpwZSk7Ci0KLSNlbmRpZgkJCQkvKiBfQlJDTV9NQUlOX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL25pY3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9uaWNwY2kuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q3MWM1OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL25pY3BjaS5jCisrKyAvZGV2L251bGwKQEAgLTEsODUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0KLSNpbmNsdWRlIDxkZWZzLmg+Ci0jaW5jbHVkZSA8c29jLmg+Ci0jaW5jbHVkZSA8Y2hpcGNvbW1vbi5oPgotI2luY2x1ZGUgImFpdXRpbHMuaCIKLSNpbmNsdWRlICJwdWIuaCIKLSNpbmNsdWRlICJuaWNwY2kuaCIKLQotLyogU1BST00gb2Zmc2V0cyAqLwotI2RlZmluZSBTUlNIX0FTUE1fT0ZGU0VUCQk0CS8qIHdvcmQgNCAqLwotI2RlZmluZSBTUlNIX0FTUE1fRU5CCQkJMHgxOAkvKiBiaXQgMywgNCAqLwotI2RlZmluZSBTUlNIX0FTUE1fTDFfRU5CCQkweDEwCS8qIGJpdCA0ICovCi0jZGVmaW5lIFNSU0hfQVNQTV9MMHNfRU5CCQkweDgJLyogYml0IDMgKi8KLQotI2RlZmluZSBTUlNIX1BDSUVfTUlTQ19DT05GSUcJCTUJLyogd29yZCA1ICovCi0jZGVmaW5lIFNSU0hfTDIzUkVBRFlfRVhJVF9OT1BFUlNUCTB4ODAwMAkvKiBiaXQgMTUgKi8KLSNkZWZpbmUgU1JTSF9DTEtSRVFfT0ZGU0VUX1JFVjUJCTIwCS8qIHdvcmQgMjAgZm9yIHNyb20gcmV2IDw9IDUgKi8KLSNkZWZpbmUgU1JTSF9DTEtSRVFfRU5CCQkJMHgwODAwCS8qIGJpdCAxMSAqLwotI2RlZmluZSBTUlNIX0JEX09GRlNFVCAgICAgICAgICAgICAgICAgIDYJLyogd29yZCA2ICovCi0KLS8qIGNoaXBjb250cm9sICovCi0jZGVmaW5lIENISVBDVFJMXzQzMjFfUExMX0RPV04JCTB4ODAwMDAwLyogc2VyZGVzIFBMTCBkb3duIG92ZXJyaWRlICovCi0KLS8qIE1ESU8gY29udHJvbCAqLwotI2RlZmluZSBNRElPQ1RMX0RJVklTT1JfTUFTSwkJMHg3ZgkvKiBjbG9jayB0byBiZSB1c2VkIG9uIE1ESU8gKi8KLSNkZWZpbmUgTURJT0NUTF9ESVZJU09SX1ZBTAkJMHgyCi0jZGVmaW5lIE1ESU9DVExfUFJFQU1fRU4JCTB4ODAJLyogRW5hYmxlIHByZWFtYmxlIHNlcXVuY2UgKi8KLSNkZWZpbmUgTURJT0NUTF9BQ0NFU1NfRE9ORQkJMHgxMDAJLyogVHJhbnNhY3Rpb24gY29tcGxldGUgKi8KLQotLyogTURJTyBEYXRhICovCi0jZGVmaW5lIE1ESU9EQVRBX01BU0sJCQkweDAwMDBmZmZmCS8qIGRhdGEgMiBieXRlcyAqLwotI2RlZmluZSBNRElPREFUQV9UQQkJCTB4MDAwMjAwMDAJLyogVHVybmFyb3VuZCAqLwotCi0jZGVmaW5lIE1ESU9EQVRBX1JFR0FERFJfU0hGCQkxOAkJLyogUmVnYWRkciBzaGlmdCAqLwotI2RlZmluZSBNRElPREFUQV9SRUdBRERSX01BU0sJCTB4MDA3YzAwMDAJLyogUmVnYWRkciBNYXNrICovCi0jZGVmaW5lIE1ESU9EQVRBX0RFVkFERFJfU0hGCQkyMwkvKiBQaHlzbWVkaWEgZGV2YWRkciBzaGlmdCAqLwotI2RlZmluZSBNRElPREFUQV9ERVZBRERSX01BU0sJCTB4MGY4MDAwMDAKLQkJCQkJCS8qIFBoeXNtZWRpYSBkZXZhZGRyIE1hc2sgKi8KLQotLyogTURJTyBEYXRhIGZvciBvbGRlciByZXZpc2lvbnMgPCAxMCAqLwotI2RlZmluZSBNRElPREFUQV9SRUdBRERSX1NIRl9PTEQJMTgJLyogUmVnYWRkciBzaGlmdCAqLwotI2RlZmluZSBNRElPREFUQV9SRUdBRERSX01BU0tfT0xECTB4MDAzYzAwMDAKLQkJCQkJCS8qIFJlZ2FkZHIgTWFzayAqLwotI2RlZmluZSBNRElPREFUQV9ERVZBRERSX1NIRl9PTEQJMjIJLyogUGh5c21lZGlhIGRldmFkZHIgc2hpZnQgICovCi0jZGVmaW5lIE1ESU9EQVRBX0RFVkFERFJfTUFTS19PTEQJMHgwZmMwMDAwMAotCQkJCQkJLyogUGh5c21lZGlhIGRldmFkZHIgTWFzayAqLwotCi0vKiBUcmFuc2FjdGlvbnMgZmxhZ3MgKi8KLSNkZWZpbmUgTURJT0RBVEFfV1JJVEUJCQkweDEwMDAwMDAwCi0jZGVmaW5lIE1ESU9EQVRBX1JFQUQJCQkweDIwMDAwMDAwCi0jZGVmaW5lIE1ESU9EQVRBX1NUQVJUCQkJMHg0MDAwMDAwMAotCi0jZGVmaW5lIE1ESU9EQVRBX0RFVl9BRERSCQkweDAJLyogZGV2IGFkZHJlc3MgZm9yIHNlcmRlcyAqLwotI2RlZmluZQlNRElPREFUQV9CTEtfQUREUgkJMHgxRgkvKiBibGsgYWRkcmVzcyBmb3Igc2VyZGVzICovCi0KLS8qIHNlcmRlcyByZWdzIChyZXYgPCAxMCkgKi8KLSNkZWZpbmUgTURJT0RBVEFfREVWX1BMTAkJMHgxZAkvKiBTRVJERVMgUExMIERldiAqLwotI2RlZmluZSBNRElPREFUQV9ERVZfVFgJCQkweDFlCS8qIFNFUkRFUyBUWCBEZXYgKi8KLSNkZWZpbmUgTURJT0RBVEFfREVWX1JYCQkJMHgxZgkvKiBTRVJERVMgUlggRGV2ICovCi0KLS8qIFNFUkRFUyBSWCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgU0VSREVTX1JYX0NUUkwJCQkxCS8qIFJ4IGNudHJsICovCi0jZGVmaW5lIFNFUkRFU19SWF9USU1FUjEJCTIJLyogUnggVGltZXIxICovCi0jZGVmaW5lIFNFUkRFU19SWF9DRFIJCQk2CS8qIENEUiAqLwotI2RlZmluZSBTRVJERVNfUlhfQ0RSQlcJCQk3CS8qIENEUiBCVyAqLwotLyogU0VSREVTIFJYIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0VSREVTX1JYX0NUUkxfRk9SQ0UJCTB4ODAJLyogcnhwb2xhcml0eV9mb3JjZSAqLwotI2RlZmluZSBTRVJERVNfUlhfQ1RSTF9QT0xBUklUWQkJMHg0MAkvKiByeHBvbGFyaXR5X3ZhbHVlICovCi0KLS8qIFNFUkRFUyBQTEwgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFNFUkRFU19QTExfQ1RSTCAgICAgICAgICAgICAgICAgMQkvKiBQTEwgY29udHJvbCByZWcgKi8KLSNkZWZpbmUgUExMX0NUUkxfRlJFUURFVF9FTiAgICAgICAgICAgICAweDQwMDAJLyogYml0IDE0IGlzIEZSRVFERVQgb24gKi8KLQotLyogTGlua2NvbnRyb2wgcmVnIG9mZnNldCBpbiBQQ0lFIENhcCAqLwotI2RlZmluZSBQQ0lFX0NBUF9MSU5LQ1RSTF9PRkZTRVQJMTYJLyogb2Zmc2V0IGluIHBjaWUgY2FwICovCi0jZGVmaW5lIFBDSUVfQ0FQX0xDUkVHX0FTUE1MMHMJCTB4MDEJLyogQVNQTSBMMHMgaW4gbGlua2N0cmwgKi8KLSNkZWZpbmUgUENJRV9DQVBfTENSRUdfQVNQTUwxCQkweDAyCS8qIEFTUE0gTDEgaW4gbGlua2N0cmwgKi8KLSNkZWZpbmUgUENJRV9DTEtSRVFfRU5BQgkJMHgxMDAJLyogQ0xLUkVRIEVuYWIgaW4gbGlua2N0cmwgKi8KLQotI2RlZmluZSBQQ0lFX0FTUE1fRU5BQgkJCTMJLyogQVNQTSBMMHMgJiBMMSBpbiBsaW5rY3RybCAqLwotI2RlZmluZSBQQ0lFX0FTUE1fTDFfRU5BQgkJMgkvKiBBU1BNIEwwcyAmIEwxIGluIGxpbmtjdHJsICovCi0jZGVmaW5lIFBDSUVfQVNQTV9MMHNfRU5BQgkJMQkvKiBBU1BNIEwwcyAmIEwxIGluIGxpbmtjdHJsICovCi0jZGVmaW5lIFBDSUVfQVNQTV9ESVNBQgkJCTAJLyogQVNQTSBMMHMgJiBMMSBpbiBsaW5rY3RybCAqLwotCi0vKiBQb3dlciBtYW5hZ2VtZW50IHRocmVzaG9sZCAqLwotI2RlZmluZSBQQ0lFX0wxVEhSRVNIT0xEVElNRV9NQVNLICAgICAgIDB4RkYwMAkvKiBiaXRzIDggLSAxNSAqLwotI2RlZmluZSBQQ0lFX0wxVEhSRVNIT0xEVElNRV9TSElGVCAgICAgIDgJLyogUENJRV9MMVRIUkVTSE9MRFRJTUVfU0hJRlQgKi8KLSNkZWZpbmUgUENJRV9MMVRIUkVTSE9MRF9XQVJWQUwgICAgICAgICAweDcyCS8qIFdBUiB2YWx1ZSAqLwotI2RlZmluZSBQQ0lFX0FTUE1USU1FUl9FWFRFTkQJCTB4MDEwMDAwMDAKLQkJCQkJCS8qID4gcmV2NzoKLQkJCQkJCSAqIGVuYWJsZSBleHRlbmQgQVNQTSB0aW1lcgotCQkJCQkJICovCi0KLS8qIGRpZmZlcmVudCByZWdpc3RlciBzcGFjZXMgdG8gYWNjZXNzIHRocnUgcGNpZSBpbmRpcmVjdCBhY2Nlc3MgKi8KLSNkZWZpbmUgUENJRV9DT05GSUdSRUdTCQkxCS8qIEFjY2VzcyB0byBjb25maWcgc3BhY2UgKi8KLSNkZWZpbmUgUENJRV9QQ0lFUkVHUwkJMgkvKiBBY2Nlc3MgdG8gcGNpZSByZWdpc3RlcnMgKi8KLQotLyogUENJRSBwcm90b2NvbCBQSFkgZGlhZ25vc3RpYyByZWdpc3RlcnMgKi8KLSNkZWZpbmUJUENJRV9QTFBfU1RBVFVTUkVHCQkweDIwNAkvKiBTdGF0dXMgKi8KLQotLyogU3RhdHVzIHJlZyBQQ0lFX1BMUF9TVEFUVVNSRUcgKi8KLSNkZWZpbmUgUENJRV9QTFBfUE9MQVJJVFlJTlZfU1RBVAkweDEwCi0KLS8qIFBDSUUgcHJvdG9jb2wgRExMUCBkaWFnbm9zdGljIHJlZ2lzdGVycyAqLwotI2RlZmluZSBQQ0lFX0RMTFBfTENSRUcJCQkweDEwMAkvKiBMaW5rIENvbnRyb2wgKi8KLSNkZWZpbmUgUENJRV9ETExQX1BNVEhSRVNIUkVHCQkweDEyOAkvKiBQb3dlciBNYW5hZ2VtZW50IFRocmVzaG9sZCAqLwotCi0vKiBQQ0lFIHByb3RvY29sIFRMUCBkaWFnbm9zdGljIHJlZ2lzdGVycyAqLwotI2RlZmluZSBQQ0lFX1RMUF9XT1JLQVJPVU5EU1JFRwkJMHgwMDQJLyogVExQIFdvcmthcm91bmRzICovCi0KLS8qIFNvbmljcyBzaWRlOiBQQ0kgY29yZSBhbmQgaG9zdCBjb250cm9sIHJlZ2lzdGVycyAqLwotc3RydWN0IHNicGNpcmVncyB7Ci0JdTMyIGNvbnRyb2w7CQkvKiBQQ0kgY29udHJvbCAqLwotCXUzMiBQQURbM107Ci0JdTMyIGFyYmNvbnRyb2w7CQkvKiBQQ0kgYXJiaXRlciBjb250cm9sICovCi0JdTMyIGNsa3J1bjsJCS8qIENsa3J1biBDb250cm9sICg+PXJldjExKSAqLwotCXUzMiBQQURbMl07Ci0JdTMyIGludHN0YXR1czsJCS8qIEludGVycnVwdCBzdGF0dXMgKi8KLQl1MzIgaW50bWFzazsJCS8qIEludGVycnVwdCBtYXNrICovCi0JdTMyIHNidG9wY2ltYWlsYm94OwkvKiBTb25pY3MgdG8gUENJIG1haWxib3ggKi8KLQl1MzIgUEFEWzldOwotCXUzMiBiY2FzdGFkZHI7CQkvKiBTb25pY3MgYnJvYWRjYXN0IGFkZHJlc3MgKi8KLQl1MzIgYmNhc3RkYXRhOwkJLyogU29uaWNzIGJyb2FkY2FzdCBkYXRhICovCi0JdTMyIFBBRFsyXTsKLQl1MzIgZ3Bpb2luOwkJLyogcm86IGdwaW8gaW5wdXQgKD49cmV2MikgKi8KLQl1MzIgZ3Bpb291dDsJCS8qIHJ3OiBncGlvIG91dHB1dCAoPj1yZXYyKSAqLwotCXUzMiBncGlvb3V0ZW47CQkvKiBydzogZ3BpbyBvdXRwdXQgZW5hYmxlICg+PSByZXYyKSAqLwotCXUzMiBncGlvY29udHJvbDsJLyogcnc6IGdwaW8gY29udHJvbCAoPj0gcmV2MikgKi8KLQl1MzIgUEFEWzM2XTsKLQl1MzIgc2J0b3BjaTA7CQkvKiBTb25pY3MgdG8gUENJIHRyYW5zbGF0aW9uIDAgKi8KLQl1MzIgc2J0b3BjaTE7CQkvKiBTb25pY3MgdG8gUENJIHRyYW5zbGF0aW9uIDEgKi8KLQl1MzIgc2J0b3BjaTI7CQkvKiBTb25pY3MgdG8gUENJIHRyYW5zbGF0aW9uIDIgKi8KLQl1MzIgUEFEWzE4OV07Ci0JdTMyIHBjaWNmZ1s0XVs2NF07CS8qIDB4NDAwIC0gMHg3RkYsIFBDSSBDZmcgU3BhY2UgKD49cmV2OCkgKi8KLQl1MTYgc3Byb21bMzZdOwkJLyogU1BST00gc2hhZG93IEFyZWEgKi8KLQl1MzIgUEFEWzQ2XTsKLX07Ci0KLS8qIFNCIHNpZGU6IFBDSUUgY29yZSBhbmQgaG9zdCBjb250cm9sIHJlZ2lzdGVycyAqLwotc3RydWN0IHNicGNpZXJlZ3MgewotCXUzMiBjb250cm9sOwkJLyogaG9zdCBtb2RlIG9ubHkgKi8KLQl1MzIgUEFEWzJdOwotCXUzMiBiaXN0c3RhdHVzOwkJLyogYmlzdCBTdGF0dXM6IDB4MDBDICovCi0JdTMyIGdwaW9zZWw7CQkvKiBQQ0lFIGdwaW8gc2VsOiAweDAxMCAqLwotCXUzMiBncGlvb3V0ZW47CQkvKiBQQ0lFIGdwaW8gb3V0ZW46IDB4MTQgKi8KLQl1MzIgUEFEWzJdOwotCXUzMiBpbnRzdGF0dXM7CQkvKiBJbnRlcnJ1cHQgc3RhdHVzOiAweDIwICovCi0JdTMyIGludG1hc2s7CQkvKiBJbnRlcnJ1cHQgbWFzazogMHgyNCAqLwotCXUzMiBzYnRvcGNpbWFpbGJveDsJLyogc2IgdG8gcGNpZSBtYWlsYm94OiAweDAyOCAqLwotCXUzMiBQQURbNTNdOwotCXUzMiBzYnRvcGNpZTA7CQkvKiBzYiB0byBwY2llIHRyYW5zbGF0aW9uIDA6IDB4MTAwICovCi0JdTMyIHNidG9wY2llMTsJCS8qIHNiIHRvIHBjaWUgdHJhbnNsYXRpb24gMTogMHgxMDQgKi8KLQl1MzIgc2J0b3BjaWUyOwkJLyogc2IgdG8gcGNpZSB0cmFuc2xhdGlvbiAyOiAweDEwOCAqLwotCXUzMiBQQURbNV07Ci0KLQkvKiBwY2llIGNvcmUgc3VwcG9ydHMgaW4gZGlyZWN0IGFjY2VzcyB0byBjb25maWcgc3BhY2UgKi8KLQl1MzIgY29uZmlnYWRkcjsJLyogcGNpZSBjb25maWcgc3BhY2UgYWNjZXNzOiBBZGRyZXNzIGZpZWxkOiAweDEyMCAqLwotCXUzMiBjb25maWdkYXRhOwkvKiBwY2llIGNvbmZpZyBzcGFjZSBhY2Nlc3M6IERhdGEgZmllbGQ6IDB4MTI0ICovCi0KLQkvKiBtZGlvIGFjY2VzcyB0byBzZXJkZXMgKi8KLQl1MzIgbWRpb2NvbnRyb2w7CS8qIGNvbnRyb2xzIHRoZSBtZGlvIGFjY2VzczogMHgxMjggKi8KLQl1MzIgbWRpb2RhdGE7CQkvKiBEYXRhIHRvIHRoZSBtZGlvIGFjY2VzczogMHgxMmMgKi8KLQotCS8qIHBjaWUgcHJvdG9jb2wgcGh5L2RsbHAvdGxwIHJlZ2lzdGVyIGluZGlyZWN0IGFjY2VzcyBtZWNoYW5pc20gKi8KLQl1MzIgcGNpZWluZGFkZHI7CS8qIGluZGlyZWN0IGFjY2VzcyB0bwotCQkJCSAqIHRoZSBpbnRlcm5hbCByZWdpc3RlcjogMHgxMzAKLQkJCQkgKi8KLQl1MzIgcGNpZWluZGRhdGE7CS8qIERhdGEgdG8vZnJvbSB0aGUgaW50ZXJuYWwgcmVnc2l0ZXI6IDB4MTM0ICovCi0KLQl1MzIgY2xrcmVxZW5jdHJsOwkvKiA+PSByZXYgNiwgQ2xrcmVxIHJkbWEgY29udHJvbCA6IDB4MTM4ICovCi0JdTMyIFBBRFsxNzddOwotCXUzMiBwY2llY2ZnWzRdWzY0XTsJLyogMHg0MDAgLSAweDdGRiwgUENJRSBDZmcgU3BhY2UgKi8KLQl1MTYgc3Byb21bNjRdOwkJLyogU1BST00gc2hhZG93IEFyZWEgKi8KLX07Ci0KLXN0cnVjdCBwY2ljb3JlX2luZm8gewotCXVuaW9uIHsKLQkJc3RydWN0IHNicGNpZXJlZ3MgKnBjaWVyZWdzOwotCQlzdHJ1Y3Qgc2JwY2lyZWdzICpwY2lyZWdzOwotCX0gcmVnczsJCQkvKiBNZW1vcnkgbWFwcGVkIHJlZ2lzdGVyIHRvIHRoZSBjb3JlICovCi0KLQlzdHJ1Y3Qgc2lfcHViICpzaWg7CS8qIFN5c3RlbSBpbnRlcmNvbm5lY3QgaGFuZGxlICovCi0Jc3RydWN0IHBjaV9kZXYgKmRldjsKLQl1OCBwY2llY2FwX2xjcmVnX29mZnNldDsvKiBQQ0lFIGNhcGFiaWxpdHkgTENyZWcgb2Zmc2V0Ci0JCQkJICogaW4gdGhlIGNvbmZpZyBzcGFjZQotCQkJCSAqLwotCWJvb2wgcGNpZV9wcjQyNzY3OwotCXU4IHBjaWVfcG9sYXJpdHk7Ci0JdTggcGNpZV93YXJfYXNwbV9vdnI7CS8qIE92ZXJyaWRlIEFTUE0vQ2xrcmVxIHNldHRpbmdzICovCi0KLQl1OCBwbWVjYXBfb2Zmc2V0OwkvKiBQTSBDYXBhYmlsaXR5IG9mZnNldCBpbiB0aGUgY29uZmlnIHNwYWNlICovCi0JYm9vbCBwbWVjYXA7CQkvKiBDYXBhYmxlIG9mIGdlbmVyYXRpbmcgUE1FICovCi19OwotCi0vKiBkZWJ1Zy90cmFjZSAqLwotI2RlZmluZQlQQ0lfRVJST1IoYXJncykKLSNkZWZpbmUgUENJRV9QVUIoc2loKQkJCQkJCQlcCi0JKCgoc2loKS0+YnVzdHlwZSA9PSBQQ0lfQlVTKSAmJgkJCQkJXAotCSAoKHNpaCktPmJ1c2NvcmV0eXBlID09IFBDSUVfQ09SRV9JRCkpCi0KLS8qIHJvdXRpbmVzIHRvIGFjY2VzcyBtZGlvIHNsYXZlIGRldmljZSByZWdpc3RlcnMgKi8KLXN0YXRpYyBib29sIHBjaWVfbWRpb3NldGJsb2NrKHN0cnVjdCBwY2ljb3JlX2luZm8gKnBpLCB1aW50IGJsayk7Ci1zdGF0aWMgaW50IHBjaWVfbWRpb29wKHN0cnVjdCBwY2ljb3JlX2luZm8gKnBpLCB1aW50IHBoeXNtZWRpYSwgdWludCByZWdhZGRyLAotCQkgICAgICAgYm9vbCB3cml0ZSwgdWludCAqdmFsKTsKLXN0YXRpYyBpbnQgcGNpZV9tZGlvd3JpdGUoc3RydWN0IHBjaWNvcmVfaW5mbyAqcGksIHVpbnQgcGh5c21lZGlhLCB1aW50IHJlYWRkciwKLQkJCSAgdWludCB2YWwpOwotc3RhdGljIGludCBwY2llX21kaW9yZWFkKHN0cnVjdCBwY2ljb3JlX2luZm8gKnBpLCB1aW50IHBoeXNtZWRpYSwgdWludCByZWFkZHIsCi0JCQkgdWludCAqcmV0X3ZhbCk7Ci0KLXN0YXRpYyB2b2lkIHBjaWVfZXh0ZW5kTDF0aW1lcihzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaSwgYm9vbCBleHRlbmQpOwotc3RhdGljIHZvaWQgcGNpZV9jbGtyZXFfdXBkKHN0cnVjdCBwY2ljb3JlX2luZm8gKnBpLCB1aW50IHN0YXRlKTsKLQotc3RhdGljIHZvaWQgcGNpZV93YXJfYXNwbV9jbGtyZXEoc3RydWN0IHBjaWNvcmVfaW5mbyAqcGkpOwotc3RhdGljIHZvaWQgcGNpZV93YXJfc2VyZGVzKHN0cnVjdCBwY2ljb3JlX2luZm8gKnBpKTsKLXN0YXRpYyB2b2lkIHBjaWVfd2FyX25vcGxsZG93bihzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaSk7Ci1zdGF0aWMgdm9pZCBwY2llX3dhcl9wb2xhcml0eShzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaSk7Ci1zdGF0aWMgdm9pZCBwY2llX3dhcl9wY2lfc2V0dXAoc3RydWN0IHBjaWNvcmVfaW5mbyAqcGkpOwotCi0jZGVmaW5lIFBDSUVfQVNQTShzaWgpCQkJCQkJCVwKLQkoKFBDSUVfUFVCKHNpaCkpICYmCQkJCQkJXAotCSAoKChzaWgpLT5idXNjb3JlcmV2ID49IDMpICYmCQkJCQlcCi0JICAoKHNpaCktPmJ1c2NvcmVyZXYgPD0gNSkpKQotCi0KLS8qIGRlbGF5IG5lZWRlZCBiZXR3ZWVuIHRoZSBtZGlvIGNvbnRyb2wvIG1kaW9kYXRhIHJlZ2lzdGVyIGRhdGEgYWNjZXNzICovCi0jZGVmaW5lIFBSMjg4MjlfREVMQVkoKSB1ZGVsYXkoMTApCi0KLS8qIEluaXRpYWxpemUgdGhlIFBDSSBjb3JlLgotICogSXQncyBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIGlzIGRvbmUgb25seSBvbmNlCi0gKi8KLXZvaWQgKnBjaWNvcmVfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgsIHZvaWQgKnBkZXYsIHZvaWQgKnJlZ3MpCi17Ci0Jc3RydWN0IHBjaWNvcmVfaW5mbyAqcGk7Ci0KLQkvKiBhbGxvYyBzdHJ1Y3QgcGNpY29yZV9pbmZvICovCi0JcGkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGNpY29yZV9pbmZvKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHBpID09IE5VTEwpIHsKLQkJUENJX0VSUk9SKCgicGNpX2F0dGFjaDogbWFsbG9jIGZhaWxlZCFcbiIpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JcGktPnNpaCA9IHNpaDsKLQlwaS0+ZGV2ID0gcGRldjsKLQotCWlmIChzaWgtPmJ1c2NvcmV0eXBlID09IFBDSUVfQ09SRV9JRCkgewotCQl1OCBjYXBfcHRyOwotCQlwaS0+cmVncy5wY2llcmVncyA9IHJlZ3M7Ci0JCWNhcF9wdHIgPSBwY2ljb3JlX2ZpbmRfcGNpX2NhcGFiaWxpdHkocGktPmRldiwgUENJX0NBUF9JRF9FWFAsCi0JCQkJCQkgICAgICBOVUxMLCBOVUxMKTsKLQkJcGktPnBjaWVjYXBfbGNyZWdfb2Zmc2V0ID0gY2FwX3B0ciArIFBDSUVfQ0FQX0xJTktDVFJMX09GRlNFVDsKLQl9IGVsc2UKLQkJcGktPnJlZ3MucGNpcmVncyA9IHJlZ3M7Ci0KLQlyZXR1cm4gcGk7Ci19Ci0KLXZvaWQgcGNpY29yZV9kZWluaXQodm9pZCAqcGNoKQotewotCWtmcmVlKHBjaCk7Ci19Ci0KLS8qIHJldHVybiBjYXBfb2Zmc2V0IGlmIHJlcXVlc3RlZCBjYXBhYmlsaXR5IGV4aXN0cyBpbiB0aGUgUENJIGNvbmZpZyBzcGFjZSAqLwotLyogTm90ZSB0aGF0IGl0J3MgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gbWFrZSBzdXJlIGl0J3MgYSBwY2kgYnVzICovCi11OAotcGNpY29yZV9maW5kX3BjaV9jYXBhYmlsaXR5KHZvaWQgKmRldiwgdTggcmVxX2NhcF9pZCwKLQkJCSAgICB1bnNpZ25lZCBjaGFyICpidWYsIHUzMiAqYnVmbGVuKQotewotCXU4IGNhcF9pZDsKLQl1OCBjYXBfcHRyID0gMDsKLQl1MzIgYnVmc2l6ZTsKLQl1OCBieXRlX3ZhbDsKLQotCS8qIGNoZWNrIGZvciBIZWFkZXIgdHlwZSAwICovCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSEVBREVSX1RZUEUsICZieXRlX3ZhbCk7Ci0JaWYgKChieXRlX3ZhbCAmIDB4N2YpICE9IFBDSV9IRUFERVJfVFlQRV9OT1JNQUwpCi0JCWdvdG8gZW5kOwotCi0JLyogY2hlY2sgaWYgdGhlIGNhcGFiaWxpdHkgcG9pbnRlciBmaWVsZCBleGlzdHMgKi8KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9TVEFUVVMsICZieXRlX3ZhbCk7Ci0JaWYgKCEoYnl0ZV92YWwgJiBQQ0lfU1RBVFVTX0NBUF9MSVNUKSkKLQkJZ290byBlbmQ7Ci0KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9DQVBBQklMSVRZX0xJU1QsICZjYXBfcHRyKTsKLQkvKiBjaGVjayBpZiB0aGUgY2FwYWJpbGl0eSBwb2ludGVyIGlzIDB4MDAgKi8KLQlpZiAoY2FwX3B0ciA9PSAweDAwKQotCQlnb3RvIGVuZDsKLQotCS8qIGxvb3AgdGhydSB0aGUgY2FwYWJpbGl0eSBsaXN0Ci0JICogYW5kIHNlZSBpZiB0aGUgcGNpZSBjYXBhYmlsaXR5IGV4aXN0cwotCSAqLwotCi0JcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBjYXBfcHRyLCAmY2FwX2lkKTsKLQotCXdoaWxlIChjYXBfaWQgIT0gcmVxX2NhcF9pZCkgewotCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIGNhcF9wdHIgKyAxLCAmY2FwX3B0cik7Ci0JCWlmIChjYXBfcHRyID09IDB4MDApCi0JCQlicmVhazsKLQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBjYXBfcHRyLCAmY2FwX2lkKTsKLQl9Ci0JaWYgKGNhcF9pZCAhPSByZXFfY2FwX2lkKQotCQlnb3RvIGVuZDsKLQotCS8qIGZvdW5kIHRoZSBjYWxsZXIgcmVxdWVzdGVkIGNhcGFiaWxpdHkgKi8KLQlpZiAoYnVmICE9IE5VTEwgJiYgYnVmbGVuICE9IE5VTEwpIHsKLQkJdTggY2FwX2RhdGE7Ci0KLQkJYnVmc2l6ZSA9ICpidWZsZW47Ci0JCWlmICghYnVmc2l6ZSkKLQkJCWdvdG8gZW5kOwotCQkqYnVmbGVuID0gMDsKLQkJLyogY29weSB0aGUgY2FwYWJpbGl0eSBkYXRhIGV4Y2x1ZGluZyBjYXAgSUQgYW5kIG5leHQgcHRyICovCi0JCWNhcF9kYXRhID0gY2FwX3B0ciArIDI7Ci0JCWlmICgoYnVmc2l6ZSArIGNhcF9kYXRhKSA+IFBDSV9TWlBDUikKLQkJCWJ1ZnNpemUgPSBQQ0lfU1pQQ1IgLSBjYXBfZGF0YTsKLQkJKmJ1ZmxlbiA9IGJ1ZnNpemU7Ci0JCXdoaWxlIChidWZzaXplLS0pIHsKLQkJCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGRldiwgY2FwX2RhdGEsIGJ1Zik7Ci0JCQljYXBfZGF0YSsrOwotCQkJYnVmKys7Ci0JCX0KLQl9Ci1lbmQ6Ci0JcmV0dXJuIGNhcF9wdHI7Ci19Ci0KLS8qICoqKioqIFJlZ2lzdGVyIEFjY2VzcyBBUEkgKi8KLXN0YXRpYyB1aW50Ci1wY2llX3JlYWRyZWcoc3RydWN0IHNicGNpZXJlZ3MgKnBjaWVyZWdzLCB1aW50IGFkZHJ0eXBlLCB1aW50IG9mZnNldCkKLXsKLQl1aW50IHJldHZhbCA9IDB4RkZGRkZGRkY7Ci0KLQlzd2l0Y2ggKGFkZHJ0eXBlKSB7Ci0JY2FzZSBQQ0lFX0NPTkZJR1JFR1M6Ci0JCVdfUkVHKCZwY2llcmVncy0+Y29uZmlnYWRkciwgb2Zmc2V0KTsKLQkJKHZvaWQpUl9SRUcoKCZwY2llcmVncy0+Y29uZmlnYWRkcikpOwotCQlyZXR2YWwgPSBSX1JFRygmcGNpZXJlZ3MtPmNvbmZpZ2RhdGEpOwotCQlicmVhazsKLQljYXNlIFBDSUVfUENJRVJFR1M6Ci0JCVdfUkVHKCZwY2llcmVncy0+cGNpZWluZGFkZHIsIG9mZnNldCk7Ci0JCSh2b2lkKVJfUkVHKCZwY2llcmVncy0+cGNpZWluZGFkZHIpOwotCQlyZXR2YWwgPSBSX1JFRygmcGNpZXJlZ3MtPnBjaWVpbmRkYXRhKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIHVpbnQKLXBjaWVfd3JpdGVyZWcoc3RydWN0IHNicGNpZXJlZ3MgKnBjaWVyZWdzLCB1aW50IGFkZHJ0eXBlLCB1aW50IG9mZnNldCwgdWludCB2YWwpCi17Ci0Jc3dpdGNoIChhZGRydHlwZSkgewotCWNhc2UgUENJRV9DT05GSUdSRUdTOgotCQlXX1JFRygoJnBjaWVyZWdzLT5jb25maWdhZGRyKSwgb2Zmc2V0KTsKLQkJV19SRUcoKCZwY2llcmVncy0+Y29uZmlnZGF0YSksIHZhbCk7Ci0JCWJyZWFrOwotCWNhc2UgUENJRV9QQ0lFUkVHUzoKLQkJV19SRUcoKCZwY2llcmVncy0+cGNpZWluZGFkZHIpLCBvZmZzZXQpOwotCQlXX1JFRygoJnBjaWVyZWdzLT5wY2llaW5kZGF0YSksIHZhbCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGJvb2wgcGNpZV9tZGlvc2V0YmxvY2soc3RydWN0IHBjaWNvcmVfaW5mbyAqcGksIHVpbnQgYmxrKQotewotCXN0cnVjdCBzYnBjaWVyZWdzICpwY2llcmVncyA9IHBpLT5yZWdzLnBjaWVyZWdzOwotCXVpbnQgbWRpb2RhdGEsIGkgPSAwOwotCXVpbnQgcGNpZV9zZXJkZXNfc3BpbndhaXQgPSAyMDA7Ci0KLQltZGlvZGF0YSA9IChNRElPREFUQV9TVEFSVCB8IE1ESU9EQVRBX1dSSVRFIHwgTURJT0RBVEFfVEEgfAotCQkgICAgKE1ESU9EQVRBX0RFVl9BRERSIDw8IE1ESU9EQVRBX0RFVkFERFJfU0hGKSB8Ci0JCSAgICAoTURJT0RBVEFfQkxLX0FERFIgPDwgTURJT0RBVEFfUkVHQUREUl9TSEYpIHwKLQkJICAgIChibGsgPDwgNCkpOwotCVdfUkVHKCZwY2llcmVncy0+bWRpb2RhdGEsIG1kaW9kYXRhKTsKLQotCVBSMjg4MjlfREVMQVkoKTsKLQkvKiByZXRyeSB0aWxsIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZSAqLwotCXdoaWxlIChpIDwgcGNpZV9zZXJkZXNfc3BpbndhaXQpIHsKLQkJaWYgKFJfUkVHKCZwY2llcmVncy0+bWRpb2NvbnRyb2wpICYgTURJT0NUTF9BQ0NFU1NfRE9ORSkKLQkJCWJyZWFrOwotCQl1ZGVsYXkoMTAwMCk7Ci0JCWkrKzsKLQl9Ci0KLQlpZiAoaSA+PSBwY2llX3NlcmRlc19zcGlud2FpdCkgewotCQlQQ0lfRVJST1IoKCJwY2llX21kaW9zZXRibG9jazogdGltZWQgb3V0XG4iKSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGludAotcGNpZV9tZGlvb3Aoc3RydWN0IHBjaWNvcmVfaW5mbyAqcGksIHVpbnQgcGh5c21lZGlhLCB1aW50IHJlZ2FkZHIsIGJvb2wgd3JpdGUsCi0JICAgIHVpbnQgKnZhbCkKLXsKLQlzdHJ1Y3Qgc2JwY2llcmVncyAqcGNpZXJlZ3MgPSBwaS0+cmVncy5wY2llcmVnczsKLQl1aW50IG1kaW9kYXRhOwotCXVpbnQgaSA9IDA7Ci0JdWludCBwY2llX3NlcmRlc19zcGlud2FpdCA9IDEwOwotCi0JLyogZW5hYmxlIG1kaW8gYWNjZXNzIHRvIFNFUkRFUyAqLwotCVdfUkVHKCZwY2llcmVncy0+bWRpb2NvbnRyb2wsIE1ESU9DVExfUFJFQU1fRU4gfCBNRElPQ1RMX0RJVklTT1JfVkFMKTsKLQotCWlmIChwaS0+c2loLT5idXNjb3JlcmV2ID49IDEwKSB7Ci0JCS8qIG5ldyBzZXJkZXMgaXMgc2xvd2VyIGluIHJ3LAotCQkgKiB1c2luZyB0d28gbGF5ZXJzIG9mIHJlZyBhZGRyZXNzIG1hcHBpbmcKLQkJICovCi0JCWlmICghcGNpZV9tZGlvc2V0YmxvY2socGksIHBoeXNtZWRpYSkpCi0JCQlyZXR1cm4gMTsKLQkJbWRpb2RhdGEgPSAoKE1ESU9EQVRBX0RFVl9BRERSIDw8IE1ESU9EQVRBX0RFVkFERFJfU0hGKSB8Ci0JCQkgICAgKHJlZ2FkZHIgPDwgTURJT0RBVEFfUkVHQUREUl9TSEYpKTsKLQkJcGNpZV9zZXJkZXNfc3BpbndhaXQgKj0gMjA7Ci0JfSBlbHNlIHsKLQkJbWRpb2RhdGEgPSAoKHBoeXNtZWRpYSA8PCBNRElPREFUQV9ERVZBRERSX1NIRl9PTEQpIHwKLQkJCSAgICAocmVnYWRkciA8PCBNRElPREFUQV9SRUdBRERSX1NIRl9PTEQpKTsKLQl9Ci0KLQlpZiAoIXdyaXRlKQotCQltZGlvZGF0YSB8PSAoTURJT0RBVEFfU1RBUlQgfCBNRElPREFUQV9SRUFEIHwgTURJT0RBVEFfVEEpOwotCWVsc2UKLQkJbWRpb2RhdGEgfD0gKE1ESU9EQVRBX1NUQVJUIHwgTURJT0RBVEFfV1JJVEUgfCBNRElPREFUQV9UQSB8Ci0JCQkgICAgICp2YWwpOwotCi0JV19SRUcoJnBjaWVyZWdzLT5tZGlvZGF0YSwgbWRpb2RhdGEpOwotCi0JUFIyODgyOV9ERUxBWSgpOwotCi0JLyogcmV0cnkgdGlsbCB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUgKi8KLQl3aGlsZSAoaSA8IHBjaWVfc2VyZGVzX3NwaW53YWl0KSB7Ci0JCWlmIChSX1JFRygmcGNpZXJlZ3MtPm1kaW9jb250cm9sKSAmIE1ESU9DVExfQUNDRVNTX0RPTkUpIHsKLQkJCWlmICghd3JpdGUpIHsKLQkJCQlQUjI4ODI5X0RFTEFZKCk7Ci0JCQkJKnZhbCA9IChSX1JFRygmcGNpZXJlZ3MtPm1kaW9kYXRhKSAmCi0JCQkJCU1ESU9EQVRBX01BU0spOwotCQkJfQotCQkJLyogRGlzYWJsZSBtZGlvIGFjY2VzcyB0byBTRVJERVMgKi8KLQkJCVdfUkVHKCZwY2llcmVncy0+bWRpb2NvbnRyb2wsIDApOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJdWRlbGF5KDEwMDApOwotCQlpKys7Ci0JfQotCi0JUENJX0VSUk9SKCgicGNpZV9tZGlvb3A6IHRpbWVkIG91dCBvcDogJWRcbiIsIHdyaXRlKSk7Ci0JLyogRGlzYWJsZSBtZGlvIGFjY2VzcyB0byBTRVJERVMgKi8KLQlXX1JFRygmcGNpZXJlZ3MtPm1kaW9jb250cm9sLCAwKTsKLQlyZXR1cm4gMTsKLX0KLQotLyogdXNlIHRoZSBtZGlvIGludGVyZmFjZSB0byByZWFkIGZyb20gbWRpbyBzbGF2ZXMgKi8KLXN0YXRpYyBpbnQKLXBjaWVfbWRpb3JlYWQoc3RydWN0IHBjaWNvcmVfaW5mbyAqcGksIHVpbnQgcGh5c21lZGlhLCB1aW50IHJlZ2FkZHIsCi0JICAgICAgdWludCAqcmVndmFsKQotewotCXJldHVybiBwY2llX21kaW9vcChwaSwgcGh5c21lZGlhLCByZWdhZGRyLCBmYWxzZSwgcmVndmFsKTsKLX0KLQotLyogdXNlIHRoZSBtZGlvIGludGVyZmFjZSB0byB3cml0ZSB0byBtZGlvIHNsYXZlcyAqLwotc3RhdGljIGludAotcGNpZV9tZGlvd3JpdGUoc3RydWN0IHBjaWNvcmVfaW5mbyAqcGksIHVpbnQgcGh5c21lZGlhLCB1aW50IHJlZ2FkZHIsIHVpbnQgdmFsKQotewotCXJldHVybiBwY2llX21kaW9vcChwaSwgcGh5c21lZGlhLCByZWdhZGRyLCB0cnVlLCAmdmFsKTsKLX0KLQotLyogKioqKiogU3VwcG9ydCBmdW5jdGlvbnMgKioqKiogKi8KLXN0YXRpYyB1OCBwY2llX2Nsa3JlcSh2b2lkICpwY2gsIHUzMiBtYXNrLCB1MzIgdmFsKQotewotCXN0cnVjdCBwY2ljb3JlX2luZm8gKnBpID0gcGNoOwotCXUzMiByZWdfdmFsOwotCXU4IG9mZnNldDsKLQotCW9mZnNldCA9IHBpLT5wY2llY2FwX2xjcmVnX29mZnNldDsKLQlpZiAoIW9mZnNldCkKLQkJcmV0dXJuIDA7Ci0KLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGktPmRldiwgb2Zmc2V0LCAmcmVnX3ZhbCk7Ci0JLyogc2V0IG9wZXJhdGlvbiAqLwotCWlmIChtYXNrKSB7Ci0JCWlmICh2YWwpCi0JCQlyZWdfdmFsIHw9IFBDSUVfQ0xLUkVRX0VOQUI7Ci0JCWVsc2UKLQkJCXJlZ192YWwgJj0gflBDSUVfQ0xLUkVRX0VOQUI7Ci0JCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGktPmRldiwgb2Zmc2V0LCByZWdfdmFsKTsKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBpLT5kZXYsIG9mZnNldCwgJnJlZ192YWwpOwotCX0KLQlpZiAocmVnX3ZhbCAmIFBDSUVfQ0xLUkVRX0VOQUIpCi0JCXJldHVybiAxOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjaWVfZXh0ZW5kTDF0aW1lcihzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaSwgYm9vbCBleHRlbmQpCi17Ci0JdTMyIHc7Ci0Jc3RydWN0IHNpX3B1YiAqc2loID0gcGktPnNpaDsKLQlzdHJ1Y3Qgc2JwY2llcmVncyAqcGNpZXJlZ3MgPSBwaS0+cmVncy5wY2llcmVnczsKLQotCWlmICghUENJRV9QVUIoc2loKSB8fCBzaWgtPmJ1c2NvcmVyZXYgPCA3KQotCQlyZXR1cm47Ci0KLQl3ID0gcGNpZV9yZWFkcmVnKHBjaWVyZWdzLCBQQ0lFX1BDSUVSRUdTLCBQQ0lFX0RMTFBfUE1USFJFU0hSRUcpOwotCWlmIChleHRlbmQpCi0JCXcgfD0gUENJRV9BU1BNVElNRVJfRVhURU5EOwotCWVsc2UKLQkJdyAmPSB+UENJRV9BU1BNVElNRVJfRVhURU5EOwotCXBjaWVfd3JpdGVyZWcocGNpZXJlZ3MsIFBDSUVfUENJRVJFR1MsIFBDSUVfRExMUF9QTVRIUkVTSFJFRywgdyk7Ci0JdyA9IHBjaWVfcmVhZHJlZyhwY2llcmVncywgUENJRV9QQ0lFUkVHUywgUENJRV9ETExQX1BNVEhSRVNIUkVHKTsKLX0KLQotLyogY2VudHJhbGl6ZWQgY2xrcmVxIGNvbnRyb2wgcG9saWN5ICovCi1zdGF0aWMgdm9pZCBwY2llX2Nsa3JlcV91cGQoc3RydWN0IHBjaWNvcmVfaW5mbyAqcGksIHVpbnQgc3RhdGUpCi17Ci0Jc3RydWN0IHNpX3B1YiAqc2loID0gcGktPnNpaDsKLQotCXN3aXRjaCAoc3RhdGUpIHsKLQljYXNlIFNJX0RPQVRUQUNIOgotCQlpZiAoUENJRV9BU1BNKHNpaCkpCi0JCQlwY2llX2Nsa3JlcSgodm9pZCAqKXBpLCAxLCAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBTSV9QQ0lET1dOOgotCQlpZiAoc2loLT5idXNjb3JlcmV2ID09IDYpIHsJLyogdHVybiBvbiBzZXJkZXMgUExMIGRvd24gKi8KLQkJCWFpX2NvcmVyZWcoc2loLCBTSV9DQ19JRFgsCi0JCQkJICAgb2Zmc2V0b2YoY2hpcGNyZWdzX3QsIGNoaXBjb250cm9sX2FkZHIpLAotCQkJCSAgIH4wLCAwKTsKLQkJCWFpX2NvcmVyZWcoc2loLCBTSV9DQ19JRFgsCi0JCQkJICAgb2Zmc2V0b2YoY2hpcGNyZWdzX3QsIGNoaXBjb250cm9sX2RhdGEpLAotCQkJCSAgIH4weDQwLCAwKTsKLQkJfSBlbHNlIGlmIChwaS0+cGNpZV9wcjQyNzY3KSB7Ci0JCQlwY2llX2Nsa3JlcSgodm9pZCAqKXBpLCAxLCAxKTsKLQkJfQotCQlicmVhazsKLQljYXNlIFNJX1BDSVVQOgotCQlpZiAoc2loLT5idXNjb3JlcmV2ID09IDYpIHsJLyogdHVybiBvZmYgc2VyZGVzIFBMTCBkb3duICovCi0JCQlhaV9jb3JlcmVnKHNpaCwgU0lfQ0NfSURYLAotCQkJCSAgIG9mZnNldG9mKGNoaXBjcmVnc190LCBjaGlwY29udHJvbF9hZGRyKSwKLQkJCQkgICB+MCwgMCk7Ci0JCQlhaV9jb3JlcmVnKHNpaCwgU0lfQ0NfSURYLAotCQkJCSAgIG9mZnNldG9mKGNoaXBjcmVnc190LCBjaGlwY29udHJvbF9kYXRhKSwKLQkJCQkgICB+MHg0MCwgMHg0MCk7Ci0JCX0gZWxzZSBpZiAoUENJRV9BU1BNKHNpaCkpIHsJLyogZGlzYWJsZSBjbGtyZXEgKi8KLQkJCXBjaWVfY2xrcmVxKCh2b2lkICopcGksIDEsIDApOwotCQl9Ci0JCWJyZWFrOwotCX0KLX0KLQotLyogKioqKiogUENJIGNvcmUgV0FScyAqKioqKiAqLwotLyogRG9uZSBvbmx5IG9uY2UgYXQgYXR0YWNoIHRpbWUgKi8KLXN0YXRpYyB2b2lkIHBjaWVfd2FyX3BvbGFyaXR5KHN0cnVjdCBwY2ljb3JlX2luZm8gKnBpKQotewotCXUzMiB3OwotCi0JaWYgKHBpLT5wY2llX3BvbGFyaXR5ICE9IDApCi0JCXJldHVybjsKLQotCXcgPSBwY2llX3JlYWRyZWcocGktPnJlZ3MucGNpZXJlZ3MsIFBDSUVfUENJRVJFR1MsIFBDSUVfUExQX1NUQVRVU1JFRyk7Ci0KLQkvKiBEZXRlY3QgdGhlIGN1cnJlbnQgcG9sYXJpdHkgYXQgYXR0YWNoIGFuZCBmb3JjZSB0aGF0IHBvbGFyaXR5IGFuZAotCSAqIGRpc2FibGUgY2hhbmdpbmcgdGhlIHBvbGFyaXR5Ci0JICovCi0JaWYgKCh3ICYgUENJRV9QTFBfUE9MQVJJVFlJTlZfU1RBVCkgPT0gMCkKLQkJcGktPnBjaWVfcG9sYXJpdHkgPSBTRVJERVNfUlhfQ1RSTF9GT1JDRTsKLQllbHNlCi0JCXBpLT5wY2llX3BvbGFyaXR5ID0gKFNFUkRFU19SWF9DVFJMX0ZPUkNFIHwKLQkJCQkgICAgIFNFUkRFU19SWF9DVFJMX1BPTEFSSVRZKTsKLX0KLQotLyogZW5hYmxlIEFTUE0gYW5kIENMS1JFUSBpZiBzcm9tIGRvZXNuJ3QgaGF2ZSBpdCAqLwotLyogTmVlZHMgdG8gaGFwcGVuIHdoZW4gdXBkYXRlIHRvIHNoYWRvdyBTUk9NIGlzIG5lZWRlZAotICogICA6IENvbWluZyBvdXQgb2YgJ3N0YW5kYnknLydoaWJlcm5hdGUnCi0gKiAgIDogSWYgcGNpZV93YXJfYXNwbV9vdnIgc3RhdGUgY2hhbmdlZAotICovCi1zdGF0aWMgdm9pZCBwY2llX3dhcl9hc3BtX2Nsa3JlcShzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaSkKLXsKLQlzdHJ1Y3Qgc2JwY2llcmVncyAqcGNpZXJlZ3MgPSBwaS0+cmVncy5wY2llcmVnczsKLQlzdHJ1Y3Qgc2lfcHViICpzaWggPSBwaS0+c2loOwotCXUxNiB2YWwxNiwgKnJlZzE2OwotCXUzMiB3OwotCi0JaWYgKCFQQ0lFX0FTUE0oc2loKSkKLQkJcmV0dXJuOwotCi0JLyogYnlwYXNzIHRoaXMgb24gUVQgb3IgVlNJTSAqLwotCXJlZzE2ID0gJnBjaWVyZWdzLT5zcHJvbVtTUlNIX0FTUE1fT0ZGU0VUXTsKLQl2YWwxNiA9IFJfUkVHKHJlZzE2KTsKLQotCXZhbDE2ICY9IH5TUlNIX0FTUE1fRU5COwotCWlmIChwaS0+cGNpZV93YXJfYXNwbV9vdnIgPT0gUENJRV9BU1BNX0VOQUIpCi0JCXZhbDE2IHw9IFNSU0hfQVNQTV9FTkI7Ci0JZWxzZSBpZiAocGktPnBjaWVfd2FyX2FzcG1fb3ZyID09IFBDSUVfQVNQTV9MMV9FTkFCKQotCQl2YWwxNiB8PSBTUlNIX0FTUE1fTDFfRU5COwotCWVsc2UgaWYgKHBpLT5wY2llX3dhcl9hc3BtX292ciA9PSBQQ0lFX0FTUE1fTDBzX0VOQUIpCi0JCXZhbDE2IHw9IFNSU0hfQVNQTV9MMHNfRU5COwotCi0JV19SRUcocmVnMTYsIHZhbDE2KTsKLQotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwaS0+ZGV2LCBwaS0+cGNpZWNhcF9sY3JlZ19vZmZzZXQsICZ3KTsKLQl3ICY9IH5QQ0lFX0FTUE1fRU5BQjsKLQl3IHw9IHBpLT5wY2llX3dhcl9hc3BtX292cjsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBpLT5kZXYsIHBpLT5wY2llY2FwX2xjcmVnX29mZnNldCwgdyk7Ci0KLQlyZWcxNiA9ICZwY2llcmVncy0+c3Byb21bU1JTSF9DTEtSRVFfT0ZGU0VUX1JFVjVdOwotCXZhbDE2ID0gUl9SRUcocmVnMTYpOwotCi0JaWYgKHBpLT5wY2llX3dhcl9hc3BtX292ciAhPSBQQ0lFX0FTUE1fRElTQUIpIHsKLQkJdmFsMTYgfD0gU1JTSF9DTEtSRVFfRU5COwotCQlwaS0+cGNpZV9wcjQyNzY3ID0gdHJ1ZTsKLQl9IGVsc2UKLQkJdmFsMTYgJj0gflNSU0hfQ0xLUkVRX0VOQjsKLQotCVdfUkVHKHJlZzE2LCB2YWwxNik7Ci19Ci0KLS8qIEFwcGx5IHRoZSBwb2xhcml0eSBkZXRlcm1pbmVkIGF0IHRoZSBzdGFydCAqLwotLyogTmVlZHMgdG8gaGFwcGVuIHdoZW4gY29taW5nIG91dCBvZiAnc3RhbmRieScvJ2hpYmVybmF0ZScgKi8KLXN0YXRpYyB2b2lkIHBjaWVfd2FyX3NlcmRlcyhzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaSkKLXsKLQl1MzIgdyA9IDA7Ci0KLQlpZiAocGktPnBjaWVfcG9sYXJpdHkgIT0gMCkKLQkJcGNpZV9tZGlvd3JpdGUocGksIE1ESU9EQVRBX0RFVl9SWCwgU0VSREVTX1JYX0NUUkwsCi0JCQkgICAgICAgcGktPnBjaWVfcG9sYXJpdHkpOwotCi0JcGNpZV9tZGlvcmVhZChwaSwgTURJT0RBVEFfREVWX1BMTCwgU0VSREVTX1BMTF9DVFJMLCAmdyk7Ci0JaWYgKHcgJiBQTExfQ1RSTF9GUkVRREVUX0VOKSB7Ci0JCXcgJj0gflBMTF9DVFJMX0ZSRVFERVRfRU47Ci0JCXBjaWVfbWRpb3dyaXRlKHBpLCBNRElPREFUQV9ERVZfUExMLCBTRVJERVNfUExMX0NUUkwsIHcpOwotCX0KLX0KLQotLyogRml4IE1JU0MgY29uZmlnIHRvIGFsbG93IGNvbWluZyBvdXQgb2YgTDIvTDMtUmVhZHkgc3RhdGUgdy9vIFBSU1QgKi8KLS8qIE5lZWRzIHRvIGhhcHBlbiB3aGVuIGNvbWluZyBvdXQgb2YgJ3N0YW5kYnknLydoaWJlcm5hdGUnICovCi1zdGF0aWMgdm9pZCBwY2llX21pc2NfY29uZmlnX2ZpeHVwKHN0cnVjdCBwY2ljb3JlX2luZm8gKnBpKQotewotCXN0cnVjdCBzYnBjaWVyZWdzICpwY2llcmVncyA9IHBpLT5yZWdzLnBjaWVyZWdzOwotCXUxNiB2YWwxNiwgKnJlZzE2OwotCi0JcmVnMTYgPSAmcGNpZXJlZ3MtPnNwcm9tW1NSU0hfUENJRV9NSVNDX0NPTkZJR107Ci0JdmFsMTYgPSBSX1JFRyhyZWcxNik7Ci0KLQlpZiAoKHZhbDE2ICYgU1JTSF9MMjNSRUFEWV9FWElUX05PUEVSU1QpID09IDApIHsKLQkJdmFsMTYgfD0gU1JTSF9MMjNSRUFEWV9FWElUX05PUEVSU1Q7Ci0JCVdfUkVHKHJlZzE2LCB2YWwxNik7Ci0JfQotfQotCi0vKiBxdWljayBoYWNrIGZvciB0ZXN0aW5nICovCi0vKiBOZWVkcyB0byBoYXBwZW4gd2hlbiBjb21pbmcgb3V0IG9mICdzdGFuZGJ5Jy8naGliZXJuYXRlJyAqLwotc3RhdGljIHZvaWQgcGNpZV93YXJfbm9wbGxkb3duKHN0cnVjdCBwY2ljb3JlX2luZm8gKnBpKQotewotCXN0cnVjdCBzYnBjaWVyZWdzICpwY2llcmVncyA9IHBpLT5yZWdzLnBjaWVyZWdzOwotCXUxNiAqcmVnMTY7Ci0KLQkvKiB0dXJuIG9mZiBzZXJkZXMgUExMIGRvd24gKi8KLQlhaV9jb3JlcmVnKHBpLT5zaWgsIFNJX0NDX0lEWCwgb2Zmc2V0b2YoY2hpcGNyZWdzX3QsIGNoaXBjb250cm9sKSwKLQkJICAgQ0hJUENUUkxfNDMyMV9QTExfRE9XTiwgQ0hJUENUUkxfNDMyMV9QTExfRE9XTik7Ci0KLQkvKiBjbGVhciBzcm9tIHNoYWRvdyBiYWNrZG9vciAqLwotCXJlZzE2ID0gJnBjaWVyZWdzLT5zcHJvbVtTUlNIX0JEX09GRlNFVF07Ci0JV19SRUcocmVnMTYsIDApOwotfQotCi0vKiBOZWVkcyB0byBoYXBwZW4gd2hlbiBjb21pbmcgb3V0IG9mICdzdGFuZGJ5Jy8naGliZXJuYXRlJyAqLwotc3RhdGljIHZvaWQgcGNpZV93YXJfcGNpX3NldHVwKHN0cnVjdCBwY2ljb3JlX2luZm8gKnBpKQotewotCXN0cnVjdCBzaV9wdWIgKnNpaCA9IHBpLT5zaWg7Ci0Jc3RydWN0IHNicGNpZXJlZ3MgKnBjaWVyZWdzID0gcGktPnJlZ3MucGNpZXJlZ3M7Ci0JdTMyIHc7Ci0KLQlpZiAoc2loLT5idXNjb3JlcmV2ID09IDAgfHwgc2loLT5idXNjb3JlcmV2ID09IDEpIHsKLQkJdyA9IHBjaWVfcmVhZHJlZyhwY2llcmVncywgUENJRV9QQ0lFUkVHUywKLQkJCQkgUENJRV9UTFBfV09SS0FST1VORFNSRUcpOwotCQl3IHw9IDB4ODsKLQkJcGNpZV93cml0ZXJlZyhwY2llcmVncywgUENJRV9QQ0lFUkVHUywKLQkJCSAgICAgIFBDSUVfVExQX1dPUktBUk9VTkRTUkVHLCB3KTsKLQl9Ci0KLQlpZiAoc2loLT5idXNjb3JlcmV2ID09IDEpIHsKLQkJdyA9IHBjaWVfcmVhZHJlZyhwY2llcmVncywgUENJRV9QQ0lFUkVHUywgUENJRV9ETExQX0xDUkVHKTsKLQkJdyB8PSAweDQwOwotCQlwY2llX3dyaXRlcmVnKHBjaWVyZWdzLCBQQ0lFX1BDSUVSRUdTLCBQQ0lFX0RMTFBfTENSRUcsIHcpOwotCX0KLQotCWlmIChzaWgtPmJ1c2NvcmVyZXYgPT0gMCkgewotCQlwY2llX21kaW93cml0ZShwaSwgTURJT0RBVEFfREVWX1JYLCBTRVJERVNfUlhfVElNRVIxLCAweDgxMjgpOwotCQlwY2llX21kaW93cml0ZShwaSwgTURJT0RBVEFfREVWX1JYLCBTRVJERVNfUlhfQ0RSLCAweDAxMDApOwotCQlwY2llX21kaW93cml0ZShwaSwgTURJT0RBVEFfREVWX1JYLCBTRVJERVNfUlhfQ0RSQlcsIDB4MTQ2Nik7Ci0JfSBlbHNlIGlmIChQQ0lFX0FTUE0oc2loKSkgewotCQkvKiBDaGFuZ2UgdGhlIEwxIHRocmVzaG9sZCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlICovCi0JCXcgPSBwY2llX3JlYWRyZWcocGNpZXJlZ3MsIFBDSUVfUENJRVJFR1MsCi0JCQkJIFBDSUVfRExMUF9QTVRIUkVTSFJFRyk7Ci0JCXcgJj0gflBDSUVfTDFUSFJFU0hPTERUSU1FX01BU0s7Ci0JCXcgfD0gUENJRV9MMVRIUkVTSE9MRF9XQVJWQUwgPDwgUENJRV9MMVRIUkVTSE9MRFRJTUVfU0hJRlQ7Ci0JCXBjaWVfd3JpdGVyZWcocGNpZXJlZ3MsIFBDSUVfUENJRVJFR1MsCi0JCQkgICAgICBQQ0lFX0RMTFBfUE1USFJFU0hSRUcsIHcpOwotCi0JCXBjaWVfd2FyX3NlcmRlcyhwaSk7Ci0KLQkJcGNpZV93YXJfYXNwbV9jbGtyZXEocGkpOwotCX0gZWxzZSBpZiAocGktPnNpaC0+YnVzY29yZXJldiA9PSA3KQotCQlwY2llX3dhcl9ub3BsbGRvd24ocGkpOwotCi0JLyogTm90ZSB0aGF0IHRoZSBmaXggaXMgYWN0dWFsbHkgaW4gdGhlIFNST00sCi0JICogdGhhdCdzIHdoeSB0aGlzIGlzIG9wZW4tZW5kZWQKLQkgKi8KLQlpZiAocGktPnNpaC0+YnVzY29yZXJldiA+PSA2KQotCQlwY2llX21pc2NfY29uZmlnX2ZpeHVwKHBpKTsKLX0KLQotLyogKioqKiogRnVuY3Rpb25zIGNhbGxlZCBkdXJpbmcgZHJpdmVyIHN0YXRlIGNoYW5nZXMgKioqKiogKi8KLXZvaWQgcGNpY29yZV9hdHRhY2godm9pZCAqcGNoLCBjaGFyICpwdmFycywgaW50IHN0YXRlKQotewotCXN0cnVjdCBwY2ljb3JlX2luZm8gKnBpID0gcGNoOwotCXN0cnVjdCBzaV9wdWIgKnNpaCA9IHBpLT5zaWg7Ci0KLQkvKiBEZXRlcm1pbmUgaWYgdGhpcyBib2FyZCBuZWVkcyBvdmVycmlkZSAqLwotCWlmIChQQ0lFX0FTUE0oc2loKSkgewotCQlpZiAoKHUzMilnZXRpbnR2YXIocHZhcnMsICJib2FyZGZsYWdzMiIpICYgQkZMMl9QQ0lFV0FSX09WUikKLQkJCXBpLT5wY2llX3dhcl9hc3BtX292ciA9IFBDSUVfQVNQTV9ESVNBQjsKLQkJZWxzZQotCQkJcGktPnBjaWVfd2FyX2FzcG1fb3ZyID0gUENJRV9BU1BNX0VOQUI7Ci0JfQotCi0JLyogVGhlc2UgbmVlZCB0byBoYXBwZW4gaW4gdGhpcyBvcmRlciBvbmx5ICovCi0JcGNpZV93YXJfcG9sYXJpdHkocGkpOwotCi0JcGNpZV93YXJfc2VyZGVzKHBpKTsKLQotCXBjaWVfd2FyX2FzcG1fY2xrcmVxKHBpKTsKLQotCXBjaWVfY2xrcmVxX3VwZChwaSwgc3RhdGUpOwotCi19Ci0KLXZvaWQgcGNpY29yZV9od3VwKHZvaWQgKnBjaCkKLXsKLQlzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaSA9IHBjaDsKLQotCWlmICghcGkgfHwgIVBDSUVfUFVCKHBpLT5zaWgpKQotCQlyZXR1cm47Ci0KLQlwY2llX3dhcl9wY2lfc2V0dXAocGkpOwotfQotCi12b2lkIHBjaWNvcmVfdXAodm9pZCAqcGNoLCBpbnQgc3RhdGUpCi17Ci0Jc3RydWN0IHBjaWNvcmVfaW5mbyAqcGkgPSBwY2g7Ci0KLQlpZiAoIXBpIHx8ICFQQ0lFX1BVQihwaS0+c2loKSkKLQkJcmV0dXJuOwotCi0JLyogUmVzdG9yZSBMMSB0aW1lciBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlICovCi0JcGNpZV9leHRlbmRMMXRpbWVyKHBpLCB0cnVlKTsKLQotCXBjaWVfY2xrcmVxX3VwZChwaSwgc3RhdGUpOwotfQotCi0vKiBXaGVuIHRoZSBkZXZpY2UgaXMgZ29pbmcgdG8gZW50ZXIgRDMgc3RhdGUKLSAqIChvciB0aGUgc3lzdGVtIGlzIGdvaW5nIHRvIGVudGVyIFMzL1M0IHN0YXRlcykKLSAqLwotdm9pZCBwY2ljb3JlX3NsZWVwKHZvaWQgKnBjaCkKLXsKLQlzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaSA9IHBjaDsKLQl1MzIgdzsKLQotCWlmICghcGkgfHwgIVBDSUVfQVNQTShwaS0+c2loKSkKLQkJcmV0dXJuOwotCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBpLT5kZXYsIHBpLT5wY2llY2FwX2xjcmVnX29mZnNldCwgJncpOwotCXcgJj0gflBDSUVfQ0FQX0xDUkVHX0FTUE1MMTsKLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBpLT5kZXYsIHBpLT5wY2llY2FwX2xjcmVnX29mZnNldCwgdyk7Ci0KLQlwaS0+cGNpZV9wcjQyNzY3ID0gZmFsc2U7Ci19Ci0KLXZvaWQgcGNpY29yZV9kb3duKHZvaWQgKnBjaCwgaW50IHN0YXRlKQotewotCXN0cnVjdCBwY2ljb3JlX2luZm8gKnBpID0gcGNoOwotCi0JaWYgKCFwaSB8fCAhUENJRV9QVUIocGktPnNpaCkpCi0JCXJldHVybjsKLQotCXBjaWVfY2xrcmVxX3VwZChwaSwgc3RhdGUpOwotCi0JLyogUmVkdWNlIEwxIHRpbWVyIGZvciBiZXR0ZXIgcG93ZXIgc2F2aW5ncyAqLwotCXBjaWVfZXh0ZW5kTDF0aW1lcihwaSwgZmFsc2UpOwotfQotCi0vKiBwcmVjb25kaXRpb246IGN1cnJlbnQgY29yZSBpcyBzaWktPmJ1c2NvcmV0eXBlICovCi12b2lkIHBjaWNvcmVfZml4Y2ZnKHZvaWQgKnBjaCwgdm9pZCAqcmVncykKLXsKLQlzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaSA9IHBjaDsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpID0gU0lfSU5GTyhwaS0+c2loKTsKLQlzdHJ1Y3Qgc2JwY2lyZWdzICpwY2lyZWdzID0gcmVnczsKLQlzdHJ1Y3Qgc2JwY2llcmVncyAqcGNpZXJlZ3MgPSByZWdzOwotCXUxNiB2YWwxNiwgKnJlZzE2ID0gTlVMTDsKLQl1aW50IHBjaWlkeDsKLQotCS8qIGNoZWNrICdwaScgaXMgY29ycmVjdCBhbmQgZml4IGl0IGlmIG5vdCAqLwotCWlmIChzaWktPnB1Yi5idXNjb3JldHlwZSA9PSBQQ0lFX0NPUkVfSUQpCi0JCXJlZzE2ID0gJnBjaWVyZWdzLT5zcHJvbVtTUlNIX1BJX09GRlNFVF07Ci0JZWxzZSBpZiAoc2lpLT5wdWIuYnVzY29yZXR5cGUgPT0gUENJX0NPUkVfSUQpCi0JCXJlZzE2ID0gJnBjaXJlZ3MtPnNwcm9tW1NSU0hfUElfT0ZGU0VUXTsKLQlwY2lpZHggPSBhaV9jb3JlaWR4KCZzaWktPnB1Yik7Ci0JdmFsMTYgPSBSX1JFRyhyZWcxNik7Ci0JaWYgKCgodmFsMTYgJiBTUlNIX1BJX01BU0spID4+IFNSU0hfUElfU0hJRlQpICE9ICh1MTYpcGNpaWR4KSB7Ci0JCXZhbDE2ID0gKHUxNikocGNpaWR4IDw8IFNSU0hfUElfU0hJRlQpIHwKLQkJCSh2YWwxNiAmIH5TUlNIX1BJX01BU0spOwotCQlXX1JFRyhyZWcxNiwgdmFsMTYpOwotCX0KLX0KLQotLyogcHJlY29uZGl0aW9uOiBjdXJyZW50IGNvcmUgaXMgcGNpIGNvcmUgKi8KLXZvaWQgcGNpY29yZV9wY2lfc2V0dXAodm9pZCAqcGNoLCB2b2lkICpyZWdzKQotewotCXN0cnVjdCBwY2ljb3JlX2luZm8gKnBpID0gcGNoOwotCXN0cnVjdCBzYnBjaXJlZ3MgKnBjaXJlZ3MgPSByZWdzOwotCXUzMiB3OwotCi0JT1JfUkVHKCZwY2lyZWdzLT5zYnRvcGNpMiwgU0JUT1BDSV9QUkVGIHwgU0JUT1BDSV9CVVJTVCk7Ci0KLQlpZiAoU0lfSU5GTyhwaS0+c2loKS0+cHViLmJ1c2NvcmVyZXYgPj0gMTEpIHsKLQkJT1JfUkVHKCZwY2lyZWdzLT5zYnRvcGNpMiwgU0JUT1BDSV9SQ19SRUFETVVMVEkpOwotCQl3ID0gUl9SRUcoJnBjaXJlZ3MtPmNsa3J1bik7Ci0JCVdfUkVHKCZwY2lyZWdzLT5jbGtydW4sIHcgfCBQQ0lfQ0xLUlVOX0RTQkwpOwotCQl3ID0gUl9SRUcoJnBjaXJlZ3MtPmNsa3J1bik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9uaWNwY2kuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvbmljcGNpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MWY4NDIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9uaWNwY2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmCV9CUkNNX05JQ1BDSV9IXwotI2RlZmluZQlfQlJDTV9OSUNQQ0lfSF8KLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLS8qIFBDSSBjb25maWd1cmF0aW9uIGFkZHJlc3Mgc3BhY2Ugc2l6ZSAqLwotI2RlZmluZSBQQ0lfU1pQQ1IJCTI1NgotCi0vKiBCcmNtIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLwotLyogYmFja3BsYW5lIGFkZHJlc3Mgc3BhY2UgYWNjZXNzZWQgYnkgQkFSMCAqLwotI2RlZmluZSBQQ0lfQkFSMF9XSU4JCTB4ODAKLS8qIHNwcm9tIHByb3BlcnR5IGNvbnRyb2wgKi8KLSNkZWZpbmUgUENJX1NQUk9NX0NPTlRST0wJMHg4OAotLyogbWFzayBvZiBQQ0kgYW5kIG90aGVyIGNvcmVzIGludGVycnVwdHMgKi8KLSNkZWZpbmUgUENJX0lOVF9NQVNLCQkweDk0Ci0vKiBiYWNrcGxhbmUgY29yZSBpbnRlcnJ1cHQgbWFzayBiaXRzIG9mZnNldCAqLwotI2RlZmluZSAgUENJX1NCSU1fU0hJRlQJCTgKLS8qIGJhY2twbGFuZSBhZGRyZXNzIHNwYWNlIGFjY2Vzc2VkIGJ5IHNlY29uZCA0S0Igb2YgQkFSMCAqLwotI2RlZmluZSBQQ0lfQkFSMF9XSU4yCQkweGFjCi0vKiBwY2kgY29uZmlnIHNwYWNlIGdwaW8gaW5wdXQgKD49cmV2MykgKi8KLSNkZWZpbmUgUENJX0dQSU9fSU4JCTB4YjAKLS8qIHBjaSBjb25maWcgc3BhY2UgZ3BpbyBvdXRwdXQgKD49cmV2MykgKi8KLSNkZWZpbmUgUENJX0dQSU9fT1VUCQkweGI0Ci0vKiBwY2kgY29uZmlnIHNwYWNlIGdwaW8gb3V0cHV0IGVuYWJsZSAoPj1yZXYzKSAqLwotI2RlZmluZSBQQ0lfR1BJT19PVVRFTgkJMHhiOAotCi0vKiBiYXIwICsgNEsgYWNjZXNzZXMgZXh0ZXJuYWwgc3Byb20gKi8KLSNkZWZpbmUgUENJX0JBUjBfU1BST01fT0ZGU0VUCSg0ICogMTAyNCkKLS8qIGJhcjAgKyA2SyBhY2Nlc3NlcyBwY2kgY29yZSByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUENJX0JBUjBfUENJUkVHU19PRkZTRVQJKDYgKiAxMDI0KQotLyoKLSAqIHBjaSBjb3JlIFNCIHJlZ2lzdGVycyBhcmUgYXQgdGhlIGVuZCBvZiB0aGUKLSAqIDhLQiB3aW5kb3csIHNvIHRoZWlyIGFkZHJlc3MgaXMgdGhlICJyZWd1bGFyIgotICogYWRkcmVzcyBwbHVzIDRLCi0gKi8KLSNkZWZpbmUgUENJX0JBUjBfUENJU0JSX09GRlNFVAkoNCAqIDEwMjQpCi0vKiBiYXIwIHdpbmRvdyBzaXplIE1hdGNoIHdpdGggY29yZXJldiAxMyAqLwotI2RlZmluZSBQQ0lfQkFSMF9XSU5TWgkJKDE2ICogMTAyNCkKLS8qIE9uIHBjaSBjb3JlcmV2ID49IDEzIGFuZCBhbGwgcGNpZSwgdGhlIGJhcjAgaXMgbm93IDE2S0IgYW5kIGl0IG1hcHM6ICovCi0vKiBiYXIwICsgOEsgYWNjZXNzZXMgcGNpL3BjaWUgY29yZSByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUENJXzE2S0IwX1BDSVJFR1NfT0ZGU0VUICg4ICogMTAyNCkKLS8qIGJhcjAgKyAxMksgYWNjZXNzZXMgY2hpcGMgY29yZSByZWdpc3RlcnMgKi8KLSNkZWZpbmUgUENJXzE2S0IwX0NDUkVHU19PRkZTRVQJKDEyICogMTAyNCkKLQotI2RlZmluZSBQQ0lfQ0xLUlVOX0RTQkwJMHg4MDAwCS8qIEJpdCAxNSBmb3JjZUNsa3J1biAqLwotCi0vKiBTb25pY3MgdG8gUENJIHRyYW5zbGF0aW9uIHR5cGVzICovCi0jZGVmaW5lCVNCVE9QQ0lfUFJFRgkweDQJCS8qIHByZWZldGNoIGVuYWJsZSAqLwotI2RlZmluZQlTQlRPUENJX0JVUlNUCTB4OAkJLyogYnVyc3QgZW5hYmxlICovCi0jZGVmaW5lCVNCVE9QQ0lfUkNfUkVBRE1VTFRJCTB4MjAJLyogbWVtb3J5IHJlYWQgbXVsdGlwbGUgKi8KLQotLyogUENJIGNvcmUgaW5kZXggaW4gU1JPTSBzaGFkb3cgYXJlYSAqLwotI2RlZmluZSBTUlNIX1BJX09GRlNFVAkwCS8qIGZpcnN0IHdvcmQgKi8KLSNkZWZpbmUgU1JTSF9QSV9NQVNLCTB4ZjAwMAkvKiBiaXQgMTU6MTIgKi8KLSNkZWZpbmUgU1JTSF9QSV9TSElGVAkxMgkvKiBiaXQgMTU6MTIgKi8KLQotZXh0ZXJuIHZvaWQgKnBjaWNvcmVfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgsIHZvaWQgKnBkZXYsIHZvaWQgKnJlZ3MpOwotZXh0ZXJuIHZvaWQgcGNpY29yZV9kZWluaXQodm9pZCAqcGNoKTsKLWV4dGVybiB2b2lkIHBjaWNvcmVfYXR0YWNoKHZvaWQgKnBjaCwgY2hhciAqcHZhcnMsIGludCBzdGF0ZSk7Ci1leHRlcm4gdm9pZCBwY2ljb3JlX2h3dXAodm9pZCAqcGNoKTsKLWV4dGVybiB2b2lkIHBjaWNvcmVfdXAodm9pZCAqcGNoLCBpbnQgc3RhdGUpOwotZXh0ZXJuIHZvaWQgcGNpY29yZV9zbGVlcCh2b2lkICpwY2gpOwotZXh0ZXJuIHZvaWQgcGNpY29yZV9kb3duKHZvaWQgKnBjaCwgaW50IHN0YXRlKTsKLWV4dGVybiB1OCBwY2ljb3JlX2ZpbmRfcGNpX2NhcGFiaWxpdHkodm9pZCAqZGV2LCB1OCByZXFfY2FwX2lkLAotCQkJCQkgdW5zaWduZWQgY2hhciAqYnVmLCB1MzIgKmJ1Zmxlbik7Ci1leHRlcm4gdm9pZCBwY2ljb3JlX2ZpeGNmZyh2b2lkICpwY2gsIHZvaWQgKnJlZ3MpOwotZXh0ZXJuIHZvaWQgcGNpY29yZV9wY2lfc2V0dXAodm9pZCAqcGNoLCB2b2lkICpyZWdzKTsKLQotI2VuZGlmIC8qIF9CUkNNX05JQ1BDSV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9vdHAuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvb3RwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNzAxODAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9vdHAuYworKysgL2Rldi9udWxsCkBAIC0xLDU0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLQotI2luY2x1ZGUgPGJyY21faHdfaWRzLmg+Ci0jaW5jbHVkZSA8Y2hpcGNvbW1vbi5oPgotI2luY2x1ZGUgImFpdXRpbHMuaCIKLSNpbmNsdWRlICJvdHAuaCIKLQotI2RlZmluZSBPVFBTX0dVUF9NQVNLCQkweDAwMDAwZjAwCi0jZGVmaW5lIE9UUFNfR1VQX1NISUZUCQk4Ci0jZGVmaW5lIE9UUFNfR1VQX0hXCQkweDAwMDAwMTAwCS8qIGgvdyBzdWJyZWdpb24gaXMgcHJvZ3JhbW1lZCAqLwotI2RlZmluZSBPVFBTX0dVUF9TVwkJMHgwMDAwMDIwMAkvKiBzL3cgc3VicmVnaW9uIGlzIHByb2dyYW1tZWQgKi8KLSNkZWZpbmUgT1RQU19HVVBfQ0kJCTB4MDAwMDA0MDAJLyogY2hpcGlkL3BrZ29wdCBzdWJyZWdpb24gaXMgcHJvZ3JhbW1lZCAqLwotI2RlZmluZSBPVFBTX0dVUF9GVVNFCQkweDAwMDAwODAwCS8qIGZ1c2Ugc3VicmVnaW9uIGlzIHByb2dyYW1tZWQgKi8KLQotLyogRmllbGRzIGluIG90cHByb2cgaW4gcmV2ID49IDIxICovCi0jZGVmaW5lIE9UUFBfQ09MX01BU0sJCTB4MDAwMDAwZmYKLSNkZWZpbmUgT1RQUF9DT0xfU0hJRlQJCTAKLSNkZWZpbmUgT1RQUF9ST1dfTUFTSwkJMHgwMDAwZmYwMAotI2RlZmluZSBPVFBQX1JPV19TSElGVAkJOAotI2RlZmluZSBPVFBQX09DX01BU0sJCTB4MGYwMDAwMDAKLSNkZWZpbmUgT1RQUF9PQ19TSElGVAkJMjQKLSNkZWZpbmUgT1RQUF9SRUFERVJSCQkweDEwMDAwMDAwCi0jZGVmaW5lIE9UUFBfVkFMVUVfTUFTSwkJMHgyMDAwMDAwMAotI2RlZmluZSBPVFBQX1ZBTFVFX1NISUZUCTI5Ci0jZGVmaW5lIE9UUFBfU1RBUlRfQlVTWQkJMHg4MDAwMDAwMAotI2RlZmluZQlPVFBQX1JFQUQJCTB4NDAwMDAwMDAKLQotLyogT3Bjb2RlcyBmb3IgT1RQUF9PQyBmaWVsZCAqLwotI2RlZmluZSBPVFBQT0NfUkVBRAkJMAotI2RlZmluZSBPVFBQT0NfQklUX1BST0cJCTEKLSNkZWZpbmUgT1RQUE9DX1ZFUklGWQkJMwotI2RlZmluZSBPVFBQT0NfSU5JVAkJNAotI2RlZmluZSBPVFBQT0NfU0VUCQk1Ci0jZGVmaW5lIE9UUFBPQ19SRVNFVAkJNgotI2RlZmluZSBPVFBQT0NfT0NTVAkJNwotI2RlZmluZSBPVFBQT0NfUk9XX0xPQ0sJCTgKLSNkZWZpbmUgT1RQUE9DX1BSRVNDTl9URVNUCTkKLQotI2RlZmluZSBPVFBUWVBFX0lQWChjY3JldikJKChjY3JldikgPT0gMjEgfHwgKGNjcmV2KSA+PSAyMykKLQotI2RlZmluZSBPVFBQX1RSSUVTCTEwMDAwMDAwCS8qICMgb2YgdHJpZXMgZm9yIE9UUFAgKi8KLQotI2RlZmluZSBNQVhOVU1SREVTCQk5CS8qIE1heGltdW0gT1RQIHJlZHVuZGFuY3kgZW50cmllcyAqLwotCi0vKiBPVFAgY29tbW9uIGZ1bmN0aW9uIHR5cGUgKi8KLXR5cGVkZWYgaW50ICgqb3RwX3N0YXR1c190KSAodm9pZCAqb2gpOwotdHlwZWRlZiBpbnQgKCpvdHBfc2l6ZV90KSAodm9pZCAqb2gpOwotdHlwZWRlZiB2b2lkICooKm90cF9pbml0X3QpIChzdHJ1Y3Qgc2lfcHViICpzaWgpOwotdHlwZWRlZiB1MTYoKm90cF9yZWFkX2JpdF90KSAodm9pZCAqb2gsIGNoaXBjcmVnc190ICpjYywgdWludCBvZmYpOwotdHlwZWRlZiBpbnQgKCpvdHBfcmVhZF9yZWdpb25fdCkgKHN0cnVjdCBzaV9wdWIgKnNpaCwgaW50IHJlZ2lvbiwgdTE2ICpkYXRhLAotCQkJCSAgdWludCAqd2xlbik7Ci10eXBlZGVmIGludCAoKm90cF9udnJlYWRfdCkgKHZvaWQgKm9oLCBjaGFyICpkYXRhLCB1aW50ICpsZW4pOwotCi0vKiBPVFAgZnVuY3Rpb24gc3RydWN0ICovCi1zdHJ1Y3Qgb3RwX2ZuX3MgewotCW90cF9zaXplX3Qgc2l6ZTsKLQlvdHBfcmVhZF9iaXRfdCByZWFkX2JpdDsKLQlvdHBfaW5pdF90IGluaXQ7Ci0Jb3RwX3JlYWRfcmVnaW9uX3QgcmVhZF9yZWdpb247Ci0Jb3RwX252cmVhZF90IG52cmVhZDsKLQlvdHBfc3RhdHVzX3Qgc3RhdHVzOwotfTsKLQotc3RydWN0IG90cGluZm8gewotCXVpbnQgY2NyZXY7CQkvKiBjaGlwYyByZXZpc2lvbiAqLwotCXN0cnVjdCBvdHBfZm5fcyAqZm47CQkvKiBPVFAgZnVuY3Rpb25zICovCi0Jc3RydWN0IHNpX3B1YiAqc2loOwkJLyogU2F2ZWQgc2IgaGFuZGxlICovCi0KLQkvKiBJUFggT1RQIHNlY3Rpb24gKi8KLQl1MTYgd3NpemU7CQkvKiBTaXplIG9mIG90cCBpbiB3b3JkcyAqLwotCXUxNiByb3dzOwkJLyogR2VvbWV0cnkgKi8KLQl1MTYgY29sczsJCS8qIEdlb21ldHJ5ICovCi0JdTMyIHN0YXR1czsJCS8qIEZsYWcgYml0cyAobG9jay9wcm9nL3J2KS4KLQkJCQkgKiAoUmVmbGVjdGVkIG9ubHkgd2hlbiBPVFAgaXMgcG93ZXIgY3ljbGVkKQotCQkJCSAqLwotCXUxNiBod2Jhc2U7CQkvKiBoYXJkd2FyZSBzdWJyZWdpb24gb2Zmc2V0ICovCi0JdTE2IGh3bGltOwkJLyogaGFyZHdhcmUgc3VicmVnaW9uIGJvdW5kYXJ5ICovCi0JdTE2IHN3YmFzZTsJCS8qIHNvZnR3YXJlIHN1YnJlZ2lvbiBvZmZzZXQgKi8KLQl1MTYgc3dsaW07CQkvKiBzb2Z0d2FyZSBzdWJyZWdpb24gYm91bmRhcnkgKi8KLQl1MTYgZmJhc2U7CQkvKiBmdXNlIHN1YnJlZ2lvbiBvZmZzZXQgKi8KLQl1MTYgZmxpbTsJCS8qIGZ1c2Ugc3VicmVnaW9uIGJvdW5kYXJ5ICovCi0JaW50IG90cGd1X2Jhc2U7CQkvKiBvZmZzZXQgdG8gR2VuZXJhbCBVc2UgUmVnaW9uICovCi19OwotCi1zdGF0aWMgc3RydWN0IG90cGluZm8gb3RwaW5mbzsKLQotLyoKLSAqIElQWCBPVFAgQ29kZQotICoKLSAqICAgRXhwb3J0ZWQgZnVuY3Rpb25zOgotICoJaXB4b3RwX3N0YXR1cygpCi0gKglpcHhvdHBfc2l6ZSgpCi0gKglpcHhvdHBfaW5pdCgpCi0gKglpcHhvdHBfcmVhZF9iaXQoKQotICoJaXB4b3RwX3JlYWRfcmVnaW9uKCkKLSAqCWlweG90cF9udnJlYWQoKQotICoKLSAqLwotCi0jZGVmaW5lIEhXU1dfUkdOKHJnbikJCSgoKHJnbikgPT0gT1RQX0hXX1JHTikgPyAiaC93IiA6ICJzL3ciKQotCi0vKiBPVFAgbGF5b3V0ICovCi0vKiBDQyByZXZzIDIxLCAyNCBhbmQgMjcgT1RQIEdlbmVyYWwgVXNlIFJlZ2lvbiB3b3JkIG9mZnNldCAqLwotI2RlZmluZSBSRVZBNF9PVFBHVV9CQVNFCTEyCi0KLS8qIENDIHJldnMgMjMsIDI1LCAyNiwgMjggYW5kIGFib3ZlIE9UUCBHZW5lcmFsIFVzZSBSZWdpb24gd29yZCBvZmZzZXQgKi8KLSNkZWZpbmUgUkVWQjhfT1RQR1VfQkFTRQkyMAotCi0vKiBDQyByZXYgMzYgT1RQIEdlbmVyYWwgVXNlIFJlZ2lvbiB3b3JkIG9mZnNldCAqLwotI2RlZmluZSBSRVYzNl9PVFBHVV9CQVNFCTEyCi0KLS8qIFN1YnJlZ2lvbiB3b3JkIG9mZnNldHMgaW4gR2VuZXJhbCBVc2UgcmVnaW9uICovCi0jZGVmaW5lIE9UUEdVX0hTQl9PRkYJCTAKLSNkZWZpbmUgT1RQR1VfU0ZCX09GRgkJMQotI2RlZmluZSBPVFBHVV9DSV9PRkYJCTIKLSNkZWZpbmUgT1RQR1VfUF9PRkYJCTMKLSNkZWZpbmUgT1RQR1VfU1JPTV9PRkYJCTQKLQotLyogRmxhZyBiaXQgb2Zmc2V0cyBpbiBHZW5lcmFsIFVzZSByZWdpb24gICovCi0jZGVmaW5lIE9UUEdVX0hXUF9PRkYJCTYwCi0jZGVmaW5lIE9UUEdVX1NXUF9PRkYJCTYxCi0jZGVmaW5lIE9UUEdVX0NJUF9PRkYJCTYyCi0jZGVmaW5lIE9UUEdVX0ZVU0VQX09GRgkJNjMKLSNkZWZpbmUgT1RQR1VfQ0lQX01TSwkJMHg0MDAwCi0jZGVmaW5lIE9UUEdVX1BfTVNLCQkweGYwMDAKLSNkZWZpbmUgT1RQR1VfUF9TSElGVAkJKE9UUEdVX0hXUF9PRkYgJSAxNikKLQotLyogT1RQIFNpemUgKi8KLSNkZWZpbmUgT1RQX1NaX0ZVXzMyNAkJKChyb3VuZHVwKDMyNCwgOCkpLzgpCS8qIDMyNCBiaXRzICovCi0jZGVmaW5lIE9UUF9TWl9GVV8yODgJCSgyODgvOCkJLyogMjg4IGJpdHMgKi8KLSNkZWZpbmUgT1RQX1NaX0ZVXzIxNgkJKDIxNi84KQkvKiAyMTYgYml0cyAqLwotI2RlZmluZSBPVFBfU1pfRlVfNzIJCSg3Mi84KQkvKiA3MiBiaXRzICovCi0jZGVmaW5lIE9UUF9TWl9DSEVDS1NVTQkJKDE2LzgpCS8qIDE2IGJpdHMgKi8KLSNkZWZpbmUgT1RQNDMxNV9TV1JFR19TWgkxNzgJLyogMTc4IGJ5dGVzICovCi0jZGVmaW5lIE9UUF9TWl9GVV8xNDQJCSgxNDQvOCkJLyogMTQ0IGJpdHMgKi8KLQotc3RhdGljIGludCBpcHhvdHBfc3RhdHVzKHZvaWQgKm9oKQotewotCXN0cnVjdCBvdHBpbmZvICpvaSA9IChzdHJ1Y3Qgb3RwaW5mbyAqKSBvaDsKLQlyZXR1cm4gKGludCkob2ktPnN0YXR1cyk7Ci19Ci0KLS8qIFJldHVybiBzaXplIGluIGJ5dGVzICovCi1zdGF0aWMgaW50IGlweG90cF9zaXplKHZvaWQgKm9oKQotewotCXN0cnVjdCBvdHBpbmZvICpvaSA9IChzdHJ1Y3Qgb3RwaW5mbyAqKSBvaDsKLQlyZXR1cm4gKGludClvaS0+d3NpemUgKiAyOwotfQotCi1zdGF0aWMgdTE2IGlweG90cF9vdHByKHZvaWQgKm9oLCBjaGlwY3JlZ3NfdCAqY2MsIHVpbnQgd24pCi17Ci0Jc3RydWN0IG90cGluZm8gKm9pOwotCi0Jb2kgPSAoc3RydWN0IG90cGluZm8gKikgb2g7Ci0KLQlyZXR1cm4gUl9SRUcoJmNjLT5zcm9tb3RwW3duXSk7Ci19Ci0KLXN0YXRpYyB1MTYgaXB4b3RwX3JlYWRfYml0KHZvaWQgKm9oLCBjaGlwY3JlZ3NfdCAqY2MsIHVpbnQgb2ZmKQotewotCXN0cnVjdCBvdHBpbmZvICpvaSA9IChzdHJ1Y3Qgb3RwaW5mbyAqKSBvaDsKLQl1aW50IGssIHJvdywgY29sOwotCXUzMiBvdHBwLCBzdDsKLQotCXJvdyA9IG9mZiAvIG9pLT5jb2xzOwotCWNvbCA9IG9mZiAlIG9pLT5jb2xzOwotCi0Jb3RwcCA9IE9UUFBfU1RBUlRfQlVTWSB8Ci0JICAgICgoT1RQUE9DX1JFQUQgPDwgT1RQUF9PQ19TSElGVCkgJiBPVFBQX09DX01BU0spIHwKLQkgICAgKChyb3cgPDwgT1RQUF9ST1dfU0hJRlQpICYgT1RQUF9ST1dfTUFTSykgfAotCSAgICAoKGNvbCA8PCBPVFBQX0NPTF9TSElGVCkgJiBPVFBQX0NPTF9NQVNLKTsKLQlXX1JFRygmY2MtPm90cHByb2csIG90cHApOwotCi0JZm9yIChrID0gMDsKLQkgICAgICgoc3QgPSBSX1JFRygmY2MtPm90cHByb2cpKSAmIE9UUFBfU1RBUlRfQlVTWSkKLQkgICAgICYmIChrIDwgT1RQUF9UUklFUyk7IGsrKykKLQkJOwotCWlmIChrID49IE9UUFBfVFJJRVMpIHsKLQkJcmV0dXJuIDB4ZmZmZjsKLQl9Ci0JaWYgKHN0ICYgT1RQUF9SRUFERVJSKSB7Ci0JCXJldHVybiAweGZmZmY7Ci0JfQotCXN0ID0gKHN0ICYgT1RQUF9WQUxVRV9NQVNLKSA+PiBPVFBQX1ZBTFVFX1NISUZUOwotCi0JcmV0dXJuIChpbnQpc3Q7Ci19Ci0KLS8qIENhbGN1bGF0ZSBtYXggSFcvU1cgcmVnaW9uIGJ5dGUgc2l6ZSBieSBzdWJ0cmFjdGluZyBmdXNlIHJlZ2lvbiBhbmQgY2hlY2tzdW0gc2l6ZSwKLSAqIG9zaXpldyBpcyBvaS0+d3NpemUgKE9UUCBzaXplIC0gR1Ugc2l6ZSkgaW4gd29yZHMKLSAqLwotc3RhdGljIGludCBpcHhvdHBfbWF4X3JnbnN6KHN0cnVjdCBzaV9wdWIgKnNpaCwgaW50IG9zaXpldykKLXsKLQlpbnQgcmV0ID0gMDsKLQotCXN3aXRjaCAoc2loLT5jaGlwKSB7Ci0JY2FzZSBCQ000MzIyNF9DSElQX0lEOgotCWNhc2UgQkNNNDMyMjVfQ0hJUF9JRDoKLQkJcmV0ID0gb3NpemV3ICogMiAtIE9UUF9TWl9GVV83MiAtIE9UUF9TWl9DSEVDS1NVTTsKLQkJYnJlYWs7Ci0JY2FzZSBCQ000MzEzX0NISVBfSUQ6Ci0JCXJldCA9IG9zaXpldyAqIDIgLSBPVFBfU1pfRlVfNzIgLSBPVFBfU1pfQ0hFQ0tTVU07Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwkvKiBEb24ndCBrbm93IGFib3V0IHRoaXMgY2hpcCAqLwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9pcHhvdHBfaW5pdChzdHJ1Y3Qgb3RwaW5mbyAqb2ksIGNoaXBjcmVnc190ICpjYykKLXsKLQl1aW50IGs7Ci0JdTMyIG90cHAsIHN0OwotCi0JLyogcmVjb3JkIHdvcmQgb2Zmc2V0IG9mIEdlbmVyYWwgVXNlIFJlZ2lvbiBmb3IgdmFyaW91cyBjaGlwY29tbW9uIHJldnMgKi8KLQlpZiAob2ktPnNpaC0+Y2NyZXYgPT0gMjEgfHwgb2ktPnNpaC0+Y2NyZXYgPT0gMjQKLQkgICAgfHwgb2ktPnNpaC0+Y2NyZXYgPT0gMjcpIHsKLQkJb2ktPm90cGd1X2Jhc2UgPSBSRVZBNF9PVFBHVV9CQVNFOwotCX0gZWxzZSBpZiAob2ktPnNpaC0+Y2NyZXYgPT0gMzYpIHsKLQkJLyogT1RQIHNpemUgZ3JlYXRlciB0aGFuIGVxdWFsIHRvIDJLQiAoMTI4IHdvcmRzKSwgb3RwZ3VfYmFzZSBpcyBzaW1pbGFyIHRvIHJldjIzICovCi0JCWlmIChvaS0+d3NpemUgPj0gMTI4KQotCQkJb2ktPm90cGd1X2Jhc2UgPSBSRVZCOF9PVFBHVV9CQVNFOwotCQllbHNlCi0JCQlvaS0+b3RwZ3VfYmFzZSA9IFJFVjM2X09UUEdVX0JBU0U7Ci0JfSBlbHNlIGlmIChvaS0+c2loLT5jY3JldiA9PSAyMyB8fCBvaS0+c2loLT5jY3JldiA+PSAyNSkgewotCQlvaS0+b3RwZ3VfYmFzZSA9IFJFVkI4X09UUEdVX0JBU0U7Ci0JfQotCi0JLyogRmlyc3QgaXNzdWUgYW4gaW5pdCBjb21tYW5kIHNvIHRoZSBzdGF0dXMgaXMgdXAgdG8gZGF0ZSAqLwotCW90cHAgPQotCSAgICBPVFBQX1NUQVJUX0JVU1kgfCAoKE9UUFBPQ19JTklUIDw8IE9UUFBfT0NfU0hJRlQpICYgT1RQUF9PQ19NQVNLKTsKLQotCVdfUkVHKCZjYy0+b3RwcHJvZywgb3RwcCk7Ci0JZm9yIChrID0gMDsKLQkgICAgICgoc3QgPSBSX1JFRygmY2MtPm90cHByb2cpKSAmIE9UUFBfU1RBUlRfQlVTWSkKLQkgICAgICYmIChrIDwgT1RQUF9UUklFUyk7IGsrKykKLQkJOwotCWlmIChrID49IE9UUFBfVFJJRVMpIHsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFJlYWQgT1RQIGxvY2sgYml0cyBhbmQgc3VicmVnaW9uIHByb2dyYW1tZWQgaW5kaWNhdGlvbiBiaXRzICovCi0Jb2ktPnN0YXR1cyA9IFJfUkVHKCZjYy0+b3Rwc3RhdHVzKTsKLQotCWlmICgob2ktPnNpaC0+Y2hpcCA9PSBCQ000MzIyNF9DSElQX0lEKQotCSAgICB8fCAob2ktPnNpaC0+Y2hpcCA9PSBCQ000MzIyNV9DSElQX0lEKSkgewotCQl1MzIgcF9iaXRzOwotCQlwX2JpdHMgPQotCQkgICAgKGlweG90cF9vdHByKG9pLCBjYywgb2ktPm90cGd1X2Jhc2UgKyBPVFBHVV9QX09GRikgJgotCQkgICAgIE9UUEdVX1BfTVNLKQotCQkgICAgPj4gT1RQR1VfUF9TSElGVDsKLQkJb2ktPnN0YXR1cyB8PSAocF9iaXRzIDw8IE9UUFNfR1VQX1NISUZUKTsKLQl9Ci0KLQkvKgotCSAqIGgvdyByZWdpb24gYmFzZSBhbmQgZnVzZSByZWdpb24gbGltaXQgYXJlIGZpeGVkIHRvIHRoZSB0b3AgYW5kCi0JICogdGhlIGJvdHRvbSBvZiB0aGUgZ2VuZXJhbCB1c2UgcmVnaW9uLiBFdmVyeXRoaW5nIGVsc2UgY2FuIGJlIGZsZXhpYmxlLgotCSAqLwotCW9pLT5od2Jhc2UgPSBvaS0+b3RwZ3VfYmFzZSArIE9UUEdVX1NST01fT0ZGOwotCW9pLT5od2xpbSA9IG9pLT53c2l6ZTsKLQlpZiAob2ktPnN0YXR1cyAmIE9UUFNfR1VQX0hXKSB7Ci0JCW9pLT5od2xpbSA9Ci0JCSAgICBpcHhvdHBfb3RwcihvaSwgY2MsIG9pLT5vdHBndV9iYXNlICsgT1RQR1VfSFNCX09GRikgLyAxNjsKLQkJb2ktPnN3YmFzZSA9IG9pLT5od2xpbTsKLQl9IGVsc2UKLQkJb2ktPnN3YmFzZSA9IG9pLT5od2Jhc2U7Ci0KLQkvKiBzdWJ0cmFjdCBmdXNlIGFuZCBjaGVja3N1bSBmcm9tIGJlZ2lubmluZyAqLwotCW9pLT5zd2xpbSA9IGlweG90cF9tYXhfcmduc3oob2ktPnNpaCwgb2ktPndzaXplKSAvIDI7Ci0KLQlpZiAob2ktPnN0YXR1cyAmIE9UUFNfR1VQX1NXKSB7Ci0JCW9pLT5zd2xpbSA9Ci0JCSAgICBpcHhvdHBfb3RwcihvaSwgY2MsIG9pLT5vdHBndV9iYXNlICsgT1RQR1VfU0ZCX09GRikgLyAxNjsKLQkJb2ktPmZiYXNlID0gb2ktPnN3bGltOwotCX0gZWxzZQotCQlvaS0+ZmJhc2UgPSBvaS0+c3diYXNlOwotCi0Jb2ktPmZsaW0gPSBvaS0+d3NpemU7Ci19Ci0KLXN0YXRpYyB2b2lkICppcHhvdHBfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgpCi17Ci0JdWludCBpZHg7Ci0JY2hpcGNyZWdzX3QgKmNjOwotCXN0cnVjdCBvdHBpbmZvICpvaTsKLQotCS8qIE1ha2Ugc3VyZSB3ZSdyZSBydW5uaW5nIElQWCBPVFAgKi8KLQlpZiAoIU9UUFRZUEVfSVBYKHNpaC0+Y2NyZXYpKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIE1ha2Ugc3VyZSBPVFAgaXMgbm90IGRpc2FibGVkICovCi0JaWYgKGFpX2lzX290cF9kaXNhYmxlZChzaWgpKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIE9UUCBpcyBhbHdheXMgcG93ZXJlZCAqLwotCW9pID0gJm90cGluZm87Ci0KLQkvKiBDaGVjayBmb3Igb3RwIHNpemUgKi8KLQlzd2l0Y2ggKChzaWgtPmNjY2FwcyAmIENDX0NBUF9PVFBTSVpFKSA+PiBDQ19DQVBfT1RQU0laRV9TSElGVCkgewotCWNhc2UgMDoKLQkJLyogTm90aGluZyB0aGVyZSAqLwotCQlyZXR1cm4gTlVMTDsKLQljYXNlIDE6CQkvKiAzMng2NCAqLwotCQlvaS0+cm93cyA9IDMyOwotCQlvaS0+Y29scyA9IDY0OwotCQlvaS0+d3NpemUgPSAxMjg7Ci0JCWJyZWFrOwotCWNhc2UgMjoJCS8qIDY0eDY0ICovCi0JCW9pLT5yb3dzID0gNjQ7Ci0JCW9pLT5jb2xzID0gNjQ7Ci0JCW9pLT53c2l6ZSA9IDI1NjsKLQkJYnJlYWs7Ci0JY2FzZSA1OgkJLyogOTZ4NjQgKi8KLQkJb2ktPnJvd3MgPSA5NjsKLQkJb2ktPmNvbHMgPSA2NDsKLQkJb2ktPndzaXplID0gMzg0OwotCQlicmVhazsKLQljYXNlIDc6CQkvKiAxNng2NCAqLy8qIDEwMjQgYml0cyAqLwotCQlvaS0+cm93cyA9IDE2OwotCQlvaS0+Y29scyA9IDY0OwotCQlvaS0+d3NpemUgPSA2NDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJLyogRG9uJ3Qga25vdyB0aGUgZ2VvbWV0cnkgKi8KLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyogUmV0cmlldmUgT1RQIHJlZ2lvbiBpbmZvICovCi0JaWR4ID0gYWlfY29yZWlkeChzaWgpOwotCWNjID0gYWlfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7Ci0KLQlfaXB4b3RwX2luaXQob2ksIGNjKTsKLQotCWFpX3NldGNvcmVpZHgoc2loLCBpZHgpOwotCi0JcmV0dXJuICh2b2lkICopb2k7Ci19Ci0KLXN0YXRpYyBpbnQgaXB4b3RwX3JlYWRfcmVnaW9uKHZvaWQgKm9oLCBpbnQgcmVnaW9uLCB1MTYgKmRhdGEsIHVpbnQgKndsZW4pCi17Ci0Jc3RydWN0IG90cGluZm8gKm9pID0gKHN0cnVjdCBvdHBpbmZvICopIG9oOwotCXVpbnQgaWR4OwotCWNoaXBjcmVnc190ICpjYzsKLQl1aW50IGJhc2UsIGksIHN6OwotCi0JLyogVmFsaWRhdGUgcmVnaW9uIHNlbGVjdGlvbiAqLwotCXN3aXRjaCAocmVnaW9uKSB7Ci0JY2FzZSBPVFBfSFdfUkdOOgotCQlzeiA9ICh1aW50KSBvaS0+aHdsaW0gLSBvaS0+aHdiYXNlOwotCQlpZiAoIShvaS0+c3RhdHVzICYgT1RQU19HVVBfSFcpKSB7Ci0JCQkqd2xlbiA9IHN6OwotCQkJcmV0dXJuIC1FTk9EQVRBOwotCQl9Ci0JCWlmICgqd2xlbiA8IHN6KSB7Ci0JCQkqd2xlbiA9IHN6OwotCQkJcmV0dXJuIC1FT1ZFUkZMT1c7Ci0JCX0KLQkJYmFzZSA9IG9pLT5od2Jhc2U7Ci0JCWJyZWFrOwotCWNhc2UgT1RQX1NXX1JHTjoKLQkJc3ogPSAoKHVpbnQpIG9pLT5zd2xpbSAtIG9pLT5zd2Jhc2UpOwotCQlpZiAoIShvaS0+c3RhdHVzICYgT1RQU19HVVBfU1cpKSB7Ci0JCQkqd2xlbiA9IHN6OwotCQkJcmV0dXJuIC1FTk9EQVRBOwotCQl9Ci0JCWlmICgqd2xlbiA8IHN6KSB7Ci0JCQkqd2xlbiA9IHN6OwotCQkJcmV0dXJuIC1FT1ZFUkZMT1c7Ci0JCX0KLQkJYmFzZSA9IG9pLT5zd2Jhc2U7Ci0JCWJyZWFrOwotCWNhc2UgT1RQX0NJX1JHTjoKLQkJc3ogPSBPVFBHVV9DSV9TWjsKLQkJaWYgKCEob2ktPnN0YXR1cyAmIE9UUFNfR1VQX0NJKSkgewotCQkJKndsZW4gPSBzejsKLQkJCXJldHVybiAtRU5PREFUQTsKLQkJfQotCQlpZiAoKndsZW4gPCBzeikgewotCQkJKndsZW4gPSBzejsKLQkJCXJldHVybiAtRU9WRVJGTE9XOwotCQl9Ci0JCWJhc2UgPSBvaS0+b3RwZ3VfYmFzZSArIE9UUEdVX0NJX09GRjsKLQkJYnJlYWs7Ci0JY2FzZSBPVFBfRlVTRV9SR046Ci0JCXN6ID0gKHVpbnQpIG9pLT5mbGltIC0gb2ktPmZiYXNlOwotCQlpZiAoIShvaS0+c3RhdHVzICYgT1RQU19HVVBfRlVTRSkpIHsKLQkJCSp3bGVuID0gc3o7Ci0JCQlyZXR1cm4gLUVOT0RBVEE7Ci0JCX0KLQkJaWYgKCp3bGVuIDwgc3opIHsKLQkJCSp3bGVuID0gc3o7Ci0JCQlyZXR1cm4gLUVPVkVSRkxPVzsKLQkJfQotCQliYXNlID0gb2ktPmZiYXNlOwotCQlicmVhazsKLQljYXNlIE9UUF9BTExfUkdOOgotCQlzeiA9ICgodWludCkgb2ktPmZsaW0gLSBvaS0+aHdiYXNlKTsKLQkJaWYgKCEob2ktPnN0YXR1cyAmIChPVFBTX0dVUF9IVyB8IE9UUFNfR1VQX1NXKSkpIHsKLQkJCSp3bGVuID0gc3o7Ci0JCQlyZXR1cm4gLUVOT0RBVEE7Ci0JCX0KLQkJaWYgKCp3bGVuIDwgc3opIHsKLQkJCSp3bGVuID0gc3o7Ci0JCQlyZXR1cm4gLUVPVkVSRkxPVzsKLQkJfQotCQliYXNlID0gb2ktPmh3YmFzZTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWR4ID0gYWlfY29yZWlkeChvaS0+c2loKTsKLQljYyA9IGFpX3NldGNvcmVpZHgob2ktPnNpaCwgU0lfQ0NfSURYKTsKLQotCS8qIFJlYWQgdGhlIGRhdGEgKi8KLQlmb3IgKGkgPSAwOyBpIDwgc3o7IGkrKykKLQkJZGF0YVtpXSA9IGlweG90cF9vdHByKG9oLCBjYywgYmFzZSArIGkpOwotCi0JYWlfc2V0Y29yZWlkeChvaS0+c2loLCBpZHgpOwotCSp3bGVuID0gc3o7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaXB4b3RwX252cmVhZCh2b2lkICpvaCwgY2hhciAqZGF0YSwgdWludCAqbGVuKQotewotCXJldHVybiAtRU5PVFNVUFA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgb3RwX2ZuX3MgaXB4b3RwX2ZuID0gewotCShvdHBfc2l6ZV90KSBpcHhvdHBfc2l6ZSwKLQkob3RwX3JlYWRfYml0X3QpIGlweG90cF9yZWFkX2JpdCwKLQotCShvdHBfaW5pdF90KSBpcHhvdHBfaW5pdCwKLQkob3RwX3JlYWRfcmVnaW9uX3QpIGlweG90cF9yZWFkX3JlZ2lvbiwKLQkob3RwX252cmVhZF90KSBpcHhvdHBfbnZyZWFkLAotCi0JKG90cF9zdGF0dXNfdCkgaXB4b3RwX3N0YXR1cwotfTsKLQotLyoKLSAqCW90cF9zdGF0dXMoKQotICoJb3RwX3NpemUoKQotICoJb3RwX3JlYWRfYml0KCkKLSAqCW90cF9pbml0KCkKLSAqCW90cF9yZWFkX3JlZ2lvbigpCi0gKglvdHBfbnZyZWFkKCkKLSAqLwotCi1pbnQgb3RwX3N0YXR1cyh2b2lkICpvaCkKLXsKLQlzdHJ1Y3Qgb3RwaW5mbyAqb2kgPSAoc3RydWN0IG90cGluZm8gKikgb2g7Ci0KLQlyZXR1cm4gb2ktPmZuLT5zdGF0dXMob2gpOwotfQotCi1pbnQgb3RwX3NpemUodm9pZCAqb2gpCi17Ci0Jc3RydWN0IG90cGluZm8gKm9pID0gKHN0cnVjdCBvdHBpbmZvICopIG9oOwotCi0JcmV0dXJuIG9pLT5mbi0+c2l6ZShvaCk7Ci19Ci0KLXUxNiBvdHBfcmVhZF9iaXQodm9pZCAqb2gsIHVpbnQgb2Zmc2V0KQotewotCXN0cnVjdCBvdHBpbmZvICpvaSA9IChzdHJ1Y3Qgb3RwaW5mbyAqKSBvaDsKLQl1aW50IGlkeCA9IGFpX2NvcmVpZHgob2ktPnNpaCk7Ci0JY2hpcGNyZWdzX3QgKmNjID0gYWlfc2V0Y29yZWlkeChvaS0+c2loLCBTSV9DQ19JRFgpOwotCXUxNiByZWFkQml0ID0gKHUxNikgb2ktPmZuLT5yZWFkX2JpdChvaCwgY2MsIG9mZnNldCk7Ci0JYWlfc2V0Y29yZWlkeChvaS0+c2loLCBpZHgpOwotCXJldHVybiByZWFkQml0OwotfQotCi12b2lkICpvdHBfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgpCi17Ci0Jc3RydWN0IG90cGluZm8gKm9pOwotCXZvaWQgKnJldCA9IE5VTEw7Ci0KLQlvaSA9ICZvdHBpbmZvOwotCW1lbXNldChvaSwgMCwgc2l6ZW9mKHN0cnVjdCBvdHBpbmZvKSk7Ci0KLQlvaS0+Y2NyZXYgPSBzaWgtPmNjcmV2OwotCi0JaWYgKE9UUFRZUEVfSVBYKG9pLT5jY3JldikpCi0JCW9pLT5mbiA9ICZpcHhvdHBfZm47Ci0KLQlpZiAob2ktPmZuID09IE5VTEwpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0Jb2ktPnNpaCA9IHNpaDsKLQotCXJldCA9IChvaS0+Zm4tPmluaXQpIChzaWgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50Ci1vdHBfcmVhZF9yZWdpb24oc3RydWN0IHNpX3B1YiAqc2loLCBpbnQgcmVnaW9uLCB1MTYgKmRhdGEsCi0JCQkJIHVpbnQgKndsZW4pIHsKLQl2b2lkICpvaDsKLQlpbnQgZXJyID0gMDsKLQotCWlmIChhaV9pc19vdHBfZGlzYWJsZWQoc2loKSkgewotCQllcnIgPSAtRVBFUk07Ci0JCWdvdG8gb3V0OwotCX0KLQotCW9oID0gb3RwX2luaXQoc2loKTsKLQlpZiAob2ggPT0gTlVMTCkgewotCQllcnIgPSAtRUJBREU7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWVyciA9ICgoKHN0cnVjdCBvdHBpbmZvICopIG9oKS0+Zm4tPnJlYWRfcmVnaW9uKQotCQkJCQkJKG9oLCByZWdpb24sIGRhdGEsIHdsZW4pOwotCi0gb3V0OgotCXJldHVybiBlcnI7Ci19Ci0KLWludCBvdHBfbnZyZWFkKHZvaWQgKm9oLCBjaGFyICpkYXRhLCB1aW50ICpsZW4pCi17Ci0Jc3RydWN0IG90cGluZm8gKm9pID0gKHN0cnVjdCBvdHBpbmZvICopIG9oOwotCi0JcmV0dXJuIG9pLT5mbi0+bnZyZWFkKG9oLCBkYXRhLCBsZW4pOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9vdHAuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvb3RwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZDNhNTYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9vdHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmCV9CUkNNX09UUF9IXwotI2RlZmluZQlfQlJDTV9PVFBfSF8KLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLS8qIE9UUCByZWdpb25zICovCi0jZGVmaW5lIE9UUF9IV19SR04JMQotI2RlZmluZSBPVFBfU1dfUkdOCTIKLSNkZWZpbmUgT1RQX0NJX1JHTgk0Ci0jZGVmaW5lIE9UUF9GVVNFX1JHTgk4Ci0jZGVmaW5lIE9UUF9BTExfUkdOCTB4ZgkvKiBGcm9tIGgvdyByZWdpb24gdG8gZW5kIG9mIE9UUCBpbmNsdWRpbmcgY2hlY2tzdW0gKi8KLQotLyogT1RQIFNpemUgKi8KLSNkZWZpbmUgT1RQX1NaX01BWAkJKDYxNDQvOCkJLyogbWF4aW11bSBieXRlcyBpbiBvbmUgQ0lTICovCi0KLS8qIEZpeGVkIHNpemUgc3VicmVnaW9ucyBzaXplcyBpbiB3b3JkcyAqLwotI2RlZmluZSBPVFBHVV9DSV9TWgkJMgotCi0vKiBPVFAgdXNhZ2UgKi8KLSNkZWZpbmUgT1RQNDMyNV9GTV9ESVNBQkxFRF9PRkZTRVQJMTg4Ci0KLS8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIGludCBvdHBfc3RhdHVzKHZvaWQgKm9oKTsKLWV4dGVybiBpbnQgb3RwX3NpemUodm9pZCAqb2gpOwotZXh0ZXJuIHUxNiBvdHBfcmVhZF9iaXQodm9pZCAqb2gsIHVpbnQgb2Zmc2V0KTsKLWV4dGVybiB2b2lkICpvdHBfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIGludCBvdHBfcmVhZF9yZWdpb24oc3RydWN0IHNpX3B1YiAqc2loLCBpbnQgcmVnaW9uLCB1MTYgKmRhdGEsCi0JCQkgICB1aW50ICp3bGVuKTsKLWV4dGVybiBpbnQgb3RwX252cmVhZCh2b2lkICpvaCwgY2hhciAqZGF0YSwgdWludCAqbGVuKTsKLQotI2VuZGlmCQkJCS8qIF9CUkNNX09UUF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2Ntbi5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2Ntbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzAxMmZiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9jbW4uYworKysgL2Rldi9udWxsCkBAIC0xLDMyMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotCi0jaW5jbHVkZSA8YnJjbV9od19pZHMuaD4KLSNpbmNsdWRlIDxjaGlwY29tbW9uLmg+Ci0jaW5jbHVkZSA8YWl1dGlscy5oPgotI2luY2x1ZGUgPGQxMS5oPgotI2luY2x1ZGUgPHBoeV9zaGltLmg+Ci0jaW5jbHVkZSAicGh5X2hhbC5oIgotI2luY2x1ZGUgInBoeV9pbnQuaCIKLSNpbmNsdWRlICJwaHlfcmFkaW8uaCIKLSNpbmNsdWRlICJwaHlfbGNuLmgiCi0jaW5jbHVkZSAicGh5cmVnX24uaCIKLQotdTMyIHBoeWhhbF9tc2dfbGV2ZWwgPSBQSFlIQUxfRVJST1I7Ci0KLXN0cnVjdCBjaGFuX2luZm9fYmFzaWMgewotCXUxNiBjaGFuOwotCXUxNiBmcmVxOwotfTsKLQotc3RhdGljIHN0cnVjdCBjaGFuX2luZm9fYmFzaWMgY2hhbl9pbmZvX2FsbFtdID0gewotCXsxLCAyNDEyfSwKLQl7MiwgMjQxN30sCi0JezMsIDI0MjJ9LAotCXs0LCAyNDI3fSwKLQl7NSwgMjQzMn0sCi0JezYsIDI0Mzd9LAotCXs3LCAyNDQyfSwKLQl7OCwgMjQ0N30sCi0JezksIDI0NTJ9LAotCXsxMCwgMjQ1N30sCi0JezExLCAyNDYyfSwKLQl7MTIsIDI0Njd9LAotCXsxMywgMjQ3Mn0sCi0JezE0LCAyNDg0fSwKLQotCXszNCwgNTE3MH0sCi0JezM4LCA1MTkwfSwKLQl7NDIsIDUyMTB9LAotCXs0NiwgNTIzMH0sCi0KLQl7MzYsIDUxODB9LAotCXs0MCwgNTIwMH0sCi0JezQ0LCA1MjIwfSwKLQl7NDgsIDUyNDB9LAotCXs1MiwgNTI2MH0sCi0JezU2LCA1MjgwfSwKLQl7NjAsIDUzMDB9LAotCXs2NCwgNTMyMH0sCi0KLQl7MTAwLCA1NTAwfSwKLQl7MTA0LCA1NTIwfSwKLQl7MTA4LCA1NTQwfSwKLQl7MTEyLCA1NTYwfSwKLQl7MTE2LCA1NTgwfSwKLQl7MTIwLCA1NjAwfSwKLQl7MTI0LCA1NjIwfSwKLQl7MTI4LCA1NjQwfSwKLQl7MTMyLCA1NjYwfSwKLQl7MTM2LCA1NjgwfSwKLQl7MTQwLCA1NzAwfSwKLQotCXsxNDksIDU3NDV9LAotCXsxNTMsIDU3NjV9LAotCXsxNTcsIDU3ODV9LAotCXsxNjEsIDU4MDV9LAotCXsxNjUsIDU4MjV9LAotCi0JezE4NCwgNDkyMH0sCi0JezE4OCwgNDk0MH0sCi0JezE5MiwgNDk2MH0sCi0JezE5NiwgNDk4MH0sCi0JezIwMCwgNTAwMH0sCi0JezIwNCwgNTAyMH0sCi0JezIwOCwgNTA0MH0sCi0JezIxMiwgNTA2MH0sCi0JezIxNiwgNTA4MDB9Ci19OwotCi11MTYgbHRybl9saXN0W1BIWV9MVFJOX0xJU1RfTEVOXSA9IHsKLQkweDE4ZjksIDB4MGQwMSwgMHgwMGU0LCAweGRlZjQsIDB4MDZmMSwgMHgwZmZjLAotCTB4ZmEyNywgMHgxZGZmLCAweDEwZjAsIDB4MDkxOCwgMHhmMjBhLCAweGUwMTAsCi0JMHgxNDE3LCAweDExMDQsIDB4ZjExNCwgMHhmMmZhLCAweGY3ZGIsIDB4ZTJmYywKLQkweGUxZmIsIDB4MTNlZSwgMHhmZjBkLCAweGU5MWMsIDB4MTcxYSwgMHgwMzE4LAotCTB4ZGEwMCwgMHgwM2U4LCAweDE3ZTYsIDB4ZTllNCwgMHhmZmYzLCAweDEzMTIsCi0JMHhlMTA1LCAweGUyMDQsIDB4ZjcyNSwgMHhmMjA2LCAweGYxZWMsIDB4MTFmYywKLQkweDE0ZTksIDB4ZTBmMCwgMHhmMmY2LCAweDA5ZTgsIDB4MTAxMCwgMHgxZDAxLAotCTB4ZmFkOSwgMHgwZjA0LCAweDA2MGYsIDB4ZGUwYywgMHgwMDFjLCAweDBkZmYsCi0JMHgxODA3LCAweGY2MWEsIDB4ZTQwZSwgMHgwZjE2LCAweDA1ZjksIDB4MThlYywKLQkweDBhMWIsIDB4ZmYxZSwgMHgyNjAwLCAweGZmZTIsIDB4MGFlNSwgMHgxODE0LAotCTB4MDUwNywgMHgwZmVhLCAweGU0ZjIsIDB4ZjZlNgotfTsKLQotY29uc3QgdTggb2ZkbV9yYXRlX2xvb2t1cFtdID0gewotCi0JQlJDTV9SQVRFXzQ4TSwKLQlCUkNNX1JBVEVfMjRNLAotCUJSQ01fUkFURV8xMk0sCi0JQlJDTV9SQVRFXzZNLAotCUJSQ01fUkFURV81NE0sCi0JQlJDTV9SQVRFXzM2TSwKLQlCUkNNX1JBVEVfMThNLAotCUJSQ01fUkFURV85TQotfTsKLQotI2RlZmluZSBQSFlfV1JFR19MSU1JVAkyNAotCi1zdGF0aWMgdm9pZCB3bGNfc2V0X3BoeV91bmluaXR0ZWQoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotc3RhdGljIHUzMiB3bGNfcGh5X2dldF9yYWRpb192ZXIoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotc3RhdGljIHZvaWQgd2xjX3BoeV90aW1lcmNiX3BoeWNhbCh2b2lkICphcmcpOwotCi1zdGF0aWMgYm9vbCB3bGNfcGh5X25vaXNlX2NhbGNfcGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1MzIgKmNtcGx4X3B3ciwKLQkJCQkgICBzOCAqcHdyX2FudCk7Ci0KLXN0YXRpYyB2b2lkIHdsY19waHlfY2FsX3BlcmljYWxfbXBoYXNlX3NjaGVkdWxlKHN0cnVjdCBicmNtc19waHkgKnBpLAotCQkJCQkJdWludCBkZWxheSk7Ci0KLXN0YXRpYyB2b2lkIHdsY19waHlfbm9pc2VfY2Ioc3RydWN0IGJyY21zX3BoeSAqcGksIHU4IGNoYW5uZWwsIHM4IG5vaXNlX2RibSk7Ci1zdGF0aWMgdm9pZCB3bGNfcGh5X25vaXNlX3NhbXBsZV9yZXF1ZXN0KHN0cnVjdCBicmNtc19waHlfcHViICpwaWgsIHU4IHJlYXNvbiwKLQkJCQkJIHU4IGNoKTsKLQotc3RhdGljIHZvaWQgd2xjX3BoeV90eHBvd2VyX3JlZ19saW1pdF9jYWxjKHN0cnVjdCBicmNtc19waHkgKnBpLAotCQkJCQkgICBzdHJ1Y3QgdHhwd3JfbGltaXRzICp0cCwgY2hhbnNwZWNfdCk7Ci1zdGF0aWMgYm9vbCB3bGNfcGh5X2NhbF90eHBvd2VyX3JlY2FsY19zdyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci0KLXN0YXRpYyBzOCB3bGNfdXNlcl90eHB3cl9hbnRwb3J0X3RvX3JmcG9ydChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdWludCBjaGFuLAotCQkJCQkgICAgIHUzMiBiYW5kLCB1OCByYXRlKTsKLXN0YXRpYyB2b2lkIHdsY19waHlfdXBkX2Vudl90eHB3cl9yYXRlX2xpbWl0cyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTMyIGJhbmQpOwotc3RhdGljIHM4IHdsY19waHlfZW52X21lYXN1cmVfdmJhdChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1zdGF0aWMgczggd2xjX3BoeV9lbnZfbWVhc3VyZV90ZW1wZXJhdHVyZShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci0KLWNoYXIgKnBoeV9nZXR2YXIoc3RydWN0IGJyY21zX3BoeSAqcGksIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JY2hhciAqdmFycyA9IHBpLT52YXJzOwotCWNoYXIgKnM7Ci0JaW50IGxlbjsKLQotCWlmICghbmFtZSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlsZW4gPSBzdHJsZW4obmFtZSk7Ci0JaWYgKGxlbiA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQotCWZvciAocyA9IHZhcnM7IHMgJiYgKnM7KSB7Ci0JCWlmICgobWVtY21wKHMsIG5hbWUsIGxlbikgPT0gMCkgJiYgKHNbbGVuXSA9PSAnPScpKQotCQkJcmV0dXJuICZzW2xlbiArIDFdOwotCi0JCXdoaWxlICgqcysrKQotCQkJOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotCi1pbnQgcGh5X2dldGludHZhcihzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgY29uc3QgY2hhciAqbmFtZSkKLXsKLQljaGFyICp2YWw7Ci0KLQl2YWwgPSBQSFlfR0VUVkFSKHBpLCBuYW1lKTsKLQlpZiAodmFsID09IE5VTEwpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIHNpbXBsZV9zdHJ0b3VsKHZhbCwgTlVMTCwgMCk7Ci19Ci0KLXZvaWQgd2xjX3BoeXJlZ19lbnRlcihzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcGloKQotewotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcGloOwotCXdsYXBpX2JtYWNfdWNvZGVfd2FrZV9vdmVycmlkZV9waHlyZWdfc2V0KHBpLT5zaC0+cGh5c2hpbSk7Ci19Ci0KLXZvaWQgd2xjX3BoeXJlZ19leGl0KHN0cnVjdCBicmNtc19waHlfcHViICpwaWgpCi17Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwaWg7Ci0Jd2xhcGlfYm1hY191Y29kZV93YWtlX292ZXJyaWRlX3BoeXJlZ19jbGVhcihwaS0+c2gtPnBoeXNoaW0pOwotfQotCi12b2lkIHdsY19yYWRpb3JlZ19lbnRlcihzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcGloKQotewotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcGloOwotCXdsYXBpX2JtYWNfbWN0cmwocGktPnNoLT5waHlzaGltLCBNQ1RMX0xPQ0tfUkFESU8sIE1DVExfTE9DS19SQURJTyk7Ci0KLQl1ZGVsYXkoMTApOwotfQotCi12b2lkIHdsY19yYWRpb3JlZ19leGl0KHN0cnVjdCBicmNtc19waHlfcHViICpwaWgpCi17Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwaWg7Ci0Jdm9sYXRpbGUgdTE2IGR1bW15OwotCi0JZHVtbXkgPSBSX1JFRygmcGktPnJlZ3MtPnBoeXZlcnNpb24pOwotCXBpLT5waHlfd3JlZyA9IDA7Ci0Jd2xhcGlfYm1hY19tY3RybChwaS0+c2gtPnBoeXNoaW0sIE1DVExfTE9DS19SQURJTywgMCk7Ci19Ci0KLXUxNiByZWFkX3JhZGlvX3JlZyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTE2IGFkZHIpCi17Ci0JdTE2IGRhdGE7Ci0KLQlpZiAoKGFkZHIgPT0gUkFESU9fSURDT0RFKSkKLQkJcmV0dXJuIDB4ZmZmZjsKLQotCWlmIChOT1JBRElPX0VOQUIocGktPnB1YnBpKSkKLQkJcmV0dXJuIE5PUkFESU9fSURDT0RFICYgMHhmZmZmOwotCi0Jc3dpdGNoIChwaS0+cHVicGkucGh5X3R5cGUpIHsKLQljYXNlIFBIWV9UWVBFX046Ci0JCUNBU0VDSEVDSyhQSFlUWVBFLCBQSFlfVFlQRV9OKTsKLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKQotCQkJYWRkciB8PSBSQURJT18yMDU3X1JFQURfT0ZGOwotCQllbHNlCi0JCQlhZGRyIHw9IFJBRElPXzIwNTVfUkVBRF9PRkY7Ci0JCWJyZWFrOwotCi0JY2FzZSBQSFlfVFlQRV9MQ046Ci0JCUNBU0VDSEVDSyhQSFlUWVBFLCBQSFlfVFlQRV9MQ04pOwotCQlhZGRyIHw9IFJBRElPXzIwNjRfUkVBRF9PRkY7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKChEMTFSRVZfR0UocGktPnNoLT5jb3JlcmV2LCAyNCkpIHx8Ci0JICAgIChEMTFSRVZfSVMocGktPnNoLT5jb3JlcmV2LCAyMikKLQkgICAgICYmIChwaS0+cHVicGkucGh5X3R5cGUgIT0gUEhZX1RZUEVfU1NOKSkpIHsKLQkJV19SRUdfRkxVU0goJnBpLT5yZWdzLT5yYWRpb3JlZ2FkZHIsIGFkZHIpOwotCQlkYXRhID0gUl9SRUcoJnBpLT5yZWdzLT5yYWRpb3JlZ2RhdGEpOwotCX0gZWxzZSB7Ci0JCVdfUkVHX0ZMVVNIKCZwaS0+cmVncy0+cGh5NHdhZGRyLCBhZGRyKTsKLQotI2lmZGVmIF9fQVJNX0FSQ0hfNFRfXwotCQlfX2FzbV9fKCIgLmFsaWduIDQgIik7Ci0JCV9fYXNtX18oIiBub3AgIik7Ci0JCWRhdGEgPSBSX1JFRygmcGktPnJlZ3MtPnBoeTR3ZGF0YWxvKTsKLSNlbHNlCi0JCWRhdGEgPSBSX1JFRygmcGktPnJlZ3MtPnBoeTR3ZGF0YWxvKTsKLSNlbmRpZgotCi0JfQotCXBpLT5waHlfd3JlZyA9IDA7Ci0KLQlyZXR1cm4gZGF0YTsKLX0KLQotdm9pZCB3cml0ZV9yYWRpb19yZWcoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBhZGRyLCB1MTYgdmFsKQotewotCWlmIChOT1JBRElPX0VOQUIocGktPnB1YnBpKSkKLQkJcmV0dXJuOwotCi0JaWYgKChEMTFSRVZfR0UocGktPnNoLT5jb3JlcmV2LCAyNCkpIHx8Ci0JICAgIChEMTFSRVZfSVMocGktPnNoLT5jb3JlcmV2LCAyMikKLQkgICAgICYmIChwaS0+cHVicGkucGh5X3R5cGUgIT0gUEhZX1RZUEVfU1NOKSkpIHsKLQotCQlXX1JFR19GTFVTSCgmcGktPnJlZ3MtPnJhZGlvcmVnYWRkciwgYWRkcik7Ci0JCVdfUkVHKCZwaS0+cmVncy0+cmFkaW9yZWdkYXRhLCB2YWwpOwotCX0gZWxzZSB7Ci0JCVdfUkVHX0ZMVVNIKCZwaS0+cmVncy0+cGh5NHdhZGRyLCBhZGRyKTsKLQkJV19SRUcoJnBpLT5yZWdzLT5waHk0d2RhdGFsbywgdmFsKTsKLQl9Ci0KLQlpZiAocGktPnNoLT5idXN0eXBlID09IFBDSV9CVVMpIHsKLQkJaWYgKCsrcGktPnBoeV93cmVnID49IHBpLT5waHlfd3JlZ19saW1pdCkgewotCQkJKHZvaWQpUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKTsKLQkJCXBpLT5waHlfd3JlZyA9IDA7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB1MzIgcmVhZF9yYWRpb19pZChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQl1MzIgaWQ7Ci0KLQlpZiAoTk9SQURJT19FTkFCKHBpLT5wdWJwaSkpCi0JCXJldHVybiBOT1JBRElPX0lEQ09ERTsKLQotCWlmIChEMTFSRVZfR0UocGktPnNoLT5jb3JlcmV2LCAyNCkpIHsKLQkJdTMyIGIwLCBiMSwgYjI7Ci0KLQkJV19SRUdfRkxVU0goJnBpLT5yZWdzLT5yYWRpb3JlZ2FkZHIsIDApOwotCQliMCA9ICh1MzIpIFJfUkVHKCZwaS0+cmVncy0+cmFkaW9yZWdkYXRhKTsKLQkJV19SRUdfRkxVU0goJnBpLT5yZWdzLT5yYWRpb3JlZ2FkZHIsIDEpOwotCQliMSA9ICh1MzIpIFJfUkVHKCZwaS0+cmVncy0+cmFkaW9yZWdkYXRhKTsKLQkJV19SRUdfRkxVU0goJnBpLT5yZWdzLT5yYWRpb3JlZ2FkZHIsIDIpOwotCQliMiA9ICh1MzIpIFJfUkVHKCZwaS0+cmVncy0+cmFkaW9yZWdkYXRhKTsKLQotCQlpZCA9ICgoYjAgJiAweGYpIDw8IDI4KSB8ICgoKGIyIDw8IDgpIHwgYjEpIDw8IDEyKSB8ICgoYjAgPj4gNCkKLQkJCQkJCQkJICAgICAgJiAweGYpOwotCX0gZWxzZSB7Ci0JCVdfUkVHX0ZMVVNIKCZwaS0+cmVncy0+cGh5NHdhZGRyLCBSQURJT19JRENPREUpOwotCQlpZCA9ICh1MzIpIFJfUkVHKCZwaS0+cmVncy0+cGh5NHdkYXRhbG8pOwotCQlpZCB8PSAodTMyKSBSX1JFRygmcGktPnJlZ3MtPnBoeTR3ZGF0YWhpKSA8PCAxNjsKLQl9Ci0JcGktPnBoeV93cmVnID0gMDsKLQlyZXR1cm4gaWQ7Ci19Ci0KLXZvaWQgYW5kX3JhZGlvX3JlZyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTE2IGFkZHIsIHUxNiB2YWwpCi17Ci0JdTE2IHJ2YWw7Ci0KLQlpZiAoTk9SQURJT19FTkFCKHBpLT5wdWJwaSkpCi0JCXJldHVybjsKLQotCXJ2YWwgPSByZWFkX3JhZGlvX3JlZyhwaSwgYWRkcik7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBhZGRyLCAocnZhbCAmIHZhbCkpOwotfQotCi12b2lkIG9yX3JhZGlvX3JlZyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTE2IGFkZHIsIHUxNiB2YWwpCi17Ci0JdTE2IHJ2YWw7Ci0KLQlpZiAoTk9SQURJT19FTkFCKHBpLT5wdWJwaSkpCi0JCXJldHVybjsKLQotCXJ2YWwgPSByZWFkX3JhZGlvX3JlZyhwaSwgYWRkcik7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBhZGRyLCAocnZhbCB8IHZhbCkpOwotfQotCi12b2lkIHhvcl9yYWRpb19yZWcoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBhZGRyLCB1MTYgbWFzaykKLXsKLQl1MTYgcnZhbDsKLQotCWlmIChOT1JBRElPX0VOQUIocGktPnB1YnBpKSkKLQkJcmV0dXJuOwotCi0JcnZhbCA9IHJlYWRfcmFkaW9fcmVnKHBpLCBhZGRyKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIGFkZHIsIChydmFsIF4gbWFzaykpOwotfQotCi12b2lkIG1vZF9yYWRpb19yZWcoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBhZGRyLCB1MTYgbWFzaywgdTE2IHZhbCkKLXsKLQl1MTYgcnZhbDsKLQotCWlmIChOT1JBRElPX0VOQUIocGktPnB1YnBpKSkKLQkJcmV0dXJuOwotCi0JcnZhbCA9IHJlYWRfcmFkaW9fcmVnKHBpLCBhZGRyKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIGFkZHIsIChydmFsICYgfm1hc2spIHwgKHZhbCAmIG1hc2spKTsKLX0KLQotdm9pZCB3cml0ZV9waHlfY2hhbm5lbF9yZWcoc3RydWN0IGJyY21zX3BoeSAqcGksIHVpbnQgdmFsKQotewotCVdfUkVHKCZwaS0+cmVncy0+cGh5Y2hhbm5lbCwgdmFsKTsKLX0KLQotdTE2IHJlYWRfcGh5X3JlZyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTE2IGFkZHIpCi17Ci0JZDExcmVnc190ICpyZWdzOwotCi0JcmVncyA9IHBpLT5yZWdzOwotCi0JV19SRUdfRkxVU0goJnJlZ3MtPnBoeXJlZ2FkZHIsIGFkZHIpOwotCi0JcGktPnBoeV93cmVnID0gMDsKLQlyZXR1cm4gUl9SRUcoJnJlZ3MtPnBoeXJlZ2RhdGEpOwotfQotCi12b2lkIHdyaXRlX3BoeV9yZWcoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBhZGRyLCB1MTYgdmFsKQotewotCWQxMXJlZ3NfdCAqcmVnczsKLQotCXJlZ3MgPSBwaS0+cmVnczsKLQotI2lmZGVmIF9fbWlwc19fCi0JV19SRUdfRkxVU0goJnJlZ3MtPnBoeXJlZ2FkZHIsIGFkZHIpOwotCVdfUkVHKCZyZWdzLT5waHlyZWdkYXRhLCB2YWwpOwotCWlmIChhZGRyID09IDB4NzIpCi0JCSh2b2lkKVJfUkVHKCZyZWdzLT5waHlyZWdkYXRhKTsKLSNlbHNlCi0JV19SRUcoKHUzMiAqKSgmcmVncy0+cGh5cmVnYWRkciksCi0JICAgICAgYWRkciB8ICh2YWwgPDwgMTYpKTsKLQlpZiAocGktPnNoLT5idXN0eXBlID09IFBDSV9CVVMpIHsKLQkJaWYgKCsrcGktPnBoeV93cmVnID49IHBpLT5waHlfd3JlZ19saW1pdCkgewotCQkJcGktPnBoeV93cmVnID0gMDsKLQkJCSh2b2lkKVJfUkVHKCZyZWdzLT5waHl2ZXJzaW9uKTsKLQkJfQotCX0KLSNlbmRpZgotfQotCi12b2lkIGFuZF9waHlfcmVnKHN0cnVjdCBicmNtc19waHkgKnBpLCB1MTYgYWRkciwgdTE2IHZhbCkKLXsKLQlkMTFyZWdzX3QgKnJlZ3M7Ci0KLQlyZWdzID0gcGktPnJlZ3M7Ci0KLQlXX1JFR19GTFVTSCgmcmVncy0+cGh5cmVnYWRkciwgYWRkcik7Ci0KLQlXX1JFRygmcmVncy0+cGh5cmVnZGF0YSwgKFJfUkVHKCZyZWdzLT5waHlyZWdkYXRhKSAmIHZhbCkpOwotCXBpLT5waHlfd3JlZyA9IDA7Ci19Ci0KLXZvaWQgb3JfcGh5X3JlZyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTE2IGFkZHIsIHUxNiB2YWwpCi17Ci0JZDExcmVnc190ICpyZWdzOwotCi0JcmVncyA9IHBpLT5yZWdzOwotCi0JV19SRUdfRkxVU0goJnJlZ3MtPnBoeXJlZ2FkZHIsIGFkZHIpOwotCi0JV19SRUcoJnJlZ3MtPnBoeXJlZ2RhdGEsIChSX1JFRygmcmVncy0+cGh5cmVnZGF0YSkgfCB2YWwpKTsKLQlwaS0+cGh5X3dyZWcgPSAwOwotfQotCi12b2lkIG1vZF9waHlfcmVnKHN0cnVjdCBicmNtc19waHkgKnBpLCB1MTYgYWRkciwgdTE2IG1hc2ssIHUxNiB2YWwpCi17Ci0JZDExcmVnc190ICpyZWdzOwotCi0JcmVncyA9IHBpLT5yZWdzOwotCi0JV19SRUdfRkxVU0goJnJlZ3MtPnBoeXJlZ2FkZHIsIGFkZHIpOwotCi0JV19SRUcoJnJlZ3MtPnBoeXJlZ2RhdGEsCi0JICAgICAgKChSX1JFRygmcmVncy0+cGh5cmVnZGF0YSkgJiB+bWFzaykgfCAodmFsICYgbWFzaykpKTsKLQlwaS0+cGh5X3dyZWcgPSAwOwotfQotCi1zdGF0aWMgdm9pZCB3bGNfc2V0X3BoeV91bmluaXR0ZWQoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JaW50IGksIGo7Ci0KLQlwaS0+aW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCXBpLT50eF92b3MgPSAweGZmZmY7Ci0JcGktPm5yc3NpX3RhYmxlX2RlbHRhID0gMHg3ZmZmZmZmZjsKLQlwaS0+cmNfY2FsID0gMHhmZmZmOwotCXBpLT5taW50eGJpYXMgPSAweGZmZmY7Ci0JcGktPnR4cHdyaWR4ID0gLTE7Ci0JaWYgKElTTlBIWShwaSkpIHsKLQkJcGktPnBoeV9zcHVyYXZvaWQgPSBTUFVSQVZPSURfRElTQUJMRTsKLQotCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykKLQkJICAgICYmIE5SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDcpKQotCQkJcGktPnBoeV9zcHVyYXZvaWQgPSBTUFVSQVZPSURfQVVUTzsKLQotCQlwaS0+bnBoeV9wYXBkX3NraXAgPSAwOwotCQlwaS0+bnBoeV9wYXBkX2Vwc2lsb25fb2Zmc2V0WzBdID0gMHhmNTg4OwotCQlwaS0+bnBoeV9wYXBkX2Vwc2lsb25fb2Zmc2V0WzFdID0gMHhmNTg4OwotCQlwaS0+bnBoeV90eHB3cl9pZHhbMF0gPSAxMjg7Ci0JCXBpLT5ucGh5X3R4cHdyX2lkeFsxXSA9IDEyODsKLQkJcGktPm5waHlfdHhwd3JpbmRleFswXS5pbmRleF9pbnRlcm5hbCA9IDQwOwotCQlwaS0+bnBoeV90eHB3cmluZGV4WzFdLmluZGV4X2ludGVybmFsID0gNDA7Ci0JCXBpLT5waHlfcGFiaWFzID0gMDsKLQl9IGVsc2UgewotCQlwaS0+cGh5X3NwdXJhdm9pZCA9IFNQVVJBVk9JRF9BVVRPOwotCX0KLQlwaS0+cmFkaW9wd3IgPSAweGZmZmY7Ci0JZm9yIChpID0gMDsgaSA8IFNUQVRJQ19OVU1fUkY7IGkrKykgewotCQlmb3IgKGogPSAwOyBqIDwgU1RBVElDX05VTV9CQjsgaisrKSB7Ci0JCQlwaS0+c3RhdHNfMTFiX3R4cG93ZXJbaV1bal0gPSAtMTsKLQkJfQotCX0KLX0KLQotc3RydWN0IHNoYXJlZF9waHkgKndsY19waHlfc2hhcmVkX2F0dGFjaChzdHJ1Y3Qgc2hhcmVkX3BoeV9wYXJhbXMgKnNocCkKLXsKLQlzdHJ1Y3Qgc2hhcmVkX3BoeSAqc2g7Ci0KLQlzaCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzaGFyZWRfcGh5KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHNoID09IE5VTEwpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0Jc2gtPnNpaCA9IHNocC0+c2loOwotCXNoLT5waHlzaGltID0gc2hwLT5waHlzaGltOwotCXNoLT51bml0ID0gc2hwLT51bml0OwotCXNoLT5jb3JlcmV2ID0gc2hwLT5jb3JlcmV2OwotCi0Jc2gtPnZpZCA9IHNocC0+dmlkOwotCXNoLT5kaWQgPSBzaHAtPmRpZDsKLQlzaC0+Y2hpcCA9IHNocC0+Y2hpcDsKLQlzaC0+Y2hpcHJldiA9IHNocC0+Y2hpcHJldjsKLQlzaC0+Y2hpcHBrZyA9IHNocC0+Y2hpcHBrZzsKLQlzaC0+c3JvbXJldiA9IHNocC0+c3JvbXJldjsKLQlzaC0+Ym9hcmR0eXBlID0gc2hwLT5ib2FyZHR5cGU7Ci0Jc2gtPmJvYXJkcmV2ID0gc2hwLT5ib2FyZHJldjsKLQlzaC0+Ym9hcmR2ZW5kb3IgPSBzaHAtPmJvYXJkdmVuZG9yOwotCXNoLT5ib2FyZGZsYWdzID0gc2hwLT5ib2FyZGZsYWdzOwotCXNoLT5ib2FyZGZsYWdzMiA9IHNocC0+Ym9hcmRmbGFnczI7Ci0Jc2gtPmJ1c3R5cGUgPSBzaHAtPmJ1c3R5cGU7Ci0Jc2gtPmJ1c2NvcmVyZXYgPSBzaHAtPmJ1c2NvcmVyZXY7Ci0KLQlzaC0+ZmFzdF90aW1lciA9IFBIWV9TV19USU1FUl9GQVNUOwotCXNoLT5zbG93X3RpbWVyID0gUEhZX1NXX1RJTUVSX1NMT1c7Ci0Jc2gtPmdsYWNpYWxfdGltZXIgPSBQSFlfU1dfVElNRVJfR0xBQ0lBTDsKLQotCXNoLT5yc3NpX21vZGUgPSBSU1NJX0FOVF9NRVJHRV9NQVg7Ci0KLQlyZXR1cm4gc2g7Ci19Ci0KLXN0cnVjdCBicmNtc19waHlfcHViICoKLXdsY19waHlfYXR0YWNoKHN0cnVjdCBzaGFyZWRfcGh5ICpzaCwgdm9pZCAqcmVncywgaW50IGJhbmR0eXBlLAotCSAgICAgICBjaGFyICp2YXJzLCBzdHJ1Y3Qgd2lwaHkgKndpcGh5KQotewotCXN0cnVjdCBicmNtc19waHkgKnBpOwotCXUzMiBzZmxhZ3MgPSAwOwotCXVpbnQgcGh5dmVyc2lvbjsKLQl1MzIgaWRjb2RlOwotCWludCBpOwotCi0JaWYgKEQxMVJFVl9JUyhzaC0+Y29yZXJldiwgNCkpCi0JCXNmbGFncyA9IFNJU0ZfMkdfUEhZIHwgU0lTRl81R19QSFk7Ci0JZWxzZQotCQlzZmxhZ3MgPSBhaV9jb3JlX3NmbGFncyhzaC0+c2loLCAwLCAwKTsKLQotCWlmIChCQU5EXzVHKGJhbmR0eXBlKSkgewotCQlpZiAoKHNmbGFncyAmIChTSVNGXzVHX1BIWSB8IFNJU0ZfREJfUEhZKSkgPT0gMCkgewotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0KLQlwaSA9IHNoLT5waHlfaGVhZDsKLQlpZiAoKHNmbGFncyAmIFNJU0ZfREJfUEhZKSAmJiBwaSkgewotCi0JCXdsYXBpX2JtYWNfY29yZXJlc2V0KHBpLT5zaC0+cGh5c2hpbSwgcGktPnB1YnBpLmNvcmVmbGFncyk7Ci0JCXBpLT5yZWZjbnQrKzsKLQkJcmV0dXJuICZwaS0+cHVicGlfcm87Ci0JfQotCi0JcGkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnJjbXNfcGh5KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHBpID09IE5VTEwpIHsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXBpLT53aXBoeSA9IHdpcGh5OwotCXBpLT5yZWdzID0gKGQxMXJlZ3NfdCAqKSByZWdzOwotCXBpLT5zaCA9IHNoOwotCXBpLT5waHlfaW5pdF9wb3IgPSB0cnVlOwotCXBpLT5waHlfd3JlZ19saW1pdCA9IFBIWV9XUkVHX0xJTUlUOwotCi0JcGktPnZhcnMgPSB2YXJzOwotCi0JcGktPnR4cHdyX3BlcmNlbnQgPSAxMDA7Ci0KLQlwaS0+ZG9faW5pdGNhbCA9IHRydWU7Ci0KLQlwaS0+cGh5Y2FsX3RlbXBkZWx0YSA9IDA7Ci0KLQlpZiAoQkFORF8yRyhiYW5kdHlwZSkgJiYgKHNmbGFncyAmIFNJU0ZfMkdfUEhZKSkgewotCi0JCXBpLT5wdWJwaS5jb3JlZmxhZ3MgPSBTSUNGX0dNT0RFOwotCX0KLQotCXdsYXBpX2JtYWNfY29yZXJlc2V0KHBpLT5zaC0+cGh5c2hpbSwgcGktPnB1YnBpLmNvcmVmbGFncyk7Ci0JcGh5dmVyc2lvbiA9IFJfUkVHKCZwaS0+cmVncy0+cGh5dmVyc2lvbik7Ci0KLQlwaS0+cHVicGkucGh5X3R5cGUgPSBQSFlfVFlQRShwaHl2ZXJzaW9uKTsKLQlwaS0+cHVicGkucGh5X3JldiA9IHBoeXZlcnNpb24gJiBQVl9QVl9NQVNLOwotCi0JaWYgKHBpLT5wdWJwaS5waHlfdHlwZSA9PSBQSFlfVFlQRV9MQ05YTikgewotCQlwaS0+cHVicGkucGh5X3R5cGUgPSBQSFlfVFlQRV9OOwotCQlwaS0+cHVicGkucGh5X3JldiArPSBMQ05YTl9CQVNFUkVWOwotCX0KLQlwaS0+cHVicGkucGh5X2NvcmVudW0gPSBQSFlfQ09SRV9OVU1fMjsKLQlwaS0+cHVicGkuYW5hX3JldiA9IChwaHl2ZXJzaW9uICYgUFZfQVZfTUFTSykgPj4gUFZfQVZfU0hJRlQ7Ci0KLQlpZiAoIVZBTElEX1BIWVRZUEUocGktPnB1YnBpLnBoeV90eXBlKSkgewotCQlnb3RvIGVycjsKLQl9Ci0JaWYgKEJBTkRfNUcoYmFuZHR5cGUpKSB7Ci0JCWlmICghSVNOUEhZKHBpKSkgewotCQkJZ290byBlcnI7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoIUlTTlBIWShwaSkgJiYgIUlTTENOUEhZKHBpKSkgewotCQkJZ290byBlcnI7Ci0JCX0KLQl9Ci0KLQl3bGNfcGh5X2FuYWNvcmUoKHN0cnVjdCBicmNtc19waHlfcHViICopIHBpLCBPTik7Ci0KLQlpZGNvZGUgPSB3bGNfcGh5X2dldF9yYWRpb192ZXIocGkpOwotCXBpLT5wdWJwaS5yYWRpb2lkID0KLQkgICAgKGlkY29kZSAmIElEQ09ERV9JRF9NQVNLKSA+PiBJRENPREVfSURfU0hJRlQ7Ci0JcGktPnB1YnBpLnJhZGlvcmV2ID0KLQkgICAgKGlkY29kZSAmIElEQ09ERV9SRVZfTUFTSykgPj4gSURDT0RFX1JFVl9TSElGVDsKLQlwaS0+cHVicGkucmFkaW92ZXIgPQotCSAgICAoaWRjb2RlICYgSURDT0RFX1ZFUl9NQVNLKSA+PiBJRENPREVfVkVSX1NISUZUOwotCWlmICghVkFMSURfUkFESU8ocGksIHBpLT5wdWJwaS5yYWRpb2lkKSkKLQkJZ290byBlcnI7Ci0KLQl3bGNfcGh5X3N3aXRjaF9yYWRpbygoc3RydWN0IGJyY21zX3BoeV9wdWIgKikgcGksIE9GRik7Ci0KLQl3bGNfc2V0X3BoeV91bmluaXR0ZWQocGkpOwotCi0JcGktPmJ3ID0gV0xfQ0hBTlNQRUNfQldfMjA7Ci0JcGktPnJhZGlvX2NoYW5zcGVjID0KLQkgICAgQkFORF8yRyhiYW5kdHlwZSkgPyBDSDIwTUhaX0NIU1BFQygxKSA6IENIMjBNSFpfQ0hTUEVDKDM2KTsKLQotCXBpLT5yeGlxX3NhbXBzID0gUEhZX05PSVNFX1NBTVBMRV9MT0dfTlVNX05QSFk7Ci0JcGktPnJ4aXFfYW50c2VsID0gQU5UX1JYX0RJVl9ERUY7Ci0KLQlwaS0+d2F0Y2hkb2dfb3ZlcnJpZGUgPSB0cnVlOwotCi0JcGktPmNhbF90eXBlX292ZXJyaWRlID0gUEhZX1BFUklDQUxfQVVUTzsKLQotCXBpLT5ucGh5X3NhdmVkX25vaXNldmFycy5idWZjb3VudCA9IDA7Ci0KLQlpZiAoSVNOUEhZKHBpKSkKLQkJcGktPm1pbl90eHBvd2VyID0gUEhZX1RYUFdSX01JTl9OUEhZOwotCWVsc2UKLQkJcGktPm1pbl90eHBvd2VyID0gUEhZX1RYUFdSX01JTjsKLQotCXBpLT5zaC0+cGh5cnhjaGFpbiA9IDB4MzsKLQotCXBpLT5yeDJ0eF9iaWFzZW50cnkgPSAtMTsKLQotCXBpLT5waHlfdHhjb3JlX2Rpc2FibGVfdGVtcCA9IFBIWV9DSEFJTl9UWF9ESVNBQkxFX1RFTVA7Ci0JcGktPnBoeV90eGNvcmVfZW5hYmxlX3RlbXAgPQotCSAgICBQSFlfQ0hBSU5fVFhfRElTQUJMRV9URU1QIC0gUEhZX0hZU1RFUkVTSVNfREVMVEFURU1QOwotCXBpLT5waHlfdGVtcHNlbnNlX29mZnNldCA9IDA7Ci0JcGktPnBoeV90eGNvcmVfaGVhdGVkdXAgPSBmYWxzZTsKLQotCXBpLT5ucGh5X2xhc3RjYWxfdGVtcCA9IC01MDsKLQotCXBpLT5waHlub2lzZV9wb2xsaW5nID0gdHJ1ZTsKLQlpZiAoSVNOUEhZKHBpKSB8fCBJU0xDTlBIWShwaSkpCi0JCXBpLT5waHlub2lzZV9wb2xsaW5nID0gZmFsc2U7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgVFhQX05VTV9SQVRFUzsgaSsrKSB7Ci0JCXBpLT50eHB3cl9saW1pdFtpXSA9IEJSQ01TX1RYUFdSX01BWDsKLQkJcGktPnR4cHdyX2Vudl9saW1pdFtpXSA9IEJSQ01TX1RYUFdSX01BWDsKLQkJcGktPnR4X3VzZXJfdGFyZ2V0W2ldID0gQlJDTVNfVFhQV1JfTUFYOwotCX0KLQotCXBpLT5yYWRpb3B3cl9vdmVycmlkZSA9IFJBRElPUFdSX09WRVJSSURFX0RFRjsKLQotCXBpLT51c2VyX3R4cHdyX2F0X3JmcG9ydCA9IGZhbHNlOwotCi0JaWYgKElTTlBIWShwaSkpIHsKLQotCQlwaS0+cGh5Y2FsX3RpbWVyID0gd2xhcGlfaW5pdF90aW1lcihwaS0+c2gtPnBoeXNoaW0sCi0JCQkJCQkJICB3bGNfcGh5X3RpbWVyY2JfcGh5Y2FsLAotCQkJCQkJCSAgcGksICJwaHljYWwiKTsKLQkJaWYgKCFwaS0+cGh5Y2FsX3RpbWVyKSB7Ci0JCQlnb3RvIGVycjsKLQkJfQotCi0JCWlmICghd2xjX3BoeV9hdHRhY2hfbnBoeShwaSkpCi0JCQlnb3RvIGVycjsKLQotCX0gZWxzZSBpZiAoSVNMQ05QSFkocGkpKSB7Ci0JCWlmICghd2xjX3BoeV9hdHRhY2hfbGNucGh5KHBpKSkKLQkJCWdvdG8gZXJyOwotCi0JfSBlbHNlIHsKLQotCX0KLQotCXBpLT5yZWZjbnQrKzsKLQlwaS0+bmV4dCA9IHBpLT5zaC0+cGh5X2hlYWQ7Ci0Jc2gtPnBoeV9oZWFkID0gcGk7Ci0KLQlwaS0+dmFycyA9IChjaGFyICopJnBpLT52YXJzOwotCi0JbWVtY3B5KCZwaS0+cHVicGlfcm8sICZwaS0+cHVicGksIHNpemVvZihzdHJ1Y3QgYnJjbXNfcGh5X3B1YikpOwotCi0JcmV0dXJuICZwaS0+cHVicGlfcm87Ci0KLSBlcnI6Ci0Ja2ZyZWUocGkpOwotCXJldHVybiBOVUxMOwotfQotCi12b2lkIHdsY19waHlfZGV0YWNoKHN0cnVjdCBicmNtc19waHlfcHViICpwaWgpCi17Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwaWg7Ci0KLQlpZiAocGloKSB7Ci0JCWlmICgtLXBpLT5yZWZjbnQpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChwaS0+cGh5Y2FsX3RpbWVyKSB7Ci0JCQl3bGFwaV9mcmVlX3RpbWVyKHBpLT5zaC0+cGh5c2hpbSwgcGktPnBoeWNhbF90aW1lcik7Ci0JCQlwaS0+cGh5Y2FsX3RpbWVyID0gTlVMTDsKLQkJfQotCi0JCWlmIChwaS0+c2gtPnBoeV9oZWFkID09IHBpKQotCQkJcGktPnNoLT5waHlfaGVhZCA9IHBpLT5uZXh0OwotCQllbHNlIGlmIChwaS0+c2gtPnBoeV9oZWFkLT5uZXh0ID09IHBpKQotCQkJcGktPnNoLT5waHlfaGVhZC0+bmV4dCA9IE5VTEw7Ci0KLQkJaWYgKHBpLT5waV9mcHRyLmRldGFjaCkKLQkJCShwaS0+cGlfZnB0ci5kZXRhY2gpIChwaSk7Ci0KLQkJa2ZyZWUocGkpOwotCX0KLX0KLQotYm9vbAotd2xjX3BoeV9nZXRfcGh5dmVyc2lvbihzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcGloLCB1MTYgKnBoeXR5cGUsIHUxNiAqcGh5cmV2LAotCQkgICAgICAgdTE2ICpyYWRpb2lkLCB1MTYgKnJhZGlvdmVyKQotewotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcGloOwotCSpwaHl0eXBlID0gKHUxNikgcGktPnB1YnBpLnBoeV90eXBlOwotCSpwaHlyZXYgPSAodTE2KSBwaS0+cHVicGkucGh5X3JldjsKLQkqcmFkaW9pZCA9IHBpLT5wdWJwaS5yYWRpb2lkOwotCSpyYWRpb3ZlciA9IHBpLT5wdWJwaS5yYWRpb3JldjsKLQotCXJldHVybiB0cnVlOwotfQotCi1ib29sIHdsY19waHlfZ2V0X2VuY29yZShzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcGloKQotewotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcGloOwotCXJldHVybiBwaS0+cHVicGkuYWJncGh5X2VuY29yZTsKLX0KLQotdTMyIHdsY19waHlfZ2V0X2NvcmVmbGFncyhzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcGloKQotewotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcGloOwotCXJldHVybiBwaS0+cHVicGkuY29yZWZsYWdzOwotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3RpbWVyY2JfcGh5Y2FsKHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIGFyZzsKLQl1aW50IGRlbGF5ID0gNTsKLQotCWlmIChQSFlfUEVSSUNBTF9NUEhBU0VfUEVORElORyhwaSkpIHsKLQkJaWYgKCFwaS0+c2gtPnVwKSB7Ci0JCQl3bGNfcGh5X2NhbF9wZXJpY2FsX21waGFzZV9yZXNldChwaSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoU0NBTl9STV9JTl9QUk9HUkVTUyhwaSkgfHwgUExUX0lOUFJPR19QSFkocGkpKSB7Ci0KLQkJCWRlbGF5ID0gMTAwMDsKLQkJCXdsY19waHlfY2FsX3BlcmljYWxfbXBoYXNlX3Jlc3RhcnQocGkpOwotCQl9IGVsc2UKLQkJCXdsY19waHlfY2FsX3BlcmljYWxfbnBoeV9ydW4ocGksIFBIWV9QRVJJQ0FMX0FVVE8pOwotCQl3bGFwaV9hZGRfdGltZXIocGktPnNoLT5waHlzaGltLCBwaS0+cGh5Y2FsX3RpbWVyLCBkZWxheSwgMCk7Ci0JCXJldHVybjsKLQl9Ci0KLX0KLQotdm9pZCB3bGNfcGh5X2FuYWNvcmUoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCwgYm9vbCBvbikKLXsKLQlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBpaDsKLQotCWlmIChJU05QSFkocGkpKSB7Ci0JCWlmIChvbikgewotCQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0JCQkJd3JpdGVfcGh5X3JlZyhwaSwgMHhhNiwgMHgwZCk7Ci0JCQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg4ZiwgMHgwKTsKLQkJCQl3cml0ZV9waHlfcmVnKHBpLCAweGE3LCAweDBkKTsKLQkJCQl3cml0ZV9waHlfcmVnKHBpLCAweGE1LCAweDApOwotCQkJfSBlbHNlIHsKLQkJCQl3cml0ZV9waHlfcmVnKHBpLCAweGE1LCAweDApOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0JCQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg4ZiwgMHgwN2ZmKTsKLQkJCQl3cml0ZV9waHlfcmVnKHBpLCAweGE2LCAweDBmZCk7Ci0JCQkJd3JpdGVfcGh5X3JlZyhwaSwgMHhhNSwgMHgwN2ZmKTsKLQkJCQl3cml0ZV9waHlfcmVnKHBpLCAweGE3LCAweDBmZCk7Ci0JCQl9IGVsc2UgewotCQkJCXdyaXRlX3BoeV9yZWcocGksIDB4YTUsIDB4N2ZmZik7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKElTTENOUEhZKHBpKSkgewotCQlpZiAob24pIHsKLQkJCWFuZF9waHlfcmVnKHBpLCAweDQzYiwKLQkJCQkgICAgfigoMHgxIDw8IDApIHwgKDB4MSA8PCAxKSB8ICgweDEgPDwgMikpKTsKLQkJfSBlbHNlIHsKLQkJCW9yX3BoeV9yZWcocGksIDB4NDNjLAotCQkJCSAgICgweDEgPDwgMCkgfCAoMHgxIDw8IDEpIHwgKDB4MSA8PCAyKSk7Ci0JCQlvcl9waHlfcmVnKHBpLCAweDQzYiwKLQkJCQkgICAoMHgxIDw8IDApIHwgKDB4MSA8PCAxKSB8ICgweDEgPDwgMikpOwotCQl9Ci0JfQotfQotCi11MzIgd2xjX3BoeV9jbGtfYndiaXRzKHN0cnVjdCBicmNtc19waHlfcHViICpwaWgpCi17Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwaWg7Ci0KLQl1MzIgcGh5X2J3X2Nsa2JpdHMgPSAwOwotCi0JaWYgKHBpICYmIChJU05QSFkocGkpIHx8IElTTENOUEhZKHBpKSkpIHsKLQkJc3dpdGNoIChwaS0+YncpIHsKLQkJY2FzZSBXTF9DSEFOU1BFQ19CV18xMDoKLQkJCXBoeV9id19jbGtiaXRzID0gU0lDRl9CVzEwOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xfQ0hBTlNQRUNfQldfMjA6Ci0JCQlwaHlfYndfY2xrYml0cyA9IFNJQ0ZfQlcyMDsKLQkJCWJyZWFrOwotCQljYXNlIFdMX0NIQU5TUEVDX0JXXzQwOgotCQkJcGh5X2J3X2Nsa2JpdHMgPSBTSUNGX0JXNDA7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIHBoeV9id19jbGtiaXRzOwotfQotCi12b2lkIHdsY19waHlfcG9yX2luZm9ybShzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcHBpKQotewotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcHBpOwotCi0JcGktPnBoeV9pbml0X3BvciA9IHRydWU7Ci19Ci0KLXZvaWQgd2xjX3BoeV9lZGNyc19sb2NrKHN0cnVjdCBicmNtc19waHlfcHViICpwaWgsIGJvb2wgbG9jaykKLXsKLQlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBpaDsKLQotCXBpLT5lZGNyc190aHJlc2hvbGRfbG9jayA9IGxvY2s7Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCAweDIyYywgMHg0NmIpOwotCXdyaXRlX3BoeV9yZWcocGksIDB4MjJkLCAweDQ2Yik7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHgyMmUsIDB4M2MwKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDIyZiwgMHgzYzApOwotfQotCi12b2lkIHdsY19waHlfaW5pdGNhbF9lbmFibGUoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCwgYm9vbCBpbml0Y2FsKQotewotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcGloOwotCi0JcGktPmRvX2luaXRjYWwgPSBpbml0Y2FsOwotfQotCi12b2lkIHdsY19waHlfaHdfY2xrX3N0YXRlX3VwZChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcGloLCBib29sIG5ld3N0YXRlKQotewotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcGloOwotCi0JaWYgKCFwaSB8fCAhcGktPnNoKQotCQlyZXR1cm47Ci0KLQlwaS0+c2gtPmNsayA9IG5ld3N0YXRlOwotfQotCi12b2lkIHdsY19waHlfaHdfc3RhdGVfdXBkKHN0cnVjdCBicmNtc19waHlfcHViICpwaWgsIGJvb2wgbmV3c3RhdGUpCi17Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwaWg7Ci0KLQlpZiAoIXBpIHx8ICFwaS0+c2gpCi0JCXJldHVybjsKLQotCXBpLT5zaC0+dXAgPSBuZXdzdGF0ZTsKLX0KLQotdm9pZCB3bGNfcGh5X2luaXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCwgY2hhbnNwZWNfdCBjaGFuc3BlYykKLXsKLQl1MzIgbWM7Ci0JaW5pdGZuX3QgcGh5X2luaXQgPSBOVUxMOwotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcGloOwotCi0JaWYgKHBpLT5pbml0X2luX3Byb2dyZXNzKQotCQlyZXR1cm47Ci0KLQlwaS0+aW5pdF9pbl9wcm9ncmVzcyA9IHRydWU7Ci0KLQlwaS0+cmFkaW9fY2hhbnNwZWMgPSBjaGFuc3BlYzsKLQotCW1jID0gUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKTsKLQlpZiAoV0FSTihtYyAmIE1DVExfRU5fTUFDLCAiSFcgZXJyb3IgTUFDIHJ1bm5pbmcgb24gaW5pdCIpKQotCQlyZXR1cm47Ci0KLQlpZiAoIShwaS0+bWVhc3VyZV9ob2xkICYgUEhZX0hPTERfRk9SX1NDQU4pKSB7Ci0JCXBpLT5tZWFzdXJlX2hvbGQgfD0gUEhZX0hPTERfRk9SX05PVF9BU1NPQzsKLQl9Ci0KLQlpZiAoV0FSTighKGFpX2NvcmVfc2ZsYWdzKHBpLT5zaC0+c2loLCAwLCAwKSAmIFNJU0ZfRkNMS0EpLAotCQkgIkhXIGVycm9yIFNJU0ZfRkNMS0FcbiIpKQotCQlyZXR1cm47Ci0KLQlwaHlfaW5pdCA9IHBpLT5waV9mcHRyLmluaXQ7Ci0KLQlpZiAocGh5X2luaXQgPT0gTlVMTCkgewotCQlyZXR1cm47Ci0JfQotCi0Jd2xjX3BoeV9hbmFjb3JlKHBpaCwgT04pOwotCi0JaWYgKENIU1BFQ19CVyhwaS0+cmFkaW9fY2hhbnNwZWMpICE9IHBpLT5idykKLQkJd2xhcGlfYm1hY19id19zZXQocGktPnNoLT5waHlzaGltLAotCQkJCSAgQ0hTUEVDX0JXKHBpLT5yYWRpb19jaGFuc3BlYykpOwotCi0JcGktPm5waHlfZ2Fpbl9ib29zdCA9IHRydWU7Ci0KLQl3bGNfcGh5X3N3aXRjaF9yYWRpbygoc3RydWN0IGJyY21zX3BoeV9wdWIgKikgcGksIE9OKTsKLQotCSgqcGh5X2luaXQpIChwaSk7Ci0KLQlwaS0+cGh5X2luaXRfcG9yID0gZmFsc2U7Ci0KLQlpZiAoRDExUkVWX0lTKHBpLT5zaC0+Y29yZXJldiwgMTEpIHx8IEQxMVJFVl9JUyhwaS0+c2gtPmNvcmVyZXYsIDEyKSkKLQkJd2xjX3BoeV9kb19kdW1teV90eChwaSwgdHJ1ZSwgT0ZGKTsKLQotCWlmICghKElTTlBIWShwaSkpKQotCQl3bGNfcGh5X3R4cG93ZXJfdXBkYXRlX3NobShwaSk7Ci0KLQl3bGNfcGh5X2FudF9yeGRpdl9zZXQoKHN0cnVjdCBicmNtc19waHlfcHViICopIHBpLCBwaS0+c2gtPnJ4X2FudGRpdik7Ci0KLQlwaS0+aW5pdF9pbl9wcm9ncmVzcyA9IGZhbHNlOwotfQotCi12b2lkIHdsY19waHlfY2FsX2luaXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCkKLXsKLQlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBpaDsKLQlpbml0Zm5fdCBjYWxfaW5pdCA9IE5VTEw7Ci0KLQlpZiAoV0FSTigoUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKSAmIE1DVExfRU5fTUFDKSAhPSAwLAotCQkgIkhXIGVycm9yOiBNQUMgZW5hYmxlZCBkdXJpbmcgcGh5IGNhbFxuIikpCi0JCXJldHVybjsKLQotCWlmICghcGktPmluaXRpYWxpemVkKSB7Ci0JCWNhbF9pbml0ID0gcGktPnBpX2ZwdHIuY2FsaW5pdDsKLQkJaWYgKGNhbF9pbml0KQotCQkJKCpjYWxfaW5pdCkgKHBpKTsKLQotCQlwaS0+aW5pdGlhbGl6ZWQgPSB0cnVlOwotCX0KLX0KLQotaW50IHdsY19waHlfZG93bihzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcGloKQotewotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcGloOwotCWludCBjYWxsYmFja3MgPSAwOwotCi0JaWYgKHBpLT5waHljYWxfdGltZXIKLQkgICAgJiYgIXdsYXBpX2RlbF90aW1lcihwaS0+c2gtPnBoeXNoaW0sIHBpLT5waHljYWxfdGltZXIpKQotCQljYWxsYmFja3MrKzsKLQotCXBpLT5ucGh5X2lxY2FsX2NoYW5zcGVjXzJHID0gMDsKLQlwaS0+bnBoeV9pcWNhbF9jaGFuc3BlY181RyA9IDA7Ci0KLQlyZXR1cm4gY2FsbGJhY2tzOwotfQotCi1zdGF0aWMgdTMyIHdsY19waHlfZ2V0X3JhZGlvX3ZlcihzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQl1MzIgdmVyOwotCi0JdmVyID0gcmVhZF9yYWRpb19pZChwaSk7Ci0KLQlyZXR1cm4gdmVyOwotfQotCi12b2lkCi13bGNfcGh5X3RhYmxlX2FkZHIoc3RydWN0IGJyY21zX3BoeSAqcGksIHVpbnQgdGJsX2lkLCB1aW50IHRibF9vZmZzZXQsCi0JCSAgIHUxNiB0YmxBZGRyLCB1MTYgdGJsRGF0YUhpLCB1MTYgdGJsRGF0YUxvKQotewotCXdyaXRlX3BoeV9yZWcocGksIHRibEFkZHIsICh0YmxfaWQgPDwgMTApIHwgdGJsX29mZnNldCk7Ci0KLQlwaS0+dGJsX2RhdGFfaGkgPSB0YmxEYXRhSGk7Ci0JcGktPnRibF9kYXRhX2xvID0gdGJsRGF0YUxvOwotCi0JaWYgKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzIyNF9DSElQX0lEICYmCi0JICAgIHBpLT5zaC0+Y2hpcHJldiA9PSAxKSB7Ci0JCXBpLT50YmxfYWRkciA9IHRibEFkZHI7Ci0JCXBpLT50Ymxfc2F2ZV9pZCA9IHRibF9pZDsKLQkJcGktPnRibF9zYXZlX29mZnNldCA9IHRibF9vZmZzZXQ7Ci0JfQotfQotCi12b2lkIHdsY19waHlfdGFibGVfZGF0YV93cml0ZShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdWludCB3aWR0aCwgdTMyIHZhbCkKLXsKLQlpZiAoKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzIyNF9DSElQX0lEKSAmJgotCSAgICAocGktPnNoLT5jaGlwcmV2ID09IDEpICYmCi0JICAgIChwaS0+dGJsX3NhdmVfaWQgPT0gTlBIWV9UQkxfSURfQU5UU1dDVFJMTFVUKSkgewotCQlyZWFkX3BoeV9yZWcocGksIHBpLT50YmxfZGF0YV9sbyk7Ci0KLQkJd3JpdGVfcGh5X3JlZyhwaSwgcGktPnRibF9hZGRyLAotCQkJICAgICAgKHBpLT50Ymxfc2F2ZV9pZCA8PCAxMCkgfCBwaS0+dGJsX3NhdmVfb2Zmc2V0KTsKLQkJcGktPnRibF9zYXZlX29mZnNldCsrOwotCX0KLQotCWlmICh3aWR0aCA9PSAzMikgewotCi0JCXdyaXRlX3BoeV9yZWcocGksIHBpLT50YmxfZGF0YV9oaSwgKHUxNikgKHZhbCA+PiAxNikpOwotCQl3cml0ZV9waHlfcmVnKHBpLCBwaS0+dGJsX2RhdGFfbG8sICh1MTYpIHZhbCk7Ci0JfSBlbHNlIHsKLQotCQl3cml0ZV9waHlfcmVnKHBpLCBwaS0+dGJsX2RhdGFfbG8sICh1MTYpIHZhbCk7Ci0JfQotfQotCi12b2lkCi13bGNfcGh5X3dyaXRlX3RhYmxlKHN0cnVjdCBicmNtc19waHkgKnBpLCBjb25zdCBzdHJ1Y3QgcGh5dGJsX2luZm8gKnB0YmxfaW5mbywKLQkJICAgIHUxNiB0YmxBZGRyLCB1MTYgdGJsRGF0YUhpLCB1MTYgdGJsRGF0YUxvKQotewotCXVpbnQgaWR4OwotCXVpbnQgdGJsX2lkID0gcHRibF9pbmZvLT50YmxfaWQ7Ci0JdWludCB0Ymxfb2Zmc2V0ID0gcHRibF9pbmZvLT50Ymxfb2Zmc2V0OwotCXVpbnQgdGJsX3dpZHRoID0gcHRibF9pbmZvLT50Ymxfd2lkdGg7Ci0JY29uc3QgdTggKnB0YmxfOGIgPSAoY29uc3QgdTggKilwdGJsX2luZm8tPnRibF9wdHI7Ci0JY29uc3QgdTE2ICpwdGJsXzE2YiA9IChjb25zdCB1MTYgKilwdGJsX2luZm8tPnRibF9wdHI7Ci0JY29uc3QgdTMyICpwdGJsXzMyYiA9IChjb25zdCB1MzIgKilwdGJsX2luZm8tPnRibF9wdHI7Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCB0YmxBZGRyLCAodGJsX2lkIDw8IDEwKSB8IHRibF9vZmZzZXQpOwotCi0JZm9yIChpZHggPSAwOyBpZHggPCBwdGJsX2luZm8tPnRibF9sZW47IGlkeCsrKSB7Ci0KLQkJaWYgKChwaS0+c2gtPmNoaXAgPT0gQkNNNDMyMjRfQ0hJUF9JRCkgJiYKLQkJICAgIChwaS0+c2gtPmNoaXByZXYgPT0gMSkgJiYKLQkJICAgICh0YmxfaWQgPT0gTlBIWV9UQkxfSURfQU5UU1dDVFJMTFVUKSkgewotCQkJcmVhZF9waHlfcmVnKHBpLCB0YmxEYXRhTG8pOwotCi0JCQl3cml0ZV9waHlfcmVnKHBpLCB0YmxBZGRyLAotCQkJCSAgICAgICh0YmxfaWQgPDwgMTApIHwgKHRibF9vZmZzZXQgKyBpZHgpKTsKLQkJfQotCi0JCWlmICh0Ymxfd2lkdGggPT0gMzIpIHsKLQotCQkJd3JpdGVfcGh5X3JlZyhwaSwgdGJsRGF0YUhpLAotCQkJCSAgICAgICh1MTYpIChwdGJsXzMyYltpZHhdID4+IDE2KSk7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCB0YmxEYXRhTG8sICh1MTYpIHB0YmxfMzJiW2lkeF0pOwotCQl9IGVsc2UgaWYgKHRibF93aWR0aCA9PSAxNikgewotCi0JCQl3cml0ZV9waHlfcmVnKHBpLCB0YmxEYXRhTG8sIHB0YmxfMTZiW2lkeF0pOwotCQl9IGVsc2UgewotCi0JCQl3cml0ZV9waHlfcmVnKHBpLCB0YmxEYXRhTG8sIHB0YmxfOGJbaWR4XSk7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQKLXdsY19waHlfcmVhZF90YWJsZShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgY29uc3Qgc3RydWN0IHBoeXRibF9pbmZvICpwdGJsX2luZm8sCi0JCSAgIHUxNiB0YmxBZGRyLCB1MTYgdGJsRGF0YUhpLCB1MTYgdGJsRGF0YUxvKQotewotCXVpbnQgaWR4OwotCXVpbnQgdGJsX2lkID0gcHRibF9pbmZvLT50YmxfaWQ7Ci0JdWludCB0Ymxfb2Zmc2V0ID0gcHRibF9pbmZvLT50Ymxfb2Zmc2V0OwotCXVpbnQgdGJsX3dpZHRoID0gcHRibF9pbmZvLT50Ymxfd2lkdGg7Ci0JdTggKnB0YmxfOGIgPSAodTggKilwdGJsX2luZm8tPnRibF9wdHI7Ci0JdTE2ICpwdGJsXzE2YiA9ICh1MTYgKilwdGJsX2luZm8tPnRibF9wdHI7Ci0JdTMyICpwdGJsXzMyYiA9ICh1MzIgKilwdGJsX2luZm8tPnRibF9wdHI7Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCB0YmxBZGRyLCAodGJsX2lkIDw8IDEwKSB8IHRibF9vZmZzZXQpOwotCi0JZm9yIChpZHggPSAwOyBpZHggPCBwdGJsX2luZm8tPnRibF9sZW47IGlkeCsrKSB7Ci0KLQkJaWYgKChwaS0+c2gtPmNoaXAgPT0gQkNNNDMyMjRfQ0hJUF9JRCkgJiYKLQkJICAgIChwaS0+c2gtPmNoaXByZXYgPT0gMSkpIHsKLQkJCSh2b2lkKXJlYWRfcGh5X3JlZyhwaSwgdGJsRGF0YUxvKTsKLQotCQkJd3JpdGVfcGh5X3JlZyhwaSwgdGJsQWRkciwKLQkJCQkgICAgICAodGJsX2lkIDw8IDEwKSB8ICh0Ymxfb2Zmc2V0ICsgaWR4KSk7Ci0JCX0KLQotCQlpZiAodGJsX3dpZHRoID09IDMyKSB7Ci0KLQkJCXB0YmxfMzJiW2lkeF0gPSByZWFkX3BoeV9yZWcocGksIHRibERhdGFMbyk7Ci0JCQlwdGJsXzMyYltpZHhdIHw9IChyZWFkX3BoeV9yZWcocGksIHRibERhdGFIaSkgPDwgMTYpOwotCQl9IGVsc2UgaWYgKHRibF93aWR0aCA9PSAxNikgewotCi0JCQlwdGJsXzE2YltpZHhdID0gcmVhZF9waHlfcmVnKHBpLCB0YmxEYXRhTG8pOwotCQl9IGVsc2UgewotCi0JCQlwdGJsXzhiW2lkeF0gPSAodTgpIHJlYWRfcGh5X3JlZyhwaSwgdGJsRGF0YUxvKTsKLQkJfQotCX0KLX0KLQotdWludAotd2xjX3BoeV9pbml0X3JhZGlvX3JlZ3NfYWxsYmFuZHMoc3RydWN0IGJyY21zX3BoeSAqcGksCi0JCQkJIHN0cnVjdCByYWRpb18yMHh4X3JlZ3MgKnJhZGlvcmVncykKLXsKLQl1aW50IGkgPSAwOwotCi0JZG8gewotCQlpZiAocmFkaW9yZWdzW2ldLmRvX2luaXQpIHsKLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwgcmFkaW9yZWdzW2ldLmFkZHJlc3MsCi0JCQkJCSh1MTYpIHJhZGlvcmVnc1tpXS5pbml0KTsKLQkJfQotCi0JCWkrKzsKLQl9IHdoaWxlIChyYWRpb3JlZ3NbaV0uYWRkcmVzcyAhPSAweGZmZmYpOwotCi0JcmV0dXJuIGk7Ci19Ci0KLXVpbnQKLXdsY19waHlfaW5pdF9yYWRpb19yZWdzKHN0cnVjdCBicmNtc19waHkgKnBpLCBzdHJ1Y3QgcmFkaW9fcmVncyAqcmFkaW9yZWdzLAotCQkJdTE2IGNvcmVfb2Zmc2V0KQotewotCXVpbnQgaSA9IDA7Ci0JdWludCBjb3VudCA9IDA7Ci0KLQlkbyB7Ci0JCWlmIChDSFNQRUNfSVM1RyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQlpZiAocmFkaW9yZWdzW2ldLmRvX2luaXRfYSkgewotCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCXJhZGlvcmVnc1tpXS4KLQkJCQkJCWFkZHJlc3MgfCBjb3JlX29mZnNldCwKLQkJCQkJCSh1MTYpIHJhZGlvcmVnc1tpXS5pbml0X2EpOwotCQkJCWlmIChJU05QSFkocGkpICYmICgrK2NvdW50ICUgNCA9PSAwKSkKLQkJCQkJQlJDTVNfUEhZX1dBUl9QUjUxNTcxKHBpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChyYWRpb3JlZ3NbaV0uZG9faW5pdF9nKSB7Ci0JCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJcmFkaW9yZWdzW2ldLgotCQkJCQkJYWRkcmVzcyB8IGNvcmVfb2Zmc2V0LAotCQkJCQkJKHUxNikgcmFkaW9yZWdzW2ldLmluaXRfZyk7Ci0JCQkJaWYgKElTTlBIWShwaSkgJiYgKCsrY291bnQgJSA0ID09IDApKQotCQkJCQlCUkNNU19QSFlfV0FSX1BSNTE1NzEocGkpOwotCQkJfQotCQl9Ci0KLQkJaSsrOwotCX0gd2hpbGUgKHJhZGlvcmVnc1tpXS5hZGRyZXNzICE9IDB4ZmZmZik7Ci0KLQlyZXR1cm4gaTsKLX0KLQotdm9pZCB3bGNfcGh5X2RvX2R1bW15X3R4KHN0cnVjdCBicmNtc19waHkgKnBpLCBib29sIG9mZG0sIGJvb2wgcGFfb24pCi17Ci0jZGVmaW5lCURVTU1ZX1BLVF9MRU4JMjAKLQlkMTFyZWdzX3QgKnJlZ3MgPSBwaS0+cmVnczsKLQlpbnQgaSwgY291bnQ7Ci0JdTggb2ZkbXBrdFtEVU1NWV9QS1RfTEVOXSA9IHsKLQkJMHhjYywgMHgwMSwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkNCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAotCX07Ci0JdTggY2NrcGt0W0RVTU1ZX1BLVF9MRU5dID0gewotCQkweDZlLCAweDg0LCAweDBiLCAweDAwLCAweDAwLCAweDAwLCAweGQ0LCAweDAwLCAweDAwLCAweDAwLAotCQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi0JfTsKLQl1MzIgKmR1bW15cGt0OwotCi0JZHVtbXlwa3QgPSAodTMyICopIChvZmRtID8gb2ZkbXBrdCA6IGNja3BrdCk7Ci0Jd2xhcGlfYm1hY193cml0ZV90ZW1wbGF0ZV9yYW0ocGktPnNoLT5waHlzaGltLCAwLCBEVU1NWV9QS1RfTEVOLAotCQkJCSAgICAgIGR1bW15cGt0KTsKLQotCVdfUkVHKCZyZWdzLT54bXRzZWwsIDApOwotCi0JaWYgKEQxMVJFVl9HRShwaS0+c2gtPmNvcmVyZXYsIDExKSkKLQkJV19SRUcoJnJlZ3MtPndlcGN0bCwgMHgxMDApOwotCWVsc2UKLQkJV19SRUcoJnJlZ3MtPndlcGN0bCwgMCk7Ci0KLQlXX1JFRygmcmVncy0+dHhlX3BoeWN0bCwgKG9mZG0gPyAxIDogMCkgfCBQSFlfVFhDX0FOVF8wKTsKLQlpZiAoSVNOUEhZKHBpKSB8fCBJU0xDTlBIWShwaSkpIHsKLQkJV19SRUcoJnJlZ3MtPnR4ZV9waHljdGwxLCAweDFBMDIpOwotCX0KLQotCVdfUkVHKCZyZWdzLT50eGVfd21fMCwgMCk7Ci0JV19SRUcoJnJlZ3MtPnR4ZV93bV8xLCAwKTsKLQotCVdfUkVHKCZyZWdzLT54bXR0cGxhdGV0eHB0ciwgMCk7Ci0JV19SRUcoJnJlZ3MtPnhtdHR4Y250LCBEVU1NWV9QS1RfTEVOKTsKLQotCVdfUkVHKCZyZWdzLT54bXRzZWwsICgoOCA8PCA4KSB8ICgxIDw8IDUpIHwgKDEgPDwgMikgfCAyKSk7Ci0KLQlXX1JFRygmcmVncy0+dHhlX2N0bCwgMCk7Ci0KLQlpZiAoIXBhX29uKSB7Ci0JCWlmIChJU05QSFkocGkpKQotCQkJd2xjX3BoeV9wYV9vdmVycmlkZV9ucGh5KHBpLCBPRkYpOwotCX0KLQotCWlmIChJU05QSFkocGkpIHx8IElTTENOUEhZKHBpKSkKLQkJV19SRUcoJnJlZ3MtPnR4ZV9hdXgsIDB4RDApOwotCWVsc2UKLQkJV19SRUcoJnJlZ3MtPnR4ZV9hdXgsICgoMSA8PCA1KSB8ICgxIDw8IDQpKSk7Ci0KLQkodm9pZClSX1JFRygmcmVncy0+dHhlX2F1eCk7Ci0KLQlpID0gMDsKLQljb3VudCA9IG9mZG0gPyAzMCA6IDI1MDsKLQl3aGlsZSAoKGkrKyA8IGNvdW50KQotCSAgICAgICAmJiAoUl9SRUcoJnJlZ3MtPnR4ZV9zdGF0dXMpICYgKDEgPDwgNykpKSB7Ci0JCXVkZWxheSgxMCk7Ci0JfQotCi0JaSA9IDA7Ci0KLQl3aGlsZSAoKGkrKyA8IDEwKQotCSAgICAgICAmJiAoKFJfUkVHKCZyZWdzLT50eGVfc3RhdHVzKSAmICgxIDw8IDEwKSkgPT0gMCkpIHsKLQkJdWRlbGF5KDEwKTsKLQl9Ci0KLQlpID0gMDsKLQotCXdoaWxlICgoaSsrIDwgMTApICYmICgoUl9SRUcoJnJlZ3MtPmlmc3N0YXQpICYgKDEgPDwgOCkpKSkKLQkJdWRlbGF5KDEwKTsKLQotCWlmICghcGFfb24pIHsKLQkJaWYgKElTTlBIWShwaSkpCi0JCQl3bGNfcGh5X3BhX292ZXJyaWRlX25waHkocGksIE9OKTsKLQl9Ci19Ci0KLXZvaWQgd2xjX3BoeV9ob2xkX3VwZChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcGloLCBtYm9vbCBpZCwgYm9vbCBzZXQpCi17Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwaWg7Ci0KLQlpZiAoc2V0KSB7Ci0JCW1ib29sc2V0KHBpLT5tZWFzdXJlX2hvbGQsIGlkKTsKLQl9IGVsc2UgewotCQltYm9vbGNscihwaS0+bWVhc3VyZV9ob2xkLCBpZCk7Ci0JfQotCi0JcmV0dXJuOwotfQotCi12b2lkIHdsY19waHlfbXV0ZV91cGQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCwgYm9vbCBtdXRlLCBtYm9vbCBmbGFncykKLXsKLQlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBpaDsKLQotCWlmIChtdXRlKSB7Ci0JCW1ib29sc2V0KHBpLT5tZWFzdXJlX2hvbGQsIFBIWV9IT0xEX0ZPUl9NVVRFKTsKLQl9IGVsc2UgewotCQltYm9vbGNscihwaS0+bWVhc3VyZV9ob2xkLCBQSFlfSE9MRF9GT1JfTVVURSk7Ci0JfQotCi0JaWYgKCFtdXRlICYmIChmbGFncyAmIFBIWV9NVVRFX0ZPUl9QUkVJU00pKQotCQlwaS0+bnBoeV9wZXJpY2FsX2xhc3QgPSBwaS0+c2gtPm5vdyAtIHBpLT5zaC0+Z2xhY2lhbF90aW1lcjsKLQlyZXR1cm47Ci19Ci0KLXZvaWQgd2xjX3BoeV9jbGVhcl90c3NpKHN0cnVjdCBicmNtc19waHlfcHViICpwaWgpCi17Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwaWg7Ci0KLQlpZiAoSVNOUEhZKHBpKSkgewotCQlyZXR1cm47Ci0JfSBlbHNlIHsKLQkJd2xhcGlfYm1hY193cml0ZV9zaG0ocGktPnNoLT5waHlzaGltLCBNX0JfVFNTSV8wLCBOVUxMX1RTU0lfVyk7Ci0JCXdsYXBpX2JtYWNfd3JpdGVfc2htKHBpLT5zaC0+cGh5c2hpbSwgTV9CX1RTU0lfMSwgTlVMTF9UU1NJX1cpOwotCQl3bGFwaV9ibWFjX3dyaXRlX3NobShwaS0+c2gtPnBoeXNoaW0sIE1fR19UU1NJXzAsIE5VTExfVFNTSV9XKTsKLQkJd2xhcGlfYm1hY193cml0ZV9zaG0ocGktPnNoLT5waHlzaGltLCBNX0dfVFNTSV8xLCBOVUxMX1RTU0lfVyk7Ci0JfQotfQotCi1zdGF0aWMgYm9vbCB3bGNfcGh5X2NhbF90eHBvd2VyX3JlY2FsY19zdyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgd2xjX3BoeV9zd2l0Y2hfcmFkaW8oc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCwgYm9vbCBvbikKLXsKLQlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBpaDsKLQotCWlmIChOT1JBRElPX0VOQUIocGktPnB1YnBpKSkKLQkJcmV0dXJuOwotCi0JewotCQl1aW50IG1jOwotCi0JCW1jID0gUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKTsKLQl9Ci0KLQlpZiAoSVNOUEhZKHBpKSkgewotCQl3bGNfcGh5X3N3aXRjaF9yYWRpb19ucGh5KHBpLCBvbik7Ci0KLQl9IGVsc2UgaWYgKElTTENOUEhZKHBpKSkgewotCQlpZiAob24pIHsKLQkJCWFuZF9waHlfcmVnKHBpLCAweDQ0YywKLQkJCQkgICAgfigoMHgxIDw8IDgpIHwKLQkJCQkgICAgICAoMHgxIDw8IDkpIHwKLQkJCQkgICAgICAoMHgxIDw8IDEwKSB8ICgweDEgPDwgMTEpIHwgKDB4MSA8PCAxMikpKTsKLQkJCWFuZF9waHlfcmVnKHBpLCAweDRiMCwgfigoMHgxIDw8IDMpIHwgKDB4MSA8PCAxMSkpKTsKLQkJCWFuZF9waHlfcmVnKHBpLCAweDRmOSwgfigweDEgPDwgMykpOwotCQl9IGVsc2UgewotCQkJYW5kX3BoeV9yZWcocGksIDB4NDRkLAotCQkJCSAgICB+KCgweDEgPDwgMTApIHwKLQkJCQkgICAgICAoMHgxIDw8IDExKSB8Ci0JCQkJICAgICAgKDB4MSA8PCAxMikgfCAoMHgxIDw8IDEzKSB8ICgweDEgPDwgMTQpKSk7Ci0JCQlvcl9waHlfcmVnKHBpLCAweDQ0YywKLQkJCQkgICAoMHgxIDw8IDgpIHwKLQkJCQkgICAoMHgxIDw8IDkpIHwKLQkJCQkgICAoMHgxIDw8IDEwKSB8ICgweDEgPDwgMTEpIHwgKDB4MSA8PCAxMikpOwotCi0JCQlhbmRfcGh5X3JlZyhwaSwgMHg0YjcsIH4oKDB4N2YgPDwgOCkpKTsKLQkJCWFuZF9waHlfcmVnKHBpLCAweDRiMSwgfigoMHgxIDw8IDEzKSkpOwotCQkJb3JfcGh5X3JlZyhwaSwgMHg0YjAsICgweDEgPDwgMykgfCAoMHgxIDw8IDExKSk7Ci0JCQlhbmRfcGh5X3JlZyhwaSwgMHg0ZmEsIH4oKDB4MSA8PCAzKSkpOwotCQkJb3JfcGh5X3JlZyhwaSwgMHg0ZjksICgweDEgPDwgMykpOwotCQl9Ci0JfQotfQotCi11MTYgd2xjX3BoeV9id19zdGF0ZV9nZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSkKLXsKLQlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBwaTsKLQotCXJldHVybiBwaS0+Ync7Ci19Ci0KLXZvaWQgd2xjX3BoeV9id19zdGF0ZV9zZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwgdTE2IGJ3KQotewotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcHBpOwotCi0JcGktPmJ3ID0gYnc7Ci19Ci0KLXZvaWQgd2xjX3BoeV9jaGFuc3BlY19yYWRpb19zZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwgY2hhbnNwZWNfdCBuZXdjaCkKLXsKLQlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBwaTsKLQlwaS0+cmFkaW9fY2hhbnNwZWMgPSBuZXdjaDsKLQotfQotCi1jaGFuc3BlY190IHdsY19waHlfY2hhbnNwZWNfZ2V0KHN0cnVjdCBicmNtc19waHlfcHViICpwcGkpCi17Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwcGk7Ci0KLQlyZXR1cm4gcGktPnJhZGlvX2NoYW5zcGVjOwotfQotCi12b2lkIHdsY19waHlfY2hhbnNwZWNfc2V0KHN0cnVjdCBicmNtc19waHlfcHViICpwcGksIGNoYW5zcGVjX3QgY2hhbnNwZWMpCi17Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwcGk7Ci0JdTE2IG1fY3VyX2NoYW5uZWw7Ci0JY2hhbnNldGZuX3QgY2hhbnNwZWNfc2V0ID0gTlVMTDsKLQotCW1fY3VyX2NoYW5uZWwgPSBDSFNQRUNfQ0hBTk5FTChjaGFuc3BlYyk7Ci0JaWYgKENIU1BFQ19JUzVHKGNoYW5zcGVjKSkKLQkJbV9jdXJfY2hhbm5lbCB8PSBEMTFfQ1VSQ0hBTk5FTF81RzsKLQlpZiAoQ0hTUEVDX0lTNDAoY2hhbnNwZWMpKQotCQltX2N1cl9jaGFubmVsIHw9IEQxMV9DVVJDSEFOTkVMXzQwOwotCXdsYXBpX2JtYWNfd3JpdGVfc2htKHBpLT5zaC0+cGh5c2hpbSwgTV9DVVJDSEFOTkVMLCBtX2N1cl9jaGFubmVsKTsKLQotCWNoYW5zcGVjX3NldCA9IHBpLT5waV9mcHRyLmNoYW5zZXQ7Ci0JaWYgKGNoYW5zcGVjX3NldCkKLQkJKCpjaGFuc3BlY19zZXQpIChwaSwgY2hhbnNwZWMpOwotCi19Ci0KLWludCB3bGNfcGh5X2NoYW5zcGVjX2ZyZXEyYmFuZHJhbmdlX2xwc3NuKHVpbnQgZnJlcSkKLXsKLQlpbnQgcmFuZ2UgPSAtMTsKLQotCWlmIChmcmVxIDwgMjUwMCkKLQkJcmFuZ2UgPSBXTF9DSEFOX0ZSRVFfUkFOR0VfMkc7Ci0JZWxzZSBpZiAoZnJlcSA8PSA1MzIwKQotCQlyYW5nZSA9IFdMX0NIQU5fRlJFUV9SQU5HRV81R0w7Ci0JZWxzZSBpZiAoZnJlcSA8PSA1NzAwKQotCQlyYW5nZSA9IFdMX0NIQU5fRlJFUV9SQU5HRV81R007Ci0JZWxzZQotCQlyYW5nZSA9IFdMX0NIQU5fRlJFUV9SQU5HRV81R0g7Ci0KLQlyZXR1cm4gcmFuZ2U7Ci19Ci0KLWludCB3bGNfcGh5X2NoYW5zcGVjX2JhbmRyYW5nZV9nZXQoc3RydWN0IGJyY21zX3BoeSAqcGksIGNoYW5zcGVjX3QgY2hhbnNwZWMpCi17Ci0JaW50IHJhbmdlID0gLTE7Ci0JdWludCBjaGFubmVsID0gQ0hTUEVDX0NIQU5ORUwoY2hhbnNwZWMpOwotCXVpbnQgZnJlcSA9IHdsY19waHlfY2hhbm5lbDJmcmVxKGNoYW5uZWwpOwotCi0JaWYgKElTTlBIWShwaSkpIHsKLQkJcmFuZ2UgPSB3bGNfcGh5X2dldF9jaGFuX2ZyZXFfcmFuZ2VfbnBoeShwaSwgY2hhbm5lbCk7Ci0JfSBlbHNlIGlmIChJU0xDTlBIWShwaSkpIHsKLQkJcmFuZ2UgPSB3bGNfcGh5X2NoYW5zcGVjX2ZyZXEyYmFuZHJhbmdlX2xwc3NuKGZyZXEpOwotCX0KLQotCXJldHVybiByYW5nZTsKLX0KLQotdm9pZCB3bGNfcGh5X2NoYW5zcGVjX2NoMTRfd2lkZWZpbHRlcl9zZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwKLQkJCQkJICBib29sIHdpZGVfZmlsdGVyKQotewotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcHBpOwotCi0JcGktPmNoYW5uZWxfMTRfd2lkZV9maWx0ZXIgPSB3aWRlX2ZpbHRlcjsKLQotfQotCi1pbnQgd2xjX3BoeV9jaGFubmVsMmZyZXEodWludCBjaGFubmVsKQotewotCXVpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNoYW5faW5mb19hbGwpOyBpKyspCi0JCWlmIChjaGFuX2luZm9fYWxsW2ldLmNoYW4gPT0gY2hhbm5lbCkKLQkJCXJldHVybiBjaGFuX2luZm9fYWxsW2ldLmZyZXE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQKLXdsY19waHlfY2hhbnNwZWNfYmFuZF92YWxpZGNoKHN0cnVjdCBicmNtc19waHlfcHViICpwcGksIHVpbnQgYmFuZCwKLQkJCSAgICAgIGNoYW52ZWNfdCAqY2hhbm5lbHMpCi17Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwcGk7Ci0JdWludCBpOwotCXVpbnQgY2hhbm5lbDsKLQotCW1lbXNldChjaGFubmVscywgMCwgc2l6ZW9mKGNoYW52ZWNfdCkpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2hhbl9pbmZvX2FsbCk7IGkrKykgewotCQljaGFubmVsID0gY2hhbl9pbmZvX2FsbFtpXS5jaGFuOwotCi0JCWlmICgocGktPmFfYmFuZF9oaWdoX2Rpc2FibGUpICYmIChjaGFubmVsID49IEZJUlNUX1JFRjVfQ0hBTk5VTSkKLQkJICAgICYmIChjaGFubmVsIDw9IExBU1RfUkVGNV9DSEFOTlVNKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICgoYmFuZCA9PSBCUkNNX0JBTkRfMkcgJiYgY2hhbm5lbCA8PSBDSF9NQVhfMkdfQ0hBTk5FTCkgfHwKLQkJICAgIChiYW5kID09IEJSQ01fQkFORF81RyAmJiBjaGFubmVsID4gQ0hfTUFYXzJHX0NIQU5ORUwpKQotCQkJc2V0Yml0KGNoYW5uZWxzLT52ZWMsIGNoYW5uZWwpOwotCX0KLX0KLQotY2hhbnNwZWNfdCB3bGNfcGh5X2NoYW5zcGVjX2JhbmRfZmlyc3RjaChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcHBpLCB1aW50IGJhbmQpCi17Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwcGk7Ci0JdWludCBpOwotCXVpbnQgY2hhbm5lbDsKLQljaGFuc3BlY190IGNoc3BlYzsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNoYW5faW5mb19hbGwpOyBpKyspIHsKLQkJY2hhbm5lbCA9IGNoYW5faW5mb19hbGxbaV0uY2hhbjsKLQotCQlpZiAoSVNOUEhZKHBpKSAmJiBJUzQwTUhaKHBpKSkgewotCQkJdWludCBqOwotCi0JCQlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShjaGFuX2luZm9fYWxsKTsgaisrKSB7Ci0JCQkJaWYgKGNoYW5faW5mb19hbGxbal0uY2hhbiA9PQotCQkJCSAgICBjaGFubmVsICsgQ0hfMTBNSFpfQVBBUlQpCi0JCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoaiA9PSBBUlJBWV9TSVpFKGNoYW5faW5mb19hbGwpKQotCQkJCWNvbnRpbnVlOwotCi0JCQljaGFubmVsID0gVVBQRVJfMjBfU0IoY2hhbm5lbCk7Ci0JCQljaHNwZWMgPQotCQkJICAgIGNoYW5uZWwgfCBXTF9DSEFOU1BFQ19CV180MCB8Ci0JCQkgICAgV0xfQ0hBTlNQRUNfQ1RMX1NCX0xPV0VSOwotCQkJaWYgKGJhbmQgPT0gQlJDTV9CQU5EXzJHKQotCQkJCWNoc3BlYyB8PSBXTF9DSEFOU1BFQ19CQU5EXzJHOwotCQkJZWxzZQotCQkJCWNoc3BlYyB8PSBXTF9DSEFOU1BFQ19CQU5EXzVHOwotCQl9IGVsc2UKLQkJCWNoc3BlYyA9IENIMjBNSFpfQ0hTUEVDKGNoYW5uZWwpOwotCi0JCWlmICgocGktPmFfYmFuZF9oaWdoX2Rpc2FibGUpICYmIChjaGFubmVsID49IEZJUlNUX1JFRjVfQ0hBTk5VTSkKLQkJICAgICYmIChjaGFubmVsIDw9IExBU1RfUkVGNV9DSEFOTlVNKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICgoYmFuZCA9PSBCUkNNX0JBTkRfMkcgJiYgY2hhbm5lbCA8PSBDSF9NQVhfMkdfQ0hBTk5FTCkgfHwKLQkJICAgIChiYW5kID09IEJSQ01fQkFORF81RyAmJiBjaGFubmVsID4gQ0hfTUFYXzJHX0NIQU5ORUwpKQotCQkJcmV0dXJuIGNoc3BlYzsKLQl9Ci0KLQlyZXR1cm4gKGNoYW5zcGVjX3QpIElOVkNIQU5TUEVDOwotfQotCi1pbnQgd2xjX3BoeV90eHBvd2VyX2dldChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcHBpLCB1aW50ICpxZGJtLCBib29sICpvdmVycmlkZSkKLXsKLQlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBwaTsKLQotCSpxZGJtID0gcGktPnR4X3VzZXJfdGFyZ2V0WzBdOwotCWlmIChvdmVycmlkZSAhPSBOVUxMKQotCQkqb3ZlcnJpZGUgPSBwaS0+dHhwd3JvdmVycmlkZTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCB3bGNfcGh5X3R4cG93ZXJfdGFyZ2V0X3NldChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcHBpLAotCQkJCXN0cnVjdCB0eHB3cl9saW1pdHMgKnR4cHdyKQotewotCWJvb2wgbWFjX2VuYWJsZWQgPSBmYWxzZTsKLQlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBwaTsKLQotCW1lbWNweSgmcGktPnR4X3VzZXJfdGFyZ2V0W1RYUF9GSVJTVF9DQ0tdLAotCSAgICAgICAmdHhwd3ItPmNja1swXSwgQlJDTVNfTlVNX1JBVEVTX0NDSyk7Ci0KLQltZW1jcHkoJnBpLT50eF91c2VyX3RhcmdldFtUWFBfRklSU1RfT0ZETV0sCi0JICAgICAgICZ0eHB3ci0+b2ZkbVswXSwgQlJDTVNfTlVNX1JBVEVTX09GRE0pOwotCW1lbWNweSgmcGktPnR4X3VzZXJfdGFyZ2V0W1RYUF9GSVJTVF9PRkRNXzIwX0NERF0sCi0JICAgICAgICZ0eHB3ci0+b2ZkbV9jZGRbMF0sIEJSQ01TX05VTV9SQVRFU19PRkRNKTsKLQotCW1lbWNweSgmcGktPnR4X3VzZXJfdGFyZ2V0W1RYUF9GSVJTVF9PRkRNXzQwX1NJU09dLAotCSAgICAgICAmdHhwd3ItPm9mZG1fNDBfc2lzb1swXSwgQlJDTVNfTlVNX1JBVEVTX09GRE0pOwotCW1lbWNweSgmcGktPnR4X3VzZXJfdGFyZ2V0W1RYUF9GSVJTVF9PRkRNXzQwX0NERF0sCi0JICAgICAgICZ0eHB3ci0+b2ZkbV80MF9jZGRbMF0sIEJSQ01TX05VTV9SQVRFU19PRkRNKTsKLQotCW1lbWNweSgmcGktPnR4X3VzZXJfdGFyZ2V0W1RYUF9GSVJTVF9NQ1NfMjBfU0lTT10sCi0JICAgICAgICZ0eHB3ci0+bWNzXzIwX3Npc29bMF0sIEJSQ01TX05VTV9SQVRFU19NQ1NfMV9TVFJFQU0pOwotCW1lbWNweSgmcGktPnR4X3VzZXJfdGFyZ2V0W1RYUF9GSVJTVF9NQ1NfMjBfQ0REXSwKLQkgICAgICAgJnR4cHdyLT5tY3NfMjBfY2RkWzBdLCBCUkNNU19OVU1fUkFURVNfTUNTXzFfU1RSRUFNKTsKLQltZW1jcHkoJnBpLT50eF91c2VyX3RhcmdldFtUWFBfRklSU1RfTUNTXzIwX1NUQkNdLAotCSAgICAgICAmdHhwd3ItPm1jc18yMF9zdGJjWzBdLCBCUkNNU19OVU1fUkFURVNfTUNTXzFfU1RSRUFNKTsKLQltZW1jcHkoJnBpLT50eF91c2VyX3RhcmdldFtUWFBfRklSU1RfTUNTXzIwX1NETV0sCi0JICAgICAgICZ0eHB3ci0+bWNzXzIwX21pbW9bMF0sIEJSQ01TX05VTV9SQVRFU19NQ1NfMl9TVFJFQU0pOwotCi0JbWVtY3B5KCZwaS0+dHhfdXNlcl90YXJnZXRbVFhQX0ZJUlNUX01DU180MF9TSVNPXSwKLQkgICAgICAgJnR4cHdyLT5tY3NfNDBfc2lzb1swXSwgQlJDTVNfTlVNX1JBVEVTX01DU18xX1NUUkVBTSk7Ci0JbWVtY3B5KCZwaS0+dHhfdXNlcl90YXJnZXRbVFhQX0ZJUlNUX01DU180MF9DRERdLAotCSAgICAgICAmdHhwd3ItPm1jc180MF9jZGRbMF0sIEJSQ01TX05VTV9SQVRFU19NQ1NfMV9TVFJFQU0pOwotCW1lbWNweSgmcGktPnR4X3VzZXJfdGFyZ2V0W1RYUF9GSVJTVF9NQ1NfNDBfU1RCQ10sCi0JICAgICAgICZ0eHB3ci0+bWNzXzQwX3N0YmNbMF0sIEJSQ01TX05VTV9SQVRFU19NQ1NfMV9TVFJFQU0pOwotCW1lbWNweSgmcGktPnR4X3VzZXJfdGFyZ2V0W1RYUF9GSVJTVF9NQ1NfNDBfU0RNXSwKLQkgICAgICAgJnR4cHdyLT5tY3NfNDBfbWltb1swXSwgQlJDTVNfTlVNX1JBVEVTX01DU18yX1NUUkVBTSk7Ci0KLQlpZiAoUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKSAmIE1DVExfRU5fTUFDKQotCQltYWNfZW5hYmxlZCA9IHRydWU7Ci0KLQlpZiAobWFjX2VuYWJsZWQpCi0JCXdsYXBpX3N1c3BlbmRfbWFjX2FuZF93YWl0KHBpLT5zaC0+cGh5c2hpbSk7Ci0KLQl3bGNfcGh5X3R4cG93ZXJfcmVjYWxjX3RhcmdldChwaSk7Ci0Jd2xjX3BoeV9jYWxfdHhwb3dlcl9yZWNhbGNfc3cocGkpOwotCi0JaWYgKG1hY19lbmFibGVkKQotCQl3bGFwaV9lbmFibGVfbWFjKHBpLT5zaC0+cGh5c2hpbSk7Ci19Ci0KLWludCB3bGNfcGh5X3R4cG93ZXJfc2V0KHN0cnVjdCBicmNtc19waHlfcHViICpwcGksIHVpbnQgcWRibSwgYm9vbCBvdmVycmlkZSkKLXsKLQlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBwaTsKLQlpbnQgaTsKLQotCWlmIChxZGJtID4gMTI3KQotCQlyZXR1cm4gNTsKLQotCWZvciAoaSA9IDA7IGkgPCBUWFBfTlVNX1JBVEVTOyBpKyspCi0JCXBpLT50eF91c2VyX3RhcmdldFtpXSA9ICh1OCkgcWRibTsKLQotCXBpLT50eHB3cm92ZXJyaWRlID0gZmFsc2U7Ci0KLQlpZiAocGktPnNoLT51cCkgewotCQlpZiAoIVNDQU5fSU5QUk9HX1BIWShwaSkpIHsKLQkJCWJvb2wgc3VzcGVuZDsKLQotCQkJc3VzcGVuZCA9Ci0JCQkgICAgKDAgPT0KLQkJCSAgICAgKFJfUkVHKCZwaS0+cmVncy0+bWFjY29udHJvbCkgJgotCQkJICAgICAgTUNUTF9FTl9NQUMpKTsKLQotCQkJaWYgKCFzdXNwZW5kKQotCQkJCXdsYXBpX3N1c3BlbmRfbWFjX2FuZF93YWl0KHBpLT5zaC0+cGh5c2hpbSk7Ci0KLQkJCXdsY19waHlfdHhwb3dlcl9yZWNhbGNfdGFyZ2V0KHBpKTsKLQkJCXdsY19waHlfY2FsX3R4cG93ZXJfcmVjYWxjX3N3KHBpKTsKLQotCQkJaWYgKCFzdXNwZW5kKQotCQkJCXdsYXBpX2VuYWJsZV9tYWMocGktPnNoLT5waHlzaGltKTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotdm9pZAotd2xjX3BoeV90eHBvd2VyX3Nyb21saW1pdChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcHBpLCB1aW50IGNoYW5uZWwsIHU4ICptaW5fcHdyLAotCQkJICB1OCAqbWF4X3B3ciwgaW50IHR4cF9yYXRlX2lkeCkKLXsKLQlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBwaTsKLQl1aW50IGk7Ci0KLQkqbWluX3B3ciA9IHBpLT5taW5fdHhwb3dlciAqIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUjsKLQotCWlmIChJU05QSFkocGkpKSB7Ci0JCWlmICh0eHBfcmF0ZV9pZHggPCAwKQotCQkJdHhwX3JhdGVfaWR4ID0gVFhQX0ZJUlNUX0NDSzsKLQkJd2xjX3BoeV90eHBvd2VyX3Nyb21saW1pdF9nZXRfbnBoeShwaSwgY2hhbm5lbCwgbWF4X3B3ciwKLQkJCQkJCSAgICh1OCkgdHhwX3JhdGVfaWR4KTsKLQotCX0gZWxzZSBpZiAoKGNoYW5uZWwgPD0gQ0hfTUFYXzJHX0NIQU5ORUwpKSB7Ci0JCWlmICh0eHBfcmF0ZV9pZHggPCAwKQotCQkJdHhwX3JhdGVfaWR4ID0gVFhQX0ZJUlNUX0NDSzsKLQkJKm1heF9wd3IgPSBwaS0+dHhfc3JvbV9tYXhfcmF0ZV8yZ1t0eHBfcmF0ZV9pZHhdOwotCX0gZWxzZSB7Ci0KLQkJKm1heF9wd3IgPSBCUkNNU19UWFBXUl9NQVg7Ci0KLQkJaWYgKHR4cF9yYXRlX2lkeCA8IDApCi0JCQl0eHBfcmF0ZV9pZHggPSBUWFBfRklSU1RfT0ZETTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjaGFuX2luZm9fYWxsKTsgaSsrKSB7Ci0JCQlpZiAoY2hhbm5lbCA9PSBjaGFuX2luZm9fYWxsW2ldLmNoYW4pIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChwaS0+aHd0eHB3cikgewotCQkJKm1heF9wd3IgPSBwaS0+aHd0eHB3cltpXTsKLQkJfSBlbHNlIHsKLQotCQkJaWYgKChpID49IEZJUlNUX01JRF81R19DSEFOKSAmJiAoaSA8PSBMQVNUX01JRF81R19DSEFOKSkKLQkJCQkqbWF4X3B3ciA9Ci0JCQkJICAgIHBpLT50eF9zcm9tX21heF9yYXRlXzVnX21pZFt0eHBfcmF0ZV9pZHhdOwotCQkJaWYgKChpID49IEZJUlNUX0hJR0hfNUdfQ0hBTikKLQkJCSAgICAmJiAoaSA8PSBMQVNUX0hJR0hfNUdfQ0hBTikpCi0JCQkJKm1heF9wd3IgPQotCQkJCSAgICBwaS0+dHhfc3JvbV9tYXhfcmF0ZV81Z19oaVt0eHBfcmF0ZV9pZHhdOwotCQkJaWYgKChpID49IEZJUlNUX0xPV181R19DSEFOKSAmJiAoaSA8PSBMQVNUX0xPV181R19DSEFOKSkKLQkJCQkqbWF4X3B3ciA9Ci0JCQkJICAgIHBpLT50eF9zcm9tX21heF9yYXRlXzVnX2xvd1t0eHBfcmF0ZV9pZHhdOwotCQl9Ci0JfQotfQotCi12b2lkCi13bGNfcGh5X3R4cG93ZXJfc3JvbWxpbWl0X21heF9nZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwgdWludCBjaGFuLAotCQkJCSAgdTggKm1heF90eHB3ciwgdTggKm1pbl90eHB3cikKLXsKLQlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBwaTsKLQl1OCB0eF9wd3JfbWF4ID0gMDsKLQl1OCB0eF9wd3JfbWluID0gMjU1OwotCXU4IG1heF9udW1fcmF0ZTsKLQl1OCBtYXh0eHB3ciwgbWludHhwd3IsIHJhdGUsIHBhY3RybDsKLQotCXBhY3RybCA9IDA7Ci0KLQltYXhfbnVtX3JhdGUgPSBJU05QSFkocGkpID8gVFhQX05VTV9SQVRFUyA6Ci0JICAgIElTTENOUEhZKHBpKSA/IChUWFBfTEFTVF9TSVNPX01DU18yMCArIDEpIDogKFRYUF9MQVNUX09GRE0gKyAxKTsKLQotCWZvciAocmF0ZSA9IDA7IHJhdGUgPCBtYXhfbnVtX3JhdGU7IHJhdGUrKykgewotCi0JCXdsY19waHlfdHhwb3dlcl9zcm9tbGltaXQocHBpLCBjaGFuLCAmbWludHhwd3IsICZtYXh0eHB3ciwKLQkJCQkJICByYXRlKTsKLQotCQltYXh0eHB3ciA9IChtYXh0eHB3ciA+IHBhY3RybCkgPyAobWF4dHhwd3IgLSBwYWN0cmwpIDogMDsKLQotCQltYXh0eHB3ciA9IChtYXh0eHB3ciA+IDYpID8gKG1heHR4cHdyIC0gNikgOiAwOwotCi0JCXR4X3B3cl9tYXggPSBtYXgodHhfcHdyX21heCwgbWF4dHhwd3IpOwotCQl0eF9wd3JfbWluID0gbWluKHR4X3B3cl9taW4sIG1heHR4cHdyKTsKLQl9Ci0JKm1heF90eHB3ciA9IHR4X3B3cl9tYXg7Ci0JKm1pbl90eHB3ciA9IHR4X3B3cl9taW47Ci19Ci0KLXZvaWQKLXdsY19waHlfdHhwb3dlcl9ib2FyZGxpbWl0X2JhbmQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwgdWludCBiYW5kdW5pdCwKLQkJCQlzMzIgKm1heF9wd3IsIHMzMiAqbWluX3B3ciwgdTMyICpzdGVwX3B3cikKLXsKLQlyZXR1cm47Ci19Ci0KLXU4IHdsY19waHlfdHhwb3dlcl9nZXRfdGFyZ2V0X21pbihzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcHBpKQotewotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcHBpOwotCi0JcmV0dXJuIHBpLT50eF9wb3dlcl9taW47Ci19Ci0KLXU4IHdsY19waHlfdHhwb3dlcl9nZXRfdGFyZ2V0X21heChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcHBpKQotewotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcHBpOwotCi0JcmV0dXJuIHBpLT50eF9wb3dlcl9tYXg7Ci19Ci0KLXZvaWQgd2xjX3BoeV90eHBvd2VyX3JlY2FsY190YXJnZXQoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JdTggbWF4dHhwd3IsIG1pbnR4cHdyLCByYXRlLCBwYWN0cmw7Ci0JdWludCB0YXJnZXRfY2hhbjsKLQl1OCB0eF9wd3JfdGFyZ2V0W1RYUF9OVU1fUkFURVNdOwotCXU4IHR4X3B3cl9tYXggPSAwOwotCXU4IHR4X3B3cl9taW4gPSAyNTU7Ci0JdTggdHhfcHdyX21heF9yYXRlX2luZCA9IDA7Ci0JdTggbWF4X251bV9yYXRlOwotCXU4IHN0YXJ0X3JhdGUgPSAwOwotCWNoYW5zcGVjX3QgY2hzcGVjOwotCXUzMiBiYW5kID0gQ0hTUEVDMkJBTkQocGktPnJhZGlvX2NoYW5zcGVjKTsKLQlpbml0Zm5fdCB0eHB3cl9yZWNhbGNfZm4gPSBOVUxMOwotCi0JY2hzcGVjID0gcGktPnJhZGlvX2NoYW5zcGVjOwotCWlmIChDSFNQRUNfQ1RMX1NCKGNoc3BlYykgPT0gV0xfQ0hBTlNQRUNfQ1RMX1NCX05PTkUpCi0JCXRhcmdldF9jaGFuID0gQ0hTUEVDX0NIQU5ORUwoY2hzcGVjKTsKLQllbHNlIGlmIChDSFNQRUNfQ1RMX1NCKGNoc3BlYykgPT0gV0xfQ0hBTlNQRUNfQ1RMX1NCX1VQUEVSKQotCQl0YXJnZXRfY2hhbiA9IFVQUEVSXzIwX1NCKENIU1BFQ19DSEFOTkVMKGNoc3BlYykpOwotCWVsc2UKLQkJdGFyZ2V0X2NoYW4gPSBMT1dFUl8yMF9TQihDSFNQRUNfQ0hBTk5FTChjaHNwZWMpKTsKLQotCXBhY3RybCA9IDA7Ci0JaWYgKElTTENOUEhZKHBpKSkgewotCQl1MzIgb2Zmc2V0X21jcywgaTsKLQotCQlpZiAoQ0hTUEVDX0lTNDAocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJb2Zmc2V0X21jcyA9IHBpLT5tY3M0MF9wbzsKLQkJCWZvciAoaSA9IFRYUF9GSVJTVF9TSVNPX01DU18yMDsKLQkJCSAgICAgaSA8PSBUWFBfTEFTVF9TSVNPX01DU18yMDsgaSsrKSB7Ci0JCQkJcGktPnR4X3Nyb21fbWF4X3JhdGVfMmdbaSAtIDhdID0KLQkJCQkgICAgcGktPnR4X3Nyb21fbWF4XzJnIC0KLQkJCQkgICAgKChvZmZzZXRfbWNzICYgMHhmKSAqIDIpOwotCQkJCW9mZnNldF9tY3MgPj49IDQ7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlvZmZzZXRfbWNzID0gcGktPm1jczIwX3BvOwotCQkJZm9yIChpID0gVFhQX0ZJUlNUX1NJU09fTUNTXzIwOwotCQkJICAgICBpIDw9IFRYUF9MQVNUX1NJU09fTUNTXzIwOyBpKyspIHsKLQkJCQlwaS0+dHhfc3JvbV9tYXhfcmF0ZV8yZ1tpIC0gOF0gPQotCQkJCSAgICBwaS0+dHhfc3JvbV9tYXhfMmcgLQotCQkJCSAgICAoKG9mZnNldF9tY3MgJiAweGYpICogMik7Ci0JCQkJb2Zmc2V0X21jcyA+Pj0gNDsKLQkJCX0KLQkJfQotCX0KLSNpZiBXTDExTgotCW1heF9udW1fcmF0ZSA9ICgoSVNOUEhZKHBpKSkgPyAoVFhQX05VTV9SQVRFUykgOgotCQkJKChJU0xDTlBIWShwaSkpID8KLQkJCSAoVFhQX0xBU1RfU0lTT19NQ1NfMjAgKyAxKSA6IChUWFBfTEFTVF9PRkRNICsgMSkpKTsKLSNlbHNlCi0JbWF4X251bV9yYXRlID0gKChJU05QSFkocGkpKSA/IChUWFBfTlVNX1JBVEVTKSA6IChUWFBfTEFTVF9PRkRNICsgMSkpOwotI2VuZGlmCi0KLQl3bGNfcGh5X3VwZF9lbnZfdHhwd3JfcmF0ZV9saW1pdHMocGksIGJhbmQpOwotCi0JZm9yIChyYXRlID0gc3RhcnRfcmF0ZTsgcmF0ZSA8IG1heF9udW1fcmF0ZTsgcmF0ZSsrKSB7Ci0KLQkJdHhfcHdyX3RhcmdldFtyYXRlXSA9IHBpLT50eF91c2VyX3RhcmdldFtyYXRlXTsKLQotCQlpZiAocGktPnVzZXJfdHhwd3JfYXRfcmZwb3J0KSB7Ci0JCQl0eF9wd3JfdGFyZ2V0W3JhdGVdICs9Ci0JCQkgICAgd2xjX3VzZXJfdHhwd3JfYW50cG9ydF90b19yZnBvcnQocGksIHRhcmdldF9jaGFuLAotCQkJCQkJCSAgICAgYmFuZCwgcmF0ZSk7Ci0JCX0KLQotCQl7Ci0KLQkJCXdsY19waHlfdHhwb3dlcl9zcm9tbGltaXQoKHN0cnVjdCBicmNtc19waHlfcHViICopIHBpLAotCQkJCQkJICB0YXJnZXRfY2hhbiwKLQkJCQkJCSAgJm1pbnR4cHdyLCAmbWF4dHhwd3IsIHJhdGUpOwotCi0JCQltYXh0eHB3ciA9IG1pbihtYXh0eHB3ciwgcGktPnR4cHdyX2xpbWl0W3JhdGVdKTsKLQotCQkJbWF4dHhwd3IgPQotCQkJICAgIChtYXh0eHB3ciA+IHBhY3RybCkgPyAobWF4dHhwd3IgLSBwYWN0cmwpIDogMDsKLQotCQkJbWF4dHhwd3IgPSAobWF4dHhwd3IgPiA2KSA/IChtYXh0eHB3ciAtIDYpIDogMDsKLQotCQkJbWF4dHhwd3IgPSBtaW4obWF4dHhwd3IsIHR4X3B3cl90YXJnZXRbcmF0ZV0pOwotCi0JCQlpZiAocGktPnR4cHdyX3BlcmNlbnQgPD0gMTAwKQotCQkJCW1heHR4cHdyID0gKG1heHR4cHdyICogcGktPnR4cHdyX3BlcmNlbnQpIC8gMTAwOwotCi0JCQl0eF9wd3JfdGFyZ2V0W3JhdGVdID0gbWF4KG1heHR4cHdyLCBtaW50eHB3cik7Ci0JCX0KLQotCQl0eF9wd3JfdGFyZ2V0W3JhdGVdID0KLQkJICAgIG1pbih0eF9wd3JfdGFyZ2V0W3JhdGVdLCBwaS0+dHhwd3JfZW52X2xpbWl0W3JhdGVdKTsKLQotCQlpZiAodHhfcHdyX3RhcmdldFtyYXRlXSA+IHR4X3B3cl9tYXgpCi0JCQl0eF9wd3JfbWF4X3JhdGVfaW5kID0gcmF0ZTsKLQotCQl0eF9wd3JfbWF4ID0gbWF4KHR4X3B3cl9tYXgsIHR4X3B3cl90YXJnZXRbcmF0ZV0pOwotCQl0eF9wd3JfbWluID0gbWluKHR4X3B3cl9taW4sIHR4X3B3cl90YXJnZXRbcmF0ZV0pOwotCX0KLQotCW1lbXNldChwaS0+dHhfcG93ZXJfb2Zmc2V0LCAwLCBzaXplb2YocGktPnR4X3Bvd2VyX29mZnNldCkpOwotCXBpLT50eF9wb3dlcl9tYXggPSB0eF9wd3JfbWF4OwotCXBpLT50eF9wb3dlcl9taW4gPSB0eF9wd3JfbWluOwotCXBpLT50eF9wb3dlcl9tYXhfcmF0ZV9pbmQgPSB0eF9wd3JfbWF4X3JhdGVfaW5kOwotCWZvciAocmF0ZSA9IDA7IHJhdGUgPCBtYXhfbnVtX3JhdGU7IHJhdGUrKykgewotCi0JCXBpLT50eF9wb3dlcl90YXJnZXRbcmF0ZV0gPSB0eF9wd3JfdGFyZ2V0W3JhdGVdOwotCi0JCWlmICghcGktPmh3cHdyY3RybCB8fCBJU05QSFkocGkpKSB7Ci0JCQlwaS0+dHhfcG93ZXJfb2Zmc2V0W3JhdGVdID0KLQkJCSAgICBwaS0+dHhfcG93ZXJfbWF4IC0gcGktPnR4X3Bvd2VyX3RhcmdldFtyYXRlXTsKLQkJfSBlbHNlIHsKLQkJCXBpLT50eF9wb3dlcl9vZmZzZXRbcmF0ZV0gPQotCQkJICAgIHBpLT50eF9wb3dlcl90YXJnZXRbcmF0ZV0gLSBwaS0+dHhfcG93ZXJfbWluOwotCQl9Ci0JfQotCi0JdHhwd3JfcmVjYWxjX2ZuID0gcGktPnBpX2ZwdHIudHhwd3JyZWNhbGM7Ci0JaWYgKHR4cHdyX3JlY2FsY19mbikKLQkJKCp0eHB3cl9yZWNhbGNfZm4pIChwaSk7Ci19Ci0KLXZvaWQKLXdsY19waHlfdHhwb3dlcl9yZWdfbGltaXRfY2FsYyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgc3RydWN0IHR4cHdyX2xpbWl0cyAqdHhwd3IsCi0JCQkgICAgICAgY2hhbnNwZWNfdCBjaGFuc3BlYykKLXsKLQl1OCB0bXBfdHhwd3JfbGltaXRbMiAqIEJSQ01TX05VTV9SQVRFU19PRkRNXTsKLQl1OCAqdHhwd3JfcHRyMSA9IE5VTEwsICp0eHB3cl9wdHIyID0gTlVMTDsKLQlpbnQgcmF0ZV9zdGFydF9pbmRleCA9IDAsIHJhdGUxLCByYXRlMiwgazsKLQotCWZvciAocmF0ZTEgPSBXTF9UWF9QT1dFUl9DQ0tfRklSU1QsIHJhdGUyID0gMDsKLQkgICAgIHJhdGUyIDwgV0xfVFhfUE9XRVJfQ0NLX05VTTsgcmF0ZTErKywgcmF0ZTIrKykKLQkJcGktPnR4cHdyX2xpbWl0W3JhdGUxXSA9IHR4cHdyLT5jY2tbcmF0ZTJdOwotCi0JZm9yIChyYXRlMSA9IFdMX1RYX1BPV0VSX09GRE1fRklSU1QsIHJhdGUyID0gMDsKLQkgICAgIHJhdGUyIDwgV0xfVFhfUE9XRVJfT0ZETV9OVU07IHJhdGUxKyssIHJhdGUyKyspCi0JCXBpLT50eHB3cl9saW1pdFtyYXRlMV0gPSB0eHB3ci0+b2ZkbVtyYXRlMl07Ci0KLQlpZiAoSVNOUEhZKHBpKSkgewotCi0JCWZvciAoayA9IDA7IGsgPCA0OyBrKyspIHsKLQkJCXN3aXRjaCAoaykgewotCQkJY2FzZSAwOgotCi0JCQkJdHhwd3JfcHRyMSA9IHR4cHdyLT5tY3NfMjBfc2lzbzsKLQkJCQl0eHB3cl9wdHIyID0gdHhwd3ItPm9mZG07Ci0JCQkJcmF0ZV9zdGFydF9pbmRleCA9IFdMX1RYX1BPV0VSX09GRE1fRklSU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6Ci0KLQkJCQl0eHB3cl9wdHIxID0gdHhwd3ItPm1jc18yMF9jZGQ7Ci0JCQkJdHhwd3JfcHRyMiA9IHR4cHdyLT5vZmRtX2NkZDsKLQkJCQlyYXRlX3N0YXJ0X2luZGV4ID0gV0xfVFhfUE9XRVJfT0ZETTIwX0NERF9GSVJTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQotCQkJCXR4cHdyX3B0cjEgPSB0eHB3ci0+bWNzXzQwX3Npc287Ci0JCQkJdHhwd3JfcHRyMiA9IHR4cHdyLT5vZmRtXzQwX3Npc287Ci0JCQkJcmF0ZV9zdGFydF9pbmRleCA9Ci0JCQkJICAgIFdMX1RYX1BPV0VSX09GRE00MF9TSVNPX0ZJUlNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzOgotCi0JCQkJdHhwd3JfcHRyMSA9IHR4cHdyLT5tY3NfNDBfY2RkOwotCQkJCXR4cHdyX3B0cjIgPSB0eHB3ci0+b2ZkbV80MF9jZGQ7Ci0JCQkJcmF0ZV9zdGFydF9pbmRleCA9IFdMX1RYX1BPV0VSX09GRE00MF9DRERfRklSU1Q7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWZvciAocmF0ZTIgPSAwOyByYXRlMiA8IEJSQ01TX05VTV9SQVRFU19PRkRNOyByYXRlMisrKSB7Ci0JCQkJdG1wX3R4cHdyX2xpbWl0W3JhdGUyXSA9IDA7Ci0JCQkJdG1wX3R4cHdyX2xpbWl0W0JSQ01TX05VTV9SQVRFU19PRkRNICsgcmF0ZTJdID0KLQkJCQkgICAgdHhwd3JfcHRyMVtyYXRlMl07Ci0JCQl9Ci0JCQl3bGNfcGh5X21jc190b19vZmRtX3Bvd2Vyc19ucGh5KHRtcF90eHB3cl9saW1pdCwgMCwKLQkJCQlCUkNNU19OVU1fUkFURVNfT0ZETSAtIDEsIEJSQ01TX05VTV9SQVRFU19PRkRNKTsKLQkJCWZvciAocmF0ZTEgPSByYXRlX3N0YXJ0X2luZGV4LCByYXRlMiA9IDA7Ci0JCQkgICAgIHJhdGUyIDwgQlJDTVNfTlVNX1JBVEVTX09GRE07IHJhdGUxKyssIHJhdGUyKyspCi0JCQkJcGktPnR4cHdyX2xpbWl0W3JhdGUxXSA9Ci0JCQkJICAgIG1pbih0eHB3cl9wdHIyW3JhdGUyXSwKLQkJCQkJdG1wX3R4cHdyX2xpbWl0W3JhdGUyXSk7Ci0JCX0KLQotCQlmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSB7Ci0JCQlzd2l0Y2ggKGspIHsKLQkJCWNhc2UgMDoKLQotCQkJCXR4cHdyX3B0cjEgPSB0eHB3ci0+b2ZkbTsKLQkJCQl0eHB3cl9wdHIyID0gdHhwd3ItPm1jc18yMF9zaXNvOwotCQkJCXJhdGVfc3RhcnRfaW5kZXggPSBXTF9UWF9QT1dFUl9NQ1MyMF9TSVNPX0ZJUlNUOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCi0JCQkJdHhwd3JfcHRyMSA9IHR4cHdyLT5vZmRtX2NkZDsKLQkJCQl0eHB3cl9wdHIyID0gdHhwd3ItPm1jc18yMF9jZGQ7Ci0JCQkJcmF0ZV9zdGFydF9pbmRleCA9IFdMX1RYX1BPV0VSX01DUzIwX0NERF9GSVJTVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQotCQkJCXR4cHdyX3B0cjEgPSB0eHB3ci0+b2ZkbV80MF9zaXNvOwotCQkJCXR4cHdyX3B0cjIgPSB0eHB3ci0+bWNzXzQwX3Npc287Ci0JCQkJcmF0ZV9zdGFydF9pbmRleCA9IFdMX1RYX1BPV0VSX01DUzQwX1NJU09fRklSU1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDM6Ci0KLQkJCQl0eHB3cl9wdHIxID0gdHhwd3ItPm9mZG1fNDBfY2RkOwotCQkJCXR4cHdyX3B0cjIgPSB0eHB3ci0+bWNzXzQwX2NkZDsKLQkJCQlyYXRlX3N0YXJ0X2luZGV4ID0gV0xfVFhfUE9XRVJfTUNTNDBfQ0REX0ZJUlNUOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZm9yIChyYXRlMiA9IDA7IHJhdGUyIDwgQlJDTVNfTlVNX1JBVEVTX09GRE07IHJhdGUyKyspIHsKLQkJCQl0bXBfdHhwd3JfbGltaXRbcmF0ZTJdID0gMDsKLQkJCQl0bXBfdHhwd3JfbGltaXRbQlJDTVNfTlVNX1JBVEVTX09GRE0gKyByYXRlMl0gPQotCQkJCSAgICB0eHB3cl9wdHIxW3JhdGUyXTsKLQkJCX0KLQkJCXdsY19waHlfb2ZkbV90b19tY3NfcG93ZXJzX25waHkodG1wX3R4cHdyX2xpbWl0LCAwLAotCQkJCUJSQ01TX05VTV9SQVRFU19PRkRNIC0gMSwgQlJDTVNfTlVNX1JBVEVTX09GRE0pOwotCQkJZm9yIChyYXRlMSA9IHJhdGVfc3RhcnRfaW5kZXgsIHJhdGUyID0gMDsKLQkJCSAgICAgcmF0ZTIgPCBCUkNNU19OVU1fUkFURVNfTUNTXzFfU1RSRUFNOwotCQkJICAgICByYXRlMSsrLCByYXRlMisrKQotCQkJCXBpLT50eHB3cl9saW1pdFtyYXRlMV0gPQotCQkJCSAgICBtaW4odHhwd3JfcHRyMltyYXRlMl0sCi0JCQkJCXRtcF90eHB3cl9saW1pdFtyYXRlMl0pOwotCQl9Ci0KLQkJZm9yIChrID0gMDsgayA8IDI7IGsrKykgewotCQkJc3dpdGNoIChrKSB7Ci0JCQljYXNlIDA6Ci0KLQkJCQlyYXRlX3N0YXJ0X2luZGV4ID0gV0xfVFhfUE9XRVJfTUNTMjBfU1RCQ19GSVJTVDsKLQkJCQl0eHB3cl9wdHIxID0gdHhwd3ItPm1jc18yMF9zdGJjOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxOgotCi0JCQkJcmF0ZV9zdGFydF9pbmRleCA9IFdMX1RYX1BPV0VSX01DUzQwX1NUQkNfRklSU1Q7Ci0JCQkJdHhwd3JfcHRyMSA9IHR4cHdyLT5tY3NfNDBfc3RiYzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWZvciAocmF0ZTEgPSByYXRlX3N0YXJ0X2luZGV4LCByYXRlMiA9IDA7Ci0JCQkgICAgIHJhdGUyIDwgQlJDTVNfTlVNX1JBVEVTX01DU18xX1NUUkVBTTsKLQkJCSAgICAgcmF0ZTErKywgcmF0ZTIrKykKLQkJCQlwaS0+dHhwd3JfbGltaXRbcmF0ZTFdID0gdHhwd3JfcHRyMVtyYXRlMl07Ci0JCX0KLQotCQlmb3IgKGsgPSAwOyBrIDwgMjsgaysrKSB7Ci0JCQlzd2l0Y2ggKGspIHsKLQkJCWNhc2UgMDoKLQotCQkJCXJhdGVfc3RhcnRfaW5kZXggPSBXTF9UWF9QT1dFUl9NQ1MyMF9TRE1fRklSU1Q7Ci0JCQkJdHhwd3JfcHRyMSA9IHR4cHdyLT5tY3NfMjBfbWltbzsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQotCQkJCXJhdGVfc3RhcnRfaW5kZXggPSBXTF9UWF9QT1dFUl9NQ1M0MF9TRE1fRklSU1Q7Ci0JCQkJdHhwd3JfcHRyMSA9IHR4cHdyLT5tY3NfNDBfbWltbzsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWZvciAocmF0ZTEgPSByYXRlX3N0YXJ0X2luZGV4LCByYXRlMiA9IDA7Ci0JCQkgICAgIHJhdGUyIDwgQlJDTVNfTlVNX1JBVEVTX01DU18yX1NUUkVBTTsKLQkJCSAgICAgcmF0ZTErKywgcmF0ZTIrKykKLQkJCQlwaS0+dHhwd3JfbGltaXRbcmF0ZTFdID0gdHhwd3JfcHRyMVtyYXRlMl07Ci0JCX0KLQotCQlwaS0+dHhwd3JfbGltaXRbV0xfVFhfUE9XRVJfTUNTXzMyXSA9IHR4cHdyLT5tY3MzMjsKLQotCQlwaS0+dHhwd3JfbGltaXRbV0xfVFhfUE9XRVJfTUNTNDBfQ0REX0ZJUlNUXSA9Ci0JCSAgICBtaW4ocGktPnR4cHdyX2xpbWl0W1dMX1RYX1BPV0VSX01DUzQwX0NERF9GSVJTVF0sCi0JCQlwaS0+dHhwd3JfbGltaXRbV0xfVFhfUE9XRVJfTUNTXzMyXSk7Ci0JCXBpLT50eHB3cl9saW1pdFtXTF9UWF9QT1dFUl9NQ1NfMzJdID0KLQkJICAgIHBpLT50eHB3cl9saW1pdFtXTF9UWF9QT1dFUl9NQ1M0MF9DRERfRklSU1RdOwotCX0KLX0KLQotdm9pZCB3bGNfcGh5X3R4cHdyX3BlcmNlbnRfc2V0KHN0cnVjdCBicmNtc19waHlfcHViICpwcGksIHU4IHR4cHdyX3BlcmNlbnQpCi17Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwcGk7Ci0KLQlwaS0+dHhwd3JfcGVyY2VudCA9IHR4cHdyX3BlcmNlbnQ7Ci19Ci0KLXZvaWQgd2xjX3BoeV9tYWNod2NhcF9zZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwgdTMyIG1hY2h3Y2FwKQotewotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcHBpOwotCi0JcGktPnNoLT5tYWNod2NhcCA9IG1hY2h3Y2FwOwotfQotCi12b2lkIHdsY19waHlfcnVuYmlzdF9jb25maWcoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwgYm9vbCBzdGFydF9lbmQpCi17Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwcGk7Ci0JdTE2IHJ4YzsKLQlyeGMgPSAwOwotCi0JaWYgKHN0YXJ0X2VuZCA9PSBPTikgewotCQlpZiAoIUlTTlBIWShwaSkpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKE5SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDMpCi0JCSAgICB8fCBOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCA0KSkgewotCQkJV19SRUcoJnBpLT5yZWdzLT5waHlyZWdhZGRyLCAweGEwKTsKLQkJCSh2b2lkKVJfUkVHKCZwaS0+cmVncy0+cGh5cmVnYWRkcik7Ci0JCQlyeGMgPSBSX1JFRygmcGktPnJlZ3MtPnBoeXJlZ2RhdGEpOwotCQkJV19SRUcoJnBpLT5yZWdzLT5waHlyZWdkYXRhLAotCQkJICAgICAgKDB4MSA8PCAxNSkgfCByeGMpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKE5SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDMpCi0JCSAgICB8fCBOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCA0KSkgewotCQkJV19SRUcoJnBpLT5yZWdzLT5waHlyZWdhZGRyLCAweGEwKTsKLQkJCSh2b2lkKVJfUkVHKCZwaS0+cmVncy0+cGh5cmVnYWRkcik7Ci0JCQlXX1JFRygmcGktPnJlZ3MtPnBoeXJlZ2RhdGEsIHJ4Yyk7Ci0JCX0KLQotCQl3bGNfcGh5X3Bvcl9pbmZvcm0ocHBpKTsKLQl9Ci19Ci0KLXZvaWQKLXdsY19waHlfdHhwb3dlcl9saW1pdF9zZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwgc3RydWN0IHR4cHdyX2xpbWl0cyAqdHhwd3IsCi0JCQkgIGNoYW5zcGVjX3QgY2hhbnNwZWMpCi17Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwcGk7Ci0KLQl3bGNfcGh5X3R4cG93ZXJfcmVnX2xpbWl0X2NhbGMocGksIHR4cHdyLCBjaGFuc3BlYyk7Ci0KLQlpZiAoSVNMQ05QSFkocGkpKSB7Ci0JCWludCBpLCBqOwotCQlmb3IgKGkgPSBUWFBfRklSU1RfT0ZETV8yMF9DREQsIGogPSAwOwotCQkgICAgIGogPCBCUkNNU19OVU1fUkFURVNfTUNTXzFfU1RSRUFNOyBpKyssIGorKykgewotCQkJaWYgKHR4cHdyLT5tY3NfMjBfc2lzb1tqXSkKLQkJCQlwaS0+dHhwd3JfbGltaXRbaV0gPSB0eHB3ci0+bWNzXzIwX3Npc29bal07Ci0JCQllbHNlCi0JCQkJcGktPnR4cHdyX2xpbWl0W2ldID0gdHhwd3ItPm9mZG1bal07Ci0JCX0KLQl9Ci0KLQl3bGFwaV9zdXNwZW5kX21hY19hbmRfd2FpdChwaS0+c2gtPnBoeXNoaW0pOwotCi0Jd2xjX3BoeV90eHBvd2VyX3JlY2FsY190YXJnZXQocGkpOwotCXdsY19waHlfY2FsX3R4cG93ZXJfcmVjYWxjX3N3KHBpKTsKLQl3bGFwaV9lbmFibGVfbWFjKHBpLT5zaC0+cGh5c2hpbSk7Ci19Ci0KLXZvaWQgd2xjX3BoeV9vZmRtX3JhdGVzZXRfd2FyKHN0cnVjdCBicmNtc19waHlfcHViICpwaWgsIGJvb2wgd2FyKQotewotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcGloOwotCi0JcGktPm9mZG1fcmF0ZXNldF93YXIgPSB3YXI7Ci19Ci0KLXZvaWQgd2xjX3BoeV9iZl9wcmVlbXB0X2VuYWJsZShzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcGloLCBib29sIGJmX3ByZWVtcHQpCi17Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwaWg7Ci0KLQlwaS0+YmZfcHJlZW1wdF80MzA2ID0gYmZfcHJlZW1wdDsKLX0KLQotdm9pZCB3bGNfcGh5X3R4cG93ZXJfdXBkYXRlX3NobShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQlpbnQgajsKLQlpZiAoSVNOUEhZKHBpKSkgewotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCFwaS0+c2gtPmNsaykKLQkJcmV0dXJuOwotCi0JaWYgKHBpLT5od3B3cmN0cmwpIHsKLQkJdTE2IG9mZnNldDsKLQotCQl3bGFwaV9ibWFjX3dyaXRlX3NobShwaS0+c2gtPnBoeXNoaW0sIE1fVFhQV1JfTUFYLCA2Myk7Ci0JCXdsYXBpX2JtYWNfd3JpdGVfc2htKHBpLT5zaC0+cGh5c2hpbSwgTV9UWFBXUl9OLAotCQkJCSAgICAgMSA8PCBOVU1fVFNTSV9GUkFNRVMpOwotCi0JCXdsYXBpX2JtYWNfd3JpdGVfc2htKHBpLT5zaC0+cGh5c2hpbSwgTV9UWFBXUl9UQVJHRVQsCi0JCQkJICAgICBwaS0+dHhfcG93ZXJfbWluIDw8IE5VTV9UU1NJX0ZSQU1FUyk7Ci0KLQkJd2xhcGlfYm1hY193cml0ZV9zaG0ocGktPnNoLT5waHlzaGltLCBNX1RYUFdSX0NVUiwKLQkJCQkgICAgIHBpLT5od3B3cl90eGN1cik7Ci0KLQkJZm9yIChqID0gVFhQX0ZJUlNUX09GRE07IGogPD0gVFhQX0xBU1RfT0ZETTsgaisrKSB7Ci0JCQljb25zdCB1OCB1Y29kZV9vZmRtX3JhdGVzW10gPSB7Ci0JCQkJMHgwYywgMHgxMiwgMHgxOCwgMHgyNCwgMHgzMCwgMHg0OCwgMHg2MCwgMHg2YwotCQkJfTsKLQkJCW9mZnNldCA9IHdsYXBpX2JtYWNfcmF0ZV9zaG1fb2Zmc2V0KHBpLT5zaC0+cGh5c2hpbSwKLQkJCQkJCQkgICAgdWNvZGVfb2ZkbV9yYXRlc1tqIC0KLQkJCQkJCQkJCSAgICAgVFhQX0ZJUlNUX09GRE1dKTsKLQkJCXdsYXBpX2JtYWNfd3JpdGVfc2htKHBpLT5zaC0+cGh5c2hpbSwgb2Zmc2V0ICsgNiwKLQkJCQkJICAgICBwaS0+dHhfcG93ZXJfb2Zmc2V0W2pdKTsKLQkJCXdsYXBpX2JtYWNfd3JpdGVfc2htKHBpLT5zaC0+cGh5c2hpbSwgb2Zmc2V0ICsgMTQsCi0JCQkJCSAgICAgLShwaS0+dHhfcG93ZXJfb2Zmc2V0W2pdIC8gMikpOwotCQl9Ci0KLQkJd2xhcGlfYm1hY19taGYocGktPnNoLT5waHlzaGltLCBNSEYyLCBNSEYyX0hXUFdSQ1RMLAotCQkJICAgICAgIE1IRjJfSFdQV1JDVEwsIEJSQ01fQkFORF9BTEwpOwotCX0gZWxzZSB7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IFRYUF9GSVJTVF9PRkRNOyBpIDw9IFRYUF9MQVNUX09GRE07IGkrKykKLQkJCXBpLT50eF9wb3dlcl9vZmZzZXRbaV0gPQotCQkJICAgICh1OCkgcm91bmR1cChwaS0+dHhfcG93ZXJfb2Zmc2V0W2ldLCA4KTsKLQkJd2xhcGlfYm1hY193cml0ZV9zaG0ocGktPnNoLT5waHlzaGltLCBNX09GRE1fT0ZGU0VULAotCQkJCSAgICAgKHUxNikgKChwaS0+Ci0JCQkJCQl0eF9wb3dlcl9vZmZzZXRbVFhQX0ZJUlNUX09GRE1dCi0JCQkJCQkrIDcpID4+IDMpKTsKLQl9Ci19Ci0KLWJvb2wgd2xjX3BoeV90eHBvd2VyX2h3X2N0cmxfZ2V0KHN0cnVjdCBicmNtc19waHlfcHViICpwcGkpCi17Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwcGk7Ci0KLQlpZiAoSVNOUEhZKHBpKSkgewotCQlyZXR1cm4gcGktPm5waHlfdHhwd3JjdHJsOwotCX0gZWxzZSB7Ci0JCXJldHVybiBwaS0+aHdwd3JjdHJsOwotCX0KLX0KLQotdm9pZCB3bGNfcGh5X3R4cG93ZXJfaHdfY3RybF9zZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwgYm9vbCBod3B3cmN0cmwpCi17Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwcGk7Ci0JYm9vbCBjdXJfaHdwd3JjdHJsID0gcGktPmh3cHdyY3RybDsKLQlib29sIHN1c3BlbmQ7Ci0KLQlpZiAoIXBpLT5od3B3cmN0cmxfY2FwYWJsZSkgewotCQlyZXR1cm47Ci0JfQotCi0JcGktPmh3cHdyY3RybCA9IGh3cHdyY3RybDsKLQlwaS0+bnBoeV90eHB3cmN0cmwgPSBod3B3cmN0cmw7Ci0JcGktPnR4cHdyY3RybCA9IGh3cHdyY3RybDsKLQotCWlmIChJU05QSFkocGkpKSB7Ci0JCXN1c3BlbmQgPQotCQkgICAgKDAgPT0KLQkJICAgICAoUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKSAmIE1DVExfRU5fTUFDKSk7Ci0JCWlmICghc3VzcGVuZCkKLQkJCXdsYXBpX3N1c3BlbmRfbWFjX2FuZF93YWl0KHBpLT5zaC0+cGh5c2hpbSk7Ci0KLQkJd2xjX3BoeV90eHB3cmN0cmxfZW5hYmxlX25waHkocGksIHBpLT5ucGh5X3R4cHdyY3RybCk7Ci0JCWlmIChwaS0+bnBoeV90eHB3cmN0cmwgPT0gUEhZX1RQQ19IV19PRkYpIHsKLQkJCXdsY19waHlfdHhwd3JfZml4cG93ZXJfbnBoeShwaSk7Ci0JCX0gZWxzZSB7Ci0KLQkJCW1vZF9waHlfcmVnKHBpLCAweDFlNywgKDB4N2YgPDwgMCksCi0JCQkJICAgIHBpLT5zYXZlZF90eHB3cl9pZHgpOwotCQl9Ci0KLQkJaWYgKCFzdXNwZW5kKQotCQkJd2xhcGlfZW5hYmxlX21hYyhwaS0+c2gtPnBoeXNoaW0pOwotCX0gZWxzZSBpZiAoaHdwd3JjdHJsICE9IGN1cl9od3B3cmN0cmwpIHsKLQotCQlyZXR1cm47Ci0JfQotfQotCi12b2lkIHdsY19waHlfdHhwb3dlcl9pcGFfdXBkKHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0JCXBpLT5pcGEyZ19vbiA9IChwaS0+c3JvbV9mZW0yZy5leHRwYWdhaW4gPT0gMik7Ci0JCXBpLT5pcGE1Z19vbiA9IChwaS0+c3JvbV9mZW01Zy5leHRwYWdhaW4gPT0gMik7Ci0JfSBlbHNlIHsKLQkJcGktPmlwYTJnX29uID0gZmFsc2U7Ci0JCXBpLT5pcGE1Z19vbiA9IGZhbHNlOwotCX0KLX0KLQotc3RhdGljIHUzMiB3bGNfcGh5X3R4cG93ZXJfZXN0X3Bvd2VyX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotCi1zdGF0aWMgdTMyIHdsY19waHlfdHhwb3dlcl9lc3RfcG93ZXJfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQlzMTYgdHgwX3N0YXR1cywgdHgxX3N0YXR1czsKLQl1MTYgZXN0UG93ZXIxLCBlc3RQb3dlcjI7Ci0JdTggcHdyMCwgcHdyMSwgYWRqX3B3cjAsIGFkal9wd3IxOwotCXUzMiBlc3RfcHdyOwotCi0JZXN0UG93ZXIxID0gcmVhZF9waHlfcmVnKHBpLCAweDExOCk7Ci0JZXN0UG93ZXIyID0gcmVhZF9waHlfcmVnKHBpLCAweDExOSk7Ci0KLQlpZiAoKGVzdFBvd2VyMSAmICgweDEgPDwgOCkpCi0JICAgID09ICgweDEgPDwgOCkpIHsKLQkJcHdyMCA9ICh1OCkgKGVzdFBvd2VyMSAmICgweGZmIDw8IDApKQotCQkgICAgPj4gMDsKLQl9IGVsc2UgewotCQlwd3IwID0gMHg4MDsKLQl9Ci0KLQlpZiAoKGVzdFBvd2VyMiAmICgweDEgPDwgOCkpCi0JICAgID09ICgweDEgPDwgOCkpIHsKLQkJcHdyMSA9ICh1OCkgKGVzdFBvd2VyMiAmICgweGZmIDw8IDApKQotCQkgICAgPj4gMDsKLQl9IGVsc2UgewotCQlwd3IxID0gMHg4MDsKLQl9Ci0KLQl0eDBfc3RhdHVzID0gcmVhZF9waHlfcmVnKHBpLCAweDFlZCk7Ci0JdHgxX3N0YXR1cyA9IHJlYWRfcGh5X3JlZyhwaSwgMHgxZWUpOwotCi0JaWYgKCh0eDBfc3RhdHVzICYgKDB4MSA8PCAxNSkpCi0JICAgID09ICgweDEgPDwgMTUpKSB7Ci0JCWFkal9wd3IwID0gKHU4KSAodHgwX3N0YXR1cyAmICgweGZmIDw8IDApKQotCQkgICAgPj4gMDsKLQl9IGVsc2UgewotCQlhZGpfcHdyMCA9IDB4ODA7Ci0JfQotCWlmICgodHgxX3N0YXR1cyAmICgweDEgPDwgMTUpKQotCSAgICA9PSAoMHgxIDw8IDE1KSkgewotCQlhZGpfcHdyMSA9ICh1OCkgKHR4MV9zdGF0dXMgJiAoMHhmZiA8PCAwKSkKLQkJICAgID4+IDA7Ci0JfSBlbHNlIHsKLQkJYWRqX3B3cjEgPSAweDgwOwotCX0KLQotCWVzdF9wd3IgPQotCSAgICAodTMyKSAoKHB3cjAgPDwgMjQpIHwgKHB3cjEgPDwgMTYpIHwgKGFkal9wd3IwIDw8IDgpIHwgYWRqX3B3cjEpOwotCXJldHVybiBlc3RfcHdyOwotfQotCi12b2lkCi13bGNfcGh5X3R4cG93ZXJfZ2V0X2N1cnJlbnQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwgc3RydWN0IHR4X3Bvd2VyICpwb3dlciwKLQkJCSAgICB1aW50IGNoYW5uZWwpCi17Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwcGk7Ci0JdWludCByYXRlLCBudW1fcmF0ZXM7Ci0JdTggbWluX3B3ciwgbWF4X3B3cjsKLQotI2lmIFdMX1RYX1BPV0VSX1JBVEVTICE9IFRYUF9OVU1fUkFURVMKLSNlcnJvciAic3RydWN0IHR4X3Bvd2VyIG91dCBvZiBzeW5jIHdpdGggdGhpcyBmbiIKLSNlbmRpZgotCi0JaWYgKElTTlBIWShwaSkpIHsKLQkJcG93ZXItPnJmX2NvcmVzID0gMjsKLQkJcG93ZXItPmZsYWdzIHw9IChXTF9UWF9QT1dFUl9GX01JTU8pOwotCQlpZiAocGktPm5waHlfdHhwd3JjdHJsID09IFBIWV9UUENfSFdfT04pCi0JCQlwb3dlci0+ZmxhZ3MgfD0KLQkJCSAgICAoV0xfVFhfUE9XRVJfRl9FTkFCTEVEIHwgV0xfVFhfUE9XRVJfRl9IVyk7Ci0JfSBlbHNlIGlmIChJU0xDTlBIWShwaSkpIHsKLQkJcG93ZXItPnJmX2NvcmVzID0gMTsKLQkJcG93ZXItPmZsYWdzIHw9IChXTF9UWF9QT1dFUl9GX1NJU08pOwotCQlpZiAocGktPnJhZGlvcHdyX292ZXJyaWRlID09IFJBRElPUFdSX09WRVJSSURFX0RFRikKLQkJCXBvd2VyLT5mbGFncyB8PSBXTF9UWF9QT1dFUl9GX0VOQUJMRUQ7Ci0JCWlmIChwaS0+aHdwd3JjdHJsKQotCQkJcG93ZXItPmZsYWdzIHw9IFdMX1RYX1BPV0VSX0ZfSFc7Ci0JfQotCi0JbnVtX3JhdGVzID0gKChJU05QSFkocGkpKSA/IChUWFBfTlVNX1JBVEVTKSA6Ci0JCSAgICAgKChJU0xDTlBIWShwaSkpID8KLQkJICAgICAgKFRYUF9MQVNUX09GRE1fMjBfQ0REICsgMSkgOiAoVFhQX0xBU1RfT0ZETSArIDEpKSk7Ci0KLQlmb3IgKHJhdGUgPSAwOyByYXRlIDwgbnVtX3JhdGVzOyByYXRlKyspIHsKLQkJcG93ZXItPnVzZXJfbGltaXRbcmF0ZV0gPSBwaS0+dHhfdXNlcl90YXJnZXRbcmF0ZV07Ci0JCXdsY19waHlfdHhwb3dlcl9zcm9tbGltaXQocHBpLCBjaGFubmVsLCAmbWluX3B3ciwgJm1heF9wd3IsCi0JCQkJCSAgcmF0ZSk7Ci0JCXBvd2VyLT5ib2FyZF9saW1pdFtyYXRlXSA9ICh1OCkgbWF4X3B3cjsKLQkJcG93ZXItPnRhcmdldFtyYXRlXSA9IHBpLT50eF9wb3dlcl90YXJnZXRbcmF0ZV07Ci0JfQotCi0JaWYgKElTTlBIWShwaSkpIHsKLQkJdTMyIGVzdF9wb3V0OwotCi0JCXdsYXBpX3N1c3BlbmRfbWFjX2FuZF93YWl0KHBpLT5zaC0+cGh5c2hpbSk7Ci0JCXdsY19waHlyZWdfZW50ZXIoKHN0cnVjdCBicmNtc19waHlfcHViICopIHBpKTsKLQkJZXN0X3BvdXQgPSB3bGNfcGh5X3R4cG93ZXJfZXN0X3Bvd2VyX25waHkocGkpOwotCQl3bGNfcGh5cmVnX2V4aXQoKHN0cnVjdCBicmNtc19waHlfcHViICopIHBpKTsKLQkJd2xhcGlfZW5hYmxlX21hYyhwaS0+c2gtPnBoeXNoaW0pOwotCi0JCXBvd2VyLT5lc3RfUG91dFswXSA9IChlc3RfcG91dCA+PiA4KSAmIDB4ZmY7Ci0JCXBvd2VyLT5lc3RfUG91dFsxXSA9IGVzdF9wb3V0ICYgMHhmZjsKLQotCQlwb3dlci0+ZXN0X1BvdXRfYWN0WzBdID0gZXN0X3BvdXQgPj4gMjQ7Ci0JCXBvd2VyLT5lc3RfUG91dF9hY3RbMV0gPSAoZXN0X3BvdXQgPj4gMTYpICYgMHhmZjsKLQotCQlpZiAocG93ZXItPmVzdF9Qb3V0WzBdID09IDB4ODApCi0JCQlwb3dlci0+ZXN0X1BvdXRbMF0gPSAwOwotCQlpZiAocG93ZXItPmVzdF9Qb3V0WzFdID09IDB4ODApCi0JCQlwb3dlci0+ZXN0X1BvdXRbMV0gPSAwOwotCi0JCWlmIChwb3dlci0+ZXN0X1BvdXRfYWN0WzBdID09IDB4ODApCi0JCQlwb3dlci0+ZXN0X1BvdXRfYWN0WzBdID0gMDsKLQkJaWYgKHBvd2VyLT5lc3RfUG91dF9hY3RbMV0gPT0gMHg4MCkKLQkJCXBvd2VyLT5lc3RfUG91dF9hY3RbMV0gPSAwOwotCi0JCXBvd2VyLT5lc3RfUG91dF9jY2sgPSAwOwotCi0JCXBvd2VyLT50eF9wb3dlcl9tYXhbMF0gPSBwaS0+dHhfcG93ZXJfbWF4OwotCQlwb3dlci0+dHhfcG93ZXJfbWF4WzFdID0gcGktPnR4X3Bvd2VyX21heDsKLQotCQlwb3dlci0+dHhfcG93ZXJfbWF4X3JhdGVfaW5kWzBdID0gcGktPnR4X3Bvd2VyX21heF9yYXRlX2luZDsKLQkJcG93ZXItPnR4X3Bvd2VyX21heF9yYXRlX2luZFsxXSA9IHBpLT50eF9wb3dlcl9tYXhfcmF0ZV9pbmQ7Ci0JfSBlbHNlIGlmIChwaS0+aHdwd3JjdHJsICYmIHBpLT5zaC0+dXApIHsKLQotCQl3bGNfcGh5cmVnX2VudGVyKHBwaSk7Ci0JCWlmIChJU0xDTlBIWShwaSkpIHsKLQotCQkJcG93ZXItPnR4X3Bvd2VyX21heFswXSA9IHBpLT50eF9wb3dlcl9tYXg7Ci0JCQlwb3dlci0+dHhfcG93ZXJfbWF4WzFdID0gcGktPnR4X3Bvd2VyX21heDsKLQotCQkJcG93ZXItPnR4X3Bvd2VyX21heF9yYXRlX2luZFswXSA9Ci0JCQkgICAgcGktPnR4X3Bvd2VyX21heF9yYXRlX2luZDsKLQkJCXBvd2VyLT50eF9wb3dlcl9tYXhfcmF0ZV9pbmRbMV0gPQotCQkJICAgIHBpLT50eF9wb3dlcl9tYXhfcmF0ZV9pbmQ7Ci0KLQkJCWlmICh3bGNfcGh5X3RwY19pc2VuYWJsZWRfbGNucGh5KHBpKSkKLQkJCQlwb3dlci0+ZmxhZ3MgfD0KLQkJCQkgICAgKFdMX1RYX1BPV0VSX0ZfSFcgfCBXTF9UWF9QT1dFUl9GX0VOQUJMRUQpOwotCQkJZWxzZQotCQkJCXBvd2VyLT5mbGFncyAmPQotCQkJCSAgICB+KFdMX1RYX1BPV0VSX0ZfSFcgfCBXTF9UWF9QT1dFUl9GX0VOQUJMRUQpOwotCi0JCQl3bGNfbGNucGh5X2dldF90c3NpKHBpLCAoczggKikgJnBvd2VyLT5lc3RfUG91dFswXSwKLQkJCQkJICAgIChzOCAqKSAmcG93ZXItPmVzdF9Qb3V0X2Njayk7Ci0JCX0KLQkJd2xjX3BoeXJlZ19leGl0KHBwaSk7Ci0JfQotfQotCi12b2lkIHdsY19waHlfYW50c2VsX3R5cGVfc2V0KHN0cnVjdCBicmNtc19waHlfcHViICpwcGksIHU4IGFudHNlbF90eXBlKQotewotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcHBpOwotCi0JcGktPmFudHNlbF90eXBlID0gYW50c2VsX3R5cGU7Ci19Ci0KLWJvb2wgd2xjX3BoeV90ZXN0X2lzb24oc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSkKLXsKLQlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBwaTsKLQotCXJldHVybiBwaS0+cGh5dGVzdF9vbjsKLX0KLQotdm9pZCB3bGNfcGh5X2FudF9yeGRpdl9zZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwgdTggdmFsKQotewotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcHBpOwotCWJvb2wgc3VzcGVuZDsKLQotCXBpLT5zaC0+cnhfYW50ZGl2ID0gdmFsOwotCi0JaWYgKCEoSVNOUEhZKHBpKSAmJiBEMTFSRVZfSVMocGktPnNoLT5jb3JlcmV2LCAxNikpKSB7Ci0JCWlmICh2YWwgPiBBTlRfUlhfRElWX0ZPUkNFXzEpCi0JCQl3bGFwaV9ibWFjX21oZihwaS0+c2gtPnBoeXNoaW0sIE1IRjEsIE1IRjFfQU5URElWLAotCQkJCSAgICAgICBNSEYxX0FOVERJViwgQlJDTV9CQU5EX0FMTCk7Ci0JCWVsc2UKLQkJCXdsYXBpX2JtYWNfbWhmKHBpLT5zaC0+cGh5c2hpbSwgTUhGMSwgTUhGMV9BTlRESVYsIDAsCi0JCQkJICAgICAgIEJSQ01fQkFORF9BTEwpOwotCX0KLQotCWlmIChJU05QSFkocGkpKSB7Ci0KLQkJcmV0dXJuOwotCX0KLQotCWlmICghcGktPnNoLT5jbGspCi0JCXJldHVybjsKLQotCXN1c3BlbmQgPQotCSAgICAoMCA9PSAoUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKSAmIE1DVExfRU5fTUFDKSk7Ci0JaWYgKCFzdXNwZW5kKQotCQl3bGFwaV9zdXNwZW5kX21hY19hbmRfd2FpdChwaS0+c2gtPnBoeXNoaW0pOwotCi0JaWYgKElTTENOUEhZKHBpKSkgewotCQlpZiAodmFsID4gQU5UX1JYX0RJVl9GT1JDRV8xKSB7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHg0MTAsICgweDEgPDwgMSksIDB4MDEgPDwgMSk7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHg0MTAsCi0JCQkJICAgICgweDEgPDwgMCksCi0JCQkJICAgICgoQU5UX1JYX0RJVl9TVEFSVF8xID09IHZhbCkgPyAxIDogMCkgPDwgMCk7Ci0JCX0gZWxzZSB7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHg0MTAsICgweDEgPDwgMSksIDB4MDAgPDwgMSk7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHg0MTAsICgweDEgPDwgMCksICh1MTYpIHZhbCA8PCAwKTsKLQkJfQotCX0KLQotCWlmICghc3VzcGVuZCkKLQkJd2xhcGlfZW5hYmxlX21hYyhwaS0+c2gtPnBoeXNoaW0pOwotCi0JcmV0dXJuOwotfQotCi1zdGF0aWMgYm9vbAotd2xjX3BoeV9ub2lzZV9jYWxjX3BoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTMyICpjbXBseF9wd3IsIHM4ICpwd3JfYW50KQotewotCXM4IGNtcGx4X3B3cl9kYm1bUEhZX0NPUkVfTUFYXTsKLQl1OCBpOwotCi0JbWVtc2V0KCh1OCAqKSBjbXBseF9wd3JfZGJtLCAwLCBzaXplb2YoY21wbHhfcHdyX2RibSkpOwotCXdsY19waHlfY29tcHV0ZV9kQihjbXBseF9wd3IsIGNtcGx4X3B3cl9kYm0sIHBpLT5wdWJwaS5waHlfY29yZW51bSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcGktPnB1YnBpLnBoeV9jb3JlbnVtOyBpKyspIHsKLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKQotCQkJY21wbHhfcHdyX2RibVtpXSArPSAoczgpIFBIWV9OT0lTRV9PRkZTRVRGQUNUXzQzMjI7Ci0JCWVsc2UKLQotCQkJY21wbHhfcHdyX2RibVtpXSArPSAoczgpICgxNiAtICgxNSkgKiAzIC0gNzApOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBwaS0+cHVicGkucGh5X2NvcmVudW07IGkrKykgewotCQlwaS0+bnBoeV9ub2lzZV93aW5baV1bcGktPm5waHlfbm9pc2VfaW5kZXhdID0gY21wbHhfcHdyX2RibVtpXTsKLQkJcHdyX2FudFtpXSA9IGNtcGx4X3B3cl9kYm1baV07Ci0JfQotCXBpLT5ucGh5X25vaXNlX2luZGV4ID0KLQkgICAgTU9ESU5DX1BPVzIocGktPm5waHlfbm9pc2VfaW5kZXgsIFBIWV9OT0lTRV9XSU5ET1dfU1opOwotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZAotd2xjX3BoeV9ub2lzZV9zYW1wbGVfcmVxdWVzdChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcGloLCB1OCByZWFzb24sIHU4IGNoKQotewotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcGloOwotCXM4IG5vaXNlX2RibSA9IFBIWV9OT0lTRV9GSVhFRF9WQUxfTlBIWTsKLQlib29sIHNhbXBsaW5nX2luX3Byb2dyZXNzID0gKHBpLT5waHlub2lzZV9zdGF0ZSAhPSAwKTsKLQlib29sIHdhaXRfZm9yX2ludHIgPSB0cnVlOwotCi0JaWYgKE5PUkFESU9fRU5BQihwaS0+cHVicGkpKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlzd2l0Y2ggKHJlYXNvbikgewotCWNhc2UgUEhZX05PSVNFX1NBTVBMRV9NT046Ci0KLQkJcGktPnBoeW5vaXNlX2NoYW5fd2F0Y2hkb2cgPSBjaDsKLQkJcGktPnBoeW5vaXNlX3N0YXRlIHw9IFBIWV9OT0lTRV9TVEFURV9NT047Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIFBIWV9OT0lTRV9TQU1QTEVfRVhURVJOQUw6Ci0KLQkJcGktPnBoeW5vaXNlX3N0YXRlIHw9IFBIWV9OT0lTRV9TVEFURV9FWFRFUk5BTDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlpZiAoc2FtcGxpbmdfaW5fcHJvZ3Jlc3MpCi0JCXJldHVybjsKLQotCXBpLT5waHlub2lzZV9ub3cgPSBwaS0+c2gtPm5vdzsKLQotCWlmIChwaS0+cGh5X2ZpeGVkX25vaXNlKSB7Ci0JCWlmIChJU05QSFkocGkpKSB7Ci0JCQlwaS0+bnBoeV9ub2lzZV93aW5bV0xfQU5UX0lEWF8xXVtwaS0+bnBoeV9ub2lzZV9pbmRleF0gPQotCQkJICAgIFBIWV9OT0lTRV9GSVhFRF9WQUxfTlBIWTsKLQkJCXBpLT5ucGh5X25vaXNlX3dpbltXTF9BTlRfSURYXzJdW3BpLT5ucGh5X25vaXNlX2luZGV4XSA9Ci0JCQkgICAgUEhZX05PSVNFX0ZJWEVEX1ZBTF9OUEhZOwotCQkJcGktPm5waHlfbm9pc2VfaW5kZXggPSBNT0RJTkNfUE9XMihwaS0+bnBoeV9ub2lzZV9pbmRleCwKLQkJCQkJCQkgICBQSFlfTk9JU0VfV0lORE9XX1NaKTsKLQotCQkJbm9pc2VfZGJtID0gUEhZX05PSVNFX0ZJWEVEX1ZBTF9OUEhZOwotCQl9IGVsc2UgewotCi0JCQlub2lzZV9kYm0gPSBQSFlfTk9JU0VfRklYRURfVkFMOwotCQl9Ci0KLQkJd2FpdF9mb3JfaW50ciA9IGZhbHNlOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKElTTENOUEhZKHBpKSkgewotCQlpZiAoIXBpLT5waHlub2lzZV9wb2xsaW5nCi0JCSAgICB8fCAocmVhc29uID09IFBIWV9OT0lTRV9TQU1QTEVfRVhURVJOQUwpKSB7Ci0JCQl3bGFwaV9ibWFjX3dyaXRlX3NobShwaS0+c2gtPnBoeXNoaW0sIE1fSlNTSV8wLCAwKTsKLQkJCXdsYXBpX2JtYWNfd3JpdGVfc2htKHBpLT5zaC0+cGh5c2hpbSwgTV9QV1JJTkRfTUFQMCwgMCk7Ci0JCQl3bGFwaV9ibWFjX3dyaXRlX3NobShwaS0+c2gtPnBoeXNoaW0sIE1fUFdSSU5EX01BUDEsIDApOwotCQkJd2xhcGlfYm1hY193cml0ZV9zaG0ocGktPnNoLT5waHlzaGltLCBNX1BXUklORF9NQVAyLCAwKTsKLQkJCXdsYXBpX2JtYWNfd3JpdGVfc2htKHBpLT5zaC0+cGh5c2hpbSwgTV9QV1JJTkRfTUFQMywgMCk7Ci0KLQkJCU9SX1JFRygmcGktPnJlZ3MtPm1hY2NvbW1hbmQsCi0JCQkgICAgICAgTUNNRF9CR19OT0lTRSk7Ci0JCX0gZWxzZSB7Ci0JCQl3bGFwaV9zdXNwZW5kX21hY19hbmRfd2FpdChwaS0+c2gtPnBoeXNoaW0pOwotCQkJd2xjX2xjbnBoeV9kZWFmX21vZGUocGksIChib29sKSAwKTsKLQkJCW5vaXNlX2RibSA9IChzOCkgd2xjX2xjbnBoeV9yeF9zaWduYWxfcG93ZXIocGksIDIwKTsKLQkJCXdsY19sY25waHlfZGVhZl9tb2RlKHBpLCAoYm9vbCkgMSk7Ci0JCQl3bGFwaV9lbmFibGVfbWFjKHBpLT5zaC0+cGh5c2hpbSk7Ci0JCQl3YWl0X2Zvcl9pbnRyID0gZmFsc2U7Ci0JCX0KLQl9IGVsc2UgaWYgKElTTlBIWShwaSkpIHsKLQkJaWYgKCFwaS0+cGh5bm9pc2VfcG9sbGluZwotCQkgICAgfHwgKHJlYXNvbiA9PSBQSFlfTk9JU0VfU0FNUExFX0VYVEVSTkFMKSkgewotCi0JCQl3bGFwaV9ibWFjX3dyaXRlX3NobShwaS0+c2gtPnBoeXNoaW0sIE1fUFdSSU5EX01BUDAsIDApOwotCQkJd2xhcGlfYm1hY193cml0ZV9zaG0ocGktPnNoLT5waHlzaGltLCBNX1BXUklORF9NQVAxLCAwKTsKLQkJCXdsYXBpX2JtYWNfd3JpdGVfc2htKHBpLT5zaC0+cGh5c2hpbSwgTV9QV1JJTkRfTUFQMiwgMCk7Ci0JCQl3bGFwaV9ibWFjX3dyaXRlX3NobShwaS0+c2gtPnBoeXNoaW0sIE1fUFdSSU5EX01BUDMsIDApOwotCi0JCQlPUl9SRUcoJnBpLT5yZWdzLT5tYWNjb21tYW5kLAotCQkJICAgICAgIE1DTURfQkdfTk9JU0UpOwotCQl9IGVsc2UgewotCQkJc3RydWN0IHBoeV9pcV9lc3QgZXN0W1BIWV9DT1JFX01BWF07Ci0JCQl1MzIgY21wbHhfcHdyW1BIWV9DT1JFX01BWF07Ci0JCQlzOCBub2lzZV9kYm1fYW50W1BIWV9DT1JFX01BWF07Ci0JCQl1MTYgbG9nX251bV9zYW1wcywgbnVtX3NhbXBzLCBjbGFzc2lmX3N0YXRlID0gMDsKLQkJCXU4IHdhaXRfdGltZSA9IDMyOwotCQkJdTggd2FpdF9jcnMgPSAwOwotCQkJdTggaTsKLQotCQkJbWVtc2V0KCh1OCAqKSBlc3QsIDAsIHNpemVvZihlc3QpKTsKLQkJCW1lbXNldCgodTggKikgY21wbHhfcHdyLCAwLCBzaXplb2YoY21wbHhfcHdyKSk7Ci0JCQltZW1zZXQoKHU4ICopIG5vaXNlX2RibV9hbnQsIDAsIHNpemVvZihub2lzZV9kYm1fYW50KSk7Ci0KLQkJCWxvZ19udW1fc2FtcHMgPSBQSFlfTk9JU0VfU0FNUExFX0xPR19OVU1fTlBIWTsKLQkJCW51bV9zYW1wcyA9IDEgPDwgbG9nX251bV9zYW1wczsKLQotCQkJd2xhcGlfc3VzcGVuZF9tYWNfYW5kX3dhaXQocGktPnNoLT5waHlzaGltKTsKLQkJCWNsYXNzaWZfc3RhdGUgPSB3bGNfcGh5X2NsYXNzaWZpZXJfbnBoeShwaSwgMCwgMCk7Ci0JCQl3bGNfcGh5X2NsYXNzaWZpZXJfbnBoeShwaSwgMywgMCk7Ci0JCQl3bGNfcGh5X3J4X2lxX2VzdF9ucGh5KHBpLCBlc3QsIG51bV9zYW1wcywgd2FpdF90aW1lLAotCQkJCQkgICAgICAgd2FpdF9jcnMpOwotCQkJd2xjX3BoeV9jbGFzc2lmaWVyX25waHkocGksICgweDcgPDwgMCksIGNsYXNzaWZfc3RhdGUpOwotCQkJd2xhcGlfZW5hYmxlX21hYyhwaS0+c2gtPnBoeXNoaW0pOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgcGktPnB1YnBpLnBoeV9jb3JlbnVtOyBpKyspCi0JCQkJY21wbHhfcHdyW2ldID0KLQkJCQkgICAgKGVzdFtpXS5pX3B3ciArCi0JCQkJICAgICBlc3RbaV0ucV9wd3IpID4+IGxvZ19udW1fc2FtcHM7Ci0KLQkJCXdsY19waHlfbm9pc2VfY2FsY19waHkocGksIGNtcGx4X3B3ciwgbm9pc2VfZGJtX2FudCk7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBwaS0+cHVicGkucGh5X2NvcmVudW07IGkrKykgewotCQkJCXBpLT5ucGh5X25vaXNlX3dpbltpXVtwaS0+bnBoeV9ub2lzZV9pbmRleF0gPQotCQkJCSAgICBub2lzZV9kYm1fYW50W2ldOwotCi0JCQkJaWYgKG5vaXNlX2RibV9hbnRbaV0gPiBub2lzZV9kYm0pCi0JCQkJCW5vaXNlX2RibSA9IG5vaXNlX2RibV9hbnRbaV07Ci0JCQl9Ci0JCQlwaS0+bnBoeV9ub2lzZV9pbmRleCA9IE1PRElOQ19QT1cyKHBpLT5ucGh5X25vaXNlX2luZGV4LAotCQkJCQkJCSAgIFBIWV9OT0lTRV9XSU5ET1dfU1opOwotCi0JCQl3YWl0X2Zvcl9pbnRyID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLSBkb25lOgotCi0JaWYgKCF3YWl0X2Zvcl9pbnRyKQotCQl3bGNfcGh5X25vaXNlX2NiKHBpLCBjaCwgbm9pc2VfZGJtKTsKLQotfQotCi12b2lkIHdsY19waHlfbm9pc2Vfc2FtcGxlX3JlcXVlc3RfZXh0ZXJuYWwoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCkKLXsKLQl1OCBjaGFubmVsOwotCi0JY2hhbm5lbCA9IENIU1BFQ19DSEFOTkVMKHdsY19waHlfY2hhbnNwZWNfZ2V0KHBpaCkpOwotCi0Jd2xjX3BoeV9ub2lzZV9zYW1wbGVfcmVxdWVzdChwaWgsIFBIWV9OT0lTRV9TQU1QTEVfRVhURVJOQUwsIGNoYW5uZWwpOwotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X25vaXNlX2NiKHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCBjaGFubmVsLCBzOCBub2lzZV9kYm0pCi17Ci0JaWYgKCFwaS0+cGh5bm9pc2Vfc3RhdGUpCi0JCXJldHVybjsKLQotCWlmIChwaS0+cGh5bm9pc2Vfc3RhdGUgJiBQSFlfTk9JU0VfU1RBVEVfTU9OKSB7Ci0JCWlmIChwaS0+cGh5bm9pc2VfY2hhbl93YXRjaGRvZyA9PSBjaGFubmVsKSB7Ci0JCQlwaS0+c2gtPnBoeV9ub2lzZV93aW5kb3dbcGktPnNoLT5waHlfbm9pc2VfaW5kZXhdID0KLQkJCSAgICBub2lzZV9kYm07Ci0JCQlwaS0+c2gtPnBoeV9ub2lzZV9pbmRleCA9Ci0JCQkgICAgTU9ESU5DKHBpLT5zaC0+cGh5X25vaXNlX2luZGV4LCBNQV9XSU5ET1dfU1opOwotCQl9Ci0JCXBpLT5waHlub2lzZV9zdGF0ZSAmPSB+UEhZX05PSVNFX1NUQVRFX01PTjsKLQl9Ci0KLQlpZiAocGktPnBoeW5vaXNlX3N0YXRlICYgUEhZX05PSVNFX1NUQVRFX0VYVEVSTkFMKSB7Ci0JCXBpLT5waHlub2lzZV9zdGF0ZSAmPSB+UEhZX05PSVNFX1NUQVRFX0VYVEVSTkFMOwotCX0KLQotfQotCi1zdGF0aWMgczggd2xjX3BoeV9ub2lzZV9yZWFkX3NobWVtKHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXUzMiBjbXBseF9wd3JbUEhZX0NPUkVfTUFYXTsKLQlzOCBub2lzZV9kYm1fYW50W1BIWV9DT1JFX01BWF07Ci0JdTE2IGxvLCBoaTsKLQl1MzIgY21wbHhfcHdyX3RvdCA9IDA7Ci0Jczggbm9pc2VfZGJtID0gUEhZX05PSVNFX0ZJWEVEX1ZBTF9OUEhZOwotCXU4IGlkeCwgY29yZTsKLQotCW1lbXNldCgodTggKikgY21wbHhfcHdyLCAwLCBzaXplb2YoY21wbHhfcHdyKSk7Ci0JbWVtc2V0KCh1OCAqKSBub2lzZV9kYm1fYW50LCAwLCBzaXplb2Yobm9pc2VfZGJtX2FudCkpOwotCi0JZm9yIChpZHggPSAwLCBjb3JlID0gMDsgY29yZSA8IHBpLT5wdWJwaS5waHlfY29yZW51bTsgaWR4ICs9IDIsIGNvcmUrKykgewotCQlsbyA9IHdsYXBpX2JtYWNfcmVhZF9zaG0ocGktPnNoLT5waHlzaGltLCBNX1BXUklORF9NQVAoaWR4KSk7Ci0JCWhpID0gd2xhcGlfYm1hY19yZWFkX3NobShwaS0+c2gtPnBoeXNoaW0sCi0JCQkJCSBNX1BXUklORF9NQVAoaWR4ICsgMSkpOwotCQljbXBseF9wd3JbY29yZV0gPSAoaGkgPDwgMTYpICsgbG87Ci0JCWNtcGx4X3B3cl90b3QgKz0gY21wbHhfcHdyW2NvcmVdOwotCQlpZiAoY21wbHhfcHdyW2NvcmVdID09IDApIHsKLQkJCW5vaXNlX2RibV9hbnRbY29yZV0gPSBQSFlfTk9JU0VfRklYRURfVkFMX05QSFk7Ci0JCX0gZWxzZQotCQkJY21wbHhfcHdyW2NvcmVdID4+PSBQSFlfTk9JU0VfU0FNUExFX0xPR19OVU1fVUNPREU7Ci0JfQotCi0JaWYgKGNtcGx4X3B3cl90b3QgIT0gMCkKLQkJd2xjX3BoeV9ub2lzZV9jYWxjX3BoeShwaSwgY21wbHhfcHdyLCBub2lzZV9kYm1fYW50KTsKLQotCWZvciAoY29yZSA9IDA7IGNvcmUgPCBwaS0+cHVicGkucGh5X2NvcmVudW07IGNvcmUrKykgewotCQlwaS0+bnBoeV9ub2lzZV93aW5bY29yZV1bcGktPm5waHlfbm9pc2VfaW5kZXhdID0KLQkJICAgIG5vaXNlX2RibV9hbnRbY29yZV07Ci0KLQkJaWYgKG5vaXNlX2RibV9hbnRbY29yZV0gPiBub2lzZV9kYm0pCi0JCQlub2lzZV9kYm0gPSBub2lzZV9kYm1fYW50W2NvcmVdOwotCX0KLQlwaS0+bnBoeV9ub2lzZV9pbmRleCA9Ci0JICAgIE1PRElOQ19QT1cyKHBpLT5ucGh5X25vaXNlX2luZGV4LCBQSFlfTk9JU0VfV0lORE9XX1NaKTsKLQotCXJldHVybiBub2lzZV9kYm07Ci0KLX0KLQotdm9pZCB3bGNfcGh5X25vaXNlX3NhbXBsZV9pbnRyKHN0cnVjdCBicmNtc19waHlfcHViICpwaWgpCi17Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwaWg7Ci0JdTE2IGpzc2lfYXV4OwotCXU4IGNoYW5uZWwgPSAwOwotCXM4IG5vaXNlX2RibSA9IFBIWV9OT0lTRV9GSVhFRF9WQUxfTlBIWTsKLQotCWlmIChJU0xDTlBIWShwaSkpIHsKLQkJdTMyIGNtcGx4X3B3ciwgY21wbHhfcHdyMCwgY21wbHhfcHdyMTsKLQkJdTE2IGxvLCBoaTsKLQkJczMyIHB3cl9vZmZzZXRfZEIsIGdhaW5fZEI7Ci0JCXUxNiBzdGF0dXNfMCwgc3RhdHVzXzE7Ci0KLQkJanNzaV9hdXggPSB3bGFwaV9ibWFjX3JlYWRfc2htKHBpLT5zaC0+cGh5c2hpbSwgTV9KU1NJX0FVWCk7Ci0JCWNoYW5uZWwgPSBqc3NpX2F1eCAmIEQxMV9DVVJDSEFOTkVMX01BWDsKLQotCQlsbyA9IHdsYXBpX2JtYWNfcmVhZF9zaG0ocGktPnNoLT5waHlzaGltLCBNX1BXUklORF9NQVAwKTsKLQkJaGkgPSB3bGFwaV9ibWFjX3JlYWRfc2htKHBpLT5zaC0+cGh5c2hpbSwgTV9QV1JJTkRfTUFQMSk7Ci0JCWNtcGx4X3B3cjAgPSAoaGkgPDwgMTYpICsgbG87Ci0KLQkJbG8gPSB3bGFwaV9ibWFjX3JlYWRfc2htKHBpLT5zaC0+cGh5c2hpbSwgTV9QV1JJTkRfTUFQMik7Ci0JCWhpID0gd2xhcGlfYm1hY19yZWFkX3NobShwaS0+c2gtPnBoeXNoaW0sIE1fUFdSSU5EX01BUDMpOwotCQljbXBseF9wd3IxID0gKGhpIDw8IDE2KSArIGxvOwotCQljbXBseF9wd3IgPSAoY21wbHhfcHdyMCArIGNtcGx4X3B3cjEpID4+IDY7Ci0KLQkJc3RhdHVzXzAgPSAweDQ0OwotCQlzdGF0dXNfMSA9IHdsYXBpX2JtYWNfcmVhZF9zaG0ocGktPnNoLT5waHlzaGltLCBNX0pTU0lfMCk7Ci0JCWlmICgoY21wbHhfcHdyID4gMCAmJiBjbXBseF9wd3IgPCA1MDApCi0JCSAgICAmJiAoKHN0YXR1c18xICYgMHhjMDAwKSA9PSAweDQwMDApKSB7Ci0KLQkJCXdsY19waHlfY29tcHV0ZV9kQigmY21wbHhfcHdyLCAmbm9pc2VfZGJtLAotCQkJCQkgICBwaS0+cHVicGkucGh5X2NvcmVudW0pOwotCQkJcHdyX29mZnNldF9kQiA9IChyZWFkX3BoeV9yZWcocGksIDB4NDM0KSAmIDB4RkYpOwotCQkJaWYgKHB3cl9vZmZzZXRfZEIgPiAxMjcpCi0JCQkJcHdyX29mZnNldF9kQiAtPSAyNTY7Ci0KLQkJCW5vaXNlX2RibSArPSAoczgpIChwd3Jfb2Zmc2V0X2RCIC0gMzApOwotCi0JCQlnYWluX2RCID0gKHN0YXR1c18wICYgMHgxZmYpOwotCQkJbm9pc2VfZGJtIC09IChzOCkgKGdhaW5fZEIpOwotCQl9IGVsc2UgewotCQkJbm9pc2VfZGJtID0gUEhZX05PSVNFX0ZJWEVEX1ZBTF9MQ05QSFk7Ci0JCX0KLQl9IGVsc2UgaWYgKElTTlBIWShwaSkpIHsKLQotCQlqc3NpX2F1eCA9IHdsYXBpX2JtYWNfcmVhZF9zaG0ocGktPnNoLT5waHlzaGltLCBNX0pTU0lfQVVYKTsKLQkJY2hhbm5lbCA9IGpzc2lfYXV4ICYgRDExX0NVUkNIQU5ORUxfTUFYOwotCi0JCW5vaXNlX2RibSA9IHdsY19waHlfbm9pc2VfcmVhZF9zaG1lbShwaSk7Ci0JfQotCi0Jd2xjX3BoeV9ub2lzZV9jYihwaSwgY2hhbm5lbCwgbm9pc2VfZGJtKTsKLQotfQotCi1zOCBsY25waHlfZ2Fpbl9pbmRleF9vZmZzZXRfZm9yX3BrdF9yc3NpW10gPSB7Ci0JOCwKLQk4LAotCTgsCi0JOCwKLQk4LAotCTgsCi0JOCwKLQk5LAotCTEwLAotCTgsCi0JOCwKLQk3LAotCTcsCi0JMSwKLQkyLAotCTIsCi0JMiwKLQkyLAotCTIsCi0JMiwKLQkyLAotCTIsCi0JMiwKLQkyLAotCTIsCi0JMiwKLQkyLAotCTIsCi0JMiwKLQkyLAotCTIsCi0JMiwKLQkxLAotCTEsCi0JMCwKLQkwLAotCTAsCi0JMAotfTsKLQotdm9pZCB3bGNfcGh5X2NvbXB1dGVfZEIodTMyICpjbXBseF9wd3IsIHM4ICpwX2NtcGx4X3B3cl9kQiwgdTggY29yZSkKLXsKLQl1OCBtc2IsIHNlY29uZG1zYiwgaTsKLQl1MzIgdG1wOwotCi0JZm9yIChpID0gMDsgaSA8IGNvcmU7IGkrKykgewotCQlzZWNvbmRtc2IgPSAwOwotCQl0bXAgPSBjbXBseF9wd3JbaV07Ci0JCW1zYiA9IGZscyh0bXApOwotCQlpZiAobXNiKQotCQkJc2Vjb25kbXNiID0gKHU4KSAoKHRtcCA+PiAoLS1tc2IgLSAxKSkgJiAxKTsKLQkJcF9jbXBseF9wd3JfZEJbaV0gPSAoczgpICgzICogbXNiICsgMiAqIHNlY29uZG1zYik7Ci0JfQotfQotCi12b2lkIHdsY19waHlfcnNzaV9jb21wdXRlKHN0cnVjdCBicmNtc19waHlfcHViICpwaWgsIHZvaWQgKmN0eCkKLXsKLQlzdHJ1Y3QgYnJjbXNfZDExcnhoZHIgKndsY19yeGhkciA9IChzdHJ1Y3QgYnJjbXNfZDExcnhoZHIgKikgY3R4OwotCXN0cnVjdCBkMTFyeGhkciAqcnhoID0gJndsY19yeGhkci0+cnhoZHI7Ci0JaW50IHJzc2kgPSBsZTE2X3RvX2NwdShyeGgtPlBoeVJ4U3RhdHVzXzEpICYgUFJYUzFfSlNTSV9NQVNLOwotCXVpbnQgcmFkaW9pZCA9IHBpaC0+cmFkaW9pZDsKLQlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBpaDsKLQotCWlmIChOT1JBRElPX0VOQUIocGktPnB1YnBpKSkgewotCQlyc3NpID0gQlJDTVNfUlNTSV9JTlZBTElEOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlpZiAoKHBpLT5zaC0+Y29yZXJldiA+PSAxMSkKLQkgICAgJiYgIShsZTE2X3RvX2NwdShyeGgtPlJ4U3RhdHVzMikgJiBSWFNfUEhZUlhTVF9WQUxJRCkpIHsKLQkJcnNzaSA9IEJSQ01TX1JTU0lfSU5WQUxJRDsKLQkJZ290byBlbmQ7Ci0JfQotCi0JaWYgKElTTENOUEhZKHBpKSkgewotCQl1OCBnaWR4ID0gKGxlMTZfdG9fY3B1KHJ4aC0+UGh5UnhTdGF0dXNfMikgJiAweEZDMDApID4+IDEwOwotCQlzdHJ1Y3QgYnJjbXNfcGh5X2xjbnBoeSAqcGlfbGNuID0gcGktPnUucGlfbGNucGh5OwotCi0JCWlmIChyc3NpID4gMTI3KQotCQkJcnNzaSAtPSAyNTY7Ci0KLQkJcnNzaSA9IHJzc2kgKyBsY25waHlfZ2Fpbl9pbmRleF9vZmZzZXRfZm9yX3BrdF9yc3NpW2dpZHhdOwotCQlpZiAoKHJzc2kgPiAtNDYpICYmIChnaWR4ID4gMTgpKQotCQkJcnNzaSA9IHJzc2kgKyA3OwotCi0JCXJzc2kgPSByc3NpICsgcGlfbGNuLT5sY25waHlfcGt0ZW5nX3Jzc2lfc2xvcGU7Ci0KLQkJcnNzaSA9IHJzc2kgKyAyOwotCi0JfQotCi0JaWYgKElTTENOUEhZKHBpKSkgewotCi0JCWlmIChyc3NpID4gMTI3KQotCQkJcnNzaSAtPSAyNTY7Ci0JfSBlbHNlIGlmIChyYWRpb2lkID09IEJDTTIwNTVfSUQgfHwgcmFkaW9pZCA9PSBCQ00yMDU2X0lECi0JCSAgIHx8IHJhZGlvaWQgPT0gQkNNMjA1N19JRCkgewotCQlyc3NpID0gd2xjX3BoeV9yc3NpX2NvbXB1dGVfbnBoeShwaSwgd2xjX3J4aGRyKTsKLQl9Ci0KLSBlbmQ6Ci0Jd2xjX3J4aGRyLT5yc3NpID0gKHM4KSByc3NpOwotfQotCi12b2lkIHdsY19waHlfZnJlcXRyYWNrX3N0YXJ0KHN0cnVjdCBicmNtc19waHlfcHViICpwaWgpCi17Ci0JcmV0dXJuOwotfQotCi12b2lkIHdsY19waHlfZnJlcXRyYWNrX2VuZChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcGloKQotewotCXJldHVybjsKLX0KLQotdm9pZCB3bGNfcGh5X3NldF9kZWFmKHN0cnVjdCBicmNtc19waHlfcHViICpwcGksIGJvb2wgdXNlcl9mbGFnKQotewotCXN0cnVjdCBicmNtc19waHkgKnBpOwotCXBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcHBpOwotCi0JaWYgKElTTENOUEhZKHBpKSkKLQkJd2xjX2xjbnBoeV9kZWFmX21vZGUocGksIHRydWUpOwotCWVsc2UgaWYgKElTTlBIWShwaSkpCi0JCXdsY19ucGh5X2RlYWZfbW9kZShwaSwgdHJ1ZSk7Ci19Ci0KLXZvaWQgd2xjX3BoeV93YXRjaGRvZyhzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcGloKQotewotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcGloOwotCWJvb2wgZGVsYXlfcGh5X2NhbCA9IGZhbHNlOwotCXBpLT5zaC0+bm93Kys7Ci0KLQlpZiAoIXBpLT53YXRjaGRvZ19vdmVycmlkZSkKLQkJcmV0dXJuOwotCi0JaWYgKCEoU0NBTl9STV9JTl9QUk9HUkVTUyhwaSkgfHwgUExUX0lOUFJPR19QSFkocGkpKSkgewotCQl3bGNfcGh5X25vaXNlX3NhbXBsZV9yZXF1ZXN0KChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqKSBwaSwKLQkJCQkJICAgICBQSFlfTk9JU0VfU0FNUExFX01PTiwKLQkJCQkJICAgICBDSFNQRUNfQ0hBTk5FTChwaS0+Ci0JCQkJCQkJICAgIHJhZGlvX2NoYW5zcGVjKSk7Ci0JfQotCi0JaWYgKHBpLT5waHlub2lzZV9zdGF0ZSAmJiAocGktPnNoLT5ub3cgLSBwaS0+cGh5bm9pc2Vfbm93KSA+IDUpIHsKLQkJcGktPnBoeW5vaXNlX3N0YXRlID0gMDsKLQl9Ci0KLQlpZiAoKCFwaS0+cGh5Y2FsX3R4cG93ZXIpIHx8Ci0JICAgICgocGktPnNoLT5ub3cgLSBwaS0+cGh5Y2FsX3R4cG93ZXIpID49IHBpLT5zaC0+ZmFzdF90aW1lcikpIHsKLQotCQlpZiAoIVNDQU5fSU5QUk9HX1BIWShwaSkgJiYgd2xjX3BoeV9jYWxfdHhwb3dlcl9yZWNhbGNfc3cocGkpKSB7Ci0JCQlwaS0+cGh5Y2FsX3R4cG93ZXIgPSBwaS0+c2gtPm5vdzsKLQkJfQotCX0KLQotCWlmIChOT1JBRElPX0VOQUIocGktPnB1YnBpKSkKLQkJcmV0dXJuOwotCi0JaWYgKChTQ0FOX1JNX0lOX1BST0dSRVNTKHBpKSB8fCBQTFRfSU5QUk9HX1BIWShwaSkKLQkgICAgIHx8IEFTU09DX0lOUFJPR19QSFkocGkpKSkKLQkJcmV0dXJuOwotCi0JaWYgKElTTlBIWShwaSkgJiYgIXBpLT5kaXNhYmxlX3BlcmNhbCAmJiAhZGVsYXlfcGh5X2NhbCkgewotCi0JCWlmICgocGktPm5waHlfcGVyaWNhbCAhPSBQSFlfUEVSSUNBTF9ESVNBQkxFKSAmJgotCQkgICAgKHBpLT5ucGh5X3BlcmljYWwgIT0gUEhZX1BFUklDQUxfTUFOVUFMKSAmJgotCQkgICAgKChwaS0+c2gtPm5vdyAtIHBpLT5ucGh5X3BlcmljYWxfbGFzdCkgPj0KLQkJICAgICBwaS0+c2gtPmdsYWNpYWxfdGltZXIpKQotCQkJd2xjX3BoeV9jYWxfcGVyaWNhbCgoc3RydWN0IGJyY21zX3BoeV9wdWIgKikgcGksCi0JCQkJCSAgICBQSFlfUEVSSUNBTF9XQVRDSERPRyk7Ci0KLQkJd2xjX3BoeV90eHB3cl9wYXBkX2NhbF9ucGh5KHBpKTsKLQl9Ci0KLQlpZiAoSVNMQ05QSFkocGkpKSB7Ci0JCWlmIChwaS0+cGh5X2ZvcmNlY2FsIHx8Ci0JCSAgICAoKHBpLT5zaC0+bm93IC0gcGktPnBoeV9sYXN0Y2FsKSA+PQotCQkgICAgIHBpLT5zaC0+Z2xhY2lhbF90aW1lcikpIHsKLQkJCWlmICghKFNDQU5fUk1fSU5fUFJPR1JFU1MocGkpIHx8IEFTU09DX0lOUFJPR19QSFkocGkpKSkKLQkJCQl3bGNfbGNucGh5X2NhbGliX21vZGVzKHBpLAotCQkJCQkJICAgICAgIExDTlBIWV9QRVJJQ0FMX1RFTVBCQVNFRF9UWFBXUkNUUkwpOwotCQkJaWYgKCEKLQkJCSAgICAoU0NBTl9STV9JTl9QUk9HUkVTUyhwaSkgfHwgUExUX0lOUFJPR19QSFkocGkpCi0JCQkgICAgIHx8IEFTU09DX0lOUFJPR19QSFkocGkpCi0JCQkgICAgIHx8IHBpLT5jYXJyaWVyX3N1cHByX2Rpc2FibGUKLQkJCSAgICAgfHwgcGktPmRpc2FibGVfcGVyY2FsKSkKLQkJCQl3bGNfbGNucGh5X2NhbGliX21vZGVzKHBpLAotCQkJCQkJICAgICAgIFBIWV9QRVJJQ0FMX1dBVENIRE9HKTsKLQkJfQotCX0KLX0KLQotdm9pZCB3bGNfcGh5X0JTU2luaXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCwgYm9vbCBib25seWFwLCBpbnQgcnNzaSkKLXsKLQlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBpaDsKLQl1aW50IGk7Ci0JdWludCBrOwotCi0JZm9yIChpID0gMDsgaSA8IE1BX1dJTkRPV19TWjsgaSsrKSB7Ci0JCXBpLT5zaC0+cGh5X25vaXNlX3dpbmRvd1tpXSA9IChzOCkgKHJzc2kgJiAweGZmKTsKLQl9Ci0JaWYgKElTTENOUEhZKHBpKSkgewotCQlmb3IgKGkgPSAwOyBpIDwgTUFfV0lORE9XX1NaOyBpKyspCi0JCQlwaS0+c2gtPnBoeV9ub2lzZV93aW5kb3dbaV0gPQotCQkJICAgIFBIWV9OT0lTRV9GSVhFRF9WQUxfTENOUEhZOwotCX0KLQlwaS0+c2gtPnBoeV9ub2lzZV9pbmRleCA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUEhZX05PSVNFX1dJTkRPV19TWjsgaSsrKSB7Ci0JCWZvciAoayA9IFdMX0FOVF9JRFhfMTsgayA8IFdMX0FOVF9SWF9NQVg7IGsrKykKLQkJCXBpLT5ucGh5X25vaXNlX3dpbltrXVtpXSA9IFBIWV9OT0lTRV9GSVhFRF9WQUxfTlBIWTsKLQl9Ci0JcGktPm5waHlfbm9pc2VfaW5kZXggPSAwOwotfQotCi12b2lkCi13bGNfcGh5X3BhcGRfZGVjb2RlX2Vwc2lsb24odTMyIGVwc2lsb24sIHMzMiAqZXBzX3JlYWwsIHMzMiAqZXBzX2ltYWcpCi17Ci0JKmVwc19pbWFnID0gKGVwc2lsb24gPj4gMTMpOwotCWlmICgqZXBzX2ltYWcgPiAweGZmZikKLQkJKmVwc19pbWFnIC09IDB4MjAwMDsKLQotCSplcHNfcmVhbCA9IChlcHNpbG9uICYgMHgxZmZmKTsKLQlpZiAoKmVwc19yZWFsID4gMHhmZmYpCi0JCSplcHNfcmVhbCAtPSAweDIwMDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBmaXhlZCBBdGFuVGJsW10gPSB7Ci0JMjk0OTEyMCwKLQkxNzQwOTY3LAotCTkxOTg3OSwKLQk0NjY5NDUsCi0JMjM0Mzc5LAotCTExNzMwNCwKLQk1ODY2NiwKLQkyOTMzNSwKLQkxNDY2OCwKLQk3MzM0LAotCTM2NjcsCi0JMTgzMywKLQk5MTcsCi0JNDU4LAotCTIyOSwKLQkxMTUsCi0JNTcsCi0JMjkKLX07Ci0KLXZvaWQgd2xjX3BoeV9jb3JkaWMoZml4ZWQgdGhldGEsIGNzMzIgKnZhbCkKLXsKLQlmaXhlZCBhbmdsZSwgdmFsdG1wOwotCXVuc2lnbmVkIGl0ZXI7Ci0JaW50IHNpZ254ID0gMTsKLQlpbnQgc2lnbnRoZXRhOwotCi0JdmFsWzBdLmkgPSBDT1JESUNfQUc7Ci0JdmFsWzBdLnEgPSAwOwotCWFuZ2xlID0gMDsKLQotCXNpZ250aGV0YSA9ICh0aGV0YSA8IDApID8gLTEgOiAxOwotCXRoZXRhID0KLQkgICAgKCh0aGV0YSArIEZJWEVEKDE4MCkgKiBzaWdudGhldGEpICUgRklYRUQoMzYwKSkgLQotCSAgICBGSVhFRCgxODApICogc2lnbnRoZXRhOwotCi0JaWYgKEZMT0FUKHRoZXRhKSA+IDkwKSB7Ci0JCXRoZXRhIC09IEZJWEVEKDE4MCk7Ci0JCXNpZ254ID0gLTE7Ci0JfSBlbHNlIGlmIChGTE9BVCh0aGV0YSkgPCAtOTApIHsKLQkJdGhldGEgKz0gRklYRUQoMTgwKTsKLQkJc2lnbnggPSAtMTsKLQl9Ci0KLQlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgQ09SRElDX05JOyBpdGVyKyspIHsKLQkJaWYgKHRoZXRhID4gYW5nbGUpIHsKLQkJCXZhbHRtcCA9IHZhbFswXS5pIC0gKHZhbFswXS5xID4+IGl0ZXIpOwotCQkJdmFsWzBdLnEgPSAodmFsWzBdLmkgPj4gaXRlcikgKyB2YWxbMF0ucTsKLQkJCXZhbFswXS5pID0gdmFsdG1wOwotCQkJYW5nbGUgKz0gQXRhblRibFtpdGVyXTsKLQkJfSBlbHNlIHsKLQkJCXZhbHRtcCA9IHZhbFswXS5pICsgKHZhbFswXS5xID4+IGl0ZXIpOwotCQkJdmFsWzBdLnEgPSAtKHZhbFswXS5pID4+IGl0ZXIpICsgdmFsWzBdLnE7Ci0JCQl2YWxbMF0uaSA9IHZhbHRtcDsKLQkJCWFuZ2xlIC09IEF0YW5UYmxbaXRlcl07Ci0JCX0KLQl9Ci0KLQl2YWxbMF0uaSA9IHZhbFswXS5pICogc2lnbng7Ci0JdmFsWzBdLnEgPSB2YWxbMF0ucSAqIHNpZ254OwotfQotCi12b2lkIHdsY19waHlfY2FsX3BlcmljYWxfbXBoYXNlX3Jlc2V0KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXdsYXBpX2RlbF90aW1lcihwaS0+c2gtPnBoeXNoaW0sIHBpLT5waHljYWxfdGltZXIpOwotCi0JcGktPmNhbF90eXBlX292ZXJyaWRlID0gUEhZX1BFUklDQUxfQVVUTzsKLQlwaS0+bXBoYXNlX2NhbF9waGFzZV9pZCA9IE1QSEFTRV9DQUxfU1RBVEVfSURMRTsKLQlwaS0+bXBoYXNlX3R4Y2FsX2NtZGlkeCA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkCi13bGNfcGh5X2NhbF9wZXJpY2FsX21waGFzZV9zY2hlZHVsZShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdWludCBkZWxheSkKLXsKLQotCWlmICgocGktPm5waHlfcGVyaWNhbCAhPSBQSFlfUEVSSUNBTF9NUEhBU0UpICYmCi0JICAgIChwaS0+bnBoeV9wZXJpY2FsICE9IFBIWV9QRVJJQ0FMX01BTlVBTCkpCi0JCXJldHVybjsKLQotCXdsYXBpX2RlbF90aW1lcihwaS0+c2gtPnBoeXNoaW0sIHBpLT5waHljYWxfdGltZXIpOwotCi0JcGktPm1waGFzZV9jYWxfcGhhc2VfaWQgPSBNUEhBU0VfQ0FMX1NUQVRFX0lOSVQ7Ci0Jd2xhcGlfYWRkX3RpbWVyKHBpLT5zaC0+cGh5c2hpbSwgcGktPnBoeWNhbF90aW1lciwgZGVsYXksIDApOwotfQotCi12b2lkIHdsY19waHlfY2FsX3BlcmljYWwoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCwgdTggcmVhc29uKQotewotCXMxNiBucGh5X2N1cnJ0ZW1wID0gMDsKLQlzMTYgZGVsdGFfdGVtcCA9IDA7Ci0JYm9vbCBkb19wZXJpb2RpY19jYWwgPSB0cnVlOwotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcGloOwotCi0JaWYgKCFJU05QSFkocGkpKQotCQlyZXR1cm47Ci0KLQlpZiAoKHBpLT5ucGh5X3BlcmljYWwgPT0gUEhZX1BFUklDQUxfRElTQUJMRSkgfHwKLQkgICAgKHBpLT5ucGh5X3BlcmljYWwgPT0gUEhZX1BFUklDQUxfTUFOVUFMKSkKLQkJcmV0dXJuOwotCi0Jc3dpdGNoIChyZWFzb24pIHsKLQljYXNlIFBIWV9QRVJJQ0FMX0RSSVZFUlVQOgotCQlicmVhazsKLQotCWNhc2UgUEhZX1BFUklDQUxfUEhZSU5JVDoKLQkJaWYgKHBpLT5ucGh5X3BlcmljYWwgPT0gUEhZX1BFUklDQUxfTVBIQVNFKSB7Ci0JCQlpZiAoUEhZX1BFUklDQUxfTVBIQVNFX1BFTkRJTkcocGkpKSB7Ci0JCQkJd2xjX3BoeV9jYWxfcGVyaWNhbF9tcGhhc2VfcmVzZXQocGkpOwotCQkJfQotCQkJd2xjX3BoeV9jYWxfcGVyaWNhbF9tcGhhc2Vfc2NoZWR1bGUocGksCi0JCQkJCQkJICAgIFBIWV9QRVJJQ0FMX0lOSVRfREVMQVkpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBQSFlfUEVSSUNBTF9KT0lOX0JTUzoKLQljYXNlIFBIWV9QRVJJQ0FMX1NUQVJUX0lCU1M6Ci0JY2FzZSBQSFlfUEVSSUNBTF9VUF9CU1M6Ci0JCWlmICgocGktPm5waHlfcGVyaWNhbCA9PSBQSFlfUEVSSUNBTF9NUEhBU0UpICYmCi0JCSAgICBQSFlfUEVSSUNBTF9NUEhBU0VfUEVORElORyhwaSkpIHsKLQkJCXdsY19waHlfY2FsX3BlcmljYWxfbXBoYXNlX3Jlc2V0KHBpKTsKLQkJfQotCi0JCXBpLT5maXJzdF9jYWxfYWZ0ZXJfYXNzb2MgPSB0cnVlOwotCi0JCXBpLT5jYWxfdHlwZV9vdmVycmlkZSA9IFBIWV9QRVJJQ0FMX0ZVTEw7Ci0KLQkJaWYgKHBpLT5waHljYWxfdGVtcGRlbHRhKSB7Ci0JCQlwaS0+bnBoeV9sYXN0Y2FsX3RlbXAgPSB3bGNfcGh5X3RlbXBzZW5zZV9ucGh5KHBpKTsKLQkJfQotCQl3bGNfcGh5X2NhbF9wZXJpY2FsX25waHlfcnVuKHBpLCBQSFlfUEVSSUNBTF9GVUxMKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFBIWV9QRVJJQ0FMX1dBVENIRE9HOgotCQlpZiAocGktPnBoeWNhbF90ZW1wZGVsdGEpIHsKLQkJCW5waHlfY3VycnRlbXAgPSB3bGNfcGh5X3RlbXBzZW5zZV9ucGh5KHBpKTsKLQkJCWRlbHRhX3RlbXAgPQotCQkJICAgIChucGh5X2N1cnJ0ZW1wID4gcGktPm5waHlfbGFzdGNhbF90ZW1wKSA/Ci0JCQkgICAgbnBoeV9jdXJydGVtcCAtIHBpLT5ucGh5X2xhc3RjYWxfdGVtcCA6Ci0JCQkgICAgcGktPm5waHlfbGFzdGNhbF90ZW1wIC0gbnBoeV9jdXJydGVtcDsKLQotCQkJaWYgKChkZWx0YV90ZW1wIDwgKHMxNikgcGktPnBoeWNhbF90ZW1wZGVsdGEpICYmCi0JCQkgICAgKHBpLT5ucGh5X3R4aXFsb2NhbF9jaGFuc3BlYyA9PQotCQkJICAgICBwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQkJZG9fcGVyaW9kaWNfY2FsID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXBpLT5ucGh5X2xhc3RjYWxfdGVtcCA9IG5waHlfY3VycnRlbXA7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZG9fcGVyaW9kaWNfY2FsKSB7Ci0KLQkJCWlmIChwaS0+bnBoeV9wZXJpY2FsID09IFBIWV9QRVJJQ0FMX01QSEFTRSkgewotCi0JCQkJaWYgKCFQSFlfUEVSSUNBTF9NUEhBU0VfUEVORElORyhwaSkpCi0JCQkJCXdsY19waHlfY2FsX3BlcmljYWxfbXBoYXNlX3NjaGVkdWxlKHBpLAotCQkJCQkJCQkJICAgIFBIWV9QRVJJQ0FMX1dET0dfREVMQVkpOwotCQkJfSBlbHNlIGlmIChwaS0+bnBoeV9wZXJpY2FsID09IFBIWV9QRVJJQ0FMX1NQSEFTRSkKLQkJCQl3bGNfcGh5X2NhbF9wZXJpY2FsX25waHlfcnVuKHBpLAotCQkJCQkJCSAgICAgUEhZX1BFUklDQUxfQVVUTyk7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCi12b2lkIHdsY19waHlfY2FsX3BlcmljYWxfbXBoYXNlX3Jlc3RhcnQoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JcGktPm1waGFzZV9jYWxfcGhhc2VfaWQgPSBNUEhBU0VfQ0FMX1NUQVRFX0lOSVQ7Ci0JcGktPm1waGFzZV90eGNhbF9jbWRpZHggPSAwOwotfQotCi11OCB3bGNfcGh5X25iaXRzKHMzMiB2YWx1ZSkKLXsKLQlzMzIgYWJzX3ZhbDsKLQl1OCBuYml0cyA9IDA7Ci0KLQlhYnNfdmFsID0gQUJTKHZhbHVlKTsKLQl3aGlsZSAoKGFic192YWwgPj4gbmJpdHMpID4gMCkKLQkJbmJpdHMrKzsKLQotCXJldHVybiBuYml0czsKLX0KLQotdm9pZCB3bGNfcGh5X3N0Zl9jaGFpbl9pbml0KHN0cnVjdCBicmNtc19waHlfcHViICpwaWgsIHU4IHR4Y2hhaW4sIHU4IHJ4Y2hhaW4pCi17Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwaWg7Ci0KLQlwaS0+c2gtPmh3X3BoeXR4Y2hhaW4gPSB0eGNoYWluOwotCXBpLT5zaC0+aHdfcGh5cnhjaGFpbiA9IHJ4Y2hhaW47Ci0JcGktPnNoLT5waHl0eGNoYWluID0gdHhjaGFpbjsKLQlwaS0+c2gtPnBoeXJ4Y2hhaW4gPSByeGNoYWluOwotCXBpLT5wdWJwaS5waHlfY29yZW51bSA9ICh1OCkgUEhZX0JJVFNDTlQocGktPnNoLT5waHlyeGNoYWluKTsKLX0KLQotdm9pZCB3bGNfcGh5X3N0Zl9jaGFpbl9zZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCwgdTggdHhjaGFpbiwgdTggcnhjaGFpbikKLXsKLQlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBpaDsKLQotCXBpLT5zaC0+cGh5dHhjaGFpbiA9IHR4Y2hhaW47Ci0KLQlpZiAoSVNOUEhZKHBpKSkgewotCQl3bGNfcGh5X3J4Y29yZV9zZXRzdGF0ZV9ucGh5KHBpaCwgcnhjaGFpbik7Ci0JfQotCXBpLT5wdWJwaS5waHlfY29yZW51bSA9ICh1OCkgUEhZX0JJVFNDTlQocGktPnNoLT5waHlyeGNoYWluKTsKLX0KLQotdm9pZCB3bGNfcGh5X3N0Zl9jaGFpbl9nZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCwgdTggKnR4Y2hhaW4sIHU4ICpyeGNoYWluKQotewotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcGloOwotCi0JKnR4Y2hhaW4gPSBwaS0+c2gtPnBoeXR4Y2hhaW47Ci0JKnJ4Y2hhaW4gPSBwaS0+c2gtPnBoeXJ4Y2hhaW47Ci19Ci0KLXU4IHdsY19waHlfc3RmX2NoYWluX2FjdGl2ZV9nZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCkKLXsKLQlzMTYgbnBoeV9jdXJydGVtcDsKLQl1OCBhY3RpdmVfYml0bWFwOwotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcGloOwotCi0JYWN0aXZlX2JpdG1hcCA9IChwaS0+cGh5X3R4Y29yZV9oZWF0ZWR1cCkgPyAweDMxIDogMHgzMzsKLQotCWlmICghcGktPndhdGNoZG9nX292ZXJyaWRlKQotCQlyZXR1cm4gYWN0aXZlX2JpdG1hcDsKLQotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA2KSkgewotCQl3bGFwaV9zdXNwZW5kX21hY19hbmRfd2FpdChwaS0+c2gtPnBoeXNoaW0pOwotCQlucGh5X2N1cnJ0ZW1wID0gd2xjX3BoeV90ZW1wc2Vuc2VfbnBoeShwaSk7Ci0JCXdsYXBpX2VuYWJsZV9tYWMocGktPnNoLT5waHlzaGltKTsKLQotCQlpZiAoIXBpLT5waHlfdHhjb3JlX2hlYXRlZHVwKSB7Ci0JCQlpZiAobnBoeV9jdXJydGVtcCA+PSBwaS0+cGh5X3R4Y29yZV9kaXNhYmxlX3RlbXApIHsKLQkJCQlhY3RpdmVfYml0bWFwICY9IDB4RkQ7Ci0JCQkJcGktPnBoeV90eGNvcmVfaGVhdGVkdXAgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKG5waHlfY3VycnRlbXAgPD0gcGktPnBoeV90eGNvcmVfZW5hYmxlX3RlbXApIHsKLQkJCQlhY3RpdmVfYml0bWFwIHw9IDB4MjsKLQkJCQlwaS0+cGh5X3R4Y29yZV9oZWF0ZWR1cCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIGFjdGl2ZV9iaXRtYXA7Ci19Ci0KLXM4IHdsY19waHlfc3RmX3NzbW9kZV9nZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCwgY2hhbnNwZWNfdCBjaGFuc3BlYykKLXsKLQlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBpaDsKLQl1OCBzaXNvX21jc19pZCwgY2RkX21jc19pZDsKLQotCXNpc29fbWNzX2lkID0KLQkgICAgKENIU1BFQ19JUzQwKGNoYW5zcGVjKSkgPyBUWFBfRklSU1RfTUNTXzQwX1NJU08gOgotCSAgICBUWFBfRklSU1RfTUNTXzIwX1NJU087Ci0JY2RkX21jc19pZCA9Ci0JICAgIChDSFNQRUNfSVM0MChjaGFuc3BlYykpID8gVFhQX0ZJUlNUX01DU180MF9DREQgOgotCSAgICBUWFBfRklSU1RfTUNTXzIwX0NERDsKLQotCWlmIChwaS0+dHhfcG93ZXJfdGFyZ2V0W3Npc29fbWNzX2lkXSA+Ci0JICAgIChwaS0+dHhfcG93ZXJfdGFyZ2V0W2NkZF9tY3NfaWRdICsgMTIpKQotCQlyZXR1cm4gUEhZX1RYQzFfTU9ERV9TSVNPOwotCWVsc2UKLQkJcmV0dXJuIFBIWV9UWEMxX01PREVfQ0REOwotfQotCi1jb25zdCB1OCAqd2xjX3BoeV9nZXRfb2ZkbV9yYXRlX2xvb2t1cCh2b2lkKQotewotCXJldHVybiBvZmRtX3JhdGVfbG9va3VwOwotfQotCi12b2lkIHdsY19sY25waHlfZXBhX3N3aXRjaChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgYm9vbCBtb2RlKQotewotCWlmICgocGktPnNoLT5jaGlwID09IEJDTTQzMTNfQ0hJUF9JRCkgJiYKLQkgICAgKHBpLT5zaC0+Ym9hcmRmbGFncyAmIEJGTF9GRU0pKSB7Ci0JCWlmIChtb2RlKSB7Ci0JCQl1MTYgdHhhbnQgPSAwOwotCQkJdHhhbnQgPSB3bGFwaV9ibWFjX2dldF90eGFudChwaS0+c2gtPnBoeXNoaW0pOwotCQkJaWYgKHR4YW50ID09IDEpIHsKLQkJCQltb2RfcGh5X3JlZyhwaSwgMHg0NGQsICgweDEgPDwgMiksICgxKSA8PCAyKTsKLQotCQkJCW1vZF9waHlfcmVnKHBpLCAweDQ0YywgKDB4MSA8PCAyKSwgKDEpIDw8IDIpOwotCi0JCQl9Ci0JCQlhaV9jb3JlcmVnKHBpLT5zaC0+c2loLCBTSV9DQ19JRFgsCi0JCQkJICAgb2Zmc2V0b2YoY2hpcGNyZWdzX3QsIGdwaW9jb250cm9sKSwgfjB4MCwKLQkJCQkgICAweDApOwotCQkJYWlfY29yZXJlZyhwaS0+c2gtPnNpaCwgU0lfQ0NfSURYLAotCQkJCSAgIG9mZnNldG9mKGNoaXBjcmVnc190LCBncGlvb3V0KSwgMHg0MCwgMHg0MCk7Ci0JCQlhaV9jb3JlcmVnKHBpLT5zaC0+c2loLCBTSV9DQ19JRFgsCi0JCQkJICAgb2Zmc2V0b2YoY2hpcGNyZWdzX3QsIGdwaW9vdXRlbiksIDB4NDAsCi0JCQkJICAgMHg0MCk7Ci0JCX0gZWxzZSB7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHg0NGMsICgweDEgPDwgMiksICgwKSA8PCAyKTsKLQotCQkJbW9kX3BoeV9yZWcocGksIDB4NDRkLCAoMHgxIDw8IDIpLCAoMCkgPDwgMik7Ci0KLQkJCWFpX2NvcmVyZWcocGktPnNoLT5zaWgsIFNJX0NDX0lEWCwKLQkJCQkgICBvZmZzZXRvZihjaGlwY3JlZ3NfdCwgZ3Bpb291dCksIDB4NDAsIDB4MDApOwotCQkJYWlfY29yZXJlZyhwaS0+c2gtPnNpaCwgU0lfQ0NfSURYLAotCQkJCSAgIG9mZnNldG9mKGNoaXBjcmVnc190LCBncGlvb3V0ZW4pLCAweDQwLCAweDApOwotCQkJYWlfY29yZXJlZyhwaS0+c2gtPnNpaCwgU0lfQ0NfSURYLAotCQkJCSAgIG9mZnNldG9mKGNoaXBjcmVnc190LCBncGlvY29udHJvbCksIH4weDAsCi0JCQkJICAgMHg0MCk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBzOAotd2xjX3VzZXJfdHhwd3JfYW50cG9ydF90b19yZnBvcnQoc3RydWN0IGJyY21zX3BoeSAqcGksIHVpbnQgY2hhbiwgdTMyIGJhbmQsCi0JCQkJIHU4IHJhdGUpCi17Ci0Jczggb2Zmc2V0ID0gMDsKLQotCWlmICghcGktPnVzZXJfdHhwd3JfYXRfcmZwb3J0KQotCQlyZXR1cm4gb2Zmc2V0OwotCXJldHVybiBvZmZzZXQ7Ci19Ci0KLXN0YXRpYyBzOCB3bGNfcGh5X2Vudl9tZWFzdXJlX3ZiYXQoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JaWYgKElTTENOUEhZKHBpKSkKLQkJcmV0dXJuIHdsY19sY25waHlfdmJhdHNlbnNlKHBpLCAwKTsKLQllbHNlCi0JCXJldHVybiAwOwotfQotCi1zdGF0aWMgczggd2xjX3BoeV9lbnZfbWVhc3VyZV90ZW1wZXJhdHVyZShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQlpZiAoSVNMQ05QSFkocGkpKQotCQlyZXR1cm4gd2xjX2xjbnBoeV90ZW1wc2Vuc2VfZGVncmVlKHBpLCAwKTsKLQllbHNlCi0JCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3VwZF9lbnZfdHhwd3JfcmF0ZV9saW1pdHMoc3RydWN0IGJyY21zX3BoeSAqcGksIHUzMiBiYW5kKQotewotCXU4IGk7Ci0JczggdGVtcCwgdmJhdDsKLQotCWZvciAoaSA9IDA7IGkgPCBUWFBfTlVNX1JBVEVTOyBpKyspCi0JCXBpLT50eHB3cl9lbnZfbGltaXRbaV0gPSBCUkNNU19UWFBXUl9NQVg7Ci0KLQl2YmF0ID0gd2xjX3BoeV9lbnZfbWVhc3VyZV92YmF0KHBpKTsKLQl0ZW1wID0gd2xjX3BoeV9lbnZfbWVhc3VyZV90ZW1wZXJhdHVyZShwaSk7Ci0KLX0KLQotdm9pZCB3bGNfcGh5X2xkcGNfb3ZlcnJpZGVfc2V0KHN0cnVjdCBicmNtc19waHlfcHViICpwcGksIGJvb2wgbGRwYykKLXsKLQlyZXR1cm47Ci19Ci0KLXZvaWQKLXdsY19waHlfZ2V0X3B3cmRldF9vZmZzZXRzKHN0cnVjdCBicmNtc19waHkgKnBpLCBzOCAqY2Nrb2Zmc2V0LCBzOCAqb2ZkbW9mZnNldCkKLXsKLQkqY2Nrb2Zmc2V0ID0gMDsKLQkqb2ZkbW9mZnNldCA9IDA7Ci19Ci0KLXM4IHdsY19waHlfdXBkX3Jzc2lfb2Zmc2V0KHN0cnVjdCBicmNtc19waHkgKnBpLCBzOCByc3NpLCBjaGFuc3BlY190IGNoYW5zcGVjKQotewotCi0JcmV0dXJuIHJzc2k7Ci19Ci0KLWJvb2wgd2xjX3BoeV90eHBvd2VyX2lwYV9pc29uKHN0cnVjdCBicmNtc19waHlfcHViICpwcGkpCi17Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwcGk7Ci0KLQlpZiAoSVNOUEhZKHBpKSkKLQkJcmV0dXJuIHdsY19waHlfbl90eHBvd2VyX2lwYV9pc29uKHBpKTsKLQllbHNlCi0JCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2hhbC5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2hhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjdkOWU5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9oYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotLyoKLSAqIHBoeV9oYWwuaDogIGZ1bmN0aW9uYWxpdHkgZXhwb3J0ZWQgZnJvbSB0aGUgcGh5IHRvIGhpZ2hlciBsYXllcnMKLSAqLwotCi0jaWZuZGVmIF9CUkNNX1BIWV9IQUxfSF8KLSNkZWZpbmUgX0JSQ01fUEhZX0hBTF9IXwotCi0jaW5jbHVkZSA8YnJjbXVfdXRpbHMuaD4KLSNpbmNsdWRlIDxicmNtdV93aWZpLmg+Ci0jaW5jbHVkZSA8cGh5X3NoaW0uaD4KLQotI2RlZmluZQlJRENPREVfVkVSX01BU0sJCTB4MDAwMDAwMGYKLSNkZWZpbmUJSURDT0RFX1ZFUl9TSElGVAkwCi0jZGVmaW5lCUlEQ09ERV9NRkdfTUFTSwkJMHgwMDAwMGZmZgotI2RlZmluZQlJRENPREVfTUZHX1NISUZUCTAKLSNkZWZpbmUJSURDT0RFX0lEX01BU0sJCTB4MGZmZmYwMDAKLSNkZWZpbmUJSURDT0RFX0lEX1NISUZUCQkxMgotI2RlZmluZQlJRENPREVfUkVWX01BU0sJCTB4ZjAwMDAwMDAKLSNkZWZpbmUJSURDT0RFX1JFVl9TSElGVAkyOAotCi0jZGVmaW5lCU5PUkFESU9fSUQJCTB4ZTRmNQotI2RlZmluZQlOT1JBRElPX0lEQ09ERQkJMHg0ZTRmNTI0NgotCi0jZGVmaW5lIEJDTTIwNTVfSUQJCTB4MjA1NQotI2RlZmluZSBCQ00yMDU1X0lEQ09ERQkJMHgwMjA1NTAwMAotI2RlZmluZSBCQ00yMDU1QTBfSURDT0RFCTB4MTIwNTUxN2YKLQotI2RlZmluZSBCQ00yMDU2X0lECQkweDIwNTYKLSNkZWZpbmUgQkNNMjA1Nl9JRENPREUJCTB4MDIwNTYwMDAKLSNkZWZpbmUgQkNNMjA1NkEwX0lEQ09ERQkweDEyMDU2MTdmCi0KLSNkZWZpbmUgQkNNMjA1N19JRAkJMHgyMDU3Ci0jZGVmaW5lIEJDTTIwNTdfSURDT0RFCQkweDAyMDU3MDAwCi0jZGVmaW5lIEJDTTIwNTdBMF9JRENPREUJMHgxMjA1NzE3ZgotCi0jZGVmaW5lIEJDTTIwNjRfSUQJCTB4MjA2NAotI2RlZmluZSBCQ00yMDY0X0lEQ09ERQkJMHgwMjA2NDAwMAotI2RlZmluZSBCQ00yMDY0QTBfSURDT0RFCTB4MDIwNjQxN2YKLQotI2RlZmluZSBQSFlfVFBDX0hXX09GRgkJZmFsc2UKLSNkZWZpbmUgUEhZX1RQQ19IV19PTgkJdHJ1ZQotCi0jZGVmaW5lIFBIWV9QRVJJQ0FMX0RSSVZFUlVQCTEKLSNkZWZpbmUgUEhZX1BFUklDQUxfV0FUQ0hET0cJMgotI2RlZmluZSBQSFlfUEVSSUNBTF9QSFlJTklUCTMKLSNkZWZpbmUgUEhZX1BFUklDQUxfSk9JTl9CU1MJNAotI2RlZmluZSBQSFlfUEVSSUNBTF9TVEFSVF9JQlNTCTUKLSNkZWZpbmUgUEhZX1BFUklDQUxfVVBfQlNTCTYKLSNkZWZpbmUgUEhZX1BFUklDQUxfQ0hBTgk3Ci0jZGVmaW5lIFBIWV9GVUxMQ0FMCTgKLQotI2RlZmluZSBQSFlfUEVSSUNBTF9ESVNBQkxFCTAKLSNkZWZpbmUgUEhZX1BFUklDQUxfU1BIQVNFCTEKLSNkZWZpbmUgUEhZX1BFUklDQUxfTVBIQVNFCTIKLSNkZWZpbmUgUEhZX1BFUklDQUxfTUFOVUFMCTMKLQotI2RlZmluZSBQSFlfSE9MRF9GT1JfQVNTT0MJMQotI2RlZmluZSBQSFlfSE9MRF9GT1JfU0NBTgkyCi0jZGVmaW5lIFBIWV9IT0xEX0ZPUl9STQkJNAotI2RlZmluZSBQSFlfSE9MRF9GT1JfUExUCTgKLSNkZWZpbmUgUEhZX0hPTERfRk9SX01VVEUJMTYKLSNkZWZpbmUgUEhZX0hPTERfRk9SX05PVF9BU1NPQyAweDIwCi0KLSNkZWZpbmUgUEhZX01VVEVfRk9SX1BSRUlTTQkxCi0jZGVmaW5lIFBIWV9NVVRFX0FMTAkJMHhmZmZmZmZmZgotCi0jZGVmaW5lIFBIWV9OT0lTRV9GSVhFRF9WQUwJCSgtOTUpCi0jZGVmaW5lIFBIWV9OT0lTRV9GSVhFRF9WQUxfTlBIWQkoLTkyKQotI2RlZmluZSBQSFlfTk9JU0VfRklYRURfVkFMX0xDTlBIWQkoLTkyKQotCi0jZGVmaW5lIFBIWV9NT0RFX0NBTAkJMHgwMDAyCi0jZGVmaW5lIFBIWV9NT0RFX05PSVNFTQkJMHgwMDA0Ci0KLSNkZWZpbmUgQlJDTVNfVFhQV1JfREJfRkFDVE9SCTQKLQotLyogYSBsYXJnZSBUWCBQb3dlciBhcyBhbiBpbml0IHZhbHVlIHRvIGZhY3RvciBvdXQgb2YgbWluKCkgY2FsY3VsYXRpb25zLAotICoga2VlcCBsb3cgZW5vdWdoIHRvIGZpdCBpbiBhbiBzOCwgdW5pdHMgYXJlIC4yNSBkQm0KLSAqLwotI2RlZmluZSBCUkNNU19UWFBXUl9NQVgJCSgxMjcpCS8qIH4zMiBkQm0gPSAxLDUwMCBtVyAqLwotCi0jZGVmaW5lIEJSQ01TX05VTV9SQVRFU19DQ0sgICAgICAgICAgIDQKLSNkZWZpbmUgQlJDTVNfTlVNX1JBVEVTX09GRE0gICAgICAgICAgOAotI2RlZmluZSBCUkNNU19OVU1fUkFURVNfTUNTXzFfU1RSRUFNICA4Ci0jZGVmaW5lIEJSQ01TX05VTV9SQVRFU19NQ1NfMl9TVFJFQU0gIDgKLSNkZWZpbmUgQlJDTVNfTlVNX1JBVEVTX01DU18zX1NUUkVBTSAgOAotI2RlZmluZSBCUkNNU19OVU1fUkFURVNfTUNTXzRfU1RSRUFNICA4Ci0KLSNkZWZpbmUJQlJDTVNfUlNTSV9JTlZBTElECSAwCS8qIGludmFsaWQgUlNTSSB2YWx1ZSAqLwotCi1zdHJ1Y3QgdHhwd3JfbGltaXRzIHsKLQl1OCBjY2tbQlJDTVNfTlVNX1JBVEVTX0NDS107Ci0JdTggb2ZkbVtCUkNNU19OVU1fUkFURVNfT0ZETV07Ci0KLQl1OCBvZmRtX2NkZFtCUkNNU19OVU1fUkFURVNfT0ZETV07Ci0KLQl1OCBvZmRtXzQwX3Npc29bQlJDTVNfTlVNX1JBVEVTX09GRE1dOwotCXU4IG9mZG1fNDBfY2RkW0JSQ01TX05VTV9SQVRFU19PRkRNXTsKLQotCXU4IG1jc18yMF9zaXNvW0JSQ01TX05VTV9SQVRFU19NQ1NfMV9TVFJFQU1dOwotCXU4IG1jc18yMF9jZGRbQlJDTVNfTlVNX1JBVEVTX01DU18xX1NUUkVBTV07Ci0JdTggbWNzXzIwX3N0YmNbQlJDTVNfTlVNX1JBVEVTX01DU18xX1NUUkVBTV07Ci0JdTggbWNzXzIwX21pbW9bQlJDTVNfTlVNX1JBVEVTX01DU18yX1NUUkVBTV07Ci0KLQl1OCBtY3NfNDBfc2lzb1tCUkNNU19OVU1fUkFURVNfTUNTXzFfU1RSRUFNXTsKLQl1OCBtY3NfNDBfY2RkW0JSQ01TX05VTV9SQVRFU19NQ1NfMV9TVFJFQU1dOwotCXU4IG1jc180MF9zdGJjW0JSQ01TX05VTV9SQVRFU19NQ1NfMV9TVFJFQU1dOwotCXU4IG1jc180MF9taW1vW0JSQ01TX05VTV9SQVRFU19NQ1NfMl9TVFJFQU1dOwotCXU4IG1jczMyOwotfTsKLQotc3RydWN0IHR4X3Bvd2VyIHsKLQl1MzIgZmxhZ3M7Ci0JY2hhbnNwZWNfdCBjaGFuc3BlYzsJLyogdHhwd3IgcmVwb3J0IGZvciB0aGlzIGNoYW5uZWwgKi8KLQljaGFuc3BlY190IGxvY2FsX2NoYW5zcGVjOwkvKiBjaGFubmVsIG9uIHdoaWNoIHdlIGFyZSBhc3NvY2lhdGVkICovCi0JdTggbG9jYWxfbWF4OwkvKiBsb2NhbCBtYXggYWNjb3JkaW5nIHRvIHRoZSBBUCAqLwotCXU4IGxvY2FsX2NvbnN0cmFpbnQ7CS8qIGxvY2FsIGNvbnN0cmFpbnQgYWNjb3JkaW5nIHRvIHRoZSBBUCAqLwotCXM4IGFudGdhaW5bMl07CS8qIEFudCBnYWluIGZvciBlYWNoIGJhbmQgLSBmcm9tIFNST00gKi8KLQl1OCByZl9jb3JlczsJCS8qIGNvdW50IG9mIFJGIENvcmVzIGJlaW5nIHJlcG9ydGVkICovCi0JdTggZXN0X1BvdXRbNF07CS8qIExhdGVzdCB0eCBwb3dlciBvdXQgZXN0aW1hdGUgcGVyIFJGIGNoYWluICovCi0JdTggZXN0X1BvdXRfYWN0WzRdOwkvKiBMYXRlc3QgdHggcG93ZXIgb3V0IGVzdGltYXRlIHBlciBSRiBjaGFpbgotCQkJCSAqIHdpdGhvdXQgYWRqdXN0bWVudAotCQkJCSAqLwotCXU4IGVzdF9Qb3V0X2NjazsJLyogTGF0ZXN0IENDSyB0eCBwb3dlciBvdXQgZXN0aW1hdGUgKi8KLQl1OCB0eF9wb3dlcl9tYXhbNF07CS8qIE1heGltdW0gdGFyZ2V0IHBvd2VyIGFtb25nIGFsbCByYXRlcyAqLwotCXU4IHR4X3Bvd2VyX21heF9yYXRlX2luZFs0XTsJLyogSW5kZXggb2YgdGhlIHJhdGUgd2l0aCB0aGUgbWF4IHRhcmdldCBwb3dlciAqLwotCXU4IHVzZXJfbGltaXRbV0xfVFhfUE9XRVJfUkFURVNdOwkvKiBVc2VyIGxpbWl0ICovCi0JdTggcmVnX2xpbWl0W1dMX1RYX1BPV0VSX1JBVEVTXTsJLyogUmVndWxhdG9yeSBwb3dlciBsaW1pdCAqLwotCXU4IGJvYXJkX2xpbWl0W1dMX1RYX1BPV0VSX1JBVEVTXTsJLyogTWF4IHBvd2VyIGJvYXJkIGNhbiBzdXBwb3J0IChTUk9NKSAqLwotCXU4IHRhcmdldFtXTF9UWF9QT1dFUl9SQVRFU107CS8qIExhdGVzdCB0YXJnZXQgcG93ZXIgKi8KLX07Ci0KLXN0cnVjdCB0eF9pbnN0X3Bvd2VyIHsKLQl1OCB0eHB3cl9lc3RfUG91dFsyXTsJLyogTGF0ZXN0IGVzdGltYXRlIGZvciAyLjQgYW5kIDUgR2h6ICovCi0JdTggdHhwd3JfZXN0X1BvdXRfZ29mZG07CS8qIFB3ciBlc3RpbWF0ZSBmb3IgMi40IE9GRE0gKi8KLX07Ci0KLXN0cnVjdCBjaGFudmVjIHsKLQl1OCB2ZWNbTUFYQ0hBTk5FTCAvIE5CQlldOwotfTsKLQotc3RydWN0IHNoYXJlZF9waHlfcGFyYW1zIHsKLQlzdHJ1Y3Qgc2lfcHViICpzaWg7Ci0Jdm9pZCAqcGh5c2hpbTsKLQl1aW50IHVuaXQ7Ci0JdWludCBjb3JlcmV2OwotCXVpbnQgYnVzdHlwZTsKLQl1aW50IGJ1c2NvcmVyZXY7Ci0JY2hhciAqdmFyczsKLQl1MTYgdmlkOwotCXUxNiBkaWQ7Ci0JdWludCBjaGlwOwotCXVpbnQgY2hpcHJldjsKLQl1aW50IGNoaXBwa2c7Ci0JdWludCBzcm9tcmV2OwotCXVpbnQgYm9hcmR0eXBlOwotCXVpbnQgYm9hcmRyZXY7Ci0JdWludCBib2FyZHZlbmRvcjsKLQl1MzIgYm9hcmRmbGFnczsKLQl1MzIgYm9hcmRmbGFnczI7Ci19OwotCi0KLWV4dGVybiBzdHJ1Y3Qgc2hhcmVkX3BoeSAqd2xjX3BoeV9zaGFyZWRfYXR0YWNoKHN0cnVjdCBzaGFyZWRfcGh5X3BhcmFtcyAqc2hwKTsKLWV4dGVybiBzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqd2xjX3BoeV9hdHRhY2goc3RydWN0IHNoYXJlZF9waHkgKnNoLCB2b2lkICpyZWdzLAotCQkJCSBpbnQgYmFuZHR5cGUsIGNoYXIgKnZhcnMsIHN0cnVjdCB3aXBoeSAqd2lwaHkpOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV9kZXRhY2goc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSk7Ci0KLWV4dGVybiBib29sIHdsY19waHlfZ2V0X3BoeXZlcnNpb24oc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCwgdTE2ICpwaHl0eXBlLAotCQkJCSAgIHUxNiAqcGh5cmV2LCB1MTYgKnJhZGlvaWQsCi0JCQkJICAgdTE2ICpyYWRpb3Zlcik7Ci1leHRlcm4gYm9vbCB3bGNfcGh5X2dldF9lbmNvcmUoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCk7Ci1leHRlcm4gdTMyIHdsY19waHlfZ2V0X2NvcmVmbGFncyhzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcGloKTsKLQotZXh0ZXJuIHZvaWQgd2xjX3BoeV9od19jbGtfc3RhdGVfdXBkKHN0cnVjdCBicmNtc19waHlfcHViICpwcGksIGJvb2wgbmV3c3RhdGUpOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV9od19zdGF0ZV91cGQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwgYm9vbCBuZXdzdGF0ZSk7Ci1leHRlcm4gdm9pZCB3bGNfcGh5X2luaXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwgY2hhbnNwZWNfdCBjaGFuc3BlYyk7Ci1leHRlcm4gdm9pZCB3bGNfcGh5X3dhdGNoZG9nKHN0cnVjdCBicmNtc19waHlfcHViICpwcGkpOwotZXh0ZXJuIGludCB3bGNfcGh5X2Rvd24oc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSk7Ci1leHRlcm4gdTMyIHdsY19waHlfY2xrX2J3Yml0cyhzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcGloKTsKLWV4dGVybiB2b2lkIHdsY19waHlfY2FsX2luaXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSk7Ci1leHRlcm4gdm9pZCB3bGNfcGh5X2FudHNlbF9pbml0KHN0cnVjdCBicmNtc19waHlfcHViICpwcGksIGJvb2wgbHV0X2luaXQpOwotCi1leHRlcm4gdm9pZCB3bGNfcGh5X2NoYW5zcGVjX3NldChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcHBpLAotCQkJCSBjaGFuc3BlY190IGNoYW5zcGVjKTsKLWV4dGVybiBjaGFuc3BlY190IHdsY19waHlfY2hhbnNwZWNfZ2V0KHN0cnVjdCBicmNtc19waHlfcHViICpwcGkpOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV9jaGFuc3BlY19yYWRpb19zZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwKLQkJCQkgICAgICAgY2hhbnNwZWNfdCBuZXdjaCk7Ci1leHRlcm4gdTE2IHdsY19waHlfYndfc3RhdGVfZ2V0KHN0cnVjdCBicmNtc19waHlfcHViICpwcGkpOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV9id19zdGF0ZV9zZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwgdTE2IGJ3KTsKLQotZXh0ZXJuIHZvaWQgd2xjX3BoeV9yc3NpX2NvbXB1dGUoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCwgdm9pZCAqY3R4KTsKLWV4dGVybiB2b2lkIHdsY19waHlfcG9yX2luZm9ybShzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcHBpKTsKLWV4dGVybiB2b2lkIHdsY19waHlfbm9pc2Vfc2FtcGxlX2ludHIoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSk7Ci1leHRlcm4gYm9vbCB3bGNfcGh5X2Jpc3RfY2hlY2tfcGh5KHN0cnVjdCBicmNtc19waHlfcHViICpwcGkpOwotCi1leHRlcm4gdm9pZCB3bGNfcGh5X3NldF9kZWFmKHN0cnVjdCBicmNtc19waHlfcHViICpwcGksIGJvb2wgdXNlcl9mbGFnKTsKLQotZXh0ZXJuIHZvaWQgd2xjX3BoeV9zd2l0Y2hfcmFkaW8oc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwgYm9vbCBvbik7Ci1leHRlcm4gdm9pZCB3bGNfcGh5X2FuYWNvcmUoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwgYm9vbCBvbik7Ci0KLQotZXh0ZXJuIHZvaWQgd2xjX3BoeV9CU1Npbml0KHN0cnVjdCBicmNtc19waHlfcHViICpwcGksIGJvb2wgYm9ubHlhcCwgaW50IHJzc2kpOwotCi1leHRlcm4gdm9pZCB3bGNfcGh5X2NoYW5zcGVjX2NoMTRfd2lkZWZpbHRlcl9zZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwKLQkJCQkJCSBib29sIHdpZGVfZmlsdGVyKTsKLWV4dGVybiB2b2lkIHdsY19waHlfY2hhbnNwZWNfYmFuZF92YWxpZGNoKHN0cnVjdCBicmNtc19waHlfcHViICpwcGksIHVpbnQgYmFuZCwKLQkJCQkJICBjaGFudmVjX3QgKmNoYW5uZWxzKTsKLWV4dGVybiBjaGFuc3BlY190IHdsY19waHlfY2hhbnNwZWNfYmFuZF9maXJzdGNoKHN0cnVjdCBicmNtc19waHlfcHViICpwcGksCi0JCQkJCQl1aW50IGJhbmQpOwotCi1leHRlcm4gdm9pZCB3bGNfcGh5X3R4cG93ZXJfc3JvbWxpbWl0KHN0cnVjdCBicmNtc19waHlfcHViICpwcGksIHVpbnQgY2hhbiwKLQkJCQkgICAgICB1OCAqX21pbl8sIHU4ICpfbWF4XywgaW50IHJhdGUpOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV90eHBvd2VyX3Nyb21saW1pdF9tYXhfZ2V0KHN0cnVjdCBicmNtc19waHlfcHViICpwcGksCi0JCQkJCSAgICAgIHVpbnQgY2hhbiwgdTggKl9tYXhfLCB1OCAqX21pbl8pOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV90eHBvd2VyX2JvYXJkbGltaXRfYmFuZChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcHBpLAotCQkJCQkgICAgdWludCBiYW5kLCBzMzIgKiwgczMyICosIHUzMiAqKTsKLWV4dGVybiB2b2lkIHdsY19waHlfdHhwb3dlcl9saW1pdF9zZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwKLQkJCQkgICAgICBzdHJ1Y3QgdHhwd3JfbGltaXRzICosCi0JCQkJICAgICAgY2hhbnNwZWNfdCBjaGFuc3BlYyk7Ci1leHRlcm4gaW50IHdsY19waHlfdHhwb3dlcl9nZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwgdWludCAqcWRibSwKLQkJCSAgICAgICBib29sICpvdmVycmlkZSk7Ci1leHRlcm4gaW50IHdsY19waHlfdHhwb3dlcl9zZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwgdWludCBxZGJtLAotCQkJICAgICAgIGJvb2wgb3ZlcnJpZGUpOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV90eHBvd2VyX3RhcmdldF9zZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwKLQkJCQkgICAgICAgc3RydWN0IHR4cHdyX2xpbWl0cyAqKTsKLWV4dGVybiBib29sIHdsY19waHlfdHhwb3dlcl9od19jdHJsX2dldChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcHBpKTsKLWV4dGVybiB2b2lkIHdsY19waHlfdHhwb3dlcl9od19jdHJsX3NldChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcHBpLAotCQkJCQlib29sIGh3cHdyY3RybCk7Ci1leHRlcm4gdTggd2xjX3BoeV90eHBvd2VyX2dldF90YXJnZXRfbWluKHN0cnVjdCBicmNtc19waHlfcHViICpwcGkpOwotZXh0ZXJuIHU4IHdsY19waHlfdHhwb3dlcl9nZXRfdGFyZ2V0X21heChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcHBpKTsKLWV4dGVybiBib29sIHdsY19waHlfdHhwb3dlcl9pcGFfaXNvbihzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcGloKTsKLQotZXh0ZXJuIHZvaWQgd2xjX3BoeV9zdGZfY2hhaW5faW5pdChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcGloLCB1OCB0eGNoYWluLAotCQkJCSAgIHU4IHJ4Y2hhaW4pOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV9zdGZfY2hhaW5fc2V0KHN0cnVjdCBicmNtc19waHlfcHViICpwaWgsIHU4IHR4Y2hhaW4sCi0JCQkJICB1OCByeGNoYWluKTsKLWV4dGVybiB2b2lkIHdsY19waHlfc3RmX2NoYWluX2dldChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcGloLCB1OCAqdHhjaGFpbiwKLQkJCQkgIHU4ICpyeGNoYWluKTsKLWV4dGVybiB1OCB3bGNfcGh5X3N0Zl9jaGFpbl9hY3RpdmVfZ2V0KHN0cnVjdCBicmNtc19waHlfcHViICpwaWgpOwotZXh0ZXJuIHM4IHdsY19waHlfc3RmX3NzbW9kZV9nZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCwKLQkJCQkgY2hhbnNwZWNfdCBjaGFuc3BlYyk7Ci1leHRlcm4gdm9pZCB3bGNfcGh5X2xkcGNfb3ZlcnJpZGVfc2V0KHN0cnVjdCBicmNtc19waHlfcHViICpwcGksIGJvb2wgdmFsKTsKLQotZXh0ZXJuIHZvaWQgd2xjX3BoeV9jYWxfcGVyaWNhbChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcHBpLCB1OCByZWFzb24pOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV9ub2lzZV9zYW1wbGVfcmVxdWVzdF9leHRlcm5hbChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcHBpKTsKLWV4dGVybiB2b2lkIHdsY19waHlfZWRjcnNfbG9jayhzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcGloLCBib29sIGxvY2spOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV9jYWxfcGFwZF9yZWNhbChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcHBpKTsKLQotZXh0ZXJuIHZvaWQgd2xjX3BoeV9hbnRfcnhkaXZfc2V0KHN0cnVjdCBicmNtc19waHlfcHViICpwcGksIHU4IHZhbCk7Ci1leHRlcm4gdm9pZCB3bGNfcGh5X2NsZWFyX3Rzc2koc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSk7Ci1leHRlcm4gdm9pZCB3bGNfcGh5X2hvbGRfdXBkKHN0cnVjdCBicmNtc19waHlfcHViICpwcGksIG1ib29sIGlkLCBib29sIHZhbCk7Ci1leHRlcm4gdm9pZCB3bGNfcGh5X211dGVfdXBkKHN0cnVjdCBicmNtc19waHlfcHViICpwcGksIGJvb2wgdmFsLCBtYm9vbCBmbGFncyk7Ci0KLWV4dGVybiB2b2lkIHdsY19waHlfYW50c2VsX3R5cGVfc2V0KHN0cnVjdCBicmNtc19waHlfcHViICpwcGksIHU4IGFudHNlbF90eXBlKTsKLQotZXh0ZXJuIHZvaWQgd2xjX3BoeV90eHBvd2VyX2dldF9jdXJyZW50KHN0cnVjdCBicmNtc19waHlfcHViICpwcGksCi0JCQkJCXN0cnVjdCB0eF9wb3dlciAqcG93ZXIsIHVpbnQgY2hhbm5lbCk7Ci0KLWV4dGVybiB2b2lkIHdsY19waHlfaW5pdGNhbF9lbmFibGUoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCwgYm9vbCBpbml0Y2FsKTsKLWV4dGVybiBib29sIHdsY19waHlfdGVzdF9pc29uKHN0cnVjdCBicmNtc19waHlfcHViICpwcGkpOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV90eHB3cl9wZXJjZW50X3NldChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcHBpLAotCQkJCSAgICAgIHU4IHR4cHdyX3BlcmNlbnQpOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV9vZmRtX3JhdGVzZXRfd2FyKHN0cnVjdCBicmNtc19waHlfcHViICpwaWgsIGJvb2wgd2FyKTsKLWV4dGVybiB2b2lkIHdsY19waHlfYmZfcHJlZW1wdF9lbmFibGUoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCwKLQkJCQkgICAgICBib29sIGJmX3ByZWVtcHQpOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV9tYWNod2NhcF9zZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwgdTMyIG1hY2h3Y2FwKTsKLQotZXh0ZXJuIHZvaWQgd2xjX3BoeV9ydW5iaXN0X2NvbmZpZyhzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcHBpLCBib29sIHN0YXJ0X2VuZCk7Ci0KLWV4dGVybiB2b2lkIHdsY19waHlfZnJlcXRyYWNrX3N0YXJ0KHN0cnVjdCBicmNtc19waHlfcHViICpwcGkpOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV9mcmVxdHJhY2tfZW5kKHN0cnVjdCBicmNtc19waHlfcHViICpwcGkpOwotCi1leHRlcm4gY29uc3QgdTggKndsY19waHlfZ2V0X29mZG1fcmF0ZV9sb29rdXAodm9pZCk7Ci0KLWV4dGVybiBzOCB3bGNfcGh5X2dldF90eF9wb3dlcl9vZmZzZXRfYnlfbWNzKHN0cnVjdCBicmNtc19waHlfcHViICpwcGksCi0JCQkJCSAgICAgICB1OCBtY3Nfb2Zmc2V0KTsKLWV4dGVybiBzOCB3bGNfcGh5X2dldF90eF9wb3dlcl9vZmZzZXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSwgdTggdGJsX29mZnNldCk7Ci0jZW5kaWYJCQkJLyogX0JSQ01fUEhZX0hBTF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2ludC5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDFiMDFjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9pbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYgX0JSQ01fUEhZX0lOVF9IXwotI2RlZmluZSBfQlJDTV9QSFlfSU5UX0hfCi0KLSNpbmNsdWRlIDx0eXBlcy5oPgotI2luY2x1ZGUgPGJyY211X3V0aWxzLmg+Ci0jaW5jbHVkZSA8YnJjbXVfd2lmaS5oPgotCi0jZGVmaW5lCVBIWV9WRVJTSU9OCQkJeyAxLCA4MiwgOCwgMCB9Ci0KLSNkZWZpbmUgUEhZSEFMX0VSUk9SCTB4MDAwMQotI2RlZmluZSBQSFlIQUxfVFJBQ0UJMHgwMDAyCi0jZGVmaW5lIFBIWUhBTF9JTkZPUk0JMHgwMDA0Ci0KLWV4dGVybiB1MzIgcGh5aGFsX21zZ19sZXZlbDsKLQotI2RlZmluZSBQSFlfSU5GT1JNX09OKCkJCShwaHloYWxfbXNnX2xldmVsICYgUEhZSEFMX0lORk9STSkKLSNkZWZpbmUgUEhZX1RIRVJNQUxfT04oKQkocGh5aGFsX21zZ19sZXZlbCAmIFBIWUhBTF9USEVSTUFMKQotI2RlZmluZSBQSFlfQ0FMX09OKCkJCShwaHloYWxfbXNnX2xldmVsICYgUEhZSEFMX0NBTCkKLQotI2lmZGVmIEJPQVJEX1RZUEUKLSNkZWZpbmUgQk9BUkRUWVBFKF90eXBlKSBCT0FSRF9UWVBFCi0jZWxzZQotI2RlZmluZSBCT0FSRFRZUEUoX3R5cGUpIF90eXBlCi0jZW5kaWYKLQotI2RlZmluZSBMQ05YTl9CQVNFUkVWCQkxNgotCi1zdHJ1Y3QgYnJjbXNfcGh5X3Nyb21fZmVtIHsKLQl1OCB0c3NpcG9zOwkJLyogVFNTSSBwb3NpdGl2ZSBzbG9wZSwgMTogcG9zaXRpdmUsIDA6IG5lZ2F0aXZlICovCi0JdTggZXh0cGFnYWluOwkvKiBFeHQgUEEgZ2Fpbi10eXBlOiBmdWxsLWdhaW46IDAsIHBhLWxpdGU6IDEsIG5vX3BhOiAyICovCi0JdTggcGRldHJhbmdlOwkvKiBzdXBwb3J0IDMyIGNvbWJpbmF0aW9ucyBvZiBkaWZmZXJlbnQgUGRldCBkeW5hbWljIHJhbmdlcyAqLwotCXU4IHRyaXNvOwkJLyogVFIgc3dpdGNoIGlzb2xhdGlvbiAqLwotCXU4IGFudHN3Y3RybGx1dDsJLyogYW50c3djdHJsIGxvb2t1cCB0YWJsZSBjb25maWd1cmF0aW9uOiAzMiBwb3NzaWJsZSBjaG9pY2VzICovCi19OwotCi10eXBlZGVmIHZvaWQgKCppbml0Zm5fdCkgKHN0cnVjdCBicmNtc19waHkgKik7Ci10eXBlZGVmIHZvaWQgKCpjaGFuc2V0Zm5fdCkgKHN0cnVjdCBicmNtc19waHkgKiwgY2hhbnNwZWNfdCk7Ci10eXBlZGVmIGludCAoKmxvbmd0cm5mbl90KSAoc3RydWN0IGJyY21zX3BoeSAqLCBpbnQpOwotdHlwZWRlZiB2b2lkICgqdHhpcWNjZ2V0Zm5fdCkgKHN0cnVjdCBicmNtc19waHkgKiwgdTE2ICosIHUxNiAqKTsKLXR5cGVkZWYgdm9pZCAoKnR4aXFjY3NldGZuX3QpIChzdHJ1Y3QgYnJjbXNfcGh5ICosIHUxNiwgdTE2KTsKLXR5cGVkZWYgdTE2KCp0eGxvY2NnZXRmbl90KSAoc3RydWN0IGJyY21zX3BoeSAqKTsKLXR5cGVkZWYgdm9pZCAoKnJhZGlvbG9mdGdldGZuX3QpIChzdHJ1Y3QgYnJjbXNfcGh5ICosIHU4ICosIHU4ICosIHU4ICosCi0JCQkJICB1OCAqKTsKLXR5cGVkZWYgczMyKCpyeHNpZ3B3cmZuX3QpIChzdHJ1Y3QgYnJjbXNfcGh5ICosIHMzMik7Ci10eXBlZGVmIHZvaWQgKCpkZXRhY2hmbl90KSAoc3RydWN0IGJyY21zX3BoeSAqKTsKLQotI3VuZGVmIElTTlBIWQotI3VuZGVmIElTTENOUEhZCi0jZGVmaW5lIElTTlBIWShwaSkJUEhZVFlQRV9JUygocGkpLT5wdWJwaS5waHlfdHlwZSwgUEhZX1RZUEVfTikKLSNkZWZpbmUgSVNMQ05QSFkocGkpCVBIWVRZUEVfSVMoKHBpKS0+cHVicGkucGh5X3R5cGUsIFBIWV9UWVBFX0xDTikKLQotI2RlZmluZSBJU1BIWV8xMU5fQ0FQKHBpKQkoSVNOUEhZKHBpKSB8fCBJU0xDTlBIWShwaSkpCi0KLSNkZWZpbmUgSVMyME1IWihwaSkJKChwaSktPmJ3ID09IFdMX0NIQU5TUEVDX0JXXzIwKQotI2RlZmluZSBJUzQwTUhaKHBpKQkoKHBpKS0+YncgPT0gV0xfQ0hBTlNQRUNfQldfNDApCi0KLSNkZWZpbmUgUEhZX0dFVF9SRkFUVE4ocmZnYWluKQkoKHJmZ2FpbikgJiAweDBmKQotI2RlZmluZSBQSFlfR0VUX1BBRE1JWChyZmdhaW4pCSgoKHJmZ2FpbikgJiAweDEwKSA+PiA0KQotI2RlZmluZSBQSFlfR0VUX1JGR0FJTklEKHJmYXR0biwgcGFkbWl4LCB3aWR0aCkJKChyZmF0dG4pICsgKChwYWRtaXgpKih3aWR0aCkpKQotI2RlZmluZSBQSFlfU0FUKHgsIG4pCQkoKHgpID4gKCgxPDwoKG4pLTEpKS0xKSA/ICgoMTw8KChuKS0xKSktMSkgOiBcCi0JCQkJKCh4KSA8IC0oMTw8KChuKS0xKSkgPyAtKDE8PCgobiktMSkpIDogKHgpKSkKLSNkZWZpbmUgUEhZX1NISUZUX1JPVU5EKHgsIG4pCSgoeCkgPj0gMCA/ICgoeCkrKDE8PCgobiktMSkpKT4+KG4pIDogKHgpPj4obikpCi0jZGVmaW5lIFBIWV9IV19ST1VORCh4LCBzKQkJKCh4ID4+IHMpICsgKCh4ID4+IChzLTEpKSAmIChzICE9IDApKSkKLQotI2RlZmluZSBDSF81R19HUk9VUAkzCi0jZGVmaW5lIEFfTE9XX0NIQU5TCTAKLSNkZWZpbmUgQV9NSURfQ0hBTlMJMQotI2RlZmluZSBBX0hJR0hfQ0hBTlMJMgotI2RlZmluZSBDSF8yR19HUk9VUAkxCi0jZGVmaW5lIEdfQUxMX0NIQU5TCTAKLQotI2RlZmluZSBGSVJTVF9SRUY1X0NIQU5OVU0JMTQ5Ci0jZGVmaW5lIExBU1RfUkVGNV9DSEFOTlVNCTE2NQotI2RlZmluZQlGSVJTVF81R19DSEFOCQkxNAotI2RlZmluZQlMQVNUXzVHX0NIQU4JCTUwCi0jZGVmaW5lCUZJUlNUX01JRF81R19DSEFOCTE0Ci0jZGVmaW5lCUxBU1RfTUlEXzVHX0NIQU4JMzUKLSNkZWZpbmUJRklSU1RfSElHSF81R19DSEFOCTM2Ci0jZGVmaW5lCUxBU1RfSElHSF81R19DSEFOCTQxCi0jZGVmaW5lCUZJUlNUX0xPV181R19DSEFOCTQyCi0jZGVmaW5lCUxBU1RfTE9XXzVHX0NIQU4JNTAKLQotI2RlZmluZSBCQVNFX0xPV181R19DSEFOCTQ5MDAKLSNkZWZpbmUgQkFTRV9NSURfNUdfQ0hBTgk1MTAwCi0jZGVmaW5lIEJBU0VfSElHSF81R19DSEFOCTU1MDAKLQotI2RlZmluZSBDSEFONUdfRlJFUShjaGFuKSAgKDUwMDAgKyBjaGFuKjUpCi0jZGVmaW5lIENIQU4yR19GUkVRKGNoYW4pICAoMjQwNyArIGNoYW4qNSkKLQotI2RlZmluZSBUWFBfRklSU1RfQ0NLCQkwCi0jZGVmaW5lIFRYUF9MQVNUX0NDSwkJMwotI2RlZmluZSBUWFBfRklSU1RfT0ZETQkJNAotI2RlZmluZSBUWFBfTEFTVF9PRkRNCQkxMQotI2RlZmluZSBUWFBfRklSU1RfT0ZETV8yMF9DREQJMTIKLSNkZWZpbmUgVFhQX0xBU1RfT0ZETV8yMF9DREQJMTkKLSNkZWZpbmUgVFhQX0ZJUlNUX01DU18yMF9TSVNPCTIwCi0jZGVmaW5lIFRYUF9MQVNUX01DU18yMF9TSVNPCTI3Ci0jZGVmaW5lIFRYUF9GSVJTVF9NQ1NfMjBfQ0RECTI4Ci0jZGVmaW5lIFRYUF9MQVNUX01DU18yMF9DREQJMzUKLSNkZWZpbmUgVFhQX0ZJUlNUX01DU18yMF9TVEJDCTM2Ci0jZGVmaW5lIFRYUF9MQVNUX01DU18yMF9TVEJDCTQzCi0jZGVmaW5lIFRYUF9GSVJTVF9NQ1NfMjBfU0RNCTQ0Ci0jZGVmaW5lIFRYUF9MQVNUX01DU18yMF9TRE0JNTEKLSNkZWZpbmUgVFhQX0ZJUlNUX09GRE1fNDBfU0lTTwk1MgotI2RlZmluZSBUWFBfTEFTVF9PRkRNXzQwX1NJU08JNTkKLSNkZWZpbmUgVFhQX0ZJUlNUX09GRE1fNDBfQ0RECTYwCi0jZGVmaW5lIFRYUF9MQVNUX09GRE1fNDBfQ0RECTY3Ci0jZGVmaW5lIFRYUF9GSVJTVF9NQ1NfNDBfU0lTTwk2OAotI2RlZmluZSBUWFBfTEFTVF9NQ1NfNDBfU0lTTwk3NQotI2RlZmluZSBUWFBfRklSU1RfTUNTXzQwX0NERAk3NgotI2RlZmluZSBUWFBfTEFTVF9NQ1NfNDBfQ0RECTgzCi0jZGVmaW5lIFRYUF9GSVJTVF9NQ1NfNDBfU1RCQwk4NAotI2RlZmluZSBUWFBfTEFTVF9NQ1NfNDBfU1RCQwk5MQotI2RlZmluZSBUWFBfRklSU1RfTUNTXzQwX1NETQk5MgotI2RlZmluZSBUWFBfTEFTVF9NQ1NfNDBfU0RNCTk5Ci0jZGVmaW5lIFRYUF9NQ1NfMzIJICAgICAgICAxMDAKLSNkZWZpbmUgVFhQX05VTV9SQVRFUwkJMTAxCi0jZGVmaW5lIEFESl9QV1JfVEJMX0xFTgkJODQKLQotI2RlZmluZSBUWFBfRklSU1RfU0lTT19NQ1NfMjAJMjAKLSNkZWZpbmUgVFhQX0xBU1RfU0lTT19NQ1NfMjAJMjcKLQotI2RlZmluZSBQSFlfQ09SRV9OVU1fMQkxCi0jZGVmaW5lIFBIWV9DT1JFX05VTV8yCTIKLSNkZWZpbmUgUEhZX0NPUkVfTlVNXzMJMwotI2RlZmluZSBQSFlfQ09SRV9OVU1fNAk0Ci0jZGVmaW5lIFBIWV9DT1JFX01BWAlQSFlfQ09SRV9OVU1fNAotI2RlZmluZSBQSFlfQ09SRV8wCTAKLSNkZWZpbmUgUEhZX0NPUkVfMQkxCi0jZGVmaW5lIFBIWV9DT1JFXzIJMgotI2RlZmluZSBQSFlfQ09SRV8zCTMKLQotI2RlZmluZSBNQV9XSU5ET1dfU1oJCTgKLQotI2RlZmluZSBQSFlfTk9JU0VfU0FNUExFX01PTgkJMQotI2RlZmluZSBQSFlfTk9JU0VfU0FNUExFX0VYVEVSTkFMCTIKLSNkZWZpbmUgUEhZX05PSVNFX1dJTkRPV19TWgkxNgotI2RlZmluZSBQSFlfTk9JU0VfR0xJVENIX0lOSVRfTUEgMTAKLSNkZWZpbmUgUEhZX05PSVNFX0dMSVRDSF9JTklUX01BX0JBRFBsQ1AgMTAKLSNkZWZpbmUgUEhZX05PSVNFX1NUQVRFX01PTgkJMHgxCi0jZGVmaW5lIFBIWV9OT0lTRV9TVEFURV9FWFRFUk5BTAkweDIKLSNkZWZpbmUgUEhZX05PSVNFX1NBTVBMRV9MT0dfTlVNX05QSFkJMTAKLSNkZWZpbmUgUEhZX05PSVNFX1NBTVBMRV9MT0dfTlVNX1VDT0RFCTkKLQotI2RlZmluZSBQSFlfTk9JU0VfT0ZGU0VURkFDVF80MzIyICAoLTEwMykKLSNkZWZpbmUgUEhZX05PSVNFX01BX1dJTkRPV19TWgkyCi0KLSNkZWZpbmUJUEhZX1JTU0lfVEFCTEVfU0laRQk2NAotI2RlZmluZSBSU1NJX0FOVF9NRVJHRV9NQVgJMAotI2RlZmluZSBSU1NJX0FOVF9NRVJHRV9NSU4JMQotI2RlZmluZSBSU1NJX0FOVF9NRVJHRV9BVkcJMgotCi0jZGVmaW5lCVBIWV9UU1NJX1RBQkxFX1NJWkUJNjQKLSNkZWZpbmUJQVBIWV9UU1NJX1RBQkxFX1NJWkUJMjU2Ci0jZGVmaW5lCVRYX0dBSU5fVEFCTEVfTEVOR1RICTY0Ci0jZGVmaW5lCURFRkFVTFRfMTFBX1RYUF9JRFgJMjQKLSNkZWZpbmUgTlVNX1RTU0lfRlJBTUVTICAgICAgICA0Ci0jZGVmaW5lCU5VTExfVFNTSQkJMHg3ZgotI2RlZmluZQlOVUxMX1RTU0lfVwkJMHg3ZjdmCi0KLSNkZWZpbmUgUEhZX1BBUERfRVBTX1RCTF9TSVpFX0xDTlBIWSA2NAotCi0jZGVmaW5lIExDTlBIWV9QRVJJQ0FMX1RFTVBCQVNFRF9UWFBXUkNUUkwgOQotCi0jZGVmaW5lIFBIWV9UWFBXUl9NSU4JCTEwCi0jZGVmaW5lIFBIWV9UWFBXUl9NSU5fTlBIWQk4Ci0jZGVmaW5lIFJBRElPUFdSX09WRVJSSURFX0RFRgkoLTEpCi0KLSNkZWZpbmUgUFdSVEJMX05VTV9DT0VGRgkzCi0KLSNkZWZpbmUgU1BVUkFWT0lEX0RJU0FCTEUJMAotI2RlZmluZSBTUFVSQVZPSURfQVVUTwkJMQotI2RlZmluZSBTUFVSQVZPSURfRk9SQ0VPTgkyCi0jZGVmaW5lIFNQVVJBVk9JRF9GT1JDRU9OMgkzCi0KLSNkZWZpbmUgUEhZX1NXX1RJTUVSX0ZBU1QJCTE1Ci0jZGVmaW5lIFBIWV9TV19USU1FUl9TTE9XCQk2MAotI2RlZmluZSBQSFlfU1dfVElNRVJfR0xBQ0lBTAkxMjAKLQotI2RlZmluZSBQSFlfUEVSSUNBTF9BVVRPCTAKLSNkZWZpbmUgUEhZX1BFUklDQUxfRlVMTAkxCi0jZGVmaW5lIFBIWV9QRVJJQ0FMX1BBUlRJQUwJMgotCi0jZGVmaW5lIFBIWV9QRVJJQ0FMX05PREVMQVkJMAotI2RlZmluZSBQSFlfUEVSSUNBTF9JTklUX0RFTEFZCTUKLSNkZWZpbmUgUEhZX1BFUklDQUxfQVNTT0NfREVMQVkJNQotI2RlZmluZSBQSFlfUEVSSUNBTF9XRE9HX0RFTEFZCTUKLQotI2RlZmluZSBNUEhBU0VfVFhDQUxfTlVNQ01EUwkyCi0jZGVmaW5lIFBIWV9QRVJJQ0FMX01QSEFTRV9QRU5ESU5HKHBpKQkocGktPm1waGFzZV9jYWxfcGhhc2VfaWQgPiBNUEhBU0VfQ0FMX1NUQVRFX0lETEUpCi0KLWVudW0gewotCU1QSEFTRV9DQUxfU1RBVEVfSURMRSA9IDAsCi0JTVBIQVNFX0NBTF9TVEFURV9JTklUID0gMSwKLQlNUEhBU0VfQ0FMX1NUQVRFX1RYUEhBU0UwLAotCU1QSEFTRV9DQUxfU1RBVEVfVFhQSEFTRTEsCi0JTVBIQVNFX0NBTF9TVEFURV9UWFBIQVNFMiwKLQlNUEhBU0VfQ0FMX1NUQVRFX1RYUEhBU0UzLAotCU1QSEFTRV9DQUxfU1RBVEVfVFhQSEFTRTQsCi0JTVBIQVNFX0NBTF9TVEFURV9UWFBIQVNFNSwKLQlNUEhBU0VfQ0FMX1NUQVRFX1BBUERDQUwsCi0JTVBIQVNFX0NBTF9TVEFURV9SWENBTCwKLQlNUEhBU0VfQ0FMX1NUQVRFX1JTU0lDQUwsCi0JTVBIQVNFX0NBTF9TVEFURV9JRExFVFNTSQotfTsKLQotZW51bSBwaHlfY2FsX21vZGUgewotCUNBTF9GVUxMLAotCUNBTF9SRUNBTCwKLQlDQUxfQ1VSUkVDQUwsCi0JQ0FMX0RJR0NBTCwKLQlDQUxfR0NUUkwsCi0JQ0FMX1NPRlQsCi0JQ0FMX0RJR0xPCi19OwotCi0jZGVmaW5lIFJEUl9OVElFUlMgIDEKLSNkZWZpbmUgUkRSX1RJRVJfU0laRSA2NAotI2RlZmluZSBSRFJfTElTVF9TSVpFICg1MTIvMykKLSNkZWZpbmUgUkRSX0VQT0NIX1NJWkUgNDAKLSNkZWZpbmUgUkRSX05BTlRFTk5BUyAyCi0jZGVmaW5lIFJEUl9OVElFUl9TSVpFICBSRFJfTElTVF9TSVpFCi0jZGVmaW5lIFJEUl9MUF9CVUZGRVJfU0laRSA2NAotI2RlZmluZSBMUF9MRU5fSElTX1NJWkUgMTAKLQotI2RlZmluZSBTVEFUSUNfTlVNX1JGIDMyCi0jZGVmaW5lIFNUQVRJQ19OVU1fQkIgOQotCi0jZGVmaW5lIEJCX01VTFRfTUFTSwkJMHgwMDAwZmZmZgotI2RlZmluZSBCQl9NVUxUX1ZBTElEX01BU0sJMHg4MDAwMDAwMAotCi0jZGVmaW5lIENPUkRJQ19BRwkzOTc5NwotI2RlZmluZQlDT1JESUNfTkkJMTgKLSNkZWZpbmUJRklYRUQoWCkJKChzMzIpKChYKSA8PCAxNikpCi0jZGVmaW5lCUZMT0FUKFgpCSgoKFgpID49IDApID8gKCgoKFgpID4+IDE1KSArIDEpID4+IDEpIDogLSgoKCgtKFgpKSA+PiAxNSkgKyAxKSA+PiAxKSkKLQotI2RlZmluZSBQSFlfQ0hBSU5fVFhfRElTQUJMRV9URU1QCTExNQotI2RlZmluZSBQSFlfSFlTVEVSRVNJU19ERUxUQVRFTVAJNQotCi0jZGVmaW5lIFBIWV9CSVRTQ05UKHgpCWJyY211X2JpdGNvdW50KCh1OCAqKSYoeCksIHNpemVvZih1OCkpCi0KLSNkZWZpbmUgTU9EX1BIWV9SRUcocGksIHBoeV90eXBlLCByZWdfbmFtZSwgZmllbGQsIHZhbHVlKSBcCi0JbW9kX3BoeV9yZWcocGksIHBoeV90eXBlIyNfIyNyZWdfbmFtZSwgcGh5X3R5cGUjI18jI3JlZ19uYW1lIyNfIyNmaWVsZCMjX01BU0ssIFwKLQkodmFsdWUpIDw8IHBoeV90eXBlIyNfIyNyZWdfbmFtZSMjXyMjZmllbGQjI18jI1NISUZUKTsKLSNkZWZpbmUgUkVBRF9QSFlfUkVHKHBpLCBwaHlfdHlwZSwgcmVnX25hbWUsIGZpZWxkKSBcCi0JKChyZWFkX3BoeV9yZWcocGksIHBoeV90eXBlIyNfIyNyZWdfbmFtZSkgJiBwaHlfdHlwZSMjXyMjcmVnX25hbWUjI18jI2ZpZWxkIyNfIyNNQVNLKVwKLQk+PiBwaHlfdHlwZSMjXyMjcmVnX25hbWUjI18jI2ZpZWxkIyNfIyNTSElGVCkKLQotI2RlZmluZQlWQUxJRF9QSFlUWVBFKHBoeXR5cGUpCSgoKHVpbnQpcGh5dHlwZSA9PSBQSFlfVFlQRV9OKSB8fCBcCi0JCQkJKCh1aW50KXBoeXR5cGUgPT0gUEhZX1RZUEVfTENOKSkKLQotI2RlZmluZSBWQUxJRF9OX1JBRElPKHJhZGlvaWQpCSgocmFkaW9pZCA9PSBCQ00yMDU1X0lEKSB8fCAocmFkaW9pZCA9PSBCQ00yMDU2X0lEKSB8fCBcCi0JCQkJKHJhZGlvaWQgPT0gQkNNMjA1N19JRCkpCi0jZGVmaW5lIFZBTElEX0xDTl9SQURJTyhyYWRpb2lkKQkocmFkaW9pZCA9PSBCQ00yMDY0X0lEKQotCi0jZGVmaW5lCVZBTElEX1JBRElPKHBpLCByYWRpb2lkKQkoXAotCShJU05QSFkocGkpID8gVkFMSURfTl9SQURJTyhyYWRpb2lkKSA6IGZhbHNlKSB8fCBcCi0JKElTTENOUEhZKHBpKSA/IFZBTElEX0xDTl9SQURJTyhyYWRpb2lkKSA6IGZhbHNlKSkKLQotI2RlZmluZSBTQ0FOX0lOUFJPR19QSFkocGkpCShtYm9vbGlzc2V0KHBpLT5tZWFzdXJlX2hvbGQsIFBIWV9IT0xEX0ZPUl9TQ0FOKSkKLSNkZWZpbmUgUk1fSU5QUk9HX1BIWShwaSkJKG1ib29saXNzZXQocGktPm1lYXN1cmVfaG9sZCwgUEhZX0hPTERfRk9SX1JNKSkKLSNkZWZpbmUgUExUX0lOUFJPR19QSFkocGkpCShtYm9vbGlzc2V0KHBpLT5tZWFzdXJlX2hvbGQsIFBIWV9IT0xEX0ZPUl9QTFQpKQotI2RlZmluZSBBU1NPQ19JTlBST0dfUEhZKHBpKQkobWJvb2xpc3NldChwaS0+bWVhc3VyZV9ob2xkLCBQSFlfSE9MRF9GT1JfQVNTT0MpKQotI2RlZmluZSBTQ0FOX1JNX0lOX1BST0dSRVNTKHBpKSAobWJvb2xpc3NldChwaS0+bWVhc3VyZV9ob2xkLCBQSFlfSE9MRF9GT1JfU0NBTiB8IFBIWV9IT0xEX0ZPUl9STSkpCi0jZGVmaW5lIFBIWV9NVVRFRChwaSkJCShtYm9vbGlzc2V0KHBpLT5tZWFzdXJlX2hvbGQsIFBIWV9IT0xEX0ZPUl9NVVRFKSkKLSNkZWZpbmUgUFVCX05PVF9BU1NPQyhwaSkJKG1ib29saXNzZXQocGktPm1lYXN1cmVfaG9sZCwgUEhZX0hPTERfRk9SX05PVF9BU1NPQykpCi0KLSNpZiBkZWZpbmVkKEVYVF9DQkFMTCkKLSNkZWZpbmUgTk9SQURJT19FTkFCKHB1YikgKChwdWIpLnJhZGlvaWQgPT0gTk9SQURJT19JRCkKLSNlbHNlCi0jZGVmaW5lIE5PUkFESU9fRU5BQihwdWIpIDAKLSNlbmRpZgotCi0jZGVmaW5lIFBIWV9MVFJOX0xJU1RfTEVOCTY0Ci1leHRlcm4gdTE2IGx0cm5fbGlzdFtQSFlfTFRSTl9MSVNUX0xFTl07Ci0KLXN0cnVjdCBwaHlfdGFibGVfaW5mbyB7Ci0JdWludCB0YWJsZTsKLQlpbnQgcTsKLQl1aW50IG1heDsKLX07Ci0KLXN0cnVjdCBwaHl0YmxfaW5mbyB7Ci0JY29uc3Qgdm9pZCAqdGJsX3B0cjsKLQl1MzIgdGJsX2xlbjsKLQl1MzIgdGJsX2lkOwotCXUzMiB0Ymxfb2Zmc2V0OwotCXUzMiB0Ymxfd2lkdGg7Ci19OwotCi1zdHJ1Y3QgaW50ZXJmZXJlbmNlX2luZm8gewotCXU4IGN1cnJfaG9tZV9jaGFubmVsOwotCXUxNiBjcnNtaW5wd3J0aGxkXzQwX3N0b3JlZDsKLQl1MTYgY3JzbWlucHdydGhsZF8yMExfc3RvcmVkOwotCXUxNiBjcnNtaW5wd3J0aGxkXzIwVV9zdG9yZWQ7Ci0JdTE2IGluaXRfZ2Fpbl9jb2RlX2NvcmUxX3N0b3JlZDsKLQl1MTYgaW5pdF9nYWluX2NvZGVfY29yZTJfc3RvcmVkOwotCXUxNiBpbml0X2dhaW5fY29kZWJfY29yZTFfc3RvcmVkOwotCXUxNiBpbml0X2dhaW5fY29kZWJfY29yZTJfc3RvcmVkOwotCXUxNiBpbml0X2dhaW5fdGFibGVfc3RvcmVkWzRdOwotCi0JdTE2IGNsaXAxX2hpX2dhaW5fY29kZV9jb3JlMV9zdG9yZWQ7Ci0JdTE2IGNsaXAxX2hpX2dhaW5fY29kZV9jb3JlMl9zdG9yZWQ7Ci0JdTE2IGNsaXAxX2hpX2dhaW5fY29kZWJfY29yZTFfc3RvcmVkOwotCXUxNiBjbGlwMV9oaV9nYWluX2NvZGViX2NvcmUyX3N0b3JlZDsKLQl1MTYgbmJfY2xpcF90aHJlc2hfY29yZTFfc3RvcmVkOwotCXUxNiBuYl9jbGlwX3RocmVzaF9jb3JlMl9zdG9yZWQ7Ci0JdTE2IGluaXRfb2ZkbWxuYTJnYWluY2hhbmdlX3N0b3JlZFs0XTsKLQl1MTYgaW5pdF9jY2tsbmEyZ2FpbmNoYW5nZV9zdG9yZWRbNF07Ci0JdTE2IGNsaXAxX2xvX2dhaW5fY29kZV9jb3JlMV9zdG9yZWQ7Ci0JdTE2IGNsaXAxX2xvX2dhaW5fY29kZV9jb3JlMl9zdG9yZWQ7Ci0JdTE2IGNsaXAxX2xvX2dhaW5fY29kZWJfY29yZTFfc3RvcmVkOwotCXUxNiBjbGlwMV9sb19nYWluX2NvZGViX2NvcmUyX3N0b3JlZDsKLQl1MTYgdzFfY2xpcF90aHJlc2hfY29yZTFfc3RvcmVkOwotCXUxNiB3MV9jbGlwX3RocmVzaF9jb3JlMl9zdG9yZWQ7Ci0JdTE2IHJhZGlvXzIwNTZfY29yZTFfcnNzaV9nYWluX3N0b3JlZDsKLQl1MTYgcmFkaW9fMjA1Nl9jb3JlMl9yc3NpX2dhaW5fc3RvcmVkOwotCXUxNiBlbmVyZ3lfZHJvcF90aW1lb3V0X2xlbl9zdG9yZWQ7Ci0KLQl1MTYgZWRfY3JzNDBfYXNzZXJ0dGhsZDBfc3RvcmVkOwotCXUxNiBlZF9jcnM0MF9hc3NlcnR0aGxkMV9zdG9yZWQ7Ci0JdTE2IGVkX2NyczQwX2RlYXNzZXJ0dGhsZDBfc3RvcmVkOwotCXUxNiBlZF9jcnM0MF9kZWFzc2VydHRobGQxX3N0b3JlZDsKLQl1MTYgZWRfY3JzMjBMX2Fzc2VydHRobGQwX3N0b3JlZDsKLQl1MTYgZWRfY3JzMjBMX2Fzc2VydHRobGQxX3N0b3JlZDsKLQl1MTYgZWRfY3JzMjBMX2RlYXNzZXJ0dGhsZDBfc3RvcmVkOwotCXUxNiBlZF9jcnMyMExfZGVhc3NlcnR0aGxkMV9zdG9yZWQ7Ci0JdTE2IGVkX2NyczIwVV9hc3NlcnR0aGxkMF9zdG9yZWQ7Ci0JdTE2IGVkX2NyczIwVV9hc3NlcnR0aGxkMV9zdG9yZWQ7Ci0JdTE2IGVkX2NyczIwVV9kZWFzc2VydHRobGQwX3N0b3JlZDsKLQl1MTYgZWRfY3JzMjBVX2RlYXNzZXJ0dGhsZDFfc3RvcmVkOwotCi0JdTE2IGJhZHBsY3BfbWE7Ci0JdTE2IGJhZHBsY3BfbWFfcHJldmlvdXM7Ci0JdTE2IGJhZHBsY3BfbWFfdG90YWw7Ci0JdTE2IGJhZHBsY3BfbWFfbGlzdFtNQV9XSU5ET1dfU1pdOwotCWludCBiYWRwbGNwX21hX2luZGV4OwotCXMxNiBwcmVfYmFkcGxjcF9jbnQ7Ci0JczE2IGJwaHlfcHJlX2JhZHBsY3BfY250OwotCi0JdTE2IGluaXRfZ2Fpbl9jb3JlMTsKLQl1MTYgaW5pdF9nYWluX2NvcmUyOwotCXUxNiBpbml0X2dhaW5iX2NvcmUxOwotCXUxNiBpbml0X2dhaW5iX2NvcmUyOwotCXUxNiBpbml0X2dhaW5fcmZzZXFbNF07Ci0KLQl1MTYgY3JzbWlucHdyMDsKLQl1MTYgY3JzbWlucHdybDA7Ci0JdTE2IGNyc21pbnB3cnUwOwotCi0JczE2IGNyc21pbnB3cl9pbmRleDsKLQotCXUxNiByYWRpb18yMDU3X2NvcmUxX3Jzc2lfd2IxYV9nY19zdG9yZWQ7Ci0JdTE2IHJhZGlvXzIwNTdfY29yZTJfcnNzaV93YjFhX2djX3N0b3JlZDsKLQl1MTYgcmFkaW9fMjA1N19jb3JlMV9yc3NpX3diMWdfZ2Nfc3RvcmVkOwotCXUxNiByYWRpb18yMDU3X2NvcmUyX3Jzc2lfd2IxZ19nY19zdG9yZWQ7Ci0JdTE2IHJhZGlvXzIwNTdfY29yZTFfcnNzaV93YjJfZ2Nfc3RvcmVkOwotCXUxNiByYWRpb18yMDU3X2NvcmUyX3Jzc2lfd2IyX2djX3N0b3JlZDsKLQl1MTYgcmFkaW9fMjA1N19jb3JlMV9yc3NpX25iX2djX3N0b3JlZDsKLQl1MTYgcmFkaW9fMjA1N19jb3JlMl9yc3NpX25iX2djX3N0b3JlZDsKLX07Ci0KLXN0cnVjdCBhY2lfc2F2ZV9ncGh5IHsKLQl1MTYgcmNfY2FsX292cjsKLQl1MTYgcGh5Y3JzdGgxOwotCXUxNiBwaHljcnN0aDI7Ci0JdTE2IGluaXRfbjFwMV9nYWluOwotCXUxNiBwMV9wMl9nYWluOwotCXUxNiBuMV9uMl9nYWluOwotCXUxNiBuMV9wMV9nYWluOwotCXUxNiBkaXZfc2VhcmNoX2dhaW47Ci0JdTE2IGRpdl9wMV9wMl9nYWluOwotCXUxNiBkaXZfc2VhcmNoX2duX2NoYW5nZTsKLQl1MTYgdGFibGVfN18yOwotCXUxNiB0YWJsZV83XzM7Ci0JdTE2IGNja3NoYml0c19nbnJlZjsKLQl1MTYgY2xpcF90aHJlc2g7Ci0JdTE2IGNsaXAyX3RocmVzaDsKLQl1MTYgY2xpcDNfdGhyZXNoOwotCXUxNiBjbGlwX3AyX3RocmVzaDsKLQl1MTYgY2xpcF9wd2RuX3RocmVzaDsKLQl1MTYgY2xpcF9uMXAxX3RocmVzaDsKLQl1MTYgY2xpcF9uMV9wd2RuX3RocmVzaDsKLQl1MTYgYmJjb25maWc7Ci0JdTE2IGN0aHJfc3Rocl9zaGRpbjsKLQl1MTYgZW5lcmd5OwotCXUxNiBjbGlwX3AxX3AyX3RocmVzaDsKLQl1MTYgdGhyZXNob2xkOwotCXUxNiByZWcxNTsKLQl1MTYgcmVnMTY7Ci0JdTE2IHJlZzE3OwotCXUxNiBkaXZfc3JjaF9pZHg7Ci0JdTE2IGRpdl9zcmNoX3AxX3AyOwotCXUxNiBkaXZfc3JjaF9nbl9iYWNrOwotCXUxNiBhbnRfZHdlbGw7Ci0JdTE2IGFudF93cl9zZXR0bGU7Ci19OwotCi1zdHJ1Y3QgbG9fY29tcGxleF9hYmdwaHlfaW5mbyB7Ci0JczggaTsKLQlzOCBxOwotfTsKLQotc3RydWN0IG5waHlfaXFfY29tcCB7Ci0JczE2IGEwOwotCXMxNiBiMDsKLQlzMTYgYTE7Ci0JczE2IGIxOwotfTsKLQotc3RydWN0IG5waHlfdHhwd3JpbmRleCB7Ci0JczggaW5kZXg7Ci0JczggaW5kZXhfaW50ZXJuYWw7Ci0JczggaW5kZXhfaW50ZXJuYWxfc2F2ZTsKLQl1MTYgQWZlY3RybE92ZXJyaWRlOwotCXUxNiBBZmVDdHJsRGFjR2FpbjsKLQl1MTYgcmFkX2dhaW47Ci0JdTggYmJtdWx0OwotCXUxNiBpcWNvbXBfYTsKLQl1MTYgaXFjb21wX2I7Ci0JdTE2IGxvY29tcDsKLX07Ci0KLXN0cnVjdCB0eGlxY2FsX2NhY2hlIHsKLQotCXUxNiB0eGNhbF9jb2VmZnNfMkdbOF07Ci0JdTE2IHR4Y2FsX3JhZGlvX3JlZ3NfMkdbOF07Ci0Jc3RydWN0IG5waHlfaXFfY29tcCByeGNhbF9jb2VmZnNfMkc7Ci0KLQl1MTYgdHhjYWxfY29lZmZzXzVHWzhdOwotCXUxNiB0eGNhbF9yYWRpb19yZWdzXzVHWzhdOwotCXN0cnVjdCBucGh5X2lxX2NvbXAgcnhjYWxfY29lZmZzXzVHOwotfTsKLQotc3RydWN0IG5waHlfcHdyY3RybCB7Ci0JczggbWF4X3B3cl8yZzsKLQlzOCBpZGxlX3RhcmdfMmc7Ci0JczE2IHB3cmRldF8yZ19hMTsKLQlzMTYgcHdyZGV0XzJnX2IwOwotCXMxNiBwd3JkZXRfMmdfYjE7Ci0JczggbWF4X3B3cl81Z207Ci0JczggaWRsZV90YXJnXzVnbTsKLQlzOCBtYXhfcHdyXzVnaDsKLQlzOCBtYXhfcHdyXzVnbDsKLQlzMTYgcHdyZGV0XzVnbV9hMTsKLQlzMTYgcHdyZGV0XzVnbV9iMDsKLQlzMTYgcHdyZGV0XzVnbV9iMTsKLQlzMTYgcHdyZGV0XzVnbF9hMTsKLQlzMTYgcHdyZGV0XzVnbF9iMDsKLQlzMTYgcHdyZGV0XzVnbF9iMTsKLQlzMTYgcHdyZGV0XzVnaF9hMTsKLQlzMTYgcHdyZGV0XzVnaF9iMDsKLQlzMTYgcHdyZGV0XzVnaF9iMTsKLQlzOCBpZGxlX3RhcmdfNWdsOwotCXM4IGlkbGVfdGFyZ181Z2g7Ci0JczggaWRsZV90c3NpXzJnOwotCXM4IGlkbGVfdHNzaV81ZzsKLQlzOCBpZGxlX3Rzc2k7Ci0JczE2IGExOwotCXMxNiBiMDsKLQlzMTYgYjE7Ci19OwotCi1zdHJ1Y3QgbnBoeV90eGdhaW5zIHsKLQl1MTYgdHhscGZbMl07Ci0JdTE2IHR4Z21bMl07Ci0JdTE2IHBnYVsyXTsKLQl1MTYgcGFkWzJdOwotCXUxNiBpcGFbMl07Ci19OwotCi0jZGVmaW5lIFBIWV9OT0lTRVZBUl9CVUZTSVpFIDEwCi0KLXN0cnVjdCBucGh5X25vaXNldmFyX2J1ZiB7Ci0JaW50IGJ1ZmNvdW50OwotCWludCB0b25lX2lkW1BIWV9OT0lTRVZBUl9CVUZTSVpFXTsKLQl1MzIgbm9pc2VfdmFyc1tQSFlfTk9JU0VWQVJfQlVGU0laRV07Ci0JdTMyIG1pbl9ub2lzZV92YXJzW1BIWV9OT0lTRVZBUl9CVUZTSVpFXTsKLX07Ci0KLXN0cnVjdCByc3NpY2FsX2NhY2hlIHsKLQl1MTYgcnNzaWNhbF9yYWRpb19yZWdzXzJHWzJdOwotCXUxNiByc3NpY2FsX3BoeXJlZ3NfMkdbMTJdOwotCi0JdTE2IHJzc2ljYWxfcmFkaW9fcmVnc181R1syXTsKLQl1MTYgcnNzaWNhbF9waHlyZWdzXzVHWzEyXTsKLX07Ci0KLXN0cnVjdCBsY25waHlfY2FsX3Jlc3VsdHMgewotCi0JdTE2IHR4aXFsb2NhbF9hOwotCXUxNiB0eGlxbG9jYWxfYjsKLQl1MTYgdHhpcWxvY2FsX2RpZHE7Ci0JdTggdHhpcWxvY2FsX2VpMDsKLQl1OCB0eGlxbG9jYWxfZXEwOwotCXU4IHR4aXFsb2NhbF9maTA7Ci0JdTggdHhpcWxvY2FsX2ZxMDsKLQotCXUxNiB0eGlxbG9jYWxfYmVzdGNvZWZmc1sxMV07Ci0JdTE2IHR4aXFsb2NhbF9iZXN0Y29lZmZzX3ZhbGlkOwotCi0JdTMyIHBhcGRfZXBzX3RibFtQSFlfUEFQRF9FUFNfVEJMX1NJWkVfTENOUEhZXTsKLQl1MTYgYW5hbG9nX2dhaW5fcmVmOwotCXUxNiBsdXRfYmVnaW47Ci0JdTE2IGx1dF9lbmQ7Ci0JdTE2IGx1dF9zdGVwOwotCXUxNiByeGNvbXBkYm07Ci0JdTE2IHBhcGRjdHJsOwotCXUxNiBzc2xwbkNhbGliQ2xrRW5DdHJsOwotCi0JdTE2IHJ4aXFjYWxfY29lZmZfYTA7Ci0JdTE2IHJ4aXFjYWxfY29lZmZfYjA7Ci19OwotCi1zdHJ1Y3Qgc2hhcmVkX3BoeSB7Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGh5X2hlYWQ7Ci0JdWludCB1bml0OwotCXN0cnVjdCBzaV9wdWIgKnNpaDsKLQl2b2lkICpwaHlzaGltOwotCXVpbnQgY29yZXJldjsKLQl1MzIgbWFjaHdjYXA7Ci0JYm9vbCB1cDsKLQlib29sIGNsazsKLQl1aW50IG5vdzsKLQl1MTYgdmlkOwotCXUxNiBkaWQ7Ci0JdWludCBjaGlwOwotCXVpbnQgY2hpcHJldjsKLQl1aW50IGNoaXBwa2c7Ci0JdWludCBzcm9tcmV2OwotCXVpbnQgYm9hcmR0eXBlOwotCXVpbnQgYm9hcmRyZXY7Ci0JdWludCBib2FyZHZlbmRvcjsKLQl1MzIgYm9hcmRmbGFnczsKLQl1MzIgYm9hcmRmbGFnczI7Ci0JdWludCBidXN0eXBlOwotCXVpbnQgYnVzY29yZXJldjsKLQl1aW50IGZhc3RfdGltZXI7Ci0JdWludCBzbG93X3RpbWVyOwotCXVpbnQgZ2xhY2lhbF90aW1lcjsKLQl1OCByeF9hbnRkaXY7Ci0JczggcGh5X25vaXNlX3dpbmRvd1tNQV9XSU5ET1dfU1pdOwotCXVpbnQgcGh5X25vaXNlX2luZGV4OwotCXU4IGh3X3BoeXR4Y2hhaW47Ci0JdTggaHdfcGh5cnhjaGFpbjsKLQl1OCBwaHl0eGNoYWluOwotCXU4IHBoeXJ4Y2hhaW47Ci0JdTggcnNzaV9tb2RlOwotCWJvb2wgX3JpZnNfcGh5OwotfTsKLQotc3RydWN0IGJyY21zX3BoeV9wdWIgewotCXVpbnQgcGh5X3R5cGU7Ci0JdWludCBwaHlfcmV2OwotCXU4IHBoeV9jb3JlbnVtOwotCXUxNiByYWRpb2lkOwotCXU4IHJhZGlvcmV2OwotCXU4IHJhZGlvdmVyOwotCi0JdWludCBjb3JlZmxhZ3M7Ci0JdWludCBhbmFfcmV2OwotCWJvb2wgYWJncGh5X2VuY29yZTsKLX07Ci0KLXN0cnVjdCBwaHlfZnVuY19wdHIgewotCWluaXRmbl90IGluaXQ7Ci0JaW5pdGZuX3QgY2FsaW5pdDsKLQljaGFuc2V0Zm5fdCBjaGFuc2V0OwotCWluaXRmbl90IHR4cHdycmVjYWxjOwotCWxvbmd0cm5mbl90IGxvbmd0cm47Ci0JdHhpcWNjZ2V0Zm5fdCB0eGlxY2NnZXQ7Ci0JdHhpcWNjc2V0Zm5fdCB0eGlxY2NzZXQ7Ci0JdHhsb2NjZ2V0Zm5fdCB0eGxvY2NnZXQ7Ci0JcmFkaW9sb2Z0Z2V0Zm5fdCByYWRpb2xvZnRnZXQ7Ci0JaW5pdGZuX3QgY2FycnN1cHByOwotCXJ4c2lncHdyZm5fdCByeHNpZ3B3cjsKLQlkZXRhY2hmbl90IGRldGFjaDsKLX07Ci0KLXN0cnVjdCBicmNtc19waHkgewotCXN0cnVjdCBicmNtc19waHlfcHViIHB1YnBpX3JvOwotCXN0cnVjdCBzaGFyZWRfcGh5ICpzaDsKLQlzdHJ1Y3QgcGh5X2Z1bmNfcHRyIHBpX2ZwdHI7Ci0Jdm9pZCAqcGlfcHRyOwotCi0JdW5pb24gewotCQlzdHJ1Y3QgYnJjbXNfcGh5X2xjbnBoeSAqcGlfbGNucGh5OwotCX0gdTsKLQlib29sIHVzZXJfdHhwd3JfYXRfcmZwb3J0OwotCi0JZDExcmVnc190ICpyZWdzOwotCXN0cnVjdCBicmNtc19waHkgKm5leHQ7Ci0JY2hhciAqdmFyczsKLQlzdHJ1Y3QgYnJjbXNfcGh5X3B1YiBwdWJwaTsKLQotCWJvb2wgZG9faW5pdGNhbDsKLQlib29sIHBoeXRlc3Rfb247Ci0JYm9vbCBvZmRtX3JhdGVzZXRfd2FyOwotCWJvb2wgYmZfcHJlZW1wdF80MzA2OwotCWNoYW5zcGVjX3QgcmFkaW9fY2hhbnNwZWM7Ci0JdTggYW50c2VsX3R5cGU7Ci0JdTE2IGJ3OwotCXU4IHR4cHdyX3BlcmNlbnQ7Ci0JYm9vbCBwaHlfaW5pdF9wb3I7Ci0KLQlib29sIGluaXRfaW5fcHJvZ3Jlc3M7Ci0JYm9vbCBpbml0aWFsaXplZDsKLQlib29sIHNidG1sX2dtOwotCXVpbnQgcmVmY250OwotCWJvb2wgd2F0Y2hkb2dfb3ZlcnJpZGU7Ci0JdTggcGh5bm9pc2Vfc3RhdGU7Ci0JdWludCBwaHlub2lzZV9ub3c7Ci0JaW50IHBoeW5vaXNlX2NoYW5fd2F0Y2hkb2c7Ci0JYm9vbCBwaHlub2lzZV9wb2xsaW5nOwotCWJvb2wgZGlzYWJsZV9wZXJjYWw7Ci0JbWJvb2wgbWVhc3VyZV9ob2xkOwotCi0JczE2IHR4cGFfMmdbUFdSVEJMX05VTV9DT0VGRl07Ci0JczE2IHR4cGFfMmdfbG93X3RlbXBbUFdSVEJMX05VTV9DT0VGRl07Ci0JczE2IHR4cGFfMmdfaGlnaF90ZW1wW1BXUlRCTF9OVU1fQ09FRkZdOwotCXMxNiB0eHBhXzVnX2xvd1tQV1JUQkxfTlVNX0NPRUZGXTsKLQlzMTYgdHhwYV81Z19taWRbUFdSVEJMX05VTV9DT0VGRl07Ci0JczE2IHR4cGFfNWdfaGlbUFdSVEJMX05VTV9DT0VGRl07Ci0KLQl1OCB0eF9zcm9tX21heF8yZzsKLQl1OCB0eF9zcm9tX21heF81Z19sb3c7Ci0JdTggdHhfc3JvbV9tYXhfNWdfbWlkOwotCXU4IHR4X3Nyb21fbWF4XzVnX2hpOwotCXU4IHR4X3Nyb21fbWF4X3JhdGVfMmdbVFhQX05VTV9SQVRFU107Ci0JdTggdHhfc3JvbV9tYXhfcmF0ZV81Z19sb3dbVFhQX05VTV9SQVRFU107Ci0JdTggdHhfc3JvbV9tYXhfcmF0ZV81Z19taWRbVFhQX05VTV9SQVRFU107Ci0JdTggdHhfc3JvbV9tYXhfcmF0ZV81Z19oaVtUWFBfTlVNX1JBVEVTXTsKLQl1OCB0eF91c2VyX3RhcmdldFtUWFBfTlVNX1JBVEVTXTsKLQlzOCB0eF9wb3dlcl9vZmZzZXRbVFhQX05VTV9SQVRFU107Ci0JdTggdHhfcG93ZXJfdGFyZ2V0W1RYUF9OVU1fUkFURVNdOwotCi0Jc3RydWN0IGJyY21zX3BoeV9zcm9tX2ZlbSBzcm9tX2ZlbTJnOwotCXN0cnVjdCBicmNtc19waHlfc3JvbV9mZW0gc3JvbV9mZW01ZzsKLQotCXU4IHR4X3Bvd2VyX21heDsKLQl1OCB0eF9wb3dlcl9tYXhfcmF0ZV9pbmQ7Ci0JYm9vbCBod3B3cmN0cmw7Ci0JdTggbnBoeV90eHB3cmN0cmw7Ci0JczggbnBoeV90eHJ4X2NoYWluOwotCWJvb2wgcGh5XzVnX3B3cmdhaW47Ci0KLQl1MTYgcGh5X3dyZWc7Ci0JdTE2IHBoeV93cmVnX2xpbWl0OwotCi0Jczggbl9wcmVhbWJsZV9vdmVycmlkZTsKLQl1OCBhbnRzd2l0Y2g7Ci0JdTggYWEyZywgYWE1ZzsKLQotCXM4IGlkbGVfdHNzaVtDSF81R19HUk9VUF07Ci0JczggdGFyZ2V0X2lkbGVfdHNzaTsKLQlzOCB0eHB3cl9lc3RfUG91dDsKLQl1OCB0eF9wb3dlcl9taW47Ci0JdTggdHhwd3JfbGltaXRbVFhQX05VTV9SQVRFU107Ci0JdTggdHhwd3JfZW52X2xpbWl0W1RYUF9OVU1fUkFURVNdOwotCXU4IGFkal9wd3JfdGJsX25waHlbQURKX1BXUl9UQkxfTEVOXTsKLQotCWJvb2wgY2hhbm5lbF8xNF93aWRlX2ZpbHRlcjsKLQotCWJvb2wgdHhwd3JvdmVycmlkZTsKLQlib29sIHR4cHdyaWR4X292ZXJyaWRlX2FwaHk7Ci0JczE2IHJhZGlvcHdyX292ZXJyaWRlOwotCXUxNiBod3B3cl90eGN1cjsKLQl1OCBzYXZlZF90eHB3cl9pZHg7Ci0KLQlib29sIGVkY3JzX3RocmVzaG9sZF9sb2NrOwotCi0JdTMyIHRyX1JfZ2Fpbl92YWw7Ci0JdTMyIHRyX1RfZ2Fpbl92YWw7Ci0KLQlzMTYgb2ZkbV9hbmFsb2dfZmlsdF9id19vdmVycmlkZTsKLQlzMTYgY2NrX2FuYWxvZ19maWx0X2J3X292ZXJyaWRlOwotCXMxNiBvZmRtX3JjY2FsX292ZXJyaWRlOwotCXMxNiBjY2tfcmNjYWxfb3ZlcnJpZGU7Ci0JdTE2IGV4dGxuYV90eXBlOwotCi0JdWludCBpbnRlcmZlcmVuY2VfbW9kZV9jcnNfdGltZTsKLQl1MTYgY3JzZ2xpdGNoX3ByZXY7Ci0JYm9vbCBpbnRlcmZlcmVuY2VfbW9kZV9jcnM7Ci0KLQl1MzIgcGh5X3R4X3RvbmVfZnJlcTsKLQl1aW50IHBoeV9sYXN0Y2FsOwotCWJvb2wgcGh5X2ZvcmNlY2FsOwotCWJvb2wgcGh5X2ZpeGVkX25vaXNlOwotCXUzMiB4dGFsZnJlcTsKLQl1OCBwZGl2OwotCXM4IGNhcnJpZXJfc3VwcHJfZGlzYWJsZTsKLQotCWJvb2wgcGh5X2JwaHlfZXZtOwotCWJvb2wgcGh5X2JwaHlfcmZjczsKLQlzOCBwaHlfc2NyYW1pbml0OwotCXU4IHBoeV9ncGlvc2VsOwotCi0JczE2IHBoeV90eGNvcmVfZGlzYWJsZV90ZW1wOwotCXMxNiBwaHlfdHhjb3JlX2VuYWJsZV90ZW1wOwotCXM4IHBoeV90ZW1wc2Vuc2Vfb2Zmc2V0OwotCWJvb2wgcGh5X3R4Y29yZV9oZWF0ZWR1cDsKLQotCXUxNiByYWRpb3B3cjsKLQl1MTYgYmJfYXR0ZW47Ci0JdTE2IHR4Y3RsMTsKLQotCXUxNiBtaW50eGJpYXM7Ci0JdTE2IG1pbnR4bWFnOwotCXN0cnVjdCBsb19jb21wbGV4X2FiZ3BoeV9pbmZvIGdwaHlfbG9jb21wX2lxCi0JCQkJCVtTVEFUSUNfTlVNX1JGXVtTVEFUSUNfTlVNX0JCXTsKLQlzOCBzdGF0c18xMWJfdHhwb3dlcltTVEFUSUNfTlVNX1JGXVtTVEFUSUNfTlVNX0JCXTsKLQl1MTYgZ2Fpbl90YWJsZVtUWF9HQUlOX1RBQkxFX0xFTkdUSF07Ci0JYm9vbCBsb29wYmFja19nYWluOwotCXMxNiBtYXhfbHBiYWNrX2dhaW5faGRCOwotCXMxNiB0cnN3X3J4X2dhaW5faGRCOwotCXU4IHBvd2VyX3ZlY1s4XTsKLQotCXUxNiByY19jYWw7Ci0JaW50IG5yc3NpX3RhYmxlX2RlbHRhOwotCWludCBucnNzaV9zbG9wZV9zY2FsZTsKLQlpbnQgbnJzc2lfc2xvcGVfb2Zmc2V0OwotCWludCBtaW5fcnNzaTsKLQlpbnQgbWF4X3Jzc2k7Ci0KLQlzOCB0eHB3cmlkeDsKLQl1OCBtaW5fdHhwb3dlcjsKLQotCXU4IGFfYmFuZF9oaWdoX2Rpc2FibGU7Ci0KLQl1MTYgdHhfdm9zOwotCXUxNiBnbG9iYWxfdHhfYmJfZGNfYmlhc19sb2Z0OwotCi0JaW50IHJmX21heDsKLQlpbnQgYmJfbWF4OwotCWludCByZl9saXN0X3NpemU7Ci0JaW50IGJiX2xpc3Rfc2l6ZTsKLQl1MTYgKnJmX2F0dG5fbGlzdDsKLQl1MTYgKmJiX2F0dG5fbGlzdDsKLQl1MTYgcGFkbWl4X21hc2s7Ci0JdTE2IHBhZG1peF9yZWc7Ci0JdTE2ICp0eG1hZ19saXN0OwotCXVpbnQgdHhtYWdfbGVuOwotCWJvb2wgdHhtYWdfZW5hYmxlOwotCi0JczggKmFfdHNzaV90b19kYm07Ci0JczggKm1fdHNzaV90b19kYm07Ci0JczggKmxfdHNzaV90b19kYm07Ci0JczggKmhfdHNzaV90b19kYm07Ci0JdTggKmh3dHhwd3I7Ci0KLQl1MTYgZnJlcXRyYWNrX3NhdmVkX3JlZ3NbMl07Ci0JaW50IGN1cl9pbnRlcmZlcmVuY2VfbW9kZTsKLQlib29sIGh3cHdyY3RybF9jYXBhYmxlOwotCWJvb2wgdGVtcHB3cmN0cmxfY2FwYWJsZTsKLQotCXVpbnQgcGh5Y2FsX25zbG9wZTsKLQl1aW50IHBoeWNhbF9ub2Zmc2V0OwotCXVpbnQgcGh5Y2FsX21sbzsKLQl1aW50IHBoeWNhbF90eHBvd2VyOwotCi0JdTggcGh5X2FhMmc7Ci0KLQlib29sIG5waHlfdGFibGVsb2FkZWQ7Ci0JczggbnBoeV9yc3Npc2VsOwotCXUzMiBucGh5X2JiX211bHRfc2F2ZTsKLQl1MTYgbnBoeV90eGlxbG9jYWxfYmVzdGNbMTFdOwotCWJvb2wgbnBoeV90eGlxbG9jYWxfY29lZmZzdmFsaWQ7Ci0Jc3RydWN0IG5waHlfdHhwd3JpbmRleCBucGh5X3R4cHdyaW5kZXhbUEhZX0NPUkVfTlVNXzJdOwotCXN0cnVjdCBucGh5X3B3cmN0cmwgbnBoeV9wd3JjdHJsX2luZm9bUEhZX0NPUkVfTlVNXzJdOwotCXUxNiBjY2syZ3BvOwotCXUzMiBvZmRtMmdwbzsKLQl1MzIgb2ZkbTVncG87Ci0JdTMyIG9mZG01Z2xwbzsKLQl1MzIgb2ZkbTVnaHBvOwotCXU4IGJ3NDAyZ3BvOwotCXU4IGJ3NDA1Z3BvOwotCXU4IGJ3NDA1Z2xwbzsKLQl1OCBidzQwNWdocG87Ci0JdTggY2RkMmdwbzsKLQl1OCBjZGQ1Z3BvOwotCXU4IGNkZDVnbHBvOwotCXU4IGNkZDVnaHBvOwotCXU4IHN0YmMyZ3BvOwotCXU4IHN0YmM1Z3BvOwotCXU4IHN0YmM1Z2xwbzsKLQl1OCBzdGJjNWdocG87Ci0JdTggYndkdXAyZ3BvOwotCXU4IGJ3ZHVwNWdwbzsKLQl1OCBid2R1cDVnbHBvOwotCXU4IGJ3ZHVwNWdocG87Ci0JdTE2IG1jczJncG9bOF07Ci0JdTE2IG1jczVncG9bOF07Ci0JdTE2IG1jczVnbHBvWzhdOwotCXUxNiBtY3M1Z2hwb1s4XTsKLQl1MzIgbnBoeV9yeGNhbHBhcmFtczsKLQotCXU4IHBoeV9zcHVyYXZvaWQ7Ci0JYm9vbCBwaHlfaXNzcHVyYXZvaWQ7Ci0KLQl1OCBwaHlfcGFiaWFzOwotCXU4IG5waHlfcGFwZF9za2lwOwotCXU4IG5waHlfdHNzaV9zbG9wZTsKLQotCXMxNiBucGh5X25vaXNlX3dpbltQSFlfQ09SRV9NQVhdW1BIWV9OT0lTRV9XSU5ET1dfU1pdOwotCXU4IG5waHlfbm9pc2VfaW5kZXg7Ci0KLQl1OCBucGh5X3R4cGlkMmdbUEhZX0NPUkVfTlVNXzJdOwotCXU4IG5waHlfdHhwaWQ1Z1tQSFlfQ09SRV9OVU1fMl07Ci0JdTggbnBoeV90eHBpZDVnbFtQSFlfQ09SRV9OVU1fMl07Ci0JdTggbnBoeV90eHBpZDVnaFtQSFlfQ09SRV9OVU1fMl07Ci0KLQlib29sIG5waHlfZ2Fpbl9ib29zdDsKLQlib29sIG5waHlfZWxuYV9nYWluX2NvbmZpZzsKLQl1MTYgb2xkX2JwaHlfdGVzdDsKLQl1MTYgb2xkX2JwaHlfdGVzdGNvbnRyb2w7Ci0KLQlib29sIHBoeWhhbmdfYXZvaWQ7Ci0KLQlib29sIHJzc2ljYWxfbnBoeTsKLQl1OCBucGh5X3BlcmljYWw7Ci0JdWludCBucGh5X3BlcmljYWxfbGFzdDsKLQl1OCBjYWxfdHlwZV9vdmVycmlkZTsKLQl1OCBtcGhhc2VfY2FsX3BoYXNlX2lkOwotCXU4IG1waGFzZV90eGNhbF9jbWRpZHg7Ci0JdTggbXBoYXNlX3R4Y2FsX251bWNtZHM7Ci0JdTE2IG1waGFzZV90eGNhbF9iZXN0Y29lZmZzWzExXTsKLQljaGFuc3BlY190IG5waHlfdHhpcWxvY2FsX2NoYW5zcGVjOwotCWNoYW5zcGVjX3QgbnBoeV9pcWNhbF9jaGFuc3BlY18yRzsKLQljaGFuc3BlY190IG5waHlfaXFjYWxfY2hhbnNwZWNfNUc7Ci0JY2hhbnNwZWNfdCBucGh5X3Jzc2ljYWxfY2hhbnNwZWNfMkc7Ci0JY2hhbnNwZWNfdCBucGh5X3Jzc2ljYWxfY2hhbnNwZWNfNUc7Ci0Jc3RydWN0IHdsYXBpX3RpbWVyICpwaHljYWxfdGltZXI7Ci0JYm9vbCB1c2VfaW50X3R4X2lxbG9fY2FsX25waHk7Ci0JYm9vbCBpbnRlcm5hbF90eF9pcWxvX2NhbF90YXBvZmZfaW50cGFfbnBoeTsKLQlzMTYgbnBoeV9sYXN0Y2FsX3RlbXA7Ci0KLQlzdHJ1Y3QgdHhpcWNhbF9jYWNoZSBjYWxpYnJhdGlvbl9jYWNoZTsKLQlzdHJ1Y3QgcnNzaWNhbF9jYWNoZSByc3NpY2FsX2NhY2hlOwotCi0JdTggbnBoeV90eHB3cl9pZHhbMl07Ci0JdTggbnBoeV9wYXBkX2NhbF90eXBlOwotCXVpbnQgbnBoeV9wYXBkX2xhc3RfY2FsOwotCXUxNiBucGh5X3BhcGRfdHhfZ2Fpbl9hdF9sYXN0X2NhbFsyXTsKLQl1OCBucGh5X3BhcGRfY2FsX2dhaW5faW5kZXhbMl07Ci0JczE2IG5waHlfcGFwZF9lcHNpbG9uX29mZnNldFsyXTsKLQlib29sIG5waHlfcGFwZF9yZWNhbF9lbmFibGU7Ci0JdTMyIG5waHlfcGFwZF9yZWNhbF9jb3VudGVyOwotCWJvb2wgbnBoeV9mb3JjZV9wYXBkX2NhbDsKLQlib29sIG5waHlfcGFwZGNvbXA7Ci0JYm9vbCBpcGEyZ19vbjsKLQlib29sIGlwYTVnX29uOwotCi0JdTE2IGNsYXNzaWZpZXJfc3RhdGU7Ci0JdTE2IGNsaXBfc3RhdGVbMl07Ci0JdWludCBucGh5X2RlYWZfY291bnQ7Ci0JdTggcnhpcV9zYW1wczsKLQl1OCByeGlxX2FudHNlbDsKLQotCXUxNiByZmN0cmxJbnRjMV9zYXZlOwotCXUxNiByZmN0cmxJbnRjMl9zYXZlOwotCWJvb2wgZmlyc3RfY2FsX2FmdGVyX2Fzc29jOwotCXUxNiB0eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbMjJdOwotCXUxNiB0eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzE1XTsKLQotCXU4IG5waHlfY2FsX29yaWdfcHdyX2lkeFsyXTsKLQl1OCBucGh5X3R4Y2FsX3B3cl9pZHhbMl07Ci0JdTggbnBoeV9yeGNhbF9wd3JfaWR4WzJdOwotCXUxNiBucGh5X2NhbF9vcmlnX3R4X2dhaW5bMl07Ci0Jc3RydWN0IG5waHlfdHhnYWlucyBucGh5X2NhbF90YXJnZXRfZ2FpbjsKLQl1MTYgbnBoeV90eGNhbF9iYm11bHQ7Ci0JdTE2IG5waHlfZ212YWw7Ci0KLQl1MTYgbnBoeV9zYXZlZF9iYmNvbmY7Ci0KLQlib29sIG5waHlfZ2JhbmRfc3B1cndhcl9lbjsKLQlib29sIG5waHlfZ2JhbmRfc3B1cndhcjJfZW47Ci0JYm9vbCBucGh5X2FiYW5kX3NwdXJ3YXJfZW47Ci0JdTE2IG5waHlfcmNjYWxfdmFsdWU7Ci0JdTE2IG5waHlfY3JzbWlucHdyWzNdOwotCXN0cnVjdCBucGh5X25vaXNldmFyX2J1ZiBucGh5X3NhdmVkX25vaXNldmFyczsKLQlib29sIG5waHlfYW5hcnhscGZfYWRqdXN0ZWQ7Ci0JYm9vbCBucGh5X2Nyc21pbnB3cl9hZGp1c3RlZDsKLQlib29sIG5waHlfbm9pc2V2YXJzX2FkanVzdGVkOwotCi0JYm9vbCBucGh5X3J4Y2FsX2FjdGl2ZTsKLQl1MTYgcmFkYXJfcGVyY2FsX21hc2s7Ci0JYm9vbCBkZnNfbHBfYnVmZmVyX25waHk7Ci0KLQl1MTYgbnBoeV9maW5lY2xvY2tnYXRlY29udHJvbDsKLQotCXM4IHJ4MnR4X2JpYXNlbnRyeTsKLQotCXUxNiBjcnNtaW5wd3IwOwotCXUxNiBjcnNtaW5wd3JsMDsKLQl1MTYgY3JzbWlucHdydTA7Ci0JczE2IG5vaXNlX2Nyc21pbnB3cl9pbmRleDsKLQl1MTYgaW5pdF9nYWluX2NvcmUxOwotCXUxNiBpbml0X2dhaW5fY29yZTI7Ci0JdTE2IGluaXRfZ2FpbmJfY29yZTE7Ci0JdTE2IGluaXRfZ2FpbmJfY29yZTI7Ci0JdTggYWNpX25vaXNlX2N1cnJfY2hhbm5lbDsKLQl1MTYgaW5pdF9nYWluX3Jmc2VxWzRdOwotCi0JYm9vbCByYWRpb19pc19vbjsKLQotCWJvb2wgbnBoeV9zYW1wbGVfcGxheV9scGZfYndfY3RsX292cjsKLQotCXUxNiB0YmxfZGF0YV9oaTsKLQl1MTYgdGJsX2RhdGFfbG87Ci0JdTE2IHRibF9hZGRyOwotCi0JdWludCB0Ymxfc2F2ZV9pZDsKLQl1aW50IHRibF9zYXZlX29mZnNldDsKLQotCXU4IHR4cHdyY3RybDsKLQlzOCB0eHB3cmluZGV4W1BIWV9DT1JFX01BWF07Ci0KLQl1OCBwaHljYWxfdGVtcGRlbHRhOwotCXUzMiBtY3MyMF9wbzsKLQl1MzIgbWNzNDBfcG87Ci0Jc3RydWN0IHdpcGh5ICp3aXBoeTsKLX07Ci0KLXN0cnVjdCBfY3MzMiB7Ci0JZml4ZWQgcTsKLQlmaXhlZCBpOwotfTsKLQotc3RydWN0IHJhZGlvX3JlZ3MgewotCXUxNiBhZGRyZXNzOwotCXUzMiBpbml0X2E7Ci0JdTMyIGluaXRfZzsKLQl1OCBkb19pbml0X2E7Ci0JdTggZG9faW5pdF9nOwotfTsKLQotc3RydWN0IHJhZGlvXzIweHhfcmVncyB7Ci0JdTE2IGFkZHJlc3M7Ci0JdTggaW5pdDsKLQl1OCBkb19pbml0OwotfTsKLQotc3RydWN0IGxjbnBoeV9yYWRpb19yZWdzIHsKLQl1MTYgYWRkcmVzczsKLQl1OCBpbml0X2E7Ci0JdTggaW5pdF9nOwotCXU4IGRvX2luaXRfYTsKLQl1OCBkb19pbml0X2c7Ci19OwotCi1leHRlcm4gc3RydWN0IGxjbnBoeV9yYWRpb19yZWdzIGxjbnBoeV9yYWRpb19yZWdzXzIwNjRbXTsKLWV4dGVybiBzdHJ1Y3QgbGNucGh5X3JhZGlvX3JlZ3MgbGNucGh5X3JhZGlvX3JlZ3NfMjA2NltdOwotZXh0ZXJuIHN0cnVjdCByYWRpb19yZWdzIHJlZ3NfMjA1NVtdLCByZWdzX1NZTl8yMDU2W10sIHJlZ3NfVFhfMjA1NltdLAotCXJlZ3NfUlhfMjA1NltdOwotZXh0ZXJuIHN0cnVjdCByYWRpb19yZWdzIHJlZ3NfU1lOXzIwNTZfQTFbXSwgcmVnc19UWF8yMDU2X0ExW10sCi0JICAgICAgcmVnc19SWF8yMDU2X0ExW107Ci1leHRlcm4gc3RydWN0IHJhZGlvX3JlZ3MgcmVnc19TWU5fMjA1Nl9yZXY1W10sIHJlZ3NfVFhfMjA1Nl9yZXY1W10sCi0JcmVnc19SWF8yMDU2X3JldjVbXTsKLWV4dGVybiBzdHJ1Y3QgcmFkaW9fcmVncyByZWdzX1NZTl8yMDU2X3JldjZbXSwgcmVnc19UWF8yMDU2X3JldjZbXSwKLQlyZWdzX1JYXzIwNTZfcmV2NltdOwotZXh0ZXJuIHN0cnVjdCByYWRpb19yZWdzIHJlZ3NfU1lOXzIwNTZfcmV2N1tdLCByZWdzX1RYXzIwNTZfcmV2N1tdLAotCXJlZ3NfUlhfMjA1Nl9yZXY3W107Ci1leHRlcm4gc3RydWN0IHJhZGlvX3JlZ3MgcmVnc19TWU5fMjA1Nl9yZXY4W10sIHJlZ3NfVFhfMjA1Nl9yZXY4W10sCi0JcmVnc19SWF8yMDU2X3JldjhbXTsKLWV4dGVybiBzdHJ1Y3QgcmFkaW9fMjB4eF9yZWdzIHJlZ3NfMjA1N19yZXY0W10sIHJlZ3NfMjA1N19yZXY1W10sCi0JICAgICAgcmVnc18yMDU3X3JldjV2MVtdOwotZXh0ZXJuIHN0cnVjdCByYWRpb18yMHh4X3JlZ3MgcmVnc18yMDU3X3JldjdbXSwgcmVnc18yMDU3X3JldjhbXTsKLQotZXh0ZXJuIGNoYXIgKnBoeV9nZXR2YXIoc3RydWN0IGJyY21zX3BoeSAqcGksIGNvbnN0IGNoYXIgKm5hbWUpOwotZXh0ZXJuIGludCBwaHlfZ2V0aW50dmFyKHN0cnVjdCBicmNtc19waHkgKnBpLCBjb25zdCBjaGFyICpuYW1lKTsKLSNkZWZpbmUgUEhZX0dFVFZBUihwaSwgbmFtZSkJcGh5X2dldHZhcihwaSwgbmFtZSkKLSNkZWZpbmUgUEhZX0dFVElOVFZBUihwaSwgbmFtZSkJcGh5X2dldGludHZhcihwaSwgbmFtZSkKLQotZXh0ZXJuIHUxNiByZWFkX3BoeV9yZWcoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBhZGRyKTsKLWV4dGVybiB2b2lkIHdyaXRlX3BoeV9yZWcoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBhZGRyLCB1MTYgdmFsKTsKLWV4dGVybiB2b2lkIGFuZF9waHlfcmVnKHN0cnVjdCBicmNtc19waHkgKnBpLCB1MTYgYWRkciwgdTE2IHZhbCk7Ci1leHRlcm4gdm9pZCBvcl9waHlfcmVnKHN0cnVjdCBicmNtc19waHkgKnBpLCB1MTYgYWRkciwgdTE2IHZhbCk7Ci1leHRlcm4gdm9pZCBtb2RfcGh5X3JlZyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTE2IGFkZHIsIHUxNiBtYXNrLCB1MTYgdmFsKTsKLQotZXh0ZXJuIHUxNiByZWFkX3JhZGlvX3JlZyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTE2IGFkZHIpOwotZXh0ZXJuIHZvaWQgb3JfcmFkaW9fcmVnKHN0cnVjdCBicmNtc19waHkgKnBpLCB1MTYgYWRkciwgdTE2IHZhbCk7Ci1leHRlcm4gdm9pZCBhbmRfcmFkaW9fcmVnKHN0cnVjdCBicmNtc19waHkgKnBpLCB1MTYgYWRkciwgdTE2IHZhbCk7Ci1leHRlcm4gdm9pZCBtb2RfcmFkaW9fcmVnKHN0cnVjdCBicmNtc19waHkgKnBpLCB1MTYgYWRkciwgdTE2IG1hc2ssCi0JCQkgIHUxNiB2YWwpOwotZXh0ZXJuIHZvaWQgeG9yX3JhZGlvX3JlZyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTE2IGFkZHIsIHUxNiBtYXNrKTsKLQotZXh0ZXJuIHZvaWQgd3JpdGVfcmFkaW9fcmVnKHN0cnVjdCBicmNtc19waHkgKnBpLCB1MTYgYWRkciwgdTE2IHZhbCk7Ci0KLWV4dGVybiB2b2lkIHdsY19waHlyZWdfZW50ZXIoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCk7Ci1leHRlcm4gdm9pZCB3bGNfcGh5cmVnX2V4aXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCk7Ci1leHRlcm4gdm9pZCB3bGNfcmFkaW9yZWdfZW50ZXIoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCk7Ci1leHRlcm4gdm9pZCB3bGNfcmFkaW9yZWdfZXhpdChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcGloKTsKLQotZXh0ZXJuIHZvaWQgd2xjX3BoeV9yZWFkX3RhYmxlKHN0cnVjdCBicmNtc19waHkgKnBpLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwaHl0YmxfaW5mbyAqcHRibF9pbmZvLAotCQkJICAgICAgIHUxNiB0YmxBZGRyLCB1MTYgdGJsRGF0YUhpLAotCQkJICAgICAgIHUxNiB0YmxEYXRhbG8pOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV93cml0ZV90YWJsZShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwKLQkJCQljb25zdCBzdHJ1Y3QgcGh5dGJsX2luZm8gKnB0YmxfaW5mbywKLQkJCQl1MTYgdGJsQWRkciwgdTE2IHRibERhdGFIaSwgdTE2IHRibERhdGFsbyk7Ci1leHRlcm4gdm9pZCB3bGNfcGh5X3RhYmxlX2FkZHIoc3RydWN0IGJyY21zX3BoeSAqcGksIHVpbnQgdGJsX2lkLAotCQkJICAgICAgIHVpbnQgdGJsX29mZnNldCwgdTE2IHRibEFkZHIsIHUxNiB0YmxEYXRhSGksCi0JCQkgICAgICAgdTE2IHRibERhdGFMbyk7Ci1leHRlcm4gdm9pZCB3bGNfcGh5X3RhYmxlX2RhdGFfd3JpdGUoc3RydWN0IGJyY21zX3BoeSAqcGksIHVpbnQgd2lkdGgsIHUzMiB2YWwpOwotCi1leHRlcm4gdm9pZCB3cml0ZV9waHlfY2hhbm5lbF9yZWcoc3RydWN0IGJyY21zX3BoeSAqcGksIHVpbnQgdmFsKTsKLWV4dGVybiB2b2lkIHdsY19waHlfdHhwb3dlcl91cGRhdGVfc2htKHN0cnVjdCBicmNtc19waHkgKnBpKTsKLQotZXh0ZXJuIHZvaWQgd2xjX3BoeV9jb3JkaWMoZml4ZWQgdGhldGEsIGNzMzIgKnZhbCk7Ci1leHRlcm4gdTggd2xjX3BoeV9uYml0cyhzMzIgdmFsdWUpOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV9jb21wdXRlX2RCKHUzMiAqY21wbHhfcHdyLCBzOCAqcF9kQiwgdTggY29yZSk7Ci0KLWV4dGVybiB1aW50IHdsY19waHlfaW5pdF9yYWRpb19yZWdzX2FsbGJhbmRzKHN0cnVjdCBicmNtc19waHkgKnBpLAotCQkJCQkgICAgIHN0cnVjdCByYWRpb18yMHh4X3JlZ3MgKnJhZGlvcmVncyk7Ci1leHRlcm4gdWludCB3bGNfcGh5X2luaXRfcmFkaW9fcmVncyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwKLQkJCQkgICAgc3RydWN0IHJhZGlvX3JlZ3MgKnJhZGlvcmVncywKLQkJCQkgICAgdTE2IGNvcmVfb2Zmc2V0KTsKLQotZXh0ZXJuIHZvaWQgd2xjX3BoeV90eHBvd2VyX2lwYV91cGQoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotCi1leHRlcm4gdm9pZCB3bGNfcGh5X2RvX2R1bW15X3R4KHN0cnVjdCBicmNtc19waHkgKnBpLCBib29sIG9mZG0sIGJvb2wgcGFfb24pOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV9wYXBkX2RlY29kZV9lcHNpbG9uKHUzMiBlcHNpbG9uLCBzMzIgKmVwc19yZWFsLAotCQkJCQlzMzIgKmVwc19pbWFnKTsKLQotZXh0ZXJuIHZvaWQgd2xjX3BoeV9jYWxfcGVyaWNhbF9tcGhhc2VfcmVzZXQoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV9jYWxfcGVyaWNhbF9tcGhhc2VfcmVzdGFydChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci0KLWV4dGVybiBib29sIHdsY19waHlfYXR0YWNoX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotZXh0ZXJuIGJvb2wgd2xjX3BoeV9hdHRhY2hfbGNucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKTsKLQotZXh0ZXJuIHZvaWQgd2xjX3BoeV9kZXRhY2hfbGNucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKTsKLQotZXh0ZXJuIHZvaWQgd2xjX3BoeV9pbml0X25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV9pbml0X2xjbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci0KLWV4dGVybiB2b2lkIHdsY19waHlfY2FsX2luaXRfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1leHRlcm4gdm9pZCB3bGNfcGh5X2NhbF9pbml0X2xjbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci0KLWV4dGVybiB2b2lkIHdsY19waHlfY2hhbnNwZWNfc2V0X25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksCi0JCQkJICAgICAgY2hhbnNwZWNfdCBjaGFuc3BlYyk7Ci1leHRlcm4gdm9pZCB3bGNfcGh5X2NoYW5zcGVjX3NldF9sY25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksCi0JCQkJCWNoYW5zcGVjX3QgY2hhbnNwZWMpOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV9jaGFuc3BlY19zZXRfZml4dXBfbGNucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLAotCQkJCQkgICAgICBjaGFuc3BlY190IGNoYW5zcGVjKTsKLWV4dGVybiBpbnQgd2xjX3BoeV9jaGFubmVsMmZyZXEodWludCBjaGFubmVsKTsKLWV4dGVybiBpbnQgd2xjX3BoeV9jaGFuc3BlY19mcmVxMmJhbmRyYW5nZV9scHNzbih1aW50KTsKLWV4dGVybiBpbnQgd2xjX3BoeV9jaGFuc3BlY19iYW5kcmFuZ2VfZ2V0KHN0cnVjdCBicmNtc19waHkgKiwgY2hhbnNwZWNfdCk7Ci0KLWV4dGVybiB2b2lkIHdsY19sY25waHlfc2V0X3R4X3B3cl9jdHJsKHN0cnVjdCBicmNtc19waHkgKnBpLCB1MTYgbW9kZSk7Ci1leHRlcm4gczggd2xjX2xjbnBoeV9nZXRfY3VycmVudF90eF9wd3JfaWR4KHN0cnVjdCBicmNtc19waHkgKnBpKTsKLQotZXh0ZXJuIHZvaWQgd2xjX3BoeV90eHBvd2VyX3JlY2FsY190YXJnZXRfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1leHRlcm4gdm9pZCB3bGNfbGNucGh5X3R4cG93ZXJfcmVjYWxjX3RhcmdldChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1leHRlcm4gdm9pZCB3bGNfcGh5X3R4cG93ZXJfcmVjYWxjX3RhcmdldF9sY25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotCi1leHRlcm4gdm9pZCB3bGNfbGNucGh5X3NldF90eF9wd3JfYnlfaW5kZXgoc3RydWN0IGJyY21zX3BoeSAqcGksIGludCBpbmRleCk7Ci1leHRlcm4gdm9pZCB3bGNfbGNucGh5X3R4X3B1KHN0cnVjdCBicmNtc19waHkgKnBpLCBib29sIGJFbmFibGUpOwotZXh0ZXJuIHZvaWQgd2xjX2xjbnBoeV9zdG9wX3R4X3RvbmUoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotZXh0ZXJuIHZvaWQgd2xjX2xjbnBoeV9zdGFydF90eF90b25lKHN0cnVjdCBicmNtc19waHkgKnBpLCBzMzIgZl9rSHosCi0JCQkJICAgICB1MTYgbWF4X3ZhbCwgYm9vbCBpcWNhbG1vZGUpOwotCi1leHRlcm4gdm9pZCB3bGNfcGh5X3R4cG93ZXJfc3JvbWxpbWl0X2dldF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1aW50IGNoYW4sCi0JCQkJCSAgICAgICB1OCAqbWF4X3B3ciwgdTggcmF0ZV9pZCk7Ci1leHRlcm4gdm9pZCB3bGNfcGh5X29mZG1fdG9fbWNzX3Bvd2Vyc19ucGh5KHU4ICpwb3dlciwgdTggcmF0ZV9tY3Nfc3RhcnQsCi0JCQkJCSAgICB1OCByYXRlX21jc19lbmQsCi0JCQkJCSAgICB1OCByYXRlX29mZG1fc3RhcnQpOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV9tY3NfdG9fb2ZkbV9wb3dlcnNfbnBoeSh1OCAqcG93ZXIsCi0JCQkJCSAgICB1OCByYXRlX29mZG1fc3RhcnQsCi0JCQkJCSAgICB1OCByYXRlX29mZG1fZW5kLAotCQkJCQkgICAgdTggcmF0ZV9tY3Nfc3RhcnQpOwotCi1leHRlcm4gdTE2IHdsY19sY25waHlfdGVtcHNlbnNlKHN0cnVjdCBicmNtc19waHkgKnBpLCBib29sIG1vZGUpOwotZXh0ZXJuIHMxNiB3bGNfbGNucGh5X3RlbXBzZW5zZV9uZXcoc3RydWN0IGJyY21zX3BoeSAqcGksIGJvb2wgbW9kZSk7Ci1leHRlcm4gczggd2xjX2xjbnBoeV90ZW1wc2Vuc2VfZGVncmVlKHN0cnVjdCBicmNtc19waHkgKnBpLCBib29sIG1vZGUpOwotZXh0ZXJuIHM4IHdsY19sY25waHlfdmJhdHNlbnNlKHN0cnVjdCBicmNtc19waHkgKnBpLCBib29sIG1vZGUpOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV9jYXJyaWVyX3N1cHByZXNzX2xjbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1leHRlcm4gdm9pZCB3bGNfbGNucGh5X2Nyc3VwcnMoc3RydWN0IGJyY21zX3BoeSAqcGksIGludCBjaGFubmVsKTsKLWV4dGVybiB2b2lkIHdsY19sY25waHlfZXBhX3N3aXRjaChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgYm9vbCBtb2RlKTsKLWV4dGVybiB2b2lkIHdsY18yMDY0X3Zjb19jYWwoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotCi1leHRlcm4gdm9pZCB3bGNfcGh5X3R4cG93ZXJfcmVjYWxjX3RhcmdldChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci0KLSNkZWZpbmUgTENOUEhZX1RCTF9JRF9QQVBEQ09NUERFTFRBVEJMCTB4MTgKLSNkZWZpbmUgTENOUEhZX1RYX1BPV0VSX1RBQkxFX1NJWkUJMTI4Ci0jZGVmaW5lIExDTlBIWV9NQVhfVFhfUE9XRVJfSU5ERVgJKExDTlBIWV9UWF9QT1dFUl9UQUJMRV9TSVpFIC0gMSkKLSNkZWZpbmUgTENOUEhZX1RCTF9JRF9UWFBXUkNUTAkweDA3Ci0jZGVmaW5lIExDTlBIWV9UWF9QV1JfQ1RSTF9PRkYJMAotI2RlZmluZSBMQ05QSFlfVFhfUFdSX0NUUkxfU1cJCSgweDEgPDwgMTUpCi0jZGVmaW5lIExDTlBIWV9UWF9QV1JfQ1RSTF9IVyAgICAgICAgICgoMHgxIDw8IDE1KSB8IFwKLQkJCQkJKDB4MSA8PCAxNCkgfCBcCi0JCQkJCSgweDEgPDwgMTMpKQotCi0jZGVmaW5lIExDTlBIWV9UWF9QV1JfQ1RSTF9URU1QQkFTRUQJMHhFMDAxCi0KLWV4dGVybiB2b2lkIHdsY19sY25waHlfd3JpdGVfdGFibGUoc3RydWN0IGJyY21zX3BoeSAqcGksCi0JCQkJICAgY29uc3Qgc3RydWN0IHBoeXRibF9pbmZvICpwdGkpOwotZXh0ZXJuIHZvaWQgd2xjX2xjbnBoeV9yZWFkX3RhYmxlKHN0cnVjdCBicmNtc19waHkgKnBpLAotCQkJCSAgc3RydWN0IHBoeXRibF9pbmZvICpwdGkpOwotZXh0ZXJuIHZvaWQgd2xjX2xjbnBoeV9zZXRfdHhfaXFjYyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTE2IGEsIHUxNiBiKTsKLWV4dGVybiB2b2lkIHdsY19sY25waHlfc2V0X3R4X2xvY2Moc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBkaWRxKTsKLWV4dGVybiB2b2lkIHdsY19sY25waHlfZ2V0X3R4X2lxY2Moc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiAqYSwgdTE2ICpiKTsKLWV4dGVybiB1MTYgd2xjX2xjbnBoeV9nZXRfdHhfbG9jYyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1leHRlcm4gdm9pZCB3bGNfbGNucGh5X2dldF9yYWRpb19sb2Z0KHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCAqZWkwLAotCQkJCSAgICAgIHU4ICplcTAsIHU4ICpmaTAsIHU4ICpmcTApOwotZXh0ZXJuIHZvaWQgd2xjX2xjbnBoeV9jYWxpYl9tb2RlcyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdWludCBtb2RlKTsKLWV4dGVybiB2b2lkIHdsY19sY25waHlfZGVhZl9tb2RlKHN0cnVjdCBicmNtc19waHkgKnBpLCBib29sIG1vZGUpOwotZXh0ZXJuIGJvb2wgd2xjX3BoeV90cGNfaXNlbmFibGVkX2xjbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1leHRlcm4gdm9pZCB3bGNfbGNucGh5X3R4X3B3cl91cGRhdGVfbnB0KHN0cnVjdCBicmNtc19waHkgKnBpKTsKLWV4dGVybiBzMzIgd2xjX2xjbnBoeV90c3NpMmRibShzMzIgdHNzaSwgczMyIGExLCBzMzIgYjAsIHMzMiBiMSk7Ci1leHRlcm4gdm9pZCB3bGNfbGNucGh5X2dldF90c3NpKHN0cnVjdCBicmNtc19waHkgKnBpLCBzOCAqb2ZkbV9wd3IsCi0JCQkJczggKmNja19wd3IpOwotZXh0ZXJuIHZvaWQgd2xjX2xjbnBoeV90eF9wb3dlcl9hZGp1c3RtZW50KHN0cnVjdCBicmNtc19waHlfcHViICpwcGkpOwotCi1leHRlcm4gczMyIHdsY19sY25waHlfcnhfc2lnbmFsX3Bvd2VyKHN0cnVjdCBicmNtc19waHkgKnBpLCBzMzIgZ2Fpbl9pbmRleCk7Ci0KLSNkZWZpbmUgTlBIWV9NQVhfSFBWR0ExX0lOREVYCQkxMAotI2RlZmluZSBOUEhZX0RFRl9IUFZHQTFfSU5ERVhMSU1JVAk3Ci0KLXN0cnVjdCBwaHlfaXFfZXN0IHsKLQlzMzIgaXFfcHJvZDsKLQl1MzIgaV9wd3I7Ci0JdTMyIHFfcHdyOwotfTsKLQotZXh0ZXJuIHZvaWQgd2xjX3BoeV9zdGF5X2luX2NhcnJpZXJzZWFyY2hfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwKLQkJCQkJICAgICAgIGJvb2wgZW5hYmxlKTsKLWV4dGVybiB2b2lkIHdsY19ucGh5X2RlYWZfbW9kZShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgYm9vbCBtb2RlKTsKLQotI2RlZmluZSB3bGNfcGh5X3dyaXRlX3RhYmxlX25waHkocGksIHB0aSkJd2xjX3BoeV93cml0ZV90YWJsZShwaSwgcHRpLCAweDcyLCBcCi0JMHg3NCwgMHg3MykKLSNkZWZpbmUgd2xjX3BoeV9yZWFkX3RhYmxlX25waHkocGksIHB0aSkJd2xjX3BoeV9yZWFkX3RhYmxlKHBpLCBwdGksIDB4NzIsIFwKLQkweDc0LCAweDczKQotI2RlZmluZSB3bGNfbnBoeV90YWJsZV9hZGRyKHBpLCBpZCwgb2ZmKQl3bGNfcGh5X3RhYmxlX2FkZHIoKHBpKSwgKGlkKSwgKG9mZiksIFwKLQkweDcyLCAweDc0LCAweDczKQotI2RlZmluZSB3bGNfbnBoeV90YWJsZV9kYXRhX3dyaXRlKHBpLCB3LCB2KQl3bGNfcGh5X3RhYmxlX2RhdGFfd3JpdGUoKHBpKSwgKHcpLCAodikpCi0KLWV4dGVybiB2b2lkIHdsY19waHlfdGFibGVfcmVhZF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1MzIsIHUzMiBsLCB1MzIgbywKLQkJCQkgICAgdTMyIHcsIHZvaWQgKmQpOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1MzIsIHUzMiwgdTMyLAotCQkJCSAgICAgdTMyLCBjb25zdCB2b2lkICopOwotCi0jZGVmaW5lCVBIWV9JUEEocGkpIFwKLQkoKHBpLT5pcGEyZ19vbiAmJiBDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB8fCBcCi0JIChwaS0+aXBhNWdfb24gJiYgQ0hTUEVDX0lTNUcocGktPnJhZGlvX2NoYW5zcGVjKSkpCi0KLSNkZWZpbmUgQlJDTVNfUEhZX1dBUl9QUjUxNTcxKHBpKSBcCi0JaWYgKCgocGkpLT5zaC0+YnVzdHlwZSA9PSBQQ0lfQlVTKSAmJiBOUkVWX0xUKChwaSktPnB1YnBpLnBoeV9yZXYsIDMpKSBcCi0JCSh2b2lkKVJfUkVHKCYocGkpLT5yZWdzLT5tYWNjb250cm9sKQotCi1leHRlcm4gdm9pZCB3bGNfcGh5X2NhbF9wZXJpY2FsX25waHlfcnVuKHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCBjYWx0eXBlKTsKLWV4dGVybiB2b2lkIHdsY19waHlfYWNpX3Jlc2V0X25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV9wYV9vdmVycmlkZV9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCBib29sIGVuKTsKLQotZXh0ZXJuIHU4IHdsY19waHlfZ2V0X2NoYW5fZnJlcV9yYW5nZV9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1aW50IGNoYW4pOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV9zd2l0Y2hfcmFkaW9fbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgYm9vbCBvbik7Ci0KLWV4dGVybiB2b2lkIHdsY19waHlfc3RmX2NoYWluX3VwZF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKTsKLQotZXh0ZXJuIHZvaWQgd2xjX3BoeV9mb3JjZV9yZnNlcV9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCBjbWQpOwotZXh0ZXJuIHMxNiB3bGNfcGh5X3RlbXBzZW5zZV9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKTsKLQotZXh0ZXJuIHUxNiB3bGNfcGh5X2NsYXNzaWZpZXJfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTE2IG1hc2ssIHUxNiB2YWwpOwotCi1leHRlcm4gdm9pZCB3bGNfcGh5X3J4X2lxX2VzdF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCBzdHJ1Y3QgcGh5X2lxX2VzdCAqZXN0LAotCQkJCSAgIHUxNiBudW1fc2FtcHMsIHU4IHdhaXRfdGltZSwKLQkJCQkgICB1OCB3YWl0X2Zvcl9jcnMpOwotCi1leHRlcm4gdm9pZCB3bGNfcGh5X3J4X2lxX2NvZWZmc19ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCB3cml0ZSwKLQkJCQkgICAgICBzdHJ1Y3QgbnBoeV9pcV9jb21wICpjb21wKTsKLWV4dGVybiB2b2lkIHdsY19waHlfYWNpX2FuZF9ub2lzZV9yZWR1Y3Rpb25fbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci0KLWV4dGVybiB2b2lkIHdsY19waHlfcnhjb3JlX3NldHN0YXRlX25waHkoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCwKLQkJCQkJIHU4IHJ4Y29yZV9iaXRtYXNrKTsKLWV4dGVybiB1OCB3bGNfcGh5X3J4Y29yZV9nZXRzdGF0ZV9ucGh5KHN0cnVjdCBicmNtc19waHlfcHViICpwaWgpOwotCi1leHRlcm4gdm9pZCB3bGNfcGh5X3R4cHdyY3RybF9lbmFibGVfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTggY3RybF90eXBlKTsKLWV4dGVybiB2b2lkIHdsY19waHlfdHhwd3JfZml4cG93ZXJfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1leHRlcm4gdm9pZCB3bGNfcGh5X3R4cHdyX2FwcGx5X25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV90eHB3cl9wYXBkX2NhbF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKTsKLWV4dGVybiB1MTYgd2xjX3BoeV90eHB3cl9pZHhfZ2V0X25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotCi1leHRlcm4gc3RydWN0IG5waHlfdHhnYWlucyB3bGNfcGh5X2dldF90eF9nYWluX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotZXh0ZXJuIGludCB3bGNfcGh5X2NhbF90eGlxbG9fbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwKLQkJCQkgICBzdHJ1Y3QgbnBoeV90eGdhaW5zIHRhcmdldF9nYWluLAotCQkJCSAgIGJvb2wgZnVsbCwgYm9vbCBtKTsKLWV4dGVybiBpbnQgd2xjX3BoeV9jYWxfcnhpcV9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLAotCQkJCSBzdHJ1Y3QgbnBoeV90eGdhaW5zIHRhcmdldF9nYWluLAotCQkJCSB1OCB0eXBlLCBib29sIGQpOwotZXh0ZXJuIHZvaWQgd2xjX3BoeV90eHB3cl9pbmRleF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCBjb3JlX21hc2ssCi0JCQkJICAgICBzOCB0eHB3cmluZGV4LCBib29sIHJlcyk7Ci1leHRlcm4gdm9pZCB3bGNfcGh5X3Jzc2lzZWxfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTggY29yZSwgdTggcnNzaV90eXBlKTsKLWV4dGVybiBpbnQgd2xjX3BoeV9wb2xsX3Jzc2lfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTggcnNzaV90eXBlLAotCQkJCSAgczMyICpyc3NpX2J1ZiwgdTggbnNhbXBzKTsKLWV4dGVybiB2b2lkIHdsY19waHlfcnNzaV9jYWxfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1leHRlcm4gaW50IHdsY19waHlfYWNpX3NjYW5fbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1leHRlcm4gdm9pZCB3bGNfcGh5X2NhbF90eGdhaW5jdHJsX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksCi0JCQkJCXMzMiBkQm1fdGFyZ2V0cG93ZXIsIGJvb2wgZGVidWcpOwotZXh0ZXJuIGludCB3bGNfcGh5X3R4X3RvbmVfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTMyIGZfa0h6LCB1MTYgbWF4X3ZhbCwKLQkJCQl1OCBtb2RlLCB1OCwgYm9vbCk7Ci1leHRlcm4gdm9pZCB3bGNfcGh5X3N0b3BwbGF5YmFja19ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKTsKLWV4dGVybiB2b2lkIHdsY19waHlfZXN0X3RvbmVwd3JfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgczMyICpxZEJtX3B3cmJ1ZiwKLQkJCQkgICAgIHU4IG51bV9zYW1wcyk7Ci1leHRlcm4gdm9pZCB3bGNfcGh5X3JhZGlvMjA1eF92Y29jYWxfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci0KLWV4dGVybiBpbnQgd2xjX3BoeV9yc3NpX2NvbXB1dGVfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwKLQkJCQkgICAgIHN0cnVjdCBicmNtc19kMTFyeGhkciAqd2xjX3J4aCk7Ci0KLSNkZWZpbmUgTlBIWV9URVNUUEFUVEVSTl9CUEhZX0VWTSAgIDAKLSNkZWZpbmUgTlBIWV9URVNUUEFUVEVSTl9CUEhZX1JGQ1MgIDEKLQotZXh0ZXJuIHZvaWQgd2xjX3BoeV9ucGh5X3RraXBfcmlmc193YXIoc3RydWN0IGJyY21zX3BoeSAqcGksIHU4IHJpZnMpOwotCi12b2lkIHdsY19waHlfZ2V0X3B3cmRldF9vZmZzZXRzKHN0cnVjdCBicmNtc19waHkgKnBpLCBzOCAqY2Nrb2Zmc2V0LAotCQkJCXM4ICpvZmRtb2Zmc2V0KTsKLWV4dGVybiBzOCB3bGNfcGh5X3VwZF9yc3NpX29mZnNldChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgczggcnNzaSwKLQkJCQkgICAgY2hhbnNwZWNfdCBjaGFuc3BlYyk7Ci0KLWV4dGVybiBib29sIHdsY19waHlfbl90eHBvd2VyX2lwYV9pc29uKHN0cnVjdCBicmNtc19waHkgKnBpaCk7Ci0jZW5kaWYJCQkJLyogX0JSQ01fUEhZX0lOVF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2xjbi5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2xjbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTNmYmU2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9sY24uYworKysgL2Rldi9udWxsCkBAIC0xLDUyOTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotCi0jaW5jbHVkZSA8cG11Lmg+Ci0jaW5jbHVkZSA8ZDExLmg+Ci0jaW5jbHVkZSA8cGh5X3NoaW0uaD4KLSNpbmNsdWRlICJwaHlfcW1hdGguaCIKLSNpbmNsdWRlICJwaHlfaGFsLmgiCi0jaW5jbHVkZSAicGh5X3JhZGlvLmgiCi0jaW5jbHVkZSAicGh5dGJsX2xjbi5oIgotI2luY2x1ZGUgInBoeV9sY24uaCIKLQotI2RlZmluZSBQTExfMjA2NF9ORElWCQk5MAotI2RlZmluZSBQTExfMjA2NF9MT1dfRU5EX1ZDTwkzMDAwCi0jZGVmaW5lIFBMTF8yMDY0X0xPV19FTkRfS1ZDTwkyNwotI2RlZmluZSBQTExfMjA2NF9ISUdIX0VORF9WQ08JNDIwMAotI2RlZmluZSBQTExfMjA2NF9ISUdIX0VORF9LVkNPCTY4Ci0jZGVmaW5lIFBMTF8yMDY0X0xPT1BfQldfRE9VQkxFUgkyMDAKLSNkZWZpbmUgUExMXzIwNjRfRDMwX0RPVUJMRVIJCTEwNTAwCi0jZGVmaW5lIFBMTF8yMDY0X0xPT1BfQlcJMjYwCi0jZGVmaW5lIFBMTF8yMDY0X0QzMAkJODAwMAotI2RlZmluZSBQTExfMjA2NF9DQUxfUkVGX1RPCTgKLSNkZWZpbmUgUExMXzIwNjRfTUhaCQkxMDAwMDAwCi0jZGVmaW5lIFBMTF8yMDY0X09QRU5fTE9PUF9ERUxBWQk1Ci0KLSNkZWZpbmUgVEVNUFNFTlNFCQkJMQotI2RlZmluZSBWQkFUU0VOU0UgICAgICAgICAgIDIKLQotI2RlZmluZSBOT0lTRV9JRl9VUERfQ0hLX0lOVEVSVkFMCTEKLSNkZWZpbmUgTk9JU0VfSUZfVVBEX1JTVF9JTlRFUlZBTAk2MAotI2RlZmluZSBOT0lTRV9JRl9VUERfVEhSRVNIT0xEX0NOVAkxCi0jZGVmaW5lIE5PSVNFX0lGX1VQRF9UUkhSRVNIT0xECTUwCi0jZGVmaW5lIE5PSVNFX0lGX1VQRF9USU1FT1VUCQkxMDAwCi0jZGVmaW5lIE5PSVNFX0lGX09GRgkJCTAKLSNkZWZpbmUgTk9JU0VfSUZfQ0hLCQkJMQotI2RlZmluZSBOT0lTRV9JRl9PTgkJCTIKLQotI2RlZmluZSBQQVBEX0JMQU5LSU5HX1BST0ZJTEUJCTMKLSNkZWZpbmUgUEFQRDJMVVQJCQkwCi0jZGVmaW5lIFBBUERfQ09SUl9OT1JNCQkJMAotI2RlZmluZSBQQVBEX0JMQU5LSU5HX1RIUkVTSE9MRAkJMAotI2RlZmluZSBQQVBEX1NUT1BfQUZURVJfTEFTVF9VUERBVEUJMAotCi0jZGVmaW5lIExDTl9UQVJHRVRfUFdSICA2MAotCi0jZGVmaW5lIExDTl9WQkFUX09GRlNFVF80MzNYIDM0NjQ5Njc5Ci0jZGVmaW5lIExDTl9WQkFUX1NMT1BFXzQzM1ggIDgyNTgwMzIKLQotI2RlZmluZSBMQ05fVkJBVF9TQ0FMRV9OT00gIDUzCi0jZGVmaW5lIExDTl9WQkFUX1NDQUxFX0RFTiAgNDMyCi0KLSNkZWZpbmUgTENOX1RFTVBTRU5TRV9PRkZTRVQgIDgwODEyCi0jZGVmaW5lIExDTl9URU1QU0VOU0VfREVOICAyNjQ3Ci0KLSNkZWZpbmUgTENOUEhZX3R4Z2FpbmN0cmxvdnJ2YWwxX3BhZ2Fpbl9vdnJfdmFsMV9TSElGVCBcCi0JKDAgKyA4KQotI2RlZmluZSBMQ05QSFlfdHhnYWluY3RybG92cnZhbDFfcGFnYWluX292cl92YWwxX01BU0sgXAotCSgweDdmIDw8IExDTlBIWV90eGdhaW5jdHJsb3ZydmFsMV9wYWdhaW5fb3ZyX3ZhbDFfU0hJRlQpCi0KLSNkZWZpbmUgTENOUEhZX3N0eHR4Z2FpbmN0cmxvdnJ2YWwxX3BhZ2Fpbl9vdnJfdmFsMV9TSElGVCBcCi0JKDAgKyA4KQotI2RlZmluZSBMQ05QSFlfc3R4dHhnYWluY3RybG92cnZhbDFfcGFnYWluX292cl92YWwxX01BU0sgXAotCSgweDdmIDw8IExDTlBIWV9zdHh0eGdhaW5jdHJsb3ZydmFsMV9wYWdhaW5fb3ZyX3ZhbDFfU0hJRlQpCi0KLSNkZWZpbmUgd2xjX2xjbnBoeV9lbmFibGVfdHhfZ2Fpbl9vdmVycmlkZShwaSkgXAotCXdsY19sY25waHlfc2V0X3R4X2dhaW5fb3ZlcnJpZGUocGksIHRydWUpCi0jZGVmaW5lIHdsY19sY25waHlfZGlzYWJsZV90eF9nYWluX292ZXJyaWRlKHBpKSBcCi0Jd2xjX2xjbnBoeV9zZXRfdHhfZ2Fpbl9vdmVycmlkZShwaSwgZmFsc2UpCi0KLSNkZWZpbmUgd2xjX2xjbnBoeV9pcWNhbF9hY3RpdmUocGkpCVwKLQkocmVhZF9waHlfcmVnKChwaSksIDB4NDUxKSAmIFwKLQkoKDB4MSA8PCAxNSkgfCAoMHgxIDw8IDE0KSkpCi0KLSNkZWZpbmUgdHhwd3JjdHJsX29mZihwaSkgKDB4NyAhPSAoKHJlYWRfcGh5X3JlZyhwaSwgMHg0YTQpICYgMHhFMDAwKSA+PiAxMykpCi0jZGVmaW5lIHdsY19sY25waHlfdGVtcHNlbnNlX2Jhc2VkX3B3cl9jdHJsX2VuYWJsZWQocGkpIFwKLQkocGktPnRlbXBwd3JjdHJsX2NhcGFibGUpCi0jZGVmaW5lIHdsY19sY25waHlfdHNzaV9iYXNlZF9wd3JfY3RybF9lbmFibGVkKHBpKSBcCi0JKHBpLT5od3B3cmN0cmxfY2FwYWJsZSkKLQotI2RlZmluZSBTV0NUUkxfQlRfVFgJCTB4MTgKLSNkZWZpbmUgU1dDVFJMX09WUl9ESVNBQkxFCTB4NDAKLQotI2RlZmluZQlBRkVfQ0xLX0lOSVRfTU9ERV9UWFJYMlgJMQotI2RlZmluZQlBRkVfQ0xLX0lOSVRfTU9ERV9QQVBECQkwCi0KLSNkZWZpbmUgTENOUEhZX1RCTF9JRF9JUUxPQ0FMCQkJMHgwMAotCi0jZGVmaW5lIExDTlBIWV9UQkxfSURfUkZTRVEgICAgICAgICAweDA4Ci0jZGVmaW5lIExDTlBIWV9UQkxfSURfR0FJTl9JRFgJCTB4MGQKLSNkZWZpbmUgTENOUEhZX1RCTF9JRF9TV19DVFJMCQkJMHgwZgotI2RlZmluZSBMQ05QSFlfVEJMX0lEX0dBSU5fVEJMCQkweDEyCi0jZGVmaW5lIExDTlBIWV9UQkxfSURfU1BVUgkJCTB4MTQKLSNkZWZpbmUgTENOUEhZX1RCTF9JRF9TQU1QTEVQTEFZCQkweDE1Ci0jZGVmaW5lIExDTlBIWV9UQkxfSURfU0FNUExFUExBWTEJCTB4MTYKLQotI2RlZmluZSBMQ05QSFlfVFhfUFdSX0NUUkxfUkFURV9PRkZTRVQJODMyCi0jZGVmaW5lIExDTlBIWV9UWF9QV1JfQ1RSTF9NQUNfT0ZGU0VUCTEyOAotI2RlZmluZSBMQ05QSFlfVFhfUFdSX0NUUkxfR0FJTl9PRkZTRVQJMTkyCi0jZGVmaW5lIExDTlBIWV9UWF9QV1JfQ1RSTF9JUV9PRkZTRVQJCTMyMAotI2RlZmluZSBMQ05QSFlfVFhfUFdSX0NUUkxfTE9fT0ZGU0VUCQk0NDgKLSNkZWZpbmUgTENOUEhZX1RYX1BXUl9DVFJMX1BXUl9PRkZTRVQJCTU3NgotCi0jZGVmaW5lIExDTlBIWV9UWF9QV1JfQ1RSTF9TVEFSVF9JTkRFWF8yR180MzEzCTE0MAotCi0jZGVmaW5lIExDTlBIWV9UWF9QV1JfQ1RSTF9TVEFSVF9OUFQJCTEKLSNkZWZpbmUgTENOUEhZX1RYX1BXUl9DVFJMX01BWF9OUFQJCQk3Ci0KLSNkZWZpbmUgTENOUEhZX05PSVNFX1NBTVBMRVNfREVGQVVMVCA1MDAwCi0KLSNkZWZpbmUgTENOUEhZX0FDSV9ERVRFQ1RfU1RBUlQgICAgICAxCi0jZGVmaW5lIExDTlBIWV9BQ0lfREVURUNUX1BST0dSRVNTICAgMgotI2RlZmluZSBMQ05QSFlfQUNJX0RFVEVDVF9TVE9QICAgICAgIDMKLQotI2RlZmluZSBMQ05QSFlfQUNJX0NSU0hJRlJNTE9fVFJTSCAxMDAKLSNkZWZpbmUgTENOUEhZX0FDSV9HTElUQ0hfVFJTSCAyMDAwCi0jZGVmaW5lCUxDTlBIWV9BQ0lfVE1PVVQgMjUwCi0jZGVmaW5lIExDTlBIWV9BQ0lfREVURUNUX1RJTUVPVVQgIDIKLSNkZWZpbmUgTENOUEhZX0FDSV9TVEFSVF9ERUxBWSAwCi0KLSNkZWZpbmUgd2xjX2xjbnBoeV90eF9nYWluX292ZXJyaWRlX2VuYWJsZWQocGkpIFwKLQkoMCAhPSAocmVhZF9waHlfcmVnKChwaSksIDB4NDNiKSAmICgweDEgPDwgNikpKQotCi0jZGVmaW5lIHdsY19sY25waHlfdG90YWxfdHhfZnJhbWVzKHBpKSBcCi0Jd2xhcGlfYm1hY19yZWFkX3NobSgocGkpLT5zaC0+cGh5c2hpbSwgXAotCQlNX1VDT0RFX01BQ1NUQVQgKyBvZmZzZXRvZihzdHJ1Y3QgbWFjc3RhdCwgdHhhbGxmcm0pKQotCi1zdHJ1Y3QgbGNucGh5X3R4Z2FpbnMgewotCXUxNiBnbV9nYWluOwotCXUxNiBwZ2FfZ2FpbjsKLQl1MTYgcGFkX2dhaW47Ci0JdTE2IGRhY19nYWluOwotfTsKLQotZW51bSBsY25waHlfY2FsX21vZGUgewotCUxDTlBIWV9DQUxfRlVMTCwKLQlMQ05QSFlfQ0FMX1JFQ0FMLAotCUxDTlBIWV9DQUxfQ1VSUkVDQUwsCi0JTENOUEhZX0NBTF9ESUdDQUwsCi0JTENOUEhZX0NBTF9HQ1RSTAotfTsKLQotc3RydWN0IGxjbnBoeV9yeF9pcWNvbXAgewotCXU4IGNoYW47Ci0JczE2IGE7Ci0JczE2IGI7Ci19OwotCi1zdHJ1Y3QgbGNucGh5X3NwYl90b25lIHsKLQlzMTYgcmU7Ci0JczE2IGltOwotfTsKLQotc3RydWN0IGxjbnBoeV91bnNpZ24xNl9zdHJ1Y3QgewotCXUxNiByZTsKLQl1MTYgaW07Ci19OwotCi1zdHJ1Y3QgbGNucGh5X2lxX2VzdCB7Ci0JdTMyIGlxX3Byb2Q7Ci0JdTMyIGlfcHdyOwotCXUzMiBxX3B3cjsKLX07Ci0KLXN0cnVjdCBsY25waHlfc2ZvX2NmZyB7Ci0JdTE2IHB0Y2VudHJlVHMyMDsKLQl1MTYgcHRjZW50cmVGYWN0b3I7Ci19OwotCi1lbnVtIGxjbnBoeV9wYXBkX2NhbF90eXBlIHsKLQlMQ05QSFlfUEFQRF9DQUxfQ1csCi0JTENOUEhZX1BBUERfQ0FMX09GRE0KLX07Ci0KLXR5cGVkZWYgdTE2IGlxY2FsX2dhaW5fcGFyYW1zX2xjbnBoeVs5XTsKLQotc3RhdGljIGNvbnN0IGlxY2FsX2dhaW5fcGFyYW1zX2xjbnBoeSB0YmxfaXFjYWxfZ2FpbnBhcmFtc19sY25waHlfMkdbXSA9IHsKLQl7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCi19OwotCi1zdGF0aWMgY29uc3QgaXFjYWxfZ2Fpbl9wYXJhbXNfbGNucGh5ICp0YmxfaXFjYWxfZ2FpbnBhcmFtc19sY25waHlbMV0gPSB7Ci0JdGJsX2lxY2FsX2dhaW5wYXJhbXNfbGNucGh5XzJHLAotfTsKLQotc3RhdGljIGNvbnN0IHUxNiBpcWNhbF9nYWlucGFyYW1zX251bWdhaW5zX2xjbnBoeVsxXSA9IHsKLQlzaXplb2YodGJsX2lxY2FsX2dhaW5wYXJhbXNfbGNucGh5XzJHKSAvCi0JICAgIHNpemVvZigqdGJsX2lxY2FsX2dhaW5wYXJhbXNfbGNucGh5XzJHKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbGNucGh5X3Nmb19jZmcgbGNucGh5X3Nmb19jZmdbXSA9IHsKLQl7OTY1LCAxMDg3fSwKLQl7OTY3LCAxMDg1fSwKLQl7OTY5LCAxMDgyfSwKLQl7OTcxLCAxMDgwfSwKLQl7OTczLCAxMDc4fSwKLQl7OTc1LCAxMDc2fSwKLQl7OTc3LCAxMDczfSwKLQl7OTc5LCAxMDcxfSwKLQl7OTgxLCAxMDY5fSwKLQl7OTgzLCAxMDY3fSwKLQl7OTg1LCAxMDY1fSwKLQl7OTg3LCAxMDYzfSwKLQl7OTg5LCAxMDYwfSwKLQl7OTk0LCAxMDU1fQotfTsKLQotc3RhdGljIGNvbnN0Ci11MTYgbGNucGh5X2lxY2FsX2xvZnRfZ2FpbmxhZGRlcltdID0gewotCSgoMiA8PCA4KSB8IDApLAotCSgoMyA8PCA4KSB8IDApLAotCSgoNCA8PCA4KSB8IDApLAotCSgoNiA8PCA4KSB8IDApLAotCSgoOCA8PCA4KSB8IDApLAotCSgoMTEgPDwgOCkgfCAwKSwKLQkoKDE2IDw8IDgpIHwgMCksCi0JKCgxNiA8PCA4KSB8IDEpLAotCSgoMTYgPDwgOCkgfCAyKSwKLQkoKDE2IDw8IDgpIHwgMyksCi0JKCgxNiA8PCA4KSB8IDQpLAotCSgoMTYgPDwgOCkgfCA1KSwKLQkoKDE2IDw8IDgpIHwgNiksCi0JKCgxNiA8PCA4KSB8IDcpLAotCSgoMjMgPDwgOCkgfCA3KSwKLQkoKDMyIDw8IDgpIHwgNyksCi0JKCg0NSA8PCA4KSB8IDcpLAotCSgoNjQgPDwgOCkgfCA3KSwKLQkoKDkxIDw8IDgpIHwgNyksCi0JKCgxMjggPDwgOCkgfCA3KQotfTsKLQotc3RhdGljIGNvbnN0Ci11MTYgbGNucGh5X2lxY2FsX2lyX2dhaW5sYWRkZXJbXSA9IHsKLQkoKDEgPDwgOCkgfCAwKSwKLQkoKDIgPDwgOCkgfCAwKSwKLQkoKDQgPDwgOCkgfCAwKSwKLQkoKDYgPDwgOCkgfCAwKSwKLQkoKDggPDwgOCkgfCAwKSwKLQkoKDExIDw8IDgpIHwgMCksCi0JKCgxNiA8PCA4KSB8IDApLAotCSgoMjMgPDwgOCkgfCAwKSwKLQkoKDMyIDw8IDgpIHwgMCksCi0JKCg0NSA8PCA4KSB8IDApLAotCSgoNjQgPDwgOCkgfCAwKSwKLQkoKDY0IDw8IDgpIHwgMSksCi0JKCg2NCA8PCA4KSB8IDIpLAotCSgoNjQgPDwgOCkgfCAzKSwKLQkoKDY0IDw8IDgpIHwgNCksCi0JKCg2NCA8PCA4KSB8IDUpLAotCSgoNjQgPDwgOCkgfCA2KSwKLQkoKDY0IDw8IDgpIHwgNyksCi0JKCg5MSA8PCA4KSB8IDcpLAotCSgoMTI4IDw8IDgpIHwgNykKLX07Ci0KLXN0YXRpYyBjb25zdAotc3RydWN0IGxjbnBoeV9zcGJfdG9uZSBsY25waHlfc3BiX3RvbmVfMzc1MFtdID0gewotCXs4OCwgMH0sCi0JezczLCA0OX0sCi0JezM0LCA4MX0sCi0Jey0xNywgODZ9LAotCXstNjIsIDYyfSwKLQl7LTg2LCAxN30sCi0Jey04MSwgLTM0fSwKLQl7LTQ5LCAtNzN9LAotCXswLCAtODh9LAotCXs0OSwgLTczfSwKLQl7ODEsIC0zNH0sCi0Jezg2LCAxN30sCi0JezYyLCA2Mn0sCi0JezE3LCA4Nn0sCi0Jey0zNCwgODF9LAotCXstNzMsIDQ5fSwKLQl7LTg4LCAwfSwKLQl7LTczLCAtNDl9LAotCXstMzQsIC04MX0sCi0JezE3LCAtODZ9LAotCXs2MiwgLTYyfSwKLQl7ODYsIC0xN30sCi0JezgxLCAzNH0sCi0JezQ5LCA3M30sCi0JezAsIDg4fSwKLQl7LTQ5LCA3M30sCi0Jey04MSwgMzR9LAotCXstODYsIC0xN30sCi0Jey02MiwgLTYyfSwKLQl7LTE3LCAtODZ9LAotCXszNCwgLTgxfSwKLQl7NzMsIC00OX0sCi19OwotCi1zdGF0aWMgY29uc3QKLXUxNiBpcWxvX2xvb3BiYWNrX3JmX3JlZ3NbMjBdID0gewotCVJBRElPXzIwNjRfUkVHMDM2LAotCVJBRElPXzIwNjRfUkVHMTFBLAotCVJBRElPXzIwNjRfUkVHMDNBLAotCVJBRElPXzIwNjRfUkVHMDI1LAotCVJBRElPXzIwNjRfUkVHMDI4LAotCVJBRElPXzIwNjRfUkVHMDA1LAotCVJBRElPXzIwNjRfUkVHMTEyLAotCVJBRElPXzIwNjRfUkVHMEZGLAotCVJBRElPXzIwNjRfUkVHMTFGLAotCVJBRElPXzIwNjRfUkVHMDBCLAotCVJBRElPXzIwNjRfUkVHMTEzLAotCVJBRElPXzIwNjRfUkVHMDA3LAotCVJBRElPXzIwNjRfUkVHMEZDLAotCVJBRElPXzIwNjRfUkVHMEZELAotCVJBRElPXzIwNjRfUkVHMDEyLAotCVJBRElPXzIwNjRfUkVHMDU3LAotCVJBRElPXzIwNjRfUkVHMDU5LAotCVJBRElPXzIwNjRfUkVHMDVDLAotCVJBRElPXzIwNjRfUkVHMDc4LAotCVJBRElPXzIwNjRfUkVHMDkyLAotfTsKLQotc3RhdGljIGNvbnN0Ci11MTYgdGVtcHNlbnNlX3BoeV9yZWdzWzE0XSA9IHsKLQkweDUwMywKLQkweDRhNCwKLQkweDRkMCwKLQkweDRkOSwKLQkweDRkYSwKLQkweDRhNiwKLQkweDkzOCwKLQkweDkzOSwKLQkweDRkOCwKLQkweDRkMCwKLQkweDRkNywKLQkweDRhNSwKLQkweDQwZCwKLQkweDRhMiwKLX07Ci0KLXN0YXRpYyBjb25zdAotdTE2IHJ4aXFfY2FsX3JmX3JlZ1sxMV0gPSB7Ci0JUkFESU9fMjA2NF9SRUcwOTgsCi0JUkFESU9fMjA2NF9SRUcxMTYsCi0JUkFESU9fMjA2NF9SRUcxMkMsCi0JUkFESU9fMjA2NF9SRUcwNkEsCi0JUkFESU9fMjA2NF9SRUcwMEIsCi0JUkFESU9fMjA2NF9SRUcwMUIsCi0JUkFESU9fMjA2NF9SRUcxMTMsCi0JUkFESU9fMjA2NF9SRUcwMUQsCi0JUkFESU9fMjA2NF9SRUcxMTQsCi0JUkFESU9fMjA2NF9SRUcwMkUsCi0JUkFESU9fMjA2NF9SRUcxMkEsCi19OwotCi1zdGF0aWMgY29uc3QKLXN0cnVjdCBsY25waHlfcnhfaXFjb21wIGxjbnBoeV9yeF9pcWNvbXBfdGFibGVfcmV2MFtdID0gewotCXsxLCAwLCAwfSwKLQl7MiwgMCwgMH0sCi0JezMsIDAsIDB9LAotCXs0LCAwLCAwfSwKLQl7NSwgMCwgMH0sCi0JezYsIDAsIDB9LAotCXs3LCAwLCAwfSwKLQl7OCwgMCwgMH0sCi0JezksIDAsIDB9LAotCXsxMCwgMCwgMH0sCi0JezExLCAwLCAwfSwKLQl7MTIsIDAsIDB9LAotCXsxMywgMCwgMH0sCi0JezE0LCAwLCAwfSwKLQl7MzQsIDAsIDB9LAotCXszOCwgMCwgMH0sCi0JezQyLCAwLCAwfSwKLQl7NDYsIDAsIDB9LAotCXszNiwgMCwgMH0sCi0JezQwLCAwLCAwfSwKLQl7NDQsIDAsIDB9LAotCXs0OCwgMCwgMH0sCi0JezUyLCAwLCAwfSwKLQl7NTYsIDAsIDB9LAotCXs2MCwgMCwgMH0sCi0JezY0LCAwLCAwfSwKLQl7MTAwLCAwLCAwfSwKLQl7MTA0LCAwLCAwfSwKLQl7MTA4LCAwLCAwfSwKLQl7MTEyLCAwLCAwfSwKLQl7MTE2LCAwLCAwfSwKLQl7MTIwLCAwLCAwfSwKLQl7MTI0LCAwLCAwfSwKLQl7MTI4LCAwLCAwfSwKLQl7MTMyLCAwLCAwfSwKLQl7MTM2LCAwLCAwfSwKLQl7MTQwLCAwLCAwfSwKLQl7MTQ5LCAwLCAwfSwKLQl7MTUzLCAwLCAwfSwKLQl7MTU3LCAwLCAwfSwKLQl7MTYxLCAwLCAwfSwKLQl7MTY1LCAwLCAwfSwKLQl7MTg0LCAwLCAwfSwKLQl7MTg4LCAwLCAwfSwKLQl7MTkyLCAwLCAwfSwKLQl7MTk2LCAwLCAwfSwKLQl7MjAwLCAwLCAwfSwKLQl7MjA0LCAwLCAwfSwKLQl7MjA4LCAwLCAwfSwKLQl7MjEyLCAwLCAwfSwKLQl7MjE2LCAwLCAwfSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1MzIgbGNucGh5XzIzYml0Z2FpbmNvZGVfdGFibGVbXSA9IHsKLQkweDIwMDEwMCwKLQkweDIwMDIwMCwKLQkweDIwMDAwNCwKLQkweDIwMDAxNCwKLQkweDIwMDAyNCwKLQkweDIwMDAzNCwKLQkweDIwMDEzNCwKLQkweDIwMDIzNCwKLQkweDIwMDMzNCwKLQkweDIwMDQzNCwKLQkweDIwMDAzNywKLQkweDIwMDEzNywKLQkweDIwMDIzNywKLQkweDIwMDMzNywKLQkweDIwMDQzNywKLQkweDAwMDAzNSwKLQkweDAwMDEzNSwKLQkweDAwMDIzNSwKLQkweDAwMDAzNywKLQkweDAwMDEzNywKLQkweDAwMDIzNywKLQkweDAwMDMzNywKLQkweDAwMDEzZiwKLQkweDAwMDIzZiwKLQkweDAwMDMzZiwKLQkweDAwMDM0ZiwKLQkweDAwMDQ0ZiwKLQkweDAwMTQ0ZiwKLQkweDAwMjQ0ZiwKLQkweDAwMjU0ZiwKLQkweDAwMzU0ZiwKLQkweDAwNDU0ZiwKLQkweDAwNDY0ZiwKLQkweDAxNDY0ZiwKLQkweDAyNDY0ZiwKLQkweDAzNDY0ZiwKLQkweDA0NDY0ZiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzOCBsY25waHlfZ2Fpbl90YWJsZVtdID0gewotCS0xNiwKLQktMTMsCi0JMTAsCi0JNywKLQk0LAotCTAsCi0JMywKLQk2LAotCTksCi0JMTIsCi0JMTUsCi0JMTgsCi0JMjEsCi0JMjQsCi0JMjcsCi0JMzAsCi0JMzMsCi0JMzYsCi0JMzksCi0JNDIsCi0JNDUsCi0JNDgsCi0JNTAsCi0JNTMsCi0JNTYsCi0JNTksCi0JNjIsCi0JNjUsCi0JNjgsCi0JNzEsCi0JNzQsCi0JNzcsCi0JODAsCi0JODMsCi0JODYsCi0JODksCi0JOTIsCi19OwotCi1zdGF0aWMgY29uc3QgczggbGNucGh5X2dhaW5faW5kZXhfb2Zmc2V0X2Zvcl9yc3NpW10gPSB7Ci0JNywKLQk3LAotCTcsCi0JNywKLQk3LAotCTcsCi0JNywKLQk4LAotCTcsCi0JNywKLQk2LAotCTcsCi0JNywKLQk0LAotCTQsCi0JNCwKLQk0LAotCTQsCi0JNCwKLQk0LAotCTQsCi0JMywKLQkzLAotCTMsCi0JMywKLQkzLAotCTMsCi0JNCwKLQkyLAotCTIsCi0JMiwKLQkyLAotCTIsCi0JMiwKLQktMSwKLQktMiwKLQktMiwKLQktMgotfTsKLQotc3RydWN0IGNoYW5faW5mb18yMDY0X2xjbnBoeSB7Ci0JdWludCBjaGFuOwotCXVpbnQgZnJlcTsKLQl1OCBsb2dlbl9idWZ0dW5lOwotCXU4IGxvZ2VuX3JjY3JfdHg7Ci0JdTggdHhyZl9taXhfdHVuZV9jdHJsOwotCXU4IHBhX2lucHV0X3R1bmVfZzsKLQl1OCBsb2dlbl9yY2NyX3J4OwotCXU4IHBhX3J4cmZfbG5hMV9mcmVxX3R1bmU7Ci0JdTggcGFfcnhyZl9sbmEyX2ZyZXFfdHVuZTsKLQl1OCByeHJmX3J4cmZfc3BhcmUxOwotfTsKLQotc3RhdGljIHN0cnVjdCBjaGFuX2luZm9fMjA2NF9sY25waHkgY2hhbl9pbmZvXzIwNjRfbGNucGh5W10gPSB7Ci0JezEsIDI0MTIsIDB4MEIsIDB4MEEsIDB4MDAsIDB4MDcsIDB4MEEsIDB4ODgsIDB4ODgsIDB4ODB9LAotCXsyLCAyNDE3LCAweDBCLCAweDBBLCAweDAwLCAweDA3LCAweDBBLCAweDg4LCAweDg4LCAweDgwfSwKLQl7MywgMjQyMiwgMHgwQiwgMHgwQSwgMHgwMCwgMHgwNywgMHgwQSwgMHg4OCwgMHg4OCwgMHg4MH0sCi0JezQsIDI0MjcsIDB4MEIsIDB4MEEsIDB4MDAsIDB4MDcsIDB4MEEsIDB4ODgsIDB4ODgsIDB4ODB9LAotCXs1LCAyNDMyLCAweDBCLCAweDBBLCAweDAwLCAweDA3LCAweDBBLCAweDg4LCAweDg4LCAweDgwfSwKLQl7NiwgMjQzNywgMHgwQiwgMHgwQSwgMHgwMCwgMHgwNywgMHgwQSwgMHg4OCwgMHg4OCwgMHg4MH0sCi0JezcsIDI0NDIsIDB4MEIsIDB4MEEsIDB4MDAsIDB4MDcsIDB4MEEsIDB4ODgsIDB4ODgsIDB4ODB9LAotCXs4LCAyNDQ3LCAweDBCLCAweDBBLCAweDAwLCAweDA3LCAweDBBLCAweDg4LCAweDg4LCAweDgwfSwKLQl7OSwgMjQ1MiwgMHgwQiwgMHgwQSwgMHgwMCwgMHgwNywgMHgwQSwgMHg4OCwgMHg4OCwgMHg4MH0sCi0JezEwLCAyNDU3LCAweDBCLCAweDBBLCAweDAwLCAweDA3LCAweDBBLCAweDg4LCAweDg4LCAweDgwfSwKLQl7MTEsIDI0NjIsIDB4MEIsIDB4MEEsIDB4MDAsIDB4MDcsIDB4MEEsIDB4ODgsIDB4ODgsIDB4ODB9LAotCXsxMiwgMjQ2NywgMHgwQiwgMHgwQSwgMHgwMCwgMHgwNywgMHgwQSwgMHg4OCwgMHg4OCwgMHg4MH0sCi0JezEzLCAyNDcyLCAweDBCLCAweDBBLCAweDAwLCAweDA3LCAweDBBLCAweDg4LCAweDg4LCAweDgwfSwKLQl7MTQsIDI0ODQsIDB4MEIsIDB4MEEsIDB4MDAsIDB4MDcsIDB4MEEsIDB4ODgsIDB4ODgsIDB4ODB9LAotfTsKLQotc3RydWN0IGxjbnBoeV9yYWRpb19yZWdzIGxjbnBoeV9yYWRpb19yZWdzXzIwNjRbXSA9IHsKLQl7MHgwMCwgMCwgMCwgMCwgMH0sCi0JezB4MDEsIDB4NjQsIDB4NjQsIDAsIDB9LAotCXsweDAyLCAweDIwLCAweDIwLCAwLCAwfSwKLQl7MHgwMywgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4MDQsIDB4ZjgsIDB4ZjgsIDAsIDB9LAotCXsweDA1LCAwLCAwLCAwLCAwfSwKLQl7MHgwNiwgMHgxMCwgMHgxMCwgMCwgMH0sCi0JezB4MDcsIDAsIDAsIDAsIDB9LAotCXsweDA4LCAwLCAwLCAwLCAwfSwKLQl7MHgwOSwgMCwgMCwgMCwgMH0sCi0JezB4MEEsIDB4MzcsIDB4MzcsIDAsIDB9LAotCXsweDBCLCAweDYsIDB4NiwgMCwgMH0sCi0JezB4MEMsIDB4NTUsIDB4NTUsIDAsIDB9LAotCXsweDBELCAweDhiLCAweDhiLCAwLCAwfSwKLQl7MHgwRSwgMCwgMCwgMCwgMH0sCi0JezB4MEYsIDB4NSwgMHg1LCAwLCAwfSwKLQl7MHgxMCwgMCwgMCwgMCwgMH0sCi0JezB4MTEsIDB4ZSwgMHhlLCAwLCAwfSwKLQl7MHgxMiwgMCwgMCwgMCwgMH0sCi0JezB4MTMsIDB4YiwgMHhiLCAwLCAwfSwKLQl7MHgxNCwgMHgyLCAweDIsIDAsIDB9LAotCXsweDE1LCAweDEyLCAweDEyLCAwLCAwfSwKLQl7MHgxNiwgMHgxMiwgMHgxMiwgMCwgMH0sCi0JezB4MTcsIDB4YywgMHhjLCAwLCAwfSwKLQl7MHgxOCwgMHhjLCAweGMsIDAsIDB9LAotCXsweDE5LCAweGMsIDB4YywgMCwgMH0sCi0JezB4MUEsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHgxQiwgMHgyLCAweDIsIDAsIDB9LAotCXsweDFDLCAwLCAwLCAwLCAwfSwKLQl7MHgxRCwgMHgxLCAweDEsIDAsIDB9LAotCXsweDFFLCAweDEyLCAweDEyLCAwLCAwfSwKLQl7MHgxRiwgMHg2ZSwgMHg2ZSwgMCwgMH0sCi0JezB4MjAsIDB4MiwgMHgyLCAwLCAwfSwKLQl7MHgyMSwgMHgyMywgMHgyMywgMCwgMH0sCi0JezB4MjIsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHgyMywgMCwgMCwgMCwgMH0sCi0JezB4MjQsIDAsIDAsIDAsIDB9LAotCXsweDI1LCAweGMsIDB4YywgMCwgMH0sCi0JezB4MjYsIDB4MzMsIDB4MzMsIDAsIDB9LAotCXsweDI3LCAweDU1LCAweDU1LCAwLCAwfSwKLQl7MHgyOCwgMCwgMCwgMCwgMH0sCi0JezB4MjksIDB4MzAsIDB4MzAsIDAsIDB9LAotCXsweDJBLCAweGIsIDB4YiwgMCwgMH0sCi0JezB4MkIsIDB4MWIsIDB4MWIsIDAsIDB9LAotCXsweDJDLCAweDMsIDB4MywgMCwgMH0sCi0JezB4MkQsIDB4MWIsIDB4MWIsIDAsIDB9LAotCXsweDJFLCAwLCAwLCAwLCAwfSwKLQl7MHgyRiwgMHgyMCwgMHgyMCwgMCwgMH0sCi0JezB4MzAsIDB4YSwgMHhhLCAwLCAwfSwKLQl7MHgzMSwgMCwgMCwgMCwgMH0sCi0JezB4MzIsIDB4NjIsIDB4NjIsIDAsIDB9LAotCXsweDMzLCAweDE5LCAweDE5LCAwLCAwfSwKLQl7MHgzNCwgMHgzMywgMHgzMywgMCwgMH0sCi0JezB4MzUsIDB4NzcsIDB4NzcsIDAsIDB9LAotCXsweDM2LCAwLCAwLCAwLCAwfSwKLQl7MHgzNywgMHg3MCwgMHg3MCwgMCwgMH0sCi0JezB4MzgsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHgzOSwgMHhmLCAweGYsIDAsIDB9LAotCXsweDNBLCAweDYsIDB4NiwgMCwgMH0sCi0JezB4M0IsIDB4Y2YsIDB4Y2YsIDAsIDB9LAotCXsweDNDLCAweDFhLCAweDFhLCAwLCAwfSwKLQl7MHgzRCwgMHg2LCAweDYsIDAsIDB9LAotCXsweDNFLCAweDQyLCAweDQyLCAwLCAwfSwKLQl7MHgzRiwgMCwgMCwgMCwgMH0sCi0JezB4NDAsIDB4ZmIsIDB4ZmIsIDAsIDB9LAotCXsweDQxLCAweDlhLCAweDlhLCAwLCAwfSwKLQl7MHg0MiwgMHg3YSwgMHg3YSwgMCwgMH0sCi0JezB4NDMsIDB4MjksIDB4MjksIDAsIDB9LAotCXsweDQ0LCAwLCAwLCAwLCAwfSwKLQl7MHg0NSwgMHg4LCAweDgsIDAsIDB9LAotCXsweDQ2LCAweGNlLCAweGNlLCAwLCAwfSwKLQl7MHg0NywgMHgyNywgMHgyNywgMCwgMH0sCi0JezB4NDgsIDB4NjIsIDB4NjIsIDAsIDB9LAotCXsweDQ5LCAweDYsIDB4NiwgMCwgMH0sCi0JezB4NEEsIDB4NTgsIDB4NTgsIDAsIDB9LAotCXsweDRCLCAweGY3LCAweGY3LCAwLCAwfSwKLQl7MHg0QywgMCwgMCwgMCwgMH0sCi0JezB4NEQsIDB4YjMsIDB4YjMsIDAsIDB9LAotCXsweDRFLCAwLCAwLCAwLCAwfSwKLQl7MHg0RiwgMHgyLCAweDIsIDAsIDB9LAotCXsweDUwLCAwLCAwLCAwLCAwfSwKLQl7MHg1MSwgMHg5LCAweDksIDAsIDB9LAotCXsweDUyLCAweDUsIDB4NSwgMCwgMH0sCi0JezB4NTMsIDB4MTcsIDB4MTcsIDAsIDB9LAotCXsweDU0LCAweDM4LCAweDM4LCAwLCAwfSwKLQl7MHg1NSwgMCwgMCwgMCwgMH0sCi0JezB4NTYsIDAsIDAsIDAsIDB9LAotCXsweDU3LCAweGIsIDB4YiwgMCwgMH0sCi0JezB4NTgsIDAsIDAsIDAsIDB9LAotCXsweDU5LCAwLCAwLCAwLCAwfSwKLQl7MHg1QSwgMCwgMCwgMCwgMH0sCi0JezB4NUIsIDAsIDAsIDAsIDB9LAotCXsweDVDLCAwLCAwLCAwLCAwfSwKLQl7MHg1RCwgMCwgMCwgMCwgMH0sCi0JezB4NUUsIDB4ODgsIDB4ODgsIDAsIDB9LAotCXsweDVGLCAweGNjLCAweGNjLCAwLCAwfSwKLQl7MHg2MCwgMHg3NCwgMHg3NCwgMCwgMH0sCi0JezB4NjEsIDB4NzQsIDB4NzQsIDAsIDB9LAotCXsweDYyLCAweDc0LCAweDc0LCAwLCAwfSwKLQl7MHg2MywgMHg0NCwgMHg0NCwgMCwgMH0sCi0JezB4NjQsIDB4NzcsIDB4NzcsIDAsIDB9LAotCXsweDY1LCAweDQ0LCAweDQ0LCAwLCAwfSwKLQl7MHg2NiwgMHg3NywgMHg3NywgMCwgMH0sCi0JezB4NjcsIDB4NTUsIDB4NTUsIDAsIDB9LAotCXsweDY4LCAweDc3LCAweDc3LCAwLCAwfSwKLQl7MHg2OSwgMHg3NywgMHg3NywgMCwgMH0sCi0JezB4NkEsIDAsIDAsIDAsIDB9LAotCXsweDZCLCAweDdmLCAweDdmLCAwLCAwfSwKLQl7MHg2QywgMHg4LCAweDgsIDAsIDB9LAotCXsweDZELCAwLCAwLCAwLCAwfSwKLQl7MHg2RSwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4NkYsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweDcwLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHg3MSwgMHgyOCwgMHgyOCwgMCwgMH0sCi0JezB4NzIsIDB4NTUsIDB4NTUsIDAsIDB9LAotCXsweDczLCAweDQsIDB4NCwgMCwgMH0sCi0JezB4NzQsIDAsIDAsIDAsIDB9LAotCXsweDc1LCAwLCAwLCAwLCAwfSwKLQl7MHg3NiwgMCwgMCwgMCwgMH0sCi0JezB4NzcsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHg3OCwgMHhkNiwgMHhkNiwgMCwgMH0sCi0JezB4NzksIDAsIDAsIDAsIDB9LAotCXsweDdBLCAwLCAwLCAwLCAwfSwKLQl7MHg3QiwgMCwgMCwgMCwgMH0sCi0JezB4N0MsIDAsIDAsIDAsIDB9LAotCXsweDdELCAwLCAwLCAwLCAwfSwKLQl7MHg3RSwgMCwgMCwgMCwgMH0sCi0JezB4N0YsIDAsIDAsIDAsIDB9LAotCXsweDgwLCAwLCAwLCAwLCAwfSwKLQl7MHg4MSwgMCwgMCwgMCwgMH0sCi0JezB4ODIsIDAsIDAsIDAsIDB9LAotCXsweDgzLCAweGI0LCAweGI0LCAwLCAwfSwKLQl7MHg4NCwgMHgxLCAweDEsIDAsIDB9LAotCXsweDg1LCAweDIwLCAweDIwLCAwLCAwfSwKLQl7MHg4NiwgMHg1LCAweDUsIDAsIDB9LAotCXsweDg3LCAweGZmLCAweGZmLCAwLCAwfSwKLQl7MHg4OCwgMHg3LCAweDcsIDAsIDB9LAotCXsweDg5LCAweDc3LCAweDc3LCAwLCAwfSwKLQl7MHg4QSwgMHg3NywgMHg3NywgMCwgMH0sCi0JezB4OEIsIDB4NzcsIDB4NzcsIDAsIDB9LAotCXsweDhDLCAweDc3LCAweDc3LCAwLCAwfSwKLQl7MHg4RCwgMHg4LCAweDgsIDAsIDB9LAotCXsweDhFLCAweGEsIDB4YSwgMCwgMH0sCi0JezB4OEYsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHg5MCwgMHgxOCwgMHgxOCwgMCwgMH0sCi0JezB4OTEsIDB4NSwgMHg1LCAwLCAwfSwKLQl7MHg5MiwgMHgxZiwgMHgxZiwgMCwgMH0sCi0JezB4OTMsIDB4MTAsIDB4MTAsIDAsIDB9LAotCXsweDk0LCAweDMsIDB4MywgMCwgMH0sCi0JezB4OTUsIDAsIDAsIDAsIDB9LAotCXsweDk2LCAwLCAwLCAwLCAwfSwKLQl7MHg5NywgMHhhYSwgMHhhYSwgMCwgMH0sCi0JezB4OTgsIDAsIDAsIDAsIDB9LAotCXsweDk5LCAweDIzLCAweDIzLCAwLCAwfSwKLQl7MHg5QSwgMHg3LCAweDcsIDAsIDB9LAotCXsweDlCLCAweGYsIDB4ZiwgMCwgMH0sCi0JezB4OUMsIDB4MTAsIDB4MTAsIDAsIDB9LAotCXsweDlELCAweDMsIDB4MywgMCwgMH0sCi0JezB4OUUsIDB4NCwgMHg0LCAwLCAwfSwKLQl7MHg5RiwgMHgyMCwgMHgyMCwgMCwgMH0sCi0JezB4QTAsIDAsIDAsIDAsIDB9LAotCXsweEExLCAwLCAwLCAwLCAwfSwKLQl7MHhBMiwgMCwgMCwgMCwgMH0sCi0JezB4QTMsIDAsIDAsIDAsIDB9LAotCXsweEE0LCAweDEsIDB4MSwgMCwgMH0sCi0JezB4QTUsIDB4NzcsIDB4NzcsIDAsIDB9LAotCXsweEE2LCAweDc3LCAweDc3LCAwLCAwfSwKLQl7MHhBNywgMHg3NywgMHg3NywgMCwgMH0sCi0JezB4QTgsIDB4NzcsIDB4NzcsIDAsIDB9LAotCXsweEE5LCAweDhjLCAweDhjLCAwLCAwfSwKLQl7MHhBQSwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4QUIsIDB4NzgsIDB4NzgsIDAsIDB9LAotCXsweEFDLCAweDU3LCAweDU3LCAwLCAwfSwKLQl7MHhBRCwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4QUUsIDAsIDAsIDAsIDB9LAotCXsweEFGLCAweDgsIDB4OCwgMCwgMH0sCi0JezB4QjAsIDB4ODgsIDB4ODgsIDAsIDB9LAotCXsweEIxLCAwLCAwLCAwLCAwfSwKLQl7MHhCMiwgMHgxYiwgMHgxYiwgMCwgMH0sCi0JezB4QjMsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHhCNCwgMHgyNCwgMHgyNCwgMCwgMH0sCi0JezB4QjUsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHhCNiwgMHgxYiwgMHgxYiwgMCwgMH0sCi0JezB4QjcsIDB4MjQsIDB4MjQsIDAsIDB9LAotCXsweEI4LCAweDMsIDB4MywgMCwgMH0sCi0JezB4QjksIDAsIDAsIDAsIDB9LAotCXsweEJBLCAweGFhLCAweGFhLCAwLCAwfSwKLQl7MHhCQiwgMCwgMCwgMCwgMH0sCi0JezB4QkMsIDB4NCwgMHg0LCAwLCAwfSwKLQl7MHhCRCwgMCwgMCwgMCwgMH0sCi0JezB4QkUsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHhCRiwgMHgxMSwgMHgxMSwgMCwgMH0sCi0JezB4QzAsIDAsIDAsIDAsIDB9LAotCXsweEMxLCAwLCAwLCAwLCAwfSwKLQl7MHhDMiwgMHg2MiwgMHg2MiwgMCwgMH0sCi0JezB4QzMsIDB4MWUsIDB4MWUsIDAsIDB9LAotCXsweEM0LCAweDMzLCAweDMzLCAwLCAwfSwKLQl7MHhDNSwgMHgzNywgMHgzNywgMCwgMH0sCi0JezB4QzYsIDAsIDAsIDAsIDB9LAotCXsweEM3LCAweDcwLCAweDcwLCAwLCAwfSwKLQl7MHhDOCwgMHgxZSwgMHgxZSwgMCwgMH0sCi0JezB4QzksIDB4NiwgMHg2LCAwLCAwfSwKLQl7MHhDQSwgMHg0LCAweDQsIDAsIDB9LAotCXsweENCLCAweDJmLCAweDJmLCAwLCAwfSwKLQl7MHhDQywgMHhmLCAweGYsIDAsIDB9LAotCXsweENELCAwLCAwLCAwLCAwfSwKLQl7MHhDRSwgMHhmZiwgMHhmZiwgMCwgMH0sCi0JezB4Q0YsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHhEMCwgMHgzZiwgMHgzZiwgMCwgMH0sCi0JezB4RDEsIDB4M2YsIDB4M2YsIDAsIDB9LAotCXsweEQyLCAweDNmLCAweDNmLCAwLCAwfSwKLQl7MHhEMywgMCwgMCwgMCwgMH0sCi0JezB4RDQsIDAsIDAsIDAsIDB9LAotCXsweEQ1LCAwLCAwLCAwLCAwfSwKLQl7MHhENiwgMHhjYywgMHhjYywgMCwgMH0sCi0JezB4RDcsIDAsIDAsIDAsIDB9LAotCXsweEQ4LCAweDgsIDB4OCwgMCwgMH0sCi0JezB4RDksIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHhEQSwgMHg4LCAweDgsIDAsIDB9LAotCXsweERCLCAweDExLCAweDExLCAwLCAwfSwKLQl7MHhEQywgMCwgMCwgMCwgMH0sCi0JezB4REQsIDB4ODcsIDB4ODcsIDAsIDB9LAotCXsweERFLCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHhERiwgMHg4LCAweDgsIDAsIDB9LAotCXsweEUwLCAweDgsIDB4OCwgMCwgMH0sCi0JezB4RTEsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHhFMiwgMCwgMCwgMCwgMH0sCi0JezB4RTMsIDAsIDAsIDAsIDB9LAotCXsweEU0LCAwLCAwLCAwLCAwfSwKLQl7MHhFNSwgMHhmNSwgMHhmNSwgMCwgMH0sCi0JezB4RTYsIDB4MzAsIDB4MzAsIDAsIDB9LAotCXsweEU3LCAweDEsIDB4MSwgMCwgMH0sCi0JezB4RTgsIDAsIDAsIDAsIDB9LAotCXsweEU5LCAweGZmLCAweGZmLCAwLCAwfSwKLQl7MHhFQSwgMCwgMCwgMCwgMH0sCi0JezB4RUIsIDAsIDAsIDAsIDB9LAotCXsweEVDLCAweDIyLCAweDIyLCAwLCAwfSwKLQl7MHhFRCwgMCwgMCwgMCwgMH0sCi0JezB4RUUsIDAsIDAsIDAsIDB9LAotCXsweEVGLCAwLCAwLCAwLCAwfSwKLQl7MHhGMCwgMHgzLCAweDMsIDAsIDB9LAotCXsweEYxLCAweDEsIDB4MSwgMCwgMH0sCi0JezB4RjIsIDAsIDAsIDAsIDB9LAotCXsweEYzLCAwLCAwLCAwLCAwfSwKLQl7MHhGNCwgMCwgMCwgMCwgMH0sCi0JezB4RjUsIDAsIDAsIDAsIDB9LAotCXsweEY2LCAwLCAwLCAwLCAwfSwKLQl7MHhGNywgMHg2LCAweDYsIDAsIDB9LAotCXsweEY4LCAwLCAwLCAwLCAwfSwKLQl7MHhGOSwgMCwgMCwgMCwgMH0sCi0JezB4RkEsIDB4NDAsIDB4NDAsIDAsIDB9LAotCXsweEZCLCAwLCAwLCAwLCAwfSwKLQl7MHhGQywgMHgxLCAweDEsIDAsIDB9LAotCXsweEZELCAweDgwLCAweDgwLCAwLCAwfSwKLQl7MHhGRSwgMHgyLCAweDIsIDAsIDB9LAotCXsweEZGLCAweDEwLCAweDEwLCAwLCAwfSwKLQl7MHgxMDAsIDB4MiwgMHgyLCAwLCAwfSwKLQl7MHgxMDEsIDB4MWUsIDB4MWUsIDAsIDB9LAotCXsweDEwMiwgMHgxZSwgMHgxZSwgMCwgMH0sCi0JezB4MTAzLCAwLCAwLCAwLCAwfSwKLQl7MHgxMDQsIDB4MWYsIDB4MWYsIDAsIDB9LAotCXsweDEwNSwgMCwgMHg4LCAwLCAxfSwKLQl7MHgxMDYsIDB4MmEsIDB4MmEsIDAsIDB9LAotCXsweDEwNywgMHhmLCAweGYsIDAsIDB9LAotCXsweDEwOCwgMCwgMCwgMCwgMH0sCi0JezB4MTA5LCAwLCAwLCAwLCAwfSwKLQl7MHgxMEEsIDAsIDAsIDAsIDB9LAotCXsweDEwQiwgMCwgMCwgMCwgMH0sCi0JezB4MTBDLCAwLCAwLCAwLCAwfSwKLQl7MHgxMEQsIDAsIDAsIDAsIDB9LAotCXsweDEwRSwgMCwgMCwgMCwgMH0sCi0JezB4MTBGLCAwLCAwLCAwLCAwfSwKLQl7MHgxMTAsIDAsIDAsIDAsIDB9LAotCXsweDExMSwgMCwgMCwgMCwgMH0sCi0JezB4MTEyLCAwLCAwLCAwLCAwfSwKLQl7MHgxMTMsIDAsIDAsIDAsIDB9LAotCXsweDExNCwgMCwgMCwgMCwgMH0sCi0JezB4MTE1LCAwLCAwLCAwLCAwfSwKLQl7MHgxMTYsIDAsIDAsIDAsIDB9LAotCXsweDExNywgMCwgMCwgMCwgMH0sCi0JezB4MTE4LCAwLCAwLCAwLCAwfSwKLQl7MHgxMTksIDAsIDAsIDAsIDB9LAotCXsweDExQSwgMCwgMCwgMCwgMH0sCi0JezB4MTFCLCAwLCAwLCAwLCAwfSwKLQl7MHgxMUMsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHgxMUQsIDAsIDAsIDAsIDB9LAotCXsweDExRSwgMCwgMCwgMCwgMH0sCi0JezB4MTFGLCAwLCAwLCAwLCAwfSwKLQl7MHgxMjAsIDAsIDAsIDAsIDB9LAotCXsweDEyMSwgMCwgMCwgMCwgMH0sCi0JezB4MTIyLCAweDgwLCAweDgwLCAwLCAwfSwKLQl7MHgxMjMsIDAsIDAsIDAsIDB9LAotCXsweDEyNCwgMHhmOCwgMHhmOCwgMCwgMH0sCi0JezB4MTI1LCAwLCAwLCAwLCAwfSwKLQl7MHgxMjYsIDAsIDAsIDAsIDB9LAotCXsweDEyNywgMCwgMCwgMCwgMH0sCi0JezB4MTI4LCAwLCAwLCAwLCAwfSwKLQl7MHgxMjksIDAsIDAsIDAsIDB9LAotCXsweDEyQSwgMCwgMCwgMCwgMH0sCi0JezB4MTJCLCAwLCAwLCAwLCAwfSwKLQl7MHgxMkMsIDAsIDAsIDAsIDB9LAotCXsweDEyRCwgMCwgMCwgMCwgMH0sCi0JezB4MTJFLCAwLCAwLCAwLCAwfSwKLQl7MHgxMkYsIDAsIDAsIDAsIDB9LAotCXsweDEzMCwgMCwgMCwgMCwgMH0sCi0JezB4RkZGRiwgMCwgMCwgMCwgMH0KLX07Ci0KLSNkZWZpbmUgTENOUEhZX05VTV9ESUdfRklMVF9DT0VGRlMgMTYKLSNkZWZpbmUgTENOUEhZX05VTV9UWF9ESUdfRklMVEVSU19DQ0sgMTMKLQotdTE2IExDTlBIWV90eGRpZ2ZpbHRjb2VmZnNfY2NrW0xDTlBIWV9OVU1fVFhfRElHX0ZJTFRFUlNfQ0NLXQotCVtMQ05QSFlfTlVNX0RJR19GSUxUX0NPRUZGUyArIDFdID0gewotCXswLCAxLCA0MTUsIDE4NzQsIDY0LCAxMjgsIDY0LCA3OTIsIDE2NTYsIDY0LCAxMjgsIDY0LCA3NzgsIDE1ODIsIDY0LAotCSAxMjgsIDY0LH0sCi0JezEsIDEsIDQwMiwgMTg0NywgMjU5LCA1OSwgMjU5LCA2NzEsIDE3OTQsIDY4LCA1NCwgNjgsIDYwOCwgMTg2MywgOTMsCi0JIDE2NywgOTMsfSwKLQl7MiwgMSwgNDE1LCAxODc0LCA2NCwgMTI4LCA2NCwgNzkyLCAxNjU2LCAxOTIsIDM4NCwgMTkyLCA3NzgsIDE1ODIsIDY0LAotCSAxMjgsIDY0LH0sCi0JezMsIDEsIDMwMiwgMTg0MSwgMTI5LCAyNTgsIDEyOSwgNjU4LCAxNzIwLCAyMDUsIDQxMCwgMjA1LCA3NTQsIDE3NjAsCi0JIDE3MCwgMzQwLCAxNzAsfSwKLQl7MjAsIDEsIDM2MCwgMTg4NCwgMjQyLCAxNzM0LCAyNDIsIDc1MiwgMTcyMCwgMjA1LCAxODQ1LCAyMDUsIDc2NywgMTc2MCwKLQkgMjU2LCAxODUsIDI1Nix9LAotCXsyMSwgMSwgMzYwLCAxODg0LCAxNDksIDE4NzQsIDE0OSwgNzUyLCAxNzIwLCAyMDUsIDE4ODMsIDIwNSwgNzY3LCAxNzYwLAotCSAyNTYsIDI3MywgMjU2LH0sCi0JezIyLCAxLCAzNjAsIDE4ODQsIDk4LCAxOTQ4LCA5OCwgNzUyLCAxNzIwLCAyMDUsIDE5MjQsIDIwNSwgNzY3LCAxNzYwLAotCSAyNTYsIDM1MiwgMjU2LH0sCi0JezIzLCAxLCAzNTAsIDE4ODQsIDExNiwgMTk2NiwgMTE2LCA3NTIsIDE3MjAsIDIwNSwgMjAwOCwgMjA1LCA3NjcsIDE3NjAsCi0JIDEyOCwgMjMzLCAxMjgsfSwKLQl7MjQsIDEsIDMyNSwgMTg4NCwgMzIsIDQwLCAzMiwgNzU2LCAxNzIwLCAyNTYsIDQ3MSwgMjU2LCA3NjYsIDE3NjAsIDI1NiwKLQkgMTg4MSwgMjU2LH0sCi0JezI1LCAxLCAyOTksIDE4ODQsIDUxLCA2NCwgNTEsIDczNiwgMTcyMCwgMjU2LCA0NzEsIDI1NiwgNzY1LCAxNzYwLCAyNTYsCi0JIDE4ODEsIDI1Nix9LAotCXsyNiwgMSwgMjc3LCAxOTQzLCAzOSwgMTE3LCA4OCwgNjM3LCAxODM4LCA2NCwgMTkyLCAxNDQsIDYxNCwgMTg2NCwgMTI4LAotCSAzODQsIDI4OCx9LAotCXsyNywgMSwgMjQ1LCAxOTQzLCA0OSwgMTQ3LCAxMTAsIDYyNiwgMTgzOCwgMjU2LCA3NjgsIDU3NiwgNjEzLCAxODY0LAotCSAxMjgsIDM4NCwgMjg4LH0sCi0JezMwLCAxLCAzMDIsIDE4NDEsIDYxLCAxMjIsIDYxLCA2NTgsIDE3MjAsIDIwNSwgNDEwLCAyMDUsIDc1NCwgMTc2MCwKLQkgMTcwLCAzNDAsIDE3MCx9LAotfTsKLQotI2RlZmluZSBMQ05QSFlfTlVNX1RYX0RJR19GSUxURVJTX09GRE0gMwotdTE2IExDTlBIWV90eGRpZ2ZpbHRjb2VmZnNfb2ZkbVtMQ05QSFlfTlVNX1RYX0RJR19GSUxURVJTX09GRE1dCi0JW0xDTlBIWV9OVU1fRElHX0ZJTFRfQ09FRkZTICsgMV0gPSB7Ci0JezAsIDAsIDB4YTIsIDB4MCwgMHgxMDAsIDB4MTAwLCAweDAsIDB4MCwgMHgwLCAweDEwMCwgMHgwLCAweDAsCi0JIDB4Mjc4LCAweGZlYTAsIDB4ODAsIDB4MTAwLCAweDgwLH0sCi0JezEsIDAsIDM3NCwgMHhGRjc5LCAxNiwgMzIsIDE2LCA3OTksIDB4RkU3NCwgNTAsIDMyLCA1MCwKLQkgNzUwLCAweEZFMkIsIDIxMiwgMHhGRkNFLCAyMTIsfSwKLQl7MiwgMCwgMzc1LCAweEZGMTYsIDM3LCA3NiwgMzcsIDc5OSwgMHhGRTc0LCAzMiwgMjAsIDMyLCA3NDgsCi0JIDB4RkVGMiwgMTI4LCAweEZGRTIsIDEyOH0KLX07Ci0KLSNkZWZpbmUgd2xjX2xjbnBoeV9zZXRfc3RhcnRfdHhfcHdyX2lkeChwaSwgaWR4KSBcCi0JbW9kX3BoeV9yZWcocGksIDB4NGE0LCBcCi0JCSgweDFmZiA8PCAwKSwgXAotCQkodTE2KShpZHgpIDw8IDApCi0KLSNkZWZpbmUgd2xjX2xjbnBoeV9zZXRfdHhfcHdyX25wdChwaSwgbnB0KSBcCi0JbW9kX3BoeV9yZWcocGksIDB4NGE1LCBcCi0JCSgweDcgPDwgOCksIFwKLQkJKHUxNikobnB0KSA8PCA4KQotCi0jZGVmaW5lIHdsY19sY25waHlfZ2V0X3R4X3B3cl9jdHJsKHBpKSBcCi0JKHJlYWRfcGh5X3JlZygocGkpLCAweDRhNCkgJiBcCi0JCQkoKDB4MSA8PCAxNSkgfCBcCi0JCQkoMHgxIDw8IDE0KSB8IFwKLQkJCSgweDEgPDwgMTMpKSkKLQotI2RlZmluZSB3bGNfbGNucGh5X2dldF90eF9wd3JfbnB0KHBpKSBcCi0JKChyZWFkX3BoeV9yZWcocGksIDB4NGE1KSAmIFwKLQkJKDB4NyA8PCA4KSkgPj4gXAotCQk4KQotCi0jZGVmaW5lIHdsY19sY25waHlfZ2V0X2N1cnJlbnRfdHhfcHdyX2lkeF9pZl9wd3JjdHJsX29uKHBpKSBcCi0JKHJlYWRfcGh5X3JlZyhwaSwgMHg0NzMpICYgMHgxZmYpCi0KLSNkZWZpbmUgd2xjX2xjbnBoeV9nZXRfdGFyZ2V0X3R4X3B3cihwaSkgXAotCSgocmVhZF9waHlfcmVnKHBpLCAweDRhNykgJiBcCi0JCSgweGZmIDw8IDApKSA+PiBcCi0JCTApCi0KLSNkZWZpbmUgd2xjX2xjbnBoeV9zZXRfdGFyZ2V0X3R4X3B3cihwaSwgdGFyZ2V0KSBcCi0JbW9kX3BoeV9yZWcocGksIDB4NGE3LCBcCi0JCSgweGZmIDw8IDApLCBcCi0JCSh1MTYpKHRhcmdldCkgPDwgMCkKLQotI2RlZmluZSB3bGNfcmFkaW9fMjA2NF9yY2FsX2RvbmUocGkpICgwICE9IChyZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwNUMpICYgMHgyMCkpCi0jZGVmaW5lIHRlbXBzZW5zZV9kb25lKHBpKSAoMHg4MDAwID09IChyZWFkX3BoeV9yZWcocGksIDB4NDc2KSAmIDB4ODAwMCkpCi0KLSNkZWZpbmUgTENOUEhZX0lRTE9DQ19SRUFEKHZhbCkgKCh1OCkoLShzOCkoKCh2YWwpICYgMHhmMCkgPj4gNCkgKyAoczgpKCh2YWwpICYgMHgwZikpKQotI2RlZmluZSBGSVhFRF9UWFBXUiA3OAotI2RlZmluZSBMQ05QSFlfVEVNUFNFTlNFKHZhbCkgKChzMTYpKCh2YWwgPiAyNTUpID8gKHZhbCAtIDUxMikgOiB2YWwpKQotCi1zdGF0aWMgdTMyIHdsY19sY25waHlfcWRpdl9yb3VuZHVwKHUzMiBkaXZpZGVudCwgdTMyIGRpdmlzb3IsCi0JCQkJICAgICAgdTggcHJlY2lzaW9uKTsKLXN0YXRpYyB2b2lkIHdsY19sY25waHlfc2V0X3J4X2dhaW5fYnlfZGlzdHJpYnV0aW9uKHN0cnVjdCBicmNtc19waHkgKnBpLAotCQkJCQkJICAgdTE2IGV4dF9sbmEsIHUxNiB0cnN3LAotCQkJCQkJICAgdTE2IGJpcTIsIHUxNiBiaXExLAotCQkJCQkJICAgdTE2IHRpYSwgdTE2IGxuYTIsCi0JCQkJCQkgICB1MTYgbG5hMSk7Ci1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X2NsZWFyX3R4X3Bvd2VyX29mZnNldHMoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV9zZXRfcGFfZ2FpbihzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTE2IGdhaW4pOwotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV9zZXRfdHJzd19vdmVycmlkZShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgYm9vbCB0eCwKLQkJCQkJIGJvb2wgcngpOwotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV9zZXRfYmJtdWx0KHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCBtMCk7Ci1zdGF0aWMgdTggd2xjX2xjbnBoeV9nZXRfYmJtdWx0KHN0cnVjdCBicmNtc19waHkgKnBpKTsKLXN0YXRpYyB2b2lkIHdsY19sY25waHlfZ2V0X3R4X2dhaW4oc3RydWN0IGJyY21zX3BoeSAqcGksCi0JCQkJICAgc3RydWN0IGxjbnBoeV90eGdhaW5zICpnYWlucyk7Ci1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X3NldF90eF9nYWluX292ZXJyaWRlKHN0cnVjdCBicmNtc19waHkgKnBpLCBib29sIGJFbmFibGUpOwotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV90b2dnbGVfYWZlX3B3ZG4oc3RydWN0IGJyY21zX3BoeSAqcGkpOwotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV9yeF9nYWluX292ZXJyaWRlX2VuYWJsZShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwKLQkJCQkJICAgICAgIGJvb2wgZW5hYmxlKTsKLXN0YXRpYyB2b2lkIHdsY19sY25waHlfc2V0X3R4X2dhaW4oc3RydWN0IGJyY21zX3BoeSAqcGksCi0JCQkJICAgc3RydWN0IGxjbnBoeV90eGdhaW5zICp0YXJnZXRfZ2FpbnMpOwotc3RhdGljIGJvb2wgd2xjX2xjbnBoeV9yeF9pcV9lc3Qoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBudW1fc2FtcHMsCi0JCQkJIHU4IHdhaXRfdGltZSwgc3RydWN0IGxjbnBoeV9pcV9lc3QgKmlxX2VzdCk7Ci1zdGF0aWMgYm9vbCB3bGNfbGNucGh5X2NhbGNfcnhfaXFfY29tcChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTE2IG51bV9zYW1wcyk7Ci1zdGF0aWMgdTE2IHdsY19sY25waHlfZ2V0X3BhX2dhaW4oc3RydWN0IGJyY21zX3BoeSAqcGkpOwotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV9hZmVfY2xrX2luaXQoc3RydWN0IGJyY21zX3BoeSAqcGksIHU4IG1vZGUpOwotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV90eF9wd3JfY3RybF9pbml0KHN0cnVjdCBicmNtc19waHlfcHViICpwcGkpOwotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV9yYWRpb18yMDY0X2NoYW5uZWxfdHVuZV80MzEzKHN0cnVjdCBicmNtc19waHkgKnBpLAotCQkJCQkJICAgIHU4IGNoYW5uZWwpOwotCi1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X2xvYWRfdHhfZ2Fpbl90YWJsZShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwKLQkJCQkgIGNvbnN0IHN0cnVjdCBsY25waHlfdHhfZ2Fpbl90YmxfZW50cnkgKmcpOwotCi1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X3NhbXBfY2FwKHN0cnVjdCBicmNtc19waHkgKnBpLCBpbnQgY2xpcF9kZXRlY3RfYWxnbywKLQkJCQl1MTYgdGhyZXNoLCBzMTYgKnB0ciwgaW50IG1vZGUpOwotc3RhdGljIGludCB3bGNfbGNucGh5X2NhbGNfZmxvb3IoczE2IGNvZWZmLCBpbnQgdHlwZSk7Ci1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X3R4X2lxbG9fbG9vcGJhY2soc3RydWN0IGJyY21zX3BoeSAqcGksCi0JCQkJCXUxNiAqdmFsdWVzX3RvX3NhdmUpOwotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV90eF9pcWxvX2xvb3BiYWNrX2NsZWFudXAoc3RydWN0IGJyY21zX3BoeSAqcGksCi0JCQkJCQl1MTYgKnZhbHVlc190b19zYXZlKTsKLXN0YXRpYyB2b2lkIHdsY19sY25waHlfc2V0X2NjKHN0cnVjdCBicmNtc19waHkgKnBpLCBpbnQgY2FsX3R5cGUsIHMxNiBjb2VmZl94LAotCQkJICAgICAgczE2IGNvZWZmX3kpOwotc3RhdGljIHN0cnVjdCBsY25waHlfdW5zaWduMTZfc3RydWN0IHdsY19sY25waHlfZ2V0X2NjKHN0cnVjdCBicmNtc19waHkgKnBpLAotCQkJCQkJICAgICAgIGludCBjYWxfdHlwZSk7Ci1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X2ExKHN0cnVjdCBicmNtc19waHkgKnBpLCBpbnQgY2FsX3R5cGUsCi0JCQkgIGludCBudW1fbGV2ZWxzLCBpbnQgc3RlcF9zaXplX2xnMik7Ci1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X3R4X2lxbG9fc29mdF9jYWxfZnVsbChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci0KLXN0YXRpYyB2b2lkIHdsY19sY25waHlfc2V0X2NoYW5zcGVjX3R3ZWFrcyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwKLQkJCQkJICAgY2hhbnNwZWNfdCBjaGFuc3BlYyk7Ci1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X2FnY190ZW1wX2luaXQoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV90ZW1wX2FkaihzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X2NsZWFyX3BhcGRfY29tcHRhYmxlKHN0cnVjdCBicmNtc19waHkgKnBpKTsKLXN0YXRpYyB2b2lkIHdsY19sY25waHlfYmFzZWJhbmRfaW5pdChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X3JhZGlvX2luaXQoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV9yY19jYWwoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV9yY2FsKHN0cnVjdCBicmNtc19waHkgKnBpKTsKLXN0YXRpYyB2b2lkIHdsY19sY25waHlfdHhyeF9zcHVyX2F2b2lkYW5jZV9tb2RlKHN0cnVjdCBicmNtc19waHkgKnBpLAotCQkJCQkJYm9vbCBlbmFibGUpOwotc3RhdGljIGludCB3bGNfbGNucGh5X2xvYWRfdHhfaWlyX2ZpbHRlcihzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgYm9vbCBpc19vZmRtLAotCQkJCQkgczE2IGZpbHRfdHlwZSk7Ci1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X3NldF9yeF9pcV9jb21wKHN0cnVjdCBicmNtc19waHkgKnBpLCB1MTYgYSwgdTE2IGIpOwotCi12b2lkIHdsY19sY25waHlfd3JpdGVfdGFibGUoc3RydWN0IGJyY21zX3BoeSAqcGksIGNvbnN0IHN0cnVjdCBwaHl0YmxfaW5mbyAqcHRpKQotewotCXdsY19waHlfd3JpdGVfdGFibGUocGksIHB0aSwgMHg0NTUsIDB4NDU3LCAweDQ1Nik7Ci19Ci0KLXZvaWQgd2xjX2xjbnBoeV9yZWFkX3RhYmxlKHN0cnVjdCBicmNtc19waHkgKnBpLCBzdHJ1Y3QgcGh5dGJsX2luZm8gKnB0aSkKLXsKLQl3bGNfcGh5X3JlYWRfdGFibGUocGksIHB0aSwgMHg0NTUsIDB4NDU3LCAweDQ1Nik7Ci19Ci0KLXN0YXRpYyB2b2lkCi13bGNfbGNucGh5X2NvbW1vbl9yZWFkX3RhYmxlKHN0cnVjdCBicmNtc19waHkgKnBpLCB1MzIgdGJsX2lkLAotCQkJICAgICBjb25zdCB2b2lkICp0YmxfcHRyLCB1MzIgdGJsX2xlbiwKLQkJCSAgICAgdTMyIHRibF93aWR0aCwgdTMyIHRibF9vZmZzZXQpCi17Ci0Jc3RydWN0IHBoeXRibF9pbmZvIHRhYjsKLQl0YWIudGJsX2lkID0gdGJsX2lkOwotCXRhYi50YmxfcHRyID0gdGJsX3B0cjsKLQl0YWIudGJsX2xlbiA9IHRibF9sZW47Ci0JdGFiLnRibF93aWR0aCA9IHRibF93aWR0aDsKLQl0YWIudGJsX29mZnNldCA9IHRibF9vZmZzZXQ7Ci0Jd2xjX2xjbnBoeV9yZWFkX3RhYmxlKHBpLCAmdGFiKTsKLX0KLQotc3RhdGljIHZvaWQKLXdsY19sY25waHlfY29tbW9uX3dyaXRlX3RhYmxlKHN0cnVjdCBicmNtc19waHkgKnBpLCB1MzIgdGJsX2lkLAotCQkJICAgICAgY29uc3Qgdm9pZCAqdGJsX3B0ciwgdTMyIHRibF9sZW4sCi0JCQkgICAgICB1MzIgdGJsX3dpZHRoLCB1MzIgdGJsX29mZnNldCkKLXsKLQotCXN0cnVjdCBwaHl0YmxfaW5mbyB0YWI7Ci0JdGFiLnRibF9pZCA9IHRibF9pZDsKLQl0YWIudGJsX3B0ciA9IHRibF9wdHI7Ci0JdGFiLnRibF9sZW4gPSB0YmxfbGVuOwotCXRhYi50Ymxfd2lkdGggPSB0Ymxfd2lkdGg7Ci0JdGFiLnRibF9vZmZzZXQgPSB0Ymxfb2Zmc2V0OwotCXdsY19sY25waHlfd3JpdGVfdGFibGUocGksICZ0YWIpOwotfQotCi1zdGF0aWMgdTMyCi13bGNfbGNucGh5X3FkaXZfcm91bmR1cCh1MzIgZGl2aWRlbmQsIHUzMiBkaXZpc29yLCB1OCBwcmVjaXNpb24pCi17Ci0JdTMyIHF1b3RpZW50LCByZW1haW5kZXIsIHJvdW5kdXAsIHJiaXQ7Ci0KLQlxdW90aWVudCA9IGRpdmlkZW5kIC8gZGl2aXNvcjsKLQlyZW1haW5kZXIgPSBkaXZpZGVuZCAlIGRpdmlzb3I7Ci0JcmJpdCA9IGRpdmlzb3IgJiAxOwotCXJvdW5kdXAgPSAoZGl2aXNvciA+PiAxKSArIHJiaXQ7Ci0KLQl3aGlsZSAocHJlY2lzaW9uLS0pIHsKLQkJcXVvdGllbnQgPDw9IDE7Ci0JCWlmIChyZW1haW5kZXIgPj0gcm91bmR1cCkgewotCQkJcXVvdGllbnQrKzsKLQkJCXJlbWFpbmRlciA9ICgocmVtYWluZGVyIC0gcm91bmR1cCkgPDwgMSkgKyByYml0OwotCQl9IGVsc2UgewotCQkJcmVtYWluZGVyIDw8PSAxOwotCQl9Ci0JfQotCi0JaWYgKHJlbWFpbmRlciA+PSByb3VuZHVwKQotCQlxdW90aWVudCsrOwotCi0JcmV0dXJuIHF1b3RpZW50OwotfQotCi1zdGF0aWMgaW50IHdsY19sY25waHlfY2FsY19mbG9vcihzMTYgY29lZmZfeCwgaW50IHR5cGUpCi17Ci0JaW50IGs7Ci0JayA9IDA7Ci0JaWYgKHR5cGUgPT0gMCkgewotCQlpZiAoY29lZmZfeCA8IDApIHsKLQkJCWsgPSAoY29lZmZfeCAtIDEpIC8gMjsKLQkJfSBlbHNlIHsKLQkJCWsgPSBjb2VmZl94IC8gMjsKLQkJfQotCX0KLQlpZiAodHlwZSA9PSAxKSB7Ci0JCWlmICgoY29lZmZfeCArIDEpIDwgMCkKLQkJCWsgPSAoY29lZmZfeCkgLyAyOwotCQllbHNlCi0JCQlrID0gKGNvZWZmX3ggKyAxKSAvIDI7Ci0JfQotCXJldHVybiBrOwotfQotCi1zOCB3bGNfbGNucGh5X2dldF9jdXJyZW50X3R4X3B3cl9pZHgoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JczggaW5kZXg7Ci0Jc3RydWN0IGJyY21zX3BoeV9sY25waHkgKnBpX2xjbiA9IHBpLT51LnBpX2xjbnBoeTsKLQotCWlmICh0eHB3cmN0cmxfb2ZmKHBpKSkKLQkJaW5kZXggPSBwaV9sY24tPmxjbnBoeV9jdXJyZW50X2luZGV4OwotCWVsc2UgaWYgKHdsY19sY25waHlfdHNzaV9iYXNlZF9wd3JfY3RybF9lbmFibGVkKHBpKSkKLQkJaW5kZXggPQotCQkgICAgKHM4KSAod2xjX2xjbnBoeV9nZXRfY3VycmVudF90eF9wd3JfaWR4X2lmX3B3cmN0cmxfb24ocGkpCi0JCQkgICAgLyAyKTsKLQllbHNlCi0JCWluZGV4ID0gcGlfbGNuLT5sY25waHlfY3VycmVudF9pbmRleDsKLQlyZXR1cm4gaW5kZXg7Ci19Ci0KLXN0YXRpYyB1MzIgd2xjX2xjbnBoeV9tZWFzdXJlX2RpZ2l0YWxfcG93ZXIoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBuc2FtcGxlcykKLXsKLQlzdHJ1Y3QgbGNucGh5X2lxX2VzdCBpcV9lc3QgPSB7IDAsIDAsIDAgfTsKLQotCWlmICghd2xjX2xjbnBoeV9yeF9pcV9lc3QocGksIG5zYW1wbGVzLCAzMiwgJmlxX2VzdCkpCi0JCXJldHVybiAwOwotCXJldHVybiAoaXFfZXN0LmlfcHdyICsgaXFfZXN0LnFfcHdyKSAvIG5zYW1wbGVzOwotfQotCi12b2lkIHdsY19sY25waHlfY3JzdXBycyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgaW50IGNoYW5uZWwpCi17Ci0JdTE2IGFmZWN0cmxvdnIsIGFmZWN0cmxvdnJ2YWw7Ci0JYWZlY3RybG92ciA9IHJlYWRfcGh5X3JlZyhwaSwgMHg0M2IpOwotCWFmZWN0cmxvdnJ2YWwgPSByZWFkX3BoeV9yZWcocGksIDB4NDNjKTsKLQlpZiAoY2hhbm5lbCAhPSAwKSB7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDQzYiwgKDB4MSA8PCAxKSwgKDEpIDw8IDEpOwotCi0JCW1vZF9waHlfcmVnKHBpLCAweDQzYywgKDB4MSA8PCAxKSwgKDApIDw8IDEpOwotCi0JCW1vZF9waHlfcmVnKHBpLCAweDQzYiwgKDB4MSA8PCA0KSwgKDEpIDw8IDQpOwotCi0JCW1vZF9waHlfcmVnKHBpLCAweDQzYywgKDB4MSA8PCA2KSwgKDApIDw8IDYpOwotCi0JCXdyaXRlX3BoeV9yZWcocGksIDB4NDRiLCAweGZmZmYpOwotCQl3bGNfbGNucGh5X3R4X3B1KHBpLCAxKTsKLQotCQltb2RfcGh5X3JlZyhwaSwgMHg2MzQsICgweGZmIDw8IDgpLCAoMCkgPDwgOCk7Ci0KLQkJb3JfcGh5X3JlZyhwaSwgMHg2ZGEsIDB4MDA4MCk7Ci0KLQkJb3JfcGh5X3JlZyhwaSwgMHgwMGEsIDB4MjI4KTsKLQl9IGVsc2UgewotCQlhbmRfcGh5X3JlZyhwaSwgMHgwMGEsIH4oMHgyMjgpKTsKLQotCQlhbmRfcGh5X3JlZyhwaSwgMHg2ZGEsIDB4RkY3Rik7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4NDNiLCBhZmVjdHJsb3ZyKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg0M2MsIGFmZWN0cmxvdnJ2YWwpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV90b2dnbGVfYWZlX3B3ZG4oc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JdTE2IHNhdmVfQWZlQ3RybE92clZhbCwgc2F2ZV9BZmVDdHJsT3ZyOwotCi0Jc2F2ZV9BZmVDdHJsT3ZyVmFsID0gcmVhZF9waHlfcmVnKHBpLCAweDQzYyk7Ci0Jc2F2ZV9BZmVDdHJsT3ZyID0gcmVhZF9waHlfcmVnKHBpLCAweDQzYik7Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCAweDQzYywgc2F2ZV9BZmVDdHJsT3ZyVmFsIHwgMHgxKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDQzYiwgc2F2ZV9BZmVDdHJsT3ZyIHwgMHgxKTsKLQotCXdyaXRlX3BoeV9yZWcocGksIDB4NDNjLCBzYXZlX0FmZUN0cmxPdnJWYWwgJiAweGZmZmUpOwotCXdyaXRlX3BoeV9yZWcocGksIDB4NDNiLCBzYXZlX0FmZUN0cmxPdnIgJiAweGZmZmUpOwotCi0Jd3JpdGVfcGh5X3JlZyhwaSwgMHg0M2MsIHNhdmVfQWZlQ3RybE92clZhbCk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHg0M2IsIHNhdmVfQWZlQ3RybE92cik7Ci19Ci0KLXN0YXRpYyB2b2lkCi13bGNfbGNucGh5X3R4cnhfc3B1cl9hdm9pZGFuY2VfbW9kZShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgYm9vbCBlbmFibGUpCi17Ci0JaWYgKGVuYWJsZSkgewotCQl3cml0ZV9waHlfcmVnKHBpLCAweDk0MiwgMHg3KTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg5M2IsICgoMSA8PCAxMykgKyAyMykpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDkzYywgKCgxIDw8IDEzKSArIDE5ODkpKTsKLQotCQl3cml0ZV9waHlfcmVnKHBpLCAweDQ0YSwgMHgwODQpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDQ0YSwgMHgwODApOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDZkMywgMHgyMjIyKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg2ZDMsIDB4MjIyMCk7Ci0JfSBlbHNlIHsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg5NDIsIDB4MCk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4OTNiLCAoKDAgPDwgMTMpICsgMjMpKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg5M2MsICgoMCA8PCAxMykgKyAxOTg5KSk7Ci0JfQotCXdsYXBpX3N3aXRjaF9tYWNmcmVxKHBpLT5zaC0+cGh5c2hpbSwgZW5hYmxlKTsKLX0KLQotdm9pZCB3bGNfcGh5X2NoYW5zcGVjX3NldF9sY25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIGNoYW5zcGVjX3QgY2hhbnNwZWMpCi17Ci0JdTggY2hhbm5lbCA9IENIU1BFQ19DSEFOTkVMKGNoYW5zcGVjKTsKLQotCXdsY19waHlfY2hhbnNwZWNfcmFkaW9fc2V0KChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqKSBwaSwgY2hhbnNwZWMpOwotCi0Jd2xjX2xjbnBoeV9zZXRfY2hhbnNwZWNfdHdlYWtzKHBpLCBwaS0+cmFkaW9fY2hhbnNwZWMpOwotCi0Jb3JfcGh5X3JlZyhwaSwgMHg0NGEsIDB4NDQpOwotCXdyaXRlX3BoeV9yZWcocGksIDB4NDRhLCAweDgwKTsKLQotCWlmICghTk9SQURJT19FTkFCKHBpLT5wdWJwaSkpIHsKLQkJd2xjX2xjbnBoeV9yYWRpb18yMDY0X2NoYW5uZWxfdHVuZV80MzEzKHBpLCBjaGFubmVsKTsKLQkJdWRlbGF5KDEwMDApOwotCX0KLQotCXdsY19sY25waHlfdG9nZ2xlX2FmZV9wd2RuKHBpKTsKLQotCXdyaXRlX3BoeV9yZWcocGksIDB4NjU3LCBsY25waHlfc2ZvX2NmZ1tjaGFubmVsIC0gMV0ucHRjZW50cmVUczIwKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDY1OCwgbGNucGh5X3Nmb19jZmdbY2hhbm5lbCAtIDFdLnB0Y2VudHJlRmFjdG9yKTsKLQotCWlmIChDSFNQRUNfQ0hBTk5FTChwaS0+cmFkaW9fY2hhbnNwZWMpID09IDE0KSB7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDQ0OCwgKDB4MyA8PCA4KSwgKDIpIDw8IDgpOwotCi0JCXdsY19sY25waHlfbG9hZF90eF9paXJfZmlsdGVyKHBpLCBmYWxzZSwgMyk7Ci0JfSBlbHNlIHsKLQkJbW9kX3BoeV9yZWcocGksIDB4NDQ4LCAoMHgzIDw8IDgpLCAoMSkgPDwgOCk7Ci0KLQkJd2xjX2xjbnBoeV9sb2FkX3R4X2lpcl9maWx0ZXIocGksIGZhbHNlLCAyKTsKLQl9Ci0KLQl3bGNfbGNucGh5X2xvYWRfdHhfaWlyX2ZpbHRlcihwaSwgdHJ1ZSwgMCk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0ZWIsICgweDcgPDwgMyksICgxKSA8PCAzKTsKLQotfQotCi1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X3NldF9kYWNfZ2FpbihzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTE2IGRhY19nYWluKQotewotCXUxNiBkYWNfY3RybDsKLQotCWRhY19jdHJsID0gKHJlYWRfcGh5X3JlZyhwaSwgMHg0MzkpID4+IDApOwotCWRhY19jdHJsID0gZGFjX2N0cmwgJiAweGM3ZjsKLQlkYWNfY3RybCA9IGRhY19jdHJsIHwgKGRhY19nYWluIDw8IDcpOwotCW1vZF9waHlfcmVnKHBpLCAweDQzOSwgKDB4ZmZmIDw8IDApLCAoZGFjX2N0cmwpIDw8IDApOwotCi19Ci0KLXN0YXRpYyB2b2lkIHdsY19sY25waHlfc2V0X3R4X2dhaW5fb3ZlcnJpZGUoc3RydWN0IGJyY21zX3BoeSAqcGksIGJvb2wgYkVuYWJsZSkKLXsKLQl1MTYgYml0ID0gYkVuYWJsZSA/IDEgOiAwOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NGIwLCAoMHgxIDw8IDcpLCBiaXQgPDwgNyk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0YjAsICgweDEgPDwgMTQpLCBiaXQgPDwgMTQpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NDNiLCAoMHgxIDw8IDYpLCBiaXQgPDwgNik7Ci19Ci0KLXN0YXRpYyB1MTYgd2xjX2xjbnBoeV9nZXRfcGFfZ2FpbihzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQl1MTYgcGFfZ2FpbjsKLQotCXBhX2dhaW4gPSAocmVhZF9waHlfcmVnKHBpLCAweDRmYikgJgotCQkgICBMQ05QSFlfdHhnYWluY3RybG92cnZhbDFfcGFnYWluX292cl92YWwxX01BU0spID4+Ci0JICAgIExDTlBIWV90eGdhaW5jdHJsb3ZydmFsMV9wYWdhaW5fb3ZyX3ZhbDFfU0hJRlQ7Ci0KLQlyZXR1cm4gcGFfZ2FpbjsKLX0KLQotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV9zZXRfdHhfZ2FpbihzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwKLQkJCQkgICBzdHJ1Y3QgbGNucGh5X3R4Z2FpbnMgKnRhcmdldF9nYWlucykKLXsKLQl1MTYgcGFfZ2FpbiA9IHdsY19sY25waHlfZ2V0X3BhX2dhaW4ocGkpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NGI1LAotCQkgICAgKDB4ZmZmZiA8PCAwKSwKLQkJICAgICgodGFyZ2V0X2dhaW5zLT5nbV9nYWluKSB8ICh0YXJnZXRfZ2FpbnMtPnBnYV9nYWluIDw8IDgpKSA8PAotCQkgICAgMCk7Ci0JbW9kX3BoeV9yZWcocGksIDB4NGZiLAotCQkgICAgKDB4N2ZmZiA8PCAwKSwKLQkJICAgICgodGFyZ2V0X2dhaW5zLT5wYWRfZ2FpbikgfCAocGFfZ2FpbiA8PCA4KSkgPDwgMCk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0ZmMsCi0JCSAgICAoMHhmZmZmIDw8IDApLAotCQkgICAgKCh0YXJnZXRfZ2FpbnMtPmdtX2dhaW4pIHwgKHRhcmdldF9nYWlucy0+cGdhX2dhaW4gPDwgOCkpIDw8Ci0JCSAgICAwKTsKLQltb2RfcGh5X3JlZyhwaSwgMHg0ZmQsCi0JCSAgICAoMHg3ZmZmIDw8IDApLAotCQkgICAgKCh0YXJnZXRfZ2FpbnMtPnBhZF9nYWluKSB8IChwYV9nYWluIDw8IDgpKSA8PCAwKTsKLQotCXdsY19sY25waHlfc2V0X2RhY19nYWluKHBpLCB0YXJnZXRfZ2FpbnMtPmRhY19nYWluKTsKLQotCXdsY19sY25waHlfZW5hYmxlX3R4X2dhaW5fb3ZlcnJpZGUocGkpOwotfQotCi1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X3NldF9iYm11bHQoc3RydWN0IGJyY21zX3BoeSAqcGksIHU4IG0wKQotewotCXUxNiBtMG0xID0gKHUxNikgbTAgPDwgODsKLQlzdHJ1Y3QgcGh5dGJsX2luZm8gdGFiOwotCi0JdGFiLnRibF9wdHIgPSAmbTBtMTsKLQl0YWIudGJsX2xlbiA9IDE7Ci0JdGFiLnRibF9pZCA9IExDTlBIWV9UQkxfSURfSVFMT0NBTDsKLQl0YWIudGJsX29mZnNldCA9IDg3OwotCXRhYi50Ymxfd2lkdGggPSAxNjsKLQl3bGNfbGNucGh5X3dyaXRlX3RhYmxlKHBpLCAmdGFiKTsKLX0KLQotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV9jbGVhcl90eF9wb3dlcl9vZmZzZXRzKHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXUzMiBkYXRhX2J1Zls2NF07Ci0Jc3RydWN0IHBoeXRibF9pbmZvIHRhYjsKLQotCW1lbXNldChkYXRhX2J1ZiwgMCwgc2l6ZW9mKGRhdGFfYnVmKSk7Ci0KLQl0YWIudGJsX2lkID0gTENOUEhZX1RCTF9JRF9UWFBXUkNUTDsKLQl0YWIudGJsX3dpZHRoID0gMzI7Ci0JdGFiLnRibF9wdHIgPSBkYXRhX2J1ZjsKLQotCWlmICghd2xjX2xjbnBoeV90ZW1wc2Vuc2VfYmFzZWRfcHdyX2N0cmxfZW5hYmxlZChwaSkpIHsKLQotCQl0YWIudGJsX2xlbiA9IDMwOwotCQl0YWIudGJsX29mZnNldCA9IExDTlBIWV9UWF9QV1JfQ1RSTF9SQVRFX09GRlNFVDsKLQkJd2xjX2xjbnBoeV93cml0ZV90YWJsZShwaSwgJnRhYik7Ci0JfQotCi0JdGFiLnRibF9sZW4gPSA2NDsKLQl0YWIudGJsX29mZnNldCA9IExDTlBIWV9UWF9QV1JfQ1RSTF9NQUNfT0ZGU0VUOwotCXdsY19sY25waHlfd3JpdGVfdGFibGUocGksICZ0YWIpOwotfQotCi1lbnVtIGxjbnBoeV90c3NpX21vZGUgewotCUxDTlBIWV9UU1NJX1BSRV9QQSwKLQlMQ05QSFlfVFNTSV9QT1NUX1BBLAotCUxDTlBIWV9UU1NJX0VYVAotfTsKLQotc3RhdGljIHZvaWQKLXdsY19sY25waHlfc2V0X3Rzc2lfbXV4KHN0cnVjdCBicmNtc19waHkgKnBpLCBlbnVtIGxjbnBoeV90c3NpX21vZGUgcG9zKQotewotCW1vZF9waHlfcmVnKHBpLCAweDRkNywgKDB4MSA8PCAwKSwgKDB4MSkgPDwgMCk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0ZDcsICgweDEgPDwgNiksICgxKSA8PCA2KTsKLQotCWlmIChMQ05QSFlfVFNTSV9QT1NUX1BBID09IHBvcykgewotCQltb2RfcGh5X3JlZyhwaSwgMHg0ZDksICgweDEgPDwgMiksICgwKSA8PCAyKTsKLQotCQltb2RfcGh5X3JlZyhwaSwgMHg0ZDksICgweDEgPDwgMyksICgxKSA8PCAzKTsKLQotCQlpZiAoTENOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCAyKSkgewotCQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwODYsIDB4NCwgMHg0KTsKLQkJfSBlbHNlIHsKLQkJCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDNBLCAxLCAweDEpOwotCQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcxMUEsIDB4OCwgMHg4KTsKLQkJfQotCX0gZWxzZSB7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDRkOSwgKDB4MSA8PCAyKSwgKDB4MSkgPDwgMik7Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4NGQ5LCAoMHgxIDw8IDMpLCAoMCkgPDwgMyk7Ci0KLQkJaWYgKExDTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgMikpIHsKLQkJCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDg2LCAweDQsIDB4NCk7Ci0JCX0gZWxzZSB7Ci0JCQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzAzQSwgMSwgMCk7Ci0JCQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzExQSwgMHg4LCAweDgpOwotCQl9Ci0JfQotCW1vZF9waHlfcmVnKHBpLCAweDYzNywgKDB4MyA8PCAxNCksICgwKSA8PCAxNCk7Ci0KLQlpZiAoTENOUEhZX1RTU0lfRVhUID09IHBvcykgewotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDdGLCAxKTsKLQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwMDUsIDB4NywgMHgyKTsKLQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcxMTIsIDB4ODAsIDB4MSA8PCA3KTsKLQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwMjgsIDB4MWYsIDB4Myk7Ci0JfQotfQotCi1zdGF0aWMgdTE2IHdsY19sY25waHlfcmZzZXFfdGJsX2FkY19wd3J1cChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQl1MTYgTjEsIE4yLCBOMywgTjQsIE41LCBONiwgTjsKLQlOMSA9ICgocmVhZF9waHlfcmVnKHBpLCAweDRhNSkgJiAoMHhmZiA8PCAwKSkKLQkgICAgICA+PiAwKTsKLQlOMiA9IDEgPDwgKChyZWFkX3BoeV9yZWcocGksIDB4NGE1KSAmICgweDcgPDwgMTIpKQotCQkgICA+PiAxMik7Ci0JTjMgPSAoKHJlYWRfcGh5X3JlZyhwaSwgMHg0MGQpICYgKDB4ZmYgPDwgMCkpCi0JICAgICAgPj4gMCk7Ci0JTjQgPSAxIDw8ICgocmVhZF9waHlfcmVnKHBpLCAweDQwZCkgJiAoMHg3IDw8IDgpKQotCQkgICA+PiA4KTsKLQlONSA9ICgocmVhZF9waHlfcmVnKHBpLCAweDRhMikgJiAoMHhmZiA8PCAwKSkKLQkgICAgICA+PiAwKTsKLQlONiA9IDEgPDwgKChyZWFkX3BoeV9yZWcocGksIDB4NGEyKSAmICgweDcgPDwgOCkpCi0JCSAgID4+IDgpOwotCU4gPSAyICogKE4xICsgTjIgKyBOMyArIE40ICsgMiAqIChONSArIE42KSkgKyA4MDsKLQlpZiAoTiA8IDE2MDApCi0JCU4gPSAxNjAwOwotCXJldHVybiBOOwotfQotCi1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X3B3cmN0cmxfcnNzaXBhcmFtcyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQl1MTYgYXV4cGdhX3ZtaWQsIGF1eHBnYV92bWlkX3RlbXAsIGF1eHBnYV9nYWluX3RlbXA7Ci0Jc3RydWN0IGJyY21zX3BoeV9sY25waHkgKnBpX2xjbiA9IHBpLT51LnBpX2xjbnBoeTsKLQotCWF1eHBnYV92bWlkID0KLQkgICAgKDIgPDwgOCkgfCAocGlfbGNuLT5sY25waHlfcnNzaV92YyA8PCA0KSB8IHBpX2xjbi0+bGNucGh5X3Jzc2lfdmY7Ci0JYXV4cGdhX3ZtaWRfdGVtcCA9ICgyIDw8IDgpIHwgKDggPDwgNCkgfCA0OwotCWF1eHBnYV9nYWluX3RlbXAgPSAyOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NGQ4LCAoMHgxIDw8IDApLCAoMCkgPDwgMCk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0ZDgsICgweDEgPDwgMSksICgwKSA8PCAxKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRkNywgKDB4MSA8PCAzKSwgKDApIDw8IDMpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NGRiLAotCQkgICAgKDB4M2ZmIDw8IDApIHwKLQkJICAgICgweDcgPDwgMTIpLAotCQkgICAgKGF1eHBnYV92bWlkIDw8IDApIHwgKHBpX2xjbi0+bGNucGh5X3Jzc2lfZ3MgPDwgMTIpKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRkYywKLQkJICAgICgweDNmZiA8PCAwKSB8Ci0JCSAgICAoMHg3IDw8IDEyKSwKLQkJICAgIChhdXhwZ2Ffdm1pZCA8PCAwKSB8IChwaV9sY24tPmxjbnBoeV9yc3NpX2dzIDw8IDEyKSk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0MGEsCi0JCSAgICAoMHgzZmYgPDwgMCkgfAotCQkgICAgKDB4NyA8PCAxMiksCi0JCSAgICAoYXV4cGdhX3ZtaWQgPDwgMCkgfCAocGlfbGNuLT5sY25waHlfcnNzaV9ncyA8PCAxMikpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NDBiLAotCQkgICAgKDB4M2ZmIDw8IDApIHwKLQkJICAgICgweDcgPDwgMTIpLAotCQkgICAgKGF1eHBnYV92bWlkX3RlbXAgPDwgMCkgfCAoYXV4cGdhX2dhaW5fdGVtcCA8PCAxMikpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NDBjLAotCQkgICAgKDB4M2ZmIDw8IDApIHwKLQkJICAgICgweDcgPDwgMTIpLAotCQkgICAgKGF1eHBnYV92bWlkX3RlbXAgPDwgMCkgfCAoYXV4cGdhX2dhaW5fdGVtcCA8PCAxMikpOwotCi0JbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwODIsICgxIDw8IDUpLCAoMSA8PCA1KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsY19sY25waHlfdHNzaV9zZXR1cChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQlzdHJ1Y3QgcGh5dGJsX2luZm8gdGFiOwotCXUzMiByZnNlcSwgaW5kOwotCi0JdGFiLnRibF9pZCA9IExDTlBIWV9UQkxfSURfVFhQV1JDVEw7Ci0JdGFiLnRibF93aWR0aCA9IDMyOwotCXRhYi50YmxfcHRyID0gJmluZDsKLQl0YWIudGJsX2xlbiA9IDE7Ci0JdGFiLnRibF9vZmZzZXQgPSAwOwotCWZvciAoaW5kID0gMDsgaW5kIDwgMTI4OyBpbmQrKykgewotCQl3bGNfbGNucGh5X3dyaXRlX3RhYmxlKHBpLCAmdGFiKTsKLQkJdGFiLnRibF9vZmZzZXQrKzsKLQl9Ci0JdGFiLnRibF9vZmZzZXQgPSA3MDQ7Ci0JZm9yIChpbmQgPSAwOyBpbmQgPCAxMjg7IGluZCsrKSB7Ci0JCXdsY19sY25waHlfd3JpdGVfdGFibGUocGksICZ0YWIpOwotCQl0YWIudGJsX29mZnNldCsrOwotCX0KLQltb2RfcGh5X3JlZyhwaSwgMHg1MDMsICgweDEgPDwgMCksICgwKSA8PCAwKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDUwMywgKDB4MSA8PCAyKSwgKDApIDw8IDIpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NTAzLCAoMHgxIDw8IDQpLCAoMSkgPDwgNCk7Ci0KLQl3bGNfbGNucGh5X3NldF90c3NpX211eChwaSwgTENOUEhZX1RTU0lfRVhUKTsKLQltb2RfcGh5X3JlZyhwaSwgMHg0YTQsICgweDEgPDwgMTQpLCAoMCkgPDwgMTQpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NGE0LCAoMHgxIDw8IDE1KSwgKDEpIDw8IDE1KTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRkMCwgKDB4MSA8PCA1KSwgKDApIDw8IDUpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NGE0LCAoMHgxZmYgPDwgMCksICgwKSA8PCAwKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRhNSwgKDB4ZmYgPDwgMCksICgyNTUpIDw8IDApOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NGE1LCAoMHg3IDw8IDEyKSwgKDUpIDw8IDEyKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRhNSwgKDB4NyA8PCA4KSwgKDApIDw8IDgpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NDBkLCAoMHhmZiA8PCAwKSwgKDY0KSA8PCAwKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDQwZCwgKDB4NyA8PCA4KSwgKDQpIDw8IDgpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NGEyLCAoMHhmZiA8PCAwKSwgKDY0KSA8PCAwKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRhMiwgKDB4NyA8PCA4KSwgKDQpIDw8IDgpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NGQwLCAoMHgxZmYgPDwgNiksICgwKSA8PCA2KTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRhOCwgKDB4ZmYgPDwgMCksICgweDEpIDw8IDApOwotCi0Jd2xjX2xjbnBoeV9jbGVhcl90eF9wb3dlcl9vZmZzZXRzKHBpKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRhNiwgKDB4MSA8PCAxNSksICgxKSA8PCAxNSk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0YTYsICgweDFmZiA8PCAwKSwgKDB4ZmYpIDw8IDApOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NDlhLCAoMHgxZmYgPDwgMCksICgweGZmKSA8PCAwKTsKLQotCWlmIChMQ05SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDIpKSB7Ci0JCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDI4LCAweGYsIDB4ZSk7Ci0JCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDg2LCAweDQsIDB4NCk7Ci0JfSBlbHNlIHsKLQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwM0EsIDB4MSwgMSk7Ci0JCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMTFBLCAweDgsIDEgPDwgMyk7Ci0JfQotCi0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzAyNSwgMHhjKTsKLQotCWlmIChMQ05SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDIpKSB7Ci0JCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDNBLCAweDEsIDEpOwotCX0gZWxzZSB7Ci0JCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKQotCQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwM0EsIDB4MiwgMSA8PCAxKTsKLQkJZWxzZQotCQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwM0EsIDB4MiwgMCA8PCAxKTsKLQl9Ci0KLQlpZiAoTENOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCAyKSkKLQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwM0EsIDB4MiwgMSA8PCAxKTsKLQllbHNlCi0JCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDNBLCAweDQsIDEgPDwgMik7Ci0KLQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzExQSwgMHgxLCAxIDw8IDApOwotCi0JbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwMDUsIDB4OCwgMSA8PCAzKTsKLQotCWlmICghd2xjX2xjbnBoeV90ZW1wc2Vuc2VfYmFzZWRfcHdyX2N0cmxfZW5hYmxlZChwaSkpIHsKLQkJbW9kX3BoeV9yZWcocGksIDB4NGQ3LAotCQkJICAgICgweDEgPDwgMykgfCAoMHg3IDw8IDEyKSwgMCA8PCAzIHwgMiA8PCAxMik7Ci0JfQotCi0JcmZzZXEgPSB3bGNfbGNucGh5X3Jmc2VxX3RibF9hZGNfcHdydXAocGkpOwotCXRhYi50YmxfaWQgPSBMQ05QSFlfVEJMX0lEX1JGU0VROwotCXRhYi50Ymxfd2lkdGggPSAxNjsKLQl0YWIudGJsX3B0ciA9ICZyZnNlcTsKLQl0YWIudGJsX2xlbiA9IDE7Ci0JdGFiLnRibF9vZmZzZXQgPSA2OwotCXdsY19sY25waHlfd3JpdGVfdGFibGUocGksICZ0YWIpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4OTM4LCAoMHgxIDw8IDIpLCAoMSkgPDwgMik7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg5MzksICgweDEgPDwgMiksICgxKSA8PCAyKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRhNCwgKDB4MSA8PCAxMiksICgxKSA8PCAxMik7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0ZDcsICgweDEgPDwgMiksICgxKSA8PCAyKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRkNywgKDB4ZiA8PCA4KSwgKDApIDw8IDgpOwotCi0Jd2xjX2xjbnBoeV9wd3JjdHJsX3Jzc2lwYXJhbXMocGkpOwotfQotCi12b2lkIHdsY19sY25waHlfdHhfcHdyX3VwZGF0ZV9ucHQoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JdTE2IHR4X2NudCwgdHhfdG90YWwsIG5wdDsKLQlzdHJ1Y3QgYnJjbXNfcGh5X2xjbnBoeSAqcGlfbGNuID0gcGktPnUucGlfbGNucGh5OwotCi0JdHhfdG90YWwgPSB3bGNfbGNucGh5X3RvdGFsX3R4X2ZyYW1lcyhwaSk7Ci0JdHhfY250ID0gdHhfdG90YWwgLSBwaV9sY24tPmxjbnBoeV90c3NpX3R4X2NudDsKLQlucHQgPSB3bGNfbGNucGh5X2dldF90eF9wd3JfbnB0KHBpKTsKLQotCWlmICh0eF9jbnQgPiAoMSA8PCBucHQpKSB7Ci0KLQkJcGlfbGNuLT5sY25waHlfdHNzaV90eF9jbnQgPSB0eF90b3RhbDsKLQotCQlwaV9sY24tPmxjbnBoeV90c3NpX2lkeCA9IHdsY19sY25waHlfZ2V0X2N1cnJlbnRfdHhfcHdyX2lkeChwaSk7Ci0JCXBpX2xjbi0+bGNucGh5X3Rzc2lfbnB0ID0gbnB0OwotCi0JfQotfQotCi1zMzIgd2xjX2xjbnBoeV90c3NpMmRibShzMzIgdHNzaSwgczMyIGExLCBzMzIgYjAsIHMzMiBiMSkKLXsKLQlzMzIgYSwgYiwgcDsKLQotCWEgPSAzMjc2OCArIChhMSAqIHRzc2kpOwotCWIgPSAoMTAyNCAqIGIwKSArICg2NCAqIGIxICogdHNzaSk7Ci0JcCA9ICgoMiAqIGIpICsgYSkgLyAoMiAqIGEpOwotCi0JcmV0dXJuIHA7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsY19sY25waHlfdHhwb3dlcl9yZXNldF9ucHQoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0Jc3RydWN0IGJyY21zX3BoeV9sY25waHkgKnBpX2xjbiA9IHBpLT51LnBpX2xjbnBoeTsKLQlpZiAod2xjX2xjbnBoeV90ZW1wc2Vuc2VfYmFzZWRfcHdyX2N0cmxfZW5hYmxlZChwaSkpCi0JCXJldHVybjsKLQotCXBpX2xjbi0+bGNucGh5X3Rzc2lfaWR4ID0gTENOUEhZX1RYX1BXUl9DVFJMX1NUQVJUX0lOREVYXzJHXzQzMTM7Ci0JcGlfbGNuLT5sY25waHlfdHNzaV9ucHQgPSBMQ05QSFlfVFhfUFdSX0NUUkxfU1RBUlRfTlBUOwotfQotCi12b2lkIHdsY19sY25waHlfdHhwb3dlcl9yZWNhbGNfdGFyZ2V0KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXN0cnVjdCBwaHl0YmxfaW5mbyB0YWI7Ci0JdTMyIHJhdGVfdGFibGVbQlJDTVNfTlVNX1JBVEVTX0NDSyArIEJSQ01TX05VTV9SQVRFU19PRkRNICsKLQkJCSAgQlJDTVNfTlVNX1JBVEVTX01DU18xX1NUUkVBTV07Ci0JdWludCBpLCBqOwotCWlmICh3bGNfbGNucGh5X3RlbXBzZW5zZV9iYXNlZF9wd3JfY3RybF9lbmFibGVkKHBpKSkKLQkJcmV0dXJuOwotCi0JZm9yIChpID0gMCwgaiA9IDA7IGkgPCBBUlJBWV9TSVpFKHJhdGVfdGFibGUpOyBpKyssIGorKykgewotCi0JCWlmIChpID09IEJSQ01TX05VTV9SQVRFU19DQ0sgKyBCUkNNU19OVU1fUkFURVNfT0ZETSkKLQkJCWogPSBUWFBfRklSU1RfTUNTXzIwX1NJU087Ci0KLQkJcmF0ZV90YWJsZVtpXSA9ICh1MzIpICgoczMyKSAoLXBpLT50eF9wb3dlcl9vZmZzZXRbal0pKTsKLQl9Ci0KLQl0YWIudGJsX2lkID0gTENOUEhZX1RCTF9JRF9UWFBXUkNUTDsKLQl0YWIudGJsX3dpZHRoID0gMzI7Ci0JdGFiLnRibF9sZW4gPSBBUlJBWV9TSVpFKHJhdGVfdGFibGUpOwotCXRhYi50YmxfcHRyID0gcmF0ZV90YWJsZTsKLQl0YWIudGJsX29mZnNldCA9IExDTlBIWV9UWF9QV1JfQ1RSTF9SQVRFX09GRlNFVDsKLQl3bGNfbGNucGh5X3dyaXRlX3RhYmxlKHBpLCAmdGFiKTsKLQotCWlmICh3bGNfbGNucGh5X2dldF90YXJnZXRfdHhfcHdyKHBpKSAhPSBwaS0+dHhfcG93ZXJfbWluKSB7Ci0JCXdsY19sY25waHlfc2V0X3RhcmdldF90eF9wd3IocGksIHBpLT50eF9wb3dlcl9taW4pOwotCi0JCXdsY19sY25waHlfdHhwb3dlcl9yZXNldF9ucHQocGkpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV9zZXRfdHhfcHdyX3NvZnRfY3RybChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgczggaW5kZXgpCi17Ci0JdTMyIGNja19vZmZzZXRbNF0gPSB7IDIyLCAyMiwgMjIsIDIyIH07Ci0JdTMyIG9mZG1fb2Zmc2V0LCByZWdfb2Zmc2V0X2NjazsKLQlpbnQgaTsKLQl1MTYgaW5kZXgyOwotCXN0cnVjdCBwaHl0YmxfaW5mbyB0YWI7Ci0KLQlpZiAod2xjX2xjbnBoeV90c3NpX2Jhc2VkX3B3cl9jdHJsX2VuYWJsZWQocGkpKQotCQlyZXR1cm47Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0YTQsICgweDEgPDwgMTQpLCAoMHgxKSA8PCAxNCk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0YTQsICgweDEgPDwgMTQpLCAoMHgwKSA8PCAxNCk7Ci0KLQlvcl9waHlfcmVnKHBpLCAweDZkYSwgMHgwMDQwKTsKLQotCXJlZ19vZmZzZXRfY2NrID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotCQljY2tfb2Zmc2V0W2ldIC09IHJlZ19vZmZzZXRfY2NrOwotCXRhYi50YmxfaWQgPSBMQ05QSFlfVEJMX0lEX1RYUFdSQ1RMOwotCXRhYi50Ymxfd2lkdGggPSAzMjsKLQl0YWIudGJsX2xlbiA9IDQ7Ci0JdGFiLnRibF9wdHIgPSBjY2tfb2Zmc2V0OwotCXRhYi50Ymxfb2Zmc2V0ID0gTENOUEhZX1RYX1BXUl9DVFJMX1JBVEVfT0ZGU0VUOwotCXdsY19sY25waHlfd3JpdGVfdGFibGUocGksICZ0YWIpOwotCW9mZG1fb2Zmc2V0ID0gMDsKLQl0YWIudGJsX2xlbiA9IDE7Ci0JdGFiLnRibF9wdHIgPSAmb2ZkbV9vZmZzZXQ7Ci0JZm9yIChpID0gODM2OyBpIDwgODYyOyBpKyspIHsKLQkJdGFiLnRibF9vZmZzZXQgPSBpOwotCQl3bGNfbGNucGh5X3dyaXRlX3RhYmxlKHBpLCAmdGFiKTsKLQl9Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0YTQsICgweDEgPDwgMTUpLCAoMHgxKSA8PCAxNSk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0YTQsICgweDEgPDwgMTQpLCAoMHgxKSA8PCAxNCk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0YTQsICgweDEgPDwgMTMpLCAoMHgxKSA8PCAxMyk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0YjAsICgweDEgPDwgNyksICgwKSA8PCA3KTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDQzYiwgKDB4MSA8PCA2KSwgKDApIDw8IDYpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NGE5LCAoMHgxIDw8IDE1KSwgKDEpIDw8IDE1KTsKLQotCWluZGV4MiA9ICh1MTYpIChpbmRleCAqIDIpOwotCW1vZF9waHlfcmVnKHBpLCAweDRhOSwgKDB4MWZmIDw8IDApLCAoaW5kZXgyKSA8PCAwKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDZhMywgKDB4MSA8PCA0KSwgKDApIDw8IDQpOwotCi19Ci0KLXN0YXRpYyBzOCB3bGNfbGNucGh5X3RlbXBjb21wZW5zYXRlZF90eHB3cmN0cmwoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JczggaW5kZXgsIGRlbHRhX2JyZCwgZGVsdGFfdGVtcCwgbmV3X2luZGV4LCB0ZW1wY29ycng7Ci0JczE2IG1hbnAsIG1lYXNfdGVtcCwgdGVtcF9kaWZmOwotCWJvb2wgbmVnID0gMDsKLQl1MTYgdGVtcDsKLQlzdHJ1Y3QgYnJjbXNfcGh5X2xjbnBoeSAqcGlfbGNuID0gcGktPnUucGlfbGNucGh5OwotCi0JaWYgKHdsY19sY25waHlfdHNzaV9iYXNlZF9wd3JfY3RybF9lbmFibGVkKHBpKSkKLQkJcmV0dXJuIHBpX2xjbi0+bGNucGh5X2N1cnJlbnRfaW5kZXg7Ci0KLQlpbmRleCA9IEZJWEVEX1RYUFdSOwotCi0JaWYgKE5PUkFESU9fRU5BQihwaS0+cHVicGkpKQotCQlyZXR1cm4gaW5kZXg7Ci0KLQlpZiAocGlfbGNuLT5sY25waHlfdGVtcHNlbnNlX3Nsb3BlID09IDApIHsKLQkJcmV0dXJuIGluZGV4OwotCX0KLQl0ZW1wID0gKHUxNikgd2xjX2xjbnBoeV90ZW1wc2Vuc2UocGksIDApOwotCW1lYXNfdGVtcCA9IExDTlBIWV9URU1QU0VOU0UodGVtcCk7Ci0KLQlpZiAocGktPnR4X3Bvd2VyX21pbiAhPSAwKSB7Ci0JCWRlbHRhX2JyZCA9IChwaV9sY24tPmxjbnBoeV9tZWFzUG93ZXIgLSBwaS0+dHhfcG93ZXJfbWluKTsKLQl9IGVsc2UgewotCQlkZWx0YV9icmQgPSAwOwotCX0KLQotCW1hbnAgPSBMQ05QSFlfVEVNUFNFTlNFKHBpX2xjbi0+bGNucGh5X3Jhd3RlbXBzZW5zZSk7Ci0JdGVtcF9kaWZmID0gbWFucCAtIG1lYXNfdGVtcDsKLQlpZiAodGVtcF9kaWZmIDwgMCkgewotCi0JCW5lZyA9IDE7Ci0KLQkJdGVtcF9kaWZmID0gLXRlbXBfZGlmZjsKLQl9Ci0KLQlkZWx0YV90ZW1wID0gKHM4KSB3bGNfbGNucGh5X3FkaXZfcm91bmR1cCgodTMyKSAodGVtcF9kaWZmICogMTkyKSwKLQkJCQkJCSAgICAodTMyKSAocGlfbGNuLT4KLQkJCQkJCQkgICAgICBsY25waHlfdGVtcHNlbnNlX3Nsb3BlCi0JCQkJCQkJICAgICAgKiAxMCksIDApOwotCWlmIChuZWcpCi0JCWRlbHRhX3RlbXAgPSAtZGVsdGFfdGVtcDsKLQotCWlmIChwaV9sY24tPmxjbnBoeV90ZW1wc2Vuc2Vfb3B0aW9uID09IDMKLQkgICAgJiYgTENOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCAwKSkKLQkJZGVsdGFfdGVtcCA9IDA7Ci0JaWYgKHBpX2xjbi0+bGNucGh5X3RlbXBjb3JyeCA+IDMxKQotCQl0ZW1wY29ycnggPSAoczgpIChwaV9sY24tPmxjbnBoeV90ZW1wY29ycnggLSA2NCk7Ci0JZWxzZQotCQl0ZW1wY29ycnggPSAoczgpIHBpX2xjbi0+bGNucGh5X3RlbXBjb3JyeDsKLQlpZiAoTENOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCAxKSkKLQkJdGVtcGNvcnJ4ID0gNDsKLQluZXdfaW5kZXggPQotCSAgICBpbmRleCArIGRlbHRhX2JyZCArIGRlbHRhX3RlbXAgLSBwaV9sY24tPmxjbnBoeV9iYW5kZWRnZV9jb3JyOwotCW5ld19pbmRleCArPSB0ZW1wY29ycng7Ci0KLQlpZiAoTENOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCAxKSkKLQkJaW5kZXggPSAxMjc7Ci0JaWYgKG5ld19pbmRleCA8IDAgfHwgbmV3X2luZGV4ID4gMTI2KSB7Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0JcmV0dXJuIG5ld19pbmRleDsKLX0KLQotc3RhdGljIHUxNiB3bGNfbGNucGh5X3NldF90eF9wd3JfY3RybF9tb2RlKHN0cnVjdCBicmNtc19waHkgKnBpLCB1MTYgbW9kZSkKLXsKLQotCXUxNiBjdXJyZW50X21vZGUgPSBtb2RlOwotCWlmICh3bGNfbGNucGh5X3RlbXBzZW5zZV9iYXNlZF9wd3JfY3RybF9lbmFibGVkKHBpKSAmJgotCSAgICBtb2RlID09IExDTlBIWV9UWF9QV1JfQ1RSTF9IVykKLQkJY3VycmVudF9tb2RlID0gTENOUEhZX1RYX1BXUl9DVFJMX1RFTVBCQVNFRDsKLQlpZiAod2xjX2xjbnBoeV90c3NpX2Jhc2VkX3B3cl9jdHJsX2VuYWJsZWQocGkpICYmCi0JICAgIG1vZGUgPT0gTENOUEhZX1RYX1BXUl9DVFJMX1RFTVBCQVNFRCkKLQkJY3VycmVudF9tb2RlID0gTENOUEhZX1RYX1BXUl9DVFJMX0hXOwotCXJldHVybiBjdXJyZW50X21vZGU7Ci19Ci0KLXZvaWQgd2xjX2xjbnBoeV9zZXRfdHhfcHdyX2N0cmwoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBtb2RlKQotewotCXUxNiBvbGRfbW9kZSA9IHdsY19sY25waHlfZ2V0X3R4X3B3cl9jdHJsKHBpKTsKLQlzOCBpbmRleDsKLQlzdHJ1Y3QgYnJjbXNfcGh5X2xjbnBoeSAqcGlfbGNuID0gcGktPnUucGlfbGNucGh5OwotCi0JbW9kZSA9IHdsY19sY25waHlfc2V0X3R4X3B3cl9jdHJsX21vZGUocGksIG1vZGUpOwotCW9sZF9tb2RlID0gd2xjX2xjbnBoeV9zZXRfdHhfcHdyX2N0cmxfbW9kZShwaSwgb2xkX21vZGUpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NmRhLCAoMHgxIDw8IDYpLAotCQkgICAgKChMQ05QSFlfVFhfUFdSX0NUUkxfSFcgPT0gbW9kZSkgPyAxIDogMCkgPDwgNik7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg2YTMsICgweDEgPDwgNCksCi0JCSAgICAoKExDTlBIWV9UWF9QV1JfQ1RSTF9IVyA9PSBtb2RlKSA/IDAgOiAxKSA8PCA0KTsKLQotCWlmIChvbGRfbW9kZSAhPSBtb2RlKSB7Ci0JCWlmIChMQ05QSFlfVFhfUFdSX0NUUkxfSFcgPT0gb2xkX21vZGUpIHsKLQotCQkJd2xjX2xjbnBoeV90eF9wd3JfdXBkYXRlX25wdChwaSk7Ci0KLQkJCXdsY19sY25waHlfY2xlYXJfdHhfcG93ZXJfb2Zmc2V0cyhwaSk7Ci0JCX0KLQkJaWYgKExDTlBIWV9UWF9QV1JfQ1RSTF9IVyA9PSBtb2RlKSB7Ci0KLQkJCXdsY19sY25waHlfdHhwb3dlcl9yZWNhbGNfdGFyZ2V0KHBpKTsKLQotCQkJd2xjX2xjbnBoeV9zZXRfc3RhcnRfdHhfcHdyX2lkeChwaSwKLQkJCQkJCQlwaV9sY24tPgotCQkJCQkJCWxjbnBoeV90c3NpX2lkeCk7Ci0JCQl3bGNfbGNucGh5X3NldF90eF9wd3JfbnB0KHBpLCBwaV9sY24tPmxjbnBoeV90c3NpX25wdCk7Ci0JCQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzExRiwgMHg0LCAwKTsKLQotCQkJcGlfbGNuLT5sY25waHlfdHNzaV90eF9jbnQgPQotCQkJICAgIHdsY19sY25waHlfdG90YWxfdHhfZnJhbWVzKHBpKTsKLQotCQkJd2xjX2xjbnBoeV9kaXNhYmxlX3R4X2dhaW5fb3ZlcnJpZGUocGkpOwotCQkJcGlfbGNuLT5sY25waHlfdHhfcG93ZXJfaWR4X292ZXJyaWRlID0gLTE7Ci0JCX0gZWxzZQotCQkJd2xjX2xjbnBoeV9lbmFibGVfdHhfZ2Fpbl9vdmVycmlkZShwaSk7Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4NGE0LAotCQkJICAgICgoMHgxIDw8IDE1KSB8ICgweDEgPDwgMTQpIHwgKDB4MSA8PCAxMykpLCBtb2RlKTsKLQkJaWYgKG1vZGUgPT0gTENOUEhZX1RYX1BXUl9DVFJMX1RFTVBCQVNFRCkgewotCQkJaW5kZXggPSB3bGNfbGNucGh5X3RlbXBjb21wZW5zYXRlZF90eHB3cmN0cmwocGkpOwotCQkJd2xjX2xjbnBoeV9zZXRfdHhfcHdyX3NvZnRfY3RybChwaSwgaW5kZXgpOwotCQkJcGlfbGNuLT5sY25waHlfY3VycmVudF9pbmRleCA9IChzOCkKLQkJCSAgICAoKHJlYWRfcGh5X3JlZyhwaSwgMHg0YTkpICYgMHhGRikgLyAyKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIGJvb2wgd2xjX2xjbnBoeV9pcWNhbF93YWl0KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXVpbnQgZGVsYXlfY291bnQgPSAwOwotCi0Jd2hpbGUgKHdsY19sY25waHlfaXFjYWxfYWN0aXZlKHBpKSkgewotCQl1ZGVsYXkoMTAwKTsKLQkJZGVsYXlfY291bnQrKzsKLQotCQlpZiAoZGVsYXlfY291bnQgPiAoMTAgKiA1MDApKQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuICgwID09IHdsY19sY25waHlfaXFjYWxfYWN0aXZlKHBpKSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi13bGNfbGNucGh5X3R4X2lxbG9fY2FsKHN0cnVjdCBicmNtc19waHkgKnBpLAotCQkgICAgICAgc3RydWN0IGxjbnBoeV90eGdhaW5zICp0YXJnZXRfZ2FpbnMsCi0JCSAgICAgICBlbnVtIGxjbnBoeV9jYWxfbW9kZSBjYWxfbW9kZSwgYm9vbCBrZWVwX3RvbmUpCi17Ci0KLQlzdHJ1Y3QgbGNucGh5X3R4Z2FpbnMgY2FsX2dhaW5zLCB0ZW1wX2dhaW5zOwotCXUxNiBoYXNoOwotCXU4IGJhbmRfaWR4OwotCWludCBqOwotCXUxNiBuY29ycl9vdmVycmlkZVs1XTsKLQl1MTYgc3lzdF9jb2VmZnNbXSA9IHsgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLQkJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAKLQl9OwotCi0JdTE2IGNvbW1hbmRzX2Z1bGxjYWxbXSA9IHsKLQkJMHg4NDM0LCAweDgzMzQsIDB4ODA4NCwgMHg4MjY3LCAweDgwNTYsIDB4ODIzNCB9OwotCi0JdTE2IGNvbW1hbmRzX3JlY2FsW10gPSB7Ci0JCTB4ODQzNCwgMHg4MzM0LCAweDgwODQsIDB4ODI2NywgMHg4MDU2LCAweDgyMzQgfTsKLQotCXUxNiBjb21tYW5kX251bXNfZnVsbGNhbFtdID0gewotCQkweDdhOTcsIDB4N2E5NywgMHg3YTk3LCAweDdhODcsIDB4N2E4NywgMHg3Yjk3IH07Ci0KLQl1MTYgY29tbWFuZF9udW1zX3JlY2FsW10gPSB7Ci0JCTB4N2E5NywgMHg3YTk3LCAweDdhOTcsIDB4N2E4NywgMHg3YTg3LCAweDdiOTcgfTsKLQl1MTYgKmNvbW1hbmRfbnVtcyA9IGNvbW1hbmRfbnVtc19mdWxsY2FsOwotCi0JdTE2ICpzdGFydF9jb2VmZnMgPSBOVUxMLCAqY2FsX2NtZHMgPSBOVUxMLCBjYWxfdHlwZSwgZGlxX3N0YXJ0OwotCXUxNiB0eF9wd3JfY3RybF9vbGQsIHNhdmVfdHhwd3JjdHJscmZjdHJsMjsKLQl1MTYgc2F2ZV9zc2xwbkNhbGliQ2xrRW5DdHJsLCBzYXZlX3NzbHBuUnhGZUNsa0VuQ3RybDsKLQlib29sIHR4X2dhaW5fb3ZlcnJpZGVfb2xkOwotCXN0cnVjdCBsY25waHlfdHhnYWlucyBvbGRfZ2FpbnM7Ci0JdWludCBpLCBuX2NhbF9jbWRzID0gMCwgbl9jYWxfc3RhcnQgPSAwOwotCXUxNiAqdmFsdWVzX3RvX3NhdmU7Ci0Jc3RydWN0IGJyY21zX3BoeV9sY25waHkgKnBpX2xjbiA9IHBpLT51LnBpX2xjbnBoeTsKLQotCWlmIChOT1JBRElPX0VOQUIocGktPnB1YnBpKSkKLQkJcmV0dXJuOwotCi0JdmFsdWVzX3RvX3NhdmUgPSBrbWFsbG9jKHNpemVvZih1MTYpICogMjAsIEdGUF9BVE9NSUMpOwotCWlmIChOVUxMID09IHZhbHVlc190b19zYXZlKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlzYXZlX3NzbHBuUnhGZUNsa0VuQ3RybCA9IHJlYWRfcGh5X3JlZyhwaSwgMHg2ZGIpOwotCXNhdmVfc3NscG5DYWxpYkNsa0VuQ3RybCA9IHJlYWRfcGh5X3JlZyhwaSwgMHg2ZGEpOwotCi0Jb3JfcGh5X3JlZyhwaSwgMHg2ZGEsIDB4NDApOwotCW9yX3BoeV9yZWcocGksIDB4NmRiLCAweDMpOwotCi0Jc3dpdGNoIChjYWxfbW9kZSkgewotCWNhc2UgTENOUEhZX0NBTF9GVUxMOgotCQlzdGFydF9jb2VmZnMgPSBzeXN0X2NvZWZmczsKLQkJY2FsX2NtZHMgPSBjb21tYW5kc19mdWxsY2FsOwotCQluX2NhbF9jbWRzID0gQVJSQVlfU0laRShjb21tYW5kc19mdWxsY2FsKTsKLQkJYnJlYWs7Ci0KLQljYXNlIExDTlBIWV9DQUxfUkVDQUw6Ci0JCXN0YXJ0X2NvZWZmcyA9IHN5c3RfY29lZmZzOwotCQljYWxfY21kcyA9IGNvbW1hbmRzX3JlY2FsOwotCQluX2NhbF9jbWRzID0gQVJSQVlfU0laRShjb21tYW5kc19yZWNhbCk7Ci0JCWNvbW1hbmRfbnVtcyA9IGNvbW1hbmRfbnVtc19yZWNhbDsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQl3bGNfbGNucGh5X2NvbW1vbl93cml0ZV90YWJsZShwaSwgTENOUEhZX1RCTF9JRF9JUUxPQ0FMLAotCQkJCSAgICAgIHN0YXJ0X2NvZWZmcywgMTEsIDE2LCA2NCk7Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCAweDZkYSwgMHhmZmZmKTsKLQltb2RfcGh5X3JlZyhwaSwgMHg1MDMsICgweDEgPDwgMyksICgxKSA8PCAzKTsKLQotCXR4X3B3cl9jdHJsX29sZCA9IHdsY19sY25waHlfZ2V0X3R4X3B3cl9jdHJsKHBpKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRhNCwgKDB4MSA8PCAxMiksICgxKSA8PCAxMik7Ci0KLQl3bGNfbGNucGh5X3NldF90eF9wd3JfY3RybChwaSwgTENOUEhZX1RYX1BXUl9DVFJMX09GRik7Ci0KLQlzYXZlX3R4cHdyY3RybHJmY3RybDIgPSByZWFkX3BoeV9yZWcocGksIDB4NGRiKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRkYiwgKDB4M2ZmIDw8IDApLCAoMHgyYTYpIDw8IDApOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NGRiLCAoMHg3IDw8IDEyKSwgKDIpIDw8IDEyKTsKLQotCXdsY19sY25waHlfdHhfaXFsb19sb29wYmFjayhwaSwgdmFsdWVzX3RvX3NhdmUpOwotCi0JdHhfZ2Fpbl9vdmVycmlkZV9vbGQgPSB3bGNfbGNucGh5X3R4X2dhaW5fb3ZlcnJpZGVfZW5hYmxlZChwaSk7Ci0JaWYgKHR4X2dhaW5fb3ZlcnJpZGVfb2xkKQotCQl3bGNfbGNucGh5X2dldF90eF9nYWluKHBpLCAmb2xkX2dhaW5zKTsKLQotCWlmICghdGFyZ2V0X2dhaW5zKSB7Ci0JCWlmICghdHhfZ2Fpbl9vdmVycmlkZV9vbGQpCi0JCQl3bGNfbGNucGh5X3NldF90eF9wd3JfYnlfaW5kZXgocGksCi0JCQkJCQkgICAgICAgcGlfbGNuLT5sY25waHlfdHNzaV9pZHgpOwotCQl3bGNfbGNucGh5X2dldF90eF9nYWluKHBpLCAmdGVtcF9nYWlucyk7Ci0JCXRhcmdldF9nYWlucyA9ICZ0ZW1wX2dhaW5zOwotCX0KLQotCWhhc2ggPSAodGFyZ2V0X2dhaW5zLT5nbV9nYWluIDw8IDgpIHwKLQkgICAgKHRhcmdldF9nYWlucy0+cGdhX2dhaW4gPDwgNCkgfCAodGFyZ2V0X2dhaW5zLT5wYWRfZ2Fpbik7Ci0KLQliYW5kX2lkeCA9IChDSFNQRUNfSVM1RyhwaS0+cmFkaW9fY2hhbnNwZWMpID8gMSA6IDApOwotCi0JY2FsX2dhaW5zID0gKnRhcmdldF9nYWluczsKLQltZW1zZXQobmNvcnJfb3ZlcnJpZGUsIDAsIHNpemVvZihuY29ycl9vdmVycmlkZSkpOwotCWZvciAoaiA9IDA7IGogPCBpcWNhbF9nYWlucGFyYW1zX251bWdhaW5zX2xjbnBoeVtiYW5kX2lkeF07IGorKykgewotCQlpZiAoaGFzaCA9PSB0YmxfaXFjYWxfZ2FpbnBhcmFtc19sY25waHlbYmFuZF9pZHhdW2pdWzBdKSB7Ci0JCQljYWxfZ2FpbnMuZ21fZ2FpbiA9Ci0JCQkgICAgdGJsX2lxY2FsX2dhaW5wYXJhbXNfbGNucGh5W2JhbmRfaWR4XVtqXVsxXTsKLQkJCWNhbF9nYWlucy5wZ2FfZ2FpbiA9Ci0JCQkgICAgdGJsX2lxY2FsX2dhaW5wYXJhbXNfbGNucGh5W2JhbmRfaWR4XVtqXVsyXTsKLQkJCWNhbF9nYWlucy5wYWRfZ2FpbiA9Ci0JCQkgICAgdGJsX2lxY2FsX2dhaW5wYXJhbXNfbGNucGh5W2JhbmRfaWR4XVtqXVszXTsKLQkJCW1lbWNweShuY29ycl9vdmVycmlkZSwKLQkJCSAgICAgICAmdGJsX2lxY2FsX2dhaW5wYXJhbXNfbGNucGh5W2JhbmRfaWR4XVtqXVszXSwKLQkJCSAgICAgICBzaXplb2YobmNvcnJfb3ZlcnJpZGUpKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0Jd2xjX2xjbnBoeV9zZXRfdHhfZ2FpbihwaSwgJmNhbF9nYWlucyk7Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCAweDQ1MywgMHhhYTkpOwotCXdyaXRlX3BoeV9yZWcocGksIDB4OTNkLCAweGMwKTsKLQotCXdsY19sY25waHlfY29tbW9uX3dyaXRlX3RhYmxlKHBpLCBMQ05QSFlfVEJMX0lEX0lRTE9DQUwsCi0JCQkJICAgICAgKGNvbnN0IHZvaWQgKikKLQkJCQkgICAgICBsY25waHlfaXFjYWxfbG9mdF9nYWlubGFkZGVyLAotCQkJCSAgICAgIEFSUkFZX1NJWkUobGNucGh5X2lxY2FsX2xvZnRfZ2FpbmxhZGRlciksCi0JCQkJICAgICAgMTYsIDApOwotCi0Jd2xjX2xjbnBoeV9jb21tb25fd3JpdGVfdGFibGUocGksIExDTlBIWV9UQkxfSURfSVFMT0NBTCwKLQkJCQkgICAgICAoY29uc3Qgdm9pZCAqKWxjbnBoeV9pcWNhbF9pcl9nYWlubGFkZGVyLAotCQkJCSAgICAgIEFSUkFZX1NJWkUobGNucGh5X2lxY2FsX2lyX2dhaW5sYWRkZXIpLCAxNiwKLQkJCQkgICAgICAzMik7Ci0KLQlpZiAocGktPnBoeV90eF90b25lX2ZyZXEpIHsKLQotCQl3bGNfbGNucGh5X3N0b3BfdHhfdG9uZShwaSk7Ci0JCXVkZWxheSg1KTsKLQkJd2xjX2xjbnBoeV9zdGFydF90eF90b25lKHBpLCAzNzUwLCA4OCwgMSk7Ci0JfSBlbHNlIHsKLQkJd2xjX2xjbnBoeV9zdGFydF90eF90b25lKHBpLCAzNzUwLCA4OCwgMSk7Ci0JfQotCi0Jd3JpdGVfcGh5X3JlZyhwaSwgMHg2ZGEsIDB4ZmZmZik7Ci0KLQlmb3IgKGkgPSBuX2NhbF9zdGFydDsgaSA8IG5fY2FsX2NtZHM7IGkrKykgewotCQl1MTYgemVyb19kaXEgPSAwOwotCQl1MTYgYmVzdF9jb2VmZnNbMTFdOwotCQl1MTYgY29tbWFuZF9udW07Ci0KLQkJY2FsX3R5cGUgPSAoY2FsX2NtZHNbaV0gJiAweDBmMDApID4+IDg7Ci0KLQkJY29tbWFuZF9udW0gPSBjb21tYW5kX251bXNbaV07Ci0JCWlmIChuY29ycl9vdmVycmlkZVtjYWxfdHlwZV0pCi0JCQljb21tYW5kX251bSA9Ci0JCQkgICAgbmNvcnJfb3ZlcnJpZGVbY2FsX3R5cGVdIDw8IDggfCAoY29tbWFuZF9udW0gJgotCQkJCQkJCSAgICAgMHhmZik7Ci0KLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg0NTIsIGNvbW1hbmRfbnVtKTsKLQotCQlpZiAoKGNhbF90eXBlID09IDMpIHx8IChjYWxfdHlwZSA9PSA0KSkgewotCi0JCQl3bGNfbGNucGh5X2NvbW1vbl9yZWFkX3RhYmxlKHBpLCBMQ05QSFlfVEJMX0lEX0lRTE9DQUwsCi0JCQkJCQkgICAgICZkaXFfc3RhcnQsIDEsIDE2LCA2OSk7Ci0KLQkJCXdsY19sY25waHlfY29tbW9uX3dyaXRlX3RhYmxlKHBpLCBMQ05QSFlfVEJMX0lEX0lRTE9DQUwsCi0JCQkJCQkgICAgICAmemVyb19kaXEsIDEsIDE2LCA2OSk7Ci0JCX0KLQotCQl3cml0ZV9waHlfcmVnKHBpLCAweDQ1MSwgY2FsX2NtZHNbaV0pOwotCi0JCWlmICghd2xjX2xjbnBoeV9pcWNhbF93YWl0KHBpKSkgewotCi0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQotCQl3bGNfbGNucGh5X2NvbW1vbl9yZWFkX3RhYmxlKHBpLCBMQ05QSFlfVEJMX0lEX0lRTE9DQUwsCi0JCQkJCSAgICAgYmVzdF9jb2VmZnMsCi0JCQkJCSAgICAgQVJSQVlfU0laRShiZXN0X2NvZWZmcyksIDE2LCA5Nik7Ci0JCXdsY19sY25waHlfY29tbW9uX3dyaXRlX3RhYmxlKHBpLCBMQ05QSFlfVEJMX0lEX0lRTE9DQUwsCi0JCQkJCSAgICAgIGJlc3RfY29lZmZzLAotCQkJCQkgICAgICBBUlJBWV9TSVpFKGJlc3RfY29lZmZzKSwgMTYsIDY0KTsKLQotCQlpZiAoKGNhbF90eXBlID09IDMpIHx8IChjYWxfdHlwZSA9PSA0KSkgewotCQkJd2xjX2xjbnBoeV9jb21tb25fd3JpdGVfdGFibGUocGksIExDTlBIWV9UQkxfSURfSVFMT0NBTCwKLQkJCQkJCSAgICAgICZkaXFfc3RhcnQsIDEsIDE2LCA2OSk7Ci0JCX0KLQkJd2xjX2xjbnBoeV9jb21tb25fcmVhZF90YWJsZShwaSwgTENOUEhZX1RCTF9JRF9JUUxPQ0FMLAotCQkJCQkgICAgIHBpX2xjbi0+bGNucGh5X2NhbF9yZXN1bHRzLgotCQkJCQkgICAgIHR4aXFsb2NhbF9iZXN0Y29lZmZzLAotCQkJCQkgICAgIEFSUkFZX1NJWkUocGlfbGNuLT4KLQkJCQkJCSAgICAgICBsY25waHlfY2FsX3Jlc3VsdHMuCi0JCQkJCQkgICAgICAgdHhpcWxvY2FsX2Jlc3Rjb2VmZnMpLAotCQkJCQkgICAgIDE2LCA5Nik7Ci0JfQotCi0Jd2xjX2xjbnBoeV9jb21tb25fcmVhZF90YWJsZShwaSwgTENOUEhZX1RCTF9JRF9JUUxPQ0FMLAotCQkJCSAgICAgcGlfbGNuLT5sY25waHlfY2FsX3Jlc3VsdHMuCi0JCQkJICAgICB0eGlxbG9jYWxfYmVzdGNvZWZmcywKLQkJCQkgICAgIEFSUkFZX1NJWkUocGlfbGNuLT5sY25waHlfY2FsX3Jlc3VsdHMuCi0JCQkJCSAgICAgICB0eGlxbG9jYWxfYmVzdGNvZWZmcyksIDE2LCA5Nik7Ci0JcGlfbGNuLT5sY25waHlfY2FsX3Jlc3VsdHMudHhpcWxvY2FsX2Jlc3Rjb2VmZnNfdmFsaWQgPSB0cnVlOwotCi0Jd2xjX2xjbnBoeV9jb21tb25fd3JpdGVfdGFibGUocGksIExDTlBIWV9UQkxfSURfSVFMT0NBTCwKLQkJCQkgICAgICAmcGlfbGNuLT5sY25waHlfY2FsX3Jlc3VsdHMuCi0JCQkJICAgICAgdHhpcWxvY2FsX2Jlc3Rjb2VmZnNbMF0sIDQsIDE2LCA4MCk7Ci0KLQl3bGNfbGNucGh5X2NvbW1vbl93cml0ZV90YWJsZShwaSwgTENOUEhZX1RCTF9JRF9JUUxPQ0FMLAotCQkJCSAgICAgICZwaV9sY24tPmxjbnBoeV9jYWxfcmVzdWx0cy4KLQkJCQkgICAgICB0eGlxbG9jYWxfYmVzdGNvZWZmc1s1XSwgMiwgMTYsIDg1KTsKLQotIGNsZWFudXA6Ci0Jd2xjX2xjbnBoeV90eF9pcWxvX2xvb3BiYWNrX2NsZWFudXAocGksIHZhbHVlc190b19zYXZlKTsKLQlrZnJlZSh2YWx1ZXNfdG9fc2F2ZSk7Ci0KLQlpZiAoIWtlZXBfdG9uZSkKLQkJd2xjX2xjbnBoeV9zdG9wX3R4X3RvbmUocGkpOwotCi0Jd3JpdGVfcGh5X3JlZyhwaSwgMHg0ZGIsIHNhdmVfdHhwd3JjdHJscmZjdHJsMik7Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCAweDQ1MywgMCk7Ci0KLQlpZiAodHhfZ2Fpbl9vdmVycmlkZV9vbGQpCi0JCXdsY19sY25waHlfc2V0X3R4X2dhaW4ocGksICZvbGRfZ2FpbnMpOwotCXdsY19sY25waHlfc2V0X3R4X3B3cl9jdHJsKHBpLCB0eF9wd3JfY3RybF9vbGQpOwotCi0Jd3JpdGVfcGh5X3JlZyhwaSwgMHg2ZGEsIHNhdmVfc3NscG5DYWxpYkNsa0VuQ3RybCk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHg2ZGIsIHNhdmVfc3NscG5SeEZlQ2xrRW5DdHJsKTsKLQotfQotCi1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X2lkbGVfdHNzaV9lc3Qoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBwaSkKLXsKLQlib29sIHN1c3BlbmQsIHR4X2dhaW5fb3ZlcnJpZGVfb2xkOwotCXN0cnVjdCBsY25waHlfdHhnYWlucyBvbGRfZ2FpbnM7Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwcGk7Ci0JdTE2IGlkbGVUc3NpLCBpZGxlVHNzaTBfMkMsIGlkbGVUc3NpMF9PQiwgaWRsZVRzc2kwX3JlZ3ZhbHVlX09CLAotCSAgICBpZGxlVHNzaTBfcmVndmFsdWVfMkM7Ci0JdTE2IFNBVkVfdHhwd3JjdHJsID0gd2xjX2xjbnBoeV9nZXRfdHhfcHdyX2N0cmwocGkpOwotCXUxNiBTQVZFX2xwZmdhaW4gPSByZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcxMTIpOwotCXUxNiBTQVZFX2p0YWdfYmJfYWZlX3N3aXRjaCA9Ci0JICAgIHJlYWRfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzAwNykgJiAxOwotCXUxNiBTQVZFX2p0YWdfYXV4cGdhID0gcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMEZGKSAmIDB4MTA7Ci0JdTE2IFNBVkVfaXFhZGNfYXV4X2VuID0gcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMTFGKSAmIDQ7Ci0JaWRsZVRzc2kgPSByZWFkX3BoeV9yZWcocGksIDB4NGFiKTsKLQlzdXNwZW5kID0KLQkgICAgKDAgPT0KLQkgICAgIChSX1JFRygmKChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBpKS0+cmVncy0+bWFjY29udHJvbCkgJgotCSAgICAgIE1DVExfRU5fTUFDKSk7Ci0JaWYgKCFzdXNwZW5kKQotCQl3bGFwaV9zdXNwZW5kX21hY19hbmRfd2FpdChwaS0+c2gtPnBoeXNoaW0pOwotCXdsY19sY25waHlfc2V0X3R4X3B3cl9jdHJsKHBpLCBMQ05QSFlfVFhfUFdSX0NUUkxfT0ZGKTsKLQotCXR4X2dhaW5fb3ZlcnJpZGVfb2xkID0gd2xjX2xjbnBoeV90eF9nYWluX292ZXJyaWRlX2VuYWJsZWQocGkpOwotCXdsY19sY25waHlfZ2V0X3R4X2dhaW4ocGksICZvbGRfZ2FpbnMpOwotCi0Jd2xjX2xjbnBoeV9lbmFibGVfdHhfZ2Fpbl9vdmVycmlkZShwaSk7Ci0Jd2xjX2xjbnBoeV9zZXRfdHhfcHdyX2J5X2luZGV4KHBpLCAxMjcpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcxMTIsIDB4Nik7Ci0JbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwMDcsIDB4MSwgMSk7Ci0JbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwRkYsIDB4MTAsIDEgPDwgNCk7Ci0JbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcxMUYsIDB4NCwgMSA8PCAyKTsKLQl3bGNfbGNucGh5X3Rzc2lfc2V0dXAocGkpOwotCXdsY19waHlfZG9fZHVtbXlfdHgocGksIHRydWUsIE9GRik7Ci0JaWRsZVRzc2kgPSAoKHJlYWRfcGh5X3JlZyhwaSwgMHg0YWIpICYgKDB4MWZmIDw8IDApKQotCQkgICAgPj4gMCk7Ci0KLQlpZGxlVHNzaTBfMkMgPSAoKHJlYWRfcGh5X3JlZyhwaSwgMHg2M2UpICYgKDB4MWZmIDw8IDApKQotCQkJPj4gMCk7Ci0KLQlpZiAoaWRsZVRzc2kwXzJDID49IDI1NikKLQkJaWRsZVRzc2kwX09CID0gaWRsZVRzc2kwXzJDIC0gMjU2OwotCWVsc2UKLQkJaWRsZVRzc2kwX09CID0gaWRsZVRzc2kwXzJDICsgMjU2OwotCi0JaWRsZVRzc2kwX3JlZ3ZhbHVlX09CID0gaWRsZVRzc2kwX09COwotCWlmIChpZGxlVHNzaTBfcmVndmFsdWVfT0IgPj0gMjU2KQotCQlpZGxlVHNzaTBfcmVndmFsdWVfMkMgPSBpZGxlVHNzaTBfcmVndmFsdWVfT0IgLSAyNTY7Ci0JZWxzZQotCQlpZGxlVHNzaTBfcmVndmFsdWVfMkMgPSBpZGxlVHNzaTBfcmVndmFsdWVfT0IgKyAyNTY7Ci0JbW9kX3BoeV9yZWcocGksIDB4NGE2LCAoMHgxZmYgPDwgMCksIChpZGxlVHNzaTBfcmVndmFsdWVfMkMpIDw8IDApOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NDRjLCAoMHgxIDw8IDEyKSwgKDApIDw8IDEyKTsKLQotCXdsY19sY25waHlfc2V0X3R4X2dhaW5fb3ZlcnJpZGUocGksIHR4X2dhaW5fb3ZlcnJpZGVfb2xkKTsKLQl3bGNfbGNucGh5X3NldF90eF9nYWluKHBpLCAmb2xkX2dhaW5zKTsKLQl3bGNfbGNucGh5X3NldF90eF9wd3JfY3RybChwaSwgU0FWRV90eHB3cmN0cmwpOwotCi0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzExMiwgU0FWRV9scGZnYWluKTsKLQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzAwNywgMHgxLCBTQVZFX2p0YWdfYmJfYWZlX3N3aXRjaCk7Ci0JbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwRkYsIDB4MTAsIFNBVkVfanRhZ19hdXhwZ2EpOwotCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMTFGLCAweDQsIFNBVkVfaXFhZGNfYXV4X2VuKTsKLQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzExMiwgMHg4MCwgMSA8PCA3KTsKLQlpZiAoIXN1c3BlbmQpCi0JCXdsYXBpX2VuYWJsZV9tYWMocGktPnNoLT5waHlzaGltKTsKLX0KLQotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV92YmF0X3RlbXBfc2Vuc2Vfc2V0dXAoc3RydWN0IGJyY21zX3BoeSAqcGksIHU4IG1vZGUpCi17Ci0JYm9vbCBzdXNwZW5kOwotCXUxNiBzYXZlX3R4cHdyQ3RybEVuOwotCXU4IGF1eHBnYV92bWlkY291cnNlLCBhdXhwZ2Ffdm1pZGZpbmUsIGF1eHBnYV9nYWluOwotCXUxNiBhdXhwZ2Ffdm1pZDsKLQlzdHJ1Y3QgcGh5dGJsX2luZm8gdGFiOwotCXUzMiB2YWw7Ci0JdTggc2F2ZV9yZWcwMDcsIHNhdmVfcmVnMEZGLCBzYXZlX3JlZzExRiwgc2F2ZV9yZWcwMDUsIHNhdmVfcmVnMDI1LAotCSAgICBzYXZlX3JlZzExMjsKLQl1MTYgdmFsdWVzX3RvX3NhdmVbMTRdOwotCXM4IGluZGV4OwotCWludCBpOwotCXN0cnVjdCBicmNtc19waHlfbGNucGh5ICpwaV9sY24gPSBwaS0+dS5waV9sY25waHk7Ci0JdWRlbGF5KDk5OSk7Ci0KLQlzYXZlX3JlZzAwNyA9ICh1OCkgcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDA3KTsKLQlzYXZlX3JlZzBGRiA9ICh1OCkgcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMEZGKTsKLQlzYXZlX3JlZzExRiA9ICh1OCkgcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMTFGKTsKLQlzYXZlX3JlZzAwNSA9ICh1OCkgcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDA1KTsKLQlzYXZlX3JlZzAyNSA9ICh1OCkgcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDI1KTsKLQlzYXZlX3JlZzExMiA9ICh1OCkgcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMTEyKTsKLQotCWZvciAoaSA9IDA7IGkgPCAxNDsgaSsrKQotCQl2YWx1ZXNfdG9fc2F2ZVtpXSA9IHJlYWRfcGh5X3JlZyhwaSwgdGVtcHNlbnNlX3BoeV9yZWdzW2ldKTsKLQlzdXNwZW5kID0KLQkgICAgKDAgPT0gKFJfUkVHKCZwaS0+cmVncy0+bWFjY29udHJvbCkgJiBNQ1RMX0VOX01BQykpOwotCWlmICghc3VzcGVuZCkKLQkJd2xhcGlfc3VzcGVuZF9tYWNfYW5kX3dhaXQocGktPnNoLT5waHlzaGltKTsKLQlzYXZlX3R4cHdyQ3RybEVuID0gcmVhZF9yYWRpb19yZWcocGksIDB4NGE0KTsKLQotCXdsY19sY25waHlfc2V0X3R4X3B3cl9jdHJsKHBpLCBMQ05QSFlfVFhfUFdSX0NUUkxfT0ZGKTsKLQlpbmRleCA9IHBpX2xjbi0+bGNucGh5X2N1cnJlbnRfaW5kZXg7Ci0Jd2xjX2xjbnBoeV9zZXRfdHhfcHdyX2J5X2luZGV4KHBpLCAxMjcpOwotCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDA3LCAweDEsIDB4MSk7Ci0JbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwRkYsIDB4MTAsIDB4MSA8PCA0KTsKLQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzExRiwgMHg0LCAweDEgPDwgMik7Ci0JbW9kX3BoeV9yZWcocGksIDB4NTAzLCAoMHgxIDw8IDApLCAoMCkgPDwgMCk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg1MDMsICgweDEgPDwgMiksICgwKSA8PCAyKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRhNCwgKDB4MSA8PCAxNCksICgwKSA8PCAxNCk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0YTQsICgweDEgPDwgMTUpLCAoMCkgPDwgMTUpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NGQwLCAoMHgxIDw8IDUpLCAoMCkgPDwgNSk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0YTUsICgweGZmIDw8IDApLCAoMjU1KSA8PCAwKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRhNSwgKDB4NyA8PCAxMiksICg1KSA8PCAxMik7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0YTUsICgweDcgPDwgOCksICgwKSA8PCA4KTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDQwZCwgKDB4ZmYgPDwgMCksICg2NCkgPDwgMCk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0MGQsICgweDcgPDwgOCksICg2KSA8PCA4KTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRhMiwgKDB4ZmYgPDwgMCksICg2NCkgPDwgMCk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0YTIsICgweDcgPDwgOCksICg2KSA8PCA4KTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRkOSwgKDB4NyA8PCA0KSwgKDIpIDw8IDQpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NGQ5LCAoMHg3IDw8IDgpLCAoMykgPDwgOCk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0ZDksICgweDcgPDwgMTIpLCAoMSkgPDwgMTIpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NGRhLCAoMHgxIDw8IDEyKSwgKDApIDw8IDEyKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRkYSwgKDB4MSA8PCAxMyksICgxKSA8PCAxMyk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0YTYsICgweDEgPDwgMTUpLCAoMSkgPDwgMTUpOwotCi0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzAyNSwgMHhDKTsKLQotCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDA1LCAweDgsIDB4MSA8PCAzKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDkzOCwgKDB4MSA8PCAyKSwgKDEpIDw8IDIpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4OTM5LCAoMHgxIDw8IDIpLCAoMSkgPDwgMik7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0YTQsICgweDEgPDwgMTIpLCAoMSkgPDwgMTIpOwotCi0JdmFsID0gd2xjX2xjbnBoeV9yZnNlcV90YmxfYWRjX3B3cnVwKHBpKTsKLQl0YWIudGJsX2lkID0gTENOUEhZX1RCTF9JRF9SRlNFUTsKLQl0YWIudGJsX3dpZHRoID0gMTY7Ci0JdGFiLnRibF9sZW4gPSAxOwotCXRhYi50YmxfcHRyID0gJnZhbDsKLQl0YWIudGJsX29mZnNldCA9IDY7Ci0Jd2xjX2xjbnBoeV93cml0ZV90YWJsZShwaSwgJnRhYik7Ci0JaWYgKG1vZGUgPT0gVEVNUFNFTlNFKSB7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDRkNywgKDB4MSA8PCAzKSwgKDEpIDw8IDMpOwotCi0JCW1vZF9waHlfcmVnKHBpLCAweDRkNywgKDB4NyA8PCAxMiksICgxKSA8PCAxMik7Ci0KLQkJYXV4cGdhX3ZtaWRjb3Vyc2UgPSA4OwotCQlhdXhwZ2Ffdm1pZGZpbmUgPSAweDQ7Ci0JCWF1eHBnYV9nYWluID0gMjsKLQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwODIsIDB4MjAsIDEgPDwgNSk7Ci0JfSBlbHNlIHsKLQkJbW9kX3BoeV9yZWcocGksIDB4NGQ3LCAoMHgxIDw8IDMpLCAoMSkgPDwgMyk7Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4NGQ3LCAoMHg3IDw8IDEyKSwgKDMpIDw8IDEyKTsKLQotCQlhdXhwZ2Ffdm1pZGNvdXJzZSA9IDc7Ci0JCWF1eHBnYV92bWlkZmluZSA9IDB4YTsKLQkJYXV4cGdhX2dhaW4gPSAyOwotCX0KLQlhdXhwZ2Ffdm1pZCA9Ci0JICAgICh1MTYpICgoMiA8PCA4KSB8IChhdXhwZ2Ffdm1pZGNvdXJzZSA8PCA0KSB8IGF1eHBnYV92bWlkZmluZSk7Ci0JbW9kX3BoeV9yZWcocGksIDB4NGQ4LCAoMHgxIDw8IDApLCAoMSkgPDwgMCk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0ZDgsICgweDNmZiA8PCAyKSwgKGF1eHBnYV92bWlkKSA8PCAyKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRkOCwgKDB4MSA8PCAxKSwgKDEpIDw8IDEpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NGQ4LCAoMHg3IDw8IDEyKSwgKGF1eHBnYV9nYWluKSA8PCAxMik7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0ZDAsICgweDEgPDwgNSksICgxKSA8PCA1KTsKLQotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcxMTIsIDB4Nik7Ci0KLQl3bGNfcGh5X2RvX2R1bW15X3R4KHBpLCB0cnVlLCBPRkYpOwotCWlmICghdGVtcHNlbnNlX2RvbmUocGkpKQotCQl1ZGVsYXkoMTApOwotCi0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzAwNywgKHUxNikgc2F2ZV9yZWcwMDcpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwRkYsICh1MTYpIHNhdmVfcmVnMEZGKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMTFGLCAodTE2KSBzYXZlX3JlZzExRik7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzAwNSwgKHUxNikgc2F2ZV9yZWcwMDUpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwMjUsICh1MTYpIHNhdmVfcmVnMDI1KTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMTEyLCAodTE2KSBzYXZlX3JlZzExMik7Ci0JZm9yIChpID0gMDsgaSA8IDE0OyBpKyspCi0JCXdyaXRlX3BoeV9yZWcocGksIHRlbXBzZW5zZV9waHlfcmVnc1tpXSwgdmFsdWVzX3RvX3NhdmVbaV0pOwotCXdsY19sY25waHlfc2V0X3R4X3B3cl9ieV9pbmRleChwaSwgKGludClpbmRleCk7Ci0KLQl3cml0ZV9yYWRpb19yZWcocGksIDB4NGE0LCBzYXZlX3R4cHdyQ3RybEVuKTsKLQlpZiAoIXN1c3BlbmQpCi0JCXdsYXBpX2VuYWJsZV9tYWMocGktPnNoLT5waHlzaGltKTsKLQl1ZGVsYXkoOTk5KTsKLX0KLQotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV90eF9wd3JfY3RybF9pbml0KHN0cnVjdCBicmNtc19waHlfcHViICpwcGkpCi17Ci0Jc3RydWN0IGxjbnBoeV90eGdhaW5zIHR4X2dhaW5zOwotCXU4IGJibXVsdDsKLQlzdHJ1Y3QgcGh5dGJsX2luZm8gdGFiOwotCXMzMiBhMSwgYjAsIGIxOwotCXMzMiB0c3NpLCBwd3IsIG1heHRhcmdldHB3ciwgbWludGFyZ2V0cHdyOwotCWJvb2wgc3VzcGVuZDsKLQlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBwaTsKLQotCXN1c3BlbmQgPQotCSAgICAoMCA9PSAoUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKSAmIE1DVExfRU5fTUFDKSk7Ci0JaWYgKCFzdXNwZW5kKQotCQl3bGFwaV9zdXNwZW5kX21hY19hbmRfd2FpdChwaS0+c2gtPnBoeXNoaW0pOwotCi0JaWYgKE5PUkFESU9fRU5BQihwaS0+cHVicGkpKSB7Ci0JCXdsY19sY25waHlfc2V0X2JibXVsdChwaSwgMHgzMCk7Ci0JCWlmICghc3VzcGVuZCkKLQkJCXdsYXBpX2VuYWJsZV9tYWMocGktPnNoLT5waHlzaGltKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghcGktPmh3cHdyY3RybF9jYXBhYmxlKSB7Ci0JCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQl0eF9nYWlucy5nbV9nYWluID0gNDsKLQkJCXR4X2dhaW5zLnBnYV9nYWluID0gMTI7Ci0JCQl0eF9nYWlucy5wYWRfZ2FpbiA9IDEyOwotCQkJdHhfZ2FpbnMuZGFjX2dhaW4gPSAwOwotCi0JCQliYm11bHQgPSAxNTA7Ci0JCX0gZWxzZSB7Ci0JCQl0eF9nYWlucy5nbV9nYWluID0gNzsKLQkJCXR4X2dhaW5zLnBnYV9nYWluID0gMTU7Ci0JCQl0eF9nYWlucy5wYWRfZ2FpbiA9IDE0OwotCQkJdHhfZ2FpbnMuZGFjX2dhaW4gPSAwOwotCi0JCQliYm11bHQgPSAxNTA7Ci0JCX0KLQkJd2xjX2xjbnBoeV9zZXRfdHhfZ2FpbihwaSwgJnR4X2dhaW5zKTsKLQkJd2xjX2xjbnBoeV9zZXRfYmJtdWx0KHBpLCBiYm11bHQpOwotCQl3bGNfbGNucGh5X3ZiYXRfdGVtcF9zZW5zZV9zZXR1cChwaSwgVEVNUFNFTlNFKTsKLQl9IGVsc2UgewotCi0JCXdsY19sY25waHlfaWRsZV90c3NpX2VzdChwcGkpOwotCi0JCXdsY19sY25waHlfY2xlYXJfdHhfcG93ZXJfb2Zmc2V0cyhwaSk7Ci0KLQkJYjAgPSBwaS0+dHhwYV8yZ1swXTsKLQkJYjEgPSBwaS0+dHhwYV8yZ1sxXTsKLQkJYTEgPSBwaS0+dHhwYV8yZ1syXTsKLQkJbWF4dGFyZ2V0cHdyID0gd2xjX2xjbnBoeV90c3NpMmRibSgxMCwgYTEsIGIwLCBiMSk7Ci0JCW1pbnRhcmdldHB3ciA9IHdsY19sY25waHlfdHNzaTJkYm0oMTI1LCBhMSwgYjAsIGIxKTsKLQotCQl0YWIudGJsX2lkID0gTENOUEhZX1RCTF9JRF9UWFBXUkNUTDsKLQkJdGFiLnRibF93aWR0aCA9IDMyOwotCQl0YWIudGJsX3B0ciA9ICZwd3I7Ci0JCXRhYi50YmxfbGVuID0gMTsKLQkJdGFiLnRibF9vZmZzZXQgPSAwOwotCQlmb3IgKHRzc2kgPSAwOyB0c3NpIDwgMTI4OyB0c3NpKyspIHsKLQkJCXB3ciA9IHdsY19sY25waHlfdHNzaTJkYm0odHNzaSwgYTEsIGIwLCBiMSk7Ci0KLQkJCXB3ciA9IChwd3IgPCBtaW50YXJnZXRwd3IpID8gbWludGFyZ2V0cHdyIDogcHdyOwotCQkJd2xjX2xjbnBoeV93cml0ZV90YWJsZShwaSwgJnRhYik7Ci0JCQl0YWIudGJsX29mZnNldCsrOwotCQl9Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4NDEwLCAoMHgxIDw8IDcpLCAoMCkgPDwgNyk7Ci0KLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg0YTgsIDEwKTsKLQotCQl3bGNfbGNucGh5X3NldF90YXJnZXRfdHhfcHdyKHBpLCBMQ05fVEFSR0VUX1BXUik7Ci0KLQkJd2xjX2xjbnBoeV9zZXRfdHhfcHdyX2N0cmwocGksIExDTlBIWV9UWF9QV1JfQ1RSTF9IVyk7Ci0JfQotCWlmICghc3VzcGVuZCkKLQkJd2xhcGlfZW5hYmxlX21hYyhwaS0+c2gtPnBoeXNoaW0pOwotfQotCi1zdGF0aWMgdTggd2xjX2xjbnBoeV9nZXRfYmJtdWx0KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXUxNiBtMG0xOwotCXN0cnVjdCBwaHl0YmxfaW5mbyB0YWI7Ci0KLQl0YWIudGJsX3B0ciA9ICZtMG0xOwotCXRhYi50YmxfbGVuID0gMTsKLQl0YWIudGJsX2lkID0gTENOUEhZX1RCTF9JRF9JUUxPQ0FMOwotCXRhYi50Ymxfb2Zmc2V0ID0gODc7Ci0JdGFiLnRibF93aWR0aCA9IDE2OwotCXdsY19sY25waHlfcmVhZF90YWJsZShwaSwgJnRhYik7Ci0KLQlyZXR1cm4gKHU4KSAoKG0wbTEgJiAweGZmMDApID4+IDgpOwotfQotCi1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X3NldF9wYV9nYWluKHN0cnVjdCBicmNtc19waHkgKnBpLCB1MTYgZ2FpbikKLXsKLQltb2RfcGh5X3JlZyhwaSwgMHg0ZmIsCi0JCSAgICBMQ05QSFlfdHhnYWluY3RybG92cnZhbDFfcGFnYWluX292cl92YWwxX01BU0ssCi0JCSAgICBnYWluIDw8IExDTlBIWV90eGdhaW5jdHJsb3ZydmFsMV9wYWdhaW5fb3ZyX3ZhbDFfU0hJRlQpOwotCW1vZF9waHlfcmVnKHBpLCAweDRmZCwKLQkJICAgIExDTlBIWV9zdHh0eGdhaW5jdHJsb3ZydmFsMV9wYWdhaW5fb3ZyX3ZhbDFfTUFTSywKLQkJICAgIGdhaW4gPDwgTENOUEhZX3N0eHR4Z2FpbmN0cmxvdnJ2YWwxX3BhZ2Fpbl9vdnJfdmFsMV9TSElGVCk7Ci19Ci0KLXZvaWQKLXdsY19sY25waHlfZ2V0X3JhZGlvX2xvZnQoc3RydWN0IGJyY21zX3BoeSAqcGksCi0JCQkgIHU4ICplaTAsIHU4ICplcTAsIHU4ICpmaTAsIHU4ICpmcTApCi17Ci0JKmVpMCA9IExDTlBIWV9JUUxPQ0NfUkVBRChyZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwODkpKTsKLQkqZXEwID0gTENOUEhZX0lRTE9DQ19SRUFEKHJlYWRfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzA4QSkpOwotCSpmaTAgPSBMQ05QSFlfSVFMT0NDX1JFQUQocmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDhCKSk7Ci0JKmZxMCA9IExDTlBIWV9JUUxPQ0NfUkVBRChyZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwOEMpKTsKLX0KLQotc3RhdGljIHZvaWQKLXdsY19sY25waHlfZ2V0X3R4X2dhaW4oc3RydWN0IGJyY21zX3BoeSAqcGksIHN0cnVjdCBsY25waHlfdHhnYWlucyAqZ2FpbnMpCi17Ci0JdTE2IGRhY19nYWluOwotCi0JZGFjX2dhaW4gPSByZWFkX3BoeV9yZWcocGksIDB4NDM5KSA+PiAwOwotCWdhaW5zLT5kYWNfZ2FpbiA9IChkYWNfZ2FpbiAmIDB4MzgwKSA+PiA3OwotCi0JewotCQl1MTYgcmZnYWluMCwgcmZnYWluMTsKLQotCQlyZmdhaW4wID0gKHJlYWRfcGh5X3JlZyhwaSwgMHg0YjUpICYgKDB4ZmZmZiA8PCAwKSkgPj4gMDsKLQkJcmZnYWluMSA9IChyZWFkX3BoeV9yZWcocGksIDB4NGZiKSAmICgweDdmZmYgPDwgMCkpID4+IDA7Ci0KLQkJZ2FpbnMtPmdtX2dhaW4gPSByZmdhaW4wICYgMHhmZjsKLQkJZ2FpbnMtPnBnYV9nYWluID0gKHJmZ2FpbjAgPj4gOCkgJiAweGZmOwotCQlnYWlucy0+cGFkX2dhaW4gPSByZmdhaW4xICYgMHhmZjsKLQl9Ci19Ci0KLXZvaWQgd2xjX2xjbnBoeV9zZXRfdHhfaXFjYyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTE2IGEsIHUxNiBiKQotewotCXN0cnVjdCBwaHl0YmxfaW5mbyB0YWI7Ci0JdTE2IGlxY2NbMl07Ci0KLQlpcWNjWzBdID0gYTsKLQlpcWNjWzFdID0gYjsKLQotCXRhYi50YmxfaWQgPSBMQ05QSFlfVEJMX0lEX0lRTE9DQUw7Ci0JdGFiLnRibF93aWR0aCA9IDE2OwotCXRhYi50YmxfcHRyID0gaXFjYzsKLQl0YWIudGJsX2xlbiA9IDI7Ci0JdGFiLnRibF9vZmZzZXQgPSA4MDsKLQl3bGNfbGNucGh5X3dyaXRlX3RhYmxlKHBpLCAmdGFiKTsKLX0KLQotdm9pZCB3bGNfbGNucGh5X3NldF90eF9sb2NjKHN0cnVjdCBicmNtc19waHkgKnBpLCB1MTYgZGlkcSkKLXsKLQlzdHJ1Y3QgcGh5dGJsX2luZm8gdGFiOwotCi0JdGFiLnRibF9pZCA9IExDTlBIWV9UQkxfSURfSVFMT0NBTDsKLQl0YWIudGJsX3dpZHRoID0gMTY7Ci0JdGFiLnRibF9wdHIgPSAmZGlkcTsKLQl0YWIudGJsX2xlbiA9IDE7Ci0JdGFiLnRibF9vZmZzZXQgPSA4NTsKLQl3bGNfbGNucGh5X3dyaXRlX3RhYmxlKHBpLCAmdGFiKTsKLX0KLQotdm9pZCB3bGNfbGNucGh5X3NldF90eF9wd3JfYnlfaW5kZXgoc3RydWN0IGJyY21zX3BoeSAqcGksIGludCBpbmRleCkKLXsKLQlzdHJ1Y3QgcGh5dGJsX2luZm8gdGFiOwotCXUxNiBhLCBiOwotCXU4IGJiX211bHQ7Ci0JdTMyIGJibXVsdGlxY29tcCwgdHhnYWluLCBsb2NvZWZmcywgcmZwb3dlcjsKLQlzdHJ1Y3QgbGNucGh5X3R4Z2FpbnMgZ2FpbnM7Ci0Jc3RydWN0IGJyY21zX3BoeV9sY25waHkgKnBpX2xjbiA9IHBpLT51LnBpX2xjbnBoeTsKLQotCXBpX2xjbi0+bGNucGh5X3R4X3Bvd2VyX2lkeF9vdmVycmlkZSA9IChzOCkgaW5kZXg7Ci0JcGlfbGNuLT5sY25waHlfY3VycmVudF9pbmRleCA9ICh1OCkgaW5kZXg7Ci0KLQl0YWIudGJsX2lkID0gTENOUEhZX1RCTF9JRF9UWFBXUkNUTDsKLQl0YWIudGJsX3dpZHRoID0gMzI7Ci0JdGFiLnRibF9sZW4gPSAxOwotCi0Jd2xjX2xjbnBoeV9zZXRfdHhfcHdyX2N0cmwocGksIExDTlBIWV9UWF9QV1JfQ1RSTF9PRkYpOwotCi0JdGFiLnRibF9vZmZzZXQgPSBMQ05QSFlfVFhfUFdSX0NUUkxfSVFfT0ZGU0VUICsgaW5kZXg7Ci0JdGFiLnRibF9wdHIgPSAmYmJtdWx0aXFjb21wOwotCXdsY19sY25waHlfcmVhZF90YWJsZShwaSwgJnRhYik7Ci0KLQl0YWIudGJsX29mZnNldCA9IExDTlBIWV9UWF9QV1JfQ1RSTF9HQUlOX09GRlNFVCArIGluZGV4OwotCXRhYi50Ymxfd2lkdGggPSAzMjsKLQl0YWIudGJsX3B0ciA9ICZ0eGdhaW47Ci0Jd2xjX2xjbnBoeV9yZWFkX3RhYmxlKHBpLCAmdGFiKTsKLQotCWdhaW5zLmdtX2dhaW4gPSAodTE2KSAodHhnYWluICYgMHhmZik7Ci0JZ2FpbnMucGdhX2dhaW4gPSAodTE2KSAodHhnYWluID4+IDgpICYgMHhmZjsKLQlnYWlucy5wYWRfZ2FpbiA9ICh1MTYpICh0eGdhaW4gPj4gMTYpICYgMHhmZjsKLQlnYWlucy5kYWNfZ2FpbiA9ICh1MTYpIChiYm11bHRpcWNvbXAgPj4gMjgpICYgMHgwNzsKLQl3bGNfbGNucGh5X3NldF90eF9nYWluKHBpLCAmZ2FpbnMpOwotCXdsY19sY25waHlfc2V0X3BhX2dhaW4ocGksICh1MTYpICh0eGdhaW4gPj4gMjQpICYgMHg3Zik7Ci0KLQliYl9tdWx0ID0gKHU4KSAoKGJibXVsdGlxY29tcCA+PiAyMCkgJiAweGZmKTsKLQl3bGNfbGNucGh5X3NldF9iYm11bHQocGksIGJiX211bHQpOwotCi0Jd2xjX2xjbnBoeV9lbmFibGVfdHhfZ2Fpbl9vdmVycmlkZShwaSk7Ci0KLQlpZiAoIXdsY19sY25waHlfdGVtcHNlbnNlX2Jhc2VkX3B3cl9jdHJsX2VuYWJsZWQocGkpKSB7Ci0KLQkJYSA9ICh1MTYpICgoYmJtdWx0aXFjb21wID4+IDEwKSAmIDB4M2ZmKTsKLQkJYiA9ICh1MTYpIChiYm11bHRpcWNvbXAgJiAweDNmZik7Ci0JCXdsY19sY25waHlfc2V0X3R4X2lxY2MocGksIGEsIGIpOwotCi0JCXRhYi50Ymxfb2Zmc2V0ID0gTENOUEhZX1RYX1BXUl9DVFJMX0xPX09GRlNFVCArIGluZGV4OwotCQl0YWIudGJsX3B0ciA9ICZsb2NvZWZmczsKLQkJd2xjX2xjbnBoeV9yZWFkX3RhYmxlKHBpLCAmdGFiKTsKLQotCQl3bGNfbGNucGh5X3NldF90eF9sb2NjKHBpLCAodTE2KSBsb2NvZWZmcyk7Ci0KLQkJdGFiLnRibF9vZmZzZXQgPSBMQ05QSFlfVFhfUFdSX0NUUkxfUFdSX09GRlNFVCArIGluZGV4OwotCQl0YWIudGJsX3B0ciA9ICZyZnBvd2VyOwotCQl3bGNfbGNucGh5X3JlYWRfdGFibGUocGksICZ0YWIpOwotCQltb2RfcGh5X3JlZyhwaSwgMHg2YTYsICgweDFmZmYgPDwgMCksIChyZnBvd2VyICogOCkgPDwgMCk7Ci0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHdsY19sY25waHlfc2V0X3Ryc3dfb3ZlcnJpZGUoc3RydWN0IGJyY21zX3BoeSAqcGksIGJvb2wgdHgsIGJvb2wgcngpCi17Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0NGQsCi0JCSAgICAoMHgxIDw8IDEpIHwKLQkJICAgICgweDEgPDwgMCksICh0eCA/ICgweDEgPDwgMSkgOiAwKSB8IChyeCA/ICgweDEgPDwgMCkgOiAwKSk7Ci0KLQlvcl9waHlfcmVnKHBpLCAweDQ0YywgKDB4MSA8PCAxKSB8ICgweDEgPDwgMCkpOwotfQotCi1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X2NsZWFyX3BhcGRfY29tcHRhYmxlKHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXUzMiBqOwotCXN0cnVjdCBwaHl0YmxfaW5mbyB0YWI7Ci0JdTMyIHRlbXBfb2Zmc2V0WzEyOF07Ci0JdGFiLnRibF9wdHIgPSB0ZW1wX29mZnNldDsKLQl0YWIudGJsX2xlbiA9IDEyODsKLQl0YWIudGJsX2lkID0gTENOUEhZX1RCTF9JRF9QQVBEQ09NUERFTFRBVEJMOwotCXRhYi50Ymxfd2lkdGggPSAzMjsKLQl0YWIudGJsX29mZnNldCA9IDA7Ci0KLQltZW1zZXQodGVtcF9vZmZzZXQsIDAsIHNpemVvZih0ZW1wX29mZnNldCkpOwotCWZvciAoaiA9IDE7IGogPCAxMjg7IGogKz0gMikKLQkJdGVtcF9vZmZzZXRbal0gPSAweDgwMDAwOwotCi0Jd2xjX2xjbnBoeV93cml0ZV90YWJsZShwaSwgJnRhYik7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZAotd2xjX2xjbnBoeV9zZXRfcnhfZ2Fpbl9ieV9kaXN0cmlidXRpb24oc3RydWN0IGJyY21zX3BoeSAqcGksCi0JCQkJICAgICAgIHUxNiB0cnN3LAotCQkJCSAgICAgICB1MTYgZXh0X2xuYSwKLQkJCQkgICAgICAgdTE2IGJpcTIsCi0JCQkJICAgICAgIHUxNiBiaXExLAotCQkJCSAgICAgICB1MTYgdGlhLCB1MTYgbG5hMiwgdTE2IGxuYTEpCi17Ci0JdTE2IGdhaW4wXzE1LCBnYWluMTZfMTk7Ci0KLQlnYWluMTZfMTkgPSBiaXEyICYgMHhmOwotCWdhaW4wXzE1ID0gKChiaXExICYgMHhmKSA8PCAxMikgfAotCSAgICAoKHRpYSAmIDB4ZikgPDwgOCkgfAotCSAgICAoKGxuYTIgJiAweDMpIDw8IDYpIHwKLQkgICAgKChsbmEyICYgMHgzKSA8PCA0KSB8ICgobG5hMSAmIDB4MykgPDwgMikgfCAoKGxuYTEgJiAweDMpIDw8IDApOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NGI2LCAoMHhmZmZmIDw8IDApLCBnYWluMF8xNSA8PCAwKTsKLQltb2RfcGh5X3JlZyhwaSwgMHg0YjcsICgweGYgPDwgMCksIGdhaW4xNl8xOSA8PCAwKTsKLQltb2RfcGh5X3JlZyhwaSwgMHg0YjEsICgweDMgPDwgMTEpLCBsbmExIDw8IDExKTsKLQotCWlmIChMQ05SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDIpKSB7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDRiMSwgKDB4MSA8PCA5KSwgZXh0X2xuYSA8PCA5KTsKLQkJbW9kX3BoeV9yZWcocGksIDB4NGIxLCAoMHgxIDw8IDEwKSwgZXh0X2xuYSA8PCAxMCk7Ci0JfSBlbHNlIHsKLQkJbW9kX3BoeV9yZWcocGksIDB4NGIxLCAoMHgxIDw8IDEwKSwgMCA8PCAxMCk7Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4NGIxLCAoMHgxIDw8IDE1KSwgMCA8PCAxNSk7Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4NGIxLCAoMHgxIDw8IDkpLCBleHRfbG5hIDw8IDkpOwotCX0KLQotCW1vZF9waHlfcmVnKHBpLCAweDQ0ZCwgKDB4MSA8PCAwKSwgKCF0cnN3KSA8PCAwKTsKLQotfQotCi1zdGF0aWMgdm9pZAotd2xjX2xjbnBoeV9yeF9nYWluX292ZXJyaWRlX2VuYWJsZShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgYm9vbCBlbmFibGUpCi17Ci0JdTE2IGViaXQgPSBlbmFibGUgPyAxIDogMDsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRiMCwgKDB4MSA8PCA4KSwgZWJpdCA8PCA4KTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDQ0YywgKDB4MSA8PCAwKSwgZWJpdCA8PCAwKTsKLQotCWlmIChMQ05SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDIpKSB7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDQ0YywgKDB4MSA8PCA0KSwgZWJpdCA8PCA0KTsKLQkJbW9kX3BoeV9yZWcocGksIDB4NDRjLCAoMHgxIDw8IDYpLCBlYml0IDw8IDYpOwotCQltb2RfcGh5X3JlZyhwaSwgMHg0YjAsICgweDEgPDwgNSksIGViaXQgPDwgNSk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDRiMCwgKDB4MSA8PCA2KSwgZWJpdCA8PCA2KTsKLQl9IGVsc2UgewotCQltb2RfcGh5X3JlZyhwaSwgMHg0YjAsICgweDEgPDwgMTIpLCBlYml0IDw8IDEyKTsKLQkJbW9kX3BoeV9yZWcocGksIDB4NGIwLCAoMHgxIDw8IDEzKSwgZWJpdCA8PCAxMyk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDRiMCwgKDB4MSA8PCA1KSwgZWJpdCA8PCA1KTsKLQl9Ci0KLQlpZiAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQltb2RfcGh5X3JlZyhwaSwgMHg0YjAsICgweDEgPDwgMTApLCBlYml0IDw8IDEwKTsKLQkJbW9kX3BoeV9yZWcocGksIDB4NGU1LCAoMHgxIDw8IDMpLCBlYml0IDw8IDMpOwotCX0KLX0KLQotdm9pZCB3bGNfbGNucGh5X3R4X3B1KHN0cnVjdCBicmNtc19waHkgKnBpLCBib29sIGJFbmFibGUpCi17Ci0JaWYgKCFiRW5hYmxlKSB7Ci0KLQkJYW5kX3BoeV9yZWcocGksIDB4NDNiLCB+KHUxNikgKCgweDEgPDwgMSkgfCAoMHgxIDw8IDQpKSk7Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4NDNjLCAoMHgxIDw8IDEpLCAxIDw8IDEpOwotCi0JCWFuZF9waHlfcmVnKHBpLCAweDQ0YywKLQkJCSAgICB+KHUxNikgKCgweDEgPDwgMykgfAotCQkJCSAgICAgICAoMHgxIDw8IDUpIHwKLQkJCQkgICAgICAgKDB4MSA8PCAxMikgfAotCQkJCSAgICAgICAoMHgxIDw8IDApIHwgKDB4MSA8PCAxKSB8ICgweDEgPDwgMikpKTsKLQotCQlhbmRfcGh5X3JlZyhwaSwgMHg0NGQsCi0JCQkgICAgfih1MTYpICgoMHgxIDw8IDMpIHwgKDB4MSA8PCA1KSB8ICgweDEgPDwgMTQpKSk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDQ0ZCwgKDB4MSA8PCAyKSwgMSA8PCAyKTsKLQotCQltb2RfcGh5X3JlZyhwaSwgMHg0NGQsICgweDEgPDwgMSkgfCAoMHgxIDw8IDApLCAoMHgxIDw8IDApKTsKLQotCQlhbmRfcGh5X3JlZyhwaSwgMHg0ZjksCi0JCQkgICAgfih1MTYpICgoMHgxIDw8IDApIHwgKDB4MSA8PCAxKSB8ICgweDEgPDwgMikpKTsKLQotCQlhbmRfcGh5X3JlZyhwaSwgMHg0ZmEsCi0JCQkgICAgfih1MTYpICgoMHgxIDw8IDApIHwgKDB4MSA8PCAxKSB8ICgweDEgPDwgMikpKTsKLQl9IGVsc2UgewotCi0JCW1vZF9waHlfcmVnKHBpLCAweDQzYiwgKDB4MSA8PCAxKSwgMSA8PCAxKTsKLQkJbW9kX3BoeV9yZWcocGksIDB4NDNjLCAoMHgxIDw8IDEpLCAwIDw8IDEpOwotCi0JCW1vZF9waHlfcmVnKHBpLCAweDQzYiwgKDB4MSA8PCA0KSwgMSA8PCA0KTsKLQkJbW9kX3BoeV9yZWcocGksIDB4NDNjLCAoMHgxIDw8IDYpLCAwIDw8IDYpOwotCi0JCW1vZF9waHlfcmVnKHBpLCAweDQ0YywgKDB4MSA8PCAxMiksIDEgPDwgMTIpOwotCQltb2RfcGh5X3JlZyhwaSwgMHg0NGQsICgweDEgPDwgMTQpLCAxIDw8IDE0KTsKLQotCQl3bGNfbGNucGh5X3NldF90cnN3X292ZXJyaWRlKHBpLCB0cnVlLCBmYWxzZSk7Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4NDRkLCAoMHgxIDw8IDIpLCAwIDw8IDIpOwotCQltb2RfcGh5X3JlZyhwaSwgMHg0NGMsICgweDEgPDwgMiksIDEgPDwgMik7Ci0KLQkJaWYgKENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQotCQkJbW9kX3BoeV9yZWcocGksIDB4NDRjLCAoMHgxIDw8IDMpLCAxIDw8IDMpOwotCQkJbW9kX3BoeV9yZWcocGksIDB4NDRkLCAoMHgxIDw8IDMpLCAxIDw8IDMpOwotCi0JCQltb2RfcGh5X3JlZyhwaSwgMHg0NGMsICgweDEgPDwgNSksIDEgPDwgNSk7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHg0NGQsICgweDEgPDwgNSksIDAgPDwgNSk7Ci0KLQkJCW1vZF9waHlfcmVnKHBpLCAweDRmOSwgKDB4MSA8PCAxKSwgMSA8PCAxKTsKLQkJCW1vZF9waHlfcmVnKHBpLCAweDRmYSwgKDB4MSA8PCAxKSwgMSA8PCAxKTsKLQotCQkJbW9kX3BoeV9yZWcocGksIDB4NGY5LCAoMHgxIDw8IDIpLCAxIDw8IDIpOwotCQkJbW9kX3BoeV9yZWcocGksIDB4NGZhLCAoMHgxIDw8IDIpLCAxIDw8IDIpOwotCi0JCQltb2RfcGh5X3JlZyhwaSwgMHg0ZjksICgweDEgPDwgMCksIDEgPDwgMCk7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHg0ZmEsICgweDEgPDwgMCksIDEgPDwgMCk7Ci0JCX0gZWxzZSB7Ci0KLQkJCW1vZF9waHlfcmVnKHBpLCAweDQ0YywgKDB4MSA8PCAzKSwgMSA8PCAzKTsKLQkJCW1vZF9waHlfcmVnKHBpLCAweDQ0ZCwgKDB4MSA8PCAzKSwgMCA8PCAzKTsKLQotCQkJbW9kX3BoeV9yZWcocGksIDB4NDRjLCAoMHgxIDw8IDUpLCAxIDw8IDUpOwotCQkJbW9kX3BoeV9yZWcocGksIDB4NDRkLCAoMHgxIDw8IDUpLCAxIDw8IDUpOwotCi0JCQltb2RfcGh5X3JlZyhwaSwgMHg0ZjksICgweDEgPDwgMSksIDEgPDwgMSk7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHg0ZmEsICgweDEgPDwgMSksIDAgPDwgMSk7Ci0KLQkJCW1vZF9waHlfcmVnKHBpLCAweDRmOSwgKDB4MSA8PCAyKSwgMSA8PCAyKTsKLQkJCW1vZF9waHlfcmVnKHBpLCAweDRmYSwgKDB4MSA8PCAyKSwgMCA8PCAyKTsKLQotCQkJbW9kX3BoeV9yZWcocGksIDB4NGY5LCAoMHgxIDw8IDApLCAxIDw8IDApOwotCQkJbW9kX3BoeV9yZWcocGksIDB4NGZhLCAoMHgxIDw8IDApLCAwIDw8IDApOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotd2xjX2xjbnBoeV9ydW5fc2FtcGxlcyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwKLQkJICAgICAgIHUxNiBudW1fc2FtcHMsCi0JCSAgICAgICB1MTYgbnVtX2xvb3BzLCB1MTYgd2FpdCwgYm9vbCBpcWNhbG1vZGUpCi17Ci0KLQlvcl9waHlfcmVnKHBpLCAweDZkYSwgMHg4MDgwKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDY0MiwgKDB4N2YgPDwgMCksIChudW1fc2FtcHMgLSAxKSA8PCAwKTsKLQlpZiAobnVtX2xvb3BzICE9IDB4ZmZmZikKLQkJbnVtX2xvb3BzLS07Ci0JbW9kX3BoeV9yZWcocGksIDB4NjQwLCAoMHhmZmZmIDw8IDApLCBudW1fbG9vcHMgPDwgMCk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg2NDEsICgweGZmZmYgPDwgMCksIHdhaXQgPDwgMCk7Ci0KLQlpZiAoaXFjYWxtb2RlKSB7Ci0KLQkJYW5kX3BoeV9yZWcocGksIDB4NDUzLCAodTE2KSB+KDB4MSA8PCAxNSkpOwotCQlvcl9waHlfcmVnKHBpLCAweDQ1MywgKDB4MSA8PCAxNSkpOwotCX0gZWxzZSB7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4NjNmLCAxKTsKLQkJd2xjX2xjbnBoeV90eF9wdShwaSwgMSk7Ci0JfQotCi0Jb3JfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzExMiwgMHg2KTsKLX0KLQotdm9pZCB3bGNfbGNucGh5X2RlYWZfbW9kZShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgYm9vbCBtb2RlKQotewotCi0JdTggcGh5Ync0MDsKLQlwaHlidzQwID0gQ0hTUEVDX0lTNDAocGktPnJhZGlvX2NoYW5zcGVjKTsKLQotCWlmIChMQ05SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDIpKSB7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDRiMCwgKDB4MSA8PCA1KSwgKG1vZGUpIDw8IDUpOwotCQltb2RfcGh5X3JlZyhwaSwgMHg0YjEsICgweDEgPDwgOSksIDAgPDwgOSk7Ci0JfSBlbHNlIHsKLQkJbW9kX3BoeV9yZWcocGksIDB4NGIwLCAoMHgxIDw8IDUpLCAobW9kZSkgPDwgNSk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDRiMSwgKDB4MSA8PCA5KSwgMCA8PCA5KTsKLQl9Ci0KLQlpZiAocGh5Ync0MCA9PSAwKSB7Ci0JCW1vZF9waHlfcmVnKChwaSksIDB4NDEwLAotCQkJICAgICgweDEgPDwgNikgfAotCQkJICAgICgweDEgPDwgNSksCi0JCQkgICAgKChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSA/ICghbW9kZSkgOiAwKSA8PAotCQkJICAgIDYgfCAoIW1vZGUpIDw8IDUpOwotCQltb2RfcGh5X3JlZyhwaSwgMHg0MTAsICgweDEgPDwgNyksIChtb2RlKSA8PCA3KTsKLQl9Ci19Ci0KLXZvaWQKLXdsY19sY25waHlfc3RhcnRfdHhfdG9uZShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgczMyIGZfa0h6LCB1MTYgbWF4X3ZhbCwKLQkJCSBib29sIGlxY2FsbW9kZSkKLXsKLQl1OCBwaHlfYnc7Ci0JdTE2IG51bV9zYW1wcywgdCwgazsKLQl1MzIgYnc7Ci0JZml4ZWQgdGhldGEgPSAwLCByb3QgPSAwOwotCWNzMzIgdG9uZV9zYW1wOwotCXUzMiBkYXRhX2J1Zls2NF07Ci0JdTE2IGlfc2FtcCwgcV9zYW1wOwotCXN0cnVjdCBwaHl0YmxfaW5mbyB0YWI7Ci0Jc3RydWN0IGJyY21zX3BoeV9sY25waHkgKnBpX2xjbiA9IHBpLT51LnBpX2xjbnBoeTsKLQotCXBpLT5waHlfdHhfdG9uZV9mcmVxID0gZl9rSHo7Ci0KLQl3bGNfbGNucGh5X2RlYWZfbW9kZShwaSwgdHJ1ZSk7Ci0KLQlwaHlfYncgPSA0MDsKLQlpZiAocGlfbGNuLT5sY25waHlfc3B1cm1vZCkgewotCQl3cml0ZV9waHlfcmVnKHBpLCAweDk0MiwgMHgyKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg5M2IsIDB4MCk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4OTNjLCAweDApOwotCQl3bGNfbGNucGh5X3R4cnhfc3B1cl9hdm9pZGFuY2VfbW9kZShwaSwgZmFsc2UpOwotCX0KLQotCWlmIChmX2tIeikgewotCQlrID0gMTsKLQkJZG8gewotCQkJYncgPSBwaHlfYncgKiAxMDAwICogazsKLQkJCW51bV9zYW1wcyA9IGJ3IC8gQUJTKGZfa0h6KTsKLQkJCWsrKzsKLQkJfSB3aGlsZSAoKG51bV9zYW1wcyAqICh1MzIpIChBQlMoZl9rSHopKSkgIT0gYncpOwotCX0gZWxzZQotCQludW1fc2FtcHMgPSAyOwotCi0Jcm90ID0gRklYRUQoKGZfa0h6ICogMzYpIC8gcGh5X2J3KSAvIDEwMDsKLQl0aGV0YSA9IDA7Ci0KLQlmb3IgKHQgPSAwOyB0IDwgbnVtX3NhbXBzOyB0KyspIHsKLQotCQl3bGNfcGh5X2NvcmRpYyh0aGV0YSwgJnRvbmVfc2FtcCk7Ci0KLQkJdGhldGEgKz0gcm90OwotCi0JCWlfc2FtcCA9ICh1MTYpIChGTE9BVCh0b25lX3NhbXAuaSAqIG1heF92YWwpICYgMHgzZmYpOwotCQlxX3NhbXAgPSAodTE2KSAoRkxPQVQodG9uZV9zYW1wLnEgKiBtYXhfdmFsKSAmIDB4M2ZmKTsKLQkJZGF0YV9idWZbdF0gPSAoaV9zYW1wIDw8IDEwKSB8IHFfc2FtcDsKLQl9Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg2ZDYsICgweDMgPDwgMCksIDAgPDwgMCk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg2ZGEsICgweDEgPDwgMyksIDEgPDwgMyk7Ci0KLQl0YWIudGJsX3B0ciA9IGRhdGFfYnVmOwotCXRhYi50YmxfbGVuID0gbnVtX3NhbXBzOwotCXRhYi50YmxfaWQgPSBMQ05QSFlfVEJMX0lEX1NBTVBMRVBMQVk7Ci0JdGFiLnRibF9vZmZzZXQgPSAwOwotCXRhYi50Ymxfd2lkdGggPSAzMjsKLQl3bGNfbGNucGh5X3dyaXRlX3RhYmxlKHBpLCAmdGFiKTsKLQotCXdsY19sY25waHlfcnVuX3NhbXBsZXMocGksIG51bV9zYW1wcywgMHhmZmZmLCAwLCBpcWNhbG1vZGUpOwotfQotCi12b2lkIHdsY19sY25waHlfc3RvcF90eF90b25lKHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXMxNiBwbGF5YmFja19zdGF0dXM7Ci0Jc3RydWN0IGJyY21zX3BoeV9sY25waHkgKnBpX2xjbiA9IHBpLT51LnBpX2xjbnBoeTsKLQotCXBpLT5waHlfdHhfdG9uZV9mcmVxID0gMDsKLQlpZiAocGlfbGNuLT5sY25waHlfc3B1cm1vZCkgewotCQl3cml0ZV9waHlfcmVnKHBpLCAweDk0MiwgMHg3KTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg5M2IsIDB4MjAxNyk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4OTNjLCAweDI3YzUpOwotCQl3bGNfbGNucGh5X3R4cnhfc3B1cl9hdm9pZGFuY2VfbW9kZShwaSwgdHJ1ZSk7Ci0JfQotCi0JcGxheWJhY2tfc3RhdHVzID0gcmVhZF9waHlfcmVnKHBpLCAweDY0NCk7Ci0JaWYgKHBsYXliYWNrX3N0YXR1cyAmICgweDEgPDwgMCkpIHsKLQkJd2xjX2xjbnBoeV90eF9wdShwaSwgMCk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDYzZiwgKDB4MSA8PCAxKSwgMSA8PCAxKTsKLQl9IGVsc2UgaWYgKHBsYXliYWNrX3N0YXR1cyAmICgweDEgPDwgMSkpCi0JCW1vZF9waHlfcmVnKHBpLCAweDQ1MywgKDB4MSA8PCAxNSksIDAgPDwgMTUpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NmQ2LCAoMHgzIDw8IDApLCAxIDw8IDApOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NmRhLCAoMHgxIDw8IDMpLCAwIDw8IDMpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NmRhLCAoMHgxIDw8IDcpLCAwIDw8IDcpOwotCi0JYW5kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcxMTIsIDB4RkZGOSk7Ci0KLQl3bGNfbGNucGh5X2RlYWZfbW9kZShwaSwgZmFsc2UpOwotfQotCi1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X2NsZWFyX3Ryc3dfb3ZlcnJpZGUoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0KLQlhbmRfcGh5X3JlZyhwaSwgMHg0NGMsICh1MTYpIH4oKDB4MSA8PCAxKSB8ICgweDEgPDwgMCkpKTsKLX0KLQotdm9pZCB3bGNfbGNucGh5X2dldF90eF9pcWNjKHN0cnVjdCBicmNtc19waHkgKnBpLCB1MTYgKmEsIHUxNiAqYikKLXsKLQl1MTYgaXFjY1syXTsKLQlzdHJ1Y3QgcGh5dGJsX2luZm8gdGFiOwotCi0JdGFiLnRibF9wdHIgPSBpcWNjOwotCXRhYi50YmxfbGVuID0gMjsKLQl0YWIudGJsX2lkID0gMDsKLQl0YWIudGJsX29mZnNldCA9IDgwOwotCXRhYi50Ymxfd2lkdGggPSAxNjsKLQl3bGNfbGNucGh5X3JlYWRfdGFibGUocGksICZ0YWIpOwotCi0JKmEgPSBpcWNjWzBdOwotCSpiID0gaXFjY1sxXTsKLX0KLQotdTE2IHdsY19sY25waHlfZ2V0X3R4X2xvY2Moc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0Jc3RydWN0IHBoeXRibF9pbmZvIHRhYjsKLQl1MTYgZGlkcTsKLQotCXRhYi50YmxfaWQgPSAwOwotCXRhYi50Ymxfd2lkdGggPSAxNjsKLQl0YWIudGJsX3B0ciA9ICZkaWRxOwotCXRhYi50YmxfbGVuID0gMTsKLQl0YWIudGJsX29mZnNldCA9IDg1OwotCXdsY19sY25waHlfcmVhZF90YWJsZShwaSwgJnRhYik7Ci0KLQlyZXR1cm4gZGlkcTsKLX0KLQotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV90eHB3cnRibF9pcWxvX2NhbChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQotCXN0cnVjdCBsY25waHlfdHhnYWlucyB0YXJnZXRfZ2FpbnMsIG9sZF9nYWluczsKLQl1OCBzYXZlX2JiX211bHQ7Ci0JdTE2IGEsIGIsIGRpZHEsIHNhdmVfcGFfZ2FpbiA9IDA7Ci0JdWludCBpZHgsIFNBVkVfdHhwd3JpbmRleCA9IDB4RkY7Ci0JdTMyIHZhbDsKLQl1MTYgU0FWRV90eHB3cmN0cmwgPSB3bGNfbGNucGh5X2dldF90eF9wd3JfY3RybChwaSk7Ci0Jc3RydWN0IHBoeXRibF9pbmZvIHRhYjsKLQl1OCBlaTAsIGVxMCwgZmkwLCBmcTA7Ci0Jc3RydWN0IGJyY21zX3BoeV9sY25waHkgKnBpX2xjbiA9IHBpLT51LnBpX2xjbnBoeTsKLQotCXdsY19sY25waHlfZ2V0X3R4X2dhaW4ocGksICZvbGRfZ2FpbnMpOwotCXNhdmVfcGFfZ2FpbiA9IHdsY19sY25waHlfZ2V0X3BhX2dhaW4ocGkpOwotCi0Jc2F2ZV9iYl9tdWx0ID0gd2xjX2xjbnBoeV9nZXRfYmJtdWx0KHBpKTsKLQotCWlmIChTQVZFX3R4cHdyY3RybCA9PSBMQ05QSFlfVFhfUFdSX0NUUkxfT0ZGKQotCQlTQVZFX3R4cHdyaW5kZXggPSB3bGNfbGNucGh5X2dldF9jdXJyZW50X3R4X3B3cl9pZHgocGkpOwotCi0Jd2xjX2xjbnBoeV9zZXRfdHhfcHdyX2N0cmwocGksIExDTlBIWV9UWF9QV1JfQ1RSTF9PRkYpOwotCi0JdGFyZ2V0X2dhaW5zLmdtX2dhaW4gPSA3OwotCXRhcmdldF9nYWlucy5wZ2FfZ2FpbiA9IDA7Ci0JdGFyZ2V0X2dhaW5zLnBhZF9nYWluID0gMjE7Ci0JdGFyZ2V0X2dhaW5zLmRhY19nYWluID0gMDsKLQl3bGNfbGNucGh5X3NldF90eF9nYWluKHBpLCAmdGFyZ2V0X2dhaW5zKTsKLQl3bGNfbGNucGh5X3NldF90eF9wd3JfYnlfaW5kZXgocGksIDE2KTsKLQotCWlmIChMQ05SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDEpIHx8IHBpX2xjbi0+bGNucGh5X2h3X2lxY2FsX2VuKSB7Ci0KLQkJd2xjX2xjbnBoeV9zZXRfdHhfcHdyX2J5X2luZGV4KHBpLCAzMCk7Ci0KLQkJd2xjX2xjbnBoeV90eF9pcWxvX2NhbChwaSwgJnRhcmdldF9nYWlucywKLQkJCQkgICAgICAgKHBpX2xjbi0+Ci0JCQkJCWxjbnBoeV9yZWNhbCA/IExDTlBIWV9DQUxfUkVDQUwgOgotCQkJCQlMQ05QSFlfQ0FMX0ZVTEwpLCBmYWxzZSk7Ci0JfSBlbHNlIHsKLQotCQl3bGNfbGNucGh5X3R4X2lxbG9fc29mdF9jYWxfZnVsbChwaSk7Ci0JfQotCi0Jd2xjX2xjbnBoeV9nZXRfcmFkaW9fbG9mdChwaSwgJmVpMCwgJmVxMCwgJmZpMCwgJmZxMCk7Ci0JaWYgKChBQlMoKHM4KSBmaTApID09IDE1KSAmJiAoQUJTKChzOCkgZnEwKSA9PSAxNSkpIHsKLQkJaWYgKENIU1BFQ19JUzVHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCXRhcmdldF9nYWlucy5nbV9nYWluID0gMjU1OwotCQkJdGFyZ2V0X2dhaW5zLnBnYV9nYWluID0gMjU1OwotCQkJdGFyZ2V0X2dhaW5zLnBhZF9nYWluID0gMHhmMDsKLQkJCXRhcmdldF9nYWlucy5kYWNfZ2FpbiA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQl0YXJnZXRfZ2FpbnMuZ21fZ2FpbiA9IDc7Ci0JCQl0YXJnZXRfZ2FpbnMucGdhX2dhaW4gPSA0NTsKLQkJCXRhcmdldF9nYWlucy5wYWRfZ2FpbiA9IDE4NjsKLQkJCXRhcmdldF9nYWlucy5kYWNfZ2FpbiA9IDA7Ci0JCX0KLQotCQlpZiAoTENOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCAxKQotCQkgICAgfHwgcGlfbGNuLT5sY25waHlfaHdfaXFjYWxfZW4pIHsKLQotCQkJdGFyZ2V0X2dhaW5zLnBnYV9nYWluID0gMDsKLQkJCXRhcmdldF9nYWlucy5wYWRfZ2FpbiA9IDMwOwotCQkJd2xjX2xjbnBoeV9zZXRfdHhfcHdyX2J5X2luZGV4KHBpLCAxNik7Ci0JCQl3bGNfbGNucGh5X3R4X2lxbG9fY2FsKHBpLCAmdGFyZ2V0X2dhaW5zLAotCQkJCQkgICAgICAgTENOUEhZX0NBTF9GVUxMLCBmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0KLQkJCXdsY19sY25waHlfdHhfaXFsb19zb2Z0X2NhbF9mdWxsKHBpKTsKLQkJfQotCi0JfQotCi0Jd2xjX2xjbnBoeV9nZXRfdHhfaXFjYyhwaSwgJmEsICZiKTsKLQotCWRpZHEgPSB3bGNfbGNucGh5X2dldF90eF9sb2NjKHBpKTsKLQotCXRhYi50YmxfaWQgPSBMQ05QSFlfVEJMX0lEX1RYUFdSQ1RMOwotCXRhYi50Ymxfd2lkdGggPSAzMjsKLQl0YWIudGJsX3B0ciA9ICZ2YWw7Ci0KLQl0YWIudGJsX2xlbiA9IDE7Ci0JdGFiLnRibF9vZmZzZXQgPSBMQ05QSFlfVFhfUFdSX0NUUkxfUkFURV9PRkZTRVQ7Ci0KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IDEyODsgaWR4KyspIHsKLQkJdGFiLnRibF9vZmZzZXQgPSBMQ05QSFlfVFhfUFdSX0NUUkxfSVFfT0ZGU0VUICsgaWR4OwotCi0JCXdsY19sY25waHlfcmVhZF90YWJsZShwaSwgJnRhYik7Ci0JCXZhbCA9ICh2YWwgJiAweGZmZjAwMDAwKSB8Ci0JCSAgICAoKHUzMikgKGEgJiAweDNGRikgPDwgMTApIHwgKGIgJiAweDNmZik7Ci0JCXdsY19sY25waHlfd3JpdGVfdGFibGUocGksICZ0YWIpOwotCi0JCXZhbCA9IGRpZHE7Ci0JCXRhYi50Ymxfb2Zmc2V0ID0gTENOUEhZX1RYX1BXUl9DVFJMX0xPX09GRlNFVCArIGlkeDsKLQkJd2xjX2xjbnBoeV93cml0ZV90YWJsZShwaSwgJnRhYik7Ci0JfQotCi0JcGlfbGNuLT5sY25waHlfY2FsX3Jlc3VsdHMudHhpcWxvY2FsX2EgPSBhOwotCXBpX2xjbi0+bGNucGh5X2NhbF9yZXN1bHRzLnR4aXFsb2NhbF9iID0gYjsKLQlwaV9sY24tPmxjbnBoeV9jYWxfcmVzdWx0cy50eGlxbG9jYWxfZGlkcSA9IGRpZHE7Ci0JcGlfbGNuLT5sY25waHlfY2FsX3Jlc3VsdHMudHhpcWxvY2FsX2VpMCA9IGVpMDsKLQlwaV9sY24tPmxjbnBoeV9jYWxfcmVzdWx0cy50eGlxbG9jYWxfZXEwID0gZXEwOwotCXBpX2xjbi0+bGNucGh5X2NhbF9yZXN1bHRzLnR4aXFsb2NhbF9maTAgPSBmaTA7Ci0JcGlfbGNuLT5sY25waHlfY2FsX3Jlc3VsdHMudHhpcWxvY2FsX2ZxMCA9IGZxMDsKLQotCXdsY19sY25waHlfc2V0X2JibXVsdChwaSwgc2F2ZV9iYl9tdWx0KTsKLQl3bGNfbGNucGh5X3NldF9wYV9nYWluKHBpLCBzYXZlX3BhX2dhaW4pOwotCXdsY19sY25waHlfc2V0X3R4X2dhaW4ocGksICZvbGRfZ2FpbnMpOwotCi0JaWYgKFNBVkVfdHhwd3JjdHJsICE9IExDTlBIWV9UWF9QV1JfQ1RSTF9PRkYpCi0JCXdsY19sY25waHlfc2V0X3R4X3B3cl9jdHJsKHBpLCBTQVZFX3R4cHdyY3RybCk7Ci0JZWxzZQotCQl3bGNfbGNucGh5X3NldF90eF9wd3JfYnlfaW5kZXgocGksIFNBVkVfdHhwd3JpbmRleCk7Ci19Ci0KLXMxNiB3bGNfbGNucGh5X3RlbXBzZW5zZV9uZXcoc3RydWN0IGJyY21zX3BoeSAqcGksIGJvb2wgbW9kZSkKLXsKLQl1MTYgdGVtcHNlbnNldmFsMSwgdGVtcHNlbnNldmFsMjsKLQlzMTYgYXZnID0gMDsKLQlib29sIHN1c3BlbmQgPSAwOwotCi0JaWYgKE5PUkFESU9fRU5BQihwaS0+cHVicGkpKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAobW9kZSA9PSAxKSB7Ci0JCXN1c3BlbmQgPQotCQkgICAgKDAgPT0KLQkJICAgICAoUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKSAmIE1DVExfRU5fTUFDKSk7Ci0JCWlmICghc3VzcGVuZCkKLQkJCXdsYXBpX3N1c3BlbmRfbWFjX2FuZF93YWl0KHBpLT5zaC0+cGh5c2hpbSk7Ci0JCXdsY19sY25waHlfdmJhdF90ZW1wX3NlbnNlX3NldHVwKHBpLCBURU1QU0VOU0UpOwotCX0KLQl0ZW1wc2Vuc2V2YWwxID0gcmVhZF9waHlfcmVnKHBpLCAweDQ3NikgJiAweDFGRjsKLQl0ZW1wc2Vuc2V2YWwyID0gcmVhZF9waHlfcmVnKHBpLCAweDQ3NykgJiAweDFGRjsKLQotCWlmICh0ZW1wc2Vuc2V2YWwxID4gMjU1KQotCQlhdmcgPSAoczE2KSAodGVtcHNlbnNldmFsMSAtIDUxMik7Ci0JZWxzZQotCQlhdmcgPSAoczE2KSB0ZW1wc2Vuc2V2YWwxOwotCi0JaWYgKHRlbXBzZW5zZXZhbDIgPiAyNTUpCi0JCWF2ZyArPSAoczE2KSAodGVtcHNlbnNldmFsMiAtIDUxMik7Ci0JZWxzZQotCQlhdmcgKz0gKHMxNikgdGVtcHNlbnNldmFsMjsKLQotCWF2ZyAvPSAyOwotCi0JaWYgKG1vZGUgPT0gMSkgewotCi0JCW1vZF9waHlfcmVnKHBpLCAweDQ0OCwgKDB4MSA8PCAxNCksICgxKSA8PCAxNCk7Ci0KLQkJdWRlbGF5KDEwMCk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDQ0OCwgKDB4MSA8PCAxNCksICgwKSA8PCAxNCk7Ci0KLQkJaWYgKCFzdXNwZW5kKQotCQkJd2xhcGlfZW5hYmxlX21hYyhwaS0+c2gtPnBoeXNoaW0pOwotCX0KLQlyZXR1cm4gYXZnOwotfQotCi11MTYgd2xjX2xjbnBoeV90ZW1wc2Vuc2Uoc3RydWN0IGJyY21zX3BoeSAqcGksIGJvb2wgbW9kZSkKLXsKLQl1MTYgdGVtcHNlbnNldmFsMSwgdGVtcHNlbnNldmFsMjsKLQlzMzIgYXZnID0gMDsKLQlib29sIHN1c3BlbmQgPSAwOwotCXUxNiBTQVZFX3R4cHdyY3RybCA9IHdsY19sY25waHlfZ2V0X3R4X3B3cl9jdHJsKHBpKTsKLQlzdHJ1Y3QgYnJjbXNfcGh5X2xjbnBoeSAqcGlfbGNuID0gcGktPnUucGlfbGNucGh5OwotCi0JaWYgKE5PUkFESU9fRU5BQihwaS0+cHVicGkpKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAobW9kZSA9PSAxKSB7Ci0JCXN1c3BlbmQgPQotCQkgICAgKDAgPT0KLQkJICAgICAoUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKSAmIE1DVExfRU5fTUFDKSk7Ci0JCWlmICghc3VzcGVuZCkKLQkJCXdsYXBpX3N1c3BlbmRfbWFjX2FuZF93YWl0KHBpLT5zaC0+cGh5c2hpbSk7Ci0JCXdsY19sY25waHlfdmJhdF90ZW1wX3NlbnNlX3NldHVwKHBpLCBURU1QU0VOU0UpOwotCX0KLQl0ZW1wc2Vuc2V2YWwxID0gcmVhZF9waHlfcmVnKHBpLCAweDQ3NikgJiAweDFGRjsKLQl0ZW1wc2Vuc2V2YWwyID0gcmVhZF9waHlfcmVnKHBpLCAweDQ3NykgJiAweDFGRjsKLQotCWlmICh0ZW1wc2Vuc2V2YWwxID4gMjU1KQotCQlhdmcgPSAoaW50KSh0ZW1wc2Vuc2V2YWwxIC0gNTEyKTsKLQllbHNlCi0JCWF2ZyA9IChpbnQpdGVtcHNlbnNldmFsMTsKLQotCWlmIChwaV9sY24tPmxjbnBoeV90ZW1wc2Vuc2Vfb3B0aW9uID09IDEgfHwgcGktPmh3cHdyY3RybF9jYXBhYmxlKSB7Ci0JCWlmICh0ZW1wc2Vuc2V2YWwyID4gMjU1KQotCQkJYXZnID0gKGludCkoYXZnIC0gdGVtcHNlbnNldmFsMiArIDUxMik7Ci0JCWVsc2UKLQkJCWF2ZyA9IChpbnQpKGF2ZyAtIHRlbXBzZW5zZXZhbDIpOwotCX0gZWxzZSB7Ci0JCWlmICh0ZW1wc2Vuc2V2YWwyID4gMjU1KQotCQkJYXZnID0gKGludCkoYXZnICsgdGVtcHNlbnNldmFsMiAtIDUxMik7Ci0JCWVsc2UKLQkJCWF2ZyA9IChpbnQpKGF2ZyArIHRlbXBzZW5zZXZhbDIpOwotCQlhdmcgPSBhdmcgLyAyOwotCX0KLQlpZiAoYXZnIDwgMCkKLQkJYXZnID0gYXZnICsgNTEyOwotCi0JaWYgKHBpX2xjbi0+bGNucGh5X3RlbXBzZW5zZV9vcHRpb24gPT0gMikKLQkJYXZnID0gdGVtcHNlbnNldmFsMTsKLQotCWlmIChtb2RlKQotCQl3bGNfbGNucGh5X3NldF90eF9wd3JfY3RybChwaSwgU0FWRV90eHB3cmN0cmwpOwotCi0JaWYgKG1vZGUgPT0gMSkgewotCi0JCW1vZF9waHlfcmVnKHBpLCAweDQ0OCwgKDB4MSA8PCAxNCksICgxKSA8PCAxNCk7Ci0KLQkJdWRlbGF5KDEwMCk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDQ0OCwgKDB4MSA8PCAxNCksICgwKSA8PCAxNCk7Ci0KLQkJaWYgKCFzdXNwZW5kKQotCQkJd2xhcGlfZW5hYmxlX21hYyhwaS0+c2gtPnBoeXNoaW0pOwotCX0KLQlyZXR1cm4gKHUxNikgYXZnOwotfQotCi1zOCB3bGNfbGNucGh5X3RlbXBzZW5zZV9kZWdyZWUoc3RydWN0IGJyY21zX3BoeSAqcGksIGJvb2wgbW9kZSkKLXsKLQlzMzIgZGVncmVlID0gd2xjX2xjbnBoeV90ZW1wc2Vuc2VfbmV3KHBpLCBtb2RlKTsKLQlkZWdyZWUgPQotCSAgICAoKGRlZ3JlZSA8PCAxMCkgKyBMQ05fVEVNUFNFTlNFX09GRlNFVCArIChMQ05fVEVNUFNFTlNFX0RFTiA+PiAxKSkKLQkgICAgLyBMQ05fVEVNUFNFTlNFX0RFTjsKLQlyZXR1cm4gKHM4KSBkZWdyZWU7Ci19Ci0KLXM4IHdsY19sY25waHlfdmJhdHNlbnNlKHN0cnVjdCBicmNtc19waHkgKnBpLCBib29sIG1vZGUpCi17Ci0JdTE2IHZiYXRzZW5zZXZhbDsKLQlzMzIgYXZnID0gMDsKLQlib29sIHN1c3BlbmQgPSAwOwotCi0JaWYgKE5PUkFESU9fRU5BQihwaS0+cHVicGkpKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAobW9kZSA9PSAxKSB7Ci0JCXN1c3BlbmQgPQotCQkgICAgKDAgPT0KLQkJICAgICAoUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKSAmIE1DVExfRU5fTUFDKSk7Ci0JCWlmICghc3VzcGVuZCkKLQkJCXdsYXBpX3N1c3BlbmRfbWFjX2FuZF93YWl0KHBpLT5zaC0+cGh5c2hpbSk7Ci0JCXdsY19sY25waHlfdmJhdF90ZW1wX3NlbnNlX3NldHVwKHBpLCBWQkFUU0VOU0UpOwotCX0KLQotCXZiYXRzZW5zZXZhbCA9IHJlYWRfcGh5X3JlZyhwaSwgMHg0NzUpICYgMHgxRkY7Ci0KLQlpZiAodmJhdHNlbnNldmFsID4gMjU1KQotCQlhdmcgPSAoczMyKSAodmJhdHNlbnNldmFsIC0gNTEyKTsKLQllbHNlCi0JCWF2ZyA9IChzMzIpIHZiYXRzZW5zZXZhbDsKLQotCWF2ZyA9Ci0JICAgIChhdmcgKiBMQ05fVkJBVF9TQ0FMRV9OT00gKwotCSAgICAgKExDTl9WQkFUX1NDQUxFX0RFTiA+PiAxKSkgLyBMQ05fVkJBVF9TQ0FMRV9ERU47Ci0KLQlpZiAobW9kZSA9PSAxKSB7Ci0JCWlmICghc3VzcGVuZCkKLQkJCXdsYXBpX2VuYWJsZV9tYWMocGktPnNoLT5waHlzaGltKTsKLQl9Ci0JcmV0dXJuIChzOCkgYXZnOwotfQotCi1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X2FmZV9jbGtfaW5pdChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTggbW9kZSkKLXsKLQl1OCBwaHlidzQwOwotCXBoeWJ3NDAgPSBDSFNQRUNfSVM0MChwaS0+cmFkaW9fY2hhbnNwZWMpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NmQxLCAoMHgxIDw8IDcpLCAoMSkgPDwgNyk7Ci0KLQlpZiAoKChtb2RlID09IEFGRV9DTEtfSU5JVF9NT0RFX1BBUEQpICYmIChwaHlidzQwID09IDApKSB8fAotCSAgICAobW9kZSA9PSBBRkVfQ0xLX0lOSVRfTU9ERV9UWFJYMlgpKQotCQl3cml0ZV9waHlfcmVnKHBpLCAweDZkMCwgMHg3KTsKLQotCXdsY19sY25waHlfdG9nZ2xlX2FmZV9wd2RuKHBpKTsKLX0KLQotc3RhdGljIGJvb2wKLXdsY19sY25waHlfcnhfaXFfZXN0KHN0cnVjdCBicmNtc19waHkgKnBpLAotCQkgICAgIHUxNiBudW1fc2FtcHMsCi0JCSAgICAgdTggd2FpdF90aW1lLCBzdHJ1Y3QgbGNucGh5X2lxX2VzdCAqaXFfZXN0KQotewotCWludCB3YWl0X2NvdW50ID0gMDsKLQlib29sIHJlc3VsdCA9IHRydWU7Ci0JdTggcGh5Ync0MDsKLQlwaHlidzQwID0gQ0hTUEVDX0lTNDAocGktPnJhZGlvX2NoYW5zcGVjKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDZkYSwgKDB4MSA8PCA1KSwgKDEpIDw8IDUpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NDEwLCAoMHgxIDw8IDMpLCAoMCkgPDwgMyk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0ODIsICgweGZmZmYgPDwgMCksIChudW1fc2FtcHMpIDw8IDApOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NDgxLCAoMHhmZiA8PCAwKSwgKCh1MTYpIHdhaXRfdGltZSkgPDwgMCk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0ODEsICgweDEgPDwgOCksICgwKSA8PCA4KTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDQ4MSwgKDB4MSA8PCA5KSwgKDEpIDw8IDkpOwotCi0Jd2hpbGUgKHJlYWRfcGh5X3JlZyhwaSwgMHg0ODEpICYgKDB4MSA8PCA5KSkgewotCi0JCWlmICh3YWl0X2NvdW50ID4gKDEwICogNTAwKSkgewotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQlnb3RvIGNsZWFudXA7Ci0JCX0KLQkJdWRlbGF5KDEwMCk7Ci0JCXdhaXRfY291bnQrKzsKLQl9Ci0KLQlpcV9lc3QtPmlxX3Byb2QgPSAoKHUzMikgcmVhZF9waHlfcmVnKHBpLCAweDQ4MykgPDwgMTYpIHwKLQkgICAgKHUzMikgcmVhZF9waHlfcmVnKHBpLCAweDQ4NCk7Ci0JaXFfZXN0LT5pX3B3ciA9ICgodTMyKSByZWFkX3BoeV9yZWcocGksIDB4NDg1KSA8PCAxNikgfAotCSAgICAodTMyKSByZWFkX3BoeV9yZWcocGksIDB4NDg2KTsKLQlpcV9lc3QtPnFfcHdyID0gKCh1MzIpIHJlYWRfcGh5X3JlZyhwaSwgMHg0ODcpIDw8IDE2KSB8Ci0JICAgICh1MzIpIHJlYWRfcGh5X3JlZyhwaSwgMHg0ODgpOwotCi0gY2xlYW51cDoKLQltb2RfcGh5X3JlZyhwaSwgMHg0MTAsICgweDEgPDwgMyksICgxKSA8PCAzKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDZkYSwgKDB4MSA8PCA1KSwgKDApIDw8IDUpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGJvb2wgd2xjX2xjbnBoeV9jYWxjX3J4X2lxX2NvbXAoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBudW1fc2FtcHMpCi17Ci0jZGVmaW5lIExDTlBIWV9NSU5fUlhJUV9QV1IgMgotCWJvb2wgcmVzdWx0OwotCXUxNiBhMF9uZXcsIGIwX25ldzsKLQlzdHJ1Y3QgbGNucGh5X2lxX2VzdCBpcV9lc3QgPSB7IDAsIDAsIDAgfTsKLQlzMzIgYSwgYiwgdGVtcDsKLQlzMTYgaXFfbmJpdHMsIHFxX25iaXRzLCBhcnNoLCBicnNoOwotCXMzMiBpcTsKLQl1MzIgaWksIHFxOwotCXN0cnVjdCBicmNtc19waHlfbGNucGh5ICpwaV9sY24gPSBwaS0+dS5waV9sY25waHk7Ci0KLQlhMF9uZXcgPSAoKHJlYWRfcGh5X3JlZyhwaSwgMHg2NDUpICYgKDB4M2ZmIDw8IDApKSA+PiAwKTsKLQliMF9uZXcgPSAoKHJlYWRfcGh5X3JlZyhwaSwgMHg2NDYpICYgKDB4M2ZmIDw8IDApKSA+PiAwKTsKLQltb2RfcGh5X3JlZyhwaSwgMHg2ZDEsICgweDEgPDwgMiksICgwKSA8PCAyKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDY0YiwgKDB4MSA8PCA2KSwgKDEpIDw8IDYpOwotCi0Jd2xjX2xjbnBoeV9zZXRfcnhfaXFfY29tcChwaSwgMCwgMCk7Ci0KLQlyZXN1bHQgPSB3bGNfbGNucGh5X3J4X2lxX2VzdChwaSwgbnVtX3NhbXBzLCAzMiwgJmlxX2VzdCk7Ci0JaWYgKCFyZXN1bHQpCi0JCWdvdG8gY2xlYW51cDsKLQotCWlxID0gKHMzMikgaXFfZXN0LmlxX3Byb2Q7Ci0JaWkgPSBpcV9lc3QuaV9wd3I7Ci0JcXEgPSBpcV9lc3QucV9wd3I7Ci0KLQlpZiAoKGlpICsgcXEpIDwgTENOUEhZX01JTl9SWElRX1BXUikgewotCQlyZXN1bHQgPSBmYWxzZTsKLQkJZ290byBjbGVhbnVwOwotCX0KLQotCWlxX25iaXRzID0gd2xjX3BoeV9uYml0cyhpcSk7Ci0JcXFfbmJpdHMgPSB3bGNfcGh5X25iaXRzKHFxKTsKLQotCWFyc2ggPSAxMCAtICgzMCAtIGlxX25iaXRzKTsKLQlpZiAoYXJzaCA+PSAwKSB7Ci0JCWEgPSAoLShpcSA8PCAoMzAgLSBpcV9uYml0cykpICsgKGlpID4+ICgxICsgYXJzaCkpKTsKLQkJdGVtcCA9IChzMzIpIChpaSA+PiBhcnNoKTsKLQkJaWYgKHRlbXAgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfSBlbHNlIHsKLQkJYSA9ICgtKGlxIDw8ICgzMCAtIGlxX25iaXRzKSkgKyAoaWkgPDwgKC0xIC0gYXJzaCkpKTsKLQkJdGVtcCA9IChzMzIpIChpaSA8PCAtYXJzaCk7Ci0JCWlmICh0ZW1wID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQlhIC89IHRlbXA7Ci0JYnJzaCA9IHFxX25iaXRzIC0gMzEgKyAyMDsKLQlpZiAoYnJzaCA+PSAwKSB7Ci0JCWIgPSAocXEgPDwgKDMxIC0gcXFfbmJpdHMpKTsKLQkJdGVtcCA9IChzMzIpIChpaSA+PiBicnNoKTsKLQkJaWYgKHRlbXAgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfSBlbHNlIHsKLQkJYiA9IChxcSA8PCAoMzEgLSBxcV9uYml0cykpOwotCQl0ZW1wID0gKHMzMikgKGlpIDw8IC1icnNoKTsKLQkJaWYgKHRlbXAgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCWIgLz0gdGVtcDsKLQliIC09IGEgKiBhOwotCWIgPSAoczMyKSBpbnRfc3FydCgodW5zaWduZWQgbG9uZykgYik7Ci0JYiAtPSAoMSA8PCAxMCk7Ci0JYTBfbmV3ID0gKHUxNikgKGEgJiAweDNmZik7Ci0JYjBfbmV3ID0gKHUxNikgKGIgJiAweDNmZik7Ci0gY2xlYW51cDoKLQotCXdsY19sY25waHlfc2V0X3J4X2lxX2NvbXAocGksIGEwX25ldywgYjBfbmV3KTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDY0YiwgKDB4MSA8PCAwKSwgKDEpIDw8IDApOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NjRiLCAoMHgxIDw8IDMpLCAoMSkgPDwgMyk7Ci0KLQlwaV9sY24tPmxjbnBoeV9jYWxfcmVzdWx0cy5yeGlxY2FsX2NvZWZmX2EwID0gYTBfbmV3OwotCXBpX2xjbi0+bGNucGh5X2NhbF9yZXN1bHRzLnJ4aXFjYWxfY29lZmZfYjAgPSBiMF9uZXc7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgYm9vbAotd2xjX2xjbnBoeV9yeF9pcV9jYWwoc3RydWN0IGJyY21zX3BoeSAqcGksCi0JCSAgICAgY29uc3Qgc3RydWN0IGxjbnBoeV9yeF9pcWNvbXAgKmlxY29tcCwKLQkJICAgICBpbnQgaXFjb21wX3N6LCBib29sIHR4X3N3aXRjaCwgYm9vbCByeF9zd2l0Y2gsIGludCBtb2R1bGUsCi0JCSAgICAgaW50IHR4X2dhaW5faWR4KQotewotCXN0cnVjdCBsY25waHlfdHhnYWlucyBvbGRfZ2FpbnM7Ci0JdTE2IHR4X3B3cl9jdHJsOwotCXU4IHR4X2dhaW5faW5kZXhfb2xkID0gMDsKLQlib29sIHJlc3VsdCA9IGZhbHNlLCB0eF9nYWluX292ZXJyaWRlX29sZCA9IGZhbHNlOwotCXUxNiBpLCBDb3JlMVR4Q29udHJvbF9vbGQsIFJGT3ZlcnJpZGUwX29sZCwKLQkgICAgUkZPdmVycmlkZVZhbDBfb2xkLCByZm92ZXJyaWRlMl9vbGQsIHJmb3ZlcnJpZGUydmFsX29sZCwKLQkgICAgcmZvdmVycmlkZTNfb2xkLCByZm92ZXJyaWRlM3ZhbF9vbGQsIHJmb3ZlcnJpZGU0X29sZCwKLQkgICAgcmZvdmVycmlkZTR2YWxfb2xkLCBhZmVjdHJsb3ZyX29sZCwgYWZlY3RybG92cnZhbF9vbGQ7Ci0JaW50IHRpYV9nYWluOwotCXUzMiByZWNlaXZlZF9wb3dlciwgcnhfcHdyX3RocmVzaG9sZDsKLQl1MTYgb2xkX3NzbHBuQ2FsaWJDbGtFbkN0cmwsIG9sZF9zc2xwblJ4RmVDbGtFbkN0cmw7Ci0JdTE2IHZhbHVlc190b19zYXZlWzExXTsKLQlzMTYgKnB0cjsKLQlzdHJ1Y3QgYnJjbXNfcGh5X2xjbnBoeSAqcGlfbGNuID0gcGktPnUucGlfbGNucGh5OwotCi0JcHRyID0ga21hbGxvYyhzaXplb2YoczE2KSAqIDEzMSwgR0ZQX0FUT01JQyk7Ci0JaWYgKE5VTEwgPT0gcHRyKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JaWYgKG1vZHVsZSA9PSAyKSB7Ci0JCXdoaWxlIChpcWNvbXBfc3otLSkgewotCQkJaWYgKGlxY29tcFtpcWNvbXBfc3pdLmNoYW4gPT0KLQkJCSAgICBDSFNQRUNfQ0hBTk5FTChwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0KLQkJCQl3bGNfbGNucGh5X3NldF9yeF9pcV9jb21wKHBpLAotCQkJCQkJCSAgKHUxNikKLQkJCQkJCQkgIGlxY29tcFtpcWNvbXBfc3pdLmEsCi0JCQkJCQkJICAodTE2KQotCQkJCQkJCSAgaXFjb21wW2lxY29tcF9zel0uYik7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlnb3RvIGNhbF9kb25lOwotCX0KLQotCWlmIChtb2R1bGUgPT0gMSkgewotCi0JCXR4X3B3cl9jdHJsID0gd2xjX2xjbnBoeV9nZXRfdHhfcHdyX2N0cmwocGkpOwotCQl3bGNfbGNucGh5X3NldF90eF9wd3JfY3RybChwaSwgTENOUEhZX1RYX1BXUl9DVFJMX09GRik7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDExOyBpKyspIHsKLQkJCXZhbHVlc190b19zYXZlW2ldID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwgcnhpcV9jYWxfcmZfcmVnW2ldKTsKLQkJfQotCQlDb3JlMVR4Q29udHJvbF9vbGQgPSByZWFkX3BoeV9yZWcocGksIDB4NjMxKTsKLQotCQlvcl9waHlfcmVnKHBpLCAweDYzMSwgMHgwMDE1KTsKLQotCQlSRk92ZXJyaWRlMF9vbGQgPSByZWFkX3BoeV9yZWcocGksIDB4NDRjKTsKLQkJUkZPdmVycmlkZVZhbDBfb2xkID0gcmVhZF9waHlfcmVnKHBpLCAweDQ0ZCk7Ci0JCXJmb3ZlcnJpZGUyX29sZCA9IHJlYWRfcGh5X3JlZyhwaSwgMHg0YjApOwotCQlyZm92ZXJyaWRlMnZhbF9vbGQgPSByZWFkX3BoeV9yZWcocGksIDB4NGIxKTsKLQkJcmZvdmVycmlkZTNfb2xkID0gcmVhZF9waHlfcmVnKHBpLCAweDRmOSk7Ci0JCXJmb3ZlcnJpZGUzdmFsX29sZCA9IHJlYWRfcGh5X3JlZyhwaSwgMHg0ZmEpOwotCQlyZm92ZXJyaWRlNF9vbGQgPSByZWFkX3BoeV9yZWcocGksIDB4OTM4KTsKLQkJcmZvdmVycmlkZTR2YWxfb2xkID0gcmVhZF9waHlfcmVnKHBpLCAweDkzOSk7Ci0JCWFmZWN0cmxvdnJfb2xkID0gcmVhZF9waHlfcmVnKHBpLCAweDQzYik7Ci0JCWFmZWN0cmxvdnJ2YWxfb2xkID0gcmVhZF9waHlfcmVnKHBpLCAweDQzYyk7Ci0JCW9sZF9zc2xwbkNhbGliQ2xrRW5DdHJsID0gcmVhZF9waHlfcmVnKHBpLCAweDZkYSk7Ci0JCW9sZF9zc2xwblJ4RmVDbGtFbkN0cmwgPSByZWFkX3BoeV9yZWcocGksIDB4NmRiKTsKLQotCQl0eF9nYWluX292ZXJyaWRlX29sZCA9IHdsY19sY25waHlfdHhfZ2Fpbl9vdmVycmlkZV9lbmFibGVkKHBpKTsKLQkJaWYgKHR4X2dhaW5fb3ZlcnJpZGVfb2xkKSB7Ci0JCQl3bGNfbGNucGh5X2dldF90eF9nYWluKHBpLCAmb2xkX2dhaW5zKTsKLQkJCXR4X2dhaW5faW5kZXhfb2xkID0gcGlfbGNuLT5sY25waHlfY3VycmVudF9pbmRleDsKLQkJfQotCi0JCXdsY19sY25waHlfc2V0X3R4X3B3cl9ieV9pbmRleChwaSwgdHhfZ2Fpbl9pZHgpOwotCi0JCW1vZF9waHlfcmVnKHBpLCAweDRmOSwgKDB4MSA8PCAwKSwgMSA8PCAwKTsKLQkJbW9kX3BoeV9yZWcocGksIDB4NGZhLCAoMHgxIDw8IDApLCAwIDw8IDApOwotCi0JCW1vZF9waHlfcmVnKHBpLCAweDQzYiwgKDB4MSA8PCAxKSwgMSA8PCAxKTsKLQkJbW9kX3BoeV9yZWcocGksIDB4NDNjLCAoMHgxIDw8IDEpLCAwIDw8IDEpOwotCi0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcxMTYsIDB4MDYpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMTJDLCAweDA3KTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzA2QSwgMHhkMyk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwOTgsIDB4MDMpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDBCLCAweDcpOwotCQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzExMywgMSA8PCA0LCAxIDw8IDQpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDFELCAweDAxKTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzExNCwgMHgwMSk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwMkUsIDB4MTApOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMTJBLCAweDA4KTsKLQotCQltb2RfcGh5X3JlZyhwaSwgMHg5MzgsICgweDEgPDwgMCksIDEgPDwgMCk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDkzOSwgKDB4MSA8PCAwKSwgMCA8PCAwKTsKLQkJbW9kX3BoeV9yZWcocGksIDB4OTM4LCAoMHgxIDw8IDEpLCAxIDw8IDEpOwotCQltb2RfcGh5X3JlZyhwaSwgMHg5MzksICgweDEgPDwgMSksIDEgPDwgMSk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDkzOCwgKDB4MSA8PCAyKSwgMSA8PCAyKTsKLQkJbW9kX3BoeV9yZWcocGksIDB4OTM5LCAoMHgxIDw8IDIpLCAxIDw8IDIpOwotCQltb2RfcGh5X3JlZyhwaSwgMHg5MzgsICgweDEgPDwgMyksIDEgPDwgMyk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDkzOSwgKDB4MSA8PCAzKSwgMSA8PCAzKTsKLQkJbW9kX3BoeV9yZWcocGksIDB4OTM4LCAoMHgxIDw8IDUpLCAxIDw8IDUpOwotCQltb2RfcGh5X3JlZyhwaSwgMHg5MzksICgweDEgPDwgNSksIDAgPDwgNSk7Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4NDNiLCAoMHgxIDw8IDApLCAxIDw8IDApOwotCQltb2RfcGh5X3JlZyhwaSwgMHg0M2MsICgweDEgPDwgMCksIDAgPDwgMCk7Ci0KLQkJd2xjX2xjbnBoeV9zdGFydF90eF90b25lKHBpLCAyMDAwLCAxMjAsIDApOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDZkYSwgMHhmZmZmKTsKLQkJb3JfcGh5X3JlZyhwaSwgMHg2ZGIsIDB4Myk7Ci0JCXdsY19sY25waHlfc2V0X3Ryc3dfb3ZlcnJpZGUocGksIHR4X3N3aXRjaCwgcnhfc3dpdGNoKTsKLQkJd2xjX2xjbnBoeV9yeF9nYWluX292ZXJyaWRlX2VuYWJsZShwaSwgdHJ1ZSk7Ci0KLQkJdGlhX2dhaW4gPSA4OwotCQlyeF9wd3JfdGhyZXNob2xkID0gOTUwOwotCQl3aGlsZSAodGlhX2dhaW4gPiAwKSB7Ci0JCQl0aWFfZ2FpbiAtPSAxOwotCQkJd2xjX2xjbnBoeV9zZXRfcnhfZ2Fpbl9ieV9kaXN0cmlidXRpb24ocGksCi0JCQkJCQkJICAgICAgIDAsIDAsIDIsIDIsCi0JCQkJCQkJICAgICAgICh1MTYpCi0JCQkJCQkJICAgICAgIHRpYV9nYWluLCAxLCAwKTsKLQkJCXVkZWxheSg1MDApOwotCi0JCQlyZWNlaXZlZF9wb3dlciA9Ci0JCQkgICAgd2xjX2xjbnBoeV9tZWFzdXJlX2RpZ2l0YWxfcG93ZXIocGksIDIwMDApOwotCQkJaWYgKHJlY2VpdmVkX3Bvd2VyIDwgcnhfcHdyX3RocmVzaG9sZCkKLQkJCQlicmVhazsKLQkJfQotCQlyZXN1bHQgPSB3bGNfbGNucGh5X2NhbGNfcnhfaXFfY29tcChwaSwgMHhmZmZmKTsKLQotCQl3bGNfbGNucGh5X3N0b3BfdHhfdG9uZShwaSk7Ci0KLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg2MzEsIENvcmUxVHhDb250cm9sX29sZCk7Ci0KLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg0NGMsIFJGT3ZlcnJpZGVWYWwwX29sZCk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4NDRkLCBSRk92ZXJyaWRlVmFsMF9vbGQpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDRiMCwgcmZvdmVycmlkZTJfb2xkKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg0YjEsIHJmb3ZlcnJpZGUydmFsX29sZCk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4NGY5LCByZm92ZXJyaWRlM19vbGQpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDRmYSwgcmZvdmVycmlkZTN2YWxfb2xkKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg5MzgsIHJmb3ZlcnJpZGU0X29sZCk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4OTM5LCByZm92ZXJyaWRlNHZhbF9vbGQpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDQzYiwgYWZlY3RybG92cl9vbGQpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDQzYywgYWZlY3RybG92cnZhbF9vbGQpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDZkYSwgb2xkX3NzbHBuQ2FsaWJDbGtFbkN0cmwpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDZkYiwgb2xkX3NzbHBuUnhGZUNsa0VuQ3RybCk7Ci0KLQkJd2xjX2xjbnBoeV9jbGVhcl90cnN3X292ZXJyaWRlKHBpKTsKLQotCQltb2RfcGh5X3JlZyhwaSwgMHg0NGMsICgweDEgPDwgMiksIDAgPDwgMik7Ci0KLQkJZm9yIChpID0gMDsgaSA8IDExOyBpKyspIHsKLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwgcnhpcV9jYWxfcmZfcmVnW2ldLAotCQkJCQl2YWx1ZXNfdG9fc2F2ZVtpXSk7Ci0JCX0KLQotCQlpZiAodHhfZ2Fpbl9vdmVycmlkZV9vbGQpIHsKLQkJCXdsY19sY25waHlfc2V0X3R4X3B3cl9ieV9pbmRleChwaSwgdHhfZ2Fpbl9pbmRleF9vbGQpOwotCQl9IGVsc2UKLQkJCXdsY19sY25waHlfZGlzYWJsZV90eF9nYWluX292ZXJyaWRlKHBpKTsKLQkJd2xjX2xjbnBoeV9zZXRfdHhfcHdyX2N0cmwocGksIHR4X3B3cl9jdHJsKTsKLQotCQl3bGNfbGNucGh5X3J4X2dhaW5fb3ZlcnJpZGVfZW5hYmxlKHBpLCBmYWxzZSk7Ci0JfQotCi0gY2FsX2RvbmU6Ci0Ja2ZyZWUocHRyKTsKLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X3RlbXBfYWRqKHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCWlmIChOT1JBRElPX0VOQUIocGktPnB1YnBpKSkKLQkJcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X2dsYWNpYWxfdGltZXJfYmFzZWRfY2FsKHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCWJvb2wgc3VzcGVuZDsKLQlzOCBpbmRleDsKLQl1MTYgU0FWRV9wd3JjdHJsID0gd2xjX2xjbnBoeV9nZXRfdHhfcHdyX2N0cmwocGkpOwotCXN0cnVjdCBicmNtc19waHlfbGNucGh5ICpwaV9sY24gPSBwaS0+dS5waV9sY25waHk7Ci0Jc3VzcGVuZCA9Ci0JICAgICgwID09IChSX1JFRygmcGktPnJlZ3MtPm1hY2NvbnRyb2wpICYgTUNUTF9FTl9NQUMpKTsKLQlpZiAoIXN1c3BlbmQpCi0JCXdsYXBpX3N1c3BlbmRfbWFjX2FuZF93YWl0KHBpLT5zaC0+cGh5c2hpbSk7Ci0Jd2xjX2xjbnBoeV9kZWFmX21vZGUocGksIHRydWUpOwotCXBpLT5waHlfbGFzdGNhbCA9IHBpLT5zaC0+bm93OwotCXBpLT5waHlfZm9yY2VjYWwgPSBmYWxzZTsKLQlpbmRleCA9IHBpX2xjbi0+bGNucGh5X2N1cnJlbnRfaW5kZXg7Ci0KLQl3bGNfbGNucGh5X3R4cHdydGJsX2lxbG9fY2FsKHBpKTsKLQotCXdsY19sY25waHlfc2V0X3R4X3B3cl9ieV9pbmRleChwaSwgaW5kZXgpOwotCXdsY19sY25waHlfc2V0X3R4X3B3cl9jdHJsKHBpLCBTQVZFX3B3cmN0cmwpOwotCXdsY19sY25waHlfZGVhZl9tb2RlKHBpLCBmYWxzZSk7Ci0JaWYgKCFzdXNwZW5kKQotCQl3bGFwaV9lbmFibGVfbWFjKHBpLT5zaC0+cGh5c2hpbSk7Ci0KLX0KLQotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV9wZXJpb2RpY19jYWwoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JYm9vbCBzdXNwZW5kLCBmdWxsX2NhbDsKLQljb25zdCBzdHJ1Y3QgbGNucGh5X3J4X2lxY29tcCAqcnhfaXFjb21wOwotCWludCByeF9pcWNvbXBfc3o7Ci0JdTE2IFNBVkVfcHdyY3RybCA9IHdsY19sY25waHlfZ2V0X3R4X3B3cl9jdHJsKHBpKTsKLQlzOCBpbmRleDsKLQlzdHJ1Y3QgcGh5dGJsX2luZm8gdGFiOwotCXMzMiBhMSwgYjAsIGIxOwotCXMzMiB0c3NpLCBwd3IsIG1heHRhcmdldHB3ciwgbWludGFyZ2V0cHdyOwotCXN0cnVjdCBicmNtc19waHlfbGNucGh5ICpwaV9sY24gPSBwaS0+dS5waV9sY25waHk7Ci0KLQlpZiAoTk9SQURJT19FTkFCKHBpLT5wdWJwaSkpCi0JCXJldHVybjsKLQotCXBpLT5waHlfbGFzdGNhbCA9IHBpLT5zaC0+bm93OwotCXBpLT5waHlfZm9yY2VjYWwgPSBmYWxzZTsKLQlmdWxsX2NhbCA9Ci0JICAgIChwaV9sY24tPmxjbnBoeV9mdWxsX2NhbF9jaGFubmVsICE9Ci0JICAgICBDSFNQRUNfQ0hBTk5FTChwaS0+cmFkaW9fY2hhbnNwZWMpKTsKLQlwaV9sY24tPmxjbnBoeV9mdWxsX2NhbF9jaGFubmVsID0gQ0hTUEVDX0NIQU5ORUwocGktPnJhZGlvX2NoYW5zcGVjKTsKLQlpbmRleCA9IHBpX2xjbi0+bGNucGh5X2N1cnJlbnRfaW5kZXg7Ci0KLQlzdXNwZW5kID0KLQkgICAgKDAgPT0gKFJfUkVHKCZwaS0+cmVncy0+bWFjY29udHJvbCkgJiBNQ1RMX0VOX01BQykpOwotCWlmICghc3VzcGVuZCkgewotCi0JCXdsYXBpX2JtYWNfd3JpdGVfc2htKHBpLT5zaC0+cGh5c2hpbSwgTV9DVFNfRFVSQVRJT04sIDEwMDAwKTsKLQkJd2xhcGlfc3VzcGVuZF9tYWNfYW5kX3dhaXQocGktPnNoLT5waHlzaGltKTsKLQl9Ci0Jd2xjX2xjbnBoeV9kZWFmX21vZGUocGksIHRydWUpOwotCi0Jd2xjX2xjbnBoeV90eHB3cnRibF9pcWxvX2NhbChwaSk7Ci0KLQlyeF9pcWNvbXAgPSBsY25waHlfcnhfaXFjb21wX3RhYmxlX3JldjA7Ci0JcnhfaXFjb21wX3N6ID0gQVJSQVlfU0laRShsY25waHlfcnhfaXFjb21wX3RhYmxlX3JldjApOwotCi0JaWYgKExDTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgMSkpCi0JCXdsY19sY25waHlfcnhfaXFfY2FsKHBpLCBOVUxMLCAwLCB0cnVlLCBmYWxzZSwgMSwgNDApOwotCWVsc2UKLQkJd2xjX2xjbnBoeV9yeF9pcV9jYWwocGksIE5VTEwsIDAsIHRydWUsIGZhbHNlLCAxLCAxMjcpOwotCi0JaWYgKHdsY19sY25waHlfdHNzaV9iYXNlZF9wd3JfY3RybF9lbmFibGVkKHBpKSkgewotCi0JCXdsY19sY25waHlfaWRsZV90c3NpX2VzdCgoc3RydWN0IGJyY21zX3BoeV9wdWIgKikgcGkpOwotCi0JCWIwID0gcGktPnR4cGFfMmdbMF07Ci0JCWIxID0gcGktPnR4cGFfMmdbMV07Ci0JCWExID0gcGktPnR4cGFfMmdbMl07Ci0JCW1heHRhcmdldHB3ciA9IHdsY19sY25waHlfdHNzaTJkYm0oMTAsIGExLCBiMCwgYjEpOwotCQltaW50YXJnZXRwd3IgPSB3bGNfbGNucGh5X3Rzc2kyZGJtKDEyNSwgYTEsIGIwLCBiMSk7Ci0KLQkJdGFiLnRibF9pZCA9IExDTlBIWV9UQkxfSURfVFhQV1JDVEw7Ci0JCXRhYi50Ymxfd2lkdGggPSAzMjsKLQkJdGFiLnRibF9wdHIgPSAmcHdyOwotCQl0YWIudGJsX2xlbiA9IDE7Ci0JCXRhYi50Ymxfb2Zmc2V0ID0gMDsKLQkJZm9yICh0c3NpID0gMDsgdHNzaSA8IDEyODsgdHNzaSsrKSB7Ci0JCQlwd3IgPSB3bGNfbGNucGh5X3Rzc2kyZGJtKHRzc2ksIGExLCBiMCwgYjEpOwotCQkJcHdyID0gKHB3ciA8IG1pbnRhcmdldHB3cikgPyBtaW50YXJnZXRwd3IgOiBwd3I7Ci0JCQl3bGNfbGNucGh5X3dyaXRlX3RhYmxlKHBpLCAmdGFiKTsKLQkJCXRhYi50Ymxfb2Zmc2V0Kys7Ci0JCX0KLQl9Ci0KLQl3bGNfbGNucGh5X3NldF90eF9wd3JfYnlfaW5kZXgocGksIGluZGV4KTsKLQl3bGNfbGNucGh5X3NldF90eF9wd3JfY3RybChwaSwgU0FWRV9wd3JjdHJsKTsKLQl3bGNfbGNucGh5X2RlYWZfbW9kZShwaSwgZmFsc2UpOwotCWlmICghc3VzcGVuZCkKLQkJd2xhcGlfZW5hYmxlX21hYyhwaS0+c2gtPnBoeXNoaW0pOwotfQotCi12b2lkIHdsY19sY25waHlfY2FsaWJfbW9kZXMoc3RydWN0IGJyY21zX3BoeSAqcGksIHVpbnQgbW9kZSkKLXsKLQl1MTYgdGVtcF9uZXc7Ci0JaW50IHRlbXAxLCB0ZW1wMiwgdGVtcF9kaWZmOwotCXN0cnVjdCBicmNtc19waHlfbGNucGh5ICpwaV9sY24gPSBwaS0+dS5waV9sY25waHk7Ci0KLQlzd2l0Y2ggKG1vZGUpIHsKLQljYXNlIFBIWV9QRVJJQ0FMX0NIQU46Ci0KLQkJYnJlYWs7Ci0JY2FzZSBQSFlfRlVMTENBTDoKLQkJd2xjX2xjbnBoeV9wZXJpb2RpY19jYWwocGkpOwotCQlicmVhazsKLQljYXNlIFBIWV9QRVJJQ0FMX1BIWUlOSVQ6Ci0JCXdsY19sY25waHlfcGVyaW9kaWNfY2FsKHBpKTsKLQkJYnJlYWs7Ci0JY2FzZSBQSFlfUEVSSUNBTF9XQVRDSERPRzoKLQkJaWYgKHdsY19sY25waHlfdGVtcHNlbnNlX2Jhc2VkX3B3cl9jdHJsX2VuYWJsZWQocGkpKSB7Ci0JCQl0ZW1wX25ldyA9IHdsY19sY25waHlfdGVtcHNlbnNlKHBpLCAwKTsKLQkJCXRlbXAxID0gTENOUEhZX1RFTVBTRU5TRSh0ZW1wX25ldyk7Ci0JCQl0ZW1wMiA9IExDTlBIWV9URU1QU0VOU0UocGlfbGNuLT5sY25waHlfY2FsX3RlbXBlcik7Ci0JCQl0ZW1wX2RpZmYgPSB0ZW1wMSAtIHRlbXAyOwotCQkJaWYgKChwaV9sY24tPmxjbnBoeV9jYWxfY291bnRlciA+IDkwKSB8fAotCQkJICAgICh0ZW1wX2RpZmYgPiA2MCkgfHwgKHRlbXBfZGlmZiA8IC02MCkpIHsKLQkJCQl3bGNfbGNucGh5X2dsYWNpYWxfdGltZXJfYmFzZWRfY2FsKHBpKTsKLQkJCQl3bGNfMjA2NF92Y29fY2FsKHBpKTsKLQkJCQlwaV9sY24tPmxjbnBoeV9jYWxfdGVtcGVyID0gdGVtcF9uZXc7Ci0JCQkJcGlfbGNuLT5sY25waHlfY2FsX2NvdW50ZXIgPSAwOwotCQkJfSBlbHNlCi0JCQkJcGlfbGNuLT5sY25waHlfY2FsX2NvdW50ZXIrKzsKLQkJfQotCQlicmVhazsKLQljYXNlIExDTlBIWV9QRVJJQ0FMX1RFTVBCQVNFRF9UWFBXUkNUUkw6Ci0JCWlmICh3bGNfbGNucGh5X3RlbXBzZW5zZV9iYXNlZF9wd3JfY3RybF9lbmFibGVkKHBpKSkKLQkJCXdsY19sY25waHlfdHhfcG93ZXJfYWRqdXN0bWVudCgKLQkJCQkJCShzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqKSBwaSk7Ci0JCWJyZWFrOwotCX0KLX0KLQotdm9pZCB3bGNfbGNucGh5X2dldF90c3NpKHN0cnVjdCBicmNtc19waHkgKnBpLCBzOCAqb2ZkbV9wd3IsIHM4ICpjY2tfcHdyKQotewotCXM4IGNja19vZmZzZXQ7Ci0JdTE2IHN0YXR1czsKLQlzdGF0dXMgPSAocmVhZF9waHlfcmVnKHBpLCAweDRhYikpOwotCWlmICh3bGNfbGNucGh5X3Rzc2lfYmFzZWRfcHdyX2N0cmxfZW5hYmxlZChwaSkgJiYKLQkgICAgKHN0YXR1cyAgJiAoMHgxIDw8IDE1KSkpIHsKLQkJKm9mZG1fcHdyID0gKHM4KSAoKChyZWFkX3BoeV9yZWcocGksIDB4NGFiKSAmICgweDFmZiA8PCAwKSkKLQkJCQkgICAgID4+IDApID4+IDEpOwotCi0JCWlmICh3bGNfcGh5X3RwY19pc2VuYWJsZWRfbGNucGh5KHBpKSkKLQkJCWNja19vZmZzZXQgPSBwaS0+dHhfcG93ZXJfb2Zmc2V0W1RYUF9GSVJTVF9DQ0tdOwotCQllbHNlCi0JCQljY2tfb2Zmc2V0ID0gMDsKLQotCQkqY2NrX3B3ciA9ICpvZmRtX3B3ciArIGNja19vZmZzZXQ7Ci0JfSBlbHNlIHsKLQkJKmNja19wd3IgPSAwOwotCQkqb2ZkbV9wd3IgPSAwOwotCX0KLX0KLQotdm9pZCB3bGNfcGh5X2NhbF9pbml0X2xjbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQlyZXR1cm47Ci0KLX0KLQotc3RhdGljIHZvaWQKLXdsY19sY25waHlfc2V0X2NoYW5zcGVjX3R3ZWFrcyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgY2hhbnNwZWNfdCBjaGFuc3BlYykKLXsKLQl1OCBjaGFubmVsID0gQ0hTUEVDX0NIQU5ORUwoY2hhbnNwZWMpOwotCXN0cnVjdCBicmNtc19waHlfbGNucGh5ICpwaV9sY24gPSBwaS0+dS5waV9sY25waHk7Ci0KLQlpZiAoTk9SQURJT19FTkFCKHBpLT5wdWJwaSkpCi0JCXJldHVybjsKLQotCWlmIChjaGFubmVsID09IDE0KSB7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDQ0OCwgKDB4MyA8PCA4KSwgKDIpIDw8IDgpOwotCi0JfSBlbHNlIHsKLQkJbW9kX3BoeV9yZWcocGksIDB4NDQ4LCAoMHgzIDw8IDgpLCAoMSkgPDwgOCk7Ci0KLQl9Ci0JcGlfbGNuLT5sY25waHlfYmFuZGVkZ2VfY29yciA9IDI7Ci0JaWYgKGNoYW5uZWwgPT0gMSkKLQkJcGlfbGNuLT5sY25waHlfYmFuZGVkZ2VfY29yciA9IDQ7Ci0KLQlpZiAoY2hhbm5lbCA9PSAxIHx8IGNoYW5uZWwgPT0gMiB8fCBjaGFubmVsID09IDMgfHwKLQkgICAgY2hhbm5lbCA9PSA0IHx8IGNoYW5uZWwgPT0gOSB8fAotCSAgICBjaGFubmVsID09IDEwIHx8IGNoYW5uZWwgPT0gMTEgfHwgY2hhbm5lbCA9PSAxMikgewotCQlzaV9wbXVfcGxsY29udHJvbChwaS0+c2gtPnNpaCwgMHgyLCAweGZmZmZmZmZmLCAweDAzMDAwYzA0KTsKLQkJc2lfcG11X3BsbGNvbnRyb2wocGktPnNoLT5zaWgsIDB4MywgMHhmZmZmZmYsIDB4MCk7Ci0JCXNpX3BtdV9wbGxjb250cm9sKHBpLT5zaC0+c2loLCAweDQsIDB4ZmZmZmZmZmYsIDB4MjAwMDA1YzApOwotCi0JCXNpX3BtdV9wbGx1cGQocGktPnNoLT5zaWgpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDk0MiwgMCk7Ci0JCXdsY19sY25waHlfdHhyeF9zcHVyX2F2b2lkYW5jZV9tb2RlKHBpLCBmYWxzZSk7Ci0JCXBpX2xjbi0+bGNucGh5X3NwdXJtb2QgPSAwOwotCQltb2RfcGh5X3JlZyhwaSwgMHg0MjQsICgweGZmIDw8IDgpLCAoMHgxYikgPDwgOCk7Ci0KLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg0MjUsIDB4NTkwNyk7Ci0JfSBlbHNlIHsKLQkJc2lfcG11X3BsbGNvbnRyb2wocGktPnNoLT5zaWgsIDB4MiwgMHhmZmZmZmZmZiwgMHgwMzE0MGMwNCk7Ci0JCXNpX3BtdV9wbGxjb250cm9sKHBpLT5zaC0+c2loLCAweDMsIDB4ZmZmZmZmLCAweDMzMzMzMyk7Ci0JCXNpX3BtdV9wbGxjb250cm9sKHBpLT5zaC0+c2loLCAweDQsIDB4ZmZmZmZmZmYsIDB4MjAyYzI4MjApOwotCi0JCXNpX3BtdV9wbGx1cGQocGktPnNoLT5zaWgpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDk0MiwgMCk7Ci0JCXdsY19sY25waHlfdHhyeF9zcHVyX2F2b2lkYW5jZV9tb2RlKHBpLCB0cnVlKTsKLQotCQlwaV9sY24tPmxjbnBoeV9zcHVybW9kID0gMDsKLQkJbW9kX3BoeV9yZWcocGksIDB4NDI0LCAoMHhmZiA8PCA4KSwgKDB4MWYpIDw8IDgpOwotCi0JCXdyaXRlX3BoeV9yZWcocGksIDB4NDI1LCAweDU5MGEpOwotCX0KLQotCW9yX3BoeV9yZWcocGksIDB4NDRhLCAweDQ0KTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDQ0YSwgMHg4MCk7Ci19Ci0KLXZvaWQgd2xjX2xjbnBoeV90eF9wb3dlcl9hZGp1c3RtZW50KHN0cnVjdCBicmNtc19waHlfcHViICpwcGkpCi17Ci0JczggaW5kZXg7Ci0JdTE2IGluZGV4MjsKLQlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBwaTsKLQlzdHJ1Y3QgYnJjbXNfcGh5X2xjbnBoeSAqcGlfbGNuID0gcGktPnUucGlfbGNucGh5OwotCXUxNiBTQVZFX3R4cHdyY3RybCA9IHdsY19sY25waHlfZ2V0X3R4X3B3cl9jdHJsKHBpKTsKLQlpZiAod2xjX2xjbnBoeV90ZW1wc2Vuc2VfYmFzZWRfcHdyX2N0cmxfZW5hYmxlZChwaSkgJiYgU0FWRV90eHB3cmN0cmwpIHsKLQkJaW5kZXggPSB3bGNfbGNucGh5X3RlbXBjb21wZW5zYXRlZF90eHB3cmN0cmwocGkpOwotCQlpbmRleDIgPSAodTE2KSAoaW5kZXggKiAyKTsKLQkJbW9kX3BoeV9yZWcocGksIDB4NGE5LCAoMHgxZmYgPDwgMCksIChpbmRleDIpIDw8IDApOwotCi0JCXBpX2xjbi0+bGNucGh5X2N1cnJlbnRfaW5kZXggPSAoczgpCi0JCSAgICAoKHJlYWRfcGh5X3JlZyhwaSwgMHg0YTkpICYgMHhGRikgLyAyKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHdsY19sY25waHlfc2V0X3J4X2lxX2NvbXAoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBhLCB1MTYgYikKLXsKLQltb2RfcGh5X3JlZyhwaSwgMHg2NDUsICgweDNmZiA8PCAwKSwgKGEpIDw8IDApOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NjQ2LCAoMHgzZmYgPDwgMCksIChiKSA8PCAwKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDY0NywgKDB4M2ZmIDw8IDApLCAoYSkgPDwgMCk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg2NDgsICgweDNmZiA8PCAwKSwgKGIpIDw8IDApOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NjQ5LCAoMHgzZmYgPDwgMCksIChhKSA8PCAwKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDY0YSwgKDB4M2ZmIDw8IDApLCAoYikgPDwgMCk7Ci0KLX0KLQotdm9pZCB3bGNfcGh5X2luaXRfbGNucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXU4IHBoeWJ3NDA7Ci0Jc3RydWN0IGJyY21zX3BoeV9sY25waHkgKnBpX2xjbiA9IHBpLT51LnBpX2xjbnBoeTsKLQlwaHlidzQwID0gQ0hTUEVDX0lTNDAocGktPnJhZGlvX2NoYW5zcGVjKTsKLQotCXBpX2xjbi0+bGNucGh5X2NhbF9jb3VudGVyID0gMDsKLQlwaV9sY24tPmxjbnBoeV9jYWxfdGVtcGVyID0gcGlfbGNuLT5sY25waHlfcmF3dGVtcHNlbnNlOwotCi0Jb3JfcGh5X3JlZyhwaSwgMHg0NGEsIDB4ODApOwotCWFuZF9waHlfcmVnKHBpLCAweDQ0YSwgMHg3Zik7Ci0KLQl3bGNfbGNucGh5X2FmZV9jbGtfaW5pdChwaSwgQUZFX0NMS19JTklUX01PREVfVFhSWDJYKTsKLQotCXdyaXRlX3BoeV9yZWcocGksIDB4NjBhLCAxNjApOwotCi0Jd3JpdGVfcGh5X3JlZyhwaSwgMHg0NmEsIDI1KTsKLQotCXdsY19sY25waHlfYmFzZWJhbmRfaW5pdChwaSk7Ci0KLQl3bGNfbGNucGh5X3JhZGlvX2luaXQocGkpOwotCi0JaWYgKENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykpCi0JCXdsY19sY25waHlfdHhfcHdyX2N0cmxfaW5pdCgoc3RydWN0IGJyY21zX3BoeV9wdWIgKikgcGkpOwotCi0Jd2xjX3BoeV9jaGFuc3BlY19zZXQoKHN0cnVjdCBicmNtc19waHlfcHViICopIHBpLCBwaS0+cmFkaW9fY2hhbnNwZWMpOwotCi0Jc2lfcG11X3JlZ2NvbnRyb2wocGktPnNoLT5zaWgsIDAsIDB4ZiwgMHg5KTsKLQotCXNpX3BtdV9jaGlwY29udHJvbChwaS0+c2gtPnNpaCwgMCwgMHhmZmZmZmZmZiwgMHgwM0NERERERCk7Ci0KLQlpZiAoKHBpLT5zaC0+Ym9hcmRmbGFncyAmIEJGTF9GRU0pCi0JICAgICYmIHdsY19sY25waHlfdGVtcHNlbnNlX2Jhc2VkX3B3cl9jdHJsX2VuYWJsZWQocGkpKQotCQl3bGNfbGNucGh5X3NldF90eF9wd3JfYnlfaW5kZXgocGksIEZJWEVEX1RYUFdSKTsKLQotCXdsY19sY25waHlfYWdjX3RlbXBfaW5pdChwaSk7Ci0KLQl3bGNfbGNucGh5X3RlbXBfYWRqKHBpKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDQ0OCwgKDB4MSA8PCAxNCksICgxKSA8PCAxNCk7Ci0KLQl1ZGVsYXkoMTAwKTsKLQltb2RfcGh5X3JlZyhwaSwgMHg0NDgsICgweDEgPDwgMTQpLCAoMCkgPDwgMTQpOwotCi0Jd2xjX2xjbnBoeV9zZXRfdHhfcHdyX2N0cmwocGksIExDTlBIWV9UWF9QV1JfQ1RSTF9IVyk7Ci0JcGlfbGNuLT5sY25waHlfbm9pc2Vfc2FtcGxlcyA9IExDTlBIWV9OT0lTRV9TQU1QTEVTX0RFRkFVTFQ7Ci0Jd2xjX2xjbnBoeV9jYWxpYl9tb2RlcyhwaSwgUEhZX1BFUklDQUxfUEhZSU5JVCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi13bGNfbGNucGh5X3R4X2lxbG9fbG9vcGJhY2soc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiAqdmFsdWVzX3RvX3NhdmUpCi17Ci0JdTE2IHZtaWQ7Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKLQkJdmFsdWVzX3RvX3NhdmVbaV0gPQotCQkgICAgcmVhZF9yYWRpb19yZWcocGksIGlxbG9fbG9vcGJhY2tfcmZfcmVnc1tpXSk7Ci0JfQotCi0JbW9kX3BoeV9yZWcocGksIDB4NDRjLCAoMHgxIDw8IDEyKSwgMSA8PCAxMik7Ci0JbW9kX3BoeV9yZWcocGksIDB4NDRkLCAoMHgxIDw8IDE0KSwgMSA8PCAxNCk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0NGMsICgweDEgPDwgMTEpLCAxIDw8IDExKTsKLQltb2RfcGh5X3JlZyhwaSwgMHg0NGQsICgweDEgPDwgMTMpLCAwIDw8IDEzKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDQzYiwgKDB4MSA8PCAxKSwgMSA8PCAxKTsKLQltb2RfcGh5X3JlZyhwaSwgMHg0M2MsICgweDEgPDwgMSksIDAgPDwgMSk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0M2IsICgweDEgPDwgMCksIDEgPDwgMCk7Ci0JbW9kX3BoeV9yZWcocGksIDB4NDNjLCAoMHgxIDw8IDApLCAwIDw8IDApOwotCi0JaWYgKExDTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgMikpCi0JCWFuZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDNBLCAweEZEKTsKLQllbHNlCi0JCWFuZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDNBLCAweEY5KTsKLQlvcl9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMTFBLCAweDEpOwotCi0Jb3JfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzAzNiwgMHgwMSk7Ci0Jb3JfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzExQSwgMHgxOCk7Ci0JdWRlbGF5KDIwKTsKLQotCWlmIChMQ05SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDIpKSB7Ci0JCWlmIChDSFNQRUNfSVM1RyhwaS0+cmFkaW9fY2hhbnNwZWMpKQotCQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwM0EsIDEsIDApOwotCQllbHNlCi0JCQlvcl9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDNBLCAxKTsKLQl9IGVsc2UgewotCQlpZiAoQ0hTUEVDX0lTNUcocGktPnJhZGlvX2NoYW5zcGVjKSkKLQkJCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDNBLCAzLCAxKTsKLQkJZWxzZQotCQkJb3JfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzAzQSwgMHgzKTsKLQl9Ci0KLQl1ZGVsYXkoMjApOwotCi0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzAyNSwgMHhGKTsKLQlpZiAoTENOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCAyKSkgewotCQlpZiAoQ0hTUEVDX0lTNUcocGktPnJhZGlvX2NoYW5zcGVjKSkKLQkJCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDI4LCAweEYsIDB4NCk7Ci0JCWVsc2UKLQkJCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDI4LCAweEYsIDB4Nik7Ci0JfSBlbHNlIHsKLQkJaWYgKENIU1BFQ19JUzVHKHBpLT5yYWRpb19jaGFuc3BlYykpCi0JCQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzAyOCwgMHgxZSwgMHg0IDw8IDEpOwotCQllbHNlCi0JCQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzAyOCwgMHgxZSwgMHg2IDw8IDEpOwotCX0KLQotCXVkZWxheSgyMCk7Ci0KLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDA1LCAweDgpOwotCW9yX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcxMTIsIDB4ODApOwotCXVkZWxheSgyMCk7Ci0KLQlvcl9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMEZGLCAweDEwKTsKLQlvcl9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMTFGLCAweDQ0KTsKLQl1ZGVsYXkoMjApOwotCi0Jb3JfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzAwQiwgMHg3KTsKLQlvcl9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMTEzLCAweDEwKTsKLQl1ZGVsYXkoMjApOwotCi0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzAwNywgMHgxKTsKLQl1ZGVsYXkoMjApOwotCi0Jdm1pZCA9IDB4MkE2OwotCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMEZDLCAweDMgPDwgMCwgKHZtaWQgPj4gOCkgJiAweDMpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwRkQsICh2bWlkICYgMHhmZikpOwotCW9yX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcxMUYsIDB4NDQpOwotCXVkZWxheSgyMCk7Ci0KLQlvcl9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMEZGLCAweDEwKTsKLQl1ZGVsYXkoMjApOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwMTIsIDB4MDIpOwotCW9yX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcxMTIsIDB4MDYpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwMzYsIDB4MTEpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwNTksIDB4Y2MpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwNUMsIDB4MmUpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwNzgsIDB4ZDcpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwOTIsIDB4MTUpOwotfQotCi1zdGF0aWMgdm9pZAotd2xjX2xjbnBoeV9zYW1wX2NhcChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgaW50IGNsaXBfZGV0ZWN0X2FsZ28sIHUxNiB0aHJlc2gsCi0JCSAgICBzMTYgKnB0ciwgaW50IG1vZGUpCi17Ci0JdTMyIGN1cnZhbDEsIGN1cnZhbDIsIHN0cHB0ciwgY3VycHRyLCBzdHJwdHIsIHZhbDsKLQl1MTYgc3NscG5DYWxpYkNsa0VuQ3RybCwgdGltZXI7Ci0JdTE2IG9sZF9zc2xwbkNhbGliQ2xrRW5DdHJsOwotCXMxNiBpbWFnLCByZWFsOwotCXN0cnVjdCBicmNtc19waHlfbGNucGh5ICpwaV9sY24gPSBwaS0+dS5waV9sY25waHk7Ci0KLQl0aW1lciA9IDA7Ci0Jb2xkX3NzbHBuQ2FsaWJDbGtFbkN0cmwgPSByZWFkX3BoeV9yZWcocGksIDB4NmRhKTsKLQotCWN1cnZhbDEgPSBSX1JFRygmcGktPnJlZ3MtPnBzbV9jb3JlY3Rsc3RzKTsKLQlwdHJbMTMwXSA9IDA7Ci0JV19SRUcoJnBpLT5yZWdzLT5wc21fY29yZWN0bHN0cywgKCgxIDw8IDYpIHwgY3VydmFsMSkpOwotCi0JV19SRUcoJnBpLT5yZWdzLT5zbXBsX2NsY3Rfc3RycHRyLCAweDdFMDApOwotCVdfUkVHKCZwaS0+cmVncy0+c21wbF9jbGN0X3N0cHB0ciwgMHg4MDAwKTsKLQl1ZGVsYXkoMjApOwotCWN1cnZhbDIgPSBSX1JFRygmcGktPnJlZ3MtPnBzbV9waHlfaGRyX3BhcmFtKTsKLQlXX1JFRygmcGktPnJlZ3MtPnBzbV9waHlfaGRyX3BhcmFtLCBjdXJ2YWwyIHwgMHgzMCk7Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCAweDU1NSwgMHgwKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDVhNiwgMHg1KTsKLQotCXdyaXRlX3BoeV9yZWcocGksIDB4NWEyLCAodTE2KSAobW9kZSB8IG1vZGUgPDwgNikpOwotCXdyaXRlX3BoeV9yZWcocGksIDB4NWNmLCAzKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDVhNSwgMHgzKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDU4MywgMHgwKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDU4NCwgMHgwKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDU4NSwgMHgwZmZmKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDU4NiwgMHgwMDAwKTsKLQotCXdyaXRlX3BoeV9yZWcocGksIDB4NTgwLCAweDQ1MDEpOwotCi0Jc3NscG5DYWxpYkNsa0VuQ3RybCA9IHJlYWRfcGh5X3JlZyhwaSwgMHg2ZGEpOwotCXdyaXRlX3BoeV9yZWcocGksIDB4NmRhLCAodTMyKSAoc3NscG5DYWxpYkNsa0VuQ3RybCB8IDB4MjAwOCkpOwotCXN0cHB0ciA9IFJfUkVHKCZwaS0+cmVncy0+c21wbF9jbGN0X3N0cHB0cik7Ci0JY3VycHRyID0gUl9SRUcoJnBpLT5yZWdzLT5zbXBsX2NsY3RfY3VycHRyKTsKLQlkbyB7Ci0JCXVkZWxheSgxMCk7Ci0JCWN1cnB0ciA9IFJfUkVHKCZwaS0+cmVncy0+c21wbF9jbGN0X2N1cnB0cik7Ci0JCXRpbWVyKys7Ci0JfSB3aGlsZSAoKGN1cnB0ciAhPSBzdHBwdHIpICYmICh0aW1lciA8IDUwMCkpOwotCi0JV19SRUcoJnBpLT5yZWdzLT5wc21fcGh5X2hkcl9wYXJhbSwgMHgyKTsKLQlzdHJwdHIgPSAweDdFMDA7Ci0JV19SRUcoJnBpLT5yZWdzLT50cGxhdGV3cnB0ciwgc3RycHRyKTsKLQl3aGlsZSAoc3RycHRyIDwgMHg4MDAwKSB7Ci0JCXZhbCA9IFJfUkVHKCZwaS0+cmVncy0+dHBsYXRld3JkYXRhKTsKLQkJaW1hZyA9ICgodmFsID4+IDE2KSAmIDB4M2ZmKTsKLQkJcmVhbCA9ICgodmFsKSAmIDB4M2ZmKTsKLQkJaWYgKGltYWcgPiA1MTEpIHsKLQkJCWltYWcgLT0gMTAyNDsKLQkJfQotCQlpZiAocmVhbCA+IDUxMSkgewotCQkJcmVhbCAtPSAxMDI0OwotCQl9Ci0JCWlmIChwaV9sY24tPmxjbnBoeV9pcWNhbF9zd3BfZGlzKQotCQkJcHRyWyhzdHJwdHIgLSAweDdFMDApIC8gNF0gPSByZWFsOwotCQllbHNlCi0JCQlwdHJbKHN0cnB0ciAtIDB4N0UwMCkgLyA0XSA9IGltYWc7Ci0JCWlmIChjbGlwX2RldGVjdF9hbGdvKSB7Ci0JCQlpZiAoaW1hZyA+IHRocmVzaCB8fCBpbWFnIDwgLXRocmVzaCkgewotCQkJCXN0cnB0ciA9IDB4ODAwMDsKLQkJCQlwdHJbMTMwXSA9IDE7Ci0JCQl9Ci0JCX0KLQkJc3RycHRyICs9IDQ7Ci0JfQotCi0Jd3JpdGVfcGh5X3JlZyhwaSwgMHg2ZGEsIG9sZF9zc2xwbkNhbGliQ2xrRW5DdHJsKTsKLQlXX1JFRygmcGktPnJlZ3MtPnBzbV9waHlfaGRyX3BhcmFtLCBjdXJ2YWwyKTsKLQlXX1JFRygmcGktPnJlZ3MtPnBzbV9jb3JlY3Rsc3RzLCBjdXJ2YWwxKTsKLX0KLQotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV90eF9pcWxvX3NvZnRfY2FsX2Z1bGwoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0Jc3RydWN0IGxjbnBoeV91bnNpZ24xNl9zdHJ1Y3QgaXFjYzAsIGxvY2MyLCBsb2NjMywgbG9jYzQ7Ci0KLQl3bGNfbGNucGh5X3NldF9jYyhwaSwgMCwgMCwgMCk7Ci0Jd2xjX2xjbnBoeV9zZXRfY2MocGksIDIsIDAsIDApOwotCXdsY19sY25waHlfc2V0X2NjKHBpLCAzLCAwLCAwKTsKLQl3bGNfbGNucGh5X3NldF9jYyhwaSwgNCwgMCwgMCk7Ci0KLQl3bGNfbGNucGh5X2ExKHBpLCA0LCAwLCAwKTsKLQl3bGNfbGNucGh5X2ExKHBpLCAzLCAwLCAwKTsKLQl3bGNfbGNucGh5X2ExKHBpLCAyLCAzLCAyKTsKLQl3bGNfbGNucGh5X2ExKHBpLCAwLCA1LCA4KTsKLQl3bGNfbGNucGh5X2ExKHBpLCAyLCAyLCAxKTsKLQl3bGNfbGNucGh5X2ExKHBpLCAwLCA0LCAzKTsKLQotCWlxY2MwID0gd2xjX2xjbnBoeV9nZXRfY2MocGksIDApOwotCWxvY2MyID0gd2xjX2xjbnBoeV9nZXRfY2MocGksIDIpOwotCWxvY2MzID0gd2xjX2xjbnBoeV9nZXRfY2MocGksIDMpOwotCWxvY2M0ID0gd2xjX2xjbnBoeV9nZXRfY2MocGksIDQpOwotfQotCi1zdGF0aWMgdm9pZAotd2xjX2xjbnBoeV9zZXRfY2Moc3RydWN0IGJyY21zX3BoeSAqcGksIGludCBjYWxfdHlwZSwgczE2IGNvZWZmX3gsIHMxNiBjb2VmZl95KQotewotCXUxNiBkaTBkcTA7Ci0JdTE2IHgsIHksIGRhdGFfcmY7Ci0JaW50IGs7Ci0Jc3dpdGNoIChjYWxfdHlwZSkgewotCWNhc2UgMDoKLQkJd2xjX2xjbnBoeV9zZXRfdHhfaXFjYyhwaSwgY29lZmZfeCwgY29lZmZfeSk7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJZGkwZHEwID0gKGNvZWZmX3ggJiAweGZmKSA8PCA4IHwgKGNvZWZmX3kgJiAweGZmKTsKLQkJd2xjX2xjbnBoeV9zZXRfdHhfbG9jYyhwaSwgZGkwZHEwKTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQlrID0gd2xjX2xjbnBoeV9jYWxjX2Zsb29yKGNvZWZmX3gsIDApOwotCQl5ID0gOCArIGs7Ci0JCWsgPSB3bGNfbGNucGh5X2NhbGNfZmxvb3IoY29lZmZfeCwgMSk7Ci0JCXggPSA4IC0gazsKLQkJZGF0YV9yZiA9ICh4ICogMTYgKyB5KTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzA4OSwgZGF0YV9yZik7Ci0JCWsgPSB3bGNfbGNucGh5X2NhbGNfZmxvb3IoY29lZmZfeSwgMCk7Ci0JCXkgPSA4ICsgazsKLQkJayA9IHdsY19sY25waHlfY2FsY19mbG9vcihjb2VmZl95LCAxKTsKLQkJeCA9IDggLSBrOwotCQlkYXRhX3JmID0gKHggKiAxNiArIHkpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDhBLCBkYXRhX3JmKTsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlrID0gd2xjX2xjbnBoeV9jYWxjX2Zsb29yKGNvZWZmX3gsIDApOwotCQl5ID0gOCArIGs7Ci0JCWsgPSB3bGNfbGNucGh5X2NhbGNfZmxvb3IoY29lZmZfeCwgMSk7Ci0JCXggPSA4IC0gazsKLQkJZGF0YV9yZiA9ICh4ICogMTYgKyB5KTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzA4QiwgZGF0YV9yZik7Ci0JCWsgPSB3bGNfbGNucGh5X2NhbGNfZmxvb3IoY29lZmZfeSwgMCk7Ci0JCXkgPSA4ICsgazsKLQkJayA9IHdsY19sY25waHlfY2FsY19mbG9vcihjb2VmZl95LCAxKTsKLQkJeCA9IDggLSBrOwotCQlkYXRhX3JmID0gKHggKiAxNiArIHkpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDhDLCBkYXRhX3JmKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IGxjbnBoeV91bnNpZ24xNl9zdHJ1Y3QKLXdsY19sY25waHlfZ2V0X2NjKHN0cnVjdCBicmNtc19waHkgKnBpLCBpbnQgY2FsX3R5cGUpCi17Ci0JdTE2IGEsIGIsIGRpZHE7Ci0JdTggZGkwLCBkcTAsIGVpLCBlcSwgZmksIGZxOwotCXN0cnVjdCBsY25waHlfdW5zaWduMTZfc3RydWN0IGNjOwotCWNjLnJlID0gMDsKLQljYy5pbSA9IDA7Ci0Jc3dpdGNoIChjYWxfdHlwZSkgewotCWNhc2UgMDoKLQkJd2xjX2xjbnBoeV9nZXRfdHhfaXFjYyhwaSwgJmEsICZiKTsKLQkJY2MucmUgPSBhOwotCQljYy5pbSA9IGI7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJZGlkcSA9IHdsY19sY25waHlfZ2V0X3R4X2xvY2MocGkpOwotCQlkaTAgPSAoKChkaWRxICYgMHhmZjAwKSA8PCAxNikgPj4gMjQpOwotCQlkcTAgPSAoKChkaWRxICYgMHgwMGZmKSA8PCAyNCkgPj4gMjQpOwotCQljYy5yZSA9ICh1MTYpIGRpMDsKLQkJY2MuaW0gPSAodTE2KSBkcTA7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJd2xjX2xjbnBoeV9nZXRfcmFkaW9fbG9mdChwaSwgJmVpLCAmZXEsICZmaSwgJmZxKTsKLQkJY2MucmUgPSAodTE2KSBlaTsKLQkJY2MuaW0gPSAodTE2KSBlcTsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQl3bGNfbGNucGh5X2dldF9yYWRpb19sb2Z0KHBpLCAmZWksICZlcSwgJmZpLCAmZnEpOwotCQljYy5yZSA9ICh1MTYpIGZpOwotCQljYy5pbSA9ICh1MTYpIGZxOwotCQlicmVhazsKLQl9Ci0JcmV0dXJuIGNjOwotfQotCi1zdGF0aWMgdm9pZAotd2xjX2xjbnBoeV9hMShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgaW50IGNhbF90eXBlLCBpbnQgbnVtX2xldmVscywKLQkgICAgICBpbnQgc3RlcF9zaXplX2xnMikKLXsKLQljb25zdCBzdHJ1Y3QgbGNucGh5X3NwYl90b25lICpwaHlfYzE7Ci0Jc3RydWN0IGxjbnBoeV9zcGJfdG9uZSBwaHlfYzI7Ci0Jc3RydWN0IGxjbnBoeV91bnNpZ24xNl9zdHJ1Y3QgcGh5X2MzOwotCWludCBwaHlfYzQsIHBoeV9jNSwgaywgbCwgaiwgcGh5X2M2OwotCXUxNiBwaHlfYzcsIHBoeV9jOCwgcGh5X2M5OwotCXMxNiBwaHlfYzEwLCBwaHlfYzExLCBwaHlfYzEyLCBwaHlfYzEzLCBwaHlfYzE0LCBwaHlfYzE1LCBwaHlfYzE2OwotCXMxNiAqcHRyLCBwaHlfYzE3OwotCXMzMiBwaHlfYzE4LCBwaHlfYzE5OwotCXUzMiBwaHlfYzIwLCBwaHlfYzIxOwotCWJvb2wgcGh5X2MyMiwgcGh5X2MyMywgcGh5X2MyNCwgcGh5X2MyNTsKLQl1MTYgcGh5X2MyNiwgcGh5X2MyNzsKLQl1MTYgcGh5X2MyOCwgcGh5X2MyOSwgcGh5X2MzMDsKLQl1MTYgcGh5X2MzMTsKLQl1MTYgKnBoeV9jMzI7Ci0JcGh5X2MyMSA9IDA7Ci0JcGh5X2MxMCA9IHBoeV9jMTMgPSBwaHlfYzE0ID0gcGh5X2M4ID0gMDsKLQlwdHIgPSBrbWFsbG9jKHNpemVvZihzMTYpICogMTMxLCBHRlBfQVRPTUlDKTsKLQlpZiAoTlVMTCA9PSBwdHIpIHsKLQkJcmV0dXJuOwotCX0KLQotCXBoeV9jMzIgPSBrbWFsbG9jKHNpemVvZih1MTYpICogMjAsIEdGUF9BVE9NSUMpOwotCWlmIChOVUxMID09IHBoeV9jMzIpIHsKLQkJa2ZyZWUocHRyKTsKLQkJcmV0dXJuOwotCX0KLQlwaHlfYzI2ID0gcmVhZF9waHlfcmVnKHBpLCAweDZkYSk7Ci0JcGh5X2MyNyA9IHJlYWRfcGh5X3JlZyhwaSwgMHg2ZGIpOwotCXBoeV9jMzEgPSByZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwMjYpOwotCXdyaXRlX3BoeV9yZWcocGksIDB4OTNkLCAweEMwKTsKLQotCXdsY19sY25waHlfc3RhcnRfdHhfdG9uZShwaSwgMzc1MCwgODgsIDApOwotCXdyaXRlX3BoeV9yZWcocGksIDB4NmRhLCAweGZmZmYpOwotCW9yX3BoeV9yZWcocGksIDB4NmRiLCAweDMpOwotCi0Jd2xjX2xjbnBoeV90eF9pcWxvX2xvb3BiYWNrKHBpLCBwaHlfYzMyKTsKLQl1ZGVsYXkoNTAwKTsKLQlwaHlfYzI4ID0gcmVhZF9waHlfcmVnKHBpLCAweDkzOCk7Ci0JcGh5X2MyOSA9IHJlYWRfcGh5X3JlZyhwaSwgMHg0ZDcpOwotCXBoeV9jMzAgPSByZWFkX3BoeV9yZWcocGksIDB4NGQ4KTsKLQlvcl9waHlfcmVnKHBpLCAweDkzOCwgMHgxIDw8IDIpOwotCW9yX3BoeV9yZWcocGksIDB4NGQ3LCAweDEgPDwgMik7Ci0Jb3JfcGh5X3JlZyhwaSwgMHg0ZDcsIDB4MSA8PCAzKTsKLQltb2RfcGh5X3JlZyhwaSwgMHg0ZDcsICgweDcgPDwgMTIpLCAweDIgPDwgMTIpOwotCW9yX3BoeV9yZWcocGksIDB4NGQ4LCAxIDw8IDApOwotCW9yX3BoeV9yZWcocGksIDB4NGQ4LCAxIDw8IDEpOwotCW1vZF9waHlfcmVnKHBpLCAweDRkOCwgKDB4M2ZmIDw8IDIpLCAweDIzQSA8PCAyKTsKLQltb2RfcGh5X3JlZyhwaSwgMHg0ZDgsICgweDcgPDwgMTIpLCAweDcgPDwgMTIpOwotCXBoeV9jMSA9ICZsY25waHlfc3BiX3RvbmVfMzc1MFswXTsKLQlwaHlfYzQgPSAzMjsKLQotCWlmIChudW1fbGV2ZWxzID09IDApIHsKLQkJaWYgKGNhbF90eXBlICE9IDApIHsKLQkJCW51bV9sZXZlbHMgPSA0OwotCQl9IGVsc2UgewotCQkJbnVtX2xldmVscyA9IDk7Ci0JCX0KLQl9Ci0JaWYgKHN0ZXBfc2l6ZV9sZzIgPT0gMCkgewotCQlpZiAoY2FsX3R5cGUgIT0gMCkgewotCQkJc3RlcF9zaXplX2xnMiA9IDM7Ci0JCX0gZWxzZSB7Ci0JCQlzdGVwX3NpemVfbGcyID0gODsKLQkJfQotCX0KLQotCXBoeV9jNyA9ICgxIDw8IHN0ZXBfc2l6ZV9sZzIpOwotCXBoeV9jMyA9IHdsY19sY25waHlfZ2V0X2NjKHBpLCBjYWxfdHlwZSk7Ci0JcGh5X2MxNSA9IChzMTYpIHBoeV9jMy5yZTsKLQlwaHlfYzE2ID0gKHMxNikgcGh5X2MzLmltOwotCWlmIChjYWxfdHlwZSA9PSAyKSB7Ci0JCWlmIChwaHlfYzMucmUgPiAxMjcpCi0JCQlwaHlfYzE1ID0gcGh5X2MzLnJlIC0gMjU2OwotCQlpZiAocGh5X2MzLmltID4gMTI3KQotCQkJcGh5X2MxNiA9IHBoeV9jMy5pbSAtIDI1NjsKLQl9Ci0Jd2xjX2xjbnBoeV9zZXRfY2MocGksIGNhbF90eXBlLCBwaHlfYzE1LCBwaHlfYzE2KTsKLQl1ZGVsYXkoMjApOwotCWZvciAocGh5X2M4ID0gMDsgcGh5X2M3ICE9IDAgJiYgcGh5X2M4IDwgbnVtX2xldmVsczsgcGh5X2M4KyspIHsKLQkJcGh5X2MyMyA9IDE7Ci0JCXBoeV9jMjIgPSAwOwotCQlzd2l0Y2ggKGNhbF90eXBlKSB7Ci0JCWNhc2UgMDoKLQkJCXBoeV9jMTAgPSA1MTE7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCQkJcGh5X2MxMCA9IDEyNzsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQlwaHlfYzEwID0gMTU7Ci0JCQlicmVhazsKLQkJY2FzZSA0OgotCQkJcGh5X2MxMCA9IDE1OwotCQkJYnJlYWs7Ci0JCX0KLQotCQlwaHlfYzkgPSByZWFkX3BoeV9yZWcocGksIDB4OTNkKTsKLQkJcGh5X2M5ID0gMiAqIHBoeV9jOTsKLQkJcGh5X2MyNCA9IDA7Ci0JCXBoeV9jNSA9IDc7Ci0JCXBoeV9jMjUgPSAxOwotCQl3aGlsZSAoMSkgewotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzAyNiwKLQkJCQkJKHBoeV9jNSAmIDB4NykgfCAoKHBoeV9jNSAmIDB4NykgPDwgNCkpOwotCQkJdWRlbGF5KDUwKTsKLQkJCXBoeV9jMjIgPSAwOwotCQkJcHRyWzEzMF0gPSAwOwotCQkJd2xjX2xjbnBoeV9zYW1wX2NhcChwaSwgMSwgcGh5X2M5LCAmcHRyWzBdLCAyKTsKLQkJCWlmIChwdHJbMTMwXSA9PSAxKQotCQkJCXBoeV9jMjIgPSAxOwotCQkJaWYgKHBoeV9jMjIpCi0JCQkJcGh5X2M1IC09IDE7Ci0JCQlpZiAoKHBoeV9jMjIgIT0gcGh5X2MyNCkgJiYgKCFwaHlfYzI1KSkKLQkJCQlicmVhazsKLQkJCWlmICghcGh5X2MyMikKLQkJCQlwaHlfYzUgKz0gMTsKLQkJCWlmIChwaHlfYzUgPD0gMCB8fCBwaHlfYzUgPj0gNykKLQkJCQlicmVhazsKLQkJCXBoeV9jMjQgPSBwaHlfYzIyOwotCQkJcGh5X2MyNSA9IDA7Ci0JCX0KLQotCQlpZiAocGh5X2M1IDwgMCkKLQkJCXBoeV9jNSA9IDA7Ci0JCWVsc2UgaWYgKHBoeV9jNSA+IDcpCi0JCQlwaHlfYzUgPSA3OwotCi0JCWZvciAoayA9IC1waHlfYzc7IGsgPD0gcGh5X2M3OyBrICs9IHBoeV9jNykgewotCQkJZm9yIChsID0gLXBoeV9jNzsgbCA8PSBwaHlfYzc7IGwgKz0gcGh5X2M3KSB7Ci0JCQkJcGh5X2MxMSA9IHBoeV9jMTUgKyBrOwotCQkJCXBoeV9jMTIgPSBwaHlfYzE2ICsgbDsKLQotCQkJCWlmIChwaHlfYzExIDwgLXBoeV9jMTApCi0JCQkJCXBoeV9jMTEgPSAtcGh5X2MxMDsKLQkJCQllbHNlIGlmIChwaHlfYzExID4gcGh5X2MxMCkKLQkJCQkJcGh5X2MxMSA9IHBoeV9jMTA7Ci0JCQkJaWYgKHBoeV9jMTIgPCAtcGh5X2MxMCkKLQkJCQkJcGh5X2MxMiA9IC1waHlfYzEwOwotCQkJCWVsc2UgaWYgKHBoeV9jMTIgPiBwaHlfYzEwKQotCQkJCQlwaHlfYzEyID0gcGh5X2MxMDsKLQkJCQl3bGNfbGNucGh5X3NldF9jYyhwaSwgY2FsX3R5cGUsIHBoeV9jMTEsCi0JCQkJCQkgIHBoeV9jMTIpOwotCQkJCXVkZWxheSgyMCk7Ci0JCQkJd2xjX2xjbnBoeV9zYW1wX2NhcChwaSwgMCwgMCwgcHRyLCAyKTsKLQotCQkJCXBoeV9jMTggPSAwOwotCQkJCXBoeV9jMTkgPSAwOwotCQkJCWZvciAoaiA9IDA7IGogPCAxMjg7IGorKykgewotCQkJCQlpZiAoY2FsX3R5cGUgIT0gMCkgewotCQkJCQkJcGh5X2M2ID0gaiAlIHBoeV9jNDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXBoeV9jNiA9ICgyICogaikgJSBwaHlfYzQ7Ci0JCQkJCX0KLQkJCQkJcGh5X2MyLnJlID0gcGh5X2MxW3BoeV9jNl0ucmU7Ci0JCQkJCXBoeV9jMi5pbSA9IHBoeV9jMVtwaHlfYzZdLmltOwotCQkJCQlwaHlfYzE3ID0gcHRyW2pdOwotCQkJCQlwaHlfYzE4ID0gcGh5X2MxOCArIHBoeV9jMTcgKiBwaHlfYzIucmU7Ci0JCQkJCXBoeV9jMTkgPSBwaHlfYzE5ICsgcGh5X2MxNyAqIHBoeV9jMi5pbTsKLQkJCQl9Ci0KLQkJCQlwaHlfYzE4ID0gcGh5X2MxOCA+PiAxMDsKLQkJCQlwaHlfYzE5ID0gcGh5X2MxOSA+PiAxMDsKLQkJCQlwaHlfYzIwID0KLQkJCQkgICAgKChwaHlfYzE4ICogcGh5X2MxOCkgKyAocGh5X2MxOSAqIHBoeV9jMTkpKTsKLQotCQkJCWlmIChwaHlfYzIzIHx8IHBoeV9jMjAgPCBwaHlfYzIxKSB7Ci0JCQkJCXBoeV9jMjEgPSBwaHlfYzIwOwotCQkJCQlwaHlfYzEzID0gcGh5X2MxMTsKLQkJCQkJcGh5X2MxNCA9IHBoeV9jMTI7Ci0JCQkJfQotCQkJCXBoeV9jMjMgPSAwOwotCQkJfQotCQl9Ci0JCXBoeV9jMjMgPSAxOwotCQlwaHlfYzE1ID0gcGh5X2MxMzsKLQkJcGh5X2MxNiA9IHBoeV9jMTQ7Ci0JCXBoeV9jNyA9IHBoeV9jNyA+PiAxOwotCQl3bGNfbGNucGh5X3NldF9jYyhwaSwgY2FsX3R5cGUsIHBoeV9jMTUsIHBoeV9jMTYpOwotCQl1ZGVsYXkoMjApOwotCX0KLQlnb3RvIGNsZWFudXA7Ci0gY2xlYW51cDoKLQl3bGNfbGNucGh5X3R4X2lxbG9fbG9vcGJhY2tfY2xlYW51cChwaSwgcGh5X2MzMik7Ci0Jd2xjX2xjbnBoeV9zdG9wX3R4X3RvbmUocGkpOwotCXdyaXRlX3BoeV9yZWcocGksIDB4NmRhLCBwaHlfYzI2KTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDZkYiwgcGh5X2MyNyk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHg5MzgsIHBoeV9jMjgpOwotCXdyaXRlX3BoeV9yZWcocGksIDB4NGQ3LCBwaHlfYzI5KTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDRkOCwgcGh5X2MzMCk7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzAyNiwgcGh5X2MzMSk7Ci0KLQlrZnJlZShwaHlfYzMyKTsKLQlrZnJlZShwdHIpOwotfQotCi1zdGF0aWMgdm9pZAotd2xjX2xjbnBoeV90eF9pcWxvX2xvb3BiYWNrX2NsZWFudXAoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiAqdmFsdWVzX3RvX3NhdmUpCi17Ci0JaW50IGk7Ci0KLQlhbmRfcGh5X3JlZyhwaSwgMHg0NGMsIDB4MCA+PiAxMSk7Ci0KLQlhbmRfcGh5X3JlZyhwaSwgMHg0M2IsIDB4Qyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMjA7IGkrKykgewotCQl3cml0ZV9yYWRpb19yZWcocGksIGlxbG9fbG9vcGJhY2tfcmZfcmVnc1tpXSwKLQkJCQl2YWx1ZXNfdG9fc2F2ZVtpXSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotd2xjX2xjbnBoeV9sb2FkX3R4X2dhaW5fdGFibGUoc3RydWN0IGJyY21zX3BoeSAqcGksCi0JCQljb25zdCBzdHJ1Y3QgbGNucGh5X3R4X2dhaW5fdGJsX2VudHJ5ICpnYWluX3RhYmxlKSB7Ci0JdTMyIGo7Ci0Jc3RydWN0IHBoeXRibF9pbmZvIHRhYjsKLQl1MzIgdmFsOwotCXUxNiBwYV9nYWluOwotCXUxNiBnbV9nYWluOwotCi0JaWYgKENIU1BFQ19JUzVHKHBpLT5yYWRpb19jaGFuc3BlYykpCi0JCXBhX2dhaW4gPSAweDcwOwotCWVsc2UKLQkJcGFfZ2FpbiA9IDB4NzA7Ci0KLQlpZiAocGktPnNoLT5ib2FyZGZsYWdzICYgQkZMX0ZFTSkKLQkJcGFfZ2FpbiA9IDB4MTA7Ci0JdGFiLnRibF9pZCA9IExDTlBIWV9UQkxfSURfVFhQV1JDVEw7Ci0JdGFiLnRibF93aWR0aCA9IDMyOwotCXRhYi50YmxfbGVuID0gMTsKLQl0YWIudGJsX3B0ciA9ICZ2YWw7Ci0KLQlmb3IgKGogPSAwOyBqIDwgMTI4OyBqKyspIHsKLQkJZ21fZ2FpbiA9IGdhaW5fdGFibGVbal0uZ207Ci0JCXZhbCA9ICgoKHUzMikgcGFfZ2FpbiA8PCAyNCkgfAotCQkgICAgICAgKGdhaW5fdGFibGVbal0ucGFkIDw8IDE2KSB8Ci0JCSAgICAgICAoZ2Fpbl90YWJsZVtqXS5wZ2EgPDwgOCkgfCBnbV9nYWluKTsKLQotCQl0YWIudGJsX29mZnNldCA9IExDTlBIWV9UWF9QV1JfQ1RSTF9HQUlOX09GRlNFVCArIGo7Ci0JCXdsY19sY25waHlfd3JpdGVfdGFibGUocGksICZ0YWIpOwotCi0JCXZhbCA9IChnYWluX3RhYmxlW2pdLmRhYyA8PCAyOCkgfCAoZ2Fpbl90YWJsZVtqXS5iYl9tdWx0IDw8IDIwKTsKLQkJdGFiLnRibF9vZmZzZXQgPSBMQ05QSFlfVFhfUFdSX0NUUkxfSVFfT0ZGU0VUICsgajsKLQkJd2xjX2xjbnBoeV93cml0ZV90YWJsZShwaSwgJnRhYik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X2xvYWRfcmZwb3dlcihzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQlzdHJ1Y3QgcGh5dGJsX2luZm8gdGFiOwotCXUzMiB2YWwsIGJibXVsdCwgcmZnYWluOwotCXU4IGluZGV4OwotCXU4IHNjYWxlX2ZhY3RvciA9IDE7Ci0JczE2IHRlbXAsIHRlbXAxLCB0ZW1wMiwgcVEsIHFRMSwgcVEyLCBzaGlmdDsKLQotCXRhYi50YmxfaWQgPSBMQ05QSFlfVEJMX0lEX1RYUFdSQ1RMOwotCXRhYi50Ymxfd2lkdGggPSAzMjsKLQl0YWIudGJsX2xlbiA9IDE7Ci0KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAxMjg7IGluZGV4KyspIHsKLQkJdGFiLnRibF9wdHIgPSAmYmJtdWx0OwotCQl0YWIudGJsX29mZnNldCA9IExDTlBIWV9UWF9QV1JfQ1RSTF9JUV9PRkZTRVQgKyBpbmRleDsKLQkJd2xjX2xjbnBoeV9yZWFkX3RhYmxlKHBpLCAmdGFiKTsKLQkJYmJtdWx0ID0gYmJtdWx0ID4+IDIwOwotCi0JCXRhYi50YmxfcHRyID0gJnJmZ2FpbjsKLQkJdGFiLnRibF9vZmZzZXQgPSBMQ05QSFlfVFhfUFdSX0NUUkxfR0FJTl9PRkZTRVQgKyBpbmRleDsKLQkJd2xjX2xjbnBoeV9yZWFkX3RhYmxlKHBpLCAmdGFiKTsKLQotCQlxbV9sb2cxMCgoczMyKSAoYmJtdWx0KSwgMCwgJnRlbXAxLCAmcVExKTsKLQkJcW1fbG9nMTAoKHMzMikgKDEgPDwgNiksIDAsICZ0ZW1wMiwgJnFRMik7Ci0KLQkJaWYgKHFRMSA8IHFRMikgewotCQkJdGVtcDIgPSBxbV9zaHIxNih0ZW1wMiwgcVEyIC0gcVExKTsKLQkJCXFRID0gcVExOwotCQl9IGVsc2UgewotCQkJdGVtcDEgPSBxbV9zaHIxNih0ZW1wMSwgcVExIC0gcVEyKTsKLQkJCXFRID0gcVEyOwotCQl9Ci0JCXRlbXAgPSBxbV9zdWIxNih0ZW1wMSwgdGVtcDIpOwotCi0JCWlmIChxUSA+PSA0KQotCQkJc2hpZnQgPSBxUSAtIDQ7Ci0JCWVsc2UKLQkJCXNoaWZ0ID0gNCAtIHFROwotCi0JCXZhbCA9ICgoKGluZGV4IDw8IHNoaWZ0KSArICg1ICogdGVtcCkgKwotCQkJKDEgPDwgKHNjYWxlX2ZhY3RvciArIHNoaWZ0IC0gMykpKSA+PiAoc2NhbGVfZmFjdG9yICsKLQkJCQkJCQkgICAgICAgc2hpZnQgLSAyKSk7Ci0KLQkJdGFiLnRibF9wdHIgPSAmdmFsOwotCQl0YWIudGJsX29mZnNldCA9IExDTlBIWV9UWF9QV1JfQ1RSTF9QV1JfT0ZGU0VUICsgaW5kZXg7Ci0JCXdsY19sY25waHlfd3JpdGVfdGFibGUocGksICZ0YWIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV90YmxfaW5pdChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQl1aW50IGlkeDsKLQl1OCBwaHlidzQwOwotCXN0cnVjdCBwaHl0YmxfaW5mbyB0YWI7Ci0JdTMyIHZhbDsKLQotCXBoeWJ3NDAgPSBDSFNQRUNfSVM0MChwaS0+cmFkaW9fY2hhbnNwZWMpOwotCi0JZm9yIChpZHggPSAwOyBpZHggPCBkb3QxMWxjbnBoeXRibF9pbmZvX3N6X3JldjA7IGlkeCsrKSB7Ci0JCXdsY19sY25waHlfd3JpdGVfdGFibGUocGksICZkb3QxMWxjbnBoeXRibF9pbmZvX3JldjBbaWR4XSk7Ci0JfQotCi0JaWYgKHBpLT5zaC0+Ym9hcmRmbGFncyAmIEJGTF9GRU1fQlQpIHsKLQkJdGFiLnRibF9pZCA9IExDTlBIWV9UQkxfSURfUkZTRVE7Ci0JCXRhYi50Ymxfd2lkdGggPSAxNjsKLQkJdGFiLnRibF9wdHIgPSAmdmFsOwotCQl0YWIudGJsX2xlbiA9IDE7Ci0JCXZhbCA9IDEwMDsKLQkJdGFiLnRibF9vZmZzZXQgPSA0OwotCQl3bGNfbGNucGh5X3dyaXRlX3RhYmxlKHBpLCAmdGFiKTsKLQl9Ci0KLQl0YWIudGJsX2lkID0gTENOUEhZX1RCTF9JRF9SRlNFUTsKLQl0YWIudGJsX3dpZHRoID0gMTY7Ci0JdGFiLnRibF9wdHIgPSAmdmFsOwotCXRhYi50YmxfbGVuID0gMTsKLQotCXZhbCA9IDExNDsKLQl0YWIudGJsX29mZnNldCA9IDA7Ci0Jd2xjX2xjbnBoeV93cml0ZV90YWJsZShwaSwgJnRhYik7Ci0KLQl2YWwgPSAxMzA7Ci0JdGFiLnRibF9vZmZzZXQgPSAxOwotCXdsY19sY25waHlfd3JpdGVfdGFibGUocGksICZ0YWIpOwotCi0JdmFsID0gNjsKLQl0YWIudGJsX29mZnNldCA9IDg7Ci0Jd2xjX2xjbnBoeV93cml0ZV90YWJsZShwaSwgJnRhYik7Ci0KLQlpZiAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQlpZiAocGktPnNoLT5ib2FyZGZsYWdzICYgQkZMX0ZFTSkKLQkJCXdsY19sY25waHlfbG9hZF90eF9nYWluX3RhYmxlKHBpLAotCQkJCQkJICAgICAgZG90MTFsY25waHlfMkdIel9leHRQQV9nYWludGFibGVfcmV2MCk7Ci0JCWVsc2UKLQkJCXdsY19sY25waHlfbG9hZF90eF9nYWluX3RhYmxlKHBpLAotCQkJCQkJICAgICAgZG90MTFsY25waHlfMkdIel9nYWludGFibGVfcmV2MCk7Ci0JfQotCi0JaWYgKExDTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgMikpIHsKLQkJaWYgKENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCWZvciAoaWR4ID0gMDsKLQkJCSAgICAgaWR4IDwgZG90MTFsY25waHl0YmxfcnhfZ2Fpbl9pbmZvXzJHX3JldjJfc3o7Ci0JCQkgICAgIGlkeCsrKQotCQkJCWlmIChwaS0+c2gtPmJvYXJkZmxhZ3MgJiBCRkxfRVhUTE5BKQotCQkJCQl3bGNfbGNucGh5X3dyaXRlX3RhYmxlKHBpLAotCQkJCQkJCSAgICAgICAmZG90MTFsY25waHl0YmxfcnhfZ2Fpbl9pbmZvX2V4dGxuYV8yR19yZXYyCi0JCQkJCQkJICAgICAgIFtpZHhdKTsKLQkJCQllbHNlCi0JCQkJCXdsY19sY25waHlfd3JpdGVfdGFibGUocGksCi0JCQkJCQkJICAgICAgICZkb3QxMWxjbnBoeXRibF9yeF9nYWluX2luZm9fMkdfcmV2MgotCQkJCQkJCSAgICAgICBbaWR4XSk7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGlkeCA9IDA7Ci0JCQkgICAgIGlkeCA8IGRvdDExbGNucGh5dGJsX3J4X2dhaW5faW5mb181R19yZXYyX3N6OwotCQkJICAgICBpZHgrKykKLQkJCQlpZiAocGktPnNoLT5ib2FyZGZsYWdzICYgQkZMX0VYVExOQV81R0h6KQotCQkJCQl3bGNfbGNucGh5X3dyaXRlX3RhYmxlKHBpLAotCQkJCQkJCSAgICAgICAmZG90MTFsY25waHl0YmxfcnhfZ2Fpbl9pbmZvX2V4dGxuYV81R19yZXYyCi0JCQkJCQkJICAgICAgIFtpZHhdKTsKLQkJCQllbHNlCi0JCQkJCXdsY19sY25waHlfd3JpdGVfdGFibGUocGksCi0JCQkJCQkJICAgICAgICZkb3QxMWxjbnBoeXRibF9yeF9nYWluX2luZm9fNUdfcmV2MgotCQkJCQkJCSAgICAgICBbaWR4XSk7Ci0JCX0KLQl9Ci0KLQlpZiAoKHBpLT5zaC0+Ym9hcmRmbGFncyAmIEJGTF9GRU0pCi0JICAgICYmICEocGktPnNoLT5ib2FyZGZsYWdzICYgQkZMX0ZFTV9CVCkpCi0JCXdsY19sY25waHlfd3JpdGVfdGFibGUocGksICZkb3QxMWxjbl9zd19jdHJsX3RibF9pbmZvXzQzMTNfZXBhKTsKLQllbHNlIGlmIChwaS0+c2gtPmJvYXJkZmxhZ3MgJiBCRkxfRkVNX0JUKSB7Ci0JCWlmIChwaS0+c2gtPmJvYXJkcmV2IDwgMHgxMjUwKQotCQkJd2xjX2xjbnBoeV93cml0ZV90YWJsZShwaSwKLQkJCQkJICAgICAgICZkb3QxMWxjbl9zd19jdHJsX3RibF9pbmZvXzQzMTNfYnRfZXBhKTsKLQkJZWxzZQotCQkJd2xjX2xjbnBoeV93cml0ZV90YWJsZShwaSwKLQkJCQkJICAgICAgICZkb3QxMWxjbl9zd19jdHJsX3RibF9pbmZvXzQzMTNfYnRfZXBhX3AyNTApOwotCX0gZWxzZQotCQl3bGNfbGNucGh5X3dyaXRlX3RhYmxlKHBpLCAmZG90MTFsY25fc3dfY3RybF90YmxfaW5mb180MzEzKTsKLQotCXdsY19sY25waHlfbG9hZF9yZnBvd2VyKHBpKTsKLQotCXdsY19sY25waHlfY2xlYXJfcGFwZF9jb21wdGFibGUocGkpOwotfQotCi1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X3JldjBfYmFzZWJhbmRfaW5pdChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQl1MTYgYWZlY3RybDE7Ci0Jc3RydWN0IGJyY21zX3BoeV9sY25waHkgKnBpX2xjbiA9IHBpLT51LnBpX2xjbnBoeTsKLQotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcxMUMsIDB4MCk7Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCAweDQzYiwgMHgwKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDQzYywgMHgwKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDQ0YywgMHgwKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDRlNiwgMHgwKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDRmOSwgMHgwKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDRiMCwgMHgwKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDkzOCwgMHgwKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDRiMCwgMHgwKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDQ0ZSwgMCk7Ci0KLQlvcl9waHlfcmVnKHBpLCAweDU2NywgMHgwMyk7Ci0KLQlvcl9waHlfcmVnKHBpLCAweDQ0YSwgMHg0NCk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHg0NGEsIDB4ODApOwotCi0JaWYgKCEocGktPnNoLT5ib2FyZGZsYWdzICYgQkZMX0ZFTSkpCi0JCXdsY19sY25waHlfc2V0X3R4X3B3cl9ieV9pbmRleChwaSwgNTIpOwotCi0JaWYgKDApIHsKLQkJYWZlY3RybDEgPSAwOwotCQlhZmVjdHJsMSA9ICh1MTYpICgocGlfbGNuLT5sY25waHlfcnNzaV92ZikgfAotCQkJCSAgICAgKHBpX2xjbi0+bGNucGh5X3Jzc2lfdmMgPDwgNCkgfCAocGlfbGNuLT4KLQkJCQkJCQkJICAgICAgbGNucGh5X3Jzc2lfZ3MKLQkJCQkJCQkJICAgICAgPDwgMTApKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg0M2UsIGFmZWN0cmwxKTsKLQl9Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg2MzQsICgweGZmIDw8IDApLCAweEMgPDwgMCk7Ci0JaWYgKHBpLT5zaC0+Ym9hcmRmbGFncyAmIEJGTF9GRU0pIHsKLQkJbW9kX3BoeV9yZWcocGksIDB4NjM0LCAoMHhmZiA8PCAwKSwgMHhBIDw8IDApOwotCi0JCXdyaXRlX3BoeV9yZWcocGksIDB4OTEwLCAweDEpOwotCX0KLQotCW1vZF9waHlfcmVnKHBpLCAweDQ0OCwgKDB4MyA8PCA4KSwgMSA8PCA4KTsKLQltb2RfcGh5X3JlZyhwaSwgMHg2MDgsICgweGZmIDw8IDApLCAweDE3IDw8IDApOwotCW1vZF9waHlfcmVnKHBpLCAweDYwNCwgKDB4N2ZmIDw8IDApLCAweDNFQSA8PCAwKTsKLQotfQotCi1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X3JldjJfYmFzZWJhbmRfaW5pdChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQlpZiAoQ0hTUEVDX0lTNUcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQltb2RfcGh5X3JlZyhwaSwgMHg0MTYsICgweGZmIDw8IDApLCA4MCA8PCAwKTsKLQotCQltb2RfcGh5X3JlZyhwaSwgMHg0MTYsICgweGZmIDw8IDgpLCA4MCA8PCA4KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHdsY19sY25waHlfYWdjX3RlbXBfaW5pdChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQlzMTYgdGVtcDsKLQlzdHJ1Y3QgcGh5dGJsX2luZm8gdGFiOwotCXUzMiB0YWJsZUJ1ZmZlclsyXTsKLQlzdHJ1Y3QgYnJjbXNfcGh5X2xjbnBoeSAqcGlfbGNuID0gcGktPnUucGlfbGNucGh5OwotCi0JaWYgKE5PUkFESU9fRU5BQihwaS0+cHVicGkpKQotCQlyZXR1cm47Ci0KLQl0ZW1wID0gKHMxNikgcmVhZF9waHlfcmVnKHBpLCAweDRkZik7Ci0JcGlfbGNuLT5sY25waHlfb2ZkbWdhaW5pZHh0YWJsZW9mZnNldCA9ICh0ZW1wICYgKDB4ZmYgPDwgMCkpID4+IDA7Ci0KLQlpZiAocGlfbGNuLT5sY25waHlfb2ZkbWdhaW5pZHh0YWJsZW9mZnNldCA+IDEyNykKLQkJcGlfbGNuLT5sY25waHlfb2ZkbWdhaW5pZHh0YWJsZW9mZnNldCAtPSAyNTY7Ci0KLQlwaV9sY24tPmxjbnBoeV9kc3NzZ2FpbmlkeHRhYmxlb2Zmc2V0ID0gKHRlbXAgJiAoMHhmZiA8PCA4KSkgPj4gODsKLQotCWlmIChwaV9sY24tPmxjbnBoeV9kc3NzZ2FpbmlkeHRhYmxlb2Zmc2V0ID4gMTI3KQotCQlwaV9sY24tPmxjbnBoeV9kc3NzZ2FpbmlkeHRhYmxlb2Zmc2V0IC09IDI1NjsKLQotCXRhYi50YmxfcHRyID0gdGFibGVCdWZmZXI7Ci0JdGFiLnRibF9sZW4gPSAyOwotCXRhYi50YmxfaWQgPSAxNzsKLQl0YWIudGJsX29mZnNldCA9IDU5OwotCXRhYi50Ymxfd2lkdGggPSAzMjsKLQl3bGNfbGNucGh5X3JlYWRfdGFibGUocGksICZ0YWIpOwotCi0JaWYgKHRhYmxlQnVmZmVyWzBdID4gNjMpCi0JCXRhYmxlQnVmZmVyWzBdIC09IDEyODsKLQlwaV9sY24tPmxjbnBoeV90cl9SX2dhaW5fdmFsID0gdGFibGVCdWZmZXJbMF07Ci0KLQlpZiAodGFibGVCdWZmZXJbMV0gPiA2MykKLQkJdGFibGVCdWZmZXJbMV0gLT0gMTI4OwotCXBpX2xjbi0+bGNucGh5X3RyX1RfZ2Fpbl92YWwgPSB0YWJsZUJ1ZmZlclsxXTsKLQotCXRlbXAgPSAoczE2KSAocmVhZF9waHlfcmVnKHBpLCAweDQzNCkKLQkJCSYgKDB4ZmYgPDwgMCkpOwotCWlmICh0ZW1wID4gMTI3KQotCQl0ZW1wIC09IDI1NjsKLQlwaV9sY24tPmxjbnBoeV9pbnB1dF9wd3Jfb2Zmc2V0X2RiID0gKHM4KSB0ZW1wOwotCi0JcGlfbGNuLT5sY25waHlfTWVkX0xvd19HYWluX2RiID0gKHJlYWRfcGh5X3JlZyhwaSwgMHg0MjQpCi0JCQkJCSAgJiAoMHhmZiA8PCA4KSkKLQkgICAgPj4gODsKLQlwaV9sY24tPmxjbnBoeV9WZXJ5X0xvd19HYWluX2RiID0gKHJlYWRfcGh5X3JlZyhwaSwgMHg0MjUpCi0JCQkJCSAgICYgKDB4ZmYgPDwgMCkpCi0JICAgID4+IDA7Ci0KLQl0YWIudGJsX3B0ciA9IHRhYmxlQnVmZmVyOwotCXRhYi50YmxfbGVuID0gMjsKLQl0YWIudGJsX2lkID0gTENOUEhZX1RCTF9JRF9HQUlOX0lEWDsKLQl0YWIudGJsX29mZnNldCA9IDI4OwotCXRhYi50Ymxfd2lkdGggPSAzMjsKLQl3bGNfbGNucGh5X3JlYWRfdGFibGUocGksICZ0YWIpOwotCi0JcGlfbGNuLT5sY25waHlfZ2Fpbl9pZHhfMTRfbG93d29yZCA9IHRhYmxlQnVmZmVyWzBdOwotCXBpX2xjbi0+bGNucGh5X2dhaW5faWR4XzE0X2hpd29yZCA9IHRhYmxlQnVmZmVyWzFdOwotCi19Ci0KLXN0YXRpYyB2b2lkIHdsY19sY25waHlfYnVfdHdlYWtzKHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCWlmIChOT1JBRElPX0VOQUIocGktPnB1YnBpKSkKLQkJcmV0dXJuOwotCi0Jb3JfcGh5X3JlZyhwaSwgMHg4MDUsIDB4MSk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0MmYsICgweDcgPDwgMCksICgweDMpIDw8IDApOwotCi0JbW9kX3BoeV9yZWcocGksIDB4MDMwLCAoMHg3IDw8IDApLCAoMHgzKSA8PCAwKTsKLQotCXdyaXRlX3BoeV9yZWcocGksIDB4NDE0LCAweDFlMTApOwotCXdyaXRlX3BoeV9yZWcocGksIDB4NDE1LCAweDA2NDApOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NGRmLCAoMHhmZiA8PCA4KSwgLTkgPDwgOCk7Ci0KLQlvcl9waHlfcmVnKHBpLCAweDQ0YSwgMHg0NCk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHg0NGEsIDB4ODApOwotCW1vZF9waHlfcmVnKHBpLCAweDQzNCwgKDB4ZmYgPDwgMCksICgweEZEKSA8PCAwKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDQyMCwgKDB4ZmYgPDwgMCksICgxNikgPDwgMCk7Ci0KLQlpZiAoIShwaS0+c2gtPmJvYXJkcmV2IDwgMHgxMjA0KSkKLQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwOUIsIDB4RjAsIDB4RjApOwotCi0Jd3JpdGVfcGh5X3JlZyhwaSwgMHg3ZDYsIDB4MDkwMik7Ci0JbW9kX3BoeV9yZWcocGksIDB4NDI5LCAoMHhmIDw8IDApLCAoMHg5KSA8PCAwKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDQyOSwgKDB4M2YgPDwgNCksICgweGUpIDw8IDQpOwotCi0JaWYgKExDTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgMSkpIHsKLQkJbW9kX3BoeV9yZWcocGksIDB4NDIzLCAoMHhmZiA8PCAwKSwgKDB4NDYpIDw8IDApOwotCi0JCW1vZF9waHlfcmVnKHBpLCAweDQxMSwgKDB4ZmYgPDwgMCksICgxKSA8PCAwKTsKLQotCQltb2RfcGh5X3JlZyhwaSwgMHg0MzQsICgweGZmIDw8IDApLCAoMHhGRikgPDwgMCk7Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4NjU2LCAoMHhmIDw8IDApLCAoMikgPDwgMCk7Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4NDRkLCAoMHgxIDw8IDIpLCAoMSkgPDwgMik7Ci0KLQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwRjcsIDB4NCwgMHg0KTsKLQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwRjEsIDB4MywgMCk7Ci0JCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMEYyLCAweEY4LCAweDkwKTsKLQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwRjMsIDB4MywgMHgyKTsKLQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwRjMsIDB4ZjAsIDB4YTApOwotCi0JCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMTFGLCAweDIsIDB4Mik7Ci0KLQkJd2xjX2xjbnBoeV9jbGVhcl90eF9wb3dlcl9vZmZzZXRzKHBpKTsKLQkJbW9kX3BoeV9yZWcocGksIDB4NGQwLCAoMHgxZmYgPDwgNiksICgxMCkgPDwgNik7Ci0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHdsY19sY25waHlfYmFzZWJhbmRfaW5pdChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQotCXdsY19sY25waHlfdGJsX2luaXQocGkpOwotCXdsY19sY25waHlfcmV2MF9iYXNlYmFuZF9pbml0KHBpKTsKLQlpZiAoTENOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCAyKSkKLQkJd2xjX2xjbnBoeV9yZXYyX2Jhc2ViYW5kX2luaXQocGkpOwotCXdsY19sY25waHlfYnVfdHdlYWtzKHBpKTsKLX0KLQotc3RhdGljIHZvaWQgd2xjX3JhZGlvXzIwNjRfaW5pdChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQl1MzIgaTsKLQlzdHJ1Y3QgbGNucGh5X3JhZGlvX3JlZ3MgKmxjbnBoeXJlZ3MgPSBOVUxMOwotCi0JbGNucGh5cmVncyA9IGxjbnBoeV9yYWRpb19yZWdzXzIwNjQ7Ci0KLQlmb3IgKGkgPSAwOyBsY25waHlyZWdzW2ldLmFkZHJlc3MgIT0gMHhmZmZmOyBpKyspCi0JCWlmIChDSFNQRUNfSVM1RyhwaS0+cmFkaW9fY2hhbnNwZWMpICYmIGxjbnBoeXJlZ3NbaV0uZG9faW5pdF9hKQotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkoKGxjbnBoeXJlZ3NbaV0uYWRkcmVzcyAmIDB4M2ZmZikgfAotCQkJCQkgUkFESU9fREVGQVVMVF9DT1JFKSwKLQkJCQkJKHUxNikgbGNucGh5cmVnc1tpXS5pbml0X2EpOwotCQllbHNlIGlmIChsY25waHlyZWdzW2ldLmRvX2luaXRfZykKLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJKChsY25waHlyZWdzW2ldLmFkZHJlc3MgJiAweDNmZmYpIHwKLQkJCQkJIFJBRElPX0RFRkFVTFRfQ09SRSksCi0JCQkJCSh1MTYpIGxjbnBoeXJlZ3NbaV0uaW5pdF9nKTsKLQotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwMzIsIDB4NjIpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwMzMsIDB4MTkpOwotCi0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzA5MCwgMHgxMCk7Ci0KLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDEwLCAweDAwKTsKLQotCWlmIChMQ05SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDEpKSB7Ci0KLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzA2MCwgMHg3Zik7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwNjEsIDB4NzIpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDYyLCAweDdmKTsKLQl9Ci0KLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDFELCAweDAyKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDFFLCAweDA2KTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRlYSwgKDB4NyA8PCAwKSwgMCA8PCAwKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRlYSwgKDB4NyA8PCAzKSwgMSA8PCAzKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRlYSwgKDB4NyA8PCA2KSwgMiA8PCA2KTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRlYSwgKDB4NyA8PCA5KSwgMyA8PCA5KTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDRlYSwgKDB4NyA8PCAxMiksIDQgPDwgMTIpOwotCi0Jd3JpdGVfcGh5X3JlZyhwaSwgMHg0ZWEsIDB4NDY4OCk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0ZWIsICgweDcgPDwgMCksIDIgPDwgMCk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0ZWIsICgweDcgPDwgNiksIDAgPDwgNik7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHg0NmEsICgweGZmZmYgPDwgMCksIDI1IDw8IDApOwotCi0Jd2xjX2xjbnBoeV9zZXRfdHhfbG9jYyhwaSwgMCk7Ci0KLQl3bGNfbGNucGh5X3JjYWwocGkpOwotCi0Jd2xjX2xjbnBoeV9yY19jYWwocGkpOwotfQotCi1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X3JhZGlvX2luaXQoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JaWYgKE5PUkFESU9fRU5BQihwaS0+cHVicGkpKQotCQlyZXR1cm47Ci0KLQl3bGNfcmFkaW9fMjA2NF9pbml0KHBpKTsKLX0KLQotc3RhdGljIHZvaWQgd2xjX2xjbnBoeV9yY2FsKHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXU4IHJjYWxfdmFsdWU7Ci0KLQlpZiAoTk9SQURJT19FTkFCKHBpLT5wdWJwaSkpCi0JCXJldHVybjsKLQotCWFuZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDVCLCAweGZEKTsKLQotCW9yX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwMDQsIDB4NDApOwotCW9yX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcxMjAsIDB4MTApOwotCi0Jb3JfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzA3OCwgMHg4MCk7Ci0Jb3JfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzEyOSwgMHgwMik7Ci0KLQlvcl9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDU3LCAweDAxKTsKLQotCW9yX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwNUIsIDB4MDIpOwotCW1kZWxheSg1KTsKLQlTUElOV0FJVCghd2xjX3JhZGlvXzIwNjRfcmNhbF9kb25lKHBpKSwgMTAgKiAxMDAwICogMTAwMCk7Ci0KLQlpZiAod2xjX3JhZGlvXzIwNjRfcmNhbF9kb25lKHBpKSkgewotCQlyY2FsX3ZhbHVlID0gKHU4KSByZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwNUMpOwotCQlyY2FsX3ZhbHVlID0gcmNhbF92YWx1ZSAmIDB4MWY7Ci0JfQotCi0JYW5kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwNUIsIDB4ZkQpOwotCi0JYW5kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwNTcsIDB4RkUpOwotfQotCi1zdGF0aWMgdm9pZCB3bGNfbGNucGh5X3JjX2NhbChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQl1OCBkZmx0X3JjX2NhbF92YWw7Ci0JdTE2IGZsdF92YWw7Ci0KLQlpZiAoTk9SQURJT19FTkFCKHBpLT5wdWJwaSkpCi0JCXJldHVybjsKLQotCWRmbHRfcmNfY2FsX3ZhbCA9IDc7Ci0JaWYgKExDTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgMSkpCi0JCWRmbHRfcmNfY2FsX3ZhbCA9IDExOwotCWZsdF92YWwgPQotCSAgICAoZGZsdF9yY19jYWxfdmFsIDw8IDEwKSB8IChkZmx0X3JjX2NhbF92YWwgPDwgNSkgfAotCSAgICAoZGZsdF9yY19jYWxfdmFsKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDkzMywgZmx0X3ZhbCk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHg5MzQsIGZsdF92YWwpOwotCXdyaXRlX3BoeV9yZWcocGksIDB4OTM1LCBmbHRfdmFsKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDkzNiwgZmx0X3ZhbCk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHg5MzcsIChmbHRfdmFsICYgMHgxRkYpKTsKLQotCXJldHVybjsKLX0KLQotc3RhdGljIGJvb2wgd2xjX3BoeV90eHB3cl9zcm9tX3JlYWRfbGNucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXM4IHR4cHdyID0gMDsKLQlpbnQgaTsKLQlzdHJ1Y3QgYnJjbXNfcGh5X2xjbnBoeSAqcGlfbGNuID0gcGktPnUucGlfbGNucGh5OwotCi0JaWYgKENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJdTE2IGNja3BvID0gMDsKLQkJdTMyIG9mZnNldF9vZmRtLCBvZmZzZXRfbWNzOwotCi0JCXBpX2xjbi0+bGNucGh5X3RyX2lzb2xhdGlvbl9taWQgPQotCQkgICAgKHU4KSBQSFlfR0VUSU5UVkFSKHBpLCAidHJpc28yZyIpOwotCi0JCXBpX2xjbi0+bGNucGh5X3J4X3Bvd2VyX29mZnNldCA9Ci0JCSAgICAodTgpIFBIWV9HRVRJTlRWQVIocGksICJyeHBvMmciKTsKLQotCQlwaS0+dHhwYV8yZ1swXSA9IChzMTYpIFBIWV9HRVRJTlRWQVIocGksICJwYTBiMCIpOwotCQlwaS0+dHhwYV8yZ1sxXSA9IChzMTYpIFBIWV9HRVRJTlRWQVIocGksICJwYTBiMSIpOwotCQlwaS0+dHhwYV8yZ1syXSA9IChzMTYpIFBIWV9HRVRJTlRWQVIocGksICJwYTBiMiIpOwotCi0JCXBpX2xjbi0+bGNucGh5X3Jzc2lfdmYgPSAodTgpIFBIWV9HRVRJTlRWQVIocGksICJyc3Npc21mMmciKTsKLQkJcGlfbGNuLT5sY25waHlfcnNzaV92YyA9ICh1OCkgUEhZX0dFVElOVFZBUihwaSwgInJzc2lzbWMyZyIpOwotCQlwaV9sY24tPmxjbnBoeV9yc3NpX2dzID0gKHU4KSBQSFlfR0VUSU5UVkFSKHBpLCAicnNzaXNhdjJnIik7Ci0KLQkJewotCQkJcGlfbGNuLT5sY25waHlfcnNzaV92Zl9sb3d0ZW1wID0gcGlfbGNuLT5sY25waHlfcnNzaV92ZjsKLQkJCXBpX2xjbi0+bGNucGh5X3Jzc2lfdmNfbG93dGVtcCA9IHBpX2xjbi0+bGNucGh5X3Jzc2lfdmM7Ci0JCQlwaV9sY24tPmxjbnBoeV9yc3NpX2dzX2xvd3RlbXAgPSBwaV9sY24tPmxjbnBoeV9yc3NpX2dzOwotCi0JCQlwaV9sY24tPmxjbnBoeV9yc3NpX3ZmX2hpZ2h0ZW1wID0KLQkJCSAgICBwaV9sY24tPmxjbnBoeV9yc3NpX3ZmOwotCQkJcGlfbGNuLT5sY25waHlfcnNzaV92Y19oaWdodGVtcCA9Ci0JCQkgICAgcGlfbGNuLT5sY25waHlfcnNzaV92YzsKLQkJCXBpX2xjbi0+bGNucGh5X3Jzc2lfZ3NfaGlnaHRlbXAgPQotCQkJICAgIHBpX2xjbi0+bGNucGh5X3Jzc2lfZ3M7Ci0JCX0KLQotCQl0eHB3ciA9IChzOCkgUEhZX0dFVElOVFZBUihwaSwgIm1heHAyZ2EwIik7Ci0JCXBpLT50eF9zcm9tX21heF8yZyA9IHR4cHdyOwotCi0JCWZvciAoaSA9IDA7IGkgPCBQV1JUQkxfTlVNX0NPRUZGOyBpKyspIHsKLQkJCXBpLT50eHBhXzJnX2xvd190ZW1wW2ldID0gcGktPnR4cGFfMmdbaV07Ci0JCQlwaS0+dHhwYV8yZ19oaWdoX3RlbXBbaV0gPSBwaS0+dHhwYV8yZ1tpXTsKLQkJfQotCi0JCWNja3BvID0gKHUxNikgUEhZX0dFVElOVFZBUihwaSwgImNjazJncG8iKTsKLQkJaWYgKGNja3BvKSB7Ci0JCQl1aW50IG1heF9wd3JfY2hhbiA9IHR4cHdyOwotCi0JCQlmb3IgKGkgPSBUWFBfRklSU1RfQ0NLOyBpIDw9IFRYUF9MQVNUX0NDSzsgaSsrKSB7Ci0JCQkJcGktPnR4X3Nyb21fbWF4X3JhdGVfMmdbaV0gPSBtYXhfcHdyX2NoYW4gLQotCQkJCSAgICAoKGNja3BvICYgMHhmKSAqIDIpOwotCQkJCWNja3BvID4+PSA0OwotCQkJfQotCi0JCQlvZmZzZXRfb2ZkbSA9ICh1MzIpIFBIWV9HRVRJTlRWQVIocGksICJvZmRtMmdwbyIpOwotCQkJZm9yIChpID0gVFhQX0ZJUlNUX09GRE07IGkgPD0gVFhQX0xBU1RfT0ZETTsgaSsrKSB7Ci0JCQkJcGktPnR4X3Nyb21fbWF4X3JhdGVfMmdbaV0gPSBtYXhfcHdyX2NoYW4gLQotCQkJCSAgICAoKG9mZnNldF9vZmRtICYgMHhmKSAqIDIpOwotCQkJCW9mZnNldF9vZmRtID4+PSA0OwotCQkJfQotCQl9IGVsc2UgewotCQkJdTggb3BvID0gMDsKLQotCQkJb3BvID0gKHU4KSBQSFlfR0VUSU5UVkFSKHBpLCAib3BvIik7Ci0KLQkJCWZvciAoaSA9IFRYUF9GSVJTVF9DQ0s7IGkgPD0gVFhQX0xBU1RfQ0NLOyBpKyspIHsKLQkJCQlwaS0+dHhfc3JvbV9tYXhfcmF0ZV8yZ1tpXSA9IHR4cHdyOwotCQkJfQotCi0JCQlvZmZzZXRfb2ZkbSA9ICh1MzIpIFBIWV9HRVRJTlRWQVIocGksICJvZmRtMmdwbyIpOwotCi0JCQlmb3IgKGkgPSBUWFBfRklSU1RfT0ZETTsgaSA8PSBUWFBfTEFTVF9PRkRNOyBpKyspIHsKLQkJCQlwaS0+dHhfc3JvbV9tYXhfcmF0ZV8yZ1tpXSA9IHR4cHdyIC0KLQkJCQkgICAgKChvZmZzZXRfb2ZkbSAmIDB4ZikgKiAyKTsKLQkJCQlvZmZzZXRfb2ZkbSA+Pj0gNDsKLQkJCX0KLQkJCW9mZnNldF9tY3MgPQotCQkJICAgICgodTE2KSBQSFlfR0VUSU5UVkFSKHBpLCAibWNzMmdwbzEiKSA8PCAxNikgfAotCQkJICAgICh1MTYpIFBIWV9HRVRJTlRWQVIocGksICJtY3MyZ3BvMCIpOwotCQkJcGlfbGNuLT5sY25waHlfbWNzMjBfcG8gPSBvZmZzZXRfbWNzOwotCQkJZm9yIChpID0gVFhQX0ZJUlNUX1NJU09fTUNTXzIwOwotCQkJICAgICBpIDw9IFRYUF9MQVNUX1NJU09fTUNTXzIwOyBpKyspIHsKLQkJCQlwaS0+dHhfc3JvbV9tYXhfcmF0ZV8yZ1tpXSA9Ci0JCQkJICAgIHR4cHdyIC0gKChvZmZzZXRfbWNzICYgMHhmKSAqIDIpOwotCQkJCW9mZnNldF9tY3MgPj49IDQ7Ci0JCQl9Ci0JCX0KLQotCQlwaV9sY24tPmxjbnBoeV9yYXd0ZW1wc2Vuc2UgPQotCQkgICAgKHUxNikgUEhZX0dFVElOVFZBUihwaSwgInJhd3RlbXBzZW5zZSIpOwotCQlwaV9sY24tPmxjbnBoeV9tZWFzUG93ZXIgPQotCQkgICAgKHU4KSBQSFlfR0VUSU5UVkFSKHBpLCAibWVhc3Bvd2VyIik7Ci0JCXBpX2xjbi0+bGNucGh5X3RlbXBzZW5zZV9zbG9wZSA9Ci0JCSAgICAodTgpIFBIWV9HRVRJTlRWQVIocGksICJ0ZW1wc2Vuc2Vfc2xvcGUiKTsKLQkJcGlfbGNuLT5sY25waHlfaHdfaXFjYWxfZW4gPQotCQkgICAgKGJvb2wpIFBIWV9HRVRJTlRWQVIocGksICJod19pcWNhbF9lbiIpOwotCQlwaV9sY24tPmxjbnBoeV9pcWNhbF9zd3BfZGlzID0KLQkJICAgIChib29sKSBQSFlfR0VUSU5UVkFSKHBpLCAiaXFjYWxfc3dwX2RpcyIpOwotCQlwaV9sY24tPmxjbnBoeV90ZW1wY29ycnggPQotCQkgICAgKHU4KSBQSFlfR0VUSU5UVkFSKHBpLCAidGVtcGNvcnJ4Iik7Ci0JCXBpX2xjbi0+bGNucGh5X3RlbXBzZW5zZV9vcHRpb24gPQotCQkgICAgKHU4KSBQSFlfR0VUSU5UVkFSKHBpLCAidGVtcHNlbnNlX29wdGlvbiIpOwotCQlwaV9sY24tPmxjbnBoeV9mcmVxb2Zmc2V0X2NvcnIgPQotCQkgICAgKHU4KSBQSFlfR0VUSU5UVkFSKHBpLCAiZnJlcW9mZnNldF9jb3JyIik7Ci0JCWlmICgodTgpIGdldGludHZhcihwaS0+dmFycywgImFhMmciKSA+IDEpCi0JCQl3bGNfcGh5X2FudF9yeGRpdl9zZXQoKHN0cnVjdCBicmNtc19waHlfcHViICopIHBpLAotCQkJCQkgICAgICAodTgpIGdldGludHZhcihwaS0+dmFycywKLQkJCQkJCQkJImFhMmciKSk7Ci0JfQotCXBpX2xjbi0+bGNucGh5X2Nja19kaWdfZmlsdF90eXBlID0gLTE7Ci0JaWYgKFBIWV9HRVRWQVIocGksICJjY2tkaWdmaWx0dHlwZSIpKSB7Ci0JCXMxNiB0ZW1wOwotCQl0ZW1wID0gKHMxNikgUEhZX0dFVElOVFZBUihwaSwgImNja2RpZ2ZpbHR0eXBlIik7Ci0JCWlmICh0ZW1wID49IDApIHsKLQkJCXBpX2xjbi0+bGNucGh5X2Nja19kaWdfZmlsdF90eXBlID0gdGVtcDsKLQkJfQotCX0KLQotCXJldHVybiB0cnVlOwotfQotCi12b2lkIHdsY18yMDY0X3Zjb19jYWwoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JdTggY2FsbnJzdDsKLQotCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDU3LCAxIDw8IDMsIDEgPDwgMyk7Ci0JY2FsbnJzdCA9ICh1OCkgcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDU2KSAmIDB4Zjg7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzA1NiwgY2FsbnJzdCk7Ci0JdWRlbGF5KDEpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwNTYsIGNhbG5yc3QgfCAweDAzKTsKLQl1ZGVsYXkoMSk7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzA1NiwgY2FsbnJzdCB8IDB4MDcpOwotCXVkZWxheSgzMDApOwotCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDU3LCAxIDw8IDMsIDApOwotfQotCi1zdGF0aWMgdm9pZAotd2xjX2xjbnBoeV9yYWRpb18yMDY0X2NoYW5uZWxfdHVuZV80MzEzKHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCBjaGFubmVsKQotewotCXVpbnQgaTsKLQljb25zdCBzdHJ1Y3QgY2hhbl9pbmZvXzIwNjRfbGNucGh5ICpjaTsKLQl1OCByZnBsbF9kb3VibGVyID0gMDsKLQl1OCBwbGxfcHdydXAsIHBsbF9wd3J1cF9vdnI7Ci0JZml4ZWQgcUZ4dGFsLCBxRnJlZiwgcUZ2Y28sIHFGY2FsOwotCXU4IGQxNSwgZDE2LCBmMTYsIGU0NCwgZTQ1OwotCXUzMiBkaXZfaW50LCBkaXZfZnJhYywgZnZjbzMsIGZwZmQsIGZyZWYzLCBmY2FsX2RpdjsKLQl1MTYgbG9vcF9idywgZDMwLCBzZXRDb3VudDsKLQlpZiAoTk9SQURJT19FTkFCKHBpLT5wdWJwaSkpCi0JCXJldHVybjsKLQljaSA9ICZjaGFuX2luZm9fMjA2NF9sY25waHlbMF07Ci0JcmZwbGxfZG91YmxlciA9IDE7Ci0KLQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzA5RCwgMHg0LCAweDEgPDwgMik7Ci0KLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDlFLCAweGYpOwotCWlmICghcmZwbGxfZG91YmxlcikgewotCQlsb29wX2J3ID0gUExMXzIwNjRfTE9PUF9CVzsKLQkJZDMwID0gUExMXzIwNjRfRDMwOwotCX0gZWxzZSB7Ci0JCWxvb3BfYncgPSBQTExfMjA2NF9MT09QX0JXX0RPVUJMRVI7Ci0JCWQzMCA9IFBMTF8yMDY0X0QzMF9ET1VCTEVSOwotCX0KLQotCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNoYW5faW5mb18yMDY0X2xjbnBoeSk7IGkrKykKLQkJCWlmIChjaGFuX2luZm9fMjA2NF9sY25waHlbaV0uY2hhbiA9PSBjaGFubmVsKQotCQkJCWJyZWFrOwotCi0JCWlmIChpID49IEFSUkFZX1NJWkUoY2hhbl9pbmZvXzIwNjRfbGNucGh5KSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJY2kgPSAmY2hhbl9pbmZvXzIwNjRfbGNucGh5W2ldOwotCX0KLQotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwMkEsIGNpLT5sb2dlbl9idWZ0dW5lKTsKLQotCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDMwLCAweDMsIGNpLT5sb2dlbl9yY2NyX3R4KTsKLQotCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDkxLCAweDMsIGNpLT50eHJmX21peF90dW5lX2N0cmwpOwotCi0JbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwMzgsIDB4ZiwgY2ktPnBhX2lucHV0X3R1bmVfZyk7Ci0KLQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzAzMCwgMHgzIDw8IDIsCi0JCSAgICAgIChjaS0+bG9nZW5fcmNjcl9yeCkgPDwgMik7Ci0KLQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzA1RSwgMHhmLCBjaS0+cGFfcnhyZl9sbmExX2ZyZXFfdHVuZSk7Ci0KLQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzA1RSwgKDB4ZikgPDwgNCwKLQkJICAgICAgKGNpLT5wYV9yeHJmX2xuYTJfZnJlcV90dW5lKSA8PCA0KTsKLQotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwNkMsIGNpLT5yeHJmX3J4cmZfc3BhcmUxKTsKLQotCXBsbF9wd3J1cCA9ICh1OCkgcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDQ0KTsKLQlwbGxfcHdydXBfb3ZyID0gKHU4KSByZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcxMkIpOwotCi0Jb3JfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzA0NCwgMHgwNyk7Ci0KLQlvcl9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMTJCLCAoMHgwNykgPDwgMSk7Ci0JZTQ0ID0gMDsKLQllNDUgPSAwOwotCi0JZnBmZCA9IHJmcGxsX2RvdWJsZXIgPyAocGktPnh0YWxmcmVxIDw8IDEpIDogKHBpLT54dGFsZnJlcSk7Ci0JaWYgKHBpLT54dGFsZnJlcSA+IDI2MDAwMDAwKQotCQllNDQgPSAxOwotCWlmIChwaS0+eHRhbGZyZXEgPiA1MjAwMDAwMCkKLQkJZTQ1ID0gMTsKLQlpZiAoZTQ0ID09IDApCi0JCWZjYWxfZGl2ID0gMTsKLQllbHNlIGlmIChlNDUgPT0gMCkKLQkJZmNhbF9kaXYgPSAyOwotCWVsc2UKLQkJZmNhbF9kaXYgPSA0OwotCWZ2Y28zID0gKGNpLT5mcmVxICogMyk7Ci0JZnJlZjMgPSAyICogZnBmZDsKLQotCXFGeHRhbCA9IHdsY19sY25waHlfcWRpdl9yb3VuZHVwKHBpLT54dGFsZnJlcSwgUExMXzIwNjRfTUhaLCAxNik7Ci0JcUZyZWYgPSB3bGNfbGNucGh5X3FkaXZfcm91bmR1cChmcGZkLCBQTExfMjA2NF9NSFosIDE2KTsKLQlxRmNhbCA9IHBpLT54dGFsZnJlcSAqIGZjYWxfZGl2IC8gUExMXzIwNjRfTUhaOwotCXFGdmNvID0gd2xjX2xjbnBoeV9xZGl2X3JvdW5kdXAoZnZjbzMsIDIsIDE2KTsKLQotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwNEYsIDB4MDIpOwotCi0JZDE1ID0gKHBpLT54dGFsZnJlcSAqIGZjYWxfZGl2ICogNCAvIDUpIC8gUExMXzIwNjRfTUhaIC0gMTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDUyLCAoMHgwNyAmIChkMTUgPj4gMikpKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDUzLCAoZDE1ICYgMHgzKSA8PCA1KTsKLQotCWQxNiA9IChxRmNhbCAqIDggLyAoZDE1ICsgMSkpIC0gMTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDUxLCBkMTYpOwotCi0JZjE2ID0gKChkMTYgKyAxKSAqIChkMTUgKyAxKSkgLyBxRmNhbDsKLQlzZXRDb3VudCA9IGYxNiAqIDMgKiAoY2ktPmZyZXEpIC8gMzIgLSAxOwotCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDUzLCAoMHgwZiA8PCAwKSwKLQkJICAgICAgKHU4KSAoc2V0Q291bnQgPj4gOCkpOwotCi0Jb3JfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzA1MywgMHgxMCk7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzA1NCwgKHU4KSAoc2V0Q291bnQgJiAweGZmKSk7Ci0KLQlkaXZfaW50ID0gKChmdmNvMyAqIChQTExfMjA2NF9NSFogPj4gNCkpIC8gZnJlZjMpIDw8IDQ7Ci0KLQlkaXZfZnJhYyA9ICgoZnZjbzMgKiAoUExMXzIwNjRfTUhaID4+IDQpKSAlIGZyZWYzKSA8PCA0OwotCXdoaWxlIChkaXZfZnJhYyA+PSBmcmVmMykgewotCQlkaXZfaW50Kys7Ci0JCWRpdl9mcmFjIC09IGZyZWYzOwotCX0KLQlkaXZfZnJhYyA9IHdsY19sY25waHlfcWRpdl9yb3VuZHVwKGRpdl9mcmFjLCBmcmVmMywgMjApOwotCi0JbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwNDUsICgweDFmIDw8IDApLAotCQkgICAgICAodTgpIChkaXZfaW50ID4+IDQpKTsKLQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzA0NiwgKDB4MWYgPDwgNCksCi0JCSAgICAgICh1OCkgKGRpdl9pbnQgPDwgNCkpOwotCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDQ2LCAoMHgwZiA8PCAwKSwKLQkJICAgICAgKHU4KSAoZGl2X2ZyYWMgPj4gMTYpKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDQ3LCAodTgpIChkaXZfZnJhYyA+PiA4KSAmIDB4ZmYpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwNDgsICh1OCkgZGl2X2ZyYWMgJiAweGZmKTsKLQotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwNDAsIDB4ZmIpOwotCi0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzA0MSwgMHg5QSk7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzA0MiwgMHhBMyk7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzA0MywgMHgwQyk7Ci0KLQl7Ci0JCXU4IGgyOSwgaDIzLCBjMjgsIGQyOSwgaDI4X3RlbiwgZTMwLCBoMzBfdGVuLCBjcF9jdXJyZW50OwotCQl1MTYgYzI5LCBjMzgsIGMzMCwgZzMwLCBkMjg7Ci0JCWMyOSA9IGxvb3BfYnc7Ci0JCWQyOSA9IDIwMDsKLQkJYzM4ID0gMTI1MDsKLQkJaDI5ID0gZDI5IC8gYzI5OwotCQloMjMgPSAxOwotCQljMjggPSAzMDsKLQkJZDI4ID0gKCgoUExMXzIwNjRfSElHSF9FTkRfS1ZDTyAtIFBMTF8yMDY0X0xPV19FTkRfS1ZDTykgKgotCQkJKGZ2Y28zIC8gMiAtIFBMTF8yMDY0X0xPV19FTkRfVkNPKSkgLwotCQkgICAgICAgKFBMTF8yMDY0X0hJR0hfRU5EX1ZDTyAtIFBMTF8yMDY0X0xPV19FTkRfVkNPKSkKLQkJICAgICsgUExMXzIwNjRfTE9XX0VORF9LVkNPOwotCQloMjhfdGVuID0gKGQyOCAqIDEwKSAvIGMyODsKLQkJYzMwID0gMjY0MDsKLQkJZTMwID0gKGQzMCAtIDY4MCkgLyA0OTA7Ci0JCWczMCA9IDY4MCArIChlMzAgKiA0OTApOwotCQloMzBfdGVuID0gKGczMCAqIDEwKSAvIGMzMDsKLQkJY3BfY3VycmVudCA9ICgoYzM4ICogaDI5ICogaDIzICogMTAwKSAvIGgyOF90ZW4pIC8gaDMwX3RlbjsKLQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwM0MsIDB4M2YsIGNwX2N1cnJlbnQpOwotCX0KLQlpZiAoY2hhbm5lbCA+PSAxICYmIGNoYW5uZWwgPD0gNSkKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzAzQywgMHg4KTsKLQllbHNlCi0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwM0MsIDB4Nyk7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzAzRCwgMHgzKTsKLQotCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMDQ0LCAweDBjLCAweDBjKTsKLQl1ZGVsYXkoMSk7Ci0KLQl3bGNfMjA2NF92Y29fY2FsKHBpKTsKLQotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwNDQsIHBsbF9wd3J1cCk7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzEyQiwgcGxsX3B3cnVwX292cik7Ci0JaWYgKExDTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgMSkpIHsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzAzOCwgMyk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA2NF9SRUcwOTEsIDcpOwotCX0KLX0KLQotYm9vbCB3bGNfcGh5X3RwY19pc2VuYWJsZWRfbGNucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCWlmICh3bGNfbGNucGh5X3RlbXBzZW5zZV9iYXNlZF9wd3JfY3RybF9lbmFibGVkKHBpKSkKLQkJcmV0dXJuIDA7Ci0JZWxzZQotCQlyZXR1cm4gKExDTlBIWV9UWF9QV1JfQ1RSTF9IVyA9PQotCQkJd2xjX2xjbnBoeV9nZXRfdHhfcHdyX2N0cmwoKHBpKSkpOwotfQotCi12b2lkIHdsY19waHlfdHhwb3dlcl9yZWNhbGNfdGFyZ2V0X2xjbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQl1MTYgcHdyX2N0cmw7Ci0JaWYgKHdsY19sY25waHlfdGVtcHNlbnNlX2Jhc2VkX3B3cl9jdHJsX2VuYWJsZWQocGkpKSB7Ci0JCXdsY19sY25waHlfY2FsaWJfbW9kZXMocGksIExDTlBIWV9QRVJJQ0FMX1RFTVBCQVNFRF9UWFBXUkNUUkwpOwotCX0gZWxzZSBpZiAod2xjX2xjbnBoeV90c3NpX2Jhc2VkX3B3cl9jdHJsX2VuYWJsZWQocGkpKSB7Ci0KLQkJcHdyX2N0cmwgPSB3bGNfbGNucGh5X2dldF90eF9wd3JfY3RybChwaSk7Ci0JCXdsY19sY25waHlfc2V0X3R4X3B3cl9jdHJsKHBpLCBMQ05QSFlfVFhfUFdSX0NUUkxfT0ZGKTsKLQkJd2xjX2xjbnBoeV90eHBvd2VyX3JlY2FsY190YXJnZXQocGkpOwotCi0JCXdsY19sY25waHlfc2V0X3R4X3B3cl9jdHJsKHBpLCBwd3JfY3RybCk7Ci0JfSBlbHNlCi0JCXJldHVybjsKLX0KLQotdm9pZCB3bGNfcGh5X2RldGFjaF9sY25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0Ja2ZyZWUocGktPnUucGlfbGNucGh5KTsKLX0KLQotYm9vbCB3bGNfcGh5X2F0dGFjaF9sY25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0Jc3RydWN0IGJyY21zX3BoeV9sY25waHkgKnBpX2xjbjsKLQotCXBpLT51LnBpX2xjbnBoeSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicmNtc19waHlfbGNucGh5KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHBpLT51LnBpX2xjbnBoeSA9PSBOVUxMKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwaV9sY24gPSBwaS0+dS5waV9sY25waHk7Ci0KLQlpZiAoKDAgPT0gKHBpLT5zaC0+Ym9hcmRmbGFncyAmIEJGTF9OT1BBKSkgJiYgIU5PUkFESU9fRU5BQihwaS0+cHVicGkpKSB7Ci0JCXBpLT5od3B3cmN0cmwgPSB0cnVlOwotCQlwaS0+aHdwd3JjdHJsX2NhcGFibGUgPSB0cnVlOwotCX0KLQotCXBpLT54dGFsZnJlcSA9IHNpX3BtdV9hbHBfY2xvY2socGktPnNoLT5zaWgpOwotCXBpX2xjbi0+bGNucGh5X3BhcGRfcnhHbkN0cmxfaW5pdCA9IDA7Ci0KLQlwaS0+cGlfZnB0ci5pbml0ID0gd2xjX3BoeV9pbml0X2xjbnBoeTsKLQlwaS0+cGlfZnB0ci5jYWxpbml0ID0gd2xjX3BoeV9jYWxfaW5pdF9sY25waHk7Ci0JcGktPnBpX2ZwdHIuY2hhbnNldCA9IHdsY19waHlfY2hhbnNwZWNfc2V0X2xjbnBoeTsKLQlwaS0+cGlfZnB0ci50eHB3cnJlY2FsYyA9IHdsY19waHlfdHhwb3dlcl9yZWNhbGNfdGFyZ2V0X2xjbnBoeTsKLQlwaS0+cGlfZnB0ci50eGlxY2NnZXQgPSB3bGNfbGNucGh5X2dldF90eF9pcWNjOwotCXBpLT5waV9mcHRyLnR4aXFjY3NldCA9IHdsY19sY25waHlfc2V0X3R4X2lxY2M7Ci0JcGktPnBpX2ZwdHIudHhsb2NjZ2V0ID0gd2xjX2xjbnBoeV9nZXRfdHhfbG9jYzsKLQlwaS0+cGlfZnB0ci5yYWRpb2xvZnRnZXQgPSB3bGNfbGNucGh5X2dldF9yYWRpb19sb2Z0OwotCXBpLT5waV9mcHRyLmRldGFjaCA9IHdsY19waHlfZGV0YWNoX2xjbnBoeTsKLQotCWlmICghd2xjX3BoeV90eHB3cl9zcm9tX3JlYWRfbGNucGh5KHBpKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaWYgKChwaS0+c2gtPmJvYXJkZmxhZ3MgJiBCRkxfRkVNKSAmJiAoTENOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCAxKSkpIHsKLQkJaWYgKHBpX2xjbi0+bGNucGh5X3RlbXBzZW5zZV9vcHRpb24gPT0gMykgewotCQkJcGktPmh3cHdyY3RybCA9IHRydWU7Ci0JCQlwaS0+aHdwd3JjdHJsX2NhcGFibGUgPSB0cnVlOwotCQkJcGktPnRlbXBwd3JjdHJsX2NhcGFibGUgPSBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCXBpLT5od3B3cmN0cmwgPSBmYWxzZTsKLQkJCXBpLT5od3B3cmN0cmxfY2FwYWJsZSA9IGZhbHNlOwotCQkJcGktPnRlbXBwd3JjdHJsX2NhcGFibGUgPSB0cnVlOwotCQl9Ci0JfQotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsY19sY25waHlfc2V0X3J4X2dhaW4oc3RydWN0IGJyY21zX3BoeSAqcGksIHUzMiBnYWluKQotewotCXUxNiB0cnN3LCBleHRfbG5hLCBsbmExLCBsbmEyLCB0aWEsIGJpcTAsIGJpcTEsIGdhaW4wXzE1LCBnYWluMTZfMTk7Ci0KLQl0cnN3ID0gKGdhaW4gJiAoKHUzMikgMSA8PCAyOCkpID8gMCA6IDE7Ci0JZXh0X2xuYSA9ICh1MTYpIChnYWluID4+IDI5KSAmIDB4MDE7Ci0JbG5hMSA9ICh1MTYpIChnYWluID4+IDApICYgMHgwZjsKLQlsbmEyID0gKHUxNikgKGdhaW4gPj4gNCkgJiAweDBmOwotCXRpYSA9ICh1MTYpIChnYWluID4+IDgpICYgMHhmOwotCWJpcTAgPSAodTE2KSAoZ2FpbiA+PiAxMikgJiAweGY7Ci0JYmlxMSA9ICh1MTYpIChnYWluID4+IDE2KSAmIDB4ZjsKLQotCWdhaW4wXzE1ID0gKHUxNikgKChsbmExICYgMHgzKSB8ICgobG5hMSAmIDB4MykgPDwgMikgfAotCQkJICAgICAoKGxuYTIgJiAweDMpIDw8IDQpIHwgKChsbmEyICYgMHgzKSA8PCA2KSB8Ci0JCQkgICAgICgodGlhICYgMHhmKSA8PCA4KSB8ICgoYmlxMCAmIDB4ZikgPDwgMTIpKTsKLQlnYWluMTZfMTkgPSBiaXExOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NDRkLCAoMHgxIDw8IDApLCB0cnN3IDw8IDApOwotCW1vZF9waHlfcmVnKHBpLCAweDRiMSwgKDB4MSA8PCA5KSwgZXh0X2xuYSA8PCA5KTsKLQltb2RfcGh5X3JlZyhwaSwgMHg0YjEsICgweDEgPDwgMTApLCBleHRfbG5hIDw8IDEwKTsKLQltb2RfcGh5X3JlZyhwaSwgMHg0YjYsICgweGZmZmYgPDwgMCksIGdhaW4wXzE1IDw8IDApOwotCW1vZF9waHlfcmVnKHBpLCAweDRiNywgKDB4ZiA8PCAwKSwgZ2FpbjE2XzE5IDw8IDApOwotCi0JaWYgKENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJbW9kX3BoeV9yZWcocGksIDB4NGIxLCAoMHgzIDw8IDExKSwgbG5hMSA8PCAxMSk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDRlNiwgKDB4MyA8PCAzKSwgbG5hMSA8PCAzKTsKLQl9Ci0Jd2xjX2xjbnBoeV9yeF9nYWluX292ZXJyaWRlX2VuYWJsZShwaSwgdHJ1ZSk7Ci19Ci0KLXN0YXRpYyB1MzIgd2xjX2xjbnBoeV9nZXRfcmVjZWl2ZV9wb3dlcihzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgczMyICpnYWluX2luZGV4KQotewotCXUzMiByZWNlaXZlZF9wb3dlciA9IDA7Ci0JczMyIG1heF9pbmRleCA9IDA7Ci0JdTMyIGdhaW5fY29kZSA9IDA7Ci0Jc3RydWN0IGJyY21zX3BoeV9sY25waHkgKnBpX2xjbiA9IHBpLT51LnBpX2xjbnBoeTsKLQotCW1heF9pbmRleCA9IDM2OwotCWlmICgqZ2Fpbl9pbmRleCA+PSAwKQotCQlnYWluX2NvZGUgPSBsY25waHlfMjNiaXRnYWluY29kZV90YWJsZVsqZ2Fpbl9pbmRleF07Ci0KLQlpZiAoLTEgPT0gKmdhaW5faW5kZXgpIHsKLQkJKmdhaW5faW5kZXggPSAwOwotCQl3aGlsZSAoKCpnYWluX2luZGV4IDw9IChzMzIpIG1heF9pbmRleCkKLQkJICAgICAgICYmIChyZWNlaXZlZF9wb3dlciA8IDcwMCkpIHsKLQkJCXdsY19sY25waHlfc2V0X3J4X2dhaW4ocGksCi0JCQkJCSAgICAgICBsY25waHlfMjNiaXRnYWluY29kZV90YWJsZQotCQkJCQkgICAgICAgWypnYWluX2luZGV4XSk7Ci0JCQlyZWNlaXZlZF9wb3dlciA9Ci0JCQkgICAgd2xjX2xjbnBoeV9tZWFzdXJlX2RpZ2l0YWxfcG93ZXIocGksCi0JCQkJCQkJICAgICBwaV9sY24tPgotCQkJCQkJCSAgICAgbGNucGh5X25vaXNlX3NhbXBsZXMpOwotCQkJKCpnYWluX2luZGV4KSsrOwotCQl9Ci0JCSgqZ2Fpbl9pbmRleCktLTsKLQl9IGVsc2UgewotCQl3bGNfbGNucGh5X3NldF9yeF9nYWluKHBpLCBnYWluX2NvZGUpOwotCQlyZWNlaXZlZF9wb3dlciA9Ci0JCSAgICB3bGNfbGNucGh5X21lYXN1cmVfZGlnaXRhbF9wb3dlcihwaSwKLQkJCQkJCSAgICAgcGlfbGNuLT4KLQkJCQkJCSAgICAgbGNucGh5X25vaXNlX3NhbXBsZXMpOwotCX0KLQotCXJldHVybiByZWNlaXZlZF9wb3dlcjsKLX0KLQotczMyIHdsY19sY25waHlfcnhfc2lnbmFsX3Bvd2VyKHN0cnVjdCBicmNtc19waHkgKnBpLCBzMzIgZ2Fpbl9pbmRleCkKLXsKLQlzMzIgZ2FpbiA9IDA7Ci0JczMyIG5vbWluYWxfcG93ZXJfZGI7Ci0JczMyIGxvZ192YWwsIGdhaW5fbWlzbWF0Y2gsIGRlc2lyZWRfZ2FpbiwgaW5wdXRfcG93ZXJfb2Zmc2V0X2RiLAotCSAgICBpbnB1dF9wb3dlcl9kYjsKLQlzMzIgcmVjZWl2ZWRfcG93ZXIsIHRlbXBlcmF0dXJlOwotCXVpbnQgZnJlcTsKLQlzdHJ1Y3QgYnJjbXNfcGh5X2xjbnBoeSAqcGlfbGNuID0gcGktPnUucGlfbGNucGh5OwotCi0JcmVjZWl2ZWRfcG93ZXIgPSB3bGNfbGNucGh5X2dldF9yZWNlaXZlX3Bvd2VyKHBpLCAmZ2Fpbl9pbmRleCk7Ci0KLQlnYWluID0gbGNucGh5X2dhaW5fdGFibGVbZ2Fpbl9pbmRleF07Ci0KLQlub21pbmFsX3Bvd2VyX2RiID0gcmVhZF9waHlfcmVnKHBpLCAweDQyNSkgPj4gODsKLQotCXsKLQkJdTMyIHBvd2VyID0gKHJlY2VpdmVkX3Bvd2VyICogMTYpOwotCQl1MzIgbXNiMSwgbXNiMiwgdmFsMSwgdmFsMiwgZGlmZjEsIGRpZmYyOwotCQltc2IxID0gZmZzKHBvd2VyKSAtIDE7Ci0JCW1zYjIgPSBtc2IxICsgMTsKLQkJdmFsMSA9IDEgPDwgbXNiMTsKLQkJdmFsMiA9IDEgPDwgbXNiMjsKLQkJZGlmZjEgPSAocG93ZXIgLSB2YWwxKTsKLQkJZGlmZjIgPSAodmFsMiAtIHBvd2VyKTsKLQkJaWYgKGRpZmYxIDwgZGlmZjIpCi0JCQlsb2dfdmFsID0gbXNiMTsKLQkJZWxzZQotCQkJbG9nX3ZhbCA9IG1zYjI7Ci0JfQotCi0JbG9nX3ZhbCA9IGxvZ192YWwgKiAzOwotCi0JZ2Fpbl9taXNtYXRjaCA9IChub21pbmFsX3Bvd2VyX2RiIC8gMikgLSAobG9nX3ZhbCk7Ci0KLQlkZXNpcmVkX2dhaW4gPSBnYWluICsgZ2Fpbl9taXNtYXRjaDsKLQotCWlucHV0X3Bvd2VyX29mZnNldF9kYiA9IHJlYWRfcGh5X3JlZyhwaSwgMHg0MzQpICYgMHhGRjsKLQotCWlmIChpbnB1dF9wb3dlcl9vZmZzZXRfZGIgPiAxMjcpCi0JCWlucHV0X3Bvd2VyX29mZnNldF9kYiAtPSAyNTY7Ci0KLQlpbnB1dF9wb3dlcl9kYiA9IGlucHV0X3Bvd2VyX29mZnNldF9kYiAtIGRlc2lyZWRfZ2FpbjsKLQotCWlucHV0X3Bvd2VyX2RiID0KLQkgICAgaW5wdXRfcG93ZXJfZGIgKyBsY25waHlfZ2Fpbl9pbmRleF9vZmZzZXRfZm9yX3Jzc2lbZ2Fpbl9pbmRleF07Ci0KLQlmcmVxID0gd2xjX3BoeV9jaGFubmVsMmZyZXEoQ0hTUEVDX0NIQU5ORUwocGktPnJhZGlvX2NoYW5zcGVjKSk7Ci0JaWYgKChmcmVxID4gMjQyNykgJiYgKGZyZXEgPD0gMjQ2NykpCi0JCWlucHV0X3Bvd2VyX2RiID0gaW5wdXRfcG93ZXJfZGIgLSAxOwotCi0JdGVtcGVyYXR1cmUgPSBwaV9sY24tPmxjbnBoeV9sYXN0c2Vuc2VkX3RlbXBlcmF0dXJlOwotCi0JaWYgKCh0ZW1wZXJhdHVyZSAtIDE1KSA8IC0zMCkgewotCQlpbnB1dF9wb3dlcl9kYiA9Ci0JCSAgICBpbnB1dF9wb3dlcl9kYiArICgoKHRlbXBlcmF0dXJlIC0gMTAgLSAyNSkgKiAyODYpID4+IDEyKSAtCi0JCSAgICA3OwotCX0gZWxzZSBpZiAoKHRlbXBlcmF0dXJlIC0gMTUpIDwgNCkgewotCQlpbnB1dF9wb3dlcl9kYiA9Ci0JCSAgICBpbnB1dF9wb3dlcl9kYiArICgoKHRlbXBlcmF0dXJlIC0gMTAgLSAyNSkgKiAyODYpID4+IDEyKSAtCi0JCSAgICAzOwotCX0gZWxzZSB7Ci0JCWlucHV0X3Bvd2VyX2RiID0KLQkJICAgIGlucHV0X3Bvd2VyX2RiICsgKCgodGVtcGVyYXR1cmUgLSAxMCAtIDI1KSAqIDI4NikgPj4gMTIpOwotCX0KLQotCXdsY19sY25waHlfcnhfZ2Fpbl9vdmVycmlkZV9lbmFibGUocGksIDApOwotCi0JcmV0dXJuIGlucHV0X3Bvd2VyX2RiOwotfQotCi1zdGF0aWMgaW50Ci13bGNfbGNucGh5X2xvYWRfdHhfaWlyX2ZpbHRlcihzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgYm9vbCBpc19vZmRtLCBzMTYgZmlsdF90eXBlKQotewotCXMxNiBmaWx0X2luZGV4ID0gLTE7Ci0JaW50IGo7Ci0KLQl1MTYgYWRkcltdID0gewotCQkweDkxMCwKLQkJMHg5MWUsCi0JCTB4OTFmLAotCQkweDkyNCwKLQkJMHg5MjUsCi0JCTB4OTI2LAotCQkweDkyMCwKLQkJMHg5MjEsCi0JCTB4OTI3LAotCQkweDkyOCwKLQkJMHg5MjksCi0JCTB4OTIyLAotCQkweDkyMywKLQkJMHg5MzAsCi0JCTB4OTMxLAotCQkweDkzMgotCX07Ci0KLQl1MTYgYWRkcl9vZmRtW10gPSB7Ci0JCTB4OTBmLAotCQkweDkwMCwKLQkJMHg5MDEsCi0JCTB4OTA2LAotCQkweDkwNywKLQkJMHg5MDgsCi0JCTB4OTAyLAotCQkweDkwMywKLQkJMHg5MDksCi0JCTB4OTBhLAotCQkweDkwYiwKLQkJMHg5MDQsCi0JCTB4OTA1LAotCQkweDkwYywKLQkJMHg5MGQsCi0JCTB4OTBlCi0JfTsKLQotCWlmICghaXNfb2ZkbSkgewotCQlmb3IgKGogPSAwOyBqIDwgTENOUEhZX05VTV9UWF9ESUdfRklMVEVSU19DQ0s7IGorKykgewotCQkJaWYgKGZpbHRfdHlwZSA9PSBMQ05QSFlfdHhkaWdmaWx0Y29lZmZzX2Nja1tqXVswXSkgewotCQkJCWZpbHRfaW5kZXggPSAoczE2KSBqOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKGZpbHRfaW5kZXggIT0gLTEpIHsKLQkJCWZvciAoaiA9IDA7IGogPCBMQ05QSFlfTlVNX0RJR19GSUxUX0NPRUZGUzsgaisrKSB7Ci0JCQkJd3JpdGVfcGh5X3JlZyhwaSwgYWRkcltqXSwKLQkJCQkJICAgICAgTENOUEhZX3R4ZGlnZmlsdGNvZWZmc19jY2sKLQkJCQkJICAgICAgW2ZpbHRfaW5kZXhdW2ogKyAxXSk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlmb3IgKGogPSAwOyBqIDwgTENOUEhZX05VTV9UWF9ESUdfRklMVEVSU19PRkRNOyBqKyspIHsKLQkJCWlmIChmaWx0X3R5cGUgPT0gTENOUEhZX3R4ZGlnZmlsdGNvZWZmc19vZmRtW2pdWzBdKSB7Ci0JCQkJZmlsdF9pbmRleCA9IChzMTYpIGo7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZmlsdF9pbmRleCAhPSAtMSkgewotCQkJZm9yIChqID0gMDsgaiA8IExDTlBIWV9OVU1fRElHX0ZJTFRfQ09FRkZTOyBqKyspIHsKLQkJCQl3cml0ZV9waHlfcmVnKHBpLCBhZGRyX29mZG1bal0sCi0JCQkJCSAgICAgIExDTlBIWV90eGRpZ2ZpbHRjb2VmZnNfb2ZkbQotCQkJCQkgICAgICBbZmlsdF9pbmRleF1baiArIDFdKTsKLQkJCX0KLQkJfQotCX0KLQotCXJldHVybiAoZmlsdF9pbmRleCAhPSAtMSkgPyAwIDogLTE7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfbGNuLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfbGNuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YThhYjAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2xjbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmIF9CUkNNX1BIWV9MQ05fSF8KLSNkZWZpbmUgX0JSQ01fUEhZX0xDTl9IXwotCi0jaW5jbHVkZSA8dHlwZXMuaD4KLQotc3RydWN0IGJyY21zX3BoeV9sY25waHkgewotCWludCBsY25waHlfdHhyZl9zcF85X292ZXJyaWRlOwotCXU4IGxjbnBoeV9mdWxsX2NhbF9jaGFubmVsOwotCXU4IGxjbnBoeV9jYWxfY291bnRlcjsKLQl1MTYgbGNucGh5X2NhbF90ZW1wZXI7Ci0JYm9vbCBsY25waHlfcmVjYWw7Ci0KLQl1OCBsY25waHlfcmNfY2FwOwotCXUzMiBsY25waHlfbWNzMjBfcG87Ci0KLQl1OCBsY25waHlfdHJfaXNvbGF0aW9uX21pZDsKLQl1OCBsY25waHlfdHJfaXNvbGF0aW9uX2xvdzsKLQl1OCBsY25waHlfdHJfaXNvbGF0aW9uX2hpOwotCi0JdTggbGNucGh5X2J4X2FyY2g7Ci0JdTggbGNucGh5X3J4X3Bvd2VyX29mZnNldDsKLQl1OCBsY25waHlfcnNzaV92ZjsKLQl1OCBsY25waHlfcnNzaV92YzsKLQl1OCBsY25waHlfcnNzaV9nczsKLQl1OCBsY25waHlfdHNzaV92YWw7Ci0JdTggbGNucGh5X3Jzc2lfdmZfbG93dGVtcDsKLQl1OCBsY25waHlfcnNzaV92Y19sb3d0ZW1wOwotCXU4IGxjbnBoeV9yc3NpX2dzX2xvd3RlbXA7Ci0KLQl1OCBsY25waHlfcnNzaV92Zl9oaWdodGVtcDsKLQl1OCBsY25waHlfcnNzaV92Y19oaWdodGVtcDsKLQl1OCBsY25waHlfcnNzaV9nc19oaWdodGVtcDsKLQotCXMxNiBsY25waHlfcGEwYjA7Ci0JczE2IGxjbnBoeV9wYTBiMTsKLQlzMTYgbGNucGh5X3BhMGIyOwotCi0JdTE2IGxjbnBoeV9yYXd0ZW1wc2Vuc2U7Ci0JdTggbGNucGh5X21lYXNQb3dlcjsKLQl1OCBsY25waHlfdGVtcHNlbnNlX3Nsb3BlOwotCXU4IGxjbnBoeV9mcmVxb2Zmc2V0X2NvcnI7Ci0JdTggbGNucGh5X3RlbXBzZW5zZV9vcHRpb247Ci0JdTggbGNucGh5X3RlbXBjb3JyeDsKLQlib29sIGxjbnBoeV9pcWNhbF9zd3BfZGlzOwotCWJvb2wgbGNucGh5X2h3X2lxY2FsX2VuOwotCXVpbnQgbGNucGh5X2JhbmRlZGdlX2NvcnI7Ci0JYm9vbCBsY25waHlfc3B1cm1vZDsKLQl1MTYgbGNucGh5X3Rzc2lfdHhfY250OwotCXUxNiBsY25waHlfdHNzaV9pZHg7Ci0JdTE2IGxjbnBoeV90c3NpX25wdDsKLQotCXUxNiBsY25waHlfdGFyZ2V0X3R4X2ZyZXE7Ci0JczggbGNucGh5X3R4X3Bvd2VyX2lkeF9vdmVycmlkZTsKLQl1MTYgbGNucGh5X25vaXNlX3NhbXBsZXM7Ci0KLQl1MzIgbGNucGh5X3BhcGRSeEduSWR4OwotCXUzMiBsY25waHlfcGFwZF9yeEduQ3RybF9pbml0OwotCi0JdTMyIGxjbnBoeV9nYWluX2lkeF8xNF9sb3d3b3JkOwotCXUzMiBsY25waHlfZ2Fpbl9pZHhfMTRfaGl3b3JkOwotCXUzMiBsY25waHlfZ2Fpbl9pZHhfMjdfbG93d29yZDsKLQl1MzIgbGNucGh5X2dhaW5faWR4XzI3X2hpd29yZDsKLQlzMTYgbGNucGh5X29mZG1nYWluaWR4dGFibGVvZmZzZXQ7Ci0JczE2IGxjbnBoeV9kc3NzZ2FpbmlkeHRhYmxlb2Zmc2V0OwotCXUzMiBsY25waHlfdHJfUl9nYWluX3ZhbDsKLQl1MzIgbGNucGh5X3RyX1RfZ2Fpbl92YWw7Ci0JczggbGNucGh5X2lucHV0X3B3cl9vZmZzZXRfZGI7Ci0JdTE2IGxjbnBoeV9NZWRfTG93X0dhaW5fZGI7Ci0JdTE2IGxjbnBoeV9WZXJ5X0xvd19HYWluX2RiOwotCXM4IGxjbnBoeV9sYXN0c2Vuc2VkX3RlbXBlcmF0dXJlOwotCXM4IGxjbnBoeV9wa3RlbmdfcnNzaV9zbG9wZTsKLQl1OCBsY25waHlfc2F2ZWRfdHhfdXNlcl90YXJnZXRbVFhQX05VTV9SQVRFU107Ci0JdTggbGNucGh5X3ZvbHRfd2lubmVyOwotCXU4IGxjbnBoeV92b2x0X2xvdzsKLQl1OCBsY25waHlfNTRfNDhfMzZfMjRtYnBzX2JhY2tvZmY7Ci0JdTggbGNucGh5XzExbl9iYWNrb2ZmOwotCXU4IGxjbnBoeV9sb3dlcm9mZG07Ci0JdTggbGNucGh5X2NjazsKLQl1OCBsY25waHlfcHNhdF8ycHQzX2RldGVjdGVkOwotCXMzMiBsY25waHlfbG93ZXN0X1JlX2Rpdl9JbTsKLQlzOCBsY25waHlfZmluYWxfcGFwZF9jYWxfaWR4OwotCXUxNiBsY25waHlfZXh0c3R4Y3RybDQ7Ci0JdTE2IGxjbnBoeV9leHRzdHhjdHJsMDsKLQl1MTYgbGNucGh5X2V4dHN0eGN0cmwxOwotCXMxNiBsY25waHlfY2NrX2RpZ19maWx0X3R5cGU7Ci0JczE2IGxjbnBoeV9vZmRtX2RpZ19maWx0X3R5cGU7Ci0Jc3RydWN0IGxjbnBoeV9jYWxfcmVzdWx0cyBsY25waHlfY2FsX3Jlc3VsdHM7Ci0KLQl1OCBsY25waHlfcHNhdF9wd3I7Ci0JdTggbGNucGh5X3BzYXRfaW5keDsKLQlzMzIgbGNucGh5X21pbl9waGFzZTsKLQl1OCBsY25waHlfZmluYWxfaWR4OwotCXU4IGxjbnBoeV9zdGFydF9pZHg7Ci0JdTggbGNucGh5X2N1cnJlbnRfaW5kZXg7Ci0JdTE2IGxjbnBoeV9sb2dlbl9idWZfMTsKLQl1MTYgbGNucGh5X2xvY2FsX292cl8yOwotCXUxNiBsY25waHlfbG9jYWxfb3ZhbF82OwotCXUxNiBsY25waHlfbG9jYWxfb3ZhbF81OwotCXUxNiBsY25waHlfbG9nZW5fbWl4ZXJfMTsKLQotCXU4IGxjbnBoeV9hY2lfc3RhdDsKLQl1aW50IGxjbnBoeV9hY2lfc3RhcnRfdGltZTsKLQlzOCBsY25waHlfdHhfcG93ZXJfb2Zmc2V0W1RYUF9OVU1fUkFURVNdOwotfTsKLSNlbmRpZgkJCQkvKiBfQlJDTV9QSFlfTENOX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfbi5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhlNDE5Mi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjkwODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotCi0jaW5jbHVkZSA8YnJjbV9od19pZHMuaD4KLSNpbmNsdWRlIDxhaXV0aWxzLmg+Ci0jaW5jbHVkZSA8Y2hpcGNvbW1vbi5oPgotI2luY2x1ZGUgPHBtdS5oPgotI2luY2x1ZGUgPGQxMS5oPgotI2luY2x1ZGUgPHBoeV9zaGltLmg+Ci0jaW5jbHVkZSAicGh5X2ludC5oIgotI2luY2x1ZGUgInBoeV9oYWwuaCIKLSNpbmNsdWRlICJwaHlfcmFkaW8uaCIKLSNpbmNsdWRlICJwaHlyZWdfbi5oIgotI2luY2x1ZGUgInBoeXRibF9uLmgiCi0KLSNkZWZpbmUJUkVBRF9SQURJT19SRUcyKHBpLCByYWRpb190eXBlLCBqc3BhY2UsIGNvcmUsIHJlZ19uYW1lKSBcCi0JcmVhZF9yYWRpb19yZWcocGksIHJhZGlvX3R5cGUjI18jI2pzcGFjZSMjXyMjcmVnX25hbWUgfCBcCi0JKChjb3JlID09IFBIWV9DT1JFXzApID8gcmFkaW9fdHlwZSMjXyMjanNwYWNlIyMwIDogcmFkaW9fdHlwZSMjXyMjanNwYWNlIyMxKSkKLSNkZWZpbmUJV1JJVEVfUkFESU9fUkVHMihwaSwgcmFkaW9fdHlwZSwganNwYWNlLCBjb3JlLCByZWdfbmFtZSwgdmFsdWUpIFwKLQl3cml0ZV9yYWRpb19yZWcocGksIHJhZGlvX3R5cGUjI18jI2pzcGFjZSMjXyMjcmVnX25hbWUgfCBcCi0JKChjb3JlID09IFBIWV9DT1JFXzApID8gcmFkaW9fdHlwZSMjXyMjanNwYWNlIyMwIDogcmFkaW9fdHlwZSMjXyMjanNwYWNlIyMxKSwgdmFsdWUpOwotI2RlZmluZQlXUklURV9SQURJT19TWU4ocGksIHJhZGlvX3R5cGUsIHJlZ19uYW1lLCB2YWx1ZSkgXAotCXdyaXRlX3JhZGlvX3JlZyhwaSwgcmFkaW9fdHlwZSMjXyMjU1lOIyNfIyNyZWdfbmFtZSwgdmFsdWUpOwotCi0jZGVmaW5lCVJFQURfUkFESU9fUkVHMyhwaSwgcmFkaW9fdHlwZSwganNwYWNlLCBjb3JlLCByZWdfbmFtZSkgXAotCXJlYWRfcmFkaW9fcmVnKHBpLCAoKGNvcmUgPT0gUEhZX0NPUkVfMCkgPyByYWRpb190eXBlIyNfIyNqc3BhY2UjIzAjI18jI3JlZ19uYW1lIDogXAotCXJhZGlvX3R5cGUjI18jI2pzcGFjZSMjMSMjXyMjcmVnX25hbWUpKTsKLSNkZWZpbmUJV1JJVEVfUkFESU9fUkVHMyhwaSwgcmFkaW9fdHlwZSwganNwYWNlLCBjb3JlLCByZWdfbmFtZSwgdmFsdWUpIFwKLQl3cml0ZV9yYWRpb19yZWcocGksICgoY29yZSA9PSBQSFlfQ09SRV8wKSA/IHJhZGlvX3R5cGUjI18jI2pzcGFjZSMjMCMjXyMjcmVnX25hbWUgOiBcCi0JcmFkaW9fdHlwZSMjXyMjanNwYWNlIyMxIyNfIyNyZWdfbmFtZSksIHZhbHVlKTsKLSNkZWZpbmUJUkVBRF9SQURJT19SRUc0KHBpLCByYWRpb190eXBlLCBqc3BhY2UsIGNvcmUsIHJlZ19uYW1lKSBcCi0JcmVhZF9yYWRpb19yZWcocGksICgoY29yZSA9PSBQSFlfQ09SRV8wKSA/IHJhZGlvX3R5cGUjI18jI3JlZ19uYW1lIyNfIyNqc3BhY2UjIzAgOiBcCi0JcmFkaW9fdHlwZSMjXyMjcmVnX25hbWUjI18jI2pzcGFjZSMjMSkpOwotI2RlZmluZQlXUklURV9SQURJT19SRUc0KHBpLCByYWRpb190eXBlLCBqc3BhY2UsIGNvcmUsIHJlZ19uYW1lLCB2YWx1ZSkgXAotCXdyaXRlX3JhZGlvX3JlZyhwaSwgKChjb3JlID09IFBIWV9DT1JFXzApID8gcmFkaW9fdHlwZSMjXyMjcmVnX25hbWUjI18jI2pzcGFjZSMjMCA6IFwKLQlyYWRpb190eXBlIyNfIyNyZWdfbmFtZSMjXyMjanNwYWNlIyMxKSwgdmFsdWUpOwotCi0jZGVmaW5lIE5QSFlfQUNJX01BWF9VTkRFVEVDVF9XSU5ET1dfU1ogNDAKLSNkZWZpbmUgTlBIWV9BQ0lfQ0hBTk5FTF9ERUxUQSA1Ci0jZGVmaW5lIE5QSFlfQUNJX0NIQU5ORUxfU0tJUCA0Ci0jZGVmaW5lIE5QSFlfQUNJXzQwTUhaX0NIQU5ORUxfREVMVEEgNgotI2RlZmluZSBOUEhZX0FDSV80ME1IWl9DSEFOTkVMX1NLSVAgNQotI2RlZmluZSBOUEhZX0FDSV80ME1IWl9DSEFOTkVMX0RFTFRBX0dFX1JFVjMgNgotI2RlZmluZSBOUEhZX0FDSV80ME1IWl9DSEFOTkVMX1NLSVBfR0VfUkVWMyA1Ci0jZGVmaW5lIE5QSFlfQUNJX0NIQU5ORUxfREVMVEFfR0VfUkVWMyA0Ci0jZGVmaW5lIE5QSFlfQUNJX0NIQU5ORUxfU0tJUF9HRV9SRVYzIDMKLQotI2RlZmluZSBOUEhZX05PSVNFX05PQVNTT0NfR0xJVENIX1RIX1VQIDIKLQotI2RlZmluZSBOUEhZX05PSVNFX05PQVNTT0NfR0xJVENIX1RIX0ROIDgKLQotI2RlZmluZSBOUEhZX05PSVNFX0FTU09DX0dMSVRDSF9USF9VUCAyCi0KLSNkZWZpbmUgTlBIWV9OT0lTRV9BU1NPQ19HTElUQ0hfVEhfRE4gOAotCi0jZGVmaW5lIE5QSFlfTk9JU0VfQVNTT0NfQUNJX0dMSVRDSF9USF9VUCAyCi0KLSNkZWZpbmUgTlBIWV9OT0lTRV9BU1NPQ19BQ0lfR0xJVENIX1RIX0ROIDgKLQotI2RlZmluZSBOUEhZX05PSVNFX05PQVNTT0NfRU5URVJfVEggIDQwMAotCi0jZGVmaW5lIE5QSFlfTk9JU0VfQVNTT0NfRU5URVJfVEggIDQwMAotCi0jZGVmaW5lIE5QSFlfTk9JU0VfQVNTT0NfUlhfR0xJVENIX0JBRFBMQ1BfRU5URVJfVEggIDQwMAotCi0jZGVmaW5lIE5QSFlfTk9JU0VfQ1JTTUlOUFdSX0FSUkFZX01BWF9JTkRFWCA0NAotI2RlZmluZSBOUEhZX05PSVNFX0NSU01JTlBXUl9BUlJBWV9NQVhfSU5ERVhfUkVWXzcgNTYKLQotI2RlZmluZSBOUEhZX05PSVNFX05PQVNTT0NfQ1JTSURYX0lOQ1IgMTYKLQotI2RlZmluZSBOUEhZX05PSVNFX0FTU09DX0NSU0lEWF9JTkNSIDgKLQotI2RlZmluZSBOUEhZX0lTX1NST01fUkVJTlRFUlBSRVQgTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNSkKLQotI2RlZmluZSBOUEhZX1JTU0lDQUxfTUFYUkVBRCAzMQotCi0jZGVmaW5lIE5QSFlfUlNTSUNBTF9OUE9MTCA4Ci0jZGVmaW5lIE5QSFlfUlNTSUNBTF9NQVhEICAoMTw8MjApCi0jZGVmaW5lIE5QSFlfTUlOX1JYSVFfUFdSIDIKLQotI2RlZmluZSBOUEhZX1JTU0lDQUxfVzFfVEFSR0VUIDI1Ci0jZGVmaW5lIE5QSFlfUlNTSUNBTF9XMl9UQVJHRVQgTlBIWV9SU1NJQ0FMX1cxX1RBUkdFVAotI2RlZmluZSBOUEhZX1JTU0lDQUxfTkJfVEFSR0VUIDAKLQotI2RlZmluZSBOUEhZX1JTU0lDQUxfVzFfVEFSR0VUX1JFVjMgMjkKLSNkZWZpbmUgTlBIWV9SU1NJQ0FMX1cyX1RBUkdFVF9SRVYzIE5QSFlfUlNTSUNBTF9XMV9UQVJHRVRfUkVWMwotCi0jZGVmaW5lIE5QSFlfQ0FMU0FOSVRZX1JTU0lfTkJfTUFYX1BPUyAgOQotI2RlZmluZSBOUEhZX0NBTFNBTklUWV9SU1NJX05CX01BWF9ORUcgLTkKLSNkZWZpbmUgTlBIWV9DQUxTQU5JVFlfUlNTSV9XMV9NQVhfUE9TICAxMgotI2RlZmluZSBOUEhZX0NBTFNBTklUWV9SU1NJX1cxX01BWF9ORUcgKE5QSFlfUlNTSUNBTF9XMV9UQVJHRVQgLSBOUEhZX1JTU0lDQUxfTUFYUkVBRCkKLSNkZWZpbmUgTlBIWV9DQUxTQU5JVFlfUlNTSV9XMl9NQVhfUE9TICBOUEhZX0NBTFNBTklUWV9SU1NJX1cxX01BWF9QT1MKLSNkZWZpbmUgTlBIWV9DQUxTQU5JVFlfUlNTSV9XMl9NQVhfTkVHIChOUEhZX1JTU0lDQUxfVzJfVEFSR0VUIC0gTlBIWV9SU1NJQ0FMX01BWFJFQUQpCi0jZGVmaW5lIE5QSFlfUlNTSV9TWFQoeCkgKChzOCkgKC0oKHgpICYgMHgyMCkgKyAoKHgpICYgMHgxZikpKQotI2RlZmluZSBOUEhZX1JTU0lfTkJfVklPTCh4KSAgKCgoeCkgPiBOUEhZX0NBTFNBTklUWV9SU1NJX05CX01BWF9QT1MpIHx8IFwKLQkJCSAgICAgICAoKHgpIDwgTlBIWV9DQUxTQU5JVFlfUlNTSV9OQl9NQVhfTkVHKSkKLSNkZWZpbmUgTlBIWV9SU1NJX1cxX1ZJT0woeCkgICgoKHgpID4gTlBIWV9DQUxTQU5JVFlfUlNTSV9XMV9NQVhfUE9TKSB8fCBcCi0JCQkgICAgICAgKCh4KSA8IE5QSFlfQ0FMU0FOSVRZX1JTU0lfVzFfTUFYX05FRykpCi0jZGVmaW5lIE5QSFlfUlNTSV9XMl9WSU9MKHgpICAoKCh4KSA+IE5QSFlfQ0FMU0FOSVRZX1JTU0lfVzJfTUFYX1BPUykgfHwgXAotCQkJICAgICAgICgoeCkgPCBOUEhZX0NBTFNBTklUWV9SU1NJX1cyX01BWF9ORUcpKQotCi0jZGVmaW5lIE5QSFlfSVFDQUxfTlVNR0FJTlMgOQotI2RlZmluZSBOUEhZX05fR0NUTCAweDY2Ci0KLSNkZWZpbmUgTlBIWV9QQVBEX0VQU19UQkxfU0laRSA2NAotI2RlZmluZSBOUEhZX1BBUERfU0NMX1RCTF9TSVpFIDY0Ci0jZGVmaW5lIE5QSFlfTlVNX0RJR19GSUxUX0NPRUZGUyAxNQotCi0jZGVmaW5lIE5QSFlfUEFQRF9DT01QX09GRiAwCi0jZGVmaW5lIE5QSFlfUEFQRF9DT01QX09OICAxCi0KLSNkZWZpbmUgTlBIWV9TUk9NX1RFTVBTSElGVAkJMzIKLSNkZWZpbmUgTlBIWV9TUk9NX01BWFRFTVBPRkZTRVQJCTE2Ci0jZGVmaW5lIE5QSFlfU1JPTV9NSU5URU1QT0ZGU0VUCQktMTYKLQotI2RlZmluZSBOUEhZX0NBTF9NQVhURU1QREVMVEEJCTY0Ci0KLSNkZWZpbmUgTlBIWV9OT0lTRVZBUl9UQkxMRU40MCAyNTYKLSNkZWZpbmUgTlBIWV9OT0lTRVZBUl9UQkxMRU4yMCAxMjgKLQotI2RlZmluZSBOUEhZX0FOQVJYTFBGQldfUkVEVUNUSU9ORkFDVCA3Ci0KLSNkZWZpbmUgTlBIWV9BREpVU1RFRF9NSU5DUlNQT1dFUiAweDFlCi0KLS8qIDUzNTcgQ2hpcCBzcGVjaWZpYyBDaGlwQ29udHJvbCByZWdpc3RlciBiaXRzICovCi0jZGVmaW5lIENDVFJMNTM1N19FWFRQQSAgICAgICAgICAgICAgICAgKDE8PDE0KQkvKiBleHRQQSBpbiBDaGlwQ29udHJvbCAxLCBiaXQgMTQgKi8KLSNkZWZpbmUgQ0NUUkw1MzU3X0FOVF9NVVhfMm8zCQkoMTw8MTUpCS8qIDJvMyBpbiBDaGlwQ29udHJvbCAxLCBiaXQgMTUgKi8KLQotc3RydWN0IG5waHlfaXFjYWxfcGFyYW1zIHsKLQl1MTYgdHhscGY7Ci0JdTE2IHR4Z207Ci0JdTE2IHBnYTsKLQl1MTYgcGFkOwotCXUxNiBpcGE7Ci0JdTE2IGNhbF9nYWluOwotCXUxNiBuY29ycls1XTsKLX07Ci0KLXN0cnVjdCBucGh5X3R4aXFjYWxfbGFkZGVyIHsKLQl1OCBwZXJjZW50OwotCXU4IGdfZW52OwotfTsKLQotc3RydWN0IG5waHlfaXBhX3R4Y2FsZ2FpbnMgewotCXN0cnVjdCBucGh5X3R4Z2FpbnMgZ2FpbnM7Ci0JYm9vbCB1c2VpbmRleDsKLQl1OCBpbmRleDsKLX07Ci0KLXN0cnVjdCBucGh5X3BhcGRfcmVzdG9yZV9zdGF0ZSB7Ci0JdTE2IGZibWl4WzJdOwotCXUxNiB2Z2FfbWFzdGVyWzJdOwotCXUxNiBpbnRwYV9tYXN0ZXJbMl07Ci0JdTE2IGFmZWN0cmxbMl07Ci0JdTE2IGFmZW92ZXJyaWRlWzJdOwotCXUxNiBwd3J1cFsyXTsKLQl1MTYgYXR0ZW5bMl07Ci0JdTE2IG1tOwotfTsKLQotc3RydWN0IG5waHlfaXBhX3R4cnhnYWluIHsKLQl1MTYgaHB2Z2E7Ci0JdTE2IGxwZl9iaXExOwotCXUxNiBscGZfYmlxMDsKLQl1MTYgbG5hMjsKLQl1MTYgbG5hMTsKLQlzOCB0eHB3cmluZGV4OwotfTsKLQotI2RlZmluZSBOUEhZX0lQQV9SWENBTF9NQVhHQUlOSU5ERVggKDYgLSAxKQotCi1zdHJ1Y3QgbnBoeV9pcGFfdHhyeGdhaW4gbnBoeV9pcGFfcnhjYWxfZ2FpbnRibF81R0h6W10gPSB7IHswLCAwLCAwLCAwLCAwLCAxMDB9LAotezAsIDAsIDAsIDAsIDAsIDUwfSwKLXswLCAwLCAwLCAwLCAwLCAtMX0sCi17MCwgMCwgMCwgMywgMCwgLTF9LAotezAsIDAsIDMsIDMsIDAsIC0xfSwKLXswLCAyLCAzLCAzLCAwLCAtMX0KLX07Ci0KLXN0cnVjdCBucGh5X2lwYV90eHJ4Z2FpbiBucGh5X2lwYV9yeGNhbF9nYWludGJsXzJHSHpbXSA9IHsgezAsIDAsIDAsIDAsIDAsIDEyOH0sCi17MCwgMCwgMCwgMCwgMCwgNzB9LAotezAsIDAsIDAsIDAsIDAsIDIwfSwKLXswLCAwLCAwLCAzLCAwLCAyMH0sCi17MCwgMCwgMywgMywgMCwgMjB9LAotezAsIDIsIDMsIDMsIDAsIDIwfQotfTsKLQotc3RydWN0IG5waHlfaXBhX3R4cnhnYWluIG5waHlfaXBhX3J4Y2FsX2dhaW50YmxfNUdIel9yZXY3W10gPSB7Ci17MCwgMCwgMCwgMCwgMCwgMTAwfSwKLXswLCAwLCAwLCAwLCAwLCA1MH0sCi17MCwgMCwgMCwgMCwgMCwgLTF9LAotezAsIDAsIDAsIDMsIDAsIC0xfSwKLXswLCAwLCAzLCAzLCAwLCAtMX0sCi17MCwgMCwgNSwgMywgMCwgLTF9Ci19OwotCi1zdHJ1Y3QgbnBoeV9pcGFfdHhyeGdhaW4gbnBoeV9pcGFfcnhjYWxfZ2FpbnRibF8yR0h6X3JldjdbXSA9IHsKLXswLCAwLCAwLCAwLCAwLCAxMH0sCi17MCwgMCwgMCwgMSwgMCwgMTB9LAotezAsIDAsIDEsIDIsIDAsIDEwfSwKLXswLCAwLCAxLCAzLCAwLCAxMH0sCi17MCwgMCwgNCwgMywgMCwgMTB9LAotezAsIDAsIDYsIDMsIDAsIDEwfQotfTsKLQotI2RlZmluZSBOUEhZX1JYQ0FMX1RPTkVBTVAgMTgxCi0jZGVmaW5lIE5QSFlfUlhDQUxfVE9ORUZSRVFfNDBNSHogNDAwMAotI2RlZmluZSBOUEhZX1JYQ0FMX1RPTkVGUkVRXzIwTUh6IDIwMDAKLQotZW51bSB7Ci0JTlBIWV9SWENBTF9HQUlOX0lOSVQgPSAwLAotCU5QSFlfUlhDQUxfR0FJTl9VUCwKLQlOUEhZX1JYQ0FMX0dBSU5fRE9XTgotfTsKLQotI2RlZmluZSB3bGNfcGh5X2dldF9wYXBkX25waHkocGkpIFwKLQkocmVhZF9waHlfcmVnKChwaSksIDB4MWU3KSAmIFwKLQkJCSgoMHgxIDw8IDE1KSB8IFwKLQkJCSgweDEgPDwgMTQpIHwgXAotCQkJKDB4MSA8PCAxMykpKQotCi0jZGVmaW5lIFRYRklMVF9TSEFQSU5HX09GRE0yMCAgIDAKLSNkZWZpbmUgVFhGSUxUX1NIQVBJTkdfT0ZETTQwICAgMQotI2RlZmluZSBUWEZJTFRfU0hBUElOR19DQ0sgICAgICAyCi0jZGVmaW5lIFRYRklMVF9ERUZBVUxUX09GRE0yMCAgIDMKLSNkZWZpbmUgVFhGSUxUX0RFRkFVTFRfT0ZETTQwICAgNAotCi11MTYgTlBIWV9JUEFfUkVWNF90eGRpZ2lfZmlsdGNvZWZmc1tdW05QSFlfTlVNX0RJR19GSUxUX0NPRUZGU10gPSB7Ci0Jey0zNzcsIDEzNywgLTQwNywgMjA4LCAtMTUyNywgOTU2LCA5MywgMTg2LCA5MywKLQkgMjMwLCAtNDQsIDIzMCwgMjAxLCAtMTkxLCAyMDF9LAotCXstNzcsIDIwLCAtOTgsIDQ5LCAtOTMsIDYwLCA1NiwgMTExLCA1NiwgMjYsIC01LAotCSAyNiwgMzQsIC0zMiwgMzR9LAotCXstMzYwLCAxNjQsIC0zNzYsIDE2NCwgLTE1MzMsIDU3NiwgMzA4LCAtMzE0LCAzMDgsCi0JIDEyMSwgLTczLCAxMjEsIDkxLCAxMjQsIDkxfSwKLQl7LTI5NSwgMjAwLCAtMzYzLCAxNDIsIC0xMzkxLCA4MjYsIDE1MSwgMzAxLCAxNTEsCi0JIDE1MSwgMzAxLCAxNTEsIDYwMiwgLTc1MiwgNjAyfSwKLQl7LTkyLCA1OCwgLTk2LCA0OSwgLTEwNCwgNDQsIDE3LCAzNSwgMTcsCi0JIDEyLCAyNSwgMTIsIDEzLCAyNywgMTN9LAotCXstMzc1LCAxMzYsIC0zOTksIDIwOSwgLTE0NzksIDk0OSwgMTMwLCAyNjAsIDEzMCwKLQkgMjMwLCAtNDQsIDIzMCwgMjAxLCAtMTkxLCAyMDF9LAotCXsweGVkOSwgMHhjOCwgMHhlOTUsIDB4OGUsIDB4YTkxLCAweDMzYSwgMHg5NywgMHgxMmQsIDB4OTcsCi0JIDB4OTcsIDB4MTJkLCAweDk3LCAweDI1YSwgMHhkMTAsIDB4MjVhfQotfTsKLQotc3RydWN0IGNoYW5faW5mb19ucGh5XzIwNTUgewotCXUxNiBjaGFuOwotCXUxNiBmcmVxOwotCXVpbnQgdW5rbm93bjsKLQl1OCBSRl9wbGxfcmVmOwotCXU4IFJGX3JmX3BsbF9tb2QxOwotCXU4IFJGX3JmX3BsbF9tb2QwOwotCXU4IFJGX3Zjb19jYXBfdGFpbDsKLQl1OCBSRl92Y29fY2FsMTsKLQl1OCBSRl92Y29fY2FsMjsKLQl1OCBSRl9wbGxfbGZfYzE7Ci0JdTggUkZfcGxsX2xmX3IxOwotCXU4IFJGX3BsbF9sZl9jMjsKLQl1OCBSRl9sZ2J1Zl9jZW5fYnVmOwotCXU4IFJGX2xnZW5fdHVuZTE7Ci0JdTggUkZfbGdlbl90dW5lMjsKLQl1OCBSRl9jb3JlMV9sZ2J1Zl9hX3R1bmU7Ci0JdTggUkZfY29yZTFfbGdidWZfZ190dW5lOwotCXU4IFJGX2NvcmUxX3J4cmZfcmVnMTsKLQl1OCBSRl9jb3JlMV90eF9wZ2FfcGFkX3RuOwotCXU4IFJGX2NvcmUxX3R4X214X2JndHJpbTsKLQl1OCBSRl9jb3JlMl9sZ2J1Zl9hX3R1bmU7Ci0JdTggUkZfY29yZTJfbGdidWZfZ190dW5lOwotCXU4IFJGX2NvcmUyX3J4cmZfcmVnMTsKLQl1OCBSRl9jb3JlMl90eF9wZ2FfcGFkX3RuOwotCXU4IFJGX2NvcmUyX3R4X214X2JndHJpbTsKLQl1MTYgUEhZX0JXMWE7Ci0JdTE2IFBIWV9CVzI7Ci0JdTE2IFBIWV9CVzM7Ci0JdTE2IFBIWV9CVzQ7Ci0JdTE2IFBIWV9CVzU7Ci0JdTE2IFBIWV9CVzY7Ci19OwotCi1zdHJ1Y3QgY2hhbl9pbmZvX25waHlfcmFkaW8yMDV4IHsKLQl1MTYgY2hhbjsKLQl1MTYgZnJlcTsKLQl1OCBSRl9TWU5fcGxsX3Zjb2NhbDE7Ci0JdTggUkZfU1lOX3BsbF92Y29jYWwyOwotCXU4IFJGX1NZTl9wbGxfcmVmZGl2OwotCXU4IFJGX1NZTl9wbGxfbW1kMjsKLQl1OCBSRl9TWU5fcGxsX21tZDE7Ci0JdTggUkZfU1lOX3BsbF9sb29wZmlsdGVyMTsKLQl1OCBSRl9TWU5fcGxsX2xvb3BmaWx0ZXIyOwotCXU4IFJGX1NZTl9wbGxfbG9vcGZpbHRlcjM7Ci0JdTggUkZfU1lOX3BsbF9sb29wZmlsdGVyNDsKLQl1OCBSRl9TWU5fcGxsX2xvb3BmaWx0ZXI1OwotCXU4IFJGX1NZTl9yZXNlcnZlZF9hZGRyMjc7Ci0JdTggUkZfU1lOX3Jlc2VydmVkX2FkZHIyODsKLQl1OCBSRl9TWU5fcmVzZXJ2ZWRfYWRkcjI5OwotCXU4IFJGX1NZTl9sb2dlbl9WQ09CVUYxOwotCXU4IFJGX1NZTl9sb2dlbl9NSVhFUjI7Ci0JdTggUkZfU1lOX2xvZ2VuX0JVRjM7Ci0JdTggUkZfU1lOX2xvZ2VuX0JVRjQ7Ci0JdTggUkZfUlgwX2xuYWFfdHVuZTsKLQl1OCBSRl9SWDBfbG5hZ190dW5lOwotCXU4IFJGX1RYMF9pbnRwYWFfYm9vc3RfdHVuZTsKLQl1OCBSRl9UWDBfaW50cGFnX2Jvb3N0X3R1bmU7Ci0JdTggUkZfVFgwX3BhZGFfYm9vc3RfdHVuZTsKLQl1OCBSRl9UWDBfcGFkZ19ib29zdF90dW5lOwotCXU4IFJGX1RYMF9wZ2FhX2Jvb3N0X3R1bmU7Ci0JdTggUkZfVFgwX3BnYWdfYm9vc3RfdHVuZTsKLQl1OCBSRl9UWDBfbWl4YV9ib29zdF90dW5lOwotCXU4IFJGX1RYMF9taXhnX2Jvb3N0X3R1bmU7Ci0JdTggUkZfUlgxX2xuYWFfdHVuZTsKLQl1OCBSRl9SWDFfbG5hZ190dW5lOwotCXU4IFJGX1RYMV9pbnRwYWFfYm9vc3RfdHVuZTsKLQl1OCBSRl9UWDFfaW50cGFnX2Jvb3N0X3R1bmU7Ci0JdTggUkZfVFgxX3BhZGFfYm9vc3RfdHVuZTsKLQl1OCBSRl9UWDFfcGFkZ19ib29zdF90dW5lOwotCXU4IFJGX1RYMV9wZ2FhX2Jvb3N0X3R1bmU7Ci0JdTggUkZfVFgxX3BnYWdfYm9vc3RfdHVuZTsKLQl1OCBSRl9UWDFfbWl4YV9ib29zdF90dW5lOwotCXU4IFJGX1RYMV9taXhnX2Jvb3N0X3R1bmU7Ci0JdTE2IFBIWV9CVzFhOwotCXUxNiBQSFlfQlcyOwotCXUxNiBQSFlfQlczOwotCXUxNiBQSFlfQlc0OwotCXUxNiBQSFlfQlc1OwotCXUxNiBQSFlfQlc2OwotfTsKLQotc3RydWN0IGNoYW5faW5mb19ucGh5X3JhZGlvMjA1NyB7Ci0JdTE2IGNoYW47Ci0JdTE2IGZyZXE7Ci0JdTggUkZfdmNvY2FsX2NvdW50dmFsMDsKLQl1OCBSRl92Y29jYWxfY291bnR2YWwxOwotCXU4IFJGX3JmcGxsX3JlZm1hc3Rlcl9zcGFyZXh0YWxzaXplOwotCXU4IFJGX3JmcGxsX2xvb3BmaWx0ZXJfcjE7Ci0JdTggUkZfcmZwbGxfbG9vcGZpbHRlcl9jMjsKLQl1OCBSRl9yZnBsbF9sb29wZmlsdGVyX2MxOwotCXU4IFJGX2NwX2twZF9pZGFjOwotCXU4IFJGX3JmcGxsX21tZDA7Ci0JdTggUkZfcmZwbGxfbW1kMTsKLQl1OCBSRl92Y29idWZfdHVuZTsKLQl1OCBSRl9sb2dlbl9teDJnX3R1bmU7Ci0JdTggUkZfbG9nZW5fbXg1Z190dW5lOwotCXU4IFJGX2xvZ2VuX2luZGJ1ZjJnX3R1bmU7Ci0JdTggUkZfbG9nZW5faW5kYnVmNWdfdHVuZTsKLQl1OCBSRl90eG1peDJnX3R1bmVfYm9vc3RfcHVfY29yZTA7Ci0JdTggUkZfcGFkMmdfdHVuZV9wdXNfY29yZTA7Ci0JdTggUkZfcGdhX2Jvb3N0X3R1bmVfY29yZTA7Ci0JdTggUkZfdHhtaXg1Z19ib29zdF90dW5lX2NvcmUwOwotCXU4IFJGX3BhZDVnX3R1bmVfbWlzY19wdXNfY29yZTA7Ci0JdTggUkZfbG5hMmdfdHVuZV9jb3JlMDsKLQl1OCBSRl9sbmE1Z190dW5lX2NvcmUwOwotCXU4IFJGX3R4bWl4MmdfdHVuZV9ib29zdF9wdV9jb3JlMTsKLQl1OCBSRl9wYWQyZ190dW5lX3B1c19jb3JlMTsKLQl1OCBSRl9wZ2FfYm9vc3RfdHVuZV9jb3JlMTsKLQl1OCBSRl90eG1peDVnX2Jvb3N0X3R1bmVfY29yZTE7Ci0JdTggUkZfcGFkNWdfdHVuZV9taXNjX3B1c19jb3JlMTsKLQl1OCBSRl9sbmEyZ190dW5lX2NvcmUxOwotCXU4IFJGX2xuYTVnX3R1bmVfY29yZTE7Ci0JdTE2IFBIWV9CVzFhOwotCXUxNiBQSFlfQlcyOwotCXUxNiBQSFlfQlczOwotCXUxNiBQSFlfQlc0OwotCXUxNiBQSFlfQlc1OwotCXUxNiBQSFlfQlc2OwotfTsKLQotc3RydWN0IGNoYW5faW5mb19ucGh5X3JhZGlvMjA1N19yZXY1IHsKLQl1MTYgY2hhbjsKLQl1MTYgZnJlcTsKLQl1OCBSRl92Y29jYWxfY291bnR2YWwwOwotCXU4IFJGX3Zjb2NhbF9jb3VudHZhbDE7Ci0JdTggUkZfcmZwbGxfcmVmbWFzdGVyX3NwYXJleHRhbHNpemU7Ci0JdTggUkZfcmZwbGxfbG9vcGZpbHRlcl9yMTsKLQl1OCBSRl9yZnBsbF9sb29wZmlsdGVyX2MyOwotCXU4IFJGX3JmcGxsX2xvb3BmaWx0ZXJfYzE7Ci0JdTggUkZfY3Bfa3BkX2lkYWM7Ci0JdTggUkZfcmZwbGxfbW1kMDsKLQl1OCBSRl9yZnBsbF9tbWQxOwotCXU4IFJGX3Zjb2J1Zl90dW5lOwotCXU4IFJGX2xvZ2VuX214MmdfdHVuZTsKLQl1OCBSRl9sb2dlbl9pbmRidWYyZ190dW5lOwotCXU4IFJGX3R4bWl4MmdfdHVuZV9ib29zdF9wdV9jb3JlMDsKLQl1OCBSRl9wYWQyZ190dW5lX3B1c19jb3JlMDsKLQl1OCBSRl9sbmEyZ190dW5lX2NvcmUwOwotCXU4IFJGX3R4bWl4MmdfdHVuZV9ib29zdF9wdV9jb3JlMTsKLQl1OCBSRl9wYWQyZ190dW5lX3B1c19jb3JlMTsKLQl1OCBSRl9sbmEyZ190dW5lX2NvcmUxOwotCXUxNiBQSFlfQlcxYTsKLQl1MTYgUEhZX0JXMjsKLQl1MTYgUEhZX0JXMzsKLQl1MTYgUEhZX0JXNDsKLQl1MTYgUEhZX0JXNTsKLQl1MTYgUEhZX0JXNjsKLX07Ci0KLXN0cnVjdCBucGh5X3Nmb19jZmcgewotCXUxNiBQSFlfQlcxYTsKLQl1MTYgUEhZX0JXMjsKLQl1MTYgUEhZX0JXMzsKLQl1MTYgUEhZX0JXNDsKLQl1MTYgUEhZX0JXNTsKLQl1MTYgUEhZX0JXNjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2hhbl9pbmZvX25waHlfMjA1NSBjaGFuX2luZm9fbnBoeV8yMDU1W10gPSB7Ci0JewotCSAxODQsIDQ5MjAsIDMyODAsIDB4NzEsIDB4MDEsIDB4RUMsIDB4MEYsIDB4RkYsIDB4MDEsIDB4MDQsIDB4MEEsCi0JIDB4MDAsIDB4OEYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MEYsIDB4MEYsIDB4OEYsIDB4RkYsIDB4MDAsIDB4MEYsCi0JIDB4MEYsIDB4OEYsIDB4N0I0LCAweDdCMCwgMHg3QUMsIDB4MjE0LCAweDIxNSwgMHgyMTZ9LAotCXsKLQkgMTg2LCA0OTMwLCAzMjg3LCAweDcxLCAweDAxLCAweEVELCAweDBGLCAweEZGLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDhGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDBGLCAweDBGLCAweDhGLCAweEZGLCAweDAwLCAweDBGLAotCSAweDBGLCAweDhGLCAweDdCOCwgMHg3QjQsIDB4N0IwLCAweDIxMywgMHgyMTQsIDB4MjE1fSwKLQl7Ci0JIDE4OCwgNDk0MCwgMzI5MywgMHg3MSwgMHgwMSwgMHhFRSwgMHgwRiwgMHhGRiwgMHgwMSwgMHgwNCwgMHgwQSwKLQkgMHgwMCwgMHg4RiwgMHhFRSwgMHhFRSwgMHhGRiwgMHgwMCwgMHgwRiwgMHgwRiwgMHg4RiwgMHhGRiwgMHgwMCwgMHgwRiwKLQkgMHgwRiwgMHg4RiwgMHg3QkMsIDB4N0I4LCAweDdCNCwgMHgyMTIsIDB4MjEzLCAweDIxNH0sCi0JewotCSAxOTAsIDQ5NTAsIDMzMDAsIDB4NzEsIDB4MDEsIDB4RUYsIDB4MEYsIDB4RkYsIDB4MDEsIDB4MDQsIDB4MEEsCi0JIDB4MDAsIDB4OEYsIDB4RUUsIDB4RUUsIDB4RkYsIDB4MDAsIDB4MEYsIDB4MEYsIDB4OEYsIDB4RkYsIDB4MDAsIDB4MEYsCi0JIDB4MEYsIDB4OEYsIDB4N0MwLCAweDdCQywgMHg3QjgsIDB4MjExLCAweDIxMiwgMHgyMTN9LAotCXsKLQkgMTkyLCA0OTYwLCAzMzA3LCAweDcxLCAweDAxLCAweEYwLCAweDBGLCAweEZGLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDhGLCAweEVFLCAweEVFLCAweEZGLCAweDAwLCAweDBGLCAweDBGLCAweDhGLCAweEZGLCAweDAwLCAweDBGLAotCSAweDBGLCAweDhGLCAweDdDNCwgMHg3QzAsIDB4N0JDLCAweDIwRiwgMHgyMTEsIDB4MjEyfSwKLQl7Ci0JIDE5NCwgNDk3MCwgMzMxMywgMHg3MSwgMHgwMSwgMHhGMSwgMHgwRiwgMHhGRiwgMHgwMSwgMHgwNCwgMHgwQSwKLQkgMHgwMCwgMHg4RiwgMHhFRSwgMHhFRSwgMHhGRiwgMHgwMCwgMHgwRiwgMHgwRiwgMHg4RiwgMHhGRiwgMHgwMCwgMHgwRiwKLQkgMHgwRiwgMHg4RiwgMHg3QzgsIDB4N0M0LCAweDdDMCwgMHgyMEUsIDB4MjBGLCAweDIxMX0sCi0JewotCSAxOTYsIDQ5ODAsIDMzMjAsIDB4NzEsIDB4MDEsIDB4RjIsIDB4MEUsIDB4RkYsIDB4MDEsIDB4MDQsIDB4MEEsCi0JIDB4MDAsIDB4OEYsIDB4REQsIDB4REQsIDB4RkYsIDB4MDAsIDB4MEYsIDB4MEYsIDB4OEYsIDB4RkYsIDB4MDAsIDB4MEYsCi0JIDB4MEYsIDB4OEYsIDB4N0NDLCAweDdDOCwgMHg3QzQsIDB4MjBELCAweDIwRSwgMHgyMEZ9LAotCXsKLQkgMTk4LCA0OTkwLCAzMzI3LCAweDcxLCAweDAxLCAweEYzLCAweDBFLCAweEZGLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDhGLCAweERELCAweERELCAweEZGLCAweDAwLCAweDBGLCAweDBGLCAweDhGLCAweEZGLCAweDAwLCAweDBGLAotCSAweDBGLCAweDhGLCAweDdEMCwgMHg3Q0MsIDB4N0M4LCAweDIwQywgMHgyMEQsIDB4MjBFfSwKLQl7Ci0JIDIwMCwgNTAwMCwgMzMzMywgMHg3MSwgMHgwMSwgMHhGNCwgMHgwRSwgMHhGRiwgMHgwMSwgMHgwNCwgMHgwQSwKLQkgMHgwMCwgMHg4RiwgMHhERCwgMHhERCwgMHhGRiwgMHgwMCwgMHgwRiwgMHgwRiwgMHg4RiwgMHhGRiwgMHgwMCwgMHgwRiwKLQkgMHgwRiwgMHg4RiwgMHg3RDQsIDB4N0QwLCAweDdDQywgMHgyMEIsIDB4MjBDLCAweDIwRH0sCi0JewotCSAyMDIsIDUwMTAsIDMzNDAsIDB4NzEsIDB4MDEsIDB4RjUsIDB4MEUsIDB4RkYsIDB4MDEsIDB4MDQsIDB4MEEsCi0JIDB4MDAsIDB4OEYsIDB4REQsIDB4REQsIDB4RkYsIDB4MDAsIDB4MEYsIDB4MEYsIDB4OEYsIDB4RkYsIDB4MDAsIDB4MEYsCi0JIDB4MEYsIDB4OEYsIDB4N0Q4LCAweDdENCwgMHg3RDAsIDB4MjBBLCAweDIwQiwgMHgyMEN9LAotCXsKLQkgMjA0LCA1MDIwLCAzMzQ3LCAweDcxLCAweDAxLCAweEY2LCAweDBFLCAweEY3LCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDhGLCAweENDLCAweENDLCAweEZGLCAweDAwLCAweDBGLCAweDBGLCAweDhGLCAweEZGLCAweDAwLCAweDBGLAotCSAweDBGLCAweDhGLCAweDdEQywgMHg3RDgsIDB4N0Q0LCAweDIwOSwgMHgyMEEsIDB4MjBCfSwKLQl7Ci0JIDIwNiwgNTAzMCwgMzM1MywgMHg3MSwgMHgwMSwgMHhGNywgMHgwRSwgMHhGNywgMHgwMSwgMHgwNCwgMHgwQSwKLQkgMHgwMCwgMHg4RiwgMHhDQywgMHhDQywgMHhGRiwgMHgwMCwgMHgwRiwgMHgwRiwgMHg4RiwgMHhGRiwgMHgwMCwgMHgwRiwKLQkgMHgwRiwgMHg4RiwgMHg3RTAsIDB4N0RDLCAweDdEOCwgMHgyMDgsIDB4MjA5LCAweDIwQX0sCi0JewotCSAyMDgsIDUwNDAsIDMzNjAsIDB4NzEsIDB4MDEsIDB4RjgsIDB4MEQsIDB4RUYsIDB4MDEsIDB4MDQsIDB4MEEsCi0JIDB4MDAsIDB4OEYsIDB4Q0MsIDB4Q0MsIDB4RkYsIDB4MDAsIDB4MEYsIDB4MEYsIDB4OEYsIDB4RkYsIDB4MDAsIDB4MEYsCi0JIDB4MEYsIDB4OEYsIDB4N0U0LCAweDdFMCwgMHg3REMsIDB4MjA3LCAweDIwOCwgMHgyMDl9LAotCXsKLQkgMjEwLCA1MDUwLCAzMzY3LCAweDcxLCAweDAxLCAweEY5LCAweDBELCAweEVGLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDhGLCAweENDLCAweENDLCAweEZGLCAweDAwLCAweDBGLCAweDBGLCAweDhGLCAweEZGLCAweDAwLCAweDBGLAotCSAweDBGLCAweDhGLCAweDdFOCwgMHg3RTQsIDB4N0UwLCAweDIwNiwgMHgyMDcsIDB4MjA4fSwKLQl7Ci0JIDIxMiwgNTA2MCwgMzM3MywgMHg3MSwgMHgwMSwgMHhGQSwgMHgwRCwgMHhFNiwgMHgwMSwgMHgwNCwgMHgwQSwKLQkgMHgwMCwgMHg4RiwgMHhCQiwgMHhCQiwgMHhGRiwgMHgwMCwgMHgwRSwgMHgwRiwgMHg4RSwgMHhGRiwgMHgwMCwgMHgwRSwKLQkgMHgwRiwgMHg4RSwgMHg3RUMsIDB4N0U4LCAweDdFNCwgMHgyMDUsIDB4MjA2LCAweDIwN30sCi0JewotCSAyMTQsIDUwNzAsIDMzODAsIDB4NzEsIDB4MDEsIDB4RkIsIDB4MEQsIDB4RTYsIDB4MDEsIDB4MDQsIDB4MEEsCi0JIDB4MDAsIDB4OEYsIDB4QkIsIDB4QkIsIDB4RkYsIDB4MDAsIDB4MEUsIDB4MEYsIDB4OEUsIDB4RkYsIDB4MDAsIDB4MEUsCi0JIDB4MEYsIDB4OEUsIDB4N0YwLCAweDdFQywgMHg3RTgsIDB4MjA0LCAweDIwNSwgMHgyMDZ9LAotCXsKLQkgMjE2LCA1MDgwLCAzMzg3LCAweDcxLCAweDAxLCAweEZDLCAweDBELCAweERFLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDhFLCAweEJCLCAweEJCLCAweEVFLCAweDAwLCAweDBFLCAweDBGLCAweDhELCAweEVFLCAweDAwLCAweDBFLAotCSAweDBGLCAweDhELCAweDdGNCwgMHg3RjAsIDB4N0VDLCAweDIwMywgMHgyMDQsIDB4MjA1fSwKLQl7Ci0JIDIxOCwgNTA5MCwgMzM5MywgMHg3MSwgMHgwMSwgMHhGRCwgMHgwRCwgMHhERSwgMHgwMSwgMHgwNCwgMHgwQSwKLQkgMHgwMCwgMHg4RSwgMHhCQiwgMHhCQiwgMHhFRSwgMHgwMCwgMHgwRSwgMHgwRiwgMHg4RCwgMHhFRSwgMHgwMCwgMHgwRSwKLQkgMHgwRiwgMHg4RCwgMHg3RjgsIDB4N0Y0LCAweDdGMCwgMHgyMDIsIDB4MjAzLCAweDIwNH0sCi0JewotCSAyMjAsIDUxMDAsIDM0MDAsIDB4NzEsIDB4MDEsIDB4RkUsIDB4MEMsIDB4RDYsIDB4MDEsIDB4MDQsIDB4MEEsCi0JIDB4MDAsIDB4OEUsIDB4QUEsIDB4QUEsIDB4RUUsIDB4MDAsIDB4MEQsIDB4MEYsIDB4OEQsIDB4RUUsIDB4MDAsIDB4MEQsCi0JIDB4MEYsIDB4OEQsIDB4N0ZDLCAweDdGOCwgMHg3RjQsIDB4MjAxLCAweDIwMiwgMHgyMDN9LAotCXsKLQkgMjIyLCA1MTEwLCAzNDA3LCAweDcxLCAweDAxLCAweEZGLCAweDBDLCAweEQ2LCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDhFLCAweEFBLCAweEFBLCAweEVFLCAweDAwLCAweDBELCAweDBGLCAweDhELCAweEVFLCAweDAwLCAweDBELAotCSAweDBGLCAweDhELCAweDgwMCwgMHg3RkMsIDB4N0Y4LCAweDIwMCwgMHgyMDEsIDB4MjAyfSwKLQl7Ci0JIDIyNCwgNTEyMCwgMzQxMywgMHg3MSwgMHgwMiwgMHgwMCwgMHgwQywgMHhDRSwgMHgwMSwgMHgwNCwgMHgwQSwKLQkgMHgwMCwgMHg4RCwgMHhBQSwgMHhBQSwgMHhERCwgMHgwMCwgMHgwRCwgMHgwRiwgMHg4QywgMHhERCwgMHgwMCwgMHgwRCwKLQkgMHgwRiwgMHg4QywgMHg4MDQsIDB4ODAwLCAweDdGQywgMHgxRkYsIDB4MjAwLCAweDIwMX0sCi0JewotCSAyMjYsIDUxMzAsIDM0MjAsIDB4NzEsIDB4MDIsIDB4MDEsIDB4MEMsIDB4Q0UsIDB4MDEsIDB4MDQsIDB4MEEsCi0JIDB4MDAsIDB4OEQsIDB4QUEsIDB4QUEsIDB4REQsIDB4MDAsIDB4MEQsIDB4MEYsIDB4OEMsIDB4REQsIDB4MDAsIDB4MEQsCi0JIDB4MEYsIDB4OEMsIDB4ODA4LCAweDgwNCwgMHg4MDAsIDB4MUZFLCAweDFGRiwgMHgyMDB9LAotCXsKLQkgMjI4LCA1MTQwLCAzNDI3LCAweDcxLCAweDAyLCAweDAyLCAweDBDLCAweEM2LCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDhELCAweDk5LCAweDk5LCAweERELCAweDAwLCAweDBDLCAweDBFLCAweDhCLCAweERELCAweDAwLCAweDBDLAotCSAweDBFLCAweDhCLCAweDgwQywgMHg4MDgsIDB4ODA0LCAweDFGRCwgMHgxRkUsIDB4MUZGfSwKLQl7Ci0JIDMyLCA1MTYwLCAzNDQwLCAweDcxLCAweDAyLCAweDA0LCAweDBCLCAweEJFLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDhDLCAweDk5LCAweDk5LCAweENDLCAweDAwLCAweDBCLCAweDBELCAweDhBLCAweENDLCAweDAwLCAweDBCLAotCSAweDBELCAweDhBLCAweDgxNCwgMHg4MTAsIDB4ODBDLCAweDFGQiwgMHgxRkMsIDB4MUZEfSwKLQl7Ci0JIDM0LCA1MTcwLCAzNDQ3LCAweDcxLCAweDAyLCAweDA1LCAweDBCLCAweEJFLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDhDLCAweDk5LCAweDk5LCAweENDLCAweDAwLCAweDBCLCAweDBELCAweDhBLCAweENDLCAweDAwLCAweDBCLAotCSAweDBELCAweDhBLCAweDgxOCwgMHg4MTQsIDB4ODEwLCAweDFGQSwgMHgxRkIsIDB4MUZDfSwKLQl7Ci0JIDM2LCA1MTgwLCAzNDUzLCAweDcxLCAweDAyLCAweDA2LCAweDBCLCAweEI2LCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDhDLCAweDg4LCAweDg4LCAweENDLCAweDAwLCAweDBCLCAweDBDLCAweDg5LCAweENDLCAweDAwLCAweDBCLAotCSAweDBDLCAweDg5LCAweDgxQywgMHg4MTgsIDB4ODE0LCAweDFGOSwgMHgxRkEsIDB4MUZCfSwKLQl7Ci0JIDM4LCA1MTkwLCAzNDYwLCAweDcxLCAweDAyLCAweDA3LCAweDBCLCAweEI2LCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDhDLCAweDg4LCAweDg4LCAweENDLCAweDAwLCAweDBCLCAweDBDLCAweDg5LCAweENDLCAweDAwLCAweDBCLAotCSAweDBDLCAweDg5LCAweDgyMCwgMHg4MUMsIDB4ODE4LCAweDFGOCwgMHgxRjksIDB4MUZBfSwKLQl7Ci0JIDQwLCA1MjAwLCAzNDY3LCAweDcxLCAweDAyLCAweDA4LCAweDBCLCAweEFGLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDhCLCAweDg4LCAweDg4LCAweEJCLCAweDAwLCAweDBBLCAweDBCLCAweDg5LCAweEJCLCAweDAwLCAweDBBLAotCSAweDBCLCAweDg5LCAweDgyNCwgMHg4MjAsIDB4ODFDLCAweDFGNywgMHgxRjgsIDB4MUY5fSwKLQl7Ci0JIDQyLCA1MjEwLCAzNDczLCAweDcxLCAweDAyLCAweDA5LCAweDBCLCAweEFGLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDhCLCAweDg4LCAweDg4LCAweEJCLCAweDAwLCAweDBBLCAweDBCLCAweDg5LCAweEJCLCAweDAwLCAweDBBLAotCSAweDBCLCAweDg5LCAweDgyOCwgMHg4MjQsIDB4ODIwLCAweDFGNiwgMHgxRjcsIDB4MUY4fSwKLQl7Ci0JIDQ0LCA1MjIwLCAzNDgwLCAweDcxLCAweDAyLCAweDBBLCAweDBBLCAweEE3LCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDhCLCAweDc3LCAweDc3LCAweEJCLCAweDAwLCAweDA5LCAweDBBLCAweDg4LCAweEJCLCAweDAwLCAweDA5LAotCSAweDBBLCAweDg4LCAweDgyQywgMHg4MjgsIDB4ODI0LCAweDFGNSwgMHgxRjYsIDB4MUY3fSwKLQl7Ci0JIDQ2LCA1MjMwLCAzNDg3LCAweDcxLCAweDAyLCAweDBCLCAweDBBLCAweEE3LCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDhCLCAweDc3LCAweDc3LCAweEJCLCAweDAwLCAweDA5LCAweDBBLCAweDg4LCAweEJCLCAweDAwLCAweDA5LAotCSAweDBBLCAweDg4LCAweDgzMCwgMHg4MkMsIDB4ODI4LCAweDFGNCwgMHgxRjUsIDB4MUY2fSwKLQl7Ci0JIDQ4LCA1MjQwLCAzNDkzLCAweDcxLCAweDAyLCAweDBDLCAweDBBLCAweEEwLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDhBLCAweDc3LCAweDc3LCAweEFBLCAweDAwLCAweDA5LCAweDBBLCAweDg3LCAweEFBLCAweDAwLCAweDA5LAotCSAweDBBLCAweDg3LCAweDgzNCwgMHg4MzAsIDB4ODJDLCAweDFGMywgMHgxRjQsIDB4MUY1fSwKLQl7Ci0JIDUwLCA1MjUwLCAzNTAwLCAweDcxLCAweDAyLCAweDBELCAweDBBLCAweEEwLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDhBLCAweDc3LCAweDc3LCAweEFBLCAweDAwLCAweDA5LCAweDBBLCAweDg3LCAweEFBLCAweDAwLCAweDA5LAotCSAweDBBLCAweDg3LCAweDgzOCwgMHg4MzQsIDB4ODMwLCAweDFGMiwgMHgxRjMsIDB4MUY0fSwKLQl7Ci0JIDUyLCA1MjYwLCAzNTA3LCAweDcxLCAweDAyLCAweDBFLCAweDBBLCAweDk4LCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDhBLCAweDY2LCAweDY2LCAweEFBLCAweDAwLCAweDA4LCAweDA5LCAweDg3LCAweEFBLCAweDAwLCAweDA4LAotCSAweDA5LCAweDg3LCAweDgzQywgMHg4MzgsIDB4ODM0LCAweDFGMSwgMHgxRjIsIDB4MUYzfSwKLQl7Ci0JIDU0LCA1MjcwLCAzNTEzLCAweDcxLCAweDAyLCAweDBGLCAweDBBLCAweDk4LCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDhBLCAweDY2LCAweDY2LCAweEFBLCAweDAwLCAweDA4LCAweDA5LCAweDg3LCAweEFBLCAweDAwLCAweDA4LAotCSAweDA5LCAweDg3LCAweDg0MCwgMHg4M0MsIDB4ODM4LCAweDFGMCwgMHgxRjEsIDB4MUYyfSwKLQl7Ci0JIDU2LCA1MjgwLCAzNTIwLCAweDcxLCAweDAyLCAweDEwLCAweDA5LCAweDkxLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDg5LCAweDY2LCAweDY2LCAweDk5LCAweDAwLCAweDA4LCAweDA4LCAweDg2LCAweDk5LCAweDAwLCAweDA4LAotCSAweDA4LCAweDg2LCAweDg0NCwgMHg4NDAsIDB4ODNDLCAweDFGMCwgMHgxRjAsIDB4MUYxfSwKLQl7Ci0JIDU4LCA1MjkwLCAzNTI3LCAweDcxLCAweDAyLCAweDExLCAweDA5LCAweDkxLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDg5LCAweDY2LCAweDY2LCAweDk5LCAweDAwLCAweDA4LCAweDA4LCAweDg2LCAweDk5LCAweDAwLCAweDA4LAotCSAweDA4LCAweDg2LCAweDg0OCwgMHg4NDQsIDB4ODQwLCAweDFFRiwgMHgxRjAsIDB4MUYwfSwKLQl7Ci0JIDYwLCA1MzAwLCAzNTMzLCAweDcxLCAweDAyLCAweDEyLCAweDA5LCAweDhBLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDg5LCAweDU1LCAweDU1LCAweDk5LCAweDAwLCAweDA4LCAweDA3LCAweDg1LCAweDk5LCAweDAwLCAweDA4LAotCSAweDA3LCAweDg1LCAweDg0QywgMHg4NDgsIDB4ODQ0LCAweDFFRSwgMHgxRUYsIDB4MUYwfSwKLQl7Ci0JIDYyLCA1MzEwLCAzNTQwLCAweDcxLCAweDAyLCAweDEzLCAweDA5LCAweDhBLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDg5LCAweDU1LCAweDU1LCAweDk5LCAweDAwLCAweDA4LCAweDA3LCAweDg1LCAweDk5LCAweDAwLCAweDA4LAotCSAweDA3LCAweDg1LCAweDg1MCwgMHg4NEMsIDB4ODQ4LCAweDFFRCwgMHgxRUUsIDB4MUVGfSwKLQl7Ci0JIDY0LCA1MzIwLCAzNTQ3LCAweDcxLCAweDAyLCAweDE0LCAweDA5LCAweDgzLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDg4LCAweDU1LCAweDU1LCAweDg4LCAweDAwLCAweDA3LCAweDA3LCAweDg0LCAweDg4LCAweDAwLCAweDA3LAotCSAweDA3LCAweDg0LCAweDg1NCwgMHg4NTAsIDB4ODRDLCAweDFFQywgMHgxRUQsIDB4MUVFfSwKLQl7Ci0JIDY2LCA1MzMwLCAzNTUzLCAweDcxLCAweDAyLCAweDE1LCAweDA5LCAweDgzLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDg4LCAweDU1LCAweDU1LCAweDg4LCAweDAwLCAweDA3LCAweDA3LCAweDg0LCAweDg4LCAweDAwLCAweDA3LAotCSAweDA3LCAweDg0LCAweDg1OCwgMHg4NTQsIDB4ODUwLCAweDFFQiwgMHgxRUMsIDB4MUVEfSwKLQl7Ci0JIDY4LCA1MzQwLCAzNTYwLCAweDcxLCAweDAyLCAweDE2LCAweDA4LCAweDdDLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDg4LCAweDQ0LCAweDQ0LCAweDg4LCAweDAwLCAweDA3LCAweDA2LCAweDg0LCAweDg4LCAweDAwLCAweDA3LAotCSAweDA2LCAweDg0LCAweDg1QywgMHg4NTgsIDB4ODU0LCAweDFFQSwgMHgxRUIsIDB4MUVDfSwKLQl7Ci0JIDcwLCA1MzUwLCAzNTY3LCAweDcxLCAweDAyLCAweDE3LCAweDA4LCAweDdDLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDg4LCAweDQ0LCAweDQ0LCAweDg4LCAweDAwLCAweDA3LCAweDA2LCAweDg0LCAweDg4LCAweDAwLCAweDA3LAotCSAweDA2LCAweDg0LCAweDg2MCwgMHg4NUMsIDB4ODU4LCAweDFFOSwgMHgxRUEsIDB4MUVCfSwKLQl7Ci0JIDcyLCA1MzYwLCAzNTczLCAweDcxLCAweDAyLCAweDE4LCAweDA4LCAweDc1LCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDg3LCAweDQ0LCAweDQ0LCAweDc3LCAweDAwLCAweDA2LCAweDA1LCAweDgzLCAweDc3LCAweDAwLCAweDA2LAotCSAweDA1LCAweDgzLCAweDg2NCwgMHg4NjAsIDB4ODVDLCAweDFFOCwgMHgxRTksIDB4MUVBfSwKLQl7Ci0JIDc0LCA1MzcwLCAzNTgwLCAweDcxLCAweDAyLCAweDE5LCAweDA4LCAweDc1LCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDg3LCAweDQ0LCAweDQ0LCAweDc3LCAweDAwLCAweDA2LCAweDA1LCAweDgzLCAweDc3LCAweDAwLCAweDA2LAotCSAweDA1LCAweDgzLCAweDg2OCwgMHg4NjQsIDB4ODYwLCAweDFFNywgMHgxRTgsIDB4MUU5fSwKLQl7Ci0JIDc2LCA1MzgwLCAzNTg3LCAweDcxLCAweDAyLCAweDFBLCAweDA4LCAweDZFLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDg3LCAweDMzLCAweDMzLCAweDc3LCAweDAwLCAweDA2LCAweDA0LCAweDgyLCAweDc3LCAweDAwLCAweDA2LAotCSAweDA0LCAweDgyLCAweDg2QywgMHg4NjgsIDB4ODY0LCAweDFFNiwgMHgxRTcsIDB4MUU4fSwKLQl7Ci0JIDc4LCA1MzkwLCAzNTkzLCAweDcxLCAweDAyLCAweDFCLCAweDA4LCAweDZFLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDg3LCAweDMzLCAweDMzLCAweDc3LCAweDAwLCAweDA2LCAweDA0LCAweDgyLCAweDc3LCAweDAwLCAweDA2LAotCSAweDA0LCAweDgyLCAweDg3MCwgMHg4NkMsIDB4ODY4LCAweDFFNSwgMHgxRTYsIDB4MUU3fSwKLQl7Ci0JIDgwLCA1NDAwLCAzNjAwLCAweDcxLCAweDAyLCAweDFDLCAweDA3LCAweDY3LCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDg2LCAweDMzLCAweDMzLCAweDY2LCAweDAwLCAweDA1LCAweDA0LCAweDgxLCAweDY2LCAweDAwLCAweDA1LAotCSAweDA0LCAweDgxLCAweDg3NCwgMHg4NzAsIDB4ODZDLCAweDFFNSwgMHgxRTUsIDB4MUU2fSwKLQl7Ci0JIDgyLCA1NDEwLCAzNjA3LCAweDcxLCAweDAyLCAweDFELCAweDA3LCAweDY3LCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDg2LCAweDMzLCAweDMzLCAweDY2LCAweDAwLCAweDA1LCAweDA0LCAweDgxLCAweDY2LCAweDAwLCAweDA1LAotCSAweDA0LCAweDgxLCAweDg3OCwgMHg4NzQsIDB4ODcwLCAweDFFNCwgMHgxRTUsIDB4MUU1fSwKLQl7Ci0JIDg0LCA1NDIwLCAzNjEzLCAweDcxLCAweDAyLCAweDFFLCAweDA3LCAweDYxLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDg2LCAweDIyLCAweDIyLCAweDY2LCAweDAwLCAweDA1LCAweDAzLCAweDgwLCAweDY2LCAweDAwLCAweDA1LAotCSAweDAzLCAweDgwLCAweDg3QywgMHg4NzgsIDB4ODc0LCAweDFFMywgMHgxRTQsIDB4MUU1fSwKLQl7Ci0JIDg2LCA1NDMwLCAzNjIwLCAweDcxLCAweDAyLCAweDFGLCAweDA3LCAweDYxLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDg2LCAweDIyLCAweDIyLCAweDY2LCAweDAwLCAweDA1LCAweDAzLCAweDgwLCAweDY2LCAweDAwLCAweDA1LAotCSAweDAzLCAweDgwLCAweDg4MCwgMHg4N0MsIDB4ODc4LCAweDFFMiwgMHgxRTMsIDB4MUU0fSwKLQl7Ci0JIDg4LCA1NDQwLCAzNjI3LCAweDcxLCAweDAyLCAweDIwLCAweDA3LCAweDVBLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDg1LCAweDIyLCAweDIyLCAweDU1LCAweDAwLCAweDA0LCAweDAyLCAweDgwLCAweDU1LCAweDAwLCAweDA0LAotCSAweDAyLCAweDgwLCAweDg4NCwgMHg4ODAsIDB4ODdDLCAweDFFMSwgMHgxRTIsIDB4MUUzfSwKLQl7Ci0JIDkwLCA1NDUwLCAzNjMzLCAweDcxLCAweDAyLCAweDIxLCAweDA3LCAweDVBLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDg1LCAweDIyLCAweDIyLCAweDU1LCAweDAwLCAweDA0LCAweDAyLCAweDgwLCAweDU1LCAweDAwLCAweDA0LAotCSAweDAyLCAweDgwLCAweDg4OCwgMHg4ODQsIDB4ODgwLCAweDFFMCwgMHgxRTEsIDB4MUUyfSwKLQl7Ci0JIDkyLCA1NDYwLCAzNjQwLCAweDcxLCAweDAyLCAweDIyLCAweDA2LCAweDUzLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDg1LCAweDExLCAweDExLCAweDU1LCAweDAwLCAweDA0LCAweDAxLCAweDgwLCAweDU1LCAweDAwLCAweDA0LAotCSAweDAxLCAweDgwLCAweDg4QywgMHg4ODgsIDB4ODg0LCAweDFERiwgMHgxRTAsIDB4MUUxfSwKLQl7Ci0JIDk0LCA1NDcwLCAzNjQ3LCAweDcxLCAweDAyLCAweDIzLCAweDA2LCAweDUzLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDg1LCAweDExLCAweDExLCAweDU1LCAweDAwLCAweDA0LCAweDAxLCAweDgwLCAweDU1LCAweDAwLCAweDA0LAotCSAweDAxLCAweDgwLCAweDg5MCwgMHg4OEMsIDB4ODg4LCAweDFERSwgMHgxREYsIDB4MUUwfSwKLQl7Ci0JIDk2LCA1NDgwLCAzNjUzLCAweDcxLCAweDAyLCAweDI0LCAweDA2LCAweDRELCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDg0LCAweDExLCAweDExLCAweDQ0LCAweDAwLCAweDAzLCAweDAwLCAweDgwLCAweDQ0LCAweDAwLCAweDAzLAotCSAweDAwLCAweDgwLCAweDg5NCwgMHg4OTAsIDB4ODhDLCAweDFERCwgMHgxREUsIDB4MURGfSwKLQl7Ci0JIDk4LCA1NDkwLCAzNjYwLCAweDcxLCAweDAyLCAweDI1LCAweDA2LCAweDRELCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDg0LCAweDExLCAweDExLCAweDQ0LCAweDAwLCAweDAzLCAweDAwLCAweDgwLCAweDQ0LCAweDAwLCAweDAzLAotCSAweDAwLCAweDgwLCAweDg5OCwgMHg4OTQsIDB4ODkwLCAweDFERCwgMHgxREQsIDB4MURFfSwKLQl7Ci0JIDEwMCwgNTUwMCwgMzY2NywgMHg3MSwgMHgwMiwgMHgyNiwgMHgwNiwgMHg0NywgMHgwMSwgMHgwNCwgMHgwQSwKLQkgMHgwMCwgMHg4NCwgMHgwMCwgMHgwMCwgMHg0NCwgMHgwMCwgMHgwMywgMHgwMCwgMHg4MCwgMHg0NCwgMHgwMCwgMHgwMywKLQkgMHgwMCwgMHg4MCwgMHg4OUMsIDB4ODk4LCAweDg5NCwgMHgxREMsIDB4MURELCAweDFERH0sCi0JewotCSAxMDIsIDU1MTAsIDM2NzMsIDB4NzEsIDB4MDIsIDB4MjcsIDB4MDYsIDB4NDcsIDB4MDEsIDB4MDQsIDB4MEEsCi0JIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDAsIDB4NDQsIDB4MDAsIDB4MDMsIDB4MDAsIDB4ODAsIDB4NDQsIDB4MDAsIDB4MDMsCi0JIDB4MDAsIDB4ODAsIDB4OEEwLCAweDg5QywgMHg4OTgsIDB4MURCLCAweDFEQywgMHgxRER9LAotCXsKLQkgMTA0LCA1NTIwLCAzNjgwLCAweDcxLCAweDAyLCAweDI4LCAweDA1LCAweDQwLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDgzLCAweDAwLCAweDAwLCAweDMzLCAweDAwLCAweDAyLCAweDAwLCAweDgwLCAweDMzLCAweDAwLCAweDAyLAotCSAweDAwLCAweDgwLCAweDhBNCwgMHg4QTAsIDB4ODlDLCAweDFEQSwgMHgxREIsIDB4MURDfSwKLQl7Ci0JIDEwNiwgNTUzMCwgMzY4NywgMHg3MSwgMHgwMiwgMHgyOSwgMHgwNSwgMHg0MCwgMHgwMSwgMHgwNCwgMHgwQSwKLQkgMHgwMCwgMHg4MywgMHgwMCwgMHgwMCwgMHgzMywgMHgwMCwgMHgwMiwgMHgwMCwgMHg4MCwgMHgzMywgMHgwMCwgMHgwMiwKLQkgMHgwMCwgMHg4MCwgMHg4QTgsIDB4OEE0LCAweDhBMCwgMHgxRDksIDB4MURBLCAweDFEQn0sCi0JewotCSAxMDgsIDU1NDAsIDM2OTMsIDB4NzEsIDB4MDIsIDB4MkEsIDB4MDUsIDB4M0EsIDB4MDEsIDB4MDQsIDB4MEEsCi0JIDB4MDAsIDB4ODMsIDB4MDAsIDB4MDAsIDB4MzMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4ODAsIDB4MzMsIDB4MDAsIDB4MDIsCi0JIDB4MDAsIDB4ODAsIDB4OEFDLCAweDhBOCwgMHg4QTQsIDB4MUQ4LCAweDFEOSwgMHgxREF9LAotCXsKLQkgMTEwLCA1NTUwLCAzNzAwLCAweDcxLCAweDAyLCAweDJCLCAweDA1LCAweDNBLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDgzLCAweDAwLCAweDAwLCAweDMzLCAweDAwLCAweDAyLCAweDAwLCAweDgwLCAweDMzLCAweDAwLCAweDAyLAotCSAweDAwLCAweDgwLCAweDhCMCwgMHg4QUMsIDB4OEE4LCAweDFENywgMHgxRDgsIDB4MUQ5fSwKLQl7Ci0JIDExMiwgNTU2MCwgMzcwNywgMHg3MSwgMHgwMiwgMHgyQywgMHgwNSwgMHgzNCwgMHgwMSwgMHgwNCwgMHgwQSwKLQkgMHgwMCwgMHg4MiwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHg4MCwgMHgyMiwgMHgwMCwgMHgwMSwKLQkgMHgwMCwgMHg4MCwgMHg4QjQsIDB4OEIwLCAweDhBQywgMHgxRDcsIDB4MUQ3LCAweDFEOH0sCi0JewotCSAxMTQsIDU1NzAsIDM3MTMsIDB4NzEsIDB4MDIsIDB4MkQsIDB4MDUsIDB4MzQsIDB4MDEsIDB4MDQsIDB4MEEsCi0JIDB4MDAsIDB4ODIsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4ODAsIDB4MjIsIDB4MDAsIDB4MDEsCi0JIDB4MDAsIDB4ODAsIDB4OEI4LCAweDhCNCwgMHg4QjAsIDB4MUQ2LCAweDFENywgMHgxRDd9LAotCXsKLQkgMTE2LCA1NTgwLCAzNzIwLCAweDcxLCAweDAyLCAweDJFLCAweDA0LCAweDJFLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDgyLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDAxLCAweDAwLCAweDgwLCAweDIyLCAweDAwLCAweDAxLAotCSAweDAwLCAweDgwLCAweDhCQywgMHg4QjgsIDB4OEI0LCAweDFENSwgMHgxRDYsIDB4MUQ3fSwKLQl7Ci0JIDExOCwgNTU5MCwgMzcyNywgMHg3MSwgMHgwMiwgMHgyRiwgMHgwNCwgMHgyRSwgMHgwMSwgMHgwNCwgMHgwQSwKLQkgMHgwMCwgMHg4MiwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHg4MCwgMHgyMiwgMHgwMCwgMHgwMSwKLQkgMHgwMCwgMHg4MCwgMHg4QzAsIDB4OEJDLCAweDhCOCwgMHgxRDQsIDB4MUQ1LCAweDFENn0sCi0JewotCSAxMjAsIDU2MDAsIDM3MzMsIDB4NzEsIDB4MDIsIDB4MzAsIDB4MDQsIDB4MjgsIDB4MDEsIDB4MDQsIDB4MEEsCi0JIDB4MDAsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4ODAsIDB4MTEsIDB4MDAsIDB4MDEsCi0JIDB4MDAsIDB4ODAsIDB4OEM0LCAweDhDMCwgMHg4QkMsIDB4MUQzLCAweDFENCwgMHgxRDV9LAotCXsKLQkgMTIyLCA1NjEwLCAzNzQwLCAweDcxLCAweDAyLCAweDMxLCAweDA0LCAweDI4LCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDgxLCAweDAwLCAweDAwLCAweDExLCAweDAwLCAweDAxLCAweDAwLCAweDgwLCAweDExLCAweDAwLCAweDAxLAotCSAweDAwLCAweDgwLCAweDhDOCwgMHg4QzQsIDB4OEMwLCAweDFEMiwgMHgxRDMsIDB4MUQ0fSwKLQl7Ci0JIDEyNCwgNTYyMCwgMzc0NywgMHg3MSwgMHgwMiwgMHgzMiwgMHgwNCwgMHgyMSwgMHgwMSwgMHgwNCwgMHgwQSwKLQkgMHgwMCwgMHg4MSwgMHgwMCwgMHgwMCwgMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgxMSwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg4MCwgMHg4Q0MsIDB4OEM4LCAweDhDNCwgMHgxRDIsIDB4MUQyLCAweDFEM30sCi0JewotCSAxMjYsIDU2MzAsIDM3NTMsIDB4NzEsIDB4MDIsIDB4MzMsIDB4MDQsIDB4MjEsIDB4MDEsIDB4MDQsIDB4MEEsCi0JIDB4MDAsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MTEsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4ODAsIDB4OEQwLCAweDhDQywgMHg4QzgsIDB4MUQxLCAweDFEMiwgMHgxRDJ9LAotCXsKLQkgMTI4LCA1NjQwLCAzNzYwLCAweDcxLCAweDAyLCAweDM0LCAweDAzLCAweDFDLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDgwLCAweDhENCwgMHg4RDAsIDB4OENDLCAweDFEMCwgMHgxRDEsIDB4MUQyfSwKLQl7Ci0JIDEzMCwgNTY1MCwgMzc2NywgMHg3MSwgMHgwMiwgMHgzNSwgMHgwMywgMHgxQywgMHgwMSwgMHgwNCwgMHgwQSwKLQkgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg4MCwgMHg4RDgsIDB4OEQ0LCAweDhEMCwgMHgxQ0YsIDB4MUQwLCAweDFEMX0sCi0JewotCSAxMzIsIDU2NjAsIDM3NzMsIDB4NzEsIDB4MDIsIDB4MzYsIDB4MDMsIDB4MTYsIDB4MDEsIDB4MDQsIDB4MEEsCi0JIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4ODAsIDB4OERDLCAweDhEOCwgMHg4RDQsIDB4MUNFLCAweDFDRiwgMHgxRDB9LAotCXsKLQkgMTM0LCA1NjcwLCAzNzgwLCAweDcxLCAweDAyLCAweDM3LCAweDAzLCAweDE2LCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDgwLCAweDhFMCwgMHg4REMsIDB4OEQ4LCAweDFDRSwgMHgxQ0UsIDB4MUNGfSwKLQl7Ci0JIDEzNiwgNTY4MCwgMzc4NywgMHg3MSwgMHgwMiwgMHgzOCwgMHgwMywgMHgxMCwgMHgwMSwgMHgwNCwgMHgwQSwKLQkgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg4MCwgMHg4RTQsIDB4OEUwLCAweDhEQywgMHgxQ0QsIDB4MUNFLCAweDFDRX0sCi0JewotCSAxMzgsIDU2OTAsIDM3OTMsIDB4NzEsIDB4MDIsIDB4MzksIDB4MDMsIDB4MTAsIDB4MDEsIDB4MDQsIDB4MEEsCi0JIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4ODAsIDB4OEU4LCAweDhFNCwgMHg4RTAsIDB4MUNDLCAweDFDRCwgMHgxQ0V9LAotCXsKLQkgMTQwLCA1NzAwLCAzODAwLCAweDcxLCAweDAyLCAweDNBLCAweDAyLCAweDBBLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDgwLCAweDhFQywgMHg4RTgsIDB4OEU0LCAweDFDQiwgMHgxQ0MsIDB4MUNEfSwKLQl7Ci0JIDE0MiwgNTcxMCwgMzgwNywgMHg3MSwgMHgwMiwgMHgzQiwgMHgwMiwgMHgwQSwgMHgwMSwgMHgwNCwgMHgwQSwKLQkgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg4MCwgMHg4RjAsIDB4OEVDLCAweDhFOCwgMHgxQ0EsIDB4MUNCLCAweDFDQ30sCi0JewotCSAxNDQsIDU3MjAsIDM4MTMsIDB4NzEsIDB4MDIsIDB4M0MsIDB4MDIsIDB4MEEsIDB4MDEsIDB4MDQsIDB4MEEsCi0JIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4ODAsIDB4OEY0LCAweDhGMCwgMHg4RUMsIDB4MUM5LCAweDFDQSwgMHgxQ0J9LAotCXsKLQkgMTQ1LCA1NzI1LCAzODE3LCAweDcyLCAweDA0LCAweDc5LCAweDAyLCAweDAzLCAweDAxLCAweDAzLCAweDE0LAotCSAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDgwLCAweDhGNiwgMHg4RjIsIDB4OEVFLCAweDFDOSwgMHgxQ0EsIDB4MUNCfSwKLQl7Ci0JIDE0NiwgNTczMCwgMzgyMCwgMHg3MSwgMHgwMiwgMHgzRCwgMHgwMiwgMHgwQSwgMHgwMSwgMHgwNCwgMHgwQSwKLQkgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg4MCwgMHg4RjgsIDB4OEY0LCAweDhGMCwgMHgxQzksIDB4MUM5LCAweDFDQX0sCi0JewotCSAxNDcsIDU3MzUsIDM4MjMsIDB4NzIsIDB4MDQsIDB4N0IsIDB4MDIsIDB4MDMsIDB4MDEsIDB4MDMsIDB4MTQsCi0JIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4ODAsIDB4OEZBLCAweDhGNiwgMHg4RjIsIDB4MUM4LCAweDFDOSwgMHgxQ0F9LAotCXsKLQkgMTQ4LCA1NzQwLCAzODI3LCAweDcxLCAweDAyLCAweDNFLCAweDAyLCAweDBBLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDgwLCAweDhGQywgMHg4RjgsIDB4OEY0LCAweDFDOCwgMHgxQzksIDB4MUM5fSwKLQl7Ci0JIDE0OSwgNTc0NSwgMzgzMCwgMHg3MiwgMHgwNCwgMHg3RCwgMHgwMiwgMHhGRSwgMHgwMCwgMHgwMywgMHgxNCwKLQkgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg4MCwgMHg4RkUsIDB4OEZBLCAweDhGNiwgMHgxQzgsIDB4MUM4LCAweDFDOX0sCi0JewotCSAxNTAsIDU3NTAsIDM4MzMsIDB4NzEsIDB4MDIsIDB4M0YsIDB4MDIsIDB4MEEsIDB4MDEsIDB4MDQsIDB4MEEsCi0JIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4ODAsIDB4OTAwLCAweDhGQywgMHg4RjgsIDB4MUM3LCAweDFDOCwgMHgxQzl9LAotCXsKLQkgMTUxLCA1NzU1LCAzODM3LCAweDcyLCAweDA0LCAweDdGLCAweDAyLCAweEZFLCAweDAwLCAweDAzLCAweDE0LAotCSAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDgwLCAweDkwMiwgMHg4RkUsIDB4OEZBLCAweDFDNywgMHgxQzgsIDB4MUM4fSwKLQl7Ci0JIDE1MiwgNTc2MCwgMzg0MCwgMHg3MSwgMHgwMiwgMHg0MCwgMHgwMiwgMHgwQSwgMHgwMSwgMHgwNCwgMHgwQSwKLQkgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg4MCwgMHg5MDQsIDB4OTAwLCAweDhGQywgMHgxQzYsIDB4MUM3LCAweDFDOH0sCi0JewotCSAxNTMsIDU3NjUsIDM4NDMsIDB4NzIsIDB4MDQsIDB4ODEsIDB4MDIsIDB4RjgsIDB4MDAsIDB4MDMsIDB4MTQsCi0JIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4ODAsIDB4OTA2LCAweDkwMiwgMHg4RkUsIDB4MUM2LCAweDFDNywgMHgxQzh9LAotCXsKLQkgMTU0LCA1NzcwLCAzODQ3LCAweDcxLCAweDAyLCAweDQxLCAweDAyLCAweDBBLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDgwLCAweDkwOCwgMHg5MDQsIDB4OTAwLCAweDFDNiwgMHgxQzYsIDB4MUM3fSwKLQl7Ci0JIDE1NSwgNTc3NSwgMzg1MCwgMHg3MiwgMHgwNCwgMHg4MywgMHgwMiwgMHhGOCwgMHgwMCwgMHgwMywgMHgxNCwKLQkgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg4MCwgMHg5MEEsIDB4OTA2LCAweDkwMiwgMHgxQzUsIDB4MUM2LCAweDFDN30sCi0JewotCSAxNTYsIDU3ODAsIDM4NTMsIDB4NzEsIDB4MDIsIDB4NDIsIDB4MDIsIDB4MEEsIDB4MDEsIDB4MDQsIDB4MEEsCi0JIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4ODAsIDB4OTBDLCAweDkwOCwgMHg5MDQsIDB4MUM1LCAweDFDNiwgMHgxQzZ9LAotCXsKLQkgMTU3LCA1Nzg1LCAzODU3LCAweDcyLCAweDA0LCAweDg1LCAweDAyLCAweEYyLCAweDAwLCAweDAzLCAweDE0LAotCSAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDgwLCAweDkwRSwgMHg5MEEsIDB4OTA2LCAweDFDNCwgMHgxQzUsIDB4MUM2fSwKLQl7Ci0JIDE1OCwgNTc5MCwgMzg2MCwgMHg3MSwgMHgwMiwgMHg0MywgMHgwMiwgMHgwQSwgMHgwMSwgMHgwNCwgMHgwQSwKLQkgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg4MCwgMHg5MTAsIDB4OTBDLCAweDkwOCwgMHgxQzQsIDB4MUM1LCAweDFDNn0sCi0JewotCSAxNTksIDU3OTUsIDM4NjMsIDB4NzIsIDB4MDQsIDB4ODcsIDB4MDIsIDB4RjIsIDB4MDAsIDB4MDMsIDB4MTQsCi0JIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4ODAsIDB4OTEyLCAweDkwRSwgMHg5MEEsIDB4MUM0LCAweDFDNCwgMHgxQzV9LAotCXsKLQkgMTYwLCA1ODAwLCAzODY3LCAweDcxLCAweDAyLCAweDQ0LCAweDAxLCAweDBBLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDgwLCAweDkxNCwgMHg5MTAsIDB4OTBDLCAweDFDMywgMHgxQzQsIDB4MUM1fSwKLQl7Ci0JIDE2MSwgNTgwNSwgMzg3MCwgMHg3MiwgMHgwNCwgMHg4OSwgMHgwMSwgMHhFRCwgMHgwMCwgMHgwMywgMHgxNCwKLQkgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg4MCwgMHg5MTYsIDB4OTEyLCAweDkwRSwgMHgxQzMsIDB4MUM0LCAweDFDNH0sCi0JewotCSAxNjIsIDU4MTAsIDM4NzMsIDB4NzEsIDB4MDIsIDB4NDUsIDB4MDEsIDB4MEEsIDB4MDEsIDB4MDQsIDB4MEEsCi0JIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4ODAsIDB4OTE4LCAweDkxNCwgMHg5MTAsIDB4MUMyLCAweDFDMywgMHgxQzR9LAotCXsKLQkgMTYzLCA1ODE1LCAzODc3LCAweDcyLCAweDA0LCAweDhCLCAweDAxLCAweEVELCAweDAwLCAweDAzLCAweDE0LAotCSAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDgwLCAweDkxQSwgMHg5MTYsIDB4OTEyLCAweDFDMiwgMHgxQzMsIDB4MUM0fSwKLQl7Ci0JIDE2NCwgNTgyMCwgMzg4MCwgMHg3MSwgMHgwMiwgMHg0NiwgMHgwMSwgMHgwQSwgMHgwMSwgMHgwNCwgMHgwQSwKLQkgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg4MCwgMHg5MUMsIDB4OTE4LCAweDkxNCwgMHgxQzIsIDB4MUMyLCAweDFDM30sCi0JewotCSAxNjUsIDU4MjUsIDM4ODMsIDB4NzIsIDB4MDQsIDB4OEQsIDB4MDEsIDB4RUQsIDB4MDAsIDB4MDMsIDB4MTQsCi0JIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4ODAsIDB4OTFFLCAweDkxQSwgMHg5MTYsIDB4MUMxLCAweDFDMiwgMHgxQzN9LAotCXsKLQkgMTY2LCA1ODMwLCAzODg3LCAweDcxLCAweDAyLCAweDQ3LCAweDAxLCAweDBBLCAweDAxLCAweDA0LCAweDBBLAotCSAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDgwLCAweDkyMCwgMHg5MUMsIDB4OTE4LCAweDFDMSwgMHgxQzIsIDB4MUMyfSwKLQl7Ci0JIDE2OCwgNTg0MCwgMzg5MywgMHg3MSwgMHgwMiwgMHg0OCwgMHgwMSwgMHgwQSwgMHgwMSwgMHgwNCwgMHgwQSwKLQkgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg4MCwgMHg5MjQsIDB4OTIwLCAweDkxQywgMHgxQzAsIDB4MUMxLCAweDFDMn0sCi0JewotCSAxNzAsIDU4NTAsIDM5MDAsIDB4NzEsIDB4MDIsIDB4NDksIDB4MDEsIDB4RTAsIDB4MDAsIDB4MDQsIDB4MEEsCi0JIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4ODAsIDB4OTI4LCAweDkyNCwgMHg5MjAsIDB4MUJGLCAweDFDMCwgMHgxQzF9LAotCXsKLQkgMTcyLCA1ODYwLCAzOTA3LCAweDcxLCAweDAyLCAweDRBLCAweDAxLCAweERFLCAweDAwLCAweDA0LCAweDBBLAotCSAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDgwLCAweDkyQywgMHg5MjgsIDB4OTI0LCAweDFCRiwgMHgxQkYsIDB4MUMwfSwKLQl7Ci0JIDE3NCwgNTg3MCwgMzkxMywgMHg3MSwgMHgwMiwgMHg0QiwgMHgwMCwgMHhEQiwgMHgwMCwgMHgwNCwgMHgwQSwKLQkgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg4MCwgMHg5MzAsIDB4OTJDLCAweDkyOCwgMHgxQkUsIDB4MUJGLCAweDFCRn0sCi0JewotCSAxNzYsIDU4ODAsIDM5MjAsIDB4NzEsIDB4MDIsIDB4NEMsIDB4MDAsIDB4RDgsIDB4MDAsIDB4MDQsIDB4MEEsCi0JIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4ODAsIDB4OTM0LCAweDkzMCwgMHg5MkMsIDB4MUJELCAweDFCRSwgMHgxQkZ9LAotCXsKLQkgMTc4LCA1ODkwLCAzOTI3LCAweDcxLCAweDAyLCAweDRELCAweDAwLCAweEQ2LCAweDAwLCAweDA0LCAweDBBLAotCSAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDgwLCAweDkzOCwgMHg5MzQsIDB4OTMwLCAweDFCQywgMHgxQkQsIDB4MUJFfSwKLQl7Ci0JIDE4MCwgNTkwMCwgMzkzMywgMHg3MSwgMHgwMiwgMHg0RSwgMHgwMCwgMHhEMywgMHgwMCwgMHgwNCwgMHgwQSwKLQkgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg4MCwgMHg5M0MsIDB4OTM4LCAweDkzNCwgMHgxQkMsIDB4MUJDLCAweDFCRH0sCi0JewotCSAxODIsIDU5MTAsIDM5NDAsIDB4NzEsIDB4MDIsIDB4NEYsIDB4MDAsIDB4RDYsIDB4MDAsIDB4MDQsIDB4MEEsCi0JIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4ODAsIDB4OTQwLCAweDkzQywgMHg5MzgsIDB4MUJCLCAweDFCQywgMHgxQkN9LAotCXsKLQkgMSwgMjQxMiwgMzIxNiwgMHg3MywgMHgwOSwgMHg2QywgMHgwRiwgMHgwMCwgMHgwMSwgMHgwNywgMHgxNSwKLQkgMHgwMSwgMHg4RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4OCwgMHgwRCwgMHgwQywgMHg4MCwgMHhGRiwgMHg4OCwgMHgwRCwKLQkgMHgwQywgMHg4MCwgMHgzQzksIDB4M0M1LCAweDNDMSwgMHg0M0EsIDB4NDNGLCAweDQ0M30sCi0JewotCSAyLCAyNDE3LCAzMjIzLCAweDczLCAweDA5LCAweDcxLCAweDBGLCAweDAwLCAweDAxLCAweDA3LCAweDE1LAotCSAweDAxLCAweDhGLCAweEZGLCAweEZGLCAweEZGLCAweDg4LCAweDBDLCAweDBCLCAweDgwLCAweEZGLCAweDg4LCAweDBDLAotCSAweDBCLCAweDgwLCAweDNDQiwgMHgzQzcsIDB4M0MzLCAweDQzOCwgMHg0M0QsIDB4NDQxfSwKLQl7Ci0JIDMsIDI0MjIsIDMyMjksIDB4NzMsIDB4MDksIDB4NzYsIDB4MEYsIDB4MDAsIDB4MDEsIDB4MDcsIDB4MTUsCi0JIDB4MDEsIDB4OEYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODgsIDB4MEMsIDB4MEEsIDB4ODAsIDB4RkYsIDB4ODgsIDB4MEMsCi0JIDB4MEEsIDB4ODAsIDB4M0NELCAweDNDOSwgMHgzQzUsIDB4NDM2LCAweDQzQSwgMHg0M0Z9LAotCXsKLQkgNCwgMjQyNywgMzIzNiwgMHg3MywgMHgwOSwgMHg3QiwgMHgwRiwgMHgwMCwgMHgwMSwgMHgwNywgMHgxNSwKLQkgMHgwMSwgMHg4RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4OCwgMHgwQywgMHgwQSwgMHg4MCwgMHhGRiwgMHg4OCwgMHgwQywKLQkgMHgwQSwgMHg4MCwgMHgzQ0YsIDB4M0NCLCAweDNDNywgMHg0MzQsIDB4NDM4LCAweDQzRH0sCi0JewotCSA1LCAyNDMyLCAzMjQzLCAweDczLCAweDA5LCAweDgwLCAweDBGLCAweDAwLCAweDAxLCAweDA3LCAweDE1LAotCSAweDAxLCAweDhGLCAweEZGLCAweEZGLCAweEZGLCAweDg4LCAweDBDLCAweDA5LCAweDgwLCAweEZGLCAweDg4LCAweDBDLAotCSAweDA5LCAweDgwLCAweDNEMSwgMHgzQ0QsIDB4M0M5LCAweDQzMSwgMHg0MzYsIDB4NDNBfSwKLQl7Ci0JIDYsIDI0MzcsIDMyNDksIDB4NzMsIDB4MDksIDB4ODUsIDB4MEYsIDB4MDAsIDB4MDEsIDB4MDcsIDB4MTUsCi0JIDB4MDEsIDB4OEYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODgsIDB4MEIsIDB4MDgsIDB4ODAsIDB4RkYsIDB4ODgsIDB4MEIsCi0JIDB4MDgsIDB4ODAsIDB4M0QzLCAweDNDRiwgMHgzQ0IsIDB4NDJGLCAweDQzNCwgMHg0Mzh9LAotCXsKLQkgNywgMjQ0MiwgMzI1NiwgMHg3MywgMHgwOSwgMHg4QSwgMHgwRiwgMHgwMCwgMHgwMSwgMHgwNywgMHgxNSwKLQkgMHgwMSwgMHg4RiwgMHhGRiwgMHhGRiwgMHhGRiwgMHg4OCwgMHgwQSwgMHgwNywgMHg4MCwgMHhGRiwgMHg4OCwgMHgwQSwKLQkgMHgwNywgMHg4MCwgMHgzRDUsIDB4M0QxLCAweDNDRCwgMHg0MkQsIDB4NDMxLCAweDQzNn0sCi0JewotCSA4LCAyNDQ3LCAzMjYzLCAweDczLCAweDA5LCAweDhGLCAweDBGLCAweDAwLCAweDAxLCAweDA3LCAweDE1LAotCSAweDAxLCAweDhGLCAweEZGLCAweEZGLCAweEZGLCAweDg4LCAweDBBLCAweDA2LCAweDgwLCAweEZGLCAweDg4LCAweDBBLAotCSAweDA2LCAweDgwLCAweDNENywgMHgzRDMsIDB4M0NGLCAweDQyQiwgMHg0MkYsIDB4NDM0fSwKLQl7Ci0JIDksIDI0NTIsIDMyNjksIDB4NzMsIDB4MDksIDB4OTQsIDB4MEYsIDB4MDAsIDB4MDEsIDB4MDcsIDB4MTUsCi0JIDB4MDEsIDB4OEYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODgsIDB4MDksIDB4MDYsIDB4ODAsIDB4RkYsIDB4ODgsIDB4MDksCi0JIDB4MDYsIDB4ODAsIDB4M0Q5LCAweDNENSwgMHgzRDEsIDB4NDI5LCAweDQyRCwgMHg0MzF9LAotCXsKLQkgMTAsIDI0NTcsIDMyNzYsIDB4NzMsIDB4MDksIDB4OTksIDB4MEYsIDB4MDAsIDB4MDEsIDB4MDcsIDB4MTUsCi0JIDB4MDEsIDB4OEYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODgsIDB4MDgsIDB4MDUsIDB4ODAsIDB4RkYsIDB4ODgsIDB4MDgsCi0JIDB4MDUsIDB4ODAsIDB4M0RCLCAweDNENywgMHgzRDMsIDB4NDI3LCAweDQyQiwgMHg0MkZ9LAotCXsKLQkgMTEsIDI0NjIsIDMyODMsIDB4NzMsIDB4MDksIDB4OUUsIDB4MEYsIDB4MDAsIDB4MDEsIDB4MDcsIDB4MTUsCi0JIDB4MDEsIDB4OEYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODgsIDB4MDgsIDB4MDQsIDB4ODAsIDB4RkYsIDB4ODgsIDB4MDgsCi0JIDB4MDQsIDB4ODAsIDB4M0RELCAweDNEOSwgMHgzRDUsIDB4NDI0LCAweDQyOSwgMHg0MkR9LAotCXsKLQkgMTIsIDI0NjcsIDMyODksIDB4NzMsIDB4MDksIDB4QTMsIDB4MEYsIDB4MDAsIDB4MDEsIDB4MDcsIDB4MTUsCi0JIDB4MDEsIDB4OEYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODgsIDB4MDgsIDB4MDMsIDB4ODAsIDB4RkYsIDB4ODgsIDB4MDgsCi0JIDB4MDMsIDB4ODAsIDB4M0RGLCAweDNEQiwgMHgzRDcsIDB4NDIyLCAweDQyNywgMHg0MkJ9LAotCXsKLQkgMTMsIDI0NzIsIDMyOTYsIDB4NzMsIDB4MDksIDB4QTgsIDB4MEYsIDB4MDAsIDB4MDEsIDB4MDcsIDB4MTUsCi0JIDB4MDEsIDB4OEYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODgsIDB4MDcsIDB4MDMsIDB4ODAsIDB4RkYsIDB4ODgsIDB4MDcsCi0JIDB4MDMsIDB4ODAsIDB4M0UxLCAweDNERCwgMHgzRDksIDB4NDIwLCAweDQyNCwgMHg0Mjl9LAotCXsKLQkgMTQsIDI0ODQsIDMzMTIsIDB4NzMsIDB4MDksIDB4QjQsIDB4MEYsIDB4RkYsIDB4MDEsIDB4MDcsIDB4MTUsCi0JIDB4MDEsIDB4OEYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4ODgsIDB4MDcsIDB4MDEsIDB4ODAsIDB4RkYsIDB4ODgsIDB4MDcsCi0JIDB4MDEsIDB4ODAsIDB4M0U2LCAweDNFMiwgMHgzREUsIDB4NDFCLCAweDQxRiwgMHg0MjR9Ci19OwotCi1zdGF0aWMgc3RydWN0IGNoYW5faW5mb19ucGh5X3JhZGlvMjA1eCBjaGFuX2luZm9fbnBoeXJldjNfMjA1NltdID0gewotCXsKLQkgMTg0LCA0OTIwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGVjLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAwLCAweDAwLCAweDAwLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDA4LCAweDAwLCAweDdmLAotCSAweDAwLCAweDBiLCAweDAwLCAweGZmLCAweDAwLCAweGZmLCAweDAwLCAweDA4LCAweDAwLCAweDdmLCAweDAwLCAweDBiLAotCSAweDAwLCAweGZmLCAweDAwLCAweDA3YjQsIDB4MDdiMCwgMHgwN2FjLCAweDAyMTQsIDB4MDIxNSwgMHgwMjE2fSwKLQl7Ci0JIDE4NiwgNDkzMCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhlZCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwOCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhmZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwOCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHhmZiwgMHgwMCwgMHgwN2I4LCAweDA3YjQsIDB4MDdiMCwgMHgwMjEzLCAweDAyMTQsIDB4MDIxNX0sCi0JewotCSAxODgsIDQ5NDAsIDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZWUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGIsCi0JIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDdiYywgMHgwN2I4LCAweDA3YjQsIDB4MDIxMiwgMHgwMjEzLCAweDAyMTR9LAotCXsKLQkgMTkwLCA0OTUwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGVmLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAwLCAweDAwLCAweDAwLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDA4LCAweDAwLCAweDdmLAotCSAweDAwLCAweDBiLCAweDAwLCAweGZmLCAweDAwLCAweGZmLCAweDAwLCAweDA4LCAweDAwLCAweDdmLCAweDAwLCAweDBiLAotCSAweDAwLCAweGZmLCAweDAwLCAweDA3YzAsIDB4MDdiYywgMHgwN2I4LCAweDAyMTEsIDB4MDIxMiwgMHgwMjEzfSwKLQl7Ci0JIDE5MiwgNDk2MCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmMCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwOCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhmZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwOCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHhmZiwgMHgwMCwgMHgwN2M0LCAweDA3YzAsIDB4MDdiYywgMHgwMjBmLCAweDAyMTEsIDB4MDIxMn0sCi0JewotCSAxOTQsIDQ5NzAsIDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGIsCi0JIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDdjOCwgMHgwN2M0LCAweDA3YzAsIDB4MDIwZSwgMHgwMjBmLCAweDAyMTF9LAotCXsKLQkgMTk2LCA0OTgwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGYyLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDA4LCAweDAwLCAweDdmLAotCSAweDAwLCAweDBiLCAweDAwLCAweGZmLCAweDAwLCAweGZmLCAweDAwLCAweDA4LCAweDAwLCAweDdmLCAweDAwLCAweDBiLAotCSAweDAwLCAweGZmLCAweDAwLCAweDA3Y2MsIDB4MDdjOCwgMHgwN2M0LCAweDAyMGQsIDB4MDIwZSwgMHgwMjBmfSwKLQl7Ci0JIDE5OCwgNDk5MCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmMywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwOCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhmZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwOCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHhmZiwgMHgwMCwgMHgwN2QwLCAweDA3Y2MsIDB4MDdjOCwgMHgwMjBjLCAweDAyMGQsIDB4MDIwZX0sCi0JewotCSAyMDAsIDUwMDAsIDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGIsCi0JIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDdkNCwgMHgwN2QwLCAweDA3Y2MsIDB4MDIwYiwgMHgwMjBjLCAweDAyMGR9LAotCXsKLQkgMjAyLCA1MDEwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGY1LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDA3LCAweDAwLCAweDdmLAotCSAweDAwLCAweDBiLCAweDAwLCAweGZmLCAweDAwLCAweGZmLCAweDAwLCAweDA3LCAweDAwLCAweDdmLCAweDAwLCAweDBiLAotCSAweDAwLCAweGZmLCAweDAwLCAweDA3ZDgsIDB4MDdkNCwgMHgwN2QwLCAweDAyMGEsIDB4MDIwYiwgMHgwMjBjfSwKLQl7Ci0JIDIwNCwgNTAyMCwgMHhmNywgMHgwMSwgMHgwMSwgMHgwMSwgMHhmNiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwNywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhmZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwNywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHhmZiwgMHgwMCwgMHgwN2RjLCAweDA3ZDgsIDB4MDdkNCwgMHgwMjA5LCAweDAyMGEsIDB4MDIwYn0sCi0JewotCSAyMDYsIDUwMzAsIDB4ZjcsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjcsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGIsCi0JIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDdlMCwgMHgwN2RjLCAweDA3ZDgsIDB4MDIwOCwgMHgwMjA5LCAweDAyMGF9LAotCXsKLQkgMjA4LCA1MDQwLCAweGVmLCAweDAxLCAweDAxLCAweDAxLCAweGY4LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDA3LCAweDAwLCAweDdmLAotCSAweDAwLCAweDBiLCAweDAwLCAweGZmLCAweDAwLCAweGZmLCAweDAwLCAweDA3LCAweDAwLCAweDdmLCAweDAwLCAweDBiLAotCSAweDAwLCAweGZmLCAweDAwLCAweDA3ZTQsIDB4MDdlMCwgMHgwN2RjLCAweDAyMDcsIDB4MDIwOCwgMHgwMjA5fSwKLQl7Ci0JIDIxMCwgNTA1MCwgMHhlZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmOSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwNywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhmZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwNywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHhmZiwgMHgwMCwgMHgwN2U4LCAweDA3ZTQsIDB4MDdlMCwgMHgwMjA2LCAweDAyMDcsIDB4MDIwOH0sCi0JewotCSAyMTIsIDUwNjAsIDB4ZTYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZmEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGIsCi0JIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDdlYywgMHgwN2U4LCAweDA3ZTQsIDB4MDIwNSwgMHgwMjA2LCAweDAyMDd9LAotCXsKLQkgMjE0LCA1MDcwLCAweGU2LCAweDAxLCAweDAxLCAweDAxLCAweGZiLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDA3LCAweDAwLCAweDdmLAotCSAweDAwLCAweDBiLCAweDAwLCAweGZmLCAweDAwLCAweGZmLCAweDAwLCAweDA3LCAweDAwLCAweDdmLCAweDAwLCAweDBiLAotCSAweDAwLCAweGZmLCAweDAwLCAweDA3ZjAsIDB4MDdlYywgMHgwN2U4LCAweDAyMDQsIDB4MDIwNSwgMHgwMjA2fSwKLQl7Ci0JIDIxNiwgNTA4MCwgMHhkZSwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmYywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwNywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhmZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwNywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHhmZiwgMHgwMCwgMHgwN2Y0LCAweDA3ZjAsIDB4MDdlYywgMHgwMjAzLCAweDAyMDQsIDB4MDIwNX0sCi0JewotCSAyMTgsIDUwOTAsIDB4ZGUsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZmQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGIsCi0JIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDdmOCwgMHgwN2Y0LCAweDA3ZjAsIDB4MDIwMiwgMHgwMjAzLCAweDAyMDR9LAotCXsKLQkgMjIwLCA1MTAwLCAweGQ2LCAweDAxLCAweDAxLCAweDAxLCAweGZlLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAyLCAweDAyLCAweDAyLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDA3LCAweDAwLCAweDdmLAotCSAweDAwLCAweDBiLCAweDAwLCAweGZmLCAweDAwLCAweGZmLCAweDAwLCAweDA3LCAweDAwLCAweDdmLCAweDAwLCAweDBiLAotCSAweDAwLCAweGZmLCAweDAwLCAweDA3ZmMsIDB4MDdmOCwgMHgwN2Y0LCAweDAyMDEsIDB4MDIwMiwgMHgwMjAzfSwKLQl7Ci0JIDIyMiwgNTExMCwgMHhkNiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmZiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwNywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhmYywgMHgwMCwgMHhmZiwgMHgwMCwgMHgwNywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHhmYywgMHgwMCwgMHgwODAwLCAweDA3ZmMsIDB4MDdmOCwgMHgwMjAwLCAweDAyMDEsIDB4MDIwMn0sCi0JewotCSAyMjQsIDUxMjAsIDB4Y2UsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGIsCi0JIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDgwNCwgMHgwODAwLCAweDA3ZmMsIDB4MDFmZiwgMHgwMjAwLCAweDAyMDF9LAotCXsKLQkgMjI2LCA1MTMwLCAweGNlLCAweDAxLCAweDAxLCAweDAyLCAweDAxLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAyLCAweDAyLCAweDAyLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDA3LCAweDAwLCAweDdmLAotCSAweDAwLCAweDBiLCAweDAwLCAweGZjLCAweDAwLCAweGZmLCAweDAwLCAweDA3LCAweDAwLCAweDdmLCAweDAwLCAweDBiLAotCSAweDAwLCAweGZjLCAweDAwLCAweDA4MDgsIDB4MDgwNCwgMHgwODAwLCAweDAxZmUsIDB4MDFmZiwgMHgwMjAwfSwKLQl7Ci0JIDIyOCwgNTE0MCwgMHhjNiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwMiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwNywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhmYywgMHgwMCwgMHhmZiwgMHgwMCwgMHgwNywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHhmYywgMHgwMCwgMHgwODBjLCAweDA4MDgsIDB4MDgwNCwgMHgwMWZkLCAweDAxZmUsIDB4MDFmZn0sCi0JewotCSAzMiwgNTE2MCwgMHhiZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwNywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhmYywgMHgwMCwgMHhmZiwgMHgwMCwgMHgwNywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHhmYywgMHgwMCwgMHgwODE0LCAweDA4MTAsIDB4MDgwYywgMHgwMWZiLCAweDAxZmMsIDB4MDFmZH0sCi0JewotCSAzNCwgNTE3MCwgMHhiZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwNSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwNywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhmYywgMHgwMCwgMHhmZiwgMHgwMCwgMHgwNywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHhmYywgMHgwMCwgMHgwODE4LCAweDA4MTQsIDB4MDgxMCwgMHgwMWZhLCAweDAxZmIsIDB4MDFmY30sCi0JewotCSAzNiwgNTE4MCwgMHhiNiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwNiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhlZiwgMHgwMCwgMHgwNywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhmYywgMHgwMCwgMHhlZiwgMHgwMCwgMHgwNywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHhmYywgMHgwMCwgMHgwODFjLCAweDA4MTgsIDB4MDgxNCwgMHgwMWY5LCAweDAxZmEsIDB4MDFmYn0sCi0JewotCSAzOCwgNTE5MCwgMHhiNiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwNywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhlZiwgMHgwMCwgMHgwNywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhmYywgMHgwMCwgMHhlZiwgMHgwMCwgMHgwNywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHhmYywgMHgwMCwgMHgwODIwLCAweDA4MWMsIDB4MDgxOCwgMHgwMWY4LCAweDAxZjksIDB4MDFmYX0sCi0JewotCSA0MCwgNTIwMCwgMHhhZiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwOCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhlZiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhmYywgMHgwMCwgMHhlZiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHhmYywgMHgwMCwgMHgwODI0LCAweDA4MjAsIDB4MDgxYywgMHgwMWY3LCAweDAxZjgsIDB4MDFmOX0sCi0JewotCSA0MiwgNTIxMCwgMHhhZiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwOSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhkZiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhmYywgMHgwMCwgMHhkZiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHhmYywgMHgwMCwgMHgwODI4LCAweDA4MjQsIDB4MDgyMCwgMHgwMWY2LCAweDAxZjcsIDB4MDFmOH0sCi0JewotCSA0NCwgNTIyMCwgMHhhNywgMHgwMSwgMHgwMSwgMHgwMiwgMHgwYSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhkZiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhmYywgMHgwMCwgMHhkZiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHhmYywgMHgwMCwgMHgwODJjLCAweDA4MjgsIDB4MDgyNCwgMHgwMWY1LCAweDAxZjYsIDB4MDFmN30sCi0JewotCSA0NiwgNTIzMCwgMHhhNywgMHgwMSwgMHgwMSwgMHgwMiwgMHgwYiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhkZiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhmYywgMHgwMCwgMHhkZiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHhmYywgMHgwMCwgMHgwODMwLCAweDA4MmMsIDB4MDgyOCwgMHgwMWY0LCAweDAxZjUsIDB4MDFmNn0sCi0JewotCSA0OCwgNTI0MCwgMHhhMCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwYywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhjZiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhmYywgMHgwMCwgMHhjZiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHhmYywgMHgwMCwgMHgwODM0LCAweDA4MzAsIDB4MDgyYywgMHgwMWYzLCAweDAxZjQsIDB4MDFmNX0sCi0JewotCSA1MCwgNTI1MCwgMHhhMCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwZCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhjZiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhmYywgMHgwMCwgMHhjZiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHhmYywgMHgwMCwgMHgwODM4LCAweDA4MzQsIDB4MDgzMCwgMHgwMWYyLCAweDAxZjMsIDB4MDFmNH0sCi0JewotCSA1MiwgNTI2MCwgMHg5OCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwZSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhjZiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhmYywgMHgwMCwgMHhjZiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHhmYywgMHgwMCwgMHgwODNjLCAweDA4MzgsIDB4MDgzNCwgMHgwMWYxLCAweDAxZjIsIDB4MDFmM30sCi0JewotCSA1NCwgNTI3MCwgMHg5OCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwZiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhjZiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhmYywgMHgwMCwgMHhjZiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHhmYywgMHgwMCwgMHgwODQwLCAweDA4M2MsIDB4MDgzOCwgMHgwMWYwLCAweDAxZjEsIDB4MDFmMn0sCi0JewotCSA1NiwgNTI4MCwgMHg5MSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxMCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhiZiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhmYywgMHgwMCwgMHhiZiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHhmYywgMHgwMCwgMHgwODQ0LCAweDA4NDAsIDB4MDgzYywgMHgwMWYwLCAweDAxZjAsIDB4MDFmMX0sCi0JewotCSA1OCwgNTI5MCwgMHg5MSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxMSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhiZiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhmYywgMHgwMCwgMHhiZiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHhmYywgMHgwMCwgMHgwODQ4LCAweDA4NDQsIDB4MDg0MCwgMHgwMWVmLCAweDAxZjAsIDB4MDFmMH0sCi0JewotCSA2MCwgNTMwMCwgMHg4YSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxMiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZiwgMHgwZSwgMHgwMCwgMHhmZiwgMHhiZiwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHhmYywgMHgwMCwgMHhiZiwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHhmYywgMHgwMCwgMHgwODRjLCAweDA4NDgsIDB4MDg0NCwgMHgwMWVlLCAweDAxZWYsIDB4MDFmMH0sCi0JewotCSA2MiwgNTMxMCwgMHg4YSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxMywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZiwgMHgwZSwgMHgwMCwgMHhmZiwgMHhiZiwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHhmYSwgMHgwMCwgMHhiZiwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHhmYSwgMHgwMCwgMHgwODUwLCAweDA4NGMsIDB4MDg0OCwgMHgwMWVkLCAweDAxZWUsIDB4MDFlZn0sCi0JewotCSA2NCwgNTMyMCwgMHg4MywgMHgwMSwgMHgwMSwgMHgwMiwgMHgxNCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZiwgMHgwZSwgMHgwMCwgMHhmZiwgMHhiZiwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHhmYSwgMHgwMCwgMHhiZiwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHhmYSwgMHgwMCwgMHgwODU0LCAweDA4NTAsIDB4MDg0YywgMHgwMWVjLCAweDAxZWQsIDB4MDFlZX0sCi0JewotCSA2NiwgNTMzMCwgMHg4MywgMHgwMSwgMHgwMSwgMHgwMiwgMHgxNSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZiwgMHgwZSwgMHgwMCwgMHhmZiwgMHhhZiwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHhmYSwgMHgwMCwgMHhhZiwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHhmYSwgMHgwMCwgMHgwODU4LCAweDA4NTQsIDB4MDg1MCwgMHgwMWViLCAweDAxZWMsIDB4MDFlZH0sCi0JewotCSA2OCwgNTM0MCwgMHg3YywgMHgwMSwgMHgwMSwgMHgwMiwgMHgxNiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZiwgMHgwZSwgMHgwMCwgMHhmZiwgMHhhZiwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHhmYSwgMHgwMCwgMHhhZiwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHhmYSwgMHgwMCwgMHgwODVjLCAweDA4NTgsIDB4MDg1NCwgMHgwMWVhLCAweDAxZWIsIDB4MDFlY30sCi0JewotCSA3MCwgNTM1MCwgMHg3YywgMHgwMSwgMHgwMSwgMHgwMiwgMHgxNywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZiwgMHgwZSwgMHgwMCwgMHhmZiwgMHg5ZiwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHhmYSwgMHgwMCwgMHg5ZiwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHhmYSwgMHgwMCwgMHgwODYwLCAweDA4NWMsIDB4MDg1OCwgMHgwMWU5LCAweDAxZWEsIDB4MDFlYn0sCi0JewotCSA3MiwgNTM2MCwgMHg3NSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxOCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZiwgMHgwZSwgMHgwMCwgMHhmZiwgMHg5ZiwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHhmYSwgMHgwMCwgMHg5ZiwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHhmYSwgMHgwMCwgMHgwODY0LCAweDA4NjAsIDB4MDg1YywgMHgwMWU4LCAweDAxZTksIDB4MDFlYX0sCi0JewotCSA3NCwgNTM3MCwgMHg3NSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxOSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZiwgMHgwZSwgMHgwMCwgMHhmZiwgMHg5ZiwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHhmYSwgMHgwMCwgMHg5ZiwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHhmYSwgMHgwMCwgMHgwODY4LCAweDA4NjQsIDB4MDg2MCwgMHgwMWU3LCAweDAxZTgsIDB4MDFlOX0sCi0JewotCSA3NiwgNTM4MCwgMHg2ZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxYSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZiwgMHgwZSwgMHgwMCwgMHhmZiwgMHg5ZiwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHhmYSwgMHgwMCwgMHg5ZiwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHhmYSwgMHgwMCwgMHgwODZjLCAweDA4NjgsIDB4MDg2NCwgMHgwMWU2LCAweDAxZTcsIDB4MDFlOH0sCi0JewotCSA3OCwgNTM5MCwgMHg2ZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxYiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZiwgMHgwZSwgMHgwMCwgMHhmZiwgMHg4ZiwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHhmYSwgMHgwMCwgMHg4ZiwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHhmYSwgMHgwMCwgMHgwODcwLCAweDA4NmMsIDB4MDg2OCwgMHgwMWU1LCAweDAxZTYsIDB4MDFlN30sCi0JewotCSA4MCwgNTQwMCwgMHg2NywgMHgwMSwgMHgwMSwgMHgwMiwgMHgxYywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZCwgMHgwZCwgMHgwMCwgMHhjOCwgMHg4ZiwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHhmYSwgMHgwMCwgMHg4ZiwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOCwKLQkgMHgwMCwgMHhmYSwgMHgwMCwgMHgwODc0LCAweDA4NzAsIDB4MDg2YywgMHgwMWU1LCAweDAxZTUsIDB4MDFlNn0sCi0JewotCSA4MiwgNTQxMCwgMHg2NywgMHgwMSwgMHgwMSwgMHgwMiwgMHgxZCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZCwgMHgwZCwgMHgwMCwgMHhjOCwgMHg4ZiwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHhmYSwgMHgwMCwgMHg4ZiwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOCwKLQkgMHgwMCwgMHhmYSwgMHgwMCwgMHgwODc4LCAweDA4NzQsIDB4MDg3MCwgMHgwMWU0LCAweDAxZTUsIDB4MDFlNX0sCi0JewotCSA4NCwgNTQyMCwgMHg2MSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxZSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZCwgMHgwZCwgMHgwMCwgMHhjOCwgMHg4ZSwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHhmYSwgMHgwMCwgMHg4ZSwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOCwKLQkgMHgwMCwgMHhmYSwgMHgwMCwgMHgwODdjLCAweDA4NzgsIDB4MDg3NCwgMHgwMWUzLCAweDAxZTQsIDB4MDFlNX0sCi0JewotCSA4NiwgNTQzMCwgMHg2MSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxZiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZCwgMHgwZCwgMHgwMCwgMHhjOCwgMHg4ZSwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHhmYSwgMHgwMCwgMHg4ZSwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOCwKLQkgMHgwMCwgMHhmYSwgMHgwMCwgMHgwODgwLCAweDA4N2MsIDB4MDg3OCwgMHgwMWUyLCAweDAxZTMsIDB4MDFlNH0sCi0JewotCSA4OCwgNTQ0MCwgMHg1YSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyMCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4ZCwgMHgwZCwgMHgwMCwgMHhjOCwgMHg3ZSwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHhmYSwgMHgwMCwgMHg3ZSwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOCwKLQkgMHgwMCwgMHhmYSwgMHgwMCwgMHgwODg0LCAweDA4ODAsIDB4MDg3YywgMHgwMWUxLCAweDAxZTIsIDB4MDFlM30sCi0JewotCSA5MCwgNTQ1MCwgMHg1YSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyMSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4ZCwgMHgwZCwgMHgwMCwgMHhjOCwgMHg3ZCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHhmYSwgMHgwMCwgMHg3ZCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOCwKLQkgMHgwMCwgMHhmYSwgMHgwMCwgMHgwODg4LCAweDA4ODQsIDB4MDg4MCwgMHgwMWUwLCAweDAxZTEsIDB4MDFlMn0sCi0JewotCSA5MiwgNTQ2MCwgMHg1MywgMHgwMSwgMHgwMSwgMHgwMiwgMHgyMiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4ZCwgMHgwZCwgMHgwMCwgMHhjOCwgMHg2ZCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHhmOCwgMHgwMCwgMHg2ZCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOCwKLQkgMHgwMCwgMHhmOCwgMHgwMCwgMHgwODhjLCAweDA4ODgsIDB4MDg4NCwgMHgwMWRmLCAweDAxZTAsIDB4MDFlMX0sCi0JewotCSA5NCwgNTQ3MCwgMHg1MywgMHgwMSwgMHgwMSwgMHgwMiwgMHgyMywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4ZCwgMHgwZCwgMHgwMCwgMHhjOCwgMHg2ZCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHhmOCwgMHgwMCwgMHg2ZCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOCwKLQkgMHgwMCwgMHhmOCwgMHgwMCwgMHgwODkwLCAweDA4OGMsIDB4MDg4OCwgMHgwMWRlLCAweDAxZGYsIDB4MDFlMH0sCi0JewotCSA5NiwgNTQ4MCwgMHg0ZCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyNCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4ZCwgMHgwZCwgMHgwMCwgMHhjOCwgMHg1ZCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHhmOCwgMHgwMCwgMHg1ZCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOCwKLQkgMHgwMCwgMHhmOCwgMHgwMCwgMHgwODk0LCAweDA4OTAsIDB4MDg4YywgMHgwMWRkLCAweDAxZGUsIDB4MDFkZn0sCi0JewotCSA5OCwgNTQ5MCwgMHg0ZCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyNSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4ZCwgMHgwZCwgMHgwMCwgMHhjOCwgMHg1YywgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHhmOCwgMHgwMCwgMHg1YywgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOCwKLQkgMHgwMCwgMHhmOCwgMHgwMCwgMHgwODk4LCAweDA4OTQsIDB4MDg5MCwgMHgwMWRkLCAweDAxZGQsIDB4MDFkZX0sCi0JewotCSAxMDAsIDU1MDAsIDB4NDcsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGQsIDB4MGIsIDB4MDAsIDB4ODQsIDB4NWMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4NWMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDcsCi0JIDB4MDAsIDB4ZjgsIDB4MDAsIDB4MDg5YywgMHgwODk4LCAweDA4OTQsIDB4MDFkYywgMHgwMWRkLCAweDAxZGR9LAotCXsKLQkgMTAyLCA1NTEwLCAweDQ3LCAweDAxLCAweDAxLCAweDAyLCAweDI3LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhkLCAweDBiLCAweDAwLCAweDg0LCAweDRjLCAweDAwLCAweDAzLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA3LCAweDAwLCAweGY4LCAweDAwLCAweDRjLCAweDAwLCAweDAzLCAweDAwLCAweDdmLCAweDAwLCAweDA3LAotCSAweDAwLCAweGY4LCAweDAwLCAweDA4YTAsIDB4MDg5YywgMHgwODk4LCAweDAxZGIsIDB4MDFkYywgMHgwMWRkfSwKLQl7Ci0JIDEwNCwgNTUyMCwgMHg0MCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyOCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4ZCwgMHgwYiwgMHgwMCwgMHg4NCwgMHg0YywgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHhmOCwgMHgwMCwgMHg0YywgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwNywKLQkgMHgwMCwgMHhmOCwgMHgwMCwgMHgwOGE0LCAweDA4YTAsIDB4MDg5YywgMHgwMWRhLCAweDAxZGIsIDB4MDFkY30sCi0JewotCSAxMDYsIDU1MzAsIDB4NDAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjksIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGQsIDB4MGIsIDB4MDAsIDB4ODQsIDB4M2IsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4M2IsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDcsCi0JIDB4MDAsIDB4ZjgsIDB4MDAsIDB4MDhhOCwgMHgwOGE0LCAweDA4YTAsIDB4MDFkOSwgMHgwMWRhLCAweDAxZGJ9LAotCXsKLQkgMTA4LCA1NTQwLCAweDNhLCAweDAxLCAweDAxLCAweDAyLCAweDJhLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhkLCAweDBiLCAweDAwLCAweDg0LCAweDNiLCAweDAwLCAweDAzLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA3LCAweDAwLCAweGY4LCAweDAwLCAweDNiLCAweDAwLCAweDAzLCAweDAwLCAweDdmLCAweDAwLCAweDA3LAotCSAweDAwLCAweGY4LCAweDAwLCAweDA4YWMsIDB4MDhhOCwgMHgwOGE0LCAweDAxZDgsIDB4MDFkOSwgMHgwMWRhfSwKLQl7Ci0JIDExMCwgNTU1MCwgMHgzYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyYiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4ZCwgMHgwYiwgMHgwMCwgMHg4NCwgMHgzYiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHhmOCwgMHgwMCwgMHgzYiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwNywKLQkgMHgwMCwgMHhmOCwgMHgwMCwgMHgwOGIwLCAweDA4YWMsIDB4MDhhOCwgMHgwMWQ3LCAweDAxZDgsIDB4MDFkOX0sCi0JewotCSAxMTIsIDU1NjAsIDB4MzQsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MmMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGQsIDB4MGIsIDB4MDAsIDB4ODQsIDB4MmIsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4MmIsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDcsCi0JIDB4MDAsIDB4ZjgsIDB4MDAsIDB4MDhiNCwgMHgwOGIwLCAweDA4YWMsIDB4MDFkNywgMHgwMWQ3LCAweDAxZDh9LAotCXsKLQkgMTE0LCA1NTcwLCAweDM0LCAweDAxLCAweDAxLCAweDAyLCAweDJkLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhkLCAweDBiLCAweDAwLCAweDg0LCAweDJhLCAweDAwLCAweDAzLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA3LCAweDAwLCAweGY4LCAweDAwLCAweDJhLCAweDAwLCAweDAzLCAweDAwLCAweDdmLCAweDAwLCAweDA3LAotCSAweDAwLCAweGY4LCAweDAwLCAweDA4YjgsIDB4MDhiNCwgMHgwOGIwLCAweDAxZDYsIDB4MDFkNywgMHgwMWQ3fSwKLQl7Ci0JIDExNiwgNTU4MCwgMHgyZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyZSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4ZCwgMHgwYiwgMHgwMCwgMHg4NCwgMHgxYSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHhmOCwgMHgwMCwgMHgxYSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwNywKLQkgMHgwMCwgMHhmOCwgMHgwMCwgMHgwOGJjLCAweDA4YjgsIDB4MDhiNCwgMHgwMWQ1LCAweDAxZDYsIDB4MDFkN30sCi0JewotCSAxMTgsIDU1OTAsIDB4MmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MmYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGQsIDB4MGIsIDB4MDAsIDB4ODQsIDB4MWEsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4MWEsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDcsCi0JIDB4MDAsIDB4ZjgsIDB4MDAsIDB4MDhjMCwgMHgwOGJjLCAweDA4YjgsIDB4MDFkNCwgMHgwMWQ1LCAweDAxZDZ9LAotCXsKLQkgMTIwLCA1NjAwLCAweDI4LCAweDAxLCAweDAxLCAweDAyLCAweDMwLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhiLCAweDA5LCAweDAwLCAweDcwLCAweDFhLCAweDAwLCAweDAzLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA3LCAweDAwLCAweGY4LCAweDAwLCAweDFhLCAweDAwLCAweDAzLCAweDAwLCAweDdmLCAweDAwLCAweDA3LAotCSAweDAwLCAweGY4LCAweDAwLCAweDA4YzQsIDB4MDhjMCwgMHgwOGJjLCAweDAxZDMsIDB4MDFkNCwgMHgwMWQ1fSwKLQl7Ci0JIDEyMiwgNTYxMCwgMHgyOCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzMSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YiwgMHgwOSwgMHgwMCwgMHg3MCwgMHgxOSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHhmOCwgMHgwMCwgMHgxOSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwNywKLQkgMHgwMCwgMHhmOCwgMHgwMCwgMHgwOGM4LCAweDA4YzQsIDB4MDhjMCwgMHgwMWQyLCAweDAxZDMsIDB4MDFkNH0sCi0JewotCSAxMjQsIDU2MjAsIDB4MjEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGIsIDB4MDksIDB4MDAsIDB4NzAsIDB4MTksIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4MTksIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDcsCi0JIDB4MDAsIDB4ZjgsIDB4MDAsIDB4MDhjYywgMHgwOGM4LCAweDA4YzQsIDB4MDFkMiwgMHgwMWQyLCAweDAxZDN9LAotCXsKLQkgMTI2LCA1NjMwLCAweDIxLCAweDAxLCAweDAxLCAweDAyLCAweDMzLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhiLCAweDA5LCAweDAwLCAweDcwLCAweDA5LCAweDAwLCAweDAzLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA3LCAweDAwLCAweGY4LCAweDAwLCAweDA5LCAweDAwLCAweDAzLCAweDAwLCAweDdmLCAweDAwLCAweDA3LAotCSAweDAwLCAweGY4LCAweDAwLCAweDA4ZDAsIDB4MDhjYywgMHgwOGM4LCAweDAxZDEsIDB4MDFkMiwgMHgwMWQyfSwKLQl7Ci0JIDEyOCwgNTY0MCwgMHgxYywgMHgwMSwgMHgwMSwgMHgwMiwgMHgzNCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YiwgMHgwOSwgMHgwMCwgMHg3MCwgMHgwOSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHhmOCwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwNywKLQkgMHgwMCwgMHhmOCwgMHgwMCwgMHgwOGQ0LCAweDA4ZDAsIDB4MDhjYywgMHgwMWQwLCAweDAxZDEsIDB4MDFkMn0sCi0JewotCSAxMzAsIDU2NTAsIDB4MWMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGIsIDB4MDksIDB4MDAsIDB4NzAsIDB4MDgsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDcsCi0JIDB4MDAsIDB4ZjgsIDB4MDAsIDB4MDhkOCwgMHgwOGQ0LCAweDA4ZDAsIDB4MDFjZiwgMHgwMWQwLCAweDAxZDF9LAotCXsKLQkgMTMyLCA1NjYwLCAweDE2LCAweDAxLCAweDAxLCAweDAyLCAweDM2LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhiLCAweDA5LCAweDAwLCAweDcwLCAweDA4LCAweDAwLCAweDAzLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA3LCAweDAwLCAweGY2LCAweDAwLCAweDA4LCAweDAwLCAweDAzLCAweDAwLCAweDdmLCAweDAwLCAweDA3LAotCSAweDAwLCAweGY2LCAweDAwLCAweDA4ZGMsIDB4MDhkOCwgMHgwOGQ0LCAweDAxY2UsIDB4MDFjZiwgMHgwMWQwfSwKLQl7Ci0JIDEzNCwgNTY3MCwgMHgxNiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzNywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YiwgMHgwOSwgMHgwMCwgMHg3MCwgMHgwOCwgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHhmNiwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwNywKLQkgMHgwMCwgMHhmNiwgMHgwMCwgMHgwOGUwLCAweDA4ZGMsIDB4MDhkOCwgMHgwMWNlLCAweDAxY2UsIDB4MDFjZn0sCi0JewotCSAxMzYsIDU2ODAsIDB4MTAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzgsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGIsIDB4MDksIDB4MDAsIDB4NzAsIDB4MDgsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4ZjYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDcsCi0JIDB4MDAsIDB4ZjYsIDB4MDAsIDB4MDhlNCwgMHgwOGUwLCAweDA4ZGMsIDB4MDFjZCwgMHgwMWNlLCAweDAxY2V9LAotCXsKLQkgMTM4LCA1NjkwLCAweDEwLCAweDAxLCAweDAxLCAweDAyLCAweDM5LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhiLCAweDA5LCAweDAwLCAweDcwLCAweDA3LCAweDAwLCAweDAzLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA3LCAweDAwLCAweGY2LCAweDAwLCAweDA3LCAweDAwLCAweDAzLCAweDAwLCAweDdmLCAweDAwLCAweDA3LAotCSAweDAwLCAweGY2LCAweDAwLCAweDA4ZTgsIDB4MDhlNCwgMHgwOGUwLCAweDAxY2MsIDB4MDFjZCwgMHgwMWNlfSwKLQl7Ci0JIDE0MCwgNTcwMCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzYSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YSwgMHgwNiwgMHgwMCwgMHg0MCwgMHgwNywgMHgwMCwgMHgwMiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHhmNiwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHhmNiwgMHgwMCwgMHgwOGVjLCAweDA4ZTgsIDB4MDhlNCwgMHgwMWNiLCAweDAxY2MsIDB4MDFjZH0sCi0JewotCSAxNDIsIDU3MTAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4M2IsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGEsIDB4MDYsIDB4MDAsIDB4NDAsIDB4MDcsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDhmMCwgMHgwOGVjLCAweDA4ZTgsIDB4MDFjYSwgMHgwMWNiLCAweDAxY2N9LAotCXsKLQkgMTQ0LCA1NzIwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDNjLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhhLCAweDA2LCAweDAwLCAweDQwLCAweDA3LCAweDAwLCAweDAyLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA2LCAweDAwLCAweGY0LCAweDAwLCAweDA3LCAweDAwLCAweDAyLCAweDAwLCAweDdmLCAweDAwLCAweDA2LAotCSAweDAwLCAweGY0LCAweDAwLCAweDA4ZjQsIDB4MDhmMCwgMHgwOGVjLCAweDAxYzksIDB4MDFjYSwgMHgwMWNifSwKLQl7Ci0JIDE0NSwgNTcyNSwgMHgwMywgMHgwMSwgMHgwMiwgMHgwNCwgMHg3OSwgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YSwgMHgwNiwgMHgwMCwgMHg0MCwgMHgwNiwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHhmNCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHhmNCwgMHgwMCwgMHgwOGY2LCAweDA4ZjIsIDB4MDhlZSwgMHgwMWM5LCAweDAxY2EsIDB4MDFjYn0sCi0JewotCSAxNDYsIDU3MzAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4M2QsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGEsIDB4MDYsIDB4MDAsIDB4NDAsIDB4MDYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDhmOCwgMHgwOGY0LCAweDA4ZjAsIDB4MDFjOSwgMHgwMWM5LCAweDAxY2F9LAotCXsKLQkgMTQ3LCA1NzM1LCAweDAzLCAweDAxLCAweDAyLCAweDA0LCAweDdiLCAweDA3LCAweDA3LCAweDA0LCAweDEwLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhhLCAweDA2LCAweDAwLCAweDQwLCAweDA2LCAweDAwLCAweDAyLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA2LCAweDAwLCAweGY0LCAweDAwLCAweDA2LCAweDAwLCAweDAyLCAweDAwLCAweDdmLCAweDAwLCAweDA2LAotCSAweDAwLCAweGY0LCAweDAwLCAweDA4ZmEsIDB4MDhmNiwgMHgwOGYyLCAweDAxYzgsIDB4MDFjOSwgMHgwMWNhfSwKLQl7Ci0JIDE0OCwgNTc0MCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzZSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YSwgMHgwNiwgMHgwMCwgMHg0MCwgMHgwNiwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHhmNCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHhmNCwgMHgwMCwgMHgwOGZjLCAweDA4ZjgsIDB4MDhmNCwgMHgwMWM4LCAweDAxYzksIDB4MDFjOX0sCi0JewotCSAxNDksIDU3NDUsIDB4ZmUsIDB4MDAsIDB4MDIsIDB4MDQsIDB4N2QsIDB4MDcsIDB4MDcsIDB4MDQsIDB4MTAsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGEsIDB4MDYsIDB4MDAsIDB4NDAsIDB4MDYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDhmZSwgMHgwOGZhLCAweDA4ZjYsIDB4MDFjOCwgMHgwMWM4LCAweDAxYzl9LAotCXsKLQkgMTUwLCA1NzUwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDNmLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhhLCAweDA2LCAweDAwLCAweDQwLCAweDA2LCAweDAwLCAweDAyLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA2LCAweDAwLCAweGY0LCAweDAwLCAweDA2LCAweDAwLCAweDAyLCAweDAwLCAweDdmLCAweDAwLCAweDA2LAotCSAweDAwLCAweGY0LCAweDAwLCAweDA5MDAsIDB4MDhmYywgMHgwOGY4LCAweDAxYzcsIDB4MDFjOCwgMHgwMWM5fSwKLQl7Ci0JIDE1MSwgNTc1NSwgMHhmZSwgMHgwMCwgMHgwMiwgMHgwNCwgMHg3ZiwgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YSwgMHgwNiwgMHgwMCwgMHg0MCwgMHgwNSwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHhmNCwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHhmNCwgMHgwMCwgMHgwOTAyLCAweDA4ZmUsIDB4MDhmYSwgMHgwMWM3LCAweDAxYzgsIDB4MDFjOH0sCi0JewotCSAxNTIsIDU3NjAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDAsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGEsIDB4MDYsIDB4MDAsIDB4NDAsIDB4MDUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDkwNCwgMHgwOTAwLCAweDA4ZmMsIDB4MDFjNiwgMHgwMWM3LCAweDAxYzh9LAotCXsKLQkgMTUzLCA1NzY1LCAweGY4LCAweDAwLCAweDAyLCAweDA0LCAweDgxLCAweDA3LCAweDA3LCAweDA0LCAweDEwLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhhLCAweDA2LCAweDAwLCAweDQwLCAweDA1LCAweDAwLCAweDAyLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA2LCAweDAwLCAweGY0LCAweDAwLCAweDA1LCAweDAwLCAweDAyLCAweDAwLCAweDdmLCAweDAwLCAweDA2LAotCSAweDAwLCAweGY0LCAweDAwLCAweDA5MDYsIDB4MDkwMiwgMHgwOGZlLCAweDAxYzYsIDB4MDFjNywgMHgwMWM4fSwKLQl7Ci0JIDE1NCwgNTc3MCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHg0MSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YSwgMHgwNiwgMHgwMCwgMHg0MCwgMHgwNSwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHhmNCwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHhmNCwgMHgwMCwgMHgwOTA4LCAweDA5MDQsIDB4MDkwMCwgMHgwMWM2LCAweDAxYzYsIDB4MDFjN30sCi0JewotCSAxNTUsIDU3NzUsIDB4ZjgsIDB4MDAsIDB4MDIsIDB4MDQsIDB4ODMsIDB4MDcsIDB4MDcsIDB4MDQsIDB4MTAsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGEsIDB4MDYsIDB4MDAsIDB4NDAsIDB4MDUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDkwYSwgMHgwOTA2LCAweDA5MDIsIDB4MDFjNSwgMHgwMWM2LCAweDAxYzd9LAotCXsKLQkgMTU2LCA1NzgwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQyLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhhLCAweDA2LCAweDAwLCAweDQwLCAweDA1LCAweDAwLCAweDAyLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA2LCAweDAwLCAweGY0LCAweDAwLCAweDA1LCAweDAwLCAweDAyLCAweDAwLCAweDdmLCAweDAwLCAweDA2LAotCSAweDAwLCAweGY0LCAweDAwLCAweDA5MGMsIDB4MDkwOCwgMHgwOTA0LCAweDAxYzUsIDB4MDFjNiwgMHgwMWM2fSwKLQl7Ci0JIDE1NywgNTc4NSwgMHhmMiwgMHgwMCwgMHgwMiwgMHgwNCwgMHg4NSwgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4YSwgMHgwNiwgMHgwMCwgMHg0MCwgMHgwNCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHhmNCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHhmNCwgMHgwMCwgMHgwOTBlLCAweDA5MGEsIDB4MDkwNiwgMHgwMWM0LCAweDAxYzUsIDB4MDFjNn0sCi0JewotCSAxNTgsIDU3OTAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4OGEsIDB4MDYsIDB4MDAsIDB4NDAsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDkxMCwgMHgwOTBjLCAweDA5MDgsIDB4MDFjNCwgMHgwMWM1LCAweDAxYzZ9LAotCXsKLQkgMTU5LCA1Nzk1LCAweGYyLCAweDAwLCAweDAyLCAweDA0LCAweDg3LCAweDA3LCAweDA3LCAweDA0LCAweDEwLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDhhLCAweDA2LCAweDAwLCAweDQwLCAweDA0LCAweDAwLCAweDAyLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA2LCAweDAwLCAweGY0LCAweDAwLCAweDA0LCAweDAwLCAweDAyLCAweDAwLCAweDdmLCAweDAwLCAweDA2LAotCSAweDAwLCAweGY0LCAweDAwLCAweDA5MTIsIDB4MDkwZSwgMHgwOTBhLCAweDAxYzQsIDB4MDFjNCwgMHgwMWM1fSwKLQl7Ci0JIDE2MCwgNTgwMCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHg0NCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4OCwgMHgwNCwgMHgwMCwgMHgyMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHhmNCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHhmNCwgMHgwMCwgMHgwOTE0LCAweDA5MTAsIDB4MDkwYywgMHgwMWMzLCAweDAxYzQsIDB4MDFjNX0sCi0JewotCSAxNjEsIDU4MDUsIDB4ZWQsIDB4MDAsIDB4MDIsIDB4MDQsIDB4ODksIDB4MDcsIDB4MDcsIDB4MDQsIDB4MTAsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODgsIDB4MDQsIDB4MDAsIDB4MjAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDkxNiwgMHgwOTEyLCAweDA5MGUsIDB4MDFjMywgMHgwMWM0LCAweDAxYzR9LAotCXsKLQkgMTYyLCA1ODEwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQ1LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg4LCAweDA0LCAweDAwLCAweDIwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA2LCAweDAwLCAweGY0LCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDdmLCAweDAwLCAweDA2LAotCSAweDAwLCAweGY0LCAweDAwLCAweDA5MTgsIDB4MDkxNCwgMHgwOTEwLCAweDAxYzIsIDB4MDFjMywgMHgwMWM0fSwKLQl7Ci0JIDE2MywgNTgxNSwgMHhlZCwgMHgwMCwgMHgwMiwgMHgwNCwgMHg4YiwgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4OCwgMHgwNCwgMHgwMCwgMHgyMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHhmNCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHhmNCwgMHgwMCwgMHgwOTFhLCAweDA5MTYsIDB4MDkxMiwgMHgwMWMyLCAweDAxYzMsIDB4MDFjNH0sCi0JewotCSAxNjQsIDU4MjAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODgsIDB4MDQsIDB4MDAsIDB4MjAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDkxYywgMHgwOTE4LCAweDA5MTQsIDB4MDFjMiwgMHgwMWMyLCAweDAxYzN9LAotCXsKLQkgMTY1LCA1ODI1LCAweGVkLCAweDAwLCAweDAyLCAweDA0LCAweDhkLCAweDA3LCAweDA3LCAweDA0LCAweDEwLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg4LCAweDA0LCAweDAwLCAweDIwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA2LCAweDAwLCAweGY0LCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDdmLCAweDAwLCAweDA2LAotCSAweDAwLCAweGY0LCAweDAwLCAweDA5MWUsIDB4MDkxYSwgMHgwOTE2LCAweDAxYzEsIDB4MDFjMiwgMHgwMWMzfSwKLQl7Ci0JIDE2NiwgNTgzMCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHg0NywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4OCwgMHgwNCwgMHgwMCwgMHgyMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHhmNCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHhmNCwgMHgwMCwgMHgwOTIwLCAweDA5MWMsIDB4MDkxOCwgMHgwMWMxLCAweDAxYzIsIDB4MDFjMn0sCi0JewotCSAxNjgsIDU4NDAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDgsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODgsIDB4MDQsIDB4MDAsIDB4MjAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDkyNCwgMHgwOTIwLCAweDA5MWMsIDB4MDFjMCwgMHgwMWMxLCAweDAxYzJ9LAotCXsKLQkgMTcwLCA1ODUwLCAweGUwLCAweDAwLCAweDAxLCAweDAyLCAweDQ5LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg4LCAweDA0LCAweDAwLCAweDIwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA2LCAweDAwLCAweGY0LCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDdmLCAweDAwLCAweDA2LAotCSAweDAwLCAweGY0LCAweDAwLCAweDA5MjgsIDB4MDkyNCwgMHgwOTIwLCAweDAxYmYsIDB4MDFjMCwgMHgwMWMxfSwKLQl7Ci0JIDE3MiwgNTg2MCwgMHhkZSwgMHgwMCwgMHgwMSwgMHgwMiwgMHg0YSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4OCwgMHgwNCwgMHgwMCwgMHgyMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHhmMiwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHhmMiwgMHgwMCwgMHgwOTJjLCAweDA5MjgsIDB4MDkyNCwgMHgwMWJmLCAweDAxYmYsIDB4MDFjMH0sCi0JewotCSAxNzQsIDU4NzAsIDB4ZGIsIDB4MDAsIDB4MDEsIDB4MDIsIDB4NGIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODgsIDB4MDQsIDB4MDAsIDB4MjAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4ZjIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4ZjIsIDB4MDAsIDB4MDkzMCwgMHgwOTJjLCAweDA5MjgsIDB4MDFiZSwgMHgwMWJmLCAweDAxYmZ9LAotCXsKLQkgMTc2LCA1ODgwLCAweGQ4LCAweDAwLCAweDAxLCAweDAyLCAweDRjLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg4LCAweDA0LCAweDAwLCAweDIwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA2LCAweDAwLCAweGYyLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDdmLCAweDAwLCAweDA2LAotCSAweDAwLCAweGYyLCAweDAwLCAweDA5MzQsIDB4MDkzMCwgMHgwOTJjLCAweDAxYmQsIDB4MDFiZSwgMHgwMWJmfSwKLQl7Ci0JIDE3OCwgNTg5MCwgMHhkNiwgMHgwMCwgMHgwMSwgMHgwMiwgMHg0ZCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4OCwgMHgwNCwgMHgwMCwgMHgyMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHhmMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHhmMiwgMHgwMCwgMHgwOTM4LCAweDA5MzQsIDB4MDkzMCwgMHgwMWJjLCAweDAxYmQsIDB4MDFiZX0sCi0JewotCSAxODAsIDU5MDAsIDB4ZDMsIDB4MDAsIDB4MDEsIDB4MDIsIDB4NGUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODcsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4ZjIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4ZjIsIDB4MDAsIDB4MDkzYywgMHgwOTM4LCAweDA5MzQsIDB4MDFiYywgMHgwMWJjLCAweDAxYmR9LAotCXsKLQkgMTgyLCA1OTEwLCAweGQ2LCAweDAwLCAweDAxLCAweDAyLCAweDRmLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg3LCAweDAzLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA1LCAweDAwLCAweGYyLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDdmLCAweDAwLCAweDA1LAotCSAweDAwLCAweGYyLCAweDAwLCAweDA5NDAsIDB4MDkzYywgMHgwOTM4LCAweDAxYmIsIDB4MDFiYywgMHgwMWJjfSwKLQl7Ci0JIDEsIDI0MTIsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4NmMsIDB4MDgsIDB4MDgsIDB4MDQsIDB4MTYsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDUsIDB4MDAsCi0JIDB4NzAsIDB4MDAsIDB4MGYsIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzAsIDB4MDAsCi0JIDB4MGYsIDB4MDAsIDB4MGYsIDB4MDNjOSwgMHgwM2M1LCAweDAzYzEsIDB4MDQzYSwgMHgwNDNmLCAweDA0NDN9LAotCXsKLQkgMiwgMjQxNywgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg3MSwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwNSwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwZiwgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwZiwgMHgwMCwgMHgwZiwgMHgwM2NiLCAweDAzYzcsIDB4MDNjMywgMHgwNDM4LCAweDA0M2QsIDB4MDQ0MX0sCi0JewotCSAzLCAyNDIyLCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDc2LCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweDAwLCAweDA1LCAweDAwLAotCSAweDcwLCAweDAwLCAweDBmLCAweDAwLCAweDBmLCAweDAwLCAweGZmLCAweDAwLCAweDA1LCAweDAwLCAweDcwLCAweDAwLAotCSAweDBmLCAweDAwLCAweDBmLCAweDAzY2QsIDB4MDNjOSwgMHgwM2M1LCAweDA0MzYsIDB4MDQzYSwgMHgwNDNmfSwKLQl7Ci0JIDQsIDI0MjcsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4N2IsIDB4MDgsIDB4MDgsIDB4MDQsIDB4MTYsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmQsIDB4MDAsIDB4MDUsIDB4MDAsCi0JIDB4NzAsIDB4MDAsIDB4MGYsIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmQsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzAsIDB4MDAsCi0JIDB4MGYsIDB4MDAsIDB4MGYsIDB4MDNjZiwgMHgwM2NiLCAweDAzYzcsIDB4MDQzNCwgMHgwNDM4LCAweDA0M2R9LAotCXsKLQkgNSwgMjQzMiwgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg4MCwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmYiwgMHgwMCwgMHgwNSwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwZiwgMHgwMCwgMHgwZiwgMHgwMCwgMHhmYiwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwZiwgMHgwMCwgMHgwZiwgMHgwM2QxLCAweDAzY2QsIDB4MDNjOSwgMHgwNDMxLCAweDA0MzYsIDB4MDQzYX0sCi0JewotCSA2LCAyNDM3LCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDg1LCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweGZhLCAweDAwLCAweDA1LCAweDAwLAotCSAweDcwLCAweDAwLCAweDBmLCAweDAwLCAweDBmLCAweDAwLCAweGZhLCAweDAwLCAweDA1LCAweDAwLCAweDcwLCAweDAwLAotCSAweDBmLCAweDAwLCAweDBmLCAweDAzZDMsIDB4MDNjZiwgMHgwM2NiLCAweDA0MmYsIDB4MDQzNCwgMHgwNDM4fSwKLQl7Ci0JIDcsIDI0NDIsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4OGEsIDB4MDgsIDB4MDgsIDB4MDQsIDB4MTYsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4MDUsIDB4MDAsCi0JIDB4NzAsIDB4MDAsIDB4MGYsIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzAsIDB4MDAsCi0JIDB4MGYsIDB4MDAsIDB4MGYsIDB4MDNkNSwgMHgwM2QxLCAweDAzY2QsIDB4MDQyZCwgMHgwNDMxLCAweDA0MzZ9LAotCXsKLQkgOCwgMjQ0NywgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg4ZiwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmNywgMHgwMCwgMHgwNSwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwZiwgMHgwMCwgMHgwZiwgMHgwMCwgMHhmNywgMHgwMCwgMHgwNSwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwZiwgMHgwMCwgMHgwZiwgMHgwM2Q3LCAweDAzZDMsIDB4MDNjZiwgMHgwNDJiLCAweDA0MmYsIDB4MDQzNH0sCi0JewotCSA5LCAyNDUyLCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDk0LCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweGY2LCAweDAwLCAweDA1LCAweDAwLAotCSAweDcwLCAweDAwLCAweDBmLCAweDAwLCAweDBmLCAweDAwLCAweGY2LCAweDAwLCAweDA1LCAweDAwLCAweDcwLCAweDAwLAotCSAweDBmLCAweDAwLCAweDBmLCAweDAzZDksIDB4MDNkNSwgMHgwM2QxLCAweDA0MjksIDB4MDQyZCwgMHgwNDMxfSwKLQl7Ci0JIDEwLCAyNDU3LCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDk5LCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweGY1LCAweDAwLCAweDA1LCAweDAwLAotCSAweDcwLCAweDAwLCAweDBmLCAweDAwLCAweDBkLCAweDAwLCAweGY1LCAweDAwLCAweDA1LCAweDAwLCAweDcwLCAweDAwLAotCSAweDBmLCAweDAwLCAweDBkLCAweDAzZGIsIDB4MDNkNywgMHgwM2QzLCAweDA0MjcsIDB4MDQyYiwgMHgwNDJmfSwKLQl7Ci0JIDExLCAyNDYyLCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDllLCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweGY0LCAweDAwLCAweDA1LCAweDAwLAotCSAweDcwLCAweDAwLCAweDBmLCAweDAwLCAweDBkLCAweDAwLCAweGY0LCAweDAwLCAweDA1LCAweDAwLCAweDcwLCAweDAwLAotCSAweDBmLCAweDAwLCAweDBkLCAweDAzZGQsIDB4MDNkOSwgMHgwM2Q1LCAweDA0MjQsIDB4MDQyOSwgMHgwNDJkfSwKLQl7Ci0JIDEyLCAyNDY3LCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweGEzLCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweGYzLCAweDAwLCAweDA1LCAweDAwLAotCSAweDcwLCAweDAwLCAweDBmLCAweDAwLCAweDBkLCAweDAwLCAweGYzLCAweDAwLCAweDA1LCAweDAwLCAweDcwLCAweDAwLAotCSAweDBmLCAweDAwLCAweDBkLCAweDAzZGYsIDB4MDNkYiwgMHgwM2Q3LCAweDA0MjIsIDB4MDQyNywgMHgwNDJifSwKLQl7Ci0JIDEzLCAyNDcyLCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweGE4LCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA3LCAweDA3LCAweDA3LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweGYyLCAweDAwLCAweDA1LCAweDAwLAotCSAweDcwLCAweDAwLCAweDBmLCAweDAwLCAweDBkLCAweDAwLCAweGYyLCAweDAwLCAweDA1LCAweDAwLCAweDcwLCAweDAwLAotCSAweDBmLCAweDAwLCAweDBkLCAweDAzZTEsIDB4MDNkZCwgMHgwM2Q5LCAweDA0MjAsIDB4MDQyNCwgMHgwNDI5fSwKLQl7Ci0JIDE0LCAyNDg0LCAweGZmLCAweDAxLCAweDAzLCAweDA5LCAweGI0LCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA3LCAweDA3LCAweDA3LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDA1LCAweDAwLAotCSAweDcwLCAweDAwLCAweDBmLCAweDAwLCAweDBkLCAweDAwLCAweGYwLCAweDAwLCAweDA1LCAweDAwLCAweDcwLCAweDAwLAotCSAweDBmLCAweDAwLCAweDBkLCAweDAzZTYsIDB4MDNlMiwgMHgwM2RlLCAweDA0MWIsIDB4MDQxZiwgMHgwNDI0fQotfTsKLQotc3RhdGljIHN0cnVjdCBjaGFuX2luZm9fbnBoeV9yYWRpbzIwNXggY2hhbl9pbmZvX25waHlyZXY0XzIwNTZfQTFbXSA9IHsKLQl7Ci0JIDE4NCwgNDkyMCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhlYywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwZSwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwZSwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHhmZiwgMHgwMCwgMHgwN2I0LCAweDA3YjAsIDB4MDdhYywgMHgwMjE0LCAweDAyMTUsIDB4MDIxNn0sCi0JewotCSAxODYsIDQ5MzAsIDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZWQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MGUsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MGUsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDdiOCwgMHgwN2I0LCAweDA3YjAsIDB4MDIxMywgMHgwMjE0LCAweDAyMTV9LAotCXsKLQkgMTg4LCA0OTQwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGVlLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAwLCAweDAwLCAweDAwLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDBlLCAweDAwLCAweDdmLAotCSAweDAwLCAweDBmLCAweDAwLCAweGZmLCAweDAwLCAweGZmLCAweDAwLCAweDBlLCAweDAwLCAweDdmLCAweDAwLCAweDBmLAotCSAweDAwLCAweGZmLCAweDAwLCAweDA3YmMsIDB4MDdiOCwgMHgwN2I0LCAweDAyMTIsIDB4MDIxMywgMHgwMjE0fSwKLQl7Ci0JIDE5MCwgNDk1MCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhlZiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwZSwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwZSwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHhmZiwgMHgwMCwgMHgwN2MwLCAweDA3YmMsIDB4MDdiOCwgMHgwMjExLCAweDAyMTIsIDB4MDIxM30sCi0JewotCSAxOTIsIDQ5NjAsIDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MGUsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MGUsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDdjNCwgMHgwN2MwLCAweDA3YmMsIDB4MDIwZiwgMHgwMjExLCAweDAyMTJ9LAotCXsKLQkgMTk0LCA0OTcwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGYxLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDBlLCAweDAwLCAweDdmLAotCSAweDAwLCAweDBmLCAweDAwLCAweGZmLCAweDAwLCAweGZmLCAweDAwLCAweDBlLCAweDAwLCAweDdmLCAweDAwLCAweDBmLAotCSAweDAwLCAweGZmLCAweDAwLCAweDA3YzgsIDB4MDdjNCwgMHgwN2MwLCAweDAyMGUsIDB4MDIwZiwgMHgwMjExfSwKLQl7Ci0JIDE5NiwgNDk4MCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmMiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwZSwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwZSwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHhmZiwgMHgwMCwgMHgwN2NjLCAweDA3YzgsIDB4MDdjNCwgMHgwMjBkLCAweDAyMGUsIDB4MDIwZn0sCi0JewotCSAxOTgsIDQ5OTAsIDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MGUsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MGUsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDdkMCwgMHgwN2NjLCAweDA3YzgsIDB4MDIwYywgMHgwMjBkLCAweDAyMGV9LAotCXsKLQkgMjAwLCA1MDAwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGY0LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDBkLCAweDAwLCAweDdmLAotCSAweDAwLCAweDBmLCAweDAwLCAweGZmLCAweDAwLCAweGZmLCAweDAwLCAweDBkLCAweDAwLCAweDdmLCAweDAwLCAweDBmLAotCSAweDAwLCAweGZmLCAweDAwLCAweDA3ZDQsIDB4MDdkMCwgMHgwN2NjLCAweDAyMGIsIDB4MDIwYywgMHgwMjBkfSwKLQl7Ci0JIDIwMiwgNTAxMCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmNSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwZCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwZCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHhmZiwgMHgwMCwgMHgwN2Q4LCAweDA3ZDQsIDB4MDdkMCwgMHgwMjBhLCAweDAyMGIsIDB4MDIwY30sCi0JewotCSAyMDQsIDUwMjAsIDB4ZjcsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MGQsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MGQsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDdkYywgMHgwN2Q4LCAweDA3ZDQsIDB4MDIwOSwgMHgwMjBhLCAweDAyMGJ9LAotCXsKLQkgMjA2LCA1MDMwLCAweGY3LCAweDAxLCAweDAxLCAweDAxLCAweGY3LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDBkLCAweDAwLCAweDdmLAotCSAweDAwLCAweDBmLCAweDAwLCAweGZmLCAweDAwLCAweGZmLCAweDAwLCAweDBkLCAweDAwLCAweDdmLCAweDAwLCAweDBmLAotCSAweDAwLCAweGZmLCAweDAwLCAweDA3ZTAsIDB4MDdkYywgMHgwN2Q4LCAweDAyMDgsIDB4MDIwOSwgMHgwMjBhfSwKLQl7Ci0JIDIwOCwgNTA0MCwgMHhlZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmOCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwZCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwZCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHhmZiwgMHgwMCwgMHgwN2U0LCAweDA3ZTAsIDB4MDdkYywgMHgwMjA3LCAweDAyMDgsIDB4MDIwOX0sCi0JewotCSAyMTAsIDUwNTAsIDB4ZWYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjksIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MGQsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MGQsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDdlOCwgMHgwN2U0LCAweDA3ZTAsIDB4MDIwNiwgMHgwMjA3LCAweDAyMDh9LAotCXsKLQkgMjEyLCA1MDYwLCAweGU2LCAweDAxLCAweDAxLCAweDAxLCAweGZhLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDBkLCAweDAwLCAweDdmLAotCSAweDAwLCAweDBmLCAweDAwLCAweGZmLCAweDAwLCAweGZmLCAweDAwLCAweDBkLCAweDAwLCAweDdmLCAweDAwLCAweDBmLAotCSAweDAwLCAweGZmLCAweDAwLCAweDA3ZWMsIDB4MDdlOCwgMHgwN2U0LCAweDAyMDUsIDB4MDIwNiwgMHgwMjA3fSwKLQl7Ci0JIDIxNCwgNTA3MCwgMHhlNiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmYiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwZCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwZCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHhmZiwgMHgwMCwgMHgwN2YwLCAweDA3ZWMsIDB4MDdlOCwgMHgwMjA0LCAweDAyMDUsIDB4MDIwNn0sCi0JewotCSAyMTYsIDUwODAsIDB4ZGUsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZmMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MGQsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MGQsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDdmNCwgMHgwN2YwLCAweDA3ZWMsIDB4MDIwMywgMHgwMjA0LCAweDAyMDV9LAotCXsKLQkgMjE4LCA1MDkwLCAweGRlLCAweDAxLCAweDAxLCAweDAxLCAweGZkLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDBkLCAweDAwLCAweDdmLAotCSAweDAwLCAweDBmLCAweDAwLCAweGZmLCAweDAwLCAweGZmLCAweDAwLCAweDBkLCAweDAwLCAweDdmLCAweDAwLCAweDBmLAotCSAweDAwLCAweGZmLCAweDAwLCAweDA3ZjgsIDB4MDdmNCwgMHgwN2YwLCAweDAyMDIsIDB4MDIwMywgMHgwMjA0fSwKLQl7Ci0JIDIyMCwgNTEwMCwgMHhkNiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmZSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwYywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwYywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHhmZSwgMHgwMCwgMHgwN2ZjLCAweDA3ZjgsIDB4MDdmNCwgMHgwMjAxLCAweDAyMDIsIDB4MDIwM30sCi0JewotCSAyMjIsIDUxMTAsIDB4ZDYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZmYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MGMsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MGMsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDgwMCwgMHgwN2ZjLCAweDA3ZjgsIDB4MDIwMCwgMHgwMjAxLCAweDAyMDJ9LAotCXsKLQkgMjI0LCA1MTIwLCAweGNlLCAweDAxLCAweDAxLCAweDAyLCAweDAwLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAyLCAweDAyLCAweDAyLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDBjLCAweDAwLCAweDdmLAotCSAweDAwLCAweDBmLCAweDAwLCAweGZlLCAweDAwLCAweGZmLCAweDAwLCAweDBjLCAweDAwLCAweDdmLCAweDAwLCAweDBmLAotCSAweDAwLCAweGZlLCAweDAwLCAweDA4MDQsIDB4MDgwMCwgMHgwN2ZjLCAweDAxZmYsIDB4MDIwMCwgMHgwMjAxfSwKLQl7Ci0JIDIyNiwgNTEzMCwgMHhjZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwMSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwYywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwYywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHhmZSwgMHgwMCwgMHgwODA4LCAweDA4MDQsIDB4MDgwMCwgMHgwMWZlLCAweDAxZmYsIDB4MDIwMH0sCi0JewotCSAyMjgsIDUxNDAsIDB4YzYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MGMsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MGMsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDgwYywgMHgwODA4LCAweDA4MDQsIDB4MDFmZCwgMHgwMWZlLCAweDAxZmZ9LAotCXsKLQkgMzIsIDUxNjAsIDB4YmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MGMsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MGMsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDgxNCwgMHgwODEwLCAweDA4MGMsIDB4MDFmYiwgMHgwMWZjLCAweDAxZmR9LAotCXsKLQkgMzQsIDUxNzAsIDB4YmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MGMsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MGMsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDgxOCwgMHgwODE0LCAweDA4MTAsIDB4MDFmYSwgMHgwMWZiLCAweDAxZmN9LAotCXsKLQkgMzYsIDUxODAsIDB4YjYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZWYsIDB4MDAsIDB4MGMsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4ZWYsIDB4MDAsIDB4MGMsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDgxYywgMHgwODE4LCAweDA4MTQsIDB4MDFmOSwgMHgwMWZhLCAweDAxZmJ9LAotCXsKLQkgMzgsIDUxOTAsIDB4YjYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDcsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZWYsIDB4MDAsIDB4MGMsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4ZWYsIDB4MDAsIDB4MGMsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDgyMCwgMHgwODFjLCAweDA4MTgsIDB4MDFmOCwgMHgwMWY5LCAweDAxZmF9LAotCXsKLQkgNDAsIDUyMDAsIDB4YWYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDgsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZWYsIDB4MDAsIDB4MGEsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4ZWYsIDB4MDAsIDB4MGEsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDgyNCwgMHgwODIwLCAweDA4MWMsIDB4MDFmNywgMHgwMWY4LCAweDAxZjl9LAotCXsKLQkgNDIsIDUyMTAsIDB4YWYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDksIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZGYsIDB4MDAsIDB4MGEsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4ZGYsIDB4MDAsIDB4MGEsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDgyOCwgMHgwODI0LCAweDA4MjAsIDB4MDFmNiwgMHgwMWY3LCAweDAxZjh9LAotCXsKLQkgNDQsIDUyMjAsIDB4YTcsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZGYsIDB4MDAsIDB4MGEsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4ZGYsIDB4MDAsIDB4MGEsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDgyYywgMHgwODI4LCAweDA4MjQsIDB4MDFmNSwgMHgwMWY2LCAweDAxZjd9LAotCXsKLQkgNDYsIDUyMzAsIDB4YTcsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZGYsIDB4MDAsIDB4MGEsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4ZGYsIDB4MDAsIDB4MGEsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDgzMCwgMHgwODJjLCAweDA4MjgsIDB4MDFmNCwgMHgwMWY1LCAweDAxZjZ9LAotCXsKLQkgNDgsIDUyNDAsIDB4YTAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4Y2YsIDB4MDAsIDB4MGEsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4Y2YsIDB4MDAsIDB4MGEsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDgzNCwgMHgwODMwLCAweDA4MmMsIDB4MDFmMywgMHgwMWY0LCAweDAxZjV9LAotCXsKLQkgNTAsIDUyNTAsIDB4YTAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4Y2YsIDB4MDAsIDB4MGEsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4Y2YsIDB4MDAsIDB4MGEsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDgzOCwgMHgwODM0LCAweDA4MzAsIDB4MDFmMiwgMHgwMWYzLCAweDAxZjR9LAotCXsKLQkgNTIsIDUyNjAsIDB4OTgsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4Y2YsIDB4MDAsIDB4MGEsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4Y2YsIDB4MDAsIDB4MGEsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDgzYywgMHgwODM4LCAweDA4MzQsIDB4MDFmMSwgMHgwMWYyLCAweDAxZjN9LAotCXsKLQkgNTQsIDUyNzAsIDB4OTgsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4Y2YsIDB4MDAsIDB4MGEsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4Y2YsIDB4MDAsIDB4MGEsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDg0MCwgMHgwODNjLCAweDA4MzgsIDB4MDFmMCwgMHgwMWYxLCAweDAxZjJ9LAotCXsKLQkgNTYsIDUyODAsIDB4OTEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTAsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4YmYsIDB4MDAsIDB4MGEsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4YmYsIDB4MDAsIDB4MGEsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDg0NCwgMHgwODQwLCAweDA4M2MsIDB4MDFmMCwgMHgwMWYwLCAweDAxZjF9LAotCXsKLQkgNTgsIDUyOTAsIDB4OTEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4YmYsIDB4MDAsIDB4MGEsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4YmYsIDB4MDAsIDB4MGEsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDg0OCwgMHgwODQ0LCAweDA4NDAsIDB4MDFlZiwgMHgwMWYwLCAweDAxZjB9LAotCXsKLQkgNjAsIDUzMDAsIDB4OGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGUsIDB4MDAsIDB4ZmYsIDB4YmYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmEsIDB4MDAsIDB4YmYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmEsIDB4MDAsIDB4MDg0YywgMHgwODQ4LCAweDA4NDQsIDB4MDFlZSwgMHgwMWVmLCAweDAxZjB9LAotCXsKLQkgNjIsIDUzMTAsIDB4OGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGUsIDB4MDAsIDB4ZmYsIDB4YmYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmEsIDB4MDAsIDB4YmYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmEsIDB4MDAsIDB4MDg1MCwgMHgwODRjLCAweDA4NDgsIDB4MDFlZCwgMHgwMWVlLCAweDAxZWZ9LAotCXsKLQkgNjQsIDUzMjAsIDB4ODMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGUsIDB4MDAsIDB4ZmYsIDB4YmYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmEsIDB4MDAsIDB4YmYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmEsIDB4MDAsIDB4MDg1NCwgMHgwODUwLCAweDA4NGMsIDB4MDFlYywgMHgwMWVkLCAweDAxZWV9LAotCXsKLQkgNjYsIDUzMzAsIDB4ODMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGUsIDB4MDAsIDB4ZmYsIDB4YWYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmEsIDB4MDAsIDB4YWYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmEsIDB4MDAsIDB4MDg1OCwgMHgwODU0LCAweDA4NTAsIDB4MDFlYiwgMHgwMWVjLCAweDAxZWR9LAotCXsKLQkgNjgsIDUzNDAsIDB4N2MsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGUsIDB4MDAsIDB4ZmYsIDB4YWYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmEsIDB4MDAsIDB4YWYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmEsIDB4MDAsIDB4MDg1YywgMHgwODU4LCAweDA4NTQsIDB4MDFlYSwgMHgwMWViLCAweDAxZWN9LAotCXsKLQkgNzAsIDUzNTAsIDB4N2MsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTcsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGUsIDB4MDAsIDB4ZmYsIDB4OWYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmEsIDB4MDAsIDB4OWYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmEsIDB4MDAsIDB4MDg2MCwgMHgwODVjLCAweDA4NTgsIDB4MDFlOSwgMHgwMWVhLCAweDAxZWJ9LAotCXsKLQkgNzIsIDUzNjAsIDB4NzUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTgsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGUsIDB4MDAsIDB4ZmYsIDB4OWYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmEsIDB4MDAsIDB4OWYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmEsIDB4MDAsIDB4MDg2NCwgMHgwODYwLCAweDA4NWMsIDB4MDFlOCwgMHgwMWU5LCAweDAxZWF9LAotCXsKLQkgNzQsIDUzNzAsIDB4NzUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTksIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGUsIDB4MDAsIDB4ZmYsIDB4OWYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmEsIDB4MDAsIDB4OWYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmEsIDB4MDAsIDB4MDg2OCwgMHgwODY0LCAweDA4NjAsIDB4MDFlNywgMHgwMWU4LCAweDAxZTl9LAotCXsKLQkgNzYsIDUzODAsIDB4NmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGUsIDB4MDAsIDB4ZmYsIDB4OWYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmEsIDB4MDAsIDB4OWYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmEsIDB4MDAsIDB4MDg2YywgMHgwODY4LCAweDA4NjQsIDB4MDFlNiwgMHgwMWU3LCAweDAxZTh9LAotCXsKLQkgNzgsIDUzOTAsIDB4NmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGUsIDB4MDAsIDB4ZmYsIDB4OGYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmEsIDB4MDAsIDB4OGYsIDB4MDAsIDB4MDgsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZmEsIDB4MDAsIDB4MDg3MCwgMHgwODZjLCAweDA4NjgsIDB4MDFlNSwgMHgwMWU2LCAweDAxZTd9LAotCXsKLQkgODAsIDU0MDAsIDB4NjcsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGQsIDB4MDAsIDB4YzgsIDB4OGYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4OGYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZjgsIDB4MDAsIDB4MDg3NCwgMHgwODcwLCAweDA4NmMsIDB4MDFlNSwgMHgwMWU1LCAweDAxZTZ9LAotCXsKLQkgODIsIDU0MTAsIDB4NjcsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGQsIDB4MDAsIDB4YzgsIDB4OGYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4OGYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZjgsIDB4MDAsIDB4MDg3OCwgMHgwODc0LCAweDA4NzAsIDB4MDFlNCwgMHgwMWU1LCAweDAxZTV9LAotCXsKLQkgODQsIDU0MjAsIDB4NjEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGQsIDB4MDAsIDB4YzgsIDB4OGUsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4OGUsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZjgsIDB4MDAsIDB4MDg3YywgMHgwODc4LCAweDA4NzQsIDB4MDFlMywgMHgwMWU0LCAweDAxZTV9LAotCXsKLQkgODYsIDU0MzAsIDB4NjEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGQsIDB4MDAsIDB4YzgsIDB4OGUsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4OGUsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZjgsIDB4MDAsIDB4MDg4MCwgMHgwODdjLCAweDA4NzgsIDB4MDFlMiwgMHgwMWUzLCAweDAxZTR9LAotCXsKLQkgODgsIDU0NDAsIDB4NWEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjAsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGQsIDB4MGQsIDB4MDAsIDB4YzgsIDB4N2UsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4N2UsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZjgsIDB4MDAsIDB4MDg4NCwgMHgwODgwLCAweDA4N2MsIDB4MDFlMSwgMHgwMWUyLCAweDAxZTN9LAotCXsKLQkgOTAsIDU0NTAsIDB4NWEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGQsIDB4MGQsIDB4MDAsIDB4YzgsIDB4N2QsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4N2QsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZjgsIDB4MDAsIDB4MDg4OCwgMHgwODg0LCAweDA4ODAsIDB4MDFlMCwgMHgwMWUxLCAweDAxZTJ9LAotCXsKLQkgOTIsIDU0NjAsIDB4NTMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGQsIDB4MGQsIDB4MDAsIDB4YzgsIDB4NmQsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4NmQsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZjgsIDB4MDAsIDB4MDg4YywgMHgwODg4LCAweDA4ODQsIDB4MDFkZiwgMHgwMWUwLCAweDAxZTF9LAotCXsKLQkgOTQsIDU0NzAsIDB4NTMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGQsIDB4MGQsIDB4MDAsIDB4YzgsIDB4NmQsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4NmQsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZjgsIDB4MDAsIDB4MDg5MCwgMHgwODhjLCAweDA4ODgsIDB4MDFkZSwgMHgwMWRmLCAweDAxZTB9LAotCXsKLQkgOTYsIDU0ODAsIDB4NGQsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGQsIDB4MGQsIDB4MDAsIDB4YzgsIDB4NWQsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4NWQsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZjgsIDB4MDAsIDB4MDg5NCwgMHgwODkwLCAweDA4OGMsIDB4MDFkZCwgMHgwMWRlLCAweDAxZGZ9LAotCXsKLQkgOTgsIDU0OTAsIDB4NGQsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGQsIDB4MGQsIDB4MDAsIDB4YzgsIDB4NWMsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZjgsIDB4MDAsIDB4NWMsIDB4MDAsIDB4MDcsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4ZjgsIDB4MDAsIDB4MDg5OCwgMHgwODk0LCAweDA4OTAsIDB4MDFkZCwgMHgwMWRkLCAweDAxZGV9LAotCXsKLQkgMTAwLCA1NTAwLCAweDQ3LCAweDAxLCAweDAxLCAweDAyLCAweDI2LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhkLCAweDBiLCAweDAwLCAweDg0LCAweDVjLCAweDAwLCAweDA2LCAweDAwLCAweDdmLAotCSAweDAwLCAweDBkLCAweDAwLCAweGY2LCAweDAwLCAweDVjLCAweDAwLCAweDA2LCAweDAwLCAweDdmLCAweDAwLCAweDBkLAotCSAweDAwLCAweGY2LCAweDAwLCAweDA4OWMsIDB4MDg5OCwgMHgwODk0LCAweDAxZGMsIDB4MDFkZCwgMHgwMWRkfSwKLQl7Ci0JIDEwMiwgNTUxMCwgMHg0NywgMHgwMSwgMHgwMSwgMHgwMiwgMHgyNywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4ZCwgMHgwYiwgMHgwMCwgMHg4NCwgMHg0YywgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHhmNiwgMHgwMCwgMHg0YywgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwZCwKLQkgMHgwMCwgMHhmNiwgMHgwMCwgMHgwOGEwLCAweDA4OWMsIDB4MDg5OCwgMHgwMWRiLCAweDAxZGMsIDB4MDFkZH0sCi0JewotCSAxMDQsIDU1MjAsIDB4NDAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjgsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGQsIDB4MGIsIDB4MDAsIDB4ODQsIDB4NGMsIDB4MDAsIDB4MDYsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4ZjYsIDB4MDAsIDB4NGMsIDB4MDAsIDB4MDYsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4ZjYsIDB4MDAsIDB4MDhhNCwgMHgwOGEwLCAweDA4OWMsIDB4MDFkYSwgMHgwMWRiLCAweDAxZGN9LAotCXsKLQkgMTA2LCA1NTMwLCAweDQwLCAweDAxLCAweDAxLCAweDAyLCAweDI5LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhkLCAweDBiLCAweDAwLCAweDg0LCAweDNiLCAweDAwLCAweDA2LCAweDAwLCAweDdmLAotCSAweDAwLCAweDBkLCAweDAwLCAweGY2LCAweDAwLCAweDNiLCAweDAwLCAweDA2LCAweDAwLCAweDdmLCAweDAwLCAweDBkLAotCSAweDAwLCAweGY2LCAweDAwLCAweDA4YTgsIDB4MDhhNCwgMHgwOGEwLCAweDAxZDksIDB4MDFkYSwgMHgwMWRifSwKLQl7Ci0JIDEwOCwgNTU0MCwgMHgzYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyYSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4ZCwgMHgwYiwgMHgwMCwgMHg4NCwgMHgzYiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHhmNiwgMHgwMCwgMHgzYiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwZCwKLQkgMHgwMCwgMHhmNiwgMHgwMCwgMHgwOGFjLCAweDA4YTgsIDB4MDhhNCwgMHgwMWQ4LCAweDAxZDksIDB4MDFkYX0sCi0JewotCSAxMTAsIDU1NTAsIDB4M2EsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MmIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGQsIDB4MGIsIDB4MDAsIDB4ODQsIDB4M2IsIDB4MDAsIDB4MDYsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4ZjYsIDB4MDAsIDB4M2IsIDB4MDAsIDB4MDYsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4ZjYsIDB4MDAsIDB4MDhiMCwgMHgwOGFjLCAweDA4YTgsIDB4MDFkNywgMHgwMWQ4LCAweDAxZDl9LAotCXsKLQkgMTEyLCA1NTYwLCAweDM0LCAweDAxLCAweDAxLCAweDAyLCAweDJjLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhkLCAweDBiLCAweDAwLCAweDg0LCAweDJiLCAweDAwLCAweDA2LCAweDAwLCAweDdmLAotCSAweDAwLCAweDBkLCAweDAwLCAweGY2LCAweDAwLCAweDJiLCAweDAwLCAweDA2LCAweDAwLCAweDdmLCAweDAwLCAweDBkLAotCSAweDAwLCAweGY2LCAweDAwLCAweDA4YjQsIDB4MDhiMCwgMHgwOGFjLCAweDAxZDcsIDB4MDFkNywgMHgwMWQ4fSwKLQl7Ci0JIDExNCwgNTU3MCwgMHgzNCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyZCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4ZCwgMHgwYiwgMHgwMCwgMHg4NCwgMHgyYSwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHhmNiwgMHgwMCwgMHgyYSwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwZCwKLQkgMHgwMCwgMHhmNiwgMHgwMCwgMHgwOGI4LCAweDA4YjQsIDB4MDhiMCwgMHgwMWQ2LCAweDAxZDcsIDB4MDFkN30sCi0JewotCSAxMTYsIDU1ODAsIDB4MmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MmUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGQsIDB4MGIsIDB4MDAsIDB4ODQsIDB4MWEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4ZjYsIDB4MDAsIDB4MWEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4ZjYsIDB4MDAsIDB4MDhiYywgMHgwOGI4LCAweDA4YjQsIDB4MDFkNSwgMHgwMWQ2LCAweDAxZDd9LAotCXsKLQkgMTE4LCA1NTkwLCAweDJlLCAweDAxLCAweDAxLCAweDAyLCAweDJmLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhkLCAweDBiLCAweDAwLCAweDg0LCAweDFhLCAweDAwLCAweDA2LCAweDAwLCAweDdmLAotCSAweDAwLCAweDBkLCAweDAwLCAweGY2LCAweDAwLCAweDFhLCAweDAwLCAweDA2LCAweDAwLCAweDdmLCAweDAwLCAweDBkLAotCSAweDAwLCAweGY2LCAweDAwLCAweDA4YzAsIDB4MDhiYywgMHgwOGI4LCAweDAxZDQsIDB4MDFkNSwgMHgwMWQ2fSwKLQl7Ci0JIDEyMCwgNTYwMCwgMHgyOCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzMCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YiwgMHgwOSwgMHgwMCwgMHg3MCwgMHgxYSwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhmNCwgMHgwMCwgMHgxYSwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHhmNCwgMHgwMCwgMHgwOGM0LCAweDA4YzAsIDB4MDhiYywgMHgwMWQzLCAweDAxZDQsIDB4MDFkNX0sCi0JewotCSAxMjIsIDU2MTAsIDB4MjgsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGIsIDB4MDksIDB4MDAsIDB4NzAsIDB4MTksIDB4MDAsIDB4MDQsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MTksIDB4MDAsIDB4MDQsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGIsCi0JIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDhjOCwgMHgwOGM0LCAweDA4YzAsIDB4MDFkMiwgMHgwMWQzLCAweDAxZDR9LAotCXsKLQkgMTI0LCA1NjIwLCAweDIxLCAweDAxLCAweDAxLCAweDAyLCAweDMyLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhiLCAweDA5LCAweDAwLCAweDcwLCAweDE5LCAweDAwLCAweDA0LCAweDAwLCAweDdmLAotCSAweDAwLCAweDBiLCAweDAwLCAweGY0LCAweDAwLCAweDE5LCAweDAwLCAweDA0LCAweDAwLCAweDdmLCAweDAwLCAweDBiLAotCSAweDAwLCAweGY0LCAweDAwLCAweDA4Y2MsIDB4MDhjOCwgMHgwOGM0LCAweDAxZDIsIDB4MDFkMiwgMHgwMWQzfSwKLQl7Ci0JIDEyNiwgNTYzMCwgMHgyMSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzMywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YiwgMHgwOSwgMHgwMCwgMHg3MCwgMHgwOSwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhmNCwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHhmNCwgMHgwMCwgMHgwOGQwLCAweDA4Y2MsIDB4MDhjOCwgMHgwMWQxLCAweDAxZDIsIDB4MDFkMn0sCi0JewotCSAxMjgsIDU2NDAsIDB4MWMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGIsIDB4MDksIDB4MDAsIDB4NzAsIDB4MDksIDB4MDAsIDB4MDQsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDQsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGIsCi0JIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDhkNCwgMHgwOGQwLCAweDA4Y2MsIDB4MDFkMCwgMHgwMWQxLCAweDAxZDJ9LAotCXsKLQkgMTMwLCA1NjUwLCAweDFjLCAweDAxLCAweDAxLCAweDAyLCAweDM1LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhiLCAweDA5LCAweDAwLCAweDcwLCAweDA4LCAweDAwLCAweDA0LCAweDAwLCAweDdmLAotCSAweDAwLCAweDBiLCAweDAwLCAweGY0LCAweDAwLCAweDA4LCAweDAwLCAweDA0LCAweDAwLCAweDdmLCAweDAwLCAweDBiLAotCSAweDAwLCAweGY0LCAweDAwLCAweDA4ZDgsIDB4MDhkNCwgMHgwOGQwLCAweDAxY2YsIDB4MDFkMCwgMHgwMWQxfSwKLQl7Ci0JIDEzMiwgNTY2MCwgMHgxNiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzNiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YiwgMHgwOSwgMHgwMCwgMHg3MCwgMHgwOCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhmNCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHhmNCwgMHgwMCwgMHgwOGRjLCAweDA4ZDgsIDB4MDhkNCwgMHgwMWNlLCAweDAxY2YsIDB4MDFkMH0sCi0JewotCSAxMzQsIDU2NzAsIDB4MTYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzcsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGIsIDB4MDksIDB4MDAsIDB4NzAsIDB4MDgsIDB4MDAsIDB4MDQsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDQsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGIsCi0JIDB4MDAsIDB4ZjQsIDB4MDAsIDB4MDhlMCwgMHgwOGRjLCAweDA4ZDgsIDB4MDFjZSwgMHgwMWNlLCAweDAxY2Z9LAotCXsKLQkgMTM2LCA1NjgwLCAweDEwLCAweDAxLCAweDAxLCAweDAyLCAweDM4LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhiLCAweDA5LCAweDAwLCAweDcwLCAweDA4LCAweDAwLCAweDA0LCAweDAwLCAweDdmLAotCSAweDAwLCAweDBiLCAweDAwLCAweGY0LCAweDAwLCAweDA4LCAweDAwLCAweDA0LCAweDAwLCAweDdmLCAweDAwLCAweDBiLAotCSAweDAwLCAweGY0LCAweDAwLCAweDA4ZTQsIDB4MDhlMCwgMHgwOGRjLCAweDAxY2QsIDB4MDFjZSwgMHgwMWNlfSwKLQl7Ci0JIDEzOCwgNTY5MCwgMHgxMCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzOSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YiwgMHgwOSwgMHgwMCwgMHg3MCwgMHgwNywgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhmNCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwNCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHhmNCwgMHgwMCwgMHgwOGU4LCAweDA4ZTQsIDB4MDhlMCwgMHgwMWNjLCAweDAxY2QsIDB4MDFjZX0sCi0JewotCSAxNDAsIDU3MDAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4M2EsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGEsIDB4MDYsIDB4MDAsIDB4NDAsIDB4MDcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4ZjIsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4ZjIsIDB4MDAsIDB4MDhlYywgMHgwOGU4LCAweDA4ZTQsIDB4MDFjYiwgMHgwMWNjLCAweDAxY2R9LAotCXsKLQkgMTQyLCA1NzEwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDNiLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhhLCAweDA2LCAweDAwLCAweDQwLCAweDA3LCAweDAwLCAweDAzLCAweDAwLCAweDdmLAotCSAweDAwLCAweDBhLCAweDAwLCAweGYyLCAweDAwLCAweDA3LCAweDAwLCAweDAzLCAweDAwLCAweDdmLCAweDAwLCAweDBhLAotCSAweDAwLCAweGYyLCAweDAwLCAweDA4ZjAsIDB4MDhlYywgMHgwOGU4LCAweDAxY2EsIDB4MDFjYiwgMHgwMWNjfSwKLQl7Ci0JIDE0NCwgNTcyMCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzYywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YSwgMHgwNiwgMHgwMCwgMHg0MCwgMHgwNywgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhmMiwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHhmMiwgMHgwMCwgMHgwOGY0LCAweDA4ZjAsIDB4MDhlYywgMHgwMWM5LCAweDAxY2EsIDB4MDFjYn0sCi0JewotCSAxNDUsIDU3MjUsIDB4MDMsIDB4MDEsIDB4MDIsIDB4MDQsIDB4NzksIDB4MDcsIDB4MDcsIDB4MDQsIDB4MTAsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGEsIDB4MDYsIDB4MDAsIDB4NDAsIDB4MDYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4ZjIsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4ZjIsIDB4MDAsIDB4MDhmNiwgMHgwOGYyLCAweDA4ZWUsIDB4MDFjOSwgMHgwMWNhLCAweDAxY2J9LAotCXsKLQkgMTQ2LCA1NzMwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDNkLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhhLCAweDA2LCAweDAwLCAweDQwLCAweDA2LCAweDAwLCAweDAzLCAweDAwLCAweDdmLAotCSAweDAwLCAweDBhLCAweDAwLCAweGYyLCAweDAwLCAweDA2LCAweDAwLCAweDAzLCAweDAwLCAweDdmLCAweDAwLCAweDBhLAotCSAweDAwLCAweGYyLCAweDAwLCAweDA4ZjgsIDB4MDhmNCwgMHgwOGYwLCAweDAxYzksIDB4MDFjOSwgMHgwMWNhfSwKLQl7Ci0JIDE0NywgNTczNSwgMHgwMywgMHgwMSwgMHgwMiwgMHgwNCwgMHg3YiwgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YSwgMHgwNiwgMHgwMCwgMHg0MCwgMHgwNiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhmMiwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHhmMiwgMHgwMCwgMHgwOGZhLCAweDA4ZjYsIDB4MDhmMiwgMHgwMWM4LCAweDAxYzksIDB4MDFjYX0sCi0JewotCSAxNDgsIDU3NDAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4M2UsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGEsIDB4MDYsIDB4MDAsIDB4NDAsIDB4MDYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4ZjIsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4ZjIsIDB4MDAsIDB4MDhmYywgMHgwOGY4LCAweDA4ZjQsIDB4MDFjOCwgMHgwMWM5LCAweDAxYzl9LAotCXsKLQkgMTQ5LCA1NzQ1LCAweGZlLCAweDAwLCAweDAyLCAweDA0LCAweDdkLCAweDA3LCAweDA3LCAweDA0LCAweDEwLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhhLCAweDA2LCAweDAwLCAweDQwLCAweDA2LCAweDAwLCAweDAzLCAweDAwLCAweDdmLAotCSAweDAwLCAweDBhLCAweDAwLCAweGYyLCAweDAwLCAweDA2LCAweDAwLCAweDAzLCAweDAwLCAweDdmLCAweDAwLCAweDBhLAotCSAweDAwLCAweGYyLCAweDAwLCAweDA4ZmUsIDB4MDhmYSwgMHgwOGY2LCAweDAxYzgsIDB4MDFjOCwgMHgwMWM5fSwKLQl7Ci0JIDE1MCwgNTc1MCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzZiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YSwgMHgwNiwgMHgwMCwgMHg0MCwgMHgwNiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhmMiwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHhmMiwgMHgwMCwgMHgwOTAwLCAweDA4ZmMsIDB4MDhmOCwgMHgwMWM3LCAweDAxYzgsIDB4MDFjOX0sCi0JewotCSAxNTEsIDU3NTUsIDB4ZmUsIDB4MDAsIDB4MDIsIDB4MDQsIDB4N2YsIDB4MDcsIDB4MDcsIDB4MDQsIDB4MTAsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGEsIDB4MDYsIDB4MDAsIDB4NDAsIDB4MDUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4ZjIsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4ZjIsIDB4MDAsIDB4MDkwMiwgMHgwOGZlLCAweDA4ZmEsIDB4MDFjNywgMHgwMWM4LCAweDAxYzh9LAotCXsKLQkgMTUyLCA1NzYwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQwLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhhLCAweDA2LCAweDAwLCAweDQwLCAweDA1LCAweDAwLCAweDAzLCAweDAwLCAweDdmLAotCSAweDAwLCAweDBhLCAweDAwLCAweGYyLCAweDAwLCAweDA1LCAweDAwLCAweDAzLCAweDAwLCAweDdmLCAweDAwLCAweDBhLAotCSAweDAwLCAweGYyLCAweDAwLCAweDA5MDQsIDB4MDkwMCwgMHgwOGZjLCAweDAxYzYsIDB4MDFjNywgMHgwMWM4fSwKLQl7Ci0JIDE1MywgNTc2NSwgMHhmOCwgMHgwMCwgMHgwMiwgMHgwNCwgMHg4MSwgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YSwgMHgwNiwgMHgwMCwgMHg0MCwgMHgwNSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhmMiwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHhmMiwgMHgwMCwgMHgwOTA2LCAweDA5MDIsIDB4MDhmZSwgMHgwMWM2LCAweDAxYzcsIDB4MDFjOH0sCi0JewotCSAxNTQsIDU3NzAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGEsIDB4MDYsIDB4MDAsIDB4NDAsIDB4MDUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4ZjIsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4ZjIsIDB4MDAsIDB4MDkwOCwgMHgwOTA0LCAweDA5MDAsIDB4MDFjNiwgMHgwMWM2LCAweDAxYzd9LAotCXsKLQkgMTU1LCA1Nzc1LCAweGY4LCAweDAwLCAweDAyLCAweDA0LCAweDgzLCAweDA3LCAweDA3LCAweDA0LCAweDEwLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhhLCAweDA2LCAweDAwLCAweDQwLCAweDA1LCAweDAwLCAweDAzLCAweDAwLCAweDdmLAotCSAweDAwLCAweDBhLCAweDAwLCAweGYyLCAweDAwLCAweDA1LCAweDAwLCAweDAzLCAweDAwLCAweDdmLCAweDAwLCAweDBhLAotCSAweDAwLCAweGYyLCAweDAwLCAweDA5MGEsIDB4MDkwNiwgMHgwOTAyLCAweDAxYzUsIDB4MDFjNiwgMHgwMWM3fSwKLQl7Ci0JIDE1NiwgNTc4MCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHg0MiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YSwgMHgwNiwgMHgwMCwgMHg0MCwgMHgwNSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhmMiwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHhmMiwgMHgwMCwgMHgwOTBjLCAweDA5MDgsIDB4MDkwNCwgMHgwMWM1LCAweDAxYzYsIDB4MDFjNn0sCi0JewotCSAxNTcsIDU3ODUsIDB4ZjIsIDB4MDAsIDB4MDIsIDB4MDQsIDB4ODUsIDB4MDcsIDB4MDcsIDB4MDQsIDB4MTAsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4OGEsIDB4MDYsIDB4MDAsIDB4NDAsIDB4MDQsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4ZjIsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDMsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4ZjIsIDB4MDAsIDB4MDkwZSwgMHgwOTBhLCAweDA5MDYsIDB4MDFjNCwgMHgwMWM1LCAweDAxYzZ9LAotCXsKLQkgMTU4LCA1NzkwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQzLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDhhLCAweDA2LCAweDAwLCAweDQwLCAweDA0LCAweDAwLCAweDAzLCAweDAwLCAweDdmLAotCSAweDAwLCAweDBhLCAweDAwLCAweGYyLCAweDAwLCAweDA0LCAweDAwLCAweDAzLCAweDAwLCAweDdmLCAweDAwLCAweDBhLAotCSAweDAwLCAweGYyLCAweDAwLCAweDA5MTAsIDB4MDkwYywgMHgwOTA4LCAweDAxYzQsIDB4MDFjNSwgMHgwMWM2fSwKLQl7Ci0JIDE1OSwgNTc5NSwgMHhmMiwgMHgwMCwgMHgwMiwgMHgwNCwgMHg4NywgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4YSwgMHgwNiwgMHgwMCwgMHg0MCwgMHgwNCwgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhmMiwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMywgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHhmMiwgMHgwMCwgMHgwOTEyLCAweDA5MGUsIDB4MDkwYSwgMHgwMWM0LCAweDAxYzQsIDB4MDFjNX0sCi0JewotCSAxNjAsIDU4MDAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODgsIDB4MDQsIDB4MDAsIDB4MjAsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDkxNCwgMHgwOTEwLCAweDA5MGMsIDB4MDFjMywgMHgwMWM0LCAweDAxYzV9LAotCXsKLQkgMTYxLCA1ODA1LCAweGVkLCAweDAwLCAweDAyLCAweDA0LCAweDg5LCAweDA3LCAweDA3LCAweDA0LCAweDEwLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg4LCAweDA0LCAweDAwLCAweDIwLCAweDA0LCAweDAwLCAweDAyLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA5LCAweDAwLCAweGYwLCAweDAwLCAweDA0LCAweDAwLCAweDAyLCAweDAwLCAweDdmLCAweDAwLCAweDA5LAotCSAweDAwLCAweGYwLCAweDAwLCAweDA5MTYsIDB4MDkxMiwgMHgwOTBlLCAweDAxYzMsIDB4MDFjNCwgMHgwMWM0fSwKLQl7Ci0JIDE2MiwgNTgxMCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHg0NSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4OCwgMHgwNCwgMHgwMCwgMHgyMCwgMHgwNCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHhmMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHhmMCwgMHgwMCwgMHgwOTE4LCAweDA5MTQsIDB4MDkxMCwgMHgwMWMyLCAweDAxYzMsIDB4MDFjNH0sCi0JewotCSAxNjMsIDU4MTUsIDB4ZWQsIDB4MDAsIDB4MDIsIDB4MDQsIDB4OGIsIDB4MDcsIDB4MDcsIDB4MDQsIDB4MTAsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODgsIDB4MDQsIDB4MDAsIDB4MjAsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDkxYSwgMHgwOTE2LCAweDA5MTIsIDB4MDFjMiwgMHgwMWMzLCAweDAxYzR9LAotCXsKLQkgMTY0LCA1ODIwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQ2LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg4LCAweDA0LCAweDAwLCAweDIwLCAweDAzLCAweDAwLCAweDAyLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA5LCAweDAwLCAweGYwLCAweDAwLCAweDAzLCAweDAwLCAweDAyLCAweDAwLCAweDdmLCAweDAwLCAweDA5LAotCSAweDAwLCAweGYwLCAweDAwLCAweDA5MWMsIDB4MDkxOCwgMHgwOTE0LCAweDAxYzIsIDB4MDFjMiwgMHgwMWMzfSwKLQl7Ci0JIDE2NSwgNTgyNSwgMHhlZCwgMHgwMCwgMHgwMiwgMHgwNCwgMHg4ZCwgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4OCwgMHgwNCwgMHgwMCwgMHgyMCwgMHgwMywgMHgwMCwgMHgwMiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHhmMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHhmMCwgMHgwMCwgMHgwOTFlLCAweDA5MWEsIDB4MDkxNiwgMHgwMWMxLCAweDAxYzIsIDB4MDFjM30sCi0JewotCSAxNjYsIDU4MzAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDcsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODgsIDB4MDQsIDB4MDAsIDB4MjAsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDkyMCwgMHgwOTFjLCAweDA5MTgsIDB4MDFjMSwgMHgwMWMyLCAweDAxYzJ9LAotCXsKLQkgMTY4LCA1ODQwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQ4LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg4LCAweDA0LCAweDAwLCAweDIwLCAweDAzLCAweDAwLCAweDAyLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA5LCAweDAwLCAweGYwLCAweDAwLCAweDAzLCAweDAwLCAweDAyLCAweDAwLCAweDdmLCAweDAwLCAweDA5LAotCSAweDAwLCAweGYwLCAweDAwLCAweDA5MjQsIDB4MDkyMCwgMHgwOTFjLCAweDAxYzAsIDB4MDFjMSwgMHgwMWMyfSwKLQl7Ci0JIDE3MCwgNTg1MCwgMHhlMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHg0OSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4OCwgMHgwNCwgMHgwMCwgMHgyMCwgMHgwMywgMHgwMCwgMHgwMiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHhmMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHhmMCwgMHgwMCwgMHgwOTI4LCAweDA5MjQsIDB4MDkyMCwgMHgwMWJmLCAweDAxYzAsIDB4MDFjMX0sCi0JewotCSAxNzIsIDU4NjAsIDB4ZGUsIDB4MDAsIDB4MDEsIDB4MDIsIDB4NGEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODgsIDB4MDQsIDB4MDAsIDB4MjAsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDkyYywgMHgwOTI4LCAweDA5MjQsIDB4MDFiZiwgMHgwMWJmLCAweDAxYzB9LAotCXsKLQkgMTc0LCA1ODcwLCAweGRiLCAweDAwLCAweDAxLCAweDAyLCAweDRiLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg4LCAweDA0LCAweDAwLCAweDIwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA5LCAweDAwLCAweGYwLCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDdmLCAweDAwLCAweDA5LAotCSAweDAwLCAweGYwLCAweDAwLCAweDA5MzAsIDB4MDkyYywgMHgwOTI4LCAweDAxYmUsIDB4MDFiZiwgMHgwMWJmfSwKLQl7Ci0JIDE3NiwgNTg4MCwgMHhkOCwgMHgwMCwgMHgwMSwgMHgwMiwgMHg0YywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4OCwgMHgwNCwgMHgwMCwgMHgyMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHhmMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHhmMCwgMHgwMCwgMHgwOTM0LCAweDA5MzAsIDB4MDkyYywgMHgwMWJkLCAweDAxYmUsIDB4MDFiZn0sCi0JewotCSAxNzgsIDU4OTAsIDB4ZDYsIDB4MDAsIDB4MDEsIDB4MDIsIDB4NGQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODgsIDB4MDQsIDB4MDAsIDB4MjAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2YsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4N2YsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDkzOCwgMHgwOTM0LCAweDA5MzAsIDB4MDFiYywgMHgwMWJkLCAweDAxYmV9LAotCXsKLQkgMTgwLCA1OTAwLCAweGQzLCAweDAwLCAweDAxLCAweDAyLCAweDRlLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg3LCAweDAzLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDdmLAotCSAweDAwLCAweDA3LCAweDAwLCAweGYwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDdmLCAweDAwLCAweDA3LAotCSAweDAwLCAweGYwLCAweDAwLCAweDA5M2MsIDB4MDkzOCwgMHgwOTM0LCAweDAxYmMsIDB4MDFiYywgMHgwMWJkfSwKLQl7Ci0JIDE4MiwgNTkxMCwgMHhkNiwgMHgwMCwgMHgwMSwgMHgwMiwgMHg0ZiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NywgMHgwMywgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHhmMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwgMHgwMCwgMHgwNywKLQkgMHgwMCwgMHhmMCwgMHgwMCwgMHgwOTQwLCAweDA5M2MsIDB4MDkzOCwgMHgwMWJiLCAweDAxYmMsIDB4MDFiY30sCi0JewotCSAxLCAyNDEyLCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDZjLCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweDAwLCAweDA0LCAweDAwLAotCSAweDcwLCAweDAwLCAweDBmLCAweDAwLCAweDBlLCAweDAwLCAweGZmLCAweDAwLCAweDA0LCAweDAwLCAweDcwLCAweDAwLAotCSAweDBmLCAweDAwLCAweDBlLCAweDAzYzksIDB4MDNjNSwgMHgwM2MxLCAweDA0M2EsIDB4MDQzZiwgMHgwNDQzfSwKLQl7Ci0JIDIsIDI0MTcsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4NzEsIDB4MDgsIDB4MDgsIDB4MDQsIDB4MTYsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDQsIDB4MDAsCi0JIDB4NzAsIDB4MDAsIDB4MGYsIDB4MDAsIDB4MGUsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzAsIDB4MDAsCi0JIDB4MGYsIDB4MDAsIDB4MGUsIDB4MDNjYiwgMHgwM2M3LCAweDAzYzMsIDB4MDQzOCwgMHgwNDNkLCAweDA0NDF9LAotCXsKLQkgMywgMjQyMiwgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg3NiwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwNCwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwZiwgMHgwMCwgMHgwZSwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwZiwgMHgwMCwgMHgwZSwgMHgwM2NkLCAweDAzYzksIDB4MDNjNSwgMHgwNDM2LCAweDA0M2EsIDB4MDQzZn0sCi0JewotCSA0LCAyNDI3LCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDdiLCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweGZkLCAweDAwLCAweDA0LCAweDAwLAotCSAweDcwLCAweDAwLCAweDBmLCAweDAwLCAweDBlLCAweDAwLCAweGZkLCAweDAwLCAweDA0LCAweDAwLCAweDcwLCAweDAwLAotCSAweDBmLCAweDAwLCAweDBlLCAweDAzY2YsIDB4MDNjYiwgMHgwM2M3LCAweDA0MzQsIDB4MDQzOCwgMHgwNDNkfSwKLQl7Ci0JIDUsIDI0MzIsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4ODAsIDB4MDgsIDB4MDgsIDB4MDQsIDB4MTYsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmIsIDB4MDAsIDB4MDQsIDB4MDAsCi0JIDB4NzAsIDB4MDAsIDB4MGYsIDB4MDAsIDB4MGUsIDB4MDAsIDB4ZmIsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzAsIDB4MDAsCi0JIDB4MGYsIDB4MDAsIDB4MGUsIDB4MDNkMSwgMHgwM2NkLCAweDAzYzksIDB4MDQzMSwgMHgwNDM2LCAweDA0M2F9LAotCXsKLQkgNiwgMjQzNywgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg4NSwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmYSwgMHgwMCwgMHgwNCwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwZiwgMHgwMCwgMHgwZSwgMHgwMCwgMHhmYSwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwZiwgMHgwMCwgMHgwZSwgMHgwM2QzLCAweDAzY2YsIDB4MDNjYiwgMHgwNDJmLCAweDA0MzQsIDB4MDQzOH0sCi0JewotCSA3LCAyNDQyLCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDhhLCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweGY4LCAweDAwLCAweDA0LCAweDAwLAotCSAweDcwLCAweDAwLCAweDBmLCAweDAwLCAweDBlLCAweDAwLCAweGY4LCAweDAwLCAweDA0LCAweDAwLCAweDcwLCAweDAwLAotCSAweDBmLCAweDAwLCAweDBlLCAweDAzZDUsIDB4MDNkMSwgMHgwM2NkLCAweDA0MmQsIDB4MDQzMSwgMHgwNDM2fSwKLQl7Ci0JIDgsIDI0NDcsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4OGYsIDB4MDgsIDB4MDgsIDB4MDQsIDB4MTYsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4OGYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjcsIDB4MDAsIDB4MDQsIDB4MDAsCi0JIDB4NzAsIDB4MDAsIDB4MGYsIDB4MDAsIDB4MGUsIDB4MDAsIDB4ZjcsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzAsIDB4MDAsCi0JIDB4MGYsIDB4MDAsIDB4MGUsIDB4MDNkNywgMHgwM2QzLCAweDAzY2YsIDB4MDQyYiwgMHgwNDJmLCAweDA0MzR9LAotCXsKLQkgOSwgMjQ1MiwgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg5NCwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmNiwgMHgwMCwgMHgwNCwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwZiwgMHgwMCwgMHgwZSwgMHgwMCwgMHhmNiwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwZiwgMHgwMCwgMHgwZSwgMHgwM2Q5LCAweDAzZDUsIDB4MDNkMSwgMHgwNDI5LCAweDA0MmQsIDB4MDQzMX0sCi0JewotCSAxMCwgMjQ1NywgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg5OSwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmNSwgMHgwMCwgMHgwNCwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwZiwgMHgwMCwgMHgwZSwgMHgwMCwgMHhmNSwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwZiwgMHgwMCwgMHgwZSwgMHgwM2RiLCAweDAzZDcsIDB4MDNkMywgMHgwNDI3LCAweDA0MmIsIDB4MDQyZn0sCi0JewotCSAxMSwgMjQ2MiwgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg5ZSwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmNCwgMHgwMCwgMHgwNCwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwZiwgMHgwMCwgMHgwZSwgMHgwMCwgMHhmNCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwZiwgMHgwMCwgMHgwZSwgMHgwM2RkLCAweDAzZDksIDB4MDNkNSwgMHgwNDI0LCAweDA0MjksIDB4MDQyZH0sCi0JewotCSAxMiwgMjQ2NywgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHhhMywgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMywgMHgwMCwgMHgwNCwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwZiwgMHgwMCwgMHgwZSwgMHgwMCwgMHhmMywgMHgwMCwgMHgwNCwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwZiwgMHgwMCwgMHgwZSwgMHgwM2RmLCAweDAzZGIsIDB4MDNkNywgMHgwNDIyLCAweDA0MjcsIDB4MDQyYn0sCi0JewotCSAxMywgMjQ3MiwgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHhhOCwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNywgMHgwNywgMHgwNywgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMiwgMHgwMCwgMHgwNCwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwZiwgMHgwMCwgMHgwZSwgMHgwMCwgMHhmMiwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwZiwgMHgwMCwgMHgwZSwgMHgwM2UxLCAweDAzZGQsIDB4MDNkOSwgMHgwNDIwLCAweDA0MjQsIDB4MDQyOX0sCi0JewotCSAxNCwgMjQ4NCwgMHhmZiwgMHgwMSwgMHgwMywgMHgwOSwgMHhiNCwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNywgMHgwNywgMHgwNywgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHgwNCwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwZiwgMHgwMCwgMHgwZSwgMHgwMCwgMHhmMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwZiwgMHgwMCwgMHgwZSwgMHgwM2U2LCAweDAzZTIsIDB4MDNkZSwgMHgwNDFiLCAweDA0MWYsIDB4MDQyNH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2hhbl9pbmZvX25waHlfcmFkaW8yMDV4IGNoYW5faW5mb19ucGh5cmV2NV8yMDU2djVbXSA9IHsKLQl7Ci0JIDE4NCwgNDkyMCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhlYywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwYiwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg5ZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwYiwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2I0LCAweDA3YjAsIDB4MDdhYywgMHgwMjE0LCAweDAyMTUsIDB4MDIxNn0sCi0JewotCSAxODYsIDQ5MzAsIDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZWQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MGIsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MGUsIDB4MDAsIDB4OWYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MGIsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MGUsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdiOCwgMHgwN2I0LCAweDA3YjAsIDB4MDIxMywgMHgwMjE0LCAweDAyMTV9LAotCXsKLQkgMTg4LCA0OTQwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGVlLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAwLCAweDAwLCAweDAwLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDBiLCAweDAwLCAweDcwLAotCSAweDAwLCAweDBlLCAweDAwLCAweDlmLCAweDAwLCAweGZmLCAweDAwLCAweDBiLCAweDAwLCAweDcwLCAweDAwLCAweDBlLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3YmMsIDB4MDdiOCwgMHgwN2I0LCAweDAyMTIsIDB4MDIxMywgMHgwMjE0fSwKLQl7Ci0JIDE5MCwgNDk1MCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhlZiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwYiwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwZSwgMHgwMCwgMHg5ZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwYiwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwZSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2MwLCAweDA3YmMsIDB4MDdiOCwgMHgwMjExLCAweDAyMTIsIDB4MDIxM30sCi0JewotCSAxOTIsIDQ5NjAsIDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MGEsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MGUsIDB4MDAsIDB4OWYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MGEsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MGUsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdjNCwgMHgwN2MwLCAweDA3YmMsIDB4MDIwZiwgMHgwMjExLCAweDAyMTJ9LAotCXsKLQkgMTk0LCA0OTcwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGYxLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDBhLCAweDAwLCAweDcwLAotCSAweDAwLCAweDBkLCAweDAwLCAweDlmLCAweDAwLCAweGZmLCAweDAwLCAweDBhLCAweDAwLCAweDcwLCAweDAwLCAweDBkLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3YzgsIDB4MDdjNCwgMHgwN2MwLCAweDAyMGUsIDB4MDIwZiwgMHgwMjExfSwKLQl7Ci0JIDE5NiwgNDk4MCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmMiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwYSwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHg5ZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwYSwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwZCwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2NjLCAweDA3YzgsIDB4MDdjNCwgMHgwMjBkLCAweDAyMGUsIDB4MDIwZn0sCi0JewotCSAxOTgsIDQ5OTAsIDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MGEsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4OWYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MGEsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdkMCwgMHgwN2NjLCAweDA3YzgsIDB4MDIwYywgMHgwMjBkLCAweDAyMGV9LAotCXsKLQkgMjAwLCA1MDAwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGY0LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDBhLCAweDAwLCAweDcwLAotCSAweDAwLCAweDBkLCAweDAwLCAweDlmLCAweDAwLCAweGZmLCAweDAwLCAweDBhLCAweDAwLCAweDcwLCAweDAwLCAweDBkLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3ZDQsIDB4MDdkMCwgMHgwN2NjLCAweDAyMGIsIDB4MDIwYywgMHgwMjBkfSwKLQl7Ci0JIDIwMiwgNTAxMCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmNSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwYSwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHg5ZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwYSwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwZCwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2Q4LCAweDA3ZDQsIDB4MDdkMCwgMHgwMjBhLCAweDAyMGIsIDB4MDIwY30sCi0JewotCSAyMDQsIDUwMjAsIDB4ZjcsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4OWYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzAsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdkYywgMHgwN2Q4LCAweDA3ZDQsIDB4MDIwOSwgMHgwMjBhLCAweDAyMGJ9LAotCXsKLQkgMjA2LCA1MDMwLCAweGY3LCAweDAxLCAweDAxLCAweDAxLCAweGY3LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDA5LCAweDAwLCAweDcwLAotCSAweDAwLCAweDBjLCAweDAwLCAweDlmLCAweDAwLCAweGZmLCAweDAwLCAweDA5LCAweDAwLCAweDcwLCAweDAwLCAweDBjLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3ZTAsIDB4MDdkYywgMHgwN2Q4LCAweDAyMDgsIDB4MDIwOSwgMHgwMjBhfSwKLQl7Ci0JIDIwOCwgNTA0MCwgMHhlZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmOCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwYywgMHgwMCwgMHg5ZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwYywKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2U0LCAweDA3ZTAsIDB4MDdkYywgMHgwMjA3LCAweDAyMDgsIDB4MDIwOX0sCi0JewotCSAyMTAsIDUwNTAsIDB4ZWYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjksIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MGMsIDB4MDAsIDB4OWYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzAsIDB4MDAsIDB4MGMsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdlOCwgMHgwN2U0LCAweDA3ZTAsIDB4MDIwNiwgMHgwMjA3LCAweDAyMDh9LAotCXsKLQkgMjEyLCA1MDYwLCAweGU2LCAweDAxLCAweDAxLCAweDAxLCAweGZhLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZkLCAweDAwLCAweDA5LCAweDAwLCAweDcwLAotCSAweDAwLCAweDBjLCAweDAwLCAweDlmLCAweDAwLCAweGZkLCAweDAwLCAweDA5LCAweDAwLCAweDcwLCAweDAwLCAweDBjLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3ZWMsIDB4MDdlOCwgMHgwN2U0LCAweDAyMDUsIDB4MDIwNiwgMHgwMjA3fSwKLQl7Ci0JIDIxNCwgNTA3MCwgMHhlNiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmYiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZCwgMHgwMCwgMHgwOCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHg5ZiwgMHgwMCwgMHhmZCwgMHgwMCwgMHgwOCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2YwLCAweDA3ZWMsIDB4MDdlOCwgMHgwMjA0LCAweDAyMDUsIDB4MDIwNn0sCi0JewotCSAyMTYsIDUwODAsIDB4ZGUsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZmMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4OWYsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MGIsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdmNCwgMHgwN2YwLCAweDA3ZWMsIDB4MDIwMywgMHgwMjA0LCAweDAyMDV9LAotCXsKLQkgMjE4LCA1MDkwLCAweGRlLCAweDAxLCAweDAxLCAweDAxLCAweGZkLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZjLCAweDAwLCAweDA4LCAweDAwLCAweDcwLAotCSAweDAwLCAweDBiLCAweDAwLCAweDlmLCAweDAwLCAweGZjLCAweDAwLCAweDA4LCAweDAwLCAweDcwLCAweDAwLCAweDBiLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3ZjgsIDB4MDdmNCwgMHgwN2YwLCAweDAyMDIsIDB4MDIwMywgMHgwMjA0fSwKLQl7Ci0JIDIyMCwgNTEwMCwgMHhkNiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmZSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmYywgMHgwMCwgMHgwOCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHg5ZiwgMHgwMCwgMHhmYywgMHgwMCwgMHgwOCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2ZjLCAweDA3ZjgsIDB4MDdmNCwgMHgwMjAxLCAweDAyMDIsIDB4MDIwM30sCi0JewotCSAyMjIsIDUxMTAsIDB4ZDYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZmYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4OWYsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MGIsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgwMCwgMHgwN2ZjLCAweDA3ZjgsIDB4MDIwMCwgMHgwMjAxLCAweDAyMDJ9LAotCXsKLQkgMjI0LCA1MTIwLCAweGNlLCAweDAxLCAweDAxLCAweDAyLCAweDAwLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAyLCAweDAyLCAweDAyLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZjLCAweDAwLCAweDA4LCAweDAwLCAweDcwLAotCSAweDAwLCAweDBiLCAweDAwLCAweDlmLCAweDAwLCAweGZjLCAweDAwLCAweDA4LCAweDAwLCAweDcwLCAweDAwLCAweDBiLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4MDQsIDB4MDgwMCwgMHgwN2ZjLCAweDAxZmYsIDB4MDIwMCwgMHgwMjAxfSwKLQl7Ci0JIDIyNiwgNTEzMCwgMHhjZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwMSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmYiwgMHgwMCwgMHgwOCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHg5ZiwgMHgwMCwgMHhmYiwgMHgwMCwgMHgwOCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODA4LCAweDA4MDQsIDB4MDgwMCwgMHgwMWZlLCAweDAxZmYsIDB4MDIwMH0sCi0JewotCSAyMjgsIDUxNDAsIDB4YzYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmIsIDB4MDAsIDB4MDcsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4OWYsIDB4MDAsIDB4ZmIsIDB4MDAsIDB4MDcsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgwYywgMHgwODA4LCAweDA4MDQsIDB4MDFmZCwgMHgwMWZlLCAweDAxZmZ9LAotCXsKLQkgMzIsIDUxNjAsIDB4YmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmIsIDB4MDAsIDB4MDcsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4OWUsIDB4MDAsIDB4ZmIsIDB4MDAsIDB4MDcsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmUsIDB4MDAsIDB4MDgxNCwgMHgwODEwLCAweDA4MGMsIDB4MDFmYiwgMHgwMWZjLCAweDAxZmR9LAotCXsKLQkgMzQsIDUxNzAsIDB4YmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmIsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4OWUsIDB4MDAsIDB4ZmIsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmUsIDB4MDAsIDB4MDgxOCwgMHgwODE0LCAweDA4MTAsIDB4MDFmYSwgMHgwMWZiLCAweDAxZmN9LAotCXsKLQkgMzYsIDUxODAsIDB4YjYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4OWUsIDB4MDAsIDB4ZmEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmUsIDB4MDAsIDB4MDgxYywgMHgwODE4LCAweDA4MTQsIDB4MDFmOSwgMHgwMWZhLCAweDAxZmJ9LAotCXsKLQkgMzgsIDUxOTAsIDB4YjYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDcsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4OWUsIDB4MDAsIDB4ZmEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmUsIDB4MDAsIDB4MDgyMCwgMHgwODFjLCAweDA4MTgsIDB4MDFmOCwgMHgwMWY5LCAweDAxZmF9LAotCXsKLQkgNDAsIDUyMDAsIDB4YWYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDgsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4OWUsIDB4MDAsIDB4ZmEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmUsIDB4MDAsIDB4MDgyNCwgMHgwODIwLCAweDA4MWMsIDB4MDFmNywgMHgwMWY4LCAweDAxZjl9LAotCXsKLQkgNDIsIDUyMTAsIDB4YWYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDksIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4OWUsIDB4MDAsIDB4ZmEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmUsIDB4MDAsIDB4MDgyOCwgMHgwODI0LCAweDA4MjAsIDB4MDFmNiwgMHgwMWY3LCAweDAxZjh9LAotCXsKLQkgNDQsIDUyMjAsIDB4YTcsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4OWUsIDB4MDAsIDB4ZmEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmUsIDB4MDAsIDB4MDgyYywgMHgwODI4LCAweDA4MjQsIDB4MDFmNSwgMHgwMWY2LCAweDAxZjd9LAotCXsKLQkgNDYsIDUyMzAsIDB4YTcsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZWEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDgsIDB4MDAsIDB4OWUsIDB4MDAsIDB4ZWEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDgsCi0JIDB4MDAsIDB4NmUsIDB4MDAsIDB4MDgzMCwgMHgwODJjLCAweDA4MjgsIDB4MDFmNCwgMHgwMWY1LCAweDAxZjZ9LAotCXsKLQkgNDgsIDUyNDAsIDB4YTAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZTksIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDgsIDB4MDAsIDB4OWQsIDB4MDAsIDB4ZTksIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDgsCi0JIDB4MDAsIDB4NmQsIDB4MDAsIDB4MDgzNCwgMHgwODMwLCAweDA4MmMsIDB4MDFmMywgMHgwMWY0LCAweDAxZjV9LAotCXsKLQkgNTAsIDUyNTAsIDB4YTAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZTksIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDgsIDB4MDAsIDB4OWQsIDB4MDAsIDB4ZTksIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDgsCi0JIDB4MDAsIDB4NmQsIDB4MDAsIDB4MDgzOCwgMHgwODM0LCAweDA4MzAsIDB4MDFmMiwgMHgwMWYzLCAweDAxZjR9LAotCXsKLQkgNTIsIDUyNjAsIDB4OTgsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZDksIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDgsIDB4MDAsIDB4OWQsIDB4MDAsIDB4ZDksIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDgsCi0JIDB4MDAsIDB4NmQsIDB4MDAsIDB4MDgzYywgMHgwODM4LCAweDA4MzQsIDB4MDFmMSwgMHgwMWYyLCAweDAxZjN9LAotCXsKLQkgNTQsIDUyNzAsIDB4OTgsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZDgsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4OWMsIDB4MDAsIDB4ZDgsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDcsCi0JIDB4MDAsIDB4NmMsIDB4MDAsIDB4MDg0MCwgMHgwODNjLCAweDA4MzgsIDB4MDFmMCwgMHgwMWYxLCAweDAxZjJ9LAotCXsKLQkgNTYsIDUyODAsIDB4OTEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTAsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4YzgsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4OWMsIDB4MDAsIDB4YzgsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDcsCi0JIDB4MDAsIDB4NmMsIDB4MDAsIDB4MDg0NCwgMHgwODQwLCAweDA4M2MsIDB4MDFmMCwgMHgwMWYwLCAweDAxZjF9LAotCXsKLQkgNTgsIDUyOTAsIDB4OTEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4YzgsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4OWMsIDB4MDAsIDB4YzgsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDcsCi0JIDB4MDAsIDB4NmMsIDB4MDAsIDB4MDg0OCwgMHgwODQ0LCAweDA4NDAsIDB4MDFlZiwgMHgwMWYwLCAweDAxZjB9LAotCXsKLQkgNjAsIDUzMDAsIDB4OGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGUsIDB4MDAsIDB4ZmYsIDB4YzgsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4OWMsIDB4MDAsIDB4YzgsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDcsCi0JIDB4MDAsIDB4NmMsIDB4MDAsIDB4MDg0YywgMHgwODQ4LCAweDA4NDQsIDB4MDFlZSwgMHgwMWVmLCAweDAxZjB9LAotCXsKLQkgNjIsIDUzMTAsIDB4OGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGUsIDB4MDAsIDB4ZmYsIDB4YzgsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4OWMsIDB4MDAsIDB4YzgsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDcsCi0JIDB4MDAsIDB4NmMsIDB4MDAsIDB4MDg1MCwgMHgwODRjLCAweDA4NDgsIDB4MDFlZCwgMHgwMWVlLCAweDAxZWZ9LAotCXsKLQkgNjQsIDUzMjAsIDB4ODMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGUsIDB4MDAsIDB4ZmYsIDB4YjgsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4OWMsIDB4MDAsIDB4YjgsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDcsCi0JIDB4MDAsIDB4NmMsIDB4MDAsIDB4MDg1NCwgMHgwODUwLCAweDA4NGMsIDB4MDFlYywgMHgwMWVkLCAweDAxZWV9LAotCXsKLQkgNjYsIDUzMzAsIDB4ODMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGUsIDB4MDAsIDB4ZmYsIDB4YjcsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4OWIsIDB4MDAsIDB4YjcsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDcsCi0JIDB4MDAsIDB4NmIsIDB4MDAsIDB4MDg1OCwgMHgwODU0LCAweDA4NTAsIDB4MDFlYiwgMHgwMWVjLCAweDAxZWR9LAotCXsKLQkgNjgsIDUzNDAsIDB4N2MsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGUsIDB4MDAsIDB4ZmYsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4OWIsIDB4MDAsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDcsCi0JIDB4MDAsIDB4NmIsIDB4MDAsIDB4MDg1YywgMHgwODU4LCAweDA4NTQsIDB4MDFlYSwgMHgwMWViLCAweDAxZWN9LAotCXsKLQkgNzAsIDUzNTAsIDB4N2MsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTcsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGUsIDB4MDAsIDB4ZmYsIDB4YTcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4OWIsIDB4MDAsIDB4YTcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4NmIsIDB4MDAsIDB4MDg2MCwgMHgwODVjLCAweDA4NTgsIDB4MDFlOSwgMHgwMWVhLCAweDAxZWJ9LAotCXsKLQkgNzIsIDUzNjAsIDB4NzUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTgsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGUsIDB4MDAsIDB4ZmYsIDB4YTYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4OWIsIDB4MDAsIDB4YTYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4NmIsIDB4MDAsIDB4MDg2NCwgMHgwODYwLCAweDA4NWMsIDB4MDFlOCwgMHgwMWU5LCAweDAxZWF9LAotCXsKLQkgNzQsIDUzNzAsIDB4NzUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTksIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGUsIDB4MDAsIDB4ZmYsIDB4YTYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4OWIsIDB4MDAsIDB4YTYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4NWIsIDB4MDAsIDB4MDg2OCwgMHgwODY0LCAweDA4NjAsIDB4MDFlNywgMHgwMWU4LCAweDAxZTl9LAotCXsKLQkgNzYsIDUzODAsIDB4NmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGUsIDB4MDAsIDB4ZmYsIDB4OTYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4OWEsIDB4MDAsIDB4OTYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4NWEsIDB4MDAsIDB4MDg2YywgMHgwODY4LCAweDA4NjQsIDB4MDFlNiwgMHgwMWU3LCAweDAxZTh9LAotCXsKLQkgNzgsIDUzOTAsIDB4NmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGYsIDB4MGUsIDB4MDAsIDB4ZmYsIDB4OTUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4OWEsIDB4MDAsIDB4OTUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4NWEsIDB4MDAsIDB4MDg3MCwgMHgwODZjLCAweDA4NjgsIDB4MDFlNSwgMHgwMWU2LCAweDAxZTd9LAotCXsKLQkgODAsIDU0MDAsIDB4NjcsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGQsIDB4MDAsIDB4YzgsIDB4OTUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4OWEsIDB4MDAsIDB4OTUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4NWEsIDB4MDAsIDB4MDg3NCwgMHgwODcwLCAweDA4NmMsIDB4MDFlNSwgMHgwMWU1LCAweDAxZTZ9LAotCXsKLQkgODIsIDU0MTAsIDB4NjcsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGQsIDB4MDAsIDB4YzgsIDB4OTUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4OWEsIDB4MDAsIDB4OTUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4NWEsIDB4MDAsIDB4MDg3OCwgMHgwODc0LCAweDA4NzAsIDB4MDFlNCwgMHgwMWU1LCAweDAxZTV9LAotCXsKLQkgODQsIDU0MjAsIDB4NjEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGQsIDB4MDAsIDB4YzgsIDB4OTUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4OWEsIDB4MDAsIDB4OTUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4NWEsIDB4MDAsIDB4MDg3YywgMHgwODc4LCAweDA4NzQsIDB4MDFlMywgMHgwMWU0LCAweDAxZTV9LAotCXsKLQkgODYsIDU0MzAsIDB4NjEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGQsIDB4MDAsIDB4YzgsIDB4ODUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4OTksIDB4MDAsIDB4ODUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4NTksIDB4MDAsIDB4MDg4MCwgMHgwODdjLCAweDA4NzgsIDB4MDFlMiwgMHgwMWUzLCAweDAxZTR9LAotCXsKLQkgODgsIDU0NDAsIDB4NWEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjAsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGQsIDB4MGQsIDB4MDAsIDB4YzgsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4OTksIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4NTksIDB4MDAsIDB4MDg4NCwgMHgwODgwLCAweDA4N2MsIDB4MDFlMSwgMHgwMWUyLCAweDAxZTN9LAotCXsKLQkgOTAsIDU0NTAsIDB4NWEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGQsIDB4MGQsIDB4MDAsIDB4YzgsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4OTksIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4NTksIDB4MDAsIDB4MDg4OCwgMHgwODg0LCAweDA4ODAsIDB4MDFlMCwgMHgwMWUxLCAweDAxZTJ9LAotCXsKLQkgOTIsIDU0NjAsIDB4NTMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGQsIDB4MGQsIDB4MDAsIDB4YzgsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDQsIDB4MDAsIDB4OTksIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDQsCi0JIDB4MDAsIDB4NjksIDB4MDAsIDB4MDg4YywgMHgwODg4LCAweDA4ODQsIDB4MDFkZiwgMHgwMWUwLCAweDAxZTF9LAotCXsKLQkgOTQsIDU0NzAsIDB4NTMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGQsIDB4MGQsIDB4MDAsIDB4YzgsIDB4NzQsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDQsIDB4MDAsIDB4OTksIDB4MDAsIDB4NzQsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDQsCi0JIDB4MDAsIDB4NjksIDB4MDAsIDB4MDg5MCwgMHgwODhjLCAweDA4ODgsIDB4MDFkZSwgMHgwMWRmLCAweDAxZTB9LAotCXsKLQkgOTYsIDU0ODAsIDB4NGQsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGQsIDB4MGQsIDB4MDAsIDB4YzgsIDB4NzMsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDQsIDB4MDAsIDB4OTgsIDB4MDAsIDB4NzMsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDQsCi0JIDB4MDAsIDB4NjgsIDB4MDAsIDB4MDg5NCwgMHgwODkwLCAweDA4OGMsIDB4MDFkZCwgMHgwMWRlLCAweDAxZGZ9LAotCXsKLQkgOTgsIDU0OTAsIDB4NGQsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGQsIDB4MGQsIDB4MDAsIDB4YzgsIDB4NzMsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDQsIDB4MDAsIDB4OTgsIDB4MDAsIDB4NzMsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDQsCi0JIDB4MDAsIDB4NjgsIDB4MDAsIDB4MDg5OCwgMHgwODk0LCAweDA4OTAsIDB4MDFkZCwgMHgwMWRkLCAweDAxZGV9LAotCXsKLQkgMTAwLCA1NTAwLCAweDQ3LCAweDAxLCAweDAxLCAweDAyLCAweDI2LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhkLCAweDBiLCAweDAwLCAweDg0LCAweDczLCAweDAwLCAweDAxLCAweDAwLCAweDcwLAotCSAweDAwLCAweDA0LCAweDAwLCAweDk4LCAweDAwLCAweDczLCAweDAwLCAweDAxLCAweDAwLCAweDcwLCAweDAwLCAweDA0LAotCSAweDAwLCAweDc4LCAweDAwLCAweDA4OWMsIDB4MDg5OCwgMHgwODk0LCAweDAxZGMsIDB4MDFkZCwgMHgwMWRkfSwKLQl7Ci0JIDEwMiwgNTUxMCwgMHg0NywgMHgwMSwgMHgwMSwgMHgwMiwgMHgyNywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4ZCwgMHgwYiwgMHgwMCwgMHg4NCwgMHg3MywgMHgwMCwgMHgwMSwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNCwgMHgwMCwgMHg5OCwgMHgwMCwgMHg3MywgMHgwMCwgMHgwMSwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNCwKLQkgMHgwMCwgMHg3OCwgMHgwMCwgMHgwOGEwLCAweDA4OWMsIDB4MDg5OCwgMHgwMWRiLCAweDAxZGMsIDB4MDFkZH0sCi0JewotCSAxMDQsIDU1MjAsIDB4NDAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjgsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGQsIDB4MGIsIDB4MDAsIDB4ODQsIDB4NzMsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDQsIDB4MDAsIDB4OTgsIDB4MDAsIDB4NzMsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDQsCi0JIDB4MDAsIDB4NzgsIDB4MDAsIDB4MDhhNCwgMHgwOGEwLCAweDA4OWMsIDB4MDFkYSwgMHgwMWRiLCAweDAxZGN9LAotCXsKLQkgMTA2LCA1NTMwLCAweDQwLCAweDAxLCAweDAxLCAweDAyLCAweDI5LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhkLCAweDBiLCAweDAwLCAweDg0LCAweDYzLCAweDAwLCAweDAxLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAzLCAweDAwLCAweDk4LCAweDAwLCAweDYzLCAweDAwLCAweDAxLCAweDAwLCAweDcwLCAweDAwLCAweDAzLAotCSAweDAwLCAweDc4LCAweDAwLCAweDA4YTgsIDB4MDhhNCwgMHgwOGEwLCAweDAxZDksIDB4MDFkYSwgMHgwMWRifSwKLQl7Ci0JIDEwOCwgNTU0MCwgMHgzYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyYSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4ZCwgMHgwYiwgMHgwMCwgMHg4NCwgMHg2MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMywgMHgwMCwgMHg5NywgMHgwMCwgMHg2MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMywKLQkgMHgwMCwgMHg3NywgMHgwMCwgMHgwOGFjLCAweDA4YTgsIDB4MDhhNCwgMHgwMWQ4LCAweDAxZDksIDB4MDFkYX0sCi0JewotCSAxMTAsIDU1NTAsIDB4M2EsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MmIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGQsIDB4MGIsIDB4MDAsIDB4ODQsIDB4NjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDMsIDB4MDAsIDB4OTcsIDB4MDAsIDB4NjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDMsCi0JIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDhiMCwgMHgwOGFjLCAweDA4YTgsIDB4MDFkNywgMHgwMWQ4LCAweDAxZDl9LAotCXsKLQkgMTEyLCA1NTYwLCAweDM0LCAweDAxLCAweDAxLCAweDAyLCAweDJjLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhkLCAweDBiLCAweDAwLCAweDg0LCAweDYyLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAzLCAweDAwLCAweDk3LCAweDAwLCAweDYyLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAzLAotCSAweDAwLCAweDc3LCAweDAwLCAweDA4YjQsIDB4MDhiMCwgMHgwOGFjLCAweDAxZDcsIDB4MDFkNywgMHgwMWQ4fSwKLQl7Ci0JIDExNCwgNTU3MCwgMHgzNCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyZCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4ZCwgMHgwYiwgMHgwMCwgMHg4NCwgMHg1MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg1MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMiwKLQkgMHgwMCwgMHg3NiwgMHgwMCwgMHgwOGI4LCAweDA4YjQsIDB4MDhiMCwgMHgwMWQ2LCAweDAxZDcsIDB4MDFkN30sCi0JewotCSAxMTYsIDU1ODAsIDB4MmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MmUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGQsIDB4MGIsIDB4MDAsIDB4ODQsIDB4NTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDIsIDB4MDAsIDB4OTYsIDB4MDAsIDB4NTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDIsCi0JIDB4MDAsIDB4NzYsIDB4MDAsIDB4MDhiYywgMHgwOGI4LCAweDA4YjQsIDB4MDFkNSwgMHgwMWQ2LCAweDAxZDd9LAotCXsKLQkgMTE4LCA1NTkwLCAweDJlLCAweDAxLCAweDAxLCAweDAyLCAweDJmLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhkLCAweDBiLCAweDAwLCAweDg0LCAweDUxLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAyLCAweDAwLCAweDk2LCAweDAwLCAweDUxLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAyLAotCSAweDAwLCAweDc2LCAweDAwLCAweDA4YzAsIDB4MDhiYywgMHgwOGI4LCAweDAxZDQsIDB4MDFkNSwgMHgwMWQ2fSwKLQl7Ci0JIDEyMCwgNTYwMCwgMHgyOCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzMCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YiwgMHgwOSwgMHgwMCwgMHg3MCwgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMiwKLQkgMHgwMCwgMHg3NiwgMHgwMCwgMHgwOGM0LCAweDA4YzAsIDB4MDhiYywgMHgwMWQzLCAweDAxZDQsIDB4MDFkNX0sCi0JewotCSAxMjIsIDU2MTAsIDB4MjgsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGIsIDB4MDksIDB4MDAsIDB4NzAsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDIsIDB4MDAsIDB4OTYsIDB4MDAsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDIsCi0JIDB4MDAsIDB4NzYsIDB4MDAsIDB4MDhjOCwgMHgwOGM0LCAweDA4YzAsIDB4MDFkMiwgMHgwMWQzLCAweDAxZDR9LAotCXsKLQkgMTI0LCA1NjIwLCAweDIxLCAweDAxLCAweDAxLCAweDAyLCAweDMyLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhiLCAweDA5LCAweDAwLCAweDcwLCAweDUxLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAyLCAweDAwLCAweDk2LCAweDAwLCAweDUxLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAyLAotCSAweDAwLCAweDc2LCAweDAwLCAweDA4Y2MsIDB4MDhjOCwgMHgwOGM0LCAweDAxZDIsIDB4MDFkMiwgMHgwMWQzfSwKLQl7Ci0JIDEyNiwgNTYzMCwgMHgyMSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzMywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YiwgMHgwOSwgMHgwMCwgMHg3MCwgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMiwKLQkgMHgwMCwgMHg3NiwgMHgwMCwgMHgwOGQwLCAweDA4Y2MsIDB4MDhjOCwgMHgwMWQxLCAweDAxZDIsIDB4MDFkMn0sCi0JewotCSAxMjgsIDU2NDAsIDB4MWMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGIsIDB4MDksIDB4MDAsIDB4NzAsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDIsIDB4MDAsIDB4OTUsIDB4MDAsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDIsCi0JIDB4MDAsIDB4NzUsIDB4MDAsIDB4MDhkNCwgMHgwOGQwLCAweDA4Y2MsIDB4MDFkMCwgMHgwMWQxLCAweDAxZDJ9LAotCXsKLQkgMTMwLCA1NjUwLCAweDFjLCAweDAxLCAweDAxLCAweDAyLCAweDM1LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhiLCAweDA5LCAweDAwLCAweDcwLCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAxLCAweDAwLCAweDk1LCAweDAwLCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAxLAotCSAweDAwLCAweDc1LCAweDAwLCAweDA4ZDgsIDB4MDhkNCwgMHgwOGQwLCAweDAxY2YsIDB4MDFkMCwgMHgwMWQxfSwKLQl7Ci0JIDEzMiwgNTY2MCwgMHgxNiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzNiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YiwgMHgwOSwgMHgwMCwgMHg3MCwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMSwgMHgwMCwgMHg5NSwgMHgwMCwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMSwKLQkgMHgwMCwgMHg3NSwgMHgwMCwgMHgwOGRjLCAweDA4ZDgsIDB4MDhkNCwgMHgwMWNlLCAweDAxY2YsIDB4MDFkMH0sCi0JewotCSAxMzQsIDU2NzAsIDB4MTYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzcsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGIsIDB4MDksIDB4MDAsIDB4NzAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDEsIDB4MDAsIDB4OTQsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDEsCi0JIDB4MDAsIDB4NzQsIDB4MDAsIDB4MDhlMCwgMHgwOGRjLCAweDA4ZDgsIDB4MDFjZSwgMHgwMWNlLCAweDAxY2Z9LAotCXsKLQkgMTM2LCA1NjgwLCAweDEwLCAweDAxLCAweDAxLCAweDAyLCAweDM4LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhiLCAweDA5LCAweDAwLCAweDcwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAxLCAweDAwLCAweDk0LCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAxLAotCSAweDAwLCAweDc0LCAweDAwLCAweDA4ZTQsIDB4MDhlMCwgMHgwOGRjLCAweDAxY2QsIDB4MDFjZSwgMHgwMWNlfSwKLQl7Ci0JIDEzOCwgNTY5MCwgMHgxMCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzOSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YiwgMHgwOSwgMHgwMCwgMHg3MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMSwgMHgwMCwgMHg5NCwgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMSwKLQkgMHgwMCwgMHg3NCwgMHgwMCwgMHgwOGU4LCAweDA4ZTQsIDB4MDhlMCwgMHgwMWNjLCAweDAxY2QsIDB4MDFjZX0sCi0JewotCSAxNDAsIDU3MDAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4M2EsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGEsIDB4MDYsIDB4MDAsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDEsIDB4MDAsIDB4OTQsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDEsCi0JIDB4MDAsIDB4NzQsIDB4MDAsIDB4MDhlYywgMHgwOGU4LCAweDA4ZTQsIDB4MDFjYiwgMHgwMWNjLCAweDAxY2R9LAotCXsKLQkgMTQyLCA1NzEwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDNiLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhhLCAweDA2LCAweDAwLCAweDQwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAxLCAweDAwLCAweDk0LCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAxLAotCSAweDAwLCAweDc0LCAweDAwLCAweDA4ZjAsIDB4MDhlYywgMHgwOGU4LCAweDAxY2EsIDB4MDFjYiwgMHgwMWNjfSwKLQl7Ci0JIDE0NCwgNTcyMCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzYywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YSwgMHgwNiwgMHgwMCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMSwgMHgwMCwgMHg5NCwgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMSwKLQkgMHgwMCwgMHg3NCwgMHgwMCwgMHgwOGY0LCAweDA4ZjAsIDB4MDhlYywgMHgwMWM5LCAweDAxY2EsIDB4MDFjYn0sCi0JewotCSAxNDUsIDU3MjUsIDB4MDMsIDB4MDEsIDB4MDIsIDB4MDQsIDB4NzksIDB4MDcsIDB4MDcsIDB4MDQsIDB4MTAsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGEsIDB4MDYsIDB4MDAsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDEsIDB4MDAsIDB4OTQsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDEsCi0JIDB4MDAsIDB4NzQsIDB4MDAsIDB4MDhmNiwgMHgwOGYyLCAweDA4ZWUsIDB4MDFjOSwgMHgwMWNhLCAweDAxY2J9LAotCXsKLQkgMTQ2LCA1NzMwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDNkLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhhLCAweDA2LCAweDAwLCAweDQwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAxLCAweDAwLCAweDk0LCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAxLAotCSAweDAwLCAweDg0LCAweDAwLCAweDA4ZjgsIDB4MDhmNCwgMHgwOGYwLCAweDAxYzksIDB4MDFjOSwgMHgwMWNhfSwKLQl7Ci0JIDE0NywgNTczNSwgMHgwMywgMHgwMSwgMHgwMiwgMHgwNCwgMHg3YiwgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YSwgMHgwNiwgMHgwMCwgMHg0MCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg4MywgMHgwMCwgMHgwOGZhLCAweDA4ZjYsIDB4MDhmMiwgMHgwMWM4LCAweDAxYzksIDB4MDFjYX0sCi0JewotCSAxNDgsIDU3NDAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4M2UsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGEsIDB4MDYsIDB4MDAsIDB4NDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4ODMsIDB4MDAsIDB4MDhmYywgMHgwOGY4LCAweDA4ZjQsIDB4MDFjOCwgMHgwMWM5LCAweDAxYzl9LAotCXsKLQkgMTQ5LCA1NzQ1LCAweGZlLCAweDAwLCAweDAyLCAweDA0LCAweDdkLCAweDA3LCAweDA3LCAweDA0LCAweDEwLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhhLCAweDA2LCAweDAwLCAweDQwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDgzLCAweDAwLCAweDA4ZmUsIDB4MDhmYSwgMHgwOGY2LCAweDAxYzgsIDB4MDFjOCwgMHgwMWM5fSwKLQl7Ci0JIDE1MCwgNTc1MCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzZiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YSwgMHgwNiwgMHgwMCwgMHg0MCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg4MywgMHgwMCwgMHgwOTAwLCAweDA4ZmMsIDB4MDhmOCwgMHgwMWM3LCAweDAxYzgsIDB4MDFjOX0sCi0JewotCSAxNTEsIDU3NTUsIDB4ZmUsIDB4MDAsIDB4MDIsIDB4MDQsIDB4N2YsIDB4MDcsIDB4MDcsIDB4MDQsIDB4MTAsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGEsIDB4MDYsIDB4MDAsIDB4NDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4ODMsIDB4MDAsIDB4MDkwMiwgMHgwOGZlLCAweDA4ZmEsIDB4MDFjNywgMHgwMWM4LCAweDAxYzh9LAotCXsKLQkgMTUyLCA1NzYwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQwLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhhLCAweDA2LCAweDAwLCAweDQwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweDAwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDgzLCAweDAwLCAweDA5MDQsIDB4MDkwMCwgMHgwOGZjLCAweDAxYzYsIDB4MDFjNywgMHgwMWM4fSwKLQl7Ci0JIDE1MywgNTc2NSwgMHhmOCwgMHgwMCwgMHgwMiwgMHgwNCwgMHg4MSwgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YSwgMHgwNiwgMHgwMCwgMHg0MCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg4MiwgMHgwMCwgMHgwOTA2LCAweDA5MDIsIDB4MDhmZSwgMHgwMWM2LCAweDAxYzcsIDB4MDFjOH0sCi0JewotCSAxNTQsIDU3NzAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGEsIDB4MDYsIDB4MDAsIDB4NDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4ODIsIDB4MDAsIDB4MDkwOCwgMHgwOTA0LCAweDA5MDAsIDB4MDFjNiwgMHgwMWM2LCAweDAxYzd9LAotCXsKLQkgMTU1LCA1Nzc1LCAweGY4LCAweDAwLCAweDAyLCAweDA0LCAweDgzLCAweDA3LCAweDA3LCAweDA0LCAweDEwLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhhLCAweDA2LCAweDAwLCAweDQwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDAwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDgyLCAweDAwLCAweDA5MGEsIDB4MDkwNiwgMHgwOTAyLCAweDAxYzUsIDB4MDFjNiwgMHgwMWM3fSwKLQl7Ci0JIDE1NiwgNTc4MCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHg0MiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4YSwgMHgwNiwgMHgwMCwgMHg0MCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg4MiwgMHgwMCwgMHgwOTBjLCAweDA5MDgsIDB4MDkwNCwgMHgwMWM1LCAweDAxYzYsIDB4MDFjNn0sCi0JewotCSAxNTcsIDU3ODUsIDB4ZjIsIDB4MDAsIDB4MDIsIDB4MDQsIDB4ODUsIDB4MDcsIDB4MDcsIDB4MDQsIDB4MTAsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4OGEsIDB4MDYsIDB4MDAsIDB4NDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4ODIsIDB4MDAsIDB4MDkwZSwgMHgwOTBhLCAweDA5MDYsIDB4MDFjNCwgMHgwMWM1LCAweDAxYzZ9LAotCXsKLQkgMTU4LCA1NzkwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQzLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDhhLCAweDA2LCAweDAwLCAweDQwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDgyLCAweDAwLCAweDA5MTAsIDB4MDkwYywgMHgwOTA4LCAweDAxYzQsIDB4MDFjNSwgMHgwMWM2fSwKLQl7Ci0JIDE1OSwgNTc5NSwgMHhmMiwgMHgwMCwgMHgwMiwgMHgwNCwgMHg4NywgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4YSwgMHgwNiwgMHgwMCwgMHg0MCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg4MiwgMHgwMCwgMHgwOTEyLCAweDA5MGUsIDB4MDkwYSwgMHgwMWM0LCAweDAxYzQsIDB4MDFjNX0sCi0JewotCSAxNjAsIDU4MDAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODgsIDB4MDQsIDB4MDAsIDB4MjAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4ODIsIDB4MDAsIDB4MDkxNCwgMHgwOTEwLCAweDA5MGMsIDB4MDFjMywgMHgwMWM0LCAweDAxYzV9LAotCXsKLQkgMTYxLCA1ODA1LCAweGVkLCAweDAwLCAweDAyLCAweDA0LCAweDg5LCAweDA3LCAweDA3LCAweDA0LCAweDEwLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg4LCAweDA0LCAweDAwLCAweDIwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDgyLCAweDAwLCAweDA5MTYsIDB4MDkxMiwgMHgwOTBlLCAweDAxYzMsIDB4MDFjNCwgMHgwMWM0fSwKLQl7Ci0JIDE2MiwgNTgxMCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHg0NSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4OCwgMHgwNCwgMHgwMCwgMHgyMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg4MiwgMHgwMCwgMHgwOTE4LCAweDA5MTQsIDB4MDkxMCwgMHgwMWMyLCAweDAxYzMsIDB4MDFjNH0sCi0JewotCSAxNjMsIDU4MTUsIDB4ZWQsIDB4MDAsIDB4MDIsIDB4MDQsIDB4OGIsIDB4MDcsIDB4MDcsIDB4MDQsIDB4MTAsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODgsIDB4MDQsIDB4MDAsIDB4MjAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4ODIsIDB4MDAsIDB4MDkxYSwgMHgwOTE2LCAweDA5MTIsIDB4MDFjMiwgMHgwMWMzLCAweDAxYzR9LAotCXsKLQkgMTY0LCA1ODIwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQ2LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg4LCAweDA0LCAweDAwLCAweDIwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDgyLCAweDAwLCAweDA5MWMsIDB4MDkxOCwgMHgwOTE0LCAweDAxYzIsIDB4MDFjMiwgMHgwMWMzfSwKLQl7Ci0JIDE2NSwgNTgyNSwgMHhlZCwgMHgwMCwgMHgwMiwgMHgwNCwgMHg4ZCwgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4OCwgMHgwNCwgMHgwMCwgMHgyMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg4MiwgMHgwMCwgMHgwOTFlLCAweDA5MWEsIDB4MDkxNiwgMHgwMWMxLCAweDAxYzIsIDB4MDFjM30sCi0JewotCSAxNjYsIDU4MzAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDcsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODgsIDB4MDQsIDB4MDAsIDB4MjAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4NzIsIDB4MDAsIDB4MDkyMCwgMHgwOTFjLCAweDA5MTgsIDB4MDFjMSwgMHgwMWMyLCAweDAxYzJ9LAotCXsKLQkgMTY4LCA1ODQwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQ4LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg4LCAweDA0LCAweDAwLCAweDIwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDcyLCAweDAwLCAweDA5MjQsIDB4MDkyMCwgMHgwOTFjLCAweDAxYzAsIDB4MDFjMSwgMHgwMWMyfSwKLQl7Ci0JIDE3MCwgNTg1MCwgMHhlMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHg0OSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4OCwgMHgwNCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg3MiwgMHgwMCwgMHgwOTI4LCAweDA5MjQsIDB4MDkyMCwgMHgwMWJmLCAweDAxYzAsIDB4MDFjMX0sCi0JewotCSAxNzIsIDU4NjAsIDB4ZGUsIDB4MDAsIDB4MDEsIDB4MDIsIDB4NGEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODgsIDB4MDQsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4NzIsIDB4MDAsIDB4MDkyYywgMHgwOTI4LCAweDA5MjQsIDB4MDFiZiwgMHgwMWJmLCAweDAxYzB9LAotCXsKLQkgMTc0LCA1ODcwLCAweGRiLCAweDAwLCAweDAxLCAweDAyLCAweDRiLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg4LCAweDA0LCAweDAwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDcxLCAweDAwLCAweDA5MzAsIDB4MDkyYywgMHgwOTI4LCAweDAxYmUsIDB4MDFiZiwgMHgwMWJmfSwKLQl7Ci0JIDE3NiwgNTg4MCwgMHhkOCwgMHgwMCwgMHgwMSwgMHgwMiwgMHg0YywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4OCwgMHgwNCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg3MSwgMHgwMCwgMHgwOTM0LCAweDA5MzAsIDB4MDkyYywgMHgwMWJkLCAweDAxYmUsIDB4MDFiZn0sCi0JewotCSAxNzgsIDU4OTAsIDB4ZDYsIDB4MDAsIDB4MDEsIDB4MDIsIDB4NGQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODgsIDB4MDQsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4NzEsIDB4MDAsIDB4MDkzOCwgMHgwOTM0LCAweDA5MzAsIDB4MDFiYywgMHgwMWJkLCAweDAxYmV9LAotCXsKLQkgMTgwLCA1OTAwLCAweGQzLCAweDAwLCAweDAxLCAweDAyLCAweDRlLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg3LCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDcxLCAweDAwLCAweDA5M2MsIDB4MDkzOCwgMHgwOTM0LCAweDAxYmMsIDB4MDFiYywgMHgwMWJkfSwKLQl7Ci0JIDE4MiwgNTkxMCwgMHhkNiwgMHgwMCwgMHgwMSwgMHgwMiwgMHg0ZiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NywgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg3MSwgMHgwMCwgMHgwOTQwLCAweDA5M2MsIDB4MDkzOCwgMHgwMWJiLCAweDAxYmMsIDB4MDFiY30sCi0JewotCSAxLCAyNDEyLCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDZjLCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDFmLCAweDAwLCAweDAzLCAweDAwLAotCSAweDcwLCAweDAwLCAweDBmLCAweDAwLCAweDBiLCAweDAwLCAweDFmLCAweDAwLCAweDAzLCAweDAwLCAweDcwLCAweDAwLAotCSAweDBmLCAweDAwLCAweDBiLCAweDAzYzksIDB4MDNjNSwgMHgwM2MxLCAweDA0M2EsIDB4MDQzZiwgMHgwNDQzfSwKLQl7Ci0JIDIsIDI0MTcsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4NzEsIDB4MDgsIDB4MDgsIDB4MDQsIDB4MTYsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MWYsIDB4MDAsIDB4MDMsIDB4MDAsCi0JIDB4NzAsIDB4MDAsIDB4MGYsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MWYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsIDB4MDAsCi0JIDB4MGYsIDB4MDAsIDB4MGEsIDB4MDNjYiwgMHgwM2M3LCAweDAzYzMsIDB4MDQzOCwgMHgwNDNkLCAweDA0NDF9LAotCXsKLQkgMywgMjQyMiwgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg3NiwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwZSwgMHgwMCwgMHgwMywgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwZiwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwZSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwZiwgMHgwMCwgMHgwYSwgMHgwM2NkLCAweDAzYzksIDB4MDNjNSwgMHgwNDM2LCAweDA0M2EsIDB4MDQzZn0sCi0JewotCSA0LCAyNDI3LCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDdiLCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDBkLCAweDAwLCAweDAzLCAweDAwLAotCSAweDcwLCAweDAwLCAweDBlLCAweDAwLCAweDBhLCAweDAwLCAweDBkLCAweDAwLCAweDAzLCAweDAwLCAweDcwLCAweDAwLAotCSAweDBlLCAweDAwLCAweDBhLCAweDAzY2YsIDB4MDNjYiwgMHgwM2M3LCAweDA0MzQsIDB4MDQzOCwgMHgwNDNkfSwKLQl7Ci0JIDUsIDI0MzIsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4ODAsIDB4MDgsIDB4MDgsIDB4MDQsIDB4MTYsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDMsIDB4MDAsCi0JIDB4NzAsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsIDB4MDAsCi0JIDB4MGUsIDB4MDAsIDB4MGEsIDB4MDNkMSwgMHgwM2NkLCAweDAzYzksIDB4MDQzMSwgMHgwNDM2LCAweDA0M2F9LAotCXsKLQkgNiwgMjQzNywgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg4NSwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYiwgMHgwMCwgMHgwMywgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwZSwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwYiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwZSwgMHgwMCwgMHgwYSwgMHgwM2QzLCAweDAzY2YsIDB4MDNjYiwgMHgwNDJmLCAweDA0MzQsIDB4MDQzOH0sCi0JewotCSA3LCAyNDQyLCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDhhLCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDA5LCAweDAwLCAweDAzLCAweDAwLAotCSAweDcwLCAweDAwLCAweDBlLCAweDAwLCAweDBhLCAweDAwLCAweDA5LCAweDAwLCAweDAzLCAweDAwLCAweDcwLCAweDAwLAotCSAweDBlLCAweDAwLCAweDBhLCAweDAzZDUsIDB4MDNkMSwgMHgwM2NkLCAweDA0MmQsIDB4MDQzMSwgMHgwNDM2fSwKLQl7Ci0JIDgsIDI0NDcsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4OGYsIDB4MDgsIDB4MDgsIDB4MDQsIDB4MTYsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4OGYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDIsIDB4MDAsCi0JIDB4NzAsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MDksIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzAsIDB4MDAsCi0JIDB4MGUsIDB4MDAsIDB4MDksIDB4MDNkNywgMHgwM2QzLCAweDAzY2YsIDB4MDQyYiwgMHgwNDJmLCAweDA0MzR9LAotCXsKLQkgOSwgMjQ1MiwgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg5NCwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMiwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwZSwgMHgwMCwgMHgwOSwgMHgwM2Q5LCAweDAzZDUsIDB4MDNkMSwgMHgwNDI5LCAweDA0MmQsIDB4MDQzMX0sCi0JewotCSAxMCwgMjQ1NywgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg5OSwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMiwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwZCwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwZCwgMHgwMCwgMHgwOSwgMHgwM2RiLCAweDAzZDcsIDB4MDNkMywgMHgwNDI3LCAweDA0MmIsIDB4MDQyZn0sCi0JewotCSAxMSwgMjQ2MiwgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg5ZSwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMiwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwZCwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwZCwgMHgwMCwgMHgwOSwgMHgwM2RkLCAweDAzZDksIDB4MDNkNSwgMHgwNDI0LCAweDA0MjksIDB4MDQyZH0sCi0JewotCSAxMiwgMjQ2NywgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHhhMywgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMiwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwZCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwZCwgMHgwMCwgMHgwOCwgMHgwM2RmLCAweDAzZGIsIDB4MDNkNywgMHgwNDIyLCAweDA0MjcsIDB4MDQyYn0sCi0JewotCSAxMywgMjQ3MiwgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHhhOCwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNywgMHgwNywgMHgwNywgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMiwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwZCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwZCwgMHgwMCwgMHgwOCwgMHgwM2UxLCAweDAzZGQsIDB4MDNkOSwgMHgwNDIwLCAweDA0MjQsIDB4MDQyOX0sCi0JewotCSAxNCwgMjQ4NCwgMHhmZiwgMHgwMSwgMHgwMywgMHgwOSwgMHhiNCwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNywgMHgwNywgMHgwNywgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwZCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwZCwgMHgwMCwgMHgwOCwgMHgwM2U2LCAweDAzZTIsIDB4MDNkZSwgMHgwNDFiLCAweDA0MWYsIDB4MDQyNH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2hhbl9pbmZvX25waHlfcmFkaW8yMDV4IGNoYW5faW5mb19ucGh5cmV2Nl8yMDU2djZbXSA9IHsKLQl7Ci0JIDE4NCwgNDkyMCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhlYywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2I0LCAweDA3YjAsIDB4MDdhYywgMHgwMjE0LCAweDAyMTUsIDB4MDIxNn0sCi0JewotCSAxODYsIDQ5MzAsIDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZWQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdiOCwgMHgwN2I0LCAweDA3YjAsIDB4MDIxMywgMHgwMjE0LCAweDAyMTV9LAotCXsKLQkgMTg4LCA0OTQwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGVlLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAwLCAweDAwLCAweDAwLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAotCSAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3YmMsIDB4MDdiOCwgMHgwN2I0LCAweDAyMTIsIDB4MDIxMywgMHgwMjE0fSwKLQl7Ci0JIDE5MCwgNDk1MCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhlZiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2MwLCAweDA3YmMsIDB4MDdiOCwgMHgwMjExLCAweDAyMTIsIDB4MDIxM30sCi0JewotCSAxOTIsIDQ5NjAsIDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdjNCwgMHgwN2MwLCAweDA3YmMsIDB4MDIwZiwgMHgwMjExLCAweDAyMTJ9LAotCXsKLQkgMTk0LCA0OTcwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGYxLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAotCSAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3YzgsIDB4MDdjNCwgMHgwN2MwLCAweDAyMGUsIDB4MDIwZiwgMHgwMjExfSwKLQl7Ci0JIDE5NiwgNDk4MCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmMiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2NjLCAweDA3YzgsIDB4MDdjNCwgMHgwMjBkLCAweDAyMGUsIDB4MDIwZn0sCi0JewotCSAxOTgsIDQ5OTAsIDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdkMCwgMHgwN2NjLCAweDA3YzgsIDB4MDIwYywgMHgwMjBkLCAweDAyMGV9LAotCXsKLQkgMjAwLCA1MDAwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGY0LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAotCSAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3ZDQsIDB4MDdkMCwgMHgwN2NjLCAweDAyMGIsIDB4MDIwYywgMHgwMjBkfSwKLQl7Ci0JIDIwMiwgNTAxMCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmNSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2Q4LCAweDA3ZDQsIDB4MDdkMCwgMHgwMjBhLCAweDAyMGIsIDB4MDIwY30sCi0JewotCSAyMDQsIDUwMjAsIDB4ZjcsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdkYywgMHgwN2Q4LCAweDA3ZDQsIDB4MDIwOSwgMHgwMjBhLCAweDAyMGJ9LAotCXsKLQkgMjA2LCA1MDMwLCAweGY3LCAweDAxLCAweDAxLCAweDAxLCAweGY3LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAotCSAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3ZTAsIDB4MDdkYywgMHgwN2Q4LCAweDAyMDgsIDB4MDIwOSwgMHgwMjBhfSwKLQl7Ci0JIDIwOCwgNTA0MCwgMHhlZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmOCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2U0LCAweDA3ZTAsIDB4MDdkYywgMHgwMjA3LCAweDAyMDgsIDB4MDIwOX0sCi0JewotCSAyMTAsIDUwNTAsIDB4ZWYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjksIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdlOCwgMHgwN2U0LCAweDA3ZTAsIDB4MDIwNiwgMHgwMjA3LCAweDAyMDh9LAotCXsKLQkgMjEyLCA1MDYwLCAweGU2LCAweDAxLCAweDAxLCAweDAxLCAweGZhLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAotCSAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3ZWMsIDB4MDdlOCwgMHgwN2U0LCAweDAyMDUsIDB4MDIwNiwgMHgwMjA3fSwKLQl7Ci0JIDIxNCwgNTA3MCwgMHhlNiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmYiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZCwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZCwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2YwLCAweDA3ZWMsIDB4MDdlOCwgMHgwMjA0LCAweDAyMDUsIDB4MDIwNn0sCi0JewotCSAyMTYsIDUwODAsIDB4ZGUsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZmMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmQsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmQsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdmNCwgMHgwN2YwLCAweDA3ZWMsIDB4MDIwMywgMHgwMjA0LCAweDAyMDV9LAotCXsKLQkgMjE4LCA1MDkwLCAweGRlLCAweDAxLCAweDAxLCAweDAxLCAweGZkLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZkLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAotCSAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwLCAweGZkLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3ZjgsIDB4MDdmNCwgMHgwN2YwLCAweDAyMDIsIDB4MDIwMywgMHgwMjA0fSwKLQl7Ci0JIDIyMCwgNTEwMCwgMHhkNiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmZSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZCwgMHgwMCwgMHgwOCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZCwgMHgwMCwgMHgwOCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2ZjLCAweDA3ZjgsIDB4MDdmNCwgMHgwMjAxLCAweDAyMDIsIDB4MDIwM30sCi0JewotCSAyMjIsIDUxMTAsIDB4ZDYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZmYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgwMCwgMHgwN2ZjLCAweDA3ZjgsIDB4MDIwMCwgMHgwMjAxLCAweDAyMDJ9LAotCXsKLQkgMjI0LCA1MTIwLCAweGNlLCAweDAxLCAweDAxLCAweDAyLCAweDAwLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAyLCAweDAyLCAweDAyLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZjLCAweDAwLCAweDA4LCAweDAwLCAweDc3LAotCSAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwLCAweGZjLCAweDAwLCAweDA4LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4MDQsIDB4MDgwMCwgMHgwN2ZjLCAweDAxZmYsIDB4MDIwMCwgMHgwMjAxfSwKLQl7Ci0JIDIyNiwgNTEzMCwgMHhjZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwMSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmYywgMHgwMCwgMHgwOCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmYywgMHgwMCwgMHgwOCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODA4LCAweDA4MDQsIDB4MDgwMCwgMHgwMWZlLCAweDAxZmYsIDB4MDIwMH0sCi0JewotCSAyMjgsIDUxNDAsIDB4YzYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmIsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmIsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgwYywgMHgwODA4LCAweDA4MDQsIDB4MDFmZCwgMHgwMWZlLCAweDAxZmZ9LAotCXsKLQkgMzIsIDUxNjAsIDB4YmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGUsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGUsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgxNCwgMHgwODEwLCAweDA4MGMsIDB4MDFmYiwgMHgwMWZjLCAweDAxZmR9LAotCXsKLQkgMzQsIDUxNzAsIDB4YmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGUsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGUsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgxOCwgMHgwODE0LCAweDA4MTAsIDB4MDFmYSwgMHgwMWZiLCAweDAxZmN9LAotCXsKLQkgMzYsIDUxODAsIDB4YjYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZjksIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGUsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZjksIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGUsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgxYywgMHgwODE4LCAweDA4MTQsIDB4MDFmOSwgMHgwMWZhLCAweDAxZmJ9LAotCXsKLQkgMzgsIDUxOTAsIDB4YjYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDcsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZjksIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZjksIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgyMCwgMHgwODFjLCAweDA4MTgsIDB4MDFmOCwgMHgwMWY5LCAweDAxZmF9LAotCXsKLQkgNDAsIDUyMDAsIDB4YWYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDgsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZjksIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZjksIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgyNCwgMHgwODIwLCAweDA4MWMsIDB4MDFmNywgMHgwMWY4LCAweDAxZjl9LAotCXsKLQkgNDIsIDUyMTAsIDB4YWYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDksIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZjksIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZjksIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgyOCwgMHgwODI0LCAweDA4MjAsIDB4MDFmNiwgMHgwMWY3LCAweDAxZjh9LAotCXsKLQkgNDQsIDUyMjAsIDB4YTcsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGUsIDB4MGYsIDB4MDAsIDB4ZmUsIDB4ZDgsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZDgsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgyYywgMHgwODI4LCAweDA4MjQsIDB4MDFmNSwgMHgwMWY2LCAweDAxZjd9LAotCXsKLQkgNDYsIDUyMzAsIDB4YTcsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGUsIDB4MGYsIDB4MDAsIDB4ZWUsIDB4ZDgsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZDgsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgzMCwgMHgwODJjLCAweDA4MjgsIDB4MDFmNCwgMHgwMWY1LCAweDAxZjZ9LAotCXsKLQkgNDgsIDUyNDAsIDB4YTAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGUsIDB4MGYsIDB4MDAsIDB4ZWUsIDB4YzgsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YzgsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgzNCwgMHgwODMwLCAweDA4MmMsIDB4MDFmMywgMHgwMWY0LCAweDAxZjV9LAotCXsKLQkgNTAsIDUyNTAsIDB4YTAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGUsIDB4MGYsIDB4MDAsIDB4ZWQsIDB4YzcsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YzcsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgzOCwgMHgwODM0LCAweDA4MzAsIDB4MDFmMiwgMHgwMWYzLCAweDAxZjR9LAotCXsKLQkgNTIsIDUyNjAsIDB4OTgsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGUsIDB4MGUsIDB4MDAsIDB4ZWQsIDB4YzcsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YzcsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgzYywgMHgwODM4LCAweDA4MzQsIDB4MDFmMSwgMHgwMWYyLCAweDAxZjN9LAotCXsKLQkgNTQsIDUyNzAsIDB4OTgsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGUsIDB4MGUsIDB4MDAsIDB4ZWQsIDB4YzcsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGMsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YzcsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGMsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg0MCwgMHgwODNjLCAweDA4MzgsIDB4MDFmMCwgMHgwMWYxLCAweDAxZjJ9LAotCXsKLQkgNTYsIDUyODAsIDB4OTEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTAsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGUsIDB4MDAsIDB4ZGMsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGMsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGMsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg0NCwgMHgwODQwLCAweDA4M2MsIDB4MDFmMCwgMHgwMWYwLCAweDAxZjF9LAotCXsKLQkgNTgsIDUyOTAsIDB4OTEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGUsIDB4MDAsIDB4ZGMsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGMsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGMsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg0OCwgMHgwODQ0LCAweDA4NDAsIDB4MDFlZiwgMHgwMWYwLCAweDAxZjB9LAotCXsKLQkgNjAsIDUzMDAsIDB4OGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGUsIDB4MDAsIDB4ZGMsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGMsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGMsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg0YywgMHgwODQ4LCAweDA4NDQsIDB4MDFlZSwgMHgwMWVmLCAweDAxZjB9LAotCXsKLQkgNjIsIDUzMTAsIDB4OGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGUsIDB4MDAsIDB4ZGMsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGMsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGMsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg1MCwgMHgwODRjLCAweDA4NDgsIDB4MDFlZCwgMHgwMWVlLCAweDAxZWZ9LAotCXsKLQkgNjQsIDUzMjAsIDB4ODMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGUsIDB4MDAsIDB4ZGIsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGMsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGMsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg1NCwgMHgwODUwLCAweDA4NGMsIDB4MDFlYywgMHgwMWVkLCAweDAxZWV9LAotCXsKLQkgNjYsIDUzMzAsIDB4ODMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGQsIDB4MDAsIDB4Y2IsIDB4YTYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YTYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGIsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg1OCwgMHgwODU0LCAweDA4NTAsIDB4MDFlYiwgMHgwMWVjLCAweDAxZWR9LAotCXsKLQkgNjgsIDUzNDAsIDB4N2MsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGQsIDB4MDAsIDB4Y2EsIDB4YTYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YTYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGIsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg1YywgMHgwODU4LCAweDA4NTQsIDB4MDFlYSwgMHgwMWViLCAweDAxZWN9LAotCXsKLQkgNzAsIDUzNTAsIDB4N2MsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTcsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGMsIDB4MGQsIDB4MDAsIDB4Y2EsIDB4YTYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YTYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGIsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg2MCwgMHgwODVjLCAweDA4NTgsIDB4MDFlOSwgMHgwMWVhLCAweDAxZWJ9LAotCXsKLQkgNzIsIDUzNjAsIDB4NzUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTgsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGMsIDB4MGQsIDB4MDAsIDB4YzksIDB4OTUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4NmYsIDB4MDAsIDB4OTUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg2NCwgMHgwODYwLCAweDA4NWMsIDB4MDFlOCwgMHgwMWU5LCAweDAxZWF9LAotCXsKLQkgNzQsIDUzNzAsIDB4NzUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTksIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGMsIDB4MGQsIDB4MDAsIDB4YzksIDB4OTUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4NmYsIDB4MDAsIDB4OTUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg2OCwgMHgwODY0LCAweDA4NjAsIDB4MDFlNywgMHgwMWU4LCAweDAxZTl9LAotCXsKLQkgNzYsIDUzODAsIDB4NmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGMsIDB4MGMsIDB4MDAsIDB4YjgsIDB4OTUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4NmYsIDB4MDAsIDB4OTUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg2YywgMHgwODY4LCAweDA4NjQsIDB4MDFlNiwgMHgwMWU3LCAweDAxZTh9LAotCXsKLQkgNzgsIDUzOTAsIDB4NmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGMsIDB4MGMsIDB4MDAsIDB4YjgsIDB4ODQsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg3MCwgMHgwODZjLCAweDA4NjgsIDB4MDFlNSwgMHgwMWU2LCAweDAxZTd9LAotCXsKLQkgODAsIDU0MDAsIDB4NjcsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGMsIDB4MGMsIDB4MDAsIDB4YjgsIDB4ODQsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg3NCwgMHgwODcwLCAweDA4NmMsIDB4MDFlNSwgMHgwMWU1LCAweDAxZTZ9LAotCXsKLQkgODIsIDU0MTAsIDB4NjcsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGMsIDB4MGMsIDB4MDAsIDB4YjcsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg3OCwgMHgwODc0LCAweDA4NzAsIDB4MDFlNCwgMHgwMWU1LCAweDAxZTV9LAotCXsKLQkgODQsIDU0MjAsIDB4NjEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGMsIDB4MGMsIDB4MDAsIDB4YTcsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg3YywgMHgwODc4LCAweDA4NzQsIDB4MDFlMywgMHgwMWU0LCAweDAxZTV9LAotCXsKLQkgODYsIDU0MzAsIDB4NjEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGMsIDB4MGIsIDB4MDAsIDB4YTYsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg4MCwgMHgwODdjLCAweDA4NzgsIDB4MDFlMiwgMHgwMWUzLCAweDAxZTR9LAotCXsKLQkgODgsIDU0NDAsIDB4NWEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjAsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGIsIDB4MGIsIDB4MDAsIDB4YTYsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg4NCwgMHgwODgwLCAweDA4N2MsIDB4MDFlMSwgMHgwMWUyLCAweDAxZTN9LAotCXsKLQkgOTAsIDU0NTAsIDB4NWEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGIsIDB4MGIsIDB4MDAsIDB4OTUsIDB4ODQsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg4OCwgMHgwODg0LCAweDA4ODAsIDB4MDFlMCwgMHgwMWUxLCAweDAxZTJ9LAotCXsKLQkgOTIsIDU0NjAsIDB4NTMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGIsIDB4MGIsIDB4MDAsIDB4OTUsIDB4ODQsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg4YywgMHgwODg4LCAweDA4ODQsIDB4MDFkZiwgMHgwMWUwLCAweDAxZTF9LAotCXsKLQkgOTQsIDU0NzAsIDB4NTMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGIsIDB4MGIsIDB4MDAsIDB4OTQsIDB4NzMsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDAsIDB4NzMsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg5MCwgMHgwODhjLCAweDA4ODgsIDB4MDFkZSwgMHgwMWRmLCAweDAxZTB9LAotCXsKLQkgOTYsIDU0ODAsIDB4NGQsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGEsIDB4MGEsIDB4MDAsIDB4ODQsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDAsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg5NCwgMHgwODkwLCAweDA4OGMsIDB4MDFkZCwgMHgwMWRlLCAweDAxZGZ9LAotCXsKLQkgOTgsIDU0OTAsIDB4NGQsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGEsIDB4MGEsIDB4MDAsIDB4ODMsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDAsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg5OCwgMHgwODk0LCAweDA4OTAsIDB4MDFkZCwgMHgwMWRkLCAweDAxZGV9LAotCXsKLQkgMTAwLCA1NTAwLCAweDQ3LCAweDAxLCAweDAxLCAweDAyLCAweDI2LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhhLCAweDBhLCAweDAwLCAweDgyLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA5LCAweDAwLCAweDZmLCAweDAwLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA5LAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4OWMsIDB4MDg5OCwgMHgwODk0LCAweDAxZGMsIDB4MDFkZCwgMHgwMWRkfSwKLQl7Ci0JIDEwMiwgNTUxMCwgMHg0NywgMHgwMSwgMHgwMSwgMHgwMiwgMHgyNywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4YSwgMHgwYSwgMHgwMCwgMHg4MiwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwOGEwLCAweDA4OWMsIDB4MDg5OCwgMHgwMWRiLCAweDAxZGMsIDB4MDFkZH0sCi0JewotCSAxMDQsIDU1MjAsIDB4NDAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjgsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGEsIDB4MGEsIDB4MDAsIDB4NzIsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDAsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDhhNCwgMHgwOGEwLCAweDA4OWMsIDB4MDFkYSwgMHgwMWRiLCAweDAxZGN9LAotCXsKLQkgMTA2LCA1NTMwLCAweDQwLCAweDAxLCAweDAxLCAweDAyLCAweDI5LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhhLCAweDA5LCAweDAwLCAweDcyLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA5LCAweDAwLCAweDZmLCAweDAwLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA5LAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4YTgsIDB4MDhhNCwgMHgwOGEwLCAweDAxZDksIDB4MDFkYSwgMHgwMWRifSwKLQl7Ci0JIDEwOCwgNTU0MCwgMHgzYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyYSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4YSwgMHgwOSwgMHgwMCwgMHg3MSwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwOGFjLCAweDA4YTgsIDB4MDhhNCwgMHgwMWQ4LCAweDAxZDksIDB4MDFkYX0sCi0JewotCSAxMTAsIDU1NTAsIDB4M2EsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MmIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4ODksIDB4MDksIDB4MDAsIDB4NjEsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDAsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDhiMCwgMHgwOGFjLCAweDA4YTgsIDB4MDFkNywgMHgwMWQ4LCAweDAxZDl9LAotCXsKLQkgMTEyLCA1NTYwLCAweDM0LCAweDAxLCAweDAxLCAweDAyLCAweDJjLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDg5LCAweDA5LCAweDAwLCAweDYxLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA5LCAweDAwLCAweDZmLCAweDAwLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA5LAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4YjQsIDB4MDhiMCwgMHgwOGFjLCAweDAxZDcsIDB4MDFkNywgMHgwMWQ4fSwKLQl7Ci0JIDExNCwgNTU3MCwgMHgzNCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyZCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4OSwgMHgwOSwgMHgwMCwgMHg2MSwgMHg2MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg2MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwOGI4LCAweDA4YjQsIDB4MDhiMCwgMHgwMWQ2LCAweDAxZDcsIDB4MDFkN30sCi0JewotCSAxMTYsIDU1ODAsIDB4MmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MmUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4ODksIDB4MDgsIDB4MDAsIDB4NjAsIDB4NjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDgsIDB4MDAsIDB4NmYsIDB4MDAsIDB4NjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDgsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDhiYywgMHgwOGI4LCAweDA4YjQsIDB4MDFkNSwgMHgwMWQ2LCAweDAxZDd9LAotCXsKLQkgMTE4LCA1NTkwLCAweDJlLCAweDAxLCAweDAxLCAweDAyLCAweDJmLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDg5LCAweDA4LCAweDAwLCAweDUwLCAweDYxLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA4LCAweDAwLCAweDZmLCAweDAwLCAweDYxLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA4LAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4YzAsIDB4MDhiYywgMHgwOGI4LCAweDAxZDQsIDB4MDFkNSwgMHgwMWQ2fSwKLQl7Ci0JIDEyMCwgNTYwMCwgMHgyOCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzMCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4OSwgMHgwOCwgMHgwMCwgMHg1MCwgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOCwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwOGM0LCAweDA4YzAsIDB4MDhiYywgMHgwMWQzLCAweDAxZDQsIDB4MDFkNX0sCi0JewotCSAxMjIsIDU2MTAsIDB4MjgsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODksIDB4MDgsIDB4MDAsIDB4NTAsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDgsIDB4MDAsIDB4NmYsIDB4MDAsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDgsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDhjOCwgMHgwOGM0LCAweDA4YzAsIDB4MDFkMiwgMHgwMWQzLCAweDAxZDR9LAotCXsKLQkgMTI0LCA1NjIwLCAweDIxLCAweDAxLCAweDAxLCAweDAyLCAweDMyLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg5LCAweDA4LCAweDAwLCAweDUwLCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDZmLCAweDAwLCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA3LAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4Y2MsIDB4MDhjOCwgMHgwOGM0LCAweDAxZDIsIDB4MDFkMiwgMHgwMWQzfSwKLQl7Ci0JIDEyNiwgNTYzMCwgMHgyMSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzMywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4OCwgMHgwNywgMHgwMCwgMHg1MCwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHg2ZiwgMHgwMCwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNywKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwOGQwLCAweDA4Y2MsIDB4MDhjOCwgMHgwMWQxLCAweDAxZDIsIDB4MDFkMn0sCi0JewotCSAxMjgsIDU2NDAsIDB4MWMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODgsIDB4MDcsIDB4MDAsIDB4NDAsIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4NmYsIDB4MDAsIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDcsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDhkNCwgMHgwOGQwLCAweDA4Y2MsIDB4MDFkMCwgMHgwMWQxLCAweDAxZDJ9LAotCXsKLQkgMTMwLCA1NjUwLCAweDFjLCAweDAxLCAweDAxLCAweDAyLCAweDM1LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg4LCAweDA3LCAweDAwLCAweDQwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDZmLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA3LAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4ZDgsIDB4MDhkNCwgMHgwOGQwLCAweDAxY2YsIDB4MDFkMCwgMHgwMWQxfSwKLQl7Ci0JIDEzMiwgNTY2MCwgMHgxNiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzNiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4OCwgMHgwNywgMHgwMCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwOGRjLCAweDA4ZDgsIDB4MDhkNCwgMHgwMWNlLCAweDAxY2YsIDB4MDFkMH0sCi0JewotCSAxMzQsIDU2NzAsIDB4MTYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzcsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODgsIDB4MDcsIDB4MDAsIDB4NDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDhlMCwgMHgwOGRjLCAweDA4ZDgsIDB4MDFjZSwgMHgwMWNlLCAweDAxY2Z9LAotCXsKLQkgMTM2LCA1NjgwLCAweDEwLCAweDAxLCAweDAxLCAweDAyLCAweDM4LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg3LCAweDA2LCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA2LCAweDAwLCAweDZmLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA2LAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4ZTQsIDB4MDhlMCwgMHgwOGRjLCAweDAxY2QsIDB4MDFjZSwgMHgwMWNlfSwKLQl7Ci0JIDEzOCwgNTY5MCwgMHgxMCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzOSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NywgMHgwNiwgMHgwMCwgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwOGU4LCAweDA4ZTQsIDB4MDhlMCwgMHgwMWNjLCAweDAxY2QsIDB4MDFjZX0sCi0JewotCSAxNDAsIDU3MDAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4M2EsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODcsIDB4MDYsIDB4MDAsIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4NmUsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4NmUsIDB4MDAsIDB4MDhlYywgMHgwOGU4LCAweDA4ZTQsIDB4MDFjYiwgMHgwMWNjLCAweDAxY2R9LAotCXsKLQkgMTQyLCA1NzEwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDNiLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg3LCAweDA2LCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA2LCAweDAwLCAweDZlLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA2LAotCSAweDAwLCAweDZlLCAweDAwLCAweDA4ZjAsIDB4MDhlYywgMHgwOGU4LCAweDAxY2EsIDB4MDFjYiwgMHgwMWNjfSwKLQl7Ci0JIDE0NCwgNTcyMCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzYywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NywgMHgwNiwgMHgwMCwgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg2ZSwgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHg2ZSwgMHgwMCwgMHgwOGY0LCAweDA4ZjAsIDB4MDhlYywgMHgwMWM5LCAweDAxY2EsIDB4MDFjYn0sCi0JewotCSAxNDUsIDU3MjUsIDB4MDMsIDB4MDEsIDB4MDIsIDB4MDQsIDB4NzksIDB4MDcsIDB4MDcsIDB4MDQsIDB4MTAsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODcsIDB4MDYsIDB4MDAsIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4NmUsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4NmUsIDB4MDAsIDB4MDhmNiwgMHgwOGYyLCAweDA4ZWUsIDB4MDFjOSwgMHgwMWNhLCAweDAxY2J9LAotCXsKLQkgMTQ2LCA1NzMwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDNkLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg3LCAweDA1LCAweDAwLCAweDIwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA2LCAweDAwLCAweDZlLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA2LAotCSAweDAwLCAweDZlLCAweDAwLCAweDA4ZjgsIDB4MDhmNCwgMHgwOGYwLCAweDAxYzksIDB4MDFjOSwgMHgwMWNhfSwKLQl7Ci0JIDE0NywgNTczNSwgMHgwMywgMHgwMSwgMHgwMiwgMHgwNCwgMHg3YiwgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NywgMHgwNSwgMHgwMCwgMHgyMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg2ZCwgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHg2ZCwgMHgwMCwgMHgwOGZhLCAweDA4ZjYsIDB4MDhmMiwgMHgwMWM4LCAweDAxYzksIDB4MDFjYX0sCi0JewotCSAxNDgsIDU3NDAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4M2UsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODcsIDB4MDUsIDB4MDAsIDB4MjAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4NmQsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4NmQsIDB4MDAsIDB4MDhmYywgMHgwOGY4LCAweDA4ZjQsIDB4MDFjOCwgMHgwMWM5LCAweDAxYzl9LAotCXsKLQkgMTQ5LCA1NzQ1LCAweGZlLCAweDAwLCAweDAyLCAweDA0LCAweDdkLCAweDA3LCAweDA3LCAweDA0LCAweDEwLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg3LCAweDA1LCAweDAwLCAweDIwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA2LCAweDAwLCAweDZkLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA2LAotCSAweDAwLCAweDZkLCAweDAwLCAweDA4ZmUsIDB4MDhmYSwgMHgwOGY2LCAweDAxYzgsIDB4MDFjOCwgMHgwMWM5fSwKLQl7Ci0JIDE1MCwgNTc1MCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzZiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NywgMHgwNSwgMHgwMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg2ZCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg2ZCwgMHgwMCwgMHgwOTAwLCAweDA4ZmMsIDB4MDhmOCwgMHgwMWM3LCAweDAxYzgsIDB4MDFjOX0sCi0JewotCSAxNTEsIDU3NTUsIDB4ZmUsIDB4MDAsIDB4MDIsIDB4MDQsIDB4N2YsIDB4MDcsIDB4MDcsIDB4MDQsIDB4MTAsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODcsIDB4MDUsIDB4MDAsIDB4MTAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NmMsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4NmMsIDB4MDAsIDB4MDkwMiwgMHgwOGZlLCAweDA4ZmEsIDB4MDFjNywgMHgwMWM4LCAweDAxYzh9LAotCXsKLQkgMTUyLCA1NzYwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQwLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg2LCAweDA1LCAweDAwLCAweDEwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA1LCAweDAwLCAweDZjLCAweDAwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA1LAotCSAweDAwLCAweDZjLCAweDAwLCAweDA5MDQsIDB4MDkwMCwgMHgwOGZjLCAweDAxYzYsIDB4MDFjNywgMHgwMWM4fSwKLQl7Ci0JIDE1MywgNTc2NSwgMHhmOCwgMHgwMCwgMHgwMiwgMHgwNCwgMHg4MSwgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NiwgMHgwNSwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg2YywgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg2YywgMHgwMCwgMHgwOTA2LCAweDA5MDIsIDB4MDhmZSwgMHgwMWM2LCAweDAxYzcsIDB4MDFjOH0sCi0JewotCSAxNTQsIDU3NzAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODYsIDB4MDQsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NmIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4NmIsIDB4MDAsIDB4MDkwOCwgMHgwOTA0LCAweDA5MDAsIDB4MDFjNiwgMHgwMWM2LCAweDAxYzd9LAotCXsKLQkgMTU1LCA1Nzc1LCAweGY4LCAweDAwLCAweDAyLCAweDA0LCAweDgzLCAweDA3LCAweDA3LCAweDA0LCAweDEwLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg2LCAweDA0LCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA1LCAweDAwLCAweDZiLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA1LAotCSAweDAwLCAweDZiLCAweDAwLCAweDA5MGEsIDB4MDkwNiwgMHgwOTAyLCAweDAxYzUsIDB4MDFjNiwgMHgwMWM3fSwKLQl7Ci0JIDE1NiwgNTc4MCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHg0MiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NiwgMHgwNCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg2YiwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg2YiwgMHgwMCwgMHgwOTBjLCAweDA5MDgsIDB4MDkwNCwgMHgwMWM1LCAweDAxYzYsIDB4MDFjNn0sCi0JewotCSAxNTcsIDU3ODUsIDB4ZjIsIDB4MDAsIDB4MDIsIDB4MDQsIDB4ODUsIDB4MDcsIDB4MDcsIDB4MDQsIDB4MTAsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NmIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4NmIsIDB4MDAsIDB4MDkwZSwgMHgwOTBhLCAweDA5MDYsIDB4MDFjNCwgMHgwMWM1LCAweDAxYzZ9LAotCXsKLQkgMTU4LCA1NzkwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQzLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg2LCAweDA0LCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA1LCAweDAwLCAweDZiLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA1LAotCSAweDAwLCAweDZiLCAweDAwLCAweDA5MTAsIDB4MDkwYywgMHgwOTA4LCAweDAxYzQsIDB4MDFjNSwgMHgwMWM2fSwKLQl7Ci0JIDE1OSwgNTc5NSwgMHhmMiwgMHgwMCwgMHgwMiwgMHgwNCwgMHg4NywgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NiwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg2YiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg2YiwgMHgwMCwgMHgwOTEyLCAweDA5MGUsIDB4MDkwYSwgMHgwMWM0LCAweDAxYzQsIDB4MDFjNX0sCi0JewotCSAxNjAsIDU4MDAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NmIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4NmIsIDB4MDAsIDB4MDkxNCwgMHgwOTEwLCAweDA5MGMsIDB4MDFjMywgMHgwMWM0LCAweDAxYzV9LAotCXsKLQkgMTYxLCA1ODA1LCAweGVkLCAweDAwLCAweDAyLCAweDA0LCAweDg5LCAweDA3LCAweDA3LCAweDA0LCAweDEwLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg2LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA1LCAweDAwLCAweDZhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA1LAotCSAweDAwLCAweDZhLCAweDAwLCAweDA5MTYsIDB4MDkxMiwgMHgwOTBlLCAweDAxYzMsIDB4MDFjNCwgMHgwMWM0fSwKLQl7Ci0JIDE2MiwgNTgxMCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHg0NSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NiwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg2YSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg2YSwgMHgwMCwgMHgwOTE4LCAweDA5MTQsIDB4MDkxMCwgMHgwMWMyLCAweDAxYzMsIDB4MDFjNH0sCi0JewotCSAxNjMsIDU4MTUsIDB4ZWQsIDB4MDAsIDB4MDIsIDB4MDQsIDB4OGIsIDB4MDcsIDB4MDcsIDB4MDQsIDB4MTAsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NmEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4NmEsIDB4MDAsIDB4MDkxYSwgMHgwOTE2LCAweDA5MTIsIDB4MDFjMiwgMHgwMWMzLCAweDAxYzR9LAotCXsKLQkgMTY0LCA1ODIwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQ2LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg2LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA1LCAweDAwLCAweDZhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA1LAotCSAweDAwLCAweDZhLCAweDAwLCAweDA5MWMsIDB4MDkxOCwgMHgwOTE0LCAweDAxYzIsIDB4MDFjMiwgMHgwMWMzfSwKLQl7Ci0JIDE2NSwgNTgyNSwgMHhlZCwgMHgwMCwgMHgwMiwgMHgwNCwgMHg4ZCwgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NiwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg2OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg2OSwgMHgwMCwgMHgwOTFlLCAweDA5MWEsIDB4MDkxNiwgMHgwMWMxLCAweDAxYzIsIDB4MDFjM30sCi0JewotCSAxNjYsIDU4MzAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDcsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4NjksIDB4MDAsIDB4MDkyMCwgMHgwOTFjLCAweDA5MTgsIDB4MDFjMSwgMHgwMWMyLCAweDAxYzJ9LAotCXsKLQkgMTY4LCA1ODQwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQ4LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg2LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA0LCAweDAwLCAweDY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA0LAotCSAweDAwLCAweDY5LCAweDAwLCAweDA5MjQsIDB4MDkyMCwgMHgwOTFjLCAweDAxYzAsIDB4MDFjMSwgMHgwMWMyfSwKLQl7Ci0JIDE3MCwgNTg1MCwgMHhlMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHg0OSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNCwgMHgwMCwgMHg2OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNCwKLQkgMHgwMCwgMHg2OSwgMHgwMCwgMHgwOTI4LCAweDA5MjQsIDB4MDkyMCwgMHgwMWJmLCAweDAxYzAsIDB4MDFjMX0sCi0JewotCSAxNzIsIDU4NjAsIDB4ZGUsIDB4MDAsIDB4MDEsIDB4MDIsIDB4NGEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODUsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDQsIDB4MDAsIDB4NjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDQsCi0JIDB4MDAsIDB4NjksIDB4MDAsIDB4MDkyYywgMHgwOTI4LCAweDA5MjQsIDB4MDFiZiwgMHgwMWJmLCAweDAxYzB9LAotCXsKLQkgMTc0LCA1ODcwLCAweGRiLCAweDAwLCAweDAxLCAweDAyLCAweDRiLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg1LCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA0LCAweDAwLCAweDY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA0LAotCSAweDAwLCAweDY4LCAweDAwLCAweDA5MzAsIDB4MDkyYywgMHgwOTI4LCAweDAxYmUsIDB4MDFiZiwgMHgwMWJmfSwKLQl7Ci0JIDE3NiwgNTg4MCwgMHhkOCwgMHgwMCwgMHgwMSwgMHgwMiwgMHg0YywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNCwgMHgwMCwgMHg2OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNCwKLQkgMHgwMCwgMHg2OCwgMHgwMCwgMHgwOTM0LCAweDA5MzAsIDB4MDkyYywgMHgwMWJkLCAweDAxYmUsIDB4MDFiZn0sCi0JewotCSAxNzgsIDU4OTAsIDB4ZDYsIDB4MDAsIDB4MDEsIDB4MDIsIDB4NGQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODUsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDQsIDB4MDAsIDB4NjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDQsCi0JIDB4MDAsIDB4NjgsIDB4MDAsIDB4MDkzOCwgMHgwOTM0LCAweDA5MzAsIDB4MDFiYywgMHgwMWJkLCAweDAxYmV9LAotCXsKLQkgMTgwLCA1OTAwLCAweGQzLCAweDAwLCAweDAxLCAweDAyLCAweDRlLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg1LCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA0LCAweDAwLCAweDY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA0LAotCSAweDAwLCAweDY4LCAweDAwLCAweDA5M2MsIDB4MDkzOCwgMHgwOTM0LCAweDAxYmMsIDB4MDFiYywgMHgwMWJkfSwKLQl7Ci0JIDE4MiwgNTkxMCwgMHhkNiwgMHgwMCwgMHgwMSwgMHgwMiwgMHg0ZiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNCwgMHgwMCwgMHg2OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNCwKLQkgMHgwMCwgMHg2OCwgMHgwMCwgMHgwOTQwLCAweDA5M2MsIDB4MDkzOCwgMHgwMWJiLCAweDAxYmMsIDB4MDFiY30sCi0JewotCSAxLCAyNDEyLCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDZjLCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc4LCAweDAwLCAweDAzLCAweDAwLAotCSAweDcwLCAweDAwLCAweDBiLCAweDAwLCAweDBhLCAweDAwLCAweDc4LCAweDAwLCAweDAzLCAweDAwLCAweDcwLCAweDAwLAotCSAweDBiLCAweDAwLCAweDBhLCAweDAzYzksIDB4MDNjNSwgMHgwM2MxLCAweDA0M2EsIDB4MDQzZiwgMHgwNDQzfSwKLQl7Ci0JIDIsIDI0MTcsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4NzEsIDB4MDgsIDB4MDgsIDB4MDQsIDB4MTYsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzgsIDB4MDAsIDB4MDMsIDB4MDAsCi0JIDB4NzAsIDB4MDAsIDB4MGIsIDB4MDAsIDB4MGEsIDB4MDAsIDB4NzgsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsIDB4MDAsCi0JIDB4MGIsIDB4MDAsIDB4MGEsIDB4MDNjYiwgMHgwM2M3LCAweDAzYzMsIDB4MDQzOCwgMHgwNDNkLCAweDA0NDF9LAotCXsKLQkgMywgMjQyMiwgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg3NiwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2NywgMHgwMCwgMHgwMywgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwYiwgMHgwMCwgMHgwYSwgMHgwMCwgMHg2NywgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwYiwgMHgwMCwgMHgwYSwgMHgwM2NkLCAweDAzYzksIDB4MDNjNSwgMHgwNDM2LCAweDA0M2EsIDB4MDQzZn0sCi0JewotCSA0LCAyNDI3LCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDdiLCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDU3LCAweDAwLCAweDAzLCAweDAwLAotCSAweDcwLCAweDAwLCAweDBhLCAweDAwLCAweDBhLCAweDAwLCAweDU3LCAweDAwLCAweDAzLCAweDAwLCAweDcwLCAweDAwLAotCSAweDBhLCAweDAwLCAweDBhLCAweDAzY2YsIDB4MDNjYiwgMHgwM2M3LCAweDA0MzQsIDB4MDQzOCwgMHgwNDNkfSwKLQl7Ci0JIDUsIDI0MzIsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4ODAsIDB4MDgsIDB4MDgsIDB4MDQsIDB4MTYsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTYsIDB4MDAsIDB4MDMsIDB4MDAsCi0JIDB4NzAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MGEsIDB4MDAsIDB4NTYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsIDB4MDAsCi0JIDB4MGEsIDB4MDAsIDB4MGEsIDB4MDNkMSwgMHgwM2NkLCAweDAzYzksIDB4MDQzMSwgMHgwNDM2LCAweDA0M2F9LAotCXsKLQkgNiwgMjQzNywgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg4NSwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NiwgMHgwMCwgMHgwMywgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwYSwgMHgwMCwgMHg0NiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwYSwgMHgwMCwgMHgwYSwgMHgwM2QzLCAweDAzY2YsIDB4MDNjYiwgMHgwNDJmLCAweDA0MzQsIDB4MDQzOH0sCi0JewotCSA3LCAyNDQyLCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDhhLCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDQ1LCAweDAwLCAweDAyLCAweDAwLAotCSAweDcwLCAweDAwLCAweDBhLCAweDAwLCAweDBhLCAweDAwLCAweDQ1LCAweDAwLCAweDAyLCAweDAwLCAweDcwLCAweDAwLAotCSAweDBhLCAweDAwLCAweDBhLCAweDAzZDUsIDB4MDNkMSwgMHgwM2NkLCAweDA0MmQsIDB4MDQzMSwgMHgwNDM2fSwKLQl7Ci0JIDgsIDI0NDcsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4OGYsIDB4MDgsIDB4MDgsIDB4MDQsIDB4MTYsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4OGYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzQsIDB4MDAsIDB4MDIsIDB4MDAsCi0JIDB4NzAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDksIDB4MDAsIDB4MzQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzAsIDB4MDAsCi0JIDB4MGEsIDB4MDAsIDB4MDksIDB4MDNkNywgMHgwM2QzLCAweDAzY2YsIDB4MDQyYiwgMHgwNDJmLCAweDA0MzR9LAotCXsKLQkgOSwgMjQ1MiwgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg5NCwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMywgMHgwMCwgMHgwMiwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgyMywgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwYSwgMHgwMCwgMHgwOSwgMHgwM2Q5LCAweDAzZDUsIDB4MDNkMSwgMHgwNDI5LCAweDA0MmQsIDB4MDQzMX0sCi0JewotCSAxMCwgMjQ1NywgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg5OSwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwgMHgwMiwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgxMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwYSwgMHgwMCwgMHgwOSwgMHgwM2RiLCAweDAzZDcsIDB4MDNkMywgMHgwNDI3LCAweDA0MmIsIDB4MDQyZn0sCi0JewotCSAxMSwgMjQ2MiwgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg5ZSwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwOSwgMHgwMCwgMHgwOSwgMHgwM2RkLCAweDAzZDksIDB4MDNkNSwgMHgwNDI0LCAweDA0MjksIDB4MDQyZH0sCi0JewotCSAxMiwgMjQ2NywgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHhhMywgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwOSwgMHgwMCwgMHgwOSwgMHgwM2RmLCAweDAzZGIsIDB4MDNkNywgMHgwNDIyLCAweDA0MjcsIDB4MDQyYn0sCi0JewotCSAxMywgMjQ3MiwgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHhhOCwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNywgMHgwNywgMHgwNywgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwOSwgMHgwMCwgMHgwOSwgMHgwM2UxLCAweDAzZGQsIDB4MDNkOSwgMHgwNDIwLCAweDA0MjQsIDB4MDQyOX0sCi0JewotCSAxNCwgMjQ4NCwgMHhmZiwgMHgwMSwgMHgwMywgMHgwOSwgMHhiNCwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNywgMHgwNywgMHgwNywgMHg4ZiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwOSwgMHgwMCwgMHgwOSwgMHgwM2U2LCAweDAzZTIsIDB4MDNkZSwgMHgwNDFiLCAweDA0MWYsIDB4MDQyNH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2hhbl9pbmZvX25waHlfcmFkaW8yMDV4IGNoYW5faW5mb19ucGh5cmV2NW42XzIwNTZ2N1tdID0gewotCXsKLQkgMTg0LCA0OTIwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGVjLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAwLCAweDAwLCAweDAwLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDBiLCAweDAwLCAweDcwLAotCSAweDAwLCAweDBmLCAweDAwLCAweDlmLCAweDAwLCAweGZmLCAweDAwLCAweDBiLCAweDAwLCAweDcwLCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3YjQsIDB4MDdiMCwgMHgwN2FjLCAweDAyMTQsIDB4MDIxNSwgMHgwMjE2fSwKLQl7Ci0JIDE4NiwgNDkzMCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhlZCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwYiwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwZSwgMHgwMCwgMHg5ZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwYiwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwZSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2I4LCAweDA3YjQsIDB4MDdiMCwgMHgwMjEzLCAweDAyMTQsIDB4MDIxNX0sCi0JewotCSAxODgsIDQ5NDAsIDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZWUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MGIsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MGUsIDB4MDAsIDB4OWYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MGIsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MGUsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdiYywgMHgwN2I4LCAweDA3YjQsIDB4MDIxMiwgMHgwMjEzLCAweDAyMTR9LAotCXsKLQkgMTkwLCA0OTUwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGVmLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAwLCAweDAwLCAweDAwLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDBiLCAweDAwLCAweDcwLAotCSAweDAwLCAweDBlLCAweDAwLCAweDlmLCAweDAwLCAweGZmLCAweDAwLCAweDBiLCAweDAwLCAweDcwLCAweDAwLCAweDBlLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3YzAsIDB4MDdiYywgMHgwN2I4LCAweDAyMTEsIDB4MDIxMiwgMHgwMjEzfSwKLQl7Ci0JIDE5MiwgNDk2MCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmMCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwYSwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwZSwgMHgwMCwgMHg5ZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwYSwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwZSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2M0LCAweDA3YzAsIDB4MDdiYywgMHgwMjBmLCAweDAyMTEsIDB4MDIxMn0sCi0JewotCSAxOTQsIDQ5NzAsIDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MGEsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4OWYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MGEsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdjOCwgMHgwN2M0LCAweDA3YzAsIDB4MDIwZSwgMHgwMjBmLCAweDAyMTF9LAotCXsKLQkgMTk2LCA0OTgwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGYyLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDBhLCAweDAwLCAweDcwLAotCSAweDAwLCAweDBkLCAweDAwLCAweDlmLCAweDAwLCAweGZmLCAweDAwLCAweDBhLCAweDAwLCAweDcwLCAweDAwLCAweDBkLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3Y2MsIDB4MDdjOCwgMHgwN2M0LCAweDAyMGQsIDB4MDIwZSwgMHgwMjBmfSwKLQl7Ci0JIDE5OCwgNDk5MCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmMywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwYSwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHg5ZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwYSwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwZCwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2QwLCAweDA3Y2MsIDB4MDdjOCwgMHgwMjBjLCAweDAyMGQsIDB4MDIwZX0sCi0JewotCSAyMDAsIDUwMDAsIDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MGEsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4OWYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MGEsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdkNCwgMHgwN2QwLCAweDA3Y2MsIDB4MDIwYiwgMHgwMjBjLCAweDAyMGR9LAotCXsKLQkgMjAyLCA1MDEwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGY1LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZmLCAweDAwLCAweDBhLCAweDAwLCAweDcwLAotCSAweDAwLCAweDBkLCAweDAwLCAweDlmLCAweDAwLCAweGZmLCAweDAwLCAweDBhLCAweDAwLCAweDcwLCAweDAwLCAweDBkLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3ZDgsIDB4MDdkNCwgMHgwN2QwLCAweDAyMGEsIDB4MDIwYiwgMHgwMjBjfSwKLQl7Ci0JIDIwNCwgNTAyMCwgMHhmNywgMHgwMSwgMHgwMSwgMHgwMSwgMHhmNiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHg5ZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwZCwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2RjLCAweDA3ZDgsIDB4MDdkNCwgMHgwMjA5LCAweDAyMGEsIDB4MDIwYn0sCi0JewotCSAyMDYsIDUwMzAsIDB4ZjcsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjcsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MGMsIDB4MDAsIDB4OWYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzAsIDB4MDAsIDB4MGMsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdlMCwgMHgwN2RjLCAweDA3ZDgsIDB4MDIwOCwgMHgwMjA5LCAweDAyMGF9LAotCXsKLQkgMjA4LCA1MDQwLCAweGVmLCAweDAxLCAweDAxLCAweDAxLCAweGY4LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDcwLAotCSAweDAwLCAweDBjLCAweDAwLCAweDlmLCAweDAwLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDcwLCAweDAwLCAweDBjLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3ZTQsIDB4MDdlMCwgMHgwN2RjLCAweDAyMDcsIDB4MDIwOCwgMHgwMjA5fSwKLQl7Ci0JIDIxMCwgNTA1MCwgMHhlZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmOSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwYywgMHgwMCwgMHg5ZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwYywKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2U4LCAweDA3ZTQsIDB4MDdlMCwgMHgwMjA2LCAweDAyMDcsIDB4MDIwOH0sCi0JewotCSAyMTIsIDUwNjAsIDB4ZTYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZmEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmQsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MGMsIDB4MDAsIDB4OWYsIDB4MDAsIDB4ZmQsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzAsIDB4MDAsIDB4MGMsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdlYywgMHgwN2U4LCAweDA3ZTQsIDB4MDIwNSwgMHgwMjA2LCAweDAyMDd9LAotCXsKLQkgMjE0LCA1MDcwLCAweGU2LCAweDAxLCAweDAxLCAweDAxLCAweGZiLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZkLCAweDAwLCAweDA4LCAweDAwLCAweDcwLAotCSAweDAwLCAweDBiLCAweDAwLCAweDlmLCAweDAwLCAweGZkLCAweDAwLCAweDA4LCAweDAwLCAweDcwLCAweDAwLCAweDBiLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3ZjAsIDB4MDdlYywgMHgwN2U4LCAweDAyMDQsIDB4MDIwNSwgMHgwMjA2fSwKLQl7Ci0JIDIxNiwgNTA4MCwgMHhkZSwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmYywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmYywgMHgwMCwgMHgwOCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHg5ZiwgMHgwMCwgMHhmYywgMHgwMCwgMHgwOCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2Y0LCAweDA3ZjAsIDB4MDdlYywgMHgwMjAzLCAweDAyMDQsIDB4MDIwNX0sCi0JewotCSAyMTgsIDUwOTAsIDB4ZGUsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZmQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4OWYsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MGIsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdmOCwgMHgwN2Y0LCAweDA3ZjAsIDB4MDIwMiwgMHgwMjAzLCAweDAyMDR9LAotCXsKLQkgMjIwLCA1MTAwLCAweGQ2LCAweDAxLCAweDAxLCAweDAxLCAweGZlLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAyLCAweDAyLCAweDAyLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZjLCAweDAwLCAweDA4LCAweDAwLCAweDcwLAotCSAweDAwLCAweDBiLCAweDAwLCAweDlmLCAweDAwLCAweGZjLCAweDAwLCAweDA4LCAweDAwLCAweDcwLCAweDAwLCAweDBiLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3ZmMsIDB4MDdmOCwgMHgwN2Y0LCAweDAyMDEsIDB4MDIwMiwgMHgwMjAzfSwKLQl7Ci0JIDIyMiwgNTExMCwgMHhkNiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmZiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmYywgMHgwMCwgMHgwOCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHg5ZiwgMHgwMCwgMHhmYywgMHgwMCwgMHgwOCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODAwLCAweDA3ZmMsIDB4MDdmOCwgMHgwMjAwLCAweDAyMDEsIDB4MDIwMn0sCi0JewotCSAyMjQsIDUxMjAsIDB4Y2UsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4OWYsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MGIsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgwNCwgMHgwODAwLCAweDA3ZmMsIDB4MDFmZiwgMHgwMjAwLCAweDAyMDF9LAotCXsKLQkgMjI2LCA1MTMwLCAweGNlLCAweDAxLCAweDAxLCAweDAyLCAweDAxLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAyLCAweDAyLCAweDAyLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZiLCAweDAwLCAweDA4LCAweDAwLCAweDcwLAotCSAweDAwLCAweDBhLCAweDAwLCAweDlmLCAweDAwLCAweGZiLCAweDAwLCAweDA4LCAweDAwLCAweDcwLCAweDAwLCAweDBhLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4MDgsIDB4MDgwNCwgMHgwODAwLCAweDAxZmUsIDB4MDFmZiwgMHgwMjAwfSwKLQl7Ci0JIDIyOCwgNTE0MCwgMHhjNiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwMiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmYiwgMHgwMCwgMHgwNywgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHg5ZiwgMHgwMCwgMHhmYiwgMHgwMCwgMHgwNywgMHgwMCwgMHg3MCwgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODBjLCAweDA4MDgsIDB4MDgwNCwgMHgwMWZkLCAweDAxZmUsIDB4MDFmZn0sCi0JewotCSAzMiwgNTE2MCwgMHhiZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmYiwgMHgwMCwgMHgwNywgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg5ZSwgMHgwMCwgMHhmYiwgMHgwMCwgMHgwNywgMHgwMCwgMHg3MCwgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHg2ZSwgMHgwMCwgMHgwODE0LCAweDA4MTAsIDB4MDgwYywgMHgwMWZiLCAweDAxZmMsIDB4MDFmZH0sCi0JewotCSAzNCwgNTE3MCwgMHhiZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwNSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmYiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg5ZSwgMHgwMCwgMHhmYiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHg2ZSwgMHgwMCwgMHgwODE4LCAweDA4MTQsIDB4MDgxMCwgMHgwMWZhLCAweDAxZmIsIDB4MDFmY30sCi0JewotCSAzNiwgNTE4MCwgMHhiNiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwNiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmYSwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg5ZSwgMHgwMCwgMHhmYSwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHg2ZSwgMHgwMCwgMHgwODFjLCAweDA4MTgsIDB4MDgxNCwgMHgwMWY5LCAweDAxZmEsIDB4MDFmYn0sCi0JewotCSAzOCwgNTE5MCwgMHhiNiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwNywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmYSwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg5ZSwgMHgwMCwgMHhmYSwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHg2ZSwgMHgwMCwgMHgwODIwLCAweDA4MWMsIDB4MDgxOCwgMHgwMWY4LCAweDAxZjksIDB4MDFmYX0sCi0JewotCSA0MCwgNTIwMCwgMHhhZiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwOCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmYSwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg5ZSwgMHgwMCwgMHhmYSwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHg2ZSwgMHgwMCwgMHgwODI0LCAweDA4MjAsIDB4MDgxYywgMHgwMWY3LCAweDAxZjgsIDB4MDFmOX0sCi0JewotCSA0MiwgNTIxMCwgMHhhZiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwOSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmYSwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg5ZSwgMHgwMCwgMHhmYSwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHg2ZSwgMHgwMCwgMHgwODI4LCAweDA4MjQsIDB4MDgyMCwgMHgwMWY2LCAweDAxZjcsIDB4MDFmOH0sCi0JewotCSA0NCwgNTIyMCwgMHhhNywgMHgwMSwgMHgwMSwgMHgwMiwgMHgwYSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZSwgMHgwZiwgMHgwMCwgMHhmZSwgMHhmYSwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg5ZSwgMHgwMCwgMHhmYSwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHg2ZSwgMHgwMCwgMHgwODJjLCAweDA4MjgsIDB4MDgyNCwgMHgwMWY1LCAweDAxZjYsIDB4MDFmN30sCi0JewotCSA0NiwgNTIzMCwgMHhhNywgMHgwMSwgMHgwMSwgMHgwMiwgMHgwYiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZSwgMHgwZiwgMHgwMCwgMHhlZSwgMHhlYSwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHg5ZSwgMHgwMCwgMHhlYSwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwOCwKLQkgMHgwMCwgMHg2ZSwgMHgwMCwgMHgwODMwLCAweDA4MmMsIDB4MDgyOCwgMHgwMWY0LCAweDAxZjUsIDB4MDFmNn0sCi0JewotCSA0OCwgNTI0MCwgMHhhMCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwYywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZSwgMHgwZiwgMHgwMCwgMHhlZSwgMHhlOSwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHg5ZCwgMHgwMCwgMHhlOSwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwOCwKLQkgMHgwMCwgMHg2ZCwgMHgwMCwgMHgwODM0LCAweDA4MzAsIDB4MDgyYywgMHgwMWYzLCAweDAxZjQsIDB4MDFmNX0sCi0JewotCSA1MCwgNTI1MCwgMHhhMCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwZCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZSwgMHgwZiwgMHgwMCwgMHhlZCwgMHhlOSwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHg5ZCwgMHgwMCwgMHhlOSwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwOCwKLQkgMHgwMCwgMHg2ZCwgMHgwMCwgMHgwODM4LCAweDA4MzQsIDB4MDgzMCwgMHgwMWYyLCAweDAxZjMsIDB4MDFmNH0sCi0JewotCSA1MiwgNTI2MCwgMHg5OCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwZSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZSwgMHgwZSwgMHgwMCwgMHhlZCwgMHhkOSwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHg5ZCwgMHgwMCwgMHhkOSwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwOCwKLQkgMHgwMCwgMHg2ZCwgMHgwMCwgMHgwODNjLCAweDA4MzgsIDB4MDgzNCwgMHgwMWYxLCAweDAxZjIsIDB4MDFmM30sCi0JewotCSA1NCwgNTI3MCwgMHg5OCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwZiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZSwgMHgwZSwgMHgwMCwgMHhlZCwgMHhkOCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHg5YywgMHgwMCwgMHhkOCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNywKLQkgMHgwMCwgMHg2YywgMHgwMCwgMHgwODQwLCAweDA4M2MsIDB4MDgzOCwgMHgwMWYwLCAweDAxZjEsIDB4MDFmMn0sCi0JewotCSA1NiwgNTI4MCwgMHg5MSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxMCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZCwgMHgwZSwgMHgwMCwgMHhkYywgMHhjOCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHg5YywgMHgwMCwgMHhjOCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNywKLQkgMHgwMCwgMHg2YywgMHgwMCwgMHgwODQ0LCAweDA4NDAsIDB4MDgzYywgMHgwMWYwLCAweDAxZjAsIDB4MDFmMX0sCi0JewotCSA1OCwgNTI5MCwgMHg5MSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxMSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZCwgMHgwZSwgMHgwMCwgMHhkYywgMHhjOCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHg5YywgMHgwMCwgMHhjOCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNywKLQkgMHgwMCwgMHg2YywgMHgwMCwgMHgwODQ4LCAweDA4NDQsIDB4MDg0MCwgMHgwMWVmLCAweDAxZjAsIDB4MDFmMH0sCi0JewotCSA2MCwgNTMwMCwgMHg4YSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxMiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZCwgMHgwZSwgMHgwMCwgMHhkYywgMHhjOCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHg5YywgMHgwMCwgMHhjOCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNywKLQkgMHgwMCwgMHg2YywgMHgwMCwgMHgwODRjLCAweDA4NDgsIDB4MDg0NCwgMHgwMWVlLCAweDAxZWYsIDB4MDFmMH0sCi0JewotCSA2MiwgNTMxMCwgMHg4YSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxMywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZCwgMHgwZSwgMHgwMCwgMHhkYywgMHhjOCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHg5YywgMHgwMCwgMHhjOCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNywKLQkgMHgwMCwgMHg2YywgMHgwMCwgMHgwODUwLCAweDA4NGMsIDB4MDg0OCwgMHgwMWVkLCAweDAxZWUsIDB4MDFlZn0sCi0JewotCSA2NCwgNTMyMCwgMHg4MywgMHgwMSwgMHgwMSwgMHgwMiwgMHgxNCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZCwgMHgwZSwgMHgwMCwgMHhkYiwgMHhiOCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHg5YywgMHgwMCwgMHhiOCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNywKLQkgMHgwMCwgMHg2YywgMHgwMCwgMHgwODU0LCAweDA4NTAsIDB4MDg0YywgMHgwMWVjLCAweDAxZWQsIDB4MDFlZX0sCi0JewotCSA2NiwgNTMzMCwgMHg4MywgMHgwMSwgMHgwMSwgMHgwMiwgMHgxNSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZCwgMHgwZCwgMHgwMCwgMHhjYiwgMHhiNywgMHgwMCwgMHgwNCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHg5YiwgMHgwMCwgMHhiNywgMHgwMCwgMHgwNCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNywKLQkgMHgwMCwgMHg2YiwgMHgwMCwgMHgwODU4LCAweDA4NTQsIDB4MDg1MCwgMHgwMWViLCAweDAxZWMsIDB4MDFlZH0sCi0JewotCSA2OCwgNTM0MCwgMHg3YywgMHgwMSwgMHgwMSwgMHgwMiwgMHgxNiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZCwgMHgwZCwgMHgwMCwgMHhjYSwgMHhiNywgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHg5YiwgMHgwMCwgMHhiNywgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNywKLQkgMHgwMCwgMHg2YiwgMHgwMCwgMHgwODVjLCAweDA4NTgsIDB4MDg1NCwgMHgwMWVhLCAweDAxZWIsIDB4MDFlY30sCi0JewotCSA3MCwgNTM1MCwgMHg3YywgMHgwMSwgMHgwMSwgMHgwMiwgMHgxNywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4YywgMHgwZCwgMHgwMCwgMHhjYSwgMHhhNywgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg5YiwgMHgwMCwgMHhhNywgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHg2YiwgMHgwMCwgMHgwODYwLCAweDA4NWMsIDB4MDg1OCwgMHgwMWU5LCAweDAxZWEsIDB4MDFlYn0sCi0JewotCSA3MiwgNTM2MCwgMHg3NSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxOCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4YywgMHgwZCwgMHgwMCwgMHhjOSwgMHhhNiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg5YiwgMHgwMCwgMHhhNiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHg2YiwgMHgwMCwgMHgwODY0LCAweDA4NjAsIDB4MDg1YywgMHgwMWU4LCAweDAxZTksIDB4MDFlYX0sCi0JewotCSA3NCwgNTM3MCwgMHg3NSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxOSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4YywgMHgwZCwgMHgwMCwgMHhjOSwgMHhhNiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg5YiwgMHgwMCwgMHhhNiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHg3YiwgMHgwMCwgMHgwODY4LCAweDA4NjQsIDB4MDg2MCwgMHgwMWU3LCAweDAxZTgsIDB4MDFlOX0sCi0JewotCSA3NiwgNTM4MCwgMHg2ZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxYSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4YywgMHgwYywgMHgwMCwgMHhiOCwgMHg5NiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg5YSwgMHgwMCwgMHg5NiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHg3YSwgMHgwMCwgMHgwODZjLCAweDA4NjgsIDB4MDg2NCwgMHgwMWU2LCAweDAxZTcsIDB4MDFlOH0sCi0JewotCSA3OCwgNTM5MCwgMHg2ZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxYiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4YywgMHgwYywgMHgwMCwgMHhiOCwgMHg5NSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg5YSwgMHgwMCwgMHg5NSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHg3YSwgMHgwMCwgMHgwODcwLCAweDA4NmMsIDB4MDg2OCwgMHgwMWU1LCAweDAxZTYsIDB4MDFlN30sCi0JewotCSA4MCwgNTQwMCwgMHg2NywgMHgwMSwgMHgwMSwgMHgwMiwgMHgxYywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4YywgMHgwYywgMHgwMCwgMHhiOCwgMHg5NSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg5YSwgMHgwMCwgMHg5NSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHg3YSwgMHgwMCwgMHgwODc0LCAweDA4NzAsIDB4MDg2YywgMHgwMWU1LCAweDAxZTUsIDB4MDFlNn0sCi0JewotCSA4MiwgNTQxMCwgMHg2NywgMHgwMSwgMHgwMSwgMHgwMiwgMHgxZCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4YywgMHgwYywgMHgwMCwgMHhiNywgMHg5NSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg5YSwgMHgwMCwgMHg5NSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg3YSwgMHgwMCwgMHgwODc4LCAweDA4NzQsIDB4MDg3MCwgMHgwMWU0LCAweDAxZTUsIDB4MDFlNX0sCi0JewotCSA4NCwgNTQyMCwgMHg2MSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxZSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4YywgMHgwYywgMHgwMCwgMHhhNywgMHg5NSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg5YSwgMHgwMCwgMHg5NSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg3YSwgMHgwMCwgMHgwODdjLCAweDA4NzgsIDB4MDg3NCwgMHgwMWUzLCAweDAxZTQsIDB4MDFlNX0sCi0JewotCSA4NiwgNTQzMCwgMHg2MSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxZiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4YywgMHgwYiwgMHgwMCwgMHhhNiwgMHg4NSwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg5OSwgMHgwMCwgMHg4NSwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg3OSwgMHgwMCwgMHgwODgwLCAweDA4N2MsIDB4MDg3OCwgMHgwMWUyLCAweDAxZTMsIDB4MDFlNH0sCi0JewotCSA4OCwgNTQ0MCwgMHg1YSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyMCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4YiwgMHgwYiwgMHgwMCwgMHhhNiwgMHg4NCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg5OSwgMHgwMCwgMHg4NCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg3OSwgMHgwMCwgMHgwODg0LCAweDA4ODAsIDB4MDg3YywgMHgwMWUxLCAweDAxZTIsIDB4MDFlM30sCi0JewotCSA5MCwgNTQ1MCwgMHg1YSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyMSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4YiwgMHgwYiwgMHgwMCwgMHg5NSwgMHg4NCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg5OSwgMHgwMCwgMHg4NCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg3OSwgMHgwMCwgMHgwODg4LCAweDA4ODQsIDB4MDg4MCwgMHgwMWUwLCAweDAxZTEsIDB4MDFlMn0sCi0JewotCSA5MiwgNTQ2MCwgMHg1MywgMHgwMSwgMHgwMSwgMHgwMiwgMHgyMiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4YiwgMHgwYiwgMHgwMCwgMHg5NSwgMHg4NCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNCwgMHgwMCwgMHg5OSwgMHgwMCwgMHg4NCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNCwKLQkgMHgwMCwgMHg3OSwgMHgwMCwgMHgwODhjLCAweDA4ODgsIDB4MDg4NCwgMHgwMWRmLCAweDAxZTAsIDB4MDFlMX0sCi0JewotCSA5NCwgNTQ3MCwgMHg1MywgMHgwMSwgMHgwMSwgMHgwMiwgMHgyMywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4YiwgMHgwYiwgMHgwMCwgMHg5NCwgMHg3NCwgMHgwMCwgMHgwMSwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNCwgMHgwMCwgMHg5OSwgMHgwMCwgMHg3NCwgMHgwMCwgMHgwMSwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNCwKLQkgMHgwMCwgMHg3OSwgMHgwMCwgMHgwODkwLCAweDA4OGMsIDB4MDg4OCwgMHgwMWRlLCAweDAxZGYsIDB4MDFlMH0sCi0JewotCSA5NiwgNTQ4MCwgMHg0ZCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyNCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4YSwgMHgwYSwgMHgwMCwgMHg4NCwgMHg3MywgMHgwMCwgMHgwMSwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNCwgMHgwMCwgMHg5OCwgMHgwMCwgMHg3MywgMHgwMCwgMHgwMSwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNCwKLQkgMHgwMCwgMHg3OCwgMHgwMCwgMHgwODk0LCAweDA4OTAsIDB4MDg4YywgMHgwMWRkLCAweDAxZGUsIDB4MDFkZn0sCi0JewotCSA5OCwgNTQ5MCwgMHg0ZCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyNSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4YSwgMHgwYSwgMHgwMCwgMHg4MywgMHg3MywgMHgwMCwgMHgwMSwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNCwgMHgwMCwgMHg5OCwgMHgwMCwgMHg3MywgMHgwMCwgMHgwMSwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNCwKLQkgMHgwMCwgMHg3OCwgMHgwMCwgMHgwODk4LCAweDA4OTQsIDB4MDg5MCwgMHgwMWRkLCAweDAxZGQsIDB4MDFkZX0sCi0JewotCSAxMDAsIDU1MDAsIDB4NDcsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGEsIDB4MGEsIDB4MDAsIDB4ODIsIDB4NzMsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDQsIDB4MDAsIDB4OTgsIDB4MDAsIDB4NzMsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDQsCi0JIDB4MDAsIDB4NzgsIDB4MDAsIDB4MDg5YywgMHgwODk4LCAweDA4OTQsIDB4MDFkYywgMHgwMWRkLCAweDAxZGR9LAotCXsKLQkgMTAyLCA1NTEwLCAweDQ3LCAweDAxLCAweDAxLCAweDAyLCAweDI3LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhhLCAweDBhLCAweDAwLCAweDgyLCAweDczLCAweDAwLCAweDAxLCAweDAwLCAweDcwLAotCSAweDAwLCAweDA0LCAweDAwLCAweDk4LCAweDAwLCAweDczLCAweDAwLCAweDAxLCAweDAwLCAweDcwLCAweDAwLCAweDA0LAotCSAweDAwLCAweDc4LCAweDAwLCAweDA4YTAsIDB4MDg5YywgMHgwODk4LCAweDAxZGIsIDB4MDFkYywgMHgwMWRkfSwKLQl7Ci0JIDEwNCwgNTUyMCwgMHg0MCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyOCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4YSwgMHgwYSwgMHgwMCwgMHg3MiwgMHg3MywgMHgwMCwgMHgwMSwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwNCwgMHgwMCwgMHg5OCwgMHgwMCwgMHg3MywgMHgwMCwgMHgwMSwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNCwKLQkgMHgwMCwgMHg3OCwgMHgwMCwgMHgwOGE0LCAweDA4YTAsIDB4MDg5YywgMHgwMWRhLCAweDAxZGIsIDB4MDFkY30sCi0JewotCSAxMDYsIDU1MzAsIDB4NDAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjksIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGEsIDB4MDksIDB4MDAsIDB4NzIsIDB4NjMsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDMsIDB4MDAsIDB4OTgsIDB4MDAsIDB4NjMsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDMsCi0JIDB4MDAsIDB4NzgsIDB4MDAsIDB4MDhhOCwgMHgwOGE0LCAweDA4YTAsIDB4MDFkOSwgMHgwMWRhLCAweDAxZGJ9LAotCXsKLQkgMTA4LCA1NTQwLCAweDNhLCAweDAxLCAweDAxLCAweDAyLCAweDJhLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhhLCAweDA5LCAweDAwLCAweDcxLCAweDYyLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAzLCAweDAwLCAweDk3LCAweDAwLCAweDYyLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAzLAotCSAweDAwLCAweDc3LCAweDAwLCAweDA4YWMsIDB4MDhhOCwgMHgwOGE0LCAweDAxZDgsIDB4MDFkOSwgMHgwMWRhfSwKLQl7Ci0JIDExMCwgNTU1MCwgMHgzYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyYiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4OSwgMHgwOSwgMHgwMCwgMHg2MSwgMHg2MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMywgMHgwMCwgMHg5NywgMHgwMCwgMHg2MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMywKLQkgMHgwMCwgMHg3NywgMHgwMCwgMHgwOGIwLCAweDA4YWMsIDB4MDhhOCwgMHgwMWQ3LCAweDAxZDgsIDB4MDFkOX0sCi0JewotCSAxMTIsIDU1NjAsIDB4MzQsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MmMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4ODksIDB4MDksIDB4MDAsIDB4NjEsIDB4NjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDMsIDB4MDAsIDB4OTcsIDB4MDAsIDB4NjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDMsCi0JIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDhiNCwgMHgwOGIwLCAweDA4YWMsIDB4MDFkNywgMHgwMWQ3LCAweDAxZDh9LAotCXsKLQkgMTE0LCA1NTcwLCAweDM0LCAweDAxLCAweDAxLCAweDAyLCAweDJkLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDg5LCAweDA5LCAweDAwLCAweDYxLCAweDUyLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAyLCAweDAwLCAweDk2LCAweDAwLCAweDUyLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAyLAotCSAweDAwLCAweDc2LCAweDAwLCAweDA4YjgsIDB4MDhiNCwgMHgwOGIwLCAweDAxZDYsIDB4MDFkNywgMHgwMWQ3fSwKLQl7Ci0JIDExNiwgNTU4MCwgMHgyZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyZSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4OSwgMHgwOCwgMHgwMCwgMHg2MCwgMHg1MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg1MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMiwKLQkgMHgwMCwgMHg4NiwgMHgwMCwgMHgwOGJjLCAweDA4YjgsIDB4MDhiNCwgMHgwMWQ1LCAweDAxZDYsIDB4MDFkN30sCi0JewotCSAxMTgsIDU1OTAsIDB4MmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MmYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4ODksIDB4MDgsIDB4MDAsIDB4NTAsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDIsIDB4MDAsIDB4OTYsIDB4MDAsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDIsCi0JIDB4MDAsIDB4ODYsIDB4MDAsIDB4MDhjMCwgMHgwOGJjLCAweDA4YjgsIDB4MDFkNCwgMHgwMWQ1LCAweDAxZDZ9LAotCXsKLQkgMTIwLCA1NjAwLCAweDI4LCAweDAxLCAweDAxLCAweDAyLCAweDMwLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg5LCAweDA4LCAweDAwLCAweDUwLCAweDUxLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAyLCAweDAwLCAweDk2LCAweDAwLCAweDUxLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAyLAotCSAweDAwLCAweDg2LCAweDAwLCAweDA4YzQsIDB4MDhjMCwgMHgwOGJjLCAweDAxZDMsIDB4MDFkNCwgMHgwMWQ1fSwKLQl7Ci0JIDEyMiwgNTYxMCwgMHgyOCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzMSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4OSwgMHgwOCwgMHgwMCwgMHg1MCwgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMiwgMHgwMCwgMHg5NiwgMHgwMCwgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMiwKLQkgMHgwMCwgMHg4NiwgMHgwMCwgMHgwOGM4LCAweDA4YzQsIDB4MDhjMCwgMHgwMWQyLCAweDAxZDMsIDB4MDFkNH0sCi0JewotCSAxMjQsIDU2MjAsIDB4MjEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODksIDB4MDgsIDB4MDAsIDB4NTAsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDIsIDB4MDAsIDB4OTYsIDB4MDAsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDIsCi0JIDB4MDAsIDB4ODYsIDB4MDAsIDB4MDhjYywgMHgwOGM4LCAweDA4YzQsIDB4MDFkMiwgMHgwMWQyLCAweDAxZDN9LAotCXsKLQkgMTI2LCA1NjMwLCAweDIxLCAweDAxLCAweDAxLCAweDAyLCAweDMzLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg4LCAweDA3LCAweDAwLCAweDUwLCAweDUxLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAyLCAweDAwLCAweDk2LCAweDAwLCAweDUxLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAyLAotCSAweDAwLCAweDg2LCAweDAwLCAweDA4ZDAsIDB4MDhjYywgMHgwOGM4LCAweDAxZDEsIDB4MDFkMiwgMHgwMWQyfSwKLQl7Ci0JIDEyOCwgNTY0MCwgMHgxYywgMHgwMSwgMHgwMSwgMHgwMiwgMHgzNCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4OCwgMHgwNywgMHgwMCwgMHg0MCwgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMiwgMHgwMCwgMHg5NSwgMHgwMCwgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMiwKLQkgMHgwMCwgMHg4NSwgMHgwMCwgMHgwOGQ0LCAweDA4ZDAsIDB4MDhjYywgMHgwMWQwLCAweDAxZDEsIDB4MDFkMn0sCi0JewotCSAxMzAsIDU2NTAsIDB4MWMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODgsIDB4MDcsIDB4MDAsIDB4NDAsIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDEsIDB4MDAsIDB4OTUsIDB4MDAsIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDEsCi0JIDB4MDAsIDB4ODUsIDB4MDAsIDB4MDhkOCwgMHgwOGQ0LCAweDA4ZDAsIDB4MDFjZiwgMHgwMWQwLCAweDAxZDF9LAotCXsKLQkgMTMyLCA1NjYwLCAweDE2LCAweDAxLCAweDAxLCAweDAyLCAweDM2LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg4LCAweDA3LCAweDAwLCAweDQwLCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAxLCAweDAwLCAweDk1LCAweDAwLCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAxLAotCSAweDAwLCAweDg1LCAweDAwLCAweDA4ZGMsIDB4MDhkOCwgMHgwOGQ0LCAweDAxY2UsIDB4MDFjZiwgMHgwMWQwfSwKLQl7Ci0JIDEzNCwgNTY3MCwgMHgxNiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzNywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4OCwgMHgwNywgMHgwMCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMSwgMHgwMCwgMHg5NCwgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMSwKLQkgMHgwMCwgMHg4NCwgMHgwMCwgMHgwOGUwLCAweDA4ZGMsIDB4MDhkOCwgMHgwMWNlLCAweDAxY2UsIDB4MDFjZn0sCi0JewotCSAxMzYsIDU2ODAsIDB4MTAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzgsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODcsIDB4MDYsIDB4MDAsIDB4MzAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDEsIDB4MDAsIDB4OTQsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDEsCi0JIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDhlNCwgMHgwOGUwLCAweDA4ZGMsIDB4MDFjZCwgMHgwMWNlLCAweDAxY2V9LAotCXsKLQkgMTM4LCA1NjkwLCAweDEwLCAweDAxLCAweDAxLCAweDAyLCAweDM5LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg3LCAweDA2LCAweDAwLCAweDMwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAxLCAweDAwLCAweDk0LCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAxLAotCSAweDAwLCAweDk0LCAweDAwLCAweDA4ZTgsIDB4MDhlNCwgMHgwOGUwLCAweDAxY2MsIDB4MDFjZCwgMHgwMWNlfSwKLQl7Ci0JIDE0MCwgNTcwMCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzYSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NywgMHgwNiwgMHgwMCwgMHgzMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMSwgMHgwMCwgMHg5NCwgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMSwKLQkgMHgwMCwgMHg5NCwgMHgwMCwgMHgwOGVjLCAweDA4ZTgsIDB4MDhlNCwgMHgwMWNiLCAweDAxY2MsIDB4MDFjZH0sCi0JewotCSAxNDIsIDU3MTAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4M2IsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODcsIDB4MDYsIDB4MDAsIDB4MzAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDEsIDB4MDAsIDB4OTQsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDEsCi0JIDB4MDAsIDB4OTQsIDB4MDAsIDB4MDhmMCwgMHgwOGVjLCAweDA4ZTgsIDB4MDFjYSwgMHgwMWNiLCAweDAxY2N9LAotCXsKLQkgMTQ0LCA1NzIwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDNjLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg3LCAweDA2LCAweDAwLCAweDMwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAxLCAweDAwLCAweDk0LCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAxLAotCSAweDAwLCAweDk0LCAweDAwLCAweDA4ZjQsIDB4MDhmMCwgMHgwOGVjLCAweDAxYzksIDB4MDFjYSwgMHgwMWNifSwKLQl7Ci0JIDE0NSwgNTcyNSwgMHgwMywgMHgwMSwgMHgwMiwgMHgwNCwgMHg3OSwgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NywgMHgwNiwgMHgwMCwgMHgzMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMSwgMHgwMCwgMHg5NCwgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMSwKLQkgMHgwMCwgMHg5NCwgMHgwMCwgMHgwOGY2LCAweDA4ZjIsIDB4MDhlZSwgMHgwMWM5LCAweDAxY2EsIDB4MDFjYn0sCi0JewotCSAxNDYsIDU3MzAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4M2QsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODcsIDB4MDUsIDB4MDAsIDB4MjAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDEsIDB4MDAsIDB4OTQsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDEsCi0JIDB4MDAsIDB4OTQsIDB4MDAsIDB4MDhmOCwgMHgwOGY0LCAweDA4ZjAsIDB4MDFjOSwgMHgwMWM5LCAweDAxY2F9LAotCXsKLQkgMTQ3LCA1NzM1LCAweDAzLCAweDAxLCAweDAyLCAweDA0LCAweDdiLCAweDA3LCAweDA3LCAweDA0LCAweDEwLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg3LCAweDA1LCAweDAwLCAweDIwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDkzLCAweDAwLCAweDA4ZmEsIDB4MDhmNiwgMHgwOGYyLCAweDAxYzgsIDB4MDFjOSwgMHgwMWNhfSwKLQl7Ci0JIDE0OCwgNTc0MCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzZSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NywgMHgwNSwgMHgwMCwgMHgyMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg5MywgMHgwMCwgMHgwOGZjLCAweDA4ZjgsIDB4MDhmNCwgMHgwMWM4LCAweDAxYzksIDB4MDFjOX0sCi0JewotCSAxNDksIDU3NDUsIDB4ZmUsIDB4MDAsIDB4MDIsIDB4MDQsIDB4N2QsIDB4MDcsIDB4MDcsIDB4MDQsIDB4MTAsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODcsIDB4MDUsIDB4MDAsIDB4MjAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4OTMsIDB4MDAsIDB4MDhmZSwgMHgwOGZhLCAweDA4ZjYsIDB4MDFjOCwgMHgwMWM4LCAweDAxYzl9LAotCXsKLQkgMTUwLCA1NzUwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDNmLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg3LCAweDA1LCAweDAwLCAweDIwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDkzLCAweDAwLCAweDA5MDAsIDB4MDhmYywgMHgwOGY4LCAweDAxYzcsIDB4MDFjOCwgMHgwMWM5fSwKLQl7Ci0JIDE1MSwgNTc1NSwgMHhmZSwgMHgwMCwgMHgwMiwgMHgwNCwgMHg3ZiwgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NywgMHgwNSwgMHgwMCwgMHgxMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg5MywgMHgwMCwgMHgwOTAyLCAweDA4ZmUsIDB4MDhmYSwgMHgwMWM3LCAweDAxYzgsIDB4MDFjOH0sCi0JewotCSAxNTIsIDU3NjAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDAsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODYsIDB4MDUsIDB4MDAsIDB4MTAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4OTMsIDB4MDAsIDB4MDkwNCwgMHgwOTAwLCAweDA4ZmMsIDB4MDFjNiwgMHgwMWM3LCAweDAxYzh9LAotCXsKLQkgMTUzLCA1NzY1LCAweGY4LCAweDAwLCAweDAyLCAweDA0LCAweDgxLCAweDA3LCAweDA3LCAweDA0LCAweDEwLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg2LCAweDA1LCAweDAwLCAweDEwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDAwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDkyLCAweDAwLCAweDA5MDYsIDB4MDkwMiwgMHgwOGZlLCAweDAxYzYsIDB4MDFjNywgMHgwMWM4fSwKLQl7Ci0JIDE1NCwgNTc3MCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHg0MSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NiwgMHgwNCwgMHgwMCwgMHgxMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg5MiwgMHgwMCwgMHgwOTA4LCAweDA5MDQsIDB4MDkwMCwgMHgwMWM2LCAweDAxYzYsIDB4MDFjN30sCi0JewotCSAxNTUsIDU3NzUsIDB4ZjgsIDB4MDAsIDB4MDIsIDB4MDQsIDB4ODMsIDB4MDcsIDB4MDcsIDB4MDQsIDB4MTAsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODYsIDB4MDQsIDB4MDAsIDB4MTAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4OTIsIDB4MDAsIDB4MDkwYSwgMHgwOTA2LCAweDA5MDIsIDB4MDFjNSwgMHgwMWM2LCAweDAxYzd9LAotCXsKLQkgMTU2LCA1NzgwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQyLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg2LCAweDA0LCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDkyLCAweDAwLCAweDA5MGMsIDB4MDkwOCwgMHgwOTA0LCAweDAxYzUsIDB4MDFjNiwgMHgwMWM2fSwKLQl7Ci0JIDE1NywgNTc4NSwgMHhmMiwgMHgwMCwgMHgwMiwgMHgwNCwgMHg4NSwgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NiwgMHgwNCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg5MiwgMHgwMCwgMHgwOTBlLCAweDA5MGEsIDB4MDkwNiwgMHgwMWM0LCAweDAxYzUsIDB4MDFjNn0sCi0JewotCSAxNTgsIDU3OTAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4OTIsIDB4MDAsIDB4MDkxMCwgMHgwOTBjLCAweDA5MDgsIDB4MDFjNCwgMHgwMWM1LCAweDAxYzZ9LAotCXsKLQkgMTU5LCA1Nzk1LCAweGYyLCAweDAwLCAweDAyLCAweDA0LCAweDg3LCAweDA3LCAweDA3LCAweDA0LCAweDEwLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg2LCAweDA0LCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDkyLCAweDAwLCAweDA5MTIsIDB4MDkwZSwgMHgwOTBhLCAweDAxYzQsIDB4MDFjNCwgMHgwMWM1fSwKLQl7Ci0JIDE2MCwgNTgwMCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHg0NCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NiwgMHgwNCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg5MiwgMHgwMCwgMHgwOTE0LCAweDA5MTAsIDB4MDkwYywgMHgwMWMzLCAweDAxYzQsIDB4MDFjNX0sCi0JewotCSAxNjEsIDU4MDUsIDB4ZWQsIDB4MDAsIDB4MDIsIDB4MDQsIDB4ODksIDB4MDcsIDB4MDcsIDB4MDQsIDB4MTAsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4OTIsIDB4MDAsIDB4MDkxNiwgMHgwOTEyLCAweDA5MGUsIDB4MDFjMywgMHgwMWM0LCAweDAxYzR9LAotCXsKLQkgMTYyLCA1ODEwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQ1LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg2LCAweDA0LCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDkyLCAweDAwLCAweDA5MTgsIDB4MDkxNCwgMHgwOTEwLCAweDAxYzIsIDB4MDFjMywgMHgwMWM0fSwKLQl7Ci0JIDE2MywgNTgxNSwgMHhlZCwgMHgwMCwgMHgwMiwgMHgwNCwgMHg4YiwgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NiwgMHgwNCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg5MiwgMHgwMCwgMHgwOTFhLCAweDA5MTYsIDB4MDkxMiwgMHgwMWMyLCAweDAxYzMsIDB4MDFjNH0sCi0JewotCSAxNjQsIDU4MjAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4OTIsIDB4MDAsIDB4MDkxYywgMHgwOTE4LCAweDA5MTQsIDB4MDFjMiwgMHgwMWMyLCAweDAxYzN9LAotCXsKLQkgMTY1LCA1ODI1LCAweGVkLCAweDAwLCAweDAyLCAweDA0LCAweDhkLCAweDA3LCAweDA3LCAweDA0LCAweDEwLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg2LCAweDA0LCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDkyLCAweDAwLCAweDA5MWUsIDB4MDkxYSwgMHgwOTE2LCAweDAxYzEsIDB4MDFjMiwgMHgwMWMzfSwKLQl7Ci0JIDE2NiwgNTgzMCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHg0NywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NiwgMHgwNCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg5MiwgMHgwMCwgMHgwOTIwLCAweDA5MWMsIDB4MDkxOCwgMHgwMWMxLCAweDAxYzIsIDB4MDFjMn0sCi0JewotCSAxNjgsIDU4NDAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDgsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4OTIsIDB4MDAsIDB4MDkyNCwgMHgwOTIwLCAweDA5MWMsIDB4MDFjMCwgMHgwMWMxLCAweDAxYzJ9LAotCXsKLQkgMTcwLCA1ODUwLCAweGUwLCAweDAwLCAweDAxLCAweDAyLCAweDQ5LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg1LCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDkyLCAweDAwLCAweDA5MjgsIDB4MDkyNCwgMHgwOTIwLCAweDAxYmYsIDB4MDFjMCwgMHgwMWMxfSwKLQl7Ci0JIDE3MiwgNTg2MCwgMHhkZSwgMHgwMCwgMHgwMSwgMHgwMiwgMHg0YSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg5MiwgMHgwMCwgMHgwOTJjLCAweDA5MjgsIDB4MDkyNCwgMHgwMWJmLCAweDAxYmYsIDB4MDFjMH0sCi0JewotCSAxNzQsIDU4NzAsIDB4ZGIsIDB4MDAsIDB4MDEsIDB4MDIsIDB4NGIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODUsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4OTEsIDB4MDAsIDB4MDkzMCwgMHgwOTJjLCAweDA5MjgsIDB4MDFiZSwgMHgwMWJmLCAweDAxYmZ9LAotCXsKLQkgMTc2LCA1ODgwLCAweGQ4LCAweDAwLCAweDAxLCAweDAyLCAweDRjLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg1LCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDkxLCAweDAwLCAweDA5MzQsIDB4MDkzMCwgMHgwOTJjLCAweDAxYmQsIDB4MDFiZSwgMHgwMWJmfSwKLQl7Ci0JIDE3OCwgNTg5MCwgMHhkNiwgMHgwMCwgMHgwMSwgMHgwMiwgMHg0ZCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHg5MSwgMHgwMCwgMHgwOTM4LCAweDA5MzQsIDB4MDkzMCwgMHgwMWJjLCAweDAxYmQsIDB4MDFiZX0sCi0JewotCSAxODAsIDU5MDAsIDB4ZDMsIDB4MDAsIDB4MDEsIDB4MDIsIDB4NGUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODUsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4OTEsIDB4MDAsIDB4MDkzYywgMHgwOTM4LCAweDA5MzQsIDB4MDFiYywgMHgwMWJjLCAweDAxYmR9LAotCXsKLQkgMTgyLCA1OTEwLCAweGQ2LCAweDAwLCAweDAxLCAweDAyLCAweDRmLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg1LCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDkxLCAweDAwLCAweDA5NDAsIDB4MDkzYywgMHgwOTM4LCAweDAxYmIsIDB4MDFiYywgMHgwMWJjfSwKLQl7Ci0JIDEsIDI0MTIsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4NmMsIDB4MDgsIDB4MDgsIDB4MDQsIDB4MTYsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4MDAsIDB4MDMsIDB4MDAsCi0JIDB4NzAsIDB4MDAsIDB4MGYsIDB4MDAsIDB4MGIsIDB4MDAsIDB4ODksIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsIDB4MDAsCi0JIDB4MGYsIDB4MDAsIDB4MGIsIDB4MDNjOSwgMHgwM2M1LCAweDAzYzEsIDB4MDQzYSwgMHgwNDNmLCAweDA0NDN9LAotCXsKLQkgMiwgMjQxNywgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg3MSwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHgwMCwgMHgwMywgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwZiwgMHgwMCwgMHgwYSwgMHgwMCwgMHg4OSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwZiwgMHgwMCwgMHgwYSwgMHgwM2NiLCAweDAzYzcsIDB4MDNjMywgMHgwNDM4LCAweDA0M2QsIDB4MDQ0MX0sCi0JewotCSAzLCAyNDIyLCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDc2LCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweDAwLCAweDAzLCAweDAwLAotCSAweDcwLCAweDAwLCAweDBmLCAweDAwLCAweDBhLCAweDAwLCAweDg5LCAweDAwLCAweDAzLCAweDAwLCAweDcwLCAweDAwLAotCSAweDBmLCAweDAwLCAweDBhLCAweDAzY2QsIDB4MDNjOSwgMHgwM2M1LCAweDA0MzYsIDB4MDQzYSwgMHgwNDNmfSwKLQl7Ci0JIDQsIDI0MjcsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4N2IsIDB4MDgsIDB4MDgsIDB4MDQsIDB4MTYsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzgsIDB4MDAsIDB4MDMsIDB4MDAsCi0JIDB4NzAsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MGEsIDB4MDAsIDB4NzgsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsIDB4MDAsCi0JIDB4MGUsIDB4MDAsIDB4MGEsIDB4MDNjZiwgMHgwM2NiLCAweDAzYzcsIDB4MDQzNCwgMHgwNDM4LCAweDA0M2R9LAotCXsKLQkgNSwgMjQzMiwgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg4MCwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwMywgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwZSwgMHgwMCwgMHgwYSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwZSwgMHgwMCwgMHgwYSwgMHgwM2QxLCAweDAzY2QsIDB4MDNjOSwgMHgwNDMxLCAweDA0MzYsIDB4MDQzYX0sCi0JewotCSA2LCAyNDM3LCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDg1LCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc2LCAweDAwLCAweDAzLCAweDAwLAotCSAweDcwLCAweDAwLCAweDBlLCAweDAwLCAweDBhLCAweDAwLCAweDc2LCAweDAwLCAweDAzLCAweDAwLCAweDcwLCAweDAwLAotCSAweDBlLCAweDAwLCAweDBhLCAweDAzZDMsIDB4MDNjZiwgMHgwM2NiLCAweDA0MmYsIDB4MDQzNCwgMHgwNDM4fSwKLQl7Ci0JIDcsIDI0NDIsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4OGEsIDB4MDgsIDB4MDgsIDB4MDQsIDB4MTYsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjYsIDB4MDAsIDB4MDMsIDB4MDAsCi0JIDB4NzAsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MGEsIDB4MDAsIDB4NjYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsIDB4MDAsCi0JIDB4MGUsIDB4MDAsIDB4MGEsIDB4MDNkNSwgMHgwM2QxLCAweDAzY2QsIDB4MDQyZCwgMHgwNDMxLCAweDA0MzZ9LAotCXsKLQkgOCwgMjQ0NywgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg4ZiwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1NSwgMHgwMCwgMHgwMiwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg1NSwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwZSwgMHgwMCwgMHgwOSwgMHgwM2Q3LCAweDAzZDMsIDB4MDNjZiwgMHgwNDJiLCAweDA0MmYsIDB4MDQzNH0sCi0JewotCSA5LCAyNDUyLCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDk0LCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDQ1LCAweDAwLCAweDAyLCAweDAwLAotCSAweDcwLCAweDAwLCAweDBlLCAweDAwLCAweDA5LCAweDAwLCAweDQ1LCAweDAwLCAweDAyLCAweDAwLCAweDcwLCAweDAwLAotCSAweDBlLCAweDAwLCAweDA5LCAweDAzZDksIDB4MDNkNSwgMHgwM2QxLCAweDA0MjksIDB4MDQyZCwgMHgwNDMxfSwKLQl7Ci0JIDEwLCAyNDU3LCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDk5LCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDM0LCAweDAwLCAweDAyLCAweDAwLAotCSAweDcwLCAweDAwLCAweDBkLCAweDAwLCAweDA5LCAweDAwLCAweDM0LCAweDAwLCAweDAyLCAweDAwLCAweDcwLCAweDAwLAotCSAweDBkLCAweDAwLCAweDA5LCAweDAzZGIsIDB4MDNkNywgMHgwM2QzLCAweDA0MjcsIDB4MDQyYiwgMHgwNDJmfSwKLQl7Ci0JIDExLCAyNDYyLCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDllLCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDMzLCAweDAwLCAweDAyLCAweDAwLAotCSAweDcwLCAweDAwLCAweDBkLCAweDAwLCAweDA5LCAweDAwLCAweDMzLCAweDAwLCAweDAyLCAweDAwLCAweDcwLCAweDAwLAotCSAweDBkLCAweDAwLCAweDA5LCAweDAzZGQsIDB4MDNkOSwgMHgwM2Q1LCAweDA0MjQsIDB4MDQyOSwgMHgwNDJkfSwKLQl7Ci0JIDEyLCAyNDY3LCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweGEzLCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDAyLCAweDAwLAotCSAweDcwLCAweDAwLCAweDBkLCAweDAwLCAweDA4LCAweDAwLCAweDIyLCAweDAwLCAweDAyLCAweDAwLCAweDcwLCAweDAwLAotCSAweDBkLCAweDAwLCAweDA4LCAweDAzZGYsIDB4MDNkYiwgMHgwM2Q3LCAweDA0MjIsIDB4MDQyNywgMHgwNDJifSwKLQl7Ci0JIDEzLCAyNDcyLCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweGE4LCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA3LCAweDA3LCAweDA3LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDExLCAweDAwLCAweDAyLCAweDAwLAotCSAweDcwLCAweDAwLCAweDBkLCAweDAwLCAweDA4LCAweDAwLCAweDExLCAweDAwLCAweDAyLCAweDAwLCAweDcwLCAweDAwLAotCSAweDBkLCAweDAwLCAweDA4LCAweDAzZTEsIDB4MDNkZCwgMHgwM2Q5LCAweDA0MjAsIDB4MDQyNCwgMHgwNDI5fSwKLQl7Ci0JIDE0LCAyNDg0LCAweGZmLCAweDAxLCAweDAzLCAweDA5LCAweGI0LCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA3LCAweDA3LCAweDA3LCAweDhmLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLAotCSAweDcwLCAweDAwLCAweDBkLCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDcwLCAweDAwLAotCSAweDBkLCAweDAwLCAweDA4LCAweDAzZTYsIDB4MDNlMiwgMHgwM2RlLCAweDA0MWIsIDB4MDQxZiwgMHgwNDI0fQotfTsKLQotc3RhdGljIHN0cnVjdCBjaGFuX2luZm9fbnBoeV9yYWRpbzIwNXggY2hhbl9pbmZvX25waHlyZXY2XzIwNTZ2OFtdID0gewotCXsKLQkgMTg0LCA0OTIwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGVjLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAwLCAweDAwLCAweDAwLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAotCSAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3YjQsIDB4MDdiMCwgMHgwN2FjLCAweDAyMTQsIDB4MDIxNSwgMHgwMjE2fSwKLQl7Ci0JIDE4NiwgNDkzMCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhlZCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2I4LCAweDA3YjQsIDB4MDdiMCwgMHgwMjEzLCAweDAyMTQsIDB4MDIxNX0sCi0JewotCSAxODgsIDQ5NDAsIDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZWUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdiYywgMHgwN2I4LCAweDA3YjQsIDB4MDIxMiwgMHgwMjEzLCAweDAyMTR9LAotCXsKLQkgMTkwLCA0OTUwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGVmLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAwLCAweDAwLCAweDAwLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAotCSAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3YzAsIDB4MDdiYywgMHgwN2I4LCAweDAyMTEsIDB4MDIxMiwgMHgwMjEzfSwKLQl7Ci0JIDE5MiwgNDk2MCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmMCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2M0LCAweDA3YzAsIDB4MDdiYywgMHgwMjBmLCAweDAyMTEsIDB4MDIxMn0sCi0JewotCSAxOTQsIDQ5NzAsIDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdjOCwgMHgwN2M0LCAweDA3YzAsIDB4MDIwZSwgMHgwMjBmLCAweDAyMTF9LAotCXsKLQkgMTk2LCA0OTgwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGYyLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAotCSAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3Y2MsIDB4MDdjOCwgMHgwN2M0LCAweDAyMGQsIDB4MDIwZSwgMHgwMjBmfSwKLQl7Ci0JIDE5OCwgNDk5MCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmMywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2QwLCAweDA3Y2MsIDB4MDdjOCwgMHgwMjBjLCAweDAyMGQsIDB4MDIwZX0sCi0JewotCSAyMDAsIDUwMDAsIDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdkNCwgMHgwN2QwLCAweDA3Y2MsIDB4MDIwYiwgMHgwMjBjLCAweDAyMGR9LAotCXsKLQkgMjAyLCA1MDEwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGY1LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAotCSAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3ZDgsIDB4MDdkNCwgMHgwN2QwLCAweDAyMGEsIDB4MDIwYiwgMHgwMjBjfSwKLQl7Ci0JIDIwNCwgNTAyMCwgMHhmNywgMHgwMSwgMHgwMSwgMHgwMSwgMHhmNiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2RjLCAweDA3ZDgsIDB4MDdkNCwgMHgwMjA5LCAweDAyMGEsIDB4MDIwYn0sCi0JewotCSAyMDYsIDUwMzAsIDB4ZjcsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjcsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdlMCwgMHgwN2RjLCAweDA3ZDgsIDB4MDIwOCwgMHgwMjA5LCAweDAyMGF9LAotCXsKLQkgMjA4LCA1MDQwLCAweGVmLCAweDAxLCAweDAxLCAweDAxLCAweGY4LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAotCSAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3ZTQsIDB4MDdlMCwgMHgwN2RjLCAweDAyMDcsIDB4MDIwOCwgMHgwMjA5fSwKLQl7Ci0JIDIxMCwgNTA1MCwgMHhlZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmOSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2U4LCAweDA3ZTQsIDB4MDdlMCwgMHgwMjA2LCAweDAyMDcsIDB4MDIwOH0sCi0JewotCSAyMTIsIDUwNjAsIDB4ZTYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZmEsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdlYywgMHgwN2U4LCAweDA3ZTQsIDB4MDIwNSwgMHgwMjA2LCAweDAyMDd9LAotCXsKLQkgMjE0LCA1MDcwLCAweGU2LCAweDAxLCAweDAxLCAweDAxLCAweGZiLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZkLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAotCSAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwLCAweGZkLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3ZjAsIDB4MDdlYywgMHgwN2U4LCAweDAyMDQsIDB4MDIwNSwgMHgwMjA2fSwKLQl7Ci0JIDIxNiwgNTA4MCwgMHhkZSwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmYywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZCwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZCwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2Y0LCAweDA3ZjAsIDB4MDdlYywgMHgwMjAzLCAweDAyMDQsIDB4MDIwNX0sCi0JewotCSAyMTgsIDUwOTAsIDB4ZGUsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZmQsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmQsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmQsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdmOCwgMHgwN2Y0LCAweDA3ZjAsIDB4MDIwMiwgMHgwMjAzLCAweDAyMDR9LAotCXsKLQkgMjIwLCA1MTAwLCAweGQ2LCAweDAxLCAweDAxLCAweDAxLCAweGZlLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAyLCAweDAyLCAweDAyLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZkLCAweDAwLCAweDA4LCAweDAwLCAweDc3LAotCSAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwLCAweGZkLCAweDAwLCAweDA4LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3ZmMsIDB4MDdmOCwgMHgwN2Y0LCAweDAyMDEsIDB4MDIwMiwgMHgwMjAzfSwKLQl7Ci0JIDIyMiwgNTExMCwgMHhkNiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmZiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmYywgMHgwMCwgMHgwOCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmYywgMHgwMCwgMHgwOCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODAwLCAweDA3ZmMsIDB4MDdmOCwgMHgwMjAwLCAweDAyMDEsIDB4MDIwMn0sCi0JewotCSAyMjQsIDUxMjAsIDB4Y2UsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgwNCwgMHgwODAwLCAweDA3ZmMsIDB4MDFmZiwgMHgwMjAwLCAweDAyMDF9LAotCXsKLQkgMjI2LCA1MTMwLCAweGNlLCAweDAxLCAweDAxLCAweDAyLCAweDAxLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDAyLCAweDAyLCAweDAyLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZjLCAweDAwLCAweDA4LCAweDAwLCAweDc3LAotCSAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwLCAweGZjLCAweDAwLCAweDA4LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4MDgsIDB4MDgwNCwgMHgwODAwLCAweDAxZmUsIDB4MDFmZiwgMHgwMjAwfSwKLQl7Ci0JIDIyOCwgNTE0MCwgMHhjNiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwMiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmYiwgMHgwMCwgMHgwOCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmYiwgMHgwMCwgMHgwOCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODBjLCAweDA4MDgsIDB4MDgwNCwgMHgwMWZkLCAweDAxZmUsIDB4MDFmZn0sCi0JewotCSAzMiwgNTE2MCwgMHhiZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmYSwgMHgwMCwgMHgwNywgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmYSwgMHgwMCwgMHgwNywgMHgwMCwgMHg3NywgMHgwMCwgMHgwZSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODE0LCAweDA4MTAsIDB4MDgwYywgMHgwMWZiLCAweDAxZmMsIDB4MDFmZH0sCi0JewotCSAzNCwgNTE3MCwgMHhiZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwNSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmYSwgMHgwMCwgMHgwNywgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmYSwgMHgwMCwgMHgwNywgMHgwMCwgMHg3NywgMHgwMCwgMHgwZSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODE4LCAweDA4MTQsIDB4MDgxMCwgMHgwMWZhLCAweDAxZmIsIDB4MDFmY30sCi0JewotCSAzNiwgNTE4MCwgMHhiNiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwNiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmOSwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmOSwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODFjLCAweDA4MTgsIDB4MDgxNCwgMHgwMWY5LCAweDAxZmEsIDB4MDFmYn0sCi0JewotCSAzOCwgNTE5MCwgMHhiNiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwNywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmOSwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmOSwgMHgwMCwgMHgwNiwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZCwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODIwLCAweDA4MWMsIDB4MDgxOCwgMHgwMWY4LCAweDAxZjksIDB4MDFmYX0sCi0JewotCSA0MCwgNTIwMCwgMHhhZiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwOCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmOSwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmOSwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZCwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODI0LCAweDA4MjAsIDB4MDgxYywgMHgwMWY3LCAweDAxZjgsIDB4MDFmOX0sCi0JewotCSA0MiwgNTIxMCwgMHhhZiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwOSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmOSwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmOSwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZCwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODI4LCAweDA4MjQsIDB4MDgyMCwgMHgwMWY2LCAweDAxZjcsIDB4MDFmOH0sCi0JewotCSA0NCwgNTIyMCwgMHhhNywgMHgwMSwgMHgwMSwgMHgwMiwgMHgwYSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZSwgMHgwZiwgMHgwMCwgMHhmZSwgMHhkOCwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhkOCwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZCwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODJjLCAweDA4MjgsIDB4MDgyNCwgMHgwMWY1LCAweDAxZjYsIDB4MDFmN30sCi0JewotCSA0NiwgNTIzMCwgMHhhNywgMHgwMSwgMHgwMSwgMHgwMiwgMHgwYiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZSwgMHgwZiwgMHgwMCwgMHhlZSwgMHhkOCwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhkOCwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZCwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODMwLCAweDA4MmMsIDB4MDgyOCwgMHgwMWY0LCAweDAxZjUsIDB4MDFmNn0sCi0JewotCSA0OCwgNTI0MCwgMHhhMCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwYywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZSwgMHgwZiwgMHgwMCwgMHhlZSwgMHhjOCwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhjOCwgMHgwMCwgMHgwNSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZCwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODM0LCAweDA4MzAsIDB4MDgyYywgMHgwMWYzLCAweDAxZjQsIDB4MDFmNX0sCi0JewotCSA1MCwgNTI1MCwgMHhhMCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwZCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZSwgMHgwZiwgMHgwMCwgMHhlZCwgMHhjNywgMHgwMCwgMHgwNSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhjNywgMHgwMCwgMHgwNSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZCwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODM4LCAweDA4MzQsIDB4MDgzMCwgMHgwMWYyLCAweDAxZjMsIDB4MDFmNH0sCi0JewotCSA1MiwgNTI2MCwgMHg5OCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwZSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZSwgMHgwZSwgMHgwMCwgMHhlZCwgMHhjNywgMHgwMCwgMHgwNCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhjNywgMHgwMCwgMHgwNCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZCwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODNjLCAweDA4MzgsIDB4MDgzNCwgMHgwMWYxLCAweDAxZjIsIDB4MDFmM30sCi0JewotCSA1NCwgNTI3MCwgMHg5OCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwZiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZSwgMHgwZSwgMHgwMCwgMHhlZCwgMHhjNywgMHgwMCwgMHgwNCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwYywgMHgwMCwgMHg2ZiwgMHgwMCwgMHhjNywgMHgwMCwgMHgwNCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwYywKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODQwLCAweDA4M2MsIDB4MDgzOCwgMHgwMWYwLCAweDAxZjEsIDB4MDFmMn0sCi0JewotCSA1NiwgNTI4MCwgMHg5MSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxMCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZCwgMHgwZSwgMHgwMCwgMHhkYywgMHhiNywgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwYywgMHgwMCwgMHg2ZiwgMHgwMCwgMHhiNywgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywgMHgwMCwgMHgwYywKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODQ0LCAweDA4NDAsIDB4MDgzYywgMHgwMWYwLCAweDAxZjAsIDB4MDFmMX0sCi0JewotCSA1OCwgNTI5MCwgMHg5MSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxMSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZCwgMHgwZSwgMHgwMCwgMHhkYywgMHhiNywgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwYywgMHgwMCwgMHg2ZiwgMHgwMCwgMHhiNywgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywgMHgwMCwgMHgwYywKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODQ4LCAweDA4NDQsIDB4MDg0MCwgMHgwMWVmLCAweDAxZjAsIDB4MDFmMH0sCi0JewotCSA2MCwgNTMwMCwgMHg4YSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxMiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZCwgMHgwZSwgMHgwMCwgMHhkYywgMHhiNywgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwYywgMHgwMCwgMHg2ZiwgMHgwMCwgMHhiNywgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywgMHgwMCwgMHgwYywKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODRjLCAweDA4NDgsIDB4MDg0NCwgMHgwMWVlLCAweDAxZWYsIDB4MDFmMH0sCi0JewotCSA2MiwgNTMxMCwgMHg4YSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxMywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZCwgMHgwZSwgMHgwMCwgMHhkYywgMHhiNywgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwYywgMHgwMCwgMHg2ZiwgMHgwMCwgMHhiNywgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywgMHgwMCwgMHgwYywKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODUwLCAweDA4NGMsIDB4MDg0OCwgMHgwMWVkLCAweDAxZWUsIDB4MDFlZn0sCi0JewotCSA2NCwgNTMyMCwgMHg4MywgMHgwMSwgMHgwMSwgMHgwMiwgMHgxNCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZCwgMHgwZSwgMHgwMCwgMHhkYiwgMHhiNywgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwYywgMHgwMCwgMHg2ZiwgMHgwMCwgMHhiNywgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywgMHgwMCwgMHgwYywKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODU0LCAweDA4NTAsIDB4MDg0YywgMHgwMWVjLCAweDAxZWQsIDB4MDFlZX0sCi0JewotCSA2NiwgNTMzMCwgMHg4MywgMHgwMSwgMHgwMSwgMHgwMiwgMHgxNSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZCwgMHgwZCwgMHgwMCwgMHhjYiwgMHhhNiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhhNiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODU4LCAweDA4NTQsIDB4MDg1MCwgMHgwMWViLCAweDAxZWMsIDB4MDFlZH0sCi0JewotCSA2OCwgNTM0MCwgMHg3YywgMHgwMSwgMHgwMSwgMHgwMiwgMHgxNiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4ZCwgMHgwZCwgMHgwMCwgMHhjYSwgMHhhNiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhhNiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODVjLCAweDA4NTgsIDB4MDg1NCwgMHgwMWVhLCAweDAxZWIsIDB4MDFlY30sCi0JewotCSA3MCwgNTM1MCwgMHg3YywgMHgwMSwgMHgwMSwgMHgwMiwgMHgxNywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4YywgMHgwZCwgMHgwMCwgMHhjYSwgMHhhNiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhhNiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywgMHgwMCwgMHgwYiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODYwLCAweDA4NWMsIDB4MDg1OCwgMHgwMWU5LCAweDAxZWEsIDB4MDFlYn0sCi0JewotCSA3MiwgNTM2MCwgMHg3NSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxOCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4YywgMHgwZCwgMHgwMCwgMHhjOSwgMHg5NSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg5NSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODY0LCAweDA4NjAsIDB4MDg1YywgMHgwMWU4LCAweDAxZTksIDB4MDFlYX0sCi0JewotCSA3NCwgNTM3MCwgMHg3NSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxOSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4YywgMHgwZCwgMHgwMCwgMHhjOSwgMHg5NSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg5NSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODY4LCAweDA4NjQsIDB4MDg2MCwgMHgwMWU3LCAweDAxZTgsIDB4MDFlOX0sCi0JewotCSA3NiwgNTM4MCwgMHg2ZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxYSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4YywgMHgwYywgMHgwMCwgMHhiOCwgMHg5NSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg5NSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODZjLCAweDA4NjgsIDB4MDg2NCwgMHgwMWU2LCAweDAxZTcsIDB4MDFlOH0sCi0JewotCSA3OCwgNTM5MCwgMHg2ZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxYiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4YywgMHgwYywgMHgwMCwgMHhiOCwgMHg4NCwgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg4NCwgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODcwLCAweDA4NmMsIDB4MDg2OCwgMHgwMWU1LCAweDAxZTYsIDB4MDFlN30sCi0JewotCSA4MCwgNTQwMCwgMHg2NywgMHgwMSwgMHgwMSwgMHgwMiwgMHgxYywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4YywgMHgwYywgMHgwMCwgMHhiOCwgMHg4NCwgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg4NCwgMHgwMCwgMHgwMywgMHgwMCwgMHg3NywgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODc0LCAweDA4NzAsIDB4MDg2YywgMHgwMWU1LCAweDAxZTUsIDB4MDFlNn0sCi0JewotCSA4MiwgNTQxMCwgMHg2NywgMHgwMSwgMHgwMSwgMHgwMiwgMHgxZCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4YywgMHgwYywgMHgwMCwgMHhiNywgMHg4NCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg4NCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3NywgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODc4LCAweDA4NzQsIDB4MDg3MCwgMHgwMWU0LCAweDAxZTUsIDB4MDFlNX0sCi0JewotCSA4NCwgNTQyMCwgMHg2MSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxZSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4YywgMHgwYywgMHgwMCwgMHhhNywgMHg4NCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg4NCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3NywgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODdjLCAweDA4NzgsIDB4MDg3NCwgMHgwMWUzLCAweDAxZTQsIDB4MDFlNX0sCi0JewotCSA4NiwgNTQzMCwgMHg2MSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxZiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwMywgMHgwMywgMHgwMywgMHg4YywgMHgwYiwgMHgwMCwgMHhhNiwgMHg4NCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg4NCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3NywgMHgwMCwgMHgwYSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODgwLCAweDA4N2MsIDB4MDg3OCwgMHgwMWUyLCAweDAxZTMsIDB4MDFlNH0sCi0JewotCSA4OCwgNTQ0MCwgMHg1YSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyMCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4YiwgMHgwYiwgMHgwMCwgMHhhNiwgMHg4NCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg4NCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODg0LCAweDA4ODAsIDB4MDg3YywgMHgwMWUxLCAweDAxZTIsIDB4MDFlM30sCi0JewotCSA5MCwgNTQ1MCwgMHg1YSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyMSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4YiwgMHgwYiwgMHgwMCwgMHg5NSwgMHg4NCwgMHgwMCwgMHgwMSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg4NCwgMHgwMCwgMHgwMSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODg4LCAweDA4ODQsIDB4MDg4MCwgMHgwMWUwLCAweDAxZTEsIDB4MDFlMn0sCi0JewotCSA5MiwgNTQ2MCwgMHg1MywgMHgwMSwgMHgwMSwgMHgwMiwgMHgyMiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4YiwgMHgwYiwgMHgwMCwgMHg5NSwgMHg4NCwgMHgwMCwgMHgwMSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg4NCwgMHgwMCwgMHgwMSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODhjLCAweDA4ODgsIDB4MDg4NCwgMHgwMWRmLCAweDAxZTAsIDB4MDFlMX0sCi0JewotCSA5NCwgNTQ3MCwgMHg1MywgMHgwMSwgMHgwMSwgMHgwMiwgMHgyMywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4YiwgMHgwYiwgMHgwMCwgMHg5NCwgMHg3MywgMHgwMCwgMHgwMSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg3MywgMHgwMCwgMHgwMSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODkwLCAweDA4OGMsIDB4MDg4OCwgMHgwMWRlLCAweDAxZGYsIDB4MDFlMH0sCi0JewotCSA5NiwgNTQ4MCwgMHg0ZCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyNCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4YSwgMHgwYSwgMHgwMCwgMHg4NCwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODk0LCAweDA4OTAsIDB4MDg4YywgMHgwMWRkLCAweDAxZGUsIDB4MDFkZn0sCi0JewotCSA5OCwgNTQ5MCwgMHg0ZCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyNSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4YSwgMHgwYSwgMHgwMCwgMHg4MywgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODk4LCAweDA4OTQsIDB4MDg5MCwgMHgwMWRkLCAweDAxZGQsIDB4MDFkZX0sCi0JewotCSAxMDAsIDU1MDAsIDB4NDcsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGEsIDB4MGEsIDB4MDAsIDB4ODIsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDAsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg5YywgMHgwODk4LCAweDA4OTQsIDB4MDFkYywgMHgwMWRkLCAweDAxZGR9LAotCXsKLQkgMTAyLCA1NTEwLCAweDQ3LCAweDAxLCAweDAxLCAweDAyLCAweDI3LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhhLCAweDBhLCAweDAwLCAweDgyLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA5LCAweDAwLCAweDZmLCAweDAwLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA5LAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4YTAsIDB4MDg5YywgMHgwODk4LCAweDAxZGIsIDB4MDFkYywgMHgwMWRkfSwKLQl7Ci0JIDEwNCwgNTUyMCwgMHg0MCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyOCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4YSwgMHgwYSwgMHgwMCwgMHg3MiwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwOGE0LCAweDA4YTAsIDB4MDg5YywgMHgwMWRhLCAweDAxZGIsIDB4MDFkY30sCi0JewotCSAxMDYsIDU1MzAsIDB4NDAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjksIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGEsIDB4MDksIDB4MDAsIDB4NzIsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDAsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDhhOCwgMHgwOGE0LCAweDA4YTAsIDB4MDFkOSwgMHgwMWRhLCAweDAxZGJ9LAotCXsKLQkgMTA4LCA1NTQwLCAweDNhLCAweDAxLCAweDAxLCAweDAyLCAweDJhLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhhLCAweDA5LCAweDAwLCAweDcxLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA5LCAweDAwLCAweDZmLCAweDAwLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA5LAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4YWMsIDB4MDhhOCwgMHgwOGE0LCAweDAxZDgsIDB4MDFkOSwgMHgwMWRhfSwKLQl7Ci0JIDExMCwgNTU1MCwgMHgzYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyYiwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4OSwgMHgwOSwgMHgwMCwgMHg2MSwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwOGIwLCAweDA4YWMsIDB4MDhhOCwgMHgwMWQ3LCAweDAxZDgsIDB4MDFkOX0sCi0JewotCSAxMTIsIDU1NjAsIDB4MzQsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MmMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4ODksIDB4MDksIDB4MDAsIDB4NjEsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDAsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDhiNCwgMHgwOGIwLCAweDA4YWMsIDB4MDFkNywgMHgwMWQ3LCAweDAxZDh9LAotCXsKLQkgMTE0LCA1NTcwLCAweDM0LCAweDAxLCAweDAxLCAweDAyLCAweDJkLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDg5LCAweDA5LCAweDAwLCAweDYxLCAweDYyLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA5LCAweDAwLCAweDZmLCAweDAwLCAweDYyLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA5LAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4YjgsIDB4MDhiNCwgMHgwOGIwLCAweDAxZDYsIDB4MDFkNywgMHgwMWQ3fSwKLQl7Ci0JIDExNiwgNTU4MCwgMHgyZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyZSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4OSwgMHgwOCwgMHgwMCwgMHg2MCwgMHg2MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg2MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOCwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwOGJjLCAweDA4YjgsIDB4MDhiNCwgMHgwMWQ1LCAweDAxZDYsIDB4MDFkN30sCi0JewotCSAxMTgsIDU1OTAsIDB4MmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MmYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4ODksIDB4MDgsIDB4MDAsIDB4NTAsIDB4NjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDgsIDB4MDAsIDB4NmYsIDB4MDAsIDB4NjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDgsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDhjMCwgMHgwOGJjLCAweDA4YjgsIDB4MDFkNCwgMHgwMWQ1LCAweDAxZDZ9LAotCXsKLQkgMTIwLCA1NjAwLCAweDI4LCAweDAxLCAweDAxLCAweDAyLCAweDMwLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg5LCAweDA4LCAweDAwLCAweDUwLCAweDUxLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA4LCAweDAwLCAweDZmLCAweDAwLCAweDUxLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA4LAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4YzQsIDB4MDhjMCwgMHgwOGJjLCAweDAxZDMsIDB4MDFkNCwgMHgwMWQ1fSwKLQl7Ci0JIDEyMiwgNTYxMCwgMHgyOCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzMSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4OSwgMHgwOCwgMHgwMCwgMHg1MCwgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOCwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwOGM4LCAweDA4YzQsIDB4MDhjMCwgMHgwMWQyLCAweDAxZDMsIDB4MDFkNH0sCi0JewotCSAxMjQsIDU2MjAsIDB4MjEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODksIDB4MDgsIDB4MDAsIDB4NTAsIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4NmYsIDB4MDAsIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDcsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDhjYywgMHgwOGM4LCAweDA4YzQsIDB4MDFkMiwgMHgwMWQyLCAweDAxZDN9LAotCXsKLQkgMTI2LCA1NjMwLCAweDIxLCAweDAxLCAweDAxLCAweDAyLCAweDMzLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg4LCAweDA3LCAweDAwLCAweDUwLCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDZmLCAweDAwLCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA3LAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4ZDAsIDB4MDhjYywgMHgwOGM4LCAweDAxZDEsIDB4MDFkMiwgMHgwMWQyfSwKLQl7Ci0JIDEyOCwgNTY0MCwgMHgxYywgMHgwMSwgMHgwMSwgMHgwMiwgMHgzNCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4OCwgMHgwNywgMHgwMCwgMHg0MCwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHg2ZiwgMHgwMCwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNywKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwOGQ0LCAweDA4ZDAsIDB4MDhjYywgMHgwMWQwLCAweDAxZDEsIDB4MDFkMn0sCi0JewotCSAxMzAsIDU2NTAsIDB4MWMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODgsIDB4MDcsIDB4MDAsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4NmYsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDcsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDhkOCwgMHgwOGQ0LCAweDA4ZDAsIDB4MDFjZiwgMHgwMWQwLCAweDAxZDF9LAotCXsKLQkgMTMyLCA1NjYwLCAweDE2LCAweDAxLCAweDAxLCAweDAyLCAweDM2LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg4LCAweDA3LCAweDAwLCAweDQwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA2LCAweDAwLCAweDZmLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA2LAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4ZGMsIDB4MDhkOCwgMHgwOGQ0LCAweDAxY2UsIDB4MDFjZiwgMHgwMWQwfSwKLQl7Ci0JIDEzNCwgNTY3MCwgMHgxNiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzNywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4OCwgMHgwNywgMHgwMCwgMHg0MCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwOGUwLCAweDA4ZGMsIDB4MDhkOCwgMHgwMWNlLCAweDAxY2UsIDB4MDFjZn0sCi0JewotCSAxMzYsIDU2ODAsIDB4MTAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzgsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODcsIDB4MDYsIDB4MDAsIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDhlNCwgMHgwOGUwLCAweDA4ZGMsIDB4MDFjZCwgMHgwMWNlLCAweDAxY2V9LAotCXsKLQkgMTM4LCA1NjkwLCAweDEwLCAweDAxLCAweDAxLCAweDAyLCAweDM5LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg3LCAweDA2LCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA2LCAweDAwLCAweDZmLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA2LAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4ZTgsIDB4MDhlNCwgMHgwOGUwLCAweDAxY2MsIDB4MDFjZCwgMHgwMWNlfSwKLQl7Ci0JIDE0MCwgNTcwMCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzYSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NywgMHgwNiwgMHgwMCwgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg2ZSwgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHg2ZSwgMHgwMCwgMHgwOGVjLCAweDA4ZTgsIDB4MDhlNCwgMHgwMWNiLCAweDAxY2MsIDB4MDFjZH0sCi0JewotCSAxNDIsIDU3MTAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4M2IsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODcsIDB4MDYsIDB4MDAsIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4NmUsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4NmUsIDB4MDAsIDB4MDhmMCwgMHgwOGVjLCAweDA4ZTgsIDB4MDFjYSwgMHgwMWNiLCAweDAxY2N9LAotCXsKLQkgMTQ0LCA1NzIwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDNjLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg3LCAweDA2LCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA2LCAweDAwLCAweDZlLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA2LAotCSAweDAwLCAweDZlLCAweDAwLCAweDA4ZjQsIDB4MDhmMCwgMHgwOGVjLCAweDAxYzksIDB4MDFjYSwgMHgwMWNifSwKLQl7Ci0JIDE0NSwgNTcyNSwgMHgwMywgMHgwMSwgMHgwMiwgMHgwNCwgMHg3OSwgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NywgMHgwNiwgMHgwMCwgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg2ZSwgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHg2ZSwgMHgwMCwgMHgwOGY2LCAweDA4ZjIsIDB4MDhlZSwgMHgwMWM5LCAweDAxY2EsIDB4MDFjYn0sCi0JewotCSAxNDYsIDU3MzAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4M2QsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODcsIDB4MDUsIDB4MDAsIDB4MjAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4NmUsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4NmUsIDB4MDAsIDB4MDhmOCwgMHgwOGY0LCAweDA4ZjAsIDB4MDFjOSwgMHgwMWM5LCAweDAxY2F9LAotCXsKLQkgMTQ3LCA1NzM1LCAweDAzLCAweDAxLCAweDAyLCAweDA0LCAweDdiLCAweDA3LCAweDA3LCAweDA0LCAweDEwLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg3LCAweDA1LCAweDAwLCAweDIwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA2LCAweDAwLCAweDZkLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA2LAotCSAweDAwLCAweDZkLCAweDAwLCAweDA4ZmEsIDB4MDhmNiwgMHgwOGYyLCAweDAxYzgsIDB4MDFjOSwgMHgwMWNhfSwKLQl7Ci0JIDE0OCwgNTc0MCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzZSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NywgMHgwNSwgMHgwMCwgMHgyMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg2ZCwgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHg2ZCwgMHgwMCwgMHgwOGZjLCAweDA4ZjgsIDB4MDhmNCwgMHgwMWM4LCAweDAxYzksIDB4MDFjOX0sCi0JewotCSAxNDksIDU3NDUsIDB4ZmUsIDB4MDAsIDB4MDIsIDB4MDQsIDB4N2QsIDB4MDcsIDB4MDcsIDB4MDQsIDB4MTAsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODcsIDB4MDUsIDB4MDAsIDB4MjAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4NmQsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4NmQsIDB4MDAsIDB4MDhmZSwgMHgwOGZhLCAweDA4ZjYsIDB4MDFjOCwgMHgwMWM4LCAweDAxYzl9LAotCXsKLQkgMTUwLCA1NzUwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDNmLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg3LCAweDA1LCAweDAwLCAweDIwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA1LCAweDAwLCAweDZkLCAweDAwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA1LAotCSAweDAwLCAweDZkLCAweDAwLCAweDA5MDAsIDB4MDhmYywgMHgwOGY4LCAweDAxYzcsIDB4MDFjOCwgMHgwMWM5fSwKLQl7Ci0JIDE1MSwgNTc1NSwgMHhmZSwgMHgwMCwgMHgwMiwgMHgwNCwgMHg3ZiwgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NywgMHgwNSwgMHgwMCwgMHgxMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg2YywgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg2YywgMHgwMCwgMHgwOTAyLCAweDA4ZmUsIDB4MDhmYSwgMHgwMWM3LCAweDAxYzgsIDB4MDFjOH0sCi0JewotCSAxNTIsIDU3NjAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDAsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODYsIDB4MDUsIDB4MDAsIDB4MTAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NmMsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4NmMsIDB4MDAsIDB4MDkwNCwgMHgwOTAwLCAweDA4ZmMsIDB4MDFjNiwgMHgwMWM3LCAweDAxYzh9LAotCXsKLQkgMTUzLCA1NzY1LCAweGY4LCAweDAwLCAweDAyLCAweDA0LCAweDgxLCAweDA3LCAweDA3LCAweDA0LCAweDEwLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg2LCAweDA1LCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA1LCAweDAwLCAweDZjLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA1LAotCSAweDAwLCAweDZjLCAweDAwLCAweDA5MDYsIDB4MDkwMiwgMHgwOGZlLCAweDAxYzYsIDB4MDFjNywgMHgwMWM4fSwKLQl7Ci0JIDE1NCwgNTc3MCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHg0MSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NiwgMHgwNCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg2YiwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg2YiwgMHgwMCwgMHgwOTA4LCAweDA5MDQsIDB4MDkwMCwgMHgwMWM2LCAweDAxYzYsIDB4MDFjN30sCi0JewotCSAxNTUsIDU3NzUsIDB4ZjgsIDB4MDAsIDB4MDIsIDB4MDQsIDB4ODMsIDB4MDcsIDB4MDcsIDB4MDQsIDB4MTAsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODYsIDB4MDQsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NmIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4NmIsIDB4MDAsIDB4MDkwYSwgMHgwOTA2LCAweDA5MDIsIDB4MDFjNSwgMHgwMWM2LCAweDAxYzd9LAotCXsKLQkgMTU2LCA1NzgwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQyLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg2LCAweDA0LCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA1LCAweDAwLCAweDZiLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA1LAotCSAweDAwLCAweDZiLCAweDAwLCAweDA5MGMsIDB4MDkwOCwgMHgwOTA0LCAweDAxYzUsIDB4MDFjNiwgMHgwMWM2fSwKLQl7Ci0JIDE1NywgNTc4NSwgMHhmMiwgMHgwMCwgMHgwMiwgMHgwNCwgMHg4NSwgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NiwgMHgwNCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg2YiwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg2YiwgMHgwMCwgMHgwOTBlLCAweDA5MGEsIDB4MDkwNiwgMHgwMWM0LCAweDAxYzUsIDB4MDFjNn0sCi0JewotCSAxNTgsIDU3OTAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDMsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NmIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4NmIsIDB4MDAsIDB4MDkxMCwgMHgwOTBjLCAweDA5MDgsIDB4MDFjNCwgMHgwMWM1LCAweDAxYzZ9LAotCXsKLQkgMTU5LCA1Nzk1LCAweGYyLCAweDAwLCAweDAyLCAweDA0LCAweDg3LCAweDA3LCAweDA3LCAweDA0LCAweDEwLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg2LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA1LCAweDAwLCAweDZiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA1LAotCSAweDAwLCAweDZiLCAweDAwLCAweDA5MTIsIDB4MDkwZSwgMHgwOTBhLCAweDAxYzQsIDB4MDFjNCwgMHgwMWM1fSwKLQl7Ci0JIDE2MCwgNTgwMCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHg0NCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NiwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg2YiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg2YiwgMHgwMCwgMHgwOTE0LCAweDA5MTAsIDB4MDkwYywgMHgwMWMzLCAweDAxYzQsIDB4MDFjNX0sCi0JewotCSAxNjEsIDU4MDUsIDB4ZWQsIDB4MDAsIDB4MDIsIDB4MDQsIDB4ODksIDB4MDcsIDB4MDcsIDB4MDQsIDB4MTAsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NmEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4NmEsIDB4MDAsIDB4MDkxNiwgMHgwOTEyLCAweDA5MGUsIDB4MDFjMywgMHgwMWM0LCAweDAxYzR9LAotCXsKLQkgMTYyLCA1ODEwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQ1LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg2LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA1LCAweDAwLCAweDZhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA1LAotCSAweDAwLCAweDZhLCAweDAwLCAweDA5MTgsIDB4MDkxNCwgMHgwOTEwLCAweDAxYzIsIDB4MDFjMywgMHgwMWM0fSwKLQl7Ci0JIDE2MywgNTgxNSwgMHhlZCwgMHgwMCwgMHgwMiwgMHgwNCwgMHg4YiwgMHgwNywgMHgwNywgMHgwNCwgMHgxMCwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NiwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg2YSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg2YSwgMHgwMCwgMHgwOTFhLCAweDA5MTYsIDB4MDkxMiwgMHgwMWMyLCAweDAxYzMsIDB4MDFjNH0sCi0JewotCSAxNjQsIDU4MjAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDYsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NmEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4NmEsIDB4MDAsIDB4MDkxYywgMHgwOTE4LCAweDA5MTQsIDB4MDFjMiwgMHgwMWMyLCAweDAxYzN9LAotCXsKLQkgMTY1LCA1ODI1LCAweGVkLCAweDAwLCAweDAyLCAweDA0LCAweDhkLCAweDA3LCAweDA3LCAweDA0LCAweDEwLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg2LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA1LCAweDAwLCAweDY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA1LAotCSAweDAwLCAweDY5LCAweDAwLCAweDA5MWUsIDB4MDkxYSwgMHgwOTE2LCAweDAxYzEsIDB4MDFjMiwgMHgwMWMzfSwKLQl7Ci0JIDE2NiwgNTgzMCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHg0NywgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NiwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg2OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg2OSwgMHgwMCwgMHgwOTIwLCAweDA5MWMsIDB4MDkxOCwgMHgwMWMxLCAweDAxYzIsIDB4MDFjMn0sCi0JewotCSAxNjgsIDU4NDAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDgsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDQsIDB4MDAsIDB4NjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDQsCi0JIDB4MDAsIDB4NjksIDB4MDAsIDB4MDkyNCwgMHgwOTIwLCAweDA5MWMsIDB4MDFjMCwgMHgwMWMxLCAweDAxYzJ9LAotCXsKLQkgMTcwLCA1ODUwLCAweGUwLCAweDAwLCAweDAxLCAweDAyLCAweDQ5LCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg1LCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA0LCAweDAwLCAweDY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA0LAotCSAweDAwLCAweDY5LCAweDAwLCAweDA5MjgsIDB4MDkyNCwgMHgwOTIwLCAweDAxYmYsIDB4MDFjMCwgMHgwMWMxfSwKLQl7Ci0JIDE3MiwgNTg2MCwgMHhkZSwgMHgwMCwgMHgwMSwgMHgwMiwgMHg0YSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNCwgMHgwMCwgMHg2OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNCwKLQkgMHgwMCwgMHg2OSwgMHgwMCwgMHgwOTJjLCAweDA5MjgsIDB4MDkyNCwgMHgwMWJmLCAweDAxYmYsIDB4MDFjMH0sCi0JewotCSAxNzQsIDU4NzAsIDB4ZGIsIDB4MDAsIDB4MDEsIDB4MDIsIDB4NGIsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODUsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDQsIDB4MDAsIDB4NjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDQsCi0JIDB4MDAsIDB4NjgsIDB4MDAsIDB4MDkzMCwgMHgwOTJjLCAweDA5MjgsIDB4MDFiZSwgMHgwMWJmLCAweDAxYmZ9LAotCXsKLQkgMTc2LCA1ODgwLCAweGQ4LCAweDAwLCAweDAxLCAweDAyLCAweDRjLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg1LCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA0LCAweDAwLCAweDY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA0LAotCSAweDAwLCAweDY4LCAweDAwLCAweDA5MzQsIDB4MDkzMCwgMHgwOTJjLCAweDAxYmQsIDB4MDFiZSwgMHgwMWJmfSwKLQl7Ci0JIDE3OCwgNTg5MCwgMHhkNiwgMHgwMCwgMHgwMSwgMHgwMiwgMHg0ZCwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNCwgMHgwMCwgMHg2OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNCwKLQkgMHgwMCwgMHg2OCwgMHgwMCwgMHgwOTM4LCAweDA5MzQsIDB4MDkzMCwgMHgwMWJjLCAweDAxYmQsIDB4MDFiZX0sCi0JewotCSAxODAsIDU5MDAsIDB4ZDMsIDB4MDAsIDB4MDEsIDB4MDIsIDB4NGUsIDB4MDUsIDB4MDUsIDB4MDQsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODUsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDQsIDB4MDAsIDB4NjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDQsCi0JIDB4MDAsIDB4NjgsIDB4MDAsIDB4MDkzYywgMHgwOTM4LCAweDA5MzQsIDB4MDFiYywgMHgwMWJjLCAweDAxYmR9LAotCXsKLQkgMTgyLCA1OTEwLCAweGQ2LCAweDAwLCAweDAxLCAweDAyLCAweDRmLCAweDA1LCAweDA1LCAweDA0LCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg1LCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA0LCAweDAwLCAweDY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA0LAotCSAweDAwLCAweDY4LCAweDAwLCAweDA5NDAsIDB4MDkzYywgMHgwOTM4LCAweDAxYmIsIDB4MDFiYywgMHgwMWJjfSwKLQl7Ci0JIDEsIDI0MTIsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4NmMsIDB4MDgsIDB4MDgsIDB4MDQsIDB4MTYsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzgsIDB4MDAsIDB4MDMsIDB4MDAsCi0JIDB4NzAsIDB4MDAsIDB4MGIsIDB4MDAsIDB4MGEsIDB4MDAsIDB4ODksIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsIDB4MDAsCi0JIDB4MGIsIDB4MDAsIDB4MGEsIDB4MDNjOSwgMHgwM2M1LCAweDAzYzEsIDB4MDQzYSwgMHgwNDNmLCAweDA0NDN9LAotCXsKLQkgMiwgMjQxNywgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg3MSwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3OCwgMHgwMCwgMHgwMywgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwYiwgMHgwMCwgMHgwYSwgMHgwMCwgMHg4OSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwYiwgMHgwMCwgMHgwYSwgMHgwM2NiLCAweDAzYzcsIDB4MDNjMywgMHgwNDM4LCAweDA0M2QsIDB4MDQ0MX0sCi0JewotCSAzLCAyNDIyLCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDc2LCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDY3LCAweDAwLCAweDAzLCAweDAwLAotCSAweDcwLCAweDAwLCAweDBiLCAweDAwLCAweDBhLCAweDAwLCAweDg5LCAweDAwLCAweDAzLCAweDAwLCAweDcwLCAweDAwLAotCSAweDBiLCAweDAwLCAweDBhLCAweDAzY2QsIDB4MDNjOSwgMHgwM2M1LCAweDA0MzYsIDB4MDQzYSwgMHgwNDNmfSwKLQl7Ci0JIDQsIDI0MjcsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4N2IsIDB4MDgsIDB4MDgsIDB4MDQsIDB4MTYsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTcsIDB4MDAsIDB4MDMsIDB4MDAsCi0JIDB4NzAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MGEsIDB4MDAsIDB4NzgsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsIDB4MDAsCi0JIDB4MGEsIDB4MDAsIDB4MGEsIDB4MDNjZiwgMHgwM2NiLCAweDAzYzcsIDB4MDQzNCwgMHgwNDM4LCAweDA0M2R9LAotCXsKLQkgNSwgMjQzMiwgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg4MCwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1NiwgMHgwMCwgMHgwMywgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwYSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwYSwgMHgwMCwgMHgwYSwgMHgwM2QxLCAweDAzY2QsIDB4MDNjOSwgMHgwNDMxLCAweDA0MzYsIDB4MDQzYX0sCi0JewotCSA2LCAyNDM3LCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDg1LCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDQ2LCAweDAwLCAweDAzLCAweDAwLAotCSAweDcwLCAweDAwLCAweDBhLCAweDAwLCAweDBhLCAweDAwLCAweDc2LCAweDAwLCAweDAzLCAweDAwLCAweDcwLCAweDAwLAotCSAweDBhLCAweDAwLCAweDBhLCAweDAzZDMsIDB4MDNjZiwgMHgwM2NiLCAweDA0MmYsIDB4MDQzNCwgMHgwNDM4fSwKLQl7Ci0JIDcsIDI0NDIsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4OGEsIDB4MDgsIDB4MDgsIDB4MDQsIDB4MTYsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDUsIDB4MDAsIDB4MDIsIDB4MDAsCi0JIDB4NzAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MGEsIDB4MDAsIDB4NjYsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzAsIDB4MDAsCi0JIDB4MGEsIDB4MDAsIDB4MGEsIDB4MDNkNSwgMHgwM2QxLCAweDAzY2QsIDB4MDQyZCwgMHgwNDMxLCAweDA0MzZ9LAotCXsKLQkgOCwgMjQ0NywgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg4ZiwgMHgwOCwgMHgwOCwgMHgwNCwgMHgxNiwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzNCwgMHgwMCwgMHgwMiwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg1NSwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwYSwgMHgwMCwgMHgwOSwgMHgwM2Q3LCAweDAzZDMsIDB4MDNjZiwgMHgwNDJiLCAweDA0MmYsIDB4MDQzNH0sCi0JewotCSA5LCAyNDUyLCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDk0LCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDIzLCAweDAwLCAweDAyLCAweDAwLAotCSAweDcwLCAweDAwLCAweDBhLCAweDAwLCAweDA5LCAweDAwLCAweDQ1LCAweDAwLCAweDAyLCAweDAwLCAweDcwLCAweDAwLAotCSAweDBhLCAweDAwLCAweDA5LCAweDAzZDksIDB4MDNkNSwgMHgwM2QxLCAweDA0MjksIDB4MDQyZCwgMHgwNDMxfSwKLQl7Ci0JIDEwLCAyNDU3LCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDk5LCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDEyLCAweDAwLCAweDAyLCAweDAwLAotCSAweDcwLCAweDAwLCAweDBhLCAweDAwLCAweDA5LCAweDAwLCAweDM0LCAweDAwLCAweDAyLCAweDAwLCAweDcwLCAweDAwLAotCSAweDBhLCAweDAwLCAweDA5LCAweDAzZGIsIDB4MDNkNywgMHgwM2QzLCAweDA0MjcsIDB4MDQyYiwgMHgwNDJmfSwKLQl7Ci0JIDExLCAyNDYyLCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDllLCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLAotCSAweDcwLCAweDAwLCAweDA5LCAweDAwLCAweDA5LCAweDAwLCAweDMzLCAweDAwLCAweDAyLCAweDAwLCAweDcwLCAweDAwLAotCSAweDA5LCAweDAwLCAweDA5LCAweDAzZGQsIDB4MDNkOSwgMHgwM2Q1LCAweDA0MjQsIDB4MDQyOSwgMHgwNDJkfSwKLQl7Ci0JIDEyLCAyNDY3LCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweGEzLCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLAotCSAweDcwLCAweDAwLCAweDA5LCAweDAwLCAweDA5LCAweDAwLCAweDIyLCAweDAwLCAweDAyLCAweDAwLCAweDcwLCAweDAwLAotCSAweDA5LCAweDAwLCAweDA5LCAweDAzZGYsIDB4MDNkYiwgMHgwM2Q3LCAweDA0MjIsIDB4MDQyNywgMHgwNDJifSwKLQl7Ci0JIDEzLCAyNDcyLCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweGE4LCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA3LCAweDA3LCAweDA3LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAyLCAweDAwLAotCSAweDcwLCAweDAwLCAweDA5LCAweDAwLCAweDA5LCAweDAwLCAweDExLCAweDAwLCAweDAyLCAweDAwLCAweDcwLCAweDAwLAotCSAweDA5LCAweDAwLCAweDA5LCAweDAzZTEsIDB4MDNkZCwgMHgwM2Q5LCAweDA0MjAsIDB4MDQyNCwgMHgwNDI5fSwKLQl7Ci0JIDE0LCAyNDg0LCAweGZmLCAweDAxLCAweDAzLCAweDA5LCAweGI0LCAweDA4LCAweDA4LCAweDA0LCAweDE2LCAweDAxLAotCSAweDA3LCAweDA3LCAweDA3LCAweDhmLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLAotCSAweDcwLCAweDAwLCAweDA5LCAweDAwLCAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDcwLCAweDAwLAotCSAweDA5LCAweDAwLCAweDA5LCAweDAzZTYsIDB4MDNlMiwgMHgwM2RlLCAweDA0MWIsIDB4MDQxZiwgMHgwNDI0fQotfTsKLQotc3RhdGljIHN0cnVjdCBjaGFuX2luZm9fbnBoeV9yYWRpbzIwNXggY2hhbl9pbmZvX25waHlyZXY2XzIwNTZ2MTFbXSA9IHsKLQl7Ci0JIDE4NCwgNDkyMCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhlYywgMHgwNSwgMHgwNSwgMHgwMiwgMHgwYywgMHgwMSwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2I0LCAweDA3YjAsIDB4MDdhYywgMHgwMjE0LCAweDAyMTUsIDB4MDIxNn0sCi0JewotCSAxODYsIDQ5MzAsIDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZWQsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdiOCwgMHgwN2I0LCAweDA3YjAsIDB4MDIxMywgMHgwMjE0LCAweDAyMTV9LAotCXsKLQkgMTg4LCA0OTQwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGVlLCAweDA1LCAweDA1LCAweDAyLCAweDBjLCAweDAxLAotCSAweDAwLCAweDAwLCAweDAwLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAotCSAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3YmMsIDB4MDdiOCwgMHgwN2I0LCAweDAyMTIsIDB4MDIxMywgMHgwMjE0fSwKLQl7Ci0JIDE5MCwgNDk1MCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhlZiwgMHgwNSwgMHgwNSwgMHgwMiwgMHgwYywgMHgwMSwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2MwLCAweDA3YmMsIDB4MDdiOCwgMHgwMjExLCAweDAyMTIsIDB4MDIxM30sCi0JewotCSAxOTIsIDQ5NjAsIDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjAsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdjNCwgMHgwN2MwLCAweDA3YmMsIDB4MDIwZiwgMHgwMjExLCAweDAyMTJ9LAotCXsKLQkgMTk0LCA0OTcwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGYxLCAweDA1LCAweDA1LCAweDAyLCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAotCSAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3YzgsIDB4MDdjNCwgMHgwN2MwLCAweDAyMGUsIDB4MDIwZiwgMHgwMjExfSwKLQl7Ci0JIDE5NiwgNDk4MCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmMiwgMHgwNSwgMHgwNSwgMHgwMiwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2NjLCAweDA3YzgsIDB4MDdjNCwgMHgwMjBkLCAweDAyMGUsIDB4MDIwZn0sCi0JewotCSAxOTgsIDQ5OTAsIDB4ZmYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjMsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdkMCwgMHgwN2NjLCAweDA3YzgsIDB4MDIwYywgMHgwMjBkLCAweDAyMGV9LAotCXsKLQkgMjAwLCA1MDAwLCAweGZmLCAweDAxLCAweDAxLCAweDAxLCAweGY0LCAweDA1LCAweDA1LCAweDAyLCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAotCSAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3ZDQsIDB4MDdkMCwgMHgwN2NjLCAweDAyMGIsIDB4MDIwYywgMHgwMjBkfSwKLQl7Ci0JIDIwMiwgNTAxMCwgMHhmZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmNSwgMHgwNSwgMHgwNSwgMHgwMiwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2Q4LCAweDA3ZDQsIDB4MDdkMCwgMHgwMjBhLCAweDAyMGIsIDB4MDIwY30sCi0JewotCSAyMDQsIDUwMjAsIDB4ZjcsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjYsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdkYywgMHgwN2Q4LCAweDA3ZDQsIDB4MDIwOSwgMHgwMjBhLCAweDAyMGJ9LAotCXsKLQkgMjA2LCA1MDMwLCAweGY3LCAweDAxLCAweDAxLCAweDAxLCAweGY3LCAweDA1LCAweDA1LCAweDAyLCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAotCSAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3ZTAsIDB4MDdkYywgMHgwN2Q4LCAweDAyMDgsIDB4MDIwOSwgMHgwMjBhfSwKLQl7Ci0JIDIwOCwgNTA0MCwgMHhlZiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmOCwgMHgwNSwgMHgwNSwgMHgwMiwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2U0LCAweDA3ZTAsIDB4MDdkYywgMHgwMjA3LCAweDAyMDgsIDB4MDIwOX0sCi0JewotCSAyMTAsIDUwNTAsIDB4ZWYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZjksIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmUsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdlOCwgMHgwN2U0LCAweDA3ZTAsIDB4MDIwNiwgMHgwMjA3LCAweDAyMDh9LAotCXsKLQkgMjEyLCA1MDYwLCAweGU2LCAweDAxLCAweDAxLCAweDAxLCAweGZhLCAweDA1LCAweDA1LCAweDAyLCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAotCSAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwLCAweGZlLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3ZWMsIDB4MDdlOCwgMHgwN2U0LCAweDAyMDUsIDB4MDIwNiwgMHgwMjA3fSwKLQl7Ci0JIDIxNCwgNTA3MCwgMHhlNiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmYiwgMHgwNSwgMHgwNSwgMHgwMiwgMHgwYywgMHgwMSwKLQkgMHgwMSwgMHgwMSwgMHgwMSwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZCwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZCwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2YwLCAweDA3ZWMsIDB4MDdlOCwgMHgwMjA0LCAweDAyMDUsIDB4MDIwNn0sCi0JewotCSAyMTYsIDUwODAsIDB4ZGUsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZmMsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDEsIDB4MDEsIDB4MDEsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmQsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmQsIDB4MDAsIDB4MDksIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDdmNCwgMHgwN2YwLCAweDA3ZWMsIDB4MDIwMywgMHgwMjA0LCAweDAyMDV9LAotCXsKLQkgMjE4LCA1MDkwLCAweGRlLCAweDAxLCAweDAxLCAweDAxLCAweGZkLCAweDA1LCAweDA1LCAweDAyLCAweDBjLCAweDAxLAotCSAweDAxLCAweDAxLCAweDAxLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZkLCAweDAwLCAweDA5LCAweDAwLCAweDc3LAotCSAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwLCAweGZkLCAweDAwLCAweDA5LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA3ZjgsIDB4MDdmNCwgMHgwN2YwLCAweDAyMDIsIDB4MDIwMywgMHgwMjA0fSwKLQl7Ci0JIDIyMCwgNTEwMCwgMHhkNiwgMHgwMSwgMHgwMSwgMHgwMSwgMHhmZSwgMHgwNSwgMHgwNSwgMHgwMiwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmZCwgMHgwMCwgMHgwOCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmZCwgMHgwMCwgMHgwOCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwN2ZjLCAweDA3ZjgsIDB4MDdmNCwgMHgwMjAxLCAweDAyMDIsIDB4MDIwM30sCi0JewotCSAyMjIsIDUxMTAsIDB4ZDYsIDB4MDEsIDB4MDEsIDB4MDEsIDB4ZmYsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgwMCwgMHgwN2ZjLCAweDA3ZjgsIDB4MDIwMCwgMHgwMjAxLCAweDAyMDJ9LAotCXsKLQkgMjI0LCA1MTIwLCAweGNlLCAweDAxLCAweDAxLCAweDAyLCAweDAwLCAweDA1LCAweDA1LCAweDAyLCAweDBjLCAweDAxLAotCSAweDAyLCAweDAyLCAweDAyLCAweDhmLCAweDBmLCAweDAwLCAweGZmLCAweGZjLCAweDAwLCAweDA4LCAweDAwLCAweDc3LAotCSAweDAwLCAweDBmLCAweDAwLCAweDZmLCAweDAwLCAweGZjLCAweDAwLCAweDA4LCAweDAwLCAweDc3LCAweDAwLCAweDBmLAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4MDQsIDB4MDgwMCwgMHgwN2ZjLCAweDAxZmYsIDB4MDIwMCwgMHgwMjAxfSwKLQl7Ci0JIDIyNiwgNTEzMCwgMHhjZSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwMSwgMHgwNSwgMHgwNSwgMHgwMiwgMHgwYywgMHgwMSwKLQkgMHgwMiwgMHgwMiwgMHgwMiwgMHg4ZiwgMHgwZiwgMHgwMCwgMHhmZiwgMHhmYywgMHgwMCwgMHgwOCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHhmYywgMHgwMCwgMHgwOCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwZiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwODA4LCAweDA4MDQsIDB4MDgwMCwgMHgwMWZlLCAweDAxZmYsIDB4MDIwMH0sCi0JewotCSAyMjgsIDUxNDAsIDB4YzYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDIsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmIsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmIsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgwYywgMHgwODA4LCAweDA4MDQsIDB4MDFmZCwgMHgwMWZlLCAweDAxZmZ9LAotCXsKLQkgMzIsIDUxNjAsIDB4YmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGUsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGUsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgxNCwgMHgwODEwLCAweDA4MGMsIDB4MDFmYiwgMHgwMWZjLCAweDAxZmR9LAotCXsKLQkgMzQsIDUxNzAsIDB4YmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDUsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZmEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGUsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZmEsIDB4MDAsIDB4MDcsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGUsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgxOCwgMHgwODE0LCAweDA4MTAsIDB4MDFmYSwgMHgwMWZiLCAweDAxZmN9LAotCXsKLQkgMzYsIDUxODAsIDB4YjYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDYsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZjksIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGUsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZjksIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGUsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgxYywgMHgwODE4LCAweDA4MTQsIDB4MDFmOSwgMHgwMWZhLCAweDAxZmJ9LAotCXsKLQkgMzgsIDUxOTAsIDB4YjYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDcsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZjksIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZjksIDB4MDAsIDB4MDYsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgyMCwgMHgwODFjLCAweDA4MTgsIDB4MDFmOCwgMHgwMWY5LCAweDAxZmF9LAotCXsKLQkgNDAsIDUyMDAsIDB4YWYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDgsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZjksIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZjksIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgyNCwgMHgwODIwLCAweDA4MWMsIDB4MDFmNywgMHgwMWY4LCAweDAxZjl9LAotCXsKLQkgNDIsIDUyMTAsIDB4YWYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDksIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGYsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4ZjksIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZjksIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgyOCwgMHgwODI0LCAweDA4MjAsIDB4MDFmNiwgMHgwMWY3LCAweDAxZjh9LAotCXsKLQkgNDQsIDUyMjAsIDB4YTcsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGEsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGUsIDB4MGYsIDB4MDAsIDB4ZmUsIDB4ZDgsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZDgsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgyYywgMHgwODI4LCAweDA4MjQsIDB4MDFmNSwgMHgwMWY2LCAweDAxZjd9LAotCXsKLQkgNDYsIDUyMzAsIDB4YTcsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGIsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGUsIDB4MGYsIDB4MDAsIDB4ZWUsIDB4ZDgsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ZDgsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgzMCwgMHgwODJjLCAweDA4MjgsIDB4MDFmNCwgMHgwMWY1LCAweDAxZjZ9LAotCXsKLQkgNDgsIDUyNDAsIDB4YTAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGMsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGUsIDB4MGYsIDB4MDAsIDB4ZWUsIDB4YzgsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YzgsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgzNCwgMHgwODMwLCAweDA4MmMsIDB4MDFmMywgMHgwMWY0LCAweDAxZjV9LAotCXsKLQkgNTAsIDUyNTAsIDB4YTAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGQsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGUsIDB4MGYsIDB4MDAsIDB4ZWQsIDB4YzcsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YzcsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgzOCwgMHgwODM0LCAweDA4MzAsIDB4MDFmMiwgMHgwMWYzLCAweDAxZjR9LAotCXsKLQkgNTIsIDUyNjAsIDB4OTgsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGUsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDIsIDB4MDIsIDB4MDIsIDB4OGUsIDB4MGUsIDB4MDAsIDB4ZWQsIDB4YzcsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YzcsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGQsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDgzYywgMHgwODM4LCAweDA4MzQsIDB4MDFmMSwgMHgwMWYyLCAweDAxZjN9LAotCXsKLQkgNTQsIDUyNzAsIDB4OTgsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MGYsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGUsIDB4MGUsIDB4MDAsIDB4ZWQsIDB4YzcsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGMsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YzcsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGMsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg0MCwgMHgwODNjLCAweDA4MzgsIDB4MDFmMCwgMHgwMWYxLCAweDAxZjJ9LAotCXsKLQkgNTYsIDUyODAsIDB4OTEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTAsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGUsIDB4MDAsIDB4ZGMsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGMsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGMsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg0NCwgMHgwODQwLCAweDA4M2MsIDB4MDFmMCwgMHgwMWYwLCAweDAxZjF9LAotCXsKLQkgNTgsIDUyOTAsIDB4OTEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTEsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGUsIDB4MDAsIDB4ZGMsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGMsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGMsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg0OCwgMHgwODQ0LCAweDA4NDAsIDB4MDFlZiwgMHgwMWYwLCAweDAxZjB9LAotCXsKLQkgNjAsIDUzMDAsIDB4OGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTIsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGUsIDB4MDAsIDB4ZGMsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGMsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGMsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg0YywgMHgwODQ4LCAweDA4NDQsIDB4MDFlZSwgMHgwMWVmLCAweDAxZjB9LAotCXsKLQkgNjIsIDUzMTAsIDB4OGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTMsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGUsIDB4MDAsIDB4ZGMsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGMsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGMsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg1MCwgMHgwODRjLCAweDA4NDgsIDB4MDFlZCwgMHgwMWVlLCAweDAxZWZ9LAotCXsKLQkgNjQsIDUzMjAsIDB4ODMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTQsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGUsIDB4MDAsIDB4ZGIsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGMsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YjcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGMsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg1NCwgMHgwODUwLCAweDA4NGMsIDB4MDFlYywgMHgwMWVkLCAweDAxZWV9LAotCXsKLQkgNjYsIDUzMzAsIDB4ODMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTUsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGQsIDB4MDAsIDB4Y2IsIDB4YTYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YTYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGIsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg1OCwgMHgwODU0LCAweDA4NTAsIDB4MDFlYiwgMHgwMWVjLCAweDAxZWR9LAotCXsKLQkgNjgsIDUzNDAsIDB4N2MsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTYsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGQsIDB4MGQsIDB4MDAsIDB4Y2EsIDB4YTYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YTYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGIsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg1YywgMHgwODU4LCAweDA4NTQsIDB4MDFlYSwgMHgwMWViLCAweDAxZWN9LAotCXsKLQkgNzAsIDUzNTAsIDB4N2MsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTcsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGMsIDB4MGQsIDB4MDAsIDB4Y2EsIDB4YTYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4NmYsIDB4MDAsIDB4YTYsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGIsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg2MCwgMHgwODVjLCAweDA4NTgsIDB4MDFlOSwgMHgwMWVhLCAweDAxZWJ9LAotCXsKLQkgNzIsIDUzNjAsIDB4NzUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTgsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGMsIDB4MGQsIDB4MDAsIDB4YzksIDB4OTUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4NmYsIDB4MDAsIDB4OTUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg2NCwgMHgwODYwLCAweDA4NWMsIDB4MDFlOCwgMHgwMWU5LCAweDAxZWF9LAotCXsKLQkgNzQsIDUzNzAsIDB4NzUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MTksIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGMsIDB4MGQsIDB4MDAsIDB4YzksIDB4OTUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4NmYsIDB4MDAsIDB4OTUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg2OCwgMHgwODY0LCAweDA4NjAsIDB4MDFlNywgMHgwMWU4LCAweDAxZTl9LAotCXsKLQkgNzYsIDUzODAsIDB4NmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWEsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGMsIDB4MGMsIDB4MDAsIDB4YjgsIDB4OTUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4NmYsIDB4MDAsIDB4OTUsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg2YywgMHgwODY4LCAweDA4NjQsIDB4MDFlNiwgMHgwMWU3LCAweDAxZTh9LAotCXsKLQkgNzgsIDUzOTAsIDB4NmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWIsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGMsIDB4MGMsIDB4MDAsIDB4YjgsIDB4ODQsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg3MCwgMHgwODZjLCAweDA4NjgsIDB4MDFlNSwgMHgwMWU2LCAweDAxZTd9LAotCXsKLQkgODAsIDU0MDAsIDB4NjcsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWMsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGMsIDB4MGMsIDB4MDAsIDB4YjgsIDB4ODQsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg3NCwgMHgwODcwLCAweDA4NmMsIDB4MDFlNSwgMHgwMWU1LCAweDAxZTZ9LAotCXsKLQkgODIsIDU0MTAsIDB4NjcsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWQsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGMsIDB4MGMsIDB4MDAsIDB4YjcsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg3OCwgMHgwODc0LCAweDA4NzAsIDB4MDFlNCwgMHgwMWU1LCAweDAxZTV9LAotCXsKLQkgODQsIDU0MjAsIDB4NjEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWUsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGMsIDB4MGMsIDB4MDAsIDB4YTcsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg3YywgMHgwODc4LCAweDA4NzQsIDB4MDFlMywgMHgwMWU0LCAweDAxZTV9LAotCXsKLQkgODYsIDU0MzAsIDB4NjEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MWYsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDMsIDB4MDMsIDB4MDMsIDB4OGMsIDB4MGIsIDB4MDAsIDB4YTYsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4NmYsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MGEsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg4MCwgMHgwODdjLCAweDA4NzgsIDB4MDFlMiwgMHgwMWUzLCAweDAxZTR9LAotCXsKLQkgODgsIDU0NDAsIDB4NWEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjAsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGIsIDB4MGIsIDB4MDAsIDB4YTYsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg4NCwgMHgwODgwLCAweDA4N2MsIDB4MDFlMSwgMHgwMWUyLCAweDAxZTN9LAotCXsKLQkgOTAsIDU0NTAsIDB4NWEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjEsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGIsIDB4MGIsIDB4MDAsIDB4OTUsIDB4ODQsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg4OCwgMHgwODg0LCAweDA4ODAsIDB4MDFlMCwgMHgwMWUxLCAweDAxZTJ9LAotCXsKLQkgOTIsIDU0NjAsIDB4NTMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjIsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGIsIDB4MGIsIDB4MDAsIDB4OTUsIDB4ODQsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg4YywgMHgwODg4LCAweDA4ODQsIDB4MDFkZiwgMHgwMWUwLCAweDAxZTF9LAotCXsKLQkgOTQsIDU0NzAsIDB4NTMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjMsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGIsIDB4MGIsIDB4MDAsIDB4OTQsIDB4NzMsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDAsIDB4NzMsIDB4MDAsIDB4MDEsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg5MCwgMHgwODhjLCAweDA4ODgsIDB4MDFkZSwgMHgwMWRmLCAweDAxZTB9LAotCXsKLQkgOTYsIDU0ODAsIDB4NGQsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjQsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGEsIDB4MGEsIDB4MDAsIDB4ODQsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDAsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg5NCwgMHgwODkwLCAweDA4OGMsIDB4MDFkZCwgMHgwMWRlLCAweDAxZGZ9LAotCXsKLQkgOTgsIDU0OTAsIDB4NGQsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjUsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGEsIDB4MGEsIDB4MDAsIDB4ODMsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDAsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDg5OCwgMHgwODk0LCAweDA4OTAsIDB4MDFkZCwgMHgwMWRkLCAweDAxZGV9LAotCXsKLQkgMTAwLCA1NTAwLCAweDQ3LCAweDAxLCAweDAxLCAweDAyLCAweDI2LCAweDA1LCAweDA1LCAweDAyLCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhhLCAweDBhLCAweDAwLCAweDgyLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA5LCAweDAwLCAweDZmLCAweDAwLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA5LAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4OWMsIDB4MDg5OCwgMHgwODk0LCAweDAxZGMsIDB4MDFkZCwgMHgwMWRkfSwKLQl7Ci0JIDEwMiwgNTUxMCwgMHg0NywgMHgwMSwgMHgwMSwgMHgwMiwgMHgyNywgMHgwNSwgMHgwNSwgMHgwMiwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4YSwgMHgwYSwgMHgwMCwgMHg4MiwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwOGEwLCAweDA4OWMsIDB4MDg5OCwgMHgwMWRiLCAweDAxZGMsIDB4MDFkZH0sCi0JewotCSAxMDQsIDU1MjAsIDB4NDAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MjgsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4OGEsIDB4MGEsIDB4MDAsIDB4NzIsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDAsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDhhNCwgMHgwOGEwLCAweDA4OWMsIDB4MDFkYSwgMHgwMWRiLCAweDAxZGN9LAotCXsKLQkgMTA2LCA1NTMwLCAweDQwLCAweDAxLCAweDAxLCAweDAyLCAweDI5LCAweDA1LCAweDA1LCAweDAyLCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhhLCAweDA5LCAweDAwLCAweDcyLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA5LCAweDAwLCAweDZmLCAweDAwLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA5LAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4YTgsIDB4MDhhNCwgMHgwOGEwLCAweDAxZDksIDB4MDFkYSwgMHgwMWRifSwKLQl7Ci0JIDEwOCwgNTU0MCwgMHgzYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyYSwgMHgwNSwgMHgwNSwgMHgwMiwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4YSwgMHgwOSwgMHgwMCwgMHg3MSwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwOGFjLCAweDA4YTgsIDB4MDhhNCwgMHgwMWQ4LCAweDAxZDksIDB4MDFkYX0sCi0JewotCSAxMTAsIDU1NTAsIDB4M2EsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MmIsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4ODksIDB4MDksIDB4MDAsIDB4NjEsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4NmYsIDB4MDAsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDksCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDhiMCwgMHgwOGFjLCAweDA4YTgsIDB4MDFkNywgMHgwMWQ4LCAweDAxZDl9LAotCXsKLQkgMTEyLCA1NTYwLCAweDM0LCAweDAxLCAweDAxLCAweDAyLCAweDJjLCAweDA1LCAweDA1LCAweDAyLCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDg5LCAweDA5LCAweDAwLCAweDYxLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA5LCAweDAwLCAweDZmLCAweDAwLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA5LAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4YjQsIDB4MDhiMCwgMHgwOGFjLCAweDAxZDcsIDB4MDFkNywgMHgwMWQ4fSwKLQl7Ci0JIDExNCwgNTU3MCwgMHgzNCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgyZCwgMHgwNSwgMHgwNSwgMHgwMiwgMHgwYywgMHgwMSwKLQkgMHgwNCwgMHgwNCwgMHgwNCwgMHg4OSwgMHgwOSwgMHgwMCwgMHg2MSwgMHg2MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg2MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOSwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwOGI4LCAweDA4YjQsIDB4MDhiMCwgMHgwMWQ2LCAweDAxZDcsIDB4MDFkN30sCi0JewotCSAxMTYsIDU1ODAsIDB4MmUsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MmUsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDQsIDB4MDQsIDB4MDQsIDB4ODksIDB4MDgsIDB4MDAsIDB4NjAsIDB4NjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDgsIDB4MDAsIDB4NmYsIDB4MDAsIDB4NjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDgsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDhiYywgMHgwOGI4LCAweDA4YjQsIDB4MDFkNSwgMHgwMWQ2LCAweDAxZDd9LAotCXsKLQkgMTE4LCA1NTkwLCAweDJlLCAweDAxLCAweDAxLCAweDAyLCAweDJmLCAweDA1LCAweDA1LCAweDAyLCAweDBjLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDg5LCAweDA4LCAweDAwLCAweDUwLCAweDYxLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA4LCAweDAwLCAweDZmLCAweDAwLCAweDYxLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA4LAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4YzAsIDB4MDhiYywgMHgwOGI4LCAweDAxZDQsIDB4MDFkNSwgMHgwMWQ2fSwKLQl7Ci0JIDEyMCwgNTYwMCwgMHgyOCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzMCwgMHgwNSwgMHgwNSwgMHgwMiwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4OSwgMHgwOCwgMHgwMCwgMHg1MCwgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwOCwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwOGM0LCAweDA4YzAsIDB4MDhiYywgMHgwMWQzLCAweDAxZDQsIDB4MDFkNX0sCi0JewotCSAxMjIsIDU2MTAsIDB4MjgsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzEsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODksIDB4MDgsIDB4MDAsIDB4NTAsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDgsIDB4MDAsIDB4NmYsIDB4MDAsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDgsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDhjOCwgMHgwOGM0LCAweDA4YzAsIDB4MDFkMiwgMHgwMWQzLCAweDAxZDR9LAotCXsKLQkgMTI0LCA1NjIwLCAweDIxLCAweDAxLCAweDAxLCAweDAyLCAweDMyLCAweDA1LCAweDA1LCAweDAyLCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg5LCAweDA4LCAweDAwLCAweDUwLCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDZmLCAweDAwLCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA3LAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4Y2MsIDB4MDhjOCwgMHgwOGM0LCAweDAxZDIsIDB4MDFkMiwgMHgwMWQzfSwKLQl7Ci0JIDEyNiwgNTYzMCwgMHgyMSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzMywgMHgwNSwgMHgwNSwgMHgwMiwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4OCwgMHgwNywgMHgwMCwgMHg1MCwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHg2ZiwgMHgwMCwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNywKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwOGQwLCAweDA4Y2MsIDB4MDhjOCwgMHgwMWQxLCAweDAxZDIsIDB4MDFkMn0sCi0JewotCSAxMjgsIDU2NDAsIDB4MWMsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzQsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODgsIDB4MDcsIDB4MDAsIDB4NDAsIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4NmYsIDB4MDAsIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDcsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDhkNCwgMHgwOGQwLCAweDA4Y2MsIDB4MDFkMCwgMHgwMWQxLCAweDAxZDJ9LAotCXsKLQkgMTMwLCA1NjUwLCAweDFjLCAweDAxLCAweDAxLCAweDAyLCAweDM1LCAweDA1LCAweDA1LCAweDAyLCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg4LCAweDA3LCAweDAwLCAweDQwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDZmLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA3LAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4ZDgsIDB4MDhkNCwgMHgwOGQwLCAweDAxY2YsIDB4MDFkMCwgMHgwMWQxfSwKLQl7Ci0JIDEzMiwgNTY2MCwgMHgxNiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzNiwgMHgwNSwgMHgwNSwgMHgwMiwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4OCwgMHgwNywgMHgwMCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwOGRjLCAweDA4ZDgsIDB4MDhkNCwgMHgwMWNlLCAweDAxY2YsIDB4MDFkMH0sCi0JewotCSAxMzQsIDU2NzAsIDB4MTYsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MzcsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODgsIDB4MDcsIDB4MDAsIDB4NDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4NmYsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4NmYsIDB4MDAsIDB4MDhlMCwgMHgwOGRjLCAweDA4ZDgsIDB4MDFjZSwgMHgwMWNlLCAweDAxY2Z9LAotCXsKLQkgMTM2LCA1NjgwLCAweDEwLCAweDAxLCAweDAxLCAweDAyLCAweDM4LCAweDA1LCAweDA1LCAweDAyLCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg3LCAweDA2LCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA2LCAweDAwLCAweDZmLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA2LAotCSAweDAwLCAweDZmLCAweDAwLCAweDA4ZTQsIDB4MDhlMCwgMHgwOGRjLCAweDAxY2QsIDB4MDFjZSwgMHgwMWNlfSwKLQl7Ci0JIDEzOCwgNTY5MCwgMHgxMCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzOSwgMHgwNSwgMHgwNSwgMHgwMiwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NywgMHgwNiwgMHgwMCwgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg2ZiwgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHg2ZiwgMHgwMCwgMHgwOGU4LCAweDA4ZTQsIDB4MDhlMCwgMHgwMWNjLCAweDAxY2QsIDB4MDFjZX0sCi0JewotCSAxNDAsIDU3MDAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4M2EsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODcsIDB4MDYsIDB4MDAsIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4NmUsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4NmUsIDB4MDAsIDB4MDhlYywgMHgwOGU4LCAweDA4ZTQsIDB4MDFjYiwgMHgwMWNjLCAweDAxY2R9LAotCXsKLQkgMTQyLCA1NzEwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDNiLCAweDA1LCAweDA1LCAweDAyLCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg3LCAweDA2LCAweDAwLCAweDMwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA2LCAweDAwLCAweDZlLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA2LAotCSAweDAwLCAweDZlLCAweDAwLCAweDA4ZjAsIDB4MDhlYywgMHgwOGU4LCAweDAxY2EsIDB4MDFjYiwgMHgwMWNjfSwKLQl7Ci0JIDE0NCwgNTcyMCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzYywgMHgwNSwgMHgwNSwgMHgwMiwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NywgMHgwNiwgMHgwMCwgMHgzMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg2ZSwgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHg2ZSwgMHgwMCwgMHgwOGY0LCAweDA4ZjAsIDB4MDhlYywgMHgwMWM5LCAweDAxY2EsIDB4MDFjYn0sCi0JewotCSAxNDUsIDU3MjUsIDB4MDMsIDB4MDEsIDB4MDIsIDB4MDQsIDB4NzksIDB4MDUsIDB4MDUsIDB4MDIsIDB4MTUsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODcsIDB4MDYsIDB4MDAsIDB4MzAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4NmUsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4NmUsIDB4MDAsIDB4MDhmNiwgMHgwOGYyLCAweDA4ZWUsIDB4MDFjOSwgMHgwMWNhLCAweDAxY2J9LAotCXsKLQkgMTQ2LCA1NzMwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDNkLCAweDA1LCAweDA1LCAweDAyLCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg3LCAweDA1LCAweDAwLCAweDIwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA2LCAweDAwLCAweDZlLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA2LAotCSAweDAwLCAweDZlLCAweDAwLCAweDA4ZjgsIDB4MDhmNCwgMHgwOGYwLCAweDAxYzksIDB4MDFjOSwgMHgwMWNhfSwKLQl7Ci0JIDE0NywgNTczNSwgMHgwMywgMHgwMSwgMHgwMiwgMHgwNCwgMHg3YiwgMHgwNSwgMHgwNSwgMHgwMiwgMHgxNSwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NywgMHgwNSwgMHgwMCwgMHgyMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg2ZCwgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNiwKLQkgMHgwMCwgMHg2ZCwgMHgwMCwgMHgwOGZhLCAweDA4ZjYsIDB4MDhmMiwgMHgwMWM4LCAweDAxYzksIDB4MDFjYX0sCi0JewotCSAxNDgsIDU3NDAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4M2UsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODcsIDB4MDUsIDB4MDAsIDB4MjAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4NmQsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDYsCi0JIDB4MDAsIDB4NmQsIDB4MDAsIDB4MDhmYywgMHgwOGY4LCAweDA4ZjQsIDB4MDFjOCwgMHgwMWM5LCAweDAxYzl9LAotCXsKLQkgMTQ5LCA1NzQ1LCAweGZlLCAweDAwLCAweDAyLCAweDA0LCAweDdkLCAweDA1LCAweDA1LCAweDAyLCAweDE1LCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg3LCAweDA1LCAweDAwLCAweDIwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA2LCAweDAwLCAweDZkLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA2LAotCSAweDAwLCAweDZkLCAweDAwLCAweDA4ZmUsIDB4MDhmYSwgMHgwOGY2LCAweDAxYzgsIDB4MDFjOCwgMHgwMWM5fSwKLQl7Ci0JIDE1MCwgNTc1MCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgzZiwgMHgwNSwgMHgwNSwgMHgwMiwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NywgMHgwNSwgMHgwMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg2ZCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg2ZCwgMHgwMCwgMHgwOTAwLCAweDA4ZmMsIDB4MDhmOCwgMHgwMWM3LCAweDAxYzgsIDB4MDFjOX0sCi0JewotCSAxNTEsIDU3NTUsIDB4ZmUsIDB4MDAsIDB4MDIsIDB4MDQsIDB4N2YsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MTUsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODcsIDB4MDUsIDB4MDAsIDB4MTAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NmMsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4NmMsIDB4MDAsIDB4MDkwMiwgMHgwOGZlLCAweDA4ZmEsIDB4MDFjNywgMHgwMWM4LCAweDAxYzh9LAotCXsKLQkgMTUyLCA1NzYwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQwLCAweDA1LCAweDA1LCAweDAyLCAweDBjLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg2LCAweDA1LCAweDAwLCAweDEwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA1LCAweDAwLCAweDZjLCAweDAwLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA1LAotCSAweDAwLCAweDZjLCAweDAwLCAweDA5MDQsIDB4MDkwMCwgMHgwOGZjLCAweDAxYzYsIDB4MDFjNywgMHgwMWM4fSwKLQl7Ci0JIDE1MywgNTc2NSwgMHhmOCwgMHgwMCwgMHgwMiwgMHgwNCwgMHg4MSwgMHgwNSwgMHgwNSwgMHgwMiwgMHgxNSwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NiwgMHgwNSwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg2YywgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg2YywgMHgwMCwgMHgwOTA2LCAweDA5MDIsIDB4MDhmZSwgMHgwMWM2LCAweDAxYzcsIDB4MDFjOH0sCi0JewotCSAxNTQsIDU3NzAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDEsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4ODYsIDB4MDQsIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NmIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4NmIsIDB4MDAsIDB4MDkwOCwgMHgwOTA0LCAweDA5MDAsIDB4MDFjNiwgMHgwMWM2LCAweDAxYzd9LAotCXsKLQkgMTU1LCA1Nzc1LCAweGY4LCAweDAwLCAweDAyLCAweDA0LCAweDgzLCAweDA1LCAweDA1LCAweDAyLCAweDE1LCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDg2LCAweDA0LCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA1LCAweDAwLCAweDZiLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA1LAotCSAweDAwLCAweDZiLCAweDAwLCAweDA5MGEsIDB4MDkwNiwgMHgwOTAyLCAweDAxYzUsIDB4MDFjNiwgMHgwMWM3fSwKLQl7Ci0JIDE1NiwgNTc4MCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHg0MiwgMHgwNSwgMHgwNSwgMHgwMiwgMHgwYywgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4NiwgMHgwNCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg2YiwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg2YiwgMHgwMCwgMHgwOTBjLCAweDA5MDgsIDB4MDkwNCwgMHgwMWM1LCAweDAxYzYsIDB4MDFjNn0sCi0JewotCSAxNTcsIDU3ODUsIDB4ZjIsIDB4MDAsIDB4MDIsIDB4MDQsIDB4ODUsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MTUsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NmIsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4NmIsIDB4MDAsIDB4MDkwZSwgMHgwOTBhLCAweDA5MDYsIDB4MDFjNCwgMHgwMWM1LCAweDAxYzZ9LAotCXsKLQkgMTU4LCA1NzkwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQzLCAweDA1LCAweDA1LCAweDAyLCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg2LCAweDA0LCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA1LCAweDAwLCAweDZiLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA1LAotCSAweDAwLCAweDZiLCAweDAwLCAweDA5MTAsIDB4MDkwYywgMHgwOTA4LCAweDAxYzQsIDB4MDFjNSwgMHgwMWM2fSwKLQl7Ci0JIDE1OSwgNTc5NSwgMHhmMiwgMHgwMCwgMHgwMiwgMHgwNCwgMHg4NywgMHgwNSwgMHgwNSwgMHgwMiwgMHgxNSwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NiwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg2YiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg2YiwgMHgwMCwgMHgwOTEyLCAweDA5MGUsIDB4MDkwYSwgMHgwMWM0LCAweDAxYzQsIDB4MDFjNX0sCi0JewotCSAxNjAsIDU4MDAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDQsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NmIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4NmIsIDB4MDAsIDB4MDkxNCwgMHgwOTEwLCAweDA5MGMsIDB4MDFjMywgMHgwMWM0LCAweDAxYzV9LAotCXsKLQkgMTYxLCA1ODA1LCAweGVkLCAweDAwLCAweDAyLCAweDA0LCAweDg5LCAweDA1LCAweDA1LCAweDAyLCAweDE1LCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg2LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA1LCAweDAwLCAweDZhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA1LAotCSAweDAwLCAweDZhLCAweDAwLCAweDA5MTYsIDB4MDkxMiwgMHgwOTBlLCAweDAxYzMsIDB4MDFjNCwgMHgwMWM0fSwKLQl7Ci0JIDE2MiwgNTgxMCwgMHgwYSwgMHgwMSwgMHgwMSwgMHgwMiwgMHg0NSwgMHgwNSwgMHgwNSwgMHgwMiwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NiwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg2YSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg2YSwgMHgwMCwgMHgwOTE4LCAweDA5MTQsIDB4MDkxMCwgMHgwMWMyLCAweDAxYzMsIDB4MDFjNH0sCi0JewotCSAxNjMsIDU4MTUsIDB4ZWQsIDB4MDAsIDB4MDIsIDB4MDQsIDB4OGIsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MTUsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NmEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4NmEsIDB4MDAsIDB4MDkxYSwgMHgwOTE2LCAweDA5MTIsIDB4MDFjMiwgMHgwMWMzLCAweDAxYzR9LAotCXsKLQkgMTY0LCA1ODIwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQ2LCAweDA1LCAweDA1LCAweDAyLCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg2LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA1LCAweDAwLCAweDZhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA1LAotCSAweDAwLCAweDZhLCAweDAwLCAweDA5MWMsIDB4MDkxOCwgMHgwOTE0LCAweDAxYzIsIDB4MDFjMiwgMHgwMWMzfSwKLQl7Ci0JIDE2NSwgNTgyNSwgMHhlZCwgMHgwMCwgMHgwMiwgMHgwNCwgMHg4ZCwgMHgwNSwgMHgwNSwgMHgwMiwgMHgxNSwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NiwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg2OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNSwKLQkgMHgwMCwgMHg2OSwgMHgwMCwgMHgwOTFlLCAweDA5MWEsIDB4MDkxNiwgMHgwMWMxLCAweDAxYzIsIDB4MDFjM30sCi0JewotCSAxNjYsIDU4MzAsIDB4MGEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4NDcsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDUsCi0JIDB4MDAsIDB4NjksIDB4MDAsIDB4MDkyMCwgMHgwOTFjLCAweDA5MTgsIDB4MDFjMSwgMHgwMWMyLCAweDAxYzJ9LAotCXsKLQkgMTY4LCA1ODQwLCAweDBhLCAweDAxLCAweDAxLCAweDAyLCAweDQ4LCAweDA1LCAweDA1LCAweDAyLCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg2LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA0LCAweDAwLCAweDY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA0LAotCSAweDAwLCAweDY5LCAweDAwLCAweDA5MjQsIDB4MDkyMCwgMHgwOTFjLCAweDAxYzAsIDB4MDFjMSwgMHgwMWMyfSwKLQl7Ci0JIDE3MCwgNTg1MCwgMHhlMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHg0OSwgMHgwNSwgMHgwNSwgMHgwMiwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNCwgMHgwMCwgMHg2OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNCwKLQkgMHgwMCwgMHg2OSwgMHgwMCwgMHgwOTI4LCAweDA5MjQsIDB4MDkyMCwgMHgwMWJmLCAweDAxYzAsIDB4MDFjMX0sCi0JewotCSAxNzIsIDU4NjAsIDB4ZGUsIDB4MDAsIDB4MDEsIDB4MDIsIDB4NGEsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODUsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDQsIDB4MDAsIDB4NjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDQsCi0JIDB4MDAsIDB4NjksIDB4MDAsIDB4MDkyYywgMHgwOTI4LCAweDA5MjQsIDB4MDFiZiwgMHgwMWJmLCAweDAxYzB9LAotCXsKLQkgMTc0LCA1ODcwLCAweGRiLCAweDAwLCAweDAxLCAweDAyLCAweDRiLCAweDA1LCAweDA1LCAweDAyLCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg1LCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA0LCAweDAwLCAweDY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA0LAotCSAweDAwLCAweDY4LCAweDAwLCAweDA5MzAsIDB4MDkyYywgMHgwOTI4LCAweDAxYmUsIDB4MDFiZiwgMHgwMWJmfSwKLQl7Ci0JIDE3NiwgNTg4MCwgMHhkOCwgMHgwMCwgMHgwMSwgMHgwMiwgMHg0YywgMHgwNSwgMHgwNSwgMHgwMiwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNCwgMHgwMCwgMHg2OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNCwKLQkgMHgwMCwgMHg2OCwgMHgwMCwgMHgwOTM0LCAweDA5MzAsIDB4MDkyYywgMHgwMWJkLCAweDAxYmUsIDB4MDFiZn0sCi0JewotCSAxNzgsIDU4OTAsIDB4ZDYsIDB4MDAsIDB4MDEsIDB4MDIsIDB4NGQsIDB4MDUsIDB4MDUsIDB4MDIsIDB4MGMsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4ODUsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsCi0JIDB4MDAsIDB4MDQsIDB4MDAsIDB4NjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDQsCi0JIDB4MDAsIDB4NjgsIDB4MDAsIDB4MDkzOCwgMHgwOTM0LCAweDA5MzAsIDB4MDFiYywgMHgwMWJkLCAweDAxYmV9LAotCXsKLQkgMTgwLCA1OTAwLCAweGQzLCAweDAwLCAweDAxLCAweDAyLCAweDRlLCAweDA1LCAweDA1LCAweDAyLCAweDBjLCAweDAxLAotCSAweDA2LCAweDA2LCAweDA2LCAweDg1LCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LAotCSAweDAwLCAweDA0LCAweDAwLCAweDY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDAwLCAweDA0LAotCSAweDAwLCAweDY4LCAweDAwLCAweDA5M2MsIDB4MDkzOCwgMHgwOTM0LCAweDAxYmMsIDB4MDFiYywgMHgwMWJkfSwKLQl7Ci0JIDE4MiwgNTkxMCwgMHhkNiwgMHgwMCwgMHgwMSwgMHgwMiwgMHg0ZiwgMHgwNSwgMHgwNSwgMHgwMiwgMHgwYywgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4NSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywKLQkgMHgwMCwgMHgwNCwgMHgwMCwgMHg2OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHgwMCwgMHgwNCwKLQkgMHgwMCwgMHg2OCwgMHgwMCwgMHgwOTQwLCAweDA5M2MsIDB4MDkzOCwgMHgwMWJiLCAweDAxYmMsIDB4MDFiY30sCi0JewotCSAxLCAyNDEyLCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDZjLCAweDA2LCAweDA2LCAweDA0LCAweDJiLCAweDAxLAotCSAweDA0LCAweDA0LCAweDA0LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDc4LCAweDAwLCAweDAzLCAweDAwLAotCSAweDcwLCAweDAwLCAweDBiLCAweDAwLCAweDBhLCAweDAwLCAweDg5LCAweDAwLCAweDAzLCAweDAwLCAweDcwLCAweDAwLAotCSAweDBiLCAweDAwLCAweDBhLCAweDAzYzksIDB4MDNjNSwgMHgwM2MxLCAweDA0M2EsIDB4MDQzZiwgMHgwNDQzfSwKLQl7Ci0JIDIsIDI0MTcsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4NzEsIDB4MDYsIDB4MDYsIDB4MDQsIDB4MmIsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzgsIDB4MDAsIDB4MDMsIDB4MDAsCi0JIDB4NzAsIDB4MDAsIDB4MGIsIDB4MDAsIDB4MGEsIDB4MDAsIDB4ODksIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsIDB4MDAsCi0JIDB4MGIsIDB4MDAsIDB4MGEsIDB4MDNjYiwgMHgwM2M3LCAweDAzYzMsIDB4MDQzOCwgMHgwNDNkLCAweDA0NDF9LAotCXsKLQkgMywgMjQyMiwgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg3NiwgMHgwNiwgMHgwNiwgMHgwNCwgMHgyYiwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2NywgMHgwMCwgMHgwMywgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwYiwgMHgwMCwgMHgwYSwgMHgwMCwgMHg4OSwgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwYiwgMHgwMCwgMHgwYSwgMHgwM2NkLCAweDAzYzksIDB4MDNjNSwgMHgwNDM2LCAweDA0M2EsIDB4MDQzZn0sCi0JewotCSA0LCAyNDI3LCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDdiLCAweDA2LCAweDA2LCAweDA0LCAweDJiLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDU3LCAweDAwLCAweDAzLCAweDAwLAotCSAweDcwLCAweDAwLCAweDBhLCAweDAwLCAweDBhLCAweDAwLCAweDc4LCAweDAwLCAweDAzLCAweDAwLCAweDcwLCAweDAwLAotCSAweDBhLCAweDAwLCAweDBhLCAweDAzY2YsIDB4MDNjYiwgMHgwM2M3LCAweDA0MzQsIDB4MDQzOCwgMHgwNDNkfSwKLQl7Ci0JIDUsIDI0MzIsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4ODAsIDB4MDYsIDB4MDYsIDB4MDQsIDB4MmIsIDB4MDEsCi0JIDB4MDUsIDB4MDUsIDB4MDUsIDB4OGYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTYsIDB4MDAsIDB4MDMsIDB4MDAsCi0JIDB4NzAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MGEsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4NzAsIDB4MDAsCi0JIDB4MGEsIDB4MDAsIDB4MGEsIDB4MDNkMSwgMHgwM2NkLCAweDAzYzksIDB4MDQzMSwgMHgwNDM2LCAweDA0M2F9LAotCXsKLQkgNiwgMjQzNywgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg4NSwgMHgwNiwgMHgwNiwgMHgwNCwgMHgyYiwgMHgwMSwKLQkgMHgwNSwgMHgwNSwgMHgwNSwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NiwgMHgwMCwgMHgwMywgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwYSwgMHgwMCwgMHg3NiwgMHgwMCwgMHgwMywgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwYSwgMHgwMCwgMHgwYSwgMHgwM2QzLCAweDAzY2YsIDB4MDNjYiwgMHgwNDJmLCAweDA0MzQsIDB4MDQzOH0sCi0JewotCSA3LCAyNDQyLCAweDAwLCAweDAxLCAweDAzLCAweDA5LCAweDhhLCAweDA2LCAweDA2LCAweDA0LCAweDJiLCAweDAxLAotCSAweDA1LCAweDA1LCAweDA1LCAweDhmLCAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDQ1LCAweDAwLCAweDAyLCAweDAwLAotCSAweDcwLCAweDAwLCAweDBhLCAweDAwLCAweDBhLCAweDAwLCAweDY2LCAweDAwLCAweDAyLCAweDAwLCAweDcwLCAweDAwLAotCSAweDBhLCAweDAwLCAweDBhLCAweDAzZDUsIDB4MDNkMSwgMHgwM2NkLCAweDA0MmQsIDB4MDQzMSwgMHgwNDM2fSwKLQl7Ci0JIDgsIDI0NDcsIDB4MDAsIDB4MDEsIDB4MDMsIDB4MDksIDB4OGYsIDB4MDYsIDB4MDYsIDB4MDQsIDB4MmIsIDB4MDEsCi0JIDB4MDYsIDB4MDYsIDB4MDYsIDB4OGYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzQsIDB4MDAsIDB4MDIsIDB4MDAsCi0JIDB4NzAsIDB4MDAsIDB4MGEsIDB4MDAsIDB4MDksIDB4MDAsIDB4NTUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4NzAsIDB4MDAsCi0JIDB4MGEsIDB4MDAsIDB4MDksIDB4MDNkNywgMHgwM2QzLCAweDAzY2YsIDB4MDQyYiwgMHgwNDJmLCAweDA0MzR9LAotCXsKLQkgOSwgMjQ1MiwgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg5NCwgMHgwNiwgMHgwNiwgMHgwNCwgMHgyYiwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMywgMHgwMCwgMHgwMiwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg0NSwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwYSwgMHgwMCwgMHgwOSwgMHgwM2Q5LCAweDAzZDUsIDB4MDNkMSwgMHgwNDI5LCAweDA0MmQsIDB4MDQzMX0sCi0JewotCSAxMCwgMjQ1NywgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg5OSwgMHgwNiwgMHgwNiwgMHgwNCwgMHgyYiwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwgMHgwMiwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgzNCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwYSwgMHgwMCwgMHgwOSwgMHgwM2RiLCAweDAzZDcsIDB4MDNkMywgMHgwNDI3LCAweDA0MmIsIDB4MDQyZn0sCi0JewotCSAxMSwgMjQ2MiwgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHg5ZSwgMHgwNiwgMHgwNiwgMHgwNCwgMHgyYiwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgzMywgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwOSwgMHgwMCwgMHgwOSwgMHgwM2RkLCAweDAzZDksIDB4MDNkNSwgMHgwNDI0LCAweDA0MjksIDB4MDQyZH0sCi0JewotCSAxMiwgMjQ2NywgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHhhMywgMHgwNiwgMHgwNiwgMHgwNCwgMHgyYiwgMHgwMSwKLQkgMHgwNiwgMHgwNiwgMHgwNiwgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgyMiwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwOSwgMHgwMCwgMHgwOSwgMHgwM2RmLCAweDAzZGIsIDB4MDNkNywgMHgwNDIyLCAweDA0MjcsIDB4MDQyYn0sCi0JewotCSAxMywgMjQ3MiwgMHgwMCwgMHgwMSwgMHgwMywgMHgwOSwgMHhhOCwgMHgwNiwgMHgwNiwgMHgwNCwgMHgyYiwgMHgwMSwKLQkgMHgwNywgMHgwNywgMHgwNywgMHg4ZiwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgxMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwOSwgMHgwMCwgMHgwOSwgMHgwM2UxLCAweDAzZGQsIDB4MDNkOSwgMHgwNDIwLCAweDA0MjQsIDB4MDQyOX0sCi0JewotCSAxNCwgMjQ4NCwgMHhmZiwgMHgwMSwgMHgwMywgMHgwOSwgMHhiNCwgMHgwNiwgMHgwNiwgMHgwNCwgMHgyYiwgMHgwMSwKLQkgMHgwNywgMHgwNywgMHgwNywgMHg4ZiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwKLQkgMHg3MCwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHg3MCwgMHgwMCwKLQkgMHgwOSwgMHgwMCwgMHgwOSwgMHgwM2U2LCAweDAzZTIsIDB4MDNkZSwgMHgwNDFiLCAweDA0MWYsIDB4MDQyNH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2hhbl9pbmZvX25waHlfcmFkaW8yMDU3IGNoYW5faW5mb19ucGh5cmV2N18yMDU3X3JldjRbXSA9IHsKLQl7Ci0JIDE4NCwgNDkyMCwgMHg2OCwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhlYywgMHgwMSwgMHgwZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwN2I0LCAweDA3YjAsIDB4MDdhYywgMHgwMjE0LAotCSAweDAyMTUsCi0JIDB4MDIxNiwKLQkgfSwKLQl7Ci0JIDE4NiwgNDkzMCwgMHg2YiwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhlZCwgMHgwMSwgMHgwZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwN2I4LCAweDA3YjQsIDB4MDdiMCwgMHgwMjEzLAotCSAweDAyMTQsCi0JIDB4MDIxNSwKLQkgfSwKLQl7Ci0JIDE4OCwgNDk0MCwgMHg2ZSwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhlZSwgMHgwMSwgMHgwZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwN2JjLCAweDA3YjgsIDB4MDdiNCwgMHgwMjEyLAotCSAweDAyMTMsCi0JIDB4MDIxNCwKLQkgfSwKLQl7Ci0JIDE5MCwgNDk1MCwgMHg3MiwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhlZiwgMHgwMSwgMHgwZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwN2MwLCAweDA3YmMsIDB4MDdiOCwgMHgwMjExLAotCSAweDAyMTIsCi0JIDB4MDIxMywKLQkgfSwKLQl7Ci0JIDE5MiwgNDk2MCwgMHg3NSwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmMCwgMHgwMSwgMHgwZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwN2M0LCAweDA3YzAsIDB4MDdiYywgMHgwMjBmLAotCSAweDAyMTEsCi0JIDB4MDIxMiwKLQkgfSwKLQl7Ci0JIDE5NCwgNDk3MCwgMHg3OCwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmMSwgMHgwMSwgMHgwZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwN2M4LCAweDA3YzQsIDB4MDdjMCwgMHgwMjBlLAotCSAweDAyMGYsCi0JIDB4MDIxMSwKLQkgfSwKLQl7Ci0JIDE5NiwgNDk4MCwgMHg3YywgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmMiwgMHgwMSwgMHgwZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwN2NjLCAweDA3YzgsIDB4MDdjNCwgMHgwMjBkLAotCSAweDAyMGUsCi0JIDB4MDIwZiwKLQkgfSwKLQl7Ci0JIDE5OCwgNDk5MCwgMHg3ZiwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmMywgMHgwMSwgMHgwZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwN2QwLCAweDA3Y2MsIDB4MDdjOCwgMHgwMjBjLAotCSAweDAyMGQsCi0JIDB4MDIwZSwKLQkgfSwKLQl7Ci0JIDIwMCwgNTAwMCwgMHg4MiwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmNCwgMHgwMSwgMHgwZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwN2Q0LCAweDA3ZDAsIDB4MDdjYywgMHgwMjBiLAotCSAweDAyMGMsCi0JIDB4MDIwZCwKLQkgfSwKLQl7Ci0JIDIwMiwgNTAxMCwgMHg4NiwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmNSwgMHgwMSwgMHgwZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwN2Q4LCAweDA3ZDQsIDB4MDdkMCwgMHgwMjBhLAotCSAweDAyMGIsCi0JIDB4MDIwYywKLQkgfSwKLQl7Ci0JIDIwNCwgNTAyMCwgMHg4OSwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmNiwgMHgwMSwgMHgwZSwKLQkgMHgwMCwgMHgwZSwgMHgwMCwgMHhlZSwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwN2RjLCAweDA3ZDgsIDB4MDdkNCwgMHgwMjA5LAotCSAweDAyMGEsCi0JIDB4MDIwYiwKLQkgfSwKLQl7Ci0JIDIwNiwgNTAzMCwgMHg4YywgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmNywgMHgwMSwgMHgwZSwKLQkgMHgwMCwgMHgwZSwgMHgwMCwgMHhlZSwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwN2UwLCAweDA3ZGMsIDB4MDdkOCwgMHgwMjA4LAotCSAweDAyMDksCi0JIDB4MDIwYSwKLQkgfSwKLQl7Ci0JIDIwOCwgNTA0MCwgMHg5MCwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmOCwgMHgwMSwgMHgwZSwKLQkgMHgwMCwgMHgwZSwgMHgwMCwgMHhlZSwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwN2U0LCAweDA3ZTAsIDB4MDdkYywgMHgwMjA3LAotCSAweDAyMDgsCi0JIDB4MDIwOSwKLQkgfSwKLQl7Ci0JIDIxMCwgNTA1MCwgMHg5MywgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmOSwgMHgwMSwgMHgwZSwKLQkgMHgwMCwgMHgwZSwgMHgwMCwgMHhlZSwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhmMywgMHgwMCwgMHhlZiwgMHgwN2U4LCAweDA3ZTQsIDB4MDdlMCwgMHgwMjA2LAotCSAweDAyMDcsCi0JIDB4MDIwOCwKLQkgfSwKLQl7Ci0JIDIxMiwgNTA2MCwgMHg5NiwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmYSwgMHgwMSwgMHgwZSwKLQkgMHgwMCwgMHgwZSwgMHgwMCwgMHhlZSwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhlMywgMHgwMCwgMHhlZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhlMywgMHgwMCwgMHhlZiwgMHgwN2VjLCAweDA3ZTgsIDB4MDdlNCwgMHgwMjA1LAotCSAweDAyMDYsCi0JIDB4MDIwNywKLQkgfSwKLQl7Ci0JIDIxNCwgNTA3MCwgMHg5YSwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmYiwgMHgwMSwgMHgwZSwKLQkgMHgwMCwgMHgwZSwgMHgwMCwgMHhlZSwgMHgwMCwgMHgwMCwgMHgwZSwgMHgwZiwgMHhlMywgMHgwMCwgMHhlZiwgMHgwMCwKLQkgMHgwMCwgMHgwZSwgMHgwZiwgMHhlMywgMHgwMCwgMHhlZiwgMHgwN2YwLCAweDA3ZWMsIDB4MDdlOCwgMHgwMjA0LAotCSAweDAyMDUsCi0JIDB4MDIwNiwKLQkgfSwKLQl7Ci0JIDIxNiwgNTA4MCwgMHg5ZCwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmYywgMHgwMSwgMHgwZSwKLQkgMHgwMCwgMHgwZSwgMHgwMCwgMHhlZSwgMHgwMCwgMHgwMCwgMHgwZSwgMHgwZiwgMHhlMywgMHgwMCwgMHhlZiwgMHgwMCwKLQkgMHgwMCwgMHgwZSwgMHgwZiwgMHhlMywgMHgwMCwgMHhlZiwgMHgwN2Y0LCAweDA3ZjAsIDB4MDdlYywgMHgwMjAzLAotCSAweDAyMDQsCi0JIDB4MDIwNSwKLQkgfSwKLQl7Ci0JIDIxOCwgNTA5MCwgMHhhMCwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmZCwgMHgwMSwgMHgwZSwKLQkgMHgwMCwgMHgwZSwgMHgwMCwgMHhlZSwgMHgwMCwgMHgwMCwgMHgwZSwgMHgwZiwgMHhlMywgMHgwMCwgMHhkNiwgMHgwMCwKLQkgMHgwMCwgMHgwZSwgMHgwZiwgMHhlMywgMHgwMCwgMHhkNiwgMHgwN2Y4LCAweDA3ZjQsIDB4MDdmMCwgMHgwMjAyLAotCSAweDAyMDMsCi0JIDB4MDIwNCwKLQkgfSwKLQl7Ci0JIDIyMCwgNTEwMCwgMHhhNCwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmZSwgMHgwMSwgMHgwZCwKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHhkZCwgMHgwMCwgMHgwMCwgMHgwZSwgMHgwZiwgMHhlMywgMHgwMCwgMHhkNiwgMHgwMCwKLQkgMHgwMCwgMHgwZSwgMHgwZiwgMHhlMywgMHgwMCwgMHhkNiwgMHgwN2ZjLCAweDA3ZjgsIDB4MDdmNCwgMHgwMjAxLAotCSAweDAyMDIsCi0JIDB4MDIwMywKLQkgfSwKLQl7Ci0JIDIyMiwgNTExMCwgMHhhNywgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmZiwgMHgwMSwgMHgwZCwKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHhkZCwgMHgwMCwgMHgwMCwgMHgwZSwgMHgwZiwgMHhlMywgMHgwMCwgMHhkNiwgMHgwMCwKLQkgMHgwMCwgMHgwZSwgMHgwZiwgMHhlMywgMHgwMCwgMHhkNiwgMHgwODAwLCAweDA3ZmMsIDB4MDdmOCwgMHgwMjAwLAotCSAweDAyMDEsCi0JIDB4MDIwMiwKLQkgfSwKLQl7Ci0JIDIyNCwgNTEyMCwgMHhhYSwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgwMCwgMHgwMiwgMHgwZCwKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHhkZCwgMHgwMCwgMHgwMCwgMHgwZSwgMHgwZiwgMHhlMywgMHgwMCwgMHhkNiwgMHgwMCwKLQkgMHgwMCwgMHgwZSwgMHgwZiwgMHhlMywgMHgwMCwgMHhkNiwgMHgwODA0LCAweDA4MDAsIDB4MDdmYywgMHgwMWZmLAotCSAweDAyMDAsCi0JIDB4MDIwMSwKLQkgfSwKLQl7Ci0JIDIyNiwgNTEzMCwgMHhhZSwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgwMSwgMHgwMiwgMHgwZCwKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHhkZCwgMHgwMCwgMHgwMCwgMHgwZSwgMHgwZiwgMHhlMywgMHgwMCwgMHhkNiwgMHgwMCwKLQkgMHgwMCwgMHgwZSwgMHgwZiwgMHhlMywgMHgwMCwgMHhkNiwgMHgwODA4LCAweDA4MDQsIDB4MDgwMCwgMHgwMWZlLAotCSAweDAxZmYsCi0JIDB4MDIwMCwKLQkgfSwKLQl7Ci0JIDIyOCwgNTE0MCwgMHhiMSwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgwMiwgMHgwMiwgMHgwZCwKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHhkZCwgMHgwMCwgMHgwMCwgMHgwZSwgMHgwZSwgMHhlMywgMHgwMCwgMHhkNiwgMHgwMCwKLQkgMHgwMCwgMHgwZSwgMHgwZSwgMHhlMywgMHgwMCwgMHhkNiwgMHgwODBjLCAweDA4MDgsIDB4MDgwNCwgMHgwMWZkLAotCSAweDAxZmUsCi0JIDB4MDFmZiwKLQkgfSwKLQl7Ci0JIDMyLCA1MTYwLCAweGI4LCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDA0LCAweDAyLCAweDBkLAotCSAweDAwLCAweDBkLCAweDAwLCAweGRkLCAweDAwLCAweDAwLCAweDBkLCAweDBlLCAweGUzLCAweDAwLCAweGQ2LCAweDAwLAotCSAweDAwLCAweDBkLCAweDBlLCAweGUzLCAweDAwLCAweGQ2LCAweDA4MTQsIDB4MDgxMCwgMHgwODBjLCAweDAxZmIsCi0JIDB4MDFmYywKLQkgMHgwMWZkLAotCSB9LAotCXsKLQkgMzQsIDUxNzAsIDB4YmIsIDB4MTYsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MDUsIDB4MDIsIDB4MGQsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4MGQsIDB4MGUsIDB4ZTMsIDB4MDAsIDB4ZDYsIDB4MDAsCi0JIDB4MDAsIDB4MGQsIDB4MGUsIDB4ZTMsIDB4MDAsIDB4ZDYsIDB4MDgxOCwgMHgwODE0LCAweDA4MTAsIDB4MDFmYSwKLQkgMHgwMWZiLAotCSAweDAxZmMsCi0JIH0sCi0JewotCSAzNiwgNTE4MCwgMHhiZSwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgwNiwgMHgwMiwgMHgwYywKLQkgMHgwMCwgMHgwYywgMHgwMCwgMHhjYywgMHgwMCwgMHgwMCwgMHgwZCwgMHgwZSwgMHhkMywgMHgwMCwgMHhkNiwgMHgwMCwKLQkgMHgwMCwgMHgwZCwgMHgwZSwgMHhkMywgMHgwMCwgMHhkNiwgMHgwODFjLCAweDA4MTgsIDB4MDgxNCwgMHgwMWY5LAotCSAweDAxZmEsCi0JIDB4MDFmYiwKLQkgfSwKLQl7Ci0JIDM4LCA1MTkwLCAweGMyLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDA3LCAweDAyLCAweDBjLAotCSAweDAwLCAweDBjLCAweDAwLCAweGNjLCAweDAwLCAweDAwLCAweDBkLCAweDBlLCAweGQzLCAweDAwLCAweGQ2LCAweDAwLAotCSAweDAwLCAweDBkLCAweDBlLCAweGQzLCAweDAwLCAweGQ2LCAweDA4MjAsIDB4MDgxYywgMHgwODE4LCAweDAxZjgsCi0JIDB4MDFmOSwKLQkgMHgwMWZhLAotCSB9LAotCXsKLQkgNDAsIDUyMDAsIDB4YzUsIDB4MTYsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MDgsIDB4MDIsIDB4MGMsCi0JIDB4MDAsIDB4MGMsIDB4MDAsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4MGQsIDB4MGUsIDB4ZDMsIDB4MDAsIDB4ZDYsIDB4MDAsCi0JIDB4MDAsIDB4MGQsIDB4MGUsIDB4ZDMsIDB4MDAsIDB4ZDYsIDB4MDgyNCwgMHgwODIwLCAweDA4MWMsIDB4MDFmNywKLQkgMHgwMWY4LAotCSAweDAxZjksCi0JIH0sCi0JewotCSA0MiwgNTIxMCwgMHhjOCwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgwOSwgMHgwMiwgMHgwYywKLQkgMHgwMCwgMHgwYywgMHgwMCwgMHhjYywgMHgwMCwgMHgwMCwgMHgwZCwgMHgwZSwgMHhkMywgMHgwMCwgMHhkNiwgMHgwMCwKLQkgMHgwMCwgMHgwZCwgMHgwZSwgMHhkMywgMHgwMCwgMHhkNiwgMHgwODI4LCAweDA4MjQsIDB4MDgyMCwgMHgwMWY2LAotCSAweDAxZjcsCi0JIDB4MDFmOCwKLQkgfSwKLQl7Ci0JIDQ0LCA1MjIwLCAweGNjLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDBhLCAweDAyLCAweDBjLAotCSAweDAwLCAweDBjLCAweDAwLCAweGNjLCAweDAwLCAweDAwLCAweDBjLCAweDBlLCAweGQzLCAweDAwLCAweGQ2LCAweDAwLAotCSAweDAwLCAweDBjLCAweDBlLCAweGQzLCAweDAwLCAweGQ2LCAweDA4MmMsIDB4MDgyOCwgMHgwODI0LCAweDAxZjUsCi0JIDB4MDFmNiwKLQkgMHgwMWY3LAotCSB9LAotCXsKLQkgNDYsIDUyMzAsIDB4Y2YsIDB4MTYsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MGIsIDB4MDIsIDB4MGMsCi0JIDB4MDAsIDB4MGMsIDB4MDAsIDB4Y2MsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MGUsIDB4ZDMsIDB4MDAsIDB4ZDYsIDB4MDAsCi0JIDB4MDAsIDB4MGMsIDB4MGUsIDB4ZDMsIDB4MDAsIDB4ZDYsIDB4MDgzMCwgMHgwODJjLCAweDA4MjgsIDB4MDFmNCwKLQkgMHgwMWY1LAotCSAweDAxZjYsCi0JIH0sCi0JewotCSA0OCwgNTI0MCwgMHhkMiwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgwYywgMHgwMiwgMHgwYywKLQkgMHgwMCwgMHgwYywgMHgwMCwgMHhjYywgMHgwMCwgMHgwMCwgMHgwYywgMHgwZSwgMHhkMywgMHgwMCwgMHhkNiwgMHgwMCwKLQkgMHgwMCwgMHgwYywgMHgwZSwgMHhkMywgMHgwMCwgMHhkNiwgMHgwODM0LCAweDA4MzAsIDB4MDgyYywgMHgwMWYzLAotCSAweDAxZjQsCi0JIDB4MDFmNSwKLQkgfSwKLQl7Ci0JIDUwLCA1MjUwLCAweGQ2LCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDBkLCAweDAyLCAweDBjLAotCSAweDAwLCAweDBjLCAweDAwLCAweGNjLCAweDAwLCAweDAwLCAweDBjLCAweDBlLCAweGQzLCAweDAwLCAweGQ2LCAweDAwLAotCSAweDAwLCAweDBjLCAweDBlLCAweGQzLCAweDAwLCAweGQ2LCAweDA4MzgsIDB4MDgzNCwgMHgwODMwLCAweDAxZjIsCi0JIDB4MDFmMywKLQkgMHgwMWY0LAotCSB9LAotCXsKLQkgNTIsIDUyNjAsIDB4ZDksIDB4MTYsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MGUsIDB4MDIsIDB4MGIsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4YmIsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MGQsIDB4ZDMsIDB4MDAsIDB4ZDYsIDB4MDAsCi0JIDB4MDAsIDB4MGMsIDB4MGQsIDB4ZDMsIDB4MDAsIDB4ZDYsIDB4MDgzYywgMHgwODM4LCAweDA4MzQsIDB4MDFmMSwKLQkgMHgwMWYyLAotCSAweDAxZjMsCi0JIH0sCi0JewotCSA1NCwgNTI3MCwgMHhkYywgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgwZiwgMHgwMiwgMHgwYiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwYywgMHgwZCwgMHhkMywgMHgwMCwgMHhkNiwgMHgwMCwKLQkgMHgwMCwgMHgwYywgMHgwZCwgMHhkMywgMHgwMCwgMHhkNiwgMHgwODQwLCAweDA4M2MsIDB4MDgzOCwgMHgwMWYwLAotCSAweDAxZjEsCi0JIDB4MDFmMiwKLQkgfSwKLQl7Ci0JIDU2LCA1MjgwLCAweGUwLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDEwLCAweDAyLCAweDBiLAotCSAweDAwLCAweDBiLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDBjLCAweDBjLCAweGMzLCAweDAwLCAweGQ0LCAweDAwLAotCSAweDAwLCAweDBjLCAweDBjLCAweGMzLCAweDAwLCAweGQ0LCAweDA4NDQsIDB4MDg0MCwgMHgwODNjLCAweDAxZjAsCi0JIDB4MDFmMCwKLQkgMHgwMWYxLAotCSB9LAotCXsKLQkgNTgsIDUyOTAsIDB4ZTMsIDB4MTYsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MTEsIDB4MDIsIDB4MGIsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4YmIsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MGMsIDB4YzMsIDB4MDAsIDB4ZDQsIDB4MDAsCi0JIDB4MDAsIDB4MGMsIDB4MGMsIDB4YzMsIDB4MDAsIDB4ZDQsIDB4MDg0OCwgMHgwODQ0LCAweDA4NDAsIDB4MDFlZiwKLQkgMHgwMWYwLAotCSAweDAxZjAsCi0JIH0sCi0JewotCSA2MCwgNTMwMCwgMHhlNiwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgxMiwgMHgwMiwgMHgwYiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwYywgMHgwYywgMHhjMywgMHgwMCwgMHhkNCwgMHgwMCwKLQkgMHgwMCwgMHgwYywgMHgwYywgMHhjMywgMHgwMCwgMHhkNCwgMHgwODRjLCAweDA4NDgsIDB4MDg0NCwgMHgwMWVlLAotCSAweDAxZWYsCi0JIDB4MDFmMCwKLQkgfSwKLQl7Ci0JIDYyLCA1MzEwLCAweGVhLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDEzLCAweDAyLCAweDBiLAotCSAweDAwLCAweDBiLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDBiLCAweDBjLCAweGMzLCAweDAwLCAweGQ0LCAweDAwLAotCSAweDAwLCAweDBiLCAweDBjLCAweGMzLCAweDAwLCAweGQ0LCAweDA4NTAsIDB4MDg0YywgMHgwODQ4LCAweDAxZWQsCi0JIDB4MDFlZSwKLQkgMHgwMWVmLAotCSB9LAotCXsKLQkgNjQsIDUzMjAsIDB4ZWQsIDB4MTYsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MTQsIDB4MDIsIDB4MGIsCi0JIDB4MDAsIDB4MGIsIDB4MDAsIDB4YmIsIDB4MDAsIDB4MDAsIDB4MGIsIDB4MGMsIDB4YzMsIDB4MDAsIDB4ZDQsIDB4MDAsCi0JIDB4MDAsIDB4MGIsIDB4MGMsIDB4YzMsIDB4MDAsIDB4ZDQsIDB4MDg1NCwgMHgwODUwLCAweDA4NGMsIDB4MDFlYywKLQkgMHgwMWVkLAotCSAweDAxZWUsCi0JIH0sCi0JewotCSA2NiwgNTMzMCwgMHhmMCwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgxNSwgMHgwMiwgMHgwYiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwYiwgMHgwYywgMHhjMywgMHgwMCwgMHhkNCwgMHgwMCwKLQkgMHgwMCwgMHgwYiwgMHgwYywgMHhjMywgMHgwMCwgMHhkNCwgMHgwODU4LCAweDA4NTQsIDB4MDg1MCwgMHgwMWViLAotCSAweDAxZWMsCi0JIDB4MDFlZCwKLQkgfSwKLQl7Ci0JIDY4LCA1MzQwLCAweGY0LCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDE2LCAweDAyLCAweDBhLAotCSAweDAwLCAweDBhLCAweDAwLCAweGFhLCAweDAwLCAweDAwLCAweDBhLCAweDBjLCAweGMzLCAweDAwLCAweGExLCAweDAwLAotCSAweDAwLCAweDBhLCAweDBjLCAweGMzLCAweDAwLCAweGExLCAweDA4NWMsIDB4MDg1OCwgMHgwODU0LCAweDAxZWEsCi0JIDB4MDFlYiwKLQkgMHgwMWVjLAotCSB9LAotCXsKLQkgNzAsIDUzNTAsIDB4ZjcsIDB4MTYsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MTcsIDB4MDIsIDB4MGEsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MGIsIDB4YjMsIDB4MDAsIDB4YTEsIDB4MDAsCi0JIDB4MDAsIDB4MGEsIDB4MGIsIDB4YjMsIDB4MDAsIDB4YTEsIDB4MDg2MCwgMHgwODVjLCAweDA4NTgsIDB4MDFlOSwKLQkgMHgwMWVhLAotCSAweDAxZWIsCi0JIH0sCi0JewotCSA3MiwgNTM2MCwgMHhmYSwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgxOCwgMHgwMiwgMHgwYSwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhhYSwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwYiwgMHhiMywgMHgwMCwgMHhhMSwgMHgwMCwKLQkgMHgwMCwgMHgwYSwgMHgwYiwgMHhiMywgMHgwMCwgMHhhMSwgMHgwODY0LCAweDA4NjAsIDB4MDg1YywgMHgwMWU4LAotCSAweDAxZTksCi0JIDB4MDFlYSwKLQkgfSwKLQl7Ci0JIDc0LCA1MzcwLCAweGZlLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDE5LCAweDAyLCAweDBhLAotCSAweDAwLCAweDBhLCAweDAwLCAweGFhLCAweDAwLCAweDAwLCAweDBhLCAweDBiLCAweGIzLCAweDAwLCAweGExLCAweDAwLAotCSAweDAwLCAweDBhLCAweDBiLCAweGIzLCAweDAwLCAweGExLCAweDA4NjgsIDB4MDg2NCwgMHgwODYwLCAweDAxZTcsCi0JIDB4MDFlOCwKLQkgMHgwMWU5LAotCSB9LAotCXsKLQkgNzYsIDUzODAsIDB4MDEsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MWEsIDB4MDIsIDB4MGEsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MGIsIDB4YjMsIDB4MDAsIDB4YTEsIDB4MDAsCi0JIDB4MDAsIDB4MGEsIDB4MGIsIDB4YjMsIDB4MDAsIDB4YTEsIDB4MDg2YywgMHgwODY4LCAweDA4NjQsIDB4MDFlNiwKLQkgMHgwMWU3LAotCSAweDAxZTgsCi0JIH0sCi0JewotCSA3OCwgNTM5MCwgMHgwNCwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgxYiwgMHgwMiwgMHgwYSwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhhYSwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwYSwgMHhhMywgMHgwMCwgMHhhMSwgMHgwMCwKLQkgMHgwMCwgMHgwYSwgMHgwYSwgMHhhMywgMHgwMCwgMHhhMSwgMHgwODcwLCAweDA4NmMsIDB4MDg2OCwgMHgwMWU1LAotCSAweDAxZTYsCi0JIDB4MDFlNywKLQkgfSwKLQl7Ci0JIDgwLCA1NDAwLCAweDA4LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDFjLCAweDAyLCAweDBhLAotCSAweDAwLCAweDBhLCAweDAwLCAweGFhLCAweDAwLCAweDAwLCAweDA5LCAweDBhLCAweGEzLCAweDAwLCAweDkwLCAweDAwLAotCSAweDAwLCAweDA5LCAweDBhLCAweGEzLCAweDAwLCAweDkwLCAweDA4NzQsIDB4MDg3MCwgMHgwODZjLCAweDAxZTUsCi0JIDB4MDFlNSwKLQkgMHgwMWU2LAotCSB9LAotCXsKLQkgODIsIDU0MTAsIDB4MGIsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MWQsIDB4MDIsIDB4MGEsCi0JIDB4MDAsIDB4MGEsIDB4MDAsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MDksIDB4MGEsIDB4YTMsIDB4MDAsIDB4OTAsIDB4MDAsCi0JIDB4MDAsIDB4MDksIDB4MGEsIDB4YTMsIDB4MDAsIDB4OTAsIDB4MDg3OCwgMHgwODc0LCAweDA4NzAsIDB4MDFlNCwKLQkgMHgwMWU1LAotCSAweDAxZTUsCi0JIH0sCi0JewotCSA4NCwgNTQyMCwgMHgwZSwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgxZSwgMHgwMiwgMHgwOSwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg5OSwgMHgwMCwgMHgwMCwgMHgwOSwgMHgwOSwgMHhhMywgMHgwMCwgMHg5MCwgMHgwMCwKLQkgMHgwMCwgMHgwOSwgMHgwOSwgMHhhMywgMHgwMCwgMHg5MCwgMHgwODdjLCAweDA4NzgsIDB4MDg3NCwgMHgwMWUzLAotCSAweDAxZTQsCi0JIDB4MDFlNSwKLQkgfSwKLQl7Ci0JIDg2LCA1NDMwLCAweDEyLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDFmLCAweDAyLCAweDA5LAotCSAweDAwLCAweDA5LCAweDAwLCAweDk5LCAweDAwLCAweDAwLCAweDA5LCAweDA5LCAweDkzLCAweDAwLCAweDkwLCAweDAwLAotCSAweDAwLCAweDA5LCAweDA5LCAweDkzLCAweDAwLCAweDkwLCAweDA4ODAsIDB4MDg3YywgMHgwODc4LCAweDAxZTIsCi0JIDB4MDFlMywKLQkgMHgwMWU0LAotCSB9LAotCXsKLQkgODgsIDU0NDAsIDB4MTUsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MjAsIDB4MDIsIDB4MDksCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4OTksIDB4MDAsIDB4MDAsIDB4MDksIDB4MDksIDB4OTMsIDB4MDAsIDB4OTAsIDB4MDAsCi0JIDB4MDAsIDB4MDksIDB4MDksIDB4OTMsIDB4MDAsIDB4OTAsIDB4MDg4NCwgMHgwODgwLCAweDA4N2MsIDB4MDFlMSwKLQkgMHgwMWUyLAotCSAweDAxZTMsCi0JIH0sCi0JewotCSA5MCwgNTQ1MCwgMHgxOCwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgyMSwgMHgwMiwgMHgwOSwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg5OSwgMHgwMCwgMHgwMCwgMHgwOSwgMHgwOSwgMHg5MywgMHgwMCwgMHg5MCwgMHgwMCwKLQkgMHgwMCwgMHgwOSwgMHgwOSwgMHg5MywgMHgwMCwgMHg5MCwgMHgwODg4LCAweDA4ODQsIDB4MDg4MCwgMHgwMWUwLAotCSAweDAxZTEsCi0JIDB4MDFlMiwKLQkgfSwKLQl7Ci0JIDkyLCA1NDYwLCAweDFjLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDIyLCAweDAyLCAweDA5LAotCSAweDAwLCAweDA5LCAweDAwLCAweDk5LCAweDAwLCAweDAwLCAweDA4LCAweDA4LCAweDkzLCAweDAwLCAweDkwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDA4LCAweDkzLCAweDAwLCAweDkwLCAweDA4OGMsIDB4MDg4OCwgMHgwODg0LCAweDAxZGYsCi0JIDB4MDFlMCwKLQkgMHgwMWUxLAotCSB9LAotCXsKLQkgOTQsIDU0NzAsIDB4MWYsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MjMsIDB4MDIsIDB4MDksCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4OTksIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4OTMsIDB4MDAsIDB4NjAsIDB4MDAsCi0JIDB4MDAsIDB4MDgsIDB4MDgsIDB4OTMsIDB4MDAsIDB4NjAsIDB4MDg5MCwgMHgwODhjLCAweDA4ODgsIDB4MDFkZSwKLQkgMHgwMWRmLAotCSAweDAxZTAsCi0JIH0sCi0JewotCSA5NiwgNTQ4MCwgMHgyMiwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgyNCwgMHgwMiwgMHgwOSwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg5OSwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwNywgMHg5MywgMHgwMCwgMHg2MCwgMHgwMCwKLQkgMHgwMCwgMHgwOCwgMHgwNywgMHg5MywgMHgwMCwgMHg2MCwgMHgwODk0LCAweDA4OTAsIDB4MDg4YywgMHgwMWRkLAotCSAweDAxZGUsCi0JIDB4MDFkZiwKLQkgfSwKLQl7Ci0JIDk4LCA1NDkwLCAweDI2LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDI1LCAweDAyLCAweDA5LAotCSAweDAwLCAweDA5LCAweDAwLCAweDk5LCAweDAwLCAweDAwLCAweDA4LCAweDA3LCAweDkzLCAweDAwLCAweDYwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDA3LCAweDkzLCAweDAwLCAweDYwLCAweDA4OTgsIDB4MDg5NCwgMHgwODkwLCAweDAxZGQsCi0JIDB4MDFkZCwKLQkgMHgwMWRlLAotCSB9LAotCXsKLQkgMTAwLCA1NTAwLCAweDI5LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDI2LCAweDAyLCAweDA5LAotCSAweDAwLCAweDA5LCAweDAwLCAweDk5LCAweDAwLCAweDAwLCAweDA4LCAweDA3LCAweDkzLCAweDAwLCAweDYwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDA3LCAweDkzLCAweDAwLCAweDYwLCAweDA4OWMsIDB4MDg5OCwgMHgwODk0LCAweDAxZGMsCi0JIDB4MDFkZCwKLQkgMHgwMWRkLAotCSB9LAotCXsKLQkgMTAyLCA1NTEwLCAweDJjLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDI3LCAweDAyLCAweDA5LAotCSAweDAwLCAweDA5LCAweDAwLCAweDk5LCAweDAwLCAweDAwLCAweDA4LCAweDA3LCAweDkzLCAweDAwLCAweDYwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDA3LCAweDkzLCAweDAwLCAweDYwLCAweDA4YTAsIDB4MDg5YywgMHgwODk4LCAweDAxZGIsCi0JIDB4MDFkYywKLQkgMHgwMWRkLAotCSB9LAotCXsKLQkgMTA0LCA1NTIwLCAweDMwLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDI4LCAweDAyLCAweDA4LAotCSAweDAwLCAweDA4LCAweDAwLCAweDg4LCAweDAwLCAweDAwLCAweDA4LCAweDA2LCAweDkzLCAweDAwLCAweDYwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDA2LCAweDkzLCAweDAwLCAweDYwLCAweDA4YTQsIDB4MDhhMCwgMHgwODljLCAweDAxZGEsCi0JIDB4MDFkYiwKLQkgMHgwMWRjLAotCSB9LAotCXsKLQkgMTA2LCA1NTMwLCAweDMzLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDI5LCAweDAyLCAweDA4LAotCSAweDAwLCAweDA4LCAweDAwLCAweDg4LCAweDAwLCAweDAwLCAweDA4LCAweDA2LCAweDkzLCAweDAwLCAweDYwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDA2LCAweDkzLCAweDAwLCAweDYwLCAweDA4YTgsIDB4MDhhNCwgMHgwOGEwLCAweDAxZDksCi0JIDB4MDFkYSwKLQkgMHgwMWRiLAotCSB9LAotCXsKLQkgMTA4LCA1NTQwLCAweDM2LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDJhLCAweDAyLCAweDA4LAotCSAweDAwLCAweDA4LCAweDAwLCAweDg4LCAweDAwLCAweDAwLCAweDA4LCAweDA2LCAweDkzLCAweDAwLCAweDYwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDA2LCAweDkzLCAweDAwLCAweDYwLCAweDA4YWMsIDB4MDhhOCwgMHgwOGE0LCAweDAxZDgsCi0JIDB4MDFkOSwKLQkgMHgwMWRhLAotCSB9LAotCXsKLQkgMTEwLCA1NTUwLCAweDNhLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDJiLCAweDAyLCAweDA4LAotCSAweDAwLCAweDA4LCAweDAwLCAweDg4LCAweDAwLCAweDAwLCAweDA4LCAweDA1LCAweDgzLCAweDAwLCAweDYwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDA1LCAweDgzLCAweDAwLCAweDYwLCAweDA4YjAsIDB4MDhhYywgMHgwOGE4LCAweDAxZDcsCi0JIDB4MDFkOCwKLQkgMHgwMWQ5LAotCSB9LAotCXsKLQkgMTEyLCA1NTYwLCAweDNkLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDJjLCAweDAyLCAweDA4LAotCSAweDAwLCAweDA4LCAweDAwLCAweDg4LCAweDAwLCAweDAwLCAweDA4LCAweDA1LCAweDgzLCAweDAwLCAweDYwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDA1LCAweDgzLCAweDAwLCAweDYwLCAweDA4YjQsIDB4MDhiMCwgMHgwOGFjLCAweDAxZDcsCi0JIDB4MDFkNywKLQkgMHgwMWQ4LAotCSB9LAotCXsKLQkgMTE0LCA1NTcwLCAweDQwLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDJkLCAweDAyLCAweDA4LAotCSAweDAwLCAweDA4LCAweDAwLCAweDg4LCAweDAwLCAweDAwLCAweDA4LCAweDA1LCAweDgzLCAweDAwLCAweDYwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDA1LCAweDgzLCAweDAwLCAweDYwLCAweDA4YjgsIDB4MDhiNCwgMHgwOGIwLCAweDAxZDYsCi0JIDB4MDFkNywKLQkgMHgwMWQ3LAotCSB9LAotCXsKLQkgMTE2LCA1NTgwLCAweDQ0LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDJlLCAweDAyLCAweDA4LAotCSAweDAwLCAweDA4LCAweDAwLCAweDg4LCAweDAwLCAweDAwLCAweDA3LCAweDA1LCAweDgzLCAweDAwLCAweDYwLCAweDAwLAotCSAweDAwLCAweDA3LCAweDA1LCAweDgzLCAweDAwLCAweDYwLCAweDA4YmMsIDB4MDhiOCwgMHgwOGI0LCAweDAxZDUsCi0JIDB4MDFkNiwKLQkgMHgwMWQ3LAotCSB9LAotCXsKLQkgMTE4LCA1NTkwLCAweDQ3LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDJmLCAweDAyLCAweDA4LAotCSAweDAwLCAweDA4LCAweDAwLCAweDg4LCAweDAwLCAweDAwLCAweDA3LCAweDA0LCAweDgzLCAweDAwLCAweDYwLCAweDAwLAotCSAweDAwLCAweDA3LCAweDA0LCAweDgzLCAweDAwLCAweDYwLCAweDA4YzAsIDB4MDhiYywgMHgwOGI4LCAweDAxZDQsCi0JIDB4MDFkNSwKLQkgMHgwMWQ2LAotCSB9LAotCXsKLQkgMTIwLCA1NjAwLCAweDRhLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDMwLCAweDAyLCAweDA4LAotCSAweDAwLCAweDA4LCAweDAwLCAweDg4LCAweDAwLCAweDAwLCAweDA3LCAweDA0LCAweDczLCAweDAwLCAweDMwLCAweDAwLAotCSAweDAwLCAweDA3LCAweDA0LCAweDczLCAweDAwLCAweDMwLCAweDA4YzQsIDB4MDhjMCwgMHgwOGJjLCAweDAxZDMsCi0JIDB4MDFkNCwKLQkgMHgwMWQ1LAotCSB9LAotCXsKLQkgMTIyLCA1NjEwLCAweDRlLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDMxLCAweDAyLCAweDA4LAotCSAweDAwLCAweDA4LCAweDAwLCAweDg4LCAweDAwLCAweDAwLCAweDA2LCAweDA0LCAweDczLCAweDAwLCAweDMwLCAweDAwLAotCSAweDAwLCAweDA2LCAweDA0LCAweDczLCAweDAwLCAweDMwLCAweDA4YzgsIDB4MDhjNCwgMHgwOGMwLCAweDAxZDIsCi0JIDB4MDFkMywKLQkgMHgwMWQ0LAotCSB9LAotCXsKLQkgMTI0LCA1NjIwLCAweDUxLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDMyLCAweDAyLCAweDA3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDc3LCAweDAwLCAweDAwLCAweDA2LCAweDA0LCAweDczLCAweDAwLCAweDMwLCAweDAwLAotCSAweDAwLCAweDA2LCAweDA0LCAweDczLCAweDAwLCAweDMwLCAweDA4Y2MsIDB4MDhjOCwgMHgwOGM0LCAweDAxZDIsCi0JIDB4MDFkMiwKLQkgMHgwMWQzLAotCSB9LAotCXsKLQkgMTI2LCA1NjMwLCAweDU0LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDMzLCAweDAyLCAweDA3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDc3LCAweDAwLCAweDAwLCAweDA2LCAweDA0LCAweDczLCAweDAwLCAweDMwLCAweDAwLAotCSAweDAwLCAweDA2LCAweDA0LCAweDczLCAweDAwLCAweDMwLCAweDA4ZDAsIDB4MDhjYywgMHgwOGM4LCAweDAxZDEsCi0JIDB4MDFkMiwKLQkgMHgwMWQyLAotCSB9LAotCXsKLQkgMTI4LCA1NjQwLCAweDU4LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDM0LCAweDAyLCAweDA3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDc3LCAweDAwLCAweDAwLCAweDA2LCAweDA0LCAweDczLCAweDAwLCAweDMwLCAweDAwLAotCSAweDAwLCAweDA2LCAweDA0LCAweDczLCAweDAwLCAweDMwLCAweDA4ZDQsIDB4MDhkMCwgMHgwOGNjLCAweDAxZDAsCi0JIDB4MDFkMSwKLQkgMHgwMWQyLAotCSB9LAotCXsKLQkgMTMwLCA1NjUwLCAweDViLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDM1LCAweDAyLCAweDA3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDc3LCAweDAwLCAweDAwLCAweDA2LCAweDAzLCAweDYzLCAweDAwLCAweDMwLCAweDAwLAotCSAweDAwLCAweDA2LCAweDAzLCAweDYzLCAweDAwLCAweDMwLCAweDA4ZDgsIDB4MDhkNCwgMHgwOGQwLCAweDAxY2YsCi0JIDB4MDFkMCwKLQkgMHgwMWQxLAotCSB9LAotCXsKLQkgMTMyLCA1NjYwLCAweDVlLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDM2LCAweDAyLCAweDA3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDc3LCAweDAwLCAweDAwLCAweDA2LCAweDAzLCAweDYzLCAweDAwLCAweDMwLCAweDAwLAotCSAweDAwLCAweDA2LCAweDAzLCAweDYzLCAweDAwLCAweDMwLCAweDA4ZGMsIDB4MDhkOCwgMHgwOGQ0LCAweDAxY2UsCi0JIDB4MDFjZiwKLQkgMHgwMWQwLAotCSB9LAotCXsKLQkgMTM0LCA1NjcwLCAweDYyLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDM3LCAweDAyLCAweDA3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDc3LCAweDAwLCAweDAwLCAweDA1LCAweDAzLCAweDYzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA1LCAweDAzLCAweDYzLCAweDAwLCAweDAwLCAweDA4ZTAsIDB4MDhkYywgMHgwOGQ4LCAweDAxY2UsCi0JIDB4MDFjZSwKLQkgMHgwMWNmLAotCSB9LAotCXsKLQkgMTM2LCA1NjgwLCAweDY1LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDM4LCAweDAyLCAweDA3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDc3LCAweDAwLCAweDAwLCAweDA1LCAweDAyLCAweDUzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA1LCAweDAyLCAweDUzLCAweDAwLCAweDAwLCAweDA4ZTQsIDB4MDhlMCwgMHgwOGRjLCAweDAxY2QsCi0JIDB4MDFjZSwKLQkgMHgwMWNlLAotCSB9LAotCXsKLQkgMTM4LCA1NjkwLCAweDY4LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDM5LCAweDAyLCAweDA3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDc3LCAweDAwLCAweDAwLCAweDA1LCAweDAyLCAweDUzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA1LCAweDAyLCAweDUzLCAweDAwLCAweDAwLCAweDA4ZTgsIDB4MDhlNCwgMHgwOGUwLCAweDAxY2MsCi0JIDB4MDFjZCwKLQkgMHgwMWNlLAotCSB9LAotCXsKLQkgMTQwLCA1NzAwLCAweDZjLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDNhLCAweDAyLCAweDA3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDc3LCAweDAwLCAweDAwLCAweDA1LCAweDAyLCAweDUzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA1LCAweDAyLCAweDUzLCAweDAwLCAweDAwLCAweDA4ZWMsIDB4MDhlOCwgMHgwOGU0LCAweDAxY2IsCi0JIDB4MDFjYywKLQkgMHgwMWNkLAotCSB9LAotCXsKLQkgMTQyLCA1NzEwLCAweDZmLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDNiLCAweDAyLCAweDA3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDc3LCAweDAwLCAweDAwLCAweDA1LCAweDAyLCAweDUzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA1LCAweDAyLCAweDUzLCAweDAwLCAweDAwLCAweDA4ZjAsIDB4MDhlYywgMHgwOGU4LCAweDAxY2EsCi0JIDB4MDFjYiwKLQkgMHgwMWNjLAotCSB9LAotCXsKLQkgMTQ0LCA1NzIwLCAweDcyLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDNjLCAweDAyLCAweDA3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDc3LCAweDAwLCAweDAwLCAweDA1LCAweDAyLCAweDUzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA1LCAweDAyLCAweDUzLCAweDAwLCAweDAwLCAweDA4ZjQsIDB4MDhmMCwgMHgwOGVjLCAweDAxYzksCi0JIDB4MDFjYSwKLQkgMHgwMWNiLAotCSB9LAotCXsKLQkgMTQ1LCA1NzI1LCAweDc0LCAweDE3LCAweDIwLCAweDE0LCAweDA4LCAweDA4LCAweDMwLCAweDc5LCAweDA0LCAweDA2LAotCSAweDAwLCAweDA2LCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDA1LCAweDAxLCAweDUzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA1LCAweDAxLCAweDUzLCAweDAwLCAweDAwLCAweDA4ZjYsIDB4MDhmMiwgMHgwOGVlLCAweDAxYzksCi0JIDB4MDFjYSwKLQkgMHgwMWNiLAotCSB9LAotCXsKLQkgMTQ2LCA1NzMwLCAweDc2LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDNkLCAweDAyLCAweDA2LAotCSAweDAwLCAweDA2LCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDA0LCAweDAxLCAweDUzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA0LCAweDAxLCAweDUzLCAweDAwLCAweDAwLCAweDA4ZjgsIDB4MDhmNCwgMHgwOGYwLCAweDAxYzksCi0JIDB4MDFjOSwKLQkgMHgwMWNhLAotCSB9LAotCXsKLQkgMTQ3LCA1NzM1LCAweDc3LCAweDE3LCAweDIwLCAweDE0LCAweDA4LCAweDA4LCAweDMwLCAweDdiLCAweDA0LCAweDA2LAotCSAweDAwLCAweDA2LCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDA0LCAweDAxLCAweDUzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA0LCAweDAxLCAweDUzLCAweDAwLCAweDAwLCAweDA4ZmEsIDB4MDhmNiwgMHgwOGYyLCAweDAxYzgsCi0JIDB4MDFjOSwKLQkgMHgwMWNhLAotCSB9LAotCXsKLQkgMTQ4LCA1NzQwLCAweDc5LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDNlLCAweDAyLCAweDA2LAotCSAweDAwLCAweDA2LCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDA0LCAweDAxLCAweDUzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA0LCAweDAxLCAweDUzLCAweDAwLCAweDAwLCAweDA4ZmMsIDB4MDhmOCwgMHgwOGY0LCAweDAxYzgsCi0JIDB4MDFjOSwKLQkgMHgwMWM5LAotCSB9LAotCXsKLQkgMTQ5LCA1NzQ1LCAweDdiLCAweDE3LCAweDIwLCAweDE0LCAweDA4LCAweDA4LCAweDMwLCAweDdkLCAweDA0LCAweDA2LAotCSAweDAwLCAweDA2LCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDA0LCAweDAxLCAweDUzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA0LCAweDAxLCAweDUzLCAweDAwLCAweDAwLCAweDA4ZmUsIDB4MDhmYSwgMHgwOGY2LCAweDAxYzgsCi0JIDB4MDFjOCwKLQkgMHgwMWM5LAotCSB9LAotCXsKLQkgMTUwLCA1NzUwLCAweDdjLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDNmLCAweDAyLCAweDA2LAotCSAweDAwLCAweDA2LCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDA0LCAweDAxLCAweDUzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA0LCAweDAxLCAweDUzLCAweDAwLCAweDAwLCAweDA5MDAsIDB4MDhmYywgMHgwOGY4LCAweDAxYzcsCi0JIDB4MDFjOCwKLQkgMHgwMWM5LAotCSB9LAotCXsKLQkgMTUxLCA1NzU1LCAweDdlLCAweDE3LCAweDIwLCAweDE0LCAweDA4LCAweDA4LCAweDMwLCAweDdmLCAweDA0LCAweDA2LAotCSAweDAwLCAweDA2LCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDA0LCAweDAxLCAweDUzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA0LCAweDAxLCAweDUzLCAweDAwLCAweDAwLCAweDA5MDIsIDB4MDhmZSwgMHgwOGZhLCAweDAxYzcsCi0JIDB4MDFjOCwKLQkgMHgwMWM4LAotCSB9LAotCXsKLQkgMTUyLCA1NzYwLCAweDgwLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDQwLCAweDAyLCAweDA2LAotCSAweDAwLCAweDA2LCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDA0LCAweDAxLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA0LCAweDAxLCAweDQzLCAweDAwLCAweDAwLCAweDA5MDQsIDB4MDkwMCwgMHgwOGZjLCAweDAxYzYsCi0JIDB4MDFjNywKLQkgMHgwMWM4LAotCSB9LAotCXsKLQkgMTUzLCA1NzY1LCAweDgxLCAweDE3LCAweDIwLCAweDE0LCAweDA4LCAweDA4LCAweDMwLCAweDgxLCAweDA0LCAweDA2LAotCSAweDAwLCAweDA2LCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDA0LCAweDAxLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA0LCAweDAxLCAweDQzLCAweDAwLCAweDAwLCAweDA5MDYsIDB4MDkwMiwgMHgwOGZlLCAweDAxYzYsCi0JIDB4MDFjNywKLQkgMHgwMWM4LAotCSB9LAotCXsKLQkgMTU0LCA1NzcwLCAweDgzLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDQxLCAweDAyLCAweDA2LAotCSAweDAwLCAweDA2LCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDA0LCAweDAxLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA0LCAweDAxLCAweDQzLCAweDAwLCAweDAwLCAweDA5MDgsIDB4MDkwNCwgMHgwOTAwLCAweDAxYzYsCi0JIDB4MDFjNiwKLQkgMHgwMWM3LAotCSB9LAotCXsKLQkgMTU1LCA1Nzc1LCAweDg1LCAweDE3LCAweDIwLCAweDE0LCAweDA4LCAweDA4LCAweDMwLCAweDgzLCAweDA0LCAweDA2LAotCSAweDAwLCAweDA2LCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDA0LCAweDAxLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA0LCAweDAxLCAweDQzLCAweDAwLCAweDAwLCAweDA5MGEsIDB4MDkwNiwgMHgwOTAyLCAweDAxYzUsCi0JIDB4MDFjNiwKLQkgMHgwMWM3LAotCSB9LAotCXsKLQkgMTU2LCA1NzgwLCAweDg2LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDQyLCAweDAyLCAweDA2LAotCSAweDAwLCAweDA2LCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDAzLCAweDAxLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAzLCAweDAxLCAweDQzLCAweDAwLCAweDAwLCAweDA5MGMsIDB4MDkwOCwgMHgwOTA0LCAweDAxYzUsCi0JIDB4MDFjNiwKLQkgMHgwMWM2LAotCSB9LAotCXsKLQkgMTU3LCA1Nzg1LCAweDg4LCAweDE3LCAweDIwLCAweDE0LCAweDA4LCAweDA4LCAweDMwLCAweDg1LCAweDA0LCAweDA1LAotCSAweDAwLCAweDA1LCAweDAwLCAweDU1LCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDA5MGUsIDB4MDkwYSwgMHgwOTA2LCAweDAxYzQsCi0JIDB4MDFjNSwKLQkgMHgwMWM2LAotCSB9LAotCXsKLQkgMTU4LCA1NzkwLCAweDhhLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDQzLCAweDAyLCAweDA1LAotCSAweDAwLCAweDA1LCAweDAwLCAweDU1LCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDA5MTAsIDB4MDkwYywgMHgwOTA4LCAweDAxYzQsCi0JIDB4MDFjNSwKLQkgMHgwMWM2LAotCSB9LAotCXsKLQkgMTU5LCA1Nzk1LCAweDhiLCAweDE3LCAweDIwLCAweDE0LCAweDA4LCAweDA4LCAweDMwLCAweDg3LCAweDA0LCAweDA1LAotCSAweDAwLCAweDA1LCAweDAwLCAweDU1LCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDA5MTIsIDB4MDkwZSwgMHgwOTBhLCAweDAxYzQsCi0JIDB4MDFjNCwKLQkgMHgwMWM1LAotCSB9LAotCXsKLQkgMTYwLCA1ODAwLCAweDhkLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDQ0LCAweDAyLCAweDA1LAotCSAweDAwLCAweDA1LCAweDAwLCAweDU1LCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDA5MTQsIDB4MDkxMCwgMHgwOTBjLCAweDAxYzMsCi0JIDB4MDFjNCwKLQkgMHgwMWM1LAotCSB9LAotCXsKLQkgMTYxLCA1ODA1LCAweDhmLCAweDE3LCAweDIwLCAweDE0LCAweDA4LCAweDA4LCAweDMwLCAweDg5LCAweDA0LCAweDA1LAotCSAweDAwLCAweDA1LCAweDAwLCAweDU1LCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDA5MTYsIDB4MDkxMiwgMHgwOTBlLCAweDAxYzMsCi0JIDB4MDFjNCwKLQkgMHgwMWM0LAotCSB9LAotCXsKLQkgMTYyLCA1ODEwLCAweDkwLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDQ1LCAweDAyLCAweDA1LAotCSAweDAwLCAweDA1LCAweDAwLCAweDU1LCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDA5MTgsIDB4MDkxNCwgMHgwOTEwLCAweDAxYzIsCi0JIDB4MDFjMywKLQkgMHgwMWM0LAotCSB9LAotCXsKLQkgMTYzLCA1ODE1LCAweDkyLCAweDE3LCAweDIwLCAweDE0LCAweDA4LCAweDA4LCAweDMwLCAweDhiLCAweDA0LCAweDA1LAotCSAweDAwLCAweDA1LCAweDAwLCAweDU1LCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDA5MWEsIDB4MDkxNiwgMHgwOTEyLCAweDAxYzIsCi0JIDB4MDFjMywKLQkgMHgwMWM0LAotCSB9LAotCXsKLQkgMTY0LCA1ODIwLCAweDk0LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDQ2LCAweDAyLCAweDA1LAotCSAweDAwLCAweDA1LCAweDAwLCAweDU1LCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDA5MWMsIDB4MDkxOCwgMHgwOTE0LCAweDAxYzIsCi0JIDB4MDFjMiwKLQkgMHgwMWMzLAotCSB9LAotCXsKLQkgMTY1LCA1ODI1LCAweDk1LCAweDE3LCAweDIwLCAweDE0LCAweDA4LCAweDA4LCAweDMwLCAweDhkLCAweDA0LCAweDA1LAotCSAweDAwLCAweDA1LCAweDAwLCAweDU1LCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDA5MWUsIDB4MDkxYSwgMHgwOTE2LCAweDAxYzEsCi0JIDB4MDFjMiwKLQkgMHgwMWMzLAotCSB9LAotCXsKLQkgMTY2LCA1ODMwLCAweDk3LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDQ3LCAweDAyLCAweDA1LAotCSAweDAwLCAweDA1LCAweDAwLCAweDU1LCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDA5MjAsIDB4MDkxYywgMHgwOTE4LCAweDAxYzEsCi0JIDB4MDFjMiwKLQkgMHgwMWMyLAotCSB9LAotCXsKLQkgMTY4LCA1ODQwLCAweDlhLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDQ4LCAweDAyLCAweDA1LAotCSAweDAwLCAweDA1LCAweDAwLCAweDU1LCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDA5MjQsIDB4MDkyMCwgMHgwOTFjLCAweDAxYzAsCi0JIDB4MDFjMSwKLQkgMHgwMWMyLAotCSB9LAotCXsKLQkgMTcwLCA1ODUwLCAweDllLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDQ5LCAweDAyLCAweDA0LAotCSAweDAwLCAweDA0LCAweDAwLCAweDQ0LCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDA5MjgsIDB4MDkyNCwgMHgwOTIwLCAweDAxYmYsCi0JIDB4MDFjMCwKLQkgMHgwMWMxLAotCSB9LAotCXsKLQkgMTcyLCA1ODYwLCAweGExLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDRhLCAweDAyLCAweDA0LAotCSAweDAwLCAweDA0LCAweDAwLCAweDQ0LCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDA5MmMsIDB4MDkyOCwgMHgwOTI0LCAweDAxYmYsCi0JIDB4MDFiZiwKLQkgMHgwMWMwLAotCSB9LAotCXsKLQkgMTc0LCA1ODcwLCAweGE0LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDRiLCAweDAyLCAweDA0LAotCSAweDAwLCAweDA0LCAweDAwLCAweDQ0LCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDA5MzAsIDB4MDkyYywgMHgwOTI4LCAweDAxYmUsCi0JIDB4MDFiZiwKLQkgMHgwMWJmLAotCSB9LAotCXsKLQkgMTc2LCA1ODgwLCAweGE4LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDRjLCAweDAyLCAweDAzLAotCSAweDAwLCAweDAzLCAweDAwLCAweDMzLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDA5MzQsIDB4MDkzMCwgMHgwOTJjLCAweDAxYmQsCi0JIDB4MDFiZSwKLQkgMHgwMWJmLAotCSB9LAotCXsKLQkgMTc4LCA1ODkwLCAweGFiLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDRkLCAweDAyLCAweDAzLAotCSAweDAwLCAweDAzLCAweDAwLCAweDMzLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDA5MzgsIDB4MDkzNCwgMHgwOTMwLCAweDAxYmMsCi0JIDB4MDFiZCwKLQkgMHgwMWJlLAotCSB9LAotCXsKLQkgMTgwLCA1OTAwLCAweGFlLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDRlLCAweDAyLCAweDAzLAotCSAweDAwLCAweDAzLCAweDAwLCAweDMzLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAzLCAweDAwLCAweDQzLCAweDAwLCAweDAwLCAweDA5M2MsIDB4MDkzOCwgMHgwOTM0LCAweDAxYmMsCi0JIDB4MDFiYywKLQkgMHgwMWJkLAotCSB9LAotCXsKLQkgMSwgMjQxMiwgMHg0OCwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg2YywgMHgwOSwgMHgwZiwKLQkgMHgwYSwgMHgwMCwgMHgwYSwgMHgwMCwgMHg3MSwgMHhhMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHg3MSwKLQkgMHhhMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHgwM2M5LCAweDAzYzUsIDB4MDNjMSwgMHgwNDNhLAotCSAweDA0M2YsCi0JIDB4MDQ0MywKLQkgfSwKLQl7Ci0JIDIsIDI0MTcsIDB4NGIsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4NzEsIDB4MDksIDB4MGYsCi0JIDB4MGEsIDB4MDAsIDB4MGEsIDB4MDAsIDB4NzEsIDB4YTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4NzEsCi0JIDB4YTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDNjYiwgMHgwM2M3LCAweDAzYzMsIDB4MDQzOCwKLQkgMHgwNDNkLAotCSAweDA0NDEsCi0JIH0sCi0JewotCSAzLCAyNDIyLCAweDRlLCAweDE2LCAweDMwLCAweDFiLCAweDBhLCAweDBhLCAweDMwLCAweDc2LCAweDA5LCAweDBmLAotCSAweDA5LCAweDAwLCAweDA5LCAweDAwLCAweDcxLCAweDkzLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDcxLAotCSAweDkzLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDAzY2QsIDB4MDNjOSwgMHgwM2M1LCAweDA0MzYsCi0JIDB4MDQzYSwKLQkgMHgwNDNmLAotCSB9LAotCXsKLQkgNCwgMjQyNywgMHg1MiwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg3YiwgMHgwOSwgMHgwZiwKLQkgMHgwOSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg3MSwgMHg5MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHg3MSwKLQkgMHg5MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHgwM2NmLCAweDAzY2IsIDB4MDNjNywgMHgwNDM0LAotCSAweDA0MzgsCi0JIDB4MDQzZCwKLQkgfSwKLQl7Ci0JIDUsIDI0MzIsIDB4NTUsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4ODAsIDB4MDksIDB4MGYsCi0JIDB4MDgsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NTEsIDB4ODMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4NTEsCi0JIDB4ODMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDNkMSwgMHgwM2NkLCAweDAzYzksIDB4MDQzMSwKLQkgMHgwNDM2LAotCSAweDA0M2EsCi0JIH0sCi0JewotCSA2LCAyNDM3LCAweDU4LCAweDE2LCAweDMwLCAweDFiLCAweDBhLCAweDBhLCAweDMwLCAweDg1LCAweDA5LCAweDBmLAotCSAweDA4LCAweDAwLCAweDA4LCAweDAwLCAweDUxLCAweDgzLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDUxLAotCSAweDgzLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDAzZDMsIDB4MDNjZiwgMHgwM2NiLCAweDA0MmYsCi0JIDB4MDQzNCwKLQkgMHgwNDM4LAotCSB9LAotCXsKLQkgNywgMjQ0MiwgMHg1YywgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg4YSwgMHgwOSwgMHgwZiwKLQkgMHgwNywgMHgwMCwgMHgwNywgMHgwMCwgMHg1MSwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHg1MSwKLQkgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHgwM2Q1LCAweDAzZDEsIDB4MDNjZCwgMHgwNDJkLAotCSAweDA0MzEsCi0JIDB4MDQzNiwKLQkgfSwKLQl7Ci0JIDgsIDI0NDcsIDB4NWYsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4OGYsIDB4MDksIDB4MGYsCi0JIDB4MDcsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MzEsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MzEsCi0JIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDNkNywgMHgwM2QzLCAweDAzY2YsIDB4MDQyYiwKLQkgMHgwNDJmLAotCSAweDA0MzQsCi0JIH0sCi0JewotCSA5LCAyNDUyLCAweDYyLCAweDE2LCAweDMwLCAweDFiLCAweDBhLCAweDBhLCAweDMwLCAweDk0LCAweDA5LCAweDBmLAotCSAweDA3LCAweDAwLCAweDA3LCAweDAwLCAweDMxLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDMxLAotCSAweDczLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDAzZDksIDB4MDNkNSwgMHgwM2QxLCAweDA0MjksCi0JIDB4MDQyZCwKLQkgMHgwNDMxLAotCSB9LAotCXsKLQkgMTAsIDI0NTcsIDB4NjYsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4OTksIDB4MDksIDB4MGYsCi0JIDB4MDYsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MzEsIDB4NjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MzEsCi0JIDB4NjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDNkYiwgMHgwM2Q3LCAweDAzZDMsIDB4MDQyNywKLQkgMHgwNDJiLAotCSAweDA0MmYsCi0JIH0sCi0JewotCSAxMSwgMjQ2MiwgMHg2OSwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg5ZSwgMHgwOSwgMHgwZiwKLQkgMHgwNiwgMHgwMCwgMHgwNiwgMHgwMCwgMHgzMSwgMHg2MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHgzMSwKLQkgMHg2MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHgwM2RkLCAweDAzZDksIDB4MDNkNSwgMHgwNDI0LAotCSAweDA0MjksCi0JIDB4MDQyZCwKLQkgfSwKLQl7Ci0JIDEyLCAyNDY3LCAweDZjLCAweDE2LCAweDMwLCAweDFiLCAweDBhLCAweDBhLCAweDMwLCAweGEzLCAweDA5LCAweDBmLAotCSAweDA1LCAweDAwLCAweDA1LCAweDAwLCAweDExLCAweDUzLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDExLAotCSAweDUzLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDAzZGYsIDB4MDNkYiwgMHgwM2Q3LCAweDA0MjIsCi0JIDB4MDQyNywKLQkgMHgwNDJiLAotCSB9LAotCXsKLQkgMTMsIDI0NzIsIDB4NzAsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4YTgsIDB4MDksIDB4MGYsCi0JIDB4MDUsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MTEsIDB4NTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MTEsCi0JIDB4NTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDNlMSwgMHgwM2RkLCAweDAzZDksIDB4MDQyMCwKLQkgMHgwNDI0LAotCSAweDA0MjksCi0JIH0sCi0JewotCSAxNCwgMjQ4NCwgMHg3OCwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHhiNCwgMHgwOSwgMHgwZiwKLQkgMHgwNCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgxMSwgMHg0MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhlMCwgMHgwMCwgMHgxMSwKLQkgMHg0MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhlMCwgMHgwMCwgMHgwM2U2LCAweDAzZTIsIDB4MDNkZSwgMHgwNDFiLAotCSAweDA0MWYsCi0JIDB4MDQyNH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2hhbl9pbmZvX25waHlfcmFkaW8yMDU3X3JldjUgY2hhbl9pbmZvX25waHlyZXY4XzIwNTdfcmV2NVtdID0gewotCXsKLQkgMSwgMjQxMiwgMHg0OCwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg2YywgMHgwOSwgMHgwZCwKLQkgMHgwOCwgMHgwZSwgMHg2MSwgMHgwMywgMHhmZiwgMHg2MSwgMHgwMywgMHhmZiwgMHgwM2M5LCAweDAzYzUsIDB4MDNjMSwKLQkgMHgwNDNhLCAweDA0M2YsIDB4MDQ0M30sCi0JewotCSAyLCAyNDE3LCAweDRiLCAweDE2LCAweDMwLCAweDFiLCAweDBhLCAweDBhLCAweDMwLCAweDcxLCAweDA5LCAweDBkLAotCSAweDA4LCAweDBlLCAweDYxLCAweDAzLCAweGZmLCAweDYxLCAweDAzLCAweGZmLCAweDAzY2IsIDB4MDNjNywgMHgwM2MzLAotCSAweDA0MzgsIDB4MDQzZCwgMHgwNDQxfSwKLQl7Ci0JIDMsIDI0MjIsIDB4NGUsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4NzYsIDB4MDksIDB4MGQsCi0JIDB4MDgsIDB4MGUsIDB4NjEsIDB4MDMsIDB4ZWYsIDB4NjEsIDB4MDMsIDB4ZWYsIDB4MDNjZCwgMHgwM2M5LCAweDAzYzUsCi0JIDB4MDQzNiwgMHgwNDNhLCAweDA0M2Z9LAotCXsKLQkgNCwgMjQyNywgMHg1MiwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg3YiwgMHgwOSwgMHgwYywKLQkgMHgwOCwgMHgwZSwgMHg2MSwgMHgwMywgMHhkZiwgMHg2MSwgMHgwMywgMHhkZiwgMHgwM2NmLCAweDAzY2IsIDB4MDNjNywKLQkgMHgwNDM0LCAweDA0MzgsIDB4MDQzZH0sCi0JewotCSA1LCAyNDMyLCAweDU1LCAweDE2LCAweDMwLCAweDFiLCAweDBhLCAweDBhLCAweDMwLCAweDgwLCAweDA5LCAweDBjLAotCSAweDA3LCAweDBkLCAweDYxLCAweDAzLCAweGNmLCAweDYxLCAweDAzLCAweGNmLCAweDAzZDEsIDB4MDNjZCwgMHgwM2M5LAotCSAweDA0MzEsIDB4MDQzNiwgMHgwNDNhfSwKLQl7Ci0JIDYsIDI0MzcsIDB4NTgsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4ODUsIDB4MDksIDB4MGMsCi0JIDB4MDcsIDB4MGQsIDB4NjEsIDB4MDMsIDB4YmYsIDB4NjEsIDB4MDMsIDB4YmYsIDB4MDNkMywgMHgwM2NmLCAweDAzY2IsCi0JIDB4MDQyZiwgMHgwNDM0LCAweDA0Mzh9LAotCXsKLQkgNywgMjQ0MiwgMHg1YywgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg4YSwgMHgwOSwgMHgwYiwKLQkgMHgwNywgMHgwZCwgMHg2MSwgMHgwMywgMHhhZiwgMHg2MSwgMHgwMywgMHhhZiwgMHgwM2Q1LCAweDAzZDEsIDB4MDNjZCwKLQkgMHgwNDJkLCAweDA0MzEsIDB4MDQzNn0sCi0JewotCSA4LCAyNDQ3LCAweDVmLCAweDE2LCAweDMwLCAweDFiLCAweDBhLCAweDBhLCAweDMwLCAweDhmLCAweDA5LCAweDBiLAotCSAweDA3LCAweDBkLCAweDYxLCAweDAzLCAweDlmLCAweDYxLCAweDAzLCAweDlmLCAweDAzZDcsIDB4MDNkMywgMHgwM2NmLAotCSAweDA0MmIsIDB4MDQyZiwgMHgwNDM0fSwKLQl7Ci0JIDksIDI0NTIsIDB4NjIsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4OTQsIDB4MDksIDB4MGIsCi0JIDB4MDcsIDB4MGQsIDB4NjEsIDB4MDMsIDB4OGYsIDB4NjEsIDB4MDMsIDB4OGYsIDB4MDNkOSwgMHgwM2Q1LCAweDAzZDEsCi0JIDB4MDQyOSwgMHgwNDJkLCAweDA0MzF9LAotCXsKLQkgMTAsIDI0NTcsIDB4NjYsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4OTksIDB4MDksIDB4MGIsCi0JIDB4MDcsIDB4MGMsIDB4NjEsIDB4MDMsIDB4N2YsIDB4NjEsIDB4MDMsIDB4N2YsIDB4MDNkYiwgMHgwM2Q3LCAweDAzZDMsCi0JIDB4MDQyNywgMHgwNDJiLCAweDA0MmZ9LAotCXsKLQkgMTEsIDI0NjIsIDB4NjksIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4OWUsIDB4MDksIDB4MGIsCi0JIDB4MDcsIDB4MGMsIDB4NjEsIDB4MDMsIDB4NmYsIDB4NjEsIDB4MDMsIDB4NmYsIDB4MDNkZCwgMHgwM2Q5LCAweDAzZDUsCi0JIDB4MDQyNCwgMHgwNDI5LCAweDA0MmR9LAotCXsKLQkgMTIsIDI0NjcsIDB4NmMsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4YTMsIDB4MDksIDB4MGIsCi0JIDB4MDYsIDB4MGMsIDB4NjEsIDB4MDMsIDB4NWYsIDB4NjEsIDB4MDMsIDB4NWYsIDB4MDNkZiwgMHgwM2RiLCAweDAzZDcsCi0JIDB4MDQyMiwgMHgwNDI3LCAweDA0MmJ9LAotCXsKLQkgMTMsIDI0NzIsIDB4NzAsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4YTgsIDB4MDksIDB4MGEsCi0JIDB4MDYsIDB4MGIsIDB4NjEsIDB4MDMsIDB4NGYsIDB4NjEsIDB4MDMsIDB4NGYsIDB4MDNlMSwgMHgwM2RkLCAweDAzZDksCi0JIDB4MDQyMCwgMHgwNDI0LCAweDA0Mjl9LAotCXsKLQkgMTQsIDI0ODQsIDB4NzgsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4YjQsIDB4MDksIDB4MGEsCi0JIDB4MDYsIDB4MGIsIDB4NjEsIDB4MDMsIDB4M2YsIDB4NjEsIDB4MDMsIDB4M2YsIDB4MDNlNiwgMHgwM2UyLCAweDAzZGUsCi0JIDB4MDQxYiwgMHgwNDFmLCAweDA0MjR9Ci19OwotCi1zdGF0aWMgc3RydWN0IGNoYW5faW5mb19ucGh5X3JhZGlvMjA1N19yZXY1IGNoYW5faW5mb19ucGh5cmV2OV8yMDU3X3JldjV2MVtdID0gewotCXsKLQkgMSwgMjQxMiwgMHg0OCwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg2YywgMHgwOSwgMHgwZCwKLQkgMHgwOCwgMHgwZSwgMHg2MSwgMHgwMywgMHhmZiwgMHg2MSwgMHgwMywgMHhmZiwgMHgwM2M5LCAweDAzYzUsIDB4MDNjMSwKLQkgMHgwNDNhLCAweDA0M2YsIDB4MDQ0M30sCi0JewotCSAyLCAyNDE3LCAweDRiLCAweDE2LCAweDMwLCAweDFiLCAweDBhLCAweDBhLCAweDMwLCAweDcxLCAweDA5LCAweDBkLAotCSAweDA4LCAweDBlLCAweDYxLCAweDAzLCAweGZmLCAweDYxLCAweDAzLCAweGZmLCAweDAzY2IsIDB4MDNjNywgMHgwM2MzLAotCSAweDA0MzgsIDB4MDQzZCwgMHgwNDQxfSwKLQl7Ci0JIDMsIDI0MjIsIDB4NGUsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4NzYsIDB4MDksIDB4MGQsCi0JIDB4MDgsIDB4MGUsIDB4NjEsIDB4MDMsIDB4ZWYsIDB4NjEsIDB4MDMsIDB4ZWYsIDB4MDNjZCwgMHgwM2M5LCAweDAzYzUsCi0JIDB4MDQzNiwgMHgwNDNhLCAweDA0M2Z9LAotCXsKLQkgNCwgMjQyNywgMHg1MiwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg3YiwgMHgwOSwgMHgwYywKLQkgMHgwOCwgMHgwZSwgMHg2MSwgMHgwMywgMHhkZiwgMHg2MSwgMHgwMywgMHhkZiwgMHgwM2NmLCAweDAzY2IsIDB4MDNjNywKLQkgMHgwNDM0LCAweDA0MzgsIDB4MDQzZH0sCi0JewotCSA1LCAyNDMyLCAweDU1LCAweDE2LCAweDMwLCAweDFiLCAweDBhLCAweDBhLCAweDMwLCAweDgwLCAweDA5LCAweDBjLAotCSAweDA3LCAweDBkLCAweDYxLCAweDAzLCAweGNmLCAweDYxLCAweDAzLCAweGNmLCAweDAzZDEsIDB4MDNjZCwgMHgwM2M5LAotCSAweDA0MzEsIDB4MDQzNiwgMHgwNDNhfSwKLQl7Ci0JIDYsIDI0MzcsIDB4NTgsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4ODUsIDB4MDksIDB4MGMsCi0JIDB4MDcsIDB4MGQsIDB4NjEsIDB4MDMsIDB4YmYsIDB4NjEsIDB4MDMsIDB4YmYsIDB4MDNkMywgMHgwM2NmLCAweDAzY2IsCi0JIDB4MDQyZiwgMHgwNDM0LCAweDA0Mzh9LAotCXsKLQkgNywgMjQ0MiwgMHg1YywgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg4YSwgMHgwOSwgMHgwYiwKLQkgMHgwNywgMHgwZCwgMHg2MSwgMHgwMywgMHhhZiwgMHg2MSwgMHgwMywgMHhhZiwgMHgwM2Q1LCAweDAzZDEsIDB4MDNjZCwKLQkgMHgwNDJkLCAweDA0MzEsIDB4MDQzNn0sCi0JewotCSA4LCAyNDQ3LCAweDVmLCAweDE2LCAweDMwLCAweDFiLCAweDBhLCAweDBhLCAweDMwLCAweDhmLCAweDA5LCAweDBiLAotCSAweDA3LCAweDBkLCAweDYxLCAweDAzLCAweDlmLCAweDYxLCAweDAzLCAweDlmLCAweDAzZDcsIDB4MDNkMywgMHgwM2NmLAotCSAweDA0MmIsIDB4MDQyZiwgMHgwNDM0fSwKLQl7Ci0JIDksIDI0NTIsIDB4NjIsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4OTQsIDB4MDksIDB4MGIsCi0JIDB4MDcsIDB4MGQsIDB4NjEsIDB4MDMsIDB4OGYsIDB4NjEsIDB4MDMsIDB4OGYsIDB4MDNkOSwgMHgwM2Q1LCAweDAzZDEsCi0JIDB4MDQyOSwgMHgwNDJkLCAweDA0MzF9LAotCXsKLQkgMTAsIDI0NTcsIDB4NjYsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4OTksIDB4MDksIDB4MGIsCi0JIDB4MDcsIDB4MGMsIDB4NjEsIDB4MDMsIDB4N2YsIDB4NjEsIDB4MDMsIDB4N2YsIDB4MDNkYiwgMHgwM2Q3LCAweDAzZDMsCi0JIDB4MDQyNywgMHgwNDJiLCAweDA0MmZ9LAotCXsKLQkgMTEsIDI0NjIsIDB4NjksIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4OWUsIDB4MDksIDB4MGIsCi0JIDB4MDcsIDB4MGMsIDB4NjEsIDB4MDMsIDB4NmYsIDB4NjEsIDB4MDMsIDB4NmYsIDB4MDNkZCwgMHgwM2Q5LCAweDAzZDUsCi0JIDB4MDQyNCwgMHgwNDI5LCAweDA0MmR9LAotCXsKLQkgMTIsIDI0NjcsIDB4NmMsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4YTMsIDB4MDksIDB4MGIsCi0JIDB4MDYsIDB4MGMsIDB4NjEsIDB4MDMsIDB4NWYsIDB4NjEsIDB4MDMsIDB4NWYsIDB4MDNkZiwgMHgwM2RiLCAweDAzZDcsCi0JIDB4MDQyMiwgMHgwNDI3LCAweDA0MmJ9LAotCXsKLQkgMTMsIDI0NzIsIDB4NzAsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4YTgsIDB4MDksIDB4MGEsCi0JIDB4MDYsIDB4MGIsIDB4NjEsIDB4MDMsIDB4NGYsIDB4NjEsIDB4MDMsIDB4NGYsIDB4MDNlMSwgMHgwM2RkLCAweDAzZDksCi0JIDB4MDQyMCwgMHgwNDI0LCAweDA0Mjl9LAotCXsKLQkgMTQsIDI0ODQsIDB4NzgsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4YjQsIDB4MDksIDB4MGEsCi0JIDB4MDYsIDB4MGIsIDB4NjEsIDB4MDMsIDB4M2YsIDB4NjEsIDB4MDMsIDB4M2YsIDB4MDNlNiwgMHgwM2UyLCAweDAzZGUsCi0JIDB4MDQxYiwgMHgwNDFmLCAweDA0MjR9Ci19OwotCi1zdGF0aWMgc3RydWN0IGNoYW5faW5mb19ucGh5X3JhZGlvMjA1NyBjaGFuX2luZm9fbnBoeXJldjhfMjA1N19yZXY3W10gPSB7Ci0JewotCSAxODQsIDQ5MjAsIDB4NjgsIDB4MTYsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4ZWMsIDB4MDEsIDB4MGYsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZDMsIDB4MGYsIDB4MGYsIDB4ZDMsIDB4MDAsIDB4ZmYsIDB4MDAsCi0JIDB4MDAsIDB4MGYsIDB4MGYsIDB4ZDMsIDB4MDAsIDB4ZmYsIDB4MDdiNCwgMHgwN2IwLCAweDA3YWMsIDB4MDIxNCwKLQkgMHgwMjE1LAotCSAweDAyMTZ9LAotCXsKLQkgMTg2LCA0OTMwLCAweDZiLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweGVkLCAweDAxLCAweDBmLAotCSAweDAwLCAweDBmLCAweDAwLCAweGZmLCAweDAwLCAweGQzLCAweDBmLCAweDBmLCAweGQzLCAweDAwLCAweGZmLCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweGQzLCAweDAwLCAweGZmLCAweDA3YjgsIDB4MDdiNCwgMHgwN2IwLCAweDAyMTMsCi0JIDB4MDIxNCwKLQkgMHgwMjE1fSwKLQl7Ci0JIDE4OCwgNDk0MCwgMHg2ZSwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhlZSwgMHgwMSwgMHgwZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHhkMywgMHgwZiwgMHgwZiwgMHhkMywgMHgwMCwgMHhmZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhkMywgMHgwMCwgMHhmZiwgMHgwN2JjLCAweDA3YjgsIDB4MDdiNCwgMHgwMjEyLAotCSAweDAyMTMsCi0JIDB4MDIxNH0sCi0JewotCSAxOTAsIDQ5NTAsIDB4NzIsIDB4MTYsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4ZWYsIDB4MDEsIDB4MGYsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4ZDMsIDB4MDAsIDB4ZmYsIDB4MDAsCi0JIDB4MDAsIDB4MGYsIDB4MGYsIDB4ZDMsIDB4MDAsIDB4ZmYsIDB4MDdjMCwgMHgwN2JjLCAweDA3YjgsIDB4MDIxMSwKLQkgMHgwMjEyLAotCSAweDAyMTN9LAotCXsKLQkgMTkyLCA0OTYwLCAweDc1LCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweGYwLCAweDAxLCAweDBmLAotCSAweDAwLCAweDBmLCAweDAwLCAweGZmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweGQzLCAweDAwLCAweGZmLCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweGQzLCAweDAwLCAweGZmLCAweDA3YzQsIDB4MDdjMCwgMHgwN2JjLCAweDAyMGYsCi0JIDB4MDIxMSwKLQkgMHgwMjEyfSwKLQl7Ci0JIDE5NCwgNDk3MCwgMHg3OCwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmMSwgMHgwMSwgMHgwZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhkMywgMHgwMCwgMHhmZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhkMywgMHgwMCwgMHhmZiwgMHgwN2M4LCAweDA3YzQsIDB4MDdjMCwgMHgwMjBlLAotCSAweDAyMGYsCi0JIDB4MDIxMX0sCi0JewotCSAxOTYsIDQ5ODAsIDB4N2MsIDB4MTYsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4ZjIsIDB4MDEsIDB4MGYsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4ZDMsIDB4MDAsIDB4ZmYsIDB4MDAsCi0JIDB4MDAsIDB4MGYsIDB4MGYsIDB4ZDMsIDB4MDAsIDB4ZmYsIDB4MDdjYywgMHgwN2M4LCAweDA3YzQsIDB4MDIwZCwKLQkgMHgwMjBlLAotCSAweDAyMGZ9LAotCXsKLQkgMTk4LCA0OTkwLCAweDdmLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweGYzLCAweDAxLCAweDBmLAotCSAweDAwLCAweDBmLCAweDAwLCAweGZmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweGQzLCAweDAwLCAweGZmLCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweGQzLCAweDAwLCAweGZmLCAweDA3ZDAsIDB4MDdjYywgMHgwN2M4LCAweDAyMGMsCi0JIDB4MDIwZCwKLQkgMHgwMjBlfSwKLQl7Ci0JIDIwMCwgNTAwMCwgMHg4MiwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmNCwgMHgwMSwgMHgwZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhiMywgMHgwMCwgMHhmZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhiMywgMHgwMCwgMHhmZiwgMHgwN2Q0LCAweDA3ZDAsIDB4MDdjYywgMHgwMjBiLAotCSAweDAyMGMsCi0JIDB4MDIwZH0sCi0JewotCSAyMDIsIDUwMTAsIDB4ODYsIDB4MTYsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4ZjUsIDB4MDEsIDB4MGYsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4YjMsIDB4MDAsIDB4ZmYsIDB4MDAsCi0JIDB4MDAsIDB4MGYsIDB4MGYsIDB4YjMsIDB4MDAsIDB4ZmYsIDB4MDdkOCwgMHgwN2Q0LCAweDA3ZDAsIDB4MDIwYSwKLQkgMHgwMjBiLAotCSAweDAyMGN9LAotCXsKLQkgMjA0LCA1MDIwLCAweDg5LCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweGY2LCAweDAxLCAweDBlLAotCSAweDAwLCAweDBlLCAweDAwLCAweGVlLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweGIzLCAweDAwLCAweGZmLCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweGIzLCAweDAwLCAweGZmLCAweDA3ZGMsIDB4MDdkOCwgMHgwN2Q0LCAweDAyMDksCi0JIDB4MDIwYSwKLQkgMHgwMjBifSwKLQl7Ci0JIDIwNiwgNTAzMCwgMHg4YywgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmNywgMHgwMSwgMHgwZSwKLQkgMHgwMCwgMHgwZSwgMHgwMCwgMHhlZSwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhiMywgMHgwMCwgMHhmZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhiMywgMHgwMCwgMHhmZiwgMHgwN2UwLCAweDA3ZGMsIDB4MDdkOCwgMHgwMjA4LAotCSAweDAyMDksCi0JIDB4MDIwYX0sCi0JewotCSAyMDgsIDUwNDAsIDB4OTAsIDB4MTYsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4ZjgsIDB4MDEsIDB4MGUsCi0JIDB4MDAsIDB4MGUsIDB4MDAsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4YjMsIDB4MDAsIDB4ZmYsIDB4MDAsCi0JIDB4MDAsIDB4MGYsIDB4MGYsIDB4YjMsIDB4MDAsIDB4ZmYsIDB4MDdlNCwgMHgwN2UwLCAweDA3ZGMsIDB4MDIwNywKLQkgMHgwMjA4LAotCSAweDAyMDl9LAotCXsKLQkgMjEwLCA1MDUwLCAweDkzLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweGY5LCAweDAxLCAweDBlLAotCSAweDAwLCAweDBlLCAweDAwLCAweGVlLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweGIzLCAweDAwLCAweGZmLCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweGIzLCAweDAwLCAweGZmLCAweDA3ZTgsIDB4MDdlNCwgMHgwN2UwLCAweDAyMDYsCi0JIDB4MDIwNywKLQkgMHgwMjA4fSwKLQl7Ci0JIDIxMiwgNTA2MCwgMHg5NiwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmYSwgMHgwMSwgMHgwZSwKLQkgMHgwMCwgMHgwZSwgMHgwMCwgMHhlZSwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhiMywgMHgwMCwgMHhmZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhiMywgMHgwMCwgMHhmZiwgMHgwN2VjLCAweDA3ZTgsIDB4MDdlNCwgMHgwMjA1LAotCSAweDAyMDYsCi0JIDB4MDIwN30sCi0JewotCSAyMTQsIDUwNzAsIDB4OWEsIDB4MTYsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4ZmIsIDB4MDEsIDB4MGUsCi0JIDB4MDAsIDB4MGUsIDB4MDAsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4YjMsIDB4MDAsIDB4ZmYsIDB4MDAsCi0JIDB4MDAsIDB4MGYsIDB4MGYsIDB4YjMsIDB4MDAsIDB4ZmYsIDB4MDdmMCwgMHgwN2VjLCAweDA3ZTgsIDB4MDIwNCwKLQkgMHgwMjA1LAotCSAweDAyMDZ9LAotCXsKLQkgMjE2LCA1MDgwLCAweDlkLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweGZjLCAweDAxLCAweDBlLAotCSAweDAwLCAweDBlLCAweDAwLCAweGVlLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweGIzLCAweDAwLCAweGZmLCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweGIzLCAweDAwLCAweGZmLCAweDA3ZjQsIDB4MDdmMCwgMHgwN2VjLCAweDAyMDMsCi0JIDB4MDIwNCwKLQkgMHgwMjA1fSwKLQl7Ci0JIDIxOCwgNTA5MCwgMHhhMCwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmZCwgMHgwMSwgMHgwZSwKLQkgMHgwMCwgMHgwZSwgMHgwMCwgMHhlZSwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhiMywgMHgwMCwgMHhmZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhiMywgMHgwMCwgMHhmZiwgMHgwN2Y4LCAweDA3ZjQsIDB4MDdmMCwgMHgwMjAyLAotCSAweDAyMDMsCi0JIDB4MDIwNH0sCi0JewotCSAyMjAsIDUxMDAsIDB4YTQsIDB4MTYsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4ZmUsIDB4MDEsIDB4MGQsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4YTMsIDB4MDAsIDB4ZmMsIDB4MDAsCi0JIDB4MDAsIDB4MGYsIDB4MGYsIDB4YTMsIDB4MDAsIDB4ZmMsIDB4MDdmYywgMHgwN2Y4LCAweDA3ZjQsIDB4MDIwMSwKLQkgMHgwMjAyLAotCSAweDAyMDN9LAotCXsKLQkgMjIyLCA1MTEwLCAweGE3LCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweGZmLCAweDAxLCAweDBkLAotCSAweDAwLCAweDBkLCAweDAwLCAweGRkLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweGEzLCAweDAwLCAweGZjLCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweGEzLCAweDAwLCAweGZjLCAweDA4MDAsIDB4MDdmYywgMHgwN2Y4LCAweDAyMDAsCi0JIDB4MDIwMSwKLQkgMHgwMjAyfSwKLQl7Ci0JIDIyNCwgNTEyMCwgMHhhYSwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgwMCwgMHgwMiwgMHgwZCwKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHhkZCwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhhMywgMHgwMCwgMHhmYywgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhhMywgMHgwMCwgMHhmYywgMHgwODA0LCAweDA4MDAsIDB4MDdmYywgMHgwMWZmLAotCSAweDAyMDAsCi0JIDB4MDIwMX0sCi0JewotCSAyMjYsIDUxMzAsIDB4YWUsIDB4MTYsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MDEsIDB4MDIsIDB4MGQsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4YTMsIDB4MDAsIDB4ZmMsIDB4MDAsCi0JIDB4MDAsIDB4MGYsIDB4MGYsIDB4YTMsIDB4MDAsIDB4ZmMsIDB4MDgwOCwgMHgwODA0LCAweDA4MDAsIDB4MDFmZSwKLQkgMHgwMWZmLAotCSAweDAyMDB9LAotCXsKLQkgMjI4LCA1MTQwLCAweGIxLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDAyLCAweDAyLCAweDBkLAotCSAweDAwLCAweDBkLCAweDAwLCAweGRkLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweGEzLCAweDAwLCAweGZjLCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweGEzLCAweDAwLCAweGZjLCAweDA4MGMsIDB4MDgwOCwgMHgwODA0LCAweDAxZmQsCi0JIDB4MDFmZSwKLQkgMHgwMWZmfSwKLQl7Ci0JIDMyLCA1MTYwLCAweGI4LCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDA0LCAweDAyLCAweDBkLAotCSAweDAwLCAweDBkLCAweDAwLCAweGRkLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweGEzLCAweDAwLCAweGZjLCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweGEzLCAweDAwLCAweGZjLCAweDA4MTQsIDB4MDgxMCwgMHgwODBjLCAweDAxZmIsCi0JIDB4MDFmYywKLQkgMHgwMWZkfSwKLQl7Ci0JIDM0LCA1MTcwLCAweGJiLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDA1LCAweDAyLCAweDBkLAotCSAweDAwLCAweDBkLCAweDAwLCAweGRkLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweGEzLCAweDAwLCAweGZjLCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweGEzLCAweDAwLCAweGZjLCAweDA4MTgsIDB4MDgxNCwgMHgwODEwLCAweDAxZmEsCi0JIDB4MDFmYiwKLQkgMHgwMWZjfSwKLQl7Ci0JIDM2LCA1MTgwLCAweGJlLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDA2LCAweDAyLCAweDBjLAotCSAweDAwLCAweDBjLCAweDAwLCAweGNjLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweGEzLCAweDAwLCAweGZjLCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweGEzLCAweDAwLCAweGZjLCAweDA4MWMsIDB4MDgxOCwgMHgwODE0LCAweDAxZjksCi0JIDB4MDFmYSwKLQkgMHgwMWZifSwKLQl7Ci0JIDM4LCA1MTkwLCAweGMyLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDA3LCAweDAyLCAweDBjLAotCSAweDAwLCAweDBjLCAweDAwLCAweGNjLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweGEzLCAweDAwLCAweGZjLCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweGEzLCAweDAwLCAweGZjLCAweDA4MjAsIDB4MDgxYywgMHgwODE4LCAweDAxZjgsCi0JIDB4MDFmOSwKLQkgMHgwMWZhfSwKLQl7Ci0JIDQwLCA1MjAwLCAweGM1LCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDA4LCAweDAyLCAweDBjLAotCSAweDAwLCAweDBjLCAweDAwLCAweGNjLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDkzLCAweDAwLCAweGY4LCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweDkzLCAweDAwLCAweGY4LCAweDA4MjQsIDB4MDgyMCwgMHgwODFjLCAweDAxZjcsCi0JIDB4MDFmOCwKLQkgMHgwMWY5fSwKLQl7Ci0JIDQyLCA1MjEwLCAweGM4LCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDA5LCAweDAyLCAweDBjLAotCSAweDAwLCAweDBjLCAweDAwLCAweGNjLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDkzLCAweDAwLCAweGY4LCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweDkzLCAweDAwLCAweGY4LCAweDA4MjgsIDB4MDgyNCwgMHgwODIwLCAweDAxZjYsCi0JIDB4MDFmNywKLQkgMHgwMWY4fSwKLQl7Ci0JIDQ0LCA1MjIwLCAweGNjLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDBhLCAweDAyLCAweDBjLAotCSAweDAwLCAweDBjLCAweDAwLCAweGNjLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDkzLCAweDAwLCAweGY4LCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweDkzLCAweDAwLCAweGY4LCAweDA4MmMsIDB4MDgyOCwgMHgwODI0LCAweDAxZjUsCi0JIDB4MDFmNiwKLQkgMHgwMWY3fSwKLQl7Ci0JIDQ2LCA1MjMwLCAweGNmLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDBiLCAweDAyLCAweDBjLAotCSAweDAwLCAweDBjLCAweDAwLCAweGNjLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDkzLCAweDAwLCAweGY4LCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweDkzLCAweDAwLCAweGY4LCAweDA4MzAsIDB4MDgyYywgMHgwODI4LCAweDAxZjQsCi0JIDB4MDFmNSwKLQkgMHgwMWY2fSwKLQl7Ci0JIDQ4LCA1MjQwLCAweGQyLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDBjLCAweDAyLCAweDBjLAotCSAweDAwLCAweDBjLCAweDAwLCAweGNjLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDkzLCAweDAwLCAweGY4LCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweDkzLCAweDAwLCAweGY4LCAweDA4MzQsIDB4MDgzMCwgMHgwODJjLCAweDAxZjMsCi0JIDB4MDFmNCwKLQkgMHgwMWY1fSwKLQl7Ci0JIDUwLCA1MjUwLCAweGQ2LCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDBkLCAweDAyLCAweDBjLAotCSAweDAwLCAweDBjLCAweDAwLCAweGNjLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDkzLCAweDAwLCAweGY4LCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweDkzLCAweDAwLCAweGY4LCAweDA4MzgsIDB4MDgzNCwgMHgwODMwLCAweDAxZjIsCi0JIDB4MDFmMywKLQkgMHgwMWY0fSwKLQl7Ci0JIDUyLCA1MjYwLCAweGQ5LCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDBlLCAweDAyLCAweDBiLAotCSAweDAwLCAweDBiLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDkzLCAweDAwLCAweGY4LCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweDkzLCAweDAwLCAweGY4LCAweDA4M2MsIDB4MDgzOCwgMHgwODM0LCAweDAxZjEsCi0JIDB4MDFmMiwKLQkgMHgwMWYzfSwKLQl7Ci0JIDU0LCA1MjcwLCAweGRjLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDBmLCAweDAyLCAweDBiLAotCSAweDAwLCAweDBiLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDkzLCAweDAwLCAweGY4LCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweDkzLCAweDAwLCAweGY4LCAweDA4NDAsIDB4MDgzYywgMHgwODM4LCAweDAxZjAsCi0JIDB4MDFmMSwKLQkgMHgwMWYyfSwKLQl7Ci0JIDU2LCA1MjgwLCAweGUwLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDEwLCAweDAyLCAweDBiLAotCSAweDAwLCAweDBiLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDkzLCAweDAwLCAweGY4LCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweDkzLCAweDAwLCAweGY4LCAweDA4NDQsIDB4MDg0MCwgMHgwODNjLCAweDAxZjAsCi0JIDB4MDFmMCwKLQkgMHgwMWYxfSwKLQl7Ci0JIDU4LCA1MjkwLCAweGUzLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDExLCAweDAyLCAweDBiLAotCSAweDAwLCAweDBiLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweDkzLCAweDAwLCAweGY4LCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweDkzLCAweDAwLCAweGY4LCAweDA4NDgsIDB4MDg0NCwgMHgwODQwLCAweDAxZWYsCi0JIDB4MDFmMCwKLQkgMHgwMWYwfSwKLQl7Ci0JIDYwLCA1MzAwLCAweGU2LCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDEyLCAweDAyLCAweDBiLAotCSAweDAwLCAweDBiLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDBmLCAweDBjLCAweDgzLCAweDAwLCAweGY1LCAweDAwLAotCSAweDAwLCAweDBmLCAweDBjLCAweDgzLCAweDAwLCAweGY1LCAweDA4NGMsIDB4MDg0OCwgMHgwODQ0LCAweDAxZWUsCi0JIDB4MDFlZiwKLQkgMHgwMWYwfSwKLQl7Ci0JIDYyLCA1MzEwLCAweGVhLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDEzLCAweDAyLCAweDBiLAotCSAweDAwLCAweDBiLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDBmLCAweDBjLCAweDgzLCAweDAwLCAweGY1LCAweDAwLAotCSAweDAwLCAweDBmLCAweDBjLCAweDgzLCAweDAwLCAweGY1LCAweDA4NTAsIDB4MDg0YywgMHgwODQ4LCAweDAxZWQsCi0JIDB4MDFlZSwKLQkgMHgwMWVmfSwKLQl7Ci0JIDY0LCA1MzIwLCAweGVkLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDE0LCAweDAyLCAweDBiLAotCSAweDAwLCAweDBiLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDBmLCAweDBjLCAweDgzLCAweDAwLCAweGY1LCAweDAwLAotCSAweDAwLCAweDBmLCAweDBjLCAweDgzLCAweDAwLCAweGY1LCAweDA4NTQsIDB4MDg1MCwgMHgwODRjLCAweDAxZWMsCi0JIDB4MDFlZCwKLQkgMHgwMWVlfSwKLQl7Ci0JIDY2LCA1MzMwLCAweGYwLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDE1LCAweDAyLCAweDBiLAotCSAweDAwLCAweDBiLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDBmLCAweDBjLCAweDgzLCAweDAwLCAweGY1LCAweDAwLAotCSAweDAwLCAweDBmLCAweDBjLCAweDgzLCAweDAwLCAweGY1LCAweDA4NTgsIDB4MDg1NCwgMHgwODUwLCAweDAxZWIsCi0JIDB4MDFlYywKLQkgMHgwMWVkfSwKLQl7Ci0JIDY4LCA1MzQwLCAweGY0LCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDE2LCAweDAyLCAweDBhLAotCSAweDAwLCAweDBhLCAweDAwLCAweGFhLCAweDAwLCAweDAwLCAweDBmLCAweDBjLCAweDgzLCAweDAwLCAweGY1LCAweDAwLAotCSAweDAwLCAweDBmLCAweDBjLCAweDgzLCAweDAwLCAweGY1LCAweDA4NWMsIDB4MDg1OCwgMHgwODU0LCAweDAxZWEsCi0JIDB4MDFlYiwKLQkgMHgwMWVjfSwKLQl7Ci0JIDcwLCA1MzUwLCAweGY3LCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDE3LCAweDAyLCAweDBhLAotCSAweDAwLCAweDBhLCAweDAwLCAweGFhLCAweDAwLCAweDAwLCAweDBmLCAweDBjLCAweDgzLCAweDAwLCAweGY1LCAweDAwLAotCSAweDAwLCAweDBmLCAweDBjLCAweDgzLCAweDAwLCAweGY1LCAweDA4NjAsIDB4MDg1YywgMHgwODU4LCAweDAxZTksCi0JIDB4MDFlYSwKLQkgMHgwMWVifSwKLQl7Ci0JIDcyLCA1MzYwLCAweGZhLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDE4LCAweDAyLCAweDBhLAotCSAweDAwLCAweDBhLCAweDAwLCAweGFhLCAweDAwLCAweDAwLCAweDBmLCAweDBjLCAweDgzLCAweDAwLCAweGY1LCAweDAwLAotCSAweDAwLCAweDBmLCAweDBjLCAweDgzLCAweDAwLCAweGY1LCAweDA4NjQsIDB4MDg2MCwgMHgwODVjLCAweDAxZTgsCi0JIDB4MDFlOSwKLQkgMHgwMWVhfSwKLQl7Ci0JIDc0LCA1MzcwLCAweGZlLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDE5LCAweDAyLCAweDBhLAotCSAweDAwLCAweDBhLCAweDAwLCAweGFhLCAweDAwLCAweDAwLCAweDBmLCAweDBjLCAweDgzLCAweDAwLCAweGY1LCAweDAwLAotCSAweDAwLCAweDBmLCAweDBjLCAweDgzLCAweDAwLCAweGY1LCAweDA4NjgsIDB4MDg2NCwgMHgwODYwLCAweDAxZTcsCi0JIDB4MDFlOCwKLQkgMHgwMWU5fSwKLQl7Ci0JIDc2LCA1MzgwLCAweDAxLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDFhLCAweDAyLCAweDBhLAotCSAweDAwLCAweDBhLCAweDAwLCAweGFhLCAweDAwLCAweDAwLCAweDBmLCAweDBjLCAweDgzLCAweDAwLCAweGY1LCAweDAwLAotCSAweDAwLCAweDBmLCAweDBjLCAweDgzLCAweDAwLCAweGY1LCAweDA4NmMsIDB4MDg2OCwgMHgwODY0LCAweDAxZTYsCi0JIDB4MDFlNywKLQkgMHgwMWU4fSwKLQl7Ci0JIDc4LCA1MzkwLCAweDA0LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDFiLCAweDAyLCAweDBhLAotCSAweDAwLCAweDBhLCAweDAwLCAweGFhLCAweDAwLCAweDAwLCAweDBmLCAweDBjLCAweDgzLCAweDAwLCAweGY1LCAweDAwLAotCSAweDAwLCAweDBmLCAweDBjLCAweDgzLCAweDAwLCAweGY1LCAweDA4NzAsIDB4MDg2YywgMHgwODY4LCAweDAxZTUsCi0JIDB4MDFlNiwKLQkgMHgwMWU3fSwKLQl7Ci0JIDgwLCA1NDAwLCAweDA4LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDFjLCAweDAyLCAweDBhLAotCSAweDAwLCAweDBhLCAweDAwLCAweGFhLCAweDAwLCAweDAwLCAweDBkLCAweDA5LCAweDUzLCAweDAwLCAweGIxLCAweDAwLAotCSAweDAwLCAweDBkLCAweDA5LCAweDUzLCAweDAwLCAweGIxLCAweDA4NzQsIDB4MDg3MCwgMHgwODZjLCAweDAxZTUsCi0JIDB4MDFlNSwKLQkgMHgwMWU2fSwKLQl7Ci0JIDgyLCA1NDEwLCAweDBiLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDFkLCAweDAyLCAweDBhLAotCSAweDAwLCAweDBhLCAweDAwLCAweGFhLCAweDAwLCAweDAwLCAweDBkLCAweDA5LCAweDUzLCAweDAwLCAweGIxLCAweDAwLAotCSAweDAwLCAweDBkLCAweDA5LCAweDUzLCAweDAwLCAweGIxLCAweDA4NzgsIDB4MDg3NCwgMHgwODcwLCAweDAxZTQsCi0JIDB4MDFlNSwKLQkgMHgwMWU1fSwKLQl7Ci0JIDg0LCA1NDIwLCAweDBlLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDFlLCAweDAyLCAweDA5LAotCSAweDAwLCAweDA5LCAweDAwLCAweDk5LCAweDAwLCAweDAwLCAweDBkLCAweDA5LCAweDUzLCAweDAwLCAweGIxLCAweDAwLAotCSAweDAwLCAweDBkLCAweDA5LCAweDUzLCAweDAwLCAweGIxLCAweDA4N2MsIDB4MDg3OCwgMHgwODc0LCAweDAxZTMsCi0JIDB4MDFlNCwKLQkgMHgwMWU1fSwKLQl7Ci0JIDg2LCA1NDMwLCAweDEyLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDFmLCAweDAyLCAweDA5LAotCSAweDAwLCAweDA5LCAweDAwLCAweDk5LCAweDAwLCAweDAwLCAweDBkLCAweDA5LCAweDUzLCAweDAwLCAweGIxLCAweDAwLAotCSAweDAwLCAweDBkLCAweDA5LCAweDUzLCAweDAwLCAweGIxLCAweDA4ODAsIDB4MDg3YywgMHgwODc4LCAweDAxZTIsCi0JIDB4MDFlMywKLQkgMHgwMWU0fSwKLQl7Ci0JIDg4LCA1NDQwLCAweDE1LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDIwLCAweDAyLCAweDA5LAotCSAweDAwLCAweDA5LCAweDAwLCAweDk5LCAweDAwLCAweDAwLCAweDBkLCAweDA5LCAweDUzLCAweDAwLCAweGIxLCAweDAwLAotCSAweDAwLCAweDBkLCAweDA5LCAweDUzLCAweDAwLCAweGIxLCAweDA4ODQsIDB4MDg4MCwgMHgwODdjLCAweDAxZTEsCi0JIDB4MDFlMiwKLQkgMHgwMWUzfSwKLQl7Ci0JIDkwLCA1NDUwLCAweDE4LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDIxLCAweDAyLCAweDA5LAotCSAweDAwLCAweDA5LCAweDAwLCAweDk5LCAweDAwLCAweDAwLCAweDBkLCAweDA5LCAweDUzLCAweDAwLCAweGIxLCAweDAwLAotCSAweDAwLCAweDBkLCAweDA5LCAweDUzLCAweDAwLCAweGIxLCAweDA4ODgsIDB4MDg4NCwgMHgwODgwLCAweDAxZTAsCi0JIDB4MDFlMSwKLQkgMHgwMWUyfSwKLQl7Ci0JIDkyLCA1NDYwLCAweDFjLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDIyLCAweDAyLCAweDA5LAotCSAweDAwLCAweDA5LCAweDAwLCAweDk5LCAweDAwLCAweDAwLCAweDBkLCAweDA5LCAweDUzLCAweDAwLCAweGIxLCAweDAwLAotCSAweDAwLCAweDBkLCAweDA5LCAweDUzLCAweDAwLCAweGIxLCAweDA4OGMsIDB4MDg4OCwgMHgwODg0LCAweDAxZGYsCi0JIDB4MDFlMCwKLQkgMHgwMWUxfSwKLQl7Ci0JIDk0LCA1NDcwLCAweDFmLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDIzLCAweDAyLCAweDA5LAotCSAweDAwLCAweDA5LCAweDAwLCAweDk5LCAweDAwLCAweDAwLCAweDBkLCAweDA5LCAweDUzLCAweDAwLCAweGIxLCAweDAwLAotCSAweDAwLCAweDBkLCAweDA5LCAweDUzLCAweDAwLCAweGIxLCAweDA4OTAsIDB4MDg4YywgMHgwODg4LCAweDAxZGUsCi0JIDB4MDFkZiwKLQkgMHgwMWUwfSwKLQl7Ci0JIDk2LCA1NDgwLCAweDIyLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDI0LCAweDAyLCAweDA5LAotCSAweDAwLCAweDA5LCAweDAwLCAweDk5LCAweDAwLCAweDAwLCAweDBkLCAweDA5LCAweDUzLCAweDAwLCAweGIxLCAweDAwLAotCSAweDAwLCAweDBkLCAweDA5LCAweDUzLCAweDAwLCAweGIxLCAweDA4OTQsIDB4MDg5MCwgMHgwODhjLCAweDAxZGQsCi0JIDB4MDFkZSwKLQkgMHgwMWRmfSwKLQl7Ci0JIDk4LCA1NDkwLCAweDI2LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDI1LCAweDAyLCAweDA5LAotCSAweDAwLCAweDA5LCAweDAwLCAweDk5LCAweDAwLCAweDAwLCAweDBkLCAweDA5LCAweDUzLCAweDAwLCAweGIxLCAweDAwLAotCSAweDAwLCAweDBkLCAweDA5LCAweDUzLCAweDAwLCAweGIxLCAweDA4OTgsIDB4MDg5NCwgMHgwODkwLCAweDAxZGQsCi0JIDB4MDFkZCwKLQkgMHgwMWRlfSwKLQl7Ci0JIDEwMCwgNTUwMCwgMHgyOSwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgyNiwgMHgwMiwgMHgwOSwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg5OSwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwNiwgMHg0MywgMHgwMCwgMHg4MCwgMHgwMCwKLQkgMHgwMCwgMHgwYSwgMHgwNiwgMHg0MywgMHgwMCwgMHg4MCwgMHgwODljLCAweDA4OTgsIDB4MDg5NCwgMHgwMWRjLAotCSAweDAxZGQsCi0JIDB4MDFkZH0sCi0JewotCSAxMDIsIDU1MTAsIDB4MmMsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MjcsIDB4MDIsIDB4MDksCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4OTksIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDYsIDB4NDMsIDB4MDAsIDB4ODAsIDB4MDAsCi0JIDB4MDAsIDB4MGEsIDB4MDYsIDB4NDMsIDB4MDAsIDB4ODAsIDB4MDhhMCwgMHgwODljLCAweDA4OTgsIDB4MDFkYiwKLQkgMHgwMWRjLAotCSAweDAxZGR9LAotCXsKLQkgMTA0LCA1NTIwLCAweDMwLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDI4LCAweDAyLCAweDA4LAotCSAweDAwLCAweDA4LCAweDAwLCAweDg4LCAweDAwLCAweDAwLCAweDBhLCAweDA2LCAweDQzLCAweDAwLCAweDgwLCAweDAwLAotCSAweDAwLCAweDBhLCAweDA2LCAweDQzLCAweDAwLCAweDgwLCAweDA4YTQsIDB4MDhhMCwgMHgwODljLCAweDAxZGEsCi0JIDB4MDFkYiwKLQkgMHgwMWRjfSwKLQl7Ci0JIDEwNiwgNTUzMCwgMHgzMywgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgyOSwgMHgwMiwgMHgwOCwKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwNiwgMHg0MywgMHgwMCwgMHg4MCwgMHgwMCwKLQkgMHgwMCwgMHgwYSwgMHgwNiwgMHg0MywgMHgwMCwgMHg4MCwgMHgwOGE4LCAweDA4YTQsIDB4MDhhMCwgMHgwMWQ5LAotCSAweDAxZGEsCi0JIDB4MDFkYn0sCi0JewotCSAxMDgsIDU1NDAsIDB4MzYsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MmEsIDB4MDIsIDB4MDgsCi0JIDB4MDAsIDB4MDgsIDB4MDAsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDYsIDB4NDMsIDB4MDAsIDB4ODAsIDB4MDAsCi0JIDB4MDAsIDB4MGEsIDB4MDYsIDB4NDMsIDB4MDAsIDB4ODAsIDB4MDhhYywgMHgwOGE4LCAweDA4YTQsIDB4MDFkOCwKLQkgMHgwMWQ5LAotCSAweDAxZGF9LAotCXsKLQkgMTEwLCA1NTUwLCAweDNhLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDJiLCAweDAyLCAweDA4LAotCSAweDAwLCAweDA4LCAweDAwLCAweDg4LCAweDAwLCAweDAwLCAweDBhLCAweDA2LCAweDQzLCAweDAwLCAweDgwLCAweDAwLAotCSAweDAwLCAweDBhLCAweDA2LCAweDQzLCAweDAwLCAweDgwLCAweDA4YjAsIDB4MDhhYywgMHgwOGE4LCAweDAxZDcsCi0JIDB4MDFkOCwKLQkgMHgwMWQ5fSwKLQl7Ci0JIDExMiwgNTU2MCwgMHgzZCwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgyYywgMHgwMiwgMHgwOCwKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwNiwgMHg0MywgMHgwMCwgMHg4MCwgMHgwMCwKLQkgMHgwMCwgMHgwYSwgMHgwNiwgMHg0MywgMHgwMCwgMHg4MCwgMHgwOGI0LCAweDA4YjAsIDB4MDhhYywgMHgwMWQ3LAotCSAweDAxZDcsCi0JIDB4MDFkOH0sCi0JewotCSAxMTQsIDU1NzAsIDB4NDAsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MmQsIDB4MDIsIDB4MDgsCi0JIDB4MDAsIDB4MDgsIDB4MDAsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDYsIDB4NDMsIDB4MDAsIDB4ODAsIDB4MDAsCi0JIDB4MDAsIDB4MGEsIDB4MDYsIDB4NDMsIDB4MDAsIDB4ODAsIDB4MDhiOCwgMHgwOGI0LCAweDA4YjAsIDB4MDFkNiwKLQkgMHgwMWQ3LAotCSAweDAxZDd9LAotCXsKLQkgMTE2LCA1NTgwLCAweDQ0LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDJlLCAweDAyLCAweDA4LAotCSAweDAwLCAweDA4LCAweDAwLCAweDg4LCAweDAwLCAweDAwLCAweDBhLCAweDA2LCAweDQzLCAweDAwLCAweDgwLCAweDAwLAotCSAweDAwLCAweDBhLCAweDA2LCAweDQzLCAweDAwLCAweDgwLCAweDA4YmMsIDB4MDhiOCwgMHgwOGI0LCAweDAxZDUsCi0JIDB4MDFkNiwKLQkgMHgwMWQ3fSwKLQl7Ci0JIDExOCwgNTU5MCwgMHg0NywgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgyZiwgMHgwMiwgMHgwOCwKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwNiwgMHg0MywgMHgwMCwgMHg4MCwgMHgwMCwKLQkgMHgwMCwgMHgwYSwgMHgwNiwgMHg0MywgMHgwMCwgMHg4MCwgMHgwOGMwLCAweDA4YmMsIDB4MDhiOCwgMHgwMWQ0LAotCSAweDAxZDUsCi0JIDB4MDFkNn0sCi0JewotCSAxMjAsIDU2MDAsIDB4NGEsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MzAsIDB4MDIsIDB4MDgsCi0JIDB4MDAsIDB4MDgsIDB4MDAsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MDksIDB4MDQsIDB4MjMsIDB4MDAsIDB4NjAsIDB4MDAsCi0JIDB4MDAsIDB4MDksIDB4MDQsIDB4MjMsIDB4MDAsIDB4NjAsIDB4MDhjNCwgMHgwOGMwLCAweDA4YmMsIDB4MDFkMywKLQkgMHgwMWQ0LAotCSAweDAxZDV9LAotCXsKLQkgMTIyLCA1NjEwLCAweDRlLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDMxLCAweDAyLCAweDA4LAotCSAweDAwLCAweDA4LCAweDAwLCAweDg4LCAweDAwLCAweDAwLCAweDA5LCAweDA0LCAweDIzLCAweDAwLCAweDYwLCAweDAwLAotCSAweDAwLCAweDA5LCAweDA0LCAweDIzLCAweDAwLCAweDYwLCAweDA4YzgsIDB4MDhjNCwgMHgwOGMwLCAweDAxZDIsCi0JIDB4MDFkMywKLQkgMHgwMWQ0fSwKLQl7Ci0JIDEyNCwgNTYyMCwgMHg1MSwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgzMiwgMHgwMiwgMHgwNywKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHg3NywgMHgwMCwgMHgwMCwgMHgwOSwgMHgwNCwgMHgyMywgMHgwMCwgMHg2MCwgMHgwMCwKLQkgMHgwMCwgMHgwOSwgMHgwNCwgMHgyMywgMHgwMCwgMHg2MCwgMHgwOGNjLCAweDA4YzgsIDB4MDhjNCwgMHgwMWQyLAotCSAweDAxZDIsCi0JIDB4MDFkM30sCi0JewotCSAxMjYsIDU2MzAsIDB4NTQsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MzMsIDB4MDIsIDB4MDcsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDksIDB4MDQsIDB4MjMsIDB4MDAsIDB4NjAsIDB4MDAsCi0JIDB4MDAsIDB4MDksIDB4MDQsIDB4MjMsIDB4MDAsIDB4NjAsIDB4MDhkMCwgMHgwOGNjLCAweDA4YzgsIDB4MDFkMSwKLQkgMHgwMWQyLAotCSAweDAxZDJ9LAotCXsKLQkgMTI4LCA1NjQwLCAweDU4LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDM0LCAweDAyLCAweDA3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDc3LCAweDAwLCAweDAwLCAweDA5LCAweDA0LCAweDIzLCAweDAwLCAweDYwLCAweDAwLAotCSAweDAwLCAweDA5LCAweDA0LCAweDIzLCAweDAwLCAweDYwLCAweDA4ZDQsIDB4MDhkMCwgMHgwOGNjLCAweDAxZDAsCi0JIDB4MDFkMSwKLQkgMHgwMWQyfSwKLQl7Ci0JIDEzMCwgNTY1MCwgMHg1YiwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgzNSwgMHgwMiwgMHgwNywKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHg3NywgMHgwMCwgMHgwMCwgMHgwOSwgMHgwMywgMHgyMywgMHgwMCwgMHg2MCwgMHgwMCwKLQkgMHgwMCwgMHgwOSwgMHgwMywgMHgyMywgMHgwMCwgMHg2MCwgMHgwOGQ4LCAweDA4ZDQsIDB4MDhkMCwgMHgwMWNmLAotCSAweDAxZDAsCi0JIDB4MDFkMX0sCi0JewotCSAxMzIsIDU2NjAsIDB4NWUsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MzYsIDB4MDIsIDB4MDcsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDksIDB4MDMsIDB4MjMsIDB4MDAsIDB4NjAsIDB4MDAsCi0JIDB4MDAsIDB4MDksIDB4MDMsIDB4MjMsIDB4MDAsIDB4NjAsIDB4MDhkYywgMHgwOGQ4LCAweDA4ZDQsIDB4MDFjZSwKLQkgMHgwMWNmLAotCSAweDAxZDB9LAotCXsKLQkgMTM0LCA1NjcwLCAweDYyLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDM3LCAweDAyLCAweDA3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDc3LCAweDAwLCAweDAwLCAweDA5LCAweDAzLCAweDIzLCAweDAwLCAweDYwLCAweDAwLAotCSAweDAwLCAweDA5LCAweDAzLCAweDIzLCAweDAwLCAweDYwLCAweDA4ZTAsIDB4MDhkYywgMHgwOGQ4LCAweDAxY2UsCi0JIDB4MDFjZSwKLQkgMHgwMWNmfSwKLQl7Ci0JIDEzNiwgNTY4MCwgMHg2NSwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgzOCwgMHgwMiwgMHgwNywKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHg3NywgMHgwMCwgMHgwMCwgMHgwOSwgMHgwMiwgMHgyMywgMHgwMCwgMHg2MCwgMHgwMCwKLQkgMHgwMCwgMHgwOSwgMHgwMiwgMHgyMywgMHgwMCwgMHg2MCwgMHgwOGU0LCAweDA4ZTAsIDB4MDhkYywgMHgwMWNkLAotCSAweDAxY2UsCi0JIDB4MDFjZX0sCi0JewotCSAxMzgsIDU2OTAsIDB4NjgsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MzksIDB4MDIsIDB4MDcsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDksIDB4MDIsIDB4MjMsIDB4MDAsIDB4NjAsIDB4MDAsCi0JIDB4MDAsIDB4MDksIDB4MDIsIDB4MjMsIDB4MDAsIDB4NjAsIDB4MDhlOCwgMHgwOGU0LCAweDA4ZTAsIDB4MDFjYywKLQkgMHgwMWNkLAotCSAweDAxY2V9LAotCXsKLQkgMTQwLCA1NzAwLCAweDZjLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDNhLCAweDAyLCAweDA3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDc3LCAweDAwLCAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDMwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDMwLCAweDA4ZWMsIDB4MDhlOCwgMHgwOGU0LCAweDAxY2IsCi0JIDB4MDFjYywKLQkgMHgwMWNkfSwKLQl7Ci0JIDE0MiwgNTcxMCwgMHg2ZiwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgzYiwgMHgwMiwgMHgwNywKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHg3NywgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgzMCwgMHgwMCwKLQkgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgzMCwgMHgwOGYwLCAweDA4ZWMsIDB4MDhlOCwgMHgwMWNhLAotCSAweDAxY2IsCi0JIDB4MDFjY30sCi0JewotCSAxNDQsIDU3MjAsIDB4NzIsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4M2MsIDB4MDIsIDB4MDcsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MzAsIDB4MDAsCi0JIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MzAsIDB4MDhmNCwgMHgwOGYwLCAweDA4ZWMsIDB4MDFjOSwKLQkgMHgwMWNhLAotCSAweDAxY2J9LAotCXsKLQkgMTQ1LCA1NzI1LCAweDc0LCAweDE3LCAweDIwLCAweDE0LCAweDA4LCAweDA4LCAweDMwLCAweDc5LCAweDA0LCAweDA2LAotCSAweDAwLCAweDA2LCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDMwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDMwLCAweDA4ZjYsIDB4MDhmMiwgMHgwOGVlLCAweDAxYzksCi0JIDB4MDFjYSwKLQkgMHgwMWNifSwKLQl7Ci0JIDE0NiwgNTczMCwgMHg3NiwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgzZCwgMHgwMiwgMHgwNiwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgzMCwgMHgwMCwKLQkgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgzMCwgMHgwOGY4LCAweDA4ZjQsIDB4MDhmMCwgMHgwMWM5LAotCSAweDAxYzksCi0JIDB4MDFjYX0sCi0JewotCSAxNDcsIDU3MzUsIDB4NzcsIDB4MTcsIDB4MjAsIDB4MTQsIDB4MDgsIDB4MDgsIDB4MzAsIDB4N2IsIDB4MDQsIDB4MDYsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MzAsIDB4MDAsCi0JIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MzAsIDB4MDhmYSwgMHgwOGY2LCAweDA4ZjIsIDB4MDFjOCwKLQkgMHgwMWM5LAotCSAweDAxY2F9LAotCXsKLQkgMTQ4LCA1NzQwLCAweDc5LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDNlLCAweDAyLCAweDA2LAotCSAweDAwLCAweDA2LCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDMwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDMwLCAweDA4ZmMsIDB4MDhmOCwgMHgwOGY0LCAweDAxYzgsCi0JIDB4MDFjOSwKLQkgMHgwMWM5fSwKLQl7Ci0JIDE0OSwgNTc0NSwgMHg3YiwgMHgxNywgMHgyMCwgMHgxNCwgMHgwOCwgMHgwOCwgMHgzMCwgMHg3ZCwgMHgwNCwgMHgwNiwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgzMCwgMHgwMCwKLQkgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgzMCwgMHgwOGZlLCAweDA4ZmEsIDB4MDhmNiwgMHgwMWM4LAotCSAweDAxYzgsCi0JIDB4MDFjOX0sCi0JewotCSAxNTAsIDU3NTAsIDB4N2MsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4M2YsIDB4MDIsIDB4MDYsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDkwMCwgMHgwOGZjLCAweDA4ZjgsIDB4MDFjNywKLQkgMHgwMWM4LAotCSAweDAxYzl9LAotCXsKLQkgMTUxLCA1NzU1LCAweDdlLCAweDE3LCAweDIwLCAweDE0LCAweDA4LCAweDA4LCAweDMwLCAweDdmLCAweDA0LCAweDA2LAotCSAweDAwLCAweDA2LCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDAwLCAweDA5MDIsIDB4MDhmZSwgMHgwOGZhLCAweDAxYzcsCi0JIDB4MDFjOCwKLQkgMHgwMWM4fSwKLQl7Ci0JIDE1MiwgNTc2MCwgMHg4MCwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHg0MCwgMHgwMiwgMHgwNiwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgwMCwgMHgwOTA0LCAweDA5MDAsIDB4MDhmYywgMHgwMWM2LAotCSAweDAxYzcsCi0JIDB4MDFjOH0sCi0JewotCSAxNTMsIDU3NjUsIDB4ODEsIDB4MTcsIDB4MjAsIDB4MTQsIDB4MDgsIDB4MDgsIDB4MzAsIDB4ODEsIDB4MDQsIDB4MDYsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDkwNiwgMHgwOTAyLCAweDA4ZmUsIDB4MDFjNiwKLQkgMHgwMWM3LAotCSAweDAxYzh9LAotCXsKLQkgMTU0LCA1NzcwLCAweDgzLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDQxLCAweDAyLCAweDA2LAotCSAweDAwLCAweDA2LCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDAwLCAweDA5MDgsIDB4MDkwNCwgMHgwOTAwLCAweDAxYzYsCi0JIDB4MDFjNiwKLQkgMHgwMWM3fSwKLQl7Ci0JIDE1NSwgNTc3NSwgMHg4NSwgMHgxNywgMHgyMCwgMHgxNCwgMHgwOCwgMHgwOCwgMHgzMCwgMHg4MywgMHgwNCwgMHgwNiwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgwMCwgMHgwOTBhLCAweDA5MDYsIDB4MDkwMiwgMHgwMWM1LAotCSAweDAxYzYsCi0JIDB4MDFjN30sCi0JewotCSAxNTYsIDU3ODAsIDB4ODYsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4NDIsIDB4MDIsIDB4MDYsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDkwYywgMHgwOTA4LCAweDA5MDQsIDB4MDFjNSwKLQkgMHgwMWM2LAotCSAweDAxYzZ9LAotCXsKLQkgMTU3LCA1Nzg1LCAweDg4LCAweDE3LCAweDIwLCAweDE0LCAweDA4LCAweDA4LCAweDMwLCAweDg1LCAweDA0LCAweDA1LAotCSAweDAwLCAweDA1LCAweDAwLCAweDU1LCAweDAwLCAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDAwLCAweDA5MGUsIDB4MDkwYSwgMHgwOTA2LCAweDAxYzQsCi0JIDB4MDFjNSwKLQkgMHgwMWM2fSwKLQl7Ci0JIDE1OCwgNTc5MCwgMHg4YSwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHg0MywgMHgwMiwgMHgwNSwKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg1NSwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgwMCwgMHgwOTEwLCAweDA5MGMsIDB4MDkwOCwgMHgwMWM0LAotCSAweDAxYzUsCi0JIDB4MDFjNn0sCi0JewotCSAxNTksIDU3OTUsIDB4OGIsIDB4MTcsIDB4MjAsIDB4MTQsIDB4MDgsIDB4MDgsIDB4MzAsIDB4ODcsIDB4MDQsIDB4MDUsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NTUsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDkxMiwgMHgwOTBlLCAweDA5MGEsIDB4MDFjNCwKLQkgMHgwMWM0LAotCSAweDAxYzV9LAotCXsKLQkgMTYwLCA1ODAwLCAweDhkLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDQ0LCAweDAyLCAweDA1LAotCSAweDAwLCAweDA1LCAweDAwLCAweDU1LCAweDAwLCAweDAwLCAweDA4LCAweDAxLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDAxLCAweDAzLCAweDAwLCAweDAwLCAweDA5MTQsIDB4MDkxMCwgMHgwOTBjLCAweDAxYzMsCi0JIDB4MDFjNCwKLQkgMHgwMWM1fSwKLQl7Ci0JIDE2MSwgNTgwNSwgMHg4ZiwgMHgxNywgMHgyMCwgMHgxNCwgMHgwOCwgMHgwOCwgMHgzMCwgMHg4OSwgMHgwNCwgMHgwNSwKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg1NSwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwNiwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwOTE2LCAweDA5MTIsIDB4MDkwZSwgMHgwMWMzLAotCSAweDAxYzQsCi0JIDB4MDFjNH0sCi0JewotCSAxNjIsIDU4MTAsIDB4OTAsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4NDUsIDB4MDIsIDB4MDUsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NTUsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDYsIDB4MDEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDkxOCwgMHgwOTE0LCAweDA5MTAsIDB4MDFjMiwKLQkgMHgwMWMzLAotCSAweDAxYzR9LAotCXsKLQkgMTYzLCA1ODE1LCAweDkyLCAweDE3LCAweDIwLCAweDE0LCAweDA4LCAweDA4LCAweDMwLCAweDhiLCAweDA0LCAweDA1LAotCSAweDAwLCAweDA1LCAweDAwLCAweDU1LCAweDAwLCAweDAwLCAweDA2LCAweDAxLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA2LCAweDAxLCAweDAzLCAweDAwLCAweDAwLCAweDA5MWEsIDB4MDkxNiwgMHgwOTEyLCAweDAxYzIsCi0JIDB4MDFjMywKLQkgMHgwMWM0fSwKLQl7Ci0JIDE2NCwgNTgyMCwgMHg5NCwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHg0NiwgMHgwMiwgMHgwNSwKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg1NSwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwNiwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwOTFjLCAweDA5MTgsIDB4MDkxNCwgMHgwMWMyLAotCSAweDAxYzIsCi0JIDB4MDFjM30sCi0JewotCSAxNjUsIDU4MjUsIDB4OTUsIDB4MTcsIDB4MjAsIDB4MTQsIDB4MDgsIDB4MDgsIDB4MzAsIDB4OGQsIDB4MDQsIDB4MDUsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NTUsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDYsIDB4MDEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDkxZSwgMHgwOTFhLCAweDA5MTYsIDB4MDFjMSwKLQkgMHgwMWMyLAotCSAweDAxYzN9LAotCXsKLQkgMTY2LCA1ODMwLCAweDk3LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDQ3LCAweDAyLCAweDA1LAotCSAweDAwLCAweDA1LCAweDAwLCAweDU1LCAweDAwLCAweDAwLCAweDA2LCAweDAxLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA2LCAweDAxLCAweDAzLCAweDAwLCAweDAwLCAweDA5MjAsIDB4MDkxYywgMHgwOTE4LCAweDAxYzEsCi0JIDB4MDFjMiwKLQkgMHgwMWMyfSwKLQl7Ci0JIDE2OCwgNTg0MCwgMHg5YSwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHg0OCwgMHgwMiwgMHgwNSwKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg1NSwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwNiwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwOTI0LCAweDA5MjAsIDB4MDkxYywgMHgwMWMwLAotCSAweDAxYzEsCi0JIDB4MDFjMn0sCi0JewotCSAxNzAsIDU4NTAsIDB4OWUsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4NDksIDB4MDIsIDB4MDQsCi0JIDB4MDAsIDB4MDQsIDB4MDAsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDYsIDB4MDEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDkyOCwgMHgwOTI0LCAweDA5MjAsIDB4MDFiZiwKLQkgMHgwMWMwLAotCSAweDAxYzF9LAotCXsKLQkgMTcyLCA1ODYwLCAweGExLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDRhLCAweDAyLCAweDA0LAotCSAweDAwLCAweDA0LCAweDAwLCAweDQ0LCAweDAwLCAweDAwLCAweDA2LCAweDAxLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA2LCAweDAxLCAweDAzLCAweDAwLCAweDAwLCAweDA5MmMsIDB4MDkyOCwgMHgwOTI0LCAweDAxYmYsCi0JIDB4MDFiZiwKLQkgMHgwMWMwfSwKLQl7Ci0JIDE3NCwgNTg3MCwgMHhhNCwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHg0YiwgMHgwMiwgMHgwNCwKLQkgMHgwMCwgMHgwNCwgMHgwMCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwNiwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwOTMwLCAweDA5MmMsIDB4MDkyOCwgMHgwMWJlLAotCSAweDAxYmYsCi0JIDB4MDFiZn0sCi0JewotCSAxNzYsIDU4ODAsIDB4YTgsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4NGMsIDB4MDIsIDB4MDMsCi0JIDB4MDAsIDB4MDMsIDB4MDAsIDB4MzMsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDYsIDB4MDEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDkzNCwgMHgwOTMwLCAweDA5MmMsIDB4MDFiZCwKLQkgMHgwMWJlLAotCSAweDAxYmZ9LAotCXsKLQkgMTc4LCA1ODkwLCAweGFiLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDRkLCAweDAyLCAweDAzLAotCSAweDAwLCAweDAzLCAweDAwLCAweDMzLCAweDAwLCAweDAwLCAweDA2LCAweDAxLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA2LCAweDAxLCAweDAzLCAweDAwLCAweDAwLCAweDA5MzgsIDB4MDkzNCwgMHgwOTMwLCAweDAxYmMsCi0JIDB4MDFiZCwKLQkgMHgwMWJlfSwKLQl7Ci0JIDE4MCwgNTkwMCwgMHhhZSwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHg0ZSwgMHgwMiwgMHgwMywKLQkgMHgwMCwgMHgwMywgMHgwMCwgMHgzMywgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwNiwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwOTNjLCAweDA5MzgsIDB4MDkzNCwgMHgwMWJjLAotCSAweDAxYmMsCi0JIDB4MDFiZH0sCi0JewotCSAxLCAyNDEyLCAweDQ4LCAweDE2LCAweDMwLCAweDFiLCAweDBhLCAweDBhLCAweDMwLCAweDZjLCAweDA5LCAweDBmLAotCSAweDBhLCAweDAwLCAweDBhLCAweDAwLCAweDYxLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDYxLAotCSAweDczLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDAzYzksIDB4MDNjNSwgMHgwM2MxLCAweDA0M2EsCi0JIDB4MDQzZiwKLQkgMHgwNDQzfSwKLQl7Ci0JIDIsIDI0MTcsIDB4NGIsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4NzEsIDB4MDksIDB4MGYsCi0JIDB4MGEsIDB4MDAsIDB4MGEsIDB4MDAsIDB4NjEsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4NjEsCi0JIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDNjYiwgMHgwM2M3LCAweDAzYzMsIDB4MDQzOCwKLQkgMHgwNDNkLAotCSAweDA0NDF9LAotCXsKLQkgMywgMjQyMiwgMHg0ZSwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg3NiwgMHgwOSwgMHgwZiwKLQkgMHgwOSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg2MSwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHg2MSwKLQkgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHgwM2NkLCAweDAzYzksIDB4MDNjNSwgMHgwNDM2LAotCSAweDA0M2EsCi0JIDB4MDQzZn0sCi0JewotCSA0LCAyNDI3LCAweDUyLCAweDE2LCAweDMwLCAweDFiLCAweDBhLCAweDBhLCAweDMwLCAweDdiLCAweDA5LCAweDBmLAotCSAweDA5LCAweDAwLCAweDA5LCAweDAwLCAweDYxLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDYxLAotCSAweDczLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDAzY2YsIDB4MDNjYiwgMHgwM2M3LCAweDA0MzQsCi0JIDB4MDQzOCwKLQkgMHgwNDNkfSwKLQl7Ci0JIDUsIDI0MzIsIDB4NTUsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4ODAsIDB4MDksIDB4MGYsCi0JIDB4MDgsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NjEsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4NjEsCi0JIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDNkMSwgMHgwM2NkLCAweDAzYzksIDB4MDQzMSwKLQkgMHgwNDM2LAotCSAweDA0M2F9LAotCXsKLQkgNiwgMjQzNywgMHg1OCwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg4NSwgMHgwOSwgMHgwZiwKLQkgMHgwOCwgMHgwMCwgMHgwOCwgMHgwMCwgMHg2MSwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHg2MSwKLQkgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHgwM2QzLCAweDAzY2YsIDB4MDNjYiwgMHgwNDJmLAotCSAweDA0MzQsCi0JIDB4MDQzOH0sCi0JewotCSA3LCAyNDQyLCAweDVjLCAweDE2LCAweDMwLCAweDFiLCAweDBhLCAweDBhLCAweDMwLCAweDhhLCAweDA5LCAweDBmLAotCSAweDA3LCAweDAwLCAweDA3LCAweDAwLCAweDYxLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDYxLAotCSAweDczLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDAzZDUsIDB4MDNkMSwgMHgwM2NkLCAweDA0MmQsCi0JIDB4MDQzMSwKLQkgMHgwNDM2fSwKLQl7Ci0JIDgsIDI0NDcsIDB4NWYsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4OGYsIDB4MDksIDB4MGYsCi0JIDB4MDcsIDB4MDAsIDB4MDcsIDB4MDAsIDB4NjEsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4NjEsCi0JIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDNkNywgMHgwM2QzLCAweDAzY2YsIDB4MDQyYiwKLQkgMHgwNDJmLAotCSAweDA0MzR9LAotCXsKLQkgOSwgMjQ1MiwgMHg2MiwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg5NCwgMHgwOSwgMHgwZiwKLQkgMHgwNywgMHgwMCwgMHgwNywgMHgwMCwgMHg2MSwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHg2MSwKLQkgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHgwM2Q5LCAweDAzZDUsIDB4MDNkMSwgMHgwNDI5LAotCSAweDA0MmQsCi0JIDB4MDQzMX0sCi0JewotCSAxMCwgMjQ1NywgMHg2NiwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg5OSwgMHgwOSwgMHgwZiwKLQkgMHgwNiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg2MSwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHg2MSwKLQkgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHgwM2RiLCAweDAzZDcsIDB4MDNkMywgMHgwNDI3LAotCSAweDA0MmIsCi0JIDB4MDQyZn0sCi0JewotCSAxMSwgMjQ2MiwgMHg2OSwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg5ZSwgMHgwOSwgMHgwZiwKLQkgMHgwNiwgMHgwMCwgMHgwNiwgMHgwMCwgMHg2MSwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHg2MSwKLQkgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHgwM2RkLCAweDAzZDksIDB4MDNkNSwgMHgwNDI0LAotCSAweDA0MjksCi0JIDB4MDQyZH0sCi0JewotCSAxMiwgMjQ2NywgMHg2YywgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHhhMywgMHgwOSwgMHgwZiwKLQkgMHgwNSwgMHgwMCwgMHgwNSwgMHgwMCwgMHg2MSwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHg2MSwKLQkgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHgwM2RmLCAweDAzZGIsIDB4MDNkNywgMHgwNDIyLAotCSAweDA0MjcsCi0JIDB4MDQyYn0sCi0JewotCSAxMywgMjQ3MiwgMHg3MCwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHhhOCwgMHgwOSwgMHgwZiwKLQkgMHgwNSwgMHgwMCwgMHgwNSwgMHgwMCwgMHg2MSwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHg2MSwKLQkgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHgwM2UxLCAweDAzZGQsIDB4MDNkOSwgMHgwNDIwLAotCSAweDA0MjQsCi0JIDB4MDQyOX0sCi0JewotCSAxNCwgMjQ4NCwgMHg3OCwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHhiNCwgMHgwOSwgMHgwZiwKLQkgMHgwNCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg2MSwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhlMCwgMHgwMCwgMHg2MSwKLQkgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhlMCwgMHgwMCwgMHgwM2U2LCAweDAzZTIsIDB4MDNkZSwgMHgwNDFiLAotCSAweDA0MWYsCi0JIDB4MDQyNH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgY2hhbl9pbmZvX25waHlfcmFkaW8yMDU3IGNoYW5faW5mb19ucGh5cmV2OF8yMDU3X3JldjhbXSA9IHsKLQl7Ci0JIDE4NiwgNDkzMCwgMHg2YiwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhlZCwgMHgwMSwgMHgwZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHhkMywgMHgwZiwgMHgwZiwgMHhkMywgMHgwMCwgMHhmZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhkMywgMHgwMCwgMHhmZiwgMHgwN2I4LCAweDA3YjQsIDB4MDdiMCwgMHgwMjEzLAotCSAweDAyMTQsCi0JIDB4MDIxNX0sCi0JewotCSAxODgsIDQ5NDAsIDB4NmUsIDB4MTYsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4ZWUsIDB4MDEsIDB4MGYsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4ZDMsIDB4MGYsIDB4MGYsIDB4ZDMsIDB4MDAsIDB4ZmYsIDB4MDAsCi0JIDB4MDAsIDB4MGYsIDB4MGYsIDB4ZDMsIDB4MDAsIDB4ZmYsIDB4MDdiYywgMHgwN2I4LCAweDA3YjQsIDB4MDIxMiwKLQkgMHgwMjEzLAotCSAweDAyMTR9LAotCXsKLQkgMTkwLCA0OTUwLCAweDcyLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweGVmLCAweDAxLCAweDBmLAotCSAweDAwLCAweDBmLCAweDAwLCAweGZmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweGQzLCAweDAwLCAweGZmLCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweGQzLCAweDAwLCAweGZmLCAweDA3YzAsIDB4MDdiYywgMHgwN2I4LCAweDAyMTEsCi0JIDB4MDIxMiwKLQkgMHgwMjEzfSwKLQl7Ci0JIDE5MiwgNDk2MCwgMHg3NSwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmMCwgMHgwMSwgMHgwZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhkMywgMHgwMCwgMHhmZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhkMywgMHgwMCwgMHhmZiwgMHgwN2M0LCAweDA3YzAsIDB4MDdiYywgMHgwMjBmLAotCSAweDAyMTEsCi0JIDB4MDIxMn0sCi0JewotCSAxOTQsIDQ5NzAsIDB4NzgsIDB4MTYsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4ZjEsIDB4MDEsIDB4MGYsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4ZDMsIDB4MDAsIDB4ZmYsIDB4MDAsCi0JIDB4MDAsIDB4MGYsIDB4MGYsIDB4ZDMsIDB4MDAsIDB4ZmYsIDB4MDdjOCwgMHgwN2M0LCAweDA3YzAsIDB4MDIwZSwKLQkgMHgwMjBmLAotCSAweDAyMTF9LAotCXsKLQkgMTk2LCA0OTgwLCAweDdjLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweGYyLCAweDAxLCAweDBmLAotCSAweDAwLCAweDBmLCAweDAwLCAweGZmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweGQzLCAweDAwLCAweGZmLCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweGQzLCAweDAwLCAweGZmLCAweDA3Y2MsIDB4MDdjOCwgMHgwN2M0LCAweDAyMGQsCi0JIDB4MDIwZSwKLQkgMHgwMjBmfSwKLQl7Ci0JIDE5OCwgNDk5MCwgMHg3ZiwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmMywgMHgwMSwgMHgwZiwKLQkgMHgwMCwgMHgwZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhkMywgMHgwMCwgMHhmZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhkMywgMHgwMCwgMHhmZiwgMHgwN2QwLCAweDA3Y2MsIDB4MDdjOCwgMHgwMjBjLAotCSAweDAyMGQsCi0JIDB4MDIwZX0sCi0JewotCSAyMDAsIDUwMDAsIDB4ODIsIDB4MTYsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4ZjQsIDB4MDEsIDB4MGYsCi0JIDB4MDAsIDB4MGYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4YjMsIDB4MDAsIDB4ZmYsIDB4MDAsCi0JIDB4MDAsIDB4MGYsIDB4MGYsIDB4YjMsIDB4MDAsIDB4ZmYsIDB4MDdkNCwgMHgwN2QwLCAweDA3Y2MsIDB4MDIwYiwKLQkgMHgwMjBjLAotCSAweDAyMGR9LAotCXsKLQkgMjAyLCA1MDEwLCAweDg2LCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweGY1LCAweDAxLCAweDBmLAotCSAweDAwLCAweDBmLCAweDAwLCAweGZmLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweGIzLCAweDAwLCAweGZmLCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweGIzLCAweDAwLCAweGZmLCAweDA3ZDgsIDB4MDdkNCwgMHgwN2QwLCAweDAyMGEsCi0JIDB4MDIwYiwKLQkgMHgwMjBjfSwKLQl7Ci0JIDIwNCwgNTAyMCwgMHg4OSwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmNiwgMHgwMSwgMHgwZSwKLQkgMHgwMCwgMHgwZSwgMHgwMCwgMHhlZSwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhiMywgMHgwMCwgMHhmZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhiMywgMHgwMCwgMHhmZiwgMHgwN2RjLCAweDA3ZDgsIDB4MDdkNCwgMHgwMjA5LAotCSAweDAyMGEsCi0JIDB4MDIwYn0sCi0JewotCSAyMDYsIDUwMzAsIDB4OGMsIDB4MTYsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4ZjcsIDB4MDEsIDB4MGUsCi0JIDB4MDAsIDB4MGUsIDB4MDAsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4YjMsIDB4MDAsIDB4ZmYsIDB4MDAsCi0JIDB4MDAsIDB4MGYsIDB4MGYsIDB4YjMsIDB4MDAsIDB4ZmYsIDB4MDdlMCwgMHgwN2RjLCAweDA3ZDgsIDB4MDIwOCwKLQkgMHgwMjA5LAotCSAweDAyMGF9LAotCXsKLQkgMjA4LCA1MDQwLCAweDkwLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweGY4LCAweDAxLCAweDBlLAotCSAweDAwLCAweDBlLCAweDAwLCAweGVlLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweGIzLCAweDAwLCAweGZmLCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweGIzLCAweDAwLCAweGZmLCAweDA3ZTQsIDB4MDdlMCwgMHgwN2RjLCAweDAyMDcsCi0JIDB4MDIwOCwKLQkgMHgwMjA5fSwKLQl7Ci0JIDIxMCwgNTA1MCwgMHg5MywgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmOSwgMHgwMSwgMHgwZSwKLQkgMHgwMCwgMHgwZSwgMHgwMCwgMHhlZSwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhiMywgMHgwMCwgMHhmZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhiMywgMHgwMCwgMHhmZiwgMHgwN2U4LCAweDA3ZTQsIDB4MDdlMCwgMHgwMjA2LAotCSAweDAyMDcsCi0JIDB4MDIwOH0sCi0JewotCSAyMTIsIDUwNjAsIDB4OTYsIDB4MTYsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4ZmEsIDB4MDEsIDB4MGUsCi0JIDB4MDAsIDB4MGUsIDB4MDAsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4YjMsIDB4MDAsIDB4ZmYsIDB4MDAsCi0JIDB4MDAsIDB4MGYsIDB4MGYsIDB4YjMsIDB4MDAsIDB4ZmYsIDB4MDdlYywgMHgwN2U4LCAweDA3ZTQsIDB4MDIwNSwKLQkgMHgwMjA2LAotCSAweDAyMDd9LAotCXsKLQkgMjE0LCA1MDcwLCAweDlhLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweGZiLCAweDAxLCAweDBlLAotCSAweDAwLCAweDBlLCAweDAwLCAweGVlLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweGIzLCAweDAwLCAweGZmLCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweGIzLCAweDAwLCAweGZmLCAweDA3ZjAsIDB4MDdlYywgMHgwN2U4LCAweDAyMDQsCi0JIDB4MDIwNSwKLQkgMHgwMjA2fSwKLQl7Ci0JIDIxNiwgNTA4MCwgMHg5ZCwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmYywgMHgwMSwgMHgwZSwKLQkgMHgwMCwgMHgwZSwgMHgwMCwgMHhlZSwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhiMywgMHgwMCwgMHhmZiwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhiMywgMHgwMCwgMHhmZiwgMHgwN2Y0LCAweDA3ZjAsIDB4MDdlYywgMHgwMjAzLAotCSAweDAyMDQsCi0JIDB4MDIwNX0sCi0JewotCSAyMTgsIDUwOTAsIDB4YTAsIDB4MTYsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4ZmQsIDB4MDEsIDB4MGUsCi0JIDB4MDAsIDB4MGUsIDB4MDAsIDB4ZWUsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4YjMsIDB4MDAsIDB4ZmYsIDB4MDAsCi0JIDB4MDAsIDB4MGYsIDB4MGYsIDB4YjMsIDB4MDAsIDB4ZmYsIDB4MDdmOCwgMHgwN2Y0LCAweDA3ZjAsIDB4MDIwMiwKLQkgMHgwMjAzLAotCSAweDAyMDR9LAotCXsKLQkgMjIwLCA1MTAwLCAweGE0LCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweGZlLCAweDAxLCAweDBkLAotCSAweDAwLCAweDBkLCAweDAwLCAweGRkLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweGEzLCAweDAwLCAweGZjLCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweGEzLCAweDAwLCAweGZjLCAweDA3ZmMsIDB4MDdmOCwgMHgwN2Y0LCAweDAyMDEsCi0JIDB4MDIwMiwKLQkgMHgwMjAzfSwKLQl7Ci0JIDIyMiwgNTExMCwgMHhhNywgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHhmZiwgMHgwMSwgMHgwZCwKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHhkZCwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhhMywgMHgwMCwgMHhmYywgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhhMywgMHgwMCwgMHhmYywgMHgwODAwLCAweDA3ZmMsIDB4MDdmOCwgMHgwMjAwLAotCSAweDAyMDEsCi0JIDB4MDIwMn0sCi0JewotCSAyMjQsIDUxMjAsIDB4YWEsIDB4MTYsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MDAsIDB4MDIsIDB4MGQsCi0JIDB4MDAsIDB4MGQsIDB4MDAsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4MGYsIDB4MGYsIDB4YTMsIDB4MDAsIDB4ZmMsIDB4MDAsCi0JIDB4MDAsIDB4MGYsIDB4MGYsIDB4YTMsIDB4MDAsIDB4ZmMsIDB4MDgwNCwgMHgwODAwLCAweDA3ZmMsIDB4MDFmZiwKLQkgMHgwMjAwLAotCSAweDAyMDF9LAotCXsKLQkgMjI2LCA1MTMwLCAweGFlLCAweDE2LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDAxLCAweDAyLCAweDBkLAotCSAweDAwLCAweDBkLCAweDAwLCAweGRkLCAweDAwLCAweDAwLCAweDBmLCAweDBmLCAweGEzLCAweDAwLCAweGZjLCAweDAwLAotCSAweDAwLCAweDBmLCAweDBmLCAweGEzLCAweDAwLCAweGZjLCAweDA4MDgsIDB4MDgwNCwgMHgwODAwLCAweDAxZmUsCi0JIDB4MDFmZiwKLQkgMHgwMjAwfSwKLQl7Ci0JIDIyOCwgNTE0MCwgMHhiMSwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgwMiwgMHgwMiwgMHgwZCwKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHhkZCwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhhMywgMHgwMCwgMHhmYywgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhhMywgMHgwMCwgMHhmYywgMHgwODBjLCAweDA4MDgsIDB4MDgwNCwgMHgwMWZkLAotCSAweDAxZmUsCi0JIDB4MDFmZn0sCi0JewotCSAzMiwgNTE2MCwgMHhiOCwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgwNCwgMHgwMiwgMHgwZCwKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHhkZCwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhhMywgMHgwMCwgMHhmYywgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhhMywgMHgwMCwgMHhmYywgMHgwODE0LCAweDA4MTAsIDB4MDgwYywgMHgwMWZiLAotCSAweDAxZmMsCi0JIDB4MDFmZH0sCi0JewotCSAzNCwgNTE3MCwgMHhiYiwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgwNSwgMHgwMiwgMHgwZCwKLQkgMHgwMCwgMHgwZCwgMHgwMCwgMHhkZCwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhhMywgMHgwMCwgMHhmYywgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhhMywgMHgwMCwgMHhmYywgMHgwODE4LCAweDA4MTQsIDB4MDgxMCwgMHgwMWZhLAotCSAweDAxZmIsCi0JIDB4MDFmY30sCi0JewotCSAzNiwgNTE4MCwgMHhiZSwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgwNiwgMHgwMiwgMHgwYywKLQkgMHgwMCwgMHgwYywgMHgwMCwgMHhjYywgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhhMywgMHgwMCwgMHhmYywgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhhMywgMHgwMCwgMHhmYywgMHgwODFjLCAweDA4MTgsIDB4MDgxNCwgMHgwMWY5LAotCSAweDAxZmEsCi0JIDB4MDFmYn0sCi0JewotCSAzOCwgNTE5MCwgMHhjMiwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgwNywgMHgwMiwgMHgwYywKLQkgMHgwMCwgMHgwYywgMHgwMCwgMHhjYywgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHhhMywgMHgwMCwgMHhmYywgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHhhMywgMHgwMCwgMHhmYywgMHgwODIwLCAweDA4MWMsIDB4MDgxOCwgMHgwMWY4LAotCSAweDAxZjksCi0JIDB4MDFmYX0sCi0JewotCSA0MCwgNTIwMCwgMHhjNSwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgwOCwgMHgwMiwgMHgwYywKLQkgMHgwMCwgMHgwYywgMHgwMCwgMHhjYywgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHg5MywgMHgwMCwgMHhmOCwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHg5MywgMHgwMCwgMHhmOCwgMHgwODI0LCAweDA4MjAsIDB4MDgxYywgMHgwMWY3LAotCSAweDAxZjgsCi0JIDB4MDFmOX0sCi0JewotCSA0MiwgNTIxMCwgMHhjOCwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgwOSwgMHgwMiwgMHgwYywKLQkgMHgwMCwgMHgwYywgMHgwMCwgMHhjYywgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHg5MywgMHgwMCwgMHhmOCwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHg5MywgMHgwMCwgMHhmOCwgMHgwODI4LCAweDA4MjQsIDB4MDgyMCwgMHgwMWY2LAotCSAweDAxZjcsCi0JIDB4MDFmOH0sCi0JewotCSA0NCwgNTIyMCwgMHhjYywgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgwYSwgMHgwMiwgMHgwYywKLQkgMHgwMCwgMHgwYywgMHgwMCwgMHhjYywgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHg5MywgMHgwMCwgMHhmOCwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHg5MywgMHgwMCwgMHhmOCwgMHgwODJjLCAweDA4MjgsIDB4MDgyNCwgMHgwMWY1LAotCSAweDAxZjYsCi0JIDB4MDFmN30sCi0JewotCSA0NiwgNTIzMCwgMHhjZiwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgwYiwgMHgwMiwgMHgwYywKLQkgMHgwMCwgMHgwYywgMHgwMCwgMHhjYywgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHg5MywgMHgwMCwgMHhmOCwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHg5MywgMHgwMCwgMHhmOCwgMHgwODMwLCAweDA4MmMsIDB4MDgyOCwgMHgwMWY0LAotCSAweDAxZjUsCi0JIDB4MDFmNn0sCi0JewotCSA0OCwgNTI0MCwgMHhkMiwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgwYywgMHgwMiwgMHgwYywKLQkgMHgwMCwgMHgwYywgMHgwMCwgMHhjYywgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHg5MywgMHgwMCwgMHhmOCwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHg5MywgMHgwMCwgMHhmOCwgMHgwODM0LCAweDA4MzAsIDB4MDgyYywgMHgwMWYzLAotCSAweDAxZjQsCi0JIDB4MDFmNX0sCi0JewotCSA1MCwgNTI1MCwgMHhkNiwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgwZCwgMHgwMiwgMHgwYywKLQkgMHgwMCwgMHgwYywgMHgwMCwgMHhjYywgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHg5MywgMHgwMCwgMHhmOCwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHg5MywgMHgwMCwgMHhmOCwgMHgwODM4LCAweDA4MzQsIDB4MDgzMCwgMHgwMWYyLAotCSAweDAxZjMsCi0JIDB4MDFmNH0sCi0JewotCSA1MiwgNTI2MCwgMHhkOSwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgwZSwgMHgwMiwgMHgwYiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHg5MywgMHgwMCwgMHhmOCwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHg5MywgMHgwMCwgMHhmOCwgMHgwODNjLCAweDA4MzgsIDB4MDgzNCwgMHgwMWYxLAotCSAweDAxZjIsCi0JIDB4MDFmM30sCi0JewotCSA1NCwgNTI3MCwgMHhkYywgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgwZiwgMHgwMiwgMHgwYiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHg5MywgMHgwMCwgMHhmOCwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHg5MywgMHgwMCwgMHhmOCwgMHgwODQwLCAweDA4M2MsIDB4MDgzOCwgMHgwMWYwLAotCSAweDAxZjEsCi0JIDB4MDFmMn0sCi0JewotCSA1NiwgNTI4MCwgMHhlMCwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgxMCwgMHgwMiwgMHgwYiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHg5MywgMHgwMCwgMHhmOCwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHg5MywgMHgwMCwgMHhmOCwgMHgwODQ0LCAweDA4NDAsIDB4MDgzYywgMHgwMWYwLAotCSAweDAxZjAsCi0JIDB4MDFmMX0sCi0JewotCSA1OCwgNTI5MCwgMHhlMywgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgxMSwgMHgwMiwgMHgwYiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwZiwgMHg5MywgMHgwMCwgMHhmOCwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwZiwgMHg5MywgMHgwMCwgMHhmOCwgMHgwODQ4LCAweDA4NDQsIDB4MDg0MCwgMHgwMWVmLAotCSAweDAxZjAsCi0JIDB4MDFmMH0sCi0JewotCSA2MCwgNTMwMCwgMHhlNiwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgxMiwgMHgwMiwgMHgwYiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwYywgMHg4MywgMHgwMCwgMHhmNSwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwYywgMHg4MywgMHgwMCwgMHhmNSwgMHgwODRjLCAweDA4NDgsIDB4MDg0NCwgMHgwMWVlLAotCSAweDAxZWYsCi0JIDB4MDFmMH0sCi0JewotCSA2MiwgNTMxMCwgMHhlYSwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgxMywgMHgwMiwgMHgwYiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwYywgMHg4MywgMHgwMCwgMHhmNSwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwYywgMHg4MywgMHgwMCwgMHhmNSwgMHgwODUwLCAweDA4NGMsIDB4MDg0OCwgMHgwMWVkLAotCSAweDAxZWUsCi0JIDB4MDFlZn0sCi0JewotCSA2NCwgNTMyMCwgMHhlZCwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgxNCwgMHgwMiwgMHgwYiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwYywgMHg4MywgMHgwMCwgMHhmNSwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwYywgMHg4MywgMHgwMCwgMHhmNSwgMHgwODU0LCAweDA4NTAsIDB4MDg0YywgMHgwMWVjLAotCSAweDAxZWQsCi0JIDB4MDFlZX0sCi0JewotCSA2NiwgNTMzMCwgMHhmMCwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgxNSwgMHgwMiwgMHgwYiwKLQkgMHgwMCwgMHgwYiwgMHgwMCwgMHhiYiwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwYywgMHg4MywgMHgwMCwgMHhmNSwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwYywgMHg4MywgMHgwMCwgMHhmNSwgMHgwODU4LCAweDA4NTQsIDB4MDg1MCwgMHgwMWViLAotCSAweDAxZWMsCi0JIDB4MDFlZH0sCi0JewotCSA2OCwgNTM0MCwgMHhmNCwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgxNiwgMHgwMiwgMHgwYSwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhhYSwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwYywgMHg4MywgMHgwMCwgMHhmNSwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwYywgMHg4MywgMHgwMCwgMHhmNSwgMHgwODVjLCAweDA4NTgsIDB4MDg1NCwgMHgwMWVhLAotCSAweDAxZWIsCi0JIDB4MDFlY30sCi0JewotCSA3MCwgNTM1MCwgMHhmNywgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgxNywgMHgwMiwgMHgwYSwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhhYSwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwYywgMHg4MywgMHgwMCwgMHhmNSwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwYywgMHg4MywgMHgwMCwgMHhmNSwgMHgwODYwLCAweDA4NWMsIDB4MDg1OCwgMHgwMWU5LAotCSAweDAxZWEsCi0JIDB4MDFlYn0sCi0JewotCSA3MiwgNTM2MCwgMHhmYSwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgxOCwgMHgwMiwgMHgwYSwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhhYSwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwYywgMHg4MywgMHgwMCwgMHhmNSwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwYywgMHg4MywgMHgwMCwgMHhmNSwgMHgwODY0LCAweDA4NjAsIDB4MDg1YywgMHgwMWU4LAotCSAweDAxZTksCi0JIDB4MDFlYX0sCi0JewotCSA3NCwgNTM3MCwgMHhmZSwgMHgxNiwgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgxOSwgMHgwMiwgMHgwYSwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhhYSwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwYywgMHg4MywgMHgwMCwgMHhmNSwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwYywgMHg4MywgMHgwMCwgMHhmNSwgMHgwODY4LCAweDA4NjQsIDB4MDg2MCwgMHgwMWU3LAotCSAweDAxZTgsCi0JIDB4MDFlOX0sCi0JewotCSA3NiwgNTM4MCwgMHgwMSwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgxYSwgMHgwMiwgMHgwYSwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhhYSwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwYywgMHg4MywgMHgwMCwgMHhmNSwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwYywgMHg4MywgMHgwMCwgMHhmNSwgMHgwODZjLCAweDA4NjgsIDB4MDg2NCwgMHgwMWU2LAotCSAweDAxZTcsCi0JIDB4MDFlOH0sCi0JewotCSA3OCwgNTM5MCwgMHgwNCwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgxYiwgMHgwMiwgMHgwYSwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhhYSwgMHgwMCwgMHgwMCwgMHgwZiwgMHgwYywgMHg4MywgMHgwMCwgMHhmNSwgMHgwMCwKLQkgMHgwMCwgMHgwZiwgMHgwYywgMHg4MywgMHgwMCwgMHhmNSwgMHgwODcwLCAweDA4NmMsIDB4MDg2OCwgMHgwMWU1LAotCSAweDAxZTYsCi0JIDB4MDFlN30sCi0JewotCSA4MCwgNTQwMCwgMHgwOCwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgxYywgMHgwMiwgMHgwYSwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhhYSwgMHgwMCwgMHgwMCwgMHgwZCwgMHgwOSwgMHg1MywgMHgwMCwgMHhiMSwgMHgwMCwKLQkgMHgwMCwgMHgwZCwgMHgwOSwgMHg1MywgMHgwMCwgMHhiMSwgMHgwODc0LCAweDA4NzAsIDB4MDg2YywgMHgwMWU1LAotCSAweDAxZTUsCi0JIDB4MDFlNn0sCi0JewotCSA4MiwgNTQxMCwgMHgwYiwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgxZCwgMHgwMiwgMHgwYSwKLQkgMHgwMCwgMHgwYSwgMHgwMCwgMHhhYSwgMHgwMCwgMHgwMCwgMHgwZCwgMHgwOSwgMHg1MywgMHgwMCwgMHhiMSwgMHgwMCwKLQkgMHgwMCwgMHgwZCwgMHgwOSwgMHg1MywgMHgwMCwgMHhiMSwgMHgwODc4LCAweDA4NzQsIDB4MDg3MCwgMHgwMWU0LAotCSAweDAxZTUsCi0JIDB4MDFlNX0sCi0JewotCSA4NCwgNTQyMCwgMHgwZSwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgxZSwgMHgwMiwgMHgwOSwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg5OSwgMHgwMCwgMHgwMCwgMHgwZCwgMHgwOSwgMHg1MywgMHgwMCwgMHhiMSwgMHgwMCwKLQkgMHgwMCwgMHgwZCwgMHgwOSwgMHg1MywgMHgwMCwgMHhiMSwgMHgwODdjLCAweDA4NzgsIDB4MDg3NCwgMHgwMWUzLAotCSAweDAxZTQsCi0JIDB4MDFlNX0sCi0JewotCSA4NiwgNTQzMCwgMHgxMiwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgxZiwgMHgwMiwgMHgwOSwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg5OSwgMHgwMCwgMHgwMCwgMHgwZCwgMHgwOSwgMHg1MywgMHgwMCwgMHhiMSwgMHgwMCwKLQkgMHgwMCwgMHgwZCwgMHgwOSwgMHg1MywgMHgwMCwgMHhiMSwgMHgwODgwLCAweDA4N2MsIDB4MDg3OCwgMHgwMWUyLAotCSAweDAxZTMsCi0JIDB4MDFlNH0sCi0JewotCSA4OCwgNTQ0MCwgMHgxNSwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgyMCwgMHgwMiwgMHgwOSwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg5OSwgMHgwMCwgMHgwMCwgMHgwZCwgMHgwOSwgMHg1MywgMHgwMCwgMHhiMSwgMHgwMCwKLQkgMHgwMCwgMHgwZCwgMHgwOSwgMHg1MywgMHgwMCwgMHhiMSwgMHgwODg0LCAweDA4ODAsIDB4MDg3YywgMHgwMWUxLAotCSAweDAxZTIsCi0JIDB4MDFlM30sCi0JewotCSA5MCwgNTQ1MCwgMHgxOCwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgyMSwgMHgwMiwgMHgwOSwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg5OSwgMHgwMCwgMHgwMCwgMHgwZCwgMHgwOSwgMHg1MywgMHgwMCwgMHhiMSwgMHgwMCwKLQkgMHgwMCwgMHgwZCwgMHgwOSwgMHg1MywgMHgwMCwgMHhiMSwgMHgwODg4LCAweDA4ODQsIDB4MDg4MCwgMHgwMWUwLAotCSAweDAxZTEsCi0JIDB4MDFlMn0sCi0JewotCSA5MiwgNTQ2MCwgMHgxYywgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgyMiwgMHgwMiwgMHgwOSwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg5OSwgMHgwMCwgMHgwMCwgMHgwZCwgMHgwOSwgMHg1MywgMHgwMCwgMHhiMSwgMHgwMCwKLQkgMHgwMCwgMHgwZCwgMHgwOSwgMHg1MywgMHgwMCwgMHhiMSwgMHgwODhjLCAweDA4ODgsIDB4MDg4NCwgMHgwMWRmLAotCSAweDAxZTAsCi0JIDB4MDFlMX0sCi0JewotCSA5NCwgNTQ3MCwgMHgxZiwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgyMywgMHgwMiwgMHgwOSwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg5OSwgMHgwMCwgMHgwMCwgMHgwZCwgMHgwOSwgMHg1MywgMHgwMCwgMHhiMSwgMHgwMCwKLQkgMHgwMCwgMHgwZCwgMHgwOSwgMHg1MywgMHgwMCwgMHhiMSwgMHgwODkwLCAweDA4OGMsIDB4MDg4OCwgMHgwMWRlLAotCSAweDAxZGYsCi0JIDB4MDFlMH0sCi0JewotCSA5NiwgNTQ4MCwgMHgyMiwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgyNCwgMHgwMiwgMHgwOSwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg5OSwgMHgwMCwgMHgwMCwgMHgwZCwgMHgwOSwgMHg1MywgMHgwMCwgMHhiMSwgMHgwMCwKLQkgMHgwMCwgMHgwZCwgMHgwOSwgMHg1MywgMHgwMCwgMHhiMSwgMHgwODk0LCAweDA4OTAsIDB4MDg4YywgMHgwMWRkLAotCSAweDAxZGUsCi0JIDB4MDFkZn0sCi0JewotCSA5OCwgNTQ5MCwgMHgyNiwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgyNSwgMHgwMiwgMHgwOSwKLQkgMHgwMCwgMHgwOSwgMHgwMCwgMHg5OSwgMHgwMCwgMHgwMCwgMHgwZCwgMHgwOSwgMHg1MywgMHgwMCwgMHhiMSwgMHgwMCwKLQkgMHgwMCwgMHgwZCwgMHgwOSwgMHg1MywgMHgwMCwgMHhiMSwgMHgwODk4LCAweDA4OTQsIDB4MDg5MCwgMHgwMWRkLAotCSAweDAxZGQsCi0JIDB4MDFkZX0sCi0JewotCSAxMDAsIDU1MDAsIDB4MjksIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MjYsIDB4MDIsIDB4MDksCi0JIDB4MDAsIDB4MDksIDB4MDAsIDB4OTksIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDYsIDB4NDMsIDB4MDAsIDB4ODAsIDB4MDAsCi0JIDB4MDAsIDB4MGEsIDB4MDYsIDB4NDMsIDB4MDAsIDB4ODAsIDB4MDg5YywgMHgwODk4LCAweDA4OTQsIDB4MDFkYywKLQkgMHgwMWRkLAotCSAweDAxZGR9LAotCXsKLQkgMTAyLCA1NTEwLCAweDJjLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDI3LCAweDAyLCAweDA5LAotCSAweDAwLCAweDA5LCAweDAwLCAweDk5LCAweDAwLCAweDAwLCAweDBhLCAweDA2LCAweDQzLCAweDAwLCAweDgwLCAweDAwLAotCSAweDAwLCAweDBhLCAweDA2LCAweDQzLCAweDAwLCAweDgwLCAweDA4YTAsIDB4MDg5YywgMHgwODk4LCAweDAxZGIsCi0JIDB4MDFkYywKLQkgMHgwMWRkfSwKLQl7Ci0JIDEwNCwgNTUyMCwgMHgzMCwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgyOCwgMHgwMiwgMHgwOCwKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwNiwgMHg0MywgMHgwMCwgMHg4MCwgMHgwMCwKLQkgMHgwMCwgMHgwYSwgMHgwNiwgMHg0MywgMHgwMCwgMHg4MCwgMHgwOGE0LCAweDA4YTAsIDB4MDg5YywgMHgwMWRhLAotCSAweDAxZGIsCi0JIDB4MDFkY30sCi0JewotCSAxMDYsIDU1MzAsIDB4MzMsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MjksIDB4MDIsIDB4MDgsCi0JIDB4MDAsIDB4MDgsIDB4MDAsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDYsIDB4NDMsIDB4MDAsIDB4ODAsIDB4MDAsCi0JIDB4MDAsIDB4MGEsIDB4MDYsIDB4NDMsIDB4MDAsIDB4ODAsIDB4MDhhOCwgMHgwOGE0LCAweDA4YTAsIDB4MDFkOSwKLQkgMHgwMWRhLAotCSAweDAxZGJ9LAotCXsKLQkgMTA4LCA1NTQwLCAweDM2LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDJhLCAweDAyLCAweDA4LAotCSAweDAwLCAweDA4LCAweDAwLCAweDg4LCAweDAwLCAweDAwLCAweDBhLCAweDA2LCAweDQzLCAweDAwLCAweDgwLCAweDAwLAotCSAweDAwLCAweDBhLCAweDA2LCAweDQzLCAweDAwLCAweDgwLCAweDA4YWMsIDB4MDhhOCwgMHgwOGE0LCAweDAxZDgsCi0JIDB4MDFkOSwKLQkgMHgwMWRhfSwKLQl7Ci0JIDExMCwgNTU1MCwgMHgzYSwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgyYiwgMHgwMiwgMHgwOCwKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwNiwgMHg0MywgMHgwMCwgMHg4MCwgMHgwMCwKLQkgMHgwMCwgMHgwYSwgMHgwNiwgMHg0MywgMHgwMCwgMHg4MCwgMHgwOGIwLCAweDA4YWMsIDB4MDhhOCwgMHgwMWQ3LAotCSAweDAxZDgsCi0JIDB4MDFkOX0sCi0JewotCSAxMTIsIDU1NjAsIDB4M2QsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MmMsIDB4MDIsIDB4MDgsCi0JIDB4MDAsIDB4MDgsIDB4MDAsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDYsIDB4NDMsIDB4MDAsIDB4ODAsIDB4MDAsCi0JIDB4MDAsIDB4MGEsIDB4MDYsIDB4NDMsIDB4MDAsIDB4ODAsIDB4MDhiNCwgMHgwOGIwLCAweDA4YWMsIDB4MDFkNywKLQkgMHgwMWQ3LAotCSAweDAxZDh9LAotCXsKLQkgMTE0LCA1NTcwLCAweDQwLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDJkLCAweDAyLCAweDA4LAotCSAweDAwLCAweDA4LCAweDAwLCAweDg4LCAweDAwLCAweDAwLCAweDBhLCAweDA2LCAweDQzLCAweDAwLCAweDgwLCAweDAwLAotCSAweDAwLCAweDBhLCAweDA2LCAweDQzLCAweDAwLCAweDgwLCAweDA4YjgsIDB4MDhiNCwgMHgwOGIwLCAweDAxZDYsCi0JIDB4MDFkNywKLQkgMHgwMWQ3fSwKLQl7Ci0JIDExNiwgNTU4MCwgMHg0NCwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgyZSwgMHgwMiwgMHgwOCwKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwNiwgMHg0MywgMHgwMCwgMHg4MCwgMHgwMCwKLQkgMHgwMCwgMHgwYSwgMHgwNiwgMHg0MywgMHgwMCwgMHg4MCwgMHgwOGJjLCAweDA4YjgsIDB4MDhiNCwgMHgwMWQ1LAotCSAweDAxZDYsCi0JIDB4MDFkN30sCi0JewotCSAxMTgsIDU1OTAsIDB4NDcsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MmYsIDB4MDIsIDB4MDgsCi0JIDB4MDAsIDB4MDgsIDB4MDAsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MGEsIDB4MDYsIDB4NDMsIDB4MDAsIDB4ODAsIDB4MDAsCi0JIDB4MDAsIDB4MGEsIDB4MDYsIDB4NDMsIDB4MDAsIDB4ODAsIDB4MDhjMCwgMHgwOGJjLCAweDA4YjgsIDB4MDFkNCwKLQkgMHgwMWQ1LAotCSAweDAxZDZ9LAotCXsKLQkgMTIwLCA1NjAwLCAweDRhLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDMwLCAweDAyLCAweDA4LAotCSAweDAwLCAweDA4LCAweDAwLCAweDg4LCAweDAwLCAweDAwLCAweDA5LCAweDA0LCAweDIzLCAweDAwLCAweDYwLCAweDAwLAotCSAweDAwLCAweDA5LCAweDA0LCAweDIzLCAweDAwLCAweDYwLCAweDA4YzQsIDB4MDhjMCwgMHgwOGJjLCAweDAxZDMsCi0JIDB4MDFkNCwKLQkgMHgwMWQ1fSwKLQl7Ci0JIDEyMiwgNTYxMCwgMHg0ZSwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgzMSwgMHgwMiwgMHgwOCwKLQkgMHgwMCwgMHgwOCwgMHgwMCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwOSwgMHgwNCwgMHgyMywgMHgwMCwgMHg2MCwgMHgwMCwKLQkgMHgwMCwgMHgwOSwgMHgwNCwgMHgyMywgMHgwMCwgMHg2MCwgMHgwOGM4LCAweDA4YzQsIDB4MDhjMCwgMHgwMWQyLAotCSAweDAxZDMsCi0JIDB4MDFkNH0sCi0JewotCSAxMjQsIDU2MjAsIDB4NTEsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MzIsIDB4MDIsIDB4MDcsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDksIDB4MDQsIDB4MjMsIDB4MDAsIDB4NjAsIDB4MDAsCi0JIDB4MDAsIDB4MDksIDB4MDQsIDB4MjMsIDB4MDAsIDB4NjAsIDB4MDhjYywgMHgwOGM4LCAweDA4YzQsIDB4MDFkMiwKLQkgMHgwMWQyLAotCSAweDAxZDN9LAotCXsKLQkgMTI2LCA1NjMwLCAweDU0LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDMzLCAweDAyLCAweDA3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDc3LCAweDAwLCAweDAwLCAweDA5LCAweDA0LCAweDIzLCAweDAwLCAweDYwLCAweDAwLAotCSAweDAwLCAweDA5LCAweDA0LCAweDIzLCAweDAwLCAweDYwLCAweDA4ZDAsIDB4MDhjYywgMHgwOGM4LCAweDAxZDEsCi0JIDB4MDFkMiwKLQkgMHgwMWQyfSwKLQl7Ci0JIDEyOCwgNTY0MCwgMHg1OCwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgzNCwgMHgwMiwgMHgwNywKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHg3NywgMHgwMCwgMHgwMCwgMHgwOSwgMHgwNCwgMHgyMywgMHgwMCwgMHg2MCwgMHgwMCwKLQkgMHgwMCwgMHgwOSwgMHgwNCwgMHgyMywgMHgwMCwgMHg2MCwgMHgwOGQ0LCAweDA4ZDAsIDB4MDhjYywgMHgwMWQwLAotCSAweDAxZDEsCi0JIDB4MDFkMn0sCi0JewotCSAxMzAsIDU2NTAsIDB4NWIsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MzUsIDB4MDIsIDB4MDcsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDksIDB4MDMsIDB4MjMsIDB4MDAsIDB4NjAsIDB4MDAsCi0JIDB4MDAsIDB4MDksIDB4MDMsIDB4MjMsIDB4MDAsIDB4NjAsIDB4MDhkOCwgMHgwOGQ0LCAweDA4ZDAsIDB4MDFjZiwKLQkgMHgwMWQwLAotCSAweDAxZDF9LAotCXsKLQkgMTMyLCA1NjYwLCAweDVlLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDM2LCAweDAyLCAweDA3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDc3LCAweDAwLCAweDAwLCAweDA5LCAweDAzLCAweDIzLCAweDAwLCAweDYwLCAweDAwLAotCSAweDAwLCAweDA5LCAweDAzLCAweDIzLCAweDAwLCAweDYwLCAweDA4ZGMsIDB4MDhkOCwgMHgwOGQ0LCAweDAxY2UsCi0JIDB4MDFjZiwKLQkgMHgwMWQwfSwKLQl7Ci0JIDEzNCwgNTY3MCwgMHg2MiwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgzNywgMHgwMiwgMHgwNywKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHg3NywgMHgwMCwgMHgwMCwgMHgwOSwgMHgwMywgMHgyMywgMHgwMCwgMHg2MCwgMHgwMCwKLQkgMHgwMCwgMHgwOSwgMHgwMywgMHgyMywgMHgwMCwgMHg2MCwgMHgwOGUwLCAweDA4ZGMsIDB4MDhkOCwgMHgwMWNlLAotCSAweDAxY2UsCi0JIDB4MDFjZn0sCi0JewotCSAxMzYsIDU2ODAsIDB4NjUsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4MzgsIDB4MDIsIDB4MDcsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDksIDB4MDIsIDB4MjMsIDB4MDAsIDB4NjAsIDB4MDAsCi0JIDB4MDAsIDB4MDksIDB4MDIsIDB4MjMsIDB4MDAsIDB4NjAsIDB4MDhlNCwgMHgwOGUwLCAweDA4ZGMsIDB4MDFjZCwKLQkgMHgwMWNlLAotCSAweDAxY2V9LAotCXsKLQkgMTM4LCA1NjkwLCAweDY4LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDM5LCAweDAyLCAweDA3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDc3LCAweDAwLCAweDAwLCAweDA5LCAweDAyLCAweDIzLCAweDAwLCAweDYwLCAweDAwLAotCSAweDAwLCAweDA5LCAweDAyLCAweDIzLCAweDAwLCAweDYwLCAweDA4ZTgsIDB4MDhlNCwgMHgwOGUwLCAweDAxY2MsCi0JIDB4MDFjZCwKLQkgMHgwMWNlfSwKLQl7Ci0JIDE0MCwgNTcwMCwgMHg2YywgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgzYSwgMHgwMiwgMHgwNywKLQkgMHgwMCwgMHgwNywgMHgwMCwgMHg3NywgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgzMCwgMHgwMCwKLQkgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgzMCwgMHgwOGVjLCAweDA4ZTgsIDB4MDhlNCwgMHgwMWNiLAotCSAweDAxY2MsCi0JIDB4MDFjZH0sCi0JewotCSAxNDIsIDU3MTAsIDB4NmYsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4M2IsIDB4MDIsIDB4MDcsCi0JIDB4MDAsIDB4MDcsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MzAsIDB4MDAsCi0JIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MzAsIDB4MDhmMCwgMHgwOGVjLCAweDA4ZTgsIDB4MDFjYSwKLQkgMHgwMWNiLAotCSAweDAxY2N9LAotCXsKLQkgMTQ0LCA1NzIwLCAweDcyLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDNjLCAweDAyLCAweDA3LAotCSAweDAwLCAweDA3LCAweDAwLCAweDc3LCAweDAwLCAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDMwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDMwLCAweDA4ZjQsIDB4MDhmMCwgMHgwOGVjLCAweDAxYzksCi0JIDB4MDFjYSwKLQkgMHgwMWNifSwKLQl7Ci0JIDE0NSwgNTcyNSwgMHg3NCwgMHgxNywgMHgyMCwgMHgxNCwgMHgwOCwgMHgwOCwgMHgzMCwgMHg3OSwgMHgwNCwgMHgwNiwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgzMCwgMHgwMCwKLQkgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgzMCwgMHgwOGY2LCAweDA4ZjIsIDB4MDhlZSwgMHgwMWM5LAotCSAweDAxY2EsCi0JIDB4MDFjYn0sCi0JewotCSAxNDYsIDU3MzAsIDB4NzYsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4M2QsIDB4MDIsIDB4MDYsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MzAsIDB4MDAsCi0JIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MzAsIDB4MDhmOCwgMHgwOGY0LCAweDA4ZjAsIDB4MDFjOSwKLQkgMHgwMWM5LAotCSAweDAxY2F9LAotCXsKLQkgMTQ3LCA1NzM1LCAweDc3LCAweDE3LCAweDIwLCAweDE0LCAweDA4LCAweDA4LCAweDMwLCAweDdiLCAweDA0LCAweDA2LAotCSAweDAwLCAweDA2LCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDMwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDMwLCAweDA4ZmEsIDB4MDhmNiwgMHgwOGYyLCAweDAxYzgsCi0JIDB4MDFjOSwKLQkgMHgwMWNhfSwKLQl7Ci0JIDE0OCwgNTc0MCwgMHg3OSwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHgzZSwgMHgwMiwgMHgwNiwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgzMCwgMHgwMCwKLQkgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgzMCwgMHgwOGZjLCAweDA4ZjgsIDB4MDhmNCwgMHgwMWM4LAotCSAweDAxYzksCi0JIDB4MDFjOX0sCi0JewotCSAxNDksIDU3NDUsIDB4N2IsIDB4MTcsIDB4MjAsIDB4MTQsIDB4MDgsIDB4MDgsIDB4MzAsIDB4N2QsIDB4MDQsIDB4MDYsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MzAsIDB4MDAsCi0JIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MzAsIDB4MDhmZSwgMHgwOGZhLCAweDA4ZjYsIDB4MDFjOCwKLQkgMHgwMWM4LAotCSAweDAxYzl9LAotCXsKLQkgMTUwLCA1NzUwLCAweDdjLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDNmLCAweDAyLCAweDA2LAotCSAweDAwLCAweDA2LCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDAwLCAweDA5MDAsIDB4MDhmYywgMHgwOGY4LCAweDAxYzcsCi0JIDB4MDFjOCwKLQkgMHgwMWM5fSwKLQl7Ci0JIDE1MSwgNTc1NSwgMHg3ZSwgMHgxNywgMHgyMCwgMHgxNCwgMHgwOCwgMHgwOCwgMHgzMCwgMHg3ZiwgMHgwNCwgMHgwNiwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgwMCwgMHgwOTAyLCAweDA4ZmUsIDB4MDhmYSwgMHgwMWM3LAotCSAweDAxYzgsCi0JIDB4MDFjOH0sCi0JewotCSAxNTIsIDU3NjAsIDB4ODAsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4NDAsIDB4MDIsIDB4MDYsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDkwNCwgMHgwOTAwLCAweDA4ZmMsIDB4MDFjNiwKLQkgMHgwMWM3LAotCSAweDAxYzh9LAotCXsKLQkgMTUzLCA1NzY1LCAweDgxLCAweDE3LCAweDIwLCAweDE0LCAweDA4LCAweDA4LCAweDMwLCAweDgxLCAweDA0LCAweDA2LAotCSAweDAwLCAweDA2LCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDAwLCAweDA5MDYsIDB4MDkwMiwgMHgwOGZlLCAweDAxYzYsCi0JIDB4MDFjNywKLQkgMHgwMWM4fSwKLQl7Ci0JIDE1NCwgNTc3MCwgMHg4MywgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHg0MSwgMHgwMiwgMHgwNiwKLQkgMHgwMCwgMHgwNiwgMHgwMCwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgwMCwgMHgwOTA4LCAweDA5MDQsIDB4MDkwMCwgMHgwMWM2LAotCSAweDAxYzYsCi0JIDB4MDFjN30sCi0JewotCSAxNTUsIDU3NzUsIDB4ODUsIDB4MTcsIDB4MjAsIDB4MTQsIDB4MDgsIDB4MDgsIDB4MzAsIDB4ODMsIDB4MDQsIDB4MDYsCi0JIDB4MDAsIDB4MDYsIDB4MDAsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDkwYSwgMHgwOTA2LCAweDA5MDIsIDB4MDFjNSwKLQkgMHgwMWM2LAotCSAweDAxYzd9LAotCXsKLQkgMTU2LCA1NzgwLCAweDg2LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDQyLCAweDAyLCAweDA2LAotCSAweDAwLCAweDA2LCAweDAwLCAweDY2LCAweDAwLCAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDAwLCAweDA5MGMsIDB4MDkwOCwgMHgwOTA0LCAweDAxYzUsCi0JIDB4MDFjNiwKLQkgMHgwMWM2fSwKLQl7Ci0JIDE1NywgNTc4NSwgMHg4OCwgMHgxNywgMHgyMCwgMHgxNCwgMHgwOCwgMHgwOCwgMHgzMCwgMHg4NSwgMHgwNCwgMHgwNSwKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg1NSwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwOCwgMHgwMiwgMHgxMywgMHgwMCwgMHgwMCwgMHgwOTBlLCAweDA5MGEsIDB4MDkwNiwgMHgwMWM0LAotCSAweDAxYzUsCi0JIDB4MDFjNn0sCi0JewotCSAxNTgsIDU3OTAsIDB4OGEsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4NDMsIDB4MDIsIDB4MDUsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NTUsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDgsIDB4MDIsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDkxMCwgMHgwOTBjLCAweDA5MDgsIDB4MDFjNCwKLQkgMHgwMWM1LAotCSAweDAxYzZ9LAotCXsKLQkgMTU5LCA1Nzk1LCAweDhiLCAweDE3LCAweDIwLCAweDE0LCAweDA4LCAweDA4LCAweDMwLCAweDg3LCAweDA0LCAweDA1LAotCSAweDAwLCAweDA1LCAweDAwLCAweDU1LCAweDAwLCAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA4LCAweDAyLCAweDEzLCAweDAwLCAweDAwLCAweDA5MTIsIDB4MDkwZSwgMHgwOTBhLCAweDAxYzQsCi0JIDB4MDFjNCwKLQkgMHgwMWM1fSwKLQl7Ci0JIDE2MCwgNTgwMCwgMHg4ZCwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHg0NCwgMHgwMiwgMHgwNSwKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg1NSwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwOCwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwOTE0LCAweDA5MTAsIDB4MDkwYywgMHgwMWMzLAotCSAweDAxYzQsCi0JIDB4MDFjNX0sCi0JewotCSAxNjEsIDU4MDUsIDB4OGYsIDB4MTcsIDB4MjAsIDB4MTQsIDB4MDgsIDB4MDgsIDB4MzAsIDB4ODksIDB4MDQsIDB4MDUsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NTUsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDYsIDB4MDEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDkxNiwgMHgwOTEyLCAweDA5MGUsIDB4MDFjMywKLQkgMHgwMWM0LAotCSAweDAxYzR9LAotCXsKLQkgMTYyLCA1ODEwLCAweDkwLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDQ1LCAweDAyLCAweDA1LAotCSAweDAwLCAweDA1LCAweDAwLCAweDU1LCAweDAwLCAweDAwLCAweDA2LCAweDAxLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA2LCAweDAxLCAweDAzLCAweDAwLCAweDAwLCAweDA5MTgsIDB4MDkxNCwgMHgwOTEwLCAweDAxYzIsCi0JIDB4MDFjMywKLQkgMHgwMWM0fSwKLQl7Ci0JIDE2MywgNTgxNSwgMHg5MiwgMHgxNywgMHgyMCwgMHgxNCwgMHgwOCwgMHgwOCwgMHgzMCwgMHg4YiwgMHgwNCwgMHgwNSwKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg1NSwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwNiwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwOTFhLCAweDA5MTYsIDB4MDkxMiwgMHgwMWMyLAotCSAweDAxYzMsCi0JIDB4MDFjNH0sCi0JewotCSAxNjQsIDU4MjAsIDB4OTQsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4NDYsIDB4MDIsIDB4MDUsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NTUsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDYsIDB4MDEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDkxYywgMHgwOTE4LCAweDA5MTQsIDB4MDFjMiwKLQkgMHgwMWMyLAotCSAweDAxYzN9LAotCXsKLQkgMTY1LCA1ODI1LCAweDk1LCAweDE3LCAweDIwLCAweDE0LCAweDA4LCAweDA4LCAweDMwLCAweDhkLCAweDA0LCAweDA1LAotCSAweDAwLCAweDA1LCAweDAwLCAweDU1LCAweDAwLCAweDAwLCAweDA2LCAweDAxLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA2LCAweDAxLCAweDAzLCAweDAwLCAweDAwLCAweDA5MWUsIDB4MDkxYSwgMHgwOTE2LCAweDAxYzEsCi0JIDB4MDFjMiwKLQkgMHgwMWMzfSwKLQl7Ci0JIDE2NiwgNTgzMCwgMHg5NywgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHg0NywgMHgwMiwgMHgwNSwKLQkgMHgwMCwgMHgwNSwgMHgwMCwgMHg1NSwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwNiwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwOTIwLCAweDA5MWMsIDB4MDkxOCwgMHgwMWMxLAotCSAweDAxYzIsCi0JIDB4MDFjMn0sCi0JewotCSAxNjgsIDU4NDAsIDB4OWEsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4NDgsIDB4MDIsIDB4MDUsCi0JIDB4MDAsIDB4MDUsIDB4MDAsIDB4NTUsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDYsIDB4MDEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDkyNCwgMHgwOTIwLCAweDA5MWMsIDB4MDFjMCwKLQkgMHgwMWMxLAotCSAweDAxYzJ9LAotCXsKLQkgMTcwLCA1ODUwLCAweDllLCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDQ5LCAweDAyLCAweDA0LAotCSAweDAwLCAweDA0LCAweDAwLCAweDQ0LCAweDAwLCAweDAwLCAweDA2LCAweDAxLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA2LCAweDAxLCAweDAzLCAweDAwLCAweDAwLCAweDA5MjgsIDB4MDkyNCwgMHgwOTIwLCAweDAxYmYsCi0JIDB4MDFjMCwKLQkgMHgwMWMxfSwKLQl7Ci0JIDE3MiwgNTg2MCwgMHhhMSwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHg0YSwgMHgwMiwgMHgwNCwKLQkgMHgwMCwgMHgwNCwgMHgwMCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwNiwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwOTJjLCAweDA5MjgsIDB4MDkyNCwgMHgwMWJmLAotCSAweDAxYmYsCi0JIDB4MDFjMH0sCi0JewotCSAxNzQsIDU4NzAsIDB4YTQsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4NGIsIDB4MDIsIDB4MDQsCi0JIDB4MDAsIDB4MDQsIDB4MDAsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDYsIDB4MDEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDkzMCwgMHgwOTJjLCAweDA5MjgsIDB4MDFiZSwKLQkgMHgwMWJmLAotCSAweDAxYmZ9LAotCXsKLQkgMTc2LCA1ODgwLCAweGE4LCAweDE3LCAweDEwLCAweDBjLCAweDBjLCAweDBjLCAweDMwLCAweDRjLCAweDAyLCAweDAzLAotCSAweDAwLCAweDAzLCAweDAwLCAweDMzLCAweDAwLCAweDAwLCAweDA2LCAweDAxLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDA2LCAweDAxLCAweDAzLCAweDAwLCAweDAwLCAweDA5MzQsIDB4MDkzMCwgMHgwOTJjLCAweDAxYmQsCi0JIDB4MDFiZSwKLQkgMHgwMWJmfSwKLQl7Ci0JIDE3OCwgNTg5MCwgMHhhYiwgMHgxNywgMHgxMCwgMHgwYywgMHgwYywgMHgwYywgMHgzMCwgMHg0ZCwgMHgwMiwgMHgwMywKLQkgMHgwMCwgMHgwMywgMHgwMCwgMHgzMywgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwNiwgMHgwMSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwOTM4LCAweDA5MzQsIDB4MDkzMCwgMHgwMWJjLAotCSAweDAxYmQsCi0JIDB4MDFiZX0sCi0JewotCSAxODAsIDU5MDAsIDB4YWUsIDB4MTcsIDB4MTAsIDB4MGMsIDB4MGMsIDB4MGMsIDB4MzAsIDB4NGUsIDB4MDIsIDB4MDMsCi0JIDB4MDAsIDB4MDMsIDB4MDAsIDB4MzMsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDYsIDB4MDEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDkzYywgMHgwOTM4LCAweDA5MzQsIDB4MDFiYywKLQkgMHgwMWJjLAotCSAweDAxYmR9LAotCXsKLQkgMSwgMjQxMiwgMHg0OCwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg2YywgMHgwOSwgMHgwZiwKLQkgMHgwYSwgMHgwMCwgMHgwYSwgMHgwMCwgMHg2MSwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHg2MSwKLQkgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHgwM2M5LCAweDAzYzUsIDB4MDNjMSwgMHgwNDNhLAotCSAweDA0M2YsCi0JIDB4MDQ0M30sCi0JewotCSAyLCAyNDE3LCAweDRiLCAweDE2LCAweDMwLCAweDFiLCAweDBhLCAweDBhLCAweDMwLCAweDcxLCAweDA5LCAweDBmLAotCSAweDBhLCAweDAwLCAweDBhLCAweDAwLCAweDYxLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDYxLAotCSAweDczLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDAzY2IsIDB4MDNjNywgMHgwM2MzLCAweDA0MzgsCi0JIDB4MDQzZCwKLQkgMHgwNDQxfSwKLQl7Ci0JIDMsIDI0MjIsIDB4NGUsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4NzYsIDB4MDksIDB4MGYsCi0JIDB4MDksIDB4MDAsIDB4MDksIDB4MDAsIDB4NjEsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4NjEsCi0JIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDNjZCwgMHgwM2M5LCAweDAzYzUsIDB4MDQzNiwKLQkgMHgwNDNhLAotCSAweDA0M2Z9LAotCXsKLQkgNCwgMjQyNywgMHg1MiwgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg3YiwgMHgwOSwgMHgwZiwKLQkgMHgwOSwgMHgwMCwgMHgwOSwgMHgwMCwgMHg2MSwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHg2MSwKLQkgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHgwM2NmLCAweDAzY2IsIDB4MDNjNywgMHgwNDM0LAotCSAweDA0MzgsCi0JIDB4MDQzZH0sCi0JewotCSA1LCAyNDMyLCAweDU1LCAweDE2LCAweDMwLCAweDFiLCAweDBhLCAweDBhLCAweDMwLCAweDgwLCAweDA5LCAweDBmLAotCSAweDA4LCAweDAwLCAweDA4LCAweDAwLCAweDYxLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDYxLAotCSAweDczLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDAzZDEsIDB4MDNjZCwgMHgwM2M5LCAweDA0MzEsCi0JIDB4MDQzNiwKLQkgMHgwNDNhfSwKLQl7Ci0JIDYsIDI0MzcsIDB4NTgsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4ODUsIDB4MDksIDB4MGYsCi0JIDB4MDgsIDB4MDAsIDB4MDgsIDB4MDAsIDB4NjEsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4NjEsCi0JIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDNkMywgMHgwM2NmLCAweDAzY2IsIDB4MDQyZiwKLQkgMHgwNDM0LAotCSAweDA0Mzh9LAotCXsKLQkgNywgMjQ0MiwgMHg1YywgMHgxNiwgMHgzMCwgMHgxYiwgMHgwYSwgMHgwYSwgMHgzMCwgMHg4YSwgMHgwOSwgMHgwZiwKLQkgMHgwNywgMHgwMCwgMHgwNywgMHgwMCwgMHg2MSwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHg2MSwKLQkgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMCwgMHgwMCwgMHgwM2Q1LCAweDAzZDEsIDB4MDNjZCwgMHgwNDJkLAotCSAweDA0MzEsCi0JIDB4MDQzNn0sCi0JewotCSA4LCAyNDQ3LCAweDVmLCAweDE2LCAweDMwLCAweDFiLCAweDBhLCAweDBhLCAweDMwLCAweDhmLCAweDA5LCAweDBmLAotCSAweDA3LCAweDAwLCAweDA3LCAweDAwLCAweDYxLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDYxLAotCSAweDczLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDAzZDcsIDB4MDNkMywgMHgwM2NmLCAweDA0MmIsCi0JIDB4MDQyZiwKLQkgMHgwNDM0fSwKLQl7Ci0JIDksIDI0NTIsIDB4NjIsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4OTQsIDB4MDksIDB4MGYsCi0JIDB4MDcsIDB4MDAsIDB4MDcsIDB4MDAsIDB4NjEsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4NjEsCi0JIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDNkOSwgMHgwM2Q1LCAweDAzZDEsIDB4MDQyOSwKLQkgMHgwNDJkLAotCSAweDA0MzF9LAotCXsKLQkgMTAsIDI0NTcsIDB4NjYsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4OTksIDB4MDksIDB4MGYsCi0JIDB4MDYsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NjEsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4NjEsCi0JIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDNkYiwgMHgwM2Q3LCAweDAzZDMsIDB4MDQyNywKLQkgMHgwNDJiLAotCSAweDA0MmZ9LAotCXsKLQkgMTEsIDI0NjIsIDB4NjksIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4OWUsIDB4MDksIDB4MGYsCi0JIDB4MDYsIDB4MDAsIDB4MDYsIDB4MDAsIDB4NjEsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4NjEsCi0JIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDNkZCwgMHgwM2Q5LCAweDAzZDUsIDB4MDQyNCwKLQkgMHgwNDI5LAotCSAweDA0MmR9LAotCXsKLQkgMTIsIDI0NjcsIDB4NmMsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4YTMsIDB4MDksIDB4MGYsCi0JIDB4MDUsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NjEsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4NjEsCi0JIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDNkZiwgMHgwM2RiLCAweDAzZDcsIDB4MDQyMiwKLQkgMHgwNDI3LAotCSAweDA0MmJ9LAotCXsKLQkgMTMsIDI0NzIsIDB4NzAsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4YTgsIDB4MDksIDB4MGYsCi0JIDB4MDUsIDB4MDAsIDB4MDUsIDB4MDAsIDB4NjEsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4NjEsCi0JIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDNlMSwgMHgwM2RkLCAweDAzZDksIDB4MDQyMCwKLQkgMHgwNDI0LAotCSAweDA0Mjl9LAotCXsKLQkgMTQsIDI0ODQsIDB4NzgsIDB4MTYsIDB4MzAsIDB4MWIsIDB4MGEsIDB4MGEsIDB4MzAsIDB4YjQsIDB4MDksIDB4MGYsCi0JIDB4MDQsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NjEsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4MDAsIDB4NjEsCi0JIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZTAsIDB4MDAsIDB4MDNlNiwgMHgwM2UyLCAweDAzZGUsIDB4MDQxYiwKLQkgMHgwNDFmLAotCSAweDA0MjR9Ci19OwotCi1zdHJ1Y3QgcmFkaW9fcmVncyByZWdzXzIwNTVbXSA9IHsKLQl7MHgwMiwgMHg4MCwgMHg4MCwgMCwgMH0sCi0JezB4MDMsIDAsIDAsIDAsIDB9LAotCXsweDA0LCAweDI3LCAweDI3LCAwLCAwfSwKLQl7MHgwNSwgMCwgMCwgMCwgMH0sCi0JezB4MDYsIDB4MjcsIDB4MjcsIDAsIDB9LAotCXsweDA3LCAweDdmLCAweDdmLCAxLCAxfSwKLQl7MHgwOCwgMHg3LCAweDcsIDEsIDF9LAotCXsweDA5LCAweDdmLCAweDdmLCAxLCAxfSwKLQl7MHgwQSwgMHg3LCAweDcsIDEsIDF9LAotCXsweDBCLCAweDE1LCAweDE1LCAwLCAwfSwKLQl7MHgwQywgMHgxNSwgMHgxNSwgMCwgMH0sCi0JezB4MEQsIDB4NGYsIDB4NGYsIDEsIDF9LAotCXsweDBFLCAweDUsIDB4NSwgMSwgMX0sCi0JezB4MEYsIDB4NGYsIDB4NGYsIDEsIDF9LAotCXsweDEwLCAweDUsIDB4NSwgMSwgMX0sCi0JezB4MTEsIDB4ZDAsIDB4ZDAsIDAsIDB9LAotCXsweDEyLCAweDIsIDB4MiwgMCwgMH0sCi0JezB4MTMsIDAsIDAsIDAsIDB9LAotCXsweDE0LCAweDQwLCAweDQwLCAwLCAwfSwKLQl7MHgxNSwgMCwgMCwgMCwgMH0sCi0JezB4MTYsIDAsIDAsIDAsIDB9LAotCXsweDE3LCAwLCAwLCAwLCAwfSwKLQl7MHgxOCwgMCwgMCwgMCwgMH0sCi0JezB4MTksIDAsIDAsIDAsIDB9LAotCXsweDFBLCAwLCAwLCAwLCAwfSwKLQl7MHgxQiwgMCwgMCwgMCwgMH0sCi0JezB4MUMsIDAsIDAsIDAsIDB9LAotCXsweDFELCAweGMwLCAweGMwLCAwLCAwfSwKLQl7MHgxRSwgMHhmZiwgMHhmZiwgMCwgMH0sCi0JezB4MUYsIDB4YzAsIDB4YzAsIDAsIDB9LAotCXsweDIwLCAweGZmLCAweGZmLCAwLCAwfSwKLQl7MHgyMSwgMHhjMCwgMHhjMCwgMCwgMH0sCi0JezB4MjIsIDAsIDAsIDAsIDB9LAotCXsweDIzLCAweDJjLCAweDJjLCAwLCAwfSwKLQl7MHgyNCwgMCwgMCwgMCwgMH0sCi0JezB4MjUsIDAsIDAsIDAsIDB9LAotCXsweDI2LCAwLCAwLCAwLCAwfSwKLQl7MHgyNywgMCwgMCwgMCwgMH0sCi0JezB4MjgsIDAsIDAsIDAsIDB9LAotCXsweDI5LCAwLCAwLCAwLCAwfSwKLQl7MHgyQSwgMCwgMCwgMCwgMH0sCi0JezB4MkIsIDAsIDAsIDAsIDB9LAotCXsweDJDLCAwLCAwLCAwLCAwfSwKLQl7MHgyRCwgMHhhNCwgMHhhNCwgMCwgMH0sCi0JezB4MkUsIDB4MzgsIDB4MzgsIDAsIDB9LAotCXsweDJGLCAwLCAwLCAwLCAwfSwKLQl7MHgzMCwgMHg0LCAweDQsIDEsIDF9LAotCXsweDMxLCAwLCAwLCAwLCAwfSwKLQl7MHgzMiwgMHhhLCAweGEsIDAsIDB9LAotCXsweDMzLCAweDg3LCAweDg3LCAwLCAwfSwKLQl7MHgzNCwgMHg5LCAweDksIDAsIDB9LAotCXsweDM1LCAweDcwLCAweDcwLCAwLCAwfSwKLQl7MHgzNiwgMHgxMSwgMHgxMSwgMCwgMH0sCi0JezB4MzcsIDB4MTgsIDB4MTgsIDEsIDF9LAotCXsweDM4LCAweDYsIDB4NiwgMCwgMH0sCi0JezB4MzksIDB4NCwgMHg0LCAxLCAxfSwKLQl7MHgzQSwgMHg2LCAweDYsIDAsIDB9LAotCXsweDNCLCAweDllLCAweDllLCAwLCAwfSwKLQl7MHgzQywgMHg5LCAweDksIDAsIDB9LAotCXsweDNELCAweGM4LCAweGM4LCAxLCAxfSwKLQl7MHgzRSwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4M0YsIDAsIDAsIDAsIDB9LAotCXsweDQwLCAwLCAwLCAwLCAwfSwKLQl7MHg0MSwgMCwgMCwgMCwgMH0sCi0JezB4NDIsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHg0MywgMHgyLCAweDIsIDAsIDB9LAotCXsweDQ0LCAweDk2LCAweDk2LCAwLCAwfSwKLQl7MHg0NSwgMHgzZSwgMHgzZSwgMCwgMH0sCi0JezB4NDYsIDB4M2UsIDB4M2UsIDAsIDB9LAotCXsweDQ3LCAweDEzLCAweDEzLCAwLCAwfSwKLQl7MHg0OCwgMHgyLCAweDIsIDAsIDB9LAotCXsweDQ5LCAweDE1LCAweDE1LCAwLCAwfSwKLQl7MHg0QSwgMHg3LCAweDcsIDAsIDB9LAotCXsweDRCLCAwLCAwLCAwLCAwfSwKLQl7MHg0QywgMCwgMCwgMCwgMH0sCi0JezB4NEQsIDAsIDAsIDAsIDB9LAotCXsweDRFLCAwLCAwLCAwLCAwfSwKLQl7MHg0RiwgMCwgMCwgMCwgMH0sCi0JezB4NTAsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHg1MSwgMHg4LCAweDgsIDAsIDB9LAotCXsweDUyLCAweDYsIDB4NiwgMCwgMH0sCi0JezB4NTMsIDB4ODQsIDB4ODQsIDEsIDF9LAotCXsweDU0LCAweGMzLCAweGMzLCAwLCAwfSwKLQl7MHg1NSwgMHg4ZiwgMHg4ZiwgMCwgMH0sCi0JezB4NTYsIDB4ZmYsIDB4ZmYsIDAsIDB9LAotCXsweDU3LCAweGZmLCAweGZmLCAwLCAwfSwKLQl7MHg1OCwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4NTksIDB4ODgsIDB4ODgsIDAsIDB9LAotCXsweDVBLCAwLCAwLCAwLCAwfSwKLQl7MHg1QiwgMHhjYywgMHhjYywgMCwgMH0sCi0JezB4NUMsIDB4NiwgMHg2LCAwLCAwfSwKLQl7MHg1RCwgMHg4MCwgMHg4MCwgMCwgMH0sCi0JezB4NUUsIDB4ODAsIDB4ODAsIDAsIDB9LAotCXsweDVGLCAweGY4LCAweGY4LCAwLCAwfSwKLQl7MHg2MCwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4NjEsIDB4ODgsIDB4ODgsIDAsIDB9LAotCXsweDYyLCAweDg4LCAweDgsIDEsIDF9LAotCXsweDYzLCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHg2NCwgMCwgMCwgMCwgMH0sCi0JezB4NjUsIDB4MSwgMHgxLCAxLCAxfSwKLQl7MHg2NiwgMHg4YSwgMHg4YSwgMCwgMH0sCi0JezB4NjcsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHg2OCwgMHg4MywgMHg4MywgMCwgMH0sCi0JezB4NjksIDB4NiwgMHg2LCAwLCAwfSwKLQl7MHg2QSwgMHhhMCwgMHhhMCwgMCwgMH0sCi0JezB4NkIsIDB4YSwgMHhhLCAwLCAwfSwKLQl7MHg2QywgMHg4NywgMHg4NywgMSwgMX0sCi0JezB4NkQsIDB4MmEsIDB4MmEsIDAsIDB9LAotCXsweDZFLCAweDJhLCAweDJhLCAwLCAwfSwKLQl7MHg2RiwgMHgyYSwgMHgyYSwgMCwgMH0sCi0JezB4NzAsIDB4MmEsIDB4MmEsIDAsIDB9LAotCXsweDcxLCAweDE4LCAweDE4LCAwLCAwfSwKLQl7MHg3MiwgMHg2YSwgMHg2YSwgMSwgMX0sCi0JezB4NzMsIDB4YWIsIDB4YWIsIDEsIDF9LAotCXsweDc0LCAweDEzLCAweDEzLCAxLCAxfSwKLQl7MHg3NSwgMHhjMSwgMHhjMSwgMSwgMX0sCi0JezB4NzYsIDB4YWEsIDB4YWEsIDEsIDF9LAotCXsweDc3LCAweDg3LCAweDg3LCAxLCAxfSwKLQl7MHg3OCwgMCwgMCwgMCwgMH0sCi0JezB4NzksIDB4NiwgMHg2LCAwLCAwfSwKLQl7MHg3QSwgMHg3LCAweDcsIDAsIDB9LAotCXsweDdCLCAweDcsIDB4NywgMCwgMH0sCi0JezB4N0MsIDB4MTUsIDB4MTUsIDAsIDB9LAotCXsweDdELCAweDU1LCAweDU1LCAwLCAwfSwKLQl7MHg3RSwgMHg5NywgMHg5NywgMSwgMX0sCi0JezB4N0YsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHg4MCwgMHgxNCwgMHgxNCwgMSwgMX0sCi0JezB4ODEsIDB4MzMsIDB4MzMsIDAsIDB9LAotCXsweDgyLCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHg4MywgMHg2LCAweDYsIDAsIDB9LAotCXsweDg0LCAweDMsIDB4MywgMSwgMX0sCi0JezB4ODUsIDB4YSwgMHhhLCAwLCAwfSwKLQl7MHg4NiwgMHgzLCAweDMsIDEsIDF9LAotCXsweDg3LCAweDJhLCAweDJhLCAwLCAwfSwKLQl7MHg4OCwgMHhhNCwgMHhhNCwgMCwgMH0sCi0JezB4ODksIDB4MTgsIDB4MTgsIDAsIDB9LAotCXsweDhBLCAweDI4LCAweDI4LCAwLCAwfSwKLQl7MHg4QiwgMCwgMCwgMCwgMH0sCi0JezB4OEMsIDB4NGEsIDB4NGEsIDAsIDB9LAotCXsweDhELCAwLCAwLCAwLCAwfSwKLQl7MHg4RSwgMHhmOCwgMHhmOCwgMCwgMH0sCi0JezB4OEYsIDB4ODgsIDB4ODgsIDAsIDB9LAotCXsweDkwLCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHg5MSwgMHg4OCwgMHg4LCAxLCAxfSwKLQl7MHg5MiwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4OTMsIDAsIDAsIDAsIDB9LAotCXsweDk0LCAweDEsIDB4MSwgMSwgMX0sCi0JezB4OTUsIDB4OGEsIDB4OGEsIDAsIDB9LAotCXsweDk2LCAweDgsIDB4OCwgMCwgMH0sCi0JezB4OTcsIDB4ODMsIDB4ODMsIDAsIDB9LAotCXsweDk4LCAweDYsIDB4NiwgMCwgMH0sCi0JezB4OTksIDB4YTAsIDB4YTAsIDAsIDB9LAotCXsweDlBLCAweGEsIDB4YSwgMCwgMH0sCi0JezB4OUIsIDB4ODcsIDB4ODcsIDEsIDF9LAotCXsweDlDLCAweDJhLCAweDJhLCAwLCAwfSwKLQl7MHg5RCwgMHgyYSwgMHgyYSwgMCwgMH0sCi0JezB4OUUsIDB4MmEsIDB4MmEsIDAsIDB9LAotCXsweDlGLCAweDJhLCAweDJhLCAwLCAwfSwKLQl7MHhBMCwgMHgxOCwgMHgxOCwgMCwgMH0sCi0JezB4QTEsIDB4NmEsIDB4NmEsIDEsIDF9LAotCXsweEEyLCAweGFiLCAweGFiLCAxLCAxfSwKLQl7MHhBMywgMHgxMywgMHgxMywgMSwgMX0sCi0JezB4QTQsIDB4YzEsIDB4YzEsIDEsIDF9LAotCXsweEE1LCAweGFhLCAweGFhLCAxLCAxfSwKLQl7MHhBNiwgMHg4NywgMHg4NywgMSwgMX0sCi0JezB4QTcsIDAsIDAsIDAsIDB9LAotCXsweEE4LCAweDYsIDB4NiwgMCwgMH0sCi0JezB4QTksIDB4NywgMHg3LCAwLCAwfSwKLQl7MHhBQSwgMHg3LCAweDcsIDAsIDB9LAotCXsweEFCLCAweDE1LCAweDE1LCAwLCAwfSwKLQl7MHhBQywgMHg1NSwgMHg1NSwgMCwgMH0sCi0JezB4QUQsIDB4OTcsIDB4OTcsIDEsIDF9LAotCXsweEFFLCAweDgsIDB4OCwgMCwgMH0sCi0JezB4QUYsIDB4MTQsIDB4MTQsIDEsIDF9LAotCXsweEIwLCAweDMzLCAweDMzLCAwLCAwfSwKLQl7MHhCMSwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4QjIsIDB4NiwgMHg2LCAwLCAwfSwKLQl7MHhCMywgMHgzLCAweDMsIDEsIDF9LAotCXsweEI0LCAweGEsIDB4YSwgMCwgMH0sCi0JezB4QjUsIDB4MywgMHgzLCAxLCAxfSwKLQl7MHhCNiwgMHgyYSwgMHgyYSwgMCwgMH0sCi0JezB4QjcsIDB4YTQsIDB4YTQsIDAsIDB9LAotCXsweEI4LCAweDE4LCAweDE4LCAwLCAwfSwKLQl7MHhCOSwgMHgyOCwgMHgyOCwgMCwgMH0sCi0JezB4QkEsIDAsIDAsIDAsIDB9LAotCXsweEJCLCAweDRhLCAweDRhLCAwLCAwfSwKLQl7MHhCQywgMCwgMCwgMCwgMH0sCi0JezB4QkQsIDB4NzEsIDB4NzEsIDAsIDB9LAotCXsweEJFLCAweDcyLCAweDcyLCAwLCAwfSwKLQl7MHhCRiwgMHg3MywgMHg3MywgMCwgMH0sCi0JezB4QzAsIDB4NzQsIDB4NzQsIDAsIDB9LAotCXsweEMxLCAweDc1LCAweDc1LCAwLCAwfSwKLQl7MHhDMiwgMHg3NiwgMHg3NiwgMCwgMH0sCi0JezB4QzMsIDB4NzcsIDB4NzcsIDAsIDB9LAotCXsweEM0LCAweDc4LCAweDc4LCAwLCAwfSwKLQl7MHhDNSwgMHg3OSwgMHg3OSwgMCwgMH0sCi0JezB4QzYsIDB4N2EsIDB4N2EsIDAsIDB9LAotCXsweEM3LCAwLCAwLCAwLCAwfSwKLQl7MHhDOCwgMCwgMCwgMCwgMH0sCi0JezB4QzksIDAsIDAsIDAsIDB9LAotCXsweENBLCAwLCAwLCAwLCAwfSwKLQl7MHhDQiwgMCwgMCwgMCwgMH0sCi0JezB4Q0MsIDAsIDAsIDAsIDB9LAotCXsweENELCAwLCAwLCAwLCAwfSwKLQl7MHhDRSwgMHg2LCAweDYsIDAsIDB9LAotCXsweENGLCAwLCAwLCAwLCAwfSwKLQl7MHhEMCwgMCwgMCwgMCwgMH0sCi0JezB4RDEsIDB4MTgsIDB4MTgsIDAsIDB9LAotCXsweEQyLCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHhEMywgMCwgMCwgMCwgMH0sCi0JezB4RDQsIDAsIDAsIDAsIDB9LAotCXsweEQ1LCAwLCAwLCAwLCAwfSwKLQl7MHhENiwgMCwgMCwgMCwgMH0sCi0JezB4RDcsIDAsIDAsIDAsIDB9LAotCXsweEQ4LCAwLCAwLCAwLCAwfSwKLQl7MHhEOSwgMCwgMCwgMCwgMH0sCi0JezB4REEsIDB4NiwgMHg2LCAwLCAwfSwKLQl7MHhEQiwgMCwgMCwgMCwgMH0sCi0JezB4REMsIDAsIDAsIDAsIDB9LAotCXsweERELCAweDE4LCAweDE4LCAwLCAwfSwKLQl7MHhERSwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4REYsIDAsIDAsIDAsIDB9LAotCXsweEUwLCAwLCAwLCAwLCAwfSwKLQl7MHhFMSwgMCwgMCwgMCwgMH0sCi0JezB4RTIsIDAsIDAsIDAsIDB9LAotCXsweEZGRkYsIDAsIDAsIDAsIDB9LAotfTsKLQotc3RydWN0IHJhZGlvX3JlZ3MgcmVnc19TWU5fMjA1NltdID0gewotCXsweDAyLCAwLCAwLCAwLCAwfSwKLQl7MHgwMywgMCwgMCwgMCwgMH0sCi0JezB4MDQsIDAsIDAsIDAsIDB9LAotCXsweDA1LCAwLCAwLCAwLCAwfSwKLQl7MHgwNiwgMCwgMCwgMCwgMH0sCi0JezB4MDcsIDAsIDAsIDAsIDB9LAotCXsweDA4LCAwLCAwLCAwLCAwfSwKLQl7MHgwOSwgMHgxLCAweDEsIDAsIDB9LAotCXsweDBBLCAwLCAwLCAwLCAwfSwKLQl7MHgwQiwgMCwgMCwgMCwgMH0sCi0JezB4MEMsIDAsIDAsIDAsIDB9LAotCXsweDBELCAwLCAwLCAwLCAwfSwKLQl7MHgwRSwgMCwgMCwgMCwgMH0sCi0JezB4MEYsIDAsIDAsIDAsIDB9LAotCXsweDEwLCAwLCAwLCAwLCAwfSwKLQl7MHgxMSwgMCwgMCwgMCwgMH0sCi0JezB4MTIsIDAsIDAsIDAsIDB9LAotCXsweDEzLCAwLCAwLCAwLCAwfSwKLQl7MHgxNCwgMCwgMCwgMCwgMH0sCi0JezB4MTUsIDAsIDAsIDAsIDB9LAotCXsweDE2LCAwLCAwLCAwLCAwfSwKLQl7MHgxNywgMCwgMCwgMCwgMH0sCi0JezB4MTgsIDAsIDAsIDAsIDB9LAotCXsweDE5LCAwLCAwLCAwLCAwfSwKLQl7MHgxQSwgMCwgMCwgMCwgMH0sCi0JezB4MUIsIDAsIDAsIDAsIDB9LAotCXsweDFDLCAwLCAwLCAwLCAwfSwKLQl7MHgxRCwgMCwgMCwgMCwgMH0sCi0JezB4MUUsIDAsIDAsIDAsIDB9LAotCXsweDFGLCAwLCAwLCAwLCAwfSwKLQl7MHgyMCwgMCwgMCwgMCwgMH0sCi0JezB4MjEsIDAsIDAsIDAsIDB9LAotCXsweDIyLCAweDYwLCAweDYwLCAwLCAwfSwKLQl7MHgyMywgMHg2LCAweDYsIDAsIDB9LAotCXsweDI0LCAweGMsIDB4YywgMCwgMH0sCi0JezB4MjUsIDAsIDAsIDAsIDB9LAotCXsweDI2LCAwLCAwLCAwLCAwfSwKLQl7MHgyNywgMCwgMCwgMCwgMH0sCi0JezB4MjgsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHgyOSwgMCwgMCwgMCwgMH0sCi0JezB4MkEsIDAsIDAsIDAsIDB9LAotCXsweDJCLCAwLCAwLCAwLCAwfSwKLQl7MHgyQywgMCwgMCwgMCwgMH0sCi0JezB4MkQsIDAsIDAsIDAsIDB9LAotCXsweDJFLCAweGQsIDB4ZCwgMCwgMH0sCi0JezB4MkYsIDB4MWYsIDB4MWYsIDAsIDB9LAotCXsweDMwLCAweDE1LCAweDE1LCAwLCAwfSwKLQl7MHgzMSwgMHhmLCAweGYsIDAsIDB9LAotCXsweDMyLCAwLCAwLCAwLCAwfSwKLQl7MHgzMywgMCwgMCwgMCwgMH0sCi0JezB4MzQsIDAsIDAsIDAsIDB9LAotCXsweDM1LCAwLCAwLCAwLCAwfSwKLQl7MHgzNiwgMCwgMCwgMCwgMH0sCi0JezB4MzcsIDAsIDAsIDAsIDB9LAotCXsweDM4LCAwLCAwLCAwLCAwfSwKLQl7MHgzOSwgMCwgMCwgMCwgMH0sCi0JezB4M0EsIDAsIDAsIDAsIDB9LAotCXsweDNCLCAwLCAwLCAwLCAwfSwKLQl7MHgzQywgMHgxMywgMHgxMywgMCwgMH0sCi0JezB4M0QsIDB4ZiwgMHhmLCAwLCAwfSwKLQl7MHgzRSwgMHgxOCwgMHgxOCwgMCwgMH0sCi0JezB4M0YsIDAsIDAsIDAsIDB9LAotCXsweDQwLCAwLCAwLCAwLCAwfSwKLQl7MHg0MSwgMHgyMCwgMHgyMCwgMCwgMH0sCi0JezB4NDIsIDB4MjAsIDB4MjAsIDAsIDB9LAotCXsweDQzLCAwLCAwLCAwLCAwfSwKLQl7MHg0NCwgMHg3NywgMHg3NywgMCwgMH0sCi0JezB4NDUsIDB4NywgMHg3LCAwLCAwfSwKLQl7MHg0NiwgMHgxLCAweDEsIDAsIDB9LAotCXsweDQ3LCAweDQsIDB4NCwgMCwgMH0sCi0JezB4NDgsIDB4ZiwgMHhmLCAwLCAwfSwKLQl7MHg0OSwgMHgzMCwgMHgzMCwgMCwgMH0sCi0JezB4NEEsIDB4MzIsIDB4MzIsIDAsIDB9LAotCXsweDRCLCAweGQsIDB4ZCwgMCwgMH0sCi0JezB4NEMsIDB4ZCwgMHhkLCAwLCAwfSwKLQl7MHg0RCwgMHg0LCAweDQsIDAsIDB9LAotCXsweDRFLCAweDYsIDB4NiwgMCwgMH0sCi0JezB4NEYsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHg1MCwgMHgxYywgMHgxYywgMCwgMH0sCi0JezB4NTEsIDB4MiwgMHgyLCAwLCAwfSwKLQl7MHg1MiwgMHgyLCAweDIsIDAsIDB9LAotCXsweDUzLCAweGY3LCAweGY3LCAxLCAxfSwKLQl7MHg1NCwgMHhiNCwgMHhiNCwgMCwgMH0sCi0JezB4NTUsIDB4ZDIsIDB4ZDIsIDAsIDB9LAotCXsweDU2LCAwLCAwLCAwLCAwfSwKLQl7MHg1NywgMCwgMCwgMCwgMH0sCi0JezB4NTgsIDB4NCwgMHg0LCAwLCAwfSwKLQl7MHg1OSwgMHg5NiwgMHg5NiwgMCwgMH0sCi0JezB4NUEsIDB4M2UsIDB4M2UsIDAsIDB9LAotCXsweDVCLCAweDNlLCAweDNlLCAwLCAwfSwKLQl7MHg1QywgMHgxMywgMHgxMywgMCwgMH0sCi0JezB4NUQsIDB4MiwgMHgyLCAwLCAwfSwKLQl7MHg1RSwgMCwgMCwgMCwgMH0sCi0JezB4NUYsIDB4NywgMHg3LCAwLCAwfSwKLQl7MHg2MCwgMHg3LCAweDcsIDEsIDF9LAotCXsweDYxLCAweDgsIDB4OCwgMCwgMH0sCi0JezB4NjIsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHg2MywgMCwgMCwgMCwgMH0sCi0JezB4NjQsIDAsIDAsIDAsIDB9LAotCXsweDY1LCAwLCAwLCAwLCAwfSwKLQl7MHg2NiwgMCwgMCwgMCwgMH0sCi0JezB4NjcsIDAsIDAsIDAsIDB9LAotCXsweDY4LCAweDQwLCAweDQwLCAwLCAwfSwKLQl7MHg2OSwgMCwgMCwgMCwgMH0sCi0JezB4NkEsIDAsIDAsIDAsIDB9LAotCXsweDZCLCAwLCAwLCAwLCAwfSwKLQl7MHg2QywgMCwgMCwgMCwgMH0sCi0JezB4NkQsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHg2RSwgMCwgMCwgMCwgMH0sCi0JezB4NkYsIDAsIDAsIDAsIDB9LAotCXsweDcwLCAweDYwLCAweDYwLCAwLCAwfSwKLQl7MHg3MSwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4NzIsIDB4YywgMHhjLCAwLCAwfSwKLQl7MHg3MywgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4NzQsIDB4OGYsIDB4OGYsIDEsIDF9LAotCXsweDc1LCAwLCAwLCAwLCAwfSwKLQl7MHg3NiwgMHhjYywgMHhjYywgMCwgMH0sCi0JezB4NzcsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHg3OCwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4NzksIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweDdBLCAwLCAwLCAwLCAwfSwKLQl7MHg3QiwgMCwgMCwgMCwgMH0sCi0JezB4N0MsIDAsIDAsIDAsIDB9LAotCXsweDdELCAwLCAwLCAwLCAwfSwKLQl7MHg3RSwgMCwgMCwgMCwgMH0sCi0JezB4N0YsIDAsIDAsIDAsIDB9LAotCXsweDgwLCAwLCAwLCAwLCAwfSwKLQl7MHg4MSwgMCwgMCwgMCwgMH0sCi0JezB4ODIsIDAsIDAsIDAsIDB9LAotCXsweDgzLCAwLCAwLCAwLCAwfSwKLQl7MHg4NCwgMCwgMCwgMCwgMH0sCi0JezB4ODUsIDB4ZmYsIDB4ZmYsIDAsIDB9LAotCXsweDg2LCAwLCAwLCAwLCAwfSwKLQl7MHg4NywgMCwgMCwgMCwgMH0sCi0JezB4ODgsIDAsIDAsIDAsIDB9LAotCXsweDg5LCAwLCAwLCAwLCAwfSwKLQl7MHg4QSwgMCwgMCwgMCwgMH0sCi0JezB4OEIsIDAsIDAsIDAsIDB9LAotCXsweDhDLCAwLCAwLCAwLCAwfSwKLQl7MHg4RCwgMCwgMCwgMCwgMH0sCi0JezB4OEUsIDAsIDAsIDAsIDB9LAotCXsweDhGLCAwLCAwLCAwLCAwfSwKLQl7MHg5MCwgMCwgMCwgMCwgMH0sCi0JezB4OTEsIDAsIDAsIDAsIDB9LAotCXsweDkyLCAwLCAwLCAwLCAwfSwKLQl7MHg5MywgMCwgMCwgMCwgMH0sCi0JezB4OTQsIDAsIDAsIDAsIDB9LAotCXsweDk1LCAwLCAwLCAwLCAwfSwKLQl7MHg5NiwgMCwgMCwgMCwgMH0sCi0JezB4OTcsIDAsIDAsIDAsIDB9LAotCXsweDk4LCAwLCAwLCAwLCAwfSwKLQl7MHg5OSwgMCwgMCwgMCwgMH0sCi0JezB4OUEsIDAsIDAsIDAsIDB9LAotCXsweDlCLCAwLCAwLCAwLCAwfSwKLQl7MHg5QywgMCwgMCwgMCwgMH0sCi0JezB4OUQsIDAsIDAsIDAsIDB9LAotCXsweDlFLCAwLCAwLCAwLCAwfSwKLQl7MHg5RiwgMHg2LCAweDYsIDAsIDB9LAotCXsweEEwLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBMSwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QTIsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEEzLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBNCwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QTUsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEE2LCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBNywgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QTgsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEE5LCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBQSwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QUIsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEFDLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBRCwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QUUsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEFGLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhCMCwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QjEsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEIyLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhCMywgMHhhLCAweGEsIDAsIDB9LAotCXsweEI0LCAwLCAwLCAwLCAwfSwKLQl7MHhCNSwgMCwgMCwgMCwgMH0sCi0JezB4QjYsIDAsIDAsIDAsIDB9LAotCXsweEZGRkYsIDAsIDAsIDAsIDB9Ci19OwotCi1zdHJ1Y3QgcmFkaW9fcmVncyByZWdzX1RYXzIwNTZbXSA9IHsKLQl7MHgwMiwgMCwgMCwgMCwgMH0sCi0JezB4MDMsIDAsIDAsIDAsIDB9LAotCXsweDA0LCAwLCAwLCAwLCAwfSwKLQl7MHgwNSwgMCwgMCwgMCwgMH0sCi0JezB4MDYsIDAsIDAsIDAsIDB9LAotCXsweDA3LCAwLCAwLCAwLCAwfSwKLQl7MHgwOCwgMCwgMCwgMCwgMH0sCi0JezB4MDksIDAsIDAsIDAsIDB9LAotCXsweDBBLCAwLCAwLCAwLCAwfSwKLQl7MHgwQiwgMCwgMCwgMCwgMH0sCi0JezB4MEMsIDAsIDAsIDAsIDB9LAotCXsweDBELCAwLCAwLCAwLCAwfSwKLQl7MHgwRSwgMCwgMCwgMCwgMH0sCi0JezB4MEYsIDAsIDAsIDAsIDB9LAotCXsweDEwLCAwLCAwLCAwLCAwfSwKLQl7MHgxMSwgMCwgMCwgMCwgMH0sCi0JezB4MTIsIDAsIDAsIDAsIDB9LAotCXsweDEzLCAwLCAwLCAwLCAwfSwKLQl7MHgxNCwgMCwgMCwgMCwgMH0sCi0JezB4MTUsIDAsIDAsIDAsIDB9LAotCXsweDE2LCAwLCAwLCAwLCAwfSwKLQl7MHgxNywgMCwgMCwgMCwgMH0sCi0JezB4MTgsIDAsIDAsIDAsIDB9LAotCXsweDE5LCAwLCAwLCAwLCAwfSwKLQl7MHgxQSwgMCwgMCwgMCwgMH0sCi0JezB4MUIsIDAsIDAsIDAsIDB9LAotCXsweDFDLCAwLCAwLCAwLCAwfSwKLQl7MHgxRCwgMCwgMCwgMCwgMH0sCi0JezB4MUUsIDAsIDAsIDAsIDB9LAotCXsweDFGLCAwLCAwLCAwLCAwfSwKLQl7MHgyMCwgMCwgMCwgMCwgMH0sCi0JezB4MjEsIDB4ODgsIDB4ODgsIDAsIDB9LAotCXsweDIyLCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHgyMywgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4MjQsIDB4ODgsIDB4ODgsIDAsIDB9LAotCXsweDI1LCAweGMsIDB4YywgMCwgMH0sCi0JezB4MjYsIDAsIDAsIDAsIDB9LAotCXsweDI3LCAweDMsIDB4MywgMCwgMH0sCi0JezB4MjgsIDAsIDAsIDAsIDB9LAotCXsweDI5LCAweDMsIDB4MywgMCwgMH0sCi0JezB4MkEsIDB4MzcsIDB4MzcsIDAsIDB9LAotCXsweDJCLCAweDMsIDB4MywgMCwgMH0sCi0JezB4MkMsIDAsIDAsIDAsIDB9LAotCXsweDJELCAwLCAwLCAwLCAwfSwKLQl7MHgyRSwgMHgxLCAweDEsIDAsIDB9LAotCXsweDJGLCAweDEsIDB4MSwgMCwgMH0sCi0JezB4MzAsIDAsIDAsIDAsIDB9LAotCXsweDMxLCAwLCAwLCAwLCAwfSwKLQl7MHgzMiwgMCwgMCwgMCwgMH0sCi0JezB4MzMsIDB4MTEsIDB4MTEsIDAsIDB9LAotCXsweDM0LCAweDExLCAweDExLCAwLCAwfSwKLQl7MHgzNSwgMCwgMCwgMCwgMH0sCi0JezB4MzYsIDAsIDAsIDAsIDB9LAotCXsweDM3LCAweDMsIDB4MywgMCwgMH0sCi0JezB4MzgsIDB4ZiwgMHhmLCAwLCAwfSwKLQl7MHgzOSwgMCwgMCwgMCwgMH0sCi0JezB4M0EsIDB4MmQsIDB4MmQsIDAsIDB9LAotCXsweDNCLCAwLCAwLCAwLCAwfSwKLQl7MHgzQywgMHg2ZSwgMHg2ZSwgMCwgMH0sCi0JezB4M0QsIDB4ZjAsIDB4ZjAsIDEsIDF9LAotCXsweDNFLCAwLCAwLCAwLCAwfSwKLQl7MHgzRiwgMCwgMCwgMCwgMH0sCi0JezB4NDAsIDAsIDAsIDAsIDB9LAotCXsweDQxLCAweDMsIDB4MywgMCwgMH0sCi0JezB4NDIsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHg0MywgMCwgMCwgMCwgMH0sCi0JezB4NDQsIDB4MWUsIDB4MWUsIDAsIDB9LAotCXsweDQ1LCAwLCAwLCAwLCAwfSwKLQl7MHg0NiwgMHg2ZSwgMHg2ZSwgMCwgMH0sCi0JezB4NDcsIDB4ZjAsIDB4ZjAsIDEsIDF9LAotCXsweDQ4LCAwLCAwLCAwLCAwfSwKLQl7MHg0OSwgMHgyLCAweDIsIDAsIDB9LAotCXsweDRBLCAweGZmLCAweGZmLCAxLCAxfSwKLQl7MHg0QiwgMHhjLCAweGMsIDAsIDB9LAotCXsweDRDLCAwLCAwLCAwLCAwfSwKLQl7MHg0RCwgMHgzOCwgMHgzOCwgMCwgMH0sCi0JezB4NEUsIDB4NzAsIDB4NzAsIDEsIDF9LAotCXsweDRGLCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NTAsIDB4ODgsIDB4ODgsIDAsIDB9LAotCXsweDUxLCAweGMsIDB4YywgMCwgMH0sCi0JezB4NTIsIDAsIDAsIDAsIDB9LAotCXsweDUzLCAweDgsIDB4OCwgMCwgMH0sCi0JezB4NTQsIDB4NzAsIDB4NzAsIDEsIDF9LAotCXsweDU1LCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NTYsIDB4ZmYsIDB4ZmYsIDEsIDF9LAotCXsweDU3LCAwLCAwLCAwLCAwfSwKLQl7MHg1OCwgMHg4MywgMHg4MywgMCwgMH0sCi0JezB4NTksIDB4NzcsIDB4NzcsIDEsIDF9LAotCXsweDVBLCAwLCAwLCAwLCAwfSwKLQl7MHg1QiwgMHgyLCAweDIsIDAsIDB9LAotCXsweDVDLCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHg1RCwgMCwgMCwgMCwgMH0sCi0JezB4NUUsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHg1RiwgMHg3NywgMHg3NywgMSwgMX0sCi0JezB4NjAsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHg2MSwgMCwgMCwgMCwgMH0sCi0JezB4NjIsIDB4NywgMHg3LCAwLCAwfSwKLQl7MHg2MywgMCwgMCwgMCwgMH0sCi0JezB4NjQsIDB4NywgMHg3LCAwLCAwfSwKLQl7MHg2NSwgMCwgMCwgMCwgMH0sCi0JezB4NjYsIDAsIDAsIDAsIDB9LAotCXsweDY3LCAweDc0LCAweDc0LCAxLCAxfSwKLQl7MHg2OCwgMCwgMCwgMCwgMH0sCi0JezB4NjksIDB4YSwgMHhhLCAwLCAwfSwKLQl7MHg2QSwgMCwgMCwgMCwgMH0sCi0JezB4NkIsIDAsIDAsIDAsIDB9LAotCXsweDZDLCAwLCAwLCAwLCAwfSwKLQl7MHg2RCwgMCwgMCwgMCwgMH0sCi0JezB4NkUsIDAsIDAsIDAsIDB9LAotCXsweDZGLCAwLCAwLCAwLCAwfSwKLQl7MHg3MCwgMCwgMCwgMCwgMH0sCi0JezB4NzEsIDB4MiwgMHgyLCAwLCAwfSwKLQl7MHg3MiwgMCwgMCwgMCwgMH0sCi0JezB4NzMsIDAsIDAsIDAsIDB9LAotCXsweDc0LCAweGUsIDB4ZSwgMCwgMH0sCi0JezB4NzUsIDB4ZSwgMHhlLCAwLCAwfSwKLQl7MHg3NiwgMHhlLCAweGUsIDAsIDB9LAotCXsweDc3LCAweDEzLCAweDEzLCAwLCAwfSwKLQl7MHg3OCwgMHgxMywgMHgxMywgMCwgMH0sCi0JezB4NzksIDB4MWIsIDB4MWIsIDAsIDB9LAotCXsweDdBLCAweDFiLCAweDFiLCAwLCAwfSwKLQl7MHg3QiwgMHg1NSwgMHg1NSwgMCwgMH0sCi0JezB4N0MsIDB4NWIsIDB4NWIsIDAsIDB9LAotCXsweDdELCAwLCAwLCAwLCAwfSwKLQl7MHg3RSwgMCwgMCwgMCwgMH0sCi0JezB4N0YsIDAsIDAsIDAsIDB9LAotCXsweDgwLCAwLCAwLCAwLCAwfSwKLQl7MHg4MSwgMCwgMCwgMCwgMH0sCi0JezB4ODIsIDAsIDAsIDAsIDB9LAotCXsweDgzLCAwLCAwLCAwLCAwfSwKLQl7MHg4NCwgMCwgMCwgMCwgMH0sCi0JezB4ODUsIDAsIDAsIDAsIDB9LAotCXsweDg2LCAwLCAwLCAwLCAwfSwKLQl7MHg4NywgMCwgMCwgMCwgMH0sCi0JezB4ODgsIDAsIDAsIDAsIDB9LAotCXsweDg5LCAwLCAwLCAwLCAwfSwKLQl7MHg4QSwgMCwgMCwgMCwgMH0sCi0JezB4OEIsIDAsIDAsIDAsIDB9LAotCXsweDhDLCAwLCAwLCAwLCAwfSwKLQl7MHg4RCwgMCwgMCwgMCwgMH0sCi0JezB4OEUsIDAsIDAsIDAsIDB9LAotCXsweDhGLCAwLCAwLCAwLCAwfSwKLQl7MHg5MCwgMCwgMCwgMCwgMH0sCi0JezB4OTEsIDAsIDAsIDAsIDB9LAotCXsweDkyLCAwLCAwLCAwLCAwfSwKLQl7MHhGRkZGLCAwLCAwLCAwLCAwfQotfTsKLQotc3RydWN0IHJhZGlvX3JlZ3MgcmVnc19SWF8yMDU2W10gPSB7Ci0JezB4MDIsIDAsIDAsIDAsIDB9LAotCXsweDAzLCAwLCAwLCAwLCAwfSwKLQl7MHgwNCwgMCwgMCwgMCwgMH0sCi0JezB4MDUsIDAsIDAsIDAsIDB9LAotCXsweDA2LCAwLCAwLCAwLCAwfSwKLQl7MHgwNywgMCwgMCwgMCwgMH0sCi0JezB4MDgsIDAsIDAsIDAsIDB9LAotCXsweDA5LCAwLCAwLCAwLCAwfSwKLQl7MHgwQSwgMCwgMCwgMCwgMH0sCi0JezB4MEIsIDAsIDAsIDAsIDB9LAotCXsweDBDLCAwLCAwLCAwLCAwfSwKLQl7MHgwRCwgMCwgMCwgMCwgMH0sCi0JezB4MEUsIDAsIDAsIDAsIDB9LAotCXsweDBGLCAwLCAwLCAwLCAwfSwKLQl7MHgxMCwgMCwgMCwgMCwgMH0sCi0JezB4MTEsIDAsIDAsIDAsIDB9LAotCXsweDEyLCAwLCAwLCAwLCAwfSwKLQl7MHgxMywgMCwgMCwgMCwgMH0sCi0JezB4MTQsIDAsIDAsIDAsIDB9LAotCXsweDE1LCAwLCAwLCAwLCAwfSwKLQl7MHgxNiwgMCwgMCwgMCwgMH0sCi0JezB4MTcsIDAsIDAsIDAsIDB9LAotCXsweDE4LCAwLCAwLCAwLCAwfSwKLQl7MHgxOSwgMCwgMCwgMCwgMH0sCi0JezB4MUEsIDAsIDAsIDAsIDB9LAotCXsweDFCLCAwLCAwLCAwLCAwfSwKLQl7MHgxQywgMCwgMCwgMCwgMH0sCi0JezB4MUQsIDAsIDAsIDAsIDB9LAotCXsweDFFLCAwLCAwLCAwLCAwfSwKLQl7MHgxRiwgMCwgMCwgMCwgMH0sCi0JezB4MjAsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHgyMSwgMCwgMCwgMCwgMH0sCi0JezB4MjIsIDAsIDAsIDAsIDB9LAotCXsweDIzLCAweDkwLCAweDkwLCAwLCAwfSwKLQl7MHgyNCwgMHg1NSwgMHg1NSwgMCwgMH0sCi0JezB4MjUsIDB4MTUsIDB4MTUsIDAsIDB9LAotCXsweDI2LCAweDUsIDB4NSwgMCwgMH0sCi0JezB4MjcsIDB4MTUsIDB4MTUsIDAsIDB9LAotCXsweDI4LCAweDUsIDB4NSwgMCwgMH0sCi0JezB4MjksIDB4MjAsIDB4MjAsIDAsIDB9LAotCXsweDJBLCAweDExLCAweDExLCAwLCAwfSwKLQl7MHgyQiwgMHg5MCwgMHg5MCwgMCwgMH0sCi0JezB4MkMsIDAsIDAsIDAsIDB9LAotCXsweDJELCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHgyRSwgMHgzMiwgMHgzMiwgMCwgMH0sCi0JezB4MkYsIDB4NzcsIDB4NzcsIDAsIDB9LAotCXsweDMwLCAweDE3LCAweDE3LCAxLCAxfSwKLQl7MHgzMSwgMHhmZiwgMHhmZiwgMSwgMX0sCi0JezB4MzIsIDB4MjAsIDB4MjAsIDAsIDB9LAotCXsweDMzLCAwLCAwLCAwLCAwfSwKLQl7MHgzNCwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4MzUsIDB4MzIsIDB4MzIsIDAsIDB9LAotCXsweDM2LCAweDc3LCAweDc3LCAwLCAwfSwKLQl7MHgzNywgMHgxNywgMHgxNywgMSwgMX0sCi0JezB4MzgsIDB4ZjAsIDB4ZjAsIDEsIDF9LAotCXsweDM5LCAweDIwLCAweDIwLCAwLCAwfSwKLQl7MHgzQSwgMHg4LCAweDgsIDAsIDB9LAotCXsweDNCLCAweDk5LCAweDk5LCAwLCAwfSwKLQl7MHgzQywgMCwgMCwgMCwgMH0sCi0JezB4M0QsIDB4NDQsIDB4NDQsIDEsIDF9LAotCXsweDNFLCAwLCAwLCAwLCAwfSwKLQl7MHgzRiwgMHg0NCwgMHg0NCwgMCwgMH0sCi0JezB4NDAsIDB4ZiwgMHhmLCAxLCAxfSwKLQl7MHg0MSwgMHg2LCAweDYsIDAsIDB9LAotCXsweDQyLCAweDQsIDB4NCwgMCwgMH0sCi0JezB4NDMsIDB4NTAsIDB4NTAsIDEsIDF9LAotCXsweDQ0LCAweDgsIDB4OCwgMCwgMH0sCi0JezB4NDUsIDB4OTksIDB4OTksIDAsIDB9LAotCXsweDQ2LCAwLCAwLCAwLCAwfSwKLQl7MHg0NywgMHgxMSwgMHgxMSwgMCwgMH0sCi0JezB4NDgsIDAsIDAsIDAsIDB9LAotCXsweDQ5LCAweDQ0LCAweDQ0LCAwLCAwfSwKLQl7MHg0QSwgMHg3LCAweDcsIDAsIDB9LAotCXsweDRCLCAweDYsIDB4NiwgMCwgMH0sCi0JezB4NEMsIDB4NCwgMHg0LCAwLCAwfSwKLQl7MHg0RCwgMCwgMCwgMCwgMH0sCi0JezB4NEUsIDAsIDAsIDAsIDB9LAotCXsweDRGLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHg1MCwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4NTEsIDB4NTcsIDB4NTcsIDAsIDB9LAotCXsweDUyLCAweDU3LCAweDU3LCAwLCAwfSwKLQl7MHg1MywgMHg0NCwgMHg0NCwgMCwgMH0sCi0JezB4NTQsIDAsIDAsIDAsIDB9LAotCXsweDU1LCAwLCAwLCAwLCAwfSwKLQl7MHg1NiwgMHg4LCAweDgsIDAsIDB9LAotCXsweDU3LCAweDgsIDB4OCwgMCwgMH0sCi0JezB4NTgsIDB4NywgMHg3LCAwLCAwfSwKLQl7MHg1OSwgMHgyMiwgMHgyMiwgMCwgMH0sCi0JezB4NUEsIDB4MjIsIDB4MjIsIDAsIDB9LAotCXsweDVCLCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NUMsIDB4MjMsIDB4MjMsIDAsIDB9LAotCXsweDVELCAweDcsIDB4NywgMCwgMH0sCi0JezB4NUUsIDB4NTUsIDB4NTUsIDAsIDB9LAotCXsweDVGLCAweDIzLCAweDIzLCAwLCAwfSwKLQl7MHg2MCwgMHg0MSwgMHg0MSwgMCwgMH0sCi0JezB4NjEsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHg2MiwgMHhhLCAweGEsIDAsIDB9LAotCXsweDYzLCAwLCAwLCAwLCAwfSwKLQl7MHg2NCwgMCwgMCwgMCwgMH0sCi0JezB4NjUsIDAsIDAsIDAsIDB9LAotCXsweDY2LCAwLCAwLCAwLCAwfSwKLQl7MHg2NywgMCwgMCwgMCwgMH0sCi0JezB4NjgsIDAsIDAsIDAsIDB9LAotCXsweDY5LCAwLCAwLCAwLCAwfSwKLQl7MHg2QSwgMCwgMCwgMCwgMH0sCi0JezB4NkIsIDB4YywgMHhjLCAwLCAwfSwKLQl7MHg2QywgMCwgMCwgMCwgMH0sCi0JezB4NkQsIDAsIDAsIDAsIDB9LAotCXsweDZFLCAwLCAwLCAwLCAwfSwKLQl7MHg2RiwgMCwgMCwgMCwgMH0sCi0JezB4NzAsIDAsIDAsIDAsIDB9LAotCXsweDcxLCAwLCAwLCAwLCAwfSwKLQl7MHg3MiwgMHgyMiwgMHgyMiwgMCwgMH0sCi0JezB4NzMsIDB4MjIsIDB4MjIsIDAsIDB9LAotCXsweDc0LCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NzUsIDB4YSwgMHhhLCAwLCAwfSwKLQl7MHg3NiwgMHgxLCAweDEsIDAsIDB9LAotCXsweDc3LCAweDIyLCAweDIyLCAwLCAwfSwKLQl7MHg3OCwgMHgzMCwgMHgzMCwgMCwgMH0sCi0JezB4NzksIDAsIDAsIDAsIDB9LAotCXsweDdBLCAwLCAwLCAwLCAwfSwKLQl7MHg3QiwgMCwgMCwgMCwgMH0sCi0JezB4N0MsIDAsIDAsIDAsIDB9LAotCXsweDdELCAwLCAwLCAwLCAwfSwKLQl7MHg3RSwgMCwgMCwgMCwgMH0sCi0JezB4N0YsIDAsIDAsIDAsIDB9LAotCXsweDgwLCAwLCAwLCAwLCAwfSwKLQl7MHg4MSwgMCwgMCwgMCwgMH0sCi0JezB4ODIsIDAsIDAsIDAsIDB9LAotCXsweDgzLCAwLCAwLCAwLCAwfSwKLQl7MHg4NCwgMCwgMCwgMCwgMH0sCi0JezB4ODUsIDAsIDAsIDAsIDB9LAotCXsweDg2LCAwLCAwLCAwLCAwfSwKLQl7MHg4NywgMCwgMCwgMCwgMH0sCi0JezB4ODgsIDAsIDAsIDAsIDB9LAotCXsweDg5LCAwLCAwLCAwLCAwfSwKLQl7MHg4QSwgMCwgMCwgMCwgMH0sCi0JezB4OEIsIDAsIDAsIDAsIDB9LAotCXsweDhDLCAwLCAwLCAwLCAwfSwKLQl7MHg4RCwgMCwgMCwgMCwgMH0sCi0JezB4OEUsIDAsIDAsIDAsIDB9LAotCXsweDhGLCAwLCAwLCAwLCAwfSwKLQl7MHg5MCwgMCwgMCwgMCwgMH0sCi0JezB4OTEsIDAsIDAsIDAsIDB9LAotCXsweDkyLCAwLCAwLCAwLCAwfSwKLQl7MHg5MywgMCwgMCwgMCwgMH0sCi0JezB4OTQsIDAsIDAsIDAsIDB9LAotCXsweEZGRkYsIDAsIDAsIDAsIDB9Ci19OwotCi1zdHJ1Y3QgcmFkaW9fcmVncyByZWdzX1NZTl8yMDU2X0ExW10gPSB7Ci0JezB4MDIsIDAsIDAsIDAsIDB9LAotCXsweDAzLCAwLCAwLCAwLCAwfSwKLQl7MHgwNCwgMCwgMCwgMCwgMH0sCi0JezB4MDUsIDAsIDAsIDAsIDB9LAotCXsweDA2LCAwLCAwLCAwLCAwfSwKLQl7MHgwNywgMCwgMCwgMCwgMH0sCi0JezB4MDgsIDAsIDAsIDAsIDB9LAotCXsweDA5LCAweDEsIDB4MSwgMCwgMH0sCi0JezB4MEEsIDAsIDAsIDAsIDB9LAotCXsweDBCLCAwLCAwLCAwLCAwfSwKLQl7MHgwQywgMCwgMCwgMCwgMH0sCi0JezB4MEQsIDAsIDAsIDAsIDB9LAotCXsweDBFLCAwLCAwLCAwLCAwfSwKLQl7MHgwRiwgMCwgMCwgMCwgMH0sCi0JezB4MTAsIDAsIDAsIDAsIDB9LAotCXsweDExLCAwLCAwLCAwLCAwfSwKLQl7MHgxMiwgMCwgMCwgMCwgMH0sCi0JezB4MTMsIDAsIDAsIDAsIDB9LAotCXsweDE0LCAwLCAwLCAwLCAwfSwKLQl7MHgxNSwgMCwgMCwgMCwgMH0sCi0JezB4MTYsIDAsIDAsIDAsIDB9LAotCXsweDE3LCAwLCAwLCAwLCAwfSwKLQl7MHgxOCwgMCwgMCwgMCwgMH0sCi0JezB4MTksIDAsIDAsIDAsIDB9LAotCXsweDFBLCAwLCAwLCAwLCAwfSwKLQl7MHgxQiwgMCwgMCwgMCwgMH0sCi0JezB4MUMsIDAsIDAsIDAsIDB9LAotCXsweDFELCAwLCAwLCAwLCAwfSwKLQl7MHgxRSwgMCwgMCwgMCwgMH0sCi0JezB4MUYsIDAsIDAsIDAsIDB9LAotCXsweDIwLCAwLCAwLCAwLCAwfSwKLQl7MHgyMSwgMCwgMCwgMCwgMH0sCi0JezB4MjIsIDB4NjAsIDB4NjAsIDAsIDB9LAotCXsweDIzLCAweDYsIDB4NiwgMCwgMH0sCi0JezB4MjQsIDB4YywgMHhjLCAwLCAwfSwKLQl7MHgyNSwgMCwgMCwgMCwgMH0sCi0JezB4MjYsIDAsIDAsIDAsIDB9LAotCXsweDI3LCAwLCAwLCAwLCAwfSwKLQl7MHgyOCwgMHgxLCAweDEsIDAsIDB9LAotCXsweDI5LCAwLCAwLCAwLCAwfSwKLQl7MHgyQSwgMCwgMCwgMCwgMH0sCi0JezB4MkIsIDAsIDAsIDAsIDB9LAotCXsweDJDLCAwLCAwLCAwLCAwfSwKLQl7MHgyRCwgMCwgMCwgMCwgMH0sCi0JezB4MkUsIDB4ZCwgMHhkLCAwLCAwfSwKLQl7MHgyRiwgMHgxZiwgMHgxZiwgMCwgMH0sCi0JezB4MzAsIDB4MTUsIDB4MTUsIDAsIDB9LAotCXsweDMxLCAweGYsIDB4ZiwgMCwgMH0sCi0JezB4MzIsIDAsIDAsIDAsIDB9LAotCXsweDMzLCAwLCAwLCAwLCAwfSwKLQl7MHgzNCwgMCwgMCwgMCwgMH0sCi0JezB4MzUsIDAsIDAsIDAsIDB9LAotCXsweDM2LCAwLCAwLCAwLCAwfSwKLQl7MHgzNywgMCwgMCwgMCwgMH0sCi0JezB4MzgsIDAsIDAsIDAsIDB9LAotCXsweDM5LCAwLCAwLCAwLCAwfSwKLQl7MHgzQSwgMCwgMCwgMCwgMH0sCi0JezB4M0IsIDAsIDAsIDAsIDB9LAotCXsweDNDLCAweDEzLCAweDEzLCAwLCAwfSwKLQl7MHgzRCwgMHhmLCAweGYsIDAsIDB9LAotCXsweDNFLCAweDE4LCAweDE4LCAwLCAwfSwKLQl7MHgzRiwgMCwgMCwgMCwgMH0sCi0JezB4NDAsIDAsIDAsIDAsIDB9LAotCXsweDQxLCAweDIwLCAweDIwLCAwLCAwfSwKLQl7MHg0MiwgMHgyMCwgMHgyMCwgMCwgMH0sCi0JezB4NDMsIDAsIDAsIDAsIDB9LAotCXsweDQ0LCAweDc3LCAweDc3LCAwLCAwfSwKLQl7MHg0NSwgMHg3LCAweDcsIDAsIDB9LAotCXsweDQ2LCAweDEsIDB4MSwgMCwgMH0sCi0JezB4NDcsIDB4NCwgMHg0LCAwLCAwfSwKLQl7MHg0OCwgMHhmLCAweGYsIDAsIDB9LAotCXsweDQ5LCAweDMwLCAweDMwLCAwLCAwfSwKLQl7MHg0QSwgMHgzMiwgMHgzMiwgMCwgMH0sCi0JezB4NEIsIDB4ZCwgMHhkLCAwLCAwfSwKLQl7MHg0QywgMHhkLCAweGQsIDAsIDB9LAotCXsweDRELCAweDQsIDB4NCwgMCwgMH0sCi0JezB4NEUsIDB4NiwgMHg2LCAwLCAwfSwKLQl7MHg0RiwgMHgxLCAweDEsIDAsIDB9LAotCXsweDUwLCAweDFjLCAweDFjLCAwLCAwfSwKLQl7MHg1MSwgMHgyLCAweDIsIDAsIDB9LAotCXsweDUyLCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NTMsIDB4ZjcsIDB4ZjcsIDEsIDF9LAotCXsweDU0LCAweGI0LCAweGI0LCAwLCAwfSwKLQl7MHg1NSwgMHhkMiwgMHhkMiwgMCwgMH0sCi0JezB4NTYsIDAsIDAsIDAsIDB9LAotCXsweDU3LCAwLCAwLCAwLCAwfSwKLQl7MHg1OCwgMHg0LCAweDQsIDAsIDB9LAotCXsweDU5LCAweDk2LCAweDk2LCAwLCAwfSwKLQl7MHg1QSwgMHgzZSwgMHgzZSwgMCwgMH0sCi0JezB4NUIsIDB4M2UsIDB4M2UsIDAsIDB9LAotCXsweDVDLCAweDEzLCAweDEzLCAwLCAwfSwKLQl7MHg1RCwgMHgyLCAweDIsIDAsIDB9LAotCXsweDVFLCAwLCAwLCAwLCAwfSwKLQl7MHg1RiwgMHg3LCAweDcsIDAsIDB9LAotCXsweDYwLCAweDcsIDB4NywgMSwgMX0sCi0JezB4NjEsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHg2MiwgMHgzLCAweDMsIDAsIDB9LAotCXsweDYzLCAwLCAwLCAwLCAwfSwKLQl7MHg2NCwgMCwgMCwgMCwgMH0sCi0JezB4NjUsIDAsIDAsIDAsIDB9LAotCXsweDY2LCAwLCAwLCAwLCAwfSwKLQl7MHg2NywgMCwgMCwgMCwgMH0sCi0JezB4NjgsIDB4NDAsIDB4NDAsIDAsIDB9LAotCXsweDY5LCAwLCAwLCAwLCAwfSwKLQl7MHg2QSwgMCwgMCwgMCwgMH0sCi0JezB4NkIsIDAsIDAsIDAsIDB9LAotCXsweDZDLCAwLCAwLCAwLCAwfSwKLQl7MHg2RCwgMHgxLCAweDEsIDAsIDB9LAotCXsweDZFLCAwLCAwLCAwLCAwfSwKLQl7MHg2RiwgMCwgMCwgMCwgMH0sCi0JezB4NzAsIDB4NjAsIDB4NjAsIDAsIDB9LAotCXsweDcxLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHg3MiwgMHhjLCAweGMsIDAsIDB9LAotCXsweDczLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHg3NCwgMHg4ZiwgMHg4ZiwgMSwgMX0sCi0JezB4NzUsIDAsIDAsIDAsIDB9LAotCXsweDc2LCAweGNjLCAweGNjLCAwLCAwfSwKLQl7MHg3NywgMHgxLCAweDEsIDAsIDB9LAotCXsweDc4LCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHg3OSwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4N0EsIDAsIDAsIDAsIDB9LAotCXsweDdCLCAwLCAwLCAwLCAwfSwKLQl7MHg3QywgMCwgMCwgMCwgMH0sCi0JezB4N0QsIDAsIDAsIDAsIDB9LAotCXsweDdFLCAwLCAwLCAwLCAwfSwKLQl7MHg3RiwgMCwgMCwgMCwgMH0sCi0JezB4ODAsIDAsIDAsIDAsIDB9LAotCXsweDgxLCAwLCAwLCAwLCAwfSwKLQl7MHg4MiwgMCwgMCwgMCwgMH0sCi0JezB4ODMsIDAsIDAsIDAsIDB9LAotCXsweDg0LCAwLCAwLCAwLCAwfSwKLQl7MHg4NSwgMHhmZiwgMHhmZiwgMCwgMH0sCi0JezB4ODYsIDAsIDAsIDAsIDB9LAotCXsweDg3LCAwLCAwLCAwLCAwfSwKLQl7MHg4OCwgMCwgMCwgMCwgMH0sCi0JezB4ODksIDAsIDAsIDAsIDB9LAotCXsweDhBLCAwLCAwLCAwLCAwfSwKLQl7MHg4QiwgMCwgMCwgMCwgMH0sCi0JezB4OEMsIDAsIDAsIDAsIDB9LAotCXsweDhELCAwLCAwLCAwLCAwfSwKLQl7MHg4RSwgMCwgMCwgMCwgMH0sCi0JezB4OEYsIDAsIDAsIDAsIDB9LAotCXsweDkwLCAwLCAwLCAwLCAwfSwKLQl7MHg5MSwgMCwgMCwgMCwgMH0sCi0JezB4OTIsIDAsIDAsIDAsIDB9LAotCXsweDkzLCAwLCAwLCAwLCAwfSwKLQl7MHg5NCwgMCwgMCwgMCwgMH0sCi0JezB4OTUsIDAsIDAsIDAsIDB9LAotCXsweDk2LCAwLCAwLCAwLCAwfSwKLQl7MHg5NywgMCwgMCwgMCwgMH0sCi0JezB4OTgsIDAsIDAsIDAsIDB9LAotCXsweDk5LCAwLCAwLCAwLCAwfSwKLQl7MHg5QSwgMCwgMCwgMCwgMH0sCi0JezB4OUIsIDAsIDAsIDAsIDB9LAotCXsweDlDLCAwLCAwLCAwLCAwfSwKLQl7MHg5RCwgMCwgMCwgMCwgMH0sCi0JezB4OUUsIDAsIDAsIDAsIDB9LAotCXsweDlGLCAweDYsIDB4NiwgMCwgMH0sCi0JezB4QTAsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEExLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBMiwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QTMsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEE0LCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBNSwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QTYsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEE3LCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBOCwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QTksIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEFBLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBQiwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QUMsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEFELCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBRSwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QUYsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEIwLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhCMSwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QjIsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEIzLCAweGEsIDB4YSwgMCwgMH0sCi0JezB4QjQsIDAsIDAsIDAsIDB9LAotCXsweEI1LCAwLCAwLCAwLCAwfSwKLQl7MHhCNiwgMCwgMCwgMCwgMH0sCi0JezB4RkZGRiwgMCwgMCwgMCwgMH0KLX07Ci0KLXN0cnVjdCByYWRpb19yZWdzIHJlZ3NfVFhfMjA1Nl9BMVtdID0gewotCXsweDAyLCAwLCAwLCAwLCAwfSwKLQl7MHgwMywgMCwgMCwgMCwgMH0sCi0JezB4MDQsIDAsIDAsIDAsIDB9LAotCXsweDA1LCAwLCAwLCAwLCAwfSwKLQl7MHgwNiwgMCwgMCwgMCwgMH0sCi0JezB4MDcsIDAsIDAsIDAsIDB9LAotCXsweDA4LCAwLCAwLCAwLCAwfSwKLQl7MHgwOSwgMCwgMCwgMCwgMH0sCi0JezB4MEEsIDAsIDAsIDAsIDB9LAotCXsweDBCLCAwLCAwLCAwLCAwfSwKLQl7MHgwQywgMCwgMCwgMCwgMH0sCi0JezB4MEQsIDAsIDAsIDAsIDB9LAotCXsweDBFLCAwLCAwLCAwLCAwfSwKLQl7MHgwRiwgMCwgMCwgMCwgMH0sCi0JezB4MTAsIDAsIDAsIDAsIDB9LAotCXsweDExLCAwLCAwLCAwLCAwfSwKLQl7MHgxMiwgMCwgMCwgMCwgMH0sCi0JezB4MTMsIDAsIDAsIDAsIDB9LAotCXsweDE0LCAwLCAwLCAwLCAwfSwKLQl7MHgxNSwgMCwgMCwgMCwgMH0sCi0JezB4MTYsIDAsIDAsIDAsIDB9LAotCXsweDE3LCAwLCAwLCAwLCAwfSwKLQl7MHgxOCwgMCwgMCwgMCwgMH0sCi0JezB4MTksIDAsIDAsIDAsIDB9LAotCXsweDFBLCAwLCAwLCAwLCAwfSwKLQl7MHgxQiwgMCwgMCwgMCwgMH0sCi0JezB4MUMsIDAsIDAsIDAsIDB9LAotCXsweDFELCAwLCAwLCAwLCAwfSwKLQl7MHgxRSwgMCwgMCwgMCwgMH0sCi0JezB4MUYsIDAsIDAsIDAsIDB9LAotCXsweDIwLCAwLCAwLCAwLCAwfSwKLQl7MHgyMSwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4MjIsIDB4ODgsIDB4ODgsIDAsIDB9LAotCXsweDIzLCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHgyNCwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4MjUsIDB4YywgMHhjLCAwLCAwfSwKLQl7MHgyNiwgMCwgMCwgMCwgMH0sCi0JezB4MjcsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHgyOCwgMCwgMCwgMCwgMH0sCi0JezB4MjksIDB4MywgMHgzLCAwLCAwfSwKLQl7MHgyQSwgMHgzNywgMHgzNywgMCwgMH0sCi0JezB4MkIsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHgyQywgMCwgMCwgMCwgMH0sCi0JezB4MkQsIDAsIDAsIDAsIDB9LAotCXsweDJFLCAweDEsIDB4MSwgMCwgMH0sCi0JezB4MkYsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHgzMCwgMCwgMCwgMCwgMH0sCi0JezB4MzEsIDAsIDAsIDAsIDB9LAotCXsweDMyLCAwLCAwLCAwLCAwfSwKLQl7MHgzMywgMHgxMSwgMHgxMSwgMCwgMH0sCi0JezB4MzQsIDB4MTEsIDB4MTEsIDAsIDB9LAotCXsweDM1LCAwLCAwLCAwLCAwfSwKLQl7MHgzNiwgMCwgMCwgMCwgMH0sCi0JezB4MzcsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHgzOCwgMHhmLCAweGYsIDAsIDB9LAotCXsweDM5LCAwLCAwLCAwLCAwfSwKLQl7MHgzQSwgMHgyZCwgMHgyZCwgMCwgMH0sCi0JezB4M0IsIDAsIDAsIDAsIDB9LAotCXsweDNDLCAweDZlLCAweDZlLCAwLCAwfSwKLQl7MHgzRCwgMHhmMCwgMHhmMCwgMSwgMX0sCi0JezB4M0UsIDAsIDAsIDAsIDB9LAotCXsweDNGLCAwLCAwLCAwLCAwfSwKLQl7MHg0MCwgMCwgMCwgMCwgMH0sCi0JezB4NDEsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHg0MiwgMHgzLCAweDMsIDAsIDB9LAotCXsweDQzLCAwLCAwLCAwLCAwfSwKLQl7MHg0NCwgMHgxZSwgMHgxZSwgMCwgMH0sCi0JezB4NDUsIDAsIDAsIDAsIDB9LAotCXsweDQ2LCAweDZlLCAweDZlLCAwLCAwfSwKLQl7MHg0NywgMHhmMCwgMHhmMCwgMSwgMX0sCi0JezB4NDgsIDAsIDAsIDAsIDB9LAotCXsweDQ5LCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NEEsIDB4ZmYsIDB4ZmYsIDEsIDF9LAotCXsweDRCLCAweGMsIDB4YywgMCwgMH0sCi0JezB4NEMsIDAsIDAsIDAsIDB9LAotCXsweDRELCAweDM4LCAweDM4LCAwLCAwfSwKLQl7MHg0RSwgMHg3MCwgMHg3MCwgMSwgMX0sCi0JezB4NEYsIDB4MiwgMHgyLCAwLCAwfSwKLQl7MHg1MCwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4NTEsIDB4YywgMHhjLCAwLCAwfSwKLQl7MHg1MiwgMCwgMCwgMCwgMH0sCi0JezB4NTMsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHg1NCwgMHg3MCwgMHg3MCwgMSwgMX0sCi0JezB4NTUsIDB4MiwgMHgyLCAwLCAwfSwKLQl7MHg1NiwgMHhmZiwgMHhmZiwgMSwgMX0sCi0JezB4NTcsIDAsIDAsIDAsIDB9LAotCXsweDU4LCAweDgzLCAweDgzLCAwLCAwfSwKLQl7MHg1OSwgMHg3NywgMHg3NywgMSwgMX0sCi0JezB4NUEsIDAsIDAsIDAsIDB9LAotCXsweDVCLCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NUMsIDB4ODgsIDB4ODgsIDAsIDB9LAotCXsweDVELCAwLCAwLCAwLCAwfSwKLQl7MHg1RSwgMHg4LCAweDgsIDAsIDB9LAotCXsweDVGLCAweDc3LCAweDc3LCAxLCAxfSwKLQl7MHg2MCwgMHgxLCAweDEsIDAsIDB9LAotCXsweDYxLCAwLCAwLCAwLCAwfSwKLQl7MHg2MiwgMHg3LCAweDcsIDAsIDB9LAotCXsweDYzLCAwLCAwLCAwLCAwfSwKLQl7MHg2NCwgMHg3LCAweDcsIDAsIDB9LAotCXsweDY1LCAwLCAwLCAwLCAwfSwKLQl7MHg2NiwgMCwgMCwgMCwgMH0sCi0JezB4NjcsIDB4NzIsIDB4NzIsIDEsIDF9LAotCXsweDY4LCAwLCAwLCAwLCAwfSwKLQl7MHg2OSwgMHhhLCAweGEsIDAsIDB9LAotCXsweDZBLCAwLCAwLCAwLCAwfSwKLQl7MHg2QiwgMCwgMCwgMCwgMH0sCi0JezB4NkMsIDAsIDAsIDAsIDB9LAotCXsweDZELCAwLCAwLCAwLCAwfSwKLQl7MHg2RSwgMCwgMCwgMCwgMH0sCi0JezB4NkYsIDAsIDAsIDAsIDB9LAotCXsweDcwLCAwLCAwLCAwLCAwfSwKLQl7MHg3MSwgMHgyLCAweDIsIDAsIDB9LAotCXsweDcyLCAwLCAwLCAwLCAwfSwKLQl7MHg3MywgMCwgMCwgMCwgMH0sCi0JezB4NzQsIDB4ZSwgMHhlLCAwLCAwfSwKLQl7MHg3NSwgMHhlLCAweGUsIDAsIDB9LAotCXsweDc2LCAweGUsIDB4ZSwgMCwgMH0sCi0JezB4NzcsIDB4MTMsIDB4MTMsIDAsIDB9LAotCXsweDc4LCAweDEzLCAweDEzLCAwLCAwfSwKLQl7MHg3OSwgMHgxYiwgMHgxYiwgMCwgMH0sCi0JezB4N0EsIDB4MWIsIDB4MWIsIDAsIDB9LAotCXsweDdCLCAweDU1LCAweDU1LCAwLCAwfSwKLQl7MHg3QywgMHg1YiwgMHg1YiwgMCwgMH0sCi0JezB4N0QsIDAsIDAsIDAsIDB9LAotCXsweDdFLCAwLCAwLCAwLCAwfSwKLQl7MHg3RiwgMCwgMCwgMCwgMH0sCi0JezB4ODAsIDAsIDAsIDAsIDB9LAotCXsweDgxLCAwLCAwLCAwLCAwfSwKLQl7MHg4MiwgMCwgMCwgMCwgMH0sCi0JezB4ODMsIDAsIDAsIDAsIDB9LAotCXsweDg0LCAwLCAwLCAwLCAwfSwKLQl7MHg4NSwgMCwgMCwgMCwgMH0sCi0JezB4ODYsIDAsIDAsIDAsIDB9LAotCXsweDg3LCAwLCAwLCAwLCAwfSwKLQl7MHg4OCwgMCwgMCwgMCwgMH0sCi0JezB4ODksIDAsIDAsIDAsIDB9LAotCXsweDhBLCAwLCAwLCAwLCAwfSwKLQl7MHg4QiwgMCwgMCwgMCwgMH0sCi0JezB4OEMsIDAsIDAsIDAsIDB9LAotCXsweDhELCAwLCAwLCAwLCAwfSwKLQl7MHg4RSwgMCwgMCwgMCwgMH0sCi0JezB4OEYsIDAsIDAsIDAsIDB9LAotCXsweDkwLCAwLCAwLCAwLCAwfSwKLQl7MHg5MSwgMCwgMCwgMCwgMH0sCi0JezB4OTIsIDAsIDAsIDAsIDB9LAotCXsweEZGRkYsIDAsIDAsIDAsIDB9Ci19OwotCi1zdHJ1Y3QgcmFkaW9fcmVncyByZWdzX1JYXzIwNTZfQTFbXSA9IHsKLQl7MHgwMiwgMCwgMCwgMCwgMH0sCi0JezB4MDMsIDAsIDAsIDAsIDB9LAotCXsweDA0LCAwLCAwLCAwLCAwfSwKLQl7MHgwNSwgMCwgMCwgMCwgMH0sCi0JezB4MDYsIDAsIDAsIDAsIDB9LAotCXsweDA3LCAwLCAwLCAwLCAwfSwKLQl7MHgwOCwgMCwgMCwgMCwgMH0sCi0JezB4MDksIDAsIDAsIDAsIDB9LAotCXsweDBBLCAwLCAwLCAwLCAwfSwKLQl7MHgwQiwgMCwgMCwgMCwgMH0sCi0JezB4MEMsIDAsIDAsIDAsIDB9LAotCXsweDBELCAwLCAwLCAwLCAwfSwKLQl7MHgwRSwgMCwgMCwgMCwgMH0sCi0JezB4MEYsIDAsIDAsIDAsIDB9LAotCXsweDEwLCAwLCAwLCAwLCAwfSwKLQl7MHgxMSwgMCwgMCwgMCwgMH0sCi0JezB4MTIsIDAsIDAsIDAsIDB9LAotCXsweDEzLCAwLCAwLCAwLCAwfSwKLQl7MHgxNCwgMCwgMCwgMCwgMH0sCi0JezB4MTUsIDAsIDAsIDAsIDB9LAotCXsweDE2LCAwLCAwLCAwLCAwfSwKLQl7MHgxNywgMCwgMCwgMCwgMH0sCi0JezB4MTgsIDAsIDAsIDAsIDB9LAotCXsweDE5LCAwLCAwLCAwLCAwfSwKLQl7MHgxQSwgMCwgMCwgMCwgMH0sCi0JezB4MUIsIDAsIDAsIDAsIDB9LAotCXsweDFDLCAwLCAwLCAwLCAwfSwKLQl7MHgxRCwgMCwgMCwgMCwgMH0sCi0JezB4MUUsIDAsIDAsIDAsIDB9LAotCXsweDFGLCAwLCAwLCAwLCAwfSwKLQl7MHgyMCwgMHgzLCAweDMsIDAsIDB9LAotCXsweDIxLCAwLCAwLCAwLCAwfSwKLQl7MHgyMiwgMCwgMCwgMCwgMH0sCi0JezB4MjMsIDB4OTAsIDB4OTAsIDAsIDB9LAotCXsweDI0LCAweDU1LCAweDU1LCAwLCAwfSwKLQl7MHgyNSwgMHgxNSwgMHgxNSwgMCwgMH0sCi0JezB4MjYsIDB4NSwgMHg1LCAwLCAwfSwKLQl7MHgyNywgMHgxNSwgMHgxNSwgMCwgMH0sCi0JezB4MjgsIDB4NSwgMHg1LCAwLCAwfSwKLQl7MHgyOSwgMHgyMCwgMHgyMCwgMCwgMH0sCi0JezB4MkEsIDB4MTEsIDB4MTEsIDAsIDB9LAotCXsweDJCLCAweDkwLCAweDkwLCAwLCAwfSwKLQl7MHgyQywgMCwgMCwgMCwgMH0sCi0JezB4MkQsIDB4ODgsIDB4ODgsIDAsIDB9LAotCXsweDJFLCAweDMyLCAweDMyLCAwLCAwfSwKLQl7MHgyRiwgMHg3NywgMHg3NywgMCwgMH0sCi0JezB4MzAsIDB4MTcsIDB4MTcsIDEsIDF9LAotCXsweDMxLCAweGZmLCAweGZmLCAxLCAxfSwKLQl7MHgzMiwgMHgyMCwgMHgyMCwgMCwgMH0sCi0JezB4MzMsIDAsIDAsIDAsIDB9LAotCXsweDM0LCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHgzNSwgMHgzMiwgMHgzMiwgMCwgMH0sCi0JezB4MzYsIDB4NzcsIDB4NzcsIDAsIDB9LAotCXsweDM3LCAweDE3LCAweDE3LCAxLCAxfSwKLQl7MHgzOCwgMHhmMCwgMHhmMCwgMSwgMX0sCi0JezB4MzksIDB4MjAsIDB4MjAsIDAsIDB9LAotCXsweDNBLCAweDgsIDB4OCwgMCwgMH0sCi0JezB4M0IsIDB4NTUsIDB4NTUsIDEsIDF9LAotCXsweDNDLCAwLCAwLCAwLCAwfSwKLQl7MHgzRCwgMHg0NCwgMHg0NCwgMSwgMX0sCi0JezB4M0UsIDAsIDAsIDAsIDB9LAotCXsweDNGLCAweDQ0LCAweDQ0LCAwLCAwfSwKLQl7MHg0MCwgMHhmLCAweGYsIDEsIDF9LAotCXsweDQxLCAweDYsIDB4NiwgMCwgMH0sCi0JezB4NDIsIDB4NCwgMHg0LCAwLCAwfSwKLQl7MHg0MywgMHg1MCwgMHg1MCwgMSwgMX0sCi0JezB4NDQsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHg0NSwgMHg1NSwgMHg1NSwgMSwgMX0sCi0JezB4NDYsIDAsIDAsIDAsIDB9LAotCXsweDQ3LCAweDExLCAweDExLCAwLCAwfSwKLQl7MHg0OCwgMCwgMCwgMCwgMH0sCi0JezB4NDksIDB4NDQsIDB4NDQsIDAsIDB9LAotCXsweDRBLCAweDcsIDB4NywgMCwgMH0sCi0JezB4NEIsIDB4NiwgMHg2LCAwLCAwfSwKLQl7MHg0QywgMHg0LCAweDQsIDAsIDB9LAotCXsweDRELCAwLCAwLCAwLCAwfSwKLQl7MHg0RSwgMCwgMCwgMCwgMH0sCi0JezB4NEYsIDB4MjYsIDB4MjYsIDEsIDF9LAotCXsweDUwLCAweDI2LCAweDI2LCAxLCAxfSwKLQl7MHg1MSwgMHhmLCAweGYsIDEsIDF9LAotCXsweDUyLCAweGYsIDB4ZiwgMSwgMX0sCi0JezB4NTMsIDB4NDQsIDB4NDQsIDAsIDB9LAotCXsweDU0LCAwLCAwLCAwLCAwfSwKLQl7MHg1NSwgMCwgMCwgMCwgMH0sCi0JezB4NTYsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHg1NywgMHg4LCAweDgsIDAsIDB9LAotCXsweDU4LCAweDcsIDB4NywgMCwgMH0sCi0JezB4NTksIDB4MjIsIDB4MjIsIDAsIDB9LAotCXsweDVBLCAweDIyLCAweDIyLCAwLCAwfSwKLQl7MHg1QiwgMHgyLCAweDIsIDAsIDB9LAotCXsweDVDLCAweDJmLCAweDJmLCAxLCAxfSwKLQl7MHg1RCwgMHg3LCAweDcsIDAsIDB9LAotCXsweDVFLCAweDU1LCAweDU1LCAwLCAwfSwKLQl7MHg1RiwgMHgyMywgMHgyMywgMCwgMH0sCi0JezB4NjAsIDB4NDEsIDB4NDEsIDAsIDB9LAotCXsweDYxLCAweDEsIDB4MSwgMCwgMH0sCi0JezB4NjIsIDB4YSwgMHhhLCAwLCAwfSwKLQl7MHg2MywgMCwgMCwgMCwgMH0sCi0JezB4NjQsIDAsIDAsIDAsIDB9LAotCXsweDY1LCAwLCAwLCAwLCAwfSwKLQl7MHg2NiwgMCwgMCwgMCwgMH0sCi0JezB4NjcsIDAsIDAsIDAsIDB9LAotCXsweDY4LCAwLCAwLCAwLCAwfSwKLQl7MHg2OSwgMCwgMCwgMCwgMH0sCi0JezB4NkEsIDAsIDAsIDAsIDB9LAotCXsweDZCLCAweGMsIDB4YywgMCwgMH0sCi0JezB4NkMsIDAsIDAsIDAsIDB9LAotCXsweDZELCAwLCAwLCAwLCAwfSwKLQl7MHg2RSwgMCwgMCwgMCwgMH0sCi0JezB4NkYsIDAsIDAsIDAsIDB9LAotCXsweDcwLCAwLCAwLCAwLCAwfSwKLQl7MHg3MSwgMCwgMCwgMCwgMH0sCi0JezB4NzIsIDB4MjIsIDB4MjIsIDAsIDB9LAotCXsweDczLCAweDIyLCAweDIyLCAwLCAwfSwKLQl7MHg3NCwgMCwgMCwgMSwgMX0sCi0JezB4NzUsIDB4YSwgMHhhLCAwLCAwfSwKLQl7MHg3NiwgMHgxLCAweDEsIDAsIDB9LAotCXsweDc3LCAweDIyLCAweDIyLCAwLCAwfSwKLQl7MHg3OCwgMHgzMCwgMHgzMCwgMCwgMH0sCi0JezB4NzksIDAsIDAsIDAsIDB9LAotCXsweDdBLCAwLCAwLCAwLCAwfSwKLQl7MHg3QiwgMCwgMCwgMCwgMH0sCi0JezB4N0MsIDAsIDAsIDAsIDB9LAotCXsweDdELCAwLCAwLCAwLCAwfSwKLQl7MHg3RSwgMCwgMCwgMCwgMH0sCi0JezB4N0YsIDAsIDAsIDAsIDB9LAotCXsweDgwLCAwLCAwLCAwLCAwfSwKLQl7MHg4MSwgMCwgMCwgMCwgMH0sCi0JezB4ODIsIDAsIDAsIDAsIDB9LAotCXsweDgzLCAwLCAwLCAwLCAwfSwKLQl7MHg4NCwgMCwgMCwgMCwgMH0sCi0JezB4ODUsIDAsIDAsIDAsIDB9LAotCXsweDg2LCAwLCAwLCAwLCAwfSwKLQl7MHg4NywgMCwgMCwgMCwgMH0sCi0JezB4ODgsIDAsIDAsIDAsIDB9LAotCXsweDg5LCAwLCAwLCAwLCAwfSwKLQl7MHg4QSwgMCwgMCwgMCwgMH0sCi0JezB4OEIsIDAsIDAsIDAsIDB9LAotCXsweDhDLCAwLCAwLCAwLCAwfSwKLQl7MHg4RCwgMCwgMCwgMCwgMH0sCi0JezB4OEUsIDAsIDAsIDAsIDB9LAotCXsweDhGLCAwLCAwLCAwLCAwfSwKLQl7MHg5MCwgMCwgMCwgMCwgMH0sCi0JezB4OTEsIDAsIDAsIDAsIDB9LAotCXsweDkyLCAwLCAwLCAwLCAwfSwKLQl7MHg5MywgMCwgMCwgMCwgMH0sCi0JezB4OTQsIDAsIDAsIDAsIDB9LAotCXsweEZGRkYsIDAsIDAsIDAsIDB9Ci19OwotCi1zdHJ1Y3QgcmFkaW9fcmVncyByZWdzX1NZTl8yMDU2X3JldjVbXSA9IHsKLQl7MHgwMiwgMCwgMCwgMCwgMH0sCi0JezB4MDMsIDAsIDAsIDAsIDB9LAotCXsweDA0LCAwLCAwLCAwLCAwfSwKLQl7MHgwNSwgMCwgMCwgMCwgMH0sCi0JezB4MDYsIDAsIDAsIDAsIDB9LAotCXsweDA3LCAwLCAwLCAwLCAwfSwKLQl7MHgwOCwgMCwgMCwgMCwgMH0sCi0JezB4MDksIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHgwQSwgMCwgMCwgMCwgMH0sCi0JezB4MEIsIDAsIDAsIDAsIDB9LAotCXsweDBDLCAwLCAwLCAwLCAwfSwKLQl7MHgwRCwgMCwgMCwgMCwgMH0sCi0JezB4MEUsIDAsIDAsIDAsIDB9LAotCXsweDBGLCAwLCAwLCAwLCAwfSwKLQl7MHgxMCwgMCwgMCwgMCwgMH0sCi0JezB4MTEsIDAsIDAsIDAsIDB9LAotCXsweDEyLCAwLCAwLCAwLCAwfSwKLQl7MHgxMywgMCwgMCwgMCwgMH0sCi0JezB4MTQsIDAsIDAsIDAsIDB9LAotCXsweDE1LCAwLCAwLCAwLCAwfSwKLQl7MHgxNiwgMCwgMCwgMCwgMH0sCi0JezB4MTcsIDAsIDAsIDAsIDB9LAotCXsweDE4LCAwLCAwLCAwLCAwfSwKLQl7MHgxOSwgMCwgMCwgMCwgMH0sCi0JezB4MUEsIDAsIDAsIDAsIDB9LAotCXsweDFCLCAwLCAwLCAwLCAwfSwKLQl7MHgxQywgMCwgMCwgMCwgMH0sCi0JezB4MUQsIDAsIDAsIDAsIDB9LAotCXsweDFFLCAwLCAwLCAwLCAwfSwKLQl7MHgxRiwgMCwgMCwgMCwgMH0sCi0JezB4MjAsIDAsIDAsIDAsIDB9LAotCXsweDIxLCAwLCAwLCAwLCAwfSwKLQl7MHgyMiwgMHg2MCwgMHg2MCwgMCwgMH0sCi0JezB4MjMsIDB4NiwgMHg2LCAwLCAwfSwKLQl7MHgyNCwgMHhjLCAweGMsIDAsIDB9LAotCXsweDI1LCAwLCAwLCAwLCAwfSwKLQl7MHgyNiwgMCwgMCwgMCwgMH0sCi0JezB4MjcsIDAsIDAsIDAsIDB9LAotCXsweDI4LCAweDEsIDB4MSwgMCwgMH0sCi0JezB4MjksIDAsIDAsIDAsIDB9LAotCXsweDJBLCAwLCAwLCAwLCAwfSwKLQl7MHgyQiwgMCwgMCwgMCwgMH0sCi0JezB4MkMsIDAsIDAsIDAsIDB9LAotCXsweDJELCAwLCAwLCAwLCAwfSwKLQl7MHgyRSwgMCwgMCwgMCwgMH0sCi0JezB4MkYsIDB4MWYsIDB4MWYsIDAsIDB9LAotCXsweDMwLCAweDE1LCAweDE1LCAwLCAwfSwKLQl7MHgzMSwgMHhmLCAweGYsIDAsIDB9LAotCXsweDMyLCAwLCAwLCAwLCAwfSwKLQl7MHgzMywgMCwgMCwgMCwgMH0sCi0JezB4MzQsIDAsIDAsIDAsIDB9LAotCXsweDM1LCAwLCAwLCAwLCAwfSwKLQl7MHgzNiwgMCwgMCwgMCwgMH0sCi0JezB4MzcsIDAsIDAsIDAsIDB9LAotCXsweDM4LCAwLCAwLCAwLCAwfSwKLQl7MHgzOSwgMCwgMCwgMCwgMH0sCi0JezB4M0EsIDAsIDAsIDAsIDB9LAotCXsweDNCLCAwLCAwLCAwLCAwfSwKLQl7MHgzQywgMHgxMywgMHgxMywgMCwgMH0sCi0JezB4M0QsIDB4ZiwgMHhmLCAwLCAwfSwKLQl7MHgzRSwgMHgxOCwgMHgxOCwgMCwgMH0sCi0JezB4M0YsIDAsIDAsIDAsIDB9LAotCXsweDQwLCAwLCAwLCAwLCAwfSwKLQl7MHg0MSwgMHgyMCwgMHgyMCwgMCwgMH0sCi0JezB4NDIsIDB4MjAsIDB4MjAsIDAsIDB9LAotCXsweDQzLCAwLCAwLCAwLCAwfSwKLQl7MHg0NCwgMHg3NywgMHg3NywgMCwgMH0sCi0JezB4NDUsIDB4NywgMHg3LCAwLCAwfSwKLQl7MHg0NiwgMHgxLCAweDEsIDAsIDB9LAotCXsweDQ3LCAweDQsIDB4NCwgMCwgMH0sCi0JezB4NDgsIDB4ZiwgMHhmLCAwLCAwfSwKLQl7MHg0OSwgMHgzMCwgMHgzMCwgMCwgMH0sCi0JezB4NEEsIDB4MzIsIDB4MzIsIDAsIDB9LAotCXsweDRCLCAweGQsIDB4ZCwgMCwgMH0sCi0JezB4NEMsIDB4ZCwgMHhkLCAwLCAwfSwKLQl7MHg0RCwgMHg0LCAweDQsIDAsIDB9LAotCXsweDRFLCAweDYsIDB4NiwgMCwgMH0sCi0JezB4NEYsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHg1MCwgMHgxYywgMHgxYywgMCwgMH0sCi0JezB4NTEsIDB4MiwgMHgyLCAwLCAwfSwKLQl7MHg1MiwgMHgyLCAweDIsIDAsIDB9LAotCXsweDUzLCAweGY3LCAweGY3LCAxLCAxfSwKLQl7MHg1NCwgMHhiNCwgMHhiNCwgMCwgMH0sCi0JezB4NTUsIDB4ZDIsIDB4ZDIsIDAsIDB9LAotCXsweDU2LCAwLCAwLCAwLCAwfSwKLQl7MHg1NywgMCwgMCwgMCwgMH0sCi0JezB4NTgsIDB4NCwgMHg0LCAwLCAwfSwKLQl7MHg1OSwgMHg5NiwgMHg5NiwgMCwgMH0sCi0JezB4NUEsIDB4M2UsIDB4M2UsIDAsIDB9LAotCXsweDVCLCAweDNlLCAweDNlLCAwLCAwfSwKLQl7MHg1QywgMHgxMywgMHgxMywgMCwgMH0sCi0JezB4NUQsIDB4MiwgMHgyLCAwLCAwfSwKLQl7MHg1RSwgMCwgMCwgMCwgMH0sCi0JezB4NUYsIDB4NywgMHg3LCAwLCAwfSwKLQl7MHg2MCwgMHg3LCAweDcsIDEsIDF9LAotCXsweDYxLCAweDgsIDB4OCwgMCwgMH0sCi0JezB4NjIsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHg2MywgMCwgMCwgMCwgMH0sCi0JezB4NjQsIDAsIDAsIDAsIDB9LAotCXsweDY1LCAwLCAwLCAwLCAwfSwKLQl7MHg2NiwgMCwgMCwgMCwgMH0sCi0JezB4NjcsIDAsIDAsIDAsIDB9LAotCXsweDY4LCAweDQwLCAweDQwLCAwLCAwfSwKLQl7MHg2OSwgMCwgMCwgMCwgMH0sCi0JezB4NkEsIDAsIDAsIDAsIDB9LAotCXsweDZCLCAwLCAwLCAwLCAwfSwKLQl7MHg2QywgMCwgMCwgMCwgMH0sCi0JezB4NkQsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHg2RSwgMCwgMCwgMCwgMH0sCi0JezB4NkYsIDAsIDAsIDAsIDB9LAotCXsweDcwLCAweDYwLCAweDYwLCAwLCAwfSwKLQl7MHg3MSwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4NzIsIDB4YywgMHhjLCAwLCAwfSwKLQl7MHg3MywgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4NzQsIDB4OGYsIDB4OGYsIDEsIDF9LAotCXsweDc1LCAwLCAwLCAwLCAwfSwKLQl7MHg3NiwgMHhjYywgMHhjYywgMCwgMH0sCi0JezB4NzcsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHg3OCwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4NzksIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweDdBLCAwLCAwLCAwLCAwfSwKLQl7MHg3QiwgMCwgMCwgMCwgMH0sCi0JezB4N0MsIDAsIDAsIDAsIDB9LAotCXsweDdELCAwLCAwLCAwLCAwfSwKLQl7MHg3RSwgMCwgMCwgMCwgMH0sCi0JezB4N0YsIDAsIDAsIDAsIDB9LAotCXsweDgwLCAwLCAwLCAwLCAwfSwKLQl7MHg4MSwgMCwgMCwgMCwgMH0sCi0JezB4ODIsIDAsIDAsIDAsIDB9LAotCXsweDgzLCAwLCAwLCAwLCAwfSwKLQl7MHg4NCwgMCwgMCwgMCwgMH0sCi0JezB4ODUsIDB4ZmYsIDB4ZmYsIDAsIDB9LAotCXsweDg2LCAwLCAwLCAwLCAwfSwKLQl7MHg4NywgMCwgMCwgMCwgMH0sCi0JezB4ODgsIDAsIDAsIDAsIDB9LAotCXsweDg5LCAwLCAwLCAwLCAwfSwKLQl7MHg4QSwgMCwgMCwgMCwgMH0sCi0JezB4OEIsIDAsIDAsIDAsIDB9LAotCXsweDhDLCAwLCAwLCAwLCAwfSwKLQl7MHg4RCwgMCwgMCwgMCwgMH0sCi0JezB4OEUsIDAsIDAsIDAsIDB9LAotCXsweDhGLCAwLCAwLCAwLCAwfSwKLQl7MHg5MCwgMCwgMCwgMCwgMH0sCi0JezB4OTEsIDAsIDAsIDAsIDB9LAotCXsweDkyLCAwLCAwLCAwLCAwfSwKLQl7MHg5MywgMCwgMCwgMCwgMH0sCi0JezB4OTQsIDAsIDAsIDAsIDB9LAotCXsweDk1LCAwLCAwLCAwLCAwfSwKLQl7MHg5NiwgMCwgMCwgMCwgMH0sCi0JezB4OTcsIDAsIDAsIDAsIDB9LAotCXsweDk4LCAwLCAwLCAwLCAwfSwKLQl7MHg5OSwgMCwgMCwgMCwgMH0sCi0JezB4OUEsIDAsIDAsIDAsIDB9LAotCXsweDlCLCAwLCAwLCAwLCAwfSwKLQl7MHg5QywgMCwgMCwgMCwgMH0sCi0JezB4OUQsIDAsIDAsIDAsIDB9LAotCXsweDlFLCAwLCAwLCAwLCAwfSwKLQl7MHg5RiwgMHg2LCAweDYsIDAsIDB9LAotCXsweEEwLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBMSwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QTIsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEEzLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBNCwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QTUsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEE2LCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBNywgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QTgsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEE5LCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBQSwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QUIsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEFDLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBRCwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QUUsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEFGLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhCMCwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QjEsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEIyLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhCMywgMHhhLCAweGEsIDAsIDB9LAotCXsweEI0LCAwLCAwLCAwLCAwfSwKLQl7MHhCNSwgMCwgMCwgMCwgMH0sCi0JezB4QjYsIDAsIDAsIDAsIDB9LAotCXsweEZGRkYsIDAsIDAsIDAsIDB9Ci19OwotCi1zdHJ1Y3QgcmFkaW9fcmVncyByZWdzX1RYXzIwNTZfcmV2NVtdID0gewotCXsweDAyLCAwLCAwLCAwLCAwfSwKLQl7MHgwMywgMCwgMCwgMCwgMH0sCi0JezB4MDQsIDAsIDAsIDAsIDB9LAotCXsweDA1LCAwLCAwLCAwLCAwfSwKLQl7MHgwNiwgMCwgMCwgMCwgMH0sCi0JezB4MDcsIDAsIDAsIDAsIDB9LAotCXsweDA4LCAwLCAwLCAwLCAwfSwKLQl7MHgwOSwgMCwgMCwgMCwgMH0sCi0JezB4MEEsIDAsIDAsIDAsIDB9LAotCXsweDBCLCAwLCAwLCAwLCAwfSwKLQl7MHgwQywgMCwgMCwgMCwgMH0sCi0JezB4MEQsIDAsIDAsIDAsIDB9LAotCXsweDBFLCAwLCAwLCAwLCAwfSwKLQl7MHgwRiwgMCwgMCwgMCwgMH0sCi0JezB4MTAsIDAsIDAsIDAsIDB9LAotCXsweDExLCAwLCAwLCAwLCAwfSwKLQl7MHgxMiwgMCwgMCwgMCwgMH0sCi0JezB4MTMsIDAsIDAsIDAsIDB9LAotCXsweDE0LCAwLCAwLCAwLCAwfSwKLQl7MHgxNSwgMCwgMCwgMCwgMH0sCi0JezB4MTYsIDAsIDAsIDAsIDB9LAotCXsweDE3LCAwLCAwLCAwLCAwfSwKLQl7MHgxOCwgMCwgMCwgMCwgMH0sCi0JezB4MTksIDAsIDAsIDAsIDB9LAotCXsweDFBLCAwLCAwLCAwLCAwfSwKLQl7MHgxQiwgMCwgMCwgMCwgMH0sCi0JezB4MUMsIDAsIDAsIDAsIDB9LAotCXsweDFELCAwLCAwLCAwLCAwfSwKLQl7MHgxRSwgMCwgMCwgMCwgMH0sCi0JezB4MUYsIDAsIDAsIDAsIDB9LAotCXsweDIwLCAwLCAwLCAwLCAwfSwKLQl7MHgyMSwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4MjIsIDB4ODgsIDB4ODgsIDAsIDB9LAotCXsweDIzLCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHgyNCwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4MjUsIDB4YywgMHhjLCAwLCAwfSwKLQl7MHgyNiwgMCwgMCwgMCwgMH0sCi0JezB4MjcsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHgyOCwgMCwgMCwgMCwgMH0sCi0JezB4MjksIDB4MywgMHgzLCAwLCAwfSwKLQl7MHgyQSwgMHgzNywgMHgzNywgMCwgMH0sCi0JezB4MkIsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHgyQywgMCwgMCwgMCwgMH0sCi0JezB4MkQsIDAsIDAsIDAsIDB9LAotCXsweDJFLCAweDEsIDB4MSwgMCwgMH0sCi0JezB4MkYsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHgzMCwgMCwgMCwgMCwgMH0sCi0JezB4MzEsIDAsIDAsIDAsIDB9LAotCXsweDMyLCAwLCAwLCAwLCAwfSwKLQl7MHgzMywgMHgxMSwgMHgxMSwgMCwgMH0sCi0JezB4MzQsIDB4MTEsIDB4MTEsIDAsIDB9LAotCXsweDM1LCAwLCAwLCAwLCAwfSwKLQl7MHgzNiwgMCwgMCwgMCwgMH0sCi0JezB4MzcsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHgzOCwgMHhmLCAweGYsIDAsIDB9LAotCXsweDM5LCAwLCAwLCAwLCAwfSwKLQl7MHgzQSwgMHgyZCwgMHgyZCwgMCwgMH0sCi0JezB4M0IsIDAsIDAsIDAsIDB9LAotCXsweDNDLCAweDZlLCAweDZlLCAwLCAwfSwKLQl7MHgzRCwgMHhmMCwgMHhmMCwgMSwgMX0sCi0JezB4M0UsIDAsIDAsIDAsIDB9LAotCXsweDNGLCAwLCAwLCAwLCAwfSwKLQl7MHg0MCwgMCwgMCwgMCwgMH0sCi0JezB4NDEsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHg0MiwgMHgzLCAweDMsIDAsIDB9LAotCXsweDQzLCAwLCAwLCAwLCAwfSwKLQl7MHg0NCwgMHgxZSwgMHgxZSwgMCwgMH0sCi0JezB4NDUsIDAsIDAsIDAsIDB9LAotCXsweDQ2LCAweDZlLCAweDZlLCAwLCAwfSwKLQl7MHg0NywgMHhmMCwgMHhmMCwgMSwgMX0sCi0JezB4NDgsIDAsIDAsIDAsIDB9LAotCXsweDQ5LCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NEEsIDB4ZmYsIDB4ZmYsIDEsIDF9LAotCXsweDRCLCAweGMsIDB4YywgMCwgMH0sCi0JezB4NEMsIDAsIDAsIDAsIDB9LAotCXsweDRELCAweDM4LCAweDM4LCAwLCAwfSwKLQl7MHg0RSwgMHg3MCwgMHg3MCwgMSwgMX0sCi0JezB4NEYsIDB4MiwgMHgyLCAwLCAwfSwKLQl7MHg1MCwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4NTEsIDB4YywgMHhjLCAwLCAwfSwKLQl7MHg1MiwgMCwgMCwgMCwgMH0sCi0JezB4NTMsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHg1NCwgMHg3MCwgMHg3MCwgMSwgMX0sCi0JezB4NTUsIDB4MiwgMHgyLCAwLCAwfSwKLQl7MHg1NiwgMHhmZiwgMHhmZiwgMSwgMX0sCi0JezB4NTcsIDAsIDAsIDAsIDB9LAotCXsweDU4LCAweDgzLCAweDgzLCAwLCAwfSwKLQl7MHg1OSwgMHg3NywgMHg3NywgMSwgMX0sCi0JezB4NUEsIDAsIDAsIDAsIDB9LAotCXsweDVCLCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NUMsIDB4ODgsIDB4ODgsIDAsIDB9LAotCXsweDVELCAwLCAwLCAwLCAwfSwKLQl7MHg1RSwgMHg4LCAweDgsIDAsIDB9LAotCXsweDVGLCAweDc3LCAweDc3LCAxLCAxfSwKLQl7MHg2MCwgMHgxLCAweDEsIDAsIDB9LAotCXsweDYxLCAwLCAwLCAwLCAwfSwKLQl7MHg2MiwgMHg3LCAweDcsIDAsIDB9LAotCXsweDYzLCAwLCAwLCAwLCAwfSwKLQl7MHg2NCwgMHg3LCAweDcsIDAsIDB9LAotCXsweDY1LCAwLCAwLCAwLCAwfSwKLQl7MHg2NiwgMCwgMCwgMCwgMH0sCi0JezB4NjcsIDAsIDAsIDEsIDF9LAotCXsweDY4LCAwLCAwLCAwLCAwfSwKLQl7MHg2OSwgMHhhLCAweGEsIDAsIDB9LAotCXsweDZBLCAwLCAwLCAwLCAwfSwKLQl7MHg2QiwgMCwgMCwgMCwgMH0sCi0JezB4NkMsIDAsIDAsIDAsIDB9LAotCXsweDZELCAwLCAwLCAwLCAwfSwKLQl7MHg2RSwgMCwgMCwgMCwgMH0sCi0JezB4NkYsIDAsIDAsIDAsIDB9LAotCXsweDcwLCAwLCAwLCAwLCAwfSwKLQl7MHg3MSwgMHgyLCAweDIsIDAsIDB9LAotCXsweDcyLCAwLCAwLCAwLCAwfSwKLQl7MHg3MywgMCwgMCwgMCwgMH0sCi0JezB4NzQsIDB4ZSwgMHhlLCAwLCAwfSwKLQl7MHg3NSwgMHhlLCAweGUsIDAsIDB9LAotCXsweDc2LCAweGUsIDB4ZSwgMCwgMH0sCi0JezB4NzcsIDB4MTMsIDB4MTMsIDAsIDB9LAotCXsweDc4LCAweDEzLCAweDEzLCAwLCAwfSwKLQl7MHg3OSwgMHgxYiwgMHgxYiwgMCwgMH0sCi0JezB4N0EsIDB4MWIsIDB4MWIsIDAsIDB9LAotCXsweDdCLCAweDU1LCAweDU1LCAwLCAwfSwKLQl7MHg3QywgMHg1YiwgMHg1YiwgMCwgMH0sCi0JezB4N0QsIDAsIDAsIDAsIDB9LAotCXsweDdFLCAwLCAwLCAwLCAwfSwKLQl7MHg3RiwgMCwgMCwgMCwgMH0sCi0JezB4ODAsIDAsIDAsIDAsIDB9LAotCXsweDgxLCAwLCAwLCAwLCAwfSwKLQl7MHg4MiwgMCwgMCwgMCwgMH0sCi0JezB4ODMsIDAsIDAsIDAsIDB9LAotCXsweDg0LCAwLCAwLCAwLCAwfSwKLQl7MHg4NSwgMCwgMCwgMCwgMH0sCi0JezB4ODYsIDAsIDAsIDAsIDB9LAotCXsweDg3LCAwLCAwLCAwLCAwfSwKLQl7MHg4OCwgMCwgMCwgMCwgMH0sCi0JezB4ODksIDAsIDAsIDAsIDB9LAotCXsweDhBLCAwLCAwLCAwLCAwfSwKLQl7MHg4QiwgMCwgMCwgMCwgMH0sCi0JezB4OEMsIDAsIDAsIDAsIDB9LAotCXsweDhELCAwLCAwLCAwLCAwfSwKLQl7MHg4RSwgMCwgMCwgMCwgMH0sCi0JezB4OEYsIDAsIDAsIDAsIDB9LAotCXsweDkwLCAwLCAwLCAwLCAwfSwKLQl7MHg5MSwgMCwgMCwgMCwgMH0sCi0JezB4OTIsIDAsIDAsIDAsIDB9LAotCXsweDkzLCAweDcwLCAweDcwLCAwLCAwfSwKLQl7MHg5NCwgMHg3MCwgMHg3MCwgMCwgMH0sCi0JezB4OTUsIDB4NzEsIDB4NzEsIDEsIDF9LAotCXsweDk2LCAweDcxLCAweDcxLCAxLCAxfSwKLQl7MHg5NywgMHg3MiwgMHg3MiwgMSwgMX0sCi0JezB4OTgsIDB4NzMsIDB4NzMsIDEsIDF9LAotCXsweDk5LCAweDc0LCAweDc0LCAxLCAxfSwKLQl7MHg5QSwgMHg3NSwgMHg3NSwgMSwgMX0sCi0JezB4RkZGRiwgMCwgMCwgMCwgMH0KLX07Ci0KLXN0cnVjdCByYWRpb19yZWdzIHJlZ3NfUlhfMjA1Nl9yZXY1W10gPSB7Ci0JezB4MDIsIDAsIDAsIDAsIDB9LAotCXsweDAzLCAwLCAwLCAwLCAwfSwKLQl7MHgwNCwgMCwgMCwgMCwgMH0sCi0JezB4MDUsIDAsIDAsIDAsIDB9LAotCXsweDA2LCAwLCAwLCAwLCAwfSwKLQl7MHgwNywgMCwgMCwgMCwgMH0sCi0JezB4MDgsIDAsIDAsIDAsIDB9LAotCXsweDA5LCAwLCAwLCAwLCAwfSwKLQl7MHgwQSwgMCwgMCwgMCwgMH0sCi0JezB4MEIsIDAsIDAsIDAsIDB9LAotCXsweDBDLCAwLCAwLCAwLCAwfSwKLQl7MHgwRCwgMCwgMCwgMCwgMH0sCi0JezB4MEUsIDAsIDAsIDAsIDB9LAotCXsweDBGLCAwLCAwLCAwLCAwfSwKLQl7MHgxMCwgMCwgMCwgMCwgMH0sCi0JezB4MTEsIDAsIDAsIDAsIDB9LAotCXsweDEyLCAwLCAwLCAwLCAwfSwKLQl7MHgxMywgMCwgMCwgMCwgMH0sCi0JezB4MTQsIDAsIDAsIDAsIDB9LAotCXsweDE1LCAwLCAwLCAwLCAwfSwKLQl7MHgxNiwgMCwgMCwgMCwgMH0sCi0JezB4MTcsIDAsIDAsIDAsIDB9LAotCXsweDE4LCAwLCAwLCAwLCAwfSwKLQl7MHgxOSwgMCwgMCwgMCwgMH0sCi0JezB4MUEsIDAsIDAsIDAsIDB9LAotCXsweDFCLCAwLCAwLCAwLCAwfSwKLQl7MHgxQywgMCwgMCwgMCwgMH0sCi0JezB4MUQsIDAsIDAsIDAsIDB9LAotCXsweDFFLCAwLCAwLCAwLCAwfSwKLQl7MHgxRiwgMCwgMCwgMCwgMH0sCi0JezB4MjAsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHgyMSwgMCwgMCwgMCwgMH0sCi0JezB4MjIsIDAsIDAsIDAsIDB9LAotCXsweDIzLCAweDkwLCAweDkwLCAwLCAwfSwKLQl7MHgyNCwgMHg1NSwgMHg1NSwgMCwgMH0sCi0JezB4MjUsIDB4MTUsIDB4MTUsIDAsIDB9LAotCXsweDI2LCAweDUsIDB4NSwgMCwgMH0sCi0JezB4MjcsIDB4MTUsIDB4MTUsIDAsIDB9LAotCXsweDI4LCAweDUsIDB4NSwgMCwgMH0sCi0JezB4MjksIDB4MjAsIDB4MjAsIDAsIDB9LAotCXsweDJBLCAweDExLCAweDExLCAwLCAwfSwKLQl7MHgyQiwgMHg5MCwgMHg5MCwgMCwgMH0sCi0JezB4MkMsIDAsIDAsIDAsIDB9LAotCXsweDJELCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHgyRSwgMHgzMiwgMHgzMiwgMCwgMH0sCi0JezB4MkYsIDB4NzcsIDB4NzcsIDAsIDB9LAotCXsweDMwLCAweDE3LCAweDE3LCAxLCAxfSwKLQl7MHgzMSwgMHhmZiwgMHhmZiwgMSwgMX0sCi0JezB4MzIsIDB4MjAsIDB4MjAsIDAsIDB9LAotCXsweDMzLCAwLCAwLCAwLCAwfSwKLQl7MHgzNCwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4MzUsIDB4MzIsIDB4MzIsIDAsIDB9LAotCXsweDM2LCAweDc3LCAweDc3LCAwLCAwfSwKLQl7MHgzNywgMHgxNywgMHgxNywgMSwgMX0sCi0JezB4MzgsIDB4ZjAsIDB4ZjAsIDEsIDF9LAotCXsweDM5LCAweDIwLCAweDIwLCAwLCAwfSwKLQl7MHgzQSwgMHg4LCAweDgsIDAsIDB9LAotCXsweDNCLCAweDU1LCAweDU1LCAxLCAxfSwKLQl7MHgzQywgMCwgMCwgMCwgMH0sCi0JezB4M0QsIDB4ODgsIDB4ODgsIDEsIDF9LAotCXsweDNFLCAwLCAwLCAwLCAwfSwKLQl7MHgzRiwgMCwgMCwgMSwgMX0sCi0JezB4NDAsIDB4NywgMHg3LCAxLCAxfSwKLQl7MHg0MSwgMHg2LCAweDYsIDAsIDB9LAotCXsweDQyLCAweDQsIDB4NCwgMCwgMH0sCi0JezB4NDMsIDAsIDAsIDAsIDB9LAotCXsweDQ0LCAweDgsIDB4OCwgMCwgMH0sCi0JezB4NDUsIDB4NTUsIDB4NTUsIDEsIDF9LAotCXsweDQ2LCAwLCAwLCAwLCAwfSwKLQl7MHg0NywgMHgxMSwgMHgxMSwgMCwgMH0sCi0JezB4NDgsIDAsIDAsIDAsIDB9LAotCXsweDQ5LCAwLCAwLCAxLCAxfSwKLQl7MHg0QSwgMHg3LCAweDcsIDAsIDB9LAotCXsweDRCLCAweDYsIDB4NiwgMCwgMH0sCi0JezB4NEMsIDB4NCwgMHg0LCAwLCAwfSwKLQl7MHg0RCwgMCwgMCwgMCwgMH0sCi0JezB4NEUsIDAsIDAsIDAsIDB9LAotCXsweDRGLCAweDI2LCAweDI2LCAxLCAxfSwKLQl7MHg1MCwgMHgyNiwgMHgyNiwgMSwgMX0sCi0JezB4NTEsIDB4ZiwgMHhmLCAxLCAxfSwKLQl7MHg1MiwgMHhmLCAweGYsIDEsIDF9LAotCXsweDUzLCAweDQ0LCAweDQ0LCAwLCAwfSwKLQl7MHg1NCwgMCwgMCwgMCwgMH0sCi0JezB4NTUsIDAsIDAsIDAsIDB9LAotCXsweDU2LCAweDgsIDB4OCwgMCwgMH0sCi0JezB4NTcsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHg1OCwgMHg3LCAweDcsIDAsIDB9LAotCXsweDU5LCAweDIyLCAweDIyLCAwLCAwfSwKLQl7MHg1QSwgMHgyMiwgMHgyMiwgMCwgMH0sCi0JezB4NUIsIDB4MiwgMHgyLCAwLCAwfSwKLQl7MHg1QywgMHg0LCAweDQsIDEsIDF9LAotCXsweDVELCAweDcsIDB4NywgMCwgMH0sCi0JezB4NUUsIDB4NTUsIDB4NTUsIDAsIDB9LAotCXsweDVGLCAweDIzLCAweDIzLCAwLCAwfSwKLQl7MHg2MCwgMHg0MSwgMHg0MSwgMCwgMH0sCi0JezB4NjEsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHg2MiwgMHhhLCAweGEsIDAsIDB9LAotCXsweDYzLCAwLCAwLCAwLCAwfSwKLQl7MHg2NCwgMCwgMCwgMCwgMH0sCi0JezB4NjUsIDAsIDAsIDAsIDB9LAotCXsweDY2LCAwLCAwLCAwLCAwfSwKLQl7MHg2NywgMCwgMCwgMCwgMH0sCi0JezB4NjgsIDAsIDAsIDAsIDB9LAotCXsweDY5LCAwLCAwLCAwLCAwfSwKLQl7MHg2QSwgMCwgMCwgMCwgMH0sCi0JezB4NkIsIDB4YywgMHhjLCAwLCAwfSwKLQl7MHg2QywgMCwgMCwgMCwgMH0sCi0JezB4NkQsIDAsIDAsIDAsIDB9LAotCXsweDZFLCAwLCAwLCAwLCAwfSwKLQl7MHg2RiwgMCwgMCwgMCwgMH0sCi0JezB4NzAsIDAsIDAsIDAsIDB9LAotCXsweDcxLCAwLCAwLCAwLCAwfSwKLQl7MHg3MiwgMHgyMiwgMHgyMiwgMCwgMH0sCi0JezB4NzMsIDB4MjIsIDB4MjIsIDAsIDB9LAotCXsweDc0LCAwLCAwLCAxLCAxfSwKLQl7MHg3NSwgMHhhLCAweGEsIDAsIDB9LAotCXsweDc2LCAweDEsIDB4MSwgMCwgMH0sCi0JezB4NzcsIDB4MjIsIDB4MjIsIDAsIDB9LAotCXsweDc4LCAweDMwLCAweDMwLCAwLCAwfSwKLQl7MHg3OSwgMCwgMCwgMCwgMH0sCi0JezB4N0EsIDAsIDAsIDAsIDB9LAotCXsweDdCLCAwLCAwLCAwLCAwfSwKLQl7MHg3QywgMCwgMCwgMCwgMH0sCi0JezB4N0QsIDAsIDAsIDAsIDB9LAotCXsweDdFLCAwLCAwLCAwLCAwfSwKLQl7MHg3RiwgMCwgMCwgMCwgMH0sCi0JezB4ODAsIDAsIDAsIDAsIDB9LAotCXsweDgxLCAwLCAwLCAwLCAwfSwKLQl7MHg4MiwgMCwgMCwgMCwgMH0sCi0JezB4ODMsIDAsIDAsIDAsIDB9LAotCXsweDg0LCAwLCAwLCAwLCAwfSwKLQl7MHg4NSwgMCwgMCwgMCwgMH0sCi0JezB4ODYsIDAsIDAsIDAsIDB9LAotCXsweDg3LCAwLCAwLCAwLCAwfSwKLQl7MHg4OCwgMCwgMCwgMCwgMH0sCi0JezB4ODksIDAsIDAsIDAsIDB9LAotCXsweDhBLCAwLCAwLCAwLCAwfSwKLQl7MHg4QiwgMCwgMCwgMCwgMH0sCi0JezB4OEMsIDAsIDAsIDAsIDB9LAotCXsweDhELCAwLCAwLCAwLCAwfSwKLQl7MHg4RSwgMCwgMCwgMCwgMH0sCi0JezB4OEYsIDAsIDAsIDAsIDB9LAotCXsweDkwLCAwLCAwLCAwLCAwfSwKLQl7MHg5MSwgMCwgMCwgMCwgMH0sCi0JezB4OTIsIDAsIDAsIDAsIDB9LAotCXsweDkzLCAwLCAwLCAwLCAwfSwKLQl7MHg5NCwgMCwgMCwgMCwgMH0sCi0JezB4RkZGRiwgMCwgMCwgMCwgMH0KLX07Ci0KLXN0cnVjdCByYWRpb19yZWdzIHJlZ3NfU1lOXzIwNTZfcmV2NltdID0gewotCXsweDAyLCAwLCAwLCAwLCAwfSwKLQl7MHgwMywgMCwgMCwgMCwgMH0sCi0JezB4MDQsIDAsIDAsIDAsIDB9LAotCXsweDA1LCAwLCAwLCAwLCAwfSwKLQl7MHgwNiwgMCwgMCwgMCwgMH0sCi0JezB4MDcsIDAsIDAsIDAsIDB9LAotCXsweDA4LCAwLCAwLCAwLCAwfSwKLQl7MHgwOSwgMHgxLCAweDEsIDAsIDB9LAotCXsweDBBLCAwLCAwLCAwLCAwfSwKLQl7MHgwQiwgMCwgMCwgMCwgMH0sCi0JezB4MEMsIDAsIDAsIDAsIDB9LAotCXsweDBELCAwLCAwLCAwLCAwfSwKLQl7MHgwRSwgMCwgMCwgMCwgMH0sCi0JezB4MEYsIDAsIDAsIDAsIDB9LAotCXsweDEwLCAwLCAwLCAwLCAwfSwKLQl7MHgxMSwgMCwgMCwgMCwgMH0sCi0JezB4MTIsIDAsIDAsIDAsIDB9LAotCXsweDEzLCAwLCAwLCAwLCAwfSwKLQl7MHgxNCwgMCwgMCwgMCwgMH0sCi0JezB4MTUsIDAsIDAsIDAsIDB9LAotCXsweDE2LCAwLCAwLCAwLCAwfSwKLQl7MHgxNywgMCwgMCwgMCwgMH0sCi0JezB4MTgsIDAsIDAsIDAsIDB9LAotCXsweDE5LCAwLCAwLCAwLCAwfSwKLQl7MHgxQSwgMCwgMCwgMCwgMH0sCi0JezB4MUIsIDAsIDAsIDAsIDB9LAotCXsweDFDLCAwLCAwLCAwLCAwfSwKLQl7MHgxRCwgMCwgMCwgMCwgMH0sCi0JezB4MUUsIDAsIDAsIDAsIDB9LAotCXsweDFGLCAwLCAwLCAwLCAwfSwKLQl7MHgyMCwgMCwgMCwgMCwgMH0sCi0JezB4MjEsIDAsIDAsIDAsIDB9LAotCXsweDIyLCAweDYwLCAweDYwLCAwLCAwfSwKLQl7MHgyMywgMHg2LCAweDYsIDAsIDB9LAotCXsweDI0LCAweGMsIDB4YywgMCwgMH0sCi0JezB4MjUsIDAsIDAsIDAsIDB9LAotCXsweDI2LCAwLCAwLCAwLCAwfSwKLQl7MHgyNywgMCwgMCwgMCwgMH0sCi0JezB4MjgsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHgyOSwgMCwgMCwgMCwgMH0sCi0JezB4MkEsIDAsIDAsIDAsIDB9LAotCXsweDJCLCAwLCAwLCAwLCAwfSwKLQl7MHgyQywgMCwgMCwgMCwgMH0sCi0JezB4MkQsIDAsIDAsIDAsIDB9LAotCXsweDJFLCAwLCAwLCAwLCAwfSwKLQl7MHgyRiwgMHgxZiwgMHgxZiwgMCwgMH0sCi0JezB4MzAsIDB4MTUsIDB4MTUsIDAsIDB9LAotCXsweDMxLCAweGYsIDB4ZiwgMCwgMH0sCi0JezB4MzIsIDAsIDAsIDAsIDB9LAotCXsweDMzLCAwLCAwLCAwLCAwfSwKLQl7MHgzNCwgMCwgMCwgMCwgMH0sCi0JezB4MzUsIDAsIDAsIDAsIDB9LAotCXsweDM2LCAwLCAwLCAwLCAwfSwKLQl7MHgzNywgMCwgMCwgMCwgMH0sCi0JezB4MzgsIDAsIDAsIDAsIDB9LAotCXsweDM5LCAwLCAwLCAwLCAwfSwKLQl7MHgzQSwgMCwgMCwgMCwgMH0sCi0JezB4M0IsIDAsIDAsIDAsIDB9LAotCXsweDNDLCAweDEzLCAweDEzLCAwLCAwfSwKLQl7MHgzRCwgMHhmLCAweGYsIDAsIDB9LAotCXsweDNFLCAweDE4LCAweDE4LCAwLCAwfSwKLQl7MHgzRiwgMCwgMCwgMCwgMH0sCi0JezB4NDAsIDAsIDAsIDAsIDB9LAotCXsweDQxLCAweDIwLCAweDIwLCAwLCAwfSwKLQl7MHg0MiwgMHgyMCwgMHgyMCwgMCwgMH0sCi0JezB4NDMsIDAsIDAsIDAsIDB9LAotCXsweDQ0LCAweDc3LCAweDc3LCAwLCAwfSwKLQl7MHg0NSwgMHg3LCAweDcsIDAsIDB9LAotCXsweDQ2LCAweDEsIDB4MSwgMCwgMH0sCi0JezB4NDcsIDB4NCwgMHg0LCAwLCAwfSwKLQl7MHg0OCwgMHhmLCAweGYsIDAsIDB9LAotCXsweDQ5LCAweDMwLCAweDMwLCAwLCAwfSwKLQl7MHg0QSwgMHgzMiwgMHgzMiwgMCwgMH0sCi0JezB4NEIsIDB4ZCwgMHhkLCAwLCAwfSwKLQl7MHg0QywgMHhkLCAweGQsIDAsIDB9LAotCXsweDRELCAweDQsIDB4NCwgMCwgMH0sCi0JezB4NEUsIDB4NiwgMHg2LCAwLCAwfSwKLQl7MHg0RiwgMHgxLCAweDEsIDAsIDB9LAotCXsweDUwLCAweDFjLCAweDFjLCAwLCAwfSwKLQl7MHg1MSwgMHgyLCAweDIsIDAsIDB9LAotCXsweDUyLCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NTMsIDB4ZjcsIDB4ZjcsIDEsIDF9LAotCXsweDU0LCAweGI0LCAweGI0LCAwLCAwfSwKLQl7MHg1NSwgMHhkMiwgMHhkMiwgMCwgMH0sCi0JezB4NTYsIDAsIDAsIDAsIDB9LAotCXsweDU3LCAwLCAwLCAwLCAwfSwKLQl7MHg1OCwgMHg0LCAweDQsIDAsIDB9LAotCXsweDU5LCAweDk2LCAweDk2LCAwLCAwfSwKLQl7MHg1QSwgMHgzZSwgMHgzZSwgMCwgMH0sCi0JezB4NUIsIDB4M2UsIDB4M2UsIDAsIDB9LAotCXsweDVDLCAweDEzLCAweDEzLCAwLCAwfSwKLQl7MHg1RCwgMHgyLCAweDIsIDAsIDB9LAotCXsweDVFLCAwLCAwLCAwLCAwfSwKLQl7MHg1RiwgMHg3LCAweDcsIDAsIDB9LAotCXsweDYwLCAweDcsIDB4NywgMSwgMX0sCi0JezB4NjEsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHg2MiwgMHgzLCAweDMsIDAsIDB9LAotCXsweDYzLCAwLCAwLCAwLCAwfSwKLQl7MHg2NCwgMCwgMCwgMCwgMH0sCi0JezB4NjUsIDAsIDAsIDAsIDB9LAotCXsweDY2LCAwLCAwLCAwLCAwfSwKLQl7MHg2NywgMCwgMCwgMCwgMH0sCi0JezB4NjgsIDB4NDAsIDB4NDAsIDAsIDB9LAotCXsweDY5LCAwLCAwLCAwLCAwfSwKLQl7MHg2QSwgMCwgMCwgMCwgMH0sCi0JezB4NkIsIDAsIDAsIDAsIDB9LAotCXsweDZDLCAwLCAwLCAwLCAwfSwKLQl7MHg2RCwgMHgxLCAweDEsIDAsIDB9LAotCXsweDZFLCAwLCAwLCAwLCAwfSwKLQl7MHg2RiwgMCwgMCwgMCwgMH0sCi0JezB4NzAsIDB4NjAsIDB4NjAsIDAsIDB9LAotCXsweDcxLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHg3MiwgMHhjLCAweGMsIDAsIDB9LAotCXsweDczLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHg3NCwgMHg4ZiwgMHg4ZiwgMSwgMX0sCi0JezB4NzUsIDAsIDAsIDAsIDB9LAotCXsweDc2LCAweGNjLCAweGNjLCAwLCAwfSwKLQl7MHg3NywgMHgxLCAweDEsIDAsIDB9LAotCXsweDc4LCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHg3OSwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4N0EsIDAsIDAsIDAsIDB9LAotCXsweDdCLCAwLCAwLCAwLCAwfSwKLQl7MHg3QywgMCwgMCwgMCwgMH0sCi0JezB4N0QsIDAsIDAsIDAsIDB9LAotCXsweDdFLCAwLCAwLCAwLCAwfSwKLQl7MHg3RiwgMCwgMCwgMCwgMH0sCi0JezB4ODAsIDAsIDAsIDAsIDB9LAotCXsweDgxLCAwLCAwLCAwLCAwfSwKLQl7MHg4MiwgMCwgMCwgMCwgMH0sCi0JezB4ODMsIDAsIDAsIDAsIDB9LAotCXsweDg0LCAwLCAwLCAwLCAwfSwKLQl7MHg4NSwgMHhmZiwgMHhmZiwgMCwgMH0sCi0JezB4ODYsIDAsIDAsIDAsIDB9LAotCXsweDg3LCAwLCAwLCAwLCAwfSwKLQl7MHg4OCwgMCwgMCwgMCwgMH0sCi0JezB4ODksIDAsIDAsIDAsIDB9LAotCXsweDhBLCAwLCAwLCAwLCAwfSwKLQl7MHg4QiwgMCwgMCwgMCwgMH0sCi0JezB4OEMsIDAsIDAsIDAsIDB9LAotCXsweDhELCAwLCAwLCAwLCAwfSwKLQl7MHg4RSwgMCwgMCwgMCwgMH0sCi0JezB4OEYsIDAsIDAsIDAsIDB9LAotCXsweDkwLCAwLCAwLCAwLCAwfSwKLQl7MHg5MSwgMCwgMCwgMCwgMH0sCi0JezB4OTIsIDAsIDAsIDAsIDB9LAotCXsweDkzLCAwLCAwLCAwLCAwfSwKLQl7MHg5NCwgMCwgMCwgMCwgMH0sCi0JezB4OTUsIDAsIDAsIDAsIDB9LAotCXsweDk2LCAwLCAwLCAwLCAwfSwKLQl7MHg5NywgMCwgMCwgMCwgMH0sCi0JezB4OTgsIDAsIDAsIDAsIDB9LAotCXsweDk5LCAwLCAwLCAwLCAwfSwKLQl7MHg5QSwgMCwgMCwgMCwgMH0sCi0JezB4OUIsIDAsIDAsIDAsIDB9LAotCXsweDlDLCAwLCAwLCAwLCAwfSwKLQl7MHg5RCwgMCwgMCwgMCwgMH0sCi0JezB4OUUsIDAsIDAsIDAsIDB9LAotCXsweDlGLCAweDYsIDB4NiwgMCwgMH0sCi0JezB4QTAsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEExLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBMiwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QTMsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEE0LCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBNSwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QTYsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEE3LCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBOCwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QTksIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEFBLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBQiwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QUMsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEFELCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBRSwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QUYsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEIwLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhCMSwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QjIsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEIzLCAweGEsIDB4YSwgMCwgMH0sCi0JezB4QjQsIDAsIDAsIDAsIDB9LAotCXsweEI1LCAwLCAwLCAwLCAwfSwKLQl7MHhCNiwgMCwgMCwgMCwgMH0sCi0JezB4RkZGRiwgMCwgMCwgMCwgMH0KLX07Ci0KLXN0cnVjdCByYWRpb19yZWdzIHJlZ3NfVFhfMjA1Nl9yZXY2W10gPSB7Ci0JezB4MDIsIDAsIDAsIDAsIDB9LAotCXsweDAzLCAwLCAwLCAwLCAwfSwKLQl7MHgwNCwgMCwgMCwgMCwgMH0sCi0JezB4MDUsIDAsIDAsIDAsIDB9LAotCXsweDA2LCAwLCAwLCAwLCAwfSwKLQl7MHgwNywgMCwgMCwgMCwgMH0sCi0JezB4MDgsIDAsIDAsIDAsIDB9LAotCXsweDA5LCAwLCAwLCAwLCAwfSwKLQl7MHgwQSwgMCwgMCwgMCwgMH0sCi0JezB4MEIsIDAsIDAsIDAsIDB9LAotCXsweDBDLCAwLCAwLCAwLCAwfSwKLQl7MHgwRCwgMCwgMCwgMCwgMH0sCi0JezB4MEUsIDAsIDAsIDAsIDB9LAotCXsweDBGLCAwLCAwLCAwLCAwfSwKLQl7MHgxMCwgMCwgMCwgMCwgMH0sCi0JezB4MTEsIDAsIDAsIDAsIDB9LAotCXsweDEyLCAwLCAwLCAwLCAwfSwKLQl7MHgxMywgMCwgMCwgMCwgMH0sCi0JezB4MTQsIDAsIDAsIDAsIDB9LAotCXsweDE1LCAwLCAwLCAwLCAwfSwKLQl7MHgxNiwgMCwgMCwgMCwgMH0sCi0JezB4MTcsIDAsIDAsIDAsIDB9LAotCXsweDE4LCAwLCAwLCAwLCAwfSwKLQl7MHgxOSwgMCwgMCwgMCwgMH0sCi0JezB4MUEsIDAsIDAsIDAsIDB9LAotCXsweDFCLCAwLCAwLCAwLCAwfSwKLQl7MHgxQywgMCwgMCwgMCwgMH0sCi0JezB4MUQsIDAsIDAsIDAsIDB9LAotCXsweDFFLCAwLCAwLCAwLCAwfSwKLQl7MHgxRiwgMCwgMCwgMCwgMH0sCi0JezB4MjAsIDAsIDAsIDAsIDB9LAotCXsweDIxLCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHgyMiwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4MjMsIDB4ODgsIDB4ODgsIDAsIDB9LAotCXsweDI0LCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHgyNSwgMHhjLCAweGMsIDAsIDB9LAotCXsweDI2LCAwLCAwLCAwLCAwfSwKLQl7MHgyNywgMHgzLCAweDMsIDAsIDB9LAotCXsweDI4LCAwLCAwLCAwLCAwfSwKLQl7MHgyOSwgMHgzLCAweDMsIDAsIDB9LAotCXsweDJBLCAweDM3LCAweDM3LCAwLCAwfSwKLQl7MHgyQiwgMHgzLCAweDMsIDAsIDB9LAotCXsweDJDLCAwLCAwLCAwLCAwfSwKLQl7MHgyRCwgMCwgMCwgMCwgMH0sCi0JezB4MkUsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHgyRiwgMHgxLCAweDEsIDAsIDB9LAotCXsweDMwLCAwLCAwLCAwLCAwfSwKLQl7MHgzMSwgMCwgMCwgMCwgMH0sCi0JezB4MzIsIDAsIDAsIDAsIDB9LAotCXsweDMzLCAweDExLCAweDExLCAwLCAwfSwKLQl7MHgzNCwgMHhlZSwgMHhlZSwgMSwgMX0sCi0JezB4MzUsIDAsIDAsIDAsIDB9LAotCXsweDM2LCAwLCAwLCAwLCAwfSwKLQl7MHgzNywgMHgzLCAweDMsIDAsIDB9LAotCXsweDM4LCAweDUwLCAweDUwLCAxLCAxfSwKLQl7MHgzOSwgMCwgMCwgMCwgMH0sCi0JezB4M0EsIDB4NTAsIDB4NTAsIDEsIDF9LAotCXsweDNCLCAwLCAwLCAwLCAwfSwKLQl7MHgzQywgMHg2ZSwgMHg2ZSwgMCwgMH0sCi0JezB4M0QsIDB4ZjAsIDB4ZjAsIDEsIDF9LAotCXsweDNFLCAwLCAwLCAwLCAwfSwKLQl7MHgzRiwgMCwgMCwgMCwgMH0sCi0JezB4NDAsIDAsIDAsIDAsIDB9LAotCXsweDQxLCAweDMsIDB4MywgMCwgMH0sCi0JezB4NDIsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHg0MywgMCwgMCwgMCwgMH0sCi0JezB4NDQsIDB4MWUsIDB4MWUsIDAsIDB9LAotCXsweDQ1LCAwLCAwLCAwLCAwfSwKLQl7MHg0NiwgMHg2ZSwgMHg2ZSwgMCwgMH0sCi0JezB4NDcsIDB4ZjAsIDB4ZjAsIDEsIDF9LAotCXsweDQ4LCAwLCAwLCAwLCAwfSwKLQl7MHg0OSwgMHgyLCAweDIsIDAsIDB9LAotCXsweDRBLCAweGZmLCAweGZmLCAxLCAxfSwKLQl7MHg0QiwgMHhjLCAweGMsIDAsIDB9LAotCXsweDRDLCAwLCAwLCAwLCAwfSwKLQl7MHg0RCwgMHgzOCwgMHgzOCwgMCwgMH0sCi0JezB4NEUsIDB4NzAsIDB4NzAsIDEsIDF9LAotCXsweDRGLCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NTAsIDB4ODgsIDB4ODgsIDAsIDB9LAotCXsweDUxLCAweGMsIDB4YywgMCwgMH0sCi0JezB4NTIsIDAsIDAsIDAsIDB9LAotCXsweDUzLCAweDgsIDB4OCwgMCwgMH0sCi0JezB4NTQsIDB4NzAsIDB4NzAsIDEsIDF9LAotCXsweDU1LCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NTYsIDB4ZmYsIDB4ZmYsIDEsIDF9LAotCXsweDU3LCAwLCAwLCAwLCAwfSwKLQl7MHg1OCwgMHg4MywgMHg4MywgMCwgMH0sCi0JezB4NTksIDB4NzcsIDB4NzcsIDEsIDF9LAotCXsweDVBLCAwLCAwLCAwLCAwfSwKLQl7MHg1QiwgMHgyLCAweDIsIDAsIDB9LAotCXsweDVDLCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHg1RCwgMCwgMCwgMCwgMH0sCi0JezB4NUUsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHg1RiwgMHg3NywgMHg3NywgMSwgMX0sCi0JezB4NjAsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHg2MSwgMCwgMCwgMCwgMH0sCi0JezB4NjIsIDB4NywgMHg3LCAwLCAwfSwKLQl7MHg2MywgMCwgMCwgMCwgMH0sCi0JezB4NjQsIDB4NywgMHg3LCAwLCAwfSwKLQl7MHg2NSwgMCwgMCwgMCwgMH0sCi0JezB4NjYsIDAsIDAsIDAsIDB9LAotCXsweDY3LCAwLCAwLCAxLCAxfSwKLQl7MHg2OCwgMCwgMCwgMCwgMH0sCi0JezB4NjksIDB4YSwgMHhhLCAwLCAwfSwKLQl7MHg2QSwgMCwgMCwgMCwgMH0sCi0JezB4NkIsIDAsIDAsIDAsIDB9LAotCXsweDZDLCAwLCAwLCAwLCAwfSwKLQl7MHg2RCwgMCwgMCwgMCwgMH0sCi0JezB4NkUsIDAsIDAsIDAsIDB9LAotCXsweDZGLCAwLCAwLCAwLCAwfSwKLQl7MHg3MCwgMCwgMCwgMCwgMH0sCi0JezB4NzEsIDB4MiwgMHgyLCAwLCAwfSwKLQl7MHg3MiwgMCwgMCwgMCwgMH0sCi0JezB4NzMsIDAsIDAsIDAsIDB9LAotCXsweDc0LCAweGUsIDB4ZSwgMCwgMH0sCi0JezB4NzUsIDB4ZSwgMHhlLCAwLCAwfSwKLQl7MHg3NiwgMHhlLCAweGUsIDAsIDB9LAotCXsweDc3LCAweDEzLCAweDEzLCAwLCAwfSwKLQl7MHg3OCwgMHgxMywgMHgxMywgMCwgMH0sCi0JezB4NzksIDB4MWIsIDB4MWIsIDAsIDB9LAotCXsweDdBLCAweDFiLCAweDFiLCAwLCAwfSwKLQl7MHg3QiwgMHg1NSwgMHg1NSwgMCwgMH0sCi0JezB4N0MsIDB4NWIsIDB4NWIsIDAsIDB9LAotCXsweDdELCAweDMwLCAweDMwLCAxLCAxfSwKLQl7MHg3RSwgMCwgMCwgMCwgMH0sCi0JezB4N0YsIDAsIDAsIDAsIDB9LAotCXsweDgwLCAwLCAwLCAwLCAwfSwKLQl7MHg4MSwgMCwgMCwgMCwgMH0sCi0JezB4ODIsIDAsIDAsIDAsIDB9LAotCXsweDgzLCAwLCAwLCAwLCAwfSwKLQl7MHg4NCwgMCwgMCwgMCwgMH0sCi0JezB4ODUsIDAsIDAsIDAsIDB9LAotCXsweDg2LCAwLCAwLCAwLCAwfSwKLQl7MHg4NywgMCwgMCwgMCwgMH0sCi0JezB4ODgsIDAsIDAsIDAsIDB9LAotCXsweDg5LCAwLCAwLCAwLCAwfSwKLQl7MHg4QSwgMCwgMCwgMCwgMH0sCi0JezB4OEIsIDAsIDAsIDAsIDB9LAotCXsweDhDLCAwLCAwLCAwLCAwfSwKLQl7MHg4RCwgMCwgMCwgMCwgMH0sCi0JezB4OEUsIDAsIDAsIDAsIDB9LAotCXsweDhGLCAwLCAwLCAwLCAwfSwKLQl7MHg5MCwgMCwgMCwgMCwgMH0sCi0JezB4OTEsIDAsIDAsIDAsIDB9LAotCXsweDkyLCAwLCAwLCAwLCAwfSwKLQl7MHg5MywgMHg3MCwgMHg3MCwgMCwgMH0sCi0JezB4OTQsIDB4NzAsIDB4NzAsIDAsIDB9LAotCXsweDk1LCAweDcwLCAweDcwLCAwLCAwfSwKLQl7MHg5NiwgMHg3MCwgMHg3MCwgMCwgMH0sCi0JezB4OTcsIDB4NzAsIDB4NzAsIDAsIDB9LAotCXsweDk4LCAweDcwLCAweDcwLCAwLCAwfSwKLQl7MHg5OSwgMHg3MCwgMHg3MCwgMCwgMH0sCi0JezB4OUEsIDB4NzAsIDB4NzAsIDAsIDB9LAotCXsweEZGRkYsIDAsIDAsIDAsIDB9Ci19OwotCi1zdHJ1Y3QgcmFkaW9fcmVncyByZWdzX1JYXzIwNTZfcmV2NltdID0gewotCXsweDAyLCAwLCAwLCAwLCAwfSwKLQl7MHgwMywgMCwgMCwgMCwgMH0sCi0JezB4MDQsIDAsIDAsIDAsIDB9LAotCXsweDA1LCAwLCAwLCAwLCAwfSwKLQl7MHgwNiwgMCwgMCwgMCwgMH0sCi0JezB4MDcsIDAsIDAsIDAsIDB9LAotCXsweDA4LCAwLCAwLCAwLCAwfSwKLQl7MHgwOSwgMCwgMCwgMCwgMH0sCi0JezB4MEEsIDAsIDAsIDAsIDB9LAotCXsweDBCLCAwLCAwLCAwLCAwfSwKLQl7MHgwQywgMCwgMCwgMCwgMH0sCi0JezB4MEQsIDAsIDAsIDAsIDB9LAotCXsweDBFLCAwLCAwLCAwLCAwfSwKLQl7MHgwRiwgMCwgMCwgMCwgMH0sCi0JezB4MTAsIDAsIDAsIDAsIDB9LAotCXsweDExLCAwLCAwLCAwLCAwfSwKLQl7MHgxMiwgMCwgMCwgMCwgMH0sCi0JezB4MTMsIDAsIDAsIDAsIDB9LAotCXsweDE0LCAwLCAwLCAwLCAwfSwKLQl7MHgxNSwgMCwgMCwgMCwgMH0sCi0JezB4MTYsIDAsIDAsIDAsIDB9LAotCXsweDE3LCAwLCAwLCAwLCAwfSwKLQl7MHgxOCwgMCwgMCwgMCwgMH0sCi0JezB4MTksIDAsIDAsIDAsIDB9LAotCXsweDFBLCAwLCAwLCAwLCAwfSwKLQl7MHgxQiwgMCwgMCwgMCwgMH0sCi0JezB4MUMsIDAsIDAsIDAsIDB9LAotCXsweDFELCAwLCAwLCAwLCAwfSwKLQl7MHgxRSwgMCwgMCwgMCwgMH0sCi0JezB4MUYsIDAsIDAsIDAsIDB9LAotCXsweDIwLCAweDMsIDB4MywgMCwgMH0sCi0JezB4MjEsIDAsIDAsIDAsIDB9LAotCXsweDIyLCAwLCAwLCAwLCAwfSwKLQl7MHgyMywgMHg5MCwgMHg5MCwgMCwgMH0sCi0JezB4MjQsIDB4NTUsIDB4NTUsIDAsIDB9LAotCXsweDI1LCAweDE1LCAweDE1LCAwLCAwfSwKLQl7MHgyNiwgMHg1LCAweDUsIDAsIDB9LAotCXsweDI3LCAweDE1LCAweDE1LCAwLCAwfSwKLQl7MHgyOCwgMHg1LCAweDUsIDAsIDB9LAotCXsweDI5LCAweDIwLCAweDIwLCAwLCAwfSwKLQl7MHgyQSwgMHgxMSwgMHgxMSwgMCwgMH0sCi0JezB4MkIsIDB4OTAsIDB4OTAsIDAsIDB9LAotCXsweDJDLCAwLCAwLCAwLCAwfSwKLQl7MHgyRCwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4MkUsIDB4MzIsIDB4MzIsIDAsIDB9LAotCXsweDJGLCAweDc3LCAweDc3LCAwLCAwfSwKLQl7MHgzMCwgMHgxNywgMHgxNywgMSwgMX0sCi0JezB4MzEsIDB4ZmYsIDB4ZmYsIDEsIDF9LAotCXsweDMyLCAweDIwLCAweDIwLCAwLCAwfSwKLQl7MHgzMywgMCwgMCwgMCwgMH0sCi0JezB4MzQsIDB4ODgsIDB4ODgsIDAsIDB9LAotCXsweDM1LCAweDMyLCAweDMyLCAwLCAwfSwKLQl7MHgzNiwgMHg3NywgMHg3NywgMCwgMH0sCi0JezB4MzcsIDB4MTcsIDB4MTcsIDEsIDF9LAotCXsweDM4LCAweGYwLCAweGYwLCAxLCAxfSwKLQl7MHgzOSwgMHgyMCwgMHgyMCwgMCwgMH0sCi0JezB4M0EsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHgzQiwgMHg1NSwgMHg1NSwgMSwgMX0sCi0JezB4M0MsIDAsIDAsIDAsIDB9LAotCXsweDNELCAweDg4LCAweDg4LCAxLCAxfSwKLQl7MHgzRSwgMCwgMCwgMCwgMH0sCi0JezB4M0YsIDB4NDQsIDB4NDQsIDAsIDB9LAotCXsweDQwLCAweDcsIDB4NywgMSwgMX0sCi0JezB4NDEsIDB4NiwgMHg2LCAwLCAwfSwKLQl7MHg0MiwgMHg0LCAweDQsIDAsIDB9LAotCXsweDQzLCAwLCAwLCAwLCAwfSwKLQl7MHg0NCwgMHg4LCAweDgsIDAsIDB9LAotCXsweDQ1LCAweDU1LCAweDU1LCAxLCAxfSwKLQl7MHg0NiwgMCwgMCwgMCwgMH0sCi0JezB4NDcsIDB4MTEsIDB4MTEsIDAsIDB9LAotCXsweDQ4LCAwLCAwLCAwLCAwfSwKLQl7MHg0OSwgMHg0NCwgMHg0NCwgMCwgMH0sCi0JezB4NEEsIDB4NywgMHg3LCAwLCAwfSwKLQl7MHg0QiwgMHg2LCAweDYsIDAsIDB9LAotCXsweDRDLCAweDQsIDB4NCwgMCwgMH0sCi0JezB4NEQsIDAsIDAsIDAsIDB9LAotCXsweDRFLCAwLCAwLCAwLCAwfSwKLQl7MHg0RiwgMHgyNiwgMHgyNiwgMSwgMX0sCi0JezB4NTAsIDB4MjYsIDB4MjYsIDEsIDF9LAotCXsweDUxLCAweGYsIDB4ZiwgMSwgMX0sCi0JezB4NTIsIDB4ZiwgMHhmLCAxLCAxfSwKLQl7MHg1MywgMHg0NCwgMHg0NCwgMCwgMH0sCi0JezB4NTQsIDAsIDAsIDAsIDB9LAotCXsweDU1LCAwLCAwLCAwLCAwfSwKLQl7MHg1NiwgMHg4LCAweDgsIDAsIDB9LAotCXsweDU3LCAweDgsIDB4OCwgMCwgMH0sCi0JezB4NTgsIDB4NywgMHg3LCAwLCAwfSwKLQl7MHg1OSwgMHgyMiwgMHgyMiwgMCwgMH0sCi0JezB4NUEsIDB4MjIsIDB4MjIsIDAsIDB9LAotCXsweDVCLCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NUMsIDB4NCwgMHg0LCAxLCAxfSwKLQl7MHg1RCwgMHg3LCAweDcsIDAsIDB9LAotCXsweDVFLCAweDU1LCAweDU1LCAwLCAwfSwKLQl7MHg1RiwgMHgyMywgMHgyMywgMCwgMH0sCi0JezB4NjAsIDB4NDEsIDB4NDEsIDAsIDB9LAotCXsweDYxLCAweDEsIDB4MSwgMCwgMH0sCi0JezB4NjIsIDB4YSwgMHhhLCAwLCAwfSwKLQl7MHg2MywgMCwgMCwgMCwgMH0sCi0JezB4NjQsIDAsIDAsIDAsIDB9LAotCXsweDY1LCAwLCAwLCAwLCAwfSwKLQl7MHg2NiwgMCwgMCwgMCwgMH0sCi0JezB4NjcsIDAsIDAsIDAsIDB9LAotCXsweDY4LCAwLCAwLCAwLCAwfSwKLQl7MHg2OSwgMCwgMCwgMCwgMH0sCi0JezB4NkEsIDAsIDAsIDAsIDB9LAotCXsweDZCLCAweGMsIDB4YywgMCwgMH0sCi0JezB4NkMsIDAsIDAsIDAsIDB9LAotCXsweDZELCAwLCAwLCAwLCAwfSwKLQl7MHg2RSwgMCwgMCwgMCwgMH0sCi0JezB4NkYsIDAsIDAsIDAsIDB9LAotCXsweDcwLCAwLCAwLCAwLCAwfSwKLQl7MHg3MSwgMCwgMCwgMCwgMH0sCi0JezB4NzIsIDB4MjIsIDB4MjIsIDAsIDB9LAotCXsweDczLCAweDIyLCAweDIyLCAwLCAwfSwKLQl7MHg3NCwgMCwgMCwgMSwgMX0sCi0JezB4NzUsIDB4YSwgMHhhLCAwLCAwfSwKLQl7MHg3NiwgMHgxLCAweDEsIDAsIDB9LAotCXsweDc3LCAweDIyLCAweDIyLCAwLCAwfSwKLQl7MHg3OCwgMHgzMCwgMHgzMCwgMCwgMH0sCi0JezB4NzksIDAsIDAsIDAsIDB9LAotCXsweDdBLCAwLCAwLCAwLCAwfSwKLQl7MHg3QiwgMCwgMCwgMCwgMH0sCi0JezB4N0MsIDAsIDAsIDAsIDB9LAotCXsweDdELCAweDUsIDB4NSwgMSwgMX0sCi0JezB4N0UsIDAsIDAsIDAsIDB9LAotCXsweDdGLCAwLCAwLCAwLCAwfSwKLQl7MHg4MCwgMCwgMCwgMCwgMH0sCi0JezB4ODEsIDAsIDAsIDAsIDB9LAotCXsweDgyLCAwLCAwLCAwLCAwfSwKLQl7MHg4MywgMCwgMCwgMCwgMH0sCi0JezB4ODQsIDAsIDAsIDAsIDB9LAotCXsweDg1LCAwLCAwLCAwLCAwfSwKLQl7MHg4NiwgMCwgMCwgMCwgMH0sCi0JezB4ODcsIDAsIDAsIDAsIDB9LAotCXsweDg4LCAwLCAwLCAwLCAwfSwKLQl7MHg4OSwgMCwgMCwgMCwgMH0sCi0JezB4OEEsIDAsIDAsIDAsIDB9LAotCXsweDhCLCAwLCAwLCAwLCAwfSwKLQl7MHg4QywgMCwgMCwgMCwgMH0sCi0JezB4OEQsIDAsIDAsIDAsIDB9LAotCXsweDhFLCAwLCAwLCAwLCAwfSwKLQl7MHg4RiwgMCwgMCwgMCwgMH0sCi0JezB4OTAsIDAsIDAsIDAsIDB9LAotCXsweDkxLCAwLCAwLCAwLCAwfSwKLQl7MHg5MiwgMCwgMCwgMCwgMH0sCi0JezB4OTMsIDAsIDAsIDAsIDB9LAotCXsweDk0LCAwLCAwLCAwLCAwfSwKLQl7MHhGRkZGLCAwLCAwLCAwLCAwfQotfTsKLQotc3RydWN0IHJhZGlvX3JlZ3MgcmVnc19TWU5fMjA1Nl9yZXY3W10gPSB7Ci0JezB4MDIsIDAsIDAsIDAsIDB9LAotCXsweDAzLCAwLCAwLCAwLCAwfSwKLQl7MHgwNCwgMCwgMCwgMCwgMH0sCi0JezB4MDUsIDAsIDAsIDAsIDB9LAotCXsweDA2LCAwLCAwLCAwLCAwfSwKLQl7MHgwNywgMCwgMCwgMCwgMH0sCi0JezB4MDgsIDAsIDAsIDAsIDB9LAotCXsweDA5LCAweDEsIDB4MSwgMCwgMH0sCi0JezB4MEEsIDAsIDAsIDAsIDB9LAotCXsweDBCLCAwLCAwLCAwLCAwfSwKLQl7MHgwQywgMCwgMCwgMCwgMH0sCi0JezB4MEQsIDAsIDAsIDAsIDB9LAotCXsweDBFLCAwLCAwLCAwLCAwfSwKLQl7MHgwRiwgMCwgMCwgMCwgMH0sCi0JezB4MTAsIDAsIDAsIDAsIDB9LAotCXsweDExLCAwLCAwLCAwLCAwfSwKLQl7MHgxMiwgMCwgMCwgMCwgMH0sCi0JezB4MTMsIDAsIDAsIDAsIDB9LAotCXsweDE0LCAwLCAwLCAwLCAwfSwKLQl7MHgxNSwgMCwgMCwgMCwgMH0sCi0JezB4MTYsIDAsIDAsIDAsIDB9LAotCXsweDE3LCAwLCAwLCAwLCAwfSwKLQl7MHgxOCwgMCwgMCwgMCwgMH0sCi0JezB4MTksIDAsIDAsIDAsIDB9LAotCXsweDFBLCAwLCAwLCAwLCAwfSwKLQl7MHgxQiwgMCwgMCwgMCwgMH0sCi0JezB4MUMsIDAsIDAsIDAsIDB9LAotCXsweDFELCAwLCAwLCAwLCAwfSwKLQl7MHgxRSwgMCwgMCwgMCwgMH0sCi0JezB4MUYsIDAsIDAsIDAsIDB9LAotCXsweDIwLCAwLCAwLCAwLCAwfSwKLQl7MHgyMSwgMCwgMCwgMCwgMH0sCi0JezB4MjIsIDB4NjAsIDB4NjAsIDAsIDB9LAotCXsweDIzLCAweDYsIDB4NiwgMCwgMH0sCi0JezB4MjQsIDB4YywgMHhjLCAwLCAwfSwKLQl7MHgyNSwgMCwgMCwgMCwgMH0sCi0JezB4MjYsIDAsIDAsIDAsIDB9LAotCXsweDI3LCAwLCAwLCAwLCAwfSwKLQl7MHgyOCwgMHgxLCAweDEsIDAsIDB9LAotCXsweDI5LCAwLCAwLCAwLCAwfSwKLQl7MHgyQSwgMCwgMCwgMCwgMH0sCi0JezB4MkIsIDAsIDAsIDAsIDB9LAotCXsweDJDLCAwLCAwLCAwLCAwfSwKLQl7MHgyRCwgMCwgMCwgMCwgMH0sCi0JezB4MkUsIDAsIDAsIDAsIDB9LAotCXsweDJGLCAweDFmLCAweDFmLCAwLCAwfSwKLQl7MHgzMCwgMHgxNSwgMHgxNSwgMCwgMH0sCi0JezB4MzEsIDB4ZiwgMHhmLCAwLCAwfSwKLQl7MHgzMiwgMCwgMCwgMCwgMH0sCi0JezB4MzMsIDAsIDAsIDAsIDB9LAotCXsweDM0LCAwLCAwLCAwLCAwfSwKLQl7MHgzNSwgMCwgMCwgMCwgMH0sCi0JezB4MzYsIDAsIDAsIDAsIDB9LAotCXsweDM3LCAwLCAwLCAwLCAwfSwKLQl7MHgzOCwgMCwgMCwgMCwgMH0sCi0JezB4MzksIDAsIDAsIDAsIDB9LAotCXsweDNBLCAwLCAwLCAwLCAwfSwKLQl7MHgzQiwgMCwgMCwgMCwgMH0sCi0JezB4M0MsIDB4MTMsIDB4MTMsIDAsIDB9LAotCXsweDNELCAweGYsIDB4ZiwgMCwgMH0sCi0JezB4M0UsIDB4MTgsIDB4MTgsIDAsIDB9LAotCXsweDNGLCAwLCAwLCAwLCAwfSwKLQl7MHg0MCwgMCwgMCwgMCwgMH0sCi0JezB4NDEsIDB4MjAsIDB4MjAsIDAsIDB9LAotCXsweDQyLCAweDIwLCAweDIwLCAwLCAwfSwKLQl7MHg0MywgMCwgMCwgMCwgMH0sCi0JezB4NDQsIDB4NzcsIDB4NzcsIDAsIDB9LAotCXsweDQ1LCAweDcsIDB4NywgMCwgMH0sCi0JezB4NDYsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHg0NywgMHg0LCAweDQsIDAsIDB9LAotCXsweDQ4LCAweGYsIDB4ZiwgMCwgMH0sCi0JezB4NDksIDB4MzAsIDB4MzAsIDAsIDB9LAotCXsweDRBLCAweDMyLCAweDMyLCAwLCAwfSwKLQl7MHg0QiwgMHhkLCAweGQsIDAsIDB9LAotCXsweDRDLCAweGQsIDB4ZCwgMCwgMH0sCi0JezB4NEQsIDB4NCwgMHg0LCAwLCAwfSwKLQl7MHg0RSwgMHg2LCAweDYsIDAsIDB9LAotCXsweDRGLCAweDEsIDB4MSwgMCwgMH0sCi0JezB4NTAsIDB4MWMsIDB4MWMsIDAsIDB9LAotCXsweDUxLCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NTIsIDB4MiwgMHgyLCAwLCAwfSwKLQl7MHg1MywgMHhmNywgMHhmNywgMSwgMX0sCi0JezB4NTQsIDB4YjQsIDB4YjQsIDAsIDB9LAotCXsweDU1LCAweGQyLCAweGQyLCAwLCAwfSwKLQl7MHg1NiwgMCwgMCwgMCwgMH0sCi0JezB4NTcsIDAsIDAsIDAsIDB9LAotCXsweDU4LCAweDQsIDB4NCwgMCwgMH0sCi0JezB4NTksIDB4OTYsIDB4OTYsIDAsIDB9LAotCXsweDVBLCAweDNlLCAweDNlLCAwLCAwfSwKLQl7MHg1QiwgMHgzZSwgMHgzZSwgMCwgMH0sCi0JezB4NUMsIDB4MTMsIDB4MTMsIDAsIDB9LAotCXsweDVELCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NUUsIDAsIDAsIDAsIDB9LAotCXsweDVGLCAweDcsIDB4NywgMCwgMH0sCi0JezB4NjAsIDB4NywgMHg3LCAxLCAxfSwKLQl7MHg2MSwgMHg4LCAweDgsIDAsIDB9LAotCXsweDYyLCAweDMsIDB4MywgMCwgMH0sCi0JezB4NjMsIDAsIDAsIDAsIDB9LAotCXsweDY0LCAwLCAwLCAwLCAwfSwKLQl7MHg2NSwgMCwgMCwgMCwgMH0sCi0JezB4NjYsIDAsIDAsIDAsIDB9LAotCXsweDY3LCAwLCAwLCAwLCAwfSwKLQl7MHg2OCwgMHg0MCwgMHg0MCwgMCwgMH0sCi0JezB4NjksIDAsIDAsIDAsIDB9LAotCXsweDZBLCAwLCAwLCAwLCAwfSwKLQl7MHg2QiwgMCwgMCwgMCwgMH0sCi0JezB4NkMsIDAsIDAsIDAsIDB9LAotCXsweDZELCAweDEsIDB4MSwgMCwgMH0sCi0JezB4NkUsIDAsIDAsIDAsIDB9LAotCXsweDZGLCAwLCAwLCAwLCAwfSwKLQl7MHg3MCwgMHg2MCwgMHg2MCwgMCwgMH0sCi0JezB4NzEsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweDcyLCAweGMsIDB4YywgMCwgMH0sCi0JezB4NzMsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweDc0LCAweDhmLCAweDhmLCAxLCAxfSwKLQl7MHg3NSwgMCwgMCwgMCwgMH0sCi0JezB4NzYsIDB4Y2MsIDB4Y2MsIDAsIDB9LAotCXsweDc3LCAweDEsIDB4MSwgMCwgMH0sCi0JezB4NzgsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweDc5LCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHg3QSwgMCwgMCwgMCwgMH0sCi0JezB4N0IsIDAsIDAsIDAsIDB9LAotCXsweDdDLCAwLCAwLCAwLCAwfSwKLQl7MHg3RCwgMCwgMCwgMCwgMH0sCi0JezB4N0UsIDAsIDAsIDAsIDB9LAotCXsweDdGLCAwLCAwLCAwLCAwfSwKLQl7MHg4MCwgMCwgMCwgMCwgMH0sCi0JezB4ODEsIDAsIDAsIDAsIDB9LAotCXsweDgyLCAwLCAwLCAwLCAwfSwKLQl7MHg4MywgMCwgMCwgMCwgMH0sCi0JezB4ODQsIDAsIDAsIDAsIDB9LAotCXsweDg1LCAweGZmLCAweGZmLCAwLCAwfSwKLQl7MHg4NiwgMCwgMCwgMCwgMH0sCi0JezB4ODcsIDAsIDAsIDAsIDB9LAotCXsweDg4LCAwLCAwLCAwLCAwfSwKLQl7MHg4OSwgMCwgMCwgMCwgMH0sCi0JezB4OEEsIDAsIDAsIDAsIDB9LAotCXsweDhCLCAwLCAwLCAwLCAwfSwKLQl7MHg4QywgMCwgMCwgMCwgMH0sCi0JezB4OEQsIDAsIDAsIDAsIDB9LAotCXsweDhFLCAwLCAwLCAwLCAwfSwKLQl7MHg4RiwgMCwgMCwgMCwgMH0sCi0JezB4OTAsIDAsIDAsIDAsIDB9LAotCXsweDkxLCAwLCAwLCAwLCAwfSwKLQl7MHg5MiwgMCwgMCwgMCwgMH0sCi0JezB4OTMsIDAsIDAsIDAsIDB9LAotCXsweDk0LCAwLCAwLCAwLCAwfSwKLQl7MHg5NSwgMCwgMCwgMCwgMH0sCi0JezB4OTYsIDAsIDAsIDAsIDB9LAotCXsweDk3LCAwLCAwLCAwLCAwfSwKLQl7MHg5OCwgMCwgMCwgMCwgMH0sCi0JezB4OTksIDAsIDAsIDAsIDB9LAotCXsweDlBLCAwLCAwLCAwLCAwfSwKLQl7MHg5QiwgMCwgMCwgMCwgMH0sCi0JezB4OUMsIDAsIDAsIDAsIDB9LAotCXsweDlELCAwLCAwLCAwLCAwfSwKLQl7MHg5RSwgMCwgMCwgMCwgMH0sCi0JezB4OUYsIDB4NiwgMHg2LCAwLCAwfSwKLQl7MHhBMCwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QTEsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEEyLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBMywgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QTQsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEE1LCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBNiwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QTcsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEE4LCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBOSwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QUEsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEFCLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBQywgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QUQsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEFFLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBRiwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QjAsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEIxLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhCMiwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QjMsIDB4YSwgMHhhLCAwLCAwfSwKLQl7MHhCNCwgMCwgMCwgMCwgMH0sCi0JezB4QjUsIDAsIDAsIDAsIDB9LAotCXsweEI2LCAwLCAwLCAwLCAwfSwKLQl7MHhGRkZGLCAwLCAwLCAwLCAwfSwKLX07Ci0KLXN0cnVjdCByYWRpb19yZWdzIHJlZ3NfVFhfMjA1Nl9yZXY3W10gPSB7Ci0JezB4MDIsIDAsIDAsIDAsIDB9LAotCXsweDAzLCAwLCAwLCAwLCAwfSwKLQl7MHgwNCwgMCwgMCwgMCwgMH0sCi0JezB4MDUsIDAsIDAsIDAsIDB9LAotCXsweDA2LCAwLCAwLCAwLCAwfSwKLQl7MHgwNywgMCwgMCwgMCwgMH0sCi0JezB4MDgsIDAsIDAsIDAsIDB9LAotCXsweDA5LCAwLCAwLCAwLCAwfSwKLQl7MHgwQSwgMCwgMCwgMCwgMH0sCi0JezB4MEIsIDAsIDAsIDAsIDB9LAotCXsweDBDLCAwLCAwLCAwLCAwfSwKLQl7MHgwRCwgMCwgMCwgMCwgMH0sCi0JezB4MEUsIDAsIDAsIDAsIDB9LAotCXsweDBGLCAwLCAwLCAwLCAwfSwKLQl7MHgxMCwgMCwgMCwgMCwgMH0sCi0JezB4MTEsIDAsIDAsIDAsIDB9LAotCXsweDEyLCAwLCAwLCAwLCAwfSwKLQl7MHgxMywgMCwgMCwgMCwgMH0sCi0JezB4MTQsIDAsIDAsIDAsIDB9LAotCXsweDE1LCAwLCAwLCAwLCAwfSwKLQl7MHgxNiwgMCwgMCwgMCwgMH0sCi0JezB4MTcsIDAsIDAsIDAsIDB9LAotCXsweDE4LCAwLCAwLCAwLCAwfSwKLQl7MHgxOSwgMCwgMCwgMCwgMH0sCi0JezB4MUEsIDAsIDAsIDAsIDB9LAotCXsweDFCLCAwLCAwLCAwLCAwfSwKLQl7MHgxQywgMCwgMCwgMCwgMH0sCi0JezB4MUQsIDAsIDAsIDAsIDB9LAotCXsweDFFLCAwLCAwLCAwLCAwfSwKLQl7MHgxRiwgMCwgMCwgMCwgMH0sCi0JezB4MjAsIDAsIDAsIDAsIDB9LAotCXsweDIxLCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHgyMiwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4MjMsIDB4ODgsIDB4ODgsIDAsIDB9LAotCXsweDI0LCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHgyNSwgMHhjLCAweGMsIDAsIDB9LAotCXsweDI2LCAwLCAwLCAwLCAwfSwKLQl7MHgyNywgMHgzLCAweDMsIDAsIDB9LAotCXsweDI4LCAwLCAwLCAwLCAwfSwKLQl7MHgyOSwgMHgzLCAweDMsIDAsIDB9LAotCXsweDJBLCAweDM3LCAweDM3LCAwLCAwfSwKLQl7MHgyQiwgMHgzLCAweDMsIDAsIDB9LAotCXsweDJDLCAwLCAwLCAwLCAwfSwKLQl7MHgyRCwgMCwgMCwgMCwgMH0sCi0JezB4MkUsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHgyRiwgMHgxLCAweDEsIDAsIDB9LAotCXsweDMwLCAwLCAwLCAwLCAwfSwKLQl7MHgzMSwgMCwgMCwgMCwgMH0sCi0JezB4MzIsIDAsIDAsIDAsIDB9LAotCXsweDMzLCAweDExLCAweDExLCAwLCAwfSwKLQl7MHgzNCwgMHhlZSwgMHhlZSwgMSwgMX0sCi0JezB4MzUsIDAsIDAsIDAsIDB9LAotCXsweDM2LCAwLCAwLCAwLCAwfSwKLQl7MHgzNywgMHgzLCAweDMsIDAsIDB9LAotCXsweDM4LCAweDUwLCAweDUwLCAxLCAxfSwKLQl7MHgzOSwgMCwgMCwgMCwgMH0sCi0JezB4M0EsIDB4NTAsIDB4NTAsIDEsIDF9LAotCXsweDNCLCAwLCAwLCAwLCAwfSwKLQl7MHgzQywgMHg2ZSwgMHg2ZSwgMCwgMH0sCi0JezB4M0QsIDB4ZjAsIDB4ZjAsIDEsIDF9LAotCXsweDNFLCAwLCAwLCAwLCAwfSwKLQl7MHgzRiwgMCwgMCwgMCwgMH0sCi0JezB4NDAsIDAsIDAsIDAsIDB9LAotCXsweDQxLCAweDMsIDB4MywgMCwgMH0sCi0JezB4NDIsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHg0MywgMCwgMCwgMCwgMH0sCi0JezB4NDQsIDB4MWUsIDB4MWUsIDAsIDB9LAotCXsweDQ1LCAwLCAwLCAwLCAwfSwKLQl7MHg0NiwgMHg2ZSwgMHg2ZSwgMCwgMH0sCi0JezB4NDcsIDB4ZjAsIDB4ZjAsIDEsIDF9LAotCXsweDQ4LCAwLCAwLCAwLCAwfSwKLQl7MHg0OSwgMHgyLCAweDIsIDAsIDB9LAotCXsweDRBLCAweGZmLCAweGZmLCAxLCAxfSwKLQl7MHg0QiwgMHhjLCAweGMsIDAsIDB9LAotCXsweDRDLCAwLCAwLCAwLCAwfSwKLQl7MHg0RCwgMHgzOCwgMHgzOCwgMCwgMH0sCi0JezB4NEUsIDB4NzAsIDB4NzAsIDEsIDF9LAotCXsweDRGLCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NTAsIDB4ODgsIDB4ODgsIDAsIDB9LAotCXsweDUxLCAweGMsIDB4YywgMCwgMH0sCi0JezB4NTIsIDAsIDAsIDAsIDB9LAotCXsweDUzLCAweDgsIDB4OCwgMCwgMH0sCi0JezB4NTQsIDB4NzAsIDB4NzAsIDEsIDF9LAotCXsweDU1LCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NTYsIDB4ZmYsIDB4ZmYsIDEsIDF9LAotCXsweDU3LCAwLCAwLCAwLCAwfSwKLQl7MHg1OCwgMHg4MywgMHg4MywgMCwgMH0sCi0JezB4NTksIDB4NzcsIDB4NzcsIDEsIDF9LAotCXsweDVBLCAwLCAwLCAwLCAwfSwKLQl7MHg1QiwgMHgyLCAweDIsIDAsIDB9LAotCXsweDVDLCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHg1RCwgMCwgMCwgMCwgMH0sCi0JezB4NUUsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHg1RiwgMHg3NywgMHg3NywgMSwgMX0sCi0JezB4NjAsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHg2MSwgMCwgMCwgMCwgMH0sCi0JezB4NjIsIDB4NywgMHg3LCAwLCAwfSwKLQl7MHg2MywgMCwgMCwgMCwgMH0sCi0JezB4NjQsIDB4NywgMHg3LCAwLCAwfSwKLQl7MHg2NSwgMCwgMCwgMCwgMH0sCi0JezB4NjYsIDAsIDAsIDAsIDB9LAotCXsweDY3LCAwLCAwLCAxLCAxfSwKLQl7MHg2OCwgMCwgMCwgMCwgMH0sCi0JezB4NjksIDB4YSwgMHhhLCAwLCAwfSwKLQl7MHg2QSwgMCwgMCwgMCwgMH0sCi0JezB4NkIsIDAsIDAsIDAsIDB9LAotCXsweDZDLCAwLCAwLCAwLCAwfSwKLQl7MHg2RCwgMCwgMCwgMCwgMH0sCi0JezB4NkUsIDAsIDAsIDAsIDB9LAotCXsweDZGLCAwLCAwLCAwLCAwfSwKLQl7MHg3MCwgMCwgMCwgMCwgMH0sCi0JezB4NzEsIDB4MiwgMHgyLCAwLCAwfSwKLQl7MHg3MiwgMCwgMCwgMCwgMH0sCi0JezB4NzMsIDAsIDAsIDAsIDB9LAotCXsweDc0LCAweGUsIDB4ZSwgMCwgMH0sCi0JezB4NzUsIDB4ZSwgMHhlLCAwLCAwfSwKLQl7MHg3NiwgMHhlLCAweGUsIDAsIDB9LAotCXsweDc3LCAweDEzLCAweDEzLCAwLCAwfSwKLQl7MHg3OCwgMHgxMywgMHgxMywgMCwgMH0sCi0JezB4NzksIDB4MWIsIDB4MWIsIDAsIDB9LAotCXsweDdBLCAweDFiLCAweDFiLCAwLCAwfSwKLQl7MHg3QiwgMHg1NSwgMHg1NSwgMCwgMH0sCi0JezB4N0MsIDB4NWIsIDB4NWIsIDAsIDB9LAotCXsweDdELCAweDMwLCAweDMwLCAxLCAxfSwKLQl7MHg3RSwgMCwgMCwgMCwgMH0sCi0JezB4N0YsIDAsIDAsIDAsIDB9LAotCXsweDgwLCAwLCAwLCAwLCAwfSwKLQl7MHg4MSwgMCwgMCwgMCwgMH0sCi0JezB4ODIsIDAsIDAsIDAsIDB9LAotCXsweDgzLCAwLCAwLCAwLCAwfSwKLQl7MHg4NCwgMCwgMCwgMCwgMH0sCi0JezB4ODUsIDAsIDAsIDAsIDB9LAotCXsweDg2LCAwLCAwLCAwLCAwfSwKLQl7MHg4NywgMCwgMCwgMCwgMH0sCi0JezB4ODgsIDAsIDAsIDAsIDB9LAotCXsweDg5LCAwLCAwLCAwLCAwfSwKLQl7MHg4QSwgMCwgMCwgMCwgMH0sCi0JezB4OEIsIDAsIDAsIDAsIDB9LAotCXsweDhDLCAwLCAwLCAwLCAwfSwKLQl7MHg4RCwgMCwgMCwgMCwgMH0sCi0JezB4OEUsIDAsIDAsIDAsIDB9LAotCXsweDhGLCAwLCAwLCAwLCAwfSwKLQl7MHg5MCwgMCwgMCwgMCwgMH0sCi0JezB4OTEsIDAsIDAsIDAsIDB9LAotCXsweDkyLCAwLCAwLCAwLCAwfSwKLQl7MHg5MywgMHg3MCwgMHg3MCwgMCwgMH0sCi0JezB4OTQsIDB4NzAsIDB4NzAsIDAsIDB9LAotCXsweDk1LCAweDcxLCAweDcxLCAxLCAxfSwKLQl7MHg5NiwgMHg3MSwgMHg3MSwgMSwgMX0sCi0JezB4OTcsIDB4NzIsIDB4NzIsIDEsIDF9LAotCXsweDk4LCAweDczLCAweDczLCAxLCAxfSwKLQl7MHg5OSwgMHg3NCwgMHg3NCwgMSwgMX0sCi0JezB4OUEsIDB4NzUsIDB4NzUsIDEsIDF9LAotCXsweEZGRkYsIDAsIDAsIDAsIDB9LAotfTsKLQotc3RydWN0IHJhZGlvX3JlZ3MgcmVnc19SWF8yMDU2X3JldjdbXSA9IHsKLQl7MHgwMiwgMCwgMCwgMCwgMH0sCi0JezB4MDMsIDAsIDAsIDAsIDB9LAotCXsweDA0LCAwLCAwLCAwLCAwfSwKLQl7MHgwNSwgMCwgMCwgMCwgMH0sCi0JezB4MDYsIDAsIDAsIDAsIDB9LAotCXsweDA3LCAwLCAwLCAwLCAwfSwKLQl7MHgwOCwgMCwgMCwgMCwgMH0sCi0JezB4MDksIDAsIDAsIDAsIDB9LAotCXsweDBBLCAwLCAwLCAwLCAwfSwKLQl7MHgwQiwgMCwgMCwgMCwgMH0sCi0JezB4MEMsIDAsIDAsIDAsIDB9LAotCXsweDBELCAwLCAwLCAwLCAwfSwKLQl7MHgwRSwgMCwgMCwgMCwgMH0sCi0JezB4MEYsIDAsIDAsIDAsIDB9LAotCXsweDEwLCAwLCAwLCAwLCAwfSwKLQl7MHgxMSwgMCwgMCwgMCwgMH0sCi0JezB4MTIsIDAsIDAsIDAsIDB9LAotCXsweDEzLCAwLCAwLCAwLCAwfSwKLQl7MHgxNCwgMCwgMCwgMCwgMH0sCi0JezB4MTUsIDAsIDAsIDAsIDB9LAotCXsweDE2LCAwLCAwLCAwLCAwfSwKLQl7MHgxNywgMCwgMCwgMCwgMH0sCi0JezB4MTgsIDAsIDAsIDAsIDB9LAotCXsweDE5LCAwLCAwLCAwLCAwfSwKLQl7MHgxQSwgMCwgMCwgMCwgMH0sCi0JezB4MUIsIDAsIDAsIDAsIDB9LAotCXsweDFDLCAwLCAwLCAwLCAwfSwKLQl7MHgxRCwgMCwgMCwgMCwgMH0sCi0JezB4MUUsIDAsIDAsIDAsIDB9LAotCXsweDFGLCAwLCAwLCAwLCAwfSwKLQl7MHgyMCwgMHgzLCAweDMsIDAsIDB9LAotCXsweDIxLCAwLCAwLCAwLCAwfSwKLQl7MHgyMiwgMCwgMCwgMCwgMH0sCi0JezB4MjMsIDB4OTAsIDB4OTAsIDAsIDB9LAotCXsweDI0LCAweDU1LCAweDU1LCAwLCAwfSwKLQl7MHgyNSwgMHgxNSwgMHgxNSwgMCwgMH0sCi0JezB4MjYsIDB4NSwgMHg1LCAwLCAwfSwKLQl7MHgyNywgMHgxNSwgMHgxNSwgMCwgMH0sCi0JezB4MjgsIDB4NSwgMHg1LCAwLCAwfSwKLQl7MHgyOSwgMHgyMCwgMHgyMCwgMCwgMH0sCi0JezB4MkEsIDB4MTEsIDB4MTEsIDAsIDB9LAotCXsweDJCLCAweDkwLCAweDkwLCAwLCAwfSwKLQl7MHgyQywgMCwgMCwgMCwgMH0sCi0JezB4MkQsIDB4ODgsIDB4ODgsIDAsIDB9LAotCXsweDJFLCAweDMyLCAweDMyLCAwLCAwfSwKLQl7MHgyRiwgMHg3NywgMHg3NywgMCwgMH0sCi0JezB4MzAsIDB4MTcsIDB4MTcsIDEsIDF9LAotCXsweDMxLCAweGZmLCAweGZmLCAxLCAxfSwKLQl7MHgzMiwgMHgyMCwgMHgyMCwgMCwgMH0sCi0JezB4MzMsIDAsIDAsIDAsIDB9LAotCXsweDM0LCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHgzNSwgMHgzMiwgMHgzMiwgMCwgMH0sCi0JezB4MzYsIDB4NzcsIDB4NzcsIDAsIDB9LAotCXsweDM3LCAweDE3LCAweDE3LCAxLCAxfSwKLQl7MHgzOCwgMHhmMCwgMHhmMCwgMSwgMX0sCi0JezB4MzksIDB4MjAsIDB4MjAsIDAsIDB9LAotCXsweDNBLCAweDgsIDB4OCwgMCwgMH0sCi0JezB4M0IsIDB4NTUsIDB4NTUsIDEsIDF9LAotCXsweDNDLCAwLCAwLCAwLCAwfSwKLQl7MHgzRCwgMHg4OCwgMHg4OCwgMSwgMX0sCi0JezB4M0UsIDAsIDAsIDAsIDB9LAotCXsweDNGLCAwLCAwLCAxLCAxfSwKLQl7MHg0MCwgMHg3LCAweDcsIDEsIDF9LAotCXsweDQxLCAweDYsIDB4NiwgMCwgMH0sCi0JezB4NDIsIDB4NCwgMHg0LCAwLCAwfSwKLQl7MHg0MywgMCwgMCwgMCwgMH0sCi0JezB4NDQsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHg0NSwgMHg1NSwgMHg1NSwgMSwgMX0sCi0JezB4NDYsIDAsIDAsIDAsIDB9LAotCXsweDQ3LCAweDExLCAweDExLCAwLCAwfSwKLQl7MHg0OCwgMCwgMCwgMCwgMH0sCi0JezB4NDksIDAsIDAsIDEsIDF9LAotCXsweDRBLCAweDcsIDB4NywgMCwgMH0sCi0JezB4NEIsIDB4NiwgMHg2LCAwLCAwfSwKLQl7MHg0QywgMHg0LCAweDQsIDAsIDB9LAotCXsweDRELCAwLCAwLCAwLCAwfSwKLQl7MHg0RSwgMCwgMCwgMCwgMH0sCi0JezB4NEYsIDB4MjYsIDB4MjYsIDEsIDF9LAotCXsweDUwLCAweDI2LCAweDI2LCAxLCAxfSwKLQl7MHg1MSwgMHhmLCAweGYsIDEsIDF9LAotCXsweDUyLCAweGYsIDB4ZiwgMSwgMX0sCi0JezB4NTMsIDB4NDQsIDB4NDQsIDAsIDB9LAotCXsweDU0LCAwLCAwLCAwLCAwfSwKLQl7MHg1NSwgMCwgMCwgMCwgMH0sCi0JezB4NTYsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHg1NywgMHg4LCAweDgsIDAsIDB9LAotCXsweDU4LCAweDcsIDB4NywgMCwgMH0sCi0JezB4NTksIDB4MjIsIDB4MjIsIDAsIDB9LAotCXsweDVBLCAweDIyLCAweDIyLCAwLCAwfSwKLQl7MHg1QiwgMHgyLCAweDIsIDAsIDB9LAotCXsweDVDLCAweDQsIDB4NCwgMSwgMX0sCi0JezB4NUQsIDB4NywgMHg3LCAwLCAwfSwKLQl7MHg1RSwgMHg1NSwgMHg1NSwgMCwgMH0sCi0JezB4NUYsIDB4MjMsIDB4MjMsIDAsIDB9LAotCXsweDYwLCAweDQxLCAweDQxLCAwLCAwfSwKLQl7MHg2MSwgMHgxLCAweDEsIDAsIDB9LAotCXsweDYyLCAweGEsIDB4YSwgMCwgMH0sCi0JezB4NjMsIDAsIDAsIDAsIDB9LAotCXsweDY0LCAwLCAwLCAwLCAwfSwKLQl7MHg2NSwgMCwgMCwgMCwgMH0sCi0JezB4NjYsIDAsIDAsIDAsIDB9LAotCXsweDY3LCAwLCAwLCAwLCAwfSwKLQl7MHg2OCwgMCwgMCwgMCwgMH0sCi0JezB4NjksIDAsIDAsIDAsIDB9LAotCXsweDZBLCAwLCAwLCAwLCAwfSwKLQl7MHg2QiwgMHhjLCAweGMsIDAsIDB9LAotCXsweDZDLCAwLCAwLCAwLCAwfSwKLQl7MHg2RCwgMCwgMCwgMCwgMH0sCi0JezB4NkUsIDAsIDAsIDAsIDB9LAotCXsweDZGLCAwLCAwLCAwLCAwfSwKLQl7MHg3MCwgMCwgMCwgMCwgMH0sCi0JezB4NzEsIDAsIDAsIDAsIDB9LAotCXsweDcyLCAweDIyLCAweDIyLCAwLCAwfSwKLQl7MHg3MywgMHgyMiwgMHgyMiwgMCwgMH0sCi0JezB4NzQsIDAsIDAsIDEsIDF9LAotCXsweDc1LCAweGEsIDB4YSwgMCwgMH0sCi0JezB4NzYsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHg3NywgMHgyMiwgMHgyMiwgMCwgMH0sCi0JezB4NzgsIDB4MzAsIDB4MzAsIDAsIDB9LAotCXsweDc5LCAwLCAwLCAwLCAwfSwKLQl7MHg3QSwgMCwgMCwgMCwgMH0sCi0JezB4N0IsIDAsIDAsIDAsIDB9LAotCXsweDdDLCAwLCAwLCAwLCAwfSwKLQl7MHg3RCwgMCwgMCwgMCwgMH0sCi0JezB4N0UsIDAsIDAsIDAsIDB9LAotCXsweDdGLCAwLCAwLCAwLCAwfSwKLQl7MHg4MCwgMCwgMCwgMCwgMH0sCi0JezB4ODEsIDAsIDAsIDAsIDB9LAotCXsweDgyLCAwLCAwLCAwLCAwfSwKLQl7MHg4MywgMCwgMCwgMCwgMH0sCi0JezB4ODQsIDAsIDAsIDAsIDB9LAotCXsweDg1LCAwLCAwLCAwLCAwfSwKLQl7MHg4NiwgMCwgMCwgMCwgMH0sCi0JezB4ODcsIDAsIDAsIDAsIDB9LAotCXsweDg4LCAwLCAwLCAwLCAwfSwKLQl7MHg4OSwgMCwgMCwgMCwgMH0sCi0JezB4OEEsIDAsIDAsIDAsIDB9LAotCXsweDhCLCAwLCAwLCAwLCAwfSwKLQl7MHg4QywgMCwgMCwgMCwgMH0sCi0JezB4OEQsIDAsIDAsIDAsIDB9LAotCXsweDhFLCAwLCAwLCAwLCAwfSwKLQl7MHg4RiwgMCwgMCwgMCwgMH0sCi0JezB4OTAsIDAsIDAsIDAsIDB9LAotCXsweDkxLCAwLCAwLCAwLCAwfSwKLQl7MHg5MiwgMCwgMCwgMCwgMH0sCi0JezB4OTMsIDAsIDAsIDAsIDB9LAotCXsweDk0LCAwLCAwLCAwLCAwfSwKLQl7MHhGRkZGLCAwLCAwLCAwLCAwfSwKLX07Ci0KLXN0cnVjdCByYWRpb19yZWdzIHJlZ3NfU1lOXzIwNTZfcmV2OFtdID0gewotCXsweDAyLCAwLCAwLCAwLCAwfSwKLQl7MHgwMywgMCwgMCwgMCwgMH0sCi0JezB4MDQsIDAsIDAsIDAsIDB9LAotCXsweDA1LCAwLCAwLCAwLCAwfSwKLQl7MHgwNiwgMCwgMCwgMCwgMH0sCi0JezB4MDcsIDAsIDAsIDAsIDB9LAotCXsweDA4LCAwLCAwLCAwLCAwfSwKLQl7MHgwOSwgMHgxLCAweDEsIDAsIDB9LAotCXsweDBBLCAwLCAwLCAwLCAwfSwKLQl7MHgwQiwgMCwgMCwgMCwgMH0sCi0JezB4MEMsIDAsIDAsIDAsIDB9LAotCXsweDBELCAwLCAwLCAwLCAwfSwKLQl7MHgwRSwgMCwgMCwgMCwgMH0sCi0JezB4MEYsIDAsIDAsIDAsIDB9LAotCXsweDEwLCAwLCAwLCAwLCAwfSwKLQl7MHgxMSwgMCwgMCwgMCwgMH0sCi0JezB4MTIsIDAsIDAsIDAsIDB9LAotCXsweDEzLCAwLCAwLCAwLCAwfSwKLQl7MHgxNCwgMCwgMCwgMCwgMH0sCi0JezB4MTUsIDAsIDAsIDAsIDB9LAotCXsweDE2LCAwLCAwLCAwLCAwfSwKLQl7MHgxNywgMCwgMCwgMCwgMH0sCi0JezB4MTgsIDAsIDAsIDAsIDB9LAotCXsweDE5LCAwLCAwLCAwLCAwfSwKLQl7MHgxQSwgMCwgMCwgMCwgMH0sCi0JezB4MUIsIDAsIDAsIDAsIDB9LAotCXsweDFDLCAwLCAwLCAwLCAwfSwKLQl7MHgxRCwgMCwgMCwgMCwgMH0sCi0JezB4MUUsIDAsIDAsIDAsIDB9LAotCXsweDFGLCAwLCAwLCAwLCAwfSwKLQl7MHgyMCwgMCwgMCwgMCwgMH0sCi0JezB4MjEsIDAsIDAsIDAsIDB9LAotCXsweDIyLCAweDYwLCAweDYwLCAwLCAwfSwKLQl7MHgyMywgMHg2LCAweDYsIDAsIDB9LAotCXsweDI0LCAweGMsIDB4YywgMCwgMH0sCi0JezB4MjUsIDAsIDAsIDAsIDB9LAotCXsweDI2LCAwLCAwLCAwLCAwfSwKLQl7MHgyNywgMCwgMCwgMCwgMH0sCi0JezB4MjgsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHgyOSwgMCwgMCwgMCwgMH0sCi0JezB4MkEsIDAsIDAsIDAsIDB9LAotCXsweDJCLCAwLCAwLCAwLCAwfSwKLQl7MHgyQywgMCwgMCwgMCwgMH0sCi0JezB4MkQsIDAsIDAsIDAsIDB9LAotCXsweDJFLCAwLCAwLCAwLCAwfSwKLQl7MHgyRiwgMHgxZiwgMHgxZiwgMCwgMH0sCi0JezB4MzAsIDB4MTUsIDB4MTUsIDAsIDB9LAotCXsweDMxLCAweGYsIDB4ZiwgMCwgMH0sCi0JezB4MzIsIDAsIDAsIDAsIDB9LAotCXsweDMzLCAwLCAwLCAwLCAwfSwKLQl7MHgzNCwgMCwgMCwgMCwgMH0sCi0JezB4MzUsIDAsIDAsIDAsIDB9LAotCXsweDM2LCAwLCAwLCAwLCAwfSwKLQl7MHgzNywgMCwgMCwgMCwgMH0sCi0JezB4MzgsIDAsIDAsIDAsIDB9LAotCXsweDM5LCAwLCAwLCAwLCAwfSwKLQl7MHgzQSwgMCwgMCwgMCwgMH0sCi0JezB4M0IsIDAsIDAsIDAsIDB9LAotCXsweDNDLCAweDEzLCAweDEzLCAwLCAwfSwKLQl7MHgzRCwgMHhmLCAweGYsIDAsIDB9LAotCXsweDNFLCAweDE4LCAweDE4LCAwLCAwfSwKLQl7MHgzRiwgMCwgMCwgMCwgMH0sCi0JezB4NDAsIDAsIDAsIDAsIDB9LAotCXsweDQxLCAweDIwLCAweDIwLCAwLCAwfSwKLQl7MHg0MiwgMHgyMCwgMHgyMCwgMCwgMH0sCi0JezB4NDMsIDAsIDAsIDAsIDB9LAotCXsweDQ0LCAweDc3LCAweDc3LCAwLCAwfSwKLQl7MHg0NSwgMHg3LCAweDcsIDAsIDB9LAotCXsweDQ2LCAweDEsIDB4MSwgMCwgMH0sCi0JezB4NDcsIDB4NCwgMHg0LCAwLCAwfSwKLQl7MHg0OCwgMHhmLCAweGYsIDAsIDB9LAotCXsweDQ5LCAweDMwLCAweDMwLCAwLCAwfSwKLQl7MHg0QSwgMHgzMiwgMHgzMiwgMCwgMH0sCi0JezB4NEIsIDB4ZCwgMHhkLCAwLCAwfSwKLQl7MHg0QywgMHhkLCAweGQsIDAsIDB9LAotCXsweDRELCAweDQsIDB4NCwgMCwgMH0sCi0JezB4NEUsIDB4NiwgMHg2LCAwLCAwfSwKLQl7MHg0RiwgMHgxLCAweDEsIDAsIDB9LAotCXsweDUwLCAweDFjLCAweDFjLCAwLCAwfSwKLQl7MHg1MSwgMHgyLCAweDIsIDAsIDB9LAotCXsweDUyLCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NTMsIDB4ZjcsIDB4ZjcsIDEsIDF9LAotCXsweDU0LCAweGI0LCAweGI0LCAwLCAwfSwKLQl7MHg1NSwgMHhkMiwgMHhkMiwgMCwgMH0sCi0JezB4NTYsIDAsIDAsIDAsIDB9LAotCXsweDU3LCAwLCAwLCAwLCAwfSwKLQl7MHg1OCwgMHg0LCAweDQsIDAsIDB9LAotCXsweDU5LCAweDk2LCAweDk2LCAwLCAwfSwKLQl7MHg1QSwgMHgzZSwgMHgzZSwgMCwgMH0sCi0JezB4NUIsIDB4M2UsIDB4M2UsIDAsIDB9LAotCXsweDVDLCAweDEzLCAweDEzLCAwLCAwfSwKLQl7MHg1RCwgMHgyLCAweDIsIDAsIDB9LAotCXsweDVFLCAwLCAwLCAwLCAwfSwKLQl7MHg1RiwgMHg3LCAweDcsIDAsIDB9LAotCXsweDYwLCAweDcsIDB4NywgMSwgMX0sCi0JezB4NjEsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHg2MiwgMHgzLCAweDMsIDAsIDB9LAotCXsweDYzLCAwLCAwLCAwLCAwfSwKLQl7MHg2NCwgMCwgMCwgMCwgMH0sCi0JezB4NjUsIDAsIDAsIDAsIDB9LAotCXsweDY2LCAwLCAwLCAwLCAwfSwKLQl7MHg2NywgMCwgMCwgMCwgMH0sCi0JezB4NjgsIDB4NDAsIDB4NDAsIDAsIDB9LAotCXsweDY5LCAwLCAwLCAwLCAwfSwKLQl7MHg2QSwgMCwgMCwgMCwgMH0sCi0JezB4NkIsIDAsIDAsIDAsIDB9LAotCXsweDZDLCAwLCAwLCAwLCAwfSwKLQl7MHg2RCwgMHgxLCAweDEsIDAsIDB9LAotCXsweDZFLCAwLCAwLCAwLCAwfSwKLQl7MHg2RiwgMCwgMCwgMCwgMH0sCi0JezB4NzAsIDB4NjAsIDB4NjAsIDAsIDB9LAotCXsweDcxLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHg3MiwgMHhjLCAweGMsIDAsIDB9LAotCXsweDczLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHg3NCwgMHg4ZiwgMHg4ZiwgMSwgMX0sCi0JezB4NzUsIDAsIDAsIDAsIDB9LAotCXsweDc2LCAweGNjLCAweGNjLCAwLCAwfSwKLQl7MHg3NywgMHgxLCAweDEsIDAsIDB9LAotCXsweDc4LCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHg3OSwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4N0EsIDAsIDAsIDAsIDB9LAotCXsweDdCLCAwLCAwLCAwLCAwfSwKLQl7MHg3QywgMCwgMCwgMCwgMH0sCi0JezB4N0QsIDAsIDAsIDAsIDB9LAotCXsweDdFLCAwLCAwLCAwLCAwfSwKLQl7MHg3RiwgMCwgMCwgMCwgMH0sCi0JezB4ODAsIDAsIDAsIDAsIDB9LAotCXsweDgxLCAwLCAwLCAwLCAwfSwKLQl7MHg4MiwgMCwgMCwgMCwgMH0sCi0JezB4ODMsIDAsIDAsIDAsIDB9LAotCXsweDg0LCAwLCAwLCAwLCAwfSwKLQl7MHg4NSwgMHhmZiwgMHhmZiwgMCwgMH0sCi0JezB4ODYsIDAsIDAsIDAsIDB9LAotCXsweDg3LCAwLCAwLCAwLCAwfSwKLQl7MHg4OCwgMCwgMCwgMCwgMH0sCi0JezB4ODksIDAsIDAsIDAsIDB9LAotCXsweDhBLCAwLCAwLCAwLCAwfSwKLQl7MHg4QiwgMCwgMCwgMCwgMH0sCi0JezB4OEMsIDAsIDAsIDAsIDB9LAotCXsweDhELCAwLCAwLCAwLCAwfSwKLQl7MHg4RSwgMCwgMCwgMCwgMH0sCi0JezB4OEYsIDAsIDAsIDAsIDB9LAotCXsweDkwLCAwLCAwLCAwLCAwfSwKLQl7MHg5MSwgMCwgMCwgMCwgMH0sCi0JezB4OTIsIDAsIDAsIDAsIDB9LAotCXsweDkzLCAwLCAwLCAwLCAwfSwKLQl7MHg5NCwgMCwgMCwgMCwgMH0sCi0JezB4OTUsIDAsIDAsIDAsIDB9LAotCXsweDk2LCAwLCAwLCAwLCAwfSwKLQl7MHg5NywgMCwgMCwgMCwgMH0sCi0JezB4OTgsIDAsIDAsIDAsIDB9LAotCXsweDk5LCAwLCAwLCAwLCAwfSwKLQl7MHg5QSwgMCwgMCwgMCwgMH0sCi0JezB4OUIsIDAsIDAsIDAsIDB9LAotCXsweDlDLCAwLCAwLCAwLCAwfSwKLQl7MHg5RCwgMCwgMCwgMCwgMH0sCi0JezB4OUUsIDAsIDAsIDAsIDB9LAotCXsweDlGLCAweDYsIDB4NiwgMCwgMH0sCi0JezB4QTAsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEExLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBMiwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QTMsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEE0LCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBNSwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QTYsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEE3LCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBOCwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QTksIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEFBLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBQiwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QUMsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEFELCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBRSwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QUYsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEIwLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhCMSwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QjIsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEIzLCAweGEsIDB4YSwgMCwgMH0sCi0JezB4QjQsIDAsIDAsIDAsIDB9LAotCXsweEI1LCAwLCAwLCAwLCAwfSwKLQl7MHhCNiwgMCwgMCwgMCwgMH0sCi0JezB4RkZGRiwgMCwgMCwgMCwgMH0sCi19OwotCi1zdHJ1Y3QgcmFkaW9fcmVncyByZWdzX1RYXzIwNTZfcmV2OFtdID0gewotCXsweDAyLCAwLCAwLCAwLCAwfSwKLQl7MHgwMywgMCwgMCwgMCwgMH0sCi0JezB4MDQsIDAsIDAsIDAsIDB9LAotCXsweDA1LCAwLCAwLCAwLCAwfSwKLQl7MHgwNiwgMCwgMCwgMCwgMH0sCi0JezB4MDcsIDAsIDAsIDAsIDB9LAotCXsweDA4LCAwLCAwLCAwLCAwfSwKLQl7MHgwOSwgMCwgMCwgMCwgMH0sCi0JezB4MEEsIDAsIDAsIDAsIDB9LAotCXsweDBCLCAwLCAwLCAwLCAwfSwKLQl7MHgwQywgMCwgMCwgMCwgMH0sCi0JezB4MEQsIDAsIDAsIDAsIDB9LAotCXsweDBFLCAwLCAwLCAwLCAwfSwKLQl7MHgwRiwgMCwgMCwgMCwgMH0sCi0JezB4MTAsIDAsIDAsIDAsIDB9LAotCXsweDExLCAwLCAwLCAwLCAwfSwKLQl7MHgxMiwgMCwgMCwgMCwgMH0sCi0JezB4MTMsIDAsIDAsIDAsIDB9LAotCXsweDE0LCAwLCAwLCAwLCAwfSwKLQl7MHgxNSwgMCwgMCwgMCwgMH0sCi0JezB4MTYsIDAsIDAsIDAsIDB9LAotCXsweDE3LCAwLCAwLCAwLCAwfSwKLQl7MHgxOCwgMCwgMCwgMCwgMH0sCi0JezB4MTksIDAsIDAsIDAsIDB9LAotCXsweDFBLCAwLCAwLCAwLCAwfSwKLQl7MHgxQiwgMCwgMCwgMCwgMH0sCi0JezB4MUMsIDAsIDAsIDAsIDB9LAotCXsweDFELCAwLCAwLCAwLCAwfSwKLQl7MHgxRSwgMCwgMCwgMCwgMH0sCi0JezB4MUYsIDAsIDAsIDAsIDB9LAotCXsweDIwLCAwLCAwLCAwLCAwfSwKLQl7MHgyMSwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4MjIsIDB4ODgsIDB4ODgsIDAsIDB9LAotCXsweDIzLCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHgyNCwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4MjUsIDB4YywgMHhjLCAwLCAwfSwKLQl7MHgyNiwgMCwgMCwgMCwgMH0sCi0JezB4MjcsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHgyOCwgMCwgMCwgMCwgMH0sCi0JezB4MjksIDB4MywgMHgzLCAwLCAwfSwKLQl7MHgyQSwgMHgzNywgMHgzNywgMCwgMH0sCi0JezB4MkIsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHgyQywgMCwgMCwgMCwgMH0sCi0JezB4MkQsIDAsIDAsIDAsIDB9LAotCXsweDJFLCAweDEsIDB4MSwgMCwgMH0sCi0JezB4MkYsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHgzMCwgMCwgMCwgMCwgMH0sCi0JezB4MzEsIDAsIDAsIDAsIDB9LAotCXsweDMyLCAwLCAwLCAwLCAwfSwKLQl7MHgzMywgMHgxMSwgMHgxMSwgMCwgMH0sCi0JezB4MzQsIDB4ZWUsIDB4ZWUsIDEsIDF9LAotCXsweDM1LCAwLCAwLCAwLCAwfSwKLQl7MHgzNiwgMCwgMCwgMCwgMH0sCi0JezB4MzcsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHgzOCwgMHg1MCwgMHg1MCwgMSwgMX0sCi0JezB4MzksIDAsIDAsIDAsIDB9LAotCXsweDNBLCAweDUwLCAweDUwLCAxLCAxfSwKLQl7MHgzQiwgMCwgMCwgMCwgMH0sCi0JezB4M0MsIDB4NmUsIDB4NmUsIDAsIDB9LAotCXsweDNELCAweGYwLCAweGYwLCAxLCAxfSwKLQl7MHgzRSwgMCwgMCwgMCwgMH0sCi0JezB4M0YsIDAsIDAsIDAsIDB9LAotCXsweDQwLCAwLCAwLCAwLCAwfSwKLQl7MHg0MSwgMHgzLCAweDMsIDAsIDB9LAotCXsweDQyLCAweDMsIDB4MywgMCwgMH0sCi0JezB4NDMsIDAsIDAsIDAsIDB9LAotCXsweDQ0LCAweDFlLCAweDFlLCAwLCAwfSwKLQl7MHg0NSwgMCwgMCwgMCwgMH0sCi0JezB4NDYsIDB4NmUsIDB4NmUsIDAsIDB9LAotCXsweDQ3LCAweGYwLCAweGYwLCAxLCAxfSwKLQl7MHg0OCwgMCwgMCwgMCwgMH0sCi0JezB4NDksIDB4MiwgMHgyLCAwLCAwfSwKLQl7MHg0QSwgMHhmZiwgMHhmZiwgMSwgMX0sCi0JezB4NEIsIDB4YywgMHhjLCAwLCAwfSwKLQl7MHg0QywgMCwgMCwgMCwgMH0sCi0JezB4NEQsIDB4MzgsIDB4MzgsIDAsIDB9LAotCXsweDRFLCAweDcwLCAweDcwLCAxLCAxfSwKLQl7MHg0RiwgMHgyLCAweDIsIDAsIDB9LAotCXsweDUwLCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHg1MSwgMHhjLCAweGMsIDAsIDB9LAotCXsweDUyLCAwLCAwLCAwLCAwfSwKLQl7MHg1MywgMHg4LCAweDgsIDAsIDB9LAotCXsweDU0LCAweDcwLCAweDcwLCAxLCAxfSwKLQl7MHg1NSwgMHgyLCAweDIsIDAsIDB9LAotCXsweDU2LCAweGZmLCAweGZmLCAxLCAxfSwKLQl7MHg1NywgMCwgMCwgMCwgMH0sCi0JezB4NTgsIDB4ODMsIDB4ODMsIDAsIDB9LAotCXsweDU5LCAweDc3LCAweDc3LCAxLCAxfSwKLQl7MHg1QSwgMCwgMCwgMCwgMH0sCi0JezB4NUIsIDB4MiwgMHgyLCAwLCAwfSwKLQl7MHg1QywgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4NUQsIDAsIDAsIDAsIDB9LAotCXsweDVFLCAweDgsIDB4OCwgMCwgMH0sCi0JezB4NUYsIDB4NzcsIDB4NzcsIDEsIDF9LAotCXsweDYwLCAweDEsIDB4MSwgMCwgMH0sCi0JezB4NjEsIDAsIDAsIDAsIDB9LAotCXsweDYyLCAweDcsIDB4NywgMCwgMH0sCi0JezB4NjMsIDAsIDAsIDAsIDB9LAotCXsweDY0LCAweDcsIDB4NywgMCwgMH0sCi0JezB4NjUsIDAsIDAsIDAsIDB9LAotCXsweDY2LCAwLCAwLCAwLCAwfSwKLQl7MHg2NywgMCwgMCwgMSwgMX0sCi0JezB4NjgsIDAsIDAsIDAsIDB9LAotCXsweDY5LCAweGEsIDB4YSwgMCwgMH0sCi0JezB4NkEsIDAsIDAsIDAsIDB9LAotCXsweDZCLCAwLCAwLCAwLCAwfSwKLQl7MHg2QywgMCwgMCwgMCwgMH0sCi0JezB4NkQsIDAsIDAsIDAsIDB9LAotCXsweDZFLCAwLCAwLCAwLCAwfSwKLQl7MHg2RiwgMCwgMCwgMCwgMH0sCi0JezB4NzAsIDAsIDAsIDAsIDB9LAotCXsweDcxLCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NzIsIDAsIDAsIDAsIDB9LAotCXsweDczLCAwLCAwLCAwLCAwfSwKLQl7MHg3NCwgMHhlLCAweGUsIDAsIDB9LAotCXsweDc1LCAweGUsIDB4ZSwgMCwgMH0sCi0JezB4NzYsIDB4ZSwgMHhlLCAwLCAwfSwKLQl7MHg3NywgMHgxMywgMHgxMywgMCwgMH0sCi0JezB4NzgsIDB4MTMsIDB4MTMsIDAsIDB9LAotCXsweDc5LCAweDFiLCAweDFiLCAwLCAwfSwKLQl7MHg3QSwgMHgxYiwgMHgxYiwgMCwgMH0sCi0JezB4N0IsIDB4NTUsIDB4NTUsIDAsIDB9LAotCXsweDdDLCAweDViLCAweDViLCAwLCAwfSwKLQl7MHg3RCwgMHgzMCwgMHgzMCwgMSwgMX0sCi0JezB4N0UsIDAsIDAsIDAsIDB9LAotCXsweDdGLCAwLCAwLCAwLCAwfSwKLQl7MHg4MCwgMCwgMCwgMCwgMH0sCi0JezB4ODEsIDAsIDAsIDAsIDB9LAotCXsweDgyLCAwLCAwLCAwLCAwfSwKLQl7MHg4MywgMCwgMCwgMCwgMH0sCi0JezB4ODQsIDAsIDAsIDAsIDB9LAotCXsweDg1LCAwLCAwLCAwLCAwfSwKLQl7MHg4NiwgMCwgMCwgMCwgMH0sCi0JezB4ODcsIDAsIDAsIDAsIDB9LAotCXsweDg4LCAwLCAwLCAwLCAwfSwKLQl7MHg4OSwgMCwgMCwgMCwgMH0sCi0JezB4OEEsIDAsIDAsIDAsIDB9LAotCXsweDhCLCAwLCAwLCAwLCAwfSwKLQl7MHg4QywgMCwgMCwgMCwgMH0sCi0JezB4OEQsIDAsIDAsIDAsIDB9LAotCXsweDhFLCAwLCAwLCAwLCAwfSwKLQl7MHg4RiwgMCwgMCwgMCwgMH0sCi0JezB4OTAsIDAsIDAsIDAsIDB9LAotCXsweDkxLCAwLCAwLCAwLCAwfSwKLQl7MHg5MiwgMCwgMCwgMCwgMH0sCi0JezB4OTMsIDB4NzAsIDB4NzAsIDAsIDB9LAotCXsweDk0LCAweDcwLCAweDcwLCAwLCAwfSwKLQl7MHg5NSwgMHg3MCwgMHg3MCwgMCwgMH0sCi0JezB4OTYsIDB4NzAsIDB4NzAsIDAsIDB9LAotCXsweDk3LCAweDcwLCAweDcwLCAwLCAwfSwKLQl7MHg5OCwgMHg3MCwgMHg3MCwgMCwgMH0sCi0JezB4OTksIDB4NzAsIDB4NzAsIDAsIDB9LAotCXsweDlBLCAweDcwLCAweDcwLCAwLCAwfSwKLQl7MHhGRkZGLCAwLCAwLCAwLCAwfSwKLX07Ci0KLXN0cnVjdCByYWRpb19yZWdzIHJlZ3NfUlhfMjA1Nl9yZXY4W10gPSB7Ci0JezB4MDIsIDAsIDAsIDAsIDB9LAotCXsweDAzLCAwLCAwLCAwLCAwfSwKLQl7MHgwNCwgMCwgMCwgMCwgMH0sCi0JezB4MDUsIDAsIDAsIDAsIDB9LAotCXsweDA2LCAwLCAwLCAwLCAwfSwKLQl7MHgwNywgMCwgMCwgMCwgMH0sCi0JezB4MDgsIDAsIDAsIDAsIDB9LAotCXsweDA5LCAwLCAwLCAwLCAwfSwKLQl7MHgwQSwgMCwgMCwgMCwgMH0sCi0JezB4MEIsIDAsIDAsIDAsIDB9LAotCXsweDBDLCAwLCAwLCAwLCAwfSwKLQl7MHgwRCwgMCwgMCwgMCwgMH0sCi0JezB4MEUsIDAsIDAsIDAsIDB9LAotCXsweDBGLCAwLCAwLCAwLCAwfSwKLQl7MHgxMCwgMCwgMCwgMCwgMH0sCi0JezB4MTEsIDAsIDAsIDAsIDB9LAotCXsweDEyLCAwLCAwLCAwLCAwfSwKLQl7MHgxMywgMCwgMCwgMCwgMH0sCi0JezB4MTQsIDAsIDAsIDAsIDB9LAotCXsweDE1LCAwLCAwLCAwLCAwfSwKLQl7MHgxNiwgMCwgMCwgMCwgMH0sCi0JezB4MTcsIDAsIDAsIDAsIDB9LAotCXsweDE4LCAwLCAwLCAwLCAwfSwKLQl7MHgxOSwgMCwgMCwgMCwgMH0sCi0JezB4MUEsIDAsIDAsIDAsIDB9LAotCXsweDFCLCAwLCAwLCAwLCAwfSwKLQl7MHgxQywgMCwgMCwgMCwgMH0sCi0JezB4MUQsIDAsIDAsIDAsIDB9LAotCXsweDFFLCAwLCAwLCAwLCAwfSwKLQl7MHgxRiwgMCwgMCwgMCwgMH0sCi0JezB4MjAsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHgyMSwgMCwgMCwgMCwgMH0sCi0JezB4MjIsIDAsIDAsIDAsIDB9LAotCXsweDIzLCAweDkwLCAweDkwLCAwLCAwfSwKLQl7MHgyNCwgMHg1NSwgMHg1NSwgMCwgMH0sCi0JezB4MjUsIDB4MTUsIDB4MTUsIDAsIDB9LAotCXsweDI2LCAweDUsIDB4NSwgMCwgMH0sCi0JezB4MjcsIDB4MTUsIDB4MTUsIDAsIDB9LAotCXsweDI4LCAweDUsIDB4NSwgMCwgMH0sCi0JezB4MjksIDB4MjAsIDB4MjAsIDAsIDB9LAotCXsweDJBLCAweDExLCAweDExLCAwLCAwfSwKLQl7MHgyQiwgMHg5MCwgMHg5MCwgMCwgMH0sCi0JezB4MkMsIDAsIDAsIDAsIDB9LAotCXsweDJELCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHgyRSwgMHgzMiwgMHgzMiwgMCwgMH0sCi0JezB4MkYsIDB4NzcsIDB4NzcsIDAsIDB9LAotCXsweDMwLCAweDE3LCAweDE3LCAxLCAxfSwKLQl7MHgzMSwgMHhmZiwgMHhmZiwgMSwgMX0sCi0JezB4MzIsIDB4MjAsIDB4MjAsIDAsIDB9LAotCXsweDMzLCAwLCAwLCAwLCAwfSwKLQl7MHgzNCwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4MzUsIDB4MzIsIDB4MzIsIDAsIDB9LAotCXsweDM2LCAweDc3LCAweDc3LCAwLCAwfSwKLQl7MHgzNywgMHgxNywgMHgxNywgMSwgMX0sCi0JezB4MzgsIDB4ZjAsIDB4ZjAsIDEsIDF9LAotCXsweDM5LCAweDIwLCAweDIwLCAwLCAwfSwKLQl7MHgzQSwgMHg4LCAweDgsIDAsIDB9LAotCXsweDNCLCAweDU1LCAweDU1LCAxLCAxfSwKLQl7MHgzQywgMCwgMCwgMCwgMH0sCi0JezB4M0QsIDB4ODgsIDB4ODgsIDEsIDF9LAotCXsweDNFLCAwLCAwLCAwLCAwfSwKLQl7MHgzRiwgMHg0NCwgMHg0NCwgMCwgMH0sCi0JezB4NDAsIDB4NywgMHg3LCAxLCAxfSwKLQl7MHg0MSwgMHg2LCAweDYsIDAsIDB9LAotCXsweDQyLCAweDQsIDB4NCwgMCwgMH0sCi0JezB4NDMsIDAsIDAsIDAsIDB9LAotCXsweDQ0LCAweDgsIDB4OCwgMCwgMH0sCi0JezB4NDUsIDB4NTUsIDB4NTUsIDEsIDF9LAotCXsweDQ2LCAwLCAwLCAwLCAwfSwKLQl7MHg0NywgMHgxMSwgMHgxMSwgMCwgMH0sCi0JezB4NDgsIDAsIDAsIDAsIDB9LAotCXsweDQ5LCAweDQ0LCAweDQ0LCAwLCAwfSwKLQl7MHg0QSwgMHg3LCAweDcsIDAsIDB9LAotCXsweDRCLCAweDYsIDB4NiwgMCwgMH0sCi0JezB4NEMsIDB4NCwgMHg0LCAwLCAwfSwKLQl7MHg0RCwgMCwgMCwgMCwgMH0sCi0JezB4NEUsIDAsIDAsIDAsIDB9LAotCXsweDRGLCAweDI2LCAweDI2LCAxLCAxfSwKLQl7MHg1MCwgMHgyNiwgMHgyNiwgMSwgMX0sCi0JezB4NTEsIDB4ZiwgMHhmLCAxLCAxfSwKLQl7MHg1MiwgMHhmLCAweGYsIDEsIDF9LAotCXsweDUzLCAweDQ0LCAweDQ0LCAwLCAwfSwKLQl7MHg1NCwgMCwgMCwgMCwgMH0sCi0JezB4NTUsIDAsIDAsIDAsIDB9LAotCXsweDU2LCAweDgsIDB4OCwgMCwgMH0sCi0JezB4NTcsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHg1OCwgMHg3LCAweDcsIDAsIDB9LAotCXsweDU5LCAweDIyLCAweDIyLCAwLCAwfSwKLQl7MHg1QSwgMHgyMiwgMHgyMiwgMCwgMH0sCi0JezB4NUIsIDB4MiwgMHgyLCAwLCAwfSwKLQl7MHg1QywgMHg0LCAweDQsIDEsIDF9LAotCXsweDVELCAweDcsIDB4NywgMCwgMH0sCi0JezB4NUUsIDB4NTUsIDB4NTUsIDAsIDB9LAotCXsweDVGLCAweDIzLCAweDIzLCAwLCAwfSwKLQl7MHg2MCwgMHg0MSwgMHg0MSwgMCwgMH0sCi0JezB4NjEsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHg2MiwgMHhhLCAweGEsIDAsIDB9LAotCXsweDYzLCAwLCAwLCAwLCAwfSwKLQl7MHg2NCwgMCwgMCwgMCwgMH0sCi0JezB4NjUsIDAsIDAsIDAsIDB9LAotCXsweDY2LCAwLCAwLCAwLCAwfSwKLQl7MHg2NywgMCwgMCwgMCwgMH0sCi0JezB4NjgsIDAsIDAsIDAsIDB9LAotCXsweDY5LCAwLCAwLCAwLCAwfSwKLQl7MHg2QSwgMCwgMCwgMCwgMH0sCi0JezB4NkIsIDB4YywgMHhjLCAwLCAwfSwKLQl7MHg2QywgMCwgMCwgMCwgMH0sCi0JezB4NkQsIDAsIDAsIDAsIDB9LAotCXsweDZFLCAwLCAwLCAwLCAwfSwKLQl7MHg2RiwgMCwgMCwgMCwgMH0sCi0JezB4NzAsIDAsIDAsIDAsIDB9LAotCXsweDcxLCAwLCAwLCAwLCAwfSwKLQl7MHg3MiwgMHgyMiwgMHgyMiwgMCwgMH0sCi0JezB4NzMsIDB4MjIsIDB4MjIsIDAsIDB9LAotCXsweDc0LCAwLCAwLCAxLCAxfSwKLQl7MHg3NSwgMHhhLCAweGEsIDAsIDB9LAotCXsweDc2LCAweDEsIDB4MSwgMCwgMH0sCi0JezB4NzcsIDB4MjIsIDB4MjIsIDAsIDB9LAotCXsweDc4LCAweDMwLCAweDMwLCAwLCAwfSwKLQl7MHg3OSwgMCwgMCwgMCwgMH0sCi0JezB4N0EsIDAsIDAsIDAsIDB9LAotCXsweDdCLCAwLCAwLCAwLCAwfSwKLQl7MHg3QywgMCwgMCwgMCwgMH0sCi0JezB4N0QsIDB4NSwgMHg1LCAxLCAxfSwKLQl7MHg3RSwgMCwgMCwgMCwgMH0sCi0JezB4N0YsIDAsIDAsIDAsIDB9LAotCXsweDgwLCAwLCAwLCAwLCAwfSwKLQl7MHg4MSwgMCwgMCwgMCwgMH0sCi0JezB4ODIsIDAsIDAsIDAsIDB9LAotCXsweDgzLCAwLCAwLCAwLCAwfSwKLQl7MHg4NCwgMCwgMCwgMCwgMH0sCi0JezB4ODUsIDAsIDAsIDAsIDB9LAotCXsweDg2LCAwLCAwLCAwLCAwfSwKLQl7MHg4NywgMCwgMCwgMCwgMH0sCi0JezB4ODgsIDAsIDAsIDAsIDB9LAotCXsweDg5LCAwLCAwLCAwLCAwfSwKLQl7MHg4QSwgMCwgMCwgMCwgMH0sCi0JezB4OEIsIDAsIDAsIDAsIDB9LAotCXsweDhDLCAwLCAwLCAwLCAwfSwKLQl7MHg4RCwgMCwgMCwgMCwgMH0sCi0JezB4OEUsIDAsIDAsIDAsIDB9LAotCXsweDhGLCAwLCAwLCAwLCAwfSwKLQl7MHg5MCwgMCwgMCwgMCwgMH0sCi0JezB4OTEsIDAsIDAsIDAsIDB9LAotCXsweDkyLCAwLCAwLCAwLCAwfSwKLQl7MHg5MywgMCwgMCwgMCwgMH0sCi0JezB4OTQsIDAsIDAsIDAsIDB9LAotCXsweEZGRkYsIDAsIDAsIDAsIDB9LAotfTsKLQotc3RydWN0IHJhZGlvX3JlZ3MgcmVnc19TWU5fMjA1Nl9yZXYxMVtdID0gewotCXsweDAyLCAwLCAwLCAwLCAwfSwKLQl7MHgwMywgMCwgMCwgMCwgMH0sCi0JezB4MDQsIDAsIDAsIDAsIDB9LAotCXsweDA1LCAwLCAwLCAwLCAwfSwKLQl7MHgwNiwgMCwgMCwgMCwgMH0sCi0JezB4MDcsIDAsIDAsIDAsIDB9LAotCXsweDA4LCAwLCAwLCAwLCAwfSwKLQl7MHgwOSwgMHgxLCAweDEsIDAsIDB9LAotCXsweDBBLCAwLCAwLCAwLCAwfSwKLQl7MHgwQiwgMCwgMCwgMCwgMH0sCi0JezB4MEMsIDAsIDAsIDAsIDB9LAotCXsweDBELCAwLCAwLCAwLCAwfSwKLQl7MHgwRSwgMCwgMCwgMCwgMH0sCi0JezB4MEYsIDAsIDAsIDAsIDB9LAotCXsweDEwLCAwLCAwLCAwLCAwfSwKLQl7MHgxMSwgMCwgMCwgMCwgMH0sCi0JezB4MTIsIDAsIDAsIDAsIDB9LAotCXsweDEzLCAwLCAwLCAwLCAwfSwKLQl7MHgxNCwgMCwgMCwgMCwgMH0sCi0JezB4MTUsIDAsIDAsIDAsIDB9LAotCXsweDE2LCAwLCAwLCAwLCAwfSwKLQl7MHgxNywgMCwgMCwgMCwgMH0sCi0JezB4MTgsIDAsIDAsIDAsIDB9LAotCXsweDE5LCAwLCAwLCAwLCAwfSwKLQl7MHgxQSwgMCwgMCwgMCwgMH0sCi0JezB4MUIsIDAsIDAsIDAsIDB9LAotCXsweDFDLCAwLCAwLCAwLCAwfSwKLQl7MHgxRCwgMCwgMCwgMCwgMH0sCi0JezB4MUUsIDAsIDAsIDAsIDB9LAotCXsweDFGLCAwLCAwLCAwLCAwfSwKLQl7MHgyMCwgMCwgMCwgMCwgMH0sCi0JezB4MjEsIDAsIDAsIDAsIDB9LAotCXsweDIyLCAweDYwLCAweDYwLCAwLCAwfSwKLQl7MHgyMywgMHg2LCAweDYsIDAsIDB9LAotCXsweDI0LCAweGMsIDB4YywgMCwgMH0sCi0JezB4MjUsIDAsIDAsIDAsIDB9LAotCXsweDI2LCAwLCAwLCAwLCAwfSwKLQl7MHgyNywgMCwgMCwgMCwgMH0sCi0JezB4MjgsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHgyOSwgMCwgMCwgMCwgMH0sCi0JezB4MkEsIDAsIDAsIDAsIDB9LAotCXsweDJCLCAwLCAwLCAwLCAwfSwKLQl7MHgyQywgMCwgMCwgMCwgMH0sCi0JezB4MkQsIDAsIDAsIDAsIDB9LAotCXsweDJFLCAwLCAwLCAwLCAwfSwKLQl7MHgyRiwgMHgxZiwgMHgxZiwgMCwgMH0sCi0JezB4MzAsIDB4MTUsIDB4MTUsIDAsIDB9LAotCXsweDMxLCAweGYsIDB4ZiwgMCwgMH0sCi0JezB4MzIsIDAsIDAsIDAsIDB9LAotCXsweDMzLCAwLCAwLCAwLCAwfSwKLQl7MHgzNCwgMCwgMCwgMCwgMH0sCi0JezB4MzUsIDAsIDAsIDAsIDB9LAotCXsweDM2LCAwLCAwLCAwLCAwfSwKLQl7MHgzNywgMCwgMCwgMCwgMH0sCi0JezB4MzgsIDAsIDAsIDAsIDB9LAotCXsweDM5LCAwLCAwLCAwLCAwfSwKLQl7MHgzQSwgMCwgMCwgMCwgMH0sCi0JezB4M0IsIDAsIDAsIDAsIDB9LAotCXsweDNDLCAweDEzLCAweDEzLCAwLCAwfSwKLQl7MHgzRCwgMHhmLCAweGYsIDAsIDB9LAotCXsweDNFLCAweDE4LCAweDE4LCAwLCAwfSwKLQl7MHgzRiwgMCwgMCwgMCwgMH0sCi0JezB4NDAsIDAsIDAsIDAsIDB9LAotCXsweDQxLCAweDIwLCAweDIwLCAwLCAwfSwKLQl7MHg0MiwgMHgyMCwgMHgyMCwgMCwgMH0sCi0JezB4NDMsIDAsIDAsIDAsIDB9LAotCXsweDQ0LCAweDc3LCAweDc3LCAwLCAwfSwKLQl7MHg0NSwgMHg3LCAweDcsIDAsIDB9LAotCXsweDQ2LCAweDEsIDB4MSwgMCwgMH0sCi0JezB4NDcsIDB4NiwgMHg2LCAxLCAxfSwKLQl7MHg0OCwgMHhmLCAweGYsIDAsIDB9LAotCXsweDQ5LCAweDNmLCAweDNmLCAxLCAxfSwKLQl7MHg0QSwgMHgzMiwgMHgzMiwgMCwgMH0sCi0JezB4NEIsIDB4NiwgMHg2LCAxLCAxfSwKLQl7MHg0QywgMHg2LCAweDYsIDEsIDF9LAotCXsweDRELCAweDQsIDB4NCwgMCwgMH0sCi0JezB4NEUsIDB4MmIsIDB4MmIsIDEsIDF9LAotCXsweDRGLCAweDEsIDB4MSwgMCwgMH0sCi0JezB4NTAsIDB4MWMsIDB4MWMsIDAsIDB9LAotCXsweDUxLCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NTIsIDB4MiwgMHgyLCAwLCAwfSwKLQl7MHg1MywgMHhmNywgMHhmNywgMSwgMX0sCi0JezB4NTQsIDB4YjQsIDB4YjQsIDAsIDB9LAotCXsweDU1LCAweGQyLCAweGQyLCAwLCAwfSwKLQl7MHg1NiwgMCwgMCwgMCwgMH0sCi0JezB4NTcsIDAsIDAsIDAsIDB9LAotCXsweDU4LCAweDQsIDB4NCwgMCwgMH0sCi0JezB4NTksIDB4OTYsIDB4OTYsIDAsIDB9LAotCXsweDVBLCAweDNlLCAweDNlLCAwLCAwfSwKLQl7MHg1QiwgMHgzZSwgMHgzZSwgMCwgMH0sCi0JezB4NUMsIDB4MTMsIDB4MTMsIDAsIDB9LAotCXsweDVELCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NUUsIDAsIDAsIDAsIDB9LAotCXsweDVGLCAweDcsIDB4NywgMCwgMH0sCi0JezB4NjAsIDB4NywgMHg3LCAxLCAxfSwKLQl7MHg2MSwgMHg4LCAweDgsIDAsIDB9LAotCXsweDYyLCAweDMsIDB4MywgMCwgMH0sCi0JezB4NjMsIDAsIDAsIDAsIDB9LAotCXsweDY0LCAwLCAwLCAwLCAwfSwKLQl7MHg2NSwgMCwgMCwgMCwgMH0sCi0JezB4NjYsIDAsIDAsIDAsIDB9LAotCXsweDY3LCAwLCAwLCAwLCAwfSwKLQl7MHg2OCwgMHg0MCwgMHg0MCwgMCwgMH0sCi0JezB4NjksIDAsIDAsIDAsIDB9LAotCXsweDZBLCAwLCAwLCAwLCAwfSwKLQl7MHg2QiwgMCwgMCwgMCwgMH0sCi0JezB4NkMsIDAsIDAsIDAsIDB9LAotCXsweDZELCAweDEsIDB4MSwgMCwgMH0sCi0JezB4NkUsIDAsIDAsIDAsIDB9LAotCXsweDZGLCAwLCAwLCAwLCAwfSwKLQl7MHg3MCwgMHg2MCwgMHg2MCwgMCwgMH0sCi0JezB4NzEsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweDcyLCAweGMsIDB4YywgMCwgMH0sCi0JezB4NzMsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweDc0LCAweDhmLCAweDhmLCAxLCAxfSwKLQl7MHg3NSwgMCwgMCwgMCwgMH0sCi0JezB4NzYsIDB4Y2MsIDB4Y2MsIDAsIDB9LAotCXsweDc3LCAweDEsIDB4MSwgMCwgMH0sCi0JezB4NzgsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweDc5LCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHg3QSwgMCwgMCwgMCwgMH0sCi0JezB4N0IsIDAsIDAsIDAsIDB9LAotCXsweDdDLCAwLCAwLCAwLCAwfSwKLQl7MHg3RCwgMCwgMCwgMCwgMH0sCi0JezB4N0UsIDAsIDAsIDAsIDB9LAotCXsweDdGLCAwLCAwLCAwLCAwfSwKLQl7MHg4MCwgMCwgMCwgMCwgMH0sCi0JezB4ODEsIDAsIDAsIDAsIDB9LAotCXsweDgyLCAwLCAwLCAwLCAwfSwKLQl7MHg4MywgMCwgMCwgMCwgMH0sCi0JezB4ODQsIDAsIDAsIDAsIDB9LAotCXsweDg1LCAweGZmLCAweGZmLCAwLCAwfSwKLQl7MHg4NiwgMCwgMCwgMCwgMH0sCi0JezB4ODcsIDAsIDAsIDAsIDB9LAotCXsweDg4LCAwLCAwLCAwLCAwfSwKLQl7MHg4OSwgMCwgMCwgMCwgMH0sCi0JezB4OEEsIDAsIDAsIDAsIDB9LAotCXsweDhCLCAwLCAwLCAwLCAwfSwKLQl7MHg4QywgMCwgMCwgMCwgMH0sCi0JezB4OEQsIDAsIDAsIDAsIDB9LAotCXsweDhFLCAwLCAwLCAwLCAwfSwKLQl7MHg4RiwgMCwgMCwgMCwgMH0sCi0JezB4OTAsIDAsIDAsIDAsIDB9LAotCXsweDkxLCAwLCAwLCAwLCAwfSwKLQl7MHg5MiwgMCwgMCwgMCwgMH0sCi0JezB4OTMsIDAsIDAsIDAsIDB9LAotCXsweDk0LCAwLCAwLCAwLCAwfSwKLQl7MHg5NSwgMCwgMCwgMCwgMH0sCi0JezB4OTYsIDAsIDAsIDAsIDB9LAotCXsweDk3LCAwLCAwLCAwLCAwfSwKLQl7MHg5OCwgMCwgMCwgMCwgMH0sCi0JezB4OTksIDAsIDAsIDAsIDB9LAotCXsweDlBLCAwLCAwLCAwLCAwfSwKLQl7MHg5QiwgMCwgMCwgMCwgMH0sCi0JezB4OUMsIDAsIDAsIDAsIDB9LAotCXsweDlELCAwLCAwLCAwLCAwfSwKLQl7MHg5RSwgMCwgMCwgMCwgMH0sCi0JezB4OUYsIDB4NiwgMHg2LCAwLCAwfSwKLQl7MHhBMCwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QTEsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEEyLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBMywgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QTQsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEE1LCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBNiwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QTcsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEE4LCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBOSwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QUEsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEFCLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBQywgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QUQsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEFFLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhBRiwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QjAsIDB4NjYsIDB4NjYsIDAsIDB9LAotCXsweEIxLCAweDY2LCAweDY2LCAwLCAwfSwKLQl7MHhCMiwgMHg2NiwgMHg2NiwgMCwgMH0sCi0JezB4QjMsIDB4YSwgMHhhLCAwLCAwfSwKLQl7MHhCNCwgMCwgMCwgMCwgMH0sCi0JezB4QjUsIDAsIDAsIDAsIDB9LAotCXsweEI2LCAwLCAwLCAwLCAwfSwKLQl7MHhGRkZGLCAwLCAwLCAwLCAwfSwKLX07Ci0KLXN0cnVjdCByYWRpb19yZWdzIHJlZ3NfVFhfMjA1Nl9yZXYxMVtdID0gewotCXsweDAyLCAwLCAwLCAwLCAwfSwKLQl7MHgwMywgMCwgMCwgMCwgMH0sCi0JezB4MDQsIDAsIDAsIDAsIDB9LAotCXsweDA1LCAwLCAwLCAwLCAwfSwKLQl7MHgwNiwgMCwgMCwgMCwgMH0sCi0JezB4MDcsIDAsIDAsIDAsIDB9LAotCXsweDA4LCAwLCAwLCAwLCAwfSwKLQl7MHgwOSwgMCwgMCwgMCwgMH0sCi0JezB4MEEsIDAsIDAsIDAsIDB9LAotCXsweDBCLCAwLCAwLCAwLCAwfSwKLQl7MHgwQywgMCwgMCwgMCwgMH0sCi0JezB4MEQsIDAsIDAsIDAsIDB9LAotCXsweDBFLCAwLCAwLCAwLCAwfSwKLQl7MHgwRiwgMCwgMCwgMCwgMH0sCi0JezB4MTAsIDAsIDAsIDAsIDB9LAotCXsweDExLCAwLCAwLCAwLCAwfSwKLQl7MHgxMiwgMCwgMCwgMCwgMH0sCi0JezB4MTMsIDAsIDAsIDAsIDB9LAotCXsweDE0LCAwLCAwLCAwLCAwfSwKLQl7MHgxNSwgMCwgMCwgMCwgMH0sCi0JezB4MTYsIDAsIDAsIDAsIDB9LAotCXsweDE3LCAwLCAwLCAwLCAwfSwKLQl7MHgxOCwgMCwgMCwgMCwgMH0sCi0JezB4MTksIDAsIDAsIDAsIDB9LAotCXsweDFBLCAwLCAwLCAwLCAwfSwKLQl7MHgxQiwgMCwgMCwgMCwgMH0sCi0JezB4MUMsIDAsIDAsIDAsIDB9LAotCXsweDFELCAwLCAwLCAwLCAwfSwKLQl7MHgxRSwgMCwgMCwgMCwgMH0sCi0JezB4MUYsIDAsIDAsIDAsIDB9LAotCXsweDIwLCAwLCAwLCAwLCAwfSwKLQl7MHgyMSwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4MjIsIDB4ODgsIDB4ODgsIDAsIDB9LAotCXsweDIzLCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHgyNCwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4MjUsIDB4YywgMHhjLCAwLCAwfSwKLQl7MHgyNiwgMCwgMCwgMCwgMH0sCi0JezB4MjcsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHgyOCwgMCwgMCwgMCwgMH0sCi0JezB4MjksIDB4MywgMHgzLCAwLCAwfSwKLQl7MHgyQSwgMHgzNywgMHgzNywgMCwgMH0sCi0JezB4MkIsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHgyQywgMCwgMCwgMCwgMH0sCi0JezB4MkQsIDAsIDAsIDAsIDB9LAotCXsweDJFLCAweDEsIDB4MSwgMCwgMH0sCi0JezB4MkYsIDB4MSwgMHgxLCAwLCAwfSwKLQl7MHgzMCwgMCwgMCwgMCwgMH0sCi0JezB4MzEsIDAsIDAsIDAsIDB9LAotCXsweDMyLCAwLCAwLCAwLCAwfSwKLQl7MHgzMywgMHgxMSwgMHgxMSwgMCwgMH0sCi0JezB4MzQsIDB4ZWUsIDB4ZWUsIDEsIDF9LAotCXsweDM1LCAwLCAwLCAwLCAwfSwKLQl7MHgzNiwgMCwgMCwgMCwgMH0sCi0JezB4MzcsIDB4MywgMHgzLCAwLCAwfSwKLQl7MHgzOCwgMHg1MCwgMHg1MCwgMSwgMX0sCi0JezB4MzksIDAsIDAsIDAsIDB9LAotCXsweDNBLCAweDUwLCAweDUwLCAxLCAxfSwKLQl7MHgzQiwgMCwgMCwgMCwgMH0sCi0JezB4M0MsIDB4NmUsIDB4NmUsIDAsIDB9LAotCXsweDNELCAweGYwLCAweGYwLCAxLCAxfSwKLQl7MHgzRSwgMCwgMCwgMCwgMH0sCi0JezB4M0YsIDAsIDAsIDAsIDB9LAotCXsweDQwLCAwLCAwLCAwLCAwfSwKLQl7MHg0MSwgMHgzLCAweDMsIDAsIDB9LAotCXsweDQyLCAweDMsIDB4MywgMCwgMH0sCi0JezB4NDMsIDAsIDAsIDAsIDB9LAotCXsweDQ0LCAweDFlLCAweDFlLCAwLCAwfSwKLQl7MHg0NSwgMCwgMCwgMCwgMH0sCi0JezB4NDYsIDB4NmUsIDB4NmUsIDAsIDB9LAotCXsweDQ3LCAweGYwLCAweGYwLCAxLCAxfSwKLQl7MHg0OCwgMCwgMCwgMCwgMH0sCi0JezB4NDksIDB4MiwgMHgyLCAwLCAwfSwKLQl7MHg0QSwgMHhmZiwgMHhmZiwgMSwgMX0sCi0JezB4NEIsIDB4YywgMHhjLCAwLCAwfSwKLQl7MHg0QywgMCwgMCwgMCwgMH0sCi0JezB4NEQsIDB4MzgsIDB4MzgsIDAsIDB9LAotCXsweDRFLCAweDcwLCAweDcwLCAxLCAxfSwKLQl7MHg0RiwgMHgyLCAweDIsIDAsIDB9LAotCXsweDUwLCAweDg4LCAweDg4LCAwLCAwfSwKLQl7MHg1MSwgMHhjLCAweGMsIDAsIDB9LAotCXsweDUyLCAwLCAwLCAwLCAwfSwKLQl7MHg1MywgMHg4LCAweDgsIDAsIDB9LAotCXsweDU0LCAweDcwLCAweDcwLCAxLCAxfSwKLQl7MHg1NSwgMHgyLCAweDIsIDAsIDB9LAotCXsweDU2LCAweGZmLCAweGZmLCAxLCAxfSwKLQl7MHg1NywgMCwgMCwgMCwgMH0sCi0JezB4NTgsIDB4ODMsIDB4ODMsIDAsIDB9LAotCXsweDU5LCAweDc3LCAweDc3LCAxLCAxfSwKLQl7MHg1QSwgMCwgMCwgMCwgMH0sCi0JezB4NUIsIDB4MiwgMHgyLCAwLCAwfSwKLQl7MHg1QywgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4NUQsIDAsIDAsIDAsIDB9LAotCXsweDVFLCAweDgsIDB4OCwgMCwgMH0sCi0JezB4NUYsIDB4NzcsIDB4NzcsIDEsIDF9LAotCXsweDYwLCAweDEsIDB4MSwgMCwgMH0sCi0JezB4NjEsIDAsIDAsIDAsIDB9LAotCXsweDYyLCAweDcsIDB4NywgMCwgMH0sCi0JezB4NjMsIDAsIDAsIDAsIDB9LAotCXsweDY0LCAweDcsIDB4NywgMCwgMH0sCi0JezB4NjUsIDAsIDAsIDAsIDB9LAotCXsweDY2LCAwLCAwLCAwLCAwfSwKLQl7MHg2NywgMCwgMCwgMSwgMX0sCi0JezB4NjgsIDAsIDAsIDAsIDB9LAotCXsweDY5LCAweGEsIDB4YSwgMCwgMH0sCi0JezB4NkEsIDAsIDAsIDAsIDB9LAotCXsweDZCLCAwLCAwLCAwLCAwfSwKLQl7MHg2QywgMCwgMCwgMCwgMH0sCi0JezB4NkQsIDAsIDAsIDAsIDB9LAotCXsweDZFLCAwLCAwLCAwLCAwfSwKLQl7MHg2RiwgMCwgMCwgMCwgMH0sCi0JezB4NzAsIDAsIDAsIDAsIDB9LAotCXsweDcxLCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NzIsIDAsIDAsIDAsIDB9LAotCXsweDczLCAwLCAwLCAwLCAwfSwKLQl7MHg3NCwgMHhlLCAweGUsIDAsIDB9LAotCXsweDc1LCAweGUsIDB4ZSwgMCwgMH0sCi0JezB4NzYsIDB4ZSwgMHhlLCAwLCAwfSwKLQl7MHg3NywgMHgxMywgMHgxMywgMCwgMH0sCi0JezB4NzgsIDB4MTMsIDB4MTMsIDAsIDB9LAotCXsweDc5LCAweDFiLCAweDFiLCAwLCAwfSwKLQl7MHg3QSwgMHgxYiwgMHgxYiwgMCwgMH0sCi0JezB4N0IsIDB4NTUsIDB4NTUsIDAsIDB9LAotCXsweDdDLCAweDViLCAweDViLCAwLCAwfSwKLQl7MHg3RCwgMHgzMCwgMHgzMCwgMSwgMX0sCi0JezB4N0UsIDAsIDAsIDAsIDB9LAotCXsweDdGLCAwLCAwLCAwLCAwfSwKLQl7MHg4MCwgMCwgMCwgMCwgMH0sCi0JezB4ODEsIDAsIDAsIDAsIDB9LAotCXsweDgyLCAwLCAwLCAwLCAwfSwKLQl7MHg4MywgMCwgMCwgMCwgMH0sCi0JezB4ODQsIDAsIDAsIDAsIDB9LAotCXsweDg1LCAwLCAwLCAwLCAwfSwKLQl7MHg4NiwgMCwgMCwgMCwgMH0sCi0JezB4ODcsIDAsIDAsIDAsIDB9LAotCXsweDg4LCAwLCAwLCAwLCAwfSwKLQl7MHg4OSwgMCwgMCwgMCwgMH0sCi0JezB4OEEsIDAsIDAsIDAsIDB9LAotCXsweDhCLCAwLCAwLCAwLCAwfSwKLQl7MHg4QywgMCwgMCwgMCwgMH0sCi0JezB4OEQsIDAsIDAsIDAsIDB9LAotCXsweDhFLCAwLCAwLCAwLCAwfSwKLQl7MHg4RiwgMCwgMCwgMCwgMH0sCi0JezB4OTAsIDAsIDAsIDAsIDB9LAotCXsweDkxLCAwLCAwLCAwLCAwfSwKLQl7MHg5MiwgMCwgMCwgMCwgMH0sCi0JezB4OTMsIDB4NzAsIDB4NzAsIDAsIDB9LAotCXsweDk0LCAweDcwLCAweDcwLCAwLCAwfSwKLQl7MHg5NSwgMHg3MCwgMHg3MCwgMCwgMH0sCi0JezB4OTYsIDB4NzAsIDB4NzAsIDAsIDB9LAotCXsweDk3LCAweDcwLCAweDcwLCAwLCAwfSwKLQl7MHg5OCwgMHg3MCwgMHg3MCwgMCwgMH0sCi0JezB4OTksIDB4NzAsIDB4NzAsIDAsIDB9LAotCXsweDlBLCAweDcwLCAweDcwLCAwLCAwfSwKLQl7MHhGRkZGLCAwLCAwLCAwLCAwfSwKLX07Ci0KLXN0cnVjdCByYWRpb19yZWdzIHJlZ3NfUlhfMjA1Nl9yZXYxMVtdID0gewotCXsweDAyLCAwLCAwLCAwLCAwfSwKLQl7MHgwMywgMCwgMCwgMCwgMH0sCi0JezB4MDQsIDAsIDAsIDAsIDB9LAotCXsweDA1LCAwLCAwLCAwLCAwfSwKLQl7MHgwNiwgMCwgMCwgMCwgMH0sCi0JezB4MDcsIDAsIDAsIDAsIDB9LAotCXsweDA4LCAwLCAwLCAwLCAwfSwKLQl7MHgwOSwgMCwgMCwgMCwgMH0sCi0JezB4MEEsIDAsIDAsIDAsIDB9LAotCXsweDBCLCAwLCAwLCAwLCAwfSwKLQl7MHgwQywgMCwgMCwgMCwgMH0sCi0JezB4MEQsIDAsIDAsIDAsIDB9LAotCXsweDBFLCAwLCAwLCAwLCAwfSwKLQl7MHgwRiwgMCwgMCwgMCwgMH0sCi0JezB4MTAsIDAsIDAsIDAsIDB9LAotCXsweDExLCAwLCAwLCAwLCAwfSwKLQl7MHgxMiwgMCwgMCwgMCwgMH0sCi0JezB4MTMsIDAsIDAsIDAsIDB9LAotCXsweDE0LCAwLCAwLCAwLCAwfSwKLQl7MHgxNSwgMCwgMCwgMCwgMH0sCi0JezB4MTYsIDAsIDAsIDAsIDB9LAotCXsweDE3LCAwLCAwLCAwLCAwfSwKLQl7MHgxOCwgMCwgMCwgMCwgMH0sCi0JezB4MTksIDAsIDAsIDAsIDB9LAotCXsweDFBLCAwLCAwLCAwLCAwfSwKLQl7MHgxQiwgMCwgMCwgMCwgMH0sCi0JezB4MUMsIDAsIDAsIDAsIDB9LAotCXsweDFELCAwLCAwLCAwLCAwfSwKLQl7MHgxRSwgMCwgMCwgMCwgMH0sCi0JezB4MUYsIDAsIDAsIDAsIDB9LAotCXsweDIwLCAweDMsIDB4MywgMCwgMH0sCi0JezB4MjEsIDAsIDAsIDAsIDB9LAotCXsweDIyLCAwLCAwLCAwLCAwfSwKLQl7MHgyMywgMHg5MCwgMHg5MCwgMCwgMH0sCi0JezB4MjQsIDB4NTUsIDB4NTUsIDAsIDB9LAotCXsweDI1LCAweDE1LCAweDE1LCAwLCAwfSwKLQl7MHgyNiwgMHg1LCAweDUsIDAsIDB9LAotCXsweDI3LCAweDE1LCAweDE1LCAwLCAwfSwKLQl7MHgyOCwgMHg1LCAweDUsIDAsIDB9LAotCXsweDI5LCAweDIwLCAweDIwLCAwLCAwfSwKLQl7MHgyQSwgMHgxMSwgMHgxMSwgMCwgMH0sCi0JezB4MkIsIDB4OTAsIDB4OTAsIDAsIDB9LAotCXsweDJDLCAwLCAwLCAwLCAwfSwKLQl7MHgyRCwgMHg4OCwgMHg4OCwgMCwgMH0sCi0JezB4MkUsIDB4MzIsIDB4MzIsIDAsIDB9LAotCXsweDJGLCAweDc3LCAweDc3LCAwLCAwfSwKLQl7MHgzMCwgMHgxNywgMHgxNywgMSwgMX0sCi0JezB4MzEsIDB4ZmYsIDB4ZmYsIDEsIDF9LAotCXsweDMyLCAweDIwLCAweDIwLCAwLCAwfSwKLQl7MHgzMywgMCwgMCwgMCwgMH0sCi0JezB4MzQsIDB4ODgsIDB4ODgsIDAsIDB9LAotCXsweDM1LCAweDMyLCAweDMyLCAwLCAwfSwKLQl7MHgzNiwgMHg3NywgMHg3NywgMCwgMH0sCi0JezB4MzcsIDB4MTcsIDB4MTcsIDEsIDF9LAotCXsweDM4LCAweGYwLCAweGYwLCAxLCAxfSwKLQl7MHgzOSwgMHgyMCwgMHgyMCwgMCwgMH0sCi0JezB4M0EsIDB4OCwgMHg4LCAwLCAwfSwKLQl7MHgzQiwgMHg1NSwgMHg1NSwgMSwgMX0sCi0JezB4M0MsIDAsIDAsIDAsIDB9LAotCXsweDNELCAweDg4LCAweDg4LCAxLCAxfSwKLQl7MHgzRSwgMCwgMCwgMCwgMH0sCi0JezB4M0YsIDB4NDQsIDB4NDQsIDAsIDB9LAotCXsweDQwLCAweDcsIDB4NywgMSwgMX0sCi0JezB4NDEsIDB4NiwgMHg2LCAwLCAwfSwKLQl7MHg0MiwgMHg0LCAweDQsIDAsIDB9LAotCXsweDQzLCAwLCAwLCAwLCAwfSwKLQl7MHg0NCwgMHg4LCAweDgsIDAsIDB9LAotCXsweDQ1LCAweDU1LCAweDU1LCAxLCAxfSwKLQl7MHg0NiwgMCwgMCwgMCwgMH0sCi0JezB4NDcsIDB4MTEsIDB4MTEsIDAsIDB9LAotCXsweDQ4LCAwLCAwLCAwLCAwfSwKLQl7MHg0OSwgMHg0NCwgMHg0NCwgMCwgMH0sCi0JezB4NEEsIDB4NywgMHg3LCAwLCAwfSwKLQl7MHg0QiwgMHg2LCAweDYsIDAsIDB9LAotCXsweDRDLCAweDQsIDB4NCwgMCwgMH0sCi0JezB4NEQsIDAsIDAsIDAsIDB9LAotCXsweDRFLCAwLCAwLCAwLCAwfSwKLQl7MHg0RiwgMHgyNiwgMHgyNiwgMSwgMX0sCi0JezB4NTAsIDB4MjYsIDB4MjYsIDEsIDF9LAotCXsweDUxLCAweGYsIDB4ZiwgMSwgMX0sCi0JezB4NTIsIDB4ZiwgMHhmLCAxLCAxfSwKLQl7MHg1MywgMHg0NCwgMHg0NCwgMCwgMH0sCi0JezB4NTQsIDAsIDAsIDAsIDB9LAotCXsweDU1LCAwLCAwLCAwLCAwfSwKLQl7MHg1NiwgMHg4LCAweDgsIDAsIDB9LAotCXsweDU3LCAweDgsIDB4OCwgMCwgMH0sCi0JezB4NTgsIDB4NywgMHg3LCAwLCAwfSwKLQl7MHg1OSwgMHgyMiwgMHgyMiwgMCwgMH0sCi0JezB4NUEsIDB4MjIsIDB4MjIsIDAsIDB9LAotCXsweDVCLCAweDIsIDB4MiwgMCwgMH0sCi0JezB4NUMsIDB4NCwgMHg0LCAxLCAxfSwKLQl7MHg1RCwgMHg3LCAweDcsIDAsIDB9LAotCXsweDVFLCAweDU1LCAweDU1LCAwLCAwfSwKLQl7MHg1RiwgMHgyMywgMHgyMywgMCwgMH0sCi0JezB4NjAsIDB4NDEsIDB4NDEsIDAsIDB9LAotCXsweDYxLCAweDEsIDB4MSwgMCwgMH0sCi0JezB4NjIsIDB4YSwgMHhhLCAwLCAwfSwKLQl7MHg2MywgMCwgMCwgMCwgMH0sCi0JezB4NjQsIDAsIDAsIDAsIDB9LAotCXsweDY1LCAwLCAwLCAwLCAwfSwKLQl7MHg2NiwgMCwgMCwgMCwgMH0sCi0JezB4NjcsIDAsIDAsIDAsIDB9LAotCXsweDY4LCAwLCAwLCAwLCAwfSwKLQl7MHg2OSwgMCwgMCwgMCwgMH0sCi0JezB4NkEsIDAsIDAsIDAsIDB9LAotCXsweDZCLCAweGMsIDB4YywgMCwgMH0sCi0JezB4NkMsIDAsIDAsIDAsIDB9LAotCXsweDZELCAwLCAwLCAwLCAwfSwKLQl7MHg2RSwgMCwgMCwgMCwgMH0sCi0JezB4NkYsIDAsIDAsIDAsIDB9LAotCXsweDcwLCAwLCAwLCAwLCAwfSwKLQl7MHg3MSwgMCwgMCwgMCwgMH0sCi0JezB4NzIsIDB4MjIsIDB4MjIsIDAsIDB9LAotCXsweDczLCAweDIyLCAweDIyLCAwLCAwfSwKLQl7MHg3NCwgMCwgMCwgMSwgMX0sCi0JezB4NzUsIDB4YSwgMHhhLCAwLCAwfSwKLQl7MHg3NiwgMHgxLCAweDEsIDAsIDB9LAotCXsweDc3LCAweDIyLCAweDIyLCAwLCAwfSwKLQl7MHg3OCwgMHgzMCwgMHgzMCwgMCwgMH0sCi0JezB4NzksIDAsIDAsIDAsIDB9LAotCXsweDdBLCAwLCAwLCAwLCAwfSwKLQl7MHg3QiwgMCwgMCwgMCwgMH0sCi0JezB4N0MsIDAsIDAsIDAsIDB9LAotCXsweDdELCAweDUsIDB4NSwgMSwgMX0sCi0JezB4N0UsIDAsIDAsIDAsIDB9LAotCXsweDdGLCAwLCAwLCAwLCAwfSwKLQl7MHg4MCwgMCwgMCwgMCwgMH0sCi0JezB4ODEsIDAsIDAsIDAsIDB9LAotCXsweDgyLCAwLCAwLCAwLCAwfSwKLQl7MHg4MywgMCwgMCwgMCwgMH0sCi0JezB4ODQsIDAsIDAsIDAsIDB9LAotCXsweDg1LCAwLCAwLCAwLCAwfSwKLQl7MHg4NiwgMCwgMCwgMCwgMH0sCi0JezB4ODcsIDAsIDAsIDAsIDB9LAotCXsweDg4LCAwLCAwLCAwLCAwfSwKLQl7MHg4OSwgMCwgMCwgMCwgMH0sCi0JezB4OEEsIDAsIDAsIDAsIDB9LAotCXsweDhCLCAwLCAwLCAwLCAwfSwKLQl7MHg4QywgMCwgMCwgMCwgMH0sCi0JezB4OEQsIDAsIDAsIDAsIDB9LAotCXsweDhFLCAwLCAwLCAwLCAwfSwKLQl7MHg4RiwgMCwgMCwgMCwgMH0sCi0JezB4OTAsIDAsIDAsIDAsIDB9LAotCXsweDkxLCAwLCAwLCAwLCAwfSwKLQl7MHg5MiwgMCwgMCwgMCwgMH0sCi0JezB4OTMsIDAsIDAsIDAsIDB9LAotCXsweDk0LCAwLCAwLCAwLCAwfSwKLQl7MHhGRkZGLCAwLCAwLCAwLCAwfSwKLX07Ci0KLXN0cnVjdCByYWRpb18yMHh4X3JlZ3MgcmVnc18yMDU3X3JldjRbXSA9IHsKLQl7MHgwMCwgMHg4NCwgMH0sCi0JezB4MDEsIDAsIDB9LAotCXsweDAyLCAweDYwLCAwfSwKLQl7MHgwMywgMHgxZiwgMH0sCi0JezB4MDQsIDB4NCwgMH0sCi0JezB4MDUsIDB4MiwgMH0sCi0JezB4MDYsIDB4MSwgMH0sCi0JezB4MDcsIDB4MSwgMH0sCi0JezB4MDgsIDB4MSwgMH0sCi0JezB4MDksIDB4NjksIDB9LAotCXsweDBBLCAweDY2LCAwfSwKLQl7MHgwQiwgMHg2LCAwfSwKLQl7MHgwQywgMHgxOCwgMH0sCi0JezB4MEQsIDB4MywgMH0sCi0JezB4MEUsIDB4MjAsIDF9LAotCXsweDBGLCAweDIwLCAwfSwKLQl7MHgxMCwgMCwgMH0sCi0JezB4MTEsIDB4N2MsIDB9LAotCXsweDEyLCAweDQyLCAwfSwKLQl7MHgxMywgMHhiZCwgMH0sCi0JezB4MTQsIDB4NywgMH0sCi0JezB4MTUsIDB4ZjcsIDB9LAotCXsweDE2LCAweDgsIDB9LAotCXsweDE3LCAweDE3LCAwfSwKLQl7MHgxOCwgMHg3LCAwfSwKLQl7MHgxOSwgMCwgMH0sCi0JezB4MUEsIDB4MiwgMH0sCi0JezB4MUIsIDB4MTMsIDB9LAotCXsweDFDLCAweDNlLCAwfSwKLQl7MHgxRCwgMHgzZSwgMH0sCi0JezB4MUUsIDB4OTYsIDB9LAotCXsweDFGLCAweDQsIDB9LAotCXsweDIwLCAwLCAwfSwKLQl7MHgyMSwgMCwgMH0sCi0JezB4MjIsIDB4MTcsIDB9LAotCXsweDIzLCAweDQsIDB9LAotCXsweDI0LCAweDEsIDB9LAotCXsweDI1LCAweDYsIDB9LAotCXsweDI2LCAweDQsIDB9LAotCXsweDI3LCAweGQsIDB9LAotCXsweDI4LCAweGQsIDB9LAotCXsweDI5LCAweDMwLCAwfSwKLQl7MHgyQSwgMHgzMiwgMH0sCi0JezB4MkIsIDB4OCwgMH0sCi0JezB4MkMsIDB4MWMsIDB9LAotCXsweDJELCAweDIsIDB9LAotCXsweDJFLCAweDQsIDB9LAotCXsweDJGLCAweDdmLCAwfSwKLQl7MHgzMCwgMHgyNywgMH0sCi0JezB4MzEsIDAsIDF9LAotCXsweDMyLCAwLCAxfSwKLQl7MHgzMywgMCwgMX0sCi0JezB4MzQsIDAsIDB9LAotCXsweDM1LCAweDI2LCAxfSwKLQl7MHgzNiwgMHgxOCwgMH0sCi0JezB4MzcsIDB4NywgMH0sCi0JezB4MzgsIDB4NjYsIDB9LAotCXsweDM5LCAweDY2LCAwfSwKLQl7MHgzQSwgMHg2NiwgMH0sCi0JezB4M0IsIDB4NjYsIDB9LAotCXsweDNDLCAweGZmLCAxfSwKLQl7MHgzRCwgMHhmZiwgMX0sCi0JezB4M0UsIDB4ZmYsIDF9LAotCXsweDNGLCAweGZmLCAxfSwKLQl7MHg0MCwgMHgxNiwgMH0sCi0JezB4NDEsIDB4NywgMH0sCi0JezB4NDIsIDB4MTksIDB9LAotCXsweDQzLCAweDcsIDB9LAotCXsweDQ0LCAweDYsIDB9LAotCXsweDQ1LCAweDMsIDB9LAotCXsweDQ2LCAweDEsIDB9LAotCXsweDQ3LCAweDcsIDB9LAotCXsweDQ4LCAweDMzLCAwfSwKLQl7MHg0OSwgMHg1LCAwfSwKLQl7MHg0QSwgMHg3NywgMH0sCi0JezB4NEIsIDB4NjYsIDB9LAotCXsweDRDLCAweDY2LCAwfSwKLQl7MHg0RCwgMCwgMH0sCi0JezB4NEUsIDB4NCwgMH0sCi0JezB4NEYsIDB4YywgMH0sCi0JezB4NTAsIDAsIDB9LAotCXsweDUxLCAweDc1LCAwfSwKLQl7MHg1NiwgMHg3LCAwfSwKLQl7MHg1NywgMCwgMH0sCi0JezB4NTgsIDAsIDB9LAotCXsweDU5LCAweGE4LCAwfSwKLQl7MHg1QSwgMCwgMH0sCi0JezB4NUIsIDB4MWYsIDB9LAotCXsweDVDLCAweDMwLCAwfSwKLQl7MHg1RCwgMHgxLCAwfSwKLQl7MHg1RSwgMHgzMCwgMH0sCi0JezB4NUYsIDB4NzAsIDB9LAotCXsweDYwLCAwLCAwfSwKLQl7MHg2MSwgMCwgMH0sCi0JezB4NjIsIDB4MzMsIDF9LAotCXsweDYzLCAweDE5LCAwfSwKLQl7MHg2NCwgMHg2MiwgMH0sCi0JezB4NjUsIDAsIDB9LAotCXsweDY2LCAweDExLCAwfSwKLQl7MHg2OSwgMCwgMH0sCi0JezB4NkEsIDB4N2UsIDB9LAotCXsweDZCLCAweDNmLCAwfSwKLQl7MHg2QywgMHg3ZiwgMH0sCi0JezB4NkQsIDB4NzgsIDB9LAotCXsweDZFLCAweGM4LCAwfSwKLQl7MHg2RiwgMHg4OCwgMH0sCi0JezB4NzAsIDB4OCwgMH0sCi0JezB4NzEsIDB4ZiwgMH0sCi0JezB4NzIsIDB4YmMsIDB9LAotCXsweDczLCAweDgsIDB9LAotCXsweDc0LCAweDYwLCAwfSwKLQl7MHg3NSwgMHgxZSwgMH0sCi0JezB4NzYsIDB4NzAsIDB9LAotCXsweDc3LCAwLCAwfSwKLQl7MHg3OCwgMCwgMH0sCi0JezB4NzksIDAsIDB9LAotCXsweDdBLCAweDMzLCAwfSwKLQl7MHg3QiwgMHgxZSwgMH0sCi0JezB4N0MsIDB4NjIsIDB9LAotCXsweDdELCAweDExLCAwfSwKLQl7MHg4MCwgMHgzYywgMH0sCi0JezB4ODEsIDB4OWMsIDB9LAotCXsweDgyLCAweGEsIDB9LAotCXsweDgzLCAweDlkLCAwfSwKLQl7MHg4NCwgMHhhLCAwfSwKLQl7MHg4NSwgMCwgMH0sCi0JezB4ODYsIDB4NDAsIDB9LAotCXsweDg3LCAweDQwLCAwfSwKLQl7MHg4OCwgMHg4OCwgMH0sCi0JezB4ODksIDB4MTAsIDB9LAotCXsweDhBLCAweGYwLCAxfSwKLQl7MHg4QiwgMHgxMCwgMX0sCi0JezB4OEMsIDB4ZjAsIDF9LAotCXsweDhELCAwLCAwfSwKLQl7MHg4RSwgMCwgMH0sCi0JezB4OEYsIDB4MTAsIDB9LAotCXsweDkwLCAweDU1LCAwfSwKLQl7MHg5MSwgMHgzZiwgMX0sCi0JezB4OTIsIDB4MzYsIDF9LAotCXsweDkzLCAwLCAwfSwKLQl7MHg5NCwgMCwgMH0sCi0JezB4OTUsIDAsIDB9LAotCXsweDk2LCAweDg3LCAwfSwKLQl7MHg5NywgMHgxMSwgMH0sCi0JezB4OTgsIDAsIDB9LAotCXsweDk5LCAweDMzLCAwfSwKLQl7MHg5QSwgMHg4OCwgMH0sCi0JezB4OUIsIDAsIDB9LAotCXsweDlDLCAweDg3LCAwfSwKLQl7MHg5RCwgMHgxMSwgMH0sCi0JezB4OUUsIDAsIDB9LAotCXsweDlGLCAweDMzLCAwfSwKLQl7MHhBMCwgMHg4OCwgMH0sCi0JezB4QTEsIDB4ZTEsIDB9LAotCXsweEEyLCAweDNmLCAwfSwKLQl7MHhBMywgMHg0NCwgMH0sCi0JezB4QTQsIDB4OGMsIDF9LAotCXsweEE1LCAweDZkLCAwfSwKLQl7MHhBNiwgMHgyMiwgMH0sCi0JezB4QTcsIDB4YmUsIDB9LAotCXsweEE4LCAweDU1LCAxfSwKLQl7MHhBOSwgMHhjLCAwfSwKLQl7MHhBQSwgMHhjLCAwfSwKLQl7MHhBQiwgMHhhYSwgMH0sCi0JezB4QUMsIDB4MiwgMH0sCi0JezB4QUQsIDAsIDB9LAotCXsweEFFLCAweDEwLCAwfSwKLQl7MHhBRiwgMHgxLCAxfSwKLQl7MHhCMCwgMCwgMH0sCi0JezB4QjEsIDAsIDB9LAotCXsweEIyLCAweDgwLCAwfSwKLQl7MHhCMywgMHg2MCwgMH0sCi0JezB4QjQsIDB4NDQsIDB9LAotCXsweEI1LCAweDU1LCAwfSwKLQl7MHhCNiwgMHgxLCAwfSwKLQl7MHhCNywgMHg1NSwgMH0sCi0JezB4QjgsIDB4MSwgMH0sCi0JezB4QjksIDB4NSwgMH0sCi0JezB4QkEsIDB4NTUsIDB9LAotCXsweEJCLCAweDU1LCAwfSwKLQl7MHhDMSwgMCwgMH0sCi0JezB4QzIsIDAsIDB9LAotCXsweEMzLCAwLCAwfSwKLQl7MHhDNCwgMCwgMH0sCi0JezB4QzUsIDAsIDB9LAotCXsweEM2LCAwLCAwfSwKLQl7MHhDNywgMCwgMH0sCi0JezB4QzgsIDAsIDB9LAotCXsweEM5LCAwLCAwfSwKLQl7MHhDQSwgMCwgMH0sCi0JezB4Q0IsIDAsIDB9LAotCXsweENDLCAwLCAwfSwKLQl7MHhDRCwgMCwgMH0sCi0JezB4Q0UsIDB4NWUsIDB9LAotCXsweENGLCAweGMsIDB9LAotCXsweEQwLCAweGMsIDB9LAotCXsweEQxLCAweGMsIDB9LAotCXsweEQyLCAwLCAwfSwKLQl7MHhEMywgMHgyYiwgMH0sCi0JezB4RDQsIDB4YywgMH0sCi0JezB4RDUsIDAsIDB9LAotCXsweEQ2LCAweDc1LCAwfSwKLQl7MHhEQiwgMHg3LCAwfSwKLQl7MHhEQywgMCwgMH0sCi0JezB4REQsIDAsIDB9LAotCXsweERFLCAweGE4LCAwfSwKLQl7MHhERiwgMCwgMH0sCi0JezB4RTAsIDB4MWYsIDB9LAotCXsweEUxLCAweDMwLCAwfSwKLQl7MHhFMiwgMHgxLCAwfSwKLQl7MHhFMywgMHgzMCwgMH0sCi0JezB4RTQsIDB4NzAsIDB9LAotCXsweEU1LCAwLCAwfSwKLQl7MHhFNiwgMCwgMH0sCi0JezB4RTcsIDB4MzMsIDB9LAotCXsweEU4LCAweDE5LCAwfSwKLQl7MHhFOSwgMHg2MiwgMH0sCi0JezB4RUEsIDAsIDB9LAotCXsweEVCLCAweDExLCAwfSwKLQl7MHhFRSwgMCwgMH0sCi0JezB4RUYsIDB4N2UsIDB9LAotCXsweEYwLCAweDNmLCAwfSwKLQl7MHhGMSwgMHg3ZiwgMH0sCi0JezB4RjIsIDB4NzgsIDB9LAotCXsweEYzLCAweGM4LCAwfSwKLQl7MHhGNCwgMHg4OCwgMH0sCi0JezB4RjUsIDB4OCwgMH0sCi0JezB4RjYsIDB4ZiwgMH0sCi0JezB4RjcsIDB4YmMsIDB9LAotCXsweEY4LCAweDgsIDB9LAotCXsweEY5LCAweDYwLCAwfSwKLQl7MHhGQSwgMHgxZSwgMH0sCi0JezB4RkIsIDB4NzAsIDB9LAotCXsweEZDLCAwLCAwfSwKLQl7MHhGRCwgMCwgMH0sCi0JezB4RkUsIDAsIDB9LAotCXsweEZGLCAweDMzLCAwfSwKLQl7MHgxMDAsIDB4MWUsIDB9LAotCXsweDEwMSwgMHg2MiwgMH0sCi0JezB4MTAyLCAweDExLCAwfSwKLQl7MHgxMDUsIDB4M2MsIDB9LAotCXsweDEwNiwgMHg5YywgMH0sCi0JezB4MTA3LCAweGEsIDB9LAotCXsweDEwOCwgMHg5ZCwgMH0sCi0JezB4MTA5LCAweGEsIDB9LAotCXsweDEwQSwgMCwgMH0sCi0JezB4MTBCLCAweDQwLCAwfSwKLQl7MHgxMEMsIDB4NDAsIDB9LAotCXsweDEwRCwgMHg4OCwgMH0sCi0JezB4MTBFLCAweDEwLCAwfSwKLQl7MHgxMEYsIDB4ZjAsIDF9LAotCXsweDExMCwgMHgxMCwgMX0sCi0JezB4MTExLCAweGYwLCAxfSwKLQl7MHgxMTIsIDAsIDB9LAotCXsweDExMywgMCwgMH0sCi0JezB4MTE0LCAweDEwLCAwfSwKLQl7MHgxMTUsIDB4NTUsIDB9LAotCXsweDExNiwgMHgzZiwgMX0sCi0JezB4MTE3LCAweDM2LCAxfSwKLQl7MHgxMTgsIDAsIDB9LAotCXsweDExOSwgMCwgMH0sCi0JezB4MTFBLCAwLCAwfSwKLQl7MHgxMUIsIDB4ODcsIDB9LAotCXsweDExQywgMHgxMSwgMH0sCi0JezB4MTFELCAwLCAwfSwKLQl7MHgxMUUsIDB4MzMsIDB9LAotCXsweDExRiwgMHg4OCwgMH0sCi0JezB4MTIwLCAwLCAwfSwKLQl7MHgxMjEsIDB4ODcsIDB9LAotCXsweDEyMiwgMHgxMSwgMH0sCi0JezB4MTIzLCAwLCAwfSwKLQl7MHgxMjQsIDB4MzMsIDB9LAotCXsweDEyNSwgMHg4OCwgMH0sCi0JezB4MTI2LCAweGUxLCAwfSwKLQl7MHgxMjcsIDB4M2YsIDB9LAotCXsweDEyOCwgMHg0NCwgMH0sCi0JezB4MTI5LCAweDhjLCAxfSwKLQl7MHgxMkEsIDB4NmQsIDB9LAotCXsweDEyQiwgMHgyMiwgMH0sCi0JezB4MTJDLCAweGJlLCAwfSwKLQl7MHgxMkQsIDB4NTUsIDF9LAotCXsweDEyRSwgMHhjLCAwfSwKLQl7MHgxMkYsIDB4YywgMH0sCi0JezB4MTMwLCAweGFhLCAwfSwKLQl7MHgxMzEsIDB4MiwgMH0sCi0JezB4MTMyLCAwLCAwfSwKLQl7MHgxMzMsIDB4MTAsIDB9LAotCXsweDEzNCwgMHgxLCAxfSwKLQl7MHgxMzUsIDAsIDB9LAotCXsweDEzNiwgMCwgMH0sCi0JezB4MTM3LCAweDgwLCAwfSwKLQl7MHgxMzgsIDB4NjAsIDB9LAotCXsweDEzOSwgMHg0NCwgMH0sCi0JezB4MTNBLCAweDU1LCAwfSwKLQl7MHgxM0IsIDB4MSwgMH0sCi0JezB4MTNDLCAweDU1LCAwfSwKLQl7MHgxM0QsIDB4MSwgMH0sCi0JezB4MTNFLCAweDUsIDB9LAotCXsweDEzRiwgMHg1NSwgMH0sCi0JezB4MTQwLCAweDU1LCAwfSwKLQl7MHgxNDYsIDAsIDB9LAotCXsweDE0NywgMCwgMH0sCi0JezB4MTQ4LCAwLCAwfSwKLQl7MHgxNDksIDAsIDB9LAotCXsweDE0QSwgMCwgMH0sCi0JezB4MTRCLCAwLCAwfSwKLQl7MHgxNEMsIDAsIDB9LAotCXsweDE0RCwgMCwgMH0sCi0JezB4MTRFLCAwLCAwfSwKLQl7MHgxNEYsIDAsIDB9LAotCXsweDE1MCwgMCwgMH0sCi0JezB4MTUxLCAwLCAwfSwKLQl7MHgxNTIsIDAsIDB9LAotCXsweDE1MywgMCwgMH0sCi0JezB4MTU0LCAweGMsIDB9LAotCXsweDE1NSwgMHhjLCAwfSwKLQl7MHgxNTYsIDB4YywgMH0sCi0JezB4MTU3LCAwLCAwfSwKLQl7MHgxNTgsIDB4MmIsIDB9LAotCXsweDE1OSwgMHg4NCwgMH0sCi0JezB4MTVBLCAweDE1LCAwfSwKLQl7MHgxNUIsIDB4ZiwgMH0sCi0JezB4MTVDLCAwLCAwfSwKLQl7MHgxNUQsIDAsIDB9LAotCXsweDE1RSwgMCwgMX0sCi0JezB4MTVGLCAwLCAxfSwKLQl7MHgxNjAsIDAsIDF9LAotCXsweDE2MSwgMCwgMX0sCi0JezB4MTYyLCAwLCAxfSwKLQl7MHgxNjMsIDAsIDF9LAotCXsweDE2NCwgMCwgMH0sCi0JezB4MTY1LCAwLCAwfSwKLQl7MHgxNjYsIDAsIDB9LAotCXsweDE2NywgMCwgMH0sCi0JezB4MTY4LCAwLCAwfSwKLQl7MHgxNjksIDB4MiwgMX0sCi0JezB4MTZBLCAwLCAxfSwKLQl7MHgxNkIsIDAsIDF9LAotCXsweDE2QywgMCwgMX0sCi0JezB4MTZELCAwLCAwfSwKLQl7MHgxNzAsIDAsIDB9LAotCXsweDE3MSwgMHg3NywgMH0sCi0JezB4MTcyLCAweDc3LCAwfSwKLQl7MHgxNzMsIDB4NzcsIDB9LAotCXsweDE3NCwgMHg3NywgMH0sCi0JezB4MTc1LCAwLCAwfSwKLQl7MHgxNzYsIDB4MywgMH0sCi0JezB4MTc3LCAweDM3LCAwfSwKLQl7MHgxNzgsIDB4MywgMH0sCi0JezB4MTc5LCAwLCAwfSwKLQl7MHgxN0EsIDB4MjEsIDB9LAotCXsweDE3QiwgMHgyMSwgMH0sCi0JezB4MTdDLCAwLCAwfSwKLQl7MHgxN0QsIDB4YWEsIDB9LAotCXsweDE3RSwgMCwgMH0sCi0JezB4MTdGLCAweGFhLCAwfSwKLQl7MHgxODAsIDAsIDB9LAotCXsweDE5MCwgMCwgMH0sCi0JezB4MTkxLCAweDc3LCAwfSwKLQl7MHgxOTIsIDB4NzcsIDB9LAotCXsweDE5MywgMHg3NywgMH0sCi0JezB4MTk0LCAweDc3LCAwfSwKLQl7MHgxOTUsIDAsIDB9LAotCXsweDE5NiwgMHgzLCAwfSwKLQl7MHgxOTcsIDB4MzcsIDB9LAotCXsweDE5OCwgMHgzLCAwfSwKLQl7MHgxOTksIDAsIDB9LAotCXsweDE5QSwgMHgyMSwgMH0sCi0JezB4MTlCLCAweDIxLCAwfSwKLQl7MHgxOUMsIDAsIDB9LAotCXsweDE5RCwgMHhhYSwgMH0sCi0JezB4MTlFLCAwLCAwfSwKLQl7MHgxOUYsIDB4YWEsIDB9LAotCXsweDFBMCwgMCwgMH0sCi0JezB4MUExLCAweDIsIDB9LAotCXsweDFBMiwgMHhmLCAwfSwKLQl7MHgxQTMsIDB4ZiwgMH0sCi0JezB4MUE0LCAwLCAxfSwKLQl7MHgxQTUsIDAsIDF9LAotCXsweDFBNiwgMCwgMX0sCi0JezB4MUE3LCAweDIsIDB9LAotCXsweDFBOCwgMHhmLCAwfSwKLQl7MHgxQTksIDB4ZiwgMH0sCi0JezB4MUFBLCAwLCAxfSwKLQl7MHgxQUIsIDAsIDF9LAotCXsweDFBQywgMCwgMX0sCi0JezB4RkZGRiwgMCwgMH0sCi19OwotCi1zdHJ1Y3QgcmFkaW9fMjB4eF9yZWdzIHJlZ3NfMjA1N19yZXY1W10gPSB7Ci0JezB4MDAsIDAsIDF9LAotCXsweDAxLCAweDU3LCAxfSwKLQl7MHgwMiwgMHgyMCwgMX0sCi0JezB4MDMsIDB4MWYsIDB9LAotCXsweDA0LCAweDQsIDB9LAotCXsweDA1LCAweDIsIDB9LAotCXsweDA2LCAweDEsIDB9LAotCXsweDA3LCAweDEsIDB9LAotCXsweDA4LCAweDEsIDB9LAotCXsweDA5LCAweDY5LCAwfSwKLQl7MHgwQSwgMHg2NiwgMH0sCi0JezB4MEIsIDB4NiwgMH0sCi0JezB4MEMsIDB4MTgsIDB9LAotCXsweDBELCAweDMsIDB9LAotCXsweDBFLCAweDIwLCAwfSwKLQl7MHgwRiwgMHgyMCwgMH0sCi0JezB4MTAsIDAsIDB9LAotCXsweDExLCAweDdjLCAwfSwKLQl7MHgxMiwgMHg0MiwgMH0sCi0JezB4MTMsIDB4YmQsIDB9LAotCXsweDE0LCAweDcsIDB9LAotCXsweDE1LCAweDg3LCAwfSwKLQl7MHgxNiwgMHg4LCAwfSwKLQl7MHgxNywgMHgxNywgMH0sCi0JezB4MTgsIDB4NywgMH0sCi0JezB4MTksIDAsIDB9LAotCXsweDFBLCAweDIsIDB9LAotCXsweDFCLCAweDEzLCAwfSwKLQl7MHgxQywgMHgzZSwgMH0sCi0JezB4MUQsIDB4M2UsIDB9LAotCXsweDFFLCAweDk2LCAwfSwKLQl7MHgxRiwgMHg0LCAwfSwKLQl7MHgyMCwgMCwgMH0sCi0JezB4MjEsIDAsIDB9LAotCXsweDIyLCAweDE3LCAwfSwKLQl7MHgyMywgMHg2LCAxfSwKLQl7MHgyNCwgMHgxLCAwfSwKLQl7MHgyNSwgMHg2LCAwfSwKLQl7MHgyNiwgMHg0LCAwfSwKLQl7MHgyNywgMHhkLCAwfSwKLQl7MHgyOCwgMHhkLCAwfSwKLQl7MHgyOSwgMHgzMCwgMH0sCi0JezB4MkEsIDB4MzIsIDB9LAotCXsweDJCLCAweDgsIDB9LAotCXsweDJDLCAweDFjLCAwfSwKLQl7MHgyRCwgMHgyLCAwfSwKLQl7MHgyRSwgMHg0LCAwfSwKLQl7MHgyRiwgMHg3ZiwgMH0sCi0JezB4MzAsIDB4MjcsIDB9LAotCXsweDMxLCAwLCAxfSwKLQl7MHgzMiwgMCwgMX0sCi0JezB4MzMsIDAsIDF9LAotCXsweDM0LCAwLCAwfSwKLQl7MHgzNSwgMHgyMCwgMH0sCi0JezB4MzYsIDB4MTgsIDB9LAotCXsweDM3LCAweDcsIDB9LAotCXsweDM4LCAweDY2LCAwfSwKLQl7MHgzOSwgMHg2NiwgMH0sCi0JezB4M0MsIDB4ZmYsIDB9LAotCXsweDNELCAweGZmLCAwfSwKLQl7MHg0MCwgMHgxNiwgMH0sCi0JezB4NDEsIDB4NywgMH0sCi0JezB4NDUsIDB4MywgMH0sCi0JezB4NDYsIDB4MSwgMH0sCi0JezB4NDcsIDB4NywgMH0sCi0JezB4NEIsIDB4NjYsIDB9LAotCXsweDRDLCAweDY2LCAwfSwKLQl7MHg0RCwgMCwgMH0sCi0JezB4NEUsIDB4NCwgMH0sCi0JezB4NEYsIDB4YywgMH0sCi0JezB4NTAsIDAsIDB9LAotCXsweDUxLCAweDcwLCAxfSwKLQl7MHg1NiwgMHg3LCAwfSwKLQl7MHg1NywgMCwgMH0sCi0JezB4NTgsIDAsIDB9LAotCXsweDU5LCAweDg4LCAxfSwKLQl7MHg1QSwgMCwgMH0sCi0JezB4NUIsIDB4MWYsIDB9LAotCXsweDVDLCAweDIwLCAxfSwKLQl7MHg1RCwgMHgxLCAwfSwKLQl7MHg1RSwgMHgzMCwgMH0sCi0JezB4NUYsIDB4NzAsIDB9LAotCXsweDYwLCAwLCAwfSwKLQl7MHg2MSwgMCwgMH0sCi0JezB4NjIsIDB4MzMsIDF9LAotCXsweDYzLCAweGYsIDF9LAotCXsweDY0LCAweGYsIDF9LAotCXsweDY1LCAwLCAwfSwKLQl7MHg2NiwgMHgxMSwgMH0sCi0JezB4ODAsIDB4M2MsIDB9LAotCXsweDgxLCAweDEsIDF9LAotCXsweDgyLCAweGEsIDB9LAotCXsweDg1LCAwLCAwfSwKLQl7MHg4NiwgMHg0MCwgMH0sCi0JezB4ODcsIDB4NDAsIDB9LAotCXsweDg4LCAweDg4LCAwfSwKLQl7MHg4OSwgMHgxMCwgMH0sCi0JezB4OEEsIDB4ZjAsIDB9LAotCXsweDhCLCAweDEwLCAwfSwKLQl7MHg4QywgMHhmMCwgMH0sCi0JezB4OEYsIDB4MTAsIDB9LAotCXsweDkwLCAweDU1LCAwfSwKLQl7MHg5MSwgMHgzZiwgMX0sCi0JezB4OTIsIDB4MzYsIDF9LAotCXsweDkzLCAwLCAwfSwKLQl7MHg5NCwgMCwgMH0sCi0JezB4OTUsIDAsIDB9LAotCXsweDk2LCAweDg3LCAwfSwKLQl7MHg5NywgMHgxMSwgMH0sCi0JezB4OTgsIDAsIDB9LAotCXsweDk5LCAweDMzLCAwfSwKLQl7MHg5QSwgMHg4OCwgMH0sCi0JezB4QTEsIDB4MjAsIDF9LAotCXsweEEyLCAweDNmLCAwfSwKLQl7MHhBMywgMHg0NCwgMH0sCi0JezB4QTQsIDB4OGMsIDB9LAotCXsweEE1LCAweDZjLCAwfSwKLQl7MHhBNiwgMHgyMiwgMH0sCi0JezB4QTcsIDB4YmUsIDB9LAotCXsweEE4LCAweDU1LCAwfSwKLQl7MHhBQSwgMHhjLCAwfSwKLQl7MHhBQiwgMHhhYSwgMH0sCi0JezB4QUMsIDB4MiwgMH0sCi0JezB4QUQsIDAsIDB9LAotCXsweEFFLCAweDEwLCAwfSwKLQl7MHhBRiwgMHgxLCAwfSwKLQl7MHhCMCwgMCwgMH0sCi0JezB4QjEsIDAsIDB9LAotCXsweEIyLCAweDgwLCAwfSwKLQl7MHhCMywgMHg2MCwgMH0sCi0JezB4QjQsIDB4NDQsIDB9LAotCXsweEI1LCAweDU1LCAwfSwKLQl7MHhCNiwgMHgxLCAwfSwKLQl7MHhCNywgMHg1NSwgMH0sCi0JezB4QjgsIDB4MSwgMH0sCi0JezB4QjksIDB4NSwgMH0sCi0JezB4QkEsIDB4NTUsIDB9LAotCXsweEJCLCAweDU1LCAwfSwKLQl7MHhDMywgMCwgMH0sCi0JezB4QzQsIDAsIDB9LAotCXsweEM1LCAwLCAwfSwKLQl7MHhDNiwgMCwgMH0sCi0JezB4QzcsIDAsIDB9LAotCXsweEM4LCAwLCAwfSwKLQl7MHhDOSwgMCwgMH0sCi0JezB4Q0EsIDAsIDB9LAotCXsweENCLCAwLCAwfSwKLQl7MHhDRCwgMCwgMH0sCi0JezB4Q0UsIDB4NWUsIDB9LAotCXsweENGLCAweGMsIDB9LAotCXsweEQwLCAweGMsIDB9LAotCXsweEQxLCAweGMsIDB9LAotCXsweEQyLCAwLCAwfSwKLQl7MHhEMywgMHgyYiwgMH0sCi0JezB4RDQsIDB4YywgMH0sCi0JezB4RDUsIDAsIDB9LAotCXsweEQ2LCAweDcwLCAxfSwKLQl7MHhEQiwgMHg3LCAwfSwKLQl7MHhEQywgMCwgMH0sCi0JezB4REQsIDAsIDB9LAotCXsweERFLCAweDg4LCAxfSwKLQl7MHhERiwgMCwgMH0sCi0JezB4RTAsIDB4MWYsIDB9LAotCXsweEUxLCAweDIwLCAxfSwKLQl7MHhFMiwgMHgxLCAwfSwKLQl7MHhFMywgMHgzMCwgMH0sCi0JezB4RTQsIDB4NzAsIDB9LAotCXsweEU1LCAwLCAwfSwKLQl7MHhFNiwgMCwgMH0sCi0JezB4RTcsIDB4MzMsIDB9LAotCXsweEU4LCAweGYsIDF9LAotCXsweEU5LCAweGYsIDF9LAotCXsweEVBLCAwLCAwfSwKLQl7MHhFQiwgMHgxMSwgMH0sCi0JezB4MTA1LCAweDNjLCAwfSwKLQl7MHgxMDYsIDB4MSwgMX0sCi0JezB4MTA3LCAweGEsIDB9LAotCXsweDEwQSwgMCwgMH0sCi0JezB4MTBCLCAweDQwLCAwfSwKLQl7MHgxMEMsIDB4NDAsIDB9LAotCXsweDEwRCwgMHg4OCwgMH0sCi0JezB4MTBFLCAweDEwLCAwfSwKLQl7MHgxMEYsIDB4ZjAsIDB9LAotCXsweDExMCwgMHgxMCwgMH0sCi0JezB4MTExLCAweGYwLCAwfSwKLQl7MHgxMTQsIDB4MTAsIDB9LAotCXsweDExNSwgMHg1NSwgMH0sCi0JezB4MTE2LCAweDNmLCAxfSwKLQl7MHgxMTcsIDB4MzYsIDF9LAotCXsweDExOCwgMCwgMH0sCi0JezB4MTE5LCAwLCAwfSwKLQl7MHgxMUEsIDAsIDB9LAotCXsweDExQiwgMHg4NywgMH0sCi0JezB4MTFDLCAweDExLCAwfSwKLQl7MHgxMUQsIDAsIDB9LAotCXsweDExRSwgMHgzMywgMH0sCi0JezB4MTFGLCAweDg4LCAwfSwKLQl7MHgxMjYsIDB4MjAsIDF9LAotCXsweDEyNywgMHgzZiwgMH0sCi0JezB4MTI4LCAweDQ0LCAwfSwKLQl7MHgxMjksIDB4OGMsIDB9LAotCXsweDEyQSwgMHg2YywgMH0sCi0JezB4MTJCLCAweDIyLCAwfSwKLQl7MHgxMkMsIDB4YmUsIDB9LAotCXsweDEyRCwgMHg1NSwgMH0sCi0JezB4MTJGLCAweGMsIDB9LAotCXsweDEzMCwgMHhhYSwgMH0sCi0JezB4MTMxLCAweDIsIDB9LAotCXsweDEzMiwgMCwgMH0sCi0JezB4MTMzLCAweDEwLCAwfSwKLQl7MHgxMzQsIDB4MSwgMH0sCi0JezB4MTM1LCAwLCAwfSwKLQl7MHgxMzYsIDAsIDB9LAotCXsweDEzNywgMHg4MCwgMH0sCi0JezB4MTM4LCAweDYwLCAwfSwKLQl7MHgxMzksIDB4NDQsIDB9LAotCXsweDEzQSwgMHg1NSwgMH0sCi0JezB4MTNCLCAweDEsIDB9LAotCXsweDEzQywgMHg1NSwgMH0sCi0JezB4MTNELCAweDEsIDB9LAotCXsweDEzRSwgMHg1LCAwfSwKLQl7MHgxM0YsIDB4NTUsIDB9LAotCXsweDE0MCwgMHg1NSwgMH0sCi0JezB4MTQ4LCAwLCAwfSwKLQl7MHgxNDksIDAsIDB9LAotCXsweDE0QSwgMCwgMH0sCi0JezB4MTRCLCAwLCAwfSwKLQl7MHgxNEMsIDAsIDB9LAotCXsweDE0RCwgMCwgMH0sCi0JezB4MTRFLCAwLCAwfSwKLQl7MHgxNEYsIDAsIDB9LAotCXsweDE1MCwgMCwgMH0sCi0JezB4MTU0LCAweGMsIDB9LAotCXsweDE1NSwgMHhjLCAwfSwKLQl7MHgxNTYsIDB4YywgMH0sCi0JezB4MTU3LCAwLCAwfSwKLQl7MHgxNTgsIDB4MmIsIDB9LAotCXsweDE1OSwgMHg4NCwgMH0sCi0JezB4MTVBLCAweDE1LCAwfSwKLQl7MHgxNUIsIDB4ZiwgMH0sCi0JezB4MTVDLCAwLCAwfSwKLQl7MHgxNUQsIDAsIDB9LAotCXsweDE1RSwgMCwgMX0sCi0JezB4MTVGLCAwLCAxfSwKLQl7MHgxNjAsIDAsIDF9LAotCXsweDE2MSwgMCwgMX0sCi0JezB4MTYyLCAwLCAxfSwKLQl7MHgxNjMsIDAsIDF9LAotCXsweDE2NCwgMCwgMH0sCi0JezB4MTY1LCAwLCAwfSwKLQl7MHgxNjYsIDAsIDB9LAotCXsweDE2NywgMCwgMH0sCi0JezB4MTY4LCAwLCAwfSwKLQl7MHgxNjksIDAsIDB9LAotCXsweDE2QSwgMCwgMX0sCi0JezB4MTZCLCAwLCAxfSwKLQl7MHgxNkMsIDAsIDF9LAotCXsweDE2RCwgMCwgMH0sCi0JezB4MTcwLCAwLCAwfSwKLQl7MHgxNzEsIDB4NzcsIDB9LAotCXsweDE3MiwgMHg3NywgMH0sCi0JezB4MTczLCAweDc3LCAwfSwKLQl7MHgxNzQsIDB4NzcsIDB9LAotCXsweDE3NSwgMCwgMH0sCi0JezB4MTc2LCAweDMsIDB9LAotCXsweDE3NywgMHgzNywgMH0sCi0JezB4MTc4LCAweDMsIDB9LAotCXsweDE3OSwgMCwgMH0sCi0JezB4MTdCLCAweDIxLCAwfSwKLQl7MHgxN0MsIDAsIDB9LAotCXsweDE3RCwgMHhhYSwgMH0sCi0JezB4MTdFLCAwLCAwfSwKLQl7MHgxOTAsIDAsIDB9LAotCXsweDE5MSwgMHg3NywgMH0sCi0JezB4MTkyLCAweDc3LCAwfSwKLQl7MHgxOTMsIDB4NzcsIDB9LAotCXsweDE5NCwgMHg3NywgMH0sCi0JezB4MTk1LCAwLCAwfSwKLQl7MHgxOTYsIDB4MywgMH0sCi0JezB4MTk3LCAweDM3LCAwfSwKLQl7MHgxOTgsIDB4MywgMH0sCi0JezB4MTk5LCAwLCAwfSwKLQl7MHgxOUIsIDB4MjEsIDB9LAotCXsweDE5QywgMCwgMH0sCi0JezB4MTlELCAweGFhLCAwfSwKLQl7MHgxOUUsIDAsIDB9LAotCXsweDFBMSwgMHgyLCAwfSwKLQl7MHgxQTIsIDB4ZiwgMH0sCi0JezB4MUEzLCAweGYsIDB9LAotCXsweDFBNCwgMCwgMX0sCi0JezB4MUE1LCAwLCAxfSwKLQl7MHgxQTYsIDAsIDF9LAotCXsweDFBNywgMHgyLCAwfSwKLQl7MHgxQTgsIDB4ZiwgMH0sCi0JezB4MUE5LCAweGYsIDB9LAotCXsweDFBQSwgMCwgMX0sCi0JezB4MUFCLCAwLCAxfSwKLQl7MHgxQUMsIDAsIDF9LAotCXsweDFBRCwgMHg4NCwgMH0sCi0JezB4MUFFLCAweDYwLCAwfSwKLQl7MHgxQUYsIDB4NDcsIDB9LAotCXsweDFCMCwgMHg0NywgMH0sCi0JezB4MUIxLCAwLCAwfSwKLQl7MHgxQjIsIDAsIDB9LAotCXsweDFCMywgMCwgMH0sCi0JezB4MUI0LCAwLCAwfSwKLQl7MHgxQjUsIDAsIDB9LAotCXsweDFCNiwgMCwgMH0sCi0JezB4MUI3LCAweGMsIDF9LAotCXsweDFCOCwgMCwgMH0sCi0JezB4MUI5LCAwLCAwfSwKLQl7MHgxQkEsIDAsIDB9LAotCXsweDFCQiwgMCwgMH0sCi0JezB4MUJDLCAwLCAwfSwKLQl7MHgxQkQsIDAsIDB9LAotCXsweDFCRSwgMCwgMH0sCi0JezB4MUJGLCAwLCAwfSwKLQl7MHgxQzAsIDAsIDB9LAotCXsweDFDMSwgMHgxLCAxfSwKLQl7MHgxQzIsIDB4ODAsIDF9LAotCXsweDFDMywgMCwgMH0sCi0JezB4MUM0LCAwLCAwfSwKLQl7MHgxQzUsIDAsIDB9LAotCXsweDFDNiwgMCwgMH0sCi0JezB4MUM3LCAwLCAwfSwKLQl7MHgxQzgsIDAsIDB9LAotCXsweDFDOSwgMCwgMH0sCi0JezB4MUNBLCAwLCAwfSwKLQl7MHhGRkZGLCAwLCAwfQotfTsKLQotc3RydWN0IHJhZGlvXzIweHhfcmVncyByZWdzXzIwNTdfcmV2NXYxW10gPSB7Ci0JezB4MDAsIDB4MTUsIDF9LAotCXsweDAxLCAweDU3LCAxfSwKLQl7MHgwMiwgMHgyMCwgMX0sCi0JezB4MDMsIDB4MWYsIDB9LAotCXsweDA0LCAweDQsIDB9LAotCXsweDA1LCAweDIsIDB9LAotCXsweDA2LCAweDEsIDB9LAotCXsweDA3LCAweDEsIDB9LAotCXsweDA4LCAweDEsIDB9LAotCXsweDA5LCAweDY5LCAwfSwKLQl7MHgwQSwgMHg2NiwgMH0sCi0JezB4MEIsIDB4NiwgMH0sCi0JezB4MEMsIDB4MTgsIDB9LAotCXsweDBELCAweDMsIDB9LAotCXsweDBFLCAweDIwLCAwfSwKLQl7MHgwRiwgMHgyMCwgMH0sCi0JezB4MTAsIDAsIDB9LAotCXsweDExLCAweDdjLCAwfSwKLQl7MHgxMiwgMHg0MiwgMH0sCi0JezB4MTMsIDB4YmQsIDB9LAotCXsweDE0LCAweDcsIDB9LAotCXsweDE1LCAweDg3LCAwfSwKLQl7MHgxNiwgMHg4LCAwfSwKLQl7MHgxNywgMHgxNywgMH0sCi0JezB4MTgsIDB4NywgMH0sCi0JezB4MTksIDAsIDB9LAotCXsweDFBLCAweDIsIDB9LAotCXsweDFCLCAweDEzLCAwfSwKLQl7MHgxQywgMHgzZSwgMH0sCi0JezB4MUQsIDB4M2UsIDB9LAotCXsweDFFLCAweDk2LCAwfSwKLQl7MHgxRiwgMHg0LCAwfSwKLQl7MHgyMCwgMCwgMH0sCi0JezB4MjEsIDAsIDB9LAotCXsweDIyLCAweDE3LCAwfSwKLQl7MHgyMywgMHg2LCAxfSwKLQl7MHgyNCwgMHgxLCAwfSwKLQl7MHgyNSwgMHg2LCAwfSwKLQl7MHgyNiwgMHg0LCAwfSwKLQl7MHgyNywgMHhkLCAwfSwKLQl7MHgyOCwgMHhkLCAwfSwKLQl7MHgyOSwgMHgzMCwgMH0sCi0JezB4MkEsIDB4MzIsIDB9LAotCXsweDJCLCAweDgsIDB9LAotCXsweDJDLCAweDFjLCAwfSwKLQl7MHgyRCwgMHgyLCAwfSwKLQl7MHgyRSwgMHg0LCAwfSwKLQl7MHgyRiwgMHg3ZiwgMH0sCi0JezB4MzAsIDB4MjcsIDB9LAotCXsweDMxLCAwLCAxfSwKLQl7MHgzMiwgMCwgMX0sCi0JezB4MzMsIDAsIDF9LAotCXsweDM0LCAwLCAwfSwKLQl7MHgzNSwgMHgyMCwgMH0sCi0JezB4MzYsIDB4MTgsIDB9LAotCXsweDM3LCAweDcsIDB9LAotCXsweDM4LCAweDY2LCAwfSwKLQl7MHgzOSwgMHg2NiwgMH0sCi0JezB4M0MsIDB4ZmYsIDB9LAotCXsweDNELCAweGZmLCAwfSwKLQl7MHg0MCwgMHgxNiwgMH0sCi0JezB4NDEsIDB4NywgMH0sCi0JezB4NDUsIDB4MywgMH0sCi0JezB4NDYsIDB4MSwgMH0sCi0JezB4NDcsIDB4NywgMH0sCi0JezB4NEIsIDB4NjYsIDB9LAotCXsweDRDLCAweDY2LCAwfSwKLQl7MHg0RCwgMCwgMH0sCi0JezB4NEUsIDB4NCwgMH0sCi0JezB4NEYsIDB4YywgMH0sCi0JezB4NTAsIDAsIDB9LAotCXsweDUxLCAweDcwLCAxfSwKLQl7MHg1NiwgMHg3LCAwfSwKLQl7MHg1NywgMCwgMH0sCi0JezB4NTgsIDAsIDB9LAotCXsweDU5LCAweDg4LCAxfSwKLQl7MHg1QSwgMCwgMH0sCi0JezB4NUIsIDB4MWYsIDB9LAotCXsweDVDLCAweDIwLCAxfSwKLQl7MHg1RCwgMHgxLCAwfSwKLQl7MHg1RSwgMHgzMCwgMH0sCi0JezB4NUYsIDB4NzAsIDB9LAotCXsweDYwLCAwLCAwfSwKLQl7MHg2MSwgMCwgMH0sCi0JezB4NjIsIDB4MzMsIDF9LAotCXsweDYzLCAweGYsIDF9LAotCXsweDY0LCAweGYsIDF9LAotCXsweDY1LCAwLCAwfSwKLQl7MHg2NiwgMHgxMSwgMH0sCi0JezB4ODAsIDB4M2MsIDB9LAotCXsweDgxLCAweDEsIDF9LAotCXsweDgyLCAweGEsIDB9LAotCXsweDg1LCAwLCAwfSwKLQl7MHg4NiwgMHg0MCwgMH0sCi0JezB4ODcsIDB4NDAsIDB9LAotCXsweDg4LCAweDg4LCAwfSwKLQl7MHg4OSwgMHgxMCwgMH0sCi0JezB4OEEsIDB4ZjAsIDB9LAotCXsweDhCLCAweDEwLCAwfSwKLQl7MHg4QywgMHhmMCwgMH0sCi0JezB4OEYsIDB4MTAsIDB9LAotCXsweDkwLCAweDU1LCAwfSwKLQl7MHg5MSwgMHgzZiwgMX0sCi0JezB4OTIsIDB4MzYsIDF9LAotCXsweDkzLCAwLCAwfSwKLQl7MHg5NCwgMCwgMH0sCi0JezB4OTUsIDAsIDB9LAotCXsweDk2LCAweDg3LCAwfSwKLQl7MHg5NywgMHgxMSwgMH0sCi0JezB4OTgsIDAsIDB9LAotCXsweDk5LCAweDMzLCAwfSwKLQl7MHg5QSwgMHg4OCwgMH0sCi0JezB4QTEsIDB4MjAsIDF9LAotCXsweEEyLCAweDNmLCAwfSwKLQl7MHhBMywgMHg0NCwgMH0sCi0JezB4QTQsIDB4OGMsIDB9LAotCXsweEE1LCAweDZjLCAwfSwKLQl7MHhBNiwgMHgyMiwgMH0sCi0JezB4QTcsIDB4YmUsIDB9LAotCXsweEE4LCAweDU1LCAwfSwKLQl7MHhBQSwgMHhjLCAwfSwKLQl7MHhBQiwgMHhhYSwgMH0sCi0JezB4QUMsIDB4MiwgMH0sCi0JezB4QUQsIDAsIDB9LAotCXsweEFFLCAweDEwLCAwfSwKLQl7MHhBRiwgMHgxLCAwfSwKLQl7MHhCMCwgMCwgMH0sCi0JezB4QjEsIDAsIDB9LAotCXsweEIyLCAweDgwLCAwfSwKLQl7MHhCMywgMHg2MCwgMH0sCi0JezB4QjQsIDB4NDQsIDB9LAotCXsweEI1LCAweDU1LCAwfSwKLQl7MHhCNiwgMHgxLCAwfSwKLQl7MHhCNywgMHg1NSwgMH0sCi0JezB4QjgsIDB4MSwgMH0sCi0JezB4QjksIDB4NSwgMH0sCi0JezB4QkEsIDB4NTUsIDB9LAotCXsweEJCLCAweDU1LCAwfSwKLQl7MHhDMywgMCwgMH0sCi0JezB4QzQsIDAsIDB9LAotCXsweEM1LCAwLCAwfSwKLQl7MHhDNiwgMCwgMH0sCi0JezB4QzcsIDAsIDB9LAotCXsweEM4LCAwLCAwfSwKLQl7MHhDOSwgMHgxLCAxfSwKLQl7MHhDQSwgMCwgMH0sCi0JezB4Q0IsIDAsIDB9LAotCXsweENELCAwLCAwfSwKLQl7MHhDRSwgMHg1ZSwgMH0sCi0JezB4Q0YsIDB4YywgMH0sCi0JezB4RDAsIDB4YywgMH0sCi0JezB4RDEsIDB4YywgMH0sCi0JezB4RDIsIDAsIDB9LAotCXsweEQzLCAweDJiLCAwfSwKLQl7MHhENCwgMHhjLCAwfSwKLQl7MHhENSwgMCwgMH0sCi0JezB4RDYsIDB4NzAsIDF9LAotCXsweERCLCAweDcsIDB9LAotCXsweERDLCAwLCAwfSwKLQl7MHhERCwgMCwgMH0sCi0JezB4REUsIDB4ODgsIDF9LAotCXsweERGLCAwLCAwfSwKLQl7MHhFMCwgMHgxZiwgMH0sCi0JezB4RTEsIDB4MjAsIDF9LAotCXsweEUyLCAweDEsIDB9LAotCXsweEUzLCAweDMwLCAwfSwKLQl7MHhFNCwgMHg3MCwgMH0sCi0JezB4RTUsIDAsIDB9LAotCXsweEU2LCAwLCAwfSwKLQl7MHhFNywgMHgzMywgMH0sCi0JezB4RTgsIDB4ZiwgMX0sCi0JezB4RTksIDB4ZiwgMX0sCi0JezB4RUEsIDAsIDB9LAotCXsweEVCLCAweDExLCAwfSwKLQl7MHgxMDUsIDB4M2MsIDB9LAotCXsweDEwNiwgMHgxLCAxfSwKLQl7MHgxMDcsIDB4YSwgMH0sCi0JezB4MTBBLCAwLCAwfSwKLQl7MHgxMEIsIDB4NDAsIDB9LAotCXsweDEwQywgMHg0MCwgMH0sCi0JezB4MTBELCAweDg4LCAwfSwKLQl7MHgxMEUsIDB4MTAsIDB9LAotCXsweDEwRiwgMHhmMCwgMH0sCi0JezB4MTEwLCAweDEwLCAwfSwKLQl7MHgxMTEsIDB4ZjAsIDB9LAotCXsweDExNCwgMHgxMCwgMH0sCi0JezB4MTE1LCAweDU1LCAwfSwKLQl7MHgxMTYsIDB4M2YsIDF9LAotCXsweDExNywgMHgzNiwgMX0sCi0JezB4MTE4LCAwLCAwfSwKLQl7MHgxMTksIDAsIDB9LAotCXsweDExQSwgMCwgMH0sCi0JezB4MTFCLCAweDg3LCAwfSwKLQl7MHgxMUMsIDB4MTEsIDB9LAotCXsweDExRCwgMCwgMH0sCi0JezB4MTFFLCAweDMzLCAwfSwKLQl7MHgxMUYsIDB4ODgsIDB9LAotCXsweDEyNiwgMHgyMCwgMX0sCi0JezB4MTI3LCAweDNmLCAwfSwKLQl7MHgxMjgsIDB4NDQsIDB9LAotCXsweDEyOSwgMHg4YywgMH0sCi0JezB4MTJBLCAweDZjLCAwfSwKLQl7MHgxMkIsIDB4MjIsIDB9LAotCXsweDEyQywgMHhiZSwgMH0sCi0JezB4MTJELCAweDU1LCAwfSwKLQl7MHgxMkYsIDB4YywgMH0sCi0JezB4MTMwLCAweGFhLCAwfSwKLQl7MHgxMzEsIDB4MiwgMH0sCi0JezB4MTMyLCAwLCAwfSwKLQl7MHgxMzMsIDB4MTAsIDB9LAotCXsweDEzNCwgMHgxLCAwfSwKLQl7MHgxMzUsIDAsIDB9LAotCXsweDEzNiwgMCwgMH0sCi0JezB4MTM3LCAweDgwLCAwfSwKLQl7MHgxMzgsIDB4NjAsIDB9LAotCXsweDEzOSwgMHg0NCwgMH0sCi0JezB4MTNBLCAweDU1LCAwfSwKLQl7MHgxM0IsIDB4MSwgMH0sCi0JezB4MTNDLCAweDU1LCAwfSwKLQl7MHgxM0QsIDB4MSwgMH0sCi0JezB4MTNFLCAweDUsIDB9LAotCXsweDEzRiwgMHg1NSwgMH0sCi0JezB4MTQwLCAweDU1LCAwfSwKLQl7MHgxNDgsIDAsIDB9LAotCXsweDE0OSwgMCwgMH0sCi0JezB4MTRBLCAwLCAwfSwKLQl7MHgxNEIsIDAsIDB9LAotCXsweDE0QywgMCwgMH0sCi0JezB4MTRELCAwLCAwfSwKLQl7MHgxNEUsIDB4MSwgMX0sCi0JezB4MTRGLCAwLCAwfSwKLQl7MHgxNTAsIDAsIDB9LAotCXsweDE1NCwgMHhjLCAwfSwKLQl7MHgxNTUsIDB4YywgMH0sCi0JezB4MTU2LCAweGMsIDB9LAotCXsweDE1NywgMCwgMH0sCi0JezB4MTU4LCAweDJiLCAwfSwKLQl7MHgxNTksIDB4ODQsIDB9LAotCXsweDE1QSwgMHgxNSwgMH0sCi0JezB4MTVCLCAweGYsIDB9LAotCXsweDE1QywgMCwgMH0sCi0JezB4MTVELCAwLCAwfSwKLQl7MHgxNUUsIDAsIDF9LAotCXsweDE1RiwgMCwgMX0sCi0JezB4MTYwLCAwLCAxfSwKLQl7MHgxNjEsIDAsIDF9LAotCXsweDE2MiwgMCwgMX0sCi0JezB4MTYzLCAwLCAxfSwKLQl7MHgxNjQsIDAsIDB9LAotCXsweDE2NSwgMCwgMH0sCi0JezB4MTY2LCAwLCAwfSwKLQl7MHgxNjcsIDAsIDB9LAotCXsweDE2OCwgMCwgMH0sCi0JezB4MTY5LCAwLCAwfSwKLQl7MHgxNkEsIDAsIDF9LAotCXsweDE2QiwgMCwgMX0sCi0JezB4MTZDLCAwLCAxfSwKLQl7MHgxNkQsIDAsIDB9LAotCXsweDE3MCwgMCwgMH0sCi0JezB4MTcxLCAweDc3LCAwfSwKLQl7MHgxNzIsIDB4NzcsIDB9LAotCXsweDE3MywgMHg3NywgMH0sCi0JezB4MTc0LCAweDc3LCAwfSwKLQl7MHgxNzUsIDAsIDB9LAotCXsweDE3NiwgMHgzLCAwfSwKLQl7MHgxNzcsIDB4MzcsIDB9LAotCXsweDE3OCwgMHgzLCAwfSwKLQl7MHgxNzksIDAsIDB9LAotCXsweDE3QiwgMHgyMSwgMH0sCi0JezB4MTdDLCAwLCAwfSwKLQl7MHgxN0QsIDB4YWEsIDB9LAotCXsweDE3RSwgMCwgMH0sCi0JezB4MTkwLCAwLCAwfSwKLQl7MHgxOTEsIDB4NzcsIDB9LAotCXsweDE5MiwgMHg3NywgMH0sCi0JezB4MTkzLCAweDc3LCAwfSwKLQl7MHgxOTQsIDB4NzcsIDB9LAotCXsweDE5NSwgMCwgMH0sCi0JezB4MTk2LCAweDMsIDB9LAotCXsweDE5NywgMHgzNywgMH0sCi0JezB4MTk4LCAweDMsIDB9LAotCXsweDE5OSwgMCwgMH0sCi0JezB4MTlCLCAweDIxLCAwfSwKLQl7MHgxOUMsIDAsIDB9LAotCXsweDE5RCwgMHhhYSwgMH0sCi0JezB4MTlFLCAwLCAwfSwKLQl7MHgxQTEsIDB4MiwgMH0sCi0JezB4MUEyLCAweGYsIDB9LAotCXsweDFBMywgMHhmLCAwfSwKLQl7MHgxQTQsIDAsIDF9LAotCXsweDFBNSwgMCwgMX0sCi0JezB4MUE2LCAwLCAxfSwKLQl7MHgxQTcsIDB4MiwgMH0sCi0JezB4MUE4LCAweGYsIDB9LAotCXsweDFBOSwgMHhmLCAwfSwKLQl7MHgxQUEsIDAsIDF9LAotCXsweDFBQiwgMCwgMX0sCi0JezB4MUFDLCAwLCAxfSwKLQl7MHgxQUQsIDB4ODQsIDB9LAotCXsweDFBRSwgMHg2MCwgMH0sCi0JezB4MUFGLCAweDQ3LCAwfSwKLQl7MHgxQjAsIDB4NDcsIDB9LAotCXsweDFCMSwgMCwgMH0sCi0JezB4MUIyLCAwLCAwfSwKLQl7MHgxQjMsIDAsIDB9LAotCXsweDFCNCwgMCwgMH0sCi0JezB4MUI1LCAwLCAwfSwKLQl7MHgxQjYsIDAsIDB9LAotCXsweDFCNywgMHhjLCAxfSwKLQl7MHgxQjgsIDAsIDB9LAotCXsweDFCOSwgMCwgMH0sCi0JezB4MUJBLCAwLCAwfSwKLQl7MHgxQkIsIDAsIDB9LAotCXsweDFCQywgMCwgMH0sCi0JezB4MUJELCAwLCAwfSwKLQl7MHgxQkUsIDAsIDB9LAotCXsweDFCRiwgMCwgMH0sCi0JezB4MUMwLCAwLCAwfSwKLQl7MHgxQzEsIDB4MSwgMX0sCi0JezB4MUMyLCAweDgwLCAxfSwKLQl7MHgxQzMsIDAsIDB9LAotCXsweDFDNCwgMCwgMH0sCi0JezB4MUM1LCAwLCAwfSwKLQl7MHgxQzYsIDAsIDB9LAotCXsweDFDNywgMCwgMH0sCi0JezB4MUM4LCAwLCAwfSwKLQl7MHgxQzksIDAsIDB9LAotCXsweDFDQSwgMCwgMH0sCi0JezB4RkZGRiwgMCwgMH0KLX07Ci0KLXN0cnVjdCByYWRpb18yMHh4X3JlZ3MgcmVnc18yMDU3X3JldjdbXSA9IHsKLQl7MHgwMCwgMCwgMX0sCi0JezB4MDEsIDB4NTcsIDF9LAotCXsweDAyLCAweDIwLCAxfSwKLQl7MHgwMywgMHgxZiwgMH0sCi0JezB4MDQsIDB4NCwgMH0sCi0JezB4MDUsIDB4MiwgMH0sCi0JezB4MDYsIDB4MSwgMH0sCi0JezB4MDcsIDB4MSwgMH0sCi0JezB4MDgsIDB4MSwgMH0sCi0JezB4MDksIDB4NjksIDB9LAotCXsweDBBLCAweDY2LCAwfSwKLQl7MHgwQiwgMHg2LCAwfSwKLQl7MHgwQywgMHgxOCwgMH0sCi0JezB4MEQsIDB4MywgMH0sCi0JezB4MEUsIDB4MjAsIDB9LAotCXsweDBGLCAweDIwLCAwfSwKLQl7MHgxMCwgMCwgMH0sCi0JezB4MTEsIDB4N2MsIDB9LAotCXsweDEyLCAweDQyLCAwfSwKLQl7MHgxMywgMHhiZCwgMH0sCi0JezB4MTQsIDB4NywgMH0sCi0JezB4MTUsIDB4ODcsIDB9LAotCXsweDE2LCAweDgsIDB9LAotCXsweDE3LCAweDE3LCAwfSwKLQl7MHgxOCwgMHg3LCAwfSwKLQl7MHgxOSwgMCwgMH0sCi0JezB4MUEsIDB4MiwgMH0sCi0JezB4MUIsIDB4MTMsIDB9LAotCXsweDFDLCAweDNlLCAwfSwKLQl7MHgxRCwgMHgzZSwgMH0sCi0JezB4MUUsIDB4OTYsIDB9LAotCXsweDFGLCAweDQsIDB9LAotCXsweDIwLCAwLCAwfSwKLQl7MHgyMSwgMCwgMH0sCi0JezB4MjIsIDB4MTcsIDB9LAotCXsweDIzLCAweDYsIDB9LAotCXsweDI0LCAweDEsIDB9LAotCXsweDI1LCAweDYsIDB9LAotCXsweDI2LCAweDQsIDB9LAotCXsweDI3LCAweGQsIDB9LAotCXsweDI4LCAweGQsIDB9LAotCXsweDI5LCAweDMwLCAwfSwKLQl7MHgyQSwgMHgzMiwgMH0sCi0JezB4MkIsIDB4OCwgMH0sCi0JezB4MkMsIDB4MWMsIDB9LAotCXsweDJELCAweDIsIDB9LAotCXsweDJFLCAweDQsIDB9LAotCXsweDJGLCAweDdmLCAwfSwKLQl7MHgzMCwgMHgyNywgMH0sCi0JezB4MzEsIDAsIDF9LAotCXsweDMyLCAwLCAxfSwKLQl7MHgzMywgMCwgMX0sCi0JezB4MzQsIDAsIDB9LAotCXsweDM1LCAweDIwLCAwfSwKLQl7MHgzNiwgMHgxOCwgMH0sCi0JezB4MzcsIDB4NywgMH0sCi0JezB4MzgsIDB4NjYsIDB9LAotCXsweDM5LCAweDY2LCAwfSwKLQl7MHgzQSwgMHg2NiwgMH0sCi0JezB4M0IsIDB4NjYsIDB9LAotCXsweDNDLCAweGZmLCAwfSwKLQl7MHgzRCwgMHhmZiwgMH0sCi0JezB4M0UsIDB4ZmYsIDB9LAotCXsweDNGLCAweGZmLCAwfSwKLQl7MHg0MCwgMHgxNiwgMH0sCi0JezB4NDEsIDB4NywgMH0sCi0JezB4NDIsIDB4MTksIDB9LAotCXsweDQzLCAweDcsIDB9LAotCXsweDQ0LCAweDYsIDB9LAotCXsweDQ1LCAweDMsIDB9LAotCXsweDQ2LCAweDEsIDB9LAotCXsweDQ3LCAweDcsIDB9LAotCXsweDQ4LCAweDMzLCAwfSwKLQl7MHg0OSwgMHg1LCAwfSwKLQl7MHg0QSwgMHg3NywgMH0sCi0JezB4NEIsIDB4NjYsIDB9LAotCXsweDRDLCAweDY2LCAwfSwKLQl7MHg0RCwgMCwgMH0sCi0JezB4NEUsIDB4NCwgMH0sCi0JezB4NEYsIDB4YywgMH0sCi0JezB4NTAsIDAsIDB9LAotCXsweDUxLCAweDcwLCAxfSwKLQl7MHg1NiwgMHg3LCAwfSwKLQl7MHg1NywgMCwgMH0sCi0JezB4NTgsIDAsIDB9LAotCXsweDU5LCAweDg4LCAxfSwKLQl7MHg1QSwgMCwgMH0sCi0JezB4NUIsIDB4MWYsIDB9LAotCXsweDVDLCAweDIwLCAxfSwKLQl7MHg1RCwgMHgxLCAwfSwKLQl7MHg1RSwgMHgzMCwgMH0sCi0JezB4NUYsIDB4NzAsIDB9LAotCXsweDYwLCAwLCAwfSwKLQl7MHg2MSwgMCwgMH0sCi0JezB4NjIsIDB4MzMsIDF9LAotCXsweDYzLCAweGYsIDF9LAotCXsweDY0LCAweDEzLCAxfSwKLQl7MHg2NSwgMCwgMH0sCi0JezB4NjYsIDB4ZWUsIDF9LAotCXsweDY5LCAwLCAwfSwKLQl7MHg2QSwgMHg3ZSwgMH0sCi0JezB4NkIsIDB4M2YsIDB9LAotCXsweDZDLCAweDdmLCAwfSwKLQl7MHg2RCwgMHg3OCwgMH0sCi0JezB4NkUsIDB4NTgsIDF9LAotCXsweDZGLCAweDg4LCAwfSwKLQl7MHg3MCwgMHg4LCAwfSwKLQl7MHg3MSwgMHhmLCAwfSwKLQl7MHg3MiwgMHhiYywgMH0sCi0JezB4NzMsIDB4OCwgMH0sCi0JezB4NzQsIDB4NjAsIDB9LAotCXsweDc1LCAweDEzLCAxfSwKLQl7MHg3NiwgMHg3MCwgMH0sCi0JezB4NzcsIDAsIDB9LAotCXsweDc4LCAwLCAwfSwKLQl7MHg3OSwgMCwgMH0sCi0JezB4N0EsIDB4MzMsIDB9LAotCXsweDdCLCAweDEzLCAxfSwKLQl7MHg3QywgMHgxNCwgMX0sCi0JezB4N0QsIDB4ZWUsIDF9LAotCXsweDgwLCAweDNjLCAwfSwKLQl7MHg4MSwgMHgxLCAxfSwKLQl7MHg4MiwgMHhhLCAwfSwKLQl7MHg4MywgMHg5ZCwgMH0sCi0JezB4ODQsIDB4YSwgMH0sCi0JezB4ODUsIDAsIDB9LAotCXsweDg2LCAweDQwLCAwfSwKLQl7MHg4NywgMHg0MCwgMH0sCi0JezB4ODgsIDB4ODgsIDB9LAotCXsweDg5LCAweDEwLCAwfSwKLQl7MHg4QSwgMHhmMCwgMH0sCi0JezB4OEIsIDB4MTAsIDB9LAotCXsweDhDLCAweGYwLCAwfSwKLQl7MHg4RCwgMCwgMH0sCi0JezB4OEUsIDAsIDB9LAotCXsweDhGLCAweDEwLCAwfSwKLQl7MHg5MCwgMHg1NSwgMH0sCi0JezB4OTEsIDB4M2YsIDF9LAotCXsweDkyLCAweDM2LCAxfSwKLQl7MHg5MywgMCwgMH0sCi0JezB4OTQsIDAsIDB9LAotCXsweDk1LCAwLCAwfSwKLQl7MHg5NiwgMHg4NywgMH0sCi0JezB4OTcsIDB4MTEsIDB9LAotCXsweDk4LCAwLCAwfSwKLQl7MHg5OSwgMHgzMywgMH0sCi0JezB4OUEsIDB4ODgsIDB9LAotCXsweDlCLCAwLCAwfSwKLQl7MHg5QywgMHg4NywgMH0sCi0JezB4OUQsIDB4MTEsIDB9LAotCXsweDlFLCAwLCAwfSwKLQl7MHg5RiwgMHgzMywgMH0sCi0JezB4QTAsIDB4ODgsIDB9LAotCXsweEExLCAweDIwLCAxfSwKLQl7MHhBMiwgMHgzZiwgMH0sCi0JezB4QTMsIDB4NDQsIDB9LAotCXsweEE0LCAweDhjLCAwfSwKLQl7MHhBNSwgMHg2YywgMH0sCi0JezB4QTYsIDB4MjIsIDB9LAotCXsweEE3LCAweGJlLCAwfSwKLQl7MHhBOCwgMHg1NSwgMH0sCi0JezB4QUEsIDB4YywgMH0sCi0JezB4QUIsIDB4YWEsIDB9LAotCXsweEFDLCAweDIsIDB9LAotCXsweEFELCAwLCAwfSwKLQl7MHhBRSwgMHgxMCwgMH0sCi0JezB4QUYsIDB4MSwgMH0sCi0JezB4QjAsIDAsIDB9LAotCXsweEIxLCAwLCAwfSwKLQl7MHhCMiwgMHg4MCwgMH0sCi0JezB4QjMsIDB4NjAsIDB9LAotCXsweEI0LCAweDQ0LCAwfSwKLQl7MHhCNSwgMHg1NSwgMH0sCi0JezB4QjYsIDB4MSwgMH0sCi0JezB4QjcsIDB4NTUsIDB9LAotCXsweEI4LCAweDEsIDB9LAotCXsweEI5LCAweDUsIDB9LAotCXsweEJBLCAweDU1LCAwfSwKLQl7MHhCQiwgMHg1NSwgMH0sCi0JezB4QzEsIDAsIDB9LAotCXsweEMyLCAwLCAwfSwKLQl7MHhDMywgMCwgMH0sCi0JezB4QzQsIDAsIDB9LAotCXsweEM1LCAwLCAwfSwKLQl7MHhDNiwgMCwgMH0sCi0JezB4QzcsIDAsIDB9LAotCXsweEM4LCAwLCAwfSwKLQl7MHhDOSwgMCwgMH0sCi0JezB4Q0EsIDAsIDB9LAotCXsweENCLCAwLCAwfSwKLQl7MHhDQywgMCwgMH0sCi0JezB4Q0QsIDAsIDB9LAotCXsweENFLCAweDVlLCAwfSwKLQl7MHhDRiwgMHhjLCAwfSwKLQl7MHhEMCwgMHhjLCAwfSwKLQl7MHhEMSwgMHhjLCAwfSwKLQl7MHhEMiwgMCwgMH0sCi0JezB4RDMsIDB4MmIsIDB9LAotCXsweEQ0LCAweGMsIDB9LAotCXsweEQ1LCAwLCAwfSwKLQl7MHhENiwgMHg3MCwgMX0sCi0JezB4REIsIDB4NywgMH0sCi0JezB4REMsIDAsIDB9LAotCXsweERELCAwLCAwfSwKLQl7MHhERSwgMHg4OCwgMX0sCi0JezB4REYsIDAsIDB9LAotCXsweEUwLCAweDFmLCAwfSwKLQl7MHhFMSwgMHgyMCwgMX0sCi0JezB4RTIsIDB4MSwgMH0sCi0JezB4RTMsIDB4MzAsIDB9LAotCXsweEU0LCAweDcwLCAwfSwKLQl7MHhFNSwgMCwgMH0sCi0JezB4RTYsIDAsIDB9LAotCXsweEU3LCAweDMzLCAwfSwKLQl7MHhFOCwgMHhmLCAxfSwKLQl7MHhFOSwgMHgxMywgMX0sCi0JezB4RUEsIDAsIDB9LAotCXsweEVCLCAweGVlLCAxfSwKLQl7MHhFRSwgMCwgMH0sCi0JezB4RUYsIDB4N2UsIDB9LAotCXsweEYwLCAweDNmLCAwfSwKLQl7MHhGMSwgMHg3ZiwgMH0sCi0JezB4RjIsIDB4NzgsIDB9LAotCXsweEYzLCAweDU4LCAxfSwKLQl7MHhGNCwgMHg4OCwgMH0sCi0JezB4RjUsIDB4OCwgMH0sCi0JezB4RjYsIDB4ZiwgMH0sCi0JezB4RjcsIDB4YmMsIDB9LAotCXsweEY4LCAweDgsIDB9LAotCXsweEY5LCAweDYwLCAwfSwKLQl7MHhGQSwgMHgxMywgMX0sCi0JezB4RkIsIDB4NzAsIDB9LAotCXsweEZDLCAwLCAwfSwKLQl7MHhGRCwgMCwgMH0sCi0JezB4RkUsIDAsIDB9LAotCXsweEZGLCAweDMzLCAwfSwKLQl7MHgxMDAsIDB4MTMsIDF9LAotCXsweDEwMSwgMHgxNCwgMX0sCi0JezB4MTAyLCAweGVlLCAxfSwKLQl7MHgxMDUsIDB4M2MsIDB9LAotCXsweDEwNiwgMHgxLCAxfSwKLQl7MHgxMDcsIDB4YSwgMH0sCi0JezB4MTA4LCAweDlkLCAwfSwKLQl7MHgxMDksIDB4YSwgMH0sCi0JezB4MTBBLCAwLCAwfSwKLQl7MHgxMEIsIDB4NDAsIDB9LAotCXsweDEwQywgMHg0MCwgMH0sCi0JezB4MTBELCAweDg4LCAwfSwKLQl7MHgxMEUsIDB4MTAsIDB9LAotCXsweDEwRiwgMHhmMCwgMH0sCi0JezB4MTEwLCAweDEwLCAwfSwKLQl7MHgxMTEsIDB4ZjAsIDB9LAotCXsweDExMiwgMCwgMH0sCi0JezB4MTEzLCAwLCAwfSwKLQl7MHgxMTQsIDB4MTAsIDB9LAotCXsweDExNSwgMHg1NSwgMH0sCi0JezB4MTE2LCAweDNmLCAxfSwKLQl7MHgxMTcsIDB4MzYsIDF9LAotCXsweDExOCwgMCwgMH0sCi0JezB4MTE5LCAwLCAwfSwKLQl7MHgxMUEsIDAsIDB9LAotCXsweDExQiwgMHg4NywgMH0sCi0JezB4MTFDLCAweDExLCAwfSwKLQl7MHgxMUQsIDAsIDB9LAotCXsweDExRSwgMHgzMywgMH0sCi0JezB4MTFGLCAweDg4LCAwfSwKLQl7MHgxMjAsIDAsIDB9LAotCXsweDEyMSwgMHg4NywgMH0sCi0JezB4MTIyLCAweDExLCAwfSwKLQl7MHgxMjMsIDAsIDB9LAotCXsweDEyNCwgMHgzMywgMH0sCi0JezB4MTI1LCAweDg4LCAwfSwKLQl7MHgxMjYsIDB4MjAsIDF9LAotCXsweDEyNywgMHgzZiwgMH0sCi0JezB4MTI4LCAweDQ0LCAwfSwKLQl7MHgxMjksIDB4OGMsIDB9LAotCXsweDEyQSwgMHg2YywgMH0sCi0JezB4MTJCLCAweDIyLCAwfSwKLQl7MHgxMkMsIDB4YmUsIDB9LAotCXsweDEyRCwgMHg1NSwgMH0sCi0JezB4MTJGLCAweGMsIDB9LAotCXsweDEzMCwgMHhhYSwgMH0sCi0JezB4MTMxLCAweDIsIDB9LAotCXsweDEzMiwgMCwgMH0sCi0JezB4MTMzLCAweDEwLCAwfSwKLQl7MHgxMzQsIDB4MSwgMH0sCi0JezB4MTM1LCAwLCAwfSwKLQl7MHgxMzYsIDAsIDB9LAotCXsweDEzNywgMHg4MCwgMH0sCi0JezB4MTM4LCAweDYwLCAwfSwKLQl7MHgxMzksIDB4NDQsIDB9LAotCXsweDEzQSwgMHg1NSwgMH0sCi0JezB4MTNCLCAweDEsIDB9LAotCXsweDEzQywgMHg1NSwgMH0sCi0JezB4MTNELCAweDEsIDB9LAotCXsweDEzRSwgMHg1LCAwfSwKLQl7MHgxM0YsIDB4NTUsIDB9LAotCXsweDE0MCwgMHg1NSwgMH0sCi0JezB4MTQ2LCAwLCAwfSwKLQl7MHgxNDcsIDAsIDB9LAotCXsweDE0OCwgMCwgMH0sCi0JezB4MTQ5LCAwLCAwfSwKLQl7MHgxNEEsIDAsIDB9LAotCXsweDE0QiwgMCwgMH0sCi0JezB4MTRDLCAwLCAwfSwKLQl7MHgxNEQsIDAsIDB9LAotCXsweDE0RSwgMCwgMH0sCi0JezB4MTRGLCAwLCAwfSwKLQl7MHgxNTAsIDAsIDB9LAotCXsweDE1MSwgMCwgMH0sCi0JezB4MTU0LCAweGMsIDB9LAotCXsweDE1NSwgMHhjLCAwfSwKLQl7MHgxNTYsIDB4YywgMH0sCi0JezB4MTU3LCAwLCAwfSwKLQl7MHgxNTgsIDB4MmIsIDB9LAotCXsweDE1OSwgMHg4NCwgMH0sCi0JezB4MTVBLCAweDE1LCAwfSwKLQl7MHgxNUIsIDB4ZiwgMH0sCi0JezB4MTVDLCAwLCAwfSwKLQl7MHgxNUQsIDAsIDB9LAotCXsweDE1RSwgMCwgMX0sCi0JezB4MTVGLCAwLCAxfSwKLQl7MHgxNjAsIDAsIDF9LAotCXsweDE2MSwgMCwgMX0sCi0JezB4MTYyLCAwLCAxfSwKLQl7MHgxNjMsIDAsIDF9LAotCXsweDE2NCwgMCwgMH0sCi0JezB4MTY1LCAwLCAwfSwKLQl7MHgxNjYsIDAsIDB9LAotCXsweDE2NywgMCwgMH0sCi0JezB4MTY4LCAwLCAwfSwKLQl7MHgxNjksIDAsIDB9LAotCXsweDE2QSwgMCwgMX0sCi0JezB4MTZCLCAwLCAxfSwKLQl7MHgxNkMsIDAsIDF9LAotCXsweDE2RCwgMCwgMH0sCi0JezB4MTcwLCAwLCAwfSwKLQl7MHgxNzEsIDB4NzcsIDB9LAotCXsweDE3MiwgMHg3NywgMH0sCi0JezB4MTczLCAweDc3LCAwfSwKLQl7MHgxNzQsIDB4NzcsIDB9LAotCXsweDE3NSwgMCwgMH0sCi0JezB4MTc2LCAweDMsIDB9LAotCXsweDE3NywgMHgzNywgMH0sCi0JezB4MTc4LCAweDMsIDB9LAotCXsweDE3OSwgMCwgMH0sCi0JezB4MTdBLCAweDIxLCAwfSwKLQl7MHgxN0IsIDB4MjEsIDB9LAotCXsweDE3QywgMCwgMH0sCi0JezB4MTdELCAweGFhLCAwfSwKLQl7MHgxN0UsIDAsIDB9LAotCXsweDE3RiwgMHhhYSwgMH0sCi0JezB4MTgwLCAwLCAwfSwKLQl7MHgxOTAsIDAsIDB9LAotCXsweDE5MSwgMHg3NywgMH0sCi0JezB4MTkyLCAweDc3LCAwfSwKLQl7MHgxOTMsIDB4NzcsIDB9LAotCXsweDE5NCwgMHg3NywgMH0sCi0JezB4MTk1LCAwLCAwfSwKLQl7MHgxOTYsIDB4MywgMH0sCi0JezB4MTk3LCAweDM3LCAwfSwKLQl7MHgxOTgsIDB4MywgMH0sCi0JezB4MTk5LCAwLCAwfSwKLQl7MHgxOUEsIDB4MjEsIDB9LAotCXsweDE5QiwgMHgyMSwgMH0sCi0JezB4MTlDLCAwLCAwfSwKLQl7MHgxOUQsIDB4YWEsIDB9LAotCXsweDE5RSwgMCwgMH0sCi0JezB4MTlGLCAweGFhLCAwfSwKLQl7MHgxQTAsIDAsIDB9LAotCXsweDFBMSwgMHgyLCAwfSwKLQl7MHgxQTIsIDB4ZiwgMH0sCi0JezB4MUEzLCAweGYsIDB9LAotCXsweDFBNCwgMCwgMX0sCi0JezB4MUE1LCAwLCAxfSwKLQl7MHgxQTYsIDAsIDF9LAotCXsweDFBNywgMHgyLCAwfSwKLQl7MHgxQTgsIDB4ZiwgMH0sCi0JezB4MUE5LCAweGYsIDB9LAotCXsweDFBQSwgMCwgMX0sCi0JezB4MUFCLCAwLCAxfSwKLQl7MHgxQUMsIDAsIDF9LAotCXsweDFBRCwgMHg4NCwgMH0sCi0JezB4MUFFLCAweDYwLCAwfSwKLQl7MHgxQUYsIDB4NDcsIDB9LAotCXsweDFCMCwgMHg0NywgMH0sCi0JezB4MUIxLCAwLCAwfSwKLQl7MHgxQjIsIDAsIDB9LAotCXsweDFCMywgMCwgMH0sCi0JezB4MUI0LCAwLCAwfSwKLQl7MHgxQjUsIDAsIDB9LAotCXsweDFCNiwgMCwgMH0sCi0JezB4MUI3LCAweDUsIDF9LAotCXsweDFCOCwgMCwgMH0sCi0JezB4MUI5LCAwLCAwfSwKLQl7MHgxQkEsIDAsIDB9LAotCXsweDFCQiwgMCwgMH0sCi0JezB4MUJDLCAwLCAwfSwKLQl7MHgxQkQsIDAsIDB9LAotCXsweDFCRSwgMCwgMH0sCi0JezB4MUJGLCAwLCAwfSwKLQl7MHgxQzAsIDAsIDB9LAotCXsweDFDMSwgMCwgMH0sCi0JezB4MUMyLCAweGEwLCAxfSwKLQl7MHgxQzMsIDAsIDB9LAotCXsweDFDNCwgMCwgMH0sCi0JezB4MUM1LCAwLCAwfSwKLQl7MHgxQzYsIDAsIDB9LAotCXsweDFDNywgMCwgMH0sCi0JezB4MUM4LCAwLCAwfSwKLQl7MHgxQzksIDAsIDB9LAotCXsweDFDQSwgMCwgMH0sCi0JezB4RkZGRiwgMCwgMH0KLX07Ci0KLXN0cnVjdCByYWRpb18yMHh4X3JlZ3MgcmVnc18yMDU3X3JldjhbXSA9IHsKLQl7MHgwMCwgMHg4LCAxfSwKLQl7MHgwMSwgMHg1NywgMX0sCi0JezB4MDIsIDB4MjAsIDF9LAotCXsweDAzLCAweDFmLCAwfSwKLQl7MHgwNCwgMHg0LCAwfSwKLQl7MHgwNSwgMHgyLCAwfSwKLQl7MHgwNiwgMHgxLCAwfSwKLQl7MHgwNywgMHgxLCAwfSwKLQl7MHgwOCwgMHgxLCAwfSwKLQl7MHgwOSwgMHg2OSwgMH0sCi0JezB4MEEsIDB4NjYsIDB9LAotCXsweDBCLCAweDYsIDB9LAotCXsweDBDLCAweDE4LCAwfSwKLQl7MHgwRCwgMHgzLCAwfSwKLQl7MHgwRSwgMHgyMCwgMH0sCi0JezB4MEYsIDB4MjAsIDB9LAotCXsweDEwLCAwLCAwfSwKLQl7MHgxMSwgMHg3YywgMH0sCi0JezB4MTIsIDB4NDIsIDB9LAotCXsweDEzLCAweGJkLCAwfSwKLQl7MHgxNCwgMHg3LCAwfSwKLQl7MHgxNSwgMHg4NywgMH0sCi0JezB4MTYsIDB4OCwgMH0sCi0JezB4MTcsIDB4MTcsIDB9LAotCXsweDE4LCAweDcsIDB9LAotCXsweDE5LCAwLCAwfSwKLQl7MHgxQSwgMHgyLCAwfSwKLQl7MHgxQiwgMHgxMywgMH0sCi0JezB4MUMsIDB4M2UsIDB9LAotCXsweDFELCAweDNlLCAwfSwKLQl7MHgxRSwgMHg5NiwgMH0sCi0JezB4MUYsIDB4NCwgMH0sCi0JezB4MjAsIDAsIDB9LAotCXsweDIxLCAwLCAwfSwKLQl7MHgyMiwgMHgxNywgMH0sCi0JezB4MjMsIDB4NiwgMH0sCi0JezB4MjQsIDB4MSwgMH0sCi0JezB4MjUsIDB4NiwgMH0sCi0JezB4MjYsIDB4NCwgMH0sCi0JezB4MjcsIDB4ZCwgMH0sCi0JezB4MjgsIDB4ZCwgMH0sCi0JezB4MjksIDB4MzAsIDB9LAotCXsweDJBLCAweDMyLCAwfSwKLQl7MHgyQiwgMHg4LCAwfSwKLQl7MHgyQywgMHgxYywgMH0sCi0JezB4MkQsIDB4MiwgMH0sCi0JezB4MkUsIDB4NCwgMH0sCi0JezB4MkYsIDB4N2YsIDB9LAotCXsweDMwLCAweDI3LCAwfSwKLQl7MHgzMSwgMCwgMX0sCi0JezB4MzIsIDAsIDF9LAotCXsweDMzLCAwLCAxfSwKLQl7MHgzNCwgMCwgMH0sCi0JezB4MzUsIDB4MjAsIDB9LAotCXsweDM2LCAweDE4LCAwfSwKLQl7MHgzNywgMHg3LCAwfSwKLQl7MHgzOCwgMHg2NiwgMH0sCi0JezB4MzksIDB4NjYsIDB9LAotCXsweDNBLCAweDY2LCAwfSwKLQl7MHgzQiwgMHg2NiwgMH0sCi0JezB4M0MsIDB4ZmYsIDB9LAotCXsweDNELCAweGZmLCAwfSwKLQl7MHgzRSwgMHhmZiwgMH0sCi0JezB4M0YsIDB4ZmYsIDB9LAotCXsweDQwLCAweDE2LCAwfSwKLQl7MHg0MSwgMHg3LCAwfSwKLQl7MHg0MiwgMHgxOSwgMH0sCi0JezB4NDMsIDB4NywgMH0sCi0JezB4NDQsIDB4NiwgMH0sCi0JezB4NDUsIDB4MywgMH0sCi0JezB4NDYsIDB4MSwgMH0sCi0JezB4NDcsIDB4NywgMH0sCi0JezB4NDgsIDB4MzMsIDB9LAotCXsweDQ5LCAweDUsIDB9LAotCXsweDRBLCAweDc3LCAwfSwKLQl7MHg0QiwgMHg2NiwgMH0sCi0JezB4NEMsIDB4NjYsIDB9LAotCXsweDRELCAwLCAwfSwKLQl7MHg0RSwgMHg0LCAwfSwKLQl7MHg0RiwgMHhjLCAwfSwKLQl7MHg1MCwgMCwgMH0sCi0JezB4NTEsIDB4NzAsIDF9LAotCXsweDU2LCAweDcsIDB9LAotCXsweDU3LCAwLCAwfSwKLQl7MHg1OCwgMCwgMH0sCi0JezB4NTksIDB4ODgsIDF9LAotCXsweDVBLCAwLCAwfSwKLQl7MHg1QiwgMHgxZiwgMH0sCi0JezB4NUMsIDB4MjAsIDF9LAotCXsweDVELCAweDEsIDB9LAotCXsweDVFLCAweDMwLCAwfSwKLQl7MHg1RiwgMHg3MCwgMH0sCi0JezB4NjAsIDAsIDB9LAotCXsweDYxLCAwLCAwfSwKLQl7MHg2MiwgMHgzMywgMX0sCi0JezB4NjMsIDB4ZiwgMX0sCi0JezB4NjQsIDB4ZiwgMX0sCi0JezB4NjUsIDAsIDB9LAotCXsweDY2LCAweDExLCAwfSwKLQl7MHg2OSwgMCwgMH0sCi0JezB4NkEsIDB4N2UsIDB9LAotCXsweDZCLCAweDNmLCAwfSwKLQl7MHg2QywgMHg3ZiwgMH0sCi0JezB4NkQsIDB4NzgsIDB9LAotCXsweDZFLCAweDU4LCAxfSwKLQl7MHg2RiwgMHg4OCwgMH0sCi0JezB4NzAsIDB4OCwgMH0sCi0JezB4NzEsIDB4ZiwgMH0sCi0JezB4NzIsIDB4YmMsIDB9LAotCXsweDczLCAweDgsIDB9LAotCXsweDc0LCAweDYwLCAwfSwKLQl7MHg3NSwgMHgxMywgMX0sCi0JezB4NzYsIDB4NzAsIDB9LAotCXsweDc3LCAwLCAwfSwKLQl7MHg3OCwgMCwgMH0sCi0JezB4NzksIDAsIDB9LAotCXsweDdBLCAweDMzLCAwfSwKLQl7MHg3QiwgMHgxMywgMX0sCi0JezB4N0MsIDB4ZiwgMX0sCi0JezB4N0QsIDB4ZWUsIDF9LAotCXsweDgwLCAweDNjLCAwfSwKLQl7MHg4MSwgMHgxLCAxfSwKLQl7MHg4MiwgMHhhLCAwfSwKLQl7MHg4MywgMHg5ZCwgMH0sCi0JezB4ODQsIDB4YSwgMH0sCi0JezB4ODUsIDAsIDB9LAotCXsweDg2LCAweDQwLCAwfSwKLQl7MHg4NywgMHg0MCwgMH0sCi0JezB4ODgsIDB4ODgsIDB9LAotCXsweDg5LCAweDEwLCAwfSwKLQl7MHg4QSwgMHhmMCwgMH0sCi0JezB4OEIsIDB4MTAsIDB9LAotCXsweDhDLCAweGYwLCAwfSwKLQl7MHg4RCwgMCwgMH0sCi0JezB4OEUsIDAsIDB9LAotCXsweDhGLCAweDEwLCAwfSwKLQl7MHg5MCwgMHg1NSwgMH0sCi0JezB4OTEsIDB4M2YsIDF9LAotCXsweDkyLCAweDM2LCAxfSwKLQl7MHg5MywgMCwgMH0sCi0JezB4OTQsIDAsIDB9LAotCXsweDk1LCAwLCAwfSwKLQl7MHg5NiwgMHg4NywgMH0sCi0JezB4OTcsIDB4MTEsIDB9LAotCXsweDk4LCAwLCAwfSwKLQl7MHg5OSwgMHgzMywgMH0sCi0JezB4OUEsIDB4ODgsIDB9LAotCXsweDlCLCAwLCAwfSwKLQl7MHg5QywgMHg4NywgMH0sCi0JezB4OUQsIDB4MTEsIDB9LAotCXsweDlFLCAwLCAwfSwKLQl7MHg5RiwgMHgzMywgMH0sCi0JezB4QTAsIDB4ODgsIDB9LAotCXsweEExLCAweDIwLCAxfSwKLQl7MHhBMiwgMHgzZiwgMH0sCi0JezB4QTMsIDB4NDQsIDB9LAotCXsweEE0LCAweDhjLCAwfSwKLQl7MHhBNSwgMHg2YywgMH0sCi0JezB4QTYsIDB4MjIsIDB9LAotCXsweEE3LCAweGJlLCAwfSwKLQl7MHhBOCwgMHg1NSwgMH0sCi0JezB4QUEsIDB4YywgMH0sCi0JezB4QUIsIDB4YWEsIDB9LAotCXsweEFDLCAweDIsIDB9LAotCXsweEFELCAwLCAwfSwKLQl7MHhBRSwgMHgxMCwgMH0sCi0JezB4QUYsIDB4MSwgMH0sCi0JezB4QjAsIDAsIDB9LAotCXsweEIxLCAwLCAwfSwKLQl7MHhCMiwgMHg4MCwgMH0sCi0JezB4QjMsIDB4NjAsIDB9LAotCXsweEI0LCAweDQ0LCAwfSwKLQl7MHhCNSwgMHg1NSwgMH0sCi0JezB4QjYsIDB4MSwgMH0sCi0JezB4QjcsIDB4NTUsIDB9LAotCXsweEI4LCAweDEsIDB9LAotCXsweEI5LCAweDUsIDB9LAotCXsweEJBLCAweDU1LCAwfSwKLQl7MHhCQiwgMHg1NSwgMH0sCi0JezB4QzEsIDAsIDB9LAotCXsweEMyLCAwLCAwfSwKLQl7MHhDMywgMCwgMH0sCi0JezB4QzQsIDAsIDB9LAotCXsweEM1LCAwLCAwfSwKLQl7MHhDNiwgMCwgMH0sCi0JezB4QzcsIDAsIDB9LAotCXsweEM4LCAwLCAwfSwKLQl7MHhDOSwgMHgxLCAxfSwKLQl7MHhDQSwgMCwgMH0sCi0JezB4Q0IsIDAsIDB9LAotCXsweENDLCAwLCAwfSwKLQl7MHhDRCwgMCwgMH0sCi0JezB4Q0UsIDB4NWUsIDB9LAotCXsweENGLCAweGMsIDB9LAotCXsweEQwLCAweGMsIDB9LAotCXsweEQxLCAweGMsIDB9LAotCXsweEQyLCAwLCAwfSwKLQl7MHhEMywgMHgyYiwgMH0sCi0JezB4RDQsIDB4YywgMH0sCi0JezB4RDUsIDAsIDB9LAotCXsweEQ2LCAweDcwLCAxfSwKLQl7MHhEQiwgMHg3LCAwfSwKLQl7MHhEQywgMCwgMH0sCi0JezB4REQsIDAsIDB9LAotCXsweERFLCAweDg4LCAxfSwKLQl7MHhERiwgMCwgMH0sCi0JezB4RTAsIDB4MWYsIDB9LAotCXsweEUxLCAweDIwLCAxfSwKLQl7MHhFMiwgMHgxLCAwfSwKLQl7MHhFMywgMHgzMCwgMH0sCi0JezB4RTQsIDB4NzAsIDB9LAotCXsweEU1LCAwLCAwfSwKLQl7MHhFNiwgMCwgMH0sCi0JezB4RTcsIDB4MzMsIDB9LAotCXsweEU4LCAweGYsIDF9LAotCXsweEU5LCAweGYsIDF9LAotCXsweEVBLCAwLCAwfSwKLQl7MHhFQiwgMHgxMSwgMH0sCi0JezB4RUUsIDAsIDB9LAotCXsweEVGLCAweDdlLCAwfSwKLQl7MHhGMCwgMHgzZiwgMH0sCi0JezB4RjEsIDB4N2YsIDB9LAotCXsweEYyLCAweDc4LCAwfSwKLQl7MHhGMywgMHg1OCwgMX0sCi0JezB4RjQsIDB4ODgsIDB9LAotCXsweEY1LCAweDgsIDB9LAotCXsweEY2LCAweGYsIDB9LAotCXsweEY3LCAweGJjLCAwfSwKLQl7MHhGOCwgMHg4LCAwfSwKLQl7MHhGOSwgMHg2MCwgMH0sCi0JezB4RkEsIDB4MTMsIDF9LAotCXsweEZCLCAweDcwLCAwfSwKLQl7MHhGQywgMCwgMH0sCi0JezB4RkQsIDAsIDB9LAotCXsweEZFLCAwLCAwfSwKLQl7MHhGRiwgMHgzMywgMH0sCi0JezB4MTAwLCAweDEzLCAxfSwKLQl7MHgxMDEsIDB4ZiwgMX0sCi0JezB4MTAyLCAweGVlLCAxfSwKLQl7MHgxMDUsIDB4M2MsIDB9LAotCXsweDEwNiwgMHgxLCAxfSwKLQl7MHgxMDcsIDB4YSwgMH0sCi0JezB4MTA4LCAweDlkLCAwfSwKLQl7MHgxMDksIDB4YSwgMH0sCi0JezB4MTBBLCAwLCAwfSwKLQl7MHgxMEIsIDB4NDAsIDB9LAotCXsweDEwQywgMHg0MCwgMH0sCi0JezB4MTBELCAweDg4LCAwfSwKLQl7MHgxMEUsIDB4MTAsIDB9LAotCXsweDEwRiwgMHhmMCwgMH0sCi0JezB4MTEwLCAweDEwLCAwfSwKLQl7MHgxMTEsIDB4ZjAsIDB9LAotCXsweDExMiwgMCwgMH0sCi0JezB4MTEzLCAwLCAwfSwKLQl7MHgxMTQsIDB4MTAsIDB9LAotCXsweDExNSwgMHg1NSwgMH0sCi0JezB4MTE2LCAweDNmLCAxfSwKLQl7MHgxMTcsIDB4MzYsIDF9LAotCXsweDExOCwgMCwgMH0sCi0JezB4MTE5LCAwLCAwfSwKLQl7MHgxMUEsIDAsIDB9LAotCXsweDExQiwgMHg4NywgMH0sCi0JezB4MTFDLCAweDExLCAwfSwKLQl7MHgxMUQsIDAsIDB9LAotCXsweDExRSwgMHgzMywgMH0sCi0JezB4MTFGLCAweDg4LCAwfSwKLQl7MHgxMjAsIDAsIDB9LAotCXsweDEyMSwgMHg4NywgMH0sCi0JezB4MTIyLCAweDExLCAwfSwKLQl7MHgxMjMsIDAsIDB9LAotCXsweDEyNCwgMHgzMywgMH0sCi0JezB4MTI1LCAweDg4LCAwfSwKLQl7MHgxMjYsIDB4MjAsIDF9LAotCXsweDEyNywgMHgzZiwgMH0sCi0JezB4MTI4LCAweDQ0LCAwfSwKLQl7MHgxMjksIDB4OGMsIDB9LAotCXsweDEyQSwgMHg2YywgMH0sCi0JezB4MTJCLCAweDIyLCAwfSwKLQl7MHgxMkMsIDB4YmUsIDB9LAotCXsweDEyRCwgMHg1NSwgMH0sCi0JezB4MTJGLCAweGMsIDB9LAotCXsweDEzMCwgMHhhYSwgMH0sCi0JezB4MTMxLCAweDIsIDB9LAotCXsweDEzMiwgMCwgMH0sCi0JezB4MTMzLCAweDEwLCAwfSwKLQl7MHgxMzQsIDB4MSwgMH0sCi0JezB4MTM1LCAwLCAwfSwKLQl7MHgxMzYsIDAsIDB9LAotCXsweDEzNywgMHg4MCwgMH0sCi0JezB4MTM4LCAweDYwLCAwfSwKLQl7MHgxMzksIDB4NDQsIDB9LAotCXsweDEzQSwgMHg1NSwgMH0sCi0JezB4MTNCLCAweDEsIDB9LAotCXsweDEzQywgMHg1NSwgMH0sCi0JezB4MTNELCAweDEsIDB9LAotCXsweDEzRSwgMHg1LCAwfSwKLQl7MHgxM0YsIDB4NTUsIDB9LAotCXsweDE0MCwgMHg1NSwgMH0sCi0JezB4MTQ2LCAwLCAwfSwKLQl7MHgxNDcsIDAsIDB9LAotCXsweDE0OCwgMCwgMH0sCi0JezB4MTQ5LCAwLCAwfSwKLQl7MHgxNEEsIDAsIDB9LAotCXsweDE0QiwgMCwgMH0sCi0JezB4MTRDLCAwLCAwfSwKLQl7MHgxNEQsIDAsIDB9LAotCXsweDE0RSwgMHgxLCAxfSwKLQl7MHgxNEYsIDAsIDB9LAotCXsweDE1MCwgMCwgMH0sCi0JezB4MTUxLCAwLCAwfSwKLQl7MHgxNTQsIDB4YywgMH0sCi0JezB4MTU1LCAweGMsIDB9LAotCXsweDE1NiwgMHhjLCAwfSwKLQl7MHgxNTcsIDAsIDB9LAotCXsweDE1OCwgMHgyYiwgMH0sCi0JezB4MTU5LCAweDg0LCAwfSwKLQl7MHgxNUEsIDB4MTUsIDB9LAotCXsweDE1QiwgMHhmLCAwfSwKLQl7MHgxNUMsIDAsIDB9LAotCXsweDE1RCwgMCwgMH0sCi0JezB4MTVFLCAwLCAxfSwKLQl7MHgxNUYsIDAsIDF9LAotCXsweDE2MCwgMCwgMX0sCi0JezB4MTYxLCAwLCAxfSwKLQl7MHgxNjIsIDAsIDF9LAotCXsweDE2MywgMCwgMX0sCi0JezB4MTY0LCAwLCAwfSwKLQl7MHgxNjUsIDAsIDB9LAotCXsweDE2NiwgMCwgMH0sCi0JezB4MTY3LCAwLCAwfSwKLQl7MHgxNjgsIDAsIDB9LAotCXsweDE2OSwgMCwgMH0sCi0JezB4MTZBLCAwLCAxfSwKLQl7MHgxNkIsIDAsIDF9LAotCXsweDE2QywgMCwgMX0sCi0JezB4MTZELCAwLCAwfSwKLQl7MHgxNzAsIDAsIDB9LAotCXsweDE3MSwgMHg3NywgMH0sCi0JezB4MTcyLCAweDc3LCAwfSwKLQl7MHgxNzMsIDB4NzcsIDB9LAotCXsweDE3NCwgMHg3NywgMH0sCi0JezB4MTc1LCAwLCAwfSwKLQl7MHgxNzYsIDB4MywgMH0sCi0JezB4MTc3LCAweDM3LCAwfSwKLQl7MHgxNzgsIDB4MywgMH0sCi0JezB4MTc5LCAwLCAwfSwKLQl7MHgxN0EsIDB4MjEsIDB9LAotCXsweDE3QiwgMHgyMSwgMH0sCi0JezB4MTdDLCAwLCAwfSwKLQl7MHgxN0QsIDB4YWEsIDB9LAotCXsweDE3RSwgMCwgMH0sCi0JezB4MTdGLCAweGFhLCAwfSwKLQl7MHgxODAsIDAsIDB9LAotCXsweDE5MCwgMCwgMH0sCi0JezB4MTkxLCAweDc3LCAwfSwKLQl7MHgxOTIsIDB4NzcsIDB9LAotCXsweDE5MywgMHg3NywgMH0sCi0JezB4MTk0LCAweDc3LCAwfSwKLQl7MHgxOTUsIDAsIDB9LAotCXsweDE5NiwgMHgzLCAwfSwKLQl7MHgxOTcsIDB4MzcsIDB9LAotCXsweDE5OCwgMHgzLCAwfSwKLQl7MHgxOTksIDAsIDB9LAotCXsweDE5QSwgMHgyMSwgMH0sCi0JezB4MTlCLCAweDIxLCAwfSwKLQl7MHgxOUMsIDAsIDB9LAotCXsweDE5RCwgMHhhYSwgMH0sCi0JezB4MTlFLCAwLCAwfSwKLQl7MHgxOUYsIDB4YWEsIDB9LAotCXsweDFBMCwgMCwgMH0sCi0JezB4MUExLCAweDIsIDB9LAotCXsweDFBMiwgMHhmLCAwfSwKLQl7MHgxQTMsIDB4ZiwgMH0sCi0JezB4MUE0LCAwLCAxfSwKLQl7MHgxQTUsIDAsIDF9LAotCXsweDFBNiwgMCwgMX0sCi0JezB4MUE3LCAweDIsIDB9LAotCXsweDFBOCwgMHhmLCAwfSwKLQl7MHgxQTksIDB4ZiwgMH0sCi0JezB4MUFBLCAwLCAxfSwKLQl7MHgxQUIsIDAsIDF9LAotCXsweDFBQywgMCwgMX0sCi0JezB4MUFELCAweDg0LCAwfSwKLQl7MHgxQUUsIDB4NjAsIDB9LAotCXsweDFBRiwgMHg0NywgMH0sCi0JezB4MUIwLCAweDQ3LCAwfSwKLQl7MHgxQjEsIDAsIDB9LAotCXsweDFCMiwgMCwgMH0sCi0JezB4MUIzLCAwLCAwfSwKLQl7MHgxQjQsIDAsIDB9LAotCXsweDFCNSwgMCwgMH0sCi0JezB4MUI2LCAwLCAwfSwKLQl7MHgxQjcsIDB4NSwgMX0sCi0JezB4MUI4LCAwLCAwfSwKLQl7MHgxQjksIDAsIDB9LAotCXsweDFCQSwgMCwgMH0sCi0JezB4MUJCLCAwLCAwfSwKLQl7MHgxQkMsIDAsIDB9LAotCXsweDFCRCwgMCwgMH0sCi0JezB4MUJFLCAwLCAwfSwKLQl7MHgxQkYsIDAsIDB9LAotCXsweDFDMCwgMCwgMH0sCi0JezB4MUMxLCAwLCAwfSwKLQl7MHgxQzIsIDB4YTAsIDF9LAotCXsweDFDMywgMCwgMH0sCi0JezB4MUM0LCAwLCAwfSwKLQl7MHgxQzUsIDAsIDB9LAotCXsweDFDNiwgMCwgMH0sCi0JezB4MUM3LCAwLCAwfSwKLQl7MHgxQzgsIDAsIDB9LAotCXsweDFDOSwgMCwgMH0sCi0JezB4MUNBLCAwLCAwfSwKLQl7MHhGRkZGLCAwLCAwfQotfTsKLQotc3RhdGljIHMxNiBucGh5X2RlZl9sbmFnYWluc1tdID0geyAtMiwgMTAsIDE5LCAyNSB9OwotCi1zdGF0aWMgczMyIG5waHlfbG5hZ2Fpbl9lc3QwW10gPSB7IC0zMTUsIDQwMzcwIH07Ci1zdGF0aWMgczMyIG5waHlfbG5hZ2Fpbl9lc3QxW10gPSB7IC0yMjQsIDIzMjQyIH07Ci0KLXN0YXRpYyBjb25zdCB1MTYgdGJsX2lxY2FsX2dhaW5wYXJhbXNfbnBoeVsyXVtOUEhZX0lRQ0FMX05VTUdBSU5TXVs4XSA9IHsKLQl7Ci0JIHsweDAwMCwgMCwgMCwgMiwgMHg2OSwgMHg2OSwgMHg2OSwgMHg2OX0sCi0JIHsweDcwMCwgNywgMCwgMCwgMHg2OSwgMHg2OSwgMHg2OSwgMHg2OX0sCi0JIHsweDcxMCwgNywgMSwgMCwgMHg2OCwgMHg2OCwgMHg2OCwgMHg2OH0sCi0JIHsweDcyMCwgNywgMiwgMCwgMHg2NywgMHg2NywgMHg2NywgMHg2N30sCi0JIHsweDczMCwgNywgMywgMCwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2Nn0sCi0JIHsweDc0MCwgNywgNCwgMCwgMHg2NSwgMHg2NSwgMHg2NSwgMHg2NX0sCi0JIHsweDc0MSwgNywgNCwgMSwgMHg2NSwgMHg2NSwgMHg2NSwgMHg2NX0sCi0JIHsweDc0MiwgNywgNCwgMiwgMHg2NSwgMHg2NSwgMHg2NSwgMHg2NX0sCi0JIHsweDc0MywgNywgNCwgMywgMHg2NSwgMHg2NSwgMHg2NSwgMHg2NX0KLQkgfSwKLQl7Ci0JIHsweDAwMCwgNywgMCwgMCwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OX0sCi0JIHsweDcwMCwgNywgMCwgMCwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OX0sCi0JIHsweDcxMCwgNywgMSwgMCwgMHg3OSwgMHg3OSwgMHg3OSwgMHg3OX0sCi0JIHsweDcyMCwgNywgMiwgMCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OH0sCi0JIHsweDczMCwgNywgMywgMCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OH0sCi0JIHsweDc0MCwgNywgNCwgMCwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OH0sCi0JIHsweDc0MSwgNywgNCwgMSwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OH0sCi0JIHsweDc0MiwgNywgNCwgMiwgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OH0sCi0JIHsweDc0MywgNywgNCwgMywgMHg3OCwgMHg3OCwgMHg3OCwgMHg3OH0KLQkgfQotfTsKLQotc3RhdGljIGNvbnN0IHUzMiBucGh5X3RwY190eGdhaW5bXSA9IHsKLQkweDAzY2MyYjQ0LCAweDAzY2MyYjQyLCAweDAzY2MyYTQ0LCAweDAzY2MyYTQyLAotCTB4MDNjYzI5NDQsIDB4MDNjODJiNDQsIDB4MDNjODJiNDIsIDB4MDNjODJhNDQsCi0JMHgwM2M4MmE0MiwgMHgwM2M4Mjk0NCwgMHgwM2M4Mjk0MiwgMHgwM2M4Mjg0NCwKLQkweDAzYzgyODQyLCAweDAzYzQyYjQ0LCAweDAzYzQyYjQyLCAweDAzYzQyYTQ0LAotCTB4MDNjNDJhNDIsIDB4MDNjNDI5NDQsIDB4MDNjNDI5NDIsIDB4MDNjNDI4NDQsCi0JMHgwM2M0Mjg0MiwgMHgwM2M0Mjc0NCwgMHgwM2M0Mjc0MiwgMHgwM2M0MjY0NCwKLQkweDAzYzQyNjQyLCAweDAzYzQyNTQ0LCAweDAzYzQyNTQyLCAweDAzYzQyNDQ0LAotCTB4MDNjNDI0NDIsIDB4MDNjMDJiNDQsIDB4MDNjMDJiNDIsIDB4MDNjMDJhNDQsCi0JMHgwM2MwMmE0MiwgMHgwM2MwMjk0NCwgMHgwM2MwMjk0MiwgMHgwM2MwMjg0NCwKLQkweDAzYzAyODQyLCAweDAzYzAyNzQ0LCAweDAzYzAyNzQyLCAweDAzYjAyYjQ0LAotCTB4MDNiMDJiNDIsIDB4MDNiMDJhNDQsIDB4MDNiMDJhNDIsIDB4MDNiMDI5NDQsCi0JMHgwM2IwMjk0MiwgMHgwM2IwMjg0NCwgMHgwM2IwMjg0MiwgMHgwM2IwMjc0NCwKLQkweDAzYjAyNzQyLCAweDAzYjAyNjQ0LCAweDAzYjAyNjQyLCAweDAzYjAyNTQ0LAotCTB4MDNiMDI1NDIsIDB4MDNhMDJiNDQsIDB4MDNhMDJiNDIsIDB4MDNhMDJhNDQsCi0JMHgwM2EwMmE0MiwgMHgwM2EwMjk0NCwgMHgwM2EwMjk0MiwgMHgwM2EwMjg0NCwKLQkweDAzYTAyODQyLCAweDAzYTAyNzQ0LCAweDAzYTAyNzQyLCAweDAzOTAyYjQ0LAotCTB4MDM5MDJiNDIsIDB4MDM5MDJhNDQsIDB4MDM5MDJhNDIsIDB4MDM5MDI5NDQsCi0JMHgwMzkwMjk0MiwgMHgwMzkwMjg0NCwgMHgwMzkwMjg0MiwgMHgwMzkwMjc0NCwKLQkweDAzOTAyNzQyLCAweDAzOTAyNjQ0LCAweDAzOTAyNjQyLCAweDAzOTAyNTQ0LAotCTB4MDM5MDI1NDIsIDB4MDM4MDJiNDQsIDB4MDM4MDJiNDIsIDB4MDM4MDJhNDQsCi0JMHgwMzgwMmE0MiwgMHgwMzgwMjk0NCwgMHgwMzgwMjk0MiwgMHgwMzgwMjg0NCwKLQkweDAzODAyODQyLCAweDAzODAyNzQ0LCAweDAzODAyNzQyLCAweDAzODAyNjQ0LAotCTB4MDM4MDI2NDIsIDB4MDM4MDI1NDQsIDB4MDM4MDI1NDIsIDB4MDM4MDI0NDQsCi0JMHgwMzgwMjQ0MiwgMHgwMzgwMjM0NCwgMHgwMzgwMjM0MiwgMHgwMzgwMjI0NCwKLQkweDAzODAyMjQyLCAweDAzODAyMTQ0LCAweDAzODAyMTQyLCAweDAzODAyMDQ0LAotCTB4MDM4MDIwNDIsIDB4MDM4MDFmNDQsIDB4MDM4MDFmNDIsIDB4MDM4MDFlNDQsCi0JMHgwMzgwMWU0MiwgMHgwMzgwMWQ0NCwgMHgwMzgwMWQ0MiwgMHgwMzgwMWM0NCwKLQkweDAzODAxYzQyLCAweDAzODAxYjQ0LCAweDAzODAxYjQyLCAweDAzODAxYTQ0LAotCTB4MDM4MDFhNDIsIDB4MDM4MDE5NDQsIDB4MDM4MDE5NDIsIDB4MDM4MDE4NDQsCi0JMHgwMzgwMTg0MiwgMHgwMzgwMTc0NCwgMHgwMzgwMTc0MiwgMHgwMzgwMTY0NCwKLQkweDAzODAxNjQyLCAweDAzODAxNTQ0LCAweDAzODAxNTQyLCAweDAzODAxNDQ0LAotCTB4MDM4MDE0NDIsIDB4MDM4MDEzNDQsIDB4MDM4MDEzNDIsIDB4MDAwMDJiMDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1MTYgbnBoeV90cGNfbG9zY2FsZVtdID0gewotCTI1NiwgMjU2LCAyNzEsIDI3MSwgMjg3LCAyNTYsIDI1NiwgMjcxLAotCTI3MSwgMjg3LCAyODcsIDMwNCwgMzA0LCAyNTYsIDI1NiwgMjcxLAotCTI3MSwgMjg3LCAyODcsIDMwNCwgMzA0LCAzMjIsIDMyMiwgMzQxLAotCTM0MSwgMzYyLCAzNjIsIDM4MywgMzgzLCAyNTYsIDI1NiwgMjcxLAotCTI3MSwgMjg3LCAyODcsIDMwNCwgMzA0LCAzMjIsIDMyMiwgMjU2LAotCTI1NiwgMjcxLCAyNzEsIDI4NywgMjg3LCAzMDQsIDMwNCwgMzIyLAotCTMyMiwgMzQxLCAzNDEsIDM2MiwgMzYyLCAyNTYsIDI1NiwgMjcxLAotCTI3MSwgMjg3LCAyODcsIDMwNCwgMzA0LCAzMjIsIDMyMiwgMjU2LAotCTI1NiwgMjcxLCAyNzEsIDI4NywgMjg3LCAzMDQsIDMwNCwgMzIyLAotCTMyMiwgMzQxLCAzNDEsIDM2MiwgMzYyLCAyNTYsIDI1NiwgMjcxLAotCTI3MSwgMjg3LCAyODcsIDMwNCwgMzA0LCAzMjIsIDMyMiwgMzQxLAotCTM0MSwgMzYyLCAzNjIsIDM4MywgMzgzLCA0MDYsIDQwNiwgNDMwLAotCTQzMCwgNDU1LCA0NTUsIDQ4MiwgNDgyLCA1MTEsIDUxMSwgNTQxLAotCTU0MSwgNTczLCA1NzMsIDYwNywgNjA3LCA2NDMsIDY0MywgNjgxLAotCTY4MSwgNzIyLCA3MjIsIDc2NCwgNzY0LCA4MTAsIDgxMCwgODU4LAotCTg1OCwgOTA4LCA5MDgsIDk2MiwgOTYyLCAxMDE5LCAxMDE5LCAyNTYKLX07Ci0KLXN0YXRpYyB1MzIgbnBoeV90cGNfdHhnYWluX2lwYVtdID0gewotCTB4NWZmNzAwMmQsIDB4NWZmNzAwMmIsIDB4NWZmNzAwMmEsIDB4NWZmNzAwMjksCi0JMHg1ZmY3MDAyOCwgMHg1ZmY3MDAyNywgMHg1ZmY3MDAyNiwgMHg1ZmY3MDAyNSwKLQkweDVlZjcwMDJkLCAweDVlZjcwMDJiLCAweDVlZjcwMDJhLCAweDVlZjcwMDI5LAotCTB4NWVmNzAwMjgsIDB4NWVmNzAwMjcsIDB4NWVmNzAwMjYsIDB4NWVmNzAwMjUsCi0JMHg1ZGY3MDAyZCwgMHg1ZGY3MDAyYiwgMHg1ZGY3MDAyYSwgMHg1ZGY3MDAyOSwKLQkweDVkZjcwMDI4LCAweDVkZjcwMDI3LCAweDVkZjcwMDI2LCAweDVkZjcwMDI1LAotCTB4NWNmNzAwMmQsIDB4NWNmNzAwMmIsIDB4NWNmNzAwMmEsIDB4NWNmNzAwMjksCi0JMHg1Y2Y3MDAyOCwgMHg1Y2Y3MDAyNywgMHg1Y2Y3MDAyNiwgMHg1Y2Y3MDAyNSwKLQkweDViZjcwMDJkLCAweDViZjcwMDJiLCAweDViZjcwMDJhLCAweDViZjcwMDI5LAotCTB4NWJmNzAwMjgsIDB4NWJmNzAwMjcsIDB4NWJmNzAwMjYsIDB4NWJmNzAwMjUsCi0JMHg1YWY3MDAyZCwgMHg1YWY3MDAyYiwgMHg1YWY3MDAyYSwgMHg1YWY3MDAyOSwKLQkweDVhZjcwMDI4LCAweDVhZjcwMDI3LCAweDVhZjcwMDI2LCAweDVhZjcwMDI1LAotCTB4NTlmNzAwMmQsIDB4NTlmNzAwMmIsIDB4NTlmNzAwMmEsIDB4NTlmNzAwMjksCi0JMHg1OWY3MDAyOCwgMHg1OWY3MDAyNywgMHg1OWY3MDAyNiwgMHg1OWY3MDAyNSwKLQkweDU4ZjcwMDJkLCAweDU4ZjcwMDJiLCAweDU4ZjcwMDJhLCAweDU4ZjcwMDI5LAotCTB4NThmNzAwMjgsIDB4NThmNzAwMjcsIDB4NThmNzAwMjYsIDB4NThmNzAwMjUsCi0JMHg1N2Y3MDAyZCwgMHg1N2Y3MDAyYiwgMHg1N2Y3MDAyYSwgMHg1N2Y3MDAyOSwKLQkweDU3ZjcwMDI4LCAweDU3ZjcwMDI3LCAweDU3ZjcwMDI2LCAweDU3ZjcwMDI1LAotCTB4NTZmNzAwMmQsIDB4NTZmNzAwMmIsIDB4NTZmNzAwMmEsIDB4NTZmNzAwMjksCi0JMHg1NmY3MDAyOCwgMHg1NmY3MDAyNywgMHg1NmY3MDAyNiwgMHg1NmY3MDAyNSwKLQkweDU1ZjcwMDJkLCAweDU1ZjcwMDJiLCAweDU1ZjcwMDJhLCAweDU1ZjcwMDI5LAotCTB4NTVmNzAwMjgsIDB4NTVmNzAwMjcsIDB4NTVmNzAwMjYsIDB4NTVmNzAwMjUsCi0JMHg1NGY3MDAyZCwgMHg1NGY3MDAyYiwgMHg1NGY3MDAyYSwgMHg1NGY3MDAyOSwKLQkweDU0ZjcwMDI4LCAweDU0ZjcwMDI3LCAweDU0ZjcwMDI2LCAweDU0ZjcwMDI1LAotCTB4NTNmNzAwMmQsIDB4NTNmNzAwMmIsIDB4NTNmNzAwMmEsIDB4NTNmNzAwMjksCi0JMHg1M2Y3MDAyOCwgMHg1M2Y3MDAyNywgMHg1M2Y3MDAyNiwgMHg1M2Y3MDAyNSwKLQkweDUyZjcwMDJkLCAweDUyZjcwMDJiLCAweDUyZjcwMDJhLCAweDUyZjcwMDI5LAotCTB4NTJmNzAwMjgsIDB4NTJmNzAwMjcsIDB4NTJmNzAwMjYsIDB4NTJmNzAwMjUsCi0JMHg1MWY3MDAyZCwgMHg1MWY3MDAyYiwgMHg1MWY3MDAyYSwgMHg1MWY3MDAyOSwKLQkweDUxZjcwMDI4LCAweDUxZjcwMDI3LCAweDUxZjcwMDI2LCAweDUxZjcwMDI1LAotCTB4NTBmNzAwMmQsIDB4NTBmNzAwMmIsIDB4NTBmNzAwMmEsIDB4NTBmNzAwMjksCi0JMHg1MGY3MDAyOCwgMHg1MGY3MDAyNywgMHg1MGY3MDAyNiwgMHg1MGY3MDAyNQotfTsKLQotc3RhdGljIHUzMiBucGh5X3RwY190eGdhaW5faXBhX3JldjVbXSA9IHsKLQkweDFmZjcwMDJkLCAweDFmZjcwMDJiLCAweDFmZjcwMDJhLCAweDFmZjcwMDI5LAotCTB4MWZmNzAwMjgsIDB4MWZmNzAwMjcsIDB4MWZmNzAwMjYsIDB4MWZmNzAwMjUsCi0JMHgxZWY3MDAyZCwgMHgxZWY3MDAyYiwgMHgxZWY3MDAyYSwgMHgxZWY3MDAyOSwKLQkweDFlZjcwMDI4LCAweDFlZjcwMDI3LCAweDFlZjcwMDI2LCAweDFlZjcwMDI1LAotCTB4MWRmNzAwMmQsIDB4MWRmNzAwMmIsIDB4MWRmNzAwMmEsIDB4MWRmNzAwMjksCi0JMHgxZGY3MDAyOCwgMHgxZGY3MDAyNywgMHgxZGY3MDAyNiwgMHgxZGY3MDAyNSwKLQkweDFjZjcwMDJkLCAweDFjZjcwMDJiLCAweDFjZjcwMDJhLCAweDFjZjcwMDI5LAotCTB4MWNmNzAwMjgsIDB4MWNmNzAwMjcsIDB4MWNmNzAwMjYsIDB4MWNmNzAwMjUsCi0JMHgxYmY3MDAyZCwgMHgxYmY3MDAyYiwgMHgxYmY3MDAyYSwgMHgxYmY3MDAyOSwKLQkweDFiZjcwMDI4LCAweDFiZjcwMDI3LCAweDFiZjcwMDI2LCAweDFiZjcwMDI1LAotCTB4MWFmNzAwMmQsIDB4MWFmNzAwMmIsIDB4MWFmNzAwMmEsIDB4MWFmNzAwMjksCi0JMHgxYWY3MDAyOCwgMHgxYWY3MDAyNywgMHgxYWY3MDAyNiwgMHgxYWY3MDAyNSwKLQkweDE5ZjcwMDJkLCAweDE5ZjcwMDJiLCAweDE5ZjcwMDJhLCAweDE5ZjcwMDI5LAotCTB4MTlmNzAwMjgsIDB4MTlmNzAwMjcsIDB4MTlmNzAwMjYsIDB4MTlmNzAwMjUsCi0JMHgxOGY3MDAyZCwgMHgxOGY3MDAyYiwgMHgxOGY3MDAyYSwgMHgxOGY3MDAyOSwKLQkweDE4ZjcwMDI4LCAweDE4ZjcwMDI3LCAweDE4ZjcwMDI2LCAweDE4ZjcwMDI1LAotCTB4MTdmNzAwMmQsIDB4MTdmNzAwMmIsIDB4MTdmNzAwMmEsIDB4MTdmNzAwMjksCi0JMHgxN2Y3MDAyOCwgMHgxN2Y3MDAyNywgMHgxN2Y3MDAyNiwgMHgxN2Y3MDAyNSwKLQkweDE2ZjcwMDJkLCAweDE2ZjcwMDJiLCAweDE2ZjcwMDJhLCAweDE2ZjcwMDI5LAotCTB4MTZmNzAwMjgsIDB4MTZmNzAwMjcsIDB4MTZmNzAwMjYsIDB4MTZmNzAwMjUsCi0JMHgxNWY3MDAyZCwgMHgxNWY3MDAyYiwgMHgxNWY3MDAyYSwgMHgxNWY3MDAyOSwKLQkweDE1ZjcwMDI4LCAweDE1ZjcwMDI3LCAweDE1ZjcwMDI2LCAweDE1ZjcwMDI1LAotCTB4MTRmNzAwMmQsIDB4MTRmNzAwMmIsIDB4MTRmNzAwMmEsIDB4MTRmNzAwMjksCi0JMHgxNGY3MDAyOCwgMHgxNGY3MDAyNywgMHgxNGY3MDAyNiwgMHgxNGY3MDAyNSwKLQkweDEzZjcwMDJkLCAweDEzZjcwMDJiLCAweDEzZjcwMDJhLCAweDEzZjcwMDI5LAotCTB4MTNmNzAwMjgsIDB4MTNmNzAwMjcsIDB4MTNmNzAwMjYsIDB4MTNmNzAwMjUsCi0JMHgxMmY3MDAyZCwgMHgxMmY3MDAyYiwgMHgxMmY3MDAyYSwgMHgxMmY3MDAyOSwKLQkweDEyZjcwMDI4LCAweDEyZjcwMDI3LCAweDEyZjcwMDI2LCAweDEyZjcwMDI1LAotCTB4MTFmNzAwMmQsIDB4MTFmNzAwMmIsIDB4MTFmNzAwMmEsIDB4MTFmNzAwMjksCi0JMHgxMWY3MDAyOCwgMHgxMWY3MDAyNywgMHgxMWY3MDAyNiwgMHgxMWY3MDAyNSwKLQkweDEwZjcwMDJkLCAweDEwZjcwMDJiLCAweDEwZjcwMDJhLCAweDEwZjcwMDI5LAotCTB4MTBmNzAwMjgsIDB4MTBmNzAwMjcsIDB4MTBmNzAwMjYsIDB4MTBmNzAwMjUKLX07Ci0KLXN0YXRpYyB1MzIgbnBoeV90cGNfdHhnYWluX2lwYV9yZXY2W10gPSB7Ci0JMHgwZmY3MDAyZCwgMHgwZmY3MDAyYiwgMHgwZmY3MDAyYSwgMHgwZmY3MDAyOSwKLQkweDBmZjcwMDI4LCAweDBmZjcwMDI3LCAweDBmZjcwMDI2LCAweDBmZjcwMDI1LAotCTB4MGVmNzAwMmQsIDB4MGVmNzAwMmIsIDB4MGVmNzAwMmEsIDB4MGVmNzAwMjksCi0JMHgwZWY3MDAyOCwgMHgwZWY3MDAyNywgMHgwZWY3MDAyNiwgMHgwZWY3MDAyNSwKLQkweDBkZjcwMDJkLCAweDBkZjcwMDJiLCAweDBkZjcwMDJhLCAweDBkZjcwMDI5LAotCTB4MGRmNzAwMjgsIDB4MGRmNzAwMjcsIDB4MGRmNzAwMjYsIDB4MGRmNzAwMjUsCi0JMHgwY2Y3MDAyZCwgMHgwY2Y3MDAyYiwgMHgwY2Y3MDAyYSwgMHgwY2Y3MDAyOSwKLQkweDBjZjcwMDI4LCAweDBjZjcwMDI3LCAweDBjZjcwMDI2LCAweDBjZjcwMDI1LAotCTB4MGJmNzAwMmQsIDB4MGJmNzAwMmIsIDB4MGJmNzAwMmEsIDB4MGJmNzAwMjksCi0JMHgwYmY3MDAyOCwgMHgwYmY3MDAyNywgMHgwYmY3MDAyNiwgMHgwYmY3MDAyNSwKLQkweDBhZjcwMDJkLCAweDBhZjcwMDJiLCAweDBhZjcwMDJhLCAweDBhZjcwMDI5LAotCTB4MGFmNzAwMjgsIDB4MGFmNzAwMjcsIDB4MGFmNzAwMjYsIDB4MGFmNzAwMjUsCi0JMHgwOWY3MDAyZCwgMHgwOWY3MDAyYiwgMHgwOWY3MDAyYSwgMHgwOWY3MDAyOSwKLQkweDA5ZjcwMDI4LCAweDA5ZjcwMDI3LCAweDA5ZjcwMDI2LCAweDA5ZjcwMDI1LAotCTB4MDhmNzAwMmQsIDB4MDhmNzAwMmIsIDB4MDhmNzAwMmEsIDB4MDhmNzAwMjksCi0JMHgwOGY3MDAyOCwgMHgwOGY3MDAyNywgMHgwOGY3MDAyNiwgMHgwOGY3MDAyNSwKLQkweDA3ZjcwMDJkLCAweDA3ZjcwMDJiLCAweDA3ZjcwMDJhLCAweDA3ZjcwMDI5LAotCTB4MDdmNzAwMjgsIDB4MDdmNzAwMjcsIDB4MDdmNzAwMjYsIDB4MDdmNzAwMjUsCi0JMHgwNmY3MDAyZCwgMHgwNmY3MDAyYiwgMHgwNmY3MDAyYSwgMHgwNmY3MDAyOSwKLQkweDA2ZjcwMDI4LCAweDA2ZjcwMDI3LCAweDA2ZjcwMDI2LCAweDA2ZjcwMDI1LAotCTB4MDVmNzAwMmQsIDB4MDVmNzAwMmIsIDB4MDVmNzAwMmEsIDB4MDVmNzAwMjksCi0JMHgwNWY3MDAyOCwgMHgwNWY3MDAyNywgMHgwNWY3MDAyNiwgMHgwNWY3MDAyNSwKLQkweDA0ZjcwMDJkLCAweDA0ZjcwMDJiLCAweDA0ZjcwMDJhLCAweDA0ZjcwMDI5LAotCTB4MDRmNzAwMjgsIDB4MDRmNzAwMjcsIDB4MDRmNzAwMjYsIDB4MDRmNzAwMjUsCi0JMHgwM2Y3MDAyZCwgMHgwM2Y3MDAyYiwgMHgwM2Y3MDAyYSwgMHgwM2Y3MDAyOSwKLQkweDAzZjcwMDI4LCAweDAzZjcwMDI3LCAweDAzZjcwMDI2LCAweDAzZjcwMDI1LAotCTB4MDJmNzAwMmQsIDB4MDJmNzAwMmIsIDB4MDJmNzAwMmEsIDB4MDJmNzAwMjksCi0JMHgwMmY3MDAyOCwgMHgwMmY3MDAyNywgMHgwMmY3MDAyNiwgMHgwMmY3MDAyNSwKLQkweDAxZjcwMDJkLCAweDAxZjcwMDJiLCAweDAxZjcwMDJhLCAweDAxZjcwMDI5LAotCTB4MDFmNzAwMjgsIDB4MDFmNzAwMjcsIDB4MDFmNzAwMjYsIDB4MDFmNzAwMjUsCi0JMHgwMGY3MDAyZCwgMHgwMGY3MDAyYiwgMHgwMGY3MDAyYSwgMHgwMGY3MDAyOSwKLQkweDAwZjcwMDI4LCAweDAwZjcwMDI3LCAweDAwZjcwMDI2LCAweDAwZjcwMDI1Ci19OwotCi1zdGF0aWMgdTMyIG5waHlfdHBjX3R4Z2Fpbl9pcGFfMmdfMjA1N3JldjNbXSA9IHsKLQkweDcwZmYwMDQwLCAweDcwZjcwMDNlLCAweDcwZWYwMDNiLCAweDcwZTcwMDM5LAotCTB4NzBkZjAwMzcsIDB4NzBkNzAwMzYsIDB4NzBjZjAwMzMsIDB4NzBjNzAwMzIsCi0JMHg3MGJmMDAzMSwgMHg3MGI3MDAyZiwgMHg3MGFmMDAyZSwgMHg3MGE3MDAyZCwKLQkweDcwOWYwMDJkLCAweDcwOTcwMDJjLCAweDcwOGYwMDJjLCAweDcwODcwMDJjLAotCTB4NzA3ZjAwMmIsIDB4NzA3NzAwMmMsIDB4NzA2ZjAwMmMsIDB4NzA2NzAwMmQsCi0JMHg3MDVmMDAyZSwgMHg3MDVmMDAyYiwgMHg3MDVmMDAyOSwgMHg3MDU3MDAyYSwKLQkweDcwNTcwMDI4LCAweDcwNGYwMDJhLCAweDcwNDcwMDJjLCAweDcwNDcwMDJhLAotCTB4NzA0NzAwMjgsIDB4NzA0NzAwMjYsIDB4NzA0NzAwMjQsIDB4NzA0NzAwMjIsCi0JMHg3MDQ3MDAxZiwgMHg3MDM3MDAyNywgMHg3MDM3MDAyNCwgMHg3MDM3MDAyMiwKLQkweDcwMzcwMDIwLCAweDcwMzcwMDFmLCAweDcwMzcwMDFkLCAweDcwMzcwMDFiLAotCTB4NzAzNzAwMWEsIDB4NzAzNzAwMTgsIDB4NzAzNzAwMTcsIDB4NzAyNzAwMWUsCi0JMHg3MDI3MDAxZCwgMHg3MDI3MDAxYSwgMHg3MDFmMDAyNCwgMHg3MDFmMDAyMiwKLQkweDcwMWYwMDIwLCAweDcwMWYwMDFmLCAweDcwMWYwMDFkLCAweDcwMWYwMDFiLAotCTB4NzAxZjAwMWEsIDB4NzAxZjAwMTgsIDB4NzAxZjAwMTcsIDB4NzAxZjAwMTUsCi0JMHg3MDFmMDAxNCwgMHg3MDFmMDAxMywgMHg3MDFmMDAxMiwgMHg3MDFmMDAxMSwKLQkweDcwMTcwMDE5LCAweDcwMTcwMDE4LCAweDcwMTcwMDE2LCAweDcwMTcwMDE1LAotCTB4NzAxNzAwMTQsIDB4NzAxNzAwMTMsIDB4NzAxNzAwMTIsIDB4NzAxNzAwMTAsCi0JMHg3MDE3MDAxMCwgMHg3MDE3MDAwZiwgMHg3MDBmMDAxZCwgMHg3MDBmMDAxYiwKLQkweDcwMGYwMDFhLCAweDcwMGYwMDE4LCAweDcwMGYwMDE3LCAweDcwMGYwMDE1LAotCTB4NzAwZjAwMTUsIDB4NzAwZjAwMTMsIDB4NzAwZjAwMTMsIDB4NzAwZjAwMTEsCi0JMHg3MDBmMDAxMCwgMHg3MDBmMDAxMCwgMHg3MDBmMDAwZiwgMHg3MDBmMDAwZSwKLQkweDcwMGYwMDBkLCAweDcwMGYwMDBjLCAweDcwMGYwMDBiLCAweDcwMGYwMDBiLAotCTB4NzAwZjAwMGIsIDB4NzAwZjAwMGEsIDB4NzAwZjAwMDksIDB4NzAwZjAwMDksCi0JMHg3MDBmMDAwOSwgMHg3MDBmMDAwOCwgMHg3MDBmMDAwNywgMHg3MDBmMDAwNywKLQkweDcwMGYwMDA2LCAweDcwMGYwMDA2LCAweDcwMGYwMDA2LCAweDcwMGYwMDA2LAotCTB4NzAwZjAwMDUsIDB4NzAwZjAwMDUsIDB4NzAwZjAwMDUsIDB4NzAwZjAwMDQsCi0JMHg3MDBmMDAwNCwgMHg3MDBmMDAwNCwgMHg3MDBmMDAwNCwgMHg3MDBmMDAwNCwKLQkweDcwMGYwMDA0LCAweDcwMGYwMDAzLCAweDcwMGYwMDAzLCAweDcwMGYwMDAzLAotCTB4NzAwZjAwMDMsIDB4NzAwZjAwMDIsIDB4NzAwZjAwMDIsIDB4NzAwZjAwMDIsCi0JMHg3MDBmMDAwMiwgMHg3MDBmMDAwMiwgMHg3MDBmMDAwMiwgMHg3MDBmMDAwMSwKLQkweDcwMGYwMDAxLCAweDcwMGYwMDAxLCAweDcwMGYwMDAxLCAweDcwMGYwMDAxLAotCTB4NzAwZjAwMDEsIDB4NzAwZjAwMDEsIDB4NzAwZjAwMDEsIDB4NzAwZjAwMDEKLX07Ci0KLXN0YXRpYyB1MzIgbnBoeV90cGNfdHhnYWluX2lwYV8yZ18yMDU3cmV2NG42W10gPSB7Ci0JMHhmMGZmMDA0MCwgMHhmMGY3MDAzZSwgMHhmMGVmMDAzYiwgMHhmMGU3MDAzOSwKLQkweGYwZGYwMDM3LCAweGYwZDcwMDM2LCAweGYwY2YwMDMzLCAweGYwYzcwMDMyLAotCTB4ZjBiZjAwMzEsIDB4ZjBiNzAwMmYsIDB4ZjBhZjAwMmUsIDB4ZjBhNzAwMmQsCi0JMHhmMDlmMDAyZCwgMHhmMDk3MDAyYywgMHhmMDhmMDAyYywgMHhmMDg3MDAyYywKLQkweGYwN2YwMDJiLCAweGYwNzcwMDJjLCAweGYwNmYwMDJjLCAweGYwNjcwMDJkLAotCTB4ZjA1ZjAwMmUsIDB4ZjA1ZjAwMmIsIDB4ZjA1ZjAwMjksIDB4ZjA1NzAwMmEsCi0JMHhmMDU3MDAyOCwgMHhmMDRmMDAyYSwgMHhmMDQ3MDAyYywgMHhmMDQ3MDAyYSwKLQkweGYwNDcwMDI4LCAweGYwNDcwMDI2LCAweGYwNDcwMDI0LCAweGYwNDcwMDIyLAotCTB4ZjA0NzAwMWYsIDB4ZjAzNzAwMjcsIDB4ZjAzNzAwMjQsIDB4ZjAzNzAwMjIsCi0JMHhmMDM3MDAyMCwgMHhmMDM3MDAxZiwgMHhmMDM3MDAxZCwgMHhmMDM3MDAxYiwKLQkweGYwMzcwMDFhLCAweGYwMzcwMDE4LCAweGYwMzcwMDE3LCAweGYwMjcwMDFlLAotCTB4ZjAyNzAwMWQsIDB4ZjAyNzAwMWEsIDB4ZjAxZjAwMjQsIDB4ZjAxZjAwMjIsCi0JMHhmMDFmMDAyMCwgMHhmMDFmMDAxZiwgMHhmMDFmMDAxZCwgMHhmMDFmMDAxYiwKLQkweGYwMWYwMDFhLCAweGYwMWYwMDE4LCAweGYwMWYwMDE3LCAweGYwMWYwMDE1LAotCTB4ZjAxZjAwMTQsIDB4ZjAxZjAwMTMsIDB4ZjAxZjAwMTIsIDB4ZjAxZjAwMTEsCi0JMHhmMDE3MDAxOSwgMHhmMDE3MDAxOCwgMHhmMDE3MDAxNiwgMHhmMDE3MDAxNSwKLQkweGYwMTcwMDE0LCAweGYwMTcwMDEzLCAweGYwMTcwMDEyLCAweGYwMTcwMDEwLAotCTB4ZjAxNzAwMTAsIDB4ZjAxNzAwMGYsIDB4ZjAwZjAwMWQsIDB4ZjAwZjAwMWIsCi0JMHhmMDBmMDAxYSwgMHhmMDBmMDAxOCwgMHhmMDBmMDAxNywgMHhmMDBmMDAxNSwKLQkweGYwMGYwMDE1LCAweGYwMGYwMDEzLCAweGYwMGYwMDEzLCAweGYwMGYwMDExLAotCTB4ZjAwZjAwMTAsIDB4ZjAwZjAwMTAsIDB4ZjAwZjAwMGYsIDB4ZjAwZjAwMGUsCi0JMHhmMDBmMDAwZCwgMHhmMDBmMDAwYywgMHhmMDBmMDAwYiwgMHhmMDBmMDAwYiwKLQkweGYwMGYwMDBiLCAweGYwMGYwMDBhLCAweGYwMGYwMDA5LCAweGYwMGYwMDA5LAotCTB4ZjAwZjAwMDksIDB4ZjAwZjAwMDgsIDB4ZjAwZjAwMDcsIDB4ZjAwZjAwMDcsCi0JMHhmMDBmMDAwNiwgMHhmMDBmMDAwNiwgMHhmMDBmMDAwNiwgMHhmMDBmMDAwNiwKLQkweGYwMGYwMDA1LCAweGYwMGYwMDA1LCAweGYwMGYwMDA1LCAweGYwMGYwMDA0LAotCTB4ZjAwZjAwMDQsIDB4ZjAwZjAwMDQsIDB4ZjAwZjAwMDQsIDB4ZjAwZjAwMDQsCi0JMHhmMDBmMDAwNCwgMHhmMDBmMDAwMywgMHhmMDBmMDAwMywgMHhmMDBmMDAwMywKLQkweGYwMGYwMDAzLCAweGYwMGYwMDAyLCAweGYwMGYwMDAyLCAweGYwMGYwMDAyLAotCTB4ZjAwZjAwMDIsIDB4ZjAwZjAwMDIsIDB4ZjAwZjAwMDIsIDB4ZjAwZjAwMDEsCi0JMHhmMDBmMDAwMSwgMHhmMDBmMDAwMSwgMHhmMDBmMDAwMSwgMHhmMDBmMDAwMSwKLQkweGYwMGYwMDAxLCAweGYwMGYwMDAxLCAweGYwMGYwMDAxLCAweGYwMGYwMDAxCi19OwotCi1zdGF0aWMgdTMyIG5waHlfdHBjX3R4Z2Fpbl9pcGFfMmdfMjA1N3JldjVbXSA9IHsKLQkweDMwZmYwMDMxLCAweDMwZTcwMDMxLCAweDMwZTcwMDJlLCAweDMwY2YwMDJlLAotCTB4MzBiZjAwMmUsIDB4MzBhZjAwMmUsIDB4MzA5ZjAwMmYsIDB4MzA3ZjAwMzMsCi0JMHgzMDdmMDAzMSwgMHgzMDdmMDAyZSwgMHgzMDc3MDAyZSwgMHgzMDZmMDAyZSwKLQkweDMwNjcwMDJlLCAweDMwNWYwMDJmLCAweDMwNTcwMDMwLCAweDMwNTcwMDJkLAotCTB4MzA0ZjAwMmUsIDB4MzA0NzAwMzEsIDB4MzA0NzAwMmUsIDB4MzA0NzAwMmMsCi0JMHgzMDQ3MDAyOSwgMHgzMDNmMDAyYywgMHgzMDNmMDAyOSwgMHgzMDM3MDAyZCwKLQkweDMwMzcwMDJhLCAweDMwMzcwMDI4LCAweDMwMmYwMDJjLCAweDMwMmYwMDJhLAotCTB4MzAyZjAwMjgsIDB4MzAyZjAwMjYsIDB4MzAyNzAwMmMsIDB4MzAyNzAwMjksCi0JMHgzMDI3MDAyNywgMHgzMDI3MDAyNSwgMHgzMDI3MDAyMywgMHgzMDFmMDAyYywKLQkweDMwMWYwMDJhLCAweDMwMWYwMDI4LCAweDMwMWYwMDI1LCAweDMwMWYwMDI0LAotCTB4MzAxZjAwMjIsIDB4MzAxZjAwMWYsIDB4MzAxNzAwMmQsIDB4MzAxNzAwMmIsCi0JMHgzMDE3MDAyOCwgMHgzMDE3MDAyNiwgMHgzMDE3MDAyNCwgMHgzMDE3MDAyMiwKLQkweDMwMTcwMDIwLCAweDMwMTcwMDFlLCAweDMwMTcwMDFkLCAweDMwMTcwMDFiLAotCTB4MzAxNzAwMWEsIDB4MzAxNzAwMTgsIDB4MzAxNzAwMTcsIDB4MzAxNzAwMTUsCi0JMHgzMDBmMDAyYywgMHgzMDBmMDAyOSwgMHgzMDBmMDAyNywgMHgzMDBmMDAyNCwKLQkweDMwMGYwMDIyLCAweDMwMGYwMDIxLCAweDMwMGYwMDFmLCAweDMwMGYwMDFkLAotCTB4MzAwZjAwMWIsIDB4MzAwZjAwMWEsIDB4MzAwZjAwMTgsIDB4MzAwZjAwMTcsCi0JMHgzMDBmMDAxNiwgMHgzMDBmMDAxNSwgMHgzMDBmMDExNSwgMHgzMDBmMDIxNSwKLQkweDMwMGYwMzE1LCAweDMwMGYwNDE1LCAweDMwMGYwNTE1LCAweDMwMGYwNjE1LAotCTB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsCi0JMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwKLQkweDMwMGYwNzE1LCAweDMwMGYwNzE1LCAweDMwMGYwNzE1LCAweDMwMGYwNzE1LAotCTB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsCi0JMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwKLQkweDMwMGYwNzE1LCAweDMwMGYwNzE1LCAweDMwMGYwNzE1LCAweDMwMGYwNzE1LAotCTB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsCi0JMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwKLQkweDMwMGYwNzE1LCAweDMwMGYwNzE1LCAweDMwMGYwNzE1LCAweDMwMGYwNzE1LAotCTB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsCi0JMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwKLQkweDMwMGYwNzE1LCAweDMwMGYwNzE1LCAweDMwMGYwNzE1LCAweDMwMGYwNzE1LAotCTB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsIDB4MzAwZjA3MTUKLX07Ci0KLXN0YXRpYyB1MzIgbnBoeV90cGNfdHhnYWluX2lwYV8yZ18yMDU3cmV2N1tdID0gewotCTB4MzBmZjAwMzEsIDB4MzBlNzAwMzEsIDB4MzBlNzAwMmUsIDB4MzBjZjAwMmUsCi0JMHgzMGJmMDAyZSwgMHgzMGFmMDAyZSwgMHgzMDlmMDAyZiwgMHgzMDdmMDAzMywKLQkweDMwN2YwMDMxLCAweDMwN2YwMDJlLCAweDMwNzcwMDJlLCAweDMwNmYwMDJlLAotCTB4MzA2NzAwMmUsIDB4MzA1ZjAwMmYsIDB4MzA1NzAwMzAsIDB4MzA1NzAwMmQsCi0JMHgzMDRmMDAyZSwgMHgzMDQ3MDAzMSwgMHgzMDQ3MDAyZSwgMHgzMDQ3MDAyYywKLQkweDMwNDcwMDI5LCAweDMwM2YwMDJjLCAweDMwM2YwMDI5LCAweDMwMzcwMDJkLAotCTB4MzAzNzAwMmEsIDB4MzAzNzAwMjgsIDB4MzAyZjAwMmMsIDB4MzAyZjAwMmEsCi0JMHgzMDJmMDAyOCwgMHgzMDJmMDAyNiwgMHgzMDI3MDAyYywgMHgzMDI3MDAyOSwKLQkweDMwMjcwMDI3LCAweDMwMjcwMDI1LCAweDMwMjcwMDIzLCAweDMwMWYwMDJjLAotCTB4MzAxZjAwMmEsIDB4MzAxZjAwMjgsIDB4MzAxZjAwMjUsIDB4MzAxZjAwMjQsCi0JMHgzMDFmMDAyMiwgMHgzMDFmMDAxZiwgMHgzMDE3MDAyZCwgMHgzMDE3MDAyYiwKLQkweDMwMTcwMDI4LCAweDMwMTcwMDI2LCAweDMwMTcwMDI0LCAweDMwMTcwMDIyLAotCTB4MzAxNzAwMjAsIDB4MzAxNzAwMWUsIDB4MzAxNzAwMWQsIDB4MzAxNzAwMWIsCi0JMHgzMDE3MDAxYSwgMHgzMDE3MDAxOCwgMHgzMDE3MDAxNywgMHgzMDE3MDAxNSwKLQkweDMwMGYwMDJjLCAweDMwMGYwMDI5LCAweDMwMGYwMDI3LCAweDMwMGYwMDI0LAotCTB4MzAwZjAwMjIsIDB4MzAwZjAwMjEsIDB4MzAwZjAwMWYsIDB4MzAwZjAwMWQsCi0JMHgzMDBmMDAxYiwgMHgzMDBmMDAxYSwgMHgzMDBmMDAxOCwgMHgzMDBmMDAxNywKLQkweDMwMGYwMDE2LCAweDMwMGYwMDE1LCAweDMwMGYwMTE1LCAweDMwMGYwMjE1LAotCTB4MzAwZjAzMTUsIDB4MzAwZjA0MTUsIDB4MzAwZjA1MTUsIDB4MzAwZjA2MTUsCi0JMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwKLQkweDMwMGYwNzE1LCAweDMwMGYwNzE1LCAweDMwMGYwNzE1LCAweDMwMGYwNzE1LAotCTB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsCi0JMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwKLQkweDMwMGYwNzE1LCAweDMwMGYwNzE1LCAweDMwMGYwNzE1LCAweDMwMGYwNzE1LAotCTB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsCi0JMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwKLQkweDMwMGYwNzE1LCAweDMwMGYwNzE1LCAweDMwMGYwNzE1LCAweDMwMGYwNzE1LAotCTB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsCi0JMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwKLQkweDMwMGYwNzE1LCAweDMwMGYwNzE1LCAweDMwMGYwNzE1LCAweDMwMGYwNzE1LAotCTB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsIDB4MzAwZjA3MTUsCi0JMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwgMHgzMDBmMDcxNSwgMHgzMDBmMDcxNQotfTsKLQotc3RhdGljIHUzMiBucGh5X3RwY190eGdhaW5faXBhXzVnW10gPSB7Ci0JMHg3ZmY3MDAzNSwgMHg3ZmY3MDAzMywgMHg3ZmY3MDAzMiwgMHg3ZmY3MDAzMSwKLQkweDdmZjcwMDJmLCAweDdmZjcwMDJlLCAweDdmZjcwMDJkLCAweDdmZjcwMDJiLAotCTB4N2ZmNzAwMmEsIDB4N2ZmNzAwMjksIDB4N2ZmNzAwMjgsIDB4N2ZmNzAwMjcsCi0JMHg3ZmY3MDAyNiwgMHg3ZmY3MDAyNCwgMHg3ZmY3MDAyMywgMHg3ZmY3MDAyMiwKLQkweDdlZjcwMDI4LCAweDdlZjcwMDI3LCAweDdlZjcwMDI2LCAweDdlZjcwMDI1LAotCTB4N2VmNzAwMjQsIDB4N2VmNzAwMjMsIDB4N2RmNzAwMjgsIDB4N2RmNzAwMjcsCi0JMHg3ZGY3MDAyNiwgMHg3ZGY3MDAyNSwgMHg3ZGY3MDAyNCwgMHg3ZGY3MDAyMywKLQkweDdkZjcwMDIyLCAweDdjZjcwMDI5LCAweDdjZjcwMDI4LCAweDdjZjcwMDI3LAotCTB4N2NmNzAwMjYsIDB4N2NmNzAwMjUsIDB4N2NmNzAwMjMsIDB4N2NmNzAwMjIsCi0JMHg3YmY3MDAyOSwgMHg3YmY3MDAyOCwgMHg3YmY3MDAyNiwgMHg3YmY3MDAyNSwKLQkweDdiZjcwMDI0LCAweDdiZjcwMDIzLCAweDdiZjcwMDIyLCAweDdiZjcwMDIxLAotCTB4N2FmNzAwMjksIDB4N2FmNzAwMjgsIDB4N2FmNzAwMjcsIDB4N2FmNzAwMjYsCi0JMHg3YWY3MDAyNSwgMHg3YWY3MDAyNCwgMHg3YWY3MDAyMywgMHg3YWY3MDAyMiwKLQkweDc5ZjcwMDI5LCAweDc5ZjcwMDI4LCAweDc5ZjcwMDI3LCAweDc5ZjcwMDI2LAotCTB4NzlmNzAwMjUsIDB4NzlmNzAwMjQsIDB4NzlmNzAwMjMsIDB4NzlmNzAwMjIsCi0JMHg3OGY3MDAyOSwgMHg3OGY3MDAyOCwgMHg3OGY3MDAyNywgMHg3OGY3MDAyNiwKLQkweDc4ZjcwMDI1LCAweDc4ZjcwMDI0LCAweDc4ZjcwMDIzLCAweDc4ZjcwMDIyLAotCTB4NzdmNzAwMjksIDB4NzdmNzAwMjgsIDB4NzdmNzAwMjcsIDB4NzdmNzAwMjYsCi0JMHg3N2Y3MDAyNSwgMHg3N2Y3MDAyNCwgMHg3N2Y3MDAyMywgMHg3N2Y3MDAyMiwKLQkweDc2ZjcwMDI5LCAweDc2ZjcwMDI4LCAweDc2ZjcwMDI3LCAweDc2ZjcwMDI2LAotCTB4NzZmNzAwMjQsIDB4NzZmNzAwMjMsIDB4NzZmNzAwMjIsIDB4NzZmNzAwMjEsCi0JMHg3NWY3MDAyOSwgMHg3NWY3MDAyOCwgMHg3NWY3MDAyNywgMHg3NWY3MDAyNiwKLQkweDc1ZjcwMDI1LCAweDc1ZjcwMDI0LCAweDc1ZjcwMDIzLCAweDc0ZjcwMDI5LAotCTB4NzRmNzAwMjgsIDB4NzRmNzAwMjYsIDB4NzRmNzAwMjUsIDB4NzRmNzAwMjQsCi0JMHg3NGY3MDAyMywgMHg3NGY3MDAyMiwgMHg3M2Y3MDAyOSwgMHg3M2Y3MDAyNywKLQkweDczZjcwMDI2LCAweDczZjcwMDI1LCAweDczZjcwMDI0LCAweDczZjcwMDIzLAotCTB4NzNmNzAwMjIsIDB4NzJmNzAwMjgsIDB4NzJmNzAwMjcsIDB4NzJmNzAwMjYsCi0JMHg3MmY3MDAyNSwgMHg3MmY3MDAyNCwgMHg3MmY3MDAyMywgMHg3MmY3MDAyMiwKLQkweDcxZjcwMDI4LCAweDcxZjcwMDI3LCAweDcxZjcwMDI2LCAweDcxZjcwMDI1LAotCTB4NzFmNzAwMjQsIDB4NzFmNzAwMjMsIDB4NzBmNzAwMjgsIDB4NzBmNzAwMjcsCi0JMHg3MGY3MDAyNiwgMHg3MGY3MDAyNCwgMHg3MGY3MDAyMywgMHg3MGY3MDAyMiwKLQkweDcwZjcwMDIxLCAweDcwZjcwMDIwLCAweDcwZjcwMDIwLCAweDcwZjcwMDFmCi19OwotCi1zdGF0aWMgdTMyIG5waHlfdHBjX3R4Z2Fpbl9pcGFfNWdfMjA1N1tdID0gewotCTB4N2Y3ZjAwNDQsIDB4N2Y3ZjAwNDAsIDB4N2Y3ZjAwM2MsIDB4N2Y3ZjAwMzksCi0JMHg3ZjdmMDAzNiwgMHg3ZTdmMDAzYywgMHg3ZTdmMDAzOCwgMHg3ZTdmMDAzNSwKLQkweDdkN2YwMDNjLCAweDdkN2YwMDM5LCAweDdkN2YwMDM2LCAweDdkN2YwMDMzLAotCTB4N2M3ZjAwM2IsIDB4N2M3ZjAwMzcsIDB4N2M3ZjAwMzQsIDB4N2I3ZjAwM2EsCi0JMHg3YjdmMDAzNiwgMHg3YjdmMDAzMywgMHg3YTdmMDAzYywgMHg3YTdmMDAzOSwKLQkweDdhN2YwMDM2LCAweDdhN2YwMDMzLCAweDc5N2YwMDNiLCAweDc5N2YwMDM4LAotCTB4Nzk3ZjAwMzUsIDB4Nzk3ZjAwMzIsIDB4Nzg3ZjAwM2IsIDB4Nzg3ZjAwMzgsCi0JMHg3ODdmMDAzNSwgMHg3ODdmMDAzMiwgMHg3NzdmMDAzYSwgMHg3NzdmMDAzNywKLQkweDc3N2YwMDM0LCAweDc3N2YwMDMxLCAweDc2N2YwMDNhLCAweDc2N2YwMDM2LAotCTB4NzY3ZjAwMzMsIDB4NzY3ZjAwMzEsIDB4NzU3ZjAwM2EsIDB4NzU3ZjAwMzcsCi0JMHg3NTdmMDAzNCwgMHg3NDdmMDAzYywgMHg3NDdmMDAzOSwgMHg3NDdmMDAzNiwKLQkweDc0N2YwMDMzLCAweDczN2YwMDNiLCAweDczN2YwMDM4LCAweDczN2YwMDM1LAotCTB4NzM3ZjAwMzIsIDB4NzI3ZjAwMzksIDB4NzI3ZjAwMzYsIDB4NzI3ZjAwMzMsCi0JMHg3MjdmMDAzMCwgMHg3MTdmMDAzYSwgMHg3MTdmMDAzNywgMHg3MTdmMDAzNCwKLQkweDcwN2YwMDNiLCAweDcwN2YwMDM4LCAweDcwN2YwMDM1LCAweDcwN2YwMDMyLAotCTB4NzA3ZjAwMmYsIDB4NzA3ZjAwMmQsIDB4NzA3ZjAwMmEsIDB4NzA3ZjAwMjgsCi0JMHg3MDdmMDAyNSwgMHg3MDdmMDAyMywgMHg3MDdmMDAyMSwgMHg3MDdmMDAyMCwKLQkweDcwN2YwMDFlLCAweDcwN2YwMDFjLCAweDcwN2YwMDFiLCAweDcwN2YwMDE5LAotCTB4NzA3ZjAwMTgsIDB4NzA3ZjAwMTYsIDB4NzA3ZjAwMTUsIDB4NzA3ZjAwMTQsCi0JMHg3MDdmMDAxMywgMHg3MDdmMDAxMiwgMHg3MDdmMDAxMSwgMHg3MDdmMDAxMCwKLQkweDcwN2YwMDBmLCAweDcwN2YwMDBlLCAweDcwN2YwMDBkLCAweDcwN2YwMDBkLAotCTB4NzA3ZjAwMGMsIDB4NzA3ZjAwMGIsIDB4NzA3ZjAwMGIsIDB4NzA3ZjAwMGEsCi0JMHg3MDdmMDAwOSwgMHg3MDdmMDAwOSwgMHg3MDdmMDAwOCwgMHg3MDdmMDAwOCwKLQkweDcwN2YwMDA3LCAweDcwN2YwMDA3LCAweDcwN2YwMDA3LCAweDcwN2YwMDA2LAotCTB4NzA3ZjAwMDYsIDB4NzA3ZjAwMDYsIDB4NzA3ZjAwMDUsIDB4NzA3ZjAwMDUsCi0JMHg3MDdmMDAwNSwgMHg3MDdmMDAwNCwgMHg3MDdmMDAwNCwgMHg3MDdmMDAwNCwKLQkweDcwN2YwMDA0LCAweDcwN2YwMDA0LCAweDcwN2YwMDAzLCAweDcwN2YwMDAzLAotCTB4NzA3ZjAwMDMsIDB4NzA3ZjAwMDMsIDB4NzA3ZjAwMDMsIDB4NzA3ZjAwMDMsCi0JMHg3MDdmMDAwMiwgMHg3MDdmMDAwMiwgMHg3MDdmMDAwMiwgMHg3MDdmMDAwMiwKLQkweDcwN2YwMDAyLCAweDcwN2YwMDAyLCAweDcwN2YwMDAyLCAweDcwN2YwMDAyLAotCTB4NzA3ZjAwMDEsIDB4NzA3ZjAwMDEsIDB4NzA3ZjAwMDEsIDB4NzA3ZjAwMDEsCi0JMHg3MDdmMDAwMSwgMHg3MDdmMDAwMSwgMHg3MDdmMDAwMSwgMHg3MDdmMDAwMQotfTsKLQotc3RhdGljIHUzMiBucGh5X3RwY190eGdhaW5faXBhXzVnXzIwNTdyZXY3W10gPSB7Ci0JMHg2ZjdmMDAzMSwgMHg2ZjdmMDAyZSwgMHg2ZjdmMDAyYywgMHg2ZjdmMDAyYSwKLQkweDZmN2YwMDI3LCAweDZlN2YwMDJlLCAweDZlN2YwMDJjLCAweDZlN2YwMDJhLAotCTB4NmQ3ZjAwMzAsIDB4NmQ3ZjAwMmQsIDB4NmQ3ZjAwMmEsIDB4NmQ3ZjAwMjgsCi0JMHg2YzdmMDAzMCwgMHg2YzdmMDAyZCwgMHg2YzdmMDAyYiwgMHg2YjdmMDAyZSwKLQkweDZiN2YwMDJjLCAweDZiN2YwMDJhLCAweDZiN2YwMDI3LCAweDZhN2YwMDJlLAotCTB4NmE3ZjAwMmMsIDB4NmE3ZjAwMmEsIDB4Njk3ZjAwMzAsIDB4Njk3ZjAwMmUsCi0JMHg2OTdmMDAyYiwgMHg2OTdmMDAyOSwgMHg2ODdmMDAyZiwgMHg2ODdmMDAyZCwKLQkweDY4N2YwMDJhLCAweDY4N2YwMDI3LCAweDY3N2YwMDJmLCAweDY3N2YwMDJkLAotCTB4Njc3ZjAwMmEsIDB4NjY3ZjAwMzEsIDB4NjY3ZjAwMmUsIDB4NjY3ZjAwMmMsCi0JMHg2NjdmMDAyYSwgMHg2NTdmMDAzMCwgMHg2NTdmMDAyZSwgMHg2NTdmMDAyYiwKLQkweDY1N2YwMDI5LCAweDY0N2YwMDMwLCAweDY0N2YwMDJkLCAweDY0N2YwMDJiLAotCTB4NjQ3ZjAwMjksIDB4NjM3ZjAwMmYsIDB4NjM3ZjAwMmQsIDB4NjM3ZjAwMmEsCi0JMHg2MjdmMDAzMCwgMHg2MjdmMDAyZCwgMHg2MjdmMDAyYiwgMHg2MjdmMDAyOSwKLQkweDYxN2YwMDMwLCAweDYxN2YwMDJlLCAweDYxN2YwMDJiLCAweDYxN2YwMDI5LAotCTB4NjA3ZjAwMmYsIDB4NjA3ZjAwMmQsIDB4NjA3ZjAwMmEsIDB4NjA3ZjAwMjcsCi0JMHg2MDdmMDAyNiwgMHg2MDdmMDAyMywgMHg2MDdmMDAyMSwgMHg2MDdmMDAyMCwKLQkweDYwN2YwMDFlLCAweDYwN2YwMDFjLCAweDYwN2YwMDFhLCAweDYwN2YwMDE5LAotCTB4NjA3ZjAwMTgsIDB4NjA3ZjAwMTYsIDB4NjA3ZjAwMTUsIDB4NjA3ZjAwMTQsCi0JMHg2MDdmMDAxMiwgMHg2MDdmMDAxMiwgMHg2MDdmMDAxMSwgMHg2MDdmMDAwZiwKLQkweDYwN2YwMDBmLCAweDYwN2YwMDBlLCAweDYwN2YwMDBkLCAweDYwN2YwMDBjLAotCTB4NjA3ZjAwMGMsIDB4NjA3ZjAwMGIsIDB4NjA3ZjAwMGIsIDB4NjA3ZjAwMGEsCi0JMHg2MDdmMDAwOSwgMHg2MDdmMDAwOSwgMHg2MDdmMDAwOCwgMHg2MDdmMDAwOCwKLQkweDYwN2YwMDA4LCAweDYwN2YwMDA3LCAweDYwN2YwMDA3LCAweDYwN2YwMDA2LAotCTB4NjA3ZjAwMDYsIDB4NjA3ZjAwMDUsIDB4NjA3ZjAwMDUsIDB4NjA3ZjAwMDUsCi0JMHg2MDdmMDAwNSwgMHg2MDdmMDAwNSwgMHg2MDdmMDAwNCwgMHg2MDdmMDAwNCwKLQkweDYwN2YwMDA0LCAweDYwN2YwMDA0LCAweDYwN2YwMDAzLCAweDYwN2YwMDAzLAotCTB4NjA3ZjAwMDMsIDB4NjA3ZjAwMDMsIDB4NjA3ZjAwMDIsIDB4NjA3ZjAwMDIsCi0JMHg2MDdmMDAwMiwgMHg2MDdmMDAwMiwgMHg2MDdmMDAwMiwgMHg2MDdmMDAwMiwKLQkweDYwN2YwMDAyLCAweDYwN2YwMDAyLCAweDYwN2YwMDAyLCAweDYwN2YwMDAyLAotCTB4NjA3ZjAwMDIsIDB4NjA3ZjAwMDIsIDB4NjA3ZjAwMDIsIDB4NjA3ZjAwMDIsCi0JMHg2MDdmMDAwMiwgMHg2MDdmMDAwMSwgMHg2MDdmMDAwMSwgMHg2MDdmMDAwMSwKLQkweDYwN2YwMDAxLCAweDYwN2YwMDAxLCAweDYwN2YwMDAxLCAweDYwN2YwMDAxCi19OwotCi1zdGF0aWMgczggbnBoeV9wYXBkX3BnYV9nYWluX2RlbHRhX2lwYV8yZ1tdID0gewotCS0xMTQsIC0xMDgsIC05OCwgLTkxLCAtODQsIC03OCwgLTcwLCAtNjIsCi0JLTU0LCAtNDYsIC0zOSwgLTMxLCAtMjMsIC0xNSwgLTgsIDAKLX07Ci0KLXN0YXRpYyBzOCBucGh5X3BhcGRfcGdhX2dhaW5fZGVsdGFfaXBhXzVnW10gPSB7Ci0JLTEwMCwgLTk1LCAtODksIC04MywgLTc3LCAtNzAsIC02MywgLTU2LAotCS00OCwgLTQxLCAtMzMsIC0yNSwgLTE5LCAtMTIsIC02LCAwCi19OwotCi1zdGF0aWMgczE2IG5waHlfcGFwZF9wYWRnYWluX2RsdF8yZ18yMDU3cmV2M240W10gPSB7Ci0JLTE1OSwgLTExMywgLTg2LCAtNzIsIC02MiwgLTU0LCAtNDgsIC00MywKLQktMzksIC0zNSwgLTMxLCAtMjgsIC0yNSwgLTIzLCAtMjAsIC0xOCwKLQktMTcsIC0xNSwgLTEzLCAtMTEsIC0xMCwgLTgsIC03LCAtNiwKLQktNSwgLTQsIC0zLCAtMywgLTIsIC0xLCAtMSwgMAotfTsKLQotc3RhdGljIHMxNiBucGh5X3BhcGRfcGFkZ2Fpbl9kbHRfMmdfMjA1N3JldjVbXSA9IHsKLQktMTA5LCAtMTA5LCAtODIsIC02OCwgLTU4LCAtNTAsIC00NCwgLTM5LAotCS0zNSwgLTMxLCAtMjgsIC0yNiwgLTIzLCAtMjEsIC0xOSwgLTE3LAotCS0xNiwgLTE0LCAtMTMsIC0xMSwgLTEwLCAtOSwgLTgsIC03LAotCS01LCAtNSwgLTQsIC0zLCAtMiwgLTEsIC0xLCAwCi19OwotCi1zdGF0aWMgczE2IG5waHlfcGFwZF9wYWRnYWluX2RsdF8yZ18yMDU3cmV2N1tdID0gewotCS0xMjIsIC0xMjIsIC05NSwgLTgwLCAtNjksIC02MSwgLTU0LCAtNDksCi0JLTQzLCAtMzksIC0zNSwgLTMyLCAtMjgsIC0yNiwgLTIzLCAtMjEsCi0JLTE4LCAtMTYsIC0xNSwgLTEzLCAtMTEsIC0xMCwgLTgsIC03LAotCS02LCAtNSwgLTQsIC0zLCAtMiwgLTEsIC0xLCAwCi19OwotCi1zdGF0aWMgczggbnBoeV9wYXBkX3BnYWdhaW5fZGx0XzVnXzIwNTdbXSA9IHsKLQktMTA3LCAtMTAxLCAtOTIsIC04NSwgLTc4LCAtNzEsIC02MiwgLTU1LAotCS00NywgLTM5LCAtMzIsIC0yNCwgLTE5LCAtMTIsIC02LCAwCi19OwotCi1zdGF0aWMgczggbnBoeV9wYXBkX3BnYWdhaW5fZGx0XzVnXzIwNTdyZXY3W10gPSB7Ci0JLTExMCwgLTEwNCwgLTk1LCAtODgsIC04MSwgLTc0LCAtNjYsIC01OCwKLQktNTAsIC00NCwgLTM2LCAtMjgsIC0yMywgLTE1LCAtOCwgMAotfTsKLQotc3RhdGljIHU4IHBhZF9nYWluX2NvZGVzX3VzZWRfMjA1N3JldjVbXSA9IHsKLQkyMCwgMTksIDE4LCAxNywgMTYsIDE1LCAxNCwgMTMsIDEyLCAxMSwKLQkxMCwgOSwgOCwgNywgNiwgNSwgNCwgMywgMiwgMQotfTsKLQotc3RhdGljIHU4IHBhZF9nYWluX2NvZGVzX3VzZWRfMjA1N3JldjdbXSA9IHsKLQkxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA2LAotCTUsIDQsIDMsIDIsIDEKLX07Ci0KLXN0YXRpYyB1OCBwYWRfYWxsX2dhaW5fY29kZXNfMjA1N1tdID0gewotCTMxLCAzMCwgMjksIDI4LCAyNywgMjYsIDI1LCAyNCwgMjMsIDIyLAotCTIxLCAyMCwgMTksIDE4LCAxNywgMTYsIDE1LCAxNCwgMTMsIDEyLAotCTExLCAxMCwgOSwgOCwgNywgNiwgNSwgNCwgMywgMiwKLQkxLCAwCi19OwotCi1zdGF0aWMgdTggcGdhX2FsbF9nYWluX2NvZGVzXzIwNTdbXSA9IHsKLQkxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxLCAwCi19OwotCi1zdGF0aWMgdTMyIG5waHlfcGFwZF9zY2FsdGJsW10gPSB7Ci0JMHgwYWUyMDAyZiwgMHgwYTNiMDAzMiwgMHgwOWE3MDAzNSwgMHgwOTIyMDAzOCwKLQkweDA4ODcwMDNjLCAweDA4MWYwMDNmLCAweDA3YTIwMDQzLCAweDA3MzQwMDQ3LAotCTB4MDZkMjAwNGIsIDB4MDY3YTAwNGYsIDB4MDYxNzAwNTQsIDB4MDViZjAwNTksCi0JMHgwNTcxMDA1ZSwgMHgwNTFlMDA2NCwgMHgwNGQzMDA2YSwgMHgwNDkxMDA3MCwKLQkweDA0NGMwMDc3LCAweDA0MGYwMDdlLCAweDAzZDkwMDg1LCAweDAzYTEwMDhkLAotCTB4MDM2ZjAwOTUsIDB4MDMzZDAwOWUsIDB4MDMwYjAwYTgsIDB4MDJlMDAwYjIsCi0JMHgwMmI5MDBiYywgMHgwMjkyMDBjNywgMHgwMjZkMDBkMywgMHgwMjQ5MDBlMCwKLQkweDAyMjkwMGVkLCAweDAyMGEwMGZiLCAweDAxZWMwMTBhLCAweDAxZDAwMTFhLAotCTB4MDFiNzAxMmEsIDB4MDE5ZTAxM2MsIDB4MDE4NzAxNGYsIDB4MDE3MjAxNjIsCi0JMHgwMTVkMDE3NywgMHgwMTQ5MDE4ZSwgMHgwMTM3MDFhNSwgMHgwMTI2MDFiZSwKLQkweDAxMTUwMWQ5LCAweDAxMDUwMWY1LCAweDAwZjcwMjEyLCAweDAwZTkwMjMyLAotCTB4MDBkYzAyNTMsIDB4MDBkMDAyNzYsIDB4MDBjNDAyOWMsIDB4MDBiOTAyYzMsCi0JMHgwMGFmMDJlZCwgMHgwMGE1MDMxYSwgMHgwMDljMDM0OSwgMHgwMDkzMDM3YSwKLQkweDAwOGIwM2FmLCAweDAwODMwM2U3LCAweDAwN2MwNDIyLCAweDAwNzUwNDYxLAotCTB4MDA2ZTA0YTMsIDB4MDA2ODA0ZWEsIDB4MDA2MjA1MzQsIDB4MDA1ZDA1ODMsCi0JMHgwMDU4MDVkNywgMHgwMDUzMDYyZiwgMHgwMDRlMDY4ZCwgMHgwMDRhMDZmMQotfTsKLQotc3RhdGljIHUzMiBucGh5X3RwY190eGdhaW5fcmV2M1tdID0gewotCTB4MWY0MTAwNDQsIDB4MWY0MTAwNDIsIDB4MWY0MTAwNDAsIDB4MWY0MTAwM2UsCi0JMHgxZjQxMDAzYywgMHgxZjQxMDAzYiwgMHgxZjQxMDAzOSwgMHgxZjQxMDAzNywKLQkweDFlNDEwMDQ0LCAweDFlNDEwMDQyLCAweDFlNDEwMDQwLCAweDFlNDEwMDNlLAotCTB4MWU0MTAwM2MsIDB4MWU0MTAwM2IsIDB4MWU0MTAwMzksIDB4MWU0MTAwMzcsCi0JMHgxZDQxMDA0NCwgMHgxZDQxMDA0MiwgMHgxZDQxMDA0MCwgMHgxZDQxMDAzZSwKLQkweDFkNDEwMDNjLCAweDFkNDEwMDNiLCAweDFkNDEwMDM5LCAweDFkNDEwMDM3LAotCTB4MWM0MTAwNDQsIDB4MWM0MTAwNDIsIDB4MWM0MTAwNDAsIDB4MWM0MTAwM2UsCi0JMHgxYzQxMDAzYywgMHgxYzQxMDAzYiwgMHgxYzQxMDAzOSwgMHgxYzQxMDAzNywKLQkweDFiNDEwMDQ0LCAweDFiNDEwMDQyLCAweDFiNDEwMDQwLCAweDFiNDEwMDNlLAotCTB4MWI0MTAwM2MsIDB4MWI0MTAwM2IsIDB4MWI0MTAwMzksIDB4MWI0MTAwMzcsCi0JMHgxYTQxMDA0NCwgMHgxYTQxMDA0MiwgMHgxYTQxMDA0MCwgMHgxYTQxMDAzZSwKLQkweDFhNDEwMDNjLCAweDFhNDEwMDNiLCAweDFhNDEwMDM5LCAweDFhNDEwMDM3LAotCTB4MTk0MTAwNDQsIDB4MTk0MTAwNDIsIDB4MTk0MTAwNDAsIDB4MTk0MTAwM2UsCi0JMHgxOTQxMDAzYywgMHgxOTQxMDAzYiwgMHgxOTQxMDAzOSwgMHgxOTQxMDAzNywKLQkweDE4NDEwMDQ0LCAweDE4NDEwMDQyLCAweDE4NDEwMDQwLCAweDE4NDEwMDNlLAotCTB4MTg0MTAwM2MsIDB4MTg0MTAwM2IsIDB4MTg0MTAwMzksIDB4MTg0MTAwMzcsCi0JMHgxNzQxMDA0NCwgMHgxNzQxMDA0MiwgMHgxNzQxMDA0MCwgMHgxNzQxMDAzZSwKLQkweDE3NDEwMDNjLCAweDE3NDEwMDNiLCAweDE3NDEwMDM5LCAweDE3NDEwMDM3LAotCTB4MTY0MTAwNDQsIDB4MTY0MTAwNDIsIDB4MTY0MTAwNDAsIDB4MTY0MTAwM2UsCi0JMHgxNjQxMDAzYywgMHgxNjQxMDAzYiwgMHgxNjQxMDAzOSwgMHgxNjQxMDAzNywKLQkweDE1NDEwMDQ0LCAweDE1NDEwMDQyLCAweDE1NDEwMDQwLCAweDE1NDEwMDNlLAotCTB4MTU0MTAwM2MsIDB4MTU0MTAwM2IsIDB4MTU0MTAwMzksIDB4MTU0MTAwMzcsCi0JMHgxNDQxMDA0NCwgMHgxNDQxMDA0MiwgMHgxNDQxMDA0MCwgMHgxNDQxMDAzZSwKLQkweDE0NDEwMDNjLCAweDE0NDEwMDNiLCAweDE0NDEwMDM5LCAweDE0NDEwMDM3LAotCTB4MTM0MTAwNDQsIDB4MTM0MTAwNDIsIDB4MTM0MTAwNDAsIDB4MTM0MTAwM2UsCi0JMHgxMzQxMDAzYywgMHgxMzQxMDAzYiwgMHgxMzQxMDAzOSwgMHgxMzQxMDAzNywKLQkweDEyNDEwMDQ0LCAweDEyNDEwMDQyLCAweDEyNDEwMDQwLCAweDEyNDEwMDNlLAotCTB4MTI0MTAwM2MsIDB4MTI0MTAwM2IsIDB4MTI0MTAwMzksIDB4MTI0MTAwMzcsCi0JMHgxMTQxMDA0NCwgMHgxMTQxMDA0MiwgMHgxMTQxMDA0MCwgMHgxMTQxMDAzZSwKLQkweDExNDEwMDNjLCAweDExNDEwMDNiLCAweDExNDEwMDM5LCAweDExNDEwMDM3LAotCTB4MTA0MTAwNDQsIDB4MTA0MTAwNDIsIDB4MTA0MTAwNDAsIDB4MTA0MTAwM2UsCi0JMHgxMDQxMDAzYywgMHgxMDQxMDAzYiwgMHgxMDQxMDAzOSwgMHgxMDQxMDAzNwotfTsKLQotc3RhdGljIHUzMiBucGh5X3RwY190eGdhaW5fSGlQd3JFUEFbXSA9IHsKLQkweDBmNDEwMDQ0LCAweDBmNDEwMDQyLCAweDBmNDEwMDQwLCAweDBmNDEwMDNlLAotCTB4MGY0MTAwM2MsIDB4MGY0MTAwM2IsIDB4MGY0MTAwMzksIDB4MGY0MTAwMzcsCi0JMHgwZTQxMDA0NCwgMHgwZTQxMDA0MiwgMHgwZTQxMDA0MCwgMHgwZTQxMDAzZSwKLQkweDBlNDEwMDNjLCAweDBlNDEwMDNiLCAweDBlNDEwMDM5LCAweDBlNDEwMDM3LAotCTB4MGQ0MTAwNDQsIDB4MGQ0MTAwNDIsIDB4MGQ0MTAwNDAsIDB4MGQ0MTAwM2UsCi0JMHgwZDQxMDAzYywgMHgwZDQxMDAzYiwgMHgwZDQxMDAzOSwgMHgwZDQxMDAzNywKLQkweDBjNDEwMDQ0LCAweDBjNDEwMDQyLCAweDBjNDEwMDQwLCAweDBjNDEwMDNlLAotCTB4MGM0MTAwM2MsIDB4MGM0MTAwM2IsIDB4MGM0MTAwMzksIDB4MGM0MTAwMzcsCi0JMHgwYjQxMDA0NCwgMHgwYjQxMDA0MiwgMHgwYjQxMDA0MCwgMHgwYjQxMDAzZSwKLQkweDBiNDEwMDNjLCAweDBiNDEwMDNiLCAweDBiNDEwMDM5LCAweDBiNDEwMDM3LAotCTB4MGE0MTAwNDQsIDB4MGE0MTAwNDIsIDB4MGE0MTAwNDAsIDB4MGE0MTAwM2UsCi0JMHgwYTQxMDAzYywgMHgwYTQxMDAzYiwgMHgwYTQxMDAzOSwgMHgwYTQxMDAzNywKLQkweDA5NDEwMDQ0LCAweDA5NDEwMDQyLCAweDA5NDEwMDQwLCAweDA5NDEwMDNlLAotCTB4MDk0MTAwM2MsIDB4MDk0MTAwM2IsIDB4MDk0MTAwMzksIDB4MDk0MTAwMzcsCi0JMHgwODQxMDA0NCwgMHgwODQxMDA0MiwgMHgwODQxMDA0MCwgMHgwODQxMDAzZSwKLQkweDA4NDEwMDNjLCAweDA4NDEwMDNiLCAweDA4NDEwMDM5LCAweDA4NDEwMDM3LAotCTB4MDc0MTAwNDQsIDB4MDc0MTAwNDIsIDB4MDc0MTAwNDAsIDB4MDc0MTAwM2UsCi0JMHgwNzQxMDAzYywgMHgwNzQxMDAzYiwgMHgwNzQxMDAzOSwgMHgwNzQxMDAzNywKLQkweDA2NDEwMDQ0LCAweDA2NDEwMDQyLCAweDA2NDEwMDQwLCAweDA2NDEwMDNlLAotCTB4MDY0MTAwM2MsIDB4MDY0MTAwM2IsIDB4MDY0MTAwMzksIDB4MDY0MTAwMzcsCi0JMHgwNTQxMDA0NCwgMHgwNTQxMDA0MiwgMHgwNTQxMDA0MCwgMHgwNTQxMDAzZSwKLQkweDA1NDEwMDNjLCAweDA1NDEwMDNiLCAweDA1NDEwMDM5LCAweDA1NDEwMDM3LAotCTB4MDQ0MTAwNDQsIDB4MDQ0MTAwNDIsIDB4MDQ0MTAwNDAsIDB4MDQ0MTAwM2UsCi0JMHgwNDQxMDAzYywgMHgwNDQxMDAzYiwgMHgwNDQxMDAzOSwgMHgwNDQxMDAzNywKLQkweDAzNDEwMDQ0LCAweDAzNDEwMDQyLCAweDAzNDEwMDQwLCAweDAzNDEwMDNlLAotCTB4MDM0MTAwM2MsIDB4MDM0MTAwM2IsIDB4MDM0MTAwMzksIDB4MDM0MTAwMzcsCi0JMHgwMjQxMDA0NCwgMHgwMjQxMDA0MiwgMHgwMjQxMDA0MCwgMHgwMjQxMDAzZSwKLQkweDAyNDEwMDNjLCAweDAyNDEwMDNiLCAweDAyNDEwMDM5LCAweDAyNDEwMDM3LAotCTB4MDE0MTAwNDQsIDB4MDE0MTAwNDIsIDB4MDE0MTAwNDAsIDB4MDE0MTAwM2UsCi0JMHgwMTQxMDAzYywgMHgwMTQxMDAzYiwgMHgwMTQxMDAzOSwgMHgwMTQxMDAzNywKLQkweDAwNDEwMDQ0LCAweDAwNDEwMDQyLCAweDAwNDEwMDQwLCAweDAwNDEwMDNlLAotCTB4MDA0MTAwM2MsIDB4MDA0MTAwM2IsIDB4MDA0MTAwMzksIDB4MDA0MTAwMzcKLX07Ci0KLXN0YXRpYyB1MzIgbnBoeV90cGNfdHhnYWluX2VwYV8yMDU3cmV2M1tdID0gewotCTB4ODBmOTAwNDAsIDB4ODBlMTAwNDAsIDB4ODBlMTAwM2MsIDB4ODBjOTAwM2QsCi0JMHg4MGI5MDAzYywgMHg4MGE5MDAzZCwgMHg4MGExMDAzYywgMHg4MDk5MDAzYiwKLQkweDgwOTEwMDNiLCAweDgwODkwMDNhLCAweDgwODEwMDNhLCAweDgwNzkwMDM5LAotCTB4ODA3MTAwMzksIDB4ODA2OTAwM2EsIDB4ODA2MTAwM2IsIDB4ODA1OTAwM2QsCi0JMHg4MDUxMDAzZiwgMHg4MDQ5MDA0MiwgMHg4MDQ5MDAzZSwgMHg4MDQ5MDAzYiwKLQkweDgwNDEwMDNlLCAweDgwNDEwMDNiLCAweDgwMzkwMDNlLCAweDgwMzkwMDNiLAotCTB4ODAzOTAwMzgsIDB4ODAzOTAwMzUsIDB4ODAzMTAwM2EsIDB4ODAzMTAwMzYsCi0JMHg4MDMxMDAzMywgMHg4MDI5MDAzYSwgMHg4MDI5MDAzNywgMHg4MDI5MDAzNCwKLQkweDgwMjkwMDMxLCAweDgwMjEwMDM5LCAweDgwMjEwMDM2LCAweDgwMjEwMDMzLAotCTB4ODAyMTAwMzAsIDB4ODAxOTAwM2MsIDB4ODAxOTAwMzksIDB4ODAxOTAwMzYsCi0JMHg4MDE5MDAzMywgMHg4MDE5MDAzMCwgMHg4MDE5MDAyZCwgMHg4MDE5MDAyYiwKLQkweDgwMTkwMDI4LCAweDgwMTEwMDNhLCAweDgwMTEwMDM2LCAweDgwMTEwMDMzLAotCTB4ODAxMTAwMzAsIDB4ODAxMTAwMmUsIDB4ODAxMTAwMmIsIDB4ODAxMTAwMjksCi0JMHg4MDExMDAyNywgMHg4MDExMDAyNCwgMHg4MDExMDAyMiwgMHg4MDExMDAyMCwKLQkweDgwMTEwMDFmLCAweDgwMTEwMDFkLCAweDgwMDkwMDNhLCAweDgwMDkwMDM3LAotCTB4ODAwOTAwMzQsIDB4ODAwOTAwMzEsIDB4ODAwOTAwMmUsIDB4ODAwOTAwMmMsCi0JMHg4MDA5MDAyOSwgMHg4MDA5MDAyNywgMHg4MDA5MDAyNSwgMHg4MDA5MDAyMywKLQkweDgwMDkwMDIxLCAweDgwMDkwMDFmLCAweDgwMDkwMDFkLCAweDgwMDkwMTFkLAotCTB4ODAwOTAyMWQsIDB4ODAwOTAzMWQsIDB4ODAwOTA0MWQsIDB4ODAwOTA1MWQsCi0JMHg4MDA5MDYxZCwgMHg4MDA5MDcxZCwgMHg4MDA5MDcxZCwgMHg4MDA5MDcxZCwKLQkweDgwMDkwNzFkLCAweDgwMDkwNzFkLCAweDgwMDkwNzFkLCAweDgwMDkwNzFkLAotCTB4ODAwOTA3MWQsIDB4ODAwOTA3MWQsIDB4ODAwOTA3MWQsIDB4ODAwOTA3MWQsCi0JMHg4MDA5MDcxZCwgMHg4MDA5MDcxZCwgMHg4MDA5MDcxZCwgMHg4MDA5MDcxZCwKLQkweDgwMDkwNzFkLCAweDgwMDkwNzFkLCAweDgwMDkwNzFkLCAweDgwMDkwNzFkLAotCTB4ODAwOTA3MWQsIDB4ODAwOTA3MWQsIDB4ODAwOTA3MWQsIDB4ODAwOTA3MWQsCi0JMHg4MDA5MDcxZCwgMHg4MDA5MDcxZCwgMHg4MDA5MDcxZCwgMHg4MDA5MDcxZCwKLQkweDgwMDkwNzFkLCAweDgwMDkwNzFkLCAweDgwMDkwNzFkLCAweDgwMDkwNzFkLAotCTB4ODAwOTA3MWQsIDB4ODAwOTA3MWQsIDB4ODAwOTA3MWQsIDB4ODAwOTA3MWQsCi0JMHg4MDA5MDcxZCwgMHg4MDA5MDcxZCwgMHg4MDA5MDcxZCwgMHg4MDA5MDcxZCwKLQkweDgwMDkwNzFkLCAweDgwMDkwNzFkLCAweDgwMDkwNzFkLCAweDgwMDkwNzFkLAotCTB4ODAwOTA3MWQsIDB4ODAwOTA3MWQsIDB4ODAwOTA3MWQsIDB4ODAwOTA3MWQsCi0JMHg4MDA5MDcxZCwgMHg4MDA5MDcxZCwgMHg4MDA5MDcxZCwgMHg4MDA5MDcxZAotfTsKLQotc3RhdGljIHUzMiBucGh5X3RwY190eGdhaW5fZXBhXzIwNTdyZXY1W10gPSB7Ci0JMHgxMGY5MDA0MCwgMHgxMGUxMDA0MCwgMHgxMGUxMDAzYywgMHgxMGM5MDAzZCwKLQkweDEwYjkwMDNjLCAweDEwYTkwMDNkLCAweDEwYTEwMDNjLCAweDEwOTkwMDNiLAotCTB4MTA5MTAwM2IsIDB4MTA4OTAwM2EsIDB4MTA4MTAwM2EsIDB4MTA3OTAwMzksCi0JMHgxMDcxMDAzOSwgMHgxMDY5MDAzYSwgMHgxMDYxMDAzYiwgMHgxMDU5MDAzZCwKLQkweDEwNTEwMDNmLCAweDEwNDkwMDQyLCAweDEwNDkwMDNlLCAweDEwNDkwMDNiLAotCTB4MTA0MTAwM2UsIDB4MTA0MTAwM2IsIDB4MTAzOTAwM2UsIDB4MTAzOTAwM2IsCi0JMHgxMDM5MDAzOCwgMHgxMDM5MDAzNSwgMHgxMDMxMDAzYSwgMHgxMDMxMDAzNiwKLQkweDEwMzEwMDMzLCAweDEwMjkwMDNhLCAweDEwMjkwMDM3LCAweDEwMjkwMDM0LAotCTB4MTAyOTAwMzEsIDB4MTAyMTAwMzksIDB4MTAyMTAwMzYsIDB4MTAyMTAwMzMsCi0JMHgxMDIxMDAzMCwgMHgxMDE5MDAzYywgMHgxMDE5MDAzOSwgMHgxMDE5MDAzNiwKLQkweDEwMTkwMDMzLCAweDEwMTkwMDMwLCAweDEwMTkwMDJkLCAweDEwMTkwMDJiLAotCTB4MTAxOTAwMjgsIDB4MTAxMTAwM2EsIDB4MTAxMTAwMzYsIDB4MTAxMTAwMzMsCi0JMHgxMDExMDAzMCwgMHgxMDExMDAyZSwgMHgxMDExMDAyYiwgMHgxMDExMDAyOSwKLQkweDEwMTEwMDI3LCAweDEwMTEwMDI0LCAweDEwMTEwMDIyLCAweDEwMTEwMDIwLAotCTB4MTAxMTAwMWYsIDB4MTAxMTAwMWQsIDB4MTAwOTAwM2EsIDB4MTAwOTAwMzcsCi0JMHgxMDA5MDAzNCwgMHgxMDA5MDAzMSwgMHgxMDA5MDAyZSwgMHgxMDA5MDAyYywKLQkweDEwMDkwMDI5LCAweDEwMDkwMDI3LCAweDEwMDkwMDI1LCAweDEwMDkwMDIzLAotCTB4MTAwOTAwMjEsIDB4MTAwOTAwMWYsIDB4MTAwOTAwMWQsIDB4MTAwOTAwMWIsCi0JMHgxMDA5MDAxYSwgMHgxMDA5MDAxOCwgMHgxMDA5MDAxNywgMHgxMDA5MDAxNiwKLQkweDEwMDkwMDE1LCAweDEwMDkwMDEzLCAweDEwMDkwMDEyLCAweDEwMDkwMDExLAotCTB4MTAwOTAwMTAsIDB4MTAwOTAwMGYsIDB4MTAwOTAwMGYsIDB4MTAwOTAwMGUsCi0JMHgxMDA5MDAwZCwgMHgxMDA5MDAwYywgMHgxMDA5MDAwYywgMHgxMDA5MDAwYiwKLQkweDEwMDkwMDBhLCAweDEwMDkwMDBhLCAweDEwMDkwMDA5LCAweDEwMDkwMDA5LAotCTB4MTAwOTAwMDgsIDB4MTAwOTAwMDgsIDB4MTAwOTAwMDcsIDB4MTAwOTAwMDcsCi0JMHgxMDA5MDAwNywgMHgxMDA5MDAwNiwgMHgxMDA5MDAwNiwgMHgxMDA5MDAwNSwKLQkweDEwMDkwMDA1LCAweDEwMDkwMDA1LCAweDEwMDkwMDA1LCAweDEwMDkwMDA0LAotCTB4MTAwOTAwMDQsIDB4MTAwOTAwMDQsIDB4MTAwOTAwMDQsIDB4MTAwOTAwMDMsCi0JMHgxMDA5MDAwMywgMHgxMDA5MDAwMywgMHgxMDA5MDAwMywgMHgxMDA5MDAwMywKLQkweDEwMDkwMDAzLCAweDEwMDkwMDAyLCAweDEwMDkwMDAyLCAweDEwMDkwMDAyLAotCTB4MTAwOTAwMDIsIDB4MTAwOTAwMDIsIDB4MTAwOTAwMDIsIDB4MTAwOTAwMDIsCi0JMHgxMDA5MDAwMiwgMHgxMDA5MDAwMiwgMHgxMDA5MDAwMSwgMHgxMDA5MDAwMSwKLQkweDEwMDkwMDAxLCAweDEwMDkwMDAxLCAweDEwMDkwMDAxLCAweDEwMDkwMDAxCi19OwotCi1zdGF0aWMgdTMyIG5waHlfdHBjXzVHSHpfdHhnYWluX3JldjNbXSA9IHsKLQkweGNmZjcwMDQ0LCAweGNmZjcwMDQyLCAweGNmZjcwMDQwLCAweGNmZjcwMDNlLAotCTB4Y2ZmNzAwM2MsIDB4Y2ZmNzAwM2IsIDB4Y2ZmNzAwMzksIDB4Y2ZmNzAwMzcsCi0JMHhjZWY3MDA0NCwgMHhjZWY3MDA0MiwgMHhjZWY3MDA0MCwgMHhjZWY3MDAzZSwKLQkweGNlZjcwMDNjLCAweGNlZjcwMDNiLCAweGNlZjcwMDM5LCAweGNlZjcwMDM3LAotCTB4Y2RmNzAwNDQsIDB4Y2RmNzAwNDIsIDB4Y2RmNzAwNDAsIDB4Y2RmNzAwM2UsCi0JMHhjZGY3MDAzYywgMHhjZGY3MDAzYiwgMHhjZGY3MDAzOSwgMHhjZGY3MDAzNywKLQkweGNjZjcwMDQ0LCAweGNjZjcwMDQyLCAweGNjZjcwMDQwLCAweGNjZjcwMDNlLAotCTB4Y2NmNzAwM2MsIDB4Y2NmNzAwM2IsIDB4Y2NmNzAwMzksIDB4Y2NmNzAwMzcsCi0JMHhjYmY3MDA0NCwgMHhjYmY3MDA0MiwgMHhjYmY3MDA0MCwgMHhjYmY3MDAzZSwKLQkweGNiZjcwMDNjLCAweGNiZjcwMDNiLCAweGNiZjcwMDM5LCAweGNiZjcwMDM3LAotCTB4Y2FmNzAwNDQsIDB4Y2FmNzAwNDIsIDB4Y2FmNzAwNDAsIDB4Y2FmNzAwM2UsCi0JMHhjYWY3MDAzYywgMHhjYWY3MDAzYiwgMHhjYWY3MDAzOSwgMHhjYWY3MDAzNywKLQkweGM5ZjcwMDQ0LCAweGM5ZjcwMDQyLCAweGM5ZjcwMDQwLCAweGM5ZjcwMDNlLAotCTB4YzlmNzAwM2MsIDB4YzlmNzAwM2IsIDB4YzlmNzAwMzksIDB4YzlmNzAwMzcsCi0JMHhjOGY3MDA0NCwgMHhjOGY3MDA0MiwgMHhjOGY3MDA0MCwgMHhjOGY3MDAzZSwKLQkweGM4ZjcwMDNjLCAweGM4ZjcwMDNiLCAweGM4ZjcwMDM5LCAweGM4ZjcwMDM3LAotCTB4YzdmNzAwNDQsIDB4YzdmNzAwNDIsIDB4YzdmNzAwNDAsIDB4YzdmNzAwM2UsCi0JMHhjN2Y3MDAzYywgMHhjN2Y3MDAzYiwgMHhjN2Y3MDAzOSwgMHhjN2Y3MDAzNywKLQkweGM2ZjcwMDQ0LCAweGM2ZjcwMDQyLCAweGM2ZjcwMDQwLCAweGM2ZjcwMDNlLAotCTB4YzZmNzAwM2MsIDB4YzZmNzAwM2IsIDB4YzZmNzAwMzksIDB4YzZmNzAwMzcsCi0JMHhjNWY3MDA0NCwgMHhjNWY3MDA0MiwgMHhjNWY3MDA0MCwgMHhjNWY3MDAzZSwKLQkweGM1ZjcwMDNjLCAweGM1ZjcwMDNiLCAweGM1ZjcwMDM5LCAweGM1ZjcwMDM3LAotCTB4YzRmNzAwNDQsIDB4YzRmNzAwNDIsIDB4YzRmNzAwNDAsIDB4YzRmNzAwM2UsCi0JMHhjNGY3MDAzYywgMHhjNGY3MDAzYiwgMHhjNGY3MDAzOSwgMHhjNGY3MDAzNywKLQkweGMzZjcwMDQ0LCAweGMzZjcwMDQyLCAweGMzZjcwMDQwLCAweGMzZjcwMDNlLAotCTB4YzNmNzAwM2MsIDB4YzNmNzAwM2IsIDB4YzNmNzAwMzksIDB4YzNmNzAwMzcsCi0JMHhjMmY3MDA0NCwgMHhjMmY3MDA0MiwgMHhjMmY3MDA0MCwgMHhjMmY3MDAzZSwKLQkweGMyZjcwMDNjLCAweGMyZjcwMDNiLCAweGMyZjcwMDM5LCAweGMyZjcwMDM3LAotCTB4YzFmNzAwNDQsIDB4YzFmNzAwNDIsIDB4YzFmNzAwNDAsIDB4YzFmNzAwM2UsCi0JMHhjMWY3MDAzYywgMHhjMWY3MDAzYiwgMHhjMWY3MDAzOSwgMHhjMWY3MDAzNywKLQkweGMwZjcwMDQ0LCAweGMwZjcwMDQyLCAweGMwZjcwMDQwLCAweGMwZjcwMDNlLAotCTB4YzBmNzAwM2MsIDB4YzBmNzAwM2IsIDB4YzBmNzAwMzksIDB4YzBmNzAwMzcKLX07Ci0KLXN0YXRpYyB1MzIgbnBoeV90cGNfNUdIel90eGdhaW5fcmV2NFtdID0gewotCTB4MmZmMjAwNDQsIDB4MmZmMjAwNDIsIDB4MmZmMjAwNDAsIDB4MmZmMjAwM2UsCi0JMHgyZmYyMDAzYywgMHgyZmYyMDAzYiwgMHgyZmYyMDAzOSwgMHgyZmYyMDAzNywKLQkweDJlZjIwMDQ0LCAweDJlZjIwMDQyLCAweDJlZjIwMDQwLCAweDJlZjIwMDNlLAotCTB4MmVmMjAwM2MsIDB4MmVmMjAwM2IsIDB4MmVmMjAwMzksIDB4MmVmMjAwMzcsCi0JMHgyZGYyMDA0NCwgMHgyZGYyMDA0MiwgMHgyZGYyMDA0MCwgMHgyZGYyMDAzZSwKLQkweDJkZjIwMDNjLCAweDJkZjIwMDNiLCAweDJkZjIwMDM5LCAweDJkZjIwMDM3LAotCTB4MmNmMjAwNDQsIDB4MmNmMjAwNDIsIDB4MmNmMjAwNDAsIDB4MmNmMjAwM2UsCi0JMHgyY2YyMDAzYywgMHgyY2YyMDAzYiwgMHgyY2YyMDAzOSwgMHgyY2YyMDAzNywKLQkweDJiZjIwMDQ0LCAweDJiZjIwMDQyLCAweDJiZjIwMDQwLCAweDJiZjIwMDNlLAotCTB4MmJmMjAwM2MsIDB4MmJmMjAwM2IsIDB4MmJmMjAwMzksIDB4MmJmMjAwMzcsCi0JMHgyYWYyMDA0NCwgMHgyYWYyMDA0MiwgMHgyYWYyMDA0MCwgMHgyYWYyMDAzZSwKLQkweDJhZjIwMDNjLCAweDJhZjIwMDNiLCAweDJhZjIwMDM5LCAweDJhZjIwMDM3LAotCTB4MjlmMjAwNDQsIDB4MjlmMjAwNDIsIDB4MjlmMjAwNDAsIDB4MjlmMjAwM2UsCi0JMHgyOWYyMDAzYywgMHgyOWYyMDAzYiwgMHgyOWYyMDAzOSwgMHgyOWYyMDAzNywKLQkweDI4ZjIwMDQ0LCAweDI4ZjIwMDQyLCAweDI4ZjIwMDQwLCAweDI4ZjIwMDNlLAotCTB4MjhmMjAwM2MsIDB4MjhmMjAwM2IsIDB4MjhmMjAwMzksIDB4MjhmMjAwMzcsCi0JMHgyN2YyMDA0NCwgMHgyN2YyMDA0MiwgMHgyN2YyMDA0MCwgMHgyN2YyMDAzZSwKLQkweDI3ZjIwMDNjLCAweDI3ZjIwMDNiLCAweDI3ZjIwMDM5LCAweDI3ZjIwMDM3LAotCTB4MjZmMjAwNDQsIDB4MjZmMjAwNDIsIDB4MjZmMjAwNDAsIDB4MjZmMjAwM2UsCi0JMHgyNmYyMDAzYywgMHgyNmYyMDAzYiwgMHgyNmYyMDAzOSwgMHgyNmYyMDAzNywKLQkweDI1ZjIwMDQ0LCAweDI1ZjIwMDQyLCAweDI1ZjIwMDQwLCAweDI1ZjIwMDNlLAotCTB4MjVmMjAwM2MsIDB4MjVmMjAwM2IsIDB4MjVmMjAwMzksIDB4MjVmMjAwMzcsCi0JMHgyNGYyMDA0NCwgMHgyNGYyMDA0MiwgMHgyNGYyMDA0MCwgMHgyNGYyMDAzZSwKLQkweDI0ZjIwMDNjLCAweDI0ZjIwMDNiLCAweDI0ZjIwMDM5LCAweDI0ZjIwMDM4LAotCTB4MjNmMjAwNDEsIDB4MjNmMjAwNDAsIDB4MjNmMjAwM2YsIDB4MjNmMjAwM2UsCi0JMHgyM2YyMDAzYywgMHgyM2YyMDAzYiwgMHgyM2YyMDAzOSwgMHgyM2YyMDAzNywKLQkweDIyZjIwMDQ0LCAweDIyZjIwMDQyLCAweDIyZjIwMDQwLCAweDIyZjIwMDNlLAotCTB4MjJmMjAwM2MsIDB4MjJmMjAwM2IsIDB4MjJmMjAwMzksIDB4MjJmMjAwMzcsCi0JMHgyMWYyMDA0NCwgMHgyMWYyMDA0MiwgMHgyMWYyMDA0MCwgMHgyMWYyMDAzZSwKLQkweDIxZjIwMDNjLCAweDIxZjIwMDNiLCAweDIxZjIwMDM5LCAweDIxZjIwMDM3LAotCTB4MjBkMjAwNDMsIDB4MjBkMjAwNDEsIDB4MjBkMjAwM2UsIDB4MjBkMjAwM2MsCi0JMHgyMGQyMDAzYSwgMHgyMGQyMDAzOCwgMHgyMGQyMDAzNiwgMHgyMGQyMDAzNAotfTsKLQotc3RhdGljIHUzMiBucGh5X3RwY181R0h6X3R4Z2Fpbl9yZXY1W10gPSB7Ci0JMHgwZjYyMDA0YSwgMHgwZjYyMDA0OCwgMHgwZjYyMDA0NiwgMHgwZjYyMDA0NCwKLQkweDBmNjIwMDQyLCAweDBmNjIwMDQwLCAweDBmNjIwMDNlLCAweDBmNjIwMDNjLAotCTB4MGU2MjAwNDQsIDB4MGU2MjAwNDIsIDB4MGU2MjAwNDAsIDB4MGU2MjAwM2UsCi0JMHgwZTYyMDAzYywgMHgwZTYyMDAzZCwgMHgwZTYyMDAzYiwgMHgwZTYyMDAzYSwKLQkweDBkNjIwMDQzLCAweDBkNjIwMDQxLCAweDBkNjIwMDQwLCAweDBkNjIwMDNlLAotCTB4MGQ2MjAwM2QsIDB4MGQ2MjAwM2MsIDB4MGQ2MjAwM2IsIDB4MGQ2MjAwM2EsCi0JMHgwYzYyMDA0MSwgMHgwYzYyMDA0MCwgMHgwYzYyMDAzZiwgMHgwYzYyMDAzZSwKLQkweDBjNjIwMDNjLCAweDBjNjIwMDNiLCAweDBjNjIwMDM5LCAweDBjNjIwMDM3LAotCTB4MGI2MjAwNDYsIDB4MGI2MjAwNDQsIDB4MGI2MjAwNDIsIDB4MGI2MjAwNDAsCi0JMHgwYjYyMDAzZSwgMHgwYjYyMDAzYywgMHgwYjYyMDAzYiwgMHgwYjYyMDAzYSwKLQkweDBhNjIwMDQxLCAweDBhNjIwMDQwLCAweDBhNjIwMDNlLCAweDBhNjIwMDNjLAotCTB4MGE2MjAwM2IsIDB4MGE2MjAwM2EsIDB4MGE2MjAwMzksIDB4MGE2MjAwMzgsCi0JMHgwOTYyMDAzZSwgMHgwOTYyMDAzZCwgMHgwOTYyMDAzYywgMHgwOTYyMDAzYiwKLQkweDA5NjIwMDM5LCAweDA5NjIwMDM3LCAweDA5NjIwMDM1LCAweDA5NjIwMDMzLAotCTB4MDg2MjAwNDQsIDB4MDg2MjAwNDIsIDB4MDg2MjAwNDAsIDB4MDg2MjAwM2UsCi0JMHgwODYyMDAzYywgMHgwODYyMDAzYiwgMHgwODYyMDAzYSwgMHgwODYyMDAzOSwKLQkweDA3NjIwMDQzLCAweDA3NjIwMDQyLCAweDA3NjIwMDQwLCAweDA3NjIwMDNmLAotCTB4MDc2MjAwM2QsIDB4MDc2MjAwM2IsIDB4MDc2MjAwM2EsIDB4MDc2MjAwMzksCi0JMHgwNjYyMDAzZSwgMHgwNjYyMDAzZCwgMHgwNjYyMDAzYywgMHgwNjYyMDAzYiwKLQkweDA2NjIwMDM5LCAweDA2NjIwMDM3LCAweDA2NjIwMDM1LCAweDA2NjIwMDMzLAotCTB4MDU2MjAwNDYsIDB4MDU2MjAwNDQsIDB4MDU2MjAwNDIsIDB4MDU2MjAwNDAsCi0JMHgwNTYyMDAzZSwgMHgwNTYyMDAzYywgMHgwNTYyMDAzYiwgMHgwNTYyMDAzOSwKLQkweDA0NjIwMDQ0LCAweDA0NjIwMDQyLCAweDA0NjIwMDQwLCAweDA0NjIwMDNlLAotCTB4MDQ2MjAwM2MsIDB4MDQ2MjAwM2IsIDB4MDQ2MjAwMzksIDB4MDQ2MjAwMzgsCi0JMHgwMzYyMDAzYywgMHgwMzYyMDAzYiwgMHgwMzYyMDAzYSwgMHgwMzYyMDAzOSwKLQkweDAzNjIwMDM4LCAweDAzNjIwMDM3LCAweDAzNjIwMDM1LCAweDAzNjIwMDMzLAotCTB4MDI2MjAwNGMsIDB4MDI2MjAwNGEsIDB4MDI2MjAwNDgsIDB4MDI2MjAwNDcsCi0JMHgwMjYyMDA0NiwgMHgwMjYyMDA0NCwgMHgwMjYyMDA0MywgMHgwMjYyMDA0MiwKLQkweDAxNjIwMDRhLCAweDAxNjIwMDQ4LCAweDAxNjIwMDQ2LCAweDAxNjIwMDQ0LAotCTB4MDE2MjAwNDMsIDB4MDE2MjAwNDIsIDB4MDE2MjAwNDEsIDB4MDE2MjAwNDAsCi0JMHgwMDYyMDA0MiwgMHgwMDYyMDA0MCwgMHgwMDYyMDAzZSwgMHgwMDYyMDAzYywKLQkweDAwNjIwMDNiLCAweDAwNjIwMDM5LCAweDAwNjIwMDM3LCAweDAwNjIwMDM1Ci19OwotCi1zdGF0aWMgdTMyIG5waHlfdHBjXzVHSHpfdHhnYWluX0hpUHdyRVBBW10gPSB7Ci0JMHgyZmYxMDA0NCwgMHgyZmYxMDA0MiwgMHgyZmYxMDA0MCwgMHgyZmYxMDAzZSwKLQkweDJmZjEwMDNjLCAweDJmZjEwMDNiLCAweDJmZjEwMDM5LCAweDJmZjEwMDM3LAotCTB4MmVmMTAwNDQsIDB4MmVmMTAwNDIsIDB4MmVmMTAwNDAsIDB4MmVmMTAwM2UsCi0JMHgyZWYxMDAzYywgMHgyZWYxMDAzYiwgMHgyZWYxMDAzOSwgMHgyZWYxMDAzNywKLQkweDJkZjEwMDQ0LCAweDJkZjEwMDQyLCAweDJkZjEwMDQwLCAweDJkZjEwMDNlLAotCTB4MmRmMTAwM2MsIDB4MmRmMTAwM2IsIDB4MmRmMTAwMzksIDB4MmRmMTAwMzcsCi0JMHgyY2YxMDA0NCwgMHgyY2YxMDA0MiwgMHgyY2YxMDA0MCwgMHgyY2YxMDAzZSwKLQkweDJjZjEwMDNjLCAweDJjZjEwMDNiLCAweDJjZjEwMDM5LCAweDJjZjEwMDM3LAotCTB4MmJmMTAwNDQsIDB4MmJmMTAwNDIsIDB4MmJmMTAwNDAsIDB4MmJmMTAwM2UsCi0JMHgyYmYxMDAzYywgMHgyYmYxMDAzYiwgMHgyYmYxMDAzOSwgMHgyYmYxMDAzNywKLQkweDJhZjEwMDQ0LCAweDJhZjEwMDQyLCAweDJhZjEwMDQwLCAweDJhZjEwMDNlLAotCTB4MmFmMTAwM2MsIDB4MmFmMTAwM2IsIDB4MmFmMTAwMzksIDB4MmFmMTAwMzcsCi0JMHgyOWYxMDA0NCwgMHgyOWYxMDA0MiwgMHgyOWYxMDA0MCwgMHgyOWYxMDAzZSwKLQkweDI5ZjEwMDNjLCAweDI5ZjEwMDNiLCAweDI5ZjEwMDM5LCAweDI5ZjEwMDM3LAotCTB4MjhmMTAwNDQsIDB4MjhmMTAwNDIsIDB4MjhmMTAwNDAsIDB4MjhmMTAwM2UsCi0JMHgyOGYxMDAzYywgMHgyOGYxMDAzYiwgMHgyOGYxMDAzOSwgMHgyOGYxMDAzNywKLQkweDI3ZjEwMDQ0LCAweDI3ZjEwMDQyLCAweDI3ZjEwMDQwLCAweDI3ZjEwMDNlLAotCTB4MjdmMTAwM2MsIDB4MjdmMTAwM2IsIDB4MjdmMTAwMzksIDB4MjdmMTAwMzcsCi0JMHgyNmYxMDA0NCwgMHgyNmYxMDA0MiwgMHgyNmYxMDA0MCwgMHgyNmYxMDAzZSwKLQkweDI2ZjEwMDNjLCAweDI2ZjEwMDNiLCAweDI2ZjEwMDM5LCAweDI2ZjEwMDM3LAotCTB4MjVmMTAwNDQsIDB4MjVmMTAwNDIsIDB4MjVmMTAwNDAsIDB4MjVmMTAwM2UsCi0JMHgyNWYxMDAzYywgMHgyNWYxMDAzYiwgMHgyNWYxMDAzOSwgMHgyNWYxMDAzNywKLQkweDI0ZjEwMDQ0LCAweDI0ZjEwMDQyLCAweDI0ZjEwMDQwLCAweDI0ZjEwMDNlLAotCTB4MjRmMTAwM2MsIDB4MjRmMTAwM2IsIDB4MjRmMTAwMzksIDB4MjRmMTAwMzgsCi0JMHgyM2YxMDA0MSwgMHgyM2YxMDA0MCwgMHgyM2YxMDAzZiwgMHgyM2YxMDAzZSwKLQkweDIzZjEwMDNjLCAweDIzZjEwMDNiLCAweDIzZjEwMDM5LCAweDIzZjEwMDM3LAotCTB4MjJmMTAwNDQsIDB4MjJmMTAwNDIsIDB4MjJmMTAwNDAsIDB4MjJmMTAwM2UsCi0JMHgyMmYxMDAzYywgMHgyMmYxMDAzYiwgMHgyMmYxMDAzOSwgMHgyMmYxMDAzNywKLQkweDIxZjEwMDQ0LCAweDIxZjEwMDQyLCAweDIxZjEwMDQwLCAweDIxZjEwMDNlLAotCTB4MjFmMTAwM2MsIDB4MjFmMTAwM2IsIDB4MjFmMTAwMzksIDB4MjFmMTAwMzcsCi0JMHgyMGQxMDA0MywgMHgyMGQxMDA0MSwgMHgyMGQxMDAzZSwgMHgyMGQxMDAzYywKLQkweDIwZDEwMDNhLCAweDIwZDEwMDM4LCAweDIwZDEwMDM2LCAweDIwZDEwMDM0Ci19OwotCi1zdGF0aWMgdTggYW50X3N3X2N0cmxfdGJsX3JldjhfMm8zW10gPSB7IDB4MTQsIDB4MTggfTsKLXN0YXRpYyB1OCBhbnRfc3dfY3RybF90YmxfcmV2OFtdID0geyAweDQsIDB4OCwgMHg0LCAweDgsIDB4MTEsIDB4MTIgfTsKLXN0YXRpYyB1OCBhbnRfc3dfY3RybF90YmxfcmV2OF8yMDU3djdfY29yZTBbXSA9IHsKLQkweDA5LCAweDBhLCAweDE1LCAweDE2LCAweDA5LCAweDBhIH07Ci1zdGF0aWMgdTggYW50X3N3X2N0cmxfdGJsX3JldjhfMjA1N3Y3X2NvcmUxW10gPSB7Ci0JMHgwOSwgMHgwYSwgMHgwOSwgMHgwYSwgMHgxNSwgMHgxNiB9OwotCi1zdGF0aWMgYm9vbCB3bGNfcGh5X2NoYW4yZnJlcV9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1aW50IGNoYW5uZWwsIGludCAqZiwKLQkJCQkgICBzdHJ1Y3QgY2hhbl9pbmZvX25waHlfcmFkaW8yMDU3ICoqdDAsCi0JCQkJICAgc3RydWN0IGNoYW5faW5mb19ucGh5X3JhZGlvMjA1eCAqKnQxLAotCQkJCSAgIHN0cnVjdCBjaGFuX2luZm9fbnBoeV9yYWRpbzIwNTdfcmV2NSAqKnQyLAotCQkJCSAgIHN0cnVjdCBjaGFuX2luZm9fbnBoeV8yMDU1ICoqdDMpOwotc3RhdGljIHZvaWQgd2xjX3BoeV9jaGFuc3BlY19ucGh5X3NldHVwKHN0cnVjdCBicmNtc19waHkgKnBpLCBjaGFuc3BlY190IGNoYW5zLAotCQkJCQljb25zdCBzdHJ1Y3QgbnBoeV9zZm9fY2ZnICpjKTsKLQotc3RhdGljIHZvaWQgd2xjX3BoeV9hZGp1c3RfcnhfYW5hbHBmYndfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwKLQkJCQkJICAgIHUxNiByZWR1Y3Rpb25fZmFjdHIpOwotc3RhdGljIHZvaWQgd2xjX3BoeV9hZGp1c3RfbWluX25vaXNldmFyX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksCi0JCQkJCSAgICAgaW50IG50b25lcywgaW50ICosIHUzMiAqYnVmKTsKLXN0YXRpYyB2b2lkIHdsY19waHlfYWRqdXN0X2Nyc21pbnB3cl9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCBtaW5wd3IpOwotc3RhdGljIHZvaWQgd2xjX3BoeV90eGxwZmJ3X25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotc3RhdGljIHZvaWQgd2xjX3BoeV9zcHVyd2FyX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3JhZGlvX3ByZWluaXRfMjA1NShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1zdGF0aWMgdm9pZCB3bGNfcGh5X3JhZGlvX2luaXRfMjA1NShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1zdGF0aWMgdm9pZCB3bGNfcGh5X3JhZGlvX3Bvc3Rpbml0XzIwNTUoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotc3RhdGljIHZvaWQgd2xjX3BoeV9yYWRpb19wcmVpbml0XzIwNXgoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotc3RhdGljIHZvaWQgd2xjX3BoeV9yYWRpb19pbml0XzIwNTYoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotc3RhdGljIHZvaWQgd2xjX3BoeV9yYWRpb19wb3N0aW5pdF8yMDU2KHN0cnVjdCBicmNtc19waHkgKnBpKTsKLXN0YXRpYyB2b2lkIHdsY19waHlfcmFkaW9faW5pdF8yMDU3KHN0cnVjdCBicmNtc19waHkgKnBpKTsKLXN0YXRpYyB2b2lkIHdsY19waHlfcmFkaW9fcG9zdGluaXRfMjA1NyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1zdGF0aWMgdm9pZCB3bGNfcGh5X3dvcmthcm91bmRzX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotc3RhdGljIHZvaWQgd2xjX3BoeV93b3JrYXJvdW5kc19ucGh5X2dhaW5jdHJsKHN0cnVjdCBicmNtc19waHkgKnBpKTsKLXN0YXRpYyB2b2lkIHdsY19waHlfd29ya2Fyb3VuZHNfbnBoeV9nYWluY3RybF8yMDU3X3JldjUoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotc3RhdGljIHZvaWQgd2xjX3BoeV93b3JrYXJvdW5kc19ucGh5X2dhaW5jdHJsXzIwNTdfcmV2NihzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1zdGF0aWMgdm9pZCB3bGNfcGh5X2FkanVzdF9sbmFnYWludGJsX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3Jlc3RvcmVfcnNzaWNhbF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKTsKLXN0YXRpYyB2b2lkIHdsY19waHlfcmVhcHBseV90eGNhbF9jb2VmZnNfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1zdGF0aWMgdm9pZCB3bGNfcGh5X3R4X2lxX3dhcl9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKTsKLXN0YXRpYyBpbnQgd2xjX3BoeV9jYWxfcnhpcV9ucGh5X3JldjMoc3RydWN0IGJyY21zX3BoeSAqcGksCi0JCQkJICAgICAgc3RydWN0IG5waHlfdHhnYWlucyB0ZywgdTggdHlwZSwgYm9vbCBkKTsKLXN0YXRpYyB2b2lkIHdsY19waHlfcnhjYWxfZ2FpbmN0cmxfbnBoeV9yZXY1KHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCByeGNvcmUsCi0JCQkJCSAgICAgdTE2ICpyZywgdTggdHlwZSk7Ci1zdGF0aWMgdm9pZCB3bGNfcGh5X3VwZGF0ZV9taW1vY29uZmlnX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHMzMiBwcmVhbWJsZSk7Ci1zdGF0aWMgdm9pZCB3bGNfcGh5X3NhdmVjYWxfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1zdGF0aWMgdm9pZCB3bGNfcGh5X3Jlc3RvcmVjYWxfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1zdGF0aWMgdm9pZCB3bGNfcGh5X3Jlc2V0Y2NhX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3R4cHdyY3RybF9jb25maWdfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1zdGF0aWMgdm9pZCB3bGNfcGh5X2ludGVybmFsX2NhbF90eGdhaW5fbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1zdGF0aWMgdm9pZCB3bGNfcGh5X3ByZWNhbF90eGdhaW5fbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1zdGF0aWMgdm9pZCB3bGNfcGh5X3VwZGF0ZV90eGNhbF9sYWRkZXJfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTE2IGNvcmUpOwotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X2V4dHBhX3NldF90eF9kaWdpX2ZpbHRzX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotc3RhdGljIHZvaWQgd2xjX3BoeV9pcGFfc2V0X3R4X2RpZ2lfZmlsdHNfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1zdGF0aWMgdm9pZCB3bGNfcGh5X2lwYV9yZXN0b3JlX3R4X2RpZ2lfZmlsdHNfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1zdGF0aWMgdTE2IHdsY19waHlfaXBhX2dldF9iYm11bHRfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1zdGF0aWMgdm9pZCB3bGNfcGh5X2lwYV9zZXRfYmJtdWx0X25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHU4IG0wLCB1OCBtMSk7Ci1zdGF0aWMgdTMyICp3bGNfcGh5X2dldF9pcGFfZ2FpbnRibF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKTsKLQotc3RhdGljIHZvaWQgd2xjX3BoeV9hMV9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCBjb3JlLCB1MzIgd2luc3osIHUzMiwKLQkJCSAgICB1MzIgZSk7Ci1zdGF0aWMgdTggd2xjX3BoeV9hM19ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCBzdGFydF9nYWluLCB1OCBjb3JlKTsKLXN0YXRpYyB2b2lkIHdsY19waHlfYTJfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgc3RydWN0IG5waHlfaXBhX3R4Y2FsZ2FpbnMgKiwKLQkJCSAgICBlbnVtIHBoeV9jYWxfbW9kZSwgdTgpOwotc3RhdGljIHZvaWQgd2xjX3BoeV9wYXBkX2NhbF9jbGVhbnVwX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksCi0JCQkJc3RydWN0IG5waHlfcGFwZF9yZXN0b3JlX3N0YXRlICpzdGF0ZSk7Ci1zdGF0aWMgdm9pZCB3bGNfcGh5X3BhcGRfY2FsX3NldHVwX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksCi0JCQkJc3RydWN0IG5waHlfcGFwZF9yZXN0b3JlX3N0YXRlICpzdGF0ZSwgdTgpOwotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X2NsaXBfZGV0X25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHU4IHdyaXRlLCB1MTYgKnZhbHMpOwotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3NldF9yZnNlcV9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCBjbWQsIHU4ICpldnRzLAotCQkJCSAgIHU4ICpkbHlzLCB1OCBsZW4pOwotCi1zdGF0aWMgdTE2IHdsY19waHlfcmVhZF9scGZfYndfY3RsX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBvZmZzZXQpOwotCi1zdGF0aWMgdm9pZAotd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHN0cnVjdCBicmNtc19waHkgKnBpLCB1MTYgZmllbGQsIHUxNiB2YWx1ZSwKLQkJCQkgIHU4IGNvcmVfbWFzaywgdTggb2ZmLAotCQkJCSAgdTggb3ZlcnJpZGVfaWQpOwotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3Jzc2lfY2FsX25waHlfcmV2MihzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTggcnNzaV90eXBlKTsKLXN0YXRpYyB2b2lkIHdsY19waHlfcnNzaV9jYWxfbnBoeV9yZXYzKHN0cnVjdCBicmNtc19waHkgKnBpKTsKLQotc3RhdGljIGJvb2wgd2xjX3BoeV90eHB3cl9zcm9tX3JlYWRfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1zdGF0aWMgdm9pZCB3bGNfcGh5X3R4cHdyX25waHlfc3JvbV9jb252ZXJ0KHU4ICpzcm9tX21heCwKLQkJCQkJICAgIHUxNiAqcHdyX29mZnNldCwKLQkJCQkJICAgIHU4IHRtcF9tYXhfcHdyLCB1OCByYXRlX3N0YXJ0LAotCQkJCQkgICAgdTggcmF0ZV9lbmQpOwotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3R4cHdyX2xpbWl0X3RvX3RibF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKTsKLXN0YXRpYyB2b2lkIHdsY19waHlfdHhwd3JjdHJsX2NvZWZmX3NldHVwX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotc3RhdGljIHZvaWQgd2xjX3BoeV90eHB3cmN0cmxfaWRsZV90c3NpX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotc3RhdGljIHZvaWQgd2xjX3BoeV90eHB3cmN0cmxfcHdyX3NldHVwX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpOwotCi1zdGF0aWMgYm9vbCB3bGNfcGh5X3R4cHdyX2lzb25fbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci1zdGF0aWMgdTggd2xjX3BoeV90eHB3cl9pZHhfY3VyX2dldF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCBjb3JlKTsKLXN0YXRpYyB2b2lkIHdsY19waHlfdHhwd3JfaWR4X2N1cl9zZXRfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTggaWR4MCwKLQkJCQkJICAgdTggaWR4MSk7Ci1zdGF0aWMgdm9pZCB3bGNfcGh5X2E0KHN0cnVjdCBicmNtc19waHkgKnBpLCBib29sIGZ1bGxfY2FsKTsKLQotc3RhdGljIHUxNiB3bGNfcGh5X3JhZGlvMjA1eF9yY2FsKHN0cnVjdCBicmNtc19waHkgKnBpKTsKLQotc3RhdGljIHUxNiB3bGNfcGh5X3JhZGlvMjA1N19yY2NhbChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSk7Ci0KLXN0YXRpYyB1MTYgd2xjX3BoeV9nZW5fbG9hZF9zYW1wbGVzX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHUzMiBmX2tIeiwKLQkJCQkJICAgIHUxNiBtYXhfdmFsLAotCQkJCQkgICAgdTggZGFjX3Rlc3RfbW9kZSk7Ci1zdGF0aWMgdm9pZCB3bGNfcGh5X2xvYWRzYW1wbGV0YWJsZV9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCBjczMyICp0b25lX2J1ZiwKLQkJCQkJIHUxNiBudW1fc2FtcHMpOwotc3RhdGljIHZvaWQgd2xjX3BoeV9ydW5zYW1wbGVzX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBuLCB1MTYgbHBzLAotCQkJCSAgICB1MTYgd2FpdCwgdTggaXEsIHU4IGRhY190ZXN0X21vZGUsCi0JCQkJICAgIGJvb2wgbW9kaWZ5X2JibXVsdCk7Ci0KLWJvb2wgd2xjX3BoeV9iaXN0X2NoZWNrX3BoeShzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcGloKQotewotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcGloOwotCXUzMiBwaHliaXN0MCwgcGh5YmlzdDEsIHBoeWJpc3QyLCBwaHliaXN0MywgcGh5YmlzdDQ7Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMTYpKQotCQlyZXR1cm4gdHJ1ZTsKLQotCXBoeWJpc3QwID0gcmVhZF9waHlfcmVnKHBpLCAweDBlKTsKLQlwaHliaXN0MSA9IHJlYWRfcGh5X3JlZyhwaSwgMHgwZik7Ci0JcGh5YmlzdDIgPSByZWFkX3BoeV9yZWcocGksIDB4ZWEpOwotCXBoeWJpc3QzID0gcmVhZF9waHlfcmVnKHBpLCAweGViKTsKLQlwaHliaXN0NCA9IHJlYWRfcGh5X3JlZyhwaSwgMHgxNTYpOwotCi0JaWYgKChwaHliaXN0MCA9PSAwKSAmJiAocGh5YmlzdDEgPT0gMHg0MDAwKSAmJiAocGh5YmlzdDIgPT0gMHgxZmUwKSAmJgotCSAgICAocGh5YmlzdDMgPT0gMCkgJiYgKHBoeWJpc3Q0ID09IDApKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgd2xjX3BoeV9icGh5X2luaXRfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQl1MTYgYWRkciwgdmFsOwotCi0JdmFsID0gMHgxZTFmOwotCWZvciAoYWRkciA9IChOUEhZX1RPX0JQSFlfT0ZGICsgQlBIWV9SU1NJX0xVVCk7Ci0JICAgICBhZGRyIDw9IChOUEhZX1RPX0JQSFlfT0ZGICsgQlBIWV9SU1NJX0xVVF9FTkQpOyBhZGRyKyspIHsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgYWRkciwgdmFsKTsKLQkJaWYgKGFkZHIgPT0gKE5QSFlfVE9fQlBIWV9PRkYgKyAweDk3KSkKLQkJCXZhbCA9IDB4M2UzZjsKLQkJZWxzZQotCQkJdmFsIC09IDB4MDIwMjsKLQl9Ci0KLQlpZiAoTk9SQURJT19FTkFCKHBpLT5wdWJwaSkpIHsKLQotCQl3cml0ZV9waHlfcmVnKHBpLCBOUEhZX1RPX0JQSFlfT0ZGICsgQlBIWV9QSFlDUlNUSCwgMHgzMjA2KTsKLQotCQl3cml0ZV9waHlfcmVnKHBpLCBOUEhZX1RPX0JQSFlfT0ZGICsgQlBIWV9SU1NJX1RSRVNILCAweDI4MWUpOwotCi0JCW9yX3BoeV9yZWcocGksIE5QSFlfVE9fQlBIWV9PRkYgKyBCUEhZX0xOQV9HQUlOX1JBTkdFLCAweDFhKTsKLQotCX0gZWxzZSB7Ci0KLQkJd3JpdGVfcGh5X3JlZyhwaSwgTlBIWV9UT19CUEhZX09GRiArIEJQSFlfU1RFUCwgMHg2NjgpOwotCX0KLX0KLQotdm9pZAotd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1MzIgaWQsIHUzMiBsZW4sIHUzMiBvZmZzZXQsCi0JCQkgdTMyIHdpZHRoLCBjb25zdCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBwaHl0YmxfaW5mbyB0Ymw7Ci0KLQl0YmwudGJsX2lkID0gaWQ7Ci0JdGJsLnRibF9sZW4gPSBsZW47Ci0JdGJsLnRibF9vZmZzZXQgPSBvZmZzZXQ7Ci0JdGJsLnRibF93aWR0aCA9IHdpZHRoOwotCXRibC50YmxfcHRyID0gZGF0YTsKLQl3bGNfcGh5X3dyaXRlX3RhYmxlX25waHkocGksICZ0YmwpOwotfQotCi12b2lkCi13bGNfcGh5X3RhYmxlX3JlYWRfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTMyIGlkLCB1MzIgbGVuLCB1MzIgb2Zmc2V0LAotCQkJdTMyIHdpZHRoLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBwaHl0YmxfaW5mbyB0Ymw7Ci0KLQl0YmwudGJsX2lkID0gaWQ7Ci0JdGJsLnRibF9sZW4gPSBsZW47Ci0JdGJsLnRibF9vZmZzZXQgPSBvZmZzZXQ7Ci0JdGJsLnRibF93aWR0aCA9IHdpZHRoOwotCXRibC50YmxfcHRyID0gZGF0YTsKLQl3bGNfcGh5X3JlYWRfdGFibGVfbnBoeShwaSwgJnRibCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi13bGNfcGh5X3N0YXRpY190YWJsZV9kb3dubG9hZF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXVpbnQgaWR4OwotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDE2KSkgewotCQlmb3IgKGlkeCA9IDA7IGlkeCA8IG1pbW9waHl0YmxfaW5mb19zel9yZXYxNjsgaWR4KyspCi0JCQl3bGNfcGh5X3dyaXRlX3RhYmxlX25waHkocGksCi0JCQkJCQkgJm1pbW9waHl0YmxfaW5mb19yZXYxNltpZHhdKTsKLQl9IGVsc2UgaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCWZvciAoaWR4ID0gMDsgaWR4IDwgbWltb3BoeXRibF9pbmZvX3N6X3Jldjc7IGlkeCsrKQotCQkJd2xjX3BoeV93cml0ZV90YWJsZV9ucGh5KHBpLAotCQkJCQkJICZtaW1vcGh5dGJsX2luZm9fcmV2N1tpZHhdKTsKLQl9IGVsc2UgaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0JCWZvciAoaWR4ID0gMDsgaWR4IDwgbWltb3BoeXRibF9pbmZvX3N6X3JldjM7IGlkeCsrKQotCQkJd2xjX3BoeV93cml0ZV90YWJsZV9ucGh5KHBpLAotCQkJCQkJICZtaW1vcGh5dGJsX2luZm9fcmV2M1tpZHhdKTsKLQl9IGVsc2UgewotCQlmb3IgKGlkeCA9IDA7IGlkeCA8IG1pbW9waHl0YmxfaW5mb19zel9yZXYwOyBpZHgrKykKLQkJCXdsY19waHlfd3JpdGVfdGFibGVfbnBoeShwaSwKLQkJCQkJCSAmbWltb3BoeXRibF9pbmZvX3JldjBbaWR4XSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3RibF9pbml0X25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JdWludCBpZHggPSAwOwotCXU4IGFudHN3Y3RybGx1dDsKLQotCWlmIChwaS0+cGh5X2luaXRfcG9yKQotCQl3bGNfcGh5X3N0YXRpY190YWJsZV9kb3dubG9hZF9ucGh5KHBpKTsKLQotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCi0JCWFudHN3Y3RybGx1dCA9IENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykgPwotCQkgICAgcGktPnNyb21fZmVtMmcuYW50c3djdHJsbHV0IDogcGktPnNyb21fZmVtNWcuYW50c3djdHJsbHV0OwotCi0JCXN3aXRjaCAoYW50c3djdHJsbHV0KSB7Ci0JCWNhc2UgMDoKLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSAxOgotCi0JCQlpZiAocGktPmFhMmcgPT0gNykgewotCi0JCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLAotCQkJCQkJCSBOUEhZX1RCTF9JRF9BTlRTV0NUUkxMVVQsCi0JCQkJCQkJIDIsIDB4MjEsIDgsCi0JCQkJCQkJICZhbnRfc3dfY3RybF90YmxfcmV2OF8ybzMKLQkJCQkJCQkgWzBdKTsKLQkJCX0gZWxzZSB7Ci0JCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLAotCQkJCQkJCSBOUEhZX1RCTF9JRF9BTlRTV0NUUkxMVVQsCi0JCQkJCQkJIDIsIDB4MjEsIDgsCi0JCQkJCQkJICZhbnRfc3dfY3RybF90YmxfcmV2OAotCQkJCQkJCSBbMF0pOwotCQkJfQotCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9BTlRTV0NUUkxMVVQsCi0JCQkJCQkgMiwgMHgyNSwgOCwKLQkJCQkJCSAmYW50X3N3X2N0cmxfdGJsX3JldjhbMl0pOwotCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9BTlRTV0NUUkxMVVQsCi0JCQkJCQkgMiwgMHgyOSwgOCwKLQkJCQkJCSAmYW50X3N3X2N0cmxfdGJsX3JldjhbNF0pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAyOgotCi0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FOVFNXQ1RSTExVVCwKLQkJCQkJCSAyLCAweDEsIDgsCi0JCQkJCQkgJmFudF9zd19jdHJsX3RibF9yZXY4XzIwNTd2N19jb3JlMAotCQkJCQkJIFswXSk7Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FOVFNXQ1RSTExVVCwKLQkJCQkJCSAyLCAweDUsIDgsCi0JCQkJCQkgJmFudF9zd19jdHJsX3RibF9yZXY4XzIwNTd2N19jb3JlMAotCQkJCQkJIFsyXSk7Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FOVFNXQ1RSTExVVCwKLQkJCQkJCSAyLCAweDksIDgsCi0JCQkJCQkgJmFudF9zd19jdHJsX3RibF9yZXY4XzIwNTd2N19jb3JlMAotCQkJCQkJIFs0XSk7Ci0KLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQU5UU1dDVFJMTFVULAotCQkJCQkJIDIsIDB4MjEsIDgsCi0JCQkJCQkgJmFudF9zd19jdHJsX3RibF9yZXY4XzIwNTd2N19jb3JlMQotCQkJCQkJIFswXSk7Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FOVFNXQ1RSTExVVCwKLQkJCQkJCSAyLCAweDI1LCA4LAotCQkJCQkJICZhbnRfc3dfY3RybF90YmxfcmV2OF8yMDU3djdfY29yZTEKLQkJCQkJCSBbMl0pOwotCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9BTlRTV0NUUkxMVVQsCi0JCQkJCQkgMiwgMHgyOSwgOCwKLQkJCQkJCSAmYW50X3N3X2N0cmxfdGJsX3JldjhfMjA1N3Y3X2NvcmUxCi0JCQkJCQkgWzRdKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCi0JfSBlbHNlIGlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCQlmb3IgKGlkeCA9IDA7IGlkeCA8IG1pbW9waHl0YmxfaW5mb19zel9yZXYzX3ZvbGF0aWxlOyBpZHgrKykgewotCi0JCQlpZiAoaWR4ID09IEFOVF9TV0NUUkxfVEJMX1JFVjNfSURYKSB7Ci0JCQkJYW50c3djdHJsbHV0ID0gQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSA/Ci0JCQkJICAgIHBpLT5zcm9tX2ZlbTJnLmFudHN3Y3RybGx1dCA6IHBpLT4KLQkJCQkgICAgc3JvbV9mZW01Zy5hbnRzd2N0cmxsdXQ7Ci0JCQkJc3dpdGNoIChhbnRzd2N0cmxsdXQpIHsKLQkJCQljYXNlIDA6Ci0JCQkJCXdsY19waHlfd3JpdGVfdGFibGVfbnBoeShwaSwKLQkJCQkJCQkJICZtaW1vcGh5dGJsX2luZm9fcmV2M192b2xhdGlsZQotCQkJCQkJCQkgW2lkeF0pOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDE6Ci0JCQkJCXdsY19waHlfd3JpdGVfdGFibGVfbnBoeShwaSwKLQkJCQkJCQkJICZtaW1vcGh5dGJsX2luZm9fcmV2M192b2xhdGlsZTEKLQkJCQkJCQkJIFtpZHhdKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOgotCQkJCQl3bGNfcGh5X3dyaXRlX3RhYmxlX25waHkocGksCi0JCQkJCQkJCSAmbWltb3BoeXRibF9pbmZvX3JldjNfdm9sYXRpbGUyCi0JCQkJCQkJCSBbaWR4XSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzoKLQkJCQkJd2xjX3BoeV93cml0ZV90YWJsZV9ucGh5KHBpLAotCQkJCQkJCQkgJm1pbW9waHl0YmxfaW5mb19yZXYzX3ZvbGF0aWxlMwotCQkJCQkJCQkgW2lkeF0pOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXdsY19waHlfd3JpdGVfdGFibGVfbnBoeShwaSwKLQkJCQkJCQkgJm1pbW9waHl0YmxfaW5mb19yZXYzX3ZvbGF0aWxlCi0JCQkJCQkJIFtpZHhdKTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWZvciAoaWR4ID0gMDsgaWR4IDwgbWltb3BoeXRibF9pbmZvX3N6X3JldjBfdm9sYXRpbGU7IGlkeCsrKSB7Ci0JCQl3bGNfcGh5X3dyaXRlX3RhYmxlX25waHkocGksCi0JCQkJCQkgJm1pbW9waHl0YmxfaW5mb19yZXYwX3ZvbGF0aWxlCi0JCQkJCQkgW2lkeF0pOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotd2xjX3BoeV93cml0ZV90eG1hY3JlZ19ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1MTYgaG9sZG9mZiwgdTE2IGRlbGF5KQotewotCXdyaXRlX3BoeV9yZWcocGksIDB4NzcsIGhvbGRvZmYpOwotCXdyaXRlX3BoeV9yZWcocGksIDB4YjQsIGRlbGF5KTsKLX0KLQotdm9pZCB3bGNfcGh5X25waHlfdGtpcF9yaWZzX3dhcihzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTggcmlmcykKLXsKLQl1MTYgaG9sZG9mZiwgZGVsYXk7Ci0KLQlpZiAocmlmcykgewotCi0JCWhvbGRvZmYgPSAweDEwOwotCQlkZWxheSA9IDB4MjU4OwotCX0gZWxzZSB7Ci0KLQkJaG9sZG9mZiA9IDB4MTU7Ci0JCWRlbGF5ID0gMHgzMjA7Ci0JfQotCi0Jd2xjX3BoeV93cml0ZV90eG1hY3JlZ19ucGh5KHBpLCBob2xkb2ZmLCBkZWxheSk7Ci0KLQlpZiAocGkgJiYgcGktPnNoICYmIChwaS0+c2gtPl9yaWZzX3BoeSAhPSByaWZzKSkgewotCQlwaS0+c2gtPl9yaWZzX3BoeSA9IHJpZnM7Ci0JfQotfQotCi1ib29sIHdsY19waHlfYXR0YWNoX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JdWludCBpOwotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpICYmIE5SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDYpKSB7Ci0JCXBpLT5waHloYW5nX2F2b2lkID0gdHJ1ZTsKLQl9Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykgJiYgTlJFVl9MVChwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQotCQlwaS0+bnBoeV9nYmFuZF9zcHVyd2FyX2VuID0gdHJ1ZTsKLQotCQlpZiAocGktPnNoLT5ib2FyZGZsYWdzMiAmIEJGTDJfU1BVUl9XQVIpIHsKLQkJCXBpLT5ucGh5X2FiYW5kX3NwdXJ3YXJfZW4gPSB0cnVlOwotCQl9Ci0JfQotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA2KSAmJiBOUkVWX0xUKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCi0JCWlmIChwaS0+c2gtPmJvYXJkZmxhZ3MyICYgQkZMMl8yR19TUFVSX1dBUikgewotCQkJcGktPm5waHlfZ2JhbmRfc3B1cndhcjJfZW4gPSB0cnVlOwotCQl9Ci0JfQotCi0JcGktPm5fcHJlYW1ibGVfb3ZlcnJpZGUgPSBBVVRPOwotCWlmIChOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCAzKSB8fCBOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCA0KSkKLQkJcGktPm5fcHJlYW1ibGVfb3ZlcnJpZGUgPSBCUkNNU19OX1BSRUFNQkxFX01JWEVETU9ERTsKLQotCXBpLT5ucGh5X3R4cnhfY2hhaW4gPSBBVVRPOwotCXBpLT5waHlfc2NyYW1pbml0ID0gQVVUTzsKLQotCXBpLT5ucGh5X3J4Y2FscGFyYW1zID0gMHgwMTAxMDBCNTsKLQotCXBpLT5ucGh5X3BlcmljYWwgPSBQSFlfUEVSSUNBTF9NUEhBU0U7Ci0JcGktPm1waGFzZV9jYWxfcGhhc2VfaWQgPSBNUEhBU0VfQ0FMX1NUQVRFX0lETEU7Ci0JcGktPm1waGFzZV90eGNhbF9udW1jbWRzID0gTVBIQVNFX1RYQ0FMX05VTUNNRFM7Ci0KLQlwaS0+bnBoeV9nYWluX2Jvb3N0ID0gdHJ1ZTsKLQlwaS0+bnBoeV9lbG5hX2dhaW5fY29uZmlnID0gZmFsc2U7Ci0JcGktPnJhZGlvX2lzX29uID0gZmFsc2U7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcGktPnB1YnBpLnBoeV9jb3JlbnVtOyBpKyspIHsKLQkJcGktPm5waHlfdHhwd3JpbmRleFtpXS5pbmRleCA9IEFVVE87Ci0JfQotCi0Jd2xjX3BoeV90eHB3cmN0cmxfY29uZmlnX25waHkocGkpOwotCWlmIChwaS0+bnBoeV90eHB3cmN0cmwgPT0gUEhZX1RQQ19IV19PTikKLQkJcGktPmh3cHdyY3RybF9jYXBhYmxlID0gdHJ1ZTsKLQotCXBpLT5waV9mcHRyLmluaXQgPSB3bGNfcGh5X2luaXRfbnBoeTsKLQlwaS0+cGlfZnB0ci5jYWxpbml0ID0gd2xjX3BoeV9jYWxfaW5pdF9ucGh5OwotCXBpLT5waV9mcHRyLmNoYW5zZXQgPSB3bGNfcGh5X2NoYW5zcGVjX3NldF9ucGh5OwotCXBpLT5waV9mcHRyLnR4cHdycmVjYWxjID0gd2xjX3BoeV90eHBvd2VyX3JlY2FsY190YXJnZXRfbnBoeTsKLQotCWlmICghd2xjX3BoeV90eHB3cl9zcm9tX3JlYWRfbnBoeShwaSkpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3R4cHdyY3RybF9jb25maWdfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCQlwaS0+bnBoeV90eHB3cmN0cmwgPSBQSFlfVFBDX0hXX09OOwotCQlwaS0+cGh5XzVnX3B3cmdhaW4gPSB0cnVlOwotCQlyZXR1cm47Ci0JfQotCi0JcGktPm5waHlfdHhwd3JjdHJsID0gUEhZX1RQQ19IV19PRkY7Ci0JcGktPnBoeV81Z19wd3JnYWluID0gZmFsc2U7Ci0KLQlpZiAoKHBpLT5zaC0+Ym9hcmRmbGFnczIgJiBCRkwyX1RYUFdSQ1RSTF9FTikgJiYKLQkgICAgTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMikgJiYgKHBpLT5zaC0+c3JvbXJldiA+PSA0KSkKLQkJcGktPm5waHlfdHhwd3JjdHJsID0gUEhZX1RQQ19IV19PTjsKLQllbHNlIGlmICgocGktPnNoLT5zcm9tcmV2ID49IDQpCi0JCSAmJiAocGktPnNoLT5ib2FyZGZsYWdzMiAmIEJGTDJfNUdfUFdSR0FJTikpCi0JCXBpLT5waHlfNWdfcHdyZ2FpbiA9IHRydWU7Ci19Ci0KLXZvaWQgd2xjX3BoeV9pbml0X25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JdTE2IHZhbDsKLQl1MTYgY2xpcDFfdGhzWzJdOwotCXN0cnVjdCBucGh5X3R4Z2FpbnMgdGFyZ2V0X2dhaW47Ci0JdTggdHhfcHdyX2N0cmxfc3RhdGU7Ci0JYm9vbCBkb19ucGh5X2NhbCA9IGZhbHNlOwotCXVpbnQgY29yZTsKLQl1aW50IG9yaWdpZHgsIGludHJfdmFsOwotCWQxMXJlZ3NfdCAqcmVnczsKLQl1MzIgZDExX2Nsa19jdGxfc3Q7Ci0KLQljb3JlID0gMDsKLQotCWlmICghKHBpLT5tZWFzdXJlX2hvbGQgJiBQSFlfSE9MRF9GT1JfU0NBTikpIHsKLQkJcGktPm1lYXN1cmVfaG9sZCB8PSBQSFlfSE9MRF9GT1JfTk9UX0FTU09DOwotCX0KLQotCWlmICgoSVNOUEhZKHBpKSkgJiYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDUpKSAmJgotCSAgICAoKHBpLT5zaC0+Y2hpcHBrZyA9PSBCQ000NzE3X1BLR19JRCkgfHwKLQkgICAgIChwaS0+c2gtPmNoaXBwa2cgPT0gQkNNNDcxOF9QS0dfSUQpKSkgewotCQlpZiAoKHBpLT5zaC0+Ym9hcmRmbGFncyAmIEJGTF9FWFRMTkEpICYmCi0JCSAgICAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkpIHsKLQkJCWFpX2NvcmVyZWcocGktPnNoLT5zaWgsIFNJX0NDX0lEWCwKLQkJCQkgICBvZmZzZXRvZihjaGlwY3JlZ3NfdCwgY2hpcGNvbnRyb2wpLCAweDQwLAotCQkJCSAgIDB4NDApOwotCQl9Ci0JfQotCi0JaWYgKChwaS0+bnBoeV9nYmFuZF9zcHVyd2FyMl9lbikgJiYgQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSAmJgotCSAgICBDSFNQRUNfSVM0MChwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0KLQkJcmVncyA9IChkMTFyZWdzX3QgKikgYWlfc3dpdGNoX2NvcmUocGktPnNoLT5zaWgsIEQxMV9DT1JFX0lELAotCQkJCQkJICAgICZvcmlnaWR4LCAmaW50cl92YWwpOwotCQlkMTFfY2xrX2N0bF9zdCA9IFJfUkVHKCZyZWdzLT5jbGtfY3RsX3N0KTsKLQkJQU5EX1JFRygmcmVncy0+Y2xrX2N0bF9zdCwKLQkJCX4oQ0NTX0ZPUkNFSFQgfCBDQ1NfSFRBUkVRKSk7Ci0KLQkJV19SRUcoJnJlZ3MtPmNsa19jdGxfc3QsIGQxMV9jbGtfY3RsX3N0KTsKLQotCQlhaV9yZXN0b3JlX2NvcmUocGktPnNoLT5zaWgsIG9yaWdpZHgsIGludHJfdmFsKTsKLQl9Ci0KLQlwaS0+dXNlX2ludF90eF9pcWxvX2NhbF9ucGh5ID0KLQkgICAgKFBIWV9JUEEocGkpIHx8Ci0JICAgICAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykgfHwKLQkgICAgICAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNSkKLQkgICAgICAgJiYgcGktPnNoLT5ib2FyZGZsYWdzMiAmIEJGTDJfSU5URVJOREVUX1RYSVFDQUwpKSk7Ci0KLQlwaS0+aW50ZXJuYWxfdHhfaXFsb19jYWxfdGFwb2ZmX2ludHBhX25waHkgPSBmYWxzZTsKLQotCXBpLT5ucGh5X2RlYWZfY291bnQgPSAwOwotCi0Jd2xjX3BoeV90YmxfaW5pdF9ucGh5KHBpKTsKLQotCXBpLT5ucGh5X2Nyc21pbnB3cl9hZGp1c3RlZCA9IGZhbHNlOwotCXBpLT5ucGh5X25vaXNldmFyc19hZGp1c3RlZCA9IGZhbHNlOwotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4ZTcsIDApOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweGVjLCAwKTsKLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAweDM0MiwgMCk7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAweDM0MywgMCk7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAweDM0NiwgMCk7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAweDM0NywgMCk7Ci0JCX0KLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHhlNSwgMCk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4ZTYsIDApOwotCX0gZWxzZSB7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4ZWMsIDApOwotCX0KLQotCXdyaXRlX3BoeV9yZWcocGksIDB4OTEsIDApOwotCXdyaXRlX3BoeV9yZWcocGksIDB4OTIsIDApOwotCWlmIChOUkVWX0xUKHBpLT5wdWJwaS5waHlfcmV2LCA2KSkgewotCQl3cml0ZV9waHlfcmVnKHBpLCAweDkzLCAwKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg5NCwgMCk7Ci0JfQotCi0JYW5kX3BoeV9yZWcocGksIDB4YTEsIH4zKTsKLQotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCQl3cml0ZV9waHlfcmVnKHBpLCAweDhmLCAwKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHhhNSwgMCk7Ci0JfSBlbHNlIHsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHhhNSwgMCk7Ci0JfQotCi0JaWYgKE5SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDIpKQotCQltb2RfcGh5X3JlZyhwaSwgMHhkYywgMHgwMGZmLCAweDNiKTsKLQllbHNlIGlmIChOUkVWX0xUKHBpLT5wdWJwaS5waHlfcmV2LCAyKSkKLQkJbW9kX3BoeV9yZWcocGksIDB4ZGMsIDB4MDBmZiwgMHg0MCk7Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCAweDIwMywgMzIpOwotCXdyaXRlX3BoeV9yZWcocGksIDB4MjAxLCAzMik7Ci0KLQlpZiAocGktPnNoLT5ib2FyZGZsYWdzMiAmIEJGTDJfU0tXUktGRU1fQlJEKQotCQl3cml0ZV9waHlfcmVnKHBpLCAweDIwZCwgMTYwKTsKLQllbHNlCi0JCXdyaXRlX3BoeV9yZWcocGksIDB4MjBkLCAxODQpOwotCi0Jd3JpdGVfcGh5X3JlZyhwaSwgMHgxM2EsIDIwMCk7Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCAweDcwLCA4MCk7Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCAweDFmZiwgNDgpOwotCi0JaWYgKE5SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDgpKSB7Ci0JCXdsY19waHlfdXBkYXRlX21pbW9jb25maWdfbnBoeShwaSwgcGktPm5fcHJlYW1ibGVfb3ZlcnJpZGUpOwotCX0KLQotCXdsY19waHlfc3RmX2NoYWluX3VwZF9ucGh5KHBpKTsKLQotCWlmIChOUkVWX0xUKHBpLT5wdWJwaS5waHlfcmV2LCAyKSkgewotCQl3cml0ZV9waHlfcmVnKHBpLCAweDE4MCwgMHhhYTgpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDE4MSwgMHg5YTQpOwotCX0KLQotCWlmIChQSFlfSVBBKHBpKSkgewotCQlmb3IgKGNvcmUgPSAwOyBjb3JlIDwgcGktPnB1YnBpLnBoeV9jb3JlbnVtOyBjb3JlKyspIHsKLQotCQkJbW9kX3BoeV9yZWcocGksIChjb3JlID09IFBIWV9DT1JFXzApID8gMHgyOTcgOgotCQkJCSAgICAweDI5YiwgKDB4MSA8PCAwKSwgKDEpIDw8IDApOwotCi0JCQltb2RfcGh5X3JlZyhwaSwgKGNvcmUgPT0gUEhZX0NPUkVfMCkgPyAweDI5OCA6Ci0JCQkJICAgIDB4MjljLCAoMHgxZmYgPDwgNyksCi0JCQkJICAgIChwaS0+bnBoeV9wYXBkX2Vwc2lsb25fb2Zmc2V0W2NvcmVdKSA8PCA3KTsKLQotCQl9Ci0KLQkJd2xjX3BoeV9pcGFfc2V0X3R4X2RpZ2lfZmlsdHNfbnBoeShwaSk7Ci0JfSBlbHNlIHsKLQotCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNSkpIHsKLQkJCXdsY19waHlfZXh0cGFfc2V0X3R4X2RpZ2lfZmlsdHNfbnBoeShwaSk7Ci0JCX0KLQl9Ci0KLQl3bGNfcGh5X3dvcmthcm91bmRzX25waHkocGkpOwotCi0Jd2xhcGlfYm1hY19waHljbGtfZmdjKHBpLT5zaC0+cGh5c2hpbSwgT04pOwotCi0JdmFsID0gcmVhZF9waHlfcmVnKHBpLCAweDAxKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDAxLCB2YWwgfCBCQkNGR19SRVNFVENDQSk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHgwMSwgdmFsICYgKH5CQkNGR19SRVNFVENDQSkpOwotCXdsYXBpX2JtYWNfcGh5Y2xrX2ZnYyhwaS0+c2gtPnBoeXNoaW0sIE9GRik7Ci0KLQl3bGFwaV9ibWFjX21hY3BoeWNsa19zZXQocGktPnNoLT5waHlzaGltLCBPTik7Ci0KLQl3bGNfcGh5X3BhX292ZXJyaWRlX25waHkocGksIE9GRik7Ci0Jd2xjX3BoeV9mb3JjZV9yZnNlcV9ucGh5KHBpLCBOUEhZX1JGU0VRX1JYMlRYKTsKLQl3bGNfcGh5X2ZvcmNlX3Jmc2VxX25waHkocGksIE5QSFlfUkZTRVFfUkVTRVQyUlgpOwotCXdsY19waHlfcGFfb3ZlcnJpZGVfbnBoeShwaSwgT04pOwotCi0Jd2xjX3BoeV9jbGFzc2lmaWVyX25waHkocGksIDAsIDApOwotCXdsY19waHlfY2xpcF9kZXRfbnBoeShwaSwgMCwgY2xpcDFfdGhzKTsKLQotCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKQotCQl3bGNfcGh5X2JwaHlfaW5pdF9ucGh5KHBpKTsKLQotCXR4X3B3cl9jdHJsX3N0YXRlID0gcGktPm5waHlfdHhwd3JjdHJsOwotCXdsY19waHlfdHhwd3JjdHJsX2VuYWJsZV9ucGh5KHBpLCBQSFlfVFBDX0hXX09GRik7Ci0KLQl3bGNfcGh5X3R4cHdyX2ZpeHBvd2VyX25waHkocGkpOwotCi0Jd2xjX3BoeV90eHB3cmN0cmxfaWRsZV90c3NpX25waHkocGkpOwotCi0Jd2xjX3BoeV90eHB3cmN0cmxfcHdyX3NldHVwX25waHkocGkpOwotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0JCXUzMiAqdHhfcHdyY3RybF90YmwgPSBOVUxMOwotCQl1MTYgaWR4OwotCQlzMTYgcGdhX2duID0gMDsKLQkJczE2IHBhZF9nbiA9IDA7Ci0JCXMzMiByZnB3cl9vZmZzZXQgPSAwOwotCi0JCWlmIChQSFlfSVBBKHBpKSkgewotCQkJdHhfcHdyY3RybF90YmwgPSB3bGNfcGh5X2dldF9pcGFfZ2FpbnRibF9ucGh5KHBpKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChDSFNQRUNfSVM1RyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQkJaWYgKE5SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0JCQkJCXR4X3B3cmN0cmxfdGJsID0KLQkJCQkJICAgIG5waHlfdHBjXzVHSHpfdHhnYWluX3JldjM7Ci0JCQkJfSBlbHNlIGlmIChOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCA0KSkgewotCQkJCQl0eF9wd3JjdHJsX3RibCA9Ci0JCQkJCSAgICAocGktPnNyb21fZmVtNWcuZXh0cGFnYWluID09IDMpID8KLQkJCQkJICAgIG5waHlfdHBjXzVHSHpfdHhnYWluX0hpUHdyRVBBIDoKLQkJCQkJICAgIG5waHlfdHBjXzVHSHpfdHhnYWluX3JldjQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdHhfcHdyY3RybF90YmwgPQotCQkJCQkgICAgbnBoeV90cGNfNUdIel90eGdhaW5fcmV2NTsKLQkJCQl9Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCQkJCWlmIChwaS0+cHVicGkucmFkaW9yZXYgPT0gNSkgewotCQkJCQkJdHhfcHdyY3RybF90YmwgPQotCQkJCQkJICAgIG5waHlfdHBjX3R4Z2Fpbl9lcGFfMjA1N3JldjU7Ci0JCQkJCX0gZWxzZSBpZiAocGktPnB1YnBpLnJhZGlvcmV2ID09IDMpIHsKLQkJCQkJCXR4X3B3cmN0cmxfdGJsID0KLQkJCQkJCSAgICBucGh5X3RwY190eGdhaW5fZXBhXzIwNTdyZXYzOwotCQkJCQl9Ci0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNSkgJiYKLQkJCQkJICAgIChwaS0+c3JvbV9mZW0yZy5leHRwYWdhaW4gPT0gMykpIHsKLQkJCQkJCXR4X3B3cmN0cmxfdGJsID0KLQkJCQkJCSAgICBucGh5X3RwY190eGdhaW5fSGlQd3JFUEE7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0eF9wd3JjdHJsX3RibCA9Ci0JCQkJCQkgICAgbnBoeV90cGNfdHhnYWluX3JldjM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0NPUkUxVFhQV1JDVEwsIDEyOCwKLQkJCQkJIDE5MiwgMzIsIHR4X3B3cmN0cmxfdGJsKTsKLQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9DT1JFMlRYUFdSQ1RMLCAxMjgsCi0JCQkJCSAxOTIsIDMyLCB0eF9wd3JjdHJsX3RibCk7Ci0KLQkJcGktPm5waHlfZ212YWwgPSAodTE2KSAoKCp0eF9wd3JjdHJsX3RibCA+PiAxNikgJiAweDcwMDApOwotCi0JCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCi0JCQlmb3IgKGlkeCA9IDA7IGlkeCA8IDEyODsgaWR4KyspIHsKLQkJCQlwZ2FfZ24gPSAodHhfcHdyY3RybF90YmxbaWR4XSA+PiAyNCkgJiAweGY7Ci0JCQkJcGFkX2duID0gKHR4X3B3cmN0cmxfdGJsW2lkeF0gPj4gMTkpICYgMHgxZjsKLQotCQkJCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQkJCWlmICgocGktPnB1YnBpLnJhZGlvcmV2ID09IDMpIHx8Ci0JCQkJCSAgICAocGktPnB1YnBpLnJhZGlvcmV2ID09IDQpIHx8Ci0JCQkJCSAgICAocGktPnB1YnBpLnJhZGlvcmV2ID09IDYpKSB7Ci0JCQkJCQlyZnB3cl9vZmZzZXQgPSAoczE2KQotCQkJCQkJICAgIG5waHlfcGFwZF9wYWRnYWluX2RsdF8yZ18yMDU3cmV2M240Ci0JCQkJCQkgICAgW3BhZF9nbl07Ci0JCQkJCX0gZWxzZSBpZiAocGktPnB1YnBpLnJhZGlvcmV2ID09IDUpIHsKLQkJCQkJCXJmcHdyX29mZnNldCA9IChzMTYpCi0JCQkJCQkgICAgbnBoeV9wYXBkX3BhZGdhaW5fZGx0XzJnXzIwNTdyZXY1Ci0JCQkJCQkgICAgW3BhZF9nbl07Ci0JCQkJCX0gZWxzZSBpZiAoKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA3KQotCQkJCQkJICAgfHwgKHBpLT5wdWJwaS5yYWRpb3JldiA9PQotCQkJCQkJICAgICAgIDgpKSB7Ci0JCQkJCQlyZnB3cl9vZmZzZXQgPSAoczE2KQotCQkJCQkJICAgIG5waHlfcGFwZF9wYWRnYWluX2RsdF8yZ18yMDU3cmV2NwotCQkJCQkJICAgIFtwYWRfZ25dOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaWYgKChwaS0+cHVicGkucmFkaW9yZXYgPT0gMykgfHwKLQkJCQkJICAgIChwaS0+cHVicGkucmFkaW9yZXYgPT0gNCkgfHwKLQkJCQkJICAgIChwaS0+cHVicGkucmFkaW9yZXYgPT0gNikpIHsKLQkJCQkJCXJmcHdyX29mZnNldCA9IChzMTYpCi0JCQkJCQkgICAgbnBoeV9wYXBkX3BnYWdhaW5fZGx0XzVnXzIwNTcKLQkJCQkJCSAgICBbcGdhX2duXTsKLQkJCQkJfSBlbHNlIGlmICgocGktPnB1YnBpLnJhZGlvcmV2ID09IDcpCi0JCQkJCQkgICB8fCAocGktPnB1YnBpLnJhZGlvcmV2ID09Ci0JCQkJCQkgICAgICAgOCkpIHsKLQkJCQkJCXJmcHdyX29mZnNldCA9IChzMTYpCi0JCQkJCQkgICAgbnBoeV9wYXBkX3BnYWdhaW5fZGx0XzVnXzIwNTdyZXY3Ci0JCQkJCQkgICAgW3BnYV9nbl07Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLAotCQkJCQkJCSBOUEhZX1RCTF9JRF9DT1JFMVRYUFdSQ1RMLAotCQkJCQkJCSAxLCA1NzYgKyBpZHgsIDMyLAotCQkJCQkJCSAmcmZwd3Jfb2Zmc2V0KTsKLQkJCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksCi0JCQkJCQkJIE5QSFlfVEJMX0lEX0NPUkUyVFhQV1JDVEwsCi0JCQkJCQkJIDEsIDU3NiArIGlkeCwgMzIsCi0JCQkJCQkJICZyZnB3cl9vZmZzZXQpOwotCQkJfQotCQl9IGVsc2UgewotCi0JCQlmb3IgKGlkeCA9IDA7IGlkeCA8IDEyODsgaWR4KyspIHsKLQkJCQlwZ2FfZ24gPSAodHhfcHdyY3RybF90YmxbaWR4XSA+PiAyNCkgJiAweGY7Ci0JCQkJaWYgKENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCQkJcmZwd3Jfb2Zmc2V0ID0gKHMxNikKLQkJCQkJICAgIG5waHlfcGFwZF9wZ2FfZ2Fpbl9kZWx0YV9pcGFfMmcKLQkJCQkJICAgIFtwZ2FfZ25dOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJmcHdyX29mZnNldCA9IChzMTYpCi0JCQkJCSAgICBucGh5X3BhcGRfcGdhX2dhaW5fZGVsdGFfaXBhXzVnCi0JCQkJCSAgICBbcGdhX2duXTsKLQkJCQl9Ci0KLQkJCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksCi0JCQkJCQkJIE5QSFlfVEJMX0lEX0NPUkUxVFhQV1JDVEwsCi0JCQkJCQkJIDEsIDU3NiArIGlkeCwgMzIsCi0JCQkJCQkJICZyZnB3cl9vZmZzZXQpOwotCQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwKLQkJCQkJCQkgTlBIWV9UQkxfSURfQ09SRTJUWFBXUkNUTCwKLQkJCQkJCQkgMSwgNTc2ICsgaWR4LCAzMiwKLQkJCQkJCQkgJnJmcHdyX29mZnNldCk7Ci0JCQl9Ci0KLQkJfQotCX0gZWxzZSB7Ci0KLQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9DT1JFMVRYUFdSQ1RMLCAxMjgsCi0JCQkJCSAxOTIsIDMyLCBucGh5X3RwY190eGdhaW4pOwotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0NPUkUyVFhQV1JDVEwsIDEyOCwKLQkJCQkJIDE5MiwgMzIsIG5waHlfdHBjX3R4Z2Fpbik7Ci0JfQotCi0JaWYgKHBpLT5zaC0+cGh5cnhjaGFpbiAhPSAweDMpIHsKLQkJd2xjX3BoeV9yeGNvcmVfc2V0c3RhdGVfbnBoeSgoc3RydWN0IGJyY21zX3BoeV9wdWIgKikgcGksCi0JCQkJCSAgICAgcGktPnNoLT5waHlyeGNoYWluKTsKLQl9Ci0KLQlpZiAoUEhZX1BFUklDQUxfTVBIQVNFX1BFTkRJTkcocGkpKSB7Ci0JCXdsY19waHlfY2FsX3BlcmljYWxfbXBoYXNlX3Jlc3RhcnQocGkpOwotCX0KLQotCWlmICghTk9SQURJT19FTkFCKHBpLT5wdWJwaSkpIHsKLQkJYm9vbCBkb19yc3NpX2NhbCA9IGZhbHNlOwotCi0JCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCQkJZG9fcnNzaV9jYWwgPSAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkgPwotCQkJICAgIChwaS0+bnBoeV9yc3NpY2FsX2NoYW5zcGVjXzJHID09IDApIDoKLQkJCSAgICAocGktPm5waHlfcnNzaWNhbF9jaGFuc3BlY181RyA9PSAwKTsKLQotCQkJaWYgKGRvX3Jzc2lfY2FsKSB7Ci0JCQkJd2xjX3BoeV9yc3NpX2NhbF9ucGh5KHBpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJd2xjX3BoeV9yZXN0b3JlX3Jzc2ljYWxfbnBoeShwaSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl3bGNfcGh5X3Jzc2lfY2FsX25waHkocGkpOwotCQl9Ci0KLQkJaWYgKCFTQ0FOX1JNX0lOX1BST0dSRVNTKHBpKSkgewotCQkJZG9fbnBoeV9jYWwgPSAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkgPwotCQkJICAgIChwaS0+bnBoeV9pcWNhbF9jaGFuc3BlY18yRyA9PSAwKSA6Ci0JCQkgICAgKHBpLT5ucGh5X2lxY2FsX2NoYW5zcGVjXzVHID09IDApOwotCQl9Ci0KLQkJaWYgKCFwaS0+ZG9faW5pdGNhbCkKLQkJCWRvX25waHlfY2FsID0gZmFsc2U7Ci0KLQkJaWYgKGRvX25waHlfY2FsKSB7Ci0KLQkJCXRhcmdldF9nYWluID0gd2xjX3BoeV9nZXRfdHhfZ2Fpbl9ucGh5KHBpKTsKLQotCQkJaWYgKHBpLT5hbnRzZWxfdHlwZSA9PSBBTlRTRUxfMngzKQotCQkJCXdsY19waHlfYW50c2VsX2luaXQoKHN0cnVjdCBicmNtc19waHlfcHViICopIHBpLAotCQkJCQkJICAgIHRydWUpOwotCi0JCQlpZiAocGktPm5waHlfcGVyaWNhbCAhPSBQSFlfUEVSSUNBTF9NUEhBU0UpIHsKLQkJCQl3bGNfcGh5X3Jzc2lfY2FsX25waHkocGkpOwotCi0JCQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0JCQkJCXBpLT5ucGh5X2NhbF9vcmlnX3B3cl9pZHhbMF0gPQotCQkJCQkgICAgcGktPm5waHlfdHhwd3JpbmRleFtQSFlfQ09SRV8wXS4KLQkJCQkJICAgIGluZGV4X2ludGVybmFsOwotCQkJCQlwaS0+bnBoeV9jYWxfb3JpZ19wd3JfaWR4WzFdID0KLQkJCQkJICAgIHBpLT5ucGh5X3R4cHdyaW5kZXhbUEhZX0NPUkVfMV0uCi0JCQkJCSAgICBpbmRleF9pbnRlcm5hbDsKLQotCQkJCQl3bGNfcGh5X3ByZWNhbF90eGdhaW5fbnBoeShwaSk7Ci0JCQkJCXRhcmdldF9nYWluID0KLQkJCQkJICAgIHdsY19waHlfZ2V0X3R4X2dhaW5fbnBoeShwaSk7Ci0JCQkJfQotCi0JCQkJaWYgKHdsY19waHlfY2FsX3R4aXFsb19ucGh5Ci0JCQkJICAgIChwaSwgdGFyZ2V0X2dhaW4sIHRydWUsIGZhbHNlKSA9PSAwKSB7Ci0JCQkJCWlmICh3bGNfcGh5X2NhbF9yeGlxX25waHkKLQkJCQkJICAgIChwaSwgdGFyZ2V0X2dhaW4sIDIsCi0JCQkJCSAgICAgZmFsc2UpID09IDApIHsKLQkJCQkJCXdsY19waHlfc2F2ZWNhbF9ucGh5KHBpKTsKLQotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChwaS0+bXBoYXNlX2NhbF9waGFzZV9pZCA9PQotCQkJCSAgIE1QSEFTRV9DQUxfU1RBVEVfSURMRSkgewotCi0JCQkJd2xjX3BoeV9jYWxfcGVyaWNhbCgoc3RydWN0IGJyY21zX3BoeV9wdWIgKikgcGksCi0JCQkJCQkgICAgUEhZX1BFUklDQUxfUEhZSU5JVCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl3bGNfcGh5X3Jlc3RvcmVjYWxfbnBoeShwaSk7Ci0JCX0KLQl9Ci0KLQl3bGNfcGh5X3R4cHdyY3RybF9jb2VmZl9zZXR1cF9ucGh5KHBpKTsKLQotCXdsY19waHlfdHhwd3JjdHJsX2VuYWJsZV9ucGh5KHBpLCB0eF9wd3JfY3RybF9zdGF0ZSk7Ci0KLQl3bGNfcGh5X25waHlfdGtpcF9yaWZzX3dhcihwaSwgcGktPnNoLT5fcmlmc19waHkpOwotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpICYmIE5SRVZfTEUocGktPnB1YnBpLnBoeV9yZXYsIDYpKQotCi0JCXdyaXRlX3BoeV9yZWcocGksIDB4NzAsIDUwKTsKLQotCXdsY19waHlfdHhscGZid19ucGh5KHBpKTsKLQotCXdsY19waHlfc3B1cndhcl9ucGh5KHBpKTsKLQotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3VwZGF0ZV9taW1vY29uZmlnX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHMzMiBwcmVhbWJsZSkKLXsKLQlib29sIGdmX3ByZWFtYmxlID0gZmFsc2U7Ci0JdTE2IHZhbDsKLQotCWlmIChwcmVhbWJsZSA9PSBCUkNNU19OX1BSRUFNQkxFX0dGKQotCQlnZl9wcmVhbWJsZSA9IHRydWU7Ci0KLQl2YWwgPSByZWFkX3BoeV9yZWcocGksIDB4ZWQpOwotCi0JdmFsIHw9IFJYX0dGX01NX0FVVE87Ci0JdmFsICY9IH5SWF9HRl9PUl9NTTsKLQlpZiAoZ2ZfcHJlYW1ibGUpCi0JCXZhbCB8PSBSWF9HRl9PUl9NTTsKLQotCXdyaXRlX3BoeV9yZWcocGksIDB4ZWQsIHZhbCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsY19waHlfcmVzZXRjY2FfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQl1MTYgdmFsOwotCi0Jd2xhcGlfYm1hY19waHljbGtfZmdjKHBpLT5zaC0+cGh5c2hpbSwgT04pOwotCi0JdmFsID0gcmVhZF9waHlfcmVnKHBpLCAweDAxKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDAxLCB2YWwgfCBCQkNGR19SRVNFVENDQSk7Ci0JdWRlbGF5KDEpOwotCXdyaXRlX3BoeV9yZWcocGksIDB4MDEsIHZhbCAmICh+QkJDRkdfUkVTRVRDQ0EpKTsKLQotCXdsYXBpX2JtYWNfcGh5Y2xrX2ZnYyhwaS0+c2gtPnBoeXNoaW0sIE9GRik7Ci0KLQl3bGNfcGh5X2ZvcmNlX3Jmc2VxX25waHkocGksIE5QSFlfUkZTRVFfUkVTRVQyUlgpOwotfQotCi12b2lkIHdsY19waHlfcGFfb3ZlcnJpZGVfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgYm9vbCBlbikKLXsKLQl1MTYgcmZjdHJsaW50Y19vdmVycmlkZV92YWw7Ci0KLQlpZiAoIWVuKSB7Ci0KLQkJcGktPnJmY3RybEludGMxX3NhdmUgPSByZWFkX3BoeV9yZWcocGksIDB4OTEpOwotCQlwaS0+cmZjdHJsSW50YzJfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHg5Mik7Ci0KLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCQlyZmN0cmxpbnRjX292ZXJyaWRlX3ZhbCA9IDB4MTQ4MDsKLQkJfSBlbHNlIGlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCQkJcmZjdHJsaW50Y19vdmVycmlkZV92YWwgPQotCQkJICAgIENIU1BFQ19JUzVHKHBpLT5yYWRpb19jaGFuc3BlYykgPyAweDYwMCA6IDB4NDgwOwotCQl9IGVsc2UgewotCQkJcmZjdHJsaW50Y19vdmVycmlkZV92YWwgPQotCQkJICAgIENIU1BFQ19JUzVHKHBpLT5yYWRpb19jaGFuc3BlYykgPyAweDE4MCA6IDB4MTIwOwotCQl9Ci0KLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg5MSwgcmZjdHJsaW50Y19vdmVycmlkZV92YWwpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDkyLCByZmN0cmxpbnRjX292ZXJyaWRlX3ZhbCk7Ci0JfSBlbHNlIHsKLQotCQl3cml0ZV9waHlfcmVnKHBpLCAweDkxLCBwaS0+cmZjdHJsSW50YzFfc2F2ZSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4OTIsIHBpLT5yZmN0cmxJbnRjMl9zYXZlKTsKLQl9Ci0KLX0KLQotdm9pZCB3bGNfcGh5X3N0Zl9jaGFpbl91cGRfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQotCXUxNiB0eHJ4X2NoYWluID0KLQkgICAgKE5QSFlfUmZzZXFDb3JlQWN0dl9UeFJ4Q2hhaW4wIHwgTlBIWV9SZnNlcUNvcmVBY3R2X1R4UnhDaGFpbjEpOwotCWJvb2wgQ29yZUFjdHZfb3ZlcnJpZGUgPSBmYWxzZTsKLQotCWlmIChwaS0+bnBoeV90eHJ4X2NoYWluID09IEJSQ01TX05fVFhSWF9DSEFJTjApIHsKLQkJdHhyeF9jaGFpbiA9IE5QSFlfUmZzZXFDb3JlQWN0dl9UeFJ4Q2hhaW4wOwotCQlDb3JlQWN0dl9vdmVycmlkZSA9IHRydWU7Ci0KLQkJaWYgKE5SRVZfTEUocGktPnB1YnBpLnBoeV9yZXYsIDIpKSB7Ci0JCQlhbmRfcGh5X3JlZyhwaSwgMHhhMCwgfjB4MjApOwotCQl9Ci0JfSBlbHNlIGlmIChwaS0+bnBoeV90eHJ4X2NoYWluID09IEJSQ01TX05fVFhSWF9DSEFJTjEpIHsKLQkJdHhyeF9jaGFpbiA9IE5QSFlfUmZzZXFDb3JlQWN0dl9UeFJ4Q2hhaW4xOwotCQlDb3JlQWN0dl9vdmVycmlkZSA9IHRydWU7Ci0KLQkJaWYgKE5SRVZfTEUocGktPnB1YnBpLnBoeV9yZXYsIDIpKSB7Ci0JCQlvcl9waHlfcmVnKHBpLCAweGEwLCAweDIwKTsKLQkJfQotCX0KLQotCW1vZF9waHlfcmVnKHBpLCAweGEyLCAoKDB4ZiA8PCAwKSB8ICgweGYgPDwgNCkpLCB0eHJ4X2NoYWluKTsKLQotCWlmIChDb3JlQWN0dl9vdmVycmlkZSkgewotCi0JCXBpLT5ucGh5X3BlcmljYWwgPSBQSFlfUEVSSUNBTF9ESVNBQkxFOwotCQlvcl9waHlfcmVnKHBpLCAweGExLCBOUEhZX1Jmc2VxTW9kZV9Db3JlQWN0dl9vdmVycmlkZSk7Ci0JfSBlbHNlIHsKLQkJcGktPm5waHlfcGVyaWNhbCA9IFBIWV9QRVJJQ0FMX01QSEFTRTsKLQkJYW5kX3BoeV9yZWcocGksIDB4YTEsIH5OUEhZX1Jmc2VxTW9kZV9Db3JlQWN0dl9vdmVycmlkZSk7Ci0JfQotfQotCi12b2lkIHdsY19waHlfcnhjb3JlX3NldHN0YXRlX25waHkoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCwgdTggcnhjb3JlX2JpdG1hc2spCi17Ci0JdTE2IHJlZ3ZhbDsKLQl1MTYgdGJsX2J1ZlsxNl07Ci0JdWludCBpOwotCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcGloOwotCXUxNiB0Ymxfb3Bjb2RlOwotCWJvb2wgc3VzcGVuZDsKLQotCXBpLT5zaC0+cGh5cnhjaGFpbiA9IHJ4Y29yZV9iaXRtYXNrOwotCi0JaWYgKCFwaS0+c2gtPmNsaykKLQkJcmV0dXJuOwotCi0Jc3VzcGVuZCA9Ci0JICAgICgwID09IChSX1JFRygmcGktPnJlZ3MtPm1hY2NvbnRyb2wpICYgTUNUTF9FTl9NQUMpKTsKLQlpZiAoIXN1c3BlbmQpCi0JCXdsYXBpX3N1c3BlbmRfbWFjX2FuZF93YWl0KHBpLT5zaC0+cGh5c2hpbSk7Ci0KLQlpZiAocGktPnBoeWhhbmdfYXZvaWQpCi0JCXdsY19waHlfc3RheV9pbl9jYXJyaWVyc2VhcmNoX25waHkocGksIHRydWUpOwotCi0JcmVndmFsID0gcmVhZF9waHlfcmVnKHBpLCAweGEyKTsKLQlyZWd2YWwgJj0gfigweGYgPDwgNCk7Ci0JcmVndmFsIHw9ICgodTE2KSAocnhjb3JlX2JpdG1hc2sgJiAweDMpKSA8PCA0OwotCXdyaXRlX3BoeV9yZWcocGksIDB4YTIsIHJlZ3ZhbCk7Ci0KLQlpZiAoKHJ4Y29yZV9iaXRtYXNrICYgMHgzKSAhPSAweDMpIHsKLQotCQl3cml0ZV9waHlfcmVnKHBpLCAweDIwZSwgMSk7Ci0KLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0JCQlpZiAocGktPnJ4MnR4X2JpYXNlbnRyeSA9PSAtMSkgewotCQkJCXdsY19waHlfdGFibGVfcmVhZF9ucGh5KHBpLCBOUEhZX1RCTF9JRF9SRlNFUSwKLQkJCQkJCQlBUlJBWV9TSVpFKHRibF9idWYpLCA4MCwKLQkJCQkJCQkxNiwgdGJsX2J1Zik7Ci0KLQkJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YmxfYnVmKTsgaSsrKSB7Ci0JCQkJCWlmICh0YmxfYnVmW2ldID09Ci0JCQkJCSAgICBOUEhZX1JFVjNfUkZTRVFfQ01EX0NMUl9SWFJYX0JJQVMpIHsKLQotCQkJCQkJcGktPnJ4MnR4X2JpYXNlbnRyeSA9ICh1OCkgaTsKLQkJCQkJCXRibF9vcGNvZGUgPQotCQkJCQkJICAgIE5QSFlfUkVWM19SRlNFUV9DTURfTk9QOwotCQkJCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLAotCQkJCQkJCQkJIE5QSFlfVEJMX0lEX1JGU0VRLAotCQkJCQkJCQkJIDEsIGksCi0JCQkJCQkJCQkgMTYsCi0JCQkJCQkJCQkgJnRibF9vcGNvZGUpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZSBpZiAodGJsX2J1ZltpXSA9PQotCQkJCQkJICAgTlBIWV9SRVYzX1JGU0VRX0NNRF9FTkQpIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQotCQl3cml0ZV9waHlfcmVnKHBpLCAweDIwZSwgMzApOwotCi0JCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCQkJaWYgKHBpLT5yeDJ0eF9iaWFzZW50cnkgIT0gLTEpIHsKLQkJCQl0Ymxfb3Bjb2RlID0gTlBIWV9SRVYzX1JGU0VRX0NNRF9DTFJfUlhSWF9CSUFTOwotCQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfUkZTRVEsCi0JCQkJCQkJIDEsIHBpLT5yeDJ0eF9iaWFzZW50cnksCi0JCQkJCQkJIDE2LCAmdGJsX29wY29kZSk7Ci0JCQkJcGktPnJ4MnR4X2JpYXNlbnRyeSA9IC0xOwotCQkJfQotCQl9Ci0JfQotCi0Jd2xjX3BoeV9mb3JjZV9yZnNlcV9ucGh5KHBpLCBOUEhZX1JGU0VRX1JFU0VUMlJYKTsKLQotCWlmIChwaS0+cGh5aGFuZ19hdm9pZCkKLQkJd2xjX3BoeV9zdGF5X2luX2NhcnJpZXJzZWFyY2hfbnBoeShwaSwgZmFsc2UpOwotCi0JaWYgKCFzdXNwZW5kKQotCQl3bGFwaV9lbmFibGVfbWFjKHBpLT5zaC0+cGh5c2hpbSk7Ci19Ci0KLXU4IHdsY19waHlfcnhjb3JlX2dldHN0YXRlX25waHkoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCkKLXsKLQl1MTYgcmVndmFsLCByeGVuX2JpdHM7Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwaWg7Ci0KLQlyZWd2YWwgPSByZWFkX3BoeV9yZWcocGksIDB4YTIpOwotCXJ4ZW5fYml0cyA9IChyZWd2YWwgPj4gNCkgJiAweGY7Ci0KLQlyZXR1cm4gKHU4KSByeGVuX2JpdHM7Ci19Ci0KLWJvb2wgd2xjX3BoeV9uX3R4cG93ZXJfaXBhX2lzb24oc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JcmV0dXJuIFBIWV9JUEEocGkpOwotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3R4cHdyX2xpbWl0X3RvX3RibF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXU4IGlkeCwgaWR4MiwgaSwgZGVsdGFfaW5kOwotCi0JZm9yIChpZHggPSBUWFBfRklSU1RfQ0NLOyBpZHggPD0gVFhQX0xBU1RfQ0NLOyBpZHgrKykgewotCQlwaS0+YWRqX3B3cl90YmxfbnBoeVtpZHhdID0gcGktPnR4X3Bvd2VyX29mZnNldFtpZHhdOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJaWR4MiA9IDA7Ci0KLQkJZGVsdGFfaW5kID0gMDsKLQotCQlzd2l0Y2ggKGkpIHsKLQkJY2FzZSAwOgotCi0JCQlpZiAoQ0hTUEVDX0lTNDAocGktPnJhZGlvX2NoYW5zcGVjKQotCQkJICAgICYmIE5QSFlfSVNfU1JPTV9SRUlOVEVSUFJFVCkgewotCQkJCWlkeCA9IFRYUF9GSVJTVF9NQ1NfNDBfU0lTTzsKLQkJCX0gZWxzZSB7Ci0JCQkJaWR4ID0gKENIU1BFQ19JUzQwKHBpLT5yYWRpb19jaGFuc3BlYykpID8KLQkJCQkgICAgVFhQX0ZJUlNUX09GRE1fNDBfU0lTTyA6IFRYUF9GSVJTVF9PRkRNOwotCQkJCWRlbHRhX2luZCA9IDE7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIDE6Ci0KLQkJCWlkeCA9IChDSFNQRUNfSVM0MChwaS0+cmFkaW9fY2hhbnNwZWMpKSA/Ci0JCQkgICAgVFhQX0ZJUlNUX01DU180MF9DREQgOiBUWFBfRklSU1RfTUNTXzIwX0NERDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgMjoKLQotCQkJaWR4ID0gKENIU1BFQ19JUzQwKHBpLT5yYWRpb19jaGFuc3BlYykpID8KLQkJCSAgICBUWFBfRklSU1RfTUNTXzQwX1NUQkMgOiBUWFBfRklSU1RfTUNTXzIwX1NUQkM7Ci0JCQlicmVhazsKLQotCQljYXNlIDM6Ci0KLQkJCWlkeCA9IChDSFNQRUNfSVM0MChwaS0+cmFkaW9fY2hhbnNwZWMpKSA/Ci0JCQkgICAgVFhQX0ZJUlNUX01DU180MF9TRE0gOiBUWFBfRklSU1RfTUNTXzIwX1NETTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJcGktPmFkal9wd3JfdGJsX25waHlbNCArIDQgKiAoaWR4MisrKSArIGldID0KLQkJICAgIHBpLT50eF9wb3dlcl9vZmZzZXRbaWR4XTsKLQkJaWR4ID0gaWR4ICsgZGVsdGFfaW5kOwotCQlwaS0+YWRqX3B3cl90YmxfbnBoeVs0ICsgNCAqIChpZHgyKyspICsgaV0gPQotCQkgICAgcGktPnR4X3Bvd2VyX29mZnNldFtpZHhdOwotCQlwaS0+YWRqX3B3cl90YmxfbnBoeVs0ICsgNCAqIChpZHgyKyspICsgaV0gPQotCQkgICAgcGktPnR4X3Bvd2VyX29mZnNldFtpZHhdOwotCQlwaS0+YWRqX3B3cl90YmxfbnBoeVs0ICsgNCAqIChpZHgyKyspICsgaV0gPQotCQkgICAgcGktPnR4X3Bvd2VyX29mZnNldFtpZHgrK107Ci0KLQkJcGktPmFkal9wd3JfdGJsX25waHlbNCArIDQgKiAoaWR4MisrKSArIGldID0KLQkJICAgIHBpLT50eF9wb3dlcl9vZmZzZXRbaWR4KytdOwotCQlwaS0+YWRqX3B3cl90YmxfbnBoeVs0ICsgNCAqIChpZHgyKyspICsgaV0gPQotCQkgICAgcGktPnR4X3Bvd2VyX29mZnNldFtpZHhdOwotCQlwaS0+YWRqX3B3cl90YmxfbnBoeVs0ICsgNCAqIChpZHgyKyspICsgaV0gPQotCQkgICAgcGktPnR4X3Bvd2VyX29mZnNldFtpZHhdOwotCQlwaS0+YWRqX3B3cl90YmxfbnBoeVs0ICsgNCAqIChpZHgyKyspICsgaV0gPQotCQkgICAgcGktPnR4X3Bvd2VyX29mZnNldFtpZHgrK107Ci0KLQkJcGktPmFkal9wd3JfdGJsX25waHlbNCArIDQgKiAoaWR4MisrKSArIGldID0KLQkJICAgIHBpLT50eF9wb3dlcl9vZmZzZXRbaWR4KytdOwotCQlwaS0+YWRqX3B3cl90YmxfbnBoeVs0ICsgNCAqIChpZHgyKyspICsgaV0gPQotCQkgICAgcGktPnR4X3Bvd2VyX29mZnNldFtpZHhdOwotCQlwaS0+YWRqX3B3cl90YmxfbnBoeVs0ICsgNCAqIChpZHgyKyspICsgaV0gPQotCQkgICAgcGktPnR4X3Bvd2VyX29mZnNldFtpZHhdOwotCQlwaS0+YWRqX3B3cl90YmxfbnBoeVs0ICsgNCAqIChpZHgyKyspICsgaV0gPQotCQkgICAgcGktPnR4X3Bvd2VyX29mZnNldFtpZHgrK107Ci0KLQkJcGktPmFkal9wd3JfdGJsX25waHlbNCArIDQgKiAoaWR4MisrKSArIGldID0KLQkJICAgIHBpLT50eF9wb3dlcl9vZmZzZXRbaWR4XTsKLQkJcGktPmFkal9wd3JfdGJsX25waHlbNCArIDQgKiAoaWR4MisrKSArIGldID0KLQkJICAgIHBpLT50eF9wb3dlcl9vZmZzZXRbaWR4KytdOwotCQlwaS0+YWRqX3B3cl90YmxfbnBoeVs0ICsgNCAqIChpZHgyKyspICsgaV0gPQotCQkgICAgcGktPnR4X3Bvd2VyX29mZnNldFtpZHhdOwotCQlpZHggPSBpZHggKyAxIC0gZGVsdGFfaW5kOwotCQlwaS0+YWRqX3B3cl90YmxfbnBoeVs0ICsgNCAqIChpZHgyKyspICsgaV0gPQotCQkgICAgcGktPnR4X3Bvd2VyX29mZnNldFtpZHhdOwotCi0JCXBpLT5hZGpfcHdyX3RibF9ucGh5WzQgKyA0ICogKGlkeDIrKykgKyBpXSA9Ci0JCSAgICBwaS0+dHhfcG93ZXJfb2Zmc2V0W2lkeF07Ci0JCXBpLT5hZGpfcHdyX3RibF9ucGh5WzQgKyA0ICogKGlkeDIrKykgKyBpXSA9Ci0JCSAgICBwaS0+dHhfcG93ZXJfb2Zmc2V0W2lkeF07Ci0JCXBpLT5hZGpfcHdyX3RibF9ucGh5WzQgKyA0ICogKGlkeDIrKykgKyBpXSA9Ci0JCSAgICBwaS0+dHhfcG93ZXJfb2Zmc2V0W2lkeF07Ci0JCXBpLT5hZGpfcHdyX3RibF9ucGh5WzQgKyA0ICogKGlkeDIrKykgKyBpXSA9Ci0JCSAgICBwaS0+dHhfcG93ZXJfb2Zmc2V0W2lkeF07Ci0JfQotfQotCi12b2lkIHdsY19waHlfY2FsX2luaXRfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLX0KLQotc3RhdGljIHZvaWQKLXdsY19waHlfd2FyX2ZvcmNlX3Ryc3dfdG9fUl9jbGlwbG9fbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTggY29yZSkKLXsKLQlpZiAoY29yZSA9PSBQSFlfQ09SRV8wKSB7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MzgsIDB4NCk7Ci0JCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAweDM3LCAweDAwNjApOwotCQl9IGVsc2UgewotCQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgzNywgMHgxMDgwKTsKLQkJfQotCX0gZWxzZSBpZiAoY29yZSA9PSBQSFlfQ09SRV8xKSB7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MmFlLCAweDQpOwotCQlpZiAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgyYWQsIDB4MDA2MCk7Ci0JCX0gZWxzZSB7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAweDJhZCwgMHgxMDgwKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgd2xjX3BoeV93YXJfdHhjaGFpbl91cGRfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTggdHhjaGFpbikKLXsKLQl1OCB0eGNoYWluMCwgdHhjaGFpbjE7Ci0KLQl0eGNoYWluMCA9IHR4Y2hhaW4gJiAweDE7Ci0JdHhjaGFpbjEgPSAodHhjaGFpbiAmIDB4MikgPj4gMTsKLQlpZiAoIXR4Y2hhaW4wKSB7Ci0JCXdsY19waHlfd2FyX2ZvcmNlX3Ryc3dfdG9fUl9jbGlwbG9fbnBoeShwaSwgUEhZX0NPUkVfMCk7Ci0JfQotCi0JaWYgKCF0eGNoYWluMSkgewotCQl3bGNfcGh5X3dhcl9mb3JjZV90cnN3X3RvX1JfY2xpcGxvX25waHkocGksIFBIWV9DT1JFXzEpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgd2xjX3BoeV93b3JrYXJvdW5kc19ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXU4IHJmc2VxX3J4MnR4X2V2ZW50c1tdID0gewotCQlOUEhZX1JGU0VRX0NNRF9OT1AsCi0JCU5QSFlfUkZTRVFfQ01EX1JYR19GQlcsCi0JCU5QSFlfUkZTRVFfQ01EX1RSX1NXSVRDSCwKLQkJTlBIWV9SRlNFUV9DTURfQ0xSX0hJUV9ESVMsCi0JCU5QSFlfUkZTRVFfQ01EX1JYUERfVFhQRCwKLQkJTlBIWV9SRlNFUV9DTURfVFhfR0FJTiwKLQkJTlBIWV9SRlNFUV9DTURfRVhUX1BBCi0JfTsKLQl1OCByZnNlcV9yeDJ0eF9kbHlzW10gPSB7IDgsIDYsIDYsIDIsIDQsIDYwLCAxIH07Ci0JdTggcmZzZXFfdHgycnhfZXZlbnRzW10gPSB7Ci0JCU5QSFlfUkZTRVFfQ01EX05PUCwKLQkJTlBIWV9SRlNFUV9DTURfRVhUX1BBLAotCQlOUEhZX1JGU0VRX0NNRF9UWF9HQUlOLAotCQlOUEhZX1JGU0VRX0NNRF9SWFBEX1RYUEQsCi0JCU5QSFlfUkZTRVFfQ01EX1RSX1NXSVRDSCwKLQkJTlBIWV9SRlNFUV9DTURfUlhHX0ZCVywKLQkJTlBIWV9SRlNFUV9DTURfQ0xSX0hJUV9ESVMKLQl9OwotCXU4IHJmc2VxX3R4MnJ4X2RseXNbXSA9IHsgOCwgNiwgMiwgNCwgNCwgNiwgMSB9OwotCXU4IHJmc2VxX3R4MnJ4X2V2ZW50c19yZXYzW10gPSB7Ci0JCU5QSFlfUkVWM19SRlNFUV9DTURfRVhUX1BBLAotCQlOUEhZX1JFVjNfUkZTRVFfQ01EX0lOVF9QQV9QVSwKLQkJTlBIWV9SRVYzX1JGU0VRX0NNRF9UWF9HQUlOLAotCQlOUEhZX1JFVjNfUkZTRVFfQ01EX1JYUERfVFhQRCwKLQkJTlBIWV9SRVYzX1JGU0VRX0NNRF9UUl9TV0lUQ0gsCi0JCU5QSFlfUkVWM19SRlNFUV9DTURfUlhHX0ZCVywKLQkJTlBIWV9SRVYzX1JGU0VRX0NNRF9DTFJfSElRX0RJUywKLQkJTlBIWV9SRVYzX1JGU0VRX0NNRF9FTkQKLQl9OwotCXU4IHJmc2VxX3R4MnJ4X2RseXNfcmV2M1tdID0geyA4LCA0LCAyLCAyLCA0LCA0LCA2LCAxIH07Ci0JdTggcmZzZXFfcngydHhfZXZlbnRzX3JldjNbXSA9IHsKLQkJTlBIWV9SRVYzX1JGU0VRX0NNRF9OT1AsCi0JCU5QSFlfUkVWM19SRlNFUV9DTURfUlhHX0ZCVywKLQkJTlBIWV9SRVYzX1JGU0VRX0NNRF9UUl9TV0lUQ0gsCi0JCU5QSFlfUkVWM19SRlNFUV9DTURfQ0xSX0hJUV9ESVMsCi0JCU5QSFlfUkVWM19SRlNFUV9DTURfUlhQRF9UWFBELAotCQlOUEhZX1JFVjNfUkZTRVFfQ01EX1RYX0dBSU4sCi0JCU5QSFlfUkVWM19SRlNFUV9DTURfSU5UX1BBX1BVLAotCQlOUEhZX1JFVjNfUkZTRVFfQ01EX0VYVF9QQSwKLQkJTlBIWV9SRVYzX1JGU0VRX0NNRF9FTkQKLQl9OwotCXU4IHJmc2VxX3J4MnR4X2RseXNfcmV2M1tdID0geyA4LCA2LCA2LCA0LCA0LCAxOCwgNDIsIDEsIDEgfTsKLQotCXU4IHJmc2VxX3J4MnR4X2V2ZW50c19yZXYzX2lwYVtdID0gewotCQlOUEhZX1JFVjNfUkZTRVFfQ01EX05PUCwKLQkJTlBIWV9SRVYzX1JGU0VRX0NNRF9SWEdfRkJXLAotCQlOUEhZX1JFVjNfUkZTRVFfQ01EX1RSX1NXSVRDSCwKLQkJTlBIWV9SRVYzX1JGU0VRX0NNRF9DTFJfSElRX0RJUywKLQkJTlBIWV9SRVYzX1JGU0VRX0NNRF9SWFBEX1RYUEQsCi0JCU5QSFlfUkVWM19SRlNFUV9DTURfVFhfR0FJTiwKLQkJTlBIWV9SRVYzX1JGU0VRX0NNRF9DTFJfUlhSWF9CSUFTLAotCQlOUEhZX1JFVjNfUkZTRVFfQ01EX0lOVF9QQV9QVSwKLQkJTlBIWV9SRVYzX1JGU0VRX0NNRF9FTkQKLQl9OwotCXU4IHJmc2VxX3J4MnR4X2RseXNfcmV2M19pcGFbXSA9IHsgOCwgNiwgNiwgNCwgNCwgMTYsIDQzLCAxLCAxIH07Ci0JdTE2IHJmc2VxX3J4MnR4X2RhY2J1ZnB1X3JldjdbXSA9IHsgMHgxMGYsIDB4MTBmIH07Ci0KLQlzMTYgYWxwaGEwLCBhbHBoYTEsIGFscGhhMjsKLQlzMTYgYmV0YTAsIGJldGExLCBiZXRhMjsKLQl1MzIgbGVnX2RhdGFfd2VpZ2h0cywgaHRfZGF0YV93ZWlnaHRzLCBuc3MxX2RhdGFfd2VpZ2h0cywKLQkgICAgc3RiY19kYXRhX3dlaWdodHM7Ci0JdTggY2hhbl9mcmVxX3JhbmdlID0gMDsKLQl1MTYgZGFjX2NvbnRyb2wgPSAweDAwMDI7Ci0JdTE2IGF1eF9hZGNfdm1pZF9yZXY3X2NvcmUwW10gPSB7IDB4OGUsIDB4OTYsIDB4OTYsIDB4OTYgfTsKLQl1MTYgYXV4X2FkY192bWlkX3JldjdfY29yZTFbXSA9IHsgMHg4ZiwgMHg5ZiwgMHg5ZiwgMHg5NiB9OwotCXUxNiBhdXhfYWRjX3ZtaWRfcmV2NFtdID0geyAweGEyLCAweGI0LCAweGI0LCAweDg5IH07Ci0JdTE2IGF1eF9hZGNfdm1pZF9yZXYzW10gPSB7IDB4YTIsIDB4YjQsIDB4YjQsIDB4ODkgfTsKLQl1MTYgKmF1eF9hZGNfdm1pZDsKLQl1MTYgYXV4X2FkY19nYWluX3JldjdbXSA9IHsgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiB9OwotCXUxNiBhdXhfYWRjX2dhaW5fcmV2NFtdID0geyAweDAyLCAweDAyLCAweDAyLCAweDAwIH07Ci0JdTE2IGF1eF9hZGNfZ2Fpbl9yZXYzW10gPSB7IDB4MDIsIDB4MDIsIDB4MDIsIDB4MDAgfTsKLQl1MTYgKmF1eF9hZGNfZ2FpbjsKLQl1MTYgc2tfYWRjX3ZtaWRbXSA9IHsgMHhiNCwgMHhiNCwgMHhiNCwgMHgyNCB9OwotCXUxNiBza19hZGNfZ2FpbltdID0geyAweDAyLCAweDAyLCAweDAyLCAweDAyIH07Ci0JczMyIG1pbl9udmFyX3ZhbCA9IDB4MThkOwotCXMzMiBtaW5fbnZhcl9vZmZzZXRfNm1icHMgPSAyMDsKLQl1OCBwZGV0cmFuZ2U7Ci0JdTggdHJpc287Ci0JdTE2IHJlZ3ZhbDsKLQl1MTYgYWZlY3RybF9hZGNfY3RybDFfcmV2NyA9IDB4MjA7Ci0JdTE2IGFmZWN0cmxfYWRjX2N0cmwyX3JldjcgPSAweDA7Ci0JdTE2IHJmc2VxX3J4MnR4X2xwZl9oX2hwY19yZXY3ID0gMHg3NzsKLQl1MTYgcmZzZXFfdHgycnhfbHBmX2hfaHBjX3JldjcgPSAweDc3OwotCXUxNiByZnNlcV9wa3Rnbl9scGZfaF9ocGNfcmV2NyA9IDB4Nzc7Ci0JdTE2IHJmc2VxX2h0cGt0Z25fbHBmX2hwY19yZXY3W10gPSB7IDB4NzcsIDB4MTEsIDB4MTEgfTsKLQl1MTYgcmZzZXFfcGt0Z25fbHBmX2hwY19yZXY3W10gPSB7IDB4MTEsIDB4MTEgfTsKLQl1MTYgcmZzZXFfY2NrcGt0Z25fbHBmX2hwY19yZXY3W10gPSB7IDB4MTEsIDB4MTEgfTsKLQl1MTYgaXBhbHZsc2hpZnRfM3AzX3dhcl9lbiA9IDA7Ci0JdTE2IHJjY2FsX2JjYXBfdmFsLCByY2NhbF9zY2FwX3ZhbDsKLQl1MTYgcmNjYWxfdHgyMF8xMWJfYmNhcCA9IDA7Ci0JdTE2IHJjY2FsX3R4MjBfMTFiX3NjYXAgPSAwOwotCXUxNiByY2NhbF90eDIwXzExbl9iY2FwID0gMDsKLQl1MTYgcmNjYWxfdHgyMF8xMW5fc2NhcCA9IDA7Ci0JdTE2IHJjY2FsX3R4NDBfMTFuX2JjYXAgPSAwOwotCXUxNiByY2NhbF90eDQwXzExbl9zY2FwID0gMDsKLQl1MTYgcngydHhfbHBmX3JjX2x1dF90eDIwXzExYiA9IDA7Ci0JdTE2IHJ4MnR4X2xwZl9yY19sdXRfdHgyMF8xMW4gPSAwOwotCXUxNiByeDJ0eF9scGZfcmNfbHV0X3R4NDBfMTFuID0gMDsKLQl1MTYgdHhfbHBmX2J3X29mZG1fMjBtaHogPSAwOwotCXUxNiB0eF9scGZfYndfb2ZkbV80MG1oeiA9IDA7Ci0JdTE2IHR4X2xwZl9id18xMWIgPSAwOwotCXUxNiBpcGEyZ19tYWluYmlhcywgaXBhMmdfY2FzY29udiwgaXBhMmdfYmlhc2ZpbHQ7Ci0JdTE2IHR4Z21faWRhY19ibGVlZCA9IDA7Ci0JYm9vbCByY2NhbF9vdnJkID0gZmFsc2U7Ci0JdTE2IGZyZXE7Ci0JaW50IGNvcmVOdW07Ci0KLQlpZiAoQ0hTUEVDX0lTNUcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQl3bGNfcGh5X2NsYXNzaWZpZXJfbnBoeShwaSwgTlBIWV9DbGFzc2lmaWVyQ3RybF9jY2tfZW4sIDApOwotCX0gZWxzZSB7Ci0JCXdsY19waHlfY2xhc3NpZmllcl9ucGh5KHBpLCBOUEhZX0NsYXNzaWZpZXJDdHJsX2Nja19lbiwgMSk7Ci0JfQotCi0JaWYgKHBpLT5waHloYW5nX2F2b2lkKQotCQl3bGNfcGh5X3N0YXlfaW5fY2FycmllcnNlYXJjaF9ucGh5KHBpLCB0cnVlKTsKLQotCW9yX3BoeV9yZWcocGksIDB4YjEsIE5QSFlfSVFGbGlwX0FEQzEgfCBOUEhZX0lRRmxpcF9BREMyKTsKLQotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCi0JCWlmIChOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCQkJbW9kX3BoeV9yZWcocGksIDB4MjIxLCAoMHgxIDw8IDQpLCAoMSA8PCA0KSk7Ci0KLQkJCW1vZF9waHlfcmVnKHBpLCAweDE2MCwgKDB4N2YgPDwgMCksICgzMiA8PCAwKSk7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHgxNjAsICgweDdmIDw8IDgpLCAoMzkgPDwgOCkpOwotCQkJbW9kX3BoeV9yZWcocGksIDB4MTYxLCAoMHg3ZiA8PCAwKSwgKDQ2IDw8IDApKTsKLQkJCW1vZF9waHlfcmVnKHBpLCAweDE2MSwgKDB4N2YgPDwgOCksICg1MSA8PCA4KSk7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHgxNjIsICgweDdmIDw8IDApLCAoNTUgPDwgMCkpOwotCQkJbW9kX3BoeV9yZWcocGksIDB4MTYyLCAoMHg3ZiA8PCA4KSwgKDU4IDw8IDgpKTsKLQkJCW1vZF9waHlfcmVnKHBpLCAweDE2MywgKDB4N2YgPDwgMCksICg2MCA8PCAwKSk7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHgxNjMsICgweDdmIDw8IDgpLCAoNjIgPDwgOCkpOwotCQkJbW9kX3BoeV9yZWcocGksIDB4MTY0LCAoMHg3ZiA8PCAwKSwgKDYyIDw8IDApKTsKLQkJCW1vZF9waHlfcmVnKHBpLCAweDE2NCwgKDB4N2YgPDwgOCksICg2MyA8PCA4KSk7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHgxNjUsICgweDdmIDw8IDApLCAoNjMgPDwgMCkpOwotCQkJbW9kX3BoeV9yZWcocGksIDB4MTY1LCAoMHg3ZiA8PCA4KSwgKDY0IDw8IDgpKTsKLQkJCW1vZF9waHlfcmVnKHBpLCAweDE2NiwgKDB4N2YgPDwgMCksICg2NCA8PCAwKSk7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHgxNjYsICgweDdmIDw8IDgpLCAoNjQgPDwgOCkpOwotCQkJbW9kX3BoeV9yZWcocGksIDB4MTY3LCAoMHg3ZiA8PCAwKSwgKDY0IDw8IDApKTsKLQkJCW1vZF9waHlfcmVnKHBpLCAweDE2NywgKDB4N2YgPDwgOCksICg2NCA8PCA4KSk7Ci0JCX0KLQotCQlpZiAoTlJFVl9MRShwaS0+cHVicGkucGh5X3JldiwgOCkpIHsKLQkJCXdyaXRlX3BoeV9yZWcocGksIDB4MjNmLCAweDFiMCk7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAweDI0MCwgMHgxYjApOwotCQl9Ci0KLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDgpKSB7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHhiZCwgKDB4ZmYgPDwgMCksICgxMTQgPDwgMCkpOwotCQl9Ci0KLQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9BRkVDVFJMLCAxLCAweDAwLCAxNiwKLQkJCQkJICZkYWNfY29udHJvbCk7Ci0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQUZFQ1RSTCwgMSwgMHgxMCwgMTYsCi0JCQkJCSAmZGFjX2NvbnRyb2wpOwotCi0JCXdsY19waHlfdGFibGVfcmVhZF9ucGh5KHBpLCBOUEhZX1RCTF9JRF9DTVBNRVRSSUNEQVRBV0VJR0hUVEJMLAotCQkJCQkxLCAwLCAzMiwgJmxlZ19kYXRhX3dlaWdodHMpOwotCQlsZWdfZGF0YV93ZWlnaHRzID0gbGVnX2RhdGFfd2VpZ2h0cyAmIDB4ZmZmZmZmOwotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0NNUE1FVFJJQ0RBVEFXRUlHSFRUQkwsCi0JCQkJCSAxLCAwLCAzMiwgJmxlZ19kYXRhX3dlaWdodHMpOwotCi0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfUkZTRVEsCi0JCQkJCSAyLCAweDE1ZSwgMTYsCi0JCQkJCSByZnNlcV9yeDJ0eF9kYWNidWZwdV9yZXY3KTsKLQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9SRlNFUSwgMiwgMHgxNmUsIDE2LAotCQkJCQkgcmZzZXFfcngydHhfZGFjYnVmcHVfcmV2Nyk7Ci0KLQkJaWYgKFBIWV9JUEEocGkpKSB7Ci0JCQl3bGNfcGh5X3NldF9yZnNlcV9ucGh5KHBpLCBOUEhZX1JGU0VRX1JYMlRYLAotCQkJCQkgICAgICAgcmZzZXFfcngydHhfZXZlbnRzX3JldjNfaXBhLAotCQkJCQkgICAgICAgcmZzZXFfcngydHhfZGx5c19yZXYzX2lwYSwKLQkJCQkJICAgICAgIHNpemVvZgotCQkJCQkgICAgICAgKHJmc2VxX3J4MnR4X2V2ZW50c19yZXYzX2lwYSkgLwotCQkJCQkgICAgICAgc2l6ZW9mCi0JCQkJCSAgICAgICAocmZzZXFfcngydHhfZXZlbnRzX3JldjNfaXBhCi0JCQkJCQlbMF0pKTsKLQkJfQotCi0JCW1vZF9waHlfcmVnKHBpLCAweDI5OSwgKDB4MyA8PCAxNCksICgweDEgPDwgMTQpKTsKLQkJbW9kX3BoeV9yZWcocGksIDB4MjlkLCAoMHgzIDw8IDE0KSwgKDB4MSA8PCAxNCkpOwotCi0JCXR4X2xwZl9id19vZmRtXzIwbWh6ID0gd2xjX3BoeV9yZWFkX2xwZl9id19jdGxfbnBoeShwaSwgMHgxNTQpOwotCQl0eF9scGZfYndfb2ZkbV80MG1oeiA9IHdsY19waHlfcmVhZF9scGZfYndfY3RsX25waHkocGksIDB4MTU5KTsKLQkJdHhfbHBmX2J3XzExYiA9IHdsY19waHlfcmVhZF9scGZfYndfY3RsX25waHkocGksIDB4MTUyKTsKLQotCQlpZiAoUEhZX0lQQShwaSkpIHsKLQotCQkJaWYgKCgocGktPnB1YnBpLnJhZGlvcmV2ID09IDUpCi0JCQkgICAgICYmIChDSFNQRUNfSVM0MChwaS0+cmFkaW9fY2hhbnNwZWMpID09IDEpKQotCQkJICAgIHx8IChwaS0+cHVicGkucmFkaW9yZXYgPT0gNykKLQkJCSAgICB8fCAocGktPnB1YnBpLnJhZGlvcmV2ID09IDgpKSB7Ci0KLQkJCQlyY2NhbF9iY2FwX3ZhbCA9Ci0JCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkJICAgUkFESU9fMjA1N19SQ0NBTF9CQ0FQX1ZBTCk7Ci0JCQkJcmNjYWxfc2NhcF92YWwgPQotCQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwKLQkJCQkJCSAgIFJBRElPXzIwNTdfUkNDQUxfU0NBUF9WQUwpOwotCi0JCQkJcmNjYWxfdHgyMF8xMWJfYmNhcCA9IHJjY2FsX2JjYXBfdmFsOwotCQkJCXJjY2FsX3R4MjBfMTFiX3NjYXAgPSByY2NhbF9zY2FwX3ZhbDsKLQotCQkJCWlmICgocGktPnB1YnBpLnJhZGlvcmV2ID09IDUpICYmCi0JCQkJICAgIChDSFNQRUNfSVM0MChwaS0+cmFkaW9fY2hhbnNwZWMpID09IDEpKSB7Ci0KLQkJCQkJcmNjYWxfdHgyMF8xMW5fYmNhcCA9IHJjY2FsX2JjYXBfdmFsOwotCQkJCQlyY2NhbF90eDIwXzExbl9zY2FwID0gcmNjYWxfc2NhcF92YWw7Ci0JCQkJCXJjY2FsX3R4NDBfMTFuX2JjYXAgPSAweGM7Ci0JCQkJCXJjY2FsX3R4NDBfMTFuX3NjYXAgPSAweGM7Ci0KLQkJCQkJcmNjYWxfb3ZyZCA9IHRydWU7Ci0KLQkJCQl9IGVsc2UgaWYgKChwaS0+cHVicGkucmFkaW9yZXYgPT0gNykKLQkJCQkJICAgfHwgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA4KSkgewotCi0JCQkJCXR4X2xwZl9id19vZmRtXzIwbWh6ID0gNDsKLQkJCQkJdHhfbHBmX2J3XzExYiA9IDE7Ci0KLQkJCQkJaWYgKENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCQkJCXJjY2FsX3R4MjBfMTFuX2JjYXAgPSAweGM7Ci0JCQkJCQlyY2NhbF90eDIwXzExbl9zY2FwID0gMHhjOwotCQkJCQkJcmNjYWxfdHg0MF8xMW5fYmNhcCA9IDB4YTsKLQkJCQkJCXJjY2FsX3R4NDBfMTFuX3NjYXAgPSAweGE7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyY2NhbF90eDIwXzExbl9iY2FwID0gMHgxNDsKLQkJCQkJCXJjY2FsX3R4MjBfMTFuX3NjYXAgPSAweDE0OwotCQkJCQkJcmNjYWxfdHg0MF8xMW5fYmNhcCA9IDB4ZjsKLQkJCQkJCXJjY2FsX3R4NDBfMTFuX3NjYXAgPSAweGY7Ci0JCQkJCX0KLQotCQkJCQlyY2NhbF9vdnJkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSBlbHNlIHsKLQotCQkJaWYgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA1KSB7Ci0KLQkJCQl0eF9scGZfYndfb2ZkbV8yMG1oeiA9IDE7Ci0JCQkJdHhfbHBmX2J3X29mZG1fNDBtaHogPSAzOwotCi0JCQkJcmNjYWxfYmNhcF92YWwgPQotCQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwKLQkJCQkJCSAgIFJBRElPXzIwNTdfUkNDQUxfQkNBUF9WQUwpOwotCQkJCXJjY2FsX3NjYXBfdmFsID0KLQkJCQkgICAgcmVhZF9yYWRpb19yZWcocGksCi0JCQkJCQkgICBSQURJT18yMDU3X1JDQ0FMX1NDQVBfVkFMKTsKLQotCQkJCXJjY2FsX3R4MjBfMTFiX2JjYXAgPSByY2NhbF9iY2FwX3ZhbDsKLQkJCQlyY2NhbF90eDIwXzExYl9zY2FwID0gcmNjYWxfc2NhcF92YWw7Ci0KLQkJCQlyY2NhbF90eDIwXzExbl9iY2FwID0gMHgxMzsKLQkJCQlyY2NhbF90eDIwXzExbl9zY2FwID0gMHgxMTsKLQkJCQlyY2NhbF90eDQwXzExbl9iY2FwID0gMHgxMzsKLQkJCQlyY2NhbF90eDQwXzExbl9zY2FwID0gMHgxMTsKLQotCQkJCXJjY2FsX292cmQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJjY2FsX292cmQpIHsKLQotCQkJcngydHhfbHBmX3JjX2x1dF90eDIwXzExYiA9IChyY2NhbF90eDIwXzExYl9iY2FwIDw8IDgpIHwKLQkJCSAgICAocmNjYWxfdHgyMF8xMWJfc2NhcCA8PCAzKSB8IHR4X2xwZl9id18xMWI7Ci0JCQlyeDJ0eF9scGZfcmNfbHV0X3R4MjBfMTFuID0gKHJjY2FsX3R4MjBfMTFuX2JjYXAgPDwgOCkgfAotCQkJICAgIChyY2NhbF90eDIwXzExbl9zY2FwIDw8IDMpIHwgdHhfbHBmX2J3X29mZG1fMjBtaHo7Ci0JCQlyeDJ0eF9scGZfcmNfbHV0X3R4NDBfMTFuID0gKHJjY2FsX3R4NDBfMTFuX2JjYXAgPDwgOCkgfAotCQkJICAgIChyY2NhbF90eDQwXzExbl9zY2FwIDw8IDMpIHwgdHhfbHBmX2J3X29mZG1fNDBtaHo7Ci0KLQkJCWZvciAoY29yZU51bSA9IDA7IGNvcmVOdW0gPD0gMTsgY29yZU51bSsrKSB7Ci0JCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9SRlNFUSwKLQkJCQkJCQkgMSwKLQkJCQkJCQkgMHgxNTIgKyBjb3JlTnVtICogMHgxMCwKLQkJCQkJCQkgMTYsCi0JCQkJCQkJICZyeDJ0eF9scGZfcmNfbHV0X3R4MjBfMTFiKTsKLQkJCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX1JGU0VRLAotCQkJCQkJCSAxLAotCQkJCQkJCSAweDE1MyArIGNvcmVOdW0gKiAweDEwLAotCQkJCQkJCSAxNiwKLQkJCQkJCQkgJnJ4MnR4X2xwZl9yY19sdXRfdHgyMF8xMW4pOwotCQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfUkZTRVEsCi0JCQkJCQkJIDEsCi0JCQkJCQkJIDB4MTU0ICsgY29yZU51bSAqIDB4MTAsCi0JCQkJCQkJIDE2LAotCQkJCQkJCSAmcngydHhfbHBmX3JjX2x1dF90eDIwXzExbik7Ci0JCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9SRlNFUSwKLQkJCQkJCQkgMSwKLQkJCQkJCQkgMHgxNTUgKyBjb3JlTnVtICogMHgxMCwKLQkJCQkJCQkgMTYsCi0JCQkJCQkJICZyeDJ0eF9scGZfcmNfbHV0X3R4NDBfMTFuKTsKLQkJCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX1JGU0VRLAotCQkJCQkJCSAxLAotCQkJCQkJCSAweDE1NiArIGNvcmVOdW0gKiAweDEwLAotCQkJCQkJCSAxNiwKLQkJCQkJCQkgJnJ4MnR4X2xwZl9yY19sdXRfdHg0MF8xMW4pOwotCQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfUkZTRVEsCi0JCQkJCQkJIDEsCi0JCQkJCQkJIDB4MTU3ICsgY29yZU51bSAqIDB4MTAsCi0JCQkJCQkJIDE2LAotCQkJCQkJCSAmcngydHhfbHBmX3JjX2x1dF90eDQwXzExbik7Ci0JCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9SRlNFUSwKLQkJCQkJCQkgMSwKLQkJCQkJCQkgMHgxNTggKyBjb3JlTnVtICogMHgxMCwKLQkJCQkJCQkgMTYsCi0JCQkJCQkJICZyeDJ0eF9scGZfcmNfbHV0X3R4NDBfMTFuKTsKLQkJCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX1JGU0VRLAotCQkJCQkJCSAxLAotCQkJCQkJCSAweDE1OSArIGNvcmVOdW0gKiAweDEwLAotCQkJCQkJCSAxNiwKLQkJCQkJCQkgJnJ4MnR4X2xwZl9yY19sdXRfdHg0MF8xMW4pOwotCQkJfQotCi0JCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksICgweDEgPDwgNCksCi0JCQkJCQkJICAxLCAweDMsIDAsCi0JCQkJCQkJICBOUEhZX1JFVjdfUkZDVFJMT1ZFUlJJREVfSUQyKTsKLQkJfQotCi0JCWlmICghTk9SQURJT19FTkFCKHBpLT5wdWJwaSkpIHsKLQkJCXdyaXRlX3BoeV9yZWcocGksIDB4MzJmLCAweDMpOwotCQl9Ci0KLQkJaWYgKChwaS0+cHVicGkucmFkaW9yZXYgPT0gNCkgfHwgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA2KSkgewotCQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDIpLAotCQkJCQkJCSAgMSwgMHgzLCAwLAotCQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMCk7Ci0JCX0KLQotCQlpZiAoKHBpLT5wdWJwaS5yYWRpb3JldiA9PSAzKSB8fCAocGktPnB1YnBpLnJhZGlvcmV2ID09IDQpIHx8Ci0JCSAgICAocGktPnB1YnBpLnJhZGlvcmV2ID09IDYpKSB7Ci0JCQlpZiAoKHBpLT5zaC0+c3JvbXJldiA+PSA4KQotCQkJICAgICYmIChwaS0+c2gtPmJvYXJkZmxhZ3MyICYgQkZMMl9JUEFMVkxTSElGVF8zUDMpKQotCQkJCWlwYWx2bHNoaWZ0XzNwM193YXJfZW4gPSAxOwotCi0JCQlpZiAoaXBhbHZsc2hpZnRfM3AzX3dhcl9lbikgewotCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19HUEFJT19DT05GSUcsCi0JCQkJCQkweDUpOwotCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19HUEFJT19TRUwxLAotCQkJCQkJMHgzMCk7Ci0JCQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X0dQQUlPX1NFTDAsIDB4MCk7Ci0JCQkJb3JfcmFkaW9fcmVnKHBpLAotCQkJCQkgICAgIFJBRElPXzIwNTdfUlhUWEJJQVNfQ09ORklHX0NPUkUwLAotCQkJCQkgICAgIDB4MSk7Ci0JCQkJb3JfcmFkaW9fcmVnKHBpLAotCQkJCQkgICAgIFJBRElPXzIwNTdfUlhUWEJJQVNfQ09ORklHX0NPUkUxLAotCQkJCQkgICAgIDB4MSk7Ci0KLQkJCQlpcGEyZ19tYWluYmlhcyA9IDB4MWY7Ci0KLQkJCQlpcGEyZ19jYXNjb252ID0gMHg2ZjsKLQotCQkJCWlwYTJnX2JpYXNmaWx0ID0gMHhhYTsKLQkJCX0gZWxzZSB7Ci0KLQkJCQlpcGEyZ19tYWluYmlhcyA9IDB4MmI7Ci0KLQkJCQlpcGEyZ19jYXNjb252ID0gMHg3ZjsKLQotCQkJCWlwYTJnX2JpYXNmaWx0ID0gMHhlZTsKLQkJCX0KLQotCQkJaWYgKENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCQlmb3IgKGNvcmVOdW0gPSAwOyBjb3JlTnVtIDw9IDE7IGNvcmVOdW0rKykgewotCQkJCQlXUklURV9SQURJT19SRUc0KHBpLCBSQURJT18yMDU3LCBDT1JFLAotCQkJCQkJCSBjb3JlTnVtLCBJUEEyR19JTUFJTiwKLQkJCQkJCQkgaXBhMmdfbWFpbmJpYXMpOwotCQkJCQlXUklURV9SQURJT19SRUc0KHBpLCBSQURJT18yMDU3LCBDT1JFLAotCQkJCQkJCSBjb3JlTnVtLCBJUEEyR19DQVNDT05WLAotCQkJCQkJCSBpcGEyZ19jYXNjb252KTsKLQkJCQkJV1JJVEVfUkFESU9fUkVHNChwaSwgUkFESU9fMjA1NywgQ09SRSwKLQkJCQkJCQkgY29yZU51bSwKLQkJCQkJCQkgSVBBMkdfQklBU19GSUxURVIsCi0JCQkJCQkJIGlwYTJnX2JpYXNmaWx0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoUEhZX0lQQShwaSkpIHsKLQkJCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQkJaWYgKChwaS0+cHVicGkucmFkaW9yZXYgPT0gMykKLQkJCQkgICAgfHwgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA0KQotCQkJCSAgICB8fCAocGktPnB1YnBpLnJhZGlvcmV2ID09IDYpKSB7Ci0KLQkJCQkJdHhnbV9pZGFjX2JsZWVkID0gMHg3ZjsKLQkJCQl9Ci0KLQkJCQlmb3IgKGNvcmVOdW0gPSAwOyBjb3JlTnVtIDw9IDE7IGNvcmVOdW0rKykgewotCQkJCQlpZiAodHhnbV9pZGFjX2JsZWVkICE9IDApCi0JCQkJCQlXUklURV9SQURJT19SRUc0KHBpLCBSQURJT18yMDU3LAotCQkJCQkJCQkgQ09SRSwgY29yZU51bSwKLQkJCQkJCQkJIFRYR01fSURBQ19CTEVFRCwKLQkJCQkJCQkJIHR4Z21faWRhY19ibGVlZCk7Ci0JCQkJfQotCi0JCQkJaWYgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA1KSB7Ci0KLQkJCQkJZm9yIChjb3JlTnVtID0gMDsgY29yZU51bSA8PSAxOwotCQkJCQkgICAgIGNvcmVOdW0rKykgewotCQkJCQkJV1JJVEVfUkFESU9fUkVHNChwaSwgUkFESU9fMjA1NywKLQkJCQkJCQkJIENPUkUsIGNvcmVOdW0sCi0JCQkJCQkJCSBJUEEyR19DQVNDT05WLAotCQkJCQkJCQkgMHgxMyk7Ci0JCQkJCQlXUklURV9SQURJT19SRUc0KHBpLCBSQURJT18yMDU3LAotCQkJCQkJCQkgQ09SRSwgY29yZU51bSwKLQkJCQkJCQkJIElQQTJHX0lNQUlOLAotCQkJCQkJCQkgMHgxZik7Ci0JCQkJCQlXUklURV9SQURJT19SRUc0KHBpLCBSQURJT18yMDU3LAotCQkJCQkJCQkgQ09SRSwgY29yZU51bSwKLQkJCQkJCQkJIElQQTJHX0JJQVNfRklMVEVSLAotCQkJCQkJCQkgMHhlZSk7Ci0JCQkJCQlXUklURV9SQURJT19SRUc0KHBpLCBSQURJT18yMDU3LAotCQkJCQkJCQkgQ09SRSwgY29yZU51bSwKLQkJCQkJCQkJIFBBRDJHX0lEQUNTLAotCQkJCQkJCQkgMHg4YSk7Ci0JCQkJCQlXUklURV9SQURJT19SRUc0KHBpLCBSQURJT18yMDU3LAotCQkJCQkJCQkgQ09SRSwgY29yZU51bSwKLQkJCQkJCQkJIFBBRF9CSUFTX0ZJTFRFUl9CV1MsCi0JCQkJCQkJCSAweDNlKTsKLQkJCQkJfQotCi0JCQkJfSBlbHNlIGlmICgocGktPnB1YnBpLnJhZGlvcmV2ID09IDcpCi0JCQkJCSAgIHx8IChwaS0+cHVicGkucmFkaW9yZXYgPT0gOCkpIHsKLQotCQkJCQlpZiAoQ0hTUEVDX0lTNDAocGktPnJhZGlvX2NoYW5zcGVjKSA9PQotCQkJCQkgICAgMCkgewotCQkJCQkJV1JJVEVfUkFESU9fUkVHNChwaSwgUkFESU9fMjA1NywKLQkJCQkJCQkJIENPUkUsIDAsCi0JCQkJCQkJCSBJUEEyR19JTUFJTiwKLQkJCQkJCQkJIDB4MTQpOwotCQkJCQkJV1JJVEVfUkFESU9fUkVHNChwaSwgUkFESU9fMjA1NywKLQkJCQkJCQkJIENPUkUsIDEsCi0JCQkJCQkJCSBJUEEyR19JTUFJTiwKLQkJCQkJCQkJIDB4MTIpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJV1JJVEVfUkFESU9fUkVHNChwaSwgUkFESU9fMjA1NywKLQkJCQkJCQkJIENPUkUsIDAsCi0JCQkJCQkJCSBJUEEyR19JTUFJTiwKLQkJCQkJCQkJIDB4MTYpOwotCQkJCQkJV1JJVEVfUkFESU9fUkVHNChwaSwgUkFESU9fMjA1NywKLQkJCQkJCQkJIENPUkUsIDEsCi0JCQkJCQkJCSBJUEEyR19JTUFJTiwKLQkJCQkJCQkJIDB4MTYpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9IGVsc2UgewotCQkJCWZyZXEgPQotCQkJCSAgICBDSEFONUdfRlJFUShDSFNQRUNfQ0hBTk5FTAotCQkJCQkJKHBpLT5yYWRpb19jaGFuc3BlYykpOwotCQkJCWlmICgoKGZyZXEgPj0gNTE4MCkgJiYgKGZyZXEgPD0gNTIzMCkpCi0JCQkJICAgIHx8ICgoZnJlcSA+PSA1NzQ1KSAmJiAoZnJlcSA8PSA1ODA1KSkpIHsKLQkJCQkJV1JJVEVfUkFESU9fUkVHNChwaSwgUkFESU9fMjA1NywgQ09SRSwKLQkJCQkJCQkgMCwgSVBBNUdfQklBU19GSUxURVIsCi0JCQkJCQkJIDB4ZmYpOwotCQkJCQlXUklURV9SQURJT19SRUc0KHBpLCBSQURJT18yMDU3LCBDT1JFLAotCQkJCQkJCSAxLCBJUEE1R19CSUFTX0ZJTFRFUiwKLQkJCQkJCQkgMHhmZik7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCi0JCQlpZiAocGktPnB1YnBpLnJhZGlvcmV2ICE9IDUpIHsKLQkJCQlmb3IgKGNvcmVOdW0gPSAwOyBjb3JlTnVtIDw9IDE7IGNvcmVOdW0rKykgewotCQkJCQlXUklURV9SQURJT19SRUc0KHBpLCBSQURJT18yMDU3LCBDT1JFLAotCQkJCQkJCSBjb3JlTnVtLAotCQkJCQkJCSBUWE1JWDJHX1RVTkVfQk9PU1RfUFUsCi0JCQkJCQkJIDB4NjEpOwotCQkJCQlXUklURV9SQURJT19SRUc0KHBpLCBSQURJT18yMDU3LCBDT1JFLAotCQkJCQkJCSBjb3JlTnVtLAotCQkJCQkJCSBUWEdNX0lEQUNfQkxFRUQsIDB4NzApOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChwaS0+cHVicGkucmFkaW9yZXYgPT0gNCkgewotCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9BRkVDVFJMLCAxLAotCQkJCQkJIDB4MDUsIDE2LAotCQkJCQkJICZhZmVjdHJsX2FkY19jdHJsMV9yZXY3KTsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQUZFQ1RSTCwgMSwKLQkJCQkJCSAweDE1LCAxNiwKLQkJCQkJCSAmYWZlY3RybF9hZGNfY3RybDFfcmV2Nyk7Ci0KLQkJCWZvciAoY29yZU51bSA9IDA7IGNvcmVOdW0gPD0gMTsgY29yZU51bSsrKSB7Ci0JCQkJV1JJVEVfUkFESU9fUkVHNChwaSwgUkFESU9fMjA1NywgQ09SRSwgY29yZU51bSwKLQkJCQkJCSBBRkVfVkNNX0NBTF9NQVNURVIsIDB4MCk7Ci0JCQkJV1JJVEVfUkFESU9fUkVHNChwaSwgUkFESU9fMjA1NywgQ09SRSwgY29yZU51bSwKLQkJCQkJCSBBRkVfU0VUX1ZDTV9JLCAweDNmKTsKLQkJCQlXUklURV9SQURJT19SRUc0KHBpLCBSQURJT18yMDU3LCBDT1JFLCBjb3JlTnVtLAotCQkJCQkJIEFGRV9TRVRfVkNNX1EsIDB4M2YpOwotCQkJfQotCQl9IGVsc2UgewotCQkJbW9kX3BoeV9yZWcocGksIDB4YTYsICgweDEgPDwgMiksICgweDEgPDwgMikpOwotCQkJbW9kX3BoeV9yZWcocGksIDB4OGYsICgweDEgPDwgMiksICgweDEgPDwgMikpOwotCQkJbW9kX3BoeV9yZWcocGksIDB4YTcsICgweDEgPDwgMiksICgweDEgPDwgMikpOwotCQkJbW9kX3BoeV9yZWcocGksIDB4YTUsICgweDEgPDwgMiksICgweDEgPDwgMikpOwotCi0JCQltb2RfcGh5X3JlZyhwaSwgMHhhNiwgKDB4MSA8PCAwKSwgMCk7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHg4ZiwgKDB4MSA8PCAwKSwgKDB4MSA8PCAwKSk7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHhhNywgKDB4MSA8PCAwKSwgMCk7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHhhNSwgKDB4MSA8PCAwKSwgKDB4MSA8PCAwKSk7Ci0KLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQUZFQ1RSTCwgMSwKLQkJCQkJCSAweDA1LCAxNiwKLQkJCQkJCSAmYWZlY3RybF9hZGNfY3RybDJfcmV2Nyk7Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDEsCi0JCQkJCQkgMHgxNSwgMTYsCi0JCQkJCQkgJmFmZWN0cmxfYWRjX2N0cmwyX3JldjcpOwotCi0JCQltb2RfcGh5X3JlZyhwaSwgMHhhNiwgKDB4MSA8PCAyKSwgMCk7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHg4ZiwgKDB4MSA8PCAyKSwgMCk7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHhhNywgKDB4MSA8PCAyKSwgMCk7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHhhNSwgKDB4MSA8PCAyKSwgMCk7Ci0JCX0KLQotCQl3cml0ZV9waHlfcmVnKHBpLCAweDZhLCAweDIpOwotCi0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfTk9JU0VWQVIsIDEsIDI1NiwgMzIsCi0JCQkJCSAmbWluX252YXJfb2Zmc2V0XzZtYnBzKTsKLQotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX1JGU0VRLCAyLCAweDEzOCwgMTYsCi0JCQkJCSAmcmZzZXFfcGt0Z25fbHBmX2hwY19yZXY3KTsKLQotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX1JGU0VRLCAxLCAweDE0MSwgMTYsCi0JCQkJCSAmcmZzZXFfcGt0Z25fbHBmX2hfaHBjX3JldjcpOwotCi0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfUkZTRVEsIDMsIDB4MTMzLCAxNiwKLQkJCQkJICZyZnNlcV9odHBrdGduX2xwZl9ocGNfcmV2Nyk7Ci0KLQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9SRlNFUSwgMiwgMHgxNDYsIDE2LAotCQkJCQkgJnJmc2VxX2Nja3BrdGduX2xwZl9ocGNfcmV2Nyk7Ci0KLQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9SRlNFUSwgMSwgMHgxMjMsIDE2LAotCQkJCQkgJnJmc2VxX3R4MnJ4X2xwZl9oX2hwY19yZXY3KTsKLQotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX1JGU0VRLCAxLCAweDEyQSwgMTYsCi0JCQkJCSAmcmZzZXFfcngydHhfbHBmX2hfaHBjX3JldjcpOwotCi0JCWlmIChDSFNQRUNfSVM0MChwaS0+cmFkaW9fY2hhbnNwZWMpID09IDApIHsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfTk9JU0VWQVIsIDEsIDMsCi0JCQkJCQkgMzIsICZtaW5fbnZhcl92YWwpOwotCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9OT0lTRVZBUiwgMSwKLQkJCQkJCSAxMjcsIDMyLCAmbWluX252YXJfdmFsKTsKLQkJfSBlbHNlIHsKLQkJCW1pbl9udmFyX3ZhbCA9IG5vaXNlX3Zhcl90YmxfcmV2N1szXTsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfTk9JU0VWQVIsIDEsIDMsCi0JCQkJCQkgMzIsICZtaW5fbnZhcl92YWwpOwotCi0JCQltaW5fbnZhcl92YWwgPSBub2lzZV92YXJfdGJsX3JldjdbMTI3XTsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfTk9JU0VWQVIsIDEsCi0JCQkJCQkgMTI3LCAzMiwgJm1pbl9udmFyX3ZhbCk7Ci0JCX0KLQotCQl3bGNfcGh5X3dvcmthcm91bmRzX25waHlfZ2FpbmN0cmwocGkpOwotCi0JCXBkZXRyYW5nZSA9Ci0JCSAgICAoQ0hTUEVDX0lTNUcocGktPnJhZGlvX2NoYW5zcGVjKSkgPyBwaS0+c3JvbV9mZW01Zy4KLQkJICAgIHBkZXRyYW5nZSA6IHBpLT5zcm9tX2ZlbTJnLnBkZXRyYW5nZTsKLQotCQlpZiAocGRldHJhbmdlID09IDApIHsKLQkJCWNoYW5fZnJlcV9yYW5nZSA9Ci0JCQkgICAgd2xjX3BoeV9nZXRfY2hhbl9mcmVxX3JhbmdlX25waHkocGksIDApOwotCQkJaWYgKGNoYW5fZnJlcV9yYW5nZSAhPSBXTF9DSEFOX0ZSRVFfUkFOR0VfMkcpIHsKLQkJCQlhdXhfYWRjX3ZtaWRfcmV2N19jb3JlMFszXSA9IDB4NzA7Ci0JCQkJYXV4X2FkY192bWlkX3JldjdfY29yZTFbM10gPSAweDcwOwotCQkJCWF1eF9hZGNfZ2Fpbl9yZXY3WzNdID0gMjsKLQkJCX0gZWxzZSB7Ci0JCQkJYXV4X2FkY192bWlkX3JldjdfY29yZTBbM10gPSAweDgwOwotCQkJCWF1eF9hZGNfdm1pZF9yZXY3X2NvcmUxWzNdID0gMHg4MDsKLQkJCQlhdXhfYWRjX2dhaW5fcmV2N1szXSA9IDM7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAocGRldHJhbmdlID09IDEpIHsKLQkJCWlmIChjaGFuX2ZyZXFfcmFuZ2UgIT0gV0xfQ0hBTl9GUkVRX1JBTkdFXzJHKSB7Ci0JCQkJYXV4X2FkY192bWlkX3JldjdfY29yZTBbM10gPSAweDdjOwotCQkJCWF1eF9hZGNfdm1pZF9yZXY3X2NvcmUxWzNdID0gMHg3YzsKLQkJCQlhdXhfYWRjX2dhaW5fcmV2N1szXSA9IDI7Ci0JCQl9IGVsc2UgewotCQkJCWF1eF9hZGNfdm1pZF9yZXY3X2NvcmUwWzNdID0gMHg4YzsKLQkJCQlhdXhfYWRjX3ZtaWRfcmV2N19jb3JlMVszXSA9IDB4OGM7Ci0JCQkJYXV4X2FkY19nYWluX3JldjdbM10gPSAxOwotCQkJfQotCQl9IGVsc2UgaWYgKHBkZXRyYW5nZSA9PSAyKSB7Ci0JCQlpZiAocGktPnB1YnBpLnJhZGlvaWQgPT0gQkNNMjA1N19JRCkgewotCQkJCWlmICgocGktPnB1YnBpLnJhZGlvcmV2ID09IDUpCi0JCQkJICAgIHx8IChwaS0+cHVicGkucmFkaW9yZXYgPT0gNykKLQkJCQkgICAgfHwgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA4KSkgewotCQkJCQlpZiAoY2hhbl9mcmVxX3JhbmdlID09Ci0JCQkJCSAgICBXTF9DSEFOX0ZSRVFfUkFOR0VfMkcpIHsKLQkJCQkJCWF1eF9hZGNfdm1pZF9yZXY3X2NvcmUwWzNdID0KLQkJCQkJCSAgICAweDhjOwotCQkJCQkJYXV4X2FkY192bWlkX3JldjdfY29yZTFbM10gPQotCQkJCQkJICAgIDB4OGM7Ci0JCQkJCQlhdXhfYWRjX2dhaW5fcmV2N1szXSA9IDA7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlhdXhfYWRjX3ZtaWRfcmV2N19jb3JlMFszXSA9Ci0JCQkJCQkgICAgMHg5NjsKLQkJCQkJCWF1eF9hZGNfdm1pZF9yZXY3X2NvcmUxWzNdID0KLQkJCQkJCSAgICAweDk2OwotCQkJCQkJYXV4X2FkY19nYWluX3JldjdbM10gPSAwOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0gZWxzZSBpZiAocGRldHJhbmdlID09IDMpIHsKLQkJCWlmIChjaGFuX2ZyZXFfcmFuZ2UgPT0gV0xfQ0hBTl9GUkVRX1JBTkdFXzJHKSB7Ci0JCQkJYXV4X2FkY192bWlkX3JldjdfY29yZTBbM10gPSAweDg5OwotCQkJCWF1eF9hZGNfdm1pZF9yZXY3X2NvcmUxWzNdID0gMHg4OTsKLQkJCQlhdXhfYWRjX2dhaW5fcmV2N1szXSA9IDA7Ci0JCQl9Ci0KLQkJfSBlbHNlIGlmIChwZGV0cmFuZ2UgPT0gNSkgewotCi0JCQlpZiAoY2hhbl9mcmVxX3JhbmdlICE9IFdMX0NIQU5fRlJFUV9SQU5HRV8yRykgewotCQkJCWF1eF9hZGNfdm1pZF9yZXY3X2NvcmUwWzNdID0gMHg4MDsKLQkJCQlhdXhfYWRjX3ZtaWRfcmV2N19jb3JlMVszXSA9IDB4ODA7Ci0JCQkJYXV4X2FkY19nYWluX3JldjdbM10gPSAzOwotCQkJfSBlbHNlIHsKLQkJCQlhdXhfYWRjX3ZtaWRfcmV2N19jb3JlMFszXSA9IDB4NzA7Ci0JCQkJYXV4X2FkY192bWlkX3JldjdfY29yZTFbM10gPSAweDcwOwotCQkJCWF1eF9hZGNfZ2Fpbl9yZXY3WzNdID0gMjsKLQkJCX0KLQkJfQotCi0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQUZFQ1RSTCwgNCwgMHgwOCwgMTYsCi0JCQkJCSAmYXV4X2FkY192bWlkX3JldjdfY29yZTApOwotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDQsIDB4MTgsIDE2LAotCQkJCQkgJmF1eF9hZGNfdm1pZF9yZXY3X2NvcmUxKTsKLQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9BRkVDVFJMLCA0LCAweDBjLCAxNiwKLQkJCQkJICZhdXhfYWRjX2dhaW5fcmV2Nyk7Ci0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQUZFQ1RSTCwgNCwgMHgxYywgMTYsCi0JCQkJCSAmYXV4X2FkY19nYWluX3JldjcpOwotCi0JfSBlbHNlIGlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCi0JCXdyaXRlX3BoeV9yZWcocGksIDB4MjNmLCAweDFmOCk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MjQwLCAweDFmOCk7Ci0KLQkJd2xjX3BoeV90YWJsZV9yZWFkX25waHkocGksIE5QSFlfVEJMX0lEX0NNUE1FVFJJQ0RBVEFXRUlHSFRUQkwsCi0JCQkJCTEsIDAsIDMyLCAmbGVnX2RhdGFfd2VpZ2h0cyk7Ci0JCWxlZ19kYXRhX3dlaWdodHMgPSBsZWdfZGF0YV93ZWlnaHRzICYgMHhmZmZmZmY7Ci0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQ01QTUVUUklDREFUQVdFSUdIVFRCTCwKLQkJCQkJIDEsIDAsIDMyLCAmbGVnX2RhdGFfd2VpZ2h0cyk7Ci0KLQkJYWxwaGEwID0gMjkzOwotCQlhbHBoYTEgPSA0MzU7Ci0JCWFscGhhMiA9IDI2MTsKLQkJYmV0YTAgPSAzNjY7Ci0JCWJldGExID0gMjA1OwotCQliZXRhMiA9IDMyOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDE0NSwgYWxwaGEwKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxNDYsIGFscGhhMSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MTQ3LCBhbHBoYTIpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDE0OCwgYmV0YTApOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDE0OSwgYmV0YTEpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDE0YSwgYmV0YTIpOwotCi0JCXdyaXRlX3BoeV9yZWcocGksIDB4MzgsIDB4Qyk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MmFlLCAweEMpOwotCi0JCXdsY19waHlfc2V0X3Jmc2VxX25waHkocGksIE5QSFlfUkZTRVFfVFgyUlgsCi0JCQkJICAgICAgIHJmc2VxX3R4MnJ4X2V2ZW50c19yZXYzLAotCQkJCSAgICAgICByZnNlcV90eDJyeF9kbHlzX3JldjMsCi0JCQkJICAgICAgIHNpemVvZihyZnNlcV90eDJyeF9ldmVudHNfcmV2MykgLwotCQkJCSAgICAgICBzaXplb2YocmZzZXFfdHgycnhfZXZlbnRzX3JldjNbMF0pKTsKLQotCQlpZiAoUEhZX0lQQShwaSkpIHsKLQkJCXdsY19waHlfc2V0X3Jmc2VxX25waHkocGksIE5QSFlfUkZTRVFfUlgyVFgsCi0JCQkJCSAgICAgICByZnNlcV9yeDJ0eF9ldmVudHNfcmV2M19pcGEsCi0JCQkJCSAgICAgICByZnNlcV9yeDJ0eF9kbHlzX3JldjNfaXBhLAotCQkJCQkgICAgICAgc2l6ZW9mCi0JCQkJCSAgICAgICAocmZzZXFfcngydHhfZXZlbnRzX3JldjNfaXBhKSAvCi0JCQkJCSAgICAgICBzaXplb2YKLQkJCQkJICAgICAgIChyZnNlcV9yeDJ0eF9ldmVudHNfcmV2M19pcGEKLQkJCQkJCVswXSkpOwotCQl9Ci0KLQkJaWYgKChwaS0+c2gtPmh3X3BoeXJ4Y2hhaW4gIT0gMHgzKSAmJgotCQkgICAgKHBpLT5zaC0+aHdfcGh5cnhjaGFpbiAhPSBwaS0+c2gtPmh3X3BoeXR4Y2hhaW4pKSB7Ci0KLQkJCWlmIChQSFlfSVBBKHBpKSkgewotCQkJCXJmc2VxX3J4MnR4X2RseXNfcmV2M1s1XSA9IDU5OwotCQkJCXJmc2VxX3J4MnR4X2RseXNfcmV2M1s2XSA9IDE7Ci0JCQkJcmZzZXFfcngydHhfZXZlbnRzX3JldjNbN10gPQotCQkJCSAgICBOUEhZX1JFVjNfUkZTRVFfQ01EX0VORDsKLQkJCX0KLQotCQkJd2xjX3BoeV9zZXRfcmZzZXFfbnBoeShwaSwgTlBIWV9SRlNFUV9SWDJUWCwKLQkJCQkJICAgICAgIHJmc2VxX3J4MnR4X2V2ZW50c19yZXYzLAotCQkJCQkgICAgICAgcmZzZXFfcngydHhfZGx5c19yZXYzLAotCQkJCQkgICAgICAgc2l6ZW9mKHJmc2VxX3J4MnR4X2V2ZW50c19yZXYzKSAvCi0JCQkJCSAgICAgICBzaXplb2YocmZzZXFfcngydHhfZXZlbnRzX3JldjMKLQkJCQkJCSAgICAgIFswXSkpOwotCQl9Ci0KLQkJaWYgKENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCXdyaXRlX3BoeV9yZWcocGksIDB4NmEsIDB4Mik7Ci0JCX0gZWxzZSB7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAweDZhLCAweDljNDApOwotCQl9Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4Mjk0LCAoMHhmIDw8IDgpLCAoNyA8PCA4KSk7Ci0KLQkJaWYgKENIU1BFQ19JUzQwKHBpLT5yYWRpb19jaGFuc3BlYykgPT0gMCkgewotCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9OT0lTRVZBUiwgMSwgMywKLQkJCQkJCSAzMiwgJm1pbl9udmFyX3ZhbCk7Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX05PSVNFVkFSLCAxLAotCQkJCQkJIDEyNywgMzIsICZtaW5fbnZhcl92YWwpOwotCQl9IGVsc2UgewotCQkJbWluX252YXJfdmFsID0gbm9pc2VfdmFyX3RibF9yZXYzWzNdOwotCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9OT0lTRVZBUiwgMSwgMywKLQkJCQkJCSAzMiwgJm1pbl9udmFyX3ZhbCk7Ci0KLQkJCW1pbl9udmFyX3ZhbCA9IG5vaXNlX3Zhcl90YmxfcmV2M1sxMjddOwotCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9OT0lTRVZBUiwgMSwKLQkJCQkJCSAxMjcsIDMyLCAmbWluX252YXJfdmFsKTsKLQkJfQotCi0JCXdsY19waHlfd29ya2Fyb3VuZHNfbnBoeV9nYWluY3RybChwaSk7Ci0KLQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9BRkVDVFJMLCAxLCAweDAwLCAxNiwKLQkJCQkJICZkYWNfY29udHJvbCk7Ci0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQUZFQ1RSTCwgMSwgMHgxMCwgMTYsCi0JCQkJCSAmZGFjX2NvbnRyb2wpOwotCi0JCXBkZXRyYW5nZSA9Ci0JCSAgICAoQ0hTUEVDX0lTNUcocGktPnJhZGlvX2NoYW5zcGVjKSkgPyBwaS0+c3JvbV9mZW01Zy4KLQkJICAgIHBkZXRyYW5nZSA6IHBpLT5zcm9tX2ZlbTJnLnBkZXRyYW5nZTsKLQotCQlpZiAocGRldHJhbmdlID09IDApIHsKLQkJCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA0KSkgewotCQkJCWF1eF9hZGNfdm1pZCA9IGF1eF9hZGNfdm1pZF9yZXY0OwotCQkJCWF1eF9hZGNfZ2FpbiA9IGF1eF9hZGNfZ2Fpbl9yZXY0OwotCQkJfSBlbHNlIHsKLQkJCQlhdXhfYWRjX3ZtaWQgPSBhdXhfYWRjX3ZtaWRfcmV2MzsKLQkJCQlhdXhfYWRjX2dhaW4gPSBhdXhfYWRjX2dhaW5fcmV2MzsKLQkJCX0KLQkJCWNoYW5fZnJlcV9yYW5nZSA9Ci0JCQkgICAgd2xjX3BoeV9nZXRfY2hhbl9mcmVxX3JhbmdlX25waHkocGksIDApOwotCQkJaWYgKGNoYW5fZnJlcV9yYW5nZSAhPSBXTF9DSEFOX0ZSRVFfUkFOR0VfMkcpIHsKLQkJCQlzd2l0Y2ggKGNoYW5fZnJlcV9yYW5nZSkgewotCQkJCWNhc2UgV0xfQ0hBTl9GUkVRX1JBTkdFXzVHTDoKLQkJCQkJYXV4X2FkY192bWlkWzNdID0gMHg4OTsKLQkJCQkJYXV4X2FkY19nYWluWzNdID0gMDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBXTF9DSEFOX0ZSRVFfUkFOR0VfNUdNOgotCQkJCQlhdXhfYWRjX3ZtaWRbM10gPSAweDg5OwotCQkJCQlhdXhfYWRjX2dhaW5bM10gPSAwOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFdMX0NIQU5fRlJFUV9SQU5HRV81R0g6Ci0JCQkJCWF1eF9hZGNfdm1pZFszXSA9IDB4ODk7Ci0JCQkJCWF1eF9hZGNfZ2FpblszXSA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQUZFQ1RSTCwgNCwKLQkJCQkJCSAweDA4LCAxNiwgYXV4X2FkY192bWlkKTsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQUZFQ1RSTCwgNCwKLQkJCQkJCSAweDE4LCAxNiwgYXV4X2FkY192bWlkKTsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQUZFQ1RSTCwgNCwKLQkJCQkJCSAweDBjLCAxNiwgYXV4X2FkY19nYWluKTsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQUZFQ1RSTCwgNCwKLQkJCQkJCSAweDFjLCAxNiwgYXV4X2FkY19nYWluKTsKLQkJfSBlbHNlIGlmIChwZGV0cmFuZ2UgPT0gMSkgewotCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9BRkVDVFJMLCA0LAotCQkJCQkJIDB4MDgsIDE2LCBza19hZGNfdm1pZCk7Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDQsCi0JCQkJCQkgMHgxOCwgMTYsIHNrX2FkY192bWlkKTsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQUZFQ1RSTCwgNCwKLQkJCQkJCSAweDBjLCAxNiwgc2tfYWRjX2dhaW4pOwotCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9BRkVDVFJMLCA0LAotCQkJCQkJIDB4MWMsIDE2LCBza19hZGNfZ2Fpbik7Ci0JCX0gZWxzZSBpZiAocGRldHJhbmdlID09IDIpIHsKLQotCQkJdTE2IGJjbV9hZGNfdm1pZFtdID0geyAweGEyLCAweGI0LCAweGI0LCAweDc0IH07Ci0JCQl1MTYgYmNtX2FkY19nYWluW10gPSB7IDB4MDIsIDB4MDIsIDB4MDIsIDB4MDQgfTsKLQotCQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDYpKSB7Ci0JCQkJY2hhbl9mcmVxX3JhbmdlID0KLQkJCQkgICAgd2xjX3BoeV9nZXRfY2hhbl9mcmVxX3JhbmdlX25waHkocGksIDApOwotCQkJCWlmIChjaGFuX2ZyZXFfcmFuZ2UgIT0gV0xfQ0hBTl9GUkVRX1JBTkdFXzJHKSB7Ci0JCQkJCWJjbV9hZGNfdm1pZFszXSA9IDB4OGU7Ci0JCQkJCWJjbV9hZGNfZ2FpblszXSA9IDB4MDM7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYmNtX2FkY192bWlkWzNdID0gMHg5NDsKLQkJCQkJYmNtX2FkY19nYWluWzNdID0gMHgwMzsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKE5SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDUpKSB7Ci0JCQkJYmNtX2FkY192bWlkWzNdID0gMHg4NDsKLQkJCQliY21fYWRjX2dhaW5bM10gPSAweDAyOwotCQkJfQotCi0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDQsCi0JCQkJCQkgMHgwOCwgMTYsIGJjbV9hZGNfdm1pZCk7Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDQsCi0JCQkJCQkgMHgxOCwgMTYsIGJjbV9hZGNfdm1pZCk7Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDQsCi0JCQkJCQkgMHgwYywgMTYsIGJjbV9hZGNfZ2Fpbik7Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDQsCi0JCQkJCQkgMHgxYywgMTYsIGJjbV9hZGNfZ2Fpbik7Ci0JCX0gZWxzZSBpZiAocGRldHJhbmdlID09IDMpIHsKLQkJCWNoYW5fZnJlcV9yYW5nZSA9Ci0JCQkgICAgd2xjX3BoeV9nZXRfY2hhbl9mcmVxX3JhbmdlX25waHkocGksIDApOwotCQkJaWYgKChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA0KSkKLQkJCSAgICAmJiAoY2hhbl9mcmVxX3JhbmdlID09IFdMX0NIQU5fRlJFUV9SQU5HRV8yRykpIHsKLQotCQkJCXUxNiBhdXhhZGNfdm1pZFtdID0gewotCQkJCQkweGEyLCAweGI0LCAweGI0LCAweDI3MCB9OwotCQkJCXUxNiBhdXhhZGNfZ2FpbltdID0gewotCQkJCQkweDAyLCAweDAyLCAweDAyLCAweDAwIH07Ci0KLQkJCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksCi0JCQkJCQkJIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDQsCi0JCQkJCQkJIDB4MDgsIDE2LCBhdXhhZGNfdm1pZCk7Ci0JCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLAotCQkJCQkJCSBOUEhZX1RCTF9JRF9BRkVDVFJMLCA0LAotCQkJCQkJCSAweDE4LCAxNiwgYXV4YWRjX3ZtaWQpOwotCQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwKLQkJCQkJCQkgTlBIWV9UQkxfSURfQUZFQ1RSTCwgNCwKLQkJCQkJCQkgMHgwYywgMTYsIGF1eGFkY19nYWluKTsKLQkJCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksCi0JCQkJCQkJIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDQsCi0JCQkJCQkJIDB4MWMsIDE2LCBhdXhhZGNfZ2Fpbik7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoKHBkZXRyYW5nZSA9PSA0KSB8fCAocGRldHJhbmdlID09IDUpKSB7Ci0JCQl1MTYgYmNtX2FkY192bWlkW10gPSB7IDB4YTIsIDB4YjQsIDB4YjQsIDB4MCB9OwotCQkJdTE2IGJjbV9hZGNfZ2FpbltdID0geyAweDAyLCAweDAyLCAweDAyLCAweDAgfTsKLQkJCXUxNiBWbWlkWzJdLCBBdlsyXTsKLQotCQkJY2hhbl9mcmVxX3JhbmdlID0KLQkJCSAgICB3bGNfcGh5X2dldF9jaGFuX2ZyZXFfcmFuZ2VfbnBoeShwaSwgMCk7Ci0JCQlpZiAoY2hhbl9mcmVxX3JhbmdlICE9IFdMX0NIQU5fRlJFUV9SQU5HRV8yRykgewotCQkJCVZtaWRbMF0gPSAocGRldHJhbmdlID09IDQpID8gMHg4ZSA6IDB4ODk7Ci0JCQkJVm1pZFsxXSA9IChwZGV0cmFuZ2UgPT0gNCkgPyAweDk2IDogMHg4OTsKLQkJCQlBdlswXSA9IChwZGV0cmFuZ2UgPT0gNCkgPyAyIDogMDsKLQkJCQlBdlsxXSA9IChwZGV0cmFuZ2UgPT0gNCkgPyAyIDogMDsKLQkJCX0gZWxzZSB7Ci0JCQkJVm1pZFswXSA9IChwZGV0cmFuZ2UgPT0gNCkgPyAweDg5IDogMHg3NDsKLQkJCQlWbWlkWzFdID0gKHBkZXRyYW5nZSA9PSA0KSA/IDB4OGIgOiAweDcwOwotCQkJCUF2WzBdID0gKHBkZXRyYW5nZSA9PSA0KSA/IDIgOiAwOwotCQkJCUF2WzFdID0gKHBkZXRyYW5nZSA9PSA0KSA/IDIgOiAwOwotCQkJfQotCi0JCQliY21fYWRjX3ZtaWRbM10gPSBWbWlkWzBdOwotCQkJYmNtX2FkY19nYWluWzNdID0gQXZbMF07Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDQsCi0JCQkJCQkgMHgwOCwgMTYsIGJjbV9hZGNfdm1pZCk7Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDQsCi0JCQkJCQkgMHgwYywgMTYsIGJjbV9hZGNfZ2Fpbik7Ci0KLQkJCWJjbV9hZGNfdm1pZFszXSA9IFZtaWRbMV07Ci0JCQliY21fYWRjX2dhaW5bM10gPSBBdlsxXTsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQUZFQ1RSTCwgNCwKLQkJCQkJCSAweDE4LCAxNiwgYmNtX2FkY192bWlkKTsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQUZFQ1RSTCwgNCwKLQkJCQkJCSAweDFjLCAxNiwgYmNtX2FkY19nYWluKTsKLQkJfQotCi0JCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkoUkFESU9fMjA1Nl9SWF9NSVhBX01BU1RfQklBUyB8IFJBRElPXzIwNTZfUlgwKSwKLQkJCQkweDApOwotCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJKFJBRElPXzIwNTZfUlhfTUlYQV9NQVNUX0JJQVMgfCBSQURJT18yMDU2X1JYMSksCi0JCQkJMHgwKTsKLQotCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJKFJBRElPXzIwNTZfUlhfTUlYQV9CSUFTX01BSU4gfCBSQURJT18yMDU2X1JYMCksCi0JCQkJMHg2KTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCShSQURJT18yMDU2X1JYX01JWEFfQklBU19NQUlOIHwgUkFESU9fMjA1Nl9SWDEpLAotCQkJCTB4Nik7Ci0KLQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCShSQURJT18yMDU2X1JYX01JWEFfQklBU19BVVggfCBSQURJT18yMDU2X1JYMCksCi0JCQkJMHg3KTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCShSQURJT18yMDU2X1JYX01JWEFfQklBU19BVVggfCBSQURJT18yMDU2X1JYMSksCi0JCQkJMHg3KTsKLQotCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJKFJBRElPXzIwNTZfUlhfTUlYQV9MT0JfQklBUyB8IFJBRElPXzIwNTZfUlgwKSwKLQkJCQkweDg4KTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCShSQURJT18yMDU2X1JYX01JWEFfTE9CX0JJQVMgfCBSQURJT18yMDU2X1JYMSksCi0JCQkJMHg4OCk7Ci0KLQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCShSQURJT18yMDU2X1JYX01JWEFfQ01GQl9JREFDIHwgUkFESU9fMjA1Nl9SWDApLAotCQkJCTB4MCk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkoUkFESU9fMjA1Nl9SWF9NSVhBX0NNRkJfSURBQyB8IFJBRElPXzIwNTZfUlgxKSwKLQkJCQkweDApOwotCi0JCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkoUkFESU9fMjA1Nl9SWF9NSVhHX0NNRkJfSURBQyB8IFJBRElPXzIwNTZfUlgwKSwKLQkJCQkweDApOwotCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJKFJBRElPXzIwNTZfUlhfTUlYR19DTUZCX0lEQUMgfCBSQURJT18yMDU2X1JYMSksCi0JCQkJMHgwKTsKLQotCQl0cmlzbyA9Ci0JCSAgICAoQ0hTUEVDX0lTNUcocGktPnJhZGlvX2NoYW5zcGVjKSkgPyBwaS0+c3JvbV9mZW01Zy4KLQkJICAgIHRyaXNvIDogcGktPnNyb21fZmVtMmcudHJpc287Ci0JCWlmICh0cmlzbyA9PSA3KSB7Ci0JCQl3bGNfcGh5X3dhcl9mb3JjZV90cnN3X3RvX1JfY2xpcGxvX25waHkocGksIFBIWV9DT1JFXzApOwotCQkJd2xjX3BoeV93YXJfZm9yY2VfdHJzd190b19SX2NsaXBsb19ucGh5KHBpLCBQSFlfQ09SRV8xKTsKLQkJfQotCi0JCXdsY19waHlfd2FyX3R4Y2hhaW5fdXBkX25waHkocGksIHBpLT5zaC0+aHdfcGh5dHhjaGFpbik7Ci0KLQkJaWYgKCgocGktPnNoLT5ib2FyZGZsYWdzMiAmIEJGTDJfQVBMTF9XQVIpICYmCi0JCSAgICAgKENIU1BFQ19JUzVHKHBpLT5yYWRpb19jaGFuc3BlYykpKSB8fAotCQkgICAgKCgocGktPnNoLT5ib2FyZGZsYWdzMiAmIEJGTDJfR1BMTF9XQVIpIHx8Ci0JCSAgICAgIChwaS0+c2gtPmJvYXJkZmxhZ3MyICYgQkZMMl9HUExMX1dBUjIpKSAmJgotCQkgICAgIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSkpIHsKLQkJCW5zczFfZGF0YV93ZWlnaHRzID0gMHgwMDA4ODg4ODsKLQkJCWh0X2RhdGFfd2VpZ2h0cyA9IDB4MDAwODg4ODg7Ci0JCQlzdGJjX2RhdGFfd2VpZ2h0cyA9IDB4MDAwODg4ODg7Ci0JCX0gZWxzZSB7Ci0JCQluc3MxX2RhdGFfd2VpZ2h0cyA9IDB4ODg4ODg4ODg7Ci0JCQlodF9kYXRhX3dlaWdodHMgPSAweDg4ODg4ODg4OwotCQkJc3RiY19kYXRhX3dlaWdodHMgPSAweDg4ODg4ODg4OwotCQl9Ci0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQ01QTUVUUklDREFUQVdFSUdIVFRCTCwKLQkJCQkJIDEsIDEsIDMyLCAmbnNzMV9kYXRhX3dlaWdodHMpOwotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0NNUE1FVFJJQ0RBVEFXRUlHSFRUQkwsCi0JCQkJCSAxLCAyLCAzMiwgJmh0X2RhdGFfd2VpZ2h0cyk7Ci0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQ01QTUVUUklDREFUQVdFSUdIVFRCTCwKLQkJCQkJIDEsIDMsIDMyLCAmc3RiY19kYXRhX3dlaWdodHMpOwotCi0JCWlmIChOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCA0KSkgewotCQkJaWYgKENIU1BFQ19JUzVHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQlSQURJT18yMDU2X1RYX0dNQkJfSURBQyB8Ci0JCQkJCQlSQURJT18yMDU2X1RYMCwgMHg3MCk7Ci0JCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJUkFESU9fMjA1Nl9UWF9HTUJCX0lEQUMgfAotCQkJCQkJUkFESU9fMjA1Nl9UWDEsIDB4NzApOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFwaS0+ZWRjcnNfdGhyZXNob2xkX2xvY2spIHsKLQkJCXdyaXRlX3BoeV9yZWcocGksIDB4MjI0LCAweDNlYik7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAweDIyNSwgMHgzZWIpOwotCQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgyMjYsIDB4MzQxKTsKLQkJCXdyaXRlX3BoeV9yZWcocGksIDB4MjI3LCAweDM0MSk7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAweDIyOCwgMHg0MmIpOwotCQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgyMjksIDB4NDJiKTsKLQkJCXdyaXRlX3BoeV9yZWcocGksIDB4MjJhLCAweDM4MSk7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAweDIyYiwgMHgzODEpOwotCQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgyMmMsIDB4NDJiKTsKLQkJCXdyaXRlX3BoeV9yZWcocGksIDB4MjJkLCAweDQyYik7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAweDIyZSwgMHgzODEpOwotCQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgyMmYsIDB4MzgxKTsKLQkJfQotCi0JCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA2KSkgewotCi0JCQlpZiAocGktPnNoLT5ib2FyZGZsYWdzMiAmIEJGTDJfU0lOR0xFQU5UX0NDSykgewotCQkJCXdsYXBpX2JtYWNfbWhmKHBpLT5zaC0+cGh5c2hpbSwgTUhGNCwKLQkJCQkJTUhGNF9CUEhZX1RYQ09SRTAsCi0JCQkJCU1IRjRfQlBIWV9UWENPUkUwLCBCUkNNX0JBTkRfQUxMKTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0KLQkJaWYgKHBpLT5zaC0+Ym9hcmRmbGFnczIgJiBCRkwyX1NLV1JLRkVNX0JSRCB8fAotCQkgICAgKHBpLT5zaC0+Ym9hcmR0eXBlID09IDB4OGIpKSB7Ci0JCQl1aW50IGk7Ci0JCQl1OCB3YXJfZGx5c1tdID0geyAxLCA2LCA2LCAyLCA0LCAyMCwgMSB9OwotCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmZzZXFfcngydHhfZGx5cyk7IGkrKykKLQkJCQlyZnNlcV9yeDJ0eF9kbHlzW2ldID0gd2FyX2RseXNbaV07Ci0JCX0KLQotCQlpZiAoQ0hTUEVDX0lTNUcocGktPnJhZGlvX2NoYW5zcGVjKSAmJiBwaS0+cGh5XzVnX3B3cmdhaW4pIHsKLQkJCWFuZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTFfVFhfUkZfU1BBUkUsIDB4ZjcpOwotCQkJYW5kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMl9UWF9SRl9TUEFSRSwgMHhmNyk7Ci0JCX0gZWxzZSB7Ci0JCQlvcl9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTFfVFhfUkZfU1BBUkUsIDB4OCk7Ci0JCQlvcl9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTJfVFhfUkZfU1BBUkUsIDB4OCk7Ci0JCX0KLQotCQlyZWd2YWwgPSAweDAwMGE7Ci0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgOCwgMSwgMCwgMTYsICZyZWd2YWwpOwotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIDgsIDEsIDB4MTAsIDE2LCAmcmVndmFsKTsKLQotCQlpZiAoTlJFVl9MVChwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJCXJlZ3ZhbCA9IDB4Y2RhYTsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgOCwgMSwgMHgwMiwgMTYsICZyZWd2YWwpOwotCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCA4LCAxLCAweDEyLCAxNiwgJnJlZ3ZhbCk7Ci0JCX0KLQotCQlpZiAoTlJFVl9MVChwaS0+cHVicGkucGh5X3JldiwgMikpIHsKLQkJCXJlZ3ZhbCA9IDB4MDAwMDsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgOCwgMSwgMHgwOCwgMTYsICZyZWd2YWwpOwotCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCA4LCAxLCAweDE4LCAxNiwgJnJlZ3ZhbCk7Ci0KLQkJCXJlZ3ZhbCA9IDB4N2FhYjsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgOCwgMSwgMHgwNywgMTYsICZyZWd2YWwpOwotCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCA4LCAxLCAweDE3LCAxNiwgJnJlZ3ZhbCk7Ci0KLQkJCXJlZ3ZhbCA9IDB4MDgwMDsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgOCwgMSwgMHgwNiwgMTYsICZyZWd2YWwpOwotCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCA4LCAxLCAweDE2LCAxNiwgJnJlZ3ZhbCk7Ci0JCX0KLQotCQl3cml0ZV9waHlfcmVnKHBpLCAweGY4LCAweDAyZDgpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweGY5LCAweDAzMDEpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweGZhLCAweDAyZDgpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweGZiLCAweDAzMDEpOwotCi0JCXdsY19waHlfc2V0X3Jmc2VxX25waHkocGksIE5QSFlfUkZTRVFfUlgyVFgsIHJmc2VxX3J4MnR4X2V2ZW50cywKLQkJCQkgICAgICAgcmZzZXFfcngydHhfZGx5cywKLQkJCQkgICAgICAgc2l6ZW9mKHJmc2VxX3J4MnR4X2V2ZW50cykgLwotCQkJCSAgICAgICBzaXplb2YocmZzZXFfcngydHhfZXZlbnRzWzBdKSk7Ci0KLQkJd2xjX3BoeV9zZXRfcmZzZXFfbnBoeShwaSwgTlBIWV9SRlNFUV9UWDJSWCwgcmZzZXFfdHgycnhfZXZlbnRzLAotCQkJCSAgICAgICByZnNlcV90eDJyeF9kbHlzLAotCQkJCSAgICAgICBzaXplb2YocmZzZXFfdHgycnhfZXZlbnRzKSAvCi0JCQkJICAgICAgIHNpemVvZihyZnNlcV90eDJyeF9ldmVudHNbMF0pKTsKLQotCQl3bGNfcGh5X3dvcmthcm91bmRzX25waHlfZ2FpbmN0cmwocGkpOwotCi0JCWlmIChOUkVWX0xUKHBpLT5wdWJwaS5waHlfcmV2LCAyKSkgewotCi0JCQlpZiAocmVhZF9waHlfcmVnKHBpLCAweGEwKSAmIE5QSFlfTUxlbmFibGUpCi0JCQkJd2xhcGlfYm1hY19taGYocGktPnNoLT5waHlzaGltLCBNSEYzLAotCQkJCQkgICAgICAgTUhGM19OUEhZX01MQURWX1dBUiwKLQkJCQkJICAgICAgIE1IRjNfTlBIWV9NTEFEVl9XQVIsCi0JCQkJCSAgICAgICBCUkNNX0JBTkRfQUxMKTsKLQotCQl9IGVsc2UgaWYgKE5SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDIpKSB7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAweDFlMywgMHgwKTsKLQkJCXdyaXRlX3BoeV9yZWcocGksIDB4MWU0LCAweDApOwotCQl9Ci0KLQkJaWYgKE5SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDIpKQotCQkJbW9kX3BoeV9yZWcocGksIDB4OTAsICgweDEgPDwgNyksIDApOwotCi0JCWFscGhhMCA9IDI5MzsKLQkJYWxwaGExID0gNDM1OwotCQlhbHBoYTIgPSAyNjE7Ci0JCWJldGEwID0gMzY2OwotCQliZXRhMSA9IDIwNTsKLQkJYmV0YTIgPSAzMjsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxNDUsIGFscGhhMCk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MTQ2LCBhbHBoYTEpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDE0NywgYWxwaGEyKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxNDgsIGJldGEwKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxNDksIGJldGExKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxNGEsIGJldGEyKTsKLQotCQlpZiAoTlJFVl9MVChwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJCW1vZF9waHlfcmVnKHBpLCAweDE0MiwgKDB4ZiA8PCAxMiksIDApOwotCi0JCQl3cml0ZV9waHlfcmVnKHBpLCAweDE5MiwgMHhiNSk7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAweDE5MywgMHhhNCk7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAweDE5NCwgMHgwKTsKLQkJfQotCi0JCWlmIChOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCAyKSkgewotCQkJbW9kX3BoeV9yZWcocGksIDB4MjIxLAotCQkJCSAgICBOUEhZX0ZPUkNFU0lHX0RFQ09ERUdBVEVEQ0xLUywKLQkJCQkgICAgTlBIWV9GT1JDRVNJR19ERUNPREVHQVRFRENMS1MpOwotCQl9Ci0JfQotCi0JaWYgKHBpLT5waHloYW5nX2F2b2lkKQotCQl3bGNfcGh5X3N0YXlfaW5fY2FycmllcnNlYXJjaF9ucGh5KHBpLCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsY19waHlfd29ya2Fyb3VuZHNfbnBoeV9nYWluY3RybChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQl1MTYgdzF0aCwgaHBmX2NvZGUsIGN1cnJiYW5kOwotCWludCBjdHI7Ci0JdTggcmZzZXFfdXBkYXRlZ2FpbnVfZXZlbnRzW10gPSB7Ci0JCU5QSFlfUkZTRVFfQ01EX1JYX0dBSU4sCi0JCU5QSFlfUkZTRVFfQ01EX0NMUl9ISVFfRElTLAotCQlOUEhZX1JGU0VRX0NNRF9TRVRfSFBGX0JXCi0JfTsKLQl1OCByZnNlcV91cGRhdGVnYWludV9kbHlzW10gPSB7IDEwLCAzMCwgMSB9OwotCXM4IGxuYTFHX2dhaW5fZGJbXSA9IHsgNywgMTEsIDE2LCAyMyB9OwotCXM4IGxuYTFHX2dhaW5fZGJfcmV2NFtdID0geyA4LCAxMiwgMTcsIDI1IH07Ci0JczggbG5hMUdfZ2Fpbl9kYl9yZXY1W10gPSB7IDksIDEzLCAxOCwgMjYgfTsKLQlzOCBsbmExR19nYWluX2RiX3JldjZbXSA9IHsgOCwgMTMsIDE4LCAyNSB9OwotCXM4IGxuYTFHX2dhaW5fZGJfcmV2Nl8yMjRCMFtdID0geyAxMCwgMTQsIDE5LCAyNyB9OwotCXM4IGxuYTFBX2dhaW5fZGJbXSA9IHsgNywgMTEsIDE3LCAyMyB9OwotCXM4IGxuYTFBX2dhaW5fZGJfcmV2NFtdID0geyA4LCAxMiwgMTgsIDIzIH07Ci0JczggbG5hMUFfZ2Fpbl9kYl9yZXY1W10gPSB7IDYsIDEwLCAxNiwgMjEgfTsKLQlzOCBsbmExQV9nYWluX2RiX3JldjZbXSA9IHsgNiwgMTAsIDE2LCAyMSB9OwotCXM4ICpsbmExX2dhaW5fZGIgPSBOVUxMOwotCXM4IGxuYTJHX2dhaW5fZGJbXSA9IHsgLTUsIDYsIDEwLCAxNCB9OwotCXM4IGxuYTJHX2dhaW5fZGJfcmV2NVtdID0geyAtMywgNywgMTEsIDE2IH07Ci0JczggbG5hMkdfZ2Fpbl9kYl9yZXY2W10gPSB7IC01LCA2LCAxMCwgMTQgfTsKLQlzOCBsbmEyR19nYWluX2RiX3JldjZfMjI0QjBbXSA9IHsgLTUsIDYsIDEwLCAxNSB9OwotCXM4IGxuYTJBX2dhaW5fZGJbXSA9IHsgLTYsIDIsIDYsIDEwIH07Ci0JczggbG5hMkFfZ2Fpbl9kYl9yZXY0W10gPSB7IC01LCAyLCA2LCAxMCB9OwotCXM4IGxuYTJBX2dhaW5fZGJfcmV2NVtdID0geyAtNywgMCwgNCwgOCB9OwotCXM4IGxuYTJBX2dhaW5fZGJfcmV2NltdID0geyAtNywgMCwgNCwgOCB9OwotCXM4ICpsbmEyX2dhaW5fZGIgPSBOVUxMOwotCXM4IHRpYUdfZ2Fpbl9kYltdID0gewotCQkweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDBBLCAweDBBIH07Ci0JczggdGlhQV9nYWluX2RiW10gPSB7Ci0JCTB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMsIDB4MTMgfTsKLQlzOCB0aWFBX2dhaW5fZGJfcmV2NFtdID0gewotCQkweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkIH07Ci0JczggdGlhQV9nYWluX2RiX3JldjVbXSA9IHsKLQkJMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCB9OwotCXM4IHRpYUFfZ2Fpbl9kYl9yZXY2W10gPSB7Ci0JCTB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQgfTsKLQlzOCAqdGlhX2dhaW5fZGI7Ci0JczggdGlhR19nYWluYml0c1tdID0gewotCQkweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzIH07Ci0JczggdGlhQV9nYWluYml0c1tdID0gewotCQkweDA2LCAweDA2LCAweDA2LCAweDA2LCAweDA2LCAweDA2LCAweDA2LCAweDA2LCAweDA2LCAweDA2IH07Ci0JczggdGlhQV9nYWluYml0c19yZXY0W10gPSB7Ci0JCTB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDQgfTsKLQlzOCB0aWFBX2dhaW5iaXRzX3JldjVbXSA9IHsKLQkJMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCB9OwotCXM4IHRpYUFfZ2FpbmJpdHNfcmV2NltdID0gewotCQkweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0LCAweDA0IH07Ci0JczggKnRpYV9nYWluYml0czsKLQlzOCBscGZfZ2Fpbl9kYltdID0geyAweDAwLCAweDA2LCAweDBjLCAweDEyLCAweDEyLCAweDEyIH07Ci0JczggbHBmX2dhaW5iaXRzW10gPSB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDMsIDB4MDMgfTsKLQl1MTYgcmZzZXFHX2luaXRfZ2FpbltdID0geyAweDYxM2YsIDB4NjEzZiwgMHg2MTNmLCAweDYxM2YgfTsKLQl1MTYgcmZzZXFHX2luaXRfZ2Fpbl9yZXY0W10gPSB7IDB4NTEzZiwgMHg1MTNmLCAweDUxM2YsIDB4NTEzZiB9OwotCXUxNiByZnNlcUdfaW5pdF9nYWluX3JldjVbXSA9IHsgMHg0MTNmLCAweDQxM2YsIDB4NDEzZiwgMHg0MTNmIH07Ci0JdTE2IHJmc2VxR19pbml0X2dhaW5fcmV2NV9lbG5hW10gPSB7Ci0JCTB4MDEzZiwgMHgwMTNmLCAweDAxM2YsIDB4MDEzZiB9OwotCXUxNiByZnNlcUdfaW5pdF9nYWluX3JldjZbXSA9IHsgMHg1MTNmLCAweDUxM2YgfTsKLQl1MTYgcmZzZXFHX2luaXRfZ2Fpbl9yZXY2XzIyNEIwW10gPSB7IDB4NDEzZiwgMHg0MTNmIH07Ci0JdTE2IHJmc2VxR19pbml0X2dhaW5fcmV2Nl9lbG5hW10gPSB7IDB4MTEzZiwgMHgxMTNmIH07Ci0JdTE2IHJmc2VxQV9pbml0X2dhaW5bXSA9IHsgMHg1MTZmLCAweDUxNmYsIDB4NTE2ZiwgMHg1MTZmIH07Ci0JdTE2IHJmc2VxQV9pbml0X2dhaW5fcmV2NFtdID0geyAweDYxNGYsIDB4NjE0ZiwgMHg2MTRmLCAweDYxNGYgfTsKLQl1MTYgcmZzZXFBX2luaXRfZ2Fpbl9yZXY0X2VsbmFbXSA9IHsKLQkJMHgzMTRmLCAweDMxNGYsIDB4MzE0ZiwgMHgzMTRmIH07Ci0JdTE2IHJmc2VxQV9pbml0X2dhaW5fcmV2NVtdID0geyAweDcxNGYsIDB4NzE0ZiwgMHg3MTRmLCAweDcxNGYgfTsKLQl1MTYgcmZzZXFBX2luaXRfZ2Fpbl9yZXY2W10gPSB7IDB4NzE0ZiwgMHg3MTRmIH07Ci0JdTE2ICpyZnNlcV9pbml0X2dhaW47Ci0JdTE2IGluaXRHX2dhaW5jb2RlID0gMHg2MjdlOwotCXUxNiBpbml0R19nYWluY29kZV9yZXY0ID0gMHg1MjdlOwotCXUxNiBpbml0R19nYWluY29kZV9yZXY1ID0gMHg0MjdlOwotCXUxNiBpbml0R19nYWluY29kZV9yZXY1X2VsbmEgPSAweDAyN2U7Ci0JdTE2IGluaXRHX2dhaW5jb2RlX3JldjYgPSAweDUyN2U7Ci0JdTE2IGluaXRHX2dhaW5jb2RlX3JldjZfMjI0QjAgPSAweDQyN2U7Ci0JdTE2IGluaXRHX2dhaW5jb2RlX3JldjZfZWxuYSA9IDB4MTI3ZTsKLQl1MTYgaW5pdEFfZ2FpbmNvZGUgPSAweDUyZGU7Ci0JdTE2IGluaXRBX2dhaW5jb2RlX3JldjQgPSAweDYyOWU7Ci0JdTE2IGluaXRBX2dhaW5jb2RlX3JldjRfZWxuYSA9IDB4MzI5ZTsKLQl1MTYgaW5pdEFfZ2FpbmNvZGVfcmV2NSA9IDB4NzI5ZTsKLQl1MTYgaW5pdEFfZ2FpbmNvZGVfcmV2NiA9IDB4NzI5ZTsKLQl1MTYgaW5pdF9nYWluY29kZTsKLQl1MTYgY2xpcDFoaUdfZ2FpbmNvZGUgPSAweDEwN2U7Ci0JdTE2IGNsaXAxaGlHX2dhaW5jb2RlX3JldjQgPSAweDAwN2U7Ci0JdTE2IGNsaXAxaGlHX2dhaW5jb2RlX3JldjUgPSAweDEwNzY7Ci0JdTE2IGNsaXAxaGlHX2dhaW5jb2RlX3JldjYgPSAweDAwN2U7Ci0JdTE2IGNsaXAxaGlBX2dhaW5jb2RlID0gMHgwMGRlOwotCXUxNiBjbGlwMWhpQV9nYWluY29kZV9yZXY0ID0gMHgwMjllOwotCXUxNiBjbGlwMWhpQV9nYWluY29kZV9yZXY1ID0gMHgwMjllOwotCXUxNiBjbGlwMWhpQV9nYWluY29kZV9yZXY2ID0gMHgwMjllOwotCXUxNiBjbGlwMWhpX2dhaW5jb2RlOwotCXUxNiBjbGlwMW1kR19nYWluY29kZSA9IDB4MDA2NjsKLQl1MTYgY2xpcDFtZEFfZ2FpbmNvZGUgPSAweDAwY2E7Ci0JdTE2IGNsaXAxbWRBX2dhaW5jb2RlX3JldjQgPSAweDEwODQ7Ci0JdTE2IGNsaXAxbWRBX2dhaW5jb2RlX3JldjUgPSAweDIwODQ7Ci0JdTE2IGNsaXAxbWRBX2dhaW5jb2RlX3JldjYgPSAweDIwODQ7Ci0JdTE2IGNsaXAxbWRfZ2FpbmNvZGUgPSAwOwotCXUxNiBjbGlwMWxvR19nYWluY29kZSA9IDB4MDA3NDsKLQl1MTYgY2xpcDFsb0dfZ2FpbmNvZGVfcmV2NVtdID0gewotCQkweDAwNjIsIDB4MDA2NCwgMHgwMDZhLCAweDEwNmEsIDB4MTA2YywgMHgxMDc0LCAweDEwN2MsIDB4MjA3YwotCX07Ci0JdTE2IGNsaXAxbG9HX2dhaW5jb2RlX3JldjZbXSA9IHsKLQkJMHgxMDZhLCAweDEwNmMsIDB4MTA3NCwgMHgxMDdjLCAweDAwN2UsIDB4MTA3ZSwgMHgyMDdlLCAweDMwN2UKLQl9OwotCXUxNiBjbGlwMWxvR19nYWluY29kZV9yZXY2XzIyNEIwID0gMHgxMDc0OwotCXUxNiBjbGlwMWxvQV9nYWluY29kZSA9IDB4MDBjYzsKLQl1MTYgY2xpcDFsb0FfZ2FpbmNvZGVfcmV2NCA9IDB4MDA4NjsKLQl1MTYgY2xpcDFsb0FfZ2FpbmNvZGVfcmV2NSA9IDB4MjA4NjsKLQl1MTYgY2xpcDFsb0FfZ2FpbmNvZGVfcmV2NiA9IDB4MjA4NjsKLQl1MTYgY2xpcDFsb19nYWluY29kZTsKLQl1OCBjcnNtaW5HX3RoID0gMHgxODsKLQl1OCBjcnNtaW5HX3RoX3JldjUgPSAweDE4OwotCXU4IGNyc21pbkdfdGhfcmV2NiA9IDB4MTg7Ci0JdTggY3JzbWluQV90aCA9IDB4MWU7Ci0JdTggY3JzbWluQV90aF9yZXY0ID0gMHgyNDsKLQl1OCBjcnNtaW5BX3RoX3JldjUgPSAweDI0OwotCXU4IGNyc21pbkFfdGhfcmV2NiA9IDB4MjQ7Ci0JdTggY3JzbWluX3RoOwotCXU4IGNyc21pbmxHX3RoID0gMHgxODsKLQl1OCBjcnNtaW5sR190aF9yZXY1ID0gMHgxODsKLQl1OCBjcnNtaW5sR190aF9yZXY2ID0gMHgxODsKLQl1OCBjcnNtaW5sQV90aCA9IDB4MWU7Ci0JdTggY3JzbWlubEFfdGhfcmV2NCA9IDB4MjQ7Ci0JdTggY3JzbWlubEFfdGhfcmV2NSA9IDB4MjQ7Ci0JdTggY3JzbWlubEFfdGhfcmV2NiA9IDB4MjQ7Ci0JdTggY3JzbWlubF90aCA9IDA7Ci0JdTggY3JzbWludUdfdGggPSAweDE4OwotCXU4IGNyc21pbnVHX3RoX3JldjUgPSAweDE4OwotCXU4IGNyc21pbnVHX3RoX3JldjYgPSAweDE4OwotCXU4IGNyc21pbnVBX3RoID0gMHgxZTsKLQl1OCBjcnNtaW51QV90aF9yZXY0ID0gMHgyNDsKLQl1OCBjcnNtaW51QV90aF9yZXY1ID0gMHgyNDsKLQl1OCBjcnNtaW51QV90aF9yZXY2ID0gMHgyNDsKLQl1OCBjcnNtaW51QV90aF9yZXY2XzIyNEIwID0gMHgyZDsKLQl1OCBjcnNtaW51X3RoOwotCXUxNiBuYmNsaXBHX3RoID0gMHgyMGQ7Ci0JdTE2IG5iY2xpcEdfdGhfcmV2NCA9IDB4MWExOwotCXUxNiBuYmNsaXBHX3RoX3JldjUgPSAweDFkMDsKLQl1MTYgbmJjbGlwR190aF9yZXY2ID0gMHgxZDA7Ci0JdTE2IG5iY2xpcEFfdGggPSAweDFhMTsKLQl1MTYgbmJjbGlwQV90aF9yZXY0ID0gMHgxMDc7Ci0JdTE2IG5iY2xpcEFfdGhfcmV2NSA9IDB4MGE5OwotCXUxNiBuYmNsaXBBX3RoX3JldjYgPSAweDBmMDsKLQl1MTYgbmJjbGlwX3RoID0gMDsKLQl1OCB3MWNsaXBHX3RoID0gNTsKLQl1OCB3MWNsaXBHX3RoX3JldjUgPSA5OwotCXU4IHcxY2xpcEdfdGhfcmV2NiA9IDU7Ci0JdTggdzFjbGlwQV90aCA9IDI1LCB3MWNsaXBfdGg7Ci0JdTggcnNzaV9nYWluX2RlZmF1bHQgPSAweDUwOwotCXU4IHJzc2lHX2dhaW5fcmV2Nl8yMjRCMCA9IDB4NTA7Ci0JdTggcnNzaUFfZ2Fpbl9yZXY1ID0gMHg5MDsKLQl1OCByc3NpQV9nYWluX3JldjYgPSAweDkwOwotCXU4IHJzc2lfZ2FpbjsKLQl1MTYgcmVndmFsWzIxXTsKLQl1OCB0cmlzbzsKLQotCXRyaXNvID0gKENIU1BFQ19JUzVHKHBpLT5yYWRpb19jaGFuc3BlYykpID8gcGktPnNyb21fZmVtNWcudHJpc28gOgotCSAgICBwaS0+c3JvbV9mZW0yZy50cmlzbzsKLQotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCQlpZiAocGktPnB1YnBpLnJhZGlvcmV2ID09IDUpIHsKLQotCQkJd2xjX3BoeV93b3JrYXJvdW5kc19ucGh5X2dhaW5jdHJsXzIwNTdfcmV2NShwaSk7Ci0JCX0gZWxzZSBpZiAocGktPnB1YnBpLnJhZGlvcmV2ID09IDcpIHsKLQkJCXdsY19waHlfd29ya2Fyb3VuZHNfbnBoeV9nYWluY3RybF8yMDU3X3JldjYocGkpOwotCi0JCQltb2RfcGh5X3JlZyhwaSwgMHgyODMsICgweGZmIDw8IDApLCAoMHg0NCA8PCAwKSk7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHgyODAsICgweGZmIDw8IDApLCAoMHg0NCA8PCAwKSk7Ci0KLQkJfSBlbHNlIGlmICgocGktPnB1YnBpLnJhZGlvcmV2ID09IDMpCi0JCQkgICB8fCAocGktPnB1YnBpLnJhZGlvcmV2ID09IDgpKSB7Ci0JCQl3bGNfcGh5X3dvcmthcm91bmRzX25waHlfZ2FpbmN0cmxfMjA1N19yZXY2KHBpKTsKLQotCQkJaWYgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA4KSB7Ci0JCQkJbW9kX3BoeV9yZWcocGksIDB4MjgzLAotCQkJCQkgICAgKDB4ZmYgPDwgMCksICgweDQ0IDw8IDApKTsKLQkJCQltb2RfcGh5X3JlZyhwaSwgMHgyODAsCi0JCQkJCSAgICAoMHhmZiA8PCAwKSwgKDB4NDQgPDwgMCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJd2xjX3BoeV93b3JrYXJvdW5kc19ucGh5X2dhaW5jdHJsXzIwNTdfcmV2NihwaSk7Ci0JCX0KLQl9IGVsc2UgaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4YTAsICgweDEgPDwgNiksICgxIDw8IDYpKTsKLQotCQltb2RfcGh5X3JlZyhwaSwgMHgxYywgKDB4MSA8PCAxMyksICgxIDw8IDEzKSk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDMyLCAoMHgxIDw8IDEzKSwgKDEgPDwgMTMpKTsKLQotCQljdXJyYmFuZCA9Ci0JCSAgICByZWFkX3BoeV9yZWcocGksIDB4MDkpICYgTlBIWV9CYW5kQ29udHJvbF9jdXJyZW50QmFuZDsKLQkJaWYgKGN1cnJiYW5kID09IDApIHsKLQkJCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA2KSkgewotCQkJCWlmIChwaS0+cHVicGkucmFkaW9yZXYgPT0gMTEpIHsKLQkJCQkJbG5hMV9nYWluX2RiID0gbG5hMUdfZ2Fpbl9kYl9yZXY2XzIyNEIwOwotCQkJCQlsbmEyX2dhaW5fZGIgPSBsbmEyR19nYWluX2RiX3JldjZfMjI0QjA7Ci0JCQkJCXJmc2VxX2luaXRfZ2FpbiA9Ci0JCQkJCSAgICByZnNlcUdfaW5pdF9nYWluX3JldjZfMjI0QjA7Ci0JCQkJCWluaXRfZ2FpbmNvZGUgPQotCQkJCQkgICAgaW5pdEdfZ2FpbmNvZGVfcmV2Nl8yMjRCMDsKLQkJCQkJY2xpcDFoaV9nYWluY29kZSA9Ci0JCQkJCSAgICBjbGlwMWhpR19nYWluY29kZV9yZXY2OwotCQkJCQljbGlwMWxvX2dhaW5jb2RlID0KLQkJCQkJICAgIGNsaXAxbG9HX2dhaW5jb2RlX3JldjZfMjI0QjA7Ci0JCQkJCW5iY2xpcF90aCA9IG5iY2xpcEdfdGhfcmV2NjsKLQkJCQkJdzFjbGlwX3RoID0gdzFjbGlwR190aF9yZXY2OwotCQkJCQljcnNtaW5fdGggPSBjcnNtaW5HX3RoX3JldjY7Ci0JCQkJCWNyc21pbmxfdGggPSBjcnNtaW5sR190aF9yZXY2OwotCQkJCQljcnNtaW51X3RoID0gY3JzbWludUdfdGhfcmV2NjsKLQkJCQkJcnNzaV9nYWluID0gcnNzaUdfZ2Fpbl9yZXY2XzIyNEIwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWxuYTFfZ2Fpbl9kYiA9IGxuYTFHX2dhaW5fZGJfcmV2NjsKLQkJCQkJbG5hMl9nYWluX2RiID0gbG5hMkdfZ2Fpbl9kYl9yZXY2OwotCQkJCQlpZiAocGktPnNoLT5ib2FyZGZsYWdzICYgQkZMX0VYVExOQSkgewotCi0JCQkJCQlyZnNlcV9pbml0X2dhaW4gPQotCQkJCQkJICAgIHJmc2VxR19pbml0X2dhaW5fcmV2Nl9lbG5hOwotCQkJCQkJaW5pdF9nYWluY29kZSA9Ci0JCQkJCQkgICAgaW5pdEdfZ2FpbmNvZGVfcmV2Nl9lbG5hOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmZzZXFfaW5pdF9nYWluID0KLQkJCQkJCSAgICByZnNlcUdfaW5pdF9nYWluX3JldjY7Ci0JCQkJCQlpbml0X2dhaW5jb2RlID0KLQkJCQkJCSAgICBpbml0R19nYWluY29kZV9yZXY2OwotCQkJCQl9Ci0JCQkJCWNsaXAxaGlfZ2FpbmNvZGUgPQotCQkJCQkgICAgY2xpcDFoaUdfZ2FpbmNvZGVfcmV2NjsKLQkJCQkJc3dpdGNoICh0cmlzbykgewotCQkJCQljYXNlIDA6Ci0JCQkJCQljbGlwMWxvX2dhaW5jb2RlID0KLQkJCQkJCSAgICBjbGlwMWxvR19nYWluY29kZV9yZXY2WzBdOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgMToKLQkJCQkJCWNsaXAxbG9fZ2FpbmNvZGUgPQotCQkJCQkJICAgIGNsaXAxbG9HX2dhaW5jb2RlX3JldjZbMV07Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAyOgotCQkJCQkJY2xpcDFsb19nYWluY29kZSA9Ci0JCQkJCQkgICAgY2xpcDFsb0dfZ2FpbmNvZGVfcmV2NlsyXTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDM6Ci0JCQkJCWRlZmF1bHQ6Ci0KLQkJCQkJCWNsaXAxbG9fZ2FpbmNvZGUgPQotCQkJCQkJICAgIGNsaXAxbG9HX2dhaW5jb2RlX3JldjZbM107Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSA0OgotCQkJCQkJY2xpcDFsb19nYWluY29kZSA9Ci0JCQkJCQkgICAgY2xpcDFsb0dfZ2FpbmNvZGVfcmV2Nls0XTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDU6Ci0JCQkJCQljbGlwMWxvX2dhaW5jb2RlID0KLQkJCQkJCSAgICBjbGlwMWxvR19nYWluY29kZV9yZXY2WzVdOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgNjoKLQkJCQkJCWNsaXAxbG9fZ2FpbmNvZGUgPQotCQkJCQkJICAgIGNsaXAxbG9HX2dhaW5jb2RlX3JldjZbNl07Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSA3OgotCQkJCQkJY2xpcDFsb19nYWluY29kZSA9Ci0JCQkJCQkgICAgY2xpcDFsb0dfZ2FpbmNvZGVfcmV2Nls3XTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCW5iY2xpcF90aCA9IG5iY2xpcEdfdGhfcmV2NjsKLQkJCQkJdzFjbGlwX3RoID0gdzFjbGlwR190aF9yZXY2OwotCQkJCQljcnNtaW5fdGggPSBjcnNtaW5HX3RoX3JldjY7Ci0JCQkJCWNyc21pbmxfdGggPSBjcnNtaW5sR190aF9yZXY2OwotCQkJCQljcnNtaW51X3RoID0gY3JzbWludUdfdGhfcmV2NjsKLQkJCQkJcnNzaV9nYWluID0gcnNzaV9nYWluX2RlZmF1bHQ7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCA1KSkgewotCQkJCWxuYTFfZ2Fpbl9kYiA9IGxuYTFHX2dhaW5fZGJfcmV2NTsKLQkJCQlsbmEyX2dhaW5fZGIgPSBsbmEyR19nYWluX2RiX3JldjU7Ci0JCQkJaWYgKHBpLT5zaC0+Ym9hcmRmbGFncyAmIEJGTF9FWFRMTkEpIHsKLQotCQkJCQlyZnNlcV9pbml0X2dhaW4gPQotCQkJCQkgICAgcmZzZXFHX2luaXRfZ2Fpbl9yZXY1X2VsbmE7Ci0JCQkJCWluaXRfZ2FpbmNvZGUgPQotCQkJCQkgICAgaW5pdEdfZ2FpbmNvZGVfcmV2NV9lbG5hOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJmc2VxX2luaXRfZ2FpbiA9IHJmc2VxR19pbml0X2dhaW5fcmV2NTsKLQkJCQkJaW5pdF9nYWluY29kZSA9IGluaXRHX2dhaW5jb2RlX3JldjU7Ci0JCQkJfQotCQkJCWNsaXAxaGlfZ2FpbmNvZGUgPSBjbGlwMWhpR19nYWluY29kZV9yZXY1OwotCQkJCXN3aXRjaCAodHJpc28pIHsKLQkJCQljYXNlIDA6Ci0JCQkJCWNsaXAxbG9fZ2FpbmNvZGUgPQotCQkJCQkgICAgY2xpcDFsb0dfZ2FpbmNvZGVfcmV2NVswXTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOgotCQkJCQljbGlwMWxvX2dhaW5jb2RlID0KLQkJCQkJICAgIGNsaXAxbG9HX2dhaW5jb2RlX3JldjVbMV07Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjoKLQkJCQkJY2xpcDFsb19nYWluY29kZSA9Ci0JCQkJCSAgICBjbGlwMWxvR19nYWluY29kZV9yZXY1WzJdOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDM6Ci0KLQkJCQkJY2xpcDFsb19nYWluY29kZSA9Ci0JCQkJCSAgICBjbGlwMWxvR19nYWluY29kZV9yZXY1WzNdOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDQ6Ci0JCQkJCWNsaXAxbG9fZ2FpbmNvZGUgPQotCQkJCQkgICAgY2xpcDFsb0dfZ2FpbmNvZGVfcmV2NVs0XTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA1OgotCQkJCQljbGlwMWxvX2dhaW5jb2RlID0KLQkJCQkJICAgIGNsaXAxbG9HX2dhaW5jb2RlX3JldjVbNV07Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNjoKLQkJCQkJY2xpcDFsb19nYWluY29kZSA9Ci0JCQkJCSAgICBjbGlwMWxvR19nYWluY29kZV9yZXY1WzZdOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDc6Ci0JCQkJCWNsaXAxbG9fZ2FpbmNvZGUgPQotCQkJCQkgICAgY2xpcDFsb0dfZ2FpbmNvZGVfcmV2NVs3XTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJY2xpcDFsb19nYWluY29kZSA9Ci0JCQkJCSAgICBjbGlwMWxvR19nYWluY29kZV9yZXY1WzNdOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJbmJjbGlwX3RoID0gbmJjbGlwR190aF9yZXY1OwotCQkJCXcxY2xpcF90aCA9IHcxY2xpcEdfdGhfcmV2NTsKLQkJCQljcnNtaW5fdGggPSBjcnNtaW5HX3RoX3JldjU7Ci0JCQkJY3JzbWlubF90aCA9IGNyc21pbmxHX3RoX3JldjU7Ci0JCQkJY3JzbWludV90aCA9IGNyc21pbnVHX3RoX3JldjU7Ci0JCQkJcnNzaV9nYWluID0gcnNzaV9nYWluX2RlZmF1bHQ7Ci0JCQl9IGVsc2UgaWYgKE5SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDQpKSB7Ci0JCQkJbG5hMV9nYWluX2RiID0gbG5hMUdfZ2Fpbl9kYl9yZXY0OwotCQkJCWxuYTJfZ2Fpbl9kYiA9IGxuYTJHX2dhaW5fZGI7Ci0JCQkJcmZzZXFfaW5pdF9nYWluID0gcmZzZXFHX2luaXRfZ2Fpbl9yZXY0OwotCQkJCWluaXRfZ2FpbmNvZGUgPSBpbml0R19nYWluY29kZV9yZXY0OwotCQkJCWNsaXAxaGlfZ2FpbmNvZGUgPSBjbGlwMWhpR19nYWluY29kZV9yZXY0OwotCQkJCWNsaXAxbG9fZ2FpbmNvZGUgPSBjbGlwMWxvR19nYWluY29kZTsKLQkJCQluYmNsaXBfdGggPSBuYmNsaXBHX3RoX3JldjQ7Ci0JCQkJdzFjbGlwX3RoID0gdzFjbGlwR190aDsKLQkJCQljcnNtaW5fdGggPSBjcnNtaW5HX3RoOwotCQkJCWNyc21pbmxfdGggPSBjcnNtaW5sR190aDsKLQkJCQljcnNtaW51X3RoID0gY3JzbWludUdfdGg7Ci0JCQkJcnNzaV9nYWluID0gcnNzaV9nYWluX2RlZmF1bHQ7Ci0JCQl9IGVsc2UgewotCQkJCWxuYTFfZ2Fpbl9kYiA9IGxuYTFHX2dhaW5fZGI7Ci0JCQkJbG5hMl9nYWluX2RiID0gbG5hMkdfZ2Fpbl9kYjsKLQkJCQlyZnNlcV9pbml0X2dhaW4gPSByZnNlcUdfaW5pdF9nYWluOwotCQkJCWluaXRfZ2FpbmNvZGUgPSBpbml0R19nYWluY29kZTsKLQkJCQljbGlwMWhpX2dhaW5jb2RlID0gY2xpcDFoaUdfZ2FpbmNvZGU7Ci0JCQkJY2xpcDFsb19nYWluY29kZSA9IGNsaXAxbG9HX2dhaW5jb2RlOwotCQkJCW5iY2xpcF90aCA9IG5iY2xpcEdfdGg7Ci0JCQkJdzFjbGlwX3RoID0gdzFjbGlwR190aDsKLQkJCQljcnNtaW5fdGggPSBjcnNtaW5HX3RoOwotCQkJCWNyc21pbmxfdGggPSBjcnNtaW5sR190aDsKLQkJCQljcnNtaW51X3RoID0gY3JzbWludUdfdGg7Ci0JCQkJcnNzaV9nYWluID0gcnNzaV9nYWluX2RlZmF1bHQ7Ci0JCQl9Ci0JCQl0aWFfZ2Fpbl9kYiA9IHRpYUdfZ2Fpbl9kYjsKLQkJCXRpYV9nYWluYml0cyA9IHRpYUdfZ2FpbmJpdHM7Ci0JCQljbGlwMW1kX2dhaW5jb2RlID0gY2xpcDFtZEdfZ2FpbmNvZGU7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNikpIHsKLQkJCQlsbmExX2dhaW5fZGIgPSBsbmExQV9nYWluX2RiX3JldjY7Ci0JCQkJbG5hMl9nYWluX2RiID0gbG5hMkFfZ2Fpbl9kYl9yZXY2OwotCQkJCXRpYV9nYWluX2RiID0gdGlhQV9nYWluX2RiX3JldjY7Ci0JCQkJdGlhX2dhaW5iaXRzID0gdGlhQV9nYWluYml0c19yZXY2OwotCQkJCXJmc2VxX2luaXRfZ2FpbiA9IHJmc2VxQV9pbml0X2dhaW5fcmV2NjsKLQkJCQlpbml0X2dhaW5jb2RlID0gaW5pdEFfZ2FpbmNvZGVfcmV2NjsKLQkJCQljbGlwMWhpX2dhaW5jb2RlID0gY2xpcDFoaUFfZ2FpbmNvZGVfcmV2NjsKLQkJCQljbGlwMW1kX2dhaW5jb2RlID0gY2xpcDFtZEFfZ2FpbmNvZGVfcmV2NjsKLQkJCQljbGlwMWxvX2dhaW5jb2RlID0gY2xpcDFsb0FfZ2FpbmNvZGVfcmV2NjsKLQkJCQljcnNtaW5fdGggPSBjcnNtaW5BX3RoX3JldjY7Ci0JCQkJY3JzbWlubF90aCA9IGNyc21pbmxBX3RoX3JldjY7Ci0JCQkJaWYgKChwaS0+cHVicGkucmFkaW9yZXYgPT0gMTEpICYmCi0JCQkJICAgIChDSFNQRUNfSVM0MChwaS0+cmFkaW9fY2hhbnNwZWMpID09IDApKSB7Ci0JCQkJCWNyc21pbnVfdGggPSBjcnNtaW51QV90aF9yZXY2XzIyNEIwOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNyc21pbnVfdGggPSBjcnNtaW51QV90aF9yZXY2OwotCQkJCX0KLQkJCQluYmNsaXBfdGggPSBuYmNsaXBBX3RoX3JldjY7Ci0JCQkJcnNzaV9nYWluID0gcnNzaUFfZ2Fpbl9yZXY2OwotCQkJfSBlbHNlIGlmIChOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCA1KSkgewotCQkJCWxuYTFfZ2Fpbl9kYiA9IGxuYTFBX2dhaW5fZGJfcmV2NTsKLQkJCQlsbmEyX2dhaW5fZGIgPSBsbmEyQV9nYWluX2RiX3JldjU7Ci0JCQkJdGlhX2dhaW5fZGIgPSB0aWFBX2dhaW5fZGJfcmV2NTsKLQkJCQl0aWFfZ2FpbmJpdHMgPSB0aWFBX2dhaW5iaXRzX3JldjU7Ci0JCQkJcmZzZXFfaW5pdF9nYWluID0gcmZzZXFBX2luaXRfZ2Fpbl9yZXY1OwotCQkJCWluaXRfZ2FpbmNvZGUgPSBpbml0QV9nYWluY29kZV9yZXY1OwotCQkJCWNsaXAxaGlfZ2FpbmNvZGUgPSBjbGlwMWhpQV9nYWluY29kZV9yZXY1OwotCQkJCWNsaXAxbWRfZ2FpbmNvZGUgPSBjbGlwMW1kQV9nYWluY29kZV9yZXY1OwotCQkJCWNsaXAxbG9fZ2FpbmNvZGUgPSBjbGlwMWxvQV9nYWluY29kZV9yZXY1OwotCQkJCWNyc21pbl90aCA9IGNyc21pbkFfdGhfcmV2NTsKLQkJCQljcnNtaW5sX3RoID0gY3JzbWlubEFfdGhfcmV2NTsKLQkJCQljcnNtaW51X3RoID0gY3JzbWludUFfdGhfcmV2NTsKLQkJCQluYmNsaXBfdGggPSBuYmNsaXBBX3RoX3JldjU7Ci0JCQkJcnNzaV9nYWluID0gcnNzaUFfZ2Fpbl9yZXY1OwotCQkJfSBlbHNlIGlmIChOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCA0KSkgewotCQkJCWxuYTFfZ2Fpbl9kYiA9IGxuYTFBX2dhaW5fZGJfcmV2NDsKLQkJCQlsbmEyX2dhaW5fZGIgPSBsbmEyQV9nYWluX2RiX3JldjQ7Ci0JCQkJdGlhX2dhaW5fZGIgPSB0aWFBX2dhaW5fZGJfcmV2NDsKLQkJCQl0aWFfZ2FpbmJpdHMgPSB0aWFBX2dhaW5iaXRzX3JldjQ7Ci0JCQkJaWYgKHBpLT5zaC0+Ym9hcmRmbGFncyAmIEJGTF9FWFRMTkFfNUdIeikgewotCi0JCQkJCXJmc2VxX2luaXRfZ2FpbiA9Ci0JCQkJCSAgICByZnNlcUFfaW5pdF9nYWluX3JldjRfZWxuYTsKLQkJCQkJaW5pdF9nYWluY29kZSA9Ci0JCQkJCSAgICBpbml0QV9nYWluY29kZV9yZXY0X2VsbmE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmZzZXFfaW5pdF9nYWluID0gcmZzZXFBX2luaXRfZ2Fpbl9yZXY0OwotCQkJCQlpbml0X2dhaW5jb2RlID0gaW5pdEFfZ2FpbmNvZGVfcmV2NDsKLQkJCQl9Ci0JCQkJY2xpcDFoaV9nYWluY29kZSA9IGNsaXAxaGlBX2dhaW5jb2RlX3JldjQ7Ci0JCQkJY2xpcDFtZF9nYWluY29kZSA9IGNsaXAxbWRBX2dhaW5jb2RlX3JldjQ7Ci0JCQkJY2xpcDFsb19nYWluY29kZSA9IGNsaXAxbG9BX2dhaW5jb2RlX3JldjQ7Ci0JCQkJY3JzbWluX3RoID0gY3JzbWluQV90aF9yZXY0OwotCQkJCWNyc21pbmxfdGggPSBjcnNtaW5sQV90aF9yZXY0OwotCQkJCWNyc21pbnVfdGggPSBjcnNtaW51QV90aF9yZXY0OwotCQkJCW5iY2xpcF90aCA9IG5iY2xpcEFfdGhfcmV2NDsKLQkJCQlyc3NpX2dhaW4gPSByc3NpX2dhaW5fZGVmYXVsdDsKLQkJCX0gZWxzZSB7Ci0JCQkJbG5hMV9nYWluX2RiID0gbG5hMUFfZ2Fpbl9kYjsKLQkJCQlsbmEyX2dhaW5fZGIgPSBsbmEyQV9nYWluX2RiOwotCQkJCXRpYV9nYWluX2RiID0gdGlhQV9nYWluX2RiOwotCQkJCXRpYV9nYWluYml0cyA9IHRpYUFfZ2FpbmJpdHM7Ci0JCQkJcmZzZXFfaW5pdF9nYWluID0gcmZzZXFBX2luaXRfZ2FpbjsKLQkJCQlpbml0X2dhaW5jb2RlID0gaW5pdEFfZ2FpbmNvZGU7Ci0JCQkJY2xpcDFoaV9nYWluY29kZSA9IGNsaXAxaGlBX2dhaW5jb2RlOwotCQkJCWNsaXAxbWRfZ2FpbmNvZGUgPSBjbGlwMW1kQV9nYWluY29kZTsKLQkJCQljbGlwMWxvX2dhaW5jb2RlID0gY2xpcDFsb0FfZ2FpbmNvZGU7Ci0JCQkJY3JzbWluX3RoID0gY3JzbWluQV90aDsKLQkJCQljcnNtaW5sX3RoID0gY3JzbWlubEFfdGg7Ci0JCQkJY3JzbWludV90aCA9IGNyc21pbnVBX3RoOwotCQkJCW5iY2xpcF90aCA9IG5iY2xpcEFfdGg7Ci0JCQkJcnNzaV9nYWluID0gcnNzaV9nYWluX2RlZmF1bHQ7Ci0JCQl9Ci0JCQl3MWNsaXBfdGggPSB3MWNsaXBBX3RoOwotCQl9Ci0KLQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCShSQURJT18yMDU2X1JYX0JJQVNQT0xFX0xOQUcxX0lEQUMgfAotCQkJCSBSQURJT18yMDU2X1JYMCksIDB4MTcpOwotCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJKFJBRElPXzIwNTZfUlhfQklBU1BPTEVfTE5BRzFfSURBQyB8Ci0JCQkJIFJBRElPXzIwNTZfUlgxKSwgMHgxNyk7Ci0KLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCAoUkFESU9fMjA1Nl9SWF9MTkFHMl9JREFDIHwgUkFESU9fMjA1Nl9SWDApLAotCQkJCTB4ZjApOwotCQl3cml0ZV9yYWRpb19yZWcocGksIChSQURJT18yMDU2X1JYX0xOQUcyX0lEQUMgfCBSQURJT18yMDU2X1JYMSksCi0JCQkJMHhmMCk7Ci0KLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCAoUkFESU9fMjA1Nl9SWF9SU1NJX1BPTEUgfCBSQURJT18yMDU2X1JYMCksCi0JCQkJMHgwKTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCAoUkFESU9fMjA1Nl9SWF9SU1NJX1BPTEUgfCBSQURJT18yMDU2X1JYMSksCi0JCQkJMHgwKTsKLQotCQl3cml0ZV9yYWRpb19yZWcocGksIChSQURJT18yMDU2X1JYX1JTU0lfR0FJTiB8IFJBRElPXzIwNTZfUlgwKSwKLQkJCQlyc3NpX2dhaW4pOwotCQl3cml0ZV9yYWRpb19yZWcocGksIChSQURJT18yMDU2X1JYX1JTU0lfR0FJTiB8IFJBRElPXzIwNTZfUlgxKSwKLQkJCQlyc3NpX2dhaW4pOwotCi0JCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkoUkFESU9fMjA1Nl9SWF9CSUFTUE9MRV9MTkFBMV9JREFDIHwKLQkJCQkgUkFESU9fMjA1Nl9SWDApLCAweDE3KTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCShSQURJT18yMDU2X1JYX0JJQVNQT0xFX0xOQUExX0lEQUMgfAotCQkJCSBSQURJT18yMDU2X1JYMSksIDB4MTcpOwotCi0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgKFJBRElPXzIwNTZfUlhfTE5BQTJfSURBQyB8IFJBRElPXzIwNTZfUlgwKSwKLQkJCQkweEZGKTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCAoUkFESU9fMjA1Nl9SWF9MTkFBMl9JREFDIHwgUkFESU9fMjA1Nl9SWDEpLAotCQkJCTB4RkYpOwotCi0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfR0FJTjEsIDQsIDgsCi0JCQkJCSA4LCBsbmExX2dhaW5fZGIpOwotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0dBSU4yLCA0LCA4LAotCQkJCQkgOCwgbG5hMV9nYWluX2RiKTsKLQotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0dBSU4xLCA0LCAweDEwLAotCQkJCQkgOCwgbG5hMl9nYWluX2RiKTsKLQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9HQUlOMiwgNCwgMHgxMCwKLQkJCQkJIDgsIGxuYTJfZ2Fpbl9kYik7Ci0KLQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9HQUlOMSwgMTAsIDB4MjAsCi0JCQkJCSA4LCB0aWFfZ2Fpbl9kYik7Ci0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfR0FJTjIsIDEwLCAweDIwLAotCQkJCQkgOCwgdGlhX2dhaW5fZGIpOwotCi0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfR0FJTkJJVFMxLCAxMCwgMHgyMCwKLQkJCQkJIDgsIHRpYV9nYWluYml0cyk7Ci0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfR0FJTkJJVFMyLCAxMCwgMHgyMCwKLQkJCQkJIDgsIHRpYV9nYWluYml0cyk7Ci0KLQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9HQUlOMSwgNiwgMHg0MCwKLQkJCQkJIDgsICZscGZfZ2Fpbl9kYik7Ci0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfR0FJTjIsIDYsIDB4NDAsCi0JCQkJCSA4LCAmbHBmX2dhaW5fZGIpOwotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0dBSU5CSVRTMSwgNiwgMHg0MCwKLQkJCQkJIDgsICZscGZfZ2FpbmJpdHMpOwotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0dBSU5CSVRTMiwgNiwgMHg0MCwKLQkJCQkJIDgsICZscGZfZ2FpbmJpdHMpOwotCi0JCXdyaXRlX3BoeV9yZWcocGksIDB4MjAsIGluaXRfZ2FpbmNvZGUpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDJhNywgaW5pdF9nYWluY29kZSk7Ci0KLQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9SRlNFUSwKLQkJCQkJIHBpLT5wdWJwaS5waHlfY29yZW51bSwgMHgxMDYsIDE2LAotCQkJCQkgcmZzZXFfaW5pdF9nYWluKTsKLQotCQl3cml0ZV9waHlfcmVnKHBpLCAweDIyLCBjbGlwMWhpX2dhaW5jb2RlKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgyYTksIGNsaXAxaGlfZ2FpbmNvZGUpOwotCi0JCXdyaXRlX3BoeV9yZWcocGksIDB4MjQsIGNsaXAxbWRfZ2FpbmNvZGUpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDJhYiwgY2xpcDFtZF9nYWluY29kZSk7Ci0KLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgzNywgY2xpcDFsb19nYWluY29kZSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MmFkLCBjbGlwMWxvX2dhaW5jb2RlKTsKLQotCQltb2RfcGh5X3JlZyhwaSwgMHgyN2QsICgweGZmIDw8IDApLCAoY3JzbWluX3RoIDw8IDApKTsKLQkJbW9kX3BoeV9yZWcocGksIDB4MjgwLCAoMHhmZiA8PCAwKSwgKGNyc21pbmxfdGggPDwgMCkpOwotCQltb2RfcGh5X3JlZyhwaSwgMHgyODMsICgweGZmIDw8IDApLCAoY3JzbWludV90aCA8PCAwKSk7Ci0KLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgyYiwgbmJjbGlwX3RoKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg0MSwgbmJjbGlwX3RoKTsKLQotCQltb2RfcGh5X3JlZyhwaSwgMHgyNywgKDB4M2YgPDwgMCksICh3MWNsaXBfdGggPDwgMCkpOwotCQltb2RfcGh5X3JlZyhwaSwgMHgzZCwgKDB4M2YgPDwgMCksICh3MWNsaXBfdGggPDwgMCkpOwotCi0JCXdyaXRlX3BoeV9yZWcocGksIDB4MTUwLCAweDgwOWMpOwotCi0JfSBlbHNlIHsKLQotCQltb2RfcGh5X3JlZyhwaSwgMHgxYywgKDB4MSA8PCAxMyksICgxIDw8IDEzKSk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDMyLCAoMHgxIDw8IDEzKSwgKDEgPDwgMTMpKTsKLQotCQl3cml0ZV9waHlfcmVnKHBpLCAweDJiLCAweDg0KTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg0MSwgMHg4NCk7Ci0KLQkJaWYgKENIU1BFQ19JUzIwKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCXdyaXRlX3BoeV9yZWcocGksIDB4NmIsIDB4MmIpOwotCQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg2YywgMHgyYik7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAweDZkLCAweDkpOwotCQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg2ZSwgMHg5KTsKLQkJfQotCi0JCXcxdGggPSBOUEhZX1JTU0lDQUxfVzFfVEFSR0VUIC0gNDsKLQkJbW9kX3BoeV9yZWcocGksIDB4MjcsICgweDNmIDw8IDApLCAodzF0aCA8PCAwKSk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDNkLCAoMHgzZiA8PCAwKSwgKHcxdGggPDwgMCkpOwotCi0JCWlmIChDSFNQRUNfSVMyMChwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHgxYywgKDB4MWYgPDwgMCksICgweDEgPDwgMCkpOwotCQkJbW9kX3BoeV9yZWcocGksIDB4MzIsICgweDFmIDw8IDApLCAoMHgxIDw8IDApKTsKLQotCQkJbW9kX3BoeV9yZWcocGksIDB4MWQsICgweDFmIDw8IDApLCAoMHgxIDw8IDApKTsKLQkJCW1vZF9waHlfcmVnKHBpLCAweDMzLCAoMHgxZiA8PCAwKSwgKDB4MSA8PCAwKSk7Ci0JCX0KLQotCQl3cml0ZV9waHlfcmVnKHBpLCAweDE1MCwgMHg4MDljKTsKLQotCQlpZiAocGktPm5waHlfZ2Fpbl9ib29zdCkKLQkJCWlmICgoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkgJiYKLQkJCSAgICAoQ0hTUEVDX0lTNDAocGktPnJhZGlvX2NoYW5zcGVjKSkpCi0JCQkJaHBmX2NvZGUgPSA0OwotCQkJZWxzZQotCQkJCWhwZl9jb2RlID0gNTsKLQkJZWxzZSBpZiAoQ0hTUEVDX0lTNDAocGktPnJhZGlvX2NoYW5zcGVjKSkKLQkJCWhwZl9jb2RlID0gNjsKLQkJZWxzZQotCQkJaHBmX2NvZGUgPSA3OwotCi0JCW1vZF9waHlfcmVnKHBpLCAweDIwLCAoMHgxZiA8PCA3KSwgKGhwZl9jb2RlIDw8IDcpKTsKLQkJbW9kX3BoeV9yZWcocGksIDB4MzYsICgweDFmIDw8IDcpLCAoaHBmX2NvZGUgPDwgNykpOwotCi0JCWZvciAoY3RyID0gMDsgY3RyIDwgNDsgY3RyKyspIHsKLQkJCXJlZ3ZhbFtjdHJdID0gKGhwZl9jb2RlIDw8IDgpIHwgMHg3YzsKLQkJfQotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIDcsIDQsIDB4MTA2LCAxNiwgcmVndmFsKTsKLQotCQl3bGNfcGh5X2FkanVzdF9sbmFnYWludGJsX25waHkocGkpOwotCi0JCWlmIChwaS0+bnBoeV9lbG5hX2dhaW5fY29uZmlnKSB7Ci0JCQlyZWd2YWxbMF0gPSAwOwotCQkJcmVndmFsWzFdID0gMTsKLQkJCXJlZ3ZhbFsyXSA9IDE7Ci0JCQlyZWd2YWxbM10gPSAxOwotCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCAyLCA0LCA4LCAxNiwgcmVndmFsKTsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgMywgNCwgOCwgMTYsIHJlZ3ZhbCk7Ci0KLQkJCWZvciAoY3RyID0gMDsgY3RyIDwgNDsgY3RyKyspIHsKLQkJCQlyZWd2YWxbY3RyXSA9IChocGZfY29kZSA8PCA4KSB8IDB4NzQ7Ci0JCQl9Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIDcsIDQsIDB4MTA2LCAxNiwgcmVndmFsKTsKLQkJfQotCi0JCWlmIChOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCAyKSkgewotCQkJZm9yIChjdHIgPSAwOyBjdHIgPCAyMTsgY3RyKyspIHsKLQkJCQlyZWd2YWxbY3RyXSA9IDMgKiBjdHI7Ci0JCQl9Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIDAsIDIxLCAzMiwgMTYsIHJlZ3ZhbCk7Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIDEsIDIxLCAzMiwgMTYsIHJlZ3ZhbCk7Ci0KLQkJCWZvciAoY3RyID0gMDsgY3RyIDwgMjE7IGN0cisrKSB7Ci0JCQkJcmVndmFsW2N0cl0gPSAodTE2KSBjdHI7Ci0JCQl9Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIDIsIDIxLCAzMiwgMTYsIHJlZ3ZhbCk7Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIDMsIDIxLCAzMiwgMTYsIHJlZ3ZhbCk7Ci0JCX0KLQotCQl3bGNfcGh5X3NldF9yZnNlcV9ucGh5KHBpLCBOUEhZX1JGU0VRX1VQREFURUdBSU5VLAotCQkJCSAgICAgICByZnNlcV91cGRhdGVnYWludV9ldmVudHMsCi0JCQkJICAgICAgIHJmc2VxX3VwZGF0ZWdhaW51X2RseXMsCi0JCQkJICAgICAgIHNpemVvZihyZnNlcV91cGRhdGVnYWludV9ldmVudHMpIC8KLQkJCQkgICAgICAgc2l6ZW9mKHJmc2VxX3VwZGF0ZWdhaW51X2V2ZW50c1swXSkpOwotCi0JCW1vZF9waHlfcmVnKHBpLCAweDE1MywgKDB4ZmYgPDwgOCksICg5MCA8PCA4KSk7Ci0KLQkJaWYgKENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykpCi0JCQltb2RfcGh5X3JlZyhwaSwKLQkJCQkgICAgKE5QSFlfVE9fQlBIWV9PRkYgKyBCUEhZX09QVElPTkFMX01PREVTKSwKLQkJCQkgICAgMHg3ZiwgMHg0KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHdsY19waHlfd29ya2Fyb3VuZHNfbnBoeV9nYWluY3RybF8yMDU3X3JldjUoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JczggbG5hMV9nYWluX2RiW10gPSB7IDgsIDEzLCAxNywgMjIgfTsKLQlzOCBsbmEyX2dhaW5fZGJbXSA9IHsgLTIsIDcsIDExLCAxNSB9OwotCXM4IHRpYV9nYWluX2RiW10gPSB7IC00LCAtMSwgMiwgNSwgNSwgNSwgNSwgNSwgNSwgNSB9OwotCXM4IHRpYV9nYWluYml0c1tdID0gewotCQkweDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMgfTsKLQotCW1vZF9waHlfcmVnKHBpLCAweDFjLCAoMHgxIDw8IDEzKSwgKDEgPDwgMTMpKTsKLQltb2RfcGh5X3JlZyhwaSwgMHgzMiwgKDB4MSA8PCAxMyksICgxIDw8IDEzKSk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHgyODksICgweGZmIDw8IDApLCAoMHg0NiA8PCAwKSk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHgyODMsICgweGZmIDw8IDApLCAoMHgzYyA8PCAwKSk7Ci0JbW9kX3BoeV9yZWcocGksIDB4MjgwLCAoMHhmZiA8PCAwKSwgKDB4M2MgPDwgMCkpOwotCi0Jd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9HQUlOMSwgNCwgMHg4LCA4LAotCQkJCSBsbmExX2dhaW5fZGIpOwotCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfR0FJTjIsIDQsIDB4OCwgOCwKLQkJCQkgbG5hMV9nYWluX2RiKTsKLQotCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfR0FJTjEsIDQsIDB4MTAsIDgsCi0JCQkJIGxuYTJfZ2Fpbl9kYik7Ci0Jd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9HQUlOMiwgNCwgMHgxMCwgOCwKLQkJCQkgbG5hMl9nYWluX2RiKTsKLQotCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfR0FJTjEsIDEwLCAweDIwLCA4LAotCQkJCSB0aWFfZ2Fpbl9kYik7Ci0Jd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9HQUlOMiwgMTAsIDB4MjAsIDgsCi0JCQkJIHRpYV9nYWluX2RiKTsKLQotCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfR0FJTkJJVFMxLCAxMCwgMHgyMCwgOCwKLQkJCQkgdGlhX2dhaW5iaXRzKTsKLQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0dBSU5CSVRTMiwgMTAsIDB4MjAsIDgsCi0JCQkJIHRpYV9nYWluYml0cyk7Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCAweDM3LCAweDc0KTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDJhZCwgMHg3NCk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHgzOCwgMHgxOCk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHgyYWUsIDB4MTgpOwotCi0Jd3JpdGVfcGh5X3JlZyhwaSwgMHgyYiwgMHhlOCk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHg0MSwgMHhlOCk7Ci0KLQlpZiAoQ0hTUEVDX0lTMjAocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCi0JCW1vZF9waHlfcmVnKHBpLCAweDMwMCwgKDB4M2YgPDwgMCksICgweDEyIDw8IDApKTsKLQkJbW9kX3BoeV9yZWcocGksIDB4MzAxLCAoMHgzZiA8PCAwKSwgKDB4MTIgPDwgMCkpOwotCX0gZWxzZSB7Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4MzAwLCAoMHgzZiA8PCAwKSwgKDB4MTAgPDwgMCkpOwotCQltb2RfcGh5X3JlZyhwaSwgMHgzMDEsICgweDNmIDw8IDApLCAoMHgxMCA8PCAwKSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3dvcmthcm91bmRzX25waHlfZ2FpbmN0cmxfMjA1N19yZXY2KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXUxNiBjdXJyYmFuZDsKLQlzOCBsbmExR19nYWluX2RiX3JldjdbXSA9IHsgOSwgMTQsIDE5LCAyNCB9OwotCXM4ICpsbmExX2dhaW5fZGIgPSBOVUxMOwotCXM4ICpsbmExX2dhaW5fZGJfMiA9IE5VTEw7Ci0JczggKmxuYTJfZ2Fpbl9kYiA9IE5VTEw7Ci0JczggdGlhQV9nYWluX2RiX3JldjdbXSA9IHsgLTksIC02LCAtMywgMCwgMywgMywgMywgMywgMywgMyB9OwotCXM4ICp0aWFfZ2Fpbl9kYjsKLQlzOCB0aWFBX2dhaW5iaXRzX3JldjdbXSA9IHsgMCwgMSwgMiwgMywgNCwgNCwgNCwgNCwgNCwgNCB9OwotCXM4ICp0aWFfZ2FpbmJpdHM7Ci0JdTE2IHJmc2VxQV9pbml0X2dhaW5fcmV2N1tdID0geyAweDYyNGYsIDB4NjI0ZiB9OwotCXUxNiAqcmZzZXFfaW5pdF9nYWluOwotCXUxNiBpbml0X2dhaW5jb2RlOwotCXUxNiBjbGlwMWhpX2dhaW5jb2RlOwotCXUxNiBjbGlwMW1kX2dhaW5jb2RlID0gMDsKLQl1MTYgY2xpcDFtZF9nYWluY29kZV9COwotCXUxNiBjbGlwMWxvX2dhaW5jb2RlOwotCXUxNiBjbGlwMWxvX2dhaW5jb2RlX0I7Ci0JdTggY3JzbWlubF90aCA9IDA7Ci0JdTggY3JzbWludV90aDsKLQl1MTYgbmJjbGlwX3RoID0gMDsKLQl1OCB3MWNsaXBfdGg7Ci0JdTE2IGZyZXE7Ci0JczggbnZhcl9iYXNlbGluZV9vZmZzZXQwID0gMCwgbnZhcl9iYXNlbGluZV9vZmZzZXQxID0gMDsKLQl1OCBjaGdfbmJjbGlwX3RoID0gMDsKLQotCW1vZF9waHlfcmVnKHBpLCAweDFjLCAoMHgxIDw8IDEzKSwgKDEgPDwgMTMpKTsKLQltb2RfcGh5X3JlZyhwaSwgMHgzMiwgKDB4MSA8PCAxMyksICgxIDw8IDEzKSk7Ci0KLQljdXJyYmFuZCA9IHJlYWRfcGh5X3JlZyhwaSwgMHgwOSkgJiBOUEhZX0JhbmRDb250cm9sX2N1cnJlbnRCYW5kOwotCWlmIChjdXJyYmFuZCA9PSAwKSB7Ci0KLQkJbG5hMV9nYWluX2RiID0gbG5hMUdfZ2Fpbl9kYl9yZXY3OwotCi0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfR0FJTjEsIDQsIDgsIDgsCi0JCQkJCSBsbmExX2dhaW5fZGIpOwotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0dBSU4yLCA0LCA4LCA4LAotCQkJCQkgbG5hMV9nYWluX2RiKTsKLQotCQltb2RfcGh5X3JlZyhwaSwgMHgyODMsICgweGZmIDw8IDApLCAoMHg0MCA8PCAwKSk7Ci0KLQkJaWYgKENIU1BFQ19JUzQwKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCW1vZF9waHlfcmVnKHBpLCAweDI4MCwgKDB4ZmYgPDwgMCksICgweDNlIDw8IDApKTsKLQkJCW1vZF9waHlfcmVnKHBpLCAweDI4MywgKDB4ZmYgPDwgMCksICgweDNlIDw8IDApKTsKLQkJfQotCi0JCW1vZF9waHlfcmVnKHBpLCAweDI4OSwgKDB4ZmYgPDwgMCksICgweDQ2IDw8IDApKTsKLQotCQlpZiAoQ0hTUEVDX0lTMjAocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJbW9kX3BoeV9yZWcocGksIDB4MzAwLCAoMHgzZiA8PCAwKSwgKDEzIDw8IDApKTsKLQkJCW1vZF9waHlfcmVnKHBpLCAweDMwMSwgKDB4M2YgPDwgMCksICgxMyA8PCAwKSk7Ci0JCX0KLQl9IGVsc2UgewotCi0JCWluaXRfZ2FpbmNvZGUgPSAweDllOwotCQljbGlwMWhpX2dhaW5jb2RlID0gMHg5ZTsKLQkJY2xpcDFtZF9nYWluY29kZV9CID0gMHgyNDsKLQkJY2xpcDFsb19nYWluY29kZSA9IDB4OGE7Ci0JCWNsaXAxbG9fZ2FpbmNvZGVfQiA9IDg7Ci0JCXJmc2VxX2luaXRfZ2FpbiA9IHJmc2VxQV9pbml0X2dhaW5fcmV2NzsKLQotCQl0aWFfZ2Fpbl9kYiA9IHRpYUFfZ2Fpbl9kYl9yZXY3OwotCQl0aWFfZ2FpbmJpdHMgPSB0aWFBX2dhaW5iaXRzX3Jldjc7Ci0KLQkJZnJlcSA9IENIQU41R19GUkVRKENIU1BFQ19DSEFOTkVMKHBpLT5yYWRpb19jaGFuc3BlYykpOwotCQlpZiAoQ0hTUEVDX0lTMjAocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCi0JCQl3MWNsaXBfdGggPSAyNTsKLQkJCWNsaXAxbWRfZ2FpbmNvZGUgPSAweDgyOwotCi0JCQlpZiAoKGZyZXEgPD0gNTA4MCkgfHwgKGZyZXEgPT0gNTgyNSkpIHsKLQotCQkJCXM4IGxuYTFBX2dhaW5fZGJfcmV2N1tdID0geyAxMSwgMTYsIDIwLCAyNCB9OwotCQkJCXM4IGxuYTFBX2dhaW5fZGJfMl9yZXY3W10gPSB7Ci0JCQkJCTExLCAxNywgMjIsIDI1IH07Ci0JCQkJczggbG5hMkFfZ2Fpbl9kYl9yZXY3W10gPSB7IC0xLCA2LCAxMCwgMTQgfTsKLQotCQkJCWNyc21pbnVfdGggPSAweDNlOwotCQkJCWxuYTFfZ2Fpbl9kYiA9IGxuYTFBX2dhaW5fZGJfcmV2NzsKLQkJCQlsbmExX2dhaW5fZGJfMiA9IGxuYTFBX2dhaW5fZGJfMl9yZXY3OwotCQkJCWxuYTJfZ2Fpbl9kYiA9IGxuYTJBX2dhaW5fZGJfcmV2NzsKLQkJCX0gZWxzZSBpZiAoKGZyZXEgPj0gNTUwMCkgJiYgKGZyZXEgPD0gNTcwMCkpIHsKLQotCQkJCXM4IGxuYTFBX2dhaW5fZGJfcmV2N1tdID0geyAxMSwgMTcsIDIxLCAyNSB9OwotCQkJCXM4IGxuYTFBX2dhaW5fZGJfMl9yZXY3W10gPSB7Ci0JCQkJCTEyLCAxOCwgMjIsIDI2IH07Ci0JCQkJczggbG5hMkFfZ2Fpbl9kYl9yZXY3W10gPSB7IDEsIDgsIDEyLCAxNiB9OwotCi0JCQkJY3JzbWludV90aCA9IDB4NDU7Ci0JCQkJY2xpcDFtZF9nYWluY29kZV9CID0gMHgxNDsKLQkJCQluYmNsaXBfdGggPSAweGZmOwotCQkJCWNoZ19uYmNsaXBfdGggPSAxOwotCQkJCWxuYTFfZ2Fpbl9kYiA9IGxuYTFBX2dhaW5fZGJfcmV2NzsKLQkJCQlsbmExX2dhaW5fZGJfMiA9IGxuYTFBX2dhaW5fZGJfMl9yZXY3OwotCQkJCWxuYTJfZ2Fpbl9kYiA9IGxuYTJBX2dhaW5fZGJfcmV2NzsKLQkJCX0gZWxzZSB7Ci0KLQkJCQlzOCBsbmExQV9nYWluX2RiX3JldjdbXSA9IHsgMTIsIDE4LCAyMiwgMjYgfTsKLQkJCQlzOCBsbmExQV9nYWluX2RiXzJfcmV2N1tdID0gewotCQkJCQkxMiwgMTgsIDIyLCAyNiB9OwotCQkJCXM4IGxuYTJBX2dhaW5fZGJfcmV2N1tdID0geyAtMSwgNiwgMTAsIDE0IH07Ci0KLQkJCQljcnNtaW51X3RoID0gMHg0MTsKLQkJCQlsbmExX2dhaW5fZGIgPSBsbmExQV9nYWluX2RiX3Jldjc7Ci0JCQkJbG5hMV9nYWluX2RiXzIgPSBsbmExQV9nYWluX2RiXzJfcmV2NzsKLQkJCQlsbmEyX2dhaW5fZGIgPSBsbmEyQV9nYWluX2RiX3Jldjc7Ci0JCQl9Ci0KLQkJCWlmIChmcmVxIDw9IDQ5MjApIHsKLQkJCQludmFyX2Jhc2VsaW5lX29mZnNldDAgPSA1OwotCQkJCW52YXJfYmFzZWxpbmVfb2Zmc2V0MSA9IDU7Ci0JCQl9IGVsc2UgaWYgKChmcmVxID4gNDkyMCkgJiYgKGZyZXEgPD0gNTMyMCkpIHsKLQkJCQludmFyX2Jhc2VsaW5lX29mZnNldDAgPSAzOwotCQkJCW52YXJfYmFzZWxpbmVfb2Zmc2V0MSA9IDU7Ci0JCQl9IGVsc2UgaWYgKChmcmVxID4gNTMyMCkgJiYgKGZyZXEgPD0gNTcwMCkpIHsKLQkJCQludmFyX2Jhc2VsaW5lX29mZnNldDAgPSAzOwotCQkJCW52YXJfYmFzZWxpbmVfb2Zmc2V0MSA9IDI7Ci0JCQl9IGVsc2UgewotCQkJCW52YXJfYmFzZWxpbmVfb2Zmc2V0MCA9IDQ7Ci0JCQkJbnZhcl9iYXNlbGluZV9vZmZzZXQxID0gMDsKLQkJCX0KLQkJfSBlbHNlIHsKLQotCQkJY3JzbWludV90aCA9IDB4M2E7Ci0JCQljcnNtaW5sX3RoID0gMHgzYTsKLQkJCXcxY2xpcF90aCA9IDIwOwotCi0JCQlpZiAoKGZyZXEgPj0gNDkyMCkgJiYgKGZyZXEgPD0gNTMyMCkpIHsKLQkJCQludmFyX2Jhc2VsaW5lX29mZnNldDAgPSA0OwotCQkJCW52YXJfYmFzZWxpbmVfb2Zmc2V0MSA9IDU7Ci0JCQl9IGVsc2UgaWYgKChmcmVxID4gNTMyMCkgJiYgKGZyZXEgPD0gNTU1MCkpIHsKLQkJCQludmFyX2Jhc2VsaW5lX29mZnNldDAgPSA0OwotCQkJCW52YXJfYmFzZWxpbmVfb2Zmc2V0MSA9IDI7Ci0JCQl9IGVsc2UgewotCQkJCW52YXJfYmFzZWxpbmVfb2Zmc2V0MCA9IDU7Ci0JCQkJbnZhcl9iYXNlbGluZV9vZmZzZXQxID0gMzsKLQkJCX0KLQkJfQotCi0JCXdyaXRlX3BoeV9yZWcocGksIDB4MjAsIGluaXRfZ2FpbmNvZGUpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDJhNywgaW5pdF9nYWluY29kZSk7Ci0KLQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9SRlNFUSwKLQkJCQkJIHBpLT5wdWJwaS5waHlfY29yZW51bSwgMHgxMDYsIDE2LAotCQkJCQkgcmZzZXFfaW5pdF9nYWluKTsKLQotCQl3cml0ZV9waHlfcmVnKHBpLCAweDIyLCBjbGlwMWhpX2dhaW5jb2RlKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgyYTksIGNsaXAxaGlfZ2FpbmNvZGUpOwotCi0JCXdyaXRlX3BoeV9yZWcocGksIDB4MzYsIGNsaXAxbWRfZ2FpbmNvZGVfQik7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MmFjLCBjbGlwMW1kX2dhaW5jb2RlX0IpOwotCi0JCXdyaXRlX3BoeV9yZWcocGksIDB4MzcsIGNsaXAxbG9fZ2FpbmNvZGUpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDJhZCwgY2xpcDFsb19nYWluY29kZSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MzgsIGNsaXAxbG9fZ2FpbmNvZGVfQik7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MmFlLCBjbGlwMWxvX2dhaW5jb2RlX0IpOwotCi0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfR0FJTjEsIDEwLCAweDIwLCA4LAotCQkJCQkgdGlhX2dhaW5fZGIpOwotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0dBSU4yLCAxMCwgMHgyMCwgOCwKLQkJCQkJIHRpYV9nYWluX2RiKTsKLQotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0dBSU5CSVRTMSwgMTAsIDB4MjAsIDgsCi0JCQkJCSB0aWFfZ2FpbmJpdHMpOwotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0dBSU5CSVRTMiwgMTAsIDB4MjAsIDgsCi0JCQkJCSB0aWFfZ2FpbmJpdHMpOwotCi0JCW1vZF9waHlfcmVnKHBpLCAweDI4MywgKDB4ZmYgPDwgMCksIChjcnNtaW51X3RoIDw8IDApKTsKLQotCQlpZiAoY2hnX25iY2xpcF90aCA9PSAxKSB7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAweDJiLCBuYmNsaXBfdGgpOwotCQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg0MSwgbmJjbGlwX3RoKTsKLQkJfQotCi0JCW1vZF9waHlfcmVnKHBpLCAweDMwMCwgKDB4M2YgPDwgMCksICh3MWNsaXBfdGggPDwgMCkpOwotCQltb2RfcGh5X3JlZyhwaSwgMHgzMDEsICgweDNmIDw8IDApLCAodzFjbGlwX3RoIDw8IDApKTsKLQotCQltb2RfcGh5X3JlZyhwaSwgMHgyZTQsCi0JCQkgICAgKDB4M2YgPDwgMCksIChudmFyX2Jhc2VsaW5lX29mZnNldDAgPDwgMCkpOwotCi0JCW1vZF9waHlfcmVnKHBpLCAweDJlNCwKLQkJCSAgICAoMHgzZiA8PCA2KSwgKG52YXJfYmFzZWxpbmVfb2Zmc2V0MSA8PCA2KSk7Ci0KLQkJaWYgKENIU1BFQ19JUzIwKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQotCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9HQUlOMSwgNCwgOCwgOCwKLQkJCQkJCSBsbmExX2dhaW5fZGIpOwotCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9HQUlOMiwgNCwgOCwgOCwKLQkJCQkJCSBsbmExX2dhaW5fZGJfMik7Ci0KLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfR0FJTjEsIDQsIDB4MTAsCi0JCQkJCQkgOCwgbG5hMl9nYWluX2RiKTsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfR0FJTjIsIDQsIDB4MTAsCi0JCQkJCQkgOCwgbG5hMl9nYWluX2RiKTsKLQotCQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgyNCwgY2xpcDFtZF9nYWluY29kZSk7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAweDJhYiwgY2xpcDFtZF9nYWluY29kZSk7Ci0JCX0gZWxzZSB7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHgyODAsICgweGZmIDw8IDApLCAoY3JzbWlubF90aCA8PCAwKSk7Ci0JCX0KLQotCX0KLQotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X2FkanVzdF9sbmFnYWludGJsX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JdWludCBjb3JlOwotCWludCBjdHI7Ci0JczE2IGdhaW5fZGVsdGFbMl07Ci0JdTggY3Vycl9jaGFubmVsOwotCXUxNiBtaW5tYXhfZ2FpblsyXTsKLQl1MTYgcmVndmFsWzRdOwotCi0JaWYgKHBpLT5waHloYW5nX2F2b2lkKQotCQl3bGNfcGh5X3N0YXlfaW5fY2FycmllcnNlYXJjaF9ucGh5KHBpLCB0cnVlKTsKLQotCWlmIChwaS0+bnBoeV9nYWluX2Jvb3N0KSB7Ci0JCWlmICgoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkpIHsKLQotCQkJZ2Fpbl9kZWx0YVswXSA9IDY7Ci0JCQlnYWluX2RlbHRhWzFdID0gNjsKLQkJfSBlbHNlIHsKLQotCQkJY3Vycl9jaGFubmVsID0gQ0hTUEVDX0NIQU5ORUwocGktPnJhZGlvX2NoYW5zcGVjKTsKLQkJCWdhaW5fZGVsdGFbMF0gPQotCQkJICAgIChzMTYpCi0JCQkgICAgUEhZX0hXX1JPVU5EKCgobnBoeV9sbmFnYWluX2VzdDBbMF0gKgotCQkJCQkgICBjdXJyX2NoYW5uZWwpICsKLQkJCQkJICBucGh5X2xuYWdhaW5fZXN0MFsxXSksIDEzKTsKLQkJCWdhaW5fZGVsdGFbMV0gPQotCQkJICAgIChzMTYpCi0JCQkgICAgUEhZX0hXX1JPVU5EKCgobnBoeV9sbmFnYWluX2VzdDFbMF0gKgotCQkJCQkgICBjdXJyX2NoYW5uZWwpICsKLQkJCQkJICBucGh5X2xuYWdhaW5fZXN0MVsxXSksIDEzKTsKLQkJfQotCX0gZWxzZSB7Ci0KLQkJZ2Fpbl9kZWx0YVswXSA9IDA7Ci0JCWdhaW5fZGVsdGFbMV0gPSAwOwotCX0KLQotCWZvciAoY29yZSA9IDA7IGNvcmUgPCBwaS0+cHVicGkucGh5X2NvcmVudW07IGNvcmUrKykgewotCQlpZiAocGktPm5waHlfZWxuYV9nYWluX2NvbmZpZykgewotCi0JCQlyZWd2YWxbMF0gPSBucGh5X2RlZl9sbmFnYWluc1syXSArIGdhaW5fZGVsdGFbY29yZV07Ci0JCQlyZWd2YWxbMV0gPSBucGh5X2RlZl9sbmFnYWluc1szXSArIGdhaW5fZGVsdGFbY29yZV07Ci0JCQlyZWd2YWxbMl0gPSBucGh5X2RlZl9sbmFnYWluc1szXSArIGdhaW5fZGVsdGFbY29yZV07Ci0JCQlyZWd2YWxbM10gPSBucGh5X2RlZl9sbmFnYWluc1szXSArIGdhaW5fZGVsdGFbY29yZV07Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGN0ciA9IDA7IGN0ciA8IDQ7IGN0cisrKSB7Ci0JCQkJcmVndmFsW2N0cl0gPQotCQkJCSAgICBucGh5X2RlZl9sbmFnYWluc1tjdHJdICsgZ2Fpbl9kZWx0YVtjb3JlXTsKLQkJCX0KLQkJfQotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIGNvcmUsIDQsIDgsIDE2LCByZWd2YWwpOwotCi0JCW1pbm1heF9nYWluW2NvcmVdID0KLQkJICAgICh1MTYpIChucGh5X2RlZl9sbmFnYWluc1syXSArIGdhaW5fZGVsdGFbY29yZV0gKyA0KTsKLQl9Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHgxZSwgKDB4ZmYgPDwgMCksIChtaW5tYXhfZ2FpblswXSA8PCAwKSk7Ci0JbW9kX3BoeV9yZWcocGksIDB4MzQsICgweGZmIDw8IDApLCAobWlubWF4X2dhaW5bMV0gPDwgMCkpOwotCi0JaWYgKHBpLT5waHloYW5nX2F2b2lkKQotCQl3bGNfcGh5X3N0YXlfaW5fY2FycmllcnNlYXJjaF9ucGh5KHBpLCBmYWxzZSk7Ci19Ci0KLXZvaWQgd2xjX3BoeV9zd2l0Y2hfcmFkaW9fbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgYm9vbCBvbikKLXsKLQlpZiAob24pIHsKLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCQlpZiAoIXBpLT5yYWRpb19pc19vbikgewotCQkJCXdsY19waHlfcmFkaW9fcHJlaW5pdF8yMDV4KHBpKTsKLQkJCQl3bGNfcGh5X3JhZGlvX2luaXRfMjA1NyhwaSk7Ci0JCQkJd2xjX3BoeV9yYWRpb19wb3N0aW5pdF8yMDU3KHBpKTsKLQkJCX0KLQotCQkJd2xjX3BoeV9jaGFuc3BlY19zZXQoKHN0cnVjdCBicmNtc19waHlfcHViICopIHBpLAotCQkJCQkgICAgIHBpLT5yYWRpb19jaGFuc3BlYyk7Ci0JCX0gZWxzZSBpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJCXdsY19waHlfcmFkaW9fcHJlaW5pdF8yMDV4KHBpKTsKLQkJCXdsY19waHlfcmFkaW9faW5pdF8yMDU2KHBpKTsKLQkJCXdsY19waHlfcmFkaW9fcG9zdGluaXRfMjA1NihwaSk7Ci0KLQkJCXdsY19waHlfY2hhbnNwZWNfc2V0KChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqKSBwaSwKLQkJCQkJICAgICBwaS0+cmFkaW9fY2hhbnNwZWMpOwotCQl9IGVsc2UgewotCQkJd2xjX3BoeV9yYWRpb19wcmVpbml0XzIwNTUocGkpOwotCQkJd2xjX3BoeV9yYWRpb19pbml0XzIwNTUocGkpOwotCQkJd2xjX3BoeV9yYWRpb19wb3N0aW5pdF8yMDU1KHBpKTsKLQkJfQotCi0JCXBpLT5yYWRpb19pc19vbiA9IHRydWU7Ci0KLQl9IGVsc2UgewotCi0JCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKQotCQkgICAgJiYgTlJFVl9MVChwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQkJCWFuZF9waHlfcmVnKHBpLCAweDc4LCB+UkZDQ19DSElQMF9QVSk7Ci0JCQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU2X1NZTl9DT01fUFUsIDB4MiwgMHgwKTsKLQotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQlSQURJT18yMDU2X1RYX1BBREFfQk9PU1RfVFVORSB8Ci0JCQkJCVJBRElPXzIwNTZfVFgwLCAwKTsKLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJUkFESU9fMjA1Nl9UWF9QQURHX0JPT1NUX1RVTkUgfAotCQkJCQlSQURJT18yMDU2X1RYMCwgMCk7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCVJBRElPXzIwNTZfVFhfUEdBQV9CT09TVF9UVU5FIHwKLQkJCQkJUkFESU9fMjA1Nl9UWDAsIDApOwotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQlSQURJT18yMDU2X1RYX1BHQUdfQk9PU1RfVFVORSB8Ci0JCQkJCVJBRElPXzIwNTZfVFgwLCAwKTsKLQkJCW1vZF9yYWRpb19yZWcocGksCi0JCQkJICAgICAgUkFESU9fMjA1Nl9UWF9NSVhBX0JPT1NUX1RVTkUgfAotCQkJCSAgICAgIFJBRElPXzIwNTZfVFgwLCAweGYwLCAwKTsKLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJUkFESU9fMjA1Nl9UWF9NSVhHX0JPT1NUX1RVTkUgfAotCQkJCQlSQURJT18yMDU2X1RYMCwgMCk7Ci0KLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJUkFESU9fMjA1Nl9UWF9QQURBX0JPT1NUX1RVTkUgfAotCQkJCQlSQURJT18yMDU2X1RYMSwgMCk7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCVJBRElPXzIwNTZfVFhfUEFER19CT09TVF9UVU5FIHwKLQkJCQkJUkFESU9fMjA1Nl9UWDEsIDApOwotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQlSQURJT18yMDU2X1RYX1BHQUFfQk9PU1RfVFVORSB8Ci0JCQkJCVJBRElPXzIwNTZfVFgxLCAwKTsKLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJUkFESU9fMjA1Nl9UWF9QR0FHX0JPT1NUX1RVTkUgfAotCQkJCQlSQURJT18yMDU2X1RYMSwgMCk7Ci0JCQltb2RfcmFkaW9fcmVnKHBpLAotCQkJCSAgICAgIFJBRElPXzIwNTZfVFhfTUlYQV9CT09TVF9UVU5FIHwKLQkJCQkgICAgICBSQURJT18yMDU2X1RYMSwgMHhmMCwgMCk7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCVJBRElPXzIwNTZfVFhfTUlYR19CT09TVF9UVU5FIHwKLQkJCQkJUkFESU9fMjA1Nl9UWDEsIDApOwotCi0JCQlwaS0+cmFkaW9faXNfb24gPSBmYWxzZTsKLQkJfQotCi0JCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA4KSkgewotCQkJYW5kX3BoeV9yZWcocGksIDB4NzgsIH5SRkNDX0NISVAwX1BVKTsKLQkJCXBpLT5yYWRpb19pc19vbiA9IGZhbHNlOwotCQl9Ci0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHdsY19waHlfcmFkaW9fcHJlaW5pdF8yMDU1KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCi0JYW5kX3BoeV9yZWcocGksIDB4NzgsIH5SRkNDX1BPUl9GT1JDRSk7Ci0Jb3JfcGh5X3JlZyhwaSwgMHg3OCwgUkZDQ19DSElQMF9QVSB8IFJGQ0NfT0VfUE9SX0ZPUkNFKTsKLQotCW9yX3BoeV9yZWcocGksIDB4NzgsIFJGQ0NfUE9SX0ZPUkNFKTsKLX0KLQotc3RhdGljIHZvaWQgd2xjX3BoeV9yYWRpb19pbml0XzIwNTUoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0Jd2xjX3BoeV9pbml0X3JhZGlvX3JlZ3MocGksIHJlZ3NfMjA1NSwgUkFESU9fREVGQVVMVF9DT1JFKTsKLX0KLQotc3RhdGljIHZvaWQgd2xjX3BoeV9yYWRpb19wb3N0aW5pdF8yMDU1KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCi0JYW5kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9NQVNURVJfQ05UUkwxLAotCQkgICAgICB+KFJBRElPXzIwNTVfSlRBR0NUUkxfTUFTSyB8IFJBRElPXzIwNTVfSlRBR1NZTkNfTUFTSykpOwotCi0JaWYgKCgocGktPnNoLT5zcm9tcmV2ID49IDQpCi0JICAgICAmJiAhKHBpLT5zaC0+Ym9hcmRmbGFnczIgJiBCRkwyX1JYQkJfSU5UX1JFR19ESVMpKQotCSAgICB8fCAoKHBpLT5zaC0+c3JvbXJldiA8IDQpKSkgewotCQlhbmRfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUxX1JYQkJfUkVHVUxBVE9SLCAweDdGKTsKLQkJYW5kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMl9SWEJCX1JFR1VMQVRPUiwgMHg3Rik7Ci0JfQotCi0JbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9SUkNDQUxfTl9PUFRfU0VMLCAweDNGLCAweDJDKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ0FMX01JU0MsIDB4M0MpOwotCi0JYW5kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DQUxfTUlTQywKLQkJICAgICAgfihSQURJT18yMDU1X1JSQ0FMX1NUQVJUIHwgUkFESU9fMjA1NV9SUkNBTF9SU1RfTikpOwotCi0Jb3JfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NBTF9MUE9fQ05UUkwsIFJBRElPXzIwNTVfQ0FMX0xQT19FTkFCTEUpOwotCi0Jb3JfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NBTF9NSVNDLCBSQURJT18yMDU1X1JSQ0FMX1JTVF9OKTsKLQotCXVkZWxheSgxMDAwKTsKLQotCW9yX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DQUxfTUlTQywgUkFESU9fMjA1NV9SUkNBTF9TVEFSVCk7Ci0KLQlTUElOV0FJVCgoKHJlYWRfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NBTF9DT1VOVEVSX09VVDIpICYKLQkJICAgUkFESU9fMjA1NV9SQ0FMX0RPTkUpICE9IFJBRElPXzIwNTVfUkNBTF9ET05FKSwgMjAwMCk7Ci0KLQlpZiAoV0FSTigocmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ0FMX0NPVU5URVJfT1VUMikgJgotCQkgUkFESU9fMjA1NV9SQ0FMX0RPTkUpICE9IFJBRElPXzIwNTVfUkNBTF9ET05FLAotCQkgIkhXIGVycm9yOiByYWRpbyBjYWxpYnJhdGlvbjFcbiIpKQotCQlyZXR1cm47Ci0KLQlhbmRfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NBTF9MUE9fQ05UUkwsCi0JCSAgICAgIH4oUkFESU9fMjA1NV9DQUxfTFBPX0VOQUJMRSkpOwotCi0Jd2xjX3BoeV9jaGFuc3BlY19zZXQoKHN0cnVjdCBicmNtc19waHlfcHViICopIHBpLCBwaS0+cmFkaW9fY2hhbnNwZWMpOwotCi0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUxX1JYQkJfTFBGLCA5KTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTJfUlhCQl9MUEYsIDkpOwotCi0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUxX1JYQkJfTUlEQUNfSElQQVMsIDB4ODMpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMl9SWEJCX01JREFDX0hJUEFTLCAweDgzKTsKLQotCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTFfTE5BX0dBSU5CU1QsCi0JCSAgICAgIFJBRElPXzIwNTVfR0FJTkJTVF9WQUxfTUFTSywgUkFESU9fMjA1NV9HQUlOQlNUX0NPREUpOwotCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTJfTE5BX0dBSU5CU1QsCi0JCSAgICAgIFJBRElPXzIwNTVfR0FJTkJTVF9WQUxfTUFTSywgUkFESU9fMjA1NV9HQUlOQlNUX0NPREUpOwotCWlmIChwaS0+bnBoeV9nYWluX2Jvb3N0KSB7Ci0JCWFuZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTFfUlhSRl9TUEMxLAotCQkJICAgICAgfihSQURJT18yMDU1X0dBSU5CU1RfRElTQUJMRSkpOwotCQlhbmRfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUyX1JYUkZfU1BDMSwKLQkJCSAgICAgIH4oUkFESU9fMjA1NV9HQUlOQlNUX0RJU0FCTEUpKTsKLQl9IGVsc2UgewotCQlvcl9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTFfUlhSRl9TUEMxLAotCQkJICAgICBSQURJT18yMDU1X0dBSU5CU1RfRElTQUJMRSk7Ci0JCW9yX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMl9SWFJGX1NQQzEsCi0JCQkgICAgIFJBRElPXzIwNTVfR0FJTkJTVF9ESVNBQkxFKTsKLQl9Ci0KLQl1ZGVsYXkoMik7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsY19waHlfcmFkaW9fcHJlaW5pdF8yMDV4KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCi0JYW5kX3BoeV9yZWcocGksIDB4NzgsIH5SRkNDX0NISVAwX1BVKTsKLQlhbmRfcGh5X3JlZyhwaSwgMHg3OCwgUkZDQ19PRV9QT1JfRk9SQ0UpOwotCi0Jb3JfcGh5X3JlZyhwaSwgMHg3OCwgflJGQ0NfT0VfUE9SX0ZPUkNFKTsKLQlvcl9waHlfcmVnKHBpLCAweDc4LCBSRkNDX0NISVAwX1BVKTsKLQotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3JhZGlvX2luaXRfMjA1NihzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQlzdHJ1Y3QgcmFkaW9fcmVncyAqcmVnc19TWU5fMjA1Nl9wdHIgPSBOVUxMOwotCXN0cnVjdCByYWRpb19yZWdzICpyZWdzX1RYXzIwNTZfcHRyID0gTlVMTDsKLQlzdHJ1Y3QgcmFkaW9fcmVncyAqcmVnc19SWF8yMDU2X3B0ciA9IE5VTEw7Ci0KLQlpZiAoTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJcmVnc19TWU5fMjA1Nl9wdHIgPSByZWdzX1NZTl8yMDU2OwotCQlyZWdzX1RYXzIwNTZfcHRyID0gcmVnc19UWF8yMDU2OwotCQlyZWdzX1JYXzIwNTZfcHRyID0gcmVnc19SWF8yMDU2OwotCX0gZWxzZSBpZiAoTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgNCkpIHsKLQkJcmVnc19TWU5fMjA1Nl9wdHIgPSByZWdzX1NZTl8yMDU2X0ExOwotCQlyZWdzX1RYXzIwNTZfcHRyID0gcmVnc19UWF8yMDU2X0ExOwotCQlyZWdzX1JYXzIwNTZfcHRyID0gcmVnc19SWF8yMDU2X0ExOwotCX0gZWxzZSB7Ci0JCXN3aXRjaCAocGktPnB1YnBpLnJhZGlvcmV2KSB7Ci0JCWNhc2UgNToKLQkJCXJlZ3NfU1lOXzIwNTZfcHRyID0gcmVnc19TWU5fMjA1Nl9yZXY1OwotCQkJcmVnc19UWF8yMDU2X3B0ciA9IHJlZ3NfVFhfMjA1Nl9yZXY1OwotCQkJcmVnc19SWF8yMDU2X3B0ciA9IHJlZ3NfUlhfMjA1Nl9yZXY1OwotCQkJYnJlYWs7Ci0KLQkJY2FzZSA2OgotCQkJcmVnc19TWU5fMjA1Nl9wdHIgPSByZWdzX1NZTl8yMDU2X3JldjY7Ci0JCQlyZWdzX1RYXzIwNTZfcHRyID0gcmVnc19UWF8yMDU2X3JldjY7Ci0JCQlyZWdzX1JYXzIwNTZfcHRyID0gcmVnc19SWF8yMDU2X3JldjY7Ci0JCQlicmVhazsKLQotCQljYXNlIDc6Ci0JCWNhc2UgOToKLQkJCXJlZ3NfU1lOXzIwNTZfcHRyID0gcmVnc19TWU5fMjA1Nl9yZXY3OwotCQkJcmVnc19UWF8yMDU2X3B0ciA9IHJlZ3NfVFhfMjA1Nl9yZXY3OwotCQkJcmVnc19SWF8yMDU2X3B0ciA9IHJlZ3NfUlhfMjA1Nl9yZXY3OwotCQkJYnJlYWs7Ci0KLQkJY2FzZSA4OgotCQkJcmVnc19TWU5fMjA1Nl9wdHIgPSByZWdzX1NZTl8yMDU2X3Jldjg7Ci0JCQlyZWdzX1RYXzIwNTZfcHRyID0gcmVnc19UWF8yMDU2X3Jldjg7Ci0JCQlyZWdzX1JYXzIwNTZfcHRyID0gcmVnc19SWF8yMDU2X3Jldjg7Ci0JCQlicmVhazsKLQotCQljYXNlIDExOgotCQkJcmVnc19TWU5fMjA1Nl9wdHIgPSByZWdzX1NZTl8yMDU2X3JldjExOwotCQkJcmVnc19UWF8yMDU2X3B0ciA9IHJlZ3NfVFhfMjA1Nl9yZXYxMTsKLQkJCXJlZ3NfUlhfMjA1Nl9wdHIgPSByZWdzX1JYXzIwNTZfcmV2MTE7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQl3bGNfcGh5X2luaXRfcmFkaW9fcmVncyhwaSwgcmVnc19TWU5fMjA1Nl9wdHIsICh1MTYpIFJBRElPXzIwNTZfU1lOKTsKLQotCXdsY19waHlfaW5pdF9yYWRpb19yZWdzKHBpLCByZWdzX1RYXzIwNTZfcHRyLCAodTE2KSBSQURJT18yMDU2X1RYMCk7Ci0KLQl3bGNfcGh5X2luaXRfcmFkaW9fcmVncyhwaSwgcmVnc19UWF8yMDU2X3B0ciwgKHUxNikgUkFESU9fMjA1Nl9UWDEpOwotCi0Jd2xjX3BoeV9pbml0X3JhZGlvX3JlZ3MocGksIHJlZ3NfUlhfMjA1Nl9wdHIsICh1MTYpIFJBRElPXzIwNTZfUlgwKTsKLQotCXdsY19waHlfaW5pdF9yYWRpb19yZWdzKHBpLCByZWdzX1JYXzIwNTZfcHRyLCAodTE2KSBSQURJT18yMDU2X1JYMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsY19waHlfcmFkaW9fcG9zdGluaXRfMjA1NihzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU2X1NZTl9DT01fQ1RSTCwgMHhiLCAweGIpOwotCi0JbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9TWU5fQ09NX1BVLCAweDIsIDB4Mik7Ci0JbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9TWU5fQ09NX1JFU0VULCAweDIsIDB4Mik7Ci0JdWRlbGF5KDEwMDApOwotCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfU1lOX0NPTV9SRVNFVCwgMHgyLCAweDApOwotCi0JaWYgKChwaS0+c2gtPmJvYXJkZmxhZ3MyICYgQkZMMl9MRUdBQ1kpCi0JICAgIHx8IChwaS0+c2gtPmJvYXJkZmxhZ3MyICYgQkZMMl9YVEFMQlVGT1VURU4pKSB7Ci0KLQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9TWU5fUExMX01BU1QyLCAweGY0LCAweDApOwotCX0gZWxzZSB7Ci0KLQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9TWU5fUExMX01BU1QyLCAweGZjLCAweDApOwotCX0KLQotCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfU1lOX1JDQ0FMX0NUUkwwLCAweDEsIDB4MCk7Ci0KLQlpZiAocGktPnBoeV9pbml0X3BvcikgewotCQl3bGNfcGh5X3JhZGlvMjA1eF9yY2FsKHBpKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHdsY19waHlfcmFkaW9faW5pdF8yMDU3KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXN0cnVjdCByYWRpb18yMHh4X3JlZ3MgKnJlZ3NfMjA1N19wdHIgPSBOVUxMOwotCi0JaWYgKE5SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0KLQkJcmVnc18yMDU3X3B0ciA9IHJlZ3NfMjA1N19yZXY0OwotCX0gZWxzZSBpZiAoTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgOCkKLQkJICAgfHwgTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgOSkpIHsKLQkJc3dpdGNoIChwaS0+cHVicGkucmFkaW9yZXYpIHsKLQkJY2FzZSA1OgotCi0JCQlpZiAocGktPnB1YnBpLnJhZGlvdmVyID09IDB4MCkgewotCi0JCQkJcmVnc18yMDU3X3B0ciA9IHJlZ3NfMjA1N19yZXY1OwotCi0JCQl9IGVsc2UgaWYgKHBpLT5wdWJwaS5yYWRpb3ZlciA9PSAweDEpIHsKLQotCQkJCXJlZ3NfMjA1N19wdHIgPSByZWdzXzIwNTdfcmV2NXYxOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsKLQkJCX0KLQotCQljYXNlIDc6Ci0KLQkJCXJlZ3NfMjA1N19wdHIgPSByZWdzXzIwNTdfcmV2NzsKLQkJCWJyZWFrOwotCi0JCWNhc2UgODoKLQotCQkJcmVnc18yMDU3X3B0ciA9IHJlZ3NfMjA1N19yZXY4OwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0Jd2xjX3BoeV9pbml0X3JhZGlvX3JlZ3NfYWxsYmFuZHMocGksIHJlZ3NfMjA1N19wdHIpOwotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3JhZGlvX3Bvc3Rpbml0XzIwNTcoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0KLQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1hUQUxQVU9WUl9QSU5DVFJMLCAweDEsIDB4MSk7Ci0KLQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1JGUExMX01JU0NfQ0FMX1JFU0VUTiwgMHg3OCwgMHg3OCk7Ci0JbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19YVEFMX0NPTkZJRzIsIDB4ODAsIDB4ODApOwotCW1kZWxheSgyKTsKLQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1JGUExMX01JU0NfQ0FMX1JFU0VUTiwgMHg3OCwgMHgwKTsKLQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1hUQUxfQ09ORklHMiwgMHg4MCwgMHgwKTsKLQotCWlmIChwaS0+cGh5X2luaXRfcG9yKSB7Ci0JCXdsY19waHlfcmFkaW8yMDV4X3JjYWwocGkpOwotCQl3bGNfcGh5X3JhZGlvMjA1N19yY2NhbChwaSk7Ci0JfQotCi0JbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19SRlBMTF9NQVNURVIsIDB4OCwgMHgwKTsKLX0KLQotc3RhdGljIGJvb2wKLXdsY19waHlfY2hhbjJmcmVxX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHVpbnQgY2hhbm5lbCwgaW50ICpmLAotCQkgICAgICAgc3RydWN0IGNoYW5faW5mb19ucGh5X3JhZGlvMjA1NyAqKnQwLAotCQkgICAgICAgc3RydWN0IGNoYW5faW5mb19ucGh5X3JhZGlvMjA1eCAqKnQxLAotCQkgICAgICAgc3RydWN0IGNoYW5faW5mb19ucGh5X3JhZGlvMjA1N19yZXY1ICoqdDIsCi0JCSAgICAgICBzdHJ1Y3QgY2hhbl9pbmZvX25waHlfMjA1NSAqKnQzKQotewotCXVpbnQgaTsKLQlzdHJ1Y3QgY2hhbl9pbmZvX25waHlfcmFkaW8yMDU3ICpjaGFuX2luZm9fdGJsX3BfMCA9IE5VTEw7Ci0Jc3RydWN0IGNoYW5faW5mb19ucGh5X3JhZGlvMjA1eCAqY2hhbl9pbmZvX3RibF9wXzEgPSBOVUxMOwotCXN0cnVjdCBjaGFuX2luZm9fbnBoeV9yYWRpbzIwNTdfcmV2NSAqY2hhbl9pbmZvX3RibF9wXzIgPSBOVUxMOwotCXUzMiB0YmxfbGVuID0gMDsKLQotCWludCBmcmVxID0gMDsKLQotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCi0JCWlmIChOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCi0JCQljaGFuX2luZm9fdGJsX3BfMCA9IGNoYW5faW5mb19ucGh5cmV2N18yMDU3X3JldjQ7Ci0JCQl0YmxfbGVuID0gQVJSQVlfU0laRShjaGFuX2luZm9fbnBoeXJldjdfMjA1N19yZXY0KTsKLQotCQl9IGVsc2UgaWYgKE5SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDgpCi0JCQkgICB8fCBOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCA5KSkgewotCQkJc3dpdGNoIChwaS0+cHVicGkucmFkaW9yZXYpIHsKLQotCQkJY2FzZSA1OgotCi0JCQkJaWYgKHBpLT5wdWJwaS5yYWRpb3ZlciA9PSAweDApIHsKLQotCQkJCQljaGFuX2luZm9fdGJsX3BfMiA9Ci0JCQkJCSAgICBjaGFuX2luZm9fbnBoeXJldjhfMjA1N19yZXY1OwotCQkJCQl0YmxfbGVuID0KLQkJCQkJICAgIEFSUkFZX1NJWkUKLQkJCQkJICAgIChjaGFuX2luZm9fbnBoeXJldjhfMjA1N19yZXY1KTsKLQotCQkJCX0gZWxzZSBpZiAocGktPnB1YnBpLnJhZGlvdmVyID09IDB4MSkgewotCi0JCQkJCWNoYW5faW5mb190YmxfcF8yID0KLQkJCQkJICAgIGNoYW5faW5mb19ucGh5cmV2OV8yMDU3X3JldjV2MTsKLQkJCQkJdGJsX2xlbiA9Ci0JCQkJCSAgICBBUlJBWV9TSVpFCi0JCQkJCSAgICAoY2hhbl9pbmZvX25waHlyZXY5XzIwNTdfcmV2NXYxKTsKLQotCQkJCX0KLQkJCQlicmVhazsKLQotCQkJY2FzZSA3OgotCQkJCWNoYW5faW5mb190YmxfcF8wID0KLQkJCQkgICAgY2hhbl9pbmZvX25waHlyZXY4XzIwNTdfcmV2NzsKLQkJCQl0YmxfbGVuID0KLQkJCQkgICAgQVJSQVlfU0laRShjaGFuX2luZm9fbnBoeXJldjhfMjA1N19yZXY3KTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSA4OgotCQkJCWNoYW5faW5mb190YmxfcF8wID0KLQkJCQkgICAgY2hhbl9pbmZvX25waHlyZXY4XzIwNTdfcmV2ODsKLQkJCQl0YmxfbGVuID0KLQkJCQkgICAgQVJSQVlfU0laRShjaGFuX2luZm9fbnBoeXJldjhfMjA1N19yZXY4KTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlpZiAoTk9SQURJT19FTkFCKHBpLT5wdWJwaSkpIHsKLQkJCQkJZ290byBmYWlsOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIGlmIChOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCAxNikpIHsKLQotCQkJY2hhbl9pbmZvX3RibF9wXzAgPSBjaGFuX2luZm9fbnBoeXJldjhfMjA1N19yZXY4OwotCQkJdGJsX2xlbiA9IEFSUkFZX1NJWkUoY2hhbl9pbmZvX25waHlyZXY4XzIwNTdfcmV2OCk7Ci0JCX0gZWxzZSB7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQotCQlmb3IgKGkgPSAwOyBpIDwgdGJsX2xlbjsgaSsrKSB7Ci0JCQlpZiAocGktPnB1YnBpLnJhZGlvcmV2ID09IDUpIHsKLQotCQkJCWlmIChjaGFuX2luZm9fdGJsX3BfMltpXS5jaGFuID09IGNoYW5uZWwpCi0JCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQotCQkJCWlmIChjaGFuX2luZm9fdGJsX3BfMFtpXS5jaGFuID09IGNoYW5uZWwpCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKGkgPj0gdGJsX2xlbikgewotCQkJZ290byBmYWlsOwotCQl9Ci0JCWlmIChwaS0+cHVicGkucmFkaW9yZXYgPT0gNSkgewotCQkJKnQyID0gJmNoYW5faW5mb190YmxfcF8yW2ldOwotCQkJZnJlcSA9IGNoYW5faW5mb190YmxfcF8yW2ldLmZyZXE7Ci0JCX0gZWxzZSB7Ci0JCQkqdDAgPSAmY2hhbl9pbmZvX3RibF9wXzBbaV07Ci0JCQlmcmVxID0gY2hhbl9pbmZvX3RibF9wXzBbaV0uZnJlcTsKLQkJfQotCi0JfSBlbHNlIGlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCQlpZiAoTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJCWNoYW5faW5mb190YmxfcF8xID0gY2hhbl9pbmZvX25waHlyZXYzXzIwNTY7Ci0JCQl0YmxfbGVuID0gQVJSQVlfU0laRShjaGFuX2luZm9fbnBoeXJldjNfMjA1Nik7Ci0JCX0gZWxzZSBpZiAoTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgNCkpIHsKLQkJCWNoYW5faW5mb190YmxfcF8xID0gY2hhbl9pbmZvX25waHlyZXY0XzIwNTZfQTE7Ci0JCQl0YmxfbGVuID0gQVJSQVlfU0laRShjaGFuX2luZm9fbnBoeXJldjRfMjA1Nl9BMSk7Ci0JCX0gZWxzZSBpZiAoTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgNSkKLQkJCSAgIHx8IE5SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDYpKSB7Ci0JCQlzd2l0Y2ggKHBpLT5wdWJwaS5yYWRpb3JldikgewotCQkJY2FzZSA1OgotCQkJCWNoYW5faW5mb190YmxfcF8xID0gY2hhbl9pbmZvX25waHlyZXY1XzIwNTZ2NTsKLQkJCQl0YmxfbGVuID0gQVJSQVlfU0laRShjaGFuX2luZm9fbnBoeXJldjVfMjA1NnY1KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNjoKLQkJCQljaGFuX2luZm9fdGJsX3BfMSA9IGNoYW5faW5mb19ucGh5cmV2Nl8yMDU2djY7Ci0JCQkJdGJsX2xlbiA9IEFSUkFZX1NJWkUoY2hhbl9pbmZvX25waHlyZXY2XzIwNTZ2Nik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDc6Ci0JCQljYXNlIDk6Ci0JCQkJY2hhbl9pbmZvX3RibF9wXzEgPSBjaGFuX2luZm9fbnBoeXJldjVuNl8yMDU2djc7Ci0JCQkJdGJsX2xlbiA9Ci0JCQkJICAgIEFSUkFZX1NJWkUoY2hhbl9pbmZvX25waHlyZXY1bjZfMjA1NnY3KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgODoKLQkJCQljaGFuX2luZm9fdGJsX3BfMSA9IGNoYW5faW5mb19ucGh5cmV2Nl8yMDU2djg7Ci0JCQkJdGJsX2xlbiA9IEFSUkFZX1NJWkUoY2hhbl9pbmZvX25waHlyZXY2XzIwNTZ2OCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDExOgotCQkJCWNoYW5faW5mb190YmxfcF8xID0gY2hhbl9pbmZvX25waHlyZXY2XzIwNTZ2MTE7Ci0JCQkJdGJsX2xlbiA9IEFSUkFZX1NJWkUoY2hhbl9pbmZvX25waHlyZXY2XzIwNTZ2MTEpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlpZiAoTk9SQURJT19FTkFCKHBpLT5wdWJwaSkpIHsKLQkJCQkJZ290byBmYWlsOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWZvciAoaSA9IDA7IGkgPCB0YmxfbGVuOyBpKyspIHsKLQkJCWlmIChjaGFuX2luZm9fdGJsX3BfMVtpXS5jaGFuID09IGNoYW5uZWwpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaSA+PSB0YmxfbGVuKSB7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJKnQxID0gJmNoYW5faW5mb190YmxfcF8xW2ldOwotCQlmcmVxID0gY2hhbl9pbmZvX3RibF9wXzFbaV0uZnJlcTsKLQotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNoYW5faW5mb19ucGh5XzIwNTUpOyBpKyspCi0JCQlpZiAoY2hhbl9pbmZvX25waHlfMjA1NVtpXS5jaGFuID09IGNoYW5uZWwpCi0JCQkJYnJlYWs7Ci0KLQkJaWYgKGkgPj0gQVJSQVlfU0laRShjaGFuX2luZm9fbnBoeV8yMDU1KSkgewotCQkJZ290byBmYWlsOwotCQl9Ci0JCSp0MyA9ICZjaGFuX2luZm9fbnBoeV8yMDU1W2ldOwotCQlmcmVxID0gY2hhbl9pbmZvX25waHlfMjA1NVtpXS5mcmVxOwotCX0KLQotCSpmID0gZnJlcTsKLQlyZXR1cm4gdHJ1ZTsKLQotIGZhaWw6Ci0JKmYgPSBXTF9DSEFOX0ZSRVFfUkFOR0VfMkc7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi11OCB3bGNfcGh5X2dldF9jaGFuX2ZyZXFfcmFuZ2VfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdWludCBjaGFubmVsKQotewotCWludCBmcmVxOwotCXN0cnVjdCBjaGFuX2luZm9fbnBoeV9yYWRpbzIwNTcgKnQwID0gTlVMTDsKLQlzdHJ1Y3QgY2hhbl9pbmZvX25waHlfcmFkaW8yMDV4ICp0MSA9IE5VTEw7Ci0Jc3RydWN0IGNoYW5faW5mb19ucGh5X3JhZGlvMjA1N19yZXY1ICp0MiA9IE5VTEw7Ci0Jc3RydWN0IGNoYW5faW5mb19ucGh5XzIwNTUgKnQzID0gTlVMTDsKLQotCWlmIChOT1JBRElPX0VOQUIocGktPnB1YnBpKSkKLQkJcmV0dXJuIFdMX0NIQU5fRlJFUV9SQU5HRV8yRzsKLQotCWlmIChjaGFubmVsID09IDApCi0JCWNoYW5uZWwgPSBDSFNQRUNfQ0hBTk5FTChwaS0+cmFkaW9fY2hhbnNwZWMpOwotCi0Jd2xjX3BoeV9jaGFuMmZyZXFfbnBoeShwaSwgY2hhbm5lbCwgJmZyZXEsICZ0MCwgJnQxLCAmdDIsICZ0Myk7Ci0KLQlpZiAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkKLQkJcmV0dXJuIFdMX0NIQU5fRlJFUV9SQU5HRV8yRzsKLQotCWlmICgoZnJlcSA+PSBCQVNFX0xPV181R19DSEFOKSAmJiAoZnJlcSA8IEJBU0VfTUlEXzVHX0NIQU4pKSB7Ci0JCXJldHVybiBXTF9DSEFOX0ZSRVFfUkFOR0VfNUdMOwotCX0gZWxzZSBpZiAoKGZyZXEgPj0gQkFTRV9NSURfNUdfQ0hBTikgJiYgKGZyZXEgPCBCQVNFX0hJR0hfNUdfQ0hBTikpIHsKLQkJcmV0dXJuIFdMX0NIQU5fRlJFUV9SQU5HRV81R007Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIFdMX0NIQU5fRlJFUV9SQU5HRV81R0g7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotd2xjX3BoeV9jaGFuc3BlY19yYWRpbzIwNTVfc2V0dXAoc3RydWN0IGJyY21zX3BoeSAqcGksCi0JCQkJIHN0cnVjdCBjaGFuX2luZm9fbnBoeV8yMDU1ICpjaSkKLXsKLQotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9QTExfUkVGLCBjaS0+UkZfcGxsX3JlZik7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X1JGX1BMTF9NT0QwLCBjaS0+UkZfcmZfcGxsX21vZDApOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9SRl9QTExfTU9EMSwgY2ktPlJGX3JmX3BsbF9tb2QxKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfVkNPX0NBUF9UQUlMLCBjaS0+UkZfdmNvX2NhcF90YWlsKTsKLQotCUJSQ01TX1BIWV9XQVJfUFI1MTU3MShwaSk7Ci0KLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfVkNPX0NBTDEsIGNpLT5SRl92Y29fY2FsMSk7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X1ZDT19DQUwyLCBjaS0+UkZfdmNvX2NhbDIpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9QTExfTEZfQzEsIGNpLT5SRl9wbGxfbGZfYzEpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9QTExfTEZfUjEsIGNpLT5SRl9wbGxfbGZfcjEpOwotCi0JQlJDTVNfUEhZX1dBUl9QUjUxNTcxKHBpKTsKLQotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9QTExfTEZfQzIsIGNpLT5SRl9wbGxfbGZfYzIpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9MR0JVRl9DRU5fQlVGLCBjaS0+UkZfbGdidWZfY2VuX2J1Zik7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0xHRU5fVFVORTEsIGNpLT5SRl9sZ2VuX3R1bmUxKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfTEdFTl9UVU5FMiwgY2ktPlJGX2xnZW5fdHVuZTIpOwotCi0JQlJDTVNfUEhZX1dBUl9QUjUxNTcxKHBpKTsKLQotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMV9MR0JVRl9BX1RVTkUsCi0JCQljaS0+UkZfY29yZTFfbGdidWZfYV90dW5lKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTFfTEdCVUZfR19UVU5FLAotCQkJY2ktPlJGX2NvcmUxX2xnYnVmX2dfdHVuZSk7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUxX1JYUkZfUkVHMSwgY2ktPlJGX2NvcmUxX3J4cmZfcmVnMSk7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUxX1RYX1BHQV9QQURfVE4sCi0JCQljaS0+UkZfY29yZTFfdHhfcGdhX3BhZF90bik7Ci0KLQlCUkNNU19QSFlfV0FSX1BSNTE1NzEocGkpOwotCi0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUxX1RYX01YX0JHVFJJTSwKLQkJCWNpLT5SRl9jb3JlMV90eF9teF9iZ3RyaW0pOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMl9MR0JVRl9BX1RVTkUsCi0JCQljaS0+UkZfY29yZTJfbGdidWZfYV90dW5lKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTJfTEdCVUZfR19UVU5FLAotCQkJY2ktPlJGX2NvcmUyX2xnYnVmX2dfdHVuZSk7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUyX1JYUkZfUkVHMSwgY2ktPlJGX2NvcmUyX3J4cmZfcmVnMSk7Ci0KLQlCUkNNU19QSFlfV0FSX1BSNTE1NzEocGkpOwotCi0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUyX1RYX1BHQV9QQURfVE4sCi0JCQljaS0+UkZfY29yZTJfdHhfcGdhX3BhZF90bik7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUyX1RYX01YX0JHVFJJTSwKLQkJCWNpLT5SRl9jb3JlMl90eF9teF9iZ3RyaW0pOwotCi0JdWRlbGF5KDUwKTsKLQotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9WQ09fQ0FMMTAsIDB4MDUpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9WQ09fQ0FMMTAsIDB4NDUpOwotCi0JQlJDTVNfUEhZX1dBUl9QUjUxNTcxKHBpKTsKLQotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9WQ09fQ0FMMTAsIDB4NjUpOwotCi0JdWRlbGF5KDMwMCk7Ci19Ci0KLXN0YXRpYyB2b2lkCi13bGNfcGh5X2NoYW5zcGVjX3JhZGlvMjA1Nl9zZXR1cChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwKLQkJCQkgY29uc3Qgc3RydWN0IGNoYW5faW5mb19ucGh5X3JhZGlvMjA1eCAqY2kpCi17Ci0Jc3RydWN0IHJhZGlvX3JlZ3MgKnJlZ3NfU1lOXzIwNTZfcHRyID0gTlVMTDsKLQotCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCVJBRElPXzIwNTZfU1lOX1BMTF9WQ09DQUwxIHwgUkFESU9fMjA1Nl9TWU4sCi0JCQljaS0+UkZfU1lOX3BsbF92Y29jYWwxKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfU1lOX1BMTF9WQ09DQUwyIHwgUkFESU9fMjA1Nl9TWU4sCi0JCQljaS0+UkZfU1lOX3BsbF92Y29jYWwyKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfU1lOX1BMTF9SRUZESVYgfCBSQURJT18yMDU2X1NZTiwKLQkJCWNpLT5SRl9TWU5fcGxsX3JlZmRpdik7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU2X1NZTl9QTExfTU1EMiB8IFJBRElPXzIwNTZfU1lOLAotCQkJY2ktPlJGX1NZTl9wbGxfbW1kMik7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU2X1NZTl9QTExfTU1EMSB8IFJBRElPXzIwNTZfU1lOLAotCQkJY2ktPlJGX1NZTl9wbGxfbW1kMSk7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU2X1NZTl9QTExfTE9PUEZJTFRFUjEgfCBSQURJT18yMDU2X1NZTiwKLQkJCWNpLT5SRl9TWU5fcGxsX2xvb3BmaWx0ZXIxKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfU1lOX1BMTF9MT09QRklMVEVSMiB8IFJBRElPXzIwNTZfU1lOLAotCQkJY2ktPlJGX1NZTl9wbGxfbG9vcGZpbHRlcjIpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9TWU5fUExMX0xPT1BGSUxURVIzIHwgUkFESU9fMjA1Nl9TWU4sCi0JCQljaS0+UkZfU1lOX3BsbF9sb29wZmlsdGVyMyk7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU2X1NZTl9QTExfTE9PUEZJTFRFUjQgfCBSQURJT18yMDU2X1NZTiwKLQkJCWNpLT5SRl9TWU5fcGxsX2xvb3BmaWx0ZXI0KTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfU1lOX1BMTF9MT09QRklMVEVSNSB8IFJBRElPXzIwNTZfU1lOLAotCQkJY2ktPlJGX1NZTl9wbGxfbG9vcGZpbHRlcjUpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9TWU5fUkVTRVJWRURfQUREUjI3IHwgUkFESU9fMjA1Nl9TWU4sCi0JCQljaS0+UkZfU1lOX3Jlc2VydmVkX2FkZHIyNyk7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU2X1NZTl9SRVNFUlZFRF9BRERSMjggfCBSQURJT18yMDU2X1NZTiwKLQkJCWNpLT5SRl9TWU5fcmVzZXJ2ZWRfYWRkcjI4KTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfU1lOX1JFU0VSVkVEX0FERFIyOSB8IFJBRElPXzIwNTZfU1lOLAotCQkJY2ktPlJGX1NZTl9yZXNlcnZlZF9hZGRyMjkpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9TWU5fTE9HRU5fVkNPQlVGMSB8IFJBRElPXzIwNTZfU1lOLAotCQkJY2ktPlJGX1NZTl9sb2dlbl9WQ09CVUYxKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfU1lOX0xPR0VOX01JWEVSMiB8IFJBRElPXzIwNTZfU1lOLAotCQkJY2ktPlJGX1NZTl9sb2dlbl9NSVhFUjIpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9TWU5fTE9HRU5fQlVGMyB8IFJBRElPXzIwNTZfU1lOLAotCQkJY2ktPlJGX1NZTl9sb2dlbl9CVUYzKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfU1lOX0xPR0VOX0JVRjQgfCBSQURJT18yMDU2X1NZTiwKLQkJCWNpLT5SRl9TWU5fbG9nZW5fQlVGNCk7Ci0KLQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQlSQURJT18yMDU2X1JYX0xOQUFfVFVORSB8IFJBRElPXzIwNTZfUlgwLAotCQkJY2ktPlJGX1JYMF9sbmFhX3R1bmUpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9SWF9MTkFHX1RVTkUgfCBSQURJT18yMDU2X1JYMCwKLQkJCWNpLT5SRl9SWDBfbG5hZ190dW5lKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfVFhfSU5UUEFBX0JPT1NUX1RVTkUgfCBSQURJT18yMDU2X1RYMCwKLQkJCWNpLT5SRl9UWDBfaW50cGFhX2Jvb3N0X3R1bmUpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9UWF9JTlRQQUdfQk9PU1RfVFVORSB8IFJBRElPXzIwNTZfVFgwLAotCQkJY2ktPlJGX1RYMF9pbnRwYWdfYm9vc3RfdHVuZSk7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU2X1RYX1BBREFfQk9PU1RfVFVORSB8IFJBRElPXzIwNTZfVFgwLAotCQkJY2ktPlJGX1RYMF9wYWRhX2Jvb3N0X3R1bmUpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9UWF9QQURHX0JPT1NUX1RVTkUgfCBSQURJT18yMDU2X1RYMCwKLQkJCWNpLT5SRl9UWDBfcGFkZ19ib29zdF90dW5lKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfVFhfUEdBQV9CT09TVF9UVU5FIHwgUkFESU9fMjA1Nl9UWDAsCi0JCQljaS0+UkZfVFgwX3BnYWFfYm9vc3RfdHVuZSk7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU2X1RYX1BHQUdfQk9PU1RfVFVORSB8IFJBRElPXzIwNTZfVFgwLAotCQkJY2ktPlJGX1RYMF9wZ2FnX2Jvb3N0X3R1bmUpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9UWF9NSVhBX0JPT1NUX1RVTkUgfCBSQURJT18yMDU2X1RYMCwKLQkJCWNpLT5SRl9UWDBfbWl4YV9ib29zdF90dW5lKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfVFhfTUlYR19CT09TVF9UVU5FIHwgUkFESU9fMjA1Nl9UWDAsCi0JCQljaS0+UkZfVFgwX21peGdfYm9vc3RfdHVuZSk7Ci0KLQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQlSQURJT18yMDU2X1JYX0xOQUFfVFVORSB8IFJBRElPXzIwNTZfUlgxLAotCQkJY2ktPlJGX1JYMV9sbmFhX3R1bmUpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9SWF9MTkFHX1RVTkUgfCBSQURJT18yMDU2X1JYMSwKLQkJCWNpLT5SRl9SWDFfbG5hZ190dW5lKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfVFhfSU5UUEFBX0JPT1NUX1RVTkUgfCBSQURJT18yMDU2X1RYMSwKLQkJCWNpLT5SRl9UWDFfaW50cGFhX2Jvb3N0X3R1bmUpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9UWF9JTlRQQUdfQk9PU1RfVFVORSB8IFJBRElPXzIwNTZfVFgxLAotCQkJY2ktPlJGX1RYMV9pbnRwYWdfYm9vc3RfdHVuZSk7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU2X1RYX1BBREFfQk9PU1RfVFVORSB8IFJBRElPXzIwNTZfVFgxLAotCQkJY2ktPlJGX1RYMV9wYWRhX2Jvb3N0X3R1bmUpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9UWF9QQURHX0JPT1NUX1RVTkUgfCBSQURJT18yMDU2X1RYMSwKLQkJCWNpLT5SRl9UWDFfcGFkZ19ib29zdF90dW5lKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfVFhfUEdBQV9CT09TVF9UVU5FIHwgUkFESU9fMjA1Nl9UWDEsCi0JCQljaS0+UkZfVFgxX3BnYWFfYm9vc3RfdHVuZSk7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU2X1RYX1BHQUdfQk9PU1RfVFVORSB8IFJBRElPXzIwNTZfVFgxLAotCQkJY2ktPlJGX1RYMV9wZ2FnX2Jvb3N0X3R1bmUpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9UWF9NSVhBX0JPT1NUX1RVTkUgfCBSQURJT18yMDU2X1RYMSwKLQkJCWNpLT5SRl9UWDFfbWl4YV9ib29zdF90dW5lKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfVFhfTUlYR19CT09TVF9UVU5FIHwgUkFESU9fMjA1Nl9UWDEsCi0JCQljaS0+UkZfVFgxX21peGdfYm9vc3RfdHVuZSk7Ci0KLQlpZiAoTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgMykpCi0JCXJlZ3NfU1lOXzIwNTZfcHRyID0gcmVnc19TWU5fMjA1NjsKLQllbHNlIGlmIChOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCA0KSkKLQkJcmVnc19TWU5fMjA1Nl9wdHIgPSByZWdzX1NZTl8yMDU2X0ExOwotCWVsc2UgewotCQlzd2l0Y2ggKHBpLT5wdWJwaS5yYWRpb3JldikgewotCQljYXNlIDU6Ci0JCQlyZWdzX1NZTl8yMDU2X3B0ciA9IHJlZ3NfU1lOXzIwNTZfcmV2NTsKLQkJCWJyZWFrOwotCQljYXNlIDY6Ci0JCQlyZWdzX1NZTl8yMDU2X3B0ciA9IHJlZ3NfU1lOXzIwNTZfcmV2NjsKLQkJCWJyZWFrOwotCQljYXNlIDc6Ci0JCWNhc2UgOToKLQkJCXJlZ3NfU1lOXzIwNTZfcHRyID0gcmVnc19TWU5fMjA1Nl9yZXY3OwotCQkJYnJlYWs7Ci0JCWNhc2UgODoKLQkJCXJlZ3NfU1lOXzIwNTZfcHRyID0gcmVnc19TWU5fMjA1Nl9yZXY4OwotCQkJYnJlYWs7Ci0JCWNhc2UgMTE6Ci0JCQlyZWdzX1NZTl8yMDU2X3B0ciA9IHJlZ3NfU1lOXzIwNTZfcmV2MTE7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpZiAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfU1lOX1BMTF9DUDIgfAotCQkJCVJBRElPXzIwNTZfU1lOLAotCQkJCSh1MTYpIHJlZ3NfU1lOXzIwNTZfcHRyWzB4NDkgLSAyXS5pbml0X2cpOwotCX0gZWxzZSB7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9TWU5fUExMX0NQMiB8Ci0JCQkJUkFESU9fMjA1Nl9TWU4sCi0JCQkJKHUxNikgcmVnc19TWU5fMjA1Nl9wdHJbMHg0OSAtIDJdLmluaXRfYSk7Ci0JfQotCi0JaWYgKHBpLT5zaC0+Ym9hcmRmbGFnczIgJiBCRkwyX0dQTExfV0FSKSB7Ci0JCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfU1lOX1BMTF9MT09QRklMVEVSMSB8Ci0JCQkJCVJBRElPXzIwNTZfU1lOLCAweDFmKTsKLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9TWU5fUExMX0xPT1BGSUxURVIyIHwKLQkJCQkJUkFESU9fMjA1Nl9TWU4sIDB4MWYpOwotCi0JCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCVJBRElPXzIwNTZfU1lOX1BMTF9MT09QRklMVEVSNCB8Ci0JCQkJCVJBRElPXzIwNTZfU1lOLCAweGIpOwotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQlSQURJT18yMDU2X1NZTl9QTExfQ1AyIHwKLQkJCQkJUkFESU9fMjA1Nl9TWU4sIDB4MTQpOwotCQl9Ci0JfQotCi0JaWYgKChwaS0+c2gtPmJvYXJkZmxhZ3MyICYgQkZMMl9HUExMX1dBUjIpICYmCi0JICAgIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSkgewotCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJUkFESU9fMjA1Nl9TWU5fUExMX0xPT1BGSUxURVIxIHwgUkFESU9fMjA1Nl9TWU4sCi0JCQkJMHgxZik7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQlSQURJT18yMDU2X1NZTl9QTExfTE9PUEZJTFRFUjIgfCBSQURJT18yMDU2X1NZTiwKLQkJCQkweDFmKTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCVJBRElPXzIwNTZfU1lOX1BMTF9MT09QRklMVEVSNCB8IFJBRElPXzIwNTZfU1lOLAotCQkJCTB4Yik7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9TWU5fUExMX0NQMiB8IFJBRElPXzIwNTZfU1lOLAotCQkJCTB4MjApOwotCX0KLQotCWlmIChwaS0+c2gtPmJvYXJkZmxhZ3MyICYgQkZMMl9BUExMX1dBUikgewotCQlpZiAoQ0hTUEVDX0lTNUcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU2X1NZTl9QTExfTE9PUEZJTFRFUjEgfAotCQkJCQlSQURJT18yMDU2X1NZTiwgMHgxZik7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfU1lOX1BMTF9MT09QRklMVEVSMiB8Ci0JCQkJCVJBRElPXzIwNTZfU1lOLCAweDFmKTsKLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9TWU5fUExMX0xPT1BGSUxURVI0IHwKLQkJCQkJUkFESU9fMjA1Nl9TWU4sIDB4NSk7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfU1lOX1BMTF9DUDIgfAotCQkJCQlSQURJT18yMDU2X1NZTiwgMHhjKTsKLQkJfQotCX0KLQotCWlmIChQSFlfSVBBKHBpKSAmJiBDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCXUxNiBwYWdfYm9vc3RfdHVuZTsKLQkJdTE2IHBhZGdfYm9vc3RfdHVuZTsKLQkJdTE2IHBnYWdfYm9vc3RfdHVuZTsKLQkJdTE2IG1peGdfYm9vc3RfdHVuZTsKLQkJdTE2IGJpYXMsIGNhc2NiaWFzOwotCQl1aW50IGNvcmU7Ci0KLQkJZm9yIChjb3JlID0gMDsgY29yZSA8IHBpLT5wdWJwaS5waHlfY29yZW51bTsgY29yZSsrKSB7Ci0KLQkJCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA1KSkgewotCi0JCQkJV1JJVEVfUkFESU9fUkVHMihwaSwgUkFESU9fMjA1NiwgVFgsIGNvcmUsCi0JCQkJCQkgUEFER19JREFDLCAweGNjKTsKLQotCQkJCWJpYXMgPSAweDI1OwotCQkJCWNhc2NiaWFzID0gMHgyMDsKLQotCQkJCWlmICgocGktPnNoLT5jaGlwID09Ci0JCQkJICAgICBCQ000MzIyNF9DSElQX0lEKQotCQkJCSAgICB8fCAocGktPnNoLT5jaGlwID09Ci0JCQkJCUJDTTQzMjI1X0NISVBfSUQpKSB7Ci0JCQkJCWlmIChwaS0+c2gtPmNoaXBwa2cgPT0KLQkJCQkJICAgIEJDTTQzMjI0X0ZBQl9TTUlDKSB7Ci0JCQkJCQliaWFzID0gMHgyYTsKLQkJCQkJCWNhc2NiaWFzID0gMHgzODsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXBhZ19ib29zdF90dW5lID0gMHg0OwotCQkJCXBnYWdfYm9vc3RfdHVuZSA9IDB4MDM7Ci0JCQkJcGFkZ19ib29zdF90dW5lID0gMHg3NzsKLQkJCQltaXhnX2Jvb3N0X3R1bmUgPSAweDY1OwotCi0JCQkJV1JJVEVfUkFESU9fUkVHMihwaSwgUkFESU9fMjA1NiwgVFgsIGNvcmUsCi0JCQkJCQkgSU5UUEFHX0lNQUlOX1NUQVQsIGJpYXMpOwotCQkJCVdSSVRFX1JBRElPX1JFRzIocGksIFJBRElPXzIwNTYsIFRYLCBjb3JlLAotCQkJCQkJIElOVFBBR19JQVVYX1NUQVQsIGJpYXMpOwotCQkJCVdSSVRFX1JBRElPX1JFRzIocGksIFJBRElPXzIwNTYsIFRYLCBjb3JlLAotCQkJCQkJIElOVFBBR19DQVNDQklBUywgY2FzY2JpYXMpOwotCi0JCQkJV1JJVEVfUkFESU9fUkVHMihwaSwgUkFESU9fMjA1NiwgVFgsIGNvcmUsCi0JCQkJCQkgSU5UUEFHX0JPT1NUX1RVTkUsCi0JCQkJCQkgcGFnX2Jvb3N0X3R1bmUpOwotCQkJCVdSSVRFX1JBRElPX1JFRzIocGksIFJBRElPXzIwNTYsIFRYLCBjb3JlLAotCQkJCQkJIFBHQUdfQk9PU1RfVFVORSwKLQkJCQkJCSBwZ2FnX2Jvb3N0X3R1bmUpOwotCQkJCVdSSVRFX1JBRElPX1JFRzIocGksIFJBRElPXzIwNTYsIFRYLCBjb3JlLAotCQkJCQkJIFBBREdfQk9PU1RfVFVORSwKLQkJCQkJCSBwYWRnX2Jvb3N0X3R1bmUpOwotCQkJCVdSSVRFX1JBRElPX1JFRzIocGksIFJBRElPXzIwNTYsIFRYLCBjb3JlLAotCQkJCQkJIE1JWEdfQk9PU1RfVFVORSwKLQkJCQkJCSBtaXhnX2Jvb3N0X3R1bmUpOwotCQkJfSBlbHNlIHsKLQotCQkJCWJpYXMgPSBJUzQwTUhaKHBpKSA/IDB4NDAgOiAweDIwOwotCi0JCQkJV1JJVEVfUkFESU9fUkVHMihwaSwgUkFESU9fMjA1NiwgVFgsIGNvcmUsCi0JCQkJCQkgSU5UUEFHX0lNQUlOX1NUQVQsIGJpYXMpOwotCQkJCVdSSVRFX1JBRElPX1JFRzIocGksIFJBRElPXzIwNTYsIFRYLCBjb3JlLAotCQkJCQkJIElOVFBBR19JQVVYX1NUQVQsIGJpYXMpOwotCQkJCVdSSVRFX1JBRElPX1JFRzIocGksIFJBRElPXzIwNTYsIFRYLCBjb3JlLAotCQkJCQkJIElOVFBBR19DQVNDQklBUywgMHgzMCk7Ci0JCQl9Ci0JCQlXUklURV9SQURJT19SRUcyKHBpLCBSQURJT18yMDU2LCBUWCwgY29yZSwgUEFfU1BBUkUxLAotCQkJCQkgMHhlZSk7Ci0JCX0KLQl9Ci0KLQlpZiAoUEhZX0lQQShwaSkgJiYgTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgNikKLQkgICAgJiYgQ0hTUEVDX0lTNUcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQl1MTYgcGFhX2Jvb3N0X3R1bmU7Ci0JCXUxNiBwYWRhX2Jvb3N0X3R1bmU7Ci0JCXUxNiBwZ2FhX2Jvb3N0X3R1bmU7Ci0JCXUxNiBtaXhhX2Jvb3N0X3R1bmU7Ci0JCXUxNiBmcmVxLCBwYWJpYXMsIGNhc2NiaWFzOwotCQl1aW50IGNvcmU7Ci0KLQkJZnJlcSA9IENIQU41R19GUkVRKENIU1BFQ19DSEFOTkVMKHBpLT5yYWRpb19jaGFuc3BlYykpOwotCi0JCWlmIChmcmVxIDwgNTE1MCkgewotCi0JCQlwYWFfYm9vc3RfdHVuZSA9IDB4YTsKLQkJCXBhZGFfYm9vc3RfdHVuZSA9IDB4Nzc7Ci0JCQlwZ2FhX2Jvb3N0X3R1bmUgPSAweGY7Ci0JCQltaXhhX2Jvb3N0X3R1bmUgPSAweGY7Ci0JCX0gZWxzZSBpZiAoZnJlcSA8IDUzNDApIHsKLQotCQkJcGFhX2Jvb3N0X3R1bmUgPSAweDg7Ci0JCQlwYWRhX2Jvb3N0X3R1bmUgPSAweDc3OwotCQkJcGdhYV9ib29zdF90dW5lID0gMHhmYjsKLQkJCW1peGFfYm9vc3RfdHVuZSA9IDB4ZjsKLQkJfSBlbHNlIGlmIChmcmVxIDwgNTY1MCkgewotCi0JCQlwYWFfYm9vc3RfdHVuZSA9IDB4MDsKLQkJCXBhZGFfYm9vc3RfdHVuZSA9IDB4Nzc7Ci0JCQlwZ2FhX2Jvb3N0X3R1bmUgPSAweGI7Ci0JCQltaXhhX2Jvb3N0X3R1bmUgPSAweGY7Ci0JCX0gZWxzZSB7Ci0KLQkJCXBhYV9ib29zdF90dW5lID0gMHgwOwotCQkJcGFkYV9ib29zdF90dW5lID0gMHg3NzsKLQkJCWlmIChmcmVxICE9IDU4MjUpIHsKLQkJCQlwZ2FhX2Jvb3N0X3R1bmUgPSAtKGludCkoZnJlcSAtIDE4KSAvIDM2ICsgMTY4OwotCQkJfSBlbHNlIHsKLQkJCQlwZ2FhX2Jvb3N0X3R1bmUgPSA2OwotCQkJfQotCQkJbWl4YV9ib29zdF90dW5lID0gMHhmOwotCQl9Ci0KLQkJZm9yIChjb3JlID0gMDsgY29yZSA8IHBpLT5wdWJwaS5waHlfY29yZW51bTsgY29yZSsrKSB7Ci0JCQlXUklURV9SQURJT19SRUcyKHBpLCBSQURJT18yMDU2LCBUWCwgY29yZSwKLQkJCQkJIElOVFBBQV9CT09TVF9UVU5FLCBwYWFfYm9vc3RfdHVuZSk7Ci0JCQlXUklURV9SQURJT19SRUcyKHBpLCBSQURJT18yMDU2LCBUWCwgY29yZSwKLQkJCQkJIFBBREFfQk9PU1RfVFVORSwgcGFkYV9ib29zdF90dW5lKTsKLQkJCVdSSVRFX1JBRElPX1JFRzIocGksIFJBRElPXzIwNTYsIFRYLCBjb3JlLAotCQkJCQkgUEdBQV9CT09TVF9UVU5FLCBwZ2FhX2Jvb3N0X3R1bmUpOwotCQkJV1JJVEVfUkFESU9fUkVHMihwaSwgUkFESU9fMjA1NiwgVFgsIGNvcmUsCi0JCQkJCSBNSVhBX0JPT1NUX1RVTkUsIG1peGFfYm9vc3RfdHVuZSk7Ci0KLQkJCVdSSVRFX1JBRElPX1JFRzIocGksIFJBRElPXzIwNTYsIFRYLCBjb3JlLAotCQkJCQkgVFhTUEFSRTEsIDB4MzApOwotCQkJV1JJVEVfUkFESU9fUkVHMihwaSwgUkFESU9fMjA1NiwgVFgsIGNvcmUsCi0JCQkJCSBQQV9TUEFSRTIsIDB4ZWUpOwotCi0JCQlXUklURV9SQURJT19SRUcyKHBpLCBSQURJT18yMDU2LCBUWCwgY29yZSwKLQkJCQkJIFBBREFfQ0FTQ0JJQVMsIDB4Myk7Ci0KLQkJCWNhc2NiaWFzID0gMHgzMDsKLQotCQkJaWYgKChwaS0+c2gtPmNoaXAgPT0gQkNNNDMyMjRfQ0hJUF9JRCkgfHwKLQkJCSAgICAocGktPnNoLT5jaGlwID09IEJDTTQzMjI1X0NISVBfSUQpKSB7Ci0JCQkJaWYgKHBpLT5zaC0+Y2hpcHBrZyA9PSBCQ000MzIyNF9GQUJfU01JQykgewotCQkJCQljYXNjYmlhcyA9IDB4MzU7Ci0JCQkJfQotCQkJfQotCi0JCQlwYWJpYXMgPSAocGktPnBoeV9wYWJpYXMgPT0gMCkgPyAweDMwIDogcGktPnBoeV9wYWJpYXM7Ci0KLQkJCVdSSVRFX1JBRElPX1JFRzIocGksIFJBRElPXzIwNTYsIFRYLCBjb3JlLAotCQkJCQkgSU5UUEFBX0lBVVhfU1RBVCwgcGFiaWFzKTsKLQkJCVdSSVRFX1JBRElPX1JFRzIocGksIFJBRElPXzIwNTYsIFRYLCBjb3JlLAotCQkJCQkgSU5UUEFBX0lNQUlOX1NUQVQsIHBhYmlhcyk7Ci0JCQlXUklURV9SQURJT19SRUcyKHBpLCBSQURJT18yMDU2LCBUWCwgY29yZSwKLQkJCQkJIElOVFBBQV9DQVNDQklBUywgY2FzY2JpYXMpOwotCQl9Ci0JfQotCi0JdWRlbGF5KDUwKTsKLQotCXdsY19waHlfcmFkaW8yMDV4X3Zjb2NhbF9ucGh5KHBpKTsKLX0KLQotdm9pZCB3bGNfcGh5X3JhZGlvMjA1eF92Y29jYWxfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19SRlBMTF9NSVNDX0VOLCAweDAxLCAweDApOwotCQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1JGUExMX01JU0NfQ0FMX1JFU0VUTiwgMHgwNCwgMHgwKTsKLQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19SRlBMTF9NSVNDX0NBTF9SRVNFVE4sIDB4MDQsCi0JCQkgICAgICAoMSA8PCAyKSk7Ci0JCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUkZQTExfTUlTQ19FTiwgMHgwMSwgMHgwMSk7Ci0JfSBlbHNlIGlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfU1lOX1BMTF9WQ09DQUwxMiwgMHgwKTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU2X1NZTl9QTExfTUFTVDMsIDB4MzgpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfU1lOX1BMTF9NQVNUMywgMHgxOCk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9TWU5fUExMX01BU1QzLCAweDM4KTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU2X1NZTl9QTExfTUFTVDMsIDB4MzkpOwotCX0KLQotCXVkZWxheSgzMDApOwotfQotCi0jZGVmaW5lIE1BWF8yMDV4X1JDQUxfV0FJVExPT1BTIDEwMDAwCi0KLXN0YXRpYyB1MTYgd2xjX3BoeV9yYWRpbzIwNXhfcmNhbChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQl1MTYgcmNhbF9yZWcgPSAwOwotCWludCBpOwotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0KLQkJaWYgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA1KSB7Ci0KLQkJCWFuZF9waHlfcmVnKHBpLCAweDM0MiwgfigweDEgPDwgMSkpOwotCi0JCQl1ZGVsYXkoMTApOwotCi0JCQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X0lRVEVTVF9TRUxfUFUsIDB4MSwgMHgxKTsKLQkJCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTd2N19JUVRFU1RfU0VMX1BVMiwgMHgyLAotCQkJCSAgICAgIDB4MSk7Ci0JCX0KLQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19SQ0FMX0NPTkZJRywgMHgxLCAweDEpOwotCi0JCXVkZWxheSgxMCk7Ci0KLQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19SQ0FMX0NPTkZJRywgMHgzLCAweDMpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBNQVhfMjA1eF9SQ0FMX1dBSVRMT09QUzsgaSsrKSB7Ci0JCQlyY2FsX3JlZyA9IHJlYWRfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1JDQUxfU1RBVFVTKTsKLQkJCWlmIChyY2FsX3JlZyAmIDB4MSkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJdWRlbGF5KDEwMCk7Ci0JCX0KLQotCQlpZiAoV0FSTihpID09IE1BWF8yMDV4X1JDQUxfV0FJVExPT1BTLAotCQkJICJIVyBlcnJvcjogcmFkaW8gY2FsaWIyIikpCi0JCQlyZXR1cm4gMDsKLQotCQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1JDQUxfQ09ORklHLCAweDIsIDB4MCk7Ci0KLQkJcmNhbF9yZWcgPSByZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19SQ0FMX1NUQVRVUykgJiAweDNlOwotCi0JCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUkNBTF9DT05GSUcsIDB4MSwgMHgwKTsKLQkJaWYgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA1KSB7Ci0KLQkJCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfSVFURVNUX1NFTF9QVSwgMHgxLCAweDApOwotCQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N3Y3X0lRVEVTVF9TRUxfUFUyLCAweDIsCi0JCQkJICAgICAgMHgwKTsKLQkJfQotCi0JCWlmICgocGktPnB1YnBpLnJhZGlvcmV2IDw9IDQpIHx8IChwaS0+cHVicGkucmFkaW9yZXYgPT0gNikpIHsKLQotCQkJbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19URU1QU0VOU0VfQ09ORklHLCAweDNjLAotCQkJCSAgICAgIHJjYWxfcmVnKTsKLQkJCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfQkFOREdBUF9SQ0FMX1RSSU0sIDB4ZjAsCi0JCQkJICAgICAgcmNhbF9yZWcgPDwgMik7Ci0JCX0KLQotCX0gZWxzZSBpZiAoTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJdTE2IHNhdmVyZWc7Ci0KLQkJc2F2ZXJlZyA9Ci0JCSAgICByZWFkX3JhZGlvX3JlZyhwaSwKLQkJCQkgICBSQURJT18yMDU2X1NZTl9QTExfTUFTVDIgfCBSQURJT18yMDU2X1NZTik7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9TWU5fUExMX01BU1QyIHwgUkFESU9fMjA1Nl9TWU4sCi0JCQkJc2F2ZXJlZyB8IDB4Nyk7Ci0JCXVkZWxheSgxMCk7Ci0KLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU2X1NZTl9SQ0FMX01BU1RFUiB8IFJBRElPXzIwNTZfU1lOLAotCQkJCTB4MSk7Ci0JCXVkZWxheSgxMCk7Ci0KLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU2X1NZTl9SQ0FMX01BU1RFUiB8IFJBRElPXzIwNTZfU1lOLAotCQkJCTB4OSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IE1BWF8yMDV4X1JDQUxfV0FJVExPT1BTOyBpKyspIHsKLQkJCXJjYWxfcmVnID0gcmVhZF9yYWRpb19yZWcocGksCi0JCQkJCQkgIFJBRElPXzIwNTZfU1lOX1JDQUxfQ09ERV9PVVQgfAotCQkJCQkJICBSQURJT18yMDU2X1NZTik7Ci0JCQlpZiAocmNhbF9yZWcgJiAweDgwKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQl1ZGVsYXkoMTAwKTsKLQkJfQotCi0JCWlmIChXQVJOKGkgPT0gTUFYXzIwNXhfUkNBTF9XQUlUTE9PUFMsCi0JCQkgIkhXIGVycm9yOiByYWRpbyBjYWxpYjMiKSkKLQkJCXJldHVybiAwOwotCi0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9TWU5fUkNBTF9NQVNURVIgfCBSQURJT18yMDU2X1NZTiwKLQkJCQkweDEpOwotCi0JCXJjYWxfcmVnID0KLQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCSAgIFJBRElPXzIwNTZfU1lOX1JDQUxfQ09ERV9PVVQgfAotCQkJCSAgIFJBRElPXzIwNTZfU1lOKTsKLQotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfU1lOX1JDQUxfTUFTVEVSIHwgUkFESU9fMjA1Nl9TWU4sCi0JCQkJMHgwKTsKLQotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfU1lOX1BMTF9NQVNUMiB8IFJBRElPXzIwNTZfU1lOLAotCQkJCXNhdmVyZWcpOwotCi0JCXJldHVybiByY2FsX3JlZyAmIDB4MWY7Ci0JfQotCXJldHVybiByY2FsX3JlZyAmIDB4M2U7Ci19Ci0KLXN0YXRpYyB2b2lkCi13bGNfcGh5X2NoYW5zcGVjX3JhZGlvMjA1N19zZXR1cChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwKLQkJCWNvbnN0IHN0cnVjdCBjaGFuX2luZm9fbnBoeV9yYWRpbzIwNTcgKmNpLAotCQkJY29uc3Qgc3RydWN0IGNoYW5faW5mb19ucGh5X3JhZGlvMjA1N19yZXY1ICpjaTIpCi17Ci0JaW50IGNvcmVOdW07Ci0JdTE2IHR4bWl4MmdfdHVuZV9ib29zdF9wdSA9IDA7Ci0JdTE2IHBhZDJnX3R1bmVfcHVzID0gMDsKLQotCWlmIChwaS0+cHVicGkucmFkaW9yZXYgPT0gNSkgewotCi0JCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQlSQURJT18yMDU3X1ZDT0NBTF9DT1VOVFZBTDAsCi0JCQkJY2kyLT5SRl92Y29jYWxfY291bnR2YWwwKTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1ZDT0NBTF9DT1VOVFZBTDEsCi0JCQkJY2kyLT5SRl92Y29jYWxfY291bnR2YWwxKTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1JGUExMX1JFRk1BU1RFUl9TUEFSRVhUQUxTSVpFLAotCQkJCWNpMi0+UkZfcmZwbGxfcmVmbWFzdGVyX3NwYXJleHRhbHNpemUpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUkZQTExfTE9PUEZJTFRFUl9SMSwKLQkJCQljaTItPlJGX3JmcGxsX2xvb3BmaWx0ZXJfcjEpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUkZQTExfTE9PUEZJTFRFUl9DMiwKLQkJCQljaTItPlJGX3JmcGxsX2xvb3BmaWx0ZXJfYzIpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUkZQTExfTE9PUEZJTFRFUl9DMSwKLQkJCQljaTItPlJGX3JmcGxsX2xvb3BmaWx0ZXJfYzEpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfQ1BfS1BEX0lEQUMsCi0JCQkJY2kyLT5SRl9jcF9rcGRfaWRhYyk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19SRlBMTF9NTUQwLCBjaTItPlJGX3JmcGxsX21tZDApOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUkZQTExfTU1EMSwgY2kyLT5SRl9yZnBsbF9tbWQxKTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCVJBRElPXzIwNTdfVkNPQlVGX1RVTkUsIGNpMi0+UkZfdmNvYnVmX3R1bmUpOwotCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJUkFESU9fMjA1N19MT0dFTl9NWDJHX1RVTkUsCi0JCQkJY2kyLT5SRl9sb2dlbl9teDJnX3R1bmUpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfTE9HRU5fSU5EQlVGMkdfVFVORSwKLQkJCQljaTItPlJGX2xvZ2VuX2luZGJ1ZjJnX3R1bmUpOwotCi0JCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQlSQURJT18yMDU3X1RYTUlYMkdfVFVORV9CT09TVF9QVV9DT1JFMCwKLQkJCQljaTItPlJGX3R4bWl4MmdfdHVuZV9ib29zdF9wdV9jb3JlMCk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQlSQURJT18yMDU3X1BBRDJHX1RVTkVfUFVTX0NPUkUwLAotCQkJCWNpMi0+UkZfcGFkMmdfdHVuZV9wdXNfY29yZTApOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfTE5BMkdfVFVORV9DT1JFMCwKLQkJCQljaTItPlJGX2xuYTJnX3R1bmVfY29yZTApOwotCi0JCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQlSQURJT18yMDU3X1RYTUlYMkdfVFVORV9CT09TVF9QVV9DT1JFMSwKLQkJCQljaTItPlJGX3R4bWl4MmdfdHVuZV9ib29zdF9wdV9jb3JlMSk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQlSQURJT18yMDU3X1BBRDJHX1RVTkVfUFVTX0NPUkUxLAotCQkJCWNpMi0+UkZfcGFkMmdfdHVuZV9wdXNfY29yZTEpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfTE5BMkdfVFVORV9DT1JFMSwKLQkJCQljaTItPlJGX2xuYTJnX3R1bmVfY29yZTEpOwotCi0JfSBlbHNlIHsKLQotCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJUkFESU9fMjA1N19WQ09DQUxfQ09VTlRWQUwwLAotCQkJCWNpLT5SRl92Y29jYWxfY291bnR2YWwwKTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1ZDT0NBTF9DT1VOVFZBTDEsCi0JCQkJY2ktPlJGX3Zjb2NhbF9jb3VudHZhbDEpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUkZQTExfUkVGTUFTVEVSX1NQQVJFWFRBTFNJWkUsCi0JCQkJY2ktPlJGX3JmcGxsX3JlZm1hc3Rlcl9zcGFyZXh0YWxzaXplKTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1JGUExMX0xPT1BGSUxURVJfUjEsCi0JCQkJY2ktPlJGX3JmcGxsX2xvb3BmaWx0ZXJfcjEpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUkZQTExfTE9PUEZJTFRFUl9DMiwKLQkJCQljaS0+UkZfcmZwbGxfbG9vcGZpbHRlcl9jMik7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19SRlBMTF9MT09QRklMVEVSX0MxLAotCQkJCWNpLT5SRl9yZnBsbF9sb29wZmlsdGVyX2MxKTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X0NQX0tQRF9JREFDLCBjaS0+UkZfY3Bfa3BkX2lkYWMpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUkZQTExfTU1EMCwgY2ktPlJGX3JmcGxsX21tZDApOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUkZQTExfTU1EMSwgY2ktPlJGX3JmcGxsX21tZDEpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfVkNPQlVGX1RVTkUsIGNpLT5SRl92Y29idWZfdHVuZSk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQlSQURJT18yMDU3X0xPR0VOX01YMkdfVFVORSwKLQkJCQljaS0+UkZfbG9nZW5fbXgyZ190dW5lKTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X0xPR0VOX01YNUdfVFVORSwKLQkJCQljaS0+UkZfbG9nZW5fbXg1Z190dW5lKTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X0xPR0VOX0lOREJVRjJHX1RVTkUsCi0JCQkJY2ktPlJGX2xvZ2VuX2luZGJ1ZjJnX3R1bmUpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfTE9HRU5fSU5EQlVGNUdfVFVORSwKLQkJCQljaS0+UkZfbG9nZW5faW5kYnVmNWdfdHVuZSk7Ci0KLQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCVJBRElPXzIwNTdfVFhNSVgyR19UVU5FX0JPT1NUX1BVX0NPUkUwLAotCQkJCWNpLT5SRl90eG1peDJnX3R1bmVfYm9vc3RfcHVfY29yZTApOwotCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJUkFESU9fMjA1N19QQUQyR19UVU5FX1BVU19DT1JFMCwKLQkJCQljaS0+UkZfcGFkMmdfdHVuZV9wdXNfY29yZTApOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUEdBX0JPT1NUX1RVTkVfQ09SRTAsCi0JCQkJY2ktPlJGX3BnYV9ib29zdF90dW5lX2NvcmUwKTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1RYTUlYNUdfQk9PU1RfVFVORV9DT1JFMCwKLQkJCQljaS0+UkZfdHhtaXg1Z19ib29zdF90dW5lX2NvcmUwKTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1BBRDVHX1RVTkVfTUlTQ19QVVNfQ09SRTAsCi0JCQkJY2ktPlJGX3BhZDVnX3R1bmVfbWlzY19wdXNfY29yZTApOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfTE5BMkdfVFVORV9DT1JFMCwKLQkJCQljaS0+UkZfbG5hMmdfdHVuZV9jb3JlMCk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19MTkE1R19UVU5FX0NPUkUwLAotCQkJCWNpLT5SRl9sbmE1Z190dW5lX2NvcmUwKTsKLQotCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJUkFESU9fMjA1N19UWE1JWDJHX1RVTkVfQk9PU1RfUFVfQ09SRTEsCi0JCQkJY2ktPlJGX3R4bWl4MmdfdHVuZV9ib29zdF9wdV9jb3JlMSk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQlSQURJT18yMDU3X1BBRDJHX1RVTkVfUFVTX0NPUkUxLAotCQkJCWNpLT5SRl9wYWQyZ190dW5lX3B1c19jb3JlMSk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19QR0FfQk9PU1RfVFVORV9DT1JFMSwKLQkJCQljaS0+UkZfcGdhX2Jvb3N0X3R1bmVfY29yZTEpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfVFhNSVg1R19CT09TVF9UVU5FX0NPUkUxLAotCQkJCWNpLT5SRl90eG1peDVnX2Jvb3N0X3R1bmVfY29yZTEpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUEFENUdfVFVORV9NSVNDX1BVU19DT1JFMSwKLQkJCQljaS0+UkZfcGFkNWdfdHVuZV9taXNjX3B1c19jb3JlMSk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19MTkEyR19UVU5FX0NPUkUxLAotCQkJCWNpLT5SRl9sbmEyZ190dW5lX2NvcmUxKTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X0xOQTVHX1RVTkVfQ09SRTEsCi0JCQkJY2ktPlJGX2xuYTVnX3R1bmVfY29yZTEpOwotCX0KLQotCWlmICgocGktPnB1YnBpLnJhZGlvcmV2IDw9IDQpIHx8IChwaS0+cHVicGkucmFkaW9yZXYgPT0gNikpIHsKLQotCQlpZiAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1JGUExMX0xPT1BGSUxURVJfUjEsCi0JCQkJCTB4M2YpOwotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X0NQX0tQRF9JREFDLCAweDNmKTsKLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19SRlBMTF9MT09QRklMVEVSX0MxLAotCQkJCQkweDgpOwotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1JGUExMX0xPT1BGSUxURVJfQzIsCi0JCQkJCTB4OCk7Ci0JCX0gZWxzZSB7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUkZQTExfTE9PUEZJTFRFUl9SMSwKLQkJCQkJMHgxZik7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfQ1BfS1BEX0lEQUMsIDB4M2YpOwotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1JGUExMX0xPT1BGSUxURVJfQzEsCi0JCQkJCTB4OCk7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUkZQTExfTE9PUEZJTFRFUl9DMiwKLQkJCQkJMHg4KTsKLQkJfQotCX0gZWxzZSBpZiAoKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA1KSB8fCAocGktPnB1YnBpLnJhZGlvcmV2ID09IDcpIHx8Ci0JCSAgIChwaS0+cHVicGkucmFkaW9yZXYgPT0gOCkpIHsKLQotCQlpZiAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1JGUExMX0xPT1BGSUxURVJfUjEsCi0JCQkJCTB4MWIpOwotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X0NQX0tQRF9JREFDLCAweDMwKTsKLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19SRlBMTF9MT09QRklMVEVSX0MxLAotCQkJCQkweGEpOwotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1JGUExMX0xPT1BGSUxURVJfQzIsCi0JCQkJCTB4YSk7Ci0JCX0gZWxzZSB7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUkZQTExfTE9PUEZJTFRFUl9SMSwKLQkJCQkJMHgxZik7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfQ1BfS1BEX0lEQUMsIDB4M2YpOwotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1JGUExMX0xPT1BGSUxURVJfQzEsCi0JCQkJCTB4OCk7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUkZQTExfTE9PUEZJTFRFUl9DMiwKLQkJCQkJMHg4KTsKLQkJfQotCi0JfQotCi0JaWYgKENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJaWYgKFBIWV9JUEEocGkpKSB7Ci0JCQlpZiAocGktPnB1YnBpLnJhZGlvcmV2ID09IDMpIHsKLQkJCQl0eG1peDJnX3R1bmVfYm9vc3RfcHUgPSAweDZiOwotCQkJfQotCi0JCQlpZiAocGktPnB1YnBpLnJhZGlvcmV2ID09IDUpCi0JCQkJcGFkMmdfdHVuZV9wdXMgPSAweDczOwotCi0JCX0gZWxzZSB7Ci0JCQlpZiAocGktPnB1YnBpLnJhZGlvcmV2ICE9IDUpIHsKLQkJCQlwYWQyZ190dW5lX3B1cyA9IDB4MzsKLQotCQkJCXR4bWl4MmdfdHVuZV9ib29zdF9wdSA9IDB4NjE7Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKGNvcmVOdW0gPSAwOyBjb3JlTnVtIDw9IDE7IGNvcmVOdW0rKykgewotCi0JCQlpZiAodHhtaXgyZ190dW5lX2Jvb3N0X3B1ICE9IDApCi0JCQkJV1JJVEVfUkFESU9fUkVHNChwaSwgUkFESU9fMjA1NywgQ09SRSwgY29yZU51bSwKLQkJCQkJCSBUWE1JWDJHX1RVTkVfQk9PU1RfUFUsCi0JCQkJCQkgdHhtaXgyZ190dW5lX2Jvb3N0X3B1KTsKLQotCQkJaWYgKHBhZDJnX3R1bmVfcHVzICE9IDApCi0JCQkJV1JJVEVfUkFESU9fUkVHNChwaSwgUkFESU9fMjA1NywgQ09SRSwgY29yZU51bSwKLQkJCQkJCSBQQUQyR19UVU5FX1BVUywKLQkJCQkJCSBwYWQyZ190dW5lX3B1cyk7Ci0JCX0KLQl9Ci0KLQl1ZGVsYXkoNTApOwotCi0Jd2xjX3BoeV9yYWRpbzIwNXhfdmNvY2FsX25waHkocGkpOwotfQotCi1zdGF0aWMgdTE2IHdsY19waHlfcmFkaW8yMDU3X3JjY2FsKHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXUxNiByY2NhbF92YWxpZDsKLQlpbnQgaTsKLQlib29sIGNoaXA0MzIyNl82MzYyQTA7Ci0KLQljaGlwNDMyMjZfNjM2MkEwID0gKChwaS0+cHVicGkucmFkaW9yZXYgPT0gMykKLQkJCSAgICB8fCAocGktPnB1YnBpLnJhZGlvcmV2ID09IDQpCi0JCQkgICAgfHwgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA2KSk7Ci0KLQlyY2NhbF92YWxpZCA9IDA7Ci0JaWYgKGNoaXA0MzIyNl82MzYyQTApIHsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1JDQ0FMX01BU1RFUiwgMHg2MSk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19SQ0NBTF9UUkMwLCAweGMwKTsKLQl9IGVsc2UgewotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTd2N19SQ0NBTF9NQVNURVIsIDB4NjEpOwotCi0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19SQ0NBTF9UUkMwLCAweGU5KTsKLQl9Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1JDQ0FMX1gxLCAweDZlKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUkNDQUxfU1RBUlRfUjFfUTFfUDEsIDB4NTUpOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF8yMDV4X1JDQUxfV0FJVExPT1BTOyBpKyspIHsKLQkJcmNjYWxfdmFsaWQgPSByZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19SQ0NBTF9ET05FX09TQ0NBUCk7Ci0JCWlmIChyY2NhbF92YWxpZCAmIDB4MikgewotCQkJYnJlYWs7Ci0JCX0KLQkJdWRlbGF5KDUwMCk7Ci0JfQotCi0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1JDQ0FMX1NUQVJUX1IxX1ExX1AxLCAweDE1KTsKLQotCXJjY2FsX3ZhbGlkID0gMDsKLQlpZiAoY2hpcDQzMjI2XzYzNjJBMCkgewotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUkNDQUxfTUFTVEVSLCAweDY5KTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1JDQ0FMX1RSQzAsIDB4YjApOwotCX0gZWxzZSB7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N3Y3X1JDQ0FMX01BU1RFUiwgMHg2OSk7Ci0KLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1JDQ0FMX1RSQzAsIDB4ZDUpOwotCX0KLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUkNDQUxfWDEsIDB4NmUpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19SQ0NBTF9TVEFSVF9SMV9RMV9QMSwgMHg1NSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYXzIwNXhfUkNBTF9XQUlUTE9PUFM7IGkrKykgewotCQlyY2NhbF92YWxpZCA9IHJlYWRfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1JDQ0FMX0RPTkVfT1NDQ0FQKTsKLQkJaWYgKHJjY2FsX3ZhbGlkICYgMHgyKSB7Ci0JCQlicmVhazsKLQkJfQotCQl1ZGVsYXkoNTAwKTsKLQl9Ci0KLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUkNDQUxfU1RBUlRfUjFfUTFfUDEsIDB4MTUpOwotCi0JcmNjYWxfdmFsaWQgPSAwOwotCWlmIChjaGlwNDMyMjZfNjM2MkEwKSB7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19SQ0NBTF9NQVNURVIsIDB4NzMpOwotCi0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19SQ0NBTF9YMSwgMHgyOCk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19SQ0NBTF9UUkMwLCAweGIwKTsKLQl9IGVsc2UgewotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTd2N19SQ0NBTF9NQVNURVIsIDB4NzMpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUkNDQUxfWDEsIDB4NmUpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUkNDQUxfVFJDMCwgMHg5OSk7Ci0JfQotCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19SQ0NBTF9TVEFSVF9SMV9RMV9QMSwgMHg1NSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTUFYXzIwNXhfUkNBTF9XQUlUTE9PUFM7IGkrKykgewotCQlyY2NhbF92YWxpZCA9IHJlYWRfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1JDQ0FMX0RPTkVfT1NDQ0FQKTsKLQkJaWYgKHJjY2FsX3ZhbGlkICYgMHgyKSB7Ci0JCQlicmVhazsKLQkJfQotCQl1ZGVsYXkoNTAwKTsKLQl9Ci0KLQlpZiAoV0FSTighKHJjY2FsX3ZhbGlkICYgMHgyKSwgIkhXIGVycm9yOiByYWRpbyBjYWxpYjQiKSkKLQkJcmV0dXJuIDA7Ci0KLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfUkNDQUxfU1RBUlRfUjFfUTFfUDEsIDB4MTUpOwotCi0JcmV0dXJuIHJjY2FsX3ZhbGlkOwotfQotCi1zdGF0aWMgdm9pZAotd2xjX3BoeV9hZGp1c3RfcnhfYW5hbHBmYndfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTE2IHJlZHVjdGlvbl9mYWN0cikKLXsKLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykgJiYgTlJFVl9MVChwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQkJaWYgKChDSFNQRUNfQ0hBTk5FTChwaS0+cmFkaW9fY2hhbnNwZWMpID09IDExKSAmJgotCQkgICAgQ0hTUEVDX0lTNDAocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJaWYgKCFwaS0+bnBoeV9hbmFyeGxwZl9hZGp1c3RlZCkgewotCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCShSQURJT18yMDU2X1JYX1JYTFBGX1JDQ0FMX0xQQyB8Ci0JCQkJCQkgUkFESU9fMjA1Nl9SWDApLAotCQkJCQkJKChwaS0+bnBoeV9yY2NhbF92YWx1ZSArCi0JCQkJCQkgIHJlZHVjdGlvbl9mYWN0cikgfCAweDgwKSk7Ci0KLQkJCQlwaS0+bnBoeV9hbmFyeGxwZl9hZGp1c3RlZCA9IHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocGktPm5waHlfYW5hcnhscGZfYWRqdXN0ZWQpIHsKLQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQkoUkFESU9fMjA1Nl9SWF9SWExQRl9SQ0NBTF9MUEMgfAotCQkJCQkJIFJBRElPXzIwNTZfUlgwKSwKLQkJCQkJCShwaS0+bnBoeV9yY2NhbF92YWx1ZSB8IDB4ODApKTsKLQotCQkJCXBpLT5ucGh5X2FuYXJ4bHBmX2FkanVzdGVkID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi13bGNfcGh5X2FkanVzdF9taW5fbm9pc2V2YXJfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgaW50IG50b25lcywKLQkJCQkgaW50ICp0b25lX2lkX2J1ZiwgdTMyICpub2lzZV92YXJfYnVmKQotewotCWludCBpOwotCXUzMiBvZmZzZXQ7Ci0JaW50IHRvbmVfaWQ7Ci0JaW50IHRibGxlbiA9Ci0JICAgIENIU1BFQ19JUzQwKHBpLT4KLQkJCXJhZGlvX2NoYW5zcGVjKSA/IE5QSFlfTk9JU0VWQVJfVEJMTEVONDAgOgotCSAgICBOUEhZX05PSVNFVkFSX1RCTExFTjIwOwotCi0JaWYgKHBpLT5ucGh5X25vaXNldmFyc19hZGp1c3RlZCkgewotCQlmb3IgKGkgPSAwOyBpIDwgcGktPm5waHlfc2F2ZWRfbm9pc2V2YXJzLmJ1ZmNvdW50OyBpKyspIHsKLQkJCXRvbmVfaWQgPSBwaS0+bnBoeV9zYXZlZF9ub2lzZXZhcnMudG9uZV9pZFtpXTsKLQkJCW9mZnNldCA9ICh0b25lX2lkID49IDApID8KLQkJCSAgICAoKHRvbmVfaWQgKiAyKSArIDEpIDogKHRibGxlbiArICh0b25lX2lkICogMikgKyAxKTsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfTk9JU0VWQVIsIDEsCi0JCQkJCQkgb2Zmc2V0LCAzMiwKLQkJCQkJCSAodm9pZCAqKSZwaS0+Ci0JCQkJCQkgbnBoeV9zYXZlZF9ub2lzZXZhcnMuCi0JCQkJCQkgbWluX25vaXNlX3ZhcnNbaV0pOwotCQl9Ci0KLQkJcGktPm5waHlfc2F2ZWRfbm9pc2V2YXJzLmJ1ZmNvdW50ID0gMDsKLQkJcGktPm5waHlfbm9pc2V2YXJzX2FkanVzdGVkID0gZmFsc2U7Ci0JfQotCi0JaWYgKChub2lzZV92YXJfYnVmICE9IE5VTEwpICYmICh0b25lX2lkX2J1ZiAhPSBOVUxMKSkgewotCQlwaS0+bnBoeV9zYXZlZF9ub2lzZXZhcnMuYnVmY291bnQgPSAwOwotCi0JCWZvciAoaSA9IDA7IGkgPCBudG9uZXM7IGkrKykgewotCQkJdG9uZV9pZCA9IHRvbmVfaWRfYnVmW2ldOwotCQkJb2Zmc2V0ID0gKHRvbmVfaWQgPj0gMCkgPwotCQkJICAgICgodG9uZV9pZCAqIDIpICsgMSkgOiAodGJsbGVuICsgKHRvbmVfaWQgKiAyKSArIDEpOwotCQkJcGktPm5waHlfc2F2ZWRfbm9pc2V2YXJzLnRvbmVfaWRbaV0gPSB0b25lX2lkOwotCQkJd2xjX3BoeV90YWJsZV9yZWFkX25waHkocGksIE5QSFlfVEJMX0lEX05PSVNFVkFSLCAxLAotCQkJCQkJb2Zmc2V0LCAzMiwKLQkJCQkJCSZwaS0+bnBoeV9zYXZlZF9ub2lzZXZhcnMuCi0JCQkJCQltaW5fbm9pc2VfdmFyc1tpXSk7Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX05PSVNFVkFSLCAxLAotCQkJCQkJIG9mZnNldCwgMzIsCi0JCQkJCQkgKHZvaWQgKikmbm9pc2VfdmFyX2J1ZltpXSk7Ci0JCQlwaS0+bnBoeV9zYXZlZF9ub2lzZXZhcnMuYnVmY291bnQrKzsKLQkJfQotCi0JCXBpLT5ucGh5X25vaXNldmFyc19hZGp1c3RlZCA9IHRydWU7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X2FkanVzdF9jcnNtaW5wd3JfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTggbWlucHdyKQotewotCXUxNiByZWd2YWw7Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJaWYgKChDSFNQRUNfQ0hBTk5FTChwaS0+cmFkaW9fY2hhbnNwZWMpID09IDExKSAmJgotCQkgICAgQ0hTUEVDX0lTNDAocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJaWYgKCFwaS0+bnBoeV9jcnNtaW5wd3JfYWRqdXN0ZWQpIHsKLQkJCQlyZWd2YWwgPSByZWFkX3BoeV9yZWcocGksIDB4MjdkKTsKLQkJCQlwaS0+bnBoeV9jcnNtaW5wd3JbMF0gPSByZWd2YWwgJiAweGZmOwotCQkJCXJlZ3ZhbCAmPSAweGZmMDA7Ci0JCQkJcmVndmFsIHw9ICh1MTYpIG1pbnB3cjsKLQkJCQl3cml0ZV9waHlfcmVnKHBpLCAweDI3ZCwgcmVndmFsKTsKLQotCQkJCXJlZ3ZhbCA9IHJlYWRfcGh5X3JlZyhwaSwgMHgyODApOwotCQkJCXBpLT5ucGh5X2Nyc21pbnB3clsxXSA9IHJlZ3ZhbCAmIDB4ZmY7Ci0JCQkJcmVndmFsICY9IDB4ZmYwMDsKLQkJCQlyZWd2YWwgfD0gKHUxNikgbWlucHdyOwotCQkJCXdyaXRlX3BoeV9yZWcocGksIDB4MjgwLCByZWd2YWwpOwotCi0JCQkJcmVndmFsID0gcmVhZF9waHlfcmVnKHBpLCAweDI4Myk7Ci0JCQkJcGktPm5waHlfY3JzbWlucHdyWzJdID0gcmVndmFsICYgMHhmZjsKLQkJCQlyZWd2YWwgJj0gMHhmZjAwOwotCQkJCXJlZ3ZhbCB8PSAodTE2KSBtaW5wd3I7Ci0JCQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgyODMsIHJlZ3ZhbCk7Ci0KLQkJCQlwaS0+bnBoeV9jcnNtaW5wd3JfYWRqdXN0ZWQgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHBpLT5ucGh5X2Nyc21pbnB3cl9hZGp1c3RlZCkgewotCQkJCXJlZ3ZhbCA9IHJlYWRfcGh5X3JlZyhwaSwgMHgyN2QpOwotCQkJCXJlZ3ZhbCAmPSAweGZmMDA7Ci0JCQkJcmVndmFsIHw9IHBpLT5ucGh5X2Nyc21pbnB3clswXTsKLQkJCQl3cml0ZV9waHlfcmVnKHBpLCAweDI3ZCwgcmVndmFsKTsKLQotCQkJCXJlZ3ZhbCA9IHJlYWRfcGh5X3JlZyhwaSwgMHgyODApOwotCQkJCXJlZ3ZhbCAmPSAweGZmMDA7Ci0JCQkJcmVndmFsIHw9IHBpLT5ucGh5X2Nyc21pbnB3clsxXTsKLQkJCQl3cml0ZV9waHlfcmVnKHBpLCAweDI4MCwgcmVndmFsKTsKLQotCQkJCXJlZ3ZhbCA9IHJlYWRfcGh5X3JlZyhwaSwgMHgyODMpOwotCQkJCXJlZ3ZhbCAmPSAweGZmMDA7Ci0JCQkJcmVndmFsIHw9IHBpLT5ucGh5X2Nyc21pbnB3clsyXTsKLQkJCQl3cml0ZV9waHlfcmVnKHBpLCAweDI4MywgcmVndmFsKTsKLQotCQkJCXBpLT5ucGh5X2Nyc21pbnB3cl9hZGp1c3RlZCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3R4bHBmYndfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQl1OCB0eF9scGZfYncgPSAwOwotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpICYmIE5SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCWlmIChDSFNQRUNfSVM0MChwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQl0eF9scGZfYncgPSAzOwotCQl9IGVsc2UgewotCQkJdHhfbHBmX2J3ID0gMTsKLQkJfQotCi0JCWlmIChQSFlfSVBBKHBpKSkgewotCQkJaWYgKENIU1BFQ19JUzQwKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCQl0eF9scGZfYncgPSA1OwotCQkJfSBlbHNlIHsKLQkJCQl0eF9scGZfYncgPSA0OwotCQkJfQotCQl9Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4ZTgsCi0JCQkgICAgICAodHhfbHBmX2J3IDw8IDApIHwKLQkJCSAgICAgICh0eF9scGZfYncgPDwgMykgfAotCQkJICAgICAgKHR4X2xwZl9idyA8PCA2KSB8ICh0eF9scGZfYncgPDwgOSkpOwotCi0JCWlmIChQSFlfSVBBKHBpKSkgewotCi0JCQlpZiAoQ0hTUEVDX0lTNDAocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJCXR4X2xwZl9idyA9IDQ7Ci0JCQl9IGVsc2UgewotCQkJCXR4X2xwZl9idyA9IDE7Ci0JCQl9Ci0KLQkJCXdyaXRlX3BoeV9yZWcocGksIDB4ZTksCi0JCQkJICAgICAgKHR4X2xwZl9idyA8PCAwKSB8Ci0JCQkJICAgICAgKHR4X2xwZl9idyA8PCAzKSB8Ci0JCQkJICAgICAgKHR4X2xwZl9idyA8PCA2KSB8ICh0eF9scGZfYncgPDwgOSkpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3NwdXJ3YXJfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQl1MTYgY3VyX2NoYW5uZWwgPSAwOwotCWludCBucGh5X2Fkal90b25lX2lkX2J1ZltdID0geyA1NywgNTggfTsKLQl1MzIgbnBoeV9hZGpfbm9pc2VfdmFyX2J1ZltdID0geyAweDNmZiwgMHgzZmYgfTsKLQlib29sIGlzQWRqdXN0Tm9pc2VWYXIgPSBmYWxzZTsKLQl1aW50IG51bVRvbmVzQWRqdXN0ID0gMDsKLQl1MzIgdGVtcHZhbCA9IDA7Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJaWYgKHBpLT5waHloYW5nX2F2b2lkKQotCQkJd2xjX3BoeV9zdGF5X2luX2NhcnJpZXJzZWFyY2hfbnBoeShwaSwgdHJ1ZSk7Ci0KLQkJY3VyX2NoYW5uZWwgPSBDSFNQRUNfQ0hBTk5FTChwaS0+cmFkaW9fY2hhbnNwZWMpOwotCi0JCWlmIChwaS0+bnBoeV9nYmFuZF9zcHVyd2FyX2VuKSB7Ci0KLQkJCXdsY19waHlfYWRqdXN0X3J4X2FuYWxwZmJ3X25waHkocGksCi0JCQkJCQkJTlBIWV9BTkFSWExQRkJXX1JFRFVDVElPTkZBQ1QpOwotCi0JCQlpZiAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJCWlmICgoY3VyX2NoYW5uZWwgPT0gMTEpCi0JCQkJICAgICYmIENIU1BFQ19JUzQwKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQotCQkJCQl3bGNfcGh5X2FkanVzdF9taW5fbm9pc2V2YXJfbnBoeShwaSwgMiwKLQkJCQkJCQkJCSBucGh5X2Fkal90b25lX2lkX2J1ZiwKLQkJCQkJCQkJCSBucGh5X2Fkal9ub2lzZV92YXJfYnVmKTsKLQkJCQl9IGVsc2UgewotCi0JCQkJCXdsY19waHlfYWRqdXN0X21pbl9ub2lzZXZhcl9ucGh5KHBpLCAwLAotCQkJCQkJCQkJIE5VTEwsCi0JCQkJCQkJCQkgTlVMTCk7Ci0JCQkJfQotCQkJfQotCQkJd2xjX3BoeV9hZGp1c3RfY3JzbWlucHdyX25waHkocGksCi0JCQkJCQkgICAgICBOUEhZX0FESlVTVEVEX01JTkNSU1BPV0VSKTsKLQkJfQotCi0JCWlmICgocGktPm5waHlfZ2JhbmRfc3B1cndhcjJfZW4pCi0JCSAgICAmJiBDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0KLQkJCWlmIChDSFNQRUNfSVM0MChwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQkJc3dpdGNoIChjdXJfY2hhbm5lbCkgewotCQkJCWNhc2UgMzoKLQkJCQkJbnBoeV9hZGpfdG9uZV9pZF9idWZbMF0gPSA1NzsKLQkJCQkJbnBoeV9hZGpfdG9uZV9pZF9idWZbMV0gPSA1ODsKLQkJCQkJbnBoeV9hZGpfbm9pc2VfdmFyX2J1ZlswXSA9IDB4MjJmOwotCQkJCQlucGh5X2Fkal9ub2lzZV92YXJfYnVmWzFdID0gMHgyNWY7Ci0JCQkJCWlzQWRqdXN0Tm9pc2VWYXIgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDQ6Ci0JCQkJCW5waHlfYWRqX3RvbmVfaWRfYnVmWzBdID0gNDE7Ci0JCQkJCW5waHlfYWRqX3RvbmVfaWRfYnVmWzFdID0gNDI7Ci0JCQkJCW5waHlfYWRqX25vaXNlX3Zhcl9idWZbMF0gPSAweDIyZjsKLQkJCQkJbnBoeV9hZGpfbm9pc2VfdmFyX2J1ZlsxXSA9IDB4MjVmOwotCQkJCQlpc0FkanVzdE5vaXNlVmFyID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA1OgotCQkJCQlucGh5X2Fkal90b25lX2lkX2J1ZlswXSA9IDI1OwotCQkJCQlucGh5X2Fkal90b25lX2lkX2J1ZlsxXSA9IDI2OwotCQkJCQlucGh5X2Fkal9ub2lzZV92YXJfYnVmWzBdID0gMHgyNGY7Ci0JCQkJCW5waHlfYWRqX25vaXNlX3Zhcl9idWZbMV0gPSAweDI1ZjsKLQkJCQkJaXNBZGp1c3ROb2lzZVZhciA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNjoKLQkJCQkJbnBoeV9hZGpfdG9uZV9pZF9idWZbMF0gPSA5OwotCQkJCQlucGh5X2Fkal90b25lX2lkX2J1ZlsxXSA9IDEwOwotCQkJCQlucGh5X2Fkal9ub2lzZV92YXJfYnVmWzBdID0gMHgyMmY7Ci0JCQkJCW5waHlfYWRqX25vaXNlX3Zhcl9idWZbMV0gPSAweDI0ZjsKLQkJCQkJaXNBZGp1c3ROb2lzZVZhciA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNzoKLQkJCQkJbnBoeV9hZGpfdG9uZV9pZF9idWZbMF0gPSAxMjE7Ci0JCQkJCW5waHlfYWRqX3RvbmVfaWRfYnVmWzFdID0gMTIyOwotCQkJCQlucGh5X2Fkal9ub2lzZV92YXJfYnVmWzBdID0gMHgxOGY7Ci0JCQkJCW5waHlfYWRqX25vaXNlX3Zhcl9idWZbMV0gPSAweDI0ZjsKLQkJCQkJaXNBZGp1c3ROb2lzZVZhciA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgODoKLQkJCQkJbnBoeV9hZGpfdG9uZV9pZF9idWZbMF0gPSAxMDU7Ci0JCQkJCW5waHlfYWRqX3RvbmVfaWRfYnVmWzFdID0gMTA2OwotCQkJCQlucGh5X2Fkal9ub2lzZV92YXJfYnVmWzBdID0gMHgyMmY7Ci0JCQkJCW5waHlfYWRqX25vaXNlX3Zhcl9idWZbMV0gPSAweDI1ZjsKLQkJCQkJaXNBZGp1c3ROb2lzZVZhciA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgOToKLQkJCQkJbnBoeV9hZGpfdG9uZV9pZF9idWZbMF0gPSA4OTsKLQkJCQkJbnBoeV9hZGpfdG9uZV9pZF9idWZbMV0gPSA5MDsKLQkJCQkJbnBoeV9hZGpfbm9pc2VfdmFyX2J1ZlswXSA9IDB4MjJmOwotCQkJCQlucGh5X2Fkal9ub2lzZV92YXJfYnVmWzFdID0gMHgyNGY7Ci0JCQkJCWlzQWRqdXN0Tm9pc2VWYXIgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDEwOgotCQkJCQlucGh5X2Fkal90b25lX2lkX2J1ZlswXSA9IDczOwotCQkJCQlucGh5X2Fkal90b25lX2lkX2J1ZlsxXSA9IDc0OwotCQkJCQlucGh5X2Fkal9ub2lzZV92YXJfYnVmWzBdID0gMHgyMmY7Ci0JCQkJCW5waHlfYWRqX25vaXNlX3Zhcl9idWZbMV0gPSAweDI0ZjsKLQkJCQkJaXNBZGp1c3ROb2lzZVZhciA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWlzQWRqdXN0Tm9pc2VWYXIgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoaXNBZGp1c3ROb2lzZVZhcikgewotCQkJCW51bVRvbmVzQWRqdXN0ID0gc2l6ZW9mKG5waHlfYWRqX3RvbmVfaWRfYnVmKSAvCi0JCQkJICAgIHNpemVvZihucGh5X2Fkal90b25lX2lkX2J1ZlswXSk7Ci0KLQkJCQl3bGNfcGh5X2FkanVzdF9taW5fbm9pc2V2YXJfbnBoeShwaSwKLQkJCQkJCQkJIG51bVRvbmVzQWRqdXN0LAotCQkJCQkJCQkgbnBoeV9hZGpfdG9uZV9pZF9idWYsCi0JCQkJCQkJCSBucGh5X2Fkal9ub2lzZV92YXJfYnVmKTsKLQotCQkJCXRlbXB2YWwgPSAwOwotCi0JCQl9IGVsc2UgewotCi0JCQkJd2xjX3BoeV9hZGp1c3RfbWluX25vaXNldmFyX25waHkocGksIDAsIE5VTEwsCi0JCQkJCQkJCSBOVUxMKTsKLQkJCX0KLQkJfQotCi0JCWlmICgocGktPm5waHlfYWJhbmRfc3B1cndhcl9lbikgJiYKLQkJICAgIChDSFNQRUNfSVM1RyhwaS0+cmFkaW9fY2hhbnNwZWMpKSkgewotCQkJc3dpdGNoIChjdXJfY2hhbm5lbCkgewotCQkJY2FzZSA1NDoKLQkJCQlucGh5X2Fkal90b25lX2lkX2J1ZlswXSA9IDMyOwotCQkJCW5waHlfYWRqX25vaXNlX3Zhcl9idWZbMF0gPSAweDI1ZjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzg6Ci0JCQljYXNlIDEwMjoKLQkJCWNhc2UgMTE4OgotCQkJCW5waHlfYWRqX3RvbmVfaWRfYnVmWzBdID0gMDsKLQkJCQlucGh5X2Fkal9ub2lzZV92YXJfYnVmWzBdID0gMHgwOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxMzQ6Ci0JCQkJbnBoeV9hZGpfdG9uZV9pZF9idWZbMF0gPSAzMjsKLQkJCQlucGh5X2Fkal9ub2lzZV92YXJfYnVmWzBdID0gMHgyMWY7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE1MToKLQkJCQlucGh5X2Fkal90b25lX2lkX2J1ZlswXSA9IDE2OwotCQkJCW5waHlfYWRqX25vaXNlX3Zhcl9idWZbMF0gPSAweDIzZjsKLQkJCQlicmVhazsKLQkJCWNhc2UgMTUzOgotCQkJY2FzZSAxNjE6Ci0JCQkJbnBoeV9hZGpfdG9uZV9pZF9idWZbMF0gPSA0ODsKLQkJCQlucGh5X2Fkal9ub2lzZV92YXJfYnVmWzBdID0gMHgyM2Y7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCW5waHlfYWRqX3RvbmVfaWRfYnVmWzBdID0gMDsKLQkJCQlucGh5X2Fkal9ub2lzZV92YXJfYnVmWzBdID0gMHgwOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAobnBoeV9hZGpfdG9uZV9pZF9idWZbMF0KLQkJCSAgICAmJiBucGh5X2Fkal9ub2lzZV92YXJfYnVmWzBdKSB7Ci0JCQkJd2xjX3BoeV9hZGp1c3RfbWluX25vaXNldmFyX25waHkocGksIDEsCi0JCQkJCQkJCSBucGh5X2Fkal90b25lX2lkX2J1ZiwKLQkJCQkJCQkJIG5waHlfYWRqX25vaXNlX3Zhcl9idWYpOwotCQkJfSBlbHNlIHsKLQkJCQl3bGNfcGh5X2FkanVzdF9taW5fbm9pc2V2YXJfbnBoeShwaSwgMCwgTlVMTCwKLQkJCQkJCQkJIE5VTEwpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHBpLT5waHloYW5nX2F2b2lkKQotCQkJd2xjX3BoeV9zdGF5X2luX2NhcnJpZXJzZWFyY2hfbnBoeShwaSwgZmFsc2UpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLXdsY19waHlfY2hhbnNwZWNfbnBoeV9zZXR1cChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgY2hhbnNwZWNfdCBjaGFuc3BlYywKLQkJCSAgICBjb25zdCBzdHJ1Y3QgbnBoeV9zZm9fY2ZnICpjaSkKLXsKLQl1MTYgdmFsOwotCi0JdmFsID0gcmVhZF9waHlfcmVnKHBpLCAweDA5KSAmIE5QSFlfQmFuZENvbnRyb2xfY3VycmVudEJhbmQ7Ci0JaWYgKENIU1BFQ19JUzVHKGNoYW5zcGVjKSAmJiAhdmFsKSB7Ci0KLQkJdmFsID0gUl9SRUcoJnBpLT5yZWdzLT5wc21fcGh5X2hkcl9wYXJhbSk7Ci0JCVdfUkVHKCZwaS0+cmVncy0+cHNtX3BoeV9oZHJfcGFyYW0sCi0JCSAgICAgICh2YWwgfCBNQUNfUEhZX0ZPUkNFX0NMSykpOwotCi0JCW9yX3BoeV9yZWcocGksIChOUEhZX1RPX0JQSFlfT0ZGICsgQlBIWV9CQl9DT05GSUcpLAotCQkJICAgKEJCQ0ZHX1JFU0VUQ0NBIHwgQkJDRkdfUkVTRVRSWCkpOwotCi0JCVdfUkVHKCZwaS0+cmVncy0+cHNtX3BoeV9oZHJfcGFyYW0sIHZhbCk7Ci0KLQkJb3JfcGh5X3JlZyhwaSwgMHgwOSwgTlBIWV9CYW5kQ29udHJvbF9jdXJyZW50QmFuZCk7Ci0JfSBlbHNlIGlmICghQ0hTUEVDX0lTNUcoY2hhbnNwZWMpICYmIHZhbCkgewotCi0JCWFuZF9waHlfcmVnKHBpLCAweDA5LCB+TlBIWV9CYW5kQ29udHJvbF9jdXJyZW50QmFuZCk7Ci0KLQkJdmFsID0gUl9SRUcoJnBpLT5yZWdzLT5wc21fcGh5X2hkcl9wYXJhbSk7Ci0JCVdfUkVHKCZwaS0+cmVncy0+cHNtX3BoeV9oZHJfcGFyYW0sCi0JCSAgICAgICh2YWwgfCBNQUNfUEhZX0ZPUkNFX0NMSykpOwotCi0JCWFuZF9waHlfcmVnKHBpLCAoTlBIWV9UT19CUEhZX09GRiArIEJQSFlfQkJfQ09ORklHKSwKLQkJCSAgICAodTE2KSAofihCQkNGR19SRVNFVENDQSB8IEJCQ0ZHX1JFU0VUUlgpKSk7Ci0KLQkJV19SRUcoJnBpLT5yZWdzLT5wc21fcGh5X2hkcl9wYXJhbSwgdmFsKTsKLQl9Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCAweDFjZSwgY2ktPlBIWV9CVzFhKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDFjZiwgY2ktPlBIWV9CVzIpOwotCXdyaXRlX3BoeV9yZWcocGksIDB4MWQwLCBjaS0+UEhZX0JXMyk7Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCAweDFkMSwgY2ktPlBIWV9CVzQpOwotCXdyaXRlX3BoeV9yZWcocGksIDB4MWQyLCBjaS0+UEhZX0JXNSk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHgxZDMsIGNpLT5QSFlfQlc2KTsKLQotCWlmIChDSFNQRUNfQ0hBTk5FTChwaS0+cmFkaW9fY2hhbnNwZWMpID09IDE0KSB7Ci0JCXdsY19waHlfY2xhc3NpZmllcl9ucGh5KHBpLCBOUEhZX0NsYXNzaWZpZXJDdHJsX29mZG1fZW4sIDApOwotCi0JCW9yX3BoeV9yZWcocGksIE5QSFlfVE9fQlBIWV9PRkYgKyBCUEhZX1RFU1QsIDB4ODAwKTsKLQl9IGVsc2UgewotCQl3bGNfcGh5X2NsYXNzaWZpZXJfbnBoeShwaSwgTlBIWV9DbGFzc2lmaWVyQ3RybF9vZmRtX2VuLAotCQkJCQlOUEhZX0NsYXNzaWZpZXJDdHJsX29mZG1fZW4pOwotCi0JCWlmIChDSFNQRUNfSVMyRyhjaGFuc3BlYykpCi0JCQlhbmRfcGh5X3JlZyhwaSwgTlBIWV9UT19CUEhZX09GRiArIEJQSFlfVEVTVCwgfjB4ODQwKTsKLQl9Ci0KLQlpZiAocGktPm5waHlfdHhwd3JjdHJsID09IFBIWV9UUENfSFdfT0ZGKSB7Ci0JCXdsY19waHlfdHhwd3JfZml4cG93ZXJfbnBoeShwaSk7Ci0JfQotCi0JaWYgKE5SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0KLQkJd2xjX3BoeV9hZGp1c3RfbG5hZ2FpbnRibF9ucGh5KHBpKTsKLQl9Ci0KLQl3bGNfcGh5X3R4bHBmYndfbnBoeShwaSk7Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykKLQkgICAgJiYgKHBpLT5waHlfc3B1cmF2b2lkICE9IFNQVVJBVk9JRF9ESVNBQkxFKSkgewotCQl1OCBzcHVyYXZvaWQgPSAwOwotCi0JCXZhbCA9IENIU1BFQ19DSEFOTkVMKGNoYW5zcGVjKTsKLQkJaWYgKCFDSFNQRUNfSVM0MChwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQkJCQlpZiAoKHZhbCA9PSAxMykgfHwgKHZhbCA9PSAxNCkgfHwgKHZhbCA9PSAxNTMpKSB7Ci0JCQkJCXNwdXJhdm9pZCA9IDE7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQotCQkJCWlmICgoKHZhbCA+PSA1KSAmJiAodmFsIDw9IDgpKSB8fCAodmFsID09IDEzKQotCQkJCSAgICB8fCAodmFsID09IDE0KSkgewotCQkJCQlzcHVyYXZvaWQgPSAxOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCQkJCWlmICh2YWwgPT0gNTQpIHsKLQkJCQkJc3B1cmF2b2lkID0gMTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCi0JCQkJaWYgKHBpLT5ucGh5X2FiYW5kX3NwdXJ3YXJfZW4gJiYKLQkJCQkgICAgKCh2YWwgPT0gMzgpIHx8ICh2YWwgPT0gMTAyKQotCQkJCSAgICAgfHwgKHZhbCA9PSAxMTgpKSkKLQkJCQkJc3B1cmF2b2lkID0gMTsKLQkJCX0KLQkJfQotCi0JCWlmIChwaS0+cGh5X3NwdXJhdm9pZCA9PSBTUFVSQVZPSURfRk9SQ0VPTikKLQkJCXNwdXJhdm9pZCA9IDE7Ci0KLQkJd2xhcGlfYm1hY19jb3JlX3BoeXBsbF9jdGwocGktPnNoLT5waHlzaGltLCBmYWxzZSk7Ci0JCXNpX3BtdV9zcHVyYXZvaWQocGktPnNoLT5zaWgsIHNwdXJhdm9pZCk7Ci0JCXdsYXBpX2JtYWNfY29yZV9waHlwbGxfY3RsKHBpLT5zaC0+cGh5c2hpbSwgdHJ1ZSk7Ci0KLQkJaWYgKChwaS0+c2gtPmNoaXAgPT0gQkNNNDMyMjRfQ0hJUF9JRCkgfHwKLQkJICAgIChwaS0+c2gtPmNoaXAgPT0gQkNNNDMyMjVfQ0hJUF9JRCkpIHsKLQotCQkJaWYgKHNwdXJhdm9pZCA9PSAxKSB7Ci0KLQkJCQlXX1JFRygmcGktPnJlZ3MtPnRzZl9jbGtfZnJhY19sLAotCQkJCSAgICAgIDB4NTM0MSk7Ci0JCQkJV19SRUcoJnBpLT5yZWdzLT50c2ZfY2xrX2ZyYWNfaCwKLQkJCQkgICAgICAweDgpOwotCQkJfSBlbHNlIHsKLQotCQkJCVdfUkVHKCZwaS0+cmVncy0+dHNmX2Nsa19mcmFjX2wsCi0JCQkJICAgICAgMHg4ODg5KTsKLQkJCQlXX1JFRygmcGktPnJlZ3MtPnRzZl9jbGtfZnJhY19oLAotCQkJCSAgICAgIDB4OCk7Ci0JCQl9Ci0JCX0KLQotCQl3bGFwaV9ibWFjX2NvcmVfcGh5cGxsX3Jlc2V0KHBpLT5zaC0+cGh5c2hpbSk7Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4MDEsICgweDEgPDwgMTUpLAotCQkJICAgICgoc3B1cmF2b2lkID4gMCkgPyAoMHgxIDw8IDE1KSA6IDApKTsKLQotCQl3bGNfcGh5X3Jlc2V0Y2NhX25waHkocGkpOwotCi0JCXBpLT5waHlfaXNzcHVyYXZvaWQgPSAoc3B1cmF2b2lkID4gMCk7Ci0JfQotCi0JaWYgKE5SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDcpKQotCQl3cml0ZV9waHlfcmVnKHBpLCAweDE3ZSwgMHgzODMwKTsKLQotCXdsY19waHlfc3B1cndhcl9ucGh5KHBpKTsKLX0KLQotdm9pZCB3bGNfcGh5X2NoYW5zcGVjX3NldF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCBjaGFuc3BlY190IGNoYW5zcGVjKQotewotCWludCBmcmVxOwotCXN0cnVjdCBjaGFuX2luZm9fbnBoeV9yYWRpbzIwNTcgKnQwID0gTlVMTDsKLQlzdHJ1Y3QgY2hhbl9pbmZvX25waHlfcmFkaW8yMDV4ICp0MSA9IE5VTEw7Ci0Jc3RydWN0IGNoYW5faW5mb19ucGh5X3JhZGlvMjA1N19yZXY1ICp0MiA9IE5VTEw7Ci0Jc3RydWN0IGNoYW5faW5mb19ucGh5XzIwNTUgKnQzID0gTlVMTDsKLQotCWlmIChOT1JBRElPX0VOQUIocGktPnB1YnBpKSkgewotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCF3bGNfcGh5X2NoYW4yZnJlcV9ucGh5Ci0JICAgIChwaSwgQ0hTUEVDX0NIQU5ORUwoY2hhbnNwZWMpLCAmZnJlcSwgJnQwLCAmdDEsICZ0MiwgJnQzKSkKLQkJcmV0dXJuOwotCi0Jd2xjX3BoeV9jaGFuc3BlY19yYWRpb19zZXQoKHN0cnVjdCBicmNtc19waHlfcHViICopIHBpLCBjaGFuc3BlYyk7Ci0KLQlpZiAoQ0hTUEVDX0JXKGNoYW5zcGVjKSAhPSBwaS0+YncpCi0JCXdsYXBpX2JtYWNfYndfc2V0KHBpLT5zaC0+cGh5c2hpbSwgQ0hTUEVDX0JXKGNoYW5zcGVjKSk7Ci0KLQlpZiAoQ0hTUEVDX0lTNDAoY2hhbnNwZWMpKSB7Ci0JCWlmIChDSFNQRUNfU0JfVVBQRVIoY2hhbnNwZWMpKSB7Ci0JCQlvcl9waHlfcmVnKHBpLCAweGEwLCBCUEhZX0JBTkRfU0VMX1VQMjApOwotCQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCQkJb3JfcGh5X3JlZyhwaSwgMHgzMTAsIFBSSU1fU0VMX1VQMjApOwotCQkJfQotCQl9IGVsc2UgewotCQkJYW5kX3BoeV9yZWcocGksIDB4YTAsIH5CUEhZX0JBTkRfU0VMX1VQMjApOwotCQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCQkJYW5kX3BoeV9yZWcocGksIDB4MzEwLAotCQkJCQkgICAgKH5QUklNX1NFTF9VUDIwICYgMHhmZmZmKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0KLQkJCWlmICgocGktPnB1YnBpLnJhZGlvcmV2IDw9IDQpCi0JCQkgICAgfHwgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA2KSkgewotCQkJCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfVElBX0NPTkZJR19DT1JFMCwKLQkJCQkJICAgICAgMHgyLAotCQkJCQkgICAgICAoQ0hTUEVDX0lTNUcoY2hhbnNwZWMpID8gKDEgPDwgMSkKLQkJCQkJICAgICAgIDogMCkpOwotCQkJCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfVElBX0NPTkZJR19DT1JFMSwKLQkJCQkJICAgICAgMHgyLAotCQkJCQkgICAgICAoQ0hTUEVDX0lTNUcoY2hhbnNwZWMpID8gKDEgPDwgMSkKLQkJCQkJICAgICAgIDogMCkpOwotCQkJfQotCi0JCQl3bGNfcGh5X2NoYW5zcGVjX3JhZGlvMjA1N19zZXR1cChwaSwgdDAsIHQyKTsKLQkJCXdsY19waHlfY2hhbnNwZWNfbnBoeV9zZXR1cChwaSwgY2hhbnNwZWMsCi0JCQkJKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA1KSA/Ci0JCQkJKGNvbnN0IHN0cnVjdCBucGh5X3Nmb19jZmcgKikmKHQyLT5QSFlfQlcxYSkgOgotCQkJCShjb25zdCBzdHJ1Y3QgbnBoeV9zZm9fY2ZnICopJih0MC0+UEhZX0JXMWEpKTsKLQotCQl9IGVsc2UgewotCi0JCQltb2RfcmFkaW9fcmVnKHBpLAotCQkJCSAgICAgIFJBRElPXzIwNTZfU1lOX0NPTV9DVFJMIHwgUkFESU9fMjA1Nl9TWU4sCi0JCQkJICAgICAgMHg0LAotCQkJCSAgICAgIChDSFNQRUNfSVM1RyhjaGFuc3BlYykgPyAoMHgxIDw8IDIpIDogMCkpOwotCQkJd2xjX3BoeV9jaGFuc3BlY19yYWRpbzIwNTZfc2V0dXAocGksIHQxKTsKLQotCQkJd2xjX3BoeV9jaGFuc3BlY19ucGh5X3NldHVwKHBpLCBjaGFuc3BlYywKLQkJCQkoY29uc3Qgc3RydWN0IG5waHlfc2ZvX2NmZyAqKSAmKHQxLT5QSFlfQlcxYSkpOwotCQl9Ci0KLQl9IGVsc2UgewotCi0JCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfTUFTVEVSX0NOVFJMMSwgMHg3MCwKLQkJCSAgICAgIChDSFNQRUNfSVM1RyhjaGFuc3BlYykgPyAoMHgwMiA8PCA0KQotCQkJICAgICAgIDogKDB4MDUgPDwgNCkpKTsKLQotCQl3bGNfcGh5X2NoYW5zcGVjX3JhZGlvMjA1NV9zZXR1cChwaSwgdDMpOwotCQl3bGNfcGh5X2NoYW5zcGVjX25waHlfc2V0dXAocGksIGNoYW5zcGVjLAotCQkJCQkgICAgKGNvbnN0IHN0cnVjdCBucGh5X3Nmb19jZmcgKikmKHQzLT4KLQkJCQkJCQkJICAgICAgUEhZX0JXMWEpKTsKLQl9Ci0KLX0KLQotc3RhdGljIHZvaWQgd2xjX3BoeV9zYXZlY2FsX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0Jdm9pZCAqdGJsX3B0cjsKLQlpbnQgY29yZU51bTsKLQl1MTYgKnR4Y2FsX3JhZGlvX3JlZ3MgPSBOVUxMOwotCi0JaWYgKHBpLT5waHloYW5nX2F2b2lkKQotCQl3bGNfcGh5X3N0YXlfaW5fY2FycmllcnNlYXJjaF9ucGh5KHBpLCB0cnVlKTsKLQotCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0KLQkJd2xjX3BoeV9yeF9pcV9jb2VmZnNfbnBoeShwaSwgMCwKLQkJCQkJICAmcGktPmNhbGlicmF0aW9uX2NhY2hlLgotCQkJCQkgIHJ4Y2FsX2NvZWZmc18yRyk7Ci0KLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCQl0eGNhbF9yYWRpb19yZWdzID0KLQkJCSAgICBwaS0+Y2FsaWJyYXRpb25fY2FjaGUudHhjYWxfcmFkaW9fcmVnc18yRzsKLQkJfSBlbHNlIGlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCi0JCQlwaS0+Y2FsaWJyYXRpb25fY2FjaGUudHhjYWxfcmFkaW9fcmVnc18yR1swXSA9Ci0JCQkgICAgcmVhZF9yYWRpb19yZWcocGksCi0JCQkJCSAgIFJBRElPXzIwNTZfVFhfTE9GVF9GSU5FX0kgfAotCQkJCQkgICBSQURJT18yMDU2X1RYMCk7Ci0JCQlwaS0+Y2FsaWJyYXRpb25fY2FjaGUudHhjYWxfcmFkaW9fcmVnc18yR1sxXSA9Ci0JCQkgICAgcmVhZF9yYWRpb19yZWcocGksCi0JCQkJCSAgIFJBRElPXzIwNTZfVFhfTE9GVF9GSU5FX1EgfAotCQkJCQkgICBSQURJT18yMDU2X1RYMCk7Ci0JCQlwaS0+Y2FsaWJyYXRpb25fY2FjaGUudHhjYWxfcmFkaW9fcmVnc18yR1syXSA9Ci0JCQkgICAgcmVhZF9yYWRpb19yZWcocGksCi0JCQkJCSAgIFJBRElPXzIwNTZfVFhfTE9GVF9GSU5FX0kgfAotCQkJCQkgICBSQURJT18yMDU2X1RYMSk7Ci0JCQlwaS0+Y2FsaWJyYXRpb25fY2FjaGUudHhjYWxfcmFkaW9fcmVnc18yR1szXSA9Ci0JCQkgICAgcmVhZF9yYWRpb19yZWcocGksCi0JCQkJCSAgIFJBRElPXzIwNTZfVFhfTE9GVF9GSU5FX1EgfAotCQkJCQkgICBSQURJT18yMDU2X1RYMSk7Ci0KLQkJCXBpLT5jYWxpYnJhdGlvbl9jYWNoZS50eGNhbF9yYWRpb19yZWdzXzJHWzRdID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwKLQkJCQkJICAgUkFESU9fMjA1Nl9UWF9MT0ZUX0NPQVJTRV9JIHwKLQkJCQkJICAgUkFESU9fMjA1Nl9UWDApOwotCQkJcGktPmNhbGlicmF0aW9uX2NhY2hlLnR4Y2FsX3JhZGlvX3JlZ3NfMkdbNV0gPQotCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkgICBSQURJT18yMDU2X1RYX0xPRlRfQ09BUlNFX1EgfAotCQkJCQkgICBSQURJT18yMDU2X1RYMCk7Ci0JCQlwaS0+Y2FsaWJyYXRpb25fY2FjaGUudHhjYWxfcmFkaW9fcmVnc18yR1s2XSA9Ci0JCQkgICAgcmVhZF9yYWRpb19yZWcocGksCi0JCQkJCSAgIFJBRElPXzIwNTZfVFhfTE9GVF9DT0FSU0VfSSB8Ci0JCQkJCSAgIFJBRElPXzIwNTZfVFgxKTsKLQkJCXBpLT5jYWxpYnJhdGlvbl9jYWNoZS50eGNhbF9yYWRpb19yZWdzXzJHWzddID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwKLQkJCQkJICAgUkFESU9fMjA1Nl9UWF9MT0ZUX0NPQVJTRV9RIHwKLQkJCQkJICAgUkFESU9fMjA1Nl9UWDEpOwotCQl9IGVsc2UgewotCQkJcGktPmNhbGlicmF0aW9uX2NhY2hlLnR4Y2FsX3JhZGlvX3JlZ3NfMkdbMF0gPQotCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUxX1RYX1ZPU19DTkNMKTsKLQkJCXBpLT5jYWxpYnJhdGlvbl9jYWNoZS50eGNhbF9yYWRpb19yZWdzXzJHWzFdID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMl9UWF9WT1NfQ05DTCk7Ci0JCQlwaS0+Y2FsaWJyYXRpb25fY2FjaGUudHhjYWxfcmFkaW9fcmVnc18yR1syXSA9Ci0JCQkgICAgcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTFfVFhfQkJfTVhHTSk7Ci0JCQlwaS0+Y2FsaWJyYXRpb25fY2FjaGUudHhjYWxfcmFkaW9fcmVnc18yR1szXSA9Ci0JCQkgICAgcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTJfVFhfQkJfTVhHTSk7Ci0JCX0KLQotCQlwaS0+bnBoeV9pcWNhbF9jaGFuc3BlY18yRyA9IHBpLT5yYWRpb19jaGFuc3BlYzsKLQkJdGJsX3B0ciA9IHBpLT5jYWxpYnJhdGlvbl9jYWNoZS50eGNhbF9jb2VmZnNfMkc7Ci0JfSBlbHNlIHsKLQotCQl3bGNfcGh5X3J4X2lxX2NvZWZmc19ucGh5KHBpLCAwLAotCQkJCQkgICZwaS0+Y2FsaWJyYXRpb25fY2FjaGUuCi0JCQkJCSAgcnhjYWxfY29lZmZzXzVHKTsKLQotCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQkJCXR4Y2FsX3JhZGlvX3JlZ3MgPQotCQkJICAgIHBpLT5jYWxpYnJhdGlvbl9jYWNoZS50eGNhbF9yYWRpb19yZWdzXzVHOwotCQl9IGVsc2UgaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0KLQkJCXBpLT5jYWxpYnJhdGlvbl9jYWNoZS50eGNhbF9yYWRpb19yZWdzXzVHWzBdID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwKLQkJCQkJICAgUkFESU9fMjA1Nl9UWF9MT0ZUX0ZJTkVfSSB8Ci0JCQkJCSAgIFJBRElPXzIwNTZfVFgwKTsKLQkJCXBpLT5jYWxpYnJhdGlvbl9jYWNoZS50eGNhbF9yYWRpb19yZWdzXzVHWzFdID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwKLQkJCQkJICAgUkFESU9fMjA1Nl9UWF9MT0ZUX0ZJTkVfUSB8Ci0JCQkJCSAgIFJBRElPXzIwNTZfVFgwKTsKLQkJCXBpLT5jYWxpYnJhdGlvbl9jYWNoZS50eGNhbF9yYWRpb19yZWdzXzVHWzJdID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwKLQkJCQkJICAgUkFESU9fMjA1Nl9UWF9MT0ZUX0ZJTkVfSSB8Ci0JCQkJCSAgIFJBRElPXzIwNTZfVFgxKTsKLQkJCXBpLT5jYWxpYnJhdGlvbl9jYWNoZS50eGNhbF9yYWRpb19yZWdzXzVHWzNdID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwKLQkJCQkJICAgUkFESU9fMjA1Nl9UWF9MT0ZUX0ZJTkVfUSB8Ci0JCQkJCSAgIFJBRElPXzIwNTZfVFgxKTsKLQotCQkJcGktPmNhbGlicmF0aW9uX2NhY2hlLnR4Y2FsX3JhZGlvX3JlZ3NfNUdbNF0gPQotCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkgICBSQURJT18yMDU2X1RYX0xPRlRfQ09BUlNFX0kgfAotCQkJCQkgICBSQURJT18yMDU2X1RYMCk7Ci0JCQlwaS0+Y2FsaWJyYXRpb25fY2FjaGUudHhjYWxfcmFkaW9fcmVnc181R1s1XSA9Ci0JCQkgICAgcmVhZF9yYWRpb19yZWcocGksCi0JCQkJCSAgIFJBRElPXzIwNTZfVFhfTE9GVF9DT0FSU0VfUSB8Ci0JCQkJCSAgIFJBRElPXzIwNTZfVFgwKTsKLQkJCXBpLT5jYWxpYnJhdGlvbl9jYWNoZS50eGNhbF9yYWRpb19yZWdzXzVHWzZdID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwKLQkJCQkJICAgUkFESU9fMjA1Nl9UWF9MT0ZUX0NPQVJTRV9JIHwKLQkJCQkJICAgUkFESU9fMjA1Nl9UWDEpOwotCQkJcGktPmNhbGlicmF0aW9uX2NhY2hlLnR4Y2FsX3JhZGlvX3JlZ3NfNUdbN10gPQotCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkgICBSQURJT18yMDU2X1RYX0xPRlRfQ09BUlNFX1EgfAotCQkJCQkgICBSQURJT18yMDU2X1RYMSk7Ci0JCX0gZWxzZSB7Ci0JCQlwaS0+Y2FsaWJyYXRpb25fY2FjaGUudHhjYWxfcmFkaW9fcmVnc181R1swXSA9Ci0JCQkgICAgcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTFfVFhfVk9TX0NOQ0wpOwotCQkJcGktPmNhbGlicmF0aW9uX2NhY2hlLnR4Y2FsX3JhZGlvX3JlZ3NfNUdbMV0gPQotCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUyX1RYX1ZPU19DTkNMKTsKLQkJCXBpLT5jYWxpYnJhdGlvbl9jYWNoZS50eGNhbF9yYWRpb19yZWdzXzVHWzJdID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMV9UWF9CQl9NWEdNKTsKLQkJCXBpLT5jYWxpYnJhdGlvbl9jYWNoZS50eGNhbF9yYWRpb19yZWdzXzVHWzNdID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMl9UWF9CQl9NWEdNKTsKLQkJfQotCi0JCXBpLT5ucGh5X2lxY2FsX2NoYW5zcGVjXzVHID0gcGktPnJhZGlvX2NoYW5zcGVjOwotCQl0YmxfcHRyID0gcGktPmNhbGlicmF0aW9uX2NhY2hlLnR4Y2FsX2NvZWZmc181RzsKLQl9Ci0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCWZvciAoY29yZU51bSA9IDA7IGNvcmVOdW0gPD0gMTsgY29yZU51bSsrKSB7Ci0KLQkJCXR4Y2FsX3JhZGlvX3JlZ3NbMiAqIGNvcmVOdW1dID0KLQkJCSAgICBSRUFEX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLCBjb3JlTnVtLAotCQkJCQkgICAgTE9GVF9GSU5FX0kpOwotCQkJdHhjYWxfcmFkaW9fcmVnc1syICogY29yZU51bSArIDFdID0KLQkJCSAgICBSRUFEX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLCBjb3JlTnVtLAotCQkJCQkgICAgTE9GVF9GSU5FX1EpOwotCi0JCQl0eGNhbF9yYWRpb19yZWdzWzIgKiBjb3JlTnVtICsgNF0gPQotCQkJICAgIFJFQURfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIGNvcmVOdW0sCi0JCQkJCSAgICBMT0ZUX0NPQVJTRV9JKTsKLQkJCXR4Y2FsX3JhZGlvX3JlZ3NbMiAqIGNvcmVOdW0gKyA1XSA9Ci0JCQkgICAgUkVBRF9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwgY29yZU51bSwKLQkJCQkJICAgIExPRlRfQ09BUlNFX1EpOwotCQl9Ci0JfQotCi0Jd2xjX3BoeV90YWJsZV9yZWFkX25waHkocGksIE5QSFlfVEJMX0lEX0lRTE9DQUwsIDgsIDgwLCAxNiwgdGJsX3B0cik7Ci0KLQlpZiAocGktPnBoeWhhbmdfYXZvaWQpCi0JCXdsY19waHlfc3RheV9pbl9jYXJyaWVyc2VhcmNoX25waHkocGksIGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQgd2xjX3BoeV9yZXN0b3JlY2FsX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JdTE2ICpsb2Z0X2NvbXA7Ci0JdTE2IHR4Y2FsX2NvZWZmc19icGh5WzRdOwotCXUxNiAqdGJsX3B0cjsKLQlpbnQgY29yZU51bTsKLQl1MTYgKnR4Y2FsX3JhZGlvX3JlZ3MgPSBOVUxMOwotCi0JaWYgKENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJaWYgKHBpLT5ucGh5X2lxY2FsX2NoYW5zcGVjXzJHID09IDApCi0JCQlyZXR1cm47Ci0KLQkJdGJsX3B0ciA9IHBpLT5jYWxpYnJhdGlvbl9jYWNoZS50eGNhbF9jb2VmZnNfMkc7Ci0JCWxvZnRfY29tcCA9ICZwaS0+Y2FsaWJyYXRpb25fY2FjaGUudHhjYWxfY29lZmZzXzJHWzVdOwotCX0gZWxzZSB7Ci0JCWlmIChwaS0+bnBoeV9pcWNhbF9jaGFuc3BlY181RyA9PSAwKQotCQkJcmV0dXJuOwotCi0JCXRibF9wdHIgPSBwaS0+Y2FsaWJyYXRpb25fY2FjaGUudHhjYWxfY29lZmZzXzVHOwotCQlsb2Z0X2NvbXAgPSAmcGktPmNhbGlicmF0aW9uX2NhY2hlLnR4Y2FsX2NvZWZmc181R1s1XTsKLQl9Ci0KLQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0lRTE9DQUwsIDQsIDgwLCAxNiwKLQkJCQkgKHZvaWQgKil0YmxfcHRyKTsKLQotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCQl0eGNhbF9jb2VmZnNfYnBoeVswXSA9IHRibF9wdHJbMF07Ci0JCXR4Y2FsX2NvZWZmc19icGh5WzFdID0gdGJsX3B0clsxXTsKLQkJdHhjYWxfY29lZmZzX2JwaHlbMl0gPSB0YmxfcHRyWzJdOwotCQl0eGNhbF9jb2VmZnNfYnBoeVszXSA9IHRibF9wdHJbM107Ci0JfSBlbHNlIHsKLQkJdHhjYWxfY29lZmZzX2JwaHlbMF0gPSAwOwotCQl0eGNhbF9jb2VmZnNfYnBoeVsxXSA9IDA7Ci0JCXR4Y2FsX2NvZWZmc19icGh5WzJdID0gMDsKLQkJdHhjYWxfY29lZmZzX2JwaHlbM10gPSAwOwotCX0KLQotCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfSVFMT0NBTCwgNCwgODgsIDE2LAotCQkJCSB0eGNhbF9jb2VmZnNfYnBoeSk7Ci0KLQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0lRTE9DQUwsIDIsIDg1LCAxNiwgbG9mdF9jb21wKTsKLQotCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfSVFMT0NBTCwgMiwgOTMsIDE2LCBsb2Z0X2NvbXApOwotCi0JaWYgKE5SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDIpKQotCQl3bGNfcGh5X3R4X2lxX3dhcl9ucGh5KHBpKTsKLQotCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCQkJdHhjYWxfcmFkaW9fcmVncyA9Ci0JCQkgICAgcGktPmNhbGlicmF0aW9uX2NhY2hlLnR4Y2FsX3JhZGlvX3JlZ3NfMkc7Ci0JCX0gZWxzZSBpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQlSQURJT18yMDU2X1RYX0xPRlRfRklORV9JIHwKLQkJCQkJUkFESU9fMjA1Nl9UWDAsCi0JCQkJCXBpLT5jYWxpYnJhdGlvbl9jYWNoZS4KLQkJCQkJdHhjYWxfcmFkaW9fcmVnc18yR1swXSk7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCVJBRElPXzIwNTZfVFhfTE9GVF9GSU5FX1EgfAotCQkJCQlSQURJT18yMDU2X1RYMCwKLQkJCQkJcGktPmNhbGlicmF0aW9uX2NhY2hlLgotCQkJCQl0eGNhbF9yYWRpb19yZWdzXzJHWzFdKTsKLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJUkFESU9fMjA1Nl9UWF9MT0ZUX0ZJTkVfSSB8Ci0JCQkJCVJBRElPXzIwNTZfVFgxLAotCQkJCQlwaS0+Y2FsaWJyYXRpb25fY2FjaGUuCi0JCQkJCXR4Y2FsX3JhZGlvX3JlZ3NfMkdbMl0pOwotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQlSQURJT18yMDU2X1RYX0xPRlRfRklORV9RIHwKLQkJCQkJUkFESU9fMjA1Nl9UWDEsCi0JCQkJCXBpLT5jYWxpYnJhdGlvbl9jYWNoZS4KLQkJCQkJdHhjYWxfcmFkaW9fcmVnc18yR1szXSk7Ci0KLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJUkFESU9fMjA1Nl9UWF9MT0ZUX0NPQVJTRV9JIHwKLQkJCQkJUkFESU9fMjA1Nl9UWDAsCi0JCQkJCXBpLT5jYWxpYnJhdGlvbl9jYWNoZS4KLQkJCQkJdHhjYWxfcmFkaW9fcmVnc18yR1s0XSk7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCVJBRElPXzIwNTZfVFhfTE9GVF9DT0FSU0VfUSB8Ci0JCQkJCVJBRElPXzIwNTZfVFgwLAotCQkJCQlwaS0+Y2FsaWJyYXRpb25fY2FjaGUuCi0JCQkJCXR4Y2FsX3JhZGlvX3JlZ3NfMkdbNV0pOwotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQlSQURJT18yMDU2X1RYX0xPRlRfQ09BUlNFX0kgfAotCQkJCQlSQURJT18yMDU2X1RYMSwKLQkJCQkJcGktPmNhbGlicmF0aW9uX2NhY2hlLgotCQkJCQl0eGNhbF9yYWRpb19yZWdzXzJHWzZdKTsKLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJUkFESU9fMjA1Nl9UWF9MT0ZUX0NPQVJTRV9RIHwKLQkJCQkJUkFESU9fMjA1Nl9UWDEsCi0JCQkJCXBpLT5jYWxpYnJhdGlvbl9jYWNoZS4KLQkJCQkJdHhjYWxfcmFkaW9fcmVnc18yR1s3XSk7Ci0JCX0gZWxzZSB7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTFfVFhfVk9TX0NOQ0wsCi0JCQkJCXBpLT5jYWxpYnJhdGlvbl9jYWNoZS4KLQkJCQkJdHhjYWxfcmFkaW9fcmVnc18yR1swXSk7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTJfVFhfVk9TX0NOQ0wsCi0JCQkJCXBpLT5jYWxpYnJhdGlvbl9jYWNoZS4KLQkJCQkJdHhjYWxfcmFkaW9fcmVnc18yR1sxXSk7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTFfVFhfQkJfTVhHTSwKLQkJCQkJcGktPmNhbGlicmF0aW9uX2NhY2hlLgotCQkJCQl0eGNhbF9yYWRpb19yZWdzXzJHWzJdKTsKLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMl9UWF9CQl9NWEdNLAotCQkJCQlwaS0+Y2FsaWJyYXRpb25fY2FjaGUuCi0JCQkJCXR4Y2FsX3JhZGlvX3JlZ3NfMkdbM10pOwotCQl9Ci0KLQkJd2xjX3BoeV9yeF9pcV9jb2VmZnNfbnBoeShwaSwgMSwKLQkJCQkJICAmcGktPmNhbGlicmF0aW9uX2NhY2hlLgotCQkJCQkgIHJ4Y2FsX2NvZWZmc18yRyk7Ci0JfSBlbHNlIHsKLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCQl0eGNhbF9yYWRpb19yZWdzID0KLQkJCSAgICBwaS0+Y2FsaWJyYXRpb25fY2FjaGUudHhjYWxfcmFkaW9fcmVnc181RzsKLQkJfSBlbHNlIGlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCi0JCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCVJBRElPXzIwNTZfVFhfTE9GVF9GSU5FX0kgfAotCQkJCQlSQURJT18yMDU2X1RYMCwKLQkJCQkJcGktPmNhbGlicmF0aW9uX2NhY2hlLgotCQkJCQl0eGNhbF9yYWRpb19yZWdzXzVHWzBdKTsKLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJUkFESU9fMjA1Nl9UWF9MT0ZUX0ZJTkVfUSB8Ci0JCQkJCVJBRElPXzIwNTZfVFgwLAotCQkJCQlwaS0+Y2FsaWJyYXRpb25fY2FjaGUuCi0JCQkJCXR4Y2FsX3JhZGlvX3JlZ3NfNUdbMV0pOwotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQlSQURJT18yMDU2X1RYX0xPRlRfRklORV9JIHwKLQkJCQkJUkFESU9fMjA1Nl9UWDEsCi0JCQkJCXBpLT5jYWxpYnJhdGlvbl9jYWNoZS4KLQkJCQkJdHhjYWxfcmFkaW9fcmVnc181R1syXSk7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCVJBRElPXzIwNTZfVFhfTE9GVF9GSU5FX1EgfAotCQkJCQlSQURJT18yMDU2X1RYMSwKLQkJCQkJcGktPmNhbGlicmF0aW9uX2NhY2hlLgotCQkJCQl0eGNhbF9yYWRpb19yZWdzXzVHWzNdKTsKLQotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQlSQURJT18yMDU2X1RYX0xPRlRfQ09BUlNFX0kgfAotCQkJCQlSQURJT18yMDU2X1RYMCwKLQkJCQkJcGktPmNhbGlicmF0aW9uX2NhY2hlLgotCQkJCQl0eGNhbF9yYWRpb19yZWdzXzVHWzRdKTsKLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJUkFESU9fMjA1Nl9UWF9MT0ZUX0NPQVJTRV9RIHwKLQkJCQkJUkFESU9fMjA1Nl9UWDAsCi0JCQkJCXBpLT5jYWxpYnJhdGlvbl9jYWNoZS4KLQkJCQkJdHhjYWxfcmFkaW9fcmVnc181R1s1XSk7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCVJBRElPXzIwNTZfVFhfTE9GVF9DT0FSU0VfSSB8Ci0JCQkJCVJBRElPXzIwNTZfVFgxLAotCQkJCQlwaS0+Y2FsaWJyYXRpb25fY2FjaGUuCi0JCQkJCXR4Y2FsX3JhZGlvX3JlZ3NfNUdbNl0pOwotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQlSQURJT18yMDU2X1RYX0xPRlRfQ09BUlNFX1EgfAotCQkJCQlSQURJT18yMDU2X1RYMSwKLQkJCQkJcGktPmNhbGlicmF0aW9uX2NhY2hlLgotCQkJCQl0eGNhbF9yYWRpb19yZWdzXzVHWzddKTsKLQkJfSBlbHNlIHsKLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMV9UWF9WT1NfQ05DTCwKLQkJCQkJcGktPmNhbGlicmF0aW9uX2NhY2hlLgotCQkJCQl0eGNhbF9yYWRpb19yZWdzXzVHWzBdKTsKLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMl9UWF9WT1NfQ05DTCwKLQkJCQkJcGktPmNhbGlicmF0aW9uX2NhY2hlLgotCQkJCQl0eGNhbF9yYWRpb19yZWdzXzVHWzFdKTsKLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMV9UWF9CQl9NWEdNLAotCQkJCQlwaS0+Y2FsaWJyYXRpb25fY2FjaGUuCi0JCQkJCXR4Y2FsX3JhZGlvX3JlZ3NfNUdbMl0pOwotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUyX1RYX0JCX01YR00sCi0JCQkJCXBpLT5jYWxpYnJhdGlvbl9jYWNoZS4KLQkJCQkJdHhjYWxfcmFkaW9fcmVnc181R1szXSk7Ci0JCX0KLQotCQl3bGNfcGh5X3J4X2lxX2NvZWZmc19ucGh5KHBpLCAxLAotCQkJCQkgICZwaS0+Y2FsaWJyYXRpb25fY2FjaGUuCi0JCQkJCSAgcnhjYWxfY29lZmZzXzVHKTsKLQl9Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQkJZm9yIChjb3JlTnVtID0gMDsgY29yZU51bSA8PSAxOyBjb3JlTnVtKyspIHsKLQotCQkJV1JJVEVfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIGNvcmVOdW0sCi0JCQkJCSBMT0ZUX0ZJTkVfSSwKLQkJCQkJIHR4Y2FsX3JhZGlvX3JlZ3NbMiAqIGNvcmVOdW1dKTsKLQkJCVdSSVRFX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLCBjb3JlTnVtLAotCQkJCQkgTE9GVF9GSU5FX1EsCi0JCQkJCSB0eGNhbF9yYWRpb19yZWdzWzIgKiBjb3JlTnVtICsgMV0pOwotCi0JCQlXUklURV9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwgY29yZU51bSwKLQkJCQkJIExPRlRfQ09BUlNFX0ksCi0JCQkJCSB0eGNhbF9yYWRpb19yZWdzWzIgKiBjb3JlTnVtICsgNF0pOwotCQkJV1JJVEVfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIGNvcmVOdW0sCi0JCQkJCSBMT0ZUX0NPQVJTRV9RLAotCQkJCQkgdHhjYWxfcmFkaW9fcmVnc1syICogY29yZU51bSArIDVdKTsKLQkJfQotCX0KLX0KLQotdm9pZCB3bGNfcGh5X2FudHNlbF9pbml0KHN0cnVjdCBicmNtc19waHlfcHViICpwcGksIGJvb2wgbHV0X2luaXQpCi17Ci0Jc3RydWN0IGJyY21zX3BoeSAqcGkgPSAoc3RydWN0IGJyY21zX3BoeSAqKSBwcGk7Ci0JdTE2IG1hc2sgPSAweGZjMDA7Ci0JdTMyIG1jID0gMDsKLQotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkKLQkJcmV0dXJuOwotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0JCXUxNiB2MCA9IDB4MjExLCB2MSA9IDB4MjIyLCB2MiA9IDB4MTQ0LCB2MyA9IDB4MTg4OwotCi0JCWlmIChsdXRfaW5pdCA9PSBmYWxzZSkKLQkJCXJldHVybjsKLQotCQlpZiAocGktPnNyb21fZmVtMmcuYW50c3djdHJsbHV0ID09IDApIHsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQU5UU1dDVFJMTFVULAotCQkJCQkJIDEsIDB4MDIsIDE2LCAmdjApOwotCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9BTlRTV0NUUkxMVVQsCi0JCQkJCQkgMSwgMHgwMywgMTYsICZ2MSk7Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FOVFNXQ1RSTExVVCwKLQkJCQkJCSAxLCAweDA4LCAxNiwgJnYyKTsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQU5UU1dDVFJMTFVULAotCQkJCQkJIDEsIDB4MEMsIDE2LCAmdjMpOwotCQl9Ci0KLQkJaWYgKHBpLT5zcm9tX2ZlbTVnLmFudHN3Y3RybGx1dCA9PSAwKSB7Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FOVFNXQ1RSTExVVCwKLQkJCQkJCSAxLCAweDEyLCAxNiwgJnYwKTsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQU5UU1dDVFJMTFVULAotCQkJCQkJIDEsIDB4MTMsIDE2LCAmdjEpOwotCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9BTlRTV0NUUkxMVVQsCi0JCQkJCQkgMSwgMHgxOCwgMTYsICZ2Mik7Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FOVFNXQ1RSTExVVCwKLQkJCQkJCSAxLCAweDFDLCAxNiwgJnYzKTsKLQkJfQotCX0gZWxzZSB7Ci0KLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHhjOCwgMHgwKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHhjOSwgMHgwKTsKLQotCQlhaV9ncGlvY29udHJvbChwaS0+c2gtPnNpaCwgbWFzaywgbWFzaywgR1BJT19EUlZfUFJJT1JJVFkpOwotCi0JCW1jID0gUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKTsKLQkJbWMgJj0gfk1DVExfR1BPVVRfU0VMX01BU0s7Ci0JCVdfUkVHKCZwaS0+cmVncy0+bWFjY29udHJvbCwgbWMpOwotCi0JCU9SX1JFRygmcGktPnJlZ3MtPnBzbV9ncGlvX29lLCBtYXNrKTsKLQotCQlBTkRfUkVHKCZwaS0+cmVncy0+cHNtX2dwaW9fb3V0LCB+bWFzayk7Ci0KLQkJaWYgKGx1dF9pbml0KSB7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAweGY4LCAweDAyZDgpOwotCQkJd3JpdGVfcGh5X3JlZyhwaSwgMHhmOSwgMHgwMzAxKTsKLQkJCXdyaXRlX3BoeV9yZWcocGksIDB4ZmEsIDB4MDJkOCk7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAweGZiLCAweDAzMDEpOwotCQl9Ci0JfQotfQotCi11MTYgd2xjX3BoeV9jbGFzc2lmaWVyX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBtYXNrLCB1MTYgdmFsKQotewotCXUxNiBjdXJyX2N0bCwgbmV3X2N0bDsKLQlib29sIHN1c3BlbmRlZCA9IGZhbHNlOwotCi0JaWYgKEQxMVJFVl9JUyhwaS0+c2gtPmNvcmVyZXYsIDE2KSkgewotCQlzdXNwZW5kZWQgPQotCQkgICAgKFJfUkVHKCZwaS0+cmVncy0+bWFjY29udHJvbCkgJiBNQ1RMX0VOX01BQykgPwotCQkgICAgZmFsc2UgOiB0cnVlOwotCQlpZiAoIXN1c3BlbmRlZCkKLQkJCXdsYXBpX3N1c3BlbmRfbWFjX2FuZF93YWl0KHBpLT5zaC0+cGh5c2hpbSk7Ci0JfQotCi0JY3Vycl9jdGwgPSByZWFkX3BoeV9yZWcocGksIDB4YjApICYgKDB4NyA8PCAwKTsKLQotCW5ld19jdGwgPSAoY3Vycl9jdGwgJiAofm1hc2spKSB8ICh2YWwgJiBtYXNrKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweGIwLCAoMHg3IDw8IDApLCBuZXdfY3RsKTsKLQotCWlmIChEMTFSRVZfSVMocGktPnNoLT5jb3JlcmV2LCAxNikgJiYgIXN1c3BlbmRlZCkKLQkJd2xhcGlfZW5hYmxlX21hYyhwaS0+c2gtPnBoeXNoaW0pOwotCi0JcmV0dXJuIG5ld19jdGw7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsY19waHlfY2xpcF9kZXRfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTggd3JpdGUsIHUxNiAqdmFscykKLXsKLQotCWlmICh3cml0ZSA9PSAwKSB7Ci0JCXZhbHNbMF0gPSByZWFkX3BoeV9yZWcocGksIDB4MmMpOwotCQl2YWxzWzFdID0gcmVhZF9waHlfcmVnKHBpLCAweDQyKTsKLQl9IGVsc2UgewotCQl3cml0ZV9waHlfcmVnKHBpLCAweDJjLCB2YWxzWzBdKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg0MiwgdmFsc1sxXSk7Ci0JfQotfQotCi12b2lkIHdsY19waHlfZm9yY2VfcmZzZXFfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTggY21kKQotewotCXUxNiB0cmlnZ2VyX21hc2ssIHN0YXR1c19tYXNrOwotCXUxNiBvcmlnX1Jmc2VxQ29yZUFjdHY7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgTlBIWV9SRlNFUV9SWDJUWDoKLQkJdHJpZ2dlcl9tYXNrID0gTlBIWV9SZnNlcVRyaWdnZXJfcngydHg7Ci0JCXN0YXR1c19tYXNrID0gTlBIWV9SZnNlcVN0YXR1c19yeDJ0eDsKLQkJYnJlYWs7Ci0JY2FzZSBOUEhZX1JGU0VRX1RYMlJYOgotCQl0cmlnZ2VyX21hc2sgPSBOUEhZX1Jmc2VxVHJpZ2dlcl90eDJyeDsKLQkJc3RhdHVzX21hc2sgPSBOUEhZX1Jmc2VxU3RhdHVzX3R4MnJ4OwotCQlicmVhazsKLQljYXNlIE5QSFlfUkZTRVFfUkVTRVQyUlg6Ci0JCXRyaWdnZXJfbWFzayA9IE5QSFlfUmZzZXFUcmlnZ2VyX3Jlc2V0MnJ4OwotCQlzdGF0dXNfbWFzayA9IE5QSFlfUmZzZXFTdGF0dXNfcmVzZXQycng7Ci0JCWJyZWFrOwotCWNhc2UgTlBIWV9SRlNFUV9VUERBVEVHQUlOSDoKLQkJdHJpZ2dlcl9tYXNrID0gTlBIWV9SZnNlcVRyaWdnZXJfdXBkYXRlZ2Fpbmg7Ci0JCXN0YXR1c19tYXNrID0gTlBIWV9SZnNlcVN0YXR1c191cGRhdGVnYWluaDsKLQkJYnJlYWs7Ci0JY2FzZSBOUEhZX1JGU0VRX1VQREFURUdBSU5MOgotCQl0cmlnZ2VyX21hc2sgPSBOUEhZX1Jmc2VxVHJpZ2dlcl91cGRhdGVnYWlubDsKLQkJc3RhdHVzX21hc2sgPSBOUEhZX1Jmc2VxU3RhdHVzX3VwZGF0ZWdhaW5sOwotCQlicmVhazsKLQljYXNlIE5QSFlfUkZTRVFfVVBEQVRFR0FJTlU6Ci0JCXRyaWdnZXJfbWFzayA9IE5QSFlfUmZzZXFUcmlnZ2VyX3VwZGF0ZWdhaW51OwotCQlzdGF0dXNfbWFzayA9IE5QSFlfUmZzZXFTdGF0dXNfdXBkYXRlZ2FpbnU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybjsKLQl9Ci0KLQlvcmlnX1Jmc2VxQ29yZUFjdHYgPSByZWFkX3BoeV9yZWcocGksIDB4YTEpOwotCW9yX3BoeV9yZWcocGksIDB4YTEsCi0JCSAgIChOUEhZX1Jmc2VxTW9kZV9Db3JlQWN0dl9vdmVycmlkZSB8Ci0JCSAgICBOUEhZX1Jmc2VxTW9kZV9UcmlnZ2VyX292ZXJyaWRlKSk7Ci0Jb3JfcGh5X3JlZyhwaSwgMHhhMywgdHJpZ2dlcl9tYXNrKTsKLQlTUElOV0FJVCgocmVhZF9waHlfcmVnKHBpLCAweGE0KSAmIHN0YXR1c19tYXNrKSwgMjAwMDAwKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweGExLCBvcmlnX1Jmc2VxQ29yZUFjdHYpOwotCVdBUk4ocmVhZF9waHlfcmVnKHBpLCAweGE0KSAmIHN0YXR1c19tYXNrLCAiSFcgZXJyb3IgaW4gcmYiKTsKLX0KLQotc3RhdGljIHZvaWQKLXdsY19waHlfc2V0X3Jmc2VxX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHU4IGNtZCwgdTggKmV2ZW50cywgdTggKmRseXMsCi0JCSAgICAgICB1OCBsZW4pCi17Ci0JdTMyIHQxX29mZnNldCwgdDJfb2Zmc2V0OwotCXU4IGN0cjsKLQl1OCBlbmRfZXZlbnQgPQotCSAgICBOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LAotCQkgICAgMykgPyBOUEhZX1JFVjNfUkZTRVFfQ01EX0VORCA6IE5QSFlfUkZTRVFfQ01EX0VORDsKLQl1OCBlbmRfZGx5ID0gMTsKLQotCWlmIChwaS0+cGh5aGFuZ19hdm9pZCkKLQkJd2xjX3BoeV9zdGF5X2luX2NhcnJpZXJzZWFyY2hfbnBoeShwaSwgdHJ1ZSk7Ci0KLQl0MV9vZmZzZXQgPSBjbWQgPDwgNDsKLQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX1JGU0VRLCBsZW4sIHQxX29mZnNldCwgOCwKLQkJCQkgZXZlbnRzKTsKLQl0Ml9vZmZzZXQgPSB0MV9vZmZzZXQgKyAweDA4MDsKLQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX1JGU0VRLCBsZW4sIHQyX29mZnNldCwgOCwKLQkJCQkgZGx5cyk7Ci0KLQlmb3IgKGN0ciA9IGxlbjsgY3RyIDwgMTY7IGN0cisrKSB7Ci0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfUkZTRVEsIDEsCi0JCQkJCSB0MV9vZmZzZXQgKyBjdHIsIDgsICZlbmRfZXZlbnQpOwotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX1JGU0VRLCAxLAotCQkJCQkgdDJfb2Zmc2V0ICsgY3RyLCA4LCAmZW5kX2RseSk7Ci0JfQotCi0JaWYgKHBpLT5waHloYW5nX2F2b2lkKQotCQl3bGNfcGh5X3N0YXlfaW5fY2FycmllcnNlYXJjaF9ucGh5KHBpLCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyB1MTYgd2xjX3BoeV9yZWFkX2xwZl9id19jdGxfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTE2IG9mZnNldCkKLXsKLQl1MTYgbHBmX2J3X2N0bF92YWwgPSAwOwotCXUxNiByeDJ0eF9scGZfcmNfbHV0X29mZnNldCA9IDA7Ci0KLQlpZiAob2Zmc2V0ID09IDApIHsKLQkJaWYgKENIU1BFQ19JUzQwKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCXJ4MnR4X2xwZl9yY19sdXRfb2Zmc2V0ID0gMHgxNTk7Ci0JCX0gZWxzZSB7Ci0JCQlyeDJ0eF9scGZfcmNfbHV0X29mZnNldCA9IDB4MTU0OwotCQl9Ci0JfSBlbHNlIHsKLQkJcngydHhfbHBmX3JjX2x1dF9vZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCXdsY19waHlfdGFibGVfcmVhZF9ucGh5KHBpLCBOUEhZX1RCTF9JRF9SRlNFUSwgMSwKLQkJCQkodTMyKSByeDJ0eF9scGZfcmNfbHV0X29mZnNldCwgMTYsCi0JCQkJJmxwZl9id19jdGxfdmFsKTsKLQotCWxwZl9id19jdGxfdmFsID0gbHBmX2J3X2N0bF92YWwgJiAweDc7Ci0KLQlyZXR1cm4gbHBmX2J3X2N0bF92YWw7Ci19Ci0KLXN0YXRpYyB2b2lkCi13bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3Jldjcoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBmaWVsZCwgdTE2IHZhbHVlLAotCQkJCSAgdTggY29yZV9tYXNrLCB1OCBvZmYsIHU4IG92ZXJyaWRlX2lkKQotewotCXU4IGNvcmVfbnVtOwotCXUxNiBhZGRyID0gMCwgZW5fYWRkciA9IDAsIHZhbF9hZGRyID0gMCwgZW5fbWFzayA9IDAsIHZhbF9tYXNrID0gMDsKLQl1OCB2YWxfc2hpZnQgPSAwOwotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCWVuX21hc2sgPSBmaWVsZDsKLQkJZm9yIChjb3JlX251bSA9IDA7IGNvcmVfbnVtIDwgMjsgY29yZV9udW0rKykgewotCQkJaWYgKG92ZXJyaWRlX2lkID09IE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDApIHsKLQotCQkJCXN3aXRjaCAoZmllbGQpIHsKLQkJCQljYXNlICgweDEgPDwgMik6Ci0JCQkJCWVuX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweGU3IDogMHhlYzsKLQkJCQkJdmFsX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweDdhIDoKLQkJCQkJICAgIDB4N2Q7Ci0JCQkJCXZhbF9tYXNrID0gKDB4MSA8PCAxKTsKLQkJCQkJdmFsX3NoaWZ0ID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoMHgxIDw8IDMpOgotCQkJCQllbl9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHhlNyA6IDB4ZWM7Ci0JCQkJCXZhbF9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHg3YSA6Ci0JCQkJCSAgICAweDdkOwotCQkJCQl2YWxfbWFzayA9ICgweDEgPDwgMik7Ci0JCQkJCXZhbF9zaGlmdCA9IDI7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKDB4MSA8PCA0KToKLQkJCQkJZW5fYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4ZTcgOiAweGVjOwotCQkJCQl2YWxfYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4N2EgOgotCQkJCQkgICAgMHg3ZDsKLQkJCQkJdmFsX21hc2sgPSAoMHgxIDw8IDQpOwotCQkJCQl2YWxfc2hpZnQgPSA0OwotCQkJCQlicmVhazsKLQkJCQljYXNlICgweDEgPDwgNSk6Ci0JCQkJCWVuX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweGU3IDogMHhlYzsKLQkJCQkJdmFsX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweDdhIDoKLQkJCQkJICAgIDB4N2Q7Ci0JCQkJCXZhbF9tYXNrID0gKDB4MSA8PCA1KTsKLQkJCQkJdmFsX3NoaWZ0ID0gNTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoMHgxIDw8IDYpOgotCQkJCQllbl9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHhlNyA6IDB4ZWM7Ci0JCQkJCXZhbF9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHg3YSA6Ci0JCQkJCSAgICAweDdkOwotCQkJCQl2YWxfbWFzayA9ICgweDEgPDwgNik7Ci0JCQkJCXZhbF9zaGlmdCA9IDY7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKDB4MSA8PCA3KToKLQkJCQkJZW5fYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4ZTcgOiAweGVjOwotCQkJCQl2YWxfYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4N2EgOgotCQkJCQkgICAgMHg3ZDsKLQkJCQkJdmFsX21hc2sgPSAoMHgxIDw8IDcpOwotCQkJCQl2YWxfc2hpZnQgPSA3OwotCQkJCQlicmVhazsKLQkJCQljYXNlICgweDEgPDwgMTApOgotCQkJCQllbl9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHhlNyA6IDB4ZWM7Ci0JCQkJCXZhbF9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHhmOCA6Ci0JCQkJCSAgICAweGZhOwotCQkJCQl2YWxfbWFzayA9ICgweDcgPDwgNCk7Ci0JCQkJCXZhbF9zaGlmdCA9IDQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKDB4MSA8PCAxMSk6Ci0JCQkJCWVuX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweGU3IDogMHhlYzsKLQkJCQkJdmFsX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweDdiIDoKLQkJCQkJICAgIDB4N2U7Ci0JCQkJCXZhbF9tYXNrID0gKDB4ZmZmZiA8PCAwKTsKLQkJCQkJdmFsX3NoaWZ0ID0gMDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoMHgxIDw8IDEyKToKLQkJCQkJZW5fYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4ZTcgOiAweGVjOwotCQkJCQl2YWxfYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4N2MgOgotCQkJCQkgICAgMHg3ZjsKLQkJCQkJdmFsX21hc2sgPSAoMHhmZmZmIDw8IDApOwotCQkJCQl2YWxfc2hpZnQgPSAwOwotCQkJCQlicmVhazsKLQkJCQljYXNlICgweDMgPDwgMTMpOgotCQkJCQllbl9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHhlNyA6IDB4ZWM7Ci0JCQkJCXZhbF9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHgzNDggOgotCQkJCQkgICAgMHgzNDk7Ci0JCQkJCXZhbF9tYXNrID0gKDB4ZmYgPDwgMCk7Ci0JCQkJCXZhbF9zaGlmdCA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKDB4MSA8PCAxMyk6Ci0JCQkJCWVuX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweGU3IDogMHhlYzsKLQkJCQkJdmFsX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweDM0OCA6Ci0JCQkJCSAgICAweDM0OTsKLQkJCQkJdmFsX21hc2sgPSAoMHhmIDw8IDApOwotCQkJCQl2YWxfc2hpZnQgPSAwOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlhZGRyID0gMHhmZmZmOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG92ZXJyaWRlX2lkID09IE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDEpIHsKLQotCQkJCXN3aXRjaCAoZmllbGQpIHsKLQkJCQljYXNlICgweDEgPDwgMSk6Ci0JCQkJCWVuX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweDM0MiA6Ci0JCQkJCSAgICAweDM0MzsKLQkJCQkJdmFsX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweDM0MCA6Ci0JCQkJCSAgICAweDM0MTsKLQkJCQkJdmFsX21hc2sgPSAoMHgxIDw8IDEpOwotCQkJCQl2YWxfc2hpZnQgPSAxOwotCQkJCQlicmVhazsKLQkJCQljYXNlICgweDEgPDwgMyk6Ci0JCQkJCWVuX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweDM0MiA6Ci0JCQkJCSAgICAweDM0MzsKLQkJCQkJdmFsX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweDM0MCA6Ci0JCQkJCSAgICAweDM0MTsKLQkJCQkJdmFsX21hc2sgPSAoMHgxIDw8IDMpOwotCQkJCQl2YWxfc2hpZnQgPSAzOwotCQkJCQlicmVhazsKLQkJCQljYXNlICgweDEgPDwgNSk6Ci0JCQkJCWVuX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweDM0MiA6Ci0JCQkJCSAgICAweDM0MzsKLQkJCQkJdmFsX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweDM0MCA6Ci0JCQkJCSAgICAweDM0MTsKLQkJCQkJdmFsX21hc2sgPSAoMHgxIDw8IDUpOwotCQkJCQl2YWxfc2hpZnQgPSA1OwotCQkJCQlicmVhazsKLQkJCQljYXNlICgweDEgPDwgNCk6Ci0JCQkJCWVuX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweDM0MiA6Ci0JCQkJCSAgICAweDM0MzsKLQkJCQkJdmFsX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweDM0MCA6Ci0JCQkJCSAgICAweDM0MTsKLQkJCQkJdmFsX21hc2sgPSAoMHgxIDw8IDQpOwotCQkJCQl2YWxfc2hpZnQgPSA0OwotCQkJCQlicmVhazsKLQkJCQljYXNlICgweDEgPDwgMik6Ci0KLQkJCQkJZW5fYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4MzQyIDoKLQkJCQkJICAgIDB4MzQzOwotCQkJCQl2YWxfYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4MzQwIDoKLQkJCQkJICAgIDB4MzQxOwotCQkJCQl2YWxfbWFzayA9ICgweDEgPDwgMik7Ci0JCQkJCXZhbF9zaGlmdCA9IDI7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKDB4MSA8PCA3KToKLQotCQkJCQllbl9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHgzNDIgOgotCQkJCQkgICAgMHgzNDM7Ci0JCQkJCXZhbF9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHgzNDAgOgotCQkJCQkgICAgMHgzNDE7Ci0JCQkJCXZhbF9tYXNrID0gKDB4NyA8PCA4KTsKLQkJCQkJdmFsX3NoaWZ0ID0gODsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoMHgxIDw8IDExKToKLQkJCQkJZW5fYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4MzQyIDoKLQkJCQkJICAgIDB4MzQzOwotCQkJCQl2YWxfYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4MzQwIDoKLQkJCQkJICAgIDB4MzQxOwotCQkJCQl2YWxfbWFzayA9ICgweDEgPDwgMTQpOwotCQkJCQl2YWxfc2hpZnQgPSAxNDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoMHgxIDw8IDEwKToKLQkJCQkJZW5fYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4MzQyIDoKLQkJCQkJICAgIDB4MzQzOwotCQkJCQl2YWxfYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4MzQwIDoKLQkJCQkJICAgIDB4MzQxOwotCQkJCQl2YWxfbWFzayA9ICgweDEgPDwgMTMpOwotCQkJCQl2YWxfc2hpZnQgPSAxMzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAoMHgxIDw8IDkpOgotCQkJCQllbl9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHgzNDIgOgotCQkJCQkgICAgMHgzNDM7Ci0JCQkJCXZhbF9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHgzNDAgOgotCQkJCQkgICAgMHgzNDE7Ci0JCQkJCXZhbF9tYXNrID0gKDB4MSA8PCAxMik7Ci0JCQkJCXZhbF9zaGlmdCA9IDEyOwotCQkJCQlicmVhazsKLQkJCQljYXNlICgweDEgPDwgOCk6Ci0JCQkJCWVuX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweDM0MiA6Ci0JCQkJCSAgICAweDM0MzsKLQkJCQkJdmFsX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweDM0MCA6Ci0JCQkJCSAgICAweDM0MTsKLQkJCQkJdmFsX21hc2sgPSAoMHgxIDw8IDExKTsKLQkJCQkJdmFsX3NoaWZ0ID0gMTE7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKDB4MSA8PCA2KToKLQkJCQkJZW5fYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4MzQyIDoKLQkJCQkJICAgIDB4MzQzOwotCQkJCQl2YWxfYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4MzQwIDoKLQkJCQkJICAgIDB4MzQxOwotCQkJCQl2YWxfbWFzayA9ICgweDEgPDwgNik7Ci0JCQkJCXZhbF9zaGlmdCA9IDY7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKDB4MSA8PCAwKToKLQkJCQkJZW5fYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4MzQyIDoKLQkJCQkJICAgIDB4MzQzOwotCQkJCQl2YWxfYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4MzQwIDoKLQkJCQkJICAgIDB4MzQxOwotCQkJCQl2YWxfbWFzayA9ICgweDEgPDwgMCk7Ci0JCQkJCXZhbF9zaGlmdCA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWFkZHIgPSAweGZmZmY7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAob3ZlcnJpZGVfaWQgPT0gTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMikgewotCi0JCQkJc3dpdGNoIChmaWVsZCkgewotCQkJCWNhc2UgKDB4MSA8PCAzKToKLQkJCQkJZW5fYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4MzQ2IDoKLQkJCQkJICAgIDB4MzQ3OwotCQkJCQl2YWxfYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4MzQ0IDoKLQkJCQkJICAgIDB4MzQ1OwotCQkJCQl2YWxfbWFzayA9ICgweDEgPDwgMyk7Ci0JCQkJCXZhbF9zaGlmdCA9IDM7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKDB4MSA8PCAxKToKLQkJCQkJZW5fYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4MzQ2IDoKLQkJCQkJICAgIDB4MzQ3OwotCQkJCQl2YWxfYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4MzQ0IDoKLQkJCQkJICAgIDB4MzQ1OwotCQkJCQl2YWxfbWFzayA9ICgweDEgPDwgMSk7Ci0JCQkJCXZhbF9zaGlmdCA9IDE7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKDB4MSA8PCAwKToKLQkJCQkJZW5fYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4MzQ2IDoKLQkJCQkJICAgIDB4MzQ3OwotCQkJCQl2YWxfYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4MzQ0IDoKLQkJCQkJICAgIDB4MzQ1OwotCQkJCQl2YWxfbWFzayA9ICgweDEgPDwgMCk7Ci0JCQkJCXZhbF9zaGlmdCA9IDA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKDB4MSA8PCAyKToKLQkJCQkJZW5fYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4MzQ2IDoKLQkJCQkJICAgIDB4MzQ3OwotCQkJCQl2YWxfYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4MzQ0IDoKLQkJCQkJICAgIDB4MzQ1OwotCQkJCQl2YWxfbWFzayA9ICgweDEgPDwgMik7Ci0JCQkJCXZhbF9zaGlmdCA9IDI7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKDB4MSA8PCA0KToKLQkJCQkJZW5fYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4MzQ2IDoKLQkJCQkJICAgIDB4MzQ3OwotCQkJCQl2YWxfYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4MzQ0IDoKLQkJCQkJICAgIDB4MzQ1OwotCQkJCQl2YWxfbWFzayA9ICgweDEgPDwgNCk7Ci0JCQkJCXZhbF9zaGlmdCA9IDQ7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCWFkZHIgPSAweGZmZmY7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG9mZikgewotCQkJCWFuZF9waHlfcmVnKHBpLCBlbl9hZGRyLCB+ZW5fbWFzayk7Ci0JCQkJYW5kX3BoeV9yZWcocGksIHZhbF9hZGRyLCB+dmFsX21hc2spOwotCQkJfSBlbHNlIHsKLQotCQkJCWlmICgoY29yZV9tYXNrID09IDApCi0JCQkJICAgIHx8IChjb3JlX21hc2sgJiAoMSA8PCBjb3JlX251bSkpKSB7Ci0JCQkJCW9yX3BoeV9yZWcocGksIGVuX2FkZHIsIGVuX21hc2spOwotCi0JCQkJCWlmIChhZGRyICE9IDB4ZmZmZikgewotCQkJCQkJbW9kX3BoeV9yZWcocGksIHZhbF9hZGRyLAotCQkJCQkJCSAgICB2YWxfbWFzaywKLQkJCQkJCQkgICAgKHZhbHVlIDw8Ci0JCQkJCQkJICAgICB2YWxfc2hpZnQpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQKLXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBmaWVsZCwgdTE2IHZhbHVlLAotCQkJICAgICB1OCBjb3JlX21hc2ssIHU4IG9mZikKLXsKLQl1OCBjb3JlX251bTsKLQl1MTYgYWRkciA9IDAsIG1hc2sgPSAwLCBlbl9hZGRyID0gMCwgdmFsX2FkZHIgPSAwLCBlbl9tYXNrID0KLQkgICAgMCwgdmFsX21hc2sgPSAwOwotCXU4IHNoaWZ0ID0gMCwgdmFsX3NoaWZ0ID0gMDsKLQotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSAmJiBOUkVWX0xUKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCi0JCWVuX21hc2sgPSBmaWVsZDsKLQkJZm9yIChjb3JlX251bSA9IDA7IGNvcmVfbnVtIDwgMjsgY29yZV9udW0rKykgewotCi0JCQlzd2l0Y2ggKGZpZWxkKSB7Ci0JCQljYXNlICgweDEgPDwgMSk6Ci0JCQkJZW5fYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4ZTcgOiAweGVjOwotCQkJCXZhbF9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHg3YSA6IDB4N2Q7Ci0JCQkJdmFsX21hc2sgPSAoMHgxIDw8IDApOwotCQkJCXZhbF9zaGlmdCA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICgweDEgPDwgMik6Ci0JCQkJZW5fYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4ZTcgOiAweGVjOwotCQkJCXZhbF9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHg3YSA6IDB4N2Q7Ci0JCQkJdmFsX21hc2sgPSAoMHgxIDw8IDEpOwotCQkJCXZhbF9zaGlmdCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICgweDEgPDwgMyk6Ci0JCQkJZW5fYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4ZTcgOiAweGVjOwotCQkJCXZhbF9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHg3YSA6IDB4N2Q7Ci0JCQkJdmFsX21hc2sgPSAoMHgxIDw8IDIpOwotCQkJCXZhbF9zaGlmdCA9IDI7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICgweDEgPDwgNCk6Ci0JCQkJZW5fYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4ZTcgOiAweGVjOwotCQkJCXZhbF9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHg3YSA6IDB4N2Q7Ci0JCQkJdmFsX21hc2sgPSAoMHgxIDw8IDQpOwotCQkJCXZhbF9zaGlmdCA9IDQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICgweDEgPDwgNSk6Ci0JCQkJZW5fYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4ZTcgOiAweGVjOwotCQkJCXZhbF9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHg3YSA6IDB4N2Q7Ci0JCQkJdmFsX21hc2sgPSAoMHgxIDw8IDUpOwotCQkJCXZhbF9zaGlmdCA9IDU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICgweDEgPDwgNik6Ci0JCQkJZW5fYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4ZTcgOiAweGVjOwotCQkJCXZhbF9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHg3YSA6IDB4N2Q7Ci0JCQkJdmFsX21hc2sgPSAoMHgxIDw8IDYpOwotCQkJCXZhbF9zaGlmdCA9IDY7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICgweDEgPDwgNyk6Ci0JCQkJZW5fYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4ZTcgOiAweGVjOwotCQkJCXZhbF9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHg3YSA6IDB4N2Q7Ci0JCQkJdmFsX21hc2sgPSAoMHgxIDw8IDcpOwotCQkJCXZhbF9zaGlmdCA9IDc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICgweDEgPDwgOCk6Ci0JCQkJZW5fYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4ZTcgOiAweGVjOwotCQkJCXZhbF9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHg3YSA6IDB4N2Q7Ci0JCQkJdmFsX21hc2sgPSAoMHg3IDw8IDgpOwotCQkJCXZhbF9zaGlmdCA9IDg7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICgweDEgPDwgMTEpOgotCQkJCWVuX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweGU3IDogMHhlYzsKLQkJCQl2YWxfYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4N2EgOiAweDdkOwotCQkJCXZhbF9tYXNrID0gKDB4NyA8PCAxMyk7Ci0JCQkJdmFsX3NoaWZ0ID0gMTM7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgKDB4MSA8PCA5KToKLQkJCQllbl9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHhlNyA6IDB4ZWM7Ci0JCQkJdmFsX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweGY4IDogMHhmYTsKLQkJCQl2YWxfbWFzayA9ICgweDcgPDwgMCk7Ci0JCQkJdmFsX3NoaWZ0ID0gMDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAoMHgxIDw8IDEwKToKLQkJCQllbl9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHhlNyA6IDB4ZWM7Ci0JCQkJdmFsX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweGY4IDogMHhmYTsKLQkJCQl2YWxfbWFzayA9ICgweDcgPDwgNCk7Ci0JCQkJdmFsX3NoaWZ0ID0gNDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSAoMHgxIDw8IDEyKToKLQkJCQllbl9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHhlNyA6IDB4ZWM7Ci0JCQkJdmFsX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweDdiIDogMHg3ZTsKLQkJCQl2YWxfbWFzayA9ICgweGZmZmYgPDwgMCk7Ci0JCQkJdmFsX3NoaWZ0ID0gMDsKLQkJCQlicmVhazsKLQkJCWNhc2UgKDB4MSA8PCAxMyk6Ci0JCQkJZW5fYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4ZTcgOiAweGVjOwotCQkJCXZhbF9hZGRyID0gKGNvcmVfbnVtID09IDApID8gMHg3YyA6IDB4N2Y7Ci0JCQkJdmFsX21hc2sgPSAoMHhmZmZmIDw8IDApOwotCQkJCXZhbF9zaGlmdCA9IDA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICgweDEgPDwgMTQpOgotCQkJCWVuX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweGU3IDogMHhlYzsKLQkJCQl2YWxfYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4ZjkgOiAweGZiOwotCQkJCXZhbF9tYXNrID0gKDB4MyA8PCA2KTsKLQkJCQl2YWxfc2hpZnQgPSA2OwotCQkJCWJyZWFrOwotCQkJY2FzZSAoMHgxIDw8IDApOgotCQkJCWVuX2FkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweGU1IDogMHhlNjsKLQkJCQl2YWxfYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4ZjkgOiAweGZiOwotCQkJCXZhbF9tYXNrID0gKDB4MSA8PCAxNSk7Ci0JCQkJdmFsX3NoaWZ0ID0gMTU7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWFkZHIgPSAweGZmZmY7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChvZmYpIHsKLQkJCQlhbmRfcGh5X3JlZyhwaSwgZW5fYWRkciwgfmVuX21hc2spOwotCQkJCWFuZF9waHlfcmVnKHBpLCB2YWxfYWRkciwgfnZhbF9tYXNrKTsKLQkJCX0gZWxzZSB7Ci0KLQkJCQlpZiAoKGNvcmVfbWFzayA9PSAwKQotCQkJCSAgICB8fCAoY29yZV9tYXNrICYgKDEgPDwgY29yZV9udW0pKSkgewotCQkJCQlvcl9waHlfcmVnKHBpLCBlbl9hZGRyLCBlbl9tYXNrKTsKLQotCQkJCQlpZiAoYWRkciAhPSAweGZmZmYpIHsKLQkJCQkJCW1vZF9waHlfcmVnKHBpLCB2YWxfYWRkciwKLQkJCQkJCQkgICAgdmFsX21hc2ssCi0JCQkJCQkJICAgICh2YWx1ZSA8PAotCQkJCQkJCSAgICAgdmFsX3NoaWZ0KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCi0JCWlmIChvZmYpIHsKLQkJCWFuZF9waHlfcmVnKHBpLCAweGVjLCB+ZmllbGQpOwotCQkJdmFsdWUgPSAweDA7Ci0JCX0gZWxzZSB7Ci0JCQlvcl9waHlfcmVnKHBpLCAweGVjLCBmaWVsZCk7Ci0JCX0KLQotCQlmb3IgKGNvcmVfbnVtID0gMDsgY29yZV9udW0gPCAyOyBjb3JlX251bSsrKSB7Ci0KLQkJCXN3aXRjaCAoZmllbGQpIHsKLQkJCWNhc2UgKDB4MSA8PCAxKToKLQkJCWNhc2UgKDB4MSA8PCA5KToKLQkJCWNhc2UgKDB4MSA8PCAxMik6Ci0JCQljYXNlICgweDEgPDwgMTMpOgotCQkJY2FzZSAoMHgxIDw8IDE0KToKLQkJCQlhZGRyID0gMHg3ODsKLQotCQkJCWNvcmVfbWFzayA9IDB4MTsKLQkJCQlicmVhazsKLQkJCWNhc2UgKDB4MSA8PCAyKToKLQkJCWNhc2UgKDB4MSA8PCAzKToKLQkJCWNhc2UgKDB4MSA8PCA0KToKLQkJCWNhc2UgKDB4MSA8PCA1KToKLQkJCWNhc2UgKDB4MSA8PCA2KToKLQkJCWNhc2UgKDB4MSA8PCA3KToKLQkJCWNhc2UgKDB4MSA8PCA4KToKLQkJCQlhZGRyID0gKGNvcmVfbnVtID09IDApID8gMHg3YSA6IDB4N2Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICgweDEgPDwgMTApOgotCQkJCWFkZHIgPSAoY29yZV9udW0gPT0gMCkgPyAweDdiIDogMHg3ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgKDB4MSA8PCAxMSk6Ci0JCQkJYWRkciA9IChjb3JlX251bSA9PSAwKSA/IDB4N2MgOiAweDdmOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlhZGRyID0gMHhmZmZmOwotCQkJfQotCi0JCQlzd2l0Y2ggKGZpZWxkKSB7Ci0JCQljYXNlICgweDEgPDwgMSk6Ci0JCQkJbWFzayA9ICgweDcgPDwgMyk7Ci0JCQkJc2hpZnQgPSAzOwotCQkJCWJyZWFrOwotCQkJY2FzZSAoMHgxIDw8IDkpOgotCQkJCW1hc2sgPSAoMHgxIDw8IDIpOwotCQkJCXNoaWZ0ID0gMjsKLQkJCQlicmVhazsKLQkJCWNhc2UgKDB4MSA8PCAxMik6Ci0JCQkJbWFzayA9ICgweDEgPDwgOCk7Ci0JCQkJc2hpZnQgPSA4OwotCQkJCWJyZWFrOwotCQkJY2FzZSAoMHgxIDw8IDEzKToKLQkJCQltYXNrID0gKDB4MSA8PCA5KTsKLQkJCQlzaGlmdCA9IDk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICgweDEgPDwgMTQpOgotCQkJCW1hc2sgPSAoMHhmIDw8IDEyKTsKLQkJCQlzaGlmdCA9IDEyOwotCQkJCWJyZWFrOwotCQkJY2FzZSAoMHgxIDw8IDIpOgotCQkJCW1hc2sgPSAoMHgxIDw8IDApOwotCQkJCXNoaWZ0ID0gMDsKLQkJCQlicmVhazsKLQkJCWNhc2UgKDB4MSA8PCAzKToKLQkJCQltYXNrID0gKDB4MSA8PCAxKTsKLQkJCQlzaGlmdCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICgweDEgPDwgNCk6Ci0JCQkJbWFzayA9ICgweDEgPDwgMik7Ci0JCQkJc2hpZnQgPSAyOwotCQkJCWJyZWFrOwotCQkJY2FzZSAoMHgxIDw8IDUpOgotCQkJCW1hc2sgPSAoMHgzIDw8IDQpOwotCQkJCXNoaWZ0ID0gNDsKLQkJCQlicmVhazsKLQkJCWNhc2UgKDB4MSA8PCA2KToKLQkJCQltYXNrID0gKDB4MyA8PCA2KTsKLQkJCQlzaGlmdCA9IDY7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICgweDEgPDwgNyk6Ci0JCQkJbWFzayA9ICgweDEgPDwgOCk7Ci0JCQkJc2hpZnQgPSA4OwotCQkJCWJyZWFrOwotCQkJY2FzZSAoMHgxIDw8IDgpOgotCQkJCW1hc2sgPSAoMHgxIDw8IDkpOwotCQkJCXNoaWZ0ID0gOTsKLQkJCQlicmVhazsKLQkJCWNhc2UgKDB4MSA8PCAxMCk6Ci0JCQkJbWFzayA9IDB4MWZmZjsKLQkJCQlzaGlmdCA9IDB4MDsKLQkJCQlicmVhazsKLQkJCWNhc2UgKDB4MSA8PCAxMSk6Ci0JCQkJbWFzayA9IDB4MWZmZjsKLQkJCQlzaGlmdCA9IDB4MDsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJbWFzayA9IDB4MDsKLQkJCQlzaGlmdCA9IDB4MDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKChhZGRyICE9IDB4ZmZmZikgJiYgKGNvcmVfbWFzayAmICgxIDw8IGNvcmVfbnVtKSkpIHsKLQkJCQltb2RfcGh5X3JlZyhwaSwgYWRkciwgbWFzaywgKHZhbHVlIDw8IHNoaWZ0KSk7Ci0JCQl9Ci0JCX0KLQotCQlvcl9waHlfcmVnKHBpLCAweGVjLCAoMHgxIDw8IDApKTsKLQkJb3JfcGh5X3JlZyhwaSwgMHg3OCwgKDB4MSA8PCAwKSk7Ci0JCXVkZWxheSgxKTsKLQkJYW5kX3BoeV9yZWcocGksIDB4ZWMsIH4oMHgxIDw8IDApKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi13bGNfcGh5X3JmY3RybF9vdmVycmlkZV8xdG9tYW55X25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBjbWQsIHUxNiB2YWx1ZSwKLQkJCQkgICAgIHU4IGNvcmVfbWFzaywgdTggb2ZmKQotewotCXUxNiByZm14Z2FpbiA9IDAsIGxwZmdhaW4gPSAwOwotCXUxNiB0Z2FpbiA9IDA7Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQotCQlzd2l0Y2ggKGNtZCkgewotCQljYXNlIE5QSFlfUkVWN19SZmN0cmxPdmVycmlkZV9jbWRfcnhyZl9wdToKLQkJCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCA1KSwKLQkJCQkJCQkgIHZhbHVlLCBjb3JlX21hc2ssIG9mZiwKLQkJCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDEpOwotCQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDQpLCB2YWx1ZSwKLQkJCQkJCQkgIGNvcmVfbWFzaywgb2ZmLAotCQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMSk7Ci0JCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksICgweDEgPDwgMyksIHZhbHVlLAotCQkJCQkJCSAgY29yZV9tYXNrLCBvZmYsCi0JCQkJCQkJICBOUEhZX1JFVjdfUkZDVFJMT1ZFUlJJREVfSUQxKTsKLQkJCWJyZWFrOwotCQljYXNlIE5QSFlfUkVWN19SZmN0cmxPdmVycmlkZV9jbWRfcnhfcHU6Ci0JCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksICgweDEgPDwgMiksCi0JCQkJCQkJICB2YWx1ZSwgY29yZV9tYXNrLCBvZmYsCi0JCQkJCQkJICBOUEhZX1JFVjdfUkZDVFJMT1ZFUlJJREVfSUQxKTsKLQkJCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCAxKSwgdmFsdWUsCi0JCQkJCQkJICBjb3JlX21hc2ssIG9mZiwKLQkJCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDEpOwotCQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDApLCB2YWx1ZSwKLQkJCQkJCQkgIGNvcmVfbWFzaywgb2ZmLAotCQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMSk7Ci0JCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksICgweDEgPDwgMSksIHZhbHVlLAotCQkJCQkJCSAgY29yZV9tYXNrLCBvZmYsCi0JCQkJCQkJICBOUEhZX1JFVjdfUkZDVFJMT1ZFUlJJREVfSUQyKTsKLQkJCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCAxMSksIDAsCi0JCQkJCQkJICBjb3JlX21hc2ssIG9mZiwKLQkJCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTlBIWV9SRVY3X1JmY3RybE92ZXJyaWRlX2NtZF90eF9wdToKLQkJCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCAyKSwKLQkJCQkJCQkgIHZhbHVlLCBjb3JlX21hc2ssIG9mZiwKLQkJCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDApOwotCQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDEpLCB2YWx1ZSwKLQkJCQkJCQkgIGNvcmVfbWFzaywgb2ZmLAotCQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMSk7Ci0JCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksICgweDEgPDwgMCksIHZhbHVlLAotCQkJCQkJCSAgY29yZV9tYXNrLCBvZmYsCi0JCQkJCQkJICBOUEhZX1JFVjdfUkZDVFJMT1ZFUlJJREVfSUQyKTsKLQkJCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCAyKSwgdmFsdWUsCi0JCQkJCQkJICBjb3JlX21hc2ssIG9mZiwKLQkJCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDIpOwotCQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDExKSwgMSwKLQkJCQkJCQkgIGNvcmVfbWFzaywgb2ZmLAotCQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMSk7Ci0JCQlicmVhazsKLQkJY2FzZSBOUEhZX1JFVjdfUmZjdHJsT3ZlcnJpZGVfY21kX3J4Z2FpbjoKLQkJCXJmbXhnYWluID0gdmFsdWUgJiAweDAwMGZmOwotCQkJbHBmZ2FpbiA9IHZhbHVlICYgMHgwZmYwMDsKLQkJCWxwZmdhaW4gPSBscGZnYWluID4+IDg7Ci0KLQkJCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCAxMSksCi0JCQkJCQkJICByZm14Z2FpbiwgY29yZV9tYXNrLAotCQkJCQkJCSAgb2ZmLAotCQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMCk7Ci0JCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksICgweDMgPDwgMTMpLAotCQkJCQkJCSAgbHBmZ2FpbiwgY29yZV9tYXNrLAotCQkJCQkJCSAgb2ZmLAotCQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMCk7Ci0JCQlicmVhazsKLQkJY2FzZSBOUEhZX1JFVjdfUmZjdHJsT3ZlcnJpZGVfY21kX3R4Z2FpbjoKLQkJCXRnYWluID0gdmFsdWUgJiAweDdmZmY7Ci0JCQlscGZnYWluID0gdmFsdWUgJiAweDgwMDA7Ci0JCQlscGZnYWluID0gbHBmZ2FpbiA+PiAxNDsKLQotCQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDEyKSwKLQkJCQkJCQkgIHRnYWluLCBjb3JlX21hc2ssIG9mZiwKLQkJCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDApOwotCQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDEzKSwKLQkJCQkJCQkgIGxwZmdhaW4sIGNvcmVfbWFzaywKLQkJCQkJCQkgIG9mZiwKLQkJCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDApOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi13bGNfcGh5X3NjYWxlX29mZnNldF9yc3NpX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBzY2FsZSwgczggb2Zmc2V0LAotCQkJICAgICAgIHU4IGNvcmVzZWwsIHU4IHJhaWwsIHU4IHJzc2lfdHlwZSkKLXsKLQl1MTYgdmFsdWV0b3N0dWZmOwotCi0Jb2Zmc2V0ID0gKG9mZnNldCA+IE5QSFlfUlNTSUNBTF9NQVhSRUFEKSA/Ci0JICAgIE5QSFlfUlNTSUNBTF9NQVhSRUFEIDogb2Zmc2V0OwotCW9mZnNldCA9IChvZmZzZXQgPCAoLU5QSFlfUlNTSUNBTF9NQVhSRUFEIC0gMSkpID8KLQkgICAgLU5QSFlfUlNTSUNBTF9NQVhSRUFEIC0gMSA6IG9mZnNldDsKLQotCXZhbHVldG9zdHVmZiA9ICgoc2NhbGUgJiAweDNmKSA8PCA4KSB8IChvZmZzZXQgJiAweDNmKTsKLQotCWlmICgoKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0NPUkUxKSB8fAotCSAgICAgKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0FMTFJYKSkgJiYKLQkgICAgKHJhaWwgPT0gTlBIWV9SQUlMX0kpICYmIChyc3NpX3R5cGUgPT0gTlBIWV9SU1NJX1NFTF9OQikpIHsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxYTYsIHZhbHVldG9zdHVmZik7Ci0JfQotCWlmICgoKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0NPUkUxKSB8fAotCSAgICAgKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0FMTFJYKSkgJiYKLQkgICAgKHJhaWwgPT0gTlBIWV9SQUlMX1EpICYmIChyc3NpX3R5cGUgPT0gTlBIWV9SU1NJX1NFTF9OQikpIHsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxYWMsIHZhbHVldG9zdHVmZik7Ci0JfQotCWlmICgoKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0NPUkUyKSB8fAotCSAgICAgKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0FMTFJYKSkgJiYKLQkgICAgKHJhaWwgPT0gTlBIWV9SQUlMX0kpICYmIChyc3NpX3R5cGUgPT0gTlBIWV9SU1NJX1NFTF9OQikpIHsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxYjIsIHZhbHVldG9zdHVmZik7Ci0JfQotCWlmICgoKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0NPUkUyKSB8fAotCSAgICAgKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0FMTFJYKSkgJiYKLQkgICAgKHJhaWwgPT0gTlBIWV9SQUlMX1EpICYmIChyc3NpX3R5cGUgPT0gTlBIWV9SU1NJX1NFTF9OQikpIHsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxYjgsIHZhbHVldG9zdHVmZik7Ci0JfQotCi0JaWYgKCgoY29yZXNlbCA9PSBSQURJT19NSU1PX0NPUkVTRUxfQ09SRTEpIHx8Ci0JICAgICAoY29yZXNlbCA9PSBSQURJT19NSU1PX0NPUkVTRUxfQUxMUlgpKSAmJgotCSAgICAocmFpbCA9PSBOUEhZX1JBSUxfSSkgJiYgKHJzc2lfdHlwZSA9PSBOUEhZX1JTU0lfU0VMX1cxKSkgewotCQl3cml0ZV9waHlfcmVnKHBpLCAweDFhNCwgdmFsdWV0b3N0dWZmKTsKLQl9Ci0JaWYgKCgoY29yZXNlbCA9PSBSQURJT19NSU1PX0NPUkVTRUxfQ09SRTEpIHx8Ci0JICAgICAoY29yZXNlbCA9PSBSQURJT19NSU1PX0NPUkVTRUxfQUxMUlgpKSAmJgotCSAgICAocmFpbCA9PSBOUEhZX1JBSUxfUSkgJiYgKHJzc2lfdHlwZSA9PSBOUEhZX1JTU0lfU0VMX1cxKSkgewotCQl3cml0ZV9waHlfcmVnKHBpLCAweDFhYSwgdmFsdWV0b3N0dWZmKTsKLQl9Ci0JaWYgKCgoY29yZXNlbCA9PSBSQURJT19NSU1PX0NPUkVTRUxfQ09SRTIpIHx8Ci0JICAgICAoY29yZXNlbCA9PSBSQURJT19NSU1PX0NPUkVTRUxfQUxMUlgpKSAmJgotCSAgICAocmFpbCA9PSBOUEhZX1JBSUxfSSkgJiYgKHJzc2lfdHlwZSA9PSBOUEhZX1JTU0lfU0VMX1cxKSkgewotCQl3cml0ZV9waHlfcmVnKHBpLCAweDFiMCwgdmFsdWV0b3N0dWZmKTsKLQl9Ci0JaWYgKCgoY29yZXNlbCA9PSBSQURJT19NSU1PX0NPUkVTRUxfQ09SRTIpIHx8Ci0JICAgICAoY29yZXNlbCA9PSBSQURJT19NSU1PX0NPUkVTRUxfQUxMUlgpKSAmJgotCSAgICAocmFpbCA9PSBOUEhZX1JBSUxfUSkgJiYgKHJzc2lfdHlwZSA9PSBOUEhZX1JTU0lfU0VMX1cxKSkgewotCQl3cml0ZV9waHlfcmVnKHBpLCAweDFiNiwgdmFsdWV0b3N0dWZmKTsKLQl9Ci0KLQlpZiAoKChjb3Jlc2VsID09IFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMSkgfHwKLQkgICAgIChjb3Jlc2VsID09IFJBRElPX01JTU9fQ09SRVNFTF9BTExSWCkpICYmCi0JICAgIChyYWlsID09IE5QSFlfUkFJTF9JKSAmJiAocnNzaV90eXBlID09IE5QSFlfUlNTSV9TRUxfVzIpKSB7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MWE1LCB2YWx1ZXRvc3R1ZmYpOwotCX0KLQlpZiAoKChjb3Jlc2VsID09IFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMSkgfHwKLQkgICAgIChjb3Jlc2VsID09IFJBRElPX01JTU9fQ09SRVNFTF9BTExSWCkpICYmCi0JICAgIChyYWlsID09IE5QSFlfUkFJTF9RKSAmJiAocnNzaV90eXBlID09IE5QSFlfUlNTSV9TRUxfVzIpKSB7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MWFiLCB2YWx1ZXRvc3R1ZmYpOwotCX0KLQlpZiAoKChjb3Jlc2VsID09IFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMikgfHwKLQkgICAgIChjb3Jlc2VsID09IFJBRElPX01JTU9fQ09SRVNFTF9BTExSWCkpICYmCi0JICAgIChyYWlsID09IE5QSFlfUkFJTF9JKSAmJiAocnNzaV90eXBlID09IE5QSFlfUlNTSV9TRUxfVzIpKSB7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MWIxLCB2YWx1ZXRvc3R1ZmYpOwotCX0KLQlpZiAoKChjb3Jlc2VsID09IFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMikgfHwKLQkgICAgIChjb3Jlc2VsID09IFJBRElPX01JTU9fQ09SRVNFTF9BTExSWCkpICYmCi0JICAgIChyYWlsID09IE5QSFlfUkFJTF9RKSAmJiAocnNzaV90eXBlID09IE5QSFlfUlNTSV9TRUxfVzIpKSB7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MWI3LCB2YWx1ZXRvc3R1ZmYpOwotCX0KLQotCWlmICgoKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0NPUkUxKSB8fAotCSAgICAgKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0FMTFJYKSkgJiYKLQkgICAgKHJhaWwgPT0gTlBIWV9SQUlMX0kpICYmIChyc3NpX3R5cGUgPT0gTlBIWV9SU1NJX1NFTF9UQkQpKSB7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MWE3LCB2YWx1ZXRvc3R1ZmYpOwotCX0KLQlpZiAoKChjb3Jlc2VsID09IFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMSkgfHwKLQkgICAgIChjb3Jlc2VsID09IFJBRElPX01JTU9fQ09SRVNFTF9BTExSWCkpICYmCi0JICAgIChyYWlsID09IE5QSFlfUkFJTF9RKSAmJiAocnNzaV90eXBlID09IE5QSFlfUlNTSV9TRUxfVEJEKSkgewotCQl3cml0ZV9waHlfcmVnKHBpLCAweDFhZCwgdmFsdWV0b3N0dWZmKTsKLQl9Ci0JaWYgKCgoY29yZXNlbCA9PSBSQURJT19NSU1PX0NPUkVTRUxfQ09SRTIpIHx8Ci0JICAgICAoY29yZXNlbCA9PSBSQURJT19NSU1PX0NPUkVTRUxfQUxMUlgpKSAmJgotCSAgICAocmFpbCA9PSBOUEhZX1JBSUxfSSkgJiYgKHJzc2lfdHlwZSA9PSBOUEhZX1JTU0lfU0VMX1RCRCkpIHsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxYjMsIHZhbHVldG9zdHVmZik7Ci0JfQotCWlmICgoKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0NPUkUyKSB8fAotCSAgICAgKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0FMTFJYKSkgJiYKLQkgICAgKHJhaWwgPT0gTlBIWV9SQUlMX1EpICYmIChyc3NpX3R5cGUgPT0gTlBIWV9SU1NJX1NFTF9UQkQpKSB7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MWI5LCB2YWx1ZXRvc3R1ZmYpOwotCX0KLQotCWlmICgoKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0NPUkUxKSB8fAotCSAgICAgKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0FMTFJYKSkgJiYKLQkgICAgKHJhaWwgPT0gTlBIWV9SQUlMX0kpICYmIChyc3NpX3R5cGUgPT0gTlBIWV9SU1NJX1NFTF9JUSkpIHsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxYTgsIHZhbHVldG9zdHVmZik7Ci0JfQotCWlmICgoKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0NPUkUxKSB8fAotCSAgICAgKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0FMTFJYKSkgJiYKLQkgICAgKHJhaWwgPT0gTlBIWV9SQUlMX1EpICYmIChyc3NpX3R5cGUgPT0gTlBIWV9SU1NJX1NFTF9JUSkpIHsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxYWUsIHZhbHVldG9zdHVmZik7Ci0JfQotCWlmICgoKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0NPUkUyKSB8fAotCSAgICAgKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0FMTFJYKSkgJiYKLQkgICAgKHJhaWwgPT0gTlBIWV9SQUlMX0kpICYmIChyc3NpX3R5cGUgPT0gTlBIWV9SU1NJX1NFTF9JUSkpIHsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxYjQsIHZhbHVldG9zdHVmZik7Ci0JfQotCWlmICgoKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0NPUkUyKSB8fAotCSAgICAgKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0FMTFJYKSkgJiYKLQkgICAgKHJhaWwgPT0gTlBIWV9SQUlMX1EpICYmIChyc3NpX3R5cGUgPT0gTlBIWV9SU1NJX1NFTF9JUSkpIHsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxYmEsIHZhbHVldG9zdHVmZik7Ci0JfQotCi0JaWYgKCgoY29yZXNlbCA9PSBSQURJT19NSU1PX0NPUkVTRUxfQ09SRTEpIHx8Ci0JICAgICAoY29yZXNlbCA9PSBSQURJT19NSU1PX0NPUkVTRUxfQUxMUlgpKSAmJgotCSAgICAocnNzaV90eXBlID09IE5QSFlfUlNTSV9TRUxfVFNTSV8yRykpIHsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxYTksIHZhbHVldG9zdHVmZik7Ci0JfQotCWlmICgoKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0NPUkUyKSB8fAotCSAgICAgKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0FMTFJYKSkgJiYKLQkgICAgKHJzc2lfdHlwZSA9PSBOUEhZX1JTU0lfU0VMX1RTU0lfMkcpKSB7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MWI1LCB2YWx1ZXRvc3R1ZmYpOwotCX0KLQotCWlmICgoKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0NPUkUxKSB8fAotCSAgICAgKGNvcmVzZWwgPT0gUkFESU9fTUlNT19DT1JFU0VMX0FMTFJYKSkgJiYKLQkgICAgKHJzc2lfdHlwZSA9PSBOUEhZX1JTU0lfU0VMX1RTU0lfNUcpKSB7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MWFmLCB2YWx1ZXRvc3R1ZmYpOwotCX0KLQlpZiAoKChjb3Jlc2VsID09IFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMikgfHwKLQkgICAgIChjb3Jlc2VsID09IFJBRElPX01JTU9fQ09SRVNFTF9BTExSWCkpICYmCi0JICAgIChyc3NpX3R5cGUgPT0gTlBIWV9SU1NJX1NFTF9UU1NJXzVHKSkgewotCQl3cml0ZV9waHlfcmVnKHBpLCAweDFiYiwgdmFsdWV0b3N0dWZmKTsKLQl9Ci19Ci0KLXZvaWQgd2xjX3BoeV9yc3Npc2VsX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHU4IGNvcmVfY29kZSwgdTggcnNzaV90eXBlKQotewotCXUxNiBtYXNrLCB2YWw7Ci0JdTE2IGFmZWN0cmxvdnJfcnNzaV92YWwsIHJmY3RybGNtZF9yeGVuX3ZhbCwgcmZjdHJsY21kX2NvcmVzZWxfdmFsLAotCSAgICBzdGFydHNlcTsKLQl1MTYgcmZjdHJsb3ZyX3Jzc2lfdmFsLCByZmN0cmxvdnJfcnhlbl92YWwsIHJmY3RybG92cl9jb3Jlc2VsX3ZhbCwKLQkgICAgcmZjdHJsb3ZyX3RyaWdnZXJfdmFsOwotCXUxNiBhZmVjdHJsb3ZyX3Jzc2lfbWFzaywgcmZjdHJsY21kX21hc2ssIHJmY3RybG92cl9tYXNrOwotCXUxNiByZmN0cmxjbWRfdmFsLCByZmN0cmxvdnJfdmFsOwotCXU4IGNvcmU7Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJaWYgKGNvcmVfY29kZSA9PSBSQURJT19NSU1PX0NPUkVTRUxfT0ZGKSB7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHg4ZiwgKDB4MSA8PCA5KSwgMCk7Ci0JCQltb2RfcGh5X3JlZyhwaSwgMHhhNSwgKDB4MSA8PCA5KSwgMCk7Ci0KLQkJCW1vZF9waHlfcmVnKHBpLCAweGE2LCAoMHgzIDw8IDgpLCAwKTsKLQkJCW1vZF9waHlfcmVnKHBpLCAweGE3LCAoMHgzIDw8IDgpLCAwKTsKLQotCQkJbW9kX3BoeV9yZWcocGksIDB4ZTUsICgweDEgPDwgNSksIDApOwotCQkJbW9kX3BoeV9yZWcocGksIDB4ZTYsICgweDEgPDwgNSksIDApOwotCi0JCQltYXNrID0gKDB4MSA8PCAyKSB8Ci0JCQkgICAgKDB4MSA8PCAzKSB8ICgweDEgPDwgNCkgfCAoMHgxIDw8IDUpOwotCQkJbW9kX3BoeV9yZWcocGksIDB4ZjksIG1hc2ssIDApOwotCQkJbW9kX3BoeV9yZWcocGksIDB4ZmIsIG1hc2ssIDApOwotCi0JCX0gZWxzZSB7Ci0JCQlmb3IgKGNvcmUgPSAwOyBjb3JlIDwgcGktPnB1YnBpLnBoeV9jb3JlbnVtOyBjb3JlKyspIHsKLQkJCQlpZiAoY29yZV9jb2RlID09IFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMQotCQkJCSAgICAmJiBjb3JlID09IFBIWV9DT1JFXzEpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWVsc2UgaWYgKGNvcmVfY29kZSA9PSBSQURJT19NSU1PX0NPUkVTRUxfQ09SRTIKLQkJCQkJICYmIGNvcmUgPT0gUEhZX0NPUkVfMCkKLQkJCQkJY29udGludWU7Ci0KLQkJCQltb2RfcGh5X3JlZyhwaSwgKGNvcmUgPT0gUEhZX0NPUkVfMCkgPwotCQkJCQkgICAgMHg4ZiA6IDB4YTUsICgweDEgPDwgOSksIDEgPDwgOSk7Ci0KLQkJCQlpZiAocnNzaV90eXBlID09IE5QSFlfUlNTSV9TRUxfVzEgfHwKLQkJCQkgICAgcnNzaV90eXBlID09IE5QSFlfUlNTSV9TRUxfVzIgfHwKLQkJCQkgICAgcnNzaV90eXBlID09IE5QSFlfUlNTSV9TRUxfTkIpIHsKLQotCQkJCQltb2RfcGh5X3JlZyhwaSwKLQkJCQkJCSAgICAoY29yZSA9PQotCQkJCQkJICAgICBQSFlfQ09SRV8wKSA/IDB4YTYgOiAweGE3LAotCQkJCQkJICAgICgweDMgPDwgOCksIDApOwotCi0JCQkJCW1hc2sgPSAoMHgxIDw8IDIpIHwKLQkJCQkJICAgICgweDEgPDwgMykgfAotCQkJCQkgICAgKDB4MSA8PCA0KSB8ICgweDEgPDwgNSk7Ci0JCQkJCW1vZF9waHlfcmVnKHBpLAotCQkJCQkJICAgIChjb3JlID09Ci0JCQkJCQkgICAgIFBIWV9DT1JFXzApID8gMHhmOSA6IDB4ZmIsCi0JCQkJCQkgICAgbWFzaywgMCk7Ci0KLQkJCQkJaWYgKHJzc2lfdHlwZSA9PSBOUEhZX1JTU0lfU0VMX1cxKSB7Ci0JCQkJCQlpZiAoQ0hTUEVDX0lTNUcKLQkJCQkJCSAgICAocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJCQkJCW1hc2sgPSAoMHgxIDw8IDIpOwotCQkJCQkJCXZhbCA9IDEgPDwgMjsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJbWFzayA9ICgweDEgPDwgMyk7Ci0JCQkJCQkJdmFsID0gMSA8PCAzOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgaWYgKHJzc2lfdHlwZSA9PQotCQkJCQkJICAgTlBIWV9SU1NJX1NFTF9XMikgewotCQkJCQkJbWFzayA9ICgweDEgPDwgNCk7Ci0JCQkJCQl2YWwgPSAxIDw8IDQ7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQltYXNrID0gKDB4MSA8PCA1KTsKLQkJCQkJCXZhbCA9IDEgPDwgNTsKLQkJCQkJfQotCQkJCQltb2RfcGh5X3JlZyhwaSwKLQkJCQkJCSAgICAoY29yZSA9PQotCQkJCQkJICAgICBQSFlfQ09SRV8wKSA/IDB4ZjkgOiAweGZiLAotCQkJCQkJICAgIG1hc2ssIHZhbCk7Ci0KLQkJCQkJbWFzayA9ICgweDEgPDwgNSk7Ci0JCQkJCXZhbCA9IDEgPDwgNTsKLQkJCQkJbW9kX3BoeV9yZWcocGksIChjb3JlID09IFBIWV9DT1JFXzApID8KLQkJCQkJCSAgICAweGU1IDogMHhlNiwgbWFzaywgdmFsKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAocnNzaV90eXBlID09IE5QSFlfUlNTSV9TRUxfVEJEKSB7Ci0KLQkJCQkJCW1hc2sgPSAoMHgzIDw8IDgpOwotCQkJCQkJdmFsID0gMSA8PCA4OwotCQkJCQkJbW9kX3BoeV9yZWcocGksCi0JCQkJCQkJICAgIChjb3JlID09Ci0JCQkJCQkJICAgICBQSFlfQ09SRV8wKSA/IDB4YTYKLQkJCQkJCQkgICAgOiAweGE3LCBtYXNrLCB2YWwpOwotCQkJCQkJbWFzayA9ICgweDMgPDwgMTApOwotCQkJCQkJdmFsID0gMSA8PCAxMDsKLQkJCQkJCW1vZF9waHlfcmVnKHBpLAotCQkJCQkJCSAgICAoY29yZSA9PQotCQkJCQkJCSAgICAgUEhZX0NPUkVfMCkgPyAweGE2Ci0JCQkJCQkJICAgIDogMHhhNywgbWFzaywgdmFsKTsKLQkJCQkJfSBlbHNlIGlmIChyc3NpX3R5cGUgPT0KLQkJCQkJCSAgIE5QSFlfUlNTSV9TRUxfSVEpIHsKLQotCQkJCQkJbWFzayA9ICgweDMgPDwgOCk7Ci0JCQkJCQl2YWwgPSAyIDw8IDg7Ci0JCQkJCQltb2RfcGh5X3JlZyhwaSwKLQkJCQkJCQkgICAgKGNvcmUgPT0KLQkJCQkJCQkgICAgIFBIWV9DT1JFXzApID8gMHhhNgotCQkJCQkJCSAgICA6IDB4YTcsIG1hc2ssIHZhbCk7Ci0JCQkJCQltYXNrID0gKDB4MyA8PCAxMCk7Ci0JCQkJCQl2YWwgPSAyIDw8IDEwOwotCQkJCQkJbW9kX3BoeV9yZWcocGksCi0JCQkJCQkJICAgIChjb3JlID09Ci0JCQkJCQkJICAgICBQSFlfQ09SRV8wKSA/IDB4YTYKLQkJCQkJCQkgICAgOiAweGE3LCBtYXNrLCB2YWwpOwotCQkJCQl9IGVsc2UgewotCi0JCQkJCQltYXNrID0gKDB4MyA8PCA4KTsKLQkJCQkJCXZhbCA9IDMgPDwgODsKLQkJCQkJCW1vZF9waHlfcmVnKHBpLAotCQkJCQkJCSAgICAoY29yZSA9PQotCQkJCQkJCSAgICAgUEhZX0NPUkVfMCkgPyAweGE2Ci0JCQkJCQkJICAgIDogMHhhNywgbWFzaywgdmFsKTsKLQkJCQkJCW1hc2sgPSAoMHgzIDw8IDEwKTsKLQkJCQkJCXZhbCA9IDMgPDwgMTA7Ci0JCQkJCQltb2RfcGh5X3JlZyhwaSwKLQkJCQkJCQkgICAgKGNvcmUgPT0KLQkJCQkJCQkgICAgIFBIWV9DT1JFXzApID8gMHhhNgotCQkJCQkJCSAgICA6IDB4YTcsIG1hc2ssIHZhbCk7Ci0KLQkJCQkJCWlmIChQSFlfSVBBKHBpKSkgewotCQkJCQkJCWlmIChOUkVWX0dFCi0JCQkJCQkJICAgIChwaS0+cHVicGkucGh5X3JldiwKLQkJCQkJCQkgICAgIDcpKSB7Ci0KLQkJCQkJCQkJd3JpdGVfcmFkaW9fcmVnCi0JCQkJCQkJCSAgICAocGksCi0JCQkJCQkJCSAgICAgKChjb3JlID09Ci0JCQkJCQkJCSAgICAgICBQSFlfQ09SRV8wKQotCQkJCQkJCQkgICAgICA/Ci0JCQkJCQkJCSAgICAgIFJBRElPXzIwNTdfVFgwX1RYX1NTSV9NVVgKLQkJCQkJCQkJICAgICAgOgotCQkJCQkJCQkgICAgICBSQURJT18yMDU3X1RYMV9UWF9TU0lfTVVYKSwKLQkJCQkJCQkJICAgICAoQ0hTUEVDX0lTNUcKLQkJCQkJCQkJICAgICAgKHBpLT4KLQkJCQkJCQkJICAgICAgIHJhZGlvX2NoYW5zcGVjKQotCQkJCQkJCQkgICAgICA/IDB4YyA6Ci0JCQkJCQkJCSAgICAgIDB4ZSkpOwotCQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJCXdyaXRlX3JhZGlvX3JlZwotCQkJCQkJCQkgICAgKHBpLAotCQkJCQkJCQkgICAgIFJBRElPXzIwNTZfVFhfVFhfU1NJX01VWAotCQkJCQkJCQkgICAgIHwKLQkJCQkJCQkJICAgICAoKGNvcmUgPT0KLQkJCQkJCQkJICAgICAgIFBIWV9DT1JFXzApCi0JCQkJCQkJCSAgICAgID8KLQkJCQkJCQkJICAgICAgUkFESU9fMjA1Nl9UWDAKLQkJCQkJCQkJICAgICAgOgotCQkJCQkJCQkgICAgICBSQURJT18yMDU2X1RYMSksCi0JCQkJCQkJCSAgICAgKENIU1BFQ19JUzVHCi0JCQkJCQkJCSAgICAgIChwaS0+Ci0JCQkJCQkJCSAgICAgICByYWRpb19jaGFuc3BlYykKLQkJCQkJCQkJICAgICAgPyAweGMgOgotCQkJCQkJCQkgICAgICAweGUpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCi0JCQkJCQkJaWYgKE5SRVZfR0UKLQkJCQkJCQkgICAgKHBpLT5wdWJwaS5waHlfcmV2LAotCQkJCQkJCSAgICAgNykpIHsKLQkJCQkJCQkJd3JpdGVfcmFkaW9fcmVnCi0JCQkJCQkJCSAgICAocGksCi0JCQkJCQkJCSAgICAgKChjb3JlID09Ci0JCQkJCQkJCSAgICAgICBQSFlfQ09SRV8wKQotCQkJCQkJCQkgICAgICA/Ci0JCQkJCQkJCSAgICAgIFJBRElPXzIwNTdfVFgwX1RYX1NTSV9NVVgKLQkJCQkJCQkJICAgICAgOgotCQkJCQkJCQkgICAgICBSQURJT18yMDU3X1RYMV9UWF9TU0lfTVVYKSwKLQkJCQkJCQkJICAgICAweDExKTsKLQotCQkJCQkJCQlpZiAocGktPnB1YnBpLgotCQkJCQkJCQkgICAgcmFkaW9pZCA9PQotCQkJCQkJCQkgICAgQkNNMjA1N19JRCkKLQkJCQkJCQkJCXdyaXRlX3JhZGlvX3JlZwotCQkJCQkJCQkJICAgIChwaSwKLQkJCQkJCQkJCSAgICAgUkFESU9fMjA1N19JUVRFU1RfU0VMX1BVLAotCQkJCQkJCQkJICAgICAweDEpOwotCi0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJd3JpdGVfcmFkaW9fcmVnCi0JCQkJCQkJCSAgICAocGksCi0JCQkJCQkJCSAgICAgUkFESU9fMjA1Nl9UWF9UWF9TU0lfTVVYCi0JCQkJCQkJCSAgICAgfAotCQkJCQkJCQkgICAgICgoY29yZSA9PQotCQkJCQkJCQkgICAgICAgUEhZX0NPUkVfMCkKLQkJCQkJCQkJICAgICAgPwotCQkJCQkJCQkgICAgICBSQURJT18yMDU2X1RYMAotCQkJCQkJCQkgICAgICA6Ci0JCQkJCQkJCSAgICAgIFJBRElPXzIwNTZfVFgxKSwKLQkJCQkJCQkJICAgICAweDExKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWFmZWN0cmxvdnJfcnNzaV92YWwgPSAxIDw8IDk7Ci0JCQkJCQltb2RfcGh5X3JlZyhwaSwKLQkJCQkJCQkgICAgKGNvcmUgPT0KLQkJCQkJCQkgICAgIFBIWV9DT1JFXzApID8gMHg4ZgotCQkJCQkJCSAgICA6IDB4YTUsICgweDEgPDwgOSksCi0JCQkJCQkJICAgIGFmZWN0cmxvdnJfcnNzaV92YWwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQotCQlpZiAoKHJzc2lfdHlwZSA9PSBOUEhZX1JTU0lfU0VMX1cxKSB8fAotCQkgICAgKHJzc2lfdHlwZSA9PSBOUEhZX1JTU0lfU0VMX1cyKSB8fAotCQkgICAgKHJzc2lfdHlwZSA9PSBOUEhZX1JTU0lfU0VMX05CKSkgewotCi0JCQl2YWwgPSAweDA7Ci0JCX0gZWxzZSBpZiAocnNzaV90eXBlID09IE5QSFlfUlNTSV9TRUxfVEJEKSB7Ci0KLQkJCXZhbCA9IDB4MTsKLQkJfSBlbHNlIGlmIChyc3NpX3R5cGUgPT0gTlBIWV9SU1NJX1NFTF9JUSkgewotCi0JCQl2YWwgPSAweDI7Ci0JCX0gZWxzZSB7Ci0KLQkJCXZhbCA9IDB4MzsKLQkJfQotCQltYXNrID0gKCgweDMgPDwgMTIpIHwgKDB4MyA8PCAxNCkpOwotCQl2YWwgPSAodmFsIDw8IDEyKSB8ICh2YWwgPDwgMTQpOwotCQltb2RfcGh5X3JlZyhwaSwgMHhhNiwgbWFzaywgdmFsKTsKLQkJbW9kX3BoeV9yZWcocGksIDB4YTcsIG1hc2ssIHZhbCk7Ci0KLQkJaWYgKChyc3NpX3R5cGUgPT0gTlBIWV9SU1NJX1NFTF9XMSkgfHwKLQkJICAgIChyc3NpX3R5cGUgPT0gTlBIWV9SU1NJX1NFTF9XMikgfHwKLQkJICAgIChyc3NpX3R5cGUgPT0gTlBIWV9SU1NJX1NFTF9OQikpIHsKLQkJCWlmIChyc3NpX3R5cGUgPT0gTlBIWV9SU1NJX1NFTF9XMSkgewotCQkJCXZhbCA9IDB4MTsKLQkJCX0KLQkJCWlmIChyc3NpX3R5cGUgPT0gTlBIWV9SU1NJX1NFTF9XMikgewotCQkJCXZhbCA9IDB4MjsKLQkJCX0KLQkJCWlmIChyc3NpX3R5cGUgPT0gTlBIWV9SU1NJX1NFTF9OQikgewotCQkJCXZhbCA9IDB4MzsKLQkJCX0KLQkJCW1hc2sgPSAoMHgzIDw8IDQpOwotCQkJdmFsID0gKHZhbCA8PCA0KTsKLQkJCW1vZF9waHlfcmVnKHBpLCAweDdhLCBtYXNrLCB2YWwpOwotCQkJbW9kX3BoeV9yZWcocGksIDB4N2QsIG1hc2ssIHZhbCk7Ci0JCX0KLQotCQlpZiAoY29yZV9jb2RlID09IFJBRElPX01JTU9fQ09SRVNFTF9PRkYpIHsKLQkJCWFmZWN0cmxvdnJfcnNzaV92YWwgPSAwOwotCQkJcmZjdHJsY21kX3J4ZW5fdmFsID0gMDsKLQkJCXJmY3RybGNtZF9jb3Jlc2VsX3ZhbCA9IDA7Ci0JCQlyZmN0cmxvdnJfcnNzaV92YWwgPSAwOwotCQkJcmZjdHJsb3ZyX3J4ZW5fdmFsID0gMDsKLQkJCXJmY3RybG92cl9jb3Jlc2VsX3ZhbCA9IDA7Ci0JCQlyZmN0cmxvdnJfdHJpZ2dlcl92YWwgPSAwOwotCQkJc3RhcnRzZXEgPSAwOwotCQl9IGVsc2UgewotCQkJYWZlY3RybG92cl9yc3NpX3ZhbCA9IDE7Ci0JCQlyZmN0cmxjbWRfcnhlbl92YWwgPSAxOwotCQkJcmZjdHJsY21kX2NvcmVzZWxfdmFsID0gY29yZV9jb2RlOwotCQkJcmZjdHJsb3ZyX3Jzc2lfdmFsID0gMTsKLQkJCXJmY3RybG92cl9yeGVuX3ZhbCA9IDE7Ci0JCQlyZmN0cmxvdnJfY29yZXNlbF92YWwgPSAxOwotCQkJcmZjdHJsb3ZyX3RyaWdnZXJfdmFsID0gMTsKLQkJCXN0YXJ0c2VxID0gMTsKLQkJfQotCi0JCWFmZWN0cmxvdnJfcnNzaV9tYXNrID0gKCgweDEgPDwgMTIpIHwgKDB4MSA8PCAxMykpOwotCQlhZmVjdHJsb3ZyX3Jzc2lfdmFsID0gKGFmZWN0cmxvdnJfcnNzaV92YWwgPDwKLQkJCQkgICAgICAgMTIpIHwgKGFmZWN0cmxvdnJfcnNzaV92YWwgPDwgMTMpOwotCQltb2RfcGh5X3JlZyhwaSwgMHhhNSwgYWZlY3RybG92cl9yc3NpX21hc2ssCi0JCQkgICAgYWZlY3RybG92cl9yc3NpX3ZhbCk7Ci0KLQkJaWYgKChyc3NpX3R5cGUgPT0gTlBIWV9SU1NJX1NFTF9XMSkgfHwKLQkJICAgIChyc3NpX3R5cGUgPT0gTlBIWV9SU1NJX1NFTF9XMikgfHwKLQkJICAgIChyc3NpX3R5cGUgPT0gTlBIWV9SU1NJX1NFTF9OQikpIHsKLQkJCXJmY3RybGNtZF9tYXNrID0gKCgweDEgPDwgOCkgfCAoMHg3IDw8IDMpKTsKLQkJCXJmY3RybGNtZF92YWwgPSAocmZjdHJsY21kX3J4ZW5fdmFsIDw8IDgpIHwKLQkJCSAgICAocmZjdHJsY21kX2NvcmVzZWxfdmFsIDw8IDMpOwotCi0JCQlyZmN0cmxvdnJfbWFzayA9ICgoMHgxIDw8IDUpIHwKLQkJCQkJICAoMHgxIDw8IDEyKSB8Ci0JCQkJCSAgKDB4MSA8PCAxKSB8ICgweDEgPDwgMCkpOwotCQkJcmZjdHJsb3ZyX3ZhbCA9IChyZmN0cmxvdnJfcnNzaV92YWwgPDwKLQkJCQkJIDUpIHwKLQkJCSAgICAocmZjdHJsb3ZyX3J4ZW5fdmFsIDw8IDEyKSB8Ci0JCQkgICAgKHJmY3RybG92cl9jb3Jlc2VsX3ZhbCA8PCAxKSB8Ci0JCQkgICAgKHJmY3RybG92cl90cmlnZ2VyX3ZhbCA8PCAwKTsKLQotCQkJbW9kX3BoeV9yZWcocGksIDB4NzgsIHJmY3RybGNtZF9tYXNrLCByZmN0cmxjbWRfdmFsKTsKLQkJCW1vZF9waHlfcmVnKHBpLCAweGVjLCByZmN0cmxvdnJfbWFzaywgcmZjdHJsb3ZyX3ZhbCk7Ci0KLQkJCW1vZF9waHlfcmVnKHBpLCAweDc4LCAoMHgxIDw8IDApLCAoc3RhcnRzZXEgPDwgMCkpOwotCQkJdWRlbGF5KDIwKTsKLQotCQkJbW9kX3BoeV9yZWcocGksIDB4ZWMsICgweDEgPDwgMCksIDApOwotCQl9Ci0JfQotfQotCi1pbnQKLXdsY19waHlfcG9sbF9yc3NpX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHU4IHJzc2lfdHlwZSwgczMyICpyc3NpX2J1ZiwKLQkJICAgICAgIHU4IG5zYW1wcykKLXsKLQlzMTYgcnNzaTAsIHJzc2kxOwotCXUxNiBhZmVjdHJsQ29yZTFfc2F2ZSA9IDA7Ci0JdTE2IGFmZWN0cmxDb3JlMl9zYXZlID0gMDsKLQl1MTYgYWZlY3RybE92ZXJyaWRlMV9zYXZlID0gMDsKLQl1MTYgYWZlY3RybE92ZXJyaWRlMl9zYXZlID0gMDsKLQl1MTYgcmZjdHJsT3ZlcnJpZGVBdXgwX3NhdmUgPSAwOwotCXUxNiByZmN0cmxPdmVycmlkZUF1eDFfc2F2ZSA9IDA7Ci0JdTE2IHJmY3RybE1pc2NSZWcxX3NhdmUgPSAwOwotCXUxNiByZmN0cmxNaXNjUmVnMl9zYXZlID0gMDsKLQl1MTYgcmZjdHJsY21kX3NhdmUgPSAwOwotCXUxNiByZmN0cmxvdmVycmlkZV9zYXZlID0gMDsKLQl1MTYgcmZjdHJscnNzaW90aGVyczFfc2F2ZSA9IDA7Ci0JdTE2IHJmY3RybHJzc2lvdGhlcnMyX3NhdmUgPSAwOwotCXM4IHRtcF9idWZbNF07Ci0JdTggY3RyID0gMCwgc2FtcCA9IDA7Ci0JczMyIHJzc2lfb3V0X3ZhbDsKLQl1MTYgZ3Bpb3NlbF9vcmlnOwotCi0JYWZlY3RybENvcmUxX3NhdmUgPSByZWFkX3BoeV9yZWcocGksIDB4YTYpOwotCWFmZWN0cmxDb3JlMl9zYXZlID0gcmVhZF9waHlfcmVnKHBpLCAweGE3KTsKLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJcmZjdHJsTWlzY1JlZzFfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHhmOSk7Ci0JCXJmY3RybE1pc2NSZWcyX3NhdmUgPSByZWFkX3BoeV9yZWcocGksIDB4ZmIpOwotCQlhZmVjdHJsT3ZlcnJpZGUxX3NhdmUgPSByZWFkX3BoeV9yZWcocGksIDB4OGYpOwotCQlhZmVjdHJsT3ZlcnJpZGUyX3NhdmUgPSByZWFkX3BoeV9yZWcocGksIDB4YTUpOwotCQlyZmN0cmxPdmVycmlkZUF1eDBfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHhlNSk7Ci0JCXJmY3RybE92ZXJyaWRlQXV4MV9zYXZlID0gcmVhZF9waHlfcmVnKHBpLCAweGU2KTsKLQl9IGVsc2UgewotCQlhZmVjdHJsT3ZlcnJpZGUxX3NhdmUgPSByZWFkX3BoeV9yZWcocGksIDB4YTUpOwotCQlyZmN0cmxjbWRfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHg3OCk7Ci0JCXJmY3RybG92ZXJyaWRlX3NhdmUgPSByZWFkX3BoeV9yZWcocGksIDB4ZWMpOwotCQlyZmN0cmxyc3Npb3RoZXJzMV9zYXZlID0gcmVhZF9waHlfcmVnKHBpLCAweDdhKTsKLQkJcmZjdHJscnNzaW90aGVyczJfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHg3ZCk7Ci0JfQotCi0Jd2xjX3BoeV9yc3Npc2VsX25waHkocGksIFJBRElPX01JTU9fQ09SRVNFTF9BTExSWCwgcnNzaV90eXBlKTsKLQotCWdwaW9zZWxfb3JpZyA9IHJlYWRfcGh5X3JlZyhwaSwgMHhjYSk7Ci0JaWYgKE5SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDIpKSB7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4Y2EsIDUpOwotCX0KLQotCWZvciAoY3RyID0gMDsgY3RyIDwgNDsgY3RyKyspIHsKLQkJcnNzaV9idWZbY3RyXSA9IDA7Ci0JfQotCi0JZm9yIChzYW1wID0gMDsgc2FtcCA8IG5zYW1wczsgc2FtcCsrKSB7Ci0JCWlmIChOUkVWX0xUKHBpLT5wdWJwaS5waHlfcmV2LCAyKSkgewotCQkJcnNzaTAgPSByZWFkX3BoeV9yZWcocGksIDB4MWM5KTsKLQkJCXJzc2kxID0gcmVhZF9waHlfcmVnKHBpLCAweDFjYSk7Ci0JCX0gZWxzZSB7Ci0JCQlyc3NpMCA9IHJlYWRfcGh5X3JlZyhwaSwgMHgyMTkpOwotCQkJcnNzaTEgPSByZWFkX3BoeV9yZWcocGksIDB4MjFhKTsKLQkJfQotCi0JCWN0ciA9IDA7Ci0JCXRtcF9idWZbY3RyKytdID0gKChzOCkgKChyc3NpMCAmIDB4M2YpIDw8IDIpKSA+PiAyOwotCQl0bXBfYnVmW2N0cisrXSA9ICgoczgpICgoKHJzc2kwID4+IDgpICYgMHgzZikgPDwgMikpID4+IDI7Ci0JCXRtcF9idWZbY3RyKytdID0gKChzOCkgKChyc3NpMSAmIDB4M2YpIDw8IDIpKSA+PiAyOwotCQl0bXBfYnVmW2N0cisrXSA9ICgoczgpICgoKHJzc2kxID4+IDgpICYgMHgzZikgPDwgMikpID4+IDI7Ci0KLQkJZm9yIChjdHIgPSAwOyBjdHIgPCA0OyBjdHIrKykgewotCQkJcnNzaV9idWZbY3RyXSArPSB0bXBfYnVmW2N0cl07Ci0JCX0KLQotCX0KLQotCXJzc2lfb3V0X3ZhbCA9IHJzc2lfYnVmWzNdICYgMHhmZjsKLQlyc3NpX291dF92YWwgfD0gKHJzc2lfYnVmWzJdICYgMHhmZikgPDwgODsKLQlyc3NpX291dF92YWwgfD0gKHJzc2lfYnVmWzFdICYgMHhmZikgPDwgMTY7Ci0JcnNzaV9vdXRfdmFsIHw9IChyc3NpX2J1ZlswXSAmIDB4ZmYpIDw8IDI0OwotCi0JaWYgKE5SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDIpKSB7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4Y2EsIGdwaW9zZWxfb3JpZyk7Ci0JfQotCi0Jd3JpdGVfcGh5X3JlZyhwaSwgMHhhNiwgYWZlY3RybENvcmUxX3NhdmUpOwotCXdyaXRlX3BoeV9yZWcocGksIDB4YTcsIGFmZWN0cmxDb3JlMl9zYXZlKTsKLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHhmOSwgcmZjdHJsTWlzY1JlZzFfc2F2ZSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4ZmIsIHJmY3RybE1pc2NSZWcyX3NhdmUpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDhmLCBhZmVjdHJsT3ZlcnJpZGUxX3NhdmUpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweGE1LCBhZmVjdHJsT3ZlcnJpZGUyX3NhdmUpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweGU1LCByZmN0cmxPdmVycmlkZUF1eDBfc2F2ZSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4ZTYsIHJmY3RybE92ZXJyaWRlQXV4MV9zYXZlKTsKLQl9IGVsc2UgewotCQl3cml0ZV9waHlfcmVnKHBpLCAweGE1LCBhZmVjdHJsT3ZlcnJpZGUxX3NhdmUpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDc4LCByZmN0cmxjbWRfc2F2ZSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4ZWMsIHJmY3RybG92ZXJyaWRlX3NhdmUpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDdhLCByZmN0cmxyc3Npb3RoZXJzMV9zYXZlKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg3ZCwgcmZjdHJscnNzaW90aGVyczJfc2F2ZSk7Ci0JfQotCi0JcmV0dXJuIHJzc2lfb3V0X3ZhbDsKLX0KLQotczE2IHdsY19waHlfdGVtcHNlbnNlX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JdTE2IGNvcmUxX3R4cmZfaXFjYWwxX3NhdmUsIGNvcmUxX3R4cmZfaXFjYWwyX3NhdmU7Ci0JdTE2IGNvcmUyX3R4cmZfaXFjYWwxX3NhdmUsIGNvcmUyX3R4cmZfaXFjYWwyX3NhdmU7Ci0JdTE2IHB3cmRldF9yeHR4X2NvcmUxX3NhdmU7Ci0JdTE2IHB3cmRldF9yeHR4X2NvcmUyX3NhdmU7Ci0JdTE2IGFmZWN0cmxDb3JlMV9zYXZlOwotCXUxNiBhZmVjdHJsQ29yZTJfc2F2ZTsKLQl1MTYgYWZlY3RybE92ZXJyaWRlX3NhdmU7Ci0JdTE2IGFmZWN0cmxPdmVycmlkZTJfc2F2ZTsKLQl1MTYgcGRfcGxsX3RzX3NhdmU7Ci0JdTE2IGdwaW9TZWxfc2F2ZTsKLQlzMzIgcmFkaW9fdGVtcFs0XTsKLQlzMzIgcmFkaW9fdGVtcDJbNF07Ci0JdTE2IHN5bl90ZW1wcHJvY3NlbnNlX3NhdmU7Ci0JczE2IG9mZnNldCA9IDA7Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQkJdTE2IGF1eEFEQ19WbWlkLCBhdXhBRENfQXYsIGF1eEFEQ19WbWlkX3NhdmUsIGF1eEFEQ19Bdl9zYXZlOwotCQl1MTYgYXV4QURDX3Jzc2lfY3RybExfc2F2ZSwgYXV4QURDX3Jzc2lfY3RybEhfc2F2ZTsKLQkJdTE2IGF1eEFEQ19yc3NpX2N0cmxMLCBhdXhBRENfcnNzaV9jdHJsSDsKLQkJczMyIGF1eEFEQ19WbDsKLQkJdTE2IFJmY3RybE92ZXJyaWRlNV9zYXZlLCBSZmN0cmxPdmVycmlkZTZfc2F2ZTsKLQkJdTE2IFJmY3RybE1pc2NSZWc1X3NhdmUsIFJmY3RybE1pc2NSZWc2X3NhdmU7Ci0JCXUxNiBSU1NJTXVsdENvZWYwUVBvd2VyRGV0X3NhdmU7Ci0JCXUxNiB0ZW1wc2Vuc2VfUmNhbDsKLQotCQlzeW5fdGVtcHByb2NzZW5zZV9zYXZlID0KLQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1RFTVBTRU5TRV9DT05GSUcpOwotCi0JCWFmZWN0cmxDb3JlMV9zYXZlID0gcmVhZF9waHlfcmVnKHBpLCAweGE2KTsKLQkJYWZlY3RybENvcmUyX3NhdmUgPSByZWFkX3BoeV9yZWcocGksIDB4YTcpOwotCQlhZmVjdHJsT3ZlcnJpZGVfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHg4Zik7Ci0JCWFmZWN0cmxPdmVycmlkZTJfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHhhNSk7Ci0JCVJTU0lNdWx0Q29lZjBRUG93ZXJEZXRfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHgxYWUpOwotCQlSZmN0cmxPdmVycmlkZTVfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHgzNDYpOwotCQlSZmN0cmxPdmVycmlkZTZfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHgzNDcpOwotCQlSZmN0cmxNaXNjUmVnNV9zYXZlID0gcmVhZF9waHlfcmVnKHBpLCAweDM0NCk7Ci0JCVJmY3RybE1pc2NSZWc2X3NhdmUgPSByZWFkX3BoeV9yZWcocGksIDB4MzQ1KTsKLQotCQl3bGNfcGh5X3RhYmxlX3JlYWRfbnBoeShwaSwgTlBIWV9UQkxfSURfQUZFQ1RSTCwgMSwgMHgwQSwgMTYsCi0JCQkJCSZhdXhBRENfVm1pZF9zYXZlKTsKLQkJd2xjX3BoeV90YWJsZV9yZWFkX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDEsIDB4MEUsIDE2LAotCQkJCQkmYXV4QURDX0F2X3NhdmUpOwotCQl3bGNfcGh5X3RhYmxlX3JlYWRfbnBoeShwaSwgTlBIWV9UQkxfSURfQUZFQ1RSTCwgMSwgMHgwMiwgMTYsCi0JCQkJCSZhdXhBRENfcnNzaV9jdHJsTF9zYXZlKTsKLQkJd2xjX3BoeV90YWJsZV9yZWFkX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDEsIDB4MDMsIDE2LAotCQkJCQkmYXV4QURDX3Jzc2lfY3RybEhfc2F2ZSk7Ci0KLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxYWUsIDB4MCk7Ci0KLQkJYXV4QURDX3Jzc2lfY3RybEwgPSAweDA7Ci0JCWF1eEFEQ19yc3NpX2N0cmxIID0gMHgyMDsKLQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9BRkVDVFJMLCAxLCAweDAyLCAxNiwKLQkJCQkJICZhdXhBRENfcnNzaV9jdHJsTCk7Ci0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQUZFQ1RSTCwgMSwgMHgwMywgMTYsCi0JCQkJCSAmYXV4QURDX3Jzc2lfY3RybEgpOwotCi0JCXRlbXBzZW5zZV9SY2FsID0gc3luX3RlbXBwcm9jc2Vuc2Vfc2F2ZSAmIDB4MWM7Ci0KLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1RFTVBTRU5TRV9DT05GSUcsCi0JCQkJdGVtcHNlbnNlX1JjYWwgfCAweDAxKTsKLQotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksICgweDEgPDwgMSksCi0JCQkJCQkgIDEsIDAsIDAsCi0JCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDIpOwotCQltb2RfcGh5X3JlZyhwaSwgMHhhNiwgKDB4MSA8PCA3KSwgMCk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweGE3LCAoMHgxIDw8IDcpLCAwKTsKLQkJbW9kX3BoeV9yZWcocGksIDB4OGYsICgweDEgPDwgNyksICgweDEgPDwgNykpOwotCQltb2RfcGh5X3JlZyhwaSwgMHhhNSwgKDB4MSA8PCA3KSwgKDB4MSA8PCA3KSk7Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4YTYsICgweDEgPDwgMiksICgweDEgPDwgMikpOwotCQltb2RfcGh5X3JlZyhwaSwgMHhhNywgKDB4MSA8PCAyKSwgKDB4MSA8PCAyKSk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDhmLCAoMHgxIDw8IDIpLCAoMHgxIDw8IDIpKTsKLQkJbW9kX3BoeV9yZWcocGksIDB4YTUsICgweDEgPDwgMiksICgweDEgPDwgMikpOwotCQl1ZGVsYXkoNSk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweGE2LCAoMHgxIDw8IDIpLCAwKTsKLQkJbW9kX3BoeV9yZWcocGksIDB4YTcsICgweDEgPDwgMiksIDApOwotCQltb2RfcGh5X3JlZyhwaSwgMHhhNiwgKDB4MSA8PCAzKSwgMCk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweGE3LCAoMHgxIDw8IDMpLCAwKTsKLQkJbW9kX3BoeV9yZWcocGksIDB4OGYsICgweDEgPDwgMyksICgweDEgPDwgMykpOwotCQltb2RfcGh5X3JlZyhwaSwgMHhhNSwgKDB4MSA8PCAzKSwgKDB4MSA8PCAzKSk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweGE2LCAoMHgxIDw8IDYpLCAwKTsKLQkJbW9kX3BoeV9yZWcocGksIDB4YTcsICgweDEgPDwgNiksIDApOwotCQltb2RfcGh5X3JlZyhwaSwgMHg4ZiwgKDB4MSA8PCA2KSwgKDB4MSA8PCA2KSk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweGE1LCAoMHgxIDw8IDYpLCAoMHgxIDw8IDYpKTsKLQotCQlhdXhBRENfVm1pZCA9IDB4QTM7Ci0JCWF1eEFEQ19BdiA9IDB4MDsKLQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9BRkVDVFJMLCAxLCAweDBBLCAxNiwKLQkJCQkJICZhdXhBRENfVm1pZCk7Ci0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQUZFQ1RSTCwgMSwgMHgwRSwgMTYsCi0JCQkJCSAmYXV4QURDX0F2KTsKLQotCQl1ZGVsYXkoMyk7Ci0KLQkJd2xjX3BoeV9wb2xsX3Jzc2lfbnBoeShwaSwgTlBIWV9SU1NJX1NFTF9JUSwgcmFkaW9fdGVtcCwgMSk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19URU1QU0VOU0VfQ09ORklHLAotCQkJCXRlbXBzZW5zZV9SY2FsIHwgMHgwMyk7Ci0KLQkJdWRlbGF5KDUpOwotCQl3bGNfcGh5X3BvbGxfcnNzaV9ucGh5KHBpLCBOUEhZX1JTU0lfU0VMX0lRLCByYWRpb190ZW1wMiwgMSk7Ci0KLQkJYXV4QURDX0F2ID0gMHg3OwotCQlpZiAocmFkaW9fdGVtcFsxXSArIHJhZGlvX3RlbXAyWzFdIDwgLTMwKSB7Ci0JCQlhdXhBRENfVm1pZCA9IDB4NDU7Ci0JCQlhdXhBRENfVmwgPSAyNjM7Ci0JCX0gZWxzZSBpZiAocmFkaW9fdGVtcFsxXSArIHJhZGlvX3RlbXAyWzFdIDwgLTkpIHsKLQkJCWF1eEFEQ19WbWlkID0gMHgyMDA7Ci0JCQlhdXhBRENfVmwgPSA0Njc7Ci0JCX0gZWxzZSBpZiAocmFkaW9fdGVtcFsxXSArIHJhZGlvX3RlbXAyWzFdIDwgMTEpIHsKLQkJCWF1eEFEQ19WbWlkID0gMHgyNjY7Ci0JCQlhdXhBRENfVmwgPSA2MzQ7Ci0JCX0gZWxzZSB7Ci0JCQlhdXhBRENfVm1pZCA9IDB4MkQ1OwotCQkJYXV4QURDX1ZsID0gODE2OwotCQl9Ci0KLQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9BRkVDVFJMLCAxLCAweDBBLCAxNiwKLQkJCQkJICZhdXhBRENfVm1pZCk7Ci0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQUZFQ1RSTCwgMSwgMHgwRSwgMTYsCi0JCQkJCSAmYXV4QURDX0F2KTsKLQotCQl1ZGVsYXkoMyk7Ci0KLQkJd2xjX3BoeV9wb2xsX3Jzc2lfbnBoeShwaSwgTlBIWV9SU1NJX1NFTF9JUSwgcmFkaW9fdGVtcDIsIDEpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfVEVNUFNFTlNFX0NPTkZJRywKLQkJCQl0ZW1wc2Vuc2VfUmNhbCB8IDB4MDEpOwotCi0JCXVkZWxheSg1KTsKLQkJd2xjX3BoeV9wb2xsX3Jzc2lfbnBoeShwaSwgTlBIWV9SU1NJX1NFTF9JUSwgcmFkaW9fdGVtcCwgMSk7Ci0KLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X1RFTVBTRU5TRV9DT05GSUcsCi0JCQkJc3luX3RlbXBwcm9jc2Vuc2Vfc2F2ZSk7Ci0KLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHhhNiwgYWZlY3RybENvcmUxX3NhdmUpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweGE3LCBhZmVjdHJsQ29yZTJfc2F2ZSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4OGYsIGFmZWN0cmxPdmVycmlkZV9zYXZlKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHhhNSwgYWZlY3RybE92ZXJyaWRlMl9zYXZlKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxYWUsIFJTU0lNdWx0Q29lZjBRUG93ZXJEZXRfc2F2ZSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MzQ2LCBSZmN0cmxPdmVycmlkZTVfc2F2ZSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MzQ3LCBSZmN0cmxPdmVycmlkZTZfc2F2ZSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MzQ0LCBSZmN0cmxNaXNjUmVnNV9zYXZlKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgzNDUsIFJmY3RybE1pc2NSZWc1X3NhdmUpOwotCi0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQUZFQ1RSTCwgMSwgMHgwQSwgMTYsCi0JCQkJCSAmYXV4QURDX1ZtaWRfc2F2ZSk7Ci0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQUZFQ1RSTCwgMSwgMHgwRSwgMTYsCi0JCQkJCSAmYXV4QURDX0F2X3NhdmUpOwotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDEsIDB4MDIsIDE2LAotCQkJCQkgJmF1eEFEQ19yc3NpX2N0cmxMX3NhdmUpOwotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDEsIDB4MDMsIDE2LAotCQkJCQkgJmF1eEFEQ19yc3NpX2N0cmxIX3NhdmUpOwotCi0JCXJhZGlvX3RlbXBbMF0gPSAoMTc5ICogKHJhZGlvX3RlbXBbMV0gKyByYWRpb190ZW1wMlsxXSkKLQkJCQkgKyA4MiAqIChhdXhBRENfVmwpIC0gMjg4NjEgKwotCQkJCSAxMjgpIC8gMjU2OwotCi0JCW9mZnNldCA9IChzMTYpIHBpLT5waHlfdGVtcHNlbnNlX29mZnNldDsKLQotCX0gZWxzZSBpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJc3luX3RlbXBwcm9jc2Vuc2Vfc2F2ZSA9Ci0JCSAgICByZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9TWU5fVEVNUFBST0NTRU5TRSk7Ci0KLQkJYWZlY3RybENvcmUxX3NhdmUgPSByZWFkX3BoeV9yZWcocGksIDB4YTYpOwotCQlhZmVjdHJsQ29yZTJfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHhhNyk7Ci0JCWFmZWN0cmxPdmVycmlkZV9zYXZlID0gcmVhZF9waHlfcmVnKHBpLCAweDhmKTsKLQkJYWZlY3RybE92ZXJyaWRlMl9zYXZlID0gcmVhZF9waHlfcmVnKHBpLCAweGE1KTsKLQkJZ3Bpb1NlbF9zYXZlID0gcmVhZF9waHlfcmVnKHBpLCAweGNhKTsKLQotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfU1lOX1RFTVBQUk9DU0VOU0UsIDB4MDEpOwotCi0JCXdsY19waHlfcG9sbF9yc3NpX25waHkocGksIE5QSFlfUlNTSV9TRUxfSVEsIHJhZGlvX3RlbXAsIDEpOwotCQlpZiAoTlJFVl9MVChwaS0+cHVicGkucGh5X3JldiwgNykpCi0JCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfU1lOX1RFTVBQUk9DU0VOU0UsIDB4MDUpOwotCi0JCXdsY19waHlfcG9sbF9yc3NpX25waHkocGksIE5QSFlfUlNTSV9TRUxfSVEsIHJhZGlvX3RlbXAyLCAxKTsKLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfVEVNUFNFTlNFX0NPTkZJRywgMHgwMSk7Ci0JCX0gZWxzZSB7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfU1lOX1RFTVBQUk9DU0VOU0UsIDB4MDEpOwotCQl9Ci0KLQkJcmFkaW9fdGVtcFswXSA9Ci0JCSAgICAoMTI2ICogKHJhZGlvX3RlbXBbMV0gKyByYWRpb190ZW1wMlsxXSkgKyAzOTg3KSAvIDY0OwotCi0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9TWU5fVEVNUFBST0NTRU5TRSwKLQkJCQlzeW5fdGVtcHByb2NzZW5zZV9zYXZlKTsKLQotCQl3cml0ZV9waHlfcmVnKHBpLCAweGNhLCBncGlvU2VsX3NhdmUpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweGE2LCBhZmVjdHJsQ29yZTFfc2F2ZSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4YTcsIGFmZWN0cmxDb3JlMl9zYXZlKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg4ZiwgYWZlY3RybE92ZXJyaWRlX3NhdmUpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweGE1LCBhZmVjdHJsT3ZlcnJpZGUyX3NhdmUpOwotCi0JCW9mZnNldCA9IChzMTYpIHBpLT5waHlfdGVtcHNlbnNlX29mZnNldDsKLQl9IGVsc2UgewotCi0JCXB3cmRldF9yeHR4X2NvcmUxX3NhdmUgPQotCQkgICAgcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfUFdSREVUX1JYVFhfQ09SRTEpOwotCQlwd3JkZXRfcnh0eF9jb3JlMl9zYXZlID0KLQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X1BXUkRFVF9SWFRYX0NPUkUyKTsKLQkJY29yZTFfdHhyZl9pcWNhbDFfc2F2ZSA9Ci0JCSAgICByZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMV9UWFJGX0lRQ0FMMSk7Ci0JCWNvcmUxX3R4cmZfaXFjYWwyX3NhdmUgPQotCQkgICAgcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTFfVFhSRl9JUUNBTDIpOwotCQljb3JlMl90eHJmX2lxY2FsMV9zYXZlID0KLQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUyX1RYUkZfSVFDQUwxKTsKLQkJY29yZTJfdHhyZl9pcWNhbDJfc2F2ZSA9Ci0JCSAgICByZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMl9UWFJGX0lRQ0FMMik7Ci0JCXBkX3BsbF90c19zYXZlID0gcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfUERfUExMX1RTKTsKLQotCQlhZmVjdHJsQ29yZTFfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHhhNik7Ci0JCWFmZWN0cmxDb3JlMl9zYXZlID0gcmVhZF9waHlfcmVnKHBpLCAweGE3KTsKLQkJYWZlY3RybE92ZXJyaWRlX3NhdmUgPSByZWFkX3BoeV9yZWcocGksIDB4YTUpOwotCQlncGlvU2VsX3NhdmUgPSByZWFkX3BoeV9yZWcocGksIDB4Y2EpOwotCi0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMV9UWFJGX0lRQ0FMMSwgMHgwMSk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMl9UWFJGX0lRQ0FMMSwgMHgwMSk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMV9UWFJGX0lRQ0FMMiwgMHgwOCk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMl9UWFJGX0lRQ0FMMiwgMHgwOCk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9QV1JERVRfUlhUWF9DT1JFMSwgMHgwNCk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9QV1JERVRfUlhUWF9DT1JFMiwgMHgwNCk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9QRF9QTExfVFMsIDB4MDApOwotCi0JCXdsY19waHlfcG9sbF9yc3NpX25waHkocGksIE5QSFlfUlNTSV9TRUxfSVEsIHJhZGlvX3RlbXAsIDEpOwotCQl4b3JfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NBTF9UUywgMHg4MCk7Ci0KLQkJd2xjX3BoeV9wb2xsX3Jzc2lfbnBoeShwaSwgTlBIWV9SU1NJX1NFTF9JUSwgcmFkaW9fdGVtcCwgMSk7Ci0JCXhvcl9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ0FMX1RTLCAweDgwKTsKLQotCQl3bGNfcGh5X3BvbGxfcnNzaV9ucGh5KHBpLCBOUEhZX1JTU0lfU0VMX0lRLCByYWRpb190ZW1wMiwgMSk7Ci0JCXhvcl9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ0FMX1RTLCAweDgwKTsKLQotCQlyYWRpb190ZW1wWzBdID0gKHJhZGlvX3RlbXBbMF0gKyByYWRpb190ZW1wMlswXSk7Ci0JCXJhZGlvX3RlbXBbMV0gPSAocmFkaW9fdGVtcFsxXSArIHJhZGlvX3RlbXAyWzFdKTsKLQkJcmFkaW9fdGVtcFsyXSA9IChyYWRpb190ZW1wWzJdICsgcmFkaW9fdGVtcDJbMl0pOwotCQlyYWRpb190ZW1wWzNdID0gKHJhZGlvX3RlbXBbM10gKyByYWRpb190ZW1wMlszXSk7Ci0KLQkJcmFkaW9fdGVtcFswXSA9Ci0JCSAgICAocmFkaW9fdGVtcFswXSArIHJhZGlvX3RlbXBbMV0gKyByYWRpb190ZW1wWzJdICsKLQkJICAgICByYWRpb190ZW1wWzNdKTsKLQotCQlyYWRpb190ZW1wWzBdID0KLQkJICAgIChyYWRpb190ZW1wWzBdICsgKDggKiAzMikpICogKDk1MCAtIDM1MCkgLyA2MyArICgzNTAgKiA4KTsKLQotCQlyYWRpb190ZW1wWzBdID0gKHJhZGlvX3RlbXBbMF0gLSAoOCAqIDQyMCkpIC8gMzg7Ci0KLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X1BXUkRFVF9SWFRYX0NPUkUxLAotCQkJCXB3cmRldF9yeHR4X2NvcmUxX3NhdmUpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfUFdSREVUX1JYVFhfQ09SRTIsCi0JCQkJcHdyZGV0X3J4dHhfY29yZTJfc2F2ZSk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMV9UWFJGX0lRQ0FMMSwKLQkJCQljb3JlMV90eHJmX2lxY2FsMV9zYXZlKTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUyX1RYUkZfSVFDQUwxLAotCQkJCWNvcmUyX3R4cmZfaXFjYWwxX3NhdmUpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTFfVFhSRl9JUUNBTDIsCi0JCQkJY29yZTFfdHhyZl9pcWNhbDJfc2F2ZSk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMl9UWFJGX0lRQ0FMMiwKLQkJCQljb3JlMl90eHJmX2lxY2FsMl9zYXZlKTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X1BEX1BMTF9UUywgcGRfcGxsX3RzX3NhdmUpOwotCi0JCXdyaXRlX3BoeV9yZWcocGksIDB4Y2EsIGdwaW9TZWxfc2F2ZSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4YTYsIGFmZWN0cmxDb3JlMV9zYXZlKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHhhNywgYWZlY3RybENvcmUyX3NhdmUpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweGE1LCBhZmVjdHJsT3ZlcnJpZGVfc2F2ZSk7Ci0JfQotCi0JcmV0dXJuIChzMTYpIHJhZGlvX3RlbXBbMF0gKyBvZmZzZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi13bGNfcGh5X3NldF9yc3NpXzIwNTVfdmNtKHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCByc3NpX3R5cGUsIHU4ICp2Y21fYnVmKQotewotCXU4IGNvcmU7Ci0KLQlmb3IgKGNvcmUgPSAwOyBjb3JlIDwgcGktPnB1YnBpLnBoeV9jb3JlbnVtOyBjb3JlKyspIHsKLQkJaWYgKHJzc2lfdHlwZSA9PSBOUEhZX1JTU0lfU0VMX05CKSB7Ci0JCQlpZiAoY29yZSA9PSBQSFlfQ09SRV8wKSB7Ci0JCQkJbW9kX3JhZGlvX3JlZyhwaSwKLQkJCQkJICAgICAgUkFESU9fMjA1NV9DT1JFMV9CMF9OQlJTU0lfVkNNLAotCQkJCQkgICAgICBSQURJT18yMDU1X05CUlNTSV9WQ01fSV9NQVNLLAotCQkJCQkgICAgICB2Y21fYnVmWzIgKgotCQkJCQkJICAgICAgY29yZV0gPDwKLQkJCQkJICAgICAgUkFESU9fMjA1NV9OQlJTU0lfVkNNX0lfU0hJRlQpOwotCQkJCW1vZF9yYWRpb19yZWcocGksCi0JCQkJCSAgICAgIFJBRElPXzIwNTVfQ09SRTFfUlhCQl9SU1NJX0NUUkw1LAotCQkJCQkgICAgICBSQURJT18yMDU1X05CUlNTSV9WQ01fUV9NQVNLLAotCQkJCQkgICAgICB2Y21fYnVmWzIgKiBjb3JlICsKLQkJCQkJCSAgICAgIDFdIDw8Ci0JCQkJCSAgICAgIFJBRElPXzIwNTVfTkJSU1NJX1ZDTV9RX1NISUZUKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbW9kX3JhZGlvX3JlZyhwaSwKLQkJCQkJICAgICAgUkFESU9fMjA1NV9DT1JFMl9CMF9OQlJTU0lfVkNNLAotCQkJCQkgICAgICBSQURJT18yMDU1X05CUlNTSV9WQ01fSV9NQVNLLAotCQkJCQkgICAgICB2Y21fYnVmWzIgKgotCQkJCQkJICAgICAgY29yZV0gPDwKLQkJCQkJICAgICAgUkFESU9fMjA1NV9OQlJTU0lfVkNNX0lfU0hJRlQpOwotCQkJCW1vZF9yYWRpb19yZWcocGksCi0JCQkJCSAgICAgIFJBRElPXzIwNTVfQ09SRTJfUlhCQl9SU1NJX0NUUkw1LAotCQkJCQkgICAgICBSQURJT18yMDU1X05CUlNTSV9WQ01fUV9NQVNLLAotCQkJCQkgICAgICB2Y21fYnVmWzIgKiBjb3JlICsKLQkJCQkJCSAgICAgIDFdIDw8Ci0JCQkJCSAgICAgIFJBRElPXzIwNTVfTkJSU1NJX1ZDTV9RX1NISUZUKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQotCQkJaWYgKGNvcmUgPT0gUEhZX0NPUkVfMCkgewotCQkJCW1vZF9yYWRpb19yZWcocGksCi0JCQkJCSAgICAgIFJBRElPXzIwNTVfQ09SRTFfUlhCQl9SU1NJX0NUUkw1LAotCQkJCQkgICAgICBSQURJT18yMDU1X1dCUlNTSV9WQ01fSVFfTUFTSywKLQkJCQkJICAgICAgdmNtX2J1ZlsyICoKLQkJCQkJCSAgICAgIGNvcmVdIDw8Ci0JCQkJCSAgICAgIFJBRElPXzIwNTVfV0JSU1NJX1ZDTV9JUV9TSElGVCk7Ci0JCQl9IGVsc2UgewotCQkJCW1vZF9yYWRpb19yZWcocGksCi0JCQkJCSAgICAgIFJBRElPXzIwNTVfQ09SRTJfUlhCQl9SU1NJX0NUUkw1LAotCQkJCQkgICAgICBSQURJT18yMDU1X1dCUlNTSV9WQ01fSVFfTUFTSywKLQkJCQkJICAgICAgdmNtX2J1ZlsyICoKLQkJCQkJCSAgICAgIGNvcmVdIDw8Ci0JCQkJCSAgICAgIFJBRElPXzIwNTVfV0JSU1NJX1ZDTV9JUV9TSElGVCk7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgd2xjX3BoeV9yc3NpX2NhbF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCi0JCXdsY19waHlfcnNzaV9jYWxfbnBoeV9yZXYzKHBpKTsKLQl9IGVsc2UgewotCQl3bGNfcGh5X3Jzc2lfY2FsX25waHlfcmV2MihwaSwgTlBIWV9SU1NJX1NFTF9OQik7Ci0JCXdsY19waHlfcnNzaV9jYWxfbnBoeV9yZXYyKHBpLCBOUEhZX1JTU0lfU0VMX1cxKTsKLQkJd2xjX3BoeV9yc3NpX2NhbF9ucGh5X3JldjIocGksIE5QSFlfUlNTSV9TRUxfVzIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgd2xjX3BoeV9yc3NpX2NhbF9ucGh5X3JldjIoc3RydWN0IGJyY21zX3BoeSAqcGksIHU4IHJzc2lfdHlwZSkKLXsKLQlzMzIgdGFyZ2V0X2NvZGU7Ci0JdTE2IGNsYXNzaWZfc3RhdGU7Ci0JdTE2IGNsaXBfc3RhdGVbMl07Ci0JdTE2IHJzc2lfY3RybF9zdGF0ZVsyXSwgcGRfc3RhdGVbMl07Ci0JdTE2IHJmY3RybGludGNfc3RhdGVbMl0sIHJmcGRjb3Jlcnh0eF9zdGF0ZVsyXTsKLQl1MTYgcmZjdHJsaW50Y19vdmVycmlkZV92YWw7Ci0JdTE2IGNsaXBfb2ZmW10gPSB7IDB4ZmZmZiwgMHhmZmZmIH07Ci0JdTE2IHJmX3BkX3ZhbCwgcGRfbWFzaywgcnNzaV9jdHJsX21hc2s7Ci0JdTggdmNtLCBtaW5fdmNtLCB2Y21fdG1wWzRdOwotCXU4IHZjbV9maW5hbFs0XSA9IHsgMCwgMCwgMCwgMCB9OwotCXU4IHJlc3VsdF9pZHgsIGN0cjsKLQlzMzIgcG9sbF9yZXN1bHRzWzRdWzRdID0gewotCQl7MCwgMCwgMCwgMH0sCi0JCXswLCAwLCAwLCAwfSwKLQkJezAsIDAsIDAsIDB9LAotCQl7MCwgMCwgMCwgMH0KLQl9OwotCXMzMiBwb2xsX21pbmlxWzRdWzJdID0gewotCQl7MCwgMH0sCi0JCXswLCAwfSwKLQkJezAsIDB9LAotCQl7MCwgMH0KLQl9OwotCXMzMiBtaW5fZCwgY3Vycl9kOwotCXMzMiBmaW5lX2RpZ2l0YWxfb2Zmc2V0WzRdOwotCXMzMiBwb2xsX3Jlc3VsdHNfbWluWzRdID0geyAwLCAwLCAwLCAwIH07Ci0JczMyIG1pbl9wb2xsOwotCi0Jc3dpdGNoIChyc3NpX3R5cGUpIHsKLQljYXNlIE5QSFlfUlNTSV9TRUxfTkI6Ci0JCXRhcmdldF9jb2RlID0gTlBIWV9SU1NJQ0FMX05CX1RBUkdFVDsKLQkJYnJlYWs7Ci0JY2FzZSBOUEhZX1JTU0lfU0VMX1cxOgotCQl0YXJnZXRfY29kZSA9IE5QSFlfUlNTSUNBTF9XMV9UQVJHRVQ7Ci0JCWJyZWFrOwotCWNhc2UgTlBIWV9SU1NJX1NFTF9XMjoKLQkJdGFyZ2V0X2NvZGUgPSBOUEhZX1JTU0lDQUxfVzJfVEFSR0VUOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm47Ci0JCWJyZWFrOwotCX0KLQotCWNsYXNzaWZfc3RhdGUgPSB3bGNfcGh5X2NsYXNzaWZpZXJfbnBoeShwaSwgMCwgMCk7Ci0Jd2xjX3BoeV9jbGFzc2lmaWVyX25waHkocGksICgweDcgPDwgMCksIDQpOwotCXdsY19waHlfY2xpcF9kZXRfbnBoeShwaSwgMCwgY2xpcF9zdGF0ZSk7Ci0Jd2xjX3BoeV9jbGlwX2RldF9ucGh5KHBpLCAxLCBjbGlwX29mZik7Ci0KLQlyZl9wZF92YWwgPSAocnNzaV90eXBlID09IE5QSFlfUlNTSV9TRUxfTkIpID8gMHg2IDogMHg0OwotCXJmY3RybGludGNfb3ZlcnJpZGVfdmFsID0KLQkgICAgQ0hTUEVDX0lTNUcocGktPnJhZGlvX2NoYW5zcGVjKSA/IDB4MTQwIDogMHgxMTA7Ci0KLQlyZmN0cmxpbnRjX3N0YXRlWzBdID0gcmVhZF9waHlfcmVnKHBpLCAweDkxKTsKLQlyZnBkY29yZXJ4dHhfc3RhdGVbMF0gPSByZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9QRF9DT1JFMV9SWFRYKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDkxLCByZmN0cmxpbnRjX292ZXJyaWRlX3ZhbCk7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X1BEX0NPUkUxX1JYVFgsIHJmX3BkX3ZhbCk7Ci0KLQlyZmN0cmxpbnRjX3N0YXRlWzFdID0gcmVhZF9waHlfcmVnKHBpLCAweDkyKTsKLQlyZnBkY29yZXJ4dHhfc3RhdGVbMV0gPSByZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9QRF9DT1JFMl9SWFRYKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDkyLCByZmN0cmxpbnRjX292ZXJyaWRlX3ZhbCk7Ci0Jd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X1BEX0NPUkUyX1JYVFgsIHJmX3BkX3ZhbCk7Ci0KLQlwZF9tYXNrID0gUkFESU9fMjA1NV9OQlJTU0lfUEQgfCBSQURJT18yMDU1X1dCUlNTSV9HMV9QRCB8Ci0JICAgIFJBRElPXzIwNTVfV0JSU1NJX0cyX1BEOwotCXBkX3N0YXRlWzBdID0KLQkgICAgcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfUERfQ09SRTFfUlNTSV9NSVNDKSAmIHBkX21hc2s7Ci0JcGRfc3RhdGVbMV0gPQotCSAgICByZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9QRF9DT1JFMl9SU1NJX01JU0MpICYgcGRfbWFzazsKLQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X1BEX0NPUkUxX1JTU0lfTUlTQywgcGRfbWFzaywgMCk7Ci0JbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9QRF9DT1JFMl9SU1NJX01JU0MsIHBkX21hc2ssIDApOwotCXJzc2lfY3RybF9tYXNrID0gUkFESU9fMjA1NV9OQlJTU0lfU0VMIHwgUkFESU9fMjA1NV9XQlJTU0lfRzFfU0VMIHwKLQkgICAgUkFESU9fMjA1NV9XQlJTU0lfRzJfU0VMOwotCXJzc2lfY3RybF9zdGF0ZVswXSA9Ci0JICAgIHJlYWRfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X1NQX1JTU0lfQ09SRTEpICYgcnNzaV9jdHJsX21hc2s7Ci0JcnNzaV9jdHJsX3N0YXRlWzFdID0KLQkgICAgcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfU1BfUlNTSV9DT1JFMikgJiByc3NpX2N0cmxfbWFzazsKLQl3bGNfcGh5X3Jzc2lzZWxfbnBoeShwaSwgUkFESU9fTUlNT19DT1JFU0VMX0FMTFJYLCByc3NpX3R5cGUpOwotCi0Jd2xjX3BoeV9zY2FsZV9vZmZzZXRfcnNzaV9ucGh5KHBpLCAweDAsIDB4MCwgUkFESU9fTUlNT19DT1JFU0VMX0FMTFJYLAotCQkJCSAgICAgICBOUEhZX1JBSUxfSSwgcnNzaV90eXBlKTsKLQl3bGNfcGh5X3NjYWxlX29mZnNldF9yc3NpX25waHkocGksIDB4MCwgMHgwLCBSQURJT19NSU1PX0NPUkVTRUxfQUxMUlgsCi0JCQkJICAgICAgIE5QSFlfUkFJTF9RLCByc3NpX3R5cGUpOwotCi0JZm9yICh2Y20gPSAwOyB2Y20gPCA0OyB2Y20rKykgewotCi0JCXZjbV90bXBbMF0gPSB2Y21fdG1wWzFdID0gdmNtX3RtcFsyXSA9IHZjbV90bXBbM10gPSB2Y207Ci0JCWlmIChyc3NpX3R5cGUgIT0gTlBIWV9SU1NJX1NFTF9XMikgewotCQkJd2xjX3BoeV9zZXRfcnNzaV8yMDU1X3ZjbShwaSwgcnNzaV90eXBlLCB2Y21fdG1wKTsKLQkJfQotCi0JCXdsY19waHlfcG9sbF9yc3NpX25waHkocGksIHJzc2lfdHlwZSwgJnBvbGxfcmVzdWx0c1t2Y21dWzBdLAotCQkJCSAgICAgICBOUEhZX1JTU0lDQUxfTlBPTEwpOwotCi0JCWlmICgocnNzaV90eXBlID09IE5QSFlfUlNTSV9TRUxfVzEpCi0JCSAgICB8fCAocnNzaV90eXBlID09IE5QSFlfUlNTSV9TRUxfVzIpKSB7Ci0JCQlmb3IgKGN0ciA9IDA7IGN0ciA8IDI7IGN0cisrKSB7Ci0JCQkJcG9sbF9taW5pcVt2Y21dW2N0cl0gPQotCQkJCSAgICBtaW4ocG9sbF9yZXN1bHRzW3ZjbV1bY3RyICogMiArIDBdLAotCQkJCQlwb2xsX3Jlc3VsdHNbdmNtXVtjdHIgKiAyICsgMV0pOwotCQkJfQotCQl9Ci0JfQotCi0JZm9yIChyZXN1bHRfaWR4ID0gMDsgcmVzdWx0X2lkeCA8IDQ7IHJlc3VsdF9pZHgrKykgewotCQltaW5fZCA9IE5QSFlfUlNTSUNBTF9NQVhEOwotCQltaW5fdmNtID0gMDsKLQkJbWluX3BvbGwgPSBOUEhZX1JTU0lDQUxfTUFYUkVBRCAqIE5QSFlfUlNTSUNBTF9OUE9MTCArIDE7Ci0JCWZvciAodmNtID0gMDsgdmNtIDwgNDsgdmNtKyspIHsKLQkJCWN1cnJfZCA9IEFCUygoKHJzc2lfdHlwZSA9PSBOUEhZX1JTU0lfU0VMX05CKSA/Ci0JCQkJICAgICAgcG9sbF9yZXN1bHRzW3ZjbV1bcmVzdWx0X2lkeF0gOgotCQkJCSAgICAgIHBvbGxfbWluaXFbdmNtXVtyZXN1bHRfaWR4IC8gMl0pIC0KLQkJCQkgICAgICh0YXJnZXRfY29kZSAqIE5QSFlfUlNTSUNBTF9OUE9MTCkpOwotCQkJaWYgKGN1cnJfZCA8IG1pbl9kKSB7Ci0JCQkJbWluX2QgPSBjdXJyX2Q7Ci0JCQkJbWluX3ZjbSA9IHZjbTsKLQkJCX0KLQkJCWlmIChwb2xsX3Jlc3VsdHNbdmNtXVtyZXN1bHRfaWR4XSA8IG1pbl9wb2xsKSB7Ci0JCQkJbWluX3BvbGwgPSBwb2xsX3Jlc3VsdHNbdmNtXVtyZXN1bHRfaWR4XTsKLQkJCX0KLQkJfQotCQl2Y21fZmluYWxbcmVzdWx0X2lkeF0gPSBtaW5fdmNtOwotCQlwb2xsX3Jlc3VsdHNfbWluW3Jlc3VsdF9pZHhdID0gbWluX3BvbGw7Ci0JfQotCi0JaWYgKHJzc2lfdHlwZSAhPSBOUEhZX1JTU0lfU0VMX1cyKSB7Ci0JCXdsY19waHlfc2V0X3Jzc2lfMjA1NV92Y20ocGksIHJzc2lfdHlwZSwgdmNtX2ZpbmFsKTsKLQl9Ci0KLQlmb3IgKHJlc3VsdF9pZHggPSAwOyByZXN1bHRfaWR4IDwgNDsgcmVzdWx0X2lkeCsrKSB7Ci0JCWZpbmVfZGlnaXRhbF9vZmZzZXRbcmVzdWx0X2lkeF0gPQotCQkgICAgKHRhcmdldF9jb2RlICogTlBIWV9SU1NJQ0FMX05QT0xMKSAtCi0JCSAgICBwb2xsX3Jlc3VsdHNbdmNtX2ZpbmFsW3Jlc3VsdF9pZHhdXVtyZXN1bHRfaWR4XTsKLQkJaWYgKGZpbmVfZGlnaXRhbF9vZmZzZXRbcmVzdWx0X2lkeF0gPCAwKSB7Ci0JCQlmaW5lX2RpZ2l0YWxfb2Zmc2V0W3Jlc3VsdF9pZHhdID0KLQkJCSAgICBBQlMoZmluZV9kaWdpdGFsX29mZnNldFtyZXN1bHRfaWR4XSk7Ci0JCQlmaW5lX2RpZ2l0YWxfb2Zmc2V0W3Jlc3VsdF9pZHhdICs9Ci0JCQkgICAgKE5QSFlfUlNTSUNBTF9OUE9MTCAvIDIpOwotCQkJZmluZV9kaWdpdGFsX29mZnNldFtyZXN1bHRfaWR4XSAvPSBOUEhZX1JTU0lDQUxfTlBPTEw7Ci0JCQlmaW5lX2RpZ2l0YWxfb2Zmc2V0W3Jlc3VsdF9pZHhdID0KLQkJCSAgICAtZmluZV9kaWdpdGFsX29mZnNldFtyZXN1bHRfaWR4XTsKLQkJfSBlbHNlIHsKLQkJCWZpbmVfZGlnaXRhbF9vZmZzZXRbcmVzdWx0X2lkeF0gKz0KLQkJCSAgICAoTlBIWV9SU1NJQ0FMX05QT0xMIC8gMik7Ci0JCQlmaW5lX2RpZ2l0YWxfb2Zmc2V0W3Jlc3VsdF9pZHhdIC89IE5QSFlfUlNTSUNBTF9OUE9MTDsKLQkJfQotCi0JCWlmIChwb2xsX3Jlc3VsdHNfbWluW3Jlc3VsdF9pZHhdID09Ci0JCSAgICBOUEhZX1JTU0lDQUxfTUFYUkVBRCAqIE5QSFlfUlNTSUNBTF9OUE9MTCkgewotCQkJZmluZV9kaWdpdGFsX29mZnNldFtyZXN1bHRfaWR4XSA9Ci0JCQkgICAgKHRhcmdldF9jb2RlIC0gTlBIWV9SU1NJQ0FMX01BWFJFQUQgLSAxKTsKLQkJfQotCi0JCXdsY19waHlfc2NhbGVfb2Zmc2V0X3Jzc2lfbnBoeShwaSwgMHgwLAotCQkJCQkgICAgICAgKHM4KQotCQkJCQkgICAgICAgZmluZV9kaWdpdGFsX29mZnNldFtyZXN1bHRfaWR4XSwKLQkJCQkJICAgICAgIChyZXN1bHRfaWR4IC8gMiA9PQotCQkJCQkJMCkgPyBSQURJT19NSU1PX0NPUkVTRUxfQ09SRTEgOgotCQkJCQkgICAgICAgUkFESU9fTUlNT19DT1JFU0VMX0NPUkUyLAotCQkJCQkgICAgICAgKHJlc3VsdF9pZHggJSAyID09Ci0JCQkJCQkwKSA/IE5QSFlfUkFJTF9JIDogTlBIWV9SQUlMX1EsCi0JCQkJCSAgICAgICByc3NpX3R5cGUpOwotCX0KLQotCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfUERfQ09SRTFfUlNTSV9NSVNDLCBwZF9tYXNrLCBwZF9zdGF0ZVswXSk7Ci0JbW9kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9QRF9DT1JFMl9SU1NJX01JU0MsIHBkX21hc2ssIHBkX3N0YXRlWzFdKTsKLQlpZiAocnNzaV9jdHJsX3N0YXRlWzBdID09IFJBRElPXzIwNTVfTkJSU1NJX1NFTCkgewotCQl3bGNfcGh5X3Jzc2lzZWxfbnBoeShwaSwgUkFESU9fTUlNT19DT1JFU0VMX0NPUkUxLAotCQkJCSAgICAgTlBIWV9SU1NJX1NFTF9OQik7Ci0JfSBlbHNlIGlmIChyc3NpX2N0cmxfc3RhdGVbMF0gPT0gUkFESU9fMjA1NV9XQlJTU0lfRzFfU0VMKSB7Ci0JCXdsY19waHlfcnNzaXNlbF9ucGh5KHBpLCBSQURJT19NSU1PX0NPUkVTRUxfQ09SRTEsCi0JCQkJICAgICBOUEhZX1JTU0lfU0VMX1cxKTsKLQl9IGVsc2UgaWYgKHJzc2lfY3RybF9zdGF0ZVswXSA9PSBSQURJT18yMDU1X1dCUlNTSV9HMl9TRUwpIHsKLQkJd2xjX3BoeV9yc3Npc2VsX25waHkocGksIFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMSwKLQkJCQkgICAgIE5QSFlfUlNTSV9TRUxfVzIpOwotCX0gZWxzZSB7Ci0JCXdsY19waHlfcnNzaXNlbF9ucGh5KHBpLCBSQURJT19NSU1PX0NPUkVTRUxfQ09SRTEsCi0JCQkJICAgICBOUEhZX1JTU0lfU0VMX1cyKTsKLQl9Ci0JaWYgKHJzc2lfY3RybF9zdGF0ZVsxXSA9PSBSQURJT18yMDU1X05CUlNTSV9TRUwpIHsKLQkJd2xjX3BoeV9yc3Npc2VsX25waHkocGksIFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMiwKLQkJCQkgICAgIE5QSFlfUlNTSV9TRUxfTkIpOwotCX0gZWxzZSBpZiAocnNzaV9jdHJsX3N0YXRlWzFdID09IFJBRElPXzIwNTVfV0JSU1NJX0cxX1NFTCkgewotCQl3bGNfcGh5X3Jzc2lzZWxfbnBoeShwaSwgUkFESU9fTUlNT19DT1JFU0VMX0NPUkUyLAotCQkJCSAgICAgTlBIWV9SU1NJX1NFTF9XMSk7Ci0JfSBlbHNlIGlmIChyc3NpX2N0cmxfc3RhdGVbMV0gPT0gUkFESU9fMjA1NV9XQlJTU0lfRzJfU0VMKSB7Ci0JCXdsY19waHlfcnNzaXNlbF9ucGh5KHBpLCBSQURJT19NSU1PX0NPUkVTRUxfQ09SRTIsCi0JCQkJICAgICBOUEhZX1JTU0lfU0VMX1cyKTsKLQl9IGVsc2UgewotCQl3bGNfcGh5X3Jzc2lzZWxfbnBoeShwaSwgUkFESU9fTUlNT19DT1JFU0VMX0NPUkUyLAotCQkJCSAgICAgTlBIWV9SU1NJX1NFTF9XMik7Ci0JfQotCi0Jd2xjX3BoeV9yc3Npc2VsX25waHkocGksIFJBRElPX01JTU9fQ09SRVNFTF9PRkYsIHJzc2lfdHlwZSk7Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCAweDkxLCByZmN0cmxpbnRjX3N0YXRlWzBdKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfUERfQ09SRTFfUlhUWCwgcmZwZGNvcmVyeHR4X3N0YXRlWzBdKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDkyLCByZmN0cmxpbnRjX3N0YXRlWzFdKTsKLQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfUERfQ09SRTJfUlhUWCwgcmZwZGNvcmVyeHR4X3N0YXRlWzFdKTsKLQotCXdsY19waHlfY2xhc3NpZmllcl9ucGh5KHBpLCAoMHg3IDw8IDApLCBjbGFzc2lmX3N0YXRlKTsKLQl3bGNfcGh5X2NsaXBfZGV0X25waHkocGksIDEsIGNsaXBfc3RhdGUpOwotCi0Jd2xjX3BoeV9yZXNldGNjYV9ucGh5KHBpKTsKLX0KLQotaW50Ci13bGNfcGh5X3Jzc2lfY29tcHV0ZV9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCBzdHJ1Y3QgYnJjbXNfZDExcnhoZHIgKndsY19yeGgpCi17Ci0Jc3RydWN0IGQxMXJ4aGRyICpyeGggPSAmd2xjX3J4aC0+cnhoZHI7Ci0JczE2IHJ4cHdyLCByeHB3cjAsIHJ4cHdyMTsKLQlzMTYgcGh5UngwX2wsIHBoeVJ4Ml9sOwotCi0Jcnhwd3IgPSAwOwotCXJ4cHdyMCA9IGxlMTZfdG9fY3B1KHJ4aC0+UGh5UnhTdGF0dXNfMSkgJiBQUlhTMV9ucGh5X1BXUjBfTUFTSzsKLQlyeHB3cjEgPSAobGUxNl90b19jcHUocnhoLT5QaHlSeFN0YXR1c18xKSAmIFBSWFMxX25waHlfUFdSMV9NQVNLKSA+PiA4OwotCi0JaWYgKHJ4cHdyMCA+IDEyNykKLQkJcnhwd3IwIC09IDI1NjsKLQlpZiAocnhwd3IxID4gMTI3KQotCQlyeHB3cjEgLT0gMjU2OwotCi0JcGh5UngwX2wgPSBsZTE2X3RvX2NwdShyeGgtPlBoeVJ4U3RhdHVzXzApICYgMHgwMGZmOwotCXBoeVJ4Ml9sID0gbGUxNl90b19jcHUocnhoLT5QaHlSeFN0YXR1c18yKSAmIDB4MDBmZjsKLQlpZiAocGh5UngyX2wgPiAxMjcpCi0JCXBoeVJ4Ml9sIC09IDI1NjsKLQotCWlmICgoKHJ4cHdyMCA9PSAxNikgfHwgKHJ4cHdyMCA9PSAzMikpKSB7Ci0JCXJ4cHdyMCA9IHJ4cHdyMTsKLQkJcnhwd3IxID0gcGh5UngyX2w7Ci0JfQotCi0Jd2xjX3J4aC0+cnhwd3JbMF0gPSAoczgpIHJ4cHdyMDsKLQl3bGNfcnhoLT5yeHB3clsxXSA9IChzOCkgcnhwd3IxOwotCXdsY19yeGgtPmRvX3Jzc2lfbWEgPSAwOwotCi0JaWYgKHBpLT5zaC0+cnNzaV9tb2RlID09IFJTU0lfQU5UX01FUkdFX01BWCkKLQkJcnhwd3IgPSAocnhwd3IwID4gcnhwd3IxKSA/IHJ4cHdyMCA6IHJ4cHdyMTsKLQllbHNlIGlmIChwaS0+c2gtPnJzc2lfbW9kZSA9PSBSU1NJX0FOVF9NRVJHRV9NSU4pCi0JCXJ4cHdyID0gKHJ4cHdyMCA8IHJ4cHdyMSkgPyByeHB3cjAgOiByeHB3cjE7Ci0JZWxzZSBpZiAocGktPnNoLT5yc3NpX21vZGUgPT0gUlNTSV9BTlRfTUVSR0VfQVZHKQotCQlyeHB3ciA9IChyeHB3cjAgKyByeHB3cjEpID4+IDE7Ci0KLQlyZXR1cm4gcnhwd3I7Ci19Ci0KLXN0YXRpYyB2b2lkCi13bGNfcGh5X3JmY3RybGludGNfb3ZlcnJpZGVfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTggZmllbGQsIHUxNiB2YWx1ZSwKLQkJCQkgdTggY29yZV9jb2RlKQotewotCXUxNiBtYXNrOwotCXUxNiB2YWw7Ci0JdTggY29yZTsKLQotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCQlmb3IgKGNvcmUgPSAwOyBjb3JlIDwgcGktPnB1YnBpLnBoeV9jb3JlbnVtOyBjb3JlKyspIHsKLQkJCWlmIChjb3JlX2NvZGUgPT0gUkFESU9fTUlNT19DT1JFU0VMX0NPUkUxCi0JCQkgICAgJiYgY29yZSA9PSBQSFlfQ09SRV8xKQotCQkJCWNvbnRpbnVlOwotCQkJZWxzZSBpZiAoY29yZV9jb2RlID09IFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMgotCQkJCSAmJiBjb3JlID09IFBIWV9DT1JFXzApCi0JCQkJY29udGludWU7Ci0KLQkJCWlmIChOUkVWX0xUKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCi0JCQkJbWFzayA9ICgweDEgPDwgMTApOwotCQkJCXZhbCA9IDEgPDwgMTA7Ci0JCQkJbW9kX3BoeV9yZWcocGksIChjb3JlID09IFBIWV9DT1JFXzApID8gMHg5MSA6Ci0JCQkJCSAgICAweDkyLCBtYXNrLCB2YWwpOwotCQkJfQotCi0JCQlpZiAoZmllbGQgPT0gTlBIWV9SZmN0cmxJbnRjX292ZXJyaWRlX09GRikgewotCi0JCQkJd3JpdGVfcGh5X3JlZyhwaSwgKGNvcmUgPT0gUEhZX0NPUkVfMCkgPyAweDkxIDoKLQkJCQkJICAgICAgMHg5MiwgMCk7Ci0KLQkJCQl3bGNfcGh5X2ZvcmNlX3Jmc2VxX25waHkocGksCi0JCQkJCQkJIE5QSFlfUkZTRVFfUkVTRVQyUlgpOwotCQkJfSBlbHNlIGlmIChmaWVsZCA9PSBOUEhZX1JmY3RybEludGNfb3ZlcnJpZGVfVFJTVykgewotCi0JCQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0KLQkJCQkJbWFzayA9ICgweDEgPDwgNikgfCAoMHgxIDw8IDcpOwotCi0JCQkJCXZhbCA9IHZhbHVlIDw8IDY7Ci0JCQkJCW1vZF9waHlfcmVnKHBpLAotCQkJCQkJICAgIChjb3JlID09Ci0JCQkJCQkgICAgIFBIWV9DT1JFXzApID8gMHg5MSA6IDB4OTIsCi0JCQkJCQkgICAgbWFzaywgdmFsKTsKLQotCQkJCQlvcl9waHlfcmVnKHBpLAotCQkJCQkJICAgKGNvcmUgPT0KLQkJCQkJCSAgICBQSFlfQ09SRV8wKSA/IDB4OTEgOiAweDkyLAotCQkJCQkJICAgKDB4MSA8PCAxMCkpOwotCi0JCQkJCWFuZF9waHlfcmVnKHBpLCAweDJmZiwgKHUxNikKLQkJCQkJCSAgICB+KDB4MyA8PCAxNCkpOwotCQkJCQlvcl9waHlfcmVnKHBpLCAweDJmZiwgKDB4MSA8PCAxMykpOwotCQkJCQlvcl9waHlfcmVnKHBpLCAweDJmZiwgKDB4MSA8PCAwKSk7Ci0JCQkJfSBlbHNlIHsKLQotCQkJCQltYXNrID0gKDB4MSA8PCA2KSB8Ci0JCQkJCSAgICAoMHgxIDw8IDcpIHwKLQkJCQkJICAgICgweDEgPDwgOCkgfCAoMHgxIDw8IDkpOwotCQkJCQl2YWwgPSB2YWx1ZSA8PCA2OwotCQkJCQltb2RfcGh5X3JlZyhwaSwKLQkJCQkJCSAgICAoY29yZSA9PQotCQkJCQkJICAgICBQSFlfQ09SRV8wKSA/IDB4OTEgOiAweDkyLAotCQkJCQkJICAgIG1hc2ssIHZhbCk7Ci0KLQkJCQkJbWFzayA9ICgweDEgPDwgMCk7Ci0JCQkJCXZhbCA9IDEgPDwgMDsKLQkJCQkJbW9kX3BoeV9yZWcocGksCi0JCQkJCQkgICAgKGNvcmUgPT0KLQkJCQkJCSAgICAgUEhZX0NPUkVfMCkgPyAweGU3IDogMHhlYywKLQkJCQkJCSAgICBtYXNrLCB2YWwpOwotCi0JCQkJCW1hc2sgPSAoY29yZSA9PSBQSFlfQ09SRV8wKSA/ICgweDEgPDwgMCkKLQkJCQkJICAgIDogKDB4MSA8PCAxKTsKLQkJCQkJdmFsID0gMSA8PCAoKGNvcmUgPT0gUEhZX0NPUkVfMCkgPwotCQkJCQkJICAgIDAgOiAxKTsKLQkJCQkJbW9kX3BoeV9yZWcocGksIDB4NzgsIG1hc2ssIHZhbCk7Ci0KLQkJCQkJU1BJTldBSVQoKChyZWFkX3BoeV9yZWcocGksIDB4NzgpICYgdmFsKQotCQkJCQkJICAhPSAwKSwgMTAwMDApOwotCQkJCQlpZiAoV0FSTihyZWFkX3BoeV9yZWcocGksIDB4NzgpICYgdmFsLAotCQkJCQkJIkhXIGVycm9yOiBvdmVycmlkZSBmYWlsZWQiKSkKLQkJCQkJCXJldHVybjsKLQotCQkJCQltYXNrID0gKDB4MSA8PCAwKTsKLQkJCQkJdmFsID0gMCA8PCAwOwotCQkJCQltb2RfcGh5X3JlZyhwaSwKLQkJCQkJCSAgICAoY29yZSA9PQotCQkJCQkJICAgICBQSFlfQ09SRV8wKSA/IDB4ZTcgOiAweGVjLAotCQkJCQkJICAgIG1hc2ssIHZhbCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChmaWVsZCA9PSBOUEhZX1JmY3RybEludGNfb3ZlcnJpZGVfUEEpIHsKLQkJCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQotCQkJCQltYXNrID0gKDB4MSA8PCA0KSB8ICgweDEgPDwgNSk7Ci0KLQkJCQkJaWYgKENIU1BFQ19JUzVHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCQkJCXZhbCA9IHZhbHVlIDw8IDU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl2YWwgPSB2YWx1ZSA8PCA0OwotCQkJCQl9Ci0KLQkJCQkJbW9kX3BoeV9yZWcocGksCi0JCQkJCQkgICAgKGNvcmUgPT0KLQkJCQkJCSAgICAgUEhZX0NPUkVfMCkgPyAweDkxIDogMHg5MiwKLQkJCQkJCSAgICBtYXNrLCB2YWwpOwotCi0JCQkJCW9yX3BoeV9yZWcocGksCi0JCQkJCQkgICAoY29yZSA9PQotCQkJCQkJICAgIFBIWV9DT1JFXzApID8gMHg5MSA6IDB4OTIsCi0JCQkJCQkgICAoMHgxIDw8IDEyKSk7Ci0JCQkJfSBlbHNlIHsKLQotCQkJCQlpZiAoQ0hTUEVDX0lTNUcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJCQkJbWFzayA9ICgweDEgPDwgNSk7Ci0JCQkJCQl2YWwgPSB2YWx1ZSA8PCA1OwotCQkJCQl9IGVsc2UgewotCQkJCQkJbWFzayA9ICgweDEgPDwgNCk7Ci0JCQkJCQl2YWwgPSB2YWx1ZSA8PCA0OwotCQkJCQl9Ci0JCQkJCW1vZF9waHlfcmVnKHBpLAotCQkJCQkJICAgIChjb3JlID09Ci0JCQkJCQkgICAgIFBIWV9DT1JFXzApID8gMHg5MSA6IDB4OTIsCi0JCQkJCQkgICAgbWFzaywgdmFsKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGZpZWxkID09IE5QSFlfUmZjdHJsSW50Y19vdmVycmlkZV9FWFRfTE5BX1BVKSB7Ci0JCQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCQkJCWlmIChDSFNQRUNfSVM1RyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0KLQkJCQkJCW1hc2sgPSAoMHgxIDw8IDApOwotCQkJCQkJdmFsID0gdmFsdWUgPDwgMDsKLQkJCQkJCW1vZF9waHlfcmVnKHBpLAotCQkJCQkJCSAgICAoY29yZSA9PQotCQkJCQkJCSAgICAgUEhZX0NPUkVfMCkgPyAweDkxCi0JCQkJCQkJICAgIDogMHg5MiwgbWFzaywgdmFsKTsKLQotCQkJCQkJbWFzayA9ICgweDEgPDwgMik7Ci0JCQkJCQltb2RfcGh5X3JlZyhwaSwKLQkJCQkJCQkgICAgKGNvcmUgPT0KLQkJCQkJCQkgICAgIFBIWV9DT1JFXzApID8gMHg5MQotCQkJCQkJCSAgICA6IDB4OTIsIG1hc2ssIDApOwotCQkJCQl9IGVsc2UgewotCi0JCQkJCQltYXNrID0gKDB4MSA8PCAyKTsKLQkJCQkJCXZhbCA9IHZhbHVlIDw8IDI7Ci0JCQkJCQltb2RfcGh5X3JlZyhwaSwKLQkJCQkJCQkgICAgKGNvcmUgPT0KLQkJCQkJCQkgICAgIFBIWV9DT1JFXzApID8gMHg5MQotCQkJCQkJCSAgICA6IDB4OTIsIG1hc2ssIHZhbCk7Ci0KLQkJCQkJCW1hc2sgPSAoMHgxIDw8IDApOwotCQkJCQkJbW9kX3BoeV9yZWcocGksCi0JCQkJCQkJICAgIChjb3JlID09Ci0JCQkJCQkJICAgICBQSFlfQ09SRV8wKSA/IDB4OTEKLQkJCQkJCQkgICAgOiAweDkyLCBtYXNrLCAwKTsKLQkJCQkJfQotCi0JCQkJCW1hc2sgPSAoMHgxIDw8IDExKTsKLQkJCQkJdmFsID0gMSA8PCAxMTsKLQkJCQkJbW9kX3BoeV9yZWcocGksCi0JCQkJCQkgICAgKGNvcmUgPT0KLQkJCQkJCSAgICAgUEhZX0NPUkVfMCkgPyAweDkxIDogMHg5MiwKLQkJCQkJCSAgICBtYXNrLCB2YWwpOwotCQkJCX0gZWxzZSB7Ci0KLQkJCQkJaWYgKENIU1BFQ19JUzVHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCQkJCW1hc2sgPSAoMHgxIDw8IDApOwotCQkJCQkJdmFsID0gdmFsdWUgPDwgMDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCW1hc2sgPSAoMHgxIDw8IDIpOwotCQkJCQkJdmFsID0gdmFsdWUgPDwgMjsKLQkJCQkJfQotCQkJCQltb2RfcGh5X3JlZyhwaSwKLQkJCQkJCSAgICAoY29yZSA9PQotCQkJCQkJICAgICBQSFlfQ09SRV8wKSA/IDB4OTEgOiAweDkyLAotCQkJCQkJICAgIG1hc2ssIHZhbCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChmaWVsZCA9PQotCQkJCSAgIE5QSFlfUmZjdHJsSW50Y19vdmVycmlkZV9FWFRfTE5BX0dBSU4pIHsKLQkJCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQkJCQkJaWYgKENIU1BFQ19JUzVHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQotCQkJCQkJbWFzayA9ICgweDEgPDwgMSk7Ci0JCQkJCQl2YWwgPSB2YWx1ZSA8PCAxOwotCQkJCQkJbW9kX3BoeV9yZWcocGksCi0JCQkJCQkJICAgIChjb3JlID09Ci0JCQkJCQkJICAgICBQSFlfQ09SRV8wKSA/IDB4OTEKLQkJCQkJCQkgICAgOiAweDkyLCBtYXNrLCB2YWwpOwotCi0JCQkJCQltYXNrID0gKDB4MSA8PCAzKTsKLQkJCQkJCW1vZF9waHlfcmVnKHBpLAotCQkJCQkJCSAgICAoY29yZSA9PQotCQkJCQkJCSAgICAgUEhZX0NPUkVfMCkgPyAweDkxCi0JCQkJCQkJICAgIDogMHg5MiwgbWFzaywgMCk7Ci0JCQkJCX0gZWxzZSB7Ci0KLQkJCQkJCW1hc2sgPSAoMHgxIDw8IDMpOwotCQkJCQkJdmFsID0gdmFsdWUgPDwgMzsKLQkJCQkJCW1vZF9waHlfcmVnKHBpLAotCQkJCQkJCSAgICAoY29yZSA9PQotCQkJCQkJCSAgICAgUEhZX0NPUkVfMCkgPyAweDkxCi0JCQkJCQkJICAgIDogMHg5MiwgbWFzaywgdmFsKTsKLQotCQkJCQkJbWFzayA9ICgweDEgPDwgMSk7Ci0JCQkJCQltb2RfcGh5X3JlZyhwaSwKLQkJCQkJCQkgICAgKGNvcmUgPT0KLQkJCQkJCQkgICAgIFBIWV9DT1JFXzApID8gMHg5MQotCQkJCQkJCSAgICA6IDB4OTIsIG1hc2ssIDApOwotCQkJCQl9Ci0KLQkJCQkJbWFzayA9ICgweDEgPDwgMTEpOwotCQkJCQl2YWwgPSAxIDw8IDExOwotCQkJCQltb2RfcGh5X3JlZyhwaSwKLQkJCQkJCSAgICAoY29yZSA9PQotCQkJCQkJICAgICBQSFlfQ09SRV8wKSA/IDB4OTEgOiAweDkyLAotCQkJCQkJICAgIG1hc2ssIHZhbCk7Ci0JCQkJfSBlbHNlIHsKLQotCQkJCQlpZiAoQ0hTUEVDX0lTNUcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJCQkJbWFzayA9ICgweDEgPDwgMSk7Ci0JCQkJCQl2YWwgPSB2YWx1ZSA8PCAxOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbWFzayA9ICgweDEgPDwgMyk7Ci0JCQkJCQl2YWwgPSB2YWx1ZSA8PCAzOwotCQkJCQl9Ci0JCQkJCW1vZF9waHlfcmVnKHBpLAotCQkJCQkJICAgIChjb3JlID09Ci0JCQkJCQkgICAgIFBIWV9DT1JFXzApID8gMHg5MSA6IDB4OTIsCi0JCQkJCQkgICAgbWFzaywgdmFsKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlyZXR1cm47Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3Jzc2lfY2FsX25waHlfcmV2MyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQl1MTYgY2xhc3NpZl9zdGF0ZTsKLQl1MTYgY2xpcF9zdGF0ZVsyXTsKLQl1MTYgY2xpcF9vZmZbXSA9IHsgMHhmZmZmLCAweGZmZmYgfTsKLQlzMzIgdGFyZ2V0X2NvZGU7Ci0JdTggdmNtLCBtaW5fdmNtOwotCXU4IHZjbV9maW5hbCA9IDA7Ci0JdTggcmVzdWx0X2lkeDsKLQlzMzIgcG9sbF9yZXN1bHRzWzhdWzRdID0gewotCQl7MCwgMCwgMCwgMH0sCi0JCXswLCAwLCAwLCAwfSwKLQkJezAsIDAsIDAsIDB9LAotCQl7MCwgMCwgMCwgMH0sCi0JCXswLCAwLCAwLCAwfSwKLQkJezAsIDAsIDAsIDB9LAotCQl7MCwgMCwgMCwgMH0sCi0JCXswLCAwLCAwLCAwfQotCX07Ci0JczMyIHBvbGxfcmVzdWx0X2NvcmVbNF0gPSB7IDAsIDAsIDAsIDAgfTsKLQlzMzIgbWluX2QgPSBOUEhZX1JTU0lDQUxfTUFYRCwgY3Vycl9kOwotCXMzMiBmaW5lX2RpZ2l0YWxfb2Zmc2V0WzRdOwotCXMzMiBwb2xsX3Jlc3VsdHNfbWluWzRdID0geyAwLCAwLCAwLCAwIH07Ci0JczMyIG1pbl9wb2xsOwotCXU4IHZjbV9sZXZlbF9tYXg7Ci0JdTggY29yZTsKLQl1OCB3Yl9jbnQ7Ci0JdTggcnNzaV90eXBlOwotCXUxNiBOUEhZX1JmY3RybGludGMxX3NhdmUsIE5QSFlfUmZjdHJsaW50YzJfc2F2ZTsKLQl1MTYgTlBIWV9BZmVjdHJsT3ZlcnJpZGUxX3NhdmUsIE5QSFlfQWZlY3RybE92ZXJyaWRlMl9zYXZlOwotCXUxNiBOUEhZX0FmZWN0cmxDb3JlMV9zYXZlLCBOUEhZX0FmZWN0cmxDb3JlMl9zYXZlOwotCXUxNiBOUEhZX1JmY3RybE92ZXJyaWRlMF9zYXZlLCBOUEhZX1JmY3RybE92ZXJyaWRlMV9zYXZlOwotCXUxNiBOUEhZX1JmY3RybE92ZXJyaWRlQXV4MF9zYXZlLCBOUEhZX1JmY3RybE92ZXJyaWRlQXV4MV9zYXZlOwotCXUxNiBOUEhZX1JmY3RybENtZF9zYXZlOwotCXUxNiBOUEhZX1JmY3RybE1pc2NSZWcxX3NhdmUsIE5QSFlfUmZjdHJsTWlzY1JlZzJfc2F2ZTsKLQl1MTYgTlBIWV9SZmN0cmxSU1NJT1RIRVJTMV9zYXZlLCBOUEhZX1JmY3RybFJTU0lPVEhFUlMyX3NhdmU7Ci0JdTggcnhjb3JlX3N0YXRlOwotCXUxNiBOUEhZX1JFVjdfUmZjdHJsT3ZlcnJpZGUzX3NhdmUsIE5QSFlfUkVWN19SZmN0cmxPdmVycmlkZTRfc2F2ZTsKLQl1MTYgTlBIWV9SRVY3X1JmY3RybE92ZXJyaWRlNV9zYXZlLCBOUEhZX1JFVjdfUmZjdHJsT3ZlcnJpZGU2X3NhdmU7Ci0JdTE2IE5QSFlfUkVWN19SZmN0cmxNaXNjUmVnM19zYXZlLCBOUEhZX1JFVjdfUmZjdHJsTWlzY1JlZzRfc2F2ZTsKLQl1MTYgTlBIWV9SRVY3X1JmY3RybE1pc2NSZWc1X3NhdmUsIE5QSFlfUkVWN19SZmN0cmxNaXNjUmVnNl9zYXZlOwotCi0JTlBIWV9SRVY3X1JmY3RybE92ZXJyaWRlM19zYXZlID0gTlBIWV9SRVY3X1JmY3RybE92ZXJyaWRlNF9zYXZlID0KLQkgICAgTlBIWV9SRVY3X1JmY3RybE92ZXJyaWRlNV9zYXZlID0gTlBIWV9SRVY3X1JmY3RybE92ZXJyaWRlNl9zYXZlID0KLQkgICAgTlBIWV9SRVY3X1JmY3RybE1pc2NSZWczX3NhdmUgPSBOUEhZX1JFVjdfUmZjdHJsTWlzY1JlZzRfc2F2ZSA9Ci0JICAgIE5QSFlfUkVWN19SZmN0cmxNaXNjUmVnNV9zYXZlID0gTlBIWV9SRVY3X1JmY3RybE1pc2NSZWc2X3NhdmUgPSAwOwotCi0JY2xhc3NpZl9zdGF0ZSA9IHdsY19waHlfY2xhc3NpZmllcl9ucGh5KHBpLCAwLCAwKTsKLQl3bGNfcGh5X2NsYXNzaWZpZXJfbnBoeShwaSwgKDB4NyA8PCAwKSwgNCk7Ci0Jd2xjX3BoeV9jbGlwX2RldF9ucGh5KHBpLCAwLCBjbGlwX3N0YXRlKTsKLQl3bGNfcGh5X2NsaXBfZGV0X25waHkocGksIDEsIGNsaXBfb2ZmKTsKLQotCU5QSFlfUmZjdHJsaW50YzFfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHg5MSk7Ci0JTlBIWV9SZmN0cmxpbnRjMl9zYXZlID0gcmVhZF9waHlfcmVnKHBpLCAweDkyKTsKLQlOUEhZX0FmZWN0cmxPdmVycmlkZTFfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHg4Zik7Ci0JTlBIWV9BZmVjdHJsT3ZlcnJpZGUyX3NhdmUgPSByZWFkX3BoeV9yZWcocGksIDB4YTUpOwotCU5QSFlfQWZlY3RybENvcmUxX3NhdmUgPSByZWFkX3BoeV9yZWcocGksIDB4YTYpOwotCU5QSFlfQWZlY3RybENvcmUyX3NhdmUgPSByZWFkX3BoeV9yZWcocGksIDB4YTcpOwotCU5QSFlfUmZjdHJsT3ZlcnJpZGUwX3NhdmUgPSByZWFkX3BoeV9yZWcocGksIDB4ZTcpOwotCU5QSFlfUmZjdHJsT3ZlcnJpZGUxX3NhdmUgPSByZWFkX3BoeV9yZWcocGksIDB4ZWMpOwotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCQlOUEhZX1JFVjdfUmZjdHJsT3ZlcnJpZGUzX3NhdmUgPSByZWFkX3BoeV9yZWcocGksIDB4MzQyKTsKLQkJTlBIWV9SRVY3X1JmY3RybE92ZXJyaWRlNF9zYXZlID0gcmVhZF9waHlfcmVnKHBpLCAweDM0Myk7Ci0JCU5QSFlfUkVWN19SZmN0cmxPdmVycmlkZTVfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHgzNDYpOwotCQlOUEhZX1JFVjdfUmZjdHJsT3ZlcnJpZGU2X3NhdmUgPSByZWFkX3BoeV9yZWcocGksIDB4MzQ3KTsKLQl9Ci0JTlBIWV9SZmN0cmxPdmVycmlkZUF1eDBfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHhlNSk7Ci0JTlBIWV9SZmN0cmxPdmVycmlkZUF1eDFfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHhlNik7Ci0JTlBIWV9SZmN0cmxDbWRfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHg3OCk7Ci0JTlBIWV9SZmN0cmxNaXNjUmVnMV9zYXZlID0gcmVhZF9waHlfcmVnKHBpLCAweGY5KTsKLQlOUEhZX1JmY3RybE1pc2NSZWcyX3NhdmUgPSByZWFkX3BoeV9yZWcocGksIDB4ZmIpOwotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCQlOUEhZX1JFVjdfUmZjdHJsTWlzY1JlZzNfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHgzNDApOwotCQlOUEhZX1JFVjdfUmZjdHJsTWlzY1JlZzRfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHgzNDEpOwotCQlOUEhZX1JFVjdfUmZjdHJsTWlzY1JlZzVfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHgzNDQpOwotCQlOUEhZX1JFVjdfUmZjdHJsTWlzY1JlZzZfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHgzNDUpOwotCX0KLQlOUEhZX1JmY3RybFJTU0lPVEhFUlMxX3NhdmUgPSByZWFkX3BoeV9yZWcocGksIDB4N2EpOwotCU5QSFlfUmZjdHJsUlNTSU9USEVSUzJfc2F2ZSA9IHJlYWRfcGh5X3JlZyhwaSwgMHg3ZCk7Ci0KLQl3bGNfcGh5X3JmY3RybGludGNfb3ZlcnJpZGVfbnBoeShwaSwgTlBIWV9SZmN0cmxJbnRjX292ZXJyaWRlX09GRiwgMCwKLQkJCQkJIFJBRElPX01JTU9fQ09SRVNFTF9BTExSWFRYKTsKLQl3bGNfcGh5X3JmY3RybGludGNfb3ZlcnJpZGVfbnBoeShwaSwgTlBIWV9SZmN0cmxJbnRjX292ZXJyaWRlX1RSU1csIDEsCi0JCQkJCSBSQURJT19NSU1PX0NPUkVTRUxfQUxMUlhUWCk7Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfMXRvbWFueV9ucGh5KHBpLAotCQkJCQkJICAgICBOUEhZX1JFVjdfUmZjdHJsT3ZlcnJpZGVfY21kX3J4cmZfcHUsCi0JCQkJCQkgICAgIDAsIDAsIDApOwotCX0gZWxzZSB7Ci0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHkocGksICgweDEgPDwgMCksIDAsIDAsIDApOwotCX0KLQotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV8xdG9tYW55X25waHkocGksCi0JCQkJCQkgICAgIE5QSFlfUkVWN19SZmN0cmxPdmVycmlkZV9jbWRfcnhfcHUsCi0JCQkJCQkgICAgIDEsIDAsIDApOwotCX0gZWxzZSB7Ci0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHkocGksICgweDEgPDwgMSksIDEsIDAsIDApOwotCX0KLQotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksICgweDEgPDwgNyksCi0JCQkJCQkgIDEsIDAsIDAsCi0JCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDApOwotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksICgweDEgPDwgNiksIDEsIDAsIDAsCi0JCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDApOwotCX0gZWxzZSB7Ci0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHkocGksICgweDEgPDwgNyksIDEsIDAsIDApOwotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5KHBpLCAoMHgxIDw8IDYpLCAxLCAwLCAwKTsKLQl9Ci0KLQlpZiAoQ0hTUEVDX0lTNUcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQkJCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCA1KSwKLQkJCQkJCQkgIDAsIDAsIDAsCi0JCQkJCQkJICBOUEhZX1JFVjdfUkZDVFJMT1ZFUlJJREVfSUQwKTsKLQkJCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCA0KSwgMSwgMCwKLQkJCQkJCQkgIDAsCi0JCQkJCQkJICBOUEhZX1JFVjdfUkZDVFJMT1ZFUlJJREVfSUQwKTsKLQkJfSBlbHNlIHsKLQkJCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHkocGksICgweDEgPDwgNSksIDAsIDAsIDApOwotCQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeShwaSwgKDB4MSA8PCA0KSwgMSwgMCwgMCk7Ci0JCX0KLQotCX0gZWxzZSB7Ci0JCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDQpLAotCQkJCQkJCSAgMCwgMCwgMCwKLQkJCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDApOwotCQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDUpLCAxLCAwLAotCQkJCQkJCSAgMCwKLQkJCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDApOwotCQl9IGVsc2UgewotCQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeShwaSwgKDB4MSA8PCA0KSwgMCwgMCwgMCk7Ci0JCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5KHBpLCAoMHgxIDw8IDUpLCAxLCAwLCAwKTsKLQkJfQotCX0KLQotCXJ4Y29yZV9zdGF0ZSA9IHdsY19waHlfcnhjb3JlX2dldHN0YXRlX25waHkoCi0JCQkJCQkoc3RydWN0IGJyY21zX3BoeV9wdWIgKikgcGkpOwotCi0JdmNtX2xldmVsX21heCA9IDg7Ci0KLQlmb3IgKGNvcmUgPSAwOyBjb3JlIDwgcGktPnB1YnBpLnBoeV9jb3JlbnVtOyBjb3JlKyspIHsKLQotCQlpZiAoKHJ4Y29yZV9zdGF0ZSAmICgxIDw8IGNvcmUpKSA9PSAwKQotCQkJY29udGludWU7Ci0KLQkJd2xjX3BoeV9zY2FsZV9vZmZzZXRfcnNzaV9ucGh5KHBpLCAweDAsIDB4MCwKLQkJCQkJICAgICAgIGNvcmUgPT0KLQkJCQkJICAgICAgIFBIWV9DT1JFXzAgPwotCQkJCQkgICAgICAgUkFESU9fTUlNT19DT1JFU0VMX0NPUkUxIDoKLQkJCQkJICAgICAgIFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMiwKLQkJCQkJICAgICAgIE5QSFlfUkFJTF9JLCBOUEhZX1JTU0lfU0VMX05CKTsKLQkJd2xjX3BoeV9zY2FsZV9vZmZzZXRfcnNzaV9ucGh5KHBpLCAweDAsIDB4MCwKLQkJCQkJICAgICAgIGNvcmUgPT0KLQkJCQkJICAgICAgIFBIWV9DT1JFXzAgPwotCQkJCQkgICAgICAgUkFESU9fTUlNT19DT1JFU0VMX0NPUkUxIDoKLQkJCQkJICAgICAgIFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMiwKLQkJCQkJICAgICAgIE5QSFlfUkFJTF9RLCBOUEhZX1JTU0lfU0VMX05CKTsKLQotCQlmb3IgKHZjbSA9IDA7IHZjbSA8IHZjbV9sZXZlbF9tYXg7IHZjbSsrKSB7Ci0JCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQotCQkJCW1vZF9yYWRpb19yZWcocGksIChjb3JlID09IFBIWV9DT1JFXzApID8KLQkJCQkJICAgICAgUkFESU9fMjA1N19OQl9NQVNURVJfQ09SRTAgOgotCQkJCQkgICAgICBSQURJT18yMDU3X05CX01BU1RFUl9DT1JFMSwKLQkJCQkJICAgICAgUkFESU9fMjA1N19WQ01fTUFTSywgdmNtKTsKLQkJCX0gZWxzZSB7Ci0KLQkJCQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU2X1JYX1JTU0lfTUlTQyB8Ci0JCQkJCSAgICAgICgoY29yZSA9PQotCQkJCQkJUEhZX0NPUkVfMCkgPyBSQURJT18yMDU2X1JYMCA6Ci0JCQkJCSAgICAgICBSQURJT18yMDU2X1JYMSksCi0JCQkJCSAgICAgIFJBRElPXzIwNTZfVkNNX01BU0ssCi0JCQkJCSAgICAgIHZjbSA8PCBSQURJT18yMDU2X1JTU0lfVkNNX1NISUZUKTsKLQkJCX0KLQotCQkJd2xjX3BoeV9wb2xsX3Jzc2lfbnBoeShwaSwgTlBIWV9SU1NJX1NFTF9OQiwKLQkJCQkJICAgICAgICZwb2xsX3Jlc3VsdHNbdmNtXVswXSwKLQkJCQkJICAgICAgIE5QSFlfUlNTSUNBTF9OUE9MTCk7Ci0JCX0KLQotCQlmb3IgKHJlc3VsdF9pZHggPSAwOyByZXN1bHRfaWR4IDwgNDsgcmVzdWx0X2lkeCsrKSB7Ci0JCQlpZiAoKGNvcmUgPT0gcmVzdWx0X2lkeCAvIDIpICYmIChyZXN1bHRfaWR4ICUgMiA9PSAwKSkgewotCi0JCQkJbWluX2QgPSBOUEhZX1JTU0lDQUxfTUFYRDsKLQkJCQltaW5fdmNtID0gMDsKLQkJCQltaW5fcG9sbCA9Ci0JCQkJICAgIE5QSFlfUlNTSUNBTF9NQVhSRUFEICogTlBIWV9SU1NJQ0FMX05QT0xMICsKLQkJCQkgICAgMTsKLQkJCQlmb3IgKHZjbSA9IDA7IHZjbSA8IHZjbV9sZXZlbF9tYXg7IHZjbSsrKSB7Ci0JCQkJCWN1cnJfZCA9IHBvbGxfcmVzdWx0c1t2Y21dW3Jlc3VsdF9pZHhdICoKLQkJCQkJICAgIHBvbGxfcmVzdWx0c1t2Y21dW3Jlc3VsdF9pZHhdICsKLQkJCQkJICAgIHBvbGxfcmVzdWx0c1t2Y21dW3Jlc3VsdF9pZHggKyAxXSAqCi0JCQkJCSAgICBwb2xsX3Jlc3VsdHNbdmNtXVtyZXN1bHRfaWR4ICsgMV07Ci0JCQkJCWlmIChjdXJyX2QgPCBtaW5fZCkgewotCQkJCQkJbWluX2QgPSBjdXJyX2Q7Ci0JCQkJCQltaW5fdmNtID0gdmNtOwotCQkJCQl9Ci0JCQkJCWlmIChwb2xsX3Jlc3VsdHNbdmNtXVtyZXN1bHRfaWR4XSA8Ci0JCQkJCSAgICBtaW5fcG9sbCkgewotCQkJCQkJbWluX3BvbGwgPQotCQkJCQkJICAgIHBvbGxfcmVzdWx0c1t2Y21dCi0JCQkJCQkgICAgW3Jlc3VsdF9pZHhdOwotCQkJCQl9Ci0JCQkJfQotCQkJCXZjbV9maW5hbCA9IG1pbl92Y207Ci0JCQkJcG9sbF9yZXN1bHRzX21pbltyZXN1bHRfaWR4XSA9IG1pbl9wb2xsOwotCQkJfQotCQl9Ci0KLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCQltb2RfcmFkaW9fcmVnKHBpLCAoY29yZSA9PSBQSFlfQ09SRV8wKSA/Ci0JCQkJICAgICAgUkFESU9fMjA1N19OQl9NQVNURVJfQ09SRTAgOgotCQkJCSAgICAgIFJBRElPXzIwNTdfTkJfTUFTVEVSX0NPUkUxLAotCQkJCSAgICAgIFJBRElPXzIwNTdfVkNNX01BU0ssIHZjbV9maW5hbCk7Ci0JCX0gZWxzZSB7Ci0JCQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU2X1JYX1JTU0lfTUlTQyB8Ci0JCQkJICAgICAgKChjb3JlID09Ci0JCQkJCVBIWV9DT1JFXzApID8gUkFESU9fMjA1Nl9SWDAgOgotCQkJCSAgICAgICBSQURJT18yMDU2X1JYMSksIFJBRElPXzIwNTZfVkNNX01BU0ssCi0JCQkJICAgICAgdmNtX2ZpbmFsIDw8IFJBRElPXzIwNTZfUlNTSV9WQ01fU0hJRlQpOwotCQl9Ci0KLQkJZm9yIChyZXN1bHRfaWR4ID0gMDsgcmVzdWx0X2lkeCA8IDQ7IHJlc3VsdF9pZHgrKykgewotCQkJaWYgKGNvcmUgPT0gcmVzdWx0X2lkeCAvIDIpIHsKLQkJCQlmaW5lX2RpZ2l0YWxfb2Zmc2V0W3Jlc3VsdF9pZHhdID0KLQkJCQkgICAgKE5QSFlfUlNTSUNBTF9OQl9UQVJHRVQgKgotCQkJCSAgICAgTlBIWV9SU1NJQ0FMX05QT0xMKSAtCi0JCQkJICAgIHBvbGxfcmVzdWx0c1t2Y21fZmluYWxdW3Jlc3VsdF9pZHhdOwotCQkJCWlmIChmaW5lX2RpZ2l0YWxfb2Zmc2V0W3Jlc3VsdF9pZHhdIDwgMCkgewotCQkJCQlmaW5lX2RpZ2l0YWxfb2Zmc2V0W3Jlc3VsdF9pZHhdID0KLQkJCQkJICAgIEFCUyhmaW5lX2RpZ2l0YWxfb2Zmc2V0Ci0JCQkJCQlbcmVzdWx0X2lkeF0pOwotCQkJCQlmaW5lX2RpZ2l0YWxfb2Zmc2V0W3Jlc3VsdF9pZHhdICs9Ci0JCQkJCSAgICAoTlBIWV9SU1NJQ0FMX05QT0xMIC8gMik7Ci0JCQkJCWZpbmVfZGlnaXRhbF9vZmZzZXRbcmVzdWx0X2lkeF0gLz0KLQkJCQkJICAgIE5QSFlfUlNTSUNBTF9OUE9MTDsKLQkJCQkJZmluZV9kaWdpdGFsX29mZnNldFtyZXN1bHRfaWR4XSA9Ci0JCQkJCSAgICAtZmluZV9kaWdpdGFsX29mZnNldFtyZXN1bHRfaWR4XTsKLQkJCQl9IGVsc2UgewotCQkJCQlmaW5lX2RpZ2l0YWxfb2Zmc2V0W3Jlc3VsdF9pZHhdICs9Ci0JCQkJCSAgICAoTlBIWV9SU1NJQ0FMX05QT0xMIC8gMik7Ci0JCQkJCWZpbmVfZGlnaXRhbF9vZmZzZXRbcmVzdWx0X2lkeF0gLz0KLQkJCQkJICAgIE5QSFlfUlNTSUNBTF9OUE9MTDsKLQkJCQl9Ci0KLQkJCQlpZiAocG9sbF9yZXN1bHRzX21pbltyZXN1bHRfaWR4XSA9PQotCQkJCSAgICBOUEhZX1JTU0lDQUxfTUFYUkVBRCAqIE5QSFlfUlNTSUNBTF9OUE9MTCkgewotCQkJCQlmaW5lX2RpZ2l0YWxfb2Zmc2V0W3Jlc3VsdF9pZHhdID0KLQkJCQkJICAgIChOUEhZX1JTU0lDQUxfTkJfVEFSR0VUIC0KLQkJCQkJICAgICBOUEhZX1JTU0lDQUxfTUFYUkVBRCAtIDEpOwotCQkJCX0KLQotCQkJCXdsY19waHlfc2NhbGVfb2Zmc2V0X3Jzc2lfbnBoeShwaSwgMHgwLAotCQkJCQkJCSAgICAgICAoczgpCi0JCQkJCQkJICAgICAgIGZpbmVfZGlnaXRhbF9vZmZzZXQKLQkJCQkJCQkgICAgICAgW3Jlc3VsdF9pZHhdLAotCQkJCQkJCSAgICAgICAocmVzdWx0X2lkeCAvCi0JCQkJCQkJCTIgPT0KLQkJCQkJCQkJMCkgPwotCQkJCQkJCSAgICAgICBSQURJT19NSU1PX0NPUkVTRUxfQ09SRTEKLQkJCQkJCQkgICAgICAgOgotCQkJCQkJCSAgICAgICBSQURJT19NSU1PX0NPUkVTRUxfQ09SRTIsCi0JCQkJCQkJICAgICAgIChyZXN1bHRfaWR4ICUKLQkJCQkJCQkJMiA9PQotCQkJCQkJCQkwKSA/IE5QSFlfUkFJTF9JCi0JCQkJCQkJICAgICAgIDogTlBIWV9SQUlMX1EsCi0JCQkJCQkJICAgICAgIE5QSFlfUlNTSV9TRUxfTkIpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlmb3IgKGNvcmUgPSAwOyBjb3JlIDwgcGktPnB1YnBpLnBoeV9jb3JlbnVtOyBjb3JlKyspIHsKLQotCQlpZiAoKHJ4Y29yZV9zdGF0ZSAmICgxIDw8IGNvcmUpKSA9PSAwKQotCQkJY29udGludWU7Ci0KLQkJZm9yICh3Yl9jbnQgPSAwOyB3Yl9jbnQgPCAyOyB3Yl9jbnQrKykgewotCQkJaWYgKHdiX2NudCA9PSAwKSB7Ci0JCQkJcnNzaV90eXBlID0gTlBIWV9SU1NJX1NFTF9XMTsKLQkJCQl0YXJnZXRfY29kZSA9IE5QSFlfUlNTSUNBTF9XMV9UQVJHRVRfUkVWMzsKLQkJCX0gZWxzZSB7Ci0JCQkJcnNzaV90eXBlID0gTlBIWV9SU1NJX1NFTF9XMjsKLQkJCQl0YXJnZXRfY29kZSA9IE5QSFlfUlNTSUNBTF9XMl9UQVJHRVRfUkVWMzsKLQkJCX0KLQotCQkJd2xjX3BoeV9zY2FsZV9vZmZzZXRfcnNzaV9ucGh5KHBpLCAweDAsIDB4MCwKLQkJCQkJCSAgICAgICBjb3JlID09Ci0JCQkJCQkgICAgICAgUEhZX0NPUkVfMCA/Ci0JCQkJCQkgICAgICAgUkFESU9fTUlNT19DT1JFU0VMX0NPUkUxCi0JCQkJCQkgICAgICAgOgotCQkJCQkJICAgICAgIFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMiwKLQkJCQkJCSAgICAgICBOUEhZX1JBSUxfSSwgcnNzaV90eXBlKTsKLQkJCXdsY19waHlfc2NhbGVfb2Zmc2V0X3Jzc2lfbnBoeShwaSwgMHgwLCAweDAsCi0JCQkJCQkgICAgICAgY29yZSA9PQotCQkJCQkJICAgICAgIFBIWV9DT1JFXzAgPwotCQkJCQkJICAgICAgIFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMQotCQkJCQkJICAgICAgIDoKLQkJCQkJCSAgICAgICBSQURJT19NSU1PX0NPUkVTRUxfQ09SRTIsCi0JCQkJCQkgICAgICAgTlBIWV9SQUlMX1EsIHJzc2lfdHlwZSk7Ci0KLQkJCXdsY19waHlfcG9sbF9yc3NpX25waHkocGksIHJzc2lfdHlwZSwgcG9sbF9yZXN1bHRfY29yZSwKLQkJCQkJICAgICAgIE5QSFlfUlNTSUNBTF9OUE9MTCk7Ci0KLQkJCWZvciAocmVzdWx0X2lkeCA9IDA7IHJlc3VsdF9pZHggPCA0OyByZXN1bHRfaWR4KyspIHsKLQkJCQlpZiAoY29yZSA9PSByZXN1bHRfaWR4IC8gMikgewotCQkJCQlmaW5lX2RpZ2l0YWxfb2Zmc2V0W3Jlc3VsdF9pZHhdID0KLQkJCQkJICAgICh0YXJnZXRfY29kZSAqIE5QSFlfUlNTSUNBTF9OUE9MTCkgLQotCQkJCQkgICAgcG9sbF9yZXN1bHRfY29yZVtyZXN1bHRfaWR4XTsKLQkJCQkJaWYgKGZpbmVfZGlnaXRhbF9vZmZzZXRbcmVzdWx0X2lkeF0gPCAwKSB7Ci0JCQkJCQlmaW5lX2RpZ2l0YWxfb2Zmc2V0W3Jlc3VsdF9pZHhdCi0JCQkJCQkgICAgPQotCQkJCQkJICAgIEFCUyhmaW5lX2RpZ2l0YWxfb2Zmc2V0Ci0JCQkJCQkJW3Jlc3VsdF9pZHhdKTsKLQkJCQkJCWZpbmVfZGlnaXRhbF9vZmZzZXRbcmVzdWx0X2lkeF0KLQkJCQkJCSAgICArPSAoTlBIWV9SU1NJQ0FMX05QT0xMIC8gMik7Ci0JCQkJCQlmaW5lX2RpZ2l0YWxfb2Zmc2V0W3Jlc3VsdF9pZHhdCi0JCQkJCQkgICAgLz0gTlBIWV9SU1NJQ0FMX05QT0xMOwotCQkJCQkJZmluZV9kaWdpdGFsX29mZnNldFtyZXN1bHRfaWR4XQotCQkJCQkJICAgID0KLQkJCQkJCSAgICAtZmluZV9kaWdpdGFsX29mZnNldAotCQkJCQkJICAgIFtyZXN1bHRfaWR4XTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWZpbmVfZGlnaXRhbF9vZmZzZXRbcmVzdWx0X2lkeF0KLQkJCQkJCSAgICArPSAoTlBIWV9SU1NJQ0FMX05QT0xMIC8gMik7Ci0JCQkJCQlmaW5lX2RpZ2l0YWxfb2Zmc2V0W3Jlc3VsdF9pZHhdCi0JCQkJCQkgICAgLz0gTlBIWV9SU1NJQ0FMX05QT0xMOwotCQkJCQl9Ci0KLQkJCQkJd2xjX3BoeV9zY2FsZV9vZmZzZXRfcnNzaV9ucGh5KHBpLCAweDAsCi0JCQkJCQkJCSAgICAgICAoczgpCi0JCQkJCQkJCSAgICAgICBmaW5lX2RpZ2l0YWxfb2Zmc2V0Ci0JCQkJCQkJCSAgICAgICBbY29yZSAqCi0JCQkJCQkJCQkyXSwKLQkJCQkJCQkJICAgICAgIChjb3JlID09Ci0JCQkJCQkJCQlQSFlfQ09SRV8wKQotCQkJCQkJCQkgICAgICAgPwotCQkJCQkJCQkgICAgICAgUkFESU9fTUlNT19DT1JFU0VMX0NPUkUxCi0JCQkJCQkJCSAgICAgICA6Ci0JCQkJCQkJCSAgICAgICBSQURJT19NSU1PX0NPUkVTRUxfQ09SRTIsCi0JCQkJCQkJCSAgICAgICAocmVzdWx0X2lkeAotCQkJCQkJCQkJJSAyID09Ci0JCQkJCQkJCQkwKSA/Ci0JCQkJCQkJCSAgICAgICBOUEhZX1JBSUxfSQotCQkJCQkJCQkgICAgICAgOgotCQkJCQkJCQkgICAgICAgTlBIWV9SQUlMX1EsCi0JCQkJCQkJCSAgICAgICByc3NpX3R5cGUpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0JfQotCi0Jd3JpdGVfcGh5X3JlZyhwaSwgMHg5MSwgTlBIWV9SZmN0cmxpbnRjMV9zYXZlKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDkyLCBOUEhZX1JmY3RybGludGMyX3NhdmUpOwotCi0Jd2xjX3BoeV9mb3JjZV9yZnNlcV9ucGh5KHBpLCBOUEhZX1JGU0VRX1JFU0VUMlJYKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweGU3LCAoMHgxIDw8IDApLCAxIDw8IDApOwotCW1vZF9waHlfcmVnKHBpLCAweDc4LCAoMHgxIDw8IDApLCAxIDw8IDApOwotCW1vZF9waHlfcmVnKHBpLCAweGU3LCAoMHgxIDw8IDApLCAwKTsKLQotCW1vZF9waHlfcmVnKHBpLCAweGVjLCAoMHgxIDw8IDApLCAxIDw8IDApOwotCW1vZF9waHlfcmVnKHBpLCAweDc4LCAoMHgxIDw8IDEpLCAxIDw8IDEpOwotCW1vZF9waHlfcmVnKHBpLCAweGVjLCAoMHgxIDw8IDApLCAwKTsKLQotCXdyaXRlX3BoeV9yZWcocGksIDB4OGYsIE5QSFlfQWZlY3RybE92ZXJyaWRlMV9zYXZlKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweGE1LCBOUEhZX0FmZWN0cmxPdmVycmlkZTJfc2F2ZSk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHhhNiwgTlBIWV9BZmVjdHJsQ29yZTFfc2F2ZSk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHhhNywgTlBIWV9BZmVjdHJsQ29yZTJfc2F2ZSk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHhlNywgTlBIWV9SZmN0cmxPdmVycmlkZTBfc2F2ZSk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHhlYywgTlBIWV9SZmN0cmxPdmVycmlkZTFfc2F2ZSk7Ci0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MzQyLCBOUEhZX1JFVjdfUmZjdHJsT3ZlcnJpZGUzX3NhdmUpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDM0MywgTlBIWV9SRVY3X1JmY3RybE92ZXJyaWRlNF9zYXZlKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgzNDYsIE5QSFlfUkVWN19SZmN0cmxPdmVycmlkZTVfc2F2ZSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MzQ3LCBOUEhZX1JFVjdfUmZjdHJsT3ZlcnJpZGU2X3NhdmUpOwotCX0KLQl3cml0ZV9waHlfcmVnKHBpLCAweGU1LCBOUEhZX1JmY3RybE92ZXJyaWRlQXV4MF9zYXZlKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweGU2LCBOUEhZX1JmY3RybE92ZXJyaWRlQXV4MV9zYXZlKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDc4LCBOUEhZX1JmY3RybENtZF9zYXZlKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweGY5LCBOUEhZX1JmY3RybE1pc2NSZWcxX3NhdmUpOwotCXdyaXRlX3BoeV9yZWcocGksIDB4ZmIsIE5QSFlfUmZjdHJsTWlzY1JlZzJfc2F2ZSk7Ci0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MzQwLCBOUEhZX1JFVjdfUmZjdHJsTWlzY1JlZzNfc2F2ZSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MzQxLCBOUEhZX1JFVjdfUmZjdHJsTWlzY1JlZzRfc2F2ZSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MzQ0LCBOUEhZX1JFVjdfUmZjdHJsTWlzY1JlZzVfc2F2ZSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MzQ1LCBOUEhZX1JFVjdfUmZjdHJsTWlzY1JlZzZfc2F2ZSk7Ci0JfQotCXdyaXRlX3BoeV9yZWcocGksIDB4N2EsIE5QSFlfUmZjdHJsUlNTSU9USEVSUzFfc2F2ZSk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHg3ZCwgTlBIWV9SZmN0cmxSU1NJT1RIRVJTMl9zYXZlKTsKLQotCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCQkJcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9yYWRpb19yZWdzXzJHWzBdID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19OQl9NQVNURVJfQ09SRTApOwotCQkJcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9yYWRpb19yZWdzXzJHWzFdID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19OQl9NQVNURVJfQ09SRTEpOwotCQl9IGVsc2UgewotCQkJcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9yYWRpb19yZWdzXzJHWzBdID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwKLQkJCQkJICAgUkFESU9fMjA1Nl9SWF9SU1NJX01JU0MgfAotCQkJCQkgICBSQURJT18yMDU2X1JYMCk7Ci0JCQlwaS0+cnNzaWNhbF9jYWNoZS5yc3NpY2FsX3JhZGlvX3JlZ3NfMkdbMV0gPQotCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkgICBSQURJT18yMDU2X1JYX1JTU0lfTUlTQyB8Ci0JCQkJCSAgIFJBRElPXzIwNTZfUlgxKTsKLQkJfQotCi0JCXBpLT5yc3NpY2FsX2NhY2hlLnJzc2ljYWxfcGh5cmVnc18yR1swXSA9Ci0JCSAgICByZWFkX3BoeV9yZWcocGksIDB4MWE2KTsKLQkJcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9waHlyZWdzXzJHWzFdID0KLQkJICAgIHJlYWRfcGh5X3JlZyhwaSwgMHgxYWMpOwotCQlwaS0+cnNzaWNhbF9jYWNoZS5yc3NpY2FsX3BoeXJlZ3NfMkdbMl0gPQotCQkgICAgcmVhZF9waHlfcmVnKHBpLCAweDFiMik7Ci0JCXBpLT5yc3NpY2FsX2NhY2hlLnJzc2ljYWxfcGh5cmVnc18yR1szXSA9Ci0JCSAgICByZWFkX3BoeV9yZWcocGksIDB4MWI4KTsKLQkJcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9waHlyZWdzXzJHWzRdID0KLQkJICAgIHJlYWRfcGh5X3JlZyhwaSwgMHgxYTQpOwotCQlwaS0+cnNzaWNhbF9jYWNoZS5yc3NpY2FsX3BoeXJlZ3NfMkdbNV0gPQotCQkgICAgcmVhZF9waHlfcmVnKHBpLCAweDFhYSk7Ci0JCXBpLT5yc3NpY2FsX2NhY2hlLnJzc2ljYWxfcGh5cmVnc18yR1s2XSA9Ci0JCSAgICByZWFkX3BoeV9yZWcocGksIDB4MWIwKTsKLQkJcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9waHlyZWdzXzJHWzddID0KLQkJICAgIHJlYWRfcGh5X3JlZyhwaSwgMHgxYjYpOwotCQlwaS0+cnNzaWNhbF9jYWNoZS5yc3NpY2FsX3BoeXJlZ3NfMkdbOF0gPQotCQkgICAgcmVhZF9waHlfcmVnKHBpLCAweDFhNSk7Ci0JCXBpLT5yc3NpY2FsX2NhY2hlLnJzc2ljYWxfcGh5cmVnc18yR1s5XSA9Ci0JCSAgICByZWFkX3BoeV9yZWcocGksIDB4MWFiKTsKLQkJcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9waHlyZWdzXzJHWzEwXSA9Ci0JCSAgICByZWFkX3BoeV9yZWcocGksIDB4MWIxKTsKLQkJcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9waHlyZWdzXzJHWzExXSA9Ci0JCSAgICByZWFkX3BoeV9yZWcocGksIDB4MWI3KTsKLQotCQlwaS0+bnBoeV9yc3NpY2FsX2NoYW5zcGVjXzJHID0gcGktPnJhZGlvX2NoYW5zcGVjOwotCX0gZWxzZSB7Ci0JCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCQkJcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9yYWRpb19yZWdzXzVHWzBdID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19OQl9NQVNURVJfQ09SRTApOwotCQkJcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9yYWRpb19yZWdzXzVHWzFdID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1N19OQl9NQVNURVJfQ09SRTEpOwotCQl9IGVsc2UgewotCQkJcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9yYWRpb19yZWdzXzVHWzBdID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwKLQkJCQkJICAgUkFESU9fMjA1Nl9SWF9SU1NJX01JU0MgfAotCQkJCQkgICBSQURJT18yMDU2X1JYMCk7Ci0JCQlwaS0+cnNzaWNhbF9jYWNoZS5yc3NpY2FsX3JhZGlvX3JlZ3NfNUdbMV0gPQotCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkgICBSQURJT18yMDU2X1JYX1JTU0lfTUlTQyB8Ci0JCQkJCSAgIFJBRElPXzIwNTZfUlgxKTsKLQkJfQotCi0JCXBpLT5yc3NpY2FsX2NhY2hlLnJzc2ljYWxfcGh5cmVnc181R1swXSA9Ci0JCSAgICByZWFkX3BoeV9yZWcocGksIDB4MWE2KTsKLQkJcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9waHlyZWdzXzVHWzFdID0KLQkJICAgIHJlYWRfcGh5X3JlZyhwaSwgMHgxYWMpOwotCQlwaS0+cnNzaWNhbF9jYWNoZS5yc3NpY2FsX3BoeXJlZ3NfNUdbMl0gPQotCQkgICAgcmVhZF9waHlfcmVnKHBpLCAweDFiMik7Ci0JCXBpLT5yc3NpY2FsX2NhY2hlLnJzc2ljYWxfcGh5cmVnc181R1szXSA9Ci0JCSAgICByZWFkX3BoeV9yZWcocGksIDB4MWI4KTsKLQkJcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9waHlyZWdzXzVHWzRdID0KLQkJICAgIHJlYWRfcGh5X3JlZyhwaSwgMHgxYTQpOwotCQlwaS0+cnNzaWNhbF9jYWNoZS5yc3NpY2FsX3BoeXJlZ3NfNUdbNV0gPQotCQkgICAgcmVhZF9waHlfcmVnKHBpLCAweDFhYSk7Ci0JCXBpLT5yc3NpY2FsX2NhY2hlLnJzc2ljYWxfcGh5cmVnc181R1s2XSA9Ci0JCSAgICByZWFkX3BoeV9yZWcocGksIDB4MWIwKTsKLQkJcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9waHlyZWdzXzVHWzddID0KLQkJICAgIHJlYWRfcGh5X3JlZyhwaSwgMHgxYjYpOwotCQlwaS0+cnNzaWNhbF9jYWNoZS5yc3NpY2FsX3BoeXJlZ3NfNUdbOF0gPQotCQkgICAgcmVhZF9waHlfcmVnKHBpLCAweDFhNSk7Ci0JCXBpLT5yc3NpY2FsX2NhY2hlLnJzc2ljYWxfcGh5cmVnc181R1s5XSA9Ci0JCSAgICByZWFkX3BoeV9yZWcocGksIDB4MWFiKTsKLQkJcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9waHlyZWdzXzVHWzEwXSA9Ci0JCSAgICByZWFkX3BoeV9yZWcocGksIDB4MWIxKTsKLQkJcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9waHlyZWdzXzVHWzExXSA9Ci0JCSAgICByZWFkX3BoeV9yZWcocGksIDB4MWI3KTsKLQotCQlwaS0+bnBoeV9yc3NpY2FsX2NoYW5zcGVjXzVHID0gcGktPnJhZGlvX2NoYW5zcGVjOwotCX0KLQotCXdsY19waHlfY2xhc3NpZmllcl9ucGh5KHBpLCAoMHg3IDw8IDApLCBjbGFzc2lmX3N0YXRlKTsKLQl3bGNfcGh5X2NsaXBfZGV0X25waHkocGksIDEsIGNsaXBfc3RhdGUpOwotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3Jlc3RvcmVfcnNzaWNhbF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCWlmIChwaS0+bnBoeV9yc3NpY2FsX2NoYW5zcGVjXzJHID09IDApCi0JCQlyZXR1cm47Ci0KLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X05CX01BU1RFUl9DT1JFMCwKLQkJCQkgICAgICBSQURJT18yMDU3X1ZDTV9NQVNLLAotCQkJCSAgICAgIHBpLT5yc3NpY2FsX2NhY2hlLgotCQkJCSAgICAgIHJzc2ljYWxfcmFkaW9fcmVnc18yR1swXSk7Ci0JCQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X05CX01BU1RFUl9DT1JFMSwKLQkJCQkgICAgICBSQURJT18yMDU3X1ZDTV9NQVNLLAotCQkJCSAgICAgIHBpLT5yc3NpY2FsX2NhY2hlLgotCQkJCSAgICAgIHJzc2ljYWxfcmFkaW9fcmVnc18yR1sxXSk7Ci0JCX0gZWxzZSB7Ci0JCQltb2RfcmFkaW9fcmVnKHBpLAotCQkJCSAgICAgIFJBRElPXzIwNTZfUlhfUlNTSV9NSVNDIHwgUkFESU9fMjA1Nl9SWDAsCi0JCQkJICAgICAgUkFESU9fMjA1Nl9WQ01fTUFTSywKLQkJCQkgICAgICBwaS0+cnNzaWNhbF9jYWNoZS4KLQkJCQkgICAgICByc3NpY2FsX3JhZGlvX3JlZ3NfMkdbMF0pOwotCQkJbW9kX3JhZGlvX3JlZyhwaSwKLQkJCQkgICAgICBSQURJT18yMDU2X1JYX1JTU0lfTUlTQyB8IFJBRElPXzIwNTZfUlgxLAotCQkJCSAgICAgIFJBRElPXzIwNTZfVkNNX01BU0ssCi0JCQkJICAgICAgcGktPnJzc2ljYWxfY2FjaGUuCi0JCQkJICAgICAgcnNzaWNhbF9yYWRpb19yZWdzXzJHWzFdKTsKLQkJfQotCi0JCXdyaXRlX3BoeV9yZWcocGksIDB4MWE2LAotCQkJICAgICAgcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9waHlyZWdzXzJHWzBdKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxYWMsCi0JCQkgICAgICBwaS0+cnNzaWNhbF9jYWNoZS5yc3NpY2FsX3BoeXJlZ3NfMkdbMV0pOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDFiMiwKLQkJCSAgICAgIHBpLT5yc3NpY2FsX2NhY2hlLnJzc2ljYWxfcGh5cmVnc18yR1syXSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MWI4LAotCQkJICAgICAgcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9waHlyZWdzXzJHWzNdKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxYTQsCi0JCQkgICAgICBwaS0+cnNzaWNhbF9jYWNoZS5yc3NpY2FsX3BoeXJlZ3NfMkdbNF0pOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDFhYSwKLQkJCSAgICAgIHBpLT5yc3NpY2FsX2NhY2hlLnJzc2ljYWxfcGh5cmVnc18yR1s1XSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MWIwLAotCQkJICAgICAgcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9waHlyZWdzXzJHWzZdKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxYjYsCi0JCQkgICAgICBwaS0+cnNzaWNhbF9jYWNoZS5yc3NpY2FsX3BoeXJlZ3NfMkdbN10pOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDFhNSwKLQkJCSAgICAgIHBpLT5yc3NpY2FsX2NhY2hlLnJzc2ljYWxfcGh5cmVnc18yR1s4XSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MWFiLAotCQkJICAgICAgcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9waHlyZWdzXzJHWzldKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxYjEsCi0JCQkgICAgICBwaS0+cnNzaWNhbF9jYWNoZS5yc3NpY2FsX3BoeXJlZ3NfMkdbMTBdKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxYjcsCi0JCQkgICAgICBwaS0+cnNzaWNhbF9jYWNoZS5yc3NpY2FsX3BoeXJlZ3NfMkdbMTFdKTsKLQotCX0gZWxzZSB7Ci0JCWlmIChwaS0+bnBoeV9yc3NpY2FsX2NoYW5zcGVjXzVHID09IDApCi0JCQlyZXR1cm47Ci0KLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X05CX01BU1RFUl9DT1JFMCwKLQkJCQkgICAgICBSQURJT18yMDU3X1ZDTV9NQVNLLAotCQkJCSAgICAgIHBpLT5yc3NpY2FsX2NhY2hlLgotCQkJCSAgICAgIHJzc2ljYWxfcmFkaW9fcmVnc181R1swXSk7Ci0JCQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X05CX01BU1RFUl9DT1JFMSwKLQkJCQkgICAgICBSQURJT18yMDU3X1ZDTV9NQVNLLAotCQkJCSAgICAgIHBpLT5yc3NpY2FsX2NhY2hlLgotCQkJCSAgICAgIHJzc2ljYWxfcmFkaW9fcmVnc181R1sxXSk7Ci0JCX0gZWxzZSB7Ci0JCQltb2RfcmFkaW9fcmVnKHBpLAotCQkJCSAgICAgIFJBRElPXzIwNTZfUlhfUlNTSV9NSVNDIHwgUkFESU9fMjA1Nl9SWDAsCi0JCQkJICAgICAgUkFESU9fMjA1Nl9WQ01fTUFTSywKLQkJCQkgICAgICBwaS0+cnNzaWNhbF9jYWNoZS4KLQkJCQkgICAgICByc3NpY2FsX3JhZGlvX3JlZ3NfNUdbMF0pOwotCQkJbW9kX3JhZGlvX3JlZyhwaSwKLQkJCQkgICAgICBSQURJT18yMDU2X1JYX1JTU0lfTUlTQyB8IFJBRElPXzIwNTZfUlgxLAotCQkJCSAgICAgIFJBRElPXzIwNTZfVkNNX01BU0ssCi0JCQkJICAgICAgcGktPnJzc2ljYWxfY2FjaGUuCi0JCQkJICAgICAgcnNzaWNhbF9yYWRpb19yZWdzXzVHWzFdKTsKLQkJfQotCi0JCXdyaXRlX3BoeV9yZWcocGksIDB4MWE2LAotCQkJICAgICAgcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9waHlyZWdzXzVHWzBdKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxYWMsCi0JCQkgICAgICBwaS0+cnNzaWNhbF9jYWNoZS5yc3NpY2FsX3BoeXJlZ3NfNUdbMV0pOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDFiMiwKLQkJCSAgICAgIHBpLT5yc3NpY2FsX2NhY2hlLnJzc2ljYWxfcGh5cmVnc181R1syXSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MWI4LAotCQkJICAgICAgcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9waHlyZWdzXzVHWzNdKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxYTQsCi0JCQkgICAgICBwaS0+cnNzaWNhbF9jYWNoZS5yc3NpY2FsX3BoeXJlZ3NfNUdbNF0pOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDFhYSwKLQkJCSAgICAgIHBpLT5yc3NpY2FsX2NhY2hlLnJzc2ljYWxfcGh5cmVnc181R1s1XSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MWIwLAotCQkJICAgICAgcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9waHlyZWdzXzVHWzZdKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxYjYsCi0JCQkgICAgICBwaS0+cnNzaWNhbF9jYWNoZS5yc3NpY2FsX3BoeXJlZ3NfNUdbN10pOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDFhNSwKLQkJCSAgICAgIHBpLT5yc3NpY2FsX2NhY2hlLnJzc2ljYWxfcGh5cmVnc181R1s4XSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MWFiLAotCQkJICAgICAgcGktPnJzc2ljYWxfY2FjaGUucnNzaWNhbF9waHlyZWdzXzVHWzldKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxYjEsCi0JCQkgICAgICBwaS0+cnNzaWNhbF9jYWNoZS5yc3NpY2FsX3BoeXJlZ3NfNUdbMTBdKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxYjcsCi0JCQkgICAgICBwaS0+cnNzaWNhbF9jYWNoZS5yc3NpY2FsX3BoeXJlZ3NfNUdbMTFdKTsKLQl9Ci19Ci0KLXN0YXRpYyB1MTYKLXdsY19waHlfZ2VuX2xvYWRfc2FtcGxlc19ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1MzIgZl9rSHosIHUxNiBtYXhfdmFsLAotCQkJICAgICAgdTggZGFjX3Rlc3RfbW9kZSkKLXsKLQl1OCBwaHlfYncsIGlzX3BoeWJ3NDA7Ci0JdTE2IG51bV9zYW1wcywgdCwgc3B1cjsKLQlmaXhlZCB0aGV0YSA9IDAsIHJvdCA9IDA7Ci0JdTMyIHRibF9sZW47Ci0JY3MzMiAqdG9uZV9idWYgPSBOVUxMOwotCi0JaXNfcGh5Ync0MCA9IENIU1BFQ19JUzQwKHBpLT5yYWRpb19jaGFuc3BlYyk7Ci0JcGh5X2J3ID0gKGlzX3BoeWJ3NDAgPT0gMSkgPyA0MCA6IDIwOwotCXRibF9sZW4gPSAocGh5X2J3IDw8IDMpOwotCi0JaWYgKGRhY190ZXN0X21vZGUgPT0gMSkgewotCQlzcHVyID0gcmVhZF9waHlfcmVnKHBpLCAweDAxKTsKLQkJc3B1ciA9IChzcHVyID4+IDE1KSAmIDE7Ci0JCXBoeV9idyA9IChzcHVyID09IDEpID8gODIgOiA4MDsKLQkJcGh5X2J3ID0gKGlzX3BoeWJ3NDAgPT0gMSkgPyAocGh5X2J3IDw8IDEpIDogcGh5X2J3OwotCi0JCXRibF9sZW4gPSAocGh5X2J3IDw8IDEpOwotCX0KLQotCXRvbmVfYnVmID0ga21hbGxvYyhzaXplb2YoY3MzMikgKiB0YmxfbGVuLCBHRlBfQVRPTUlDKTsKLQlpZiAodG9uZV9idWYgPT0gTlVMTCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQludW1fc2FtcHMgPSAodTE2KSB0YmxfbGVuOwotCXJvdCA9IEZJWEVEKChmX2tIeiAqIDM2KSAvIHBoeV9idykgLyAxMDA7Ci0JdGhldGEgPSAwOwotCi0JZm9yICh0ID0gMDsgdCA8IG51bV9zYW1wczsgdCsrKSB7Ci0KLQkJd2xjX3BoeV9jb3JkaWModGhldGEsICZ0b25lX2J1Zlt0XSk7Ci0KLQkJdGhldGEgKz0gcm90OwotCi0JCXRvbmVfYnVmW3RdLnEgPSAoczMyKSBGTE9BVCh0b25lX2J1Zlt0XS5xICogbWF4X3ZhbCk7Ci0JCXRvbmVfYnVmW3RdLmkgPSAoczMyKSBGTE9BVCh0b25lX2J1Zlt0XS5pICogbWF4X3ZhbCk7Ci0JfQotCi0Jd2xjX3BoeV9sb2Fkc2FtcGxldGFibGVfbnBoeShwaSwgdG9uZV9idWYsIG51bV9zYW1wcyk7Ci0KLQlrZnJlZSh0b25lX2J1Zik7Ci0KLQlyZXR1cm4gbnVtX3NhbXBzOwotfQotCi1pbnQKLXdsY19waHlfdHhfdG9uZV9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1MzIgZl9rSHosIHUxNiBtYXhfdmFsLAotCQkgICAgIHU4IGlxbW9kZSwgdTggZGFjX3Rlc3RfbW9kZSwgYm9vbCBtb2RpZnlfYmJtdWx0KQotewotCXUxNiBudW1fc2FtcHM7Ci0JdTE2IGxvb3BzID0gMHhmZmZmOwotCXUxNiB3YWl0ID0gMDsKLQotCW51bV9zYW1wcyA9Ci0JCXdsY19waHlfZ2VuX2xvYWRfc2FtcGxlc19ucGh5KHBpLCBmX2tIeiwgbWF4X3ZhbCwgZGFjX3Rlc3RfbW9kZSk7Ci0JaWYgKG51bV9zYW1wcyA9PSAwKSB7Ci0JCXJldHVybiAtRUJBREU7Ci0JfQotCi0Jd2xjX3BoeV9ydW5zYW1wbGVzX25waHkocGksIG51bV9zYW1wcywgbG9vcHMsIHdhaXQsIGlxbW9kZSwKLQkJCQlkYWNfdGVzdF9tb2RlLCBtb2RpZnlfYmJtdWx0KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZAotd2xjX3BoeV9sb2Fkc2FtcGxldGFibGVfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgY3MzMiAqdG9uZV9idWYsCi0JCQkgICAgIHUxNiBudW1fc2FtcHMpCi17Ci0JdTE2IHQ7Ci0JdTMyICpkYXRhX2J1ZiA9IE5VTEw7Ci0KLQlkYXRhX2J1ZiA9IGttYWxsb2Moc2l6ZW9mKHUzMikgKiBudW1fc2FtcHMsIEdGUF9BVE9NSUMpOwotCWlmIChkYXRhX2J1ZiA9PSBOVUxMKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocGktPnBoeWhhbmdfYXZvaWQpCi0JCXdsY19waHlfc3RheV9pbl9jYXJyaWVyc2VhcmNoX25waHkocGksIHRydWUpOwotCi0JZm9yICh0ID0gMDsgdCA8IG51bV9zYW1wczsgdCsrKSB7Ci0JCWRhdGFfYnVmW3RdID0gKCgoKHVuc2lnbmVkIGludCl0b25lX2J1Zlt0XS5pKSAmIDB4M2ZmKSA8PCAxMCkgfAotCQkgICAgKCgodW5zaWduZWQgaW50KXRvbmVfYnVmW3RdLnEpICYgMHgzZmYpOwotCX0KLQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX1NBTVBMRVBMQVksIG51bV9zYW1wcywgMCwgMzIsCi0JCQkJIGRhdGFfYnVmKTsKLQotCWtmcmVlKGRhdGFfYnVmKTsKLQotCWlmIChwaS0+cGh5aGFuZ19hdm9pZCkKLQkJd2xjX3BoeV9zdGF5X2luX2NhcnJpZXJzZWFyY2hfbnBoeShwaSwgZmFsc2UpOwotfQotCi1zdGF0aWMgdm9pZAotd2xjX3BoeV9ydW5zYW1wbGVzX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBudW1fc2FtcHMsIHUxNiBsb29wcywKLQkJCXUxNiB3YWl0LCB1OCBpcW1vZGUsIHU4IGRhY190ZXN0X21vZGUsCi0JCQlib29sIG1vZGlmeV9iYm11bHQpCi17Ci0JdTE2IGJiX211bHQ7Ci0JdTggcGh5X2J3LCBzYW1wbGVfY21kOwotCXUxNiBvcmlnX1Jmc2VxQ29yZUFjdHY7Ci0JdTE2IGxwZl9id19jdGxfb3ZlcnJpZGUzLCBscGZfYndfY3RsX292ZXJyaWRlNCwgbHBmX2J3X2N0bF9taXNjcmVnMywKLQkgICAgbHBmX2J3X2N0bF9taXNjcmVnNDsKLQotCWlmIChwaS0+cGh5aGFuZ19hdm9pZCkKLQkJd2xjX3BoeV9zdGF5X2luX2NhcnJpZXJzZWFyY2hfbnBoeShwaSwgdHJ1ZSk7Ci0KLQlwaHlfYncgPSAyMDsKLQlpZiAoQ0hTUEVDX0lTNDAocGktPnJhZGlvX2NoYW5zcGVjKSkKLQkJcGh5X2J3ID0gNDA7Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQotCQlscGZfYndfY3RsX292ZXJyaWRlMyA9IHJlYWRfcGh5X3JlZyhwaSwgMHgzNDIpICYgKDB4MSA8PCA3KTsKLQkJbHBmX2J3X2N0bF9vdmVycmlkZTQgPSByZWFkX3BoeV9yZWcocGksIDB4MzQzKSAmICgweDEgPDwgNyk7Ci0JCWlmIChscGZfYndfY3RsX292ZXJyaWRlMyB8IGxwZl9id19jdGxfb3ZlcnJpZGU0KSB7Ci0JCQlscGZfYndfY3RsX21pc2NyZWczID0gcmVhZF9waHlfcmVnKHBpLCAweDM0MCkgJgotCQkJICAgICgweDcgPDwgOCk7Ci0JCQlscGZfYndfY3RsX21pc2NyZWc0ID0gcmVhZF9waHlfcmVnKHBpLCAweDM0MSkgJgotCQkJICAgICgweDcgPDwgOCk7Ci0JCX0gZWxzZSB7Ci0JCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksCi0JCQkJCQkJICAoMHgxIDw8IDcpLAotCQkJCQkJCSAgd2xjX3BoeV9yZWFkX2xwZl9id19jdGxfbnBoeQotCQkJCQkJCSAgKHBpLCAwKSwgMCwgMCwKLQkJCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDEpOwotCi0JCQlwaS0+bnBoeV9zYW1wbGVfcGxheV9scGZfYndfY3RsX292ciA9IHRydWU7Ci0KLQkJCWxwZl9id19jdGxfbWlzY3JlZzMgPSByZWFkX3BoeV9yZWcocGksIDB4MzQwKSAmCi0JCQkgICAgKDB4NyA8PCA4KTsKLQkJCWxwZl9id19jdGxfbWlzY3JlZzQgPSByZWFkX3BoeV9yZWcocGksIDB4MzQxKSAmCi0JCQkgICAgKDB4NyA8PCA4KTsKLQkJfQotCX0KLQotCWlmICgocGktPm5waHlfYmJfbXVsdF9zYXZlICYgQkJfTVVMVF9WQUxJRF9NQVNLKSA9PSAwKSB7Ci0KLQkJd2xjX3BoeV90YWJsZV9yZWFkX25waHkocGksIE5QSFlfVEJMX0lEX0lRTE9DQUwsIDEsIDg3LCAxNiwKLQkJCQkJJmJiX211bHQpOwotCQlwaS0+bnBoeV9iYl9tdWx0X3NhdmUgPQotCQkgICAgQkJfTVVMVF9WQUxJRF9NQVNLIHwgKGJiX211bHQgJiBCQl9NVUxUX01BU0spOwotCX0KLQotCWlmIChtb2RpZnlfYmJtdWx0KSB7Ci0JCWJiX211bHQgPSAocGh5X2J3ID09IDIwKSA/IDEwMCA6IDcxOwotCQliYl9tdWx0ID0gKGJiX211bHQgPDwgOCkgKyBiYl9tdWx0OwotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0lRTE9DQUwsIDEsIDg3LCAxNiwKLQkJCQkJICZiYl9tdWx0KTsKLQl9Ci0KLQlpZiAocGktPnBoeWhhbmdfYXZvaWQpCi0JCXdsY19waHlfc3RheV9pbl9jYXJyaWVyc2VhcmNoX25waHkocGksIGZhbHNlKTsKLQotCXdyaXRlX3BoeV9yZWcocGksIDB4YzYsIG51bV9zYW1wcyAtIDEpOwotCi0JaWYgKGxvb3BzICE9IDB4ZmZmZikgewotCQl3cml0ZV9waHlfcmVnKHBpLCAweGM0LCBsb29wcyAtIDEpOwotCX0gZWxzZSB7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4YzQsIGxvb3BzKTsKLQl9Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHhjNSwgd2FpdCk7Ci0KLQlvcmlnX1Jmc2VxQ29yZUFjdHYgPSByZWFkX3BoeV9yZWcocGksIDB4YTEpOwotCW9yX3BoeV9yZWcocGksIDB4YTEsIE5QSFlfUmZzZXFNb2RlX0NvcmVBY3R2X292ZXJyaWRlKTsKLQlpZiAoaXFtb2RlKSB7Ci0KLQkJYW5kX3BoeV9yZWcocGksIDB4YzIsIDB4N0ZGRik7Ci0KLQkJb3JfcGh5X3JlZyhwaSwgMHhjMiwgMHg4MDAwKTsKLQl9IGVsc2UgewotCi0JCXNhbXBsZV9jbWQgPSAoZGFjX3Rlc3RfbW9kZSA9PSAxKSA/IDB4NSA6IDB4MTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHhjMywgc2FtcGxlX2NtZCk7Ci0JfQotCi0JU1BJTldBSVQoKChyZWFkX3BoeV9yZWcocGksIDB4YTQpICYgMHgxKSA9PSAxKSwgMTAwMCk7Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCAweGExLCBvcmlnX1Jmc2VxQ29yZUFjdHYpOwotfQotCi12b2lkIHdsY19waHlfc3RvcHBsYXliYWNrX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JdTE2IHBsYXliYWNrX3N0YXR1czsKLQl1MTYgYmJfbXVsdDsKLQotCWlmIChwaS0+cGh5aGFuZ19hdm9pZCkKLQkJd2xjX3BoeV9zdGF5X2luX2NhcnJpZXJzZWFyY2hfbnBoeShwaSwgdHJ1ZSk7Ci0KLQlwbGF5YmFja19zdGF0dXMgPSByZWFkX3BoeV9yZWcocGksIDB4YzcpOwotCWlmIChwbGF5YmFja19zdGF0dXMgJiAweDEpIHsKLQkJb3JfcGh5X3JlZyhwaSwgMHhjMywgTlBIWV9zYW1wbGVDbWRfU1RPUCk7Ci0JfSBlbHNlIGlmIChwbGF5YmFja19zdGF0dXMgJiAweDIpIHsKLQotCQlhbmRfcGh5X3JlZyhwaSwgMHhjMiwKLQkJCSAgICAodTE2KSB+TlBIWV9pcWxvQ2FsQ21kR2N0bF9JUUxPX0NBTF9FTik7Ci0JfQotCi0JYW5kX3BoeV9yZWcocGksIDB4YzMsICh1MTYpIH4oMHgxIDw8IDIpKTsKLQotCWlmICgocGktPm5waHlfYmJfbXVsdF9zYXZlICYgQkJfTVVMVF9WQUxJRF9NQVNLKSAhPSAwKSB7Ci0KLQkJYmJfbXVsdCA9IHBpLT5ucGh5X2JiX211bHRfc2F2ZSAmIEJCX01VTFRfTUFTSzsKLQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9JUUxPQ0FMLCAxLCA4NywgMTYsCi0JCQkJCSAmYmJfbXVsdCk7Ci0KLQkJcGktPm5waHlfYmJfbXVsdF9zYXZlID0gMDsKLQl9Ci0KLQlpZiAoTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgNykgfHwgTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgOCkpIHsKLQkJaWYgKHBpLT5ucGh5X3NhbXBsZV9wbGF5X2xwZl9id19jdGxfb3ZyKSB7Ci0JCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksCi0JCQkJCQkJICAoMHgxIDw8IDcpLAotCQkJCQkJCSAgMCwgMCwgMSwKLQkJCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDEpOwotCQkJcGktPm5waHlfc2FtcGxlX3BsYXlfbHBmX2J3X2N0bF9vdnIgPSBmYWxzZTsKLQkJfQotCX0KLQotCWlmIChwaS0+cGh5aGFuZ19hdm9pZCkKLQkJd2xjX3BoeV9zdGF5X2luX2NhcnJpZXJzZWFyY2hfbnBoeShwaSwgZmFsc2UpOwotfQotCi1zdHJ1Y3QgbnBoeV90eGdhaW5zIHdsY19waHlfZ2V0X3R4X2dhaW5fbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQl1MTYgYmFzZV9pZHhbMl0sIGN1cnJfZ2FpblsyXTsKLQl1OCBjb3JlX25vOwotCXN0cnVjdCBucGh5X3R4Z2FpbnMgdGFyZ2V0X2dhaW47Ci0JdTMyICp0eF9wd3JjdHJsX3RibCA9IE5VTEw7Ci0KLQlpZiAocGktPm5waHlfdHhwd3JjdHJsID09IFBIWV9UUENfSFdfT0ZGKSB7Ci0JCWlmIChwaS0+cGh5aGFuZ19hdm9pZCkKLQkJCXdsY19waHlfc3RheV9pbl9jYXJyaWVyc2VhcmNoX25waHkocGksIHRydWUpOwotCi0JCXdsY19waHlfdGFibGVfcmVhZF9ucGh5KHBpLCBOUEhZX1RCTF9JRF9SRlNFUSwgMiwgMHgxMTAsIDE2LAotCQkJCQljdXJyX2dhaW4pOwotCi0JCWlmIChwaS0+cGh5aGFuZ19hdm9pZCkKLQkJCXdsY19waHlfc3RheV9pbl9jYXJyaWVyc2VhcmNoX25waHkocGksIGZhbHNlKTsKLQotCQlmb3IgKGNvcmVfbm8gPSAwOyBjb3JlX25vIDwgMjsgY29yZV9ubysrKSB7Ci0JCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQkJCQl0YXJnZXRfZ2Fpbi5pcGFbY29yZV9ub10gPQotCQkJCSAgICBjdXJyX2dhaW5bY29yZV9ub10gJiAweDAwMDc7Ci0JCQkJdGFyZ2V0X2dhaW4ucGFkW2NvcmVfbm9dID0KLQkJCQkgICAgKChjdXJyX2dhaW5bY29yZV9ub10gJiAweDAwRjgpID4+IDMpOwotCQkJCXRhcmdldF9nYWluLnBnYVtjb3JlX25vXSA9Ci0JCQkJICAgICgoY3Vycl9nYWluW2NvcmVfbm9dICYgMHgwRjAwKSA+PiA4KTsKLQkJCQl0YXJnZXRfZ2Fpbi50eGdtW2NvcmVfbm9dID0KLQkJCQkgICAgKChjdXJyX2dhaW5bY29yZV9ub10gJiAweDcwMDApID4+IDEyKTsKLQkJCQl0YXJnZXRfZ2Fpbi50eGxwZltjb3JlX25vXSA9Ci0JCQkJICAgICgoY3Vycl9nYWluW2NvcmVfbm9dICYgMHg4MDAwKSA+PiAxNSk7Ci0JCQl9IGVsc2UgaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0JCQkJdGFyZ2V0X2dhaW4uaXBhW2NvcmVfbm9dID0KLQkJCQkgICAgY3Vycl9nYWluW2NvcmVfbm9dICYgMHgwMDBGOwotCQkJCXRhcmdldF9nYWluLnBhZFtjb3JlX25vXSA9Ci0JCQkJICAgICgoY3Vycl9nYWluW2NvcmVfbm9dICYgMHgwMEYwKSA+PiA0KTsKLQkJCQl0YXJnZXRfZ2Fpbi5wZ2FbY29yZV9ub10gPQotCQkJCSAgICAoKGN1cnJfZ2Fpbltjb3JlX25vXSAmIDB4MEYwMCkgPj4gOCk7Ci0JCQkJdGFyZ2V0X2dhaW4udHhnbVtjb3JlX25vXSA9Ci0JCQkJICAgICgoY3Vycl9nYWluW2NvcmVfbm9dICYgMHg3MDAwKSA+PiAxMik7Ci0JCQl9IGVsc2UgewotCQkJCXRhcmdldF9nYWluLmlwYVtjb3JlX25vXSA9Ci0JCQkJICAgIGN1cnJfZ2Fpbltjb3JlX25vXSAmIDB4MDAwMzsKLQkJCQl0YXJnZXRfZ2Fpbi5wYWRbY29yZV9ub10gPQotCQkJCSAgICAoKGN1cnJfZ2Fpbltjb3JlX25vXSAmIDB4MDAwQykgPj4gMik7Ci0JCQkJdGFyZ2V0X2dhaW4ucGdhW2NvcmVfbm9dID0KLQkJCQkgICAgKChjdXJyX2dhaW5bY29yZV9ub10gJiAweDAwNzApID4+IDQpOwotCQkJCXRhcmdldF9nYWluLnR4Z21bY29yZV9ub10gPQotCQkJCSAgICAoKGN1cnJfZ2Fpbltjb3JlX25vXSAmIDB4MDM4MCkgPj4gNyk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQl1aW50IHBoeXJldiA9IHBpLT5wdWJwaS5waHlfcmV2OwotCi0JCWJhc2VfaWR4WzBdID0gKHJlYWRfcGh5X3JlZyhwaSwgMHgxZWQpID4+IDgpICYgMHg3ZjsKLQkJYmFzZV9pZHhbMV0gPSAocmVhZF9waHlfcmVnKHBpLCAweDFlZSkgPj4gOCkgJiAweDdmOwotCQlmb3IgKGNvcmVfbm8gPSAwOyBjb3JlX25vIDwgMjsgY29yZV9ubysrKSB7Ci0JCQlpZiAoTlJFVl9HRShwaHlyZXYsIDMpKSB7Ci0JCQkJaWYgKFBIWV9JUEEocGkpKSB7Ci0JCQkJCXR4X3B3cmN0cmxfdGJsID0KLQkJCQkJICAgIHdsY19waHlfZ2V0X2lwYV9nYWludGJsX25waHkocGkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChDSFNQRUNfSVM1RyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQkJCQlpZiAoTlJFVl9JUyhwaHlyZXYsIDMpKSB7Ci0JCQkJCQkJdHhfcHdyY3RybF90YmwgPQotCQkJCQkJCSAgICBucGh5X3RwY181R0h6X3R4Z2Fpbl9yZXYzOwotCQkJCQkJfSBlbHNlIGlmIChOUkVWX0lTKHBoeXJldiwgNCkpIHsKLQkJCQkJCQl0eF9wd3JjdHJsX3RibCA9Ci0JCQkJCQkJICAgIChwaS0+c3JvbV9mZW01Zy4KLQkJCQkJCQkgICAgIGV4dHBhZ2FpbiA9PQotCQkJCQkJCSAgICAgMykgPwotCQkJCQkJCSAgICBucGh5X3RwY181R0h6X3R4Z2Fpbl9IaVB3ckVQQQotCQkJCQkJCSAgICA6Ci0JCQkJCQkJICAgIG5waHlfdHBjXzVHSHpfdHhnYWluX3JldjQ7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXR4X3B3cmN0cmxfdGJsID0KLQkJCQkJCQkgICAgbnBoeV90cGNfNUdIel90eGdhaW5fcmV2NTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmIChOUkVWX0dFKHBoeXJldiwgNykpIHsKLQkJCQkJCQlpZiAocGktPnB1YnBpLgotCQkJCQkJCSAgICByYWRpb3JldiA9PSAzKSB7Ci0JCQkJCQkJCXR4X3B3cmN0cmxfdGJsID0KLQkJCQkJCQkJICAgIG5waHlfdHBjX3R4Z2Fpbl9lcGFfMjA1N3JldjM7Ci0JCQkJCQkJfSBlbHNlIGlmIChwaS0+cHVicGkuCi0JCQkJCQkJCSAgIHJhZGlvcmV2ID09Ci0JCQkJCQkJCSAgIDUpIHsKLQkJCQkJCQkJdHhfcHdyY3RybF90YmwgPQotCQkJCQkJCQkgICAgbnBoeV90cGNfdHhnYWluX2VwYV8yMDU3cmV2NTsKLQkJCQkJCQl9Ci0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJaWYgKE5SRVZfR0UocGh5cmV2LCA1KQotCQkJCQkJCSAgICAmJiAocGktPnNyb21fZmVtMmcuCi0JCQkJCQkJCWV4dHBhZ2FpbiA9PQotCQkJCQkJCQkzKSkgewotCQkJCQkJCQl0eF9wd3JjdHJsX3RibCA9Ci0JCQkJCQkJCSAgICBucGh5X3RwY190eGdhaW5fSGlQd3JFUEE7Ci0JCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQkJdHhfcHdyY3RybF90YmwgPQotCQkJCQkJCQkgICAgbnBoeV90cGNfdHhnYWluX3JldjM7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChOUkVWX0dFKHBoeXJldiwgNykpIHsKLQkJCQkJdGFyZ2V0X2dhaW4uaXBhW2NvcmVfbm9dID0KLQkJCQkJICAgICh0eF9wd3JjdHJsX3RibFtiYXNlX2lkeFtjb3JlX25vXV0KLQkJCQkJICAgICA+PiAxNikgJiAweDc7Ci0JCQkJCXRhcmdldF9nYWluLnBhZFtjb3JlX25vXSA9Ci0JCQkJCSAgICAodHhfcHdyY3RybF90YmxbYmFzZV9pZHhbY29yZV9ub11dCi0JCQkJCSAgICAgPj4gMTkpICYgMHgxZjsKLQkJCQkJdGFyZ2V0X2dhaW4ucGdhW2NvcmVfbm9dID0KLQkJCQkJICAgICh0eF9wd3JjdHJsX3RibFtiYXNlX2lkeFtjb3JlX25vXV0KLQkJCQkJICAgICA+PiAyNCkgJiAweGY7Ci0JCQkJCXRhcmdldF9nYWluLnR4Z21bY29yZV9ub10gPQotCQkJCQkgICAgKHR4X3B3cmN0cmxfdGJsW2Jhc2VfaWR4W2NvcmVfbm9dXQotCQkJCQkgICAgID4+IDI4KSAmIDB4NzsKLQkJCQkJdGFyZ2V0X2dhaW4udHhscGZbY29yZV9ub10gPQotCQkJCQkgICAgKHR4X3B3cmN0cmxfdGJsW2Jhc2VfaWR4W2NvcmVfbm9dXQotCQkJCQkgICAgID4+IDMxKSAmIDB4MTsKLQkJCQl9IGVsc2UgewotCQkJCQl0YXJnZXRfZ2Fpbi5pcGFbY29yZV9ub10gPQotCQkJCQkgICAgKHR4X3B3cmN0cmxfdGJsW2Jhc2VfaWR4W2NvcmVfbm9dXQotCQkJCQkgICAgID4+IDE2KSAmIDB4ZjsKLQkJCQkJdGFyZ2V0X2dhaW4ucGFkW2NvcmVfbm9dID0KLQkJCQkJICAgICh0eF9wd3JjdHJsX3RibFtiYXNlX2lkeFtjb3JlX25vXV0KLQkJCQkJICAgICA+PiAyMCkgJiAweGY7Ci0JCQkJCXRhcmdldF9nYWluLnBnYVtjb3JlX25vXSA9Ci0JCQkJCSAgICAodHhfcHdyY3RybF90YmxbYmFzZV9pZHhbY29yZV9ub11dCi0JCQkJCSAgICAgPj4gMjQpICYgMHhmOwotCQkJCQl0YXJnZXRfZ2Fpbi50eGdtW2NvcmVfbm9dID0KLQkJCQkJICAgICh0eF9wd3JjdHJsX3RibFtiYXNlX2lkeFtjb3JlX25vXV0KLQkJCQkJICAgICA+PiAyOCkgJiAweDc7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQl0YXJnZXRfZ2Fpbi5pcGFbY29yZV9ub10gPQotCQkJCSAgICAobnBoeV90cGNfdHhnYWluW2Jhc2VfaWR4W2NvcmVfbm9dXSA+PiAxNikgJgotCQkJCSAgICAweDM7Ci0JCQkJdGFyZ2V0X2dhaW4ucGFkW2NvcmVfbm9dID0KLQkJCQkgICAgKG5waHlfdHBjX3R4Z2FpbltiYXNlX2lkeFtjb3JlX25vXV0gPj4gMTgpICYKLQkJCQkgICAgMHgzOwotCQkJCXRhcmdldF9nYWluLnBnYVtjb3JlX25vXSA9Ci0JCQkJICAgIChucGh5X3RwY190eGdhaW5bYmFzZV9pZHhbY29yZV9ub11dID4+IDIwKSAmCi0JCQkJICAgIDB4NzsKLQkJCQl0YXJnZXRfZ2Fpbi50eGdtW2NvcmVfbm9dID0KLQkJCQkgICAgKG5waHlfdHBjX3R4Z2FpbltiYXNlX2lkeFtjb3JlX25vXV0gPj4gMjMpICYKLQkJCQkgICAgMHg3OwotCQkJfQotCQl9Ci0JfQotCi0JcmV0dXJuIHRhcmdldF9nYWluOwotfQotCi1zdGF0aWMgdm9pZAotd2xjX3BoeV9pcWNhbF9nYWlucGFyYW1zX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBjb3JlX25vLAotCQkJICAgICAgc3RydWN0IG5waHlfdHhnYWlucyB0YXJnZXRfZ2FpbiwKLQkJCSAgICAgIHN0cnVjdCBucGh5X2lxY2FsX3BhcmFtcyAqcGFyYW1zKQotewotCXU4IGs7Ci0JaW50IGlkeDsKLQl1MTYgZ2Fpbl9pbmRleDsKLQl1OCBiYW5kX2lkeCA9IChDSFNQRUNfSVM1RyhwaS0+cmFkaW9fY2hhbnNwZWMpID8gMSA6IDApOwotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0JCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCQkJcGFyYW1zLT50eGxwZiA9IHRhcmdldF9nYWluLnR4bHBmW2NvcmVfbm9dOwotCQl9Ci0JCXBhcmFtcy0+dHhnbSA9IHRhcmdldF9nYWluLnR4Z21bY29yZV9ub107Ci0JCXBhcmFtcy0+cGdhID0gdGFyZ2V0X2dhaW4ucGdhW2NvcmVfbm9dOwotCQlwYXJhbXMtPnBhZCA9IHRhcmdldF9nYWluLnBhZFtjb3JlX25vXTsKLQkJcGFyYW1zLT5pcGEgPSB0YXJnZXRfZ2Fpbi5pcGFbY29yZV9ub107Ci0JCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCQkJcGFyYW1zLT5jYWxfZ2FpbiA9Ci0JCQkgICAgKChwYXJhbXMtPnR4bHBmIDw8IDE1KSB8IChwYXJhbXMtPgotCQkJCQkJICAgICAgdHhnbSA8PCAxMikgfCAocGFyYW1zLT4KLQkJCQkJCQkJICAgICBwZ2EgPDwgOCkgfAotCQkJICAgICAocGFyYW1zLT5wYWQgPDwgMykgfCAocGFyYW1zLT5pcGEpKTsKLQkJfSBlbHNlIHsKLQkJCXBhcmFtcy0+Y2FsX2dhaW4gPQotCQkJICAgICgocGFyYW1zLT50eGdtIDw8IDEyKSB8IChwYXJhbXMtPgotCQkJCQkJICAgICBwZ2EgPDwgOCkgfCAocGFyYW1zLT4KLQkJCQkJCQkJICBwYWQgPDwgNCkgfAotCQkJICAgICAocGFyYW1zLT5pcGEpKTsKLQkJfQotCQlwYXJhbXMtPm5jb3JyWzBdID0gMHg3OTsKLQkJcGFyYW1zLT5uY29yclsxXSA9IDB4Nzk7Ci0JCXBhcmFtcy0+bmNvcnJbMl0gPSAweDc5OwotCQlwYXJhbXMtPm5jb3JyWzNdID0gMHg3OTsKLQkJcGFyYW1zLT5uY29ycls0XSA9IDB4Nzk7Ci0JfSBlbHNlIHsKLQotCQlnYWluX2luZGV4ID0gKCh0YXJnZXRfZ2Fpbi5wYWRbY29yZV9ub10gPDwgMCkgfAotCQkJICAgICAgKHRhcmdldF9nYWluLnBnYVtjb3JlX25vXSA8PCA0KSB8ICh0YXJnZXRfZ2Fpbi4KLQkJCQkJCQkJIHR4Z21bY29yZV9ub10KLQkJCQkJCQkJIDw8IDgpKTsKLQotCQlpZHggPSAtMTsKLQkJZm9yIChrID0gMDsgayA8IE5QSFlfSVFDQUxfTlVNR0FJTlM7IGsrKykgewotCQkJaWYgKHRibF9pcWNhbF9nYWlucGFyYW1zX25waHlbYmFuZF9pZHhdW2tdWzBdID09Ci0JCQkgICAgZ2Fpbl9pbmRleCkgewotCQkJCWlkeCA9IGs7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlwYXJhbXMtPnR4Z20gPSB0YmxfaXFjYWxfZ2FpbnBhcmFtc19ucGh5W2JhbmRfaWR4XVtrXVsxXTsKLQkJcGFyYW1zLT5wZ2EgPSB0YmxfaXFjYWxfZ2FpbnBhcmFtc19ucGh5W2JhbmRfaWR4XVtrXVsyXTsKLQkJcGFyYW1zLT5wYWQgPSB0YmxfaXFjYWxfZ2FpbnBhcmFtc19ucGh5W2JhbmRfaWR4XVtrXVszXTsKLQkJcGFyYW1zLT5jYWxfZ2FpbiA9ICgocGFyYW1zLT50eGdtIDw8IDcpIHwgKHBhcmFtcy0+cGdhIDw8IDQpIHwKLQkJCQkgICAgKHBhcmFtcy0+cGFkIDw8IDIpKTsKLQkJcGFyYW1zLT5uY29yclswXSA9IHRibF9pcWNhbF9nYWlucGFyYW1zX25waHlbYmFuZF9pZHhdW2tdWzRdOwotCQlwYXJhbXMtPm5jb3JyWzFdID0gdGJsX2lxY2FsX2dhaW5wYXJhbXNfbnBoeVtiYW5kX2lkeF1ba11bNV07Ci0JCXBhcmFtcy0+bmNvcnJbMl0gPSB0YmxfaXFjYWxfZ2FpbnBhcmFtc19ucGh5W2JhbmRfaWR4XVtrXVs2XTsKLQkJcGFyYW1zLT5uY29yclszXSA9IHRibF9pcWNhbF9nYWlucGFyYW1zX25waHlbYmFuZF9pZHhdW2tdWzddOwotCX0KLX0KLQotc3RhdGljIHZvaWQgd2xjX3BoeV90eGNhbF9yYWRpb19zZXR1cF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXUxNiBqdGFnX2NvcmUsIGNvcmU7Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQotCQlmb3IgKGNvcmUgPSAwOyBjb3JlIDw9IDE7IGNvcmUrKykgewotCi0JCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWyhjb3JlICogMTEpICsgMF0gPQotCQkJICAgIFJFQURfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIGNvcmUsCi0JCQkJCSAgICBUWF9TU0lfTUFTVEVSKTsKLQotCQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1soY29yZSAqIDExKSArIDFdID0KLQkJCSAgICBSRUFEX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLCBjb3JlLAotCQkJCQkgICAgSVFDQUxfVkNNX0hHKTsKLQotCQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1soY29yZSAqIDExKSArIDJdID0KLQkJCSAgICBSRUFEX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLCBjb3JlLAotCQkJCQkgICAgSVFDQUxfSURBQyk7Ci0KLQkJCXBpLT50eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbKGNvcmUgKiAxMSkgKyAzXSA9Ci0JCQkgICAgUkVBRF9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwgY29yZSwgVFNTSV9WQ00pOwotCi0JCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWyhjb3JlICogMTEpICsgNF0gPSAwOwotCi0JCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWyhjb3JlICogMTEpICsgNV0gPQotCQkJICAgIFJFQURfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIGNvcmUsCi0JCQkJCSAgICBUWF9TU0lfTVVYKTsKLQotCQkJaWYgKHBpLT5wdWJwaS5yYWRpb3JldiAhPSA1KQotCQkJCXBpLT50eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbKGNvcmUgKiAxMSkgKyA2XSA9Ci0JCQkJICAgIFJFQURfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIGNvcmUsCi0JCQkJCQkgICAgVFNTSUEpOwotCi0JCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWyhjb3JlICogMTEpICsgN10gPQotCQkJICAgIFJFQURfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIGNvcmUsIFRTU0lHKTsKLQotCQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1soY29yZSAqIDExKSArIDhdID0KLQkJCSAgICBSRUFEX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLCBjb3JlLAotCQkJCQkgICAgVFNTSV9NSVNDMSk7Ci0KLQkJCWlmIChDSFNQRUNfSVM1RyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQkJV1JJVEVfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIGNvcmUsCi0JCQkJCQkgVFhfU1NJX01BU1RFUiwgMHgwYSk7Ci0JCQkJV1JJVEVfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIGNvcmUsCi0JCQkJCQkgSVFDQUxfVkNNX0hHLCAweDQzKTsKLQkJCQlXUklURV9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwgY29yZSwKLQkJCQkJCSBJUUNBTF9JREFDLCAweDU1KTsKLQkJCQlXUklURV9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwgY29yZSwKLQkJCQkJCSBUU1NJX1ZDTSwgMHgwMCk7Ci0JCQkJV1JJVEVfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIGNvcmUsCi0JCQkJCQkgVFNTSUcsIDB4MDApOwotCQkJCWlmIChwaS0+dXNlX2ludF90eF9pcWxvX2NhbF9ucGh5KSB7Ci0JCQkJCVdSSVRFX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLAotCQkJCQkJCSBjb3JlLCBUWF9TU0lfTVVYLCAweDQpOwotCQkJCQlpZiAoIQotCQkJCQkgICAgKHBpLT4KLQkJCQkJICAgICBpbnRlcm5hbF90eF9pcWxvX2NhbF90YXBvZmZfaW50cGFfbnBoeSkpIHsKLQotCQkJCQkJV1JJVEVfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywKLQkJCQkJCQkJIFRYLCBjb3JlLAotCQkJCQkJCQkgVFNTSUEsIDB4MzEpOwotCQkJCQl9IGVsc2UgewotCi0JCQkJCQlXUklURV9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LAotCQkJCQkJCQkgVFgsIGNvcmUsCi0JCQkJCQkJCSBUU1NJQSwgMHgyMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJV1JJVEVfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIGNvcmUsCi0JCQkJCQkgVFNTSV9NSVNDMSwgMHgwMCk7Ci0JCQl9IGVsc2UgewotCQkJCVdSSVRFX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLCBjb3JlLAotCQkJCQkJIFRYX1NTSV9NQVNURVIsIDB4MDYpOwotCQkJCVdSSVRFX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLCBjb3JlLAotCQkJCQkJIElRQ0FMX1ZDTV9IRywgMHg0Myk7Ci0JCQkJV1JJVEVfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIGNvcmUsCi0JCQkJCQkgSVFDQUxfSURBQywgMHg1NSk7Ci0JCQkJV1JJVEVfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIGNvcmUsCi0JCQkJCQkgVFNTSV9WQ00sIDB4MDApOwotCi0JCQkJaWYgKHBpLT5wdWJwaS5yYWRpb3JldiAhPSA1KQotCQkJCQlXUklURV9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwKLQkJCQkJCQkgY29yZSwgVFNTSUEsIDB4MDApOwotCQkJCWlmIChwaS0+dXNlX2ludF90eF9pcWxvX2NhbF9ucGh5KSB7Ci0JCQkJCVdSSVRFX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLAotCQkJCQkJCSBjb3JlLCBUWF9TU0lfTVVYLAotCQkJCQkJCSAweDA2KTsKLQkJCQkJaWYgKCEKLQkJCQkJICAgIChwaS0+Ci0JCQkJCSAgICAgaW50ZXJuYWxfdHhfaXFsb19jYWxfdGFwb2ZmX2ludHBhX25waHkpKSB7Ci0KLQkJCQkJCVdSSVRFX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsCi0JCQkJCQkJCSBUWCwgY29yZSwKLQkJCQkJCQkJIFRTU0lHLCAweDMxKTsKLQkJCQkJfSBlbHNlIHsKLQotCQkJCQkJV1JJVEVfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywKLQkJCQkJCQkJIFRYLCBjb3JlLAotCQkJCQkJCQkgVFNTSUcsIDB4MjEpOwotCQkJCQl9Ci0JCQkJfQotCQkJCVdSSVRFX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLCBjb3JlLAotCQkJCQkJIFRTU0lfTUlTQzEsIDB4MDApOwotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCi0JCWZvciAoY29yZSA9IDA7IGNvcmUgPD0gMTsgY29yZSsrKSB7Ci0JCQlqdGFnX2NvcmUgPQotCQkJICAgIChjb3JlID09Ci0JCQkgICAgIFBIWV9DT1JFXzApID8gUkFESU9fMjA1Nl9UWDAgOiBSQURJT18yMDU2X1RYMTsKLQotCQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1soY29yZSAqIDExKSArIDBdID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwKLQkJCQkJICAgUkFESU9fMjA1Nl9UWF9UWF9TU0lfTUFTVEVSIHwKLQkJCQkJICAganRhZ19jb3JlKTsKLQotCQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1soY29yZSAqIDExKSArIDFdID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwKLQkJCQkJICAgUkFESU9fMjA1Nl9UWF9JUUNBTF9WQ01fSEcgfAotCQkJCQkgICBqdGFnX2NvcmUpOwotCi0JCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWyhjb3JlICogMTEpICsgMl0gPQotCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkgICBSQURJT18yMDU2X1RYX0lRQ0FMX0lEQUMgfAotCQkJCQkgICBqdGFnX2NvcmUpOwotCi0JCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWyhjb3JlICogMTEpICsgM10gPQotCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkgICBSQURJT18yMDU2X1RYX1RTU0lfVkNNIHwganRhZ19jb3JlKTsKLQotCQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1soY29yZSAqIDExKSArIDRdID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwKLQkJCQkJICAgUkFESU9fMjA1Nl9UWF9UWF9BTVBfREVUIHwKLQkJCQkJICAganRhZ19jb3JlKTsKLQotCQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1soY29yZSAqIDExKSArIDVdID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwKLQkJCQkJICAgUkFESU9fMjA1Nl9UWF9UWF9TU0lfTVVYIHwKLQkJCQkJICAganRhZ19jb3JlKTsKLQotCQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1soY29yZSAqIDExKSArIDZdID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9UWF9UU1NJQSB8IGp0YWdfY29yZSk7Ci0KLQkJCXBpLT50eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbKGNvcmUgKiAxMSkgKyA3XSA9Ci0JCQkgICAgcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfVFhfVFNTSUcgfCBqdGFnX2NvcmUpOwotCi0JCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWyhjb3JlICogMTEpICsgOF0gPQotCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkgICBSQURJT18yMDU2X1RYX1RTU0lfTUlTQzEgfAotCQkJCQkgICBqdGFnX2NvcmUpOwotCi0JCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWyhjb3JlICogMTEpICsgOV0gPQotCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkgICBSQURJT18yMDU2X1RYX1RTU0lfTUlTQzIgfAotCQkJCQkgICBqdGFnX2NvcmUpOwotCi0JCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWyhjb3JlICogMTEpICsgMTBdID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwKLQkJCQkJICAgUkFESU9fMjA1Nl9UWF9UU1NJX01JU0MzIHwKLQkJCQkJICAganRhZ19jb3JlKTsKLQotCQkJaWYgKENIU1BFQ19JUzVHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQlSQURJT18yMDU2X1RYX1RYX1NTSV9NQVNURVIgfAotCQkJCQkJanRhZ19jb3JlLCAweDBhKTsKLQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQlSQURJT18yMDU2X1RYX0lRQ0FMX1ZDTV9IRyB8Ci0JCQkJCQlqdGFnX2NvcmUsIDB4NDApOwotCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCVJBRElPXzIwNTZfVFhfSVFDQUxfSURBQyB8Ci0JCQkJCQlqdGFnX2NvcmUsIDB4NTUpOwotCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCVJBRElPXzIwNTZfVFhfVFNTSV9WQ00gfAotCQkJCQkJanRhZ19jb3JlLCAweDAwKTsKLQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQlSQURJT18yMDU2X1RYX1RYX0FNUF9ERVQgfAotCQkJCQkJanRhZ19jb3JlLCAweDAwKTsKLQotCQkJCWlmIChQSFlfSVBBKHBpKSkgewotCQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQkJUkFESU9fMjA1Nl9UWF9UWF9TU0lfTVVYCi0JCQkJCQkJfCBqdGFnX2NvcmUsIDB4NCk7Ci0JCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCQlSQURJT18yMDU2X1RYX1RTU0lBIHwKLQkJCQkJCQlqdGFnX2NvcmUsIDB4MSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJCVJBRElPXzIwNTZfVFhfVFhfU1NJX01VWAotCQkJCQkJCXwganRhZ19jb3JlLCAweDAwKTsKLQkJCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJCVJBRElPXzIwNTZfVFhfVFNTSUEgfAotCQkJCQkJCWp0YWdfY29yZSwgMHgyZik7Ci0JCQkJfQotCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCVJBRElPXzIwNTZfVFhfVFNTSUcgfCBqdGFnX2NvcmUsCi0JCQkJCQkweDAwKTsKLQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQlSQURJT18yMDU2X1RYX1RTU0lfTUlTQzEgfAotCQkJCQkJanRhZ19jb3JlLCAweDAwKTsKLQotCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCVJBRElPXzIwNTZfVFhfVFNTSV9NSVNDMiB8Ci0JCQkJCQlqdGFnX2NvcmUsIDB4MDApOwotCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCVJBRElPXzIwNTZfVFhfVFNTSV9NSVNDMyB8Ci0JCQkJCQlqdGFnX2NvcmUsIDB4MDApOwotCQkJfSBlbHNlIHsKLQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQlSQURJT18yMDU2X1RYX1RYX1NTSV9NQVNURVIgfAotCQkJCQkJanRhZ19jb3JlLCAweDA2KTsKLQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQlSQURJT18yMDU2X1RYX0lRQ0FMX1ZDTV9IRyB8Ci0JCQkJCQlqdGFnX2NvcmUsIDB4NDApOwotCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCVJBRElPXzIwNTZfVFhfSVFDQUxfSURBQyB8Ci0JCQkJCQlqdGFnX2NvcmUsIDB4NTUpOwotCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCVJBRElPXzIwNTZfVFhfVFNTSV9WQ00gfAotCQkJCQkJanRhZ19jb3JlLCAweDAwKTsKLQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQlSQURJT18yMDU2X1RYX1RYX0FNUF9ERVQgfAotCQkJCQkJanRhZ19jb3JlLCAweDAwKTsKLQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQlSQURJT18yMDU2X1RYX1RTU0lBIHwganRhZ19jb3JlLAotCQkJCQkJMHgwMCk7Ci0KLQkJCQlpZiAoUEhZX0lQQShwaSkpIHsKLQotCQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQkJUkFESU9fMjA1Nl9UWF9UWF9TU0lfTVVYCi0JCQkJCQkJfCBqdGFnX2NvcmUsIDB4MDYpOwotCQkJCQlpZiAoTlJFVl9MVChwaS0+cHVicGkucGh5X3JldiwgNSkpIHsKLQotCQkJCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJCQlSQURJT18yMDU2X1RYX1RTU0lHCi0JCQkJCQkJCXwganRhZ19jb3JlLAotCQkJCQkJCQkweDExKTsKLQkJCQkJfSBlbHNlIHsKLQotCQkJCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJCQlSQURJT18yMDU2X1RYX1RTU0lHCi0JCQkJCQkJCXwganRhZ19jb3JlLAotCQkJCQkJCQkweDEpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJCVJBRElPXzIwNTZfVFhfVFhfU1NJX01VWAotCQkJCQkJCXwganRhZ19jb3JlLCAweDAwKTsKLQkJCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJCVJBRElPXzIwNTZfVFhfVFNTSUcgfAotCQkJCQkJCWp0YWdfY29yZSwgMHgyMCk7Ci0JCQkJfQotCi0JCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJUkFESU9fMjA1Nl9UWF9UU1NJX01JU0MxIHwKLQkJCQkJCWp0YWdfY29yZSwgMHgwMCk7Ci0JCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJUkFESU9fMjA1Nl9UWF9UU1NJX01JU0MyIHwKLQkJCQkJCWp0YWdfY29yZSwgMHgwMCk7Ci0JCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJUkFESU9fMjA1Nl9UWF9UU1NJX01JU0MzIHwKLQkJCQkJCWp0YWdfY29yZSwgMHgwMCk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCi0JCXBpLT50eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbMF0gPQotCQkgICAgcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTFfVFhSRl9JUUNBTDEpOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTFfVFhSRl9JUUNBTDEsIDB4MjkpOwotCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWzFdID0KLQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUxX1RYUkZfSVFDQUwyKTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUxX1RYUkZfSVFDQUwyLCAweDU0KTsKLQotCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWzJdID0KLQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUyX1RYUkZfSVFDQUwxKTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUyX1RYUkZfSVFDQUwxLCAweDI5KTsKLQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1szXSA9Ci0JCSAgICByZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMl9UWFJGX0lRQ0FMMik7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMl9UWFJGX0lRQ0FMMiwgMHg1NCk7Ci0KLQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1s0XSA9Ci0JCSAgICByZWFkX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9QV1JERVRfUlhUWF9DT1JFMSk7Ci0JCXBpLT50eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbNV0gPQotCQkgICAgcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfUFdSREVUX1JYVFhfQ09SRTIpOwotCi0JCWlmICgocmVhZF9waHlfcmVnKHBpLCAweDA5KSAmIE5QSFlfQmFuZENvbnRyb2xfY3VycmVudEJhbmQpID09Ci0JCSAgICAwKSB7Ci0KLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9QV1JERVRfUlhUWF9DT1JFMSwgMHgwNCk7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfUFdSREVUX1JYVFhfQ09SRTIsIDB4MDQpOwotCQl9IGVsc2UgewotCi0JCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfUFdSREVUX1JYVFhfQ09SRTEsIDB4MjApOwotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X1BXUkRFVF9SWFRYX0NPUkUyLCAweDIwKTsKLQkJfQotCi0JCWlmIChOUkVWX0xUKHBpLT5wdWJwaS5waHlfcmV2LCAyKSkgewotCi0JCQlvcl9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTFfVFhfQkJfTVhHTSwgMHgyMCk7Ci0JCQlvcl9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTJfVFhfQkJfTVhHTSwgMHgyMCk7Ci0JCX0gZWxzZSB7Ci0KLQkJCWFuZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTFfVFhfQkJfTVhHTSwgMHhkZik7Ci0JCQlhbmRfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUyX1RYX0JCX01YR00sIDB4ZGYpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3R4Y2FsX3JhZGlvX2NsZWFudXBfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQl1MTYganRhZ19jb3JlLCBjb3JlOwotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCWZvciAoY29yZSA9IDA7IGNvcmUgPD0gMTsgY29yZSsrKSB7Ci0KLQkJCVdSSVRFX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLCBjb3JlLAotCQkJCQkgVFhfU1NJX01BU1RFUiwKLQkJCQkJIHBpLT4KLQkJCQkJIHR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1soY29yZSAqIDExKSArCi0JCQkJCQkJCSAgMF0pOwotCi0JCQlXUklURV9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwgY29yZSwgSVFDQUxfVkNNX0hHLAotCQkJCQkgcGktPgotCQkJCQkgdHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWyhjb3JlICogMTEpICsKLQkJCQkJCQkJICAxXSk7Ci0KLQkJCVdSSVRFX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLCBjb3JlLCBJUUNBTF9JREFDLAotCQkJCQkgcGktPgotCQkJCQkgdHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWyhjb3JlICogMTEpICsKLQkJCQkJCQkJICAyXSk7Ci0KLQkJCVdSSVRFX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLCBjb3JlLCBUU1NJX1ZDTSwKLQkJCQkJIHBpLT4KLQkJCQkJIHR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1soY29yZSAqIDExKSArCi0JCQkJCQkJCSAgM10pOwotCi0JCQlXUklURV9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwgY29yZSwgVFhfU1NJX01VWCwKLQkJCQkJIHBpLT4KLQkJCQkJIHR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1soY29yZSAqIDExKSArCi0JCQkJCQkJCSAgNV0pOwotCi0JCQlpZiAocGktPnB1YnBpLnJhZGlvcmV2ICE9IDUpCi0JCQkJV1JJVEVfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIGNvcmUsCi0JCQkJCQkgVFNTSUEsCi0JCQkJCQkgcGktPgotCQkJCQkJIHR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1soY29yZQotCQkJCQkJCQkJICAgKgotCQkJCQkJCQkJICAgMTEpICsKLQkJCQkJCQkJCSAgNl0pOwotCi0JCQlXUklURV9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwgY29yZSwgVFNTSUcsCi0JCQkJCSBwaS0+Ci0JCQkJCSB0eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbKGNvcmUgKiAxMSkgKwotCQkJCQkJCQkgIDddKTsKLQotCQkJV1JJVEVfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIGNvcmUsIFRTU0lfTUlTQzEsCi0JCQkJCSBwaS0+Ci0JCQkJCSB0eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbKGNvcmUgKiAxMSkgKwotCQkJCQkJCQkgIDhdKTsKLQkJfQotCX0gZWxzZSBpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJZm9yIChjb3JlID0gMDsgY29yZSA8PSAxOyBjb3JlKyspIHsKLQkJCWp0YWdfY29yZSA9Ci0JCQkgICAgKGNvcmUgPT0KLQkJCSAgICAgUEhZX0NPUkVfMCkgPyBSQURJT18yMDU2X1RYMCA6IFJBRElPXzIwNTZfVFgxOwotCi0JCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCVJBRElPXzIwNTZfVFhfVFhfU1NJX01BU1RFUiB8IGp0YWdfY29yZSwKLQkJCQkJcGktPgotCQkJCQl0eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbKGNvcmUgKiAxMSkgKwotCQkJCQkJCQkgMF0pOwotCi0JCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCVJBRElPXzIwNTZfVFhfSVFDQUxfVkNNX0hHIHwganRhZ19jb3JlLAotCQkJCQlwaS0+Ci0JCQkJCXR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1soY29yZSAqIDExKSArCi0JCQkJCQkJCSAxXSk7Ci0KLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJUkFESU9fMjA1Nl9UWF9JUUNBTF9JREFDIHwganRhZ19jb3JlLAotCQkJCQlwaS0+Ci0JCQkJCXR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1soY29yZSAqIDExKSArCi0JCQkJCQkJCSAyXSk7Ci0KLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9UWF9UU1NJX1ZDTSB8IGp0YWdfY29yZSwKLQkJCQkJcGktPgotCQkJCQl0eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbKGNvcmUgKiAxMSkgKwotCQkJCQkJCQkgM10pOwotCi0JCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCVJBRElPXzIwNTZfVFhfVFhfQU1QX0RFVCB8IGp0YWdfY29yZSwKLQkJCQkJcGktPgotCQkJCQl0eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbKGNvcmUgKiAxMSkgKwotCQkJCQkJCQkgNF0pOwotCi0JCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCVJBRElPXzIwNTZfVFhfVFhfU1NJX01VWCB8IGp0YWdfY29yZSwKLQkJCQkJcGktPgotCQkJCQl0eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbKGNvcmUgKiAxMSkgKwotCQkJCQkJCQkgNV0pOwotCi0JCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfVFhfVFNTSUEgfCBqdGFnX2NvcmUsCi0JCQkJCXBpLT4KLQkJCQkJdHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWyhjb3JlICogMTEpICsKLQkJCQkJCQkJIDZdKTsKLQotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU2X1RYX1RTU0lHIHwganRhZ19jb3JlLAotCQkJCQlwaS0+Ci0JCQkJCXR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1soY29yZSAqIDExKSArCi0JCQkJCQkJCSA3XSk7Ci0KLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJUkFESU9fMjA1Nl9UWF9UU1NJX01JU0MxIHwganRhZ19jb3JlLAotCQkJCQlwaS0+Ci0JCQkJCXR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1soY29yZSAqIDExKSArCi0JCQkJCQkJCSA4XSk7Ci0KLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJUkFESU9fMjA1Nl9UWF9UU1NJX01JU0MyIHwganRhZ19jb3JlLAotCQkJCQlwaS0+Ci0JCQkJCXR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1soY29yZSAqIDExKSArCi0JCQkJCQkJCSA5XSk7Ci0KLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJUkFESU9fMjA1Nl9UWF9UU1NJX01JU0MzIHwganRhZ19jb3JlLAotCQkJCQlwaS0+Ci0JCQkJCXR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1soY29yZSAqIDExKSArCi0JCQkJCQkJCSAxMF0pOwotCQl9Ci0JfSBlbHNlIHsKLQotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTFfVFhSRl9JUUNBTDEsCi0JCQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1swXSk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMV9UWFJGX0lRQ0FMMiwKLQkJCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWzFdKTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUyX1RYUkZfSVFDQUwxLAotCQkJCXBpLT50eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbMl0pOwotCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTVfQ09SRTJfVFhSRl9JUUNBTDIsCi0JCQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1szXSk7Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9QV1JERVRfUlhUWF9DT1JFMSwKLQkJCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWzRdKTsKLQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X1BXUkRFVF9SWFRYX0NPUkUyLAotCQkJCXBpLT50eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbNV0pOwotCX0KLX0KLQotc3RhdGljIHZvaWQgd2xjX3BoeV90eGNhbF9waHlzZXR1cF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXUxNiB2YWwsIG1hc2s7Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJcGktPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3NbMF0gPSByZWFkX3BoeV9yZWcocGksIDB4YTYpOwotCQlwaS0+dHhfcnhfY2FsX3BoeV9zYXZlcmVnc1sxXSA9IHJlYWRfcGh5X3JlZyhwaSwgMHhhNyk7Ci0KLQkJbWFzayA9ICgoMHgzIDw8IDgpIHwgKDB4MyA8PCAxMCkpOwotCQl2YWwgPSAoMHgyIDw8IDgpOwotCQl2YWwgfD0gKDB4MiA8PCAxMCk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweGE2LCBtYXNrLCB2YWwpOwotCQltb2RfcGh5X3JlZyhwaSwgMHhhNywgbWFzaywgdmFsKTsKLQotCQl2YWwgPSByZWFkX3BoeV9yZWcocGksIDB4OGYpOwotCQlwaS0+dHhfcnhfY2FsX3BoeV9zYXZlcmVnc1syXSA9IHZhbDsKLQkJdmFsIHw9ICgoMHgxIDw8IDkpIHwgKDB4MSA8PCAxMCkpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDhmLCB2YWwpOwotCi0JCXZhbCA9IHJlYWRfcGh5X3JlZyhwaSwgMHhhNSk7Ci0JCXBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzNdID0gdmFsOwotCQl2YWwgfD0gKCgweDEgPDwgOSkgfCAoMHgxIDw8IDEwKSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4YTUsIHZhbCk7Ci0KLQkJcGktPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3NbNF0gPSByZWFkX3BoeV9yZWcocGksIDB4MDEpOwotCQltb2RfcGh5X3JlZyhwaSwgMHgwMSwgKDB4MSA8PCAxNSksIDApOwotCi0JCXdsY19waHlfdGFibGVfcmVhZF9ucGh5KHBpLCBOUEhZX1RCTF9JRF9BRkVDVFJMLCAxLCAzLCAxNiwKLQkJCQkJJnZhbCk7Ci0JCXBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzVdID0gdmFsOwotCQl2YWwgPSAwOwotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDEsIDMsIDE2LAotCQkJCQkgJnZhbCk7Ci0KLQkJd2xjX3BoeV90YWJsZV9yZWFkX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDEsIDE5LCAxNiwKLQkJCQkJJnZhbCk7Ci0JCXBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzZdID0gdmFsOwotCQl2YWwgPSAwOwotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDEsIDE5LCAxNiwKLQkJCQkJICZ2YWwpOwotCi0JCXBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzddID0gcmVhZF9waHlfcmVnKHBpLCAweDkxKTsKLQkJcGktPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3NbOF0gPSByZWFkX3BoeV9yZWcocGksIDB4OTIpOwotCi0JCWlmICghKHBpLT51c2VfaW50X3R4X2lxbG9fY2FsX25waHkpKSB7Ci0KLQkJCXdsY19waHlfcmZjdHJsaW50Y19vdmVycmlkZV9ucGh5KHBpLAotCQkJCQkJCSBOUEhZX1JmY3RybEludGNfb3ZlcnJpZGVfUEEsCi0JCQkJCQkJIDEsCi0JCQkJCQkJIFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMQotCQkJCQkJCSB8Ci0JCQkJCQkJIFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMik7Ci0JCX0gZWxzZSB7Ci0KLQkJCXdsY19waHlfcmZjdHJsaW50Y19vdmVycmlkZV9ucGh5KHBpLAotCQkJCQkJCSBOUEhZX1JmY3RybEludGNfb3ZlcnJpZGVfUEEsCi0JCQkJCQkJIDAsCi0JCQkJCQkJIFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMQotCQkJCQkJCSB8Ci0JCQkJCQkJIFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMik7Ci0JCX0KLQotCQl3bGNfcGh5X3JmY3RybGludGNfb3ZlcnJpZGVfbnBoeShwaSwKLQkJCQkJCSBOUEhZX1JmY3RybEludGNfb3ZlcnJpZGVfVFJTVywKLQkJCQkJCSAweDIsIFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMSk7Ci0JCXdsY19waHlfcmZjdHJsaW50Y19vdmVycmlkZV9ucGh5KHBpLAotCQkJCQkJIE5QSFlfUmZjdHJsSW50Y19vdmVycmlkZV9UUlNXLAotCQkJCQkJIDB4OCwgUkFESU9fTUlNT19DT1JFU0VMX0NPUkUyKTsKLQotCQlwaS0+dHhfcnhfY2FsX3BoeV9zYXZlcmVnc1s5XSA9IHJlYWRfcGh5X3JlZyhwaSwgMHgyOTcpOwotCQlwaS0+dHhfcnhfY2FsX3BoeV9zYXZlcmVnc1sxMF0gPSByZWFkX3BoeV9yZWcocGksIDB4MjliKTsKLQkJbW9kX3BoeV9yZWcocGksICgwID09IFBIWV9DT1JFXzApID8gMHgyOTcgOgotCQkJICAgIDB4MjliLCAoMHgxIDw8IDApLCAoMCkgPDwgMCk7Ci0KLQkJbW9kX3BoeV9yZWcocGksICgxID09IFBIWV9DT1JFXzApID8gMHgyOTcgOgotCQkJICAgIDB4MjliLCAoMHgxIDw8IDApLCAoMCkgPDwgMCk7Ci0KLQkJaWYgKE5SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDcpCi0JCSAgICB8fCBOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA4KSkgewotCQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDcpLAotCQkJCQkJCSAgd2xjX3BoeV9yZWFkX2xwZl9id19jdGxfbnBoeQotCQkJCQkJCSAgKHBpLCAwKSwgMCwgMCwKLQkJCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDEpOwotCQl9Ci0KLQkJaWYgKHBpLT51c2VfaW50X3R4X2lxbG9fY2FsX25waHkKLQkJICAgICYmICEocGktPmludGVybmFsX3R4X2lxbG9fY2FsX3RhcG9mZl9pbnRwYV9ucGh5KSkgewotCi0JCQlpZiAoTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQotCQkJCW1vZF9yYWRpb19yZWcocGksIFJBRElPXzIwNTdfT1ZSX1JFRzAsIDEgPDwgNCwKLQkJCQkJICAgICAgMSA8PCA0KTsKLQotCQkJCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQkJCW1vZF9yYWRpb19yZWcocGksCi0JCQkJCQkgICAgICBSQURJT18yMDU3X1BBRDJHX1RVTkVfUFVTX0NPUkUwLAotCQkJCQkJICAgICAgMSwgMCk7Ci0JCQkJCW1vZF9yYWRpb19yZWcocGksCi0JCQkJCQkgICAgICBSQURJT18yMDU3X1BBRDJHX1RVTkVfUFVTX0NPUkUxLAotCQkJCQkJICAgICAgMSwgMCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbW9kX3JhZGlvX3JlZyhwaSwKLQkJCQkJCSAgICAgIFJBRElPXzIwNTdfSVBBNUdfQ0FTQ09GRlZfUFVfQ09SRTAsCi0JCQkJCQkgICAgICAxLCAwKTsKLQkJCQkJbW9kX3JhZGlvX3JlZyhwaSwKLQkJCQkJCSAgICAgIFJBRElPXzIwNTdfSVBBNUdfQ0FTQ09GRlZfUFVfQ09SRTEsCi0JCQkJCQkgICAgICAxLCAwKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDgpKSB7Ci0JCQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLAotCQkJCQkJCQkgICgweDEgPDwgMyksIDAsCi0JCQkJCQkJCSAgMHgzLCAwLAotCQkJCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDApOwotCQkJfQotCQl9Ci0JfSBlbHNlIHsKLQkJcGktPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3NbMF0gPSByZWFkX3BoeV9yZWcocGksIDB4YTYpOwotCQlwaS0+dHhfcnhfY2FsX3BoeV9zYXZlcmVnc1sxXSA9IHJlYWRfcGh5X3JlZyhwaSwgMHhhNyk7Ci0KLQkJbWFzayA9ICgoMHgzIDw8IDEyKSB8ICgweDMgPDwgMTQpKTsKLQkJdmFsID0gKDB4MiA8PCAxMik7Ci0JCXZhbCB8PSAoMHgyIDw8IDE0KTsKLQkJbW9kX3BoeV9yZWcocGksIDB4YTYsIG1hc2ssIHZhbCk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweGE3LCBtYXNrLCB2YWwpOwotCi0JCXZhbCA9IHJlYWRfcGh5X3JlZyhwaSwgMHhhNSk7Ci0JCXBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzJdID0gdmFsOwotCQl2YWwgfD0gKCgweDEgPDwgMTIpIHwgKDB4MSA8PCAxMykpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweGE1LCB2YWwpOwotCi0JCXdsY19waHlfdGFibGVfcmVhZF9ucGh5KHBpLCBOUEhZX1RCTF9JRF9BRkVDVFJMLCAxLCAyLCAxNiwKLQkJCQkJJnZhbCk7Ci0JCXBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzNdID0gdmFsOwotCQl2YWwgfD0gMHgyMDAwOwotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDEsIDIsIDE2LAotCQkJCQkgJnZhbCk7Ci0KLQkJd2xjX3BoeV90YWJsZV9yZWFkX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDEsIDE4LCAxNiwKLQkJCQkJJnZhbCk7Ci0JCXBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzRdID0gdmFsOwotCQl2YWwgfD0gMHgyMDAwOwotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDEsIDE4LCAxNiwKLQkJCQkJICZ2YWwpOwotCi0JCXBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzVdID0gcmVhZF9waHlfcmVnKHBpLCAweDkxKTsKLQkJcGktPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3NbNl0gPSByZWFkX3BoeV9yZWcocGksIDB4OTIpOwotCQl2YWwgPSBDSFNQRUNfSVM1RyhwaS0+cmFkaW9fY2hhbnNwZWMpID8gMHgxODAgOiAweDEyMDsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg5MSwgdmFsKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg5MiwgdmFsKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHdsY19waHlfdHhjYWxfcGh5Y2xlYW51cF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXUxNiBtYXNrOwotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4YTYsIHBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzBdKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHhhNywgcGktPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3NbMV0pOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDhmLCBwaS0+dHhfcnhfY2FsX3BoeV9zYXZlcmVnc1syXSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4YTUsIHBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzNdKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgwMSwgcGktPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3NbNF0pOwotCi0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQUZFQ1RSTCwgMSwgMywgMTYsCi0JCQkJCSAmcGktPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3NbNV0pOwotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDEsIDE5LCAxNiwKLQkJCQkJICZwaS0+dHhfcnhfY2FsX3BoeV9zYXZlcmVnc1s2XSk7Ci0KLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg5MSwgcGktPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3NbN10pOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDkyLCBwaS0+dHhfcnhfY2FsX3BoeV9zYXZlcmVnc1s4XSk7Ci0KLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgyOTcsIHBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzldKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgyOWIsIHBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzEwXSk7Ci0KLQkJaWYgKE5SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDcpCi0JCSAgICB8fCBOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA4KSkgewotCQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDcpLCAwLCAwLAotCQkJCQkJCSAgMSwKLQkJCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDEpOwotCQl9Ci0KLQkJd2xjX3BoeV9yZXNldGNjYV9ucGh5KHBpKTsKLQotCQlpZiAocGktPnVzZV9pbnRfdHhfaXFsb19jYWxfbnBoeQotCQkgICAgJiYgIShwaS0+aW50ZXJuYWxfdHhfaXFsb19jYWxfdGFwb2ZmX2ludHBhX25waHkpKSB7Ci0KLQkJCWlmIChOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCQkJCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQkJCW1vZF9yYWRpb19yZWcocGksCi0JCQkJCQkgICAgICBSQURJT18yMDU3X1BBRDJHX1RVTkVfUFVTX0NPUkUwLAotCQkJCQkJICAgICAgMSwgMSk7Ci0JCQkJCW1vZF9yYWRpb19yZWcocGksCi0JCQkJCQkgICAgICBSQURJT18yMDU3X1BBRDJHX1RVTkVfUFVTX0NPUkUxLAotCQkJCQkJICAgICAgMSwgMSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbW9kX3JhZGlvX3JlZyhwaSwKLQkJCQkJCSAgICAgIFJBRElPXzIwNTdfSVBBNUdfQ0FTQ09GRlZfUFVfQ09SRTAsCi0JCQkJCQkgICAgICAxLCAxKTsKLQkJCQkJbW9kX3JhZGlvX3JlZyhwaSwKLQkJCQkJCSAgICAgIFJBRElPXzIwNTdfSVBBNUdfQ0FTQ09GRlZfUFVfQ09SRTEsCi0JCQkJCQkgICAgICAxLCAxKTsKLQkJCQl9Ci0KLQkJCQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU3X09WUl9SRUcwLCAxIDw8IDQsCi0JCQkJCSAgICAgIDApOwotCQkJfSBlbHNlIGlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA4KSkgewotCQkJCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwKLQkJCQkJCQkJICAoMHgxIDw8IDMpLCAwLAotCQkJCQkJCQkgIDB4MywgMSwKLQkJCQkJCQkJICBOUEhZX1JFVjdfUkZDVFJMT1ZFUlJJREVfSUQwKTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCW1hc2sgPSAoKDB4MyA8PCAxMikgfCAoMHgzIDw8IDE0KSk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweGE2LCBtYXNrLCBwaS0+dHhfcnhfY2FsX3BoeV9zYXZlcmVnc1swXSk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweGE3LCBtYXNrLCBwaS0+dHhfcnhfY2FsX3BoeV9zYXZlcmVnc1sxXSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4YTUsIHBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzJdKTsKLQotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDEsIDIsIDE2LAotCQkJCQkgJnBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzNdKTsKLQotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0FGRUNUUkwsIDEsIDE4LCAxNiwKLQkJCQkJICZwaS0+dHhfcnhfY2FsX3BoeV9zYXZlcmVnc1s0XSk7Ci0KLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHg5MSwgcGktPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3NbNV0pOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDkyLCBwaS0+dHhfcnhfY2FsX3BoeV9zYXZlcmVnc1s2XSk7Ci0JfQotfQotCi0jZGVmaW5lIE5QSFlfQ0FMX1RTU0lTQU1QUwk2NAotI2RlZmluZSBOUEhZX1RFU1RfVE9ORV9GUkVRXzQwTUh6IDQwMDAKLSNkZWZpbmUgTlBIWV9URVNUX1RPTkVfRlJFUV8yME1IeiAyNTAwCi0KLXZvaWQKLXdsY19waHlfZXN0X3RvbmVwd3JfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgczMyICpxZEJtX3B3cmJ1ZiwgdTggbnVtX3NhbXBzKQotewotCXUxNiB0c3NpX3JlZzsKLQlzMzIgdGVtcCwgcHdyaW5kZXhbMl07Ci0JczMyIGlkbGVfdHNzaVsyXTsKLQlzMzIgcnNzaV9idWZbNF07Ci0JczMyIHRzc2l2YWxbMl07Ci0JdTggdHNzaV90eXBlOwotCi0JdHNzaV9yZWcgPSByZWFkX3BoeV9yZWcocGksIDB4MWU5KTsKLQotCXRlbXAgPSAoczMyKSAodHNzaV9yZWcgJiAweDNmKTsKLQlpZGxlX3Rzc2lbMF0gPSAodGVtcCA8PSAzMSkgPyB0ZW1wIDogKHRlbXAgLSA2NCk7Ci0KLQl0ZW1wID0gKHMzMikgKCh0c3NpX3JlZyA+PiA4KSAmIDB4M2YpOwotCWlkbGVfdHNzaVsxXSA9ICh0ZW1wIDw9IDMxKSA/IHRlbXAgOiAodGVtcCAtIDY0KTsKLQotCXRzc2lfdHlwZSA9Ci0JICAgIENIU1BFQ19JUzVHKHBpLT5yYWRpb19jaGFuc3BlYykgPwotCSAgICAodTgpTlBIWV9SU1NJX1NFTF9UU1NJXzVHIDogKHU4KU5QSFlfUlNTSV9TRUxfVFNTSV8yRzsKLQotCXdsY19waHlfcG9sbF9yc3NpX25waHkocGksIHRzc2lfdHlwZSwgcnNzaV9idWYsIG51bV9zYW1wcyk7Ci0KLQl0c3NpdmFsWzBdID0gcnNzaV9idWZbMF0gLyAoKHMzMikgbnVtX3NhbXBzKTsKLQl0c3NpdmFsWzFdID0gcnNzaV9idWZbMl0gLyAoKHMzMikgbnVtX3NhbXBzKTsKLQotCXB3cmluZGV4WzBdID0gaWRsZV90c3NpWzBdIC0gdHNzaXZhbFswXSArIDY0OwotCXB3cmluZGV4WzFdID0gaWRsZV90c3NpWzFdIC0gdHNzaXZhbFsxXSArIDY0OwotCi0JaWYgKHB3cmluZGV4WzBdIDwgMCkgewotCQlwd3JpbmRleFswXSA9IDA7Ci0JfSBlbHNlIGlmIChwd3JpbmRleFswXSA+IDYzKSB7Ci0JCXB3cmluZGV4WzBdID0gNjM7Ci0JfQotCi0JaWYgKHB3cmluZGV4WzFdIDwgMCkgewotCQlwd3JpbmRleFsxXSA9IDA7Ci0JfSBlbHNlIGlmIChwd3JpbmRleFsxXSA+IDYzKSB7Ci0JCXB3cmluZGV4WzFdID0gNjM7Ci0JfQotCi0Jd2xjX3BoeV90YWJsZV9yZWFkX25waHkocGksIE5QSFlfVEJMX0lEX0NPUkUxVFhQV1JDVEwsIDEsCi0JCQkJKHUzMikgcHdyaW5kZXhbMF0sIDMyLCAmcWRCbV9wd3JidWZbMF0pOwotCXdsY19waHlfdGFibGVfcmVhZF9ucGh5KHBpLCBOUEhZX1RCTF9JRF9DT1JFMlRYUFdSQ1RMLCAxLAotCQkJCSh1MzIpIHB3cmluZGV4WzFdLCAzMiwgJnFkQm1fcHdyYnVmWzFdKTsKLX0KLQotc3RhdGljIHZvaWQgd2xjX3BoeV9pbnRlcm5hbF9jYWxfdHhnYWluX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JdTE2IHR4Y2FsX2dhaW5bMl07Ci0KLQlwaS0+bnBoeV90eGNhbF9wd3JfaWR4WzBdID0gcGktPm5waHlfY2FsX29yaWdfcHdyX2lkeFswXTsKLQlwaS0+bnBoeV90eGNhbF9wd3JfaWR4WzFdID0gcGktPm5waHlfY2FsX29yaWdfcHdyX2lkeFswXTsKLQl3bGNfcGh5X3R4cHdyX2luZGV4X25waHkocGksIDEsIHBpLT5ucGh5X2NhbF9vcmlnX3B3cl9pZHhbMF0sIHRydWUpOwotCXdsY19waHlfdHhwd3JfaW5kZXhfbnBoeShwaSwgMiwgcGktPm5waHlfY2FsX29yaWdfcHdyX2lkeFsxXSwgdHJ1ZSk7Ci0KLQl3bGNfcGh5X3RhYmxlX3JlYWRfbnBoeShwaSwgTlBIWV9UQkxfSURfUkZTRVEsIDIsIDB4MTEwLCAxNiwKLQkJCQl0eGNhbF9nYWluKTsKLQotCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCXR4Y2FsX2dhaW5bMF0gPSAodHhjYWxfZ2FpblswXSAmIDB4RjAwMCkgfCAweDBGNDA7Ci0JCXR4Y2FsX2dhaW5bMV0gPSAodHhjYWxfZ2FpblsxXSAmIDB4RjAwMCkgfCAweDBGNDA7Ci0JfSBlbHNlIHsKLQkJdHhjYWxfZ2FpblswXSA9ICh0eGNhbF9nYWluWzBdICYgMHhGMDAwKSB8IDB4MEY2MDsKLQkJdHhjYWxfZ2FpblsxXSA9ICh0eGNhbF9nYWluWzFdICYgMHhGMDAwKSB8IDB4MEY2MDsKLQl9Ci0KLQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX1JGU0VRLCAyLCAweDExMCwgMTYsCi0JCQkJIHR4Y2FsX2dhaW4pOwotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3ByZWNhbF90eGdhaW5fbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQlib29sIHNhdmVfYmJtdWx0ID0gZmFsc2U7Ci0JdTggdHhjYWxfaW5kZXhfMjA1N19yZXY1bjcgPSAwOwotCXU4IHR4Y2FsX2luZGV4XzIwNTdfcmV2M240bjYgPSAxMDsKLQotCWlmIChwaS0+dXNlX2ludF90eF9pcWxvX2NhbF9ucGh5KSB7Ci0JCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCQkJaWYgKChwaS0+cHVicGkucmFkaW9yZXYgPT0gMykgfHwKLQkJCSAgICAocGktPnB1YnBpLnJhZGlvcmV2ID09IDQpIHx8Ci0JCQkgICAgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA2KSkgewotCi0JCQkJcGktPm5waHlfdHhjYWxfcHdyX2lkeFswXSA9Ci0JCQkJICAgIHR4Y2FsX2luZGV4XzIwNTdfcmV2M240bjY7Ci0JCQkJcGktPm5waHlfdHhjYWxfcHdyX2lkeFsxXSA9Ci0JCQkJICAgIHR4Y2FsX2luZGV4XzIwNTdfcmV2M240bjY7Ci0JCQkJd2xjX3BoeV90eHB3cl9pbmRleF9ucGh5KHBpLCAzLAotCQkJCQkJCSB0eGNhbF9pbmRleF8yMDU3X3JldjNuNG42LAotCQkJCQkJCSBmYWxzZSk7Ci0JCQl9IGVsc2UgewotCi0JCQkJcGktPm5waHlfdHhjYWxfcHdyX2lkeFswXSA9Ci0JCQkJICAgIHR4Y2FsX2luZGV4XzIwNTdfcmV2NW43OwotCQkJCXBpLT5ucGh5X3R4Y2FsX3B3cl9pZHhbMV0gPQotCQkJCSAgICB0eGNhbF9pbmRleF8yMDU3X3JldjVuNzsKLQkJCQl3bGNfcGh5X3R4cHdyX2luZGV4X25waHkocGksIDMsCi0JCQkJCQkJIHR4Y2FsX2luZGV4XzIwNTdfcmV2NW43LAotCQkJCQkJCSBmYWxzZSk7Ci0JCQl9Ci0JCQlzYXZlX2JibXVsdCA9IHRydWU7Ci0KLQkJfSBlbHNlIGlmIChOUkVWX0xUKHBpLT5wdWJwaS5waHlfcmV2LCA1KSkgewotCQkJd2xjX3BoeV9jYWxfdHhnYWluY3RybF9ucGh5KHBpLCAxMSwgZmFsc2UpOwotCQkJaWYgKHBpLT5zaC0+aHdfcGh5dHhjaGFpbiAhPSAzKSB7Ci0JCQkJcGktPm5waHlfdHhjYWxfcHdyX2lkeFsxXSA9Ci0JCQkJICAgIHBpLT5ucGh5X3R4Y2FsX3B3cl9pZHhbMF07Ci0JCQkJd2xjX3BoeV90eHB3cl9pbmRleF9ucGh5KHBpLCAzLAotCQkJCQkJCSBwaS0+Ci0JCQkJCQkJIG5waHlfdHhjYWxfcHdyX2lkeFswXSwKLQkJCQkJCQkgdHJ1ZSk7Ci0JCQkJc2F2ZV9iYm11bHQgPSB0cnVlOwotCQkJfQotCi0JCX0gZWxzZSBpZiAoTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgNSkpIHsKLQkJCWlmIChQSFlfSVBBKHBpKSkgewotCQkJCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQkJCXdsY19waHlfY2FsX3R4Z2FpbmN0cmxfbnBoeShwaSwgMTIsCi0JCQkJCQkJCSAgICBmYWxzZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcGktPm5waHlfdHhjYWxfcHdyX2lkeFswXSA9IDgwOwotCQkJCQlwaS0+bnBoeV90eGNhbF9wd3JfaWR4WzFdID0gODA7Ci0JCQkJCXdsY19waHlfdHhwd3JfaW5kZXhfbnBoeShwaSwgMywgODAsCi0JCQkJCQkJCSBmYWxzZSk7Ci0JCQkJCXNhdmVfYmJtdWx0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCi0JCQkJd2xjX3BoeV9pbnRlcm5hbF9jYWxfdHhnYWluX25waHkocGkpOwotCQkJCXNhdmVfYmJtdWx0ID0gdHJ1ZTsKLQkJCX0KLQotCQl9IGVsc2UgaWYgKE5SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDYpKSB7Ci0JCQlpZiAoUEhZX0lQQShwaSkpIHsKLQkJCQlpZiAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJCQl3bGNfcGh5X2NhbF90eGdhaW5jdHJsX25waHkocGksIDEyLAotCQkJCQkJCQkgICAgZmFsc2UpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXdsY19waHlfY2FsX3R4Z2FpbmN0cmxfbnBoeShwaSwgMTQsCi0JCQkJCQkJCSAgICBmYWxzZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQotCQkJCXdsY19waHlfaW50ZXJuYWxfY2FsX3R4Z2Fpbl9ucGh5KHBpKTsKLQkJCQlzYXZlX2JibXVsdCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCX0gZWxzZSB7Ci0JCXdsY19waHlfY2FsX3R4Z2FpbmN0cmxfbnBoeShwaSwgMTAsIGZhbHNlKTsKLQl9Ci0KLQlpZiAoc2F2ZV9iYm11bHQpIHsKLQkJd2xjX3BoeV90YWJsZV9yZWFkX25waHkocGksIDE1LCAxLCA4NywgMTYsCi0JCQkJCSZwaS0+bnBoeV90eGNhbF9iYm11bHQpOwotCX0KLX0KLQotdm9pZAotd2xjX3BoeV9jYWxfdHhnYWluY3RybF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCBzMzIgZEJtX3RhcmdldHBvd2VyLAotCQkJICAgIGJvb2wgZGVidWcpCi17Ci0JaW50IGdhaW5jdHJsX2xvb3BpZHg7Ci0JdWludCBjb3JlOwotCXUxNiBtMG0xLCBjdXJyX20wbTE7Ci0JczMyIGRlbHRhX3Bvd2VyOwotCXMzMiB0eHB3cmluZGV4OwotCXMzMiBxZEJtX3Bvd2VyWzJdOwotCXUxNiBvcmlnX0JCQ29uZmlnOwotCXUxNiBwaHlfc2F2ZXJlZ3NbNF07Ci0JdTMyIGZyZXFfdGVzdDsKLQl1MTYgYW1wbF90ZXN0ID0gMjUwOwotCXVpbnQgc3RlcHNpemU7Ci0JYm9vbCBwaHloYW5nX2F2b2lkX3N0YXRlID0gZmFsc2U7Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQotCQlzdGVwc2l6ZSA9IDI7Ci0JfSBlbHNlIHsKLQotCQlzdGVwc2l6ZSA9IDE7Ci0JfQotCi0JaWYgKENIU1BFQ19JUzQwKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJZnJlcV90ZXN0ID0gNTAwMDsKLQl9IGVsc2UgewotCQlmcmVxX3Rlc3QgPSAyNTAwOwotCX0KLQotCXdsY19waHlfdHhwd3JfaW5kZXhfbnBoeShwaSwgMSwgcGktPm5waHlfY2FsX29yaWdfcHdyX2lkeFswXSwgdHJ1ZSk7Ci0Jd2xjX3BoeV90eHB3cl9pbmRleF9ucGh5KHBpLCAyLCBwaS0+bnBoeV9jYWxfb3JpZ19wd3JfaWR4WzFdLCB0cnVlKTsKLQotCWlmIChwaS0+cGh5aGFuZ19hdm9pZCkKLQkJd2xjX3BoeV9zdGF5X2luX2NhcnJpZXJzZWFyY2hfbnBoeShwaSwgdHJ1ZSk7Ci0KLQlwaHloYW5nX2F2b2lkX3N0YXRlID0gcGktPnBoeWhhbmdfYXZvaWQ7Ci0JcGktPnBoeWhhbmdfYXZvaWQgPSBmYWxzZTsKLQotCXBoeV9zYXZlcmVnc1swXSA9IHJlYWRfcGh5X3JlZyhwaSwgMHg5MSk7Ci0JcGh5X3NhdmVyZWdzWzFdID0gcmVhZF9waHlfcmVnKHBpLCAweDkyKTsKLQlwaHlfc2F2ZXJlZ3NbMl0gPSByZWFkX3BoeV9yZWcocGksIDB4ZTcpOwotCXBoeV9zYXZlcmVnc1szXSA9IHJlYWRfcGh5X3JlZyhwaSwgMHhlYyk7Ci0Jd2xjX3BoeV9yZmN0cmxpbnRjX292ZXJyaWRlX25waHkocGksIE5QSFlfUmZjdHJsSW50Y19vdmVycmlkZV9QQSwgMSwKLQkJCQkJIFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMSB8Ci0JCQkJCSBSQURJT19NSU1PX0NPUkVTRUxfQ09SRTIpOwotCi0JaWYgKCFkZWJ1ZykgewotCQl3bGNfcGh5X3JmY3RybGludGNfb3ZlcnJpZGVfbnBoeShwaSwKLQkJCQkJCSBOUEhZX1JmY3RybEludGNfb3ZlcnJpZGVfVFJTVywKLQkJCQkJCSAweDIsIFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMSk7Ci0JCXdsY19waHlfcmZjdHJsaW50Y19vdmVycmlkZV9ucGh5KHBpLAotCQkJCQkJIE5QSFlfUmZjdHJsSW50Y19vdmVycmlkZV9UUlNXLAotCQkJCQkJIDB4OCwgUkFESU9fTUlNT19DT1JFU0VMX0NPUkUyKTsKLQl9IGVsc2UgewotCQl3bGNfcGh5X3JmY3RybGludGNfb3ZlcnJpZGVfbnBoeShwaSwKLQkJCQkJCSBOUEhZX1JmY3RybEludGNfb3ZlcnJpZGVfVFJTVywKLQkJCQkJCSAweDEsIFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMSk7Ci0JCXdsY19waHlfcmZjdHJsaW50Y19vdmVycmlkZV9ucGh5KHBpLAotCQkJCQkJIE5QSFlfUmZjdHJsSW50Y19vdmVycmlkZV9UUlNXLAotCQkJCQkJIDB4NywgUkFESU9fTUlNT19DT1JFU0VMX0NPUkUyKTsKLQl9Ci0KLQlvcmlnX0JCQ29uZmlnID0gcmVhZF9waHlfcmVnKHBpLCAweDAxKTsKLQltb2RfcGh5X3JlZyhwaSwgMHgwMSwgKDB4MSA8PCAxNSksIDApOwotCi0Jd2xjX3BoeV90YWJsZV9yZWFkX25waHkocGksIDE1LCAxLCA4NywgMTYsICZtMG0xKTsKLQotCWZvciAoY29yZSA9IDA7IGNvcmUgPCBwaS0+cHVicGkucGh5X2NvcmVudW07IGNvcmUrKykgewotCQl0eHB3cmluZGV4ID0gKHMzMikgcGktPm5waHlfY2FsX29yaWdfcHdyX2lkeFtjb3JlXTsKLQotCQlmb3IgKGdhaW5jdHJsX2xvb3BpZHggPSAwOyBnYWluY3RybF9sb29waWR4IDwgMjsKLQkJICAgICBnYWluY3RybF9sb29waWR4KyspIHsKLQkJCXdsY19waHlfdHhfdG9uZV9ucGh5KHBpLCBmcmVxX3Rlc3QsIGFtcGxfdGVzdCwgMCwgMCwKLQkJCQkJICAgICBmYWxzZSk7Ci0KLQkJCWlmIChjb3JlID09IFBIWV9DT1JFXzApIHsKLQkJCQljdXJyX20wbTEgPSBtMG0xICYgMHhmZjAwOwotCQkJfSBlbHNlIHsKLQkJCQljdXJyX20wbTEgPSBtMG0xICYgMHgwMGZmOwotCQkJfQotCi0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIDE1LCAxLCA4NywgMTYsICZjdXJyX20wbTEpOwotCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCAxNSwgMSwgOTUsIDE2LCAmY3Vycl9tMG0xKTsKLQotCQkJdWRlbGF5KDUwKTsKLQotCQkJd2xjX3BoeV9lc3RfdG9uZXB3cl9ucGh5KHBpLCBxZEJtX3Bvd2VyLAotCQkJCQkJIE5QSFlfQ0FMX1RTU0lTQU1QUyk7Ci0KLQkJCXBpLT5ucGh5X2JiX211bHRfc2F2ZSA9IDA7Ci0JCQl3bGNfcGh5X3N0b3BwbGF5YmFja19ucGh5KHBpKTsKLQotCQkJZGVsdGFfcG93ZXIgPSAoZEJtX3RhcmdldHBvd2VyICogNCkgLSBxZEJtX3Bvd2VyW2NvcmVdOwotCi0JCQl0eHB3cmluZGV4IC09IHN0ZXBzaXplICogZGVsdGFfcG93ZXI7Ci0JCQlpZiAodHhwd3JpbmRleCA8IDApIHsKLQkJCQl0eHB3cmluZGV4ID0gMDsKLQkJCX0gZWxzZSBpZiAodHhwd3JpbmRleCA+IDEyNykgewotCQkJCXR4cHdyaW5kZXggPSAxMjc7Ci0JCQl9Ci0KLQkJCWlmIChDSFNQRUNfSVM1RyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQkJaWYgKE5SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDQpICYmCi0JCQkJICAgIChwaS0+c3JvbV9mZW01Zy5leHRwYWdhaW4gPT0gMykpIHsKLQkJCQkJaWYgKHR4cHdyaW5kZXggPCAzMCkgewotCQkJCQkJdHhwd3JpbmRleCA9IDMwOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNSkgJiYKLQkJCQkgICAgKHBpLT5zcm9tX2ZlbTJnLmV4dHBhZ2FpbiA9PSAzKSkgewotCQkJCQlpZiAodHhwd3JpbmRleCA8IDUwKSB7Ci0JCQkJCQl0eHB3cmluZGV4ID0gNTA7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXdsY19waHlfdHhwd3JfaW5kZXhfbnBoeShwaSwgKDEgPDwgY29yZSksCi0JCQkJCQkgKHU4KSB0eHB3cmluZGV4LCB0cnVlKTsKLQkJfQotCi0JCXBpLT5ucGh5X3R4Y2FsX3B3cl9pZHhbY29yZV0gPSAodTgpIHR4cHdyaW5kZXg7Ci0KLQkJaWYgKGRlYnVnKSB7Ci0JCQl1MTYgcmFkaW9fZ2FpbjsKLQkJCXUxNiBkYmdfbTBtMTsKLQotCQkJd2xjX3BoeV90YWJsZV9yZWFkX25waHkocGksIDE1LCAxLCA4NywgMTYsICZkYmdfbTBtMSk7Ci0KLQkJCXdsY19waHlfdHhfdG9uZV9ucGh5KHBpLCBmcmVxX3Rlc3QsIGFtcGxfdGVzdCwgMCwgMCwKLQkJCQkJICAgICBmYWxzZSk7Ci0KLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgMTUsIDEsIDg3LCAxNiwgJmRiZ19tMG0xKTsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgMTUsIDEsIDk1LCAxNiwgJmRiZ19tMG0xKTsKLQotCQkJdWRlbGF5KDEwMCk7Ci0KLQkJCXdsY19waHlfZXN0X3RvbmVwd3JfbnBoeShwaSwgcWRCbV9wb3dlciwKLQkJCQkJCSBOUEhZX0NBTF9UU1NJU0FNUFMpOwotCi0JCQl3bGNfcGh5X3RhYmxlX3JlYWRfbnBoeShwaSwgNywgMSwgKDB4MTEwICsgY29yZSksIDE2LAotCQkJCQkJJnJhZGlvX2dhaW4pOwotCi0JCQltZGVsYXkoNDAwMCk7Ci0JCQlwaS0+bnBoeV9iYl9tdWx0X3NhdmUgPSAwOwotCQkJd2xjX3BoeV9zdG9wcGxheWJhY2tfbnBoeShwaSk7Ci0JCX0KLQl9Ci0KLQl3bGNfcGh5X3R4cHdyX2luZGV4X25waHkocGksIDEsIHBpLT5ucGh5X3R4Y2FsX3B3cl9pZHhbMF0sIHRydWUpOwotCXdsY19waHlfdHhwd3JfaW5kZXhfbnBoeShwaSwgMiwgcGktPm5waHlfdHhjYWxfcHdyX2lkeFsxXSwgdHJ1ZSk7Ci0KLQl3bGNfcGh5X3RhYmxlX3JlYWRfbnBoeShwaSwgMTUsIDEsIDg3LCAxNiwgJnBpLT5ucGh5X3R4Y2FsX2JibXVsdCk7Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCAweDAxLCBvcmlnX0JCQ29uZmlnKTsKLQotCXdyaXRlX3BoeV9yZWcocGksIDB4OTEsIHBoeV9zYXZlcmVnc1swXSk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHg5MiwgcGh5X3NhdmVyZWdzWzFdKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweGU3LCBwaHlfc2F2ZXJlZ3NbMl0pOwotCXdyaXRlX3BoeV9yZWcocGksIDB4ZWMsIHBoeV9zYXZlcmVnc1szXSk7Ci0KLQlwaS0+cGh5aGFuZ19hdm9pZCA9IHBoeWhhbmdfYXZvaWRfc3RhdGU7Ci0KLQlpZiAocGktPnBoeWhhbmdfYXZvaWQpCi0JCXdsY19waHlfc3RheV9pbl9jYXJyaWVyc2VhcmNoX25waHkocGksIGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQgd2xjX3BoeV91cGRhdGVfdHhjYWxfbGFkZGVyX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBjb3JlKQotewotCWludCBpbmRleDsKLQl1MzIgYmJtdWx0X3NjYWxlOwotCXUxNiBiYm11bHQ7Ci0JdTE2IHRibGVudHJ5OwotCi0Jc3RydWN0IG5waHlfdHhpcWNhbF9sYWRkZXIgbGFkZGVyX2xvW10gPSB7Ci0JCXszLCAwfSwgezQsIDB9LCB7NiwgMH0sIHs5LCAwfSwgezEzLCAwfSwgezE4LCAwfSwKLQkJezI1LCAwfSwgezI1LCAxfSwgezI1LCAyfSwgezI1LCAzfSwgezI1LCA0fSwgezI1LCA1fSwKLQkJezI1LCA2fSwgezI1LCA3fSwgezM1LCA3fSwgezUwLCA3fSwgezcxLCA3fSwgezEwMCwgN30KLQl9OwotCi0Jc3RydWN0IG5waHlfdHhpcWNhbF9sYWRkZXIgbGFkZGVyX2lxW10gPSB7Ci0JCXszLCAwfSwgezQsIDB9LCB7NiwgMH0sIHs5LCAwfSwgezEzLCAwfSwgezE4LCAwfSwKLQkJezI1LCAwfSwgezM1LCAwfSwgezUwLCAwfSwgezcxLCAwfSwgezEwMCwgMH0sIHsxMDAsIDF9LAotCQl7MTAwLCAyfSwgezEwMCwgM30sIHsxMDAsIDR9LCB7MTAwLCA1fSwgezEwMCwgNn0sIHsxMDAsIDd9Ci0JfTsKLQotCWJibXVsdCA9IChjb3JlID09IFBIWV9DT1JFXzApID8KLQkgICAgKChwaS0+bnBoeV90eGNhbF9iYm11bHQgPj4gOCkgJiAweGZmKSA6IChwaS0+Ci0JCQkJCQkgICAgIG5waHlfdHhjYWxfYmJtdWx0ICYgMHhmZik7Ci0KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAxODsgaW5kZXgrKykgewotCQliYm11bHRfc2NhbGUgPSBsYWRkZXJfbG9baW5kZXhdLnBlcmNlbnQgKiBiYm11bHQ7Ci0JCWJibXVsdF9zY2FsZSAvPSAxMDA7Ci0KLQkJdGJsZW50cnkgPQotCQkgICAgKChiYm11bHRfc2NhbGUgJiAweGZmKSA8PCA4KSB8IGxhZGRlcl9sb1tpbmRleF0uZ19lbnY7Ci0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfSVFMT0NBTCwgMSwgaW5kZXgsIDE2LAotCQkJCQkgJnRibGVudHJ5KTsKLQotCQliYm11bHRfc2NhbGUgPSBsYWRkZXJfaXFbaW5kZXhdLnBlcmNlbnQgKiBiYm11bHQ7Ci0JCWJibXVsdF9zY2FsZSAvPSAxMDA7Ci0KLQkJdGJsZW50cnkgPQotCQkgICAgKChiYm11bHRfc2NhbGUgJiAweGZmKSA8PCA4KSB8IGxhZGRlcl9pcVtpbmRleF0uZ19lbnY7Ci0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfSVFMT0NBTCwgMSwgaW5kZXggKyAzMiwKLQkJCQkJIDE2LCAmdGJsZW50cnkpOwotCX0KLX0KLQotdm9pZCB3bGNfcGh5X2NhbF9wZXJpY2FsX25waHlfcnVuKHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCBjYWx0eXBlKQotewotCXN0cnVjdCBucGh5X3R4Z2FpbnMgdGFyZ2V0X2dhaW47Ci0JdTggdHhfcHdyX2N0cmxfc3RhdGU7Ci0JYm9vbCBmdWxsY2FsID0gdHJ1ZTsKLQlib29sIHJlc3RvcmVfdHhfZ2FpbiA9IGZhbHNlOwotCWJvb2wgbXBoYXNlOwotCi0JaWYgKE5PUkFESU9fRU5BQihwaS0+cHVicGkpKSB7Ci0JCXdsY19waHlfY2FsX3BlcmljYWxfbXBoYXNlX3Jlc2V0KHBpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChQSFlfTVVURUQocGkpKQotCQlyZXR1cm47Ci0KLQlpZiAoY2FsdHlwZSA9PSBQSFlfUEVSSUNBTF9BVVRPKQotCQlmdWxsY2FsID0gKHBpLT5yYWRpb19jaGFuc3BlYyAhPSBwaS0+bnBoeV90eGlxbG9jYWxfY2hhbnNwZWMpOwotCWVsc2UgaWYgKGNhbHR5cGUgPT0gUEhZX1BFUklDQUxfUEFSVElBTCkKLQkJZnVsbGNhbCA9IGZhbHNlOwotCi0JaWYgKHBpLT5jYWxfdHlwZV9vdmVycmlkZSAhPSBQSFlfUEVSSUNBTF9BVVRPKSB7Ci0JCWZ1bGxjYWwgPQotCQkgICAgKHBpLT5jYWxfdHlwZV9vdmVycmlkZSA9PSBQSFlfUEVSSUNBTF9GVUxMKSA/IHRydWUgOiBmYWxzZTsKLQl9Ci0KLQlpZiAoKHBpLT5tcGhhc2VfY2FsX3BoYXNlX2lkID4gTVBIQVNFX0NBTF9TVEFURV9JTklUKSkgewotCQlpZiAocGktPm5waHlfdHhpcWxvY2FsX2NoYW5zcGVjICE9IHBpLT5yYWRpb19jaGFuc3BlYykKLQkJCXdsY19waHlfY2FsX3BlcmljYWxfbXBoYXNlX3Jlc3RhcnQocGkpOwotCX0KLQotCWlmICgocGktPm1waGFzZV9jYWxfcGhhc2VfaWQgPT0gTVBIQVNFX0NBTF9TVEFURV9SWENBTCkpIHsKLQkJd2xhcGlfYm1hY193cml0ZV9zaG0ocGktPnNoLT5waHlzaGltLCBNX0NUU19EVVJBVElPTiwgMTAwMDApOwotCX0KLQotCXdsYXBpX3N1c3BlbmRfbWFjX2FuZF93YWl0KHBpLT5zaC0+cGh5c2hpbSk7Ci0KLQl3bGNfcGh5cmVnX2VudGVyKChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqKSBwaSk7Ci0KLQlpZiAoKHBpLT5tcGhhc2VfY2FsX3BoYXNlX2lkID09IE1QSEFTRV9DQUxfU1RBVEVfSURMRSkgfHwKLQkgICAgKHBpLT5tcGhhc2VfY2FsX3BoYXNlX2lkID09IE1QSEFTRV9DQUxfU1RBVEVfSU5JVCkpIHsKLQkJcGktPm5waHlfY2FsX29yaWdfcHdyX2lkeFswXSA9Ci0JCSAgICAodTgpICgocmVhZF9waHlfcmVnKHBpLCAweDFlZCkgPj4gOCkgJiAweDdmKTsKLQkJcGktPm5waHlfY2FsX29yaWdfcHdyX2lkeFsxXSA9Ci0JCSAgICAodTgpICgocmVhZF9waHlfcmVnKHBpLCAweDFlZSkgPj4gOCkgJiAweDdmKTsKLQotCQlpZiAocGktPm5waHlfdHhwd3JjdHJsICE9IFBIWV9UUENfSFdfT0ZGKSB7Ci0JCQl3bGNfcGh5X3RhYmxlX3JlYWRfbnBoeShwaSwgTlBIWV9UQkxfSURfUkZTRVEsIDIsCi0JCQkJCQkweDExMCwgMTYsCi0JCQkJCQlwaS0+bnBoeV9jYWxfb3JpZ190eF9nYWluKTsKLQkJfSBlbHNlIHsKLQkJCXBpLT5ucGh5X2NhbF9vcmlnX3R4X2dhaW5bMF0gPSAwOwotCQkJcGktPm5waHlfY2FsX29yaWdfdHhfZ2FpblsxXSA9IDA7Ci0JCX0KLQl9Ci0JdGFyZ2V0X2dhaW4gPSB3bGNfcGh5X2dldF90eF9nYWluX25waHkocGkpOwotCXR4X3B3cl9jdHJsX3N0YXRlID0gcGktPm5waHlfdHhwd3JjdHJsOwotCXdsY19waHlfdHhwd3JjdHJsX2VuYWJsZV9ucGh5KHBpLCBQSFlfVFBDX0hXX09GRik7Ci0KLQlpZiAocGktPmFudHNlbF90eXBlID09IEFOVFNFTF8yeDMpCi0JCXdsY19waHlfYW50c2VsX2luaXQoKHN0cnVjdCBicmNtc19waHlfcHViICopIHBpLCB0cnVlKTsKLQotCW1waGFzZSA9IChwaS0+bXBoYXNlX2NhbF9waGFzZV9pZCAhPSBNUEhBU0VfQ0FMX1NUQVRFX0lETEUpOwotCWlmICghbXBoYXNlKSB7Ci0KLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0JCQl3bGNfcGh5X3ByZWNhbF90eGdhaW5fbnBoeShwaSk7Ci0JCQlwaS0+bnBoeV9jYWxfdGFyZ2V0X2dhaW4gPSB3bGNfcGh5X2dldF90eF9nYWluX25waHkocGkpOwotCQkJcmVzdG9yZV90eF9nYWluID0gdHJ1ZTsKLQotCQkJdGFyZ2V0X2dhaW4gPSBwaS0+bnBoeV9jYWxfdGFyZ2V0X2dhaW47Ci0JCX0KLQkJaWYgKDAgPT0KLQkJICAgIHdsY19waHlfY2FsX3R4aXFsb19ucGh5KHBpLCB0YXJnZXRfZ2FpbiwgZnVsbGNhbCwgbXBoYXNlKSkgewotCQkJaWYgKFBIWV9JUEEocGkpKQotCQkJCXdsY19waHlfYTQocGksIHRydWUpOwotCi0JCQl3bGNfcGh5cmVnX2V4aXQoKHN0cnVjdCBicmNtc19waHlfcHViICopIHBpKTsKLQkJCXdsYXBpX2VuYWJsZV9tYWMocGktPnNoLT5waHlzaGltKTsKLQkJCXdsYXBpX2JtYWNfd3JpdGVfc2htKHBpLT5zaC0+cGh5c2hpbSwgTV9DVFNfRFVSQVRJT04sCi0JCQkJCSAgICAgMTAwMDApOwotCQkJd2xhcGlfc3VzcGVuZF9tYWNfYW5kX3dhaXQocGktPnNoLT5waHlzaGltKTsKLQkJCXdsY19waHlyZWdfZW50ZXIoKHN0cnVjdCBicmNtc19waHlfcHViICopIHBpKTsKLQotCQkJaWYgKDAgPT0gd2xjX3BoeV9jYWxfcnhpcV9ucGh5KHBpLCB0YXJnZXRfZ2FpbiwKLQkJCQkJCQkgICAgIChwaS0+Ci0JCQkJCQkJICAgICAgZmlyc3RfY2FsX2FmdGVyX2Fzc29jCi0JCQkJCQkJICAgICAgfHwgKHBpLT4KLQkJCQkJCQkJICBjYWxfdHlwZV9vdmVycmlkZQotCQkJCQkJCQkgID09Ci0JCQkJCQkJCSAgUEhZX1BFUklDQUxfRlVMTCkpCi0JCQkJCQkJICAgICA/IDIgOiAwLCBmYWxzZSkpIHsKLQkJCQl3bGNfcGh5X3NhdmVjYWxfbnBoeShwaSk7Ci0KLQkJCQl3bGNfcGh5X3R4cHdyY3RybF9jb2VmZl9zZXR1cF9ucGh5KHBpKTsKLQotCQkJCXBpLT5ucGh5X3BlcmljYWxfbGFzdCA9IHBpLT5zaC0+bm93OwotCQkJfQotCQl9Ci0JCWlmIChjYWx0eXBlICE9IFBIWV9QRVJJQ0FMX0FVVE8pIHsKLQkJCXdsY19waHlfcnNzaV9jYWxfbnBoeShwaSk7Ci0JCX0KLQotCQlpZiAocGktPmZpcnN0X2NhbF9hZnRlcl9hc3NvYwotCQkgICAgfHwgKHBpLT5jYWxfdHlwZV9vdmVycmlkZSA9PSBQSFlfUEVSSUNBTF9GVUxMKSkgewotCQkJcGktPmZpcnN0X2NhbF9hZnRlcl9hc3NvYyA9IGZhbHNlOwotCQkJd2xjX3BoeV90eHB3cmN0cmxfaWRsZV90c3NpX25waHkocGkpOwotCQkJd2xjX3BoeV90eHB3cmN0cmxfcHdyX3NldHVwX25waHkocGkpOwotCQl9Ci0KLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0JCQl3bGNfcGh5X3JhZGlvMjA1eF92Y29jYWxfbnBoeShwaSk7Ci0JCX0KLQl9IGVsc2UgewotCQlzd2l0Y2ggKHBpLT5tcGhhc2VfY2FsX3BoYXNlX2lkKSB7Ci0JCWNhc2UgTVBIQVNFX0NBTF9TVEFURV9JTklUOgotCQkJcGktPm5waHlfcGVyaWNhbF9sYXN0ID0gcGktPnNoLT5ub3c7Ci0JCQlwaS0+bnBoeV90eGlxbG9jYWxfY2hhbnNwZWMgPSBwaS0+cmFkaW9fY2hhbnNwZWM7Ci0KLQkJCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCQkJCXdsY19waHlfcHJlY2FsX3R4Z2Fpbl9ucGh5KHBpKTsKLQkJCX0KLQkJCXBpLT5ucGh5X2NhbF90YXJnZXRfZ2FpbiA9IHdsY19waHlfZ2V0X3R4X2dhaW5fbnBoeShwaSk7Ci0JCQlwaS0+bXBoYXNlX2NhbF9waGFzZV9pZCsrOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNUEhBU0VfQ0FMX1NUQVRFX1RYUEhBU0UwOgotCQljYXNlIE1QSEFTRV9DQUxfU1RBVEVfVFhQSEFTRTE6Ci0JCWNhc2UgTVBIQVNFX0NBTF9TVEFURV9UWFBIQVNFMjoKLQkJY2FzZSBNUEhBU0VfQ0FMX1NUQVRFX1RYUEhBU0UzOgotCQljYXNlIE1QSEFTRV9DQUxfU1RBVEVfVFhQSEFTRTQ6Ci0JCWNhc2UgTVBIQVNFX0NBTF9TVEFURV9UWFBIQVNFNToKLQkJCWlmICgocGktPnJhZGFyX3BlcmNhbF9tYXNrICYgMHgxMCkgIT0gMCkKLQkJCQlwaS0+bnBoeV9yeGNhbF9hY3RpdmUgPSB0cnVlOwotCi0JCQlpZiAod2xjX3BoeV9jYWxfdHhpcWxvX25waHkKLQkJCSAgICAocGksIHBpLT5ucGh5X2NhbF90YXJnZXRfZ2FpbiwgZnVsbGNhbCwKLQkJCSAgICAgdHJ1ZSkgIT0gMCkgewotCi0JCQkJd2xjX3BoeV9jYWxfcGVyaWNhbF9tcGhhc2VfcmVzZXQocGkpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAoTlJFVl9MRShwaS0+cHVicGkucGh5X3JldiwgMikgJiYKLQkJCSAgICAocGktPm1waGFzZV9jYWxfcGhhc2VfaWQgPT0KLQkJCSAgICAgTVBIQVNFX0NBTF9TVEFURV9UWFBIQVNFNCkpIHsKLQkJCQlwaS0+bXBoYXNlX2NhbF9waGFzZV9pZCArPSAyOwotCQkJfSBlbHNlIHsKLQkJCQlwaS0+bXBoYXNlX2NhbF9waGFzZV9pZCsrOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNUEhBU0VfQ0FMX1NUQVRFX1BBUERDQUw6Ci0JCQlpZiAoKHBpLT5yYWRhcl9wZXJjYWxfbWFzayAmIDB4MikgIT0gMCkKLQkJCQlwaS0+bnBoeV9yeGNhbF9hY3RpdmUgPSB0cnVlOwotCi0JCQlpZiAoUEhZX0lQQShwaSkpIHsKLQkJCQl3bGNfcGh5X2E0KHBpLCB0cnVlKTsKLQkJCX0KLQkJCXBpLT5tcGhhc2VfY2FsX3BoYXNlX2lkKys7Ci0JCQlicmVhazsKLQotCQljYXNlIE1QSEFTRV9DQUxfU1RBVEVfUlhDQUw6Ci0JCQlpZiAoKHBpLT5yYWRhcl9wZXJjYWxfbWFzayAmIDB4MSkgIT0gMCkKLQkJCQlwaS0+bnBoeV9yeGNhbF9hY3RpdmUgPSB0cnVlOwotCQkJaWYgKHdsY19waHlfY2FsX3J4aXFfbnBoeShwaSwgdGFyZ2V0X2dhaW4sCi0JCQkJCQkgIChwaS0+Zmlyc3RfY2FsX2FmdGVyX2Fzc29jIHx8Ci0JCQkJCQkgICAocGktPmNhbF90eXBlX292ZXJyaWRlID09Ci0JCQkJCQkgICAgUEhZX1BFUklDQUxfRlVMTCkpID8gMiA6IDAsCi0JCQkJCQkgIGZhbHNlKSA9PSAwKSB7Ci0JCQkJd2xjX3BoeV9zYXZlY2FsX25waHkocGkpOwotCQkJfQotCi0JCQlwaS0+bXBoYXNlX2NhbF9waGFzZV9pZCsrOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNUEhBU0VfQ0FMX1NUQVRFX1JTU0lDQUw6Ci0JCQlpZiAoKHBpLT5yYWRhcl9wZXJjYWxfbWFzayAmIDB4NCkgIT0gMCkKLQkJCQlwaS0+bnBoeV9yeGNhbF9hY3RpdmUgPSB0cnVlOwotCQkJd2xjX3BoeV90eHB3cmN0cmxfY29lZmZfc2V0dXBfbnBoeShwaSk7Ci0JCQl3bGNfcGh5X3Jzc2lfY2FsX25waHkocGkpOwotCi0JCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJCQl3bGNfcGh5X3JhZGlvMjA1eF92Y29jYWxfbnBoeShwaSk7Ci0JCQl9Ci0JCQlyZXN0b3JlX3R4X2dhaW4gPSB0cnVlOwotCi0JCQlpZiAocGktPmZpcnN0X2NhbF9hZnRlcl9hc3NvYykgewotCQkJCXBpLT5tcGhhc2VfY2FsX3BoYXNlX2lkKys7Ci0JCQl9IGVsc2UgewotCQkJCXdsY19waHlfY2FsX3BlcmljYWxfbXBoYXNlX3Jlc2V0KHBpKTsKLQkJCX0KLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNUEhBU0VfQ0FMX1NUQVRFX0lETEVUU1NJOgotCQkJaWYgKChwaS0+cmFkYXJfcGVyY2FsX21hc2sgJiAweDgpICE9IDApCi0JCQkJcGktPm5waHlfcnhjYWxfYWN0aXZlID0gdHJ1ZTsKLQotCQkJaWYgKHBpLT5maXJzdF9jYWxfYWZ0ZXJfYXNzb2MpIHsKLQkJCQlwaS0+Zmlyc3RfY2FsX2FmdGVyX2Fzc29jID0gZmFsc2U7Ci0JCQkJd2xjX3BoeV90eHB3cmN0cmxfaWRsZV90c3NpX25waHkocGkpOwotCQkJCXdsY19waHlfdHhwd3JjdHJsX3B3cl9zZXR1cF9ucGh5KHBpKTsKLQkJCX0KLQotCQkJd2xjX3BoeV9jYWxfcGVyaWNhbF9tcGhhc2VfcmVzZXQocGkpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXdsY19waHlfY2FsX3BlcmljYWxfbXBoYXNlX3Jlc2V0KHBpKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0JCWlmIChyZXN0b3JlX3R4X2dhaW4pIHsKLQkJCWlmICh0eF9wd3JfY3RybF9zdGF0ZSAhPSBQSFlfVFBDX0hXX09GRikgewotCi0JCQkJd2xjX3BoeV90eHB3cl9pbmRleF9ucGh5KHBpLCAxLAotCQkJCQkJCSBwaS0+Ci0JCQkJCQkJIG5waHlfY2FsX29yaWdfcHdyX2lkeAotCQkJCQkJCSBbMF0sIGZhbHNlKTsKLQkJCQl3bGNfcGh5X3R4cHdyX2luZGV4X25waHkocGksIDIsCi0JCQkJCQkJIHBpLT4KLQkJCQkJCQkgbnBoeV9jYWxfb3JpZ19wd3JfaWR4Ci0JCQkJCQkJIFsxXSwgZmFsc2UpOwotCi0JCQkJcGktPm5waHlfdHhwd3JpbmRleFswXS5pbmRleCA9IC0xOwotCQkJCXBpLT5ucGh5X3R4cHdyaW5kZXhbMV0uaW5kZXggPSAtMTsKLQkJCX0gZWxzZSB7Ci0JCQkJd2xjX3BoeV90eHB3cl9pbmRleF9ucGh5KHBpLCAoMSA8PCAwKSwKLQkJCQkJCQkgKHM4KSAocGktPgotCQkJCQkJCQkgbnBoeV90eHB3cmluZGV4Ci0JCQkJCQkJCSBbMF0uCi0JCQkJCQkJCSBpbmRleF9pbnRlcm5hbCksCi0JCQkJCQkJIGZhbHNlKTsKLQkJCQl3bGNfcGh5X3R4cHdyX2luZGV4X25waHkocGksICgxIDw8IDEpLAotCQkJCQkJCSAoczgpIChwaS0+Ci0JCQkJCQkJCSBucGh5X3R4cHdyaW5kZXgKLQkJCQkJCQkJIFsxXS4KLQkJCQkJCQkJIGluZGV4X2ludGVybmFsKSwKLQkJCQkJCQkgZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0Jd2xjX3BoeV90eHB3cmN0cmxfZW5hYmxlX25waHkocGksIHR4X3B3cl9jdHJsX3N0YXRlKTsKLQl3bGNfcGh5cmVnX2V4aXQoKHN0cnVjdCBicmNtc19waHlfcHViICopIHBpKTsKLQl3bGFwaV9lbmFibGVfbWFjKHBpLT5zaC0+cGh5c2hpbSk7Ci19Ci0KLWludAotd2xjX3BoeV9jYWxfdHhpcWxvX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHN0cnVjdCBucGh5X3R4Z2FpbnMgdGFyZ2V0X2dhaW4sCi0JCQlib29sIGZ1bGxjYWwsIGJvb2wgbXBoYXNlKQotewotCXUxNiB2YWw7Ci0JdTE2IHRibF9idWZbMTFdOwotCXU4IGNhbF9jbnQ7Ci0JdTE2IGNhbF9jbWQ7Ci0JdTggbnVtX2NhbHMsIG1heF9jYWxfY21kczsKLQl1MTYgY29yZV9ubywgY2FsX3R5cGU7Ci0JdTE2IGRpcV9zdGFydCA9IDA7Ci0JdTggcGh5X2J3OwotCXUxNiBtYXhfdmFsOwotCXUxNiB0b25lX2ZyZXE7Ci0JdTE2IGdhaW5fc2F2ZVsyXTsKLQl1MTYgY2FsX2dhaW5bMl07Ci0Jc3RydWN0IG5waHlfaXFjYWxfcGFyYW1zIGNhbF9wYXJhbXNbMl07Ci0JdTMyIHRibF9sZW47Ci0Jdm9pZCAqdGJsX3B0cjsKLQlib29sIGxhZGRlcl91cGRhdGVkWzJdOwotCXU4IG1waGFzZV9jYWxfbGFzdHBoYXNlID0gMDsKLQlpbnQgYmNtZXJyb3IgPSAwOwotCWJvb2wgcGh5aGFuZ19hdm9pZF9zdGF0ZSA9IGZhbHNlOwotCi0JdTE2IHRibF90eF9pcWxvX2NhbF9sb2Z0X2xhZGRlcl8yMFtdID0gewotCQkweDAzMDAsIDB4MDUwMCwgMHgwNzAwLCAweDA5MDAsIDB4MGQwMCwgMHgxMTAwLCAweDE5MDAsIDB4MTkwMSwKLQkJICAgIDB4MTkwMiwKLQkJMHgxOTAzLCAweDE5MDQsIDB4MTkwNSwgMHgxOTA2LCAweDE5MDcsIDB4MjQwNywgMHgzMjA3LCAweDQ2MDcsCi0JCSAgICAweDY0MDcKLQl9OwotCi0JdTE2IHRibF90eF9pcWxvX2NhbF9pcWltYl9sYWRkZXJfMjBbXSA9IHsKLQkJMHgwMjAwLCAweDAzMDAsIDB4MDYwMCwgMHgwOTAwLCAweDBkMDAsIDB4MTEwMCwgMHgxOTAwLCAweDI0MDAsCi0JCSAgICAweDMyMDAsCi0JCTB4NDYwMCwgMHg2NDAwLCAweDY0MDEsIDB4NjQwMiwgMHg2NDAzLCAweDY0MDQsIDB4NjQwNSwgMHg2NDA2LAotCQkgICAgMHg2NDA3Ci0JfTsKLQotCXUxNiB0YmxfdHhfaXFsb19jYWxfbG9mdF9sYWRkZXJfNDBbXSA9IHsKLQkJMHgwMjAwLCAweDAzMDAsIDB4MDQwMCwgMHgwNzAwLCAweDA5MDAsIDB4MGMwMCwgMHgxMjAwLCAweDEyMDEsCi0JCSAgICAweDEyMDIsCi0JCTB4MTIwMywgMHgxMjA0LCAweDEyMDUsIDB4MTIwNiwgMHgxMjA3LCAweDE5MDcsIDB4MjMwNywgMHgzMjA3LAotCQkgICAgMHg0NzA3Ci0JfTsKLQotCXUxNiB0YmxfdHhfaXFsb19jYWxfaXFpbWJfbGFkZGVyXzQwW10gPSB7Ci0JCTB4MDEwMCwgMHgwMjAwLCAweDA0MDAsIDB4MDcwMCwgMHgwOTAwLCAweDBjMDAsIDB4MTIwMCwgMHgxOTAwLAotCQkgICAgMHgyMzAwLAotCQkweDMyMDAsIDB4NDcwMCwgMHg0NzAxLCAweDQ3MDIsIDB4NDcwMywgMHg0NzA0LCAweDQ3MDUsIDB4NDcwNiwKLQkJICAgIDB4NDcwNwotCX07Ci0KLQl1MTYgdGJsX3R4X2lxbG9fY2FsX3N0YXJ0Y29lZnNbXSA9IHsKLQkJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCi0JCSAgICAweDAwMDAKLQl9OwotCi0JdTE2IHRibF90eF9pcWxvX2NhbF9jbWRzX2Z1bGxjYWxbXSA9IHsKLQkJMHg4MTIzLCAweDgyNjQsIDB4ODA4NiwgMHg4MjQ1LCAweDgwNTYsCi0JCTB4OTEyMywgMHg5MjY0LCAweDkwODYsIDB4OTI0NSwgMHg5MDU2Ci0JfTsKLQotCXUxNiB0YmxfdHhfaXFsb19jYWxfY21kc19yZWNhbFtdID0gewotCQkweDgxMDEsIDB4ODI1MywgMHg4MDUzLCAweDgyMzQsIDB4ODAzNCwKLQkJMHg5MTAxLCAweDkyNTMsIDB4OTA1MywgMHg5MjM0LCAweDkwMzQKLQl9OwotCi0JdTE2IHRibF90eF9pcWxvX2NhbF9zdGFydGNvZWZzX25waHlyZXYzW10gPSB7Ci0JCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAotCQkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLQkJMHgwMDAwCi0JfTsKLQotCXUxNiB0YmxfdHhfaXFsb19jYWxfY21kc19mdWxsY2FsX25waHlyZXYzW10gPSB7Ci0JCTB4ODQzNCwgMHg4MzM0LCAweDgwODQsIDB4ODI2NywgMHg4MDU2LCAweDgyMzQsCi0JCTB4OTQzNCwgMHg5MzM0LCAweDkwODQsIDB4OTI2NywgMHg5MDU2LCAweDkyMzQKLQl9OwotCi0JdTE2IHRibF90eF9pcWxvX2NhbF9jbWRzX3JlY2FsX25waHlyZXYzW10gPSB7Ci0JCTB4ODQyMywgMHg4MzIzLCAweDgwNzMsIDB4ODI1NiwgMHg4MDQ1LCAweDgyMjMsCi0JCTB4OTQyMywgMHg5MzIzLCAweDkwNzMsIDB4OTI1NiwgMHg5MDQ1LCAweDkyMjMKLQl9OwotCi0Jd2xjX3BoeV9zdGF5X2luX2NhcnJpZXJzZWFyY2hfbnBoeShwaSwgdHJ1ZSk7Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNCkpIHsKLQkJcGh5aGFuZ19hdm9pZF9zdGF0ZSA9IHBpLT5waHloYW5nX2F2b2lkOwotCQlwaS0+cGh5aGFuZ19hdm9pZCA9IGZhbHNlOwotCX0KLQotCWlmIChDSFNQRUNfSVM0MChwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCXBoeV9idyA9IDQwOwotCX0gZWxzZSB7Ci0JCXBoeV9idyA9IDIwOwotCX0KLQotCXdsY19waHlfdGFibGVfcmVhZF9ucGh5KHBpLCBOUEhZX1RCTF9JRF9SRlNFUSwgMiwgMHgxMTAsIDE2LCBnYWluX3NhdmUpOwotCi0JZm9yIChjb3JlX25vID0gMDsgY29yZV9ubyA8PSAxOyBjb3JlX25vKyspIHsKLQkJd2xjX3BoeV9pcWNhbF9nYWlucGFyYW1zX25waHkocGksIGNvcmVfbm8sIHRhcmdldF9nYWluLAotCQkJCQkgICAgICAmY2FsX3BhcmFtc1tjb3JlX25vXSk7Ci0JCWNhbF9nYWluW2NvcmVfbm9dID0gY2FsX3BhcmFtc1tjb3JlX25vXS5jYWxfZ2FpbjsKLQl9Ci0KLQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX1JGU0VRLCAyLCAweDExMCwgMTYsIGNhbF9nYWluKTsKLQotCXdsY19waHlfdHhjYWxfcmFkaW9fc2V0dXBfbnBoeShwaSk7Ci0KLQl3bGNfcGh5X3R4Y2FsX3BoeXNldHVwX25waHkocGkpOwotCi0JbGFkZGVyX3VwZGF0ZWRbMF0gPSBsYWRkZXJfdXBkYXRlZFsxXSA9IGZhbHNlOwotCWlmICghKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDYpIHx8Ci0JICAgICAgKE5SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDUpICYmIFBIWV9JUEEocGkpCi0JICAgICAgICYmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSkpKSB7Ci0KLQkJaWYgKHBoeV9idyA9PSA0MCkgewotCQkJdGJsX3B0ciA9IHRibF90eF9pcWxvX2NhbF9sb2Z0X2xhZGRlcl80MDsKLQkJCXRibF9sZW4gPSBBUlJBWV9TSVpFKHRibF90eF9pcWxvX2NhbF9sb2Z0X2xhZGRlcl80MCk7Ci0JCX0gZWxzZSB7Ci0JCQl0YmxfcHRyID0gdGJsX3R4X2lxbG9fY2FsX2xvZnRfbGFkZGVyXzIwOwotCQkJdGJsX2xlbiA9IEFSUkFZX1NJWkUodGJsX3R4X2lxbG9fY2FsX2xvZnRfbGFkZGVyXzIwKTsKLQkJfQotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0lRTE9DQUwsIHRibF9sZW4sIDAsCi0JCQkJCSAxNiwgdGJsX3B0cik7Ci0KLQkJaWYgKHBoeV9idyA9PSA0MCkgewotCQkJdGJsX3B0ciA9IHRibF90eF9pcWxvX2NhbF9pcWltYl9sYWRkZXJfNDA7Ci0JCQl0YmxfbGVuID0gQVJSQVlfU0laRSh0YmxfdHhfaXFsb19jYWxfaXFpbWJfbGFkZGVyXzQwKTsKLQkJfSBlbHNlIHsKLQkJCXRibF9wdHIgPSB0YmxfdHhfaXFsb19jYWxfaXFpbWJfbGFkZGVyXzIwOwotCQkJdGJsX2xlbiA9IEFSUkFZX1NJWkUodGJsX3R4X2lxbG9fY2FsX2lxaW1iX2xhZGRlcl8yMCk7Ci0JCX0KLQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9JUUxPQ0FMLCB0YmxfbGVuLCAzMiwKLQkJCQkJIDE2LCB0YmxfcHRyKTsKLQl9Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHhjMiwgMHg4YWQ5KTsKLQl9IGVsc2UgewotCQl3cml0ZV9waHlfcmVnKHBpLCAweGMyLCAweDhhYTkpOwotCX0KLQotCW1heF92YWwgPSAyNTA7Ci0JdG9uZV9mcmVxID0gKHBoeV9idyA9PSAyMCkgPyAyNTAwIDogNTAwMDsKLQotCWlmIChwaS0+bXBoYXNlX2NhbF9waGFzZV9pZCA+IE1QSEFTRV9DQUxfU1RBVEVfVFhQSEFTRTApIHsKLQkJd2xjX3BoeV9ydW5zYW1wbGVzX25waHkocGksIHBoeV9idyAqIDgsIDB4ZmZmZiwgMCwgMSwgMCwgZmFsc2UpOwotCQliY21lcnJvciA9IDA7Ci0JfSBlbHNlIHsKLQkJYmNtZXJyb3IgPQotCQkgICAgd2xjX3BoeV90eF90b25lX25waHkocGksIHRvbmVfZnJlcSwgbWF4X3ZhbCwgMSwgMCwgZmFsc2UpOwotCX0KLQotCWlmIChiY21lcnJvciA9PSAwKSB7Ci0KLQkJaWYgKHBpLT5tcGhhc2VfY2FsX3BoYXNlX2lkID4gTVBIQVNFX0NBTF9TVEFURV9UWFBIQVNFMCkgewotCQkJdGJsX3B0ciA9IHBpLT5tcGhhc2VfdHhjYWxfYmVzdGNvZWZmczsKLQkJCXRibF9sZW4gPSBBUlJBWV9TSVpFKHBpLT5tcGhhc2VfdHhjYWxfYmVzdGNvZWZmcyk7Ci0JCQlpZiAoTlJFVl9MVChwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQotCQkJCXRibF9sZW4gLT0gMjsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgoIWZ1bGxjYWwpICYmIChwaS0+bnBoeV90eGlxbG9jYWxfY29lZmZzdmFsaWQpKSB7Ci0KLQkJCQl0YmxfcHRyID0gcGktPm5waHlfdHhpcWxvY2FsX2Jlc3RjOwotCQkJCXRibF9sZW4gPSBBUlJBWV9TSVpFKHBpLT5ucGh5X3R4aXFsb2NhbF9iZXN0Yyk7Ci0JCQkJaWYgKE5SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0KLQkJCQkJdGJsX2xlbiAtPSAyOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0KLQkJCQlmdWxsY2FsID0gdHJ1ZTsKLQotCQkJCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCQkJCQl0YmxfcHRyID0KLQkJCQkJICAgIHRibF90eF9pcWxvX2NhbF9zdGFydGNvZWZzX25waHlyZXYzOwotCQkJCQl0YmxfbGVuID0KLQkJCQkJICAgIEFSUkFZX1NJWkUKLQkJCQkJICAgICh0YmxfdHhfaXFsb19jYWxfc3RhcnRjb2Vmc19ucGh5cmV2Myk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGJsX3B0ciA9IHRibF90eF9pcWxvX2NhbF9zdGFydGNvZWZzOwotCQkJCQl0YmxfbGVuID0KLQkJCQkJICAgIEFSUkFZX1NJWkUKLQkJCQkJICAgICh0YmxfdHhfaXFsb19jYWxfc3RhcnRjb2Vmcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfSVFMT0NBTCwgdGJsX2xlbiwgNjQsCi0JCQkJCSAxNiwgdGJsX3B0cik7Ci0KLQkJaWYgKGZ1bGxjYWwpIHsKLQkJCW1heF9jYWxfY21kcyA9IChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgPwotCQkJICAgIEFSUkFZX1NJWkUodGJsX3R4X2lxbG9fY2FsX2NtZHNfZnVsbGNhbF9ucGh5cmV2MykgOgotCQkJICAgIEFSUkFZX1NJWkUodGJsX3R4X2lxbG9fY2FsX2NtZHNfZnVsbGNhbCk7Ci0JCX0gZWxzZSB7Ci0JCQltYXhfY2FsX2NtZHMgPSAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykpID8KLQkJCSAgICBBUlJBWV9TSVpFKHRibF90eF9pcWxvX2NhbF9jbWRzX3JlY2FsX25waHlyZXYzKSA6Ci0JCQkgICAgQVJSQVlfU0laRSh0YmxfdHhfaXFsb19jYWxfY21kc19yZWNhbCk7Ci0JCX0KLQotCQlpZiAobXBoYXNlKSB7Ci0JCQljYWxfY250ID0gcGktPm1waGFzZV90eGNhbF9jbWRpZHg7Ci0JCQlpZiAoKGNhbF9jbnQgKyBwaS0+bXBoYXNlX3R4Y2FsX251bWNtZHMpIDwgbWF4X2NhbF9jbWRzKSB7Ci0JCQkJbnVtX2NhbHMgPSBjYWxfY250ICsgcGktPm1waGFzZV90eGNhbF9udW1jbWRzOwotCQkJfSBlbHNlIHsKLQkJCQludW1fY2FscyA9IG1heF9jYWxfY21kczsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWNhbF9jbnQgPSAwOwotCQkJbnVtX2NhbHMgPSBtYXhfY2FsX2NtZHM7Ci0JCX0KLQotCQlmb3IgKDsgY2FsX2NudCA8IG51bV9jYWxzOyBjYWxfY250KyspIHsKLQotCQkJaWYgKGZ1bGxjYWwpIHsKLQkJCQljYWxfY21kID0gKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSA/Ci0JCQkJICAgIHRibF90eF9pcWxvX2NhbF9jbWRzX2Z1bGxjYWxfbnBoeXJldjMKLQkJCQkgICAgW2NhbF9jbnRdIDoKLQkJCQkgICAgdGJsX3R4X2lxbG9fY2FsX2NtZHNfZnVsbGNhbFtjYWxfY250XTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FsX2NtZCA9IChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgPwotCQkJCSAgICB0YmxfdHhfaXFsb19jYWxfY21kc19yZWNhbF9ucGh5cmV2M1tjYWxfY250XQotCQkJCSAgICA6IHRibF90eF9pcWxvX2NhbF9jbWRzX3JlY2FsW2NhbF9jbnRdOwotCQkJfQotCi0JCQljb3JlX25vID0gKChjYWxfY21kICYgMHgzMDAwKSA+PiAxMik7Ci0JCQljYWxfdHlwZSA9ICgoY2FsX2NtZCAmIDB4MEYwMCkgPj4gOCk7Ci0KLQkJCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA2KSB8fAotCQkJICAgIChOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCA1KSAmJgotCQkJICAgICBQSFlfSVBBKHBpKQotCQkJICAgICAmJiAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkpKSB7Ci0JCQkJaWYgKCFsYWRkZXJfdXBkYXRlZFtjb3JlX25vXSkgewotCQkJCQl3bGNfcGh5X3VwZGF0ZV90eGNhbF9sYWRkZXJfbnBoeShwaSwKLQkJCQkJCQkJCSBjb3JlX25vKTsKLQkJCQkJbGFkZGVyX3VwZGF0ZWRbY29yZV9ub10gPSB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQkJdmFsID0KLQkJCSAgICAoY2FsX3BhcmFtc1tjb3JlX25vXS4KLQkJCSAgICAgbmNvcnJbY2FsX3R5cGVdIDw8IDgpIHwgTlBIWV9OX0dDVEw7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAweGMxLCB2YWwpOwotCi0JCQlpZiAoKGNhbF90eXBlID09IDEpIHx8IChjYWxfdHlwZSA9PSAzKQotCQkJICAgIHx8IChjYWxfdHlwZSA9PSA0KSkgewotCi0JCQkJd2xjX3BoeV90YWJsZV9yZWFkX25waHkocGksIE5QSFlfVEJMX0lEX0lRTE9DQUwsCi0JCQkJCQkJMSwgNjkgKyBjb3JlX25vLCAxNiwKLQkJCQkJCQl0YmxfYnVmKTsKLQotCQkJCWRpcV9zdGFydCA9IHRibF9idWZbMF07Ci0KLQkJCQl0YmxfYnVmWzBdID0gMDsKLQkJCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksCi0JCQkJCQkJIE5QSFlfVEJMX0lEX0lRTE9DQUwsIDEsCi0JCQkJCQkJIDY5ICsgY29yZV9ubywgMTYsCi0JCQkJCQkJIHRibF9idWYpOwotCQkJfQotCi0JCQl3cml0ZV9waHlfcmVnKHBpLCAweGMwLCBjYWxfY21kKTsKLQotCQkJU1BJTldBSVQoKChyZWFkX3BoeV9yZWcocGksIDB4YzApICYgMHhjMDAwKSAhPSAwKSwKLQkJCQkgMjAwMDApOwotCQkJaWYgKFdBUk4ocmVhZF9waHlfcmVnKHBpLCAweGMwKSAmIDB4YzAwMCwKLQkJCQkgIkhXIGVycm9yOiB0eGlxIGNhbGliIikpCi0JCQkJcmV0dXJuIC1FSU87Ci0KLQkJCXdsY19waHlfdGFibGVfcmVhZF9ucGh5KHBpLCBOUEhZX1RCTF9JRF9JUUxPQ0FMLAotCQkJCQkJdGJsX2xlbiwgOTYsIDE2LCB0YmxfYnVmKTsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfSVFMT0NBTCwKLQkJCQkJCSB0YmxfbGVuLCA2NCwgMTYsIHRibF9idWYpOwotCi0JCQlpZiAoKGNhbF90eXBlID09IDEpIHx8IChjYWxfdHlwZSA9PSAzKQotCQkJICAgIHx8IChjYWxfdHlwZSA9PSA0KSkgewotCi0JCQkJdGJsX2J1ZlswXSA9IGRpcV9zdGFydDsKLQotCQkJfQotCi0JCX0KLQotCQlpZiAobXBoYXNlKSB7Ci0JCQlwaS0+bXBoYXNlX3R4Y2FsX2NtZGlkeCA9IG51bV9jYWxzOwotCQkJaWYgKHBpLT5tcGhhc2VfdHhjYWxfY21kaWR4ID49IG1heF9jYWxfY21kcykKLQkJCQlwaS0+bXBoYXNlX3R4Y2FsX2NtZGlkeCA9IDA7Ci0JCX0KLQotCQltcGhhc2VfY2FsX2xhc3RwaGFzZSA9Ci0JCSAgICAoTlJFVl9MRShwaS0+cHVicGkucGh5X3JldiwgMikpID8KLQkJICAgIE1QSEFTRV9DQUxfU1RBVEVfVFhQSEFTRTQgOiBNUEhBU0VfQ0FMX1NUQVRFX1RYUEhBU0U1OwotCi0JCWlmICghbXBoYXNlCi0JCSAgICB8fCAocGktPm1waGFzZV9jYWxfcGhhc2VfaWQgPT0gbXBoYXNlX2NhbF9sYXN0cGhhc2UpKSB7Ci0KLQkJCXdsY19waHlfdGFibGVfcmVhZF9ucGh5KHBpLCBOUEhZX1RCTF9JRF9JUUxPQ0FMLCA0LCA5NiwKLQkJCQkJCTE2LCB0YmxfYnVmKTsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfSVFMT0NBTCwgNCwgODAsCi0JCQkJCQkgMTYsIHRibF9idWYpOwotCi0JCQlpZiAoTlJFVl9MVChwaS0+cHVicGkucGh5X3JldiwgMikpIHsKLQotCQkJCXRibF9idWZbMF0gPSAwOwotCQkJCXRibF9idWZbMV0gPSAwOwotCQkJCXRibF9idWZbMl0gPSAwOwotCQkJCXRibF9idWZbM10gPSAwOwotCi0JCQl9Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0lRTE9DQUwsIDQsIDg4LAotCQkJCQkJIDE2LCB0YmxfYnVmKTsKLQotCQkJd2xjX3BoeV90YWJsZV9yZWFkX25waHkocGksIE5QSFlfVEJMX0lEX0lRTE9DQUwsIDIsIDEwMSwKLQkJCQkJCTE2LCB0YmxfYnVmKTsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfSVFMT0NBTCwgMiwgODUsCi0JCQkJCQkgMTYsIHRibF9idWYpOwotCi0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0lRTE9DQUwsIDIsIDkzLAotCQkJCQkJIDE2LCB0YmxfYnVmKTsKLQotCQkJdGJsX2xlbiA9IEFSUkFZX1NJWkUocGktPm5waHlfdHhpcWxvY2FsX2Jlc3RjKTsKLQkJCWlmIChOUkVWX0xUKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCi0JCQkJdGJsX2xlbiAtPSAyOwotCQkJfQotCQkJd2xjX3BoeV90YWJsZV9yZWFkX25waHkocGksIE5QSFlfVEJMX0lEX0lRTE9DQUwsCi0JCQkJCQl0YmxfbGVuLCA5NiwgMTYsCi0JCQkJCQlwaS0+bnBoeV90eGlxbG9jYWxfYmVzdGMpOwotCi0JCQlwaS0+bnBoeV90eGlxbG9jYWxfY29lZmZzdmFsaWQgPSB0cnVlOwotCQkJcGktPm5waHlfdHhpcWxvY2FsX2NoYW5zcGVjID0gcGktPnJhZGlvX2NoYW5zcGVjOwotCQl9IGVsc2UgewotCQkJdGJsX2xlbiA9IEFSUkFZX1NJWkUocGktPm1waGFzZV90eGNhbF9iZXN0Y29lZmZzKTsKLQkJCWlmIChOUkVWX0xUKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCi0JCQkJdGJsX2xlbiAtPSAyOwotCQkJfQotCQkJd2xjX3BoeV90YWJsZV9yZWFkX25waHkocGksIE5QSFlfVEJMX0lEX0lRTE9DQUwsCi0JCQkJCQl0YmxfbGVuLCA5NiwgMTYsCi0JCQkJCQlwaS0+bXBoYXNlX3R4Y2FsX2Jlc3Rjb2VmZnMpOwotCQl9Ci0KLQkJd2xjX3BoeV9zdG9wcGxheWJhY2tfbnBoeShwaSk7Ci0KLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHhjMiwgMHgwMDAwKTsKLQotCX0KLQotCXdsY19waHlfdHhjYWxfcGh5Y2xlYW51cF9ucGh5KHBpKTsKLQotCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfUkZTRVEsIDIsIDB4MTEwLCAxNiwKLQkJCQkgZ2Fpbl9zYXZlKTsKLQotCXdsY19waHlfdHhjYWxfcmFkaW9fY2xlYW51cF9ucGh5KHBpKTsKLQotCWlmIChOUkVWX0xUKHBpLT5wdWJwaS5waHlfcmV2LCAyKSkgewotCQlpZiAoIW1waGFzZQotCQkgICAgfHwgKHBpLT5tcGhhc2VfY2FsX3BoYXNlX2lkID09IG1waGFzZV9jYWxfbGFzdHBoYXNlKSkKLQkJCXdsY19waHlfdHhfaXFfd2FyX25waHkocGkpOwotCX0KLQotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA0KSkgewotCQlwaS0+cGh5aGFuZ19hdm9pZCA9IHBoeWhhbmdfYXZvaWRfc3RhdGU7Ci0JfQotCi0Jd2xjX3BoeV9zdGF5X2luX2NhcnJpZXJzZWFyY2hfbnBoeShwaSwgZmFsc2UpOwotCi0JcmV0dXJuIGJjbWVycm9yOwotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3JlYXBwbHlfdHhjYWxfY29lZmZzX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JdTE2IHRibF9idWZbN107Ci0KLQlpZiAoKHBpLT5ucGh5X3R4aXFsb2NhbF9jaGFuc3BlYyA9PSBwaS0+cmFkaW9fY2hhbnNwZWMpICYmCi0JICAgIChwaS0+bnBoeV90eGlxbG9jYWxfY29lZmZzdmFsaWQpKSB7Ci0JCXdsY19waHlfdGFibGVfcmVhZF9ucGh5KHBpLCBOUEhZX1RCTF9JRF9JUUxPQ0FMLAotCQkJCQlBUlJBWV9TSVpFKHRibF9idWYpLCA4MCwgMTYsIHRibF9idWYpOwotCi0JCWlmICgocGktPm5waHlfdHhpcWxvY2FsX2Jlc3RjWzBdICE9IHRibF9idWZbMF0pIHx8Ci0JCSAgICAocGktPm5waHlfdHhpcWxvY2FsX2Jlc3RjWzFdICE9IHRibF9idWZbMV0pIHx8Ci0JCSAgICAocGktPm5waHlfdHhpcWxvY2FsX2Jlc3RjWzJdICE9IHRibF9idWZbMl0pIHx8Ci0JCSAgICAocGktPm5waHlfdHhpcWxvY2FsX2Jlc3RjWzNdICE9IHRibF9idWZbM10pKSB7Ci0KLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfSVFMT0NBTCwgNCwgODAsCi0JCQkJCQkgMTYsIHBpLT5ucGh5X3R4aXFsb2NhbF9iZXN0Yyk7Ci0KLQkJCXRibF9idWZbMF0gPSAwOwotCQkJdGJsX2J1ZlsxXSA9IDA7Ci0JCQl0YmxfYnVmWzJdID0gMDsKLQkJCXRibF9idWZbM10gPSAwOwotCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9JUUxPQ0FMLCA0LCA4OCwKLQkJCQkJCSAxNiwgdGJsX2J1Zik7Ci0KLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfSVFMT0NBTCwgMiwgODUsCi0JCQkJCQkgMTYsCi0JCQkJCQkgJnBpLT5ucGh5X3R4aXFsb2NhbF9iZXN0Y1s1XSk7Ci0KLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfSVFMT0NBTCwgMiwgOTMsCi0JCQkJCQkgMTYsCi0JCQkJCQkgJnBpLT5ucGh5X3R4aXFsb2NhbF9iZXN0Y1s1XSk7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHdsY19waHlfdHhfaXFfd2FyX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0Jc3RydWN0IG5waHlfaXFfY29tcCB0eF9jb21wOwotCi0Jd2xjX3BoeV90YWJsZV9yZWFkX25waHkocGksIDE1LCA0LCAweDUwLCAxNiwgKHZvaWQgKikmdHhfY29tcCk7Ci0KLQl3bGFwaV9ibWFjX3dyaXRlX3NobShwaS0+c2gtPnBoeXNoaW0sIE1fMjBJTjQwX0lRLCB0eF9jb21wLmEwKTsKLQl3bGFwaV9ibWFjX3dyaXRlX3NobShwaS0+c2gtPnBoeXNoaW0sIE1fMjBJTjQwX0lRICsgMiwgdHhfY29tcC5iMCk7Ci0Jd2xhcGlfYm1hY193cml0ZV9zaG0ocGktPnNoLT5waHlzaGltLCBNXzIwSU40MF9JUSArIDQsIHR4X2NvbXAuYTEpOwotCXdsYXBpX2JtYWNfd3JpdGVfc2htKHBpLT5zaC0+cGh5c2hpbSwgTV8yMElONDBfSVEgKyA2LCB0eF9jb21wLmIxKTsKLX0KLQotdm9pZAotd2xjX3BoeV9yeF9pcV9jb2VmZnNfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTggd3JpdGUsCi0JCQkgIHN0cnVjdCBucGh5X2lxX2NvbXAgKnBjb21wKQotewotCWlmICh3cml0ZSkgewotCQl3cml0ZV9waHlfcmVnKHBpLCAweDlhLCBwY29tcC0+YTApOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDliLCBwY29tcC0+YjApOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDljLCBwY29tcC0+YTEpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDlkLCBwY29tcC0+YjEpOwotCX0gZWxzZSB7Ci0JCXBjb21wLT5hMCA9IHJlYWRfcGh5X3JlZyhwaSwgMHg5YSk7Ci0JCXBjb21wLT5iMCA9IHJlYWRfcGh5X3JlZyhwaSwgMHg5Yik7Ci0JCXBjb21wLT5hMSA9IHJlYWRfcGh5X3JlZyhwaSwgMHg5Yyk7Ci0JCXBjb21wLT5iMSA9IHJlYWRfcGh5X3JlZyhwaSwgMHg5ZCk7Ci0JfQotfQotCi12b2lkCi13bGNfcGh5X3J4X2lxX2VzdF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCBzdHJ1Y3QgcGh5X2lxX2VzdCAqZXN0LAotCQkgICAgICAgdTE2IG51bV9zYW1wcywgdTggd2FpdF90aW1lLCB1OCB3YWl0X2Zvcl9jcnMpCi17Ci0JdTggY29yZTsKLQotCXdyaXRlX3BoeV9yZWcocGksIDB4MTJiLCBudW1fc2FtcHMpOwotCW1vZF9waHlfcmVnKHBpLCAweDEyYSwgKDB4ZmYgPDwgMCksICh3YWl0X3RpbWUgPDwgMCkpOwotCW1vZF9waHlfcmVnKHBpLCAweDEyOSwgTlBIWV9JcWVzdENtZF9pcU1vZGUsCi0JCSAgICAod2FpdF9mb3JfY3JzKSA/IE5QSFlfSXFlc3RDbWRfaXFNb2RlIDogMCk7Ci0KLQltb2RfcGh5X3JlZyhwaSwgMHgxMjksIE5QSFlfSXFlc3RDbWRfaXFzdGFydCwgTlBIWV9JcWVzdENtZF9pcXN0YXJ0KTsKLQotCVNQSU5XQUlUKCgocmVhZF9waHlfcmVnKHBpLCAweDEyOSkgJiBOUEhZX0lxZXN0Q21kX2lxc3RhcnQpICE9IDApLAotCQkgMTAwMDApOwotCWlmIChXQVJOKHJlYWRfcGh5X3JlZyhwaSwgMHgxMjkpICYgTlBIWV9JcWVzdENtZF9pcXN0YXJ0LAotCQkgIkhXIGVycm9yOiByeGlxIGVzdCIpKQotCQlyZXR1cm47Ci0KLQlpZiAoKHJlYWRfcGh5X3JlZyhwaSwgMHgxMjkpICYgTlBIWV9JcWVzdENtZF9pcXN0YXJ0KSA9PSAwKSB7Ci0JCWZvciAoY29yZSA9IDA7IGNvcmUgPCBwaS0+cHVicGkucGh5X2NvcmVudW07IGNvcmUrKykgewotCQkJZXN0W2NvcmVdLmlfcHdyID0KLQkJCSAgICAocmVhZF9waHlfcmVnKHBpLCBOUEhZX0lxZXN0aXB3ckFjY0hpKGNvcmUpKSA8PCAxNikKLQkJCSAgICB8IHJlYWRfcGh5X3JlZyhwaSwgTlBIWV9JcWVzdGlwd3JBY2NMbyhjb3JlKSk7Ci0JCQllc3RbY29yZV0ucV9wd3IgPQotCQkJICAgIChyZWFkX3BoeV9yZWcocGksIE5QSFlfSXFlc3RxcHdyQWNjSGkoY29yZSkpIDw8IDE2KQotCQkJICAgIHwgcmVhZF9waHlfcmVnKHBpLCBOUEhZX0lxZXN0cXB3ckFjY0xvKGNvcmUpKTsKLQkJCWVzdFtjb3JlXS5pcV9wcm9kID0KLQkJCSAgICAocmVhZF9waHlfcmVnKHBpLCBOUEhZX0lxZXN0SXFBY2NIaShjb3JlKSkgPDwgMTYpIHwKLQkJCSAgICByZWFkX3BoeV9yZWcocGksIE5QSFlfSXFlc3RJcUFjY0xvKGNvcmUpKTsKLQkJfQotCX0KLX0KLQotI2RlZmluZSBDQUxfUkVUUllfQ05UIDIKLXN0YXRpYyB2b2lkIHdsY19waHlfY2FsY19yeF9pcV9jb21wX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHU4IGNvcmVfbWFzaykKLXsKLQl1OCBjdXJyX2NvcmU7Ci0Jc3RydWN0IHBoeV9pcV9lc3QgZXN0W1BIWV9DT1JFX01BWF07Ci0Jc3RydWN0IG5waHlfaXFfY29tcCBvbGRfY29tcCwgbmV3X2NvbXA7Ci0JczMyIGlxID0gMDsKLQl1MzIgaWkgPSAwLCBxcSA9IDA7Ci0JczE2IGlxX25iaXRzLCBxcV9uYml0cywgYnJzaCwgYXJzaDsKLQlzMzIgYSwgYiwgdGVtcDsKLQlpbnQgYmNtZXJyb3IgPSAwOwotCXVpbnQgY2FsX3JldHJ5ID0gMDsKLQotCWlmIChjb3JlX21hc2sgPT0gMHgwKQotCQlyZXR1cm47Ci0KLQl3bGNfcGh5X3J4X2lxX2NvZWZmc19ucGh5KHBpLCAwLCAmb2xkX2NvbXApOwotCW5ld19jb21wLmEwID0gbmV3X2NvbXAuYjAgPSBuZXdfY29tcC5hMSA9IG5ld19jb21wLmIxID0gMHgwOwotCXdsY19waHlfcnhfaXFfY29lZmZzX25waHkocGksIDEsICZuZXdfY29tcCk7Ci0KLSBjYWxfdHJ5OgotCXdsY19waHlfcnhfaXFfZXN0X25waHkocGksIGVzdCwgMHg0MDAwLCAzMiwgMCk7Ci0KLQluZXdfY29tcCA9IG9sZF9jb21wOwotCi0JZm9yIChjdXJyX2NvcmUgPSAwOyBjdXJyX2NvcmUgPCBwaS0+cHVicGkucGh5X2NvcmVudW07IGN1cnJfY29yZSsrKSB7Ci0KLQkJaWYgKChjdXJyX2NvcmUgPT0gUEhZX0NPUkVfMCkgJiYgKGNvcmVfbWFzayAmIDB4MSkpIHsKLQkJCWlxID0gZXN0W2N1cnJfY29yZV0uaXFfcHJvZDsKLQkJCWlpID0gZXN0W2N1cnJfY29yZV0uaV9wd3I7Ci0JCQlxcSA9IGVzdFtjdXJyX2NvcmVdLnFfcHdyOwotCQl9IGVsc2UgaWYgKChjdXJyX2NvcmUgPT0gUEhZX0NPUkVfMSkgJiYgKGNvcmVfbWFzayAmIDB4MikpIHsKLQkJCWlxID0gZXN0W2N1cnJfY29yZV0uaXFfcHJvZDsKLQkJCWlpID0gZXN0W2N1cnJfY29yZV0uaV9wd3I7Ci0JCQlxcSA9IGVzdFtjdXJyX2NvcmVdLnFfcHdyOwotCQl9IGVsc2UgewotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoKGlpICsgcXEpIDwgTlBIWV9NSU5fUlhJUV9QV1IpIHsKLQkJCWJjbWVycm9yID0gLUVCQURFOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpcV9uYml0cyA9IHdsY19waHlfbmJpdHMoaXEpOwotCQlxcV9uYml0cyA9IHdsY19waHlfbmJpdHMocXEpOwotCi0JCWFyc2ggPSAxMCAtICgzMCAtIGlxX25iaXRzKTsKLQkJaWYgKGFyc2ggPj0gMCkgewotCQkJYSA9ICgtKGlxIDw8ICgzMCAtIGlxX25iaXRzKSkgKyAoaWkgPj4gKDEgKyBhcnNoKSkpOwotCQkJdGVtcCA9IChzMzIpIChpaSA+PiBhcnNoKTsKLQkJCWlmICh0ZW1wID09IDApIHsKLQkJCQliY21lcnJvciA9IC1FQkFERTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWEgPSAoLShpcSA8PCAoMzAgLSBpcV9uYml0cykpICsgKGlpIDw8ICgtMSAtIGFyc2gpKSk7Ci0JCQl0ZW1wID0gKHMzMikgKGlpIDw8IC1hcnNoKTsKLQkJCWlmICh0ZW1wID09IDApIHsKLQkJCQliY21lcnJvciA9IC1FQkFERTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWEgLz0gdGVtcDsKLQotCQlicnNoID0gcXFfbmJpdHMgLSAzMSArIDIwOwotCQlpZiAoYnJzaCA+PSAwKSB7Ci0JCQliID0gKHFxIDw8ICgzMSAtIHFxX25iaXRzKSk7Ci0JCQl0ZW1wID0gKHMzMikgKGlpID4+IGJyc2gpOwotCQkJaWYgKHRlbXAgPT0gMCkgewotCQkJCWJjbWVycm9yID0gLUVCQURFOwotCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJYiA9IChxcSA8PCAoMzEgLSBxcV9uYml0cykpOwotCQkJdGVtcCA9IChzMzIpIChpaSA8PCAtYnJzaCk7Ci0JCQlpZiAodGVtcCA9PSAwKSB7Ci0JCQkJYmNtZXJyb3IgPSAtRUJBREU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYiAvPSB0ZW1wOwotCQliIC09IGEgKiBhOwotCQliID0gKHMzMikgaW50X3NxcnQoKHVuc2lnbmVkIGxvbmcpIGIpOwotCQliIC09ICgxIDw8IDEwKTsKLQotCQlpZiAoKGN1cnJfY29yZSA9PSBQSFlfQ09SRV8wKSAmJiAoY29yZV9tYXNrICYgMHgxKSkgewotCQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0JCQkJbmV3X2NvbXAuYTAgPSAoczE2KSBhICYgMHgzZmY7Ci0JCQkJbmV3X2NvbXAuYjAgPSAoczE2KSBiICYgMHgzZmY7Ci0JCQl9IGVsc2UgewotCi0JCQkJbmV3X2NvbXAuYTAgPSAoczE2KSBiICYgMHgzZmY7Ci0JCQkJbmV3X2NvbXAuYjAgPSAoczE2KSBhICYgMHgzZmY7Ci0JCQl9Ci0JCX0KLQkJaWYgKChjdXJyX2NvcmUgPT0gUEhZX0NPUkVfMSkgJiYgKGNvcmVfbWFzayAmIDB4MikpIHsKLQkJCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCQkJCW5ld19jb21wLmExID0gKHMxNikgYSAmIDB4M2ZmOwotCQkJCW5ld19jb21wLmIxID0gKHMxNikgYiAmIDB4M2ZmOwotCQkJfSBlbHNlIHsKLQotCQkJCW5ld19jb21wLmExID0gKHMxNikgYiAmIDB4M2ZmOwotCQkJCW5ld19jb21wLmIxID0gKHMxNikgYSAmIDB4M2ZmOwotCQkJfQotCQl9Ci0JfQotCi0JaWYgKGJjbWVycm9yICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBGYWlsZWQsIGNudCA9ICVkXG4iLCBfX2Z1bmNfXywKLQkJCWNhbF9yZXRyeSk7Ci0KLQkJaWYgKGNhbF9yZXRyeSA8IENBTF9SRVRSWV9DTlQpIHsKLQkJCWNhbF9yZXRyeSsrOwotCQkJZ290byBjYWxfdHJ5OwotCQl9Ci0KLQkJbmV3X2NvbXAgPSBvbGRfY29tcDsKLQl9Ci0KLQl3bGNfcGh5X3J4X2lxX2NvZWZmc19ucGh5KHBpLCAxLCAmbmV3X2NvbXApOwotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3J4Y2FsX3JhZGlvX3NldHVwX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHU4IHJ4X2NvcmUpCi17Ci0JdTE2IG9mZnR1bmVfdmFsOwotCXUxNiBiaWFzX2cgPSAwOwotCXUxNiBiaWFzX2EgPSAwOwotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCWlmIChyeF9jb3JlID09IFBIWV9DT1JFXzApIHsKLQkJCWlmIChDSFNQRUNfSVM1RyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1swXSA9Ci0JCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkJICAgUkFESU9fMjA1N19UWDBfVFhSWENPVVBMRV81R19QV1JVUCk7Ci0JCQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1sxXSA9Ci0JCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkJICAgUkFESU9fMjA1N19UWDBfVFhSWENPVVBMRV81R19BVFRFTik7Ci0KLQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQlSQURJT18yMDU3X1RYMF9UWFJYQ09VUExFXzVHX1BXUlVQLAotCQkJCQkJMHgzKTsKLQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQlSQURJT18yMDU3X1RYMF9UWFJYQ09VUExFXzVHX0FUVEVOLAotCQkJCQkJMHhhZik7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1swXSA9Ci0JCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkJICAgUkFESU9fMjA1N19UWDBfVFhSWENPVVBMRV8yR19QV1JVUCk7Ci0JCQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1sxXSA9Ci0JCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkJICAgUkFESU9fMjA1N19UWDBfVFhSWENPVVBMRV8yR19BVFRFTik7Ci0KLQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQlSQURJT18yMDU3X1RYMF9UWFJYQ09VUExFXzJHX1BXUlVQLAotCQkJCQkJMHgzKTsKLQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQlSQURJT18yMDU3X1RYMF9UWFJYQ09VUExFXzJHX0FUVEVOLAotCQkJCQkJMHg3Zik7Ci0JCQl9Ci0KLQkJfSBlbHNlIHsKLQkJCWlmIChDSFNQRUNfSVM1RyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1swXSA9Ci0JCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkJICAgUkFESU9fMjA1N19UWDFfVFhSWENPVVBMRV81R19QV1JVUCk7Ci0JCQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1sxXSA9Ci0JCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkJICAgUkFESU9fMjA1N19UWDFfVFhSWENPVVBMRV81R19BVFRFTik7Ci0KLQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQlSQURJT18yMDU3X1RYMV9UWFJYQ09VUExFXzVHX1BXUlVQLAotCQkJCQkJMHgzKTsKLQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQlSQURJT18yMDU3X1RYMV9UWFJYQ09VUExFXzVHX0FUVEVOLAotCQkJCQkJMHhhZik7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1swXSA9Ci0JCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkJICAgUkFESU9fMjA1N19UWDFfVFhSWENPVVBMRV8yR19QV1JVUCk7Ci0JCQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1sxXSA9Ci0JCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkJICAgUkFESU9fMjA1N19UWDFfVFhSWENPVVBMRV8yR19BVFRFTik7Ci0KLQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQlSQURJT18yMDU3X1RYMV9UWFJYQ09VUExFXzJHX1BXUlVQLAotCQkJCQkJMHgzKTsKLQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQlSQURJT18yMDU3X1RYMV9UWFJYQ09VUExFXzJHX0FUVEVOLAotCQkJCQkJMHg3Zik7Ci0JCQl9Ci0JCX0KLQotCX0gZWxzZSB7Ci0JCWlmIChyeF9jb3JlID09IFBIWV9DT1JFXzApIHsKLQkJCXBpLT50eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbMF0gPQotCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkgICBSQURJT18yMDU2X1RYX1JYSVFDQUxfVFhNVVggfAotCQkJCQkgICBSQURJT18yMDU2X1RYMSk7Ci0JCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWzFdID0KLQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwKLQkJCQkJICAgUkFESU9fMjA1Nl9SWF9SWElRQ0FMX1JYTVVYIHwKLQkJCQkJICAgUkFESU9fMjA1Nl9SWDApOwotCi0JCQlpZiAocGktPnB1YnBpLnJhZGlvcmV2ID49IDUpIHsKLQkJCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWzJdID0KLQkJCQkgICAgcmVhZF9yYWRpb19yZWcocGksCi0JCQkJCQkgICBSQURJT18yMDU2X1JYX1JYU1BBUkUyIHwKLQkJCQkJCSAgIFJBRElPXzIwNTZfUlgwKTsKLQkJCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWzNdID0KLQkJCQkgICAgcmVhZF9yYWRpb19yZWcocGksCi0JCQkJCQkgICBSQURJT18yMDU2X1RYX1RYU1BBUkUyIHwKLQkJCQkJCSAgIFJBRElPXzIwNTZfVFgxKTsKLQkJCX0KLQotCQkJaWYgKENIU1BFQ19JUzVHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQotCQkJCWlmIChwaS0+cHVicGkucmFkaW9yZXYgPj0gNSkgewotCQkJCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWzRdID0KLQkJCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkJCSAgIFJBRElPXzIwNTZfUlhfTE5BQV9NQVNURVIKLQkJCQkJCQkgICB8IFJBRElPXzIwNTZfUlgwKTsKLQotCQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQkJUkFESU9fMjA1Nl9SWF9MTkFBX01BU1RFUgotCQkJCQkJCXwgUkFESU9fMjA1Nl9SWDAsIDB4NDApOwotCi0JCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCQlSQURJT18yMDU2X1RYX1RYU1BBUkUyIHwKLQkJCQkJCQlSQURJT18yMDU2X1RYMSwgYmlhc19hKTsKLQotCQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQkJUkFESU9fMjA1Nl9SWF9SWFNQQVJFMiB8Ci0JCQkJCQkJUkFESU9fMjA1Nl9SWDAsIGJpYXNfYSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1s0XSA9Ci0JCQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwKLQkJCQkJCQkgICBSQURJT18yMDU2X1JYX0xOQUFfVFVORQotCQkJCQkJCSAgIHwgUkFESU9fMjA1Nl9SWDApOwotCi0JCQkJCW9mZnR1bmVfdmFsID0KLQkJCQkJICAgIChwaS0+Ci0JCQkJCSAgICAgdHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWzJdICYgMHhGMCkKLQkJCQkJICAgID4+IDg7Ci0JCQkJCW9mZnR1bmVfdmFsID0KLQkJCQkJICAgIChvZmZ0dW5lX3ZhbCA8PSAweDcpID8gMHhGIDogMDsKLQotCQkJCQltb2RfcmFkaW9fcmVnKHBpLAotCQkJCQkJICAgICAgUkFESU9fMjA1Nl9SWF9MTkFBX1RVTkUgfAotCQkJCQkJICAgICAgUkFESU9fMjA1Nl9SWDAsIDB4RjAsCi0JCQkJCQkgICAgICAob2ZmdHVuZV92YWwgPDwgOCkpOwotCQkJCX0KLQotCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCVJBRElPXzIwNTZfVFhfUlhJUUNBTF9UWE1VWCB8Ci0JCQkJCQlSQURJT18yMDU2X1RYMSwgMHg5KTsKLQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQlSQURJT18yMDU2X1JYX1JYSVFDQUxfUlhNVVggfAotCQkJCQkJUkFESU9fMjA1Nl9SWDAsIDB4OSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChwaS0+cHVicGkucmFkaW9yZXYgPj0gNSkgewotCQkJCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWzRdID0KLQkJCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkJCSAgIFJBRElPXzIwNTZfUlhfTE5BR19NQVNURVIKLQkJCQkJCQkgICB8IFJBRElPXzIwNTZfUlgwKTsKLQotCQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQkJUkFESU9fMjA1Nl9SWF9MTkFHX01BU1RFUgotCQkJCQkJCXwgUkFESU9fMjA1Nl9SWDAsIDB4NDApOwotCi0JCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCQlSQURJT18yMDU2X1RYX1RYU1BBUkUyIHwKLQkJCQkJCQlSQURJT18yMDU2X1RYMSwgYmlhc19nKTsKLQotCQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQkJUkFESU9fMjA1Nl9SWF9SWFNQQVJFMiB8Ci0JCQkJCQkJUkFESU9fMjA1Nl9SWDAsIGJpYXNfZyk7Ci0KLQkJCQl9IGVsc2UgewotCQkJCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWzRdID0KLQkJCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkJCSAgIFJBRElPXzIwNTZfUlhfTE5BR19UVU5FCi0JCQkJCQkJICAgfCBSQURJT18yMDU2X1JYMCk7Ci0KLQkJCQkJb2ZmdHVuZV92YWwgPQotCQkJCQkgICAgKHBpLT4KLQkJCQkJICAgICB0eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbMl0gJiAweEYwKQotCQkJCQkgICAgPj4gODsKLQkJCQkJb2ZmdHVuZV92YWwgPQotCQkJCQkgICAgKG9mZnR1bmVfdmFsIDw9IDB4NykgPyAweEYgOiAwOwotCi0JCQkJCW1vZF9yYWRpb19yZWcocGksCi0JCQkJCQkgICAgICBSQURJT18yMDU2X1JYX0xOQUdfVFVORSB8Ci0JCQkJCQkgICAgICBSQURJT18yMDU2X1JYMCwgMHhGMCwKLQkJCQkJCSAgICAgIChvZmZ0dW5lX3ZhbCA8PCA4KSk7Ci0JCQkJfQotCi0JCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJUkFESU9fMjA1Nl9UWF9SWElRQ0FMX1RYTVVYIHwKLQkJCQkJCVJBRElPXzIwNTZfVFgxLCAweDYpOwotCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCVJBRElPXzIwNTZfUlhfUlhJUUNBTF9SWE1VWCB8Ci0JCQkJCQlSQURJT18yMDU2X1JYMCwgMHg2KTsKLQkJCX0KLQotCQl9IGVsc2UgewotCQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1swXSA9Ci0JCQkgICAgcmVhZF9yYWRpb19yZWcocGksCi0JCQkJCSAgIFJBRElPXzIwNTZfVFhfUlhJUUNBTF9UWE1VWCB8Ci0JCQkJCSAgIFJBRElPXzIwNTZfVFgwKTsKLQkJCXBpLT50eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbMV0gPQotCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkgICBSQURJT18yMDU2X1JYX1JYSVFDQUxfUlhNVVggfAotCQkJCQkgICBSQURJT18yMDU2X1JYMSk7Ci0KLQkJCWlmIChwaS0+cHVicGkucmFkaW9yZXYgPj0gNSkgewotCQkJCXBpLT50eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbMl0gPQotCQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwKLQkJCQkJCSAgIFJBRElPXzIwNTZfUlhfUlhTUEFSRTIgfAotCQkJCQkJICAgUkFESU9fMjA1Nl9SWDEpOwotCQkJCXBpLT50eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbM10gPQotCQkJCSAgICByZWFkX3JhZGlvX3JlZyhwaSwKLQkJCQkJCSAgIFJBRElPXzIwNTZfVFhfVFhTUEFSRTIgfAotCQkJCQkJICAgUkFESU9fMjA1Nl9UWDApOwotCQkJfQotCi0JCQlpZiAoQ0hTUEVDX0lTNUcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCi0JCQkJaWYgKHBpLT5wdWJwaS5yYWRpb3JldiA+PSA1KSB7Ci0JCQkJCXBpLT50eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbNF0gPQotCQkJCQkgICAgcmVhZF9yYWRpb19yZWcocGksCi0JCQkJCQkJICAgUkFESU9fMjA1Nl9SWF9MTkFBX01BU1RFUgotCQkJCQkJCSAgIHwgUkFESU9fMjA1Nl9SWDEpOwotCi0JCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCQlSQURJT18yMDU2X1JYX0xOQUFfTUFTVEVSCi0JCQkJCQkJfCBSQURJT18yMDU2X1JYMSwgMHg0MCk7Ci0KLQkJCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJCVJBRElPXzIwNTZfVFhfVFhTUEFSRTIgfAotCQkJCQkJCVJBRElPXzIwNTZfVFgwLCBiaWFzX2EpOwotCi0JCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCQlSQURJT18yMDU2X1JYX1JYU1BBUkUyIHwKLQkJCQkJCQlSQURJT18yMDU2X1JYMSwgYmlhc19hKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWzRdID0KLQkJCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkJCSAgIFJBRElPXzIwNTZfUlhfTE5BQV9UVU5FCi0JCQkJCQkJICAgfCBSQURJT18yMDU2X1JYMSk7Ci0KLQkJCQkJb2ZmdHVuZV92YWwgPQotCQkJCQkgICAgKHBpLT4KLQkJCQkJICAgICB0eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbMl0gJiAweEYwKQotCQkJCQkgICAgPj4gODsKLQkJCQkJb2ZmdHVuZV92YWwgPQotCQkJCQkgICAgKG9mZnR1bmVfdmFsIDw9IDB4NykgPyAweEYgOiAwOwotCi0JCQkJCW1vZF9yYWRpb19yZWcocGksCi0JCQkJCQkgICAgICBSQURJT18yMDU2X1JYX0xOQUFfVFVORSB8Ci0JCQkJCQkgICAgICBSQURJT18yMDU2X1JYMSwgMHhGMCwKLQkJCQkJCSAgICAgIChvZmZ0dW5lX3ZhbCA8PCA4KSk7Ci0JCQkJfQotCi0JCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJUkFESU9fMjA1Nl9UWF9SWElRQ0FMX1RYTVVYIHwKLQkJCQkJCVJBRElPXzIwNTZfVFgwLCAweDkpOwotCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCVJBRElPXzIwNTZfUlhfUlhJUUNBTF9SWE1VWCB8Ci0JCQkJCQlSQURJT18yMDU2X1JYMSwgMHg5KTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHBpLT5wdWJwaS5yYWRpb3JldiA+PSA1KSB7Ci0JCQkJCXBpLT50eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbNF0gPQotCQkJCQkgICAgcmVhZF9yYWRpb19yZWcocGksCi0JCQkJCQkJICAgUkFESU9fMjA1Nl9SWF9MTkFHX01BU1RFUgotCQkJCQkJCSAgIHwgUkFESU9fMjA1Nl9SWDEpOwotCi0JCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCQlSQURJT18yMDU2X1JYX0xOQUdfTUFTVEVSCi0JCQkJCQkJfCBSQURJT18yMDU2X1JYMSwgMHg0MCk7Ci0KLQkJCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJCVJBRElPXzIwNTZfVFhfVFhTUEFSRTIgfAotCQkJCQkJCVJBRElPXzIwNTZfVFgwLCBiaWFzX2cpOwotCi0JCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCQlSQURJT18yMDU2X1JYX1JYU1BBUkUyIHwKLQkJCQkJCQlSQURJT18yMDU2X1JYMSwgYmlhc19nKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWzRdID0KLQkJCQkJICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJCQkJCSAgIFJBRElPXzIwNTZfUlhfTE5BR19UVU5FCi0JCQkJCQkJICAgfCBSQURJT18yMDU2X1JYMSk7Ci0KLQkJCQkJb2ZmdHVuZV92YWwgPQotCQkJCQkgICAgKHBpLT4KLQkJCQkJICAgICB0eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbMl0gJiAweEYwKQotCQkJCQkgICAgPj4gODsKLQkJCQkJb2ZmdHVuZV92YWwgPQotCQkJCQkgICAgKG9mZnR1bmVfdmFsIDw9IDB4NykgPyAweEYgOiAwOwotCi0JCQkJCW1vZF9yYWRpb19yZWcocGksCi0JCQkJCQkgICAgICBSQURJT18yMDU2X1JYX0xOQUdfVFVORSB8Ci0JCQkJCQkgICAgICBSQURJT18yMDU2X1JYMSwgMHhGMCwKLQkJCQkJCSAgICAgIChvZmZ0dW5lX3ZhbCA8PCA4KSk7Ci0JCQkJfQotCi0JCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJUkFESU9fMjA1Nl9UWF9SWElRQ0FMX1RYTVVYIHwKLQkJCQkJCVJBRElPXzIwNTZfVFgwLCAweDYpOwotCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCVJBRElPXzIwNTZfUlhfUlhJUUNBTF9SWE1VWCB8Ci0JCQkJCQlSQURJT18yMDU2X1JYMSwgMHg2KTsKLQkJCX0KLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgd2xjX3BoeV9yeGNhbF9yYWRpb19jbGVhbnVwX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHU4IHJ4X2NvcmUpCi17Ci0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCWlmIChyeF9jb3JlID09IFBIWV9DT1JFXzApIHsKLQkJCWlmIChDSFNQRUNfSVM1RyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJUkFESU9fMjA1N19UWDBfVFhSWENPVVBMRV81R19QV1JVUCwKLQkJCQkJCXBpLT4KLQkJCQkJCXR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1swXSk7Ci0JCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJUkFESU9fMjA1N19UWDBfVFhSWENPVVBMRV81R19BVFRFTiwKLQkJCQkJCXBpLT4KLQkJCQkJCXR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1sxXSk7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJUkFESU9fMjA1N19UWDBfVFhSWENPVVBMRV8yR19QV1JVUCwKLQkJCQkJCXBpLT4KLQkJCQkJCXR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1swXSk7Ci0JCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJUkFESU9fMjA1N19UWDBfVFhSWENPVVBMRV8yR19BVFRFTiwKLQkJCQkJCXBpLT4KLQkJCQkJCXR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1sxXSk7Ci0JCQl9Ci0KLQkJfSBlbHNlIHsKLQkJCWlmIChDSFNQRUNfSVM1RyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJUkFESU9fMjA1N19UWDFfVFhSWENPVVBMRV81R19QV1JVUCwKLQkJCQkJCXBpLT4KLQkJCQkJCXR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1swXSk7Ci0JCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJUkFESU9fMjA1N19UWDFfVFhSWENPVVBMRV81R19BVFRFTiwKLQkJCQkJCXBpLT4KLQkJCQkJCXR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1sxXSk7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJUkFESU9fMjA1N19UWDFfVFhSWENPVVBMRV8yR19QV1JVUCwKLQkJCQkJCXBpLT4KLQkJCQkJCXR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1swXSk7Ci0JCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJUkFESU9fMjA1N19UWDFfVFhSWENPVVBMRV8yR19BVFRFTiwKLQkJCQkJCXBpLT4KLQkJCQkJCXR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1sxXSk7Ci0JCQl9Ci0JCX0KLQotCX0gZWxzZSB7Ci0JCWlmIChyeF9jb3JlID09IFBIWV9DT1JFXzApIHsKLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJUkFESU9fMjA1Nl9UWF9SWElRQ0FMX1RYTVVYIHwKLQkJCQkJUkFESU9fMjA1Nl9UWDEsCi0JCQkJCXBpLT50eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbMF0pOwotCi0JCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCVJBRElPXzIwNTZfUlhfUlhJUUNBTF9SWE1VWCB8Ci0JCQkJCVJBRElPXzIwNTZfUlgwLAotCQkJCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWzFdKTsKLQotCQkJaWYgKHBpLT5wdWJwaS5yYWRpb3JldiA+PSA1KSB7Ci0JCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJUkFESU9fMjA1Nl9SWF9SWFNQQVJFMiB8Ci0JCQkJCQlSQURJT18yMDU2X1JYMCwKLQkJCQkJCXBpLT4KLQkJCQkJCXR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1syXSk7Ci0KLQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQlSQURJT18yMDU2X1RYX1RYU1BBUkUyIHwKLQkJCQkJCVJBRElPXzIwNTZfVFgxLAotCQkJCQkJcGktPgotCQkJCQkJdHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWzNdKTsKLQkJCX0KLQotCQkJaWYgKENIU1BFQ19JUzVHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCQlpZiAocGktPnB1YnBpLnJhZGlvcmV2ID49IDUpIHsKLQkJCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJCVJBRElPXzIwNTZfUlhfTE5BQV9NQVNURVIKLQkJCQkJCQl8IFJBRElPXzIwNTZfUlgwLAotCQkJCQkJCXBpLT4KLQkJCQkJCQl0eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3MKLQkJCQkJCQlbNF0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCQlSQURJT18yMDU2X1JYX0xOQUFfVFVORQotCQkJCQkJCXwgUkFESU9fMjA1Nl9SWDAsCi0JCQkJCQkJcGktPgotCQkJCQkJCXR4X3J4X2NhbF9yYWRpb19zYXZlcmVncwotCQkJCQkJCVs0XSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAocGktPnB1YnBpLnJhZGlvcmV2ID49IDUpIHsKLQkJCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJCVJBRElPXzIwNTZfUlhfTE5BR19NQVNURVIKLQkJCQkJCQl8IFJBRElPXzIwNTZfUlgwLAotCQkJCQkJCXBpLT4KLQkJCQkJCQl0eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3MKLQkJCQkJCQlbNF0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCQlSQURJT18yMDU2X1JYX0xOQUdfVFVORQotCQkJCQkJCXwgUkFESU9fMjA1Nl9SWDAsCi0JCQkJCQkJcGktPgotCQkJCQkJCXR4X3J4X2NhbF9yYWRpb19zYXZlcmVncwotCQkJCQkJCVs0XSk7Ci0JCQkJfQotCQkJfQotCi0JCX0gZWxzZSB7Ci0JCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCVJBRElPXzIwNTZfVFhfUlhJUUNBTF9UWE1VWCB8Ci0JCQkJCVJBRElPXzIwNTZfVFgwLAotCQkJCQlwaS0+dHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzWzBdKTsKLQotCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQlSQURJT18yMDU2X1JYX1JYSVFDQUxfUlhNVVggfAotCQkJCQlSQURJT18yMDU2X1JYMSwKLQkJCQkJcGktPnR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1sxXSk7Ci0KLQkJCWlmIChwaS0+cHVicGkucmFkaW9yZXYgPj0gNSkgewotCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCVJBRElPXzIwNTZfUlhfUlhTUEFSRTIgfAotCQkJCQkJUkFESU9fMjA1Nl9SWDEsCi0JCQkJCQlwaS0+Ci0JCQkJCQl0eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3NbMl0pOwotCi0JCQkJd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJCQkJUkFESU9fMjA1Nl9UWF9UWFNQQVJFMiB8Ci0JCQkJCQlSQURJT18yMDU2X1RYMCwKLQkJCQkJCXBpLT4KLQkJCQkJCXR4X3J4X2NhbF9yYWRpb19zYXZlcmVnc1szXSk7Ci0JCQl9Ci0KLQkJCWlmIChDSFNQRUNfSVM1RyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQkJaWYgKHBpLT5wdWJwaS5yYWRpb3JldiA+PSA1KSB7Ci0JCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCQlSQURJT18yMDU2X1JYX0xOQUFfTUFTVEVSCi0JCQkJCQkJfCBSQURJT18yMDU2X1JYMSwKLQkJCQkJCQlwaS0+Ci0JCQkJCQkJdHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzCi0JCQkJCQkJWzRdKTsKLQkJCQl9IGVsc2UgewotCQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQkJUkFESU9fMjA1Nl9SWF9MTkFBX1RVTkUKLQkJCQkJCQl8IFJBRElPXzIwNTZfUlgxLAotCQkJCQkJCXBpLT4KLQkJCQkJCQl0eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3MKLQkJCQkJCQlbNF0pOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHBpLT5wdWJwaS5yYWRpb3JldiA+PSA1KSB7Ci0JCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCQlSQURJT18yMDU2X1JYX0xOQUdfTUFTVEVSCi0JCQkJCQkJfCBSQURJT18yMDU2X1JYMSwKLQkJCQkJCQlwaS0+Ci0JCQkJCQkJdHhfcnhfY2FsX3JhZGlvX3NhdmVyZWdzCi0JCQkJCQkJWzRdKTsKLQkJCQl9IGVsc2UgewotCQkJCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCQkJUkFESU9fMjA1Nl9SWF9MTkFHX1RVTkUKLQkJCQkJCQl8IFJBRElPXzIwNTZfUlgxLAotCQkJCQkJCXBpLT4KLQkJCQkJCQl0eF9yeF9jYWxfcmFkaW9fc2F2ZXJlZ3MKLQkJCQkJCQlbNF0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgd2xjX3BoeV9yeGNhbF9waHlzZXR1cF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCByeF9jb3JlKQotewotCXU4IHR4X2NvcmU7Ci0JdTE2IHJ4X2FudHZhbCwgdHhfYW50dmFsOwotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0KLQkJdHhfY29yZSA9IHJ4X2NvcmU7Ci0JfSBlbHNlIHsKLQkJdHhfY29yZSA9IChyeF9jb3JlID09IFBIWV9DT1JFXzApID8gMSA6IDA7Ci0JfQotCi0JcGktPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3NbMF0gPSByZWFkX3BoeV9yZWcocGksIDB4YTIpOwotCXBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzFdID0KLQkgICAgcmVhZF9waHlfcmVnKHBpLCAocnhfY29yZSA9PSBQSFlfQ09SRV8wKSA/IDB4YTYgOiAweGE3KTsKLQlwaS0+dHhfcnhfY2FsX3BoeV9zYXZlcmVnc1syXSA9Ci0JICAgIHJlYWRfcGh5X3JlZyhwaSwgKHJ4X2NvcmUgPT0gUEhZX0NPUkVfMCkgPyAweDhmIDogMHhhNSk7Ci0JcGktPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3NbM10gPSByZWFkX3BoeV9yZWcocGksIDB4OTEpOwotCXBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzRdID0gcmVhZF9waHlfcmVnKHBpLCAweDkyKTsKLQlwaS0+dHhfcnhfY2FsX3BoeV9zYXZlcmVnc1s1XSA9IHJlYWRfcGh5X3JlZyhwaSwgMHg3YSk7Ci0JcGktPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3NbNl0gPSByZWFkX3BoeV9yZWcocGksIDB4N2QpOwotCXBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzddID0gcmVhZF9waHlfcmVnKHBpLCAweGU3KTsKLQlwaS0+dHhfcnhfY2FsX3BoeV9zYXZlcmVnc1s4XSA9IHJlYWRfcGh5X3JlZyhwaSwgMHhlYyk7Ci0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCXBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzExXSA9IHJlYWRfcGh5X3JlZyhwaSwgMHgzNDIpOwotCQlwaS0+dHhfcnhfY2FsX3BoeV9zYXZlcmVnc1sxMl0gPSByZWFkX3BoeV9yZWcocGksIDB4MzQzKTsKLQkJcGktPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3NbMTNdID0gcmVhZF9waHlfcmVnKHBpLCAweDM0Nik7Ci0JCXBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzE0XSA9IHJlYWRfcGh5X3JlZyhwaSwgMHgzNDcpOwotCX0KLQotCXBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzldID0gcmVhZF9waHlfcmVnKHBpLCAweDI5Nyk7Ci0JcGktPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3NbMTBdID0gcmVhZF9waHlfcmVnKHBpLCAweDI5Yik7Ci0JbW9kX3BoeV9yZWcocGksICgwID09IFBIWV9DT1JFXzApID8gMHgyOTcgOgotCQkgICAgMHgyOWIsICgweDEgPDwgMCksICgwKSA8PCAwKTsKLQotCW1vZF9waHlfcmVnKHBpLCAoMSA9PSBQSFlfQ09SRV8wKSA/IDB4Mjk3IDoKLQkJICAgIDB4MjliLCAoMHgxIDw8IDApLCAoMCkgPDwgMCk7Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQotCQltb2RfcGh5X3JlZyhwaSwgMHhhMiwgKDB4ZiA8PCAwKSwgKDEgPDwgdHhfY29yZSkgPDwgMCk7Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4YTIsICgweGYgPDwgMTIpLCAoMSA8PCAoMSAtIHJ4X2NvcmUpKSA8PCAxMik7Ci0KLQl9IGVsc2UgewotCi0JCW1vZF9waHlfcmVnKHBpLCAweGEyLCAoMHhmIDw8IDEyKSwgKDEgPDwgdHhfY29yZSkgPDwgMTIpOwotCQltb2RfcGh5X3JlZyhwaSwgMHhhMiwgKDB4ZiA8PCAwKSwgKDEgPDwgdHhfY29yZSkgPDwgMCk7Ci0JCW1vZF9waHlfcmVnKHBpLCAweGEyLCAoMHhmIDw8IDQpLCAoMSA8PCByeF9jb3JlKSA8PCA0KTsKLQkJbW9kX3BoeV9yZWcocGksIDB4YTIsICgweGYgPDwgOCksICgxIDw8IHJ4X2NvcmUpIDw8IDgpOwotCX0KLQotCW1vZF9waHlfcmVnKHBpLCAoKHJ4X2NvcmUgPT0gUEhZX0NPUkVfMCkgPyAweGE2IDogMHhhNyksICgweDEgPDwgMiksIDApOwotCW1vZF9waHlfcmVnKHBpLCAocnhfY29yZSA9PSBQSFlfQ09SRV8wKSA/IDB4OGYgOiAweGE1LAotCQkgICAgKDB4MSA8PCAyKSwgKDB4MSA8PCAyKSk7Ci0JaWYgKE5SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCW1vZF9waHlfcmVnKHBpLCAoKHJ4X2NvcmUgPT0gUEhZX0NPUkVfMCkgPyAweGE2IDogMHhhNyksCi0JCQkgICAgKDB4MSA8PCAwKSB8ICgweDEgPDwgMSksIDApOwotCQltb2RfcGh5X3JlZyhwaSwgKHJ4X2NvcmUgPT0gUEhZX0NPUkVfMCkgPwotCQkJICAgIDB4OGYgOiAweGE1LAotCQkJICAgICgweDEgPDwgMCkgfCAoMHgxIDw8IDEpLCAoMHgxIDw8IDApIHwgKDB4MSA8PCAxKSk7Ci0JfQotCi0Jd2xjX3BoeV9yZmN0cmxpbnRjX292ZXJyaWRlX25waHkocGksIE5QSFlfUmZjdHJsSW50Y19vdmVycmlkZV9QQSwgMCwKLQkJCQkJIFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMSB8Ci0JCQkJCSBSQURJT19NSU1PX0NPUkVTRUxfQ09SRTIpOwotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCAzKSwKLQkJCQkJCSAgMCwgMCwgMCwKLQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMCk7Ci0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCA5KSwgMCwgMCwgMCwKLQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMSk7Ci0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCAxMCksIDEsIDAsIDAsCi0JCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDEpOwotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksICgweDEgPDwgMCksIDEsIDAsIDAsCi0JCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDEpOwotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksICgweDEgPDwgMSksIDEsIDAsIDAsCi0JCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDIpOwotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksICgweDEgPDwgMTEpLCAwLCAwLCAwLAotCQkJCQkJICBOUEhZX1JFVjdfUkZDVFJMT1ZFUlJJREVfSUQxKTsKLQkJaWYgKENIU1BFQ19JUzQwKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwKLQkJCQkJCQkgICgweDEgPDwgNyksCi0JCQkJCQkJICAyLCAwLCAwLAotCQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMSk7Ci0JCX0gZWxzZSB7Ci0JCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksCi0JCQkJCQkJICAoMHgxIDw8IDcpLAotCQkJCQkJCSAgMCwgMCwgMCwKLQkJCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDEpOwotCQl9Ci0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCA3KSwKLQkJCQkJCSAgMCwgMCwgMCwKLQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMSk7Ci0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCA1KSwgMCwgMCwgMCwKLQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMSk7Ci0JfSBlbHNlIHsKLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeShwaSwgKDB4MSA8PCAzKSwgMCwgMywgMCk7Ci0JfQotCi0Jd2xjX3BoeV9mb3JjZV9yZnNlcV9ucGh5KHBpLCBOUEhZX1JGU0VRX1JYMlRYKTsKLQotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCi0JCXdsY19waHlfcmZjdHJsaW50Y19vdmVycmlkZV9ucGh5KHBpLAotCQkJCQkJIE5QSFlfUmZjdHJsSW50Y19vdmVycmlkZV9UUlNXLAotCQkJCQkJIDB4MSwgcnhfY29yZSArIDEpOwotCX0gZWxzZSB7Ci0KLQkJaWYgKHJ4X2NvcmUgPT0gUEhZX0NPUkVfMCkgewotCQkJcnhfYW50dmFsID0gMHgxOwotCQkJdHhfYW50dmFsID0gMHg4OwotCQl9IGVsc2UgewotCQkJcnhfYW50dmFsID0gMHg0OwotCQkJdHhfYW50dmFsID0gMHgyOwotCQl9Ci0KLQkJd2xjX3BoeV9yZmN0cmxpbnRjX292ZXJyaWRlX25waHkocGksCi0JCQkJCQkgTlBIWV9SZmN0cmxJbnRjX292ZXJyaWRlX1RSU1csCi0JCQkJCQkgcnhfYW50dmFsLCByeF9jb3JlICsgMSk7Ci0JCXdsY19waHlfcmZjdHJsaW50Y19vdmVycmlkZV9ucGh5KHBpLAotCQkJCQkJIE5QSFlfUmZjdHJsSW50Y19vdmVycmlkZV9UUlNXLAotCQkJCQkJIHR4X2FudHZhbCwgdHhfY29yZSArIDEpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgd2xjX3BoeV9yeGNhbF9waHljbGVhbnVwX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHU4IHJ4X2NvcmUpCi17Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCAweGEyLCBwaS0+dHhfcnhfY2FsX3BoeV9zYXZlcmVnc1swXSk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgKHJ4X2NvcmUgPT0gUEhZX0NPUkVfMCkgPyAweGE2IDogMHhhNywKLQkJICAgICAgcGktPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3NbMV0pOwotCXdyaXRlX3BoeV9yZWcocGksIChyeF9jb3JlID09IFBIWV9DT1JFXzApID8gMHg4ZiA6IDB4YTUsCi0JCSAgICAgIHBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzJdKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDkxLCBwaS0+dHhfcnhfY2FsX3BoeV9zYXZlcmVnc1szXSk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHg5MiwgcGktPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3NbNF0pOwotCi0Jd3JpdGVfcGh5X3JlZyhwaSwgMHg3YSwgcGktPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3NbNV0pOwotCXdyaXRlX3BoeV9yZWcocGksIDB4N2QsIHBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzZdKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweGU3LCBwaS0+dHhfcnhfY2FsX3BoeV9zYXZlcmVnc1s3XSk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHhlYywgcGktPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3NbOF0pOwotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCQl3cml0ZV9waHlfcmVnKHBpLCAweDM0MiwgcGktPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3NbMTFdKTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgzNDMsIHBpLT50eF9yeF9jYWxfcGh5X3NhdmVyZWdzWzEyXSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4MzQ2LCBwaS0+dHhfcnhfY2FsX3BoeV9zYXZlcmVnc1sxM10pOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDM0NywgcGktPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3NbMTRdKTsKLQl9Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCAweDI5NywgcGktPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3NbOV0pOwotCXdyaXRlX3BoeV9yZWcocGksIDB4MjliLCBwaS0+dHhfcnhfY2FsX3BoeV9zYXZlcmVnc1sxMF0pOwotfQotCi1zdGF0aWMgdm9pZAotd2xjX3BoeV9yeGNhbF9nYWluY3RybF9ucGh5X3JldjUoc3RydWN0IGJyY21zX3BoeSAqcGksIHU4IHJ4X2NvcmUsCi0JCQkJIHUxNiAqcnhnYWluLCB1OCBjYWxfdHlwZSkKLXsKLQotCXUxNiBudW1fc2FtcHM7Ci0Jc3RydWN0IHBoeV9pcV9lc3QgZXN0W1BIWV9DT1JFX01BWF07Ci0JdTggdHhfY29yZTsKLQlzdHJ1Y3QgbnBoeV9pcV9jb21wIHNhdmVfY29tcCwgemVyb19jb21wOwotCXUzMiBpX3B3ciwgcV9wd3IsIGN1cnJfcHdyLCBvcHRpbV9wd3IgPSAwLCBwcmV2X3B3ciA9IDAsIHRocmVzaF9wd3IgPQotCSAgICAxMDAwMDsKLQlzMTYgZGVzaXJlZF9sb2cyX3B3ciwgYWN0dWFsX2xvZzJfcHdyLCBkZWx0YV9wd3I7Ci0JYm9vbCBnYWluY3RybF9kb25lID0gZmFsc2U7Ci0JdTggbWl4X3RpYV9nYWluID0gMzsKLQlzOCBvcHRpbV9nYWludGJsX2luZGV4ID0gMCwgcHJldl9nYWludGJsX2luZGV4ID0gMDsKLQlzOCBjdXJyX2dhaW50YmxfaW5kZXggPSAzOwotCXU4IGdhaW5jdHJsX2Rpcm4gPSBOUEhZX1JYQ0FMX0dBSU5fSU5JVDsKLQlzdHJ1Y3QgbnBoeV9pcGFfdHhyeGdhaW4gKm5waHlfcnhjYWxfZ2FpbnRibDsKLQl1MTYgaHB2Z2EsIGxwZl9iaXExLCBscGZfYmlxMCwgbG5hMiwgbG5hMTsKLQlpbnQgZmluZV9nYWluX2lkeDsKLQlzOCB0eHB3cmluZGV4OwotCXUxNiBucGh5X3J4Y2FsX3R4Z2FpblsyXTsKLQotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCi0JCXR4X2NvcmUgPSByeF9jb3JlOwotCX0gZWxzZSB7Ci0JCXR4X2NvcmUgPSAxIC0gcnhfY29yZTsKLQl9Ci0KLQludW1fc2FtcHMgPSAxMDI0OwotCWRlc2lyZWRfbG9nMl9wd3IgPSAoY2FsX3R5cGUgPT0gMCkgPyAxMyA6IDEzOwotCi0Jd2xjX3BoeV9yeF9pcV9jb2VmZnNfbnBoeShwaSwgMCwgJnNhdmVfY29tcCk7Ci0JemVyb19jb21wLmEwID0gemVyb19jb21wLmIwID0gemVyb19jb21wLmExID0gemVyb19jb21wLmIxID0gMHgwOwotCXdsY19waHlfcnhfaXFfY29lZmZzX25waHkocGksIDEsICZ6ZXJvX2NvbXApOwotCi0JaWYgKENIU1BFQ19JUzVHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCQltaXhfdGlhX2dhaW4gPSAzOwotCQl9IGVsc2UgaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDQpKSB7Ci0JCQltaXhfdGlhX2dhaW4gPSA0OwotCQl9IGVsc2UgewotCQkJbWl4X3RpYV9nYWluID0gNjsKLQkJfQotCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQkJCW5waHlfcnhjYWxfZ2FpbnRibCA9IG5waHlfaXBhX3J4Y2FsX2dhaW50YmxfNUdIel9yZXY3OwotCQl9IGVsc2UgewotCQkJbnBoeV9yeGNhbF9nYWludGJsID0gbnBoeV9pcGFfcnhjYWxfZ2FpbnRibF81R0h6OwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCQlucGh5X3J4Y2FsX2dhaW50YmwgPSBucGh5X2lwYV9yeGNhbF9nYWludGJsXzJHSHpfcmV2NzsKLQkJfSBlbHNlIHsKLQkJCW5waHlfcnhjYWxfZ2FpbnRibCA9IG5waHlfaXBhX3J4Y2FsX2dhaW50YmxfMkdIejsKLQkJfQotCX0KLQotCWRvIHsKLQotCQlocHZnYSA9IChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgPwotCQkgICAgMCA6IG5waHlfcnhjYWxfZ2FpbnRibFtjdXJyX2dhaW50YmxfaW5kZXhdLmhwdmdhOwotCQlscGZfYmlxMSA9IG5waHlfcnhjYWxfZ2FpbnRibFtjdXJyX2dhaW50YmxfaW5kZXhdLmxwZl9iaXExOwotCQlscGZfYmlxMCA9IG5waHlfcnhjYWxfZ2FpbnRibFtjdXJyX2dhaW50YmxfaW5kZXhdLmxwZl9iaXEwOwotCQlsbmEyID0gbnBoeV9yeGNhbF9nYWludGJsW2N1cnJfZ2FpbnRibF9pbmRleF0ubG5hMjsKLQkJbG5hMSA9IG5waHlfcnhjYWxfZ2FpbnRibFtjdXJyX2dhaW50YmxfaW5kZXhdLmxuYTE7Ci0JCXR4cHdyaW5kZXggPSBucGh5X3J4Y2FsX2dhaW50YmxbY3Vycl9nYWludGJsX2luZGV4XS50eHB3cmluZGV4OwotCi0JCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfMXRvbWFueV9ucGh5KHBpLAotCQkJCQkJCSAgICAgTlBIWV9SRVY3X1JmY3RybE92ZXJyaWRlX2NtZF9yeGdhaW4sCi0JCQkJCQkJICAgICAoKGxwZl9iaXExIDw8IDEyKSB8Ci0JCQkJCQkJICAgICAgKGxwZl9iaXEwIDw8IDgpIHwKLQkJCQkJCQkgICAgICAobWl4X3RpYV9nYWluIDw8Ci0JCQkJCQkJICAgICAgIDQpIHwgKGxuYTIgPDwgMikKLQkJCQkJCQkgICAgICB8IGxuYTEpLCAweDMsIDApOwotCQl9IGVsc2UgewotCQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeShwaSwgKDB4MSA8PCAxMiksCi0JCQkJCQkgICAgICgoaHB2Z2EgPDwgMTIpIHwKLQkJCQkJCSAgICAgIChscGZfYmlxMSA8PCAxMCkgfAotCQkJCQkJICAgICAgKGxwZl9iaXEwIDw8IDgpIHwKLQkJCQkJCSAgICAgIChtaXhfdGlhX2dhaW4gPDwgNCkgfAotCQkJCQkJICAgICAgKGxuYTIgPDwgMikgfCBsbmExKSwgMHgzLAotCQkJCQkJICAgICAwKTsKLQkJfQotCi0JCXBpLT5ucGh5X3J4Y2FsX3B3cl9pZHhbdHhfY29yZV0gPSB0eHB3cmluZGV4OwotCi0JCWlmICh0eHB3cmluZGV4ID09IC0xKSB7Ci0JCQlucGh5X3J4Y2FsX3R4Z2FpblswXSA9IDB4OGZmMCB8IHBpLT5ucGh5X2dtdmFsOwotCQkJbnBoeV9yeGNhbF90eGdhaW5bMV0gPSAweDhmZjAgfCBwaS0+bnBoeV9nbXZhbDsKLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfUkZTRVEsCi0JCQkJCQkgMiwgMHgxMTAsIDE2LAotCQkJCQkJIG5waHlfcnhjYWxfdHhnYWluKTsKLQkJfSBlbHNlIHsKLQkJCXdsY19waHlfdHhwd3JfaW5kZXhfbnBoeShwaSwgdHhfY29yZSArIDEsIHR4cHdyaW5kZXgsCi0JCQkJCQkgZmFsc2UpOwotCQl9Ci0KLQkJd2xjX3BoeV90eF90b25lX25waHkocGksIChDSFNQRUNfSVM0MChwaS0+cmFkaW9fY2hhbnNwZWMpKSA/Ci0JCQkJICAgICBOUEhZX1JYQ0FMX1RPTkVGUkVRXzQwTUh6IDoKLQkJCQkgICAgIE5QSFlfUlhDQUxfVE9ORUZSRVFfMjBNSHosCi0JCQkJICAgICBOUEhZX1JYQ0FMX1RPTkVBTVAsIDAsIGNhbF90eXBlLCBmYWxzZSk7Ci0KLQkJd2xjX3BoeV9yeF9pcV9lc3RfbnBoeShwaSwgZXN0LCBudW1fc2FtcHMsIDMyLCAwKTsKLQkJaV9wd3IgPSAoZXN0W3J4X2NvcmVdLmlfcHdyICsgbnVtX3NhbXBzIC8gMikgLyBudW1fc2FtcHM7Ci0JCXFfcHdyID0gKGVzdFtyeF9jb3JlXS5xX3B3ciArIG51bV9zYW1wcyAvIDIpIC8gbnVtX3NhbXBzOwotCQljdXJyX3B3ciA9IGlfcHdyICsgcV9wd3I7Ci0KLQkJc3dpdGNoIChnYWluY3RybF9kaXJuKSB7Ci0JCWNhc2UgTlBIWV9SWENBTF9HQUlOX0lOSVQ6Ci0JCQlpZiAoY3Vycl9wd3IgPiB0aHJlc2hfcHdyKSB7Ci0JCQkJZ2FpbmN0cmxfZGlybiA9IE5QSFlfUlhDQUxfR0FJTl9ET1dOOwotCQkJCXByZXZfZ2FpbnRibF9pbmRleCA9IGN1cnJfZ2FpbnRibF9pbmRleDsKLQkJCQljdXJyX2dhaW50YmxfaW5kZXgtLTsKLQkJCX0gZWxzZSB7Ci0JCQkJZ2FpbmN0cmxfZGlybiA9IE5QSFlfUlhDQUxfR0FJTl9VUDsKLQkJCQlwcmV2X2dhaW50YmxfaW5kZXggPSBjdXJyX2dhaW50YmxfaW5kZXg7Ci0JCQkJY3Vycl9nYWludGJsX2luZGV4Kys7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIE5QSFlfUlhDQUxfR0FJTl9VUDoKLQkJCWlmIChjdXJyX3B3ciA+IHRocmVzaF9wd3IpIHsKLQkJCQlnYWluY3RybF9kb25lID0gdHJ1ZTsKLQkJCQlvcHRpbV9wd3IgPSBwcmV2X3B3cjsKLQkJCQlvcHRpbV9nYWludGJsX2luZGV4ID0gcHJldl9nYWludGJsX2luZGV4OwotCQkJfSBlbHNlIHsKLQkJCQlwcmV2X2dhaW50YmxfaW5kZXggPSBjdXJyX2dhaW50YmxfaW5kZXg7Ci0JCQkJY3Vycl9nYWludGJsX2luZGV4Kys7Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIE5QSFlfUlhDQUxfR0FJTl9ET1dOOgotCQkJaWYgKGN1cnJfcHdyID4gdGhyZXNoX3B3cikgewotCQkJCXByZXZfZ2FpbnRibF9pbmRleCA9IGN1cnJfZ2FpbnRibF9pbmRleDsKLQkJCQljdXJyX2dhaW50YmxfaW5kZXgtLTsKLQkJCX0gZWxzZSB7Ci0JCQkJZ2FpbmN0cmxfZG9uZSA9IHRydWU7Ci0JCQkJb3B0aW1fcHdyID0gY3Vycl9wd3I7Ci0JCQkJb3B0aW1fZ2FpbnRibF9pbmRleCA9IGN1cnJfZ2FpbnRibF9pbmRleDsKLQkJCX0KLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmICgoY3Vycl9nYWludGJsX2luZGV4IDwgMCkgfHwKLQkJICAgIChjdXJyX2dhaW50YmxfaW5kZXggPiBOUEhZX0lQQV9SWENBTF9NQVhHQUlOSU5ERVgpKSB7Ci0JCQlnYWluY3RybF9kb25lID0gdHJ1ZTsKLQkJCW9wdGltX3B3ciA9IGN1cnJfcHdyOwotCQkJb3B0aW1fZ2FpbnRibF9pbmRleCA9IHByZXZfZ2FpbnRibF9pbmRleDsKLQkJfSBlbHNlIHsKLQkJCXByZXZfcHdyID0gY3Vycl9wd3I7Ci0JCX0KLQotCQl3bGNfcGh5X3N0b3BwbGF5YmFja19ucGh5KHBpKTsKLQl9IHdoaWxlICghZ2FpbmN0cmxfZG9uZSk7Ci0KLQlocHZnYSA9IG5waHlfcnhjYWxfZ2FpbnRibFtvcHRpbV9nYWludGJsX2luZGV4XS5ocHZnYTsKLQlscGZfYmlxMSA9IG5waHlfcnhjYWxfZ2FpbnRibFtvcHRpbV9nYWludGJsX2luZGV4XS5scGZfYmlxMTsKLQlscGZfYmlxMCA9IG5waHlfcnhjYWxfZ2FpbnRibFtvcHRpbV9nYWludGJsX2luZGV4XS5scGZfYmlxMDsKLQlsbmEyID0gbnBoeV9yeGNhbF9nYWludGJsW29wdGltX2dhaW50YmxfaW5kZXhdLmxuYTI7Ci0JbG5hMSA9IG5waHlfcnhjYWxfZ2FpbnRibFtvcHRpbV9nYWludGJsX2luZGV4XS5sbmExOwotCXR4cHdyaW5kZXggPSBucGh5X3J4Y2FsX2dhaW50Ymxbb3B0aW1fZ2FpbnRibF9pbmRleF0udHhwd3JpbmRleDsKLQotCWFjdHVhbF9sb2cyX3B3ciA9IHdsY19waHlfbmJpdHMob3B0aW1fcHdyKTsKLQlkZWx0YV9wd3IgPSBkZXNpcmVkX2xvZzJfcHdyIC0gYWN0dWFsX2xvZzJfcHdyOwotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCWZpbmVfZ2Fpbl9pZHggPSAoaW50KWxwZl9iaXExICsgZGVsdGFfcHdyOwotCi0JCWlmIChmaW5lX2dhaW5faWR4ICsgKGludClscGZfYmlxMCA+IDEwKSB7Ci0JCQlscGZfYmlxMSA9IDEwIC0gbHBmX2JpcTA7Ci0JCX0gZWxzZSB7Ci0JCQlscGZfYmlxMSA9ICh1MTYpIG1heChmaW5lX2dhaW5faWR4LCAwKTsKLQkJfQotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV8xdG9tYW55X25waHkocGksCi0JCQkJCQkgICAgIE5QSFlfUkVWN19SZmN0cmxPdmVycmlkZV9jbWRfcnhnYWluLAotCQkJCQkJICAgICAoKGxwZl9iaXExIDw8IDEyKSB8Ci0JCQkJCQkgICAgICAobHBmX2JpcTAgPDwgOCkgfAotCQkJCQkJICAgICAgKG1peF90aWFfZ2FpbiA8PCA0KSB8Ci0JCQkJCQkgICAgICAobG5hMiA8PCAyKSB8IGxuYTEpLCAweDMsCi0JCQkJCQkgICAgIDApOwotCX0gZWxzZSB7Ci0JCWhwdmdhID0gKHUxNikgbWF4KG1pbigoKGludClocHZnYSkgKyBkZWx0YV9wd3IsIDEwKSwgMCk7Ci0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHkocGksICgweDEgPDwgMTIpLAotCQkJCQkgICAgICgoaHB2Z2EgPDwgMTIpIHwgKGxwZl9iaXExIDw8IDEwKSB8Ci0JCQkJCSAgICAgIChscGZfYmlxMCA8PCA4KSB8IChtaXhfdGlhX2dhaW4gPDwKLQkJCQkJCQkJIDQpIHwgKGxuYTIgPDwKLQkJCQkJCQkJICAgICAgIDIpIHwKLQkJCQkJICAgICAgbG5hMSksIDB4MywgMCk7Ci0KLQl9Ci0KLQlpZiAocnhnYWluICE9IE5VTEwpIHsKLQkJKnJ4Z2FpbisrID0gbG5hMTsKLQkJKnJ4Z2FpbisrID0gbG5hMjsKLQkJKnJ4Z2FpbisrID0gbWl4X3RpYV9nYWluOwotCQkqcnhnYWluKysgPSBscGZfYmlxMDsKLQkJKnJ4Z2FpbisrID0gbHBmX2JpcTE7Ci0JCSpyeGdhaW4gPSBocHZnYTsKLQl9Ci0KLQl3bGNfcGh5X3J4X2lxX2NvZWZmc19ucGh5KHBpLCAxLCAmc2F2ZV9jb21wKTsKLX0KLQotc3RhdGljIHZvaWQKLXdsY19waHlfcnhjYWxfZ2FpbmN0cmxfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTggcnhfY29yZSwgdTE2ICpyeGdhaW4sCi0JCQkgICAgdTggY2FsX3R5cGUpCi17Ci0Jd2xjX3BoeV9yeGNhbF9nYWluY3RybF9ucGh5X3JldjUocGksIHJ4X2NvcmUsIHJ4Z2FpbiwgY2FsX3R5cGUpOwotfQotCi1zdGF0aWMgdTgKLXdsY19waHlfcmNfc3dlZXBfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTggY29yZV9pZHgsIHU4IGxvb3BiYWNrX3R5cGUpCi17Ci0JdTMyIHRhcmdldF9id3NbMl0gPSB7IDk1MDAsIDIxMDAwIH07Ci0JdTMyIHJlZl90b25lc1syXSA9IHsgMzAwMCwgNjAwMCB9OwotCXUzMiB0YXJnZXRfYncsIHJlZl90b25lOwotCi0JdTMyIHRhcmdldF9wd3JfcmF0aW9zWzJdID0geyAyODYwNiwgMTg0NjggfTsKLQl1MzIgdGFyZ2V0X3B3cl9yYXRpbywgcHdyX3JhdGlvLCBsYXN0X3B3cl9yYXRpbyA9IDA7Ci0KLQl1MTYgc3RhcnRfcmNjYWxfb3ZyX3ZhbCA9IDEyODsKLQl1MTYgdHhscGZfcmNjYWxfbHBjX292cl92YWwgPSAxMjg7Ci0JdTE2IHJ4bHBmX3JjY2FsX2hwY19vdnJfdmFsID0gMTU5OwotCi0JdTE2IG9yaWdfdHhscGZfcmNjYWxfbHBjX292cl92YWw7Ci0JdTE2IG9yaWdfcnhscGZfcmNjYWxfaHBjX292cl92YWw7Ci0JdTE2IHJhZGlvX2FkZHJfb2Zmc2V0X3J4OwotCXUxNiByYWRpb19hZGRyX29mZnNldF90eDsKLQl1MTYgb3JpZ19kY0J5cGFzczsKLQl1MTYgb3JpZ19SeFN0cm5GaWx0NDBOdW1bNl07Ci0JdTE2IG9yaWdfUnhTdHJuRmlsdDQwRGVuWzRdOwotCXUxNiBvcmlnX3JmY3RybG92ZXJyaWRlWzJdOwotCXUxNiBvcmlnX3JmY3RybGF1eHJlZ1syXTsKLQl1MTYgb3JpZ19yZmN0cmxyc3Npb3RoZXJzOwotCXUxNiB0eF9scGZfYncgPSA0OwotCi0JdTE2IHJ4X2xwZl9idywgcnhfbHBmX2J3c1syXSA9IHsgMiwgNCB9OwotCXUxNiBscGZfaHBjID0gNywgaHB2Z2FfaHBjID0gNzsKLQotCXM4IHJjY2FsX3N0ZXBzaXplOwotCXUxNiByY2NhbF92YWwsIGxhc3RfcmNjYWxfdmFsID0gMCwgYmVzdF9yY2NhbF92YWwgPSAwOwotCXUzMiByZWZfaXFfdmFscyA9IDAsIHRhcmdldF9pcV92YWxzID0gMDsKLQl1MTYgbnVtX3NhbXBzLCBsb2dfbnVtX3NhbXBzID0gMTA7Ci0Jc3RydWN0IHBoeV9pcV9lc3QgZXN0W1BIWV9DT1JFX01BWF07Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbnVtX3NhbXBzID0gKDEgPDwgbG9nX251bV9zYW1wcyk7Ci0KLQlpZiAoQ0hTUEVDX0lTNDAocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQl0YXJnZXRfYncgPSB0YXJnZXRfYndzWzFdOwotCQl0YXJnZXRfcHdyX3JhdGlvID0gdGFyZ2V0X3B3cl9yYXRpb3NbMV07Ci0JCXJlZl90b25lID0gcmVmX3RvbmVzWzFdOwotCQlyeF9scGZfYncgPSByeF9scGZfYndzWzFdOwotCX0gZWxzZSB7Ci0JCXRhcmdldF9idyA9IHRhcmdldF9id3NbMF07Ci0JCXRhcmdldF9wd3JfcmF0aW8gPSB0YXJnZXRfcHdyX3JhdGlvc1swXTsKLQkJcmVmX3RvbmUgPSByZWZfdG9uZXNbMF07Ci0JCXJ4X2xwZl9idyA9IHJ4X2xwZl9id3NbMF07Ci0JfQotCi0JaWYgKGNvcmVfaWR4ID09IDApIHsKLQkJcmFkaW9fYWRkcl9vZmZzZXRfcnggPSBSQURJT18yMDU2X1JYMDsKLQkJcmFkaW9fYWRkcl9vZmZzZXRfdHggPQotCQkgICAgKGxvb3BiYWNrX3R5cGUgPT0gMCkgPyBSQURJT18yMDU2X1RYMCA6IFJBRElPXzIwNTZfVFgxOwotCX0gZWxzZSB7Ci0JCXJhZGlvX2FkZHJfb2Zmc2V0X3J4ID0gUkFESU9fMjA1Nl9SWDE7Ci0JCXJhZGlvX2FkZHJfb2Zmc2V0X3R4ID0KLQkJICAgIChsb29wYmFja190eXBlID09IDApID8gUkFESU9fMjA1Nl9UWDEgOiBSQURJT18yMDU2X1RYMDsKLQl9Ci0KLQlvcmlnX3R4bHBmX3JjY2FsX2xwY19vdnJfdmFsID0KLQkgICAgcmVhZF9yYWRpb19yZWcocGksCi0JCQkgICAoUkFESU9fMjA1Nl9UWF9UWExQRl9SQ0NBTCB8IHJhZGlvX2FkZHJfb2Zmc2V0X3R4KSk7Ci0Jb3JpZ19yeGxwZl9yY2NhbF9ocGNfb3ZyX3ZhbCA9Ci0JICAgIHJlYWRfcmFkaW9fcmVnKHBpLAotCQkJICAgKFJBRElPXzIwNTZfUlhfUlhMUEZfUkNDQUxfSFBDIHwKLQkJCSAgICByYWRpb19hZGRyX29mZnNldF9yeCkpOwotCi0Jb3JpZ19kY0J5cGFzcyA9ICgocmVhZF9waHlfcmVnKHBpLCAweDQ4KSA+PiA4KSAmIDEpOwotCi0Jb3JpZ19SeFN0cm5GaWx0NDBOdW1bMF0gPSByZWFkX3BoeV9yZWcocGksIDB4MjY3KTsKLQlvcmlnX1J4U3RybkZpbHQ0ME51bVsxXSA9IHJlYWRfcGh5X3JlZyhwaSwgMHgyNjgpOwotCW9yaWdfUnhTdHJuRmlsdDQwTnVtWzJdID0gcmVhZF9waHlfcmVnKHBpLCAweDI2OSk7Ci0Jb3JpZ19SeFN0cm5GaWx0NDBEZW5bMF0gPSByZWFkX3BoeV9yZWcocGksIDB4MjZhKTsKLQlvcmlnX1J4U3RybkZpbHQ0MERlblsxXSA9IHJlYWRfcGh5X3JlZyhwaSwgMHgyNmIpOwotCW9yaWdfUnhTdHJuRmlsdDQwTnVtWzNdID0gcmVhZF9waHlfcmVnKHBpLCAweDI2Yyk7Ci0Jb3JpZ19SeFN0cm5GaWx0NDBOdW1bNF0gPSByZWFkX3BoeV9yZWcocGksIDB4MjZkKTsKLQlvcmlnX1J4U3RybkZpbHQ0ME51bVs1XSA9IHJlYWRfcGh5X3JlZyhwaSwgMHgyNmUpOwotCW9yaWdfUnhTdHJuRmlsdDQwRGVuWzJdID0gcmVhZF9waHlfcmVnKHBpLCAweDI2Zik7Ci0Jb3JpZ19SeFN0cm5GaWx0NDBEZW5bM10gPSByZWFkX3BoeV9yZWcocGksIDB4MjcwKTsKLQotCW9yaWdfcmZjdHJsb3ZlcnJpZGVbMF0gPSByZWFkX3BoeV9yZWcocGksIDB4ZTcpOwotCW9yaWdfcmZjdHJsb3ZlcnJpZGVbMV0gPSByZWFkX3BoeV9yZWcocGksIDB4ZWMpOwotCW9yaWdfcmZjdHJsYXV4cmVnWzBdID0gcmVhZF9waHlfcmVnKHBpLCAweGY4KTsKLQlvcmlnX3JmY3RybGF1eHJlZ1sxXSA9IHJlYWRfcGh5X3JlZyhwaSwgMHhmYSk7Ci0Jb3JpZ19yZmN0cmxyc3Npb3RoZXJzID0gcmVhZF9waHlfcmVnKHBpLCAoY29yZV9pZHggPT0gMCkgPyAweDdhIDogMHg3ZCk7Ci0KLQl3cml0ZV9yYWRpb19yZWcocGksIChSQURJT18yMDU2X1RYX1RYTFBGX1JDQ0FMIHwgcmFkaW9fYWRkcl9vZmZzZXRfdHgpLAotCQkJdHhscGZfcmNjYWxfbHBjX292cl92YWwpOwotCi0Jd3JpdGVfcmFkaW9fcmVnKHBpLAotCQkJKFJBRElPXzIwNTZfUlhfUlhMUEZfUkNDQUxfSFBDIHwgcmFkaW9fYWRkcl9vZmZzZXRfcngpLAotCQkJcnhscGZfcmNjYWxfaHBjX292cl92YWwpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NDgsICgweDEgPDwgOCksICgweDEgPDwgOCkpOwotCi0Jd3JpdGVfcGh5X3JlZyhwaSwgMHgyNjcsIDB4MDJkNCk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHgyNjgsIDB4MDAwMCk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHgyNjksIDB4MDAwMCk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHgyNmEsIDB4MDAwMCk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHgyNmIsIDB4MDAwMCk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHgyNmMsIDB4MDJkNCk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHgyNmQsIDB4MDAwMCk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHgyNmUsIDB4MDAwMCk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHgyNmYsIDB4MDAwMCk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHgyNzAsIDB4MDAwMCk7Ci0KLQlvcl9waHlfcmVnKHBpLCAoY29yZV9pZHggPT0gMCkgPyAweGU3IDogMHhlYywgKDB4MSA8PCA4KSk7Ci0Jb3JfcGh5X3JlZyhwaSwgKGNvcmVfaWR4ID09IDApID8gMHhlYyA6IDB4ZTcsICgweDEgPDwgMTUpKTsKLQlvcl9waHlfcmVnKHBpLCAoY29yZV9pZHggPT0gMCkgPyAweGU3IDogMHhlYywgKDB4MSA8PCA5KSk7Ci0Jb3JfcGh5X3JlZyhwaSwgKGNvcmVfaWR4ID09IDApID8gMHhlNyA6IDB4ZWMsICgweDEgPDwgMTApKTsKLQotCW1vZF9waHlfcmVnKHBpLCAoY29yZV9pZHggPT0gMCkgPyAweGZhIDogMHhmOCwKLQkJICAgICgweDcgPDwgMTApLCAodHhfbHBmX2J3IDw8IDEwKSk7Ci0JbW9kX3BoeV9yZWcocGksIChjb3JlX2lkeCA9PSAwKSA/IDB4ZjggOiAweGZhLAotCQkgICAgKDB4NyA8PCAwKSwgKGhwdmdhX2hwYyA8PCAwKSk7Ci0JbW9kX3BoeV9yZWcocGksIChjb3JlX2lkeCA9PSAwKSA/IDB4ZjggOiAweGZhLAotCQkgICAgKDB4NyA8PCA0KSwgKGxwZl9ocGMgPDwgNCkpOwotCW1vZF9waHlfcmVnKHBpLCAoY29yZV9pZHggPT0gMCkgPyAweDdhIDogMHg3ZCwKLQkJICAgICgweDcgPDwgOCksIChyeF9scGZfYncgPDwgOCkpOwotCi0JcmNjYWxfc3RlcHNpemUgPSAxNjsKLQlyY2NhbF92YWwgPSBzdGFydF9yY2NhbF9vdnJfdmFsICsgcmNjYWxfc3RlcHNpemU7Ci0KLQl3aGlsZSAocmNjYWxfc3RlcHNpemUgPj0gMCkgewotCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJKFJBRElPXzIwNTZfUlhfUlhMUEZfUkNDQUxfTFBDIHwKLQkJCQkgcmFkaW9fYWRkcl9vZmZzZXRfcngpLCByY2NhbF92YWwpOwotCi0JCWlmIChyY2NhbF9zdGVwc2l6ZSA9PSAxNikgewotCi0JCQl3bGNfcGh5X3R4X3RvbmVfbnBoeShwaSwgcmVmX3RvbmUsIE5QSFlfUlhDQUxfVE9ORUFNUCwKLQkJCQkJICAgICAwLCAxLCBmYWxzZSk7Ci0JCQl1ZGVsYXkoMik7Ci0KLQkJCXdsY19waHlfcnhfaXFfZXN0X25waHkocGksIGVzdCwgbnVtX3NhbXBzLCAzMiwgMCk7Ci0KLQkJCWlmIChjb3JlX2lkeCA9PSAwKSB7Ci0JCQkJcmVmX2lxX3ZhbHMgPQotCQkJCSAgICBtYXhfdCh1MzIsIChlc3RbMF0uaV9wd3IgKwotCQkJCQkgZXN0WzBdLnFfcHdyKSA+PiAobG9nX251bV9zYW1wcyArIDEpLAotCQkJCQkxKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVmX2lxX3ZhbHMgPQotCQkJCSAgICBtYXhfdCh1MzIsIChlc3RbMV0uaV9wd3IgKwotCQkJCQkgZXN0WzFdLnFfcHdyKSA+PiAobG9nX251bV9zYW1wcyArIDEpLAotCQkJCQkxKTsKLQkJCX0KLQotCQkJd2xjX3BoeV90eF90b25lX25waHkocGksIHRhcmdldF9idywgTlBIWV9SWENBTF9UT05FQU1QLAotCQkJCQkgICAgIDAsIDEsIGZhbHNlKTsKLQkJCXVkZWxheSgyKTsKLQkJfQotCi0JCXdsY19waHlfcnhfaXFfZXN0X25waHkocGksIGVzdCwgbnVtX3NhbXBzLCAzMiwgMCk7Ci0KLQkJaWYgKGNvcmVfaWR4ID09IDApIHsKLQkJCXRhcmdldF9pcV92YWxzID0KLQkJCSAgICAoZXN0WzBdLmlfcHdyICsgZXN0WzBdLnFfcHdyKSA+PiAobG9nX251bV9zYW1wcyArCi0JCQkJCQkJICAgICAgMSk7Ci0JCX0gZWxzZSB7Ci0JCQl0YXJnZXRfaXFfdmFscyA9Ci0JCQkgICAgKGVzdFsxXS5pX3B3ciArIGVzdFsxXS5xX3B3cikgPj4gKGxvZ19udW1fc2FtcHMgKwotCQkJCQkJCSAgICAgIDEpOwotCQl9Ci0JCXB3cl9yYXRpbyA9ICh1aW50KSAoKHRhcmdldF9pcV92YWxzIDw8IDE2KSAvIHJlZl9pcV92YWxzKTsKLQotCQlpZiAocmNjYWxfc3RlcHNpemUgPT0gMCkgewotCQkJcmNjYWxfc3RlcHNpemUtLTsKLQkJfSBlbHNlIGlmIChyY2NhbF9zdGVwc2l6ZSA9PSAxKSB7Ci0JCQlsYXN0X3JjY2FsX3ZhbCA9IHJjY2FsX3ZhbDsKLQkJCXJjY2FsX3ZhbCArPSAocHdyX3JhdGlvID4gdGFyZ2V0X3B3cl9yYXRpbykgPyAxIDogLTE7Ci0JCQlsYXN0X3B3cl9yYXRpbyA9IHB3cl9yYXRpbzsKLQkJCXJjY2FsX3N0ZXBzaXplLS07Ci0JCX0gZWxzZSB7Ci0JCQlyY2NhbF9zdGVwc2l6ZSA9IChyY2NhbF9zdGVwc2l6ZSA+PiAxKTsKLQkJCXJjY2FsX3ZhbCArPSAoKHB3cl9yYXRpbyA+IHRhcmdldF9wd3JfcmF0aW8pID8KLQkJCQkgICAgICByY2NhbF9zdGVwc2l6ZSA6ICgtcmNjYWxfc3RlcHNpemUpKTsKLQkJfQotCi0JCWlmIChyY2NhbF9zdGVwc2l6ZSA9PSAtMSkgewotCQkJYmVzdF9yY2NhbF92YWwgPQotCQkJICAgIChBQlMoKGludClsYXN0X3B3cl9yYXRpbyAtIChpbnQpdGFyZ2V0X3B3cl9yYXRpbykgPAotCQkJICAgICBBQlMoKGludClwd3JfcmF0aW8gLQotCQkJCSAoaW50KXRhcmdldF9wd3JfcmF0aW8pKSA/IGxhc3RfcmNjYWxfdmFsIDoKLQkJCSAgICByY2NhbF92YWw7Ci0KLQkJCWlmIChDSFNQRUNfSVM0MChwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQkJaWYgKChiZXN0X3JjY2FsX3ZhbCA+IDE0MCkKLQkJCQkgICAgfHwgKGJlc3RfcmNjYWxfdmFsIDwgMTM1KSkgewotCQkJCQliZXN0X3JjY2FsX3ZhbCA9IDEzODsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICgoYmVzdF9yY2NhbF92YWwgPiAxNDIpCi0JCQkJICAgIHx8IChiZXN0X3JjY2FsX3ZhbCA8IDEzNykpIHsKLQkJCQkJYmVzdF9yY2NhbF92YWwgPSAxNDA7Ci0JCQkJfQotCQkJfQotCi0JCQl3cml0ZV9yYWRpb19yZWcocGksCi0JCQkJCShSQURJT18yMDU2X1JYX1JYTFBGX1JDQ0FMX0xQQyB8Ci0JCQkJCSByYWRpb19hZGRyX29mZnNldF9yeCksIGJlc3RfcmNjYWxfdmFsKTsKLQkJfQotCX0KLQotCXdsY19waHlfc3RvcHBsYXliYWNrX25waHkocGkpOwotCi0Jd3JpdGVfcmFkaW9fcmVnKHBpLCAoUkFESU9fMjA1Nl9UWF9UWExQRl9SQ0NBTCB8IHJhZGlvX2FkZHJfb2Zmc2V0X3R4KSwKLQkJCW9yaWdfdHhscGZfcmNjYWxfbHBjX292cl92YWwpOwotCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCShSQURJT18yMDU2X1JYX1JYTFBGX1JDQ0FMX0hQQyB8IHJhZGlvX2FkZHJfb2Zmc2V0X3J4KSwKLQkJCW9yaWdfcnhscGZfcmNjYWxfaHBjX292cl92YWwpOwotCi0JbW9kX3BoeV9yZWcocGksIDB4NDgsICgweDEgPDwgOCksIChvcmlnX2RjQnlwYXNzIDw8IDgpKTsKLQotCXdyaXRlX3BoeV9yZWcocGksIDB4MjY3LCBvcmlnX1J4U3RybkZpbHQ0ME51bVswXSk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHgyNjgsIG9yaWdfUnhTdHJuRmlsdDQwTnVtWzFdKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDI2OSwgb3JpZ19SeFN0cm5GaWx0NDBOdW1bMl0pOwotCXdyaXRlX3BoeV9yZWcocGksIDB4MjZhLCBvcmlnX1J4U3RybkZpbHQ0MERlblswXSk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHgyNmIsIG9yaWdfUnhTdHJuRmlsdDQwRGVuWzFdKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDI2Yywgb3JpZ19SeFN0cm5GaWx0NDBOdW1bM10pOwotCXdyaXRlX3BoeV9yZWcocGksIDB4MjZkLCBvcmlnX1J4U3RybkZpbHQ0ME51bVs0XSk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHgyNmUsIG9yaWdfUnhTdHJuRmlsdDQwTnVtWzVdKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweDI2Ziwgb3JpZ19SeFN0cm5GaWx0NDBEZW5bMl0pOwotCXdyaXRlX3BoeV9yZWcocGksIDB4MjcwLCBvcmlnX1J4U3RybkZpbHQ0MERlblszXSk7Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCAweGU3LCBvcmlnX3JmY3RybG92ZXJyaWRlWzBdKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweGVjLCBvcmlnX3JmY3RybG92ZXJyaWRlWzFdKTsKLQl3cml0ZV9waHlfcmVnKHBpLCAweGY4LCBvcmlnX3JmY3RybGF1eHJlZ1swXSk7Ci0Jd3JpdGVfcGh5X3JlZyhwaSwgMHhmYSwgb3JpZ19yZmN0cmxhdXhyZWdbMV0pOwotCXdyaXRlX3BoeV9yZWcocGksIChjb3JlX2lkeCA9PSAwKSA/IDB4N2EgOiAweDdkLCBvcmlnX3JmY3RybHJzc2lvdGhlcnMpOwotCi0JcGktPm5waHlfYW5hcnhscGZfYWRqdXN0ZWQgPSBmYWxzZTsKLQotCXJldHVybiBiZXN0X3JjY2FsX3ZhbCAtIDB4ODA7Ci19Ci0KLSNkZWZpbmUgV0FJVF9GT1JfU0NPUEUJNDAwMAotc3RhdGljIGludCB3bGNfcGh5X2NhbF9yeGlxX25waHlfcmV2MyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwKLQkJCQkgICAgICBzdHJ1Y3QgbnBoeV90eGdhaW5zIHRhcmdldF9nYWluLAotCQkJCSAgICAgIHU4IGNhbF90eXBlLCBib29sIGRlYnVnKQotewotCXUxNiBvcmlnX0JCQ29uZmlnOwotCXU4IGNvcmVfbm8sIHJ4X2NvcmU7Ci0JdTggYmVzdF9yY2NhbFsyXTsKLQl1MTYgZ2Fpbl9zYXZlWzJdOwotCXUxNiBjYWxfZ2FpblsyXTsKLQlzdHJ1Y3QgbnBoeV9pcWNhbF9wYXJhbXMgY2FsX3BhcmFtc1syXTsKLQl1OCByeGNvcmVfc3RhdGU7Ci0JczggcnhscGZfcmNjYWxfaHBjLCB0eGxwZl9yY2NhbF9scGM7Ci0JczggdHhscGZfaWRhYzsKLQlib29sIHBoeWhhbmdfYXZvaWRfc3RhdGUgPSBmYWxzZTsKLQlib29sIHNraXBfcnhpcWNhbCA9IGZhbHNlOwotCi0Jb3JpZ19CQkNvbmZpZyA9IHJlYWRfcGh5X3JlZyhwaSwgMHgwMSk7Ci0JbW9kX3BoeV9yZWcocGksIDB4MDEsICgweDEgPDwgMTUpLCAwKTsKLQotCXdsY19waHlfc3RheV9pbl9jYXJyaWVyc2VhcmNoX25waHkocGksIHRydWUpOwotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDQpKSB7Ci0JCXBoeWhhbmdfYXZvaWRfc3RhdGUgPSBwaS0+cGh5aGFuZ19hdm9pZDsKLQkJcGktPnBoeWhhbmdfYXZvaWQgPSBmYWxzZTsKLQl9Ci0KLQl3bGNfcGh5X3RhYmxlX3JlYWRfbnBoeShwaSwgTlBIWV9UQkxfSURfUkZTRVEsIDIsIDB4MTEwLCAxNiwgZ2Fpbl9zYXZlKTsKLQotCWZvciAoY29yZV9ubyA9IDA7IGNvcmVfbm8gPD0gMTsgY29yZV9ubysrKSB7Ci0JCXdsY19waHlfaXFjYWxfZ2FpbnBhcmFtc19ucGh5KHBpLCBjb3JlX25vLCB0YXJnZXRfZ2FpbiwKLQkJCQkJICAgICAgJmNhbF9wYXJhbXNbY29yZV9ub10pOwotCQljYWxfZ2Fpbltjb3JlX25vXSA9IGNhbF9wYXJhbXNbY29yZV9ub10uY2FsX2dhaW47Ci0JfQotCi0Jd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9SRlNFUSwgMiwgMHgxMTAsIDE2LCBjYWxfZ2Fpbik7Ci0KLQlyeGNvcmVfc3RhdGUgPSB3bGNfcGh5X3J4Y29yZV9nZXRzdGF0ZV9ucGh5KAotCQkJCQkJKHN0cnVjdCBicmNtc19waHlfcHViICopIHBpKTsKLQotCWZvciAocnhfY29yZSA9IDA7IHJ4X2NvcmUgPCBwaS0+cHVicGkucGh5X2NvcmVudW07IHJ4X2NvcmUrKykgewotCi0JCXNraXBfcnhpcWNhbCA9Ci0JCSAgICAoKHJ4Y29yZV9zdGF0ZSAmICgxIDw8IHJ4X2NvcmUpKSA9PSAwKSA/IHRydWUgOiBmYWxzZTsKLQotCQl3bGNfcGh5X3J4Y2FsX3BoeXNldHVwX25waHkocGksIHJ4X2NvcmUpOwotCi0JCXdsY19waHlfcnhjYWxfcmFkaW9fc2V0dXBfbnBoeShwaSwgcnhfY29yZSk7Ci0KLQkJaWYgKCghc2tpcF9yeGlxY2FsKSAmJiAoKGNhbF90eXBlID09IDApIHx8IChjYWxfdHlwZSA9PSAyKSkpIHsKLQotCQkJd2xjX3BoeV9yeGNhbF9nYWluY3RybF9ucGh5KHBpLCByeF9jb3JlLCBOVUxMLCAwKTsKLQotCQkJd2xjX3BoeV90eF90b25lX25waHkocGksCi0JCQkJCSAgICAgKENIU1BFQ19JUzQwKHBpLT5yYWRpb19jaGFuc3BlYykpID8KLQkJCQkJICAgICBOUEhZX1JYQ0FMX1RPTkVGUkVRXzQwTUh6IDoKLQkJCQkJICAgICBOUEhZX1JYQ0FMX1RPTkVGUkVRXzIwTUh6LAotCQkJCQkgICAgIE5QSFlfUlhDQUxfVE9ORUFNUCwgMCwgY2FsX3R5cGUsCi0JCQkJCSAgICAgZmFsc2UpOwotCi0JCQlpZiAoZGVidWcpCi0JCQkJbWRlbGF5KFdBSVRfRk9SX1NDT1BFKTsKLQotCQkJd2xjX3BoeV9jYWxjX3J4X2lxX2NvbXBfbnBoeShwaSwgcnhfY29yZSArIDEpOwotCQkJd2xjX3BoeV9zdG9wcGxheWJhY2tfbnBoeShwaSk7Ci0JCX0KLQotCQlpZiAoKChjYWxfdHlwZSA9PSAxKSB8fCAoY2FsX3R5cGUgPT0gMikpCi0JCSAgICAmJiBOUkVWX0xUKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCi0JCQlpZiAocnhfY29yZSA9PSBQSFlfQ09SRV8xKSB7Ci0KLQkJCQlpZiAocnhjb3JlX3N0YXRlID09IDEpIHsKLQkJCQkJd2xjX3BoeV9yeGNvcmVfc2V0c3RhdGVfbnBoeSgKLQkJCQkJCShzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqKSBwaSwgMyk7Ci0JCQkJfQotCi0JCQkJd2xjX3BoeV9yeGNhbF9nYWluY3RybF9ucGh5KHBpLCByeF9jb3JlLCBOVUxMLAotCQkJCQkJCSAgICAxKTsKLQotCQkJCWJlc3RfcmNjYWxbcnhfY29yZV0gPQotCQkJCSAgICB3bGNfcGh5X3JjX3N3ZWVwX25waHkocGksIHJ4X2NvcmUsIDEpOwotCQkJCXBpLT5ucGh5X3JjY2FsX3ZhbHVlID0gYmVzdF9yY2NhbFtyeF9jb3JlXTsKLQotCQkJCWlmIChyeGNvcmVfc3RhdGUgPT0gMSkgewotCQkJCQl3bGNfcGh5X3J4Y29yZV9zZXRzdGF0ZV9ucGh5KAotCQkJCQkJKHN0cnVjdCBicmNtc19waHlfcHViICopIHBpLAotCQkJCQkJcnhjb3JlX3N0YXRlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQl3bGNfcGh5X3J4Y2FsX3JhZGlvX2NsZWFudXBfbnBoeShwaSwgcnhfY29yZSk7Ci0KLQkJd2xjX3BoeV9yeGNhbF9waHljbGVhbnVwX25waHkocGksIHJ4X2NvcmUpOwotCQl3bGNfcGh5X2ZvcmNlX3Jmc2VxX25waHkocGksIE5QSFlfUkZTRVFfUkVTRVQyUlgpOwotCX0KLQotCWlmICgoY2FsX3R5cGUgPT0gMSkgfHwgKGNhbF90eXBlID09IDIpKSB7Ci0KLQkJYmVzdF9yY2NhbFswXSA9IGJlc3RfcmNjYWxbMV07Ci0JCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkoUkFESU9fMjA1Nl9SWF9SWExQRl9SQ0NBTF9MUEMgfAotCQkJCSBSQURJT18yMDU2X1JYMCksIChiZXN0X3JjY2FsWzBdIHwgMHg4MCkpOwotCi0JCWZvciAocnhfY29yZSA9IDA7IHJ4X2NvcmUgPCBwaS0+cHVicGkucGh5X2NvcmVudW07IHJ4X2NvcmUrKykgewotCQkJcnhscGZfcmNjYWxfaHBjID0KLQkJCSAgICAoKChpbnQpYmVzdF9yY2NhbFtyeF9jb3JlXSAtIDEyKSA+PiAxKSArIDEwOwotCQkJdHhscGZfcmNjYWxfbHBjID0gKChpbnQpYmVzdF9yY2NhbFtyeF9jb3JlXSAtIDEyKSArIDEwOwotCi0JCQlpZiAoUEhZX0lQQShwaSkpIHsKLQkJCQl0eGxwZl9yY2NhbF9scGMgKz0gSVM0ME1IWihwaSkgPyAyNCA6IDEyOwotCQkJCXR4bHBmX2lkYWMgPSBJUzQwTUhaKHBpKSA/IDB4MGUgOiAweDEzOwotCQkJCVdSSVRFX1JBRElPX1JFRzIocGksIFJBRElPXzIwNTYsIFRYLCByeF9jb3JlLAotCQkJCQkJIFRYTFBGX0lEQUNfNCwgdHhscGZfaWRhYyk7Ci0JCQl9Ci0KLQkJCXJ4bHBmX3JjY2FsX2hwYyA9IG1heChtaW5fdCh1OCwgcnhscGZfcmNjYWxfaHBjLCAzMSksIDApOwotCQkJdHhscGZfcmNjYWxfbHBjID0gbWF4KG1pbl90KHU4LCB0eGxwZl9yY2NhbF9scGMsIDMxKSwgMCk7Ci0KLQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwgKFJBRElPXzIwNTZfUlhfUlhMUEZfUkNDQUxfSFBDIHwKLQkJCQkJICAgICAoKHJ4X2NvcmUgPT0KLQkJCQkJICAgICAgIFBIWV9DT1JFXzApID8gUkFESU9fMjA1Nl9SWDAgOgotCQkJCQkgICAgICBSQURJT18yMDU2X1JYMSkpLAotCQkJCQkocnhscGZfcmNjYWxfaHBjIHwgMHg4MCkpOwotCi0JCQl3cml0ZV9yYWRpb19yZWcocGksIChSQURJT18yMDU2X1RYX1RYTFBGX1JDQ0FMIHwKLQkJCQkJICAgICAoKHJ4X2NvcmUgPT0KLQkJCQkJICAgICAgIFBIWV9DT1JFXzApID8gUkFESU9fMjA1Nl9UWDAgOgotCQkJCQkgICAgICBSQURJT18yMDU2X1RYMSkpLAotCQkJCQkodHhscGZfcmNjYWxfbHBjIHwgMHg4MCkpOwotCQl9Ci0JfQotCi0Jd3JpdGVfcGh5X3JlZyhwaSwgMHgwMSwgb3JpZ19CQkNvbmZpZyk7Ci0KLQl3bGNfcGh5X3Jlc2V0Y2NhX25waHkocGkpOwotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlXzF0b21hbnlfbnBoeShwaSwKLQkJCQkJCSAgICAgTlBIWV9SRVY3X1JmY3RybE92ZXJyaWRlX2NtZF9yeGdhaW4sCi0JCQkJCQkgICAgIDAsIDB4MywgMSk7Ci0JfSBlbHNlIHsKLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeShwaSwgKDB4MSA8PCAxMiksIDAsIDB4MywgMSk7Ci0JfQotCXdsY19waHlfZm9yY2VfcmZzZXFfbnBoeShwaSwgTlBIWV9SRlNFUV9SRVNFVDJSWCk7Ci0KLQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX1JGU0VRLCAyLCAweDExMCwgMTYsCi0JCQkJIGdhaW5fc2F2ZSk7Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNCkpIHsKLQkJcGktPnBoeWhhbmdfYXZvaWQgPSBwaHloYW5nX2F2b2lkX3N0YXRlOwotCX0KLQotCXdsY19waHlfc3RheV9pbl9jYXJyaWVyc2VhcmNoX25waHkocGksIGZhbHNlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci13bGNfcGh5X2NhbF9yeGlxX25waHlfcmV2MihzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwKLQkJCSAgIHN0cnVjdCBucGh5X3R4Z2FpbnMgdGFyZ2V0X2dhaW4sIGJvb2wgZGVidWcpCi17Ci0Jc3RydWN0IHBoeV9pcV9lc3QgZXN0W1BIWV9DT1JFX01BWF07Ci0JdTggY29yZV9udW0sIHJ4X2NvcmUsIHR4X2NvcmU7Ci0JdTE2IGxuYV92YWxzW10gPSB7IDB4MywgMHgzLCAweDEgfTsKLQl1MTYgaHBmMV92YWxzW10gPSB7IDB4NywgMHgyLCAweDAgfTsKLQl1MTYgaHBmMl92YWxzW10gPSB7IDB4MiwgMHgwLCAweDAgfTsKLQlzMTYgY3Vycl9ocGYxLCBjdXJyX2hwZjIsIGN1cnJfaHBmLCBjdXJyX2xuYTsKLQlzMTYgZGVzaXJlZF9sb2cyX3B3ciwgYWN0dWFsX2xvZzJfcHdyLCBocGZfY2hhbmdlOwotCXUxNiBvcmlnX1Jmc2VxQ29yZUFjdHYsIG9yaWdfQWZlY3RybENvcmUsIG9yaWdfQWZlY3RybE92ZXJyaWRlOwotCXUxNiBvcmlnX1JmY3RybEludGNSeCwgb3JpZ19SZmN0cmxJbnRjVHg7Ci0JdTE2IG51bV9zYW1wczsKLQl1MzIgaV9wd3IsIHFfcHdyLCB0b3RfcHdyWzNdOwotCXU4IGdhaW5fcGFzcywgdXNlX2hwZl9udW07Ci0JdTE2IG1hc2ssIHZhbDEsIHZhbDI7Ci0JdTE2IGNvcmVfbm87Ci0JdTE2IGdhaW5fc2F2ZVsyXTsKLQl1MTYgY2FsX2dhaW5bMl07Ci0Jc3RydWN0IG5waHlfaXFjYWxfcGFyYW1zIGNhbF9wYXJhbXNbMl07Ci0JdTggcGh5X2J3OwotCWludCBiY21lcnJvciA9IDA7Ci0JYm9vbCBmaXJzdF9wbGF5dG9uZSA9IHRydWU7Ci0KLQl3bGNfcGh5X3N0YXlfaW5fY2FycmllcnNlYXJjaF9ucGh5KHBpLCB0cnVlKTsKLQotCWlmIChOUkVWX0xUKHBpLT5wdWJwaS5waHlfcmV2LCAyKSkgewotCi0JCXdsY19waHlfcmVhcHBseV90eGNhbF9jb2VmZnNfbnBoeShwaSk7Ci0JfQotCi0Jd2xjX3BoeV90YWJsZV9yZWFkX25waHkocGksIE5QSFlfVEJMX0lEX1JGU0VRLCAyLCAweDExMCwgMTYsIGdhaW5fc2F2ZSk7Ci0KLQlmb3IgKGNvcmVfbm8gPSAwOyBjb3JlX25vIDw9IDE7IGNvcmVfbm8rKykgewotCQl3bGNfcGh5X2lxY2FsX2dhaW5wYXJhbXNfbnBoeShwaSwgY29yZV9ubywgdGFyZ2V0X2dhaW4sCi0JCQkJCSAgICAgICZjYWxfcGFyYW1zW2NvcmVfbm9dKTsKLQkJY2FsX2dhaW5bY29yZV9ub10gPSBjYWxfcGFyYW1zW2NvcmVfbm9dLmNhbF9nYWluOwotCX0KLQotCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfUkZTRVEsIDIsIDB4MTEwLCAxNiwgY2FsX2dhaW4pOwotCi0JbnVtX3NhbXBzID0gMTAyNDsKLQlkZXNpcmVkX2xvZzJfcHdyID0gMTM7Ci0KLQlmb3IgKGNvcmVfbnVtID0gMDsgY29yZV9udW0gPCAyOyBjb3JlX251bSsrKSB7Ci0KLQkJcnhfY29yZSA9IGNvcmVfbnVtOwotCQl0eF9jb3JlID0gMSAtIGNvcmVfbnVtOwotCi0JCW9yaWdfUmZzZXFDb3JlQWN0diA9IHJlYWRfcGh5X3JlZyhwaSwgMHhhMik7Ci0JCW9yaWdfQWZlY3RybENvcmUgPSByZWFkX3BoeV9yZWcocGksIChyeF9jb3JlID09IFBIWV9DT1JFXzApID8KLQkJCQkJCTB4YTYgOiAweGE3KTsKLQkJb3JpZ19BZmVjdHJsT3ZlcnJpZGUgPSByZWFkX3BoeV9yZWcocGksIDB4YTUpOwotCQlvcmlnX1JmY3RybEludGNSeCA9IHJlYWRfcGh5X3JlZyhwaSwgKHJ4X2NvcmUgPT0gUEhZX0NPUkVfMCkgPwotCQkJCQkJIDB4OTEgOiAweDkyKTsKLQkJb3JpZ19SZmN0cmxJbnRjVHggPSByZWFkX3BoeV9yZWcocGksICh0eF9jb3JlID09IFBIWV9DT1JFXzApID8KLQkJCQkJCSAweDkxIDogMHg5Mik7Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4YTIsICgweGYgPDwgMTIpLCAoMSA8PCB0eF9jb3JlKSA8PCAxMik7Ci0JCW1vZF9waHlfcmVnKHBpLCAweGEyLCAoMHhmIDw8IDApLCAoMSA8PCB0eF9jb3JlKSA8PCAwKTsKLQotCQlvcl9waHlfcmVnKHBpLCAoKHJ4X2NvcmUgPT0gUEhZX0NPUkVfMCkgPyAweGE2IDogMHhhNyksCi0JCQkgICAoKDB4MSA8PCAxKSB8ICgweDEgPDwgMikpKTsKLQkJb3JfcGh5X3JlZyhwaSwgMHhhNSwgKCgweDEgPDwgMSkgfCAoMHgxIDw8IDIpKSk7Ci0KLQkJaWYgKCgocGktPm5waHlfcnhjYWxwYXJhbXMpICYgMHhmZjAwMDAwMCkpIHsKLQotCQkJd3JpdGVfcGh5X3JlZyhwaSwKLQkJCQkgICAgICAocnhfY29yZSA9PSBQSFlfQ09SRV8wKSA/IDB4OTEgOiAweDkyLAotCQkJCSAgICAgIChDSFNQRUNfSVM1RyhwaS0+cmFkaW9fY2hhbnNwZWMpID8gMHgxNDAgOgotCQkJCSAgICAgICAweDExMCkpOwotCQl9IGVsc2UgewotCi0JCQl3cml0ZV9waHlfcmVnKHBpLAotCQkJCSAgICAgIChyeF9jb3JlID09IFBIWV9DT1JFXzApID8gMHg5MSA6IDB4OTIsCi0JCQkJICAgICAgKENIU1BFQ19JUzVHKHBpLT5yYWRpb19jaGFuc3BlYykgPyAweDE4MCA6Ci0JCQkJICAgICAgIDB4MTIwKSk7Ci0JCX0KLQotCQl3cml0ZV9waHlfcmVnKHBpLCAodHhfY29yZSA9PSBQSFlfQ09SRV8wKSA/IDB4OTEgOiAweDkyLAotCQkJICAgICAgKENIU1BFQ19JUzVHKHBpLT5yYWRpb19jaGFuc3BlYykgPyAweDE0OCA6Ci0JCQkgICAgICAgMHgxMTQpKTsKLQotCQltYXNrID0gUkFESU9fMjA1NV9DT1VQTEVfUlhfTUFTSyB8IFJBRElPXzIwNTVfQ09VUExFX1RYX01BU0s7Ci0JCWlmIChyeF9jb3JlID09IFBIWV9DT1JFXzApIHsKLQkJCXZhbDEgPSBSQURJT18yMDU1X0NPVVBMRV9SWF9NQVNLOwotCQkJdmFsMiA9IFJBRElPXzIwNTVfQ09VUExFX1RYX01BU0s7Ci0JCX0gZWxzZSB7Ci0JCQl2YWwxID0gUkFESU9fMjA1NV9DT1VQTEVfVFhfTUFTSzsKLQkJCXZhbDIgPSBSQURJT18yMDU1X0NPVVBMRV9SWF9NQVNLOwotCQl9Ci0KLQkJaWYgKChwaS0+bnBoeV9yeGNhbHBhcmFtcyAmIDB4MTAwMDApKSB7Ci0JCQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUxX0dFTl9TUEFSRTIsIG1hc2ssCi0JCQkJICAgICAgdmFsMSk7Ci0JCQltb2RfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUyX0dFTl9TUEFSRTIsIG1hc2ssCi0JCQkJICAgICAgdmFsMik7Ci0JCX0KLQotCQlmb3IgKGdhaW5fcGFzcyA9IDA7IGdhaW5fcGFzcyA8IDQ7IGdhaW5fcGFzcysrKSB7Ci0KLQkJCWlmIChkZWJ1ZykKLQkJCQltZGVsYXkoV0FJVF9GT1JfU0NPUEUpOwotCi0JCQlpZiAoZ2Fpbl9wYXNzIDwgMykgewotCQkJCWN1cnJfbG5hID0gbG5hX3ZhbHNbZ2Fpbl9wYXNzXTsKLQkJCQljdXJyX2hwZjEgPSBocGYxX3ZhbHNbZ2Fpbl9wYXNzXTsKLQkJCQljdXJyX2hwZjIgPSBocGYyX3ZhbHNbZ2Fpbl9wYXNzXTsKLQkJCX0gZWxzZSB7Ci0KLQkJCQlpZiAodG90X3B3clsxXSA+IDEwMDAwKSB7Ci0JCQkJCWN1cnJfbG5hID0gbG5hX3ZhbHNbMl07Ci0JCQkJCWN1cnJfaHBmMSA9IGhwZjFfdmFsc1syXTsKLQkJCQkJY3Vycl9ocGYyID0gaHBmMl92YWxzWzJdOwotCQkJCQl1c2VfaHBmX251bSA9IDE7Ci0JCQkJCWN1cnJfaHBmID0gY3Vycl9ocGYxOwotCQkJCQlhY3R1YWxfbG9nMl9wd3IgPQotCQkJCQkgICAgd2xjX3BoeV9uYml0cyh0b3RfcHdyWzJdKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAodG90X3B3clswXSA+IDEwMDAwKSB7Ci0JCQkJCQljdXJyX2xuYSA9IGxuYV92YWxzWzFdOwotCQkJCQkJY3Vycl9ocGYxID0gaHBmMV92YWxzWzFdOwotCQkJCQkJY3Vycl9ocGYyID0gaHBmMl92YWxzWzFdOwotCQkJCQkJdXNlX2hwZl9udW0gPSAxOwotCQkJCQkJY3Vycl9ocGYgPSBjdXJyX2hwZjE7Ci0JCQkJCQlhY3R1YWxfbG9nMl9wd3IgPQotCQkJCQkJICAgIHdsY19waHlfbmJpdHModG90X3B3clsxXSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljdXJyX2xuYSA9IGxuYV92YWxzWzBdOwotCQkJCQkJY3Vycl9ocGYxID0gaHBmMV92YWxzWzBdOwotCQkJCQkJY3Vycl9ocGYyID0gaHBmMl92YWxzWzBdOwotCQkJCQkJdXNlX2hwZl9udW0gPSAyOwotCQkJCQkJY3Vycl9ocGYgPSBjdXJyX2hwZjI7Ci0JCQkJCQlhY3R1YWxfbG9nMl9wd3IgPQotCQkJCQkJICAgIHdsY19waHlfbmJpdHModG90X3B3clswXSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlocGZfY2hhbmdlID0gZGVzaXJlZF9sb2cyX3B3ciAtIGFjdHVhbF9sb2cyX3B3cjsKLQkJCQljdXJyX2hwZiArPSBocGZfY2hhbmdlOwotCQkJCWN1cnJfaHBmID0gbWF4KG1pbl90KHUxNiwgY3Vycl9ocGYsIDEwKSwgMCk7Ci0JCQkJaWYgKHVzZV9ocGZfbnVtID09IDEpIHsKLQkJCQkJY3Vycl9ocGYxID0gY3Vycl9ocGY7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY3Vycl9ocGYyID0gY3Vycl9ocGY7Ci0JCQkJfQotCQkJfQotCi0JCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5KHBpLCAoMHgxIDw8IDEwKSwKLQkJCQkJCSAgICAgKChjdXJyX2hwZjIgPDwgOCkgfAotCQkJCQkJICAgICAgKGN1cnJfaHBmMSA8PCA0KSB8Ci0JCQkJCQkgICAgICAoY3Vycl9sbmEgPDwgMikpLCAweDMsIDApOwotCQkJd2xjX3BoeV9mb3JjZV9yZnNlcV9ucGh5KHBpLCBOUEhZX1JGU0VRX1JFU0VUMlJYKTsKLQotCQkJd2xjX3BoeV9zdG9wcGxheWJhY2tfbnBoeShwaSk7Ci0KLQkJCWlmIChmaXJzdF9wbGF5dG9uZSkgewotCQkJCWJjbWVycm9yID0gd2xjX3BoeV90eF90b25lX25waHkocGksIDQwMDAsCi0JCQkJCQkJCSh1MTYpIChwaS0+Ci0JCQkJCQkJCQkgIG5waHlfcnhjYWxwYXJhbXMKLQkJCQkJCQkJCSAgJgotCQkJCQkJCQkJICAweGZmZmYpLAotCQkJCQkJCQkwLCAwLCB0cnVlKTsKLQkJCQlmaXJzdF9wbGF5dG9uZSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQlwaHlfYncgPQotCQkJCSAgICAoQ0hTUEVDX0lTNDAocGktPnJhZGlvX2NoYW5zcGVjKSkgPyA0MCA6IDIwOwotCQkJCXdsY19waHlfcnVuc2FtcGxlc19ucGh5KHBpLCBwaHlfYncgKiA4LCAweGZmZmYsCi0JCQkJCQkJMCwgMCwgMCwgdHJ1ZSk7Ci0JCQl9Ci0KLQkJCWlmIChiY21lcnJvciA9PSAwKSB7Ci0JCQkJaWYgKGdhaW5fcGFzcyA8IDMpIHsKLQotCQkJCQl3bGNfcGh5X3J4X2lxX2VzdF9ucGh5KHBpLCBlc3QsCi0JCQkJCQkJICAgICAgIG51bV9zYW1wcywgMzIsCi0JCQkJCQkJICAgICAgIDApOwotCQkJCQlpX3B3ciA9Ci0JCQkJCSAgICAoZXN0W3J4X2NvcmVdLmlfcHdyICsKLQkJCQkJICAgICBudW1fc2FtcHMgLyAyKSAvIG51bV9zYW1wczsKLQkJCQkJcV9wd3IgPQotCQkJCQkgICAgKGVzdFtyeF9jb3JlXS5xX3B3ciArCi0JCQkJCSAgICAgbnVtX3NhbXBzIC8gMikgLyBudW1fc2FtcHM7Ci0JCQkJCXRvdF9wd3JbZ2Fpbl9wYXNzXSA9IGlfcHdyICsgcV9wd3I7Ci0JCQkJfSBlbHNlIHsKLQotCQkJCQl3bGNfcGh5X2NhbGNfcnhfaXFfY29tcF9ucGh5KHBpLAotCQkJCQkJCQkgICAgICgxIDw8Ci0JCQkJCQkJCSAgICAgIHJ4X2NvcmUpKTsKLQkJCQl9Ci0KLQkJCQl3bGNfcGh5X3N0b3BwbGF5YmFja19ucGh5KHBpKTsKLQkJCX0KLQotCQkJaWYgKGJjbWVycm9yICE9IDApCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlhbmRfcmFkaW9fcmVnKHBpLCBSQURJT18yMDU1X0NPUkUxX0dFTl9TUEFSRTIsIH5tYXNrKTsKLQkJYW5kX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1NV9DT1JFMl9HRU5fU1BBUkUyLCB+bWFzayk7Ci0KLQkJd3JpdGVfcGh5X3JlZyhwaSwgKHR4X2NvcmUgPT0gUEhZX0NPUkVfMCkgPyAweDkxIDoKLQkJCSAgICAgIDB4OTIsIG9yaWdfUmZjdHJsSW50Y1R4KTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgKHJ4X2NvcmUgPT0gUEhZX0NPUkVfMCkgPyAweDkxIDoKLQkJCSAgICAgIDB4OTIsIG9yaWdfUmZjdHJsSW50Y1J4KTsKLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHhhNSwgb3JpZ19BZmVjdHJsT3ZlcnJpZGUpOwotCQl3cml0ZV9waHlfcmVnKHBpLCAocnhfY29yZSA9PSBQSFlfQ09SRV8wKSA/IDB4YTYgOgotCQkJICAgICAgMHhhNywgb3JpZ19BZmVjdHJsQ29yZSk7Ci0JCXdyaXRlX3BoeV9yZWcocGksIDB4YTIsIG9yaWdfUmZzZXFDb3JlQWN0dik7Ci0KLQkJaWYgKGJjbWVycm9yICE9IDApCi0JCQlicmVhazsKLQl9Ci0KLQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5KHBpLCAoMHgxIDw8IDEwKSwgMCwgMHgzLCAxKTsKLQl3bGNfcGh5X2ZvcmNlX3Jmc2VxX25waHkocGksIE5QSFlfUkZTRVFfUkVTRVQyUlgpOwotCi0Jd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCBOUEhZX1RCTF9JRF9SRlNFUSwgMiwgMHgxMTAsIDE2LAotCQkJCSBnYWluX3NhdmUpOwotCi0Jd2xjX3BoeV9zdGF5X2luX2NhcnJpZXJzZWFyY2hfbnBoeShwaSwgZmFsc2UpOwotCi0JcmV0dXJuIGJjbWVycm9yOwotfQotCi1pbnQKLXdsY19waHlfY2FsX3J4aXFfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgc3RydWN0IG5waHlfdHhnYWlucyB0YXJnZXRfZ2FpbiwKLQkJICAgICAgdTggY2FsX3R5cGUsIGJvb2wgZGVidWcpCi17Ci0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0KLQkJY2FsX3R5cGUgPSAwOwotCX0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJcmV0dXJuIHdsY19waHlfY2FsX3J4aXFfbnBoeV9yZXYzKHBpLCB0YXJnZXRfZ2FpbiwgY2FsX3R5cGUsCi0JCQkJCQkgIGRlYnVnKTsKLQl9IGVsc2UgewotCQlyZXR1cm4gd2xjX3BoeV9jYWxfcnhpcV9ucGh5X3JldjIocGksIHRhcmdldF9nYWluLCBkZWJ1Zyk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X2V4dHBhX3NldF90eF9kaWdpX2ZpbHRzX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JaW50IGosIHR5cGUgPSAyOwotCXUxNiBhZGRyX29mZnNldCA9IDB4MmM1OwotCi0JZm9yIChqID0gMDsgaiA8IE5QSFlfTlVNX0RJR19GSUxUX0NPRUZGUzsgaisrKSB7Ci0JCXdyaXRlX3BoeV9yZWcocGksIGFkZHJfb2Zmc2V0ICsgaiwKLQkJCSAgICAgIE5QSFlfSVBBX1JFVjRfdHhkaWdpX2ZpbHRjb2VmZnNbdHlwZV1bal0pOwotCX0KLX0KLQotc3RhdGljIHZvaWQgd2xjX3BoeV9pcGFfc2V0X3R4X2RpZ2lfZmlsdHNfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQlpbnQgaiwgdHlwZTsKLQl1MTYgYWRkcl9vZmZzZXRbXSA9IHsgMHgxODYsIDB4MTk1LAotCQkweDJjNQotCX07Ci0KLQlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgMzsgdHlwZSsrKSB7Ci0JCWZvciAoaiA9IDA7IGogPCBOUEhZX05VTV9ESUdfRklMVF9DT0VGRlM7IGorKykgewotCQkJd3JpdGVfcGh5X3JlZyhwaSwgYWRkcl9vZmZzZXRbdHlwZV0gKyBqLAotCQkJCSAgICAgIE5QSFlfSVBBX1JFVjRfdHhkaWdpX2ZpbHRjb2VmZnNbdHlwZV1bal0pOwotCQl9Ci0JfQotCi0JaWYgKElTNDBNSFoocGkpKSB7Ci0JCWZvciAoaiA9IDA7IGogPCBOUEhZX05VTV9ESUdfRklMVF9DT0VGRlM7IGorKykgewotCQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxODYgKyBqLAotCQkJCSAgICAgIE5QSFlfSVBBX1JFVjRfdHhkaWdpX2ZpbHRjb2VmZnNbM11bal0pOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKENIU1BFQ19JUzVHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCWZvciAoaiA9IDA7IGogPCBOUEhZX05VTV9ESUdfRklMVF9DT0VGRlM7IGorKykgewotCQkJCXdyaXRlX3BoeV9yZWcocGksIDB4MTg2ICsgaiwKLQkJCQkJICAgICAgTlBIWV9JUEFfUkVWNF90eGRpZ2lfZmlsdGNvZWZmc1s1XQotCQkJCQkgICAgICBbal0pOwotCQkJfQotCQl9Ci0KLQkJaWYgKENIU1BFQ19DSEFOTkVMKHBpLT5yYWRpb19jaGFuc3BlYykgPT0gMTQpIHsKLQkJCWZvciAoaiA9IDA7IGogPCBOUEhZX05VTV9ESUdfRklMVF9DT0VGRlM7IGorKykgewotCQkJCXdyaXRlX3BoeV9yZWcocGksIDB4MmM1ICsgaiwKLQkJCQkJICAgICAgTlBIWV9JUEFfUkVWNF90eGRpZ2lfZmlsdGNvZWZmc1s2XQotCQkJCQkgICAgICBbal0pOwotCQkJfQotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X2lwYV9yZXN0b3JlX3R4X2RpZ2lfZmlsdHNfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQlpbnQgajsKLQotCWlmIChJUzQwTUhaKHBpKSkgewotCQlmb3IgKGogPSAwOyBqIDwgTlBIWV9OVU1fRElHX0ZJTFRfQ09FRkZTOyBqKyspIHsKLQkJCXdyaXRlX3BoeV9yZWcocGksIDB4MTk1ICsgaiwKLQkJCQkgICAgICBOUEhZX0lQQV9SRVY0X3R4ZGlnaV9maWx0Y29lZmZzWzRdW2pdKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWZvciAoaiA9IDA7IGogPCBOUEhZX05VTV9ESUdfRklMVF9DT0VGRlM7IGorKykgewotCQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgxODYgKyBqLAotCQkJCSAgICAgIE5QSFlfSVBBX1JFVjRfdHhkaWdpX2ZpbHRjb2VmZnNbM11bal0pOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdTE2IHdsY19waHlfaXBhX2dldF9iYm11bHRfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQl1MTYgbTBtMTsKLQotCXdsY19waHlfdGFibGVfcmVhZF9ucGh5KHBpLCAxNSwgMSwgODcsIDE2LCAmbTBtMSk7Ci0KLQlyZXR1cm4gbTBtMTsKLX0KLQotc3RhdGljIHZvaWQgd2xjX3BoeV9pcGFfc2V0X2JibXVsdF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCBtMCwgdTggbTEpCi17Ci0JdTE2IG0wbTEgPSAodTE2KSAoKG0wIDw8IDgpIHwgbTEpOwotCi0Jd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCAxNSwgMSwgODcsIDE2LCAmbTBtMSk7Ci0Jd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCAxNSwgMSwgOTUsIDE2LCAmbTBtMSk7Ci19Ci0KLXN0YXRpYyB1MzIgKndsY19waHlfZ2V0X2lwYV9nYWludGJsX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JdTMyICp0eF9wd3JjdHJsX3RibCA9IE5VTEw7Ci0KLQlpZiAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCi0JCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCi0JCQlpZiAoKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA0KQotCQkJICAgIHx8IChwaS0+cHVicGkucmFkaW9yZXYgPT0gNikpIHsKLQotCQkJCXR4X3B3cmN0cmxfdGJsID0KLQkJCQkgICAgbnBoeV90cGNfdHhnYWluX2lwYV8yZ18yMDU3cmV2NG42OwotCQkJfSBlbHNlIGlmIChwaS0+cHVicGkucmFkaW9yZXYgPT0gMykgewotCi0JCQkJdHhfcHdyY3RybF90YmwgPQotCQkJCSAgICBucGh5X3RwY190eGdhaW5faXBhXzJnXzIwNTdyZXYzOwotCQkJfSBlbHNlIGlmIChwaS0+cHVicGkucmFkaW9yZXYgPT0gNSkgewotCi0JCQkJdHhfcHdyY3RybF90YmwgPQotCQkJCSAgICBucGh5X3RwY190eGdhaW5faXBhXzJnXzIwNTdyZXY1OwotCQkJfSBlbHNlIGlmICgocGktPnB1YnBpLnJhZGlvcmV2ID09IDcpCi0JCQkJICAgfHwgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA4KSkgewotCi0JCQkJdHhfcHdyY3RybF90YmwgPQotCQkJCSAgICBucGh5X3RwY190eGdhaW5faXBhXzJnXzIwNTdyZXY3OwotCQkJfQotCi0JCX0gZWxzZSBpZiAoTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgNikpIHsKLQotCQkJdHhfcHdyY3RybF90YmwgPSBucGh5X3RwY190eGdhaW5faXBhX3JldjY7Ci0JCX0gZWxzZSBpZiAoTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgNSkpIHsKLQotCQkJdHhfcHdyY3RybF90YmwgPSBucGh5X3RwY190eGdhaW5faXBhX3JldjU7Ci0JCX0gZWxzZSB7Ci0KLQkJCXR4X3B3cmN0cmxfdGJsID0gbnBoeV90cGNfdHhnYWluX2lwYTsKLQkJfQotCi0JfSBlbHNlIHsKLQotCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQkJCWlmICgocGktPnB1YnBpLnJhZGlvcmV2ID09IDMpIHx8Ci0JCQkgICAgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA0KSB8fAotCQkJICAgIChwaS0+cHVicGkucmFkaW9yZXYgPT0gNikpIHsKLQotCQkJCXR4X3B3cmN0cmxfdGJsID0gbnBoeV90cGNfdHhnYWluX2lwYV81Z18yMDU3OwotCQkJfSBlbHNlIGlmICgocGktPnB1YnBpLnJhZGlvcmV2ID09IDcpCi0JCQkJICAgfHwgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA4KSkgewotCi0JCQkJdHhfcHdyY3RybF90YmwgPQotCQkJCSAgICBucGh5X3RwY190eGdhaW5faXBhXzVnXzIwNTdyZXY3OwotCQkJfQotCi0JCX0gZWxzZSB7Ci0JCQl0eF9wd3JjdHJsX3RibCA9IG5waHlfdHBjX3R4Z2Fpbl9pcGFfNWc7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gdHhfcHdyY3RybF90Ymw7Ci19Ci0KLXN0YXRpYyB2b2lkCi13bGNfcGh5X3BhcGRfY2FsX3NldHVwX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksCi0JCQkgICAgc3RydWN0IG5waHlfcGFwZF9yZXN0b3JlX3N0YXRlICpzdGF0ZSwgdTggY29yZSkKLXsKLQlzMzIgdG9uZV9mcmVxOwotCXU4IG9mZl9jb3JlOwotCXUxNiBtaXhnYWluID0gMDsKLQotCW9mZl9jb3JlID0gY29yZSBeIDB4MTsKLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQotCQlpZiAoTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgNykKLQkJICAgIHx8IE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDgpKSB7Ci0JCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksICgweDEgPDwgNyksCi0JCQkJCQkJICB3bGNfcGh5X3JlYWRfbHBmX2J3X2N0bF9ucGh5Ci0JCQkJCQkJICAocGksIDApLCAwLCAwLAotCQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMSk7Ci0JCX0KLQotCQlpZiAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJaWYgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA1KSB7Ci0JCQkJbWl4Z2FpbiA9IChjb3JlID09IDApID8gMHgyMCA6IDB4MDA7Ci0KLQkJCX0gZWxzZSBpZiAoKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA3KQotCQkJCSAgIHx8IChwaS0+cHVicGkucmFkaW9yZXYgPT0gOCkpIHsKLQotCQkJCW1peGdhaW4gPSAweDAwOwotCi0JCQl9IGVsc2UgaWYgKChwaS0+cHVicGkucmFkaW9yZXYgPD0gNCkKLQkJCQkgICB8fCAocGktPnB1YnBpLnJhZGlvcmV2ID09IDYpKSB7Ci0KLQkJCQltaXhnYWluID0gMHgwMDsKLQkJCX0KLQotCQl9IGVsc2UgewotCQkJaWYgKChwaS0+cHVicGkucmFkaW9yZXYgPT0gNCkgfHwKLQkJCSAgICAocGktPnB1YnBpLnJhZGlvcmV2ID09IDYpKSB7Ci0KLQkJCQltaXhnYWluID0gMHg1MDsKLQkJCX0gZWxzZSBpZiAoKHBpLT5wdWJwaS5yYWRpb3JldiA9PSAzKQotCQkJCSAgIHx8IChwaS0+cHVicGkucmFkaW9yZXYgPT0gNykKLQkJCQkgICB8fCAocGktPnB1YnBpLnJhZGlvcmV2ID09IDgpKSB7Ci0KLQkJCQltaXhnYWluID0gMHgwOwotCQkJfQotCQl9Ci0KLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDExKSwKLQkJCQkJCSAgbWl4Z2FpbiwgKDEgPDwgY29yZSksIDAsCi0JCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDApOwotCi0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlXzF0b21hbnlfbnBoeShwaSwKLQkJCQkJCSAgICAgTlBIWV9SRVY3X1JmY3RybE92ZXJyaWRlX2NtZF90eF9wdSwKLQkJCQkJCSAgICAgMSwgKDEgPDwgY29yZSksIDApOwotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV8xdG9tYW55X25waHkocGksCi0JCQkJCQkgICAgIE5QSFlfUkVWN19SZmN0cmxPdmVycmlkZV9jbWRfdHhfcHUsCi0JCQkJCQkgICAgIDAsICgxIDw8IG9mZl9jb3JlKSwgMCk7Ci0KLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDMpLAotCQkJCQkJICAwLCAweDMsIDAsCi0JCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDApOwotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksICgweDEgPDwgMiksIDEsCi0JCQkJCQkgICgxIDw8IGNvcmUpLCAwLAotCQkJCQkJICBOUEhZX1JFVjdfUkZDVFJMT1ZFUlJJREVfSUQxKTsKLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDApLCAwLAotCQkJCQkJICAoMSA8PCBjb3JlKSwgMCwKLQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMSk7Ci0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCAxKSwgMSwKLQkJCQkJCSAgKDEgPDwgY29yZSksIDAsCi0JCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDIpOwotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksICgweDEgPDwgOCksIDAsCi0JCQkJCQkgICgxIDw8IGNvcmUpLCAwLAotCQkJCQkJICBOUEhZX1JFVjdfUkZDVFJMT1ZFUlJJREVfSUQxKTsKLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDkpLCAxLAotCQkJCQkJICAoMSA8PCBjb3JlKSwgMCwKLQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMSk7Ci0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCAxMCksIDAsCi0JCQkJCQkgICgxIDw8IGNvcmUpLCAwLAotCQkJCQkJICBOUEhZX1JFVjdfUkZDVFJMT1ZFUlJJREVfSUQxKTsKLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDMpLCAxLAotCQkJCQkJICAoMSA8PCBjb3JlKSwgMCwKLQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMSk7Ci0KLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDUpLAotCQkJCQkJICAwLCAoMSA8PCBjb3JlKSwgMCwKLQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMSk7Ci0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCA0KSwgMCwKLQkJCQkJCSAgKDEgPDwgY29yZSksIDAsCi0JCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDEpOwotCi0JCXN0YXRlLT5hZmVjdHJsW2NvcmVdID0gcmVhZF9waHlfcmVnKHBpLCAoY29yZSA9PSBQSFlfQ09SRV8wKSA/Ci0JCQkJCQkgICAgMHhhNiA6IDB4YTcpOwotCQlzdGF0ZS0+YWZlb3ZlcnJpZGVbY29yZV0gPQotCQkgICAgcmVhZF9waHlfcmVnKHBpLCAoY29yZSA9PSBQSFlfQ09SRV8wKSA/IDB4OGYgOiAweGE1KTsKLQkJc3RhdGUtPmFmZWN0cmxbb2ZmX2NvcmVdID0KLQkJICAgIHJlYWRfcGh5X3JlZyhwaSwgKGNvcmUgPT0gUEhZX0NPUkVfMCkgPyAweGE3IDogMHhhNik7Ci0JCXN0YXRlLT5hZmVvdmVycmlkZVtvZmZfY29yZV0gPQotCQkgICAgcmVhZF9waHlfcmVnKHBpLCAoY29yZSA9PSBQSFlfQ09SRV8wKSA/IDB4YTUgOiAweDhmKTsKLQotCQltb2RfcGh5X3JlZyhwaSwgKChjb3JlID09IFBIWV9DT1JFXzApID8gMHhhNiA6IDB4YTcpLAotCQkJICAgICgweDEgPDwgMiksIDApOwotCQltb2RfcGh5X3JlZyhwaSwgKChjb3JlID09IFBIWV9DT1JFXzApID8gMHg4ZiA6Ci0JCQkJIDB4YTUpLCAoMHgxIDw8IDIpLCAoMHgxIDw8IDIpKTsKLQotCQltb2RfcGh5X3JlZyhwaSwgKChjb3JlID09IFBIWV9DT1JFXzApID8gMHhhNyA6IDB4YTYpLAotCQkJICAgICgweDEgPDwgMiksICgweDEgPDwgMikpOwotCQltb2RfcGh5X3JlZyhwaSwgKChjb3JlID09IFBIWV9DT1JFXzApID8gMHhhNSA6Ci0JCQkJIDB4OGYpLCAoMHgxIDw8IDIpLCAoMHgxIDw8IDIpKTsKLQotCQlpZiAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJc3RhdGUtPnB3cnVwW2NvcmVdID0KLQkJCSAgICBSRUFEX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLCBjb3JlLAotCQkJCQkgICAgVFhSWENPVVBMRV8yR19QV1JVUCk7Ci0JCQlzdGF0ZS0+YXR0ZW5bY29yZV0gPQotCQkJICAgIFJFQURfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIGNvcmUsCi0JCQkJCSAgICBUWFJYQ09VUExFXzJHX0FUVEVOKTsKLQkJCXN0YXRlLT5wd3J1cFtvZmZfY29yZV0gPQotCQkJICAgIFJFQURfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIG9mZl9jb3JlLAotCQkJCQkgICAgVFhSWENPVVBMRV8yR19QV1JVUCk7Ci0JCQlzdGF0ZS0+YXR0ZW5bb2ZmX2NvcmVdID0KLQkJCSAgICBSRUFEX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLCBvZmZfY29yZSwKLQkJCQkJICAgIFRYUlhDT1VQTEVfMkdfQVRURU4pOwotCi0JCQlXUklURV9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwgY29yZSwKLQkJCQkJIFRYUlhDT1VQTEVfMkdfUFdSVVAsIDB4Yyk7Ci0KLQkJCWlmICgocGktPnB1YnBpLnJhZGlvcmV2ID09IDMpIHx8Ci0JCQkgICAgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA0KSB8fAotCQkJICAgIChwaS0+cHVicGkucmFkaW9yZXYgPT0gNikpIHsKLQotCQkJCVdSSVRFX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLCBjb3JlLAotCQkJCQkJIFRYUlhDT1VQTEVfMkdfQVRURU4sIDB4ZjApOwotCi0JCQl9IGVsc2UgaWYgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA1KSB7Ci0KLQkJCQlXUklURV9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwgY29yZSwKLQkJCQkJCSBUWFJYQ09VUExFXzJHX0FUVEVOLAotCQkJCQkJIChjb3JlID09IDApID8gMHhmNyA6IDB4ZjIpOwotCi0JCQl9IGVsc2UgaWYgKChwaS0+cHVicGkucmFkaW9yZXYgPT0gNykKLQkJCQkgICB8fCAocGktPnB1YnBpLnJhZGlvcmV2ID09IDgpKSB7Ci0KLQkJCQlXUklURV9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwgY29yZSwKLQkJCQkJCSBUWFJYQ09VUExFXzJHX0FUVEVOLCAweGYwKTsKLQotCQkJfQotCi0JCQlXUklURV9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwgb2ZmX2NvcmUsCi0JCQkJCSBUWFJYQ09VUExFXzJHX1BXUlVQLCAweDApOwotCQkJV1JJVEVfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIG9mZl9jb3JlLAotCQkJCQkgVFhSWENPVVBMRV8yR19BVFRFTiwgMHhmZik7Ci0KLQkJfSBlbHNlIHsKLQkJCXN0YXRlLT5wd3J1cFtjb3JlXSA9Ci0JCQkgICAgUkVBRF9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwgY29yZSwKLQkJCQkJICAgIFRYUlhDT1VQTEVfNUdfUFdSVVApOwotCQkJc3RhdGUtPmF0dGVuW2NvcmVdID0KLQkJCSAgICBSRUFEX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLCBjb3JlLAotCQkJCQkgICAgVFhSWENPVVBMRV81R19BVFRFTik7Ci0JCQlzdGF0ZS0+cHdydXBbb2ZmX2NvcmVdID0KLQkJCSAgICBSRUFEX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLCBvZmZfY29yZSwKLQkJCQkJICAgIFRYUlhDT1VQTEVfNUdfUFdSVVApOwotCQkJc3RhdGUtPmF0dGVuW29mZl9jb3JlXSA9Ci0JCQkgICAgUkVBRF9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwgb2ZmX2NvcmUsCi0JCQkJCSAgICBUWFJYQ09VUExFXzVHX0FUVEVOKTsKLQotCQkJV1JJVEVfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIGNvcmUsCi0JCQkJCSBUWFJYQ09VUExFXzVHX1BXUlVQLCAweGMpOwotCi0JCQlpZiAoKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA3KQotCQkJICAgIHx8IChwaS0+cHVicGkucmFkaW9yZXYgPT0gOCkpIHsKLQotCQkJCVdSSVRFX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLCBjb3JlLAotCQkJCQkJIFRYUlhDT1VQTEVfNUdfQVRURU4sIDB4ZjQpOwotCi0JCQl9IGVsc2UgewotCQkJCVdSSVRFX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLCBjb3JlLAotCQkJCQkJIFRYUlhDT1VQTEVfNUdfQVRURU4sIDB4ZjApOwotCQkJfQotCi0JCQlXUklURV9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwgb2ZmX2NvcmUsCi0JCQkJCSBUWFJYQ09VUExFXzVHX1BXUlVQLCAweDApOwotCQkJV1JJVEVfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIG9mZl9jb3JlLAotCQkJCQkgVFhSWENPVVBMRV81R19BVFRFTiwgMHhmZik7Ci0JCX0KLQotCQl0b25lX2ZyZXEgPSA0MDAwOwotCi0JCXdsY19waHlfdHhfdG9uZV9ucGh5KHBpLCB0b25lX2ZyZXEsIDE4MSwgMCwgMCwgZmFsc2UpOwotCi0JCW1vZF9waHlfcmVnKHBpLCAoY29yZSA9PSBQSFlfQ09SRV8wKSA/IDB4Mjk3IDoKLQkJCSAgICAweDI5YiwgKDB4MSA8PCAwKSwgKE5QSFlfUEFQRF9DT01QX09OKSA8PCAwKTsKLQotCQltb2RfcGh5X3JlZyhwaSwgKGNvcmUgPT0gUEhZX0NPUkVfMCkgPyAweDJhMyA6Ci0JCQkgICAgMHgyYTQsICgweDEgPDwgMTMpLCAoMSkgPDwgMTMpOwotCi0JCW1vZF9waHlfcmVnKHBpLCAob2ZmX2NvcmUgPT0gUEhZX0NPUkVfMCkgPyAweDI5NyA6Ci0JCQkgICAgMHgyOWIsICgweDEgPDwgMCksIChOUEhZX1BBUERfQ09NUF9PRkYpIDw8IDApOwotCi0JCW1vZF9waHlfcmVnKHBpLCAob2ZmX2NvcmUgPT0gUEhZX0NPUkVfMCkgPyAweDJhMyA6Ci0JCQkgICAgMHgyYTQsICgweDEgPDwgMTMpLCAoMCkgPDwgMTMpOwotCi0JfSBlbHNlIHsKLQotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5KHBpLCAoMHgxIDw8IDEyKSwgMCwgMHgzLCAwKTsKLQotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5KHBpLCAoMHgxIDw8IDMpLCAxLCAwLCAwKTsKLQotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5KHBpLCAoMHgxIDw8IDApLCAwLCAweDMsIDApOwotCi0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHkocGksICgweDEgPDwgMiksIDEsIDB4MywgMCk7Ci0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHkocGksICgweDEgPDwgMSksIDEsIDB4MywgMCk7Ci0KLQkJc3RhdGUtPmFmZWN0cmxbY29yZV0gPSByZWFkX3BoeV9yZWcocGksIChjb3JlID09IFBIWV9DT1JFXzApID8KLQkJCQkJCSAgICAweGE2IDogMHhhNyk7Ci0JCXN0YXRlLT5hZmVvdmVycmlkZVtjb3JlXSA9Ci0JCSAgICByZWFkX3BoeV9yZWcocGksIChjb3JlID09IFBIWV9DT1JFXzApID8gMHg4ZiA6IDB4YTUpOwotCi0JCW1vZF9waHlfcmVnKHBpLCAoKGNvcmUgPT0gUEhZX0NPUkVfMCkgPyAweGE2IDogMHhhNyksCi0JCQkgICAgKDB4MSA8PCAwKSB8ICgweDEgPDwgMSkgfCAoMHgxIDw8IDIpLCAwKTsKLQkJbW9kX3BoeV9yZWcocGksICgoY29yZSA9PSBQSFlfQ09SRV8wKSA/IDB4OGYgOgotCQkJCSAweGE1KSwKLQkJCSAgICAoMHgxIDw8IDApIHwKLQkJCSAgICAoMHgxIDw8IDEpIHwKLQkJCSAgICAoMHgxIDw8IDIpLCAoMHgxIDw8IDApIHwgKDB4MSA8PCAxKSB8ICgweDEgPDwgMikpOwotCi0JCXN0YXRlLT52Z2FfbWFzdGVyW2NvcmVdID0KLQkJICAgIFJFQURfUkFESU9fUkVHMihwaSwgUkFESU9fMjA1NiwgUlgsIGNvcmUsIFZHQV9NQVNURVIpOwotCQlXUklURV9SQURJT19SRUcyKHBpLCBSQURJT18yMDU2LCBSWCwgY29yZSwgVkdBX01BU1RFUiwgMHgyYik7Ci0JCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQlzdGF0ZS0+ZmJtaXhbY29yZV0gPQotCQkJICAgIFJFQURfUkFESU9fUkVHMihwaSwgUkFESU9fMjA1NiwgUlgsIGNvcmUsCi0JCQkJCSAgICBUWEZCTUlYX0cpOwotCQkJc3RhdGUtPmludHBhX21hc3Rlcltjb3JlXSA9Ci0JCQkgICAgUkVBRF9SQURJT19SRUcyKHBpLCBSQURJT18yMDU2LCBUWCwgY29yZSwKLQkJCQkJICAgIElOVFBBR19NQVNURVIpOwotCi0JCQlXUklURV9SQURJT19SRUcyKHBpLCBSQURJT18yMDU2LCBSWCwgY29yZSwgVFhGQk1JWF9HLAotCQkJCQkgMHgwMyk7Ci0JCQlXUklURV9SQURJT19SRUcyKHBpLCBSQURJT18yMDU2LCBUWCwgY29yZSwKLQkJCQkJIElOVFBBR19NQVNURVIsIDB4MDQpOwotCQl9IGVsc2UgewotCQkJc3RhdGUtPmZibWl4W2NvcmVdID0KLQkJCSAgICBSRUFEX1JBRElPX1JFRzIocGksIFJBRElPXzIwNTYsIFJYLCBjb3JlLAotCQkJCQkgICAgVFhGQk1JWF9BKTsKLQkJCXN0YXRlLT5pbnRwYV9tYXN0ZXJbY29yZV0gPQotCQkJICAgIFJFQURfUkFESU9fUkVHMihwaSwgUkFESU9fMjA1NiwgVFgsIGNvcmUsCi0JCQkJCSAgICBJTlRQQUFfTUFTVEVSKTsKLQotCQkJV1JJVEVfUkFESU9fUkVHMihwaSwgUkFESU9fMjA1NiwgUlgsIGNvcmUsIFRYRkJNSVhfQSwKLQkJCQkJIDB4MDMpOwotCQkJV1JJVEVfUkFESU9fUkVHMihwaSwgUkFESU9fMjA1NiwgVFgsIGNvcmUsCi0JCQkJCSBJTlRQQUFfTUFTVEVSLCAweDA0KTsKLQotCQl9Ci0KLQkJdG9uZV9mcmVxID0gNDAwMDsKLQotCQl3bGNfcGh5X3R4X3RvbmVfbnBoeShwaSwgdG9uZV9mcmVxLCAxODEsIDAsIDAsIGZhbHNlKTsKLQotCQltb2RfcGh5X3JlZyhwaSwgKGNvcmUgPT0gUEhZX0NPUkVfMCkgPyAweDI5NyA6Ci0JCQkgICAgMHgyOWIsICgweDEgPDwgMCksICgxKSA8PCAwKTsKLQotCQltb2RfcGh5X3JlZyhwaSwgKG9mZl9jb3JlID09IFBIWV9DT1JFXzApID8gMHgyOTcgOgotCQkJICAgIDB4MjliLCAoMHgxIDw8IDApLCAoMCkgPDwgMCk7Ci0KLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeShwaSwgKDB4MSA8PCAzKSwgMCwgMHgzLCAwKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi13bGNfcGh5X3BhcGRfY2FsX2NsZWFudXBfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwKLQkJCSAgICAgIHN0cnVjdCBucGh5X3BhcGRfcmVzdG9yZV9zdGF0ZSAqc3RhdGUpCi17Ci0JdTggY29yZTsKLQotCXdsY19waHlfc3RvcHBsYXliYWNrX25waHkocGkpOwotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0KLQkJZm9yIChjb3JlID0gMDsgY29yZSA8IHBpLT5wdWJwaS5waHlfY29yZW51bTsgY29yZSsrKSB7Ci0KLQkJCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQkJV1JJVEVfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIGNvcmUsCi0JCQkJCQkgVFhSWENPVVBMRV8yR19QV1JVUCwgMCk7Ci0JCQkJV1JJVEVfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIGNvcmUsCi0JCQkJCQkgVFhSWENPVVBMRV8yR19BVFRFTiwKLQkJCQkJCSBzdGF0ZS0+YXR0ZW5bY29yZV0pOwotCQkJfSBlbHNlIHsKLQkJCQlXUklURV9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwgY29yZSwKLQkJCQkJCSBUWFJYQ09VUExFXzVHX1BXUlVQLCAwKTsKLQkJCQlXUklURV9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwgY29yZSwKLQkJCQkJCSBUWFJYQ09VUExFXzVHX0FUVEVOLAotCQkJCQkJIHN0YXRlLT5hdHRlbltjb3JlXSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA0KSB8fCAocGktPnB1YnBpLnJhZGlvcmV2ID09IDYpKSB7Ci0JCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksICgweDEgPDwgMiksCi0JCQkJCQkJICAxLCAweDMsIDAsCi0JCQkJCQkJICBOUEhZX1JFVjdfUkZDVFJMT1ZFUlJJREVfSUQwKTsKLQkJfSBlbHNlIHsKLQkJCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCAyKSwKLQkJCQkJCQkgIDAsIDB4MywgMSwKLQkJCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDApOwotCQl9Ci0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCAxKSwKLQkJCQkJCSAgMCwgMHgzLCAxLAotCQkJCQkJICBOUEhZX1JFVjdfUkZDVFJMT1ZFUlJJREVfSUQxKTsKLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDApLCAwLCAweDMsIDEsCi0JCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDIpOwotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksICgweDEgPDwgMiksIDAsIDB4MywgMSwKLQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMik7Ci0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCAxMSksIDEsIDB4MywgMSwKLQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMSk7Ci0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCAzKSwgMCwgMHgzLCAxLAotCQkJCQkJICBOUEhZX1JFVjdfUkZDVFJMT1ZFUlJJREVfSUQwKTsKLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDExKSwgMCwgMHgzLCAxLAotCQkJCQkJICBOUEhZX1JFVjdfUkZDVFJMT1ZFUlJJREVfSUQwKTsKLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDEyKSwgMCwgMHgzLCAxLAotCQkJCQkJICBOUEhZX1JFVjdfUkZDVFJMT1ZFUlJJREVfSUQwKTsKLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDIpLCAxLCAweDMsIDEsCi0JCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDEpOwotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksICgweDEgPDwgMCksIDAsIDB4MywgMSwKLQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMSk7Ci0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCAxKSwgMSwgMHgzLCAxLAotCQkJCQkJICBOUEhZX1JFVjdfUkZDVFJMT1ZFUlJJREVfSUQyKTsKLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDgpLCAwLCAweDMsIDEsCi0JCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDEpOwotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksICgweDEgPDwgOSksIDEsIDB4MywgMSwKLQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMSk7Ci0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCAxMCksIDAsIDB4MywgMSwKLQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMSk7Ci0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCAzKSwgMSwgMHgzLCAxLAotCQkJCQkJICBOUEhZX1JFVjdfUkZDVFJMT1ZFUlJJREVfSUQxKTsKLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDUpLCAwLCAweDMsIDEsCi0JCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDEpOwotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksICgweDEgPDwgNCksIDAsIDB4MywgMSwKLQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMSk7Ci0KLQkJZm9yIChjb3JlID0gMDsgY29yZSA8IHBpLT5wdWJwaS5waHlfY29yZW51bTsgY29yZSsrKSB7Ci0KLQkJCXdyaXRlX3BoeV9yZWcocGksIChjb3JlID09IFBIWV9DT1JFXzApID8KLQkJCQkgICAgICAweGE2IDogMHhhNywgc3RhdGUtPmFmZWN0cmxbY29yZV0pOwotCQkJd3JpdGVfcGh5X3JlZyhwaSwgKGNvcmUgPT0gUEhZX0NPUkVfMCkgPyAweDhmIDoKLQkJCQkgICAgICAweGE1LCBzdGF0ZS0+YWZlb3ZlcnJpZGVbY29yZV0pOwotCQl9Ci0KLQkJd2xjX3BoeV9pcGFfc2V0X2JibXVsdF9ucGh5KHBpLCAoc3RhdGUtPm1tID4+IDgpICYgMHhmZiwKLQkJCQkJICAgIChzdGF0ZS0+bW0gJiAweGZmKSk7Ci0KLQkJaWYgKE5SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDcpCi0JCSAgICB8fCBOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA4KSkgewotCQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDcpLCAwLCAwLAotCQkJCQkJCSAgMSwKLQkJCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDEpOwotCQl9Ci0JfSBlbHNlIHsKLQotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5KHBpLCAoMHgxIDw8IDEyKSwgMCwgMHgzLCAxKTsKLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeShwaSwgKDB4MSA8PCAxMyksIDAsIDB4MywgMSk7Ci0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHkocGksICgweDEgPDwgMCksIDAsIDB4MywgMSk7Ci0KLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeShwaSwgKDB4MSA8PCAyKSwgMCwgMHgzLCAxKTsKLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeShwaSwgKDB4MSA8PCAxKSwgMCwgMHgzLCAxKTsKLQotCQlmb3IgKGNvcmUgPSAwOyBjb3JlIDwgcGktPnB1YnBpLnBoeV9jb3JlbnVtOyBjb3JlKyspIHsKLQotCQkJV1JJVEVfUkFESU9fUkVHMihwaSwgUkFESU9fMjA1NiwgUlgsIGNvcmUsIFZHQV9NQVNURVIsCi0JCQkJCSBzdGF0ZS0+dmdhX21hc3Rlcltjb3JlXSk7Ci0JCQlpZiAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJCVdSSVRFX1JBRElPX1JFRzIocGksIFJBRElPXzIwNTYsIFJYLCBjb3JlLAotCQkJCQkJIFRYRkJNSVhfRywgc3RhdGUtPmZibWl4W2NvcmVdKTsKLQkJCQlXUklURV9SQURJT19SRUcyKHBpLCBSQURJT18yMDU2LCBUWCwgY29yZSwKLQkJCQkJCSBJTlRQQUdfTUFTVEVSLAotCQkJCQkJIHN0YXRlLT5pbnRwYV9tYXN0ZXJbY29yZV0pOwotCQkJfSBlbHNlIHsKLQkJCQlXUklURV9SQURJT19SRUcyKHBpLCBSQURJT18yMDU2LCBSWCwgY29yZSwKLQkJCQkJCSBUWEZCTUlYX0EsIHN0YXRlLT5mYm1peFtjb3JlXSk7Ci0JCQkJV1JJVEVfUkFESU9fUkVHMihwaSwgUkFESU9fMjA1NiwgVFgsIGNvcmUsCi0JCQkJCQkgSU5UUEFBX01BU1RFUiwKLQkJCQkJCSBzdGF0ZS0+aW50cGFfbWFzdGVyW2NvcmVdKTsKLQkJCX0KLQotCQkJd3JpdGVfcGh5X3JlZyhwaSwgKGNvcmUgPT0gUEhZX0NPUkVfMCkgPwotCQkJCSAgICAgIDB4YTYgOiAweGE3LCBzdGF0ZS0+YWZlY3RybFtjb3JlXSk7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAoY29yZSA9PSBQSFlfQ09SRV8wKSA/IDB4OGYgOgotCQkJCSAgICAgIDB4YTUsIHN0YXRlLT5hZmVvdmVycmlkZVtjb3JlXSk7Ci0JCX0KLQotCQl3bGNfcGh5X2lwYV9zZXRfYmJtdWx0X25waHkocGksIChzdGF0ZS0+bW0gPj4gOCkgJiAweGZmLAotCQkJCQkgICAgKHN0YXRlLT5tbSAmIDB4ZmYpKTsKLQotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5KHBpLCAoMHgxIDw8IDMpLCAwLCAweDMsIDEpOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLXdsY19waHlfYTFfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTggY29yZSwgdTMyIHdpbnN6LCB1MzIgc3RhcnQsCi0JCXUzMiBlbmQpCi17Ci0JdTMyICpidWYsICpzcmMsICpkc3QsIHN6OwotCi0Jc3ogPSBlbmQgLSBzdGFydCArIDE7Ci0KLQlidWYgPSBrbWFsbG9jKDIgKiBzaXplb2YodTMyKSAqIE5QSFlfUEFQRF9FUFNfVEJMX1NJWkUsIEdGUF9BVE9NSUMpOwotCWlmIChOVUxMID09IGJ1ZikgewotCQlyZXR1cm47Ci0JfQotCi0Jc3JjID0gYnVmOwotCWRzdCA9IGJ1ZiArIE5QSFlfUEFQRF9FUFNfVEJMX1NJWkU7Ci0KLQl3bGNfcGh5X3RhYmxlX3JlYWRfbnBoeShwaSwKLQkJCQkoY29yZSA9PQotCQkJCSBQSFlfQ09SRV8wID8gTlBIWV9UQkxfSURfRVBTSUxPTlRCTDAgOgotCQkJCSBOUEhZX1RCTF9JRF9FUFNJTE9OVEJMMSksCi0JCQkJTlBIWV9QQVBEX0VQU19UQkxfU0laRSwgMCwgMzIsIHNyYyk7Ci0KLQlkbyB7Ci0JCXUzMiBwaHlfYTEsIHBoeV9hMjsKLQkJczMyIHBoeV9hMywgcGh5X2E0LCBwaHlfYTUsIHBoeV9hNiwgcGh5X2E3OwotCi0JCXBoeV9hMSA9IGVuZCAtIG1pbihlbmQsICh3aW5zeiA+PiAxKSk7Ci0JCXBoeV9hMiA9IG1pbl90KHUzMiwgTlBIWV9QQVBEX0VQU19UQkxfU0laRSAtIDEsIGVuZCArICh3aW5zeiA+PiAxKSk7Ci0JCXBoeV9hMyA9IHBoeV9hMiAtIHBoeV9hMSArIDE7Ci0JCXBoeV9hNiA9IDA7Ci0JCXBoeV9hNyA9IDA7Ci0KLQkJZG8gewotCQkJd2xjX3BoeV9wYXBkX2RlY29kZV9lcHNpbG9uKHNyY1twaHlfYTJdLCAmcGh5X2E0LAotCQkJCQkJICAgICZwaHlfYTUpOwotCQkJcGh5X2E2ICs9IHBoeV9hNDsKLQkJCXBoeV9hNyArPSBwaHlfYTU7Ci0JCX0gd2hpbGUgKHBoeV9hMi0tICE9IHBoeV9hMSk7Ci0KLQkJcGh5X2E2IC89IHBoeV9hMzsKLQkJcGh5X2E3IC89IHBoeV9hMzsKLQkJZHN0W2VuZF0gPSAoKHUzMikgcGh5X2E3IDw8IDEzKSB8ICgodTMyKSBwaHlfYTYgJiAweDFmZmYpOwotCX0gd2hpbGUgKGVuZC0tICE9IHN0YXJ0KTsKLQotCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwKLQkJCQkgKGNvcmUgPT0KLQkJCQkgIFBIWV9DT1JFXzApID8gTlBIWV9UQkxfSURfRVBTSUxPTlRCTDAgOgotCQkJCSBOUEhZX1RCTF9JRF9FUFNJTE9OVEJMMSwgc3osIHN0YXJ0LCAzMiwgZHN0KTsKLQotCWtmcmVlKGJ1Zik7Ci19Ci0KLXN0YXRpYyB2b2lkCi13bGNfcGh5X2EyX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHN0cnVjdCBucGh5X2lwYV90eGNhbGdhaW5zICp0eGdhaW5zLAotCQllbnVtIHBoeV9jYWxfbW9kZSBjYWxfbW9kZSwgdTggY29yZSkKLXsKLQl1MTYgcGh5X2ExLCBwaHlfYTIsIHBoeV9hMzsKLQl1MTYgcGh5X2E0LCBwaHlfYTU7Ci0JYm9vbCBwaHlfYTY7Ci0JdTggcGh5X2E3LCBtWzJdOwotCXUzMiBwaHlfYTggPSAwOwotCXN0cnVjdCBucGh5X3R4Z2FpbnMgcGh5X2E5OwotCi0JaWYgKE5SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDMpKQotCQlyZXR1cm47Ci0KLQlwaHlfYTcgPSAoY29yZSA9PSBQSFlfQ09SRV8wKSA/IDEgOiAwOwotCi0JcGh5X2E2ID0gKChjYWxfbW9kZSA9PSBDQUxfR0NUUkwpCi0JCSAgfHwgKGNhbF9tb2RlID09IENBTF9TT0ZUKSkgPyB0cnVlIDogZmFsc2U7Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQotCQlwaHlfYTkgPSB3bGNfcGh5X2dldF90eF9nYWluX25waHkocGkpOwotCi0JCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQlwaHlfYTUgPSAoKHBoeV9hOS50eGxwZltjb3JlXSA8PCAxNSkgfAotCQkJCSAgKHBoeV9hOS50eGdtW2NvcmVdIDw8IDEyKSB8Ci0JCQkJICAocGh5X2E5LnBnYVtjb3JlXSA8PCA4KSB8Ci0JCQkJICAodHhnYWlucy0+Z2FpbnMucGFkW2NvcmVdIDw8IDMpIHwKLQkJCQkgIChwaHlfYTkuaXBhW2NvcmVdKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwaHlfYTUgPSAoKHBoeV9hOS50eGxwZltjb3JlXSA8PCAxNSkgfAotCQkJCSAgKHBoeV9hOS50eGdtW2NvcmVdIDw8IDEyKSB8Ci0JCQkJICAodHhnYWlucy0+Z2FpbnMucGdhW2NvcmVdIDw8IDgpIHwKLQkJCQkgIChwaHlfYTkucGFkW2NvcmVdIDw8IDMpIHwgKHBoeV9hOS5pcGFbY29yZV0pKTsKLQkJfQotCi0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlXzF0b21hbnlfbnBoeShwaSwKLQkJCQkJCSAgICAgTlBIWV9SRVY3X1JmY3RybE92ZXJyaWRlX2NtZF90eGdhaW4sCi0JCQkJCQkgICAgIHBoeV9hNSwgKDEgPDwgY29yZSksIDApOwotCi0JCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQlpZiAoKHBpLT5wdWJwaS5yYWRpb3JldiA8PSA0KQotCQkJICAgIHx8IChwaS0+cHVicGkucmFkaW9yZXYgPT0gNikpIHsKLQotCQkJCW1bY29yZV0gPSBJUzQwTUhaKHBpKSA/IDYwIDogNzk7Ci0JCQl9IGVsc2UgewotCi0JCQkJbVtjb3JlXSA9IElTNDBNSFoocGkpID8gNDUgOiA2NDsKLQkJCX0KLQotCQl9IGVsc2UgewotCQkJbVtjb3JlXSA9IElTNDBNSFoocGkpID8gNzUgOiAxMDc7Ci0JCX0KLQotCQltW3BoeV9hN10gPSAwOwotCQl3bGNfcGh5X2lwYV9zZXRfYmJtdWx0X25waHkocGksIG1bMF0sIG1bMV0pOwotCi0JCXBoeV9hMiA9IDYzOwotCi0JCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQlpZiAoKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA0KQotCQkJICAgIHx8IChwaS0+cHVicGkucmFkaW9yZXYgPT0gNikpIHsKLQkJCQlwaHlfYTEgPSAzMDsKLQkJCQlwaHlfYTMgPSAzMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGh5X2ExID0gMjU7Ci0JCQkJcGh5X2EzID0gMjU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA1KQotCQkJICAgIHx8IChwaS0+cHVicGkucmFkaW9yZXYgPT0gNykKLQkJCSAgICB8fCAocGktPnB1YnBpLnJhZGlvcmV2ID09IDgpKSB7Ci0JCQkJcGh5X2ExID0gMjU7Ci0JCQkJcGh5X2EzID0gMjU7Ci0JCQl9IGVsc2UgewotCQkJCXBoeV9hMSA9IDM1OwotCQkJCXBoeV9hMyA9IDM1OwotCQkJfQotCQl9Ci0KLQkJaWYgKGNhbF9tb2RlID09IENBTF9HQ1RSTCkgewotCQkJaWYgKChwaS0+cHVicGkucmFkaW9yZXYgPT0gNSkKLQkJCSAgICAmJiAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkpIHsKLQkJCQlwaHlfYTEgPSA1NTsKLQkJCX0gZWxzZSBpZiAoKChwaS0+cHVicGkucmFkaW9yZXYgPT0gNykgJiYKLQkJCQkgICAgKENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykpKSB8fAotCQkJCSAgICgocGktPnB1YnBpLnJhZGlvcmV2ID09IDgpICYmCi0JCQkJICAgIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSkpIHsKLQkJCQlwaHlfYTEgPSA2MDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGh5X2ExID0gNjM7Ci0JCQl9Ci0KLQkJfSBlbHNlIGlmICgoY2FsX21vZGUgIT0gQ0FMX0ZVTEwpICYmIChjYWxfbW9kZSAhPSBDQUxfU09GVCkpIHsKLQotCQkJcGh5X2ExID0gMzU7Ci0JCQlwaHlfYTMgPSAzNTsKLQkJfQotCi0JCW1vZF9waHlfcmVnKHBpLCAoY29yZSA9PSBQSFlfQ09SRV8wKSA/IDB4Mjk3IDoKLQkJCSAgICAweDI5YiwgKDB4MSA8PCAwKSwgKDEpIDw8IDApOwotCi0JCW1vZF9waHlfcmVnKHBpLCAocGh5X2E3ID09IFBIWV9DT1JFXzApID8gMHgyOTcgOgotCQkJICAgIDB4MjliLCAoMHgxIDw8IDApLCAoMCkgPDwgMCk7Ci0KLQkJbW9kX3BoeV9yZWcocGksIChjb3JlID09IFBIWV9DT1JFXzApID8gMHgyYTMgOgotCQkJICAgIDB4MmE0LCAoMHgxIDw8IDEzKSwgKDEpIDw8IDEzKTsKLQotCQltb2RfcGh5X3JlZyhwaSwgKHBoeV9hNyA9PSBQSFlfQ09SRV8wKSA/IDB4MmEzIDoKLQkJCSAgICAweDJhNCwgKDB4MSA8PCAxMyksICgwKSA8PCAxMyk7Ci0KLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgyYTEsIDB4ODApOwotCQl3cml0ZV9waHlfcmVnKHBpLCAweDJhMiwgMHgxMDApOwotCi0JCW1vZF9waHlfcmVnKHBpLCAoY29yZSA9PSBQSFlfQ09SRV8wKSA/IDB4MmEzIDoKLQkJCSAgICAweDJhNCwgKDB4NyA8PCA0KSwgKDExKSA8PCA0KTsKLQotCQltb2RfcGh5X3JlZyhwaSwgKGNvcmUgPT0gUEhZX0NPUkVfMCkgPyAweDJhMyA6Ci0JCQkgICAgMHgyYTQsICgweDcgPDwgOCksICgxMSkgPDwgOCk7Ci0KLQkJbW9kX3BoeV9yZWcocGksIChjb3JlID09IFBIWV9DT1JFXzApID8gMHgyYTMgOgotCQkJICAgIDB4MmE0LCAoMHg3IDw8IDApLCAoMHgzKSA8PCAwKTsKLQotCQl3cml0ZV9waHlfcmVnKHBpLCAweDJlNSwgMHgyMCk7Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4MmEwLCAoMHgzZiA8PCAwKSwgKHBoeV9hMykgPDwgMCk7Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4MjlmLCAoMHgzZiA8PCAwKSwgKHBoeV9hMSkgPDwgMCk7Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4MjlmLCAoMHgzZiA8PCA4KSwgKHBoeV9hMikgPDwgOCk7Ci0KLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDMpLAotCQkJCQkJICAxLCAoKGNvcmUgPT0gMCkgPyAxIDogMiksIDAsCi0JCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDApOwotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksICgweDEgPDwgMyksCi0JCQkJCQkgIDAsICgoY29yZSA9PSAwKSA/IDIgOiAxKSwgMCwKLQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMCk7Ci0KLQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgyYmUsIDEpOwotCQlTUElOV0FJVChyZWFkX3BoeV9yZWcocGksIDB4MmJlKSwgMTAgKiAxMDAwICogMTAwMCk7Ci0KLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeV9yZXY3KHBpLCAoMHgxIDw8IDMpLAotCQkJCQkJICAwLCAweDMsIDAsCi0JCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDApOwotCi0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwKLQkJCQkJIChjb3JlID09Ci0JCQkJCSAgUEhZX0NPUkVfMCkgPyBOUEhZX1RCTF9JRF9FUFNJTE9OVEJMMAotCQkJCQkgOiBOUEhZX1RCTF9JRF9FUFNJTE9OVEJMMSwgMSwgcGh5X2EzLAotCQkJCQkgMzIsICZwaHlfYTgpOwotCi0JCWlmIChjYWxfbW9kZSAhPSBDQUxfR0NUUkwpIHsKLQkJCWlmIChDSFNQRUNfSVM1RyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQkJd2xjX3BoeV9hMV9ucGh5KHBpLCBjb3JlLCA1LCAwLCAzNSk7Ci0JCQl9Ci0JCX0KLQotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV8xdG9tYW55X25waHkocGksCi0JCQkJCQkgICAgIE5QSFlfUkVWN19SZmN0cmxPdmVycmlkZV9jbWRfdHhnYWluLAotCQkJCQkJICAgICBwaHlfYTUsICgxIDw8IGNvcmUpLCAxKTsKLQotCX0gZWxzZSB7Ci0KLQkJaWYgKHR4Z2FpbnMpIHsKLQkJCWlmICh0eGdhaW5zLT51c2VpbmRleCkgewotCQkJCXBoeV9hNCA9IDE1IC0gKCh0eGdhaW5zLT5pbmRleCkgPj4gMyk7Ci0JCQkJaWYgKENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDYpKQotCQkJCQkJcGh5X2E1ID0gMHgwMGY3IHwgKHBoeV9hNCA8PCA4KTsKLQotCQkJCQllbHNlCi0JCQkJCSAgICBpZiAoTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgNSkpCi0JCQkJCQlwaHlfYTUgPSAweDEwZjcgfCAocGh5X2E0IDw8IDgpOwotCQkJCQllbHNlCi0JCQkJCQlwaHlfYTUgPSAweDUwZjcgfCAocGh5X2E0IDw8IDgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXBoeV9hNSA9IDB4NzBmNyB8IChwaHlfYTQgPDwgOCk7Ci0JCQkJfQotCQkJCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHkocGksCi0JCQkJCQkJICAgICAoMHgxIDw8IDEzKSwKLQkJCQkJCQkgICAgIHBoeV9hNSwKLQkJCQkJCQkgICAgICgxIDw8IGNvcmUpLCAwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeShwaSwKLQkJCQkJCQkgICAgICgweDEgPDwgMTMpLAotCQkJCQkJCSAgICAgMHg1YmY3LAotCQkJCQkJCSAgICAgKDEgPDwgY29yZSksIDApOwotCQkJfQotCQl9Ci0KLQkJaWYgKENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCW1bY29yZV0gPSBJUzQwTUhaKHBpKSA/IDQ1IDogNjQ7Ci0JCX0gZWxzZSB7Ci0JCQltW2NvcmVdID0gSVM0ME1IWihwaSkgPyA3NSA6IDEwNzsKLQkJfQotCi0JCW1bcGh5X2E3XSA9IDA7Ci0JCXdsY19waHlfaXBhX3NldF9iYm11bHRfbnBoeShwaSwgbVswXSwgbVsxXSk7Ci0KLQkJcGh5X2EyID0gNjM7Ci0KLQkJaWYgKGNhbF9tb2RlID09IENBTF9GVUxMKSB7Ci0JCQlwaHlfYTEgPSAyNTsKLQkJCXBoeV9hMyA9IDI1OwotCQl9IGVsc2UgaWYgKGNhbF9tb2RlID09IENBTF9TT0ZUKSB7Ci0JCQlwaHlfYTEgPSAyNTsKLQkJCXBoeV9hMyA9IDI1OwotCQl9IGVsc2UgaWYgKGNhbF9tb2RlID09IENBTF9HQ1RSTCkgewotCQkJcGh5X2ExID0gNjM7Ci0JCQlwaHlfYTMgPSAyNTsKLQkJfSBlbHNlIHsKLQotCQkJcGh5X2ExID0gMjU7Ci0JCQlwaHlfYTMgPSAyNTsKLQkJfQotCi0JCW1vZF9waHlfcmVnKHBpLCAoY29yZSA9PSBQSFlfQ09SRV8wKSA/IDB4Mjk3IDoKLQkJCSAgICAweDI5YiwgKDB4MSA8PCAwKSwgKDEpIDw8IDApOwotCi0JCW1vZF9waHlfcmVnKHBpLCAocGh5X2E3ID09IFBIWV9DT1JFXzApID8gMHgyOTcgOgotCQkJICAgIDB4MjliLCAoMHgxIDw8IDApLCAoMCkgPDwgMCk7Ci0KLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDYpKSB7Ci0JCQltb2RfcGh5X3JlZyhwaSwgKGNvcmUgPT0gUEhZX0NPUkVfMCkgPyAweDJhMyA6Ci0JCQkJICAgIDB4MmE0LCAoMHgxIDw8IDEzKSwgKDEpIDw8IDEzKTsKLQotCQkJbW9kX3BoeV9yZWcocGksIChwaHlfYTcgPT0gUEhZX0NPUkVfMCkgPyAweDJhMyA6Ci0JCQkJICAgIDB4MmE0LCAoMHgxIDw8IDEzKSwgKDApIDw8IDEzKTsKLQotCQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgyYTEsIDB4MjApOwotCQkJd3JpdGVfcGh5X3JlZyhwaSwgMHgyYTIsIDB4NjApOwotCi0JCQltb2RfcGh5X3JlZyhwaSwgKGNvcmUgPT0gUEhZX0NPUkVfMCkgPyAweDJhMyA6Ci0JCQkJICAgIDB4MmE0LCAoMHhmIDw8IDQpLCAoOSkgPDwgNCk7Ci0KLQkJCW1vZF9waHlfcmVnKHBpLCAoY29yZSA9PSBQSFlfQ09SRV8wKSA/IDB4MmEzIDoKLQkJCQkgICAgMHgyYTQsICgweGYgPDwgOCksICg5KSA8PCA4KTsKLQotCQkJbW9kX3BoeV9yZWcocGksIChjb3JlID09IFBIWV9DT1JFXzApID8gMHgyYTMgOgotCQkJCSAgICAweDJhNCwgKDB4ZiA8PCAwKSwgKDB4MikgPDwgMCk7Ci0KLQkJCXdyaXRlX3BoeV9yZWcocGksIDB4MmU1LCAweDIwKTsKLQkJfSBlbHNlIHsKLQkJCW1vZF9waHlfcmVnKHBpLCAoY29yZSA9PSBQSFlfQ09SRV8wKSA/IDB4MmEzIDoKLQkJCQkgICAgMHgyYTQsICgweDEgPDwgMTEpLCAoMSkgPDwgMTEpOwotCi0JCQltb2RfcGh5X3JlZyhwaSwgKHBoeV9hNyA9PSBQSFlfQ09SRV8wKSA/IDB4MmEzIDoKLQkJCQkgICAgMHgyYTQsICgweDEgPDwgMTEpLCAoMCkgPDwgMTEpOwotCi0JCQl3cml0ZV9waHlfcmVnKHBpLCAweDJhMSwgMHg4MCk7Ci0JCQl3cml0ZV9waHlfcmVnKHBpLCAweDJhMiwgMHg2MDApOwotCi0JCQltb2RfcGh5X3JlZyhwaSwgKGNvcmUgPT0gUEhZX0NPUkVfMCkgPyAweDJhMyA6Ci0JCQkJICAgIDB4MmE0LCAoMHg3IDw8IDQpLCAoMCkgPDwgNCk7Ci0KLQkJCW1vZF9waHlfcmVnKHBpLCAoY29yZSA9PSBQSFlfQ09SRV8wKSA/IDB4MmEzIDoKLQkJCQkgICAgMHgyYTQsICgweDcgPDwgOCksICgwKSA8PCA4KTsKLQotCQkJbW9kX3BoeV9yZWcocGksIChjb3JlID09IFBIWV9DT1JFXzApID8gMHgyYTMgOgotCQkJCSAgICAweDJhNCwgKDB4NyA8PCAwKSwgKDB4MykgPDwgMCk7Ci0KLQkJCW1vZF9waHlfcmVnKHBpLCAweDJhMCwgKDB4M2YgPDwgOCksICgweDIwKSA8PCA4KTsKLQotCQl9Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4MmEwLCAoMHgzZiA8PCAwKSwgKHBoeV9hMykgPDwgMCk7Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4MjlmLCAoMHgzZiA8PCAwKSwgKHBoeV9hMSkgPDwgMCk7Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4MjlmLCAoMHgzZiA8PCA4KSwgKHBoeV9hMikgPDwgOCk7Ci0KLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeShwaSwgKDB4MSA8PCAzKSwgMSwgMHgzLCAwKTsKLQotCQl3cml0ZV9waHlfcmVnKHBpLCAweDJiZSwgMSk7Ci0JCVNQSU5XQUlUKHJlYWRfcGh5X3JlZyhwaSwgMHgyYmUpLCAxMCAqIDEwMDAgKiAxMDAwKTsKLQotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5KHBpLCAoMHgxIDw8IDMpLCAwLCAweDMsIDApOwotCi0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwKLQkJCQkJIChjb3JlID09Ci0JCQkJCSAgUEhZX0NPUkVfMCkgPyBOUEhZX1RCTF9JRF9FUFNJTE9OVEJMMAotCQkJCQkgOiBOUEhZX1RCTF9JRF9FUFNJTE9OVEJMMSwgMSwgcGh5X2EzLAotCQkJCQkgMzIsICZwaHlfYTgpOwotCi0JCWlmIChjYWxfbW9kZSAhPSBDQUxfR0NUUkwpIHsKLQkJCXdsY19waHlfYTFfbnBoeShwaSwgY29yZSwgNSwgMCwgNDApOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdTggd2xjX3BoeV9hM19ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCBzdGFydF9nYWluLCB1OCBjb3JlKQotewotCWludCBwaHlfYTE7Ci0JaW50IHBoeV9hMjsKLQlib29sIHBoeV9hMzsKLQlzdHJ1Y3QgbnBoeV9pcGFfdHhjYWxnYWlucyBwaHlfYTQ7Ci0JYm9vbCBwaHlfYTUgPSBmYWxzZTsKLQlib29sIHBoeV9hNiA9IHRydWU7Ci0JczMyIHBoeV9hNywgcGh5X2E4OwotCXUzMiBwaHlfYTk7Ci0JaW50IHBoeV9hMTA7Ci0JYm9vbCBwaHlfYTExID0gZmFsc2U7Ci0JaW50IHBoeV9hMTI7Ci0JdTggcGh5X2ExMyA9IDA7Ci0JdTggcGh5X2ExNDsKLQl1OCAqcGh5X2ExNSA9IE5VTEw7Ci0KLQlwaHlfYTQudXNlaW5kZXggPSB0cnVlOwotCXBoeV9hMTIgPSBzdGFydF9nYWluOwotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0KLQkJcGh5X2EyID0gMjA7Ci0JCXBoeV9hMSA9IDE7Ci0KLQkJaWYgKENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCWlmIChwaS0+cHVicGkucmFkaW9yZXYgPT0gNSkgewotCi0JCQkJcGh5X2ExNSA9IHBhZF9nYWluX2NvZGVzX3VzZWRfMjA1N3JldjU7Ci0JCQkJcGh5X2ExMyA9IHNpemVvZihwYWRfZ2Fpbl9jb2Rlc191c2VkXzIwNTdyZXY1KSAvCi0JCQkJICAgIHNpemVvZihwYWRfZ2Fpbl9jb2Rlc191c2VkXzIwNTdyZXY1WzBdKSAtIDE7Ci0KLQkJCX0gZWxzZSBpZiAoKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA3KQotCQkJCSAgIHx8IChwaS0+cHVicGkucmFkaW9yZXYgPT0gOCkpIHsKLQotCQkJCXBoeV9hMTUgPSBwYWRfZ2Fpbl9jb2Rlc191c2VkXzIwNTdyZXY3OwotCQkJCXBoeV9hMTMgPSBzaXplb2YocGFkX2dhaW5fY29kZXNfdXNlZF8yMDU3cmV2NykgLwotCQkJCSAgICBzaXplb2YocGFkX2dhaW5fY29kZXNfdXNlZF8yMDU3cmV2N1swXSkgLSAxOwotCi0JCQl9IGVsc2UgewotCi0JCQkJcGh5X2ExNSA9IHBhZF9hbGxfZ2Fpbl9jb2Rlc18yMDU3OwotCQkJCXBoeV9hMTMgPSBzaXplb2YocGFkX2FsbF9nYWluX2NvZGVzXzIwNTcpIC8KLQkJCQkgICAgc2l6ZW9mKHBhZF9hbGxfZ2Fpbl9jb2Rlc18yMDU3WzBdKSAtIDE7Ci0JCQl9Ci0KLQkJfSBlbHNlIHsKLQotCQkJcGh5X2ExNSA9IHBnYV9hbGxfZ2Fpbl9jb2Rlc18yMDU3OwotCQkJcGh5X2ExMyA9IHNpemVvZihwZ2FfYWxsX2dhaW5fY29kZXNfMjA1NykgLwotCQkJICAgIHNpemVvZihwZ2FfYWxsX2dhaW5fY29kZXNfMjA1N1swXSkgLSAxOwotCQl9Ci0KLQkJcGh5X2ExNCA9IDA7Ci0KLQkJZm9yIChwaHlfYTEwID0gMDsgcGh5X2ExMCA8IHBoeV9hMjsgcGh5X2ExMCsrKSB7Ci0JCQlpZiAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJCXBoeV9hNC5nYWlucy5wYWRbY29yZV0gPQotCQkJCSAgICAodTE2KSBwaHlfYTE1W3BoeV9hMTJdOwotCQkJfSBlbHNlIHsKLQkJCQlwaHlfYTQuZ2FpbnMucGdhW2NvcmVdID0KLQkJCQkgICAgKHUxNikgcGh5X2ExNVtwaHlfYTEyXTsKLQkJCX0KLQotCQkJd2xjX3BoeV9hMl9ucGh5KHBpLCAmcGh5X2E0LCBDQUxfR0NUUkwsIGNvcmUpOwotCi0JCQl3bGNfcGh5X3RhYmxlX3JlYWRfbnBoeShwaSwKLQkJCQkJCShjb3JlID09Ci0JCQkJCQkgUEhZX0NPUkVfMCA/Ci0JCQkJCQkgTlBIWV9UQkxfSURfRVBTSUxPTlRCTDAgOgotCQkJCQkJIE5QSFlfVEJMX0lEX0VQU0lMT05UQkwxKSwgMSwKLQkJCQkJCTYzLCAzMiwgJnBoeV9hOSk7Ci0KLQkJCXdsY19waHlfcGFwZF9kZWNvZGVfZXBzaWxvbihwaHlfYTksICZwaHlfYTcsICZwaHlfYTgpOwotCi0JCQlwaHlfYTMgPSAoKHBoeV9hNyA9PSA0MDk1KSB8fCAocGh5X2E3ID09IC00MDk2KSB8fAotCQkJCSAgKHBoeV9hOCA9PSA0MDk1KSB8fCAocGh5X2E4ID09IC00MDk2KSk7Ci0KLQkJCWlmICghcGh5X2E2ICYmIChwaHlfYTMgIT0gcGh5X2E1KSkgewotCQkJCWlmICghcGh5X2EzKSB7Ci0JCQkJCXBoeV9hMTIgLT0gKHU4KSBwaHlfYTE7Ci0JCQkJfQotCQkJCXBoeV9hMTEgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZiAocGh5X2EzKQotCQkJCXBoeV9hMTIgKz0gKHU4KSBwaHlfYTE7Ci0JCQllbHNlCi0JCQkJcGh5X2ExMiAtPSAodTgpIHBoeV9hMTsKLQotCQkJaWYgKChwaHlfYTEyIDwgcGh5X2ExNCkgfHwgKHBoeV9hMTIgPiBwaHlfYTEzKSkgewotCQkJCWlmIChwaHlfYTEyIDwgcGh5X2ExNCkgewotCQkJCQlwaHlfYTEyID0gcGh5X2ExNDsKLQkJCQl9IGVsc2UgewotCQkJCQlwaHlfYTEyID0gcGh5X2ExMzsKLQkJCQl9Ci0JCQkJcGh5X2ExMSA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXBoeV9hNiA9IGZhbHNlOwotCQkJcGh5X2E1ID0gcGh5X2EzOwotCQl9Ci0KLQl9IGVsc2UgewotCQlwaHlfYTIgPSAxMDsKLQkJcGh5X2ExID0gODsKLQkJZm9yIChwaHlfYTEwID0gMDsgcGh5X2ExMCA8IHBoeV9hMjsgcGh5X2ExMCsrKSB7Ci0JCQlwaHlfYTQuaW5kZXggPSAodTgpIHBoeV9hMTI7Ci0JCQl3bGNfcGh5X2EyX25waHkocGksICZwaHlfYTQsIENBTF9HQ1RSTCwgY29yZSk7Ci0KLQkJCXdsY19waHlfdGFibGVfcmVhZF9ucGh5KHBpLAotCQkJCQkJKGNvcmUgPT0KLQkJCQkJCSBQSFlfQ09SRV8wID8KLQkJCQkJCSBOUEhZX1RCTF9JRF9FUFNJTE9OVEJMMCA6Ci0JCQkJCQkgTlBIWV9UQkxfSURfRVBTSUxPTlRCTDEpLCAxLAotCQkJCQkJNjMsIDMyLCAmcGh5X2E5KTsKLQotCQkJd2xjX3BoeV9wYXBkX2RlY29kZV9lcHNpbG9uKHBoeV9hOSwgJnBoeV9hNywgJnBoeV9hOCk7Ci0KLQkJCXBoeV9hMyA9ICgocGh5X2E3ID09IDQwOTUpIHx8IChwaHlfYTcgPT0gLTQwOTYpIHx8Ci0JCQkJICAocGh5X2E4ID09IDQwOTUpIHx8IChwaHlfYTggPT0gLTQwOTYpKTsKLQotCQkJaWYgKCFwaHlfYTYgJiYgKHBoeV9hMyAhPSBwaHlfYTUpKSB7Ci0JCQkJaWYgKCFwaHlfYTMpIHsKLQkJCQkJcGh5X2ExMiAtPSAodTgpIHBoeV9hMTsKLQkJCQl9Ci0JCQkJcGh5X2ExMSA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChwaHlfYTMpCi0JCQkJcGh5X2ExMiArPSAodTgpIHBoeV9hMTsKLQkJCWVsc2UKLQkJCQlwaHlfYTEyIC09ICh1OCkgcGh5X2ExOwotCi0JCQlpZiAoKHBoeV9hMTIgPCAwKSB8fCAocGh5X2ExMiA+IDEyNykpIHsKLQkJCQlpZiAocGh5X2ExMiA8IDApIHsKLQkJCQkJcGh5X2ExMiA9IDA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcGh5X2ExMiA9IDEyNzsKLQkJCQl9Ci0JCQkJcGh5X2ExMSA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXBoeV9hNiA9IGZhbHNlOwotCQkJcGh5X2E1ID0gcGh5X2EzOwotCQl9Ci0KLQl9Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQkJcmV0dXJuICh1OCkgcGh5X2ExNVtwaHlfYTEyXTsKLQl9IGVsc2UgewotCQlyZXR1cm4gKHU4KSBwaHlfYTEyOwotCX0KLQotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X2E0KHN0cnVjdCBicmNtc19waHkgKnBpLCBib29sIGZ1bGxfY2FsKQotewotCXN0cnVjdCBucGh5X2lwYV90eGNhbGdhaW5zIHBoeV9iMVsyXTsKLQlzdHJ1Y3QgbnBoeV9wYXBkX3Jlc3RvcmVfc3RhdGUgcGh5X2IyOwotCWJvb2wgcGh5X2IzOwotCXU4IHBoeV9iNDsKLQl1OCBwaHlfYjU7Ci0JczE2IHBoeV9iNiwgcGh5X2I3LCBwaHlfYjg7Ci0JdTE2IHBoeV9iOTsKLQlzMTYgcGh5X2IxMCwgcGh5X2IxMSwgcGh5X2IxMjsKLQotCXBoeV9iMTEgPSAwOwotCXBoeV9iMTIgPSAwOwotCXBoeV9iNyA9IDA7Ci0JcGh5X2I4ID0gMDsKLQlwaHlfYjYgPSAwOwotCi0JaWYgKHBpLT5ucGh5X3BhcGRfc2tpcCA9PSAxKQotCQlyZXR1cm47Ci0KLQlwaHlfYjMgPQotCSAgICAoMCA9PSAoUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKSAmIE1DVExfRU5fTUFDKSk7Ci0JaWYgKCFwaHlfYjMpIHsKLQkJd2xhcGlfc3VzcGVuZF9tYWNfYW5kX3dhaXQocGktPnNoLT5waHlzaGltKTsKLQl9Ci0KLQl3bGNfcGh5X3N0YXlfaW5fY2FycmllcnNlYXJjaF9ucGh5KHBpLCB0cnVlKTsKLQotCXBpLT5ucGh5X2ZvcmNlX3BhcGRfY2FsID0gZmFsc2U7Ci0KLQlmb3IgKHBoeV9iNSA9IDA7IHBoeV9iNSA8IHBpLT5wdWJwaS5waHlfY29yZW51bTsgcGh5X2I1KyspCi0JCXBpLT5ucGh5X3BhcGRfdHhfZ2Fpbl9hdF9sYXN0X2NhbFtwaHlfYjVdID0KLQkJICAgIHdsY19waHlfdHhwd3JfaWR4X2N1cl9nZXRfbnBoeShwaSwgcGh5X2I1KTsKLQotCXBpLT5ucGh5X3BhcGRfbGFzdF9jYWwgPSBwaS0+c2gtPm5vdzsKLQlwaS0+bnBoeV9wYXBkX3JlY2FsX2NvdW50ZXIrKzsKLQotCWlmIChOT1JBRElPX0VOQUIocGktPnB1YnBpKSkKLQkJcmV0dXJuOwotCi0JcGh5X2I0ID0gcGktPm5waHlfdHhwd3JjdHJsOwotCXdsY19waHlfdHhwd3JjdHJsX2VuYWJsZV9ucGh5KHBpLCBQSFlfVFBDX0hXX09GRik7Ci0KLQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX1NDQUxBUlRCTDAsIDY0LCAwLCAzMiwKLQkJCQkgbnBoeV9wYXBkX3NjYWx0YmwpOwotCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfU0NBTEFSVEJMMSwgNjQsIDAsIDMyLAotCQkJCSBucGh5X3BhcGRfc2NhbHRibCk7Ci0KLQlwaHlfYjkgPSByZWFkX3BoeV9yZWcocGksIDB4MDEpOwotCW1vZF9waHlfcmVnKHBpLCAweDAxLCAoMHgxIDw8IDE1KSwgMCk7Ci0KLQlmb3IgKHBoeV9iNSA9IDA7IHBoeV9iNSA8IHBpLT5wdWJwaS5waHlfY29yZW51bTsgcGh5X2I1KyspIHsKLQkJczMyIGksIHZhbCA9IDA7Ci0JCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksCi0JCQkJCQkgKChwaHlfYjUgPT0KLQkJCQkJCSAgIFBIWV9DT1JFXzApID8KLQkJCQkJCSAgTlBIWV9UQkxfSURfRVBTSUxPTlRCTDAgOgotCQkJCQkJICBOUEhZX1RCTF9JRF9FUFNJTE9OVEJMMSksIDEsCi0JCQkJCQkgaSwgMzIsICZ2YWwpOwotCQl9Ci0JfQotCi0Jd2xjX3BoeV9pcGFfcmVzdG9yZV90eF9kaWdpX2ZpbHRzX25waHkocGkpOwotCi0JcGh5X2IyLm1tID0gd2xjX3BoeV9pcGFfZ2V0X2JibXVsdF9ucGh5KHBpKTsKLQlmb3IgKHBoeV9iNSA9IDA7IHBoeV9iNSA8IHBpLT5wdWJwaS5waHlfY29yZW51bTsgcGh5X2I1KyspIHsKLQkJd2xjX3BoeV9wYXBkX2NhbF9zZXR1cF9ucGh5KHBpLCAmcGh5X2IyLCBwaHlfYjUpOwotCi0JCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCQkJaWYgKENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQotCQkJCWlmICgocGktPnB1YnBpLnJhZGlvcmV2ID09IDMpCi0JCQkJICAgIHx8IChwaS0+cHVicGkucmFkaW9yZXYgPT0gNCkKLQkJCQkgICAgfHwgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA2KSkgewotCi0JCQkJCXBpLT5ucGh5X3BhcGRfY2FsX2dhaW5faW5kZXhbcGh5X2I1XSA9Ci0JCQkJCSAgICAyMzsKLQotCQkJCX0gZWxzZSBpZiAocGktPnB1YnBpLnJhZGlvcmV2ID09IDUpIHsKLQotCQkJCQlwaS0+bnBoeV9wYXBkX2NhbF9nYWluX2luZGV4W3BoeV9iNV0gPQotCQkJCQkgICAgMDsKLQkJCQkJcGktPm5waHlfcGFwZF9jYWxfZ2Fpbl9pbmRleFtwaHlfYjVdID0KLQkJCQkJICAgIHdsY19waHlfYTNfbnBoeShwaSwKLQkJCQkJCQkgICAgcGktPgotCQkJCQkJCSAgICBucGh5X3BhcGRfY2FsX2dhaW5faW5kZXgKLQkJCQkJCQkgICAgW3BoeV9iNV0sIHBoeV9iNSk7Ci0KLQkJCQl9IGVsc2UgaWYgKChwaS0+cHVicGkucmFkaW9yZXYgPT0gNykKLQkJCQkJICAgfHwgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA4KSkgewotCi0JCQkJCXBpLT5ucGh5X3BhcGRfY2FsX2dhaW5faW5kZXhbcGh5X2I1XSA9Ci0JCQkJCSAgICAwOwotCQkJCQlwaS0+bnBoeV9wYXBkX2NhbF9nYWluX2luZGV4W3BoeV9iNV0gPQotCQkJCQkgICAgd2xjX3BoeV9hM19ucGh5KHBpLAotCQkJCQkJCSAgICBwaS0+Ci0JCQkJCQkJICAgIG5waHlfcGFwZF9jYWxfZ2Fpbl9pbmRleAotCQkJCQkJCSAgICBbcGh5X2I1XSwgcGh5X2I1KTsKLQotCQkJCX0KLQotCQkJCXBoeV9iMVtwaHlfYjVdLmdhaW5zLnBhZFtwaHlfYjVdID0KLQkJCQkgICAgcGktPm5waHlfcGFwZF9jYWxfZ2Fpbl9pbmRleFtwaHlfYjVdOwotCi0JCQl9IGVsc2UgewotCQkJCXBpLT5ucGh5X3BhcGRfY2FsX2dhaW5faW5kZXhbcGh5X2I1XSA9IDA7Ci0JCQkJcGktPm5waHlfcGFwZF9jYWxfZ2Fpbl9pbmRleFtwaHlfYjVdID0KLQkJCQkgICAgd2xjX3BoeV9hM19ucGh5KHBpLAotCQkJCQkJICAgIHBpLT4KLQkJCQkJCSAgICBucGh5X3BhcGRfY2FsX2dhaW5faW5kZXgKLQkJCQkJCSAgICBbcGh5X2I1XSwgcGh5X2I1KTsKLQkJCQlwaHlfYjFbcGh5X2I1XS5nYWlucy5wZ2FbcGh5X2I1XSA9Ci0JCQkJICAgIHBpLT5ucGh5X3BhcGRfY2FsX2dhaW5faW5kZXhbcGh5X2I1XTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXBoeV9iMVtwaHlfYjVdLnVzZWluZGV4ID0gdHJ1ZTsKLQkJCXBoeV9iMVtwaHlfYjVdLmluZGV4ID0gMTY7Ci0JCQlwaHlfYjFbcGh5X2I1XS5pbmRleCA9Ci0JCQkgICAgd2xjX3BoeV9hM19ucGh5KHBpLCBwaHlfYjFbcGh5X2I1XS5pbmRleCwgcGh5X2I1KTsKLQotCQkJcGktPm5waHlfcGFwZF9jYWxfZ2Fpbl9pbmRleFtwaHlfYjVdID0KLQkJCSAgICAxNSAtICgocGh5X2IxW3BoeV9iNV0uaW5kZXgpID4+IDMpOwotCQl9Ci0KLQkJc3dpdGNoIChwaS0+bnBoeV9wYXBkX2NhbF90eXBlKSB7Ci0JCWNhc2UgMDoKLQkJCXdsY19waHlfYTJfbnBoeShwaSwgJnBoeV9iMVtwaHlfYjVdLCBDQUxfRlVMTCwgcGh5X2I1KTsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQl3bGNfcGh5X2EyX25waHkocGksICZwaHlfYjFbcGh5X2I1XSwgQ0FMX1NPRlQsIHBoeV9iNSk7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCQkJd2xjX3BoeV9wYXBkX2NhbF9jbGVhbnVwX25waHkocGksICZwaHlfYjIpOwotCQl9Ci0JfQotCi0JaWYgKE5SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCXdsY19waHlfcGFwZF9jYWxfY2xlYW51cF9ucGh5KHBpLCAmcGh5X2IyKTsKLQl9Ci0KLQlmb3IgKHBoeV9iNSA9IDA7IHBoeV9iNSA8IHBpLT5wdWJwaS5waHlfY29yZW51bTsgcGh5X2I1KyspIHsKLQkJaW50IGVwc19vZmZzZXQgPSAwOwotCi0JCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCQkJaWYgKENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCQlpZiAocGktPnB1YnBpLnJhZGlvcmV2ID09IDMpIHsKLQkJCQkJZXBzX29mZnNldCA9IC0yOwotCQkJCX0gZWxzZSBpZiAocGktPnB1YnBpLnJhZGlvcmV2ID09IDUpIHsKLQkJCQkJZXBzX29mZnNldCA9IDM7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZXBzX29mZnNldCA9IC0xOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZXBzX29mZnNldCA9IDI7Ci0JCQl9Ci0KLQkJCWlmIChDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQkJcGh5X2I4ID0gcGh5X2IxW3BoeV9iNV0uZ2FpbnMucGFkW3BoeV9iNV07Ci0JCQkJcGh5X2IxMCA9IDA7Ci0JCQkJaWYgKChwaS0+cHVicGkucmFkaW9yZXYgPT0gMykgfHwKLQkJCQkgICAgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA0KSB8fAotCQkJCSAgICAocGktPnB1YnBpLnJhZGlvcmV2ID09IDYpKSB7Ci0JCQkJCXBoeV9iMTIgPQotCQkJCQkgICAgLQotCQkJCQkgICAgKG5waHlfcGFwZF9wYWRnYWluX2RsdF8yZ18yMDU3cmV2M240Ci0JCQkJCSAgICAgW3BoeV9iOF0KLQkJCQkJICAgICArIDEpIC8gMjsKLQkJCQkJcGh5X2IxMCA9IC0xOwotCQkJCX0gZWxzZSBpZiAocGktPnB1YnBpLnJhZGlvcmV2ID09IDUpIHsKLQkJCQkJcGh5X2IxMiA9Ci0JCQkJCSAgICAtKG5waHlfcGFwZF9wYWRnYWluX2RsdF8yZ18yMDU3cmV2NQotCQkJCQkgICAgICBbcGh5X2I4XQotCQkJCQkgICAgICArIDEpIC8gMjsKLQkJCQl9IGVsc2UgaWYgKChwaS0+cHVicGkucmFkaW9yZXYgPT0gNykgfHwKLQkJCQkJICAgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA4KSkgewotCQkJCQlwaHlfYjEyID0KLQkJCQkJICAgIC0obnBoeV9wYXBkX3BhZGdhaW5fZGx0XzJnXzIwNTdyZXY3Ci0JCQkJCSAgICAgIFtwaHlfYjhdCi0JCQkJCSAgICAgICsgMSkgLyAyOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcGh5X2I3ID0gcGh5X2IxW3BoeV9iNV0uZ2FpbnMucGdhW3BoeV9iNV07Ci0JCQkJaWYgKChwaS0+cHVicGkucmFkaW9yZXYgPT0gMykgfHwKLQkJCQkgICAgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA0KSB8fAotCQkJCSAgICAocGktPnB1YnBpLnJhZGlvcmV2ID09IDYpKSB7Ci0JCQkJCXBoeV9iMTEgPQotCQkJCQkgICAgLShucGh5X3BhcGRfcGdhZ2Fpbl9kbHRfNWdfMjA1NwotCQkJCQkgICAgICBbcGh5X2I3XQotCQkJCQkgICAgICArIDEpIC8gMjsKLQkJCQl9IGVsc2UgaWYgKChwaS0+cHVicGkucmFkaW9yZXYgPT0gNykKLQkJCQkJICAgfHwgKHBpLT5wdWJwaS5yYWRpb3JldiA9PSA4KSkgewotCQkJCQlwaHlfYjExID0KLQkJCQkJICAgIC0obnBoeV9wYXBkX3BnYWdhaW5fZGx0XzVnXzIwNTdyZXY3Ci0JCQkJCSAgICAgIFtwaHlfYjddCi0JCQkJCSAgICAgICsgMSkgLyAyOwotCQkJCX0KLQotCQkJCXBoeV9iMTAgPSAtOTsKLQkJCX0KLQotCQkJaWYgKENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCQlwaHlfYjYgPQotCQkJCSAgICAtNjAgKyAyNyArIGVwc19vZmZzZXQgKyBwaHlfYjEyICsgcGh5X2IxMDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGh5X2I2ID0KLQkJCQkgICAgLTYwICsgMjcgKyBlcHNfb2Zmc2V0ICsgcGh5X2IxMSArIHBoeV9iMTA7Ci0JCQl9Ci0KLQkJCW1vZF9waHlfcmVnKHBpLCAocGh5X2I1ID09IFBIWV9DT1JFXzApID8gMHgyOTggOgotCQkJCSAgICAweDI5YywgKDB4MWZmIDw8IDcpLCAocGh5X2I2KSA8PCA3KTsKLQotCQkJcGktPm5waHlfcGFwZF9lcHNpbG9uX29mZnNldFtwaHlfYjVdID0gcGh5X2I2OwotCQl9IGVsc2UgewotCQkJaWYgKE5SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDUpKSB7Ci0JCQkJZXBzX29mZnNldCA9IDQ7Ci0JCQl9IGVsc2UgewotCQkJCWVwc19vZmZzZXQgPSAyOwotCQkJfQotCi0JCQlwaHlfYjcgPSAxNSAtICgocGh5X2IxW3BoeV9iNV0uaW5kZXgpID4+IDMpOwotCi0JCQlpZiAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJCXBoeV9iMTEgPQotCQkJCSAgICAtKG5waHlfcGFwZF9wZ2FfZ2Fpbl9kZWx0YV9pcGFfMmdbcGh5X2I3XSArCi0JCQkJICAgICAgMSkgLyAyOwotCQkJCXBoeV9iMTAgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlwaHlfYjExID0KLQkJCQkgICAgLShucGh5X3BhcGRfcGdhX2dhaW5fZGVsdGFfaXBhXzVnW3BoeV9iN10gKwotCQkJCSAgICAgIDEpIC8gMjsKLQkJCQlwaHlfYjEwID0gLTk7Ci0JCQl9Ci0KLQkJCXBoeV9iNiA9IC02MCArIDI3ICsgZXBzX29mZnNldCArIHBoeV9iMTEgKyBwaHlfYjEwOwotCi0JCQltb2RfcGh5X3JlZyhwaSwgKHBoeV9iNSA9PSBQSFlfQ09SRV8wKSA/IDB4Mjk4IDoKLQkJCQkgICAgMHgyOWMsICgweDFmZiA8PCA3KSwgKHBoeV9iNikgPDwgNyk7Ci0KLQkJCXBpLT5ucGh5X3BhcGRfZXBzaWxvbl9vZmZzZXRbcGh5X2I1XSA9IHBoeV9iNjsKLQkJfQotCX0KLQotCW1vZF9waHlfcmVnKHBpLCAoMCA9PSBQSFlfQ09SRV8wKSA/IDB4Mjk3IDoKLQkJICAgIDB4MjliLCAoMHgxIDw8IDApLCAoTlBIWV9QQVBEX0NPTVBfT04pIDw8IDApOwotCi0JbW9kX3BoeV9yZWcocGksICgxID09IFBIWV9DT1JFXzApID8gMHgyOTcgOgotCQkgICAgMHgyOWIsICgweDEgPDwgMCksIChOUEhZX1BBUERfQ09NUF9PTikgPDwgMCk7Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNikpIHsKLQkJbW9kX3BoeV9yZWcocGksICgwID09IFBIWV9DT1JFXzApID8gMHgyYTMgOgotCQkJICAgIDB4MmE0LCAoMHgxIDw8IDEzKSwgKDApIDw8IDEzKTsKLQotCQltb2RfcGh5X3JlZyhwaSwgKDEgPT0gUEhZX0NPUkVfMCkgPyAweDJhMyA6Ci0JCQkgICAgMHgyYTQsICgweDEgPDwgMTMpLCAoMCkgPDwgMTMpOwotCi0JfSBlbHNlIHsKLQkJbW9kX3BoeV9yZWcocGksICgwID09IFBIWV9DT1JFXzApID8gMHgyYTMgOgotCQkJICAgIDB4MmE0LCAoMHgxIDw8IDExKSwgKDApIDw8IDExKTsKLQotCQltb2RfcGh5X3JlZyhwaSwgKDEgPT0gUEhZX0NPUkVfMCkgPyAweDJhMyA6Ci0JCQkgICAgMHgyYTQsICgweDEgPDwgMTEpLCAoMCkgPDwgMTEpOwotCi0JfQotCXBpLT5ucGh5X3BhcGRjb21wID0gTlBIWV9QQVBEX0NPTVBfT047Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCAweDAxLCBwaHlfYjkpOwotCi0Jd2xjX3BoeV9pcGFfc2V0X3R4X2RpZ2lfZmlsdHNfbnBoeShwaSk7Ci0KLQl3bGNfcGh5X3R4cHdyY3RybF9lbmFibGVfbnBoeShwaSwgcGh5X2I0KTsKLQlpZiAocGh5X2I0ID09IFBIWV9UUENfSFdfT0ZGKSB7Ci0JCXdsY19waHlfdHhwd3JfaW5kZXhfbnBoeShwaSwgKDEgPDwgMCksCi0JCQkJCSAoczgpIChwaS0+bnBoeV90eHB3cmluZGV4WzBdLgotCQkJCQkJIGluZGV4X2ludGVybmFsKSwgZmFsc2UpOwotCQl3bGNfcGh5X3R4cHdyX2luZGV4X25waHkocGksICgxIDw8IDEpLAotCQkJCQkgKHM4KSAocGktPm5waHlfdHhwd3JpbmRleFsxXS4KLQkJCQkJCSBpbmRleF9pbnRlcm5hbCksIGZhbHNlKTsKLQl9Ci0KLQl3bGNfcGh5X3N0YXlfaW5fY2FycmllcnNlYXJjaF9ucGh5KHBpLCBmYWxzZSk7Ci0KLQlpZiAoIXBoeV9iMykgewotCQl3bGFwaV9lbmFibGVfbWFjKHBpLT5zaC0+cGh5c2hpbSk7Ci0JfQotfQotCi12b2lkIHdsY19waHlfdHhwd3JfZml4cG93ZXJfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQl1aW50IGNvcmU7Ci0JdTMyIHR4Z2FpbjsKLQl1MTYgcmFkX2dhaW4sIGRhY19nYWluLCBiYm11bHQsIG0xbTI7Ci0JdTggdHhwaVsyXSwgY2hhbl9mcmVxX3JhbmdlOwotCXMzMiByZnB3cl9vZmZzZXQ7Ci0KLQlpZiAocGktPnBoeWhhbmdfYXZvaWQpCi0JCXdsY19waHlfc3RheV9pbl9jYXJyaWVyc2VhcmNoX25waHkocGksIHRydWUpOwotCi0JaWYgKHBpLT5zaC0+c3JvbXJldiA8IDQpIHsKLQkJdHhwaVswXSA9IHR4cGlbMV0gPSA3MjsKLQl9IGVsc2UgewotCi0JCWNoYW5fZnJlcV9yYW5nZSA9IHdsY19waHlfZ2V0X2NoYW5fZnJlcV9yYW5nZV9ucGh5KHBpLCAwKTsKLQkJc3dpdGNoIChjaGFuX2ZyZXFfcmFuZ2UpIHsKLQkJY2FzZSBXTF9DSEFOX0ZSRVFfUkFOR0VfMkc6Ci0JCQl0eHBpWzBdID0gcGktPm5waHlfdHhwaWQyZ1swXTsKLQkJCXR4cGlbMV0gPSBwaS0+bnBoeV90eHBpZDJnWzFdOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xfQ0hBTl9GUkVRX1JBTkdFXzVHTDoKLQkJCXR4cGlbMF0gPSBwaS0+bnBoeV90eHBpZDVnbFswXTsKLQkJCXR4cGlbMV0gPSBwaS0+bnBoeV90eHBpZDVnbFsxXTsKLQkJCWJyZWFrOwotCQljYXNlIFdMX0NIQU5fRlJFUV9SQU5HRV81R006Ci0JCQl0eHBpWzBdID0gcGktPm5waHlfdHhwaWQ1Z1swXTsKLQkJCXR4cGlbMV0gPSBwaS0+bnBoeV90eHBpZDVnWzFdOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xfQ0hBTl9GUkVRX1JBTkdFXzVHSDoKLQkJCXR4cGlbMF0gPSBwaS0+bnBoeV90eHBpZDVnaFswXTsKLQkJCXR4cGlbMV0gPSBwaS0+bnBoeV90eHBpZDVnaFsxXTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdHhwaVswXSA9IHR4cGlbMV0gPSA5MTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCXR4cGlbMF0gPSB0eHBpWzFdID0gMzA7Ci0JfSBlbHNlIGlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCQl0eHBpWzBdID0gdHhwaVsxXSA9IDQwOwotCX0KLQotCWlmIChOUkVWX0xUKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCi0JCWlmICgodHhwaVswXSA8IDQwKSB8fCAodHhwaVswXSA+IDEwMCkgfHwKLQkJICAgICh0eHBpWzFdIDwgNDApIHx8ICh0eHBpWzFdID4gMTAwKSkKLQkJCXR4cGlbMF0gPSB0eHBpWzFdID0gOTE7Ci0JfQotCi0JcGktPm5waHlfdHhwd3JpbmRleFtQSFlfQ09SRV8wXS5pbmRleF9pbnRlcm5hbCA9IHR4cGlbMF07Ci0JcGktPm5waHlfdHhwd3JpbmRleFtQSFlfQ09SRV8xXS5pbmRleF9pbnRlcm5hbCA9IHR4cGlbMV07Ci0JcGktPm5waHlfdHhwd3JpbmRleFtQSFlfQ09SRV8wXS5pbmRleF9pbnRlcm5hbF9zYXZlID0gdHhwaVswXTsKLQlwaS0+bnBoeV90eHB3cmluZGV4W1BIWV9DT1JFXzFdLmluZGV4X2ludGVybmFsX3NhdmUgPSB0eHBpWzFdOwotCi0JZm9yIChjb3JlID0gMDsgY29yZSA8IHBpLT5wdWJwaS5waHlfY29yZW51bTsgY29yZSsrKSB7Ci0JCXVpbnQgcGh5cmV2ID0gcGktPnB1YnBpLnBoeV9yZXY7Ci0KLQkJaWYgKE5SRVZfR0UocGh5cmV2LCAzKSkgewotCQkJaWYgKFBIWV9JUEEocGkpKSB7Ci0JCQkJdTMyICp0eF9nYWludGJsID0KLQkJCQkgICAgd2xjX3BoeV9nZXRfaXBhX2dhaW50YmxfbnBoeShwaSk7Ci0JCQkJdHhnYWluID0gdHhfZ2FpbnRibFt0eHBpW2NvcmVdXTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKENIU1BFQ19JUzVHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCQkJaWYgKE5SRVZfSVMocGh5cmV2LCAzKSkgewotCQkJCQkJdHhnYWluID0KLQkJCQkJCSAgICBucGh5X3RwY181R0h6X3R4Z2Fpbl9yZXYzCi0JCQkJCQkgICAgW3R4cGlbY29yZV1dOwotCQkJCQl9IGVsc2UgaWYgKE5SRVZfSVMocGh5cmV2LCA0KSkgewotCQkJCQkJdHhnYWluID0KLQkJCQkJCSAgICAocGktPnNyb21fZmVtNWcuZXh0cGFnYWluID09Ci0JCQkJCQkgICAgIDMpID8KLQkJCQkJCSAgICBucGh5X3RwY181R0h6X3R4Z2Fpbl9IaVB3ckVQQQotCQkJCQkJICAgIFt0eHBpW2NvcmVdXSA6Ci0JCQkJCQkgICAgbnBoeV90cGNfNUdIel90eGdhaW5fcmV2NAotCQkJCQkJICAgIFt0eHBpW2NvcmVdXTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXR4Z2FpbiA9Ci0JCQkJCQkgICAgbnBoeV90cGNfNUdIel90eGdhaW5fcmV2NQotCQkJCQkJICAgIFt0eHBpW2NvcmVdXTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChOUkVWX0dFKHBoeXJldiwgNSkgJiYKLQkJCQkJICAgIChwaS0+c3JvbV9mZW0yZy5leHRwYWdhaW4gPT0gMykpIHsKLQkJCQkJCXR4Z2FpbiA9Ci0JCQkJCQkgICAgbnBoeV90cGNfdHhnYWluX0hpUHdyRVBBCi0JCQkJCQkgICAgW3R4cGlbY29yZV1dOwotCQkJCQl9IGVsc2UgewotCQkJCQkJdHhnYWluID0KLQkJCQkJCSAgICBucGh5X3RwY190eGdhaW5fcmV2M1t0eHBpCi0JCQkJCQkJCQkgW2NvcmVdXTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXR4Z2FpbiA9IG5waHlfdHBjX3R4Z2Fpblt0eHBpW2NvcmVdXTsKLQkJfQotCi0JCWlmIChOUkVWX0dFKHBoeXJldiwgMykpCi0JCQlyYWRfZ2FpbiA9ICh0eGdhaW4gPj4gMTYpICYgKCgxIDw8ICgzMiAtIDE2ICsgMSkpIC0gMSk7Ci0JCWVsc2UKLQkJCXJhZF9nYWluID0gKHR4Z2FpbiA+PiAxNikgJiAoKDEgPDwgKDI4IC0gMTYgKyAxKSkgLSAxKTsKLQotCQlpZiAoTlJFVl9HRShwaHlyZXYsIDcpKQotCQkJZGFjX2dhaW4gPSAodHhnYWluID4+IDgpICYgKCgxIDw8ICgxMCAtIDggKyAxKSkgLSAxKTsKLQkJZWxzZQotCQkJZGFjX2dhaW4gPSAodHhnYWluID4+IDgpICYgKCgxIDw8ICgxMyAtIDggKyAxKSkgLSAxKTsKLQotCQliYm11bHQgPSAodHhnYWluID4+IDApICYgKCgxIDw8ICg3IC0gMCArIDEpKSAtIDEpOwotCi0JCWlmIChOUkVWX0dFKHBoeXJldiwgMykpIHsKLQkJCW1vZF9waHlfcmVnKHBpLCAoKGNvcmUgPT0gUEhZX0NPUkVfMCkgPyAweDhmIDoKLQkJCQkJIDB4YTUpLCAoMHgxIDw8IDgpLCAoMHgxIDw8IDgpKTsKLQkJfSBlbHNlIHsKLQkJCW1vZF9waHlfcmVnKHBpLCAweGE1LCAoMHgxIDw8IDE0KSwgKDB4MSA8PCAxNCkpOwotCQl9Ci0JCXdyaXRlX3BoeV9yZWcocGksIChjb3JlID09IFBIWV9DT1JFXzApID8gMHhhYSA6IDB4YWIsIGRhY19nYWluKTsKLQotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIDcsIDEsICgweDExMCArIGNvcmUpLCAxNiwKLQkJCQkJICZyYWRfZ2Fpbik7Ci0KLQkJd2xjX3BoeV90YWJsZV9yZWFkX25waHkocGksIDE1LCAxLCA4NywgMTYsICZtMW0yKTsKLQkJbTFtMiAmPSAoKGNvcmUgPT0gUEhZX0NPUkVfMCkgPyAweDAwZmYgOiAweGZmMDApOwotCQltMW0yIHw9ICgoY29yZSA9PSBQSFlfQ09SRV8wKSA/IChiYm11bHQgPDwgOCkgOiAoYmJtdWx0IDw8IDApKTsKLQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCAxNSwgMSwgODcsIDE2LCAmbTFtMik7Ci0KLQkJaWYgKFBIWV9JUEEocGkpKSB7Ci0JCQl3bGNfcGh5X3RhYmxlX3JlYWRfbnBoeShwaSwKLQkJCQkJCShjb3JlID09Ci0JCQkJCQkgUEhZX0NPUkVfMCA/Ci0JCQkJCQkgTlBIWV9UQkxfSURfQ09SRTFUWFBXUkNUTCA6Ci0JCQkJCQkgTlBIWV9UQkxfSURfQ09SRTJUWFBXUkNUTCksIDEsCi0JCQkJCQk1NzYgKyB0eHBpW2NvcmVdLCAzMiwKLQkJCQkJCSZyZnB3cl9vZmZzZXQpOwotCi0JCQltb2RfcGh5X3JlZyhwaSwgKGNvcmUgPT0gUEhZX0NPUkVfMCkgPyAweDI5NyA6Ci0JCQkJICAgIDB4MjliLCAoMHgxZmYgPDwgNCksCi0JCQkJICAgICgoczE2KSByZnB3cl9vZmZzZXQpIDw8IDQpOwotCi0JCQltb2RfcGh5X3JlZyhwaSwgKGNvcmUgPT0gUEhZX0NPUkVfMCkgPyAweDI5NyA6Ci0JCQkJICAgIDB4MjliLCAoMHgxIDw8IDIpLCAoMSkgPDwgMik7Ci0KLQkJfQotCX0KLQotCWFuZF9waHlfcmVnKHBpLCAweGJmLCAodTE2KSAofigweDFmIDw8IDApKSk7Ci0KLQlpZiAocGktPnBoeWhhbmdfYXZvaWQpCi0JCXdsY19waHlfc3RheV9pbl9jYXJyaWVyc2VhcmNoX25waHkocGksIGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQKLXdsY19waHlfdHhwd3JfbnBoeV9zcm9tX2NvbnZlcnQodTggKnNyb21fbWF4LCB1MTYgKnB3cl9vZmZzZXQsCi0JCQkJdTggdG1wX21heF9wd3IsIHU4IHJhdGVfc3RhcnQsCi0JCQkJdTggcmF0ZV9lbmQpCi17Ci0JdTggcmF0ZTsKLQl1OCB3b3JkX251bSwgbmliYmxlX251bTsKLQl1OCB0bXBfbmliYmxlOwotCi0JZm9yIChyYXRlID0gcmF0ZV9zdGFydDsgcmF0ZSA8PSByYXRlX2VuZDsgcmF0ZSsrKSB7Ci0JCXdvcmRfbnVtID0gKHJhdGUgLSByYXRlX3N0YXJ0KSA+PiAyOwotCQluaWJibGVfbnVtID0gKHJhdGUgLSByYXRlX3N0YXJ0KSAmIDB4MzsKLQkJdG1wX25pYmJsZSA9IChwd3Jfb2Zmc2V0W3dvcmRfbnVtXSA+PiA0ICogbmliYmxlX251bSkgJiAweGY7Ci0KLQkJc3JvbV9tYXhbcmF0ZV0gPSB0bXBfbWF4X3B3ciAtIDIgKiB0bXBfbmliYmxlOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLXdsY19waHlfdHhwd3JfbnBoeV9wb19hcHBseSh1OCAqc3JvbV9tYXgsIHU4IHB3cl9vZmZzZXQsCi0JCQkgICAgdTggcmF0ZV9zdGFydCwgdTggcmF0ZV9lbmQpCi17Ci0JdTggcmF0ZTsKLQotCWZvciAocmF0ZSA9IHJhdGVfc3RhcnQ7IHJhdGUgPD0gcmF0ZV9lbmQ7IHJhdGUrKykgewotCQlzcm9tX21heFtyYXRlXSAtPSAyICogcHdyX29mZnNldDsKLQl9Ci19Ci0KLXZvaWQKLXdsY19waHlfb2ZkbV90b19tY3NfcG93ZXJzX25waHkodTggKnBvd2VyLCB1OCByYXRlX21jc19zdGFydCwKLQkJCQl1OCByYXRlX21jc19lbmQsIHU4IHJhdGVfb2ZkbV9zdGFydCkKLXsKLQl1OCByYXRlMSwgcmF0ZTI7Ci0KLQlyYXRlMiA9IHJhdGVfb2ZkbV9zdGFydDsKLQlmb3IgKHJhdGUxID0gcmF0ZV9tY3Nfc3RhcnQ7IHJhdGUxIDw9IHJhdGVfbWNzX2VuZCAtIDE7IHJhdGUxKyspIHsKLQkJcG93ZXJbcmF0ZTFdID0gcG93ZXJbcmF0ZTJdOwotCQlyYXRlMiArPSAocmF0ZTEgPT0gcmF0ZV9tY3Nfc3RhcnQpID8gMiA6IDE7Ci0JfQotCXBvd2VyW3JhdGVfbWNzX2VuZF0gPSBwb3dlcltyYXRlX21jc19lbmQgLSAxXTsKLX0KLQotdm9pZAotd2xjX3BoeV9tY3NfdG9fb2ZkbV9wb3dlcnNfbnBoeSh1OCAqcG93ZXIsIHU4IHJhdGVfb2ZkbV9zdGFydCwKLQkJCQl1OCByYXRlX29mZG1fZW5kLCB1OCByYXRlX21jc19zdGFydCkKLXsKLQl1OCByYXRlMSwgcmF0ZTI7Ci0KLQlmb3IgKHJhdGUxID0gcmF0ZV9vZmRtX3N0YXJ0LCByYXRlMiA9IHJhdGVfbWNzX3N0YXJ0OwotCSAgICAgcmF0ZTEgPD0gcmF0ZV9vZmRtX2VuZDsgcmF0ZTErKywgcmF0ZTIrKykgewotCQlwb3dlcltyYXRlMV0gPSBwb3dlcltyYXRlMl07Ci0JCWlmIChyYXRlMSA9PSByYXRlX29mZG1fc3RhcnQpCi0JCQlwb3dlclsrK3JhdGUxXSA9IHBvd2VyW3JhdGUyXTsKLQl9Ci19Ci0KLXZvaWQgd2xjX3BoeV90eHB3cl9hcHBseV9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXVpbnQgcmF0ZTEsIHJhdGUyLCBiYW5kX251bTsKLQl1OCB0bXBfYnc0MHBvID0gMCwgdG1wX2NkZHBvID0gMCwgdG1wX3N0YmNwbyA9IDA7Ci0JdTggdG1wX21heF9wd3IgPSAwOwotCXUxNiBwd3Jfb2Zmc2V0czFbMl0sICpwd3Jfb2Zmc2V0czIgPSBOVUxMOwotCXU4ICp0eF9zcm9tX21heF9yYXRlID0gTlVMTDsKLQotCWZvciAoYmFuZF9udW0gPSAwOyBiYW5kX251bSA8IChDSF8yR19HUk9VUCArIENIXzVHX0dST1VQKTsgYmFuZF9udW0rKykgewotCQlzd2l0Y2ggKGJhbmRfbnVtKSB7Ci0JCWNhc2UgMDoKLQotCQkJdG1wX21heF9wd3IgPSBtaW4ocGktPm5waHlfcHdyY3RybF9pbmZvWzBdLm1heF9wd3JfMmcsCi0JCQkJCSAgcGktPm5waHlfcHdyY3RybF9pbmZvWzFdLm1heF9wd3JfMmcpOwotCi0JCQlwd3Jfb2Zmc2V0czFbMF0gPSBwaS0+Y2NrMmdwbzsKLQkJCXdsY19waHlfdHhwd3JfbnBoeV9zcm9tX2NvbnZlcnQocGktPnR4X3Nyb21fbWF4X3JhdGVfMmcsCi0JCQkJCQkJcHdyX29mZnNldHMxLAotCQkJCQkJCXRtcF9tYXhfcHdyLAotCQkJCQkJCVRYUF9GSVJTVF9DQ0ssCi0JCQkJCQkJVFhQX0xBU1RfQ0NLKTsKLQotCQkJcHdyX29mZnNldHMxWzBdID0gKHUxNikgKHBpLT5vZmRtMmdwbyAmIDB4ZmZmZik7Ci0JCQlwd3Jfb2Zmc2V0czFbMV0gPQotCQkJICAgICh1MTYpIChwaS0+b2ZkbTJncG8gPj4gMTYpICYgMHhmZmZmOwotCi0JCQlwd3Jfb2Zmc2V0czIgPSBwaS0+bWNzMmdwbzsKLQotCQkJdG1wX2NkZHBvID0gcGktPmNkZDJncG87Ci0JCQl0bXBfc3RiY3BvID0gcGktPnN0YmMyZ3BvOwotCQkJdG1wX2J3NDBwbyA9IHBpLT5idzQwMmdwbzsKLQotCQkJdHhfc3JvbV9tYXhfcmF0ZSA9IHBpLT50eF9zcm9tX21heF9yYXRlXzJnOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQotCQkJdG1wX21heF9wd3IgPSBtaW4ocGktPm5waHlfcHdyY3RybF9pbmZvWzBdLm1heF9wd3JfNWdtLAotCQkJCQkgIHBpLT5ucGh5X3B3cmN0cmxfaW5mb1sxXS5tYXhfcHdyXzVnbSk7Ci0KLQkJCXB3cl9vZmZzZXRzMVswXSA9ICh1MTYpIChwaS0+b2ZkbTVncG8gJiAweGZmZmYpOwotCQkJcHdyX29mZnNldHMxWzFdID0KLQkJCSAgICAodTE2KSAocGktPm9mZG01Z3BvID4+IDE2KSAmIDB4ZmZmZjsKLQotCQkJcHdyX29mZnNldHMyID0gcGktPm1jczVncG87Ci0KLQkJCXRtcF9jZGRwbyA9IHBpLT5jZGQ1Z3BvOwotCQkJdG1wX3N0YmNwbyA9IHBpLT5zdGJjNWdwbzsKLQkJCXRtcF9idzQwcG8gPSBwaS0+Ync0MDVncG87Ci0KLQkJCXR4X3Nyb21fbWF4X3JhdGUgPSBwaS0+dHhfc3JvbV9tYXhfcmF0ZV81Z19taWQ7Ci0JCQlicmVhazsKLQkJY2FzZSAyOgotCi0JCQl0bXBfbWF4X3B3ciA9IG1pbihwaS0+bnBoeV9wd3JjdHJsX2luZm9bMF0ubWF4X3B3cl81Z2wsCi0JCQkJCSAgcGktPm5waHlfcHdyY3RybF9pbmZvWzFdLm1heF9wd3JfNWdsKTsKLQotCQkJcHdyX29mZnNldHMxWzBdID0gKHUxNikgKHBpLT5vZmRtNWdscG8gJiAweGZmZmYpOwotCQkJcHdyX29mZnNldHMxWzFdID0KLQkJCSAgICAodTE2KSAocGktPm9mZG01Z2xwbyA+PiAxNikgJiAweGZmZmY7Ci0KLQkJCXB3cl9vZmZzZXRzMiA9IHBpLT5tY3M1Z2xwbzsKLQotCQkJdG1wX2NkZHBvID0gcGktPmNkZDVnbHBvOwotCQkJdG1wX3N0YmNwbyA9IHBpLT5zdGJjNWdscG87Ci0JCQl0bXBfYnc0MHBvID0gcGktPmJ3NDA1Z2xwbzsKLQotCQkJdHhfc3JvbV9tYXhfcmF0ZSA9IHBpLT50eF9zcm9tX21heF9yYXRlXzVnX2xvdzsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0KLQkJCXRtcF9tYXhfcHdyID0gbWluKHBpLT5ucGh5X3B3cmN0cmxfaW5mb1swXS5tYXhfcHdyXzVnaCwKLQkJCQkJICBwaS0+bnBoeV9wd3JjdHJsX2luZm9bMV0ubWF4X3B3cl81Z2gpOwotCi0JCQlwd3Jfb2Zmc2V0czFbMF0gPSAodTE2KSAocGktPm9mZG01Z2hwbyAmIDB4ZmZmZik7Ci0JCQlwd3Jfb2Zmc2V0czFbMV0gPQotCQkJICAgICh1MTYpIChwaS0+b2ZkbTVnaHBvID4+IDE2KSAmIDB4ZmZmZjsKLQotCQkJcHdyX29mZnNldHMyID0gcGktPm1jczVnaHBvOwotCi0JCQl0bXBfY2RkcG8gPSBwaS0+Y2RkNWdocG87Ci0JCQl0bXBfc3RiY3BvID0gcGktPnN0YmM1Z2hwbzsKLQkJCXRtcF9idzQwcG8gPSBwaS0+Ync0MDVnaHBvOwotCi0JCQl0eF9zcm9tX21heF9yYXRlID0gcGktPnR4X3Nyb21fbWF4X3JhdGVfNWdfaGk7Ci0JCQlicmVhazsKLQkJfQotCi0JCXdsY19waHlfdHhwd3JfbnBoeV9zcm9tX2NvbnZlcnQodHhfc3JvbV9tYXhfcmF0ZSwgcHdyX29mZnNldHMxLAotCQkJCQkJdG1wX21heF9wd3IsIFRYUF9GSVJTVF9PRkRNLAotCQkJCQkJVFhQX0xBU1RfT0ZETSk7Ci0KLQkJd2xjX3BoeV9vZmRtX3RvX21jc19wb3dlcnNfbnBoeSh0eF9zcm9tX21heF9yYXRlLAotCQkJCQkJVFhQX0ZJUlNUX01DU18yMF9TSVNPLAotCQkJCQkJVFhQX0xBU1RfTUNTXzIwX1NJU08sCi0JCQkJCQlUWFBfRklSU1RfT0ZETSk7Ci0KLQkJd2xjX3BoeV90eHB3cl9ucGh5X3Nyb21fY29udmVydCh0eF9zcm9tX21heF9yYXRlLCBwd3Jfb2Zmc2V0czIsCi0JCQkJCQl0bXBfbWF4X3B3ciwKLQkJCQkJCVRYUF9GSVJTVF9NQ1NfMjBfQ0RELAotCQkJCQkJVFhQX0xBU1RfTUNTXzIwX0NERCk7Ci0KLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0KLQkJCXdsY19waHlfdHhwd3JfbnBoeV9wb19hcHBseSh0eF9zcm9tX21heF9yYXRlLCB0bXBfY2RkcG8sCi0JCQkJCQkgICAgVFhQX0ZJUlNUX01DU18yMF9DREQsCi0JCQkJCQkgICAgVFhQX0xBU1RfTUNTXzIwX0NERCk7Ci0JCX0KLQotCQl3bGNfcGh5X21jc190b19vZmRtX3Bvd2Vyc19ucGh5KHR4X3Nyb21fbWF4X3JhdGUsCi0JCQkJCQlUWFBfRklSU1RfT0ZETV8yMF9DREQsCi0JCQkJCQlUWFBfTEFTVF9PRkRNXzIwX0NERCwKLQkJCQkJCVRYUF9GSVJTVF9NQ1NfMjBfQ0REKTsKLQotCQl3bGNfcGh5X3R4cHdyX25waHlfc3JvbV9jb252ZXJ0KHR4X3Nyb21fbWF4X3JhdGUsIHB3cl9vZmZzZXRzMiwKLQkJCQkJCXRtcF9tYXhfcHdyLAotCQkJCQkJVFhQX0ZJUlNUX01DU18yMF9TVEJDLAotCQkJCQkJVFhQX0xBU1RfTUNTXzIwX1NUQkMpOwotCi0JCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCi0JCQl3bGNfcGh5X3R4cHdyX25waHlfcG9fYXBwbHkodHhfc3JvbV9tYXhfcmF0ZSwKLQkJCQkJCSAgICB0bXBfc3RiY3BvLAotCQkJCQkJICAgIFRYUF9GSVJTVF9NQ1NfMjBfU1RCQywKLQkJCQkJCSAgICBUWFBfTEFTVF9NQ1NfMjBfU1RCQyk7Ci0JCX0KLQotCQl3bGNfcGh5X3R4cHdyX25waHlfc3JvbV9jb252ZXJ0KHR4X3Nyb21fbWF4X3JhdGUsCi0JCQkJCQkmcHdyX29mZnNldHMyWzJdLCB0bXBfbWF4X3B3ciwKLQkJCQkJCVRYUF9GSVJTVF9NQ1NfMjBfU0RNLAotCQkJCQkJVFhQX0xBU1RfTUNTXzIwX1NETSk7Ci0KLQkJaWYgKE5QSFlfSVNfU1JPTV9SRUlOVEVSUFJFVCkgewotCi0JCQl3bGNfcGh5X3R4cHdyX25waHlfc3JvbV9jb252ZXJ0KHR4X3Nyb21fbWF4X3JhdGUsCi0JCQkJCQkJJnB3cl9vZmZzZXRzMls0XSwKLQkJCQkJCQl0bXBfbWF4X3B3ciwKLQkJCQkJCQlUWFBfRklSU1RfTUNTXzQwX1NJU08sCi0JCQkJCQkJVFhQX0xBU1RfTUNTXzQwX1NJU08pOwotCi0JCQl3bGNfcGh5X21jc190b19vZmRtX3Bvd2Vyc19ucGh5KHR4X3Nyb21fbWF4X3JhdGUsCi0JCQkJCQkJVFhQX0ZJUlNUX09GRE1fNDBfU0lTTywKLQkJCQkJCQlUWFBfTEFTVF9PRkRNXzQwX1NJU08sCi0JCQkJCQkJVFhQX0ZJUlNUX01DU180MF9TSVNPKTsKLQotCQkJd2xjX3BoeV90eHB3cl9ucGh5X3Nyb21fY29udmVydCh0eF9zcm9tX21heF9yYXRlLAotCQkJCQkJCSZwd3Jfb2Zmc2V0czJbNF0sCi0JCQkJCQkJdG1wX21heF9wd3IsCi0JCQkJCQkJVFhQX0ZJUlNUX01DU180MF9DREQsCi0JCQkJCQkJVFhQX0xBU1RfTUNTXzQwX0NERCk7Ci0KLQkJCXdsY19waHlfdHhwd3JfbnBoeV9wb19hcHBseSh0eF9zcm9tX21heF9yYXRlLCB0bXBfY2RkcG8sCi0JCQkJCQkgICAgVFhQX0ZJUlNUX01DU180MF9DREQsCi0JCQkJCQkgICAgVFhQX0xBU1RfTUNTXzQwX0NERCk7Ci0KLQkJCXdsY19waHlfbWNzX3RvX29mZG1fcG93ZXJzX25waHkodHhfc3JvbV9tYXhfcmF0ZSwKLQkJCQkJCQlUWFBfRklSU1RfT0ZETV80MF9DREQsCi0JCQkJCQkJVFhQX0xBU1RfT0ZETV80MF9DREQsCi0JCQkJCQkJVFhQX0ZJUlNUX01DU180MF9DREQpOwotCi0JCQl3bGNfcGh5X3R4cHdyX25waHlfc3JvbV9jb252ZXJ0KHR4X3Nyb21fbWF4X3JhdGUsCi0JCQkJCQkJJnB3cl9vZmZzZXRzMls0XSwKLQkJCQkJCQl0bXBfbWF4X3B3ciwKLQkJCQkJCQlUWFBfRklSU1RfTUNTXzQwX1NUQkMsCi0JCQkJCQkJVFhQX0xBU1RfTUNTXzQwX1NUQkMpOwotCi0JCQl3bGNfcGh5X3R4cHdyX25waHlfcG9fYXBwbHkodHhfc3JvbV9tYXhfcmF0ZSwKLQkJCQkJCSAgICB0bXBfc3RiY3BvLAotCQkJCQkJICAgIFRYUF9GSVJTVF9NQ1NfNDBfU1RCQywKLQkJCQkJCSAgICBUWFBfTEFTVF9NQ1NfNDBfU1RCQyk7Ci0KLQkJCXdsY19waHlfdHhwd3JfbnBoeV9zcm9tX2NvbnZlcnQodHhfc3JvbV9tYXhfcmF0ZSwKLQkJCQkJCQkmcHdyX29mZnNldHMyWzZdLAotCQkJCQkJCXRtcF9tYXhfcHdyLAotCQkJCQkJCVRYUF9GSVJTVF9NQ1NfNDBfU0RNLAotCQkJCQkJCVRYUF9MQVNUX01DU180MF9TRE0pOwotCQl9IGVsc2UgewotCi0JCQlmb3IgKHJhdGUxID0gVFhQX0ZJUlNUX09GRE1fNDBfU0lTTywgcmF0ZTIgPQotCQkJICAgICBUWFBfRklSU1RfT0ZETTsgcmF0ZTEgPD0gVFhQX0xBU1RfTUNTXzQwX1NETTsKLQkJCSAgICAgcmF0ZTErKywgcmF0ZTIrKykKLQkJCQl0eF9zcm9tX21heF9yYXRlW3JhdGUxXSA9Ci0JCQkJICAgIHR4X3Nyb21fbWF4X3JhdGVbcmF0ZTJdOwotCQl9Ci0KLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0JCQl3bGNfcGh5X3R4cHdyX25waHlfcG9fYXBwbHkodHhfc3JvbV9tYXhfcmF0ZSwKLQkJCQkJCSAgICB0bXBfYnc0MHBvLAotCQkJCQkJICAgIFRYUF9GSVJTVF9PRkRNXzQwX1NJU08sCi0JCQkJCQkgICAgVFhQX0xBU1RfTUNTXzQwX1NETSk7Ci0JCX0KLQotCQl0eF9zcm9tX21heF9yYXRlW1RYUF9NQ1NfMzJdID0KLQkJICAgIHR4X3Nyb21fbWF4X3JhdGVbVFhQX0ZJUlNUX01DU180MF9DRERdOwotCX0KLQotCXJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgd2xjX3BoeV90eHB3cl9zcm9tX3JlYWRfcHByX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JdTE2IGJ3NDBwbywgY2RkcG8sIHN0YmNwbywgYndkdXBwbzsKLQl1aW50IGJhbmRfbnVtOwotCi0JaWYgKHBpLT5zaC0+c3JvbXJldiA+PSA5KSB7Ci0KLQkJcmV0dXJuOwotCX0KLQotCWJ3NDBwbyA9ICh1MTYpIFBIWV9HRVRJTlRWQVIocGksICJidzQwcG8iKTsKLQlwaS0+Ync0MDJncG8gPSBidzQwcG8gJiAweGY7Ci0JcGktPmJ3NDA1Z3BvID0gKGJ3NDBwbyAmIDB4ZjApID4+IDQ7Ci0JcGktPmJ3NDA1Z2xwbyA9IChidzQwcG8gJiAweGYwMCkgPj4gODsKLQlwaS0+Ync0MDVnaHBvID0gKGJ3NDBwbyAmIDB4ZjAwMCkgPj4gMTI7Ci0KLQljZGRwbyA9ICh1MTYpIFBIWV9HRVRJTlRWQVIocGksICJjZGRwbyIpOwotCXBpLT5jZGQyZ3BvID0gY2RkcG8gJiAweGY7Ci0JcGktPmNkZDVncG8gPSAoY2RkcG8gJiAweGYwKSA+PiA0OwotCXBpLT5jZGQ1Z2xwbyA9IChjZGRwbyAmIDB4ZjAwKSA+PiA4OwotCXBpLT5jZGQ1Z2hwbyA9IChjZGRwbyAmIDB4ZjAwMCkgPj4gMTI7Ci0KLQlzdGJjcG8gPSAodTE2KSBQSFlfR0VUSU5UVkFSKHBpLCAic3RiY3BvIik7Ci0JcGktPnN0YmMyZ3BvID0gc3RiY3BvICYgMHhmOwotCXBpLT5zdGJjNWdwbyA9IChzdGJjcG8gJiAweGYwKSA+PiA0OwotCXBpLT5zdGJjNWdscG8gPSAoc3RiY3BvICYgMHhmMDApID4+IDg7Ci0JcGktPnN0YmM1Z2hwbyA9IChzdGJjcG8gJiAweGYwMDApID4+IDEyOwotCi0JYndkdXBwbyA9ICh1MTYpIFBIWV9HRVRJTlRWQVIocGksICJid2R1cHBvIik7Ci0JcGktPmJ3ZHVwMmdwbyA9IGJ3ZHVwcG8gJiAweGY7Ci0JcGktPmJ3ZHVwNWdwbyA9IChid2R1cHBvICYgMHhmMCkgPj4gNDsKLQlwaS0+YndkdXA1Z2xwbyA9IChid2R1cHBvICYgMHhmMDApID4+IDg7Ci0JcGktPmJ3ZHVwNWdocG8gPSAoYndkdXBwbyAmIDB4ZjAwMCkgPj4gMTI7Ci0KLQlmb3IgKGJhbmRfbnVtID0gMDsgYmFuZF9udW0gPCAoQ0hfMkdfR1JPVVAgKyBDSF81R19HUk9VUCk7IGJhbmRfbnVtKyspIHsKLQkJc3dpdGNoIChiYW5kX251bSkgewotCQljYXNlIDA6Ci0KLQkJCXBpLT5ucGh5X3R4cGlkMmdbUEhZX0NPUkVfMF0gPQotCQkJICAgICh1OCkgUEhZX0dFVElOVFZBUihwaSwgInR4cGlkMmdhMCIpOwotCQkJcGktPm5waHlfdHhwaWQyZ1tQSFlfQ09SRV8xXSA9Ci0JCQkgICAgKHU4KSBQSFlfR0VUSU5UVkFSKHBpLCAidHhwaWQyZ2ExIik7Ci0JCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bUEhZX0NPUkVfMF0ubWF4X3B3cl8yZyA9Ci0JCQkgICAgKHM4KSBQSFlfR0VUSU5UVkFSKHBpLCAibWF4cDJnYTAiKTsKLQkJCXBpLT5ucGh5X3B3cmN0cmxfaW5mb1tQSFlfQ09SRV8xXS5tYXhfcHdyXzJnID0KLQkJCSAgICAoczgpIFBIWV9HRVRJTlRWQVIocGksICJtYXhwMmdhMSIpOwotCQkJcGktPm5waHlfcHdyY3RybF9pbmZvW1BIWV9DT1JFXzBdLnB3cmRldF8yZ19hMSA9Ci0JCQkgICAgKHMxNikgUEhZX0dFVElOVFZBUihwaSwgInBhMmd3MGEwIik7Ci0JCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bUEhZX0NPUkVfMV0ucHdyZGV0XzJnX2ExID0KLQkJCSAgICAoczE2KSBQSFlfR0VUSU5UVkFSKHBpLCAicGEyZ3cwYTEiKTsKLQkJCXBpLT5ucGh5X3B3cmN0cmxfaW5mb1tQSFlfQ09SRV8wXS5wd3JkZXRfMmdfYjAgPQotCQkJICAgIChzMTYpIFBIWV9HRVRJTlRWQVIocGksICJwYTJndzFhMCIpOwotCQkJcGktPm5waHlfcHdyY3RybF9pbmZvW1BIWV9DT1JFXzFdLnB3cmRldF8yZ19iMCA9Ci0JCQkgICAgKHMxNikgUEhZX0dFVElOVFZBUihwaSwgInBhMmd3MWExIik7Ci0JCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bUEhZX0NPUkVfMF0ucHdyZGV0XzJnX2IxID0KLQkJCSAgICAoczE2KSBQSFlfR0VUSU5UVkFSKHBpLCAicGEyZ3cyYTAiKTsKLQkJCXBpLT5ucGh5X3B3cmN0cmxfaW5mb1tQSFlfQ09SRV8xXS5wd3JkZXRfMmdfYjEgPQotCQkJICAgIChzMTYpIFBIWV9HRVRJTlRWQVIocGksICJwYTJndzJhMSIpOwotCQkJcGktPm5waHlfcHdyY3RybF9pbmZvW1BIWV9DT1JFXzBdLmlkbGVfdGFyZ18yZyA9Ci0JCQkgICAgKHM4KSBQSFlfR0VUSU5UVkFSKHBpLCAiaXR0MmdhMCIpOwotCQkJcGktPm5waHlfcHdyY3RybF9pbmZvW1BIWV9DT1JFXzFdLmlkbGVfdGFyZ18yZyA9Ci0JCQkgICAgKHM4KSBQSFlfR0VUSU5UVkFSKHBpLCAiaXR0MmdhMSIpOwotCi0JCQlwaS0+Y2NrMmdwbyA9ICh1MTYpIFBIWV9HRVRJTlRWQVIocGksICJjY2syZ3BvIik7Ci0KLQkJCXBpLT5vZmRtMmdwbyA9ICh1MzIpIFBIWV9HRVRJTlRWQVIocGksICJvZmRtMmdwbyIpOwotCi0JCQlwaS0+bWNzMmdwb1swXSA9ICh1MTYpIFBIWV9HRVRJTlRWQVIocGksICJtY3MyZ3BvMCIpOwotCQkJcGktPm1jczJncG9bMV0gPSAodTE2KSBQSFlfR0VUSU5UVkFSKHBpLCAibWNzMmdwbzEiKTsKLQkJCXBpLT5tY3MyZ3BvWzJdID0gKHUxNikgUEhZX0dFVElOVFZBUihwaSwgIm1jczJncG8yIik7Ci0JCQlwaS0+bWNzMmdwb1szXSA9ICh1MTYpIFBIWV9HRVRJTlRWQVIocGksICJtY3MyZ3BvMyIpOwotCQkJcGktPm1jczJncG9bNF0gPSAodTE2KSBQSFlfR0VUSU5UVkFSKHBpLCAibWNzMmdwbzQiKTsKLQkJCXBpLT5tY3MyZ3BvWzVdID0gKHUxNikgUEhZX0dFVElOVFZBUihwaSwgIm1jczJncG81Iik7Ci0JCQlwaS0+bWNzMmdwb1s2XSA9ICh1MTYpIFBIWV9HRVRJTlRWQVIocGksICJtY3MyZ3BvNiIpOwotCQkJcGktPm1jczJncG9bN10gPSAodTE2KSBQSFlfR0VUSU5UVkFSKHBpLCAibWNzMmdwbzciKTsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0KLQkJCXBpLT5ucGh5X3R4cGlkNWdbUEhZX0NPUkVfMF0gPQotCQkJICAgICh1OCkgUEhZX0dFVElOVFZBUihwaSwgInR4cGlkNWdhMCIpOwotCQkJcGktPm5waHlfdHhwaWQ1Z1tQSFlfQ09SRV8xXSA9Ci0JCQkgICAgKHU4KSBQSFlfR0VUSU5UVkFSKHBpLCAidHhwaWQ1Z2ExIik7Ci0JCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bUEhZX0NPUkVfMF0ubWF4X3B3cl81Z20gPQotCQkJICAgIChzOCkgUEhZX0dFVElOVFZBUihwaSwgIm1heHA1Z2EwIik7Ci0JCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bUEhZX0NPUkVfMV0ubWF4X3B3cl81Z20gPQotCQkJICAgIChzOCkgUEhZX0dFVElOVFZBUihwaSwgIm1heHA1Z2ExIik7Ci0JCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bUEhZX0NPUkVfMF0ucHdyZGV0XzVnbV9hMSA9Ci0JCQkgICAgKHMxNikgUEhZX0dFVElOVFZBUihwaSwgInBhNWd3MGEwIik7Ci0JCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bUEhZX0NPUkVfMV0ucHdyZGV0XzVnbV9hMSA9Ci0JCQkgICAgKHMxNikgUEhZX0dFVElOVFZBUihwaSwgInBhNWd3MGExIik7Ci0JCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bUEhZX0NPUkVfMF0ucHdyZGV0XzVnbV9iMCA9Ci0JCQkgICAgKHMxNikgUEhZX0dFVElOVFZBUihwaSwgInBhNWd3MWEwIik7Ci0JCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bUEhZX0NPUkVfMV0ucHdyZGV0XzVnbV9iMCA9Ci0JCQkgICAgKHMxNikgUEhZX0dFVElOVFZBUihwaSwgInBhNWd3MWExIik7Ci0JCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bUEhZX0NPUkVfMF0ucHdyZGV0XzVnbV9iMSA9Ci0JCQkgICAgKHMxNikgUEhZX0dFVElOVFZBUihwaSwgInBhNWd3MmEwIik7Ci0JCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bUEhZX0NPUkVfMV0ucHdyZGV0XzVnbV9iMSA9Ci0JCQkgICAgKHMxNikgUEhZX0dFVElOVFZBUihwaSwgInBhNWd3MmExIik7Ci0JCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bUEhZX0NPUkVfMF0uaWRsZV90YXJnXzVnbSA9Ci0JCQkgICAgKHM4KSBQSFlfR0VUSU5UVkFSKHBpLCAiaXR0NWdhMCIpOwotCQkJcGktPm5waHlfcHdyY3RybF9pbmZvW1BIWV9DT1JFXzFdLmlkbGVfdGFyZ181Z20gPQotCQkJICAgIChzOCkgUEhZX0dFVElOVFZBUihwaSwgIml0dDVnYTEiKTsKLQotCQkJcGktPm9mZG01Z3BvID0gKHUzMikgUEhZX0dFVElOVFZBUihwaSwgIm9mZG01Z3BvIik7Ci0KLQkJCXBpLT5tY3M1Z3BvWzBdID0gKHUxNikgUEhZX0dFVElOVFZBUihwaSwgIm1jczVncG8wIik7Ci0JCQlwaS0+bWNzNWdwb1sxXSA9ICh1MTYpIFBIWV9HRVRJTlRWQVIocGksICJtY3M1Z3BvMSIpOwotCQkJcGktPm1jczVncG9bMl0gPSAodTE2KSBQSFlfR0VUSU5UVkFSKHBpLCAibWNzNWdwbzIiKTsKLQkJCXBpLT5tY3M1Z3BvWzNdID0gKHUxNikgUEhZX0dFVElOVFZBUihwaSwgIm1jczVncG8zIik7Ci0JCQlwaS0+bWNzNWdwb1s0XSA9ICh1MTYpIFBIWV9HRVRJTlRWQVIocGksICJtY3M1Z3BvNCIpOwotCQkJcGktPm1jczVncG9bNV0gPSAodTE2KSBQSFlfR0VUSU5UVkFSKHBpLCAibWNzNWdwbzUiKTsKLQkJCXBpLT5tY3M1Z3BvWzZdID0gKHUxNikgUEhZX0dFVElOVFZBUihwaSwgIm1jczVncG82Iik7Ci0JCQlwaS0+bWNzNWdwb1s3XSA9ICh1MTYpIFBIWV9HRVRJTlRWQVIocGksICJtY3M1Z3BvNyIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQotCQkJcGktPm5waHlfdHhwaWQ1Z2xbMF0gPQotCQkJICAgICh1OCkgUEhZX0dFVElOVFZBUihwaSwgInR4cGlkNWdsYTAiKTsKLQkJCXBpLT5ucGh5X3R4cGlkNWdsWzFdID0KLQkJCSAgICAodTgpIFBIWV9HRVRJTlRWQVIocGksICJ0eHBpZDVnbGExIik7Ci0JCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bMF0ubWF4X3B3cl81Z2wgPQotCQkJICAgIChzOCkgUEhZX0dFVElOVFZBUihwaSwgIm1heHA1Z2xhMCIpOwotCQkJcGktPm5waHlfcHdyY3RybF9pbmZvWzFdLm1heF9wd3JfNWdsID0KLQkJCSAgICAoczgpIFBIWV9HRVRJTlRWQVIocGksICJtYXhwNWdsYTEiKTsKLQkJCXBpLT5ucGh5X3B3cmN0cmxfaW5mb1swXS5wd3JkZXRfNWdsX2ExID0KLQkJCSAgICAoczE2KSBQSFlfR0VUSU5UVkFSKHBpLCAicGE1Z2x3MGEwIik7Ci0JCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bMV0ucHdyZGV0XzVnbF9hMSA9Ci0JCQkgICAgKHMxNikgUEhZX0dFVElOVFZBUihwaSwgInBhNWdsdzBhMSIpOwotCQkJcGktPm5waHlfcHdyY3RybF9pbmZvWzBdLnB3cmRldF81Z2xfYjAgPQotCQkJICAgIChzMTYpIFBIWV9HRVRJTlRWQVIocGksICJwYTVnbHcxYTAiKTsKLQkJCXBpLT5ucGh5X3B3cmN0cmxfaW5mb1sxXS5wd3JkZXRfNWdsX2IwID0KLQkJCSAgICAoczE2KSBQSFlfR0VUSU5UVkFSKHBpLCAicGE1Z2x3MWExIik7Ci0JCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bMF0ucHdyZGV0XzVnbF9iMSA9Ci0JCQkgICAgKHMxNikgUEhZX0dFVElOVFZBUihwaSwgInBhNWdsdzJhMCIpOwotCQkJcGktPm5waHlfcHdyY3RybF9pbmZvWzFdLnB3cmRldF81Z2xfYjEgPQotCQkJICAgIChzMTYpIFBIWV9HRVRJTlRWQVIocGksICJwYTVnbHcyYTEiKTsKLQkJCXBpLT5ucGh5X3B3cmN0cmxfaW5mb1swXS5pZGxlX3RhcmdfNWdsID0gMDsKLQkJCXBpLT5ucGh5X3B3cmN0cmxfaW5mb1sxXS5pZGxlX3RhcmdfNWdsID0gMDsKLQotCQkJcGktPm9mZG01Z2xwbyA9ICh1MzIpIFBIWV9HRVRJTlRWQVIocGksICJvZmRtNWdscG8iKTsKLQotCQkJcGktPm1jczVnbHBvWzBdID0KLQkJCSAgICAodTE2KSBQSFlfR0VUSU5UVkFSKHBpLCAibWNzNWdscG8wIik7Ci0JCQlwaS0+bWNzNWdscG9bMV0gPQotCQkJICAgICh1MTYpIFBIWV9HRVRJTlRWQVIocGksICJtY3M1Z2xwbzEiKTsKLQkJCXBpLT5tY3M1Z2xwb1syXSA9Ci0JCQkgICAgKHUxNikgUEhZX0dFVElOVFZBUihwaSwgIm1jczVnbHBvMiIpOwotCQkJcGktPm1jczVnbHBvWzNdID0KLQkJCSAgICAodTE2KSBQSFlfR0VUSU5UVkFSKHBpLCAibWNzNWdscG8zIik7Ci0JCQlwaS0+bWNzNWdscG9bNF0gPQotCQkJICAgICh1MTYpIFBIWV9HRVRJTlRWQVIocGksICJtY3M1Z2xwbzQiKTsKLQkJCXBpLT5tY3M1Z2xwb1s1XSA9Ci0JCQkgICAgKHUxNikgUEhZX0dFVElOVFZBUihwaSwgIm1jczVnbHBvNSIpOwotCQkJcGktPm1jczVnbHBvWzZdID0KLQkJCSAgICAodTE2KSBQSFlfR0VUSU5UVkFSKHBpLCAibWNzNWdscG82Iik7Ci0JCQlwaS0+bWNzNWdscG9bN10gPQotCQkJICAgICh1MTYpIFBIWV9HRVRJTlRWQVIocGksICJtY3M1Z2xwbzciKTsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0KLQkJCXBpLT5ucGh5X3R4cGlkNWdoWzBdID0KLQkJCSAgICAodTgpIFBIWV9HRVRJTlRWQVIocGksICJ0eHBpZDVnaGEwIik7Ci0JCQlwaS0+bnBoeV90eHBpZDVnaFsxXSA9Ci0JCQkgICAgKHU4KSBQSFlfR0VUSU5UVkFSKHBpLCAidHhwaWQ1Z2hhMSIpOwotCQkJcGktPm5waHlfcHdyY3RybF9pbmZvWzBdLm1heF9wd3JfNWdoID0KLQkJCSAgICAoczgpIFBIWV9HRVRJTlRWQVIocGksICJtYXhwNWdoYTAiKTsKLQkJCXBpLT5ucGh5X3B3cmN0cmxfaW5mb1sxXS5tYXhfcHdyXzVnaCA9Ci0JCQkgICAgKHM4KSBQSFlfR0VUSU5UVkFSKHBpLCAibWF4cDVnaGExIik7Ci0JCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bMF0ucHdyZGV0XzVnaF9hMSA9Ci0JCQkgICAgKHMxNikgUEhZX0dFVElOVFZBUihwaSwgInBhNWdodzBhMCIpOwotCQkJcGktPm5waHlfcHdyY3RybF9pbmZvWzFdLnB3cmRldF81Z2hfYTEgPQotCQkJICAgIChzMTYpIFBIWV9HRVRJTlRWQVIocGksICJwYTVnaHcwYTEiKTsKLQkJCXBpLT5ucGh5X3B3cmN0cmxfaW5mb1swXS5wd3JkZXRfNWdoX2IwID0KLQkJCSAgICAoczE2KSBQSFlfR0VUSU5UVkFSKHBpLCAicGE1Z2h3MWEwIik7Ci0JCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bMV0ucHdyZGV0XzVnaF9iMCA9Ci0JCQkgICAgKHMxNikgUEhZX0dFVElOVFZBUihwaSwgInBhNWdodzFhMSIpOwotCQkJcGktPm5waHlfcHdyY3RybF9pbmZvWzBdLnB3cmRldF81Z2hfYjEgPQotCQkJICAgIChzMTYpIFBIWV9HRVRJTlRWQVIocGksICJwYTVnaHcyYTAiKTsKLQkJCXBpLT5ucGh5X3B3cmN0cmxfaW5mb1sxXS5wd3JkZXRfNWdoX2IxID0KLQkJCSAgICAoczE2KSBQSFlfR0VUSU5UVkFSKHBpLCAicGE1Z2h3MmExIik7Ci0JCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bMF0uaWRsZV90YXJnXzVnaCA9IDA7Ci0JCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bMV0uaWRsZV90YXJnXzVnaCA9IDA7Ci0KLQkJCXBpLT5vZmRtNWdocG8gPSAodTMyKSBQSFlfR0VUSU5UVkFSKHBpLCAib2ZkbTVnaHBvIik7Ci0KLQkJCXBpLT5tY3M1Z2hwb1swXSA9Ci0JCQkgICAgKHUxNikgUEhZX0dFVElOVFZBUihwaSwgIm1jczVnaHBvMCIpOwotCQkJcGktPm1jczVnaHBvWzFdID0KLQkJCSAgICAodTE2KSBQSFlfR0VUSU5UVkFSKHBpLCAibWNzNWdocG8xIik7Ci0JCQlwaS0+bWNzNWdocG9bMl0gPQotCQkJICAgICh1MTYpIFBIWV9HRVRJTlRWQVIocGksICJtY3M1Z2hwbzIiKTsKLQkJCXBpLT5tY3M1Z2hwb1szXSA9Ci0JCQkgICAgKHUxNikgUEhZX0dFVElOVFZBUihwaSwgIm1jczVnaHBvMyIpOwotCQkJcGktPm1jczVnaHBvWzRdID0KLQkJCSAgICAodTE2KSBQSFlfR0VUSU5UVkFSKHBpLCAibWNzNWdocG80Iik7Ci0JCQlwaS0+bWNzNWdocG9bNV0gPQotCQkJICAgICh1MTYpIFBIWV9HRVRJTlRWQVIocGksICJtY3M1Z2hwbzUiKTsKLQkJCXBpLT5tY3M1Z2hwb1s2XSA9Ci0JCQkgICAgKHUxNikgUEhZX0dFVElOVFZBUihwaSwgIm1jczVnaHBvNiIpOwotCQkJcGktPm1jczVnaHBvWzddID0KLQkJCSAgICAodTE2KSBQSFlfR0VUSU5UVkFSKHBpLCAibWNzNWdocG83Iik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXdsY19waHlfdHhwd3JfYXBwbHlfbnBoeShwaSk7Ci19Ci0KLXN0YXRpYyBib29sIHdsY19waHlfdHhwd3Jfc3JvbV9yZWFkX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0KLQlwaS0+YW50c3dpdGNoID0gKHU4KSBQSFlfR0VUSU5UVkFSKHBpLCAiYW50c3dpdGNoIik7Ci0JcGktPmFhMmcgPSAodTgpIFBIWV9HRVRJTlRWQVIocGksICJhYTJnIik7Ci0JcGktPmFhNWcgPSAodTgpIFBIWV9HRVRJTlRWQVIocGksICJhYTVnIik7Ci0KLQlwaS0+c3JvbV9mZW0yZy50c3NpcG9zID0gKHU4KSBQSFlfR0VUSU5UVkFSKHBpLCAidHNzaXBvczJnIik7Ci0JcGktPnNyb21fZmVtMmcuZXh0cGFnYWluID0gKHU4KSBQSFlfR0VUSU5UVkFSKHBpLCAiZXh0cGFnYWluMmciKTsKLQlwaS0+c3JvbV9mZW0yZy5wZGV0cmFuZ2UgPSAodTgpIFBIWV9HRVRJTlRWQVIocGksICJwZGV0cmFuZ2UyZyIpOwotCXBpLT5zcm9tX2ZlbTJnLnRyaXNvID0gKHU4KSBQSFlfR0VUSU5UVkFSKHBpLCAidHJpc28yZyIpOwotCXBpLT5zcm9tX2ZlbTJnLmFudHN3Y3RybGx1dCA9ICh1OCkgUEhZX0dFVElOVFZBUihwaSwgImFudHN3Y3RsMmciKTsKLQotCXBpLT5zcm9tX2ZlbTVnLnRzc2lwb3MgPSAodTgpIFBIWV9HRVRJTlRWQVIocGksICJ0c3NpcG9zNWciKTsKLQlwaS0+c3JvbV9mZW01Zy5leHRwYWdhaW4gPSAodTgpIFBIWV9HRVRJTlRWQVIocGksICJleHRwYWdhaW41ZyIpOwotCXBpLT5zcm9tX2ZlbTVnLnBkZXRyYW5nZSA9ICh1OCkgUEhZX0dFVElOVFZBUihwaSwgInBkZXRyYW5nZTVnIik7Ci0JcGktPnNyb21fZmVtNWcudHJpc28gPSAodTgpIFBIWV9HRVRJTlRWQVIocGksICJ0cmlzbzVnIik7Ci0JaWYgKFBIWV9HRVRWQVIocGksICJhbnRzd2N0bDVnIikpIHsKLQotCQlwaS0+c3JvbV9mZW01Zy5hbnRzd2N0cmxsdXQgPQotCQkgICAgKHU4KSBQSFlfR0VUSU5UVkFSKHBpLCAiYW50c3djdGw1ZyIpOwotCX0gZWxzZSB7Ci0KLQkJcGktPnNyb21fZmVtNWcuYW50c3djdHJsbHV0ID0KLQkJICAgICh1OCkgUEhZX0dFVElOVFZBUihwaSwgImFudHN3Y3RsMmciKTsKLQl9Ci0KLQl3bGNfcGh5X3R4cG93ZXJfaXBhX3VwZChwaSk7Ci0KLQlwaS0+cGh5X3R4Y29yZV9kaXNhYmxlX3RlbXAgPSAoczE2KSBQSFlfR0VUSU5UVkFSKHBpLCAidGVtcHRocmVzaCIpOwotCWlmIChwaS0+cGh5X3R4Y29yZV9kaXNhYmxlX3RlbXAgPT0gMCkgewotCQlwaS0+cGh5X3R4Y29yZV9kaXNhYmxlX3RlbXAgPSBQSFlfQ0hBSU5fVFhfRElTQUJMRV9URU1QOwotCX0KLQotCXBpLT5waHlfdGVtcHNlbnNlX29mZnNldCA9IChzOCkgUEhZX0dFVElOVFZBUihwaSwgInRlbXBvZmZzZXQiKTsKLQlpZiAocGktPnBoeV90ZW1wc2Vuc2Vfb2Zmc2V0ICE9IDApIHsKLQkJaWYgKHBpLT5waHlfdGVtcHNlbnNlX29mZnNldCA+Ci0JCSAgICAoTlBIWV9TUk9NX1RFTVBTSElGVCArIE5QSFlfU1JPTV9NQVhURU1QT0ZGU0VUKSkgewotCQkJcGktPnBoeV90ZW1wc2Vuc2Vfb2Zmc2V0ID0gTlBIWV9TUk9NX01BWFRFTVBPRkZTRVQ7Ci0JCX0gZWxzZSBpZiAocGktPnBoeV90ZW1wc2Vuc2Vfb2Zmc2V0IDwgKE5QSFlfU1JPTV9URU1QU0hJRlQgKwotCQkJCQkJICAgIE5QSFlfU1JPTV9NSU5URU1QT0ZGU0VUKSkgewotCQkJcGktPnBoeV90ZW1wc2Vuc2Vfb2Zmc2V0ID0gTlBIWV9TUk9NX01JTlRFTVBPRkZTRVQ7Ci0JCX0gZWxzZSB7Ci0JCQlwaS0+cGh5X3RlbXBzZW5zZV9vZmZzZXQgLT0gTlBIWV9TUk9NX1RFTVBTSElGVDsKLQkJfQotCX0KLQotCXBpLT5waHlfdHhjb3JlX2VuYWJsZV90ZW1wID0KLQkgICAgcGktPnBoeV90eGNvcmVfZGlzYWJsZV90ZW1wIC0gUEhZX0hZU1RFUkVTSVNfREVMVEFURU1QOwotCi0JcGktPnBoeWNhbF90ZW1wZGVsdGEgPSAodTgpIFBIWV9HRVRJTlRWQVIocGksICJwaHljYWxfdGVtcGRlbHRhIik7Ci0JaWYgKHBpLT5waHljYWxfdGVtcGRlbHRhID4gTlBIWV9DQUxfTUFYVEVNUERFTFRBKSB7Ci0JCXBpLT5waHljYWxfdGVtcGRlbHRhID0gMDsKLQl9Ci0KLQl3bGNfcGh5X3R4cHdyX3Nyb21fcmVhZF9wcHJfbnBoeShwaSk7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCB3bGNfcGh5X3R4cG93ZXJfcmVjYWxjX3RhcmdldF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXU4IHR4X3B3cl9jdHJsX3N0YXRlOwotCXdsY19waHlfdHhwd3JfbGltaXRfdG9fdGJsX25waHkocGkpOwotCXdsY19waHlfdHhwd3JjdHJsX3B3cl9zZXR1cF9ucGh5KHBpKTsKLQotCXR4X3B3cl9jdHJsX3N0YXRlID0gcGktPm5waHlfdHhwd3JjdHJsOwotCi0JaWYgKEQxMVJFVl9JUyhwaS0+c2gtPmNvcmVyZXYsIDExKSB8fCBEMTFSRVZfSVMocGktPnNoLT5jb3JlcmV2LCAxMikpIHsKLQkJd2xhcGlfYm1hY19tY3RybChwaS0+c2gtPnBoeXNoaW0sIE1DVExfUEhZTE9DSywgTUNUTF9QSFlMT0NLKTsKLQkJKHZvaWQpUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKTsKLQkJdWRlbGF5KDEpOwotCX0KLQotCXdsY19waHlfdHhwd3JjdHJsX2VuYWJsZV9ucGh5KHBpLCB0eF9wd3JfY3RybF9zdGF0ZSk7Ci0KLQlpZiAoRDExUkVWX0lTKHBpLT5zaC0+Y29yZXJldiwgMTEpIHx8IEQxMVJFVl9JUyhwaS0+c2gtPmNvcmVyZXYsIDEyKSkKLQkJd2xhcGlfYm1hY19tY3RybChwaS0+c2gtPnBoeXNoaW0sIE1DVExfUEhZTE9DSywgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsY19waHlfdHhwd3JjdHJsX2NvZWZmX3NldHVwX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JdTMyIGlkeDsKLQl1MTYgaXFsb0NhbGJ1Zls3XTsKLQl1MzIgaXFjb21wLCBsb2NvbXAsIGN1cnJfbG9jb21wOwotCXM4IGxvY29tcF9pLCBsb2NvbXBfcTsKLQlzOCBjdXJyX2xvY29tcF9pLCBjdXJyX2xvY29tcF9xOwotCXUzMiB0YmxfaWQsIHRibF9sZW4sIHRibF9vZmZzZXQ7Ci0JdTMyIHJlZ3ZhbFsxMjhdOwotCi0JaWYgKHBpLT5waHloYW5nX2F2b2lkKQotCQl3bGNfcGh5X3N0YXlfaW5fY2FycmllcnNlYXJjaF9ucGh5KHBpLCB0cnVlKTsKLQotCXdsY19waHlfdGFibGVfcmVhZF9ucGh5KHBpLCAxNSwgNywgODAsIDE2LCBpcWxvQ2FsYnVmKTsKLQotCXRibF9sZW4gPSAxMjg7Ci0JdGJsX29mZnNldCA9IDMyMDsKLQlmb3IgKHRibF9pZCA9IE5QSFlfVEJMX0lEX0NPUkUxVFhQV1JDVEw7Ci0JICAgICB0YmxfaWQgPD0gTlBIWV9UQkxfSURfQ09SRTJUWFBXUkNUTDsgdGJsX2lkKyspIHsKLQkJaXFjb21wID0KLQkJICAgICh0YmxfaWQgPT0KLQkJICAgICAyNikgPyAoKCh1MzIpIChpcWxvQ2FsYnVmWzBdICYgMHgzZmYpKSA8PCAxMCkgfAotCQkgICAgKGlxbG9DYWxidWZbMV0gJiAweDNmZikKLQkJICAgIDogKCgodTMyKSAoaXFsb0NhbGJ1ZlsyXSAmIDB4M2ZmKSkgPDwgMTApIHwKLQkJICAgIChpcWxvQ2FsYnVmWzNdICYgMHgzZmYpOwotCi0JCWZvciAoaWR4ID0gMDsgaWR4IDwgdGJsX2xlbjsgaWR4KyspIHsKLQkJCXJlZ3ZhbFtpZHhdID0gaXFjb21wOwotCQl9Ci0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgdGJsX2lkLCB0YmxfbGVuLCB0Ymxfb2Zmc2V0LCAzMiwKLQkJCQkJIHJlZ3ZhbCk7Ci0JfQotCi0JdGJsX29mZnNldCA9IDQ0ODsKLQlmb3IgKHRibF9pZCA9IE5QSFlfVEJMX0lEX0NPUkUxVFhQV1JDVEw7Ci0JICAgICB0YmxfaWQgPD0gTlBIWV9UQkxfSURfQ09SRTJUWFBXUkNUTDsgdGJsX2lkKyspIHsKLQotCQlsb2NvbXAgPQotCQkgICAgKHUzMikgKCh0YmxfaWQgPT0gMjYpID8gaXFsb0NhbGJ1Zls1XSA6IGlxbG9DYWxidWZbNl0pOwotCQlsb2NvbXBfaSA9IChzOCkgKChsb2NvbXAgPj4gOCkgJiAweGZmKTsKLQkJbG9jb21wX3EgPSAoczgpICgobG9jb21wKSAmIDB4ZmYpOwotCQlmb3IgKGlkeCA9IDA7IGlkeCA8IHRibF9sZW47IGlkeCsrKSB7Ci0JCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJCQljdXJyX2xvY29tcF9pID0gbG9jb21wX2k7Ci0JCQkJY3Vycl9sb2NvbXBfcSA9IGxvY29tcF9xOwotCQkJfSBlbHNlIHsKLQkJCQljdXJyX2xvY29tcF9pID0gKHM4KSAoKGxvY29tcF9pICoKLQkJCQkJCQkgbnBoeV90cGNfbG9zY2FsZVtpZHhdICsKLQkJCQkJCQkgMTI4KSA+PiA4KTsKLQkJCQljdXJyX2xvY29tcF9xID0KLQkJCQkgICAgKHM4KSAoKGxvY29tcF9xICogbnBoeV90cGNfbG9zY2FsZVtpZHhdICsKLQkJCQkJICAgICAxMjgpID4+IDgpOwotCQkJfQotCQkJY3Vycl9sb2NvbXAgPSAodTMyKSAoKGN1cnJfbG9jb21wX2kgJiAweGZmKSA8PCA4KTsKLQkJCWN1cnJfbG9jb21wIHw9ICh1MzIpIChjdXJyX2xvY29tcF9xICYgMHhmZik7Ci0JCQlyZWd2YWxbaWR4XSA9IGN1cnJfbG9jb21wOwotCQl9Ci0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgdGJsX2lkLCB0YmxfbGVuLCB0Ymxfb2Zmc2V0LCAzMiwKLQkJCQkJIHJlZ3ZhbCk7Ci0JfQotCi0JaWYgKE5SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDIpKSB7Ci0KLQkJd2xhcGlfYm1hY193cml0ZV9zaG0ocGktPnNoLT5waHlzaGltLCBNX0NVUlJfSURYMSwgMHhGRkZGKTsKLQkJd2xhcGlfYm1hY193cml0ZV9zaG0ocGktPnNoLT5waHlzaGltLCBNX0NVUlJfSURYMiwgMHhGRkZGKTsKLQl9Ci0KLQlpZiAocGktPnBoeWhhbmdfYXZvaWQpCi0JCXdsY19waHlfc3RheV9pbl9jYXJyaWVyc2VhcmNoX25waHkocGksIGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQgd2xjX3BoeV9pcGFfaW50ZXJuYWxfdHNzaV9zZXR1cF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXU4IGNvcmU7Ci0KLQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQkJZm9yIChjb3JlID0gMDsgY29yZSA8IHBpLT5wdWJwaS5waHlfY29yZW51bTsgY29yZSsrKSB7Ci0JCQlpZiAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJCVdSSVRFX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLCBjb3JlLAotCQkJCQkJIFRYX1NTSV9NQVNURVIsIDB4NSk7Ci0JCQkJV1JJVEVfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIGNvcmUsCi0JCQkJCQkgVFhfU1NJX01VWCwgMHhlKTsKLQotCQkJCWlmIChwaS0+cHVicGkucmFkaW9yZXYgIT0gNSkKLQkJCQkJV1JJVEVfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsCi0JCQkJCQkJIGNvcmUsIFRTU0lBLCAwKTsKLQotCQkJCWlmICghTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQotCQkJCQlXUklURV9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwKLQkJCQkJCQkgY29yZSwgVFNTSUcsIDB4MSk7Ci0JCQkJfSBlbHNlIHsKLQotCQkJCQlXUklURV9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwKLQkJCQkJCQkgY29yZSwgVFNTSUcsIDB4MzEpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJV1JJVEVfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIGNvcmUsCi0JCQkJCQkgVFhfU1NJX01BU1RFUiwgMHg5KTsKLQkJCQlXUklURV9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwgY29yZSwKLQkJCQkJCSBUWF9TU0lfTVVYLCAweGMpOwotCQkJCVdSSVRFX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLCBjb3JlLAotCQkJCQkJIFRTU0lHLCAwKTsKLQotCQkJCWlmIChwaS0+cHVicGkucmFkaW9yZXYgIT0gNSkgewotCQkJCQlpZiAoIU5SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0KLQkJCQkJCVdSSVRFX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsCi0JCQkJCQkJCSBUWCwgY29yZSwKLQkJCQkJCQkJIFRTU0lBLCAweDEpOwotCQkJCQl9IGVsc2UgewotCi0JCQkJCQlXUklURV9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LAotCQkJCQkJCQkgVFgsIGNvcmUsCi0JCQkJCQkJCSBUU1NJQSwgMHgzMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlXUklURV9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwgY29yZSwgSVFDQUxfVkNNX0hHLAotCQkJCQkgMCk7Ci0JCQlXUklURV9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LCBUWCwgY29yZSwgSVFDQUxfSURBQywKLQkJCQkJIDApOwotCQkJV1JJVEVfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywgVFgsIGNvcmUsIFRTU0lfVkNNLAotCQkJCQkgMHgzKTsKLQkJCVdSSVRFX1JBRElPX1JFRzMocGksIFJBRElPXzIwNTcsIFRYLCBjb3JlLCBUU1NJX01JU0MxLAotCQkJCQkgMHgwKTsKLQkJfQotCX0gZWxzZSB7Ci0JCVdSSVRFX1JBRElPX1NZTihwaSwgUkFESU9fMjA1NiwgUkVTRVJWRURfQUREUjMxLAotCQkJCShDSFNQRUNfSVMyRyhwaS0+cmFkaW9fY2hhbnNwZWMpKSA/IDB4MTI4IDoKLQkJCQkweDgwKTsKLQkJV1JJVEVfUkFESU9fU1lOKHBpLCBSQURJT18yMDU2LCBSRVNFUlZFRF9BRERSMzAsIDB4MCk7Ci0JCVdSSVRFX1JBRElPX1NZTihwaSwgUkFESU9fMjA1NiwgR1BJT19NQVNURVIxLCAweDI5KTsKLQotCQlmb3IgKGNvcmUgPSAwOyBjb3JlIDwgcGktPnB1YnBpLnBoeV9jb3JlbnVtOyBjb3JlKyspIHsKLQkJCVdSSVRFX1JBRElPX1JFRzIocGksIFJBRElPXzIwNTYsIFRYLCBjb3JlLCBJUUNBTF9WQ01fSEcsCi0JCQkJCSAweDApOwotCQkJV1JJVEVfUkFESU9fUkVHMihwaSwgUkFESU9fMjA1NiwgVFgsIGNvcmUsIElRQ0FMX0lEQUMsCi0JCQkJCSAweDApOwotCQkJV1JJVEVfUkFESU9fUkVHMihwaSwgUkFESU9fMjA1NiwgVFgsIGNvcmUsIFRTU0lfVkNNLAotCQkJCQkgMHgzKTsKLQkJCVdSSVRFX1JBRElPX1JFRzIocGksIFJBRElPXzIwNTYsIFRYLCBjb3JlLCBUWF9BTVBfREVULAotCQkJCQkgMHgwKTsKLQkJCVdSSVRFX1JBRElPX1JFRzIocGksIFJBRElPXzIwNTYsIFRYLCBjb3JlLCBUU1NJX01JU0MxLAotCQkJCQkgMHg4KTsKLQkJCVdSSVRFX1JBRElPX1JFRzIocGksIFJBRElPXzIwNTYsIFRYLCBjb3JlLCBUU1NJX01JU0MyLAotCQkJCQkgMHgwKTsKLQkJCVdSSVRFX1JBRElPX1JFRzIocGksIFJBRElPXzIwNTYsIFRYLCBjb3JlLCBUU1NJX01JU0MzLAotCQkJCQkgMHgwKTsKLQotCQkJaWYgKENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykpIHsKLQkJCQlXUklURV9SQURJT19SRUcyKHBpLCBSQURJT18yMDU2LCBUWCwgY29yZSwKLQkJCQkJCSBUWF9TU0lfTUFTVEVSLCAweDUpOwotCi0JCQkJaWYgKHBpLT5wdWJwaS5yYWRpb3JldiAhPSA1KQotCQkJCQlXUklURV9SQURJT19SRUcyKHBpLCBSQURJT18yMDU2LCBUWCwKLQkJCQkJCQkgY29yZSwgVFNTSUEsIDB4MCk7Ci0JCQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDUpKSB7Ci0KLQkJCQkJV1JJVEVfUkFESU9fUkVHMihwaSwgUkFESU9fMjA1NiwgVFgsCi0JCQkJCQkJIGNvcmUsIFRTU0lHLCAweDMxKTsKLQkJCQl9IGVsc2UgewotCQkJCQlXUklURV9SQURJT19SRUcyKHBpLCBSQURJT18yMDU2LCBUWCwKLQkJCQkJCQkgY29yZSwgVFNTSUcsIDB4MTEpOwotCQkJCX0KLQkJCQlXUklURV9SQURJT19SRUcyKHBpLCBSQURJT18yMDU2LCBUWCwgY29yZSwKLQkJCQkJCSBUWF9TU0lfTVVYLCAweGUpOwotCQkJfSBlbHNlIHsKLQkJCQlXUklURV9SQURJT19SRUcyKHBpLCBSQURJT18yMDU2LCBUWCwgY29yZSwKLQkJCQkJCSBUWF9TU0lfTUFTVEVSLCAweDkpOwotCQkJCVdSSVRFX1JBRElPX1JFRzIocGksIFJBRElPXzIwNTYsIFRYLCBjb3JlLAotCQkJCQkJIFRTU0lBLCAweDMxKTsKLQkJCQlXUklURV9SQURJT19SRUcyKHBpLCBSQURJT18yMDU2LCBUWCwgY29yZSwKLQkJCQkJCSBUU1NJRywgMHgwKTsKLQkJCQlXUklURV9SQURJT19SRUcyKHBpLCBSQURJT18yMDU2LCBUWCwgY29yZSwKLQkJCQkJCSBUWF9TU0lfTVVYLCAweGMpOwotCQkJfQotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3R4cHdyY3RybF9pZGxlX3Rzc2lfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSkKLXsKLQlzMzIgcnNzaV9idWZbNF07Ci0JczMyIGludF92YWw7Ci0KLQlpZiAoU0NBTl9STV9JTl9QUk9HUkVTUyhwaSkgfHwgUExUX0lOUFJPR19QSFkocGkpIHx8IFBIWV9NVVRFRChwaSkpCi0KLQkJcmV0dXJuOwotCi0JaWYgKFBIWV9JUEEocGkpKSB7Ci0JCXdsY19waHlfaXBhX2ludGVybmFsX3Rzc2lfc2V0dXBfbnBoeShwaSk7Ci0JfQotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCXdsY19waHlfcmZjdHJsX292ZXJyaWRlX25waHlfcmV2NyhwaSwgKDB4MSA8PCAxMiksCi0JCQkJCQkgIDAsIDB4MywgMCwKLQkJCQkJCSAgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMCk7Ci0JfSBlbHNlIGlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5KHBpLCAoMHgxIDw8IDEzKSwgMCwgMywgMCk7Ci0JfQotCi0Jd2xjX3BoeV9zdG9wcGxheWJhY2tfbnBoeShwaSk7Ci0KLQl3bGNfcGh5X3R4X3RvbmVfbnBoeShwaSwgNDAwMCwgMCwgMCwgMCwgZmFsc2UpOwotCi0JdWRlbGF5KDIwKTsKLQlpbnRfdmFsID0KLQkgICAgd2xjX3BoeV9wb2xsX3Jzc2lfbnBoeShwaSwgKHU4KSBOUEhZX1JTU0lfU0VMX1RTU0lfMkcsIHJzc2lfYnVmLAotCQkJCSAgIDEpOwotCXdsY19waHlfc3RvcHBsYXliYWNrX25waHkocGkpOwotCXdsY19waHlfcnNzaXNlbF9ucGh5KHBpLCBSQURJT19NSU1PX0NPUkVTRUxfT0ZGLCAwKTsKLQotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCQl3bGNfcGh5X3JmY3RybF9vdmVycmlkZV9ucGh5X3JldjcocGksICgweDEgPDwgMTIpLAotCQkJCQkJICAwLCAweDMsIDEsCi0JCQkJCQkgIE5QSFlfUkVWN19SRkNUUkxPVkVSUklERV9JRDApOwotCX0gZWxzZSBpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJd2xjX3BoeV9yZmN0cmxfb3ZlcnJpZGVfbnBoeShwaSwgKDB4MSA8PCAxMyksIDAsIDMsIDEpOwotCX0KLQotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCi0JCXBpLT5ucGh5X3B3cmN0cmxfaW5mb1tQSFlfQ09SRV8wXS5pZGxlX3Rzc2lfMmcgPQotCQkgICAgKHU4KSAoKGludF92YWwgPj4gMjQpICYgMHhmZik7Ci0JCXBpLT5ucGh5X3B3cmN0cmxfaW5mb1tQSFlfQ09SRV8wXS5pZGxlX3Rzc2lfNWcgPQotCQkgICAgKHU4KSAoKGludF92YWwgPj4gMjQpICYgMHhmZik7Ci0KLQkJcGktPm5waHlfcHdyY3RybF9pbmZvW1BIWV9DT1JFXzFdLmlkbGVfdHNzaV8yZyA9Ci0JCSAgICAodTgpICgoaW50X3ZhbCA+PiA4KSAmIDB4ZmYpOwotCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bUEhZX0NPUkVfMV0uaWRsZV90c3NpXzVnID0KLQkJICAgICh1OCkgKChpbnRfdmFsID4+IDgpICYgMHhmZik7Ci0JfSBlbHNlIHsKLQkJcGktPm5waHlfcHdyY3RybF9pbmZvW1BIWV9DT1JFXzBdLmlkbGVfdHNzaV8yZyA9Ci0JCSAgICAodTgpICgoaW50X3ZhbCA+PiAyNCkgJiAweGZmKTsKLQotCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bUEhZX0NPUkVfMV0uaWRsZV90c3NpXzJnID0KLQkJICAgICh1OCkgKChpbnRfdmFsID4+IDgpICYgMHhmZik7Ci0KLQkJcGktPm5waHlfcHdyY3RybF9pbmZvW1BIWV9DT1JFXzBdLmlkbGVfdHNzaV81ZyA9Ci0JCSAgICAodTgpICgoaW50X3ZhbCA+PiAxNikgJiAweGZmKTsKLQkJcGktPm5waHlfcHdyY3RybF9pbmZvW1BIWV9DT1JFXzFdLmlkbGVfdHNzaV81ZyA9Ci0JCSAgICAodTgpICgoaW50X3ZhbCkgJiAweGZmKTsKLQl9Ci0KLX0KLQotc3RhdGljIHZvaWQgd2xjX3BoeV90eHB3cmN0cmxfcHdyX3NldHVwX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JdTMyIGlkeDsKLQlzMTYgYTFbMl0sIGIwWzJdLCBiMVsyXTsKLQlzOCB0YXJnZXRfcHdyX3F0cmRibVsyXTsKLQlzMzIgbnVtLCBkZW4sIHB3cl9lc3Q7Ci0JdTggY2hhbl9mcmVxX3JhbmdlOwotCXU4IGlkbGVfdHNzaVsyXTsKLQl1MzIgdGJsX2lkLCB0YmxfbGVuLCB0Ymxfb2Zmc2V0OwotCXUzMiByZWd2YWxbNjRdOwotCXU4IGNvcmU7Ci0KLQlpZiAoRDExUkVWX0lTKHBpLT5zaC0+Y29yZXJldiwgMTEpIHx8IEQxMVJFVl9JUyhwaS0+c2gtPmNvcmVyZXYsIDEyKSkgewotCQl3bGFwaV9ibWFjX21jdHJsKHBpLT5zaC0+cGh5c2hpbSwgTUNUTF9QSFlMT0NLLCBNQ1RMX1BIWUxPQ0spOwotCQkodm9pZClSX1JFRygmcGktPnJlZ3MtPm1hY2NvbnRyb2wpOwotCQl1ZGVsYXkoMSk7Ci0JfQotCi0JaWYgKHBpLT5waHloYW5nX2F2b2lkKQotCQl3bGNfcGh5X3N0YXlfaW5fY2FycmllcnNlYXJjaF9ucGh5KHBpLCB0cnVlKTsKLQotCW9yX3BoeV9yZWcocGksIDB4MTIyLCAoMHgxIDw8IDApKTsKLQotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCQlhbmRfcGh5X3JlZyhwaSwgMHgxZTcsICh1MTYpICh+KDB4MSA8PCAxNSkpKTsKLQl9IGVsc2UgewotCi0JCW9yX3BoeV9yZWcocGksIDB4MWU3LCAoMHgxIDw8IDE1KSk7Ci0JfQotCi0JaWYgKEQxMVJFVl9JUyhwaS0+c2gtPmNvcmVyZXYsIDExKSB8fCBEMTFSRVZfSVMocGktPnNoLT5jb3JlcmV2LCAxMikpCi0JCXdsYXBpX2JtYWNfbWN0cmwocGktPnNoLT5waHlzaGltLCBNQ1RMX1BIWUxPQ0ssIDApOwotCi0JaWYgKHBpLT5zaC0+c3JvbXJldiA8IDQpIHsKLQkJaWRsZV90c3NpWzBdID0gcGktPm5waHlfcHdyY3RybF9pbmZvWzBdLmlkbGVfdHNzaV8yZzsKLQkJaWRsZV90c3NpWzFdID0gcGktPm5waHlfcHdyY3RybF9pbmZvWzFdLmlkbGVfdHNzaV8yZzsKLQkJdGFyZ2V0X3B3cl9xdHJkYm1bMF0gPSAxMyAqIDQ7Ci0JCXRhcmdldF9wd3JfcXRyZGJtWzFdID0gMTMgKiA0OwotCQlhMVswXSA9IC00MjQ7Ci0JCWExWzFdID0gLTQyNDsKLQkJYjBbMF0gPSA1NjEyOwotCQliMFsxXSA9IDU2MTI7Ci0JCWIxWzFdID0gLTEzOTM7Ci0JCWIxWzBdID0gLTEzOTM7Ci0JfSBlbHNlIHsKLQotCQljaGFuX2ZyZXFfcmFuZ2UgPSB3bGNfcGh5X2dldF9jaGFuX2ZyZXFfcmFuZ2VfbnBoeShwaSwgMCk7Ci0JCXN3aXRjaCAoY2hhbl9mcmVxX3JhbmdlKSB7Ci0JCWNhc2UgV0xfQ0hBTl9GUkVRX1JBTkdFXzJHOgotCQkJaWRsZV90c3NpWzBdID0gcGktPm5waHlfcHdyY3RybF9pbmZvWzBdLmlkbGVfdHNzaV8yZzsKLQkJCWlkbGVfdHNzaVsxXSA9IHBpLT5ucGh5X3B3cmN0cmxfaW5mb1sxXS5pZGxlX3Rzc2lfMmc7Ci0JCQl0YXJnZXRfcHdyX3F0cmRibVswXSA9Ci0JCQkgICAgcGktPm5waHlfcHdyY3RybF9pbmZvWzBdLm1heF9wd3JfMmc7Ci0JCQl0YXJnZXRfcHdyX3F0cmRibVsxXSA9Ci0JCQkgICAgcGktPm5waHlfcHdyY3RybF9pbmZvWzFdLm1heF9wd3JfMmc7Ci0JCQlhMVswXSA9IHBpLT5ucGh5X3B3cmN0cmxfaW5mb1swXS5wd3JkZXRfMmdfYTE7Ci0JCQlhMVsxXSA9IHBpLT5ucGh5X3B3cmN0cmxfaW5mb1sxXS5wd3JkZXRfMmdfYTE7Ci0JCQliMFswXSA9IHBpLT5ucGh5X3B3cmN0cmxfaW5mb1swXS5wd3JkZXRfMmdfYjA7Ci0JCQliMFsxXSA9IHBpLT5ucGh5X3B3cmN0cmxfaW5mb1sxXS5wd3JkZXRfMmdfYjA7Ci0JCQliMVswXSA9IHBpLT5ucGh5X3B3cmN0cmxfaW5mb1swXS5wd3JkZXRfMmdfYjE7Ci0JCQliMVsxXSA9IHBpLT5ucGh5X3B3cmN0cmxfaW5mb1sxXS5wd3JkZXRfMmdfYjE7Ci0JCQlicmVhazsKLQkJY2FzZSBXTF9DSEFOX0ZSRVFfUkFOR0VfNUdMOgotCQkJaWRsZV90c3NpWzBdID0gcGktPm5waHlfcHdyY3RybF9pbmZvWzBdLmlkbGVfdHNzaV81ZzsKLQkJCWlkbGVfdHNzaVsxXSA9IHBpLT5ucGh5X3B3cmN0cmxfaW5mb1sxXS5pZGxlX3Rzc2lfNWc7Ci0JCQl0YXJnZXRfcHdyX3F0cmRibVswXSA9Ci0JCQkgICAgcGktPm5waHlfcHdyY3RybF9pbmZvWzBdLm1heF9wd3JfNWdsOwotCQkJdGFyZ2V0X3B3cl9xdHJkYm1bMV0gPQotCQkJICAgIHBpLT5ucGh5X3B3cmN0cmxfaW5mb1sxXS5tYXhfcHdyXzVnbDsKLQkJCWExWzBdID0gcGktPm5waHlfcHdyY3RybF9pbmZvWzBdLnB3cmRldF81Z2xfYTE7Ci0JCQlhMVsxXSA9IHBpLT5ucGh5X3B3cmN0cmxfaW5mb1sxXS5wd3JkZXRfNWdsX2ExOwotCQkJYjBbMF0gPSBwaS0+bnBoeV9wd3JjdHJsX2luZm9bMF0ucHdyZGV0XzVnbF9iMDsKLQkJCWIwWzFdID0gcGktPm5waHlfcHdyY3RybF9pbmZvWzFdLnB3cmRldF81Z2xfYjA7Ci0JCQliMVswXSA9IHBpLT5ucGh5X3B3cmN0cmxfaW5mb1swXS5wd3JkZXRfNWdsX2IxOwotCQkJYjFbMV0gPSBwaS0+bnBoeV9wd3JjdHJsX2luZm9bMV0ucHdyZGV0XzVnbF9iMTsKLQkJCWJyZWFrOwotCQljYXNlIFdMX0NIQU5fRlJFUV9SQU5HRV81R006Ci0JCQlpZGxlX3Rzc2lbMF0gPSBwaS0+bnBoeV9wd3JjdHJsX2luZm9bMF0uaWRsZV90c3NpXzVnOwotCQkJaWRsZV90c3NpWzFdID0gcGktPm5waHlfcHdyY3RybF9pbmZvWzFdLmlkbGVfdHNzaV81ZzsKLQkJCXRhcmdldF9wd3JfcXRyZGJtWzBdID0KLQkJCSAgICBwaS0+bnBoeV9wd3JjdHJsX2luZm9bMF0ubWF4X3B3cl81Z207Ci0JCQl0YXJnZXRfcHdyX3F0cmRibVsxXSA9Ci0JCQkgICAgcGktPm5waHlfcHdyY3RybF9pbmZvWzFdLm1heF9wd3JfNWdtOwotCQkJYTFbMF0gPSBwaS0+bnBoeV9wd3JjdHJsX2luZm9bMF0ucHdyZGV0XzVnbV9hMTsKLQkJCWExWzFdID0gcGktPm5waHlfcHdyY3RybF9pbmZvWzFdLnB3cmRldF81Z21fYTE7Ci0JCQliMFswXSA9IHBpLT5ucGh5X3B3cmN0cmxfaW5mb1swXS5wd3JkZXRfNWdtX2IwOwotCQkJYjBbMV0gPSBwaS0+bnBoeV9wd3JjdHJsX2luZm9bMV0ucHdyZGV0XzVnbV9iMDsKLQkJCWIxWzBdID0gcGktPm5waHlfcHdyY3RybF9pbmZvWzBdLnB3cmRldF81Z21fYjE7Ci0JCQliMVsxXSA9IHBpLT5ucGh5X3B3cmN0cmxfaW5mb1sxXS5wd3JkZXRfNWdtX2IxOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xfQ0hBTl9GUkVRX1JBTkdFXzVHSDoKLQkJCWlkbGVfdHNzaVswXSA9IHBpLT5ucGh5X3B3cmN0cmxfaW5mb1swXS5pZGxlX3Rzc2lfNWc7Ci0JCQlpZGxlX3Rzc2lbMV0gPSBwaS0+bnBoeV9wd3JjdHJsX2luZm9bMV0uaWRsZV90c3NpXzVnOwotCQkJdGFyZ2V0X3B3cl9xdHJkYm1bMF0gPQotCQkJICAgIHBpLT5ucGh5X3B3cmN0cmxfaW5mb1swXS5tYXhfcHdyXzVnaDsKLQkJCXRhcmdldF9wd3JfcXRyZGJtWzFdID0KLQkJCSAgICBwaS0+bnBoeV9wd3JjdHJsX2luZm9bMV0ubWF4X3B3cl81Z2g7Ci0JCQlhMVswXSA9IHBpLT5ucGh5X3B3cmN0cmxfaW5mb1swXS5wd3JkZXRfNWdoX2ExOwotCQkJYTFbMV0gPSBwaS0+bnBoeV9wd3JjdHJsX2luZm9bMV0ucHdyZGV0XzVnaF9hMTsKLQkJCWIwWzBdID0gcGktPm5waHlfcHdyY3RybF9pbmZvWzBdLnB3cmRldF81Z2hfYjA7Ci0JCQliMFsxXSA9IHBpLT5ucGh5X3B3cmN0cmxfaW5mb1sxXS5wd3JkZXRfNWdoX2IwOwotCQkJYjFbMF0gPSBwaS0+bnBoeV9wd3JjdHJsX2luZm9bMF0ucHdyZGV0XzVnaF9iMTsKLQkJCWIxWzFdID0gcGktPm5waHlfcHdyY3RybF9pbmZvWzFdLnB3cmRldF81Z2hfYjE7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWlkbGVfdHNzaVswXSA9IHBpLT5ucGh5X3B3cmN0cmxfaW5mb1swXS5pZGxlX3Rzc2lfMmc7Ci0JCQlpZGxlX3Rzc2lbMV0gPSBwaS0+bnBoeV9wd3JjdHJsX2luZm9bMV0uaWRsZV90c3NpXzJnOwotCQkJdGFyZ2V0X3B3cl9xdHJkYm1bMF0gPSAxMyAqIDQ7Ci0JCQl0YXJnZXRfcHdyX3F0cmRibVsxXSA9IDEzICogNDsKLQkJCWExWzBdID0gLTQyNDsKLQkJCWExWzFdID0gLTQyNDsKLQkJCWIwWzBdID0gNTYxMjsKLQkJCWIwWzFdID0gNTYxMjsKLQkJCWIxWzFdID0gLTEzOTM7Ci0JCQliMVswXSA9IC0xMzkzOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQl0YXJnZXRfcHdyX3F0cmRibVswXSA9IChzOCkgcGktPnR4X3Bvd2VyX21heDsKLQl0YXJnZXRfcHdyX3F0cmRibVsxXSA9IChzOCkgcGktPnR4X3Bvd2VyX21heDsKLQotCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCQlpZiAocGktPnNyb21fZmVtMmcudHNzaXBvcykgewotCQkJb3JfcGh5X3JlZyhwaSwgMHgxZTksICgweDEgPDwgMTQpKTsKLQkJfQotCi0JCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCA3KSkgewotCQkJZm9yIChjb3JlID0gMDsgY29yZSA8PSAxOyBjb3JlKyspIHsKLQkJCQlpZiAoUEhZX0lQQShwaSkpIHsKLQotCQkJCQlpZiAoQ0hTUEVDX0lTMkcocGktPnJhZGlvX2NoYW5zcGVjKSkgewotCQkJCQkJV1JJVEVfUkFESU9fUkVHMyhwaSwgUkFESU9fMjA1NywKLQkJCQkJCQkJIFRYLCBjb3JlLAotCQkJCQkJCQkgVFhfU1NJX01VWCwKLQkJCQkJCQkJIDB4ZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlXUklURV9SQURJT19SRUczKHBpLCBSQURJT18yMDU3LAotCQkJCQkJCQkgVFgsIGNvcmUsCi0JCQkJCQkJCSBUWF9TU0lfTVVYLAotCQkJCQkJCQkgMHhjKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKFBIWV9JUEEocGkpKSB7Ci0KLQkJCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfVFhfVFhfU1NJX01VWCB8Ci0JCQkJCQlSQURJT18yMDU2X1RYMCwKLQkJCQkJCShDSFNQRUNfSVM1RwotCQkJCQkJIChwaS0+Ci0JCQkJCQkgIHJhZGlvX2NoYW5zcGVjKSkgPyAweGMgOiAweGUpOwotCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwKLQkJCQkJCVJBRElPXzIwNTZfVFhfVFhfU1NJX01VWCB8Ci0JCQkJCQlSQURJT18yMDU2X1RYMSwKLQkJCQkJCShDSFNQRUNfSVM1RwotCQkJCQkJIChwaS0+Ci0JCQkJCQkgIHJhZGlvX2NoYW5zcGVjKSkgPyAweGMgOiAweGUpOwotCQkJfSBlbHNlIHsKLQotCQkJCXdyaXRlX3JhZGlvX3JlZyhwaSwgUkFESU9fMjA1Nl9UWF9UWF9TU0lfTVVYIHwKLQkJCQkJCVJBRElPXzIwNTZfVFgwLCAweDExKTsKLQkJCQl3cml0ZV9yYWRpb19yZWcocGksIFJBRElPXzIwNTZfVFhfVFhfU1NJX01VWCB8Ci0JCQkJCQlSQURJT18yMDU2X1RYMSwgMHgxMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoRDExUkVWX0lTKHBpLT5zaC0+Y29yZXJldiwgMTEpIHx8IEQxMVJFVl9JUyhwaS0+c2gtPmNvcmVyZXYsIDEyKSkgewotCQl3bGFwaV9ibWFjX21jdHJsKHBpLT5zaC0+cGh5c2hpbSwgTUNUTF9QSFlMT0NLLCBNQ1RMX1BIWUxPQ0spOwotCQkodm9pZClSX1JFRygmcGktPnJlZ3MtPm1hY2NvbnRyb2wpOwotCQl1ZGVsYXkoMSk7Ci0JfQotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDFlNywgKDB4N2YgPDwgMCksCi0JCQkgICAgKE5QSFlfVHhQd3JDdHJsQ21kX3B3ckluZGV4X2luaXRfcmV2NyA8PCAwKSk7Ci0JfSBlbHNlIHsKLQkJbW9kX3BoeV9yZWcocGksIDB4MWU3LCAoMHg3ZiA8PCAwKSwKLQkJCSAgICAoTlBIWV9UeFB3ckN0cmxDbWRfcHdySW5kZXhfaW5pdCA8PCAwKSk7Ci0JfQotCi0JaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDcpKSB7Ci0JCW1vZF9waHlfcmVnKHBpLCAweDIyMiwgKDB4ZmYgPDwgMCksCi0JCQkgICAgKE5QSFlfVHhQd3JDdHJsQ21kX3B3ckluZGV4X2luaXRfcmV2NyA8PCAwKSk7Ci0JfSBlbHNlIGlmIChOUkVWX0dUKHBpLT5wdWJwaS5waHlfcmV2LCAxKSkgewotCQltb2RfcGh5X3JlZyhwaSwgMHgyMjIsICgweGZmIDw8IDApLAotCQkJICAgIChOUEhZX1R4UHdyQ3RybENtZF9wd3JJbmRleF9pbml0IDw8IDApKTsKLQl9Ci0KLQlpZiAoRDExUkVWX0lTKHBpLT5zaC0+Y29yZXJldiwgMTEpIHx8IEQxMVJFVl9JUyhwaS0+c2gtPmNvcmVyZXYsIDEyKSkKLQkJd2xhcGlfYm1hY19tY3RybChwaS0+c2gtPnBoeXNoaW0sIE1DVExfUEhZTE9DSywgMCk7Ci0KLQl3cml0ZV9waHlfcmVnKHBpLCAweDFlOCwgKDB4MyA8PCA4KSB8ICgyNDAgPDwgMCkpOwotCi0Jd3JpdGVfcGh5X3JlZyhwaSwgMHgxZTksCi0JCSAgICAgICgxIDw8IDE1KSB8IChpZGxlX3Rzc2lbMF0gPDwgMCkgfCAoaWRsZV90c3NpWzFdIDw8IDgpKTsKLQotCXdyaXRlX3BoeV9yZWcocGksIDB4MWVhLAotCQkgICAgICAodGFyZ2V0X3B3cl9xdHJkYm1bMF0gPDwgMCkgfAotCQkgICAgICAodGFyZ2V0X3B3cl9xdHJkYm1bMV0gPDwgOCkpOwotCi0JdGJsX2xlbiA9IDY0OwotCXRibF9vZmZzZXQgPSAwOwotCWZvciAodGJsX2lkID0gTlBIWV9UQkxfSURfQ09SRTFUWFBXUkNUTDsKLQkgICAgIHRibF9pZCA8PSBOUEhZX1RCTF9JRF9DT1JFMlRYUFdSQ1RMOyB0YmxfaWQrKykgewotCi0JCWZvciAoaWR4ID0gMDsgaWR4IDwgdGJsX2xlbjsgaWR4KyspIHsKLQkJCW51bSA9Ci0JCQkgICAgOCAqICgxNiAqIGIwW3RibF9pZCAtIDI2XSArIGIxW3RibF9pZCAtIDI2XSAqIGlkeCk7Ci0JCQlkZW4gPSAzMjc2OCArIGExW3RibF9pZCAtIDI2XSAqIGlkeDsKLQkJCXB3cl9lc3QgPSBtYXgoKCg0ICogbnVtICsgZGVuIC8gMikgLyBkZW4pLCAtOCk7Ci0JCQlpZiAoTlJFVl9MVChwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJCQlpZiAoaWR4IDw9Ci0JCQkJICAgICh1aW50KSAoMzEgLSBpZGxlX3Rzc2lbdGJsX2lkIC0gMjZdICsgMSkpCi0JCQkJCXB3cl9lc3QgPQotCQkJCQkgICAgbWF4KHB3cl9lc3QsCi0JCQkJCQl0YXJnZXRfcHdyX3F0cmRibVt0YmxfaWQgLSAyNl0gKwotCQkJCQkJMSk7Ci0JCQl9Ci0JCQlyZWd2YWxbaWR4XSA9ICh1MzIpIHB3cl9lc3Q7Ci0JCX0KLQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCB0YmxfaWQsIHRibF9sZW4sIHRibF9vZmZzZXQsIDMyLAotCQkJCQkgcmVndmFsKTsKLQl9Ci0KLQl3bGNfcGh5X3R4cHdyX2xpbWl0X3RvX3RibF9ucGh5KHBpKTsKLQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0NPUkUxVFhQV1JDVEwsIDg0LCA2NCwgOCwKLQkJCQkgcGktPmFkal9wd3JfdGJsX25waHkpOwotCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQ09SRTJUWFBXUkNUTCwgODQsIDY0LCA4LAotCQkJCSBwaS0+YWRqX3B3cl90YmxfbnBoeSk7Ci0KLQlpZiAocGktPnBoeWhhbmdfYXZvaWQpCi0JCXdsY19waHlfc3RheV9pbl9jYXJyaWVyc2VhcmNoX25waHkocGksIGZhbHNlKTsKLX0KLQotc3RhdGljIGJvb2wgd2xjX3BoeV90eHB3cl9pc29uX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JcmV0dXJuIHJlYWRfcGh5X3JlZygocGkpLCAweDFlNykgJiAoKDB4MSA8PCAxNSkgfAotCQkJCQkgICAgICgweDEgPDwgMTQpIHwgKDB4MSA8PCAxMykpOwotfQotCi1zdGF0aWMgdTggd2xjX3BoeV90eHB3cl9pZHhfY3VyX2dldF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCBjb3JlKQotewotCXUxNiB0bXA7Ci0JdG1wID0gcmVhZF9waHlfcmVnKHBpLCAoKGNvcmUgPT0gUEhZX0NPUkVfMCkgPyAweDFlZCA6IDB4MWVlKSk7Ci0KLQl0bXAgPSAodG1wICYgKDB4N2YgPDwgOCkpID4+IDg7Ci0JcmV0dXJuICh1OCkgdG1wOwotfQotCi1zdGF0aWMgdm9pZAotd2xjX3BoeV90eHB3cl9pZHhfY3VyX3NldF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCBpZHgwLCB1OCBpZHgxKQotewotCW1vZF9waHlfcmVnKHBpLCAweDFlNywgKDB4N2YgPDwgMCksIGlkeDApOwotCi0JaWYgKE5SRVZfR1QocGktPnB1YnBpLnBoeV9yZXYsIDEpKQotCQltb2RfcGh5X3JlZyhwaSwgMHgyMjIsICgweGZmIDw8IDApLCBpZHgxKTsKLX0KLQotdTE2IHdsY19waHlfdHhwd3JfaWR4X2dldF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpKQotewotCXUxNiB0bXA7Ci0JdTE2IHB3cl9pZHhbMl07Ci0KLQlpZiAod2xjX3BoeV90eHB3cl9pc29uX25waHkocGkpKSB7Ci0JCXB3cl9pZHhbMF0gPSB3bGNfcGh5X3R4cHdyX2lkeF9jdXJfZ2V0X25waHkocGksIFBIWV9DT1JFXzApOwotCQlwd3JfaWR4WzFdID0gd2xjX3BoeV90eHB3cl9pZHhfY3VyX2dldF9ucGh5KHBpLCBQSFlfQ09SRV8xKTsKLQotCQl0bXAgPSAocHdyX2lkeFswXSA8PCA4KSB8IHB3cl9pZHhbMV07Ci0JfSBlbHNlIHsKLQkJdG1wID0KLQkJICAgICgocGktPm5waHlfdHhwd3JpbmRleFtQSFlfQ09SRV8wXS4KLQkJICAgICAgaW5kZXhfaW50ZXJuYWwgJiAweGZmKSA8PCA4KSB8IChwaS0+Ci0JCQkJCQkgICAgICBucGh5X3R4cHdyaW5kZXgKLQkJCQkJCSAgICAgIFtQSFlfQ09SRV8xXS4KLQkJCQkJCSAgICAgIGluZGV4X2ludGVybmFsICYgMHhmZik7Ci0JfQotCi0JcmV0dXJuIHRtcDsKLX0KLQotdm9pZCB3bGNfcGh5X3R4cHdyX3BhcGRfY2FsX25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpCi17Ci0JaWYgKFBIWV9JUEEocGkpCi0JICAgICYmIChwaS0+bnBoeV9mb3JjZV9wYXBkX2NhbAotCQl8fCAod2xjX3BoeV90eHB3cl9pc29uX25waHkocGkpCi0JCSAgICAmJgotCQkgICAgKCgodTMyKQotCQkgICAgICBBQlMod2xjX3BoeV90eHB3cl9pZHhfY3VyX2dldF9ucGh5KHBpLCAwKSAtCi0JCQkgIHBpLT5ucGh5X3BhcGRfdHhfZ2Fpbl9hdF9sYXN0X2NhbFswXSkgPj0gNCkKLQkJICAgICB8fCAoKHUzMikKLQkJCSBBQlMod2xjX3BoeV90eHB3cl9pZHhfY3VyX2dldF9ucGh5KHBpLCAxKSAtCi0JCQkgICAgIHBpLT5ucGh5X3BhcGRfdHhfZ2Fpbl9hdF9sYXN0X2NhbFsxXSkgPj0gNCkpKSkpIHsKLQkJd2xjX3BoeV9hNChwaSwgdHJ1ZSk7Ci0JfQotfQotCi12b2lkIHdsY19waHlfdHhwd3JjdHJsX2VuYWJsZV9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCBjdHJsX3R5cGUpCi17Ci0JdTE2IG1hc2sgPSAwLCB2YWwgPSAwLCBpc2h3ID0gMDsKLQl1OCBjdHI7Ci0JdWludCBjb3JlOwotCXUzMiB0Ymxfb2Zmc2V0OwotCXUzMiB0YmxfbGVuOwotCXUxNiByZWd2YWxbODRdOwotCi0JaWYgKHBpLT5waHloYW5nX2F2b2lkKQotCQl3bGNfcGh5X3N0YXlfaW5fY2FycmllcnNlYXJjaF9ucGh5KHBpLCB0cnVlKTsKLQotCXN3aXRjaCAoY3RybF90eXBlKSB7Ci0JY2FzZSBQSFlfVFBDX0hXX09GRjoKLQljYXNlIFBIWV9UUENfSFdfT046Ci0JCXBpLT5ucGh5X3R4cHdyY3RybCA9IGN0cmxfdHlwZTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKGN0cmxfdHlwZSA9PSBQSFlfVFBDX0hXX09GRikgewotCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQotCQkJaWYgKHdsY19waHlfdHhwd3JfaXNvbl9ucGh5KHBpKSkgewotCQkJCWZvciAoY29yZSA9IDA7IGNvcmUgPCBwaS0+cHVicGkucGh5X2NvcmVudW07Ci0JCQkJICAgICBjb3JlKyspCi0JCQkJCXBpLT5ucGh5X3R4cHdyX2lkeFtjb3JlXSA9Ci0JCQkJCSAgICB3bGNfcGh5X3R4cHdyX2lkeF9jdXJfZ2V0X25waHkocGksCi0JCQkJCQkJCQkgICAodTgpCi0JCQkJCQkJCQkgICBjb3JlKTsKLQkJCX0KLQotCQl9Ci0KLQkJdGJsX2xlbiA9IDg0OwotCQl0Ymxfb2Zmc2V0ID0gNjQ7Ci0JCWZvciAoY3RyID0gMDsgY3RyIDwgdGJsX2xlbjsgY3RyKyspIHsKLQkJCXJlZ3ZhbFtjdHJdID0gMDsKLQkJfQotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIDI2LCB0YmxfbGVuLCB0Ymxfb2Zmc2V0LCAxNiwKLQkJCQkJIHJlZ3ZhbCk7Ci0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgMjcsIHRibF9sZW4sIHRibF9vZmZzZXQsIDE2LAotCQkJCQkgcmVndmFsKTsKLQotCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQotCQkJYW5kX3BoeV9yZWcocGksIDB4MWU3LAotCQkJCSAgICAodTE2KSAofigoMHgxIDw8IDE1KSB8Ci0JCQkJCQkoMHgxIDw8IDE0KSB8ICgweDEgPDwgMTMpKSkpOwotCQl9IGVsc2UgewotCQkJYW5kX3BoeV9yZWcocGksIDB4MWU3LAotCQkJCSAgICAodTE2KSAofigoMHgxIDw8IDE0KSB8ICgweDEgPDwgMTMpKSkpOwotCQl9Ci0KLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0JCQlvcl9waHlfcmVnKHBpLCAweDhmLCAoMHgxIDw8IDgpKTsKLQkJCW9yX3BoeV9yZWcocGksIDB4YTUsICgweDEgPDwgOCkpOwotCQl9IGVsc2UgewotCQkJb3JfcGh5X3JlZyhwaSwgMHhhNSwgKDB4MSA8PCAxNCkpOwotCQl9Ci0KLQkJaWYgKE5SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDIpKQotCQkJbW9kX3BoeV9yZWcocGksIDB4ZGMsIDB4MDBmZiwgMHg1Myk7Ci0JCWVsc2UgaWYgKE5SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDIpKQotCQkJbW9kX3BoeV9yZWcocGksIDB4ZGMsIDB4MDBmZiwgMHg1YSk7Ci0KLQkJaWYgKE5SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDIpICYmIElTNDBNSFoocGkpKQotCQkJd2xhcGlfYm1hY19taGYocGktPnNoLT5waHlzaGltLCBNSEYxLCBNSEYxX0lRU1dBUF9XQVIsCi0JCQkJICAgICAgIE1IRjFfSVFTV0FQX1dBUiwgQlJDTV9CQU5EX0FMTCk7Ci0KLQl9IGVsc2UgewotCi0JCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgTlBIWV9UQkxfSURfQ09SRTFUWFBXUkNUTCwgODQsIDY0LAotCQkJCQkgOCwgcGktPmFkal9wd3JfdGJsX25waHkpOwotCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIE5QSFlfVEJMX0lEX0NPUkUyVFhQV1JDVEwsIDg0LCA2NCwKLQkJCQkJIDgsIHBpLT5hZGpfcHdyX3RibF9ucGh5KTsKLQotCQlpc2h3ID0gKGN0cmxfdHlwZSA9PSBQSFlfVFBDX0hXX09OKSA/IDB4MSA6IDB4MDsKLQkJbWFzayA9ICgweDEgPDwgMTQpIHwgKDB4MSA8PCAxMyk7Ci0JCXZhbCA9IChpc2h3IDw8IDE0KSB8IChpc2h3IDw8IDEzKTsKLQotCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJCW1hc2sgfD0gKDB4MSA8PCAxNSk7Ci0JCQl2YWwgfD0gKGlzaHcgPDwgMTUpOwotCQl9Ci0KLQkJbW9kX3BoeV9yZWcocGksIDB4MWU3LCBtYXNrLCB2YWwpOwotCi0JCWlmIChDSFNQRUNfSVM1RyhwaS0+cmFkaW9fY2hhbnNwZWMpKSB7Ci0JCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgNykpIHsKLQkJCQltb2RfcGh5X3JlZyhwaSwgMHgxZTcsICgweDdmIDw8IDApLCAweDMyKTsKLQkJCQltb2RfcGh5X3JlZyhwaSwgMHgyMjIsICgweGZmIDw8IDApLCAweDMyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbW9kX3BoeV9yZWcocGksIDB4MWU3LCAoMHg3ZiA8PCAwKSwgMHg2NCk7Ci0JCQkJaWYgKE5SRVZfR1QocGktPnB1YnBpLnBoeV9yZXYsIDEpKQotCQkJCQltb2RfcGh5X3JlZyhwaSwgMHgyMjIsCi0JCQkJCQkgICAgKDB4ZmYgPDwgMCksIDB4NjQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0JCQlpZiAoKHBpLT5ucGh5X3R4cHdyX2lkeFswXSAhPSAxMjgpCi0JCQkgICAgJiYgKHBpLT5ucGh5X3R4cHdyX2lkeFsxXSAhPSAxMjgpKSB7Ci0JCQkJd2xjX3BoeV90eHB3cl9pZHhfY3VyX3NldF9ucGh5KHBpLAotCQkJCQkJCSAgICAgICBwaS0+Ci0JCQkJCQkJICAgICAgIG5waHlfdHhwd3JfaWR4Ci0JCQkJCQkJICAgICAgIFswXSwKLQkJCQkJCQkgICAgICAgcGktPgotCQkJCQkJCSAgICAgICBucGh5X3R4cHdyX2lkeAotCQkJCQkJCSAgICAgICBbMV0pOwotCQkJfQotCQl9Ci0KLQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0JCQlhbmRfcGh5X3JlZyhwaSwgMHg4ZiwgfigweDEgPDwgOCkpOwotCQkJYW5kX3BoeV9yZWcocGksIDB4YTUsIH4oMHgxIDw8IDgpKTsKLQkJfSBlbHNlIHsKLQkJCWFuZF9waHlfcmVnKHBpLCAweGE1LCB+KDB4MSA8PCAxNCkpOwotCQl9Ci0KLQkJaWYgKE5SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDIpKQotCQkJbW9kX3BoeV9yZWcocGksIDB4ZGMsIDB4MDBmZiwgMHgzYik7Ci0JCWVsc2UgaWYgKE5SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDIpKQotCQkJbW9kX3BoeV9yZWcocGksIDB4ZGMsIDB4MDBmZiwgMHg0MCk7Ci0KLQkJaWYgKE5SRVZfTFQocGktPnB1YnBpLnBoeV9yZXYsIDIpICYmIElTNDBNSFoocGkpKQotCQkJd2xhcGlfYm1hY19taGYocGktPnNoLT5waHlzaGltLCBNSEYxLCBNSEYxX0lRU1dBUF9XQVIsCi0JCQkJICAgICAgIDB4MCwgQlJDTV9CQU5EX0FMTCk7Ci0KLQkJaWYgKFBIWV9JUEEocGkpKSB7Ci0JCQltb2RfcGh5X3JlZyhwaSwgKDAgPT0gUEhZX0NPUkVfMCkgPyAweDI5NyA6Ci0JCQkJICAgIDB4MjliLCAoMHgxIDw8IDIpLCAoMCkgPDwgMik7Ci0KLQkJCW1vZF9waHlfcmVnKHBpLCAoMSA9PSBQSFlfQ09SRV8wKSA/IDB4Mjk3IDoKLQkJCQkgICAgMHgyOWIsICgweDEgPDwgMiksICgwKSA8PCAyKTsKLQotCQl9Ci0KLQl9Ci0KLQlpZiAocGktPnBoeWhhbmdfYXZvaWQpCi0JCXdsY19waHlfc3RheV9pbl9jYXJyaWVyc2VhcmNoX25waHkocGksIGZhbHNlKTsKLX0KLQotdm9pZAotd2xjX3BoeV90eHB3cl9pbmRleF9ucGh5KHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCBjb3JlX21hc2ssIHM4IHR4cHdyaW5kZXgsCi0JCQkgYm9vbCByZXN0b3JlX2NhbHMpCi17Ci0JdTggY29yZSwgdHhwd3JjdGxfdGJsOwotCXUxNiB0eF9pbmQwLCBpcV9pbmQwLCBsb19pbmQwOwotCXUxNiBtMW0yOwotCXUzMiB0eGdhaW47Ci0JdTE2IHJhZF9nYWluLCBkYWNfZ2FpbjsKLQl1OCBiYm11bHQ7Ci0JdTMyIGlxY29tcDsKLQl1MTYgaXFjb21wX2EsIGlxY29tcF9iOwotCXUzMiBsb2NvbXA7Ci0JdTE2IHRtcHZhbDsKLQl1OCB0eF9wd3JfY3RybF9zdGF0ZTsKLQlzMzIgcmZwd3Jfb2Zmc2V0OwotCXUxNiByZWd2YWxbMl07Ci0KLQlpZiAocGktPnBoeWhhbmdfYXZvaWQpCi0JCXdsY19waHlfc3RheV9pbl9jYXJyaWVyc2VhcmNoX25waHkocGksIHRydWUpOwotCi0JdHhfaW5kMCA9IDE5MjsKLQlpcV9pbmQwID0gMzIwOwotCWxvX2luZDAgPSA0NDg7Ci0KLQlmb3IgKGNvcmUgPSAwOyBjb3JlIDwgcGktPnB1YnBpLnBoeV9jb3JlbnVtOyBjb3JlKyspIHsKLQotCQlpZiAoKGNvcmVfbWFzayAmICgxIDw8IGNvcmUpKSA9PSAwKSB7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXR4cHdyY3RsX3RibCA9IChjb3JlID09IFBIWV9DT1JFXzApID8gMjYgOiAyNzsKLQotCQlpZiAodHhwd3JpbmRleCA8IDApIHsKLQkJCWlmIChwaS0+bnBoeV90eHB3cmluZGV4W2NvcmVdLmluZGV4IDwgMCkgewotCi0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmIChOUkVWX0dFKHBpLT5wdWJwaS5waHlfcmV2LCAzKSkgewotCQkJCW1vZF9waHlfcmVnKHBpLCAweDhmLAotCQkJCQkgICAgKDB4MSA8PCA4KSwKLQkJCQkJICAgIHBpLT5ucGh5X3R4cHdyaW5kZXhbY29yZV0uCi0JCQkJCSAgICBBZmVjdHJsT3ZlcnJpZGUpOwotCQkJCW1vZF9waHlfcmVnKHBpLCAweGE1LCAoMHgxIDw8IDgpLAotCQkJCQkgICAgcGktPm5waHlfdHhwd3JpbmRleFtjb3JlXS4KLQkJCQkJICAgIEFmZWN0cmxPdmVycmlkZSk7Ci0JCQl9IGVsc2UgewotCQkJCW1vZF9waHlfcmVnKHBpLCAweGE1LAotCQkJCQkgICAgKDB4MSA8PCAxNCksCi0JCQkJCSAgICBwaS0+bnBoeV90eHB3cmluZGV4W2NvcmVdLgotCQkJCQkgICAgQWZlY3RybE92ZXJyaWRlKTsKLQkJCX0KLQotCQkJd3JpdGVfcGh5X3JlZyhwaSwgKGNvcmUgPT0gUEhZX0NPUkVfMCkgPwotCQkJCSAgICAgIDB4YWEgOiAweGFiLAotCQkJCSAgICAgIHBpLT5ucGh5X3R4cHdyaW5kZXhbY29yZV0uQWZlQ3RybERhY0dhaW4pOwotCi0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIDcsIDEsICgweDExMCArIGNvcmUpLCAxNiwKLQkJCQkJCSAmcGktPm5waHlfdHhwd3JpbmRleFtjb3JlXS4KLQkJCQkJCSByYWRfZ2Fpbik7Ci0KLQkJCXdsY19waHlfdGFibGVfcmVhZF9ucGh5KHBpLCAxNSwgMSwgODcsIDE2LCAmbTFtMik7Ci0JCQltMW0yICY9ICgoY29yZSA9PSBQSFlfQ09SRV8wKSA/IDB4MDBmZiA6IDB4ZmYwMCk7Ci0JCQltMW0yIHw9ICgoY29yZSA9PSBQSFlfQ09SRV8wKSA/Ci0JCQkJIChwaS0+bnBoeV90eHB3cmluZGV4W2NvcmVdLmJibXVsdCA8PCA4KSA6Ci0JCQkJIChwaS0+bnBoeV90eHB3cmluZGV4W2NvcmVdLmJibXVsdCA8PCAwKSk7Ci0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIDE1LCAxLCA4NywgMTYsICZtMW0yKTsKLQotCQkJaWYgKHJlc3RvcmVfY2FscykgewotCi0JCQkJd2xjX3BoeV90YWJsZV93cml0ZV9ucGh5KHBpLCAxNSwgMiwKLQkJCQkJCQkgKDgwICsgMiAqIGNvcmUpLCAxNiwKLQkJCQkJCQkgKHZvaWQgKikmcGktPgotCQkJCQkJCSBucGh5X3R4cHdyaW5kZXhbY29yZV0uCi0JCQkJCQkJIGlxY29tcF9hKTsKLQotCQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgMTUsIDEsICg4NSArIGNvcmUpLAotCQkJCQkJCSAxNiwKLQkJCQkJCQkgJnBpLT4KLQkJCQkJCQkgbnBoeV90eHB3cmluZGV4W2NvcmVdLgotCQkJCQkJCSBsb2NvbXApOwotCQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgMTUsIDEsICg5MyArIGNvcmUpLAotCQkJCQkJCSAxNiwKLQkJCQkJCQkgKHZvaWQgKikmcGktPgotCQkJCQkJCSBucGh5X3R4cHdyaW5kZXhbY29yZV0uCi0JCQkJCQkJIGxvY29tcCk7Ci0JCQl9Ci0KLQkJCXdsY19waHlfdHhwd3JjdHJsX2VuYWJsZV9ucGh5KHBpLCBwaS0+bnBoeV90eHB3cmN0cmwpOwotCi0JCQlwaS0+bnBoeV90eHB3cmluZGV4W2NvcmVdLmluZGV4X2ludGVybmFsID0KLQkJCSAgICBwaS0+bnBoeV90eHB3cmluZGV4W2NvcmVdLmluZGV4X2ludGVybmFsX3NhdmU7Ci0JCX0gZWxzZSB7Ci0KLQkJCWlmIChwaS0+bnBoeV90eHB3cmluZGV4W2NvcmVdLmluZGV4IDwgMCkgewotCi0JCQkJaWYgKE5SRVZfR0UocGktPnB1YnBpLnBoeV9yZXYsIDMpKSB7Ci0JCQkJCW1vZF9waHlfcmVnKHBpLCAweDhmLAotCQkJCQkJICAgICgweDEgPDwgOCksCi0JCQkJCQkgICAgcGktPm5waHlfdHhwd3JpbmRleFtjb3JlXS4KLQkJCQkJCSAgICBBZmVjdHJsT3ZlcnJpZGUpOwotCQkJCQltb2RfcGh5X3JlZyhwaSwgMHhhNSwgKDB4MSA8PCA4KSwKLQkJCQkJCSAgICBwaS0+bnBoeV90eHB3cmluZGV4W2NvcmVdLgotCQkJCQkJICAgIEFmZWN0cmxPdmVycmlkZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcGktPm5waHlfdHhwd3JpbmRleFtjb3JlXS4KLQkJCQkJICAgIEFmZWN0cmxPdmVycmlkZSA9Ci0JCQkJCSAgICByZWFkX3BoeV9yZWcocGksIDB4YTUpOwotCQkJCX0KLQotCQkJCXBpLT5ucGh5X3R4cHdyaW5kZXhbY29yZV0uQWZlQ3RybERhY0dhaW4gPQotCQkJCSAgICByZWFkX3BoeV9yZWcocGksCi0JCQkJCQkgKGNvcmUgPT0KLQkJCQkJCSAgUEhZX0NPUkVfMCkgPyAweGFhIDogMHhhYik7Ci0KLQkJCQl3bGNfcGh5X3RhYmxlX3JlYWRfbnBoeShwaSwgNywgMSwKLQkJCQkJCQkoMHgxMTAgKyBjb3JlKSwgMTYsCi0JCQkJCQkJJnBpLT4KLQkJCQkJCQlucGh5X3R4cHdyaW5kZXhbY29yZV0uCi0JCQkJCQkJcmFkX2dhaW4pOwotCi0JCQkJd2xjX3BoeV90YWJsZV9yZWFkX25waHkocGksIDE1LCAxLCA4NywgMTYsCi0JCQkJCQkJJnRtcHZhbCk7Ci0JCQkJdG1wdmFsID4+PSAoKGNvcmUgPT0gUEhZX0NPUkVfMCkgPyA4IDogMCk7Ci0JCQkJdG1wdmFsICY9IDB4ZmY7Ci0JCQkJcGktPm5waHlfdHhwd3JpbmRleFtjb3JlXS5iYm11bHQgPQotCQkJCSAgICAodTgpIHRtcHZhbDsKLQotCQkJCXdsY19waHlfdGFibGVfcmVhZF9ucGh5KHBpLCAxNSwgMiwKLQkJCQkJCQkoODAgKyAyICogY29yZSksIDE2LAotCQkJCQkJCSh2b2lkICopJnBpLT4KLQkJCQkJCQlucGh5X3R4cHdyaW5kZXhbY29yZV0uCi0JCQkJCQkJaXFjb21wX2EpOwotCi0JCQkJd2xjX3BoeV90YWJsZV9yZWFkX25waHkocGksIDE1LCAxLCAoODUgKyBjb3JlKSwKLQkJCQkJCQkxNiwKLQkJCQkJCQkodm9pZCAqKSZwaS0+Ci0JCQkJCQkJbnBoeV90eHB3cmluZGV4W2NvcmVdLgotCQkJCQkJCWxvY29tcCk7Ci0KLQkJCQlwaS0+bnBoeV90eHB3cmluZGV4W2NvcmVdLmluZGV4X2ludGVybmFsX3NhdmUgPQotCQkJCSAgICBwaS0+bnBoeV90eHB3cmluZGV4W2NvcmVdLmluZGV4X2ludGVybmFsOwotCQkJfQotCi0JCQl0eF9wd3JfY3RybF9zdGF0ZSA9IHBpLT5ucGh5X3R4cHdyY3RybDsKLQkJCXdsY19waHlfdHhwd3JjdHJsX2VuYWJsZV9ucGh5KHBpLCBQSFlfVFBDX0hXX09GRik7Ci0KLQkJCWlmIChOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCAxKSkKLQkJCQl3bGFwaV9ibWFjX3BoeWNsa19mZ2MocGktPnNoLT5waHlzaGltLCBPTik7Ci0KLQkJCXdsY19waHlfdGFibGVfcmVhZF9ucGh5KHBpLCB0eHB3cmN0bF90YmwsIDEsCi0JCQkJCQkodHhfaW5kMCArIHR4cHdyaW5kZXgpLCAzMiwKLQkJCQkJCSZ0eGdhaW4pOwotCi0JCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJCQlyYWRfZ2FpbiA9Ci0JCQkJICAgICh0eGdhaW4gPj4gMTYpICYgKCgxIDw8ICgzMiAtIDE2ICsgMSkpIC0gMSk7Ci0JCQl9IGVsc2UgewotCQkJCXJhZF9nYWluID0KLQkJCQkgICAgKHR4Z2FpbiA+PiAxNikgJiAoKDEgPDwgKDI4IC0gMTYgKyAxKSkgLSAxKTsKLQkJCX0KLQkJCWRhY19nYWluID0gKHR4Z2FpbiA+PiA4KSAmICgoMSA8PCAoMTMgLSA4ICsgMSkpIC0gMSk7Ci0JCQliYm11bHQgPSAodHhnYWluID4+IDApICYgKCgxIDw8ICg3IC0gMCArIDEpKSAtIDEpOwotCi0JCQlpZiAoTlJFVl9HRShwaS0+cHVicGkucGh5X3JldiwgMykpIHsKLQkJCQltb2RfcGh5X3JlZyhwaSwgKChjb3JlID09IFBIWV9DT1JFXzApID8gMHg4ZiA6Ci0JCQkJCQkgMHhhNSksICgweDEgPDwgOCksICgweDEgPDwgOCkpOwotCQkJfSBlbHNlIHsKLQkJCQltb2RfcGh5X3JlZyhwaSwgMHhhNSwgKDB4MSA8PCAxNCksICgweDEgPDwgMTQpKTsKLQkJCX0KLQkJCXdyaXRlX3BoeV9yZWcocGksIChjb3JlID09IFBIWV9DT1JFXzApID8KLQkJCQkgICAgICAweGFhIDogMHhhYiwgZGFjX2dhaW4pOwotCi0JCQl3bGNfcGh5X3RhYmxlX3dyaXRlX25waHkocGksIDcsIDEsICgweDExMCArIGNvcmUpLCAxNiwKLQkJCQkJCSAmcmFkX2dhaW4pOwotCi0JCQl3bGNfcGh5X3RhYmxlX3JlYWRfbnBoeShwaSwgMTUsIDEsIDg3LCAxNiwgJm0xbTIpOwotCQkJbTFtMiAmPSAoKGNvcmUgPT0gUEhZX0NPUkVfMCkgPyAweDAwZmYgOiAweGZmMDApOwotCQkJbTFtMiB8PQotCQkJICAgICgoY29yZSA9PQotCQkJICAgICAgUEhZX0NPUkVfMCkgPyAoYmJtdWx0IDw8IDgpIDogKGJibXVsdCA8PCAwKSk7Ci0KLQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgMTUsIDEsIDg3LCAxNiwgJm0xbTIpOwotCi0JCQl3bGNfcGh5X3RhYmxlX3JlYWRfbnBoeShwaSwgdHhwd3JjdGxfdGJsLCAxLAotCQkJCQkJKGlxX2luZDAgKyB0eHB3cmluZGV4KSwgMzIsCi0JCQkJCQkmaXFjb21wKTsKLQkJCWlxY29tcF9hID0gKGlxY29tcCA+PiAxMCkgJiAoKDEgPDwgKDE5IC0gMTAgKyAxKSkgLSAxKTsKLQkJCWlxY29tcF9iID0gKGlxY29tcCA+PiAwKSAmICgoMSA8PCAoOSAtIDAgKyAxKSkgLSAxKTsKLQotCQkJaWYgKHJlc3RvcmVfY2FscykgewotCQkJCXJlZ3ZhbFswXSA9ICh1MTYpIGlxY29tcF9hOwotCQkJCXJlZ3ZhbFsxXSA9ICh1MTYpIGlxY29tcF9iOwotCQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgMTUsIDIsCi0JCQkJCQkJICg4MCArIDIgKiBjb3JlKSwgMTYsCi0JCQkJCQkJIHJlZ3ZhbCk7Ci0JCQl9Ci0KLQkJCXdsY19waHlfdGFibGVfcmVhZF9ucGh5KHBpLCB0eHB3cmN0bF90YmwsIDEsCi0JCQkJCQkobG9faW5kMCArIHR4cHdyaW5kZXgpLCAzMiwKLQkJCQkJCSZsb2NvbXApOwotCQkJaWYgKHJlc3RvcmVfY2FscykgewotCQkJCXdsY19waHlfdGFibGVfd3JpdGVfbnBoeShwaSwgMTUsIDEsICg4NSArIGNvcmUpLAotCQkJCQkJCSAxNiwgJmxvY29tcCk7Ci0JCQl9Ci0KLQkJCWlmIChOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCAxKSkKLQkJCQl3bGFwaV9ibWFjX3BoeWNsa19mZ2MocGktPnNoLT5waHlzaGltLCBPRkYpOwotCi0JCQlpZiAoUEhZX0lQQShwaSkpIHsKLQkJCQl3bGNfcGh5X3RhYmxlX3JlYWRfbnBoeShwaSwKLQkJCQkJCQkoY29yZSA9PQotCQkJCQkJCSBQSFlfQ09SRV8wID8KLQkJCQkJCQkgTlBIWV9UQkxfSURfQ09SRTFUWFBXUkNUTAotCQkJCQkJCSA6Ci0JCQkJCQkJIE5QSFlfVEJMX0lEX0NPUkUyVFhQV1JDVEwpLAotCQkJCQkJCTEsIDU3NiArIHR4cHdyaW5kZXgsIDMyLAotCQkJCQkJCSZyZnB3cl9vZmZzZXQpOwotCi0JCQkJbW9kX3BoeV9yZWcocGksIChjb3JlID09IFBIWV9DT1JFXzApID8gMHgyOTcgOgotCQkJCQkgICAgMHgyOWIsICgweDFmZiA8PCA0KSwKLQkJCQkJICAgICgoczE2KSByZnB3cl9vZmZzZXQpIDw8IDQpOwotCi0JCQkJbW9kX3BoeV9yZWcocGksIChjb3JlID09IFBIWV9DT1JFXzApID8gMHgyOTcgOgotCQkJCQkgICAgMHgyOWIsICgweDEgPDwgMiksICgxKSA8PCAyKTsKLQotCQkJfQotCi0JCQl3bGNfcGh5X3R4cHdyY3RybF9lbmFibGVfbnBoeShwaSwgdHhfcHdyX2N0cmxfc3RhdGUpOwotCQl9Ci0KLQkJcGktPm5waHlfdHhwd3JpbmRleFtjb3JlXS5pbmRleCA9IHR4cHdyaW5kZXg7Ci0JfQotCi0JaWYgKHBpLT5waHloYW5nX2F2b2lkKQotCQl3bGNfcGh5X3N0YXlfaW5fY2FycmllcnNlYXJjaF9ucGh5KHBpLCBmYWxzZSk7Ci19Ci0KLXZvaWQKLXdsY19waHlfdHhwb3dlcl9zcm9tbGltaXRfZ2V0X25waHkoc3RydWN0IGJyY21zX3BoeSAqcGksIHVpbnQgY2hhbiwgdTggKm1heF9wd3IsCi0JCQkJICAgdTggdHhwX3JhdGVfaWR4KQotewotCXU4IGNoYW5fZnJlcV9yYW5nZTsKLQotCWNoYW5fZnJlcV9yYW5nZSA9IHdsY19waHlfZ2V0X2NoYW5fZnJlcV9yYW5nZV9ucGh5KHBpLCBjaGFuKTsKLQlzd2l0Y2ggKGNoYW5fZnJlcV9yYW5nZSkgewotCWNhc2UgV0xfQ0hBTl9GUkVRX1JBTkdFXzJHOgotCQkqbWF4X3B3ciA9IHBpLT50eF9zcm9tX21heF9yYXRlXzJnW3R4cF9yYXRlX2lkeF07Ci0JCWJyZWFrOwotCWNhc2UgV0xfQ0hBTl9GUkVRX1JBTkdFXzVHTToKLQkJKm1heF9wd3IgPSBwaS0+dHhfc3JvbV9tYXhfcmF0ZV81Z19taWRbdHhwX3JhdGVfaWR4XTsKLQkJYnJlYWs7Ci0JY2FzZSBXTF9DSEFOX0ZSRVFfUkFOR0VfNUdMOgotCQkqbWF4X3B3ciA9IHBpLT50eF9zcm9tX21heF9yYXRlXzVnX2xvd1t0eHBfcmF0ZV9pZHhdOwotCQlicmVhazsKLQljYXNlIFdMX0NIQU5fRlJFUV9SQU5HRV81R0g6Ci0JCSptYXhfcHdyID0gcGktPnR4X3Nyb21fbWF4X3JhdGVfNWdfaGlbdHhwX3JhdGVfaWR4XTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJKm1heF9wd3IgPSBwaS0+dHhfc3JvbV9tYXhfcmF0ZV8yZ1t0eHBfcmF0ZV9pZHhdOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLXZvaWQgd2xjX3BoeV9zdGF5X2luX2NhcnJpZXJzZWFyY2hfbnBoeShzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgYm9vbCBlbmFibGUpCi17Ci0JdTE2IGNsaXBfb2ZmW10gPSB7IDB4ZmZmZiwgMHhmZmZmIH07Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCWlmIChwaS0+bnBoeV9kZWFmX2NvdW50ID09IDApIHsKLQkJCXBpLT5jbGFzc2lmaWVyX3N0YXRlID0KLQkJCSAgICB3bGNfcGh5X2NsYXNzaWZpZXJfbnBoeShwaSwgMCwgMCk7Ci0JCQl3bGNfcGh5X2NsYXNzaWZpZXJfbnBoeShwaSwgKDB4NyA8PCAwKSwgNCk7Ci0JCQl3bGNfcGh5X2NsaXBfZGV0X25waHkocGksIDAsIHBpLT5jbGlwX3N0YXRlKTsKLQkJCXdsY19waHlfY2xpcF9kZXRfbnBoeShwaSwgMSwgY2xpcF9vZmYpOwotCQl9Ci0KLQkJcGktPm5waHlfZGVhZl9jb3VudCsrOwotCi0JCXdsY19waHlfcmVzZXRjY2FfbnBoeShwaSk7Ci0KLQl9IGVsc2UgewotCQlwaS0+bnBoeV9kZWFmX2NvdW50LS07Ci0KLQkJaWYgKHBpLT5ucGh5X2RlYWZfY291bnQgPT0gMCkgewotCQkJd2xjX3BoeV9jbGFzc2lmaWVyX25waHkocGksICgweDcgPDwgMCksCi0JCQkJCQlwaS0+Y2xhc3NpZmllcl9zdGF0ZSk7Ci0JCQl3bGNfcGh5X2NsaXBfZGV0X25waHkocGksIDEsIHBpLT5jbGlwX3N0YXRlKTsKLQkJfQotCX0KLX0KLQotdm9pZCB3bGNfbnBoeV9kZWFmX21vZGUoc3RydWN0IGJyY21zX3BoeSAqcGksIGJvb2wgbW9kZSkKLXsKLQl3bGFwaV9zdXNwZW5kX21hY19hbmRfd2FpdChwaS0+c2gtPnBoeXNoaW0pOwotCi0JaWYgKG1vZGUpIHsKLQkJaWYgKHBpLT5ucGh5X2RlYWZfY291bnQgPT0gMCkKLQkJCXdsY19waHlfc3RheV9pbl9jYXJyaWVyc2VhcmNoX25waHkocGksIHRydWUpOwotCX0gZWxzZSB7Ci0JCWlmIChwaS0+bnBoeV9kZWFmX2NvdW50ID4gMCkKLQkJCXdsY19waHlfc3RheV9pbl9jYXJyaWVyc2VhcmNoX25waHkocGksIGZhbHNlKTsKLQl9Ci0Jd2xhcGlfZW5hYmxlX21hYyhwaS0+c2gtPnBoeXNoaW0pOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X3FtYXRoLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfcW1hdGguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmZjBjOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfcW1hdGguYworKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgInBoeV9xbWF0aC5oIgotCi0vKgotRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gbWFrZSAxNiBiaXQgdW5zaWduZWQgbXVsdGlwbGljYXRpb24uIFRvIGZpdCB0aGUgb3V0cHV0IGludG8KLTE2IGJpdHMgdGhlIDMyIGJpdCBtdWx0aXBsaWNhdGlvbiByZXN1bHQgaXMgcmlnaHQgc2hpZnRlZCBieSAxNiBiaXRzLgotKi8KLXUxNiBxbV9tdWx1MTYodTE2IG9wMSwgdTE2IG9wMikKLXsKLQlyZXR1cm4gKHUxNikgKCgodTMyKSBvcDEgKiAodTMyKSBvcDIpID4+IDE2KTsKLX0KLQotLyoKLURlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIG1ha2UgMTYgYml0IG11bHRpcGxpY2F0aW9uIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBpbiAxNiBiaXRzLgotVG8gZml0IHRoZSBtdWx0aXBsaWNhdGlvbiByZXN1bHQgaW50byAxNiBiaXRzIHRoZSBtdWx0aXBsaWNhdGlvbiByZXN1bHQgaXMgcmlnaHQgc2hpZnRlZCBieQotMTUgYml0cy4gUmlnaHQgc2hpZnRpbmcgMTUgYml0cyBpbnN0ZWFkIG9mIDE2IGJpdHMgaXMgZG9uZSB0byByZW1vdmUgdGhlIGV4dHJhIHNpZ24gYml0IGZvcm1lZAotZHVlIHRvIHRoZSBtdWx0aXBsaWNhdGlvbi4KLVdoZW4gYm90aCB0aGUgMTZiaXQgaW5wdXRzIGFyZSAweDgwMDAgdGhlbiB0aGUgb3V0cHV0IGlzIHNhdHVyYXRlZCB0byAweDdmZmZmZmZmLgotKi8KLXMxNiBxbV9tdWxzMTYoczE2IG9wMSwgczE2IG9wMikKLXsKLQlzMzIgcmVzdWx0OwotCWlmIChvcDEgPT0gKHMxNikgMHg4MDAwICYmIG9wMiA9PSAoczE2KSAweDgwMDApIHsKLQkJcmVzdWx0ID0gMHg3ZmZmZmZmZjsKLQl9IGVsc2UgewotCQlyZXN1bHQgPSAoKHMzMikgKG9wMSkgKiAoczMyKSAob3AyKSk7Ci0JfQotCXJldHVybiAoczE2KSAocmVzdWx0ID4+IDE1KTsKLX0KLQotLyoKLURlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGFkZCB0d28gMzIgYml0IG51bWJlcnMgYW5kIHJldHVybiB0aGUgMzJiaXQgcmVzdWx0LgotSWYgdGhlIHJlc3VsdCBvdmVyZmxvdyAzMiBiaXRzLCB0aGUgb3V0cHV0IHdpbGwgYmUgc2F0dXJhdGVkIHRvIDMyYml0cy4KLSovCi1zMzIgcW1fYWRkMzIoczMyIG9wMSwgczMyIG9wMikKLXsKLQlzMzIgcmVzdWx0OwotCXJlc3VsdCA9IG9wMSArIG9wMjsKLQlpZiAob3AxIDwgMCAmJiBvcDIgPCAwICYmIHJlc3VsdCA+IDApIHsKLQkJcmVzdWx0ID0gMHg4MDAwMDAwMDsKLQl9IGVsc2UgaWYgKG9wMSA+IDAgJiYgb3AyID4gMCAmJiByZXN1bHQgPCAwKSB7Ci0JCXJlc3VsdCA9IDB4N2ZmZmZmZmY7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qCi1EZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBhZGQgdHdvIDE2IGJpdCBudW1iZXJzIGFuZCByZXR1cm4gdGhlIDE2Yml0IHJlc3VsdC4KLUlmIHRoZSByZXN1bHQgb3ZlcmZsb3cgMTYgYml0cywgdGhlIG91dHB1dCB3aWxsIGJlIHNhdHVyYXRlZCB0byAxNmJpdHMuCi0qLwotczE2IHFtX2FkZDE2KHMxNiBvcDEsIHMxNiBvcDIpCi17Ci0JczE2IHJlc3VsdDsKLQlzMzIgdGVtcCA9IChzMzIpIG9wMSArIChzMzIpIG9wMjsKLQlpZiAodGVtcCA+IChzMzIpIDB4N2ZmZikgewotCQlyZXN1bHQgPSAoczE2KSAweDdmZmY7Ci0JfSBlbHNlIGlmICh0ZW1wIDwgKHMzMikgMHhmZmZmODAwMCkgewotCQlyZXN1bHQgPSAoczE2KSAweGZmZmY4MDAwOwotCX0gZWxzZSB7Ci0JCXJlc3VsdCA9IChzMTYpIHRlbXA7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qCi1EZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBtYWtlIDE2IGJpdCBzdWJ0cmFjdGlvbiBhbmQgcmV0dXJuIHRoZSAxNmJpdCByZXN1bHQuCi1JZiB0aGUgcmVzdWx0IG92ZXJmbG93IDE2IGJpdHMsIHRoZSBvdXRwdXQgd2lsbCBiZSBzYXR1cmF0ZWQgdG8gMTZiaXRzLgotKi8KLXMxNiBxbV9zdWIxNihzMTYgb3AxLCBzMTYgb3AyKQotewotCXMxNiByZXN1bHQ7Ci0JczMyIHRlbXAgPSAoczMyKSBvcDEgLSAoczMyKSBvcDI7Ci0JaWYgKHRlbXAgPiAoczMyKSAweDdmZmYpIHsKLQkJcmVzdWx0ID0gKHMxNikgMHg3ZmZmOwotCX0gZWxzZSBpZiAodGVtcCA8IChzMzIpIDB4ZmZmZjgwMDApIHsKLQkJcmVzdWx0ID0gKHMxNikgMHhmZmZmODAwMDsKLQl9IGVsc2UgewotCQlyZXN1bHQgPSAoczE2KSB0ZW1wOwotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKgotRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gbWFrZSBhIDMyIGJpdCBzYXR1cmF0ZWQgbGVmdCBzaGlmdCB3aGVuIHRoZSBzcGVjaWZpZWQgc2hpZnQKLWlzICt2ZS4gVGhpcyBmdW5jdGlvbiB3aWxsIG1ha2UgYSAzMiBiaXQgcmlnaHQgc2hpZnQgd2hlbiB0aGUgc3BlY2lmaWVkIHNoaWZ0IGlzIC12ZS4KLVRoaXMgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgYWZ0ZXIgc2hpZnRpbmcgb3BlcmF0aW9uLgotKi8KLXMzMiBxbV9zaGwzMihzMzIgb3AsIGludCBzaGlmdCkKLXsKLQlpbnQgaTsKLQlzMzIgcmVzdWx0OwotCXJlc3VsdCA9IG9wOwotCWlmIChzaGlmdCA+IDMxKQotCQlzaGlmdCA9IDMxOwotCWVsc2UgaWYgKHNoaWZ0IDwgLTMxKQotCQlzaGlmdCA9IC0zMTsKLQlpZiAoc2hpZnQgPj0gMCkgewotCQlmb3IgKGkgPSAwOyBpIDwgc2hpZnQ7IGkrKykgewotCQkJcmVzdWx0ID0gcW1fYWRkMzIocmVzdWx0LCByZXN1bHQpOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmVzdWx0ID0gcmVzdWx0ID4+ICgtc2hpZnQpOwotCX0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0vKgotRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gbWFrZSBhIDE2IGJpdCBzYXR1cmF0ZWQgbGVmdCBzaGlmdCB3aGVuIHRoZSBzcGVjaWZpZWQgc2hpZnQKLWlzICt2ZS4gVGhpcyBmdW5jdGlvbiB3aWxsIG1ha2UgYSAxNiBiaXQgcmlnaHQgc2hpZnQgd2hlbiB0aGUgc3BlY2lmaWVkIHNoaWZ0IGlzIC12ZS4KLVRoaXMgZnVuY3Rpb24gcmV0dXJuIHRoZSByZXN1bHQgYWZ0ZXIgc2hpZnRpbmcgb3BlcmF0aW9uLgotKi8KLXMxNiBxbV9zaGwxNihzMTYgb3AsIGludCBzaGlmdCkKLXsKLQlpbnQgaTsKLQlzMTYgcmVzdWx0OwotCXJlc3VsdCA9IG9wOwotCWlmIChzaGlmdCA+IDE1KQotCQlzaGlmdCA9IDE1OwotCWVsc2UgaWYgKHNoaWZ0IDwgLTE1KQotCQlzaGlmdCA9IC0xNTsKLQlpZiAoc2hpZnQgPiAwKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBzaGlmdDsgaSsrKSB7Ci0JCQlyZXN1bHQgPSBxbV9hZGQxNihyZXN1bHQsIHJlc3VsdCk7Ci0JCX0KLQl9IGVsc2UgewotCQlyZXN1bHQgPSByZXN1bHQgPj4gKC1zaGlmdCk7Ci0JfQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qCi1EZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBtYWtlIGEgMTYgYml0IHJpZ2h0IHNoaWZ0IHdoZW4gc2hpZnQgaXMgK3ZlLgotVGhpcyBmdW5jdGlvbiBtYWtlIGEgMTYgYml0IHNhdHVyYXRlZCBsZWZ0IHNoaWZ0IHdoZW4gc2hpZnQgaXMgLXZlLiBUaGlzIGZ1bmN0aW9uCi1yZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgc2hpZnQgb3BlcmF0aW9uLgotKi8KLXMxNiBxbV9zaHIxNihzMTYgb3AsIGludCBzaGlmdCkKLXsKLQlyZXR1cm4gcW1fc2hsMTYob3AsIC1zaGlmdCk7Ci19Ci0KLS8qCi1EZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiByZXR1cm4gdGhlIG51bWJlciBvZiByZWR1bmRhbnQgc2lnbiBiaXRzIGluIGEgMzIgYml0IG51bWJlci4KLUV4YW1wbGU6IHFtX25vcm0zMigweDAwMDAwMDgwKSA9IDIzCi0qLwotczE2IHFtX25vcm0zMihzMzIgb3ApCi17Ci0JdTE2IHUxNmV4dHJhU2lnbkJpdHM7Ci0JaWYgKG9wID09IDApIHsKLQkJcmV0dXJuIDMxOwotCX0gZWxzZSB7Ci0JCXUxNmV4dHJhU2lnbkJpdHMgPSAwOwotCQl3aGlsZSAoKG9wID4+IDMxKSA9PSAob3AgPj4gMzApKSB7Ci0JCQl1MTZleHRyYVNpZ25CaXRzKys7Ci0JCQlvcCA9IG9wIDw8IDE7Ci0JCX0KLQl9Ci0JcmV0dXJuIHUxNmV4dHJhU2lnbkJpdHM7Ci19Ci0KLS8qIFRoaXMgdGFibGUgaXMgbG9nMigxKyhpLzMyKSkgd2hlcmUgaT1bMDoxOjMxXSwgaW4gcS4xNSBmb3JtYXQgKi8KLXN0YXRpYyBjb25zdCBzMTYgbG9nX3RhYmxlW10gPSB7Ci0JMCwKLQkxNDU1LAotCTI4NjYsCi0JNDIzNiwKLQk1NTY4LAotCTY4NjMsCi0JODEyNCwKLQk5MzUyLAotCTEwNTQ5LAotCTExNzE2LAotCTEyODU1LAotCTEzOTY4LAotCTE1MDU1LAotCTE2MTE3LAotCTE3MTU2LAotCTE4MTczLAotCTE5MTY4LAotCTIwMTQzLAotCTIxMDk4LAotCTIyMDM0LAotCTIyOTUyLAotCTIzODUyLAotCTI0NzM2LAotCTI1NjA0LAotCTI2NDU1LAotCTI3MjkyLAotCTI4MTE0LAotCTI4OTIyLAotCTI5NzE3LAotCTMwNDk4LAotCTMxMjY3LAotCTMyMDI0Ci19OwotCi0jZGVmaW5lIExPR19UQUJMRV9TSVpFIDMyCS8qIGxvZ190YWJsZSBzaXplICovCi0jZGVmaW5lIExPRzJfTE9HX1RBQkxFX1NJWkUgNQkvKiBsb2cyKGxvZ190YWJsZSBzaXplKSAqLwotI2RlZmluZSBRX0xPR19UQUJMRSAxNQkJLyogcWZvcm1hdCBvZiBsb2dfdGFibGUgKi8KLSNkZWZpbmUgTE9HMTBfMgkJMTk3MjgJLyogbG9nMTAoMikgaW4gcS4xNiAqLwotCi0vKgotRGVzY3JpcHRpb246Ci1UaGlzIHJvdXRpbmUgdGFrZXMgdGhlIGlucHV0IG51bWJlciBOIGFuZCBpdHMgcSBmb3JtYXQgcU4gYW5kIGNvbXB1dGUKLXRoZSBsb2cxMChOKS4gVGhpcyByb3V0aW5lIGZpcnN0IG5vcm1hbGl6ZXMgdGhlIGlucHV0IG5vIE4uCVRoZW4gTiBpcyBpbiBtYWcqKDJeeCkgZm9ybWF0LgotbWFnIGlzIGFueSBudW1iZXIgaW4gdGhlIHJhbmdlIDJeMzAtKDJeMzEgLSAxKS4gVGhlbiBsb2cyKG1hZyAqIDJeeCkgPSBsb2cyKG1hZykgKyB4IGlzIGNvbXB1dGVkLgotRnJvbSB0aGF0IGxvZzEwKG1hZyAqIDJeeCkgPSBsb2cyKG1hZyAqIDJeeCkgKiBsb2cxMCgyKSBpcyBjb21wdXRlZC4KLVRoaXMgcm91dGluZSBsb29rcyB0aGUgbG9nMiB2YWx1ZSBpbiB0aGUgdGFibGUgY29uc2lkZXJpbmcgTE9HMl9MT0dfVEFCTEVfU0laRSsxIE1TQnMuCi1BcyB0aGUgTVNCIGlzIGFsd2F5cyAxLCBvbmx5IG5leHQgTE9HMl9PRl9MT0dfVEFCTEVfU0laRSBNU0JzIGFyZSB1c2VkIGZvciB0YWJsZSBsb29rdXAuCi1OZXh0IDE2IE1TQnMgYXJlIHVzZWQgZm9yIGludGVycG9sYXRpb24uCi1JbnB1dHM6Ci1OIC0gbnVtYmVyIHRvIHdoaWNoIGxvZzEwIGhhcyB0byBiZSBmb3VuZC4KLXFOIC0gcSBmb3JtYXQgb2YgTgotbG9nMTBOIC0gYWRkcmVzcyB3aGVyZSBsb2cxMChOKSB3aWxsIGJlIHdyaXR0ZW4uCi1xTG9nMTBOIC0gYWRkcmVzcyB3aGVyZSBsb2cxME4gcWZvcm1hdCB3aWxsIGJlIHdyaXR0ZW4uCi1Ob3RlL1Byb2JsZW06Ci1Gb3IgYWNjdXJhdGUgcmVzdWx0cyBpbnB1dCBzaG91bGQgYmUgaW4gbm9ybWFsaXplZCBvciBuZWFyIG5vcm1hbGl6ZWQgZm9ybS4KLSovCi12b2lkIHFtX2xvZzEwKHMzMiBOLCBzMTYgcU4sIHMxNiAqbG9nMTBOLCBzMTYgKnFMb2cxME4pCi17Ci0JczE2IHMxNm5vcm0sIHMxNnRhYmxlSW5kZXgsIHMxNmVycm9yQXBwcm94aW1hdGlvbjsKLQl1MTYgdTE2b2Zmc2V0OwotCXMzMiBzMzJsb2c7Ci0KLQkvKiBub3JtYWxpemUgdGhlIE4uICovCi0JczE2bm9ybSA9IHFtX25vcm0zMihOKTsKLQlOID0gTiA8PCBzMTZub3JtOwotCi0JLyogVGhlIHFmb3JtYXQgb2YgTiBhZnRlciBub3JtYWxpemF0aW9uLgotCSAqIC0zMCBpcyBhZGRlZCB0byB0cmVhdCB0aGUgbm8gYXMgYmV0d2VlbiAxLjAgdG8gMi4wCi0JICogaS5lLiBhZnRlciBhZGRpbmcgdGhlIC0zMCB0byB0aGUgcWZvcm1hdCB0aGUgZGVjaW1hbCBwb2ludCB3aWxsIGJlCi0JICoganVzdCByaWd0aHQgb2YgdGhlIE1TQi4gKGkuZS4gYWZ0ZXIgc2lnbiBiaXQgYW5kIDFzdCBNU0IpLiBpLmUuCi0JICogYXQgdGhlIHJpZ2h0IHNpZGUgb2YgMzB0aCBiaXQuCi0JICovCi0JcU4gPSBxTiArIHMxNm5vcm0gLSAzMDsKLQotCS8qIHRha2UgdGhlIHRhYmxlIGluZGV4IGFzIHRoZSBMT0cyX09GX0xPR19UQUJMRV9TSVpFIGJpdHMgcmlnaHQgb2YgdGhlIE1TQiAqLwotCXMxNnRhYmxlSW5kZXggPSAoczE2KSAoTiA+PiAoMzIgLSAoMiArIExPRzJfTE9HX1RBQkxFX1NJWkUpKSk7Ci0KLQkvKiByZW1vdmUgdGhlIE1TQi4gdGhlIE1TQiBpcyBhbHdheXMgMSBhZnRlciBub3JtYWxpemF0aW9uLiAqLwotCXMxNnRhYmxlSW5kZXggPQotCSAgICBzMTZ0YWJsZUluZGV4ICYgKHMxNikgKCgxIDw8IExPRzJfTE9HX1RBQkxFX1NJWkUpIC0gMSk7Ci0KLQkvKiByZW1vdmUgdGhlICgxK0xPRzJfT0ZfTE9HX1RBQkxFX1NJWkUpIE1TQnMgaW4gdGhlIE4uICovCi0JTiA9IE4gJiAoKDEgPDwgKDMyIC0gKDIgKyBMT0cyX0xPR19UQUJMRV9TSVpFKSkpIC0gMSk7Ci0KLQkvKiB0YWtlIHRoZSBvZmZzZXQgYXMgdGhlIDE2IE1TQlMgYWZ0ZXIgdGFibGUgaW5kZXguCi0JICovCi0JdTE2b2Zmc2V0ID0gKHUxNikgKE4gPj4gKDMyIC0gKDIgKyBMT0cyX0xPR19UQUJMRV9TSVpFICsgMTYpKSk7Ci0KLQkvKiBsb29rIHRoZSBsb2cgdmFsdWUgaW4gdGhlIHRhYmxlLiAqLwotCXMzMmxvZyA9IGxvZ190YWJsZVtzMTZ0YWJsZUluZGV4XTsJLyogcS4xNSBmb3JtYXQgKi8KLQotCS8qIGludGVycG9sYXRlIHVzaW5nIHRoZSBvZmZzZXQuICovCi0JczE2ZXJyb3JBcHByb3hpbWF0aW9uID0gKHMxNikgcW1fbXVsdTE2KHUxNm9mZnNldCwgKHUxNikgKGxvZ190YWJsZVtzMTZ0YWJsZUluZGV4ICsgMV0gLSBsb2dfdGFibGVbczE2dGFibGVJbmRleF0pKTsJLyogcS4xNSAqLwotCi0JczMybG9nID0gcW1fYWRkMTYoKHMxNikgczMybG9nLCBzMTZlcnJvckFwcHJveGltYXRpb24pOwkvKiBxLjE1IGZvcm1hdCAqLwotCi0JLyogYWRqdXN0IGZvciB0aGUgcWZvcm1hdCBvZiB0aGUgTiBhcwotCSAqIGxvZzIobWFnICogMl54KSA9IGxvZzIobWFnKSArIHgKLQkgKi8KLQlzMzJsb2cgPSBxbV9hZGQzMihzMzJsb2csICgoczMyKSAtcU4pIDw8IDE1KTsJLyogcS4xNSBmb3JtYXQgKi8KLQotCS8qIG5vcm1hbGl6ZSB0aGUgcmVzdWx0LiAqLwotCXMxNm5vcm0gPSBxbV9ub3JtMzIoczMybG9nKTsKLQotCS8qIGJyaW5nIGFsbCB0aGUgaW1wb3J0YW50IGJpdHMgaW50byBsb3dlciAxNiBiaXRzICovCi0JczMybG9nID0gcW1fc2hsMzIoczMybG9nLCBzMTZub3JtIC0gMTYpOwkvKiBxLjE1K3MxNm5vcm0tMTYgZm9ybWF0ICovCi0KLQkvKiBjb21wdXRlIHRoZSBsb2cxMChOKSBieSBtdWx0aXBseWluZyBsb2cyKE4pIHdpdGggbG9nMTAoMikuCi0JICogYXMgbG9nMTAobWFnICogMl54KSA9IGxvZzIobWFnICogMl54KSAqIGxvZzEwKDIpCi0JICogbG9nMTBOIGluIHEuMTUrczE2bm9ybS0xNisxIChMT0cxMF8yIGlzIGluIHEuMTYpCi0JICovCi0JKmxvZzEwTiA9IHFtX211bHMxNigoczE2KSBzMzJsb2csIChzMTYpIExPRzEwXzIpOwotCi0JLyogd3JpdGUgdGhlIHEgZm9ybWF0IG9mIHRoZSByZXN1bHQuICovCi0JKnFMb2cxME4gPSAxNSArIHMxNm5vcm0gLSAxNiArIDE7Ci0KLQlyZXR1cm47Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfcW1hdGguaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9xbWF0aC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGUzNzgzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9xbWF0aC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYgX0JSQ01fUU1BVEhfSF8KLSNkZWZpbmUgX0JSQ01fUU1BVEhfSF8KLQotI2luY2x1ZGUgPHR5cGVzLmg+Ci0KLXUxNiBxbV9tdWx1MTYodTE2IG9wMSwgdTE2IG9wMik7Ci0KLXMxNiBxbV9tdWxzMTYoczE2IG9wMSwgczE2IG9wMik7Ci0KLXMzMiBxbV9hZGQzMihzMzIgb3AxLCBzMzIgb3AyKTsKLQotczE2IHFtX2FkZDE2KHMxNiBvcDEsIHMxNiBvcDIpOwotCi1zMTYgcW1fc3ViMTYoczE2IG9wMSwgczE2IG9wMik7Ci0KLXMzMiBxbV9zaGwzMihzMzIgb3AsIGludCBzaGlmdCk7Ci0KLXMxNiBxbV9zaGwxNihzMTYgb3AsIGludCBzaGlmdCk7Ci0KLXMxNiBxbV9zaHIxNihzMTYgb3AsIGludCBzaGlmdCk7Ci0KLXMxNiBxbV9ub3JtMzIoczMyIG9wKTsKLQotdm9pZCBxbV9sb2cxMChzMzIgTiwgczE2IHFOLCBzMTYgKmxvZzEwTiwgczE2ICpxTG9nMTBOKTsKLQotI2VuZGlmCQkJCS8qICNpZm5kZWYgX0JSQ01fUU1BVEhfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9yYWRpby5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X3JhZGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYTY3NTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X3JhZGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmCV9CUkNNX1BIWV9SQURJT19IXwotI2RlZmluZQlfQlJDTV9QSFlfUkFESU9fSF8KLQotI2RlZmluZQlSQURJT19JRENPREUJCQkweDAxCi0KLSNkZWZpbmUgUkFESU9fREVGQVVMVF9DT1JFCQkwCi0KLSNkZWZpbmUJUlhDMF9SU1NJX1JTVAkJCTB4ODAKLSNkZWZpbmUJUlhDMF9NT0RFX1JTU0kJCQkweDQwCi0jZGVmaW5lCVJYQzBfTU9ERV9PRkYJCQkweDIwCi0jZGVmaW5lCVJYQzBfTU9ERV9DTQkJCTB4MTAKLSNkZWZpbmUJUlhDMF9MQU5fTE9BRAkJCTB4MDgKLSNkZWZpbmUJUlhDMF9PRkZfQURKX01BU0sJCTB4MDcKLQotI2RlZmluZQlUWEMwX01PREVfVFhMUEYJCQkweDA0Ci0jZGVmaW5lCVRYQzBfUEFfVFNTSV9FTgkJCTB4MDIKLSNkZWZpbmUJVFhDMF9UU1NJX0VOCQkJMHgwMQotCi0jZGVmaW5lCVRYQzFfUEFfR0FJTl9NQVNLCQkweDYwCi0jZGVmaW5lCVRYQzFfUEFfR0FJTl8zREIJCTB4NDAKLSNkZWZpbmUJVFhDMV9QQV9HQUlOXzJEQgkJMHgyMAotI2RlZmluZQlUWEMxX1RYX01JWF9HQUlOCQkweDEwCi0jZGVmaW5lCVRYQzFfT0ZGX0lfTUFTSwkJCTB4MGMKLSNkZWZpbmUJVFhDMV9PRkZfUV9NQVNLCQkJMHgwMwotCi0jZGVmaW5lCVJBRElPXzIwNTVfUkVBRF9PRkYJCTB4MTAwCi0jZGVmaW5lCVJBRElPXzIwNTdfUkVBRF9PRkYJCTB4MjAwCi0KLSNkZWZpbmUgUkFESU9fMjA1NV9HRU5fU1BBUkUJCTB4MDAKLSNkZWZpbmUgUkFESU9fMjA1NV9TUF9QSU5fUEQJCTB4MDIKLSNkZWZpbmUgUkFESU9fMjA1NV9TUF9SU1NJX0NPUkUxCTB4MDMKLSNkZWZpbmUgUkFESU9fMjA1NV9TUF9QRF9NSVNDX0NPUkUxCTB4MDQKLSNkZWZpbmUgUkFESU9fMjA1NV9TUF9SU1NJX0NPUkUyCTB4MDUKLSNkZWZpbmUgUkFESU9fMjA1NV9TUF9QRF9NSVNDX0NPUkUyCTB4MDYKLSNkZWZpbmUgUkFESU9fMjA1NV9TUF9SWF9HQzFfQ09SRTEJMHgwNwotI2RlZmluZSBSQURJT18yMDU1X1NQX1JYX0dDMl9DT1JFMQkweDA4Ci0jZGVmaW5lIFJBRElPXzIwNTVfU1BfUlhfR0MxX0NPUkUyCTB4MDkKLSNkZWZpbmUgUkFESU9fMjA1NV9TUF9SWF9HQzJfQ09SRTIJMHgwYQotI2RlZmluZSBSQURJT18yMDU1X1NQX0xQRl9CV19TRUxFQ1RfQ09SRTEgMHgwYgotI2RlZmluZSBSQURJT18yMDU1X1NQX0xQRl9CV19TRUxFQ1RfQ09SRTIgMHgwYwotI2RlZmluZSBSQURJT18yMDU1X1NQX1RYX0dDMV9DT1JFMQkweDBkCi0jZGVmaW5lIFJBRElPXzIwNTVfU1BfVFhfR0MyX0NPUkUxCTB4MGUKLSNkZWZpbmUgUkFESU9fMjA1NV9TUF9UWF9HQzFfQ09SRTIJMHgwZgotI2RlZmluZSBSQURJT18yMDU1X1NQX1RYX0dDMl9DT1JFMgkweDEwCi0jZGVmaW5lIFJBRElPXzIwNTVfTUFTVEVSX0NOVFJMMQkweDExCi0jZGVmaW5lIFJBRElPXzIwNTVfTUFTVEVSX0NOVFJMMgkweDEyCi0jZGVmaW5lIFJBRElPXzIwNTVfUERfTEdFTgkJMHgxMwotI2RlZmluZSBSQURJT18yMDU1X1BEX1BMTF9UUwkJMHgxNAotI2RlZmluZSBSQURJT18yMDU1X1BEX0NPUkUxX0xHQlVGCTB4MTUKLSNkZWZpbmUgUkFESU9fMjA1NV9QRF9DT1JFMV9UWAkJMHgxNgotI2RlZmluZSBSQURJT18yMDU1X1BEX0NPUkUxX1JYVFgJMHgxNwotI2RlZmluZSBSQURJT18yMDU1X1BEX0NPUkUxX1JTU0lfTUlTQwkweDE4Ci0jZGVmaW5lIFJBRElPXzIwNTVfUERfQ09SRTJfTEdCVUYJMHgxOQotI2RlZmluZSBSQURJT18yMDU1X1BEX0NPUkUyX1RYCQkweDFhCi0jZGVmaW5lIFJBRElPXzIwNTVfUERfQ09SRTJfUlhUWAkweDFiCi0jZGVmaW5lIFJBRElPXzIwNTVfUERfQ09SRTJfUlNTSV9NSVNDCTB4MWMKLSNkZWZpbmUgUkFESU9fMjA1NV9QV1JERVRfTEdFTgkJMHgxZAotI2RlZmluZSBSQURJT18yMDU1X1BXUkRFVF9MR0JVRl9DT1JFMQkweDFlCi0jZGVmaW5lIFJBRElPXzIwNTVfUFdSREVUX1JYVFhfQ09SRTEJMHgxZgotI2RlZmluZSBSQURJT18yMDU1X1BXUkRFVF9MR0JVRl9DT1JFMgkweDIwCi0jZGVmaW5lIFJBRElPXzIwNTVfUFdSREVUX1JYVFhfQ09SRTIJMHgyMQotI2RlZmluZSBSQURJT18yMDU1X1JSQ0NBTF9DTlRSTF9TUEFSRQkweDIyCi0jZGVmaW5lIFJBRElPXzIwNTVfUlJDQ0FMX05fT1BUX1NFTAkweDIzCi0jZGVmaW5lIFJBRElPXzIwNTVfQ0FMX01JU0MJCTB4MjQKLSNkZWZpbmUgUkFESU9fMjA1NV9DQUxfQ09VTlRFUl9PVVQJMHgyNQotI2RlZmluZSBSQURJT18yMDU1X0NBTF9DT1VOVEVSX09VVDIJMHgyNgotI2RlZmluZSBSQURJT18yMDU1X0NBTF9DVkFSX0NOVFJMCTB4MjcKLSNkZWZpbmUgUkFESU9fMjA1NV9DQUxfUlZBUl9DTlRSTAkweDI4Ci0jZGVmaW5lIFJBRElPXzIwNTVfQ0FMX0xQT19DTlRSTAkweDI5Ci0jZGVmaW5lIFJBRElPXzIwNTVfQ0FMX1RTCQkweDJhCi0jZGVmaW5lIFJBRElPXzIwNTVfQ0FMX1JDQ0FMX1JFQURfVFMJMHgyYgotI2RlZmluZSBSQURJT18yMDU1X0NBTF9SQ0FMX1JFQURfVFMJMHgyYwotI2RlZmluZSBSQURJT18yMDU1X1BBRF9EUklWRVIJCTB4MmQKLSNkZWZpbmUgUkFESU9fMjA1NV9YT19DTlRSTDEJCTB4MmUKLSNkZWZpbmUgUkFESU9fMjA1NV9YT19DTlRSTDIJCTB4MmYKLSNkZWZpbmUgUkFESU9fMjA1NV9YT19SRUdVTEFUT1IJCTB4MzAKLSNkZWZpbmUgUkFESU9fMjA1NV9YT19NSVNDCQkweDMxCi0jZGVmaW5lIFJBRElPXzIwNTVfUExMX0xGX0MxCQkweDMyCi0jZGVmaW5lIFJBRElPXzIwNTVfUExMX0NBTF9WVEgJCTB4MzMKLSNkZWZpbmUgUkFESU9fMjA1NV9QTExfTEZfQzIJCTB4MzQKLSNkZWZpbmUgUkFESU9fMjA1NV9QTExfUkVGCQkweDM1Ci0jZGVmaW5lIFJBRElPXzIwNTVfUExMX0xGX1IxCQkweDM2Ci0jZGVmaW5lIFJBRElPXzIwNTVfUExMX1BGRF9DUAkJMHgzNwotI2RlZmluZSBSQURJT18yMDU1X1BMTF9JREFDX0NQT1BBTVAJMHgzOAotI2RlZmluZSBSQURJT18yMDU1X1BMTF9DUF9SRUdVTEFUT1IJMHgzOQotI2RlZmluZSBSQURJT18yMDU1X1BMTF9SQ0FMCQkweDNhCi0jZGVmaW5lIFJBRElPXzIwNTVfUkZfUExMX01PRDAJCTB4M2IKLSNkZWZpbmUgUkFESU9fMjA1NV9SRl9QTExfTU9EMQkJMHgzYwotI2RlZmluZSBSQURJT18yMDU1X1JGX01NRF9JREFDMQkJMHgzZAotI2RlZmluZSBSQURJT18yMDU1X1JGX01NRF9JREFDMAkJMHgzZQotI2RlZmluZSBSQURJT18yMDU1X1JGX01NRF9TUEFSRQkJMHgzZgotI2RlZmluZSBSQURJT18yMDU1X1ZDT19DQUwxCQkweDQwCi0jZGVmaW5lIFJBRElPXzIwNTVfVkNPX0NBTDIJCTB4NDEKLSNkZWZpbmUgUkFESU9fMjA1NV9WQ09fQ0FMMwkJMHg0MgotI2RlZmluZSBSQURJT18yMDU1X1ZDT19DQUw0CQkweDQzCi0jZGVmaW5lIFJBRElPXzIwNTVfVkNPX0NBTDUJCTB4NDQKLSNkZWZpbmUgUkFESU9fMjA1NV9WQ09fQ0FMNgkJMHg0NQotI2RlZmluZSBSQURJT18yMDU1X1ZDT19DQUw3CQkweDQ2Ci0jZGVmaW5lIFJBRElPXzIwNTVfVkNPX0NBTDgJCTB4NDcKLSNkZWZpbmUgUkFESU9fMjA1NV9WQ09fQ0FMOQkJMHg0OAotI2RlZmluZSBSQURJT18yMDU1X1ZDT19DQUwxMAkJMHg0OQotI2RlZmluZSBSQURJT18yMDU1X1ZDT19DQUwxMQkJMHg0YQotI2RlZmluZSBSQURJT18yMDU1X1ZDT19DQUwxMgkJMHg0YgotI2RlZmluZSBSQURJT18yMDU1X1ZDT19DQUwxMwkJMHg0YwotI2RlZmluZSBSQURJT18yMDU1X1ZDT19DQUwxNAkJMHg0ZAotI2RlZmluZSBSQURJT18yMDU1X1ZDT19DQUwxNQkJMHg0ZQotI2RlZmluZSBSQURJT18yMDU1X1ZDT19DQUwxNgkJMHg0ZgotI2RlZmluZSBSQURJT18yMDU1X1ZDT19LVkNPCQkweDUwCi0jZGVmaW5lIFJBRElPXzIwNTVfVkNPX0NBUF9UQUlMCQkweDUxCi0jZGVmaW5lIFJBRElPXzIwNTVfVkNPX0lEQUNfVkNPCQkweDUyCi0jZGVmaW5lIFJBRElPXzIwNTVfVkNPX1JFR1VMQVRPUgkweDUzCi0jZGVmaW5lIFJBRElPXzIwNTVfUExMX1JGX1ZUSAkJMHg1NAotI2RlZmluZSBSQURJT18yMDU1X0xHQlVGX0NFTl9CVUYJMHg1NQotI2RlZmluZSBSQURJT18yMDU1X0xHRU5fVFVORTEJCTB4NTYKLSNkZWZpbmUgUkFESU9fMjA1NV9MR0VOX1RVTkUyCQkweDU3Ci0jZGVmaW5lIFJBRElPXzIwNTVfTEdFTl9JREFDMQkJMHg1OAotI2RlZmluZSBSQURJT18yMDU1X0xHRU5fSURBQzIJCTB4NTkKLSNkZWZpbmUgUkFESU9fMjA1NV9MR0VOX0JJQVNfQ05UCTB4NWEKLSNkZWZpbmUgUkFESU9fMjA1NV9MR0VOX0JJQVNfSURBQwkweDViCi0jZGVmaW5lIFJBRElPXzIwNTVfTEdFTl9SQ0FMCQkweDVjCi0jZGVmaW5lIFJBRElPXzIwNTVfTEdFTl9ESVYJCTB4NWQKLSNkZWZpbmUgUkFESU9fMjA1NV9MR0VOX1NQQVJFMgkJMHg1ZQotI2RlZmluZSBSQURJT18yMDU1X0NPUkUxX0xHQlVGX0FfVFVORQkweDVmCi0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTFfTEdCVUZfR19UVU5FCTB4NjAKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMV9MR0JVRl9ESVYJMHg2MQotI2RlZmluZSBSQURJT18yMDU1X0NPUkUxX0xHQlVGX0FfSURBQwkweDYyCi0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTFfTEdCVUZfR19JREFDCTB4NjMKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMV9MR0JVRl9JREFDRklMX09WUiAweDY0Ci0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTFfTEdCVUZfU1BBUkUJMHg2NQotI2RlZmluZSBSQURJT18yMDU1X0NPUkUxX1JYUkZfU1BDMQkweDY2Ci0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTFfUlhSRl9SRUcxCTB4NjcKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMV9SWFJGX1JFRzIJMHg2OAotI2RlZmluZSBSQURJT18yMDU1X0NPUkUxX1JYUkZfUkNBTAkweDY5Ci0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTFfUlhCQl9CVUZJX0xQRkNNUCAweDZhCi0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTFfUlhCQl9MUEYJMHg2YgotI2RlZmluZSBSQURJT18yMDU1X0NPUkUxX1JYQkJfTUlEQUNfSElQQVMgMHg2YwotI2RlZmluZSBSQURJT18yMDU1X0NPUkUxX1JYQkJfVkdBMV9JREFDCTB4NmQKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMV9SWEJCX1ZHQTJfSURBQwkweDZlCi0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTFfUlhCQl9WR0EzX0lEQUMJMHg2ZgotI2RlZmluZSBSQURJT18yMDU1X0NPUkUxX1JYQkJfQlVGT19DVFJMCTB4NzAKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMV9SWEJCX1JDQ0FMX0NUUkwgMHg3MQotI2RlZmluZSBSQURJT18yMDU1X0NPUkUxX1JYQkJfUlNTSV9DVFJMMSAweDcyCi0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTFfUlhCQl9SU1NJX0NUUkwyIDB4NzMKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMV9SWEJCX1JTU0lfQ1RSTDMgMHg3NAotI2RlZmluZSBSQURJT18yMDU1X0NPUkUxX1JYQkJfUlNTSV9DVFJMNCAweDc1Ci0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTFfUlhCQl9SU1NJX0NUUkw1IDB4NzYKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMV9SWEJCX1JFR1VMQVRPUgkweDc3Ci0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTFfUlhCQl9TUEFSRTEJMHg3OAotI2RlZmluZSBSQURJT18yMDU1X0NPUkUxX1JYVFhCQl9SQ0FMCTB4NzkKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMV9UWFJGX1NHTV9QR0EJMHg3YQotI2RlZmluZSBSQURJT18yMDU1X0NPUkUxX1RYUkZfU0dNX1BBRAkweDdiCi0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTFfVFhSRl9DTlRSX1BHQTEJMHg3YwotI2RlZmluZSBSQURJT18yMDU1X0NPUkUxX1RYUkZfQ05UUl9QQUQxCTB4N2QKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMV9UWF9SRlBHQV9JREFDCTB4N2UKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMV9UWF9QR0FfUEFEX1ROCTB4N2YKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMV9UWF9QQURfSURBQzEJMHg4MAotI2RlZmluZSBSQURJT18yMDU1X0NPUkUxX1RYX1BBRF9JREFDMgkweDgxCi0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTFfVFhfTVhfQkdUUklNCTB4ODIKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMV9UWFJGX1JDQUwJMHg4MwotI2RlZmluZSBSQURJT18yMDU1X0NPUkUxX1RYUkZfUEFEX1RTU0kxCTB4ODQKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMV9UWFJGX1BBRF9UU1NJMgkweDg1Ci0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTFfVFhfUkZfU1BBUkUJMHg4NgotI2RlZmluZSBSQURJT18yMDU1X0NPUkUxX1RYUkZfSVFDQUwxCTB4ODcKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMV9UWFJGX0lRQ0FMMgkweDg4Ci0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTFfVFhCQl9SQ0NBTF9DVFJMIDB4ODkKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMV9UWEJCX0xQRjEJMHg4YQotI2RlZmluZSBSQURJT18yMDU1X0NPUkUxX1RYX1ZPU19DTkNMCTB4OGIKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMV9UWF9MUEZfTVhHTV9JREFDIDB4OGMKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMV9UWF9CQl9NWEdNCTB4OGQKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMl9MR0JVRl9BX1RVTkUJMHg4ZQotI2RlZmluZSBSQURJT18yMDU1X0NPUkUyX0xHQlVGX0dfVFVORQkweDhmCi0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTJfTEdCVUZfRElWCTB4OTAKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMl9MR0JVRl9BX0lEQUMJMHg5MQotI2RlZmluZSBSQURJT18yMDU1X0NPUkUyX0xHQlVGX0dfSURBQwkweDkyCi0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTJfTEdCVUZfSURBQ0ZJTF9PVlIgMHg5MwotI2RlZmluZSBSQURJT18yMDU1X0NPUkUyX0xHQlVGX1NQQVJFCTB4OTQKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMl9SWFJGX1NQQzEJMHg5NQotI2RlZmluZSBSQURJT18yMDU1X0NPUkUyX1JYUkZfUkVHMQkweDk2Ci0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTJfUlhSRl9SRUcyCTB4OTcKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMl9SWFJGX1JDQUwJMHg5OAotI2RlZmluZSBSQURJT18yMDU1X0NPUkUyX1JYQkJfQlVGSV9MUEZDTVAgMHg5OQotI2RlZmluZSBSQURJT18yMDU1X0NPUkUyX1JYQkJfTFBGCTB4OWEKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMl9SWEJCX01JREFDX0hJUEFTIDB4OWIKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMl9SWEJCX1ZHQTFfSURBQwkweDljCi0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTJfUlhCQl9WR0EyX0lEQUMJMHg5ZAotI2RlZmluZSBSQURJT18yMDU1X0NPUkUyX1JYQkJfVkdBM19JREFDCTB4OWUKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMl9SWEJCX0JVRk9fQ1RSTAkweDlmCi0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTJfUlhCQl9SQ0NBTF9DVFJMIDB4YTAKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMl9SWEJCX1JTU0lfQ1RSTDEgMHhhMQotI2RlZmluZSBSQURJT18yMDU1X0NPUkUyX1JYQkJfUlNTSV9DVFJMMiAweGEyCi0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTJfUlhCQl9SU1NJX0NUUkwzIDB4YTMKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMl9SWEJCX1JTU0lfQ1RSTDQgMHhhNAotI2RlZmluZSBSQURJT18yMDU1X0NPUkUyX1JYQkJfUlNTSV9DVFJMNSAweGE1Ci0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTJfUlhCQl9SRUdVTEFUT1IJMHhhNgotI2RlZmluZSBSQURJT18yMDU1X0NPUkUyX1JYQkJfU1BBUkUxCTB4YTcKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMl9SWFRYQkJfUkNBTAkweGE4Ci0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTJfVFhSRl9TR01fUEdBCTB4YTkKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMl9UWFJGX1NHTV9QQUQJMHhhYQotI2RlZmluZSBSQURJT18yMDU1X0NPUkUyX1RYUkZfQ05UUl9QR0ExCTB4YWIKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMl9UWFJGX0NOVFJfUEFEMQkweGFjCi0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTJfVFhfUkZQR0FfSURBQwkweGFkCi0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTJfVFhfUEdBX1BBRF9UTgkweGFlCi0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTJfVFhfUEFEX0lEQUMxCTB4YWYKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMl9UWF9QQURfSURBQzIJMHhiMAotI2RlZmluZSBSQURJT18yMDU1X0NPUkUyX1RYX01YX0JHVFJJTQkweGIxCi0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTJfVFhSRl9SQ0FMCTB4YjIKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMl9UWFJGX1BBRF9UU1NJMQkweGIzCi0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTJfVFhSRl9QQURfVFNTSTIJMHhiNAotI2RlZmluZSBSQURJT18yMDU1X0NPUkUyX1RYX1JGX1NQQVJFCTB4YjUKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMl9UWFJGX0lRQ0FMMQkweGI2Ci0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTJfVFhSRl9JUUNBTDIJMHhiNwotI2RlZmluZSBSQURJT18yMDU1X0NPUkUyX1RYQkJfUkNDQUxfQ1RSTCAweGI4Ci0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTJfVFhCQl9MUEYxCTB4YjkKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMl9UWF9WT1NfQ05DTAkweGJhCi0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTJfVFhfTFBGX01YR01fSURBQyAweGJiCi0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTJfVFhfQkJfTVhHTQkweGJjCi0jZGVmaW5lIFJBRElPXzIwNTVfUFJHX0dDX0hQVkdBMjNfMjEJMHhiZAotI2RlZmluZSBSQURJT18yMDU1X1BSR19HQ19IUFZHQTIzXzIyCTB4YmUKLSNkZWZpbmUgUkFESU9fMjA1NV9QUkdfR0NfSFBWR0EyM18yMwkweGJmCi0jZGVmaW5lIFJBRElPXzIwNTVfUFJHX0dDX0hQVkdBMjNfMjQJMHhjMAotI2RlZmluZSBSQURJT18yMDU1X1BSR19HQ19IUFZHQTIzXzI1CTB4YzEKLSNkZWZpbmUgUkFESU9fMjA1NV9QUkdfR0NfSFBWR0EyM18yNgkweGMyCi0jZGVmaW5lIFJBRElPXzIwNTVfUFJHX0dDX0hQVkdBMjNfMjcJMHhjMwotI2RlZmluZSBSQURJT18yMDU1X1BSR19HQ19IUFZHQTIzXzI4CTB4YzQKLSNkZWZpbmUgUkFESU9fMjA1NV9QUkdfR0NfSFBWR0EyM18yOQkweGM1Ci0jZGVmaW5lIFJBRElPXzIwNTVfUFJHX0dDX0hQVkdBMjNfMzAJMHhjNgotI2RlZmluZSBSQURJT18yMDU1X0NPUkUxX0xOQV9HQUlOQlNUCTB4Y2QKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMV9CMF9OQlJTU0lfVkNNCTB4ZDIKLSNkZWZpbmUgUkFESU9fMjA1NV9DT1JFMV9HRU5fU1BBUkUyCQkweGQ2Ci0jZGVmaW5lIFJBRElPXzIwNTVfQ09SRTJfTE5BX0dBSU5CU1QJMHhkOQotI2RlZmluZSBSQURJT18yMDU1X0NPUkUyX0IwX05CUlNTSV9WQ00JMHhkZQotI2RlZmluZSBSQURJT18yMDU1X0NPUkUyX0dFTl9TUEFSRTIJCTB4ZTIKLQotI2RlZmluZSBSQURJT18yMDU1X0dBSU5CU1RfR0FJTl9EQgk2Ci0jZGVmaW5lIFJBRElPXzIwNTVfR0FJTkJTVF9DT0RFCQkweDYKLQotI2RlZmluZSBSQURJT18yMDU1X0pUQUdDVFJMX01BU0sJMHgwNAotI2RlZmluZSBSQURJT18yMDU1X0pUQUdTWU5DX01BU0sJMHgwOAotI2RlZmluZSBSQURJT18yMDU1X1JSQ0FMX1NUQVJUCQkweDQwCi0jZGVmaW5lIFJBRElPXzIwNTVfUlJDQUxfUlNUX04JCTB4MDEKLSNkZWZpbmUgUkFESU9fMjA1NV9DQUxfTFBPX0VOQUJMRQkweDgwCi0jZGVmaW5lIFJBRElPXzIwNTVfUkNBTF9ET05FCQkweDgwCi0jZGVmaW5lIFJBRElPXzIwNTVfTkJSU1NJX1ZDTV9JX01BU0sJMHgwMwotI2RlZmluZSBSQURJT18yMDU1X05CUlNTSV9WQ01fSV9TSElGVAkweDAwCi0jZGVmaW5lIFJBRElPXzIwNTVfTkJSU1NJX1ZDTV9RX01BU0sJMHgwMwotI2RlZmluZSBSQURJT18yMDU1X05CUlNTSV9WQ01fUV9TSElGVAkweDAwCi0jZGVmaW5lIFJBRElPXzIwNTVfV0JSU1NJX1ZDTV9JUV9NQVNLCTB4MGMKLSNkZWZpbmUgUkFESU9fMjA1NV9XQlJTU0lfVkNNX0lRX1NISUZUCTB4MDIKLSNkZWZpbmUgUkFESU9fMjA1NV9OQlJTU0lfUEQJCTB4MDEKLSNkZWZpbmUgUkFESU9fMjA1NV9XQlJTU0lfRzFfUEQJCTB4MDQKLSNkZWZpbmUgUkFESU9fMjA1NV9XQlJTU0lfRzJfUEQJCTB4MDIKLSNkZWZpbmUgUkFESU9fMjA1NV9OQlJTU0lfU0VMCQkweDAxCi0jZGVmaW5lIFJBRElPXzIwNTVfV0JSU1NJX0cxX1NFTAkweDA0Ci0jZGVmaW5lIFJBRElPXzIwNTVfV0JSU1NJX0cyX1NFTAkweDAyCi0jZGVmaW5lIFJBRElPXzIwNTVfQ09VUExFX1JYX01BU0sJMHgwMQotI2RlZmluZSBSQURJT18yMDU1X0NPVVBMRV9UWF9NQVNLCTB4MDIKLSNkZWZpbmUgUkFESU9fMjA1NV9HQUlOQlNUX0RJU0FCTEUJMHgwMgotI2RlZmluZSBSQURJT18yMDU1X0dBSU5CU1RfVkFMX01BU0sJMHgwNwotI2RlZmluZSBSQURJT18yMDU1X1JYTVhfR0NfTUFTSwkJMHgwYwotCi0jZGVmaW5lIFJBRElPX01JTU9fQ09SRVNFTF9PRkYJCTB4MAotI2RlZmluZSBSQURJT19NSU1PX0NPUkVTRUxfQ09SRTEJMHgxCi0jZGVmaW5lIFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMgkweDIKLSNkZWZpbmUgUkFESU9fTUlNT19DT1JFU0VMX0NPUkUzCTB4MwotI2RlZmluZSBSQURJT19NSU1PX0NPUkVTRUxfQ09SRTQJMHg0Ci0jZGVmaW5lIFJBRElPX01JTU9fQ09SRVNFTF9BTExSWAkweDUKLSNkZWZpbmUgUkFESU9fTUlNT19DT1JFU0VMX0FMTFRYCTB4NgotI2RlZmluZSBSQURJT19NSU1PX0NPUkVTRUxfQUxMUlhUWAkweDcKLQotI2RlZmluZQlSQURJT18yMDY0X1JFQURfT0ZGCQkweDIwMAotCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDAwICAgICAgICAgICAgICAgMHgwCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDAxICAgICAgICAgICAgICAgMHgxCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDAyICAgICAgICAgICAgICAgMHgyCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDAzICAgICAgICAgICAgICAgMHgzCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDA0ICAgICAgICAgICAgICAgMHg0Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDA1ICAgICAgICAgICAgICAgMHg1Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDA2ICAgICAgICAgICAgICAgMHg2Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDA3ICAgICAgICAgICAgICAgMHg3Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDA4ICAgICAgICAgICAgICAgMHg4Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDA5ICAgICAgICAgICAgICAgMHg5Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDBBICAgICAgICAgICAgICAgMHhhCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDBCICAgICAgICAgICAgICAgMHhiCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDBDICAgICAgICAgICAgICAgMHhjCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDBEICAgICAgICAgICAgICAgMHhkCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDBFICAgICAgICAgICAgICAgMHhlCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDBGICAgICAgICAgICAgICAgMHhmCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDEwICAgICAgICAgICAgICAgMHgxMAotI2RlZmluZSBSQURJT18yMDY0X1JFRzAxMSAgICAgICAgICAgICAgIDB4MTEKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwMTIgICAgICAgICAgICAgICAweDEyCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDEzICAgICAgICAgICAgICAgMHgxMwotI2RlZmluZSBSQURJT18yMDY0X1JFRzAxNCAgICAgICAgICAgICAgIDB4MTQKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwMTUgICAgICAgICAgICAgICAweDE1Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDE2ICAgICAgICAgICAgICAgMHgxNgotI2RlZmluZSBSQURJT18yMDY0X1JFRzAxNyAgICAgICAgICAgICAgIDB4MTcKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwMTggICAgICAgICAgICAgICAweDE4Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDE5ICAgICAgICAgICAgICAgMHgxOQotI2RlZmluZSBSQURJT18yMDY0X1JFRzAxQSAgICAgICAgICAgICAgIDB4MWEKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwMUIgICAgICAgICAgICAgICAweDFiCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDFDICAgICAgICAgICAgICAgMHgxYwotI2RlZmluZSBSQURJT18yMDY0X1JFRzAxRCAgICAgICAgICAgICAgIDB4MWQKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwMUUgICAgICAgICAgICAgICAweDFlCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDFGICAgICAgICAgICAgICAgMHgxZgotI2RlZmluZSBSQURJT18yMDY0X1JFRzAyMCAgICAgICAgICAgICAgIDB4MjAKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwMjEgICAgICAgICAgICAgICAweDIxCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDIyICAgICAgICAgICAgICAgMHgyMgotI2RlZmluZSBSQURJT18yMDY0X1JFRzAyMyAgICAgICAgICAgICAgIDB4MjMKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwMjQgICAgICAgICAgICAgICAweDI0Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDI1ICAgICAgICAgICAgICAgMHgyNQotI2RlZmluZSBSQURJT18yMDY0X1JFRzAyNiAgICAgICAgICAgICAgIDB4MjYKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwMjcgICAgICAgICAgICAgICAweDI3Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDI4ICAgICAgICAgICAgICAgMHgyOAotI2RlZmluZSBSQURJT18yMDY0X1JFRzAyOSAgICAgICAgICAgICAgIDB4MjkKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwMkEgICAgICAgICAgICAgICAweDJhCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDJCICAgICAgICAgICAgICAgMHgyYgotI2RlZmluZSBSQURJT18yMDY0X1JFRzAyQyAgICAgICAgICAgICAgIDB4MmMKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwMkQgICAgICAgICAgICAgICAweDJkCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDJFICAgICAgICAgICAgICAgMHgyZQotI2RlZmluZSBSQURJT18yMDY0X1JFRzAyRiAgICAgICAgICAgICAgIDB4MmYKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwMzAgICAgICAgICAgICAgICAweDMwCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDMxICAgICAgICAgICAgICAgMHgzMQotI2RlZmluZSBSQURJT18yMDY0X1JFRzAzMiAgICAgICAgICAgICAgIDB4MzIKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwMzMgICAgICAgICAgICAgICAweDMzCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDM0ICAgICAgICAgICAgICAgMHgzNAotI2RlZmluZSBSQURJT18yMDY0X1JFRzAzNSAgICAgICAgICAgICAgIDB4MzUKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwMzYgICAgICAgICAgICAgICAweDM2Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDM3ICAgICAgICAgICAgICAgMHgzNwotI2RlZmluZSBSQURJT18yMDY0X1JFRzAzOCAgICAgICAgICAgICAgIDB4MzgKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwMzkgICAgICAgICAgICAgICAweDM5Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDNBICAgICAgICAgICAgICAgMHgzYQotI2RlZmluZSBSQURJT18yMDY0X1JFRzAzQiAgICAgICAgICAgICAgIDB4M2IKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwM0MgICAgICAgICAgICAgICAweDNjCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDNEICAgICAgICAgICAgICAgMHgzZAotI2RlZmluZSBSQURJT18yMDY0X1JFRzAzRSAgICAgICAgICAgICAgIDB4M2UKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwM0YgICAgICAgICAgICAgICAweDNmCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDQwICAgICAgICAgICAgICAgMHg0MAotI2RlZmluZSBSQURJT18yMDY0X1JFRzA0MSAgICAgICAgICAgICAgIDB4NDEKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwNDIgICAgICAgICAgICAgICAweDQyCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDQzICAgICAgICAgICAgICAgMHg0MwotI2RlZmluZSBSQURJT18yMDY0X1JFRzA0NCAgICAgICAgICAgICAgIDB4NDQKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwNDUgICAgICAgICAgICAgICAweDQ1Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDQ2ICAgICAgICAgICAgICAgMHg0NgotI2RlZmluZSBSQURJT18yMDY0X1JFRzA0NyAgICAgICAgICAgICAgIDB4NDcKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwNDggICAgICAgICAgICAgICAweDQ4Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDQ5ICAgICAgICAgICAgICAgMHg0OQotI2RlZmluZSBSQURJT18yMDY0X1JFRzA0QSAgICAgICAgICAgICAgIDB4NGEKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwNEIgICAgICAgICAgICAgICAweDRiCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDRDICAgICAgICAgICAgICAgMHg0YwotI2RlZmluZSBSQURJT18yMDY0X1JFRzA0RCAgICAgICAgICAgICAgIDB4NGQKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwNEUgICAgICAgICAgICAgICAweDRlCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDRGICAgICAgICAgICAgICAgMHg0ZgotI2RlZmluZSBSQURJT18yMDY0X1JFRzA1MCAgICAgICAgICAgICAgIDB4NTAKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwNTEgICAgICAgICAgICAgICAweDUxCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDUyICAgICAgICAgICAgICAgMHg1MgotI2RlZmluZSBSQURJT18yMDY0X1JFRzA1MyAgICAgICAgICAgICAgIDB4NTMKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwNTQgICAgICAgICAgICAgICAweDU0Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDU1ICAgICAgICAgICAgICAgMHg1NQotI2RlZmluZSBSQURJT18yMDY0X1JFRzA1NiAgICAgICAgICAgICAgIDB4NTYKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwNTcgICAgICAgICAgICAgICAweDU3Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDU4ICAgICAgICAgICAgICAgMHg1OAotI2RlZmluZSBSQURJT18yMDY0X1JFRzA1OSAgICAgICAgICAgICAgIDB4NTkKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwNUEgICAgICAgICAgICAgICAweDVhCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDVCICAgICAgICAgICAgICAgMHg1YgotI2RlZmluZSBSQURJT18yMDY0X1JFRzA1QyAgICAgICAgICAgICAgIDB4NWMKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwNUQgICAgICAgICAgICAgICAweDVkCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDVFICAgICAgICAgICAgICAgMHg1ZQotI2RlZmluZSBSQURJT18yMDY0X1JFRzA1RiAgICAgICAgICAgICAgIDB4NWYKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwNjAgICAgICAgICAgICAgICAweDYwCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDYxICAgICAgICAgICAgICAgMHg2MQotI2RlZmluZSBSQURJT18yMDY0X1JFRzA2MiAgICAgICAgICAgICAgIDB4NjIKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwNjMgICAgICAgICAgICAgICAweDYzCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDY0ICAgICAgICAgICAgICAgMHg2NAotI2RlZmluZSBSQURJT18yMDY0X1JFRzA2NSAgICAgICAgICAgICAgIDB4NjUKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwNjYgICAgICAgICAgICAgICAweDY2Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDY3ICAgICAgICAgICAgICAgMHg2NwotI2RlZmluZSBSQURJT18yMDY0X1JFRzA2OCAgICAgICAgICAgICAgIDB4NjgKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwNjkgICAgICAgICAgICAgICAweDY5Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDZBICAgICAgICAgICAgICAgMHg2YQotI2RlZmluZSBSQURJT18yMDY0X1JFRzA2QiAgICAgICAgICAgICAgIDB4NmIKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwNkMgICAgICAgICAgICAgICAweDZjCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDZEICAgICAgICAgICAgICAgMHg2ZAotI2RlZmluZSBSQURJT18yMDY0X1JFRzA2RSAgICAgICAgICAgICAgIDB4NmUKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwNkYgICAgICAgICAgICAgICAweDZmCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDcwICAgICAgICAgICAgICAgMHg3MAotI2RlZmluZSBSQURJT18yMDY0X1JFRzA3MSAgICAgICAgICAgICAgIDB4NzEKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwNzIgICAgICAgICAgICAgICAweDcyCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDczICAgICAgICAgICAgICAgMHg3MwotI2RlZmluZSBSQURJT18yMDY0X1JFRzA3NCAgICAgICAgICAgICAgIDB4NzQKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwNzUgICAgICAgICAgICAgICAweDc1Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDc2ICAgICAgICAgICAgICAgMHg3NgotI2RlZmluZSBSQURJT18yMDY0X1JFRzA3NyAgICAgICAgICAgICAgIDB4NzcKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwNzggICAgICAgICAgICAgICAweDc4Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDc5ICAgICAgICAgICAgICAgMHg3OQotI2RlZmluZSBSQURJT18yMDY0X1JFRzA3QSAgICAgICAgICAgICAgIDB4N2EKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwN0IgICAgICAgICAgICAgICAweDdiCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDdDICAgICAgICAgICAgICAgMHg3YwotI2RlZmluZSBSQURJT18yMDY0X1JFRzA3RCAgICAgICAgICAgICAgIDB4N2QKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwN0UgICAgICAgICAgICAgICAweDdlCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDdGICAgICAgICAgICAgICAgMHg3ZgotI2RlZmluZSBSQURJT18yMDY0X1JFRzA4MCAgICAgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwODEgICAgICAgICAgICAgICAweDgxCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDgyICAgICAgICAgICAgICAgMHg4MgotI2RlZmluZSBSQURJT18yMDY0X1JFRzA4MyAgICAgICAgICAgICAgIDB4ODMKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwODQgICAgICAgICAgICAgICAweDg0Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDg1ICAgICAgICAgICAgICAgMHg4NQotI2RlZmluZSBSQURJT18yMDY0X1JFRzA4NiAgICAgICAgICAgICAgIDB4ODYKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwODcgICAgICAgICAgICAgICAweDg3Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDg4ICAgICAgICAgICAgICAgMHg4OAotI2RlZmluZSBSQURJT18yMDY0X1JFRzA4OSAgICAgICAgICAgICAgIDB4ODkKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwOEEgICAgICAgICAgICAgICAweDhhCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDhCICAgICAgICAgICAgICAgMHg4YgotI2RlZmluZSBSQURJT18yMDY0X1JFRzA4QyAgICAgICAgICAgICAgIDB4OGMKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwOEQgICAgICAgICAgICAgICAweDhkCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDhFICAgICAgICAgICAgICAgMHg4ZQotI2RlZmluZSBSQURJT18yMDY0X1JFRzA4RiAgICAgICAgICAgICAgIDB4OGYKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwOTAgICAgICAgICAgICAgICAweDkwCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDkxICAgICAgICAgICAgICAgMHg5MQotI2RlZmluZSBSQURJT18yMDY0X1JFRzA5MiAgICAgICAgICAgICAgIDB4OTIKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwOTMgICAgICAgICAgICAgICAweDkzCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDk0ICAgICAgICAgICAgICAgMHg5NAotI2RlZmluZSBSQURJT18yMDY0X1JFRzA5NSAgICAgICAgICAgICAgIDB4OTUKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwOTYgICAgICAgICAgICAgICAweDk2Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDk3ICAgICAgICAgICAgICAgMHg5NwotI2RlZmluZSBSQURJT18yMDY0X1JFRzA5OCAgICAgICAgICAgICAgIDB4OTgKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwOTkgICAgICAgICAgICAgICAweDk5Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDlBICAgICAgICAgICAgICAgMHg5YQotI2RlZmluZSBSQURJT18yMDY0X1JFRzA5QiAgICAgICAgICAgICAgIDB4OWIKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwOUMgICAgICAgICAgICAgICAweDljCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMDlEICAgICAgICAgICAgICAgMHg5ZAotI2RlZmluZSBSQURJT18yMDY0X1JFRzA5RSAgICAgICAgICAgICAgIDB4OWUKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwOUYgICAgICAgICAgICAgICAweDlmCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEEwICAgICAgICAgICAgICAgMHhhMAotI2RlZmluZSBSQURJT18yMDY0X1JFRzBBMSAgICAgICAgICAgICAgIDB4YTEKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwQTIgICAgICAgICAgICAgICAweGEyCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEEzICAgICAgICAgICAgICAgMHhhMwotI2RlZmluZSBSQURJT18yMDY0X1JFRzBBNCAgICAgICAgICAgICAgIDB4YTQKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwQTUgICAgICAgICAgICAgICAweGE1Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEE2ICAgICAgICAgICAgICAgMHhhNgotI2RlZmluZSBSQURJT18yMDY0X1JFRzBBNyAgICAgICAgICAgICAgIDB4YTcKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwQTggICAgICAgICAgICAgICAweGE4Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEE5ICAgICAgICAgICAgICAgMHhhOQotI2RlZmluZSBSQURJT18yMDY0X1JFRzBBQSAgICAgICAgICAgICAgIDB4YWEKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwQUIgICAgICAgICAgICAgICAweGFiCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEFDICAgICAgICAgICAgICAgMHhhYwotI2RlZmluZSBSQURJT18yMDY0X1JFRzBBRCAgICAgICAgICAgICAgIDB4YWQKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwQUUgICAgICAgICAgICAgICAweGFlCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEFGICAgICAgICAgICAgICAgMHhhZgotI2RlZmluZSBSQURJT18yMDY0X1JFRzBCMCAgICAgICAgICAgICAgIDB4YjAKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwQjEgICAgICAgICAgICAgICAweGIxCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEIyICAgICAgICAgICAgICAgMHhiMgotI2RlZmluZSBSQURJT18yMDY0X1JFRzBCMyAgICAgICAgICAgICAgIDB4YjMKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwQjQgICAgICAgICAgICAgICAweGI0Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEI1ICAgICAgICAgICAgICAgMHhiNQotI2RlZmluZSBSQURJT18yMDY0X1JFRzBCNiAgICAgICAgICAgICAgIDB4YjYKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwQjcgICAgICAgICAgICAgICAweGI3Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEI4ICAgICAgICAgICAgICAgMHhiOAotI2RlZmluZSBSQURJT18yMDY0X1JFRzBCOSAgICAgICAgICAgICAgIDB4YjkKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwQkEgICAgICAgICAgICAgICAweGJhCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEJCICAgICAgICAgICAgICAgMHhiYgotI2RlZmluZSBSQURJT18yMDY0X1JFRzBCQyAgICAgICAgICAgICAgIDB4YmMKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwQkQgICAgICAgICAgICAgICAweGJkCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEJFICAgICAgICAgICAgICAgMHhiZQotI2RlZmluZSBSQURJT18yMDY0X1JFRzBCRiAgICAgICAgICAgICAgIDB4YmYKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwQzAgICAgICAgICAgICAgICAweGMwCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEMxICAgICAgICAgICAgICAgMHhjMQotI2RlZmluZSBSQURJT18yMDY0X1JFRzBDMiAgICAgICAgICAgICAgIDB4YzIKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwQzMgICAgICAgICAgICAgICAweGMzCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEM0ICAgICAgICAgICAgICAgMHhjNAotI2RlZmluZSBSQURJT18yMDY0X1JFRzBDNSAgICAgICAgICAgICAgIDB4YzUKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwQzYgICAgICAgICAgICAgICAweGM2Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEM3ICAgICAgICAgICAgICAgMHhjNwotI2RlZmluZSBSQURJT18yMDY0X1JFRzBDOCAgICAgICAgICAgICAgIDB4YzgKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwQzkgICAgICAgICAgICAgICAweGM5Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMENBICAgICAgICAgICAgICAgMHhjYQotI2RlZmluZSBSQURJT18yMDY0X1JFRzBDQiAgICAgICAgICAgICAgIDB4Y2IKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwQ0MgICAgICAgICAgICAgICAweGNjCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMENEICAgICAgICAgICAgICAgMHhjZAotI2RlZmluZSBSQURJT18yMDY0X1JFRzBDRSAgICAgICAgICAgICAgIDB4Y2UKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwQ0YgICAgICAgICAgICAgICAweGNmCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEQwICAgICAgICAgICAgICAgMHhkMAotI2RlZmluZSBSQURJT18yMDY0X1JFRzBEMSAgICAgICAgICAgICAgIDB4ZDEKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwRDIgICAgICAgICAgICAgICAweGQyCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEQzICAgICAgICAgICAgICAgMHhkMwotI2RlZmluZSBSQURJT18yMDY0X1JFRzBENCAgICAgICAgICAgICAgIDB4ZDQKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwRDUgICAgICAgICAgICAgICAweGQ1Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEQ2ICAgICAgICAgICAgICAgMHhkNgotI2RlZmluZSBSQURJT18yMDY0X1JFRzBENyAgICAgICAgICAgICAgIDB4ZDcKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwRDggICAgICAgICAgICAgICAweGQ4Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEQ5ICAgICAgICAgICAgICAgMHhkOQotI2RlZmluZSBSQURJT18yMDY0X1JFRzBEQSAgICAgICAgICAgICAgIDB4ZGEKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwREIgICAgICAgICAgICAgICAweGRiCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMERDICAgICAgICAgICAgICAgMHhkYwotI2RlZmluZSBSQURJT18yMDY0X1JFRzBERCAgICAgICAgICAgICAgIDB4ZGQKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwREUgICAgICAgICAgICAgICAweGRlCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMERGICAgICAgICAgICAgICAgMHhkZgotI2RlZmluZSBSQURJT18yMDY0X1JFRzBFMCAgICAgICAgICAgICAgIDB4ZTAKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwRTEgICAgICAgICAgICAgICAweGUxCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEUyICAgICAgICAgICAgICAgMHhlMgotI2RlZmluZSBSQURJT18yMDY0X1JFRzBFMyAgICAgICAgICAgICAgIDB4ZTMKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwRTQgICAgICAgICAgICAgICAweGU0Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEU1ICAgICAgICAgICAgICAgMHhlNQotI2RlZmluZSBSQURJT18yMDY0X1JFRzBFNiAgICAgICAgICAgICAgIDB4ZTYKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwRTcgICAgICAgICAgICAgICAweGU3Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEU4ICAgICAgICAgICAgICAgMHhlOAotI2RlZmluZSBSQURJT18yMDY0X1JFRzBFOSAgICAgICAgICAgICAgIDB4ZTkKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwRUEgICAgICAgICAgICAgICAweGVhCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEVCICAgICAgICAgICAgICAgMHhlYgotI2RlZmluZSBSQURJT18yMDY0X1JFRzBFQyAgICAgICAgICAgICAgIDB4ZWMKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwRUQgICAgICAgICAgICAgICAweGVkCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEVFICAgICAgICAgICAgICAgMHhlZQotI2RlZmluZSBSQURJT18yMDY0X1JFRzBFRiAgICAgICAgICAgICAgIDB4ZWYKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwRjAgICAgICAgICAgICAgICAweGYwCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEYxICAgICAgICAgICAgICAgMHhmMQotI2RlZmluZSBSQURJT18yMDY0X1JFRzBGMiAgICAgICAgICAgICAgIDB4ZjIKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwRjMgICAgICAgICAgICAgICAweGYzCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEY0ICAgICAgICAgICAgICAgMHhmNAotI2RlZmluZSBSQURJT18yMDY0X1JFRzBGNSAgICAgICAgICAgICAgIDB4ZjUKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwRjYgICAgICAgICAgICAgICAweGY2Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEY3ICAgICAgICAgICAgICAgMHhmNwotI2RlZmluZSBSQURJT18yMDY0X1JFRzBGOCAgICAgICAgICAgICAgIDB4ZjgKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwRjkgICAgICAgICAgICAgICAweGY5Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEZBICAgICAgICAgICAgICAgMHhmYQotI2RlZmluZSBSQURJT18yMDY0X1JFRzBGQiAgICAgICAgICAgICAgIDB4ZmIKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwRkMgICAgICAgICAgICAgICAweGZjCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMEZEICAgICAgICAgICAgICAgMHhmZAotI2RlZmluZSBSQURJT18yMDY0X1JFRzBGRSAgICAgICAgICAgICAgIDB4ZmUKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcwRkYgICAgICAgICAgICAgICAweGZmCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMTAwICAgICAgICAgICAgICAgMHgxMDAKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcxMDEgICAgICAgICAgICAgICAweDEwMQotI2RlZmluZSBSQURJT18yMDY0X1JFRzEwMiAgICAgICAgICAgICAgIDB4MTAyCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMTAzICAgICAgICAgICAgICAgMHgxMDMKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcxMDQgICAgICAgICAgICAgICAweDEwNAotI2RlZmluZSBSQURJT18yMDY0X1JFRzEwNSAgICAgICAgICAgICAgIDB4MTA1Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMTA2ICAgICAgICAgICAgICAgMHgxMDYKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcxMDcgICAgICAgICAgICAgICAweDEwNwotI2RlZmluZSBSQURJT18yMDY0X1JFRzEwOCAgICAgICAgICAgICAgIDB4MTA4Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMTA5ICAgICAgICAgICAgICAgMHgxMDkKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcxMEEgICAgICAgICAgICAgICAweDEwYQotI2RlZmluZSBSQURJT18yMDY0X1JFRzEwQiAgICAgICAgICAgICAgIDB4MTBiCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMTBDICAgICAgICAgICAgICAgMHgxMGMKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcxMEQgICAgICAgICAgICAgICAweDEwZAotI2RlZmluZSBSQURJT18yMDY0X1JFRzEwRSAgICAgICAgICAgICAgIDB4MTBlCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMTBGICAgICAgICAgICAgICAgMHgxMGYKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcxMTAgICAgICAgICAgICAgICAweDExMAotI2RlZmluZSBSQURJT18yMDY0X1JFRzExMSAgICAgICAgICAgICAgIDB4MTExCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMTEyICAgICAgICAgICAgICAgMHgxMTIKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcxMTMgICAgICAgICAgICAgICAweDExMwotI2RlZmluZSBSQURJT18yMDY0X1JFRzExNCAgICAgICAgICAgICAgIDB4MTE0Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMTE1ICAgICAgICAgICAgICAgMHgxMTUKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcxMTYgICAgICAgICAgICAgICAweDExNgotI2RlZmluZSBSQURJT18yMDY0X1JFRzExNyAgICAgICAgICAgICAgIDB4MTE3Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMTE4ICAgICAgICAgICAgICAgMHgxMTgKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcxMTkgICAgICAgICAgICAgICAweDExOQotI2RlZmluZSBSQURJT18yMDY0X1JFRzExQSAgICAgICAgICAgICAgIDB4MTFhCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMTFCICAgICAgICAgICAgICAgMHgxMWIKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcxMUMgICAgICAgICAgICAgICAweDExYwotI2RlZmluZSBSQURJT18yMDY0X1JFRzExRCAgICAgICAgICAgICAgIDB4MTFkCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMTFFICAgICAgICAgICAgICAgMHgxMWUKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcxMUYgICAgICAgICAgICAgICAweDExZgotI2RlZmluZSBSQURJT18yMDY0X1JFRzEyMCAgICAgICAgICAgICAgIDB4MTIwCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMTIxICAgICAgICAgICAgICAgMHgxMjEKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcxMjIgICAgICAgICAgICAgICAweDEyMgotI2RlZmluZSBSQURJT18yMDY0X1JFRzEyMyAgICAgICAgICAgICAgIDB4MTIzCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMTI0ICAgICAgICAgICAgICAgMHgxMjQKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcxMjUgICAgICAgICAgICAgICAweDEyNQotI2RlZmluZSBSQURJT18yMDY0X1JFRzEyNiAgICAgICAgICAgICAgIDB4MTI2Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMTI3ICAgICAgICAgICAgICAgMHgxMjcKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcxMjggICAgICAgICAgICAgICAweDEyOAotI2RlZmluZSBSQURJT18yMDY0X1JFRzEyOSAgICAgICAgICAgICAgIDB4MTI5Ci0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMTJBICAgICAgICAgICAgICAgMHgxMmEKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcxMkIgICAgICAgICAgICAgICAweDEyYgotI2RlZmluZSBSQURJT18yMDY0X1JFRzEyQyAgICAgICAgICAgICAgIDB4MTJjCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMTJEICAgICAgICAgICAgICAgMHgxMmQKLSNkZWZpbmUgUkFESU9fMjA2NF9SRUcxMkUgICAgICAgICAgICAgICAweDEyZQotI2RlZmluZSBSQURJT18yMDY0X1JFRzEyRiAgICAgICAgICAgICAgIDB4MTJmCi0jZGVmaW5lIFJBRElPXzIwNjRfUkVHMTMwICAgICAgICAgICAgICAgMHgxMzAKLQotI2RlZmluZSBSQURJT18yMDU2X1NZTiAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDAgPDwgMTIpCi0jZGVmaW5lIFJBRElPXzIwNTZfVFgwICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MiA8PCAxMikKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWDEgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzIDw8IDEyKQotI2RlZmluZSBSQURJT18yMDU2X1JYMCAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDYgPDwgMTIpCi0jZGVmaW5lIFJBRElPXzIwNTZfUlgxICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4NyA8PCAxMikKLSNkZWZpbmUgUkFESU9fMjA1Nl9BTExUWCAgICAgICAgICAgICAgICAgICAgICAgICAoMHhlIDw8IDEyKQotI2RlZmluZSBSQURJT18yMDU2X0FMTFJYICAgICAgICAgICAgICAgICAgICAgICAgICgweGYgPDwgMTIpCi0KLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUkVTRVJWRURfQUREUjAgICAgICAgICAgICAweDAKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fSURDT0RFICAgICAgICAgICAgICAgICAgICAweDEKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUkVTRVJWRURfQUREUjIgICAgICAgICAgICAweDIKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUkVTRVJWRURfQUREUjMgICAgICAgICAgICAweDMKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUkVTRVJWRURfQUREUjQgICAgICAgICAgICAweDQKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUkVTRVJWRURfQUREUjUgICAgICAgICAgICAweDUKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUkVTRVJWRURfQUREUjYgICAgICAgICAgICAweDYKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUkVTRVJWRURfQUREUjcgICAgICAgICAgICAweDcKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fQ09NX0NUUkwgICAgICAgICAgICAgICAgICAweDgKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fQ09NX1BVICAgICAgICAgICAgICAgICAgICAweDkKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fQ09NX09WUiAgICAgICAgICAgICAgICAgICAweGEKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fQ09NX1JFU0VUICAgICAgICAgICAgICAgICAweGIKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fQ09NX1JDQUwgICAgICAgICAgICAgICAgICAweGMKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fQ09NX1JDX1JYTFBGICAgICAgICAgICAgICAweGQKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fQ09NX1JDX1RYTFBGICAgICAgICAgICAgICAweGUKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fQ09NX1JDX1JYSFBGICAgICAgICAgICAgICAweGYKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUkVTRVJWRURfQUREUjE2ICAgICAgICAgICAweDEwCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1JFU0VSVkVEX0FERFIxNyAgICAgICAgICAgMHgxMQotI2RlZmluZSBSQURJT18yMDU2X1NZTl9SRVNFUlZFRF9BRERSMTggICAgICAgICAgIDB4MTIKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUkVTRVJWRURfQUREUjE5ICAgICAgICAgICAweDEzCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1JFU0VSVkVEX0FERFIyMCAgICAgICAgICAgMHgxNAotI2RlZmluZSBSQURJT18yMDU2X1NZTl9SRVNFUlZFRF9BRERSMjEgICAgICAgICAgIDB4MTUKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUkVTRVJWRURfQUREUjIyICAgICAgICAgICAweDE2Ci0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1JFU0VSVkVEX0FERFIyMyAgICAgICAgICAgMHgxNwotI2RlZmluZSBSQURJT18yMDU2X1NZTl9SRVNFUlZFRF9BRERSMjQgICAgICAgICAgIDB4MTgKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUkVTRVJWRURfQUREUjI1ICAgICAgICAgICAweDE5Ci0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1JFU0VSVkVEX0FERFIyNiAgICAgICAgICAgMHgxYQotI2RlZmluZSBSQURJT18yMDU2X1NZTl9SRVNFUlZFRF9BRERSMjcgICAgICAgICAgIDB4MWIKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUkVTRVJWRURfQUREUjI4ICAgICAgICAgICAweDFjCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1JFU0VSVkVEX0FERFIyOSAgICAgICAgICAgMHgxZAotI2RlZmluZSBSQURJT18yMDU2X1NZTl9SRVNFUlZFRF9BRERSMzAgICAgICAgICAgIDB4MWUKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUkVTRVJWRURfQUREUjMxICAgICAgICAgICAweDFmCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0dQSU9fTUFTVEVSMSAgICAgICAgICAgICAgMHgyMAotI2RlZmluZSBSQURJT18yMDU2X1NZTl9HUElPX01BU1RFUjIgICAgICAgICAgICAgIDB4MjEKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fVE9QQklBU19NQVNURVIgICAgICAgICAgICAweDIyCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1RPUEJJQVNfUkNBTCAgICAgICAgICAgICAgMHgyMwotI2RlZmluZSBSQURJT18yMDU2X1NZTl9BRkVSRUcgICAgICAgICAgICAgICAgICAgIDB4MjQKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fVEVNUFBST0NTRU5TRSAgICAgICAgICAgICAweDI1Ci0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1RFTVBQUk9DU0VOU0VJREFDICAgICAgICAgMHgyNgotI2RlZmluZSBSQURJT18yMDU2X1NZTl9URU1QUFJPQ1NFTlNFUkNBTCAgICAgICAgIDB4MjcKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTFBPICAgICAgICAgICAgICAgICAgICAgICAweDI4Ci0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1ZERENBTF9NQVNURVIgICAgICAgICAgICAgMHgyOQotI2RlZmluZSBSQURJT18yMDU2X1NZTl9WRERDQUxfSURBQyAgICAgICAgICAgICAgIDB4MmEKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fVkREQ0FMX1NUQVRVUyAgICAgICAgICAgICAweDJiCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1JDQUxfTUFTVEVSICAgICAgICAgICAgICAgMHgyYwotI2RlZmluZSBSQURJT18yMDU2X1NZTl9SQ0FMX0NPREVfT1VUICAgICAgICAgICAgIDB4MmQKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUkNDQUxfQ1RSTDAgICAgICAgICAgICAgICAweDJlCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1JDQ0FMX0NUUkwxICAgICAgICAgICAgICAgMHgyZgotI2RlZmluZSBSQURJT18yMDU2X1NZTl9SQ0NBTF9DVFJMMiAgICAgICAgICAgICAgIDB4MzAKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUkNDQUxfQ1RSTDMgICAgICAgICAgICAgICAweDMxCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1JDQ0FMX0NUUkw0ICAgICAgICAgICAgICAgMHgzMgotI2RlZmluZSBSQURJT18yMDU2X1NZTl9SQ0NBTF9DVFJMNSAgICAgICAgICAgICAgIDB4MzMKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUkNDQUxfQ1RSTDYgICAgICAgICAgICAgICAweDM0Ci0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1JDQ0FMX0NUUkw3ICAgICAgICAgICAgICAgMHgzNQotI2RlZmluZSBSQURJT18yMDU2X1NZTl9SQ0NBTF9DVFJMOCAgICAgICAgICAgICAgIDB4MzYKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUkNDQUxfQ1RSTDkgICAgICAgICAgICAgICAweDM3Ci0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1JDQ0FMX0NUUkwxMCAgICAgICAgICAgICAgMHgzOAotI2RlZmluZSBSQURJT18yMDU2X1NZTl9SQ0NBTF9DVFJMMTEgICAgICAgICAgICAgIDB4MzkKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fWkNBTF9TUEFSRTEgICAgICAgICAgICAgICAweDNhCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1pDQUxfU1BBUkUyICAgICAgICAgICAgICAgMHgzYgotI2RlZmluZSBSQURJT18yMDU2X1NZTl9QTExfTUFTVDEgICAgICAgICAgICAgICAgIDB4M2MKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUExMX01BU1QyICAgICAgICAgICAgICAgICAweDNkCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1BMTF9NQVNUMyAgICAgICAgICAgICAgICAgMHgzZQotI2RlZmluZSBSQURJT18yMDU2X1NZTl9QTExfQklBU19SRVNFVCAgICAgICAgICAgIDB4M2YKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUExMX1hUQUwwICAgICAgICAgICAgICAgICAweDQwCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1BMTF9YVEFMMSAgICAgICAgICAgICAgICAgMHg0MQotI2RlZmluZSBSQURJT18yMDU2X1NZTl9QTExfWFRBTDMgICAgICAgICAgICAgICAgIDB4NDIKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUExMX1hUQUw0ICAgICAgICAgICAgICAgICAweDQzCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1BMTF9YVEFMNSAgICAgICAgICAgICAgICAgMHg0NAotI2RlZmluZSBSQURJT18yMDU2X1NZTl9QTExfWFRBTDYgICAgICAgICAgICAgICAgIDB4NDUKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUExMX1JFRkRJViAgICAgICAgICAgICAgICAweDQ2Ci0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1BMTF9QRkQgICAgICAgICAgICAgICAgICAgMHg0NwotI2RlZmluZSBSQURJT18yMDU2X1NZTl9QTExfQ1AxICAgICAgICAgICAgICAgICAgIDB4NDgKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUExMX0NQMiAgICAgICAgICAgICAgICAgICAweDQ5Ci0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1BMTF9DUDMgICAgICAgICAgICAgICAgICAgMHg0YQotI2RlZmluZSBSQURJT18yMDU2X1NZTl9QTExfTE9PUEZJTFRFUjEgICAgICAgICAgIDB4NGIKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUExMX0xPT1BGSUxURVIyICAgICAgICAgICAweDRjCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1BMTF9MT09QRklMVEVSMyAgICAgICAgICAgMHg0ZAotI2RlZmluZSBSQURJT18yMDU2X1NZTl9QTExfTE9PUEZJTFRFUjQgICAgICAgICAgIDB4NGUKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUExMX0xPT1BGSUxURVI1ICAgICAgICAgICAweDRmCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1BMTF9NTUQxICAgICAgICAgICAgICAgICAgMHg1MAotI2RlZmluZSBSQURJT18yMDU2X1NZTl9QTExfTU1EMiAgICAgICAgICAgICAgICAgIDB4NTEKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUExMX1ZDTzEgICAgICAgICAgICAgICAgICAweDUyCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1BMTF9WQ08yICAgICAgICAgICAgICAgICAgMHg1MwotI2RlZmluZSBSQURJT18yMDU2X1NZTl9QTExfTU9OSVRPUjEgICAgICAgICAgICAgIDB4NTQKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUExMX01PTklUT1IyICAgICAgICAgICAgICAweDU1Ci0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1BMTF9WQ09DQUwxICAgICAgICAgICAgICAgMHg1NgotI2RlZmluZSBSQURJT18yMDU2X1NZTl9QTExfVkNPQ0FMMiAgICAgICAgICAgICAgIDB4NTcKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUExMX1ZDT0NBTDQgICAgICAgICAgICAgICAweDU4Ci0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1BMTF9WQ09DQUw1ICAgICAgICAgICAgICAgMHg1OQotI2RlZmluZSBSQURJT18yMDU2X1NZTl9QTExfVkNPQ0FMNiAgICAgICAgICAgICAgIDB4NWEKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUExMX1ZDT0NBTDcgICAgICAgICAgICAgICAweDViCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1BMTF9WQ09DQUw4ICAgICAgICAgICAgICAgMHg1YwotI2RlZmluZSBSQURJT18yMDU2X1NZTl9QTExfVkNPQ0FMOSAgICAgICAgICAgICAgIDB4NWQKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUExMX1ZDT0NBTDEwICAgICAgICAgICAgICAweDVlCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1BMTF9WQ09DQUwxMSAgICAgICAgICAgICAgMHg1ZgotI2RlZmluZSBSQURJT18yMDU2X1NZTl9QTExfVkNPQ0FMMTIgICAgICAgICAgICAgIDB4NjAKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUExMX1ZDT0NBTDEzICAgICAgICAgICAgICAweDYxCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1BMTF9WUkVHICAgICAgICAgICAgICAgICAgMHg2MgotI2RlZmluZSBSQURJT18yMDU2X1NZTl9QTExfU1RBVFVTMSAgICAgICAgICAgICAgIDB4NjMKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fUExMX1NUQVRVUzIgICAgICAgICAgICAgICAweDY0Ci0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX1BMTF9TVEFUVVMzICAgICAgICAgICAgICAgMHg2NQotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9QVTAgICAgICAgICAgICAgICAgIDB4NjYKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fUFUxICAgICAgICAgICAgICAgICAweDY3Ci0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX1BVMiAgICAgICAgICAgICAgICAgMHg2OAotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9QVTMgICAgICAgICAgICAgICAgIDB4NjkKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fUFU1ICAgICAgICAgICAgICAgICAweDZhCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX1BVNiAgICAgICAgICAgICAgICAgMHg2YgotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9QVTcgICAgICAgICAgICAgICAgIDB4NmMKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fUFU4ICAgICAgICAgICAgICAgICAweDZkCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX0JJQVNfUkVTRVQgICAgICAgICAgMHg2ZQotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9SQ0NSMSAgICAgICAgICAgICAgIDB4NmYKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fVkNPQlVGMSAgICAgICAgICAgICAweDcwCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX01JWEVSMSAgICAgICAgICAgICAgMHg3MQotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9NSVhFUjIgICAgICAgICAgICAgIDB4NzIKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fQlVGMSAgICAgICAgICAgICAgICAweDczCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOQlVGMiAgICAgICAgICAgICAgICAgMHg3NAotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9CVUYzICAgICAgICAgICAgICAgIDB4NzUKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fQlVGNCAgICAgICAgICAgICAgICAweDc2Ci0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX0RJVjEgICAgICAgICAgICAgICAgMHg3NwotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9ESVYyICAgICAgICAgICAgICAgIDB4NzgKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fRElWMyAgICAgICAgICAgICAgICAweDc5Ci0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX0FDTDEgICAgICAgICAgICAgICAgMHg3YQotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9BQ0wyICAgICAgICAgICAgICAgIDB4N2IKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fQUNMMyAgICAgICAgICAgICAgICAweDdjCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX0FDTDQgICAgICAgICAgICAgICAgMHg3ZAotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9BQ0w1ICAgICAgICAgICAgICAgIDB4N2UKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fQUNMNiAgICAgICAgICAgICAgICAweDdmCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX0FDTE9VVCAgICAgICAgICAgICAgMHg4MAotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9BQ0xDQUwxICAgICAgICAgICAgIDB4ODEKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fQUNMQ0FMMiAgICAgICAgICAgICAweDgyCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX0FDTENBTDMgICAgICAgICAgICAgMHg4MwotI2RlZmluZSBSQURJT18yMDU2X1NZTl9DQUxFTiAgICAgICAgICAgICAgICAgICAgIDB4ODQKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fUEVBS0RFVDEgICAgICAgICAgICAweDg1Ci0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX0NPUkVfQUNMX09WUiAgICAgICAgMHg4NgotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9SWF9ESUZGX0FDTF9PVlIgICAgIDB4ODcKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fVFhfRElGRl9BQ0xfT1ZSICAgICAweDg4Ci0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX1JYX0NNT1NfQUNMX09WUiAgICAgMHg4OQotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9UWF9DTU9TX0FDTF9PVlIgICAgIDB4OGEKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fVkNPQlVGMiAgICAgICAgICAgICAweDhiCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX01JWEVSMyAgICAgICAgICAgICAgMHg4YwotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9CVUY1ICAgICAgICAgICAgICAgIDB4OGQKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fQlVGNiAgICAgICAgICAgICAgICAweDhlCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX0NCVUZSWDEgICAgICAgICAgICAgMHg4ZgotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9DQlVGUlgyICAgICAgICAgICAgIDB4OTAKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fQ0JVRlJYMyAgICAgICAgICAgICAweDkxCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX0NCVUZSWDQgICAgICAgICAgICAgMHg5MgotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9DQlVGVFgxICAgICAgICAgICAgIDB4OTMKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fQ0JVRlRYMiAgICAgICAgICAgICAweDk0Ci0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX0NCVUZUWDMgICAgICAgICAgICAgMHg5NQotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9DQlVGVFg0ICAgICAgICAgICAgIDB4OTYKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fQ01PU1JYMSAgICAgICAgICAgICAweDk3Ci0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX0NNT1NSWDIgICAgICAgICAgICAgMHg5OAotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9DTU9TUlgzICAgICAgICAgICAgIDB4OTkKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fQ01PU1JYNCAgICAgICAgICAgICAweDlhCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX0NNT1NUWDEgICAgICAgICAgICAgMHg5YgotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9DTU9TVFgyICAgICAgICAgICAgIDB4OWMKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fQ01PU1RYMyAgICAgICAgICAgICAweDlkCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX0NNT1NUWDQgICAgICAgICAgICAgMHg5ZQotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9WQ09CVUYyX09WUlZBTCAgICAgIDB4OWYKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fTUlYRVIzX09WUlZBTCAgICAgICAweGEwCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX0JVRjVfT1ZSVkFMICAgICAgICAgMHhhMQotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9CVUY2X09WUlZBTCAgICAgICAgIDB4YTIKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fQ0JVRlJYMV9PVlJWQUwgICAgICAweGEzCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX0NCVUZSWDJfT1ZSVkFMICAgICAgMHhhNAotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9DQlVGUlgzX09WUlZBTCAgICAgIDB4YTUKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fQ0JVRlJYNF9PVlJWQUwgICAgICAweGE2Ci0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX0NCVUZUWDFfT1ZSVkFMICAgICAgMHhhNwotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9DQlVGVFgyX09WUlZBTCAgICAgIDB4YTgKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fQ0JVRlRYM19PVlJWQUwgICAgICAweGE5Ci0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX0NCVUZUWDRfT1ZSVkFMICAgICAgMHhhYQotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9DTU9TUlgxX09WUlZBTCAgICAgIDB4YWIKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fQ01PU1JYMl9PVlJWQUwgICAgICAweGFjCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX0NNT1NSWDNfT1ZSVkFMICAgICAgMHhhZAotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9DTU9TUlg0X09WUlZBTCAgICAgIDB4YWUKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fQ01PU1RYMV9PVlJWQUwgICAgICAweGFmCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX0NNT1NUWDJfT1ZSVkFMICAgICAgMHhiMAotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9DTU9TVFgzX09WUlZBTCAgICAgIDB4YjEKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fQ01PU1RYNF9PVlJWQUwgICAgICAweGIyCi0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX0FDTF9XQUlUQ05UICAgICAgICAgMHhiMwotI2RlZmluZSBSQURJT18yMDU2X1NZTl9MT0dFTl9DT1JFX0NBTFZBTElEICAgICAgIDB4YjQKLSNkZWZpbmUgUkFESU9fMjA1Nl9TWU5fTE9HRU5fUlhfQ01PU19DQUxWQUxJRCAgICAweGI1Ci0jZGVmaW5lIFJBRElPXzIwNTZfU1lOX0xPR0VOX1RYX0NNT1NfVkFMSUQgICAgICAgMHhiNgotCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfUkVTRVJWRURfQUREUjAgICAgICAgICAgICAgMHgwCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfSURDT0RFICAgICAgICAgICAgICAgICAgICAgMHgxCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfUkVTRVJWRURfQUREUjIgICAgICAgICAgICAgMHgyCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfUkVTRVJWRURfQUREUjMgICAgICAgICAgICAgMHgzCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfUkVTRVJWRURfQUREUjQgICAgICAgICAgICAgMHg0Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfUkVTRVJWRURfQUREUjUgICAgICAgICAgICAgMHg1Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfUkVTRVJWRURfQUREUjYgICAgICAgICAgICAgMHg2Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfUkVTRVJWRURfQUREUjcgICAgICAgICAgICAgMHg3Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfQ09NX0NUUkwgICAgICAgICAgICAgICAgICAgMHg4Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfQ09NX1BVICAgICAgICAgICAgICAgICAgICAgMHg5Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfQ09NX09WUiAgICAgICAgICAgICAgICAgICAgMHhhCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfQ09NX1JFU0VUICAgICAgICAgICAgICAgICAgMHhiCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfQ09NX1JDQUwgICAgICAgICAgICAgICAgICAgMHhjCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfQ09NX1JDX1JYTFBGICAgICAgICAgICAgICAgMHhkCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfQ09NX1JDX1RYTFBGICAgICAgICAgICAgICAgMHhlCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfQ09NX1JDX1JYSFBGICAgICAgICAgICAgICAgMHhmCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfUkVTRVJWRURfQUREUjE2ICAgICAgICAgICAgMHgxMAotI2RlZmluZSBSQURJT18yMDU2X1RYX1JFU0VSVkVEX0FERFIxNyAgICAgICAgICAgIDB4MTEKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9SRVNFUlZFRF9BRERSMTggICAgICAgICAgICAweDEyCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfUkVTRVJWRURfQUREUjE5ICAgICAgICAgICAgMHgxMwotI2RlZmluZSBSQURJT18yMDU2X1RYX1JFU0VSVkVEX0FERFIyMCAgICAgICAgICAgIDB4MTQKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9SRVNFUlZFRF9BRERSMjEgICAgICAgICAgICAweDE1Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfUkVTRVJWRURfQUREUjIyICAgICAgICAgICAgMHgxNgotI2RlZmluZSBSQURJT18yMDU2X1RYX1JFU0VSVkVEX0FERFIyMyAgICAgICAgICAgIDB4MTcKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9SRVNFUlZFRF9BRERSMjQgICAgICAgICAgICAweDE4Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfUkVTRVJWRURfQUREUjI1ICAgICAgICAgICAgMHgxOQotI2RlZmluZSBSQURJT18yMDU2X1RYX1JFU0VSVkVEX0FERFIyNiAgICAgICAgICAgIDB4MWEKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9SRVNFUlZFRF9BRERSMjcgICAgICAgICAgICAweDFiCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfUkVTRVJWRURfQUREUjI4ICAgICAgICAgICAgMHgxYwotI2RlZmluZSBSQURJT18yMDU2X1RYX1JFU0VSVkVEX0FERFIyOSAgICAgICAgICAgIDB4MWQKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9SRVNFUlZFRF9BRERSMzAgICAgICAgICAgICAweDFlCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfUkVTRVJWRURfQUREUjMxICAgICAgICAgICAgMHgxZgotI2RlZmluZSBSQURJT18yMDU2X1RYX0lRQ0FMX0dBSU5fQlcgICAgICAgICAgICAgIDB4MjAKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9MT0ZUX0ZJTkVfSSAgICAgICAgICAgICAgICAweDIxCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfTE9GVF9GSU5FX1EgICAgICAgICAgICAgICAgMHgyMgotI2RlZmluZSBSQURJT18yMDU2X1RYX0xPRlRfQ09BUlNFX0kgICAgICAgICAgICAgIDB4MjMKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9MT0ZUX0NPQVJTRV9RICAgICAgICAgICAgICAweDI0Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfVFhfQ09NX01BU1RFUjEgICAgICAgICAgICAgMHgyNQotI2RlZmluZSBSQURJT18yMDU2X1RYX1RYX0NPTV9NQVNURVIyICAgICAgICAgICAgIDB4MjYKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9SWElRQ0FMX1RYTVVYICAgICAgICAgICAgICAweDI3Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfVFhfU1NJX01BU1RFUiAgICAgICAgICAgICAgMHgyOAotI2RlZmluZSBSQURJT18yMDU2X1RYX0lRQ0FMX1ZDTV9IRyAgICAgICAgICAgICAgIDB4MjkKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9JUUNBTF9JREFDICAgICAgICAgICAgICAgICAweDJhCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfVFNTSV9WQ00gICAgICAgICAgICAgICAgICAgMHgyYgotI2RlZmluZSBSQURJT18yMDU2X1RYX1RYX0FNUF9ERVQgICAgICAgICAgICAgICAgIDB4MmMKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9UWF9TU0lfTVVYICAgICAgICAgICAgICAgICAweDJkCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfVFNTSUEgICAgICAgICAgICAgICAgICAgICAgMHgyZQotI2RlZmluZSBSQURJT18yMDU2X1RYX1RTU0lHICAgICAgICAgICAgICAgICAgICAgIDB4MmYKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9UU1NJX01JU0MxICAgICAgICAgICAgICAgICAweDMwCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfVFNTSV9NSVNDMiAgICAgICAgICAgICAgICAgMHgzMQotI2RlZmluZSBSQURJT18yMDU2X1RYX1RTU0lfTUlTQzMgICAgICAgICAgICAgICAgIDB4MzIKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9QQV9TUEFSRTEgICAgICAgICAgICAgICAgICAweDMzCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfUEFfU1BBUkUyICAgICAgICAgICAgICAgICAgMHgzNAotI2RlZmluZSBSQURJT18yMDU2X1RYX0lOVFBBQV9NQVNURVIgICAgICAgICAgICAgIDB4MzUKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9JTlRQQUFfR0FJTiAgICAgICAgICAgICAgICAweDM2Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfSU5UUEFBX0JPT1NUX1RVTkUgICAgICAgICAgMHgzNwotI2RlZmluZSBSQURJT18yMDU2X1RYX0lOVFBBQV9JQVVYX1NUQVQgICAgICAgICAgIDB4MzgKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9JTlRQQUFfSUFVWF9EWU4gICAgICAgICAgICAweDM5Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfSU5UUEFBX0lNQUlOX1NUQVQgICAgICAgICAgMHgzYQotI2RlZmluZSBSQURJT18yMDU2X1RYX0lOVFBBQV9JTUFJTl9EWU4gICAgICAgICAgIDB4M2IKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9JTlRQQUFfQ0FTQ0JJQVMgICAgICAgICAgICAweDNjCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfSU5UUEFBX1BBU0xPUEUgICAgICAgICAgICAgMHgzZAotI2RlZmluZSBSQURJT18yMDU2X1RYX0lOVFBBQV9QQV9NSVNDICAgICAgICAgICAgIDB4M2UKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9JTlRQQUdfTUFTVEVSICAgICAgICAgICAgICAweDNmCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfSU5UUEFHX0dBSU4gICAgICAgICAgICAgICAgMHg0MAotI2RlZmluZSBSQURJT18yMDU2X1RYX0lOVFBBR19CT09TVF9UVU5FICAgICAgICAgIDB4NDEKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9JTlRQQUdfSUFVWF9TVEFUICAgICAgICAgICAweDQyCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfSU5UUEFHX0lBVVhfRFlOICAgICAgICAgICAgMHg0MwotI2RlZmluZSBSQURJT18yMDU2X1RYX0lOVFBBR19JTUFJTl9TVEFUICAgICAgICAgIDB4NDQKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9JTlRQQUdfSU1BSU5fRFlOICAgICAgICAgICAweDQ1Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfSU5UUEFHX0NBU0NCSUFTICAgICAgICAgICAgMHg0NgotI2RlZmluZSBSQURJT18yMDU2X1RYX0lOVFBBR19QQVNMT1BFICAgICAgICAgICAgIDB4NDcKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9JTlRQQUdfUEFfTUlTQyAgICAgICAgICAgICAweDQ4Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfUEFEQV9NQVNURVIgICAgICAgICAgICAgICAgMHg0OQotI2RlZmluZSBSQURJT18yMDU2X1RYX1BBREFfSURBQyAgICAgICAgICAgICAgICAgIDB4NGEKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9QQURBX0NBU0NCSUFTICAgICAgICAgICAgICAweDRiCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfUEFEQV9HQUlOICAgICAgICAgICAgICAgICAgMHg0YwotI2RlZmluZSBSQURJT18yMDU2X1RYX1BBREFfQk9PU1RfVFVORSAgICAgICAgICAgIDB4NGQKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9QQURBX1NMT1BFICAgICAgICAgICAgICAgICAweDRlCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfUEFER19NQVNURVIgICAgICAgICAgICAgICAgMHg0ZgotI2RlZmluZSBSQURJT18yMDU2X1RYX1BBREdfSURBQyAgICAgICAgICAgICAgICAgIDB4NTAKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9QQURHX0NBU0NCSUFTICAgICAgICAgICAgICAweDUxCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfUEFER19HQUlOICAgICAgICAgICAgICAgICAgMHg1MgotI2RlZmluZSBSQURJT18yMDU2X1RYX1BBREdfQk9PU1RfVFVORSAgICAgICAgICAgIDB4NTMKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9QQURHX1NMT1BFICAgICAgICAgICAgICAgICAweDU0Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfUEdBQV9NQVNURVIgICAgICAgICAgICAgICAgMHg1NQotI2RlZmluZSBSQURJT18yMDU2X1RYX1BHQUFfSURBQyAgICAgICAgICAgICAgICAgIDB4NTYKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9QR0FBX0dBSU4gICAgICAgICAgICAgICAgICAweDU3Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfUEdBQV9CT09TVF9UVU5FICAgICAgICAgICAgMHg1OAotI2RlZmluZSBSQURJT18yMDU2X1RYX1BHQUFfU0xPUEUgICAgICAgICAgICAgICAgIDB4NTkKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9QR0FBX01JU0MgICAgICAgICAgICAgICAgICAweDVhCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfUEdBR19NQVNURVIgICAgICAgICAgICAgICAgMHg1YgotI2RlZmluZSBSQURJT18yMDU2X1RYX1BHQUdfSURBQyAgICAgICAgICAgICAgICAgIDB4NWMKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9QR0FHX0dBSU4gICAgICAgICAgICAgICAgICAweDVkCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfUEdBR19CT09TVF9UVU5FICAgICAgICAgICAgMHg1ZQotI2RlZmluZSBSQURJT18yMDU2X1RYX1BHQUdfU0xPUEUgICAgICAgICAgICAgICAgIDB4NWYKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9QR0FHX01JU0MgICAgICAgICAgICAgICAgICAweDYwCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfTUlYQV9NQVNURVIgICAgICAgICAgICAgICAgMHg2MQotI2RlZmluZSBSQURJT18yMDU2X1RYX01JWEFfQk9PU1RfVFVORSAgICAgICAgICAgIDB4NjIKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9NSVhHICAgICAgICAgICAgICAgICAgICAgICAweDYzCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfTUlYR19CT09TVF9UVU5FICAgICAgICAgICAgMHg2NAotI2RlZmluZSBSQURJT18yMDU2X1RYX0JCX0dNX01BU1RFUiAgICAgICAgICAgICAgIDB4NjUKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9HTUJCX0dNICAgICAgICAgICAgICAgICAgICAweDY2Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfR01CQl9JREFDICAgICAgICAgICAgICAgICAgMHg2NwotI2RlZmluZSBSQURJT18yMDU2X1RYX1RYTFBGX01BU1RFUiAgICAgICAgICAgICAgIDB4NjgKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9UWExQRl9SQ0NBTCAgICAgICAgICAgICAgICAweDY5Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfVFhMUEZfUkNDQUxfT0ZGMCAgICAgICAgICAgMHg2YQotI2RlZmluZSBSQURJT18yMDU2X1RYX1RYTFBGX1JDQ0FMX09GRjEgICAgICAgICAgIDB4NmIKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9UWExQRl9SQ0NBTF9PRkYyICAgICAgICAgICAweDZjCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfVFhMUEZfUkNDQUxfT0ZGMyAgICAgICAgICAgMHg2ZAotI2RlZmluZSBSQURJT18yMDU2X1RYX1RYTFBGX1JDQ0FMX09GRjQgICAgICAgICAgIDB4NmUKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9UWExQRl9SQ0NBTF9PRkY1ICAgICAgICAgICAweDZmCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfVFhMUEZfUkNDQUxfT0ZGNiAgICAgICAgICAgMHg3MAotI2RlZmluZSBSQURJT18yMDU2X1RYX1RYTFBGX0JXICAgICAgICAgICAgICAgICAgIDB4NzEKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9UWExQRl9HQUlOICAgICAgICAgICAgICAgICAweDcyCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfVFhMUEZfSURBQyAgICAgICAgICAgICAgICAgMHg3MwotI2RlZmluZSBSQURJT18yMDU2X1RYX1RYTFBGX0lEQUNfMCAgICAgICAgICAgICAgIDB4NzQKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9UWExQRl9JREFDXzEgICAgICAgICAgICAgICAweDc1Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfVFhMUEZfSURBQ18yICAgICAgICAgICAgICAgMHg3NgotI2RlZmluZSBSQURJT18yMDU2X1RYX1RYTFBGX0lEQUNfMyAgICAgICAgICAgICAgIDB4NzcKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9UWExQRl9JREFDXzQgICAgICAgICAgICAgICAweDc4Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfVFhMUEZfSURBQ181ICAgICAgICAgICAgICAgMHg3OQotI2RlZmluZSBSQURJT18yMDU2X1RYX1RYTFBGX0lEQUNfNiAgICAgICAgICAgICAgIDB4N2EKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9UWExQRl9PUEFNUF9JREFDICAgICAgICAgICAweDdiCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfVFhMUEZfTUlTQyAgICAgICAgICAgICAgICAgMHg3YwotI2RlZmluZSBSQURJT18yMDU2X1RYX1RYU1BBUkUxICAgICAgICAgICAgICAgICAgIDB4N2QKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9UWFNQQVJFMiAgICAgICAgICAgICAgICAgICAweDdlCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfVFhTUEFSRTMgICAgICAgICAgICAgICAgICAgMHg3ZgotI2RlZmluZSBSQURJT18yMDU2X1RYX1RYU1BBUkU0ICAgICAgICAgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9UWFNQQVJFNSAgICAgICAgICAgICAgICAgICAweDgxCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfVFhTUEFSRTYgICAgICAgICAgICAgICAgICAgMHg4MgotI2RlZmluZSBSQURJT18yMDU2X1RYX1RYU1BBUkU3ICAgICAgICAgICAgICAgICAgIDB4ODMKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9UWFNQQVJFOCAgICAgICAgICAgICAgICAgICAweDg0Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfVFhTUEFSRTkgICAgICAgICAgICAgICAgICAgMHg4NQotI2RlZmluZSBSQURJT18yMDU2X1RYX1RYU1BBUkUxMCAgICAgICAgICAgICAgICAgIDB4ODYKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9UWFNQQVJFMTEgICAgICAgICAgICAgICAgICAweDg3Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfVFhTUEFSRTEyICAgICAgICAgICAgICAgICAgMHg4OAotI2RlZmluZSBSQURJT18yMDU2X1RYX1RYU1BBUkUxMyAgICAgICAgICAgICAgICAgIDB4ODkKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9UWFNQQVJFMTQgICAgICAgICAgICAgICAgICAweDhhCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfVFhTUEFSRTE1ICAgICAgICAgICAgICAgICAgMHg4YgotI2RlZmluZSBSQURJT18yMDU2X1RYX1RYU1BBUkUxNiAgICAgICAgICAgICAgICAgIDB4OGMKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9TVEFUVVNfSU5UUEFfR0FJTiAgICAgICAgICAweDhkCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfU1RBVFVTX1BBRF9HQUlOICAgICAgICAgICAgMHg4ZQotI2RlZmluZSBSQURJT18yMDU2X1RYX1NUQVRVU19QR0FfR0FJTiAgICAgICAgICAgIDB4OGYKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9TVEFUVVNfR01fVFhMUEZfR0FJTiAgICAgICAweDkwCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfU1RBVFVTX1RYTFBGX0JXICAgICAgICAgICAgMHg5MQotI2RlZmluZSBSQURJT18yMDU2X1RYX1NUQVRVU19UWExQRl9SQyAgICAgICAgICAgIDB4OTIKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9HTUJCX0lEQUMwICAgICAgICAgICAgICAgICAweDkzCi0jZGVmaW5lIFJBRElPXzIwNTZfVFhfR01CQl9JREFDMSAgICAgICAgICAgICAgICAgMHg5NAotI2RlZmluZSBSQURJT18yMDU2X1RYX0dNQkJfSURBQzIgICAgICAgICAgICAgICAgIDB4OTUKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9HTUJCX0lEQUMzICAgICAgICAgICAgICAgICAweDk2Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfR01CQl9JREFDNCAgICAgICAgICAgICAgICAgMHg5NwotI2RlZmluZSBSQURJT18yMDU2X1RYX0dNQkJfSURBQzUgICAgICAgICAgICAgICAgIDB4OTgKLSNkZWZpbmUgUkFESU9fMjA1Nl9UWF9HTUJCX0lEQUM2ICAgICAgICAgICAgICAgICAweDk5Ci0jZGVmaW5lIFJBRElPXzIwNTZfVFhfR01CQl9JREFDNyAgICAgICAgICAgICAgICAgMHg5YQotCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUkVTRVJWRURfQUREUjAgICAgICAgICAgICAgMHgwCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfSURDT0RFICAgICAgICAgICAgICAgICAgICAgMHgxCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUkVTRVJWRURfQUREUjIgICAgICAgICAgICAgMHgyCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUkVTRVJWRURfQUREUjMgICAgICAgICAgICAgMHgzCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUkVTRVJWRURfQUREUjQgICAgICAgICAgICAgMHg0Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUkVTRVJWRURfQUREUjUgICAgICAgICAgICAgMHg1Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUkVTRVJWRURfQUREUjYgICAgICAgICAgICAgMHg2Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUkVTRVJWRURfQUREUjcgICAgICAgICAgICAgMHg3Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlhfQ09NX0NUUkwgICAgICAgICAgICAgICAgICAgMHg4Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlhfQ09NX1BVICAgICAgICAgICAgICAgICAgICAgMHg5Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlhfQ09NX09WUiAgICAgICAgICAgICAgICAgICAgMHhhCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfQ09NX1JFU0VUICAgICAgICAgICAgICAgICAgMHhiCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfQ09NX1JDQUwgICAgICAgICAgICAgICAgICAgMHhjCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfQ09NX1JDX1JYTFBGICAgICAgICAgICAgICAgMHhkCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfQ09NX1JDX1RYTFBGICAgICAgICAgICAgICAgMHhlCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfQ09NX1JDX1JYSFBGICAgICAgICAgICAgICAgMHhmCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUkVTRVJWRURfQUREUjE2ICAgICAgICAgICAgMHgxMAotI2RlZmluZSBSQURJT18yMDU2X1JYX1JFU0VSVkVEX0FERFIxNyAgICAgICAgICAgIDB4MTEKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SRVNFUlZFRF9BRERSMTggICAgICAgICAgICAweDEyCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUkVTRVJWRURfQUREUjE5ICAgICAgICAgICAgMHgxMwotI2RlZmluZSBSQURJT18yMDU2X1JYX1JFU0VSVkVEX0FERFIyMCAgICAgICAgICAgIDB4MTQKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SRVNFUlZFRF9BRERSMjEgICAgICAgICAgICAweDE1Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUkVTRVJWRURfQUREUjIyICAgICAgICAgICAgMHgxNgotI2RlZmluZSBSQURJT18yMDU2X1JYX1JFU0VSVkVEX0FERFIyMyAgICAgICAgICAgIDB4MTcKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SRVNFUlZFRF9BRERSMjQgICAgICAgICAgICAweDE4Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUkVTRVJWRURfQUREUjI1ICAgICAgICAgICAgMHgxOQotI2RlZmluZSBSQURJT18yMDU2X1JYX1JFU0VSVkVEX0FERFIyNiAgICAgICAgICAgIDB4MWEKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SRVNFUlZFRF9BRERSMjcgICAgICAgICAgICAweDFiCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUkVTRVJWRURfQUREUjI4ICAgICAgICAgICAgMHgxYwotI2RlZmluZSBSQURJT18yMDU2X1JYX1JFU0VSVkVEX0FERFIyOSAgICAgICAgICAgIDB4MWQKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SRVNFUlZFRF9BRERSMzAgICAgICAgICAgICAweDFlCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUkVTRVJWRURfQUREUjMxICAgICAgICAgICAgMHgxZgotI2RlZmluZSBSQURJT18yMDU2X1JYX1JYSVFDQUxfUlhNVVggICAgICAgICAgICAgIDB4MjAKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SU1NJX1BVICAgICAgICAgICAgICAgICAgICAweDIxCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUlNTSV9TRUwgICAgICAgICAgICAgICAgICAgMHgyMgotI2RlZmluZSBSQURJT18yMDU2X1JYX1JTU0lfR0FJTiAgICAgICAgICAgICAgICAgIDB4MjMKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SU1NJX05CX0lEQUMgICAgICAgICAgICAgICAweDI0Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUlNTSV9XQjJJX0lEQUNfMSAgICAgICAgICAgMHgyNQotI2RlZmluZSBSQURJT18yMDU2X1JYX1JTU0lfV0IySV9JREFDXzIgICAgICAgICAgIDB4MjYKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SU1NJX1dCMlFfSURBQ18xICAgICAgICAgICAweDI3Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUlNTSV9XQjJRX0lEQUNfMiAgICAgICAgICAgMHgyOAotI2RlZmluZSBSQURJT18yMDU2X1JYX1JTU0lfUE9MRSAgICAgICAgICAgICAgICAgIDB4MjkKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SU1NJX1dCMV9JREFDICAgICAgICAgICAgICAweDJhCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUlNTSV9NSVNDICAgICAgICAgICAgICAgICAgMHgyYgotI2RlZmluZSBSQURJT18yMDU2X1JYX0xOQUFfTUFTVEVSICAgICAgICAgICAgICAgIDB4MmMKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9MTkFBX1RVTkUgICAgICAgICAgICAgICAgICAweDJkCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfTE5BQV9HQUlOICAgICAgICAgICAgICAgICAgMHgyZQotI2RlZmluZSBSQURJT18yMDU2X1JYX0xOQV9BX1NMT1BFICAgICAgICAgICAgICAgIDB4MmYKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9CSUFTUE9MRV9MTkFBMV9JREFDICAgICAgICAweDMwCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfTE5BQTJfSURBQyAgICAgICAgICAgICAgICAgMHgzMQotI2RlZmluZSBSQURJT18yMDU2X1JYX0xOQTFBX01JU0MgICAgICAgICAgICAgICAgIDB4MzIKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9MTkFHX01BU1RFUiAgICAgICAgICAgICAgICAweDMzCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfTE5BR19UVU5FICAgICAgICAgICAgICAgICAgMHgzNAotI2RlZmluZSBSQURJT18yMDU2X1JYX0xOQUdfR0FJTiAgICAgICAgICAgICAgICAgIDB4MzUKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9MTkFfR19TTE9QRSAgICAgICAgICAgICAgICAweDM2Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlhfQklBU1BPTEVfTE5BRzFfSURBQyAgICAgICAgMHgzNwotI2RlZmluZSBSQURJT18yMDU2X1JYX0xOQUcyX0lEQUMgICAgICAgICAgICAgICAgIDB4MzgKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9MTkExR19NSVNDICAgICAgICAgICAgICAgICAweDM5Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlhfTUlYQV9NQVNURVIgICAgICAgICAgICAgICAgMHgzYQotI2RlZmluZSBSQURJT18yMDU2X1JYX01JWEFfVkNNICAgICAgICAgICAgICAgICAgIDB4M2IKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9NSVhBX0NUUkxQVEFUICAgICAgICAgICAgICAweDNjCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfTUlYQV9MT0JfQklBUyAgICAgICAgICAgICAgMHgzZAotI2RlZmluZSBSQURJT18yMDU2X1JYX01JWEFfQ09SRV9JREFDICAgICAgICAgICAgIDB4M2UKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9NSVhBX0NNRkJfSURBQyAgICAgICAgICAgICAweDNmCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfTUlYQV9CSUFTX0FVWCAgICAgICAgICAgICAgMHg0MAotI2RlZmluZSBSQURJT18yMDU2X1JYX01JWEFfQklBU19NQUlOICAgICAgICAgICAgIDB4NDEKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9NSVhBX0JJQVNfTUlTQyAgICAgICAgICAgICAweDQyCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfTUlYQV9NQVNUX0JJQVMgICAgICAgICAgICAgMHg0MwotI2RlZmluZSBSQURJT18yMDU2X1JYX01JWEdfTUFTVEVSICAgICAgICAgICAgICAgIDB4NDQKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9NSVhHX1ZDTSAgICAgICAgICAgICAgICAgICAweDQ1Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlhfTUlYR19DVFJMUFRBVCAgICAgICAgICAgICAgMHg0NgotI2RlZmluZSBSQURJT18yMDU2X1JYX01JWEdfTE9CX0JJQVMgICAgICAgICAgICAgIDB4NDcKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9NSVhHX0NPUkVfSURBQyAgICAgICAgICAgICAweDQ4Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlhfTUlYR19DTUZCX0lEQUMgICAgICAgICAgICAgMHg0OQotI2RlZmluZSBSQURJT18yMDU2X1JYX01JWEdfQklBU19BVVggICAgICAgICAgICAgIDB4NGEKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9NSVhHX0JJQVNfTUFJTiAgICAgICAgICAgICAweDRiCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfTUlYR19CSUFTX01JU0MgICAgICAgICAgICAgMHg0YwotI2RlZmluZSBSQURJT18yMDU2X1JYX01JWEdfTUFTVF9CSUFTICAgICAgICAgICAgIDB4NGQKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9USUFfTUFTVEVSICAgICAgICAgICAgICAgICAweDRlCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfVElBX0lPUEFNUCAgICAgICAgICAgICAgICAgMHg0ZgotI2RlZmluZSBSQURJT18yMDU2X1JYX1RJQV9RT1BBTVAgICAgICAgICAgICAgICAgIDB4NTAKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9USUFfSU1JU0MgICAgICAgICAgICAgICAgICAweDUxCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfVElBX1FNSVNDICAgICAgICAgICAgICAgICAgMHg1MgotI2RlZmluZSBSQURJT18yMDU2X1JYX1RJQV9HQUlOICAgICAgICAgICAgICAgICAgIDB4NTMKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9USUFfU1BBUkUxICAgICAgICAgICAgICAgICAweDU0Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlhfVElBX1NQQVJFMiAgICAgICAgICAgICAgICAgMHg1NQotI2RlZmluZSBSQURJT18yMDU2X1JYX0JCX0xQRl9NQVNURVIgICAgICAgICAgICAgIDB4NTYKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9BQUNJX01BU1RFUiAgICAgICAgICAgICAgICAweDU3Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUlhMUEZfSURBQyAgICAgICAgICAgICAgICAgMHg1OAotI2RlZmluZSBSQURJT18yMDU2X1JYX1JYTFBGX09QQU1QQklBU19MT1dRICAgICAgIDB4NTkKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SWExQRl9PUEFNUEJJQVNfSElHSFEgICAgICAweDVhCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUlhMUEZfQklBU19EQ0NBTkNFTCAgICAgICAgMHg1YgotI2RlZmluZSBSQURJT18yMDU2X1JYX1JYTFBGX09VVFZDTSAgICAgICAgICAgICAgIDB4NWMKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SWExQRl9JTlZDTV9CT0RZICAgICAgICAgICAweDVkCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUlhMUEZfQ0NfT1AgICAgICAgICAgICAgICAgMHg1ZQotI2RlZmluZSBSQURJT18yMDU2X1JYX1JYTFBGX0dBSU4gICAgICAgICAgICAgICAgIDB4NWYKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SWExQRl9RX0JXICAgICAgICAgICAgICAgICAweDYwCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUlhMUEZfSFBfQ09STkVSX0JXICAgICAgICAgMHg2MQotI2RlZmluZSBSQURJT18yMDU2X1JYX1JYTFBGX1JDQ0FMX0hQQyAgICAgICAgICAgIDB4NjIKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SWEhQRl9PRkYwICAgICAgICAgICAgICAgICAweDYzCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUlhIUEZfT0ZGMSAgICAgICAgICAgICAgICAgMHg2NAotI2RlZmluZSBSQURJT18yMDU2X1JYX1JYSFBGX09GRjIgICAgICAgICAgICAgICAgIDB4NjUKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SWEhQRl9PRkYzICAgICAgICAgICAgICAgICAweDY2Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUlhIUEZfT0ZGNCAgICAgICAgICAgICAgICAgMHg2NwotI2RlZmluZSBSQURJT18yMDU2X1JYX1JYSFBGX09GRjUgICAgICAgICAgICAgICAgIDB4NjgKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SWEhQRl9PRkY2ICAgICAgICAgICAgICAgICAweDY5Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUlhIUEZfT0ZGNyAgICAgICAgICAgICAgICAgMHg2YQotI2RlZmluZSBSQURJT18yMDU2X1JYX1JYTFBGX1JDQ0FMX0xQQyAgICAgICAgICAgIDB4NmIKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SWExQRl9PRkZfMCAgICAgICAgICAgICAgICAweDZjCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUlhMUEZfT0ZGXzEgICAgICAgICAgICAgICAgMHg2ZAotI2RlZmluZSBSQURJT18yMDU2X1JYX1JYTFBGX09GRl8yICAgICAgICAgICAgICAgIDB4NmUKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SWExQRl9PRkZfMyAgICAgICAgICAgICAgICAweDZmCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUlhMUEZfT0ZGXzQgICAgICAgICAgICAgICAgMHg3MAotI2RlZmluZSBSQURJT18yMDU2X1JYX1VOVVNFRCAgICAgICAgICAgICAgICAgICAgIDB4NzEKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9WR0FfTUFTVEVSICAgICAgICAgICAgICAgICAweDcyCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfVkdBX0JJQVMgICAgICAgICAgICAgICAgICAgMHg3MwotI2RlZmluZSBSQURJT18yMDU2X1JYX1ZHQV9CSUFTX0RDQ0FOQ0VMICAgICAgICAgIDB4NzQKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9WR0FfR0FJTiAgICAgICAgICAgICAgICAgICAweDc1Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlhfVkdBX0hQX0NPUk5FUl9CVyAgICAgICAgICAgMHg3NgotI2RlZmluZSBSQURJT18yMDU2X1JYX1ZHQUJVRl9CSUFTICAgICAgICAgICAgICAgIDB4NzcKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9WR0FCVUZfR0FJTl9CVyAgICAgICAgICAgICAweDc4Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlhfVFhGQk1JWF9BICAgICAgICAgICAgICAgICAgMHg3OQotI2RlZmluZSBSQURJT18yMDU2X1JYX1RYRkJNSVhfRyAgICAgICAgICAgICAgICAgIDB4N2EKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SWFNQQVJFMSAgICAgICAgICAgICAgICAgICAweDdiCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUlhTUEFSRTIgICAgICAgICAgICAgICAgICAgMHg3YwotI2RlZmluZSBSQURJT18yMDU2X1JYX1JYU1BBUkUzICAgICAgICAgICAgICAgICAgIDB4N2QKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SWFNQQVJFNCAgICAgICAgICAgICAgICAgICAweDdlCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUlhTUEFSRTUgICAgICAgICAgICAgICAgICAgMHg3ZgotI2RlZmluZSBSQURJT18yMDU2X1JYX1JYU1BBUkU2ICAgICAgICAgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SWFNQQVJFNyAgICAgICAgICAgICAgICAgICAweDgxCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUlhTUEFSRTggICAgICAgICAgICAgICAgICAgMHg4MgotI2RlZmluZSBSQURJT18yMDU2X1JYX1JYU1BBUkU5ICAgICAgICAgICAgICAgICAgIDB4ODMKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SWFNQQVJFMTAgICAgICAgICAgICAgICAgICAweDg0Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUlhTUEFSRTExICAgICAgICAgICAgICAgICAgMHg4NQotI2RlZmluZSBSQURJT18yMDU2X1JYX1JYU1BBUkUxMiAgICAgICAgICAgICAgICAgIDB4ODYKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SWFNQQVJFMTMgICAgICAgICAgICAgICAgICAweDg3Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlhfUlhTUEFSRTE0ICAgICAgICAgICAgICAgICAgMHg4OAotI2RlZmluZSBSQURJT18yMDU2X1JYX1JYU1BBUkUxNSAgICAgICAgICAgICAgICAgIDB4ODkKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9SWFNQQVJFMTYgICAgICAgICAgICAgICAgICAweDhhCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfU1RBVFVTX0xOQUFfR0FJTiAgICAgICAgICAgMHg4YgotI2RlZmluZSBSQURJT18yMDU2X1JYX1NUQVRVU19MTkFHX0dBSU4gICAgICAgICAgIDB4OGMKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9TVEFUVVNfTUlYVElBX0dBSU4gICAgICAgICAweDhkCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfU1RBVFVTX1JYTFBGX0dBSU4gICAgICAgICAgMHg4ZQotI2RlZmluZSBSQURJT18yMDU2X1JYX1NUQVRVU19WR0FfQlVGX0dBSU4gICAgICAgIDB4OGYKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9TVEFUVVNfUlhMUEZfUSAgICAgICAgICAgICAweDkwCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfU1RBVFVTX1JYTFBGX0JVRl9CVyAgICAgICAgMHg5MQotI2RlZmluZSBSQURJT18yMDU2X1JYX1NUQVRVU19SWExQRl9WR0FfSFBDICAgICAgIDB4OTIKLSNkZWZpbmUgUkFESU9fMjA1Nl9SWF9TVEFUVVNfUlhMUEZfUkMgICAgICAgICAgICAweDkzCi0jZGVmaW5lIFJBRElPXzIwNTZfUlhfU1RBVFVTX0hQQ19SQyAgICAgICAgICAgICAgMHg5NAotCi0jZGVmaW5lIFJBRElPXzIwNTZfTE5BMV9BX1BVCQkweDAxCi0jZGVmaW5lIFJBRElPXzIwNTZfTE5BMl9BX1BVCQkweDAyCi0jZGVmaW5lIFJBRElPXzIwNTZfTE5BMV9HX1BVCQkweDAxCi0jZGVmaW5lIFJBRElPXzIwNTZfTE5BMl9HX1BVCQkweDAyCi0jZGVmaW5lIFJBRElPXzIwNTZfTUlYQV9QVV9JCQkweDAxCi0jZGVmaW5lIFJBRElPXzIwNTZfTUlYQV9QVV9RCQkweDAyCi0jZGVmaW5lIFJBRElPXzIwNTZfTUlYQV9QVV9HTQkJMHgxMAotI2RlZmluZSBSQURJT18yMDU2X01JWEdfUFVfSQkJMHgwMQotI2RlZmluZSBSQURJT18yMDU2X01JWEdfUFVfUQkJMHgwMgotI2RlZmluZSBSQURJT18yMDU2X01JWEdfUFVfR00JCTB4MTAKLSNkZWZpbmUgUkFESU9fMjA1Nl9USUFfUFUJCQkweDAxCi0jZGVmaW5lIFJBRElPXzIwNTZfQkJfTFBGX1BVCQkweDIwCi0jZGVmaW5lIFJBRElPXzIwNTZfVzFfUFUJCQkweDAyCi0jZGVmaW5lIFJBRElPXzIwNTZfVzJfUFUJCQkweDA0Ci0jZGVmaW5lIFJBRElPXzIwNTZfTkJfUFUJCQkweDA4Ci0jZGVmaW5lIFJBRElPXzIwNTZfUlNTSV9XMV9TRUwJCTB4MDIKLSNkZWZpbmUgUkFESU9fMjA1Nl9SU1NJX1cyX1NFTAkJMHgwNAotI2RlZmluZSBSQURJT18yMDU2X1JTU0lfTkJfU0VMCQkweDA4Ci0jZGVmaW5lIFJBRElPXzIwNTZfVkNNX01BU0sJCQkweDFjCi0jZGVmaW5lIFJBRElPXzIwNTZfUlNTSV9WQ01fU0hJRlQJMHgwMgotCi0jZGVmaW5lIFJBRElPXzIwNTdfREFDQlVGX1ZJTkNNX0NPUkUwICAgICAgICAgICAgMHgwCi0jZGVmaW5lIFJBRElPXzIwNTdfSURDT0RFICAgICAgICAgICAgICAgICAgICAgICAgMHgxCi0jZGVmaW5lIFJBRElPXzIwNTdfUkNDQUxfTUFTVEVSICAgICAgICAgICAgICAgICAgMHgyCi0jZGVmaW5lIFJBRElPXzIwNTdfUkNDQUxfQ0FQX1NJWkUgICAgICAgICAgICAgICAgMHgzCi0jZGVmaW5lIFJBRElPXzIwNTdfUkNBTF9DT05GSUcgICAgICAgICAgICAgICAgICAgMHg0Ci0jZGVmaW5lIFJBRElPXzIwNTdfR1BBSU9fQ09ORklHICAgICAgICAgICAgICAgICAgMHg1Ci0jZGVmaW5lIFJBRElPXzIwNTdfR1BBSU9fU0VMMSAgICAgICAgICAgICAgICAgICAgMHg2Ci0jZGVmaW5lIFJBRElPXzIwNTdfR1BBSU9fU0VMMCAgICAgICAgICAgICAgICAgICAgMHg3Ci0jZGVmaW5lIFJBRElPXzIwNTdfQ0xQT19DT05GSUcgICAgICAgICAgICAgICAgICAgMHg4Ci0jZGVmaW5lIFJBRElPXzIwNTdfQkFOREdBUF9DT05GSUcgICAgICAgICAgICAgICAgMHg5Ci0jZGVmaW5lIFJBRElPXzIwNTdfQkFOREdBUF9SQ0FMX1RSSU0gICAgICAgICAgICAgMHhhCi0jZGVmaW5lIFJBRElPXzIwNTdfQUZFUkVHX0NPTkZJRyAgICAgICAgICAgICAgICAgMHhiCi0jZGVmaW5lIFJBRElPXzIwNTdfVEVNUFNFTlNFX0NPTkZJRyAgICAgICAgICAgICAgMHhjCi0jZGVmaW5lIFJBRElPXzIwNTdfWFRBTF9DT05GSUcxICAgICAgICAgICAgICAgICAgMHhkCi0jZGVmaW5lIFJBRElPXzIwNTdfWFRBTF9JQ09SRV9TSVpFICAgICAgICAgICAgICAgMHhlCi0jZGVmaW5lIFJBRElPXzIwNTdfWFRBTF9CVUZfU0laRSAgICAgICAgICAgICAgICAgMHhmCi0jZGVmaW5lIFJBRElPXzIwNTdfWFRBTF9QVUxMQ0FQX1NJWkUgICAgICAgICAgICAgMHgxMAotI2RlZmluZSBSQURJT18yMDU3X1JGUExMX01BU1RFUiAgICAgICAgICAgICAgICAgIDB4MTEKLSNkZWZpbmUgUkFESU9fMjA1N19WQ09NT05JVE9SX1ZUSF9MICAgICAgICAgICAgICAweDEyCi0jZGVmaW5lIFJBRElPXzIwNTdfVkNPTU9OSVRPUl9WVEhfSCAgICAgICAgICAgICAgMHgxMwotI2RlZmluZSBSQURJT18yMDU3X1ZDT0NBTF9CSUFTUkVTRVRfUkZQTExSRUdfVk9VVCAweDE0Ci0jZGVmaW5lIFJBRElPXzIwNTdfVkNPX1ZBUkNTSVpFX0lEQUMgICAgICAgICAgICAgMHgxNQotI2RlZmluZSBSQURJT18yMDU3X1ZDT0NBTF9DT1VOVFZBTDAgICAgICAgICAgICAgIDB4MTYKLSNkZWZpbmUgUkFESU9fMjA1N19WQ09DQUxfQ09VTlRWQUwxICAgICAgICAgICAgICAweDE3Ci0jZGVmaW5lIFJBRElPXzIwNTdfVkNPQ0FMX0lOVENMS19DT1VOVCAgICAgICAgICAgMHgxOAotI2RlZmluZSBSQURJT18yMDU3X1ZDT0NBTF9NQVNURVIgICAgICAgICAgICAgICAgIDB4MTkKLSNkZWZpbmUgUkFESU9fMjA1N19WQ09DQUxfTlVNQ0FQQ0hBTkdFICAgICAgICAgICAweDFhCi0jZGVmaW5lIFJBRElPXzIwNTdfVkNPQ0FMX1dJTlNJWkUgICAgICAgICAgICAgICAgMHgxYgotI2RlZmluZSBSQURJT18yMDU3X1ZDT0NBTF9ERUxBWV9BRlRFUl9SRUZSRVNIICAgIDB4MWMKLSNkZWZpbmUgUkFESU9fMjA1N19WQ09DQUxfREVMQVlfQUZURVJfQ0xPU0VMT09QICAweDFkCi0jZGVmaW5lIFJBRElPXzIwNTdfVkNPQ0FMX0RFTEFZX0FGVEVSX09QRU5MT09QICAgMHgxZQotI2RlZmluZSBSQURJT18yMDU3X1ZDT0NBTF9ERUxBWV9CRUZPUkVfT1BFTkxPT1AgIDB4MWYKLSNkZWZpbmUgUkFESU9fMjA1N19WQ09fRk9SQ0VDQVBFTl9GT1JDRUNBUDEgICAgICAweDIwCi0jZGVmaW5lIFJBRElPXzIwNTdfVkNPX0ZPUkNFQ0FQMCAgICAgICAgICAgICAgICAgMHgyMQotI2RlZmluZSBSQURJT18yMDU3X1JGUExMX1JFRk1BU1RFUl9TUEFSRVhUQUxTSVpFIDB4MjIKLSNkZWZpbmUgUkFESU9fMjA1N19SRlBMTF9QRkRfUkVTRVRfUFcgICAgICAgICAgICAweDIzCi0jZGVmaW5lIFJBRElPXzIwNTdfUkZQTExfTE9PUEZJTFRFUl9SMiAgICAgICAgICAgMHgyNAotI2RlZmluZSBSQURJT18yMDU3X1JGUExMX0xPT1BGSUxURVJfUjEgICAgICAgICAgIDB4MjUKLSNkZWZpbmUgUkFESU9fMjA1N19SRlBMTF9MT09QRklMVEVSX0MzICAgICAgICAgICAweDI2Ci0jZGVmaW5lIFJBRElPXzIwNTdfUkZQTExfTE9PUEZJTFRFUl9DMiAgICAgICAgICAgMHgyNwotI2RlZmluZSBSQURJT18yMDU3X1JGUExMX0xPT1BGSUxURVJfQzEgICAgICAgICAgIDB4MjgKLSNkZWZpbmUgUkFESU9fMjA1N19DUF9LUERfSURBQyAgICAgICAgICAgICAgICAgICAweDI5Ci0jZGVmaW5lIFJBRElPXzIwNTdfUkZQTExfSURBQ1MgICAgICAgICAgICAgICAgICAgMHgyYQotI2RlZmluZSBSQURJT18yMDU3X1JGUExMX01JU0NfRU4gICAgICAgICAgICAgICAgIDB4MmIKLSNkZWZpbmUgUkFESU9fMjA1N19SRlBMTF9NTUQwICAgICAgICAgICAgICAgICAgICAweDJjCi0jZGVmaW5lIFJBRElPXzIwNTdfUkZQTExfTU1EMSAgICAgICAgICAgICAgICAgICAgMHgyZAotI2RlZmluZSBSQURJT18yMDU3X1JGUExMX01JU0NfQ0FMX1JFU0VUTiAgICAgICAgIDB4MmUKLSNkZWZpbmUgUkFESU9fMjA1N19KVEFHWFRBTF9TSVpFX0NQQklBU19GSUxUUkVTICAweDJmCi0jZGVmaW5lIFJBRElPXzIwNTdfVkNPX0FMQ1JFRl9CQlBMTFhUQUxfU0laRSAgICAgMHgzMAotI2RlZmluZSBSQURJT18yMDU3X1ZDT0NBTF9SRUFEQ0FQMCAgICAgICAgICAgICAgIDB4MzEKLSNkZWZpbmUgUkFESU9fMjA1N19WQ09DQUxfUkVBRENBUDEgICAgICAgICAgICAgICAweDMyCi0jZGVmaW5lIFJBRElPXzIwNTdfVkNPQ0FMX1NUQVRVUyAgICAgICAgICAgICAgICAgMHgzMwotI2RlZmluZSBSQURJT18yMDU3X0xPR0VOX1BVUyAgICAgICAgICAgICAgICAgICAgIDB4MzQKLSNkZWZpbmUgUkFESU9fMjA1N19MT0dFTl9QVEFUX1JFU0VUUyAgICAgICAgICAgICAweDM1Ci0jZGVmaW5lIFJBRElPXzIwNTdfVkNPQlVGX0lEQUNTICAgICAgICAgICAgICAgICAgMHgzNgotI2RlZmluZSBSQURJT18yMDU3X1ZDT0JVRl9UVU5FICAgICAgICAgICAgICAgICAgIDB4MzcKLSNkZWZpbmUgUkFESU9fMjA1N19DTU9TQlVGX1RYMkdRX0lEQUNTICAgICAgICAgICAweDM4Ci0jZGVmaW5lIFJBRElPXzIwNTdfQ01PU0JVRl9UWDJHSV9JREFDUyAgICAgICAgICAgMHgzOQotI2RlZmluZSBSQURJT18yMDU3X0NNT1NCVUZfVFg1R1FfSURBQ1MgICAgICAgICAgIDB4M2EKLSNkZWZpbmUgUkFESU9fMjA1N19DTU9TQlVGX1RYNUdJX0lEQUNTICAgICAgICAgICAweDNiCi0jZGVmaW5lIFJBRElPXzIwNTdfQ01PU0JVRl9SWDJHUV9JREFDUyAgICAgICAgICAgMHgzYwotI2RlZmluZSBSQURJT18yMDU3X0NNT1NCVUZfUlgyR0lfSURBQ1MgICAgICAgICAgIDB4M2QKLSNkZWZpbmUgUkFESU9fMjA1N19DTU9TQlVGX1JYNUdRX0lEQUNTICAgICAgICAgICAweDNlCi0jZGVmaW5lIFJBRElPXzIwNTdfQ01PU0JVRl9SWDVHSV9JREFDUyAgICAgICAgICAgMHgzZgotI2RlZmluZSBSQURJT18yMDU3X0xPR0VOX01YMkdfSURBQ1MgICAgICAgICAgICAgIDB4NDAKLSNkZWZpbmUgUkFESU9fMjA1N19MT0dFTl9NWDJHX1RVTkUgICAgICAgICAgICAgICAweDQxCi0jZGVmaW5lIFJBRElPXzIwNTdfTE9HRU5fTVg1R19JREFDUyAgICAgICAgICAgICAgMHg0MgotI2RlZmluZSBSQURJT18yMDU3X0xPR0VOX01YNUdfVFVORSAgICAgICAgICAgICAgIDB4NDMKLSNkZWZpbmUgUkFESU9fMjA1N19MT0dFTl9NWDVHX1JDQ1IgICAgICAgICAgICAgICAweDQ0Ci0jZGVmaW5lIFJBRElPXzIwNTdfTE9HRU5fSU5EQlVGMkdfSURBQyAgICAgICAgICAgMHg0NQotI2RlZmluZSBSQURJT18yMDU3X0xPR0VOX0lOREJVRjJHX0lCT09TVCAgICAgICAgIDB4NDYKLSNkZWZpbmUgUkFESU9fMjA1N19MT0dFTl9JTkRCVUYyR19UVU5FICAgICAgICAgICAweDQ3Ci0jZGVmaW5lIFJBRElPXzIwNTdfTE9HRU5fSU5EQlVGNUdfSURBQyAgICAgICAgICAgMHg0OAotI2RlZmluZSBSQURJT18yMDU3X0xPR0VOX0lOREJVRjVHX0lCT09TVCAgICAgICAgIDB4NDkKLSNkZWZpbmUgUkFESU9fMjA1N19MT0dFTl9JTkRCVUY1R19UVU5FICAgICAgICAgICAweDRhCi0jZGVmaW5lIFJBRElPXzIwNTdfQ01PU0JVRl9UWF9SQ0NSICAgICAgICAgICAgICAgMHg0YgotI2RlZmluZSBSQURJT18yMDU3X0NNT1NCVUZfUlhfUkNDUiAgICAgICAgICAgICAgIDB4NGMKLSNkZWZpbmUgUkFESU9fMjA1N19MT0dFTl9TRUxfUEtERVQgICAgICAgICAgICAgICAweDRkCi0jZGVmaW5lIFJBRElPXzIwNTdfQ01PU0JVRl9TSEFSRUlRX1BUQVQgICAgICAgICAgMHg0ZQotI2RlZmluZSBSQURJT18yMDU3X1JYVFhCSUFTX0NPTkZJR19DT1JFMCAgICAgICAgIDB4NGYKLSNkZWZpbmUgUkFESU9fMjA1N19UWEdNX1RYUkZfUFVTX0NPUkUwICAgICAgICAgICAweDUwCi0jZGVmaW5lIFJBRElPXzIwNTdfVFhHTV9JREFDX0JMRUVEX0NPUkUwICAgICAgICAgMHg1MQotI2RlZmluZSBSQURJT18yMDU3X1RYR01fR0FJTl9DT1JFMCAgICAgICAgICAgICAgIDB4NTYKLSNkZWZpbmUgUkFESU9fMjA1N19UWEdNMkdfUEtERVRfUFVTX0NPUkUwICAgICAgICAweDU3Ci0jZGVmaW5lIFJBRElPXzIwNTdfUEFEMkdfUFRBVFNfQ09SRTAgICAgICAgICAgICAgMHg1OAotI2RlZmluZSBSQURJT18yMDU3X1BBRDJHX0lEQUNTX0NPUkUwICAgICAgICAgICAgIDB4NTkKLSNkZWZpbmUgUkFESU9fMjA1N19QQUQyR19CT09TVF9QVV9DT1JFMCAgICAgICAgICAweDVhCi0jZGVmaW5lIFJBRElPXzIwNTdfUEFEMkdfQ0FTQ1ZfR0FJTl9DT1JFMCAgICAgICAgMHg1YgotI2RlZmluZSBSQURJT18yMDU3X1RYTUlYMkdfVFVORV9CT09TVF9QVV9DT1JFMCAgIDB4NWMKLSNkZWZpbmUgUkFESU9fMjA1N19UWE1JWDJHX0xPRENfQ09SRTAgICAgICAgICAgICAweDVkCi0jZGVmaW5lIFJBRElPXzIwNTdfUEFEMkdfVFVORV9QVVNfQ09SRTAgICAgICAgICAgMHg1ZQotI2RlZmluZSBSQURJT18yMDU3X0lQQTJHX0dBSU5fQ09SRTAgICAgICAgICAgICAgIDB4NWYKLSNkZWZpbmUgUkFESU9fMjA1N19UU1NJMkdfU1BBUkUxX0NPUkUwICAgICAgICAgICAweDYwCi0jZGVmaW5lIFJBRElPXzIwNTdfVFNTSTJHX1NQQVJFMl9DT1JFMCAgICAgICAgICAgMHg2MQotI2RlZmluZSBSQURJT18yMDU3X0lQQTJHX1RVTkVWX0NBU0NWX1BUQVRfQ09SRTAgIDB4NjIKLSNkZWZpbmUgUkFESU9fMjA1N19JUEEyR19JTUFJTl9DT1JFMCAgICAgICAgICAgICAweDYzCi0jZGVmaW5lIFJBRElPXzIwNTdfSVBBMkdfQ0FTQ09OVl9DT1JFMCAgICAgICAgICAgMHg2NAotI2RlZmluZSBSQURJT18yMDU3X0lQQTJHX0NBU0NPRkZWX0NPUkUwICAgICAgICAgIDB4NjUKLSNkZWZpbmUgUkFESU9fMjA1N19JUEEyR19CSUFTX0ZJTFRFUl9DT1JFMCAgICAgICAweDY2Ci0jZGVmaW5lIFJBRElPXzIwNTdfVFg1R19QS0RFVF9DT1JFMCAgICAgICAgICAgICAgMHg2OQotI2RlZmluZSBSQURJT18yMDU3X1BHQV9QVEFUX1RYR001R19QVV9DT1JFMCAgICAgIDB4NmEKLSNkZWZpbmUgUkFESU9fMjA1N19QQUQ1R19QVEFUUzFfQ09SRTAgICAgICAgICAgICAweDZiCi0jZGVmaW5lIFJBRElPXzIwNTdfUEFENUdfQ0xBU1NfUFRBVFMyX0NPUkUwICAgICAgMHg2YwotI2RlZmluZSBSQURJT18yMDU3X1BHQV9CT09TVFBUQVRfSU1BSU5fQ09SRTAgICAgIDB4NmQKLSNkZWZpbmUgUkFESU9fMjA1N19QQUQ1R19DQVNDVl9JTUFJTl9DT1JFMCAgICAgICAweDZlCi0jZGVmaW5lIFJBRElPXzIwNTdfVFhNSVg1R19JQk9PU1RfUEFEX0lBVVhfQ09SRTAgMHg2ZgotI2RlZmluZSBSQURJT18yMDU3X1BHQV9CT09TVF9UVU5FX0NPUkUwICAgICAgICAgIDB4NzAKLSNkZWZpbmUgUkFESU9fMjA1N19QR0FfR0FJTl9DT1JFMCAgICAgICAgICAgICAgICAweDcxCi0jZGVmaW5lIFJBRElPXzIwNTdfUEFENUdfQ0FTQ09GRlZfR0FJTl9QVVNfQ09SRTAgMHg3MgotI2RlZmluZSBSQURJT18yMDU3X1RYTUlYNUdfQk9PU1RfVFVORV9DT1JFMCAgICAgIDB4NzMKLSNkZWZpbmUgUkFESU9fMjA1N19QQUQ1R19UVU5FX01JU0NfUFVTX0NPUkUwICAgICAweDc0Ci0jZGVmaW5lIFJBRElPXzIwNTdfSVBBNUdfSUFVWF9DT1JFMCAgICAgICAgICAgICAgMHg3NQotI2RlZmluZSBSQURJT18yMDU3X0lQQTVHX0dBSU5fQ09SRTAgICAgICAgICAgICAgIDB4NzYKLSNkZWZpbmUgUkFESU9fMjA1N19UU1NJNUdfU1BBUkUxX0NPUkUwICAgICAgICAgICAweDc3Ci0jZGVmaW5lIFJBRElPXzIwNTdfVFNTSTVHX1NQQVJFMl9DT1JFMCAgICAgICAgICAgMHg3OAotI2RlZmluZSBSQURJT18yMDU3X0lQQTVHX0NBU0NPRkZWX1BVX0NPUkUwICAgICAgIDB4NzkKLSNkZWZpbmUgUkFESU9fMjA1N19JUEE1R19QVEFUX0NPUkUwICAgICAgICAgICAgICAweDdhCi0jZGVmaW5lIFJBRElPXzIwNTdfSVBBNUdfSU1BSU5fQ09SRTAgICAgICAgICAgICAgMHg3YgotI2RlZmluZSBSQURJT18yMDU3X0lQQTVHX0NBU0NPTlZfQ09SRTAgICAgICAgICAgIDB4N2MKLSNkZWZpbmUgUkFESU9fMjA1N19JUEE1R19CSUFTX0ZJTFRFUl9DT1JFMCAgICAgICAweDdkCi0jZGVmaW5lIFJBRElPXzIwNTdfUEFEX0JJQVNfRklMVEVSX0JXU19DT1JFMCAgICAgMHg4MAotI2RlZmluZSBSQURJT18yMDU3X1RSMkdfQ09ORklHMV9DT1JFMF9OVSAgICAgICAgIDB4ODEKLSNkZWZpbmUgUkFESU9fMjA1N19UUjJHX0NPTkZJRzJfQ09SRTBfTlUgICAgICAgICAweDgyCi0jZGVmaW5lIFJBRElPXzIwNTdfTE5BNUdfUkZFTl9DT1JFMCAgICAgICAgICAgICAgMHg4MwotI2RlZmluZSBSQURJT18yMDU3X1RSNUdfQ09ORklHMl9DT1JFMF9OVSAgICAgICAgIDB4ODQKLSNkZWZpbmUgUkFESU9fMjA1N19SWFJGQklBU19JQk9PU1RfUFVfQ09SRTAgICAgICAweDg1Ci0jZGVmaW5lIFJBRElPXzIwNTdfUlhSRl9JQUJBTkRfUlhHTV9JTUFJTl9QVEFUX0NPUkUwIDB4ODYKLSNkZWZpbmUgUkFESU9fMjA1N19SWEdNX0NNRkJJVEFJTF9BVVhQVEFUX0NPUkUwICAweDg3Ci0jZGVmaW5lIFJBRElPXzIwNTdfUlhNSVhfSUNPUkVfUlhHTV9JQVVYX0NPUkUwICAgMHg4OAotI2RlZmluZSBSQURJT18yMDU3X1JYTUlYX0NNRkJJVEFJTF9QVV9DT1JFMCAgICAgIDB4ODkKLSNkZWZpbmUgUkFESU9fMjA1N19MTkEyX0lNQUlOX1BUQVRfUFVfQ09SRTAgICAgICAweDhhCi0jZGVmaW5lIFJBRElPXzIwNTdfTE5BMl9JQVVYX1BUQVRfQ09SRTAgICAgICAgICAgMHg4YgotI2RlZmluZSBSQURJT18yMDU3X0xOQTFfSU1BSU5fUFRBVF9QVV9DT1JFMCAgICAgIDB4OGMKLSNkZWZpbmUgUkFESU9fMjA1N19MTkExNUdfSU5QVVRfTUFUQ0hfVFVORV9DT1JFMCAweDhkCi0jZGVmaW5lIFJBRElPXzIwNTdfUlhSRkJJQVNfQkFORFNFTF9DT1JFMCAgICAgICAgMHg4ZQotI2RlZmluZSBSQURJT18yMDU3X1RJQV9DT05GSUdfQ09SRTAgICAgICAgICAgICAgIDB4OGYKLSNkZWZpbmUgUkFESU9fMjA1N19USUFfSVFHQUlOX0NPUkUwICAgICAgICAgICAgICAweDkwCi0jZGVmaW5lIFJBRElPXzIwNTdfVElBX0lCSUFTMl9DT1JFMCAgICAgICAgICAgICAgMHg5MQotI2RlZmluZSBSQURJT18yMDU3X1RJQV9JQklBUzFfQ09SRTAgICAgICAgICAgICAgIDB4OTIKLSNkZWZpbmUgUkFESU9fMjA1N19USUFfU1BBUkVfUV9DT1JFMCAgICAgICAgICAgICAweDkzCi0jZGVmaW5lIFJBRElPXzIwNTdfVElBX1NQQVJFX0lfQ09SRTAgICAgICAgICAgICAgMHg5NAotI2RlZmluZSBSQURJT18yMDU3X1JYTUlYMkdfUFVTX0NPUkUwICAgICAgICAgICAgIDB4OTUKLSNkZWZpbmUgUkFESU9fMjA1N19SWE1JWDJHX1ZDTVJFRlNfQ09SRTAgICAgICAgICAweDk2Ci0jZGVmaW5lIFJBRElPXzIwNTdfUlhNSVgyR19MT0RDX1FJX0NPUkUwICAgICAgICAgMHg5NwotI2RlZmluZSBSQURJT18yMDU3X1cxMkdfQldfTE5BMkdfUFVTX0NPUkUwICAgICAgIDB4OTgKLSNkZWZpbmUgUkFESU9fMjA1N19MTkEyR19HQUlOX0NPUkUwICAgICAgICAgICAgICAweDk5Ci0jZGVmaW5lIFJBRElPXzIwNTdfTE5BMkdfVFVORV9DT1JFMCAgICAgICAgICAgICAgMHg5YQotI2RlZmluZSBSQURJT18yMDU3X1JYTUlYNUdfUFVTX0NPUkUwICAgICAgICAgICAgIDB4OWIKLSNkZWZpbmUgUkFESU9fMjA1N19SWE1JWDVHX1ZDTVJFRlNfQ09SRTAgICAgICAgICAweDljCi0jZGVmaW5lIFJBRElPXzIwNTdfUlhNSVg1R19MT0RDX1FJX0NPUkUwICAgICAgICAgMHg5ZAotI2RlZmluZSBSQURJT18yMDU3X1cxNUdfQldfTE5BNUdfUFVTX0NPUkUwICAgICAgIDB4OWUKLSNkZWZpbmUgUkFESU9fMjA1N19MTkE1R19HQUlOX0NPUkUwICAgICAgICAgICAgICAweDlmCi0jZGVmaW5lIFJBRElPXzIwNTdfTE5BNUdfVFVORV9DT1JFMCAgICAgICAgICAgICAgMHhhMAotI2RlZmluZSBSQURJT18yMDU3X0xQRlNFTF9UWFJYX1JYQkJfUFVTX0NPUkUwICAgIDB4YTEKLSNkZWZpbmUgUkFESU9fMjA1N19SWEJCX0JJQVNfTUFTVEVSX0NPUkUwICAgICAgICAweGEyCi0jZGVmaW5lIFJBRElPXzIwNTdfUlhCQl9WR0FCVUZfSURBQ1NfQ09SRTAgICAgICAgMHhhMwotI2RlZmluZSBSQURJT18yMDU3X0xQRl9WQ01SRUZfVFhCVUZfVkNNUkVGX0NPUkUwIDB4YTQKLSNkZWZpbmUgUkFESU9fMjA1N19UWEJVRl9WSU5DTV9DT1JFMCAgICAgICAgICAgICAweGE1Ci0jZGVmaW5lIFJBRElPXzIwNTdfVFhCVUZfSURBQ1NfQ09SRTAgICAgICAgICAgICAgMHhhNgotI2RlZmluZSBSQURJT18yMDU3X0xQRl9SRVNQX1JYQlVGX0JXX0NPUkUwICAgICAgIDB4YTcKLSNkZWZpbmUgUkFESU9fMjA1N19SWEJCX0NDX0NPUkUwICAgICAgICAgICAgICAgICAweGE4Ci0jZGVmaW5lIFJBRElPXzIwNTdfUlhCQl9TUEFSRTNfQ09SRTAgICAgICAgICAgICAgMHhhOQotI2RlZmluZSBSQURJT18yMDU3X1JYQkJfUkNDQUxfSFBDX0NPUkUwICAgICAgICAgIDB4YWEKLSNkZWZpbmUgUkFESU9fMjA1N19MUEZfSURBQ1NfQ09SRTAgICAgICAgICAgICAgICAweGFiCi0jZGVmaW5lIFJBRElPXzIwNTdfTFBGQllQX0RDTE9PUF9CWVBfSURBQ19DT1JFMCAgMHhhYwotI2RlZmluZSBSQURJT18yMDU3X1RYQlVGX0dBSU5fQ09SRTAgICAgICAgICAgICAgIDB4YWQKLSNkZWZpbmUgUkFESU9fMjA1N19BRkVMT09QQkFDS19BQUNJX1JFU1BfQ09SRTAgICAweGFlCi0jZGVmaW5lIFJBRElPXzIwNTdfUlhCVUZfREVHRU5fQ09SRTAgICAgICAgICAgICAgMHhhZgotI2RlZmluZSBSQURJT18yMDU3X1JYQkJfU1BBUkUyX0NPUkUwICAgICAgICAgICAgIDB4YjAKLSNkZWZpbmUgUkFESU9fMjA1N19SWEJCX1NQQVJFMV9DT1JFMCAgICAgICAgICAgICAweGIxCi0jZGVmaW5lIFJBRElPXzIwNTdfUlNTSV9NQVNURVJfQ09SRTAgICAgICAgICAgICAgMHhiMgotI2RlZmluZSBSQURJT18yMDU3X1cyX01BU1RFUl9DT1JFMCAgICAgICAgICAgICAgIDB4YjMKLSNkZWZpbmUgUkFESU9fMjA1N19OQl9NQVNURVJfQ09SRTAgICAgICAgICAgICAgICAweGI0Ci0jZGVmaW5lIFJBRElPXzIwNTdfVzJfSURBQ1MwX1FfQ09SRTAgICAgICAgICAgICAgMHhiNQotI2RlZmluZSBSQURJT18yMDU3X1cyX0lEQUNTMV9RX0NPUkUwICAgICAgICAgICAgIDB4YjYKLSNkZWZpbmUgUkFESU9fMjA1N19XMl9JREFDUzBfSV9DT1JFMCAgICAgICAgICAgICAweGI3Ci0jZGVmaW5lIFJBRElPXzIwNTdfVzJfSURBQ1MxX0lfQ09SRTAgICAgICAgICAgICAgMHhiOAotI2RlZmluZSBSQURJT18yMDU3X1JTU0lfR1BBSU9TRUxfVzFfSURBQ1NfQ09SRTAgIDB4YjkKLSNkZWZpbmUgUkFESU9fMjA1N19OQl9JREFDU19RX0NPUkUwICAgICAgICAgICAgICAweGJhCi0jZGVmaW5lIFJBRElPXzIwNTdfTkJfSURBQ1NfSV9DT1JFMCAgICAgICAgICAgICAgMHhiYgotI2RlZmluZSBSQURJT18yMDU3X0JBQ0tVUDRfQ09SRTAgICAgICAgICAgICAgICAgIDB4YzEKLSNkZWZpbmUgUkFESU9fMjA1N19CQUNLVVAzX0NPUkUwICAgICAgICAgICAgICAgICAweGMyCi0jZGVmaW5lIFJBRElPXzIwNTdfQkFDS1VQMl9DT1JFMCAgICAgICAgICAgICAgICAgMHhjMwotI2RlZmluZSBSQURJT18yMDU3X0JBQ0tVUDFfQ09SRTAgICAgICAgICAgICAgICAgIDB4YzQKLSNkZWZpbmUgUkFESU9fMjA1N19TUEFSRTE2X0NPUkUwICAgICAgICAgICAgICAgICAweGM1Ci0jZGVmaW5lIFJBRElPXzIwNTdfU1BBUkUxNV9DT1JFMCAgICAgICAgICAgICAgICAgMHhjNgotI2RlZmluZSBSQURJT18yMDU3X1NQQVJFMTRfQ09SRTAgICAgICAgICAgICAgICAgIDB4YzcKLSNkZWZpbmUgUkFESU9fMjA1N19TUEFSRTEzX0NPUkUwICAgICAgICAgICAgICAgICAweGM4Ci0jZGVmaW5lIFJBRElPXzIwNTdfU1BBUkUxMl9DT1JFMCAgICAgICAgICAgICAgICAgMHhjOQotI2RlZmluZSBSQURJT18yMDU3X1NQQVJFMTFfQ09SRTAgICAgICAgICAgICAgICAgIDB4Y2EKLSNkZWZpbmUgUkFESU9fMjA1N19UWDJHX0JJQVNfUkVTRVRTX0NPUkUwICAgICAgICAweGNiCi0jZGVmaW5lIFJBRElPXzIwNTdfVFg1R19CSUFTX1JFU0VUU19DT1JFMCAgICAgICAgMHhjYwotI2RlZmluZSBSQURJT18yMDU3X0lRVEVTVF9TRUxfUFUgICAgICAgICAgICAgICAgIDB4Y2QKLSNkZWZpbmUgUkFESU9fMjA1N19YVEFMX0NPTkZJRzIgICAgICAgICAgICAgICAgICAweGNlCi0jZGVmaW5lIFJBRElPXzIwNTdfQlVGU19NSVNDX0xQRkJXX0NPUkUwICAgICAgICAgMHhjZgotI2RlZmluZSBSQURJT18yMDU3X1RYTFBGX1JDQ0FMX0NPUkUwICAgICAgICAgICAgIDB4ZDAKLSNkZWZpbmUgUkFESU9fMjA1N19SWEJCX0dQQUlPU0VMX1JYTFBGX1JDQ0FMX0NPUkUwIDB4ZDEKLSNkZWZpbmUgUkFESU9fMjA1N19MUEZfR0FJTl9DT1JFMCAgICAgICAgICAgICAgICAweGQyCi0jZGVmaW5lIFJBRElPXzIwNTdfREFDQlVGX0lEQUNTX0JXX0NPUkUwICAgICAgICAgMHhkMwotI2RlZmluZSBSQURJT18yMDU3X1JYVFhCSUFTX0NPTkZJR19DT1JFMSAgICAgICAgIDB4ZDQKLSNkZWZpbmUgUkFESU9fMjA1N19UWEdNX1RYUkZfUFVTX0NPUkUxICAgICAgICAgICAweGQ1Ci0jZGVmaW5lIFJBRElPXzIwNTdfVFhHTV9JREFDX0JMRUVEX0NPUkUxICAgICAgICAgMHhkNgotI2RlZmluZSBSQURJT18yMDU3X1RYR01fR0FJTl9DT1JFMSAgICAgICAgICAgICAgIDB4ZGIKLSNkZWZpbmUgUkFESU9fMjA1N19UWEdNMkdfUEtERVRfUFVTX0NPUkUxICAgICAgICAweGRjCi0jZGVmaW5lIFJBRElPXzIwNTdfUEFEMkdfUFRBVFNfQ09SRTEgICAgICAgICAgICAgMHhkZAotI2RlZmluZSBSQURJT18yMDU3X1BBRDJHX0lEQUNTX0NPUkUxICAgICAgICAgICAgIDB4ZGUKLSNkZWZpbmUgUkFESU9fMjA1N19QQUQyR19CT09TVF9QVV9DT1JFMSAgICAgICAgICAweGRmCi0jZGVmaW5lIFJBRElPXzIwNTdfUEFEMkdfQ0FTQ1ZfR0FJTl9DT1JFMSAgICAgICAgMHhlMAotI2RlZmluZSBSQURJT18yMDU3X1RYTUlYMkdfVFVORV9CT09TVF9QVV9DT1JFMSAgIDB4ZTEKLSNkZWZpbmUgUkFESU9fMjA1N19UWE1JWDJHX0xPRENfQ09SRTEgICAgICAgICAgICAweGUyCi0jZGVmaW5lIFJBRElPXzIwNTdfUEFEMkdfVFVORV9QVVNfQ09SRTEgICAgICAgICAgMHhlMwotI2RlZmluZSBSQURJT18yMDU3X0lQQTJHX0dBSU5fQ09SRTEgICAgICAgICAgICAgIDB4ZTQKLSNkZWZpbmUgUkFESU9fMjA1N19UU1NJMkdfU1BBUkUxX0NPUkUxICAgICAgICAgICAweGU1Ci0jZGVmaW5lIFJBRElPXzIwNTdfVFNTSTJHX1NQQVJFMl9DT1JFMSAgICAgICAgICAgMHhlNgotI2RlZmluZSBSQURJT18yMDU3X0lQQTJHX1RVTkVWX0NBU0NWX1BUQVRfQ09SRTEgIDB4ZTcKLSNkZWZpbmUgUkFESU9fMjA1N19JUEEyR19JTUFJTl9DT1JFMSAgICAgICAgICAgICAweGU4Ci0jZGVmaW5lIFJBRElPXzIwNTdfSVBBMkdfQ0FTQ09OVl9DT1JFMSAgICAgICAgICAgMHhlOQotI2RlZmluZSBSQURJT18yMDU3X0lQQTJHX0NBU0NPRkZWX0NPUkUxICAgICAgICAgIDB4ZWEKLSNkZWZpbmUgUkFESU9fMjA1N19JUEEyR19CSUFTX0ZJTFRFUl9DT1JFMSAgICAgICAweGViCi0jZGVmaW5lIFJBRElPXzIwNTdfVFg1R19QS0RFVF9DT1JFMSAgICAgICAgICAgICAgMHhlZQotI2RlZmluZSBSQURJT18yMDU3X1BHQV9QVEFUX1RYR001R19QVV9DT1JFMSAgICAgIDB4ZWYKLSNkZWZpbmUgUkFESU9fMjA1N19QQUQ1R19QVEFUUzFfQ09SRTEgICAgICAgICAgICAweGYwCi0jZGVmaW5lIFJBRElPXzIwNTdfUEFENUdfQ0xBU1NfUFRBVFMyX0NPUkUxICAgICAgMHhmMQotI2RlZmluZSBSQURJT18yMDU3X1BHQV9CT09TVFBUQVRfSU1BSU5fQ09SRTEgICAgIDB4ZjIKLSNkZWZpbmUgUkFESU9fMjA1N19QQUQ1R19DQVNDVl9JTUFJTl9DT1JFMSAgICAgICAweGYzCi0jZGVmaW5lIFJBRElPXzIwNTdfVFhNSVg1R19JQk9PU1RfUEFEX0lBVVhfQ09SRTEgMHhmNAotI2RlZmluZSBSQURJT18yMDU3X1BHQV9CT09TVF9UVU5FX0NPUkUxICAgICAgICAgIDB4ZjUKLSNkZWZpbmUgUkFESU9fMjA1N19QR0FfR0FJTl9DT1JFMSAgICAgICAgICAgICAgICAweGY2Ci0jZGVmaW5lIFJBRElPXzIwNTdfUEFENUdfQ0FTQ09GRlZfR0FJTl9QVVNfQ09SRTEgMHhmNwotI2RlZmluZSBSQURJT18yMDU3X1RYTUlYNUdfQk9PU1RfVFVORV9DT1JFMSAgICAgIDB4ZjgKLSNkZWZpbmUgUkFESU9fMjA1N19QQUQ1R19UVU5FX01JU0NfUFVTX0NPUkUxICAgICAweGY5Ci0jZGVmaW5lIFJBRElPXzIwNTdfSVBBNUdfSUFVWF9DT1JFMSAgICAgICAgICAgICAgMHhmYQotI2RlZmluZSBSQURJT18yMDU3X0lQQTVHX0dBSU5fQ09SRTEgICAgICAgICAgICAgIDB4ZmIKLSNkZWZpbmUgUkFESU9fMjA1N19UU1NJNUdfU1BBUkUxX0NPUkUxICAgICAgICAgICAweGZjCi0jZGVmaW5lIFJBRElPXzIwNTdfVFNTSTVHX1NQQVJFMl9DT1JFMSAgICAgICAgICAgMHhmZAotI2RlZmluZSBSQURJT18yMDU3X0lQQTVHX0NBU0NPRkZWX1BVX0NPUkUxICAgICAgIDB4ZmUKLSNkZWZpbmUgUkFESU9fMjA1N19JUEE1R19QVEFUX0NPUkUxICAgICAgICAgICAgICAweGZmCi0jZGVmaW5lIFJBRElPXzIwNTdfSVBBNUdfSU1BSU5fQ09SRTEgICAgICAgICAgICAgMHgxMDAKLSNkZWZpbmUgUkFESU9fMjA1N19JUEE1R19DQVNDT05WX0NPUkUxICAgICAgICAgICAweDEwMQotI2RlZmluZSBSQURJT18yMDU3X0lQQTVHX0JJQVNfRklMVEVSX0NPUkUxICAgICAgIDB4MTAyCi0jZGVmaW5lIFJBRElPXzIwNTdfUEFEX0JJQVNfRklMVEVSX0JXU19DT1JFMSAgICAgMHgxMDUKLSNkZWZpbmUgUkFESU9fMjA1N19UUjJHX0NPTkZJRzFfQ09SRTFfTlUgICAgICAgICAweDEwNgotI2RlZmluZSBSQURJT18yMDU3X1RSMkdfQ09ORklHMl9DT1JFMV9OVSAgICAgICAgIDB4MTA3Ci0jZGVmaW5lIFJBRElPXzIwNTdfTE5BNUdfUkZFTl9DT1JFMSAgICAgICAgICAgICAgMHgxMDgKLSNkZWZpbmUgUkFESU9fMjA1N19UUjVHX0NPTkZJRzJfQ09SRTFfTlUgICAgICAgICAweDEwOQotI2RlZmluZSBSQURJT18yMDU3X1JYUkZCSUFTX0lCT09TVF9QVV9DT1JFMSAgICAgIDB4MTBhCi0jZGVmaW5lIFJBRElPXzIwNTdfUlhSRl9JQUJBTkRfUlhHTV9JTUFJTl9QVEFUX0NPUkUxIDB4MTBiCi0jZGVmaW5lIFJBRElPXzIwNTdfUlhHTV9DTUZCSVRBSUxfQVVYUFRBVF9DT1JFMSAgMHgxMGMKLSNkZWZpbmUgUkFESU9fMjA1N19SWE1JWF9JQ09SRV9SWEdNX0lBVVhfQ09SRTEgICAweDEwZAotI2RlZmluZSBSQURJT18yMDU3X1JYTUlYX0NNRkJJVEFJTF9QVV9DT1JFMSAgICAgIDB4MTBlCi0jZGVmaW5lIFJBRElPXzIwNTdfTE5BMl9JTUFJTl9QVEFUX1BVX0NPUkUxICAgICAgMHgxMGYKLSNkZWZpbmUgUkFESU9fMjA1N19MTkEyX0lBVVhfUFRBVF9DT1JFMSAgICAgICAgICAweDExMAotI2RlZmluZSBSQURJT18yMDU3X0xOQTFfSU1BSU5fUFRBVF9QVV9DT1JFMSAgICAgIDB4MTExCi0jZGVmaW5lIFJBRElPXzIwNTdfTE5BMTVHX0lOUFVUX01BVENIX1RVTkVfQ09SRTEgMHgxMTIKLSNkZWZpbmUgUkFESU9fMjA1N19SWFJGQklBU19CQU5EU0VMX0NPUkUxICAgICAgICAweDExMwotI2RlZmluZSBSQURJT18yMDU3X1RJQV9DT05GSUdfQ09SRTEgICAgICAgICAgICAgIDB4MTE0Ci0jZGVmaW5lIFJBRElPXzIwNTdfVElBX0lRR0FJTl9DT1JFMSAgICAgICAgICAgICAgMHgxMTUKLSNkZWZpbmUgUkFESU9fMjA1N19USUFfSUJJQVMyX0NPUkUxICAgICAgICAgICAgICAweDExNgotI2RlZmluZSBSQURJT18yMDU3X1RJQV9JQklBUzFfQ09SRTEgICAgICAgICAgICAgIDB4MTE3Ci0jZGVmaW5lIFJBRElPXzIwNTdfVElBX1NQQVJFX1FfQ09SRTEgICAgICAgICAgICAgMHgxMTgKLSNkZWZpbmUgUkFESU9fMjA1N19USUFfU1BBUkVfSV9DT1JFMSAgICAgICAgICAgICAweDExOQotI2RlZmluZSBSQURJT18yMDU3X1JYTUlYMkdfUFVTX0NPUkUxICAgICAgICAgICAgIDB4MTFhCi0jZGVmaW5lIFJBRElPXzIwNTdfUlhNSVgyR19WQ01SRUZTX0NPUkUxICAgICAgICAgMHgxMWIKLSNkZWZpbmUgUkFESU9fMjA1N19SWE1JWDJHX0xPRENfUUlfQ09SRTEgICAgICAgICAweDExYwotI2RlZmluZSBSQURJT18yMDU3X1cxMkdfQldfTE5BMkdfUFVTX0NPUkUxICAgICAgIDB4MTFkCi0jZGVmaW5lIFJBRElPXzIwNTdfTE5BMkdfR0FJTl9DT1JFMSAgICAgICAgICAgICAgMHgxMWUKLSNkZWZpbmUgUkFESU9fMjA1N19MTkEyR19UVU5FX0NPUkUxICAgICAgICAgICAgICAweDExZgotI2RlZmluZSBSQURJT18yMDU3X1JYTUlYNUdfUFVTX0NPUkUxICAgICAgICAgICAgIDB4MTIwCi0jZGVmaW5lIFJBRElPXzIwNTdfUlhNSVg1R19WQ01SRUZTX0NPUkUxICAgICAgICAgMHgxMjEKLSNkZWZpbmUgUkFESU9fMjA1N19SWE1JWDVHX0xPRENfUUlfQ09SRTEgICAgICAgICAweDEyMgotI2RlZmluZSBSQURJT18yMDU3X1cxNUdfQldfTE5BNUdfUFVTX0NPUkUxICAgICAgIDB4MTIzCi0jZGVmaW5lIFJBRElPXzIwNTdfTE5BNUdfR0FJTl9DT1JFMSAgICAgICAgICAgICAgMHgxMjQKLSNkZWZpbmUgUkFESU9fMjA1N19MTkE1R19UVU5FX0NPUkUxICAgICAgICAgICAgICAweDEyNQotI2RlZmluZSBSQURJT18yMDU3X0xQRlNFTF9UWFJYX1JYQkJfUFVTX0NPUkUxICAgIDB4MTI2Ci0jZGVmaW5lIFJBRElPXzIwNTdfUlhCQl9CSUFTX01BU1RFUl9DT1JFMSAgICAgICAgMHgxMjcKLSNkZWZpbmUgUkFESU9fMjA1N19SWEJCX1ZHQUJVRl9JREFDU19DT1JFMSAgICAgICAweDEyOAotI2RlZmluZSBSQURJT18yMDU3X0xQRl9WQ01SRUZfVFhCVUZfVkNNUkVGX0NPUkUxIDB4MTI5Ci0jZGVmaW5lIFJBRElPXzIwNTdfVFhCVUZfVklOQ01fQ09SRTEgICAgICAgICAgICAgMHgxMmEKLSNkZWZpbmUgUkFESU9fMjA1N19UWEJVRl9JREFDU19DT1JFMSAgICAgICAgICAgICAweDEyYgotI2RlZmluZSBSQURJT18yMDU3X0xQRl9SRVNQX1JYQlVGX0JXX0NPUkUxICAgICAgIDB4MTJjCi0jZGVmaW5lIFJBRElPXzIwNTdfUlhCQl9DQ19DT1JFMSAgICAgICAgICAgICAgICAgMHgxMmQKLSNkZWZpbmUgUkFESU9fMjA1N19SWEJCX1NQQVJFM19DT1JFMSAgICAgICAgICAgICAweDEyZQotI2RlZmluZSBSQURJT18yMDU3X1JYQkJfUkNDQUxfSFBDX0NPUkUxICAgICAgICAgIDB4MTJmCi0jZGVmaW5lIFJBRElPXzIwNTdfTFBGX0lEQUNTX0NPUkUxICAgICAgICAgICAgICAgMHgxMzAKLSNkZWZpbmUgUkFESU9fMjA1N19MUEZCWVBfRENMT09QX0JZUF9JREFDX0NPUkUxICAweDEzMQotI2RlZmluZSBSQURJT18yMDU3X1RYQlVGX0dBSU5fQ09SRTEgICAgICAgICAgICAgIDB4MTMyCi0jZGVmaW5lIFJBRElPXzIwNTdfQUZFTE9PUEJBQ0tfQUFDSV9SRVNQX0NPUkUxICAgMHgxMzMKLSNkZWZpbmUgUkFESU9fMjA1N19SWEJVRl9ERUdFTl9DT1JFMSAgICAgICAgICAgICAweDEzNAotI2RlZmluZSBSQURJT18yMDU3X1JYQkJfU1BBUkUyX0NPUkUxICAgICAgICAgICAgIDB4MTM1Ci0jZGVmaW5lIFJBRElPXzIwNTdfUlhCQl9TUEFSRTFfQ09SRTEgICAgICAgICAgICAgMHgxMzYKLSNkZWZpbmUgUkFESU9fMjA1N19SU1NJX01BU1RFUl9DT1JFMSAgICAgICAgICAgICAweDEzNwotI2RlZmluZSBSQURJT18yMDU3X1cyX01BU1RFUl9DT1JFMSAgICAgICAgICAgICAgIDB4MTM4Ci0jZGVmaW5lIFJBRElPXzIwNTdfTkJfTUFTVEVSX0NPUkUxICAgICAgICAgICAgICAgMHgxMzkKLSNkZWZpbmUgUkFESU9fMjA1N19XMl9JREFDUzBfUV9DT1JFMSAgICAgICAgICAgICAweDEzYQotI2RlZmluZSBSQURJT18yMDU3X1cyX0lEQUNTMV9RX0NPUkUxICAgICAgICAgICAgIDB4MTNiCi0jZGVmaW5lIFJBRElPXzIwNTdfVzJfSURBQ1MwX0lfQ09SRTEgICAgICAgICAgICAgMHgxM2MKLSNkZWZpbmUgUkFESU9fMjA1N19XMl9JREFDUzFfSV9DT1JFMSAgICAgICAgICAgICAweDEzZAotI2RlZmluZSBSQURJT18yMDU3X1JTU0lfR1BBSU9TRUxfVzFfSURBQ1NfQ09SRTEgIDB4MTNlCi0jZGVmaW5lIFJBRElPXzIwNTdfTkJfSURBQ1NfUV9DT1JFMSAgICAgICAgICAgICAgMHgxM2YKLSNkZWZpbmUgUkFESU9fMjA1N19OQl9JREFDU19JX0NPUkUxICAgICAgICAgICAgICAweDE0MAotI2RlZmluZSBSQURJT18yMDU3X0JBQ0tVUDRfQ09SRTEgICAgICAgICAgICAgICAgIDB4MTQ2Ci0jZGVmaW5lIFJBRElPXzIwNTdfQkFDS1VQM19DT1JFMSAgICAgICAgICAgICAgICAgMHgxNDcKLSNkZWZpbmUgUkFESU9fMjA1N19CQUNLVVAyX0NPUkUxICAgICAgICAgICAgICAgICAweDE0OAotI2RlZmluZSBSQURJT18yMDU3X0JBQ0tVUDFfQ09SRTEgICAgICAgICAgICAgICAgIDB4MTQ5Ci0jZGVmaW5lIFJBRElPXzIwNTdfU1BBUkUxNl9DT1JFMSAgICAgICAgICAgICAgICAgMHgxNGEKLSNkZWZpbmUgUkFESU9fMjA1N19TUEFSRTE1X0NPUkUxICAgICAgICAgICAgICAgICAweDE0YgotI2RlZmluZSBSQURJT18yMDU3X1NQQVJFMTRfQ09SRTEgICAgICAgICAgICAgICAgIDB4MTRjCi0jZGVmaW5lIFJBRElPXzIwNTdfU1BBUkUxM19DT1JFMSAgICAgICAgICAgICAgICAgMHgxNGQKLSNkZWZpbmUgUkFESU9fMjA1N19TUEFSRTEyX0NPUkUxICAgICAgICAgICAgICAgICAweDE0ZQotI2RlZmluZSBSQURJT18yMDU3X1NQQVJFMTFfQ09SRTEgICAgICAgICAgICAgICAgIDB4MTRmCi0jZGVmaW5lIFJBRElPXzIwNTdfVFgyR19CSUFTX1JFU0VUU19DT1JFMSAgICAgICAgMHgxNTAKLSNkZWZpbmUgUkFESU9fMjA1N19UWDVHX0JJQVNfUkVTRVRTX0NPUkUxICAgICAgICAweDE1MQotI2RlZmluZSBSQURJT18yMDU3X1NQQVJFOF9DT1JFMSAgICAgICAgICAgICAgICAgIDB4MTUyCi0jZGVmaW5lIFJBRElPXzIwNTdfU1BBUkU3X0NPUkUxICAgICAgICAgICAgICAgICAgMHgxNTMKLSNkZWZpbmUgUkFESU9fMjA1N19CVUZTX01JU0NfTFBGQldfQ09SRTEgICAgICAgICAweDE1NAotI2RlZmluZSBSQURJT18yMDU3X1RYTFBGX1JDQ0FMX0NPUkUxICAgICAgICAgICAgIDB4MTU1Ci0jZGVmaW5lIFJBRElPXzIwNTdfUlhCQl9HUEFJT1NFTF9SWExQRl9SQ0NBTF9DT1JFMSAweDE1NgotI2RlZmluZSBSQURJT18yMDU3X0xQRl9HQUlOX0NPUkUxICAgICAgICAgICAgICAgIDB4MTU3Ci0jZGVmaW5lIFJBRElPXzIwNTdfREFDQlVGX0lEQUNTX0JXX0NPUkUxICAgICAgICAgMHgxNTgKLSNkZWZpbmUgUkFESU9fMjA1N19EQUNCVUZfVklOQ01fQ09SRTEgICAgICAgICAgICAweDE1OQotI2RlZmluZSBSQURJT18yMDU3X1JDQ0FMX1NUQVJUX1IxX1ExX1AxICAgICAgICAgIDB4MTVhCi0jZGVmaW5lIFJBRElPXzIwNTdfUkNDQUxfWDEgICAgICAgICAgICAgICAgICAgICAgMHgxNWIKLSNkZWZpbmUgUkFESU9fMjA1N19SQ0NBTF9UUkMwICAgICAgICAgICAgICAgICAgICAweDE1YwotI2RlZmluZSBSQURJT18yMDU3X1JDQ0FMX1RSQzEgICAgICAgICAgICAgICAgICAgIDB4MTVkCi0jZGVmaW5lIFJBRElPXzIwNTdfUkNDQUxfRE9ORV9PU0NDQVAgICAgICAgICAgICAgMHgxNWUKLSNkZWZpbmUgUkFESU9fMjA1N19SQ0NBTF9OMF8wICAgICAgICAgICAgICAgICAgICAweDE1ZgotI2RlZmluZSBSQURJT18yMDU3X1JDQ0FMX04wXzEgICAgICAgICAgICAgICAgICAgIDB4MTYwCi0jZGVmaW5lIFJBRElPXzIwNTdfUkNDQUxfTjFfMCAgICAgICAgICAgICAgICAgICAgMHgxNjEKLSNkZWZpbmUgUkFESU9fMjA1N19SQ0NBTF9OMV8xICAgICAgICAgICAgICAgICAgICAweDE2MgotI2RlZmluZSBSQURJT18yMDU3X1JDQUxfU1RBVFVTICAgICAgICAgICAgICAgICAgIDB4MTYzCi0jZGVmaW5lIFJBRElPXzIwNTdfWFRBTFBVT1ZSX1BJTkNUUkwgICAgICAgICAgICAgMHgxNjQKLSNkZWZpbmUgUkFESU9fMjA1N19PVlJfUkVHMCAgICAgICAgICAgICAgICAgICAgICAweDE2NQotI2RlZmluZSBSQURJT18yMDU3X09WUl9SRUcxICAgICAgICAgICAgICAgICAgICAgIDB4MTY2Ci0jZGVmaW5lIFJBRElPXzIwNTdfT1ZSX1JFRzIgICAgICAgICAgICAgICAgICAgICAgMHgxNjcKLSNkZWZpbmUgUkFESU9fMjA1N19PVlJfUkVHMyAgICAgICAgICAgICAgICAgICAgICAweDE2OAotI2RlZmluZSBSQURJT18yMDU3X09WUl9SRUc0ICAgICAgICAgICAgICAgICAgICAgIDB4MTY5Ci0jZGVmaW5lIFJBRElPXzIwNTdfUkNDQUxfU0NBUF9WQUwgICAgICAgICAgICAgICAgMHgxNmEKLSNkZWZpbmUgUkFESU9fMjA1N19SQ0NBTF9CQ0FQX1ZBTCAgICAgICAgICAgICAgICAweDE2YgotI2RlZmluZSBSQURJT18yMDU3X1JDQ0FMX0hQQ19WQUwgICAgICAgICAgICAgICAgIDB4MTZjCi0jZGVmaW5lIFJBRElPXzIwNTdfUkNDQUxfT1ZFUlJJREVTICAgICAgICAgICAgICAgMHgxNmQKLSNkZWZpbmUgUkFESU9fMjA1N19UWDBfSVFDQUxfR0FJTl9CVyAgICAgICAgICAgICAweDE3MAotI2RlZmluZSBSQURJT18yMDU3X1RYMF9MT0ZUX0ZJTkVfSSAgICAgICAgICAgICAgIDB4MTcxCi0jZGVmaW5lIFJBRElPXzIwNTdfVFgwX0xPRlRfRklORV9RICAgICAgICAgICAgICAgMHgxNzIKLSNkZWZpbmUgUkFESU9fMjA1N19UWDBfTE9GVF9DT0FSU0VfSSAgICAgICAgICAgICAweDE3MwotI2RlZmluZSBSQURJT18yMDU3X1RYMF9MT0ZUX0NPQVJTRV9RICAgICAgICAgICAgIDB4MTc0Ci0jZGVmaW5lIFJBRElPXzIwNTdfVFgwX1RYX1NTSV9NQVNURVIgICAgICAgICAgICAgMHgxNzUKLSNkZWZpbmUgUkFESU9fMjA1N19UWDBfSVFDQUxfVkNNX0hHICAgICAgICAgICAgICAweDE3NgotI2RlZmluZSBSQURJT18yMDU3X1RYMF9JUUNBTF9JREFDICAgICAgICAgICAgICAgIDB4MTc3Ci0jZGVmaW5lIFJBRElPXzIwNTdfVFgwX1RTU0lfVkNNICAgICAgICAgICAgICAgICAgMHgxNzgKLSNkZWZpbmUgUkFESU9fMjA1N19UWDBfVFhfU1NJX01VWCAgICAgICAgICAgICAgICAweDE3OQotI2RlZmluZSBSQURJT18yMDU3X1RYMF9UU1NJQSAgICAgICAgICAgICAgICAgICAgIDB4MTdhCi0jZGVmaW5lIFJBRElPXzIwNTdfVFgwX1RTU0lHICAgICAgICAgICAgICAgICAgICAgMHgxN2IKLSNkZWZpbmUgUkFESU9fMjA1N19UWDBfVFNTSV9NSVNDMSAgICAgICAgICAgICAgICAweDE3YwotI2RlZmluZSBSQURJT18yMDU3X1RYMF9UWFJYQ09VUExFXzJHX0FUVEVOICAgICAgIDB4MTdkCi0jZGVmaW5lIFJBRElPXzIwNTdfVFgwX1RYUlhDT1VQTEVfMkdfUFdSVVAgICAgICAgMHgxN2UKLSNkZWZpbmUgUkFESU9fMjA1N19UWDBfVFhSWENPVVBMRV81R19BVFRFTiAgICAgICAweDE3ZgotI2RlZmluZSBSQURJT18yMDU3X1RYMF9UWFJYQ09VUExFXzVHX1BXUlVQICAgICAgIDB4MTgwCi0jZGVmaW5lIFJBRElPXzIwNTdfVFgxX0lRQ0FMX0dBSU5fQlcgICAgICAgICAgICAgMHgxOTAKLSNkZWZpbmUgUkFESU9fMjA1N19UWDFfTE9GVF9GSU5FX0kgICAgICAgICAgICAgICAweDE5MQotI2RlZmluZSBSQURJT18yMDU3X1RYMV9MT0ZUX0ZJTkVfUSAgICAgICAgICAgICAgIDB4MTkyCi0jZGVmaW5lIFJBRElPXzIwNTdfVFgxX0xPRlRfQ09BUlNFX0kgICAgICAgICAgICAgMHgxOTMKLSNkZWZpbmUgUkFESU9fMjA1N19UWDFfTE9GVF9DT0FSU0VfUSAgICAgICAgICAgICAweDE5NAotI2RlZmluZSBSQURJT18yMDU3X1RYMV9UWF9TU0lfTUFTVEVSICAgICAgICAgICAgIDB4MTk1Ci0jZGVmaW5lIFJBRElPXzIwNTdfVFgxX0lRQ0FMX1ZDTV9IRyAgICAgICAgICAgICAgMHgxOTYKLSNkZWZpbmUgUkFESU9fMjA1N19UWDFfSVFDQUxfSURBQyAgICAgICAgICAgICAgICAweDE5NwotI2RlZmluZSBSQURJT18yMDU3X1RYMV9UU1NJX1ZDTSAgICAgICAgICAgICAgICAgIDB4MTk4Ci0jZGVmaW5lIFJBRElPXzIwNTdfVFgxX1RYX1NTSV9NVVggICAgICAgICAgICAgICAgMHgxOTkKLSNkZWZpbmUgUkFESU9fMjA1N19UWDFfVFNTSUEgICAgICAgICAgICAgICAgICAgICAweDE5YQotI2RlZmluZSBSQURJT18yMDU3X1RYMV9UU1NJRyAgICAgICAgICAgICAgICAgICAgIDB4MTliCi0jZGVmaW5lIFJBRElPXzIwNTdfVFgxX1RTU0lfTUlTQzEgICAgICAgICAgICAgICAgMHgxOWMKLSNkZWZpbmUgUkFESU9fMjA1N19UWDFfVFhSWENPVVBMRV8yR19BVFRFTiAgICAgICAweDE5ZAotI2RlZmluZSBSQURJT18yMDU3X1RYMV9UWFJYQ09VUExFXzJHX1BXUlVQICAgICAgIDB4MTllCi0jZGVmaW5lIFJBRElPXzIwNTdfVFgxX1RYUlhDT1VQTEVfNUdfQVRURU4gICAgICAgMHgxOWYKLSNkZWZpbmUgUkFESU9fMjA1N19UWDFfVFhSWENPVVBMRV81R19QV1JVUCAgICAgICAweDFhMAotI2RlZmluZSBSQURJT18yMDU3X0FGRV9WQ01fQ0FMX01BU1RFUl9DT1JFMCAgICAgIDB4MWExCi0jZGVmaW5lIFJBRElPXzIwNTdfQUZFX1NFVF9WQ01fSV9DT1JFMCAgICAgICAgICAgMHgxYTIKLSNkZWZpbmUgUkFESU9fMjA1N19BRkVfU0VUX1ZDTV9RX0NPUkUwICAgICAgICAgICAweDFhMwotI2RlZmluZSBSQURJT18yMDU3X0FGRV9TVEFUVVNfVkNNX0lRQURDX0NPUkUwICAgIDB4MWE0Ci0jZGVmaW5lIFJBRElPXzIwNTdfQUZFX1NUQVRVU19WQ01fSV9DT1JFMCAgICAgICAgMHgxYTUKLSNkZWZpbmUgUkFESU9fMjA1N19BRkVfU1RBVFVTX1ZDTV9RX0NPUkUwICAgICAgICAweDFhNgotI2RlZmluZSBSQURJT18yMDU3X0FGRV9WQ01fQ0FMX01BU1RFUl9DT1JFMSAgICAgIDB4MWE3Ci0jZGVmaW5lIFJBRElPXzIwNTdfQUZFX1NFVF9WQ01fSV9DT1JFMSAgICAgICAgICAgMHgxYTgKLSNkZWZpbmUgUkFESU9fMjA1N19BRkVfU0VUX1ZDTV9RX0NPUkUxICAgICAgICAgICAweDFhOQotI2RlZmluZSBSQURJT18yMDU3X0FGRV9TVEFUVVNfVkNNX0lRQURDX0NPUkUxICAgIDB4MWFhCi0jZGVmaW5lIFJBRElPXzIwNTdfQUZFX1NUQVRVU19WQ01fSV9DT1JFMSAgICAgICAgMHgxYWIKLSNkZWZpbmUgUkFESU9fMjA1N19BRkVfU1RBVFVTX1ZDTV9RX0NPUkUxICAgICAgICAweDFhYwotCi0jZGVmaW5lIFJBRElPXzIwNTd2N19EQUNCVUZfVklOQ01fQ09SRTAgICAgICAgICAgMHgxYWQKLSNkZWZpbmUgUkFESU9fMjA1N3Y3X1JDQ0FMX01BU1RFUiAgICAgICAgICAgICAgICAweDFhZQotI2RlZmluZSBSQURJT18yMDU3djdfVFIyR19DT05GSUczX0NPUkUwX05VICAgICAgIDB4MWFmCi0jZGVmaW5lIFJBRElPXzIwNTd2N19UUjJHX0NPTkZJRzNfQ09SRTFfTlUgICAgICAgMHgxYjAKLSNkZWZpbmUgUkFESU9fMjA1N3Y3X0xPR0VOX1BVUzEgICAgICAgICAgICAgICAgICAweDFiMQotI2RlZmluZSBSQURJT18yMDU3djdfT1ZSX1JFRzUgICAgICAgICAgICAgICAgICAgIDB4MWIyCi0jZGVmaW5lIFJBRElPXzIwNTd2N19PVlJfUkVHNiAgICAgICAgICAgICAgICAgICAgMHgxYjMKLSNkZWZpbmUgUkFESU9fMjA1N3Y3X09WUl9SRUc3ICAgICAgICAgICAgICAgICAgICAweDFiNAotI2RlZmluZSBSQURJT18yMDU3djdfT1ZSX1JFRzggICAgICAgICAgICAgICAgICAgIDB4MWI1Ci0jZGVmaW5lIFJBRElPXzIwNTd2N19PVlJfUkVHOSAgICAgICAgICAgICAgICAgICAgMHgxYjYKLSNkZWZpbmUgUkFESU9fMjA1N3Y3X09WUl9SRUcxMCAgICAgICAgICAgICAgICAgICAweDFiNwotI2RlZmluZSBSQURJT18yMDU3djdfT1ZSX1JFRzExICAgICAgICAgICAgICAgICAgIDB4MWI4Ci0jZGVmaW5lIFJBRElPXzIwNTd2N19PVlJfUkVHMTIgICAgICAgICAgICAgICAgICAgMHgxYjkKLSNkZWZpbmUgUkFESU9fMjA1N3Y3X09WUl9SRUcxMyAgICAgICAgICAgICAgICAgICAweDFiYQotI2RlZmluZSBSQURJT18yMDU3djdfT1ZSX1JFRzE0ICAgICAgICAgICAgICAgICAgIDB4MWJiCi0jZGVmaW5lIFJBRElPXzIwNTd2N19PVlJfUkVHMTUgICAgICAgICAgICAgICAgICAgMHgxYmMKLSNkZWZpbmUgUkFESU9fMjA1N3Y3X09WUl9SRUcxNiAgICAgICAgICAgICAgICAgICAweDFiZAotI2RlZmluZSBSQURJT18yMDU3djdfT1ZSX1JFRzEgICAgICAgICAgICAgICAgICAgIDB4MWJlCi0jZGVmaW5lIFJBRElPXzIwNTd2N19PVlJfUkVHMTggICAgICAgICAgICAgICAgICAgMHgxYmYKLSNkZWZpbmUgUkFESU9fMjA1N3Y3X09WUl9SRUcxOSAgICAgICAgICAgICAgICAgICAweDFjMAotI2RlZmluZSBSQURJT18yMDU3djdfT1ZSX1JFRzIwICAgICAgICAgICAgICAgICAgIDB4MWMxCi0jZGVmaW5lIFJBRElPXzIwNTd2N19PVlJfUkVHMjEgICAgICAgICAgICAgICAgICAgMHgxYzIKLSNkZWZpbmUgUkFESU9fMjA1N3Y3X09WUl9SRUcyICAgICAgICAgICAgICAgICAgICAweDFjMwotI2RlZmluZSBSQURJT18yMDU3djdfT1ZSX1JFRzIzICAgICAgICAgICAgICAgICAgIDB4MWM0Ci0jZGVmaW5lIFJBRElPXzIwNTd2N19PVlJfUkVHMjQgICAgICAgICAgICAgICAgICAgMHgxYzUKLSNkZWZpbmUgUkFESU9fMjA1N3Y3X09WUl9SRUcyNSAgICAgICAgICAgICAgICAgICAweDFjNgotI2RlZmluZSBSQURJT18yMDU3djdfT1ZSX1JFRzI2ICAgICAgICAgICAgICAgICAgIDB4MWM3Ci0jZGVmaW5lIFJBRElPXzIwNTd2N19PVlJfUkVHMjcgICAgICAgICAgICAgICAgICAgMHgxYzgKLSNkZWZpbmUgUkFESU9fMjA1N3Y3X09WUl9SRUcyOCAgICAgICAgICAgICAgICAgICAweDFjOQotI2RlZmluZSBSQURJT18yMDU3djdfSVFURVNUX1NFTF9QVTIgICAgICAgICAgICAgIDB4MWNhCi0KLSNkZWZpbmUgUkFESU9fMjA1N19WQ01fTUFTSwkJCSAweDcKLQotI2VuZGlmCQkJCS8qIF9CUkNNX1BIWV9SQURJT19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5cmVnX24uaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeXJlZ19uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5N2MzYTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5cmVnX24uaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2RlZmluZSBOUEhZX1RCTF9JRF9HQUlOMQkJMAotI2RlZmluZSBOUEhZX1RCTF9JRF9HQUlOMgkJMQotI2RlZmluZSBOUEhZX1RCTF9JRF9HQUlOQklUUzEJCTIKLSNkZWZpbmUgTlBIWV9UQkxfSURfR0FJTkJJVFMyCQkzCi0jZGVmaW5lIE5QSFlfVEJMX0lEX0dBSU5MSU1JVAkJNAotI2RlZmluZSBOUEhZX1RCTF9JRF9XUlNTSUdhaW5MaW1pdAk1Ci0jZGVmaW5lIE5QSFlfVEJMX0lEX1JGU0VRCQk3Ci0jZGVmaW5lIE5QSFlfVEJMX0lEX0FGRUNUUkwJCTgKLSNkZWZpbmUgTlBIWV9UQkxfSURfQU5UU1dDVFJMTFVUCTkKLSNkZWZpbmUgTlBIWV9UQkxfSURfSVFMT0NBTAkJMTUKLSNkZWZpbmUgTlBIWV9UQkxfSURfTk9JU0VWQVIJCTE2Ci0jZGVmaW5lIE5QSFlfVEJMX0lEX1NBTVBMRVBMQVkJCTE3Ci0jZGVmaW5lIE5QSFlfVEJMX0lEX0NPUkUxVFhQV1JDVEwJMjYKLSNkZWZpbmUgTlBIWV9UQkxfSURfQ09SRTJUWFBXUkNUTAkyNwotI2RlZmluZSBOUEhZX1RCTF9JRF9DTVBNRVRSSUNEQVRBV0VJR0hUVEJMCTMwCi0KLSNkZWZpbmUgTlBIWV9UQkxfSURfRVBTSUxPTlRCTDAgICAzMQotI2RlZmluZSBOUEhZX1RCTF9JRF9TQ0FMQVJUQkwwICAgIDMyCi0jZGVmaW5lIE5QSFlfVEJMX0lEX0VQU0lMT05UQkwxICAgMzMKLSNkZWZpbmUgTlBIWV9UQkxfSURfU0NBTEFSVEJMMSAgICAzNAotCi0jZGVmaW5lCU5QSFlfVE9fQlBIWV9PRkYJMHhjMDAKLQotI2RlZmluZSBOUEhZX0JhbmRDb250cm9sX2N1cnJlbnRCYW5kCQkJMHgwMDAxCi0jZGVmaW5lIFJGQ0NfQ0hJUDBfUFUJCQkweDA0MDAKLSNkZWZpbmUgUkZDQ19QT1JfRk9SQ0UJCQkweDAwNDAKLSNkZWZpbmUgUkZDQ19PRV9QT1JfRk9SQ0UJCTB4MDA4MAotI2RlZmluZSBOUEhZX1JmY3RybEludGNfb3ZlcnJpZGVfT0ZGCQkJMAotI2RlZmluZSBOUEhZX1JmY3RybEludGNfb3ZlcnJpZGVfVFJTVwkJCTEKLSNkZWZpbmUgTlBIWV9SZmN0cmxJbnRjX292ZXJyaWRlX1BBCQkJCTIKLSNkZWZpbmUgTlBIWV9SZmN0cmxJbnRjX292ZXJyaWRlX0VYVF9MTkFfUFUJCTMKLSNkZWZpbmUgTlBIWV9SZmN0cmxJbnRjX292ZXJyaWRlX0VYVF9MTkFfR0FJTgk0Ci0jZGVmaW5lIFJJRlNfRU5BQkxFCQkJMHg4MAotI2RlZmluZSBCUEhZX0JBTkRfU0VMX1VQMjAJCTB4MTAKLSNkZWZpbmUgTlBIWV9NTGVuYWJsZQkJCTB4MDIKLQotI2RlZmluZSBOUEhZX1Jmc2VxTW9kZV9Db3JlQWN0dl9vdmVycmlkZSAweDAwMDEKLSNkZWZpbmUgTlBIWV9SZnNlcU1vZGVfVHJpZ2dlcl9vdmVycmlkZQkweDAwMDIKLSNkZWZpbmUgTlBIWV9SZnNlcUNvcmVBY3R2X1R4UnhDaGFpbjAJKDB4MTEpCi0jZGVmaW5lIE5QSFlfUmZzZXFDb3JlQWN0dl9UeFJ4Q2hhaW4xCSgweDIyKQotCi0jZGVmaW5lIE5QSFlfUmZzZXFUcmlnZ2VyX3J4MnR4CQkweDAwMDEKLSNkZWZpbmUgTlBIWV9SZnNlcVRyaWdnZXJfdHgycngJCTB4MDAwMgotI2RlZmluZSBOUEhZX1Jmc2VxVHJpZ2dlcl91cGRhdGVnYWluaAkweDAwMDQKLSNkZWZpbmUgTlBIWV9SZnNlcVRyaWdnZXJfdXBkYXRlZ2FpbmwJMHgwMDA4Ci0jZGVmaW5lIE5QSFlfUmZzZXFUcmlnZ2VyX3VwZGF0ZWdhaW51CTB4MDAxMAotI2RlZmluZSBOUEhZX1Jmc2VxVHJpZ2dlcl9yZXNldDJyeAkweDAwMjAKLSNkZWZpbmUgTlBIWV9SZnNlcVN0YXR1c19yeDJ0eAkJMHgwMDAxCi0jZGVmaW5lIE5QSFlfUmZzZXFTdGF0dXNfdHgycngJCTB4MDAwMgotI2RlZmluZSBOUEhZX1Jmc2VxU3RhdHVzX3VwZGF0ZWdhaW5oCTB4MDAwNAotI2RlZmluZSBOUEhZX1Jmc2VxU3RhdHVzX3VwZGF0ZWdhaW5sCTB4MDAwOAotI2RlZmluZSBOUEhZX1Jmc2VxU3RhdHVzX3VwZGF0ZWdhaW51CTB4MDAxMAotI2RlZmluZSBOUEhZX1Jmc2VxU3RhdHVzX3Jlc2V0MnJ4CTB4MDAyMAotI2RlZmluZSBOUEhZX0NsYXNzaWZpZXJDdHJsX2Nja19lbgkweDEKLSNkZWZpbmUgTlBIWV9DbGFzc2lmaWVyQ3RybF9vZmRtX2VuCTB4MgotI2RlZmluZSBOUEhZX0NsYXNzaWZpZXJDdHJsX3dhaXRlZF9lbgkweDQKLSNkZWZpbmUgTlBIWV9JUUZsaXBfQURDMQkJMHgwMDAxCi0jZGVmaW5lIE5QSFlfSVFGbGlwX0FEQzIJCTB4MDAxMAotI2RlZmluZSBOUEhZX3NhbXBsZUNtZF9TVE9QCQkweDAwMDIKLQotI2RlZmluZSBSWF9HRl9PUl9NTQkJCTB4MDAwNAotI2RlZmluZSBSWF9HRl9NTV9BVVRPCQkJMHgwMTAwCi0KLSNkZWZpbmUgTlBIWV9pcWxvQ2FsQ21kR2N0bF9JUUxPX0NBTF9FTgkweDgwMDAKLQotI2RlZmluZSBOUEhZX0lxZXN0Q21kX2lxc3RhcnQJCTB4MQotI2RlZmluZSBOUEhZX0lxZXN0Q21kX2lxTW9kZQkJMHgyCi0KLSNkZWZpbmUgTlBIWV9UeFB3ckN0cmxDbWRfcHdySW5kZXhfaW5pdAkJMHg0MAotI2RlZmluZSBOUEhZX1R4UHdyQ3RybENtZF9wd3JJbmRleF9pbml0X3JldjcJMHgxOQotCi0jZGVmaW5lIFBSSU1fU0VMX1VQMjAJCTB4ODAwMAotCi0jZGVmaW5lIE5QSFlfUkZTRVFfUlgyVFgJCTB4MAotI2RlZmluZSBOUEhZX1JGU0VRX1RYMlJYCQkweDEKLSNkZWZpbmUgTlBIWV9SRlNFUV9SRVNFVDJSWAkJMHgyCi0jZGVmaW5lIE5QSFlfUkZTRVFfVVBEQVRFR0FJTkgJCTB4MwotI2RlZmluZSBOUEhZX1JGU0VRX1VQREFURUdBSU5MCQkweDQKLSNkZWZpbmUgTlBIWV9SRlNFUV9VUERBVEVHQUlOVQkJMHg1Ci0KLSNkZWZpbmUgTlBIWV9SRlNFUV9DTURfTk9QCQkweDAKLSNkZWZpbmUgTlBIWV9SRlNFUV9DTURfUlhHX0ZCVwkJMHgxCi0jZGVmaW5lIE5QSFlfUkZTRVFfQ01EX1RSX1NXSVRDSAkweDIKLSNkZWZpbmUgTlBIWV9SRlNFUV9DTURfRVhUX1BBCQkweDMKLSNkZWZpbmUgTlBIWV9SRlNFUV9DTURfUlhQRF9UWFBECTB4NAotI2RlZmluZSBOUEhZX1JGU0VRX0NNRF9UWF9HQUlOCQkweDUKLSNkZWZpbmUgTlBIWV9SRlNFUV9DTURfUlhfR0FJTgkJMHg2Ci0jZGVmaW5lIE5QSFlfUkZTRVFfQ01EX1NFVF9IUEZfQlcJMHg3Ci0jZGVmaW5lIE5QSFlfUkZTRVFfQ01EX0NMUl9ISVFfRElTCTB4OAotI2RlZmluZSBOUEhZX1JGU0VRX0NNRF9FTkQJCTB4ZgotCi0jZGVmaW5lIE5QSFlfUkVWM19SRlNFUV9DTURfTk9QCQkweDAKLSNkZWZpbmUgTlBIWV9SRVYzX1JGU0VRX0NNRF9SWEdfRkJXCTB4MQotI2RlZmluZSBOUEhZX1JFVjNfUkZTRVFfQ01EX1RSX1NXSVRDSAkweDIKLSNkZWZpbmUgTlBIWV9SRVYzX1JGU0VRX0NNRF9JTlRfUEFfUFUJMHgzCi0jZGVmaW5lIE5QSFlfUkVWM19SRlNFUV9DTURfRVhUX1BBCTB4NAotI2RlZmluZSBOUEhZX1JFVjNfUkZTRVFfQ01EX1JYUERfVFhQRAkweDUKLSNkZWZpbmUgTlBIWV9SRVYzX1JGU0VRX0NNRF9UWF9HQUlOCTB4NgotI2RlZmluZSBOUEhZX1JFVjNfUkZTRVFfQ01EX1JYX0dBSU4JMHg3Ci0jZGVmaW5lIE5QSFlfUkVWM19SRlNFUV9DTURfQ0xSX0hJUV9ESVMJMHg4Ci0jZGVmaW5lIE5QSFlfUkVWM19SRlNFUV9DTURfU0VUX0hQRl9IX0hQQwkweDkKLSNkZWZpbmUgTlBIWV9SRVYzX1JGU0VRX0NNRF9TRVRfTFBGX0hfSFBDCTB4YQotI2RlZmluZSBOUEhZX1JFVjNfUkZTRVFfQ01EX1NFVF9IUEZfTV9IUEMJMHhiCi0jZGVmaW5lIE5QSFlfUkVWM19SRlNFUV9DTURfU0VUX0xQRl9NX0hQQwkweGMKLSNkZWZpbmUgTlBIWV9SRVYzX1JGU0VRX0NNRF9TRVRfSFBGX0xfSFBDCTB4ZAotI2RlZmluZSBOUEhZX1JFVjNfUkZTRVFfQ01EX1NFVF9MUEZfTF9IUEMJMHhlCi0jZGVmaW5lIE5QSFlfUkVWM19SRlNFUV9DTURfQ0xSX1JYUlhfQklBUwkweGYKLSNkZWZpbmUgTlBIWV9SRVYzX1JGU0VRX0NNRF9FTkQJCTB4MWYKLQotI2RlZmluZSBOUEhZX1JTU0lfU0VMX1cxCQkweDAKLSNkZWZpbmUgTlBIWV9SU1NJX1NFTF9XMgkJMHgxCi0jZGVmaW5lIE5QSFlfUlNTSV9TRUxfTkIJCTB4MgotI2RlZmluZSBOUEhZX1JTU0lfU0VMX0lRCQkweDMKLSNkZWZpbmUgTlBIWV9SU1NJX1NFTF9UU1NJXzJHCQkweDQKLSNkZWZpbmUgTlBIWV9SU1NJX1NFTF9UU1NJXzVHCQkweDUKLSNkZWZpbmUgTlBIWV9SU1NJX1NFTF9UQkQJCTB4NgotCi0jZGVmaW5lIE5QSFlfUkFJTF9JCQkJMHgwCi0jZGVmaW5lIE5QSFlfUkFJTF9RCQkJMHgxCi0KLSNkZWZpbmUgTlBIWV9GT1JDRVNJR19ERUNPREVHQVRFRENMS1MJMHg4Ci0KLSNkZWZpbmUgTlBIWV9SRVY3X1JmY3RybE92ZXJyaWRlX2NtZF9yeHJmX3B1IDB4MAotI2RlZmluZSBOUEhZX1JFVjdfUmZjdHJsT3ZlcnJpZGVfY21kX3J4X3B1ICAgMHgxCi0jZGVmaW5lIE5QSFlfUkVWN19SZmN0cmxPdmVycmlkZV9jbWRfdHhfcHUgICAweDIKLSNkZWZpbmUgTlBIWV9SRVY3X1JmY3RybE92ZXJyaWRlX2NtZF9yeGdhaW4gIDB4MwotI2RlZmluZSBOUEhZX1JFVjdfUmZjdHJsT3ZlcnJpZGVfY21kX3R4Z2FpbiAgMHg0Ci0KLSNkZWZpbmUgTlBIWV9SRVY3X1JYR0FJTkNPREVfUkZNWEdBSU5fTUFTSyAweDAwMGZmCi0jZGVmaW5lIE5QSFlfUkVWN19SWEdBSU5DT0RFX0xQRkdBSU5fTUFTSyAgMHgwZmYwMAotI2RlZmluZSBOUEhZX1JFVjdfUlhHQUlOQ09ERV9EVkdBR0FJTl9NQVNLIDB4ZjAwMDAKLQotI2RlZmluZSBOUEhZX1JFVjdfVFhHQUlOQ09ERV9UR0FJTl9NQVNLICAgICAweDdmZmYKLSNkZWZpbmUgTlBIWV9SRVY3X1RYR0FJTkNPREVfTFBGR0FJTl9NQVNLICAgMHg4MDAwCi0jZGVmaW5lIE5QSFlfUkVWN19UWEdBSU5DT0RFX0JJUTBHQUlOX1NISUZUIDE0Ci0KLSNkZWZpbmUgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMCAweDAKLSNkZWZpbmUgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMSAweDEKLSNkZWZpbmUgTlBIWV9SRVY3X1JGQ1RSTE9WRVJSSURFX0lEMiAweDIKLQotI2RlZmluZSBOUEhZX0lxZXN0SXFBY2NMbyhjb3JlKSAgKChjb3JlID09IDApID8gMHgxMmMgOiAweDEzNCkKLQotI2RlZmluZSBOUEhZX0lxZXN0SXFBY2NIaShjb3JlKSAgKChjb3JlID09IDApID8gMHgxMmQgOiAweDEzNSkKLQotI2RlZmluZSBOUEhZX0lxZXN0aXB3ckFjY0xvKGNvcmUpICAoKGNvcmUgPT0gMCkgPyAweDEyZSA6IDB4MTM2KQotCi0jZGVmaW5lIE5QSFlfSXFlc3RpcHdyQWNjSGkoY29yZSkgICgoY29yZSA9PSAwKSA/IDB4MTJmIDogMHgxMzcpCi0KLSNkZWZpbmUgTlBIWV9JcWVzdHFwd3JBY2NMbyhjb3JlKSAgKChjb3JlID09IDApID8gMHgxMzAgOiAweDEzOCkKLQotI2RlZmluZSBOUEhZX0lxZXN0cXB3ckFjY0hpKGNvcmUpICAoKGNvcmUgPT0gMCkgPyAweDEzMSA6IDB4MTM5KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5dGJsX2xjbi5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5dGJsX2xjbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjNkMDVhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeXRibF9sY24uYworKysgL2Rldi9udWxsCkBAIC0xLDM2MzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlIDx0eXBlcy5oPgotI2luY2x1ZGUgInBoeXRibF9sY24uaCIKLQotY29uc3QgdTMyIGRvdDExbGNuX2dhaW5fdGJsX3JldjBbXSA9IHsKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwNCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDQsCi0JMHgwMDAwMDAwOCwKLQkweDAwMDAwMDAxLAotCTB4MDAwMDAwMDUsCi0JMHgwMDAwMDAwOSwKLQkweDAwMDAwMDBkLAotCTB4MDAwMDAwNGQsCi0JMHgwMDAwMDA4ZCwKLQkweDAwMDAwMDBkLAotCTB4MDAwMDAwNGQsCi0JMHgwMDAwMDA4ZCwKLQkweDAwMDAwMGNkLAotCTB4MDAwMDAwNGYsCi0JMHgwMDAwMDA4ZiwKLQkweDAwMDAwMGNmLAotCTB4MDAwMDAwZDMsCi0JMHgwMDAwMDExMywKLQkweDAwMDAwNTEzLAotCTB4MDAwMDA5MTMsCi0JMHgwMDAwMDk1MywKLQkweDAwMDAwZDUzLAotCTB4MDAwMDExNTMsCi0JMHgwMDAwMTE5MywKLQkweDAwMDA1MTkzLAotCTB4MDAwMDkxOTMsCi0JMHgwMDAwZDE5MywKLQkweDAwMDExMTkzLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDQsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDA0LAotCTB4MDAwMDAwMDgsCi0JMHgwMDAwMDAwMSwKLQkweDAwMDAwMDA1LAotCTB4MDAwMDAwMDksCi0JMHgwMDAwMDAwZCwKLQkweDAwMDAwMDRkLAotCTB4MDAwMDAwOGQsCi0JMHgwMDAwMDAwZCwKLQkweDAwMDAwMDRkLAotCTB4MDAwMDAwOGQsCi0JMHgwMDAwMDBjZCwKLQkweDAwMDAwMDRmLAotCTB4MDAwMDAwOGYsCi0JMHgwMDAwMDBjZiwKLQkweDAwMDAwMGQzLAotCTB4MDAwMDAxMTMsCi0JMHgwMDAwMDUxMywKLQkweDAwMDAwOTEzLAotCTB4MDAwMDA5NTMsCi0JMHgwMDAwMGQ1MywKLQkweDAwMDAxMTUzLAotCTB4MDAwMDUxNTMsCi0JMHgwMDAwOTE1MywKLQkweDAwMDBkMTUzLAotCTB4MDAwMTExNTMsCi0JMHgwMDAxNTE1MywKLQkweDAwMDE5MTUzLAotCTB4MDAwMWQxNTMsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLX07Ci0KLWNvbnN0IHUzMiBkb3QxMWxjbl9nYWluX3RibF9yZXYxW10gPSB7Ci0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDgsCi0JMHgwMDAwMDAwNCwKLQkweDAwMDAwMDA4LAotCTB4MDAwMDAwMDEsCi0JMHgwMDAwMDAwNSwKLQkweDAwMDAwMDA5LAotCTB4MDAwMDAwMEQsCi0JMHgwMDAwMDAxMSwKLQkweDAwMDAwMDUxLAotCTB4MDAwMDAwOTEsCi0JMHgwMDAwMDAxMSwKLQkweDAwMDAwMDUxLAotCTB4MDAwMDAwOTEsCi0JMHgwMDAwMDBkMSwKLQkweDAwMDAwMDUzLAotCTB4MDAwMDAwOTMsCi0JMHgwMDAwMDBkMywKLQkweDAwMDAwMGQ3LAotCTB4MDAwMDAxMTcsCi0JMHgwMDAwMDUxNywKLQkweDAwMDAwOTE3LAotCTB4MDAwMDA5NTcsCi0JMHgwMDAwMGQ1NywKLQkweDAwMDAxMTU3LAotCTB4MDAwMDExOTcsCi0JMHgwMDAwNTE5NywKLQkweDAwMDA5MTk3LAotCTB4MDAwMGQxOTcsCi0JMHgwMDAxMTE5NywKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDA4LAotCTB4MDAwMDAwMDQsCi0JMHgwMDAwMDAwOCwKLQkweDAwMDAwMDAxLAotCTB4MDAwMDAwMDUsCi0JMHgwMDAwMDAwOSwKLQkweDAwMDAwMDBELAotCTB4MDAwMDAwMTEsCi0JMHgwMDAwMDA1MSwKLQkweDAwMDAwMDkxLAotCTB4MDAwMDAwMTEsCi0JMHgwMDAwMDA1MSwKLQkweDAwMDAwMDkxLAotCTB4MDAwMDAwZDEsCi0JMHgwMDAwMDA1MywKLQkweDAwMDAwMDkzLAotCTB4MDAwMDAwZDMsCi0JMHgwMDAwMDBkNywKLQkweDAwMDAwMTE3LAotCTB4MDAwMDA1MTcsCi0JMHgwMDAwMDkxNywKLQkweDAwMDAwOTU3LAotCTB4MDAwMDBkNTcsCi0JMHgwMDAwMTE1NywKLQkweDAwMDA1MTU3LAotCTB4MDAwMDkxNTcsCi0JMHgwMDAwZDE1NywKLQkweDAwMDExMTU3LAotCTB4MDAwMTUxNTcsCi0JMHgwMDAxOTE1NywKLQkweDAwMDFkMTU3LAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi19OwotCi1jb25zdCB1MTYgZG90MTFsY25fYXV4X2dhaW5faWR4X3RibF9yZXYwW10gPSB7Ci0JMHgwNDAxLAotCTB4MDQwMiwKLQkweDA0MDMsCi0JMHgwNDA0LAotCTB4MDQwNSwKLQkweDA0MDYsCi0JMHgwNDA3LAotCTB4MDQwOCwKLQkweDA0MDksCi0JMHgwNDBhLAotCTB4MDU4YiwKLQkweDA1OGMsCi0JMHgwNThkLAotCTB4MDU4ZSwKLQkweDA1OGYsCi0JMHgwMDkwLAotCTB4MDA5MSwKLQkweDAwOTIsCi0JMHgwMTkzLAotCTB4MDE5NCwKLQkweDAxOTUsCi0JMHgwMTk2LAotCTB4MDE5NywKLQkweDAxOTgsCi0JMHgwMTk5LAotCTB4MDE5YSwKLQkweDAxOWIsCi0JMHgwMTljLAotCTB4MDE5ZCwKLQkweDAxOWUsCi0JMHgwMTlmLAotCTB4MDFhMCwKLQkweDAxYTEsCi0JMHgwMWEyLAotCTB4MDFhMywKLQkweDAxYTQsCi0JMHgwMWE1LAotCTB4MDAwMCwKLX07Ci0KLWNvbnN0IHUzMiBkb3QxMWxjbl9nYWluX2lkeF90YmxfcmV2MFtdID0gewotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDEwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgyMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MzAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDQwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHg1MDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4NjAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDcwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHg4MDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4OTAwMDAwMDAsCi0JMHgwMDAwMDAwOCwKLQkweGEwMDAwMDAwLAotCTB4MDAwMDAwMDgsCi0JMHhiMDAwMDAwMCwKLQkweDAwMDAwMDA4LAotCTB4YzAwMDAwMDAsCi0JMHgwMDAwMDAwOCwKLQkweGQwMDAwMDAwLAotCTB4MDAwMDAwMDgsCi0JMHhlMDAwMDAwMCwKLQkweDAwMDAwMDA4LAotCTB4ZjAwMDAwMDAsCi0JMHgwMDAwMDAwOCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDksCi0JMHgxMDAwMDAwMCwKLQkweDAwMDAwMDA5LAotCTB4MjAwMDAwMDAsCi0JMHgwMDAwMDAxOSwKLQkweDMwMDAwMDAwLAotCTB4MDAwMDAwMTksCi0JMHg0MDAwMDAwMCwKLQkweDAwMDAwMDE5LAotCTB4NTAwMDAwMDAsCi0JMHgwMDAwMDAxOSwKLQkweDYwMDAwMDAwLAotCTB4MDAwMDAwMTksCi0JMHg3MDAwMDAwMCwKLQkweDAwMDAwMDE5LAotCTB4ODAwMDAwMDAsCi0JMHgwMDAwMDAxOSwKLQkweDkwMDAwMDAwLAotCTB4MDAwMDAwMTksCi0JMHhhMDAwMDAwMCwKLQkweDAwMDAwMDE5LAotCTB4YjAwMDAwMDAsCi0JMHgwMDAwMDAxOSwKLQkweGMwMDAwMDAwLAotCTB4MDAwMDAwMTksCi0JMHhkMDAwMDAwMCwKLQkweDAwMDAwMDE5LAotCTB4ZTAwMDAwMDAsCi0JMHgwMDAwMDAxOSwKLQkweGYwMDAwMDAwLAotCTB4MDAwMDAwMTksCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDFhLAotCTB4MTAwMDAwMDAsCi0JMHgwMDAwMDAxYSwKLQkweDIwMDAwMDAwLAotCTB4MDAwMDAwMWEsCi0JMHgzMDAwMDAwMCwKLQkweDAwMDAwMDFhLAotCTB4NDAwMDAwMDAsCi0JMHgwMDAwMDAxYSwKLQkweDUwMDAwMDAwLAotCTB4MDAwMDAwMDIsCi0JMHg2MDAwMDAwMCwKLQkweDAwMDAwMDAyLAotCTB4NzAwMDAwMDAsCi0JMHgwMDAwMDAwMiwKLQkweDgwMDAwMDAwLAotCTB4MDAwMDAwMDIsCi0JMHg5MDAwMDAwMCwKLQkweDAwMDAwMDAyLAotCTB4YTAwMDAwMDAsCi0JMHgwMDAwMDAwMiwKLQkweGIwMDAwMDAwLAotCTB4MDAwMDAwMDIsCi0JMHhjMDAwMDAwMCwKLQkweDAwMDAwMDBhLAotCTB4ZDAwMDAwMDAsCi0JMHgwMDAwMDAwYSwKLQkweGUwMDAwMDAwLAotCTB4MDAwMDAwMGEsCi0JMHhmMDAwMDAwMCwKLQkweDAwMDAwMDBhLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwYiwKLQkweDEwMDAwMDAwLAotCTB4MDAwMDAwMGIsCi0JMHgyMDAwMDAwMCwKLQkweDAwMDAwMDBiLAotCTB4MzAwMDAwMDAsCi0JMHgwMDAwMDAwYiwKLQkweDQwMDAwMDAwLAotCTB4MDAwMDAwMGIsCi0JMHg1MDAwMDAwMCwKLQkweDAwMDAwMDFiLAotCTB4NjAwMDAwMDAsCi0JMHgwMDAwMDAxYiwKLQkweDcwMDAwMDAwLAotCTB4MDAwMDAwMWIsCi0JMHg4MDAwMDAwMCwKLQkweDAwMDAwMDFiLAotCTB4OTAwMDAwMDAsCi0JMHgwMDAwMDAxYiwKLQkweGEwMDAwMDAwLAotCTB4MDAwMDAwMWIsCi0JMHhiMDAwMDAwMCwKLQkweDAwMDAwMDFiLAotCTB4YzAwMDAwMDAsCi0JMHgwMDAwMDAxYiwKLQkweGQwMDAwMDAwLAotCTB4MDAwMDAwMWIsCi0JMHhlMDAwMDAwMCwKLQkweDAwMDAwMDFiLAotCTB4ZjAwMDAwMDAsCi0JMHgwMDAwMDAxYiwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMWMsCi0JMHgxMDAwMDAwMCwKLQkweDAwMDAwMDFjLAotCTB4MjAwMDAwMDAsCi0JMHgwMDAwMDAxYywKLQkweDMwMDAwMDAwLAotCTB4MDAwMDAwMWMsCi0JMHg0MDAwMDAwMCwKLQkweDAwMDAwMDFjLAotCTB4NTAwMDAwMDAsCi0JMHgwMDAwMDAxYywKLQkweDYwMDAwMDAwLAotCTB4MDAwMDAwMWMsCi0JMHg3MDAwMDAwMCwKLQkweDAwMDAwMDFjLAotCTB4ODAwMDAwMDAsCi0JMHgwMDAwMDAxYywKLQkweDkwMDAwMDAwLAotCTB4MDAwMDAwMWMsCi19OwotCi1jb25zdCB1MTYgZG90MTFsY25fYXV4X2dhaW5faWR4X3RibF8yR1tdID0gewotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDEsCi0JMHgwMDgwLAotCTB4MDA4MSwKLQkweDAxMDAsCi0JMHgwMTAxLAotCTB4MDE4MCwKLQkweDAxODEsCi0JMHgwMTgyLAotCTB4MDE4MywKLQkweDAxODQsCi0JMHgwMTg1LAotCTB4MDE4NiwKLQkweDAxODcsCi0JMHgwMTg4LAotCTB4MDI4NSwKLQkweDAyODksCi0JMHgwMjhhLAotCTB4MDI4YiwKLQkweDAyOGMsCi0JMHgwMjhkLAotCTB4MDI4ZSwKLQkweDAyOGYsCi0JMHgwMjkwLAotCTB4MDI5MSwKLQkweDAyOTIsCi0JMHgwMjkzLAotCTB4MDI5NCwKLQkweDAyOTUsCi0JMHgwMjk2LAotCTB4MDI5NywKLQkweDAyOTgsCi0JMHgwMjk5LAotCTB4MDI5YSwKLQkweDAwMDAKLX07Ci0KLWNvbnN0IHU4IGRvdDExbGNuX2dhaW5fdmFsX3RibF8yR1tdID0gewotCTB4ZmMsCi0JMHgwMiwKLQkweDA4LAotCTB4MGUsCi0JMHgxMywKLQkweDFiLAotCTB4ZmMsCi0JMHgwMiwKLQkweDA4LAotCTB4MGUsCi0JMHgxMywKLQkweDFiLAotCTB4ZmMsCi0JMHgwMCwKLQkweDBjLAotCTB4MDMsCi0JMHhlYiwKLQkweGZlLAotCTB4MDcsCi0JMHgwYiwKLQkweDBmLAotCTB4ZmIsCi0JMHhmZSwKLQkweDAxLAotCTB4MDUsCi0JMHgwOCwKLQkweDBiLAotCTB4MGUsCi0JMHgxMSwKLQkweDE0LAotCTB4MTcsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAzLAotCTB4MDYsCi0JMHgwOSwKLQkweDBjLAotCTB4MGYsCi0JMHgxMiwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDMsCi0JMHgwNiwKLQkweDA5LAotCTB4MGMsCi0JMHgwZiwKLQkweDEyLAotCTB4MTUsCi0JMHgxOCwKLQkweDFiLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMAotfTsKLQotY29uc3QgdTMyIGRvdDExbGNuX2dhaW5faWR4X3RibF8yR1tdID0gewotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDEwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDA4LAotCTB4MTAwMDAwMDAsCi0JMHgwMDAwMDAwOCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMTAsCi0JMHgxMDAwMDAwMCwKLQkweDAwMDAwMDEwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAxOCwKLQkweDEwMDAwMDAwLAotCTB4MDAwMDAwMTgsCi0JMHgyMDAwMDAwMCwKLQkweDAwMDAwMDE4LAotCTB4MzAwMDAwMDAsCi0JMHgwMDAwMDAxOCwKLQkweDQwMDAwMDAwLAotCTB4MDAwMDAwMTgsCi0JMHg1MDAwMDAwMCwKLQkweDAwMDAwMDE4LAotCTB4NjAwMDAwMDAsCi0JMHgwMDAwMDAxOCwKLQkweDcwMDAwMDAwLAotCTB4MDAwMDAwMTgsCi0JMHg4MDAwMDAwMCwKLQkweDAwMDAwMDE4LAotCTB4NTAwMDAwMDAsCi0JMHgwMDAwMDAyOCwKLQkweDkwMDAwMDAwLAotCTB4MDAwMDAwMjgsCi0JMHhhMDAwMDAwMCwKLQkweDAwMDAwMDI4LAotCTB4YjAwMDAwMDAsCi0JMHgwMDAwMDAyOCwKLQkweGMwMDAwMDAwLAotCTB4MDAwMDAwMjgsCi0JMHhkMDAwMDAwMCwKLQkweDAwMDAwMDI4LAotCTB4ZTAwMDAwMDAsCi0JMHgwMDAwMDAyOCwKLQkweGYwMDAwMDAwLAotCTB4MDAwMDAwMjgsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDI5LAotCTB4MTAwMDAwMDAsCi0JMHgwMDAwMDAyOSwKLQkweDIwMDAwMDAwLAotCTB4MDAwMDAwMjksCi0JMHgzMDAwMDAwMCwKLQkweDAwMDAwMDI5LAotCTB4NDAwMDAwMDAsCi0JMHgwMDAwMDAyOSwKLQkweDUwMDAwMDAwLAotCTB4MDAwMDAwMjksCi0JMHg2MDAwMDAwMCwKLQkweDAwMDAwMDI5LAotCTB4NzAwMDAwMDAsCi0JMHgwMDAwMDAyOSwKLQkweDgwMDAwMDAwLAotCTB4MDAwMDAwMjksCi0JMHg5MDAwMDAwMCwKLQkweDAwMDAwMDI5LAotCTB4YTAwMDAwMDAsCi0JMHgwMDAwMDAyOSwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MTAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDgsCi0JMHgxMDAwMDAwMCwKLQkweDAwMDAwMDA4LAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAxMCwKLQkweDEwMDAwMDAwLAotCTB4MDAwMDAwMTAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDE4LAotCTB4MTAwMDAwMDAsCi0JMHgwMDAwMDAxOCwKLQkweDIwMDAwMDAwLAotCTB4MDAwMDAwMTgsCi0JMHgzMDAwMDAwMCwKLQkweDAwMDAwMDE4LAotCTB4NDAwMDAwMDAsCi0JMHgwMDAwMDAxOCwKLQkweDUwMDAwMDAwLAotCTB4MDAwMDAwMTgsCi0JMHg2MDAwMDAwMCwKLQkweDAwMDAwMDE4LAotCTB4NzAwMDAwMDAsCi0JMHgwMDAwMDAxOCwKLQkweDgwMDAwMDAwLAotCTB4MDAwMDAwMTgsCi0JMHg1MDAwMDAwMCwKLQkweDAwMDAwMDI4LAotCTB4OTAwMDAwMDAsCi0JMHgwMDAwMDAyOCwKLQkweGEwMDAwMDAwLAotCTB4MDAwMDAwMjgsCi0JMHhiMDAwMDAwMCwKLQkweDAwMDAwMDI4LAotCTB4YzAwMDAwMDAsCi0JMHgwMDAwMDAyOCwKLQkweGQwMDAwMDAwLAotCTB4MDAwMDAwMjgsCi0JMHhlMDAwMDAwMCwKLQkweDAwMDAwMDI4LAotCTB4ZjAwMDAwMDAsCi0JMHgwMDAwMDAyOCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMjksCi0JMHgxMDAwMDAwMCwKLQkweDAwMDAwMDI5LAotCTB4MjAwMDAwMDAsCi0JMHgwMDAwMDAyOSwKLQkweDMwMDAwMDAwLAotCTB4MDAwMDAwMjksCi0JMHg0MDAwMDAwMCwKLQkweDAwMDAwMDI5LAotCTB4NTAwMDAwMDAsCi0JMHgwMDAwMDAyOSwKLQkweDYwMDAwMDAwLAotCTB4MDAwMDAwMjksCi0JMHg3MDAwMDAwMCwKLQkweDAwMDAwMDI5LAotCTB4ODAwMDAwMDAsCi0JMHgwMDAwMDAyOSwKLQkweDkwMDAwMDAwLAotCTB4MDAwMDAwMjksCi0JMHhhMDAwMDAwMCwKLQkweDAwMDAwMDI5LAotCTB4YjAwMDAwMDAsCi0JMHgwMDAwMDAyOSwKLQkweGMwMDAwMDAwLAotCTB4MDAwMDAwMjksCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMAotfTsKLQotY29uc3QgdTMyIGRvdDExbGNuX2dhaW5fdGJsXzJHW10gPSB7Ci0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDA0LAotCTB4MDAwMDAwMDgsCi0JMHgwMDAwMDAwMSwKLQkweDAwMDAwMDA1LAotCTB4MDAwMDAwMDksCi0JMHgwMDAwMDAwZCwKLQkweDAwMDAwMDRkLAotCTB4MDAwMDAwOGQsCi0JMHgwMDAwMDA0OSwKLQkweDAwMDAwMDg5LAotCTB4MDAwMDAwYzksCi0JMHgwMDAwMDA0YiwKLQkweDAwMDAwMDhiLAotCTB4MDAwMDAwY2IsCi0JMHgwMDAwMDBjZiwKLQkweDAwMDAwMTBmLAotCTB4MDAwMDA1MGYsCi0JMHgwMDAwMDkwZiwKLQkweDAwMDAwOTRmLAotCTB4MDAwMDBkNGYsCi0JMHgwMDAwMTE0ZiwKLQkweDAwMDAxMThmLAotCTB4MDAwMDUxOGYsCi0JMHgwMDAwOTE4ZiwKLQkweDAwMDBkMThmLAotCTB4MDAwMTExOGYsCi0JMHgwMDAxNTE4ZiwKLQkweDAwMDE5MThmLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAKLX07Ci0KLWNvbnN0IHUzMiBkb3QxMWxjbl9nYWluX3RibF9leHRsbmFfMkdbXSA9IHsKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDQsCi0JMHgwMDAwMDAwOCwKLQkweDAwMDAwMDAxLAotCTB4MDAwMDAwMDUsCi0JMHgwMDAwMDAwOSwKLQkweDAwMDAwMDBkLAotCTB4MDAwMDAwMDMsCi0JMHgwMDAwMDAwNywKLQkweDAwMDAwMDBiLAotCTB4MDAwMDAwMGYsCi0JMHgwMDAwMDA0ZiwKLQkweDAwMDAwMDhmLAotCTB4MDAwMDAwY2YsCi0JMHgwMDAwMDEwZiwKLQkweDAwMDAwMTRmLAotCTB4MDAwMDAxOGYsCi0JMHgwMDAwMDU4ZiwKLQkweDAwMDAwOThmLAotCTB4MDAwMDBkOGYsCi0JMHgwMDAwODAwMCwKLQkweDAwMDA4MDA0LAotCTB4MDAwMDgwMDgsCi0JMHgwMDAwODAwMSwKLQkweDAwMDA4MDA1LAotCTB4MDAwMDgwMDksCi0JMHgwMDAwODAwZCwKLQkweDAwMDA4MDAzLAotCTB4MDAwMDgwMDcsCi0JMHgwMDAwODAwYiwKLQkweDAwMDA4MDBmLAotCTB4MDAwMDgwNGYsCi0JMHgwMDAwODA4ZiwKLQkweDAwMDA4MGNmLAotCTB4MDAwMDgxMGYsCi0JMHgwMDAwODE0ZiwKLQkweDAwMDA4MThmLAotCTB4MDAwMDg1OGYsCi0JMHgwMDAwODk4ZiwKLQkweDAwMDA4ZDhmLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMAotfTsKLQotY29uc3QgdTE2IGRvdDExbGNuX2F1eF9nYWluX2lkeF90YmxfZXh0bG5hXzJHW10gPSB7Ci0JMHgwNDAwLAotCTB4MDQwMCwKLQkweDA0MDAsCi0JMHgwNDAwLAotCTB4MDQwMCwKLQkweDA0MDAsCi0JMHgwNDAwLAotCTB4MDQwMCwKLQkweDA0MDAsCi0JMHgwNDAxLAotCTB4MDQwMiwKLQkweDA0MDMsCi0JMHgwNDA0LAotCTB4MDQ4MywKLQkweDA0ODQsCi0JMHgwNDg1LAotCTB4MDQ4NiwKLQkweDA1ODMsCi0JMHgwNTg0LAotCTB4MDU4NSwKLQkweDA1ODcsCi0JMHgwNTg4LAotCTB4MDU4OSwKLQkweDA1OGEsCi0JMHgwNjg3LAotCTB4MDY4OCwKLQkweDA2ODksCi0JMHgwNjhhLAotCTB4MDY4YiwKLQkweDA2OGMsCi0JMHgwNjhkLAotCTB4MDY4ZSwKLQkweDA2OGYsCi0JMHgwNjkwLAotCTB4MDY5MSwKLQkweDA2OTIsCi0JMHgwNjkzLAotCTB4MDAwMAotfTsKLQotY29uc3QgdTggZG90MTFsY25fZ2Fpbl92YWxfdGJsX2V4dGxuYV8yR1tdID0gewotCTB4ZmMsCi0JMHgwMiwKLQkweDA4LAotCTB4MGUsCi0JMHgxMywKLQkweDFiLAotCTB4ZmMsCi0JMHgwMiwKLQkweDA4LAotCTB4MGUsCi0JMHgxMywKLQkweDFiLAotCTB4ZmMsCi0JMHgwMCwKLQkweDBmLAotCTB4MDMsCi0JMHhlYiwKLQkweGZlLAotCTB4MDcsCi0JMHgwYiwKLQkweDBmLAotCTB4ZmIsCi0JMHhmZSwKLQkweDAxLAotCTB4MDUsCi0JMHgwOCwKLQkweDBiLAotCTB4MGUsCi0JMHgxMSwKLQkweDE0LAotCTB4MTcsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAzLAotCTB4MDYsCi0JMHgwOSwKLQkweDBjLAotCTB4MGYsCi0JMHgxMiwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDMsCi0JMHgwNiwKLQkweDA5LAotCTB4MGMsCi0JMHgwZiwKLQkweDEyLAotCTB4MTUsCi0JMHgxOCwKLQkweDFiLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMAotfTsKLQotY29uc3QgdTMyIGRvdDExbGNuX2dhaW5faWR4X3RibF9leHRsbmFfMkdbXSA9IHsKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwNDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDQwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDA0MCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwNDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDQwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDA0MCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwNDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDQwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDA0MCwKLQkweDEwMDAwMDAwLAotCTB4MDAwMDAwNDAsCi0JMHgyMDAwMDAwMCwKLQkweDAwMDAwMDQwLAotCTB4MzAwMDAwMDAsCi0JMHgwMDAwMDA0MCwKLQkweDQwMDAwMDAwLAotCTB4MDAwMDAwNDAsCi0JMHgzMDAwMDAwMCwKLQkweDAwMDAwMDQ4LAotCTB4NDAwMDAwMDAsCi0JMHgwMDAwMDA0OCwKLQkweDUwMDAwMDAwLAotCTB4MDAwMDAwNDgsCi0JMHg2MDAwMDAwMCwKLQkweDAwMDAwMDQ4LAotCTB4MzAwMDAwMDAsCi0JMHgwMDAwMDA1OCwKLQkweDQwMDAwMDAwLAotCTB4MDAwMDAwNTgsCi0JMHg1MDAwMDAwMCwKLQkweDAwMDAwMDU4LAotCTB4NzAwMDAwMDAsCi0JMHgwMDAwMDA1OCwKLQkweDgwMDAwMDAwLAotCTB4MDAwMDAwNTgsCi0JMHg5MDAwMDAwMCwKLQkweDAwMDAwMDU4LAotCTB4YTAwMDAwMDAsCi0JMHgwMDAwMDA1OCwKLQkweDcwMDAwMDAwLAotCTB4MDAwMDAwNjgsCi0JMHg4MDAwMDAwMCwKLQkweDAwMDAwMDY4LAotCTB4OTAwMDAwMDAsCi0JMHgwMDAwMDA2OCwKLQkweGEwMDAwMDAwLAotCTB4MDAwMDAwNjgsCi0JMHhiMDAwMDAwMCwKLQkweDAwMDAwMDY4LAotCTB4YzAwMDAwMDAsCi0JMHgwMDAwMDA2OCwKLQkweGQwMDAwMDAwLAotCTB4MDAwMDAwNjgsCi0JMHhlMDAwMDAwMCwKLQkweDAwMDAwMDY4LAotCTB4ZjAwMDAwMDAsCi0JMHgwMDAwMDA2OCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwNjksCi0JMHgxMDAwMDAwMCwKLQkweDAwMDAwMDY5LAotCTB4MjAwMDAwMDAsCi0JMHgwMDAwMDA2OSwKLQkweDMwMDAwMDAwLAotCTB4MDAwMDAwNjksCi0JMHg0MDAwMDAwMCwKLQkweDAwMDAwMDQxLAotCTB4NDAwMDAwMDAsCi0JMHgwMDAwMDA0MSwKLQkweDQwMDAwMDAwLAotCTB4MDAwMDAwNDEsCi0JMHg0MDAwMDAwMCwKLQkweDAwMDAwMDQxLAotCTB4NDAwMDAwMDAsCi0JMHgwMDAwMDA0MSwKLQkweDQwMDAwMDAwLAotCTB4MDAwMDAwNDEsCi0JMHg0MDAwMDAwMCwKLQkweDAwMDAwMDQxLAotCTB4NDAwMDAwMDAsCi0JMHgwMDAwMDA0MSwKLQkweDQwMDAwMDAwLAotCTB4MDAwMDAwNDEsCi0JMHg1MDAwMDAwMCwKLQkweDAwMDAwMDQxLAotCTB4NjAwMDAwMDAsCi0JMHgwMDAwMDA0MSwKLQkweDcwMDAwMDAwLAotCTB4MDAwMDAwNDEsCi0JMHg4MDAwMDAwMCwKLQkweDAwMDAwMDQxLAotCTB4NzAwMDAwMDAsCi0JMHgwMDAwMDA0OSwKLQkweDgwMDAwMDAwLAotCTB4MDAwMDAwNDksCi0JMHg5MDAwMDAwMCwKLQkweDAwMDAwMDQ5LAotCTB4YTAwMDAwMDAsCi0JMHgwMDAwMDA0OSwKLQkweDcwMDAwMDAwLAotCTB4MDAwMDAwNTksCi0JMHg4MDAwMDAwMCwKLQkweDAwMDAwMDU5LAotCTB4OTAwMDAwMDAsCi0JMHgwMDAwMDA1OSwKLQkweGIwMDAwMDAwLAotCTB4MDAwMDAwNTksCi0JMHhjMDAwMDAwMCwKLQkweDAwMDAwMDU5LAotCTB4ZDAwMDAwMDAsCi0JMHgwMDAwMDA1OSwKLQkweGUwMDAwMDAwLAotCTB4MDAwMDAwNTksCi0JMHhiMDAwMDAwMCwKLQkweDAwMDAwMDY5LAotCTB4YzAwMDAwMDAsCi0JMHgwMDAwMDA2OSwKLQkweGQwMDAwMDAwLAotCTB4MDAwMDAwNjksCi0JMHhlMDAwMDAwMCwKLQkweDAwMDAwMDY5LAotCTB4ZjAwMDAwMDAsCi0JMHgwMDAwMDA2OSwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwNmEsCi0JMHgxMDAwMDAwMCwKLQkweDAwMDAwMDZhLAotCTB4MjAwMDAwMDAsCi0JMHgwMDAwMDA2YSwKLQkweDMwMDAwMDAwLAotCTB4MDAwMDAwNmEsCi0JMHg0MDAwMDAwMCwKLQkweDAwMDAwMDZhLAotCTB4NTAwMDAwMDAsCi0JMHgwMDAwMDA2YSwKLQkweDYwMDAwMDAwLAotCTB4MDAwMDAwNmEsCi0JMHg3MDAwMDAwMCwKLQkweDAwMDAwMDZhLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAKLX07Ci0KLWNvbnN0IHUzMiBkb3QxMWxjbl9hdXhfZ2Fpbl9pZHhfdGJsXzVHW10gPSB7Ci0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMSwKLQkweDAwMDIsCi0JMHgwMDAzLAotCTB4MDAwNCwKLQkweDAwODMsCi0JMHgwMDg0LAotCTB4MDA4NSwKLQkweDAwODYsCi0JMHgwMDg3LAotCTB4MDE4NiwKLQkweDAxODcsCi0JMHgwMTg4LAotCTB4MDE4OSwKLQkweDAxOGEsCi0JMHgwMThiLAotCTB4MDE4YywKLQkweDAxOGQsCi0JMHgwMThlLAotCTB4MDE4ZiwKLQkweDAxOTAsCi0JMHgwMTkxLAotCTB4MDE5MiwKLQkweDAxOTMsCi0JMHgwMTk0LAotCTB4MDE5NSwKLQkweDAxOTYsCi0JMHgwMTk3LAotCTB4MDE5OCwKLQkweDAxOTksCi0JMHgwMTlhLAotCTB4MDE5YiwKLQkweDAxOWMsCi0JMHgwMTlkLAotCTB4MDAwMAotfTsKLQotY29uc3QgdTMyIGRvdDExbGNuX2dhaW5fdmFsX3RibF81R1tdID0gewotCTB4ZjcsCi0JMHhmZCwKLQkweDAwLAotCTB4MDQsCi0JMHgwNCwKLQkweDA0LAotCTB4ZjcsCi0JMHhmZCwKLQkweDAwLAotCTB4MDQsCi0JMHgwNCwKLQkweDA0LAotCTB4ZjYsCi0JMHgwMCwKLQkweDBjLAotCTB4MDMsCi0JMHhlYiwKLQkweGZlLAotCTB4MDYsCi0JMHgwYSwKLQkweDEwLAotCTB4MDAsCi0JMHgwMywKLQkweDA2LAotCTB4MDksCi0JMHgwYywKLQkweDBmLAotCTB4MTIsCi0JMHgxNSwKLQkweDE4LAotCTB4MWIsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAzLAotCTB4MDYsCi0JMHgwOSwKLQkweDBjLAotCTB4MGYsCi0JMHgxMiwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDMsCi0JMHgwNiwKLQkweDA5LAotCTB4MGMsCi0JMHgwZiwKLQkweDEyLAotCTB4MTUsCi0JMHgxOCwKLQkweDFiLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMAotfTsKLQotY29uc3QgdTMyIGRvdDExbGNuX2dhaW5faWR4X3RibF81R1tdID0gewotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDEwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgyMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MzAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDQwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgzMDAwMDAwMCwKLQkweDAwMDAwMDA4LAotCTB4NDAwMDAwMDAsCi0JMHgwMDAwMDAwOCwKLQkweDUwMDAwMDAwLAotCTB4MDAwMDAwMDgsCi0JMHg2MDAwMDAwMCwKLQkweDAwMDAwMDA4LAotCTB4NzAwMDAwMDAsCi0JMHgwMDAwMDAwOCwKLQkweDYwMDAwMDAwLAotCTB4MDAwMDAwMTgsCi0JMHg3MDAwMDAwMCwKLQkweDAwMDAwMDE4LAotCTB4ODAwMDAwMDAsCi0JMHgwMDAwMDAxOCwKLQkweDkwMDAwMDAwLAotCTB4MDAwMDAwMTgsCi0JMHhhMDAwMDAwMCwKLQkweDAwMDAwMDE4LAotCTB4YjAwMDAwMDAsCi0JMHgwMDAwMDAxOCwKLQkweGMwMDAwMDAwLAotCTB4MDAwMDAwMTgsCi0JMHhkMDAwMDAwMCwKLQkweDAwMDAwMDE4LAotCTB4ZTAwMDAwMDAsCi0JMHgwMDAwMDAxOCwKLQkweGYwMDAwMDAwLAotCTB4MDAwMDAwMTgsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDE5LAotCTB4MTAwMDAwMDAsCi0JMHgwMDAwMDAxOSwKLQkweDIwMDAwMDAwLAotCTB4MDAwMDAwMTksCi0JMHgzMDAwMDAwMCwKLQkweDAwMDAwMDE5LAotCTB4NDAwMDAwMDAsCi0JMHgwMDAwMDAxOSwKLQkweDUwMDAwMDAwLAotCTB4MDAwMDAwMTksCi0JMHg2MDAwMDAwMCwKLQkweDAwMDAwMDE5LAotCTB4NzAwMDAwMDAsCi0JMHgwMDAwMDAxOSwKLQkweDgwMDAwMDAwLAotCTB4MDAwMDAwMTksCi0JMHg5MDAwMDAwMCwKLQkweDAwMDAwMDE5LAotCTB4YTAwMDAwMDAsCi0JMHgwMDAwMDAxOSwKLQkweGIwMDAwMDAwLAotCTB4MDAwMDAwMTksCi0JMHhjMDAwMDAwMCwKLQkweDAwMDAwMDE5LAotCTB4ZDAwMDAwMDAsCi0JMHgwMDAwMDAxOSwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMAotfTsKLQotY29uc3QgdTMyIGRvdDExbGNuX2dhaW5fdGJsXzVHW10gPSB7Ci0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDQwLAotCTB4MDAwMDAwODAsCi0JMHgwMDAwMDAwMSwKLQkweDAwMDAwMDA1LAotCTB4MDAwMDAwMDksCi0JMHgwMDAwMDAwZCwKLQkweDAwMDAwMDExLAotCTB4MDAwMDAwMTUsCi0JMHgwMDAwMDA1NSwKLQkweDAwMDAwMDk1LAotCTB4MDAwMDAwMTcsCi0JMHgwMDAwMDAxYiwKLQkweDAwMDAwMDViLAotCTB4MDAwMDAwOWIsCi0JMHgwMDAwMDBkYiwKLQkweDAwMDAwMTFiLAotCTB4MDAwMDAxNWIsCi0JMHgwMDAwMDE5YiwKLQkweDAwMDAwNTliLAotCTB4MDAwMDA5OWIsCi0JMHgwMDAwMGQ5YiwKLQkweDAwMDAxMTliLAotCTB4MDAwMDUxOWIsCi0JMHgwMDAwOTE5YiwKLQkweDAwMDBkMTliLAotCTB4MDAwMTExOWIsCi0JMHgwMDAxNTE5YiwKLQkweDAwMDE5MTliLAotCTB4MDAwMWQxOWIsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAKLX07Ci0KLWNvbnN0IHN0cnVjdCBwaHl0YmxfaW5mbyBkb3QxMWxjbnBoeXRibF9yeF9nYWluX2luZm9fcmV2MFtdID0gewotCXsmZG90MTFsY25fZ2Fpbl90YmxfcmV2MCwKLQkgc2l6ZW9mKGRvdDExbGNuX2dhaW5fdGJsX3JldjApIC8gc2l6ZW9mKGRvdDExbGNuX2dhaW5fdGJsX3JldjBbMF0pLCAxOCwKLQkgMCwgMzJ9Ci0JLAotCXsmZG90MTFsY25fYXV4X2dhaW5faWR4X3RibF9yZXYwLAotCSBzaXplb2YoZG90MTFsY25fYXV4X2dhaW5faWR4X3RibF9yZXYwKSAvCi0JIHNpemVvZihkb3QxMWxjbl9hdXhfZ2Fpbl9pZHhfdGJsX3JldjBbMF0pLCAxNCwgMCwgMTZ9Ci0JLAotCXsmZG90MTFsY25fZ2Fpbl9pZHhfdGJsX3JldjAsCi0JIHNpemVvZihkb3QxMWxjbl9nYWluX2lkeF90YmxfcmV2MCkgLwotCSBzaXplb2YoZG90MTFsY25fZ2Fpbl9pZHhfdGJsX3JldjBbMF0pLCAxMywgMCwgMzJ9Ci0JLAotfTsKLQotY29uc3Qgc3RydWN0IHBoeXRibF9pbmZvIGRvdDExbGNucGh5dGJsX3J4X2dhaW5faW5mb19yZXYxW10gPSB7Ci0JeyZkb3QxMWxjbl9nYWluX3RibF9yZXYxLAotCSBzaXplb2YoZG90MTFsY25fZ2Fpbl90YmxfcmV2MSkgLyBzaXplb2YoZG90MTFsY25fZ2Fpbl90YmxfcmV2MVswXSksIDE4LAotCSAwLCAzMn0KLQksCi0JeyZkb3QxMWxjbl9hdXhfZ2Fpbl9pZHhfdGJsX3JldjAsCi0JIHNpemVvZihkb3QxMWxjbl9hdXhfZ2Fpbl9pZHhfdGJsX3JldjApIC8KLQkgc2l6ZW9mKGRvdDExbGNuX2F1eF9nYWluX2lkeF90YmxfcmV2MFswXSksIDE0LCAwLCAxNn0KLQksCi0JeyZkb3QxMWxjbl9nYWluX2lkeF90YmxfcmV2MCwKLQkgc2l6ZW9mKGRvdDExbGNuX2dhaW5faWR4X3RibF9yZXYwKSAvCi0JIHNpemVvZihkb3QxMWxjbl9nYWluX2lkeF90YmxfcmV2MFswXSksIDEzLCAwLCAzMn0KLQksCi19OwotCi1jb25zdCBzdHJ1Y3QgcGh5dGJsX2luZm8gZG90MTFsY25waHl0YmxfcnhfZ2Fpbl9pbmZvXzJHX3JldjJbXSA9IHsKLQl7JmRvdDExbGNuX2dhaW5fdGJsXzJHLAotCSBzaXplb2YoZG90MTFsY25fZ2Fpbl90YmxfMkcpIC8gc2l6ZW9mKGRvdDExbGNuX2dhaW5fdGJsXzJHWzBdKSwgMTgsIDAsCi0JIDMyfQotCSwKLQl7JmRvdDExbGNuX2F1eF9nYWluX2lkeF90YmxfMkcsCi0JIHNpemVvZihkb3QxMWxjbl9hdXhfZ2Fpbl9pZHhfdGJsXzJHKSAvCi0JIHNpemVvZihkb3QxMWxjbl9hdXhfZ2Fpbl9pZHhfdGJsXzJHWzBdKSwgMTQsIDAsIDE2fQotCSwKLQl7JmRvdDExbGNuX2dhaW5faWR4X3RibF8yRywKLQkgc2l6ZW9mKGRvdDExbGNuX2dhaW5faWR4X3RibF8yRykgLyBzaXplb2YoZG90MTFsY25fZ2Fpbl9pZHhfdGJsXzJHWzBdKSwKLQkgMTMsIDAsIDMyfQotCSwKLQl7JmRvdDExbGNuX2dhaW5fdmFsX3RibF8yRywKLQkgc2l6ZW9mKGRvdDExbGNuX2dhaW5fdmFsX3RibF8yRykgLyBzaXplb2YoZG90MTFsY25fZ2Fpbl92YWxfdGJsXzJHWzBdKSwKLQkgMTcsIDAsIDh9Ci19OwotCi1jb25zdCBzdHJ1Y3QgcGh5dGJsX2luZm8gZG90MTFsY25waHl0YmxfcnhfZ2Fpbl9pbmZvXzVHX3JldjJbXSA9IHsKLQl7JmRvdDExbGNuX2dhaW5fdGJsXzVHLAotCSBzaXplb2YoZG90MTFsY25fZ2Fpbl90YmxfNUcpIC8gc2l6ZW9mKGRvdDExbGNuX2dhaW5fdGJsXzVHWzBdKSwgMTgsIDAsCi0JIDMyfQotCSwKLQl7JmRvdDExbGNuX2F1eF9nYWluX2lkeF90YmxfNUcsCi0JIHNpemVvZihkb3QxMWxjbl9hdXhfZ2Fpbl9pZHhfdGJsXzVHKSAvCi0JIHNpemVvZihkb3QxMWxjbl9hdXhfZ2Fpbl9pZHhfdGJsXzVHWzBdKSwgMTQsIDAsIDE2fQotCSwKLQl7JmRvdDExbGNuX2dhaW5faWR4X3RibF81RywKLQkgc2l6ZW9mKGRvdDExbGNuX2dhaW5faWR4X3RibF81RykgLyBzaXplb2YoZG90MTFsY25fZ2Fpbl9pZHhfdGJsXzVHWzBdKSwKLQkgMTMsIDAsIDMyfQotCSwKLQl7JmRvdDExbGNuX2dhaW5fdmFsX3RibF81RywKLQkgc2l6ZW9mKGRvdDExbGNuX2dhaW5fdmFsX3RibF81RykgLyBzaXplb2YoZG90MTFsY25fZ2Fpbl92YWxfdGJsXzVHWzBdKSwKLQkgMTcsIDAsIDh9Ci19OwotCi1jb25zdCBzdHJ1Y3QgcGh5dGJsX2luZm8gZG90MTFsY25waHl0YmxfcnhfZ2Fpbl9pbmZvX2V4dGxuYV8yR19yZXYyW10gPSB7Ci0JeyZkb3QxMWxjbl9nYWluX3RibF9leHRsbmFfMkcsCi0JIHNpemVvZihkb3QxMWxjbl9nYWluX3RibF9leHRsbmFfMkcpIC8KLQkgc2l6ZW9mKGRvdDExbGNuX2dhaW5fdGJsX2V4dGxuYV8yR1swXSksIDE4LCAwLCAzMn0KLQksCi0JeyZkb3QxMWxjbl9hdXhfZ2Fpbl9pZHhfdGJsX2V4dGxuYV8yRywKLQkgc2l6ZW9mKGRvdDExbGNuX2F1eF9nYWluX2lkeF90YmxfZXh0bG5hXzJHKSAvCi0JIHNpemVvZihkb3QxMWxjbl9hdXhfZ2Fpbl9pZHhfdGJsX2V4dGxuYV8yR1swXSksIDE0LCAwLCAxNn0KLQksCi0JeyZkb3QxMWxjbl9nYWluX2lkeF90YmxfZXh0bG5hXzJHLAotCSBzaXplb2YoZG90MTFsY25fZ2Fpbl9pZHhfdGJsX2V4dGxuYV8yRykgLwotCSBzaXplb2YoZG90MTFsY25fZ2Fpbl9pZHhfdGJsX2V4dGxuYV8yR1swXSksIDEzLCAwLCAzMn0KLQksCi0JeyZkb3QxMWxjbl9nYWluX3ZhbF90YmxfZXh0bG5hXzJHLAotCSBzaXplb2YoZG90MTFsY25fZ2Fpbl92YWxfdGJsX2V4dGxuYV8yRykgLwotCSBzaXplb2YoZG90MTFsY25fZ2Fpbl92YWxfdGJsX2V4dGxuYV8yR1swXSksIDE3LCAwLCA4fQotfTsKLQotY29uc3Qgc3RydWN0IHBoeXRibF9pbmZvIGRvdDExbGNucGh5dGJsX3J4X2dhaW5faW5mb19leHRsbmFfNUdfcmV2MltdID0gewotCXsmZG90MTFsY25fZ2Fpbl90YmxfNUcsCi0JIHNpemVvZihkb3QxMWxjbl9nYWluX3RibF81RykgLyBzaXplb2YoZG90MTFsY25fZ2Fpbl90YmxfNUdbMF0pLCAxOCwgMCwKLQkgMzJ9Ci0JLAotCXsmZG90MTFsY25fYXV4X2dhaW5faWR4X3RibF81RywKLQkgc2l6ZW9mKGRvdDExbGNuX2F1eF9nYWluX2lkeF90YmxfNUcpIC8KLQkgc2l6ZW9mKGRvdDExbGNuX2F1eF9nYWluX2lkeF90YmxfNUdbMF0pLCAxNCwgMCwgMTZ9Ci0JLAotCXsmZG90MTFsY25fZ2Fpbl9pZHhfdGJsXzVHLAotCSBzaXplb2YoZG90MTFsY25fZ2Fpbl9pZHhfdGJsXzVHKSAvIHNpemVvZihkb3QxMWxjbl9nYWluX2lkeF90YmxfNUdbMF0pLAotCSAxMywgMCwgMzJ9Ci0JLAotCXsmZG90MTFsY25fZ2Fpbl92YWxfdGJsXzVHLAotCSBzaXplb2YoZG90MTFsY25fZ2Fpbl92YWxfdGJsXzVHKSAvIHNpemVvZihkb3QxMWxjbl9nYWluX3ZhbF90YmxfNUdbMF0pLAotCSAxNywgMCwgOH0KLX07Ci0KLWNvbnN0IHUzMiBkb3QxMWxjbnBoeXRibF9yeF9nYWluX2luZm9fc3pfcmV2MCA9Ci0Jc2l6ZW9mKGRvdDExbGNucGh5dGJsX3J4X2dhaW5faW5mb19yZXYwKSAvCi0Jc2l6ZW9mKGRvdDExbGNucGh5dGJsX3J4X2dhaW5faW5mb19yZXYwWzBdKTsKLQotY29uc3QgdTMyIGRvdDExbGNucGh5dGJsX3J4X2dhaW5faW5mb19zel9yZXYxID0KLQlzaXplb2YoZG90MTFsY25waHl0YmxfcnhfZ2Fpbl9pbmZvX3JldjEpIC8KLQlzaXplb2YoZG90MTFsY25waHl0YmxfcnhfZ2Fpbl9pbmZvX3JldjFbMF0pOwotCi1jb25zdCB1MzIgZG90MTFsY25waHl0YmxfcnhfZ2Fpbl9pbmZvXzJHX3JldjJfc3ogPQotCXNpemVvZihkb3QxMWxjbnBoeXRibF9yeF9nYWluX2luZm9fMkdfcmV2MikgLwotCXNpemVvZihkb3QxMWxjbnBoeXRibF9yeF9nYWluX2luZm9fMkdfcmV2MlswXSk7Ci0KLWNvbnN0IHUzMiBkb3QxMWxjbnBoeXRibF9yeF9nYWluX2luZm9fNUdfcmV2Ml9zeiA9Ci0Jc2l6ZW9mKGRvdDExbGNucGh5dGJsX3J4X2dhaW5faW5mb181R19yZXYyKSAvCi0Jc2l6ZW9mKGRvdDExbGNucGh5dGJsX3J4X2dhaW5faW5mb181R19yZXYyWzBdKTsKLQotY29uc3QgdTE2IGRvdDExbGNuX21pbl9zaWdfc3FfdGJsX3JldjBbXSA9IHsKLQkweDAxNGQsCi0JMHgwMTRkLAotCTB4MDE0ZCwKLQkweDAxNGQsCi0JMHgwMTRkLAotCTB4MDE0ZCwKLQkweDAxNGQsCi0JMHgwMTRkLAotCTB4MDE0ZCwKLQkweDAxNGQsCi0JMHgwMTRkLAotCTB4MDE0ZCwKLQkweDAxNGQsCi0JMHgwMTRkLAotCTB4MDE0ZCwKLQkweDAxNGQsCi0JMHgwMTRkLAotCTB4MDE0ZCwKLQkweDAxNGQsCi0JMHgwMTRkLAotCTB4MDE0ZCwKLQkweDAxNGQsCi0JMHgwMTRkLAotCTB4MDE0ZCwKLQkweDAxNGQsCi0JMHgwMTRkLAotCTB4MDE0ZCwKLQkweDAxNGQsCi0JMHgwMTRkLAotCTB4MDE0ZCwKLQkweDAxNGQsCi0JMHgwMTRkLAotCTB4MDE0ZCwKLQkweDAxNGQsCi0JMHgwMTRkLAotCTB4MDE0ZCwKLQkweDAxNGQsCi0JMHgwMTRkLAotCTB4MDE0ZCwKLQkweDAxNGQsCi0JMHgwMTRkLAotCTB4MDE0ZCwKLQkweDAxNGQsCi0JMHgwMTRkLAotCTB4MDE0ZCwKLQkweDAxNGQsCi0JMHgwMTRkLAotCTB4MDE0ZCwKLQkweDAxNGQsCi0JMHgwMTRkLAotCTB4MDE0ZCwKLQkweDAxNGQsCi0JMHgwMTRkLAotCTB4MDE0ZCwKLQkweDAxNGQsCi0JMHgwMTRkLAotCTB4MDE0ZCwKLQkweDAxNGQsCi0JMHgwMTRkLAotCTB4MDE0ZCwKLQkweDAxNGQsCi0JMHgwMTRkLAotCTB4MDE0ZCwKLQkweDAxNGQsCi19OwotCi1jb25zdCB1MTYgZG90MTFsY25fbm9pc2Vfc2NhbGVfdGJsX3JldjBbXSA9IHsKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi19OwotCi1jb25zdCB1MzIgZG90MTFsY25fZmx0cl9jdHJsX3RibF9yZXYwW10gPSB7Ci0JMHgwMDAxNDFmOCwKLQkweDAwMDAyMWY4LAotCTB4MDAwMDIxZmIsCi0JMHgwMDAwNDFmYiwKLQkweDAwMDFmZTRiLAotCTB4MDAwMDIxN2IsCi0JMHgwMDAwMjEzMywKLQkweDAwMDA0MGViLAotCTB4MDAwMWZlYTMsCi0JMHgwMDAwMDI0YiwKLX07Ci0KLWNvbnN0IHUzMiBkb3QxMWxjbl9wc19jdHJsX3RibF9yZXYwW10gPSB7Ci0JMHgwMDEwMDAwMSwKLQkweDAwMjAwMDEwLAotCTB4MDAzMDAwMDEsCi0JMHgwMDQwMDAxMCwKLQkweDAwNTAwMDIyLAotCTB4MDA2MDAxMjIsCi0JMHgwMDcwMDIyMiwKLQkweDAwODAwMzIyLAotCTB4MDA5MDA0MjIsCi0JMHgwMGEwMDUyMiwKLQkweDAwYjAwNjIyLAotCTB4MDBjMDA3MjIsCi0JMHgwMGQwMDgyMiwKLQkweDAwZjAwOTIyLAotCTB4MDAxMDBhMjIsCi0JMHgwMDIwMGIyMiwKLQkweDAwMzAwYzIyLAotCTB4MDA0MDBkMjIsCi0JMHgwMDUwMGUyMiwKLQkweDAwNjAwZjIyLAotfTsKLQotY29uc3QgdTE2IGRvdDExbGNuX3N3X2N0cmxfdGJsXzQzMTNfZXBhX3JldjBfY29tYm9bXSA9IHsKLQkweDAwMDcsCi0JMHgwMDA1LAotCTB4MDAwNiwKLQkweDAwMDQsCi0JMHgwMDA3LAotCTB4MDAwNSwKLQkweDAwMDYsCi0JMHgwMDA0LAotCTB4MDAwNywKLQkweDAwMDUsCi0JMHgwMDA2LAotCTB4MDAwNCwKLQkweDAwMDcsCi0JMHgwMDA1LAotCTB4MDAwNiwKLQkweDAwMDQsCi0JMHgwMDBiLAotCTB4MDAwYiwKLQkweDAwMGEsCi0JMHgwMDBhLAotCTB4MDAwYiwKLQkweDAwMGIsCi0JMHgwMDBhLAotCTB4MDAwYSwKLQkweDAwMGIsCi0JMHgwMDBiLAotCTB4MDAwYSwKLQkweDAwMGEsCi0JMHgwMDBiLAotCTB4MDAwYiwKLQkweDAwMGEsCi0JMHgwMDBhLAotCTB4MDAwNywKLQkweDAwMDUsCi0JMHgwMDA2LAotCTB4MDAwNCwKLQkweDAwMDcsCi0JMHgwMDA1LAotCTB4MDAwNiwKLQkweDAwMDQsCi0JMHgwMDA3LAotCTB4MDAwNSwKLQkweDAwMDYsCi0JMHgwMDA0LAotCTB4MDAwNywKLQkweDAwMDUsCi0JMHgwMDA2LAotCTB4MDAwNCwKLQkweDAwMGIsCi0JMHgwMDBiLAotCTB4MDAwYSwKLQkweDAwMGEsCi0JMHgwMDBiLAotCTB4MDAwYiwKLQkweDAwMGEsCi0JMHgwMDBhLAotCTB4MDAwYiwKLQkweDAwMGIsCi0JMHgwMDBhLAotCTB4MDAwYSwKLQkweDAwMGIsCi0JMHgwMDBiLAotCTB4MDAwYSwKLQkweDAwMGEsCi0KLX07Ci0KLWNvbnN0IHUxNiBkb3QxMWxjbl9zd19jdHJsX3RibF80MzEzX2J0X2VwYV9wMjUwX3JldjBbXSA9IHsKLQkweDAwMDcsCi0JMHgwMDA1LAotCTB4MDAwMiwKLQkweDAwMDAsCi0JMHgwMDA3LAotCTB4MDAwNSwKLQkweDAwMDIsCi0JMHgwMDAwLAotCTB4MDAwNywKLQkweDAwMDUsCi0JMHgwMDAyLAotCTB4MDAwMCwKLQkweDAwMDcsCi0JMHgwMDA1LAotCTB4MDAwMiwKLQkweDAwMDAsCi0JMHgwMDA3LAotCTB4MDAwNywKLQkweDAwMDIsCi0JMHgwMDAyLAotCTB4MDAwNywKLQkweDAwMDcsCi0JMHgwMDAyLAotCTB4MDAwMiwKLQkweDAwMDcsCi0JMHgwMDA3LAotCTB4MDAwMiwKLQkweDAwMDIsCi0JMHgwMDA3LAotCTB4MDAwNywKLQkweDAwMDIsCi0JMHgwMDAyLAotCTB4MDAwNywKLQkweDAwMDUsCi0JMHgwMDAyLAotCTB4MDAwMCwKLQkweDAwMDcsCi0JMHgwMDA1LAotCTB4MDAwMiwKLQkweDAwMDAsCi0JMHgwMDA3LAotCTB4MDAwNSwKLQkweDAwMDIsCi0JMHgwMDAwLAotCTB4MDAwNywKLQkweDAwMDUsCi0JMHgwMDAyLAotCTB4MDAwMCwKLQkweDAwMDcsCi0JMHgwMDA3LAotCTB4MDAwMiwKLQkweDAwMDIsCi0JMHgwMDA3LAotCTB4MDAwNywKLQkweDAwMDIsCi0JMHgwMDAyLAotCTB4MDAwNywKLQkweDAwMDcsCi0JMHgwMDAyLAotCTB4MDAwMiwKLQkweDAwMDcsCi0JMHgwMDA3LAotCTB4MDAwMiwKLQkweDAwMDIsCi19OwotCi1jb25zdCB1MTYgZG90MTFsY25fc3dfY3RybF90YmxfNDMxM19lcGFfcmV2MFtdID0gewotCTB4MDAwMiwKLQkweDAwMDgsCi0JMHgwMDA0LAotCTB4MDAwMSwKLQkweDAwMDIsCi0JMHgwMDA4LAotCTB4MDAwNCwKLQkweDAwMDEsCi0JMHgwMDAyLAotCTB4MDAwOCwKLQkweDAwMDQsCi0JMHgwMDAxLAotCTB4MDAwMiwKLQkweDAwMDgsCi0JMHgwMDA0LAotCTB4MDAwMSwKLQkweDAwMDIsCi0JMHgwMDA4LAotCTB4MDAwNCwKLQkweDAwMDEsCi0JMHgwMDAyLAotCTB4MDAwOCwKLQkweDAwMDQsCi0JMHgwMDAxLAotCTB4MDAwMiwKLQkweDAwMDgsCi0JMHgwMDA0LAotCTB4MDAwMSwKLQkweDAwMDIsCi0JMHgwMDA4LAotCTB4MDAwNCwKLQkweDAwMDEsCi0JMHgwMDAyLAotCTB4MDAwOCwKLQkweDAwMDQsCi0JMHgwMDAxLAotCTB4MDAwMiwKLQkweDAwMDgsCi0JMHgwMDA0LAotCTB4MDAwMSwKLQkweDAwMDIsCi0JMHgwMDA4LAotCTB4MDAwNCwKLQkweDAwMDEsCi0JMHgwMDAyLAotCTB4MDAwOCwKLQkweDAwMDQsCi0JMHgwMDAxLAotCTB4MDAwMiwKLQkweDAwMDgsCi0JMHgwMDA0LAotCTB4MDAwMSwKLQkweDAwMDIsCi0JMHgwMDA4LAotCTB4MDAwNCwKLQkweDAwMDEsCi0JMHgwMDAyLAotCTB4MDAwOCwKLQkweDAwMDQsCi0JMHgwMDAxLAotCTB4MDAwMiwKLQkweDAwMDgsCi0JMHgwMDA0LAotCTB4MDAwMSwKLX07Ci0KLWNvbnN0IHUxNiBkb3QxMWxjbl9zd19jdHJsX3RibF80MzEzX3JldjBbXSA9IHsKLQkweDAwMGEsCi0JMHgwMDA5LAotCTB4MDAwNiwKLQkweDAwMDUsCi0JMHgwMDBhLAotCTB4MDAwOSwKLQkweDAwMDYsCi0JMHgwMDA1LAotCTB4MDAwYSwKLQkweDAwMDksCi0JMHgwMDA2LAotCTB4MDAwNSwKLQkweDAwMGEsCi0JMHgwMDA5LAotCTB4MDAwNiwKLQkweDAwMDUsCi0JMHgwMDBhLAotCTB4MDAwOSwKLQkweDAwMDYsCi0JMHgwMDA1LAotCTB4MDAwYSwKLQkweDAwMDksCi0JMHgwMDA2LAotCTB4MDAwNSwKLQkweDAwMGEsCi0JMHgwMDA5LAotCTB4MDAwNiwKLQkweDAwMDUsCi0JMHgwMDBhLAotCTB4MDAwOSwKLQkweDAwMDYsCi0JMHgwMDA1LAotCTB4MDAwYSwKLQkweDAwMDksCi0JMHgwMDA2LAotCTB4MDAwNSwKLQkweDAwMGEsCi0JMHgwMDA5LAotCTB4MDAwNiwKLQkweDAwMDUsCi0JMHgwMDBhLAotCTB4MDAwOSwKLQkweDAwMDYsCi0JMHgwMDA1LAotCTB4MDAwYSwKLQkweDAwMDksCi0JMHgwMDA2LAotCTB4MDAwNSwKLQkweDAwMGEsCi0JMHgwMDA5LAotCTB4MDAwNiwKLQkweDAwMDUsCi0JMHgwMDBhLAotCTB4MDAwOSwKLQkweDAwMDYsCi0JMHgwMDA1LAotCTB4MDAwYSwKLQkweDAwMDksCi0JMHgwMDA2LAotCTB4MDAwNSwKLQkweDAwMGEsCi0JMHgwMDA5LAotCTB4MDAwNiwKLQkweDAwMDUsCi19OwotCi1jb25zdCB1MTYgZG90MTFsY25fc3dfY3RybF90YmxfcmV2MFtdID0gewotCTB4MDAwNCwKLQkweDAwMDQsCi0JMHgwMDAyLAotCTB4MDAwMiwKLQkweDAwMDQsCi0JMHgwMDA0LAotCTB4MDAwMiwKLQkweDAwMDIsCi0JMHgwMDA0LAotCTB4MDAwNCwKLQkweDAwMDIsCi0JMHgwMDAyLAotCTB4MDAwNCwKLQkweDAwMDQsCi0JMHgwMDAyLAotCTB4MDAwMiwKLQkweDAwMDQsCi0JMHgwMDA0LAotCTB4MDAwMiwKLQkweDAwMDIsCi0JMHgwMDA0LAotCTB4MDAwNCwKLQkweDAwMDIsCi0JMHgwMDAyLAotCTB4MDAwNCwKLQkweDAwMDQsCi0JMHgwMDAyLAotCTB4MDAwMiwKLQkweDAwMDQsCi0JMHgwMDA0LAotCTB4MDAwMiwKLQkweDAwMDIsCi0JMHgwMDA0LAotCTB4MDAwNCwKLQkweDAwMDIsCi0JMHgwMDAyLAotCTB4MDAwNCwKLQkweDAwMDQsCi0JMHgwMDAyLAotCTB4MDAwMiwKLQkweDAwMDQsCi0JMHgwMDA0LAotCTB4MDAwMiwKLQkweDAwMDIsCi0JMHgwMDA0LAotCTB4MDAwNCwKLQkweDAwMDIsCi0JMHgwMDAyLAotCTB4MDAwNCwKLQkweDAwMDQsCi0JMHgwMDAyLAotCTB4MDAwMiwKLQkweDAwMDQsCi0JMHgwMDA0LAotCTB4MDAwMiwKLQkweDAwMDIsCi0JMHgwMDA0LAotCTB4MDAwNCwKLQkweDAwMDIsCi0JMHgwMDAyLAotCTB4MDAwNCwKLQkweDAwMDQsCi0JMHgwMDAyLAotCTB4MDAwMiwKLX07Ci0KLWNvbnN0IHU4IGRvdDExbGNuX25mX3RhYmxlX3JldjBbXSA9IHsKLQkweDVmLAotCTB4MzYsCi0JMHgyOSwKLQkweDFmLAotCTB4NWYsCi0JMHgzNiwKLQkweDI5LAotCTB4MWYsCi0JMHg1ZiwKLQkweDM2LAotCTB4MjksCi0JMHgxZiwKLQkweDVmLAotCTB4MzYsCi0JMHgyOSwKLQkweDFmLAotfTsKLQotY29uc3QgdTggZG90MTFsY25fZ2Fpbl92YWxfdGJsX3JldjBbXSA9IHsKLQkweDA5LAotCTB4MGYsCi0JMHgxNCwKLQkweDE4LAotCTB4ZmUsCi0JMHgwNywKLQkweDBiLAotCTB4MGYsCi0JMHhmYiwKLQkweGZlLAotCTB4MDEsCi0JMHgwNSwKLQkweDA4LAotCTB4MGIsCi0JMHgwZSwKLQkweDExLAotCTB4MTQsCi0JMHgxNywKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDMsCi0JMHgwNiwKLQkweDA5LAotCTB4MGMsCi0JMHgwZiwKLQkweDEyLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMywKLQkweDA2LAotCTB4MDksCi0JMHgwYywKLQkweDBmLAotCTB4MTIsCi0JMHgxNSwKLQkweDE4LAotCTB4MWIsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMywKLQkweGViLAotCTB4MDAsCi0JMHgwMCwKLX07Ci0KLWNvbnN0IHU4IGRvdDExbGNuX3NwdXJfdGJsX3JldjBbXSA9IHsKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAyLAotCTB4MDMsCi0JMHgwMSwKLQkweDAzLAotCTB4MDIsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDIsCi0JMHgwMywKLQkweDAxLAotCTB4MDMsCi0JMHgwMiwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi0JMHgwMSwKLQkweDAxLAotCTB4MDEsCi19OwotCi1jb25zdCB1MTYgZG90MTFsY25fdW5zdXBfbWNzX3RibF9yZXYwW10gPSB7Ci0JMHgwMDFhLAotCTB4MDAzNCwKLQkweDAwNGUsCi0JMHgwMDY4LAotCTB4MDA5YywKLQkweDAwZDAsCi0JMHgwMGVhLAotCTB4MDEwNCwKLQkweDAwMzQsCi0JMHgwMDY4LAotCTB4MDA5YywKLQkweDAwZDAsCi0JMHgwMTM4LAotCTB4MDFhMCwKLQkweDAxZDQsCi0JMHgwMjA4LAotCTB4MDA0ZSwKLQkweDAwOWMsCi0JMHgwMGVhLAotCTB4MDEzOCwKLQkweDAxZDQsCi0JMHgwMjcwLAotCTB4MDJiZSwKLQkweDAzMGMsCi0JMHgwMDY4LAotCTB4MDBkMCwKLQkweDAxMzgsCi0JMHgwMWEwLAotCTB4MDI3MCwKLQkweDAzNDAsCi0JMHgwM2E4LAotCTB4MDQxMCwKLQkweDAwMTgsCi0JMHgwMDljLAotCTB4MDBkMCwKLQkweDAxMDQsCi0JMHgwMGVhLAotCTB4MDEzOCwKLQkweDAxODYsCi0JMHgwMGQwLAotCTB4MDEwNCwKLQkweDAxMDQsCi0JMHgwMTM4LAotCTB4MDE2YywKLQkweDAxNmMsCi0JMHgwMWEwLAotCTB4MDEzOCwKLQkweDAxODYsCi0JMHgwMTg2LAotCTB4MDFkNCwKLQkweDAyMjIsCi0JMHgwMjIyLAotCTB4MDI3MCwKLQkweDAxMDQsCi0JMHgwMTM4LAotCTB4MDE2YywKLQkweDAxMzgsCi0JMHgwMTZjLAotCTB4MDFhMCwKLQkweDAxZDQsCi0JMHgwMWEwLAotCTB4MDFkNCwKLQkweDAyMDgsCi0JMHgwMjA4LAotCTB4MDIzYywKLQkweDAxODYsCi0JMHgwMWQ0LAotCTB4MDIyMiwKLQkweDAxZDQsCi0JMHgwMjIyLAotCTB4MDI3MCwKLQkweDAyYmUsCi0JMHgwMjcwLAotCTB4MDJiZSwKLQkweDAzMGMsCi0JMHgwMzBjLAotCTB4MDM1YSwKLQkweDAwMzYsCi0JMHgwMDZjLAotCTB4MDBhMiwKLQkweDAwZDgsCi0JMHgwMTQ0LAotCTB4MDFiMCwKLQkweDAxZTYsCi0JMHgwMjFjLAotCTB4MDA2YywKLQkweDAwZDgsCi0JMHgwMTQ0LAotCTB4MDFiMCwKLQkweDAyODgsCi0JMHgwMzYwLAotCTB4MDNjYywKLQkweDA0MzgsCi0JMHgwMGEyLAotCTB4MDE0NCwKLQkweDAxZTYsCi0JMHgwMjg4LAotCTB4MDNjYywKLQkweDA1MTAsCi0JMHgwNWIyLAotCTB4MDY1NCwKLQkweDAwZDgsCi0JMHgwMWIwLAotCTB4MDI4OCwKLQkweDAzNjAsCi0JMHgwNTEwLAotCTB4MDZjMCwKLQkweDA3OTgsCi0JMHgwODcwLAotCTB4MDAxOCwKLQkweDAxNDQsCi0JMHgwMWIwLAotCTB4MDIxYywKLQkweDAxZTYsCi0JMHgwMjg4LAotCTB4MDMyYSwKLQkweDAxYjAsCi0JMHgwMjFjLAotCTB4MDIxYywKLQkweDAyODgsCi0JMHgwMmY0LAotCTB4MDJmNCwKLQkweDAzNjAsCi0JMHgwMjg4LAotCTB4MDMyYSwKLQkweDAzMmEsCi0JMHgwM2NjLAotCTB4MDQ2ZSwKLQkweDA0NmUsCi0JMHgwNTEwLAotCTB4MDIxYywKLQkweDAyODgsCi0JMHgwMmY0LAotCTB4MDI4OCwKLQkweDAyZjQsCi0JMHgwMzYwLAotCTB4MDNjYywKLQkweDAzNjAsCi0JMHgwM2NjLAotCTB4MDQzOCwKLQkweDA0MzgsCi0JMHgwNGE0LAotCTB4MDMyYSwKLQkweDAzY2MsCi0JMHgwNDZlLAotCTB4MDNjYywKLQkweDA0NmUsCi0JMHgwNTEwLAotCTB4MDViMiwKLQkweDA1MTAsCi0JMHgwNWIyLAotCTB4MDY1NCwKLQkweDA2NTQsCi0JMHgwNmY2LAotfTsKLQotY29uc3QgdTE2IGRvdDExbGNuX2lxX2xvY2FsX3RibF9yZXYwW10gPSB7Ci0JMHgwMjAwLAotCTB4MDMwMCwKLQkweDA0MDAsCi0JMHgwNjAwLAotCTB4MDgwMCwKLQkweDBiMDAsCi0JMHgxMDAwLAotCTB4MTAwMSwKLQkweDEwMDIsCi0JMHgxMDAzLAotCTB4MTAwNCwKLQkweDEwMDUsCi0JMHgxMDA2LAotCTB4MTAwNywKLQkweDE3MDcsCi0JMHgyMDA3LAotCTB4MmQwNywKLQkweDQwMDcsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAyMDAsCi0JMHgwMzAwLAotCTB4MDQwMCwKLQkweDA2MDAsCi0JMHgwODAwLAotCTB4MGIwMCwKLQkweDEwMDAsCi0JMHgxMDAxLAotCTB4MTAwMiwKLQkweDEwMDMsCi0JMHgxMDA0LAotCTB4MTAwNSwKLQkweDEwMDYsCi0JMHgxMDA3LAotCTB4MTcwNywKLQkweDIwMDcsCi0JMHgyZDA3LAotCTB4NDAwNywKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHg0MDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi19OwotCi1jb25zdCB1MzIgZG90MTFsY25fcGFwZF9jb21wZGVsdGFfdGJsX3JldjBbXSA9IHsKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotCTB4MDAwODAwMDAsCi0JMHgwMDA4MDAwMCwKLQkweDAwMDgwMDAwLAotfTsKLQotY29uc3Qgc3RydWN0IHBoeXRibF9pbmZvIGRvdDExbGNucGh5dGJsX2luZm9fcmV2MFtdID0gewotCXsmZG90MTFsY25fbWluX3NpZ19zcV90YmxfcmV2MCwKLQkgc2l6ZW9mKGRvdDExbGNuX21pbl9zaWdfc3FfdGJsX3JldjApIC8KLQkgc2l6ZW9mKGRvdDExbGNuX21pbl9zaWdfc3FfdGJsX3JldjBbMF0pLCAyLCAwLCAxNn0KLQksCi0JeyZkb3QxMWxjbl9ub2lzZV9zY2FsZV90YmxfcmV2MCwKLQkgc2l6ZW9mKGRvdDExbGNuX25vaXNlX3NjYWxlX3RibF9yZXYwKSAvCi0JIHNpemVvZihkb3QxMWxjbl9ub2lzZV9zY2FsZV90YmxfcmV2MFswXSksIDEsIDAsIDE2fQotCSwKLQl7JmRvdDExbGNuX2ZsdHJfY3RybF90YmxfcmV2MCwKLQkgc2l6ZW9mKGRvdDExbGNuX2ZsdHJfY3RybF90YmxfcmV2MCkgLwotCSBzaXplb2YoZG90MTFsY25fZmx0cl9jdHJsX3RibF9yZXYwWzBdKSwgMTEsIDAsIDMyfQotCSwKLQl7JmRvdDExbGNuX3BzX2N0cmxfdGJsX3JldjAsCi0JIHNpemVvZihkb3QxMWxjbl9wc19jdHJsX3RibF9yZXYwKSAvCi0JIHNpemVvZihkb3QxMWxjbl9wc19jdHJsX3RibF9yZXYwWzBdKSwgMTIsIDAsIDMyfQotCSwKLQl7JmRvdDExbGNuX2dhaW5faWR4X3RibF9yZXYwLAotCSBzaXplb2YoZG90MTFsY25fZ2Fpbl9pZHhfdGJsX3JldjApIC8KLQkgc2l6ZW9mKGRvdDExbGNuX2dhaW5faWR4X3RibF9yZXYwWzBdKSwgMTMsIDAsIDMyfQotCSwKLQl7JmRvdDExbGNuX2F1eF9nYWluX2lkeF90YmxfcmV2MCwKLQkgc2l6ZW9mKGRvdDExbGNuX2F1eF9nYWluX2lkeF90YmxfcmV2MCkgLwotCSBzaXplb2YoZG90MTFsY25fYXV4X2dhaW5faWR4X3RibF9yZXYwWzBdKSwgMTQsIDAsIDE2fQotCSwKLQl7JmRvdDExbGNuX3N3X2N0cmxfdGJsX3JldjAsCi0JIHNpemVvZihkb3QxMWxjbl9zd19jdHJsX3RibF9yZXYwKSAvCi0JIHNpemVvZihkb3QxMWxjbl9zd19jdHJsX3RibF9yZXYwWzBdKSwgMTUsIDAsIDE2fQotCSwKLQl7JmRvdDExbGNuX25mX3RhYmxlX3JldjAsCi0JIHNpemVvZihkb3QxMWxjbl9uZl90YWJsZV9yZXYwKSAvIHNpemVvZihkb3QxMWxjbl9uZl90YWJsZV9yZXYwWzBdKSwgMTYsCi0JIDAsIDh9Ci0JLAotCXsmZG90MTFsY25fZ2Fpbl92YWxfdGJsX3JldjAsCi0JIHNpemVvZihkb3QxMWxjbl9nYWluX3ZhbF90YmxfcmV2MCkgLwotCSBzaXplb2YoZG90MTFsY25fZ2Fpbl92YWxfdGJsX3JldjBbMF0pLCAxNywgMCwgOH0KLQksCi0JeyZkb3QxMWxjbl9nYWluX3RibF9yZXYwLAotCSBzaXplb2YoZG90MTFsY25fZ2Fpbl90YmxfcmV2MCkgLyBzaXplb2YoZG90MTFsY25fZ2Fpbl90YmxfcmV2MFswXSksIDE4LAotCSAwLCAzMn0KLQksCi0JeyZkb3QxMWxjbl9zcHVyX3RibF9yZXYwLAotCSBzaXplb2YoZG90MTFsY25fc3B1cl90YmxfcmV2MCkgLyBzaXplb2YoZG90MTFsY25fc3B1cl90YmxfcmV2MFswXSksIDIwLAotCSAwLCA4fQotCSwKLQl7JmRvdDExbGNuX3Vuc3VwX21jc190YmxfcmV2MCwKLQkgc2l6ZW9mKGRvdDExbGNuX3Vuc3VwX21jc190YmxfcmV2MCkgLwotCSBzaXplb2YoZG90MTFsY25fdW5zdXBfbWNzX3RibF9yZXYwWzBdKSwgMjMsIDAsIDE2fQotCSwKLQl7JmRvdDExbGNuX2lxX2xvY2FsX3RibF9yZXYwLAotCSBzaXplb2YoZG90MTFsY25faXFfbG9jYWxfdGJsX3JldjApIC8KLQkgc2l6ZW9mKGRvdDExbGNuX2lxX2xvY2FsX3RibF9yZXYwWzBdKSwgMCwgMCwgMTZ9Ci0JLAotCXsmZG90MTFsY25fcGFwZF9jb21wZGVsdGFfdGJsX3JldjAsCi0JIHNpemVvZihkb3QxMWxjbl9wYXBkX2NvbXBkZWx0YV90YmxfcmV2MCkgLwotCSBzaXplb2YoZG90MTFsY25fcGFwZF9jb21wZGVsdGFfdGJsX3JldjBbMF0pLCAyNCwgMCwgMzJ9Ci0JLAotfTsKLQotY29uc3Qgc3RydWN0IHBoeXRibF9pbmZvIGRvdDExbGNuX3N3X2N0cmxfdGJsX2luZm9fNDMxMyA9IHsKLQkmZG90MTFsY25fc3dfY3RybF90YmxfNDMxM19yZXYwLAotCSAgICBzaXplb2YoZG90MTFsY25fc3dfY3RybF90YmxfNDMxM19yZXYwKSAvCi0JICAgIHNpemVvZihkb3QxMWxjbl9zd19jdHJsX3RibF80MzEzX3JldjBbMF0pLCAxNSwgMCwgMTYKLX07Ci0KLWNvbnN0IHN0cnVjdCBwaHl0YmxfaW5mbyBkb3QxMWxjbl9zd19jdHJsX3RibF9pbmZvXzQzMTNfZXBhID0gewotCSZkb3QxMWxjbl9zd19jdHJsX3RibF80MzEzX2VwYV9yZXYwLAotCSAgICBzaXplb2YoZG90MTFsY25fc3dfY3RybF90YmxfNDMxM19lcGFfcmV2MCkgLwotCSAgICBzaXplb2YoZG90MTFsY25fc3dfY3RybF90YmxfNDMxM19lcGFfcmV2MFswXSksIDE1LCAwLCAxNgotfTsKLQotY29uc3Qgc3RydWN0IHBoeXRibF9pbmZvIGRvdDExbGNuX3N3X2N0cmxfdGJsX2luZm9fNDMxM19idF9lcGEgPSB7Ci0JJmRvdDExbGNuX3N3X2N0cmxfdGJsXzQzMTNfZXBhX3JldjBfY29tYm8sCi0JICAgIHNpemVvZihkb3QxMWxjbl9zd19jdHJsX3RibF80MzEzX2VwYV9yZXYwX2NvbWJvKSAvCi0JICAgIHNpemVvZihkb3QxMWxjbl9zd19jdHJsX3RibF80MzEzX2VwYV9yZXYwX2NvbWJvWzBdKSwgMTUsIDAsIDE2Ci19OwotCi1jb25zdCBzdHJ1Y3QgcGh5dGJsX2luZm8gZG90MTFsY25fc3dfY3RybF90YmxfaW5mb180MzEzX2J0X2VwYV9wMjUwID0gewotCSZkb3QxMWxjbl9zd19jdHJsX3RibF80MzEzX2J0X2VwYV9wMjUwX3JldjAsCi0JICAgIHNpemVvZihkb3QxMWxjbl9zd19jdHJsX3RibF80MzEzX2J0X2VwYV9wMjUwX3JldjApIC8KLQkgICAgc2l6ZW9mKGRvdDExbGNuX3N3X2N0cmxfdGJsXzQzMTNfYnRfZXBhX3AyNTBfcmV2MFswXSksIDE1LCAwLCAxNgotfTsKLQotY29uc3QgdTMyIGRvdDExbGNucGh5dGJsX2luZm9fc3pfcmV2MCA9Ci0Jc2l6ZW9mKGRvdDExbGNucGh5dGJsX2luZm9fcmV2MCkgLyBzaXplb2YoZG90MTFsY25waHl0YmxfaW5mb19yZXYwWzBdKTsKLQotY29uc3Qgc3RydWN0IGxjbnBoeV90eF9nYWluX3RibF9lbnRyeQotZG90MTFsY25waHlfMkdIel9leHRQQV9nYWludGFibGVfcmV2MFsxMjhdID0gewotCXszLCAwLCAzMSwgMCwgNzIsfQotCSwKLQl7MywgMCwgMzEsIDAsIDcwLH0KLQksCi0JezMsIDAsIDMxLCAwLCA2OCx9Ci0JLAotCXszLCAwLCAzMCwgMCwgNjcsfQotCSwKLQl7MywgMCwgMjksIDAsIDY4LH0KLQksCi0JezMsIDAsIDI4LCAwLCA2OCx9Ci0JLAotCXszLCAwLCAyNywgMCwgNjksfQotCSwKLQl7MywgMCwgMjYsIDAsIDcwLH0KLQksCi0JezMsIDAsIDI1LCAwLCA3MCx9Ci0JLAotCXszLCAwLCAyNCwgMCwgNzEsfQotCSwKLQl7MywgMCwgMjMsIDAsIDcyLH0KLQksCi0JezMsIDAsIDIzLCAwLCA3MCx9Ci0JLAotCXszLCAwLCAyMiwgMCwgNzEsfQotCSwKLQl7MywgMCwgMjEsIDAsIDcyLH0KLQksCi0JezMsIDAsIDIxLCAwLCA3MCx9Ci0JLAotCXszLCAwLCAyMSwgMCwgNjgsfQotCSwKLQl7MywgMCwgMjEsIDAsIDY2LH0KLQksCi0JezMsIDAsIDIxLCAwLCA2NCx9Ci0JLAotCXszLCAwLCAyMSwgMCwgNjMsfQotCSwKLQl7MywgMCwgMjAsIDAsIDY0LH0KLQksCi0JezMsIDAsIDE5LCAwLCA2NSx9Ci0JLAotCXszLCAwLCAxOSwgMCwgNjQsfQotCSwKLQl7MywgMCwgMTgsIDAsIDY1LH0KLQksCi0JezMsIDAsIDE4LCAwLCA2NCx9Ci0JLAotCXszLCAwLCAxNywgMCwgNjUsfQotCSwKLQl7MywgMCwgMTcsIDAsIDY0LH0KLQksCi0JezMsIDAsIDE2LCAwLCA2NSx9Ci0JLAotCXszLCAwLCAxNiwgMCwgNjQsfQotCSwKLQl7MywgMCwgMTYsIDAsIDYyLH0KLQksCi0JezMsIDAsIDE2LCAwLCA2MCx9Ci0JLAotCXszLCAwLCAxNiwgMCwgNTgsfQotCSwKLQl7MywgMCwgMTUsIDAsIDYxLH0KLQksCi0JezMsIDAsIDE1LCAwLCA1OSx9Ci0JLAotCXszLCAwLCAxNCwgMCwgNjEsfQotCSwKLQl7MywgMCwgMTQsIDAsIDYwLH0KLQksCi0JezMsIDAsIDE0LCAwLCA1OCx9Ci0JLAotCXszLCAwLCAxMywgMCwgNjAsfQotCSwKLQl7MywgMCwgMTMsIDAsIDU5LH0KLQksCi0JezMsIDAsIDEyLCAwLCA2Mix9Ci0JLAotCXszLCAwLCAxMiwgMCwgNjAsfQotCSwKLQl7MywgMCwgMTIsIDAsIDU4LH0KLQksCi0JezMsIDAsIDExLCAwLCA2Mix9Ci0JLAotCXszLCAwLCAxMSwgMCwgNjAsfQotCSwKLQl7MywgMCwgMTEsIDAsIDU5LH0KLQksCi0JezMsIDAsIDExLCAwLCA1Nyx9Ci0JLAotCXszLCAwLCAxMCwgMCwgNjEsfQotCSwKLQl7MywgMCwgMTAsIDAsIDU5LH0KLQksCi0JezMsIDAsIDEwLCAwLCA1Nyx9Ci0JLAotCXszLCAwLCA5LCAwLCA2Mix9Ci0JLAotCXszLCAwLCA5LCAwLCA2MCx9Ci0JLAotCXszLCAwLCA5LCAwLCA1OCx9Ci0JLAotCXszLCAwLCA5LCAwLCA1Nyx9Ci0JLAotCXszLCAwLCA4LCAwLCA2Mix9Ci0JLAotCXszLCAwLCA4LCAwLCA2MCx9Ci0JLAotCXszLCAwLCA4LCAwLCA1OCx9Ci0JLAotCXszLCAwLCA4LCAwLCA1Nyx9Ci0JLAotCXszLCAwLCA4LCAwLCA1NSx9Ci0JLAotCXszLCAwLCA3LCAwLCA2MSx9Ci0JLAotCXszLCAwLCA3LCAwLCA2MCx9Ci0JLAotCXszLCAwLCA3LCAwLCA1OCx9Ci0JLAotCXszLCAwLCA3LCAwLCA1Nix9Ci0JLAotCXszLCAwLCA3LCAwLCA1NSx9Ci0JLAotCXszLCAwLCA2LCAwLCA2Mix9Ci0JLAotCXszLCAwLCA2LCAwLCA2MCx9Ci0JLAotCXszLCAwLCA2LCAwLCA1OCx9Ci0JLAotCXszLCAwLCA2LCAwLCA1Nyx9Ci0JLAotCXszLCAwLCA2LCAwLCA1NSx9Ci0JLAotCXszLCAwLCA2LCAwLCA1NCx9Ci0JLAotCXszLCAwLCA2LCAwLCA1Mix9Ci0JLAotCXszLCAwLCA1LCAwLCA2MSx9Ci0JLAotCXszLCAwLCA1LCAwLCA1OSx9Ci0JLAotCXszLCAwLCA1LCAwLCA1Nyx9Ci0JLAotCXszLCAwLCA1LCAwLCA1Nix9Ci0JLAotCXszLCAwLCA1LCAwLCA1NCx9Ci0JLAotCXszLCAwLCA1LCAwLCA1Myx9Ci0JLAotCXszLCAwLCA1LCAwLCA1MSx9Ci0JLAotCXszLCAwLCA0LCAwLCA2Mix9Ci0JLAotCXszLCAwLCA0LCAwLCA2MCx9Ci0JLAotCXszLCAwLCA0LCAwLCA1OCx9Ci0JLAotCXszLCAwLCA0LCAwLCA1Nyx9Ci0JLAotCXszLCAwLCA0LCAwLCA1NSx9Ci0JLAotCXszLCAwLCA0LCAwLCA1NCx9Ci0JLAotCXszLCAwLCA0LCAwLCA1Mix9Ci0JLAotCXszLCAwLCA0LCAwLCA1MSx9Ci0JLAotCXszLCAwLCA0LCAwLCA0OSx9Ci0JLAotCXszLCAwLCA0LCAwLCA0OCx9Ci0JLAotCXszLCAwLCA0LCAwLCA0Nix9Ci0JLAotCXszLCAwLCAzLCAwLCA2MCx9Ci0JLAotCXszLCAwLCAzLCAwLCA1OCx9Ci0JLAotCXszLCAwLCAzLCAwLCA1Nyx9Ci0JLAotCXszLCAwLCAzLCAwLCA1NSx9Ci0JLAotCXszLCAwLCAzLCAwLCA1NCx9Ci0JLAotCXszLCAwLCAzLCAwLCA1Mix9Ci0JLAotCXszLCAwLCAzLCAwLCA1MSx9Ci0JLAotCXszLCAwLCAzLCAwLCA0OSx9Ci0JLAotCXszLCAwLCAzLCAwLCA0OCx9Ci0JLAotCXszLCAwLCAzLCAwLCA0Nix9Ci0JLAotCXszLCAwLCAzLCAwLCA0NSx9Ci0JLAotCXszLCAwLCAzLCAwLCA0NCx9Ci0JLAotCXszLCAwLCAzLCAwLCA0Myx9Ci0JLAotCXszLCAwLCAzLCAwLCA0MSx9Ci0JLAotCXszLCAwLCAyLCAwLCA2MSx9Ci0JLAotCXszLCAwLCAyLCAwLCA1OSx9Ci0JLAotCXszLCAwLCAyLCAwLCA1Nyx9Ci0JLAotCXszLCAwLCAyLCAwLCA1Nix9Ci0JLAotCXszLCAwLCAyLCAwLCA1NCx9Ci0JLAotCXszLCAwLCAyLCAwLCA1Myx9Ci0JLAotCXszLCAwLCAyLCAwLCA1MSx9Ci0JLAotCXszLCAwLCAyLCAwLCA1MCx9Ci0JLAotCXszLCAwLCAyLCAwLCA0OCx9Ci0JLAotCXszLCAwLCAyLCAwLCA0Nyx9Ci0JLAotCXszLCAwLCAyLCAwLCA0Nix9Ci0JLAotCXszLCAwLCAyLCAwLCA0NCx9Ci0JLAotCXszLCAwLCAyLCAwLCA0Myx9Ci0JLAotCXszLCAwLCAyLCAwLCA0Mix9Ci0JLAotCXszLCAwLCAyLCAwLCA0MSx9Ci0JLAotCXszLCAwLCAyLCAwLCAzOSx9Ci0JLAotCXszLCAwLCAyLCAwLCAzOCx9Ci0JLAotCXszLCAwLCAyLCAwLCAzNyx9Ci0JLAotCXszLCAwLCAyLCAwLCAzNix9Ci0JLAotCXszLCAwLCAyLCAwLCAzNSx9Ci0JLAotCXszLCAwLCAyLCAwLCAzNCx9Ci0JLAotCXszLCAwLCAyLCAwLCAzMyx9Ci0JLAotCXszLCAwLCAyLCAwLCAzMix9Ci0JLAotCXszLCAwLCAxLCAwLCA2Myx9Ci0JLAotCXszLCAwLCAxLCAwLCA2MSx9Ci0JLAotCXszLCAwLCAxLCAwLCA1OSx9Ci0JLAotCXszLCAwLCAxLCAwLCA1Nyx9Ci0JLAotfTsKLQotY29uc3Qgc3RydWN0IGxjbnBoeV90eF9nYWluX3RibF9lbnRyeSBkb3QxMWxjbnBoeV8yR0h6X2dhaW50YWJsZV9yZXYwWzEyOF0gPSB7Ci0JezcsIDAsIDMxLCAwLCA3Mix9Ci0JLAotCXs3LCAwLCAzMSwgMCwgNzAsfQotCSwKLQl7NywgMCwgMzEsIDAsIDY4LH0KLQksCi0JezcsIDAsIDMwLCAwLCA2Nyx9Ci0JLAotCXs3LCAwLCAyOSwgMCwgNjgsfQotCSwKLQl7NywgMCwgMjgsIDAsIDY4LH0KLQksCi0JezcsIDAsIDI3LCAwLCA2OSx9Ci0JLAotCXs3LCAwLCAyNiwgMCwgNzAsfQotCSwKLQl7NywgMCwgMjUsIDAsIDcwLH0KLQksCi0JezcsIDAsIDI0LCAwLCA3MSx9Ci0JLAotCXs3LCAwLCAyMywgMCwgNzIsfQotCSwKLQl7NywgMCwgMjMsIDAsIDcwLH0KLQksCi0JezcsIDAsIDIyLCAwLCA3MSx9Ci0JLAotCXs3LCAwLCAyMSwgMCwgNzIsfQotCSwKLQl7NywgMCwgMjEsIDAsIDcwLH0KLQksCi0JezcsIDAsIDIxLCAwLCA2OCx9Ci0JLAotCXs3LCAwLCAyMSwgMCwgNjYsfQotCSwKLQl7NywgMCwgMjEsIDAsIDY0LH0KLQksCi0JezcsIDAsIDIxLCAwLCA2Myx9Ci0JLAotCXs3LCAwLCAyMCwgMCwgNjQsfQotCSwKLQl7NywgMCwgMTksIDAsIDY1LH0KLQksCi0JezcsIDAsIDE5LCAwLCA2NCx9Ci0JLAotCXs3LCAwLCAxOCwgMCwgNjUsfQotCSwKLQl7NywgMCwgMTgsIDAsIDY0LH0KLQksCi0JezcsIDAsIDE3LCAwLCA2NSx9Ci0JLAotCXs3LCAwLCAxNywgMCwgNjQsfQotCSwKLQl7NywgMCwgMTYsIDAsIDY1LH0KLQksCi0JezcsIDAsIDE2LCAwLCA2NCx9Ci0JLAotCXs3LCAwLCAxNiwgMCwgNjIsfQotCSwKLQl7NywgMCwgMTYsIDAsIDYwLH0KLQksCi0JezcsIDAsIDE2LCAwLCA1OCx9Ci0JLAotCXs3LCAwLCAxNSwgMCwgNjEsfQotCSwKLQl7NywgMCwgMTUsIDAsIDU5LH0KLQksCi0JezcsIDAsIDE0LCAwLCA2MSx9Ci0JLAotCXs3LCAwLCAxNCwgMCwgNjAsfQotCSwKLQl7NywgMCwgMTQsIDAsIDU4LH0KLQksCi0JezcsIDAsIDEzLCAwLCA2MCx9Ci0JLAotCXs3LCAwLCAxMywgMCwgNTksfQotCSwKLQl7NywgMCwgMTIsIDAsIDYyLH0KLQksCi0JezcsIDAsIDEyLCAwLCA2MCx9Ci0JLAotCXs3LCAwLCAxMiwgMCwgNTgsfQotCSwKLQl7NywgMCwgMTEsIDAsIDYyLH0KLQksCi0JezcsIDAsIDExLCAwLCA2MCx9Ci0JLAotCXs3LCAwLCAxMSwgMCwgNTksfQotCSwKLQl7NywgMCwgMTEsIDAsIDU3LH0KLQksCi0JezcsIDAsIDEwLCAwLCA2MSx9Ci0JLAotCXs3LCAwLCAxMCwgMCwgNTksfQotCSwKLQl7NywgMCwgMTAsIDAsIDU3LH0KLQksCi0JezcsIDAsIDksIDAsIDYyLH0KLQksCi0JezcsIDAsIDksIDAsIDYwLH0KLQksCi0JezcsIDAsIDksIDAsIDU4LH0KLQksCi0JezcsIDAsIDksIDAsIDU3LH0KLQksCi0JezcsIDAsIDgsIDAsIDYyLH0KLQksCi0JezcsIDAsIDgsIDAsIDYwLH0KLQksCi0JezcsIDAsIDgsIDAsIDU4LH0KLQksCi0JezcsIDAsIDgsIDAsIDU3LH0KLQksCi0JezcsIDAsIDgsIDAsIDU1LH0KLQksCi0JezcsIDAsIDcsIDAsIDYxLH0KLQksCi0JezcsIDAsIDcsIDAsIDYwLH0KLQksCi0JezcsIDAsIDcsIDAsIDU4LH0KLQksCi0JezcsIDAsIDcsIDAsIDU2LH0KLQksCi0JezcsIDAsIDcsIDAsIDU1LH0KLQksCi0JezcsIDAsIDYsIDAsIDYyLH0KLQksCi0JezcsIDAsIDYsIDAsIDYwLH0KLQksCi0JezcsIDAsIDYsIDAsIDU4LH0KLQksCi0JezcsIDAsIDYsIDAsIDU3LH0KLQksCi0JezcsIDAsIDYsIDAsIDU1LH0KLQksCi0JezcsIDAsIDYsIDAsIDU0LH0KLQksCi0JezcsIDAsIDYsIDAsIDUyLH0KLQksCi0JezcsIDAsIDUsIDAsIDYxLH0KLQksCi0JezcsIDAsIDUsIDAsIDU5LH0KLQksCi0JezcsIDAsIDUsIDAsIDU3LH0KLQksCi0JezcsIDAsIDUsIDAsIDU2LH0KLQksCi0JezcsIDAsIDUsIDAsIDU0LH0KLQksCi0JezcsIDAsIDUsIDAsIDUzLH0KLQksCi0JezcsIDAsIDUsIDAsIDUxLH0KLQksCi0JezcsIDAsIDQsIDAsIDYyLH0KLQksCi0JezcsIDAsIDQsIDAsIDYwLH0KLQksCi0JezcsIDAsIDQsIDAsIDU4LH0KLQksCi0JezcsIDAsIDQsIDAsIDU3LH0KLQksCi0JezcsIDAsIDQsIDAsIDU1LH0KLQksCi0JezcsIDAsIDQsIDAsIDU0LH0KLQksCi0JezcsIDAsIDQsIDAsIDUyLH0KLQksCi0JezcsIDAsIDQsIDAsIDUxLH0KLQksCi0JezcsIDAsIDQsIDAsIDQ5LH0KLQksCi0JezcsIDAsIDQsIDAsIDQ4LH0KLQksCi0JezcsIDAsIDQsIDAsIDQ2LH0KLQksCi0JezcsIDAsIDMsIDAsIDYwLH0KLQksCi0JezcsIDAsIDMsIDAsIDU4LH0KLQksCi0JezcsIDAsIDMsIDAsIDU3LH0KLQksCi0JezcsIDAsIDMsIDAsIDU1LH0KLQksCi0JezcsIDAsIDMsIDAsIDU0LH0KLQksCi0JezcsIDAsIDMsIDAsIDUyLH0KLQksCi0JezcsIDAsIDMsIDAsIDUxLH0KLQksCi0JezcsIDAsIDMsIDAsIDQ5LH0KLQksCi0JezcsIDAsIDMsIDAsIDQ4LH0KLQksCi0JezcsIDAsIDMsIDAsIDQ2LH0KLQksCi0JezcsIDAsIDMsIDAsIDQ1LH0KLQksCi0JezcsIDAsIDMsIDAsIDQ0LH0KLQksCi0JezcsIDAsIDMsIDAsIDQzLH0KLQksCi0JezcsIDAsIDMsIDAsIDQxLH0KLQksCi0JezcsIDAsIDIsIDAsIDYxLH0KLQksCi0JezcsIDAsIDIsIDAsIDU5LH0KLQksCi0JezcsIDAsIDIsIDAsIDU3LH0KLQksCi0JezcsIDAsIDIsIDAsIDU2LH0KLQksCi0JezcsIDAsIDIsIDAsIDU0LH0KLQksCi0JezcsIDAsIDIsIDAsIDUzLH0KLQksCi0JezcsIDAsIDIsIDAsIDUxLH0KLQksCi0JezcsIDAsIDIsIDAsIDUwLH0KLQksCi0JezcsIDAsIDIsIDAsIDQ4LH0KLQksCi0JezcsIDAsIDIsIDAsIDQ3LH0KLQksCi0JezcsIDAsIDIsIDAsIDQ2LH0KLQksCi0JezcsIDAsIDIsIDAsIDQ0LH0KLQksCi0JezcsIDAsIDIsIDAsIDQzLH0KLQksCi0JezcsIDAsIDIsIDAsIDQyLH0KLQksCi0JezcsIDAsIDIsIDAsIDQxLH0KLQksCi0JezcsIDAsIDIsIDAsIDM5LH0KLQksCi0JezcsIDAsIDIsIDAsIDM4LH0KLQksCi0JezcsIDAsIDIsIDAsIDM3LH0KLQksCi0JezcsIDAsIDIsIDAsIDM2LH0KLQksCi0JezcsIDAsIDIsIDAsIDM1LH0KLQksCi0JezcsIDAsIDIsIDAsIDM0LH0KLQksCi0JezcsIDAsIDIsIDAsIDMzLH0KLQksCi0JezcsIDAsIDIsIDAsIDMyLH0KLQksCi0JezcsIDAsIDEsIDAsIDYzLH0KLQksCi0JezcsIDAsIDEsIDAsIDYxLH0KLQksCi0JezcsIDAsIDEsIDAsIDU5LH0KLQksCi0JezcsIDAsIDEsIDAsIDU3LH0KLQksCi19OwotCi1jb25zdCBzdHJ1Y3QgbGNucGh5X3R4X2dhaW5fdGJsX2VudHJ5IGRvdDExbGNucGh5XzVHSHpfZ2FpbnRhYmxlX3JldjBbMTI4XSA9IHsKLQl7MjU1LCAyNTUsIDB4ZjAsIDAsIDE1Mix9Ci0JLAotCXsyNTUsIDI1NSwgMHhmMCwgMCwgMTQ3LH0KLQksCi0JezI1NSwgMjU1LCAweGYwLCAwLCAxNDMsfQotCSwKLQl7MjU1LCAyNTUsIDB4ZjAsIDAsIDEzOSx9Ci0JLAotCXsyNTUsIDI1NSwgMHhmMCwgMCwgMTM1LH0KLQksCi0JezI1NSwgMjU1LCAweGYwLCAwLCAxMzEsfQotCSwKLQl7MjU1LCAyNTUsIDB4ZjAsIDAsIDEyOCx9Ci0JLAotCXsyNTUsIDI1NSwgMHhmMCwgMCwgMTI0LH0KLQksCi0JezI1NSwgMjU1LCAweGYwLCAwLCAxMjEsfQotCSwKLQl7MjU1LCAyNTUsIDB4ZjAsIDAsIDExNyx9Ci0JLAotCXsyNTUsIDI1NSwgMHhmMCwgMCwgMTE0LH0KLQksCi0JezI1NSwgMjU1LCAweGYwLCAwLCAxMTEsfQotCSwKLQl7MjU1LCAyNTUsIDB4ZjAsIDAsIDEwNyx9Ci0JLAotCXsyNTUsIDI1NSwgMHhmMCwgMCwgMTA0LH0KLQksCi0JezI1NSwgMjU1LCAweGYwLCAwLCAxMDEsfQotCSwKLQl7MjU1LCAyNTUsIDB4ZjAsIDAsIDk5LH0KLQksCi0JezI1NSwgMjU1LCAweGYwLCAwLCA5Nix9Ci0JLAotCXsyNTUsIDI1NSwgMHhmMCwgMCwgOTMsfQotCSwKLQl7MjU1LCAyNTUsIDB4ZjAsIDAsIDkwLH0KLQksCi0JezI1NSwgMjU1LCAweGYwLCAwLCA4OCx9Ci0JLAotCXsyNTUsIDI1NSwgMHhmMCwgMCwgODUsfQotCSwKLQl7MjU1LCAyNTUsIDB4ZjAsIDAsIDgzLH0KLQksCi0JezI1NSwgMjU1LCAweGYwLCAwLCA4MSx9Ci0JLAotCXsyNTUsIDI1NSwgMHhmMCwgMCwgNzgsfQotCSwKLQl7MjU1LCAyNTUsIDB4ZjAsIDAsIDc2LH0KLQksCi0JezI1NSwgMjU1LCAweGYwLCAwLCA3NCx9Ci0JLAotCXsyNTUsIDI1NSwgMHhmMCwgMCwgNzIsfQotCSwKLQl7MjU1LCAyNTUsIDB4ZjAsIDAsIDcwLH0KLQksCi0JezI1NSwgMjU1LCAweGYwLCAwLCA2OCx9Ci0JLAotCXsyNTUsIDI1NSwgMHhmMCwgMCwgNjYsfQotCSwKLQl7MjU1LCAyNTUsIDB4ZjAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjQ4LCAweGYwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDI0MSwgMHhmMCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyNTEsIDB4ZTAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjQ0LCAweGUwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDI1NCwgMHhkMCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyNDYsIDB4ZDAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjM5LCAweGQwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDI0OSwgMHhjMCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyNDIsIDB4YzAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjU1LCAweGIwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDI0OCwgMHhiMCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyNDEsIDB4YjAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjU0LCAweGEwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDI0NiwgMHhhMCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyMzksIDB4YTAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjU1LCAweDkwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDI0OCwgMHg5MCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyNDEsIDB4OTAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjM0LCAweDkwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDI1NSwgMHg4MCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyNDgsIDB4ODAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjQxLCAweDgwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDIzNCwgMHg4MCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyNTUsIDB4NzAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjQ4LCAweDcwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDI0MSwgMHg3MCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyMzQsIDB4NzAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjI3LCAweDcwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDIyMSwgMHg3MCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyMTUsIDB4NzAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjA4LCAweDcwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDIwMywgMHg3MCwgMCwgNjQsfQotCSwKLQl7MjU1LCAxOTcsIDB4NzAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjU1LCAweDYwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDI0OCwgMHg2MCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyNDEsIDB4NjAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjM0LCAweDYwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDIyNywgMHg2MCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyMjEsIDB4NjAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjU1LCAweDUwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDI0OCwgMHg1MCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyNDEsIDB4NTAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjM0LCAweDUwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDIyNywgMHg1MCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyMjEsIDB4NTAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjE1LCAweDUwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDIwOCwgMHg1MCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyNTUsIDB4NDAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjQ4LCAweDQwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDI0MSwgMHg0MCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyMzQsIDB4NDAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjI3LCAweDQwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDIyMSwgMHg0MCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyMTUsIDB4NDAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjA4LCAweDQwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDIwMywgMHg0MCwgMCwgNjQsfQotCSwKLQl7MjU1LCAxOTcsIDB4NDAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjU1LCAweDMwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDI0OCwgMHgzMCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyNDEsIDB4MzAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjM0LCAweDMwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDIyNywgMHgzMCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyMjEsIDB4MzAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjE1LCAweDMwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDIwOCwgMHgzMCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyMDMsIDB4MzAsIDAsIDY0LH0KLQksCi0JezI1NSwgMTk3LCAweDMwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDE5MSwgMHgzMCwgMCwgNjQsfQotCSwKLQl7MjU1LCAxODYsIDB4MzAsIDAsIDY0LH0KLQksCi0JezI1NSwgMTgxLCAweDMwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDE3NSwgMHgzMCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyNTUsIDB4MjAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjQ4LCAweDIwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDI0MSwgMHgyMCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyMzQsIDB4MjAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjI3LCAweDIwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDIyMSwgMHgyMCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyMTUsIDB4MjAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjA4LCAweDIwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDIwMywgMHgyMCwgMCwgNjQsfQotCSwKLQl7MjU1LCAxOTcsIDB4MjAsIDAsIDY0LH0KLQksCi0JezI1NSwgMTkxLCAweDIwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDE4NiwgMHgyMCwgMCwgNjQsfQotCSwKLQl7MjU1LCAxODEsIDB4MjAsIDAsIDY0LH0KLQksCi0JezI1NSwgMTc1LCAweDIwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDE3MCwgMHgyMCwgMCwgNjQsfQotCSwKLQl7MjU1LCAxNjYsIDB4MjAsIDAsIDY0LH0KLQksCi0JezI1NSwgMTYxLCAweDIwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDE1NiwgMHgyMCwgMCwgNjQsfQotCSwKLQl7MjU1LCAxNTIsIDB4MjAsIDAsIDY0LH0KLQksCi0JezI1NSwgMTQ4LCAweDIwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDE0MywgMHgyMCwgMCwgNjQsfQotCSwKLQl7MjU1LCAxMzksIDB4MjAsIDAsIDY0LH0KLQksCi0JezI1NSwgMTM1LCAweDIwLCAwLCA2NCx9Ci0JLAotCXsyNTUsIDEzMiwgMHgyMCwgMCwgNjQsfQotCSwKLQl7MjU1LCAyNTUsIDB4MTAsIDAsIDY0LH0KLQksCi0JezI1NSwgMjQ4LCAweDEwLCAwLCA2NCx9Ci0JLAotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeXRibF9sY24uaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeXRibF9sY24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3NWUxNi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHl0YmxfbGNuLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgPHR5cGVzLmg+Ci0jaW5jbHVkZSAicGh5X2ludC5oIgotCi1leHRlcm4gY29uc3Qgc3RydWN0IHBoeXRibF9pbmZvIGRvdDExbGNucGh5dGJsX3J4X2dhaW5faW5mb19yZXYwW107Ci1leHRlcm4gY29uc3QgdTMyIGRvdDExbGNucGh5dGJsX3J4X2dhaW5faW5mb19zel9yZXYwOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBwaHl0YmxfaW5mbyBkb3QxMWxjbl9zd19jdHJsX3RibF9pbmZvXzQzMTM7Ci1leHRlcm4gY29uc3Qgc3RydWN0IHBoeXRibF9pbmZvIGRvdDExbGNuX3N3X2N0cmxfdGJsX2luZm9fNDMxM19lcGE7Ci1leHRlcm4gY29uc3Qgc3RydWN0IHBoeXRibF9pbmZvIGRvdDExbGNuX3N3X2N0cmxfdGJsX2luZm9fNDMxM19lcGFfY29tYm87Ci1leHRlcm4gY29uc3Qgc3RydWN0IHBoeXRibF9pbmZvIGRvdDExbGNuX3N3X2N0cmxfdGJsX2luZm9fNDMxM19idF9lcGE7Ci1leHRlcm4gY29uc3Qgc3RydWN0IHBoeXRibF9pbmZvIGRvdDExbGNuX3N3X2N0cmxfdGJsX2luZm9fNDMxM19idF9lcGFfcDI1MDsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBwaHl0YmxfaW5mbyBkb3QxMWxjbnBoeXRibF9pbmZvX3JldjBbXTsKLWV4dGVybiBjb25zdCB1MzIgZG90MTFsY25waHl0YmxfaW5mb19zel9yZXYwOwotCi1leHRlcm4gY29uc3Qgc3RydWN0IHBoeXRibF9pbmZvIGRvdDExbGNucGh5dGJsX3J4X2dhaW5faW5mb18yR19yZXYyW107Ci1leHRlcm4gY29uc3QgdTMyIGRvdDExbGNucGh5dGJsX3J4X2dhaW5faW5mb18yR19yZXYyX3N6OwotCi1leHRlcm4gY29uc3Qgc3RydWN0IHBoeXRibF9pbmZvIGRvdDExbGNucGh5dGJsX3J4X2dhaW5faW5mb181R19yZXYyW107Ci1leHRlcm4gY29uc3QgdTMyIGRvdDExbGNucGh5dGJsX3J4X2dhaW5faW5mb181R19yZXYyX3N6OwotCi1leHRlcm4gY29uc3Qgc3RydWN0IHBoeXRibF9pbmZvIGRvdDExbGNucGh5dGJsX3J4X2dhaW5faW5mb19leHRsbmFfMkdfcmV2MltdOwotCi1leHRlcm4gY29uc3Qgc3RydWN0IHBoeXRibF9pbmZvIGRvdDExbGNucGh5dGJsX3J4X2dhaW5faW5mb19leHRsbmFfNUdfcmV2MltdOwotCi1zdHJ1Y3QgbGNucGh5X3R4X2dhaW5fdGJsX2VudHJ5IHsKLQl1bnNpZ25lZCBjaGFyIGdtOwotCXVuc2lnbmVkIGNoYXIgcGdhOwotCXVuc2lnbmVkIGNoYXIgcGFkOwotCXVuc2lnbmVkIGNoYXIgZGFjOwotCXVuc2lnbmVkIGNoYXIgYmJfbXVsdDsKLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgbGNucGh5X3R4X2dhaW5fdGJsX2VudHJ5IGRvdDExbGNucGh5XzJHSHpfZ2FpbnRhYmxlX3JldjBbXTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdAotbGNucGh5X3R4X2dhaW5fdGJsX2VudHJ5IGRvdDExbGNucGh5XzJHSHpfZXh0UEFfZ2FpbnRhYmxlX3JldjBbXTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBsY25waHlfdHhfZ2Fpbl90YmxfZW50cnkgZG90MTFsY25waHlfNUdIel9nYWludGFibGVfcmV2MFtdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5dGJsX24uYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeXRibF9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNzQxZjQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5dGJsX24uYworKysgL2Rldi9udWxsCkBAIC0xLDEwNjI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSA8dHlwZXMuaD4KLSNpbmNsdWRlICJwaHl0Ymxfbi5oIgotCi1jb25zdCB1MzIgZnJhbWVfc3RydWN0X3JldjBbXSA9IHsKLQkweDA4MDA0YTA0LAotCTB4MDAxMDAwMDAsCi0JMHgwMTAwMGEwNSwKLQkweDAwMTAwMDIwLAotCTB4MDk4MDQ1MDYsCi0JMHgwMDEwMDAzMCwKLQkweDA5ODA0NTA3LAotCTB4MDAxMDAwMzAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDgwMDRhMGMsCi0JMHgwMDEwMDAwNCwKLQkweDAxMDAwYTBkLAotCTB4MDAxMDAwMjQsCi0JMHgwOTgwNDUwZSwKLQkweDAwMTAwMDM0LAotCTB4MDk4MDQ1MGYsCi0JMHgwMDEwMDAzNCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMGEwNCwKLQkweDAwMTAwMDAwLAotCTB4MTEwMDhhMDUsCi0JMHgwMDEwMDAyMCwKLQkweDE5ODBjNTA2LAotCTB4MDAxMDAwMzAsCi0JMHgyMTgxMDUwNiwKLQkweDAwMTAwMDMwLAotCTB4MjE4MTA1MDYsCi0JMHgwMDEwMDAzMCwKLQkweDAxODAwNTA0LAotCTB4MDAxMDAwMzAsCi0JMHgxMTgwODUwNSwKLQkweDAwMTAwMDMwLAotCTB4Mjk4MTQ1MDcsCi0JMHgwMTEwMDAzMCwKLQkweDAwMDAwYTA0LAotCTB4MDAxMDAwMDAsCi0JMHgxMTAwOGEwNSwKLQkweDAwMTAwMDIwLAotCTB4MjE4MTA1MDYsCi0JMHgwMDEwMDAzMCwKLQkweDIxODEwNTA2LAotCTB4MDAxMDAwMzAsCi0JMHgyOTgxNDUwNywKLQkweDAxMTAwMDMwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDBhMGMsCi0JMHgwMDEwMDAwOCwKLQkweDExMDA4YTBkLAotCTB4MDAxMDAwMjgsCi0JMHgxOTgwYzUwZSwKLQkweDAwMTAwMDM4LAotCTB4MjE4MTA1MGUsCi0JMHgwMDEwMDAzOCwKLQkweDIxODEwNTBlLAotCTB4MDAxMDAwMzgsCi0JMHgwMTgwMDUwYywKLQkweDAwMTAwMDM4LAotCTB4MTE4MDg1MGQsCi0JMHgwMDEwMDAzOCwKLQkweDI5ODE0NTBmLAotCTB4MDExMDAwMzgsCi0JMHgwMDAwMGEwYywKLQkweDAwMTAwMDA4LAotCTB4MTEwMDhhMGQsCi0JMHgwMDEwMDAyOCwKLQkweDIxODEwNTBlLAotCTB4MDAxMDAwMzgsCi0JMHgyMTgxMDUwZSwKLQkweDAwMTAwMDM4LAotCTB4Mjk4MTQ1MGYsCi0JMHgwMTEwMDAzOCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDA4MDA0YTA0LAotCTB4MDAxMDAwMDAsCi0JMHgwMTAwMGEwNSwKLQkweDAwMTAwMDIwLAotCTB4MTk4MGM1MDYsCi0JMHgwMDEwMDAzMCwKLQkweDE5ODBjNTA2LAotCTB4MDAxMDAwMzAsCi0JMHgxMTgwODUwNCwKLQkweDAwMTAwMDMwLAotCTB4Mzk4MWNhMDUsCi0JMHgwMDEwMDAzMCwKLQkweDI5ODE0NTA3LAotCTB4MDExMDAwMzAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MTAwMDhhMDQsCi0JMHgwMDEwMDAwMCwKLQkweDM5ODFjYTA1LAotCTB4MDAxMDAwMzAsCi0JMHgxOTgwYzUwNiwKLQkweDAwMTAwMDMwLAotCTB4Mjk4MTQ1MDcsCi0JMHgwMTEwMDAzMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwODAwNGEwYywKLQkweDAwMTAwMDA4LAotCTB4MDEwMDBhMGQsCi0JMHgwMDEwMDAyOCwKLQkweDE5ODBjNTBlLAotCTB4MDAxMDAwMzgsCi0JMHgxOTgwYzUwZSwKLQkweDAwMTAwMDM4LAotCTB4MTE4MDg1MGMsCi0JMHgwMDEwMDAzOCwKLQkweDM5ODFjYTBkLAotCTB4MDAxMDAwMzgsCi0JMHgyOTgxNDUwZiwKLQkweDAxMTAwMDM4LAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDEwMDA4YTBjLAotCTB4MDAxMDAwMDgsCi0JMHgzOTgxY2EwZCwKLQkweDAwMTAwMDM4LAotCTB4MTk4MGM1MGUsCi0JMHgwMDEwMDAzOCwKLQkweDI5ODE0NTBmLAotCTB4MDExMDAwMzgsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4NDAwMjE0MDQsCi0JMHgwMDEwMDAwMCwKLQkweDAyMDAxNDA1LAotCTB4MDAxMDAwNDAsCi0JMHgwYjAwNGEwNiwKLQkweDAxOTAwMDYwLAotCTB4MTMwMDhhMDYsCi0JMHgwMTkwMDA2MCwKLQkweDEzMDA4YTA2LAotCTB4MDE5MDAwNjAsCi0JMHg0MzAyMGEwNCwKLQkweDAwMTAwMDYwLAotCTB4MWIwMGNhMDUsCi0JMHgwMDEwMDA2MCwKLQkweDIzMDEwYTA3LAotCTB4MDE1MDAwNjAsCi0JMHg0MDAyMTQwNCwKLQkweDAwMTAwMDAwLAotCTB4MWEwMGQ0MDUsCi0JMHgwMDEwMDA0MCwKLQkweDEzMDA4YTA2LAotCTB4MDE5MDAwNjAsCi0JMHgxMzAwOGEwNiwKLQkweDAxOTAwMDYwLAotCTB4MjMwMTBhMDcsCi0JMHgwMTUwMDA2MCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDQwMDIxNDBjLAotCTB4MDAxMDAwMTAsCi0JMHgwMjAwMTQwZCwKLQkweDAwMTAwMDUwLAotCTB4MGIwMDRhMGUsCi0JMHgwMTkwMDA3MCwKLQkweDEzMDA4YTBlLAotCTB4MDE5MDAwNzAsCi0JMHgxMzAwOGEwZSwKLQkweDAxOTAwMDcwLAotCTB4NDMwMjBhMGMsCi0JMHgwMDEwMDA3MCwKLQkweDFiMDBjYTBkLAotCTB4MDAxMDAwNzAsCi0JMHgyMzAxMGEwZiwKLQkweDAxNTAwMDcwLAotCTB4NDAwMjE0MGMsCi0JMHgwMDEwMDAxMCwKLQkweDFhMDBkNDBkLAotCTB4MDAxMDAwNTAsCi0JMHgxMzAwOGEwZSwKLQkweDAxOTAwMDcwLAotCTB4MTMwMDhhMGUsCi0JMHgwMTkwMDA3MCwKLQkweDIzMDEwYTBmLAotCTB4MDE1MDAwNzAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHg1MDAyOTQwNCwKLQkweDAwMTAwMDAwLAotCTB4MzIwMTk0MDUsCi0JMHgwMDEwMDA0MCwKLQkweDBiMDA0YTA2LAotCTB4MDE5MDAwNjAsCi0JMHgwYjAwNGEwNiwKLQkweDAxOTAwMDYwLAotCTB4NWIwMmNhMDQsCi0JMHgwMDEwMDA2MCwKLQkweDNiMDFkNDA1LAotCTB4MDAxMDAwNjAsCi0JMHgyMzAxMGEwNywKLQkweDAxNTAwMDYwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDU4MDJkNDA0LAotCTB4MDAxMDAwMDAsCi0JMHgzYjAxZDQwNSwKLQkweDAwMTAwMDYwLAotCTB4MGIwMDRhMDYsCi0JMHgwMTkwMDA2MCwKLQkweDIzMDEwYTA3LAotCTB4MDE1MDAwNjAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4NTAwMjk0MGMsCi0JMHgwMDEwMDAxMCwKLQkweDMyMDE5NDBkLAotCTB4MDAxMDAwNTAsCi0JMHgwYjAwNGEwZSwKLQkweDAxOTAwMDcwLAotCTB4MGIwMDRhMGUsCi0JMHgwMTkwMDA3MCwKLQkweDViMDJjYTBjLAotCTB4MDAxMDAwNzAsCi0JMHgzYjAxZDQwZCwKLQkweDAwMTAwMDcwLAotCTB4MjMwMTBhMGYsCi0JMHgwMTUwMDA3MCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHg1ODAyZDQwYywKLQkweDAwMTAwMDEwLAotCTB4M2IwMWQ0MGQsCi0JMHgwMDEwMDA3MCwKLQkweDBiMDA0YTBlLAotCTB4MDE5MDAwNzAsCi0JMHgyMzAxMGEwZiwKLQkweDAxNTAwMDcwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDQwMDIxNDA0LAotCTB4MDAwZjQ4MDAsCi0JMHg2MjAzMTQwNSwKLQkweDAwMTAwMDQwLAotCTB4NTMwMjhhMDYsCi0JMHgwMTkwMDA2MCwKLQkweDUzMDI4YTA3LAotCTB4MDE5MDAwNjAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4NDAwMjE0MGMsCi0JMHgwMDBmNDgwOCwKLQkweDYyMDMxNDBkLAotCTB4MDAxMDAwNDgsCi0JMHg1MzAyOGEwZSwKLQkweDAxOTAwMDY4LAotCTB4NTMwMjhhMGYsCi0JMHgwMTkwMDA2OCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMGEwYywKLQkweDAwMTAwMDA0LAotCTB4MTEwMDhhMGQsCi0JMHgwMDEwMDAyNCwKLQkweDE5ODBjNTBlLAotCTB4MDAxMDAwMzQsCi0JMHgyMTgxMDUwZSwKLQkweDAwMTAwMDM0LAotCTB4MjE4MTA1MGUsCi0JMHgwMDEwMDAzNCwKLQkweDAxODAwNTBjLAotCTB4MDAxMDAwMzgsCi0JMHgxMTgwODUwZCwKLQkweDAwMTAwMDM4LAotCTB4MTE4MTg1MGQsCi0JMHgwMDEwMDAzOCwKLQkweDI5ODE0NTBmLAotCTB4MDExMDAwMzgsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDBhMGMsCi0JMHgwMDEwMDAwOCwKLQkweDExMDA4YTBkLAotCTB4MDAxMDAwMjgsCi0JMHgyMTgxMDUwZSwKLQkweDAwMTAwMDM4LAotCTB4MjE4MTA1MGUsCi0JMHgwMDEwMDAzOCwKLQkweDExODE4NTBkLAotCTB4MDAxMDAwMzgsCi0JMHgyOTgxNDUwZiwKLQkweDAxMTAwMDM4LAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDA4MDA0YTA0LAotCTB4MDAxMDAwMDAsCi0JMHgwMTAwMGEwNSwKLQkweDAwMTAwMDIwLAotCTB4MDE4MGM1MDYsCi0JMHgwMDEwMDAzMCwKLQkweDAxODBjNTA2LAotCTB4MDAxMDAwMzAsCi0JMHgyMTgwYzUwYywKLQkweDAwMTAwMDMwLAotCTB4NDk4MjBhMGQsCi0JMHgwMDE2YTEzMCwKLQkweDQxODI0YTBkLAotCTB4MDAxNmExMzAsCi0JMHgyOTgxNDUwZiwKLQkweDAxMTAwMDMwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgyMDAwY2EwYywKLQkweDAwMTAwMDAwLAotCTB4NDk4MjBhMGQsCi0JMHgwMDE2YTEzMCwKLQkweDE5ODBjNTBlLAotCTB4MDAxMDAwMzAsCi0JMHg0MTgyNGEwZCwKLQkweDAwMTZhMTMwLAotCTB4Mjk4MTQ1MGYsCi0JMHgwMTEwMDAzMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4NDAwMjE0MGMsCi0JMHgwMDEwMDAwOCwKLQkweDAyMDAxNDBkLAotCTB4MDAxMDAwNDgsCi0JMHgwYjAwNGEwZSwKLQkweDAxOTAwMDY4LAotCTB4MTMwMDhhMGUsCi0JMHgwMTkwMDA2OCwKLQkweDEzMDA4YTBlLAotCTB4MDE5MDAwNjgsCi0JMHg0MzAyMGEwYywKLQkweDAwMTAwMDcwLAotCTB4MWIwMGNhMGQsCi0JMHgwMDEwMDA3MCwKLQkweDFiMDE0YTBkLAotCTB4MDAxMDAwNzAsCi0JMHgyMzAxMGEwZiwKLQkweDAxNTAwMDcwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDQwMDIxNDBjLAotCTB4MDAxMDAwMTAsCi0JMHgxYTAwZDQwZCwKLQkweDAwMTAwMDUwLAotCTB4MTMwMDhhMGUsCi0JMHgwMTkwMDA3MCwKLQkweDEzMDA4YTBlLAotCTB4MDE5MDAwNzAsCi0JMHgxYjAxNGEwZCwKLQkweDAwMTAwMDcwLAotCTB4MjMwMTBhMGYsCi0JMHgwMTUwMDA3MCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHg1MDAyOTQwNCwKLQkweDAwMTAwMDAwLAotCTB4MzIwMTk0MDUsCi0JMHgwMDEwMDA0MCwKLQkweDAzMDA0YTA2LAotCTB4MDE5MDAwNjAsCi0JMHgwMzAwNGEwNiwKLQkweDAxOTAwMDYwLAotCTB4NmIwMzBhMGMsCi0JMHgwMDEwMDA2MCwKLQkweDRiMDIxNDBkLAotCTB4MDAxNmExNjAsCi0JMHg0MzAyNTQwZCwKLQkweDAwMTZhMTYwLAotCTB4MjMwMTBhMGYsCi0JMHgwMTUwMDA2MCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4NmIwMzE0MGMsCi0JMHgwMDEwMDA2MCwKLQkweDRiMDIxNDBkLAotCTB4MDAxNmExNjAsCi0JMHgwYjAwNGEwZSwKLQkweDAxOTAwMDYwLAotCTB4NDMwMjU0MGQsCi0JMHgwMDE2YTE2MCwKLQkweDIzMDEwYTBmLAotCTB4MDE1MDAwNjAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDQwMDIxNDA0LAotCTB4MDAxMDAwMDAsCi0JMHgxYTAwZDQwNSwKLQkweDAwMTAwMDQwLAotCTB4NTMwMjhhMDYsCi0JMHgwMTkwMDA2MCwKLQkweDViMDJjYTA2LAotCTB4MDE5MDAwNjAsCi0JMHg1YjAyY2EwNiwKLQkweDAxOTAwMDYwLAotCTB4NDMwMjBhMDQsCi0JMHgwMDEwMDA2MCwKLQkweDFiMDBjYTA1LAotCTB4MDAxMDAwNjAsCi0JMHg1MzAyOGEwNywKLQkweDAxOTBjMDYwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHg0MDAyMTQwYywKLQkweDAwMTAwMDEwLAotCTB4MWEwMGQ0MGQsCi0JMHgwMDEwMDA1MCwKLQkweDUzMDI4YTBlLAotCTB4MDE5MDAwNzAsCi0JMHg1YjAyY2EwZSwKLQkweDAxOTAwMDcwLAotCTB4NWIwMmNhMGUsCi0JMHgwMTkwMDA3MCwKLQkweDQzMDIwYTBjLAotCTB4MDAxMDAwNzAsCi0JMHgxYjAwY2EwZCwKLQkweDAwMTAwMDcwLAotCTB4NTMwMjhhMGYsCi0JMHgwMTkwYzA3MCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4NDAwMjE0MDQsCi0JMHgwMDEwMDAwMCwKLQkweDFhMDBkNDA1LAotCTB4MDAxMDAwNDAsCi0JMHg1YjAyY2EwNiwKLQkweDAxOTAwMDYwLAotCTB4NWIwMmNhMDYsCi0JMHgwMTkwMDA2MCwKLQkweDUzMDI4YTA3LAotCTB4MDE5MGMwNjAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDQwMDIxNDBjLAotCTB4MDAxMDAwMTAsCi0JMHgxYTAwZDQwZCwKLQkweDAwMTAwMDUwLAotCTB4NWIwMmNhMGUsCi0JMHgwMTkwMDA3MCwKLQkweDViMDJjYTBlLAotCTB4MDE5MDAwNzAsCi0JMHg1MzAyOGEwZiwKLQkweDAxOTBjMDcwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotfTsKLQotY29uc3QgdTggZnJhbWVfbHV0X3JldjBbXSA9IHsKLQkweDAyLAotCTB4MDQsCi0JMHgxNCwKLQkweDE0LAotCTB4MDMsCi0JMHgwNSwKLQkweDE2LAotCTB4MTYsCi0JMHgwYSwKLQkweDBjLAotCTB4MWMsCi0JMHgxYywKLQkweDBiLAotCTB4MGQsCi0JMHgxZSwKLQkweDFlLAotCTB4MDYsCi0JMHgwOCwKLQkweDE4LAotCTB4MTgsCi0JMHgwNywKLQkweDA5LAotCTB4MWEsCi0JMHgxYSwKLQkweDBlLAotCTB4MTAsCi0JMHgyMCwKLQkweDI4LAotCTB4MGYsCi0JMHgxMSwKLQkweDIyLAotCTB4MmEsCi19OwotCi1jb25zdCB1MzIgdG1hcF90YmxfcmV2MFtdID0gewotCTB4OGE4OGFhODAsCi0JMHg4YWFhYWE4YSwKLQkweDhhOGE4YWE4LAotCTB4MDAwMDA4ODgsCi0JMHg4ODAwMDAwMCwKLQkweDhhOGE4OGFhLAotCTB4OGFhODg4ODgsCi0JMHg4ODg4YThhOCwKLQkweGYxMTExMTEwLAotCTB4MTExMTExMTEsCi0JMHgxMWYxMTExMSwKLQkweDAwMDAwMTExLAotCTB4MTEwMDAwMDAsCi0JMHgxMTExZjExMSwKLQkweDExMTExMTExLAotCTB4MTExMTExZjEsCi0JMHg4YTg4YWE4MCwKLQkweDhhYWFhYThhLAotCTB4OGE4YThhYTgsCi0JMHgwMDBhYTg4OCwKLQkweDg4ODgwMDAwLAotCTB4OGE4YTg4YWEsCi0JMHg4YWE4ODg4OCwKLQkweDg4ODhhOGE4LAotCTB4YTExMTExMTAsCi0JMHgxMTExMTExMSwKLQkweDExYzExMTExLAotCTB4MDAwMDAxMTEsCi0JMHgxMTAwMDAwMCwKLQkweDExMTFhMTExLAotCTB4MTExMTExMTEsCi0JMHgxMTExMTFhMSwKLQkweGEyMjIyMjIwLAotCTB4MjIyMjIyMjIsCi0JMHgyMmMyMjIyMiwKLQkweDAwMDAwMjIyLAotCTB4MjIwMDAwMDAsCi0JMHgyMjIyYTIyMiwKLQkweDIyMjIyMjIyLAotCTB4MjIyMjIyYTIsCi0JMHhmMTExMTExMCwKLQkweDExMTExMTExLAotCTB4MTFmMTExMTEsCi0JMHgwMDAxMTExMSwKLQkweDExMTEwMDAwLAotCTB4MTExMWYxMTEsCi0JMHgxMTExMTExMSwKLQkweDExMTExMWYxLAotCTB4YThhYTg4YTAsCi0JMHhhODg4ODhhOCwKLQkweGE4YThhODhhLAotCTB4MDAwODhhYWEsCi0JMHhhYWFhMDAwMCwKLQkweGE4YThhYTg4LAotCTB4YTg4YWFhYWEsCi0JMHhhYWFhOGE4YSwKLQkweGFhYThhYWEwLAotCTB4OGFhYThhYWEsCi0JMHhhYThhOGE4YSwKLQkweDAwMGFhYTg4LAotCTB4OGFhYTAwMDAsCi0JMHhhYWE4YTg4OCwKLQkweDhhYTg4YThhLAotCTB4OGE4OGE4ODgsCi0JMHgwODA4MGEwMCwKLQkweDBhMDgwODBhLAotCTB4MDgwYTBhMDgsCi0JMHgwMDA4MDgwOCwKLQkweDA4MGEwMDAwLAotCTB4MDgwYTA4MDgsCi0JMHgwODBhMDgwOCwKLQkweDBhMGEwYTA4LAotCTB4YTBhMGEwYTAsCi0JMHg4MGEwYTA4MCwKLQkweDgwODBhMGEwLAotCTB4MDAwMDgwODAsCi0JMHg4MGEwMDAwMCwKLQkweDgwYTA4MGEwLAotCTB4YTA4MGEwYTAsCi0JMHg4MDgwYTBhMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDk5OTk5MDAwLAotCTB4OWI5Yjk5YmIsCi0JMHg5YmI5OTk5OSwKLQkweDk5OTliOWI5LAotCTB4OWI5OWJiOTAsCi0JMHg5YmJiYmI5YiwKLQkweDliOWI5YmI5LAotCTB4MDAwMDA5OTksCi0JMHg4ODAwMDAwMCwKLQkweDhhOGE4OGFhLAotCTB4OGFhODg4ODgsCi0JMHg4ODg4YThhOCwKLQkweDhhODhhYTgwLAotCTB4OGFhYWFhOGEsCi0JMHg4YThhOGFhOCwKLQkweDAwYWFhODg4LAotCTB4MjIwMDAwMDAsCi0JMHgyMjIyYjIyMiwKLQkweDIyMjIyMjIyLAotCTB4MjIyMjIyYjIsCi0JMHhiMjIyMjIyMCwKLQkweDIyMjIyMjIyLAotCTB4MjJkMjIyMjIsCi0JMHgwMDAwMDIyMiwKLQkweDExMDAwMDAwLAotCTB4MTExMWExMTEsCi0JMHgxMTExMTExMSwKLQkweDExMTExMWExLAotCTB4YTExMTExMTAsCi0JMHgxMTExMTExMSwKLQkweDExYzExMTExLAotCTB4MDAwMDAxMTEsCi0JMHgzMzAwMDAwMCwKLQkweDMzMzNiMzMzLAotCTB4MzMzMzMzMzMsCi0JMHgzMzMzMzNiMywKLQkweGIzMzMzMzMwLAotCTB4MzMzMzMzMzMsCi0JMHgzM2QzMzMzMywKLQkweDAwMDAwMzMzLAotCTB4MjIwMDAwMDAsCi0JMHgyMjIyYTIyMiwKLQkweDIyMjIyMjIyLAotCTB4MjIyMjIyYTIsCi0JMHhhMjIyMjIyMCwKLQkweDIyMjIyMjIyLAotCTB4MjJjMjIyMjIsCi0JMHgwMDAwMDIyMiwKLQkweDk5Yjk5YjAwLAotCTB4OWI5Yjk5YmIsCi0JMHg5YmI5OTk5OSwKLQkweDk5OTliOWI5LAotCTB4OWI5OWJiOTksCi0JMHg5YmJiYmI5YiwKLQkweDliOWI5YmI5LAotCTB4MDAwMDA5OTksCi0JMHg4ODAwMDAwMCwKLQkweDhhOGE4OGFhLAotCTB4OGFhODg4ODgsCi0JMHg4ODg4YThhOCwKLQkweDhhODhhYTg4LAotCTB4OGFhYWFhOGEsCi0JMHg4YThhOGFhOCwKLQkweDA4YWFhODg4LAotCTB4MjIyMjIyMDAsCi0JMHgyMjIyZjIyMiwKLQkweDIyMjIyMjIyLAotCTB4MjIyMjIyZjIsCi0JMHgyMjIyMjIyMiwKLQkweDIyMjIyMjIyLAotCTB4MjJmMjIyMjIsCi0JMHgwMDAwMDIyMiwKLQkweDExMDAwMDAwLAotCTB4MTExMWYxMTEsCi0JMHgxMTExMTExMSwKLQkweDExMTExMTExLAotCTB4ZjExMTExMTEsCi0JMHgxMTExMTExMSwKLQkweDExZjExMTExLAotCTB4MDExMTExMTEsCi0JMHhiYjliYjkwMCwKLQkweGI5YjliYjk5LAotCTB4Yjk5YmJiYmIsCi0JMHhiYmJiOWI5YiwKLQkweGI5YmI5OWJiLAotCTB4Yjk5OTk5YjksCi0JMHhiOWI5Yjk5YiwKLQkweDAwMDAwYmJiLAotCTB4YWEwMDAwMDAsCi0JMHhhOGE4YWE4OCwKLQkweGE4OGFhYWFhLAotCTB4YWFhYThhOGEsCi0JMHhhOGFhODhhYSwKLQkweGE4ODg4OGE4LAotCTB4YThhOGE4OGEsCi0JMHgwYTg4OGFhYSwKLQkweGFhMDAwMDAwLAotCTB4YThhOGFhODgsCi0JMHhhODhhYWFhYSwKLQkweGFhYWE4YThhLAotCTB4YThhYTg4YTAsCi0JMHhhODg4ODhhOCwKLQkweGE4YThhODhhLAotCTB4MDAwMDBhYWEsCi0JMHg4ODAwMDAwMCwKLQkweDhhOGE4OGFhLAotCTB4OGFhODg4ODgsCi0JMHg4ODg4YThhOCwKLQkweDhhODhhYTgwLAotCTB4OGFhYWFhOGEsCi0JMHg4YThhOGFhOCwKLQkweDAwMDAwODg4LAotCTB4YmJiYmJiMDAsCi0JMHg5OTliYmJiYiwKLQkweDliYjk5YjliLAotCTB4YjliOWI5YmIsCi0JMHhiOWI5OWJiYiwKLQkweGI5YjliOWJiLAotCTB4YjliYjliOTksCi0JMHgwMDAwMDk5OSwKLQkweDhhMDAwMDAwLAotCTB4YWE4OGE4ODgsCi0JMHhhODg4ODhhYSwKLQkweGE4OGE4YTg4LAotCTB4YTg4YWE4OGEsCi0JMHg4OGE4YWFhYSwKLQkweGE4YWE4YWFhLAotCTB4MDg4OGE4OGEsCi0JMHgwYjBiMGIwMCwKLQkweDA5MGIwYjBiLAotCTB4MGIwOTBiMGIsCi0JMHgwOTA5MDkwYiwKLQkweDA5MDkwYjBiLAotCTB4MDkwOTBiMGIsCi0JMHgwOTA5MGIwOSwKLQkweDAwMDAwOTA5LAotCTB4MGEwMDAwMDAsCi0JMHgwYTA4MDgwOCwKLQkweDA4MGEwODBhLAotCTB4MDgwYTBhMDgsCi0JMHgwODBhMDgwYSwKLQkweDA4MDgwODBhLAotCTB4MGEwYTBhMDgsCi0JMHgwODA4MDgwYSwKLQkweGIwYjBiMDAwLAotCTB4OTA5MGIwYjAsCi0JMHg5MGIwOTA5MCwKLQkweGIwYjBiMDkwLAotCTB4YjBiMDkwYjAsCi0JMHg5MGIwYjBiMCwKLQkweGIwYjA5MDkwLAotCTB4MDAwMDAwOTAsCi0JMHg4MDAwMDAwMCwKLQkweGEwODBhMDgwLAotCTB4YTA4MDgwYTAsCi0JMHhhMDgwODA4MCwKLQkweGEwODBhMDgwLAotCTB4ODBhMGEwYTAsCi0JMHhhMGEwODBhMCwKLQkweDAwYTBhMGEwLAotCTB4MjIwMDAwMDAsCi0JMHgyMjIyZjIyMiwKLQkweDIyMjIyMjIyLAotCTB4MjIyMjIyZjIsCi0JMHhmMjIyMjIyMCwKLQkweDIyMjIyMjIyLAotCTB4MjJmMjIyMjIsCi0JMHgwMDAwMDIyMiwKLQkweDExMDAwMDAwLAotCTB4MTExMWYxMTEsCi0JMHgxMTExMTExMSwKLQkweDExMTExMWYxLAotCTB4ZjExMTExMTAsCi0JMHgxMTExMTExMSwKLQkweDExZjExMTExLAotCTB4MDAwMDAxMTEsCi0JMHgzMzAwMDAwMCwKLQkweDMzMzNmMzMzLAotCTB4MzMzMzMzMzMsCi0JMHgzMzMzMzNmMywKLQkweGYzMzMzMzMwLAotCTB4MzMzMzMzMzMsCi0JMHgzM2YzMzMzMywKLQkweDAwMDAwMzMzLAotCTB4MjIwMDAwMDAsCi0JMHgyMjIyZjIyMiwKLQkweDIyMjIyMjIyLAotCTB4MjIyMjIyZjIsCi0JMHhmMjIyMjIyMCwKLQkweDIyMjIyMjIyLAotCTB4MjJmMjIyMjIsCi0JMHgwMDAwMDIyMiwKLQkweDk5MDAwMDAwLAotCTB4OWI5Yjk5YmIsCi0JMHg5YmI5OTk5OSwKLQkweDk5OTliOWI5LAotCTB4OWI5OWJiOTAsCi0JMHg5YmJiYmI5YiwKLQkweDliOWI5YmI5LAotCTB4MDAwMDA5OTksCi0JMHg4ODAwMDAwMCwKLQkweDhhOGE4OGFhLAotCTB4OGFhODg4ODgsCi0JMHg4ODg4YThhOCwKLQkweDhhODhhYTgwLAotCTB4OGFhYWFhOGEsCi0JMHg4YThhOGFhOCwKLQkweDAwMDAwODg4LAotCTB4ODg4ODgwMDAsCi0JMHg4YThhODhhYSwKLQkweDhhYTg4ODg4LAotCTB4ODg4OGE4YTgsCi0JMHg4YTg4YWE4MCwKLQkweDhhYWFhYThhLAotCTB4OGE4YThhYTgsCi0JMHgwMDAwMDg4OCwKLQkweDg4MDAwMDAwLAotCTB4OGE4YTg4YWEsCi0JMHg4YWE4ODg4OCwKLQkweDg4ODhhOGE4LAotCTB4OGE4OGFhODAsCi0JMHg4YWFhYWE4YSwKLQkweDhhOGE4YWE4LAotCTB4MDBhYWE4ODgsCi0JMHg4OGE4OGEwMCwKLQkweDhhOGE4OGFhLAotCTB4OGFhODg4ODgsCi0JMHg4ODg4YThhOCwKLQkweDhhODhhYTg4LAotCTB4OGFhYWFhOGEsCi0JMHg4YThhOGFhOCwKLQkweDAwMDAwODg4LAotCTB4ODgwMDAwMDAsCi0JMHg4YThhODhhYSwKLQkweDhhYTg4ODg4LAotCTB4ODg4OGE4YTgsCi0JMHg4YTg4YWE4OCwKLQkweDhhYWFhYThhLAotCTB4OGE4YThhYTgsCi0JMHgwOGFhYTg4OCwKLQkweDExMDAwMDAwLAotCTB4MTExMWExMTEsCi0JMHgxMTExMTExMSwKLQkweDExMTExMWExLAotCTB4YTExMTExMTAsCi0JMHgxMTExMTExMSwKLQkweDExYzExMTExLAotCTB4MDAwMDAxMTEsCi0JMHgxMTAwMDAwMCwKLQkweDExMTFhMTExLAotCTB4MTExMTExMTEsCi0JMHgxMTExMTFhMSwKLQkweGExMTExMTEwLAotCTB4MTExMTExMTEsCi0JMHgxMWMxMTExMSwKLQkweDAwMDAwMTExLAotCTB4ODgwMDAwMDAsCi0JMHg4YThhODhhYSwKLQkweDhhYTg4ODg4LAotCTB4ODg4OGE4YTgsCi0JMHg4YTg4YWE4MCwKLQkweDhhYWFhYThhLAotCTB4OGE4YThhYTgsCi0JMHgwMDAwMDg4OCwKLQkweDg4MDAwMDAwLAotCTB4OGE4YTg4YWEsCi0JMHg4YWE4ODg4OCwKLQkweDg4ODhhOGE4LAotCTB4OGE4OGFhODAsCi0JMHg4YWFhYWE4YSwKLQkweDhhOGE4YWE4LAotCTB4MDAwMDA4ODgsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi19OwotCi1jb25zdCB1MzIgdGR0cm5fdGJsX3JldjBbXSA9IHsKLQkweDA2MWMwNjFjLAotCTB4MDA1MGVlNjgsCi0JMHhmNTkyZmUzNiwKLQkweGZlNTIxMmY2LAotCTB4MDAwMDBjMzgsCi0JMHhmZTUyMTJmNiwKLQkweGY1OTJmZTM2LAotCTB4MDA1MGVlNjgsCi0JMHgwNjFjMDYxYywKLQkweGVlNjgwMDUwLAotCTB4ZmUzNmY1OTIsCi0JMHgxMmY2ZmU1MiwKLQkweDBjMzgwMDAwLAotCTB4MTJmNmZlNTIsCi0JMHhmZTM2ZjU5MiwKLQkweGVlNjgwMDUwLAotCTB4MDYxYzA2MWMsCi0JMHgwMDUwZWU2OCwKLQkweGY1OTJmZTM2LAotCTB4ZmU1MjEyZjYsCi0JMHgwMDAwMGMzOCwKLQkweGZlNTIxMmY2LAotCTB4ZjU5MmZlMzYsCi0JMHgwMDUwZWU2OCwKLQkweDA2MWMwNjFjLAotCTB4ZWU2ODAwNTAsCi0JMHhmZTM2ZjU5MiwKLQkweDEyZjZmZTUyLAotCTB4MGMzODAwMDAsCi0JMHgxMmY2ZmU1MiwKLQkweGZlMzZmNTkyLAotCTB4ZWU2ODAwNTAsCi0JMHgwNWUzMDVlMywKLQkweDAwNGRlZjBjLAotCTB4ZjVmM2ZlNDcsCi0JMHhmZTYxMTI0NiwKLQkweDAwMDAwYmM3LAotCTB4ZmU2MTEyNDYsCi0JMHhmNWYzZmU0NywKLQkweDAwNGRlZjBjLAotCTB4MDVlMzA1ZTMsCi0JMHhlZjBjMDA0ZCwKLQkweGZlNDdmNWYzLAotCTB4MTI0NmZlNjEsCi0JMHgwYmM3MDAwMCwKLQkweDEyNDZmZTYxLAotCTB4ZmU0N2Y1ZjMsCi0JMHhlZjBjMDA0ZCwKLQkweDA1ZTMwNWUzLAotCTB4MDA0ZGVmMGMsCi0JMHhmNWYzZmU0NywKLQkweGZlNjExMjQ2LAotCTB4MDAwMDBiYzcsCi0JMHhmZTYxMTI0NiwKLQkweGY1ZjNmZTQ3LAotCTB4MDA0ZGVmMGMsCi0JMHgwNWUzMDVlMywKLQkweGVmMGMwMDRkLAotCTB4ZmU0N2Y1ZjMsCi0JMHgxMjQ2ZmU2MSwKLQkweDBiYzcwMDAwLAotCTB4MTI0NmZlNjEsCi0JMHhmZTQ3ZjVmMywKLQkweGVmMGMwMDRkLAotCTB4ZmE1OGZhNTgsCi0JMHhmODk1MDQzYiwKLQkweGZmNGMwOWMwLAotCTB4ZmJjNmZmYTgsCi0JMHhmYjg0ZjM4NCwKLQkweDA3OThmNmY5LAotCTB4MDU3NjAxMjIsCi0JMHgwNTg0MDlmNiwKLQkweDBiNTAwMDAwLAotCTB4MDViN2Y1NDIsCi0JMHgwODg2MDQzMiwKLQkweDA2ZGRmZWU3LAotCTB4ZmI4NGYzODQsCi0JMHhmOWQ5MDY2NCwKLQkweGY3ZTgwMjVjLAotCTB4MDBmZmY3YmQsCi0JMHgwNWE4MDVhOCwKLQkweGY3YmQwMGZmLAotCTB4MDI1Y2Y3ZTgsCi0JMHgwNjY0ZjlkOSwKLQkweGYzODRmYjg0LAotCTB4ZmVlNzA2ZGQsCi0JMHgwNDMyMDg4NiwKLQkweGY1NDIwNWI3LAotCTB4MDAwMDBiNTAsCi0JMHgwOWY2MDU4NCwKLQkweDAxMjIwNTc2LAotCTB4ZjZmOTA3OTgsCi0JMHhmMzg0ZmI4NCwKLQkweGZmYThmYmM2LAotCTB4MDljMGZmNGMsCi0JMHgwNDNiZjg5NSwKLQkweDAyZDQwMmQ0LAotCTB4MDdkZTAyNzAsCi0JMHhmYzk2MDc5YywKLQkweGY5MGFmZTk0LAotCTB4ZmUwMGZmMmMsCi0JMHgwMmQ0MDY1ZCwKLQkweDA5MmEwMDk2LAotCTB4MDAxNGZiYjgsCi0JMHhmZDJjZmQyYywKLQkweDA3NmFmYjNjLAotCTB4MDA5NmY3NTIsCi0JMHhmOTkxZmQ4NywKLQkweGZiMmMwMjAwLAotCTB4ZmViOGY5NjAsCi0JMHgwOGUwZmM5NiwKLQkweDA0OTgwMmE4LAotCTB4ZmQyY2ZkMmMsCi0JMHgwMmE4MDQ5OCwKLQkweGZjOTYwOGUwLAotCTB4Zjk2MGZlYjgsCi0JMHgwMjAwZmIyYywKLQkweGZkODdmOTkxLAotCTB4Zjc1MjAwOTYsCi0JMHhmYjNjMDc2YSwKLQkweGZkMmNmZDJjLAotCTB4ZmJiODAwMTQsCi0JMHgwMDk2MDkyYSwKLQkweDA2NWQwMmQ0LAotCTB4ZmYyY2ZlMDAsCi0JMHhmZTk0ZjkwYSwKLQkweDA3OWNmYzk2LAotCTB4MDI3MDA3ZGUsCi0JMHgwMmQ0MDJkNCwKLQkweDAyNzAwN2RlLAotCTB4MDc5Y2ZjOTYsCi0JMHhmZTk0ZjkwYSwKLQkweGZmMmNmZTAwLAotCTB4MDY1ZDAyZDQsCi0JMHgwMDk2MDkyYSwKLQkweGZiYjgwMDE0LAotCTB4ZmQyY2ZkMmMsCi0JMHhmYjNjMDc2YSwKLQkweGY3NTIwMDk2LAotCTB4ZmQ4N2Y5OTEsCi0JMHgwMjAwZmIyYywKLQkweGY5NjBmZWI4LAotCTB4ZmM5NjA4ZTAsCi0JMHgwMmE4MDQ5OCwKLQkweGZkMmNmZDJjLAotCTB4MDQ5ODAyYTgsCi0JMHgwOGUwZmM5NiwKLQkweGZlYjhmOTYwLAotCTB4ZmIyYzAyMDAsCi0JMHhmOTkxZmQ4NywKLQkweDAwOTZmNzUyLAotCTB4MDc2YWZiM2MsCi0JMHhmZDJjZmQyYywKLQkweDAwMTRmYmI4LAotCTB4MDkyYTAwOTYsCi0JMHgwMmQ0MDY1ZCwKLQkweGZlMDBmZjJjLAotCTB4ZjkwYWZlOTQsCi0JMHhmYzk2MDc5YywKLQkweDA3ZGUwMjcwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDYyYTAwMDAsCi0JMHhmZWZhMDc1OSwKLQkweDA4YjgwOTA4LAotCTB4ZjM5NmZjMmQsCi0JMHhmOWQ2MDQ1YywKLQkweGZjNGVmNjA4LAotCTB4Zjc0OGY1OTYsCi0JMHgwN2IyMDdiZiwKLQkweDA2MmEwNjJhLAotCTB4Zjg0ZWY4NDEsCi0JMHhmNzQ4ZjU5NiwKLQkweDAzYjIwOWY4LAotCTB4ZjlkNjA0NWMsCi0JMHgwYzZhMDNkMywKLQkweDA4YjgwOTA4LAotCTB4MDEwNmY4YTcsCi0JMHgwNjJhMDAwMCwKLQkweGZlZmFmOGE3LAotCTB4MDhiOGY2ZjgsCi0JMHhmMzk2MDNkMywKLQkweGY5ZDZmYmE0LAotCTB4ZmM0ZTA5ZjgsCi0JMHhmNzQ4MGE2YSwKLQkweDA3YjJmODQxLAotCTB4MDYyYWY5ZDYsCi0JMHhmODRlMDdiZiwKLQkweGY3NDgwYTZhLAotCTB4MDNiMmY2MDgsCi0JMHhmOWQ2ZmJhNCwKLQkweDBjNmFmYzJkLAotCTB4MDhiOGY2ZjgsCi0JMHgwMTA2MDc1OSwKLQkweDA2MmEwMDAwLAotCTB4ZmVmYTA3NTksCi0JMHgwOGI4MDkwOCwKLQkweGYzOTZmYzJkLAotCTB4ZjlkNjA0NWMsCi0JMHhmYzRlZjYwOCwKLQkweGY3NDhmNTk2LAotCTB4MDdiMjA3YmYsCi0JMHgwNjJhMDYyYSwKLQkweGY4NGVmODQxLAotCTB4Zjc0OGY1OTYsCi0JMHgwM2IyMDlmOCwKLQkweGY5ZDYwNDVjLAotCTB4MGM2YTAzZDMsCi0JMHgwOGI4MDkwOCwKLQkweDAxMDZmOGE3LAotCTB4MDYyYTAwMDAsCi0JMHhmZWZhZjhhNywKLQkweDA4YjhmNmY4LAotCTB4ZjM5NjAzZDMsCi0JMHhmOWQ2ZmJhNCwKLQkweGZjNGUwOWY4LAotCTB4Zjc0ODBhNmEsCi0JMHgwN2IyZjg0MSwKLQkweDA2MmFmOWQ2LAotCTB4Zjg0ZTA3YmYsCi0JMHhmNzQ4MGE2YSwKLQkweDAzYjJmNjA4LAotCTB4ZjlkNmZiYTQsCi0JMHgwYzZhZmMyZCwKLQkweDA4YjhmNmY4LAotCTB4MDEwNjA3NTksCi0JMHgwNjFjMDYxYywKLQkweGZmMzAwMDlkLAotCTB4ZmZiMjExNDEsCi0JMHhmZDg3ZmI1NCwKLQkweGY2NWRmZTU5LAotCTB4MDJlZWY5OWUsCi0JMHgwMTY2ZjAzYywKLQkweGZmZjgwOWI2LAotCTB4MDAwMDA4YTQsCi0JMHgwMDBhZjQyYiwKLQkweDAwZWZmNTc3LAotCTB4ZmE4NDBiZjIsCi0JMHhmYzAyZmY1MSwKLQkweDA4MjYwZjY3LAotCTB4ZmZmMDAzNmYsCi0JMHgwODQyZjljMywKLQkweDAwMDAwMDAwLAotCTB4MDYzZGY3YmUsCi0JMHhmYzkxMDAxMCwKLQkweGYwOTlmN2RhLAotCTB4MDBhZjAzZmUsCi0JMHhmNDBlMDU3YywKLQkweDBhODlmZjExLAotCTB4MGJkNWZmZjYsCi0JMHhmNzVjMDAwMCwKLQkweGY2NGEwMDA4LAotCTB4MGZjNGZlOWEsCi0JMHgwNjYyZmQxMiwKLQkweDAxYTcwOWEzLAotCTB4MDRhYzAyNzksCi0JMHhlZWJmMDA0ZSwKLQkweGZmNjMwMGQwLAotCTB4ZjllNGY5ZTQsCi0JMHgwMGQwZmY2MywKLQkweDAwNGVlZWJmLAotCTB4MDI3OTA0YWMsCi0JMHgwOWEzMDFhNywKLQkweGZkMTIwNjYyLAotCTB4ZmU5YTBmYzQsCi0JMHgwMDA4ZjY0YSwKLQkweDAwMDBmNzVjLAotCTB4ZmZmNjBiZDUsCi0JMHhmZjExMGE4OSwKLQkweDA1N2NmNDBlLAotCTB4MDNmZTAwYWYsCi0JMHhmN2RhZjA5OSwKLQkweDAwMTBmYzkxLAotCTB4ZjdiZTA2M2QsCi0JMHgwMDAwMDAwMCwKLQkweGY5YzMwODQyLAotCTB4MDM2ZmZmZjAsCi0JMHgwZjY3MDgyNiwKLQkweGZmNTFmYzAyLAotCTB4MGJmMmZhODQsCi0JMHhmNTc3MDBlZiwKLQkweGY0MmIwMDBhLAotCTB4MDhhNDAwMDAsCi0JMHgwOWI2ZmZmOCwKLQkweGYwM2MwMTY2LAotCTB4Zjk5ZTAyZWUsCi0JMHhmZTU5ZjY1ZCwKLQkweGZiNTRmZDg3LAotCTB4MTE0MWZmYjIsCi0JMHgwMDlkZmYzMCwKLQkweDA1ZTMwMDAwLAotCTB4ZmYwNjA3MDUsCi0JMHgwODU0MDhhMCwKLQkweGY0MjVmYzU5LAotCTB4ZmExZDA0MmEsCi0JMHhmYzc4ZjY3YSwKLQkweGY3YWNmNjBlLAotCTB4MDc1YTA3NjYsCi0JMHgwNWUzMDVlMywKLQkweGY4YTZmODlhLAotCTB4ZjdhY2Y2MGUsCi0JMHgwMzg4MDk4NiwKLQkweGZhMWQwNDJhLAotCTB4MGJkYjAzYTcsCi0JMHgwODU0MDhhMCwKLQkweDAwZmFmOGZiLAotCTB4MDVlMzAwMDAsCi0JMHhmZjA2ZjhmYiwKLQkweDA4NTRmNzYwLAotCTB4ZjQyNTAzYTcsCi0JMHhmYTFkZmJkNiwKLQkweGZjNzgwOTg2LAotCTB4ZjdhYzA5ZjIsCi0JMHgwNzVhZjg5YSwKLQkweDA1ZTNmYTFkLAotCTB4ZjhhNjA3NjYsCi0JMHhmN2FjMDlmMiwKLQkweDAzODhmNjdhLAotCTB4ZmExZGZiZDYsCi0JMHgwYmRiZmM1OSwKLQkweDA4NTRmNzYwLAotCTB4MDBmYTA3MDUsCi0JMHgwNWUzMDAwMCwKLQkweGZmMDYwNzA1LAotCTB4MDg1NDA4YTAsCi0JMHhmNDI1ZmM1OSwKLQkweGZhMWQwNDJhLAotCTB4ZmM3OGY2N2EsCi0JMHhmN2FjZjYwZSwKLQkweDA3NWEwNzY2LAotCTB4MDVlMzA1ZTMsCi0JMHhmOGE2Zjg5YSwKLQkweGY3YWNmNjBlLAotCTB4MDM4ODA5ODYsCi0JMHhmYTFkMDQyYSwKLQkweDBiZGIwM2E3LAotCTB4MDg1NDA4YTAsCi0JMHgwMGZhZjhmYiwKLQkweDA1ZTMwMDAwLAotCTB4ZmYwNmY4ZmIsCi0JMHgwODU0Zjc2MCwKLQkweGY0MjUwM2E3LAotCTB4ZmExZGZiZDYsCi0JMHhmYzc4MDk4NiwKLQkweGY3YWMwOWYyLAotCTB4MDc1YWY4OWEsCi0JMHgwNWUzZmExZCwKLQkweGY4YTYwNzY2LAotCTB4ZjdhYzA5ZjIsCi0JMHgwMzg4ZjY3YSwKLQkweGZhMWRmYmQ2LAotCTB4MGJkYmZjNTksCi0JMHgwODU0Zjc2MCwKLQkweDAwZmEwNzA1LAotCTB4ZmE1OGZhNTgsCi0JMHhmOGYwZmUwMCwKLQkweDA0NDgwNzNkLAotCTB4ZmRjOWZlNDYsCi0JMHhmOTkxMDI1OCwKLQkweDA4OWQwNDA3LAotCTB4ZmQ1Y2Y3MWEsCi0JMHgwMmFmZmRlMCwKLQkweDA4M2UwNDk2LAotCTB4ZmY1YTA3NDAsCi0JMHhmZjdhZmQ5NywKLQkweDAwZmUwMWYxLAotCTB4MDAwOTA4MmUsCi0JMHhmYTk0ZmY3NSwKLQkweGZlY2RmOGVhLAotCTB4ZmZiMGY2OTMsCi0JMHhmZDJjZmE1OCwKLQkweDA0MzNmZjE2LAotCTB4ZmJhNDA1ZGQsCi0JMHhmYTYxMDM0MSwKLQkweDA2YTYwNmNiLAotCTB4MDAzOWZkMmQsCi0JMHgwNjc3ZmE5NywKLQkweDAxZmEwNWUwLAotCTB4Zjg5NjAwM2UsCi0JMHgwNzVhMDY4YiwKLQkweDAxMmNmYzNlLAotCTB4ZmEyM2Y5OGQsCi0JMHhmYzdjZmQ0MywKLQkweGZmOTBmYzBkLAotCTB4MDFjMTA5ODIsCi0JMHgwMGM2MDFkNiwKLQkweGZkMmNmZDJjLAotCTB4MDFkNjAwYzYsCi0JMHgwOTgyMDFjMSwKLQkweGZjMGRmZjkwLAotCTB4ZmQ0M2ZjN2MsCi0JMHhmOThkZmEyMywKLQkweGZjM2UwMTJjLAotCTB4MDY4YjA3NWEsCi0JMHgwMDNlZjg5NiwKLQkweDA1ZTAwMWZhLAotCTB4ZmE5NzA2NzcsCi0JMHhmZDJkMDAzOSwKLQkweDA2Y2IwNmE2LAotCTB4MDM0MWZhNjEsCi0JMHgwNWRkZmJhNCwKLQkweGZmMTYwNDMzLAotCTB4ZmE1OGZkMmMsCi0JMHhmNjkzZmZiMCwKLQkweGY4ZWFmZWNkLAotCTB4ZmY3NWZhOTQsCi0JMHgwODJlMDAwOSwKLQkweDAxZjEwMGZlLAotCTB4ZmQ5N2ZmN2EsCi0JMHgwNzQwZmY1YSwKLQkweDA0OTYwODNlLAotCTB4ZmRlMDAyYWYsCi0JMHhmNzFhZmQ1YywKLQkweDA0MDcwODlkLAotCTB4MDI1OGY5OTEsCi0JMHhmZTQ2ZmRjOSwKLQkweDA3M2QwNDQ4LAotCTB4ZmUwMGY4ZjAsCi0JMHhmZDJjZmQyYywKLQkweGZjZTAwNTAwLAotCTB4ZmMwOWZkZGMsCi0JMHhmZTY4MDE1NywKLQkweDA0YzcwNTcxLAotCTB4ZmMzYWZmMjEsCi0JMHhmY2Q3MDIyOCwKLQkweDA1NmQwMjc3LAotCTB4MDIwMGZlMDAsCi0JMHgwMDIyZjkyNywKLQkweGZlM2MwMzJiLAotCTB4ZmM0NGZmM2MsCi0JMHgwM2U5ZmJkYiwKLQkweDA0NTcwMzEzLAotCTB4MDRjOWZmNWMsCi0JMHgwMDBkMDNiOCwKLQkweGZhNTgwMDAwLAotCTB4ZmJlOTAwZDIsCi0JMHhmOWQwZmUwYiwKLQkweDAxMjVmZGY5LAotCTB4MDQyNTAxYmYsCi0JMHgwMzI4ZmEyYiwKLQkweGZmYTkwMmYwLAotCTB4ZmEyNTAxNTcsCi0JMHgwMjAwZmUwMCwKLQkweDAzNzQwNDM4LAotCTB4ZmYwNDA1ZmQsCi0JMHgwMzBjZmU1MiwKLQkweDAwMzdmYjM5LAotCTB4ZmY2OTA0YzUsCi0JMHgwNGY4ZmQyMywKLQkweGZkMzFmYzFiLAotCTB4ZmQyY2ZkMmMsCi0JMHhmYzFiZmQzMSwKLQkweGZkMjMwNGY4LAotCTB4MDRjNWZmNjksCi0JMHhmYjM5MDAzNywKLQkweGZlNTIwMzBjLAotCTB4MDVmZGZmMDQsCi0JMHgwNDM4MDM3NCwKLQkweGZlMDAwMjAwLAotCTB4MDE1N2ZhMjUsCi0JMHgwMmYwZmZhOSwKLQkweGZhMmIwMzI4LAotCTB4MDFiZjA0MjUsCi0JMHhmZGY5MDEyNSwKLQkweGZlMGJmOWQwLAotCTB4MDBkMmZiZTksCi0JMHgwMDAwZmE1OCwKLQkweDAzYjgwMDBkLAotCTB4ZmY1YzA0YzksCi0JMHgwMzEzMDQ1NywKLQkweGZiZGIwM2U5LAotCTB4ZmYzY2ZjNDQsCi0JMHgwMzJiZmUzYywKLQkweGY5MjcwMDIyLAotCTB4ZmUwMDAyMDAsCi0JMHgwMjc3MDU2ZCwKLQkweDAyMjhmY2Q3LAotCTB4ZmYyMWZjM2EsCi0JMHgwNTcxMDRjNywKLQkweDAxNTdmZTY4LAotCTB4ZmRkY2ZjMDksCi0JMHgwNTAwZmNlMCwKLQkweGZkMmNmZDJjLAotCTB4MDUwMGZjZTAsCi0JMHhmZGRjZmMwOSwKLQkweDAxNTdmZTY4LAotCTB4MDU3MTA0YzcsCi0JMHhmZjIxZmMzYSwKLQkweDAyMjhmY2Q3LAotCTB4MDI3NzA1NmQsCi0JMHhmZTAwMDIwMCwKLQkweGY5MjcwMDIyLAotCTB4MDMyYmZlM2MsCi0JMHhmZjNjZmM0NCwKLQkweGZiZGIwM2U5LAotCTB4MDMxMzA0NTcsCi0JMHhmZjVjMDRjOSwKLQkweDAzYjgwMDBkLAotCTB4MDAwMGZhNTgsCi0JMHgwMGQyZmJlOSwKLQkweGZlMGJmOWQwLAotCTB4ZmRmOTAxMjUsCi0JMHgwMWJmMDQyNSwKLQkweGZhMmIwMzI4LAotCTB4MDJmMGZmYTksCi0JMHgwMTU3ZmEyNSwKLQkweGZlMDAwMjAwLAotCTB4MDQzODAzNzQsCi0JMHgwNWZkZmYwNCwKLQkweGZlNTIwMzBjLAotCTB4ZmIzOTAwMzcsCi0JMHgwNGM1ZmY2OSwKLQkweGZkMjMwNGY4LAotCTB4ZmMxYmZkMzEsCi0JMHhmZDJjZmQyYywKLQkweGZkMzFmYzFiLAotCTB4MDRmOGZkMjMsCi0JMHhmZjY5MDRjNSwKLQkweDAwMzdmYjM5LAotCTB4MDMwY2ZlNTIsCi0JMHhmZjA0MDVmZCwKLQkweDAzNzQwNDM4LAotCTB4MDIwMGZlMDAsCi0JMHhmYTI1MDE1NywKLQkweGZmYTkwMmYwLAotCTB4MDMyOGZhMmIsCi0JMHgwNDI1MDFiZiwKLQkweDAxMjVmZGY5LAotCTB4ZjlkMGZlMGIsCi0JMHhmYmU5MDBkMiwKLQkweGZhNTgwMDAwLAotCTB4MDAwZDAzYjgsCi0JMHgwNGM5ZmY1YywKLQkweDA0NTcwMzEzLAotCTB4MDNlOWZiZGIsCi0JMHhmYzQ0ZmYzYywKLQkweGZlM2MwMzJiLAotCTB4MDAyMmY5MjcsCi0JMHgwMjAwZmUwMCwKLQkweDA1NmQwMjc3LAotCTB4ZmNkNzAyMjgsCi0JMHhmYzNhZmYyMSwKLQkweDA0YzcwNTcxLAotCTB4ZmU2ODAxNTcsCi0JMHhmYzA5ZmRkYywKLQkweGZjZTAwNTAwLAotCTB4MDVhODAwMDAsCi0JMHhmZjEwMDZiZSwKLQkweDA4MDAwODRhLAotCTB4ZjQ5Y2ZjN2UsCi0JMHhmYTU4MDQwMCwKLQkweGZjOWNmNmRhLAotCTB4ZjgwMGY2NzIsCi0JMHgwNzEwMDcxYywKLQkweDA1YTgwNWE4LAotCTB4ZjhmMGY4ZTQsCi0JMHhmODAwZjY3MiwKLQkweDAzNjQwOTI2LAotCTB4ZmE1ODA0MDAsCi0JMHgwYjY0MDM4MiwKLQkweDA4MDAwODRhLAotCTB4MDBmMGY5NDIsCi0JMHgwNWE4MDAwMCwKLQkweGZmMTBmOTQyLAotCTB4MDgwMGY3YjYsCi0JMHhmNDljMDM4MiwKLQkweGZhNThmYzAwLAotCTB4ZmM5YzA5MjYsCi0JMHhmODAwMDk4ZSwKLQkweDA3MTBmOGU0LAotCTB4MDVhOGZhNTgsCi0JMHhmOGYwMDcxYywKLQkweGY4MDAwOThlLAotCTB4MDM2NGY2ZGEsCi0JMHhmYTU4ZmMwMCwKLQkweDBiNjRmYzdlLAotCTB4MDgwMGY3YjYsCi0JMHgwMGYwMDZiZSwKLQkweDA1YTgwMDAwLAotCTB4ZmYxMDA2YmUsCi0JMHgwODAwMDg0YSwKLQkweGY0OWNmYzdlLAotCTB4ZmE1ODA0MDAsCi0JMHhmYzljZjZkYSwKLQkweGY4MDBmNjcyLAotCTB4MDcxMDA3MWMsCi0JMHgwNWE4MDVhOCwKLQkweGY4ZjBmOGU0LAotCTB4ZjgwMGY2NzIsCi0JMHgwMzY0MDkyNiwKLQkweGZhNTgwNDAwLAotCTB4MGI2NDAzODIsCi0JMHgwODAwMDg0YSwKLQkweDAwZjBmOTQyLAotCTB4MDVhODAwMDAsCi0JMHhmZjEwZjk0MiwKLQkweDA4MDBmN2I2LAotCTB4ZjQ5YzAzODIsCi0JMHhmYTU4ZmMwMCwKLQkweGZjOWMwOTI2LAotCTB4ZjgwMDA5OGUsCi0JMHgwNzEwZjhlNCwKLQkweDA1YThmYTU4LAotCTB4ZjhmMDA3MWMsCi0JMHhmODAwMDk4ZSwKLQkweDAzNjRmNmRhLAotCTB4ZmE1OGZjMDAsCi0JMHgwYjY0ZmM3ZSwKLQkweDA4MDBmN2I2LAotCTB4MDBmMDA2YmUsCi19OwotCi1jb25zdCB1MzIgaW50bHZfdGJsX3JldjBbXSA9IHsKLQkweDAwODAyMDcwLAotCTB4MDY3MTE4OGQsCi0JMHgwYTYwMTkyYywKLQkweDBhMzAwZTQ2LAotCTB4MDBjMTE4OGQsCi0JMHgwODAwMjRkMiwKLQkweDAwMDAwMDcwLAotfTsKLQotY29uc3QgdTE2IHBpbG90X3RibF9yZXYwW10gPSB7Ci0JMHhmZjA4LAotCTB4ZmYwOCwKLQkweGZmMDgsCi0JMHhmZjA4LAotCTB4ZmYwOCwKLQkweGZmMDgsCi0JMHhmZjA4LAotCTB4ZmYwOCwKLQkweDgwZDUsCi0JMHg4MGQ1LAotCTB4ODBkNSwKLQkweDgwZDUsCi0JMHg4MGQ1LAotCTB4ODBkNSwKLQkweDgwZDUsCi0JMHg4MGQ1LAotCTB4ZmYwYSwKLQkweGZmODIsCi0JMHhmZmEwLAotCTB4ZmYyOCwKLQkweGZmZmYsCi0JMHhmZmZmLAotCTB4ZmZmZiwKLQkweGZmZmYsCi0JMHhmZjgyLAotCTB4ZmZhMCwKLQkweGZmMjgsCi0JMHhmZjBhLAotCTB4ZmZmZiwKLQkweGZmZmYsCi0JMHhmZmZmLAotCTB4ZmZmZiwKLQkweGY4M2YsCi0JMHhmYTFmLAotCTB4ZmE5NywKLQkweGZhYjUsCi0JMHhmMmJkLAotCTB4ZjBiZiwKLQkweGZmZmYsCi0JMHhmZmZmLAotCTB4ZjAxNywKLQkweGY4MTUsCi0JMHhmMjE1LAotCTB4ZjA5NSwKLQkweGYwMzUsCi0JMHhmMDFkLAotCTB4ZmZmZiwKLQkweGZmZmYsCi0JMHhmZjA4LAotCTB4ZmYwMiwKLQkweGZmODAsCi0JMHhmZjIwLAotCTB4ZmYwOCwKLQkweGZmMDIsCi0JMHhmZjgwLAotCTB4ZmYyMCwKLQkweGYwMWYsCi0JMHhmODE3LAotCTB4ZmExNSwKLQkweGYyOTUsCi0JMHhmMGI1LAotCTB4ZjAzZCwKLQkweGZmZmYsCi0JMHhmZmZmLAotCTB4ZjgyYSwKLQkweGZhMGEsCi0JMHhmYTgyLAotCTB4ZmFhMCwKLQkweGYyYTgsCi0JMHhmMGFhLAotCTB4ZmZmZiwKLQkweGZmZmYsCi0JMHhmMDAyLAotCTB4ZjgwMCwKLQkweGYyMDAsCi0JMHhmMDgwLAotCTB4ZjAyMCwKLQkweGYwMDgsCi0JMHhmZmZmLAotCTB4ZmZmZiwKLQkweGYwMGEsCi0JMHhmODAyLAotCTB4ZmEwMCwKLQkweGYyODAsCi0JMHhmMGEwLAotCTB4ZjAyOCwKLQkweGZmZmYsCi0JMHhmZmZmLAotfTsKLQotY29uc3QgdTMyIHBsdGx1dF90YmxfcmV2MFtdID0gewotCTB4NzY1NDAxMjMsCi0JMHg2MjQwNzM1MSwKLQkweDc2NTQzMjAxLAotCTB4NzY1NDAyMTMsCi0JMHg3NjU0MDEyMywKLQkweDc2NDMwNTIxLAotfTsKLQotY29uc3QgdTMyIHRkaV90YmwyMF9hbnQwX3JldjBbXSA9IHsKLQkweDAwMDkxMjI2LAotCTB4MDAwYTE0MjksCi0JMHgwMDBiNTZhZCwKLQkweDAwMGM1OGIwLAotCTB4MDAwZDVhYjMsCi0JMHgwMDBlOWNiNiwKLQkweDAwMGY5ZWJhLAotCTB4MDAwMGMxM2QsCi0JMHgwMDAyMDMwMSwKLQkweDAwMDMwNTA0LAotCTB4MDAwNDA3MDgsCi0JMHgwMDA1MDkwYiwKLQkweDAwMDY0YjhlLAotCTB4MDAwOTUyOTEsCi0JMHgwMDBhNTQ5NCwKLQkweDAwMGI5NzE4LAotCTB4MDAwYzk5MjcsCi0JMHgwMDBkOWIyYSwKLQkweDAwMGVkZDJlLAotCTB4MDAwZmRmMzEsCi0JMHgwMDAxMDFiNCwKLQkweDAwMDI0M2I3LAotCTB4MDAwMzQ1YmIsCi0JMHgwMDA0NDdiZSwKLQkweDAwMDU4OTgyLAotCTB4MDAwNjhjMDUsCi0JMHgwMDA5OTMwOSwKLQkweDAwMGE5NTBjLAotCTB4MDAwYmQ3OGYsCi0JMHgwMDBjZDk5MiwKLQkweDAwMGRkYjk2LAotCTB4MDAwZjFkOTksCi0JMHgwMDAwNWZhOCwKLQkweDAwMDE0MjJjLAotCTB4MDAwMjg0MmYsCi0JMHgwMDAzODYzMiwKLQkweDAwMDQ4ODM1LAotCTB4MDAwNWNhMzgsCi0JMHgwMDA2Y2NiYywKLQkweDAwMDlkM2JmLAotCTB4MDAwYjE2MDMsCi0JMHgwMDBjMTgwNiwKLQkweDAwMGQxYTBhLAotCTB4MDAwZTFjMGQsCi0JMHgwMDBmNWUxMCwKLQkweDAwMDA4MDkzLAotCTB4MDAwMTgyOTcsCi0JMHgwMDAyYzQ5YSwKLQkweDAwMDNjNjgwLAotCTB4MDAwNGM4ODAsCi0JMHgwMDA2MGIwMCwKLQkweDAwMDcwZDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotfTsKLQotY29uc3QgdTMyIHRkaV90YmwyMF9hbnQxX3JldjBbXSA9IHsKLQkweDAwMDE0YjI2LAotCTB4MDAwMjhkMjksCi0JMHgwMDAzOTNhZCwKLQkweDAwMDQ5NjMwLAotCTB4MDAwNWQ4MzMsCi0JMHgwMDA2ZGEzNiwKLQkweDAwMDk5YzNhLAotCTB4MDAwYTllM2QsCi0JMHgwMDBiYzA4MSwKLQkweDAwMGNjMjg0LAotCTB4MDAwZGM0ODgsCi0JMHgwMDBmMDY4YiwKLQkweDAwMDA0ODhlLAotCTB4MDAwMThiOTEsCi0JMHgwMDAyZDIxNCwKLQkweDAwMDNkNDE4LAotCTB4MDAwNGQ2YTcsCi0JMHgwMDA2MThhYSwKLQkweDAwMDcxYWFlLAotCTB4MDAwOWRjYjEsCi0JMHgwMDBiMWViNCwKLQkweDAwMGMwMTM3LAotCTB4MDAwZDAzM2IsCi0JMHgwMDBlMDUzZSwKLQkweDAwMGY0NzAyLAotCTB4MDAwMDg5MDUsCi0JMHgwMDAyMGMwOSwKLQkweDAwMDMxMjhjLAotCTB4MDAwNDE0OGYsCi0JMHgwMDA1MTcxMiwKLQkweDAwMDY1OTE2LAotCTB4MDAwOTFiMTksCi0JMHgwMDBhMWQyOCwKLQkweDAwMGI1ZjJjLAotCTB4MDAwYzQxYWYsCi0JMHgwMDBkNDNiMiwKLQkweDAwMGU4NWI1LAotCTB4MDAwZjg3YjgsCi0JMHgwMDAwYzliYywKLQkweDAwMDI0Y2JmLAotCTB4MDAwMzUzMDMsCi0JMHgwMDA0NTUwNiwKLQkweDAwMDU5NzhhLAotCTB4MDAwNjk5OGQsCi0JMHgwMDA5NWI5MCwKLQkweDAwMGE1ZDkzLAotCTB4MDAwYjlmOTcsCi0JMHgwMDBjODIxYSwKLQkweDAwMGQ4NDAwLAotCTB4MDAwZWM2MDAsCi0JMHgwMDBmYzgwMCwKLQkweDAwMDEwYTAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotfTsKLQotY29uc3QgdTMyIHRkaV90Ymw0MF9hbnQwX3JldjBbXSA9IHsKLQkweDAwMTFhMzQ2LAotCTB4MDAxMzZjY2YsCi0JMHgwMDE0ZjVkOSwKLQkweDAwMTY0MWUyLAotCTB4MDAxN2NiNmIsCi0JMHgwMDE5NTQ3NSwKLQkweDAwMWIyMzgzLAotCTB4MDAxY2FkMGMsCi0JMHgwMDFlNzYxNiwKLQkweDAwMDA4MjFmLAotCTB4MDAwMjBiYTgsCi0JMHgwMDAzZDRiMiwKLQkweDAwMDU2NDQ3LAotCTB4MDAwNzJkZDAsCi0JMHgwMDA4YjZkYSwKLQkweDAwMGEwMmUzLAotCTB4MDAwYjhjNmMsCi0JMHgwMDBkMTVmNiwKLQkweDAwMTFlNDg0LAotCTB4MDAxM2FlMGQsCi0JMHgwMDE1MzcxNywKLQkweDAwMTY4MzIwLAotCTB4MDAxODBjYTksCi0JMHgwMDE5OTYzMywKLQkweDAwMWI2NTQ4LAotCTB4MDAxY2VlZDEsCi0JMHgwMDFlYjdkYiwKLQkweDAwMDBjM2U0LAotCTB4MDAwMjRkNmQsCi0JMHgwMDA0MTZmNywKLQkweDAwMDVhNTg1LAotCTB4MDAwNzZmMGYsCi0JMHgwMDA4ZjgxOCwKLQkweDAwMGE0NDIxLAotCTB4MDAwYmNkYWIsCi0JMHgwMDBkOTczNCwKLQkweDAwMTIyNjQ5LAotCTB4MDAxM2VmZDIsCi0JMHgwMDE1NzhkYywKLQkweDAwMTZjNGU1LAotCTB4MDAxODRlNmUsCi0JMHgwMDFhMTdmOCwKLQkweDAwMWJhNjg2LAotCTB4MDAxZDMwMTAsCi0JMHgwMDFlZjk5OSwKLQkweDAwMDEwNTIyLAotCTB4MDAwMjhlYWMsCi0JMHgwMDA0NTgzNSwKLQkweDAwMDVlNzRhLAotCTB4MDAwN2IwZDMsCi0JMHgwMDA5M2E1ZCwKLQkweDAwMGE4NWU2LAotCTB4MDAwYzBmNmYsCi0JMHgwMDBkZDhmOSwKLQkweDAwMTI2Nzg3LAotCTB4MDAxNDMxMTEsCi0JMHgwMDE1YmE5YSwKLQkweDAwMTcwNjIzLAotCTB4MDAxODhmYWQsCi0JMHgwMDFhNTkzNiwKLQkweDAwMWJlODRiLAotCTB4MDAxZGIxZDQsCi0JMHgwMDFmM2I1ZSwKLQkweDAwMDE0NmU3LAotCTB4MDAwMzEwNzAsCi0JMHgwMDA0OTlmYSwKLQkweDAwMDYyODg4LAotCTB4MDAwN2YyMTIsCi0JMHgwMDA5N2I5YiwKLQkweDAwMGFjN2E0LAotCTB4MDAwYzUwYWUsCi0JMHgwMDBlMWEzNywKLQkweDAwMTJhOTRjLAotCTB4MDAxNDcyZDUsCi0JMHgwMDE1ZmM1ZiwKLQkweDAwMTc0ODY4LAotCTB4MDAxOGQxNzEsCi0JMHgwMDFhOWFmYiwKLQkweDAwMWMyOTg5LAotCTB4MDAxZGYzMTMsCi0JMHgwMDFmN2M5YywKLQkweDAwMDE4OGE1LAotCTB4MDAwMzUxYWYsCi0JMHgwMDA0ZGIzOCwKLQkweDAwMDZhYTRkLAotCTB4MDAwODMzZDcsCi0JMHgwMDA5YmQ2MCwKLQkweDAwMGIwOTY5LAotCTB4MDAwYzkyNzMsCi0JMHgwMDBlNWJmYywKLQkweDAwMTMyYThhLAotCTB4MDAxNGI0MTQsCi0JMHgwMDE2M2Q5ZCwKLQkweDAwMTc4OWE2LAotCTB4MDAxOTEyYjAsCi0JMHgwMDFhZGMzOSwKLQkweDAwMWM2YmNlLAotCTB4MDAxZTM0ZDgsCi0JMHgwMDFmYmU2MSwKLQkweDAwMDFjYTZhLAotCTB4MDAwMzkzNzQsCi0JMHgwMDA1MWNmZCwKLQkweDAwMDZlYzBiLAotCTB4MDAwODc1MTUsCi0JMHgwMDA5ZmU5ZSwKLQkweDAwMGI0YWE3LAotCTB4MDAwY2QzYjEsCi0JMHgwMDBlOWQzYSwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi19OwotCi1jb25zdCB1MzIgdGRpX3RibDQwX2FudDFfcmV2MFtdID0gewotCTB4MDAxZWRiMzYsCi0JMHgwMDAxMjljYSwKLQkweDAwMDJiMzUzLAotCTB4MDAwNDdjZGQsCi0JMHgwMDA1YzhlNiwKLQkweDAwMDc5MWVmLAotCTB4MDAwOTFiZjksCi0JMHgwMDBhYWEwNywKLQkweDAwMGMzMzkxLAotCTB4MDAwZGZkMWEsCi0JMHgwMDEyMDkyMywKLQkweDAwMTNkMjJkLAotCTB4MDAxNTVjMzcsCi0JMHgwMDE2ZWFjYiwKLQkweDAwMTg3NDU0LAotCTB4MDAxYTNkZGUsCi0JMHgwMDFiODllNywKLQkweDAwMWQxMmYwLAotCTB4MDAxZjFjZmEsCi0JMHgwMDAxNmI4OCwKLQkweDAwMDMzNDkyLAotCTB4MDAwNGJlMWIsCi0JMHgwMDA2MGEyNCwKLQkweDAwMDdkMzJlLAotCTB4MDAwOTVkMzgsCi0JMHgwMDBhZWM0YywKLQkweDAwMGM3NTU1LAotCTB4MDAwZTNlZGYsCi0JMHgwMDEyNGFlOCwKLQkweDAwMTQxM2YxLAotCTB4MDAxNWEzN2IsCi0JMHgwMDE3MmM4OSwKLQkweDAwMThiNTkzLAotCTB4MDAxYTQxOWMsCi0JMHgwMDFiY2IyNSwKLQkweDAwMWQ5NDJmLAotCTB4MDAxZjYzYjksCi0JMHgwMDAxYWQ0ZCwKLQkweDAwMDM3NjU3LAotCTB4MDAwNGMyNjAsCi0JMHgwMDA2OGJlOSwKLQkweDAwMDgxNGYzLAotCTB4MDAwOWE0N2MsCi0JMHgwMDBiMmQ4YSwKLQkweDAwMGNiNjk0LAotCTB4MDAwZTQyOWQsCi0JMHgwMDEyOGMyNiwKLQkweDAwMTQ1NWIwLAotCTB4MDAxNWU0YmEsCi0JMHgwMDE3NmU0ZSwKLQkweDAwMThmNzU4LAotCTB4MDAxYTgzNjEsCi0JMHgwMDFjMGNlYSwKLQkweDAwMWRkNjc0LAotCTB4MDAxZmE1N2QsCi0JMHgwMDAxZWU4YiwKLQkweDAwMDNiNzk1LAotCTB4MDAwNTAzOWUsCi0JMHgwMDA2Y2QyNywKLQkweDAwMDg1NmIxLAotCTB4MDAwOWU1YzYsCi0JMHgwMDBiNmY0ZiwKLQkweDAwMGNmODU5LAotCTB4MDAwZTg0NjIsCi0JMHgwMDEzMGRlYiwKLQkweDAwMTQ5Nzc1LAotCTB4MDAxNjI2MDMsCi0JMHgwMDE3YWY4YywKLQkweDAwMTkzODk2LAotCTB4MDAxYWM0OWYsCi0JMHgwMDFjNGUyOCwKLQkweDAwMWUxN2IyLAotCTB4MDAwMGE2YzcsCi0JMHgwMDAyMzA1MCwKLQkweDAwMDNmOWRhLAotCTB4MDAwNTQ1NjMsCi0JMHgwMDA3MGVlYywKLQkweDAwMDg5ODc2LAotCTB4MDAwYTI3MDQsCi0JMHgwMDBiYjA4ZCwKLQkweDAwMGQzYTE3LAotCTB4MDAxMTg1YTAsCi0JMHgwMDEzNGYyOSwKLQkweDAwMTRkOGIzLAotCTB4MDAxNjY3YzgsCi0JMHgwMDE3ZjE1MSwKLQkweDAwMTk3YWRiLAotCTB4MDAxYjA2NjQsCi0JMHgwMDFjOGZlZCwKLQkweDAwMWU1OTc3LAotCTB4MDAwMGU4MDUsCi0JMHgwMDAyNzE4ZiwKLQkweDAwMDQzYjE4LAotCTB4MDAwNTg2YTEsCi0JMHgwMDA3NTAyYiwKLQkweDAwMDhkOWI0LAotCTB4MDAwYTY4YzksCi0JMHgwMDBiZjI1MiwKLQkweDAwMGRiYmRjLAotCTB4MDAxMWM3ZTUsCi0JMHgwMDEzOTBlZSwKLQkweDAwMTUxYTc4LAotCTB4MDAxNmE5MDYsCi0JMHgwMDE4MzI5MCwKLQkweDAwMTliYzE5LAotCTB4MDAxYjQ4MjIsCi0JMHgwMDFjZDEyYywKLQkweDAwMWU5YWI1LAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLX07Ci0KLWNvbnN0IHUxNiBiZGlfdGJsX3JldjBbXSA9IHsKLQkweDAwNzAsCi0JMHgwMTI2LAotCTB4MDEyYywKLQkweDAyNDYsCi0JMHgwNDhkLAotCTB4MDRkMiwKLX07Ci0KLWNvbnN0IHUzMiBjaGFuZXN0X3RibF9yZXYwW10gPSB7Ci0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi19OwotCi1jb25zdCB1OCBtY3NfdGJsX3JldjBbXSA9IHsKLQkweDAwLAotCTB4MDgsCi0JMHgwYSwKLQkweDEwLAotCTB4MTIsCi0JMHgxOSwKLQkweDFhLAotCTB4MWMsCi0JMHg0MCwKLQkweDQ4LAotCTB4NGEsCi0JMHg1MCwKLQkweDUyLAotCTB4NTksCi0JMHg1YSwKLQkweDVjLAotCTB4ODAsCi0JMHg4OCwKLQkweDhhLAotCTB4OTAsCi0JMHg5MiwKLQkweDk5LAotCTB4OWEsCi0JMHg5YywKLQkweGMwLAotCTB4YzgsCi0JMHhjYSwKLQkweGQwLAotCTB4ZDIsCi0JMHhkOSwKLQkweGRhLAotCTB4ZGMsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMSwKLQkweDAyLAotCTB4MDQsCi0JMHgwOCwKLQkweDA5LAotCTB4MGEsCi0JMHgwYywKLQkweDEwLAotCTB4MTEsCi0JMHgxMiwKLQkweDE0LAotCTB4MTgsCi0JMHgxOSwKLQkweDFhLAotCTB4MWMsCi0JMHgyMCwKLQkweDIxLAotCTB4MjIsCi0JMHgyNCwKLQkweDQwLAotCTB4NDEsCi0JMHg0MiwKLQkweDQ0LAotCTB4NDgsCi0JMHg0OSwKLQkweDRhLAotCTB4NGMsCi0JMHg1MCwKLQkweDUxLAotCTB4NTIsCi0JMHg1NCwKLQkweDU4LAotCTB4NTksCi0JMHg1YSwKLQkweDVjLAotCTB4NjAsCi0JMHg2MSwKLQkweDYyLAotCTB4NjQsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi19OwotCi1jb25zdCB1MzIgbm9pc2VfdmFyX3RibDBfcmV2MFtdID0gewotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi19OwotCi1jb25zdCB1MzIgbm9pc2VfdmFyX3RibDFfcmV2MFtdID0gewotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi19OwotCi1jb25zdCB1OCBlc3RfcHdyX2x1dF9jb3JlMF9yZXYwW10gPSB7Ci0JMHg1MCwKLQkweDRmLAotCTB4NGUsCi0JMHg0ZCwKLQkweDRjLAotCTB4NGIsCi0JMHg0YSwKLQkweDQ5LAotCTB4NDgsCi0JMHg0NywKLQkweDQ2LAotCTB4NDUsCi0JMHg0NCwKLQkweDQzLAotCTB4NDIsCi0JMHg0MSwKLQkweDQwLAotCTB4M2YsCi0JMHgzZSwKLQkweDNkLAotCTB4M2MsCi0JMHgzYiwKLQkweDNhLAotCTB4MzksCi0JMHgzOCwKLQkweDM3LAotCTB4MzYsCi0JMHgzNSwKLQkweDM0LAotCTB4MzMsCi0JMHgzMiwKLQkweDMxLAotCTB4MzAsCi0JMHgyZiwKLQkweDJlLAotCTB4MmQsCi0JMHgyYywKLQkweDJiLAotCTB4MmEsCi0JMHgyOSwKLQkweDI4LAotCTB4MjcsCi0JMHgyNiwKLQkweDI1LAotCTB4MjQsCi0JMHgyMywKLQkweDIyLAotCTB4MjEsCi0JMHgyMCwKLQkweDFmLAotCTB4MWUsCi0JMHgxZCwKLQkweDFjLAotCTB4MWIsCi0JMHgxYSwKLQkweDE5LAotCTB4MTgsCi0JMHgxNywKLQkweDE2LAotCTB4MTUsCi0JMHgxNCwKLQkweDEzLAotCTB4MTIsCi0JMHgxMSwKLX07Ci0KLWNvbnN0IHU4IGVzdF9wd3JfbHV0X2NvcmUxX3JldjBbXSA9IHsKLQkweDUwLAotCTB4NGYsCi0JMHg0ZSwKLQkweDRkLAotCTB4NGMsCi0JMHg0YiwKLQkweDRhLAotCTB4NDksCi0JMHg0OCwKLQkweDQ3LAotCTB4NDYsCi0JMHg0NSwKLQkweDQ0LAotCTB4NDMsCi0JMHg0MiwKLQkweDQxLAotCTB4NDAsCi0JMHgzZiwKLQkweDNlLAotCTB4M2QsCi0JMHgzYywKLQkweDNiLAotCTB4M2EsCi0JMHgzOSwKLQkweDM4LAotCTB4MzcsCi0JMHgzNiwKLQkweDM1LAotCTB4MzQsCi0JMHgzMywKLQkweDMyLAotCTB4MzEsCi0JMHgzMCwKLQkweDJmLAotCTB4MmUsCi0JMHgyZCwKLQkweDJjLAotCTB4MmIsCi0JMHgyYSwKLQkweDI5LAotCTB4MjgsCi0JMHgyNywKLQkweDI2LAotCTB4MjUsCi0JMHgyNCwKLQkweDIzLAotCTB4MjIsCi0JMHgyMSwKLQkweDIwLAotCTB4MWYsCi0JMHgxZSwKLQkweDFkLAotCTB4MWMsCi0JMHgxYiwKLQkweDFhLAotCTB4MTksCi0JMHgxOCwKLQkweDE3LAotCTB4MTYsCi0JMHgxNSwKLQkweDE0LAotCTB4MTMsCi0JMHgxMiwKLQkweDExLAotfTsKLQotY29uc3QgdTggYWRqX3B3cl9sdXRfY29yZTBfcmV2MFtdID0gewotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLX07Ci0KLWNvbnN0IHU4IGFkal9wd3JfbHV0X2NvcmUxX3JldjBbXSA9IHsKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi19OwotCi1jb25zdCB1MzIgZ2FpbmN0cmxfbHV0X2NvcmUwX3JldjBbXSA9IHsKLQkweDAzY2MyYjQ0LAotCTB4MDNjYzJiNDIsCi0JMHgwM2NjMmI0MCwKLQkweDAzY2MyYjNlLAotCTB4MDNjYzJiM2QsCi0JMHgwM2NjMmIzYiwKLQkweDAzYzgyYjQ0LAotCTB4MDNjODJiNDIsCi0JMHgwM2M4MmI0MCwKLQkweDAzYzgyYjNlLAotCTB4MDNjODJiM2QsCi0JMHgwM2M4MmIzYiwKLQkweDAzYzgyYjM5LAotCTB4MDNjODJiMzgsCi0JMHgwM2M4MmIzNiwKLQkweDAzYzgyYjM0LAotCTB4MDNjNDJiNDQsCi0JMHgwM2M0MmI0MiwKLQkweDAzYzQyYjQwLAotCTB4MDNjNDJiM2UsCi0JMHgwM2M0MmIzZCwKLQkweDAzYzQyYjNiLAotCTB4MDNjNDJiMzksCi0JMHgwM2M0MmIzOCwKLQkweDAzYzQyYjM2LAotCTB4MDNjNDJiMzQsCi0JMHgwM2M0MmIzMywKLQkweDAzYzQyYjMyLAotCTB4MDNjNDJiMzAsCi0JMHgwM2M0MmIyZiwKLQkweDAzYzQyYjJkLAotCTB4MDNjMDJiNDQsCi0JMHgwM2MwMmI0MiwKLQkweDAzYzAyYjQwLAotCTB4MDNjMDJiM2UsCi0JMHgwM2MwMmIzZCwKLQkweDAzYzAyYjNiLAotCTB4MDNjMDJiMzksCi0JMHgwM2MwMmIzOCwKLQkweDAzYzAyYjM2LAotCTB4MDNjMDJiMzQsCi0JMHgwM2IwMmI0NCwKLQkweDAzYjAyYjQyLAotCTB4MDNiMDJiNDAsCi0JMHgwM2IwMmIzZSwKLQkweDAzYjAyYjNkLAotCTB4MDNiMDJiM2IsCi0JMHgwM2IwMmIzOSwKLQkweDAzYjAyYjM4LAotCTB4MDNiMDJiMzYsCi0JMHgwM2IwMmIzNCwKLQkweDAzYjAyYjMzLAotCTB4MDNiMDJiMzIsCi0JMHgwM2IwMmIzMCwKLQkweDAzYjAyYjJmLAotCTB4MDNiMDJiMmQsCi0JMHgwM2EwMmI0NCwKLQkweDAzYTAyYjQyLAotCTB4MDNhMDJiNDAsCi0JMHgwM2EwMmIzZSwKLQkweDAzYTAyYjNkLAotCTB4MDNhMDJiM2IsCi0JMHgwM2EwMmIzOSwKLQkweDAzYTAyYjM4LAotCTB4MDNhMDJiMzYsCi0JMHgwM2EwMmIzNCwKLQkweDAzOTAyYjQ0LAotCTB4MDM5MDJiNDIsCi0JMHgwMzkwMmI0MCwKLQkweDAzOTAyYjNlLAotCTB4MDM5MDJiM2QsCi0JMHgwMzkwMmIzYiwKLQkweDAzOTAyYjM5LAotCTB4MDM5MDJiMzgsCi0JMHgwMzkwMmIzNiwKLQkweDAzOTAyYjM0LAotCTB4MDM5MDJiMzMsCi0JMHgwMzkwMmIzMiwKLQkweDAzOTAyYjMwLAotCTB4MDM4MDJiNDQsCi0JMHgwMzgwMmI0MiwKLQkweDAzODAyYjQwLAotCTB4MDM4MDJiM2UsCi0JMHgwMzgwMmIzZCwKLQkweDAzODAyYjNiLAotCTB4MDM4MDJiMzksCi0JMHgwMzgwMmIzOCwKLQkweDAzODAyYjM2LAotCTB4MDM4MDJiMzQsCi0JMHgwMzgwMmIzMywKLQkweDAzODAyYjMyLAotCTB4MDM4MDJiMzAsCi0JMHgwMzgwMmIyZiwKLQkweDAzODAyYjJkLAotCTB4MDM4MDJiMmMsCi0JMHgwMzgwMmIyYiwKLQkweDAzODAyYjJhLAotCTB4MDM4MDJiMjksCi0JMHgwMzgwMmIyNywKLQkweDAzODAyYjI2LAotCTB4MDM4MDJiMjUsCi0JMHgwMzgwMmIyNCwKLQkweDAzODAyYjIzLAotCTB4MDM4MDJiMjIsCi0JMHgwMzgwMmIyMSwKLQkweDAzODAyYjIwLAotCTB4MDM4MDJiMWYsCi0JMHgwMzgwMmIxZSwKLQkweDAzODAyYjFlLAotCTB4MDM4MDJiMWQsCi0JMHgwMzgwMmIxYywKLQkweDAzODAyYjFiLAotCTB4MDM4MDJiMWEsCi0JMHgwMzgwMmIxYSwKLQkweDAzODAyYjE5LAotCTB4MDM4MDJiMTgsCi0JMHgwMzgwMmIxOCwKLQkweDAzODAyYjE4LAotCTB4MDM4MDJiMTgsCi0JMHgwMzgwMmIxOCwKLQkweDAzODAyYjE4LAotCTB4MDM4MDJiMTgsCi0JMHgwMzgwMmIxOCwKLQkweDAzODAyYjE4LAotCTB4MDM4MDJiMTgsCi0JMHgwMzgwMmIxOCwKLQkweDAzODAyYjE4LAotCTB4MDAwMDJiMDAsCi19OwotCi1jb25zdCB1MzIgZ2FpbmN0cmxfbHV0X2NvcmUxX3JldjBbXSA9IHsKLQkweDAzY2MyYjQ0LAotCTB4MDNjYzJiNDIsCi0JMHgwM2NjMmI0MCwKLQkweDAzY2MyYjNlLAotCTB4MDNjYzJiM2QsCi0JMHgwM2NjMmIzYiwKLQkweDAzYzgyYjQ0LAotCTB4MDNjODJiNDIsCi0JMHgwM2M4MmI0MCwKLQkweDAzYzgyYjNlLAotCTB4MDNjODJiM2QsCi0JMHgwM2M4MmIzYiwKLQkweDAzYzgyYjM5LAotCTB4MDNjODJiMzgsCi0JMHgwM2M4MmIzNiwKLQkweDAzYzgyYjM0LAotCTB4MDNjNDJiNDQsCi0JMHgwM2M0MmI0MiwKLQkweDAzYzQyYjQwLAotCTB4MDNjNDJiM2UsCi0JMHgwM2M0MmIzZCwKLQkweDAzYzQyYjNiLAotCTB4MDNjNDJiMzksCi0JMHgwM2M0MmIzOCwKLQkweDAzYzQyYjM2LAotCTB4MDNjNDJiMzQsCi0JMHgwM2M0MmIzMywKLQkweDAzYzQyYjMyLAotCTB4MDNjNDJiMzAsCi0JMHgwM2M0MmIyZiwKLQkweDAzYzQyYjJkLAotCTB4MDNjMDJiNDQsCi0JMHgwM2MwMmI0MiwKLQkweDAzYzAyYjQwLAotCTB4MDNjMDJiM2UsCi0JMHgwM2MwMmIzZCwKLQkweDAzYzAyYjNiLAotCTB4MDNjMDJiMzksCi0JMHgwM2MwMmIzOCwKLQkweDAzYzAyYjM2LAotCTB4MDNjMDJiMzQsCi0JMHgwM2IwMmI0NCwKLQkweDAzYjAyYjQyLAotCTB4MDNiMDJiNDAsCi0JMHgwM2IwMmIzZSwKLQkweDAzYjAyYjNkLAotCTB4MDNiMDJiM2IsCi0JMHgwM2IwMmIzOSwKLQkweDAzYjAyYjM4LAotCTB4MDNiMDJiMzYsCi0JMHgwM2IwMmIzNCwKLQkweDAzYjAyYjMzLAotCTB4MDNiMDJiMzIsCi0JMHgwM2IwMmIzMCwKLQkweDAzYjAyYjJmLAotCTB4MDNiMDJiMmQsCi0JMHgwM2EwMmI0NCwKLQkweDAzYTAyYjQyLAotCTB4MDNhMDJiNDAsCi0JMHgwM2EwMmIzZSwKLQkweDAzYTAyYjNkLAotCTB4MDNhMDJiM2IsCi0JMHgwM2EwMmIzOSwKLQkweDAzYTAyYjM4LAotCTB4MDNhMDJiMzYsCi0JMHgwM2EwMmIzNCwKLQkweDAzOTAyYjQ0LAotCTB4MDM5MDJiNDIsCi0JMHgwMzkwMmI0MCwKLQkweDAzOTAyYjNlLAotCTB4MDM5MDJiM2QsCi0JMHgwMzkwMmIzYiwKLQkweDAzOTAyYjM5LAotCTB4MDM5MDJiMzgsCi0JMHgwMzkwMmIzNiwKLQkweDAzOTAyYjM0LAotCTB4MDM5MDJiMzMsCi0JMHgwMzkwMmIzMiwKLQkweDAzOTAyYjMwLAotCTB4MDM4MDJiNDQsCi0JMHgwMzgwMmI0MiwKLQkweDAzODAyYjQwLAotCTB4MDM4MDJiM2UsCi0JMHgwMzgwMmIzZCwKLQkweDAzODAyYjNiLAotCTB4MDM4MDJiMzksCi0JMHgwMzgwMmIzOCwKLQkweDAzODAyYjM2LAotCTB4MDM4MDJiMzQsCi0JMHgwMzgwMmIzMywKLQkweDAzODAyYjMyLAotCTB4MDM4MDJiMzAsCi0JMHgwMzgwMmIyZiwKLQkweDAzODAyYjJkLAotCTB4MDM4MDJiMmMsCi0JMHgwMzgwMmIyYiwKLQkweDAzODAyYjJhLAotCTB4MDM4MDJiMjksCi0JMHgwMzgwMmIyNywKLQkweDAzODAyYjI2LAotCTB4MDM4MDJiMjUsCi0JMHgwMzgwMmIyNCwKLQkweDAzODAyYjIzLAotCTB4MDM4MDJiMjIsCi0JMHgwMzgwMmIyMSwKLQkweDAzODAyYjIwLAotCTB4MDM4MDJiMWYsCi0JMHgwMzgwMmIxZSwKLQkweDAzODAyYjFlLAotCTB4MDM4MDJiMWQsCi0JMHgwMzgwMmIxYywKLQkweDAzODAyYjFiLAotCTB4MDM4MDJiMWEsCi0JMHgwMzgwMmIxYSwKLQkweDAzODAyYjE5LAotCTB4MDM4MDJiMTgsCi0JMHgwMzgwMmIxOCwKLQkweDAzODAyYjE4LAotCTB4MDM4MDJiMTgsCi0JMHgwMzgwMmIxOCwKLQkweDAzODAyYjE4LAotCTB4MDM4MDJiMTgsCi0JMHgwMzgwMmIxOCwKLQkweDAzODAyYjE4LAotCTB4MDM4MDJiMTgsCi0JMHgwMzgwMmIxOCwKLQkweDAzODAyYjE4LAotCTB4MDAwMDJiMDAsCi19OwotCi1jb25zdCB1MzIgaXFfbHV0X2NvcmUwX3JldjBbXSA9IHsKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi19OwotCi1jb25zdCB1MzIgaXFfbHV0X2NvcmUxX3JldjBbXSA9IHsKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi0JMHgwMDAwMDA3ZiwKLQkweDAwMDAwMDdmLAotCTB4MDAwMDAwN2YsCi19OwotCi1jb25zdCB1MTYgbG9mdF9sdXRfY29yZTBfcmV2MFtdID0gewotCTB4MDAwMCwKLQkweDAxMDEsCi0JMHgwMDAyLAotCTB4MDEwMywKLQkweDAwMDAsCi0JMHgwMTAxLAotCTB4MDAwMiwKLQkweDAxMDMsCi0JMHgwMDAwLAotCTB4MDEwMSwKLQkweDAwMDIsCi0JMHgwMTAzLAotCTB4MDAwMCwKLQkweDAxMDEsCi0JMHgwMDAyLAotCTB4MDEwMywKLQkweDAwMDAsCi0JMHgwMTAxLAotCTB4MDAwMiwKLQkweDAxMDMsCi0JMHgwMDAwLAotCTB4MDEwMSwKLQkweDAwMDIsCi0JMHgwMTAzLAotCTB4MDAwMCwKLQkweDAxMDEsCi0JMHgwMDAyLAotCTB4MDEwMywKLQkweDAwMDAsCi0JMHgwMTAxLAotCTB4MDAwMiwKLQkweDAxMDMsCi0JMHgwMDAwLAotCTB4MDEwMSwKLQkweDAwMDIsCi0JMHgwMTAzLAotCTB4MDAwMCwKLQkweDAxMDEsCi0JMHgwMDAyLAotCTB4MDEwMywKLQkweDAwMDAsCi0JMHgwMTAxLAotCTB4MDAwMiwKLQkweDAxMDMsCi0JMHgwMDAwLAotCTB4MDEwMSwKLQkweDAwMDIsCi0JMHgwMTAzLAotCTB4MDAwMCwKLQkweDAxMDEsCi0JMHgwMDAyLAotCTB4MDEwMywKLQkweDAwMDAsCi0JMHgwMTAxLAotCTB4MDAwMiwKLQkweDAxMDMsCi0JMHgwMDAwLAotCTB4MDEwMSwKLQkweDAwMDIsCi0JMHgwMTAzLAotCTB4MDAwMCwKLQkweDAxMDEsCi0JMHgwMDAyLAotCTB4MDEwMywKLQkweDAwMDAsCi0JMHgwMTAxLAotCTB4MDAwMiwKLQkweDAxMDMsCi0JMHgwMDAwLAotCTB4MDEwMSwKLQkweDAwMDIsCi0JMHgwMTAzLAotCTB4MDAwMCwKLQkweDAxMDEsCi0JMHgwMDAyLAotCTB4MDEwMywKLQkweDAwMDAsCi0JMHgwMTAxLAotCTB4MDAwMiwKLQkweDAxMDMsCi0JMHgwMDAwLAotCTB4MDEwMSwKLQkweDAwMDIsCi0JMHgwMTAzLAotCTB4MDAwMCwKLQkweDAxMDEsCi0JMHgwMDAyLAotCTB4MDEwMywKLQkweDAwMDAsCi0JMHgwMTAxLAotCTB4MDAwMiwKLQkweDAxMDMsCi0JMHgwMDAwLAotCTB4MDEwMSwKLQkweDAwMDIsCi0JMHgwMTAzLAotCTB4MDAwMCwKLQkweDAxMDEsCi0JMHgwMDAyLAotCTB4MDEwMywKLQkweDAwMDAsCi0JMHgwMTAxLAotCTB4MDAwMiwKLQkweDAxMDMsCi0JMHgwMDAwLAotCTB4MDEwMSwKLQkweDAwMDIsCi0JMHgwMTAzLAotCTB4MDAwMCwKLQkweDAxMDEsCi0JMHgwMDAyLAotCTB4MDEwMywKLQkweDAwMDAsCi0JMHgwMTAxLAotCTB4MDAwMiwKLQkweDAxMDMsCi0JMHgwMDAwLAotCTB4MDEwMSwKLQkweDAwMDIsCi0JMHgwMTAzLAotCTB4MDAwMCwKLQkweDAxMDEsCi0JMHgwMDAyLAotCTB4MDEwMywKLQkweDAwMDAsCi0JMHgwMTAxLAotCTB4MDAwMiwKLQkweDAxMDMsCi19OwotCi1jb25zdCB1MTYgbG9mdF9sdXRfY29yZTFfcmV2MFtdID0gewotCTB4MDAwMCwKLQkweDAxMDEsCi0JMHgwMDAyLAotCTB4MDEwMywKLQkweDAwMDAsCi0JMHgwMTAxLAotCTB4MDAwMiwKLQkweDAxMDMsCi0JMHgwMDAwLAotCTB4MDEwMSwKLQkweDAwMDIsCi0JMHgwMTAzLAotCTB4MDAwMCwKLQkweDAxMDEsCi0JMHgwMDAyLAotCTB4MDEwMywKLQkweDAwMDAsCi0JMHgwMTAxLAotCTB4MDAwMiwKLQkweDAxMDMsCi0JMHgwMDAwLAotCTB4MDEwMSwKLQkweDAwMDIsCi0JMHgwMTAzLAotCTB4MDAwMCwKLQkweDAxMDEsCi0JMHgwMDAyLAotCTB4MDEwMywKLQkweDAwMDAsCi0JMHgwMTAxLAotCTB4MDAwMiwKLQkweDAxMDMsCi0JMHgwMDAwLAotCTB4MDEwMSwKLQkweDAwMDIsCi0JMHgwMTAzLAotCTB4MDAwMCwKLQkweDAxMDEsCi0JMHgwMDAyLAotCTB4MDEwMywKLQkweDAwMDAsCi0JMHgwMTAxLAotCTB4MDAwMiwKLQkweDAxMDMsCi0JMHgwMDAwLAotCTB4MDEwMSwKLQkweDAwMDIsCi0JMHgwMTAzLAotCTB4MDAwMCwKLQkweDAxMDEsCi0JMHgwMDAyLAotCTB4MDEwMywKLQkweDAwMDAsCi0JMHgwMTAxLAotCTB4MDAwMiwKLQkweDAxMDMsCi0JMHgwMDAwLAotCTB4MDEwMSwKLQkweDAwMDIsCi0JMHgwMTAzLAotCTB4MDAwMCwKLQkweDAxMDEsCi0JMHgwMDAyLAotCTB4MDEwMywKLQkweDAwMDAsCi0JMHgwMTAxLAotCTB4MDAwMiwKLQkweDAxMDMsCi0JMHgwMDAwLAotCTB4MDEwMSwKLQkweDAwMDIsCi0JMHgwMTAzLAotCTB4MDAwMCwKLQkweDAxMDEsCi0JMHgwMDAyLAotCTB4MDEwMywKLQkweDAwMDAsCi0JMHgwMTAxLAotCTB4MDAwMiwKLQkweDAxMDMsCi0JMHgwMDAwLAotCTB4MDEwMSwKLQkweDAwMDIsCi0JMHgwMTAzLAotCTB4MDAwMCwKLQkweDAxMDEsCi0JMHgwMDAyLAotCTB4MDEwMywKLQkweDAwMDAsCi0JMHgwMTAxLAotCTB4MDAwMiwKLQkweDAxMDMsCi0JMHgwMDAwLAotCTB4MDEwMSwKLQkweDAwMDIsCi0JMHgwMTAzLAotCTB4MDAwMCwKLQkweDAxMDEsCi0JMHgwMDAyLAotCTB4MDEwMywKLQkweDAwMDAsCi0JMHgwMTAxLAotCTB4MDAwMiwKLQkweDAxMDMsCi0JMHgwMDAwLAotCTB4MDEwMSwKLQkweDAwMDIsCi0JMHgwMTAzLAotCTB4MDAwMCwKLQkweDAxMDEsCi0JMHgwMDAyLAotCTB4MDEwMywKLQkweDAwMDAsCi0JMHgwMTAxLAotCTB4MDAwMiwKLQkweDAxMDMsCi0JMHgwMDAwLAotCTB4MDEwMSwKLQkweDAwMDIsCi0JMHgwMTAzLAotCTB4MDAwMCwKLQkweDAxMDEsCi0JMHgwMDAyLAotCTB4MDEwMywKLQkweDAwMDAsCi0JMHgwMTAxLAotCTB4MDAwMiwKLQkweDAxMDMsCi19OwotCi1jb25zdCBzdHJ1Y3QgcGh5dGJsX2luZm8gbWltb3BoeXRibF9pbmZvX3JldjBfdm9sYXRpbGVbXSA9IHsKLQl7JmJkaV90YmxfcmV2MCwgc2l6ZW9mKGJkaV90YmxfcmV2MCkgLyBzaXplb2YoYmRpX3RibF9yZXYwWzBdKSwgMjEsIDAsCi0JIDE2fQotCSwKLQl7JnBsdGx1dF90YmxfcmV2MCwgc2l6ZW9mKHBsdGx1dF90YmxfcmV2MCkgLyBzaXplb2YocGx0bHV0X3RibF9yZXYwWzBdKSwKLQkgMjAsIDAsIDMyfQotCSwKLQl7JmdhaW5jdHJsX2x1dF9jb3JlMF9yZXYwLAotCSBzaXplb2YoZ2FpbmN0cmxfbHV0X2NvcmUwX3JldjApIC8gc2l6ZW9mKGdhaW5jdHJsX2x1dF9jb3JlMF9yZXYwWzBdKSwKLQkgMjYsIDE5MiwgMzJ9Ci0JLAotCXsmZ2FpbmN0cmxfbHV0X2NvcmUxX3JldjAsCi0JIHNpemVvZihnYWluY3RybF9sdXRfY29yZTFfcmV2MCkgLyBzaXplb2YoZ2FpbmN0cmxfbHV0X2NvcmUxX3JldjBbMF0pLAotCSAyNywgMTkyLCAzMn0KLQksCi0KLQl7JmVzdF9wd3JfbHV0X2NvcmUwX3JldjAsCi0JIHNpemVvZihlc3RfcHdyX2x1dF9jb3JlMF9yZXYwKSAvIHNpemVvZihlc3RfcHdyX2x1dF9jb3JlMF9yZXYwWzBdKSwgMjYsCi0JIDAsIDh9Ci0JLAotCXsmZXN0X3B3cl9sdXRfY29yZTFfcmV2MCwKLQkgc2l6ZW9mKGVzdF9wd3JfbHV0X2NvcmUxX3JldjApIC8gc2l6ZW9mKGVzdF9wd3JfbHV0X2NvcmUxX3JldjBbMF0pLCAyNywKLQkgMCwgOH0KLQksCi0JeyZhZGpfcHdyX2x1dF9jb3JlMF9yZXYwLAotCSBzaXplb2YoYWRqX3B3cl9sdXRfY29yZTBfcmV2MCkgLyBzaXplb2YoYWRqX3B3cl9sdXRfY29yZTBfcmV2MFswXSksIDI2LAotCSA2NCwgOH0KLQksCi0JeyZhZGpfcHdyX2x1dF9jb3JlMV9yZXYwLAotCSBzaXplb2YoYWRqX3B3cl9sdXRfY29yZTFfcmV2MCkgLyBzaXplb2YoYWRqX3B3cl9sdXRfY29yZTFfcmV2MFswXSksIDI3LAotCSA2NCwgOH0KLQksCi0JeyZpcV9sdXRfY29yZTBfcmV2MCwKLQkgc2l6ZW9mKGlxX2x1dF9jb3JlMF9yZXYwKSAvIHNpemVvZihpcV9sdXRfY29yZTBfcmV2MFswXSksIDI2LCAzMjAsIDMyfQotCSwKLQl7JmlxX2x1dF9jb3JlMV9yZXYwLAotCSBzaXplb2YoaXFfbHV0X2NvcmUxX3JldjApIC8gc2l6ZW9mKGlxX2x1dF9jb3JlMV9yZXYwWzBdKSwgMjcsIDMyMCwgMzJ9Ci0JLAotCXsmbG9mdF9sdXRfY29yZTBfcmV2MCwKLQkgc2l6ZW9mKGxvZnRfbHV0X2NvcmUwX3JldjApIC8gc2l6ZW9mKGxvZnRfbHV0X2NvcmUwX3JldjBbMF0pLCAyNiwgNDQ4LAotCSAxNn0KLQksCi0JeyZsb2Z0X2x1dF9jb3JlMV9yZXYwLAotCSBzaXplb2YobG9mdF9sdXRfY29yZTFfcmV2MCkgLyBzaXplb2YobG9mdF9sdXRfY29yZTFfcmV2MFswXSksIDI3LCA0NDgsCi0JIDE2fQotCSwKLX07Ci0KLWNvbnN0IHN0cnVjdCBwaHl0YmxfaW5mbyBtaW1vcGh5dGJsX2luZm9fcmV2MFtdID0gewotCXsmZnJhbWVfc3RydWN0X3JldjAsCi0JIHNpemVvZihmcmFtZV9zdHJ1Y3RfcmV2MCkgLyBzaXplb2YoZnJhbWVfc3RydWN0X3JldjBbMF0pLCAxMCwgMCwgMzJ9Ci0JLAotCXsmZnJhbWVfbHV0X3JldjAsIHNpemVvZihmcmFtZV9sdXRfcmV2MCkgLyBzaXplb2YoZnJhbWVfbHV0X3JldjBbMF0pLAotCSAyNCwgMCwgOH0KLQksCi0JeyZ0bWFwX3RibF9yZXYwLCBzaXplb2YodG1hcF90YmxfcmV2MCkgLyBzaXplb2YodG1hcF90YmxfcmV2MFswXSksIDEyLAotCSAwLCAzMn0KLQksCi0JeyZ0ZHRybl90YmxfcmV2MCwgc2l6ZW9mKHRkdHJuX3RibF9yZXYwKSAvIHNpemVvZih0ZHRybl90YmxfcmV2MFswXSksCi0JIDE0LCAwLCAzMn0KLQksCi0JeyZpbnRsdl90YmxfcmV2MCwgc2l6ZW9mKGludGx2X3RibF9yZXYwKSAvIHNpemVvZihpbnRsdl90YmxfcmV2MFswXSksCi0JIDEzLCAwLCAzMn0KLQksCi0JeyZwaWxvdF90YmxfcmV2MCwgc2l6ZW9mKHBpbG90X3RibF9yZXYwKSAvIHNpemVvZihwaWxvdF90YmxfcmV2MFswXSksCi0JIDExLCAwLCAxNn0KLQksCi0JeyZ0ZGlfdGJsMjBfYW50MF9yZXYwLAotCSBzaXplb2YodGRpX3RibDIwX2FudDBfcmV2MCkgLyBzaXplb2YodGRpX3RibDIwX2FudDBfcmV2MFswXSksIDE5LCAxMjgsCi0JIDMyfQotCSwKLQl7JnRkaV90YmwyMF9hbnQxX3JldjAsCi0JIHNpemVvZih0ZGlfdGJsMjBfYW50MV9yZXYwKSAvIHNpemVvZih0ZGlfdGJsMjBfYW50MV9yZXYwWzBdKSwgMTksIDI1NiwKLQkgMzJ9Ci0JLAotCXsmdGRpX3RibDQwX2FudDBfcmV2MCwKLQkgc2l6ZW9mKHRkaV90Ymw0MF9hbnQwX3JldjApIC8gc2l6ZW9mKHRkaV90Ymw0MF9hbnQwX3JldjBbMF0pLCAxOSwgNjQwLAotCSAzMn0KLQksCi0JeyZ0ZGlfdGJsNDBfYW50MV9yZXYwLAotCSBzaXplb2YodGRpX3RibDQwX2FudDFfcmV2MCkgLyBzaXplb2YodGRpX3RibDQwX2FudDFfcmV2MFswXSksIDE5LCA3NjgsCi0JIDMyfQotCSwKLQl7JmNoYW5lc3RfdGJsX3JldjAsCi0JIHNpemVvZihjaGFuZXN0X3RibF9yZXYwKSAvIHNpemVvZihjaGFuZXN0X3RibF9yZXYwWzBdKSwgMjIsIDAsIDMyfQotCSwKLQl7Jm1jc190YmxfcmV2MCwgc2l6ZW9mKG1jc190YmxfcmV2MCkgLyBzaXplb2YobWNzX3RibF9yZXYwWzBdKSwgMTgsIDAsIDh9Ci0JLAotCXsmbm9pc2VfdmFyX3RibDBfcmV2MCwKLQkgc2l6ZW9mKG5vaXNlX3Zhcl90YmwwX3JldjApIC8gc2l6ZW9mKG5vaXNlX3Zhcl90YmwwX3JldjBbMF0pLCAxNiwgMCwKLQkgMzJ9Ci0JLAotCXsmbm9pc2VfdmFyX3RibDFfcmV2MCwKLQkgc2l6ZW9mKG5vaXNlX3Zhcl90YmwxX3JldjApIC8gc2l6ZW9mKG5vaXNlX3Zhcl90YmwxX3JldjBbMF0pLCAxNiwgMTI4LAotCSAzMn0KLQksCi19OwotCi1jb25zdCB1MzIgbWltb3BoeXRibF9pbmZvX3N6X3JldjAgPQotCXNpemVvZihtaW1vcGh5dGJsX2luZm9fcmV2MCkgLyBzaXplb2YobWltb3BoeXRibF9pbmZvX3JldjBbMF0pOwotY29uc3QgdTMyIG1pbW9waHl0YmxfaW5mb19zel9yZXYwX3ZvbGF0aWxlID0KLQlzaXplb2YobWltb3BoeXRibF9pbmZvX3JldjBfdm9sYXRpbGUpIC8KLQlzaXplb2YobWltb3BoeXRibF9pbmZvX3JldjBfdm9sYXRpbGVbMF0pOwotCi1jb25zdCB1MTYgYW50X3N3Y3RybF90YmxfcmV2M1tdID0gewotCTB4MDA4MiwKLQkweDAwODIsCi0JMHgwMjExLAotCTB4MDIyMiwKLQkweDAzMjgsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMTQ0LAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDE4OCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwODIsCi0JMHgwMDgyLAotCTB4MDIxMSwKLQkweDAyMjIsCi0JMHgwMzI4LAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDE0NCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAxODgsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi19OwotCi1jb25zdCB1MTYgYW50X3N3Y3RybF90YmxfcmV2M18xW10gPSB7Ci0JMHgwMDIyLAotCTB4MDAyMiwKLQkweDAwMTEsCi0JMHgwMDIyLAotCTB4MDAyMiwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMTEsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDIyLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAyMiwKLQkweDAwMjIsCi0JMHgwMDExLAotCTB4MDAyMiwKLQkweDAwMjIsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDExLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAyMiwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLX07Ci0KLWNvbnN0IHUxNiBhbnRfc3djdHJsX3RibF9yZXYzXzJbXSA9IHsKLQkweDAwODgsCi0JMHgwMDg4LAotCTB4MDA0NCwKLQkweDAwODgsCi0JMHgwMDg4LAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDA0NCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwODgsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDg4LAotCTB4MDA4OCwKLQkweDAwNDQsCi0JMHgwMDg4LAotCTB4MDA4OCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwNDQsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDg4LAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotfTsKLQotY29uc3QgdTE2IGFudF9zd2N0cmxfdGJsX3JldjNfM1tdID0gewotCTB4MDIyLAotCTB4MDIyLAotCTB4MDExLAotCTB4MDIyLAotCTB4MDAwLAotCTB4MDAwLAotCTB4MDAwLAotCTB4MDAwLAotCTB4MDExLAotCTB4MDAwLAotCTB4MDAwLAotCTB4MDAwLAotCTB4MDIyLAotCTB4MDAwLAotCTB4MDAwLAotCTB4M2NjLAotCTB4MDIyLAotCTB4MDIyLAotCTB4MDExLAotCTB4MDIyLAotCTB4MDAwLAotCTB4MDAwLAotCTB4MDAwLAotCTB4MDAwLAotCTB4MDExLAotCTB4MDAwLAotCTB4MDAwLAotCTB4MDAwLAotCTB4MDIyLAotCTB4MDAwLAotCTB4MDAwLAotCTB4M2NjCi19OwotCi1jb25zdCB1MzIgZnJhbWVfc3RydWN0X3JldjNbXSA9IHsKLQkweDA4MDA0YTA0LAotCTB4MDAxMDAwMDAsCi0JMHgwMTAwMGEwNSwKLQkweDAwMTAwMDIwLAotCTB4MDk4MDQ1MDYsCi0JMHgwMDEwMDAzMCwKLQkweDA5ODA0NTA3LAotCTB4MDAxMDAwMzAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDgwMDRhMGMsCi0JMHgwMDEwMDAwNCwKLQkweDAxMDAwYTBkLAotCTB4MDAxMDAwMjQsCi0JMHgwOTgwNDUwZSwKLQkweDAwMTAwMDM0LAotCTB4MDk4MDQ1MGYsCi0JMHgwMDEwMDAzNCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMGEwNCwKLQkweDAwMTAwMDAwLAotCTB4MTEwMDhhMDUsCi0JMHgwMDEwMDAyMCwKLQkweDE5ODBjNTA2LAotCTB4MDAxMDAwMzAsCi0JMHgyMTgxMDUwNiwKLQkweDAwMTAwMDMwLAotCTB4MjE4MTA1MDYsCi0JMHgwMDEwMDAzMCwKLQkweDAxODAwNTA0LAotCTB4MDAxMDAwMzAsCi0JMHgxMTgwODUwNSwKLQkweDAwMTAwMDMwLAotCTB4Mjk4MTQ1MDcsCi0JMHgwMTEwMDAzMCwKLQkweDAwMDAwYTA0LAotCTB4MDAxMDAwMDAsCi0JMHgxMTAwOGEwNSwKLQkweDAwMTAwMDIwLAotCTB4MjE4MTA1MDYsCi0JMHgwMDEwMDAzMCwKLQkweDIxODEwNTA2LAotCTB4MDAxMDAwMzAsCi0JMHgyOTgxNDUwNywKLQkweDAxMTAwMDMwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDBhMGMsCi0JMHgwMDEwMDAwOCwKLQkweDExMDA4YTBkLAotCTB4MDAxMDAwMjgsCi0JMHgxOTgwYzUwZSwKLQkweDAwMTAwMDM4LAotCTB4MjE4MTA1MGUsCi0JMHgwMDEwMDAzOCwKLQkweDIxODEwNTBlLAotCTB4MDAxMDAwMzgsCi0JMHgwMTgwMDUwYywKLQkweDAwMTAwMDM4LAotCTB4MTE4MDg1MGQsCi0JMHgwMDEwMDAzOCwKLQkweDI5ODE0NTBmLAotCTB4MDExMDAwMzgsCi0JMHgwMDAwMGEwYywKLQkweDAwMTAwMDA4LAotCTB4MTEwMDhhMGQsCi0JMHgwMDEwMDAyOCwKLQkweDIxODEwNTBlLAotCTB4MDAxMDAwMzgsCi0JMHgyMTgxMDUwZSwKLQkweDAwMTAwMDM4LAotCTB4Mjk4MTQ1MGYsCi0JMHgwMTEwMDAzOCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDA4MDA0YTA0LAotCTB4MDAxMDAwMDAsCi0JMHgwMTAwMGEwNSwKLQkweDAwMTAwMDIwLAotCTB4MTk4MGM1MDYsCi0JMHgwMDEwMDAzMCwKLQkweDE5ODBjNTA2LAotCTB4MDAxMDAwMzAsCi0JMHgxMTgwODUwNCwKLQkweDAwMTAwMDMwLAotCTB4Mzk4MWNhMDUsCi0JMHgwMDEwMDAzMCwKLQkweDI5ODE0NTA3LAotCTB4MDExMDAwMzAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MTAwMDhhMDQsCi0JMHgwMDEwMDAwMCwKLQkweDM5ODFjYTA1LAotCTB4MDAxMDAwMzAsCi0JMHgxOTgwYzUwNiwKLQkweDAwMTAwMDMwLAotCTB4Mjk4MTQ1MDcsCi0JMHgwMTEwMDAzMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwODAwNGEwYywKLQkweDAwMTAwMDA4LAotCTB4MDEwMDBhMGQsCi0JMHgwMDEwMDAyOCwKLQkweDE5ODBjNTBlLAotCTB4MDAxMDAwMzgsCi0JMHgxOTgwYzUwZSwKLQkweDAwMTAwMDM4LAotCTB4MTE4MDg1MGMsCi0JMHgwMDEwMDAzOCwKLQkweDM5ODFjYTBkLAotCTB4MDAxMDAwMzgsCi0JMHgyOTgxNDUwZiwKLQkweDAxMTAwMDM4LAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDEwMDA4YTBjLAotCTB4MDAxMDAwMDgsCi0JMHgzOTgxY2EwZCwKLQkweDAwMTAwMDM4LAotCTB4MTk4MGM1MGUsCi0JMHgwMDEwMDAzOCwKLQkweDI5ODE0NTBmLAotCTB4MDExMDAwMzgsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4NDAwMjE0MDQsCi0JMHgwMDEwMDAwMCwKLQkweDAyMDAxNDA1LAotCTB4MDAxMDAwNDAsCi0JMHgwYjAwNGEwNiwKLQkweDAxOTAwMDYwLAotCTB4MTMwMDhhMDYsCi0JMHgwMTkwMDA2MCwKLQkweDEzMDA4YTA2LAotCTB4MDE5MDAwNjAsCi0JMHg0MzAyMGEwNCwKLQkweDAwMTAwMDYwLAotCTB4MWIwMGNhMDUsCi0JMHgwMDEwMDA2MCwKLQkweDIzMDEwYTA3LAotCTB4MDE1MDAwNjAsCi0JMHg0MDAyMTQwNCwKLQkweDAwMTAwMDAwLAotCTB4MWEwMGQ0MDUsCi0JMHgwMDEwMDA0MCwKLQkweDEzMDA4YTA2LAotCTB4MDE5MDAwNjAsCi0JMHgxMzAwOGEwNiwKLQkweDAxOTAwMDYwLAotCTB4MjMwMTBhMDcsCi0JMHgwMTUwMDA2MCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDQwMDIxNDBjLAotCTB4MDAxMDAwMTAsCi0JMHgwMjAwMTQwZCwKLQkweDAwMTAwMDUwLAotCTB4MGIwMDRhMGUsCi0JMHgwMTkwMDA3MCwKLQkweDEzMDA4YTBlLAotCTB4MDE5MDAwNzAsCi0JMHgxMzAwOGEwZSwKLQkweDAxOTAwMDcwLAotCTB4NDMwMjBhMGMsCi0JMHgwMDEwMDA3MCwKLQkweDFiMDBjYTBkLAotCTB4MDAxMDAwNzAsCi0JMHgyMzAxMGEwZiwKLQkweDAxNTAwMDcwLAotCTB4NDAwMjE0MGMsCi0JMHgwMDEwMDAxMCwKLQkweDFhMDBkNDBkLAotCTB4MDAxMDAwNTAsCi0JMHgxMzAwOGEwZSwKLQkweDAxOTAwMDcwLAotCTB4MTMwMDhhMGUsCi0JMHgwMTkwMDA3MCwKLQkweDIzMDEwYTBmLAotCTB4MDE1MDAwNzAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHg1MDAyOTQwNCwKLQkweDAwMTAwMDAwLAotCTB4MzIwMTk0MDUsCi0JMHgwMDEwMDA0MCwKLQkweDBiMDA0YTA2LAotCTB4MDE5MDAwNjAsCi0JMHgwYjAwNGEwNiwKLQkweDAxOTAwMDYwLAotCTB4NWIwMmNhMDQsCi0JMHgwMDEwMDA2MCwKLQkweDNiMDFkNDA1LAotCTB4MDAxMDAwNjAsCi0JMHgyMzAxMGEwNywKLQkweDAxNTAwMDYwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDU4MDJkNDA0LAotCTB4MDAxMDAwMDAsCi0JMHgzYjAxZDQwNSwKLQkweDAwMTAwMDYwLAotCTB4MGIwMDRhMDYsCi0JMHgwMTkwMDA2MCwKLQkweDIzMDEwYTA3LAotCTB4MDE1MDAwNjAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4NTAwMjk0MGMsCi0JMHgwMDEwMDAxMCwKLQkweDMyMDE5NDBkLAotCTB4MDAxMDAwNTAsCi0JMHgwYjAwNGEwZSwKLQkweDAxOTAwMDcwLAotCTB4MGIwMDRhMGUsCi0JMHgwMTkwMDA3MCwKLQkweDViMDJjYTBjLAotCTB4MDAxMDAwNzAsCi0JMHgzYjAxZDQwZCwKLQkweDAwMTAwMDcwLAotCTB4MjMwMTBhMGYsCi0JMHgwMTUwMDA3MCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHg1ODAyZDQwYywKLQkweDAwMTAwMDEwLAotCTB4M2IwMWQ0MGQsCi0JMHgwMDEwMDA3MCwKLQkweDBiMDA0YTBlLAotCTB4MDE5MDAwNzAsCi0JMHgyMzAxMGEwZiwKLQkweDAxNTAwMDcwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDQwMDIxNDA0LAotCTB4MDAwZjQ4MDAsCi0JMHg2MjAzMTQwNSwKLQkweDAwMTAwMDQwLAotCTB4NTMwMjhhMDYsCi0JMHgwMTkwMDA2MCwKLQkweDUzMDI4YTA3LAotCTB4MDE5MDAwNjAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4NDAwMjE0MGMsCi0JMHgwMDBmNDgwOCwKLQkweDYyMDMxNDBkLAotCTB4MDAxMDAwNDgsCi0JMHg1MzAyOGEwZSwKLQkweDAxOTAwMDY4LAotCTB4NTMwMjhhMGYsCi0JMHgwMTkwMDA2OCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMGEwYywKLQkweDAwMTAwMDA0LAotCTB4MTEwMDhhMGQsCi0JMHgwMDEwMDAyNCwKLQkweDE5ODBjNTBlLAotCTB4MDAxMDAwMzQsCi0JMHgyMTgxMDUwZSwKLQkweDAwMTAwMDM0LAotCTB4MjE4MTA1MGUsCi0JMHgwMDEwMDAzNCwKLQkweDAxODAwNTBjLAotCTB4MDAxMDAwMzgsCi0JMHgxMTgwODUwZCwKLQkweDAwMTAwMDM4LAotCTB4MTE4MTg1MGQsCi0JMHgwMDEwMDAzOCwKLQkweDI5ODE0NTBmLAotCTB4MDExMDAwMzgsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDBhMGMsCi0JMHgwMDEwMDAwOCwKLQkweDExMDA4YTBkLAotCTB4MDAxMDAwMjgsCi0JMHgyMTgxMDUwZSwKLQkweDAwMTAwMDM4LAotCTB4MjE4MTA1MGUsCi0JMHgwMDEwMDAzOCwKLQkweDExODE4NTBkLAotCTB4MDAxMDAwMzgsCi0JMHgyOTgxNDUwZiwKLQkweDAxMTAwMDM4LAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDA4MDA0YTA0LAotCTB4MDAxMDAwMDAsCi0JMHgwMTAwMGEwNSwKLQkweDAwMTAwMDIwLAotCTB4MDE4MGM1MDYsCi0JMHgwMDEwMDAzMCwKLQkweDAxODBjNTA2LAotCTB4MDAxMDAwMzAsCi0JMHgyMTgwYzUwYywKLQkweDAwMTAwMDMwLAotCTB4NDk4MjBhMGQsCi0JMHgwMDE2YTEzMCwKLQkweDQxODI0YTBkLAotCTB4MDAxNmExMzAsCi0JMHgyOTgxNDUwZiwKLQkweDAxMTAwMDMwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgyMDAwY2EwYywKLQkweDAwMTAwMDAwLAotCTB4NDk4MjBhMGQsCi0JMHgwMDE2YTEzMCwKLQkweDE5ODBjNTBlLAotCTB4MDAxMDAwMzAsCi0JMHg0MTgyNGEwZCwKLQkweDAwMTZhMTMwLAotCTB4Mjk4MTQ1MGYsCi0JMHgwMTEwMDAzMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4NDAwMjE0MGMsCi0JMHgwMDEwMDAwOCwKLQkweDAyMDAxNDBkLAotCTB4MDAxMDAwNDgsCi0JMHgwYjAwNGEwZSwKLQkweDAxOTAwMDY4LAotCTB4MTMwMDhhMGUsCi0JMHgwMTkwMDA2OCwKLQkweDEzMDA4YTBlLAotCTB4MDE5MDAwNjgsCi0JMHg0MzAyMGEwYywKLQkweDAwMTAwMDcwLAotCTB4MWIwMGNhMGQsCi0JMHgwMDEwMDA3MCwKLQkweDFiMDE0YTBkLAotCTB4MDAxMDAwNzAsCi0JMHgyMzAxMGEwZiwKLQkweDAxNTAwMDcwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDQwMDIxNDBjLAotCTB4MDAxMDAwMTAsCi0JMHgxYTAwZDQwZCwKLQkweDAwMTAwMDUwLAotCTB4MTMwMDhhMGUsCi0JMHgwMTkwMDA3MCwKLQkweDEzMDA4YTBlLAotCTB4MDE5MDAwNzAsCi0JMHgxYjAxNGEwZCwKLQkweDAwMTAwMDcwLAotCTB4MjMwMTBhMGYsCi0JMHgwMTUwMDA3MCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHg1MDAyOTQwNCwKLQkweDAwMTAwMDAwLAotCTB4MzIwMTk0MDUsCi0JMHgwMDEwMDA0MCwKLQkweDAzMDA0YTA2LAotCTB4MDE5MDAwNjAsCi0JMHgwMzAwNGEwNiwKLQkweDAxOTAwMDYwLAotCTB4NmIwMzBhMGMsCi0JMHgwMDEwMDA2MCwKLQkweDRiMDIxNDBkLAotCTB4MDAxNmExNjAsCi0JMHg0MzAyNTQwZCwKLQkweDAwMTZhMTYwLAotCTB4MjMwMTBhMGYsCi0JMHgwMTUwMDA2MCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4NmIwMzE0MGMsCi0JMHgwMDEwMDA2MCwKLQkweDRiMDIxNDBkLAotCTB4MDAxNmExNjAsCi0JMHgwYjAwNGEwZSwKLQkweDAxOTAwMDYwLAotCTB4NDMwMjU0MGQsCi0JMHgwMDE2YTE2MCwKLQkweDIzMDEwYTBmLAotCTB4MDE1MDAwNjAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDQwMDIxNDA0LAotCTB4MDAxMDAwMDAsCi0JMHgxYTAwZDQwNSwKLQkweDAwMTAwMDQwLAotCTB4NTMwMjhhMDYsCi0JMHgwMTkwMDA2MCwKLQkweDViMDJjYTA2LAotCTB4MDE5MDAwNjAsCi0JMHg1YjAyY2EwNiwKLQkweDAxOTAwMDYwLAotCTB4NDMwMjBhMDQsCi0JMHgwMDEwMDA2MCwKLQkweDFiMDBjYTA1LAotCTB4MDAxMDAwNjAsCi0JMHg1MzAyOGEwNywKLQkweDAxOTBjMDYwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHg0MDAyMTQwYywKLQkweDAwMTAwMDEwLAotCTB4MWEwMGQ0MGQsCi0JMHgwMDEwMDA1MCwKLQkweDUzMDI4YTBlLAotCTB4MDE5MDAwNzAsCi0JMHg1YjAyY2EwZSwKLQkweDAxOTAwMDcwLAotCTB4NWIwMmNhMGUsCi0JMHgwMTkwMDA3MCwKLQkweDQzMDIwYTBjLAotCTB4MDAxMDAwNzAsCi0JMHgxYjAwY2EwZCwKLQkweDAwMTAwMDcwLAotCTB4NTMwMjhhMGYsCi0JMHgwMTkwYzA3MCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4NDAwMjE0MDQsCi0JMHgwMDEwMDAwMCwKLQkweDFhMDBkNDA1LAotCTB4MDAxMDAwNDAsCi0JMHg1YjAyY2EwNiwKLQkweDAxOTAwMDYwLAotCTB4NWIwMmNhMDYsCi0JMHgwMTkwMDA2MCwKLQkweDUzMDI4YTA3LAotCTB4MDE5MGMwNjAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDQwMDIxNDBjLAotCTB4MDAxMDAwMTAsCi0JMHgxYTAwZDQwZCwKLQkweDAwMTAwMDUwLAotCTB4NWIwMmNhMGUsCi0JMHgwMTkwMDA3MCwKLQkweDViMDJjYTBlLAotCTB4MDE5MDAwNzAsCi0JMHg1MzAyOGEwZiwKLQkweDAxOTBjMDcwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotfTsKLQotY29uc3QgdTE2IHBpbG90X3RibF9yZXYzW10gPSB7Ci0JMHhmZjA4LAotCTB4ZmYwOCwKLQkweGZmMDgsCi0JMHhmZjA4LAotCTB4ZmYwOCwKLQkweGZmMDgsCi0JMHhmZjA4LAotCTB4ZmYwOCwKLQkweDgwZDUsCi0JMHg4MGQ1LAotCTB4ODBkNSwKLQkweDgwZDUsCi0JMHg4MGQ1LAotCTB4ODBkNSwKLQkweDgwZDUsCi0JMHg4MGQ1LAotCTB4ZmYwYSwKLQkweGZmODIsCi0JMHhmZmEwLAotCTB4ZmYyOCwKLQkweGZmZmYsCi0JMHhmZmZmLAotCTB4ZmZmZiwKLQkweGZmZmYsCi0JMHhmZjgyLAotCTB4ZmZhMCwKLQkweGZmMjgsCi0JMHhmZjBhLAotCTB4ZmZmZiwKLQkweGZmZmYsCi0JMHhmZmZmLAotCTB4ZmZmZiwKLQkweGY4M2YsCi0JMHhmYTFmLAotCTB4ZmE5NywKLQkweGZhYjUsCi0JMHhmMmJkLAotCTB4ZjBiZiwKLQkweGZmZmYsCi0JMHhmZmZmLAotCTB4ZjAxNywKLQkweGY4MTUsCi0JMHhmMjE1LAotCTB4ZjA5NSwKLQkweGYwMzUsCi0JMHhmMDFkLAotCTB4ZmZmZiwKLQkweGZmZmYsCi0JMHhmZjA4LAotCTB4ZmYwMiwKLQkweGZmODAsCi0JMHhmZjIwLAotCTB4ZmYwOCwKLQkweGZmMDIsCi0JMHhmZjgwLAotCTB4ZmYyMCwKLQkweGYwMWYsCi0JMHhmODE3LAotCTB4ZmExNSwKLQkweGYyOTUsCi0JMHhmMGI1LAotCTB4ZjAzZCwKLQkweGZmZmYsCi0JMHhmZmZmLAotCTB4ZjgyYSwKLQkweGZhMGEsCi0JMHhmYTgyLAotCTB4ZmFhMCwKLQkweGYyYTgsCi0JMHhmMGFhLAotCTB4ZmZmZiwKLQkweGZmZmYsCi0JMHhmMDAyLAotCTB4ZjgwMCwKLQkweGYyMDAsCi0JMHhmMDgwLAotCTB4ZjAyMCwKLQkweGYwMDgsCi0JMHhmZmZmLAotCTB4ZmZmZiwKLQkweGYwMGEsCi0JMHhmODAyLAotCTB4ZmEwMCwKLQkweGYyODAsCi0JMHhmMGEwLAotCTB4ZjAyOCwKLQkweGZmZmYsCi0JMHhmZmZmLAotfTsKLQotY29uc3QgdTMyIHRtYXBfdGJsX3JldjNbXSA9IHsKLQkweDhhODhhYTgwLAotCTB4OGFhYWFhOGEsCi0JMHg4YThhOGFhOCwKLQkweDAwMDAwODg4LAotCTB4ODgwMDAwMDAsCi0JMHg4YThhODhhYSwKLQkweDhhYTg4ODg4LAotCTB4ODg4OGE4YTgsCi0JMHhmMTExMTExMCwKLQkweDExMTExMTExLAotCTB4MTFmMTExMTEsCi0JMHgwMDAwMDExMSwKLQkweDExMDAwMDAwLAotCTB4MTExMWYxMTEsCi0JMHgxMTExMTExMSwKLQkweDExMTExMWYxLAotCTB4OGE4OGFhODAsCi0JMHg4YWFhYWE4YSwKLQkweDhhOGE4YWE4LAotCTB4MDAwYWE4ODgsCi0JMHg4ODg4MDAwMCwKLQkweDhhOGE4OGFhLAotCTB4OGFhODg4ODgsCi0JMHg4ODg4YThhOCwKLQkweGExMTExMTEwLAotCTB4MTExMTExMTEsCi0JMHgxMWMxMTExMSwKLQkweDAwMDAwMTExLAotCTB4MTEwMDAwMDAsCi0JMHgxMTExYTExMSwKLQkweDExMTExMTExLAotCTB4MTExMTExYTEsCi0JMHhhMjIyMjIyMCwKLQkweDIyMjIyMjIyLAotCTB4MjJjMjIyMjIsCi0JMHgwMDAwMDIyMiwKLQkweDIyMDAwMDAwLAotCTB4MjIyMmEyMjIsCi0JMHgyMjIyMjIyMiwKLQkweDIyMjIyMmEyLAotCTB4ZjExMTExMTAsCi0JMHgxMTExMTExMSwKLQkweDExZjExMTExLAotCTB4MDAwMTExMTEsCi0JMHgxMTExMDAwMCwKLQkweDExMTFmMTExLAotCTB4MTExMTExMTEsCi0JMHgxMTExMTFmMSwKLQkweGE4YWE4OGEwLAotCTB4YTg4ODg4YTgsCi0JMHhhOGE4YTg4YSwKLQkweDAwMDg4YWFhLAotCTB4YWFhYTAwMDAsCi0JMHhhOGE4YWE4OCwKLQkweGE4OGFhYWFhLAotCTB4YWFhYThhOGEsCi0JMHhhYWE4YWFhMCwKLQkweDhhYWE4YWFhLAotCTB4YWE4YThhOGEsCi0JMHgwMDBhYWE4OCwKLQkweDhhYWEwMDAwLAotCTB4YWFhOGE4ODgsCi0JMHg4YWE4OGE4YSwKLQkweDhhODhhODg4LAotCTB4MDgwODBhMDAsCi0JMHgwYTA4MDgwYSwKLQkweDA4MGEwYTA4LAotCTB4MDAwODA4MDgsCi0JMHgwODBhMDAwMCwKLQkweDA4MGEwODA4LAotCTB4MDgwYTA4MDgsCi0JMHgwYTBhMGEwOCwKLQkweGEwYTBhMGEwLAotCTB4ODBhMGEwODAsCi0JMHg4MDgwYTBhMCwKLQkweDAwMDA4MDgwLAotCTB4ODBhMDAwMDAsCi0JMHg4MGEwODBhMCwKLQkweGEwODBhMGEwLAotCTB4ODA4MGEwYTAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHg5OTk5OTAwMCwKLQkweDliOWI5OWJiLAotCTB4OWJiOTk5OTksCi0JMHg5OTk5YjliOSwKLQkweDliOTliYjkwLAotCTB4OWJiYmJiOWIsCi0JMHg5YjliOWJiOSwKLQkweDAwMDAwOTk5LAotCTB4ODgwMDAwMDAsCi0JMHg4YThhODhhYSwKLQkweDhhYTg4ODg4LAotCTB4ODg4OGE4YTgsCi0JMHg4YTg4YWE4MCwKLQkweDhhYWFhYThhLAotCTB4OGE4YThhYTgsCi0JMHgwMGFhYTg4OCwKLQkweDIyMDAwMDAwLAotCTB4MjIyMmIyMjIsCi0JMHgyMjIyMjIyMiwKLQkweDIyMjIyMmIyLAotCTB4YjIyMjIyMjAsCi0JMHgyMjIyMjIyMiwKLQkweDIyZDIyMjIyLAotCTB4MDAwMDAyMjIsCi0JMHgxMTAwMDAwMCwKLQkweDExMTFhMTExLAotCTB4MTExMTExMTEsCi0JMHgxMTExMTFhMSwKLQkweGExMTExMTEwLAotCTB4MTExMTExMTEsCi0JMHgxMWMxMTExMSwKLQkweDAwMDAwMTExLAotCTB4MzMwMDAwMDAsCi0JMHgzMzMzYjMzMywKLQkweDMzMzMzMzMzLAotCTB4MzMzMzMzYjMsCi0JMHhiMzMzMzMzMCwKLQkweDMzMzMzMzMzLAotCTB4MzNkMzMzMzMsCi0JMHgwMDAwMDMzMywKLQkweDIyMDAwMDAwLAotCTB4MjIyMmEyMjIsCi0JMHgyMjIyMjIyMiwKLQkweDIyMjIyMmEyLAotCTB4YTIyMjIyMjAsCi0JMHgyMjIyMjIyMiwKLQkweDIyYzIyMjIyLAotCTB4MDAwMDAyMjIsCi0JMHg5OWI5OWIwMCwKLQkweDliOWI5OWJiLAotCTB4OWJiOTk5OTksCi0JMHg5OTk5YjliOSwKLQkweDliOTliYjk5LAotCTB4OWJiYmJiOWIsCi0JMHg5YjliOWJiOSwKLQkweDAwMDAwOTk5LAotCTB4ODgwMDAwMDAsCi0JMHg4YThhODhhYSwKLQkweDhhYTg4ODg4LAotCTB4ODg4OGE4YTgsCi0JMHg4YTg4YWE4OCwKLQkweDhhYWFhYThhLAotCTB4OGE4YThhYTgsCi0JMHgwOGFhYTg4OCwKLQkweDIyMjIyMjAwLAotCTB4MjIyMmYyMjIsCi0JMHgyMjIyMjIyMiwKLQkweDIyMjIyMmYyLAotCTB4MjIyMjIyMjIsCi0JMHgyMjIyMjIyMiwKLQkweDIyZjIyMjIyLAotCTB4MDAwMDAyMjIsCi0JMHgxMTAwMDAwMCwKLQkweDExMTFmMTExLAotCTB4MTExMTExMTEsCi0JMHgxMTExMTExMSwKLQkweGYxMTExMTExLAotCTB4MTExMTExMTEsCi0JMHgxMWYxMTExMSwKLQkweDAxMTExMTExLAotCTB4YmI5YmI5MDAsCi0JMHhiOWI5YmI5OSwKLQkweGI5OWJiYmJiLAotCTB4YmJiYjliOWIsCi0JMHhiOWJiOTliYiwKLQkweGI5OTk5OWI5LAotCTB4YjliOWI5OWIsCi0JMHgwMDAwMGJiYiwKLQkweGFhMDAwMDAwLAotCTB4YThhOGFhODgsCi0JMHhhODhhYWFhYSwKLQkweGFhYWE4YThhLAotCTB4YThhYTg4YWEsCi0JMHhhODg4ODhhOCwKLQkweGE4YThhODhhLAotCTB4MGE4ODhhYWEsCi0JMHhhYTAwMDAwMCwKLQkweGE4YThhYTg4LAotCTB4YTg4YWFhYWEsCi0JMHhhYWFhOGE4YSwKLQkweGE4YWE4OGEwLAotCTB4YTg4ODg4YTgsCi0JMHhhOGE4YTg4YSwKLQkweDAwMDAwYWFhLAotCTB4ODgwMDAwMDAsCi0JMHg4YThhODhhYSwKLQkweDhhYTg4ODg4LAotCTB4ODg4OGE4YTgsCi0JMHg4YTg4YWE4MCwKLQkweDhhYWFhYThhLAotCTB4OGE4YThhYTgsCi0JMHgwMDAwMDg4OCwKLQkweGJiYmJiYjAwLAotCTB4OTk5YmJiYmIsCi0JMHg5YmI5OWI5YiwKLQkweGI5YjliOWJiLAotCTB4YjliOTliYmIsCi0JMHhiOWI5YjliYiwKLQkweGI5YmI5Yjk5LAotCTB4MDAwMDA5OTksCi0JMHg4YTAwMDAwMCwKLQkweGFhODhhODg4LAotCTB4YTg4ODg4YWEsCi0JMHhhODhhOGE4OCwKLQkweGE4OGFhODhhLAotCTB4ODhhOGFhYWEsCi0JMHhhOGFhOGFhYSwKLQkweDA4ODhhODhhLAotCTB4MGIwYjBiMDAsCi0JMHgwOTBiMGIwYiwKLQkweDBiMDkwYjBiLAotCTB4MDkwOTA5MGIsCi0JMHgwOTA5MGIwYiwKLQkweDA5MDkwYjBiLAotCTB4MDkwOTBiMDksCi0JMHgwMDAwMDkwOSwKLQkweDBhMDAwMDAwLAotCTB4MGEwODA4MDgsCi0JMHgwODBhMDgwYSwKLQkweDA4MGEwYTA4LAotCTB4MDgwYTA4MGEsCi0JMHgwODA4MDgwYSwKLQkweDBhMGEwYTA4LAotCTB4MDgwODA4MGEsCi0JMHhiMGIwYjAwMCwKLQkweDkwOTBiMGIwLAotCTB4OTBiMDkwOTAsCi0JMHhiMGIwYjA5MCwKLQkweGIwYjA5MGIwLAotCTB4OTBiMGIwYjAsCi0JMHhiMGIwOTA5MCwKLQkweDAwMDAwMDkwLAotCTB4ODAwMDAwMDAsCi0JMHhhMDgwYTA4MCwKLQkweGEwODA4MGEwLAotCTB4YTA4MDgwODAsCi0JMHhhMDgwYTA4MCwKLQkweDgwYTBhMGEwLAotCTB4YTBhMDgwYTAsCi0JMHgwMGEwYTBhMCwKLQkweDIyMDAwMDAwLAotCTB4MjIyMmYyMjIsCi0JMHgyMjIyMjIyMiwKLQkweDIyMjIyMmYyLAotCTB4ZjIyMjIyMjAsCi0JMHgyMjIyMjIyMiwKLQkweDIyZjIyMjIyLAotCTB4MDAwMDAyMjIsCi0JMHgxMTAwMDAwMCwKLQkweDExMTFmMTExLAotCTB4MTExMTExMTEsCi0JMHgxMTExMTFmMSwKLQkweGYxMTExMTEwLAotCTB4MTExMTExMTEsCi0JMHgxMWYxMTExMSwKLQkweDAwMDAwMTExLAotCTB4MzMwMDAwMDAsCi0JMHgzMzMzZjMzMywKLQkweDMzMzMzMzMzLAotCTB4MzMzMzMzZjMsCi0JMHhmMzMzMzMzMCwKLQkweDMzMzMzMzMzLAotCTB4MzNmMzMzMzMsCi0JMHgwMDAwMDMzMywKLQkweDIyMDAwMDAwLAotCTB4MjIyMmYyMjIsCi0JMHgyMjIyMjIyMiwKLQkweDIyMjIyMmYyLAotCTB4ZjIyMjIyMjAsCi0JMHgyMjIyMjIyMiwKLQkweDIyZjIyMjIyLAotCTB4MDAwMDAyMjIsCi0JMHg5OTAwMDAwMCwKLQkweDliOWI5OWJiLAotCTB4OWJiOTk5OTksCi0JMHg5OTk5YjliOSwKLQkweDliOTliYjkwLAotCTB4OWJiYmJiOWIsCi0JMHg5YjliOWJiOSwKLQkweDAwMDAwOTk5LAotCTB4ODgwMDAwMDAsCi0JMHg4YThhODhhYSwKLQkweDhhYTg4ODg4LAotCTB4ODg4OGE4YTgsCi0JMHg4YTg4YWE4MCwKLQkweDhhYWFhYThhLAotCTB4OGE4YThhYTgsCi0JMHgwMDAwMDg4OCwKLQkweDg4ODg4MDAwLAotCTB4OGE4YTg4YWEsCi0JMHg4YWE4ODg4OCwKLQkweDg4ODhhOGE4LAotCTB4OGE4OGFhODAsCi0JMHg4YWFhYWE4YSwKLQkweDhhOGE4YWE4LAotCTB4MDAwMDA4ODgsCi0JMHg4ODAwMDAwMCwKLQkweDhhOGE4OGFhLAotCTB4OGFhODg4ODgsCi0JMHg4ODg4YThhOCwKLQkweDhhODhhYTgwLAotCTB4OGFhYWFhOGEsCi0JMHg4YThhOGFhOCwKLQkweDAwYWFhODg4LAotCTB4ODhhODhhMDAsCi0JMHg4YThhODhhYSwKLQkweDhhYTg4ODg4LAotCTB4ODg4OGE4YTgsCi0JMHg4YTg4YWE4OCwKLQkweDhhYWFhYThhLAotCTB4OGE4YThhYTgsCi0JMHgwMDAwMDg4OCwKLQkweDg4MDAwMDAwLAotCTB4OGE4YTg4YWEsCi0JMHg4YWE4ODg4OCwKLQkweDg4ODhhOGE4LAotCTB4OGE4OGFhODgsCi0JMHg4YWFhYWE4YSwKLQkweDhhOGE4YWE4LAotCTB4MDhhYWE4ODgsCi0JMHgxMTAwMDAwMCwKLQkweDExMTFhMTExLAotCTB4MTExMTExMTEsCi0JMHgxMTExMTFhMSwKLQkweGExMTExMTEwLAotCTB4MTExMTExMTEsCi0JMHgxMWMxMTExMSwKLQkweDAwMDAwMTExLAotCTB4MTEwMDAwMDAsCi0JMHgxMTExYTExMSwKLQkweDExMTExMTExLAotCTB4MTExMTExYTEsCi0JMHhhMTExMTExMCwKLQkweDExMTExMTExLAotCTB4MTFjMTExMTEsCi0JMHgwMDAwMDExMSwKLQkweDg4MDAwMDAwLAotCTB4OGE4YTg4YWEsCi0JMHg4YWE4ODg4OCwKLQkweDg4ODhhOGE4LAotCTB4OGE4OGFhODAsCi0JMHg4YWFhYWE4YSwKLQkweDhhOGE4YWE4LAotCTB4MDAwMDA4ODgsCi0JMHg4ODAwMDAwMCwKLQkweDhhOGE4OGFhLAotCTB4OGFhODg4ODgsCi0JMHg4ODg4YThhOCwKLQkweDhhODhhYTgwLAotCTB4OGFhYWFhOGEsCi0JMHg4YThhOGFhOCwKLQkweDAwMDAwODg4LAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotfTsKLQotY29uc3QgdTMyIGludGx2X3RibF9yZXYzW10gPSB7Ci0JMHgwMDgwMjA3MCwKLQkweDA2NzExODhkLAotCTB4MGE2MDE5MmMsCi0JMHgwYTMwMGU0NiwKLQkweDAwYzExODhkLAotCTB4MDgwMDI0ZDIsCi0JMHgwMDAwMDA3MCwKLX07Ci0KLWNvbnN0IHUzMiB0ZHRybl90YmxfcmV2M1tdID0gewotCTB4MDYxYzA2MWMsCi0JMHgwMDUwZWU2OCwKLQkweGY1OTJmZTM2LAotCTB4ZmU1MjEyZjYsCi0JMHgwMDAwMGMzOCwKLQkweGZlNTIxMmY2LAotCTB4ZjU5MmZlMzYsCi0JMHgwMDUwZWU2OCwKLQkweDA2MWMwNjFjLAotCTB4ZWU2ODAwNTAsCi0JMHhmZTM2ZjU5MiwKLQkweDEyZjZmZTUyLAotCTB4MGMzODAwMDAsCi0JMHgxMmY2ZmU1MiwKLQkweGZlMzZmNTkyLAotCTB4ZWU2ODAwNTAsCi0JMHgwNjFjMDYxYywKLQkweDAwNTBlZTY4LAotCTB4ZjU5MmZlMzYsCi0JMHhmZTUyMTJmNiwKLQkweDAwMDAwYzM4LAotCTB4ZmU1MjEyZjYsCi0JMHhmNTkyZmUzNiwKLQkweDAwNTBlZTY4LAotCTB4MDYxYzA2MWMsCi0JMHhlZTY4MDA1MCwKLQkweGZlMzZmNTkyLAotCTB4MTJmNmZlNTIsCi0JMHgwYzM4MDAwMCwKLQkweDEyZjZmZTUyLAotCTB4ZmUzNmY1OTIsCi0JMHhlZTY4MDA1MCwKLQkweDA1ZTMwNWUzLAotCTB4MDA0ZGVmMGMsCi0JMHhmNWYzZmU0NywKLQkweGZlNjExMjQ2LAotCTB4MDAwMDBiYzcsCi0JMHhmZTYxMTI0NiwKLQkweGY1ZjNmZTQ3LAotCTB4MDA0ZGVmMGMsCi0JMHgwNWUzMDVlMywKLQkweGVmMGMwMDRkLAotCTB4ZmU0N2Y1ZjMsCi0JMHgxMjQ2ZmU2MSwKLQkweDBiYzcwMDAwLAotCTB4MTI0NmZlNjEsCi0JMHhmZTQ3ZjVmMywKLQkweGVmMGMwMDRkLAotCTB4MDVlMzA1ZTMsCi0JMHgwMDRkZWYwYywKLQkweGY1ZjNmZTQ3LAotCTB4ZmU2MTEyNDYsCi0JMHgwMDAwMGJjNywKLQkweGZlNjExMjQ2LAotCTB4ZjVmM2ZlNDcsCi0JMHgwMDRkZWYwYywKLQkweDA1ZTMwNWUzLAotCTB4ZWYwYzAwNGQsCi0JMHhmZTQ3ZjVmMywKLQkweDEyNDZmZTYxLAotCTB4MGJjNzAwMDAsCi0JMHgxMjQ2ZmU2MSwKLQkweGZlNDdmNWYzLAotCTB4ZWYwYzAwNGQsCi0JMHhmYTU4ZmE1OCwKLQkweGY4OTUwNDNiLAotCTB4ZmY0YzA5YzAsCi0JMHhmYmM2ZmZhOCwKLQkweGZiODRmMzg0LAotCTB4MDc5OGY2ZjksCi0JMHgwNTc2MDEyMiwKLQkweDA1ODQwOWY2LAotCTB4MGI1MDAwMDAsCi0JMHgwNWI3ZjU0MiwKLQkweDA4ODYwNDMyLAotCTB4MDZkZGZlZTcsCi0JMHhmYjg0ZjM4NCwKLQkweGY5ZDkwNjY0LAotCTB4ZjdlODAyNWMsCi0JMHgwMGZmZjdiZCwKLQkweDA1YTgwNWE4LAotCTB4ZjdiZDAwZmYsCi0JMHgwMjVjZjdlOCwKLQkweDA2NjRmOWQ5LAotCTB4ZjM4NGZiODQsCi0JMHhmZWU3MDZkZCwKLQkweDA0MzIwODg2LAotCTB4ZjU0MjA1YjcsCi0JMHgwMDAwMGI1MCwKLQkweDA5ZjYwNTg0LAotCTB4MDEyMjA1NzYsCi0JMHhmNmY5MDc5OCwKLQkweGYzODRmYjg0LAotCTB4ZmZhOGZiYzYsCi0JMHgwOWMwZmY0YywKLQkweDA0M2JmODk1LAotCTB4MDJkNDAyZDQsCi0JMHgwN2RlMDI3MCwKLQkweGZjOTYwNzljLAotCTB4ZjkwYWZlOTQsCi0JMHhmZTAwZmYyYywKLQkweDAyZDQwNjVkLAotCTB4MDkyYTAwOTYsCi0JMHgwMDE0ZmJiOCwKLQkweGZkMmNmZDJjLAotCTB4MDc2YWZiM2MsCi0JMHgwMDk2Zjc1MiwKLQkweGY5OTFmZDg3LAotCTB4ZmIyYzAyMDAsCi0JMHhmZWI4Zjk2MCwKLQkweDA4ZTBmYzk2LAotCTB4MDQ5ODAyYTgsCi0JMHhmZDJjZmQyYywKLQkweDAyYTgwNDk4LAotCTB4ZmM5NjA4ZTAsCi0JMHhmOTYwZmViOCwKLQkweDAyMDBmYjJjLAotCTB4ZmQ4N2Y5OTEsCi0JMHhmNzUyMDA5NiwKLQkweGZiM2MwNzZhLAotCTB4ZmQyY2ZkMmMsCi0JMHhmYmI4MDAxNCwKLQkweDAwOTYwOTJhLAotCTB4MDY1ZDAyZDQsCi0JMHhmZjJjZmUwMCwKLQkweGZlOTRmOTBhLAotCTB4MDc5Y2ZjOTYsCi0JMHgwMjcwMDdkZSwKLQkweDAyZDQwMmQ0LAotCTB4MDI3MDA3ZGUsCi0JMHgwNzljZmM5NiwKLQkweGZlOTRmOTBhLAotCTB4ZmYyY2ZlMDAsCi0JMHgwNjVkMDJkNCwKLQkweDAwOTYwOTJhLAotCTB4ZmJiODAwMTQsCi0JMHhmZDJjZmQyYywKLQkweGZiM2MwNzZhLAotCTB4Zjc1MjAwOTYsCi0JMHhmZDg3Zjk5MSwKLQkweDAyMDBmYjJjLAotCTB4Zjk2MGZlYjgsCi0JMHhmYzk2MDhlMCwKLQkweDAyYTgwNDk4LAotCTB4ZmQyY2ZkMmMsCi0JMHgwNDk4MDJhOCwKLQkweDA4ZTBmYzk2LAotCTB4ZmViOGY5NjAsCi0JMHhmYjJjMDIwMCwKLQkweGY5OTFmZDg3LAotCTB4MDA5NmY3NTIsCi0JMHgwNzZhZmIzYywKLQkweGZkMmNmZDJjLAotCTB4MDAxNGZiYjgsCi0JMHgwOTJhMDA5NiwKLQkweDAyZDQwNjVkLAotCTB4ZmUwMGZmMmMsCi0JMHhmOTBhZmU5NCwKLQkweGZjOTYwNzljLAotCTB4MDdkZTAyNzAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwNjJhMDAwMCwKLQkweGZlZmEwNzU5LAotCTB4MDhiODA5MDgsCi0JMHhmMzk2ZmMyZCwKLQkweGY5ZDYwNDVjLAotCTB4ZmM0ZWY2MDgsCi0JMHhmNzQ4ZjU5NiwKLQkweDA3YjIwN2JmLAotCTB4MDYyYTA2MmEsCi0JMHhmODRlZjg0MSwKLQkweGY3NDhmNTk2LAotCTB4MDNiMjA5ZjgsCi0JMHhmOWQ2MDQ1YywKLQkweDBjNmEwM2QzLAotCTB4MDhiODA5MDgsCi0JMHgwMTA2ZjhhNywKLQkweDA2MmEwMDAwLAotCTB4ZmVmYWY4YTcsCi0JMHgwOGI4ZjZmOCwKLQkweGYzOTYwM2QzLAotCTB4ZjlkNmZiYTQsCi0JMHhmYzRlMDlmOCwKLQkweGY3NDgwYTZhLAotCTB4MDdiMmY4NDEsCi0JMHgwNjJhZjlkNiwKLQkweGY4NGUwN2JmLAotCTB4Zjc0ODBhNmEsCi0JMHgwM2IyZjYwOCwKLQkweGY5ZDZmYmE0LAotCTB4MGM2YWZjMmQsCi0JMHgwOGI4ZjZmOCwKLQkweDAxMDYwNzU5LAotCTB4MDYyYTAwMDAsCi0JMHhmZWZhMDc1OSwKLQkweDA4YjgwOTA4LAotCTB4ZjM5NmZjMmQsCi0JMHhmOWQ2MDQ1YywKLQkweGZjNGVmNjA4LAotCTB4Zjc0OGY1OTYsCi0JMHgwN2IyMDdiZiwKLQkweDA2MmEwNjJhLAotCTB4Zjg0ZWY4NDEsCi0JMHhmNzQ4ZjU5NiwKLQkweDAzYjIwOWY4LAotCTB4ZjlkNjA0NWMsCi0JMHgwYzZhMDNkMywKLQkweDA4YjgwOTA4LAotCTB4MDEwNmY4YTcsCi0JMHgwNjJhMDAwMCwKLQkweGZlZmFmOGE3LAotCTB4MDhiOGY2ZjgsCi0JMHhmMzk2MDNkMywKLQkweGY5ZDZmYmE0LAotCTB4ZmM0ZTA5ZjgsCi0JMHhmNzQ4MGE2YSwKLQkweDA3YjJmODQxLAotCTB4MDYyYWY5ZDYsCi0JMHhmODRlMDdiZiwKLQkweGY3NDgwYTZhLAotCTB4MDNiMmY2MDgsCi0JMHhmOWQ2ZmJhNCwKLQkweDBjNmFmYzJkLAotCTB4MDhiOGY2ZjgsCi0JMHgwMTA2MDc1OSwKLQkweDA2MWMwNjFjLAotCTB4ZmYzMDAwOWQsCi0JMHhmZmIyMTE0MSwKLQkweGZkODdmYjU0LAotCTB4ZjY1ZGZlNTksCi0JMHgwMmVlZjk5ZSwKLQkweDAxNjZmMDNjLAotCTB4ZmZmODA5YjYsCi0JMHgwMDAwMDhhNCwKLQkweDAwMGFmNDJiLAotCTB4MDBlZmY1NzcsCi0JMHhmYTg0MGJmMiwKLQkweGZjMDJmZjUxLAotCTB4MDgyNjBmNjcsCi0JMHhmZmYwMDM2ZiwKLQkweDA4NDJmOWMzLAotCTB4MDAwMDAwMDAsCi0JMHgwNjNkZjdiZSwKLQkweGZjOTEwMDEwLAotCTB4ZjA5OWY3ZGEsCi0JMHgwMGFmMDNmZSwKLQkweGY0MGUwNTdjLAotCTB4MGE4OWZmMTEsCi0JMHgwYmQ1ZmZmNiwKLQkweGY3NWMwMDAwLAotCTB4ZjY0YTAwMDgsCi0JMHgwZmM0ZmU5YSwKLQkweDA2NjJmZDEyLAotCTB4MDFhNzA5YTMsCi0JMHgwNGFjMDI3OSwKLQkweGVlYmYwMDRlLAotCTB4ZmY2MzAwZDAsCi0JMHhmOWU0ZjllNCwKLQkweDAwZDBmZjYzLAotCTB4MDA0ZWVlYmYsCi0JMHgwMjc5MDRhYywKLQkweDA5YTMwMWE3LAotCTB4ZmQxMjA2NjIsCi0JMHhmZTlhMGZjNCwKLQkweDAwMDhmNjRhLAotCTB4MDAwMGY3NWMsCi0JMHhmZmY2MGJkNSwKLQkweGZmMTEwYTg5LAotCTB4MDU3Y2Y0MGUsCi0JMHgwM2ZlMDBhZiwKLQkweGY3ZGFmMDk5LAotCTB4MDAxMGZjOTEsCi0JMHhmN2JlMDYzZCwKLQkweDAwMDAwMDAwLAotCTB4ZjljMzA4NDIsCi0JMHgwMzZmZmZmMCwKLQkweDBmNjcwODI2LAotCTB4ZmY1MWZjMDIsCi0JMHgwYmYyZmE4NCwKLQkweGY1NzcwMGVmLAotCTB4ZjQyYjAwMGEsCi0JMHgwOGE0MDAwMCwKLQkweDA5YjZmZmY4LAotCTB4ZjAzYzAxNjYsCi0JMHhmOTllMDJlZSwKLQkweGZlNTlmNjVkLAotCTB4ZmI1NGZkODcsCi0JMHgxMTQxZmZiMiwKLQkweDAwOWRmZjMwLAotCTB4MDVlMzAwMDAsCi0JMHhmZjA2MDcwNSwKLQkweDA4NTQwOGEwLAotCTB4ZjQyNWZjNTksCi0JMHhmYTFkMDQyYSwKLQkweGZjNzhmNjdhLAotCTB4ZjdhY2Y2MGUsCi0JMHgwNzVhMDc2NiwKLQkweDA1ZTMwNWUzLAotCTB4ZjhhNmY4OWEsCi0JMHhmN2FjZjYwZSwKLQkweDAzODgwOTg2LAotCTB4ZmExZDA0MmEsCi0JMHgwYmRiMDNhNywKLQkweDA4NTQwOGEwLAotCTB4MDBmYWY4ZmIsCi0JMHgwNWUzMDAwMCwKLQkweGZmMDZmOGZiLAotCTB4MDg1NGY3NjAsCi0JMHhmNDI1MDNhNywKLQkweGZhMWRmYmQ2LAotCTB4ZmM3ODA5ODYsCi0JMHhmN2FjMDlmMiwKLQkweDA3NWFmODlhLAotCTB4MDVlM2ZhMWQsCi0JMHhmOGE2MDc2NiwKLQkweGY3YWMwOWYyLAotCTB4MDM4OGY2N2EsCi0JMHhmYTFkZmJkNiwKLQkweDBiZGJmYzU5LAotCTB4MDg1NGY3NjAsCi0JMHgwMGZhMDcwNSwKLQkweDA1ZTMwMDAwLAotCTB4ZmYwNjA3MDUsCi0JMHgwODU0MDhhMCwKLQkweGY0MjVmYzU5LAotCTB4ZmExZDA0MmEsCi0JMHhmYzc4ZjY3YSwKLQkweGY3YWNmNjBlLAotCTB4MDc1YTA3NjYsCi0JMHgwNWUzMDVlMywKLQkweGY4YTZmODlhLAotCTB4ZjdhY2Y2MGUsCi0JMHgwMzg4MDk4NiwKLQkweGZhMWQwNDJhLAotCTB4MGJkYjAzYTcsCi0JMHgwODU0MDhhMCwKLQkweDAwZmFmOGZiLAotCTB4MDVlMzAwMDAsCi0JMHhmZjA2ZjhmYiwKLQkweDA4NTRmNzYwLAotCTB4ZjQyNTAzYTcsCi0JMHhmYTFkZmJkNiwKLQkweGZjNzgwOTg2LAotCTB4ZjdhYzA5ZjIsCi0JMHgwNzVhZjg5YSwKLQkweDA1ZTNmYTFkLAotCTB4ZjhhNjA3NjYsCi0JMHhmN2FjMDlmMiwKLQkweDAzODhmNjdhLAotCTB4ZmExZGZiZDYsCi0JMHgwYmRiZmM1OSwKLQkweDA4NTRmNzYwLAotCTB4MDBmYTA3MDUsCi0JMHhmYTU4ZmE1OCwKLQkweGY4ZjBmZTAwLAotCTB4MDQ0ODA3M2QsCi0JMHhmZGM5ZmU0NiwKLQkweGY5OTEwMjU4LAotCTB4MDg5ZDA0MDcsCi0JMHhmZDVjZjcxYSwKLQkweDAyYWZmZGUwLAotCTB4MDgzZTA0OTYsCi0JMHhmZjVhMDc0MCwKLQkweGZmN2FmZDk3LAotCTB4MDBmZTAxZjEsCi0JMHgwMDA5MDgyZSwKLQkweGZhOTRmZjc1LAotCTB4ZmVjZGY4ZWEsCi0JMHhmZmIwZjY5MywKLQkweGZkMmNmYTU4LAotCTB4MDQzM2ZmMTYsCi0JMHhmYmE0MDVkZCwKLQkweGZhNjEwMzQxLAotCTB4MDZhNjA2Y2IsCi0JMHgwMDM5ZmQyZCwKLQkweDA2NzdmYTk3LAotCTB4MDFmYTA1ZTAsCi0JMHhmODk2MDAzZSwKLQkweDA3NWEwNjhiLAotCTB4MDEyY2ZjM2UsCi0JMHhmYTIzZjk4ZCwKLQkweGZjN2NmZDQzLAotCTB4ZmY5MGZjMGQsCi0JMHgwMWMxMDk4MiwKLQkweDAwYzYwMWQ2LAotCTB4ZmQyY2ZkMmMsCi0JMHgwMWQ2MDBjNiwKLQkweDA5ODIwMWMxLAotCTB4ZmMwZGZmOTAsCi0JMHhmZDQzZmM3YywKLQkweGY5OGRmYTIzLAotCTB4ZmMzZTAxMmMsCi0JMHgwNjhiMDc1YSwKLQkweDAwM2VmODk2LAotCTB4MDVlMDAxZmEsCi0JMHhmYTk3MDY3NywKLQkweGZkMmQwMDM5LAotCTB4MDZjYjA2YTYsCi0JMHgwMzQxZmE2MSwKLQkweDA1ZGRmYmE0LAotCTB4ZmYxNjA0MzMsCi0JMHhmYTU4ZmQyYywKLQkweGY2OTNmZmIwLAotCTB4ZjhlYWZlY2QsCi0JMHhmZjc1ZmE5NCwKLQkweDA4MmUwMDA5LAotCTB4MDFmMTAwZmUsCi0JMHhmZDk3ZmY3YSwKLQkweDA3NDBmZjVhLAotCTB4MDQ5NjA4M2UsCi0JMHhmZGUwMDJhZiwKLQkweGY3MWFmZDVjLAotCTB4MDQwNzA4OWQsCi0JMHgwMjU4Zjk5MSwKLQkweGZlNDZmZGM5LAotCTB4MDczZDA0NDgsCi0JMHhmZTAwZjhmMCwKLQkweGZkMmNmZDJjLAotCTB4ZmNlMDA1MDAsCi0JMHhmYzA5ZmRkYywKLQkweGZlNjgwMTU3LAotCTB4MDRjNzA1NzEsCi0JMHhmYzNhZmYyMSwKLQkweGZjZDcwMjI4LAotCTB4MDU2ZDAyNzcsCi0JMHgwMjAwZmUwMCwKLQkweDAwMjJmOTI3LAotCTB4ZmUzYzAzMmIsCi0JMHhmYzQ0ZmYzYywKLQkweDAzZTlmYmRiLAotCTB4MDQ1NzAzMTMsCi0JMHgwNGM5ZmY1YywKLQkweDAwMGQwM2I4LAotCTB4ZmE1ODAwMDAsCi0JMHhmYmU5MDBkMiwKLQkweGY5ZDBmZTBiLAotCTB4MDEyNWZkZjksCi0JMHgwNDI1MDFiZiwKLQkweDAzMjhmYTJiLAotCTB4ZmZhOTAyZjAsCi0JMHhmYTI1MDE1NywKLQkweDAyMDBmZTAwLAotCTB4MDM3NDA0MzgsCi0JMHhmZjA0MDVmZCwKLQkweDAzMGNmZTUyLAotCTB4MDAzN2ZiMzksCi0JMHhmZjY5MDRjNSwKLQkweDA0ZjhmZDIzLAotCTB4ZmQzMWZjMWIsCi0JMHhmZDJjZmQyYywKLQkweGZjMWJmZDMxLAotCTB4ZmQyMzA0ZjgsCi0JMHgwNGM1ZmY2OSwKLQkweGZiMzkwMDM3LAotCTB4ZmU1MjAzMGMsCi0JMHgwNWZkZmYwNCwKLQkweDA0MzgwMzc0LAotCTB4ZmUwMDAyMDAsCi0JMHgwMTU3ZmEyNSwKLQkweDAyZjBmZmE5LAotCTB4ZmEyYjAzMjgsCi0JMHgwMWJmMDQyNSwKLQkweGZkZjkwMTI1LAotCTB4ZmUwYmY5ZDAsCi0JMHgwMGQyZmJlOSwKLQkweDAwMDBmYTU4LAotCTB4MDNiODAwMGQsCi0JMHhmZjVjMDRjOSwKLQkweDAzMTMwNDU3LAotCTB4ZmJkYjAzZTksCi0JMHhmZjNjZmM0NCwKLQkweDAzMmJmZTNjLAotCTB4ZjkyNzAwMjIsCi0JMHhmZTAwMDIwMCwKLQkweDAyNzcwNTZkLAotCTB4MDIyOGZjZDcsCi0JMHhmZjIxZmMzYSwKLQkweDA1NzEwNGM3LAotCTB4MDE1N2ZlNjgsCi0JMHhmZGRjZmMwOSwKLQkweDA1MDBmY2UwLAotCTB4ZmQyY2ZkMmMsCi0JMHgwNTAwZmNlMCwKLQkweGZkZGNmYzA5LAotCTB4MDE1N2ZlNjgsCi0JMHgwNTcxMDRjNywKLQkweGZmMjFmYzNhLAotCTB4MDIyOGZjZDcsCi0JMHgwMjc3MDU2ZCwKLQkweGZlMDAwMjAwLAotCTB4ZjkyNzAwMjIsCi0JMHgwMzJiZmUzYywKLQkweGZmM2NmYzQ0LAotCTB4ZmJkYjAzZTksCi0JMHgwMzEzMDQ1NywKLQkweGZmNWMwNGM5LAotCTB4MDNiODAwMGQsCi0JMHgwMDAwZmE1OCwKLQkweDAwZDJmYmU5LAotCTB4ZmUwYmY5ZDAsCi0JMHhmZGY5MDEyNSwKLQkweDAxYmYwNDI1LAotCTB4ZmEyYjAzMjgsCi0JMHgwMmYwZmZhOSwKLQkweDAxNTdmYTI1LAotCTB4ZmUwMDAyMDAsCi0JMHgwNDM4MDM3NCwKLQkweDA1ZmRmZjA0LAotCTB4ZmU1MjAzMGMsCi0JMHhmYjM5MDAzNywKLQkweDA0YzVmZjY5LAotCTB4ZmQyMzA0ZjgsCi0JMHhmYzFiZmQzMSwKLQkweGZkMmNmZDJjLAotCTB4ZmQzMWZjMWIsCi0JMHgwNGY4ZmQyMywKLQkweGZmNjkwNGM1LAotCTB4MDAzN2ZiMzksCi0JMHgwMzBjZmU1MiwKLQkweGZmMDQwNWZkLAotCTB4MDM3NDA0MzgsCi0JMHgwMjAwZmUwMCwKLQkweGZhMjUwMTU3LAotCTB4ZmZhOTAyZjAsCi0JMHgwMzI4ZmEyYiwKLQkweDA0MjUwMWJmLAotCTB4MDEyNWZkZjksCi0JMHhmOWQwZmUwYiwKLQkweGZiZTkwMGQyLAotCTB4ZmE1ODAwMDAsCi0JMHgwMDBkMDNiOCwKLQkweDA0YzlmZjVjLAotCTB4MDQ1NzAzMTMsCi0JMHgwM2U5ZmJkYiwKLQkweGZjNDRmZjNjLAotCTB4ZmUzYzAzMmIsCi0JMHgwMDIyZjkyNywKLQkweDAyMDBmZTAwLAotCTB4MDU2ZDAyNzcsCi0JMHhmY2Q3MDIyOCwKLQkweGZjM2FmZjIxLAotCTB4MDRjNzA1NzEsCi0JMHhmZTY4MDE1NywKLQkweGZjMDlmZGRjLAotCTB4ZmNlMDA1MDAsCi0JMHgwNWE4MDAwMCwKLQkweGZmMTAwNmJlLAotCTB4MDgwMDA4NGEsCi0JMHhmNDljZmM3ZSwKLQkweGZhNTgwNDAwLAotCTB4ZmM5Y2Y2ZGEsCi0JMHhmODAwZjY3MiwKLQkweDA3MTAwNzFjLAotCTB4MDVhODA1YTgsCi0JMHhmOGYwZjhlNCwKLQkweGY4MDBmNjcyLAotCTB4MDM2NDA5MjYsCi0JMHhmYTU4MDQwMCwKLQkweDBiNjQwMzgyLAotCTB4MDgwMDA4NGEsCi0JMHgwMGYwZjk0MiwKLQkweDA1YTgwMDAwLAotCTB4ZmYxMGY5NDIsCi0JMHgwODAwZjdiNiwKLQkweGY0OWMwMzgyLAotCTB4ZmE1OGZjMDAsCi0JMHhmYzljMDkyNiwKLQkweGY4MDAwOThlLAotCTB4MDcxMGY4ZTQsCi0JMHgwNWE4ZmE1OCwKLQkweGY4ZjAwNzFjLAotCTB4ZjgwMDA5OGUsCi0JMHgwMzY0ZjZkYSwKLQkweGZhNThmYzAwLAotCTB4MGI2NGZjN2UsCi0JMHgwODAwZjdiNiwKLQkweDAwZjAwNmJlLAotCTB4MDVhODAwMDAsCi0JMHhmZjEwMDZiZSwKLQkweDA4MDAwODRhLAotCTB4ZjQ5Y2ZjN2UsCi0JMHhmYTU4MDQwMCwKLQkweGZjOWNmNmRhLAotCTB4ZjgwMGY2NzIsCi0JMHgwNzEwMDcxYywKLQkweDA1YTgwNWE4LAotCTB4ZjhmMGY4ZTQsCi0JMHhmODAwZjY3MiwKLQkweDAzNjQwOTI2LAotCTB4ZmE1ODA0MDAsCi0JMHgwYjY0MDM4MiwKLQkweDA4MDAwODRhLAotCTB4MDBmMGY5NDIsCi0JMHgwNWE4MDAwMCwKLQkweGZmMTBmOTQyLAotCTB4MDgwMGY3YjYsCi0JMHhmNDljMDM4MiwKLQkweGZhNThmYzAwLAotCTB4ZmM5YzA5MjYsCi0JMHhmODAwMDk4ZSwKLQkweDA3MTBmOGU0LAotCTB4MDVhOGZhNTgsCi0JMHhmOGYwMDcxYywKLQkweGY4MDAwOThlLAotCTB4MDM2NGY2ZGEsCi0JMHhmYTU4ZmMwMCwKLQkweDBiNjRmYzdlLAotCTB4MDgwMGY3YjYsCi0JMHgwMGYwMDZiZSwKLX07Ci0KLWNvbnN0IHUzMiBub2lzZV92YXJfdGJsX3JldjNbXSA9IHsKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotCTB4MDIxMTAyMTEsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMTEwMjExLAotCTB4MDAwMDAxNGQsCi0JMHgwMjExMDIxMSwKLQkweDAwMDAwMTRkLAotfTsKLQotY29uc3QgdTE2IG1jc190YmxfcmV2M1tdID0gewotCTB4MDAwMCwKLQkweDAwMDgsCi0JMHgwMDBhLAotCTB4MDAxMCwKLQkweDAwMTIsCi0JMHgwMDE5LAotCTB4MDAxYSwKLQkweDAwMWMsCi0JMHgwMDgwLAotCTB4MDA4OCwKLQkweDAwOGEsCi0JMHgwMDkwLAotCTB4MDA5MiwKLQkweDAwOTksCi0JMHgwMDlhLAotCTB4MDA5YywKLQkweDAxMDAsCi0JMHgwMTA4LAotCTB4MDEwYSwKLQkweDAxMTAsCi0JMHgwMTEyLAotCTB4MDExOSwKLQkweDAxMWEsCi0JMHgwMTFjLAotCTB4MDE4MCwKLQkweDAxODgsCi0JMHgwMThhLAotCTB4MDE5MCwKLQkweDAxOTIsCi0JMHgwMTk5LAotCTB4MDE5YSwKLQkweDAxOWMsCi0JMHgwMDAwLAotCTB4MDA5OCwKLQkweDAwYTAsCi0JMHgwMGE4LAotCTB4MDA5YSwKLQkweDAwYTIsCi0JMHgwMGFhLAotCTB4MDEyMCwKLQkweDAxMjgsCi0JMHgwMTI4LAotCTB4MDEzMCwKLQkweDAxMzgsCi0JMHgwMTM4LAotCTB4MDE0MCwKLQkweDAxMjIsCi0JMHgwMTJhLAotCTB4MDEyYSwKLQkweDAxMzIsCi0JMHgwMTNhLAotCTB4MDEzYSwKLQkweDAxNDIsCi0JMHgwMWE4LAotCTB4MDFiMCwKLQkweDAxYjgsCi0JMHgwMWIwLAotCTB4MDFiOCwKLQkweDAxYzAsCi0JMHgwMWM4LAotCTB4MDFjMCwKLQkweDAxYzgsCi0JMHgwMWQwLAotCTB4MDFkMCwKLQkweDAxZDgsCi0JMHgwMWFhLAotCTB4MDFiMiwKLQkweDAxYmEsCi0JMHgwMWIyLAotCTB4MDFiYSwKLQkweDAxYzIsCi0JMHgwMWNhLAotCTB4MDFjMiwKLQkweDAxY2EsCi0JMHgwMWQyLAotCTB4MDFkMiwKLQkweDAxZGEsCi0JMHgwMDAxLAotCTB4MDAwMiwKLQkweDAwMDQsCi0JMHgwMDA5LAotCTB4MDAwYywKLQkweDAwMTEsCi0JMHgwMDE0LAotCTB4MDAxOCwKLQkweDAwMjAsCi0JMHgwMDIxLAotCTB4MDAyMiwKLQkweDAwMjQsCi0JMHgwMDgxLAotCTB4MDA4MiwKLQkweDAwODQsCi0JMHgwMDg5LAotCTB4MDA4YywKLQkweDAwOTEsCi0JMHgwMDk0LAotCTB4MDA5OCwKLQkweDAwYTAsCi0JMHgwMGExLAotCTB4MDBhMiwKLQkweDAwYTQsCi0JMHgwMDA3LAotCTB4MDAwNywKLQkweDAwMDcsCi0JMHgwMDA3LAotCTB4MDAwNywKLQkweDAwMDcsCi0JMHgwMDA3LAotCTB4MDAwNywKLQkweDAwMDcsCi0JMHgwMDA3LAotCTB4MDAwNywKLQkweDAwMDcsCi0JMHgwMDA3LAotCTB4MDAwNywKLQkweDAwMDcsCi0JMHgwMDA3LAotCTB4MDAwNywKLQkweDAwMDcsCi0JMHgwMDA3LAotCTB4MDAwNywKLQkweDAwMDcsCi0JMHgwMDA3LAotCTB4MDAwNywKLQkweDAwMDcsCi0JMHgwMDA3LAotCTB4MDAwNywKLQkweDAwMDcsCi19OwotCi1jb25zdCB1MzIgdGRpX3RibDIwX2FudDBfcmV2M1tdID0gewotCTB4MDAwOTEyMjYsCi0JMHgwMDBhMTQyOSwKLQkweDAwMGI1NmFkLAotCTB4MDAwYzU4YjAsCi0JMHgwMDBkNWFiMywKLQkweDAwMGU5Y2I2LAotCTB4MDAwZjllYmEsCi0JMHgwMDAwYzEzZCwKLQkweDAwMDIwMzAxLAotCTB4MDAwMzA1MDQsCi0JMHgwMDA0MDcwOCwKLQkweDAwMDUwOTBiLAotCTB4MDAwNjRiOGUsCi0JMHgwMDA5NTI5MSwKLQkweDAwMGE1NDk0LAotCTB4MDAwYjk3MTgsCi0JMHgwMDBjOTkyNywKLQkweDAwMGQ5YjJhLAotCTB4MDAwZWRkMmUsCi0JMHgwMDBmZGYzMSwKLQkweDAwMDEwMWI0LAotCTB4MDAwMjQzYjcsCi0JMHgwMDAzNDViYiwKLQkweDAwMDQ0N2JlLAotCTB4MDAwNTg5ODIsCi0JMHgwMDA2OGMwNSwKLQkweDAwMDk5MzA5LAotCTB4MDAwYTk1MGMsCi0JMHgwMDBiZDc4ZiwKLQkweDAwMGNkOTkyLAotCTB4MDAwZGRiOTYsCi0JMHgwMDBmMWQ5OSwKLQkweDAwMDA1ZmE4LAotCTB4MDAwMTQyMmMsCi0JMHgwMDAyODQyZiwKLQkweDAwMDM4NjMyLAotCTB4MDAwNDg4MzUsCi0JMHgwMDA1Y2EzOCwKLQkweDAwMDZjY2JjLAotCTB4MDAwOWQzYmYsCi0JMHgwMDBiMTYwMywKLQkweDAwMGMxODA2LAotCTB4MDAwZDFhMGEsCi0JMHgwMDBlMWMwZCwKLQkweDAwMGY1ZTEwLAotCTB4MDAwMDgwOTMsCi0JMHgwMDAxODI5NywKLQkweDAwMDJjNDlhLAotCTB4MDAwM2M2ODAsCi0JMHgwMDA0Yzg4MCwKLQkweDAwMDYwYjAwLAotCTB4MDAwNzBkMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi19OwotCi1jb25zdCB1MzIgdGRpX3RibDIwX2FudDFfcmV2M1tdID0gewotCTB4MDAwMTRiMjYsCi0JMHgwMDAyOGQyOSwKLQkweDAwMDM5M2FkLAotCTB4MDAwNDk2MzAsCi0JMHgwMDA1ZDgzMywKLQkweDAwMDZkYTM2LAotCTB4MDAwOTljM2EsCi0JMHgwMDBhOWUzZCwKLQkweDAwMGJjMDgxLAotCTB4MDAwY2MyODQsCi0JMHgwMDBkYzQ4OCwKLQkweDAwMGYwNjhiLAotCTB4MDAwMDQ4OGUsCi0JMHgwMDAxOGI5MSwKLQkweDAwMDJkMjE0LAotCTB4MDAwM2Q0MTgsCi0JMHgwMDA0ZDZhNywKLQkweDAwMDYxOGFhLAotCTB4MDAwNzFhYWUsCi0JMHgwMDA5ZGNiMSwKLQkweDAwMGIxZWI0LAotCTB4MDAwYzAxMzcsCi0JMHgwMDBkMDMzYiwKLQkweDAwMGUwNTNlLAotCTB4MDAwZjQ3MDIsCi0JMHgwMDAwODkwNSwKLQkweDAwMDIwYzA5LAotCTB4MDAwMzEyOGMsCi0JMHgwMDA0MTQ4ZiwKLQkweDAwMDUxNzEyLAotCTB4MDAwNjU5MTYsCi0JMHgwMDA5MWIxOSwKLQkweDAwMGExZDI4LAotCTB4MDAwYjVmMmMsCi0JMHgwMDBjNDFhZiwKLQkweDAwMGQ0M2IyLAotCTB4MDAwZTg1YjUsCi0JMHgwMDBmODdiOCwKLQkweDAwMDBjOWJjLAotCTB4MDAwMjRjYmYsCi0JMHgwMDAzNTMwMywKLQkweDAwMDQ1NTA2LAotCTB4MDAwNTk3OGEsCi0JMHgwMDA2OTk4ZCwKLQkweDAwMDk1YjkwLAotCTB4MDAwYTVkOTMsCi0JMHgwMDBiOWY5NywKLQkweDAwMGM4MjFhLAotCTB4MDAwZDg0MDAsCi0JMHgwMDBlYzYwMCwKLQkweDAwMGZjODAwLAotCTB4MDAwMTBhMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi19OwotCi1jb25zdCB1MzIgdGRpX3RibDQwX2FudDBfcmV2M1tdID0gewotCTB4MDAxMWEzNDYsCi0JMHgwMDEzNmNjZiwKLQkweDAwMTRmNWQ5LAotCTB4MDAxNjQxZTIsCi0JMHgwMDE3Y2I2YiwKLQkweDAwMTk1NDc1LAotCTB4MDAxYjIzODMsCi0JMHgwMDFjYWQwYywKLQkweDAwMWU3NjE2LAotCTB4MDAwMDgyMWYsCi0JMHgwMDAyMGJhOCwKLQkweDAwMDNkNGIyLAotCTB4MDAwNTY0NDcsCi0JMHgwMDA3MmRkMCwKLQkweDAwMDhiNmRhLAotCTB4MDAwYTAyZTMsCi0JMHgwMDBiOGM2YywKLQkweDAwMGQxNWY2LAotCTB4MDAxMWU0ODQsCi0JMHgwMDEzYWUwZCwKLQkweDAwMTUzNzE3LAotCTB4MDAxNjgzMjAsCi0JMHgwMDE4MGNhOSwKLQkweDAwMTk5NjMzLAotCTB4MDAxYjY1NDgsCi0JMHgwMDFjZWVkMSwKLQkweDAwMWViN2RiLAotCTB4MDAwMGMzZTQsCi0JMHgwMDAyNGQ2ZCwKLQkweDAwMDQxNmY3LAotCTB4MDAwNWE1ODUsCi0JMHgwMDA3NmYwZiwKLQkweDAwMDhmODE4LAotCTB4MDAwYTQ0MjEsCi0JMHgwMDBiY2RhYiwKLQkweDAwMGQ5NzM0LAotCTB4MDAxMjI2NDksCi0JMHgwMDEzZWZkMiwKLQkweDAwMTU3OGRjLAotCTB4MDAxNmM0ZTUsCi0JMHgwMDE4NGU2ZSwKLQkweDAwMWExN2Y4LAotCTB4MDAxYmE2ODYsCi0JMHgwMDFkMzAxMCwKLQkweDAwMWVmOTk5LAotCTB4MDAwMTA1MjIsCi0JMHgwMDAyOGVhYywKLQkweDAwMDQ1ODM1LAotCTB4MDAwNWU3NGEsCi0JMHgwMDA3YjBkMywKLQkweDAwMDkzYTVkLAotCTB4MDAwYTg1ZTYsCi0JMHgwMDBjMGY2ZiwKLQkweDAwMGRkOGY5LAotCTB4MDAxMjY3ODcsCi0JMHgwMDE0MzExMSwKLQkweDAwMTViYTlhLAotCTB4MDAxNzA2MjMsCi0JMHgwMDE4OGZhZCwKLQkweDAwMWE1OTM2LAotCTB4MDAxYmU4NGIsCi0JMHgwMDFkYjFkNCwKLQkweDAwMWYzYjVlLAotCTB4MDAwMTQ2ZTcsCi0JMHgwMDAzMTA3MCwKLQkweDAwMDQ5OWZhLAotCTB4MDAwNjI4ODgsCi0JMHgwMDA3ZjIxMiwKLQkweDAwMDk3YjliLAotCTB4MDAwYWM3YTQsCi0JMHgwMDBjNTBhZSwKLQkweDAwMGUxYTM3LAotCTB4MDAxMmE5NGMsCi0JMHgwMDE0NzJkNSwKLQkweDAwMTVmYzVmLAotCTB4MDAxNzQ4NjgsCi0JMHgwMDE4ZDE3MSwKLQkweDAwMWE5YWZiLAotCTB4MDAxYzI5ODksCi0JMHgwMDFkZjMxMywKLQkweDAwMWY3YzljLAotCTB4MDAwMTg4YTUsCi0JMHgwMDAzNTFhZiwKLQkweDAwMDRkYjM4LAotCTB4MDAwNmFhNGQsCi0JMHgwMDA4MzNkNywKLQkweDAwMDliZDYwLAotCTB4MDAwYjA5NjksCi0JMHgwMDBjOTI3MywKLQkweDAwMGU1YmZjLAotCTB4MDAxMzJhOGEsCi0JMHgwMDE0YjQxNCwKLQkweDAwMTYzZDlkLAotCTB4MDAxNzg5YTYsCi0JMHgwMDE5MTJiMCwKLQkweDAwMWFkYzM5LAotCTB4MDAxYzZiY2UsCi0JMHgwMDFlMzRkOCwKLQkweDAwMWZiZTYxLAotCTB4MDAwMWNhNmEsCi0JMHgwMDAzOTM3NCwKLQkweDAwMDUxY2ZkLAotCTB4MDAwNmVjMGIsCi0JMHgwMDA4NzUxNSwKLQkweDAwMDlmZTllLAotCTB4MDAwYjRhYTcsCi0JMHgwMDBjZDNiMSwKLQkweDAwMGU5ZDNhLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLX07Ci0KLWNvbnN0IHUzMiB0ZGlfdGJsNDBfYW50MV9yZXYzW10gPSB7Ci0JMHgwMDFlZGIzNiwKLQkweDAwMDEyOWNhLAotCTB4MDAwMmIzNTMsCi0JMHgwMDA0N2NkZCwKLQkweDAwMDVjOGU2LAotCTB4MDAwNzkxZWYsCi0JMHgwMDA5MWJmOSwKLQkweDAwMGFhYTA3LAotCTB4MDAwYzMzOTEsCi0JMHgwMDBkZmQxYSwKLQkweDAwMTIwOTIzLAotCTB4MDAxM2QyMmQsCi0JMHgwMDE1NWMzNywKLQkweDAwMTZlYWNiLAotCTB4MDAxODc0NTQsCi0JMHgwMDFhM2RkZSwKLQkweDAwMWI4OWU3LAotCTB4MDAxZDEyZjAsCi0JMHgwMDFmMWNmYSwKLQkweDAwMDE2Yjg4LAotCTB4MDAwMzM0OTIsCi0JMHgwMDA0YmUxYiwKLQkweDAwMDYwYTI0LAotCTB4MDAwN2QzMmUsCi0JMHgwMDA5NWQzOCwKLQkweDAwMGFlYzRjLAotCTB4MDAwYzc1NTUsCi0JMHgwMDBlM2VkZiwKLQkweDAwMTI0YWU4LAotCTB4MDAxNDEzZjEsCi0JMHgwMDE1YTM3YiwKLQkweDAwMTcyYzg5LAotCTB4MDAxOGI1OTMsCi0JMHgwMDFhNDE5YywKLQkweDAwMWJjYjI1LAotCTB4MDAxZDk0MmYsCi0JMHgwMDFmNjNiOSwKLQkweDAwMDFhZDRkLAotCTB4MDAwMzc2NTcsCi0JMHgwMDA0YzI2MCwKLQkweDAwMDY4YmU5LAotCTB4MDAwODE0ZjMsCi0JMHgwMDA5YTQ3YywKLQkweDAwMGIyZDhhLAotCTB4MDAwY2I2OTQsCi0JMHgwMDBlNDI5ZCwKLQkweDAwMTI4YzI2LAotCTB4MDAxNDU1YjAsCi0JMHgwMDE1ZTRiYSwKLQkweDAwMTc2ZTRlLAotCTB4MDAxOGY3NTgsCi0JMHgwMDFhODM2MSwKLQkweDAwMWMwY2VhLAotCTB4MDAxZGQ2NzQsCi0JMHgwMDFmYTU3ZCwKLQkweDAwMDFlZThiLAotCTB4MDAwM2I3OTUsCi0JMHgwMDA1MDM5ZSwKLQkweDAwMDZjZDI3LAotCTB4MDAwODU2YjEsCi0JMHgwMDA5ZTVjNiwKLQkweDAwMGI2ZjRmLAotCTB4MDAwY2Y4NTksCi0JMHgwMDBlODQ2MiwKLQkweDAwMTMwZGViLAotCTB4MDAxNDk3NzUsCi0JMHgwMDE2MjYwMywKLQkweDAwMTdhZjhjLAotCTB4MDAxOTM4OTYsCi0JMHgwMDFhYzQ5ZiwKLQkweDAwMWM0ZTI4LAotCTB4MDAxZTE3YjIsCi0JMHgwMDAwYTZjNywKLQkweDAwMDIzMDUwLAotCTB4MDAwM2Y5ZGEsCi0JMHgwMDA1NDU2MywKLQkweDAwMDcwZWVjLAotCTB4MDAwODk4NzYsCi0JMHgwMDBhMjcwNCwKLQkweDAwMGJiMDhkLAotCTB4MDAwZDNhMTcsCi0JMHgwMDExODVhMCwKLQkweDAwMTM0ZjI5LAotCTB4MDAxNGQ4YjMsCi0JMHgwMDE2NjdjOCwKLQkweDAwMTdmMTUxLAotCTB4MDAxOTdhZGIsCi0JMHgwMDFiMDY2NCwKLQkweDAwMWM4ZmVkLAotCTB4MDAxZTU5NzcsCi0JMHgwMDAwZTgwNSwKLQkweDAwMDI3MThmLAotCTB4MDAwNDNiMTgsCi0JMHgwMDA1ODZhMSwKLQkweDAwMDc1MDJiLAotCTB4MDAwOGQ5YjQsCi0JMHgwMDBhNjhjOSwKLQkweDAwMGJmMjUyLAotCTB4MDAwZGJiZGMsCi0JMHgwMDExYzdlNSwKLQkweDAwMTM5MGVlLAotCTB4MDAxNTFhNzgsCi0JMHgwMDE2YTkwNiwKLQkweDAwMTgzMjkwLAotCTB4MDAxOWJjMTksCi0JMHgwMDFiNDgyMiwKLQkweDAwMWNkMTJjLAotCTB4MDAxZTlhYjUsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotfTsKLQotY29uc3QgdTMyIHBsdGx1dF90YmxfcmV2M1tdID0gewotCTB4NzY1NDAyMTMsCi0JMHg2MjQwNzM1MSwKLQkweDc2NTQzMjEwLAotCTB4NzY1NDAyMTMsCi0JMHg3NjU0MDIxMywKLQkweDc2NDMwNTIxLAotfTsKLQotY29uc3QgdTMyIGNoYW5lc3RfdGJsX3JldjNbXSA9IHsKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHg0NDQ0NDQ0NCwKLQkweDQ0NDQ0NDQ0LAotCTB4NDQ0NDQ0NDQsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLQkweDEwMTAxMDEwLAotCTB4MTAxMDEwMTAsCi0JMHgxMDEwMTAxMCwKLX07Ci0KLWNvbnN0IHU4IGZyYW1lX2x1dF9yZXYzW10gPSB7Ci0JMHgwMiwKLQkweDA0LAotCTB4MTQsCi0JMHgxNCwKLQkweDAzLAotCTB4MDUsCi0JMHgxNiwKLQkweDE2LAotCTB4MGEsCi0JMHgwYywKLQkweDFjLAotCTB4MWMsCi0JMHgwYiwKLQkweDBkLAotCTB4MWUsCi0JMHgxZSwKLQkweDA2LAotCTB4MDgsCi0JMHgxOCwKLQkweDE4LAotCTB4MDcsCi0JMHgwOSwKLQkweDFhLAotCTB4MWEsCi0JMHgwZSwKLQkweDEwLAotCTB4MjAsCi0JMHgyOCwKLQkweDBmLAotCTB4MTEsCi0JMHgyMiwKLQkweDJhLAotfTsKLQotY29uc3QgdTggZXN0X3B3cl9sdXRfY29yZTBfcmV2M1tdID0gewotCTB4NTUsCi0JMHg1NCwKLQkweDU0LAotCTB4NTMsCi0JMHg1MiwKLQkweDUyLAotCTB4NTEsCi0JMHg1MSwKLQkweDUwLAotCTB4NGYsCi0JMHg0ZiwKLQkweDRlLAotCTB4NGUsCi0JMHg0ZCwKLQkweDRjLAotCTB4NGMsCi0JMHg0YiwKLQkweDRhLAotCTB4NDksCi0JMHg0OSwKLQkweDQ4LAotCTB4NDcsCi0JMHg0NiwKLQkweDQ2LAotCTB4NDUsCi0JMHg0NCwKLQkweDQzLAotCTB4NDIsCi0JMHg0MSwKLQkweDQwLAotCTB4NDAsCi0JMHgzZiwKLQkweDNlLAotCTB4M2QsCi0JMHgzYywKLQkweDNhLAotCTB4MzksCi0JMHgzOCwKLQkweDM3LAotCTB4MzYsCi0JMHgzNSwKLQkweDMzLAotCTB4MzIsCi0JMHgzMSwKLQkweDJmLAotCTB4MmUsCi0JMHgyYywKLQkweDJiLAotCTB4MjksCi0JMHgyNywKLQkweDI1LAotCTB4MjMsCi0JMHgyMSwKLQkweDFmLAotCTB4MWQsCi0JMHgxYSwKLQkweDE4LAotCTB4MTUsCi0JMHgxMiwKLQkweDBlLAotCTB4MGIsCi0JMHgwNywKLQkweDAyLAotCTB4ZmQsCi19OwotCi1jb25zdCB1OCBlc3RfcHdyX2x1dF9jb3JlMV9yZXYzW10gPSB7Ci0JMHg1NSwKLQkweDU0LAotCTB4NTQsCi0JMHg1MywKLQkweDUyLAotCTB4NTIsCi0JMHg1MSwKLQkweDUxLAotCTB4NTAsCi0JMHg0ZiwKLQkweDRmLAotCTB4NGUsCi0JMHg0ZSwKLQkweDRkLAotCTB4NGMsCi0JMHg0YywKLQkweDRiLAotCTB4NGEsCi0JMHg0OSwKLQkweDQ5LAotCTB4NDgsCi0JMHg0NywKLQkweDQ2LAotCTB4NDYsCi0JMHg0NSwKLQkweDQ0LAotCTB4NDMsCi0JMHg0MiwKLQkweDQxLAotCTB4NDAsCi0JMHg0MCwKLQkweDNmLAotCTB4M2UsCi0JMHgzZCwKLQkweDNjLAotCTB4M2EsCi0JMHgzOSwKLQkweDM4LAotCTB4MzcsCi0JMHgzNiwKLQkweDM1LAotCTB4MzMsCi0JMHgzMiwKLQkweDMxLAotCTB4MmYsCi0JMHgyZSwKLQkweDJjLAotCTB4MmIsCi0JMHgyOSwKLQkweDI3LAotCTB4MjUsCi0JMHgyMywKLQkweDIxLAotCTB4MWYsCi0JMHgxZCwKLQkweDFhLAotCTB4MTgsCi0JMHgxNSwKLQkweDEyLAotCTB4MGUsCi0JMHgwYiwKLQkweDA3LAotCTB4MDIsCi0JMHhmZCwKLX07Ci0KLWNvbnN0IHU4IGFkal9wd3JfbHV0X2NvcmUwX3JldjNbXSA9IHsKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi19OwotCi1jb25zdCB1OCBhZGpfcHdyX2x1dF9jb3JlMV9yZXYzW10gPSB7Ci0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotCTB4MDAsCi0JMHgwMCwKLQkweDAwLAotfTsKLQotY29uc3QgdTMyIGdhaW5jdHJsX2x1dF9jb3JlMF9yZXYzW10gPSB7Ci0JMHg1YmY3MDA0NCwKLQkweDViZjcwMDQyLAotCTB4NWJmNzAwNDAsCi0JMHg1YmY3MDAzZSwKLQkweDViZjcwMDNjLAotCTB4NWJmNzAwM2IsCi0JMHg1YmY3MDAzOSwKLQkweDViZjcwMDM3LAotCTB4NWJmNzAwMzYsCi0JMHg1YmY3MDAzNCwKLQkweDViZjcwMDMzLAotCTB4NWJmNzAwMzEsCi0JMHg1YmY3MDAzMCwKLQkweDViYTcwMDQ0LAotCTB4NWJhNzAwNDIsCi0JMHg1YmE3MDA0MCwKLQkweDViYTcwMDNlLAotCTB4NWJhNzAwM2MsCi0JMHg1YmE3MDAzYiwKLQkweDViYTcwMDM5LAotCTB4NWJhNzAwMzcsCi0JMHg1YmE3MDAzNiwKLQkweDViYTcwMDM0LAotCTB4NWJhNzAwMzMsCi0JMHg1Yjc3MDA0NCwKLQkweDViNzcwMDQyLAotCTB4NWI3NzAwNDAsCi0JMHg1Yjc3MDAzZSwKLQkweDViNzcwMDNjLAotCTB4NWI3NzAwM2IsCi0JMHg1Yjc3MDAzOSwKLQkweDViNzcwMDM3LAotCTB4NWI3NzAwMzYsCi0JMHg1Yjc3MDAzNCwKLQkweDViNzcwMDMzLAotCTB4NWI3NzAwMzEsCi0JMHg1Yjc3MDAzMCwKLQkweDViNzcwMDJmLAotCTB4NWI3NzAwMmQsCi0JMHg1Yjc3MDAyYywKLQkweDViNDcwMDQ0LAotCTB4NWI0NzAwNDIsCi0JMHg1YjQ3MDA0MCwKLQkweDViNDcwMDNlLAotCTB4NWI0NzAwM2MsCi0JMHg1YjQ3MDAzYiwKLQkweDViNDcwMDM5LAotCTB4NWI0NzAwMzcsCi0JMHg1YjQ3MDAzNiwKLQkweDViNDcwMDM0LAotCTB4NWI0NzAwMzMsCi0JMHg1YjQ3MDAzMSwKLQkweDViNDcwMDMwLAotCTB4NWI0NzAwMmYsCi0JMHg1YjQ3MDAyZCwKLQkweDViNDcwMDJjLAotCTB4NWI0NzAwMmIsCi0JMHg1YjQ3MDAyYSwKLQkweDViMjcwMDQ0LAotCTB4NWIyNzAwNDIsCi0JMHg1YjI3MDA0MCwKLQkweDViMjcwMDNlLAotCTB4NWIyNzAwM2MsCi0JMHg1YjI3MDAzYiwKLQkweDViMjcwMDM5LAotCTB4NWIyNzAwMzcsCi0JMHg1YjI3MDAzNiwKLQkweDViMjcwMDM0LAotCTB4NWIyNzAwMzMsCi0JMHg1YjI3MDAzMSwKLQkweDViMjcwMDMwLAotCTB4NWIyNzAwMmYsCi0JMHg1YjE3MDA0NCwKLQkweDViMTcwMDQyLAotCTB4NWIxNzAwNDAsCi0JMHg1YjE3MDAzZSwKLQkweDViMTcwMDNjLAotCTB4NWIxNzAwM2IsCi0JMHg1YjE3MDAzOSwKLQkweDViMTcwMDM3LAotCTB4NWIxNzAwMzYsCi0JMHg1YjE3MDAzNCwKLQkweDViMTcwMDMzLAotCTB4NWIxNzAwMzEsCi0JMHg1YjE3MDAzMCwKLQkweDViMTcwMDJmLAotCTB4NWIxNzAwMmQsCi0JMHg1YjE3MDAyYywKLQkweDViMTcwMDJiLAotCTB4NWIxNzAwMmEsCi0JMHg1YjE3MDAyOCwKLQkweDViMTcwMDI3LAotCTB4NWIxNzAwMjYsCi0JMHg1YjE3MDAyNSwKLQkweDViMTcwMDI0LAotCTB4NWIxNzAwMjMsCi0JMHg1YjA3MDA0NCwKLQkweDViMDcwMDQyLAotCTB4NWIwNzAwNDAsCi0JMHg1YjA3MDAzZSwKLQkweDViMDcwMDNjLAotCTB4NWIwNzAwM2IsCi0JMHg1YjA3MDAzOSwKLQkweDViMDcwMDM3LAotCTB4NWIwNzAwMzYsCi0JMHg1YjA3MDAzNCwKLQkweDViMDcwMDMzLAotCTB4NWIwNzAwMzEsCi0JMHg1YjA3MDAzMCwKLQkweDViMDcwMDJmLAotCTB4NWIwNzAwMmQsCi0JMHg1YjA3MDAyYywKLQkweDViMDcwMDJiLAotCTB4NWIwNzAwMmEsCi0JMHg1YjA3MDAyOCwKLQkweDViMDcwMDI3LAotCTB4NWIwNzAwMjYsCi0JMHg1YjA3MDAyNSwKLQkweDViMDcwMDI0LAotCTB4NWIwNzAwMjMsCi0JMHg1YjA3MDAyMiwKLQkweDViMDcwMDIxLAotCTB4NWIwNzAwMjAsCi0JMHg1YjA3MDAxZiwKLQkweDViMDcwMDFlLAotCTB4NWIwNzAwMWQsCi0JMHg1YjA3MDAxZCwKLQkweDViMDcwMDFjLAotfTsKLQotY29uc3QgdTMyIGdhaW5jdHJsX2x1dF9jb3JlMV9yZXYzW10gPSB7Ci0JMHg1YmY3MDA0NCwKLQkweDViZjcwMDQyLAotCTB4NWJmNzAwNDAsCi0JMHg1YmY3MDAzZSwKLQkweDViZjcwMDNjLAotCTB4NWJmNzAwM2IsCi0JMHg1YmY3MDAzOSwKLQkweDViZjcwMDM3LAotCTB4NWJmNzAwMzYsCi0JMHg1YmY3MDAzNCwKLQkweDViZjcwMDMzLAotCTB4NWJmNzAwMzEsCi0JMHg1YmY3MDAzMCwKLQkweDViYTcwMDQ0LAotCTB4NWJhNzAwNDIsCi0JMHg1YmE3MDA0MCwKLQkweDViYTcwMDNlLAotCTB4NWJhNzAwM2MsCi0JMHg1YmE3MDAzYiwKLQkweDViYTcwMDM5LAotCTB4NWJhNzAwMzcsCi0JMHg1YmE3MDAzNiwKLQkweDViYTcwMDM0LAotCTB4NWJhNzAwMzMsCi0JMHg1Yjc3MDA0NCwKLQkweDViNzcwMDQyLAotCTB4NWI3NzAwNDAsCi0JMHg1Yjc3MDAzZSwKLQkweDViNzcwMDNjLAotCTB4NWI3NzAwM2IsCi0JMHg1Yjc3MDAzOSwKLQkweDViNzcwMDM3LAotCTB4NWI3NzAwMzYsCi0JMHg1Yjc3MDAzNCwKLQkweDViNzcwMDMzLAotCTB4NWI3NzAwMzEsCi0JMHg1Yjc3MDAzMCwKLQkweDViNzcwMDJmLAotCTB4NWI3NzAwMmQsCi0JMHg1Yjc3MDAyYywKLQkweDViNDcwMDQ0LAotCTB4NWI0NzAwNDIsCi0JMHg1YjQ3MDA0MCwKLQkweDViNDcwMDNlLAotCTB4NWI0NzAwM2MsCi0JMHg1YjQ3MDAzYiwKLQkweDViNDcwMDM5LAotCTB4NWI0NzAwMzcsCi0JMHg1YjQ3MDAzNiwKLQkweDViNDcwMDM0LAotCTB4NWI0NzAwMzMsCi0JMHg1YjQ3MDAzMSwKLQkweDViNDcwMDMwLAotCTB4NWI0NzAwMmYsCi0JMHg1YjQ3MDAyZCwKLQkweDViNDcwMDJjLAotCTB4NWI0NzAwMmIsCi0JMHg1YjQ3MDAyYSwKLQkweDViMjcwMDQ0LAotCTB4NWIyNzAwNDIsCi0JMHg1YjI3MDA0MCwKLQkweDViMjcwMDNlLAotCTB4NWIyNzAwM2MsCi0JMHg1YjI3MDAzYiwKLQkweDViMjcwMDM5LAotCTB4NWIyNzAwMzcsCi0JMHg1YjI3MDAzNiwKLQkweDViMjcwMDM0LAotCTB4NWIyNzAwMzMsCi0JMHg1YjI3MDAzMSwKLQkweDViMjcwMDMwLAotCTB4NWIyNzAwMmYsCi0JMHg1YjE3MDA0NCwKLQkweDViMTcwMDQyLAotCTB4NWIxNzAwNDAsCi0JMHg1YjE3MDAzZSwKLQkweDViMTcwMDNjLAotCTB4NWIxNzAwM2IsCi0JMHg1YjE3MDAzOSwKLQkweDViMTcwMDM3LAotCTB4NWIxNzAwMzYsCi0JMHg1YjE3MDAzNCwKLQkweDViMTcwMDMzLAotCTB4NWIxNzAwMzEsCi0JMHg1YjE3MDAzMCwKLQkweDViMTcwMDJmLAotCTB4NWIxNzAwMmQsCi0JMHg1YjE3MDAyYywKLQkweDViMTcwMDJiLAotCTB4NWIxNzAwMmEsCi0JMHg1YjE3MDAyOCwKLQkweDViMTcwMDI3LAotCTB4NWIxNzAwMjYsCi0JMHg1YjE3MDAyNSwKLQkweDViMTcwMDI0LAotCTB4NWIxNzAwMjMsCi0JMHg1YjA3MDA0NCwKLQkweDViMDcwMDQyLAotCTB4NWIwNzAwNDAsCi0JMHg1YjA3MDAzZSwKLQkweDViMDcwMDNjLAotCTB4NWIwNzAwM2IsCi0JMHg1YjA3MDAzOSwKLQkweDViMDcwMDM3LAotCTB4NWIwNzAwMzYsCi0JMHg1YjA3MDAzNCwKLQkweDViMDcwMDMzLAotCTB4NWIwNzAwMzEsCi0JMHg1YjA3MDAzMCwKLQkweDViMDcwMDJmLAotCTB4NWIwNzAwMmQsCi0JMHg1YjA3MDAyYywKLQkweDViMDcwMDJiLAotCTB4NWIwNzAwMmEsCi0JMHg1YjA3MDAyOCwKLQkweDViMDcwMDI3LAotCTB4NWIwNzAwMjYsCi0JMHg1YjA3MDAyNSwKLQkweDViMDcwMDI0LAotCTB4NWIwNzAwMjMsCi0JMHg1YjA3MDAyMiwKLQkweDViMDcwMDIxLAotCTB4NWIwNzAwMjAsCi0JMHg1YjA3MDAxZiwKLQkweDViMDcwMDFlLAotCTB4NWIwNzAwMWQsCi0JMHg1YjA3MDAxZCwKLQkweDViMDcwMDFjLAotfTsKLQotY29uc3QgdTMyIGlxX2x1dF9jb3JlMF9yZXYzW10gPSB7Ci0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotfTsKLQotY29uc3QgdTMyIGlxX2x1dF9jb3JlMV9yZXYzW10gPSB7Ci0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotfTsKLQotY29uc3QgdTE2IGxvZnRfbHV0X2NvcmUwX3JldjNbXSA9IHsKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotfTsKLQotY29uc3QgdTE2IGxvZnRfbHV0X2NvcmUxX3JldjNbXSA9IHsKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotCTB4MDAwMCwKLQkweDAwMDAsCi0JMHgwMDAwLAotfTsKLQotY29uc3QgdTE2IHBhcGRfY29tcF9yZnB3cl90YmxfY29yZTBfcmV2M1tdID0gewotCTB4MDAzNiwKLQkweDAwMzYsCi0JMHgwMDM2LAotCTB4MDAzNiwKLQkweDAwMzYsCi0JMHgwMDM2LAotCTB4MDAzNiwKLQkweDAwMzYsCi0JMHgwMDM2LAotCTB4MDAzNiwKLQkweDAwMzYsCi0JMHgwMDM2LAotCTB4MDAzNiwKLQkweDAwMmEsCi0JMHgwMDJhLAotCTB4MDAyYSwKLQkweDAwMmEsCi0JMHgwMDJhLAotCTB4MDAyYSwKLQkweDAwMmEsCi0JMHgwMDJhLAotCTB4MDAyYSwKLQkweDAwMmEsCi0JMHgwMDJhLAotCTB4MDAxZSwKLQkweDAwMWUsCi0JMHgwMDFlLAotCTB4MDAxZSwKLQkweDAwMWUsCi0JMHgwMDFlLAotCTB4MDAxZSwKLQkweDAwMWUsCi0JMHgwMDFlLAotCTB4MDAxZSwKLQkweDAwMWUsCi0JMHgwMDFlLAotCTB4MDAxZSwKLQkweDAwMWUsCi0JMHgwMDFlLAotCTB4MDAxZSwKLQkweDAwMGUsCi0JMHgwMDBlLAotCTB4MDAwZSwKLQkweDAwMGUsCi0JMHgwMDBlLAotCTB4MDAwZSwKLQkweDAwMGUsCi0JMHgwMDBlLAotCTB4MDAwZSwKLQkweDAwMGUsCi0JMHgwMDBlLAotCTB4MDAwZSwKLQkweDAwMGUsCi0JMHgwMDBlLAotCTB4MDAwZSwKLQkweDAwMGUsCi0JMHgwMDBlLAotCTB4MDAwZSwKLQkweDAxZmMsCi0JMHgwMWZjLAotCTB4MDFmYywKLQkweDAxZmMsCi0JMHgwMWZjLAotCTB4MDFmYywKLQkweDAxZmMsCi0JMHgwMWZjLAotCTB4MDFmYywKLQkweDAxZmMsCi0JMHgwMWZjLAotCTB4MDFmYywKLQkweDAxZmMsCi0JMHgwMWZjLAotCTB4MDFlZSwKLQkweDAxZWUsCi0JMHgwMWVlLAotCTB4MDFlZSwKLQkweDAxZWUsCi0JMHgwMWVlLAotCTB4MDFlZSwKLQkweDAxZWUsCi0JMHgwMWVlLAotCTB4MDFlZSwKLQkweDAxZWUsCi0JMHgwMWVlLAotCTB4MDFlZSwKLQkweDAxZWUsCi0JMHgwMWVlLAotCTB4MDFlZSwKLQkweDAxZWUsCi0JMHgwMWVlLAotCTB4MDFlZSwKLQkweDAxZWUsCi0JMHgwMWVlLAotCTB4MDFlZSwKLQkweDAxZWUsCi0JMHgwMWVlLAotCTB4MDFkNiwKLQkweDAxZDYsCi0JMHgwMWQ2LAotCTB4MDFkNiwKLQkweDAxZDYsCi0JMHgwMWQ2LAotCTB4MDFkNiwKLQkweDAxZDYsCi0JMHgwMWQ2LAotCTB4MDFkNiwKLQkweDAxZDYsCi0JMHgwMWQ2LAotCTB4MDFkNiwKLQkweDAxZDYsCi0JMHgwMWQ2LAotCTB4MDFkNiwKLQkweDAxZDYsCi0JMHgwMWQ2LAotCTB4MDFkNiwKLQkweDAxZDYsCi0JMHgwMWQ2LAotCTB4MDFkNiwKLQkweDAxZDYsCi0JMHgwMWQ2LAotCTB4MDFkNiwKLQkweDAxZDYsCi0JMHgwMWQ2LAotCTB4MDFkNiwKLQkweDAxZDYsCi0JMHgwMWQ2LAotCTB4MDFkNiwKLQkweDAxZDYsCi19OwotCi1jb25zdCB1MTYgcGFwZF9jb21wX3JmcHdyX3RibF9jb3JlMV9yZXYzW10gPSB7Ci0JMHgwMDM2LAotCTB4MDAzNiwKLQkweDAwMzYsCi0JMHgwMDM2LAotCTB4MDAzNiwKLQkweDAwMzYsCi0JMHgwMDM2LAotCTB4MDAzNiwKLQkweDAwMzYsCi0JMHgwMDM2LAotCTB4MDAzNiwKLQkweDAwMzYsCi0JMHgwMDM2LAotCTB4MDAyYSwKLQkweDAwMmEsCi0JMHgwMDJhLAotCTB4MDAyYSwKLQkweDAwMmEsCi0JMHgwMDJhLAotCTB4MDAyYSwKLQkweDAwMmEsCi0JMHgwMDJhLAotCTB4MDAyYSwKLQkweDAwMmEsCi0JMHgwMDFlLAotCTB4MDAxZSwKLQkweDAwMWUsCi0JMHgwMDFlLAotCTB4MDAxZSwKLQkweDAwMWUsCi0JMHgwMDFlLAotCTB4MDAxZSwKLQkweDAwMWUsCi0JMHgwMDFlLAotCTB4MDAxZSwKLQkweDAwMWUsCi0JMHgwMDFlLAotCTB4MDAxZSwKLQkweDAwMWUsCi0JMHgwMDFlLAotCTB4MDAwZSwKLQkweDAwMGUsCi0JMHgwMDBlLAotCTB4MDAwZSwKLQkweDAwMGUsCi0JMHgwMDBlLAotCTB4MDAwZSwKLQkweDAwMGUsCi0JMHgwMDBlLAotCTB4MDAwZSwKLQkweDAwMGUsCi0JMHgwMDBlLAotCTB4MDAwZSwKLQkweDAwMGUsCi0JMHgwMDBlLAotCTB4MDAwZSwKLQkweDAwMGUsCi0JMHgwMDBlLAotCTB4MDFmYywKLQkweDAxZmMsCi0JMHgwMWZjLAotCTB4MDFmYywKLQkweDAxZmMsCi0JMHgwMWZjLAotCTB4MDFmYywKLQkweDAxZmMsCi0JMHgwMWZjLAotCTB4MDFmYywKLQkweDAxZmMsCi0JMHgwMWZjLAotCTB4MDFmYywKLQkweDAxZmMsCi0JMHgwMWVlLAotCTB4MDFlZSwKLQkweDAxZWUsCi0JMHgwMWVlLAotCTB4MDFlZSwKLQkweDAxZWUsCi0JMHgwMWVlLAotCTB4MDFlZSwKLQkweDAxZWUsCi0JMHgwMWVlLAotCTB4MDFlZSwKLQkweDAxZWUsCi0JMHgwMWVlLAotCTB4MDFlZSwKLQkweDAxZWUsCi0JMHgwMWVlLAotCTB4MDFlZSwKLQkweDAxZWUsCi0JMHgwMWVlLAotCTB4MDFlZSwKLQkweDAxZWUsCi0JMHgwMWVlLAotCTB4MDFlZSwKLQkweDAxZWUsCi0JMHgwMWQ2LAotCTB4MDFkNiwKLQkweDAxZDYsCi0JMHgwMWQ2LAotCTB4MDFkNiwKLQkweDAxZDYsCi0JMHgwMWQ2LAotCTB4MDFkNiwKLQkweDAxZDYsCi0JMHgwMWQ2LAotCTB4MDFkNiwKLQkweDAxZDYsCi0JMHgwMWQ2LAotCTB4MDFkNiwKLQkweDAxZDYsCi0JMHgwMWQ2LAotCTB4MDFkNiwKLQkweDAxZDYsCi0JMHgwMWQ2LAotCTB4MDFkNiwKLQkweDAxZDYsCi0JMHgwMWQ2LAotCTB4MDFkNiwKLQkweDAxZDYsCi0JMHgwMWQ2LAotCTB4MDFkNiwKLQkweDAxZDYsCi0JMHgwMWQ2LAotCTB4MDFkNiwKLQkweDAxZDYsCi0JMHgwMWQ2LAotCTB4MDFkNiwKLX07Ci0KLWNvbnN0IHUzMiBwYXBkX2NvbXBfZXBzaWxvbl90YmxfY29yZTBfcmV2M1tdID0gewotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMWZhMCwKLQkweDAwMDE5Zjc4LAotCTB4MDAwMWRmN2UsCi0JMHgwM2ZhOWY4NiwKLQkweDAzZmQxZjkwLAotCTB4MDNmZTVmOGEsCi0JMHgwM2ZiMWY5NCwKLQkweDAzZmQ5ZmEwLAotCTB4MDAwMDlmOTgsCi0JMHgwM2ZkMWZhYywKLQkweDAzZmY5ZmEyLAotCTB4MDNmZTlmYWUsCi0JMHgwMDAwMWZhZSwKLQkweDAzZmRkZmI0LAotCTB4MDNmZjFmYjgsCi0JMHgwM2ZmOWZiYywKLQkweDAzZmZkZmJlLAotCTB4MDNmZTlmYzIsCi0JMHgwM2ZlZGZjNiwKLQkweDAzZmVkZmM2LAotCTB4MDNmZjlmYzgsCi0JMHgwM2ZmNWZjNiwKLQkweDAzZmVkZmMyLAotCTB4MDNmZjlmYzAsCi0JMHgwM2ZmNWZhYywKLQkweDAzZmY1ZmFjLAotCTB4MDNmZjlmYTIsCi0JMHgwM2ZmOWZhNiwKLQkweDAzZmY5ZmFhLAotCTB4MDNmZjVmYjAsCi0JMHgwM2ZmNWZiNCwKLQkweDAzZmYxZmNhLAotCTB4MDNmZjVmY2UsCi0JMHgwM2ZjZGZkYywKLQkweDAzZmI0MDA2LAotCTB4MDAwMDAwMzAsCi0JMHgwM2ZmODA4YSwKLQkweDAzZmY4MGRhLAotCTB4MDAwMDAxNmMsCi0JMHgwM2ZmODMxOCwKLQkweDAzZmYwNjNhLAotCTB4MDNmZDhiZDYsCi0JMHgwMDAxNGZmZSwKLQkweDAwMDM0ZmZlLAotCTB4MDAwMzRmZmUsCi0JMHgwMDAzY2ZmZSwKLQkweDAwMDQwZmZlLAotCTB4MDAwNDBmZmUsCi0JMHgwMDAzY2ZmZSwKLQkweDAwMDNjZmZlLAotCTB4MDAwMjBmZmUsCi0JMHgwM2ZlMGZmZSwKLQkweDAzZmRjZmZlLAotCTB4MDNmOTRmZmUsCi0JMHgwM2Y1NGZmZSwKLQkweDAzZjQ0ZmZlLAotCTB4MDNlZjhmZmUsCi0JMHgwM2VlMGZmZSwKLQkweDAzZWJjZmZlLAotCTB4MDNlOGNmZmUsCi0JMHgwM2U3NGZmZSwKLQkweDAzZTRjZmZlLAotCTB4MDNlMzhmZmUsCi19OwotCi1jb25zdCB1MzIgcGFwZF9jYWxfc2NhbGFyc190YmxfY29yZTBfcmV2M1tdID0gewotCTB4MDVhZjAwNWEsCi0JMHgwNTcxMDA1ZSwKLQkweDA1MDQwMDY2LAotCTB4MDRiZDAwNmMsCi0JMHgwNDdkMDA3MiwKLQkweDA0NDMwMDc4LAotCTB4MDNmNzAwODEsCi0JMHgwM2NiMDA4NywKLQkweDAzODcwMDkxLAotCTB4MDM1ZTAwOTgsCi0JMHgwMzJlMDBhMSwKLQkweDAzMDMwMGFhLAotCTB4MDJkODAwYjQsCi0JMHgwMmFlMDBiZiwKLQkweDAyODkwMGNhLAotCTB4MDI2NDAwZDYsCi0JMHgwMjQxMDBlMywKLQkweDAyMjIwMGYwLAotCTB4MDIwMjAwZmYsCi0JMHgwMWU1MDEwZSwKLQkweDAxY2EwMTFlLAotCTB4MDFiMDAxMmYsCi0JMHgwMTk5MDE0MCwKLQkweDAxODMwMTUzLAotCTB4MDE2YzAxNjgsCi0JMHgwMTU4MDE3ZCwKLQkweDAxNDUwMTkzLAotCTB4MDEzMzAxYWIsCi0JMHgwMTIxMDFjNSwKLQkweDAxMTEwMWUwLAotCTB4MDEwMjAxZmMsCi0JMHgwMGY0MDIxYSwKLQkweDAwZTYwMTFkLAotCTB4MDBkOTAxMmUsCi0JMHgwMGNkMDE0MCwKLQkweDAwYzIwMTUzLAotCTB4MDBiNzAxNjcsCi0JMHgwMGFjMDE3YywKLQkweDAwYTMwMTkzLAotCTB4MDA5YTAxYWIsCi0JMHgwMDkxMDFjNCwKLQkweDAwODkwMWRmLAotCTB4MDA4MTAxZmIsCi0JMHgwMDdhMDIxOSwKLQkweDAwNzMwMjM5LAotCTB4MDA2ZDAyNWIsCi0JMHgwMDY3MDI3ZSwKLQkweDAwNjEwMmE0LAotCTB4MDA1YzAyY2MsCi0JMHgwMDU2MDJmNiwKLQkweDAwNTIwMzIzLAotCTB4MDA0ZDAzNTMsCi0JMHgwMDQ5MDM4NSwKLQkweDAwNDUwM2JiLAotCTB4MDA0MTAzZjMsCi0JMHgwMDNkMDQyZiwKLQkweDAwM2EwNDZmLAotCTB4MDAzNzA0YjIsCi0JMHgwMDM0MDRmOSwKLQkweDAwMzEwNTQ1LAotCTB4MDAyZTA1OTYsCi0JMHgwMDJiMDVmNSwKLQkweDAwMjkwNjQwLAotCTB4MDAyNjA2YTQsCi19OwotCi1jb25zdCB1MzIgcGFwZF9jb21wX2Vwc2lsb25fdGJsX2NvcmUxX3JldjNbXSA9IHsKLQkweDAwMDAwMDAwLAotCTB4MDAwMDFmYTAsCi0JMHgwMDAxOWY3OCwKLQkweDAwMDFkZjdlLAotCTB4MDNmYTlmODYsCi0JMHgwM2ZkMWY5MCwKLQkweDAzZmU1ZjhhLAotCTB4MDNmYjFmOTQsCi0JMHgwM2ZkOWZhMCwKLQkweDAwMDA5Zjk4LAotCTB4MDNmZDFmYWMsCi0JMHgwM2ZmOWZhMiwKLQkweDAzZmU5ZmFlLAotCTB4MDAwMDFmYWUsCi0JMHgwM2ZkZGZiNCwKLQkweDAzZmYxZmI4LAotCTB4MDNmZjlmYmMsCi0JMHgwM2ZmZGZiZSwKLQkweDAzZmU5ZmMyLAotCTB4MDNmZWRmYzYsCi0JMHgwM2ZlZGZjNiwKLQkweDAzZmY5ZmM4LAotCTB4MDNmZjVmYzYsCi0JMHgwM2ZlZGZjMiwKLQkweDAzZmY5ZmMwLAotCTB4MDNmZjVmYWMsCi0JMHgwM2ZmNWZhYywKLQkweDAzZmY5ZmEyLAotCTB4MDNmZjlmYTYsCi0JMHgwM2ZmOWZhYSwKLQkweDAzZmY1ZmIwLAotCTB4MDNmZjVmYjQsCi0JMHgwM2ZmMWZjYSwKLQkweDAzZmY1ZmNlLAotCTB4MDNmY2RmZGMsCi0JMHgwM2ZiNDAwNiwKLQkweDAwMDAwMDMwLAotCTB4MDNmZjgwOGEsCi0JMHgwM2ZmODBkYSwKLQkweDAwMDAwMTZjLAotCTB4MDNmZjgzMTgsCi0JMHgwM2ZmMDYzYSwKLQkweDAzZmQ4YmQ2LAotCTB4MDAwMTRmZmUsCi0JMHgwMDAzNGZmZSwKLQkweDAwMDM0ZmZlLAotCTB4MDAwM2NmZmUsCi0JMHgwMDA0MGZmZSwKLQkweDAwMDQwZmZlLAotCTB4MDAwM2NmZmUsCi0JMHgwMDAzY2ZmZSwKLQkweDAwMDIwZmZlLAotCTB4MDNmZTBmZmUsCi0JMHgwM2ZkY2ZmZSwKLQkweDAzZjk0ZmZlLAotCTB4MDNmNTRmZmUsCi0JMHgwM2Y0NGZmZSwKLQkweDAzZWY4ZmZlLAotCTB4MDNlZTBmZmUsCi0JMHgwM2ViY2ZmZSwKLQkweDAzZThjZmZlLAotCTB4MDNlNzRmZmUsCi0JMHgwM2U0Y2ZmZSwKLQkweDAzZTM4ZmZlLAotfTsKLQotY29uc3QgdTMyIHBhcGRfY2FsX3NjYWxhcnNfdGJsX2NvcmUxX3JldjNbXSA9IHsKLQkweDA1YWYwMDVhLAotCTB4MDU3MTAwNWUsCi0JMHgwNTA0MDA2NiwKLQkweDA0YmQwMDZjLAotCTB4MDQ3ZDAwNzIsCi0JMHgwNDQzMDA3OCwKLQkweDAzZjcwMDgxLAotCTB4MDNjYjAwODcsCi0JMHgwMzg3MDA5MSwKLQkweDAzNWUwMDk4LAotCTB4MDMyZTAwYTEsCi0JMHgwMzAzMDBhYSwKLQkweDAyZDgwMGI0LAotCTB4MDJhZTAwYmYsCi0JMHgwMjg5MDBjYSwKLQkweDAyNjQwMGQ2LAotCTB4MDI0MTAwZTMsCi0JMHgwMjIyMDBmMCwKLQkweDAyMDIwMGZmLAotCTB4MDFlNTAxMGUsCi0JMHgwMWNhMDExZSwKLQkweDAxYjAwMTJmLAotCTB4MDE5OTAxNDAsCi0JMHgwMTgzMDE1MywKLQkweDAxNmMwMTY4LAotCTB4MDE1ODAxN2QsCi0JMHgwMTQ1MDE5MywKLQkweDAxMzMwMWFiLAotCTB4MDEyMTAxYzUsCi0JMHgwMTExMDFlMCwKLQkweDAxMDIwMWZjLAotCTB4MDBmNDAyMWEsCi0JMHgwMGU2MDExZCwKLQkweDAwZDkwMTJlLAotCTB4MDBjZDAxNDAsCi0JMHgwMGMyMDE1MywKLQkweDAwYjcwMTY3LAotCTB4MDBhYzAxN2MsCi0JMHgwMGEzMDE5MywKLQkweDAwOWEwMWFiLAotCTB4MDA5MTAxYzQsCi0JMHgwMDg5MDFkZiwKLQkweDAwODEwMWZiLAotCTB4MDA3YTAyMTksCi0JMHgwMDczMDIzOSwKLQkweDAwNmQwMjViLAotCTB4MDA2NzAyN2UsCi0JMHgwMDYxMDJhNCwKLQkweDAwNWMwMmNjLAotCTB4MDA1NjAyZjYsCi0JMHgwMDUyMDMyMywKLQkweDAwNGQwMzUzLAotCTB4MDA0OTAzODUsCi0JMHgwMDQ1MDNiYiwKLQkweDAwNDEwM2YzLAotCTB4MDAzZDA0MmYsCi0JMHgwMDNhMDQ2ZiwKLQkweDAwMzcwNGIyLAotCTB4MDAzNDA0ZjksCi0JMHgwMDMxMDU0NSwKLQkweDAwMmUwNTk2LAotCTB4MDAyYjA1ZjUsCi0JMHgwMDI5MDY0MCwKLQkweDAwMjYwNmE0LAotfTsKLQotY29uc3Qgc3RydWN0IHBoeXRibF9pbmZvIG1pbW9waHl0YmxfaW5mb19yZXYzX3ZvbGF0aWxlW10gPSB7Ci0JeyZhbnRfc3djdHJsX3RibF9yZXYzLAotCSBzaXplb2YoYW50X3N3Y3RybF90YmxfcmV2MykgLyBzaXplb2YoYW50X3N3Y3RybF90YmxfcmV2M1swXSksIDksIDAsIDE2fQotCSwKLX07Ci0KLWNvbnN0IHN0cnVjdCBwaHl0YmxfaW5mbyBtaW1vcGh5dGJsX2luZm9fcmV2M192b2xhdGlsZTFbXSA9IHsKLQl7JmFudF9zd2N0cmxfdGJsX3JldjNfMSwKLQkgc2l6ZW9mKGFudF9zd2N0cmxfdGJsX3JldjNfMSkgLyBzaXplb2YoYW50X3N3Y3RybF90YmxfcmV2M18xWzBdKSwgOSwgMCwKLQkgMTZ9Ci0JLAotfTsKLQotY29uc3Qgc3RydWN0IHBoeXRibF9pbmZvIG1pbW9waHl0YmxfaW5mb19yZXYzX3ZvbGF0aWxlMltdID0gewotCXsmYW50X3N3Y3RybF90YmxfcmV2M18yLAotCSBzaXplb2YoYW50X3N3Y3RybF90YmxfcmV2M18yKSAvIHNpemVvZihhbnRfc3djdHJsX3RibF9yZXYzXzJbMF0pLCA5LCAwLAotCSAxNn0KLQksCi19OwotCi1jb25zdCBzdHJ1Y3QgcGh5dGJsX2luZm8gbWltb3BoeXRibF9pbmZvX3JldjNfdm9sYXRpbGUzW10gPSB7Ci0JeyZhbnRfc3djdHJsX3RibF9yZXYzXzMsCi0JIHNpemVvZihhbnRfc3djdHJsX3RibF9yZXYzXzMpIC8gc2l6ZW9mKGFudF9zd2N0cmxfdGJsX3JldjNfM1swXSksIDksIDAsCi0JIDE2fQotCSwKLX07Ci0KLWNvbnN0IHN0cnVjdCBwaHl0YmxfaW5mbyBtaW1vcGh5dGJsX2luZm9fcmV2M1tdID0gewotCXsmZnJhbWVfc3RydWN0X3JldjMsCi0JIHNpemVvZihmcmFtZV9zdHJ1Y3RfcmV2MykgLyBzaXplb2YoZnJhbWVfc3RydWN0X3JldjNbMF0pLCAxMCwgMCwgMzJ9Ci0JLAotCXsmcGlsb3RfdGJsX3JldjMsIHNpemVvZihwaWxvdF90YmxfcmV2MykgLyBzaXplb2YocGlsb3RfdGJsX3JldjNbMF0pLAotCSAxMSwgMCwgMTZ9Ci0JLAotCXsmdG1hcF90YmxfcmV2Mywgc2l6ZW9mKHRtYXBfdGJsX3JldjMpIC8gc2l6ZW9mKHRtYXBfdGJsX3JldjNbMF0pLCAxMiwKLQkgMCwgMzJ9Ci0JLAotCXsmaW50bHZfdGJsX3JldjMsIHNpemVvZihpbnRsdl90YmxfcmV2MykgLyBzaXplb2YoaW50bHZfdGJsX3JldjNbMF0pLAotCSAxMywgMCwgMzJ9Ci0JLAotCXsmdGR0cm5fdGJsX3JldjMsIHNpemVvZih0ZHRybl90YmxfcmV2MykgLyBzaXplb2YodGR0cm5fdGJsX3JldjNbMF0pLAotCSAxNCwgMCwgMzJ9Ci0JLAotCXsmbm9pc2VfdmFyX3RibF9yZXYzLAotCSBzaXplb2Yobm9pc2VfdmFyX3RibF9yZXYzKSAvIHNpemVvZihub2lzZV92YXJfdGJsX3JldjNbMF0pLCAxNiwgMCwgMzJ9Ci0JLAotCXsmbWNzX3RibF9yZXYzLCBzaXplb2YobWNzX3RibF9yZXYzKSAvIHNpemVvZihtY3NfdGJsX3JldjNbMF0pLCAxOCwgMCwKLQkgMTZ9Ci0JLAotCXsmdGRpX3RibDIwX2FudDBfcmV2MywKLQkgc2l6ZW9mKHRkaV90YmwyMF9hbnQwX3JldjMpIC8gc2l6ZW9mKHRkaV90YmwyMF9hbnQwX3JldjNbMF0pLCAxOSwgMTI4LAotCSAzMn0KLQksCi0JeyZ0ZGlfdGJsMjBfYW50MV9yZXYzLAotCSBzaXplb2YodGRpX3RibDIwX2FudDFfcmV2MykgLyBzaXplb2YodGRpX3RibDIwX2FudDFfcmV2M1swXSksIDE5LCAyNTYsCi0JIDMyfQotCSwKLQl7JnRkaV90Ymw0MF9hbnQwX3JldjMsCi0JIHNpemVvZih0ZGlfdGJsNDBfYW50MF9yZXYzKSAvIHNpemVvZih0ZGlfdGJsNDBfYW50MF9yZXYzWzBdKSwgMTksIDY0MCwKLQkgMzJ9Ci0JLAotCXsmdGRpX3RibDQwX2FudDFfcmV2MywKLQkgc2l6ZW9mKHRkaV90Ymw0MF9hbnQxX3JldjMpIC8gc2l6ZW9mKHRkaV90Ymw0MF9hbnQxX3JldjNbMF0pLCAxOSwgNzY4LAotCSAzMn0KLQksCi0JeyZwbHRsdXRfdGJsX3JldjMsIHNpemVvZihwbHRsdXRfdGJsX3JldjMpIC8gc2l6ZW9mKHBsdGx1dF90YmxfcmV2M1swXSksCi0JIDIwLCAwLCAzMn0KLQksCi0JeyZjaGFuZXN0X3RibF9yZXYzLAotCSBzaXplb2YoY2hhbmVzdF90YmxfcmV2MykgLyBzaXplb2YoY2hhbmVzdF90YmxfcmV2M1swXSksIDIyLCAwLCAzMn0KLQksCi0JeyZmcmFtZV9sdXRfcmV2Mywgc2l6ZW9mKGZyYW1lX2x1dF9yZXYzKSAvIHNpemVvZihmcmFtZV9sdXRfcmV2M1swXSksCi0JIDI0LCAwLCA4fQotCSwKLQl7JmVzdF9wd3JfbHV0X2NvcmUwX3JldjMsCi0JIHNpemVvZihlc3RfcHdyX2x1dF9jb3JlMF9yZXYzKSAvIHNpemVvZihlc3RfcHdyX2x1dF9jb3JlMF9yZXYzWzBdKSwgMjYsCi0JIDAsIDh9Ci0JLAotCXsmZXN0X3B3cl9sdXRfY29yZTFfcmV2MywKLQkgc2l6ZW9mKGVzdF9wd3JfbHV0X2NvcmUxX3JldjMpIC8gc2l6ZW9mKGVzdF9wd3JfbHV0X2NvcmUxX3JldjNbMF0pLCAyNywKLQkgMCwgOH0KLQksCi0JeyZhZGpfcHdyX2x1dF9jb3JlMF9yZXYzLAotCSBzaXplb2YoYWRqX3B3cl9sdXRfY29yZTBfcmV2MykgLyBzaXplb2YoYWRqX3B3cl9sdXRfY29yZTBfcmV2M1swXSksIDI2LAotCSA2NCwgOH0KLQksCi0JeyZhZGpfcHdyX2x1dF9jb3JlMV9yZXYzLAotCSBzaXplb2YoYWRqX3B3cl9sdXRfY29yZTFfcmV2MykgLyBzaXplb2YoYWRqX3B3cl9sdXRfY29yZTFfcmV2M1swXSksIDI3LAotCSA2NCwgOH0KLQksCi0JeyZnYWluY3RybF9sdXRfY29yZTBfcmV2MywKLQkgc2l6ZW9mKGdhaW5jdHJsX2x1dF9jb3JlMF9yZXYzKSAvIHNpemVvZihnYWluY3RybF9sdXRfY29yZTBfcmV2M1swXSksCi0JIDI2LCAxOTIsIDMyfQotCSwKLQl7JmdhaW5jdHJsX2x1dF9jb3JlMV9yZXYzLAotCSBzaXplb2YoZ2FpbmN0cmxfbHV0X2NvcmUxX3JldjMpIC8gc2l6ZW9mKGdhaW5jdHJsX2x1dF9jb3JlMV9yZXYzWzBdKSwKLQkgMjcsIDE5MiwgMzJ9Ci0JLAotCXsmaXFfbHV0X2NvcmUwX3JldjMsCi0JIHNpemVvZihpcV9sdXRfY29yZTBfcmV2MykgLyBzaXplb2YoaXFfbHV0X2NvcmUwX3JldjNbMF0pLCAyNiwgMzIwLCAzMn0KLQksCi0JeyZpcV9sdXRfY29yZTFfcmV2MywKLQkgc2l6ZW9mKGlxX2x1dF9jb3JlMV9yZXYzKSAvIHNpemVvZihpcV9sdXRfY29yZTFfcmV2M1swXSksIDI3LCAzMjAsIDMyfQotCSwKLQl7JmxvZnRfbHV0X2NvcmUwX3JldjMsCi0JIHNpemVvZihsb2Z0X2x1dF9jb3JlMF9yZXYzKSAvIHNpemVvZihsb2Z0X2x1dF9jb3JlMF9yZXYzWzBdKSwgMjYsIDQ0OCwKLQkgMTZ9Ci0JLAotCXsmbG9mdF9sdXRfY29yZTFfcmV2MywKLQkgc2l6ZW9mKGxvZnRfbHV0X2NvcmUxX3JldjMpIC8gc2l6ZW9mKGxvZnRfbHV0X2NvcmUxX3JldjNbMF0pLCAyNywgNDQ4LAotCSAxNn0KLX07Ci0KLWNvbnN0IHUzMiBtaW1vcGh5dGJsX2luZm9fc3pfcmV2MyA9Ci0Jc2l6ZW9mKG1pbW9waHl0YmxfaW5mb19yZXYzKSAvIHNpemVvZihtaW1vcGh5dGJsX2luZm9fcmV2M1swXSk7Ci1jb25zdCB1MzIgbWltb3BoeXRibF9pbmZvX3N6X3JldjNfdm9sYXRpbGUgPQotCXNpemVvZihtaW1vcGh5dGJsX2luZm9fcmV2M192b2xhdGlsZSkgLwotCXNpemVvZihtaW1vcGh5dGJsX2luZm9fcmV2M192b2xhdGlsZVswXSk7Ci1jb25zdCB1MzIgbWltb3BoeXRibF9pbmZvX3N6X3JldjNfdm9sYXRpbGUxID0KLQlzaXplb2YobWltb3BoeXRibF9pbmZvX3JldjNfdm9sYXRpbGUxKSAvCi0Jc2l6ZW9mKG1pbW9waHl0YmxfaW5mb19yZXYzX3ZvbGF0aWxlMVswXSk7Ci1jb25zdCB1MzIgbWltb3BoeXRibF9pbmZvX3N6X3JldjNfdm9sYXRpbGUyID0KLQlzaXplb2YobWltb3BoeXRibF9pbmZvX3JldjNfdm9sYXRpbGUyKSAvCi0Jc2l6ZW9mKG1pbW9waHl0YmxfaW5mb19yZXYzX3ZvbGF0aWxlMlswXSk7Ci1jb25zdCB1MzIgbWltb3BoeXRibF9pbmZvX3N6X3JldjNfdm9sYXRpbGUzID0KLQlzaXplb2YobWltb3BoeXRibF9pbmZvX3JldjNfdm9sYXRpbGUzKSAvCi0Jc2l6ZW9mKG1pbW9waHl0YmxfaW5mb19yZXYzX3ZvbGF0aWxlM1swXSk7Ci0KLWNvbnN0IHUzMiB0bWFwX3RibF9yZXY3W10gPSB7Ci0JMHg4YTg4YWE4MCwKLQkweDhhYWFhYThhLAotCTB4OGE4YThhYTgsCi0JMHgwMDAwMDg4OCwKLQkweDg4MDAwMDAwLAotCTB4OGE4YTg4YWEsCi0JMHg4YWE4ODg4OCwKLQkweDg4ODhhOGE4LAotCTB4ZjExMTExMTAsCi0JMHgxMTExMTExMSwKLQkweDExZjExMTExLAotCTB4MDAwMDAxMTEsCi0JMHgxMTAwMDAwMCwKLQkweDExMTFmMTExLAotCTB4MTExMTExMTEsCi0JMHgxMTExMTFmMSwKLQkweDhhODhhYTgwLAotCTB4OGFhYWFhOGEsCi0JMHg4YThhOGFhOCwKLQkweDAwMGFhODg4LAotCTB4ODg4ODAwMDAsCi0JMHg4YThhODhhYSwKLQkweDhhYTg4ODg4LAotCTB4ODg4OGE4YTgsCi0JMHhhMTExMTExMCwKLQkweDExMTExMTExLAotCTB4MTFjMTExMTEsCi0JMHgwMDAwMDExMSwKLQkweDExMDAwMDAwLAotCTB4MTExMWExMTEsCi0JMHgxMTExMTExMSwKLQkweDExMTExMWExLAotCTB4YTIyMjIyMjAsCi0JMHgyMjIyMjIyMiwKLQkweDIyYzIyMjIyLAotCTB4MDAwMDAyMjIsCi0JMHgyMjAwMDAwMCwKLQkweDIyMjJhMjIyLAotCTB4MjIyMjIyMjIsCi0JMHgyMjIyMjJhMiwKLQkweGYxMTExMTEwLAotCTB4MTExMTExMTEsCi0JMHgxMWYxMTExMSwKLQkweDAwMDExMTExLAotCTB4MTExMTAwMDAsCi0JMHgxMTExZjExMSwKLQkweDExMTExMTExLAotCTB4MTExMTExZjEsCi0JMHhhOGFhODhhMCwKLQkweGE4ODg4OGE4LAotCTB4YThhOGE4OGEsCi0JMHgwMDA4OGFhYSwKLQkweGFhYWEwMDAwLAotCTB4YThhOGFhODgsCi0JMHhhODhhYWFhYSwKLQkweGFhYWE4YThhLAotCTB4YWFhOGFhYTAsCi0JMHg4YWFhOGFhYSwKLQkweGFhOGE4YThhLAotCTB4MDAwYWFhODgsCi0JMHg4YWFhMDAwMCwKLQkweGFhYThhODg4LAotCTB4OGFhODhhOGEsCi0JMHg4YTg4YTg4OCwKLQkweDA4MDgwYTAwLAotCTB4MGEwODA4MGEsCi0JMHgwODBhMGEwOCwKLQkweDAwMDgwODA4LAotCTB4MDgwYTAwMDAsCi0JMHgwODBhMDgwOCwKLQkweDA4MGEwODA4LAotCTB4MGEwYTBhMDgsCi0JMHhhMGEwYTBhMCwKLQkweDgwYTBhMDgwLAotCTB4ODA4MGEwYTAsCi0JMHgwMDAwODA4MCwKLQkweDgwYTAwMDAwLAotCTB4ODBhMDgwYTAsCi0JMHhhMDgwYTBhMCwKLQkweDgwODBhMGEwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4OTk5OTkwMDAsCi0JMHg5YjliOTliYiwKLQkweDliYjk5OTk5LAotCTB4OTk5OWI5YjksCi0JMHg5Yjk5YmI5MCwKLQkweDliYmJiYjliLAotCTB4OWI5YjliYjksCi0JMHgwMDAwMDk5OSwKLQkweDg4MDAwMDAwLAotCTB4OGE4YTg4YWEsCi0JMHg4YWE4ODg4OCwKLQkweDg4ODhhOGE4LAotCTB4OGE4OGFhODAsCi0JMHg4YWFhYWE4YSwKLQkweDhhOGE4YWE4LAotCTB4MDBhYWE4ODgsCi0JMHgyMjAwMDAwMCwKLQkweDIyMjJiMjIyLAotCTB4MjIyMjIyMjIsCi0JMHgyMjIyMjJiMiwKLQkweGIyMjIyMjIwLAotCTB4MjIyMjIyMjIsCi0JMHgyMmQyMjIyMiwKLQkweDAwMDAwMjIyLAotCTB4MTEwMDAwMDAsCi0JMHgxMTExYTExMSwKLQkweDExMTExMTExLAotCTB4MTExMTExYTEsCi0JMHhhMTExMTExMCwKLQkweDExMTExMTExLAotCTB4MTFjMTExMTEsCi0JMHgwMDAwMDExMSwKLQkweDMzMDAwMDAwLAotCTB4MzMzM2IzMzMsCi0JMHgzMzMzMzMzMywKLQkweDMzMzMzM2IzLAotCTB4YjMzMzMzMzAsCi0JMHgzMzMzMzMzMywKLQkweDMzZDMzMzMzLAotCTB4MDAwMDAzMzMsCi0JMHgyMjAwMDAwMCwKLQkweDIyMjJhMjIyLAotCTB4MjIyMjIyMjIsCi0JMHgyMjIyMjJhMiwKLQkweGEyMjIyMjIwLAotCTB4MjIyMjIyMjIsCi0JMHgyMmMyMjIyMiwKLQkweDAwMDAwMjIyLAotCTB4OTliOTliMDAsCi0JMHg5YjliOTliYiwKLQkweDliYjk5OTk5LAotCTB4OTk5OWI5YjksCi0JMHg5Yjk5YmI5OSwKLQkweDliYmJiYjliLAotCTB4OWI5YjliYjksCi0JMHgwMDAwMDk5OSwKLQkweDg4MDAwMDAwLAotCTB4OGE4YTg4YWEsCi0JMHg4YWE4ODg4OCwKLQkweDg4ODhhOGE4LAotCTB4OGE4OGFhODgsCi0JMHg4YWFhYWE4YSwKLQkweDhhOGE4YWE4LAotCTB4MDhhYWE4ODgsCi0JMHgyMjIyMjIwMCwKLQkweDIyMjJmMjIyLAotCTB4MjIyMjIyMjIsCi0JMHgyMjIyMjJmMiwKLQkweDIyMjIyMjIyLAotCTB4MjIyMjIyMjIsCi0JMHgyMmYyMjIyMiwKLQkweDAwMDAwMjIyLAotCTB4MTEwMDAwMDAsCi0JMHgxMTExZjExMSwKLQkweDExMTExMTExLAotCTB4MTExMTExMTEsCi0JMHhmMTExMTExMSwKLQkweDExMTExMTExLAotCTB4MTFmMTExMTEsCi0JMHgwMTExMTExMSwKLQkweGJiOWJiOTAwLAotCTB4YjliOWJiOTksCi0JMHhiOTliYmJiYiwKLQkweGJiYmI5YjliLAotCTB4YjliYjk5YmIsCi0JMHhiOTk5OTliOSwKLQkweGI5YjliOTliLAotCTB4MDAwMDBiYmIsCi0JMHhhYTAwMDAwMCwKLQkweGE4YThhYTg4LAotCTB4YTg4YWFhYWEsCi0JMHhhYWFhOGE4YSwKLQkweGE4YWE4OGFhLAotCTB4YTg4ODg4YTgsCi0JMHhhOGE4YTg4YSwKLQkweDBhODg4YWFhLAotCTB4YWEwMDAwMDAsCi0JMHhhOGE4YWE4OCwKLQkweGE4OGFhYWFhLAotCTB4YWFhYThhOGEsCi0JMHhhOGFhODhhMCwKLQkweGE4ODg4OGE4LAotCTB4YThhOGE4OGEsCi0JMHgwMDAwMGFhYSwKLQkweDg4MDAwMDAwLAotCTB4OGE4YTg4YWEsCi0JMHg4YWE4ODg4OCwKLQkweDg4ODhhOGE4LAotCTB4OGE4OGFhODAsCi0JMHg4YWFhYWE4YSwKLQkweDhhOGE4YWE4LAotCTB4MDAwMDA4ODgsCi0JMHhiYmJiYmIwMCwKLQkweDk5OWJiYmJiLAotCTB4OWJiOTliOWIsCi0JMHhiOWI5YjliYiwKLQkweGI5Yjk5YmJiLAotCTB4YjliOWI5YmIsCi0JMHhiOWJiOWI5OSwKLQkweDAwMDAwOTk5LAotCTB4OGEwMDAwMDAsCi0JMHhhYTg4YTg4OCwKLQkweGE4ODg4OGFhLAotCTB4YTg4YThhODgsCi0JMHhhODhhYTg4YSwKLQkweDg4YThhYWFhLAotCTB4YThhYThhYWEsCi0JMHgwODg4YTg4YSwKLQkweDBiMGIwYjAwLAotCTB4MDkwYjBiMGIsCi0JMHgwYjA5MGIwYiwKLQkweDA5MDkwOTBiLAotCTB4MDkwOTBiMGIsCi0JMHgwOTA5MGIwYiwKLQkweDA5MDkwYjA5LAotCTB4MDAwMDA5MDksCi0JMHgwYTAwMDAwMCwKLQkweDBhMDgwODA4LAotCTB4MDgwYTA4MGEsCi0JMHgwODBhMGEwOCwKLQkweDA4MGEwODBhLAotCTB4MDgwODA4MGEsCi0JMHgwYTBhMGEwOCwKLQkweDA4MDgwODBhLAotCTB4YjBiMGIwMDAsCi0JMHg5MDkwYjBiMCwKLQkweDkwYjA5MDkwLAotCTB4YjBiMGIwOTAsCi0JMHhiMGIwOTBiMCwKLQkweDkwYjBiMGIwLAotCTB4YjBiMDkwOTAsCi0JMHgwMDAwMDA5MCwKLQkweDgwMDAwMDAwLAotCTB4YTA4MGEwODAsCi0JMHhhMDgwODBhMCwKLQkweGEwODA4MDgwLAotCTB4YTA4MGEwODAsCi0JMHg4MGEwYTBhMCwKLQkweGEwYTA4MGEwLAotCTB4MDBhMGEwYTAsCi0JMHgyMjAwMDAwMCwKLQkweDIyMjJmMjIyLAotCTB4MjIyMjIyMjIsCi0JMHgyMjIyMjJmMiwKLQkweGYyMjIyMjIwLAotCTB4MjIyMjIyMjIsCi0JMHgyMmYyMjIyMiwKLQkweDAwMDAwMjIyLAotCTB4MTEwMDAwMDAsCi0JMHgxMTExZjExMSwKLQkweDExMTExMTExLAotCTB4MTExMTExZjEsCi0JMHhmMTExMTExMCwKLQkweDExMTExMTExLAotCTB4MTFmMTExMTEsCi0JMHgwMDAwMDExMSwKLQkweDMzMDAwMDAwLAotCTB4MzMzM2YzMzMsCi0JMHgzMzMzMzMzMywKLQkweDMzMzMzM2YzLAotCTB4ZjMzMzMzMzAsCi0JMHgzMzMzMzMzMywKLQkweDMzZjMzMzMzLAotCTB4MDAwMDAzMzMsCi0JMHgyMjAwMDAwMCwKLQkweDIyMjJmMjIyLAotCTB4MjIyMjIyMjIsCi0JMHgyMjIyMjJmMiwKLQkweGYyMjIyMjIwLAotCTB4MjIyMjIyMjIsCi0JMHgyMmYyMjIyMiwKLQkweDAwMDAwMjIyLAotCTB4OTkwMDAwMDAsCi0JMHg5YjliOTliYiwKLQkweDliYjk5OTk5LAotCTB4OTk5OWI5YjksCi0JMHg5Yjk5YmI5MCwKLQkweDliYmJiYjliLAotCTB4OWI5YjliYjksCi0JMHgwMDAwMDk5OSwKLQkweDg4MDAwMDAwLAotCTB4OGE4YTg4YWEsCi0JMHg4YWE4ODg4OCwKLQkweDg4ODhhOGE4LAotCTB4OGE4OGFhODAsCi0JMHg4YWFhYWE4YSwKLQkweDhhOGE4YWE4LAotCTB4MDAwMDA4ODgsCi0JMHg4ODg4ODAwMCwKLQkweDhhOGE4OGFhLAotCTB4OGFhODg4ODgsCi0JMHg4ODg4YThhOCwKLQkweDhhODhhYTgwLAotCTB4OGFhYWFhOGEsCi0JMHg4YThhOGFhOCwKLQkweDAwMDAwODg4LAotCTB4ODgwMDAwMDAsCi0JMHg4YThhODhhYSwKLQkweDhhYTg4ODg4LAotCTB4ODg4OGE4YTgsCi0JMHg4YTg4YWE4MCwKLQkweDhhYWFhYThhLAotCTB4OGE4YThhYTgsCi0JMHgwMGFhYTg4OCwKLQkweDg4YTg4YTAwLAotCTB4OGE4YTg4YWEsCi0JMHg4YWE4ODg4OCwKLQkweDg4ODhhOGE4LAotCTB4OGE4OGFhODgsCi0JMHg4YWFhYWE4YSwKLQkweDhhOGE4YWE4LAotCTB4MDAwYWE4ODgsCi0JMHg4ODg4MDAwMCwKLQkweDhhOGE4OGFhLAotCTB4OGFhODg4ODgsCi0JMHg4ODg4YThhOCwKLQkweDhhODhhYTg4LAotCTB4OGFhYWFhOGEsCi0JMHg4YThhOGFhOCwKLQkweDA4YWFhODg4LAotCTB4MTEwMDAwMDAsCi0JMHgxMTExYTExMSwKLQkweDExMTExMTExLAotCTB4MTExMTExYTEsCi0JMHhhMTExMTExMCwKLQkweDExMTExMTExLAotCTB4MTFjMTExMTEsCi0JMHgwMDAwMDExMSwKLQkweDExMDAwMDAwLAotCTB4MTExMWExMTEsCi0JMHgxMTExMTExMSwKLQkweDExMTExMWExLAotCTB4YTExMTExMTAsCi0JMHgxMTExMTExMSwKLQkweDExYzExMTExLAotCTB4MDAwMDAxMTEsCi0JMHg4ODAwMDAwMCwKLQkweDhhOGE4OGFhLAotCTB4OGFhODg4ODgsCi0JMHg4ODg4YThhOCwKLQkweDhhODhhYTgwLAotCTB4OGFhYWFhOGEsCi0JMHg4YThhOGFhOCwKLQkweDAwMDAwODg4LAotCTB4ODgwMDAwMDAsCi0JMHg4YThhODhhYSwKLQkweDhhYTg4ODg4LAotCTB4ODg4OGE4YTgsCi0JMHg4YTg4YWE4MCwKLQkweDhhYWFhYThhLAotCTB4OGE4YThhYTgsCi0JMHgwMDAwMDg4OCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLX07Ci0KLWNvbnN0IHUzMiBub2lzZV92YXJfdGJsX3JldjdbXSA9IHsKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotCTB4MDIwYzAyMGMsCi0JMHgwMDAwMDE0ZCwKLQkweDAyMGMwMjBjLAotCTB4MDAwMDAxNGQsCi0JMHgwMjBjMDIwYywKLQkweDAwMDAwMTRkLAotfTsKLQotY29uc3QgdTMyIHBhcGRfY29tcF9lcHNpbG9uX3RibF9jb3JlMF9yZXY3W10gPSB7Ci0JMHgwMDAwMDAwMCwKLQkweDAwMDAwMDAwLAotCTB4MDAwMTYwMjMsCi0JMHgwMDAwNjAyOCwKLQkweDAwMDM0MDM2LAotCTB4MDAwMzQwMmUsCi0JMHgwMDA3MjAzYywKLQkweDAwMDZlMDM3LAotCTB4MDAwNzAwMzAsCi0JMHgwMDA5NDAxZiwKLQkweDAwMDlhMDBmLAotCTB4MDAwYjYwMGQsCi0JMHgwMDBjODAwNywKLQkweDAwMGNlMDA3LAotCTB4MDAxMDFmZmYsCi0JMHgwMDEyMWZmOSwKLQkweDAwMTJlMDA0LAotCTB4MDAxNGRmZmMsCi0JMHgwMDE2ZGZmNiwKLQkweDAwMThkZmU5LAotCTB4MDAxYjNmZTUsCi0JMHgwMDFjNWZkMCwKLQkweDAwMWRkZmMyLAotCTB4MDAxZjFmYjYsCi0JMHgwMDIwN2ZhNCwKLQkweDAwMjE5ZjhmLAotCTB4MDAyMmZmN2QsCi0JMHgwMDI0N2Y2YywKLQkweDAwMjRkZjViLAotCTB4MDAyNjdmNGIsCi0JMHgwMDI3ZGYzYiwKLQkweDAwMjliZjNiLAotCTB4MDAyYjVmMmYsCi0JMHgwMDJkM2YyZSwKLQkweDAwMmY1ZjJhLAotCTB4MDAyZmZmMTUsCi0JMHgwMDMxNWYwYiwKLQkweDAwMzJkZWZhLAotCTB4MDAzM2JlZWIsCi0JMHgwMDM0ZmVkOSwKLQkweDAwMzUzZWM1LAotCTB4MDAzNjFlYjAsCi0JMHgwMDM2M2U5YiwKLQkweDAwMzZiZTg3LAotCTB4MDAzNmJlNzAsCi0JMHgwMDM4ZmU2NywKLQkweDAwNDRiZWIyLAotCTB4MDA1MTNlZjMsCi0JMHgwMDU5NWYxMSwKLQkweDAwNjY5ZjNkLAotCTB4MDA3OGRmZGYsCi0JMHgwMGExNDNhYSwKLQkweDAxNjQyZmZmLAotCTB4MDE2MmFmZmYsCi0JMHgwMTYyMGZmZiwKLQkweDAxNjBjZmZmLAotCTB4MDE1ZjBmZmYsCi0JMHgwMTVkYWZmZiwKLQkweDAxNWJjZmZmLAotCTB4MDE1YmNmZmYsCi0JMHgwMTViNGZmZiwKLQkweDAxNWFjZmZmLAotCTB4MDE1OTBmZmYsCi0JMHgwMTU2Y2ZmZiwKLX07Ci0KLWNvbnN0IHUzMiBwYXBkX2NhbF9zY2FsYXJzX3RibF9jb3JlMF9yZXY3W10gPSB7Ci0JMHgwYjVlMDAyZCwKLQkweDBhZTIwMDJmLAotCTB4MGEzYjAwMzIsCi0JMHgwOWE3MDAzNSwKLQkweDA5MjIwMDM4LAotCTB4MDhhYjAwM2IsCi0JMHgwODFmMDAzZiwKLQkweDA3YTIwMDQzLAotCTB4MDczNDAwNDcsCi0JMHgwNmQyMDA0YiwKLQkweDA2N2EwMDRmLAotCTB4MDYxNzAwNTQsCi0JMHgwNWJmMDA1OSwKLQkweDA1NzEwMDVlLAotCTB4MDUxZTAwNjQsCi0JMHgwNGQzMDA2YSwKLQkweDA0OTEwMDcwLAotCTB4MDQ0YzAwNzcsCi0JMHgwNDBmMDA3ZSwKLQkweDAzZDkwMDg1LAotCTB4MDNhMTAwOGQsCi0JMHgwMzZmMDA5NSwKLQkweDAzM2QwMDllLAotCTB4MDMwYjAwYTgsCi0JMHgwMmUwMDBiMiwKLQkweDAyYjkwMGJjLAotCTB4MDI5MjAwYzcsCi0JMHgwMjZkMDBkMywKLQkweDAyNDkwMGUwLAotCTB4MDIyOTAwZWQsCi0JMHgwMjBhMDBmYiwKLQkweDAxZWMwMTBhLAotCTB4MDFkMjAxMTksCi0JMHgwMWI3MDEyYSwKLQkweDAxOWUwMTNjLAotCTB4MDE4ODAxNGUsCi0JMHgwMTcyMDE2MiwKLQkweDAxNWQwMTc3LAotCTB4MDE0OTAxOGUsCi0JMHgwMTM3MDFhNSwKLQkweDAxMjYwMWJlLAotCTB4MDExNTAxZDgsCi0JMHgwMTA2MDFmNCwKLQkweDAwZjcwMjEyLAotCTB4MDBlOTAyMzEsCi0JMHgwMGRjMDI1MywKLQkweDAwZDAwMjc2LAotCTB4MDBjNDAyOWIsCi0JMHgwMGI5MDJjMywKLQkweDAwYWYwMmVkLAotCTB4MDBhNTAzMTksCi0JMHgwMDljMDM0OCwKLQkweDAwOTMwMzdhLAotCTB4MDA4YjAzYWYsCi0JMHgwMDgzMDNlNiwKLQkweDAwN2MwNDIyLAotCTB4MDA3NTA0NjAsCi0JMHgwMDZlMDRhMywKLQkweDAwNjgwNGU5LAotCTB4MDA2MjA1MzMsCi0JMHgwMDVkMDU4MiwKLQkweDAwNTgwNWQ2LAotCTB4MDA1MzA2MmUsCi0JMHgwMDRlMDY4YywKLX07Ci0KLWNvbnN0IHUzMiBwYXBkX2NvbXBfZXBzaWxvbl90YmxfY29yZTFfcmV2N1tdID0gewotCTB4MDAwMDAwMDAsCi0JMHgwMDAwMDAwMCwKLQkweDAwMDE2MDIzLAotCTB4MDAwMDYwMjgsCi0JMHgwMDAzNDAzNiwKLQkweDAwMDM0MDJlLAotCTB4MDAwNzIwM2MsCi0JMHgwMDA2ZTAzNywKLQkweDAwMDcwMDMwLAotCTB4MDAwOTQwMWYsCi0JMHgwMDA5YTAwZiwKLQkweDAwMGI2MDBkLAotCTB4MDAwYzgwMDcsCi0JMHgwMDBjZTAwNywKLQkweDAwMTAxZmZmLAotCTB4MDAxMjFmZjksCi0JMHgwMDEyZTAwNCwKLQkweDAwMTRkZmZjLAotCTB4MDAxNmRmZjYsCi0JMHgwMDE4ZGZlOSwKLQkweDAwMWIzZmU1LAotCTB4MDAxYzVmZDAsCi0JMHgwMDFkZGZjMiwKLQkweDAwMWYxZmI2LAotCTB4MDAyMDdmYTQsCi0JMHgwMDIxOWY4ZiwKLQkweDAwMjJmZjdkLAotCTB4MDAyNDdmNmMsCi0JMHgwMDI0ZGY1YiwKLQkweDAwMjY3ZjRiLAotCTB4MDAyN2RmM2IsCi0JMHgwMDI5YmYzYiwKLQkweDAwMmI1ZjJmLAotCTB4MDAyZDNmMmUsCi0JMHgwMDJmNWYyYSwKLQkweDAwMmZmZjE1LAotCTB4MDAzMTVmMGIsCi0JMHgwMDMyZGVmYSwKLQkweDAwMzNiZWViLAotCTB4MDAzNGZlZDksCi0JMHgwMDM1M2VjNSwKLQkweDAwMzYxZWIwLAotCTB4MDAzNjNlOWIsCi0JMHgwMDM2YmU4NywKLQkweDAwMzZiZTcwLAotCTB4MDAzOGZlNjcsCi0JMHgwMDQ0YmViMiwKLQkweDAwNTEzZWYzLAotCTB4MDA1OTVmMTEsCi0JMHgwMDY2OWYzZCwKLQkweDAwNzhkZmRmLAotCTB4MDBhMTQzYWEsCi0JMHgwMTY0MmZmZiwKLQkweDAxNjJhZmZmLAotCTB4MDE2MjBmZmYsCi0JMHgwMTYwY2ZmZiwKLQkweDAxNWYwZmZmLAotCTB4MDE1ZGFmZmYsCi0JMHgwMTViY2ZmZiwKLQkweDAxNWJjZmZmLAotCTB4MDE1YjRmZmYsCi0JMHgwMTVhY2ZmZiwKLQkweDAxNTkwZmZmLAotCTB4MDE1NmNmZmYsCi19OwotCi1jb25zdCB1MzIgcGFwZF9jYWxfc2NhbGFyc190YmxfY29yZTFfcmV2N1tdID0gewotCTB4MGI1ZTAwMmQsCi0JMHgwYWUyMDAyZiwKLQkweDBhM2IwMDMyLAotCTB4MDlhNzAwMzUsCi0JMHgwOTIyMDAzOCwKLQkweDA4YWIwMDNiLAotCTB4MDgxZjAwM2YsCi0JMHgwN2EyMDA0MywKLQkweDA3MzQwMDQ3LAotCTB4MDZkMjAwNGIsCi0JMHgwNjdhMDA0ZiwKLQkweDA2MTcwMDU0LAotCTB4MDViZjAwNTksCi0JMHgwNTcxMDA1ZSwKLQkweDA1MWUwMDY0LAotCTB4MDRkMzAwNmEsCi0JMHgwNDkxMDA3MCwKLQkweDA0NGMwMDc3LAotCTB4MDQwZjAwN2UsCi0JMHgwM2Q5MDA4NSwKLQkweDAzYTEwMDhkLAotCTB4MDM2ZjAwOTUsCi0JMHgwMzNkMDA5ZSwKLQkweDAzMGIwMGE4LAotCTB4MDJlMDAwYjIsCi0JMHgwMmI5MDBiYywKLQkweDAyOTIwMGM3LAotCTB4MDI2ZDAwZDMsCi0JMHgwMjQ5MDBlMCwKLQkweDAyMjkwMGVkLAotCTB4MDIwYTAwZmIsCi0JMHgwMWVjMDEwYSwKLQkweDAxZDIwMTE5LAotCTB4MDFiNzAxMmEsCi0JMHgwMTllMDEzYywKLQkweDAxODgwMTRlLAotCTB4MDE3MjAxNjIsCi0JMHgwMTVkMDE3NywKLQkweDAxNDkwMThlLAotCTB4MDEzNzAxYTUsCi0JMHgwMTI2MDFiZSwKLQkweDAxMTUwMWQ4LAotCTB4MDEwNjAxZjQsCi0JMHgwMGY3MDIxMiwKLQkweDAwZTkwMjMxLAotCTB4MDBkYzAyNTMsCi0JMHgwMGQwMDI3NiwKLQkweDAwYzQwMjliLAotCTB4MDBiOTAyYzMsCi0JMHgwMGFmMDJlZCwKLQkweDAwYTUwMzE5LAotCTB4MDA5YzAzNDgsCi0JMHgwMDkzMDM3YSwKLQkweDAwOGIwM2FmLAotCTB4MDA4MzAzZTYsCi0JMHgwMDdjMDQyMiwKLQkweDAwNzUwNDYwLAotCTB4MDA2ZTA0YTMsCi0JMHgwMDY4MDRlOSwKLQkweDAwNjIwNTMzLAotCTB4MDA1ZDA1ODIsCi0JMHgwMDU4MDVkNiwKLQkweDAwNTMwNjJlLAotCTB4MDA0ZTA2OGMsCi19OwotCi1jb25zdCBzdHJ1Y3QgcGh5dGJsX2luZm8gbWltb3BoeXRibF9pbmZvX3JldjdbXSA9IHsKLQl7JmZyYW1lX3N0cnVjdF9yZXYzLAotCSBzaXplb2YoZnJhbWVfc3RydWN0X3JldjMpIC8gc2l6ZW9mKGZyYW1lX3N0cnVjdF9yZXYzWzBdKSwgMTAsIDAsIDMyfQotCSwKLQl7JnBpbG90X3RibF9yZXYzLCBzaXplb2YocGlsb3RfdGJsX3JldjMpIC8gc2l6ZW9mKHBpbG90X3RibF9yZXYzWzBdKSwKLQkgMTEsIDAsIDE2fQotCSwKLQl7JnRtYXBfdGJsX3JldjcsIHNpemVvZih0bWFwX3RibF9yZXY3KSAvIHNpemVvZih0bWFwX3RibF9yZXY3WzBdKSwgMTIsCi0JIDAsIDMyfQotCSwKLQl7JmludGx2X3RibF9yZXYzLCBzaXplb2YoaW50bHZfdGJsX3JldjMpIC8gc2l6ZW9mKGludGx2X3RibF9yZXYzWzBdKSwKLQkgMTMsIDAsIDMyfQotCSwKLQl7JnRkdHJuX3RibF9yZXYzLCBzaXplb2YodGR0cm5fdGJsX3JldjMpIC8gc2l6ZW9mKHRkdHJuX3RibF9yZXYzWzBdKSwKLQkgMTQsIDAsIDMyfQotCSwKLQl7Jm5vaXNlX3Zhcl90YmxfcmV2NywKLQkgc2l6ZW9mKG5vaXNlX3Zhcl90YmxfcmV2NykgLyBzaXplb2Yobm9pc2VfdmFyX3RibF9yZXY3WzBdKSwgMTYsIDAsIDMyfQotCSwKLQl7Jm1jc190YmxfcmV2Mywgc2l6ZW9mKG1jc190YmxfcmV2MykgLyBzaXplb2YobWNzX3RibF9yZXYzWzBdKSwgMTgsIDAsCi0JIDE2fQotCSwKLQl7JnRkaV90YmwyMF9hbnQwX3JldjMsCi0JIHNpemVvZih0ZGlfdGJsMjBfYW50MF9yZXYzKSAvIHNpemVvZih0ZGlfdGJsMjBfYW50MF9yZXYzWzBdKSwgMTksIDEyOCwKLQkgMzJ9Ci0JLAotCXsmdGRpX3RibDIwX2FudDFfcmV2MywKLQkgc2l6ZW9mKHRkaV90YmwyMF9hbnQxX3JldjMpIC8gc2l6ZW9mKHRkaV90YmwyMF9hbnQxX3JldjNbMF0pLCAxOSwgMjU2LAotCSAzMn0KLQksCi0JeyZ0ZGlfdGJsNDBfYW50MF9yZXYzLAotCSBzaXplb2YodGRpX3RibDQwX2FudDBfcmV2MykgLyBzaXplb2YodGRpX3RibDQwX2FudDBfcmV2M1swXSksIDE5LCA2NDAsCi0JIDMyfQotCSwKLQl7JnRkaV90Ymw0MF9hbnQxX3JldjMsCi0JIHNpemVvZih0ZGlfdGJsNDBfYW50MV9yZXYzKSAvIHNpemVvZih0ZGlfdGJsNDBfYW50MV9yZXYzWzBdKSwgMTksIDc2OCwKLQkgMzJ9Ci0JLAotCXsmcGx0bHV0X3RibF9yZXYzLCBzaXplb2YocGx0bHV0X3RibF9yZXYzKSAvIHNpemVvZihwbHRsdXRfdGJsX3JldjNbMF0pLAotCSAyMCwgMCwgMzJ9Ci0JLAotCXsmY2hhbmVzdF90YmxfcmV2MywKLQkgc2l6ZW9mKGNoYW5lc3RfdGJsX3JldjMpIC8gc2l6ZW9mKGNoYW5lc3RfdGJsX3JldjNbMF0pLCAyMiwgMCwgMzJ9Ci0JLAotCXsmZnJhbWVfbHV0X3JldjMsIHNpemVvZihmcmFtZV9sdXRfcmV2MykgLyBzaXplb2YoZnJhbWVfbHV0X3JldjNbMF0pLAotCSAyNCwgMCwgOH0KLQksCi0JeyZlc3RfcHdyX2x1dF9jb3JlMF9yZXYzLAotCSBzaXplb2YoZXN0X3B3cl9sdXRfY29yZTBfcmV2MykgLyBzaXplb2YoZXN0X3B3cl9sdXRfY29yZTBfcmV2M1swXSksIDI2LAotCSAwLCA4fQotCSwKLQl7JmVzdF9wd3JfbHV0X2NvcmUxX3JldjMsCi0JIHNpemVvZihlc3RfcHdyX2x1dF9jb3JlMV9yZXYzKSAvIHNpemVvZihlc3RfcHdyX2x1dF9jb3JlMV9yZXYzWzBdKSwgMjcsCi0JIDAsIDh9Ci0JLAotCXsmYWRqX3B3cl9sdXRfY29yZTBfcmV2MywKLQkgc2l6ZW9mKGFkal9wd3JfbHV0X2NvcmUwX3JldjMpIC8gc2l6ZW9mKGFkal9wd3JfbHV0X2NvcmUwX3JldjNbMF0pLCAyNiwKLQkgNjQsIDh9Ci0JLAotCXsmYWRqX3B3cl9sdXRfY29yZTFfcmV2MywKLQkgc2l6ZW9mKGFkal9wd3JfbHV0X2NvcmUxX3JldjMpIC8gc2l6ZW9mKGFkal9wd3JfbHV0X2NvcmUxX3JldjNbMF0pLCAyNywKLQkgNjQsIDh9Ci0JLAotCXsmZ2FpbmN0cmxfbHV0X2NvcmUwX3JldjMsCi0JIHNpemVvZihnYWluY3RybF9sdXRfY29yZTBfcmV2MykgLyBzaXplb2YoZ2FpbmN0cmxfbHV0X2NvcmUwX3JldjNbMF0pLAotCSAyNiwgMTkyLCAzMn0KLQksCi0JeyZnYWluY3RybF9sdXRfY29yZTFfcmV2MywKLQkgc2l6ZW9mKGdhaW5jdHJsX2x1dF9jb3JlMV9yZXYzKSAvIHNpemVvZihnYWluY3RybF9sdXRfY29yZTFfcmV2M1swXSksCi0JIDI3LCAxOTIsIDMyfQotCSwKLQl7JmlxX2x1dF9jb3JlMF9yZXYzLAotCSBzaXplb2YoaXFfbHV0X2NvcmUwX3JldjMpIC8gc2l6ZW9mKGlxX2x1dF9jb3JlMF9yZXYzWzBdKSwgMjYsIDMyMCwgMzJ9Ci0JLAotCXsmaXFfbHV0X2NvcmUxX3JldjMsCi0JIHNpemVvZihpcV9sdXRfY29yZTFfcmV2MykgLyBzaXplb2YoaXFfbHV0X2NvcmUxX3JldjNbMF0pLCAyNywgMzIwLCAzMn0KLQksCi0JeyZsb2Z0X2x1dF9jb3JlMF9yZXYzLAotCSBzaXplb2YobG9mdF9sdXRfY29yZTBfcmV2MykgLyBzaXplb2YobG9mdF9sdXRfY29yZTBfcmV2M1swXSksIDI2LCA0NDgsCi0JIDE2fQotCSwKLQl7JmxvZnRfbHV0X2NvcmUxX3JldjMsCi0JIHNpemVvZihsb2Z0X2x1dF9jb3JlMV9yZXYzKSAvIHNpemVvZihsb2Z0X2x1dF9jb3JlMV9yZXYzWzBdKSwgMjcsIDQ0OCwKLQkgMTZ9Ci0JLAotCXsmcGFwZF9jb21wX3JmcHdyX3RibF9jb3JlMF9yZXYzLAotCSBzaXplb2YocGFwZF9jb21wX3JmcHdyX3RibF9jb3JlMF9yZXYzKSAvCi0JIHNpemVvZihwYXBkX2NvbXBfcmZwd3JfdGJsX2NvcmUwX3JldjNbMF0pLCAyNiwgNTc2LCAxNn0KLQksCi0JeyZwYXBkX2NvbXBfcmZwd3JfdGJsX2NvcmUxX3JldjMsCi0JIHNpemVvZihwYXBkX2NvbXBfcmZwd3JfdGJsX2NvcmUxX3JldjMpIC8KLQkgc2l6ZW9mKHBhcGRfY29tcF9yZnB3cl90YmxfY29yZTFfcmV2M1swXSksIDI3LCA1NzYsIDE2fQotCSwKLQl7JnBhcGRfY29tcF9lcHNpbG9uX3RibF9jb3JlMF9yZXY3LAotCSBzaXplb2YocGFwZF9jb21wX2Vwc2lsb25fdGJsX2NvcmUwX3JldjcpIC8KLQkgc2l6ZW9mKHBhcGRfY29tcF9lcHNpbG9uX3RibF9jb3JlMF9yZXY3WzBdKSwgMzEsIDAsIDMyfQotCSwKLQl7JnBhcGRfY2FsX3NjYWxhcnNfdGJsX2NvcmUwX3JldjcsCi0JIHNpemVvZihwYXBkX2NhbF9zY2FsYXJzX3RibF9jb3JlMF9yZXY3KSAvCi0JIHNpemVvZihwYXBkX2NhbF9zY2FsYXJzX3RibF9jb3JlMF9yZXY3WzBdKSwgMzIsIDAsIDMyfQotCSwKLQl7JnBhcGRfY29tcF9lcHNpbG9uX3RibF9jb3JlMV9yZXY3LAotCSBzaXplb2YocGFwZF9jb21wX2Vwc2lsb25fdGJsX2NvcmUxX3JldjcpIC8KLQkgc2l6ZW9mKHBhcGRfY29tcF9lcHNpbG9uX3RibF9jb3JlMV9yZXY3WzBdKSwgMzMsIDAsIDMyfQotCSwKLQl7JnBhcGRfY2FsX3NjYWxhcnNfdGJsX2NvcmUxX3JldjcsCi0JIHNpemVvZihwYXBkX2NhbF9zY2FsYXJzX3RibF9jb3JlMV9yZXY3KSAvCi0JIHNpemVvZihwYXBkX2NhbF9zY2FsYXJzX3RibF9jb3JlMV9yZXY3WzBdKSwgMzQsIDAsIDMyfQotCSwKLX07Ci0KLWNvbnN0IHUzMiBtaW1vcGh5dGJsX2luZm9fc3pfcmV2NyA9Ci0Jc2l6ZW9mKG1pbW9waHl0YmxfaW5mb19yZXY3KSAvIHNpemVvZihtaW1vcGh5dGJsX2luZm9fcmV2N1swXSk7Ci0KLWNvbnN0IHN0cnVjdCBwaHl0YmxfaW5mbyBtaW1vcGh5dGJsX2luZm9fcmV2MTZbXSA9IHsKLQl7Jm5vaXNlX3Zhcl90YmxfcmV2NywKLQkgc2l6ZW9mKG5vaXNlX3Zhcl90YmxfcmV2NykgLyBzaXplb2Yobm9pc2VfdmFyX3RibF9yZXY3WzBdKSwgMTYsIDAsIDMyfQotCSwKLQl7JmVzdF9wd3JfbHV0X2NvcmUwX3JldjMsCi0JIHNpemVvZihlc3RfcHdyX2x1dF9jb3JlMF9yZXYzKSAvIHNpemVvZihlc3RfcHdyX2x1dF9jb3JlMF9yZXYzWzBdKSwgMjYsCi0JIDAsIDh9Ci0JLAotCXsmZXN0X3B3cl9sdXRfY29yZTFfcmV2MywKLQkgc2l6ZW9mKGVzdF9wd3JfbHV0X2NvcmUxX3JldjMpIC8gc2l6ZW9mKGVzdF9wd3JfbHV0X2NvcmUxX3JldjNbMF0pLCAyNywKLQkgMCwgOH0KLQksCi0JeyZhZGpfcHdyX2x1dF9jb3JlMF9yZXYzLAotCSBzaXplb2YoYWRqX3B3cl9sdXRfY29yZTBfcmV2MykgLyBzaXplb2YoYWRqX3B3cl9sdXRfY29yZTBfcmV2M1swXSksIDI2LAotCSA2NCwgOH0KLQksCi0JeyZhZGpfcHdyX2x1dF9jb3JlMV9yZXYzLAotCSBzaXplb2YoYWRqX3B3cl9sdXRfY29yZTFfcmV2MykgLyBzaXplb2YoYWRqX3B3cl9sdXRfY29yZTFfcmV2M1swXSksIDI3LAotCSA2NCwgOH0KLQksCi0JeyZnYWluY3RybF9sdXRfY29yZTBfcmV2MywKLQkgc2l6ZW9mKGdhaW5jdHJsX2x1dF9jb3JlMF9yZXYzKSAvIHNpemVvZihnYWluY3RybF9sdXRfY29yZTBfcmV2M1swXSksCi0JIDI2LCAxOTIsIDMyfQotCSwKLQl7JmdhaW5jdHJsX2x1dF9jb3JlMV9yZXYzLAotCSBzaXplb2YoZ2FpbmN0cmxfbHV0X2NvcmUxX3JldjMpIC8gc2l6ZW9mKGdhaW5jdHJsX2x1dF9jb3JlMV9yZXYzWzBdKSwKLQkgMjcsIDE5MiwgMzJ9Ci0JLAotCXsmaXFfbHV0X2NvcmUwX3JldjMsCi0JIHNpemVvZihpcV9sdXRfY29yZTBfcmV2MykgLyBzaXplb2YoaXFfbHV0X2NvcmUwX3JldjNbMF0pLCAyNiwgMzIwLCAzMn0KLQksCi0JeyZpcV9sdXRfY29yZTFfcmV2MywKLQkgc2l6ZW9mKGlxX2x1dF9jb3JlMV9yZXYzKSAvIHNpemVvZihpcV9sdXRfY29yZTFfcmV2M1swXSksIDI3LCAzMjAsIDMyfQotCSwKLQl7JmxvZnRfbHV0X2NvcmUwX3JldjMsCi0JIHNpemVvZihsb2Z0X2x1dF9jb3JlMF9yZXYzKSAvIHNpemVvZihsb2Z0X2x1dF9jb3JlMF9yZXYzWzBdKSwgMjYsIDQ0OCwKLQkgMTZ9Ci0JLAotCXsmbG9mdF9sdXRfY29yZTFfcmV2MywKLQkgc2l6ZW9mKGxvZnRfbHV0X2NvcmUxX3JldjMpIC8gc2l6ZW9mKGxvZnRfbHV0X2NvcmUxX3JldjNbMF0pLCAyNywgNDQ4LAotCSAxNn0KLQksCi19OwotCi1jb25zdCB1MzIgbWltb3BoeXRibF9pbmZvX3N6X3JldjE2ID0KLQlzaXplb2YobWltb3BoeXRibF9pbmZvX3JldjE2KSAvIHNpemVvZihtaW1vcGh5dGJsX2luZm9fcmV2MTZbMF0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5dGJsX24uaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeXRibF9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MjY2Y2YuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5dGJsX24uaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jZGVmaW5lIEFOVF9TV0NUUkxfVEJMX1JFVjNfSURYICgwKQotCi0jaW5jbHVkZSA8dHlwZXMuaD4KLSNpbmNsdWRlICJwaHlfaW50LmgiCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcGh5dGJsX2luZm8gbWltb3BoeXRibF9pbmZvX3JldjBbXSwKLQltaW1vcGh5dGJsX2luZm9fcmV2MF92b2xhdGlsZVtdOwotZXh0ZXJuIGNvbnN0IHUzMiBtaW1vcGh5dGJsX2luZm9fc3pfcmV2MCwgbWltb3BoeXRibF9pbmZvX3N6X3JldjBfdm9sYXRpbGU7Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcGh5dGJsX2luZm8gbWltb3BoeXRibF9pbmZvX3JldjNbXSwKLQltaW1vcGh5dGJsX2luZm9fcmV2M192b2xhdGlsZVtdLCBtaW1vcGh5dGJsX2luZm9fcmV2M192b2xhdGlsZTFbXSwKLQltaW1vcGh5dGJsX2luZm9fcmV2M192b2xhdGlsZTJbXSwgbWltb3BoeXRibF9pbmZvX3JldjNfdm9sYXRpbGUzW107Ci1leHRlcm4gY29uc3QgdTMyIG1pbW9waHl0YmxfaW5mb19zel9yZXYzLCBtaW1vcGh5dGJsX2luZm9fc3pfcmV2M192b2xhdGlsZSwKLQltaW1vcGh5dGJsX2luZm9fc3pfcmV2M192b2xhdGlsZTEsIG1pbW9waHl0YmxfaW5mb19zel9yZXYzX3ZvbGF0aWxlMiwKLQltaW1vcGh5dGJsX2luZm9fc3pfcmV2M192b2xhdGlsZTM7Ci0KLWV4dGVybiBjb25zdCB1MzIgbm9pc2VfdmFyX3RibF9yZXYzW107Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgcGh5dGJsX2luZm8gbWltb3BoeXRibF9pbmZvX3JldjdbXTsKLWV4dGVybiBjb25zdCB1MzIgbWltb3BoeXRibF9pbmZvX3N6X3Jldjc7Ci1leHRlcm4gY29uc3QgdTMyIG5vaXNlX3Zhcl90YmxfcmV2N1tdOwotCi1leHRlcm4gY29uc3Qgc3RydWN0IHBoeXRibF9pbmZvIG1pbW9waHl0YmxfaW5mb19yZXYxNltdOwotZXh0ZXJuIGNvbnN0IHUzMiBtaW1vcGh5dGJsX2luZm9fc3pfcmV2MTY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3BoeV9zaGltLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3BoeV9zaGltLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZWNkY2QuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9waHlfc2hpbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0vKgotICogVGhpcyBpcyAidHdvLXdheSIgaW50ZXJmYWNlLCBhY3RpbmcgYXMgdGhlIFNISU0gbGF5ZXIgYmV0d2VlbiBXTCBhbmQgUEhZIGxheWVyLgotICogICBXTCBkcml2ZXIgY2FuIG9wdGluYWxseSBjYWxsIHRoaXMgdHJhbnNsYXRpb24gbGF5ZXIgdG8gZG8gc29tZSBwcmVwcm9jZXNzaW5nLCB0aGVuIHJlYWNoIFBIWS4KLSAqICAgT24gdGhlIFBIWS0+V0wgZHJpdmVyIGRpcmVjdGlvbiwgYWxsIGNhbGxzIGdvIHRocm91Z2ggdGhpcyBsYXllciBzaW5jZSBQSFkgZG9lc24ndCBoYXZlIHRoZQotICogICBhY2Nlc3MgdG8gd2xjX2h3IHBvaW50ZXIuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0KLSNpbmNsdWRlICJibWFjLmgiCi0jaW5jbHVkZSAibWFpbi5oIgotI2luY2x1ZGUgIm1hYzgwMjExX2lmLmgiCi0jaW5jbHVkZSAicGh5X3NoaW0uaCIKLQotLyogUEhZIFNISU0gbW9kdWxlIHNwZWNpZmljIHN0YXRlICovCi1zdHJ1Y3QgcGh5X3NoaW1faW5mbyB7Ci0Jc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHc7CS8qIHBvaW50ZXIgdG8gbWFpbiB3bGNfaHcgc3RydWN0dXJlICovCi0Jdm9pZCAqd2xjOwkJLyogcG9pbnRlciB0byBtYWluIHdsYyBzdHJ1Y3R1cmUgKi8KLQl2b2lkICp3bDsJCS8qIHBvaW50ZXIgdG8gb3Mtc3BlY2lmaWMgcHJpdmF0ZSBzdGF0ZSAqLwotfTsKLQotc3RydWN0IHBoeV9zaGltX2luZm8gKndsY19waHlfc2hpbV9hdHRhY2goc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsCi0JCQkJCQkgICAgICAgdm9pZCAqd2wsIHZvaWQgKndsYykgewotCXN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltID0gTlVMTDsKLQotCXBoeXNoaW0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGh5X3NoaW1faW5mbyksIEdGUF9BVE9NSUMpOwotCWlmICghcGh5c2hpbSkgewotCQl3aXBoeV9lcnIod2xjX2h3LT53bGMtPndpcGh5LAotCQkJICAid2wlZDogd2xjX3BoeV9zaGltX2F0dGFjaDogb3V0IG9mIG1lbVxuIiwKLQkJCSAgd2xjX2h3LT51bml0KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCXBoeXNoaW0tPndsY19odyA9IHdsY19odzsKLQlwaHlzaGltLT53bGMgPSB3bGM7Ci0JcGh5c2hpbS0+d2wgPSB3bDsKLQotCXJldHVybiBwaHlzaGltOwotfQotCi12b2lkIHdsY19waHlfc2hpbV9kZXRhY2goc3RydWN0IHBoeV9zaGltX2luZm8gKnBoeXNoaW0pCi17Ci0Ja2ZyZWUocGh5c2hpbSk7Ci19Ci0KLXN0cnVjdCB3bGFwaV90aW1lciAqd2xhcGlfaW5pdF90aW1lcihzdHJ1Y3QgcGh5X3NoaW1faW5mbyAqcGh5c2hpbSwKLQkJCQkgICAgIHZvaWQgKCpmbikgKHZvaWQgKmFyZyksIHZvaWQgKmFyZywKLQkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JcmV0dXJuIChzdHJ1Y3Qgd2xhcGlfdGltZXIgKikKLQkJCWJyY21zX2luaXRfdGltZXIocGh5c2hpbS0+d2wsIGZuLCBhcmcsIG5hbWUpOwotfQotCi12b2lkIHdsYXBpX2ZyZWVfdGltZXIoc3RydWN0IHBoeV9zaGltX2luZm8gKnBoeXNoaW0sIHN0cnVjdCB3bGFwaV90aW1lciAqdCkKLXsKLQlicmNtc19mcmVlX3RpbWVyKHBoeXNoaW0tPndsLCAoc3RydWN0IGJyY21zX3RpbWVyICopdCk7Ci19Ci0KLXZvaWQKLXdsYXBpX2FkZF90aW1lcihzdHJ1Y3QgcGh5X3NoaW1faW5mbyAqcGh5c2hpbSwgc3RydWN0IHdsYXBpX3RpbWVyICp0LCB1aW50IG1zLAotCQlpbnQgcGVyaW9kaWMpCi17Ci0JYnJjbXNfYWRkX3RpbWVyKHBoeXNoaW0tPndsLCAoc3RydWN0IGJyY21zX3RpbWVyICopdCwgbXMsIHBlcmlvZGljKTsKLX0KLQotYm9vbCB3bGFwaV9kZWxfdGltZXIoc3RydWN0IHBoeV9zaGltX2luZm8gKnBoeXNoaW0sIHN0cnVjdCB3bGFwaV90aW1lciAqdCkKLXsKLQlyZXR1cm4gYnJjbXNfZGVsX3RpbWVyKHBoeXNoaW0tPndsLCAoc3RydWN0IGJyY21zX3RpbWVyICopdCk7Ci19Ci0KLXZvaWQgd2xhcGlfaW50cnNvbihzdHJ1Y3QgcGh5X3NoaW1faW5mbyAqcGh5c2hpbSkKLXsKLQlicmNtc19pbnRyc29uKHBoeXNoaW0tPndsKTsKLX0KLQotdTMyIHdsYXBpX2ludHJzb2ZmKHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltKQotewotCXJldHVybiBicmNtc19pbnRyc29mZihwaHlzaGltLT53bCk7Ci19Ci0KLXZvaWQgd2xhcGlfaW50cnNyZXN0b3JlKHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltLCB1MzIgbWFjaW50bWFzaykKLXsKLQlicmNtc19pbnRyc3Jlc3RvcmUocGh5c2hpbS0+d2wsIG1hY2ludG1hc2spOwotfQotCi12b2lkIHdsYXBpX2JtYWNfd3JpdGVfc2htKHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltLCB1aW50IG9mZnNldCwgdTE2IHYpCi17Ci0JYnJjbXNfYl93cml0ZV9zaG0ocGh5c2hpbS0+d2xjX2h3LCBvZmZzZXQsIHYpOwotfQotCi11MTYgd2xhcGlfYm1hY19yZWFkX3NobShzdHJ1Y3QgcGh5X3NoaW1faW5mbyAqcGh5c2hpbSwgdWludCBvZmZzZXQpCi17Ci0JcmV0dXJuIGJyY21zX2JfcmVhZF9zaG0ocGh5c2hpbS0+d2xjX2h3LCBvZmZzZXQpOwotfQotCi12b2lkCi13bGFwaV9ibWFjX21oZihzdHJ1Y3QgcGh5X3NoaW1faW5mbyAqcGh5c2hpbSwgdTggaWR4LCB1MTYgbWFzaywKLQkgICAgICAgdTE2IHZhbCwgaW50IGJhbmRzKQotewotCWJyY21zX2JfbWhmKHBoeXNoaW0tPndsY19odywgaWR4LCBtYXNrLCB2YWwsIGJhbmRzKTsKLX0KLQotdm9pZCB3bGFwaV9ibWFjX2NvcmVyZXNldChzdHJ1Y3QgcGh5X3NoaW1faW5mbyAqcGh5c2hpbSwgdTMyIGZsYWdzKQotewotCWJyY21zX2JfY29yZXJlc2V0KHBoeXNoaW0tPndsY19odywgZmxhZ3MpOwotfQotCi12b2lkIHdsYXBpX3N1c3BlbmRfbWFjX2FuZF93YWl0KHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltKQotewotCWJyY21zX2Nfc3VzcGVuZF9tYWNfYW5kX3dhaXQocGh5c2hpbS0+d2xjKTsKLX0KLQotdm9pZCB3bGFwaV9zd2l0Y2hfbWFjZnJlcShzdHJ1Y3QgcGh5X3NoaW1faW5mbyAqcGh5c2hpbSwgdTggc3B1cm1vZGUpCi17Ci0JYnJjbXNfYl9zd2l0Y2hfbWFjZnJlcShwaHlzaGltLT53bGNfaHcsIHNwdXJtb2RlKTsKLX0KLQotdm9pZCB3bGFwaV9lbmFibGVfbWFjKHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltKQotewotCWJyY21zX2NfZW5hYmxlX21hYyhwaHlzaGltLT53bGMpOwotfQotCi12b2lkIHdsYXBpX2JtYWNfbWN0cmwoc3RydWN0IHBoeV9zaGltX2luZm8gKnBoeXNoaW0sIHUzMiBtYXNrLCB1MzIgdmFsKQotewotCWJyY21zX2JfbWN0cmwocGh5c2hpbS0+d2xjX2h3LCBtYXNrLCB2YWwpOwotfQotCi12b2lkIHdsYXBpX2JtYWNfcGh5X3Jlc2V0KHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltKQotewotCWJyY21zX2JfcGh5X3Jlc2V0KHBoeXNoaW0tPndsY19odyk7Ci19Ci0KLXZvaWQgd2xhcGlfYm1hY19id19zZXQoc3RydWN0IHBoeV9zaGltX2luZm8gKnBoeXNoaW0sIHUxNiBidykKLXsKLQlicmNtc19iX2J3X3NldChwaHlzaGltLT53bGNfaHcsIGJ3KTsKLX0KLQotdTE2IHdsYXBpX2JtYWNfZ2V0X3R4YW50KHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltKQotewotCXJldHVybiBicmNtc19iX2dldF90eGFudChwaHlzaGltLT53bGNfaHcpOwotfQotCi12b2lkIHdsYXBpX2JtYWNfcGh5Y2xrX2ZnYyhzdHJ1Y3QgcGh5X3NoaW1faW5mbyAqcGh5c2hpbSwgYm9vbCBjbGspCi17Ci0JYnJjbXNfYl9waHljbGtfZmdjKHBoeXNoaW0tPndsY19odywgY2xrKTsKLX0KLQotdm9pZCB3bGFwaV9ibWFjX21hY3BoeWNsa19zZXQoc3RydWN0IHBoeV9zaGltX2luZm8gKnBoeXNoaW0sIGJvb2wgY2xrKQotewotCWJyY21zX2JfbWFjcGh5Y2xrX3NldChwaHlzaGltLT53bGNfaHcsIGNsayk7Ci19Ci0KLXZvaWQgd2xhcGlfYm1hY19jb3JlX3BoeXBsbF9jdGwoc3RydWN0IHBoeV9zaGltX2luZm8gKnBoeXNoaW0sIGJvb2wgb24pCi17Ci0JYnJjbXNfYl9jb3JlX3BoeXBsbF9jdGwocGh5c2hpbS0+d2xjX2h3LCBvbik7Ci19Ci0KLXZvaWQgd2xhcGlfYm1hY19jb3JlX3BoeXBsbF9yZXNldChzdHJ1Y3QgcGh5X3NoaW1faW5mbyAqcGh5c2hpbSkKLXsKLQlicmNtc19iX2NvcmVfcGh5cGxsX3Jlc2V0KHBoeXNoaW0tPndsY19odyk7Ci19Ci0KLXZvaWQgd2xhcGlfYm1hY191Y29kZV93YWtlX292ZXJyaWRlX3BoeXJlZ19zZXQoc3RydWN0IHBoeV9zaGltX2luZm8gKnBoeXNoaW0pCi17Ci0JYnJjbXNfY191Y29kZV93YWtlX292ZXJyaWRlX3NldChwaHlzaGltLT53bGNfaHcsCi0JCQkJCUJSQ01TX1dBS0VfT1ZFUlJJREVfUEhZUkVHKTsKLX0KLQotdm9pZCB3bGFwaV9ibWFjX3Vjb2RlX3dha2Vfb3ZlcnJpZGVfcGh5cmVnX2NsZWFyKHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltKQotewotCWJyY21zX2NfdWNvZGVfd2FrZV9vdmVycmlkZV9jbGVhcihwaHlzaGltLT53bGNfaHcsCi0JCQkJCSAgQlJDTVNfV0FLRV9PVkVSUklERV9QSFlSRUcpOwotfQotCi12b2lkCi13bGFwaV9ibWFjX3dyaXRlX3RlbXBsYXRlX3JhbShzdHJ1Y3QgcGh5X3NoaW1faW5mbyAqcGh5c2hpbSwgaW50IG9mZnNldCwKLQkJCSAgICAgIGludCBsZW4sIHZvaWQgKmJ1ZikKLXsKLQlicmNtc19iX3dyaXRlX3RlbXBsYXRlX3JhbShwaHlzaGltLT53bGNfaHcsIG9mZnNldCwgbGVuLCBidWYpOwotfQotCi11MTYgd2xhcGlfYm1hY19yYXRlX3NobV9vZmZzZXQoc3RydWN0IHBoeV9zaGltX2luZm8gKnBoeXNoaW0sIHU4IHJhdGUpCi17Ci0JcmV0dXJuIGJyY21zX2JfcmF0ZV9zaG1fb2Zmc2V0KHBoeXNoaW0tPndsY19odywgcmF0ZSk7Ci19Ci0KLXZvaWQgd2xhcGlfdWNvZGVfc2FtcGxlX2luaXQoc3RydWN0IHBoeV9zaGltX2luZm8gKnBoeXNoaW0pCi17Ci19Ci0KLXZvaWQKLXdsYXBpX2NvcHlmcm9tX29iam1lbShzdHJ1Y3QgcGh5X3NoaW1faW5mbyAqcGh5c2hpbSwgdWludCBvZmZzZXQsIHZvaWQgKmJ1ZiwKLQkJICAgICAgaW50IGxlbiwgdTMyIHNlbCkKLXsKLQlicmNtc19iX2NvcHlmcm9tX29iam1lbShwaHlzaGltLT53bGNfaHcsIG9mZnNldCwgYnVmLCBsZW4sIHNlbCk7Ci19Ci0KLXZvaWQKLXdsYXBpX2NvcHl0b19vYmptZW0oc3RydWN0IHBoeV9zaGltX2luZm8gKnBoeXNoaW0sIHVpbnQgb2Zmc2V0LCBjb25zdCB2b2lkICpidWYsCi0JCSAgICBpbnQgbCwgdTMyIHNlbCkKLXsKLQlicmNtc19iX2NvcHl0b19vYmptZW0ocGh5c2hpbS0+d2xjX2h3LCBvZmZzZXQsIGJ1ZiwgbCwgc2VsKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvcGh5X3NoaW0uaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvcGh5X3NoaW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQxMmJiNC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3BoeV9zaGltLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLS8qCi0gKiBwaHlfc2hpbS5oOiBzdHVmZiBkZWZpbmVkIGluIHBoeV9zaGltLmMgYW5kIGluY2x1ZGVkIG9ubHkgYnkgdGhlIHBoeQotICovCi0KLSNpZm5kZWYgX0JSQ01fUEhZX1NISU1fSF8KLSNkZWZpbmUgX0JSQ01fUEhZX1NISU1fSF8KLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLSNkZWZpbmUgUkFEQVJfVFlQRV9OT05FCQkwCS8qIFJhZGFyIHR5cGUgTm9uZSAqLwotI2RlZmluZSBSQURBUl9UWVBFX0VUU0lfMQkxCS8qIEVUU0kgMSBSYWRhciB0eXBlICovCi0jZGVmaW5lIFJBREFSX1RZUEVfRVRTSV8yCTIJLyogRVRTSSAyIFJhZGFyIHR5cGUgKi8KLSNkZWZpbmUgUkFEQVJfVFlQRV9FVFNJXzMJMwkvKiBFVFNJIDMgUmFkYXIgdHlwZSAqLwotI2RlZmluZSBSQURBUl9UWVBFX0lUVV9FCTQJLyogSVRVIEUgUmFkYXIgdHlwZSAqLwotI2RlZmluZSBSQURBUl9UWVBFX0lUVV9LCTUJLyogSVRVIEsgUmFkYXIgdHlwZSAqLwotI2RlZmluZSBSQURBUl9UWVBFX1VOQ0xBU1NJRklFRAk2CS8qIFVuY2xhc3NpZmllZCBSYWRhciB0eXBlICAqLwotI2RlZmluZSBSQURBUl9UWVBFX0JJTjUJCTcJLyogbG9uZyBwdWxzZSByYWRhciB0eXBlICovCi0jZGVmaW5lIFJBREFSX1RZUEVfU1RHMgkJOAkvKiBzdGFnZ2VyZWQtMiByYWRhciAqLwotI2RlZmluZSBSQURBUl9UWVBFX1NURzMJCTkJLyogc3RhZ2dlcmVkLTMgcmFkYXIgKi8KLSNkZWZpbmUgUkFEQVJfVFlQRV9GUkEJCTEwCS8qIEZyZW5jaCByYWRhciAqLwotCi0vKiBGcmVuY2ggcmFkYXIgcHVsc2Ugd2lkdGhzICovCi0jZGVmaW5lIEZSQV9UMV8yME1IWgk1Mjc3MAotI2RlZmluZSBGUkFfVDJfMjBNSFoJNjE1MzgKLSNkZWZpbmUgRlJBX1QzXzIwTUhaCTY2MDAyCi0jZGVmaW5lIEZSQV9UMV80ME1IWgkxMDU1NDEKLSNkZWZpbmUgRlJBX1QyXzQwTUhaCTEyMzA3NwotI2RlZmluZSBGUkFfVDNfNDBNSFoJMTMyMDA0Ci0jZGVmaW5lIEZSQV9FUlJfMjBNSFoJNjAKLSNkZWZpbmUgRlJBX0VSUl80ME1IWgkxMjAKLQotI2RlZmluZSBBTlRTRUxfTkEJCTAJLyogTm8gYm9hcmRsZXZlbCBzZWxlY3Rpb24gYXZhaWxhYmxlICovCi0jZGVmaW5lIEFOVFNFTF8yeDQJCTEJLyogMng0IGJvYXJkbGV2ZWwgc2VsZWN0aW9uIGF2YWlsYWJsZSAqLwotI2RlZmluZSBBTlRTRUxfMngzCQkyCS8qIDJ4MyBDQjIgYm9hcmRsZXZlbCBzZWxlY3Rpb24gYXZhaWxhYmxlICovCi0KLS8qIFJ4IEFudGVubmEgZGl2ZXJzaXR5IGNvbnRyb2wgdmFsdWVzICovCi0jZGVmaW5lCUFOVF9SWF9ESVZfRk9SQ0VfMAkJMAkvKiBVc2UgYW50ZW5uYSAwICovCi0jZGVmaW5lCUFOVF9SWF9ESVZfRk9SQ0VfMQkJMQkvKiBVc2UgYW50ZW5uYSAxICovCi0jZGVmaW5lCUFOVF9SWF9ESVZfU1RBUlRfMQkJMgkvKiBDaG9vc2Ugc3RhcnRpbmcgd2l0aCAxICovCi0jZGVmaW5lCUFOVF9SWF9ESVZfU1RBUlRfMAkJMwkvKiBDaG9vc2Ugc3RhcnRpbmcgd2l0aCAwICovCi0jZGVmaW5lCUFOVF9SWF9ESVZfRU5BQkxFCQkzCS8qIEFQSFkgYmJDb25maWcgRW5hYmxlIFJYIERpdmVyc2l0eSAqLwotI2RlZmluZSBBTlRfUlhfRElWX0RFRgkJQU5UX1JYX0RJVl9TVEFSVF8wCS8qIGRlZmF1bHQgYW50ZGl2IHNldHRpbmcgKi8KLQotI2RlZmluZSBXTF9BTlRfUlhfTUFYCQkyCS8qIG1heCAyIHJlY2VpdmUgYW50ZW5uYXMgKi8KLSNkZWZpbmUgV0xfQU5UX0hUX1JYX01BWAkzCS8qIG1heCAzIHJlY2VpdmUgYW50ZW5uYXMvY29yZXMgKi8KLSNkZWZpbmUgV0xfQU5UX0lEWF8xCQkwCS8qIGFudGVubmEgaW5kZXggMSAqLwotI2RlZmluZSBXTF9BTlRfSURYXzIJCTEJLyogYW50ZW5uYSBpbmRleCAyICovCi0KLS8qIHZhbHVlcyBmb3Igbl9wcmVhbWJsZV90eXBlICovCi0jZGVmaW5lIEJSQ01TX05fUFJFQU1CTEVfTUlYRURNT0RFCTAKLSNkZWZpbmUgQlJDTVNfTl9QUkVBTUJMRV9HRgkJMQotI2RlZmluZSBCUkNNU19OX1BSRUFNQkxFX0dGX0JSQ00gICAgICAgICAgMgotCi0jZGVmaW5lIFdMX1RYX1BPV0VSX1JBVEVTX0xFR0FDWQk0NQotI2RlZmluZSBXTF9UWF9QT1dFUl9NQ1MyMF9GSVJTVAkgICAgICAgIDEyCi0jZGVmaW5lIFdMX1RYX1BPV0VSX01DUzIwX05VTQkgICAgICAgIDE2Ci0jZGVmaW5lIFdMX1RYX1BPV0VSX01DUzQwX0ZJUlNUCSAgICAgICAgMjgKLSNkZWZpbmUgV0xfVFhfUE9XRVJfTUNTNDBfTlVNCSAgICAgICAgMTcKLQotCi0jZGVmaW5lIFdMX1RYX1BPV0VSX1JBVEVTCSAgICAgICAxMDEKLSNkZWZpbmUgV0xfVFhfUE9XRVJfQ0NLX0ZJUlNUCSAgICAgICAwCi0jZGVmaW5lIFdMX1RYX1BPV0VSX0NDS19OVU0JICAgICAgIDQKLSNkZWZpbmUgV0xfVFhfUE9XRVJfT0ZETV9GSVJTVAkgICAgICAgNAkvKiBJbmRleCBmb3IgZmlyc3QgMjBNSHogT0ZETSBTSVNPIHJhdGUgKi8KLSNkZWZpbmUgV0xfVFhfUE9XRVJfT0ZETTIwX0NERF9GSVJTVCAgIDEyCS8qIEluZGV4IGZvciBmaXJzdCAyME1IeiBPRkRNIENERCByYXRlICovCi0jZGVmaW5lIFdMX1RYX1BPV0VSX09GRE00MF9TSVNPX0ZJUlNUICA1MgkvKiBJbmRleCBmb3IgZmlyc3QgNDBNSHogT0ZETSBTSVNPIHJhdGUgKi8KLSNkZWZpbmUgV0xfVFhfUE9XRVJfT0ZETTQwX0NERF9GSVJTVCAgIDYwCS8qIEluZGV4IGZvciBmaXJzdCA0ME1IeiBPRkRNIENERCByYXRlICovCi0jZGVmaW5lIFdMX1RYX1BPV0VSX09GRE1fTlVNCSAgICAgICA4Ci0jZGVmaW5lIFdMX1RYX1BPV0VSX01DUzIwX1NJU09fRklSU1QgICAyMAkvKiBJbmRleCBmb3IgZmlyc3QgMjBNSHogTUNTIFNJU08gcmF0ZSAqLwotI2RlZmluZSBXTF9UWF9QT1dFUl9NQ1MyMF9DRERfRklSU1QgICAgMjgJLyogSW5kZXggZm9yIGZpcnN0IDIwTUh6IE1DUyBDREQgcmF0ZSAqLwotI2RlZmluZSBXTF9UWF9QT1dFUl9NQ1MyMF9TVEJDX0ZJUlNUICAgMzYJLyogSW5kZXggZm9yIGZpcnN0IDIwTUh6IE1DUyBTVEJDIHJhdGUgKi8KLSNkZWZpbmUgV0xfVFhfUE9XRVJfTUNTMjBfU0RNX0ZJUlNUICAgIDQ0CS8qIEluZGV4IGZvciBmaXJzdCAyME1IeiBNQ1MgU0RNIHJhdGUgKi8KLSNkZWZpbmUgV0xfVFhfUE9XRVJfTUNTNDBfU0lTT19GSVJTVCAgIDY4CS8qIEluZGV4IGZvciBmaXJzdCA0ME1IeiBNQ1MgU0lTTyByYXRlICovCi0jZGVmaW5lIFdMX1RYX1BPV0VSX01DUzQwX0NERF9GSVJTVCAgICA3NgkvKiBJbmRleCBmb3IgZmlyc3QgNDBNSHogTUNTIENERCByYXRlICovCi0jZGVmaW5lIFdMX1RYX1BPV0VSX01DUzQwX1NUQkNfRklSU1QgICA4NAkvKiBJbmRleCBmb3IgZmlyc3QgNDBNSHogTUNTIFNUQkMgcmF0ZSAqLwotI2RlZmluZSBXTF9UWF9QT1dFUl9NQ1M0MF9TRE1fRklSU1QgICAgOTIJLyogSW5kZXggZm9yIGZpcnN0IDQwTUh6IE1DUyBTRE0gcmF0ZSAqLwotI2RlZmluZSBXTF9UWF9QT1dFUl9NQ1NfMV9TVFJFQU1fTlVNICAgOAotI2RlZmluZSBXTF9UWF9QT1dFUl9NQ1NfMl9TVFJFQU1fTlVNICAgOAotI2RlZmluZSBXTF9UWF9QT1dFUl9NQ1NfMzIJICAgICAgIDEwMAkvKiBJbmRleCBmb3IgNDBNSHogcmF0ZSBNQ1MgMzIgKi8KLSNkZWZpbmUgV0xfVFhfUE9XRVJfTUNTXzMyX05VTQkgICAgICAgMQotCi0vKiBzc2xwbnBoeSBzcGVjaWZpY3MgKi8KLSNkZWZpbmUgV0xfVFhfUE9XRVJfTUNTMjBfU0lTT19GSVJTVF9TU04gICAxMgkvKiBJbmRleCBmb3IgZmlyc3QgMjBNSHogTUNTIFNJU08gcmF0ZSAqLwotCi0vKiBzdHJ1Y3QgdHhfcG93ZXI6OmZsYWdzIGJpdHMgKi8KLSNkZWZpbmUgV0xfVFhfUE9XRVJfRl9FTkFCTEVECTEKLSNkZWZpbmUgV0xfVFhfUE9XRVJfRl9IVwkyCi0jZGVmaW5lIFdMX1RYX1BPV0VSX0ZfTUlNTwk0Ci0jZGVmaW5lIFdMX1RYX1BPV0VSX0ZfU0lTTwk4Ci0KLS8qIHZhbHVlcyB0byBmb3JjZSB0eC9yeCBjaGFpbiAqLwotI2RlZmluZSBCUkNNU19OX1RYUlhfQ0hBSU4wCQkwCi0jZGVmaW5lIEJSQ01TX05fVFhSWF9DSEFJTjEJCTEKLQotZXh0ZXJuIHN0cnVjdCBwaHlfc2hpbV9pbmZvICp3bGNfcGh5X3NoaW1fYXR0YWNoKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LAotCQkJCQkJdm9pZCAqd2wsIHZvaWQgKndsYyk7Ci1leHRlcm4gdm9pZCB3bGNfcGh5X3NoaW1fZGV0YWNoKHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltKTsKLQotLyogUEhZIHRvIFdMIHV0aWxpdHkgZnVuY3Rpb25zICovCi1leHRlcm4gc3RydWN0IHdsYXBpX3RpbWVyICp3bGFwaV9pbml0X3RpbWVyKHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltLAotCQkJCQkgICAgdm9pZCAoKmZuKSAodm9pZCAqYXJnKSwgdm9pZCAqYXJnLAotCQkJCQkgICAgY29uc3QgY2hhciAqbmFtZSk7Ci1leHRlcm4gdm9pZCB3bGFwaV9mcmVlX3RpbWVyKHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltLAotCQkJICAgICBzdHJ1Y3Qgd2xhcGlfdGltZXIgKnQpOwotZXh0ZXJuIHZvaWQgd2xhcGlfYWRkX3RpbWVyKHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltLAotCQkJICAgIHN0cnVjdCB3bGFwaV90aW1lciAqdCwgdWludCBtcywgaW50IHBlcmlvZGljKTsKLWV4dGVybiBib29sIHdsYXBpX2RlbF90aW1lcihzdHJ1Y3QgcGh5X3NoaW1faW5mbyAqcGh5c2hpbSwKLQkJCSAgICBzdHJ1Y3Qgd2xhcGlfdGltZXIgKnQpOwotZXh0ZXJuIHZvaWQgd2xhcGlfaW50cnNvbihzdHJ1Y3QgcGh5X3NoaW1faW5mbyAqcGh5c2hpbSk7Ci1leHRlcm4gdTMyIHdsYXBpX2ludHJzb2ZmKHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltKTsKLWV4dGVybiB2b2lkIHdsYXBpX2ludHJzcmVzdG9yZShzdHJ1Y3QgcGh5X3NoaW1faW5mbyAqcGh5c2hpbSwKLQkJCSAgICAgICB1MzIgbWFjaW50bWFzayk7Ci0KLWV4dGVybiB2b2lkIHdsYXBpX2JtYWNfd3JpdGVfc2htKHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltLCB1aW50IG9mZnNldCwKLQkJCQkgdTE2IHYpOwotZXh0ZXJuIHUxNiB3bGFwaV9ibWFjX3JlYWRfc2htKHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltLCB1aW50IG9mZnNldCk7Ci1leHRlcm4gdm9pZCB3bGFwaV9ibWFjX21oZihzdHJ1Y3QgcGh5X3NoaW1faW5mbyAqcGh5c2hpbSwgdTggaWR4LAotCQkJICAgdTE2IG1hc2ssIHUxNiB2YWwsIGludCBiYW5kcyk7Ci1leHRlcm4gdm9pZCB3bGFwaV9ibWFjX2NvcmVyZXNldChzdHJ1Y3QgcGh5X3NoaW1faW5mbyAqcGh5c2hpbSwgdTMyIGZsYWdzKTsKLWV4dGVybiB2b2lkIHdsYXBpX3N1c3BlbmRfbWFjX2FuZF93YWl0KHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltKTsKLWV4dGVybiB2b2lkIHdsYXBpX3N3aXRjaF9tYWNmcmVxKHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltLCB1OCBzcHVybW9kZSk7Ci1leHRlcm4gdm9pZCB3bGFwaV9lbmFibGVfbWFjKHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltKTsKLWV4dGVybiB2b2lkIHdsYXBpX2JtYWNfbWN0cmwoc3RydWN0IHBoeV9zaGltX2luZm8gKnBoeXNoaW0sIHUzMiBtYXNrLAotCQkJICAgICB1MzIgdmFsKTsKLWV4dGVybiB2b2lkIHdsYXBpX2JtYWNfcGh5X3Jlc2V0KHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltKTsKLWV4dGVybiB2b2lkIHdsYXBpX2JtYWNfYndfc2V0KHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltLCB1MTYgYncpOwotZXh0ZXJuIHZvaWQgd2xhcGlfYm1hY19waHljbGtfZmdjKHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltLCBib29sIGNsayk7Ci1leHRlcm4gdm9pZCB3bGFwaV9ibWFjX21hY3BoeWNsa19zZXQoc3RydWN0IHBoeV9zaGltX2luZm8gKnBoeXNoaW0sIGJvb2wgY2xrKTsKLWV4dGVybiB2b2lkIHdsYXBpX2JtYWNfY29yZV9waHlwbGxfY3RsKHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltLCBib29sIG9uKTsKLWV4dGVybiB2b2lkIHdsYXBpX2JtYWNfY29yZV9waHlwbGxfcmVzZXQoc3RydWN0IHBoeV9zaGltX2luZm8gKnBoeXNoaW0pOwotZXh0ZXJuIHZvaWQgd2xhcGlfYm1hY191Y29kZV93YWtlX292ZXJyaWRlX3BoeXJlZ19zZXQoc3RydWN0IHBoeV9zaGltX2luZm8gKgotCQkJCQkJICAgICAgcGh5c2hpbSk7Ci1leHRlcm4gdm9pZCB3bGFwaV9ibWFjX3Vjb2RlX3dha2Vfb3ZlcnJpZGVfcGh5cmVnX2NsZWFyKHN0cnVjdCBwaHlfc2hpbV9pbmZvICoKLQkJCQkJCQlwaHlzaGltKTsKLWV4dGVybiB2b2lkIHdsYXBpX2JtYWNfd3JpdGVfdGVtcGxhdGVfcmFtKHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltLCBpbnQgbywKLQkJCQkJICBpbnQgbGVuLCB2b2lkICpidWYpOwotZXh0ZXJuIHUxNiB3bGFwaV9ibWFjX3JhdGVfc2htX29mZnNldChzdHJ1Y3QgcGh5X3NoaW1faW5mbyAqcGh5c2hpbSwKLQkJCQkJIHU4IHJhdGUpOwotZXh0ZXJuIHZvaWQgd2xhcGlfdWNvZGVfc2FtcGxlX2luaXQoc3RydWN0IHBoeV9zaGltX2luZm8gKnBoeXNoaW0pOwotZXh0ZXJuIHZvaWQgd2xhcGlfY29weWZyb21fb2JqbWVtKHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltLCB1aW50LAotCQkJCSAgdm9pZCAqYnVmLCBpbnQsIHUzMiBzZWwpOwotZXh0ZXJuIHZvaWQgd2xhcGlfY29weXRvX29iam1lbShzdHJ1Y3QgcGh5X3NoaW1faW5mbyAqcGh5c2hpbSwgdWludCwKLQkJCQljb25zdCB2b2lkICpidWYsIGludCwgdTMyKTsKLQotZXh0ZXJuIHZvaWQgd2xhcGlfaGlnaF91cGRhdGVfcGh5X21vZGUoc3RydWN0IHBoeV9zaGltX2luZm8gKnBoeXNoaW0sCi0JCQkJICAgICAgIHUzMiBwaHlfbW9kZSk7Ci1leHRlcm4gdTE2IHdsYXBpX2JtYWNfZ2V0X3R4YW50KHN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltKTsKLSNlbmRpZgkJCQkvKiBfQlJDTV9QSFlfU0hJTV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9wbXUuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvcG11LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YjJiODEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9wbXUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDExIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLQotI2luY2x1ZGUgPGJyY21faHdfaWRzLmg+Ci0jaW5jbHVkZSA8Y2hpcGNvbW1vbi5oPgotI2luY2x1ZGUgPGJyY211X3V0aWxzLmg+Ci0jaW5jbHVkZSAicHViLmgiCi0jaW5jbHVkZSAiYWl1dGlscy5oIgotI2luY2x1ZGUgInBtdS5oIgotCi0vKgotICogZXh0ZXJuYWwgTFBPIGNyeXN0YWwgZnJlcXVlbmN5Ci0gKi8KLSNkZWZpbmUgRVhUX0lMUF9IWiAzMjc2OAotCi0vKgotICogRHVyYXRpb24gZm9yIElMUCBjbG9jayBmcmVxdWVuY3kgbWVhc3VybWVudCBpbiBtaWxsaXNlY29uZHMKLSAqCi0gKiByZW1hcms6IDEwMDAgbXVzdCBiZSBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIHRoaXMgZHVyYXRpb24KLSAqLwotI2RlZmluZSBJTFBfQ0FMQ19EVVIJMTAKLQotLyogRmllbGRzIGluIHBtdWNvbnRyb2wgKi8KLSNkZWZpbmUJUENUTF9JTFBfRElWX01BU0sJMHhmZmZmMDAwMAotI2RlZmluZQlQQ1RMX0lMUF9ESVZfU0hJRlQJMTYKLSNkZWZpbmUgUENUTF9QTExfUExMQ1RMX1VQRAkweDAwMDAwNDAwCS8qIHJldiAyICovCi0jZGVmaW5lIFBDVExfTk9JTFBfT05fV0FJVAkweDAwMDAwMjAwCS8qIHJldiAxICovCi0jZGVmaW5lCVBDVExfSFRfUkVRX0VOCQkweDAwMDAwMTAwCi0jZGVmaW5lCVBDVExfQUxQX1JFUV9FTgkJMHgwMDAwMDA4MAotI2RlZmluZQlQQ1RMX1hUQUxGUkVRX01BU0sJMHgwMDAwMDA3YwotI2RlZmluZQlQQ1RMX1hUQUxGUkVRX1NISUZUCTIKLSNkZWZpbmUJUENUTF9JTFBfRElWX0VOCQkweDAwMDAwMDAyCi0jZGVmaW5lCVBDVExfTFBPX1NFTAkJMHgwMDAwMDAwMQotCi0vKiBJTFAgY2xvY2sgKi8KLSNkZWZpbmUJSUxQX0NMT0NLCQkzMjAwMAotCi0vKiBBTFAgY2xvY2sgb24gcHJlLVBNVSBjaGlwcyAqLwotI2RlZmluZQlBTFBfQ0xPQ0sJCTIwMDAwMDAwCi0KLS8qIHBtdXN0YXR1cyAqLwotI2RlZmluZSBQU1RfRVhUTFBPQVZBSUwJMHgwMTAwCi0jZGVmaW5lIFBTVF9XRFJFU0VUCTB4MDA4MAotI2RlZmluZQlQU1RfSU5UUEVORAkweDAwNDAKLSNkZWZpbmUJUFNUX1NCQ0xLU1QJMHgwMDMwCi0jZGVmaW5lCVBTVF9TQkNMS1NUX0lMUAkweDAwMTAKLSNkZWZpbmUJUFNUX1NCQ0xLU1RfQUxQCTB4MDAyMAotI2RlZmluZQlQU1RfU0JDTEtTVF9IVAkweDAwMzAKLSNkZWZpbmUJUFNUX0FMUEFWQUlMCTB4MDAwOAotI2RlZmluZQlQU1RfSFRBVkFJTAkweDAwMDQKLSNkZWZpbmUJUFNUX1JFU0lOSVQJMHgwMDAzCi0KLS8qIFBNVSByZXNvdXJjZSBiaXQgcG9zaXRpb24gKi8KLSNkZWZpbmUgUE1VUkVTX0JJVChiaXQpCSgxIDw8IChiaXQpKQotCi0vKiBQTVUgY29yZXJldiBhbmQgY2hpcCBzcGVjaWZpYyBQTEwgY29udHJvbHMuCi0gKiBQTVU8cmV2Pl9QTEw8bnVtPl9YWCB3aGVyZSA8cmV2PiBpcyBQTVUgY29yZXJldiBhbmQgPG51bT4gaXMgYW4gYXJiaXRyYXJ5IG51bWJlcgotICogdG8gZGlmZmVyZW50aWF0ZSBkaWZmZXJlbnQgUExMcyBjb250cm9sbGVkIGJ5IHRoZSBzYW1lIFBNVSByZXYuCi0gKi8KLS8qIHBsbGNvbnRyb2wgcmVnaXN0ZXJzICovCi0vKiBuZGl2X3B3cmRuLCBwd3Jkbl9jaDx4PiwgcmVmY29tcF9wd3JkbiwgZGx5X2NoPHg+LCBwMWRpdiwgcDJkaXYsIF9ieXBhc3Nfc2Rtb2QgKi8KLSNkZWZpbmUgUE1VMV9QTEwwX1BMTENUTDAJCTAKLSNkZWZpbmUgUE1VMV9QTEwwX1BMTENUTDEJCTEKLSNkZWZpbmUgUE1VMV9QTEwwX1BMTENUTDIJCTIKLSNkZWZpbmUgUE1VMV9QTEwwX1BMTENUTDMJCTMKLSNkZWZpbmUgUE1VMV9QTEwwX1BMTENUTDQJCTQKLSNkZWZpbmUgUE1VMV9QTEwwX1BMTENUTDUJCTUKLQotLyogcG11IFh0YWxGcmVxUmF0aW8gKi8KLSNkZWZpbmUJUE1VX1hUQUxGUkVRX1JFR19JTFBDVFJfTUFTSwkweDAwMDAxRkZGCi0jZGVmaW5lCVBNVV9YVEFMRlJFUV9SRUdfTUVBU1VSRV9NQVNLCTB4ODAwMDAwMDAKLSNkZWZpbmUJUE1VX1hUQUxGUkVRX1JFR19NRUFTVVJFX1NISUZUCTMxCi0KLS8qIDQzMTMgcmVzb3VyY2VzICovCi0jZGVmaW5lCVJFUzQzMTNfQkJfUFVfUlNSQwkJMAotI2RlZmluZQlSRVM0MzEzX0lMUF9SRVFfUlNSQwkJMQotI2RlZmluZQlSRVM0MzEzX1hUQUxfUFVfUlNSQwkJMgotI2RlZmluZQlSRVM0MzEzX0FMUF9BVkFJTF9SU1JDCQkzCi0jZGVmaW5lCVJFUzQzMTNfUkFESU9fUFVfUlNSQwkJNAotI2RlZmluZQlSRVM0MzEzX0JHX1BVX1JTUkMJCTUKLSNkZWZpbmUJUkVTNDMxM19WUkVHMVA0X1BVX1JTUkMJCTYKLSNkZWZpbmUJUkVTNDMxM19BRkVfUFdSU1dfUlNSQwkJNwotI2RlZmluZQlSRVM0MzEzX1JYX1BXUlNXX1JTUkMJCTgKLSNkZWZpbmUJUkVTNDMxM19UWF9QV1JTV19SU1JDCQk5Ci0jZGVmaW5lCVJFUzQzMTNfQkJfUFdSU1dfUlNSQwkJMTAKLSNkZWZpbmUJUkVTNDMxM19TWU5USF9QV1JTV19SU1JDCTExCi0jZGVmaW5lCVJFUzQzMTNfTUlTQ19QV1JTV19SU1JDCQkxMgotI2RlZmluZQlSRVM0MzEzX0JCX1BMTF9QV1JTV19SU1JDCTEzCi0jZGVmaW5lCVJFUzQzMTNfSFRfQVZBSUxfUlNSQwkJMTQKLSNkZWZpbmUJUkVTNDMxM19NQUNQSFlfQ0xLX0FWQUlMX1JTUkMJMTUKLQotLyogRGV0ZXJtaW5lIG1pbi9tYXggcnNyYyBtYXNrcy4gVmFsdWUgMCBsZWF2ZXMgaGFyZHdhcmUgYXQgZGVmYXVsdC4gKi8KLXN0YXRpYyB2b2lkIHNpX3BtdV9yZXNfbWFza3Moc3RydWN0IHNpX3B1YiAqc2loLCB1MzIgKiBwbWluLCB1MzIgKiBwbWF4KQotewotCXUzMiBtaW5fbWFzayA9IDAsIG1heF9tYXNrID0gMDsKLQl1aW50IHJzcmNzOwotCi0JLyogIyByZXNvdXJjZXMgKi8KLQlyc3JjcyA9IChzaWgtPnBtdWNhcHMgJiBQQ0FQX1JDX01BU0spID4+IFBDQVBfUkNfU0hJRlQ7Ci0KLQkvKiBkZXRlcm1pbmUgbWluL21heCByc3JjIG1hc2tzICovCi0Jc3dpdGNoIChzaWgtPmNoaXApIHsKLQljYXNlIEJDTTQzMjI0X0NISVBfSUQ6Ci0JY2FzZSBCQ000MzIyNV9DSElQX0lEOgotCQkvKiA/Pz8gKi8KLQkJYnJlYWs7Ci0KLQljYXNlIEJDTTQzMTNfQ0hJUF9JRDoKLQkJbWluX21hc2sgPSBQTVVSRVNfQklUKFJFUzQzMTNfQkJfUFVfUlNSQykgfAotCQkgICAgUE1VUkVTX0JJVChSRVM0MzEzX1hUQUxfUFVfUlNSQykgfAotCQkgICAgUE1VUkVTX0JJVChSRVM0MzEzX0FMUF9BVkFJTF9SU1JDKSB8Ci0JCSAgICBQTVVSRVNfQklUKFJFUzQzMTNfQkJfUExMX1BXUlNXX1JTUkMpOwotCQltYXhfbWFzayA9IDB4ZmZmZjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JKnBtaW4gPSBtaW5fbWFzazsKLQkqcG1heCA9IG1heF9tYXNrOwotfQotCi1zdGF0aWMgdm9pZAotc2lfcG11X3NwdXJhdm9pZF9wbGx1cGRhdGUoc3RydWN0IHNpX3B1YiAqc2loLCBjaGlwY3JlZ3NfdCAqY2MsIHU4IHNwdXJhdm9pZCkKLXsKLQl1MzIgdG1wID0gMDsKLQotCXN3aXRjaCAoc2loLT5jaGlwKSB7Ci0JY2FzZSBCQ000MzIyNF9DSElQX0lEOgotCWNhc2UgQkNNNDMyMjVfQ0hJUF9JRDoKLQkJaWYgKHNwdXJhdm9pZCA9PSAxKSB7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfYWRkciwgUE1VMV9QTEwwX1BMTENUTDApOwotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2RhdGEsIDB4MTE1MDAwMTApOwotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2FkZHIsIFBNVTFfUExMMF9QTExDVEwxKTsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9kYXRhLCAweDAwMEMwQzA2KTsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9hZGRyLCBQTVUxX1BMTDBfUExMQ1RMMik7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfZGF0YSwgMHgwRjYwMGEwOCk7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfYWRkciwgUE1VMV9QTEwwX1BMTENUTDMpOwotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2RhdGEsIDB4MDAwMDAwMDApOwotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2FkZHIsIFBNVTFfUExMMF9QTExDVEw0KTsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9kYXRhLCAweDIwMDFFOTIwKTsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9hZGRyLCBQTVUxX1BMTDBfUExMQ1RMNSk7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfZGF0YSwgMHg4ODg4ODgxNSk7Ci0JCX0gZWxzZSB7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfYWRkciwgUE1VMV9QTEwwX1BMTENUTDApOwotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2RhdGEsIDB4MTExMDAwMTApOwotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2FkZHIsIFBNVTFfUExMMF9QTExDVEwxKTsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9kYXRhLCAweDAwMGMwYzA2KTsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9hZGRyLCBQTVUxX1BMTDBfUExMQ1RMMik7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfZGF0YSwgMHgwMzAwMGEwOCk7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfYWRkciwgUE1VMV9QTEwwX1BMTENUTDMpOwotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2RhdGEsIDB4MDAwMDAwMDApOwotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2FkZHIsIFBNVTFfUExMMF9QTExDVEw0KTsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9kYXRhLCAweDIwMDAwNWMwKTsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9hZGRyLCBQTVUxX1BMTDBfUExMQ1RMNSk7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfZGF0YSwgMHg4ODg4ODgxNSk7Ci0JCX0KLQkJdG1wID0gMSA8PCAxMDsKLQkJYnJlYWs7Ci0KLQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2FkZHIsIFBNVTFfUExMMF9QTExDVEwwKTsKLQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2RhdGEsIDB4MTExMDAwMDgpOwotCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfYWRkciwgUE1VMV9QTEwwX1BMTENUTDEpOwotCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfZGF0YSwgMHgwYzAwMGMwNik7Ci0JCVdfUkVHKCZjYy0+cGxsY29udHJvbF9hZGRyLCBQTVUxX1BMTDBfUExMQ1RMMik7Ci0JCVdfUkVHKCZjYy0+cGxsY29udHJvbF9kYXRhLCAweDAzMDAwYTA4KTsKLQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2FkZHIsIFBNVTFfUExMMF9QTExDVEwzKTsKLQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2RhdGEsIDB4MDAwMDAwMDApOwotCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfYWRkciwgUE1VMV9QTEwwX1BMTENUTDQpOwotCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfZGF0YSwgMHgyMDAwMDVjMCk7Ci0JCVdfUkVHKCZjYy0+cGxsY29udHJvbF9hZGRyLCBQTVUxX1BMTDBfUExMQ1RMNSk7Ci0JCVdfUkVHKCZjYy0+cGxsY29udHJvbF9kYXRhLCAweDg4ODg4ODU1KTsKLQotCQl0bXAgPSAxIDw8IDEwOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCS8qIGJhaWwgb3V0ICovCi0JCXJldHVybjsKLQl9Ci0KLQl0bXAgfD0gUl9SRUcoJmNjLT5wbXVjb250cm9sKTsKLQlXX1JFRygmY2MtPnBtdWNvbnRyb2wsIHRtcCk7Ci19Ci0KLXUzMiBzaV9wbXVfaWxwX2Nsb2NrKHN0cnVjdCBzaV9wdWIgKnNpaCkKLXsKLQlzdGF0aWMgdTMyIGlscGN5Y2xlc19wZXJfc2VjOwotCi0JaWYgKCFQTVVDVExfRU5BQihzaWgpKQotCQlyZXR1cm4gSUxQX0NMT0NLOwotCi0JaWYgKGlscGN5Y2xlc19wZXJfc2VjID09IDApIHsKLQkJdTMyIHN0YXJ0LCBlbmQsIGRlbHRhOwotCQl1MzIgb3JpZ2lkeCA9IGFpX2NvcmVpZHgoc2loKTsKLQkJY2hpcGNyZWdzX3QgKmNjID0gYWlfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7Ci0JCXN0YXJ0ID0gUl9SRUcoJmNjLT5wbXV0aW1lcik7Ci0JCW1kZWxheShJTFBfQ0FMQ19EVVIpOwotCQllbmQgPSBSX1JFRygmY2MtPnBtdXRpbWVyKTsKLQkJZGVsdGEgPSBlbmQgLSBzdGFydDsKLQkJaWxwY3ljbGVzX3Blcl9zZWMgPSBkZWx0YSAqICgxMDAwIC8gSUxQX0NBTENfRFVSKTsKLQkJYWlfc2V0Y29yZWlkeChzaWgsIG9yaWdpZHgpOwotCX0KLQotCXJldHVybiBpbHBjeWNsZXNfcGVyX3NlYzsKLX0KLQotdTE2IHNpX3BtdV9mYXN0X3B3cnVwX2RlbGF5KHN0cnVjdCBzaV9wdWIgKnNpaCkKLXsKLQl1aW50IGRlbGF5ID0gUE1VX01BWF9UUkFOU0lUSU9OX0RMWTsKLQotCXN3aXRjaCAoc2loLT5jaGlwKSB7Ci0JY2FzZSBCQ000MzIyNF9DSElQX0lEOgotCWNhc2UgQkNNNDMyMjVfQ0hJUF9JRDoKLQljYXNlIEJDTTQzMTNfQ0hJUF9JRDoKLQkJZGVsYXkgPSAzNzAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gKHUxNikgZGVsYXk7Ci19Ci0KLXZvaWQgc2lfcG11X3Nwcm9tX2VuYWJsZShzdHJ1Y3Qgc2lfcHViICpzaWgsIGJvb2wgZW5hYmxlKQotewotCWNoaXBjcmVnc190ICpjYzsKLQl1aW50IG9yaWdpZHg7Ci0KLQkvKiBSZW1lbWJlciBvcmlnaW5hbCBjb3JlIGJlZm9yZSBzd2l0Y2ggdG8gY2hpcGMgKi8KLQlvcmlnaWR4ID0gYWlfY29yZWlkeChzaWgpOwotCWNjID0gYWlfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7Ci0KLQkvKiBSZXR1cm4gdG8gb3JpZ2luYWwgY29yZSAqLwotCWFpX3NldGNvcmVpZHgoc2loLCBvcmlnaWR4KTsKLX0KLQotLyogUmVhZC93cml0ZSBhIGNoaXBjb250cm9sIHJlZyAqLwotdTMyIHNpX3BtdV9jaGlwY29udHJvbChzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgcmVnLCB1MzIgbWFzaywgdTMyIHZhbCkKLXsKLQlhaV9jb3JlcmVnKHNpaCwgU0lfQ0NfSURYLCBvZmZzZXRvZihjaGlwY3JlZ3NfdCwgY2hpcGNvbnRyb2xfYWRkciksIH4wLAotCQkgICByZWcpOwotCXJldHVybiBhaV9jb3JlcmVnKHNpaCwgU0lfQ0NfSURYLAotCQkJICBvZmZzZXRvZihjaGlwY3JlZ3NfdCwgY2hpcGNvbnRyb2xfZGF0YSksIG1hc2ssIHZhbCk7Ci19Ci0KLS8qIFJlYWQvd3JpdGUgYSByZWdjb250cm9sIHJlZyAqLwotdTMyIHNpX3BtdV9yZWdjb250cm9sKHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCByZWcsIHUzMiBtYXNrLCB1MzIgdmFsKQotewotCWFpX2NvcmVyZWcoc2loLCBTSV9DQ19JRFgsIG9mZnNldG9mKGNoaXBjcmVnc190LCByZWdjb250cm9sX2FkZHIpLCB+MCwKLQkJICAgcmVnKTsKLQlyZXR1cm4gYWlfY29yZXJlZyhzaWgsIFNJX0NDX0lEWCwKLQkJCSAgb2Zmc2V0b2YoY2hpcGNyZWdzX3QsIHJlZ2NvbnRyb2xfZGF0YSksIG1hc2ssIHZhbCk7Ci19Ci0KLS8qIFJlYWQvd3JpdGUgYSBwbGxjb250cm9sIHJlZyAqLwotdTMyIHNpX3BtdV9wbGxjb250cm9sKHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCByZWcsIHUzMiBtYXNrLCB1MzIgdmFsKQotewotCWFpX2NvcmVyZWcoc2loLCBTSV9DQ19JRFgsIG9mZnNldG9mKGNoaXBjcmVnc190LCBwbGxjb250cm9sX2FkZHIpLCB+MCwKLQkJICAgcmVnKTsKLQlyZXR1cm4gYWlfY29yZXJlZyhzaWgsIFNJX0NDX0lEWCwKLQkJCSAgb2Zmc2V0b2YoY2hpcGNyZWdzX3QsIHBsbGNvbnRyb2xfZGF0YSksIG1hc2ssIHZhbCk7Ci19Ci0KLS8qIFBNVSBQTEwgdXBkYXRlICovCi12b2lkIHNpX3BtdV9wbGx1cGQoc3RydWN0IHNpX3B1YiAqc2loKQotewotCWFpX2NvcmVyZWcoc2loLCBTSV9DQ19JRFgsIG9mZnNldG9mKGNoaXBjcmVnc190LCBwbXVjb250cm9sKSwKLQkJICAgUENUTF9QTExfUExMQ1RMX1VQRCwgUENUTF9QTExfUExMQ1RMX1VQRCk7Ci19Ci0KLS8qIHF1ZXJ5IGFscC94dGFsIGNsb2NrIGZyZXF1ZW5jeSAqLwotdTMyIHNpX3BtdV9hbHBfY2xvY2soc3RydWN0IHNpX3B1YiAqc2loKQotewotCXUzMiBjbG9jayA9IEFMUF9DTE9DSzsKLQotCS8qIGJhaWwgb3V0IHdpdGggZGVmYXVsdCAqLwotCWlmICghUE1VQ1RMX0VOQUIoc2loKSkKLQkJcmV0dXJuIGNsb2NrOwotCi0Jc3dpdGNoIChzaWgtPmNoaXApIHsKLQljYXNlIEJDTTQzMjI0X0NISVBfSUQ6Ci0JY2FzZSBCQ000MzIyNV9DSElQX0lEOgotCWNhc2UgQkNNNDMxM19DSElQX0lEOgotCQkvKiBhbHdheXMgMjBNaHogKi8KLQkJY2xvY2sgPSAyMDAwMCAqIDEwMDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBjbG9jazsKLX0KLQotdm9pZCBzaV9wbXVfc3B1cmF2b2lkKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTggc3B1cmF2b2lkKQotewotCWNoaXBjcmVnc190ICpjYzsKLQl1aW50IG9yaWdpZHgsIGludHJfdmFsOwotCi0JLyogUmVtZW1iZXIgb3JpZ2luYWwgY29yZSBiZWZvcmUgc3dpdGNoIHRvIGNoaXBjICovCi0JY2MgPSAoY2hpcGNyZWdzX3QgKikgYWlfc3dpdGNoX2NvcmUoc2loLCBDQ19DT1JFX0lELCAmb3JpZ2lkeCwKLQkJCQkJICAgICZpbnRyX3ZhbCk7Ci0KLQkvKiB1cGRhdGUgdGhlIHBsbCBjaGFuZ2VzICovCi0Jc2lfcG11X3NwdXJhdm9pZF9wbGx1cGRhdGUoc2loLCBjYywgc3B1cmF2b2lkKTsKLQotCS8qIFJldHVybiB0byBvcmlnaW5hbCBjb3JlICovCi0JYWlfcmVzdG9yZV9jb3JlKHNpaCwgb3JpZ2lkeCwgaW50cl92YWwpOwotfQotCi0vKiBpbml0aWFsaXplIFBNVSAqLwotdm9pZCBzaV9wbXVfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgpCi17Ci0JY2hpcGNyZWdzX3QgKmNjOwotCXVpbnQgb3JpZ2lkeDsKLQotCS8qIFJlbWVtYmVyIG9yaWdpbmFsIGNvcmUgYmVmb3JlIHN3aXRjaCB0byBjaGlwYyAqLwotCW9yaWdpZHggPSBhaV9jb3JlaWR4KHNpaCk7Ci0JY2MgPSBhaV9zZXRjb3JlaWR4KHNpaCwgU0lfQ0NfSURYKTsKLQotCWlmIChzaWgtPnBtdXJldiA9PSAxKQotCQlBTkRfUkVHKCZjYy0+cG11Y29udHJvbCwgflBDVExfTk9JTFBfT05fV0FJVCk7Ci0JZWxzZSBpZiAoc2loLT5wbXVyZXYgPj0gMikKLQkJT1JfUkVHKCZjYy0+cG11Y29udHJvbCwgUENUTF9OT0lMUF9PTl9XQUlUKTsKLQotCS8qIFJldHVybiB0byBvcmlnaW5hbCBjb3JlICovCi0JYWlfc2V0Y29yZWlkeChzaWgsIG9yaWdpZHgpOwotfQotCi0vKiBpbml0aWFsaXplIFBNVSBjaGlwIGNvbnRyb2xzIGFuZCBvdGhlciBjaGlwIGxldmVsIHN0dWZmICovCi12b2lkIHNpX3BtdV9jaGlwX2luaXQoc3RydWN0IHNpX3B1YiAqc2loKQotewotCXVpbnQgb3JpZ2lkeDsKLQotCS8qIEdhdGUgb2ZmIFNQUk9NIGNsb2NrIGFuZCBjaGlwIHNlbGVjdCBzaWduYWxzICovCi0Jc2lfcG11X3Nwcm9tX2VuYWJsZShzaWgsIGZhbHNlKTsKLQotCS8qIFJlbWVtYmVyIG9yaWdpbmFsIGNvcmUgKi8KLQlvcmlnaWR4ID0gYWlfY29yZWlkeChzaWgpOwotCi0JLyogUmV0dXJuIHRvIG9yaWdpbmFsIGNvcmUgKi8KLQlhaV9zZXRjb3JlaWR4KHNpaCwgb3JpZ2lkeCk7Ci19Ci0KLS8qIGluaXRpYWxpemUgUE1VIHN3aXRjaC9yZWd1bGF0b3JzICovCi12b2lkIHNpX3BtdV9zd3JlZ19pbml0KHN0cnVjdCBzaV9wdWIgKnNpaCkKLXsKLX0KLQotLyogaW5pdGlhbGl6ZSBQTEwgKi8KLXZvaWQgc2lfcG11X3BsbF9pbml0KHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCB4dGFsZnJlcSkKLXsKLQljaGlwY3JlZ3NfdCAqY2M7Ci0JdWludCBvcmlnaWR4OwotCi0JLyogUmVtZW1iZXIgb3JpZ2luYWwgY29yZSBiZWZvcmUgc3dpdGNoIHRvIGNoaXBjICovCi0Jb3JpZ2lkeCA9IGFpX2NvcmVpZHgoc2loKTsKLQljYyA9IGFpX3NldGNvcmVpZHgoc2loLCBTSV9DQ19JRFgpOwotCi0Jc3dpdGNoIChzaWgtPmNoaXApIHsKLQljYXNlIEJDTTQzMTNfQ0hJUF9JRDoKLQljYXNlIEJDTTQzMjI0X0NISVBfSUQ6Ci0JY2FzZSBCQ000MzIyNV9DSElQX0lEOgotCQkvKiA/Pz8gKi8KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JLyogUmV0dXJuIHRvIG9yaWdpbmFsIGNvcmUgKi8KLQlhaV9zZXRjb3JlaWR4KHNpaCwgb3JpZ2lkeCk7Ci19Ci0KLS8qIGluaXRpYWxpemUgUE1VIHJlc291cmNlcyAqLwotdm9pZCBzaV9wbXVfcmVzX2luaXQoc3RydWN0IHNpX3B1YiAqc2loKQotewotCWNoaXBjcmVnc190ICpjYzsKLQl1aW50IG9yaWdpZHg7Ci0JdTMyIG1pbl9tYXNrID0gMCwgbWF4X21hc2sgPSAwOwotCi0JLyogUmVtZW1iZXIgb3JpZ2luYWwgY29yZSBiZWZvcmUgc3dpdGNoIHRvIGNoaXBjICovCi0Jb3JpZ2lkeCA9IGFpX2NvcmVpZHgoc2loKTsKLQljYyA9IGFpX3NldGNvcmVpZHgoc2loLCBTSV9DQ19JRFgpOwotCi0JLyogRGV0ZXJtaW5lIG1pbi9tYXggcnNyYyBtYXNrcyAqLwotCXNpX3BtdV9yZXNfbWFza3Moc2loLCAmbWluX21hc2ssICZtYXhfbWFzayk7Ci0KLQkvKiBJdCBpcyByZXF1aXJlZCB0byBwcm9ncmFtIG1heF9tYXNrIGZpcnN0IGFuZCB0aGVuIG1pbl9tYXNrICovCi0KLQkvKiBQcm9ncmFtIG1heCByZXNvdXJjZSBtYXNrICovCi0KLQlpZiAobWF4X21hc2spCi0JCVdfUkVHKCZjYy0+bWF4X3Jlc19tYXNrLCBtYXhfbWFzayk7Ci0KLQkvKiBQcm9ncmFtIG1pbiByZXNvdXJjZSBtYXNrICovCi0KLQlpZiAobWluX21hc2spCi0JCVdfUkVHKCZjYy0+bWluX3Jlc19tYXNrLCBtaW5fbWFzayk7Ci0KLQkvKiBBZGQgc29tZSBkZWxheTsgYWxsb3cgcmVzb3VyY2VzIHRvIGNvbWUgdXAgYW5kIHNldHRsZS4gKi8KLQltZGVsYXkoMik7Ci0KLQkvKiBSZXR1cm4gdG8gb3JpZ2luYWwgY29yZSAqLwotCWFpX3NldGNvcmVpZHgoc2loLCBvcmlnaWR4KTsKLX0KLQotdTMyIHNpX3BtdV9tZWFzdXJlX2FscGNsayhzdHJ1Y3Qgc2lfcHViICpzaWgpCi17Ci0JY2hpcGNyZWdzX3QgKmNjOwotCXVpbnQgb3JpZ2lkeDsKLQl1MzIgYWxwX2toejsKLQotCWlmIChzaWgtPnBtdXJldiA8IDEwKQotCQlyZXR1cm4gMDsKLQotCS8qIFJlbWVtYmVyIG9yaWdpbmFsIGNvcmUgYmVmb3JlIHN3aXRjaCB0byBjaGlwYyAqLwotCW9yaWdpZHggPSBhaV9jb3JlaWR4KHNpaCk7Ci0JY2MgPSBhaV9zZXRjb3JlaWR4KHNpaCwgU0lfQ0NfSURYKTsKLQotCWlmIChSX1JFRygmY2MtPnBtdXN0YXR1cykgJiBQU1RfRVhUTFBPQVZBSUwpIHsKLQkJdTMyIGlscF9jdHIsIGFscF9oejsKLQotCQkvKgotCQkgKiBFbmFibGUgdGhlIHJlZyB0byBtZWFzdXJlIHRoZSBmcmVxLAotCQkgKiBpbiBjYXNlIGl0IHdhcyBkaXNhYmxlZCBiZWZvcmUKLQkJICovCi0JCVdfUkVHKCZjYy0+cG11X3h0YWxmcmVxLAotCQkgICAgICAxVSA8PCBQTVVfWFRBTEZSRVFfUkVHX01FQVNVUkVfU0hJRlQpOwotCi0JCS8qIERlbGF5IGZvciB3ZWxsIG92ZXIgNCBJTFAgY2xvY2tzICovCi0JCXVkZWxheSgxMDAwKTsKLQotCQkvKiBSZWFkIHRoZSBsYXRjaGVkIG51bWJlciBvZiBBTFAgdGlja3MgcGVyIDQgSUxQIHRpY2tzICovCi0JCWlscF9jdHIgPQotCQkgICAgUl9SRUcoJmNjLT5wbXVfeHRhbGZyZXEpICYgUE1VX1hUQUxGUkVRX1JFR19JTFBDVFJfTUFTSzsKLQotCQkvKgotCQkgKiBUdXJuIG9mZiB0aGUgUE1VX1hUQUxGUkVRX1JFR19NRUFTVVJFX1NISUZUCi0JCSAqIGJpdCB0byBzYXZlIHBvd2VyCi0JCSAqLwotCQlXX1JFRygmY2MtPnBtdV94dGFsZnJlcSwgMCk7Ci0KLQkJLyogQ2FsY3VsYXRlIEFMUCBmcmVxdWVuY3kgKi8KLQkJYWxwX2h6ID0gKGlscF9jdHIgKiBFWFRfSUxQX0haKSAvIDQ7Ci0KLQkJLyoKLQkJICogUm91bmQgdG8gbmVhcmVzdCAxMDBLSHosIGFuZCBhdAotCQkgKiB0aGUgc2FtZSB0aW1lIGNvbnZlcnQgdG8gS0h6Ci0JCSAqLwotCQlhbHBfa2h6ID0gKGFscF9oeiArIDUwMDAwKSAvIDEwMDAwMCAqIDEwMDsKLQl9IGVsc2UKLQkJYWxwX2toeiA9IDA7Ci0KLQkvKiBSZXR1cm4gdG8gb3JpZ2luYWwgY29yZSAqLwotCWFpX3NldGNvcmVpZHgoc2loLCBvcmlnaWR4KTsKLQotCXJldHVybiBhbHBfa2h6OwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9wbXUuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvcG11LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjN2U0OGMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9wbXUuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0KLSNpZm5kZWYgX0JSQ01fUE1VX0hfCi0jZGVmaW5lIF9CUkNNX1BNVV9IXwotCi0jaW5jbHVkZSAidHlwZXMuaCIKLS8qCi0gKiBMRE8gc2VsZWN0aW9ucyB1c2VkIGluIHNpX3BtdV9zZXRfbGRvX3ZvbHRhZ2UKLSAqLwotI2RlZmluZSBTRVRfTERPX1ZPTFRBR0VfTERPMQkxCi0jZGVmaW5lIFNFVF9MRE9fVk9MVEFHRV9MRE8yCTIKLSNkZWZpbmUgU0VUX0xET19WT0xUQUdFX0xETzMJMwotI2RlZmluZSBTRVRfTERPX1ZPTFRBR0VfUEFSRUYJNAotI2RlZmluZSBTRVRfTERPX1ZPTFRBR0VfQ0xET19QV00JNQotI2RlZmluZSBTRVRfTERPX1ZPTFRBR0VfQ0xET19CVVJTVAk2Ci0jZGVmaW5lIFNFVF9MRE9fVk9MVEFHRV9DQlVDS19QV00JNwotI2RlZmluZSBTRVRfTERPX1ZPTFRBR0VfQ0JVQ0tfQlVSU1QJOAotI2RlZmluZSBTRVRfTERPX1ZPTFRBR0VfTE5MRE8xCTkKLSNkZWZpbmUgU0VUX0xET19WT0xUQUdFX0xOTERPMl9TRUwJMTAKLQotZXh0ZXJuIHUxNiBzaV9wbXVfZmFzdF9wd3J1cF9kZWxheShzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHZvaWQgc2lfcG11X3Nwcm9tX2VuYWJsZShzdHJ1Y3Qgc2lfcHViICpzaWgsIGJvb2wgZW5hYmxlKTsKLWV4dGVybiB1MzIgc2lfcG11X2NoaXBjb250cm9sKHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCByZWcsIHUzMiBtYXNrLCB1MzIgdmFsKTsKLWV4dGVybiB1MzIgc2lfcG11X3JlZ2NvbnRyb2woc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IHJlZywgdTMyIG1hc2ssIHUzMiB2YWwpOwotZXh0ZXJuIHUzMiBzaV9wbXVfaWxwX2Nsb2NrKHN0cnVjdCBzaV9wdWIgKnNpaCk7Ci1leHRlcm4gdTMyIHNpX3BtdV9hbHBfY2xvY2soc3RydWN0IHNpX3B1YiAqc2loKTsKLWV4dGVybiB2b2lkIHNpX3BtdV9wbGx1cGQoc3RydWN0IHNpX3B1YiAqc2loKTsKLWV4dGVybiB2b2lkIHNpX3BtdV9zcHVyYXZvaWQoc3RydWN0IHNpX3B1YiAqc2loLCB1OCBzcHVyYXZvaWQpOwotZXh0ZXJuIHUzMiBzaV9wbXVfcGxsY29udHJvbChzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgcmVnLCB1MzIgbWFzaywgdTMyIHZhbCk7Ci1leHRlcm4gdm9pZCBzaV9wbXVfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHZvaWQgc2lfcG11X2NoaXBfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHZvaWQgc2lfcG11X3BsbF9pbml0KHN0cnVjdCBzaV9wdWIgKnNpaCwgdTMyIHh0YWxmcmVxKTsKLWV4dGVybiB2b2lkIHNpX3BtdV9yZXNfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHZvaWQgc2lfcG11X3N3cmVnX2luaXQoc3RydWN0IHNpX3B1YiAqc2loKTsKLWV4dGVybiB1MzIgc2lfcG11X21lYXN1cmVfYWxwY2xrKHN0cnVjdCBzaV9wdWIgKnNpaCk7Ci0KLSNlbmRpZiAvKiBfQlJDTV9QTVVfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvcHViLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3B1Yi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWQ3NDYwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvcHViLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYgX0JSQ01fUFVCX0hfCi0jZGVmaW5lIF9CUkNNX1BVQl9IXwotCi0jaW5jbHVkZSA8YnJjbXVfd2lmaS5oPgotI2luY2x1ZGUgInR5cGVzLmgiCi0jaW5jbHVkZSAiZGVmcy5oIgotCi0jZGVmaW5lCUJSQ01TX05VTVJBVEVTCTE2CS8qIG1heCAjIG9mIHJhdGVzIGluIGEgcmF0ZXNldCAqLwotI2RlZmluZQlNQVhNVUxUSUxJU1QJMzIJLyogbWF4ICMgbXVsdGljYXN0IGFkZHJlc3NlcyAqLwotI2RlZmluZQlEMTFfUEhZX0hEUl9MRU4JNgkvKiBQaHkgaGVhZGVyIGxlbmd0aCAtIDYgYnl0ZXMgKi8KLQotLyogcGh5IHR5cGVzICovCi0jZGVmaW5lCVBIWV9UWVBFX0EJMAkvKiBQaHkgdHlwZSBBICovCi0jZGVmaW5lCVBIWV9UWVBFX0cJMgkvKiBQaHkgdHlwZSBHICovCi0jZGVmaW5lCVBIWV9UWVBFX04JNAkvKiBQaHkgdHlwZSBOICovCi0jZGVmaW5lCVBIWV9UWVBFX0xQCTUJLyogUGh5IHR5cGUgTG93IFBvd2VyIEEvQi9HICovCi0jZGVmaW5lCVBIWV9UWVBFX1NTTgk2CS8qIFBoeSB0eXBlIFNpbmdsZSBTdHJlYW0gTiAqLwotI2RlZmluZQlQSFlfVFlQRV9MQ04JOAkvKiBQaHkgdHlwZSBTaW5nbGUgU3RyZWFtIE4gKi8KLSNkZWZpbmUJUEhZX1RZUEVfTENOWE4JOQkvKiBQaHkgdHlwZSAyLXN0cmVhbSBOICovCi0jZGVmaW5lCVBIWV9UWVBFX0hUCTcJLyogUGh5IHR5cGUgMy1TdHJlYW0gTiAqLwotCi0vKiBidyAqLwotI2RlZmluZSBCUkNNU18xMF9NSFoJMTAJLyogMTBNaHogbnBoeSBjaGFubmVsIGJhbmR3aWR0aCAqLwotI2RlZmluZSBCUkNNU18yMF9NSFoJMjAJLyogMjBNaHogbnBoeSBjaGFubmVsIGJhbmR3aWR0aCAqLwotI2RlZmluZSBCUkNNU180MF9NSFoJNDAJLyogNDBNaHogbnBoeSBjaGFubmVsIGJhbmR3aWR0aCAqLwotCi0jZGVmaW5lIENIU1BFQ19XTENfQlcoY2hhbnNwZWMpCShDSFNQRUNfSVM0MChjaGFuc3BlYykgPyBCUkNNU180MF9NSFogOiBcCi0JCQkJIENIU1BFQ19JUzIwKGNoYW5zcGVjKSA/IEJSQ01TXzIwX01IWiA6IFwKLQkJCQkJCQkgQlJDTVNfMTBfTUhaKQotCi0jZGVmaW5lCUJSQ01TX1JTU0lfTUlOVkFMCS0yMDAJLyogTG93IHZhbHVlLCBlLmcuIGZvciBmb3JjaW5nIHJvYW0gKi8KLSNkZWZpbmUJQlJDTVNfUlNTSV9OT19TSUdOQUwJLTkxCS8qIE5ESVMgUlNTSSBsaW5rIHF1YWxpdHkgY3V0b2ZmcyAqLwotI2RlZmluZQlCUkNNU19SU1NJX1ZFUllfTE9XCS04MAkvKiBWZXJ5IGxvdyBxdWFsaXR5IGN1dG9mZnMgKi8KLSNkZWZpbmUJQlJDTVNfUlNTSV9MT1cJCS03MAkvKiBMb3cgcXVhbGl0eSBjdXRvZmZzICovCi0jZGVmaW5lCUJSQ01TX1JTU0lfR09PRAkJLTY4CS8qIEdvb2QgcXVhbGl0eSBjdXRvZmZzICovCi0jZGVmaW5lCUJSQ01TX1JTU0lfVkVSWV9HT09ECS01OAkvKiBWZXJ5IGdvb2QgcXVhbGl0eSBjdXRvZmZzICovCi0jZGVmaW5lCUJSQ01TX1JTU0lfRVhDRUxMRU5UCS01NwkvKiBFeGNlbGxlbnQgcXVhbGl0eSBjdXRvZmZzICovCi0KLS8qIG1hY3JvIHRvIHBlcmZvcm0gUEhZIC0+IEQxMSBQSFkgVFlQRSwgY3VycmVudGx5IDE6MSAqLwotI2RlZmluZSBCUkNNU19QSFlUWVBFKF94KSAoX3gpCi0KLSNkZWZpbmUgTUFfV0lORE9XX1NaCQk4CS8qIG1vdmluZyBhdmVyYWdlIHdpbmRvdyBzaXplICovCi0KLSNkZWZpbmUgQlJDTVNfU05SX0lOVkFMSUQJCTAJLyogaW52YWxpZCBTTlIgdmFsdWUgKi8KLQotLyogYSBsYXJnZSBUWCBQb3dlciBhcyBhbiBpbml0IHZhbHVlIHRvIGZhY3RvciBvdXQgb2YgbWluKCkgY2FsY3VsYXRpb25zLAotICoga2VlcCBsb3cgZW5vdWdoIHRvIGZpdCBpbiBhbiBzOCwgdW5pdHMgYXJlIC4yNSBkQm0KLSAqLwotI2RlZmluZSBCUkNNU19UWFBXUl9NQVgJCSgxMjcpCS8qIH4zMiBkQm0gPSAxLDUwMCBtVyAqLwotCi0vKiByYXRlIHJlbGF0ZWQgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUJQlJDTVNfUkFURV9GTEFHCTB4ODAJLyogRmxhZyB0byBpbmRpY2F0ZSBpdCBpcyBhIGJhc2ljIHJhdGUgKi8KLSNkZWZpbmUJQlJDTVNfUkFURV9NQVNLCTB4N2YJLyogUmF0ZSB2YWx1ZSBtYXNrIHcvbyBiYXNpYyByYXRlIGZsYWcgKi8KLQotLyogbGVnYWN5IHJ4IEFudGVubmEgZGl2ZXJzaXR5IGZvciBTSVNPIHJhdGVzICovCi0jZGVmaW5lCUFOVF9SWF9ESVZfRk9SQ0VfMAkJMAkvKiBVc2UgYW50ZW5uYSAwICovCi0jZGVmaW5lCUFOVF9SWF9ESVZfRk9SQ0VfMQkJMQkvKiBVc2UgYW50ZW5uYSAxICovCi0jZGVmaW5lCUFOVF9SWF9ESVZfU1RBUlRfMQkJMgkvKiBDaG9vc2Ugc3RhcnRpbmcgd2l0aCAxICovCi0jZGVmaW5lCUFOVF9SWF9ESVZfU1RBUlRfMAkJMwkvKiBDaG9vc2Ugc3RhcnRpbmcgd2l0aCAwICovCi0jZGVmaW5lCUFOVF9SWF9ESVZfRU5BQkxFCQkzCS8qIEFQSFkgYmJDb25maWcgRW5hYmxlIFJYIERpdmVyc2l0eSAqLwotI2RlZmluZSBBTlRfUlhfRElWX0RFRgkJQU5UX1JYX0RJVl9TVEFSVF8wCS8qIGRlZmF1bHQgYW50ZGl2IHNldHRpbmcgKi8KLQotLyogbGVnYWN5IHJ4IEFudGVubmEgZGl2ZXJzaXR5IGZvciBTSVNPIHJhdGVzICovCi0jZGVmaW5lIEFOVF9UWF9GT1JDRV8wCQkwCS8qIFR4IG9uIGFudGVubmEgMCwgImxlZ2FjeSB0ZXJtIE1haW4iICovCi0jZGVmaW5lIEFOVF9UWF9GT1JDRV8xCQkxCS8qIFR4IG9uIGFudGVubmEgMSwgImxlZ2FjeSB0ZXJtIEF1eCIgKi8KLSNkZWZpbmUgQU5UX1RYX0xBU1RfUlgJCTMJLyogVHggb24gcGh5J3MgbGFzdCBnb29kIFJ4IGFudGVubmEgKi8KLSNkZWZpbmUgQU5UX1RYX0RFRgkJCTMJLyogZHJpdmVyJ3MgZGVmYXVsdCB0eCBhbnRlbm5hIHNldHRpbmcgKi8KLQotI2RlZmluZSBUWENPUkVfUE9MSUNZX0FMTAkweDEJLyogdXNlIGFsbCBhdmFpbGFibGUgY29yZSBmb3IgdHJhbnNtaXQgKi8KLQotLyogVHggQ2hhaW4gdmFsdWVzICovCi0jZGVmaW5lIFRYQ0hBSU5fREVGCQkweDEJLyogZGVmIGJpdG1hcCBvZiB0eGNoYWluICovCi0jZGVmaW5lIFRYQ0hBSU5fREVGX05QSFkJMHgzCS8qIGRlZmF1bHQgYml0bWFwIG9mIHR4IGNoYWlucyBmb3IgbnBoeSAqLwotI2RlZmluZSBUWENIQUlOX0RFRl9IVFBIWQkweDcJLyogZGVmYXVsdCBiaXRtYXAgb2YgdHggY2hhaW5zIGZvciBucGh5ICovCi0jZGVmaW5lIFJYQ0hBSU5fREVGCQkweDEJLyogZGVmIGJpdG1hcCBvZiByeGNoYWluICovCi0jZGVmaW5lIFJYQ0hBSU5fREVGX05QSFkJMHgzCS8qIGRlZmF1bHQgYml0bWFwIG9mIHJ4IGNoYWlucyBmb3IgbnBoeSAqLwotI2RlZmluZSBSWENIQUlOX0RFRl9IVFBIWQkweDcJLyogZGVmYXVsdCBiaXRtYXAgb2YgcnggY2hhaW5zIGZvciBucGh5ICovCi0jZGVmaW5lIEFOVFNXSVRDSF9OT05FCQkwCS8qIG5vIGFudGVubmEgc3dpdGNoICovCi0jZGVmaW5lIEFOVFNXSVRDSF9UWVBFXzEJMQkvKiBhbnRlbm5hIHN3aXRjaCBvbiA0MzIxQ0IyLCAyb2YzICovCi0jZGVmaW5lIEFOVFNXSVRDSF9UWVBFXzIJMgkvKiBhbnRlbm5hIHN3aXRjaCBvbiA0MzIxTVBDSSwgMm9mMyAqLwotI2RlZmluZSBBTlRTV0lUQ0hfVFlQRV8zCTMJLyogYW50ZW5uYSBzd2l0Y2ggb24gNDMyMiwgMm9mMyAqLwotCi0jZGVmaW5lIFJYQlVGU1oJCVBLVEJVRlNaCi0jaWZuZGVmIEFJRE1BUFNaCi0jZGVmaW5lIEFJRE1BUFNaCShyb3VuZHVwKE1BWFNDQiwgTkJCWSkvTkJCWSkJLyogYWlkIGJpdG1hcCBzaXplIGluIGJ5dGVzICovCi0jZW5kaWYJCQkJLyogQUlETUFQU1ogKi8KLQotI2RlZmluZSBNQVhfU1RSRUFNU19TVVBQT1JURUQJNAkvKiBtYXggbnVtYmVyIG9mIHN0cmVhbXMgc3VwcG9ydGVkICovCi0KLSNkZWZpbmUJV0xfU1BVUkFWT0lEX09GRgkwCi0jZGVmaW5lCVdMX1NQVVJBVk9JRF9PTjEJMQotI2RlZmluZQlXTF9TUFVSQVZPSURfT04yCTIKLQotc3RydWN0IGJyY21zX3R1bmFibGVzIHsKLQlpbnQgbnR4ZDsJCS8qIHNpemUgb2YgdHggZGVzY3JpcHRvciB0YWJsZSAqLwotCWludCBucnhkOwkJLyogc2l6ZSBvZiByeCBkZXNjcmlwdG9yIHRhYmxlICovCi0JaW50IHJ4YnVmc3o7CQkvKiBzaXplIG9mIHJ4IGJ1ZmZlcnMgdG8gcG9zdCAqLwotCWludCBucnhidWZwb3N0OwkJLyogIyBvZiByeCBidWZmZXJzIHRvIHBvc3QgKi8KLQlpbnQgbWF4c2NiOwkJLyogIyBvZiBTQ0JzIHN1cHBvcnRlZCAqLwotCWludCBhbXBkdW51bW1wZHU7CS8qIG1heCBudW1iZXIgb2YgbXBkdSBpbiBhbiBhbXBkdSAqLwotCWludCBtYXhwa3RjYjsJCS8qIG1heCAjIG9mIHBhY2tldCBjYWxsYmFja3MgKi8KLQlpbnQgbWF4dWNvZGVic3M7CS8qIG1heCAjIG9mIEJTUyBoYW5kbGVkIGluIHVjb2RlIGJjbi9wcmIgKi8KLQlpbnQgbWF4dWNvZGVic3M0OwkvKiBtYXggIyBvZiBCU1MgaGFuZGxlZCBpbiBzdyBiY24vcHJiICovCi0JaW50IG1heGJzczsJCS8qIG1heCAjIG9mIGJzcyBpbmZvIGVsZW1lbnRzIGluIHNjYW4gbGlzdCAqLwotCWludCBkYXRhaGl3YXQ7CQkvKiBkYXRhIG1zZyB0eHEgaGl3YXQgbWFyayAqLwotCWludCBhbXBkdWRhdGFoaXdhdDsJLyogQU1QRFUgbXNnIHR4cSBoaXdhdCBtYXJrICovCi0JaW50IHJ4Ym5kOwkJLyogbWF4ICMgb2YgcnggYnVmcyB0byBwcm9jZXNzIGJlZm9yZSBkZWZlcnJpbmcgdG8gZHBjICovCi0JaW50IHR4c2JuZDsJCS8qIG1heCAjIHR4IHN0YXR1cyB0byBwcm9jZXNzIGluIHdsY190eHN0YXR1cygpICovCi0JaW50IG1lbXJlc2VydmVkOwkvKiBtZW1vcnkgcmVzZXJ2ZWQgZm9yIEJNQUMncyBVU0IgZG1hIHJ4ICovCi19OwotCi1zdHJ1Y3QgYnJjbXNfcmF0ZXNldCB7Ci0JdWludCBjb3VudDsJCS8qIG51bWJlciBvZiByYXRlcyBpbiByYXRlc1tdICovCi0JIC8qIHJhdGVzIGluIDUwMGticHMgdW5pdHMgdy9oaSBiaXQgc2V0IGlmIGJhc2ljICovCi0JdTggcmF0ZXNbQlJDTVNfTlVNUkFURVNdOwotCXU4IGh0cGh5X21lbWJlcnNoaXA7CS8qIEhUIFBIWSBNZW1iZXJzaGlwICovCi0JdTggbWNzW01DU1NFVF9MRU5dOwkvKiBzdXBwb3J0ZWQgbWNzIGluZGV4IGJpdCBtYXAgKi8KLX07Ci0KLXN0cnVjdCByc25fcGFybXMgewotCXU4IGZsYWdzOwkJLyogbWlzYyBib29sZWFucyAoZS5nLiwgc3VwcG9ydGVkKSAqLwotCXU4IG11bHRpY2FzdDsJLyogbXVsdGljYXN0IGNpcGhlciAqLwotCXU4IHVjb3VudDsJCS8qIGNvdW50IG9mIHVuaWNhc3QgY2lwaGVycyAqLwotCXU4IHVuaWNhc3RbNF07CS8qIHVuaWNhc3QgY2lwaGVycyAqLwotCXU4IGFjb3VudDsJCS8qIGNvdW50IG9mIGF1dGggbW9kZXMgKi8KLQl1OCBhdXRoWzRdOwkJLyogQXV0aGVudGljYXRpb24gbW9kZXMgKi8KLQl1OCBQQURbNF07CQkvKiBwYWRkaW5nIGZvciBmdXR1cmUgZ3Jvd3RoICovCi19OwotCi0vKgotICogMzIgU1NJRCBjaGFycywgbWF4IG9mIDQgY2hhcnMgZm9yIGVhY2ggU1NJRCBjaGFyICJceEZGIiwgcGx1cyBOVUxMLgotICovCi0jZGVmaW5lIFNTSURfRk1UX0JVRl9MRU4JKCg0ICogSUVFRTgwMjExX01BWF9TU0lEX0xFTikgKyAxKQotCi0jZGVmaW5lIFJTTl9GTEFHU19TVVBQT1JURUQJCTB4MQkvKiBGbGFnIGZvciByc25fcGFyYW1zICovCi0jZGVmaW5lIFJTTl9GTEFHU19QUkVBVVRICQkweDIJLyogRmxhZyBmb3IgV1BBMiByc25fcGFyYW1zICovCi0KLS8qIEFsbCB0aGUgSFQtc3BlY2lmaWMgZGVmYXVsdCBhZHZlcnRpc2VkIGNhcGFiaWxpdGllcyAoaW5jbHVkaW5nIEFNUERVKQotICogc2hvdWxkIGJlIGdyb3VwZWQgaGVyZSBhdCBvbmUgcGxhY2UKLSAqLwotI2RlZmluZSBBTVBEVV9ERUZfTVBEVV9ERU5TSVRZCTYJLyogZGVmYXVsdCBtcGR1IGRlbnNpdHkgKDExMCA9PT4gNHVzKSAqLwotCi0vKiBkZWZhdWx0cyBmb3IgdGhlIEhUIChNSU1PKSBic3MgKi8KLSNkZWZpbmUgSFRfQ0FQCShJRUVFODAyMTFfSFRfQ0FQX1NNX1BTIHxcCi0JSUVFRTgwMjExX0hUX0NBUF9TVVBfV0lEVEhfMjBfNDAgfCBJRUVFODAyMTFfSFRfQ0FQX0dSTl9GTEQgfFwKLQlJRUVFODAyMTFfSFRfQ0FQX01BWF9BTVNEVSB8IElFRUU4MDIxMV9IVF9DQVBfRFNTU0NDSzQwKQotCi0vKiB3bGMgaW50ZXJuYWwgYnNzX2luZm8gKi8KLXN0cnVjdCBicmNtc19ic3NfaW5mbyB7Ci0JdTggQlNTSURbRVRIX0FMRU5dOwkvKiBuZXR3b3JrIEJTU0lEICovCi0JdTE2IGZsYWdzOwkJLyogZmxhZ3MgZm9yIGludGVybmFsIGF0dHJpYnV0ZXMgKi8KLQl1OCBTU0lEX2xlbjsJCS8qIHRoZSBsZW5ndGggb2YgU1NJRCAqLwotCXU4IFNTSURbMzJdOwkJLyogU1NJRCBzdHJpbmcgKi8KLQlzMTYgUlNTSTsJCS8qIHJlY2VpdmUgc2lnbmFsIHN0cmVuZ3RoIChpbiBkQm0pICovCi0JczE2IFNOUjsJCS8qIHJlY2VpdmUgc2lnbmFsIFNOUiBpbiBkQiAqLwotCXUxNiBiZWFjb25fcGVyaW9kOwkvKiB1bml0cyBhcmUgS3VzZWMgKi8KLQl1MTYgYXRpbV93aW5kb3c7CS8qIHVuaXRzIGFyZSBLdXNlYyAqLwotCWNoYW5zcGVjX3QgY2hhbnNwZWM7CS8qIENoYW5uZWwgbnVtLCBidywgY3RybF9zYiBhbmQgYmFuZCAqLwotCXM4IGluZnJhOwkJLyogMD1JQlNTLCAxPWluZnJhc3RydWN0dXJlLCAyPXVua25vd24gKi8KLQl3bGNfcmF0ZXNldF90IHJhdGVzZXQ7CS8qIHN1cHBvcnRlZCByYXRlcyAqLwotCXU4IGR0aW1fcGVyaW9kOwkvKiBEVElNIHBlcmlvZCAqLwotCXM4IHBoeV9ub2lzZTsJCS8qIG5vaXNlIHJpZ2h0IGFmdGVyIHR4IChpbiBkQm0pICovCi0JdTE2IGNhcGFiaWxpdHk7CS8qIENhcGFiaWxpdHkgaW5mb3JtYXRpb24gKi8KLQl1OCB3bWVfcW9zaW5mbzsJLyogUW9TIEluZm8gZnJvbSBXTUUgSUU7IHZhbGlkIGlmIEJTU19XTUUgZmxhZyBzZXQgKi8KLQlzdHJ1Y3QgcnNuX3Bhcm1zIHdwYTsKLQlzdHJ1Y3QgcnNuX3Bhcm1zIHdwYTI7Ci0JdTE2IHFic3NfbG9hZF9hYWM7CS8qIHFic3MgbG9hZCBhdmFpbGFibGUgYWRtaXNzaW9uIGNhcGFjaXR5ICovCi0JLyogcWJzc19sb2FkX2NoYW5fZnJlZSA8LSAoMHhmZiAtIGNoYW5uZWxfdXRpbGl6YXRpb24gb2YgcWJzc19sb2FkX2llX3QpICovCi0JdTggcWJzc19sb2FkX2NoYW5fZnJlZTsJLyogaW5kaWNhdGVzIGhvdyBmcmVlIHRoZSBjaGFubmVsIGlzICovCi0JdTggbWNpcGhlcjsJCS8qIG11bHRpY2FzdCBjaXBoZXIgKi8KLQl1OCB3cGFjZmc7CQkvKiB3cGEgY29uZmlnIGluZGV4ICovCi19OwotCi0vKiBJT1ZhciBmbGFncyBmb3IgY29tbW9uIGVycm9yIGNoZWNrcyAqLwotI2RlZmluZSBJT1ZGX01GRwkoMTw8MykJLyogZmxhZyBmb3IgbWZndGVzdCBpb3ZhcnMgKi8KLSNkZWZpbmUgSU9WRl9XSEwJKDE8PDQpCS8qIHZhbHVlIG11c3QgYmUgd2hvbGUgKDAtbWF4KSAqLwotI2RlZmluZSBJT1ZGX05UUkwJKDE8PDUpCS8qIHZhbHVlIG11c3QgYmUgbmF0dXJhbCAoMS1tYXgpICovCi0KLSNkZWZpbmUgSU9WRl9TRVRfVVAJKDE8PDYpCS8qIHNldCByZXF1aXJlcyBkcml2ZXIgYmUgdXAgKi8KLSNkZWZpbmUgSU9WRl9TRVRfRE9XTgkoMTw8NykJLyogc2V0IHJlcXVpcmVzIGRyaXZlciBiZSBkb3duICovCi0jZGVmaW5lIElPVkZfU0VUX0NMSwkoMTw8OCkJLyogc2V0IHJlcXVpcmVzIGNvcmUgY2xvY2sgKi8KLSNkZWZpbmUgSU9WRl9TRVRfQkFORAkoMTw8OSkJLyogc2V0IHJlcXVpcmVzIGZpeGVkIGJhbmQgKi8KLQotI2RlZmluZSBJT1ZGX0dFVF9VUAkoMTw8MTApCS8qIGdldCByZXF1aXJlcyBkcml2ZXIgYmUgdXAgKi8KLSNkZWZpbmUgSU9WRl9HRVRfRE9XTgkoMTw8MTEpCS8qIGdldCByZXF1aXJlcyBkcml2ZXIgYmUgZG93biAqLwotI2RlZmluZSBJT1ZGX0dFVF9DTEsJKDE8PDEyKQkvKiBnZXQgcmVxdWlyZXMgY29yZSBjbG9jayAqLwotI2RlZmluZSBJT1ZGX0dFVF9CQU5ECSgxPDwxMykJLyogZ2V0IHJlcXVpcmVzIGZpeGVkIGJhbmQgKi8KLSNkZWZpbmUgSU9WRl9PUEVOX0FMTE9XCSgxPDwxNCkJLyogc2V0IGFsbG93ZWQgaW92YXIgZm9yIG9wZW5zcmMgKi8KLQotLyogd2F0Y2hkb2cgZG93biBhbmQgZHVtcCBjYWxsYmFjayBmdW5jdGlvbiBwcm90bydzICovCi10eXBlZGVmIGludCAoKndhdGNoZG9nX2ZuX3QpICh2b2lkICpoYW5kbGUpOwotdHlwZWRlZiBpbnQgKCpkb3duX2ZuX3QpICh2b2lkICpoYW5kbGUpOwotdHlwZWRlZiBpbnQgKCpkdW1wX2ZuX3QpICh2b2lkICpoYW5kbGUsIHN0cnVjdCBicmNtdV9zdHJidWYgKmIpOwotCi0vKiBJT1ZhciBoYW5kbGVyCi0gKgotICogaGFuZGxlIC0gYSBwb2ludGVyIHZhbHVlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZnVuY3Rpb24KLSAqIHZpIC0gaW92YXJfaW5mbyB0aGF0IHdhcyBsb29rZWQgdXAKLSAqIGFjdGlvbmlkIC0gYWN0aW9uIElELCBjYWxjdWxhdGVkIGJ5IElPVl9HVkFMKCkgYW5kIElPVl9TVkFMKCkgYmFzZWQgb24gdmFyaWQuCi0gKiBuYW1lIC0gdGhlIGFjdHVhbCBpb3ZhciBuYW1lCi0gKiBwYXJhbXMvcGxlbiAtIHBhcmFtZXRlcnMgYW5kIGxlbmd0aCBmb3IgYSBnZXQsIGlucHV0IG9ubHkuCi0gKiBhcmcvbGVuIC0gYnVmZmVyIGFuZCBsZW5ndGggZm9yIHZhbHVlIHRvIGJlIHNldCBvciByZXRyaWV2ZWQsIGlucHV0IG9yIG91dHB1dC4KLSAqIHZzaXplIC0gdmFsdWUgc2l6ZSwgdmFsaWQgZm9yIGludGVnZXIgdHlwZSBvbmx5LgotICogd2xjaWYgLSBpbnRlcmZhY2UgY29udGV4dCAoYnJjbXNfY19pZiBwb2ludGVyKQotICoKLSAqIEFsbCBwb2ludGVycyBtYXkgcG9pbnQgaW50byB0aGUgc2FtZSBidWZmZXIuCi0gKi8KLXR5cGVkZWYgaW50ICgqaW92YXJfZm5fdCkgKHZvaWQgKmhhbmRsZSwgY29uc3Qgc3RydWN0IGJyY211X2lvdmFyICp2aSwKLQkJCSAgIHUzMiBhY3Rpb25pZCwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqcGFyYW1zLAotCQkJICAgdWludCBwbGVuLCB2b2lkICphcmcsIGludCBhbGVuLCBpbnQgdnNpemUsCi0JCQkgICBzdHJ1Y3QgYnJjbXNfY19pZiAqd2xjaWYpOwotCi0jZGVmaW5lIE1BQzgwMjExX1BST01JU0NfQkNOUwkoMSA8PCAwKQotI2RlZmluZSBNQUM4MDIxMV9TQ0FOCQkoMSA8PCAxKQotCi0vKgotICogUHVibGljIHBvcnRpb24gb2YgImNvbW1vbiIgb3MtaW5kZXBlbmRlbnQgc3RhdGUgc3RydWN0dXJlLgotICogVGhlIHdsYyBoYW5kbGUgcG9pbnRzIGF0IHRoaXMuCi0gKi8KLXN0cnVjdCBicmNtc19wdWIgewotCXZvaWQgKndsYzsKLQotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmllZWVfaHc7Ci0Jc3RydWN0IHNjYiAqZ2xvYmFsX3NjYjsKLQlzdHJ1Y3Qgc2NiX2FtcGR1ICpnbG9iYWxfYW1wZHU7Ci0JdWludCBtYWM4MDIxMV9zdGF0ZTsKLQl1aW50IHVuaXQ7CQkvKiBkZXZpY2UgaW5zdGFuY2UgbnVtYmVyICovCi0JdWludCBjb3JlcmV2OwkJLyogY29yZSByZXZpc2lvbiAqLwotCXN0cnVjdCBzaV9wdWIgKnNpaDsJLyogU0kgaGFuZGxlIChjb29raWUgZm9yIHNpdXRpbHMgY2FsbHMpICovCi0JY2hhciAqdmFyczsJCS8qICJlbnZpcm9ubWVudCIgbmFtZT12YWx1ZSAqLwotCWJvb2wgdXA7CQkvKiBpbnRlcmZhY2UgdXAgYW5kIHJ1bm5pbmcgKi8KLQlib29sIGh3X29mZjsJCS8qIEhXIGlzIG9mZiAqLwotCS8qIHR1bmFibGVzOiBudHhkLCBucnhkLCBtYXhzY2IsIGV0Yy4gKi8KLQlzdHJ1Y3QgYnJjbXNfdHVuYWJsZXMgKnR1bmFibGVzOwotCWJvb2wgaHdfdXA7CQkvKiBvbmUgdGltZSBodyB1cC9kb3duKGZyb20gYm9vdCBvciBoaWJlcm5hdGlvbikgKi8KLQlib29sIF9waW9tb2RlOwkJLyogdHJ1ZSBpZiBwaW8gbW9kZSAqLy8qIEJNQUNfTk9URTogTkVFRCBJbiBib3RoICovCi0JdWludCBfbmJhbmRzOwkJLyogIyBiYW5kcyBzdXBwb3J0ZWQgKi8KLQl1aW50IG5vdzsJCS8qICMgZWxhcHNlZCBzZWNvbmRzICovCi0KLQlib29sIHByb21pc2M7CQkvKiBwcm9taXNjdW91cyBkZXN0aW5hdGlvbiBhZGRyZXNzICovCi0JYm9vbCBkZWxheWVkX2Rvd247CS8qIGRvd24gZGVsYXllZCAqLwotCWJvb2wgX2FwOwkJLyogQVAgbW9kZSBlbmFibGVkICovCi0JYm9vbCBfYXBzdGE7CQkvKiBzaW11bHRhbmVvdXMgQVAvU1RBIG1vZGUgZW5hYmxlZCAqLwotCWJvb2wgX2Fzc29jX3JlY3JlYXRlOwkvKiBhc3NvY2lhdGlvbiByZWNyZWF0aW9uIG9uIHVwIHRyYW5zaXRpb25zICovCi0JaW50IF93bWU7CQkvKiBXTUUgUW9TIG1vZGUgKi8KLQl1OCBfbWJzczsJCS8qIE1CU1MgbW9kZSBvbiAqLwotCWJvb2wgYWxsbXVsdGk7CQkvKiBlbmFibGUgYWxsIG11bHRpY2FzdHMgKi8KLQlib29sIGFzc29jaWF0ZWQ7CS8qIHRydWU6cGFydCBvZiBbSV1CU1MsIGZhbHNlOiBub3QgKi8KLQkvKiAodW5pb24gb2Ygc3Rhc19hc3NvY2lhdGVkLCBhcHNfYXNzb2NpYXRlZCkgKi8KLQlib29sIHBoeXRlc3Rfb247CS8qIHdoZXRoZXIgYSBQSFkgdGVzdCBpcyBydW5uaW5nICovCi0JYm9vbCBiZl9wcmVlbXB0XzQzMDY7CS8qIFRydWUgdG8gZW5hYmxlICdkYXJ3aW4nIG1vZGUgKi8KLQlib29sIF9hbXBkdTsJCS8qIGFtcGR1IGVuYWJsZWQgb3Igbm90ICovCi0JYm9vbCBfY2FjOwkJLyogODAyLjExZSBDQUMgZW5hYmxlZCAqLwotCXU4IF9uX2VuYWI7CQkvKiBiaXRtYXAgb2YgMTFOICsgSFQgc3VwcG9ydCAqLwotCWJvb2wgX25fcmVxZDsJCS8qIE4gc3VwcG9ydCByZXF1aXJlZCBmb3IgY2xpZW50cyAqLwotCi0JczggX2NvZXg7CQkvKiAyMC80MCBNSHogQlNTIE1hbmFnZW1lbnQgQVVUTywgRU5BQiwgRElTQUJMRSAqLwotCWJvb2wgX3ByaW9mYzsJCS8qIFByaW9yaXR5LWJhc2VkIGZsb3djb250cm9sICovCi0KLQl1OCBjdXJfZXRoZXJhZGRyW0VUSF9BTEVOXTsJLyogb3VyIGxvY2FsIGV0aGVybmV0IGFkZHJlc3MgKi8KLQotCXU4ICptdWx0aWNhc3Q7CS8qIHB0ciB0byBsaXN0IG9mIG11bHRpY2FzdCBhZGRyZXNzZXMgKi8KLQl1aW50IG5tdWx0aWNhc3Q7CS8qICMgZW5hYmxlZCBtdWx0aWNhc3QgYWRkcmVzc2VzICovCi0KLQl1MzIgd2xmZWF0dXJlZmxhZzsJLyogRmxhZ3MgdG8gY29udHJvbCBzdyBmZWF0dXJlcyBmcm9tIHJlZ2lzdHJ5ICovCi0JaW50IHBzcV9wa3RzX3RvdGFsOwkvKiB0b3RhbCBudW0gb2YgcHMgcGt0cyAqLwotCi0JdTE2IHR4bWF4cGt0czsJLyogbWF4IG51bWJlciBvZiBsYXJnZSBwa3RzIGFsbG93ZWQgdG8gYmUgcGVuZGluZyAqLwotCi0JLyogcy93IGRlY3J5cHRpb24gY291bnRlcnMgKi8KLQl1MzIgc3dkZWNyeXB0OwkvKiBzL3cgZGVjcnlwdCBhdHRlbXB0cyAqLwotCi0JaW50IGJjbWVycm9yOwkJLyogbGFzdCBiY20gZXJyb3IgKi8KLQotCW1ib29sIHJhZGlvX2Rpc2FibGVkOwkvKiBiaXQgdmVjdG9yIGZvciByYWRpbyBkaXNhYmxlZCByZWFzb25zICovCi0JYm9vbCByYWRpb19hY3RpdmU7CS8qIHJhZGlvIG9uL29mZiBzdGF0ZSAqLwotCXUxNiByb2FtX3RpbWVfdGhyZXNoOwkvKiBNYXguICMgc2Vjcy4gb2Ygbm90IGhlYXJpbmcgYmVhY29ucwotCQkJCQkgKiBiZWZvcmUgcm9hbWluZy4KLQkJCQkJICovCi0JYm9vbCBhbGlnbl93ZF90YnR0OwkvKiBBbGlnbiB3YXRjaGRvZyB3aXRoIHRidHQgaW5kaWNhdGlvbgotCQkJCSAqIGhhbmRsaW5nLiBUaGlzIGZsYWcgaXMgY2xlYXJlZCBieSBkZWZhdWx0Ci0JCQkJICogYW5kIGlzIHNldCBieSBwZXIgcG9ydCBjb2RlIGV4cGxpY2l0bHkgYW5kCi0JCQkJICogeW91IG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBPU0xfU1lTVVBUSU1FKCkKLQkJCQkgKiBpcyBpbXBsZW1lbnRlZCBwcm9wZXJseSBpbiBvc2wgb2YgdGhhdCBwb3J0Ci0JCQkJICogd2hlbiBpdCBlbmFibGVzIHRoaXMgUG93ZXIgU2F2ZSBmZWF0dXJlLgotCQkJCSAqLwotCi0JdTE2IGJvYXJkcmV2OwkvKiB2ZXJzaW9uICMgb2YgcGFydGljdWxhciBib2FyZCAqLwotCXU4IHNyb21yZXY7CQkvKiB2ZXJzaW9uICMgb2YgdGhlIHNyb20gKi8KLQljaGFyIHNyb21fY2NvZGVbQlJDTV9DTlRSWV9CVUZfU1pdOwkvKiBDb3VudHJ5IENvZGUgaW4gU1JPTSAqLwotCXUzMiBib2FyZGZsYWdzOwkvKiBCb2FyZCBzcGVjaWZpYyBmbGFncyBmcm9tIHNyb20gKi8KLQl1MzIgYm9hcmRmbGFnczI7CS8qIE1vcmUgYm9hcmQgZmxhZ3MgaWYgc3JvbXJldiA+PSA0ICovCi0JYm9vbCB0ZW1wc2Vuc2VfZGlzYWJsZTsJLyogZGlzYWJsZSBwZXJpb2RpYyB0ZW1wc2Vuc2UgY2hlY2sgKi8KLQlib29sIHBoeV8xMW5jYXBhYmxlOwkvKiB0aGUgUEhZL0hXIGlzIGNhcGFibGUgb2YgODAyLjExTiAqLwotCWJvb2wgX2FtcGR1bWFjOwkJLyogbWFjIGFzc2lzdCBhbXBkdSBlbmFibGVkIG9yIG5vdCAqLwotCi0Jc3RydWN0IHdsX2NudCAqX2NudDsJLyogbG93LWxldmVsIGNvdW50ZXJzIGluIGRyaXZlciAqLwotfTsKLQotLyogd2xfbW9uaXRvciByeCBzdGF0dXMgcGVyIHBhY2tldCAqLwotc3RydWN0IHdsX3J4c3RzIHsKLQl1aW50IHBrdGVycm9yOwkJLyogZXJyb3IgZmxhZ3MgcGVyIHBrdCAqLwotCXVpbnQgcGh5dHlwZTsJCS8qIDgwMi4xMSBBL0IvRyAuLi4gKi8KLQl1aW50IGNoYW5uZWw7CQkvKiBjaGFubmVsICovCi0JdWludCBkYXRhcmF0ZTsJCS8qIHJhdGUgaW4gNTAwa2JwcyAqLwotCXVpbnQgYW50ZW5uYTsJCS8qIGFudGVubmEgcGt0cyByZWNlaXZlZCBvbiAqLwotCXVpbnQgcGt0bGVuZ3RoOwkJLyogcGt0IGxlbmd0aCBtaW51cyBiY20gcGh5IGhkciAqLwotCXUzMiBtYWN0aW1lOwkJLyogdGltZSBzdGFtcCBmcm9tIG1hYywgY291bnQgcGVyIDF1cyAqLwotCXVpbnQgc3E7CQkvKiBzaWduYWwgcXVhbGl0eSAqLwotCXMzMiBzaWduYWw7CQkvKiBpbiBkYm0gKi8KLQlzMzIgbm9pc2U7CQkvKiBpbiBkYm0gKi8KLQl1aW50IHByZWFtYmxlOwkJLyogVW5rbm93biwgc2hvcnQsIGxvbmcgKi8KLQl1aW50IGVuY29kaW5nOwkJLyogVW5rbm93biwgQ0NLLCBQQkNDLCBPRkRNICovCi0JdWludCBuZnJtdHlwZTsJCS8qIHNwZWNpYWwgODAyLjExbiBmcmFtZXMoQU1QRFUsIEFNU0RVKSAqLwotCXN0cnVjdCBicmNtc19pZiAqd2xpZjsJLyogd2wgaW50ZXJmYWNlICovCi19OwotCi0vKiBzdGF0dXMgcGVyIGVycm9yIFJYIHBrdCAqLwotI2RlZmluZSBXTF9SWFNfQ1JDX0VSUk9SCQkweDAwMDAwMDAxCS8qIENSQyBFcnJvciBpbiBwYWNrZXQgKi8KLSNkZWZpbmUgV0xfUlhTX1JVTlRfRVJST1IJCTB4MDAwMDAwMDIJLyogUnVudCBwYWNrZXQgKi8KLSNkZWZpbmUgV0xfUlhTX0FMSUdOX0VSUk9SCQkweDAwMDAwMDA0CS8qIE1pc2FsaWduZWQgcGFja2V0ICovCi0jZGVmaW5lIFdMX1JYU19PVkVSU0laRV9FUlJPUgkJMHgwMDAwMDAwOAkvKiBwYWNrZXQgYmlnZ2VyIHRoYW4gUlhfTEVOR1RIICh1c3VhbGx5IDE1MTgpICovCi0jZGVmaW5lIFdMX1JYU19XRVBfSUNWX0VSUk9SCQkweDAwMDAwMDEwCS8qIEludGVncml0eSBDaGVjayBWYWx1ZSBlcnJvciAqLwotI2RlZmluZSBXTF9SWFNfV0VQX0VOQ1JZUFRFRAkJMHgwMDAwMDAyMAkvKiBFbmNyeXB0ZWQgd2l0aCBXRVAgKi8KLSNkZWZpbmUgV0xfUlhTX1BMQ1BfU0hPUlQJCTB4MDAwMDAwNDAJLyogU2hvcnQgUExDUCBlcnJvciAqLwotI2RlZmluZSBXTF9SWFNfREVDUllQVF9FUlIJCTB4MDAwMDAwODAJLyogRGVjcnlwdGlvbiBlcnJvciAqLwotI2RlZmluZSBXTF9SWFNfT1RIRVJfRVJSCQkweDgwMDAwMDAwCS8qIE90aGVyIGVycm9ycyAqLwotCi0vKiBwaHkgdHlwZSAqLwotI2RlZmluZSBXTF9SWFNfUEhZX0EJCQkweDAwMDAwMDAwCS8qIEEgcGh5IHR5cGUgKi8KLSNkZWZpbmUgV0xfUlhTX1BIWV9CCQkJMHgwMDAwMDAwMQkvKiBCIHBoeSB0eXBlICovCi0jZGVmaW5lIFdMX1JYU19QSFlfRwkJCTB4MDAwMDAwMDIJLyogRyBwaHkgdHlwZSAqLwotI2RlZmluZSBXTF9SWFNfUEhZX04JCQkweDAwMDAwMDA0CS8qIE4gcGh5IHR5cGUgKi8KLQotLyogZW5jb2RpbmcgKi8KLSNkZWZpbmUgV0xfUlhTX0VOQ09ESU5HX0NDSwkJMHgwMDAwMDAwMAkvKiBDQ0sgZW5jb2RpbmcgKi8KLSNkZWZpbmUgV0xfUlhTX0VOQ09ESU5HX09GRE0JCTB4MDAwMDAwMDEJLyogT0ZETSBlbmNvZGluZyAqLwotCi0vKiBwcmVhbWJsZSAqLwotI2RlZmluZSBXTF9SWFNfVU5VU0VEX1NUVUIJCTB4MAkvKiBzdHViIHRvIG1hdGNoIHdpdGggd2xjX2V0aGVyZWFsLmggKi8KLSNkZWZpbmUgV0xfUlhTX1BSRUFNQkxFX1NIT1JUCQkweDAwMDAwMDAxCS8qIFNob3J0IHByZWFtYmxlICovCi0jZGVmaW5lIFdMX1JYU19QUkVBTUJMRV9MT05HCQkweDAwMDAwMDAyCS8qIExvbmcgcHJlYW1ibGUgKi8KLSNkZWZpbmUgV0xfUlhTX1BSRUFNQkxFX01JTU9fTU0JCTB4MDAwMDAwMDMJLyogTUlNTyBtaXhlZCBtb2RlIHByZWFtYmxlICovCi0jZGVmaW5lIFdMX1JYU19QUkVBTUJMRV9NSU1PX0dGCQkweDAwMDAwMDA0CS8qIE1JTU8gZ3JlZW4gZmllbGQgcHJlYW1ibGUgKi8KLQotI2RlZmluZSBXTF9SWFNfTkZSTV9BTVBEVV9GSVJTVAkJMHgwMDAwMDAwMQkvKiBmaXJzdCBNUERVIGluIEEtTVBEVSAqLwotI2RlZmluZSBXTF9SWFNfTkZSTV9BTVBEVV9TVUIJCTB4MDAwMDAwMDIJLyogc3Vic2VxdWVudCBNUERVKHMpIGluIEEtTVBEVSAqLwotI2RlZmluZSBXTF9SWFNfTkZSTV9BTVNEVV9GSVJTVAkJMHgwMDAwMDAwNAkvKiBmaXJzdCBNU0RVIGluIEEtTVNEVSAqLwotI2RlZmluZSBXTF9SWFNfTkZSTV9BTVNEVV9TVUIJCTB4MDAwMDAwMDgJLyogc3Vic2VxdWVudCBNU0RVKHMpIGluIEEtTVNEVSAqLwotCi1lbnVtIHdsY19wYXJfaWQgewotCUlPVl9NUEMgPSAxLAotCUlPVl9SVFNUSFJFU0gsCi0JSU9WX1FUWFBPV0VSLAotCUlPVl9CQ05fTElfQkNOCQkvKiBCZWFjb24gbGlzdGVuIGludGVydmFsIGluICMgb2YgYmVhY29ucyAqLwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGZWF0dXJlLXJlbGF0ZWQgbWFjcm9zIHRvIG9wdGltaXplIG91dCBjb2RlICoKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qIEFQIFN1cHBvcnQgKHZlcnN1cyBTVEEpICovCi0jZGVmaW5lCUFQX0VOQUIocHViKQkoMCkKLQotLyogTWFjcm8gdG8gY2hlY2sgaWYgQVBTVEEgbW9kZSBlbmFibGVkICovCi0jZGVmaW5lIEFQU1RBX0VOQUIocHViKQkoMCkKLQotLyogU29tZSB1c2VmdWwgY29tYmluYXRpb25zICovCi0jZGVmaW5lIFNUQV9PTkxZKHB1YikJKCFBUF9FTkFCKHB1YikpCi0jZGVmaW5lIEFQX09OTFkocHViKQkoQVBfRU5BQihwdWIpICYmICFBUFNUQV9FTkFCKHB1YikpCi0KLSNkZWZpbmUgRU5BQl8xeDEJMHgwMQotI2RlZmluZSBFTkFCXzJ4MgkweDAyCi0jZGVmaW5lIEVOQUJfM3gzCTB4MDQKLSNkZWZpbmUgRU5BQl80eDQJMHgwOAotI2RlZmluZSBTVVBQT1JUXzExTgkoRU5BQl8xeDF8RU5BQl8yeDIpCi0jZGVmaW5lIFNVUFBPUlRfSFQJKEVOQUJfMXgxfEVOQUJfMngyfEVOQUJfM3gzKQotLyogV0wxMU4gU3VwcG9ydCAqLwotI2lmICgoZGVmaW5lZChOQ09ORikgJiYgKE5DT05GICE9IDApKSB8fCAoZGVmaW5lZChMQ05DT05GKSAmJiAoTENOQ09ORiAhPSAwKSkgfHwgXAotCShkZWZpbmVkKEhUQ09ORikgJiYgKEhUQ09ORiAhPSAwKSkgfHwgKGRlZmluZWQoU1NMUE5DT05GKSAmJiAoU1NMUE5DT05GICE9IDApKSkKLSNkZWZpbmUgTl9FTkFCKHB1YikgKChwdWIpLT5fbl9lbmFiICYgU1VQUE9SVF8xMU4pCi0jZGVmaW5lIE5fUkVRRChwdWIpICgocHViKS0+X25fcmVxZCkKLSNlbHNlCi0jZGVmaW5lIE5fRU5BQihwdWIpCTAKLSNkZWZpbmUgTl9SRVFEKHB1YikJMAotI2VuZGlmCi0KLSNpZiAoZGVmaW5lZChIVENPTkYpICYmIChIVENPTkYgIT0gMCkpCi0jZGVmaW5lIEhUX0VOQUIocHViKSAoKChwdWIpLT5fbl9lbmFiICYgU1VQUE9SVF9IVCkgPT0gU1VQUE9SVF9IVCkKLSNlbHNlCi0jZGVmaW5lIEhUX0VOQUIocHViKSAwCi0jZW5kaWYKLQotI2RlZmluZSBBTVBEVV9BR0dfSE9TVAkxCi0jZGVmaW5lIEFNUERVX0VOQUIocHViKSAoKHB1YiktPl9hbXBkdSkKLQotI2RlZmluZSBFRENGX0VOQUIocHViKSAoV01FX0VOQUIocHViKSkKLSNkZWZpbmUgUU9TX0VOQUIocHViKSAoV01FX0VOQUIocHViKSB8fCBOX0VOQUIocHViKSkKLQotI2RlZmluZSBNT05JVE9SX0VOQUIod2xjKQkoKHdsYyktPm1vbml0b3IpCi0KLSNkZWZpbmUgUFJPTUlTQ19FTkFCKHdsYykJKCh3bGMpLT5wcm9taXNjKQotCi0jZGVmaW5lCUJSQ01TX1BSRUNfQ09VTlQJMTYJLyogTWF4IHByZWNlZGVuY2UgbGV2ZWwgaW1wbGVtZW50ZWQgKi8KLQotLyogcHJpIGlzIHByaW9yaXR5IGVuY29kZWQgaW4gdGhlIHBhY2tldC4gVGhpcyBtYXBzIHRoZSBQYWNrZXQgcHJpb3JpdHkgdG8KLSAqIGVucXVldWUgcHJlY2VkZW5jZSBhcyBkZWZpbmVkIGluIHdsY19wcmVjX21hcAotICovCi1leHRlcm4gY29uc3QgdTggd2xjX3ByaW8ycHJlY19tYXBbXTsKLSNkZWZpbmUgQlJDTVNfUFJJT19UT19QUkVDKHByaSkJd2xjX3ByaW8ycHJlY19tYXBbKHByaSkgJiA3XQotCi0vKiBUaGlzIG1hcHMgcHJpb3JpdHkgdG8gb25lIHByZWNlZGVuY2UgaGlnaGVyIC0gVXNlZCBieSBQUy1Qb2xsIHJlc3BvbnNlIHBhY2tldHMgdG8KLSAqIHNpbXVsYXRlIGVucXVldWUtYXQtaGVhZCBvcGVyYXRpb24sIGJ1dCBzdGlsbCBtYWludGFpbiB0aGUgb3JkZXIgb24gdGhlIHF1ZXVlCi0gKi8KLSNkZWZpbmUgQlJDTVNfUFJJT19UT19ISV9QUkVDKHByaSkJbWluKEJSQ01TX1BSSU9fVE9fUFJFQyhwcmkpICsgMSxcCi0JCQkJCSAgICBCUkNNU19QUkVDX0NPVU5UIC0gMSkKLQotZXh0ZXJuIGNvbnN0IHU4IHdtZV9maWZvMmFjW107Ci0jZGVmaW5lIFdNRV9QUklPMkFDKHByaW8pCXdtZV9maWZvMmFjW3ByaW8yZmlmb1socHJpbyldXQotCi0vKiBNYXNrIHRvIGRlc2NyaWJlIGFsbCBwcmVjZWRlbmNlIGxldmVscyAqLwotI2RlZmluZSBCUkNNU19QUkVDX0JNUF9BTEwJCU1BWEJJVFZBTChCUkNNU19QUkVDX0NPVU5UKQotCi0vKiBEZWZpbmUgYSBiaXRtYXAgb2YgcHJlY2VkZW5jZXMgY29tcHJpc2VkIGJ5IGVhY2ggQUMgKi8KLSNkZWZpbmUgQlJDTVNfUFJFQ19CTVBfQUNfQkUJKE5CSVRWQUwoQlJDTVNfUFJJT19UT19QUkVDKFBSSU9fODAyMURfQkUpKSB8IFwKLQkJCU5CSVRWQUwoQlJDTVNfUFJJT19UT19ISV9QUkVDKFBSSU9fODAyMURfQkUpKSB8CVwKLQkJCU5CSVRWQUwoQlJDTVNfUFJJT19UT19QUkVDKFBSSU9fODAyMURfRUUpKSB8CVwKLQkJCU5CSVRWQUwoQlJDTVNfUFJJT19UT19ISV9QUkVDKFBSSU9fODAyMURfRUUpKSkKLSNkZWZpbmUgQlJDTVNfUFJFQ19CTVBfQUNfQksJKE5CSVRWQUwoQlJDTVNfUFJJT19UT19QUkVDKFBSSU9fODAyMURfQkspKSB8IFwKLQkJCU5CSVRWQUwoQlJDTVNfUFJJT19UT19ISV9QUkVDKFBSSU9fODAyMURfQkspKSB8CVwKLQkJCU5CSVRWQUwoQlJDTVNfUFJJT19UT19QUkVDKFBSSU9fODAyMURfTk9ORSkpIHwJXAotCQkJTkJJVFZBTChCUkNNU19QUklPX1RPX0hJX1BSRUMoUFJJT184MDIxRF9OT05FKSkpCi0jZGVmaW5lIEJSQ01TX1BSRUNfQk1QX0FDX1ZJCShOQklUVkFMKEJSQ01TX1BSSU9fVE9fUFJFQyhQUklPXzgwMjFEX0NMKSkgfCBcCi0JCQlOQklUVkFMKEJSQ01TX1BSSU9fVE9fSElfUFJFQyhQUklPXzgwMjFEX0NMKSkgfAlcCi0JCQlOQklUVkFMKEJSQ01TX1BSSU9fVE9fUFJFQyhQUklPXzgwMjFEX1ZJKSkgfAlcCi0JCQlOQklUVkFMKEJSQ01TX1BSSU9fVE9fSElfUFJFQyhQUklPXzgwMjFEX1ZJKSkpCi0jZGVmaW5lIEJSQ01TX1BSRUNfQk1QX0FDX1ZPCShOQklUVkFMKEJSQ01TX1BSSU9fVE9fUFJFQyhQUklPXzgwMjFEX1ZPKSkgfCBcCi0JCQlOQklUVkFMKEJSQ01TX1BSSU9fVE9fSElfUFJFQyhQUklPXzgwMjFEX1ZPKSkgfAlcCi0JCQlOQklUVkFMKEJSQ01TX1BSSU9fVE9fUFJFQyhQUklPXzgwMjFEX05DKSkgfAlcCi0JCQlOQklUVkFMKEJSQ01TX1BSSU9fVE9fSElfUFJFQyhQUklPXzgwMjFEX05DKSkpCi0KLS8qIFdNRSBTdXBwb3J0ICovCi0jZGVmaW5lIFdNRV9FTkFCKHB1YikgKChwdWIpLT5fd21lICE9IE9GRikKLSNkZWZpbmUgV01FX0FVVE8od2xjKSAoKHdsYyktPnB1Yi0+X3dtZSA9PSBBVVRPKQotCi0vKiBpbnZhbGlkIGNvcmUgZmxhZ3MsIHVzZSB0aGUgc2F2ZWQgY29yZWZsYWdzICovCi0jZGVmaW5lIEJSQ01TX1VTRV9DT1JFRkxBR1MJMHhmZmZmZmZmZgotCi0KLS8qIG5ldHdvcmsgcHJvdGVjdGlvbiBjb25maWcgKi8KLSNkZWZpbmUJQlJDTVNfUFJPVF9HX1NQRUMJCTEJLyogU1BFQyBnIHByb3RlY3Rpb24gKi8KLSNkZWZpbmUJQlJDTVNfUFJPVF9HX09WUgkJMgkvKiBTUEVDIGcgcHJvdCBvdmVycmlkZSAqLwotI2RlZmluZQlCUkNNU19QUk9UX0dfVVNFUgkJMwkvKiBnbW9kZSBzcGVjaWZpZWQgYnkgdXNlciAqLwotI2RlZmluZQlCUkNNU19QUk9UX09WRVJMQVAJNAkvKiBvdmVybGFwICovCi0jZGVmaW5lCUJSQ01TX1BST1RfTl9VU0VSCQkxMAkvKiBubW9kZSBzcGVjaWZpZWQgYnkgdXNlciAqLwotI2RlZmluZQlCUkNNU19QUk9UX05fQ0ZHCQkxMQkvKiBuIHByb3RlY3Rpb24gKi8KLSNkZWZpbmUJQlJDTVNfUFJPVF9OX0NGR19PVlIJMTIJLyogbiBwcm90ZWN0aW9uIG92ZXJyaWRlICovCi0jZGVmaW5lCUJSQ01TX1BST1RfTl9OT05HRgkxMwkvKiBub24tR0YgcHJvdGVjdGlvbiAqLwotI2RlZmluZQlCUkNNU19QUk9UX05fTk9OR0ZfT1ZSCTE0CS8qIG5vbi1HRiBwcm90ZWN0aW9uIG92ZXJyaWRlICovCi0jZGVmaW5lCUJSQ01TX1BST1RfTl9QQU1fT1ZSCTE1CS8qIG4gcHJlYW1ibGUgb3ZlcnJpZGUgKi8KLSNkZWZpbmUJQlJDTVNfUFJPVF9OX09CU1MJCTE2CS8qIG5vbi1IVCBPQlNTIHByZXNlbnQgKi8KLQotLyoKLSAqIDU0ZyBtb2RlcyAoYmFzaWMgYml0cyBtYXkgc3RpbGwgYmUgb3ZlcnJpZGRlbikKLSAqCi0gKiBHTU9ERV9MRUdBQ1lfQgkJCVJhdGVzZXQ6IDFiLCAyYiwgNS41LCAxMQotICoJCQkJCVByZWFtYmxlOiBMb25nCi0gKgkJCQkJU2hvcnRzbG90OiBPZmYKLSAqIEdNT0RFX0FVVE8JCQkJUmF0ZXNldDogMWIsIDJiLCA1LjViLCAxMWIsIDE4LCAyNCwgMzYsIDU0Ci0gKgkJCQkJRXh0ZW5kZWQgUmF0ZXNldDogNiwgOSwgMTIsIDQ4Ci0gKgkJCQkJUHJlYW1ibGU6IExvbmcKLSAqCQkJCQlTaG9ydHNsb3Q6IEF1dG8KLSAqIEdNT0RFX09OTFkJCQkJUmF0ZXNldDogMWIsIDJiLCA1LjViLCAxMWIsIDE4LCAyNGIsIDM2LCA1NAotICoJCQkJCUV4dGVuZGVkIFJhdGVzZXQ6IDZiLCA5LCAxMmIsIDQ4Ci0gKgkJCQkJUHJlYW1ibGU6IFNob3J0IHJlcXVpcmVkCi0gKgkJCQkJU2hvcnRzbG90OiBBdXRvCi0gKiBHTU9ERV9CX0RFRkVSUkVECQkJUmF0ZXNldDogMWIsIDJiLCA1LjViLCAxMWIsIDE4LCAyNCwgMzYsIDU0Ci0gKgkJCQkJRXh0ZW5kZWQgUmF0ZXNldDogNiwgOSwgMTIsIDQ4Ci0gKgkJCQkJUHJlYW1ibGU6IExvbmcKLSAqCQkJCQlTaG9ydHNsb3Q6IE9uCi0gKiBHTU9ERV9QRVJGT1JNQU5DRQkJCVJhdGVzZXQ6IDFiLCAyYiwgNS41YiwgNmIsIDksIDExYiwgMTJiLCAxOCwgMjRiLCAzNiwgNDgsIDU0Ci0gKgkJCQkJUHJlYW1ibGU6IFNob3J0IHJlcXVpcmVkCi0gKgkJCQkJU2hvcnRzbG90OiBPbiBhbmQgcmVxdWlyZWQKLSAqIEdNT0RFX0xSUwkJCQlSYXRlc2V0OiAxYiwgMmIsIDUuNWIsIDExYgotICoJCQkJCUV4dGVuZGVkIFJhdGVzZXQ6IDYsIDksIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQKLSAqCQkJCQlQcmVhbWJsZTogTG9uZwotICoJCQkJCVNob3J0c2xvdDogQXV0bwotICovCi0jZGVmaW5lIEdNT0RFX0xFR0FDWV9CCQkwCi0jZGVmaW5lIEdNT0RFX0FVVE8JCTEKLSNkZWZpbmUgR01PREVfT05MWQkJMgotI2RlZmluZSBHTU9ERV9CX0RFRkVSUkVECTMKLSNkZWZpbmUgR01PREVfUEVSRk9STUFOQ0UJNAotI2RlZmluZSBHTU9ERV9MUlMJCTUKLSNkZWZpbmUgR01PREVfTUFYCQk2Ci0KLS8qIHZhbHVlcyBmb3IgUExDUEhkcl9vdmVycmlkZSAqLwotI2RlZmluZSBCUkNNU19QTENQX0FVVE8JLTEKLSNkZWZpbmUgQlJDTVNfUExDUF9TSE9SVAkwCi0jZGVmaW5lIEJSQ01TX1BMQ1BfTE9ORwkxCi0KLS8qIHZhbHVlcyBmb3IgZ19wcm90ZWN0aW9uX292ZXJyaWRlIGFuZCBuX3Byb3RlY3Rpb25fb3ZlcnJpZGUgKi8KLSNkZWZpbmUgQlJDTVNfUFJPVEVDVElPTl9BVVRPCQktMQotI2RlZmluZSBCUkNNU19QUk9URUNUSU9OX09GRgkJMAotI2RlZmluZSBCUkNNU19QUk9URUNUSU9OX09OCQkxCi0jZGVmaW5lIEJSQ01TX1BST1RFQ1RJT05fTU1IRFJfT05MWQkyCi0jZGVmaW5lIEJSQ01TX1BST1RFQ1RJT05fQ1RTX09OTFkJCTMKLQotLyogdmFsdWVzIGZvciBnX3Byb3RlY3Rpb25fY29udHJvbCBhbmQgbl9wcm90ZWN0aW9uX2NvbnRyb2wgKi8KLSNkZWZpbmUgQlJDTVNfUFJPVEVDVElPTl9DVExfT0ZGCQkwCi0jZGVmaW5lIEJSQ01TX1BST1RFQ1RJT05fQ1RMX0xPQ0FMCTEKLSNkZWZpbmUgQlJDTVNfUFJPVEVDVElPTl9DVExfT1ZFUkxBUAkyCi0KLS8qIHZhbHVlcyBmb3Igbl9wcm90ZWN0aW9uICovCi0jZGVmaW5lIEJSQ01TX05fUFJPVEVDVElPTl9PRkYJCTAKLSNkZWZpbmUgQlJDTVNfTl9QUk9URUNUSU9OX09QVElPTkFMCTEKLSNkZWZpbmUgQlJDTVNfTl9QUk9URUNUSU9OXzIwSU40MAkJMgotI2RlZmluZSBCUkNNU19OX1BST1RFQ1RJT05fTUlYRURNT0RFCTMKLQotLyogdmFsdWVzIGZvciBiYW5kIHNwZWNpZmljIDQwTUh6IGNhcGFiaWxpdGllcyAqLwotI2RlZmluZSBCUkNNU19OX0JXXzIwQUxMCQkJMAotI2RlZmluZSBCUkNNU19OX0JXXzQwQUxMCQkJMQotI2RlZmluZSBCUkNNU19OX0JXXzIwSU4yR180MElONUcJCTIKLQotLyogYml0ZmxhZ3MgZm9yIFNHSSBzdXBwb3J0IChzZ2lfcnggaW92YXIpICovCi0jZGVmaW5lIEJSQ01TX05fU0dJXzIwCQkJMHgwMQotI2RlZmluZSBCUkNNU19OX1NHSV80MAkJCTB4MDIKLQotLyogZGVmaW5lcyB1c2VkIGJ5IHRoZSBucmF0ZSBpb3ZhciAqLwotI2RlZmluZSBOUkFURV9NQ1NfSU5VU0UJMHgwMDAwMDA4MAkvKiBNU0MgaW4gdXNlLGluZGljYXRlcyBiMC02IGhvbGRzIGFuIG1jcyAqLwotI2RlZmluZSBOUkFURV9SQVRFX01BU0sgMHgwMDAwMDA3ZgkvKiByYXRlL21jcyB2YWx1ZSAqLwotI2RlZmluZSBOUkFURV9TVEZfTUFTSwkweDAwMDBmZjAwCS8qIHN0ZiBtb2RlIG1hc2s6IHNpc28sIGNkZCwgc3RiYywgc2RtICovCi0jZGVmaW5lIE5SQVRFX1NURl9TSElGVAk4CS8qIHN0ZiBtb2RlIHNoaWZ0ICovCi0jZGVmaW5lIE5SQVRFX09WRVJSSURFCTB4ODAwMDAwMDAJLyogYml0IGluZGljYXRlcyBvdmVycmlkZSBib3RoIHJhdGUgJiBtb2RlICovCi0jZGVmaW5lIE5SQVRFX09WRVJSSURFX01DU19PTkxZIDB4NDAwMDAwMDAJLyogYml0IGluZGljYXRlIHRvIG92ZXJyaWRlIG1jcyBvbmx5ICovCi0jZGVmaW5lIE5SQVRFX1NHSV9NQVNLICAweDAwODAwMDAwCS8qIHNnaSBtb2RlICovCi0jZGVmaW5lIE5SQVRFX1NHSV9TSElGVCAyMwkvKiBzZ2kgbW9kZSAqLwotI2RlZmluZSBOUkFURV9MRFBDX0NPRElORyAweDAwNDAwMDAwCS8qIGJpdCBpbmRpY2F0ZXMgYWR2IGNvZGluZyBpbiB1c2UgKi8KLSNkZWZpbmUgTlJBVEVfTERQQ19TSElGVCAyMgkvKiBsZHBjIHNoaWZ0ICovCi0KLSNkZWZpbmUgTlJBVEVfU1RGX1NJU08JMAkvKiBzdGYgbW9kZSBTSVNPICovCi0jZGVmaW5lIE5SQVRFX1NURl9DREQJMQkvKiBzdGYgbW9kZSBDREQgKi8KLSNkZWZpbmUgTlJBVEVfU1RGX1NUQkMJMgkvKiBzdGYgbW9kZSBTVEJDICovCi0jZGVmaW5lIE5SQVRFX1NURl9TRE0JMwkvKiBzdGYgbW9kZSBTRE0gKi8KLQotI2RlZmluZSBBTlRfU0VMQ0ZHX01BWAkJNAkvKiBtYXggbnVtYmVyIG9mIGFudGVubmEgY29uZmlndXJhdGlvbnMgKi8KLQotI2RlZmluZSBISUdIRVNUX1NJTkdMRV9TVFJFQU1fTUNTCTcJLyogTUNTIHZhbHVlcyBncmVhdGVyIHRoYW4gdGhpcyBlbmFibGUgbXVsdGlwbGUgc3RyZWFtcyAqLwotCi1zdHJ1Y3QgYnJjbXNfYW50c2VsY2ZnIHsKLQl1OCBhbnRfY29uZmlnW0FOVF9TRUxDRkdfTUFYXTsJLyogYW50ZW5uYSBjb25maWd1cmF0aW9uICovCi0JdTggbnVtX2FudGNmZzsJLyogbnVtYmVyIG9mIGF2YWlsYWJsZSBhbnRlbm5hIGNvbmZpZ3VyYXRpb25zICovCi19OwotCi0vKiBjb21tb24gZnVuY3Rpb25zIGZvciBldmVyeSBwb3J0ICovCi1leHRlcm4gdm9pZCAqYnJjbXNfY19hdHRhY2goc3RydWN0IGJyY21zX2luZm8gKndsLCB1MTYgdmVuZG9yLCB1MTYgZGV2aWNlLAotCQkJdWludCB1bml0LCBib29sIHBpb21vZGUsIHZvaWQgKnJlZ3N2YSwgdWludCBidXN0eXBlLAotCQkJdm9pZCAqYnRwYXJhbSwgdWludCAqcGVycik7Ci1leHRlcm4gdWludCBicmNtc19jX2RldGFjaChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotZXh0ZXJuIGludCBicmNtc19jX3VwKHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1leHRlcm4gdWludCBicmNtc19jX2Rvd24oc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKLQotZXh0ZXJuIGludCBicmNtc19jX3NldChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGludCBjbWQsIGludCBhcmcpOwotZXh0ZXJuIGludCBicmNtc19jX2dldChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGludCBjbWQsIGludCAqYXJnKTsKLWV4dGVybiBib29sIGJyY21zX2NfY2hpcG1hdGNoKHUxNiB2ZW5kb3IsIHUxNiBkZXZpY2UpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19pbml0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1leHRlcm4gdm9pZCBicmNtc19jX3Jlc2V0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci0KLWV4dGVybiB2b2lkIGJyY21zX2NfaW50cnNvbihzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotZXh0ZXJuIHUzMiBicmNtc19jX2ludHJzb2ZmKHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1leHRlcm4gdm9pZCBicmNtc19jX2ludHJzcmVzdG9yZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHUzMiBtYWNpbnRtYXNrKTsKLWV4dGVybiBib29sIGJyY21zX2NfaW50cnN1cGQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKLWV4dGVybiBib29sIGJyY21zX2NfaXNyKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgYm9vbCAqd2FudGRwYyk7Ci1leHRlcm4gYm9vbCBicmNtc19jX2RwYyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGJvb2wgYm91bmRlZCk7Ci1leHRlcm4gYm9vbCBicmNtc19jX3NlbmRwa3RfbWFjODAyMTEoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNkdSwKLQkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKLWV4dGVybiBpbnQgYnJjbXNfY19pb2N0bChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGludCBjbWQsIHZvaWQgKmFyZywgaW50IGxlbiwKLQkJCSBzdHJ1Y3QgYnJjbXNfY19pZiAqd2xjaWYpOwotZXh0ZXJuIGJvb2wgYnJjbXNfY19hZ2dyZWdhdGFibGUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB1OCB0aWQpOwotCi0vKiBoZWxwZXIgZnVuY3Rpb25zICovCi1leHRlcm4gdm9pZCBicmNtc19jX3N0YXRzdXBkKHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1leHRlcm4gdm9pZCBicmNtc19jX3Byb3RlY3Rpb25fdXBkKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdWludCBpZHgsCi0JCQkJICAgaW50IHZhbCk7Ci1leHRlcm4gaW50IGJyY21zX2NfZ2V0X2hlYWRlcl9sZW4odm9pZCk7Ci1leHRlcm4gdm9pZCBicmNtc19jX21hY19iY25fcHJvbWlzY19jaGFuZ2Uoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJCQkgICBib29sIHByb21pc2MpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19zZXRfYWRkcm1hdGNoKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywKLQkJCQkgIGludCBtYXRjaF9yZWdfb2Zmc2V0LAotCQkJCSAgY29uc3QgdTggKmFkZHIpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY193bWVfc2V0cGFyYW1zKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdTE2IGFjaSwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zICphcmcsCi0JCQkgICAgICBib29sIHN1c3BlbmQpOwotZXh0ZXJuIHN0cnVjdCBicmNtc19wdWIgKmJyY21zX2NfcHViKHZvaWQgKndsYyk7Ci0KLS8qIGNvbW1vbiBmdW5jdGlvbnMgZm9yIGV2ZXJ5IHBvcnQgKi8KLWV4dGVybiB2b2lkIGJyY21zX2NfbWhmKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdTggaWR4LCB1MTYgbWFzaywgdTE2IHZhbCwKLQkJICAgIGludCBiYW5kcyk7Ci1leHRlcm4gdm9pZCBicmNtc19jX3JhdGVfbG9va3VwX2luaXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJCSAgICAgd2xjX3JhdGVzZXRfdCAqcmF0ZXNldCk7Ci1leHRlcm4gdm9pZCBicmNtc19kZWZhdWx0X3JhdGVzZXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB3bGNfcmF0ZXNldF90ICpycyk7Ci0KLWV4dGVybiB2b2lkIGJyY21zX2NfYW1wZHVfZmx1c2goc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19hbXBkdV90eF9vcGVyYXRpb25hbChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHU4IHRpZCwKLQkJCQkJIHU4IGJhX3dzaXplLCB1aW50IG1heF9yeF9hbXBkdV9ieXRlcyk7Ci1leHRlcm4gaW50IGJyY21zX2Nfc2V0X3BhcihzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGVudW0gd2xjX3Bhcl9pZCBwYXJfaWQsCi0JCQkgICBpbnQgdmFsKTsKLWV4dGVybiBpbnQgYnJjbXNfY19nZXRfcGFyKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgZW51bSB3bGNfcGFyX2lkIHBhcl9pZCwKLQkJCSAgIGludCAqcmV0X2ludF9wdHIpOwotZXh0ZXJuIGNoYXIgKmdldHZhcihjaGFyICp2YXJzLCBjb25zdCBjaGFyICpuYW1lKTsKLWV4dGVybiBpbnQgZ2V0aW50dmFyKGNoYXIgKnZhcnMsIGNvbnN0IGNoYXIgKm5hbWUpOwotCi0vKiB3bGNfcGh5LmMgaGVscGVyIGZ1bmN0aW9ucyAqLwotZXh0ZXJuIHZvaWQgYnJjbXNfY19zZXRfcHNfY3RybChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19tY3RybChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHUzMiBtYXNrLCB1MzIgdmFsKTsKLQotZXh0ZXJuIGludCBicmNtc19jX21vZHVsZV9yZWdpc3RlcihzdHJ1Y3QgYnJjbXNfcHViICpwdWIsCi0JCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqaGRsLAotCQkJICAgICAgIHdhdGNoZG9nX2ZuX3Qgd2F0Y2hkb2dfZm4sIGRvd25fZm5fdCBkb3duX2ZuKTsKLWV4dGVybiBpbnQgYnJjbXNfY19tb2R1bGVfdW5yZWdpc3RlcihzdHJ1Y3QgYnJjbXNfcHViICpwdWIsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJIHZvaWQgKmhkbCk7Ci1leHRlcm4gdm9pZCBicmNtc19jX3N1c3BlbmRfbWFjX2FuZF93YWl0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1leHRlcm4gdm9pZCBicmNtc19jX2VuYWJsZV9tYWMoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKLWV4dGVybiB2b2lkIGJyY21zX2NfYXNzb2NpYXRlX3VwZChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGJvb2wgc3RhdGUpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19zY2FuX3N0YXJ0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1leHRlcm4gdm9pZCBicmNtc19jX3NjYW5fc3RvcChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotZXh0ZXJuIGludCBicmNtc19jX2dldF9jdXJiYW5kKHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1leHRlcm4gdm9pZCBicmNtc19jX3dhaXRfZm9yX3R4X2NvbXBsZXRpb24oc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJCQkgICBib29sIGRyb3ApOwotCi0vKiBoZWxwZXIgZnVuY3Rpb25zICovCi1leHRlcm4gYm9vbCBicmNtc19jX2NoZWNrX3JhZGlvX2Rpc2FibGVkKHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1leHRlcm4gYm9vbCBicmNtc19jX3JhZGlvX21vbml0b3Jfc3RvcChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotCi0jZGVmaW5lCU1BWEJBTkRTCQkyCS8qIE1heGltdW0gI29mIGJhbmRzICovCi0vKiBiYW5kc3RhdGUgYXJyYXkgaW5kaWNlcyAqLwotI2RlZmluZSBCQU5EXzJHX0lOREVYCQkwCS8qIHdsYy0+YmFuZHN0YXRlW3hdIGluZGV4ICovCi0jZGVmaW5lIEJBTkRfNUdfSU5ERVgJCTEJLyogd2xjLT5iYW5kc3RhdGVbeF0gaW5kZXggKi8KLQotI2RlZmluZSBCQU5EXzJHX05BTUUJCSIyLjRHIgotI2RlZmluZSBCQU5EXzVHX05BTUUJCSI1RyIKLQotLyogQk1BQyBSUEM6IDcgdTMyIHBhcmFtczogcGt0dG90bGVuLCBmaWZvLCBjb21taXQsIGZpZCwgdHhwa3RwZW5kLCBwa3RmbGFnLCBycGNfaWQgKi8KLSNkZWZpbmUgQlJDTVNfUlBDVFhfUEFSQU1TCQkzMgotCi0jZW5kaWYJCQkJLyogX0JSQ01fUFVCX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3JhdGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvcmF0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGU0Yjk5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvcmF0ZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSA8YnJjbXVfd2lmaS5oPgotI2luY2x1ZGUgPGJyY211X3V0aWxzLmg+Ci0KLSNpbmNsdWRlICJkMTEuaCIKLSNpbmNsdWRlICJwdWIuaCIKLSNpbmNsdWRlICJyYXRlLmgiCi0KLS8qIFJhdGUgaW5mbyBwZXIgcmF0ZTogSXQgdGVsbHMgd2hldGhlciBhIHJhdGUgaXMgb2ZkbSBvciBub3QgYW5kIGl0cyBwaHlfcmF0ZSB2YWx1ZSAqLwotY29uc3QgdTggcmF0ZV9pbmZvW0JSQ01fTUFYUkFURSArIDFdID0gewotCS8qICAwICAgICAxICAgICAyICAgICAzICAgICA0ICAgICA1ICAgICA2ICAgICA3ICAgICA4ICAgICA5ICovCi0vKiAgIDAgKi8gMHgwMCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLS8qICAxMCAqLyAweDAwLCAweDM3LCAweDhiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhmLCAweDAwLAotLyogIDIwICovIDB4MDAsIDB4MDAsIDB4NmUsIDB4MDAsIDB4OGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0vKiAgMzAgKi8gMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZSwgMHgwMCwgMHgwMCwgMHgwMCwKLS8qICA0MCAqLyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweDAwLAotLyogIDUwICovIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0vKiAgNjAgKi8gMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLS8qICA3MCAqLyAweDAwLCAweDAwLCAweDhkLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotLyogIDgwICovIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0vKiAgOTAgKi8gMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwKLS8qIDEwMCAqLyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhjCi19OwotCi0vKiByYXRlcyBhcmUgaW4gdW5pdHMgb2YgS2JwcyAqLwotY29uc3Qgc3RydWN0IGJyY21zX21jc19pbmZvIG1jc190YWJsZVtNQ1NfVEFCTEVfU0laRV0gPSB7Ci0JLyogTUNTICAwOiBTUyAxLCBNT0Q6IEJQU0ssICBDUiAxLzIgKi8KLQl7NjUwMCwgMTM1MDAsIENFSUwoNjUwMCAqIDEwLCA5KSwgQ0VJTCgxMzUwMCAqIDEwLCA5KSwgMHgwMCwKLQkgQlJDTV9SQVRFXzZNfSwKLQkvKiBNQ1MgIDE6IFNTIDEsIE1PRDogUVBTSywgIENSIDEvMiAqLwotCXsxMzAwMCwgMjcwMDAsIENFSUwoMTMwMDAgKiAxMCwgOSksIENFSUwoMjcwMDAgKiAxMCwgOSksIDB4MDgsCi0JIEJSQ01fUkFURV8xMk19LAotCS8qIE1DUyAgMjogU1MgMSwgTU9EOiBRUFNLLCAgQ1IgMy80ICovCi0JezE5NTAwLCA0MDUwMCwgQ0VJTCgxOTUwMCAqIDEwLCA5KSwgQ0VJTCg0MDUwMCAqIDEwLCA5KSwgMHgwQSwKLQkgQlJDTV9SQVRFXzE4TX0sCi0JLyogTUNTICAzOiBTUyAxLCBNT0Q6IDE2UUFNLCBDUiAxLzIgKi8KLQl7MjYwMDAsIDU0MDAwLCBDRUlMKDI2MDAwICogMTAsIDkpLCBDRUlMKDU0MDAwICogMTAsIDkpLCAweDEwLAotCSBCUkNNX1JBVEVfMjRNfSwKLQkvKiBNQ1MgIDQ6IFNTIDEsIE1PRDogMTZRQU0sIENSIDMvNCAqLwotCXszOTAwMCwgODEwMDAsIENFSUwoMzkwMDAgKiAxMCwgOSksIENFSUwoODEwMDAgKiAxMCwgOSksIDB4MTIsCi0JIEJSQ01fUkFURV8zNk19LAotCS8qIE1DUyAgNTogU1MgMSwgTU9EOiA2NFFBTSwgQ1IgMi8zICovCi0JezUyMDAwLCAxMDgwMDAsIENFSUwoNTIwMDAgKiAxMCwgOSksIENFSUwoMTA4MDAwICogMTAsIDkpLCAweDE5LAotCSBCUkNNX1JBVEVfNDhNfSwKLQkvKiBNQ1MgIDY6IFNTIDEsIE1PRDogNjRRQU0sIENSIDMvNCAqLwotCXs1ODUwMCwgMTIxNTAwLCBDRUlMKDU4NTAwICogMTAsIDkpLCBDRUlMKDEyMTUwMCAqIDEwLCA5KSwgMHgxQSwKLQkgQlJDTV9SQVRFXzU0TX0sCi0JLyogTUNTICA3OiBTUyAxLCBNT0Q6IDY0UUFNLCBDUiA1LzYgKi8KLQl7NjUwMDAsIDEzNTAwMCwgQ0VJTCg2NTAwMCAqIDEwLCA5KSwgQ0VJTCgxMzUwMDAgKiAxMCwgOSksIDB4MUMsCi0JIEJSQ01fUkFURV81NE19LAotCS8qIE1DUyAgODogU1MgMiwgTU9EOiBCUFNLLCAgQ1IgMS8yICovCi0JezEzMDAwLCAyNzAwMCwgQ0VJTCgxMzAwMCAqIDEwLCA5KSwgQ0VJTCgyNzAwMCAqIDEwLCA5KSwgMHg0MCwKLQkgQlJDTV9SQVRFXzZNfSwKLQkvKiBNQ1MgIDk6IFNTIDIsIE1PRDogUVBTSywgIENSIDEvMiAqLwotCXsyNjAwMCwgNTQwMDAsIENFSUwoMjYwMDAgKiAxMCwgOSksIENFSUwoNTQwMDAgKiAxMCwgOSksIDB4NDgsCi0JIEJSQ01fUkFURV8xMk19LAotCS8qIE1DUyAxMDogU1MgMiwgTU9EOiBRUFNLLCAgQ1IgMy80ICovCi0JezM5MDAwLCA4MTAwMCwgQ0VJTCgzOTAwMCAqIDEwLCA5KSwgQ0VJTCg4MTAwMCAqIDEwLCA5KSwgMHg0QSwKLQkgQlJDTV9SQVRFXzE4TX0sCi0JLyogTUNTIDExOiBTUyAyLCBNT0Q6IDE2UUFNLCBDUiAxLzIgKi8KLQl7NTIwMDAsIDEwODAwMCwgQ0VJTCg1MjAwMCAqIDEwLCA5KSwgQ0VJTCgxMDgwMDAgKiAxMCwgOSksIDB4NTAsCi0JIEJSQ01fUkFURV8yNE19LAotCS8qIE1DUyAxMjogU1MgMiwgTU9EOiAxNlFBTSwgQ1IgMy80ICovCi0Jezc4MDAwLCAxNjIwMDAsIENFSUwoNzgwMDAgKiAxMCwgOSksIENFSUwoMTYyMDAwICogMTAsIDkpLCAweDUyLAotCSBCUkNNX1JBVEVfMzZNfSwKLQkvKiBNQ1MgMTM6IFNTIDIsIE1PRDogNjRRQU0sIENSIDIvMyAqLwotCXsxMDQwMDAsIDIxNjAwMCwgQ0VJTCgxMDQwMDAgKiAxMCwgOSksIENFSUwoMjE2MDAwICogMTAsIDkpLCAweDU5LAotCSBCUkNNX1JBVEVfNDhNfSwKLQkvKiBNQ1MgMTQ6IFNTIDIsIE1PRDogNjRRQU0sIENSIDMvNCAqLwotCXsxMTcwMDAsIDI0MzAwMCwgQ0VJTCgxMTcwMDAgKiAxMCwgOSksIENFSUwoMjQzMDAwICogMTAsIDkpLCAweDVBLAotCSBCUkNNX1JBVEVfNTRNfSwKLQkvKiBNQ1MgMTU6IFNTIDIsIE1PRDogNjRRQU0sIENSIDUvNiAqLwotCXsxMzAwMDAsIDI3MDAwMCwgQ0VJTCgxMzAwMDAgKiAxMCwgOSksIENFSUwoMjcwMDAwICogMTAsIDkpLCAweDVDLAotCSBCUkNNX1JBVEVfNTRNfSwKLQkvKiBNQ1MgMTY6IFNTIDMsIE1PRDogQlBTSywgIENSIDEvMiAqLwotCXsxOTUwMCwgNDA1MDAsIENFSUwoMTk1MDAgKiAxMCwgOSksIENFSUwoNDA1MDAgKiAxMCwgOSksIDB4ODAsCi0JIEJSQ01fUkFURV82TX0sCi0JLyogTUNTIDE3OiBTUyAzLCBNT0Q6IFFQU0ssICBDUiAxLzIgKi8KLQl7MzkwMDAsIDgxMDAwLCBDRUlMKDM5MDAwICogMTAsIDkpLCBDRUlMKDgxMDAwICogMTAsIDkpLCAweDg4LAotCSBCUkNNX1JBVEVfMTJNfSwKLQkvKiBNQ1MgMTg6IFNTIDMsIE1PRDogUVBTSywgIENSIDMvNCAqLwotCXs1ODUwMCwgMTIxNTAwLCBDRUlMKDU4NTAwICogMTAsIDkpLCBDRUlMKDEyMTUwMCAqIDEwLCA5KSwgMHg4QSwKLQkgQlJDTV9SQVRFXzE4TX0sCi0JLyogTUNTIDE5OiBTUyAzLCBNT0Q6IDE2UUFNLCBDUiAxLzIgKi8KLQl7NzgwMDAsIDE2MjAwMCwgQ0VJTCg3ODAwMCAqIDEwLCA5KSwgQ0VJTCgxNjIwMDAgKiAxMCwgOSksIDB4OTAsCi0JIEJSQ01fUkFURV8yNE19LAotCS8qIE1DUyAyMDogU1MgMywgTU9EOiAxNlFBTSwgQ1IgMy80ICovCi0JezExNzAwMCwgMjQzMDAwLCBDRUlMKDExNzAwMCAqIDEwLCA5KSwgQ0VJTCgyNDMwMDAgKiAxMCwgOSksIDB4OTIsCi0JIEJSQ01fUkFURV8zNk19LAotCS8qIE1DUyAyMTogU1MgMywgTU9EOiA2NFFBTSwgQ1IgMi8zICovCi0JezE1NjAwMCwgMzI0MDAwLCBDRUlMKDE1NjAwMCAqIDEwLCA5KSwgQ0VJTCgzMjQwMDAgKiAxMCwgOSksIDB4OTksCi0JIEJSQ01fUkFURV80OE19LAotCS8qIE1DUyAyMjogU1MgMywgTU9EOiA2NFFBTSwgQ1IgMy80ICovCi0JezE3NTUwMCwgMzY0NTAwLCBDRUlMKDE3NTUwMCAqIDEwLCA5KSwgQ0VJTCgzNjQ1MDAgKiAxMCwgOSksIDB4OUEsCi0JIEJSQ01fUkFURV81NE19LAotCS8qIE1DUyAyMzogU1MgMywgTU9EOiA2NFFBTSwgQ1IgNS82ICovCi0JezE5NTAwMCwgNDA1MDAwLCBDRUlMKDE5NTAwMCAqIDEwLCA5KSwgQ0VJTCg0MDUwMDAgKiAxMCwgOSksIDB4OUIsCi0JIEJSQ01fUkFURV81NE19LAotCS8qIE1DUyAyNDogU1MgNCwgTU9EOiBCUFNLLCAgQ1IgMS8yICovCi0JezI2MDAwLCA1NDAwMCwgQ0VJTCgyNjAwMCAqIDEwLCA5KSwgQ0VJTCg1NDAwMCAqIDEwLCA5KSwgMHhDMCwKLQkgQlJDTV9SQVRFXzZNfSwKLQkvKiBNQ1MgMjU6IFNTIDQsIE1PRDogUVBTSywgIENSIDEvMiAqLwotCXs1MjAwMCwgMTA4MDAwLCBDRUlMKDUyMDAwICogMTAsIDkpLCBDRUlMKDEwODAwMCAqIDEwLCA5KSwgMHhDOCwKLQkgQlJDTV9SQVRFXzEyTX0sCi0JLyogTUNTIDI2OiBTUyA0LCBNT0Q6IFFQU0ssICBDUiAzLzQgKi8KLQl7NzgwMDAsIDE2MjAwMCwgQ0VJTCg3ODAwMCAqIDEwLCA5KSwgQ0VJTCgxNjIwMDAgKiAxMCwgOSksIDB4Q0EsCi0JIEJSQ01fUkFURV8xOE19LAotCS8qIE1DUyAyNzogU1MgNCwgTU9EOiAxNlFBTSwgQ1IgMS8yICovCi0JezEwNDAwMCwgMjE2MDAwLCBDRUlMKDEwNDAwMCAqIDEwLCA5KSwgQ0VJTCgyMTYwMDAgKiAxMCwgOSksIDB4RDAsCi0JIEJSQ01fUkFURV8yNE19LAotCS8qIE1DUyAyODogU1MgNCwgTU9EOiAxNlFBTSwgQ1IgMy80ICovCi0JezE1NjAwMCwgMzI0MDAwLCBDRUlMKDE1NjAwMCAqIDEwLCA5KSwgQ0VJTCgzMjQwMDAgKiAxMCwgOSksIDB4RDIsCi0JIEJSQ01fUkFURV8zNk19LAotCS8qIE1DUyAyOTogU1MgNCwgTU9EOiA2NFFBTSwgQ1IgMi8zICovCi0JezIwODAwMCwgNDMyMDAwLCBDRUlMKDIwODAwMCAqIDEwLCA5KSwgQ0VJTCg0MzIwMDAgKiAxMCwgOSksIDB4RDksCi0JIEJSQ01fUkFURV80OE19LAotCS8qIE1DUyAzMDogU1MgNCwgTU9EOiA2NFFBTSwgQ1IgMy80ICovCi0JezIzNDAwMCwgNDg2MDAwLCBDRUlMKDIzNDAwMCAqIDEwLCA5KSwgQ0VJTCg0ODYwMDAgKiAxMCwgOSksIDB4REEsCi0JIEJSQ01fUkFURV81NE19LAotCS8qIE1DUyAzMTogU1MgNCwgTU9EOiA2NFFBTSwgQ1IgNS82ICovCi0JezI2MDAwMCwgNTQwMDAwLCBDRUlMKDI2MDAwMCAqIDEwLCA5KSwgQ0VJTCg1NDAwMDAgKiAxMCwgOSksIDB4REIsCi0JIEJSQ01fUkFURV81NE19LAotCS8qIE1DUyAzMjogU1MgMSwgTU9EOiBCUFNLLCAgQ1IgMS8yICovCi0JezAsIDYwMDAsIDAsIENFSUwoNjAwMCAqIDEwLCA5KSwgMHgwMCwgQlJDTV9SQVRFXzZNfSwKLX07Ci0KLS8qIHBoeWNmZyBmb3IgbGVnYWN5IE9GRE0gZnJhbWVzOiBjb2RlIHJhdGUsIG1vZHVsYXRpb24gc2NoZW1lLCBzcGF0aWFsIHN0cmVhbXMKLSAqICAgTnVtYmVyIG9mIHNwYXRpYWwgc3RyZWFtczogYWx3YXlzIDEKLSAqICAgb3RoZXIgZmllbGRzOiByZWZlciB0byB0YWJsZSA3OCBvZiBzZWN0aW9uIDE3LjMuMi4yIG9mIHRoZSBvcmlnaW5hbCAuMTFhIHN0YW5kYXJkCi0gKi8KLXN0cnVjdCBsZWdhY3lfcGh5Y2ZnIHsKLQl1MzIgcmF0ZV9vZmRtOwkvKiBvZmRtIG1hYyByYXRlICovCi0JdTggdHhfcGh5X2N0bDM7CS8qIHBoeSBjdGwgYnl0ZSAzLCBjb2RlIHJhdGUsIG1vZHVsYXRpb24gdHlwZSwgIyBvZiBzdHJlYW1zICovCi19OwotCi0jZGVmaW5lIExFR0FDWV9QSFlDRkdfVEFCTEVfU0laRQkxMgkvKiBOdW1iZXIgb2YgbGVnYWN5X3JhdGVfY2ZnIGVudHJpZXMgaW4gdGhlIHRhYmxlICovCi0KLS8qIEluIENDSyBtb2RlIExQUEhZIG92ZXJsb2FkcyBPRkRNIE1vZHVsYXRpb24gYml0cyB3aXRoIENDSyBEYXRhIFJhdGUgKi8KLS8qIEV2ZW50dWFsbHkgTUlNT1BIWSB3b3VsZCBhbHNvIGJlIGNvbnZlcnRlZCB0byB0aGlzIGZvcm1hdCAqLwotLyogMCA9IDFNYnBzOyAxID0gMk1icHM7IDIgPSA1LjVNYnBzOyAzID0gMTFNYnBzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0Ci1sZWdhY3lfcGh5Y2ZnIGxlZ2FjeV9waHljZmdfdGFibGVbTEVHQUNZX1BIWUNGR19UQUJMRV9TSVpFXSA9IHsKLQl7QlJDTV9SQVRFXzFNLCAweDAwfSwJLyogQ0NLICAxTWJwcywgIGRhdGEgcmF0ZSAgMCAqLwotCXtCUkNNX1JBVEVfMk0sIDB4MDh9LAkvKiBDQ0sgIDJNYnBzLCAgZGF0YSByYXRlICAxICovCi0Je0JSQ01fUkFURV81TTUsIDB4MTB9LAkvKiBDQ0sgIDUuNU1icHMsICBkYXRhIHJhdGUgIDIgKi8KLQl7QlJDTV9SQVRFXzExTSwgMHgxOH0sCS8qIENDSyAgMTFNYnBzLCAgZGF0YSByYXRlICAgMyAqLwotCS8qIE9GRE0gIDZNYnBzLCAgY29kZSByYXRlIDEvMiwgQlBTSywgICAxIHNwYXRpYWwgc3RyZWFtICovCi0Je0JSQ01fUkFURV82TSwgMHgwMH0sCi0JLyogT0ZETSAgOU1icHMsICBjb2RlIHJhdGUgMy80LCBCUFNLLCAgIDEgc3BhdGlhbCBzdHJlYW0gKi8KLQl7QlJDTV9SQVRFXzlNLCAweDAyfSwKLQkvKiBPRkRNICAxMk1icHMsIGNvZGUgcmF0ZSAxLzIsIFFQU0ssICAgMSBzcGF0aWFsIHN0cmVhbSAqLwotCXtCUkNNX1JBVEVfMTJNLCAweDA4fSwKLQkvKiBPRkRNICAxOE1icHMsIGNvZGUgcmF0ZSAzLzQsIFFQU0ssICAgMSBzcGF0aWFsIHN0cmVhbSAqLwotCXtCUkNNX1JBVEVfMThNLCAweDBBfSwKLQkvKiBPRkRNICAyNE1icHMsIGNvZGUgcmF0ZSAxLzIsIDE2LVFBTSwgMSBzcGF0aWFsIHN0cmVhbSAqLwotCXtCUkNNX1JBVEVfMjRNLCAweDEwfSwKLQkvKiBPRkRNICAzNk1icHMsIGNvZGUgcmF0ZSAzLzQsIDE2LVFBTSwgMSBzcGF0aWFsIHN0cmVhbSAqLwotCXtCUkNNX1JBVEVfMzZNLCAweDEyfSwKLQkvKiBPRkRNICA0OE1icHMsIGNvZGUgcmF0ZSAyLzMsIDY0LVFBTSwgMSBzcGF0aWFsIHN0cmVhbSAqLwotCXtCUkNNX1JBVEVfNDhNLCAweDE5fSwKLQkvKiBPRkRNICA1NE1icHMsIGNvZGUgcmF0ZSAzLzQsIDY0LVFBTSwgMSBzcGF0aWFsIHN0cmVhbSAqLwotCXtCUkNNX1JBVEVfNTRNLCAweDFBfSwKLX07Ci0KLS8qIEhhcmR3YXJlIHJhdGVzIChhbHNvIGVuY29kZXMgZGVmYXVsdCBiYXNpYyByYXRlcykgKi8KLQotY29uc3Qgd2xjX3JhdGVzZXRfdCBjY2tfb2ZkbV9taW1vX3JhdGVzID0gewotCTEyLAotCXsJCQkvKiAgICAxYiwgICAyYiwgICA1LjViLCA2LCAgICA5LCAgICAxMWIsICAxMiwgICAxOCwgICAyNCwgICAzNiwgICA0OCwgICA1NCBNYnBzICovCi0JIDB4ODIsIDB4ODQsIDB4OGIsIDB4MGMsIDB4MTIsIDB4OTYsIDB4MTgsIDB4MjQsIDB4MzAsIDB4NDgsIDB4NjAsCi0JIDB4NmN9LAotCTB4MDAsCi0JezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9Ci19OwotCi1jb25zdCB3bGNfcmF0ZXNldF90IG9mZG1fbWltb19yYXRlcyA9IHsKLQk4LAotCXsJCQkvKiAgICA2YiwgICA5LCAgICAxMmIsICAxOCwgICAyNGIsICAzNiwgICA0OCwgICA1NCBNYnBzICovCi0JIDB4OGMsIDB4MTIsIDB4OTgsIDB4MjQsIDB4YjAsIDB4NDgsIDB4NjAsIDB4NmN9LAotCTB4MDAsCi0JezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9Ci19OwotCi0vKiBEZWZhdWx0IHJhdGVzZXRzIHRoYXQgaW5jbHVkZSBNQ1MzMiBmb3IgNDBCVyBjaGFubmVscyAqLwotY29uc3Qgd2xjX3JhdGVzZXRfdCBjY2tfb2ZkbV80MGJ3X21pbW9fcmF0ZXMgPSB7Ci0JMTIsCi0JewkJCS8qICAgIDFiLCAgIDJiLCAgIDUuNWIsIDYsICAgIDksICAgIDExYiwgIDEyLCAgIDE4LCAgIDI0LCAgIDM2LCAgIDQ4LCAgIDU0IE1icHMgKi8KLQkgMHg4MiwgMHg4NCwgMHg4YiwgMHgwYywgMHgxMiwgMHg5NiwgMHgxOCwgMHgyNCwgMHgzMCwgMHg0OCwgMHg2MCwKLQkgMHg2Y30sCi0JMHgwMCwKLQl7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0KLX07Ci0KLWNvbnN0IHdsY19yYXRlc2V0X3Qgb2ZkbV80MGJ3X21pbW9fcmF0ZXMgPSB7Ci0JOCwKLQl7CQkJLyogICAgNmIsICAgOSwgICAgMTJiLCAgMTgsICAgMjRiLCAgMzYsICAgNDgsICAgNTQgTWJwcyAqLwotCSAweDhjLCAweDEyLCAweDk4LCAweDI0LCAweGIwLCAweDQ4LCAweDYwLCAweDZjfSwKLQkweDAwLAotCXsweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwfQotfTsKLQotY29uc3Qgd2xjX3JhdGVzZXRfdCBjY2tfb2ZkbV9yYXRlcyA9IHsKLQkxMiwKLQl7CQkJLyogICAgMWIsICAgMmIsICAgNS41YiwgNiwgICAgOSwgICAgMTFiLCAgMTIsICAgMTgsICAgMjQsICAgMzYsICAgNDgsICAgNTQgTWJwcyAqLwotCSAweDgyLCAweDg0LCAweDhiLCAweDBjLCAweDEyLCAweDk2LCAweDE4LCAweDI0LCAweDMwLCAweDQ4LCAweDYwLAotCSAweDZjfSwKLQkweDAwLAotCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwfQotfTsKLQotY29uc3Qgd2xjX3JhdGVzZXRfdCBncGh5X2xlZ2FjeV9yYXRlcyA9IHsKLQk0LAotCXsJCQkvKiAgICAxYiwgICAyYiwgICA1LjViLCAgMTFiIE1icHMgKi8KLQkgMHg4MiwgMHg4NCwgMHg4YiwgMHg5Nn0sCi0JMHgwMCwKLQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0KLX07Ci0KLWNvbnN0IHdsY19yYXRlc2V0X3Qgb2ZkbV9yYXRlcyA9IHsKLQk4LAotCXsJCQkvKiAgICA2YiwgICA5LCAgICAxMmIsICAxOCwgICAyNGIsICAzNiwgICA0OCwgICA1NCBNYnBzICovCi0JIDB4OGMsIDB4MTIsIDB4OTgsIDB4MjQsIDB4YjAsIDB4NDgsIDB4NjAsIDB4NmN9LAotCTB4MDAsCi0JezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9Ci19OwotCi1jb25zdCB3bGNfcmF0ZXNldF90IGNja19yYXRlcyA9IHsKLQk0LAotCXsJCQkvKiAgICAxYiwgICAyYiwgICA1LjUsICAxMSBNYnBzICovCi0JIDB4ODIsIDB4ODQsIDB4MGIsIDB4MTZ9LAotCTB4MDAsCi0JezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9Ci19OwotCi0vKiBjaGVjayBpZiByYXRlc2V0IGlzIHZhbGlkLgotICogaWYgY2hlY2tfYnJhdGUgaXMgdHJ1ZSwgcmF0ZXNldCB3aXRob3V0IGEgYmFzaWMgcmF0ZSBpcyBjb25zaWRlcmVkIE5PVCB2YWxpZC4KLSAqLwotc3RhdGljIGJvb2wgYnJjbXNfY19yYXRlc2V0X3ZhbGlkKHdsY19yYXRlc2V0X3QgKnJzLCBib29sIGNoZWNrX2JyYXRlKQotewotCXVpbnQgaWR4OwotCi0JaWYgKCFycy0+Y291bnQpCi0JCXJldHVybiBmYWxzZTsKLQotCWlmICghY2hlY2tfYnJhdGUpCi0JCXJldHVybiB0cnVlOwotCi0JLyogZXJyb3IgaWYgbm8gYmFzaWMgcmF0ZXMgKi8KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IHJzLT5jb3VudDsgaWR4KyspIHsKLQkJaWYgKHJzLT5yYXRlc1tpZHhdICYgQlJDTVNfUkFURV9GTEFHKQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBicmNtc19jX3JhdGVzZXRfbWNzX3VwZCh3bGNfcmF0ZXNldF90ICpycywgdTggdHhzdHJlYW1zKQotewotCWludCBpOwotCWZvciAoaSA9IHR4c3RyZWFtczsgaSA8IE1BWF9TVFJFQU1TX1NVUFBPUlRFRDsgaSsrKQotCQlycy0+bWNzW2ldID0gMDsKLX0KLQotLyogZmlsdGVyIGJhc2VkIG9uIGhhcmR3YXJlIHJhdGVzZXQsIGFuZCBzb3J0IGZpbHRlcmVkIHJhdGVzZXQgd2l0aCBiYXNpYyBiaXQocykgcHJlc2VydmVkLAotICogYW5kIGNoZWNrIGlmIHJlc3VsdGluZyByYXRlc2V0IGlzIHZhbGlkLgotKi8KLWJvb2wKLWJyY21zX2NfcmF0ZV9od3JzX2ZpbHRlcl9zb3J0X3ZhbGlkYXRlKHdsY19yYXRlc2V0X3QgKnJzLAotCQkJCSAgIGNvbnN0IHdsY19yYXRlc2V0X3QgKmh3X3JzLAotCQkJCSAgIGJvb2wgY2hlY2tfYnJhdGUsIHU4IHR4c3RyZWFtcykKLXsKLQl1OCByYXRlc2V0W0JSQ01fTUFYUkFURSArIDFdOwotCXU4IHI7Ci0JdWludCBjb3VudDsKLQl1aW50IGk7Ci0KLQltZW1zZXQocmF0ZXNldCwgMCwgc2l6ZW9mKHJhdGVzZXQpKTsKLQljb3VudCA9IHJzLT5jb3VudDsKLQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCS8qIG1hc2sgb2ZmICJiYXNpYyByYXRlIiBiaXQsIEJSQ01TX1JBVEVfRkxBRyAqLwotCQlyID0gKGludClycy0+cmF0ZXNbaV0gJiBCUkNNU19SQVRFX01BU0s7Ci0JCWlmICgociA+IEJSQ01fTUFYUkFURSkgfHwgKHJhdGVfaW5mb1tyXSA9PSAwKSkKLQkJCWNvbnRpbnVlOwotCQlyYXRlc2V0W3JdID0gcnMtPnJhdGVzW2ldOwkvKiBwcmVzZXJ2ZSBiYXNpYyBiaXQhICovCi0JfQotCi0JLyogZmlsbCBvdXQgdGhlIHJhdGVzIGluIG9yZGVyLCBsb29raW5nIGF0IG9ubHkgc3VwcG9ydGVkIHJhdGVzICovCi0JY291bnQgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBod19ycy0+Y291bnQ7IGkrKykgewotCQlyID0gaHdfcnMtPnJhdGVzW2ldICYgQlJDTVNfUkFURV9NQVNLOwotCQlpZiAocmF0ZXNldFtyXSkKLQkJCXJzLT5yYXRlc1tjb3VudCsrXSA9IHJhdGVzZXRbcl07Ci0JfQotCi0JcnMtPmNvdW50ID0gY291bnQ7Ci0KLQkvKiBvbmx5IHNldCB0aGUgbWNzIHJhdGUgYml0IGlmIHRoZSBlcXVpdmFsZW50IGh3IG1jcyBiaXQgaXMgc2V0ICovCi0JZm9yIChpID0gMDsgaSA8IE1DU1NFVF9MRU47IGkrKykKLQkJcnMtPm1jc1tpXSA9IChycy0+bWNzW2ldICYgaHdfcnMtPm1jc1tpXSk7Ci0KLQlpZiAoYnJjbXNfY19yYXRlc2V0X3ZhbGlkKHJzLCBjaGVja19icmF0ZSkpCi0JCXJldHVybiB0cnVlOwotCWVsc2UKLQkJcmV0dXJuIGZhbHNlOwotfQotCi0vKiBjYWxjdWxhdGUgdGhlIHJhdGUgb2YgYSByeCdkIGZyYW1lIGFuZCByZXR1cm4gaXQgYXMgYSByYXRlc3BlYyAqLwotcmF0ZXNwZWNfdCBicmNtc19jX2NvbXB1dGVfcnNwZWMoc3RydWN0IGQxMXJ4aGRyICpyeGgsIHU4ICpwbGNwKQotewotCWludCBwaHlfdHlwZTsKLQlyYXRlc3BlY190IHJzcGVjID0gUEhZX1RYQzFfQldfMjBNSFogPDwgUlNQRUNfQldfU0hJRlQ7Ci0KLQlwaHlfdHlwZSA9Ci0JICAgICgocnhoLT5SeENoYW4gJiBSWFNfQ0hBTl9QSFlUWVBFX01BU0spID4+IFJYU19DSEFOX1BIWVRZUEVfU0hJRlQpOwotCi0JaWYgKChwaHlfdHlwZSA9PSBQSFlfVFlQRV9OKSB8fCAocGh5X3R5cGUgPT0gUEhZX1RZUEVfU1NOKSB8fAotCSAgICAocGh5X3R5cGUgPT0gUEhZX1RZUEVfTENOKSB8fCAocGh5X3R5cGUgPT0gUEhZX1RZUEVfSFQpKSB7Ci0JCXN3aXRjaCAocnhoLT5QaHlSeFN0YXR1c18wICYgUFJYUzBfRlRfTUFTSykgewotCQljYXNlIFBSWFMwX0NDSzoKLQkJCXJzcGVjID0KLQkJCSAgICBDQ0tfUEhZMk1BQ19SQVRFKAotCQkJCSgoc3RydWN0IGNja19waHlfaGRyICopIHBsY3ApLT5zaWduYWwpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUFJYUzBfT0ZETToKLQkJCXJzcGVjID0KLQkJCSAgICBPRkRNX1BIWTJNQUNfUkFURSgKLQkJCQkoKHN0cnVjdCBvZmRtX3BoeV9oZHIgKikgcGxjcCktPnJscHRbMF0pOwotCQkJYnJlYWs7Ci0JCWNhc2UgUFJYUzBfUFJFTjoKLQkJCXJzcGVjID0gKHBsY3BbMF0gJiBNSU1PX1BMQ1BfTUNTX01BU0spIHwgUlNQRUNfTUlNT1JBVEU7Ci0JCQlpZiAocGxjcFswXSAmIE1JTU9fUExDUF80ME1IWikgewotCQkJCS8qIGluZGljYXRlIHJzcGVjIGlzIGZvciA0MCBNSHogbW9kZSAqLwotCQkJCXJzcGVjICY9IH5SU1BFQ19CV19NQVNLOwotCQkJCXJzcGVjIHw9IChQSFlfVFhDMV9CV180ME1IWiA8PCBSU1BFQ19CV19TSElGVCk7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBQUlhTMF9TVEROOgotCQkJLyogZmFsbHRocnUgKi8KLQkJZGVmYXVsdDoKLQkJCS8qIG5vdCBzdXBwb3J0ZWQsIGVycm9yIGNvbmRpdGlvbiAqLwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKFBMQ1AzX0lTU0dJKHBsY3BbM10pKQotCQkJcnNwZWMgfD0gUlNQRUNfU0hPUlRfR0k7Ci0JfSBlbHNlCi0JICAgIGlmICgocGh5X3R5cGUgPT0gUEhZX1RZUEVfQSkgfHwgKHJ4aC0+UGh5UnhTdGF0dXNfMCAmIFBSWFMwX09GRE0pKQotCQlyc3BlYyA9IE9GRE1fUEhZMk1BQ19SQVRFKAotCQkJCSgoc3RydWN0IG9mZG1fcGh5X2hkciAqKSBwbGNwKS0+cmxwdFswXSk7Ci0JZWxzZQotCQlyc3BlYyA9IENDS19QSFkyTUFDX1JBVEUoCi0JCQkJKChzdHJ1Y3QgY2NrX3BoeV9oZHIgKikgcGxjcCktPnNpZ25hbCk7Ci0KLQlyZXR1cm4gcnNwZWM7Ci19Ci0KLS8qIGNvcHkgcmF0ZXNldCBzcmMgdG8gZHN0IGFzLWlzIChubyBtYXNraW5nIG9yIHNvcnRpbmcpICovCi12b2lkIGJyY21zX2NfcmF0ZXNldF9jb3B5KGNvbnN0IHdsY19yYXRlc2V0X3QgKnNyYywgd2xjX3JhdGVzZXRfdCAqZHN0KQotewotCW1lbWNweShkc3QsIHNyYywgc2l6ZW9mKHdsY19yYXRlc2V0X3QpKTsKLX0KLQotLyoKLSAqIENvcHkgYW5kIHNlbGVjdGl2ZWx5IGZpbHRlciBvbmUgcmF0ZXNldCB0byBhbm90aGVyLgotICogJ2Jhc2ljX29ubHknIG1lYW5zIG9ubHkgY29weSBiYXNpYyByYXRlcy4KLSAqICdyYXRlcycgaW5kaWNhdGVzIGNjayAoMTFiKSBhbmQgb2ZkbSByYXRlcyBjb21iaW5hdGlvbnMuCi0gKiAgICAtIDA6IGNjayBhbmQgb2ZkbQotICogICAgLSAxOiBjY2sgb25seQotICogICAgLSAyOiBvZmRtIG9ubHkKLSAqICd4bWFzaycgaXMgdGhlIGNvcHkgbWFzayAodHlwaWNhbGx5IDB4N2Ygb3IgMHhmZikuCi0gKi8KLXZvaWQKLWJyY21zX2NfcmF0ZXNldF9maWx0ZXIod2xjX3JhdGVzZXRfdCAqc3JjLCB3bGNfcmF0ZXNldF90ICpkc3QsIGJvb2wgYmFzaWNfb25seSwKLQkJICAgdTggcmF0ZXMsIHVpbnQgeG1hc2ssIGJvb2wgbWNzYWxsb3cpCi17Ci0JdWludCBpOwotCXVpbnQgcjsKLQl1aW50IGNvdW50OwotCi0JY291bnQgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBzcmMtPmNvdW50OyBpKyspIHsKLQkJciA9IHNyYy0+cmF0ZXNbaV07Ci0JCWlmIChiYXNpY19vbmx5ICYmICEociAmIEJSQ01TX1JBVEVfRkxBRykpCi0JCQljb250aW51ZTsKLQkJaWYgKHJhdGVzID09IEJSQ01TX1JBVEVTX0NDSyAmJiBJU19PRkRNKChyICYgQlJDTVNfUkFURV9NQVNLKSkpCi0JCQljb250aW51ZTsKLQkJaWYgKHJhdGVzID09IEJSQ01TX1JBVEVTX09GRE0gJiYgSVNfQ0NLKChyICYgQlJDTVNfUkFURV9NQVNLKSkpCi0JCQljb250aW51ZTsKLQkJZHN0LT5yYXRlc1tjb3VudCsrXSA9IHIgJiB4bWFzazsKLQl9Ci0JZHN0LT5jb3VudCA9IGNvdW50OwotCWRzdC0+aHRwaHlfbWVtYmVyc2hpcCA9IHNyYy0+aHRwaHlfbWVtYmVyc2hpcDsKLQotCWlmIChtY3NhbGxvdyAmJiByYXRlcyAhPSBCUkNNU19SQVRFU19DQ0spCi0JCW1lbWNweSgmZHN0LT5tY3NbMF0sICZzcmMtPm1jc1swXSwgTUNTU0VUX0xFTik7Ci0JZWxzZQotCQlicmNtc19jX3JhdGVzZXRfbWNzX2NsZWFyKGRzdCk7Ci19Ci0KLS8qIHNlbGVjdCByYXRlc2V0IGZvciBhIGdpdmVuIHBoeV90eXBlIGFuZCBiYW5kdHlwZSBhbmQgZmlsdGVyIGl0LCBzb3J0IGl0Ci0gKiBhbmQgZmlsbCByc190Z3Qgd2l0aCByZXN1bHQKLSAqLwotdm9pZAotYnJjbXNfY19yYXRlc2V0X2RlZmF1bHQod2xjX3JhdGVzZXRfdCAqcnNfdGd0LCBjb25zdCB3bGNfcmF0ZXNldF90ICpyc19odywKLQkJICAgIHVpbnQgcGh5X3R5cGUsIGludCBiYW5kdHlwZSwgYm9vbCBjY2tfb25seSwgdWludCByYXRlX21hc2ssCi0JCSAgICBib29sIG1jc2FsbG93LCB1OCBidywgdTggdHhzdHJlYW1zKQotewotCWNvbnN0IHdsY19yYXRlc2V0X3QgKnJzX2RmbHQ7Ci0Jd2xjX3JhdGVzZXRfdCByc19zZWw7Ci0JaWYgKChQSFlUWVBFX0lTKHBoeV90eXBlLCBQSFlfVFlQRV9IVCkpIHx8Ci0JICAgIChQSFlUWVBFX0lTKHBoeV90eXBlLCBQSFlfVFlQRV9OKSkgfHwKLQkgICAgKFBIWVRZUEVfSVMocGh5X3R5cGUsIFBIWV9UWVBFX0xDTikpIHx8Ci0JICAgIChQSFlUWVBFX0lTKHBoeV90eXBlLCBQSFlfVFlQRV9TU04pKSkgewotCQlpZiAoQkFORF81RyhiYW5kdHlwZSkpIHsKLQkJCXJzX2RmbHQgPSAoYncgPT0gQlJDTVNfMjBfTUhaID8KLQkJCQkgICAmb2ZkbV9taW1vX3JhdGVzIDogJm9mZG1fNDBid19taW1vX3JhdGVzKTsKLQkJfSBlbHNlIHsKLQkJCXJzX2RmbHQgPSAoYncgPT0gQlJDTVNfMjBfTUhaID8KLQkJCQkgICAmY2NrX29mZG1fbWltb19yYXRlcyA6Ci0JCQkJICAgJmNja19vZmRtXzQwYndfbWltb19yYXRlcyk7Ci0JCX0KLQl9IGVsc2UgaWYgKFBIWVRZUEVfSVMocGh5X3R5cGUsIFBIWV9UWVBFX0xQKSkgewotCQlyc19kZmx0ID0gKEJBTkRfNUcoYmFuZHR5cGUpKSA/ICZvZmRtX3JhdGVzIDogJmNja19vZmRtX3JhdGVzOwotCX0gZWxzZSBpZiAoUEhZVFlQRV9JUyhwaHlfdHlwZSwgUEhZX1RZUEVfQSkpIHsKLQkJcnNfZGZsdCA9ICZvZmRtX3JhdGVzOwotCX0gZWxzZSBpZiAoUEhZVFlQRV9JUyhwaHlfdHlwZSwgUEhZX1RZUEVfRykpIHsKLQkJcnNfZGZsdCA9ICZjY2tfb2ZkbV9yYXRlczsKLQl9IGVsc2UgewotCQkvKiBzaG91bGQgbm90IGhhcHBlbiwgZXJyb3IgY29uZGl0aW9uICovCi0JCXJzX2RmbHQgPSAmY2NrX3JhdGVzOwkvKiBmb3JjZSBjY2sgKi8KLQl9Ci0KLQkvKiBpZiBodyByYXRlc2V0IGlzIG5vdCBzdXBwbGllZCwgYXNzaWduIHNlbGVjdGVkIHJhdGVzZXQgdG8gaXQgKi8KLQlpZiAoIXJzX2h3KQotCQlyc19odyA9IHJzX2RmbHQ7Ci0KLQlicmNtc19jX3JhdGVzZXRfY29weShyc19kZmx0LCAmcnNfc2VsKTsKLQlicmNtc19jX3JhdGVzZXRfbWNzX3VwZCgmcnNfc2VsLCB0eHN0cmVhbXMpOwotCWJyY21zX2NfcmF0ZXNldF9maWx0ZXIoJnJzX3NlbCwgcnNfdGd0LCBmYWxzZSwKLQkJCSAgIGNja19vbmx5ID8gQlJDTVNfUkFURVNfQ0NLIDogQlJDTVNfUkFURVNfQ0NLX09GRE0sCi0JCQkgICByYXRlX21hc2ssIG1jc2FsbG93KTsKLQlicmNtc19jX3JhdGVfaHdyc19maWx0ZXJfc29ydF92YWxpZGF0ZShyc190Z3QsIHJzX2h3LCBmYWxzZSwKLQkJCQkJICAgbWNzYWxsb3cgPyB0eHN0cmVhbXMgOiAxKTsKLX0KLQotczE2IGJyY21zX2NfcmF0ZV9sZWdhY3lfcGh5Y3RsKHVpbnQgcmF0ZSkKLXsKLQl1aW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IExFR0FDWV9QSFlDRkdfVEFCTEVfU0laRTsgaSsrKQotCQlpZiAocmF0ZSA9PSBsZWdhY3lfcGh5Y2ZnX3RhYmxlW2ldLnJhdGVfb2ZkbSkKLQkJCXJldHVybiBsZWdhY3lfcGh5Y2ZnX3RhYmxlW2ldLnR4X3BoeV9jdGwzOwotCi0JcmV0dXJuIC0xOwotfQotCi12b2lkIGJyY21zX2NfcmF0ZXNldF9tY3NfY2xlYXIod2xjX3JhdGVzZXRfdCAqcmF0ZXNldCkKLXsKLQl1aW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IE1DU1NFVF9MRU47IGkrKykKLQkJcmF0ZXNldC0+bWNzW2ldID0gMDsKLX0KLQotdm9pZCBicmNtc19jX3JhdGVzZXRfbWNzX2J1aWxkKHdsY19yYXRlc2V0X3QgKnJhdGVzZXQsIHU4IHR4c3RyZWFtcykKLXsKLQltZW1jcHkoJnJhdGVzZXQtPm1jc1swXSwgJmNja19vZmRtX21pbW9fcmF0ZXMubWNzWzBdLCBNQ1NTRVRfTEVOKTsKLQlicmNtc19jX3JhdGVzZXRfbWNzX3VwZChyYXRlc2V0LCB0eHN0cmVhbXMpOwotfQotCi0vKiBCYXNlZCBvbiBiYW5kd2lkdGggcGFzc2VkLCBhbGxvdy9kaXNhbGxvdyBNQ1MgMzIgaW4gdGhlIHJhdGVzZXQgKi8KLXZvaWQgYnJjbXNfY19yYXRlc2V0X2J3X21jc19maWx0ZXIod2xjX3JhdGVzZXRfdCAqcmF0ZXNldCwgdTggYncpCi17Ci0JaWYgKGJ3ID09IEJSQ01TXzQwX01IWikKLQkJc2V0Yml0KHJhdGVzZXQtPm1jcywgMzIpOwotCWVsc2UKLQkJY2xyYml0KHJhdGVzZXQtPm1jcywgMzIpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9yYXRlLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3JhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmZDNlNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3JhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfQlJDTV9SQVRFX0hfCi0jZGVmaW5lIF9CUkNNX1JBVEVfSF8KLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLWV4dGVybiBjb25zdCB1OCByYXRlX2luZm9bXTsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgYnJjbXNfcmF0ZXNldCBjY2tfb2ZkbV9taW1vX3JhdGVzOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBicmNtc19yYXRlc2V0IG9mZG1fbWltb19yYXRlczsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgYnJjbXNfcmF0ZXNldCBjY2tfb2ZkbV9yYXRlczsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgYnJjbXNfcmF0ZXNldCBvZmRtX3JhdGVzOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBicmNtc19yYXRlc2V0IGNja19yYXRlczsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgYnJjbXNfcmF0ZXNldCBncGh5X2xlZ2FjeV9yYXRlczsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgYnJjbXNfcmF0ZXNldCB3bGNfbHJzX3JhdGVzOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBicmNtc19yYXRlc2V0IHJhdGVfbGltaXRfMV8yOwotCi1zdHJ1Y3QgYnJjbXNfbWNzX2luZm8gewotCXUzMiBwaHlfcmF0ZV8yMDsJLyogcGh5IHJhdGUgaW4ga2JwcyBbMjBNaHpdICovCi0JdTMyIHBoeV9yYXRlXzQwOwkvKiBwaHkgcmF0ZSBpbiBrYnBzIFs0ME1oel0gKi8KLQl1MzIgcGh5X3JhdGVfMjBfc2dpOwkvKiBwaHkgcmF0ZSBpbiBrYnBzIFsyME1oel0gd2l0aCBTR0kgKi8KLQl1MzIgcGh5X3JhdGVfNDBfc2dpOwkvKiBwaHkgcmF0ZSBpbiBrYnBzIFs0ME1oel0gd2l0aCBTR0kgKi8KLQl1OCB0eF9waHlfY3RsMzsJLyogcGh5IGN0bCBieXRlIDMsIGNvZGUgcmF0ZSwgbW9kdWxhdGlvbiB0eXBlLCAjIG9mIHN0cmVhbXMgKi8KLQl1OCBsZWdfb2ZkbTsJCS8qIG1hdGNoaW5nIGxlZ2FjeSBvZmRtIHJhdGUgaW4gNTAwYmtwcyAqLwotfTsKLQotI2RlZmluZSBCUkNNU19NQVhNQ1MJMzIJLyogbWF4IHZhbGlkIG1jcyBpbmRleCAqLwotI2RlZmluZSBNQ1NfVEFCTEVfU0laRQkzMwkvKiBOdW1iZXIgb2YgbWNzIGVudHJpZXMgaW4gdGhlIHRhYmxlICovCi1leHRlcm4gY29uc3Qgc3RydWN0IGJyY21zX21jc19pbmZvIG1jc190YWJsZVtdOwotCi0jZGVmaW5lIE1DU19JTlZBTElECTB4RkYKLSNkZWZpbmUgTUNTX0NSX01BU0sJMHgwNwkvKiBDb2RlIFJhdGUgYml0IG1hc2sgKi8KLSNkZWZpbmUgTUNTX01PRF9NQVNLCTB4MzgJLyogTW9kdWxhdGlvbiBiaXQgc2hpZnQgKi8KLSNkZWZpbmUgTUNTX01PRF9TSElGVAkzCS8qIE1PZHVsYXRpb24gYml0IHNoaWZ0ICovCi0jZGVmaW5lIE1DU19UWFNfTUFTSwkweGMwCS8qIG51bSB0eCBzdHJlYW1zIC0gMSBiaXQgbWFzayAqLwotI2RlZmluZSBNQ1NfVFhTX1NISUZUCTYJLyogbnVtIHR4IHN0cmVhbXMgLSAxIGJpdCBzaGlmdCAqLwotI2RlZmluZSBNQ1NfQ1IoX21jcykJKG1jc190YWJsZVtfbWNzXS50eF9waHlfY3RsMyAmIE1DU19DUl9NQVNLKQotI2RlZmluZSBNQ1NfTU9EKF9tY3MpCSgobWNzX3RhYmxlW19tY3NdLnR4X3BoeV9jdGwzICYgTUNTX01PRF9NQVNLKSA+PiBNQ1NfTU9EX1NISUZUKQotI2RlZmluZSBNQ1NfVFhTKF9tY3MpCSgobWNzX3RhYmxlW19tY3NdLnR4X3BoeV9jdGwzICYgTUNTX1RYU19NQVNLKSA+PiBNQ1NfVFhTX1NISUZUKQotI2RlZmluZSBNQ1NfUkFURShfbWNzLCBfaXM0MCwgX3NnaSkJKF9zZ2kgPyBcCi0JKF9pczQwID8gbWNzX3RhYmxlW19tY3NdLnBoeV9yYXRlXzQwX3NnaSA6IG1jc190YWJsZVtfbWNzXS5waHlfcmF0ZV8yMF9zZ2kpIDogXAotCShfaXM0MCA/IG1jc190YWJsZVtfbWNzXS5waHlfcmF0ZV80MCA6IG1jc190YWJsZVtfbWNzXS5waHlfcmF0ZV8yMCkpCi0jZGVmaW5lIFZBTElEX01DUyhfbWNzKQkoKF9tY3MgPCBNQ1NfVEFCTEVfU0laRSkpCi0KLS8qIE1hY3JvIHRvIHVzZSB0aGUgcmF0ZV9pbmZvIHRhYmxlICovCi0jZGVmaW5lCUJSQ01TX1JBVEVfTUFTS19GVUxMIDB4ZmYgLyogUmF0ZSB2YWx1ZSBtYXNrIHdpdGggYmFzaWMgcmF0ZSBmbGFnICovCi0KLS8qIGNvbnZlcnQgNTAwa2JwcyB0byBicHMgKi8KLSNkZWZpbmUgQlJDTVNfUkFURV81MDBLX1RPX0JQUyhyYXRlKQkoKHJhdGUpICogNTAwMDAwKQotCi0vKiByYXRlIHNwZWMgOiBob2xkcyByYXRlIGFuZCBtb2RlIHNwZWNpZmljIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGdlbmVyYXRlIGEgdHggZnJhbWUuICovCi0vKiBMZWdhY3kgQ0NLIGFuZCBPRkRNIGluZm9ybWF0aW9uIGlzIGhlbGQgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHdhcyBkb25lIGluIHRoZSBwYXN0ICAgICovCi0vKiAoaW4gdGhlIGxvd2VyIGJ5dGUpIHRoZSB1cHBlciAzIGJ5dGVzIHByaW1hcmlseSBob2xkIE1JTU8gc3BlY2lmaWMgaW5mb3JtYXRpb24gICAgICAgICovCi0KLS8qIHJhdGUgc3BlYyBiaXQgZmllbGRzICovCi0jZGVmaW5lIFJTUEVDX1JBVEVfTUFTSwkJMHgwMDAwMDA3RgkvKiBFaXRoZXIgNTAwS2JwcyB1bml0cyBvciBNSU1PIE1DUyBpZHggKi8KLSNkZWZpbmUgUlNQRUNfTUlNT1JBVEUJCTB4MDgwMDAwMDAJLyogbWltbyBNQ1MgaXMgc3RvcmVkIGluIFJTUEVDX1JBVEVfTUFTSyAqLwotI2RlZmluZSBSU1BFQ19CV19NQVNLCQkweDAwMDAwNzAwCS8qIG1pbW8gYncgbWFzayAqLwotI2RlZmluZSBSU1BFQ19CV19TSElGVAkJOAkvKiBtaW1vIGJ3IHNoaWZ0ICovCi0jZGVmaW5lIFJTUEVDX1NURl9NQVNLCQkweDAwMDAzODAwCS8qIG1pbW8gU3BhY2UvVGltZS9GcmVxdWVuY3kgbW9kZSBtYXNrICovCi0jZGVmaW5lIFJTUEVDX1NURl9TSElGVAkJMTEJLyogbWltbyBTcGFjZS9UaW1lL0ZyZXF1ZW5jeSBtb2RlIHNoaWZ0ICovCi0jZGVmaW5lIFJTUEVDX0NUX01BU0sJCTB4MDAwMEMwMDAJLyogbWltbyBjb2RpbmcgdHlwZSBtYXNrICovCi0jZGVmaW5lIFJTUEVDX0NUX1NISUZUCQkxNAkvKiBtaW1vIGNvZGluZyB0eXBlIHNoaWZ0ICovCi0jZGVmaW5lIFJTUEVDX1NUQ19NQVNLCQkweDAwMzAwMDAwCS8qIG1pbW8gbnVtIFNUQyBzdHJlYW1zIHBlciBQTENQIGRlZm4uICovCi0jZGVmaW5lIFJTUEVDX1NUQ19TSElGVAkJMjAJLyogbWltbyBudW0gU1RDIHN0cmVhbXMgcGVyIFBMQ1AgZGVmbi4gKi8KLSNkZWZpbmUgUlNQRUNfTERQQ19DT0RJTkcJMHgwMDQwMDAwMAkvKiBtaW1vIGJpdCBpbmRpY2F0ZXMgYWR2IGNvZGluZyBpbiB1c2UgKi8KLSNkZWZpbmUgUlNQRUNfU0hPUlRfR0kJCTB4MDA4MDAwMDAJLyogbWltbyBiaXQgaW5kaWNhdGVzIHNob3J0IEdJIGluIHVzZSAqLwotI2RlZmluZSBSU1BFQ19PVkVSUklERQkJMHg4MDAwMDAwMAkvKiBiaXQgaW5kaWNhdGVzIG92ZXJyaWRlIGJvdGggcmF0ZSAmIG1vZGUgKi8KLSNkZWZpbmUgUlNQRUNfT1ZFUlJJREVfTUNTX09OTFkgMHg0MDAwMDAwMAkvKiBiaXQgaW5kaWNhdGVzIG92ZXJyaWRlIHJhdGUgb25seSAqLwotCi0jZGVmaW5lIEJSQ01TX0hUUEhZCQkxMjcJLyogSFQgUEhZIE1lbWJlcnNoaXAgKi8KLQotI2RlZmluZSBSU1BFQ19BQ1RJVkUocnNwZWMpCShyc3BlYyAmIChSU1BFQ19SQVRFX01BU0sgfCBSU1BFQ19NSU1PUkFURSkpCi0jZGVmaW5lIFJTUEVDMlJBVEUocnNwZWMpCSgocnNwZWMgJiBSU1BFQ19NSU1PUkFURSkgPyBcCi0JTUNTX1JBVEUoKHJzcGVjICYgUlNQRUNfUkFURV9NQVNLKSwgUlNQRUNfSVM0ME1IWihyc3BlYyksIFJTUEVDX0lTU0dJKHJzcGVjKSkgOiBcCi0JKHJzcGVjICYgUlNQRUNfUkFURV9NQVNLKSkKLS8qIHJldHVybiByYXRlIGluIHVuaXQgb2YgNTAwS2JwcyAtLSBmb3IgaW50ZXJuYWwgdXNlIGluIHdsY19yYXRlX3NlbC5jICovCi0jZGVmaW5lIFJTUEVDMlJBVEU1MDBLKHJzcGVjKQkoKHJzcGVjICYgUlNQRUNfTUlNT1JBVEUpID8gXAotCQlNQ1NfUkFURSgocnNwZWMgJiBSU1BFQ19SQVRFX01BU0spLCBzdGF0ZS0+aXM0MGJ3LCBSU1BFQ19JU1NHSShyc3BlYykpLzUwMCA6IFwKLQkJKHJzcGVjICYgUlNQRUNfUkFURV9NQVNLKSkKLSNkZWZpbmUgQ1JTUEVDMlJBVEU1MDBLKHJzcGVjKQkoKHJzcGVjICYgUlNQRUNfTUlNT1JBVEUpID8gXAotCQlNQ1NfUkFURSgocnNwZWMgJiBSU1BFQ19SQVRFX01BU0spLCBSU1BFQ19JUzQwTUhaKHJzcGVjKSwgUlNQRUNfSVNTR0kocnNwZWMpKS81MDAgOlwKLQkJKHJzcGVjICYgUlNQRUNfUkFURV9NQVNLKSkKLQotI2RlZmluZSBSU1BFQzJLQlBTKHJzcGVjKQkoSVNfTUNTKHJzcGVjKSA/IFJTUEVDMlJBVEUocnNwZWMpIDogUlNQRUMyUkFURShyc3BlYykqNTAwKQotI2RlZmluZSBSU1BFQ19QSFlUWEJZVEUyKHJzcGVjKQkoKHJzcGVjICYgMHhmZjAwKSA+PiA4KQotI2RlZmluZSBSU1BFQ19HRVRfQlcocnNwZWMpCSgocnNwZWMgJiBSU1BFQ19CV19NQVNLKSA+PiBSU1BFQ19CV19TSElGVCkKLSNkZWZpbmUgUlNQRUNfSVM0ME1IWihyc3BlYykJKCgoKHJzcGVjICYgUlNQRUNfQldfTUFTSykgPj4gUlNQRUNfQldfU0hJRlQpID09IFwKLQkJCQlQSFlfVFhDMV9CV180ME1IWikgfHwgKCgocnNwZWMgJiBSU1BFQ19CV19NQVNLKSA+PiBcCi0JCQkJUlNQRUNfQldfU0hJRlQpID09IFBIWV9UWEMxX0JXXzQwTUhaX0RVUCkpCi0jZGVmaW5lIFJTUEVDX0lTU0dJKHJzcGVjKQkoKHJzcGVjICYgUlNQRUNfU0hPUlRfR0kpID09IFJTUEVDX1NIT1JUX0dJKQotI2RlZmluZSBSU1BFQ19NSU1PUExDUDMocnNwZWMpCSgocnNwZWMgJiAweGYwMDAwMCkgPj4gMTYpCi0jZGVmaW5lIFBMQ1AzX0lTU0dJKHBsY3ApCShwbGNwICYgKFJTUEVDX1NIT1JUX0dJID4+IDE2KSkKLSNkZWZpbmUgUlNQRUNfU1RDKHJzcGVjKQkoKHJzcGVjICYgUlNQRUNfU1RDX01BU0spID4+IFJTUEVDX1NUQ19TSElGVCkKLSNkZWZpbmUgUlNQRUNfU1RGKHJzcGVjKQkoKHJzcGVjICYgUlNQRUNfU1RGX01BU0spID4+IFJTUEVDX1NURl9TSElGVCkKLSNkZWZpbmUgUExDUDNfSVNTVEJDKHBsY3ApCSgocGxjcCAmIChSU1BFQ19TVENfTUFTSykgPj4gMTYpID09IDB4MTApCi0jZGVmaW5lIFBMQ1AzX1NUQ19NQVNLICAgICAgICAgIDB4MzAKLSNkZWZpbmUgUExDUDNfU1RDX1NISUZUICAgICAgICAgNAotCi0vKiBSYXRlIGluZm8gdGFibGU7IHRha2VzIGEgbGVnYWN5IHJhdGUgb3IgcmF0ZXNwZWNfdCAqLwotI2RlZmluZQlJU19NQ1MocikJKHIgJiBSU1BFQ19NSU1PUkFURSkKLSNkZWZpbmUJSVNfT0ZETShyKQkoIUlTX01DUyhyKSAmJiAocmF0ZV9pbmZvWyhyKSAmIFJTUEVDX1JBVEVfTUFTS10gJiBcCi0JCQkJCUJSQ01TX1JBVEVfRkxBRykpCi0jZGVmaW5lCUlTX0NDSyhyKQkoIUlTX01DUyhyKSAmJiAoIFwKLQkJCSAoKHIpICYgQlJDTVNfUkFURV9NQVNLKSA9PSBCUkNNX1JBVEVfMU0gfHwgXAotCQkJICgocikgJiBCUkNNU19SQVRFX01BU0spID09IEJSQ01fUkFURV8yTSB8fCBcCi0JCQkgKChyKSAmIEJSQ01TX1JBVEVfTUFTSykgPT0gQlJDTV9SQVRFXzVNNSB8fCBcCi0JCQkgKChyKSAmIEJSQ01TX1JBVEVfTUFTSykgPT0gQlJDTV9SQVRFXzExTSkpCi0jZGVmaW5lIElTX1NJTkdMRV9TVFJFQU0obWNzKQkoKChtY3MpIDw9IEhJR0hFU1RfU0lOR0xFX1NUUkVBTV9NQ1MpIHx8ICgobWNzKSA9PSAzMikpCi0jZGVmaW5lIENDS19SU1BFQyhjY2spCQkoKGNjaykgJiBSU1BFQ19SQVRFX01BU0spCi0jZGVmaW5lIE9GRE1fUlNQRUMob2ZkbSkJKCgob2ZkbSkgJiBSU1BFQ19SQVRFX01BU0spIHxcCi0JKFBIWV9UWEMxX01PREVfQ0REIDw8IFJTUEVDX1NURl9TSElGVCkpCi0jZGVmaW5lIExFR0FDWV9SU1BFQyhyYXRlKQkoSVNfQ0NLKHJhdGUpID8gQ0NLX1JTUEVDKHJhdGUpIDogT0ZETV9SU1BFQyhyYXRlKSkKLQotI2RlZmluZSBNQ1NfUlNQRUMobWNzKQkJKCgobWNzKSAmIFJTUEVDX1JBVEVfTUFTSykgfCBSU1BFQ19NSU1PUkFURSB8IFwKLQkoSVNfU0lOR0xFX1NUUkVBTShtY3MpID8gKFBIWV9UWEMxX01PREVfQ0REIDw8IFJTUEVDX1NURl9TSElGVCkgOiBcCi0JKFBIWV9UWEMxX01PREVfU0RNIDw8IFJTUEVDX1NURl9TSElGVCkpKQotCi0vKiBDb252ZXJ0IGVuY29kZWQgcmF0ZSB2YWx1ZSBpbiBwbGNwIGhlYWRlciB0byBudW1lcmljYWwgcmF0ZXMgaW4gNTAwIEtIeiBpbmNyZW1lbnRzICovCi1leHRlcm4gY29uc3QgdTggb2ZkbV9yYXRlX2xvb2t1cFtdOwotI2RlZmluZSBPRkRNX1BIWTJNQUNfUkFURShybHB0KQkJKG9mZG1fcmF0ZV9sb29rdXBbcmxwdCAmIDB4N10pCi0jZGVmaW5lIENDS19QSFkyTUFDX1JBVEUoc2lnbmFsKQkoc2lnbmFsLzUpCi0KLS8qIFJhdGVzIHNwZWNpZmllZCBpbiBicmNtc19jX3JhdGVzZXRfZmlsdGVyKCkgKi8KLSNkZWZpbmUgQlJDTVNfUkFURVNfQ0NLX09GRE0JMAotI2RlZmluZSBCUkNNU19SQVRFU19DQ0sJCTEKLSNkZWZpbmUgQlJDTVNfUkFURVNfT0ZETQkJMgotCi0vKiBzYW5pdGl6ZSwgYW5kIHNvcnQgYSByYXRlc2V0IHdpdGggdGhlIGJhc2ljIGJpdChzKSBwcmVzZXJ2ZWQsIHZhbGlkYXRlIHJhdGVzZXQgKi8KLWV4dGVybiBib29sCi1icmNtc19jX3JhdGVfaHdyc19maWx0ZXJfc29ydF92YWxpZGF0ZShzdHJ1Y3QgYnJjbXNfcmF0ZXNldCAqcnMsCi0JCQkJICAgICAgIGNvbnN0IHN0cnVjdCBicmNtc19yYXRlc2V0ICpod19ycywKLQkJCQkgICAgICAgYm9vbCBjaGVja19icmF0ZSwgdTggdHhzdHJlYW1zKTsKLS8qIGNvcHkgcmF0ZXNldCBzcmMgdG8gZHN0IGFzLWlzIChubyBtYXNraW5nIG9yIHNvcnRpbmcpICovCi1leHRlcm4gdm9pZCBicmNtc19jX3JhdGVzZXRfY29weShjb25zdCBzdHJ1Y3QgYnJjbXNfcmF0ZXNldCAqc3JjLAotCQkJICAgICBzdHJ1Y3QgYnJjbXNfcmF0ZXNldCAqZHN0KTsKLQotLyogd291bGQgYmUgbmljZSB0byBoYXZlIHRoZXNlIGRvY3VtZW50ZWQgLi4uICovCi1leHRlcm4gcmF0ZXNwZWNfdCBicmNtc19jX2NvbXB1dGVfcnNwZWMoc3RydWN0IGQxMXJ4aGRyICpyeGgsIHU4ICpwbGNwKTsKLQotZXh0ZXJuIHZvaWQgYnJjbXNfY19yYXRlc2V0X2ZpbHRlcihzdHJ1Y3QgYnJjbXNfcmF0ZXNldCAqc3JjLAotCXN0cnVjdCBicmNtc19yYXRlc2V0ICpkc3QsIGJvb2wgYmFzaWNfb25seSwgdTggcmF0ZXMsIHVpbnQgeG1hc2ssCi0JYm9vbCBtY3NhbGxvdyk7Ci0KLWV4dGVybiB2b2lkCi1icmNtc19jX3JhdGVzZXRfZGVmYXVsdChzdHJ1Y3QgYnJjbXNfcmF0ZXNldCAqcnNfdGd0LAotCQkJY29uc3Qgc3RydWN0IGJyY21zX3JhdGVzZXQgKnJzX2h3LCB1aW50IHBoeV90eXBlLAotCQkJaW50IGJhbmR0eXBlLCBib29sIGNja19vbmx5LCB1aW50IHJhdGVfbWFzaywKLQkJCWJvb2wgbWNzYWxsb3csIHU4IGJ3LCB1OCB0eHN0cmVhbXMpOwotCi1leHRlcm4gczE2IGJyY21zX2NfcmF0ZV9sZWdhY3lfcGh5Y3RsKHVpbnQgcmF0ZSk7Ci0KLWV4dGVybiB2b2lkIGJyY21zX2NfcmF0ZXNldF9tY3NfdXBkKHN0cnVjdCBicmNtc19yYXRlc2V0ICpycywgdTggdHhzdHJlYW1zKTsKLWV4dGVybiB2b2lkIGJyY21zX2NfcmF0ZXNldF9tY3NfY2xlYXIoc3RydWN0IGJyY21zX3JhdGVzZXQgKnJhdGVzZXQpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19yYXRlc2V0X21jc19idWlsZChzdHJ1Y3QgYnJjbXNfcmF0ZXNldCAqcmF0ZXNldCwKLQkJCQkgICAgICB1OCB0eHN0cmVhbXMpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19yYXRlc2V0X2J3X21jc19maWx0ZXIoc3RydWN0IGJyY21zX3JhdGVzZXQgKnJhdGVzZXQsIHU4IGJ3KTsKLQotI2VuZGlmCQkJCS8qIF9CUkNNX1JBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvc2NiLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3NjYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmM4MzI4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvc2NiLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfQlJDTV9TQ0JfSF8KLSNkZWZpbmUgX0JSQ01fU0NCX0hfCi0KLSNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgotI2luY2x1ZGUgPGJyY211X3V0aWxzLmg+Ci0jaW5jbHVkZSA8ZGVmcy5oPgotI2luY2x1ZGUgInR5cGVzLmgiCi0KLSNkZWZpbmUgQU1QRFVfVFhfQkFfTUFYX1dTSVpFCTY0CS8qIG1heCBUeCBiYSB3aW5kb3cgc2l6ZSAoaW4gcGR1KSAqLwotLyogc3RydWN0dXJlIHRvIHN0b3JlIHBlci10aWQgc3RhdGUgZm9yIHRoZSBhbXBkdSBpbml0aWF0b3IgKi8KLXN0cnVjdCBzY2JfYW1wZHVfdGlkX2luaSB7Ci0JdTggdHhfaW5fdHJhbnNpdDsJLyogbnVtYmVyIG9mIHBlbmRpbmcgbXBkdXMgaW4gdHJhbnNpdCBpbiBkcml2ZXIgKi8KLQl1OCB0aWQ7CQkvKiBpbml0aWF0b3IgdGlkIGZvciBlYXN5IGxvb2t1cCAqLwotCXU4IHR4cmV0cnlbQU1QRFVfVFhfQkFfTUFYX1dTSVpFXTsJLyogdHggcmV0cnkgY291bnQ7IGluZGV4ZWQgYnkgc2VxIG1vZHVsbyAqLwotCXN0cnVjdCBzY2IgKnNjYjsJLyogYmFja3B0ciBmb3IgZWFzeSBsb29rdXAgKi8KLQl1OCBiYV93c2l6ZTsJCS8qIG5lZ290aWF0ZWQgYmEgd2luZG93IHNpemUgKGluIHBkdSkgKi8KLX07Ci0KLSNkZWZpbmUgQU1QRFVfTUFYX1NDQl9USUQJTlVNUFJJTwotCi1zdHJ1Y3Qgc2NiX2FtcGR1IHsKLQlzdHJ1Y3Qgc2NiICpzY2I7CS8qIGJhY2sgcG9pbnRlciBmb3IgZWFzeSByZWZlcmVuY2UgKi8KLQl1OCBtcGR1X2RlbnNpdHk7CS8qIG1wZHUgZGVuc2l0eSAqLwotCXU4IG1heF9wZHU7CQkvKiBtYXggcGR1cyBhbGxvd2VkIGluIGFtcGR1ICovCi0JdTggcmVsZWFzZTsJCS8qICMgb2YgbXBkdXMgcmVsZWFzZWQgYXQgYSB0aW1lICovCi0JdTE2IG1pbl9sZW47CQkvKiBtaW4gbXBkdSBsZW4gdG8gc3VwcG9ydCB0aGUgZGVuc2l0eSAqLwotCXUzMiBtYXhfcnhfYW1wZHVfYnl0ZXM7CS8qIG1heCBhbXBkdSByY3YgbGVuZ3RoOyA4aywgMTZrLCAzMmssIDY0ayAqLwotCXN0cnVjdCBwa3RxIHR4cTsJLyogc2R1IHRyYW5zbWl0IHF1ZXVlIHBlbmRpbmcgYWdncmVnYXRpb24gKi8KLQotCS8qIFRoaXMgY291bGQgZWFzaWx5IGJlIGEgaW5pW10gcG9pbnRlciBhbmQgd2Uga2VlcCB0aGlzIGluZm8gaW4gd2wgaXRzZWxmIGluc3RlYWQKLQkgKiBvZiBoYXZpbmcgbWFjODAyMTEgaG9sZCBpdCBmb3IgdXMuICBBbHNvIGNvdWxkIGJlIG1hZGUgZHluYW1pYyBwZXIgdGlkIGluc3RlYWQgb2YKLQkgKiBzdGF0aWMuCi0JICovCi0JLyogaW5pdGlhdG9yIGluZm8gLSBwZXIgdGlkIChOVU1QUklPKTogKi8KLQlzdHJ1Y3Qgc2NiX2FtcGR1X3RpZF9pbmkgaW5pW0FNUERVX01BWF9TQ0JfVElEXTsKLX07Ci0KLSNkZWZpbmUgU0NCX01BR0lDCTB4YmVlZmNhZmUKLQotLyogc3RhdGlvbiBjb250cm9sIGJsb2NrIC0gb25lIHBlciByZW1vdGUgTUFDIGFkZHJlc3MgKi8KLXN0cnVjdCBzY2IgewotCXUzMiBtYWdpYzsKLQl1MzIgZmxhZ3M7CQkvKiB2YXJpb3VzIGJpdCBmbGFncyBhcyBkZWZpbmVkIGJlbG93ICovCi0JdTMyIGZsYWdzMjsJCS8qIHZhcmlvdXMgYml0IGZsYWdzMiBhcyBkZWZpbmVkIGJlbG93ICovCi0JdTggc3RhdGU7CQkvKiBjdXJyZW50IHN0YXRlIGJpdGZpZWxkIG9mIGF1dGgvYXNzb2MgcHJvY2VzcyAqLwotCXU4IGVhW0VUSF9BTEVOXTsJLyogc3RhdGlvbiBhZGRyZXNzICovCi0Jdm9pZCAqZnJhZ2J1ZltOVU1QUklPXTsJLyogZGVmcmFnbWVudGF0aW9uIGJ1ZmZlciBwZXIgcHJpbyAqLwotCXVpbnQgZnJhZ3Jlc2lkW05VTVBSSU9dOwkvKiAjYnl0ZXMgdW51c2VkIGluIGZyYWcgYnVmZmVyIHBlciBwcmlvICovCi0KLQl1MTYgc2VxY3RsW05VTVBSSU9dOwkvKiBzZXFjdGwgb2YgbGFzdCByZWNlaXZlZCBmcmFtZSAoZm9yIGR1cHMpICovCi0JdTE2IHNlcWN0bF9ub25xb3M7CS8qIHNlcWN0bCBvZiBsYXN0IHJlY2VpdmVkIGZyYW1lIChmb3IgZHVwcykgZm9yCi0JCQkJICogbm9uLVFvUyBkYXRhIGFuZCBtYW5hZ2VtZW50Ci0JCQkJICovCi0JdTE2IHNlcW51bVtOVU1QUklPXTsJLyogV01FOiBkcml2ZXIgbWFpbnRhaW5lZCBzdyBzZXFudW0gcGVyIHByaW9yaXR5ICovCi0KLQlzdHJ1Y3Qgc2NiX2FtcGR1IHNjYl9hbXBkdTsJLyogQU1QRFUgc3RhdGUgaW5jbHVkaW5nIHBlciB0aWQgaW5mbyAqLwotfTsKLQotLyogc2NiIGZsYWdzICovCi0jZGVmaW5lIFNDQl9XTUVDQVAJCTB4MDA0MAkvKiBtYXkgT05MWSBiZSBzZXQgaWYgV01FX0VOQUIod2xjKSAqLwotI2RlZmluZSBTQ0JfSFRDQVAJCTB4MTAwMDAJLyogSFQgKE1JTU8pIGNhcGFibGUgZGV2aWNlICovCi0jZGVmaW5lIFNDQl9JUzQwCQkweDgwMDAwCS8qIDQwTUh6IGNhcGFibGUgKi8KLSNkZWZpbmUgU0NCX1NUQkNDQVAJCTB4NDAwMDAwMDAJLyogU1RCQyBDYXBhYmxlICovCi0jZGVmaW5lIFNDQl9XTUUoYSkJCSgoYSktPmZsYWdzICYgU0NCX1dNRUNBUCkvKiBpbXBsaWVzIFdNRV9FTkFCICovCi0jZGVmaW5lIFNDQl9TRVFOVU0oc2NiLCBwcmlvKQkoKHNjYiktPnNlcW51bVsocHJpbyldKQotI2RlZmluZSBTQ0JfUFMoYSkJCU5VTEwKLSNkZWZpbmUgU0NCX1NUQkNfQ0FQKGEpCQkoKGEpLT5mbGFncyAmIFNDQl9TVEJDQ0FQKQotI2RlZmluZSBTQ0JfQU1QRFUoYSkJCXRydWUKLSNlbmRpZgkJCQkvKiBfQlJDTV9TQ0JfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvc3JvbS5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9zcm9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzOTQ0MmUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9zcm9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0jaW5jbHVkZSA8Y2hpcGNvbW1vbi5oPgotI2luY2x1ZGUgPGJyY211X3V0aWxzLmg+Ci0jaW5jbHVkZSAibmljcGNpLmgiCi0jaW5jbHVkZSAiYWl1dGlscy5oIgotI2luY2x1ZGUgIm90cC5oIgotI2luY2x1ZGUgInNyb20uaCIKLQotI2RlZmluZSBTUk9NX09GRlNFVChzaWgpICgoc2loLT5jY3JldiA+IDMxKSA/IFwKLQkoKChzaWgtPmNjY2FwcyAmIENDX0NBUF9TUk9NKSA9PSAwKSA/IE5VTEwgOiBcCi0JICgodTggKiljdXJtYXAgKyBQQ0lfMTZLQjBfQ0NSRUdTX09GRlNFVCArIENDX1NST01fT1RQKSkgOiBcCi0JKCh1OCAqKWN1cm1hcCArIFBDSV9CQVIwX1NQUk9NX09GRlNFVCkpCi0KLSNpZiBkZWZpbmVkKEJDTURCRykKLSNkZWZpbmUgV1JJVEVfRU5BQkxFX0RFTEFZCTUwMAkvKiA1MDAgbXMgYWZ0ZXIgd3JpdGUgZW5hYmxlL2Rpc2FibGUgdG9nZ2xlICovCi0jZGVmaW5lIFdSSVRFX1dPUkRfREVMQVkJMjAJLyogMjAgbXMgYmV0d2VlbiBlYWNoIHdvcmQgd3JpdGUgKi8KLSNlbmRpZgotCi0vKiBNYXhpbXVtIHNyb206IDYgS2lsb2JpdHMgPT0gNzY4IGJ5dGVzICovCi0jZGVmaW5lCVNST01fTUFYCQk3NjgKLQotLyogUENJIGZpZWxkcyAqLwotI2RlZmluZSBQQ0lfRjBERVZJRAkJNDgKLQotI2RlZmluZQlTUk9NX1dPUkRTCQk2NAotCi0jZGVmaW5lCVNST01fU1NJRAkJMgotCi0jZGVmaW5lCVNST01fV0wxTEhNQVhQCQkyOQotCi0jZGVmaW5lCVNST01fV0wxTFBBQjAJCTMwCi0jZGVmaW5lCVNST01fV0wxTFBBQjEJCTMxCi0jZGVmaW5lCVNST01fV0wxTFBBQjIJCTMyCi0KLSNkZWZpbmUJU1JPTV9XTDFIUEFCMAkJMzMKLSNkZWZpbmUJU1JPTV9XTDFIUEFCMQkJMzQKLSNkZWZpbmUJU1JPTV9XTDFIUEFCMgkJMzUKLQotI2RlZmluZQlTUk9NX01BQ0hJX0lMMAkJMzYKLSNkZWZpbmUJU1JPTV9NQUNNSURfSUwwCQkzNwotI2RlZmluZQlTUk9NX01BQ0xPX0lMMAkJMzgKLSNkZWZpbmUJU1JPTV9NQUNISV9FVDEJCTQyCi0jZGVmaW5lCVNST01fTUFDTUlEX0VUMQkJNDMKLSNkZWZpbmUJU1JPTV9NQUNMT19FVDEJCTQ0Ci0jZGVmaW5lCVNST00zX01BQ0hJCQkzNwotI2RlZmluZQlTUk9NM19NQUNNSUQJCTM4Ci0jZGVmaW5lCVNST00zX01BQ0xPCQkzOQotCi0jZGVmaW5lCVNST01fQlhBUlNTSTJHCQk0MAotI2RlZmluZQlTUk9NX0JYQVJTU0k1RwkJNDEKLQotI2RlZmluZQlTUk9NX1RSSTUyRwkJNDIKLSNkZWZpbmUJU1JPTV9UUkk1R0hMCQk0MwotCi0jZGVmaW5lCVNST01fUlhQTzUyRwkJNDUKLQotI2RlZmluZQlTUk9NX0FBQlJFVgkJNDYKLS8qIEZpZWxkcyBpbiBBQUJSRVYgKi8KLSNkZWZpbmUJU1JPTV9CUl9NQVNLCQkweDAwZmYKLSNkZWZpbmUJU1JPTV9DQ19NQVNLCQkweDBmMDAKLSNkZWZpbmUJU1JPTV9DQ19TSElGVAkJOAotI2RlZmluZQlTUk9NX0FBMF9NQVNLCQkweDMwMDAKLSNkZWZpbmUJU1JPTV9BQTBfU0hJRlQJCTEyCi0jZGVmaW5lCVNST01fQUExX01BU0sJCTB4YzAwMAotI2RlZmluZQlTUk9NX0FBMV9TSElGVAkJMTQKLQotI2RlZmluZQlTUk9NX1dMMFBBQjAJCTQ3Ci0jZGVmaW5lCVNST01fV0wwUEFCMQkJNDgKLSNkZWZpbmUJU1JPTV9XTDBQQUIyCQk0OQotCi0jZGVmaW5lCVNST01fTEVEQkgxMAkJNTAKLSNkZWZpbmUJU1JPTV9MRURCSDMyCQk1MQotCi0jZGVmaW5lCVNST01fV0wxME1BWFAJCTUyCi0KLSNkZWZpbmUJU1JPTV9XTDFQQUIwCQk1MwotI2RlZmluZQlTUk9NX1dMMVBBQjEJCTU0Ci0jZGVmaW5lCVNST01fV0wxUEFCMgkJNTUKLQotI2RlZmluZQlTUk9NX0lUVAkJNTYKLQotI2RlZmluZQlTUk9NX0JGTAkJNTcKLSNkZWZpbmUJU1JPTV9CRkwyCQkyOAotI2RlZmluZQlTUk9NM19CRkwyCQk2MQotCi0jZGVmaW5lCVNST01fQUcxMAkJNTgKLQotI2RlZmluZQlTUk9NX0NDT0RFCQk1OQotCi0jZGVmaW5lCVNST01fT1BPCQk2MAotCi0jZGVmaW5lCVNST00zX0xFRERDCQk2MgotCi0jZGVmaW5lCVNST01fQ1JDUkVWCQk2MwotCi0vKiBTUk9NIFJldiA0OiBSZWFsbG9jYXRlIHRoZSBzb2Z0d2FyZSBwYXJ0IG9mIHRoZSBzcm9tIHRvIGFjY29tbW9kYXRlCi0gKiBNSU1PIGZlYXR1cmVzLiBJdCBhc3N1bWVzIHVwIHRvIHR3byBQQ0lFIGZ1bmN0aW9ucyBhbmQgNDQwIGJ5dGVzCi0gKiBvZiB1c2FibGUgc3JvbSBpLmUuIHRoZSB1c2FibGUgc3RvcmFnZSBpbiBjaGlwcyB3aXRoIE9UUCB0aGF0Ci0gKiBpbXBsZW1lbnRzIGhhcmR3YXJlIHJlZHVuZGFuY3kuCi0gKi8KLQotI2RlZmluZQlTUk9NNF9XT1JEUwkJMjIwCi0KLSNkZWZpbmUJU1JPTTRfU0lHTgkJMzIKLSNkZWZpbmUJU1JPTTRfU0lHTkFUVVJFCQkweDUzNzIKLQotI2RlZmluZQlTUk9NNF9CUkVWCQkzMwotCi0jZGVmaW5lCVNST000X0JGTDAJCTM0Ci0jZGVmaW5lCVNST000X0JGTDEJCTM1Ci0jZGVmaW5lCVNST000X0JGTDIJCTM2Ci0jZGVmaW5lCVNST000X0JGTDMJCTM3Ci0jZGVmaW5lCVNST001X0JGTDAJCTM3Ci0jZGVmaW5lCVNST001X0JGTDEJCTM4Ci0jZGVmaW5lCVNST001X0JGTDIJCTM5Ci0jZGVmaW5lCVNST001X0JGTDMJCTQwCi0KLSNkZWZpbmUJU1JPTTRfTUFDSEkJCTM4Ci0jZGVmaW5lCVNST000X01BQ01JRAkJMzkKLSNkZWZpbmUJU1JPTTRfTUFDTE8JCTQwCi0jZGVmaW5lCVNST001X01BQ0hJCQk0MQotI2RlZmluZQlTUk9NNV9NQUNNSUQJCTQyCi0jZGVmaW5lCVNST001X01BQ0xPCQk0MwotCi0jZGVmaW5lCVNST000X0NDT0RFCQk0MQotI2RlZmluZQlTUk9NNF9SRUdSRVYJCTQyCi0jZGVmaW5lCVNST001X0NDT0RFCQkzNAotI2RlZmluZQlTUk9NNV9SRUdSRVYJCTM1Ci0KLSNkZWZpbmUJU1JPTTRfTEVEQkgxMAkJNDMKLSNkZWZpbmUJU1JPTTRfTEVEQkgzMgkJNDQKLSNkZWZpbmUJU1JPTTVfTEVEQkgxMAkJNTkKLSNkZWZpbmUJU1JPTTVfTEVEQkgzMgkJNjAKLQotI2RlZmluZQlTUk9NNF9MRUREQwkJNDUKLSNkZWZpbmUJU1JPTTVfTEVEREMJCTQ1Ci0KLSNkZWZpbmUJU1JPTTRfQUEJCTQ2Ci0KLSNkZWZpbmUJU1JPTTRfQUcxMAkJNDcKLSNkZWZpbmUJU1JPTTRfQUczMgkJNDgKLQotI2RlZmluZQlTUk9NNF9UWFBJRDJHCQk0OQotI2RlZmluZQlTUk9NNF9UWFBJRDVHCQk1MQotI2RlZmluZQlTUk9NNF9UWFBJRDVHTAkJNTMKLSNkZWZpbmUJU1JPTTRfVFhQSUQ1R0gJCTU1Ci0KLSNkZWZpbmUgU1JPTTRfVFhSWEMJCTYxCi0jZGVmaW5lIFNST000X1RYQ0hBSU5fTUFTSwkweDAwMGYKLSNkZWZpbmUgU1JPTTRfVFhDSEFJTl9TSElGVAkwCi0jZGVmaW5lIFNST000X1JYQ0hBSU5fTUFTSwkweDAwZjAKLSNkZWZpbmUgU1JPTTRfUlhDSEFJTl9TSElGVAk0Ci0jZGVmaW5lIFNST000X1NXSVRDSF9NQVNLCTB4ZmYwMAotI2RlZmluZSBTUk9NNF9TV0lUQ0hfU0hJRlQJOAotCi0vKiBQZXItcGF0aCBmaWVsZHMgKi8KLSNkZWZpbmUJTUFYX1BBVEhfU1JPTQkJNAotI2RlZmluZQlTUk9NNF9QQVRIMAkJNjQKLSNkZWZpbmUJU1JPTTRfUEFUSDEJCTg3Ci0jZGVmaW5lCVNST000X1BBVEgyCQkxMTAKLSNkZWZpbmUJU1JPTTRfUEFUSDMJCTEzMwotCi0jZGVmaW5lCVNST000XzJHX0lUVF9NQVhQCTAKLSNkZWZpbmUJU1JPTTRfMkdfUEEJCTEKLSNkZWZpbmUJU1JPTTRfNUdfSVRUX01BWFAJNQotI2RlZmluZQlTUk9NNF81R0xIX01BWFAJCTYKLSNkZWZpbmUJU1JPTTRfNUdfUEEJCTcKLSNkZWZpbmUJU1JPTTRfNUdMX1BBCQkxMQotI2RlZmluZQlTUk9NNF81R0hfUEEJCTE1Ci0KLS8qIEFsbCB0aGUgbWlyaWFkIHBvd2VyIG9mZnNldHMgKi8KLSNkZWZpbmUJU1JPTTRfMkdfQ0NLUE8JCTE1NgotI2RlZmluZQlTUk9NNF8yR19PRkRNUE8JCTE1NwotI2RlZmluZQlTUk9NNF81R19PRkRNUE8JCTE1OQotI2RlZmluZQlTUk9NNF81R0xfT0ZETVBPCTE2MQotI2RlZmluZQlTUk9NNF81R0hfT0ZETVBPCTE2MwotI2RlZmluZQlTUk9NNF8yR19NQ1NQTwkJMTY1Ci0jZGVmaW5lCVNST000XzVHX01DU1BPCQkxNzMKLSNkZWZpbmUJU1JPTTRfNUdMX01DU1BPCQkxODEKLSNkZWZpbmUJU1JPTTRfNUdIX01DU1BPCQkxODkKLSNkZWZpbmUJU1JPTTRfQ0REUE8JCTE5NwotI2RlZmluZQlTUk9NNF9TVEJDUE8JCTE5OAotI2RlZmluZQlTUk9NNF9CVzQwUE8JCTE5OQotI2RlZmluZQlTUk9NNF9CV0RVUFBPCQkyMDAKLQotI2RlZmluZQlTUk9NNF9DUkNSRVYJCTIxOQotCi0vKiBTUk9NIFJldiA4OiBNYWtlIHNwYWNlIGZvciBhIDQ4d29yZCBoYXJkd2FyZSBoZWFkZXIgZm9yIFBDSWUgcmV2ID49IDYuCi0gKiBUaGlzIGlzIGFjb21iaW5lZCBzcm9tIGZvciBib3RoIE1JTU8gYW5kIFNJU08gYm9hcmRzLCB1c2FibGUgaW4KLSAqIHRoZSAuMTMwIDRLaWxvYml0IE9UUCB3aXRoIGhhcmR3YXJlIHJlZHVuZGFuY3kuCi0gKi8KLSNkZWZpbmUJU1JPTThfQlJFVgkJNjUKLQotI2RlZmluZQlTUk9NOF9CRkwwCQk2NgotI2RlZmluZQlTUk9NOF9CRkwxCQk2NwotI2RlZmluZQlTUk9NOF9CRkwyCQk2OAotI2RlZmluZQlTUk9NOF9CRkwzCQk2OQotCi0jZGVmaW5lCVNST004X01BQ0hJCQk3MAotI2RlZmluZQlTUk9NOF9NQUNNSUQJCTcxCi0jZGVmaW5lCVNST004X01BQ0xPCQk3MgotCi0jZGVmaW5lCVNST004X0NDT0RFCQk3MwotI2RlZmluZQlTUk9NOF9SRUdSRVYJCTc0Ci0KLSNkZWZpbmUJU1JPTThfTEVEQkgxMAkJNzUKLSNkZWZpbmUJU1JPTThfTEVEQkgzMgkJNzYKLQotI2RlZmluZQlTUk9NOF9MRUREQwkJNzcKLQotI2RlZmluZQlTUk9NOF9BQQkJNzgKLQotI2RlZmluZQlTUk9NOF9BRzEwCQk3OQotI2RlZmluZQlTUk9NOF9BRzMyCQk4MAotCi0jZGVmaW5lCVNST004X1RYUlhDCQk4MQotCi0jZGVmaW5lCVNST004X0JYQVJTU0kyRwkJODIKLSNkZWZpbmUJU1JPTThfQlhBUlNTSTVHCQk4MwotI2RlZmluZQlTUk9NOF9UUkk1MkcJCTg0Ci0jZGVmaW5lCVNST004X1RSSTVHSEwJCTg1Ci0jZGVmaW5lCVNST004X1JYUE81MkcJCTg2Ci0KLSNkZWZpbmUgU1JPTThfRkVNMkcJCTg3Ci0jZGVmaW5lIFNST004X0ZFTTVHCQk4OAotI2RlZmluZSBTUk9NOF9GRU1fQU5UU1dMVVRfTUFTSwkJMHhmODAwCi0jZGVmaW5lIFNST004X0ZFTV9BTlRTV0xVVF9TSElGVAkxMQotI2RlZmluZSBTUk9NOF9GRU1fVFJfSVNPX01BU0sJCTB4MDcwMAotI2RlZmluZSBTUk9NOF9GRU1fVFJfSVNPX1NISUZUCQk4Ci0jZGVmaW5lIFNST004X0ZFTV9QREVUX1JBTkdFX01BU0sJMHgwMGY4Ci0jZGVmaW5lIFNST004X0ZFTV9QREVUX1JBTkdFX1NISUZUCTMKLSNkZWZpbmUgU1JPTThfRkVNX0VYVFBBX0dBSU5fTUFTSwkweDAwMDYKLSNkZWZpbmUgU1JPTThfRkVNX0VYVFBBX0dBSU5fU0hJRlQJMQotI2RlZmluZSBTUk9NOF9GRU1fVFNTSVBPU19NQVNLCQkweDAwMDEKLSNkZWZpbmUgU1JPTThfRkVNX1RTU0lQT1NfU0hJRlQJCTAKLQotI2RlZmluZSBTUk9NOF9USEVSTUFMCQk4OQotCi0vKiBUZW1wIHNlbnNlIHJlbGF0ZWQgZW50cmllcyAqLwotI2RlZmluZSBTUk9NOF9NUFdSX1JBV1RTCQk5MAotI2RlZmluZSBTUk9NOF9UU19TTFBfT1BUX0NPUlJYCTkxCi0vKiBGT0M6IGZyZWlxdWVuY3kgb2Zmc2V0IGNvcnJlY3Rpb24sIEhXSVE6IEgvVyBJT0NBTCBlbmFibGUsIElRU1dQOiBJUSBDQUwgc3dhcCBkaXNhYmxlICovCi0jZGVmaW5lIFNST004X0ZPQ19IV0lRX0lRU1dQCTkyCi0KLS8qIFRlbXBlcmF0dXJlIGRlbHRhIGZvciBQSFkgY2FsaWJyYXRpb24gKi8KLSNkZWZpbmUgU1JPTThfUEhZQ0FMX1RFTVBERUxUQQk5MwotCi0vKiBQZXItcGF0aCBvZmZzZXRzICYgZmllbGRzICovCi0jZGVmaW5lCVNST004X1BBVEgwCQk5NgotI2RlZmluZQlTUk9NOF9QQVRIMQkJMTEyCi0jZGVmaW5lCVNST004X1BBVEgyCQkxMjgKLSNkZWZpbmUJU1JPTThfUEFUSDMJCTE0NAotCi0jZGVmaW5lCVNST004XzJHX0lUVF9NQVhQCTAKLSNkZWZpbmUJU1JPTThfMkdfUEEJCTEKLSNkZWZpbmUJU1JPTThfNUdfSVRUX01BWFAJNAotI2RlZmluZQlTUk9NOF81R0xIX01BWFAJCTUKLSNkZWZpbmUJU1JPTThfNUdfUEEJCTYKLSNkZWZpbmUJU1JPTThfNUdMX1BBCQk5Ci0jZGVmaW5lCVNST004XzVHSF9QQQkJMTIKLQotLyogQWxsIHRoZSBtaXJpYWQgcG93ZXIgb2Zmc2V0cyAqLwotI2RlZmluZQlTUk9NOF8yR19DQ0tQTwkJMTYwCi0KLSNkZWZpbmUJU1JPTThfMkdfT0ZETVBPCQkxNjEKLSNkZWZpbmUJU1JPTThfNUdfT0ZETVBPCQkxNjMKLSNkZWZpbmUJU1JPTThfNUdMX09GRE1QTwkxNjUKLSNkZWZpbmUJU1JPTThfNUdIX09GRE1QTwkxNjcKLQotI2RlZmluZQlTUk9NOF8yR19NQ1NQTwkJMTY5Ci0jZGVmaW5lCVNST004XzVHX01DU1BPCQkxNzcKLSNkZWZpbmUJU1JPTThfNUdMX01DU1BPCQkxODUKLSNkZWZpbmUJU1JPTThfNUdIX01DU1BPCQkxOTMKLQotI2RlZmluZQlTUk9NOF9DRERQTwkJMjAxCi0jZGVmaW5lCVNST004X1NUQkNQTwkJMjAyCi0jZGVmaW5lCVNST004X0JXNDBQTwkJMjAzCi0jZGVmaW5lCVNST004X0JXRFVQUE8JCTIwNAotCi0vKiBTSVNPIFBBIHBhcmFtZXRlcnMgYXJlIGluIHRoZSBwYXRoMCBzcGFjZXMgKi8KLSNkZWZpbmUJU1JPTThfU0lTTwkJOTYKLQotLyogTGVnYWN5IG5hbWVzIGZvciBTSVNPIFBBIHBhcmFtdGVycyAqLwotI2RlZmluZQlTUk9NOF9XMF9JVFRNQVhQCShTUk9NOF9TSVNPICsgU1JPTThfMkdfSVRUX01BWFApCi0jZGVmaW5lCVNST004X1cwX1BBQjAJCShTUk9NOF9TSVNPICsgU1JPTThfMkdfUEEpCi0jZGVmaW5lCVNST004X1cwX1BBQjEJCShTUk9NOF9TSVNPICsgU1JPTThfMkdfUEEgKyAxKQotI2RlZmluZQlTUk9NOF9XMF9QQUIyCQkoU1JPTThfU0lTTyArIFNST004XzJHX1BBICsgMikKLSNkZWZpbmUJU1JPTThfVzFfSVRUTUFYUAkoU1JPTThfU0lTTyArIFNST004XzVHX0lUVF9NQVhQKQotI2RlZmluZQlTUk9NOF9XMV9NQVhQX0xDSEMJKFNST004X1NJU08gKyBTUk9NOF81R0xIX01BWFApCi0jZGVmaW5lCVNST004X1cxX1BBQjAJCShTUk9NOF9TSVNPICsgU1JPTThfNUdfUEEpCi0jZGVmaW5lCVNST004X1cxX1BBQjEJCShTUk9NOF9TSVNPICsgU1JPTThfNUdfUEEgKyAxKQotI2RlZmluZQlTUk9NOF9XMV9QQUIyCQkoU1JPTThfU0lTTyArIFNST004XzVHX1BBICsgMikKLSNkZWZpbmUJU1JPTThfVzFfUEFCMF9MQwkoU1JPTThfU0lTTyArIFNST004XzVHTF9QQSkKLSNkZWZpbmUJU1JPTThfVzFfUEFCMV9MQwkoU1JPTThfU0lTTyArIFNST004XzVHTF9QQSArIDEpCi0jZGVmaW5lCVNST004X1cxX1BBQjJfTEMJKFNST004X1NJU08gKyBTUk9NOF81R0xfUEEgKyAyKQotI2RlZmluZQlTUk9NOF9XMV9QQUIwX0hDCShTUk9NOF9TSVNPICsgU1JPTThfNUdIX1BBKQotI2RlZmluZQlTUk9NOF9XMV9QQUIxX0hDCShTUk9NOF9TSVNPICsgU1JPTThfNUdIX1BBICsgMSkKLSNkZWZpbmUJU1JPTThfVzFfUEFCMl9IQwkoU1JPTThfU0lTTyArIFNST004XzVHSF9QQSArIDIpCi0KLS8qIFNST00gUkVWIDkgKi8KLSNkZWZpbmUgU1JPTTlfMkdQT19DQ0tCVzIwCTE2MAotI2RlZmluZSBTUk9NOV8yR1BPX0NDS0JXMjBVTAkxNjEKLSNkZWZpbmUgU1JPTTlfMkdQT19MT0ZETUJXMjAJMTYyCi0jZGVmaW5lIFNST005XzJHUE9fTE9GRE1CVzIwVUwJMTY0Ci0KLSNkZWZpbmUgU1JPTTlfNUdMUE9fTE9GRE1CVzIwCTE2NgotI2RlZmluZSBTUk9NOV81R0xQT19MT0ZETUJXMjBVTAkxNjgKLSNkZWZpbmUgU1JPTTlfNUdNUE9fTE9GRE1CVzIwCTE3MAotI2RlZmluZSBTUk9NOV81R01QT19MT0ZETUJXMjBVTAkxNzIKLSNkZWZpbmUgU1JPTTlfNUdIUE9fTE9GRE1CVzIwCTE3NAotI2RlZmluZSBTUk9NOV81R0hQT19MT0ZETUJXMjBVTAkxNzYKLQotI2RlZmluZSBTUk9NOV8yR1BPX01DU0JXMjAJMTc4Ci0jZGVmaW5lIFNST005XzJHUE9fTUNTQlcyMFVMCTE4MAotI2RlZmluZSBTUk9NOV8yR1BPX01DU0JXNDAJMTgyCi0KLSNkZWZpbmUgU1JPTTlfNUdMUE9fTUNTQlcyMAkxODQKLSNkZWZpbmUgU1JPTTlfNUdMUE9fTUNTQlcyMFVMCTE4NgotI2RlZmluZSBTUk9NOV81R0xQT19NQ1NCVzQwCTE4OAotI2RlZmluZSBTUk9NOV81R01QT19NQ1NCVzIwCTE5MAotI2RlZmluZSBTUk9NOV81R01QT19NQ1NCVzIwVUwJMTkyCi0jZGVmaW5lIFNST005XzVHTVBPX01DU0JXNDAJMTk0Ci0jZGVmaW5lIFNST005XzVHSFBPX01DU0JXMjAJMTk2Ci0jZGVmaW5lIFNST005XzVHSFBPX01DU0JXMjBVTAkxOTgKLSNkZWZpbmUgU1JPTTlfNUdIUE9fTUNTQlc0MAkyMDAKLQotI2RlZmluZSBTUk9NOV9QT19NQ1MzMgkJMjAyCi0jZGVmaW5lIFNST005X1BPX0xPRkRNNDBEVVAJMjAzCi0KLS8qIFNST00gZmxhZ3MgKHNlZSBzcm9tdmFyX3QpICovCi0jZGVmaW5lIFNSRkxfTU9SRQkxCS8qIHZhbHVlIGNvbnRpbnVlcyBhcyBkZXNjcmliZWQgYnkgdGhlIG5leHQgZW50cnkgKi8KLSNkZWZpbmUJU1JGTF9OT0ZGUwkyCS8qIHZhbHVlIGJpdHMgY2FuJ3QgYmUgYWxsIG9uZSdzICovCi0jZGVmaW5lCVNSRkxfUFJIRVgJNAkvKiB2YWx1ZSBpcyBpbiBoZXhkZWNpbWFsIGZvcm1hdCAqLwotI2RlZmluZQlTUkZMX1BSU0lHTgk4CS8qIHZhbHVlIGlzIGluIHNpZ25lZCBkZWNpbWFsIGZvcm1hdCAqLwotI2RlZmluZQlTUkZMX0NDT0RFCTB4MTAJLyogdmFsdWUgaXMgaW4gY291bnRyeSBjb2RlIGZvcm1hdCAqLwotI2RlZmluZQlTUkZMX0VUSEFERFIJMHgyMAkvKiB2YWx1ZSBpcyBhbiBFdGhlcm5ldCBhZGRyZXNzICovCi0jZGVmaW5lIFNSRkxfTEVEREMJMHg0MAkvKiB2YWx1ZSBpcyBhbiBMRUQgZHV0eSBjeWNsZSAqLwotI2RlZmluZSBTUkZMX05PVkFSCTB4ODAJLyogZG8gbm90IGdlbmVyYXRlIGEgbnZyYW0gcGFyYW0sIGVudHJ5IGlzIGZvciBtZmdjICovCi0KLS8qIE1heC4gbnZyYW0gdmFyaWFibGUgdGFibGUgc2l6ZSAqLwotI2RlZmluZQlNQVhTWl9OVlJBTV9WQVJTCTQwOTYKLQotc3RydWN0IGJyY21zX3Nyb212YXIgewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JdTMyIHJldm1hc2s7Ci0JdTMyIGZsYWdzOwotCXUxNiBvZmY7Ci0JdTE2IG1hc2s7Ci19OwotCi1zdHJ1Y3QgYnJjbXNfdmFyYnVmIHsKLQljaGFyICpiYXNlOwkJLyogcG9pbnRlciB0byBidWZmZXIgYmFzZSAqLwotCWNoYXIgKmJ1ZjsJCS8qIHBvaW50ZXIgdG8gY3VycmVudCBwb3NpdGlvbiAqLwotCXVuc2lnbmVkIGludCBzaXplOwkvKiBjdXJyZW50IChyZXNpZHVhbCkgc2l6ZSBpbiBieXRlcyAqLwotfTsKLQotLyogQXNzdW1wdGlvbnM6Ci0gKiAtIEV0aGVybmV0IGFkZHJlc3Mgc3BhbnMgYWNyb3NzIDMgY29uc2VjdGl2ZSB3b3JkcwotICoKLSAqIFRhYmxlIHJ1bGVzOgotICogLSBBZGQgbXVsdGlwbGUgZW50cmllcyBuZXh0IHRvIGVhY2ggb3RoZXIgaWYgYSB2YWx1ZSBzcGFucyBhY3Jvc3MgbXVsdGlwbGUgd29yZHMKLSAqICAgKGV2ZW4gbXVsdGlwbGUgZmllbGRzIGluIHRoZSBzYW1lIHdvcmQpIHdpdGggZWFjaCBlbnRyeSBleGNlcHQgdGhlIGxhc3QgaGF2aW5nCi0gKiAgIGl0J3MgU1JGTF9NT1JFIGJpdCBzZXQuCi0gKiAtIEV0aGVybmV0IGFkZHJlc3MgZW50cnkgZG9lcyBub3QgZm9sbG93IGFib3ZlIHJ1bGUgYW5kIG11c3Qgbm90IGhhdmUgU1JGTF9NT1JFCi0gKiAgIGJpdCBzZXQuIEl0cyBTUkZMX0VUSEFERFIgYml0IGltcGxpZXMgaXQgdGFrZXMgbXVsdGlwbGUgd29yZHMuCi0gKiAtIFRoZSBsYXN0IGVudHJ5J3MgbmFtZSBmaWVsZCBtdXN0IGJlIE5VTEwgdG8gaW5kaWNhdGUgdGhlIGVuZCBvZiB0aGUgdGFibGUuIE90aGVyCi0gKiAgIGVudHJpZXMgbXVzdCBoYXZlIG5vbi1OVUxMIG5hbWUuCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYnJjbXNfc3JvbXZhciBwY2lfc3JvbXZhcnNbXSA9IHsKLQl7ImRldmlkIiwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCB8IFNSRkxfTk9WQVIsIFBDSV9GMERFVklELCAweGZmZmZ9LAotCXsiYm9hcmRyZXYiLCAweDAwMDAwMDBlLCBTUkZMX1BSSEVYLCBTUk9NX0FBQlJFViwgU1JPTV9CUl9NQVNLfSwKLQl7ImJvYXJkcmV2IiwgMHgwMDAwMDBmMCwgU1JGTF9QUkhFWCwgU1JPTTRfQlJFViwgMHhmZmZmfSwKLQl7ImJvYXJkcmV2IiwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCwgU1JPTThfQlJFViwgMHhmZmZmfSwKLQl7ImJvYXJkZmxhZ3MiLCAweDAwMDAwMDAyLCBTUkZMX1BSSEVYLCBTUk9NX0JGTCwgMHhmZmZmfSwKLQl7ImJvYXJkZmxhZ3MiLCAweDAwMDAwMDA0LCBTUkZMX1BSSEVYIHwgU1JGTF9NT1JFLCBTUk9NX0JGTCwgMHhmZmZmfSwKLQl7IiIsIDAsIDAsIFNST01fQkZMMiwgMHhmZmZmfSwKLQl7ImJvYXJkZmxhZ3MiLCAweDAwMDAwMDA4LCBTUkZMX1BSSEVYIHwgU1JGTF9NT1JFLCBTUk9NX0JGTCwgMHhmZmZmfSwKLQl7IiIsIDAsIDAsIFNST00zX0JGTDIsIDB4ZmZmZn0sCi0JeyJib2FyZGZsYWdzIiwgMHgwMDAwMDAxMCwgU1JGTF9QUkhFWCB8IFNSRkxfTU9SRSwgU1JPTTRfQkZMMCwgMHhmZmZmfSwKLQl7IiIsIDAsIDAsIFNST000X0JGTDEsIDB4ZmZmZn0sCi0JeyJib2FyZGZsYWdzIiwgMHgwMDAwMDBlMCwgU1JGTF9QUkhFWCB8IFNSRkxfTU9SRSwgU1JPTTVfQkZMMCwgMHhmZmZmfSwKLQl7IiIsIDAsIDAsIFNST001X0JGTDEsIDB4ZmZmZn0sCi0JeyJib2FyZGZsYWdzIiwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCB8IFNSRkxfTU9SRSwgU1JPTThfQkZMMCwgMHhmZmZmfSwKLQl7IiIsIDAsIDAsIFNST004X0JGTDEsIDB4ZmZmZn0sCi0JeyJib2FyZGZsYWdzMiIsIDB4MDAwMDAwMTAsIFNSRkxfUFJIRVggfCBTUkZMX01PUkUsIFNST000X0JGTDIsIDB4ZmZmZn0sCi0JeyIiLCAwLCAwLCBTUk9NNF9CRkwzLCAweGZmZmZ9LAotCXsiYm9hcmRmbGFnczIiLCAweDAwMDAwMGUwLCBTUkZMX1BSSEVYIHwgU1JGTF9NT1JFLCBTUk9NNV9CRkwyLCAweGZmZmZ9LAotCXsiIiwgMCwgMCwgU1JPTTVfQkZMMywgMHhmZmZmfSwKLQl7ImJvYXJkZmxhZ3MyIiwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCB8IFNSRkxfTU9SRSwgU1JPTThfQkZMMiwgMHhmZmZmfSwKLQl7IiIsIDAsIDAsIFNST004X0JGTDMsIDB4ZmZmZn0sCi0JeyJib2FyZHR5cGUiLCAweGZmZmZmZmZjLCBTUkZMX1BSSEVYLCBTUk9NX1NTSUQsIDB4ZmZmZn0sCi0JeyJib2FyZG51bSIsIDB4MDAwMDAwMDYsIDAsIFNST01fTUFDTE9fSUwwLCAweGZmZmZ9LAotCXsiYm9hcmRudW0iLCAweDAwMDAwMDA4LCAwLCBTUk9NM19NQUNMTywgMHhmZmZmfSwKLQl7ImJvYXJkbnVtIiwgMHgwMDAwMDAxMCwgMCwgU1JPTTRfTUFDTE8sIDB4ZmZmZn0sCi0JeyJib2FyZG51bSIsIDB4MDAwMDAwZTAsIDAsIFNST001X01BQ0xPLCAweGZmZmZ9LAotCXsiYm9hcmRudW0iLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9NQUNMTywgMHhmZmZmfSwKLQl7ImNjIiwgMHgwMDAwMDAwMiwgMCwgU1JPTV9BQUJSRVYsIFNST01fQ0NfTUFTS30sCi0JeyJyZWdyZXYiLCAweDAwMDAwMDA4LCAwLCBTUk9NX09QTywgMHhmZjAwfSwKLQl7InJlZ3JldiIsIDB4MDAwMDAwMTAsIDAsIFNST000X1JFR1JFViwgMHgwMGZmfSwKLQl7InJlZ3JldiIsIDB4MDAwMDAwZTAsIDAsIFNST001X1JFR1JFViwgMHgwMGZmfSwKLQl7InJlZ3JldiIsIDB4ZmZmZmZmMDAsIDAsIFNST004X1JFR1JFViwgMHgwMGZmfSwKLQl7ImxlZGJoMCIsIDB4MDAwMDAwMGUsIFNSRkxfTk9GRlMsIFNST01fTEVEQkgxMCwgMHgwMGZmfSwKLQl7ImxlZGJoMSIsIDB4MDAwMDAwMGUsIFNSRkxfTk9GRlMsIFNST01fTEVEQkgxMCwgMHhmZjAwfSwKLQl7ImxlZGJoMiIsIDB4MDAwMDAwMGUsIFNSRkxfTk9GRlMsIFNST01fTEVEQkgzMiwgMHgwMGZmfSwKLQl7ImxlZGJoMyIsIDB4MDAwMDAwMGUsIFNSRkxfTk9GRlMsIFNST01fTEVEQkgzMiwgMHhmZjAwfSwKLQl7ImxlZGJoMCIsIDB4MDAwMDAwMTAsIFNSRkxfTk9GRlMsIFNST000X0xFREJIMTAsIDB4MDBmZn0sCi0JeyJsZWRiaDEiLCAweDAwMDAwMDEwLCBTUkZMX05PRkZTLCBTUk9NNF9MRURCSDEwLCAweGZmMDB9LAotCXsibGVkYmgyIiwgMHgwMDAwMDAxMCwgU1JGTF9OT0ZGUywgU1JPTTRfTEVEQkgzMiwgMHgwMGZmfSwKLQl7ImxlZGJoMyIsIDB4MDAwMDAwMTAsIFNSRkxfTk9GRlMsIFNST000X0xFREJIMzIsIDB4ZmYwMH0sCi0JeyJsZWRiaDAiLCAweDAwMDAwMGUwLCBTUkZMX05PRkZTLCBTUk9NNV9MRURCSDEwLCAweDAwZmZ9LAotCXsibGVkYmgxIiwgMHgwMDAwMDBlMCwgU1JGTF9OT0ZGUywgU1JPTTVfTEVEQkgxMCwgMHhmZjAwfSwKLQl7ImxlZGJoMiIsIDB4MDAwMDAwZTAsIFNSRkxfTk9GRlMsIFNST001X0xFREJIMzIsIDB4MDBmZn0sCi0JeyJsZWRiaDMiLCAweDAwMDAwMGUwLCBTUkZMX05PRkZTLCBTUk9NNV9MRURCSDMyLCAweGZmMDB9LAotCXsibGVkYmgwIiwgMHhmZmZmZmYwMCwgU1JGTF9OT0ZGUywgU1JPTThfTEVEQkgxMCwgMHgwMGZmfSwKLQl7ImxlZGJoMSIsIDB4ZmZmZmZmMDAsIFNSRkxfTk9GRlMsIFNST004X0xFREJIMTAsIDB4ZmYwMH0sCi0JeyJsZWRiaDIiLCAweGZmZmZmZjAwLCBTUkZMX05PRkZTLCBTUk9NOF9MRURCSDMyLCAweDAwZmZ9LAotCXsibGVkYmgzIiwgMHhmZmZmZmYwMCwgU1JGTF9OT0ZGUywgU1JPTThfTEVEQkgzMiwgMHhmZjAwfSwKLQl7InBhMGIwIiwgMHgwMDAwMDAwZSwgU1JGTF9QUkhFWCwgU1JPTV9XTDBQQUIwLCAweGZmZmZ9LAotCXsicGEwYjEiLCAweDAwMDAwMDBlLCBTUkZMX1BSSEVYLCBTUk9NX1dMMFBBQjEsIDB4ZmZmZn0sCi0JeyJwYTBiMiIsIDB4MDAwMDAwMGUsIFNSRkxfUFJIRVgsIFNST01fV0wwUEFCMiwgMHhmZmZmfSwKLQl7InBhMGl0c3NpdCIsIDB4MDAwMDAwMGUsIDAsIFNST01fSVRULCAweDAwZmZ9LAotCXsicGEwbWF4cHdyIiwgMHgwMDAwMDAwZSwgMCwgU1JPTV9XTDEwTUFYUCwgMHgwMGZmfSwKLQl7InBhMGIwIiwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCwgU1JPTThfVzBfUEFCMCwgMHhmZmZmfSwKLQl7InBhMGIxIiwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCwgU1JPTThfVzBfUEFCMSwgMHhmZmZmfSwKLQl7InBhMGIyIiwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCwgU1JPTThfVzBfUEFCMiwgMHhmZmZmfSwKLQl7InBhMGl0c3NpdCIsIDB4ZmZmZmZmMDAsIDAsIFNST004X1cwX0lUVE1BWFAsIDB4ZmYwMH0sCi0JeyJwYTBtYXhwd3IiLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9XMF9JVFRNQVhQLCAweDAwZmZ9LAotCXsib3BvIiwgMHgwMDAwMDAwYywgMCwgU1JPTV9PUE8sIDB4MDBmZn0sCi0JeyJvcG8iLCAweGZmZmZmZjAwLCAwLCBTUk9NOF8yR19PRkRNUE8sIDB4MDBmZn0sCi0JeyJhYTJnIiwgMHgwMDAwMDAwZSwgMCwgU1JPTV9BQUJSRVYsIFNST01fQUEwX01BU0t9LAotCXsiYWEyZyIsIDB4MDAwMDAwZjAsIDAsIFNST000X0FBLCAweDAwZmZ9LAotCXsiYWEyZyIsIDB4ZmZmZmZmMDAsIDAsIFNST004X0FBLCAweDAwZmZ9LAotCXsiYWE1ZyIsIDB4MDAwMDAwMGUsIDAsIFNST01fQUFCUkVWLCBTUk9NX0FBMV9NQVNLfSwKLQl7ImFhNWciLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9BQSwgMHhmZjAwfSwKLQl7ImFhNWciLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9BQSwgMHhmZjAwfSwKLQl7ImFnMCIsIDB4MDAwMDAwMGUsIDAsIFNST01fQUcxMCwgMHgwMGZmfSwKLQl7ImFnMSIsIDB4MDAwMDAwMGUsIDAsIFNST01fQUcxMCwgMHhmZjAwfSwKLQl7ImFnMCIsIDB4MDAwMDAwZjAsIDAsIFNST000X0FHMTAsIDB4MDBmZn0sCi0JeyJhZzEiLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9BRzEwLCAweGZmMDB9LAotCXsiYWcyIiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfQUczMiwgMHgwMGZmfSwKLQl7ImFnMyIsIDB4MDAwMDAwZjAsIDAsIFNST000X0FHMzIsIDB4ZmYwMH0sCi0JeyJhZzAiLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9BRzEwLCAweDAwZmZ9LAotCXsiYWcxIiwgMHhmZmZmZmYwMCwgMCwgU1JPTThfQUcxMCwgMHhmZjAwfSwKLQl7ImFnMiIsIDB4ZmZmZmZmMDAsIDAsIFNST004X0FHMzIsIDB4MDBmZn0sCi0JeyJhZzMiLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9BRzMyLCAweGZmMDB9LAotCXsicGExYjAiLCAweDAwMDAwMDBlLCBTUkZMX1BSSEVYLCBTUk9NX1dMMVBBQjAsIDB4ZmZmZn0sCi0JeyJwYTFiMSIsIDB4MDAwMDAwMGUsIFNSRkxfUFJIRVgsIFNST01fV0wxUEFCMSwgMHhmZmZmfSwKLQl7InBhMWIyIiwgMHgwMDAwMDAwZSwgU1JGTF9QUkhFWCwgU1JPTV9XTDFQQUIyLCAweGZmZmZ9LAotCXsicGExbG9iMCIsIDB4MDAwMDAwMGMsIFNSRkxfUFJIRVgsIFNST01fV0wxTFBBQjAsIDB4ZmZmZn0sCi0JeyJwYTFsb2IxIiwgMHgwMDAwMDAwYywgU1JGTF9QUkhFWCwgU1JPTV9XTDFMUEFCMSwgMHhmZmZmfSwKLQl7InBhMWxvYjIiLCAweDAwMDAwMDBjLCBTUkZMX1BSSEVYLCBTUk9NX1dMMUxQQUIyLCAweGZmZmZ9LAotCXsicGExaGliMCIsIDB4MDAwMDAwMGMsIFNSRkxfUFJIRVgsIFNST01fV0wxSFBBQjAsIDB4ZmZmZn0sCi0JeyJwYTFoaWIxIiwgMHgwMDAwMDAwYywgU1JGTF9QUkhFWCwgU1JPTV9XTDFIUEFCMSwgMHhmZmZmfSwKLQl7InBhMWhpYjIiLCAweDAwMDAwMDBjLCBTUkZMX1BSSEVYLCBTUk9NX1dMMUhQQUIyLCAweGZmZmZ9LAotCXsicGExaXRzc2l0IiwgMHgwMDAwMDAwZSwgMCwgU1JPTV9JVFQsIDB4ZmYwMH0sCi0JeyJwYTFtYXhwd3IiLCAweDAwMDAwMDBlLCAwLCBTUk9NX1dMMTBNQVhQLCAweGZmMDB9LAotCXsicGExbG9tYXhwd3IiLCAweDAwMDAwMDBjLCAwLCBTUk9NX1dMMUxITUFYUCwgMHhmZjAwfSwKLQl7InBhMWhpbWF4cHdyIiwgMHgwMDAwMDAwYywgMCwgU1JPTV9XTDFMSE1BWFAsIDB4MDBmZn0sCi0JeyJwYTFiMCIsIDB4ZmZmZmZmMDAsIFNSRkxfUFJIRVgsIFNST004X1cxX1BBQjAsIDB4ZmZmZn0sCi0JeyJwYTFiMSIsIDB4ZmZmZmZmMDAsIFNSRkxfUFJIRVgsIFNST004X1cxX1BBQjEsIDB4ZmZmZn0sCi0JeyJwYTFiMiIsIDB4ZmZmZmZmMDAsIFNSRkxfUFJIRVgsIFNST004X1cxX1BBQjIsIDB4ZmZmZn0sCi0JeyJwYTFsb2IwIiwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCwgU1JPTThfVzFfUEFCMF9MQywgMHhmZmZmfSwKLQl7InBhMWxvYjEiLCAweGZmZmZmZjAwLCBTUkZMX1BSSEVYLCBTUk9NOF9XMV9QQUIxX0xDLCAweGZmZmZ9LAotCXsicGExbG9iMiIsIDB4ZmZmZmZmMDAsIFNSRkxfUFJIRVgsIFNST004X1cxX1BBQjJfTEMsIDB4ZmZmZn0sCi0JeyJwYTFoaWIwIiwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCwgU1JPTThfVzFfUEFCMF9IQywgMHhmZmZmfSwKLQl7InBhMWhpYjEiLCAweGZmZmZmZjAwLCBTUkZMX1BSSEVYLCBTUk9NOF9XMV9QQUIxX0hDLCAweGZmZmZ9LAotCXsicGExaGliMiIsIDB4ZmZmZmZmMDAsIFNSRkxfUFJIRVgsIFNST004X1cxX1BBQjJfSEMsIDB4ZmZmZn0sCi0JeyJwYTFpdHNzaXQiLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9XMV9JVFRNQVhQLCAweGZmMDB9LAotCXsicGExbWF4cHdyIiwgMHhmZmZmZmYwMCwgMCwgU1JPTThfVzFfSVRUTUFYUCwgMHgwMGZmfSwKLQl7InBhMWxvbWF4cHdyIiwgMHhmZmZmZmYwMCwgMCwgU1JPTThfVzFfTUFYUF9MQ0hDLCAweGZmMDB9LAotCXsicGExaGltYXhwd3IiLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9XMV9NQVhQX0xDSEMsIDB4MDBmZn0sCi0JeyJieGEyZyIsIDB4MDAwMDAwMDgsIDAsIFNST01fQlhBUlNTSTJHLCAweDE4MDB9LAotCXsicnNzaXNhdjJnIiwgMHgwMDAwMDAwOCwgMCwgU1JPTV9CWEFSU1NJMkcsIDB4MDcwMH0sCi0JeyJyc3Npc21jMmciLCAweDAwMDAwMDA4LCAwLCBTUk9NX0JYQVJTU0kyRywgMHgwMGYwfSwKLQl7InJzc2lzbWYyZyIsIDB4MDAwMDAwMDgsIDAsIFNST01fQlhBUlNTSTJHLCAweDAwMGZ9LAotCXsiYnhhMmciLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9CWEFSU1NJMkcsIDB4MTgwMH0sCi0JeyJyc3Npc2F2MmciLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9CWEFSU1NJMkcsIDB4MDcwMH0sCi0JeyJyc3Npc21jMmciLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9CWEFSU1NJMkcsIDB4MDBmMH0sCi0JeyJyc3Npc21mMmciLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9CWEFSU1NJMkcsIDB4MDAwZn0sCi0JeyJieGE1ZyIsIDB4MDAwMDAwMDgsIDAsIFNST01fQlhBUlNTSTVHLCAweDE4MDB9LAotCXsicnNzaXNhdjVnIiwgMHgwMDAwMDAwOCwgMCwgU1JPTV9CWEFSU1NJNUcsIDB4MDcwMH0sCi0JeyJyc3Npc21jNWciLCAweDAwMDAwMDA4LCAwLCBTUk9NX0JYQVJTU0k1RywgMHgwMGYwfSwKLQl7InJzc2lzbWY1ZyIsIDB4MDAwMDAwMDgsIDAsIFNST01fQlhBUlNTSTVHLCAweDAwMGZ9LAotCXsiYnhhNWciLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9CWEFSU1NJNUcsIDB4MTgwMH0sCi0JeyJyc3Npc2F2NWciLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9CWEFSU1NJNUcsIDB4MDcwMH0sCi0JeyJyc3Npc21jNWciLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9CWEFSU1NJNUcsIDB4MDBmMH0sCi0JeyJyc3Npc21mNWciLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9CWEFSU1NJNUcsIDB4MDAwZn0sCi0JeyJ0cmkyZyIsIDB4MDAwMDAwMDgsIDAsIFNST01fVFJJNTJHLCAweDAwZmZ9LAotCXsidHJpNWciLCAweDAwMDAwMDA4LCAwLCBTUk9NX1RSSTUyRywgMHhmZjAwfSwKLQl7InRyaTVnbCIsIDB4MDAwMDAwMDgsIDAsIFNST01fVFJJNUdITCwgMHgwMGZmfSwKLQl7InRyaTVnaCIsIDB4MDAwMDAwMDgsIDAsIFNST01fVFJJNUdITCwgMHhmZjAwfSwKLQl7InRyaTJnIiwgMHhmZmZmZmYwMCwgMCwgU1JPTThfVFJJNTJHLCAweDAwZmZ9LAotCXsidHJpNWciLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9UUkk1MkcsIDB4ZmYwMH0sCi0JeyJ0cmk1Z2wiLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9UUkk1R0hMLCAweDAwZmZ9LAotCXsidHJpNWdoIiwgMHhmZmZmZmYwMCwgMCwgU1JPTThfVFJJNUdITCwgMHhmZjAwfSwKLQl7InJ4cG8yZyIsIDB4MDAwMDAwMDgsIFNSRkxfUFJTSUdOLCBTUk9NX1JYUE81MkcsIDB4MDBmZn0sCi0JeyJyeHBvNWciLCAweDAwMDAwMDA4LCBTUkZMX1BSU0lHTiwgU1JPTV9SWFBPNTJHLCAweGZmMDB9LAotCXsicnhwbzJnIiwgMHhmZmZmZmYwMCwgU1JGTF9QUlNJR04sIFNST004X1JYUE81MkcsIDB4MDBmZn0sCi0JeyJyeHBvNWciLCAweGZmZmZmZjAwLCBTUkZMX1BSU0lHTiwgU1JPTThfUlhQTzUyRywgMHhmZjAwfSwKLQl7InR4Y2hhaW4iLCAweDAwMDAwMGYwLCBTUkZMX05PRkZTLCBTUk9NNF9UWFJYQywgU1JPTTRfVFhDSEFJTl9NQVNLfSwKLQl7InJ4Y2hhaW4iLCAweDAwMDAwMGYwLCBTUkZMX05PRkZTLCBTUk9NNF9UWFJYQywgU1JPTTRfUlhDSEFJTl9NQVNLfSwKLQl7ImFudHN3aXRjaCIsIDB4MDAwMDAwZjAsIFNSRkxfTk9GRlMsIFNST000X1RYUlhDLCBTUk9NNF9TV0lUQ0hfTUFTS30sCi0JeyJ0eGNoYWluIiwgMHhmZmZmZmYwMCwgU1JGTF9OT0ZGUywgU1JPTThfVFhSWEMsIFNST000X1RYQ0hBSU5fTUFTS30sCi0JeyJyeGNoYWluIiwgMHhmZmZmZmYwMCwgU1JGTF9OT0ZGUywgU1JPTThfVFhSWEMsIFNST000X1JYQ0hBSU5fTUFTS30sCi0JeyJhbnRzd2l0Y2giLCAweGZmZmZmZjAwLCBTUkZMX05PRkZTLCBTUk9NOF9UWFJYQywgU1JPTTRfU1dJVENIX01BU0t9LAotCXsidHNzaXBvczJnIiwgMHhmZmZmZmYwMCwgMCwgU1JPTThfRkVNMkcsIFNST004X0ZFTV9UU1NJUE9TX01BU0t9LAotCXsiZXh0cGFnYWluMmciLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9GRU0yRywgU1JPTThfRkVNX0VYVFBBX0dBSU5fTUFTS30sCi0JeyJwZGV0cmFuZ2UyZyIsIDB4ZmZmZmZmMDAsIDAsIFNST004X0ZFTTJHLCBTUk9NOF9GRU1fUERFVF9SQU5HRV9NQVNLfSwKLQl7InRyaXNvMmciLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9GRU0yRywgU1JPTThfRkVNX1RSX0lTT19NQVNLfSwKLQl7ImFudHN3Y3RsMmciLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9GRU0yRywgU1JPTThfRkVNX0FOVFNXTFVUX01BU0t9LAotCXsidHNzaXBvczVnIiwgMHhmZmZmZmYwMCwgMCwgU1JPTThfRkVNNUcsIFNST004X0ZFTV9UU1NJUE9TX01BU0t9LAotCXsiZXh0cGFnYWluNWciLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9GRU01RywgU1JPTThfRkVNX0VYVFBBX0dBSU5fTUFTS30sCi0JeyJwZGV0cmFuZ2U1ZyIsIDB4ZmZmZmZmMDAsIDAsIFNST004X0ZFTTVHLCBTUk9NOF9GRU1fUERFVF9SQU5HRV9NQVNLfSwKLQl7InRyaXNvNWciLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9GRU01RywgU1JPTThfRkVNX1RSX0lTT19NQVNLfSwKLQl7ImFudHN3Y3RsNWciLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9GRU01RywgU1JPTThfRkVNX0FOVFNXTFVUX01BU0t9LAotCXsidGVtcHRocmVzaCIsIDB4ZmZmZmZmMDAsIDAsIFNST004X1RIRVJNQUwsIDB4ZmYwMH0sCi0JeyJ0ZW1wb2Zmc2V0IiwgMHhmZmZmZmYwMCwgMCwgU1JPTThfVEhFUk1BTCwgMHgwMGZmfSwKLQl7InR4cGlkMmdhMCIsIDB4MDAwMDAwZjAsIDAsIFNST000X1RYUElEMkcsIDB4MDBmZn0sCi0JeyJ0eHBpZDJnYTEiLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9UWFBJRDJHLCAweGZmMDB9LAotCXsidHhwaWQyZ2EyIiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfVFhQSUQyRyArIDEsIDB4MDBmZn0sCi0JeyJ0eHBpZDJnYTMiLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9UWFBJRDJHICsgMSwgMHhmZjAwfSwKLQl7InR4cGlkNWdhMCIsIDB4MDAwMDAwZjAsIDAsIFNST000X1RYUElENUcsIDB4MDBmZn0sCi0JeyJ0eHBpZDVnYTEiLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9UWFBJRDVHLCAweGZmMDB9LAotCXsidHhwaWQ1Z2EyIiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfVFhQSUQ1RyArIDEsIDB4MDBmZn0sCi0JeyJ0eHBpZDVnYTMiLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9UWFBJRDVHICsgMSwgMHhmZjAwfSwKLQl7InR4cGlkNWdsYTAiLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9UWFBJRDVHTCwgMHgwMGZmfSwKLQl7InR4cGlkNWdsYTEiLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9UWFBJRDVHTCwgMHhmZjAwfSwKLQl7InR4cGlkNWdsYTIiLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9UWFBJRDVHTCArIDEsIDB4MDBmZn0sCi0JeyJ0eHBpZDVnbGEzIiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfVFhQSUQ1R0wgKyAxLCAweGZmMDB9LAotCXsidHhwaWQ1Z2hhMCIsIDB4MDAwMDAwZjAsIDAsIFNST000X1RYUElENUdILCAweDAwZmZ9LAotCXsidHhwaWQ1Z2hhMSIsIDB4MDAwMDAwZjAsIDAsIFNST000X1RYUElENUdILCAweGZmMDB9LAotCXsidHhwaWQ1Z2hhMiIsIDB4MDAwMDAwZjAsIDAsIFNST000X1RYUElENUdIICsgMSwgMHgwMGZmfSwKLQl7InR4cGlkNWdoYTMiLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9UWFBJRDVHSCArIDEsIDB4ZmYwMH0sCi0KLQl7ImNjb2RlIiwgMHgwMDAwMDAwZiwgU1JGTF9DQ09ERSwgU1JPTV9DQ09ERSwgMHhmZmZmfSwKLQl7ImNjb2RlIiwgMHgwMDAwMDAxMCwgU1JGTF9DQ09ERSwgU1JPTTRfQ0NPREUsIDB4ZmZmZn0sCi0JeyJjY29kZSIsIDB4MDAwMDAwZTAsIFNSRkxfQ0NPREUsIFNST001X0NDT0RFLCAweGZmZmZ9LAotCXsiY2NvZGUiLCAweGZmZmZmZjAwLCBTUkZMX0NDT0RFLCBTUk9NOF9DQ09ERSwgMHhmZmZmfSwKLQl7Im1hY2FkZHIiLCAweGZmZmZmZjAwLCBTUkZMX0VUSEFERFIsIFNST004X01BQ0hJLCAweGZmZmZ9LAotCXsibWFjYWRkciIsIDB4MDAwMDAwZTAsIFNSRkxfRVRIQUREUiwgU1JPTTVfTUFDSEksIDB4ZmZmZn0sCi0JeyJtYWNhZGRyIiwgMHgwMDAwMDAxMCwgU1JGTF9FVEhBRERSLCBTUk9NNF9NQUNISSwgMHhmZmZmfSwKLQl7Im1hY2FkZHIiLCAweDAwMDAwMDA4LCBTUkZMX0VUSEFERFIsIFNST00zX01BQ0hJLCAweGZmZmZ9LAotCXsiaWwwbWFjYWRkciIsIDB4MDAwMDAwMDcsIFNSRkxfRVRIQUREUiwgU1JPTV9NQUNISV9JTDAsIDB4ZmZmZn0sCi0JeyJldDFtYWNhZGRyIiwgMHgwMDAwMDAwNywgU1JGTF9FVEhBRERSLCBTUk9NX01BQ0hJX0VUMSwgMHhmZmZmfSwKLQl7ImxlZGRjIiwgMHhmZmZmZmYwMCwgU1JGTF9OT0ZGUyB8IFNSRkxfTEVEREMsIFNST004X0xFRERDLCAweGZmZmZ9LAotCXsibGVkZGMiLCAweDAwMDAwMGUwLCBTUkZMX05PRkZTIHwgU1JGTF9MRUREQywgU1JPTTVfTEVEREMsIDB4ZmZmZn0sCi0JeyJsZWRkYyIsIDB4MDAwMDAwMTAsIFNSRkxfTk9GRlMgfCBTUkZMX0xFRERDLCBTUk9NNF9MRUREQywgMHhmZmZmfSwKLQl7ImxlZGRjIiwgMHgwMDAwMDAwOCwgU1JGTF9OT0ZGUyB8IFNSRkxfTEVEREMsIFNST00zX0xFRERDLCAweGZmZmZ9LAotCXsicmF3dGVtcHNlbnNlIiwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCwgU1JPTThfTVBXUl9SQVdUUywgMHgwMWZmfSwKLQl7Im1lYXNwb3dlciIsIDB4ZmZmZmZmMDAsIFNSRkxfUFJIRVgsIFNST004X01QV1JfUkFXVFMsIDB4ZmUwMH0sCi0JeyJ0ZW1wc2Vuc2Vfc2xvcGUiLCAweGZmZmZmZjAwLCBTUkZMX1BSSEVYLCBTUk9NOF9UU19TTFBfT1BUX0NPUlJYLAotCSAweDAwZmZ9LAotCXsidGVtcGNvcnJ4IiwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCwgU1JPTThfVFNfU0xQX09QVF9DT1JSWCwgMHhmYzAwfSwKLQl7InRlbXBzZW5zZV9vcHRpb24iLCAweGZmZmZmZjAwLCBTUkZMX1BSSEVYLCBTUk9NOF9UU19TTFBfT1BUX0NPUlJYLAotCSAweDAzMDB9LAotCXsiZnJlcW9mZnNldF9jb3JyIiwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCwgU1JPTThfRk9DX0hXSVFfSVFTV1AsCi0JIDB4MDAwZn0sCi0JeyJpcWNhbF9zd3BfZGlzIiwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCwgU1JPTThfRk9DX0hXSVFfSVFTV1AsIDB4MDAxMH0sCi0JeyJod19pcWNhbF9lbiIsIDB4ZmZmZmZmMDAsIFNSRkxfUFJIRVgsIFNST004X0ZPQ19IV0lRX0lRU1dQLCAweDAwMjB9LAotCXsicGh5Y2FsX3RlbXBkZWx0YSIsIDB4ZmZmZmZmMDAsIDAsIFNST004X1BIWUNBTF9URU1QREVMVEEsIDB4MDBmZn0sCi0KLQl7ImNjazJncG8iLCAweDAwMDAwMGYwLCAwLCBTUk9NNF8yR19DQ0tQTywgMHhmZmZmfSwKLQl7ImNjazJncG8iLCAweDAwMDAwMTAwLCAwLCBTUk9NOF8yR19DQ0tQTywgMHhmZmZmfSwKLQl7Im9mZG0yZ3BvIiwgMHgwMDAwMDBmMCwgU1JGTF9NT1JFLCBTUk9NNF8yR19PRkRNUE8sIDB4ZmZmZn0sCi0JeyIiLCAwLCAwLCBTUk9NNF8yR19PRkRNUE8gKyAxLCAweGZmZmZ9LAotCXsib2ZkbTVncG8iLCAweDAwMDAwMGYwLCBTUkZMX01PUkUsIFNST000XzVHX09GRE1QTywgMHhmZmZmfSwKLQl7IiIsIDAsIDAsIFNST000XzVHX09GRE1QTyArIDEsIDB4ZmZmZn0sCi0JeyJvZmRtNWdscG8iLCAweDAwMDAwMGYwLCBTUkZMX01PUkUsIFNST000XzVHTF9PRkRNUE8sIDB4ZmZmZn0sCi0JeyIiLCAwLCAwLCBTUk9NNF81R0xfT0ZETVBPICsgMSwgMHhmZmZmfSwKLQl7Im9mZG01Z2hwbyIsIDB4MDAwMDAwZjAsIFNSRkxfTU9SRSwgU1JPTTRfNUdIX09GRE1QTywgMHhmZmZmfSwKLQl7IiIsIDAsIDAsIFNST000XzVHSF9PRkRNUE8gKyAxLCAweGZmZmZ9LAotCXsib2ZkbTJncG8iLCAweDAwMDAwMTAwLCBTUkZMX01PUkUsIFNST004XzJHX09GRE1QTywgMHhmZmZmfSwKLQl7IiIsIDAsIDAsIFNST004XzJHX09GRE1QTyArIDEsIDB4ZmZmZn0sCi0JeyJvZmRtNWdwbyIsIDB4MDAwMDAxMDAsIFNSRkxfTU9SRSwgU1JPTThfNUdfT0ZETVBPLCAweGZmZmZ9LAotCXsiIiwgMCwgMCwgU1JPTThfNUdfT0ZETVBPICsgMSwgMHhmZmZmfSwKLQl7Im9mZG01Z2xwbyIsIDB4MDAwMDAxMDAsIFNSRkxfTU9SRSwgU1JPTThfNUdMX09GRE1QTywgMHhmZmZmfSwKLQl7IiIsIDAsIDAsIFNST004XzVHTF9PRkRNUE8gKyAxLCAweGZmZmZ9LAotCXsib2ZkbTVnaHBvIiwgMHgwMDAwMDEwMCwgU1JGTF9NT1JFLCBTUk9NOF81R0hfT0ZETVBPLCAweGZmZmZ9LAotCXsiIiwgMCwgMCwgU1JPTThfNUdIX09GRE1QTyArIDEsIDB4ZmZmZn0sCi0JeyJtY3MyZ3BvMCIsIDB4MDAwMDAwZjAsIDAsIFNST000XzJHX01DU1BPLCAweGZmZmZ9LAotCXsibWNzMmdwbzEiLCAweDAwMDAwMGYwLCAwLCBTUk9NNF8yR19NQ1NQTyArIDEsIDB4ZmZmZn0sCi0JeyJtY3MyZ3BvMiIsIDB4MDAwMDAwZjAsIDAsIFNST000XzJHX01DU1BPICsgMiwgMHhmZmZmfSwKLQl7Im1jczJncG8zIiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfMkdfTUNTUE8gKyAzLCAweGZmZmZ9LAotCXsibWNzMmdwbzQiLCAweDAwMDAwMGYwLCAwLCBTUk9NNF8yR19NQ1NQTyArIDQsIDB4ZmZmZn0sCi0JeyJtY3MyZ3BvNSIsIDB4MDAwMDAwZjAsIDAsIFNST000XzJHX01DU1BPICsgNSwgMHhmZmZmfSwKLQl7Im1jczJncG82IiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfMkdfTUNTUE8gKyA2LCAweGZmZmZ9LAotCXsibWNzMmdwbzciLCAweDAwMDAwMGYwLCAwLCBTUk9NNF8yR19NQ1NQTyArIDcsIDB4ZmZmZn0sCi0JeyJtY3M1Z3BvMCIsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHX01DU1BPLCAweGZmZmZ9LAotCXsibWNzNWdwbzEiLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R19NQ1NQTyArIDEsIDB4ZmZmZn0sCi0JeyJtY3M1Z3BvMiIsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHX01DU1BPICsgMiwgMHhmZmZmfSwKLQl7Im1jczVncG8zIiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdfTUNTUE8gKyAzLCAweGZmZmZ9LAotCXsibWNzNWdwbzQiLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R19NQ1NQTyArIDQsIDB4ZmZmZn0sCi0JeyJtY3M1Z3BvNSIsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHX01DU1BPICsgNSwgMHhmZmZmfSwKLQl7Im1jczVncG82IiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdfTUNTUE8gKyA2LCAweGZmZmZ9LAotCXsibWNzNWdwbzciLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R19NQ1NQTyArIDcsIDB4ZmZmZn0sCi0JeyJtY3M1Z2xwbzAiLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R0xfTUNTUE8sIDB4ZmZmZn0sCi0JeyJtY3M1Z2xwbzEiLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R0xfTUNTUE8gKyAxLCAweGZmZmZ9LAotCXsibWNzNWdscG8yIiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdMX01DU1BPICsgMiwgMHhmZmZmfSwKLQl7Im1jczVnbHBvMyIsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHTF9NQ1NQTyArIDMsIDB4ZmZmZn0sCi0JeyJtY3M1Z2xwbzQiLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R0xfTUNTUE8gKyA0LCAweGZmZmZ9LAotCXsibWNzNWdscG81IiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdMX01DU1BPICsgNSwgMHhmZmZmfSwKLQl7Im1jczVnbHBvNiIsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHTF9NQ1NQTyArIDYsIDB4ZmZmZn0sCi0JeyJtY3M1Z2xwbzciLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R0xfTUNTUE8gKyA3LCAweGZmZmZ9LAotCXsibWNzNWdocG8wIiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdIX01DU1BPLCAweGZmZmZ9LAotCXsibWNzNWdocG8xIiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdIX01DU1BPICsgMSwgMHhmZmZmfSwKLQl7Im1jczVnaHBvMiIsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHSF9NQ1NQTyArIDIsIDB4ZmZmZn0sCi0JeyJtY3M1Z2hwbzMiLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R0hfTUNTUE8gKyAzLCAweGZmZmZ9LAotCXsibWNzNWdocG80IiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdIX01DU1BPICsgNCwgMHhmZmZmfSwKLQl7Im1jczVnaHBvNSIsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHSF9NQ1NQTyArIDUsIDB4ZmZmZn0sCi0JeyJtY3M1Z2hwbzYiLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R0hfTUNTUE8gKyA2LCAweGZmZmZ9LAotCXsibWNzNWdocG83IiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdIX01DU1BPICsgNywgMHhmZmZmfSwKLQl7Im1jczJncG8wIiwgMHgwMDAwMDEwMCwgMCwgU1JPTThfMkdfTUNTUE8sIDB4ZmZmZn0sCi0JeyJtY3MyZ3BvMSIsIDB4MDAwMDAxMDAsIDAsIFNST004XzJHX01DU1BPICsgMSwgMHhmZmZmfSwKLQl7Im1jczJncG8yIiwgMHgwMDAwMDEwMCwgMCwgU1JPTThfMkdfTUNTUE8gKyAyLCAweGZmZmZ9LAotCXsibWNzMmdwbzMiLCAweDAwMDAwMTAwLCAwLCBTUk9NOF8yR19NQ1NQTyArIDMsIDB4ZmZmZn0sCi0JeyJtY3MyZ3BvNCIsIDB4MDAwMDAxMDAsIDAsIFNST004XzJHX01DU1BPICsgNCwgMHhmZmZmfSwKLQl7Im1jczJncG81IiwgMHgwMDAwMDEwMCwgMCwgU1JPTThfMkdfTUNTUE8gKyA1LCAweGZmZmZ9LAotCXsibWNzMmdwbzYiLCAweDAwMDAwMTAwLCAwLCBTUk9NOF8yR19NQ1NQTyArIDYsIDB4ZmZmZn0sCi0JeyJtY3MyZ3BvNyIsIDB4MDAwMDAxMDAsIDAsIFNST004XzJHX01DU1BPICsgNywgMHhmZmZmfSwKLQl7Im1jczVncG8wIiwgMHgwMDAwMDEwMCwgMCwgU1JPTThfNUdfTUNTUE8sIDB4ZmZmZn0sCi0JeyJtY3M1Z3BvMSIsIDB4MDAwMDAxMDAsIDAsIFNST004XzVHX01DU1BPICsgMSwgMHhmZmZmfSwKLQl7Im1jczVncG8yIiwgMHgwMDAwMDEwMCwgMCwgU1JPTThfNUdfTUNTUE8gKyAyLCAweGZmZmZ9LAotCXsibWNzNWdwbzMiLCAweDAwMDAwMTAwLCAwLCBTUk9NOF81R19NQ1NQTyArIDMsIDB4ZmZmZn0sCi0JeyJtY3M1Z3BvNCIsIDB4MDAwMDAxMDAsIDAsIFNST004XzVHX01DU1BPICsgNCwgMHhmZmZmfSwKLQl7Im1jczVncG81IiwgMHgwMDAwMDEwMCwgMCwgU1JPTThfNUdfTUNTUE8gKyA1LCAweGZmZmZ9LAotCXsibWNzNWdwbzYiLCAweDAwMDAwMTAwLCAwLCBTUk9NOF81R19NQ1NQTyArIDYsIDB4ZmZmZn0sCi0JeyJtY3M1Z3BvNyIsIDB4MDAwMDAxMDAsIDAsIFNST004XzVHX01DU1BPICsgNywgMHhmZmZmfSwKLQl7Im1jczVnbHBvMCIsIDB4MDAwMDAxMDAsIDAsIFNST004XzVHTF9NQ1NQTywgMHhmZmZmfSwKLQl7Im1jczVnbHBvMSIsIDB4MDAwMDAxMDAsIDAsIFNST004XzVHTF9NQ1NQTyArIDEsIDB4ZmZmZn0sCi0JeyJtY3M1Z2xwbzIiLCAweDAwMDAwMTAwLCAwLCBTUk9NOF81R0xfTUNTUE8gKyAyLCAweGZmZmZ9LAotCXsibWNzNWdscG8zIiwgMHgwMDAwMDEwMCwgMCwgU1JPTThfNUdMX01DU1BPICsgMywgMHhmZmZmfSwKLQl7Im1jczVnbHBvNCIsIDB4MDAwMDAxMDAsIDAsIFNST004XzVHTF9NQ1NQTyArIDQsIDB4ZmZmZn0sCi0JeyJtY3M1Z2xwbzUiLCAweDAwMDAwMTAwLCAwLCBTUk9NOF81R0xfTUNTUE8gKyA1LCAweGZmZmZ9LAotCXsibWNzNWdscG82IiwgMHgwMDAwMDEwMCwgMCwgU1JPTThfNUdMX01DU1BPICsgNiwgMHhmZmZmfSwKLQl7Im1jczVnbHBvNyIsIDB4MDAwMDAxMDAsIDAsIFNST004XzVHTF9NQ1NQTyArIDcsIDB4ZmZmZn0sCi0JeyJtY3M1Z2hwbzAiLCAweDAwMDAwMTAwLCAwLCBTUk9NOF81R0hfTUNTUE8sIDB4ZmZmZn0sCi0JeyJtY3M1Z2hwbzEiLCAweDAwMDAwMTAwLCAwLCBTUk9NOF81R0hfTUNTUE8gKyAxLCAweGZmZmZ9LAotCXsibWNzNWdocG8yIiwgMHgwMDAwMDEwMCwgMCwgU1JPTThfNUdIX01DU1BPICsgMiwgMHhmZmZmfSwKLQl7Im1jczVnaHBvMyIsIDB4MDAwMDAxMDAsIDAsIFNST004XzVHSF9NQ1NQTyArIDMsIDB4ZmZmZn0sCi0JeyJtY3M1Z2hwbzQiLCAweDAwMDAwMTAwLCAwLCBTUk9NOF81R0hfTUNTUE8gKyA0LCAweGZmZmZ9LAotCXsibWNzNWdocG81IiwgMHgwMDAwMDEwMCwgMCwgU1JPTThfNUdIX01DU1BPICsgNSwgMHhmZmZmfSwKLQl7Im1jczVnaHBvNiIsIDB4MDAwMDAxMDAsIDAsIFNST004XzVHSF9NQ1NQTyArIDYsIDB4ZmZmZn0sCi0JeyJtY3M1Z2hwbzciLCAweDAwMDAwMTAwLCAwLCBTUk9NOF81R0hfTUNTUE8gKyA3LCAweGZmZmZ9LAotCXsiY2RkcG8iLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9DRERQTywgMHhmZmZmfSwKLQl7InN0YmNwbyIsIDB4MDAwMDAwZjAsIDAsIFNST000X1NUQkNQTywgMHhmZmZmfSwKLQl7ImJ3NDBwbyIsIDB4MDAwMDAwZjAsIDAsIFNST000X0JXNDBQTywgMHhmZmZmfSwKLQl7ImJ3ZHVwcG8iLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9CV0RVUFBPLCAweGZmZmZ9LAotCXsiY2RkcG8iLCAweDAwMDAwMTAwLCAwLCBTUk9NOF9DRERQTywgMHhmZmZmfSwKLQl7InN0YmNwbyIsIDB4MDAwMDAxMDAsIDAsIFNST004X1NUQkNQTywgMHhmZmZmfSwKLQl7ImJ3NDBwbyIsIDB4MDAwMDAxMDAsIDAsIFNST004X0JXNDBQTywgMHhmZmZmfSwKLQl7ImJ3ZHVwcG8iLCAweDAwMDAwMTAwLCAwLCBTUk9NOF9CV0RVUFBPLCAweGZmZmZ9LAotCi0JLyogcG93ZXIgcGVyIHJhdGUgZnJvbSBzcm9tcmV2IDkgKi8KLQl7ImNja2J3MjAyZ3BvIiwgMHhmZmZmZmUwMCwgMCwgU1JPTTlfMkdQT19DQ0tCVzIwLCAweGZmZmZ9LAotCXsiY2NrYncyMHVsMmdwbyIsIDB4ZmZmZmZlMDAsIDAsIFNST005XzJHUE9fQ0NLQlcyMFVMLCAweGZmZmZ9LAotCXsibGVnb2ZkbWJ3MjAyZ3BvIiwgMHhmZmZmZmUwMCwgU1JGTF9NT1JFLCBTUk9NOV8yR1BPX0xPRkRNQlcyMCwKLQkgMHhmZmZmfSwKLQl7IiIsIDAsIDAsIFNST005XzJHUE9fTE9GRE1CVzIwICsgMSwgMHhmZmZmfSwKLQl7ImxlZ29mZG1idzIwdWwyZ3BvIiwgMHhmZmZmZmUwMCwgU1JGTF9NT1JFLCBTUk9NOV8yR1BPX0xPRkRNQlcyMFVMLAotCSAweGZmZmZ9LAotCXsiIiwgMCwgMCwgU1JPTTlfMkdQT19MT0ZETUJXMjBVTCArIDEsIDB4ZmZmZn0sCi0JeyJsZWdvZmRtYncyMDVnbHBvIiwgMHhmZmZmZmUwMCwgU1JGTF9NT1JFLCBTUk9NOV81R0xQT19MT0ZETUJXMjAsCi0JIDB4ZmZmZn0sCi0JeyIiLCAwLCAwLCBTUk9NOV81R0xQT19MT0ZETUJXMjAgKyAxLCAweGZmZmZ9LAotCXsibGVnb2ZkbWJ3MjB1bDVnbHBvIiwgMHhmZmZmZmUwMCwgU1JGTF9NT1JFLCBTUk9NOV81R0xQT19MT0ZETUJXMjBVTCwKLQkgMHhmZmZmfSwKLQl7IiIsIDAsIDAsIFNST005XzVHTFBPX0xPRkRNQlcyMFVMICsgMSwgMHhmZmZmfSwKLQl7ImxlZ29mZG1idzIwNWdtcG8iLCAweGZmZmZmZTAwLCBTUkZMX01PUkUsIFNST005XzVHTVBPX0xPRkRNQlcyMCwKLQkgMHhmZmZmfSwKLQl7IiIsIDAsIDAsIFNST005XzVHTVBPX0xPRkRNQlcyMCArIDEsIDB4ZmZmZn0sCi0JeyJsZWdvZmRtYncyMHVsNWdtcG8iLCAweGZmZmZmZTAwLCBTUkZMX01PUkUsIFNST005XzVHTVBPX0xPRkRNQlcyMFVMLAotCSAweGZmZmZ9LAotCXsiIiwgMCwgMCwgU1JPTTlfNUdNUE9fTE9GRE1CVzIwVUwgKyAxLCAweGZmZmZ9LAotCXsibGVnb2ZkbWJ3MjA1Z2hwbyIsIDB4ZmZmZmZlMDAsIFNSRkxfTU9SRSwgU1JPTTlfNUdIUE9fTE9GRE1CVzIwLAotCSAweGZmZmZ9LAotCXsiIiwgMCwgMCwgU1JPTTlfNUdIUE9fTE9GRE1CVzIwICsgMSwgMHhmZmZmfSwKLQl7ImxlZ29mZG1idzIwdWw1Z2hwbyIsIDB4ZmZmZmZlMDAsIFNSRkxfTU9SRSwgU1JPTTlfNUdIUE9fTE9GRE1CVzIwVUwsCi0JIDB4ZmZmZn0sCi0JeyIiLCAwLCAwLCBTUk9NOV81R0hQT19MT0ZETUJXMjBVTCArIDEsIDB4ZmZmZn0sCi0JeyJtY3NidzIwMmdwbyIsIDB4ZmZmZmZlMDAsIFNSRkxfTU9SRSwgU1JPTTlfMkdQT19NQ1NCVzIwLCAweGZmZmZ9LAotCXsiIiwgMCwgMCwgU1JPTTlfMkdQT19NQ1NCVzIwICsgMSwgMHhmZmZmfSwKLQl7Im1jc2J3MjB1bDJncG8iLCAweGZmZmZmZTAwLCBTUkZMX01PUkUsIFNST005XzJHUE9fTUNTQlcyMFVMLCAweGZmZmZ9LAotCXsiIiwgMCwgMCwgU1JPTTlfMkdQT19NQ1NCVzIwVUwgKyAxLCAweGZmZmZ9LAotCXsibWNzYnc0MDJncG8iLCAweGZmZmZmZTAwLCBTUkZMX01PUkUsIFNST005XzJHUE9fTUNTQlc0MCwgMHhmZmZmfSwKLQl7IiIsIDAsIDAsIFNST005XzJHUE9fTUNTQlc0MCArIDEsIDB4ZmZmZn0sCi0JeyJtY3NidzIwNWdscG8iLCAweGZmZmZmZTAwLCBTUkZMX01PUkUsIFNST005XzVHTFBPX01DU0JXMjAsIDB4ZmZmZn0sCi0JeyIiLCAwLCAwLCBTUk9NOV81R0xQT19NQ1NCVzIwICsgMSwgMHhmZmZmfSwKLQl7Im1jc2J3MjB1bDVnbHBvIiwgMHhmZmZmZmUwMCwgU1JGTF9NT1JFLCBTUk9NOV81R0xQT19NQ1NCVzIwVUwsCi0JIDB4ZmZmZn0sCi0JeyIiLCAwLCAwLCBTUk9NOV81R0xQT19NQ1NCVzIwVUwgKyAxLCAweGZmZmZ9LAotCXsibWNzYnc0MDVnbHBvIiwgMHhmZmZmZmUwMCwgU1JGTF9NT1JFLCBTUk9NOV81R0xQT19NQ1NCVzQwLCAweGZmZmZ9LAotCXsiIiwgMCwgMCwgU1JPTTlfNUdMUE9fTUNTQlc0MCArIDEsIDB4ZmZmZn0sCi0JeyJtY3NidzIwNWdtcG8iLCAweGZmZmZmZTAwLCBTUkZMX01PUkUsIFNST005XzVHTVBPX01DU0JXMjAsIDB4ZmZmZn0sCi0JeyIiLCAwLCAwLCBTUk9NOV81R01QT19NQ1NCVzIwICsgMSwgMHhmZmZmfSwKLQl7Im1jc2J3MjB1bDVnbXBvIiwgMHhmZmZmZmUwMCwgU1JGTF9NT1JFLCBTUk9NOV81R01QT19NQ1NCVzIwVUwsCi0JIDB4ZmZmZn0sCi0JeyIiLCAwLCAwLCBTUk9NOV81R01QT19NQ1NCVzIwVUwgKyAxLCAweGZmZmZ9LAotCXsibWNzYnc0MDVnbXBvIiwgMHhmZmZmZmUwMCwgU1JGTF9NT1JFLCBTUk9NOV81R01QT19NQ1NCVzQwLCAweGZmZmZ9LAotCXsiIiwgMCwgMCwgU1JPTTlfNUdNUE9fTUNTQlc0MCArIDEsIDB4ZmZmZn0sCi0JeyJtY3NidzIwNWdocG8iLCAweGZmZmZmZTAwLCBTUkZMX01PUkUsIFNST005XzVHSFBPX01DU0JXMjAsIDB4ZmZmZn0sCi0JeyIiLCAwLCAwLCBTUk9NOV81R0hQT19NQ1NCVzIwICsgMSwgMHhmZmZmfSwKLQl7Im1jc2J3MjB1bDVnaHBvIiwgMHhmZmZmZmUwMCwgU1JGTF9NT1JFLCBTUk9NOV81R0hQT19NQ1NCVzIwVUwsCi0JIDB4ZmZmZn0sCi0JeyIiLCAwLCAwLCBTUk9NOV81R0hQT19NQ1NCVzIwVUwgKyAxLCAweGZmZmZ9LAotCXsibWNzYnc0MDVnaHBvIiwgMHhmZmZmZmUwMCwgU1JGTF9NT1JFLCBTUk9NOV81R0hQT19NQ1NCVzQwLCAweGZmZmZ9LAotCXsiIiwgMCwgMCwgU1JPTTlfNUdIUE9fTUNTQlc0MCArIDEsIDB4ZmZmZn0sCi0JeyJtY3MzMnBvIiwgMHhmZmZmZmUwMCwgMCwgU1JPTTlfUE9fTUNTMzIsIDB4ZmZmZn0sCi0JeyJsZWdvZmRtNDBkdXBwbyIsIDB4ZmZmZmZlMDAsIDAsIFNST005X1BPX0xPRkRNNDBEVVAsIDB4ZmZmZn0sCi0KLQl7TlVMTCwgMCwgMCwgMCwgMH0KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYnJjbXNfc3JvbXZhciBwZXJwYXRoX3BjaV9zcm9tdmFyc1tdID0gewotCXsibWF4cDJnYSIsIDB4MDAwMDAwZjAsIDAsIFNST000XzJHX0lUVF9NQVhQLCAweDAwZmZ9LAotCXsiaXR0MmdhIiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfMkdfSVRUX01BWFAsIDB4ZmYwMH0sCi0JeyJpdHQ1Z2EiLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R19JVFRfTUFYUCwgMHhmZjAwfSwKLQl7InBhMmd3MGEiLCAweDAwMDAwMGYwLCBTUkZMX1BSSEVYLCBTUk9NNF8yR19QQSwgMHhmZmZmfSwKLQl7InBhMmd3MWEiLCAweDAwMDAwMGYwLCBTUkZMX1BSSEVYLCBTUk9NNF8yR19QQSArIDEsIDB4ZmZmZn0sCi0JeyJwYTJndzJhIiwgMHgwMDAwMDBmMCwgU1JGTF9QUkhFWCwgU1JPTTRfMkdfUEEgKyAyLCAweGZmZmZ9LAotCXsicGEyZ3czYSIsIDB4MDAwMDAwZjAsIFNSRkxfUFJIRVgsIFNST000XzJHX1BBICsgMywgMHhmZmZmfSwKLQl7Im1heHA1Z2EiLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R19JVFRfTUFYUCwgMHgwMGZmfSwKLQl7Im1heHA1Z2hhIiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdMSF9NQVhQLCAweDAwZmZ9LAotCXsibWF4cDVnbGEiLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R0xIX01BWFAsIDB4ZmYwMH0sCi0JeyJwYTVndzBhIiwgMHgwMDAwMDBmMCwgU1JGTF9QUkhFWCwgU1JPTTRfNUdfUEEsIDB4ZmZmZn0sCi0JeyJwYTVndzFhIiwgMHgwMDAwMDBmMCwgU1JGTF9QUkhFWCwgU1JPTTRfNUdfUEEgKyAxLCAweGZmZmZ9LAotCXsicGE1Z3cyYSIsIDB4MDAwMDAwZjAsIFNSRkxfUFJIRVgsIFNST000XzVHX1BBICsgMiwgMHhmZmZmfSwKLQl7InBhNWd3M2EiLCAweDAwMDAwMGYwLCBTUkZMX1BSSEVYLCBTUk9NNF81R19QQSArIDMsIDB4ZmZmZn0sCi0JeyJwYTVnbHcwYSIsIDB4MDAwMDAwZjAsIFNSRkxfUFJIRVgsIFNST000XzVHTF9QQSwgMHhmZmZmfSwKLQl7InBhNWdsdzFhIiwgMHgwMDAwMDBmMCwgU1JGTF9QUkhFWCwgU1JPTTRfNUdMX1BBICsgMSwgMHhmZmZmfSwKLQl7InBhNWdsdzJhIiwgMHgwMDAwMDBmMCwgU1JGTF9QUkhFWCwgU1JPTTRfNUdMX1BBICsgMiwgMHhmZmZmfSwKLQl7InBhNWdsdzNhIiwgMHgwMDAwMDBmMCwgU1JGTF9QUkhFWCwgU1JPTTRfNUdMX1BBICsgMywgMHhmZmZmfSwKLQl7InBhNWdodzBhIiwgMHgwMDAwMDBmMCwgU1JGTF9QUkhFWCwgU1JPTTRfNUdIX1BBLCAweGZmZmZ9LAotCXsicGE1Z2h3MWEiLCAweDAwMDAwMGYwLCBTUkZMX1BSSEVYLCBTUk9NNF81R0hfUEEgKyAxLCAweGZmZmZ9LAotCXsicGE1Z2h3MmEiLCAweDAwMDAwMGYwLCBTUkZMX1BSSEVYLCBTUk9NNF81R0hfUEEgKyAyLCAweGZmZmZ9LAotCXsicGE1Z2h3M2EiLCAweDAwMDAwMGYwLCBTUkZMX1BSSEVYLCBTUk9NNF81R0hfUEEgKyAzLCAweGZmZmZ9LAotCXsibWF4cDJnYSIsIDB4ZmZmZmZmMDAsIDAsIFNST004XzJHX0lUVF9NQVhQLCAweDAwZmZ9LAotCXsiaXR0MmdhIiwgMHhmZmZmZmYwMCwgMCwgU1JPTThfMkdfSVRUX01BWFAsIDB4ZmYwMH0sCi0JeyJpdHQ1Z2EiLCAweGZmZmZmZjAwLCAwLCBTUk9NOF81R19JVFRfTUFYUCwgMHhmZjAwfSwKLQl7InBhMmd3MGEiLCAweGZmZmZmZjAwLCBTUkZMX1BSSEVYLCBTUk9NOF8yR19QQSwgMHhmZmZmfSwKLQl7InBhMmd3MWEiLCAweGZmZmZmZjAwLCBTUkZMX1BSSEVYLCBTUk9NOF8yR19QQSArIDEsIDB4ZmZmZn0sCi0JeyJwYTJndzJhIiwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCwgU1JPTThfMkdfUEEgKyAyLCAweGZmZmZ9LAotCXsibWF4cDVnYSIsIDB4ZmZmZmZmMDAsIDAsIFNST004XzVHX0lUVF9NQVhQLCAweDAwZmZ9LAotCXsibWF4cDVnaGEiLCAweGZmZmZmZjAwLCAwLCBTUk9NOF81R0xIX01BWFAsIDB4MDBmZn0sCi0JeyJtYXhwNWdsYSIsIDB4ZmZmZmZmMDAsIDAsIFNST004XzVHTEhfTUFYUCwgMHhmZjAwfSwKLQl7InBhNWd3MGEiLCAweGZmZmZmZjAwLCBTUkZMX1BSSEVYLCBTUk9NOF81R19QQSwgMHhmZmZmfSwKLQl7InBhNWd3MWEiLCAweGZmZmZmZjAwLCBTUkZMX1BSSEVYLCBTUk9NOF81R19QQSArIDEsIDB4ZmZmZn0sCi0JeyJwYTVndzJhIiwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCwgU1JPTThfNUdfUEEgKyAyLCAweGZmZmZ9LAotCXsicGE1Z2x3MGEiLCAweGZmZmZmZjAwLCBTUkZMX1BSSEVYLCBTUk9NOF81R0xfUEEsIDB4ZmZmZn0sCi0JeyJwYTVnbHcxYSIsIDB4ZmZmZmZmMDAsIFNSRkxfUFJIRVgsIFNST004XzVHTF9QQSArIDEsIDB4ZmZmZn0sCi0JeyJwYTVnbHcyYSIsIDB4ZmZmZmZmMDAsIFNSRkxfUFJIRVgsIFNST004XzVHTF9QQSArIDIsIDB4ZmZmZn0sCi0JeyJwYTVnaHcwYSIsIDB4ZmZmZmZmMDAsIFNSRkxfUFJIRVgsIFNST004XzVHSF9QQSwgMHhmZmZmfSwKLQl7InBhNWdodzFhIiwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCwgU1JPTThfNUdIX1BBICsgMSwgMHhmZmZmfSwKLQl7InBhNWdodzJhIiwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCwgU1JPTThfNUdIX1BBICsgMiwgMHhmZmZmfSwKLQl7TlVMTCwgMCwgMCwgMCwgMH0KLX07Ci0KLXN0YXRpYyB2b2lkIF9pbml0dmFyc19zcm9tX3BjaSh1OCBzcm9tcmV2LCB1MTYgKnNyb20sIHVpbnQgb2ZmLAotCQkJICAgICAgIHN0cnVjdCBicmNtc192YXJidWYgKmIpOwotc3RhdGljIGludCBpbml0dmFyc19zcm9tX3BjaShzdHJ1Y3Qgc2lfcHViICpzaWgsIHZvaWQgKmN1cm1hcCwgY2hhciAqKnZhcnMsCi0JCQkgICAgIHVpbnQgKmNvdW50KTsKLXN0YXRpYyBpbnQgc3Byb21fcmVhZF9wY2koc3RydWN0IHNpX3B1YiAqc2loLCB1MTYgKnNwcm9tLAotCQkJICB1aW50IHdvcmRvZmYsIHUxNiAqYnVmLCB1aW50IG53b3JkcywgYm9vbCBjaGVja19jcmMpOwotI2lmIGRlZmluZWQoQkNNTlZSQU1SKQotc3RhdGljIGludCBvdHBfcmVhZF9wY2koc3RydWN0IHNpX3B1YiAqc2loLCB1MTYgKmJ1ZiwgdWludCBidWZzeik7Ci0jZW5kaWYKLQotc3RhdGljIGludCBpbml0dmFyc190YWJsZShjaGFyICpzdGFydCwgY2hhciAqZW5kLAotCQkJICBjaGFyICoqdmFycywgdWludCAqY291bnQpOwotCi0vKiBJbml0aWFsaXphdGlvbiBvZiB2YXJidWYgc3RydWN0dXJlICovCi1zdGF0aWMgdm9pZCB2YXJidWZfaW5pdChzdHJ1Y3QgYnJjbXNfdmFyYnVmICpiLCBjaGFyICpidWYsIHVpbnQgc2l6ZSkKLXsKLQliLT5zaXplID0gc2l6ZTsKLQliLT5iYXNlID0gYi0+YnVmID0gYnVmOwotfQotCi0vKiBhcHBlbmQgYSBudWxsIHRlcm1pbmF0ZWQgdmFyPXZhbHVlIHN0cmluZyAqLwotc3RhdGljIGludCB2YXJidWZfYXBwZW5kKHN0cnVjdCBicmNtc192YXJidWYgKmIsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotCXZhX2xpc3QgYXA7Ci0JaW50IHI7Ci0Jc2l6ZV90IGxlbjsKLQljaGFyICpzOwotCi0JaWYgKGItPnNpemUgPCAyKQotCQlyZXR1cm4gMDsKLQotCXZhX3N0YXJ0KGFwLCBmbXQpOwotCXIgPSB2c25wcmludGYoYi0+YnVmLCBiLT5zaXplLCBmbXQsIGFwKTsKLQl2YV9lbmQoYXApOwotCi0JLyogQzk5IHNucHJpbnRmIGJlaGF2aW9yIHJldHVybnMgciA+PSBzaXplIG9uIG92ZXJmbG93LAotCSAqIG90aGVycyByZXR1cm4gLTEgb24gb3ZlcmZsb3cuCi0JICogQWxsIHJldHVybiAtMSBvbiBmb3JtYXQgZXJyb3IuCi0JICogV2UgbmVlZCB0byBsZWF2ZSByb29tIGZvciAyIG51bGwgdGVybWluYXRpb25zLCBvbmUgZm9yIHRoZSBjdXJyZW50IHZhcgotCSAqIHN0cmluZywgYW5kIG9uZSBmb3IgZmluYWwgbnVsbCBvZiB0aGUgdmFyIHRhYmxlLiBTbyBjaGVjayB0aGF0IHRoZQotCSAqIHN0cmxlbiB3cml0dGVuLCByLCBsZWF2ZXMgcm9vbSBmb3IgMiBjaGFycy4KLQkgKi8KLQlpZiAoKHIgPT0gLTEpIHx8IChyID4gKGludCkoYi0+c2l6ZSAtIDIpKSkgewotCQliLT5zaXplID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogUmVtb3ZlIGFueSBlYXJsaWVyIG9jY3VycmVuY2Ugb2YgdGhlIHNhbWUgdmFyaWFibGUgKi8KLQlzID0gc3RyY2hyKGItPmJ1ZiwgJz0nKTsKLQlpZiAocyAhPSBOVUxMKSB7Ci0JCWxlbiA9IChzaXplX3QpIChzIC0gYi0+YnVmKTsKLQkJZm9yIChzID0gYi0+YmFzZTsgcyA8IGItPmJ1ZjspIHsKLQkJCWlmICgobWVtY21wKHMsIGItPmJ1ZiwgbGVuKSA9PSAwKSAmJiBzW2xlbl0gPT0gJz0nKSB7Ci0JCQkJbGVuID0gc3RybGVuKHMpICsgMTsKLQkJCQltZW1tb3ZlKHMsIChzICsgbGVuKSwKLQkJCQkJKChiLT5idWYgKyByICsgMSkgLSAocyArIGxlbikpKTsKLQkJCQliLT5idWYgLT0gbGVuOwotCQkJCWItPnNpemUgKz0gKHVuc2lnbmVkIGludClsZW47Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXdoaWxlICgqcysrKQotCQkJCTsKLQkJfQotCX0KLQotCS8qIHNraXAgb3ZlciB0aGlzIHN0cmluZydzIG51bGwgdGVybWluYXRpb24gKi8KLQlyKys7Ci0JYi0+c2l6ZSAtPSByOwotCWItPmJ1ZiArPSByOwotCi0JcmV0dXJuIHI7Ci19Ci0KLS8qCi0gKiBJbml0aWFsaXplIGxvY2FsIHZhcnMgZnJvbSB0aGUgcmlnaHQgc291cmNlIGZvciB0aGlzIHBsYXRmb3JtLgotICogUmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBlcnJvci4KLSAqLwotaW50IHNyb21fdmFyX2luaXQoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGJ1c3R5cGUsIHZvaWQgKmN1cm1hcCwKLQkJICBjaGFyICoqdmFycywgdWludCAqY291bnQpCi17Ci0JdWludCBsZW47Ci0KLQlsZW4gPSAwOwotCi0JaWYgKHZhcnMgPT0gTlVMTCB8fCBjb3VudCA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQotCSp2YXJzID0gTlVMTDsKLQkqY291bnQgPSAwOwotCi0JaWYgKGN1cm1hcCAhPSBOVUxMICYmIGJ1c3R5cGUgPT0gUENJX0JVUykKLQkJcmV0dXJuIGluaXR2YXJzX3Nyb21fcGNpKHNpaCwgY3VybWFwLCB2YXJzLCBjb3VudCk7Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGx0b2gxNl9idWYodTE2ICpidWYsIHVuc2lnbmVkIGludCBzaXplKQotewotCWZvciAoc2l6ZSAvPSAyOyBzaXplOyBzaXplLS0pCi0JCSooYnVmICsgc2l6ZSkgPSBsZTE2X3RvX2NwdSgqKGJ1ZiArIHNpemUpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGh0b2wxNl9idWYodTE2ICpidWYsIHVuc2lnbmVkIGludCBzaXplKQotewotCWZvciAoc2l6ZSAvPSAyOyBzaXplOyBzaXplLS0pCi0JCSooYnVmICsgc2l6ZSkgPSBjcHVfdG9fbGUxNigqKGJ1ZiArIHNpemUpKTsKLX0KLQotLyoKLSAqIFJlYWQgaW4gYW5kIHZhbGlkYXRlIHNwcm9tLgotICogUmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBlcnJvci4KLSAqLwotc3RhdGljIGludAotc3Byb21fcmVhZF9wY2koc3RydWN0IHNpX3B1YiAqc2loLCB1MTYgKnNwcm9tLCB1aW50IHdvcmRvZmYsCi0JICAgICAgIHUxNiAqYnVmLCB1aW50IG53b3JkcywgYm9vbCBjaGVja19jcmMpCi17Ci0JaW50IGVyciA9IDA7Ci0JdWludCBpOwotCi0JLyogcmVhZCB0aGUgc3Byb20gKi8KLQlmb3IgKGkgPSAwOyBpIDwgbndvcmRzOyBpKyspCi0JCWJ1ZltpXSA9IFJfUkVHKCZzcHJvbVt3b3Jkb2ZmICsgaV0pOwotCi0JaWYgKGNoZWNrX2NyYykgewotCi0JCWlmIChidWZbMF0gPT0gMHhmZmZmKSB7Ci0JCQkvKiBUaGUgaGFyZHdhcmUgdGhpbmtzIHRoYXQgYW4gc3JvbSB0aGF0IHN0YXJ0cyB3aXRoIDB4ZmZmZgotCQkJICogaXMgYmxhbmssIHJlZ2FyZGxlc3Mgb2YgdGhlIHJlc3Qgb2YgdGhlIGNvbnRlbnQsIHNvIGRlY2xhcmUKLQkJCSAqIGl0IGJhZC4KLQkJCSAqLwotCQkJcmV0dXJuIC1FTk9EQVRBOwotCQl9Ci0KLQkJLyogZml4dXAgdGhlIGVuZGlhbm5lc3Mgc28gY3JjOCB3aWxsIHBhc3MgKi8KLQkJaHRvbDE2X2J1ZihidWYsIG53b3JkcyAqIDIpOwotCQlpZiAoYnJjbXVfY3JjOCgodTggKikgYnVmLCBud29yZHMgKiAyLCBDUkM4X0lOSVRfVkFMVUUpICE9Ci0JCSAgICBDUkM4X0dPT0RfVkFMVUUpIHsKLQkJCS8qIERCRyBvbmx5IHBjaSBhbHdheXMgcmVhZCBzcm9tNCBmaXJzdCwgdGhlbiBzcm9tOC85ICovCi0JCQllcnIgPSAtRUlPOwotCQl9Ci0JCS8qIG5vdyBjb3JyZWN0IHRoZSBlbmRpYW5uZXNzIG9mIHRoZSBieXRlIGFycmF5ICovCi0JCWx0b2gxNl9idWYoYnVmLCBud29yZHMgKiAyKTsKLQl9Ci0JcmV0dXJuIGVycjsKLX0KLQotI2lmIGRlZmluZWQoQkNNTlZSQU1SKQotc3RhdGljIGludCBvdHBfcmVhZF9wY2koc3RydWN0IHNpX3B1YiAqc2loLCB1MTYgKmJ1ZiwgdWludCBidWZzeikKLXsKLQl1OCAqb3RwOwotCXVpbnQgc3ogPSBPVFBfU1pfTUFYIC8gMjsJLyogc2l6ZSBpbiB3b3JkcyAqLwotCWludCBlcnIgPSAwOwotCi0Jb3RwID0ga3phbGxvYyhPVFBfU1pfTUFYLCBHRlBfQVRPTUlDKTsKLQlpZiAob3RwID09IE5VTEwpIHsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZXJyID0gb3RwX3JlYWRfcmVnaW9uKHNpaCwgT1RQX0hXX1JHTiwgKHUxNiAqKSBvdHAsICZzeik7Ci0KLQltZW1jcHkoYnVmLCBvdHAsIGJ1ZnN6KTsKLQotCWtmcmVlKG90cCk7Ci0KLQkvKiBDaGVjayBDUkMgKi8KLQlpZiAoYnVmWzBdID09IDB4ZmZmZikgewotCQkvKiBUaGUgaGFyZHdhcmUgdGhpbmtzIHRoYXQgYW4gc3JvbSB0aGF0IHN0YXJ0cyB3aXRoIDB4ZmZmZgotCQkgKiBpcyBibGFuaywgcmVnYXJkbGVzcyBvZiB0aGUgcmVzdCBvZiB0aGUgY29udGVudCwgc28gZGVjbGFyZQotCQkgKiBpdCBiYWQuCi0JCSAqLwotCQlyZXR1cm4gLUVOT0RBVEE7Ci0JfQotCi0JLyogZml4dXAgdGhlIGVuZGlhbm5lc3Mgc28gY3JjOCB3aWxsIHBhc3MgKi8KLQlodG9sMTZfYnVmKGJ1ZiwgYnVmc3opOwotCWlmIChicmNtdV9jcmM4KCh1OCAqKSBidWYsIFNST000X1dPUkRTICogMiwgQ1JDOF9JTklUX1ZBTFVFKSAhPQotCSAgICBDUkM4X0dPT0RfVkFMVUUpIHsKLQkJZXJyID0gLUVJTzsKLQl9Ci0JLyogbm93IGNvcnJlY3QgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIGJ5dGUgYXJyYXkgKi8KLQlsdG9oMTZfYnVmKGJ1ZiwgYnVmc3opOwotCi0JcmV0dXJuIGVycjsKLX0KLSNlbmRpZgkJCQkvKiBkZWZpbmVkKEJDTU5WUkFNUikgKi8KLS8qCi0qIENyZWF0ZSB2YXJpYWJsZSB0YWJsZSBmcm9tIG1lbW9yeS4KLSogUmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBlcnJvci4KLSovCi1zdGF0aWMgaW50IGluaXR2YXJzX3RhYmxlKGNoYXIgKnN0YXJ0LCBjaGFyICplbmQsCi0JCQkgIGNoYXIgKip2YXJzLCB1aW50ICpjb3VudCkKLXsKLQlpbnQgYyA9IChpbnQpKGVuZCAtIHN0YXJ0KTsKLQotCS8qIGRvIGl0IG9ubHkgd2hlbiB0aGVyZSBpcyBtb3JlIHRoYW4ganVzdCB0aGUgbnVsbCBzdHJpbmcgKi8KLQlpZiAoYyA+IDEpIHsKLQkJY2hhciAqdnAgPSBrbWFsbG9jKGMsIEdGUF9BVE9NSUMpOwotCQlpZiAoIXZwKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCW1lbWNweSh2cCwgc3RhcnQsIGMpOwotCQkqdmFycyA9IHZwOwotCQkqY291bnQgPSBjOwotCX0gZWxzZSB7Ci0JCSp2YXJzID0gTlVMTDsKLQkJKmNvdW50ID0gMDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogUGFyc2UgU1JPTSBhbmQgY3JlYXRlIG5hbWU9dmFsdWUgcGFpcnMuICdzcm9tJyBwb2ludHMgdG8KLSAqIHRoZSBTUk9NIHdvcmQgYXJyYXkuICdvZmYnIHNwZWNpZmllcyB0aGUgb2Zmc2V0IG9mIHRoZQotICogZmlyc3Qgd29yZCAnc3JvbScgcG9pbnRzIHRvLCB3aGljaCBzaG91bGQgYmUgZWl0aGVyIDAgb3IKLSAqIFNST00zX1NXUkdfT0ZGIChmdWxsIFNST00gb3Igc29mdHdhcmUgcmVnaW9uKS4KLSAqLwotCi1zdGF0aWMgdWludCBtYXNrX3NoaWZ0KHUxNiBtYXNrKQotewotCXVpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihtYXNrKSA8PCAzKTsgaSsrKSB7Ci0JCWlmIChtYXNrICYgKDEgPDwgaSkpCi0JCQlyZXR1cm4gaTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1aW50IG1hc2tfd2lkdGgodTE2IG1hc2spCi17Ci0JaW50IGk7Ci0JZm9yIChpID0gKHNpemVvZihtYXNrKSA8PCAzKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCWlmIChtYXNrICYgKDEgPDwgaSkpCi0JCQlyZXR1cm4gKHVpbnQpIChpIC0gbWFza19zaGlmdChtYXNrKSArIDEpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQKLV9pbml0dmFyc19zcm9tX3BjaSh1OCBzcm9tcmV2LCB1MTYgKnNyb20sIHVpbnQgb2ZmLCBzdHJ1Y3QgYnJjbXNfdmFyYnVmICpiKQotewotCXUxNiB3OwotCXUzMiB2YWw7Ci0JY29uc3Qgc3RydWN0IGJyY21zX3Nyb212YXIgKnNydjsKLQl1aW50IHdpZHRoOwotCXVpbnQgZmxhZ3M7Ci0JdTMyIHNyID0gKDEgPDwgc3JvbXJldik7Ci0KLQl2YXJidWZfYXBwZW5kKGIsICJzcm9tcmV2PSVkIiwgc3JvbXJldik7Ci0KLQlmb3IgKHNydiA9IHBjaV9zcm9tdmFyczsgc3J2LT5uYW1lICE9IE5VTEw7IHNydisrKSB7Ci0JCWNvbnN0IGNoYXIgKm5hbWU7Ci0KLQkJaWYgKChzcnYtPnJldm1hc2sgJiBzcikgPT0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChzcnYtPm9mZiA8IG9mZikKLQkJCWNvbnRpbnVlOwotCi0JCWZsYWdzID0gc3J2LT5mbGFnczsKLQkJbmFtZSA9IHNydi0+bmFtZTsKLQotCQkvKiBUaGlzIGVudHJ5IGlzIGZvciBtZmdjIG9ubHkuIERvbid0IGdlbmVyYXRlIHBhcmFtIGZvciBpdCwgKi8KLQkJaWYgKGZsYWdzICYgU1JGTF9OT1ZBUikKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChmbGFncyAmIFNSRkxfRVRIQUREUikgewotCQkJdTggZWFbRVRIX0FMRU5dOwotCi0JCQllYVswXSA9IChzcm9tW3Nydi0+b2ZmIC0gb2ZmXSA+PiA4KSAmIDB4ZmY7Ci0JCQllYVsxXSA9IHNyb21bc3J2LT5vZmYgLSBvZmZdICYgMHhmZjsKLQkJCWVhWzJdID0gKHNyb21bc3J2LT5vZmYgKyAxIC0gb2ZmXSA+PiA4KSAmIDB4ZmY7Ci0JCQllYVszXSA9IHNyb21bc3J2LT5vZmYgKyAxIC0gb2ZmXSAmIDB4ZmY7Ci0JCQllYVs0XSA9IChzcm9tW3Nydi0+b2ZmICsgMiAtIG9mZl0gPj4gOCkgJiAweGZmOwotCQkJZWFbNV0gPSBzcm9tW3Nydi0+b2ZmICsgMiAtIG9mZl0gJiAweGZmOwotCi0JCQl2YXJidWZfYXBwZW5kKGIsICIlcz0lcE0iLCBuYW1lLCBlYSk7Ci0JCX0gZWxzZSB7Ci0JCQl3ID0gc3JvbVtzcnYtPm9mZiAtIG9mZl07Ci0JCQl2YWwgPSAodyAmIHNydi0+bWFzaykgPj4gbWFza19zaGlmdChzcnYtPm1hc2spOwotCQkJd2lkdGggPSBtYXNrX3dpZHRoKHNydi0+bWFzayk7Ci0KLQkJCXdoaWxlIChzcnYtPmZsYWdzICYgU1JGTF9NT1JFKSB7Ci0JCQkJc3J2Kys7Ci0JCQkJaWYgKHNydi0+b2ZmID09IDAgfHwgc3J2LT5vZmYgPCBvZmYpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJdyA9IHNyb21bc3J2LT5vZmYgLSBvZmZdOwotCQkJCXZhbCArPQotCQkJCSAgICAoKHcgJiBzcnYtPm1hc2spID4+IG1hc2tfc2hpZnQoc3J2LT4KLQkJCQkJCQkJICAgbWFzaykpIDw8Ci0JCQkJICAgIHdpZHRoOwotCQkJCXdpZHRoICs9IG1hc2tfd2lkdGgoc3J2LT5tYXNrKTsKLQkJCX0KLQotCQkJaWYgKChmbGFncyAmIFNSRkxfTk9GRlMpCi0JCQkgICAgJiYgKChpbnQpdmFsID09ICgxIDw8IHdpZHRoKSAtIDEpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoZmxhZ3MgJiBTUkZMX0NDT0RFKSB7Ci0JCQkJaWYgKHZhbCA9PSAwKQotCQkJCQl2YXJidWZfYXBwZW5kKGIsICJjY29kZT0iKTsKLQkJCQllbHNlCi0JCQkJCXZhcmJ1Zl9hcHBlbmQoYiwgImNjb2RlPSVjJWMiLAotCQkJCQkJICAgICAgKHZhbCA+PiA4KSwgKHZhbCAmIDB4ZmYpKTsKLQkJCX0KLQkJCS8qIExFRCBQb3dlcnNhdmUgZHV0eSBjeWNsZSBoYXMgdG8gYmUgc2NhbGVkOgotCQkJICoob25jb3VudCA+PiAyNCkgKG9mZmNvdW50ID4+IDgpCi0JCQkgKi8KLQkJCWVsc2UgaWYgKGZsYWdzICYgU1JGTF9MRUREQykgewotCQkJCXUzMiB3MzIgPSAoKCh2YWwgPj4gOCkgJiAweGZmKSA8PCAyNCkgfAkvKiBvbmNvdW50ICovCi0JCQkJICAgICgoKHZhbCAmIDB4ZmYpKSA8PCA4KTsJLyogb2ZmY291bnQgKi8KLQkJCQl2YXJidWZfYXBwZW5kKGIsICJsZWRkYz0lZCIsIHczMik7Ci0JCQl9IGVsc2UgaWYgKGZsYWdzICYgU1JGTF9QUkhFWCkKLQkJCQl2YXJidWZfYXBwZW5kKGIsICIlcz0weCV4IiwgbmFtZSwgdmFsKTsKLQkJCWVsc2UgaWYgKChmbGFncyAmIFNSRkxfUFJTSUdOKQotCQkJCSAmJiAodmFsICYgKDEgPDwgKHdpZHRoIC0gMSkpKSkKLQkJCQl2YXJidWZfYXBwZW5kKGIsICIlcz0lZCIsIG5hbWUsCi0JCQkJCSAgICAgIChpbnQpKHZhbCB8ICh+MCA8PCB3aWR0aCkpKTsKLQkJCWVsc2UKLQkJCQl2YXJidWZfYXBwZW5kKGIsICIlcz0ldSIsIG5hbWUsIHZhbCk7Ci0JCX0KLQl9Ci0KLQlpZiAoc3JvbXJldiA+PSA0KSB7Ci0JCS8qIERvIHBlci1wYXRoIHZhcmlhYmxlcyAqLwotCQl1aW50IHAsIHBiLCBwc3o7Ci0KLQkJaWYgKHNyb21yZXYgPj0gOCkgewotCQkJcGIgPSBTUk9NOF9QQVRIMDsKLQkJCXBzeiA9IFNST004X1BBVEgxIC0gU1JPTThfUEFUSDA7Ci0JCX0gZWxzZSB7Ci0JCQlwYiA9IFNST000X1BBVEgwOwotCQkJcHN6ID0gU1JPTTRfUEFUSDEgLSBTUk9NNF9QQVRIMDsKLQkJfQotCi0JCWZvciAocCA9IDA7IHAgPCBNQVhfUEFUSF9TUk9NOyBwKyspIHsKLQkJCWZvciAoc3J2ID0gcGVycGF0aF9wY2lfc3JvbXZhcnM7IHNydi0+bmFtZSAhPSBOVUxMOwotCQkJICAgICBzcnYrKykgewotCQkJCWlmICgoc3J2LT5yZXZtYXNrICYgc3IpID09IDApCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKHBiICsgc3J2LT5vZmYgPCBvZmYpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJLyogVGhpcyBlbnRyeSBpcyBmb3IgbWZnYyBvbmx5LiBEb24ndCBnZW5lcmF0ZSBwYXJhbSBmb3IgaXQsICovCi0JCQkJaWYgKHNydi0+ZmxhZ3MgJiBTUkZMX05PVkFSKQotCQkJCQljb250aW51ZTsKLQotCQkJCXcgPSBzcm9tW3BiICsgc3J2LT5vZmYgLSBvZmZdOwotCQkJCXZhbCA9ICh3ICYgc3J2LT5tYXNrKSA+PiBtYXNrX3NoaWZ0KHNydi0+bWFzayk7Ci0JCQkJd2lkdGggPSBtYXNrX3dpZHRoKHNydi0+bWFzayk7Ci0KLQkJCQkvKiBDaGVhdGluZzogbm8gcGVyLXBhdGggdmFyIGlzIG1vcmUgdGhhbiAxIHdvcmQgKi8KLQotCQkJCWlmICgoc3J2LT5mbGFncyAmIFNSRkxfTk9GRlMpCi0JCQkJICAgICYmICgoaW50KXZhbCA9PSAoMSA8PCB3aWR0aCkgLSAxKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlpZiAoc3J2LT5mbGFncyAmIFNSRkxfUFJIRVgpCi0JCQkJCXZhcmJ1Zl9hcHBlbmQoYiwgIiVzJWQ9MHgleCIsIHNydi0+bmFtZSwKLQkJCQkJCSAgICAgIHAsIHZhbCk7Ci0JCQkJZWxzZQotCQkJCQl2YXJidWZfYXBwZW5kKGIsICIlcyVkPSVkIiwgc3J2LT5uYW1lLAotCQkJCQkJICAgICAgcCwgdmFsKTsKLQkJCX0KLQkJCXBiICs9IHBzejsKLQkJfQotCX0KLX0KLQotLyoKLSAqIEluaXRpYWxpemUgbm9udm9sYXRpbGUgdmFyaWFibGUgdGFibGUgZnJvbSBzcHJvbS4KLSAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZXJyb3IuCi0gKi8KLXN0YXRpYyBpbnQgaW5pdHZhcnNfc3JvbV9wY2koc3RydWN0IHNpX3B1YiAqc2loLCB2b2lkICpjdXJtYXAsIGNoYXIgKip2YXJzLAotCQkJICAgICB1aW50ICpjb3VudCkKLXsKLQl1MTYgKnNyb20sICpzcm9td2luZG93OwotCXU4IHNyb21yZXYgPSAwOwotCXUzMiBzcjsKLQlzdHJ1Y3QgYnJjbXNfdmFyYnVmIGI7Ci0JY2hhciAqdnAsICpiYXNlID0gTlVMTDsKLQlpbnQgZXJyID0gMDsKLQotCS8qCi0JICogQXBwbHkgQ1JDIG92ZXIgU1JPTSBjb250ZW50IHJlZ2FyZGxlc3MgU1JPTSBpcyBwcmVzZW50IG9yIG5vdC4KLQkgKi8KLQlzcm9tID0ga21hbGxvYyhTUk9NX01BWCwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFzcm9tKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNyb213aW5kb3cgPSAodTE2ICopIFNST01fT0ZGU0VUKHNpaCk7Ci0JaWYgKGFpX2lzX3Nwcm9tX2F2YWlsYWJsZShzaWgpKSB7Ci0JCWVyciA9IHNwcm9tX3JlYWRfcGNpKHNpaCwgc3JvbXdpbmRvdywgMCwgc3JvbSwgU1JPTV9XT1JEUywKLQkJCQkgICAgIHRydWUpOwotCi0JCWlmICgoc3JvbVtTUk9NNF9TSUdOXSA9PSBTUk9NNF9TSUdOQVRVUkUpIHx8Ci0JCSAgICAoKChzaWgtPmJ1c2NvcmV0eXBlID09IFBDSUVfQ09SRV9JRCkKLQkJICAgICAgJiYgKHNpaC0+YnVzY29yZXJldiA+PSA2KSkKLQkJICAgICB8fCAoKHNpaC0+YnVzY29yZXR5cGUgPT0gUENJX0NPUkVfSUQpCi0JCQkgJiYgKHNpaC0+YnVzY29yZXJldiA+PSAweGUpKSkpIHsKLQkJCS8qIHNyb21yZXYgPj0gNCwgcmVhZCBtb3JlICovCi0JCQllcnIgPSBzcHJvbV9yZWFkX3BjaShzaWgsIHNyb213aW5kb3csIDAsIHNyb20sCi0JCQkJCSAgICAgU1JPTTRfV09SRFMsIHRydWUpOwotCQkJc3JvbXJldiA9IHNyb21bU1JPTTRfQ1JDUkVWXSAmIDB4ZmY7Ci0JCX0gZWxzZSBpZiAoZXJyID09IDApIHsKLQkJCS8qIHNyb20gaXMgZ29vZCBhbmQgaXMgcmV2IDwgNCAqLwotCQkJLyogdG9wIHdvcmQgb2Ygc3Byb20gY29udGFpbnMgdmVyc2lvbiBhbmQgY3JjOCAqLwotCQkJc3JvbXJldiA9IHNyb21bU1JPTV9DUkNSRVZdICYgMHhmZjsKLQkJCS8qIGJjbTQ0MDEgc3JvbXMgbWlzcHJvZ3JhbW1lZCAqLwotCQkJaWYgKHNyb21yZXYgPT0gMHgxMCkKLQkJCQlzcm9tcmV2ID0gMTsKLQkJfQotCX0KLSNpZiBkZWZpbmVkKEJDTU5WUkFNUikKLQkvKiBVc2UgT1RQIGlmIFNQUk9NIG5vdCBhdmFpbGFibGUgKi8KLQllbHNlIHsKLQkJZXJyID0gb3RwX3JlYWRfcGNpKHNpaCwgc3JvbSwgU1JPTV9NQVgpOwotCQlpZiAoZXJyID09IDApCi0JCQkvKiBPVFAgb25seSBjb250YWluIFNST00gcmV2OC9yZXY5IGZvciBub3cgKi8KLQkJCXNyb21yZXYgPSBzcm9tW1NST000X0NSQ1JFVl0gJiAweGZmOwotCX0KLSNlbHNlCi0JZWxzZQotCQllcnIgPSAtRU5PREVWOwotI2VuZGlmCi0KLQlpZiAoIWVycikgewotCQkvKiBCaXRtYXNrIGZvciB0aGUgc3JvbXJldiAqLwotCQlzciA9IDEgPDwgc3JvbXJldjsKLQotCQkvKiBzcm9tIHZlcnNpb24gY2hlY2s6IEN1cnJlbnQgdmFsaWQgdmVyc2lvbnM6IDEsIDIsIDMsIDQsIDUsIDgsIDkgKi8KLQkJaWYgKChzciAmIDB4MzNlKSA9PSAwKSB7Ci0JCQllcnIgPSAtRUlOVkFMOwotCQkJZ290byBlcnJvdXQ7Ci0JCX0KLQotCQliYXNlID0ga21hbGxvYyhNQVhTWl9OVlJBTV9WQVJTLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFiYXNlKSB7Ci0JCQllcnIgPSAtRU5PTUVNOwotCQkJZ290byBlcnJvdXQ7Ci0JCX0KLQotCQl2YXJidWZfaW5pdCgmYiwgYmFzZSwgTUFYU1pfTlZSQU1fVkFSUyk7Ci0KLQkJLyogcGFyc2UgU1JPTSBpbnRvIG5hbWU9dmFsdWUgcGFpcnMuICovCi0JCV9pbml0dmFyc19zcm9tX3BjaShzcm9tcmV2LCBzcm9tLCAwLCAmYik7Ci0KLQkJLyogZmluYWwgbnVsbGJ5dGUgdGVybWluYXRvciAqLwotCQl2cCA9IGIuYnVmOwotCQkqdnArKyA9ICdcMCc7Ci0KLQkJZXJyID0gaW5pdHZhcnNfdGFibGUoYmFzZSwgdnAsIHZhcnMsIGNvdW50KTsKLQkJa2ZyZWUoYmFzZSk7Ci0JfQotCi1lcnJvdXQ6Ci0Ja2ZyZWUoc3JvbSk7Ci0JcmV0dXJuIGVycjsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvc3JvbS5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9zcm9tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYzRkMWUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9zcm9tLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZglfQlJDTV9TUk9NX0hfCi0jZGVmaW5lCV9CUkNNX1NST01fSF8KLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLS8qIFByb3RvdHlwZXMgKi8KLWV4dGVybiBpbnQgc3JvbV92YXJfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgYnVzLCB2b2lkICpjdXJtYXAsCi0JCQkgY2hhciAqKnZhcnMsIHVpbnQgKmNvdW50KTsKLQotZXh0ZXJuIGludCBzcm9tX3JlYWQoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGJ1cywgdm9pZCAqY3VybWFwLAotCQkgICAgIHVpbnQgYnl0ZW9mZiwgdWludCBuYnl0ZXMsIHUxNiAqYnVmLCBib29sIGNoZWNrX2NyYyk7Ci0KLS8qIHBhcnNlIHN0YW5kYXJkIFBDTUNJQSBjaXMsIG5vcm1hbGx5IHVzZWQgYnkgU0IvUENNQ0lBL1NESU8vU1BJL09UUAotICogICBhbmQgZXh0cmFjdCBmcm9tIGl0IGludG8gbmFtZT12YWx1ZSBwYWlycwotICovCi1leHRlcm4gaW50IHNyb21fcGFyc2VjaXModTggKipwY2lzLCB1aW50IGNpc2NudCwKLQkJCSBjaGFyICoqdmFycywgdWludCAqY291bnQpOwotI2VuZGlmCQkJCS8qIF9CUkNNX1NST01fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvc3RmLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3N0Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTVmZjAxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvc3RmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgInR5cGVzLmgiCi0jaW5jbHVkZSAiZDExLmgiCi0jaW5jbHVkZSAicmF0ZS5oIgotI2luY2x1ZGUgInBoeS9waHlfaGFsLmgiCi0jaW5jbHVkZSAiY2hhbm5lbC5oIgotI2luY2x1ZGUgIm1haW4uaCIKLSNpbmNsdWRlICJibWFjLmgiCi0jaW5jbHVkZSAic3RmLmgiCi0KLSNkZWZpbmUgTUlOX1NQQVRJQUxfRVhQQU5TSU9OCTAKLSNkZWZpbmUgTUFYX1NQQVRJQUxfRVhQQU5TSU9OCTEKLQotI2RlZmluZSBCUkNNU19TVEZfU1NfU1RCQ19SWCh3bGMpIChCUkNNU19JU05QSFkod2xjLT5iYW5kKSAmJiBcCi0JTlJFVl9HVCh3bGMtPmJhbmQtPnBoeXJldiwgMykgJiYgTlJFVl9MRSh3bGMtPmJhbmQtPnBoeXJldiwgNikpCi0KLXN0YXRpYyBib29sIGJyY21zX2Nfc3RmX3N0YmNfdHhfc2V0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgczMyIGludF92YWwpOwotc3RhdGljIGludCBicmNtc19jX3N0Zl90eGNvcmVfc2V0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdTggTnN0cywgdTggdmFsKTsKLXN0YXRpYyBpbnQgYnJjbXNfY19zdGZfc3BhdGlhbF9wb2xpY3lfc2V0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgaW50IHZhbCk7Ci1zdGF0aWMgdm9pZCBicmNtc19jX3N0Zl9zdGJjX3J4X2h0X3VwZGF0ZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGludCB2YWwpOwotCi1zdGF0aWMgdm9pZCBfYnJjbXNfY19zdGZfcGh5X3R4YW50X3VwZChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotc3RhdGljIHUxNiBfYnJjbXNfY19zdGZfcGh5dHhjaGFpbl9zZWwoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJCSAgICAgICByYXRlc3BlY190IHJzcGVjKTsKLQotI2RlZmluZSBOU1RTXzEJMQotI2RlZmluZSBOU1RTXzIJMgotI2RlZmluZSBOU1RTXzMJMwotI2RlZmluZSBOU1RTXzQJNAotY29uc3QgdTggdHhjb3JlX2RlZmF1bHRbNV0gPSB7Ci0JKDApLAkJCS8qIGJpdG1hcCBvZiB0aGUgY29yZSBlbmFibGVkICovCi0JKDB4MDEpLAkJCS8qIEZvciBOc3RzID0gMSwgZW5hYmxlIGNvcmUgMSAqLwotCSgweDAzKSwJCQkvKiBGb3IgTnN0cyA9IDIsIGVuYWJsZSBjb3JlIDEgJiAyICovCi0JKDB4MDcpLAkJCS8qIEZvciBOc3RzID0gMywgZW5hYmxlIGNvcmUgMSwgMiAmIDMgKi8KLQkoMHgwZikJCQkvKiBGb3IgTnN0cyA9IDQsIGVuYWJsZSBhbGwgY29yZXMgKi8KLX07Ci0KLXN0YXRpYyB2b2lkIGJyY21zX2Nfc3RmX3N0YmNfcnhfaHRfdXBkYXRlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgaW50IHZhbCkKLXsKLQkvKiBNSU1PUEhZcyByZXYzLTYgY2Fubm90IHJlY2VpdmUgU1RCQyB3aXRoIG9ubHkgb25lIHJ4IGNvcmUgYWN0aXZlICovCi0JaWYgKEJSQ01TX1NURl9TU19TVEJDX1JYKHdsYykpIHsKLQkJaWYgKCh3bGMtPnN0Zi0+cnhzdHJlYW1zID09IDEpICYmICh2YWwgIT0gSFRfQ0FQX1JYX1NUQkNfTk8pKQotCQkJcmV0dXJuOwotCX0KLQotCXdsYy0+aHRfY2FwLmNhcF9pbmZvICY9IH5JRUVFODAyMTFfSFRfQ0FQX1JYX1NUQkM7Ci0Jd2xjLT5odF9jYXAuY2FwX2luZm8gfD0gKHZhbCA8PCBJRUVFODAyMTFfSFRfQ0FQX1JYX1NUQkNfU0hJRlQpOwotCi0JaWYgKHdsYy0+cHViLT51cCkgewotCQlicmNtc19jX3VwZGF0ZV9iZWFjb24od2xjKTsKLQkJYnJjbXNfY191cGRhdGVfcHJvYmVfcmVzcCh3bGMsIHRydWUpOwotCX0KLX0KLQotLyogZXZlcnkgV0xDX1RFTVBTRU5TRV9QRVJJT0Qgc2Vjb25kcyB0ZW1wZXJhdHVyZSBjaGVjayB0byBkZWNpZGUgd2hldGhlciB0byB0dXJuIG9uL29mZiB0eGNoYWluICovCi12b2lkIGJyY21zX2NfdGVtcHNlbnNlX3VwZChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0Jc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpID0gd2xjLT5iYW5kLT5waTsKLQl1aW50IGFjdGl2ZV9jaGFpbnMsIHR4Y2hhaW47Ci0KLQkvKiBDaGVjayBpZiB0aGUgY2hpcCBpcyB0b28gaG90LiBEaXNhYmxlIG9uZSBUeCBjaGFpbiwgaWYgaXQgaXMgKi8KLQkvKiBoaWdoIDQgYml0cyBhcmUgZm9yIFJ4IGNoYWluLCBsb3cgNCBiaXRzIGFyZSAgZm9yIFR4IGNoYWluICovCi0JYWN0aXZlX2NoYWlucyA9IHdsY19waHlfc3RmX2NoYWluX2FjdGl2ZV9nZXQocGkpOwotCXR4Y2hhaW4gPSBhY3RpdmVfY2hhaW5zICYgMHhmOwotCi0JaWYgKHdsYy0+c3RmLT50eGNoYWluID09IHdsYy0+c3RmLT5od190eGNoYWluKSB7Ci0JCWlmICh0eGNoYWluICYmICh0eGNoYWluIDwgd2xjLT5zdGYtPmh3X3R4Y2hhaW4pKSB7Ci0JCQkvKiB0dXJuIG9mZiAxIHR4IGNoYWluICovCi0JCQlicmNtc19jX3N0Zl90eGNoYWluX3NldCh3bGMsIHR4Y2hhaW4sIHRydWUpOwotCQl9Ci0JfSBlbHNlIGlmICh3bGMtPnN0Zi0+dHhjaGFpbiA8IHdsYy0+c3RmLT5od190eGNoYWluKSB7Ci0JCWlmICh0eGNoYWluID09IHdsYy0+c3RmLT5od190eGNoYWluKSB7Ci0JCQkvKiB0dXJuIGJhY2sgb24gdHhjaGFpbiAqLwotCQkJYnJjbXNfY19zdGZfdHhjaGFpbl9zZXQod2xjLCB0eGNoYWluLCB0cnVlKTsKLQkJfQotCX0KLX0KLQotdm9pZAotYnJjbXNfY19zdGZfc3NfYWxnb19jaGFubmVsX2dldChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHUxNiAqc3NfYWxnb19jaGFubmVsLAotCQkJICAgIGNoYW5zcGVjX3QgY2hhbnNwZWMpCi17Ci0Jc3RydWN0IHR4X3Bvd2VyIHBvd2VyOwotCXU4IHNpc29fbWNzX2lkLCBjZGRfbWNzX2lkLCBzdGJjX21jc19pZDsKLQotCS8qIENsZWFyIHByZXZpb3VzIHNldHRpbmdzICovCi0JKnNzX2FsZ29fY2hhbm5lbCA9IDA7Ci0KLQlpZiAoIXdsYy0+cHViLT51cCkgewotCQkqc3NfYWxnb19jaGFubmVsID0gKHUxNikgLTE7Ci0JCXJldHVybjsKLQl9Ci0KLQl3bGNfcGh5X3R4cG93ZXJfZ2V0X2N1cnJlbnQod2xjLT5iYW5kLT5waSwgJnBvd2VyLAotCQkJCSAgICBDSFNQRUNfQ0hBTk5FTChjaGFuc3BlYykpOwotCi0Jc2lzb19tY3NfaWQgPSAoQ0hTUEVDX0lTNDAoY2hhbnNwZWMpKSA/Ci0JICAgIFdMX1RYX1BPV0VSX01DUzQwX1NJU09fRklSU1QgOiBXTF9UWF9QT1dFUl9NQ1MyMF9TSVNPX0ZJUlNUOwotCWNkZF9tY3NfaWQgPSAoQ0hTUEVDX0lTNDAoY2hhbnNwZWMpKSA/Ci0JICAgIFdMX1RYX1BPV0VSX01DUzQwX0NERF9GSVJTVCA6IFdMX1RYX1BPV0VSX01DUzIwX0NERF9GSVJTVDsKLQlzdGJjX21jc19pZCA9IChDSFNQRUNfSVM0MChjaGFuc3BlYykpID8KLQkgICAgV0xfVFhfUE9XRVJfTUNTNDBfU1RCQ19GSVJTVCA6IFdMX1RYX1BPV0VSX01DUzIwX1NUQkNfRklSU1Q7Ci0KLQkvKiBjcml0ZXJpYSB0byBjaG9vc2Ugc3RmIG1vZGUgKi8KLQotCS8qIHRoZSAiKzNkYm0gKDEyIDAuMjVkYiB1bml0cykiIGlzIHRvIGFjY291bnQgZm9yIHRoZSBmYWN0IHRoYXQgd2l0aCBDREQsIHR4IG9jY3VycwotCSAqIG9uIGJvdGggY2hhaW5zCi0JICovCi0JaWYgKHBvd2VyLnRhcmdldFtzaXNvX21jc19pZF0gPiAocG93ZXIudGFyZ2V0W2NkZF9tY3NfaWRdICsgMTIpKQotCQlzZXRiaXQoc3NfYWxnb19jaGFubmVsLCBQSFlfVFhDMV9NT0RFX1NJU08pOwotCWVsc2UKLQkJc2V0Yml0KHNzX2FsZ29fY2hhbm5lbCwgUEhZX1RYQzFfTU9ERV9DREQpOwotCi0JLyogU1RCQyBpcyBPUmVkIGludG8gdG8gYWxnbyBjaGFubmVsIGFzIFNUQkMgcmVxdWlyZXMgcGVyLXBhY2tldCBTQ0IgY2FwYWJpbGl0eSBjaGVjawotCSAqIHNvIGNhbm5vdCBiZSBkZWZhdWx0IG1vZGUgb2Ygb3BlcmF0aW9uLiBPbmUgb2YgU0lTTywgQ0REIGhhdmUgdG8gYmUgc2V0Ci0JICovCi0JaWYgKHBvd2VyLnRhcmdldFtzaXNvX21jc19pZF0gPD0gKHBvd2VyLnRhcmdldFtzdGJjX21jc19pZF0gKyAxMikpCi0JCXNldGJpdChzc19hbGdvX2NoYW5uZWwsIFBIWV9UWEMxX01PREVfU1RCQyk7Ci19Ci0KLXN0YXRpYyBib29sIGJyY21zX2Nfc3RmX3N0YmNfdHhfc2V0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgczMyIGludF92YWwpCi17Ci0JaWYgKChpbnRfdmFsICE9IEFVVE8pICYmIChpbnRfdmFsICE9IE9GRikgJiYgKGludF92YWwgIT0gT04pKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlpZiAoKGludF92YWwgPT0gT04pICYmICh3bGMtPnN0Zi0+dHhzdHJlYW1zID09IDEpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlpZiAoKGludF92YWwgPT0gT0ZGKSB8fCAod2xjLT5zdGYtPnR4c3RyZWFtcyA9PSAxKQotCSAgICB8fCAhQlJDTVNfU1RCQ19DQVBfUEhZKHdsYykpCi0JCXdsYy0+aHRfY2FwLmNhcF9pbmZvICY9IH5JRUVFODAyMTFfSFRfQ0FQX1RYX1NUQkM7Ci0JZWxzZQotCQl3bGMtPmh0X2NhcC5jYXBfaW5mbyB8PSBJRUVFODAyMTFfSFRfQ0FQX1RYX1NUQkM7Ci0KLQl3bGMtPmJhbmRzdGF0ZVtCQU5EXzJHX0lOREVYXS0+YmFuZF9zdGZfc3RiY190eCA9IChzOCkgaW50X3ZhbDsKLQl3bGMtPmJhbmRzdGF0ZVtCQU5EXzVHX0lOREVYXS0+YmFuZF9zdGZfc3RiY190eCA9IChzOCkgaW50X3ZhbDsKLQotCXJldHVybiB0cnVlOwotfQotCi1ib29sIGJyY21zX2Nfc3RmX3N0YmNfcnhfc2V0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgczMyIGludF92YWwpCi17Ci0JaWYgKChpbnRfdmFsICE9IEhUX0NBUF9SWF9TVEJDX05PKQotCSAgICAmJiAoaW50X3ZhbCAhPSBIVF9DQVBfUlhfU1RCQ19PTkVfU1RSRUFNKSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JaWYgKEJSQ01TX1NURl9TU19TVEJDX1JYKHdsYykpIHsKLQkJaWYgKChpbnRfdmFsICE9IEhUX0NBUF9SWF9TVEJDX05PKQotCQkgICAgJiYgKHdsYy0+c3RmLT5yeHN0cmVhbXMgPT0gMSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JYnJjbXNfY19zdGZfc3RiY19yeF9odF91cGRhdGUod2xjLCBpbnRfdmFsKTsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGludCBicmNtc19jX3N0Zl90eGNvcmVfc2V0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdTggTnN0cywKLQkJCQkgIHU4IGNvcmVfbWFzaykKLXsKLQlCQ01NU0cod2xjLT53aXBoeSwgIndsJWQ6IE5zdHMgJWQgY29yZV9tYXNrICV4XG4iLAotCQkgd2xjLT5wdWItPnVuaXQsIE5zdHMsIGNvcmVfbWFzayk7Ci0KLQlpZiAoQlJDTVNfQklUU0NOVChjb3JlX21hc2spID4gd2xjLT5zdGYtPnR4c3RyZWFtcykgewotCQljb3JlX21hc2sgPSAwOwotCX0KLQotCWlmICgoQlJDTVNfQklUU0NOVChjb3JlX21hc2spID09IHdsYy0+c3RmLT50eHN0cmVhbXMpICYmCi0JICAgICgoY29yZV9tYXNrICYgfndsYy0+c3RmLT50eGNoYWluKQotCSAgICAgfHwgIShjb3JlX21hc2sgJiB3bGMtPnN0Zi0+dHhjaGFpbikpKSB7Ci0JCWNvcmVfbWFzayA9IHdsYy0+c3RmLT50eGNoYWluOwotCX0KLQotCXdsYy0+c3RmLT50eGNvcmVbTnN0c10gPSBjb3JlX21hc2s7Ci0JLyogTnN0cyA9IDEuLjQsIHR4Y29yZSBpbmRleCA9IDEuLjQgKi8KLQlpZiAoTnN0cyA9PSAxKSB7Ci0JCS8qIE5lZWRzIHRvIHVwZGF0ZSBiZWFjb24gYW5kIHVjb2RlIGdlbmVyYXRlZCByZXNwb25zZQotCQkgKiBmcmFtZXMgd2hlbiAxIHN0cmVhbSBjb3JlIG1hcCBjaGFuZ2VkCi0JCSAqLwotCQl3bGMtPnN0Zi0+cGh5dHhhbnQgPSBjb3JlX21hc2sgPDwgUEhZX1RYQ19BTlRfU0hJRlQ7Ci0JCWJyY21zX2JfdHhhbnRfc2V0KHdsYy0+aHcsIHdsYy0+c3RmLT5waHl0eGFudCk7Ci0JCWlmICh3bGMtPmNsaykgewotCQkJYnJjbXNfY19zdXNwZW5kX21hY19hbmRfd2FpdCh3bGMpOwotCQkJYnJjbXNfY19iZWFjb25fcGh5dHhjdGxfdHhhbnRfdXBkKHdsYywgd2xjLT5iY25fcnNwZWMpOwotCQkJYnJjbXNfY19lbmFibGVfbWFjKHdsYyk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBicmNtc19jX3N0Zl9zcGF0aWFsX3BvbGljeV9zZXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBpbnQgdmFsKQotewotCWludCBpOwotCXU4IGNvcmVfbWFzayA9IDA7Ci0KLQlCQ01NU0cod2xjLT53aXBoeSwgIndsJWQ6IHZhbCAleFxuIiwgd2xjLT5wdWItPnVuaXQsIHZhbCk7Ci0KLQl3bGMtPnN0Zi0+c3BhdGlhbF9wb2xpY3kgPSAoczgpIHZhbDsKLQlmb3IgKGkgPSAxOyBpIDw9IE1BWF9TVFJFQU1TX1NVUFBPUlRFRDsgaSsrKSB7Ci0JCWNvcmVfbWFzayA9ICh2YWwgPT0gTUFYX1NQQVRJQUxfRVhQQU5TSU9OKSA/Ci0JCSAgICB3bGMtPnN0Zi0+dHhjaGFpbiA6IHR4Y29yZV9kZWZhdWx0W2ldOwotCQlicmNtc19jX3N0Zl90eGNvcmVfc2V0KHdsYywgKHU4KSBpLCBjb3JlX21hc2spOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGJyY21zX2Nfc3RmX3R4Y2hhaW5fc2V0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgczMyIGludF92YWwsIGJvb2wgZm9yY2UpCi17Ci0JdTggdHhjaGFpbiA9ICh1OCkgaW50X3ZhbDsKLQl1OCB0eHN0cmVhbXM7Ci0JdWludCBpOwotCi0JaWYgKHdsYy0+c3RmLT50eGNoYWluID09IHR4Y2hhaW4pCi0JCXJldHVybiAwOwotCi0JaWYgKCh0eGNoYWluICYgfndsYy0+c3RmLT5od190eGNoYWluKQotCSAgICB8fCAhKHR4Y2hhaW4gJiB3bGMtPnN0Zi0+aHdfdHhjaGFpbikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogaWYgbnJhdGUgb3ZlcnJpZGUgaXMgY29uZmlndXJlZCB0byBiZSBub24tU0lTTyBTVEYgbW9kZSwgcmVqZWN0IHJlZHVjaW5nIHR4Y2hhaW4gdG8gMSAqLwotCXR4c3RyZWFtcyA9ICh1OCkgQlJDTVNfQklUU0NOVCh0eGNoYWluKTsKLQlpZiAodHhzdHJlYW1zID4gTUFYX1NUUkVBTVNfU1VQUE9SVEVEKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICh0eHN0cmVhbXMgPT0gMSkgewotCQlmb3IgKGkgPSAwOyBpIDwgTkJBTkRTKHdsYyk7IGkrKykKLQkJCWlmICgoUlNQRUNfU1RGKHdsYy0+YmFuZHN0YXRlW2ldLT5yc3BlY19vdmVycmlkZSkgIT0KLQkJCSAgICAgUEhZX1RYQzFfTU9ERV9TSVNPKQotCQkJICAgIHx8IChSU1BFQ19TVEYod2xjLT5iYW5kc3RhdGVbaV0tPm1yc3BlY19vdmVycmlkZSkgIT0KLQkJCQlQSFlfVFhDMV9NT0RFX1NJU08pKSB7Ci0JCQkJaWYgKCFmb3JjZSkKLQkJCQkJcmV0dXJuIC1FQkFERTsKLQotCQkJCS8qIG92ZXItd3JpdGUgdGhlIG92ZXJyaWRlIHJzcGVjICovCi0JCQkJaWYgKFJTUEVDX1NURih3bGMtPmJhbmRzdGF0ZVtpXS0+cnNwZWNfb3ZlcnJpZGUpCi0JCQkJICAgICE9IFBIWV9UWEMxX01PREVfU0lTTykgewotCQkJCQl3bGMtPmJhbmRzdGF0ZVtpXS0+cnNwZWNfb3ZlcnJpZGUgPSAwOwotCQkJCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIiVzKCk6IHRlbXAgIgotCQkJCQkJICAic2Vuc2Ugb3ZlcnJpZGUgbm9uLVNJU08gIgotCQkJCQkJICAicnNwZWNfb3ZlcnJpZGVcbiIsCi0JCQkJCQkgIF9fZnVuY19fKTsKLQkJCQl9Ci0JCQkJaWYgKFJTUEVDX1NURgotCQkJCSAgICAod2xjLT5iYW5kc3RhdGVbaV0tPm1yc3BlY19vdmVycmlkZSkgIT0KLQkJCQkgICAgUEhZX1RYQzFfTU9ERV9TSVNPKSB7Ci0JCQkJCXdsYy0+YmFuZHN0YXRlW2ldLT5tcnNwZWNfb3ZlcnJpZGUgPSAwOwotCQkJCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIiVzKCk6IHRlbXAgIgotCQkJCQkJICAic2Vuc2Ugb3ZlcnJpZGUgbm9uLVNJU08gIgotCQkJCQkJICAibXJzcGVjX292ZXJyaWRlXG4iLAotCQkJCQkJICBfX2Z1bmNfXyk7Ci0JCQkJfQotCQkJfQotCX0KLQotCXdsYy0+c3RmLT50eGNoYWluID0gdHhjaGFpbjsKLQl3bGMtPnN0Zi0+dHhzdHJlYW1zID0gdHhzdHJlYW1zOwotCWJyY21zX2Nfc3RmX3N0YmNfdHhfc2V0KHdsYywgd2xjLT5iYW5kLT5iYW5kX3N0Zl9zdGJjX3R4KTsKLQlicmNtc19jX3N0Zl9zc191cGRhdGUod2xjLCB3bGMtPmJhbmRzdGF0ZVtCQU5EXzJHX0lOREVYXSk7Ci0JYnJjbXNfY19zdGZfc3NfdXBkYXRlKHdsYywgd2xjLT5iYW5kc3RhdGVbQkFORF81R19JTkRFWF0pOwotCXdsYy0+c3RmLT50eGFudCA9Ci0JICAgICh3bGMtPnN0Zi0+dHhzdHJlYW1zID09IDEpID8gQU5UX1RYX0ZPUkNFXzAgOiBBTlRfVFhfREVGOwotCV9icmNtc19jX3N0Zl9waHlfdHhhbnRfdXBkKHdsYyk7Ci0KLQl3bGNfcGh5X3N0Zl9jaGFpbl9zZXQod2xjLT5iYW5kLT5waSwgd2xjLT5zdGYtPnR4Y2hhaW4sCi0JCQkgICAgICB3bGMtPnN0Zi0+cnhjaGFpbik7Ci0KLQlmb3IgKGkgPSAxOyBpIDw9IE1BWF9TVFJFQU1TX1NVUFBPUlRFRDsgaSsrKQotCQlicmNtc19jX3N0Zl90eGNvcmVfc2V0KHdsYywgKHU4KSBpLCB0eGNvcmVfZGVmYXVsdFtpXSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogdXBkYXRlIHdsYy0+c3RmLT5zc19vcG1vZGUgd2hpY2ggcmVwcmVzZW50cyB0aGUgb3BlcmF0aW9uYWwgc3RmX3NzIG1vZGUgd2UncmUgdXNpbmcgKi8KLWludCBicmNtc19jX3N0Zl9zc191cGRhdGUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBzdHJ1Y3QgYnJjbXNfYmFuZCAqYmFuZCkKLXsKLQlpbnQgcmV0X2NvZGUgPSAwOwotCXU4IHByZXZfc3RmX3NzOwotCXU4IHVwZF9zdGZfc3M7Ci0KLQlwcmV2X3N0Zl9zcyA9IHdsYy0+c3RmLT5zc19vcG1vZGU7Ci0KLQkvKiBOT1RFOiBvcG1vZGUgY2FuIG9ubHkgYmUgU0lTTyBvciBDREQgYXMgU1RCQyBpcyBkZWNpZGVkIG9uIGEgcGVyLXBhY2tldCBiYXNpcyAqLwotCWlmIChCUkNNU19TVEJDX0NBUF9QSFkod2xjKSAmJgotCSAgICB3bGMtPnN0Zi0+c3NfYWxnb3NlbF9hdXRvCi0JICAgICYmICh3bGMtPnN0Zi0+c3NfYWxnb19jaGFubmVsICE9ICh1MTYpIC0xKSkgewotCQl1cGRfc3RmX3NzID0gKHdsYy0+c3RmLT5ub19jZGRzdGJjIHx8ICh3bGMtPnN0Zi0+dHhzdHJlYW1zID09IDEpCi0JCQkgICAgICB8fCBpc3NldCgmd2xjLT5zdGYtPnNzX2FsZ29fY2hhbm5lbCwKLQkJCQkgICAgICAgUEhZX1RYQzFfTU9ERV9TSVNPKSkgPyBQSFlfVFhDMV9NT0RFX1NJU08KLQkJICAgIDogUEhZX1RYQzFfTU9ERV9DREQ7Ci0JfSBlbHNlIHsKLQkJaWYgKHdsYy0+YmFuZCAhPSBiYW5kKQotCQkJcmV0dXJuIHJldF9jb2RlOwotCQl1cGRfc3RmX3NzID0gKHdsYy0+c3RmLT5ub19jZGRzdGJjCi0JCQkgICAgICB8fCAod2xjLT5zdGYtPnR4c3RyZWFtcyA9PQotCQkJCSAgMSkpID8gUEhZX1RYQzFfTU9ERV9TSVNPIDogYmFuZC0+Ci0JCSAgICBiYW5kX3N0Zl9zc19tb2RlOwotCX0KLQlpZiAocHJldl9zdGZfc3MgIT0gdXBkX3N0Zl9zcykgewotCQl3bGMtPnN0Zi0+c3Nfb3Btb2RlID0gdXBkX3N0Zl9zczsKLQkJYnJjbXNfYl9iYW5kX3N0Zl9zc19zZXQod2xjLT5odywgdXBkX3N0Zl9zcyk7Ci0JfQotCi0JcmV0dXJuIHJldF9jb2RlOwotfQotCi1pbnQgYnJjbXNfY19zdGZfYXR0YWNoKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQl3bGMtPmJhbmRzdGF0ZVtCQU5EXzJHX0lOREVYXS0+YmFuZF9zdGZfc3NfbW9kZSA9IFBIWV9UWEMxX01PREVfU0lTTzsKLQl3bGMtPmJhbmRzdGF0ZVtCQU5EXzVHX0lOREVYXS0+YmFuZF9zdGZfc3NfbW9kZSA9IFBIWV9UWEMxX01PREVfQ0REOwotCi0JaWYgKEJSQ01TX0lTTlBIWSh3bGMtPmJhbmQpICYmCi0JICAgICh3bGNfcGh5X3R4cG93ZXJfaHdfY3RybF9nZXQod2xjLT5iYW5kLT5waSkgIT0gUEhZX1RQQ19IV19PTikpCi0JCXdsYy0+YmFuZHN0YXRlW0JBTkRfMkdfSU5ERVhdLT5iYW5kX3N0Zl9zc19tb2RlID0KLQkJICAgIFBIWV9UWEMxX01PREVfQ0REOwotCWJyY21zX2Nfc3RmX3NzX3VwZGF0ZSh3bGMsIHdsYy0+YmFuZHN0YXRlW0JBTkRfMkdfSU5ERVhdKTsKLQlicmNtc19jX3N0Zl9zc191cGRhdGUod2xjLCB3bGMtPmJhbmRzdGF0ZVtCQU5EXzVHX0lOREVYXSk7Ci0KLQlicmNtc19jX3N0Zl9zdGJjX3J4X2h0X3VwZGF0ZSh3bGMsIEhUX0NBUF9SWF9TVEJDX05PKTsKLQl3bGMtPmJhbmRzdGF0ZVtCQU5EXzJHX0lOREVYXS0+YmFuZF9zdGZfc3RiY190eCA9IE9GRjsKLQl3bGMtPmJhbmRzdGF0ZVtCQU5EXzVHX0lOREVYXS0+YmFuZF9zdGZfc3RiY190eCA9IE9GRjsKLQotCWlmIChCUkNNU19TVEJDX0NBUF9QSFkod2xjKSkgewotCQl3bGMtPnN0Zi0+c3NfYWxnb3NlbF9hdXRvID0gdHJ1ZTsKLQkJd2xjLT5zdGYtPnNzX2FsZ29fY2hhbm5lbCA9ICh1MTYpIC0xOwkvKiBJbml0IHRoZSBkZWZhdWx0IHZhbHVlICovCi0JfQotCXJldHVybiAwOwotfQotCi12b2lkIGJyY21zX2Nfc3RmX2RldGFjaChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci19Ci0KLS8qCi0gKiBDZW50cmFsaXplZCB0eGFudCB1cGRhdGUgZnVuY3Rpb24uIGNhbGwgaXQgd2hlbmV2ZXIgd2xjLT5zdGYtPnR4YW50IGFuZC9vciB3bGMtPnN0Zi0+dHhjaGFpbgotICogIGNoYW5nZQotICoKLSAqIEFudGVubmFzIGFyZSBjb250cm9sbGVkIGJ5IHVjb2RlIGluZGlyZWN0bHksIHdoaWNoIGRyaXZlcyBQSFkgb3IgR1BJTyB0bwotICogICBhY2hpZXZlIHZhcmlvdXMgdHgvcnggYW50ZW5uYSBzZWxlY3Rpb24gc2NoZW1lcwotICoKLSAqIGxlZ2FjeSBwaHksIGJpdCA2IGFuZCBiaXQgNyBtZWFucyBhbnRlbm5hIDAgYW5kIDEgcmVzcGVjdGl2ZWx5LCBiaXQ2K2JpdDcgbWVhbnMgYXV0byhsYXN0IHJ4KQotICogZm9yIE5SRVY8MywgYml0IDYgYW5kIGJpdCA3IG1lYW5zIGFudGVubmEgMCBhbmQgMSByZXNwZWN0aXZlbHksIGJpdDYrYml0NyBtZWFucyBsYXN0IHJ4IGFuZAotICogICAgZG8gdHgtYW50ZW5uYSBzZWxlY3Rpb24gZm9yIFNJU08gdHJhbnNtaXNzaW9ucwotICogZm9yIE5SRVY9MywgYml0IDYgYW5kIGJpdCBfOF8gbWVhbnMgYW50ZW5uYSAwIGFuZCAxIHJlc3BlY3RpdmVseSwgYml0NitiaXQ3IG1lYW5zIGxhc3QgcnggYW5kCi0gKiAgICBkbyB0eC1hbnRlbm5hIHNlbGVjdGlvbiBmb3IgU0lTTyB0cmFuc21pc3Npb25zCi0gKiBmb3IgTlJFVj49NywgYml0IDYgYW5kIGJpdCA3IG1lYW4gYW50ZW5uYSAwIGFuZCAxIHJlc3BlY3RpdmVseSwgbml0NitiaXQ3IG1lYW5zIGJvdGggY29yZXMgYWN0aXZlCi0qLwotc3RhdGljIHZvaWQgX2JyY21zX2Nfc3RmX3BoeV90eGFudF91cGQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCXM4IHR4YW50OwotCi0JdHhhbnQgPSAoczgpIHdsYy0+c3RmLT50eGFudDsKLQlpZiAoQlJDTVNfUEhZXzExTl9DQVAod2xjLT5iYW5kKSkgewotCQlpZiAodHhhbnQgPT0gQU5UX1RYX0ZPUkNFXzApIHsKLQkJCXdsYy0+c3RmLT5waHl0eGFudCA9IFBIWV9UWENfQU5UXzA7Ci0JCX0gZWxzZSBpZiAodHhhbnQgPT0gQU5UX1RYX0ZPUkNFXzEpIHsKLQkJCXdsYy0+c3RmLT5waHl0eGFudCA9IFBIWV9UWENfQU5UXzE7Ci0KLQkJCWlmIChCUkNNU19JU05QSFkod2xjLT5iYW5kKSAmJgotCQkJICAgIE5SRVZfR0Uod2xjLT5iYW5kLT5waHlyZXYsIDMpCi0JCQkgICAgJiYgTlJFVl9MVCh3bGMtPmJhbmQtPnBoeXJldiwgNykpIHsKLQkJCQl3bGMtPnN0Zi0+cGh5dHhhbnQgPSBQSFlfVFhDX0FOVF8yOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKEJSQ01TX0lTTENOUEhZKHdsYy0+YmFuZCkgfHwKLQkJCSAgICBCUkNNU19JU1NTTFBOUEhZKHdsYy0+YmFuZCkpCi0JCQkJd2xjLT5zdGYtPnBoeXR4YW50ID0gUEhZX1RYQ19MQ05QSFlfQU5UX0xBU1Q7Ci0JCQllbHNlIHsKLQkJCQkvKiBjYXRjaCBvdXQgb2Ygc3luYyB3bGMtPnN0Zi0+dHhjb3JlICovCi0JCQkJV0FSTl9PTih3bGMtPnN0Zi0+dHhjaGFpbiA8PSAwKTsKLQkJCQl3bGMtPnN0Zi0+cGh5dHhhbnQgPQotCQkJCSAgICB3bGMtPnN0Zi0+dHhjaGFpbiA8PCBQSFlfVFhDX0FOVF9TSElGVDsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWlmICh0eGFudCA9PSBBTlRfVFhfRk9SQ0VfMCkKLQkJCXdsYy0+c3RmLT5waHl0eGFudCA9IFBIWV9UWENfT0xEX0FOVF8wOwotCQllbHNlIGlmICh0eGFudCA9PSBBTlRfVFhfRk9SQ0VfMSkKLQkJCXdsYy0+c3RmLT5waHl0eGFudCA9IFBIWV9UWENfT0xEX0FOVF8xOwotCQllbHNlCi0JCQl3bGMtPnN0Zi0+cGh5dHhhbnQgPSBQSFlfVFhDX09MRF9BTlRfTEFTVDsKLQl9Ci0KLQlicmNtc19iX3R4YW50X3NldCh3bGMtPmh3LCB3bGMtPnN0Zi0+cGh5dHhhbnQpOwotfQotCi12b2lkIGJyY21zX2Nfc3RmX3BoeV90eGFudF91cGQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCV9icmNtc19jX3N0Zl9waHlfdHhhbnRfdXBkKHdsYyk7Ci19Ci0KLXZvaWQgYnJjbXNfY19zdGZfcGh5X2NoYWluX2NhbGMoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCS8qIGdldCBhdmFpbGFibGUgcngvdHggY2hhaW5zICovCi0Jd2xjLT5zdGYtPmh3X3R4Y2hhaW4gPSAodTgpIGdldGludHZhcih3bGMtPnB1Yi0+dmFycywgInR4Y2hhaW4iKTsKLQl3bGMtPnN0Zi0+aHdfcnhjaGFpbiA9ICh1OCkgZ2V0aW50dmFyKHdsYy0+cHViLT52YXJzLCAicnhjaGFpbiIpOwotCi0JLyogdGhlc2UgcGFyYW1ldGVyIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciBhbGwgUEhZIHR5cGVzICovCi0JaWYgKHdsYy0+c3RmLT5od190eGNoYWluID09IDAgfHwgd2xjLT5zdGYtPmh3X3R4Y2hhaW4gPT0gMHhmKSB7Ci0JCWlmIChCUkNNU19JU05QSFkod2xjLT5iYW5kKSkgewotCQkJd2xjLT5zdGYtPmh3X3R4Y2hhaW4gPSBUWENIQUlOX0RFRl9OUEhZOwotCQl9IGVsc2UgewotCQkJd2xjLT5zdGYtPmh3X3R4Y2hhaW4gPSBUWENIQUlOX0RFRjsKLQkJfQotCX0KLQotCXdsYy0+c3RmLT50eGNoYWluID0gd2xjLT5zdGYtPmh3X3R4Y2hhaW47Ci0Jd2xjLT5zdGYtPnR4c3RyZWFtcyA9ICh1OCkgQlJDTVNfQklUU0NOVCh3bGMtPnN0Zi0+aHdfdHhjaGFpbik7Ci0KLQlpZiAod2xjLT5zdGYtPmh3X3J4Y2hhaW4gPT0gMCB8fCB3bGMtPnN0Zi0+aHdfcnhjaGFpbiA9PSAweGYpIHsKLQkJaWYgKEJSQ01TX0lTTlBIWSh3bGMtPmJhbmQpKSB7Ci0JCQl3bGMtPnN0Zi0+aHdfcnhjaGFpbiA9IFJYQ0hBSU5fREVGX05QSFk7Ci0JCX0gZWxzZSB7Ci0JCQl3bGMtPnN0Zi0+aHdfcnhjaGFpbiA9IFJYQ0hBSU5fREVGOwotCQl9Ci0JfQotCi0Jd2xjLT5zdGYtPnJ4Y2hhaW4gPSB3bGMtPnN0Zi0+aHdfcnhjaGFpbjsKLQl3bGMtPnN0Zi0+cnhzdHJlYW1zID0gKHU4KSBCUkNNU19CSVRTQ05UKHdsYy0+c3RmLT5od19yeGNoYWluKTsKLQotCS8qIGluaXRpYWxpemUgdGhlIHR4Y29yZSB0YWJsZSAqLwotCW1lbWNweSh3bGMtPnN0Zi0+dHhjb3JlLCB0eGNvcmVfZGVmYXVsdCwgc2l6ZW9mKHdsYy0+c3RmLT50eGNvcmUpKTsKLQotCS8qIGRlZmF1bHQgc3BhdGlhbF9wb2xpY3kgKi8KLQl3bGMtPnN0Zi0+c3BhdGlhbF9wb2xpY3kgPSBNSU5fU1BBVElBTF9FWFBBTlNJT047Ci0JYnJjbXNfY19zdGZfc3BhdGlhbF9wb2xpY3lfc2V0KHdsYywgTUlOX1NQQVRJQUxfRVhQQU5TSU9OKTsKLX0KLQotc3RhdGljIHUxNiBfYnJjbXNfY19zdGZfcGh5dHhjaGFpbl9zZWwoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJCSAgICAgICByYXRlc3BlY190IHJzcGVjKQotewotCXUxNiBwaHl0eGFudCA9IHdsYy0+c3RmLT5waHl0eGFudDsKLQotCWlmIChSU1BFQ19TVEYocnNwZWMpICE9IFBIWV9UWEMxX01PREVfU0lTTykgewotCQlwaHl0eGFudCA9IHdsYy0+c3RmLT50eGNoYWluIDw8IFBIWV9UWENfQU5UX1NISUZUOwotCX0gZWxzZSBpZiAod2xjLT5zdGYtPnR4YW50ID09IEFOVF9UWF9ERUYpCi0JCXBoeXR4YW50ID0gd2xjLT5zdGYtPnR4Y2hhaW4gPDwgUEhZX1RYQ19BTlRfU0hJRlQ7Ci0JcGh5dHhhbnQgJj0gUEhZX1RYQ19BTlRfTUFTSzsKLQlyZXR1cm4gcGh5dHhhbnQ7Ci19Ci0KLXUxNiBicmNtc19jX3N0Zl9waHl0eGNoYWluX3NlbChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHJhdGVzcGVjX3QgcnNwZWMpCi17Ci0JcmV0dXJuIF9icmNtc19jX3N0Zl9waHl0eGNoYWluX3NlbCh3bGMsIHJzcGVjKTsKLX0KLQotdTE2IGJyY21zX2Nfc3RmX2QxMWhkcnNfcGh5Y3RsX3R4YW50KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgcmF0ZXNwZWNfdCByc3BlYykKLXsKLQl1MTYgcGh5dHhhbnQgPSB3bGMtPnN0Zi0+cGh5dHhhbnQ7Ci0JdTE2IG1hc2sgPSBQSFlfVFhDX0FOVF9NQVNLOwotCi0JLyogZm9yIG5vbi1zaXNvIHJhdGVzIG9yIGRlZmF1bHQgc2V0dGluZywgdXNlIHRoZSBhdmFpbGFibGUgY2hhaW5zICovCi0JaWYgKEJSQ01TX0lTTlBIWSh3bGMtPmJhbmQpKSB7Ci0JCXBoeXR4YW50ID0gX2JyY21zX2Nfc3RmX3BoeXR4Y2hhaW5fc2VsKHdsYywgcnNwZWMpOwotCQltYXNrID0gUEhZX1RYQ19IVEFOVF9NQVNLOwotCX0KLQlwaHl0eGFudCB8PSBwaHl0eGFudCAmIG1hc2s7Ci0JcmV0dXJuIHBoeXR4YW50OwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9zdGYuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvc3RmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YzJhMzkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy9zdGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmIF9CUkNNX1NURl9IXwotI2RlZmluZSBfQlJDTV9TVEZfSF8KLQotI2luY2x1ZGUgInR5cGVzLmgiCi0KLWV4dGVybiBpbnQgYnJjbXNfY19zdGZfYXR0YWNoKHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1leHRlcm4gdm9pZCBicmNtc19jX3N0Zl9kZXRhY2goc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKLQotZXh0ZXJuIHZvaWQgYnJjbXNfY190ZW1wc2Vuc2VfdXBkKHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1leHRlcm4gdm9pZCBicmNtc19jX3N0Zl9zc19hbGdvX2NoYW5uZWxfZ2V0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywKLQkJCQkJdTE2ICpzc19hbGdvX2NoYW5uZWwsCi0JCQkJCWNoYW5zcGVjX3QgY2hhbnNwZWMpOwotZXh0ZXJuIGludCBicmNtc19jX3N0Zl9zc191cGRhdGUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJICAgICBzdHJ1Y3QgYnJjbXNfYmFuZCAqYmFuZCk7Ci1leHRlcm4gdm9pZCBicmNtc19jX3N0Zl9waHlfdHhhbnRfdXBkKHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1leHRlcm4gaW50IGJyY21zX2Nfc3RmX3R4Y2hhaW5fc2V0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgczMyIGludF92YWwsCi0JCQkgICAgICAgYm9vbCBmb3JjZSk7Ci1leHRlcm4gYm9vbCBicmNtc19jX3N0Zl9zdGJjX3J4X3NldChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHMzMiBpbnRfdmFsKTsKLWV4dGVybiB2b2lkIGJyY21zX2Nfc3RmX3BoeV90eGFudF91cGQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKLWV4dGVybiB2b2lkIGJyY21zX2Nfc3RmX3BoeV9jaGFpbl9jYWxjKHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7Ci1leHRlcm4gdTE2IGJyY21zX2Nfc3RmX3BoeXR4Y2hhaW5fc2VsKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywKLQkJCQkgICAgICByYXRlc3BlY190IHJzcGVjKTsKLWV4dGVybiB1MTYgYnJjbXNfY19zdGZfZDExaGRyc19waHljdGxfdHhhbnQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJCQlyYXRlc3BlY190IHJzcGVjKTsKLQotI2VuZGlmCQkJCS8qIF9CUkNNX1NURl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy90eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjNiNWU0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXNtYWMvdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZiBfQlJDTV9UWVBFU19IXwotI2RlZmluZSBfQlJDTV9UWVBFU19IXwotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotCi0vKiBCdXMgdHlwZXMgKi8KLSNkZWZpbmUJU0lfQlVTCQkJMAkvKiBTT0MgSW50ZXJjb25uZWN0ICovCi0jZGVmaW5lCVBDSV9CVVMJCQkxCS8qIFBDSSB0YXJnZXQgKi8KLSNkZWZpbmUgU0RJT19CVVMJCTMJLyogU0RJTyB0YXJnZXQgKi8KLSNkZWZpbmUgSlRBR19CVVMJCTQJLyogSlRBRyAqLwotI2RlZmluZSBVU0JfQlVTCQkJNQkvKiBVU0IgKGRvZXMgbm90IHN1cHBvcnQgUi9XIFJFRykgKi8KLSNkZWZpbmUgU1BJX0JVUwkJCTYJLyogZ1NQSSB0YXJnZXQgKi8KLSNkZWZpbmUgUlBDX0JVUwkJCTcJLyogUlBDIHRhcmdldCAqLwotCi0jZGVmaW5lIFdMX0NIQU5fRlJFUV9SQU5HRV8yRyAgICAgIDAKLSNkZWZpbmUgV0xfQ0hBTl9GUkVRX1JBTkdFXzVHTCAgICAgMQotI2RlZmluZSBXTF9DSEFOX0ZSRVFfUkFOR0VfNUdNICAgICAyCi0jZGVmaW5lIFdMX0NIQU5fRlJFUV9SQU5HRV81R0ggICAgIDMKLQotI2RlZmluZSBNQVhfRE1BX1NFR1MgNAotCi0vKiBib2FyZGZsYWdzICovCi0jZGVmaW5lCUJGTF9QQUNUUkwJCTB4MDAwMDAwMDIJLyogQm9hcmQgaGFzIGdwaW8gOSBjb250cm9sbGluZyB0aGUgUEEgKi8KLSNkZWZpbmUJQkZMX05PUExMRE9XTgkJMHgwMDAwMDAyMAkvKiBOb3Qgb2sgdG8gcG93ZXIgZG93biB0aGUgY2hpcCBwbGwgYW5kIG9zY2lsbGF0b3IgKi8KLSNkZWZpbmUgQkZMX0ZFTQkJCTB4MDAwMDA4MDAJLyogQm9hcmQgc3VwcG9ydHMgdGhlIEZyb250IEVuZCBNb2R1bGUgKi8KLSNkZWZpbmUgQkZMX0VYVExOQQkJMHgwMDAwMTAwMAkvKiBCb2FyZCBoYXMgYW4gZXh0ZXJuYWwgTE5BIGluIDIuNEdIeiBiYW5kICovCi0jZGVmaW5lIEJGTF9OT1BBCQkweDAwMDEwMDAwCS8qIEJvYXJkIGhhcyBubyBQQSAqLwotI2RlZmluZSBCRkxfQlVDS0JPT1NUCQkweDAwMjAwMDAwCS8qIFBvd2VyIHRvcG9sb2d5IHVzZXMgQlVDS0JPT1NUICovCi0jZGVmaW5lIEJGTF9GRU1fQlQJCTB4MDA0MDAwMDAJLyogQm9hcmQgaGFzIEZFTSBhbmQgc3dpdGNoIHRvIHNoYXJlIGFudGVubmEgdy8gQlQgKi8KLSNkZWZpbmUgQkZMX05PQ0JVQ0sJCTB4MDA4MDAwMDAJLyogUG93ZXIgdG9wb2xvZ3kgZG9lc24ndCB1c2UgQ0JVQ0sgKi8KLSNkZWZpbmUgQkZMX1BBTERPCQkweDAyMDAwMDAwCS8qIFBvd2VyIHRvcG9sb2d5IHVzZXMgUEFMRE8gKi8KLSNkZWZpbmUgQkZMX0VYVExOQV81R0h6CQkweDEwMDAwMDAwCS8qIEJvYXJkIGhhcyBhbiBleHRlcm5hbCBMTkEgaW4gNUdIeiBiYW5kICovCi0KLS8qIGJvYXJkZmxhZ3MyICovCi0jZGVmaW5lIEJGTDJfUlhCQl9JTlRfUkVHX0RJUwkweDAwMDAwMDAxCS8qIEJvYXJkIGhhcyBhbiBleHRlcm5hbCByeGJiIHJlZ3VsYXRvciAqLwotI2RlZmluZSBCRkwyX0FQTExfV0FSCQkweDAwMDAwMDAyCS8qIEZsYWcgdG8gaW1wbGVtZW50IGFsdGVybmF0aXZlIEEtYmFuZCBQTEwgc2V0dGluZ3MgKi8KLSNkZWZpbmUgQkZMMl9UWFBXUkNUUkxfRU4JMHgwMDAwMDAwNAkvKiBCb2FyZCBwZXJtaXRzIGVuYWJsaW5nIFRYIFBvd2VyIENvbnRyb2wgKi8KLSNkZWZpbmUgQkZMMl8yWDRfRElWCQkweDAwMDAwMDA4CS8qIEJvYXJkIHN1cHBvcnRzIHRoZSAyWDQgZGl2ZXJzaXR5IHN3aXRjaCAqLwotI2RlZmluZSBCRkwyXzVHX1BXUkdBSU4JCTB4MDAwMDAwMTAJLyogQm9hcmQgc3VwcG9ydHMgNUcgYmFuZCBwb3dlciBnYWluICovCi0jZGVmaW5lIEJGTDJfUENJRVdBUl9PVlIJMHgwMDAwMDAyMAkvKiBCb2FyZCBvdmVycmlkZXMgQVNQTSBhbmQgQ2xrcmVxIHNldHRpbmdzICovCi0jZGVmaW5lIEJGTDJfTEVHQUNZCQkweDAwMDAwMDgwCi0jZGVmaW5lIEJGTDJfU0tXUktGRU1fQlJECTB4MDAwMDAxMDAJLyogNDMyMW1jbTkzIGJvYXJkIHVzZXMgU2t5d29ya3MgRkVNICovCi0jZGVmaW5lIEJGTDJfU1BVUl9XQVIJCTB4MDAwMDAyMDAJLyogQm9hcmQgaGFzIGEgV0FSIGZvciBjbG9jay1oYXJtb25pYyBzcHVycyAqLwotI2RlZmluZSBCRkwyX0dQTExfV0FSCQkweDAwMDAwNDAwCS8qIEZsYWcgdG8gbmFycm93IEctYmFuZCBQTEwgbG9vcCBiL3cgKi8KLSNkZWZpbmUgQkZMMl9TSU5HTEVBTlRfQ0NLCTB4MDAwMDEwMDAJLyogVHggQ0NLIHBrdHMgb24gQW50IDAgb25seSAqLwotI2RlZmluZSBCRkwyXzJHX1NQVVJfV0FSCTB4MDAwMDIwMDAJLyogV0FSIHRvIHJlZHVjZSBhbmQgYXZvaWQgY2xvY2staGFybW9uaWMgc3B1cnMgaW4gMkcgKi8KLSNkZWZpbmUgQkZMMl9HUExMX1dBUjIJICAgICAgICAweDAwMDEwMDAwCS8qIEZsYWcgdG8gd2lkZW4gRy1iYW5kIFBMTCBsb29wIGIvdyAqLwotI2RlZmluZSBCRkwyX0lQQUxWTFNISUZUXzNQMyAgICAweDAwMDIwMDAwCi0jZGVmaW5lIEJGTDJfSU5URVJOREVUX1RYSVFDQUwgIDB4MDAwNDAwMDAJLyogVXNlIGludGVybmFsIGVudmVsb3BlIGRldGVjdG9yIGZvciBUWCBJUUNBTCAqLwotI2RlZmluZSBCRkwyX1hUQUxCVUZPVVRFTiAgICAgICAweDAwMDgwMDAwCS8qIEtlZXAgdGhlIGJ1ZmZlcmVkIFh0YWwgb3V0cHV0IGZyb20gcmFkaW8gIk9OIgotCQkJCQkJICogTW9zdCBkcml2ZXJzIHdpbGwgdHVybiBpdCBvZmYgd2l0aG91dCB0aGlzIGZsYWcKLQkJCQkJCSAqIHRvIHNhdmUgcG93ZXIuCi0JCQkJCQkgKi8KLQotLyogYm9hcmQgc3BlY2lmaWMgR1BJTyBhc3NpZ25tZW50LCBncGlvIDAtMyBhcmUgYWxzbyBjdXN0b21lci1jb25maWd1cmFibGUgbGVkICovCi0jZGVmaW5lCUJPQVJEX0dQSU9fUEFDVFJMCTB4MjAwCS8qIGJpdCA5IGNvbnRyb2xzIHRoZSBQQSBvbiBuZXcgNDMwNiBib2FyZHMgKi8KLSNkZWZpbmUgQk9BUkRfR1BJT18xMgkJMHgxMDAwCS8qIGdwaW8gMTIgKi8KLSNkZWZpbmUgQk9BUkRfR1BJT18xMwkJMHgyMDAwCS8qIGdwaW8gMTMgKi8KLQotLyogKioqKiBDb3JlIHR5cGUvcmV2IGRlZmF1bHRzICoqKiogKi8KLSNkZWZpbmUgRDExQ09ORgkJMHgwZmZmZmZiMAkvKiBTdXBwb3J0ZWQgIEQxMSByZXZzOiA0LCA1LCA3LTI3Ci0JCQkJCSAqIGFsc28gbmVlZCB0byB1cGRhdGUgd2xjLmggTUFYQ09SRVJFVgotCQkJCQkgKi8KLQotI2RlZmluZSBOQ09ORgkJMHgwMDAwMDFmZgkvKiBTdXBwb3J0ZWQgbnBoeSByZXZzOgotCQkJCQkgKiAgICAgIDAgICAgICAgNDMyMWEwCi0JCQkJCSAqICAgICAgMSAgICAgICA0MzIxYTEKLQkJCQkJICogICAgICAyICAgICAgIDQzMjFiMC9iMS9jMC9jMQotCQkJCQkgKiAgICAgIDMgICAgICAgNDMyMmEwCi0JCQkJCSAqICAgICAgNCAgICAgICA0MzIyYTEKLQkJCQkJICogICAgICA1ICAgICAgIDQ3MTZhMAotCQkJCQkgKiAgICAgIDYgICAgICAgNDMyMjJhMCwgNDMyMjRhMAotCQkJCQkgKiAgICAgIDcgICAgICAgNDMyMjZhMAotCQkJCQkgKiAgICAgIDggICAgICAgNTM1N2EwLCA0MzIzNmEwCi0JCQkJCSAqLwotCi0jZGVmaW5lIExDTkNPTkYJCTB4MDAwMDAwMDcJLyogU3VwcG9ydGVkIGxjbnBoeSByZXZzOgotCQkJCQkgKiAgICAgIDAgICAgICAgNDMxM2EwLCA0MzM2YTAsIDQzMzBhMAotCQkJCQkgKiAgICAgIDEKLQkJCQkJICogICAgICAyICAgICAgIDQzMzBhMAotCQkJCQkgKi8KLQotI2RlZmluZSBTU0xQTkNPTkYJMHgwMDAwMDAwZgkvKiBTdXBwb3J0ZWQgc3NscG5waHkgcmV2czoKLQkJCQkJICogICAgICAwICAgICAgIDQzMjlhMC9rMAotCQkJCQkgKiAgICAgIDEgICAgICAgNDMyOWIwLzQzMjlDMAotCQkJCQkgKiAgICAgIDIgICAgICAgNDMxOWEwCi0JCQkJCSAqICAgICAgMyAgICAgICA1MzU2YTAKLQkJCQkJICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUGh5L0NvcmUgQ29uZmlndXJhdGlvbi4gIERlZmluZXMgbWFjcm9zIHRvIHRvIGNoZWNrIGNvcmUgcGh5L3JldiAqCi0gKiBjb21waWxlLXRpbWUgY29uZmlndXJhdGlvbi4gIERlZmluZXMgZGVmYXVsdCBjb3JlIHN1cHBvcnQuICAgICAgICoKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qIEJhc2ljIG1hY3JvcyB0byBjaGVjayBhIGNvbmZpZ3VyYXRpb24gYml0bWFzayAqLwotCi0jZGVmaW5lIENPTkZfSEFTKGNvbmZpZywgdmFsKQkoKGNvbmZpZykgJiAoMSA8PCAodmFsKSkpCi0jZGVmaW5lIENPTkZfTVNLKGNvbmZpZywgbWFzaykJKChjb25maWcpICYgKG1hc2spKQotI2RlZmluZSBNU0tfUkFOR0UobG93LCBoaSkJKCgxIDw8ICgoaGkpKzEpKSAtICgxIDw8IChsb3cpKSkKLSNkZWZpbmUgQ09ORl9SQU5HRShjb25maWcsIGxvdywgaGkpIChDT05GX01TSyhjb25maWcsIE1TS19SQU5HRShsb3csIGhpZ2gpKSkKLQotI2RlZmluZSBDT05GX0lTKGNvbmZpZywgdmFsKQkoKGNvbmZpZykgPT0gKDEgPDwgKHZhbCkpKQotI2RlZmluZSBDT05GX0dFKGNvbmZpZywgdmFsKQkoKGNvbmZpZykgJiAoMC0oMSA8PCAodmFsKSkpKQotI2RlZmluZSBDT05GX0dUKGNvbmZpZywgdmFsKQkoKGNvbmZpZykgJiAoMC0yKigxIDw8ICh2YWwpKSkpCi0jZGVmaW5lIENPTkZfTFQoY29uZmlnLCB2YWwpCSgoY29uZmlnKSAmICgoMSA8PCAodmFsKSktMSkpCi0jZGVmaW5lIENPTkZfTEUoY29uZmlnLCB2YWwpCSgoY29uZmlnKSAmICgyKigxIDw8ICh2YWwpKS0xKSkKLQotLyogV3JhcHBlcnMgZm9yIHNvbWUgb2YgdGhlIGFib3ZlLCBzcGVjaWZpYyB0byBjb25maWcgY29uc3RhbnRzICovCi0KLSNkZWZpbmUgTkNPTkZfSEFTKHZhbCkJQ09ORl9IQVMoTkNPTkYsIHZhbCkKLSNkZWZpbmUgTkNPTkZfTVNLKG1hc2spCUNPTkZfTVNLKE5DT05GLCBtYXNrKQotI2RlZmluZSBOQ09ORl9JUyh2YWwpCUNPTkZfSVMoTkNPTkYsIHZhbCkKLSNkZWZpbmUgTkNPTkZfR0UodmFsKQlDT05GX0dFKE5DT05GLCB2YWwpCi0jZGVmaW5lIE5DT05GX0dUKHZhbCkJQ09ORl9HVChOQ09ORiwgdmFsKQotI2RlZmluZSBOQ09ORl9MVCh2YWwpCUNPTkZfTFQoTkNPTkYsIHZhbCkKLSNkZWZpbmUgTkNPTkZfTEUodmFsKQlDT05GX0xFKE5DT05GLCB2YWwpCi0KLSNkZWZpbmUgTENOQ09ORl9IQVModmFsKQlDT05GX0hBUyhMQ05DT05GLCB2YWwpCi0jZGVmaW5lIExDTkNPTkZfTVNLKG1hc2spCUNPTkZfTVNLKExDTkNPTkYsIG1hc2spCi0jZGVmaW5lIExDTkNPTkZfSVModmFsKQkJQ09ORl9JUyhMQ05DT05GLCB2YWwpCi0jZGVmaW5lIExDTkNPTkZfR0UodmFsKQkJQ09ORl9HRShMQ05DT05GLCB2YWwpCi0jZGVmaW5lIExDTkNPTkZfR1QodmFsKQkJQ09ORl9HVChMQ05DT05GLCB2YWwpCi0jZGVmaW5lIExDTkNPTkZfTFQodmFsKQkJQ09ORl9MVChMQ05DT05GLCB2YWwpCi0jZGVmaW5lIExDTkNPTkZfTEUodmFsKQkJQ09ORl9MRShMQ05DT05GLCB2YWwpCi0KLSNkZWZpbmUgRDExQ09ORl9IQVModmFsKSBDT05GX0hBUyhEMTFDT05GLCB2YWwpCi0jZGVmaW5lIEQxMUNPTkZfTVNLKG1hc2spIENPTkZfTVNLKEQxMUNPTkYsIG1hc2spCi0jZGVmaW5lIEQxMUNPTkZfSVModmFsKQlDT05GX0lTKEQxMUNPTkYsIHZhbCkKLSNkZWZpbmUgRDExQ09ORl9HRSh2YWwpCUNPTkZfR0UoRDExQ09ORiwgdmFsKQotI2RlZmluZSBEMTFDT05GX0dUKHZhbCkJQ09ORl9HVChEMTFDT05GLCB2YWwpCi0jZGVmaW5lIEQxMUNPTkZfTFQodmFsKQlDT05GX0xUKEQxMUNPTkYsIHZhbCkKLSNkZWZpbmUgRDExQ09ORl9MRSh2YWwpCUNPTkZfTEUoRDExQ09ORiwgdmFsKQotCi0jZGVmaW5lIFBIWUNPTkZfSEFTKHZhbCkgQ09ORl9IQVMoUEhZVFlQRSwgdmFsKQotI2RlZmluZSBQSFlDT05GX0lTKHZhbCkJQ09ORl9JUyhQSFlUWVBFLCB2YWwpCi0KLSNkZWZpbmUgTlJFVl9JUyh2YXIsIHZhbCkJKE5DT05GX0hBUyh2YWwpICYmIChOQ09ORl9JUyh2YWwpIHx8ICgodmFyKSA9PSAodmFsKSkpKQotI2RlZmluZSBOUkVWX0dFKHZhciwgdmFsKQkoTkNPTkZfR0UodmFsKSAmJiAoIU5DT05GX0xUKHZhbCkgfHwgKCh2YXIpID49ICh2YWwpKSkpCi0jZGVmaW5lIE5SRVZfR1QodmFyLCB2YWwpCShOQ09ORl9HVCh2YWwpICYmICghTkNPTkZfTEUodmFsKSB8fCAoKHZhcikgPiAodmFsKSkpKQotI2RlZmluZSBOUkVWX0xUKHZhciwgdmFsKQkoTkNPTkZfTFQodmFsKSAmJiAoIU5DT05GX0dFKHZhbCkgfHwgKCh2YXIpIDwgKHZhbCkpKSkKLSNkZWZpbmUgTlJFVl9MRSh2YXIsIHZhbCkJKE5DT05GX0xFKHZhbCkgJiYgKCFOQ09ORl9HVCh2YWwpIHx8ICgodmFyKSA8PSAodmFsKSkpKQotCi0jZGVmaW5lIExDTlJFVl9JUyh2YXIsIHZhbCkJKExDTkNPTkZfSEFTKHZhbCkgJiYgKExDTkNPTkZfSVModmFsKSB8fCAoKHZhcikgPT0gKHZhbCkpKSkKLSNkZWZpbmUgTENOUkVWX0dFKHZhciwgdmFsKQkoTENOQ09ORl9HRSh2YWwpICYmICghTENOQ09ORl9MVCh2YWwpIHx8ICgodmFyKSA+PSAodmFsKSkpKQotI2RlZmluZSBMQ05SRVZfR1QodmFyLCB2YWwpCShMQ05DT05GX0dUKHZhbCkgJiYgKCFMQ05DT05GX0xFKHZhbCkgfHwgKCh2YXIpID4gKHZhbCkpKSkKLSNkZWZpbmUgTENOUkVWX0xUKHZhciwgdmFsKQkoTENOQ09ORl9MVCh2YWwpICYmICghTENOQ09ORl9HRSh2YWwpIHx8ICgodmFyKSA8ICh2YWwpKSkpCi0jZGVmaW5lIExDTlJFVl9MRSh2YXIsIHZhbCkJKExDTkNPTkZfTEUodmFsKSAmJiAoIUxDTkNPTkZfR1QodmFsKSB8fCAoKHZhcikgPD0gKHZhbCkpKSkKLQotI2RlZmluZSBEMTFSRVZfSVModmFyLCB2YWwpCShEMTFDT05GX0hBUyh2YWwpICYmIChEMTFDT05GX0lTKHZhbCkgfHwgKCh2YXIpID09ICh2YWwpKSkpCi0jZGVmaW5lIEQxMVJFVl9HRSh2YXIsIHZhbCkJKEQxMUNPTkZfR0UodmFsKSAmJiAoIUQxMUNPTkZfTFQodmFsKSB8fCAoKHZhcikgPj0gKHZhbCkpKSkKLSNkZWZpbmUgRDExUkVWX0dUKHZhciwgdmFsKQkoRDExQ09ORl9HVCh2YWwpICYmICghRDExQ09ORl9MRSh2YWwpIHx8ICgodmFyKSA+ICh2YWwpKSkpCi0jZGVmaW5lIEQxMVJFVl9MVCh2YXIsIHZhbCkJKEQxMUNPTkZfTFQodmFsKSAmJiAoIUQxMUNPTkZfR0UodmFsKSB8fCAoKHZhcikgPCAodmFsKSkpKQotI2RlZmluZSBEMTFSRVZfTEUodmFyLCB2YWwpCShEMTFDT05GX0xFKHZhbCkgJiYgKCFEMTFDT05GX0dUKHZhbCkgfHwgKCh2YXIpIDw9ICh2YWwpKSkpCi0KLSNkZWZpbmUgUEhZVFlQRV9JUyh2YXIsIHZhbCkJKFBIWUNPTkZfSEFTKHZhbCkgJiYgKFBIWUNPTkZfSVModmFsKSB8fCAoKHZhcikgPT0gKHZhbCkpKSkKLQotLyogRmluYWxseSwgZWFybHktZXhpdCBmcm9tIHN3aXRjaCBjYXNlIGlmIGFueW9uZSB3YW50cyBpdC4uLiAqLwotCi0jZGVmaW5lIENBU0VDSEVDSyhjb25maWcsIHZhbCkJaWYgKCEoQ09ORl9IQVMoY29uZmlnLCB2YWwpKSkgYnJlYWsKLSNkZWZpbmUgQ0FTRU1TSyhjb25maWcsIG1hc2spCWlmICghKENPTkZfTVNLKGNvbmZpZywgbWFzaykpKSBicmVhawotCi0vKiBTZXQgdXAgUEhZVFlQRSBhdXRvbWF0aWNhbGx5OiAoZGVwZW5kcyBvbiBQSFlfVFlQRV9YLCBmcm9tIGQxMS5oKSAqLwotCi0jZGVmaW5lIF9QSFlDT05GX04gKDEgPDwgUEhZX1RZUEVfTikKLSNkZWZpbmUgX1BIWUNPTkZfTENOICgxIDw8IFBIWV9UWVBFX0xDTikKLSNkZWZpbmUgX1BIWUNPTkZfU1NMUE4gKDEgPDwgUEhZX1RZUEVfU1NOKQotCi0jZGVmaW5lIFBIWVRZUEUgKF9QSFlDT05GX04gfCBfUEhZQ09ORl9MQ04gfCBfUEhZQ09ORl9TU0xQTikKLQotLyogVXRpbGl0eSBtYWNybyB0byBpZGVudGlmeSA4MDIuMTFuIChIVCkgY2FwYWJsZSBQSFlzICovCi0jZGVmaW5lIFBIWVRZUEVfMTFOX0NBUChwaHl0eXBlKSBcCi0JKFBIWVRZUEVfSVMocGh5dHlwZSwgUEhZX1RZUEVfTikgfHwJXAotCSBQSFlUWVBFX0lTKHBoeXR5cGUsIFBIWV9UWVBFX0xDTikgfHwgXAotCSBQSFlUWVBFX0lTKHBoeXR5cGUsIFBIWV9UWVBFX1NTTikpCi0KLS8qIExhc3QgYnV0IG5vdCBsZWFzdDogc2hvcnRlciB3bGMtc3BlY2lmaWMgdmFyIGNoZWNrcyAqLwotI2RlZmluZSBCUkNNU19JU05QSFkoYmFuZCkJCVBIWVRZUEVfSVMoKGJhbmQpLT5waHl0eXBlLCBQSFlfVFlQRV9OKQotI2RlZmluZSBCUkNNU19JU0xDTlBIWShiYW5kKQlQSFlUWVBFX0lTKChiYW5kKS0+cGh5dHlwZSwgUEhZX1RZUEVfTENOKQotI2RlZmluZSBCUkNNU19JU1NTTFBOUEhZKGJhbmQpCVBIWVRZUEVfSVMoKGJhbmQpLT5waHl0eXBlLCBQSFlfVFlQRV9TU04pCi0KLSNkZWZpbmUgQlJDTVNfUEhZXzExTl9DQVAoYmFuZCkJUEhZVFlQRV8xMU5fQ0FQKChiYW5kKS0+cGh5dHlwZSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIC0tLS0tLS0tLS0tLS0gRW5kIG9mIENvcmUgcGh5L3JldiBjb25maWd1cmF0aW9uLiAtLS0tLS0tLS0tLS0tLS0tLSAqCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBEZWZhdWx0cyBmb3IgdHVuYWJsZXMgKGUuZy4gc2l6aW5nIGNvbnN0YW50cykKLSAqCi0gKiBGb3IgZWFjaCBuZXcgdHVuYWJsZSwgYWRkIGEgbWVtYmVyIHRvIHRoZSBlbmQKLSAqIG9mIHN0cnVjdCBicmNtc190dW5hYmxlcyBpbiBicmNtc19jX3B1Yi5oIHRvIGVuYWJsZQotICogcnVudGltZSBjaGVja3Mgb2YgdHVuYWJsZSB2YWx1ZXMuIChEaXJlY3RseQotICogdXNpbmcgdGhlIG1hY3JvcyBpbiBjb2RlIGludmFsaWRhdGVzIFJPTSBjb2RlKQotICoKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLSNkZWZpbmUgTlRYRAkJMjU2CS8qIE1heCAjIG9mIGVudHJpZXMgaW4gVHggRklGTyBiYXNlZCBvbiA0a2IgcGFnZSBzaXplICovCi0jZGVmaW5lIE5SWEQJCTI1NgkvKiBNYXggIyBvZiBlbnRyaWVzIGluIFJ4IEZJRk8gYmFzZWQgb24gNGtiIHBhZ2Ugc2l6ZSAqLwotI2RlZmluZQlOUlhCVUZQT1NUCTMyCS8qIHRyeSB0byBrZWVwIHRoaXMgIyByYnVmcyBwb3N0ZWQgdG8gdGhlIGNoaXAgKi8KLSNkZWZpbmUgTUFYU0NCCQkzMgkvKiBNYXhpbXVtIFNDQnMgaW4gY2FjaGUgZm9yIFNUQSAqLwotI2RlZmluZSBBTVBEVV9OVU1fTVBEVQkJMTYJLyogbWF4IGFsbG93ZWQgbnVtYmVyIG9mIG1wZHVzIGluIGFuIGFtcGR1ICgyIHN0cmVhbXMpICovCi0KLS8qIENvdW50IG9mIHBhY2tldCBjYWxsYmFjayBzdHJ1Y3R1cmVzLiBlaXRoZXIgb2YgZm9sbG93aW5nCi0gKiAxLiBTZXQgdG8gdGhlIG51bWJlciBvZiBTQ0JzIHNpbmNlIGEgU1RBCi0gKiBjYW4gcXVldWUgdXAgYSByYXRlIGNhbGxiYWNrIGZvciBlYWNoIElCU1MgU1RBIGl0IGtub3dzIGFib3V0LCBhbmQgYW4gQVAgY2FuCi0gKiBxdWV1ZSB1cCBhbiAiYXJlIHlvdSB0aGVyZT8iIE51bGwgRGF0YSBjYWxsYmFjayBmb3IgZWFjaCBhc3NvY2lhdGVkIFNUQQotICogMi4gY29udHJvbGxlZCBieSB0dW5hYmxlIGNvbmZpZyBmaWxlCi0gKi8KLSNkZWZpbmUgTUFYUEtUQ0IJTUFYU0NCCS8qIE1heCBudW1iZXIgb2YgcGFja2V0IGNhbGxiYWNrcyAqLwotCi0vKiBOZXRCU0QgYWxzbyBuZWVkcyB0byBrZWVwIHRyYWNrIG9mIHRoaXMgKi8KLQotLyogTnVtYmVyIG9mIEJTUyBoYW5kbGVkIGluIHVjb2RlIGJjbi9wcmIgKi8KLSNkZWZpbmUgQlJDTVNfTUFYX1VDT0RFX0JTUwkoMTYpCi0vKiBOdW1iZXIgb2YgQlNTIGhhbmRsZWQgaW4gc3cgYmNuL3ByYiAqLwotI2RlZmluZSBCUkNNU19NQVhfVUNPREVfQlNTNAkoNCkKLS8qIG1heCAjIEJTUyBjb25maWdzICovCi0jZGVmaW5lIEJSQ01TX01BWEJTU0NGRwkJKDEpCi0vKiBtYXggIyBhdmFpbGFibGUgbmV0d29ya3MgKi8KLSNkZWZpbmUgTUFYQlNTCQk2NAotLyogZGF0YSBtc2cgdHhxIGhpd2F0IG1hcmsgKi8KLSNkZWZpbmUgQlJDTVNfREFUQUhJV0FUCQk1MAotI2RlZmluZSBCUkNNU19BTVBEVURBVEFISVdBVCAyNTUKLQotLyogYm91bmRlZCByeCBsb29wcyAqLwotI2RlZmluZSBSWEJORAkJOAkvKiBtYXggIyBmcmFtZXMgdG8gcHJvY2VzcyBpbiBicmNtc19jX3JlY3YoKSAqLwotI2RlZmluZSBUWFNCTkQJCTgJLyogbWF4ICMgdHggc3RhdHVzIHRvIHByb2Nlc3MgaW4gd2xjX3R4c3RhdHVzKCkgKi8KLQotI2RlZmluZSBCQU5EXzVHKGJ0KQkoKGJ0KSA9PSBCUkNNX0JBTkRfNUcpCi0jZGVmaW5lIEJBTkRfMkcoYnQpCSgoYnQpID09IEJSQ01fQkFORF8yRykKLQotI2RlZmluZSBCQ01NU0coZGV2LCBmbXQsIGFyZ3MuLi4pCQlcCi1kbyB7CQkJCQkJXAotCWlmIChicmNtX21zZ19sZXZlbCAmIExPR19UUkFDRV9WQUwpCVwKLQkJd2lwaHlfZXJyKGRldiwgIiVzOiAiIGZtdCwgX19mdW5jX18sICMjYXJncyk7CVwKLX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgV0xfRVJST1JfT04oKQkJKGJyY21fbXNnX2xldmVsICYgTE9HX0VSUk9SX1ZBTCkKLQotLyogcmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyAqLwotI2lmbmRlZiBfX0JJR19FTkRJQU4KLSNpZm5kZWYgX19taXBzX18KLSNkZWZpbmUgUl9SRUcocikgXAotCSh7XAotCQlzaXplb2YoKihyKSkgPT0gc2l6ZW9mKHU4KSA/IFwKLQkJcmVhZGIoKHU4ICopKHIpKSA6IFwKLQkJc2l6ZW9mKCoocikpID09IHNpemVvZih1MTYpID8gcmVhZHcoKHUxNiAqKShyKSkgOiBcCi0JCXJlYWRsKCh1MzIgKikocikpOyBcCi0JfSkKLSNlbHNlCQkJCS8qIF9fbWlwc19fICovCi0jZGVmaW5lIFJfUkVHKHIpIFwKLQkoeyBcCi0JCV9fdHlwZW9mKCoocikpIF9fb3NsX3Y7IFwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsgXAotCQlzd2l0Y2ggKHNpemVvZigqKHIpKSkgeyBcCi0JCWNhc2Ugc2l6ZW9mKHU4KTogXAotCQkJX19vc2xfdiA9IHJlYWRiKCh1OCAqKShyKSk7IFwKLQkJCWJyZWFrOyBcCi0JCWNhc2Ugc2l6ZW9mKHUxNik6IFwKLQkJCV9fb3NsX3YgPSByZWFkdygodTE2ICopKHIpKTsgXAotCQkJYnJlYWs7IFwKLQkJY2FzZSBzaXplb2YodTMyKTogXAotCQkJX19vc2xfdiA9IFwKLQkJCXJlYWRsKCh1MzIgKikocikpOyBcCi0JCQlicmVhazsgXAotCQl9IFwKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18oInN5bmMiKTsgXAotCQlfX29zbF92OyBcCi0JfSkKLSNlbmRpZgkJCQkvKiBfX21pcHNfXyAqLwotCi0jZGVmaW5lIFdfUkVHKHIsIHYpIGRvIHsgXAotCQlzd2l0Y2ggKHNpemVvZigqKHIpKSkgeyBcCi0JCWNhc2Ugc2l6ZW9mKHU4KTogXAotCQkJd3JpdGViKCh1OCkodiksICh1OCAqKShyKSk7IGJyZWFrOyBcCi0JCWNhc2Ugc2l6ZW9mKHUxNik6IFwKLQkJCXdyaXRldygodTE2KSh2KSwgKHUxNiAqKShyKSk7IGJyZWFrOyBcCi0JCWNhc2Ugc2l6ZW9mKHUzMik6IFwKLQkJCXdyaXRlbCgodTMyKSh2KSwgKHUzMiAqKShyKSk7IGJyZWFrOyBcCi0JCX07IFwKLQl9IHdoaWxlICgwKQotI2Vsc2UJCQkJLyogX19CSUdfRU5ESUFOICovCi0jZGVmaW5lIFJfUkVHKHIpIFwKLQkoeyBcCi0JCV9fdHlwZW9mKCoocikpIF9fb3NsX3Y7IFwKLQkJc3dpdGNoIChzaXplb2YoKihyKSkpIHsgXAotCQljYXNlIHNpemVvZih1OCk6IFwKLQkJCV9fb3NsX3YgPSBcCi0JCQlyZWFkYigodTggKikoKHIpXjMpKTsgXAotCQkJYnJlYWs7IFwKLQkJY2FzZSBzaXplb2YodTE2KTogXAotCQkJX19vc2xfdiA9IFwKLQkJCXJlYWR3KCh1MTYgKikoKHIpXjIpKTsgXAotCQkJYnJlYWs7IFwKLQkJY2FzZSBzaXplb2YodTMyKTogXAotCQkJX19vc2xfdiA9IHJlYWRsKCh1MzIgKikocikpOyBcCi0JCQlicmVhazsgXAotCQl9IFwKLQkJX19vc2xfdjsgXAotCX0pCi0KLSNkZWZpbmUgV19SRUcociwgdikgZG8geyBcCi0JCXN3aXRjaCAoc2l6ZW9mKCoocikpKSB7IFwKLQkJY2FzZSBzaXplb2YodTgpOglcCi0JCQl3cml0ZWIoKHU4KSh2KSwgXAotCQkJKHU4ICopKChyKV4zKSk7IGJyZWFrOyBcCi0JCWNhc2Ugc2l6ZW9mKHUxNik6CVwKLQkJCXdyaXRldygodTE2KSh2KSwgXAotCQkJKHUxNiAqKSgocileMikpOyBicmVhazsgXAotCQljYXNlIHNpemVvZih1MzIpOglcCi0JCQl3cml0ZWwoKHUzMikodiksIFwKLQkJCSh1MzIgKikocikpOyBicmVhazsgXAotCQl9IFwKLQl9IHdoaWxlICgwKQotI2VuZGlmCQkJCS8qIF9fQklHX0VORElBTiAqLwotCi0jaWZkZWYgX19taXBzX18KLS8qCi0gKiBiY200NzE2ICh3aGljaCBpbmNsdWRlcyA0NzE3ICYgNDcxOCksIHBsdXMgNDcwNiBvbiBQQ0llIGNhbiByZW9yZGVyCi0gKiB0cmFuc2FjdGlvbnMuIEFzIGEgZml4LCBhIHJlYWQgYWZ0ZXIgd3JpdGUgaXMgcGVyZm9ybWVkIG9uIGNlcnRhaW4gcGxhY2VzCi0gKiBpbiB0aGUgY29kZS4gT2xkZXIgY2hpcHMgYW5kIHRoZSBuZXdlciA1MzU3IGZhbWlseSBkb24ndCByZXF1aXJlIHRoaXMgZml4LgotICovCi0jZGVmaW5lIFdfUkVHX0ZMVVNIKHIsIHYpCSh7IFdfUkVHKChyKSwgKHYpKTsgKHZvaWQpUl9SRUcocik7IH0pCi0jZWxzZQotI2RlZmluZSBXX1JFR19GTFVTSChyLCB2KQlXX1JFRygociksICh2KSkKLSNlbmRpZgkJCQkvKiBfX21pcHNfXyAqLwotCi0jZGVmaW5lIEFORF9SRUcociwgdikJV19SRUcoKHIpLCBSX1JFRyhyKSAmICh2KSkKLSNkZWZpbmUgT1JfUkVHKHIsIHYpCVdfUkVHKChyKSwgUl9SRUcocikgfCAodikpCi0KLSNkZWZpbmUgU0VUX1JFRyhyLCBtYXNrLCB2YWwpIFwKLQkJV19SRUcoKHIpLCAoKFJfUkVHKHIpICYgfihtYXNrKSkgfCAodmFsKSkpCi0KLS8qIG11bHRpLWJvb2wgZGF0YSB0eXBlOiBzZXQgb2YgYm9vbHMsIG1ib29sIGlzIHRydWUgaWYgYW55IGlzIHNldCAqLwotdHlwZWRlZiB1MzIgbWJvb2w7Ci0jZGVmaW5lIG1ib29sc2V0KG1iLCBiaXQpCQkoKG1iKSB8PSAoYml0KSkJLyogc2V0IG9uZSBib29sICovCi0jZGVmaW5lIG1ib29sY2xyKG1iLCBiaXQpCQkoKG1iKSAmPSB+KGJpdCkpCS8qIGNsZWFyIG9uZSBib29sICovCi0jZGVmaW5lIG1ib29saXNzZXQobWIsIGJpdCkJCSgoKG1iKSAmIChiaXQpKSAhPSAwKQkvKiB0cnVlIGlmIG9uZSBib29sIGlzIHNldCAqLwotI2RlZmluZQltYm9vbG1hc2tzZXQobWIsIG1hc2ssIHZhbCkJKChtYikgPSAoKChtYikgJiB+KG1hc2spKSB8ICh2YWwpKSkKLQotLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLXN0cnVjdCB3aXBoeTsKLXN0cnVjdCBpZWVlODAyMTFfc3RhOwotc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9wYXJhbXM7Ci1zdHJ1Y3QgYnJjbXNfaW5mbzsKLXN0cnVjdCBicmNtc19jX2luZm87Ci1zdHJ1Y3QgYnJjbXNfaGFyZHdhcmU7Ci1zdHJ1Y3QgYnJjbXNfY19pZjsKLXN0cnVjdCBicmNtdV9pb3ZhcjsKLXN0cnVjdCBicmNtdV9zdHJidWY7Ci1zdHJ1Y3QgYnJjbXNfdHhxX2luZm87Ci1zdHJ1Y3QgYnJjbXNfYmFuZDsKLXN0cnVjdCBkbWFfcHViOwotc3RydWN0IHNpX3B1YjsKLXN0cnVjdCB0eF9zdGF0dXM7Ci1zdHJ1Y3QgZDExcnhoZHI7Ci1zdHJ1Y3QgYnJjbXNfZDExcnhoZHI7Ci1zdHJ1Y3QgdHhwd3JfbGltaXRzOwotc3RydWN0IGJyY21zX3BoeTsKLQotdHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QgaW50Y3RybHJlZ3MgaW50Y3RybHJlZ3NfdDsKLXR5cGVkZWYgdm9sYXRpbGUgc3RydWN0IHBpbzJyZWdzIHBpbzJyZWdzX3Q7Ci10eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCBwaW8ycmVncCBwaW8ycmVncF90OwotdHlwZWRlZiB2b2xhdGlsZSBzdHJ1Y3QgcGlvNHJlZ3MgcGlvNHJlZ3NfdDsKLXR5cGVkZWYgdm9sYXRpbGUgc3RydWN0IHBpbzRyZWdwIHBpbzRyZWdwX3Q7Ci10eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCBmaWZvNjQgZmlmbzY0X3Q7Ci10eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCBkMTFyZWdzIGQxMXJlZ3NfdDsKLXR5cGVkZWYgdm9sYXRpbGUgc3RydWN0IGRtYTMyZGlhZyBkbWEzMmRpYWdfdDsKLXR5cGVkZWYgdm9sYXRpbGUgc3RydWN0IGRtYTY0cmVncyBkbWE2NHJlZ3NfdDsKLXR5cGVkZWYgc3RydWN0IGJyY21zX3JhdGVzZXQgd2xjX3JhdGVzZXRfdDsKLXR5cGVkZWYgdTMyIHJhdGVzcGVjX3Q7Ci10eXBlZGVmIHN0cnVjdCBjaGFudmVjIGNoYW52ZWNfdDsKLXR5cGVkZWYgczMyIGZpeGVkOwotdHlwZWRlZiBzdHJ1Y3QgX2NzMzIgY3MzMjsKLXR5cGVkZWYgdm9sYXRpbGUgdW5pb24gcG1xcmVnIHBtcXJlZ190OwotCi0vKiBicmNtX21zZ19sZXZlbCBpcyBhIGJpdCB2ZWN0b3Igd2l0aCBkZWZzIGluIGRlZnMuaCAqLwotZXh0ZXJuIHUzMiBicmNtX21zZ19sZXZlbDsKLQotI2VuZGlmCQkJCS8qIF9CUkNNX1RZUEVTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3Vjb2RlX2xvYWRlci5jIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy91Y29kZV9sb2FkZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3MzNmYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3Vjb2RlX2xvYWRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaW5jbHVkZSA8ZGVmcy5oPgotI2luY2x1ZGUgInR5cGVzLmgiCi0jaW5jbHVkZSA8dWNvZGVfbG9hZGVyLmg+Ci0KLWVudW0gewotCUQxMVVDT0RFX05BTUVUQUdfU1RBUlQgPSAwLAotCUQxMUxDTjBCU0lOSVRWQUxTMjQsCi0JRDExTENOMElOSVRWQUxTMjQsCi0JRDExTENOMUJTSU5JVFZBTFMyNCwKLQlEMTFMQ04xSU5JVFZBTFMyNCwKLQlEMTFMQ04yQlNJTklUVkFMUzI0LAotCUQxMUxDTjJJTklUVkFMUzI0LAotCUQxMU4wQUJTSU5JVFZBTFMxNiwKLQlEMTFOMEJTSU5JVFZBTFMxNiwKLQlEMTFOMElOSVRWQUxTMTYsCi0JRDExVUNPREVfT1ZFUlNJR0hUMTZfTUlNTywKLQlEMTFVQ09ERV9PVkVSU0lHSFQxNl9NSU1PU1osCi0JRDExVUNPREVfT1ZFUlNJR0hUMjRfTENOLAotCUQxMVVDT0RFX09WRVJTSUdIVDI0X0xDTlNaLAotCUQxMVVDT0RFX09WRVJTSUdIVF9CT01NQUpPUiwKLQlEMTFVQ09ERV9PVkVSU0lHSFRfQk9NTUlOT1IKLX07Ci0KLXN0cnVjdCBkMTFpbml0ICpkMTFsY24wYnNpbml0dmFsczI0Owotc3RydWN0IGQxMWluaXQgKmQxMWxjbjBpbml0dmFsczI0Owotc3RydWN0IGQxMWluaXQgKmQxMWxjbjFic2luaXR2YWxzMjQ7Ci1zdHJ1Y3QgZDExaW5pdCAqZDExbGNuMWluaXR2YWxzMjQ7Ci1zdHJ1Y3QgZDExaW5pdCAqZDExbGNuMmJzaW5pdHZhbHMyNDsKLXN0cnVjdCBkMTFpbml0ICpkMTFsY24yaW5pdHZhbHMyNDsKLXN0cnVjdCBkMTFpbml0ICpkMTFuMGFic2luaXR2YWxzMTY7Ci1zdHJ1Y3QgZDExaW5pdCAqZDExbjBic2luaXR2YWxzMTY7Ci1zdHJ1Y3QgZDExaW5pdCAqZDExbjBpbml0dmFsczE2OwotdTMyICpiY200M3h4XzE2X21pbW87Ci11MzIgYmNtNDN4eF8xNl9taW1vc3o7Ci11MzIgKmJjbTQzeHhfMjRfbGNuOwotdTMyIGJjbTQzeHhfMjRfbGNuc3o7Ci11MzIgKmJjbTQzeHhfYm9tbWFqb3I7Ci11MzIgKmJjbTQzeHhfYm9tbWlub3I7Ci0KLWludCBicmNtc191Y29kZV9kYXRhX2luaXQoc3RydWN0IGJyY21zX2luZm8gKndsKQotewotCWludCByYzsKLQlyYyA9IGJyY21zX2NoZWNrX2Zpcm13YXJlcyh3bCk7Ci0KLQlyYyA9IHJjIDwgMCA/IHJjIDoKLQkJYnJjbXNfdWNvZGVfaW5pdF9idWYod2wsICh2b2lkICoqKSZkMTFsY24wYnNpbml0dmFsczI0LAotCQkJCSAgICAgRDExTENOMEJTSU5JVFZBTFMyNCk7Ci0JcmMgPSByYyA8IDAgPyByYyA6IGJyY21zX3Vjb2RlX2luaXRfYnVmKHdsLCAodm9pZCAqKikmZDExbGNuMGluaXR2YWxzMjQsCi0JCQkJCSAgICAgRDExTENOMElOSVRWQUxTMjQpOwotCXJjID0gcmMgPCAwID8gcmMgOgotCQlicmNtc191Y29kZV9pbml0X2J1Zih3bCwgKHZvaWQgKiopJmQxMWxjbjFic2luaXR2YWxzMjQsCi0JCQkJICAgICBEMTFMQ04xQlNJTklUVkFMUzI0KTsKLQlyYyA9IHJjIDwgMCA/IHJjIDogYnJjbXNfdWNvZGVfaW5pdF9idWYod2wsICh2b2lkICoqKSZkMTFsY24xaW5pdHZhbHMyNCwKLQkJCQkJICAgICBEMTFMQ04xSU5JVFZBTFMyNCk7Ci0JcmMgPSByYyA8IDAgPyByYyA6Ci0JCWJyY21zX3Vjb2RlX2luaXRfYnVmKHdsLCAodm9pZCAqKikmZDExbGNuMmJzaW5pdHZhbHMyNCwKLQkJCQkgICAgIEQxMUxDTjJCU0lOSVRWQUxTMjQpOwotCXJjID0gcmMgPCAwID8gcmMgOiBicmNtc191Y29kZV9pbml0X2J1Zih3bCwgKHZvaWQgKiopJmQxMWxjbjJpbml0dmFsczI0LAotCQkJCQkgICAgIEQxMUxDTjJJTklUVkFMUzI0KTsKLQlyYyA9IHJjIDwgMCA/IHJjIDoKLQkJYnJjbXNfdWNvZGVfaW5pdF9idWYod2wsICh2b2lkICoqKSZkMTFuMGFic2luaXR2YWxzMTYsCi0JCQkJICAgICBEMTFOMEFCU0lOSVRWQUxTMTYpOwotCXJjID0gcmMgPCAwID8gcmMgOiBicmNtc191Y29kZV9pbml0X2J1Zih3bCwgKHZvaWQgKiopJmQxMW4wYnNpbml0dmFsczE2LAotCQkJCQkgICAgIEQxMU4wQlNJTklUVkFMUzE2KTsKLQlyYyA9IHJjIDwgMCA/IHJjIDogYnJjbXNfdWNvZGVfaW5pdF9idWYod2wsICh2b2lkICoqKSZkMTFuMGluaXR2YWxzMTYsCi0JCQkJCSAgICAgRDExTjBJTklUVkFMUzE2KTsKLQlyYyA9IHJjIDwgMCA/IHJjIDogYnJjbXNfdWNvZGVfaW5pdF9idWYod2wsICh2b2lkICoqKSZiY200M3h4XzE2X21pbW8sCi0JCQkJCSAgICAgRDExVUNPREVfT1ZFUlNJR0hUMTZfTUlNTyk7Ci0JcmMgPSByYyA8IDAgPyByYyA6IGJyY21zX3Vjb2RlX2luaXRfdWludCh3bCwgJmJjbTQzeHhfMTZfbWltb3N6LAotCQkJCQkgICAgICBEMTFVQ09ERV9PVkVSU0lHSFQxNl9NSU1PU1opOwotCXJjID0gcmMgPCAwID8gcmMgOiBicmNtc191Y29kZV9pbml0X2J1Zih3bCwgKHZvaWQgKiopJmJjbTQzeHhfMjRfbGNuLAotCQkJCQkgICAgIEQxMVVDT0RFX09WRVJTSUdIVDI0X0xDTik7Ci0JcmMgPSByYyA8IDAgPyByYyA6IGJyY21zX3Vjb2RlX2luaXRfdWludCh3bCwgJmJjbTQzeHhfMjRfbGNuc3osCi0JCQkJCSAgICAgIEQxMVVDT0RFX09WRVJTSUdIVDI0X0xDTlNaKTsKLQlyYyA9IHJjIDwgMCA/IHJjIDogYnJjbXNfdWNvZGVfaW5pdF9idWYod2wsICh2b2lkICoqKSZiY200M3h4X2JvbW1ham9yLAotCQkJCQkgICAgIEQxMVVDT0RFX09WRVJTSUdIVF9CT01NQUpPUik7Ci0JcmMgPSByYyA8IDAgPyByYyA6IGJyY21zX3Vjb2RlX2luaXRfYnVmKHdsLCAodm9pZCAqKikmYmNtNDN4eF9ib21taW5vciwKLQkJCQkJICAgICBEMTFVQ09ERV9PVkVSU0lHSFRfQk9NTUlOT1IpOwotCXJldHVybiByYzsKLX0KLQotdm9pZCBicmNtc191Y29kZV9kYXRhX2ZyZWUodm9pZCkKLXsKLQlicmNtc191Y29kZV9mcmVlX2J1Zigodm9pZCAqKWQxMWxjbjBic2luaXR2YWxzMjQpOwotCWJyY21zX3Vjb2RlX2ZyZWVfYnVmKCh2b2lkICopZDExbGNuMGluaXR2YWxzMjQpOwotCWJyY21zX3Vjb2RlX2ZyZWVfYnVmKCh2b2lkICopZDExbGNuMWJzaW5pdHZhbHMyNCk7Ci0JYnJjbXNfdWNvZGVfZnJlZV9idWYoKHZvaWQgKilkMTFsY24xaW5pdHZhbHMyNCk7Ci0JYnJjbXNfdWNvZGVfZnJlZV9idWYoKHZvaWQgKilkMTFsY24yYnNpbml0dmFsczI0KTsKLQlicmNtc191Y29kZV9mcmVlX2J1Zigodm9pZCAqKWQxMWxjbjJpbml0dmFsczI0KTsKLQlicmNtc191Y29kZV9mcmVlX2J1Zigodm9pZCAqKWQxMW4wYWJzaW5pdHZhbHMxNik7Ci0JYnJjbXNfdWNvZGVfZnJlZV9idWYoKHZvaWQgKilkMTFuMGJzaW5pdHZhbHMxNik7Ci0JYnJjbXNfdWNvZGVfZnJlZV9idWYoKHZvaWQgKilkMTFuMGluaXR2YWxzMTYpOwotCWJyY21zX3Vjb2RlX2ZyZWVfYnVmKCh2b2lkICopYmNtNDN4eF8xNl9taW1vKTsKLQlicmNtc191Y29kZV9mcmVlX2J1Zigodm9pZCAqKWJjbTQzeHhfMjRfbGNuKTsKLQlicmNtc191Y29kZV9mcmVlX2J1Zigodm9pZCAqKWJjbTQzeHhfYm9tbWFqb3IpOwotCWJyY21zX3Vjb2RlX2ZyZWVfYnVmKCh2b2lkICopYmNtNDN4eF9ib21taW5vcik7Ci0KLQlyZXR1cm47Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3Vjb2RlX2xvYWRlci5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtc21hYy91Y29kZV9sb2FkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E1M2RlYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY21zbWFjL3Vjb2RlX2xvYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlICJ0eXBlcy5oIgkJLyogZm9yd2FyZCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb25zICovCi0KLSNkZWZpbmUgTUlOX0ZXX1NJWkUgNDAwMDAJLyogbWluaW11bSBmaXJtd2FyZSBmaWxlIHNpemUgaW4gYnl0ZXMgKi8KLSNkZWZpbmUgTUFYX0ZXX1NJWkUgMTUwMDAwCi0KLSNkZWZpbmUgVUNPREVfTE9BREVSX0FQSV9WRVIgMAotCi1zdHJ1Y3QgZDExaW5pdCB7Ci0JdTE2IGFkZHI7Ci0JdTE2IHNpemU7Ci0JdTMyIHZhbHVlOwotfTsKLQotZXh0ZXJuIHN0cnVjdCBkMTFpbml0ICpkMTFsY24wYnNpbml0dmFsczI0OwotZXh0ZXJuIHN0cnVjdCBkMTFpbml0ICpkMTFsY24waW5pdHZhbHMyNDsKLWV4dGVybiBzdHJ1Y3QgZDExaW5pdCAqZDExbGNuMWJzaW5pdHZhbHMyNDsKLWV4dGVybiBzdHJ1Y3QgZDExaW5pdCAqZDExbGNuMWluaXR2YWxzMjQ7Ci1leHRlcm4gc3RydWN0IGQxMWluaXQgKmQxMWxjbjJic2luaXR2YWxzMjQ7Ci1leHRlcm4gc3RydWN0IGQxMWluaXQgKmQxMWxjbjJpbml0dmFsczI0OwotZXh0ZXJuIHN0cnVjdCBkMTFpbml0ICpkMTFuMGFic2luaXR2YWxzMTY7Ci1leHRlcm4gc3RydWN0IGQxMWluaXQgKmQxMW4wYnNpbml0dmFsczE2OwotZXh0ZXJuIHN0cnVjdCBkMTFpbml0ICpkMTFuMGluaXR2YWxzMTY7Ci1leHRlcm4gdTMyICpiY200M3h4XzE2X21pbW87Ci1leHRlcm4gdTMyIGJjbTQzeHhfMTZfbWltb3N6OwotZXh0ZXJuIHUzMiAqYmNtNDN4eF8yNF9sY247Ci1leHRlcm4gdTMyIGJjbTQzeHhfMjRfbGNuc3o7Ci0KLWV4dGVybiBpbnQgYnJjbXNfdWNvZGVfZGF0YV9pbml0KHN0cnVjdCBicmNtc19pbmZvICp3bCk7Ci1leHRlcm4gdm9pZCBicmNtc191Y29kZV9kYXRhX2ZyZWUodm9pZCk7Ci0KLWV4dGVybiBpbnQgYnJjbXNfdWNvZGVfaW5pdF9idWYoc3RydWN0IGJyY21zX2luZm8gKndsLCB2b2lkICoqcGJ1ZiwKLQkJCQl1bnNpZ25lZCBpbnQgaWR4KTsKLWV4dGVybiBpbnQgYnJjbXNfdWNvZGVfaW5pdF91aW50KHN0cnVjdCBicmNtc19pbmZvICp3bCwgdW5zaWduZWQgKmRhdGEsCi0JCQkgICAgICB1bnNpZ25lZCBpbnQgaWR4KTsKLWV4dGVybiB2b2lkIGJyY21zX3Vjb2RlX2ZyZWVfYnVmKHZvaWQgKik7Ci1leHRlcm4gaW50ICBicmNtc19jaGVja19maXJtd2FyZXMoc3RydWN0IGJyY21zX2luZm8gKndsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXV0aWwvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY211dGlsL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDAzNDIzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXV0aWwvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZyYWdtZW50IGZvciBCcm9hZGNvbSA4MDIuMTFuIE5ldHdvcmtpbmcgRGV2aWNlIERyaXZlciBVdGlsaXRpZXMKLSMKLSMgQ29weXJpZ2h0IChjKSAyMDExIEJyb2FkY29tIENvcnBvcmF0aW9uCi0jCi0jIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotIyBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0jCi0jIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotIyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0jIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotIyBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotIyBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0jIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0KLWNjZmxhZ3MteSA6PQkJCQlcCi0JLUlkcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY211dGlsIFwKLQktSWRyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZQotCi1CUkNNVVRJTF9PRklMRVMgOj0gXAotCXV0aWxzLm8gXAotCXdpZmkubwotCi1NT0RVTEVQRlggOj0gYnJjbXV0aWwKLQotb2JqLSQoQ09ORklHX0JSQ01VVElMKQkrPSAkKE1PRFVMRVBGWCkubwotJChNT0RVTEVQRlgpLW9ianMJPSAkKEJSQ01VVElMX09GSUxFUykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXV0aWwvdXRpbHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvYnJjbXV0aWwvdXRpbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdiNmI3Ny4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY211dGlsL3V0aWxzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxicmNtdV91dGlscy5oPgotCi1NT0RVTEVfQVVUSE9SKCJCcm9hZGNvbSBDb3Jwb3JhdGlvbiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJCcm9hZGNvbSA4MDIuMTFuIHdpcmVsZXNzIExBTiBkcml2ZXIgdXRpbGl0aWVzLiIpOwotTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIkJyb2FkY29tIDgwMi4xMW4gV0xBTiBjYXJkcyIpOwotTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwotCi1zdHJ1Y3Qgc2tfYnVmZiAqYnJjbXVfcGt0X2J1Zl9nZXRfc2tiKHVpbnQgbGVuKQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbik7Ci0JaWYgKHNrYikgewotCQlza2JfcHV0KHNrYiwgbGVuKTsKLQkJc2tiLT5wcmlvcml0eSA9IDA7Ci0JfQotCi0JcmV0dXJuIHNrYjsKLX0KLUVYUE9SVF9TWU1CT0woYnJjbXVfcGt0X2J1Zl9nZXRfc2tiKTsKLQotLyogRnJlZSB0aGUgZHJpdmVyIHBhY2tldC4gRnJlZSB0aGUgdGFnIGlmIHByZXNlbnQgKi8KLXZvaWQgYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBza19idWZmICpuc2tiOwotCWludCBuZXN0ID0gMDsKLQotCS8qIHBlcnZlcnNpb246IHdlIHVzZSBza2ItPm5leHQgdG8gY2hhaW4gbXVsdGktc2tiIHBhY2tldHMgKi8KLQl3aGlsZSAoc2tiKSB7Ci0JCW5za2IgPSBza2ItPm5leHQ7Ci0JCXNrYi0+bmV4dCA9IE5VTEw7Ci0KLQkJaWYgKHNrYi0+ZGVzdHJ1Y3RvcikKLQkJCS8qIGNhbm5vdCBrZnJlZV9za2IoKSBvbiBoYXJkIElSUSAobmV0L2NvcmUvc2tidWZmLmMpIGlmCi0JCQkgKiBkZXN0cnVjdG9yIGV4aXN0cwotCQkJICovCi0JCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQllbHNlCi0JCQkvKiBjYW4gZnJlZSBpbW1lZGlhdGVseSAoZXZlbiBpbl9pcnEoKSkgaWYgZGVzdHJ1Y3RvcgotCQkJICogZG9lcyBub3QgZXhpc3QKLQkJCSAqLwotCQkJZGV2X2tmcmVlX3NrYihza2IpOwotCi0JCW5lc3QrKzsKLQkJc2tiID0gbnNrYjsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKGJyY211X3BrdF9idWZfZnJlZV9za2IpOwotCi0KLS8qIGNvcHkgYSBidWZmZXIgaW50byBhIHBrdCBidWZmZXIgY2hhaW4gKi8KLXVpbnQgYnJjbXVfcGt0ZnJvbWJ1ZihzdHJ1Y3Qgc2tfYnVmZiAqcCwgdWludCBvZmZzZXQsIGludCBsZW4sCi0JCXVuc2lnbmVkIGNoYXIgKmJ1ZikKLXsKLQl1aW50IG4sIHJldCA9IDA7Ci0KLQkvKiBza2lwICdvZmZzZXQnIGJ5dGVzICovCi0JZm9yICg7IHAgJiYgb2Zmc2V0OyBwID0gcC0+bmV4dCkgewotCQlpZiAob2Zmc2V0IDwgKHVpbnQpIChwLT5sZW4pKQotCQkJYnJlYWs7Ci0JCW9mZnNldCAtPSBwLT5sZW47Ci0JfQotCi0JaWYgKCFwKQotCQlyZXR1cm4gMDsKLQotCS8qIGNvcHkgdGhlIGRhdGEgKi8KLQlmb3IgKDsgcCAmJiBsZW47IHAgPSBwLT5uZXh0KSB7Ci0JCW4gPSBtaW4oKHVpbnQpIChwLT5sZW4pIC0gb2Zmc2V0LCAodWludCkgbGVuKTsKLQkJbWVtY3B5KHAtPmRhdGEgKyBvZmZzZXQsIGJ1Ziwgbik7Ci0JCWJ1ZiArPSBuOwotCQlsZW4gLT0gbjsKLQkJcmV0ICs9IG47Ci0JCW9mZnNldCA9IDA7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woYnJjbXVfcGt0ZnJvbWJ1Zik7Ci0KLS8qIHJldHVybiB0b3RhbCBsZW5ndGggb2YgYnVmZmVyIGNoYWluICovCi11aW50IGJyY211X3BrdHRvdGxlbihzdHJ1Y3Qgc2tfYnVmZiAqcCkKLXsKLQl1aW50IHRvdGFsOwotCi0JdG90YWwgPSAwOwotCWZvciAoOyBwOyBwID0gcC0+bmV4dCkKLQkJdG90YWwgKz0gcC0+bGVuOwotCXJldHVybiB0b3RhbDsKLX0KLUVYUE9SVF9TWU1CT0woYnJjbXVfcGt0dG90bGVuKTsKLQotLyoKLSAqIG9zbCBtdWx0aXBsZS1wcmVjZWRlbmNlIHBhY2tldCBxdWV1ZQotICogaGlfcHJlYyBpcyBhbHdheXMgPj0gdGhlIG51bWJlciBvZiB0aGUgaGlnaGVzdCBub24tZW1wdHkgcHJlY2VkZW5jZQotICovCi1zdHJ1Y3Qgc2tfYnVmZiAqYnJjbXVfcGt0cV9wZW5xKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMsCi0JCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnApCi17Ci0Jc3RydWN0IHBrdHFfcHJlYyAqcTsKLQotCWlmIChwa3RxX2Z1bGwocHEpIHx8IHBrdHFfcGZ1bGwocHEsIHByZWMpKQotCQlyZXR1cm4gTlVMTDsKLQotCXEgPSAmcHEtPnFbcHJlY107Ci0KLQlpZiAocS0+aGVhZCkKLQkJcS0+dGFpbC0+cHJldiA9IHA7Ci0JZWxzZQotCQlxLT5oZWFkID0gcDsKLQotCXEtPnRhaWwgPSBwOwotCXEtPmxlbisrOwotCi0JcHEtPmxlbisrOwotCi0JaWYgKHBxLT5oaV9wcmVjIDwgcHJlYykKLQkJcHEtPmhpX3ByZWMgPSAodTgpIHByZWM7Ci0KLQlyZXR1cm4gcDsKLX0KLUVYUE9SVF9TWU1CT0woYnJjbXVfcGt0cV9wZW5xKTsKLQotc3RydWN0IHNrX2J1ZmYgKmJyY211X3BrdHFfcGVucV9oZWFkKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMsCi0JCQkJCSAgIHN0cnVjdCBza19idWZmICpwKQotewotCXN0cnVjdCBwa3RxX3ByZWMgKnE7Ci0KLQlpZiAocGt0cV9mdWxsKHBxKSB8fCBwa3RxX3BmdWxsKHBxLCBwcmVjKSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlxID0gJnBxLT5xW3ByZWNdOwotCi0JaWYgKHEtPmhlYWQgPT0gTlVMTCkKLQkJcS0+dGFpbCA9IHA7Ci0KLQlwLT5wcmV2ID0gcS0+aGVhZDsKLQlxLT5oZWFkID0gcDsKLQlxLT5sZW4rKzsKLQotCXBxLT5sZW4rKzsKLQotCWlmIChwcS0+aGlfcHJlYyA8IHByZWMpCi0JCXBxLT5oaV9wcmVjID0gKHU4KSBwcmVjOwotCi0JcmV0dXJuIHA7Ci19Ci1FWFBPUlRfU1lNQk9MKGJyY211X3BrdHFfcGVucV9oZWFkKTsKLQotc3RydWN0IHNrX2J1ZmYgKmJyY211X3BrdHFfcGRlcShzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjKQotewotCXN0cnVjdCBwa3RxX3ByZWMgKnE7Ci0Jc3RydWN0IHNrX2J1ZmYgKnA7Ci0KLQlxID0gJnBxLT5xW3ByZWNdOwotCi0JcCA9IHEtPmhlYWQ7Ci0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlxLT5oZWFkID0gcC0+cHJldjsKLQlpZiAocS0+aGVhZCA9PSBOVUxMKQotCQlxLT50YWlsID0gTlVMTDsKLQotCXEtPmxlbi0tOwotCi0JcHEtPmxlbi0tOwotCi0JcC0+cHJldiA9IE5VTEw7Ci0KLQlyZXR1cm4gcDsKLX0KLUVYUE9SVF9TWU1CT0woYnJjbXVfcGt0cV9wZGVxKTsKLQotc3RydWN0IHNrX2J1ZmYgKmJyY211X3BrdHFfcGRlcV90YWlsKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMpCi17Ci0Jc3RydWN0IHBrdHFfcHJlYyAqcTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcCwgKnByZXY7Ci0KLQlxID0gJnBxLT5xW3ByZWNdOwotCi0JcCA9IHEtPmhlYWQ7Ci0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlmb3IgKHByZXYgPSBOVUxMOyBwICE9IHEtPnRhaWw7IHAgPSBwLT5wcmV2KQotCQlwcmV2ID0gcDsKLQotCWlmIChwcmV2KQotCQlwcmV2LT5wcmV2ID0gTlVMTDsKLQllbHNlCi0JCXEtPmhlYWQgPSBOVUxMOwotCi0JcS0+dGFpbCA9IHByZXY7Ci0JcS0+bGVuLS07Ci0KLQlwcS0+bGVuLS07Ci0KLQlyZXR1cm4gcDsKLX0KLUVYUE9SVF9TWU1CT0woYnJjbXVfcGt0cV9wZGVxX3RhaWwpOwotCi12b2lkCi1icmNtdV9wa3RxX3BmbHVzaChzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLCBib29sIGRpciwKLQkgICAgaWZwa3RfY2JfdCBmbiwgdm9pZCAqYXJnKQotewotCXN0cnVjdCBwa3RxX3ByZWMgKnE7Ci0Jc3RydWN0IHNrX2J1ZmYgKnAsICpwcmV2ID0gTlVMTDsKLQotCXEgPSAmcHEtPnFbcHJlY107Ci0JcCA9IHEtPmhlYWQ7Ci0Jd2hpbGUgKHApIHsKLQkJaWYgKGZuID09IE5VTEwgfHwgKCpmbikgKHAsIGFyZykpIHsKLQkJCWJvb2wgaGVhZCA9IChwID09IHEtPmhlYWQpOwotCQkJaWYgKGhlYWQpCi0JCQkJcS0+aGVhZCA9IHAtPnByZXY7Ci0JCQllbHNlCi0JCQkJcHJldi0+cHJldiA9IHAtPnByZXY7Ci0JCQlwLT5wcmV2ID0gTlVMTDsKLQkJCWJyY211X3BrdF9idWZfZnJlZV9za2IocCk7Ci0JCQlxLT5sZW4tLTsKLQkJCXBxLT5sZW4tLTsKLQkJCXAgPSAoaGVhZCA/IHEtPmhlYWQgOiBwcmV2LT5wcmV2KTsKLQkJfSBlbHNlIHsKLQkJCXByZXYgPSBwOwotCQkJcCA9IHAtPnByZXY7Ci0JCX0KLQl9Ci0KLQlpZiAocS0+aGVhZCA9PSBOVUxMKSB7Ci0JCXEtPnRhaWwgPSBOVUxMOwotCX0KLX0KLUVYUE9SVF9TWU1CT0woYnJjbXVfcGt0cV9wZmx1c2gpOwotCi12b2lkIGJyY211X3BrdHFfZmx1c2goc3RydWN0IHBrdHEgKnBxLCBib29sIGRpciwKLQkJaWZwa3RfY2JfdCBmbiwgdm9pZCAqYXJnKQotewotCWludCBwcmVjOwotCWZvciAocHJlYyA9IDA7IHByZWMgPCBwcS0+bnVtX3ByZWM7IHByZWMrKykKLQkJYnJjbXVfcGt0cV9wZmx1c2gocHEsIHByZWMsIGRpciwgZm4sIGFyZyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGJyY211X3BrdHFfZmx1c2gpOwotCi12b2lkIGJyY211X3BrdHFfaW5pdChzdHJ1Y3QgcGt0cSAqcHEsIGludCBudW1fcHJlYywgaW50IG1heF9sZW4pCi17Ci0JaW50IHByZWM7Ci0KLQkvKiBwcSBpcyB2YXJpYWJsZSBzaXplOyBvbmx5IHplcm8gb3V0IHdoYXQncyByZXF1ZXN0ZWQgKi8KLQltZW1zZXQocHEsIDAsCi0JICAgICAgb2Zmc2V0b2Yoc3RydWN0IHBrdHEsIHEpICsgKHNpemVvZihzdHJ1Y3QgcGt0cV9wcmVjKSAqIG51bV9wcmVjKSk7Ci0KLQlwcS0+bnVtX3ByZWMgPSAodTE2KSBudW1fcHJlYzsKLQotCXBxLT5tYXggPSAodTE2KSBtYXhfbGVuOwotCi0JZm9yIChwcmVjID0gMDsgcHJlYyA8IG51bV9wcmVjOyBwcmVjKyspCi0JCXBxLT5xW3ByZWNdLm1heCA9IHBxLT5tYXg7Ci19Ci1FWFBPUlRfU1lNQk9MKGJyY211X3BrdHFfaW5pdCk7Ci0KLXN0cnVjdCBza19idWZmICpicmNtdV9wa3RxX3BlZWtfdGFpbChzdHJ1Y3QgcGt0cSAqcHEsIGludCAqcHJlY19vdXQpCi17Ci0JaW50IHByZWM7Ci0KLQlpZiAocHEtPmxlbiA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQotCWZvciAocHJlYyA9IDA7IHByZWMgPCBwcS0+aGlfcHJlYzsgcHJlYysrKQotCQlpZiAocHEtPnFbcHJlY10uaGVhZCkKLQkJCWJyZWFrOwotCi0JaWYgKHByZWNfb3V0KQotCQkqcHJlY19vdXQgPSBwcmVjOwotCi0JcmV0dXJuIHBxLT5xW3ByZWNdLnRhaWw7Ci19Ci1FWFBPUlRfU1lNQk9MKGJyY211X3BrdHFfcGVla190YWlsKTsKLQotLyogUmV0dXJuIHN1bSBvZiBsZW5ndGhzIG9mIGEgc3BlY2lmaWMgc2V0IG9mIHByZWNlZGVuY2VzICovCi1pbnQgYnJjbXVfcGt0cV9tbGVuKHN0cnVjdCBwa3RxICpwcSwgdWludCBwcmVjX2JtcCkKLXsKLQlpbnQgcHJlYywgbGVuOwotCi0JbGVuID0gMDsKLQotCWZvciAocHJlYyA9IDA7IHByZWMgPD0gcHEtPmhpX3ByZWM7IHByZWMrKykKLQkJaWYgKHByZWNfYm1wICYgKDEgPDwgcHJlYykpCi0JCQlsZW4gKz0gcHEtPnFbcHJlY10ubGVuOwotCi0JcmV0dXJuIGxlbjsKLX0KLUVYUE9SVF9TWU1CT0woYnJjbXVfcGt0cV9tbGVuKTsKLQotLyogUHJpb3JpdHkgZGVxdWV1ZSBmcm9tIGEgc3BlY2lmaWMgc2V0IG9mIHByZWNlZGVuY2VzICovCi1zdHJ1Y3Qgc2tfYnVmZiAqYnJjbXVfcGt0cV9tZGVxKHN0cnVjdCBwa3RxICpwcSwgdWludCBwcmVjX2JtcCwKLQkJCQkgICAgICBpbnQgKnByZWNfb3V0KQotewotCXN0cnVjdCBwa3RxX3ByZWMgKnE7Ci0Jc3RydWN0IHNrX2J1ZmYgKnA7Ci0JaW50IHByZWM7Ci0KLQlpZiAocHEtPmxlbiA9PSAwKQotCQlyZXR1cm4gTlVMTDsKLQotCXdoaWxlICgocHJlYyA9IHBxLT5oaV9wcmVjKSA+IDAgJiYgcHEtPnFbcHJlY10uaGVhZCA9PSBOVUxMKQotCQlwcS0+aGlfcHJlYy0tOwotCi0Jd2hpbGUgKChwcmVjX2JtcCAmICgxIDw8IHByZWMpKSA9PSAwIHx8IHBxLT5xW3ByZWNdLmhlYWQgPT0gTlVMTCkKLQkJaWYgKHByZWMtLSA9PSAwKQotCQkJcmV0dXJuIE5VTEw7Ci0KLQlxID0gJnBxLT5xW3ByZWNdOwotCi0JcCA9IHEtPmhlYWQ7Ci0JaWYgKHAgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlxLT5oZWFkID0gcC0+cHJldjsKLQlpZiAocS0+aGVhZCA9PSBOVUxMKQotCQlxLT50YWlsID0gTlVMTDsKLQotCXEtPmxlbi0tOwotCi0JaWYgKHByZWNfb3V0KQotCQkqcHJlY19vdXQgPSBwcmVjOwotCi0JcHEtPmxlbi0tOwotCi0JcC0+cHJldiA9IE5VTEw7Ci0KLQlyZXR1cm4gcDsKLX0KLUVYUE9SVF9TWU1CT0woYnJjbXVfcGt0cV9tZGVxKTsKLQotLyogcGFyc2UgYSB4eDp4eDp4eDp4eDp4eDp4eCBmb3JtYXQgZXRoZXJuZXQgYWRkcmVzcyAqLwotaW50IGJyY211X2V0aGVyX2F0b2UoY2hhciAqcCwgdTggKmVhKQotewotCWludCBpID0gMDsKLQotCWZvciAoOzspIHsKLQkJZWFbaSsrXSA9IChjaGFyKXNpbXBsZV9zdHJ0b3VsKHAsICZwLCAxNik7Ci0JCWlmICghKnArKyB8fCBpID09IDYpCi0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gaSA9PSA2OwotfQotRVhQT1JUX1NZTUJPTChicmNtdV9ldGhlcl9hdG9lKTsKLQotI2lmIGRlZmluZWQoQkNNREJHKQotLyogcHJldHR5IGhleCBwcmludCBhIHBrdCBidWZmZXIgY2hhaW4gKi8KLXZvaWQgYnJjbXVfcHJwa3QoY29uc3QgY2hhciAqbXNnLCBzdHJ1Y3Qgc2tfYnVmZiAqcDApCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnA7Ci0KLQlpZiAobXNnICYmIChtc2dbMF0gIT0gJ1wwJykpCi0JCXByaW50ayhLRVJOX0RFQlVHICIlczpcbiIsIG1zZyk7Ci0KLQlmb3IgKHAgPSBwMDsgcDsgcCA9IHAtPm5leHQpCi0JCXByaW50X2hleF9kdW1wX2J5dGVzKCIiLCBEVU1QX1BSRUZJWF9PRkZTRVQsIHAtPmRhdGEsIHAtPmxlbik7Ci19Ci1FWFBPUlRfU1lNQk9MKGJyY211X3BycGt0KTsKLSNlbmRpZgkJCQkvKiBkZWZpbmVkKEJDTURCRykgKi8KLQotLyogaW92YXIgdGFibGUgbG9va3VwICovCi1jb25zdCBzdHJ1Y3QgYnJjbXVfaW92YXIgKmJyY211X2lvdmFyX2xvb2t1cChjb25zdCBzdHJ1Y3QgYnJjbXVfaW92YXIgKnRhYmxlLAotCQkJCQljb25zdCBjaGFyICpuYW1lKQotewotCWNvbnN0IHN0cnVjdCBicmNtdV9pb3ZhciAqdmk7Ci0JY29uc3QgY2hhciAqbG9va3VwX25hbWU7Ci0KLQkvKiBza2lwIGFueSAnOicgZGVsaW1pdGVkIG9wdGlvbiBwcmVmaXhlcyAqLwotCWxvb2t1cF9uYW1lID0gc3RycmNocihuYW1lLCAnOicpOwotCWlmIChsb29rdXBfbmFtZSAhPSBOVUxMKQotCQlsb29rdXBfbmFtZSsrOwotCWVsc2UKLQkJbG9va3VwX25hbWUgPSBuYW1lOwotCi0JZm9yICh2aSA9IHRhYmxlOyB2aS0+bmFtZTsgdmkrKykgewotCQlpZiAoIXN0cmNtcCh2aS0+bmFtZSwgbG9va3VwX25hbWUpKQotCQkJcmV0dXJuIHZpOwotCX0KLQkvKiByYW4gdG8gZW5kIG9mIHRhYmxlICovCi0KLQlyZXR1cm4gTlVMTDsJCS8qIHZhciBuYW1lIG5vdCBmb3VuZCAqLwotfQotRVhQT1JUX1NZTUJPTChicmNtdV9pb3Zhcl9sb29rdXApOwotCi1pbnQgYnJjbXVfaW92YXJfbGVuY2hlY2soY29uc3Qgc3RydWN0IGJyY211X2lvdmFyICp2aSwgdm9pZCAqYXJnLCBpbnQgbGVuLAotCQkJIGJvb2wgc2V0KQotewotCWludCBiY21lcnJvciA9IDA7Ci0KLQkvKiBsZW5ndGggY2hlY2sgb24gaW8gYnVmICovCi0Jc3dpdGNoICh2aS0+dHlwZSkgewotCWNhc2UgSU9WVF9CT09MOgotCWNhc2UgSU9WVF9JTlQ4OgotCWNhc2UgSU9WVF9JTlQxNjoKLQljYXNlIElPVlRfSU5UMzI6Ci0JY2FzZSBJT1ZUX1VJTlQ4OgotCWNhc2UgSU9WVF9VSU5UMTY6Ci0JY2FzZSBJT1ZUX1VJTlQzMjoKLQkJLyogYWxsIGludGVnZXJzIGFyZSBzMzIgc2l6ZWQgYXJncyBhdCB0aGUgaW9jdGwgaW50ZXJmYWNlICovCi0JCWlmIChsZW4gPCAoaW50KXNpemVvZihpbnQpKSB7Ci0JCQliY21lcnJvciA9IC1FT1ZFUkZMT1c7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIElPVlRfQlVGRkVSOgotCQkvKiBidWZmZXIgbXVzdCBtZWV0IG1pbmltdW0gbGVuZ3RoIHJlcXVpcmVtZW50ICovCi0JCWlmIChsZW4gPCB2aS0+bWlubGVuKSB7Ci0JCQliY21lcnJvciA9IC1FT1ZFUkZMT1c7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIElPVlRfVk9JRDoKLQkJaWYgKCFzZXQpIHsKLQkJCS8qIENhbm5vdCByZXR1cm4gbmlsLi4uICovCi0JCQliY21lcnJvciA9IC1FTk9UU1VQUDsKLQkJfSBlbHNlIGlmIChsZW4pIHsKLQkJCS8qIFNldCBpcyBhbiBhY3Rpb24gdy9vIHBhcmFtZXRlcnMgKi8KLQkJCWJjbWVycm9yID0gLUVOT0JVRlM7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQkvKiB1bmtub3duIHR5cGUgZm9yIGxlbmd0aCBjaGVjayBpbiBpb3ZhciBpbmZvICovCi0JCWJjbWVycm9yID0gLUVOT1RTVVBQOwotCX0KLQotCXJldHVybiBiY21lcnJvcjsKLX0KLUVYUE9SVF9TWU1CT0woYnJjbXVfaW92YXJfbGVuY2hlY2spOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogY3JjOAotICoKLSAqIENvbXB1dGVzIGEgY3JjOCBvdmVyIHRoZSBpbnB1dCBkYXRhIHVzaW5nIHRoZSBwb2x5bm9taWFsOgotICoKLSAqICAgICAgIHheOCArIHheNyAreF42ICsgeF40ICsgeF4yICsgMQotICoKLSAqIFRoZSBjYWxsZXIgcHJvdmlkZXMgdGhlIGluaXRpYWwgdmFsdWUgKGVpdGhlciBDUkM4X0lOSVRfVkFMVUUKLSAqIG9yIHRoZSBwcmV2aW91cyByZXR1cm5lZCB2YWx1ZSkgdG8gYWxsb3cgZm9yIHByb2Nlc3Npbmcgb2YKLSAqIGRpc2NvbnRpZ3VvdXMgYmxvY2tzIG9mIGRhdGEuICBXaGVuIGdlbmVyYXRpbmcgdGhlIENSQyB0aGUKLSAqIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY29tcGxlbWVudGluZyB0aGUgZmluYWwgcmV0dXJuIHZhbHVlCi0gKiBhbmQgaW5zZXJ0aW5nIGl0IGludG8gdGhlIGJ5dGUgc3RyZWFtLiAgV2hlbiBjaGVja2luZywgYSBmaW5hbAotICogcmV0dXJuIHZhbHVlIG9mIENSQzhfR09PRF9WQUxVRSBpbmRpY2F0ZXMgYSB2YWxpZCBDUkMuCi0gKgotICogUmVmZXJlbmNlOiBEYWxsYXMgU2VtaWNvbmR1Y3RvciBBcHBsaWNhdGlvbiBOb3RlIDI3Ci0gKiAgIFdpbGxpYW1zLCBSb3NzIE4uLCAiQSBQYWlubGVzcyBHdWlkZSB0byBDUkMgRXJyb3IgRGV0ZWN0aW9uIEFsZ29yaXRobXMiLAotICogICAgIHZlciAzLCBBdWcgMTk5Mywgcm9zc0BndWVzdC5hZGVsYWlkZS5lZHUuYXUsIFJvY2tzb2Z0IFB0eSBMdGQuLAotICogICAgIGZ0cDovL2Z0cC5yb2Nrc29mdC5jb20vY2xpZW50cy9yb2Nrc29mdC9wYXBlcnMvY3JjX3YzLnR4dAotICoKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi1zdGF0aWMgY29uc3QgdTggY3JjOF90YWJsZVsyNTZdID0gewotCTB4MDAsIDB4RjcsIDB4QjksIDB4NEUsIDB4MjUsIDB4RDIsIDB4OUMsIDB4NkIsCi0JMHg0QSwgMHhCRCwgMHhGMywgMHgwNCwgMHg2RiwgMHg5OCwgMHhENiwgMHgyMSwKLQkweDk0LCAweDYzLCAweDJELCAweERBLCAweEIxLCAweDQ2LCAweDA4LCAweEZGLAotCTB4REUsIDB4MjksIDB4NjcsIDB4OTAsIDB4RkIsIDB4MEMsIDB4NDIsIDB4QjUsCi0JMHg3RiwgMHg4OCwgMHhDNiwgMHgzMSwgMHg1QSwgMHhBRCwgMHhFMywgMHgxNCwKLQkweDM1LCAweEMyLCAweDhDLCAweDdCLCAweDEwLCAweEU3LCAweEE5LCAweDVFLAotCTB4RUIsIDB4MUMsIDB4NTIsIDB4QTUsIDB4Q0UsIDB4MzksIDB4NzcsIDB4ODAsCi0JMHhBMSwgMHg1NiwgMHgxOCwgMHhFRiwgMHg4NCwgMHg3MywgMHgzRCwgMHhDQSwKLQkweEZFLCAweDA5LCAweDQ3LCAweEIwLCAweERCLCAweDJDLCAweDYyLCAweDk1LAotCTB4QjQsIDB4NDMsIDB4MEQsIDB4RkEsIDB4OTEsIDB4NjYsIDB4MjgsIDB4REYsCi0JMHg2QSwgMHg5RCwgMHhEMywgMHgyNCwgMHg0RiwgMHhCOCwgMHhGNiwgMHgwMSwKLQkweDIwLCAweEQ3LCAweDk5LCAweDZFLCAweDA1LCAweEYyLCAweEJDLCAweDRCLAotCTB4ODEsIDB4NzYsIDB4MzgsIDB4Q0YsIDB4QTQsIDB4NTMsIDB4MUQsIDB4RUEsCi0JMHhDQiwgMHgzQywgMHg3MiwgMHg4NSwgMHhFRSwgMHgxOSwgMHg1NywgMHhBMCwKLQkweDE1LCAweEUyLCAweEFDLCAweDVCLCAweDMwLCAweEM3LCAweDg5LCAweDdFLAotCTB4NUYsIDB4QTgsIDB4RTYsIDB4MTEsIDB4N0EsIDB4OEQsIDB4QzMsIDB4MzQsCi0JMHhBQiwgMHg1QywgMHgxMiwgMHhFNSwgMHg4RSwgMHg3OSwgMHgzNywgMHhDMCwKLQkweEUxLCAweDE2LCAweDU4LCAweEFGLCAweEM0LCAweDMzLCAweDdELCAweDhBLAotCTB4M0YsIDB4QzgsIDB4ODYsIDB4NzEsIDB4MUEsIDB4RUQsIDB4QTMsIDB4NTQsCi0JMHg3NSwgMHg4MiwgMHhDQywgMHgzQiwgMHg1MCwgMHhBNywgMHhFOSwgMHgxRSwKLQkweEQ0LCAweDIzLCAweDZELCAweDlBLCAweEYxLCAweDA2LCAweDQ4LCAweEJGLAotCTB4OUUsIDB4NjksIDB4MjcsIDB4RDAsIDB4QkIsIDB4NEMsIDB4MDIsIDB4RjUsCi0JMHg0MCwgMHhCNywgMHhGOSwgMHgwRSwgMHg2NSwgMHg5MiwgMHhEQywgMHgyQiwKLQkweDBBLCAweEZELCAweEIzLCAweDQ0LCAweDJGLCAweEQ4LCAweDk2LCAweDYxLAotCTB4NTUsIDB4QTIsIDB4RUMsIDB4MUIsIDB4NzAsIDB4ODcsIDB4QzksIDB4M0UsCi0JMHgxRiwgMHhFOCwgMHhBNiwgMHg1MSwgMHgzQSwgMHhDRCwgMHg4MywgMHg3NCwKLQkweEMxLCAweDM2LCAweDc4LCAweDhGLCAweEU0LCAweDEzLCAweDVELCAweEFBLAotCTB4OEIsIDB4N0MsIDB4MzIsIDB4QzUsIDB4QUUsIDB4NTksIDB4MTcsIDB4RTAsCi0JMHgyQSwgMHhERCwgMHg5MywgMHg2NCwgMHgwRiwgMHhGOCwgMHhCNiwgMHg0MSwKLQkweDYwLCAweDk3LCAweEQ5LCAweDJFLCAweDQ1LCAweEIyLCAweEZDLCAweDBCLAotCTB4QkUsIDB4NDksIDB4MDcsIDB4RjAsIDB4OUIsIDB4NkMsIDB4MjIsIDB4RDUsCi0JMHhGNCwgMHgwMywgMHg0RCwgMHhCQSwgMHhEMSwgMHgyNiwgMHg2OCwgMHg5RgotfTsKLQotdTggYnJjbXVfY3JjOCh1OCAqcGRhdGEsCS8qIHBvaW50ZXIgdG8gYXJyYXkgb2YgZGF0YSB0byBwcm9jZXNzICovCi0JCQkgdWludCBuYnl0ZXMsCS8qIG51bWJlciBvZiBpbnB1dCBkYXRhIGJ5dGVzIHRvIHByb2Nlc3MgKi8KLQkJCSB1OCBjcmMJLyogZWl0aGVyIENSQzhfSU5JVF9WQUxVRSBvciBwcmV2aW91cyByZXR1cm4gdmFsdWUgKi8KLQkpIHsKLQkvKiBsb29wIG92ZXIgdGhlIGJ1ZmZlciBkYXRhICovCi0Jd2hpbGUgKG5ieXRlcy0tID4gMCkKLQkJY3JjID0gY3JjOF90YWJsZVsoY3JjIF4gKnBkYXRhKyspICYgMHhmZl07Ci0KLQlyZXR1cm4gY3JjOwotfQotRVhQT1JUX1NZTUJPTChicmNtdV9jcmM4KTsKLQotLyoKLSAqIFRyYXZlcnNlIGEgc3RyaW5nIG9mIDEtYnl0ZSB0YWcvMS1ieXRlIGxlbmd0aC92YXJpYWJsZS1sZW5ndGggdmFsdWUKLSAqIHRyaXBsZXMsIHJldHVybmluZyBhIHBvaW50ZXIgdG8gdGhlIHN1YnN0cmluZyB3aG9zZSBmaXJzdCBlbGVtZW50Ci0gKiBtYXRjaGVzIHRhZwotICovCi1zdHJ1Y3QgYnJjbXVfdGx2ICpicmNtdV9wYXJzZV90bHZzKHZvaWQgKmJ1ZiwgaW50IGJ1ZmxlbiwgdWludCBrZXkpCi17Ci0Jc3RydWN0IGJyY211X3RsdiAqZWx0OwotCWludCB0b3RsZW47Ci0KLQllbHQgPSAoc3RydWN0IGJyY211X3RsdiAqKSBidWY7Ci0JdG90bGVuID0gYnVmbGVuOwotCi0JLyogZmluZCB0YWdnZWQgcGFyYW1ldGVyICovCi0Jd2hpbGUgKHRvdGxlbiA+PSAyKSB7Ci0JCWludCBsZW4gPSBlbHQtPmxlbjsKLQotCQkvKiB2YWxpZGF0ZSByZW1haW5pbmcgdG90bGVuICovCi0JCWlmICgoZWx0LT5pZCA9PSBrZXkpICYmICh0b3RsZW4gPj0gKGxlbiArIDIpKSkKLQkJCXJldHVybiBlbHQ7Ci0KLQkJZWx0ID0gKHN0cnVjdCBicmNtdV90bHYgKikgKCh1OCAqKSBlbHQgKyAobGVuICsgMikpOwotCQl0b3RsZW4gLT0gKGxlbiArIDIpOwotCX0KLQotCXJldHVybiBOVUxMOwotfQotRVhQT1JUX1NZTUJPTChicmNtdV9wYXJzZV90bHZzKTsKLQotCi0jaWYgZGVmaW5lZChCQ01EQkcpCi1pbnQKLWJyY211X2Zvcm1hdF9mbGFncyhjb25zdCBzdHJ1Y3QgYnJjbXVfYml0X2Rlc2MgKmJkLCB1MzIgZmxhZ3MsIGNoYXIgKmJ1ZiwKLQkJICAgaW50IGxlbikKLXsKLQlpbnQgaTsKLQljaGFyICpwID0gYnVmOwotCWNoYXIgaGV4c3RyWzE2XTsKLQlpbnQgc2xlbiA9IDAsIG5sZW4gPSAwOwotCXUzMiBiaXQ7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQotCWlmIChsZW4gPCAyIHx8ICFidWYpCi0JCXJldHVybiAwOwotCi0JYnVmWzBdID0gJ1wwJzsKLQotCWZvciAoaSA9IDA7IGZsYWdzICE9IDA7IGkrKykgewotCQliaXQgPSBiZFtpXS5iaXQ7Ci0JCW5hbWUgPSBiZFtpXS5uYW1lOwotCQlpZiAoYml0ID09IDAgJiYgZmxhZ3MgIT0gMCkgewotCQkJLyogcHJpbnQgYW55IHVubmFtZWQgYml0cyAqLwotCQkJc25wcmludGYoaGV4c3RyLCAxNiwgIjB4JVgiLCBmbGFncyk7Ci0JCQluYW1lID0gaGV4c3RyOwotCQkJZmxhZ3MgPSAwOwkvKiBleGl0IGxvb3AgKi8KLQkJfSBlbHNlIGlmICgoZmxhZ3MgJiBiaXQpID09IDApCi0JCQljb250aW51ZTsKLQkJZmxhZ3MgJj0gfmJpdDsKLQkJbmxlbiA9IHN0cmxlbihuYW1lKTsKLQkJc2xlbiArPSBubGVuOwotCQkvKiBjb3VudCBidHduIGZsYWcgc3BhY2UgKi8KLQkJaWYgKGZsYWdzICE9IDApCi0JCQlzbGVuICs9IDE7Ci0JCS8qIG5lZWQgTlVMTCBjaGFyIGFzIHdlbGwgKi8KLQkJaWYgKGxlbiA8PSBzbGVuKQotCQkJYnJlYWs7Ci0JCS8qIGNvcHkgTlVMTCBjaGFyIGJ1dCBkb24ndCBjb3VudCBpdCAqLwotCQlzdHJuY3B5KHAsIG5hbWUsIG5sZW4gKyAxKTsKLQkJcCArPSBubGVuOwotCQkvKiBjb3B5IGJ0d24gZmxhZyBzcGFjZSBhbmQgTlVMTCBjaGFyICovCi0JCWlmIChmbGFncyAhPSAwKQotCQkJcCArPSBzbnByaW50ZihwLCAyLCAiICIpOwotCQlsZW4gLT0gc2xlbjsKLQl9Ci0KLQkvKiBpbmRpY2F0ZSB0aGUgc3RyIHdhcyB0b28gc2hvcnQgKi8KLQlpZiAoZmxhZ3MgIT0gMCkgewotCQlpZiAobGVuIDwgMikKLQkJCXAgLT0gMiAtIGxlbjsJLyogb3ZlcndyaXRlIGxhc3QgY2hhciAqLwotCQlwICs9IHNucHJpbnRmKHAsIDIsICI+Iik7Ci0JfQotCi0JcmV0dXJuIChpbnQpKHAgLSBidWYpOwotfQotRVhQT1JUX1NZTUJPTChicmNtdV9mb3JtYXRfZmxhZ3MpOwotCi0vKiBwcmludCBieXRlcyBmb3JtYXR0ZWQgYXMgaGV4IHRvIGEgc3RyaW5nLiByZXR1cm4gdGhlIHJlc3VsdGluZyBzdHJpbmcgbGVuZ3RoICovCi1pbnQgYnJjbXVfZm9ybWF0X2hleChjaGFyICpzdHIsIGNvbnN0IHZvaWQgKmJ5dGVzLCBpbnQgbGVuKQotewotCWludCBpOwotCWNoYXIgKnAgPSBzdHI7Ci0JY29uc3QgdTggKnNyYyA9IChjb25zdCB1OCAqKWJ5dGVzOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCXAgKz0gc25wcmludGYocCwgMywgIiUwMlgiLCAqc3JjKTsKLQkJc3JjKys7Ci0JfQotCXJldHVybiAoaW50KShwIC0gc3RyKTsKLX0KLUVYUE9SVF9TWU1CT0woYnJjbXVfZm9ybWF0X2hleCk7Ci0jZW5kaWYJCQkJLyogZGVmaW5lZChCQ01EQkcpICovCi0KLWNoYXIgKmJyY211X2NoaXBuYW1lKHVpbnQgY2hpcGlkLCBjaGFyICpidWYsIHVpbnQgbGVuKQotewotCWNvbnN0IGNoYXIgKmZtdDsKLQotCWZtdCA9ICgoY2hpcGlkID4gMHhhMDAwKSB8fCAoY2hpcGlkIDwgMHg0MDAwKSkgPyAiJWQiIDogIiV4IjsKLQlzbnByaW50ZihidWYsIGxlbiwgZm10LCBjaGlwaWQpOwotCXJldHVybiBidWY7Ci19Ci1FWFBPUlRfU1lNQk9MKGJyY211X2NoaXBuYW1lKTsKLQotdWludCBicmNtdV9ta2lvdmFyKGNoYXIgKm5hbWUsIGNoYXIgKmRhdGEsIHVpbnQgZGF0YWxlbiwgY2hhciAqYnVmLCB1aW50IGJ1ZmxlbikKLXsKLQl1aW50IGxlbjsKLQotCWxlbiA9IHN0cmxlbihuYW1lKSArIDE7Ci0KLQlpZiAoKGxlbiArIGRhdGFsZW4pID4gYnVmbGVuKQotCQlyZXR1cm4gMDsKLQotCXN0cm5jcHkoYnVmLCBuYW1lLCBidWZsZW4pOwotCi0JLyogYXBwZW5kIGRhdGEgb250byB0aGUgZW5kIG9mIHRoZSBuYW1lIHN0cmluZyAqLwotCW1lbWNweSgmYnVmW2xlbl0sIGRhdGEsIGRhdGFsZW4pOwotCWxlbiArPSBkYXRhbGVuOwotCi0JcmV0dXJuIGxlbjsKLX0KLUVYUE9SVF9TWU1CT0woYnJjbXVfbWtpb3Zhcik7Ci0KLS8qIFF1YXJ0ZXIgZEJtIHVuaXRzIHRvIG1XCi0gKiBUYWJsZSBzdGFydHMgYXQgUURCTV9PRkZTRVQsIHNvIHRoZSBmaXJzdCBlbnRyeSBpcyBtVyBmb3IgcWRCbT0xNTMKLSAqIFRhYmxlIGlzIG9mZnNldCBzbyB0aGUgbGFzdCBlbnRyeSBpcyBsYXJnZXN0IG1XIHZhbHVlIHRoYXQgZml0cyBpbgotICogYSB1MTYuCi0gKi8KLQotI2RlZmluZSBRREJNX09GRlNFVCAxNTMJCS8qIE9mZnNldCBmb3IgZmlyc3QgZW50cnkgKi8KLSNkZWZpbmUgUURCTV9UQUJMRV9MRU4gNDAJLyogVGFibGUgc2l6ZSAqLwotCi0vKiBTbWFsbGVzdCBtVyB2YWx1ZSB0aGF0IHdpbGwgcm91bmQgdXAgdG8gdGhlIGZpcnN0IHRhYmxlIGVudHJ5LCBRREJNX09GRlNFVC4KLSAqIFZhbHVlIGlzICggbVcoUURCTV9PRkZTRVQgLSAxKSArIG1XKFFEQk1fT0ZGU0VUKSApIC8gMgotICovCi0jZGVmaW5lIFFEQk1fVEFCTEVfTE9XX0JPVU5EIDY0OTMJLyogTG93IGJvdW5kICovCi0KLS8qIExhcmdlc3QgbVcgdmFsdWUgdGhhdCB3aWxsIHJvdW5kIGRvd24gdG8gdGhlIGxhc3QgdGFibGUgZW50cnksCi0gKiBRREJNX09GRlNFVCArIFFEQk1fVEFCTEVfTEVOLTEuCi0gKiBWYWx1ZSBpcyAoIG1XKFFEQk1fT0ZGU0VUICsgUURCTV9UQUJMRV9MRU4gLSAxKSArCi0gKiBtVyhRREJNX09GRlNFVCArIFFEQk1fVEFCTEVfTEVOKSApIC8gMi4KLSAqLwotI2RlZmluZSBRREJNX1RBQkxFX0hJR0hfQk9VTkQgNjQ5MzgJLyogSGlnaCBib3VuZCAqLwotCi1zdGF0aWMgY29uc3QgdTE2IG5xZEJtX3RvX21XX21hcFtRREJNX1RBQkxFX0xFTl0gPSB7Ci0vKiBxZEJtOgkrMAkrMQkrMgkrMwkrNAkrNQkrNgkrNyAqLwotLyogMTUzOiAqLyA2NjgzLCA3MDc5LCA3NDk5LCA3OTQzLCA4NDE0LCA4OTEzLCA5NDQxLCAxMDAwMCwKLS8qIDE2MTogKi8gMTA1OTMsIDExMjIwLCAxMTg4NSwgMTI1ODksIDEzMzM1LCAxNDEyNSwgMTQ5NjIsIDE1ODQ5LAotLyogMTY5OiAqLyAxNjc4OCwgMTc3ODMsIDE4ODM2LCAxOTk1MywgMjExMzUsIDIyMzg3LCAyMzcxNCwgMjUxMTksCi0vKiAxNzc6ICovIDI2NjA3LCAyODE4NCwgMjk4NTQsIDMxNjIzLCAzMzQ5NywgMzU0ODEsIDM3NTg0LCAzOTgxMSwKLS8qIDE4NTogKi8gNDIxNzAsIDQ0NjY4LCA0NzMxNSwgNTAxMTksIDUzMDg4LCA1NjIzNCwgNTk1NjYsIDYzMDk2Ci19OwotCi11MTYgYnJjbXVfcWRibV90b19tdyh1OCBxZGJtKQotewotCXVpbnQgZmFjdG9yID0gMTsKLQlpbnQgaWR4ID0gcWRibSAtIFFEQk1fT0ZGU0VUOwotCi0JaWYgKGlkeCA+PSBRREJNX1RBQkxFX0xFTikgewotCQkvKiBjbGFtcCB0byBtYXggdTE2IG1XIHZhbHVlICovCi0JCXJldHVybiAweEZGRkY7Ci0JfQotCi0JLyogc2NhbGUgdGhlIHFkQm0gaW5kZXggdXAgdG8gdGhlIHJhbmdlIG9mIHRoZSB0YWJsZSAwLTQwCi0JICogd2hlcmUgYW4gb2Zmc2V0IG9mIDQwIHFkQm0gZXF1YWxzIGEgZmFjdG9yIG9mIDEwIG1XLgotCSAqLwotCXdoaWxlIChpZHggPCAwKSB7Ci0JCWlkeCArPSA0MDsKLQkJZmFjdG9yICo9IDEwOwotCX0KLQotCS8qIHJldHVybiB0aGUgbVcgdmFsdWUgc2NhbGVkIGRvd24gdG8gdGhlIGNvcnJlY3QgZmFjdG9yIG9mIDEwLAotCSAqIGFkZGluZyBpbiBmYWN0b3IvMiB0byBnZXQgcHJvcGVyIHJvdW5kaW5nLgotCSAqLwotCXJldHVybiAobnFkQm1fdG9fbVdfbWFwW2lkeF0gKyBmYWN0b3IgLyAyKSAvIGZhY3RvcjsKLX0KLUVYUE9SVF9TWU1CT0woYnJjbXVfcWRibV90b19tdyk7Ci0KLXU4IGJyY211X213X3RvX3FkYm0odTE2IG13KQotewotCXU4IHFkYm07Ci0JaW50IG9mZnNldDsKLQl1aW50IG13X3VpbnQgPSBtdzsKLQl1aW50IGJvdW5kYXJ5OwotCi0JLyogaGFuZGxlIGJvdW5kYXJ5IGNhc2UgKi8KLQlpZiAobXdfdWludCA8PSAxKQotCQlyZXR1cm4gMDsKLQotCW9mZnNldCA9IFFEQk1fT0ZGU0VUOwotCi0JLyogbW92ZSBtdyBpbnRvIHRoZSByYW5nZSBvZiB0aGUgdGFibGUgKi8KLQl3aGlsZSAobXdfdWludCA8IFFEQk1fVEFCTEVfTE9XX0JPVU5EKSB7Ci0JCW13X3VpbnQgKj0gMTA7Ci0JCW9mZnNldCAtPSA0MDsKLQl9Ci0KLQlmb3IgKHFkYm0gPSAwOyBxZGJtIDwgUURCTV9UQUJMRV9MRU4gLSAxOyBxZGJtKyspIHsKLQkJYm91bmRhcnkgPSBucWRCbV90b19tV19tYXBbcWRibV0gKyAobnFkQm1fdG9fbVdfbWFwW3FkYm0gKyAxXSAtCi0JCQkJCQkgICAgbnFkQm1fdG9fbVdfbWFwW3FkYm1dKSAvIDI7Ci0JCWlmIChtd191aW50IDwgYm91bmRhcnkpCi0JCQlicmVhazsKLQl9Ci0KLQlxZGJtICs9ICh1OCkgb2Zmc2V0OwotCi0JcmV0dXJuIHFkYm07Ci19Ci1FWFBPUlRfU1lNQk9MKGJyY211X213X3RvX3FkYm0pOwotCi11aW50IGJyY211X2JpdGNvdW50KHU4ICpiaXRtYXAsIHVpbnQgbGVuZ3RoKQotewotCXVpbnQgYml0Y291bnQgPSAwLCBpOwotCXU4IHRtcDsKLQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJdG1wID0gYml0bWFwW2ldOwotCQl3aGlsZSAodG1wKSB7Ci0JCQliaXRjb3VudCsrOwotCQkJdG1wICY9ICh0bXAgLSAxKTsKLQkJfQotCX0KLQlyZXR1cm4gYml0Y291bnQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGJyY211X2JpdGNvdW50KTsKLQotLyogSW5pdGlhbGl6YXRpb24gb2YgYnJjbXVfc3RyYnVmIHN0cnVjdHVyZSAqLwotdm9pZCBicmNtdV9iaW5pdChzdHJ1Y3QgYnJjbXVfc3RyYnVmICpiLCBjaGFyICpidWYsIHVpbnQgc2l6ZSkKLXsKLQliLT5vcmlnc2l6ZSA9IGItPnNpemUgPSBzaXplOwotCWItPm9yaWdidWYgPSBiLT5idWYgPSBidWY7Ci19Ci1FWFBPUlRfU1lNQk9MKGJyY211X2Jpbml0KTsKLQotLyogQnVmZmVyIHNwcmludGYgd3JhcHBlciB0byBndWFyZCBhZ2FpbnN0IGJ1ZmZlciBvdmVyZmxvdyAqLwotaW50IGJyY211X2JwcmludGYoc3RydWN0IGJyY211X3N0cmJ1ZiAqYiwgY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0JdmFfbGlzdCBhcDsKLQlpbnQgcjsKLQotCXZhX3N0YXJ0KGFwLCBmbXQpOwotCXIgPSB2c25wcmludGYoYi0+YnVmLCBiLT5zaXplLCBmbXQsIGFwKTsKLQotCS8qIE5vbiBBbnNpIEM5OSBjb21wbGlhbnQgcmV0dXJucyAtMSwKLQkgKiBBbnNpIGNvbXBsaWFudCByZXR1cm4gciA+PSBiLT5zaXplLAotCSAqIHN0ZGxpYiByZXR1cm5zIDAsIGhhbmRsZSBhbGwKLQkgKi8KLQlpZiAoKHIgPT0gLTEpIHx8IChyID49IChpbnQpYi0+c2l6ZSkgfHwgKHIgPT0gMCkpIHsKLQkJYi0+c2l6ZSA9IDA7Ci0JfSBlbHNlIHsKLQkJYi0+c2l6ZSAtPSByOwotCQliLT5idWYgKz0gcjsKLQl9Ci0KLQl2YV9lbmQoYXApOwotCi0JcmV0dXJuIHI7Ci19Ci1FWFBPUlRfU1lNQk9MKGJyY211X2JwcmludGYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9icmNtdXRpbC93aWZpLmMgYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY211dGlsL3dpZmkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlmZmU4Ni4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2JyY211dGlsL3dpZmkuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLSNpbmNsdWRlIDxicmNtdV93aWZpLmg+Ci0KLS8qCi0gKiBWZXJpZnkgdGhlIGNoYW5zcGVjIGlzIHVzaW5nIGEgbGVnYWwgc2V0IG9mIHBhcmFtZXRlcnMsIGkuZS4gdGhhdCB0aGUKLSAqIGNoYW5zcGVjIHNwZWNpZmllZCBhIGJhbmQsIGJ3LCBjdGxfc2IgYW5kIGNoYW5uZWwgYW5kIHRoYXQgdGhlCi0gKiBjb21iaW5hdGlvbiBjb3VsZCBiZSBsZWdhbCBnaXZlbiBhbnkgc2V0IG9mIGNpcmN1bXN0YW5jZXMuCi0gKiBSRVRVUk5TOiB0cnVlIGlzIHRoZSBjaGFuc3BlYyBpcyBtYWxmb3JtZWQsIGZhbHNlIGlmIGl0IGxvb2tzIGdvb2QuCi0gKi8KLWJvb2wgYnJjbXVfY2hzcGVjX21hbGZvcm1lZChjaGFuc3BlY190IGNoYW5zcGVjKQotewotCS8qIG11c3QgYmUgMkcgb3IgNUcgYmFuZCAqLwotCWlmICghQ0hTUEVDX0lTNUcoY2hhbnNwZWMpICYmICFDSFNQRUNfSVMyRyhjaGFuc3BlYykpCi0JCXJldHVybiB0cnVlOwotCS8qIG11c3QgYmUgMjAgb3IgNDAgYmFuZHdpZHRoICovCi0JaWYgKCFDSFNQRUNfSVM0MChjaGFuc3BlYykgJiYgIUNIU1BFQ19JUzIwKGNoYW5zcGVjKSkKLQkJcmV0dXJuIHRydWU7Ci0KLQkvKiAyME1IWiBiL3cgbXVzdCBoYXZlIG5vIGN0bCBzYiwgNDAgbXVzdCBoYXZlIGEgY3RsIHNiICovCi0JaWYgKENIU1BFQ19JUzIwKGNoYW5zcGVjKSkgewotCQlpZiAoIUNIU1BFQ19TQl9OT05FKGNoYW5zcGVjKSkKLQkJCXJldHVybiB0cnVlOwotCX0gZWxzZSB7Ci0JCWlmICghQ0hTUEVDX1NCX1VQUEVSKGNoYW5zcGVjKSAmJiAhQ0hTUEVDX1NCX0xPV0VSKGNoYW5zcGVjKSkKLQkJCXJldHVybiB0cnVlOwotCX0KLQotCXJldHVybiBmYWxzZTsKLX0KLUVYUE9SVF9TWU1CT0woYnJjbXVfY2hzcGVjX21hbGZvcm1lZCk7Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGNoYW5uZWwgbnVtYmVyIHRoYXQgY29udHJvbCB0cmFmZmljIGlzIGJlaW5nIHNlbnQgb24sIGZvciBsZWdhY3kKLSAqIGNoYW5uZWxzIHRoaXMgaXMganVzdCB0aGUgY2hhbm5lbCBudW1iZXIsIGZvciA0ME1IWiBjaGFubmVscyBpdCBpcyB0aGUgdXBwZXIgb3IgbG93cmUgMjBNSFoKLSAqIHNpZGViYW5kIGRlcGVuZGluZyBvbiB0aGUgY2hhbnNwZWMgc2VsZWN0ZWQKLSAqLwotdTggYnJjbXVfY2hzcGVjX2N0bGNoYW4oY2hhbnNwZWNfdCBjaHNwZWMpCi17Ci0JdTggY3RsX2NoYW47Ci0KLQkvKiBJcyB0aGVyZSBhIHNpZGViYW5kID8gKi8KLQlpZiAoQ0hTUEVDX0NUTF9TQihjaHNwZWMpID09IFdMX0NIQU5TUEVDX0NUTF9TQl9OT05FKSB7Ci0JCXJldHVybiBDSFNQRUNfQ0hBTk5FTChjaHNwZWMpOwotCX0gZWxzZSB7Ci0JCS8qIHdlIG9ubHkgc3VwcG9ydCA0ME1IWiB3aXRoIHNpZGViYW5kcyAqLwotCQkvKiBjaGFuc3BlYyBjaGFubmVsIGhvbGRzIHRoZSBjZW50cmUgZnJlcXVlbmN5LCB1c2UgdGhhdCBhbmQgdGhlCi0JCSAqIHNpZGUgYmFuZCBpbmZvcm1hdGlvbiB0byByZWNvbnN0cnVjdCB0aGUgY29udHJvbCBjaGFubmVsIG51bWJlcgotCQkgKi8KLQkJaWYgKENIU1BFQ19DVExfU0IoY2hzcGVjKSA9PSBXTF9DSEFOU1BFQ19DVExfU0JfVVBQRVIpIHsKLQkJCS8qIGNvbnRyb2wgY2hhbiBpcyB0aGUgdXBwZXIgMjAgTUhaIFNCIG9mIHRoZSA0ME1IWiBjaGFubmVsICovCi0JCQljdGxfY2hhbiA9IFVQUEVSXzIwX1NCKENIU1BFQ19DSEFOTkVMKGNoc3BlYykpOwotCQl9IGVsc2UgewotCQkJLyogY29udHJvbCBjaGFuIGlzIHRoZSBsb3dlciAyMCBNSFogU0Igb2YgdGhlIDQwTUhaIGNoYW5uZWwgKi8KLQkJCWN0bF9jaGFuID0gTE9XRVJfMjBfU0IoQ0hTUEVDX0NIQU5ORUwoY2hzcGVjKSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gY3RsX2NoYW47Ci19Ci1FWFBPUlRfU1lNQk9MKGJyY211X2Noc3BlY19jdGxjaGFuKTsKLQotLyoKLSAqIFJldHVybiB0aGUgY2hhbm5lbCBudW1iZXIgZm9yIGEgZ2l2ZW4gZnJlcXVlbmN5IGFuZCBiYXNlIGZyZXF1ZW5jeS4KLSAqIFRoZSByZXR1cm5lZCBjaGFubmVsIG51bWJlciBpcyByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gYmFzZSBmcmVxdWVuY3kuCi0gKiBJZiB0aGUgZ2l2ZW4gYmFzZSBmcmVxdWVuY3kgaXMgemVybywgYSBiYXNlIGZyZXF1ZW5jeSBvZiA1IEdIeiBpcyBhc3N1bWVkIGZvcgotICogZnJlcXVlbmNpZXMgZnJvbSA1IC0gNiBHSHosIGFuZCAyLjQwNyBHSHogaXMgYXNzdW1lZCBmb3IgMi40IC0gMi41IEdIei4KLSAqCi0gKiBGcmVxdWVuY3kgaXMgc3BlY2lmaWVkIGluIE1Iei4KLSAqIFRoZSBiYXNlIGZyZXF1ZW5jeSBpcyBzcGVjaWZpZWQgYXMgKHN0YXJ0X2ZhY3RvciAqIDUwMCBrSHopLgotICogQ29uc3RhbnRzIFdGX0NIQU5fRkFDVE9SXzJfNF9HLCBXRl9DSEFOX0ZBQ1RPUl81X0cgYXJlIGRlZmluZWQgZm9yCi0gKiAyLjQgR0h6IGFuZCA1IEdIeiBiYW5kcy4KLSAqCi0gKiBUaGUgcmV0dXJuZWQgY2hhbm5lbCB3aWxsIGJlIGluIHRoZSByYW5nZSBbMSwgMTRdIGluIHRoZSAyLjQgR0h6IGJhbmQKLSAqIGFuZCBbMCwgMjAwXSBvdGhlcndpc2UuCi0gKiAtMSBpcyByZXR1cm5lZCBpZiB0aGUgc3RhcnRfZmFjdG9yIGlzIFdGX0NIQU5fRkFDVE9SXzJfNF9HIGFuZCB0aGUKLSAqIGZyZXF1ZW5jeSBpcyBub3QgYSAyLjQgR0h6IGNoYW5uZWwsIG9yIGlmIHRoZSBmcmVxdWVuY3kgaXMgbm90IGFuZCBldmVuCi0gKiBtdWx0aXBsZSBvZiA1IE1IeiBmcm9tIHRoZSBiYXNlIGZyZXF1ZW5jeSB0byB0aGUgYmFzZSBwbHVzIDEgR0h6LgotICoKLSAqIFJlZmVyZW5jZSA4MDIuMTEgUkVWbWEsIHNlY3Rpb24gMTcuMy44LjMsIGFuZCA4MDIuMTFCIHNlY3Rpb24gMTguNC42LjIKLSAqLwotaW50IGJyY211X21oejJjaGFubmVsKHVpbnQgZnJlcSwgdWludCBzdGFydF9mYWN0b3IpCi17Ci0JaW50IGNoID0gLTE7Ci0JdWludCBiYXNlOwotCWludCBvZmZzZXQ7Ci0KLQkvKiB0YWtlIHRoZSBkZWZhdWx0IGNoYW5uZWwgc3RhcnQgZnJlcXVlbmN5ICovCi0JaWYgKHN0YXJ0X2ZhY3RvciA9PSAwKSB7Ci0JCWlmIChmcmVxID49IDI0MDAgJiYgZnJlcSA8PSAyNTAwKQotCQkJc3RhcnRfZmFjdG9yID0gV0ZfQ0hBTl9GQUNUT1JfMl80X0c7Ci0JCWVsc2UgaWYgKGZyZXEgPj0gNTAwMCAmJiBmcmVxIDw9IDYwMDApCi0JCQlzdGFydF9mYWN0b3IgPSBXRl9DSEFOX0ZBQ1RPUl81X0c7Ci0JfQotCi0JaWYgKGZyZXEgPT0gMjQ4NCAmJiBzdGFydF9mYWN0b3IgPT0gV0ZfQ0hBTl9GQUNUT1JfMl80X0cpCi0JCXJldHVybiAxNDsKLQotCWJhc2UgPSBzdGFydF9mYWN0b3IgLyAyOwotCi0JLyogY2hlY2sgdGhhdCB0aGUgZnJlcXVlbmN5IGlzIGluIDFHSHogcmFuZ2Ugb2YgdGhlIGJhc2UgKi8KLQlpZiAoKGZyZXEgPCBiYXNlKSB8fCAoZnJlcSA+IGJhc2UgKyAxMDAwKSkKLQkJcmV0dXJuIC0xOwotCi0Jb2Zmc2V0ID0gZnJlcSAtIGJhc2U7Ci0JY2ggPSBvZmZzZXQgLyA1OwotCi0JLyogY2hlY2sgdGhhdCBmcmVxdWVuY3kgaXMgYSA1TUh6IG11bHRpcGxlIGZyb20gdGhlIGJhc2UgKi8KLQlpZiAob2Zmc2V0ICE9IChjaCAqIDUpKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiByZXN0cmljdGVkIGNoYW5uZWwgcmFuZ2UgY2hlY2sgZm9yIDIuNEcgKi8KLQlpZiAoc3RhcnRfZmFjdG9yID09IFdGX0NIQU5fRkFDVE9SXzJfNF9HICYmIChjaCA8IDEgfHwgY2ggPiAxMykpCi0JCXJldHVybiAtMTsKLQotCXJldHVybiBjaDsKLX0KLUVYUE9SVF9TWU1CT0woYnJjbXVfbWh6MmNoYW5uZWwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JyY21faHdfaWRzLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYnJjbV9od19pZHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZiMTdkNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYnJjbV9od19pZHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmCV9CUkNNX0hXX0lEU19IXwotI2RlZmluZQlfQlJDTV9IV19JRFNfSF8KLQotI2RlZmluZQlCQ000MzI1X0QxMURVQUxfSUQJMHg0MzFiCi0jZGVmaW5lCUJDTTQzMjVfRDExR19JRAkJMHg0MzFjCi0jZGVmaW5lCUJDTTQzMjVfRDExQV9JRAkJMHg0MzFkCi0KLSNkZWZpbmUgQkNNNDMyOV9EMTFOMkdfSUQJMHg0MzJmCS8qIDQzMjkgODAyLjExbiAyLjRHIGRldmljZSAqLwotI2RlZmluZSBCQ000MzI5X0QxMU41R19JRAkweDQzMzAJLyogNDMyOSA4MDIuMTFuIDVHIGRldmljZSAqLwotI2RlZmluZSBCQ000MzI5X0QxMU5EVUFMX0lECTB4NDMyZQotCi0jZGVmaW5lIEJDTTQzMTlfRDExTl9JRAkJMHg0MzM3CS8qIDQzMTkgODAyLjExbiBkdWFsYmFuZCBkZXZpY2UgKi8KLSNkZWZpbmUgQkNNNDMxOV9EMTFOMkdfSUQJMHg0MzM4CS8qIDQzMTkgODAyLjExbiAyLjRHIGRldmljZSAqLwotI2RlZmluZSBCQ000MzE5X0QxMU41R19JRAkweDQzMzkJLyogNDMxOSA4MDIuMTFuIDVHIGRldmljZSAqLwotCi0jZGVmaW5lIEJDTTQzMjI0X0QxMU5fSUQJMHg0MzUzCS8qIDQzMjI0IDgwMi4xMW4gZHVhbGJhbmQgZGV2aWNlICovCi0jZGVmaW5lIEJDTTQzMjI0X0QxMU5fSURfVkVOMQkweDA1NzYJLyogVmVuZG9yIHNwZWNpZmljIDQzMjI0IDgwMi4xMW4gZGIgKi8KLQotI2RlZmluZSBCQ000MzIyNV9EMTFOMkdfSUQJMHg0MzU3CS8qIDQzMjI1IDgwMi4xMW4gMi40R0h6IGRldmljZSAqLwotCi0jZGVmaW5lIEJDTTQzMjM2X0QxMU5fSUQJMHg0MzQ2CS8qIDQzMjM2IDgwMi4xMW4gZHVhbGJhbmQgZGV2aWNlICovCi0jZGVmaW5lIEJDTTQzMjM2X0QxMU4yR19JRAkweDQzNDcJLyogNDMyMzYgODAyLjExbiAyLjRHSHogZGV2aWNlICovCi0KLSNkZWZpbmUgQkNNNDMxM19EMTFOMkdfSUQJMHg0NzI3CS8qIDQzMTMgODAyLjExbiAyLjRHIGRldmljZSAqLwotCi0vKiBDaGlwIElEcyAqLwotI2RlZmluZSBCQ000MzEzX0NISVBfSUQJCTB4NDMxMwkvKiA0MzEzIGNoaXAgaWQgKi8KLSNkZWZpbmUJQkNNNDMxOV9DSElQX0lECQkweDQzMTkJLyogNDMxOSBjaGlwIGlkICovCi0KLSNkZWZpbmUJQkNNNDMyMjRfQ0hJUF9JRAk0MzIyNAkvKiA0MzIyNCBjaGlwY29tbW9uIGNoaXBpZCAqLwotI2RlZmluZQlCQ000MzIyNV9DSElQX0lECTQzMjI1CS8qIDQzMjI1IGNoaXBjb21tb24gY2hpcGlkICovCi0jZGVmaW5lCUJDTTQzNDIxX0NISVBfSUQJNDM0MjEJLyogNDM0MjEgY2hpcGNvbW1vbiBjaGlwaWQgKi8KLSNkZWZpbmUJQkNNNDMyMzVfQ0hJUF9JRAk0MzIzNQkvKiA0MzIzNSBjaGlwY29tbW9uIGNoaXBpZCAqLwotI2RlZmluZQlCQ000MzIzNl9DSElQX0lECTQzMjM2CS8qIDQzMjM2IGNoaXBjb21tb24gY2hpcGlkICovCi0jZGVmaW5lCUJDTTQzMjM4X0NISVBfSUQJNDMyMzgJLyogNDMyMzggY2hpcGNvbW1vbiBjaGlwaWQgKi8KLSNkZWZpbmUJQkNNNDMyOV9DSElQX0lECQkweDQzMjkJLyogNDMyOSBjaGlwY29tbW9uIGNoaXBpZCAqLwotI2RlZmluZQlCQ000MzI1X0NISVBfSUQJCTB4NDMyNQkvKiA0MzI1IGNoaXBjb21tb24gY2hpcGlkICovCi0jZGVmaW5lCUJDTTQzMzFfQ0hJUF9JRAkJMHg0MzMxCS8qIDQzMzEgY2hpcGNvbW1vbiBjaGlwaWQgKi8KLSNkZWZpbmUgQkNNNDMzNl9DSElQX0lECQkweDQzMzYJLyogNDMzNiBjaGlwY29tbW9uIGNoaXBpZCAqLwotI2RlZmluZSBCQ000MzMwX0NISVBfSUQJCTB4NDMzMAkvKiA0MzMwIGNoaXBjb21tb24gY2hpcGlkICovCi0jZGVmaW5lIEJDTTYzNjJfQ0hJUF9JRAkJMHg2MzYyCS8qIDYzNjIgY2hpcGNvbW1vbiBjaGlwaWQgKi8KLQotI2VuZGlmCQkJCS8qIF9CUkNNX0hXX0lEU19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JyY211X3V0aWxzLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYnJjbXVfdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ1NGNjNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvYnJjbXVfdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZglfQlJDTVVfVVRJTFNfSF8KLSNkZWZpbmUJX0JSQ01VX1VUSUxTX0hfCi0KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLQotLyogQnVmZmVyIHN0cnVjdHVyZSBmb3IgY29sbGVjdGluZyBzdHJpbmctZm9ybWF0dGVkIGRhdGEKLSogdXNpbmcgYnJjbXVfYnByaW50ZigpIEFQSS4KLSogVXNlIGJyY211X2Jpbml0KCkgdG8gaW5pdGlhbGl6ZSBiZWZvcmUgdXNlCi0qLwotCi1zdHJ1Y3QgYnJjbXVfc3RyYnVmIHsKLQljaGFyICpidWY7CS8qIHBvaW50ZXIgdG8gY3VycmVudCBwb3NpdGlvbiBpbiBvcmlnYnVmICovCi0JdW5zaWduZWQgaW50IHNpemU7CS8qIGN1cnJlbnQgKHJlc2lkdWFsKSBzaXplIGluIGJ5dGVzICovCi0JY2hhciAqb3JpZ2J1ZjsJLyogdW5tb2RpZmllZCBwb2ludGVyIHRvIG9yaWduYWwgYnVmZmVyICovCi0JdW5zaWduZWQgaW50IG9yaWdzaXplOwkvKiB1bm1vZGlmaWVkIG9yaWduYWwgYnVmZmVyIHNpemUgaW4gYnl0ZXMgKi8KLX07Ci0KLS8qCi0gKiBTcGluIGF0IG1vc3QgJ3VzJyBtaWNyb3NlY29uZHMgd2hpbGUgJ2V4cCcgaXMgdHJ1ZS4KLSAqIENhbGxlciBzaG91bGQgZXhwbGljaXRseSB0ZXN0ICdleHAnIHdoZW4gdGhpcyBjb21wbGV0ZXMKLSAqIGFuZCB0YWtlIGFwcHJvcHJpYXRlIGVycm9yIGFjdGlvbiBpZiAnZXhwJyBpcyBzdGlsbCB0cnVlLgotICovCi0jZGVmaW5lIFNQSU5XQUlUKGV4cCwgdXMpIHsgXAotCXVpbnQgY291bnRkb3duID0gKHVzKSArIDk7IFwKLQl3aGlsZSAoKGV4cCkgJiYgKGNvdW50ZG93biA+PSAxMCkpIHtcCi0JCXVkZWxheSgxMCk7IFwKLQkJY291bnRkb3duIC09IDEwOyBcCi0JfSBcCi19Ci0KLS8qIG9zbCBtdWx0aS1wcmVjZWRlbmNlIHBhY2tldCBxdWV1ZSAqLwotI2lmbmRlZiBQS1RRX0xFTl9ERUZBVUxUCi0jZGVmaW5lIFBLVFFfTEVOX0RFRkFVTFQgICAgICAgIDEyOAkvKiBNYXggMTI4IHBhY2tldHMgKi8KLSNlbmRpZgotI2lmbmRlZiBQS1RRX01BWF9QUkVDCi0jZGVmaW5lIFBLVFFfTUFYX1BSRUMgICAgICAgICAgIDE2CS8qIE1heGltdW0gcHJlY2VkZW5jZSBsZXZlbHMgKi8KLSNlbmRpZgotCi1zdHJ1Y3QgcGt0cV9wcmVjIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqaGVhZDsJLyogZmlyc3QgcGFja2V0IHRvIGRlcXVldWUgKi8KLQlzdHJ1Y3Qgc2tfYnVmZiAqdGFpbDsJLyogbGFzdCBwYWNrZXQgdG8gZGVxdWV1ZSAqLwotCXUxNiBsZW47CQkvKiBudW1iZXIgb2YgcXVldWVkIHBhY2tldHMgKi8KLQl1MTYgbWF4OwkJLyogbWF4aW11bSBudW1iZXIgb2YgcXVldWVkIHBhY2tldHMgKi8KLX07Ci0KLS8qIG11bHRpLXByaW9yaXR5IHBrdCBxdWV1ZSAqLwotc3RydWN0IHBrdHEgewotCXUxNiBudW1fcHJlYzsJLyogbnVtYmVyIG9mIHByZWNlZGVuY2VzIGluIHVzZSAqLwotCXUxNiBoaV9wcmVjOwkvKiByYXBpZCBkZXF1ZXVlIGhpbnQgKD49IGhpZ2hlc3Qgbm9uLWVtcHR5IHByZWMpICovCi0JdTE2IG1heDsJLyogdG90YWwgbWF4IHBhY2tldHMgKi8KLQl1MTYgbGVuOwkvKiB0b3RhbCBudW1iZXIgb2YgcGFja2V0cyAqLwotCS8qCi0JICogcSBhcnJheSBtdXN0IGJlIGxhc3Qgc2luY2UgIyBvZiBlbGVtZW50cyBjYW4gYmUgZWl0aGVyCi0JICogUEtUUV9NQVhfUFJFQyBvciAxCi0JICovCi0Jc3RydWN0IHBrdHFfcHJlYyBxW1BLVFFfTUFYX1BSRUNdOwotfTsKLQotLyogZm4ocGt0LCBhcmcpLiAgcmV0dXJuIHRydWUgaWYgcGt0IGJlbG9uZ3MgdG8gaWYgKi8KLXR5cGVkZWYgYm9vbCgqaWZwa3RfY2JfdCkgKHN0cnVjdCBza19idWZmICosIHZvaWQgKik7Ci0KLS8qIG9wZXJhdGlvbnMgb24gYSBzcGVjaWZpYyBwcmVjZWRlbmNlIGluIHBhY2tldCBxdWV1ZSAqLwotCi0jZGVmaW5lIHBrdHFfcHNldG1heChwcSwgcHJlYywgX21heCkgICAgKChwcSktPnFbcHJlY10ubWF4ID0gKF9tYXgpKQotI2RlZmluZSBwa3RxX3BsZW4ocHEsIHByZWMpICAgICAgICAgICAgICgocHEpLT5xW3ByZWNdLmxlbikKLSNkZWZpbmUgcGt0cV9wYXZhaWwocHEsIHByZWMpICAgICAgICAgICAoKHBxKS0+cVtwcmVjXS5tYXggLSAocHEpLT5xW3ByZWNdLmxlbikKLSNkZWZpbmUgcGt0cV9wZnVsbChwcSwgcHJlYykgICAgICAgICAgICAoKHBxKS0+cVtwcmVjXS5sZW4gPj0gKHBxKS0+cVtwcmVjXS5tYXgpCi0jZGVmaW5lIHBrdHFfcGVtcHR5KHBxLCBwcmVjKSAgICAgICAgICAgKChwcSktPnFbcHJlY10ubGVuID09IDApCi0KLSNkZWZpbmUgcGt0cV9wcGVlayhwcSwgcHJlYykgICAgICAgICAgICAoKHBxKS0+cVtwcmVjXS5oZWFkKQotI2RlZmluZSBwa3RxX3BwZWVrX3RhaWwocHEsIHByZWMpICAgICAgICgocHEpLT5xW3ByZWNdLnRhaWwpCi0KLWV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqYnJjbXVfcGt0cV9wZW5xKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMsCi0JCQkJIHN0cnVjdCBza19idWZmICpwKTsKLWV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqYnJjbXVfcGt0cV9wZW5xX2hlYWQoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYywKLQkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcCk7Ci1leHRlcm4gc3RydWN0IHNrX2J1ZmYgKmJyY211X3BrdHFfcGRlcShzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjKTsKLWV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqYnJjbXVfcGt0cV9wZGVxX3RhaWwoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYyk7Ci0KLS8qIHBhY2tldCBwcmltaXRpdmVzICovCi1leHRlcm4gc3RydWN0IHNrX2J1ZmYgKmJyY211X3BrdF9idWZfZ2V0X3NrYih1aW50IGxlbik7Ci1leHRlcm4gdm9pZCBicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKHN0cnVjdCBza19idWZmICpza2IpOwotCi0vKiBFbXB0eSB0aGUgcXVldWUgYXQgcGFydGljdWxhciBwcmVjZWRlbmNlIGxldmVsICovCi1leHRlcm4gdm9pZCBicmNtdV9wa3RxX3BmbHVzaChzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjLAotCWJvb2wgZGlyLCBpZnBrdF9jYl90IGZuLCB2b2lkICphcmcpOwotCi0vKiBvcGVyYXRpb25zIG9uIGEgc2V0IG9mIHByZWNlZGVuY2VzIGluIHBhY2tldCBxdWV1ZSAqLwotCi1leHRlcm4gaW50IGJyY211X3BrdHFfbWxlbihzdHJ1Y3QgcGt0cSAqcHEsIHVpbnQgcHJlY19ibXApOwotZXh0ZXJuIHN0cnVjdCBza19idWZmICpicmNtdV9wa3RxX21kZXEoc3RydWN0IHBrdHEgKnBxLCB1aW50IHByZWNfYm1wLAotCWludCAqcHJlY19vdXQpOwotCi0vKiBvcGVyYXRpb25zIG9uIHBhY2tldCBxdWV1ZSBhcyBhIHdob2xlICovCi0KLSNkZWZpbmUgcGt0cV9sZW4ocHEpICAgICAgICAgICAgICAgICAgICAoKGludCkocHEpLT5sZW4pCi0jZGVmaW5lIHBrdHFfbWF4KHBxKSAgICAgICAgICAgICAgICAgICAgKChpbnQpKHBxKS0+bWF4KQotI2RlZmluZSBwa3RxX2F2YWlsKHBxKSAgICAgICAgICAgICAgICAgICgoaW50KSgocHEpLT5tYXggLSAocHEpLT5sZW4pKQotI2RlZmluZSBwa3RxX2Z1bGwocHEpICAgICAgICAgICAgICAgICAgICgocHEpLT5sZW4gPj0gKHBxKS0+bWF4KQotI2RlZmluZSBwa3RxX2VtcHR5KHBxKSAgICAgICAgICAgICAgICAgICgocHEpLT5sZW4gPT0gMCkKLQotLyogb3BlcmF0aW9ucyBmb3Igc2luZ2xlIHByZWNlZGVuY2UgcXVldWVzICovCi0jZGVmaW5lIHBrdGVucShwcSwgcCkJCWJyY211X3BrdHFfcGVucSgoKHN0cnVjdCBwa3RxICopcHEpLCAwLCAocCkpCi0jZGVmaW5lIHBrdGVucV9oZWFkKHBxLCBwKVwKLQlicmNtdV9wa3RxX3BlbnFfaGVhZCgoKHN0cnVjdCBwa3RxICopcHEpLCAwLCAocCkpCi0jZGVmaW5lIHBrdGRlcShwcSkJCWJyY211X3BrdHFfcGRlcSgoKHN0cnVjdCBwa3RxICopcHEpLCAwKQotI2RlZmluZSBwa3RkZXFfdGFpbChwcSkJCWJyY211X3BrdHFfcGRlcV90YWlsKCgoc3RydWN0IHBrdHEgKilwcSksIDApCi0jZGVmaW5lIHBrdHFpbml0KHBxLCBsZW4pCWJyY211X3BrdHFfaW5pdCgoKHN0cnVjdCBwa3RxICopcHEpLCAxLCBsZW4pCi0KLWV4dGVybiB2b2lkIGJyY211X3BrdHFfaW5pdChzdHJ1Y3QgcGt0cSAqcHEsIGludCBudW1fcHJlYywgaW50IG1heF9sZW4pOwotLyogcHJlY19vdXQgbWF5IGJlIE5VTEwgaWYgY2FsbGVyIGlzIG5vdCBpbnRlcmVzdGVkIGluIHJldHVybiB2YWx1ZSAqLwotZXh0ZXJuIHN0cnVjdCBza19idWZmICpicmNtdV9wa3RxX3BlZWtfdGFpbChzdHJ1Y3QgcGt0cSAqcHEsIGludCAqcHJlY19vdXQpOwotZXh0ZXJuIHZvaWQgYnJjbXVfcGt0cV9mbHVzaChzdHJ1Y3QgcGt0cSAqcHEsIGJvb2wgZGlyLAotCWlmcGt0X2NiX3QgZm4sIHZvaWQgKmFyZyk7Ci0KLS8qIGV4dGVybnMgKi8KLS8qIHBhY2tldCAqLwotZXh0ZXJuIHVpbnQgYnJjbXVfcGt0ZnJvbWJ1ZihzdHJ1Y3Qgc2tfYnVmZiAqcCwKLQl1aW50IG9mZnNldCwgaW50IGxlbiwgdW5zaWduZWQgY2hhciAqYnVmKTsKLWV4dGVybiB1aW50IGJyY211X3BrdHRvdGxlbihzdHJ1Y3Qgc2tfYnVmZiAqcCk7Ci0KLS8qIGV0aGVybmV0IGFkZHJlc3MgKi8KLWV4dGVybiBpbnQgYnJjbXVfZXRoZXJfYXRvZShjaGFyICpwLCB1OCAqZWEpOwotCi0vKiBpcCBhZGRyZXNzICovCi1zdHJ1Y3QgaXB2NF9hZGRyOwotCi0jaWZkZWYgQkNNREJHCi1leHRlcm4gdm9pZCBicmNtdV9wcnBrdChjb25zdCBjaGFyICptc2csIHN0cnVjdCBza19idWZmICpwMCk7Ci0jZWxzZQotI2RlZmluZSBicmNtdV9wcnBrdChhLCBiKQotI2VuZGlmCQkJCS8qIEJDTURCRyAqLwotCi0vKiBTdXBwb3J0IGZvciBzaGFyaW5nIGNvZGUgYWNyb3NzIGluLWRyaXZlciBpb3ZhciBpbXBsZW1lbnRhdGlvbnMuCi0gKiBUaGUgaW50ZW50IGlzIHRoYXQgYSBkcml2ZXIgdXNlIHRoaXMgc3RydWN0dXJlIHRvIG1hcCBpb3ZhciBuYW1lcwotICogdG8gaXRzIChwcml2YXRlKSBpb3ZhciBpZGVudGlmaWVycywgYW5kIHRoZSBsb29rdXAgZnVuY3Rpb24gdG8KLSAqIGZpbmQgdGhlIGVudHJ5LiAgTWFjcm9zIGFyZSBwcm92aWRlZCB0byBtYXAgaWRzIGFuZCBnZXQvc2V0IGFjdGlvbnMKLSAqIGludG8gYSBzaW5nbGUgbnVtYmVyIHNwYWNlIGZvciBhIHN3aXRjaCBzdGF0ZW1lbnQuCi0gKi8KLQotLyogaW92YXIgc3RydWN0dXJlICovCi1zdHJ1Y3QgYnJjbXVfaW92YXIgewotCWNvbnN0IGNoYXIgKm5hbWU7CS8qIG5hbWUgZm9yIGxvb2t1cCBhbmQgZGlzcGxheSAqLwotCXUxNiB2YXJpZDsJLyogaWQgZm9yIHN3aXRjaCAqLwotCXUxNiBmbGFnczsJLyogZHJpdmVyLXNwZWNpZmljIGZsYWcgYml0cyAqLwotCXUxNiB0eXBlOwkvKiBiYXNlIHR5cGUgb2YgYXJndW1lbnQgKi8KLQl1MTYgbWlubGVuOwkvKiBtaW4gbGVuZ3RoIGZvciBidWZmZXIgdmFycyAqLwotfTsKLQotLyogdmFyaWQgZGVmaW5pdGlvbnMgYXJlIHBlci1kcml2ZXIsIG1heSB1c2UgdGhlc2UgZ2V0L3NldCBiaXRzICovCi0KLS8qIElPVmFyIGFjdGlvbiBiaXRzIGZvciBpZCBtYXBwaW5nICovCi0jZGVmaW5lIElPVl9HRVQgMAkJLyogR2V0IGFuIGlvdmFyICovCi0jZGVmaW5lIElPVl9TRVQgMQkJLyogU2V0IGFuIGlvdmFyICovCi0KLS8qIFZhcmlkIHRvIGFjdGlvbmlkIG1hcHBpbmcgKi8KLSNkZWZpbmUgSU9WX0dWQUwoaWQpCQkoKGlkKSoyKQotI2RlZmluZSBJT1ZfU1ZBTChpZCkJCSgoKGlkKSoyKStJT1ZfU0VUKQotI2RlZmluZSBJT1ZfSVNTRVQoYWN0aW9uaWQpCSgoYWN0aW9uaWQgJiBJT1ZfU0VUKSA9PSBJT1ZfU0VUKQotI2RlZmluZSBJT1ZfSUQoYWN0aW9uaWQpCShhY3Rpb25pZCA+PiAxKQotCi1leHRlcm4gY29uc3Qgc3RydWN0Ci1icmNtdV9pb3ZhciAqYnJjbXVfaW92YXJfbG9va3VwKGNvbnN0IHN0cnVjdCBicmNtdV9pb3ZhciAqdGFibGUsCi0JCQkJY29uc3QgY2hhciAqbmFtZSk7Ci1leHRlcm4gaW50IGJyY211X2lvdmFyX2xlbmNoZWNrKGNvbnN0IHN0cnVjdCBicmNtdV9pb3ZhciAqdGFibGUsIHZvaWQgKmFyZywKLQkJCQlpbnQgbGVuLCBib29sIHNldCk7Ci0KLS8qIEJhc2UgdHlwZSBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBJT1ZUX1ZPSUQJMAkvKiBubyB2YWx1ZSAoaW1wbGljdGx5IHNldCBvbmx5KSAqLwotI2RlZmluZSBJT1ZUX0JPT0wJMQkvKiBhbnkgdmFsdWUgb2sgKHplcm8vbm9uemVybykgKi8KLSNkZWZpbmUgSU9WVF9JTlQ4CTIJLyogaW50ZWdlciB2YWx1ZXMgYXJlIHJhbmdlLWNoZWNrZWQgKi8KLSNkZWZpbmUgSU9WVF9VSU5UOAkzCS8qIHVuc2lnbmVkIGludCA4IGJpdHMgKi8KLSNkZWZpbmUgSU9WVF9JTlQxNgk0CS8qIGludCAxNiBiaXRzICovCi0jZGVmaW5lIElPVlRfVUlOVDE2CTUJLyogdW5zaWduZWQgaW50IDE2IGJpdHMgKi8KLSNkZWZpbmUgSU9WVF9JTlQzMgk2CS8qIGludCAzMiBiaXRzICovCi0jZGVmaW5lIElPVlRfVUlOVDMyCTcJLyogdW5zaWduZWQgaW50IDMyIGJpdHMgKi8KLSNkZWZpbmUgSU9WVF9CVUZGRVIJOAkvKiBidWZmZXIgaXMgc2l6ZS1jaGVja2VkIGFzIHBlciBtaW5sZW4gKi8KLSNkZWZpbmUgQkNNX0lPVlRfVkFMSUQodHlwZSkgKCgodW5zaWduZWQgaW50KSh0eXBlKSkgPD0gSU9WVF9CVUZGRVIpCi0KLS8qICoqIGRyaXZlci9hcHBzLXNoYXJlZCBzZWN0aW9uICoqICovCi0KLSNkZWZpbmUgQkNNRV9TVFJMRU4JCTY0CS8qIE1heCBzdHJpbmcgbGVuZ3RoIGZvciBCQ00gZXJyb3JzICovCi0KLSNpZm5kZWYgQUJTCi0jZGVmaW5lCUFCUyhhKQkJCSgoKGEpIDwgMCkgPyAtKGEpIDogKGEpKQotI2VuZGlmCQkJCS8qIEFCUyAqLwotCi0jZGVmaW5lIENFSUwoeCwgeSkJCSgoKHgpICsgKCh5KS0xKSkgLyAoeSkpCi0jZGVmaW5lCUlTUE9XRVJPRjIoeCkJCSgoKCh4KS0xKSYoeCkpID09IDApCi0KLS8qIG1hcCBwaHlzaWNhbCB0byB2aXJ0dWFsIEkvTyAqLwotI2RlZmluZSBSRUdfTUFQKHBhLCBzaXplKSAgICAgICBpb3JlbWFwX25vY2FjaGUoKHVuc2lnbmVkIGxvbmcpKHBhKSwgXAotCQkJCQkodW5zaWduZWQgbG9uZykoc2l6ZSkpCi0KLS8qIHRoZSBsYXJnZXN0IHJlYXNvbmFibGUgcGFja2V0IGJ1ZmZlciBkcml2ZXIgdXNlcyBmb3IgZXRoZXJuZXQgTVRVIGluIGJ5dGVzICovCi0jZGVmaW5lCVBLVEJVRlNaCTIwNDgKLQotI2RlZmluZSBPU0xfU1lTVVBUSU1FKCkJCSgodTMyKWppZmZpZXMgKiAoMTAwMCAvIEhaKSkKLQotI2lmbmRlZiBzZXRiaXQKLSNpZm5kZWYgTkJCWQkJCS8qIHRoZSBCU0QgZmFtaWx5IGRlZmluZXMgTkJCWSAqLwotI2RlZmluZQlOQkJZCTgJCS8qIDggYml0cyBwZXIgYnl0ZSAqLwotI2VuZGlmCQkJCS8qICNpZm5kZWYgTkJCWSAqLwotI2RlZmluZQlzZXRiaXQoYSwgaSkJKCgodTggKilhKVsoaSkvTkJCWV0gfD0gMTw8KChpKSVOQkJZKSkKLSNkZWZpbmUJY2xyYml0KGEsIGkpCSgoKHU4ICopYSlbKGkpL05CQlldICY9IH4oMTw8KChpKSVOQkJZKSkpCi0jZGVmaW5lCWlzc2V0KGEsIGkpCSgoKGNvbnN0IHU4ICopYSlbKGkpL05CQlldICYgKDE8PCgoaSklTkJCWSkpKQotI2RlZmluZQlpc2NscihhLCBpKQkoKCgoY29uc3QgdTggKilhKVsoaSkvTkJCWV0gJiAoMTw8KChpKSVOQkJZKSkpID09IDApCi0jZW5kaWYJCQkJLyogc2V0Yml0ICovCi0KLSNkZWZpbmUJTkJJVFModHlwZSkJKHNpemVvZih0eXBlKSAqIDgpCi0jZGVmaW5lIE5CSVRWQUwobmJpdHMpCSgxIDw8IChuYml0cykpCi0jZGVmaW5lIE1BWEJJVFZBTChuYml0cykJKCgxIDw8IChuYml0cykpIC0gMSkKLSNkZWZpbmUJTkJJVE1BU0sobmJpdHMpCU1BWEJJVFZBTChuYml0cykKLSNkZWZpbmUgTUFYTkJWQUwobmJ5dGUpCU1BWEJJVFZBTCgobmJ5dGUpICogOCkKLQotLyogYmFzaWMgbXV4IG9wZXJhdGlvbiAtIGNhbiBiZSBvcHRpbWl6ZWQgb24gc2V2ZXJhbCBhcmNoaXRlY3R1cmVzICovCi0jZGVmaW5lIE1VWChwcmVkLCB0cnVlLCBmYWxzZSkgKChwcmVkKSA/ICh0cnVlKSA6IChmYWxzZSkpCi0KLS8qIG1vZHVsbyBpbmMvZGVjIC0gYXNzdW1lcyB4IEUgWzAsIGJvdW5kIC0gMV0gKi8KLSNkZWZpbmUgTU9EREVDKHgsIGJvdW5kKSBNVVgoKHgpID09IDAsIChib3VuZCkgLSAxLCAoeCkgLSAxKQotI2RlZmluZSBNT0RJTkMoeCwgYm91bmQpIE1VWCgoeCkgPT0gKGJvdW5kKSAtIDEsIDAsICh4KSArIDEpCi0KLS8qIG1vZHVsbyBpbmMvZGVjLCBib3VuZCA9IDJeayAqLwotI2RlZmluZSBNT0RERUNfUE9XMih4LCBib3VuZCkgKCgoeCkgLSAxKSAmICgoYm91bmQpIC0gMSkpCi0jZGVmaW5lIE1PRElOQ19QT1cyKHgsIGJvdW5kKSAoKCh4KSArIDEpICYgKChib3VuZCkgLSAxKSkKLQotLyogbW9kdWxvIGFkZC9zdWIgLSBhc3N1bWVzIHgsIHkgRSBbMCwgYm91bmQgLSAxXSAqLwotI2RlZmluZSBNT0RBREQoeCwgeSwgYm91bmQpIFwKLQlNVVgoKHgpICsgKHkpID49IChib3VuZCksICh4KSArICh5KSAtIChib3VuZCksICh4KSArICh5KSkKLSNkZWZpbmUgTU9EU1VCKHgsIHksIGJvdW5kKSBcCi0JTVVYKCgoaW50KSh4KSkgLSAoKGludCkoeSkpIDwgMCwgKHgpIC0gKHkpICsgKGJvdW5kKSwgKHgpIC0gKHkpKQotCi0vKiBtb2R1bGUgYWRkL3N1YiwgYm91bmQgPSAyXmsgKi8KLSNkZWZpbmUgTU9EQUREX1BPVzIoeCwgeSwgYm91bmQpICgoKHgpICsgKHkpKSAmICgoYm91bmQpIC0gMSkpCi0jZGVmaW5lIE1PRFNVQl9QT1cyKHgsIHksIGJvdW5kKSAoKCh4KSAtICh5KSkgJiAoKGJvdW5kKSAtIDEpKQotCi0vKiBjcmMgZGVmaW5lcyAqLwotI2RlZmluZSBDUkM4X0lOSVRfVkFMVUUgIDB4ZmYJLyogSW5pdGlhbCBDUkM4IGNoZWNrc3VtIHZhbHVlICovCi0jZGVmaW5lIENSQzhfR09PRF9WQUxVRSAgMHg5ZgkvKiBHb29kIGZpbmFsIENSQzggY2hlY2tzdW0gdmFsdWUgKi8KLSNkZWZpbmUgQ1JDMTZfSU5JVF9WQUxVRSAweGZmZmYJLyogSW5pdGlhbCBDUkMxNiBjaGVja3N1bSB2YWx1ZSAqLwotI2RlZmluZSBDUkMxNl9HT09EX1ZBTFVFIDB4ZjBiOAkvKiBHb29kIGZpbmFsIENSQzE2IGNoZWNrc3VtIHZhbHVlICovCi0KLS8qIGJyY211X2Zvcm1hdF9mbGFncygpIGJpdCBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCBicmNtdV9iaXRfZGVzYyB7Ci0JdTMyIGJpdDsKLQljb25zdCBjaGFyICpuYW1lOwotfTsKLQotLyogdGFnX0lEL2xlbmd0aC92YWx1ZV9idWZmZXIgdHVwbGUgKi8KLXN0cnVjdCBicmNtdV90bHYgewotCXU4IGlkOwotCXU4IGxlbjsKLQl1OCBkYXRhWzFdOwotfTsKLQotI2RlZmluZSBFVEhFUl9BRERSX1NUUl9MRU4JMTgJLyogMTgtYnl0ZXMgb2YgRXRoZXJuZXQgYWRkcmVzcyBidWZmZXIgbGVuZ3RoICovCi0KLS8qIGV4dGVybnMgKi8KLS8qIGNyYyAqLwotZXh0ZXJuIHU4IGJyY211X2NyYzgodTggKnAsIHVpbnQgbmJ5dGVzLCB1OCBjcmMpOwotCi0vKiBmb3JtYXQvcHJpbnQgKi8KLSNpZiBkZWZpbmVkKEJDTURCRykKLWV4dGVybiBpbnQgYnJjbXVfZm9ybWF0X2ZsYWdzKGNvbnN0IHN0cnVjdCBicmNtdV9iaXRfZGVzYyAqYmQsIHUzMiBmbGFncywKLQkJCSAgICAgIGNoYXIgKmJ1ZiwgaW50IGxlbik7Ci1leHRlcm4gaW50IGJyY211X2Zvcm1hdF9oZXgoY2hhciAqc3RyLCBjb25zdCB2b2lkICpieXRlcywgaW50IGxlbik7Ci0jZW5kaWYKLQotZXh0ZXJuIGNoYXIgKmJyY211X2NoaXBuYW1lKHVpbnQgY2hpcGlkLCBjaGFyICpidWYsIHVpbnQgbGVuKTsKLQotZXh0ZXJuIHN0cnVjdCBicmNtdV90bHYgKmJyY211X3BhcnNlX3RsdnModm9pZCAqYnVmLCBpbnQgYnVmbGVuLAotCQkJCQkgIHVpbnQga2V5KTsKLQotLyogcG93ZXIgY29udmVyc2lvbiAqLwotZXh0ZXJuIHUxNiBicmNtdV9xZGJtX3RvX213KHU4IHFkYm0pOwotZXh0ZXJuIHU4IGJyY211X213X3RvX3FkYm0odTE2IG13KTsKLQotZXh0ZXJuIHZvaWQgYnJjbXVfYmluaXQoc3RydWN0IGJyY211X3N0cmJ1ZiAqYiwgY2hhciAqYnVmLCB1aW50IHNpemUpOwotZXh0ZXJuIGludCBicmNtdV9icHJpbnRmKHN0cnVjdCBicmNtdV9zdHJidWYgKmIsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKLQotZXh0ZXJuIHVpbnQgYnJjbXVfbWtpb3ZhcihjaGFyICpuYW1lLCBjaGFyICpkYXRhLCB1aW50IGRhdGFsZW4sCi0JCQkgIGNoYXIgKmJ1ZiwgdWludCBsZW4pOwotZXh0ZXJuIHVpbnQgYnJjbXVfYml0Y291bnQodTggKmJpdG1hcCwgdWludCBieXRlbGVuZ3RoKTsKLQotI2VuZGlmCQkJCS8qIF9CUkNNVV9VVElMU19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JyY211X3dpZmkuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9icmNtdV93aWZpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZTU5MmIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2JyY211X3dpZmkuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZglfQlJDTVVfV0lGSV9IXwotI2RlZmluZQlfQlJDTVVfV0lGSV9IXwotCi0jaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4JCS8qIGZvciBFVEhfQUxFTiAqLwotI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgkJLyogZm9yIFdMQU5fUE1LSURfTEVOICovCi0KLS8qIEEgY2hhbnNwZWMgaG9sZHMgdGhlIGNoYW5uZWwgbnVtYmVyLCBiYW5kLCBiYW5kd2lkdGggYW5kIGNvbnRyb2wgc2lkZWJhbmQgKi8KLXR5cGVkZWYgdTE2IGNoYW5zcGVjX3Q7Ci0KLS8qIGNoYW5uZWwgZGVmaW5lcyAqLwotI2RlZmluZSBDSF9VUFBFUl9TQgkJCTB4MDEKLSNkZWZpbmUgQ0hfTE9XRVJfU0IJCQkweDAyCi0jZGVmaW5lIENIX0VXQV9WQUxJRAkJCTB4MDQKLSNkZWZpbmUgQ0hfMjBNSFpfQVBBUlQJCQk0Ci0jZGVmaW5lIENIXzEwTUhaX0FQQVJUCQkJMgotI2RlZmluZSBDSF81TUhaX0FQQVJUCQkJMQkvKiAyRyBiYW5kIGNoYW5uZWxzIGFyZSA1IE1oeiBhcGFydCAqLwotI2RlZmluZSBDSF9NQVhfMkdfQ0hBTk5FTAkJMTQJLyogTWF4IGNoYW5uZWwgaW4gMkcgYmFuZCAqLwotI2RlZmluZSBCUkNNX01BWF8yR19DSEFOTkVMCUNIX01BWF8yR19DSEFOTkVMCS8qIGxlZ2FjeSBkZWZpbmUgKi8KLSNkZWZpbmUJTUFYQ0hBTk5FTAkJMjI0CS8qIG1heCAjIHN1cHBvcnRlZCBjaGFubmVscy4gVGhlIG1heCBjaGFubmVsIG5vIGlzIDIxNiwKLQkJCQkJICogdGhpcyBpcyB0aGF0ICsgMSByb3VuZGVkIHVwIHRvIGEgbXVsdGlwbGUgb2YgTkJCWSAoOCkuCi0JCQkJCSAqIERPIE5PVCBNQUtFIGl0ID4gMjU1OiBjaGFubmVscyBhcmUgdTgncyBhbGwgb3ZlcgotCQkJCQkgKi8KLQotI2RlZmluZSBXTF9DSEFOU1BFQ19DSEFOX01BU0sJCTB4MDBmZgotI2RlZmluZSBXTF9DSEFOU1BFQ19DSEFOX1NISUZUCQkwCi0KLSNkZWZpbmUgV0xfQ0hBTlNQRUNfQ1RMX1NCX01BU0sJCTB4MDMwMAotI2RlZmluZSBXTF9DSEFOU1BFQ19DVExfU0JfU0hJRlQJICAgICA4Ci0jZGVmaW5lIFdMX0NIQU5TUEVDX0NUTF9TQl9MT1dFUgkweDAxMDAKLSNkZWZpbmUgV0xfQ0hBTlNQRUNfQ1RMX1NCX1VQUEVSCTB4MDIwMAotI2RlZmluZSBXTF9DSEFOU1BFQ19DVExfU0JfTk9ORQkJMHgwMzAwCi0KLSNkZWZpbmUgV0xfQ0hBTlNQRUNfQldfTUFTSwkJMHgwQzAwCi0jZGVmaW5lIFdMX0NIQU5TUEVDX0JXX1NISUZUCQkgICAgMTAKLSNkZWZpbmUgV0xfQ0hBTlNQRUNfQldfMTAJCTB4MDQwMAotI2RlZmluZSBXTF9DSEFOU1BFQ19CV18yMAkJMHgwODAwCi0jZGVmaW5lIFdMX0NIQU5TUEVDX0JXXzQwCQkweDBDMDAKLQotI2RlZmluZSBXTF9DSEFOU1BFQ19CQU5EX01BU0sJCTB4ZjAwMAotI2RlZmluZSBXTF9DSEFOU1BFQ19CQU5EX1NISUZUCQkxMgotI2RlZmluZSBXTF9DSEFOU1BFQ19CQU5EXzVHCQkweDEwMDAKLSNkZWZpbmUgV0xfQ0hBTlNQRUNfQkFORF8yRwkJMHgyMDAwCi0jZGVmaW5lIElOVkNIQU5TUEVDCQkJMjU1Ci0KLS8qIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBjaGFuX2ZyZXEgPSBjaGFuX2ZhY3RvciAqIDUwME1oeiArIDUgKiBjaGFuX251bWJlciAqLwotI2RlZmluZSBXRl9DSEFOX0ZBQ1RPUl8yXzRfRwkJNDgxNAkvKiAyLjQgR0h6IGJhbmQsIDI0MDcgTUh6ICovCi0jZGVmaW5lIFdGX0NIQU5fRkFDVE9SXzVfRwkJMTAwMDAJLyogNSAgIEdIeiBiYW5kLCA1MDAwIE1IeiAqLwotI2RlZmluZSBXRl9DSEFOX0ZBQ1RPUl80X0cJCTgwMDAJLyogNC45IEdIeiBiYW5kIGZvciBKYXBhbiAqLwotCi0vKiBjaGFubmVsIGRlZmluZXMgKi8KLSNkZWZpbmUgTE9XRVJfMjBfU0IoY2hhbm5lbCkJKCgoY2hhbm5lbCkgPiBDSF8xME1IWl9BUEFSVCkgPyAoKGNoYW5uZWwpIC0gQ0hfMTBNSFpfQVBBUlQpIDogMCkKLSNkZWZpbmUgVVBQRVJfMjBfU0IoY2hhbm5lbCkJKCgoY2hhbm5lbCkgPCAoTUFYQ0hBTk5FTCAtIENIXzEwTUhaX0FQQVJUKSkgPyBcCi0JCQkJKChjaGFubmVsKSArIENIXzEwTUhaX0FQQVJUKSA6IDApCi0jZGVmaW5lIENIU1BFQ19CQU5EVU5JVChjaHNwZWMpCShDSFNQRUNfSVM1RyhjaHNwZWMpID8gQkFORF81R19JTkRFWCA6IFwKLQkJCQkJCSAgICAgICBCQU5EXzJHX0lOREVYKQotI2RlZmluZSBDSDIwTUhaX0NIU1BFQyhjaGFubmVsKQkoY2hhbnNwZWNfdCkoKGNoYW5zcGVjX3QpKGNoYW5uZWwpIHwgV0xfQ0hBTlNQRUNfQldfMjAgfCBcCi0JCQkJV0xfQ0hBTlNQRUNfQ1RMX1NCX05PTkUgfCAoKChjaGFubmVsKSA8PSBDSF9NQVhfMkdfQ0hBTk5FTCkgPyBcCi0JCQkJV0xfQ0hBTlNQRUNfQkFORF8yRyA6IFdMX0NIQU5TUEVDX0JBTkRfNUcpKQotI2RlZmluZSBORVhUXzIwTUhaX0NIQU4oY2hhbm5lbCkJKCgoY2hhbm5lbCkgPCAoTUFYQ0hBTk5FTCAtIENIXzIwTUhaX0FQQVJUKSkgPyBcCi0JCQkJCSgoY2hhbm5lbCkgKyBDSF8yME1IWl9BUEFSVCkgOiAwKQotI2RlZmluZSBDSDQwTUhaX0NIU1BFQyhjaGFubmVsLCBjdGxzYikJKGNoYW5zcGVjX3QpIFwKLQkJCQkJKChjaGFubmVsKSB8IChjdGxzYikgfCBXTF9DSEFOU1BFQ19CV180MCB8IFwKLQkJCQkJKChjaGFubmVsKSA8PSBDSF9NQVhfMkdfQ0hBTk5FTCA/IFdMX0NIQU5TUEVDX0JBTkRfMkcgOiBcCi0JCQkJCVdMX0NIQU5TUEVDX0JBTkRfNUcpKQotI2RlZmluZSBDSFNQRUNfQ0hBTk5FTChjaHNwZWMpCSgodTgpKChjaHNwZWMpICYgV0xfQ0hBTlNQRUNfQ0hBTl9NQVNLKSkKLSNkZWZpbmUgQ0hTUEVDX0JBTkQoY2hzcGVjKQkoKGNoc3BlYykgJiBXTF9DSEFOU1BFQ19CQU5EX01BU0spCi0KLSNpZmRlZiBXTDExTl8yME1IWk9OTFkKLQotI2RlZmluZSBDSFNQRUNfQ1RMX1NCKGNoc3BlYykJV0xfQ0hBTlNQRUNfQ1RMX1NCX05PTkUKLSNkZWZpbmUgQ0hTUEVDX0JXKGNoc3BlYykJV0xfQ0hBTlNQRUNfQldfMjAKLSNkZWZpbmUgQ0hTUEVDX0lTMTAoY2hzcGVjKQkwCi0jZGVmaW5lIENIU1BFQ19JUzIwKGNoc3BlYykJMQotI2lmbmRlZiBDSFNQRUNfSVM0MAotI2RlZmluZSBDSFNQRUNfSVM0MChjaHNwZWMpCTAKLSNlbmRpZgotCi0jZWxzZQkJCQkvKiAhV0wxMU5fMjBNSFpPTkxZICovCi0KLSNkZWZpbmUgQ0hTUEVDX0NUTF9TQihjaHNwZWMpCSgoY2hzcGVjKSAmIFdMX0NIQU5TUEVDX0NUTF9TQl9NQVNLKQotI2RlZmluZSBDSFNQRUNfQlcoY2hzcGVjKQkoKGNoc3BlYykgJiBXTF9DSEFOU1BFQ19CV19NQVNLKQotI2RlZmluZSBDSFNQRUNfSVMxMChjaHNwZWMpCSgoKGNoc3BlYykgJiBXTF9DSEFOU1BFQ19CV19NQVNLKSA9PSBXTF9DSEFOU1BFQ19CV18xMCkKLSNkZWZpbmUgQ0hTUEVDX0lTMjAoY2hzcGVjKQkoKChjaHNwZWMpICYgV0xfQ0hBTlNQRUNfQldfTUFTSykgPT0gV0xfQ0hBTlNQRUNfQldfMjApCi0jaWZuZGVmIENIU1BFQ19JUzQwCi0jZGVmaW5lIENIU1BFQ19JUzQwKGNoc3BlYykJKCgoY2hzcGVjKSAmIFdMX0NIQU5TUEVDX0JXX01BU0spID09IFdMX0NIQU5TUEVDX0JXXzQwKQotI2VuZGlmCi0KLSNlbmRpZgkJCQkvKiAhV0wxMU5fMjBNSFpPTkxZICovCi0KLSNkZWZpbmUgQ0hTUEVDX0lTNUcoY2hzcGVjKQkoKChjaHNwZWMpICYgV0xfQ0hBTlNQRUNfQkFORF9NQVNLKSA9PSBXTF9DSEFOU1BFQ19CQU5EXzVHKQotI2RlZmluZSBDSFNQRUNfSVMyRyhjaHNwZWMpCSgoKGNoc3BlYykgJiBXTF9DSEFOU1BFQ19CQU5EX01BU0spID09IFdMX0NIQU5TUEVDX0JBTkRfMkcpCi0jZGVmaW5lIENIU1BFQ19TQl9OT05FKGNoc3BlYykJKCgoY2hzcGVjKSAmIFdMX0NIQU5TUEVDX0NUTF9TQl9NQVNLKSA9PSBXTF9DSEFOU1BFQ19DVExfU0JfTk9ORSkKLSNkZWZpbmUgQ0hTUEVDX1NCX1VQUEVSKGNoc3BlYykJKCgoY2hzcGVjKSAmIFdMX0NIQU5TUEVDX0NUTF9TQl9NQVNLKSA9PSBXTF9DSEFOU1BFQ19DVExfU0JfVVBQRVIpCi0jZGVmaW5lIENIU1BFQ19TQl9MT1dFUihjaHNwZWMpCSgoKGNoc3BlYykgJiBXTF9DSEFOU1BFQ19DVExfU0JfTUFTSykgPT0gV0xfQ0hBTlNQRUNfQ1RMX1NCX0xPV0VSKQotI2RlZmluZSBDSFNQRUNfQ1RMX0NIQU4oY2hzcGVjKSAgKChDSFNQRUNfU0JfTE9XRVIoY2hzcGVjKSkgPyBcCi0JCQkJICAoTE9XRVJfMjBfU0IoKChjaHNwZWMpICYgV0xfQ0hBTlNQRUNfQ0hBTl9NQVNLKSkpIDogXAotCQkJCSAgKFVQUEVSXzIwX1NCKCgoY2hzcGVjKSAmIFdMX0NIQU5TUEVDX0NIQU5fTUFTSykpKSkKLSNkZWZpbmUgQ0hTUEVDMkJBTkQoY2hzcGVjKSAoQ0hTUEVDX0lTNUcoY2hzcGVjKSA/IEJSQ01fQkFORF81RyA6IEJSQ01fQkFORF8yRykKLQotI2RlZmluZSBDSEFOU1BFQ19TVFJfTEVOICAgIDgKLQotLyogZGVmaW5lZCByYXRlIGluIDUwMGticHMgKi8KLSNkZWZpbmUgQlJDTV9NQVhSQVRFCTEwOAkvKiBpbiA1MDBrYnBzIHVuaXRzICovCi0jZGVmaW5lIEJSQ01fUkFURV8xTQkyCS8qIGluIDUwMGticHMgdW5pdHMgKi8KLSNkZWZpbmUgQlJDTV9SQVRFXzJNCTQJLyogaW4gNTAwa2JwcyB1bml0cyAqLwotI2RlZmluZSBCUkNNX1JBVEVfNU01CTExCS8qIGluIDUwMGticHMgdW5pdHMgKi8KLSNkZWZpbmUgQlJDTV9SQVRFXzExTQkyMgkvKiBpbiA1MDBrYnBzIHVuaXRzICovCi0jZGVmaW5lIEJSQ01fUkFURV82TQkxMgkvKiBpbiA1MDBrYnBzIHVuaXRzICovCi0jZGVmaW5lIEJSQ01fUkFURV85TQkxOAkvKiBpbiA1MDBrYnBzIHVuaXRzICovCi0jZGVmaW5lIEJSQ01fUkFURV8xMk0JMjQJLyogaW4gNTAwa2JwcyB1bml0cyAqLwotI2RlZmluZSBCUkNNX1JBVEVfMThNCTM2CS8qIGluIDUwMGticHMgdW5pdHMgKi8KLSNkZWZpbmUgQlJDTV9SQVRFXzI0TQk0OAkvKiBpbiA1MDBrYnBzIHVuaXRzICovCi0jZGVmaW5lIEJSQ01fUkFURV8zNk0JNzIJLyogaW4gNTAwa2JwcyB1bml0cyAqLwotI2RlZmluZSBCUkNNX1JBVEVfNDhNCTk2CS8qIGluIDUwMGticHMgdW5pdHMgKi8KLSNkZWZpbmUgQlJDTV9SQVRFXzU0TQkxMDgJLyogaW4gNTAwa2JwcyB1bml0cyAqLwotCi0jZGVmaW5lIEJSQ01fMkdfMjVNSFpfT0ZGU0VUCQk1CS8qIDIuNEdIeiBiYW5kIGNoYW5uZWwgb2Zmc2V0ICovCi0KLSNkZWZpbmUgTUNTU0VUX0xFTgkxNgotCi0jZGVmaW5lIEFDX0JJVE1BUF9UU1QoYWIsIGFjKQkoKChhYikgJiAoMSA8PCAoYWMpKSkgIT0gMCkKLQotLyoKLSAqIFZlcmlmeSB0aGUgY2hhbnNwZWMgaXMgdXNpbmcgYSBsZWdhbCBzZXQgb2YgcGFyYW1ldGVycywgaS5lLiB0aGF0IHRoZQotICogY2hhbnNwZWMgc3BlY2lmaWVkIGEgYmFuZCwgYncsIGN0bF9zYiBhbmQgY2hhbm5lbCBhbmQgdGhhdCB0aGUKLSAqIGNvbWJpbmF0aW9uIGNvdWxkIGJlIGxlZ2FsIGdpdmVuIGFueSBzZXQgb2YgY2lyY3Vtc3RhbmNlcy4KLSAqIFJFVFVSTlM6IHRydWUgaXMgdGhlIGNoYW5zcGVjIGlzIG1hbGZvcm1lZCwgZmFsc2UgaWYgaXQgbG9va3MgZ29vZC4KLSAqLwotZXh0ZXJuIGJvb2wgYnJjbXVfY2hzcGVjX21hbGZvcm1lZChjaGFuc3BlY190IGNoYW5zcGVjKTsKLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY2hhbm5lbCBudW1iZXIgdGhhdCBjb250cm9sIHRyYWZmaWMgaXMgYmVpbmcgc2VudCBvbiwgZm9yIGxlZ2FjeQotICogY2hhbm5lbHMgdGhpcyBpcyBqdXN0IHRoZSBjaGFubmVsIG51bWJlciwgZm9yIDQwTUhaIGNoYW5uZWxzIGl0IGlzIHRoZSB1cHBlciBvciBsb3dyZSAyME1IWgotICogc2lkZWJhbmQgZGVwZW5kaW5nIG9uIHRoZSBjaGFuc3BlYyBzZWxlY3RlZAotICovCi1leHRlcm4gdTggYnJjbXVfY2hzcGVjX2N0bGNoYW4oY2hhbnNwZWNfdCBjaHNwZWMpOwotCi0vKgotICogUmV0dXJuIHRoZSBjaGFubmVsIG51bWJlciBmb3IgYSBnaXZlbiBmcmVxdWVuY3kgYW5kIGJhc2UgZnJlcXVlbmN5LgotICogVGhlIHJldHVybmVkIGNoYW5uZWwgbnVtYmVyIGlzIHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBiYXNlIGZyZXF1ZW5jeS4KLSAqIElmIHRoZSBnaXZlbiBiYXNlIGZyZXF1ZW5jeSBpcyB6ZXJvLCBhIGJhc2UgZnJlcXVlbmN5IG9mIDUgR0h6IGlzIGFzc3VtZWQgZm9yCi0gKiBmcmVxdWVuY2llcyBmcm9tIDUgLSA2IEdIeiwgYW5kIDIuNDA3IEdIeiBpcyBhc3N1bWVkIGZvciAyLjQgLSAyLjUgR0h6LgotICoKLSAqIEZyZXF1ZW5jeSBpcyBzcGVjaWZpZWQgaW4gTUh6LgotICogVGhlIGJhc2UgZnJlcXVlbmN5IGlzIHNwZWNpZmllZCBhcyAoc3RhcnRfZmFjdG9yICogNTAwIGtIeikuCi0gKiBDb25zdGFudHMgV0ZfQ0hBTl9GQUNUT1JfMl80X0csIFdGX0NIQU5fRkFDVE9SXzVfRyBhcmUgZGVmaW5lZCBmb3IKLSAqIDIuNCBHSHogYW5kIDUgR0h6IGJhbmRzLgotICoKLSAqIFRoZSByZXR1cm5lZCBjaGFubmVsIHdpbGwgYmUgaW4gdGhlIHJhbmdlIFsxLCAxNF0gaW4gdGhlIDIuNCBHSHogYmFuZAotICogYW5kIFswLCAyMDBdIG90aGVyd2lzZS4KLSAqIC0xIGlzIHJldHVybmVkIGlmIHRoZSBzdGFydF9mYWN0b3IgaXMgV0ZfQ0hBTl9GQUNUT1JfMl80X0cgYW5kIHRoZQotICogZnJlcXVlbmN5IGlzIG5vdCBhIDIuNCBHSHogY2hhbm5lbCwgb3IgaWYgdGhlIGZyZXF1ZW5jeSBpcyBub3QgYW5kIGV2ZW4KLSAqIG11bHRpcGxlIG9mIDUgTUh6IGZyb20gdGhlIGJhc2UgZnJlcXVlbmN5IHRvIHRoZSBiYXNlIHBsdXMgMSBHSHouCi0gKgotICogUmVmZXJlbmNlIDgwMi4xMSBSRVZtYSwgc2VjdGlvbiAxNy4zLjguMywgYW5kIDgwMi4xMUIgc2VjdGlvbiAxOC40LjYuMgotICovCi1leHRlcm4gaW50IGJyY211X21oejJjaGFubmVsKHVpbnQgZnJlcSwgdWludCBzdGFydF9mYWN0b3IpOwotCi0vKiBFbnVtZXJhdGUgY3J5cHRvIGFsZ29yaXRobXMgKi8KLSNkZWZpbmUJQ1JZUFRPX0FMR09fT0ZGCQkJMAotI2RlZmluZQlDUllQVE9fQUxHT19XRVAxCQkxCi0jZGVmaW5lCUNSWVBUT19BTEdPX1RLSVAJCTIKLSNkZWZpbmUJQ1JZUFRPX0FMR09fV0VQMTI4CQkzCi0jZGVmaW5lIENSWVBUT19BTEdPX0FFU19DQ00JCTQKLSNkZWZpbmUgQ1JZUFRPX0FMR09fQUVTX1JFU0VSVkVEMQk1Ci0jZGVmaW5lIENSWVBUT19BTEdPX0FFU19SRVNFUlZFRDIJNgotI2RlZmluZSBDUllQVE9fQUxHT19OQUxHCQk3Ci0KLS8qIHdpcmVsZXNzIHNlY3VyaXR5IGJpdHZlYyAqLwotI2RlZmluZSBXRVBfRU5BQkxFRAkJMHgwMDAxCi0jZGVmaW5lIFRLSVBfRU5BQkxFRAkJMHgwMDAyCi0jZGVmaW5lIEFFU19FTkFCTEVECQkweDAwMDQKLSNkZWZpbmUgV1NFQ19TV0ZMQUcJCTB4MDAwOAotI2RlZmluZSBTRVNfT1dfRU5BQkxFRAkJMHgwMDQwCS8qIHRvIGdvIGludG8gdHJhbnNpdGlvbiBtb2RlIHdpdGhvdXQgc2V0dGluZyB3ZXAgKi8KLQotLyogV1BBIGF1dGhlbnRpY2F0aW9uIG1vZGUgYml0dmVjICovCi0jZGVmaW5lIFdQQV9BVVRIX0RJU0FCTEVECTB4MDAwMAkvKiBMZWdhY3kgKGkuZS4sIG5vbi1XUEEpICovCi0jZGVmaW5lIFdQQV9BVVRIX05PTkUJCTB4MDAwMQkvKiBub25lIChJQlNTKSAqLwotI2RlZmluZSBXUEFfQVVUSF9VTlNQRUNJRklFRAkweDAwMDIJLyogb3ZlciA4MDIuMXggKi8KLSNkZWZpbmUgV1BBX0FVVEhfUFNLCQkweDAwMDQJLyogUHJlLXNoYXJlZCBrZXkgKi8KLSNkZWZpbmUgV1BBX0FVVEhfUkVTRVJWRUQxCTB4MDAwOAotI2RlZmluZSBXUEFfQVVUSF9SRVNFUlZFRDIJMHgwMDEwCi0JCQkJCS8qICNkZWZpbmUgV1BBX0FVVEhfODAyMVggMHgwMDIwICovLyogODAyLjF4LCByZXNlcnZlZCAqLwotI2RlZmluZSBXUEEyX0FVVEhfUkVTRVJWRUQxCTB4MDAyMAotI2RlZmluZSBXUEEyX0FVVEhfVU5TUEVDSUZJRUQJMHgwMDQwCS8qIG92ZXIgODAyLjF4ICovCi0jZGVmaW5lIFdQQTJfQVVUSF9QU0sJCTB4MDA4MAkvKiBQcmUtc2hhcmVkIGtleSAqLwotI2RlZmluZSBXUEEyX0FVVEhfUkVTRVJWRUQzCTB4MDIwMAotI2RlZmluZSBXUEEyX0FVVEhfUkVTRVJWRUQ0CTB4MDQwMAotI2RlZmluZSBXUEEyX0FVVEhfUkVTRVJWRUQ1CTB4MDgwMAotCi0vKiBwbWtpZCAqLwotI2RlZmluZQlNQVhQTUtJRAkJMTYKLQotI2RlZmluZSBET1QxMV9ERUZBVUxUX1JUU19MRU4JCTIzNDcKLSNkZWZpbmUgRE9UMTFfREVGQVVMVF9GUkFHX0xFTgkJMjM0NgotCi0jZGVmaW5lIERPVDExX0lDVl9BRVNfTEVOCQk4Ci0jZGVmaW5lIERPVDExX1FPU19MRU4JCQkyCi0jZGVmaW5lIERPVDExX0lWX01BWF9MRU4JCTgKLSNkZWZpbmUgRE9UMTFfQTRfSERSX0xFTgkJMzAKLQotI2RlZmluZSBIVF9DQVBfUlhfU1RCQ19OTwkJMHgwCi0jZGVmaW5lIEhUX0NBUF9SWF9TVEJDX09ORV9TVFJFQU0JMHgxCi0KLXR5cGVkZWYgc3RydWN0IF9wbWtpZCB7Ci0JdTggQlNTSURbRVRIX0FMRU5dOwotCXU4IFBNS0lEW1dMQU5fUE1LSURfTEVOXTsKLX0gcG1raWRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgX3Bta2lkX2xpc3QgewotCXUzMiBucG1raWQ7Ci0JcG1raWRfdCBwbWtpZFsxXTsKLX0gcG1raWRfbGlzdF90OwotCi10eXBlZGVmIHN0cnVjdCBfcG1raWRfY2FuZCB7Ci0JdTggQlNTSURbRVRIX0FMRU5dOwotCXU4IHByZWF1dGg7Ci19IHBta2lkX2NhbmRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgX3Bta2lkX2NhbmRfbGlzdCB7Ci0JdTMyIG5wbWtpZF9jYW5kOwotCXBta2lkX2NhbmRfdCBwbWtpZF9jYW5kWzFdOwotfSBwbWtpZF9jYW5kX2xpc3RfdDsKLQotdHlwZWRlZiB1OCBhY19iaXRtYXBfdDsKLQotI2VuZGlmCQkJCS8qIF9CUkNNVV9XSUZJX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvY2hpcGNvbW1vbi5oIGIvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2NoaXBjb21tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk2NTgyYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvY2hpcGNvbW1vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKLSAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCi0gKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUwotICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgotICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgotICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KLSAqLwotCi0jaWZuZGVmCV9TQkNISVBDX0gKLSNkZWZpbmUJX1NCQ0hJUENfSAotCi0jaW5jbHVkZSAiZGVmcy5oIgkJLyogZm9yIFBBRCBtYWNybyAqLwotCi10eXBlZGVmIHZvbGF0aWxlIHN0cnVjdCB7Ci0JdTMyIGNoaXBpZDsJCS8qIDB4MCAqLwotCXUzMiBjYXBhYmlsaXRpZXM7Ci0JdTMyIGNvcmVjb250cm9sOwkvKiBjb3JlcmV2ID49IDEgKi8KLQl1MzIgYmlzdDsKLQotCS8qIE9UUCAqLwotCXUzMiBvdHBzdGF0dXM7CS8qIDB4MTAsIGNvcmVyZXYgPj0gMTAgKi8KLQl1MzIgb3RwY29udHJvbDsKLQl1MzIgb3RwcHJvZzsKLQl1MzIgb3RwbGF5b3V0OwkvKiBjb3JlcmV2ID49IDIzICovCi0KLQkvKiBJbnRlcnJ1cHQgY29udHJvbCAqLwotCXUzMiBpbnRzdGF0dXM7CS8qIDB4MjAgKi8KLQl1MzIgaW50bWFzazsKLQotCS8qIENoaXAgc3BlY2lmaWMgcmVncyAqLwotCXUzMiBjaGlwY29udHJvbDsJLyogMHgyOCwgcmV2ID49IDExICovCi0JdTMyIGNoaXBzdGF0dXM7CS8qIDB4MmMsIHJldiA+PSAxMSAqLwotCi0JLyogSnRhZyBNYXN0ZXIgKi8KLQl1MzIganRhZ2NtZDsJCS8qIDB4MzAsIHJldiA+PSAxMCAqLwotCXUzMiBqdGFnaXI7Ci0JdTMyIGp0YWdkcjsKLQl1MzIganRhZ2N0cmw7Ci0KLQkvKiBzZXJpYWwgZmxhc2ggaW50ZXJmYWNlIHJlZ2lzdGVycyAqLwotCXUzMiBmbGFzaGNvbnRyb2w7CS8qIDB4NDAgKi8KLQl1MzIgZmxhc2hhZGRyZXNzOwotCXUzMiBmbGFzaGRhdGE7Ci0JdTMyIFBBRFsxXTsKLQotCS8qIFNpbGljb24gYmFja3BsYW5lIGNvbmZpZ3VyYXRpb24gYnJvYWRjYXN0IGNvbnRyb2wgKi8KLQl1MzIgYnJvYWRjYXN0YWRkcmVzczsJLyogMHg1MCAqLwotCXUzMiBicm9hZGNhc3RkYXRhOwotCi0JLyogZ3BpbyAtIGNsZWFyZWQgb25seSBieSBwb3dlci1vbi1yZXNldCAqLwotCXUzMiBncGlvcHVsbHVwOwkvKiAweDU4LCBjb3JlcmV2ID49IDIwICovCi0JdTMyIGdwaW9wdWxsZG93bjsJLyogMHg1YywgY29yZXJldiA+PSAyMCAqLwotCXUzMiBncGlvaW47CQkvKiAweDYwICovCi0JdTMyIGdwaW9vdXQ7CQkvKiAweDY0ICovCi0JdTMyIGdwaW9vdXRlbjsJLyogMHg2OCAqLwotCXUzMiBncGlvY29udHJvbDsJLyogMHg2QyAqLwotCXUzMiBncGlvaW50cG9sYXJpdHk7CS8qIDB4NzAgKi8KLQl1MzIgZ3Bpb2ludG1hc2s7CS8qIDB4NzQgKi8KLQotCS8qIEdQSU8gZXZlbnRzIGNvcmVyZXYgPj0gMTEgKi8KLQl1MzIgZ3Bpb2V2ZW50OwotCXUzMiBncGlvZXZlbnRpbnRtYXNrOwotCi0JLyogV2F0Y2hkb2cgdGltZXIgKi8KLQl1MzIgd2F0Y2hkb2c7CS8qIDB4ODAgKi8KLQotCS8qIEdQSU8gZXZlbnRzIGNvcmVyZXYgPj0gMTEgKi8KLQl1MzIgZ3Bpb2V2ZW50aW50cG9sYXJpdHk7Ci0KLQkvKiBHUElPIGJhc2VkIExFRCBwb3dlcnNhdmUgcmVnaXN0ZXJzIGNvcmVyZXYgPj0gMTYgKi8KLQl1MzIgZ3Bpb3RpbWVydmFsOwkvKiAweDg4ICovCi0JdTMyIGdwaW90aW1lcm91dG1hc2s7Ci0KLQkvKiBjbG9jayBjb250cm9sICovCi0JdTMyIGNsb2NrY29udHJvbF9uOwkvKiAweDkwICovCi0JdTMyIGNsb2NrY29udHJvbF9zYjsJLyogYWthIG0wICovCi0JdTMyIGNsb2NrY29udHJvbF9wY2k7CS8qIGFrYSBtMSAqLwotCXUzMiBjbG9ja2NvbnRyb2xfbTI7CS8qIG1paS91YXJ0L21pcHNyZWYgKi8KLQl1MzIgY2xvY2tjb250cm9sX20zOwkvKiBjcHUgKi8KLQl1MzIgY2xrZGl2OwkJLyogY29yZXJldiA+PSAzICovCi0JdTMyIGdwaW9kZWJ1Z3NlbDsJLyogY29yZXJldiA+PSAyOCAqLwotCXUzMiBjYXBhYmlsaXRpZXNfZXh0OwkvKiAweGFjICAqLwotCi0JLyogcGxsIGRlbGF5IHJlZ2lzdGVycyAoY29yZXJldiA+PSA0KSAqLwotCXUzMiBwbGxfb25fZGVsYXk7CS8qIDB4YjAgKi8KLQl1MzIgZnJlZl9zZWxfZGVsYXk7Ci0JdTMyIHNsb3dfY2xrX2N0bDsJLyogNSA8IGNvcmVyZXYgPCAxMCAqLwotCXUzMiBQQUQ7Ci0KLQkvKiBJbnN0YWNsb2NrIHJlZ2lzdGVycyAoY29yZXJldiA+PSAxMCkgKi8KLQl1MzIgc3lzdGVtX2Nsa19jdGw7CS8qIDB4YzAgKi8KLQl1MzIgY2xrc3RhdGVzdHJldGNoOwotCXUzMiBQQURbMl07Ci0KLQkvKiBJbmRpcmVjdCBiYWNrcGxhbmUgYWNjZXNzIChjb3JlcmV2ID49IDIyKSAqLwotCXUzMiBicF9hZGRybG93OwkvKiAweGQwICovCi0JdTMyIGJwX2FkZHJoaWdoOwotCXUzMiBicF9kYXRhOwotCXUzMiBQQUQ7Ci0JdTMyIGJwX2luZGFjY2VzczsKLQl1MzIgUEFEWzNdOwotCi0JLyogTW9yZSBjbG9jayBkaXZpZGVycyAoY29yZXJldiA+PSAzMikgKi8KLQl1MzIgY2xrZGl2MjsKLQl1MzIgUEFEWzJdOwotCi0JLyogSW4gQUkgY2hpcHMsIHBvaW50ZXIgdG8gZXJvbSAqLwotCXUzMiBlcm9tcHRyOwkJLyogMHhmYyAqLwotCi0JLyogRXh0QnVzIGNvbnRyb2wgcmVnaXN0ZXJzIChjb3JlcmV2ID49IDMpICovCi0JdTMyIHBjbWNpYV9jb25maWc7CS8qIDB4MTAwICovCi0JdTMyIHBjbWNpYV9tZW13YWl0OwotCXUzMiBwY21jaWFfYXR0cndhaXQ7Ci0JdTMyIHBjbWNpYV9pb3dhaXQ7Ci0JdTMyIGlkZV9jb25maWc7Ci0JdTMyIGlkZV9tZW13YWl0OwotCXUzMiBpZGVfYXR0cndhaXQ7Ci0JdTMyIGlkZV9pb3dhaXQ7Ci0JdTMyIHByb2dfY29uZmlnOwotCXUzMiBwcm9nX3dhaXRjb3VudDsKLQl1MzIgZmxhc2hfY29uZmlnOwotCXUzMiBmbGFzaF93YWl0Y291bnQ7Ci0JdTMyIFNFQ0lfY29uZmlnOwkvKiAweDEzMCBTRUNJIGNvbmZpZ3VyYXRpb24gKi8KLQl1MzIgUEFEWzNdOwotCi0JLyogRW5oYW5jZWQgQ29leGlzdGVuY2UgSW50ZXJmYWNlIChFQ0kpIHJlZ2lzdGVycyAoY29yZXJldiA+PSAyMSkgKi8KLQl1MzIgZWNpX291dHB1dDsJLyogMHgxNDAgKi8KLQl1MzIgZWNpX2NvbnRyb2w7Ci0JdTMyIGVjaV9pbnB1dGxvOwotCXUzMiBlY2lfaW5wdXRtaTsKLQl1MzIgZWNpX2lucHV0aGk7Ci0JdTMyIGVjaV9pbnB1dGludHBvbGFyaXR5bG87Ci0JdTMyIGVjaV9pbnB1dGludHBvbGFyaXR5bWk7Ci0JdTMyIGVjaV9pbnB1dGludHBvbGFyaXR5aGk7Ci0JdTMyIGVjaV9pbnRtYXNrbG87Ci0JdTMyIGVjaV9pbnRtYXNrbWk7Ci0JdTMyIGVjaV9pbnRtYXNraGk7Ci0JdTMyIGVjaV9ldmVudGxvOwotCXUzMiBlY2lfZXZlbnRtaTsKLQl1MzIgZWNpX2V2ZW50aGk7Ci0JdTMyIGVjaV9ldmVudG1hc2tsbzsKLQl1MzIgZWNpX2V2ZW50bWFza21pOwotCXUzMiBlY2lfZXZlbnRtYXNraGk7Ci0JdTMyIFBBRFszXTsKLQotCS8qIFNST00gaW50ZXJmYWNlIChjb3JlcmV2ID49IDMyKSAqLwotCXUzMiBzcm9tY29udHJvbDsJLyogMHgxOTAgKi8KLQl1MzIgc3JvbWFkZHJlc3M7Ci0JdTMyIHNyb21kYXRhOwotCXUzMiBQQURbMTddOwotCi0JLyogQ2xvY2sgY29udHJvbCBhbmQgaGFyZHdhcmUgd29ya2Fyb3VuZHMgKGNvcmVyZXYgPj0gMjApICovCi0JdTMyIGNsa19jdGxfc3Q7CS8qIDB4MWUwICovCi0JdTMyIGh3X3dhcjsKLQl1MzIgUEFEWzcwXTsKLQotCS8qIFVBUlRzICovCi0JdTggdWFydDBkYXRhOwkvKiAweDMwMCAqLwotCXU4IHVhcnQwaW1yOwotCXU4IHVhcnQwZmNyOwotCXU4IHVhcnQwbGNyOwotCXU4IHVhcnQwbWNyOwotCXU4IHVhcnQwbHNyOwotCXU4IHVhcnQwbXNyOwotCXU4IHVhcnQwc2NyYXRjaDsKLQl1OCBQQURbMjQ4XTsJCS8qIGNvcmVyZXYgPj0gMSAqLwotCi0JdTggdWFydDFkYXRhOwkvKiAweDQwMCAqLwotCXU4IHVhcnQxaW1yOwotCXU4IHVhcnQxZmNyOwotCXU4IHVhcnQxbGNyOwotCXU4IHVhcnQxbWNyOwotCXU4IHVhcnQxbHNyOwotCXU4IHVhcnQxbXNyOwotCXU4IHVhcnQxc2NyYXRjaDsKLQl1MzIgUEFEWzEyNl07Ci0KLQkvKiBQTVUgcmVnaXN0ZXJzIChjb3JlcmV2ID49IDIwKSAqLwotCXUzMiBwbXVjb250cm9sOwkvKiAweDYwMCAqLwotCXUzMiBwbXVjYXBhYmlsaXRpZXM7Ci0JdTMyIHBtdXN0YXR1czsKLQl1MzIgcmVzX3N0YXRlOwotCXUzMiByZXNfcGVuZGluZzsKLQl1MzIgcG11dGltZXI7Ci0JdTMyIG1pbl9yZXNfbWFzazsKLQl1MzIgbWF4X3Jlc19tYXNrOwotCXUzMiByZXNfdGFibGVfc2VsOwotCXUzMiByZXNfZGVwX21hc2s7Ci0JdTMyIHJlc191cGRuX3RpbWVyOwotCXUzMiByZXNfdGltZXI7Ci0JdTMyIGNsa3N0cmV0Y2g7Ci0JdTMyIHBtdXdhdGNoZG9nOwotCXUzMiBncGlvc2VsOwkJLyogMHg2MzgsIHJldiA+PSAxICovCi0JdTMyIGdwaW9lbmFibGU7CS8qIDB4NjNjLCByZXYgPj0gMSAqLwotCXUzMiByZXNfcmVxX3RpbWVyX3NlbDsKLQl1MzIgcmVzX3JlcV90aW1lcjsKLQl1MzIgcmVzX3JlcV9tYXNrOwotCXUzMiBQQUQ7Ci0JdTMyIGNoaXBjb250cm9sX2FkZHI7CS8qIDB4NjUwICovCi0JdTMyIGNoaXBjb250cm9sX2RhdGE7CS8qIDB4NjU0ICovCi0JdTMyIHJlZ2NvbnRyb2xfYWRkcjsKLQl1MzIgcmVnY29udHJvbF9kYXRhOwotCXUzMiBwbGxjb250cm9sX2FkZHI7Ci0JdTMyIHBsbGNvbnRyb2xfZGF0YTsKLQl1MzIgcG11c3RyYXBvcHQ7CS8qIDB4NjY4LCBjb3JlcmV2ID49IDI4ICovCi0JdTMyIHBtdV94dGFsZnJlcTsJLyogMHg2NkMsIHBtdXJldiA+PSAxMCAqLwotCXUzMiBQQURbMTAwXTsKLQl1MTYgc3JvbW90cFs3NjhdOwotfSBjaGlwY3JlZ3NfdDsKLQotLyogY2hpcGlkICovCi0jZGVmaW5lCUNJRF9JRF9NQVNLCQkweDAwMDBmZmZmCS8qIENoaXAgSWQgbWFzayAqLwotI2RlZmluZQlDSURfUkVWX01BU0sJCTB4MDAwZjAwMDAJLyogQ2hpcCBSZXZpc2lvbiBtYXNrICovCi0jZGVmaW5lCUNJRF9SRVZfU0hJRlQJCTE2CS8qIENoaXAgUmV2aXNpb24gc2hpZnQgKi8KLSNkZWZpbmUJQ0lEX1BLR19NQVNLCQkweDAwZjAwMDAwCS8qIFBhY2thZ2UgT3B0aW9uIG1hc2sgKi8KLSNkZWZpbmUJQ0lEX1BLR19TSElGVAkJMjAJLyogUGFja2FnZSBPcHRpb24gc2hpZnQgKi8KLSNkZWZpbmUJQ0lEX0NDX01BU0sJCTB4MGYwMDAwMDAJLyogQ29yZUNvdW50IChjb3JlcmV2ID49IDQpICovCi0jZGVmaW5lIENJRF9DQ19TSElGVAkJMjQKLSNkZWZpbmUJQ0lEX1RZUEVfTUFTSwkJMHhmMDAwMDAwMAkvKiBDaGlwIFR5cGUgKi8KLSNkZWZpbmUgQ0lEX1RZUEVfU0hJRlQJCTI4Ci0KLS8qIGNhcGFiaWxpdGllcyAqLwotI2RlZmluZQlDQ19DQVBfVUFSVFNfTUFTSwkweDAwMDAwMDAzCS8qIE51bWJlciBvZiBVQVJUcyAqLwotI2RlZmluZSBDQ19DQVBfTUlQU0VCCQkweDAwMDAwMDA0CS8qIE1JUFMgaXMgaW4gYmlnLWVuZGlhbiBtb2RlICovCi0jZGVmaW5lIENDX0NBUF9VQ0xLU0VMCQkweDAwMDAwMDE4CS8qIFVBUlRzIGNsb2NrIHNlbGVjdCAqLwotI2RlZmluZSBDQ19DQVBfVUlOVENMSwkJMHgwMDAwMDAwOAkvKiBVQVJUcyBhcmUgZHJpdmVuIGJ5IGludGVybmFsIGRpdmlkZWQgY2xvY2sgKi8KLSNkZWZpbmUgQ0NfQ0FQX1VBUlRHUElPCQkweDAwMDAwMDIwCS8qIFVBUlRzIG93biBHUElPcyAxNToxMiAqLwotI2RlZmluZSBDQ19DQVBfRVhUQlVTX01BU0sJMHgwMDAwMDBjMAkvKiBFeHRlcm5hbCBidXMgbWFzayAqLwotI2RlZmluZSBDQ19DQVBfRVhUQlVTX05PTkUJMHgwMDAwMDAwMAkvKiBObyBFeHRCdXMgcHJlc2VudCAqLwotI2RlZmluZSBDQ19DQVBfRVhUQlVTX0ZVTEwJMHgwMDAwMDA0MAkvKiBFeHRCdXM6IFBDTUNJQSwgSURFICYgUHJvZyAqLwotI2RlZmluZSBDQ19DQVBfRVhUQlVTX1BST0cJMHgwMDAwMDA4MAkvKiBFeHRCdXM6IFByb2dJZiBvbmx5ICovCi0jZGVmaW5lCUNDX0NBUF9GTEFTSF9NQVNLCTB4MDAwMDA3MDAJLyogVHlwZSBvZiBmbGFzaCAqLwotI2RlZmluZQlDQ19DQVBfUExMX01BU0sJCTB4MDAwMzgwMDAJLyogVHlwZSBvZiBQTEwgKi8KLSNkZWZpbmUgQ0NfQ0FQX1BXUl9DVEwJCTB4MDAwNDAwMDAJLyogUG93ZXIgY29udHJvbCAqLwotI2RlZmluZSBDQ19DQVBfT1RQU0laRQkJMHgwMDM4MDAwMAkvKiBPVFAgU2l6ZSAoMCA9IG5vbmUpICovCi0jZGVmaW5lIENDX0NBUF9PVFBTSVpFX1NISUZUCTE5CS8qIE9UUCBTaXplIHNoaWZ0ICovCi0jZGVmaW5lIENDX0NBUF9PVFBTSVpFX0JBU0UJNQkvKiBPVFAgU2l6ZSBiYXNlICovCi0jZGVmaW5lIENDX0NBUF9KVEFHUAkJMHgwMDQwMDAwMAkvKiBKVEFHIE1hc3RlciBQcmVzZW50ICovCi0jZGVmaW5lIENDX0NBUF9ST00JCTB4MDA4MDAwMDAJLyogSW50ZXJuYWwgYm9vdCByb20gYWN0aXZlICovCi0jZGVmaW5lIENDX0NBUF9CS1BMTjY0CQkweDA4MDAwMDAwCS8qIDY0LWJpdCBiYWNrcGxhbmUgKi8KLSNkZWZpbmUJQ0NfQ0FQX1BNVQkJMHgxMDAwMDAwMAkvKiBQTVUgUHJlc2VudCwgcmV2ID49IDIwICovCi0jZGVmaW5lCUNDX0NBUF9TUk9NCQkweDQwMDAwMDAwCS8qIFNyb20gUHJlc2VudCwgcmV2ID49IDMyICovCi0jZGVmaW5lCUNDX0NBUF9ORkxBU0gJCTB4ODAwMDAwMDAJLyogTmFuZCBmbGFzaCBwcmVzZW50LCByZXYgPj0gMzUgKi8KLQotI2RlZmluZQlDQ19DQVAyX1NFQ0kJCTB4MDAwMDAwMDEJLyogU0VDSSBQcmVzZW50LCByZXYgPj0gMzYgKi8KLSNkZWZpbmUJQ0NfQ0FQMl9HU0lPCQkweDAwMDAwMDAyCS8qIEdTSU8gKHNwaS9pMmMpIHByZXNlbnQsIHJldiA+PSAzNyAqLwotCi0vKiBwbXVjYXBhYmlsaXRpZXMgKi8KLSNkZWZpbmUgUENBUF9SRVZfTUFTSwkweDAwMDAwMGZmCi0jZGVmaW5lIFBDQVBfUkNfTUFTSwkweDAwMDAxZjAwCi0jZGVmaW5lIFBDQVBfUkNfU0hJRlQJOAotI2RlZmluZSBQQ0FQX1RDX01BU0sJMHgwMDAxZTAwMAotI2RlZmluZSBQQ0FQX1RDX1NISUZUCTEzCi0jZGVmaW5lIFBDQVBfUENfTUFTSwkweDAwMWUwMDAwCi0jZGVmaW5lIFBDQVBfUENfU0hJRlQJMTcKLSNkZWZpbmUgUENBUF9WQ19NQVNLCTB4MDFlMDAwMDAKLSNkZWZpbmUgUENBUF9WQ19TSElGVAkyMQotI2RlZmluZSBQQ0FQX0NDX01BU0sJMHgxZTAwMDAwMAotI2RlZmluZSBQQ0FQX0NDX1NISUZUCTI1Ci0jZGVmaW5lIFBDQVA1X1BDX01BU0sJMHgwMDNlMDAwMAkvKiBQTVUgY29yZXJldiA+PSA1ICovCi0jZGVmaW5lIFBDQVA1X1BDX1NISUZUCTE3Ci0jZGVmaW5lIFBDQVA1X1ZDX01BU0sJMHgwN2MwMDAwMAotI2RlZmluZSBQQ0FQNV9WQ19TSElGVAkyMgotI2RlZmluZSBQQ0FQNV9DQ19NQVNLCTB4ZjgwMDAwMDAKLSNkZWZpbmUgUENBUDVfQ0NfU0hJRlQJMjcKLQotLyoKLSogTWF4aW11bSBkZWxheSBmb3IgdGhlIFBNVSBzdGF0ZSB0cmFuc2l0aW9uIGluIHVzLgotKiBUaGlzIGlzIGFuIHVwcGVyIGJvdW5kIGludGVuZGVkIGZvciBzcGlud2FpdHMgZXRjLgotKi8KLSNkZWZpbmUgUE1VX01BWF9UUkFOU0lUSU9OX0RMWQkxNTAwMAotCi0jZW5kaWYJCQkJLyogX1NCQ0hJUENfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2RlZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9icmNtODAyMTEvaW5jbHVkZS9kZWZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiM2UxN2QuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL2RlZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKgotICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55Ci0gKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwotICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKLSAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLSAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KLSAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCi0gKi8KLQotI2lmbmRlZglfQlJDTV9ERUZTX0hfCi0jZGVmaW5lCV9CUkNNX0RFRlNfSF8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLSNkZWZpbmUJU0lfQlVTCQkJMAotI2RlZmluZQlQQ0lfQlVTCQkJMQotI2RlZmluZQlQQ01DSUFfQlVTCQkyCi0jZGVmaW5lIFNESU9fQlVTCQkzCi0jZGVmaW5lIEpUQUdfQlVTCQk0Ci0jZGVmaW5lIFVTQl9CVVMJCQk1Ci0jZGVmaW5lIFNQSV9CVVMJCQk2Ci0KLSNpZm5kZWYgT0ZGCi0jZGVmaW5lCU9GRgkwCi0jZW5kaWYKLQotI2lmbmRlZiBPTgotI2RlZmluZQlPTgkxCQkvKiBPTiA9IDEgKi8KLSNlbmRpZgotCi0jZGVmaW5lCUFVVE8JKC0xKQkJLyogQXV0byA9IC0xICovCi0KLS8qCi0gKiBQcmlvcml0eSBkZWZpbml0aW9ucyBhY2NvcmRpbmcgODAyLjFECi0gKi8KLSNkZWZpbmUJUFJJT184MDIxRF9OT05FCQkyCi0jZGVmaW5lCVBSSU9fODAyMURfQksJCTEKLSNkZWZpbmUJUFJJT184MDIxRF9CRQkJMAotI2RlZmluZQlQUklPXzgwMjFEX0VFCQkzCi0jZGVmaW5lCVBSSU9fODAyMURfQ0wJCTQKLSNkZWZpbmUJUFJJT184MDIxRF9WSQkJNQotI2RlZmluZQlQUklPXzgwMjFEX1ZPCQk2Ci0jZGVmaW5lCVBSSU9fODAyMURfTkMJCTcKLQotI2RlZmluZQlNQVhQUklPCQkJNwotI2RlZmluZSBOVU1QUklPCQkJKE1BWFBSSU8gKyAxKQotCi0jZGVmaW5lIFdMX05VTVJBVEVTCQkxNgkvKiBtYXggIyBvZiByYXRlcyBpbiBhIHJhdGVzZXQgKi8KLQotdHlwZWRlZiBzdHJ1Y3Qgd2xfcmF0ZXNldCB7Ci0JdTMyIGNvdW50OwkJLyogIyByYXRlcyBpbiB0aGlzIHNldCAqLwotCXU4IHJhdGVzW1dMX05VTVJBVEVTXTsJLyogcmF0ZXMgaW4gNTAwa2JwcyB1bml0cyB3L2hpIGJpdCBzZXQgaWYgYmFzaWMgKi8KLX0gd2xfcmF0ZXNldF90OwotCi0jZGVmaW5lIEJSQ01fQ05UUllfQlVGX1NaCTQJLyogQ291bnRyeSBzdHJpbmcgaXMgMyBieXRlcyArIE5VTCAqLwotCi0jZGVmaW5lIEJSQ01fU0VUX0NIQU5ORUwJCQkJMzAKLSNkZWZpbmUgQlJDTV9TRVRfU1JMCQkJCTMyCi0jZGVmaW5lIEJSQ01fU0VUX0xSTAkJCQkzNAotCi0jZGVmaW5lIEJSQ01fU0VUX1JBVEVTRVQJCQkJNzIKLSNkZWZpbmUgQlJDTV9TRVRfQkNOUFJECQkJCTc2Ci0jZGVmaW5lIEJSQ01fR0VUX0NVUlJfUkFURVNFVAkJCTExNAkvKiBjdXJyZW50IHJhdGVzZXQgKi8KLSNkZWZpbmUgQlJDTV9HRVRfUEhZTElTVAkJCQkxODAKLQotLyogQml0IG1hc2tzIGZvciByYWRpbyBkaXNhYmxlZCBzdGF0dXMgLSByZXR1cm5lZCBieSBXTF9HRVRfUkFESU8gKi8KLSNkZWZpbmUgV0xfUkFESU9fU1dfRElTQUJMRQkJKDE8PDApCi0jZGVmaW5lIFdMX1JBRElPX0hXX0RJU0FCTEUJCSgxPDwxKQotI2RlZmluZSBXTF9SQURJT19NUENfRElTQUJMRQkJKDE8PDIpCi0jZGVmaW5lIFdMX1JBRElPX0NPVU5UUllfRElTQUJMRQkoMTw8MykJLyogc29tZSBjb3VudHJpZXMgZG9uJ3Qgc3VwcG9ydCBhbnkgY2hhbm5lbCAqLwotCi0vKiBPdmVycmlkZSBiaXQgZm9yIFNFVF9UWFBXUi4gIGlmIHNldCwgaWdub3JlIG90aGVyIGxldmVsIGxpbWl0cyAqLwotI2RlZmluZSBXTF9UWFBXUl9PVkVSUklERQkoMVU8PDMxKQotCi0vKiBiYW5kIHR5cGVzICovCi0jZGVmaW5lCUJSQ01fQkFORF9BVVRPCQkwCS8qIGF1dG8tc2VsZWN0ICovCi0jZGVmaW5lCUJSQ01fQkFORF81RwkJMQkvKiA1IEdoeiAqLwotI2RlZmluZQlCUkNNX0JBTkRfMkcJCTIJLyogMi40IEdoeiAqLwotI2RlZmluZQlCUkNNX0JBTkRfQUxMCQkzCS8qIGFsbCBiYW5kcyAqLwotCi0vKiBWYWx1ZXMgZm9yIFBNICovCi0jZGVmaW5lIFBNX09GRgkwCi0jZGVmaW5lIFBNX01BWAkxCi0KLS8qIE1lc3NhZ2UgbGV2ZWxzICovCi0jZGVmaW5lIExPR19FUlJPUl9WQUwJCTB4MDAwMDAwMDEKLSNkZWZpbmUgTE9HX1RSQUNFX1ZBTAkJMHgwMDAwMDAwMgotCi0jZGVmaW5lIFBNX09GRgkwCi0jZGVmaW5lIFBNX01BWAkxCi0jZGVmaW5lIFBNX0ZBU1QgMgotCi0vKgotICogU29uaWNzIENvbmZpZ3VyYXRpb24gU3BhY2UgUmVnaXN0ZXJzLgotICovCi0jZGVmaW5lCVNCQ09ORklHT0ZGCQkweGYwMAkvKiBjb3JlIHNiY29uZmlnIHJlZ3MgYXJlIHRvcCAyNTZieXRlcyBvZiByZWdzICovCi0KLS8qIGNwcCBjb250b3J0aW9ucyB0byBjb25jYXRlbmF0ZSB3L2FyZyBwcmVzY2FuICovCi0jaWZuZGVmCVBBRAotI2RlZmluZQlfUEFETElORShsaW5lKQlwYWQgIyMgbGluZQotI2RlZmluZQlfWFNUUihsaW5lKQlfUEFETElORShsaW5lKQotI2RlZmluZQlQQUQJCV9YU1RSKF9fTElORV9fKQotI2VuZGlmCi0KLSNlbmRpZgkJCQkvKiBfQlJDTV9ERUZTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvc29jLmggYi9kcml2ZXJzL3N0YWdpbmcvYnJjbTgwMjExL2luY2x1ZGUvc29jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNWE3MDUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2JyY204MDIxMS9pbmNsdWRlL3NvYy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYJX0JSQ01fU09DX0gKLSNkZWZpbmUJX0JSQ01fU09DX0gKLQotI2lmZGVmIFNJX0VOVU1fQkFTRV9WQVJJQUJMRQotI2RlZmluZSBTSV9FTlVNX0JBU0UJCShzaWktPnB1Yi5zaV9lbnVtX2Jhc2UpCi0jZWxzZQotI2RlZmluZSBTSV9FTlVNX0JBU0UJCTB4MTgwMDAwMDAJLyogRW51bWVyYXRpb24gc3BhY2UgYmFzZSAqLwotI2VuZGlmCQkJCS8qIFNJX0VOVU1fQkFTRV9WQVJJQUJMRSAqLwotCi0vKiBjb3JlIGNvZGVzICovCi0jZGVmaW5lCU5PREVWX0NPUkVfSUQJCTB4NzAwCS8qIEludmFsaWQgY29yZWlkICovCi0jZGVmaW5lCUNDX0NPUkVfSUQJCTB4ODAwCS8qIGNoaXBjb21tb24gY29yZSAqLwotI2RlZmluZQlJTElORTIwX0NPUkVfSUQJCTB4ODAxCS8qIGlsaW5lMjAgY29yZSAqLwotI2RlZmluZQlTUkFNX0NPUkVfSUQJCTB4ODAyCS8qIHNyYW0gY29yZSAqLwotI2RlZmluZQlTRFJBTV9DT1JFX0lECQkweDgwMwkvKiBzZHJhbSBjb3JlICovCi0jZGVmaW5lCVBDSV9DT1JFX0lECQkweDgwNAkvKiBwY2kgY29yZSAqLwotI2RlZmluZQlNSVBTX0NPUkVfSUQJCTB4ODA1CS8qIG1pcHMgY29yZSAqLwotI2RlZmluZQlFTkVUX0NPUkVfSUQJCTB4ODA2CS8qIGVuZXQgbWFjIGNvcmUgKi8KLSNkZWZpbmUJQ09ERUNfQ09SRV9JRAkJMHg4MDcJLyogdjkwIGNvZGVjIGNvcmUgKi8KLSNkZWZpbmUJVVNCX0NPUkVfSUQJCTB4ODA4CS8qIHVzYiAxLjEgaG9zdC9kZXZpY2UgY29yZSAqLwotI2RlZmluZQlBRFNMX0NPUkVfSUQJCTB4ODA5CS8qIEFEU0wgY29yZSAqLwotI2RlZmluZQlJTElORTEwMF9DT1JFX0lECTB4ODBhCS8qIGlsaW5lMTAwIGNvcmUgKi8KLSNkZWZpbmUJSVBTRUNfQ09SRV9JRAkJMHg4MGIJLyogaXBzZWMgY29yZSAqLwotI2RlZmluZQlVVE9QSUFfQ09SRV9JRAkJMHg4MGMJLyogdXRvcGlhIGNvcmUgKi8KLSNkZWZpbmUJUENNQ0lBX0NPUkVfSUQJCTB4ODBkCS8qIHBjbWNpYSBjb3JlICovCi0jZGVmaW5lCVNPQ1JBTV9DT1JFX0lECQkweDgwZQkvKiBpbnRlcm5hbCBtZW1vcnkgY29yZSAqLwotI2RlZmluZQlNRU1DX0NPUkVfSUQJCTB4ODBmCS8qIG1lbWMgc2RyYW0gY29yZSAqLwotI2RlZmluZQlPRkRNX0NPUkVfSUQJCTB4ODEwCS8qIE9GRE0gcGh5IGNvcmUgKi8KLSNkZWZpbmUJRVhUSUZfQ09SRV9JRAkJMHg4MTEJLyogZXh0ZXJuYWwgaW50ZXJmYWNlIGNvcmUgKi8KLSNkZWZpbmUJRDExX0NPUkVfSUQJCTB4ODEyCS8qIDgwMi4xMSBNQUMgY29yZSAqLwotI2RlZmluZQlBUEhZX0NPUkVfSUQJCTB4ODEzCS8qIDgwMi4xMWEgcGh5IGNvcmUgKi8KLSNkZWZpbmUJQlBIWV9DT1JFX0lECQkweDgxNAkvKiA4MDIuMTFiIHBoeSBjb3JlICovCi0jZGVmaW5lCUdQSFlfQ09SRV9JRAkJMHg4MTUJLyogODAyLjExZyBwaHkgY29yZSAqLwotI2RlZmluZQlNSVBTMzNfQ09SRV9JRAkJMHg4MTYJLyogbWlwczMzMDIgY29yZSAqLwotI2RlZmluZQlVU0IxMUhfQ09SRV9JRAkJMHg4MTcJLyogdXNiIDEuMSBob3N0IGNvcmUgKi8KLSNkZWZpbmUJVVNCMTFEX0NPUkVfSUQJCTB4ODE4CS8qIHVzYiAxLjEgZGV2aWNlIGNvcmUgKi8KLSNkZWZpbmUJVVNCMjBIX0NPUkVfSUQJCTB4ODE5CS8qIHVzYiAyLjAgaG9zdCBjb3JlICovCi0jZGVmaW5lCVVTQjIwRF9DT1JFX0lECQkweDgxYQkvKiB1c2IgMi4wIGRldmljZSBjb3JlICovCi0jZGVmaW5lCVNESU9IX0NPUkVfSUQJCTB4ODFiCS8qIHNkaW8gaG9zdCBjb3JlICovCi0jZGVmaW5lCVJPQk9fQ09SRV9JRAkJMHg4MWMJLyogcm9ib3N3aXRjaCBjb3JlICovCi0jZGVmaW5lCUFUQTEwMF9DT1JFX0lECQkweDgxZAkvKiBwYXJhbGxlbCBBVEEgY29yZSAqLwotI2RlZmluZQlTQVRBWE9SX0NPUkVfSUQJCTB4ODFlCS8qIHNlcmlhbCBBVEEgJiBYT1IgRE1BIGNvcmUgKi8KLSNkZWZpbmUJR0lHRVRIX0NPUkVfSUQJCTB4ODFmCS8qIGdpZ2FiaXQgZXRoZXJuZXQgY29yZSAqLwotI2RlZmluZQlQQ0lFX0NPUkVfSUQJCTB4ODIwCS8qIHBjaSBleHByZXNzIGNvcmUgKi8KLSNkZWZpbmUJTlBIWV9DT1JFX0lECQkweDgyMQkvKiA4MDIuMTFuIDJ4MiBwaHkgY29yZSAqLwotI2RlZmluZQlTUkFNQ19DT1JFX0lECQkweDgyMgkvKiBTUkFNIGNvbnRyb2xsZXIgY29yZSAqLwotI2RlZmluZQlNSU5JTUFDX0NPUkVfSUQJCTB4ODIzCS8qIE1JTkkgTUFDL3BoeSBjb3JlICovCi0jZGVmaW5lCUFSTTExX0NPUkVfSUQJCTB4ODI0CS8qIEFSTSAxMTc2IGNvcmUgKi8KLSNkZWZpbmUJQVJNN1NfQ09SRV9JRAkJMHg4MjUJLyogQVJNN3RkbWktcyBjb3JlICovCi0jZGVmaW5lCUxQUEhZX0NPUkVfSUQJCTB4ODI2CS8qIDgwMi4xMWEvYi9nIHBoeSBjb3JlICovCi0jZGVmaW5lCVBNVV9DT1JFX0lECQkweDgyNwkvKiBQTVUgY29yZSAqLwotI2RlZmluZQlTU05QSFlfQ09SRV9JRAkJMHg4MjgJLyogODAyLjExbiBzaW5nbGUtc3RyZWFtIHBoeSBjb3JlICovCi0jZGVmaW5lCVNESU9EX0NPUkVfSUQJCTB4ODI5CS8qIFNESU8gZGV2aWNlIGNvcmUgKi8KLSNkZWZpbmUJQVJNQ00zX0NPUkVfSUQJCTB4ODJhCS8qIEFSTSBDb3J0ZXggTTMgY29yZSAqLwotI2RlZmluZQlIVFBIWV9DT1JFX0lECQkweDgyYgkvKiA4MDIuMTFuIDR4NCBwaHkgY29yZSAqLwotI2RlZmluZQlNSVBTNzRLX0NPUkVfSUQJCTB4ODJjCS8qIG1pcHMgNzRrIGNvcmUgKi8KLSNkZWZpbmUJR01BQ19DT1JFX0lECQkweDgyZAkvKiBHaWdhYml0IE1BQyBjb3JlICovCi0jZGVmaW5lCURNRU1DX0NPUkVfSUQJCTB4ODJlCS8qIEREUjEvMiBtZW1vcnkgY29udHJvbGxlciBjb3JlICovCi0jZGVmaW5lCVBDSUVSQ19DT1JFX0lECQkweDgyZgkvKiBQQ0lFIFJvb3QgQ29tcGxleCBjb3JlICovCi0jZGVmaW5lCU9DUF9DT1JFX0lECQkweDgzMAkvKiBPQ1AyT0NQIGJyaWRnZSBjb3JlICovCi0jZGVmaW5lCVNDX0NPUkVfSUQJCTB4ODMxCS8qIHNoYXJlZCBjb21tb24gY29yZSAqLwotI2RlZmluZQlBSEJfQ09SRV9JRAkJMHg4MzIJLyogT0NQMkFIQiBicmlkZ2UgY29yZSAqLwotI2RlZmluZQlTUElIX0NPUkVfSUQJCTB4ODMzCS8qIFNQSSBob3N0IGNvcmUgKi8KLSNkZWZpbmUJSTJTX0NPUkVfSUQJCTB4ODM0CS8qIEkyUyBjb3JlICovCi0jZGVmaW5lCURNRU1TX0NPUkVfSUQJCTB4ODM1CS8qIFNEUi9ERFIxIG1lbW9yeSBjb250cm9sbGVyIGNvcmUgKi8KLSNkZWZpbmUJREVGX1NISU1fQ09NUAkJMHg4MzcJLyogU0hJTSBjb21wb25lbnQgaW4gdWJ1cy82MzYyICovCi0jZGVmaW5lIE9PQl9ST1VURVJfQ09SRV9JRAkweDM2NwkvKiBPT0Igcm91dGVyIGNvcmUgSUQgKi8KLSNkZWZpbmUJREVGX0FJX0NPTVAJCTB4ZmZmCS8qIERlZmF1bHQgY29tcG9uZW50LCBpbiBhaSBjaGlwcyBpdCBtYXBzIGFsbAotCQkJCQkgKiB1bnVzZWQgYWRkcmVzcyByYW5nZXMKLQkJCQkJICovCi0KLS8qIENvbW1vbiBjb3JlIGNvbnRyb2wgZmxhZ3MgKi8KLSNkZWZpbmUJU0lDRl9CSVNUX0VOCQkweDgwMDAKLSNkZWZpbmUJU0lDRl9QTUVfRU4JCTB4NDAwMAotI2RlZmluZQlTSUNGX0NPUkVfQklUUwkJMHgzZmZjCi0jZGVmaW5lCVNJQ0ZfRkdDCQkweDAwMDIKLSNkZWZpbmUJU0lDRl9DTE9DS19FTgkJMHgwMDAxCi0KLSNlbmRpZgkJCQkvKiBfQlJDTV9TT0NfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnCmluZGV4IDVlNjVkZGUuLjRjNzdlNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL0tjb25maWcKQEAgLTEyNDQsMTEgKzEyNDQsMTAgQEAKIAkgIGNhbGxlZCBkdDk4MTIuCiAKIGNvbmZpZyBDT01FRElfVVNCRFVYCi0JdHJpc3RhdGUgIklUTCBVU0JEVVggc3VwcG9ydCIKKwl0cmlzdGF0ZSAiSVRMIFVTQi1EVVgtRCBzdXBwb3J0IgogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KLQkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgVW5pdmVyc2l0eSBvZiBTdGlybGluZyBVU0IgREFRIGFuZCBJTkNJVEUKLQkgIFRlY2hub2xvZ3kgTGltaXRlZCBkcml2ZXIKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgSW5jaXRlIFRlY2hub2xvZ3kgTHRkIFVTQi1EVVgtRCBCb2FyZAogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKIAkgIGNhbGxlZCB1c2JkdXguCkBAIC0xMjU4LDEyICsxMjU3LDIxIEBACiAJc2VsZWN0IENPTUVESV9GQwogCWRlZmF1bHQgTgogCS0tLWhlbHAtLS0KLQkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgVW5pdmVyc2l0eSBvZiBTdGlybGluZyBVU0ItRFVYZmFzdCBhbmQgSU5DSVRFCi0JICBUZWNobm9sb2d5IExpbWl0ZWQgZHJpdmVyCisJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIEluY2l0ZSBUZWNobm9sb2d5IEx0ZCBVU0ItRFVYZmFzdCBCb2FyZAogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKIAkgIGNhbGxlZCB1c2JkdXhmYXN0LgogCitjb25maWcgQ09NRURJX1VTQkRVWFNJR01BCisJdHJpc3RhdGUgIklUTCBVU0ItRFVYc2lnbWEgc3VwcG9ydCIKKwlzZWxlY3QgQ09NRURJX0ZDCisJZGVmYXVsdCBOCisJLS0taGVscC0tLQorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBJbmNpdGUgVGVjaG5vbG9neSBMdGQgVVNCLURVWHNpZ21hIEJvYXJkCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHVzYmR1eHNpZ21hLgorCiBjb25maWcgQ09NRURJX1ZNSzgwWFgKIAl0cmlzdGF0ZSAiVmVsbGVtYW4gVk0xMTAvVk0xNDAgVVNCIEJvYXJkIHN1cHBvcnQiCiAJZGVmYXVsdCBOCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMKaW5kZXggZTkwZTNjYy4uMjFkOGMxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYwpAQCAtMTAxLDcgKzEwMSw3IEBACiBzdGF0aWMgaW50IGRvX3BvbGxfaW9jdGwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHN1YmQsCiAJCQkgdm9pZCAqZmlsZSk7CiAKLWV4dGVybiB2b2lkIGRvX2JlY29tZV9ub25idXN5KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCitzdGF0aWMgdm9pZCBkb19iZWNvbWVfbm9uYnVzeShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpOwogc3RhdGljIGludCBkb19jYW5jZWwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvTWFrZWZpbGUKaW5kZXggMzNiZjFmNS4uMTcwZGE2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9NYWtlZmlsZQpAQCAtMTI2LDYgKzEyNiw3IEBACiBvYmotJChDT05GSUdfQ09NRURJX0RUOTgxMikJCSs9IGR0OTgxMi5vCiBvYmotJChDT05GSUdfQ09NRURJX1VTQkRVWCkJCSs9IHVzYmR1eC5vCiBvYmotJChDT05GSUdfQ09NRURJX1VTQkRVWEZBU1QpCQkrPSB1c2JkdXhmYXN0Lm8KK29iai0kKENPTkZJR19DT01FRElfVVNCRFVYU0lHTUEpCSs9IHVzYmR1eHNpZ21hLm8KIG9iai0kKENPTkZJR19DT01FRElfVk1LODBYWCkJCSs9IHZtazgweHgubwogCiAjIENvbWVkaSBOSSBkcml2ZXJzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaV9kaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpX2Rpby5jCmluZGV4IGQyMzc5OWIuLjY5MzM0ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpX2Rpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpX2Rpby5jCkBAIC00MjIsNyArNDIyLDcgQEAKIAl1bnNpZ25lZCBzaG9ydCBJRElGaWx0ckhpZ2hbOF07CS8qICBJREkncyBmaWx0ZXIgdmFsdWUgaGlnaCBzaWduYWwgKi8KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2Rpb19wcml2YXRlICpwY2lfcHJpdiA9IE5VTEw7CS8qIGxpc3Qgb2YgYWxsb2NhdGVkIGNhcmRzICovCitzdGF0aWMgc3RydWN0IHBjaV9kaW9fcHJpdmF0ZSAqcGNpX3ByaXY7CS8qIGxpc3Qgb2YgYWxsb2NhdGVkIGNhcmRzICovCiAKICNkZWZpbmUgZGV2cHJpdiAoKHN0cnVjdCBwY2lfZGlvX3ByaXZhdGUgKilkZXYtPnByaXZhdGUpCiAjZGVmaW5lIHRoaXNfYm9hcmQgKChjb25zdCBzdHJ1Y3QgZGlvX2JvYXJkdHlwZSAqKWRldi0+Ym9hcmRfcHRyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2M2eGRpZ2lvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYzZ4ZGlnaW8uYwppbmRleCBlMGFjODI1Li4xMWNkYWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYzZ4ZGlnaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYzZ4ZGlnaW8uYwpAQCAtMzQzLDcgKzM0Myw3IEBACiAJCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7Ci0JcHJpbnRrKCJjNnhkaWdpb19wd21vX2luc25fcmVhZCAleFxuIiwgaW5zbi0+bik7CisJcHJpbnRrKEtFUk5fREVCVUcgImM2eGRpZ2lvX3B3bW9faW5zbl9yZWFkICV4XG4iLCBpbnNuLT5uKTsKIAlyZXR1cm4gaW5zbi0+bjsKIH0KIApAQCAtNDM5LDkgKzQzOSw5IEBACiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CiAKIAlpb2Jhc2UgPSBpdC0+b3B0aW9uc1swXTsKLQlwcmludGsoImNvbWVkaSVkOiBjNnhkaWdpbzogMHglMDRseFxuIiwgZGV2LT5taW5vciwgaW9iYXNlKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiY29tZWRpJWQ6IGM2eGRpZ2lvOiAweCUwNGx4XG4iLCBkZXYtPm1pbm9yLCBpb2Jhc2UpOwogCWlmICghcmVxdWVzdF9yZWdpb24oaW9iYXNlLCBDNlhESUdJT19TSVpFLCAiYzZ4ZGlnaW8iKSkgewotCQlwcmludGsoImNvbWVkaSVkOiBJL08gcG9ydCBjb25mbGljdFxuIiwgZGV2LT5taW5vcik7CisJCXByaW50ayhLRVJOX0VSUiAiY29tZWRpJWQ6IEkvTyBwb3J0IGNvbmZsaWN0XG4iLCBkZXYtPm1pbm9yKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCWRldi0+aW9iYXNlID0gaW9iYXNlOwpAQCAtNDU2LDkgKzQ1NiwxMCBAQAogCiAJaXJxID0gaXQtPm9wdGlvbnNbMV07CiAJaWYgKGlycSA+IDApCi0JCXByaW50aygiY29tZWRpJWQ6IGlycSA9ICV1IGlnbm9yZWRcbiIsIGRldi0+bWlub3IsIGlycSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJjb21lZGklZDogaXJxID0gJXUgaWdub3JlZFxuIiwKKwkJCQlkZXYtPm1pbm9yLCBpcnEpOwogCWVsc2UgaWYgKGlycSA9PSAwKQotCQlwcmludGsoImNvbWVkaSVkOiBubyBpcnFcbiIsIGRldi0+bWlub3IpOworCQlwcmludGsoS0VSTl9ERUJVRyAiY29tZWRpJWQ6IG5vIGlycVxuIiwgZGV2LT5taW5vcik7CiAKIAlzID0gZGV2LT5zdWJkZXZpY2VzICsgMDsKIAkvKiBwd20gb3V0cHV0IHN1YmRldmljZSAqLwpAQCAtNTAzLDcgKzUwNCw3IEBACiB7CiAJLyogYm9hcmRfaGFsdChkZXYpOyAgbWF5IG5vdCBuZWVkIHRoaXMgKi8KIAotCXByaW50aygiY29tZWRpJWQ6IGM2eGRpZ2lvOiByZW1vdmVcbiIsIGRldi0+bWlub3IpOworCXByaW50ayhLRVJOX0RFQlVHICJjb21lZGklZDogYzZ4ZGlnaW86IHJlbW92ZVxuIiwgZGV2LT5taW5vcik7CiAKIAlpZiAoZGV2LT5pb2Jhc2UpCiAJCXJlbGVhc2VfcmVnaW9uKGRldi0+aW9iYXNlLCBDNlhESUdJT19TSVpFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX2RhczE2X2NzLmMKaW5kZXggOGExYjhhNy4uZTE3MWM1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX2RhczE2X2NzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX2RhczE2X2NzLmMKQEAgLTM3MCw3ICszNzAsOCBAQAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCi0JLyogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KKwkvKiBzdGVwIDI6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSBhbmQKKwkgKiBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKIAkvKiBub3RlIHRoYXQgbXV0dWFsIGNvbXBhdGliaWxpdHkgaXMgbm90IGFuIGlzc3VlIGhlcmUgKi8KIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX1RJTUVSICYmCkBAIC01MDgsNyArNTA5LDcgQEAKIAkJZWxzZQogCQkJc3RhdHVzMSB8PSAweDAwMDg7CiAKLS8qIAkJcHJpbnRrKCIweCUwNHhcbiIsc3RhdHVzMSk7Ki8KKy8qCQlwcmludGsoIjB4JTA0eFxuIixzdGF0dXMxKTsqLwogCQlvdXR3KHN0YXR1czEsIGRldi0+aW9iYXNlICsgNCk7CiAJCXVkZWxheSgxKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8uYwppbmRleCAzMzMwYjNkLi42NDdjMjI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8uYwpAQCAtMjY4LDggKzI2OCw5IEBACiAJIH0KIH07CiAKLXN0YXRpYyBjb25zdCBpbnQgbmlfaXJxcGluW10gPQotICAgIHsgLTEsIC0xLCAtMSwgMCwgMSwgMiwgLTEsIDMsIC0xLCAtMSwgNCwgNSwgNiwgLTEsIC0xLCA3IH07CitzdGF0aWMgY29uc3QgaW50IG5pX2lycXBpbltdID0geworCS0xLCAtMSwgLTEsIDAsIDEsIDIsIC0xLCAzLCAtMSwgLTEsIDQsIDUsIDYsIC0xLCAtMSwgNworfTsKIAogI2RlZmluZSBpbnRlcnJ1cHRfcGluKGEpCShuaV9pcnFwaW5bKGEpXSkKIApAQCAtMjc5LDcgKzI4MCwxMCBAQAogCiBzdHJ1Y3QgbmlfcHJpdmF0ZSB7CiAJc3RydWN0IHBucF9kZXYgKmlzYXBucF9kZXY7Ci0gTklfUFJJVkFURV9DT01NT059OworCU5JX1BSSVZBVEVfQ09NTU9OCisKK307CisKICNkZWZpbmUgZGV2cHJpdiAoKHN0cnVjdCBuaV9wcml2YXRlICopZGV2LT5wcml2YXRlKQogCiAvKiBIb3cgd2UgYWNjZXNzIHJlZ2lzdGVycyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGMuYwppbmRleCA3NjExZGVmLi43MjFiMmJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGMuYwpAQCAtMjQ0LDcgKzI0NCw3IEBACiAjaWZkZWYgQ09ORklHX0lTQV9ETUFfQVBJCiBzdGF0aWMgdW5zaWduZWQgaW50IGxhYnBjX3N1Z2dlc3RfdHJhbnNmZXJfc2l6ZShzdHJ1Y3QgY29tZWRpX2NtZCBjbWQpOwogI2VuZGlmCi0jaWZkZWYgQ09ORklHX0NPTUVESV9QQ0kKKyNpZmRlZiBDT05GSUdfQ09NRURJX1BDSV9EUklWRVJTCiBzdGF0aWMgaW50IGxhYnBjX2ZpbmRfZGV2aWNlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGludCBidXMsIGludCBzbG90KTsKICNlbmRpZgogc3RhdGljIGludCBsYWJwY19kaW9fbWVtX2NhbGxiYWNrKGludCBkaXIsIGludCBwb3J0LCBpbnQgZGF0YSwKQEAgLTQ2MSw3ICs0NjEsNyBAQAogCSAuYWlfc2Nhbl91cCA9IDAsCiAJIC5tZW1vcnlfbWFwcGVkX2lvID0gMCwKIAkgfSwKLSNpZmRlZiBDT05GSUdfQ09NRURJX1BDSQorI2lmZGVmIENPTkZJR19DT01FRElfUENJX0RSSVZFUlMKIAl7CiAJIC5uYW1lID0gInBjaS0xMjAwIiwKIAkgLmRldmljZV9pZCA9IDB4MTYxLApAQCAtNTA1LDE0ICs1MDUsMTQgQEAKIAkub2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBsYWJwY19ib2FyZF9zdHJ1Y3QpLAogfTsKIAotI2lmZGVmIENPTkZJR19DT01FRElfUENJCisjaWZkZWYgQ09ORklHX0NPTUVESV9QQ0lfRFJJVkVSUwogc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGxhYnBjX3BjaV90YWJsZSkgPSB7CiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9OSSwgMHgxNjEpfSwKIAl7MH0KIH07CiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBsYWJwY19wY2lfdGFibGUpOwotI2VuZGlmIC8qIENPTkZJR19DT01FRElfUENJICovCisjZW5kaWYgLyogQ09ORklHX0NPTUVESV9QQ0lfRFJJVkVSUyAqLwogCiBzdGF0aWMgaW5saW5lIGludCBsYWJwY19jb3VudGVyX2xvYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyZXNzLApAQCAtNzIyLDcgKzcyMiw3IEBACiAJdW5zaWduZWQgbG9uZyBpb2Jhc2UgPSAwOwogCXVuc2lnbmVkIGludCBpcnEgPSAwOwogCXVuc2lnbmVkIGludCBkbWFfY2hhbiA9IDA7Ci0jaWZkZWYgQ09ORklHX0NPTUVESV9QQ0kKKyNpZmRlZiBDT05GSUdfQ09NRURJX1BDSV9EUklWRVJTCiAJaW50IHJldHZhbDsKICNlbmRpZgogCkBAIC03NDQsNyArNzQ0LDcgQEAKICNlbmRpZgogCQlicmVhazsKIAljYXNlIHBjaV9idXN0eXBlOgotI2lmZGVmIENPTkZJR19DT01FRElfUENJCisjaWZkZWYgQ09ORklHX0NPTUVESV9QQ0lfRFJJVkVSUwogCQlyZXR2YWwgPSBsYWJwY19maW5kX2RldmljZShkZXYsIGl0LT5vcHRpb25zWzBdLCBpdC0+b3B0aW9uc1sxXSk7CiAJCWlmIChyZXR2YWwgPCAwKQogCQkJcmV0dXJuIHJldHZhbDsKQEAgLTc3NCw3ICs3NzQsNyBAQAogfQogCiAvKiBhZGFwdGVkIGZyb20gbmlfcGNpbWlvIGZvciBmaW5kaW5nIG1pdGUgYmFzZWQgYm9hcmRzIChwYy0xMjAwKSAqLwotI2lmZGVmIENPTkZJR19DT01FRElfUENJCisjaWZkZWYgQ09ORklHX0NPTUVESV9QQ0lfRFJJVkVSUwogc3RhdGljIGludCBsYWJwY19maW5kX2RldmljZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBpbnQgYnVzLCBpbnQgc2xvdCkKIHsKIAlzdHJ1Y3QgbWl0ZV9zdHJ1Y3QgKm1pdGU7CkBAIC04MjIsNyArODIyLDcgQEAKIAkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CiAJaWYgKHRoaXNib2FyZC0+YnVzdHlwZSA9PSBpc2FfYnVzdHlwZSAmJiBkZXYtPmlvYmFzZSkKIAkJcmVsZWFzZV9yZWdpb24oZGV2LT5pb2Jhc2UsIExBQlBDX1NJWkUpOwotI2lmZGVmIENPTkZJR19DT01FRElfUENJCisjaWZkZWYgQ09ORklHX0NPTUVESV9QQ0lfRFJJVkVSUwogCWlmIChkZXZwcml2LT5taXRlKQogCQltaXRlX3Vuc2V0dXAoZGV2cHJpdi0+bWl0ZSk7CiAjZW5kaWYKQEAgLTIxMzcsNyArMjEzNyw3IEBACiAJZGV2cHJpdi0+d3JpdGVfYnl0ZShkZXZwcml2LT5jb21tYW5kNV9iaXRzLCBkZXYtPmlvYmFzZSArIENPTU1BTkQ1X1JFRyk7CiB9CiAKLSNpZmRlZiBDT05GSUdfQ09NRURJX1BDSQorI2lmZGVmIENPTkZJR19DT01FRElfUENJX0RSSVZFUlMKIHN0YXRpYyBpbnQgX19kZXZpbml0IGRyaXZlcl9sYWJwY19wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKmRldiwKIAkJCQkJICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpZGlvLmMKaW5kZXggOGRkM2EwMS4uMDQ1YTRjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaWRpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2lkaW8uYwpAQCAtNjg4LDcgKzY4OCw3IEBACiBzdGF0aWMgdm9pZCBkZWJ1Z19pbnQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAlpbnQgYSwgYjsKLQlzdGF0aWMgaW50IG5faW50ID0gMDsKKwlzdGF0aWMgaW50IG5faW50OwogCXN0cnVjdCB0aW1ldmFsIHR2OwogCiAJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtbWlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtbWlvLmMKaW5kZXggZjJlODhlNS4uM2FkMDRhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbW1pby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21taW8uYwpAQCAtMzcxLDcgKzM3MSw3IEBACiAJaW9iYXNlID0gaXQtPm9wdGlvbnNbMF07CiAJaXJxWzBdID0gaXQtPm9wdGlvbnNbMV07CiAKLQlwcmludGsoImNvbWVkaSVkOiAlczogaW86ICVseCAiLCBkZXYtPm1pbm9yLCBkcml2ZXIuZHJpdmVyX25hbWUsCisJcHJpbnRrKEtFUk5fSU5GTyAiY29tZWRpJWQ6ICVzOiBpbzogJWx4ICIsIGRldi0+bWlub3IsIGRyaXZlci5kcml2ZXJfbmFtZSwKIAkgICAgICAgaW9iYXNlKTsKIAogCWRldi0+aW9iYXNlID0gaW9iYXNlOwpAQCAtMzc5LDcgKzM3OSw3IEBACiAJaWYgKCFpb2Jhc2UgfHwgIXJlcXVlc3RfcmVnaW9uKGlvYmFzZSwKIAkJCQkgICAgICAgdGhpc2JvYXJkLT50b3RhbF9pb3NpemUsCiAJCQkJICAgICAgIGRyaXZlci5kcml2ZXJfbmFtZSkpIHsKLQkJcHJpbnRrKCJJL08gcG9ydCBjb25mbGljdFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiSS9PIHBvcnQgY29uZmxpY3RcbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CiAKQEAgLTM5NCw3ICszOTQsNyBAQAogICogY29udmVuaWVudCBtYWNybyBkZWZpbmVkIGluIGNvbWVkaWRldi5oLgogICovCiAJaWYgKGFsbG9jX3ByaXZhdGUoZGV2LCBzaXplb2Yoc3RydWN0IHBjbW1pb19wcml2YXRlKSkgPCAwKSB7Ci0JCXByaW50aygiY2Fubm90IGFsbG9jYXRlIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmVcbiIpOworCQlwcmludGsoS0VSTl9FUlIgImNhbm5vdCBhbGxvY2F0ZSBwcml2YXRlIGRhdGEgc3RydWN0dXJlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC00MTcsNyArNDE3LDcgQEAKIAkgICAga2NhbGxvYyhuX3N1YmRldnMsIHNpemVvZihzdHJ1Y3QgcGNtbWlvX3N1YmRldl9wcml2YXRlKSwKIAkJICAgIEdGUF9LRVJORUwpOwogCWlmICghZGV2cHJpdi0+c3ByaXZzKSB7Ci0JCXByaW50aygiY2Fubm90IGFsbG9jYXRlIHN1YmRldmljZSBwcml2YXRlIGRhdGEgc3RydWN0dXJlc1xuIik7CisJCXByaW50ayhLRVJOX0VSUiAiY2Fubm90IGFsbG9jYXRlIHN1YmRldmljZSBwcml2YXRlIGRhdGEgc3RydWN0dXJlc1xuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAkvKgpAQCAtNDI3LDcgKzQyNyw3IEBACiAJICogQWxsb2NhdGUgMSBBSSArIDEgQU8gKyAyIERJTyBzdWJkZXZzICgyNCBsaW5lcyBwZXIgRElPKQogCSAqLwogCWlmIChhbGxvY19zdWJkZXZpY2VzKGRldiwgbl9zdWJkZXZzKSA8IDApIHsKLQkJcHJpbnRrKCJjYW5ub3QgYWxsb2NhdGUgc3ViZGV2aWNlIGRhdGEgc3RydWN0dXJlc1xuIik7CisJCXByaW50ayhLRVJOX0VSUiAiY2Fubm90IGFsbG9jYXRlIHN1YmRldmljZSBkYXRhIHN0cnVjdHVyZXNcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTU1NywxNCArNTU3LDE0IEBACiAJCQkJICovCiAKIAlpZiAoaXJxWzBdKSB7Ci0JCXByaW50aygiaXJxOiAldSAiLCBpcnFbMF0pOworCQlwcmludGsoS0VSTl9ERUJVRyAiaXJxOiAldSAiLCBpcnFbMF0pOwogCQlpZiAodGhpc2JvYXJkLT5kaW9fbnVtX2FzaWNzID09IDIgJiYgaXJxWzFdKQotCQkJcHJpbnRrKCJzZWNvbmQgQVNJQyBpcnE6ICV1ICIsIGlycVsxXSk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAic2Vjb25kIEFTSUMgaXJxOiAldSAiLCBpcnFbMV0pOwogCX0gZWxzZSB7Ci0JCXByaW50aygiKElSUSBtb2RlIGRpc2FibGVkKSAiKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiKElSUSBtb2RlIGRpc2FibGVkKSAiKTsKIAl9CiAKLQlwcmludGsoImF0dGFjaGVkXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJhdHRhY2hlZFxuIik7CiAKIAlyZXR1cm4gMTsKIH0KQEAgLTU4MSw3ICs1ODEsNyBAQAogewogCWludCBpOwogCi0JcHJpbnRrKCJjb21lZGklZDogJXM6IHJlbW92ZVxuIiwgZGV2LT5taW5vciwgZHJpdmVyLmRyaXZlcl9uYW1lKTsKKwlwcmludGsoS0VSTl9JTkZPICJjb21lZGklZDogJXM6IHJlbW92ZVxuIiwgZGV2LT5taW5vciwgZHJpdmVyLmRyaXZlcl9uYW1lKTsKIAlpZiAoZGV2LT5pb2Jhc2UpCiAJCXJlbGVhc2VfcmVnaW9uKGRldi0+aW9iYXNlLCB0aGlzYm9hcmQtPnRvdGFsX2lvc2l6ZSk7CiAKQEAgLTYyMiw3ICs2MjIsNyBAQAogCiAjaWZkZWYgREFNTUlUX0lUU19CUk9LRU4KIAkvKiBERUJVRyAqLwotCXByaW50aygid3JpdGUgbWFzazogJTA4eCAgZGF0YTogJTA4eFxuIiwgZGF0YVswXSwgZGF0YVsxXSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIndyaXRlIG1hc2s6ICUwOHggIGRhdGE6ICUwOHhcbiIsIGRhdGFbMF0sIGRhdGFbMV0pOwogI2VuZGlmCiAKIAlzLT5zdGF0ZSA9IDA7CkBAIC02NDQsOSArNjQ0LDkgQEAKICNpZmRlZiBEQU1NSVRfSVRTX0JST0tFTgogCQkvKiBERUJVRyAqLwogCQlwcmludGsKLQkJICAgICgiYnl0ZSAlZCB3bWIgJTAyeCBkYiAlMDJ4IG9mZnNldCAlMDJkIGlvICUwNHgsIGRhdGFfaW4gJTAyeCAiLAotCQkgICAgIGJ5dGVfbm8sICh1bnNpZ25lZCl3cml0ZV9tYXNrX2J5dGUsICh1bnNpZ25lZClkYXRhX2J5dGUsCi0JCSAgICAgb2Zmc2V0LCBpb2FkZHIsICh1bnNpZ25lZClieXRlKTsKKwkJICAgIChLRVJOX0RFQlVHICJieXRlICVkIHdtYiAlMDJ4IGRiICUwMnggb2Zmc2V0ICUwMmQgaW8gJTA0eCwiCisJCSAgICAgIiBkYXRhX2luICUwMnggIiwgYnl0ZV9ubywgKHVuc2lnbmVkKXdyaXRlX21hc2tfYnl0ZSwKKwkJICAgICAodW5zaWduZWQpZGF0YV9ieXRlLCBvZmZzZXQsIGlvYWRkciwgKHVuc2lnbmVkKWJ5dGUpOwogI2VuZGlmCiAKIAkJaWYgKHdyaXRlX21hc2tfYnl0ZSkgewpAQCAtNjYzLDcgKzY2Myw3IEBACiAJCX0KICNpZmRlZiBEQU1NSVRfSVRTX0JST0tFTgogCQkvKiBERUJVRyAqLwotCQlwcmludGsoImRhdGFfb3V0X2J5dGUgJTAyeFxuIiwgKHVuc2lnbmVkKWJ5dGUpOworCQlwcmludGsoS0VSTl9ERUJVRyAiZGF0YV9vdXRfYnl0ZSAlMDJ4XG4iLCAodW5zaWduZWQpYnl0ZSk7CiAjZW5kaWYKIAkJLyogc2F2ZSB0aGUgZGlnaXRhbCBpbnB1dCBsaW5lcyBmb3IgdGhpcyBieXRlLi4gKi8KIAkJcy0+c3RhdGUgfD0gKCh1bnNpZ25lZCBpbnQpYnl0ZSkgPDwgb2Zmc2V0OwpAQCAtNjc0LDcgKzY3NCw3IEBACiAKICNpZmRlZiBEQU1NSVRfSVRTX0JST0tFTgogCS8qIERFQlVHICovCi0JcHJpbnRrKCJzLT5zdGF0ZSAlMDh4IGRhdGFfb3V0ICUwOHhcbiIsIHMtPnN0YXRlLCBkYXRhWzFdKTsKKwlwcmludGsoS0VSTl9ERUJVRyAicy0+c3RhdGUgJTA4eCBkYXRhX291dCAlMDh4XG4iLCBzLT5zdGF0ZSwgZGF0YVsxXSk7CiAjZW5kaWYKIAogCXJldHVybiAyOwpAQCAtODg2LDcgKzg4Niw3IEBACiAJCQkJICogd2l0aCBjb21tYW5kcy4uCiAJCQkJICovCiAJCQkJcHJpbnRrCi0JCQkJICAgICgiUENNTUlPIERFQlVHOiBnb3QgZWRnZSBkZXRlY3QgaW50ZXJydXB0ICVkIGFzaWMgJWQgd2hpY2hfY2hhbnM6ICUwNnhcbiIsCisJCQkJICAgIChLRVJOX0RFQlVHICJnb3QgZWRnZSBkZXRlY3QgaW50ZXJydXB0ICVkIGFzaWMgJWQgd2hpY2hfY2hhbnM6ICUwNnhcbiIsCiAJCQkJICAgICBpcnEsIGFzaWMsIHRyaWdnZXJlZCk7CiAJCQkJZm9yIChzID0gZGV2LT5zdWJkZXZpY2VzICsgMjsKIAkJCQkgICAgIHMgPCBkZXYtPnN1YmRldmljZXMgKyBkZXYtPm5fc3ViZGV2aWNlczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhzaWdtYS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eHNpZ21hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmZWE5YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhzaWdtYS5jCkBAIC0wLDAgKzEsMjg4MCBAQAorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjAuNSIKKyNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiQmVybmQgUG9yciwgQmVybmRQb3JyQGYycy5jb20iCisjZGVmaW5lIERSSVZFUl9ERVNDICJTdGlybGluZy9JVEwgVVNCLURVWCBTSUdNQSAtLSBCZXJuZC5Qb3JyQGYycy5jb20iCisvKgorICAgY29tZWRpL2RyaXZlcnMvdXNiZHV4LmMKKyAgIENvcHlyaWdodCAoQykgMjAxMSBCZXJuZCBQb3JyLCBCZXJuZC5Qb3JyQGYycy5jb20KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICovCisvKgorRHJpdmVyOiB1c2JkdXhzaWdtYQorRGVzY3JpcHRpb246IFVuaXZlcnNpdHkgb2YgU3RpcmxpbmcgVVNCIERBUSAmIElOQ0lURSBUZWNobm9sb2d5IExpbWl0ZWQKK0RldmljZXM6IFtJVExdIFVTQi1EVVggKHVzYmR1eHNpZ21hLm8pCitBdXRob3I6IEJlcm5kIFBvcnIgPEJlcm5kUG9yckBmMnMuY29tPgorVXBkYXRlZDogMjEgSnVsIDIwMTEKK1N0YXR1czogdGVzdGluZworKi8KKy8qCisgKiBJIG11c3QgZ2l2ZSBjcmVkaXQgaGVyZSB0byBDaHJpcyBCYXVnaGVyIHdobworICogd3JvdGUgdGhlIGRyaXZlciBmb3IgQVQtTUlPLTE2ZC4gSSB1c2VkIHNvbWUgcGFydHMgb2YgdGhpcworICogZHJpdmVyLiBJIGFsc28gbXVzdCBnaXZlIGNyZWRpdHMgdG8gRGF2aWQgQnJvd25lbGwKKyAqIHdobyBzdXBwb3J0ZWQgbWUgd2l0aCB0aGUgVVNCIGRldmVsb3BtZW50LgorICoKKyAqIE5vdGU6IHRoZSByYXcgZGF0YSBmcm9tIHRoZSBBL0QgY29udmVydGVyIGlzIDI0IGJpdCBiaWcgZW5kaWFuCisgKiBhbnl0aGluZyBlbHNlIGlzIGxpdHRsZSBlbmRpYW4gdG8vZnJvbSB0aGUgZHV4IGJvYXJkCisgKgorICoKKyAqIFJldmlzaW9uIGhpc3Rvcnk6CisgKiAgIDAuMTogaW5pdGFsIHZlcnNpb24KKyAqICAgMC4yOiBhbGwgYmFzaWMgZnVuY3Rpb25zIGltcGxlbWVudGVkLCBkaWdpdGFsIEkvTyBvbmx5IGZvciBvbmUgcG9ydAorICogICAwLjM6IHByb3BlciB2ZW5kb3IgSUQgYW5kIGRyaXZlciBuYW1lCisgKiAgIDAuNDogZml4ZWQgRC9BIHZvbHRhZ2UgcmFuZ2UKKyAqICAgMC41OiB2YXJpb3VzIGJ1ZyBmaXhlcywgaGVhbHRoIGNoZWNrIGF0IHN0YXJ0dXAKKyAqLworCisvKiBnZW5lcmF0ZXMgbG9hZHMgb2YgZGVidWcgaW5mbyAqLworLyogI2RlZmluZSBOT0lTWV9EVVhfREVCVUdCVUcgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlICJjb21lZGlfZmMuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworI2RlZmluZSBCT0FSRE5BTUUgInVzYmR1eHNpZ21hIgorCisvKiB0aW1lb3V0IGZvciB0aGUgVVNCLXRyYW5zZmVyIGluIG1zKi8KKyNkZWZpbmUgQlVMS19USU1FT1VUIDEwMDAKKworLyogY29uc3RhbnRzIGZvciAiZmlybXdhcmUiIHVwbG9hZCBhbmQgZG93bmxvYWQgKi8KKyNkZWZpbmUgVVNCRFVYU1VCX0ZJUk1XQVJFIDB4QTAKKyNkZWZpbmUgVkVORE9SX0RJUl9JTiAgMHhDMAorI2RlZmluZSBWRU5ET1JfRElSX09VVCAweDQwCisKKy8qIGludGVybmFsIGFkZHJlc3NlcyBvZiB0aGUgODA1MSBwcm9jZXNzb3IgKi8KKyNkZWZpbmUgVVNCRFVYU1VCX0NQVUNTIDB4RTYwMAorCisvKgorICogdGhlIG1pbm9yIGRldmljZSBudW1iZXIsIG1ham9yIGlzIDE4MCBvbmx5IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgYW5kIHRvCisgKiB1cGxvYWQgc3BlY2lhbCBmaXJtd2FyZSAocHJvZ3JhbW1pbmcgdGhlIGVlcHJvbSBldGMpIHdoaWNoIGlzIG5vdAorICogY29tcGF0aWJsZSB3aXRoIHRoZSBjb21lZGkgZnJhbXdvcmsKKyAqLworI2RlZmluZSBVU0JEVVhTVUJfTUlOT1IgMzIKKworLyogbWF4IGxlbmdodGggb2YgdGhlIHRyYW5zZmVyLWJ1ZmZlciBmb3Igc29mdHdhcmUgdXBsb2FkICovCisjZGVmaW5lIFRCX0xFTiAweDIwMDAKKworLyogSW5wdXQgZW5kcG9pbnQgbnVtYmVyOiBJU08vSVJRICovCisjZGVmaW5lIElTT0lORVAgICAgICAgICAgIDYKKworLyogT3V0cHV0IGVuZHBvaW50IG51bWJlcjogSVNPL0lSUSAqLworI2RlZmluZSBJU09PVVRFUCAgICAgICAgICAyCisKKy8qIFRoaXMgRVAgc2VuZHMgRFVYIGNvbW1hbmRzIHRvIFVTQkRVWCAqLworI2RlZmluZSBDT01NQU5EX09VVF9FUCAgICAgMQorCisvKiBUaGlzIEVQIHJlY2VpdmVzIHRoZSBEVVggY29tbWFuZHMgZnJvbSBVU0JEVVggKi8KKyNkZWZpbmUgQ09NTUFORF9JTl9FUCAgICAgICAgOAorCisvKiBPdXRwdXQgZW5kcG9pbnQgZm9yIFBXTSAqLworI2RlZmluZSBQV01fRVAgICAgICAgICA0CisKKy8qIDMwMEh6IG1heCBmcmVxdSB1bmRlciBQV00gKi8KKyNkZWZpbmUgTUlOX1BXTV9QRVJJT0QgICgobG9uZykoMUU5LzMwMCkpCisKKy8qIERlZmF1bHQgUFdNIGZyZXF1ZW5jeSAqLworI2RlZmluZSBQV01fREVGQVVMVF9QRVJJT0QgKChsb25nKSgxRTkvMTAwKSkKKworLyogTnVtYmVyIG9mIGNoYW5uZWxzICgxNiBBRCBhbmQgb2Zmc2V0KSovCisjZGVmaW5lIE5VTUNIQU5ORUxTIDE2CisKKy8qIFNpemUgb2Ygb25lIEEvRCB2YWx1ZSAqLworI2RlZmluZSBTSVpFQURJTiAgICAgICAgICAoKHNpemVvZihpbnQzMl90KSkpCisKKy8qCisgKiBTaXplIG9mIHRoZSBhc3luYyBpbnB1dC1idWZmZXIgSU4gQllURVMsIHRoZSBESU8gc3RhdGUgaXMgdHJhbnNtaXR0ZWQKKyAqIGFzIHRoZSBmaXJzdCBieXRlLgorICovCisjZGVmaW5lIFNJWkVJTkJVRiAgICAgICAgICgoKE5VTUNIQU5ORUxTKzEpKlNJWkVBRElOKSkKKworLyogMTYgYnl0ZXMuICovCisjZGVmaW5lIFNJWkVJTlNOQlVGICAgICAgIDE2CisKKy8qIE51bWJlciBvZiBEQSBjaGFubmVscyAqLworI2RlZmluZSBOVU1PVVRDSEFOTkVMUyAgICA4CisKKy8qIHNpemUgb2Ygb25lIHZhbHVlIGZvciB0aGUgRC9BIGNvbnZlcnRlcjogY2hhbm5lbCBhbmQgdmFsdWUgKi8KKyNkZWZpbmUgU0laRURBT1VUICAgICAgICAgICgoc2l6ZW9mKHVpbnQ4X3QpK3NpemVvZihpbnQxNl90KSkpCisKKy8qCisgKiBTaXplIG9mIHRoZSBvdXRwdXQtYnVmZmVyIGluIGJ5dGVzCisgKiBBY3R1YWxseSBvbmx5IHRoZSBmaXJzdCA0IHRyaXBsZXRzIGFyZSB1c2VkIGJ1dCBmb3IgdGhlCisgKiBoaWdoIHNwZWVkIG1vZGUgd2UgbmVlZCB0byBwYWQgaXQgdG8gOCAobWljcm9mcmFtZXMpLgorICovCisjZGVmaW5lIFNJWkVPVVRCVUYgICAgICAgICAoKDgqU0laRURBT1VUKSkKKworLyoKKyAqIFNpemUgb2YgdGhlIGJ1ZmZlciBmb3IgdGhlIGR1eCBjb21tYW5kczoganVzdCBub3cgbWF4IHNpemUgaXMgZGV0ZXJtaW5lZAorICogYnkgdGhlIGFuYWxvZ3VlIG91dCArIGNvbW1hbmQgYnl0ZSArIHBhbmljIGJ5dGVzLi4uCisgKi8KKyNkZWZpbmUgU0laRU9GRFVYQlVGRkVSICAgICgoOCpTSVpFREFPVVQrMikpCisKKy8qIE51bWJlciBvZiBpbi1VUkJzIHdoaWNoIHJlY2VpdmUgdGhlIGRhdGE6IG1pbj0yICovCisjZGVmaW5lIE5VTU9GSU5CVUZGRVJTRlVMTCAgICAgNQorCisvKiBOdW1iZXIgb2Ygb3V0LVVSQnMgd2hpY2ggc2VuZCB0aGUgZGF0YTogbWluPTIgKi8KKyNkZWZpbmUgTlVNT0ZPVVRCVUZGRVJTRlVMTCAgICA1CisKKy8qIE51bWJlciBvZiBpbi1VUkJzIHdoaWNoIHJlY2VpdmUgdGhlIGRhdGE6IG1pbj01ICovCisvKiBtdXN0IGhhdmUgbW9yZSBidWZmZXJzIGR1ZSB0byBidWdneSBVU0IgY3RyICovCisjZGVmaW5lIE5VTU9GSU5CVUZGRVJTSElHSCAgICAgMTAKKworLyogTnVtYmVyIG9mIG91dC1VUkJzIHdoaWNoIHNlbmQgdGhlIGRhdGE6IG1pbj01ICovCisvKiBtdXN0IGhhdmUgbW9yZSBidWZmZXJzIGR1ZSB0byBidWdneSBVU0IgY3RyICovCisjZGVmaW5lIE5VTU9GT1VUQlVGRkVSU0hJR0ggICAgMTAKKworLyogVG90YWwgbnVtYmVyIG9mIHVzYmR1eCBkZXZpY2VzICovCisjZGVmaW5lIE5VTVVTQkRVWCAgICAgICAgICAgICAxNgorCisvKiBBbmFsb2d1ZSBpbiBzdWJkZXZpY2UgKi8KKyNkZWZpbmUgU1VCREVWX0FEICAgICAgICAgICAgIDAKKworLyogQW5hbG9ndWUgb3V0IHN1YmRldmljZSAqLworI2RlZmluZSBTVUJERVZfREEgICAgICAgICAgICAgMQorCisvKiBEaWdpdGFsIEkvTyAqLworI2RlZmluZSBTVUJERVZfRElPICAgICAgICAgICAgMgorCisvKiB0aW1lciBha2EgcHdtIG91dHB1dCAqLworI2RlZmluZSBTVUJERVZfUFdNICAgICAgICAgICAgMworCisvKiBudW1iZXIgb2YgcmV0cmllcyB0byBnZXQgdGhlIHJpZ2h0IGR1eCBjb21tYW5kICovCisjZGVmaW5lIFJFVFJJRVMgMTAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogY29tZWRpIGNvbnN0YW50cyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIHJhbmdlX3VzYmR1eF9haV9yYW5nZSA9IHsgMSwgeworCQkJCQkJCQlCSVBfUkFOR0UKKwkJCQkJCQkJKDIuNjUpCisJCQkJCQkJCX0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSByYW5nZV91c2JkdXhfYW9fcmFuZ2UgPSB7IDEsIHsKKwkJCQkJCQkJVU5JX1JBTkdFCisJCQkJCQkJCSgyLjUpLAorCQkJCQkJCSAgICAgICB9Cit9OworCisvKgorICogcHJpdmF0ZSBzdHJ1Y3R1cmUgb2Ygb25lIHN1YmRldmljZQorICovCisKKy8qCisgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgd2hpY2ggaG9sZHMgYWxsIHRoZSBkYXRhIG9mCisgKiB0aGlzIGRyaXZlciBvbmUgc3ViIGRldmljZSBqdXN0IG5vdzogQS9ECisgKi8KK3N0cnVjdCB1c2JkdXhzdWIgeworCS8qIGF0dGFjaGVkPyAqLworCWludCBhdHRhY2hlZDsKKwkvKiBpcyBpdCBhc3NvY2lhdGVkIHdpdGggYSBzdWJkZXZpY2U/ICovCisJaW50IHByb2JlZDsKKwkvKiBwb2ludGVyIHRvIHRoZSB1c2ItZGV2aWNlICovCisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldjsKKwkvKiBhY3R1YWwgbnVtYmVyIG9mIGluLWJ1ZmZlcnMgKi8KKwlpbnQgbnVtT2ZJbkJ1ZmZlcnM7CisJLyogYWN0dWFsIG51bWJlciBvZiBvdXQtYnVmZmVycyAqLworCWludCBudW1PZk91dEJ1ZmZlcnM7CisJLyogSVNPLXRyYW5zZmVyIGhhbmRsaW5nOiBidWZmZXJzICovCisJc3RydWN0IHVyYiAqKnVyYkluOworCXN0cnVjdCB1cmIgKip1cmJPdXQ7CisJLyogcHdtLXRyYW5zZmVyIGhhbmRsaW5nICovCisJc3RydWN0IHVyYiAqdXJiUHdtOworCS8qIFBXTSBwZXJpb2QgKi8KKwl1bnNpZ25lZCBpbnQgcHdtUGVyaW9kOworCS8qIFBXTSBpbnRlcm5hbCBkZWxheSBmb3IgdGhlIEdQSUYgaW4gdGhlIEZYMiAqLworCXVpbnQ4X3QgcHdtRGVsYXk7CisJLyogc2l6ZSBvZiB0aGUgUFdNIGJ1ZmZlciB3aGljaCBob2xkcyB0aGUgYml0IHBhdHRlcm4gKi8KKwlpbnQgc2l6ZVB3bUJ1ZjsKKwkvKiBpbnB1dCBidWZmZXIgZm9yIHRoZSBJU08tdHJhbnNmZXIgKi8KKwlpbnQzMl90ICppbkJ1ZmZlcjsKKwkvKiBpbnB1dCBidWZmZXIgZm9yIHNpbmdsZSBpbnNuICovCisJaW50OF90ICppbnNuQnVmZmVyOworCS8qIG91dHB1dCBidWZmZXIgZm9yIHNpbmdsZSBEQSBvdXRwdXRzICovCisJaW50MTZfdCAqb3V0QnVmZmVyOworCS8qIGludGVyZmFjZSBudW1iZXIgKi8KKwlpbnQgaWZudW07CisJLyogaW50ZXJmYWNlIHN0cnVjdHVyZSBpbiAyLjYgKi8KKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlOworCS8qIGNvbWVkaSBkZXZpY2UgZm9yIHRoZSBpbnRlcnJ1cHQgY29udGV4dCAqLworCXN0cnVjdCBjb21lZGlfZGV2aWNlICpjb21lZGlkZXY7CisJLyogaXMgaXQgVVNCX1NQRUVEX0hJR0ggb3Igbm90PyAqLworCXNob3J0IGludCBoaWdoX3NwZWVkOworCS8qIGFzeW5jaHJvbm91cyBjb21tYW5kIGlzIHJ1bm5pbmcgKi8KKwlzaG9ydCBpbnQgYWlfY21kX3J1bm5pbmc7CisJc2hvcnQgaW50IGFvX2NtZF9ydW5uaW5nOworCS8qIHB3bSBpcyBydW5uaW5nICovCisJc2hvcnQgaW50IHB3bV9jbWRfcnVubmluZzsKKwkvKiBjb250aW5vdXMgYXF1aXNpdGlvbiAqLworCXNob3J0IGludCBhaV9jb250aW5vdXM7CisJc2hvcnQgaW50IGFvX2NvbnRpbm91czsKKwkvKiBudW1iZXIgb2Ygc2FtcGxlcyB0byBhY3F1aXJlICovCisJaW50IGFpX3NhbXBsZV9jb3VudDsKKwlpbnQgYW9fc2FtcGxlX2NvdW50OworCS8qIHRpbWUgYmV0d2VlbiBzYW1wbGVzIGluIHVuaXRzIG9mIHRoZSB0aW1lciAqLworCXVuc2lnbmVkIGludCBhaV90aW1lcjsKKwl1bnNpZ25lZCBpbnQgYW9fdGltZXI7CisJLyogY291bnRlciBiZXR3ZWVuIGFxdWlzaXRpb25zICovCisJdW5zaWduZWQgaW50IGFpX2NvdW50ZXI7CisJdW5zaWduZWQgaW50IGFvX2NvdW50ZXI7CisJLyogaW50ZXJ2YWwgaW4gZnJhbWVzL3VmcmFtZXMgKi8KKwl1bnNpZ25lZCBpbnQgYWlfaW50ZXJ2YWw7CisJLyogRC9BIGNvbW1hbmRzICovCisJdWludDhfdCAqZGFjX2NvbW1hbmRzOworCS8qIGNvbW1hbmRzICovCisJdWludDhfdCAqZHV4X2NvbW1hbmRzOworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworfTsKKworLyoKKyAqIFRoZSBwb2ludGVyIHRvIHRoZSBwcml2YXRlIHVzYi1kYXRhIG9mIHRoZSBkcml2ZXIgaXMgYWxzbyB0aGUgcHJpdmF0ZSBkYXRhCisgKiBmb3IgdGhlIGNvbWVkaS1kZXZpY2UuICBUaGlzIGhhcyB0byBiZSBnbG9iYWwgYXMgdGhlIHVzYiBzdWJzeXN0ZW0gbmVlZHMKKyAqIGdsb2JhbCB2YXJpYWJsZXMuIFRoZSBvdGhlciByZWFzb24gaXMgdGhhdCB0aGlzIHN0cnVjdHVyZSBtdXN0IGJlIHRoZXJlCisgKiBfYmVmb3JlXyBhbnkgY29tZWRpIGNvbW1hbmQgaXMgaXNzdWVkLiBUaGUgdXNiIHN1YnN5c3RlbSBtdXN0IGJlIGluaXRpYWxpc2VkCisgKiBiZWZvcmUgY29tZWRpIGNhbiBhY2Nlc3MgaXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiZHV4c3ViIHVzYmR1eHN1YltOVU1VU0JEVVhdOworCitzdGF0aWMgREVGSU5FX1NFTUFQSE9SRShzdGFydF9zdG9wX3NlbSk7CisKKy8qCisgKiBTdG9wcyB0aGUgZGF0YSBhY3F1aXNpb24KKyAqIEl0IHNob3VsZCBiZSBzYWZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIGFueSBjb250ZXh0CisgKi8KK3N0YXRpYyBpbnQgdXNiZHV4c3ViX3VubGlua19JblVSQnMoc3RydWN0IHVzYmR1eHN1YiAqdXNiZHV4c3ViX3RtcCkKK3sKKwlpbnQgaSA9IDA7CisJaW50IGVyciA9IDA7CisKKwlpZiAodXNiZHV4c3ViX3RtcCAmJiB1c2JkdXhzdWJfdG1wLT51cmJJbikgeworCQlmb3IgKGkgPSAwOyBpIDwgdXNiZHV4c3ViX3RtcC0+bnVtT2ZJbkJ1ZmZlcnM7IGkrKykgeworCQkJaWYgKHVzYmR1eHN1Yl90bXAtPnVyYkluW2ldKSB7CisJCQkJLyogV2Ugd2FpdCBoZXJlIHVudGlsIGFsbCB0cmFuc2ZlcnMgaGF2ZSBiZWVuCisJCQkJICogY2FuY2VsbGVkLiAqLworCQkJCXVzYl9raWxsX3VyYih1c2JkdXhzdWJfdG1wLT51cmJJbltpXSk7CisJCQl9CisJCQlkZXZfZGJnKCZ1c2JkdXhzdWJfdG1wLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpOiB1c2JkdXg6IHVubGlua2VkIEluVVJCICVkLCBlcnI9JWRcbiIsCisJCQkJaSwgZXJyKTsKKwkJfQorCX0KKwlyZXR1cm4gZXJyOworfQorCisvKgorICogVGhpcyB3aWxsIHN0b3AgYSBydW5uaW5nIGFjcXVpc2l0aW9uIG9wZXJhdGlvbgorICogSXMgY2FsbGVkIGZyb20gd2l0aGluIHRoaXMgZHJpdmVyIGZyb20gYm90aCB0aGUKKyAqIGludGVycnVwdCBjb250ZXh0IGFuZCBmcm9tIGNvbWVkaQorICovCitzdGF0aWMgaW50IHVzYmR1eF9haV9zdG9wKHN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViLCBpbnQgZG9fdW5saW5rKQoreworCWludCByZXQgPSAwOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikgeworCQlwcl9lcnIoImNvbWVkaT86IHVzYmR1eF9haV9zdG9wOiB0aGlzX3VzYmR1eHN1Yj1OVUxMIVxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGk6IHVzYmR1eF9haV9zdG9wXG4iKTsKKworCWlmIChkb191bmxpbmspIHsKKwkJLyogc3RvcCBhcXVpc3Rpb24gKi8KKwkJcmV0ID0gdXNiZHV4c3ViX3VubGlua19JblVSQnModGhpc191c2JkdXhzdWIpOworCX0KKworCXRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZyA9IDA7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhpcyB3aWxsIGNhbmNlbCBhIHJ1bm5pbmcgYWNxdWlzaXRpb24gb3BlcmF0aW9uLgorICogVGhpcyBpcyBjYWxsZWQgYnkgY29tZWRpIGJ1dCBuZXZlciBmcm9tIGluc2lkZSB0aGUgZHJpdmVyLgorICovCitzdGF0aWMgaW50IHVzYmR1eF9haV9jYW5jZWwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YjsKKwlpbnQgcmVzID0gMDsKKworCS8qIGZvcmNlIHVubGluayBvZiBhbGwgdXJicyAqLworCXRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpOiB1c2JkdXhfYWlfY2FuY2VsXG4iKTsKKworCS8qIHByZXZlbnQgb3RoZXIgQ1BVcyBmcm9tIHN1Ym1pdHRpbmcgbmV3IGNvbW1hbmRzIGp1c3Qgbm93ICovCisJZG93bigmdGhpc191c2JkdXhzdWItPnNlbSk7CisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJLyogdW5saW5rIG9ubHkgaWYgdGhlIHVyYiByZWFsbHkgaGFzIGJlZW4gc3VibWl0dGVkICovCisJcmVzID0gdXNiZHV4X2FpX3N0b3AodGhpc191c2JkdXhzdWIsIHRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZyk7CisJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCXJldHVybiByZXM7Cit9CisKKy8qIGFuYWxvZ3VlIElOIC0gaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSAqLworc3RhdGljIHZvaWQgdXNiZHV4c3ViX2FpX0lzb2NJcnEoc3RydWN0IHVyYiAqdXJiKQoreworCWludCBpLCBlcnIsIG47CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWI7CisJc3RydWN0IGNvbWVkaV9kZXZpY2UgKnRoaXNfY29tZWRpZGV2OworCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOworCWludDMyX3QgdjsKKwl1bnNpZ25lZCBpbnQgZGlvX3N0YXRlOworCisJLyogdGhlIGNvbnRleHQgdmFyaWFibGUgcG9pbnRzIHRvIHRoZSBjb21lZGkgZGV2aWNlICovCisJdGhpc19jb21lZGlkZXYgPSB1cmItPmNvbnRleHQ7CisJLyogdGhlIHByaXZhdGUgc3RydWN0dXJlIG9mIHRoZSBzdWJkZXZpY2UgaXMgc3RydWN0IHVzYmR1eHN1YiAqLworCXRoaXNfdXNiZHV4c3ViID0gdGhpc19jb21lZGlkZXYtPnByaXZhdGU7CisJLyogc3ViZGV2aWNlIHdoaWNoIGlzIHRoZSBBRCBjb252ZXJ0ZXIgKi8KKwlzID0gdGhpc19jb21lZGlkZXYtPnN1YmRldmljZXMgKyBTVUJERVZfQUQ7CisKKwkvKiBmaXJzdCB3ZSB0ZXN0IGlmIHNvbWV0aGluZyB1bnVzdWFsIGhhcyBqdXN0IGhhcHBlbmVkICovCisJc3dpdGNoICh1cmItPnN0YXR1cykgeworCWNhc2UgMDoKKwkJLyogY29weSB0aGUgcmVzdWx0IGluIHRoZSB0cmFuc2ZlciBidWZmZXIgKi8KKwkJbWVtY3B5KHRoaXNfdXNiZHV4c3ViLT5pbkJ1ZmZlciwKKwkJICAgICAgIHVyYi0+dHJhbnNmZXJfYnVmZmVyLCBTSVpFSU5CVUYpOworCQlicmVhazsKKwljYXNlIC1FSUxTRVE6CisJCS8qIGVycm9yIGluIHRoZSBJU09jaHJvbm91cyBkYXRhICovCisJCS8qIHdlIGRvbid0IGNvcHkgdGhlIGRhdGEgaW50byB0aGUgdHJhbnNmZXIgYnVmZmVyICovCisJCS8qIGFuZCByZWN5Y2xlIHRoZSBsYXN0IGRhdGEgYnl0ZSAqLworCQlkZXZfZGJnKCZ1cmItPmRldi0+ZGV2LAorCQkJImNvbWVkaSVkOiB1c2JkdXg6IENSQyBlcnJvciBpbiBJU08gSU4gc3RyZWFtLlxuIiwKKwkJCXRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYtPm1pbm9yKTsKKworCQlicmVhazsKKworCWNhc2UgLUVDT05OUkVTRVQ6CisJY2FzZSAtRU5PRU5UOgorCWNhc2UgLUVTSFVURE9XTjoKKwljYXNlIC1FQ09OTkFCT1JURUQ6CisJCS8qIGhhcHBlbnMgYWZ0ZXIgYW4gdW5saW5rIGNvbW1hbmQgKi8KKwkJaWYgKHRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZykgeworCQkJLyogd2UgYXJlIHN0aWxsIHJ1bm5pbmcgYSBjb21tYW5kICovCisJCQkvKiB0ZWxsIHRoaXMgY29tZWRpICovCisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKKwkJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJCS8qIHN0b3AgdGhlIHRyYW5zZmVyIHcvbyB1bmxpbmsgKi8KKwkJCXVzYmR1eF9haV9zdG9wKHRoaXNfdXNiZHV4c3ViLCAwKTsKKwkJfQorCQlyZXR1cm47CisKKwlkZWZhdWx0OgorCQkvKiBhIHJlYWwgZXJyb3Igb24gdGhlIGJ1cyAqLworCQkvKiBwYXNzIGVycm9yIHRvIGNvbWVkaSBpZiB3ZSBhcmUgcmVhbGx5IHJ1bm5pbmcgYSBjb21tYW5kICovCisJCWlmICh0aGlzX3VzYmR1eHN1Yi0+YWlfY21kX3J1bm5pbmcpIHsKKwkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCisJCQkJIk5vbi16ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQgaW4gYWkgaW50ciAiCisJCQkJImNvbnRleHQ6ICVkXG4iLCB1cmItPnN0YXR1cyk7CisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKKwkJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJCS8qIGRvbid0IGRvIGFuIHVubGluayBoZXJlICovCisJCQl1c2JkdXhfYWlfc3RvcCh0aGlzX3VzYmR1eHN1YiwgMCk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qCisJICogYXQgdGhpcyBwb2ludCB3ZSBhcmUgcmVhc29uYWJseSBzdXJlIHRoYXQgbm90aGluZyBkb2RneSBoYXMgaGFwcGVuZWQKKwkgKiBhcmUgd2UgcnVubmluZyBhIGNvbW1hbmQ/CisJICovCisJaWYgKHVubGlrZWx5KCghKHRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZykpKSkgeworCQkvKgorCQkgKiBub3QgcnVubmluZyBhIGNvbW1hbmQsIGRvIG5vdCBjb250aW51ZSBleGVjdXRpb24gaWYgbm8KKwkJICogYXN5bmNocm9ub3VzIGNvbW1hbmQgaXMgcnVubmluZyBpbiBwYXJ0aWN1bGFyIG5vdCByZXN1Ym1pdAorCQkgKi8KKwkJcmV0dXJuOworCX0KKworCXVyYi0+ZGV2ID0gdGhpc191c2JkdXhzdWItPnVzYmRldjsKKworCS8qIHJlc3VibWl0IHRoZSB1cmIgKi8KKwllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOworCWlmICh1bmxpa2VseShlcnIgPCAwKSkgeworCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAorCQkJImNvbWVkaV86IHVyYiByZXN1Ym1pdCBmYWlsZWQgaW4gaW50LWNvbnRleHQhIgorCQkJImVycj0lZFxuIiwKKwkJCWVycik7CisJCWlmIChlcnIgPT0gLUVMMk5TWU5DKQorCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwKKwkJCQkiYnVnZ3kgVVNCIGhvc3QgY29udHJvbGxlciBvciBidWcgaW4gSVJRICIKKwkJCQkiaGFuZGxlciFcbiIpOworCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VSUk9SOworCQljb21lZGlfZXZlbnQodGhpc191c2JkdXhzdWItPmNvbWVkaWRldiwgcyk7CisJCS8qIGRvbid0IGRvIGFuIHVubGluayBoZXJlICovCisJCXVzYmR1eF9haV9zdG9wKHRoaXNfdXNiZHV4c3ViLCAwKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGdldCB0aGUgc3RhdGUgb2YgdGhlIGRpbyBwaW5zIHRvIGFsbG93IGV4dGVybmFsIHRyaWdnZXIgKi8KKwlkaW9fc3RhdGUgPSBiZTMyX3RvX2NwdSh0aGlzX3VzYmR1eHN1Yi0+aW5CdWZmZXJbMF0pOworCisJdGhpc191c2JkdXhzdWItPmFpX2NvdW50ZXItLTsKKwlpZiAobGlrZWx5KHRoaXNfdXNiZHV4c3ViLT5haV9jb3VudGVyID4gMCkpCisJCXJldHVybjsKKworCS8qIHRpbWVyIHplcm8sIHRyYW5zZmVyIG1lYXN1cmVtZW50cyB0byBjb21lZGkgKi8KKwl0aGlzX3VzYmR1eHN1Yi0+YWlfY291bnRlciA9IHRoaXNfdXNiZHV4c3ViLT5haV90aW1lcjsKKworCS8qIHRlc3QsIGlmIHdlIHRyYW5zbWl0IG9ubHkgYSBmaXhlZCBudW1iZXIgb2Ygc2FtcGxlcyAqLworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5haV9jb250aW5vdXMpKSB7CisJCS8qIG5vdCBjb250aW5vdXMsIGZpeGVkIG51bWJlciBvZiBzYW1wbGVzICovCisJCXRoaXNfdXNiZHV4c3ViLT5haV9zYW1wbGVfY291bnQtLTsKKwkJLyogYWxsIHNhbXBsZXMgcmVjZWl2ZWQ/ICovCisJCWlmICh0aGlzX3VzYmR1eHN1Yi0+YWlfc2FtcGxlX2NvdW50IDwgMCkgeworCQkJLyogcHJldmVudCBhIHJlc3VibWl0IG5leHQgdGltZSAqLworCQkJdXNiZHV4X2FpX3N0b3AodGhpc191c2JkdXhzdWIsIDApOworCQkJLyogc2F5IGNvbWVkaSB0aGF0IHRoZSBhY3F1aXN0aW9uIGlzIG92ZXIgKi8KKwkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKwkJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkvKiBnZXQgdGhlIGRhdGEgZnJvbSB0aGUgVVNCIGJ1cyBhbmQgaGFuZCBpdCBvdmVyIHRvIGNvbWVkaSAqLworCW4gPSBzLT5hc3luYy0+Y21kLmNoYW5saXN0X2xlbjsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCS8qIHRyYW5zZmVyIGRhdGEsIG5vdGUgZmlyc3QgYnl0ZSBpcyB0aGUgRElPIHN0YXRlICovCisJCXYgPSBiZTMyX3RvX2NwdSh0aGlzX3VzYmR1eHN1Yi0+aW5CdWZmZXJbaSsxXSk7CisJCS8qIHN0cmlwIHN0YXR1cyBieXRlICovCisJCXYgPSB2ICYgMHgwMGZmZmZmZjsKKwkJLyogY29udmVydCB0byB1bnNpZ25lZCAqLworCQl2ID0gdiBeIDB4MDA4MDAwMDA7CisJCS8qIHdyaXRlIHRoZSBieXRlIHRvIHRoZSBidWZmZXIgKi8KKwkJZXJyID0gY2ZjX3dyaXRlX2FycmF5X3RvX2J1ZmZlcihzLCAmdiwgc2l6ZW9mKHVpbnQzMl90KSk7CisJCWlmICh1bmxpa2VseShlcnIgPT0gMCkpIHsKKwkJCS8qIGJ1ZmZlciBvdmVyZmxvdyAqLworCQkJdXNiZHV4X2FpX3N0b3AodGhpc191c2JkdXhzdWIsIDApOworCQkJcmV0dXJuOworCQl9CisJfQorCS8qIHRlbGwgY29tZWRpIHRoYXQgZGF0YSBpcyB0aGVyZSAqLworCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0JMT0NLIHwgQ09NRURJX0NCX0VPUzsKKwljb21lZGlfZXZlbnQodGhpc191c2JkdXhzdWItPmNvbWVkaWRldiwgcyk7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4c3ViX3VubGlua19PdXRVUkJzKHN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1Yl90bXApCit7CisJaW50IGkgPSAwOworCWludCBlcnIgPSAwOworCisJaWYgKHVzYmR1eHN1Yl90bXAgJiYgdXNiZHV4c3ViX3RtcC0+dXJiT3V0KSB7CisJCWZvciAoaSA9IDA7IGkgPCB1c2JkdXhzdWJfdG1wLT5udW1PZk91dEJ1ZmZlcnM7IGkrKykgeworCQkJaWYgKHVzYmR1eHN1Yl90bXAtPnVyYk91dFtpXSkKKwkJCQl1c2Jfa2lsbF91cmIodXNiZHV4c3ViX3RtcC0+dXJiT3V0W2ldKTsKKworCQkJZGV2X2RiZygmdXNiZHV4c3ViX3RtcC0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaTogdXNiZHV4OiB1bmxpbmtlZCBPdXRVUkIgJWQ6IHJlcz0lZFxuIiwKKwkJCQlpLCBlcnIpOworCQl9CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qIFRoaXMgd2lsbCBjYW5jZWwgYSBydW5uaW5nIGFjcXVpc2l0aW9uIG9wZXJhdGlvbgorICogaW4gYW55IGNvbnRleHQuCisgKi8KK3N0YXRpYyBpbnQgdXNiZHV4X2FvX3N0b3Aoc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIsIGludCBkb191bmxpbmspCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGk6IHVzYmR1eF9hb19jYW5jZWxcbiIpOworCisJaWYgKGRvX3VubGluaykKKwkJcmV0ID0gdXNiZHV4c3ViX3VubGlua19PdXRVUkJzKHRoaXNfdXNiZHV4c3ViKTsKKworCXRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZyA9IDA7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBmb3JjZSB1bmxpbmssIGlzIGNhbGxlZCBieSBjb21lZGkgKi8KK3N0YXRpYyBpbnQgdXNiZHV4X2FvX2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQoreworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCWludCByZXMgPSAwOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBwcmV2ZW50IG90aGVyIENQVXMgZnJvbSBzdWJtaXR0aW5nIGEgY29tbWFuZCBqdXN0IG5vdyAqLworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCS8qIHVubGluayBvbmx5IGlmIGl0IGlzIHJlYWxseSBydW5uaW5nICovCisJcmVzID0gdXNiZHV4X2FvX3N0b3AodGhpc191c2JkdXhzdWIsIHRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZyk7CisJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIHVzYmR1eHN1Yl9hb19Jc29jSXJxKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlpbnQgaSwgcmV0OworCXVpbnQ4X3QgKmRhdGFwOworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViOworCXN0cnVjdCBjb21lZGlfZGV2aWNlICp0aGlzX2NvbWVkaWRldjsKKwlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKKworCS8qIHRoZSBjb250ZXh0IHZhcmlhYmxlIHBvaW50cyB0byB0aGUgc3ViZGV2aWNlICovCisJdGhpc19jb21lZGlkZXYgPSB1cmItPmNvbnRleHQ7CisJLyogdGhlIHByaXZhdGUgc3RydWN0dXJlIG9mIHRoZSBzdWJkZXZpY2UgaXMgc3RydWN0IHVzYmR1eHN1YiAqLworCXRoaXNfdXNiZHV4c3ViID0gdGhpc19jb21lZGlkZXYtPnByaXZhdGU7CisKKwlzID0gdGhpc19jb21lZGlkZXYtPnN1YmRldmljZXMgKyBTVUJERVZfREE7CisKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAwOgorCQkvKiBzdWNjZXNzICovCisJCWJyZWFrOworCisJY2FzZSAtRUNPTk5SRVNFVDoKKwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCWNhc2UgLUVDT05OQUJPUlRFRDoKKwkJLyogYWZ0ZXIgYW4gdW5saW5rIGNvbW1hbmQsIHVucGx1ZywgLi4uIGV0YyAqLworCQkvKiBubyB1bmxpbmsgbmVlZGVkIGhlcmUuIEFscmVhZHkgc2h1dHRpbmcgZG93bi4gKi8KKwkJaWYgKHRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZykgeworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQkJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYsIHMpOworCQkJdXNiZHV4X2FvX3N0b3AodGhpc191c2JkdXhzdWIsIDApOworCQl9CisJCXJldHVybjsKKworCWRlZmF1bHQ6CisJCS8qIGEgcmVhbCBlcnJvciAqLworCQlpZiAodGhpc191c2JkdXhzdWItPmFvX2NtZF9ydW5uaW5nKSB7CisJCQlkZXZfZXJyKCZ1cmItPmRldi0+ZGV2LAorCQkJCSJjb21lZGlfOiBOb24temVybyB1cmIgc3RhdHVzIHJlY2VpdmVkIGluIGFvICIKKwkJCQkiaW50ciBjb250ZXh0OiAlZFxuIiwgdXJiLT5zdGF0dXMpOworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1I7CisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCQljb21lZGlfZXZlbnQodGhpc191c2JkdXhzdWItPmNvbWVkaWRldiwgcyk7CisJCQkvKiB3ZSBkbyBhbiB1bmxpbmsgaWYgd2UgYXJlIGluIHRoZSBoaWdoIHNwZWVkIG1vZGUgKi8KKwkJCXVzYmR1eF9hb19zdG9wKHRoaXNfdXNiZHV4c3ViLCAwKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyogYXJlIHdlIGFjdHVhbGx5IHJ1bm5pbmc/ICovCisJaWYgKCEodGhpc191c2JkdXhzdWItPmFvX2NtZF9ydW5uaW5nKSkKKwkJcmV0dXJuOworCisJLyogbm9ybWFsIG9wZXJhdGlvbjogZXhlY3V0aW5nIGEgY29tbWFuZCBpbiB0aGlzIHN1YmRldmljZSAqLworCXRoaXNfdXNiZHV4c3ViLT5hb19jb3VudGVyLS07CisJaWYgKChpbnQpdGhpc191c2JkdXhzdWItPmFvX2NvdW50ZXIgPD0gMCkgeworCQkvKiB0aW1lciB6ZXJvICovCisJCXRoaXNfdXNiZHV4c3ViLT5hb19jb3VudGVyID0gdGhpc191c2JkdXhzdWItPmFvX3RpbWVyOworCisJCS8qIGhhbmRsZSBub24gY29udGlub3VzIGFxdWlzaXRpb24gKi8KKwkJaWYgKCEodGhpc191c2JkdXhzdWItPmFvX2NvbnRpbm91cykpIHsKKwkJCS8qIGZpeGVkIG51bWJlciBvZiBzYW1wbGVzICovCisJCQl0aGlzX3VzYmR1eHN1Yi0+YW9fc2FtcGxlX2NvdW50LS07CisJCQlpZiAodGhpc191c2JkdXhzdWItPmFvX3NhbXBsZV9jb3VudCA8IDApIHsKKwkJCQkvKiBhbGwgc2FtcGxlcyB0cmFuc21pdHRlZCAqLworCQkJCXVzYmR1eF9hb19zdG9wKHRoaXNfdXNiZHV4c3ViLCAwKTsKKwkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FT0E7CisJCQkJY29tZWRpX2V2ZW50KHRoaXNfdXNiZHV4c3ViLT5jb21lZGlkZXYsIHMpOworCQkJCS8qIG5vIHJlc3VibWl0IG9mIHRoZSB1cmIgKi8KKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJLyogdHJhbnNtaXQgZGF0YSB0byB0aGUgVVNCIGJ1cyAqLworCQkoKHVpbnQ4X3QgKikgKHVyYi0+dHJhbnNmZXJfYnVmZmVyKSlbMF0gPQorCQkgICAgcy0+YXN5bmMtPmNtZC5jaGFubGlzdF9sZW47CisJCWZvciAoaSA9IDA7IGkgPCBzLT5hc3luYy0+Y21kLmNoYW5saXN0X2xlbjsgaSsrKSB7CisJCQlzaG9ydCB0ZW1wOworCQkJaWYgKGkgPj0gTlVNT1VUQ0hBTk5FTFMpCisJCQkJYnJlYWs7CisKKwkJCS8qIHBvaW50ZXIgdG8gdGhlIERBICovCisJCQlkYXRhcCA9CisJCQkgICAgKCYoKCh1aW50OF90ICopIHVyYi0+dHJhbnNmZXJfYnVmZmVyKVtpICogMiArIDFdKSk7CisJCQkvKiBnZXQgdGhlIGRhdGEgZnJvbSBjb21lZGkgKi8KKwkJCXJldCA9IGNvbWVkaV9idWZfZ2V0KHMtPmFzeW5jLCAmdGVtcCk7CisJCQlkYXRhcFswXSA9IHRlbXA7CisJCQlkYXRhcFsxXSA9IHRoaXNfdXNiZHV4c3ViLT5kYWNfY29tbWFuZHNbaV07CisJCQkvKiBwcmludGsoImRhdGFbMF09JXgsIGRhdGFbMV09JXgsIGRhdGFbMl09JXhcbiIsICovCisJCQkvKiBkYXRhcFswXSxkYXRhcFsxXSxkYXRhcFsyXSk7ICovCisJCQlpZiAocmV0IDwgMCkgeworCQkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCisJCQkJCSJjb21lZGk6IGJ1ZmZlciB1bmRlcmZsb3dcbiIpOworCQkJCXMtPmFzeW5jLT5ldmVudHMgfD0gQ09NRURJX0NCX0VPQTsKKwkJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9PVkVSRkxPVzsKKwkJCX0KKwkJCS8qIHRyYW5zbWl0IGRhdGEgdG8gY29tZWRpICovCisJCQlzLT5hc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9CTE9DSzsKKwkJCWNvbWVkaV9ldmVudCh0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LCBzKTsKKwkJfQorCX0KKwl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBTSVpFT1VUQlVGOworCXVyYi0+ZGV2ID0gdGhpc191c2JkdXhzdWItPnVzYmRldjsKKwl1cmItPnN0YXR1cyA9IDA7CisJaWYgKHRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZykgeworCQlpZiAodGhpc191c2JkdXhzdWItPmhpZ2hfc3BlZWQpIHsKKwkJCS8qIHVmcmFtZXMgKi8KKwkJCXVyYi0+aW50ZXJ2YWwgPSA4OworCQl9IGVsc2UgeworCQkJLyogZnJhbWVzICovCisJCQl1cmItPmludGVydmFsID0gMTsKKwkJfQorCQl1cmItPm51bWJlcl9vZl9wYWNrZXRzID0gMTsKKwkJdXJiLT5pc29fZnJhbWVfZGVzY1swXS5vZmZzZXQgPSAwOworCQl1cmItPmlzb19mcmFtZV9kZXNjWzBdLmxlbmd0aCA9IFNJWkVPVVRCVUY7CisJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0uc3RhdHVzID0gMDsKKwkJcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCisJCQkJImNvbWVkaV86IGFvIHVyYiByZXN1Ym0gZmFpbGVkIGluIGludC1jb250LiAiCisJCQkJInJldD0lZCIsIHJldCk7CisJCQlpZiAocmV0ID09IEVMMk5TWU5DKQorCQkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsCisJCQkJCSJidWdneSBVU0IgaG9zdCBjb250cm9sbGVyIG9yIGJ1ZyBpbiAiCisJCQkJCSJJUlEgaGFuZGxpbmchXG4iKTsKKworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRU9BOworCQkJcy0+YXN5bmMtPmV2ZW50cyB8PSBDT01FRElfQ0JfRVJST1I7CisJCQljb21lZGlfZXZlbnQodGhpc191c2JkdXhzdWItPmNvbWVkaWRldiwgcyk7CisJCQkvKiBkb24ndCBkbyBhbiB1bmxpbmsgaGVyZSAqLworCQkJdXNiZHV4X2FvX3N0b3AodGhpc191c2JkdXhzdWIsIDApOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHVzYmR1eHN1Yl9zdGFydChzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWIpCit7CisJaW50IGVycmNvZGUgPSAwOworCXVpbnQ4X3QgbG9jYWxfdHJhbnNmZXJfYnVmZmVyWzE2XTsKKworCS8qIDdmOTIgdG8gemVybyAqLworCWxvY2FsX3RyYW5zZmVyX2J1ZmZlclswXSA9IDA7CisJZXJyY29kZSA9IHVzYl9jb250cm9sX21zZyh1c2JkdXhzdWItPnVzYmRldiwKKwkJCQkgIC8qIGNyZWF0ZSBhIHBpcGUgZm9yIGEgY29udHJvbCB0cmFuc2ZlciAqLworCQkJCSAgdXNiX3NuZGN0cmxwaXBlKHVzYmR1eHN1Yi0+dXNiZGV2LCAwKSwKKwkJCQkgIC8qIGJSZXF1ZXN0LCAiRmlybXdhcmUiICovCisJCQkJICBVU0JEVVhTVUJfRklSTVdBUkUsCisJCQkJICAvKiBibVJlcXVlc3RUeXBlICovCisJCQkJICBWRU5ET1JfRElSX09VVCwKKwkJCQkgIC8qIFZhbHVlICovCisJCQkJICBVU0JEVVhTVUJfQ1BVQ1MsCisJCQkJICAvKiBJbmRleCAqLworCQkJCSAgMHgwMDAwLAorCQkJCSAgLyogYWRkcmVzcyBvZiB0aGUgdHJhbnNmZXIgYnVmZmVyICovCisJCQkJICBsb2NhbF90cmFuc2Zlcl9idWZmZXIsCisJCQkJICAvKiBMZW5ndGggKi8KKwkJCQkgIDEsCisJCQkJICAvKiBUaW1lb3V0ICovCisJCQkJICBCVUxLX1RJTUVPVVQpOworCWlmIChlcnJjb2RlIDwgMCkgeworCQlkZXZfZXJyKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaV86IGNvbnRyb2wgbXNnIGZhaWxlZCAoc3RhcnQpXG4iKTsKKwkJcmV0dXJuIGVycmNvZGU7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eHN1Yl9zdG9wKHN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1YikKK3sKKwlpbnQgZXJyY29kZSA9IDA7CisKKwl1aW50OF90IGxvY2FsX3RyYW5zZmVyX2J1ZmZlclsxNl07CisKKwkvKiA3ZjkyIHRvIG9uZSAqLworCWxvY2FsX3RyYW5zZmVyX2J1ZmZlclswXSA9IDE7CisJZXJyY29kZSA9IHVzYl9jb250cm9sX21zZyh1c2JkdXhzdWItPnVzYmRldiwKKwkJCQkgIHVzYl9zbmRjdHJscGlwZSh1c2JkdXhzdWItPnVzYmRldiwgMCksCisJCQkJICAvKiBiUmVxdWVzdCwgIkZpcm13YXJlIiAqLworCQkJCSAgVVNCRFVYU1VCX0ZJUk1XQVJFLAorCQkJCSAgLyogYm1SZXF1ZXN0VHlwZSAqLworCQkJCSAgVkVORE9SX0RJUl9PVVQsCisJCQkJICAvKiBWYWx1ZSAqLworCQkJCSAgVVNCRFVYU1VCX0NQVUNTLAorCQkJCSAgLyogSW5kZXggKi8KKwkJCQkgIDB4MDAwMCwgbG9jYWxfdHJhbnNmZXJfYnVmZmVyLAorCQkJCSAgLyogTGVuZ3RoICovCisJCQkJICAxLAorCQkJCSAgLyogVGltZW91dCAqLworCQkJCSAgQlVMS19USU1FT1VUKTsKKwlpZiAoZXJyY29kZSA8IDApIHsKKwkJZGV2X2VycigmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGlfOiBjb250cm9sIG1zZyBmYWlsZWQgKHN0b3ApXG4iKTsKKwkJcmV0dXJuIGVycmNvZGU7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eHN1Yl91cGxvYWQoc3RydWN0IHVzYmR1eHN1YiAqdXNiZHV4c3ViLAorCQkJICAgIHVpbnQ4X3QgKmxvY2FsX3RyYW5zZmVyX2J1ZmZlciwKKwkJCSAgICB1bnNpZ25lZCBpbnQgc3RhcnRBZGRyLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWludCBlcnJjb2RlOworCisJZXJyY29kZSA9IHVzYl9jb250cm9sX21zZyh1c2JkdXhzdWItPnVzYmRldiwKKwkJCQkgIHVzYl9zbmRjdHJscGlwZSh1c2JkdXhzdWItPnVzYmRldiwgMCksCisJCQkJICAvKiBicmVxdWVzdCwgZmlybXdhcmUgKi8KKwkJCQkgIFVTQkRVWFNVQl9GSVJNV0FSRSwKKwkJCQkgIC8qIGJtUmVxdWVzdFR5cGUgKi8KKwkJCQkgIFZFTkRPUl9ESVJfT1VULAorCQkJCSAgLyogdmFsdWUgKi8KKwkJCQkgIHN0YXJ0QWRkciwKKwkJCQkgIC8qIGluZGV4ICovCisJCQkJICAweDAwMDAsCisJCQkJICAvKiBvdXIgbG9jYWwgc2FmZSBidWZmZXIgKi8KKwkJCQkgIGxvY2FsX3RyYW5zZmVyX2J1ZmZlciwKKwkJCQkgIC8qIGxlbmd0aCAqLworCQkJCSAgbGVuLAorCQkJCSAgLyogdGltZW91dCAqLworCQkJCSAgQlVMS19USU1FT1VUKTsKKwlkZXZfZGJnKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpXzogcmVzdWx0PSVkXG4iLCBlcnJjb2RlKTsKKwlpZiAoZXJyY29kZSA8IDApIHsKKwkJZGV2X2VycigmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGlfOiB1cGxvYWQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIGVycmNvZGU7CisJfQorCXJldHVybiAwOworfQorCisvKiB0aGUgRlgyTFAgaGFzIHR3aWNlIGFzIG11Y2ggYXMgdGhlIHN0YW5kYXJkIEZYMiAqLworI2RlZmluZSBGSVJNV0FSRV9NQVhfTEVOIDB4NDAwMAorCitzdGF0aWMgaW50IGZpcm13YXJlVXBsb2FkKHN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1YiwKKwkJCSAgY29uc3QgdTggKmZpcm13YXJlQmluYXJ5LCBpbnQgc2l6ZUZpcm13YXJlKQoreworCWludCByZXQ7CisJdWludDhfdCAqZndCdWY7CisKKwlpZiAoIWZpcm13YXJlQmluYXJ5KQorCQlyZXR1cm4gMDsKKworCWlmIChzaXplRmlybXdhcmUgPiBGSVJNV0FSRV9NQVhfTEVOKSB7CisJCWRldl9lcnIoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkidXNiZHV4c2lnbWEgZmlybXdhcmUgYmluYXJ5IGl0IHRvbyBsYXJnZSBmb3IgRlgyLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIHdlIGdlbmVyYXRlIGEgbG9jYWwgYnVmZmVyIGZvciB0aGUgZmlybXdhcmUgKi8KKwlmd0J1ZiA9IGttZW1kdXAoZmlybXdhcmVCaW5hcnksIHNpemVGaXJtd2FyZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmd0J1ZikgeworCQlkZXZfZXJyKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaV86IG1lbSBhbGxvYyBmb3IgZmlybXdhcmUgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0ID0gdXNiZHV4c3ViX3N0b3AodXNiZHV4c3ViKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaV86IGNhbiBub3Qgc3RvcCBmaXJtd2FyZVxuIik7CisJCWtmcmVlKGZ3QnVmKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSB1c2JkdXhzdWJfdXBsb2FkKHVzYmR1eHN1YiwgZndCdWYsIDAsIHNpemVGaXJtd2FyZSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGlfOiBmaXJtd2FyZSB1cGxvYWQgZmFpbGVkXG4iKTsKKwkJa2ZyZWUoZndCdWYpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSB1c2JkdXhzdWJfc3RhcnQodXNiZHV4c3ViKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaV86IGNhbiBub3Qgc3RhcnQgZmlybXdhcmVcbiIpOworCQlrZnJlZShmd0J1Zik7CisJCXJldHVybiByZXQ7CisJfQorCWtmcmVlKGZ3QnVmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JkdXhzdWJfc3VibWl0X0luVVJCcyhzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWIpCit7CisJaW50IGksIGVyckZsYWc7CisKKwlpZiAoIXVzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBTdWJtaXQgYWxsIFVSQnMgYW5kIHN0YXJ0IHRoZSB0cmFuc2ZlciBvbiB0aGUgYnVzICovCisJZm9yIChpID0gMDsgaSA8IHVzYmR1eHN1Yi0+bnVtT2ZJbkJ1ZmZlcnM7IGkrKykgeworCQkvKiBpbiBjYXNlIG9mIGEgcmVzdWJtaXNzaW9uIGFmdGVyIGFuIHVubGluay4uLiAqLworCQl1c2JkdXhzdWItPnVyYkluW2ldLT5pbnRlcnZhbCA9IHVzYmR1eHN1Yi0+YWlfaW50ZXJ2YWw7CisJCXVzYmR1eHN1Yi0+dXJiSW5baV0tPmNvbnRleHQgPSB1c2JkdXhzdWItPmNvbWVkaWRldjsKKwkJdXNiZHV4c3ViLT51cmJJbltpXS0+ZGV2ID0gdXNiZHV4c3ViLT51c2JkZXY7CisJCXVzYmR1eHN1Yi0+dXJiSW5baV0tPnN0YXR1cyA9IDA7CisJCXVzYmR1eHN1Yi0+dXJiSW5baV0tPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCQlkZXZfZGJnKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiBzdWJtaXR0aW5nIGluLXVyYlslZF06ICVwLCVwIGludHY9JWRcbiIsCisJCQl1c2JkdXhzdWItPmNvbWVkaWRldi0+bWlub3IsIGksCisJCQkodXNiZHV4c3ViLT51cmJJbltpXS0+Y29udGV4dCksCisJCQkodXNiZHV4c3ViLT51cmJJbltpXS0+ZGV2KSwKKwkJCSh1c2JkdXhzdWItPnVyYkluW2ldLT5pbnRlcnZhbCkpOworCQllcnJGbGFnID0gdXNiX3N1Ym1pdF91cmIodXNiZHV4c3ViLT51cmJJbltpXSwgR0ZQX0FUT01JQyk7CisJCWlmIChlcnJGbGFnKSB7CisJCQlkZXZfZXJyKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJCSJjb21lZGlfOiBhaTogdXNiX3N1Ym1pdF91cmIoJWQpIGVycm9yICVkXG4iLAorCQkJCWksIGVyckZsYWcpOworCQkJcmV0dXJuIGVyckZsYWc7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4c3ViX3N1Ym1pdF9PdXRVUkJzKHN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1YikKK3sKKwlpbnQgaSwgZXJyRmxhZzsKKworCWlmICghdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWZvciAoaSA9IDA7IGkgPCB1c2JkdXhzdWItPm51bU9mT3V0QnVmZmVyczsgaSsrKSB7CisJCWRldl9kYmcoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpXzogc3VibWl0dGluZyBvdXQtdXJiWyVkXVxuIiwgaSk7CisJCS8qIGluIGNhc2Ugb2YgYSByZXN1Ym1pc3Npb24gYWZ0ZXIgYW4gdW5saW5rLi4uICovCisJCXVzYmR1eHN1Yi0+dXJiT3V0W2ldLT5jb250ZXh0ID0gdXNiZHV4c3ViLT5jb21lZGlkZXY7CisJCXVzYmR1eHN1Yi0+dXJiT3V0W2ldLT5kZXYgPSB1c2JkdXhzdWItPnVzYmRldjsKKwkJdXNiZHV4c3ViLT51cmJPdXRbaV0tPnN0YXR1cyA9IDA7CisJCXVzYmR1eHN1Yi0+dXJiT3V0W2ldLT50cmFuc2Zlcl9mbGFncyA9IFVSQl9JU09fQVNBUDsKKwkJZXJyRmxhZyA9IHVzYl9zdWJtaXRfdXJiKHVzYmR1eHN1Yi0+dXJiT3V0W2ldLCBHRlBfQVRPTUlDKTsKKwkJaWYgKGVyckZsYWcpIHsKKwkJCWRldl9lcnIoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaV86IGFvOiB1c2Jfc3VibWl0X3VyYiglZCkgZXJyb3IgJWRcbiIsCisJCQkJaSwgZXJyRmxhZyk7CisJCQlyZXR1cm4gZXJyRmxhZzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGFuVG9JbnRlcnZhbChpbnQgbkNoYW5uZWxzKQoreworCWlmIChuQ2hhbm5lbHMgPD0gMikKKwkJLyogNGtIeiAqLworCQlyZXR1cm4gMjsKKwlpZiAobkNoYW5uZWxzIDw9IDgpCisJCS8qIDJrSHogKi8KKwkJcmV0dXJuIDQ7CisJLyogMWtIeiAqLworCXJldHVybiA4OworfQorCitzdGF0aWMgaW50IHVzYmR1eF9haV9jbWR0ZXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQoreworCWludCBlcnIgPSAwLCB0bXAsIGk7CisJdW5zaWduZWQgaW50IHRtcFRpbWVyOworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpCisJCXJldHVybiAtRU5PREVWOworCisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkiY29tZWRpJWQ6IHVzYmR1eF9haV9jbWR0ZXN0XG4iLCBkZXYtPm1pbm9yKTsKKworCS8qIG1ha2Ugc3VyZSB0cmlnZ2VycyBhcmUgdmFsaWQgKi8KKwkvKiBPbmx5IGltbWVkaWF0ZSB0cmlnZ2VycyBhcmUgYWxsb3dlZCAqLworCXRtcCA9IGNtZC0+c3RhcnRfc3JjOworCWNtZC0+c3RhcnRfc3JjICY9IFRSSUdfTk9XIHwgVFJJR19JTlQ7CisJaWYgKCFjbWQtPnN0YXJ0X3NyYyB8fCB0bXAgIT0gY21kLT5zdGFydF9zcmMpCisJCWVycisrOworCisJLyogdHJpZ2dlciBzaG91bGQgaGFwcGVuIHRpbWVkICovCisJdG1wID0gY21kLT5zY2FuX2JlZ2luX3NyYzsKKwkvKiBzdGFydCBhIG5ldyBfc2Nhbl8gd2l0aCBhIHRpbWVyICovCisJY21kLT5zY2FuX2JlZ2luX3NyYyAmPSBUUklHX1RJTUVSOworCWlmICghY21kLT5zY2FuX2JlZ2luX3NyYyB8fCB0bXAgIT0gY21kLT5zY2FuX2JlZ2luX3NyYykKKwkJZXJyKys7CisKKwkvKiBzY2FubmluZyBpcyBjb250aW5vdXMgKi8KKwl0bXAgPSBjbWQtPmNvbnZlcnRfc3JjOworCWNtZC0+Y29udmVydF9zcmMgJj0gVFJJR19OT1c7CisJaWYgKCFjbWQtPmNvbnZlcnRfc3JjIHx8IHRtcCAhPSBjbWQtPmNvbnZlcnRfc3JjKQorCQllcnIrKzsKKworCS8qIGlzc3VlIGEgdHJpZ2dlciB3aGVuIHNjYW4gaXMgZmluaXNoZWQgYW5kIHN0YXJ0IGEgbmV3IHNjYW4gKi8KKwl0bXAgPSBjbWQtPnNjYW5fZW5kX3NyYzsKKwljbWQtPnNjYW5fZW5kX3NyYyAmPSBUUklHX0NPVU5UOworCWlmICghY21kLT5zY2FuX2VuZF9zcmMgfHwgdG1wICE9IGNtZC0+c2Nhbl9lbmRfc3JjKQorCQllcnIrKzsKKworCS8qIHRyaWdnZXIgYXQgdGhlIGVuZCBvZiBjb3VudCBldmVudHMgb3Igbm90LCBzdG9wIGNvbmRpdGlvbiBvciBub3QgKi8KKwl0bXAgPSBjbWQtPnN0b3Bfc3JjOworCWNtZC0+c3RvcF9zcmMgJj0gVFJJR19DT1VOVCB8IFRSSUdfTk9ORTsKKwlpZiAoIWNtZC0+c3RvcF9zcmMgfHwgdG1wICE9IGNtZC0+c3RvcF9zcmMpCisJCWVycisrOworCisJaWYgKGVycikKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIHN0ZXAgMjogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlIGFuZCBtdXR1YWxseSBjb21wYXRpYmxlCisJICogbm90ZSB0aGF0IG11dHVhbCBjb21wYXRpYmlsaXR5IGlzIG5vdCBhbiBpc3N1ZSBoZXJlCisJICovCisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19GT0xMT1cgJiYKKwkgICAgY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0VYVCAmJgorCSAgICBjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfVElNRVIpCisJCWVycisrOworCWlmIChjbWQtPnN0b3Bfc3JjICE9IFRSSUdfQ09VTlQgJiYgY21kLT5zdG9wX3NyYyAhPSBUUklHX05PTkUpCisJCWVycisrOworCisJaWYgKGVycikKKwkJcmV0dXJuIDI7CisKKwkvKiBzdGVwIDM6IG1ha2Ugc3VyZSBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSBjb21wYXRpYmxlICovCisJaWYgKGNtZC0+c3RhcnRfYXJnICE9IDApIHsKKwkJY21kLT5zdGFydF9hcmcgPSAwOworCQllcnIrKzsKKwl9CisKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVykgeworCQkvKiBpbnRlcm5hbCB0cmlnZ2VyICovCisJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnICE9IDApIHsKKwkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSAwOworCQkJZXJyKys7CisJCX0KKwl9CisKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWlmICh0aGlzX3VzYmR1eHN1Yi0+aGlnaF9zcGVlZCkgeworCQkJLyoKKwkJCSAqIEluIGhpZ2ggc3BlZWQgbW9kZSBtaWNyb2ZyYW1lcyBhcmUgcG9zc2libGUuCisJCQkgKiBIb3dldmVyLCBkdXJpbmcgb25lIG1pY3JvZnJhbWUgd2UgY2FuIHJvdWdobHkKKwkJCSAqIHNhbXBsZSB0d28gY2hhbm5lbHMuIFRodXMsIHRoZSBtb3JlIGNoYW5uZWxzCisJCQkgKiBhcmUgaW4gdGhlIGNoYW5uZWwgbGlzdCB0aGUgbW9yZSB0aW1lIHdlIG5lZWQuCisJCQkgKi8KKwkJCWkgPSBjaGFuVG9JbnRlcnZhbChjbWQtPmNoYW5saXN0X2xlbik7CisJCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA8ICgxMDAwMDAwIC8gOCAqIGkpKSB7CisJCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IDEwMDAwMDAgLyA4ICogaTsKKwkJCQllcnIrKzsKKwkJCX0KKwkJCS8qIG5vdyBjYWxjIHRoZSByZWFsIHNhbXBsaW5nIHJhdGUgd2l0aCBhbGwgdGhlCisJCQkgKiByb3VuZGluZyBlcnJvcnMgKi8KKwkJCXRtcFRpbWVyID0KKwkJCSAgICAoKHVuc2lnbmVkIGludCkoY21kLT5zY2FuX2JlZ2luX2FyZyAvIDEyNTAwMCkpICoKKwkJCSAgICAxMjUwMDA7CisJCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyAhPSB0bXBUaW1lcikgeworCQkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSB0bXBUaW1lcjsKKwkJCQllcnIrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIGZ1bGwgc3BlZWQgKi8KKwkJCS8qIDFrSHogc2NhbnMgZXZlcnkgVVNCIGZyYW1lICovCisJCQlpZiAoY21kLT5zY2FuX2JlZ2luX2FyZyA8IDEwMDAwMDApIHsKKwkJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gMTAwMDAwMDsKKwkJCQllcnIrKzsKKwkJCX0KKwkJCS8qCisJCQkgKiBjYWxjIHRoZSByZWFsIHNhbXBsaW5nIHJhdGUgd2l0aCB0aGUgcm91bmRpbmcgZXJyb3JzCisJCQkgKi8KKwkJCXRtcFRpbWVyID0gKCh1bnNpZ25lZCBpbnQpKGNtZC0+c2Nhbl9iZWdpbl9hcmcgLworCQkJCQkJICAgMTAwMDAwMCkpICogMTAwMDAwMDsKKwkJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnICE9IHRtcFRpbWVyKSB7CisJCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IHRtcFRpbWVyOworCQkJCWVycisrOworCQkJfQorCQl9CisJfQorCS8qIHRoZSBzYW1lIGFyZ3VtZW50ICovCisJaWYgKGNtZC0+c2Nhbl9lbmRfYXJnICE9IGNtZC0+Y2hhbmxpc3RfbGVuKSB7CisJCWNtZC0+c2Nhbl9lbmRfYXJnID0gY21kLT5jaGFubGlzdF9sZW47CisJCWVycisrOworCX0KKworCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKKwkJLyogYW55IGNvdW50IGlzIGFsbG93ZWQgKi8KKwl9IGVsc2UgeworCQkvKiBUUklHX05PTkUgKi8KKwkJaWYgKGNtZC0+c3RvcF9hcmcgIT0gMCkgeworCQkJY21kLT5zdG9wX2FyZyA9IDA7CisJCQllcnIrKzsKKwkJfQorCX0KKworCWlmIChlcnIpCisJCXJldHVybiAzOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBjcmVhdGVzIHRoZSBBREMgY29tbWFuZCBmb3IgdGhlIE1BWDEyNzEKKyAqIHJhbmdlIGlzIHRoZSByYW5nZSB2YWx1ZSBmcm9tIGNvbWVkaQorICovCitzdGF0aWMgdm9pZCBjcmVhdGVfYWRjX2NvbW1hbmQodW5zaWduZWQgaW50IGNoYW4sCisJCQkgICAgICAgdWludDhfdCAqbXV4c2cwLAorCQkJICAgICAgIHVpbnQ4X3QgKm11eHNnMSkKK3sKKwlpZiAoY2hhbiA8IDgpCisJCSgqbXV4c2cwKSA9ICgqbXV4c2cwKSB8ICgxIDw8IGNoYW4pOworCWVsc2UgaWYgKGNoYW4gPCAxNikKKwkJKCptdXhzZzEpID0gKCptdXhzZzEpIHwgKDEgPDwgKGNoYW4tOCkpOworfQorCisKKy8qIGJ1bGsgdHJhbnNmZXJzIHRvIHVzYmR1eCAqLworCisjZGVmaW5lIFNFTkRBRENPTU1BTkRTICAgICAgICAgICAgMAorI2RlZmluZSBTRU5EREFDT01NQU5EUyAgICAgICAgICAgIDEKKyNkZWZpbmUgU0VORERJT0NPTkZJR0NPTU1BTkQgICAgICAyCisjZGVmaW5lIFNFTkRESU9CSVRTQ09NTUFORCAgICAgICAgMworI2RlZmluZSBTRU5EU0lOR0xFQUQgICAgICAgICAgICAgIDQKKyNkZWZpbmUgU0VORFBXTU9OICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFNFTkRQV01PRkYgICAgICAgICAgICAgICAgOAorCitzdGF0aWMgaW50IHNlbmRfZHV4X2NvbW1hbmRzKHN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViLCBpbnQgY21kX3R5cGUpCit7CisJaW50IHJlc3VsdCwgbnNlbnQ7CisKKwl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzBdID0gY21kX3R5cGU7CisjaWZkZWYgTk9JU1lfRFVYX0RFQlVHQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgImNvbWVkaSVkOiB1c2JkdXg6IGR1eF9jb21tYW5kczogIiwKKwkgICAgICAgdGhpc191c2JkdXhzdWItPmNvbWVkaWRldi0+bWlub3IpOworCWZvciAocmVzdWx0ID0gMDsgcmVzdWx0IDwgU0laRU9GRFVYQlVGRkVSOyByZXN1bHQrKykKKwkJcHJpbnRrKCIgJTAyeCIsIHRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbcmVzdWx0XSk7CisJcHJpbnRrKCJcbiIpOworI2VuZGlmCisJcmVzdWx0ID0gdXNiX2J1bGtfbXNnKHRoaXNfdXNiZHV4c3ViLT51c2JkZXYsCisJCQkgICAgICB1c2Jfc25kYnVsa3BpcGUodGhpc191c2JkdXhzdWItPnVzYmRldiwKKwkJCQkJICAgICAgQ09NTUFORF9PVVRfRVApLAorCQkJICAgICAgdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kcywgU0laRU9GRFVYQlVGRkVSLAorCQkJICAgICAgJm5zZW50LCBCVUxLX1RJTUVPVVQpOworCWlmIChyZXN1bHQgPCAwKQorCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGklZDogIgorCQkJImNvdWxkIG5vdCB0cmFuc21pdCBkdXhfY29tbWFuZCB0byB0aGUgdXNiLWRldmljZSwgIgorCQkJImVycj0lZFxuIiwgdGhpc191c2JkdXhzdWItPmNvbWVkaWRldi0+bWlub3IsIHJlc3VsdCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHJlY2VpdmVfZHV4X2NvbW1hbmRzKHN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViLCBpbnQgY29tbWFuZCkKK3sKKwlpbnQgcmVzdWx0ID0gKC1FRkFVTFQpOworCWludCBucmVjOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFJFVFJJRVM7IGkrKykgeworCQlyZXN1bHQgPSB1c2JfYnVsa19tc2codGhpc191c2JkdXhzdWItPnVzYmRldiwKKwkJCQkgICAgICB1c2JfcmN2YnVsa3BpcGUodGhpc191c2JkdXhzdWItPnVzYmRldiwKKwkJCQkJCSAgICAgIENPTU1BTkRfSU5fRVApLAorCQkJCSAgICAgIHRoaXNfdXNiZHV4c3ViLT5pbnNuQnVmZmVyLCBTSVpFSU5TTkJVRiwKKwkJCQkgICAgICAmbnJlYywgQlVMS19USU1FT1VUKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaSVkOiAiCisJCQkJImluc246IFVTQiBlcnJvciAlZCAiCisJCQkJIndoaWxlIHJlY2VpdmluZyBEVVggY29tbWFuZCIKKwkJCQkiXG4iLCB0aGlzX3VzYmR1eHN1Yi0+Y29tZWRpZGV2LT5taW5vciwKKwkJCQlyZXN1bHQpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlpZiAodGhpc191c2JkdXhzdWItPmluc25CdWZmZXJbMF0gPT0gY29tbWFuZCkKKwkJCXJldHVybiByZXN1bHQ7CisJfQorCS8qIHRoaXMgaXMgb25seSByZWFjaGVkIGlmIHRoZSBkYXRhIGhhcyBiZWVuIHJlcXVlc3RlZCBhIGNvdXBsZSBvZgorCSAqIHRpbWVzICovCisJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpJWQ6IGluc246ICIKKwkJIndyb25nIGRhdGEgcmV0dXJuZWQgZnJvbSBmaXJtd2FyZTogd2FudCAlZCwgZ290ICVkLlxuIiwKKwkJdGhpc191c2JkdXhzdWItPmNvbWVkaWRldi0+bWlub3IsIGNvbW1hbmQsCisJCXRoaXNfdXNiZHV4c3ViLT5pbnNuQnVmZmVyWzBdKTsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworc3RhdGljIGludCB1c2JkdXhfYWlfaW50dHJpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgdW5zaWduZWQgaW50IHRyaWdudW0pCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJImNvbWVkaSVkOiB1c2JkdXhfYWlfaW50dHJpZ1xuIiwgZGV2LT5taW5vcik7CisKKwlpZiAodHJpZ251bSAhPSAwKSB7CisJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogdXNiZHV4X2FpX2ludHRyaWc6IGludmFsaWQgdHJpZ251bVxuIiwKKwkJCWRldi0+bWlub3IpOworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+YWlfY21kX3J1bm5pbmcpKSB7CisJCXRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZyA9IDE7CisJCXJldCA9IHVzYmR1eHN1Yl9zdWJtaXRfSW5VUkJzKHRoaXNfdXNiZHV4c3ViKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpJWQ6IHVzYmR1eF9haV9pbnR0cmlnOiAiCisJCQkJInVyYlN1Ym1pdDogZXJyPSVkXG4iLCBkZXYtPm1pbm9yLCByZXQpOworCQkJdGhpc191c2JkdXhzdWItPmFpX2NtZF9ydW5uaW5nID0gMDsKKwkJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcy0+YXN5bmMtPmludHRyaWcgPSBOVUxMOworCX0gZWxzZSB7CisJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogYWlfaW50dHJpZyBidXQgYWNxdSBpcyBhbHJlYWR5IHJ1bm5pbmdcbiIsCisJCQlkZXYtPm1pbm9yKTsKKwl9CisJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9haV9jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZzLT5hc3luYy0+Y21kOworCXVuc2lnbmVkIGludCBjaGFuOworCWludCBpLCByZXQ7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisJaW50IHJlc3VsdDsKKwl1aW50OF90IG11eHNnMCA9IDA7CisJdWludDhfdCBtdXhzZzEgPSAwOworCXVpbnQ4X3Qgc3lzcmVkID0gMDsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkiY29tZWRpJWQ6IHVzYmR1eF9haV9jbWRcbiIsIGRldi0+bWlub3IpOworCisJLyogYmxvY2sgb3RoZXIgQ1BVcyBmcm9tIHN0YXJ0aW5nIGFuIGFpX2NtZCAqLworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKHRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZykgeworCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGklZDogIgorCQkJImFpX2NtZCBub3QgcG9zc2libGUuIEFub3RoZXIgYWlfY21kIGlzIHJ1bm5pbmcuXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJLyogc2V0IGN1cnJlbnQgY2hhbm5lbCBvZiB0aGUgcnVubmluZyBhcXVpc2l0aW9uIHRvIHplcm8gKi8KKwlzLT5hc3luYy0+Y3VyX2NoYW4gPSAwOworCisJLyogZmlyc3QgdGhlIG51bWJlciBvZiBjaGFubmVscyBwZXIgdGltZSBzdGVwICovCisJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1sxXSA9IGNtZC0+Y2hhbmxpc3RfbGVuOworCisJLyogQ09ORklHMCAqLworCXRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbMl0gPSAweDEyOworCisJLyogQ09ORklHMTogMjNrSHogc2FtcGxpbmcgcmF0ZSwgZGVsYXkgPSAwdXMsICAqLworCXRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbM10gPSAweDAzOworCisJLyogQ09ORklHMzogZGlmZmVyZW50aWFsIGNoYW5uZWxzIG9mZiAqLworCXRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbNF0gPSAweDAwOworCisJZm9yIChpID0gMDsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyBpKyspIHsKKwkJY2hhbiA9IENSX0NIQU4oY21kLT5jaGFubGlzdFtpXSk7CisJCWNyZWF0ZV9hZGNfY29tbWFuZChjaGFuLCAmbXV4c2cwLCAmbXV4c2cxKTsKKwkJaWYgKGkgPj0gTlVNQ0hBTk5FTFMpIHsKKwkJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpJWQ6IGNoYW5uZWwgbGlzdCB0b28gbG9uZ1xuIiwKKwkJCQlkZXYtPm1pbm9yKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbNV0gPSBtdXhzZzA7CisJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1s2XSA9IG11eHNnMTsKKwl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzddID0gc3lzcmVkOworCisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkiY29tZWRpICVkOiBzZW5kaW5nIGNvbW1hbmRzIHRvIHRoZSB1c2IgZGV2aWNlOiBzaXplPSV1XG4iLAorCQlkZXYtPm1pbm9yLCBOVU1DSEFOTkVMUyk7CisKKwlyZXN1bHQgPSBzZW5kX2R1eF9jb21tYW5kcyh0aGlzX3VzYmR1eHN1YiwgU0VOREFEQ09NTUFORFMpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlpZiAodGhpc191c2JkdXhzdWItPmhpZ2hfc3BlZWQpIHsKKwkJLyoKKwkJICogZXZlcnkgMiBjaGFubmVscyBnZXQgYSB0aW1lIHdpbmRvdyBvZiAxMjV1cy4gVGh1cywgaWYgd2UKKwkJICogc2FtcGxlIGFsbCAxNiBjaGFubmVscyB3ZSBuZWVkIDFtcy4gSWYgd2Ugc2FtcGxlIG9ubHkgb25lCisJCSAqIGNoYW5uZWwgd2UgbmVlZCBvbmx5IDEyNXVzCisJCSAqLworCQl0aGlzX3VzYmR1eHN1Yi0+YWlfaW50ZXJ2YWwgPQorCQkJY2hhblRvSW50ZXJ2YWwoY21kLT5jaGFubGlzdF9sZW4pOworCQl0aGlzX3VzYmR1eHN1Yi0+YWlfdGltZXIgPSBjbWQtPnNjYW5fYmVnaW5fYXJnIC8gKDEyNTAwMCAqCisJCQkJCQkJICAodGhpc191c2JkdXhzdWItPgorCQkJCQkJCSAgIGFpX2ludGVydmFsKSk7CisJfSBlbHNlIHsKKwkJLyogaW50ZXJ2YWwgYWx3YXlzIDFtcyAqLworCQl0aGlzX3VzYmR1eHN1Yi0+YWlfaW50ZXJ2YWwgPSAxOworCQl0aGlzX3VzYmR1eHN1Yi0+YWlfdGltZXIgPSBjbWQtPnNjYW5fYmVnaW5fYXJnIC8gMTAwMDAwMDsKKwl9CisJaWYgKHRoaXNfdXNiZHV4c3ViLT5haV90aW1lciA8IDEpIHsKKwkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LCAiY29tZWRpJWQ6IGFpX2NtZDogIgorCQkJInRpbWVyPSVkLCBzY2FuX2JlZ2luX2FyZz0lZC4gIgorCQkJIk5vdCBwcm9wZXJseSB0ZXN0ZWQgYnkgY21kdGVzdD9cbiIsIGRldi0+bWlub3IsCisJCQl0aGlzX3VzYmR1eHN1Yi0+YWlfdGltZXIsIGNtZC0+c2Nhbl9iZWdpbl9hcmcpOworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl0aGlzX3VzYmR1eHN1Yi0+YWlfY291bnRlciA9IHRoaXNfdXNiZHV4c3ViLT5haV90aW1lcjsKKworCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKKwkJLyogZGF0YSBhcnJpdmVzIGFzIG9uZSBwYWNrZXQgKi8KKwkJdGhpc191c2JkdXhzdWItPmFpX3NhbXBsZV9jb3VudCA9IGNtZC0+c3RvcF9hcmc7CisJCXRoaXNfdXNiZHV4c3ViLT5haV9jb250aW5vdXMgPSAwOworCX0gZWxzZSB7CisJCS8qIGNvbnRpbm91cyBhcXVpc2l0aW9uICovCisJCXRoaXNfdXNiZHV4c3ViLT5haV9jb250aW5vdXMgPSAxOworCQl0aGlzX3VzYmR1eHN1Yi0+YWlfc2FtcGxlX2NvdW50ID0gMDsKKwl9CisKKwlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19OT1cpIHsKKwkJLyogZW5hYmxlIHRoaXMgYWNxdWlzaXRpb24gb3BlcmF0aW9uICovCisJCXRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZyA9IDE7CisJCXJldCA9IHVzYmR1eHN1Yl9zdWJtaXRfSW5VUkJzKHRoaXNfdXNiZHV4c3ViKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZyA9IDA7CisJCQkvKiBmaXhtZTogdW5saW5rIGhlcmU/PyAqLworCQkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlzLT5hc3luYy0+aW50dHJpZyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJLyogVFJJR19JTlQgKi8KKwkJLyogZG9uJ3QgZW5hYmxlIHRoZSBhY3F1aXNpb24gb3BlcmF0aW9uICovCisJCS8qIHdhaXQgZm9yIGFuIGludGVybmFsIHNpZ25hbCAqLworCQlzLT5hc3luYy0+aW50dHJpZyA9IHVzYmR1eF9haV9pbnR0cmlnOworCX0KKwl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIE1vZGUgMCBpcyB1c2VkIHRvIGdldCBhIHNpbmdsZSBjb252ZXJzaW9uIG9uIGRlbWFuZCAqLworc3RhdGljIGludCB1c2JkdXhfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJaW50IGk7CisJaW50MzJfdCBvbmUgPSAwOworCWludCBjaGFuOworCWludCBlcnI7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisJdWludDhfdCBtdXhzZzAgPSAwOworCXVpbnQ4X3QgbXV4c2cxID0gMDsKKwl1aW50OF90IHN5c3JlZCA9IDA7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gMDsKKworCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJImNvbWVkaSVkOiBhaV9pbnNuX3JlYWQsIGluc24tPm49JWQsIGluc24tPnN1YmRldj0lZFxuIiwKKwkJZGV2LT5taW5vciwgaW5zbi0+biwgaW5zbi0+c3ViZGV2KTsKKworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICh0aGlzX3VzYmR1eHN1Yi0+YWlfY21kX3J1bm5pbmcpIHsKKwkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiBhaV9pbnNuX3JlYWQgbm90IHBvc3NpYmxlLiAiCisJCQkiQXN5bmMgQ29tbWFuZCBpcyBydW5uaW5nLlxuIiwgZGV2LT5taW5vcik7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogc2FtcGxlIG9uZSBjaGFubmVsICovCisJLyogQ09ORklHMDogY2hvcHBlciBvbiAqLworCXRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbMV0gPSAweDE2OworCisJLyogQ09ORklHMTogMmtIeiBzYW1wbGluZyByYXRlICovCisJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1syXSA9IDB4ODA7CisKKwkvKiBDT05GSUczOiBkaWZmZXJlbnRpYWwgY2hhbm5lbHMgb2ZmICovCisJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1szXSA9IDB4MDA7CisKKwljaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJY3JlYXRlX2FkY19jb21tYW5kKGNoYW4sICZtdXhzZzAsICZtdXhzZzEpOworCisJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1s0XSA9IG11eHNnMDsKKwl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzVdID0gbXV4c2cxOworCXRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbNl0gPSBzeXNyZWQ7CisKKwkvKiBhZGMgY29tbWFuZHMgKi8KKwllcnIgPSBzZW5kX2R1eF9jb21tYW5kcyh0aGlzX3VzYmR1eHN1YiwgU0VORFNJTkdMRUFEKTsKKwlpZiAoZXJyIDwgMCkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiBlcnI7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQllcnIgPSByZWNlaXZlX2R1eF9jb21tYW5kcyh0aGlzX3VzYmR1eHN1YiwgU0VORFNJTkdMRUFEKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qIDMyIGJpdHMgYmlnIGVuZGlhbiBmcm9tIHRoZSBBL0QgY29udmVydGVyICovCisJCW9uZSA9IGJlMzJfdG9fY3B1KCooKGludDMyX3QgKikKKwkJCQkgICAgKCh0aGlzX3VzYmR1eHN1Yi0+aW5zbkJ1ZmZlcikrMSkpKTsKKwkJLyogbWFzayBvdXQgdGhlIHN0YXVzIGJ5dGUgKi8KKwkJb25lID0gb25lICYgMHgwMGZmZmZmZjsKKwkJLyogdHVybiBpdCBpbnRvIGFuIHVuc2lnbmVkIGludGVnZXIgKi8KKwkJb25lID0gb25lIF4gMHgwMDgwMDAwMDsKKwkJZGF0YVtpXSA9IG9uZTsKKwl9CisJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCXJldHVybiBpOworfQorCisKKworCitzdGF0aWMgaW50IHVzYmR1eF9nZXRzdGF0dXNpbmZvKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGludCBjaGFuKQoreworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCXVpbnQ4X3Qgc3lzcmVkID0gMDsKKwl1aW50MzJfdCBvbmU7CisJaW50IGVycjsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAwOworCisJaWYgKHRoaXNfdXNiZHV4c3ViLT5haV9jbWRfcnVubmluZykgeworCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IHN0YXR1cyByZWFkIG5vdCBwb3NzaWJsZS4gIgorCQkJIkFzeW5jIENvbW1hbmQgaXMgcnVubmluZy5cbiIsIGRldi0+bWlub3IpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDT05GSUcwICovCisJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1sxXSA9IDB4MTI7CisKKwkvKiBDT05GSUcxOiAya0h6IHNhbXBsaW5nIHJhdGUgKi8KKwl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzJdID0gMHg4MDsKKworCS8qIENPTkZJRzM6IGRpZmZlcmVudGlhbCBjaGFubmVscyBvZmYgKi8KKwl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzNdID0gMHgwMDsKKworCWlmIChjaGFuID09IDEpIHsKKwkJLyogQURDIG9mZnNldCAqLworCQlzeXNyZWQgPSBzeXNyZWQgfCAxOworCX0gZWxzZSBpZiAoY2hhbiA9PSAyKSB7CisJCS8qIFZDQyAqLworCQlzeXNyZWQgPSBzeXNyZWQgfCA0OworCX0gZWxzZSBpZiAoY2hhbiA9PSAzKSB7CisJCS8qIHRlbXBlcmF0dXJlICovCisJCXN5c3JlZCA9IHN5c3JlZCB8IDg7CisJfSBlbHNlIGlmIChjaGFuID09IDQpIHsKKwkJLyogZ2FpbiAqLworCQlzeXNyZWQgPSBzeXNyZWQgfCAxNjsKKwl9IGVsc2UgaWYgKGNoYW4gPT0gNSkgeworCQkvKiByZWYgKi8KKwkJc3lzcmVkID0gc3lzcmVkIHwgMzI7CisJfQorCisJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1s0XSA9IDA7CisJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1s1XSA9IDA7CisJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1s2XSA9IHN5c3JlZDsKKworCS8qIGFkYyBjb21tYW5kcyAqLworCWVyciA9IHNlbmRfZHV4X2NvbW1hbmRzKHRoaXNfdXNiZHV4c3ViLCBTRU5EU0lOR0xFQUQpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gcmVjZWl2ZV9kdXhfY29tbWFuZHModGhpc191c2JkdXhzdWIsIFNFTkRTSU5HTEVBRCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiAzMiBiaXRzIGJpZyBlbmRpYW4gZnJvbSB0aGUgQS9EIGNvbnZlcnRlciAqLworCW9uZSA9IGJlMzJfdG9fY3B1KCooKGludDMyX3QgKikoKHRoaXNfdXNiZHV4c3ViLT5pbnNuQnVmZmVyKSsxKSkpOworCS8qIG1hc2sgb3V0IHRoZSBzdGF1cyBieXRlICovCisJb25lID0gb25lICYgMHgwMGZmZmZmZjsKKwlvbmUgPSBvbmUgXiAweDAwODAwMDAwOworCisJcmV0dXJuIChpbnQpb25lOworfQorCisKKworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGFuYWxvZyBvdXQgKi8KKworc3RhdGljIGludCB1c2JkdXhfYW9faW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJaW50IGk7CisJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJZG93bigmdGhpc191c2JkdXhzdWItPnNlbSk7CisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKKwkJZGF0YVtpXSA9IHRoaXNfdXNiZHV4c3ViLT5vdXRCdWZmZXJbY2hhbl07CisKKwl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X2FvX2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlpbnQgaSwgZXJyOworCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJImNvbWVkaSVkOiBhb19pbnNuX3dyaXRlXG4iLCBkZXYtPm1pbm9yKTsKKworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICh0aGlzX3VzYmR1eHN1Yi0+YW9fY21kX3J1bm5pbmcpIHsKKwkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiBhb19pbnNuX3dyaXRlOiAiCisJCQkiRVJST1I6IGFzeW5jaHJvbm91cyBhb19jbWQgaXMgcnVubmluZ1xuIiwgZGV2LT5taW5vcik7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykgeworCQlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IGFvX2luc25fd3JpdGU6IGRhdGFbY2hhbj0lZCxpPSVkXT0lZFxuIiwKKwkJCWRldi0+bWlub3IsIGNoYW4sIGksIGRhdGFbaV0pOworCisJCS8qIG51bWJlciBvZiBjaGFubmVsczogMSAqLworCQl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzFdID0gMTsKKwkJLyogY2hhbm5lbCBudW1iZXIgKi8KKwkJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1syXSA9IGRhdGFbaV07CisJCXRoaXNfdXNiZHV4c3ViLT5vdXRCdWZmZXJbY2hhbl0gPSBkYXRhW2ldOworCQl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzNdID0gY2hhbjsKKwkJZXJyID0gc2VuZF9kdXhfY29tbWFuZHModGhpc191c2JkdXhzdWIsIFNFTkREQUNPTU1BTkRTKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X2FvX2ludHRyaWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIHVuc2lnbmVkIGludCB0cmlnbnVtKQoreworCWludCByZXQ7CisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICh0cmlnbnVtICE9IDApIHsKKwkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiB1c2JkdXhfYW9faW50dHJpZzogaW52YWxpZCB0cmlnbnVtXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoISh0aGlzX3VzYmR1eHN1Yi0+YW9fY21kX3J1bm5pbmcpKSB7CisJCXRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZyA9IDE7CisJCXJldCA9IHVzYmR1eHN1Yl9zdWJtaXRfT3V0VVJCcyh0aGlzX3VzYmR1eHN1Yik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaSVkOiB1c2JkdXhfYW9faW50dHJpZzogc3VibWl0VVJCOiAiCisJCQkJImVycj0lZFxuIiwgZGV2LT5taW5vciwgcmV0KTsKKwkJCXRoaXNfdXNiZHV4c3ViLT5hb19jbWRfcnVubmluZyA9IDA7CisJCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXMtPmFzeW5jLT5pbnR0cmlnID0gTlVMTDsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IGFvX2ludHRyaWcgYnV0IGFjcXUgaXMgYWxyZWFkeSBydW5uaW5nLlxuIiwKKwkJCWRldi0+bWlub3IpOworCX0KKwl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X2FvX2NtZHRlc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCit7CisJaW50IGVyciA9IDAsIHRtcDsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpCisJCXJldHVybiAtRU5PREVWOworCisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkiY29tZWRpJWQ6IHVzYmR1eF9hb19jbWR0ZXN0XG4iLCBkZXYtPm1pbm9yKTsKKworCS8qIG1ha2Ugc3VyZSB0cmlnZ2VycyBhcmUgdmFsaWQgKi8KKwkvKiBPbmx5IGltbWVkaWF0ZSB0cmlnZ2VycyBhcmUgYWxsb3dlZCAqLworCXRtcCA9IGNtZC0+c3RhcnRfc3JjOworCWNtZC0+c3RhcnRfc3JjICY9IFRSSUdfTk9XIHwgVFJJR19JTlQ7CisJaWYgKCFjbWQtPnN0YXJ0X3NyYyB8fCB0bXAgIT0gY21kLT5zdGFydF9zcmMpCisJCWVycisrOworCisJLyogdHJpZ2dlciBzaG91bGQgaGFwcGVuIHRpbWVkICovCisJdG1wID0gY21kLT5zY2FuX2JlZ2luX3NyYzsKKwkvKiBqdXN0IG5vdyB3ZSBzY2FuIGFsc28gaW4gdGhlIGhpZ2ggc3BlZWQgbW9kZSBldmVyeSBmcmFtZSAqLworCS8qIHRoaXMgaXMgZHVlIHRvIGVoY2kgZHJpdmVyIGxpbWl0YXRpb25zICovCisJaWYgKDApIHsJCS8qICh0aGlzX3VzYmR1eHN1Yi0+aGlnaF9zcGVlZCkgKi8KKwkJLyogc3RhcnQgaW1taWRpYXRlbHkgYSBuZXcgc2NhbiAqLworCQkvKiB0aGUgc2FtcGxpbmcgcmF0ZSBpcyBzZXQgYnkgdGhlIGNvdmVyc2lvbiByYXRlICovCisJCWNtZC0+c2Nhbl9iZWdpbl9zcmMgJj0gVFJJR19GT0xMT1c7CisJfSBlbHNlIHsKKwkJLyogc3RhcnQgYSBuZXcgc2NhbiAob3V0cHV0IGF0IG9uY2UpIHdpdGggYSB0aW1lciAqLworCQljbWQtPnNjYW5fYmVnaW5fc3JjICY9IFRSSUdfVElNRVI7CisJfQorCWlmICghY21kLT5zY2FuX2JlZ2luX3NyYyB8fCB0bXAgIT0gY21kLT5zY2FuX2JlZ2luX3NyYykKKwkJZXJyKys7CisKKwkvKiBzY2FubmluZyBpcyBjb250aW5vdXMgKi8KKwl0bXAgPSBjbWQtPmNvbnZlcnRfc3JjOworCisJLyogYWxsIGNvbnZlcnNpb24gZXZlbnRzIGhhcHBlbiBzaW11bHRhbmVvdXNseSAqLworCWNtZC0+Y29udmVydF9zcmMgJj0gVFJJR19OT1c7CisKKwlpZiAoIWNtZC0+Y29udmVydF9zcmMgfHwgdG1wICE9IGNtZC0+Y29udmVydF9zcmMpCisJCWVycisrOworCisJLyogaXNzdWUgYSB0cmlnZ2VyIHdoZW4gc2NhbiBpcyBmaW5pc2hlZCBhbmQgc3RhcnQgYSBuZXcgc2NhbiAqLworCXRtcCA9IGNtZC0+c2Nhbl9lbmRfc3JjOworCWNtZC0+c2Nhbl9lbmRfc3JjICY9IFRSSUdfQ09VTlQ7CisJaWYgKCFjbWQtPnNjYW5fZW5kX3NyYyB8fCB0bXAgIT0gY21kLT5zY2FuX2VuZF9zcmMpCisJCWVycisrOworCisJLyogdHJpZ2dlciBhdCB0aGUgZW5kIG9mIGNvdW50IGV2ZW50cyBvciBub3QsIHN0b3AgY29uZGl0aW9uIG9yIG5vdCAqLworCXRtcCA9IGNtZC0+c3RvcF9zcmM7CisJY21kLT5zdG9wX3NyYyAmPSBUUklHX0NPVU5UIHwgVFJJR19OT05FOworCWlmICghY21kLT5zdG9wX3NyYyB8fCB0bXAgIT0gY21kLT5zdG9wX3NyYykKKwkJZXJyKys7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogc3RlcCAyOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzCisJICogYXJlIHVuaXF1ZSBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZQorCSAqIG5vdGUgdGhhdCBtdXR1YWwgY29tcGF0aWJpbGl0eSBpcyBub3QgYW4gaXNzdWUgaGVyZQorCSAqLworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICE9IFRSSUdfRk9MTE9XICYmCisJICAgIGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19FWFQgJiYKKwkgICAgY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX1RJTUVSKQorCQllcnIrKzsKKwlpZiAoY21kLT5zdG9wX3NyYyAhPSBUUklHX0NPVU5UICYmIGNtZC0+c3RvcF9zcmMgIT0gVFJJR19OT05FKQorCQllcnIrKzsKKworCWlmIChlcnIpCisJCXJldHVybiAyOworCisJLyogc3RlcCAzOiBtYWtlIHN1cmUgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgY29tcGF0aWJsZSAqLworCisJaWYgKGNtZC0+c3RhcnRfYXJnICE9IDApIHsKKwkJY21kLT5zdGFydF9hcmcgPSAwOworCQllcnIrKzsKKwl9CisKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVykgeworCQkvKiBpbnRlcm5hbCB0cmlnZ2VyICovCisJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnICE9IDApIHsKKwkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSAwOworCQkJZXJyKys7CisJCX0KKwl9CisKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCS8qIHRpbWVyICovCisJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnIDwgMTAwMDAwMCkgeworCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IDEwMDAwMDA7CisJCQllcnIrKzsKKwkJfQorCX0KKwkvKiBub3QgdXNlZCBub3csIGlzIGZvciBsYXRlciB1c2UgKi8KKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWlmIChjbWQtPmNvbnZlcnRfYXJnIDwgMTI1MDAwKSB7CisJCQljbWQtPmNvbnZlcnRfYXJnID0gMTI1MDAwOworCQkJZXJyKys7CisJCX0KKwl9CisKKwkvKiB0aGUgc2FtZSBhcmd1bWVudCAqLworCWlmIChjbWQtPnNjYW5fZW5kX2FyZyAhPSBjbWQtPmNoYW5saXN0X2xlbikgeworCQljbWQtPnNjYW5fZW5kX2FyZyA9IGNtZC0+Y2hhbmxpc3RfbGVuOworCQllcnIrKzsKKwl9CisKKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7CisJCS8qIGFueSBjb3VudCBpcyBhbGxvd2VkICovCisJfSBlbHNlIHsKKwkJLyogVFJJR19OT05FICovCisJCWlmIChjbWQtPnN0b3BfYXJnICE9IDApIHsKKwkJCWNtZC0+c3RvcF9hcmcgPSAwOworCQkJZXJyKys7CisJCX0KKwl9CisKKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGklZDogZXJyPSVkLCAiCisJCSJzY2FuX2JlZ2luX3NyYz0lZCwgc2Nhbl9iZWdpbl9hcmc9JWQsIGNvbnZlcnRfc3JjPSVkLCAiCisJCSJjb252ZXJ0X2FyZz0lZFxuIiwgZGV2LT5taW5vciwgZXJyLCBjbWQtPnNjYW5fYmVnaW5fc3JjLAorCQljbWQtPnNjYW5fYmVnaW5fYXJnLCBjbWQtPmNvbnZlcnRfc3JjLCBjbWQtPmNvbnZlcnRfYXJnKTsKKworCWlmIChlcnIpCisJCXJldHVybiAzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X2FvX2NtZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwlzdHJ1Y3QgY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CisJdW5zaWduZWQgaW50IGNoYW4sIGdhaW47CisJaW50IGksIHJldDsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJZG93bigmdGhpc191c2JkdXhzdWItPnNlbSk7CisJaWYgKCEodGhpc191c2JkdXhzdWItPnByb2JlZCkpIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkiY29tZWRpJWQ6ICVzXG4iLCBkZXYtPm1pbm9yLCBfX2Z1bmNfXyk7CisKKwkvKiBzZXQgY3VycmVudCBjaGFubmVsIG9mIHRoZSBydW5uaW5nIGFxdWlzaXRpb24gdG8gemVybyAqLworCXMtPmFzeW5jLT5jdXJfY2hhbiA9IDA7CisJZm9yIChpID0gMDsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyArK2kpIHsKKwkJY2hhbiA9IENSX0NIQU4oY21kLT5jaGFubGlzdFtpXSk7CisJCWdhaW4gPSBDUl9SQU5HRShjbWQtPmNoYW5saXN0W2ldKTsKKwkJaWYgKGkgPj0gTlVNT1VUQ0hBTk5FTFMpIHsKKwkJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpJWQ6ICVzOiBjaGFubmVsIGxpc3QgdG9vIGxvbmdcbiIsCisJCQkJZGV2LT5taW5vciwgX19mdW5jX18pOworCQkJYnJlYWs7CisJCX0KKwkJdGhpc191c2JkdXhzdWItPmRhY19jb21tYW5kc1tpXSA9IGNoYW47CisJCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogZGFjIGNvbW1hbmQgZm9yIGNoICVkIGlzICV4XG4iLAorCQkJZGV2LT5taW5vciwgaSwgdGhpc191c2JkdXhzdWItPmRhY19jb21tYW5kc1tpXSk7CisJfQorCisJLyogd2UgY291bnQgaW4gc3RlcHMgb2YgMW1zICgxMjV1cykgKi8KKwkvKiAxMjV1cyBtb2RlIG5vdCB1c2VkIHlldCAqLworCWlmICgwKSB7CQkvKiAodGhpc191c2JkdXhzdWItPmhpZ2hfc3BlZWQpICovCisJCS8qIDEyNXVzICovCisJCS8qIHRpbWluZyBvZiB0aGUgY29udmVyc2lvbiBpdHNlbGY6IGV2ZXJ5IDEyNSB1cyAqLworCQl0aGlzX3VzYmR1eHN1Yi0+YW9fdGltZXIgPSBjbWQtPmNvbnZlcnRfYXJnIC8gMTI1MDAwOworCX0gZWxzZSB7CisJCS8qIDFtcyAqLworCQkvKiB0aW1pbmcgb2YgdGhlIHNjYW46IHdlIGdldCBhbGwgY2hhbm5lbHMgYXQgb25jZSAqLworCQl0aGlzX3VzYmR1eHN1Yi0+YW9fdGltZXIgPSBjbWQtPnNjYW5fYmVnaW5fYXJnIC8gMTAwMDAwMDsKKwkJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiBzY2FuX2JlZ2luX3NyYz0lZCwgc2Nhbl9iZWdpbl9hcmc9JWQsICIKKwkJCSJjb252ZXJ0X3NyYz0lZCwgY29udmVydF9hcmc9JWRcbiIsIGRldi0+bWlub3IsCisJCQljbWQtPnNjYW5fYmVnaW5fc3JjLCBjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJY21kLT5jb252ZXJ0X3NyYywgY21kLT5jb252ZXJ0X2FyZyk7CisJCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGklZDogYW9fdGltZXI9JWQgKG1zKVxuIiwKKwkJCWRldi0+bWlub3IsIHRoaXNfdXNiZHV4c3ViLT5hb190aW1lcik7CisJCWlmICh0aGlzX3VzYmR1eHN1Yi0+YW9fdGltZXIgPCAxKSB7CisJCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaSVkOiB1c2JkdXg6IGFvX3RpbWVyPSVkLCAiCisJCQkJInNjYW5fYmVnaW5fYXJnPSVkLiAiCisJCQkJIk5vdCBwcm9wZXJseSB0ZXN0ZWQgYnkgY21kdGVzdD9cbiIsCisJCQkJZGV2LT5taW5vciwgdGhpc191c2JkdXhzdWItPmFvX3RpbWVyLAorCQkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcpOworCQkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJdGhpc191c2JkdXhzdWItPmFvX2NvdW50ZXIgPSB0aGlzX3VzYmR1eHN1Yi0+YW9fdGltZXI7CisKKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7CisJCS8qIG5vdCBjb250aW5vdXMgKi8KKwkJLyogY291bnRlciAqLworCQkvKiBoaWdoIHNwZWVkIGFsc28gc2NhbnMgZXZlcnl0aGluZyBhdCBvbmNlICovCisJCWlmICgwKSB7CS8qICh0aGlzX3VzYmR1eHN1Yi0+aGlnaF9zcGVlZCkgKi8KKwkJCXRoaXNfdXNiZHV4c3ViLT5hb19zYW1wbGVfY291bnQgPQorCQkJICAgIChjbWQtPnN0b3BfYXJnKSAqIChjbWQtPnNjYW5fZW5kX2FyZyk7CisJCX0gZWxzZSB7CisJCQkvKiB0aGVyZSdzIG5vIHNjYW4gYXMgdGhlIHNjYW4gaGFzIGJlZW4gKi8KKwkJCS8qIHBlcmYgaW5zaWRlIHRoZSBGWDIgKi8KKwkJCS8qIGRhdGEgYXJyaXZlcyBhcyBvbmUgcGFja2V0ICovCisJCQl0aGlzX3VzYmR1eHN1Yi0+YW9fc2FtcGxlX2NvdW50ID0gY21kLT5zdG9wX2FyZzsKKwkJfQorCQl0aGlzX3VzYmR1eHN1Yi0+YW9fY29udGlub3VzID0gMDsKKwl9IGVsc2UgeworCQkvKiBjb250aW5vdXMgYXF1aXNpdGlvbiAqLworCQl0aGlzX3VzYmR1eHN1Yi0+YW9fY29udGlub3VzID0gMTsKKwkJdGhpc191c2JkdXhzdWItPmFvX3NhbXBsZV9jb3VudCA9IDA7CisJfQorCisJaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfTk9XKSB7CisJCS8qIGVuYWJsZSB0aGlzIGFjcXVpc2l0aW9uIG9wZXJhdGlvbiAqLworCQl0aGlzX3VzYmR1eHN1Yi0+YW9fY21kX3J1bm5pbmcgPSAxOworCQlyZXQgPSB1c2JkdXhzdWJfc3VibWl0X091dFVSQnModGhpc191c2JkdXhzdWIpOworCQlpZiAocmV0IDwgMCkgeworCQkJdGhpc191c2JkdXhzdWItPmFvX2NtZF9ydW5uaW5nID0gMDsKKwkJCS8qIGZpeG1lOiB1bmxpbmsgaGVyZT8/ICovCisJCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXMtPmFzeW5jLT5pbnR0cmlnID0gTlVMTDsKKwl9IGVsc2UgeworCQkvKiBUUklHX0lOVCAqLworCQkvKiBzdWJtaXQgdGhlIHVyYnMgbGF0ZXIgKi8KKwkJLyogd2FpdCBmb3IgYW4gaW50ZXJuYWwgc2lnbmFsICovCisJCXMtPmFzeW5jLT5pbnR0cmlnID0gdXNiZHV4X2FvX2ludHRyaWc7CisJfQorCisJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9kaW9faW5zbl9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKworCS8qIFRoZSBpbnB1dCBvciBvdXRwdXQgY29uZmlndXJhdGlvbiBvZiBlYWNoIGRpZ2l0YWwgbGluZSBpcworCSAqIGNvbmZpZ3VyZWQgYnkgYSBzcGVjaWFsIGluc25fY29uZmlnIGluc3RydWN0aW9uLiAgY2hhbnNwZWMKKwkgKiBjb250YWlucyB0aGUgY2hhbm5lbCB0byBiZSBjaGFuZ2VkLCBhbmQgZGF0YVswXSBjb250YWlucyB0aGUKKwkgKiB2YWx1ZSBDT01FRElfSU5QVVQgb3IgQ09NRURJX09VVFBVVC4gKi8KKworCXN3aXRjaCAoZGF0YVswXSkgeworCWNhc2UgSU5TTl9DT05GSUdfRElPX09VVFBVVDoKKwkJcy0+aW9fYml0cyB8PSAxIDw8IGNoYW47CS8qIDEgbWVhbnMgT3V0ICovCisJCWJyZWFrOworCWNhc2UgSU5TTl9DT05GSUdfRElPX0lOUFVUOgorCQlzLT5pb19iaXRzICY9IH4oMSA8PCBjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBJTlNOX0NPTkZJR19ESU9fUVVFUlk6CisJCWRhdGFbMV0gPQorCQkgICAgKHMtPmlvX2JpdHMgJiAoMSA8PCBjaGFuKSkgPyBDT01FRElfT1VUUFVUIDogQ09NRURJX0lOUFVUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCS8qIHdlIGRvbid0IHRlbGwgdGhlIGZpcm13YXJlIGhlcmUgYXMgaXQgd291bGQgdGFrZSA4IGZyYW1lcyAqLworCS8qIHRvIHN1Ym1pdCB0aGUgaW5mb3JtYXRpb24uIFdlIGRvIGl0IGluIHRoZSBpbnNuX2JpdHMuICovCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X2Rpb19pbnNuX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQlzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJdW5zaWduZWQgaW50ICpkYXRhKQoreworCisJc3RydWN0IHVzYmR1eHN1YiAqdGhpc191c2JkdXhzdWIgPSBkZXYtPnByaXZhdGU7CisJaW50IGVycjsKKworCWlmICghdGhpc191c2JkdXhzdWIpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGluc24tPm4gIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkb3duKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wcm9iZWQpKSB7CisJCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogVGhlIGluc24gZGF0YSBpcyBhIG1hc2sgaW4gZGF0YVswXSBhbmQgdGhlIG5ldyBkYXRhCisJICogaW4gZGF0YVsxXSwgZWFjaCBjaGFubmVsIGNvb3Jlc3BvbmRpbmcgdG8gYSBiaXQuICovCisJcy0+c3RhdGUgJj0gfmRhdGFbMF07CisJcy0+c3RhdGUgfD0gZGF0YVswXSAmIGRhdGFbMV07CisJLyogVGhlIGNvbW1hbmRzIGFyZSA4IGJpdHMgd2lkZSAqLworCXRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbMV0gPSAocy0+aW9fYml0cykgJiAweDAwMDAwMEZGOworCXRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbNF0gPSAocy0+c3RhdGUpICYgMHgwMDAwMDBGRjsKKwl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzJdID0gKChzLT5pb19iaXRzKSAmIDB4MDAwMEZGMDApID4+IDg7CisJdGhpc191c2JkdXhzdWItPmR1eF9jb21tYW5kc1s1XSA9ICgocy0+c3RhdGUpICYgMHgwMDAwRkYwMCkgPj4gODsKKwl0aGlzX3VzYmR1eHN1Yi0+ZHV4X2NvbW1hbmRzWzNdID0gKChzLT5pb19iaXRzKSAmIDB4MDBGRjAwMDApID4+IDE2OworCXRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbNl0gPSAoKHMtPnN0YXRlKSAmIDB4MDBGRjAwMDApID4+IDE2OworCisJLyogVGhpcyBjb21tYW5kIGFsc28gdGVsbHMgdGhlIGZpcm13YXJlIHRvIHJldHVybiAqLworCS8qIHRoZSBkaWdpdGFsIGlucHV0IGxpbmVzICovCisJZXJyID0gc2VuZF9kdXhfY29tbWFuZHModGhpc191c2JkdXhzdWIsIFNFTkRESU9CSVRTQ09NTUFORCk7CisJaWYgKGVyciA8IDApIHsKKwkJdXAoJnRoaXNfdXNiZHV4c3ViLT5zZW0pOworCQlyZXR1cm4gZXJyOworCX0KKwllcnIgPSByZWNlaXZlX2R1eF9jb21tYW5kcyh0aGlzX3VzYmR1eHN1YiwgU0VORERJT0JJVFNDT01NQU5EKTsKKwlpZiAoZXJyIDwgMCkgeworCQl1cCgmdGhpc191c2JkdXhzdWItPnNlbSk7CisJCXJldHVybiBlcnI7CisJfQorCisJZGF0YVsxXSA9ICgoKHVuc2lnbmVkIGludCkodGhpc191c2JkdXhzdWItPmluc25CdWZmZXJbMV0pKSYweGZmKSB8CisJCSgoKCh1bnNpZ25lZCBpbnQpKHRoaXNfdXNiZHV4c3ViLT5pbnNuQnVmZmVyWzJdKSkmMHhmZikgPDwgOCkgfAorCQkoKCgodW5zaWduZWQgaW50KSh0aGlzX3VzYmR1eHN1Yi0+aW5zbkJ1ZmZlclszXSkpJjB4ZmYpIDw8IDE2KTsKKworCXMtPnN0YXRlID0gZGF0YVsxXTsKKworCXVwKCZ0aGlzX3VzYmR1eHN1Yi0+c2VtKTsKKwlyZXR1cm4gMjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUFdNICovCisKK3N0YXRpYyBpbnQgdXNiZHV4c3ViX3VubGlua19Qd21VUkJzKHN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1Yl90bXApCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAodXNiZHV4c3ViX3RtcCAmJiB1c2JkdXhzdWJfdG1wLT51cmJQd20pIHsKKwkJaWYgKHVzYmR1eHN1Yl90bXAtPnVyYlB3bSkKKwkJCXVzYl9raWxsX3VyYih1c2JkdXhzdWJfdG1wLT51cmJQd20pOworCQlkZXZfZGJnKCZ1c2JkdXhzdWJfdG1wLT5pbnRlcmZhY2UtPmRldiwKKwkJCSJjb21lZGk6IHVubGlua2VkIFB3bVVSQjogcmVzPSVkXG4iLCBlcnIpOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKiBUaGlzIGNhbmNlbHMgYSBydW5uaW5nIGFjcXVpc2l0aW9uIG9wZXJhdGlvbgorICogaW4gYW55IGNvbnRleHQuCisgKi8KK3N0YXRpYyBpbnQgdXNiZHV4X3B3bV9zdG9wKHN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViLCBpbnQgZG9fdW5saW5rKQoreworCWludCByZXQgPSAwOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkZXZfZGJnKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGk6ICVzXG4iLCBfX2Z1bmNfXyk7CisJaWYgKGRvX3VubGluaykKKwkJcmV0ID0gdXNiZHV4c3ViX3VubGlua19Qd21VUkJzKHRoaXNfdXNiZHV4c3ViKTsKKworCXRoaXNfdXNiZHV4c3ViLT5wd21fY21kX3J1bm5pbmcgPSAwOworCisJcmV0dXJuIHJldDsKK30KKworLyogZm9yY2UgdW5saW5rIC0gaXMgY2FsbGVkIGJ5IGNvbWVkaSAqLworc3RhdGljIGludCB1c2JkdXhfcHdtX2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlpbnQgcmVzID0gMDsKKworCS8qIHVubGluayBvbmx5IGlmIGl0IGlzIHJlYWxseSBydW5uaW5nICovCisJcmVzID0gdXNiZHV4X3B3bV9zdG9wKHRoaXNfdXNiZHV4c3ViLCB0aGlzX3VzYmR1eHN1Yi0+cHdtX2NtZF9ydW5uaW5nKTsKKworCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJImNvbWVkaSAlZDogc2VuZGluZyBwd20gb2ZmIGNvbW1hbmQgdG8gdGhlIHVzYiBkZXZpY2UuXG4iLAorCQlkZXYtPm1pbm9yKTsKKwlyZXMgPSBzZW5kX2R1eF9jb21tYW5kcyh0aGlzX3VzYmR1eHN1YiwgU0VORFBXTU9GRik7CisJaWYgKHJlcyA8IDApCisJCXJldHVybiByZXM7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCB1c2JkdXhzdWJfcHdtX2lycShzdHJ1Y3QgdXJiICp1cmIpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YjsKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqdGhpc19jb21lZGlkZXY7CisJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CisKKwkvKiBwcmludGsoS0VSTl9ERUJVRyAiUFdNOiBJUlFcbiIpOyAqLworCisJLyogdGhlIGNvbnRleHQgdmFyaWFibGUgcG9pbnRzIHRvIHRoZSBzdWJkZXZpY2UgKi8KKwl0aGlzX2NvbWVkaWRldiA9IHVyYi0+Y29udGV4dDsKKwkvKiB0aGUgcHJpdmF0ZSBzdHJ1Y3R1cmUgb2YgdGhlIHN1YmRldmljZSBpcyBzdHJ1Y3QgdXNiZHV4c3ViICovCisJdGhpc191c2JkdXhzdWIgPSB0aGlzX2NvbWVkaWRldi0+cHJpdmF0ZTsKKworCXMgPSB0aGlzX2NvbWVkaWRldi0+c3ViZGV2aWNlcyArIFNVQkRFVl9EQTsKKworCXN3aXRjaCAodXJiLT5zdGF0dXMpIHsKKwljYXNlIDA6CisJCS8qIHN1Y2Nlc3MgKi8KKwkJYnJlYWs7CisKKwljYXNlIC1FQ09OTlJFU0VUOgorCWNhc2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJY2FzZSAtRUNPTk5BQk9SVEVEOgorCQkvKgorCQkgKiBhZnRlciBhbiB1bmxpbmsgY29tbWFuZCwgdW5wbHVnLCAuLi4gZXRjCisJCSAqIG5vIHVubGluayBuZWVkZWQgaGVyZS4gQWxyZWFkeSBzaHV0dGluZyBkb3duLgorCQkgKi8KKwkJaWYgKHRoaXNfdXNiZHV4c3ViLT5wd21fY21kX3J1bm5pbmcpCisJCQl1c2JkdXhfcHdtX3N0b3AodGhpc191c2JkdXhzdWIsIDApOworCisJCXJldHVybjsKKworCWRlZmF1bHQ6CisJCS8qIGEgcmVhbCBlcnJvciAqLworCQlpZiAodGhpc191c2JkdXhzdWItPnB3bV9jbWRfcnVubmluZykgeworCQkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJCSJjb21lZGlfOiBOb24temVybyB1cmIgc3RhdHVzIHJlY2VpdmVkIGluICIKKwkJCQkicHdtIGludHIgY29udGV4dDogJWRcbiIsIHVyYi0+c3RhdHVzKTsKKwkJCXVzYmR1eF9wd21fc3RvcCh0aGlzX3VzYmR1eHN1YiwgMCk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qIGFyZSB3ZSBhY3R1YWxseSBydW5uaW5nPyAqLworCWlmICghKHRoaXNfdXNiZHV4c3ViLT5wd21fY21kX3J1bm5pbmcpKQorCQlyZXR1cm47CisKKwl1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSB0aGlzX3VzYmR1eHN1Yi0+c2l6ZVB3bUJ1ZjsKKwl1cmItPmRldiA9IHRoaXNfdXNiZHV4c3ViLT51c2JkZXY7CisJdXJiLT5zdGF0dXMgPSAwOworCWlmICh0aGlzX3VzYmR1eHN1Yi0+cHdtX2NtZF9ydW5uaW5nKSB7CisJCXJldCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJImNvbWVkaV86IHB3bSB1cmIgcmVzdWJtIGZhaWxlZCBpbiBpbnQtY29udC4gIgorCQkJCSJyZXQ9JWQiLCByZXQpOworCQkJaWYgKHJldCA9PSBFTDJOU1lOQykKKwkJCQlkZXZfZXJyKCZ0aGlzX3VzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJCSJidWdneSBVU0IgaG9zdCBjb250cm9sbGVyIG9yIGJ1ZyBpbiAiCisJCQkJCSJJUlEgaGFuZGxpbmchXG4iKTsKKworCQkJLyogZG9uJ3QgZG8gYW4gdW5saW5rIGhlcmUgKi8KKwkJCXVzYmR1eF9wd21fc3RvcCh0aGlzX3VzYmR1eHN1YiwgMCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4c3ViX3N1Ym1pdF9Qd21VUkJzKHN0cnVjdCB1c2JkdXhzdWIgKnVzYmR1eHN1YikKK3sKKwlpbnQgZXJyRmxhZzsKKworCWlmICghdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRldl9kYmcoJnVzYmR1eHN1Yi0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGlfOiBzdWJtaXR0aW5nIHB3bS11cmJcbiIpOworCisJLyogaW4gY2FzZSBvZiBhIHJlc3VibWlzc2lvbiBhZnRlciBhbiB1bmxpbmsuLi4gKi8KKwl1c2JfZmlsbF9idWxrX3VyYih1c2JkdXhzdWItPnVyYlB3bSwKKwkJCSAgdXNiZHV4c3ViLT51c2JkZXYsCisJCQkgIHVzYl9zbmRidWxrcGlwZSh1c2JkdXhzdWItPnVzYmRldiwgUFdNX0VQKSwKKwkJCSAgdXNiZHV4c3ViLT51cmJQd20tPnRyYW5zZmVyX2J1ZmZlciwKKwkJCSAgdXNiZHV4c3ViLT5zaXplUHdtQnVmLCB1c2JkdXhzdWJfcHdtX2lycSwKKwkJCSAgdXNiZHV4c3ViLT5jb21lZGlkZXYpOworCisJZXJyRmxhZyA9IHVzYl9zdWJtaXRfdXJiKHVzYmR1eHN1Yi0+dXJiUHdtLCBHRlBfQVRPTUlDKTsKKwlpZiAoZXJyRmxhZykgeworCQlkZXZfZXJyKCZ1c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaV86IHVzYmR1eHNpZ21hOiBwd206IHVzYl9zdWJtaXRfdXJiIGVycm9yICVkXG4iLAorCQkJZXJyRmxhZyk7CisJCXJldHVybiBlcnJGbGFnOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JkdXhfcHdtX3BlcmlvZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgdW5zaWduZWQgaW50IHBlcmlvZCkKK3sKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKwlpbnQgZngyZGVsYXkgPSAyNTU7CisKKwlpZiAocGVyaW9kIDwgTUlOX1BXTV9QRVJJT0QpIHsKKwkJZGV2X2VycigmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiBpbGxlZ2FsIHBlcmlvZCBzZXR0aW5nIGZvciBwd20uXG4iLAorCQkJZGV2LT5taW5vcik7CisJCXJldHVybiAtRUFHQUlOOworCX0gZWxzZSB7CisJCWZ4MmRlbGF5ID0gcGVyaW9kIC8gKChpbnQpKDYgKiA1MTIgKiAoMS4wIC8gMC4wMzMpKSkgLSA2OworCQlpZiAoZngyZGVsYXkgPiAyNTUpIHsKKwkJCWRldl9lcnIoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwKKwkJCQkiY29tZWRpJWQ6IHBlcmlvZCAlZCBmb3IgcHdtIGlzIHRvbyBsb3cuXG4iLAorCQkJCWRldi0+bWlub3IsIHBlcmlvZCk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCX0KKwl0aGlzX3VzYmR1eHN1Yi0+cHdtRGVsYXkgPSBmeDJkZWxheTsKKwl0aGlzX3VzYmR1eHN1Yi0+cHdtUGVyaW9kID0gcGVyaW9kOworCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgIiVzOiBmcmVxdT0lZCwgcGVyaW9kPSVkXG4iLAorCQlfX2Z1bmNfXywgcGVyaW9kLCBmeDJkZWxheSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGlzIGNhbGxlZCBmcm9tIGluc24gc28gdGhlcmUncyBubyBuZWVkIHRvIGRvIGFsbCB0aGUgc2FuaXR5IGNoZWNrcyAqLworc3RhdGljIGludCB1c2JkdXhfcHdtX3N0YXJ0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJaW50IHJldCwgaTsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp0aGlzX3VzYmR1eHN1YiA9IGRldi0+cHJpdmF0ZTsKKworCWRldl9kYmcoJnRoaXNfdXNiZHV4c3ViLT5pbnRlcmZhY2UtPmRldiwgImNvbWVkaSVkOiAlc1xuIiwKKwkJZGV2LT5taW5vciwgX19mdW5jX18pOworCisJaWYgKHRoaXNfdXNiZHV4c3ViLT5wd21fY21kX3J1bm5pbmcpIHsKKwkJLyogYWxyZWFkeSBydW5uaW5nICovCisJCXJldHVybiAwOworCX0KKworCXRoaXNfdXNiZHV4c3ViLT5kdXhfY29tbWFuZHNbMV0gPSAoKHVpbnQ4X3QpIHRoaXNfdXNiZHV4c3ViLT5wd21EZWxheSk7CisJcmV0ID0gc2VuZF9kdXhfY29tbWFuZHModGhpc191c2JkdXhzdWIsIFNFTkRQV01PTik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBpbml0aWFsaXNlIHRoZSBidWZmZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdGhpc191c2JkdXhzdWItPnNpemVQd21CdWY7IGkrKykKKwkJKChjaGFyICopKHRoaXNfdXNiZHV4c3ViLT51cmJQd20tPnRyYW5zZmVyX2J1ZmZlcikpW2ldID0gMDsKKworCXRoaXNfdXNiZHV4c3ViLT5wd21fY21kX3J1bm5pbmcgPSAxOworCXJldCA9IHVzYmR1eHN1Yl9zdWJtaXRfUHdtVVJCcyh0aGlzX3VzYmR1eHN1Yik7CisJaWYgKHJldCA8IDApIHsKKwkJdGhpc191c2JkdXhzdWItPnB3bV9jbWRfcnVubmluZyA9IDA7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCisvKiBnZW5lcmF0ZXMgdGhlIGJpdCBwYXR0ZXJuIGZvciBQV00gd2l0aCB0aGUgb3B0aW9uYWwgc2lnbiBiaXQgKi8KK3N0YXRpYyBpbnQgdXNiZHV4X3B3bV9wYXR0ZXJuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgaW50IGNoYW5uZWwsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgdmFsdWUsIHVuc2lnbmVkIGludCBzaWduKQoreworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCWludCBpLCBzemJ1ZjsKKwljaGFyICpwQnVmOworCWNoYXIgcHdtX21hc2s7CisJY2hhciBzZ25fbWFzazsKKwljaGFyIGM7CisKKwlpZiAoIXRoaXNfdXNiZHV4c3ViKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIHRoaXMgaXMgdGhlIERJTyBiaXQgd2hpY2ggY2FycmllcyB0aGUgUFdNIGRhdGEgKi8KKwlwd21fbWFzayA9ICgxIDw8IGNoYW5uZWwpOworCS8qIHRoaXMgaXMgdGhlIERJTyBiaXQgd2hpY2ggY2FycmllcyB0aGUgb3B0aW9uYWwgZGlyZWN0aW9uIGJpdCAqLworCXNnbl9tYXNrID0gKDE2IDw8IGNoYW5uZWwpOworCS8qIHRoaXMgaXMgdGhlIGJ1ZmZlciB3aGljaCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSB3aXRoIGJpdCAqLworCS8qIHBhdHRlcm4gZm9yIG9uZSBwZXJpb2QgKi8KKwlzemJ1ZiA9IHRoaXNfdXNiZHV4c3ViLT5zaXplUHdtQnVmOworCXBCdWYgPSAoY2hhciAqKSh0aGlzX3VzYmR1eHN1Yi0+dXJiUHdtLT50cmFuc2Zlcl9idWZmZXIpOworCWZvciAoaSA9IDA7IGkgPCBzemJ1ZjsgaSsrKSB7CisJCWMgPSAqcEJ1ZjsKKwkJLyogcmVzZXQgYml0cyAqLworCQljID0gYyAmICh+cHdtX21hc2spOworCQkvKiBzZXQgdGhlIGJpdCBhcyBsb25nIGFzIHRoZSBpbmRleCBpcyBsb3dlciB0aGFuIHRoZSB2YWx1ZSAqLworCQlpZiAoaSA8IHZhbHVlKQorCQkJYyA9IGMgfCBwd21fbWFzazsKKwkJLyogc2V0IHRoZSBvcHRpb25hbCBzaWduIGJpdCBmb3IgYSByZWxheSAqLworCQlpZiAoIXNpZ24pIHsKKwkJCS8qIHBvc2l0aXZlIHZhbHVlICovCisJCQljID0gYyAmICh+c2duX21hc2spOworCQl9IGVsc2UgeworCQkJLyogbmVnYXRpdmUgdmFsdWUgKi8KKwkJCWMgPSBjIHwgc2duX21hc2s7CisJCX0KKwkJKihwQnVmKyspID0gYzsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdXNiZHV4X3B3bV93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQoreworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCisJaWYgKCF0aGlzX3VzYmR1eHN1YikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoKGluc24tPm4pICE9IDEpIHsKKwkJLyoKKwkJICogZG9lc24ndCBtYWtlIHNlbnNlIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSB2YWx1ZSBoZXJlIGJlY2F1c2UKKwkJICogaXQgd291bGQganVzdCBvdmVyd3JpdGUgdGhlIFBXTSBidWZmZXIgYSBjb3VwbGUgb2YgdGltZXMKKwkJICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogdGhlIHNpZ24gaXMgc2V0IHZpYSBhIHNwZWNpYWwgSU5TTiBvbmx5LCB0aGlzIGdpdmVzIHVzIDggYml0cyBmb3IKKwkgKiBub3JtYWwgb3BlcmF0aW9uCisJICogcmVsYXkgc2lnbiAwIGJ5IGRlZmF1bHQKKwkgKi8KKwlyZXR1cm4gdXNiZHV4X3B3bV9wYXR0ZXJuKGRldiwgcywgQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyksIGRhdGFbMF0sIDApOworfQorCitzdGF0aWMgaW50IHVzYmR1eF9wd21fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqeDEsCisJCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqeDIsIHN0cnVjdCBjb21lZGlfaW5zbiAqeDMsCisJCQkgICB1bnNpZ25lZCBpbnQgKng0KQoreworCS8qIG5vdCBuZWVkZWQgKi8KKwlyZXR1cm4gLUVJTlZBTDsKK307CisKKy8qIHN3aXRjaGVzIG9uL29mZiBQV00gKi8KK3N0YXRpYyBpbnQgdXNiZHV4X3B3bV9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQoreworCXN0cnVjdCB1c2JkdXhzdWIgKnRoaXNfdXNiZHV4c3ViID0gZGV2LT5wcml2YXRlOworCXN3aXRjaCAoZGF0YVswXSkgeworCWNhc2UgSU5TTl9DT05GSUdfQVJNOgorCQkvKiBzd2l0Y2ggaXQgb24gKi8KKwkJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiAlczogcHdtIG9uXG4iLCBkZXYtPm1pbm9yLCBfX2Z1bmNfXyk7CisJCS8qCisJCSAqIGlmIG5vdCB6ZXJvIHRoZSBQV00gaXMgbGltaXRlZCB0byBhIGNlcnRhaW4gdGltZSB3aGljaCBpcworCQkgKiBub3Qgc3VwcG9ydGVkIGhlcmUKKwkJICovCisJCWlmIChkYXRhWzFdICE9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIHVzYmR1eF9wd21fc3RhcnQoZGV2LCBzKTsKKwljYXNlIElOU05fQ09ORklHX0RJU0FSTToKKwkJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiAlczogcHdtIG9mZlxuIiwgZGV2LT5taW5vciwgX19mdW5jX18pOworCQlyZXR1cm4gdXNiZHV4X3B3bV9jYW5jZWwoZGV2LCBzKTsKKwljYXNlIElOU05fQ09ORklHX0dFVF9QV01fU1RBVFVTOgorCQkvKgorCQkgKiB0byBjaGVjayBpZiB0aGUgVVNCIHRyYW5zbWlzc2lvbiBoYXMgZmFpbGVkIG9yIGluIGNhc2UgUFdNCisJCSAqIHdhcyBsaW1pdGVkIHRvIG4gY3ljbGVzIHRvIGNoZWNrIGlmIGl0IGhhcyB0ZXJtaW5hdGVkCisJCSAqLworCQlkYXRhWzFdID0gdGhpc191c2JkdXhzdWItPnB3bV9jbWRfcnVubmluZzsKKwkJcmV0dXJuIDA7CisJY2FzZSBJTlNOX0NPTkZJR19QV01fU0VUX1BFUklPRDoKKwkJZGV2X2RiZygmdGhpc191c2JkdXhzdWItPmludGVyZmFjZS0+ZGV2LAorCQkJImNvbWVkaSVkOiAlczogc2V0dGluZyBwZXJpb2RcbiIsIGRldi0+bWlub3IsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiB1c2JkdXhfcHdtX3BlcmlvZChkZXYsIHMsIGRhdGFbMV0pOworCWNhc2UgSU5TTl9DT05GSUdfUFdNX0dFVF9QRVJJT0Q6CisJCWRhdGFbMV0gPSB0aGlzX3VzYmR1eHN1Yi0+cHdtUGVyaW9kOworCQlyZXR1cm4gMDsKKwljYXNlIElOU05fQ09ORklHX1BXTV9TRVRfSF9CUklER0U6CisJCS8qIHZhbHVlIGluIHRoZSBmaXJzdCBieXRlIGFuZCB0aGUgc2lnbiBpbiB0aGUgc2Vjb25kIGZvciBhCisJCSAgIHJlbGF5ICovCisJCXJldHVybiB1c2JkdXhfcHdtX3BhdHRlcm4oZGV2LCBzLAorCQkJCQkgIC8qIHRoZSBjaGFubmVsIG51bWJlciAqLworCQkJCQkgIENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpLAorCQkJCQkgIC8qIGFjdHVhbCBQV00gZGF0YSAqLworCQkJCQkgIGRhdGFbMV0sCisJCQkJCSAgLyoganVzdCBhIHNpZ24gKi8KKwkJCQkJICAoZGF0YVsyXSAhPSAwKSk7CisJY2FzZSBJTlNOX0NPTkZJR19QV01fR0VUX0hfQlJJREdFOgorCQkvKiB2YWx1ZXMgYXJlIG5vdCBrZXB0IGluIHRoaXMgZHJpdmVyLCBub3RoaW5nIHRvIHJldHVybiAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qIGVuZCBvZiBQV00gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgdGlkeV91cChzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWJfdG1wKQoreworCWludCBpOworCisJaWYgKCF1c2JkdXhzdWJfdG1wKQorCQlyZXR1cm47CisJZGV2X2RiZygmdXNiZHV4c3ViX3RtcC0+aW50ZXJmYWNlLT5kZXYsICJjb21lZGlfOiB0aWRpbmcgdXBcbiIpOworCisJLyogc2hvd3MgdGhlIHVzYiBzdWJzeXN0ZW0gdGhhdCB0aGUgZHJpdmVyIGlzIGRvd24gKi8KKwlpZiAodXNiZHV4c3ViX3RtcC0+aW50ZXJmYWNlKQorCQl1c2Jfc2V0X2ludGZkYXRhKHVzYmR1eHN1Yl90bXAtPmludGVyZmFjZSwgTlVMTCk7CisKKwl1c2JkdXhzdWJfdG1wLT5wcm9iZWQgPSAwOworCisJaWYgKHVzYmR1eHN1Yl90bXAtPnVyYkluKSB7CisJCWlmICh1c2JkdXhzdWJfdG1wLT5haV9jbWRfcnVubmluZykgeworCQkJdXNiZHV4c3ViX3RtcC0+YWlfY21kX3J1bm5pbmcgPSAwOworCQkJdXNiZHV4c3ViX3VubGlua19JblVSQnModXNiZHV4c3ViX3RtcCk7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IHVzYmR1eHN1Yl90bXAtPm51bU9mSW5CdWZmZXJzOyBpKyspIHsKKwkJCWtmcmVlKHVzYmR1eHN1Yl90bXAtPnVyYkluW2ldLT50cmFuc2Zlcl9idWZmZXIpOworCQkJdXNiZHV4c3ViX3RtcC0+dXJiSW5baV0tPnRyYW5zZmVyX2J1ZmZlciA9IE5VTEw7CisJCQl1c2Jfa2lsbF91cmIodXNiZHV4c3ViX3RtcC0+dXJiSW5baV0pOworCQkJdXNiX2ZyZWVfdXJiKHVzYmR1eHN1Yl90bXAtPnVyYkluW2ldKTsKKwkJCXVzYmR1eHN1Yl90bXAtPnVyYkluW2ldID0gTlVMTDsKKwkJfQorCQlrZnJlZSh1c2JkdXhzdWJfdG1wLT51cmJJbik7CisJCXVzYmR1eHN1Yl90bXAtPnVyYkluID0gTlVMTDsKKwl9CisJaWYgKHVzYmR1eHN1Yl90bXAtPnVyYk91dCkgeworCQlpZiAodXNiZHV4c3ViX3RtcC0+YW9fY21kX3J1bm5pbmcpIHsKKwkJCXVzYmR1eHN1Yl90bXAtPmFvX2NtZF9ydW5uaW5nID0gMDsKKwkJCXVzYmR1eHN1Yl91bmxpbmtfT3V0VVJCcyh1c2JkdXhzdWJfdG1wKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgdXNiZHV4c3ViX3RtcC0+bnVtT2ZPdXRCdWZmZXJzOyBpKyspIHsKKwkJCWlmICh1c2JkdXhzdWJfdG1wLT51cmJPdXRbaV0tPnRyYW5zZmVyX2J1ZmZlcikgeworCQkJCWtmcmVlKHVzYmR1eHN1Yl90bXAtPgorCQkJCSAgICAgIHVyYk91dFtpXS0+dHJhbnNmZXJfYnVmZmVyKTsKKwkJCQl1c2JkdXhzdWJfdG1wLT51cmJPdXRbaV0tPnRyYW5zZmVyX2J1ZmZlciA9CisJCQkJICAgIE5VTEw7CisJCQl9CisJCQlpZiAodXNiZHV4c3ViX3RtcC0+dXJiT3V0W2ldKSB7CisJCQkJdXNiX2tpbGxfdXJiKHVzYmR1eHN1Yl90bXAtPnVyYk91dFtpXSk7CisJCQkJdXNiX2ZyZWVfdXJiKHVzYmR1eHN1Yl90bXAtPnVyYk91dFtpXSk7CisJCQkJdXNiZHV4c3ViX3RtcC0+dXJiT3V0W2ldID0gTlVMTDsKKwkJCX0KKwkJfQorCQlrZnJlZSh1c2JkdXhzdWJfdG1wLT51cmJPdXQpOworCQl1c2JkdXhzdWJfdG1wLT51cmJPdXQgPSBOVUxMOworCX0KKwlpZiAodXNiZHV4c3ViX3RtcC0+dXJiUHdtKSB7CisJCWlmICh1c2JkdXhzdWJfdG1wLT5wd21fY21kX3J1bm5pbmcpIHsKKwkJCXVzYmR1eHN1Yl90bXAtPnB3bV9jbWRfcnVubmluZyA9IDA7CisJCQl1c2JkdXhzdWJfdW5saW5rX1B3bVVSQnModXNiZHV4c3ViX3RtcCk7CisJCX0KKwkJa2ZyZWUodXNiZHV4c3ViX3RtcC0+dXJiUHdtLT50cmFuc2Zlcl9idWZmZXIpOworCQl1c2JkdXhzdWJfdG1wLT51cmJQd20tPnRyYW5zZmVyX2J1ZmZlciA9IE5VTEw7CisJCXVzYl9raWxsX3VyYih1c2JkdXhzdWJfdG1wLT51cmJQd20pOworCQl1c2JfZnJlZV91cmIodXNiZHV4c3ViX3RtcC0+dXJiUHdtKTsKKwkJdXNiZHV4c3ViX3RtcC0+dXJiUHdtID0gTlVMTDsKKwl9CisJa2ZyZWUodXNiZHV4c3ViX3RtcC0+aW5CdWZmZXIpOworCXVzYmR1eHN1Yl90bXAtPmluQnVmZmVyID0gTlVMTDsKKwlrZnJlZSh1c2JkdXhzdWJfdG1wLT5pbnNuQnVmZmVyKTsKKwl1c2JkdXhzdWJfdG1wLT5pbnNuQnVmZmVyID0gTlVMTDsKKwlrZnJlZSh1c2JkdXhzdWJfdG1wLT5vdXRCdWZmZXIpOworCXVzYmR1eHN1Yl90bXAtPm91dEJ1ZmZlciA9IE5VTEw7CisJa2ZyZWUodXNiZHV4c3ViX3RtcC0+ZGFjX2NvbW1hbmRzKTsKKwl1c2JkdXhzdWJfdG1wLT5kYWNfY29tbWFuZHMgPSBOVUxMOworCWtmcmVlKHVzYmR1eHN1Yl90bXAtPmR1eF9jb21tYW5kcyk7CisJdXNiZHV4c3ViX3RtcC0+ZHV4X2NvbW1hbmRzID0gTlVMTDsKKwl1c2JkdXhzdWJfdG1wLT5haV9jbWRfcnVubmluZyA9IDA7CisJdXNiZHV4c3ViX3RtcC0+YW9fY21kX3J1bm5pbmcgPSAwOworCXVzYmR1eHN1Yl90bXAtPnB3bV9jbWRfcnVubmluZyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHVzYmR1eF9maXJtd2FyZV9yZXF1ZXN0X2NvbXBsZXRlX2hhbmRsZXIoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywKKwkJCQkJCSAgICAgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWJfdG1wID0gY29udGV4dDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiZGV2ID0gdXNiZHV4c3ViX3RtcC0+dXNiZGV2OworCWludCByZXQ7CisKKwlpZiAoZncgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZ1c2JkZXYtPmRldiwKKwkJCSJGaXJtd2FyZSBjb21wbGV0ZSBoYW5kbGVyIHdpdGhvdXQgZmlybXdhcmUhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogd2UgbmVlZCB0byB1cGxvYWQgdGhlIGZpcm13YXJlIGhlcmUgYmVjYXVzZSBmdyB3aWxsIGJlCisJICogZnJlZWQgb25jZSB3ZSd2ZSBsZWZ0IHRoaXMgZnVuY3Rpb24KKwkgKi8KKwlyZXQgPSBmaXJtd2FyZVVwbG9hZCh1c2JkdXhzdWJfdG1wLCBmdy0+ZGF0YSwgZnctPnNpemUpOworCisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZ1c2JkZXYtPmRldiwKKwkJCSJDb3VsZCBub3QgdXBsb2FkIGZpcm13YXJlIChlcnI9JWQpXG4iLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisJY29tZWRpX3VzYl9hdXRvX2NvbmZpZyh1c2JkZXYsIEJPQVJETkFNRSk7CitvdXQ6CisJcmVsZWFzZV9maXJtd2FyZShmdyk7Cit9CisKKy8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHVyYnMgYW5kIGluaXRpYWxpc2UgdGhlbSAqLworc3RhdGljIGludCB1c2JkdXhzaWdtYV9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdWludGVyZiwKKwkJCSAgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYodWludGVyZik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnVpbnRlcmYtPmRldjsKKwlpbnQgaTsKKwlpbnQgaW5kZXg7CisJaW50IHJldDsKKworCWRldl9kYmcoZGV2LCAiY29tZWRpXzogdXNiZHV4XzogIgorCQkiZmluZGluZyBhIGZyZWUgc3RydWN0dXJlIGZvciB0aGUgdXNiLWRldmljZVxuIik7CisKKwlkb3duKCZzdGFydF9zdG9wX3NlbSk7CisJLyogbG9vayBmb3IgYSBmcmVlIHBsYWNlIGluIHRoZSB1c2JkdXggYXJyYXkgKi8KKwlpbmRleCA9IC0xOworCWZvciAoaSA9IDA7IGkgPCBOVU1VU0JEVVg7IGkrKykgeworCQlpZiAoISh1c2JkdXhzdWJbaV0ucHJvYmVkKSkgeworCQkJaW5kZXggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBubyBtb3JlIHNwYWNlICovCisJaWYgKGluZGV4ID09IC0xKSB7CisJCWRldl9lcnIoZGV2LCAiVG9vIG1hbnkgdXNiZHV4c2lnbWEtZGV2aWNlcyBjb25uZWN0ZWQuXG4iKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTUZJTEU7CisJfQorCWRldl9kYmcoZGV2LCAiY29tZWRpXzogdXNiZHV4OiAiCisJCSJ1c2JkdXhzdWJbJWRdIGlzIHJlYWR5IHRvIGNvbm5lY3QgdG8gY29tZWRpLlxuIiwgaW5kZXgpOworCisJc2VtYV9pbml0KCYodXNiZHV4c3ViW2luZGV4XS5zZW0pLCAxKTsKKwkvKiBzYXZlIGEgcG9pbnRlciB0byB0aGUgdXNiIGRldmljZSAqLworCXVzYmR1eHN1YltpbmRleF0udXNiZGV2ID0gdWRldjsKKworCS8qIHNhdmUgdGhlIGludGVyZmFjZSBpdHNlbGYgKi8KKwl1c2JkdXhzdWJbaW5kZXhdLmludGVyZmFjZSA9IHVpbnRlcmY7CisJLyogZ2V0IHRoZSBpbnRlcmZhY2UgbnVtYmVyIGZyb20gdGhlIGludGVyZmFjZSAqLworCXVzYmR1eHN1YltpbmRleF0uaWZudW0gPSB1aW50ZXJmLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CisJLyogaGFuZCB0aGUgcHJpdmF0ZSBkYXRhIG92ZXIgdG8gdGhlIHVzYiBzdWJzeXN0ZW0gKi8KKwkvKiB3aWxsIGJlIG5lZWRlZCBmb3IgZGlzY29ubmVjdCAqLworCXVzYl9zZXRfaW50ZmRhdGEodWludGVyZiwgJih1c2JkdXhzdWJbaW5kZXhdKSk7CisKKwlkZXZfZGJnKGRldiwgImNvbWVkaV86IHVzYmR1eDogaWZudW09JWRcbiIsIHVzYmR1eHN1YltpbmRleF0uaWZudW0pOworCisJLyogdGVzdCBpZiBpdCBpcyBoaWdoIHNwZWVkIChVU0IgMi4wKSAqLworCXVzYmR1eHN1YltpbmRleF0uaGlnaF9zcGVlZCA9CisJICAgICh1c2JkdXhzdWJbaW5kZXhdLnVzYmRldi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpOworCisJLyogY3JlYXRlIHNwYWNlIGZvciB0aGUgY29tbWFuZHMgb2YgdGhlIERBIGNvbnZlcnRlciAqLworCXVzYmR1eHN1YltpbmRleF0uZGFjX2NvbW1hbmRzID0ga3phbGxvYyhOVU1PVVRDSEFOTkVMUywgR0ZQX0tFUk5FTCk7CisJaWYgKCF1c2JkdXhzdWJbaW5kZXhdLmRhY19jb21tYW5kcykgeworCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eHNpZ21hOiAiCisJCQkiZXJyb3IgYWxsb2Mgc3BhY2UgZm9yIGRhYyBjb21tYW5kc1xuIik7CisJCXRpZHlfdXAoJih1c2JkdXhzdWJbaW5kZXhdKSk7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiBjcmVhdGUgc3BhY2UgZm9yIHRoZSBjb21tYW5kcyBnb2luZyB0byB0aGUgdXNiIGRldmljZSAqLworCXVzYmR1eHN1YltpbmRleF0uZHV4X2NvbW1hbmRzID0ga3phbGxvYyhTSVpFT0ZEVVhCVUZGRVIsIEdGUF9LRVJORUwpOworCWlmICghdXNiZHV4c3ViW2luZGV4XS5kdXhfY29tbWFuZHMpIHsKKwkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXhzaWdtYTogIgorCQkJImVycm9yIGFsbG9jIHNwYWNlIGZvciBkdXggY29tbWFuZHNcbiIpOworCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogY3JlYXRlIHNwYWNlIGZvciB0aGUgaW4gYnVmZmVyIGFuZCBzZXQgaXQgdG8gemVybyAqLworCXVzYmR1eHN1YltpbmRleF0uaW5CdWZmZXIgPSBremFsbG9jKFNJWkVJTkJVRiwgR0ZQX0tFUk5FTCk7CisJaWYgKCEodXNiZHV4c3ViW2luZGV4XS5pbkJ1ZmZlcikpIHsKKwkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXhzaWdtYTogIgorCQkJImNvdWxkIG5vdCBhbGxvYyBzcGFjZSBmb3IgaW5CdWZmZXJcbiIpOworCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogY3JlYXRlIHNwYWNlIG9mIHRoZSBpbnN0cnVjdGlvbiBidWZmZXIgKi8KKwl1c2JkdXhzdWJbaW5kZXhdLmluc25CdWZmZXIgPSBremFsbG9jKFNJWkVJTlNOQlVGLCBHRlBfS0VSTkVMKTsKKwlpZiAoISh1c2JkdXhzdWJbaW5kZXhdLmluc25CdWZmZXIpKSB7CisJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4c2lnbWE6ICIKKwkJCSJjb3VsZCBub3QgYWxsb2Mgc3BhY2UgZm9yIGluc25CdWZmZXJcbiIpOworCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogY3JlYXRlIHNwYWNlIGZvciB0aGUgb3V0YnVmZmVyICovCisJdXNiZHV4c3ViW2luZGV4XS5vdXRCdWZmZXIgPSBremFsbG9jKFNJWkVPVVRCVUYsIEdGUF9LRVJORUwpOworCWlmICghKHVzYmR1eHN1YltpbmRleF0ub3V0QnVmZmVyKSkgeworCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eHNpZ21hOiAiCisJCQkiY291bGQgbm90IGFsbG9jIHNwYWNlIGZvciBvdXRCdWZmZXJcbiIpOworCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogc2V0dGluZyB0byBhbHRlcm5hdGUgc2V0dGluZyAzOiBlbmFibGluZyBpc28gZXAgYW5kIGJ1bGsgZXAuICovCisJaSA9IHVzYl9zZXRfaW50ZXJmYWNlKHVzYmR1eHN1YltpbmRleF0udXNiZGV2LAorCQkJICAgICAgdXNiZHV4c3ViW2luZGV4XS5pZm51bSwgMyk7CisJaWYgKGkgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4c2lnbWElZDogIgorCQkJImNvdWxkIG5vdCBzZXQgYWx0ZXJuYXRlIHNldHRpbmcgMyBpbiBoaWdoIHNwZWVkLlxuIiwKKwkJCWluZGV4KTsKKwkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmICh1c2JkdXhzdWJbaW5kZXhdLmhpZ2hfc3BlZWQpCisJCXVzYmR1eHN1YltpbmRleF0ubnVtT2ZJbkJ1ZmZlcnMgPSBOVU1PRklOQlVGRkVSU0hJR0g7CisJZWxzZQorCQl1c2JkdXhzdWJbaW5kZXhdLm51bU9mSW5CdWZmZXJzID0gTlVNT0ZJTkJVRkZFUlNGVUxMOworCisJdXNiZHV4c3ViW2luZGV4XS51cmJJbiA9CisJICAgIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1cmIgKikgKiB1c2JkdXhzdWJbaW5kZXhdLm51bU9mSW5CdWZmZXJzLAorCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCEodXNiZHV4c3ViW2luZGV4XS51cmJJbikpIHsKKwkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXhzaWdtYTogIgorCQkJIkNvdWxkIG5vdCBhbGxvYy4gdXJiSW4gYXJyYXlcbiIpOworCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZm9yIChpID0gMDsgaSA8IHVzYmR1eHN1YltpbmRleF0ubnVtT2ZJbkJ1ZmZlcnM7IGkrKykgeworCQkvKiBvbmUgZnJhbWU6IDFtcyAqLworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldID0gdXNiX2FsbG9jX3VyYigxLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHVzYmR1eHN1YltpbmRleF0udXJiSW5baV0gPT0gTlVMTCkgeworCQkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXhzaWdtYSVkOiAiCisJCQkJIkNvdWxkIG5vdCBhbGxvYy4gdXJiKCVkKVxuIiwgaW5kZXgsIGkpOworCQkJdGlkeV91cCgmKHVzYmR1eHN1YltpbmRleF0pKTsKKwkJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQl1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldLT5kZXYgPSB1c2JkdXhzdWJbaW5kZXhdLnVzYmRldjsKKwkJLyogd2lsbCBiZSBmaWxsZWQgbGF0ZXIgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIGNvbWVkaS1kZXZpY2UgKi8KKwkJLyogYW5kIE9OTFkgdGhlbiB0aGUgdXJiIHNob3VsZCBiZSBzdWJtaXR0ZWQgKi8KKwkJdXNiZHV4c3ViW2luZGV4XS51cmJJbltpXS0+Y29udGV4dCA9IE5VTEw7CisJCXVzYmR1eHN1YltpbmRleF0udXJiSW5baV0tPnBpcGUgPQorCQkgICAgdXNiX3Jjdmlzb2NwaXBlKHVzYmR1eHN1YltpbmRleF0udXNiZGV2LCBJU09JTkVQKTsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJJbltpXS0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7CisJCXVzYmR1eHN1YltpbmRleF0udXJiSW5baV0tPnRyYW5zZmVyX2J1ZmZlciA9CisJCSAgICBremFsbG9jKFNJWkVJTkJVRiwgR0ZQX0tFUk5FTCk7CisJCWlmICghKHVzYmR1eHN1YltpbmRleF0udXJiSW5baV0tPnRyYW5zZmVyX2J1ZmZlcikpIHsKKwkJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4c2lnbWElZDogIgorCQkJCSJjb3VsZCBub3QgYWxsb2MuIHRyYW5zYi5cbiIsIGluZGV4KTsKKwkJCXRpZHlfdXAoJih1c2JkdXhzdWJbaW5kZXhdKSk7CisJCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJdXNiZHV4c3ViW2luZGV4XS51cmJJbltpXS0+Y29tcGxldGUgPSB1c2JkdXhzdWJfYWlfSXNvY0lycTsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJJbltpXS0+bnVtYmVyX29mX3BhY2tldHMgPSAxOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gU0laRUlOQlVGOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldLT5pc29fZnJhbWVfZGVzY1swXS5vZmZzZXQgPSAwOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYkluW2ldLT5pc29fZnJhbWVfZGVzY1swXS5sZW5ndGggPQorCQkJU0laRUlOQlVGOworCX0KKworCS8qIG91dCAqLworCWlmICh1c2JkdXhzdWJbaW5kZXhdLmhpZ2hfc3BlZWQpCisJCXVzYmR1eHN1YltpbmRleF0ubnVtT2ZPdXRCdWZmZXJzID0gTlVNT0ZPVVRCVUZGRVJTSElHSDsKKwllbHNlCisJCXVzYmR1eHN1YltpbmRleF0ubnVtT2ZPdXRCdWZmZXJzID0gTlVNT0ZPVVRCVUZGRVJTRlVMTDsKKworCXVzYmR1eHN1YltpbmRleF0udXJiT3V0ID0KKwkgICAga3phbGxvYyhzaXplb2Yoc3RydWN0IHVyYiAqKSAqIHVzYmR1eHN1YltpbmRleF0ubnVtT2ZPdXRCdWZmZXJzLAorCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCEodXNiZHV4c3ViW2luZGV4XS51cmJPdXQpKSB7CisJCWRldl9lcnIoZGV2LCAiY29tZWRpXzogdXNiZHV4c2lnbWE6ICIKKwkJCSJDb3VsZCBub3QgYWxsb2MuIHVyYk91dCBhcnJheVxuIik7CisJCXRpZHlfdXAoJih1c2JkdXhzdWJbaW5kZXhdKSk7CisJCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgdXNiZHV4c3ViW2luZGV4XS5udW1PZk91dEJ1ZmZlcnM7IGkrKykgeworCQkvKiBvbmUgZnJhbWU6IDFtcyAqLworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXSA9IHVzYl9hbGxvY191cmIoMSwgR0ZQX0tFUk5FTCk7CisJCWlmICh1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXSA9PSBOVUxMKSB7CisJCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eHNpZ21hJWQ6ICIKKwkJCQkiQ291bGQgbm90IGFsbG9jLiB1cmIoJWQpXG4iLCBpbmRleCwgaSk7CisJCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXVzYmR1eHN1YltpbmRleF0udXJiT3V0W2ldLT5kZXYgPSB1c2JkdXhzdWJbaW5kZXhdLnVzYmRldjsKKwkJLyogd2lsbCBiZSBmaWxsZWQgbGF0ZXIgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIGNvbWVkaS1kZXZpY2UgKi8KKwkJLyogYW5kIE9OTFkgdGhlbiB0aGUgdXJiIHNob3VsZCBiZSBzdWJtaXR0ZWQgKi8KKwkJdXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0tPmNvbnRleHQgPSBOVUxMOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+cGlwZSA9CisJCSAgICB1c2Jfc25kaXNvY3BpcGUodXNiZHV4c3ViW2luZGV4XS51c2JkZXYsIElTT09VVEVQKTsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0tPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+dHJhbnNmZXJfYnVmZmVyID0KKwkJICAgIGt6YWxsb2MoU0laRU9VVEJVRiwgR0ZQX0tFUk5FTCk7CisJCWlmICghKHVzYmR1eHN1YltpbmRleF0udXJiT3V0W2ldLT50cmFuc2Zlcl9idWZmZXIpKSB7CisJCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eHNpZ21hJWQ6ICIKKwkJCQkiY291bGQgbm90IGFsbG9jLiB0cmFuc2IuXG4iLCBpbmRleCk7CisJCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXVzYmR1eHN1YltpbmRleF0udXJiT3V0W2ldLT5jb21wbGV0ZSA9IHVzYmR1eHN1Yl9hb19Jc29jSXJxOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+bnVtYmVyX29mX3BhY2tldHMgPSAxOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9CisJCQlTSVpFT1VUQlVGOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+aXNvX2ZyYW1lX2Rlc2NbMF0ub2Zmc2V0ID0gMDsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJPdXRbaV0tPmlzb19mcmFtZV9kZXNjWzBdLmxlbmd0aCA9CisJCSAgICBTSVpFT1VUQlVGOworCQlpZiAodXNiZHV4c3ViW2luZGV4XS5oaWdoX3NwZWVkKSB7CisJCQkvKiB1ZnJhbWVzICovCisJCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+aW50ZXJ2YWwgPSA4OworCQl9IGVsc2UgeworCQkJLyogZnJhbWVzICovCisJCQl1c2JkdXhzdWJbaW5kZXhdLnVyYk91dFtpXS0+aW50ZXJ2YWwgPSAxOworCQl9CisJfQorCisJLyogcHdtICovCisJaWYgKHVzYmR1eHN1YltpbmRleF0uaGlnaF9zcGVlZCkgeworCQkvKiBtYXggYnVsayBlcCBzaXplIGluIGhpZ2ggc3BlZWQgKi8KKwkJdXNiZHV4c3ViW2luZGV4XS5zaXplUHdtQnVmID0gNTEyOworCQl1c2JkdXhzdWJbaW5kZXhdLnVyYlB3bSA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJCWlmICh1c2JkdXhzdWJbaW5kZXhdLnVyYlB3bSA9PSBOVUxMKSB7CisJCQlkZXZfZXJyKGRldiwgImNvbWVkaV86IHVzYmR1eHNpZ21hJWQ6ICIKKwkJCQkiQ291bGQgbm90IGFsbG9jLiBwd20gdXJiXG4iLCBpbmRleCk7CisJCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXVzYmR1eHN1YltpbmRleF0udXJiUHdtLT50cmFuc2Zlcl9idWZmZXIgPQorCQkgICAga3phbGxvYyh1c2JkdXhzdWJbaW5kZXhdLnNpemVQd21CdWYsIEdGUF9LRVJORUwpOworCQlpZiAoISh1c2JkdXhzdWJbaW5kZXhdLnVyYlB3bS0+dHJhbnNmZXJfYnVmZmVyKSkgeworCQkJZGV2X2VycihkZXYsICJjb21lZGlfOiB1c2JkdXhzaWdtYSVkOiAiCisJCQkJImNvdWxkIG5vdCBhbGxvYy4gdHJhbnNiLiBmb3IgcHdtXG4iLCBpbmRleCk7CisJCQl0aWR5X3VwKCYodXNiZHV4c3ViW2luZGV4XSkpOworCQkJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfSBlbHNlIHsKKwkJdXNiZHV4c3ViW2luZGV4XS51cmJQd20gPSBOVUxMOworCQl1c2JkdXhzdWJbaW5kZXhdLnNpemVQd21CdWYgPSAwOworCX0KKworCXVzYmR1eHN1YltpbmRleF0uYWlfY21kX3J1bm5pbmcgPSAwOworCXVzYmR1eHN1YltpbmRleF0uYW9fY21kX3J1bm5pbmcgPSAwOworCXVzYmR1eHN1YltpbmRleF0ucHdtX2NtZF9ydW5uaW5nID0gMDsKKworCS8qIHdlJ3ZlIHJlYWNoZWQgdGhlIGJvdHRvbSBvZiB0aGUgZnVuY3Rpb24gKi8KKwl1c2JkdXhzdWJbaW5kZXhdLnByb2JlZCA9IDE7CisJdXAoJnN0YXJ0X3N0b3Bfc2VtKTsKKworCXJldCA9IHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KFRISVNfTU9EVUxFLAorCQkJCSAgICAgIEZXX0FDVElPTl9IT1RQTFVHLAorCQkJCSAgICAgICJ1c2JkdXhzaWdtYV9maXJtd2FyZS5iaW4iLAorCQkJCSAgICAgICZ1ZGV2LT5kZXYsCisJCQkJICAgICAgR0ZQX0tFUk5FTCwKKwkJCQkgICAgICB1c2JkdXhzdWIgKyBpbmRleCwKKwkJCQkgICAgICB1c2JkdXhfZmlybXdhcmVfcmVxdWVzdF9jb21wbGV0ZV9oYW5kbGVyCisJCQkJICAgICAgKTsKKworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJDb3VsZCBub3QgbG9hZCBmaXJtd2FyZSAoZXJyPSVkKVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkZXZfaW5mbyhkZXYsICJjb21lZGlfOiBzdWNjZXNzZnVsbHkgaW5pdGlhbGlzZWQuXG4iKTsKKwkvKiBzdWNjZXNzICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVzYmR1eHNpZ21hX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHVzYmR1eHN1YiAqdXNiZHV4c3ViX3RtcCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCisJaWYgKCF1c2JkdXhzdWJfdG1wKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwKKwkJCSJjb21lZGlfOiBkaXNjb25uZWN0IGNhbGxlZCB3aXRoIG51bGwgcG9pbnRlci5cbiIpOworCQlyZXR1cm47CisJfQorCWlmICh1c2JkdXhzdWJfdG1wLT51c2JkZXYgIT0gdWRldikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJjb21lZGlfOiBCVUchIHdyb25nIHB0ciFcbiIpOworCQlyZXR1cm47CisJfQorCWlmICh1c2JkdXhzdWJfdG1wLT5haV9jbWRfcnVubmluZykKKwkJLyogd2UgYXJlIHN0aWxsIHJ1bm5pbmcgYSBjb21tYW5kICovCisJCXVzYmR1eF9haV9zdG9wKHVzYmR1eHN1Yl90bXAsIDEpOworCWlmICh1c2JkdXhzdWJfdG1wLT5hb19jbWRfcnVubmluZykKKwkJLyogd2UgYXJlIHN0aWxsIHJ1bm5pbmcgYSBjb21tYW5kICovCisJCXVzYmR1eF9hb19zdG9wKHVzYmR1eHN1Yl90bXAsIDEpOworCWNvbWVkaV91c2JfYXV0b191bmNvbmZpZyh1ZGV2KTsKKwlkb3duKCZzdGFydF9zdG9wX3NlbSk7CisJZG93bigmdXNiZHV4c3ViX3RtcC0+c2VtKTsKKwl0aWR5X3VwKHVzYmR1eHN1Yl90bXApOworCXVwKCZ1c2JkdXhzdWJfdG1wLT5zZW0pOworCXVwKCZzdGFydF9zdG9wX3NlbSk7CisJZGV2X2luZm8oJmludGYtPmRldiwgImNvbWVkaV86IGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSB1c2JcbiIpOworfQorCisvKiBpcyBjYWxsZWQgd2hlbiBjb21lZGktY29uZmlnIGlzIGNhbGxlZCAqLworc3RhdGljIGludCB1c2JkdXhzaWdtYV9hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBjb21lZGlfZGV2Y29uZmlnICppdCkKK3sKKwlpbnQgcmV0OworCWludCBpbmRleDsKKwlpbnQgaTsKKwlzdHJ1Y3QgdXNiZHV4c3ViICp1ZGV2OworCisJaW50IG9mZnNldDsKKworCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzID0gTlVMTDsKKwlkZXYtPnByaXZhdGUgPSBOVUxMOworCisJZG93bigmc3RhcnRfc3RvcF9zZW0pOworCS8qIGZpbmQgYSB2YWxpZCBkZXZpY2Ugd2hpY2ggaGFzIGJlZW4gZGV0ZWN0ZWQgYnkgdGhlIHByb2JlIGZ1bmN0aW9uIG9mCisJICogdGhlIHVzYiAqLworCWluZGV4ID0gLTE7CisJZm9yIChpID0gMDsgaSA8IE5VTVVTQkRVWDsgaSsrKSB7CisJCWlmICgodXNiZHV4c3ViW2ldLnByb2JlZCkgJiYgKCF1c2JkdXhzdWJbaV0uYXR0YWNoZWQpKSB7CisJCQlpbmRleCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChpbmRleCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb21lZGklZDogdXNiZHV4c2lnbWE6IGVycm9yOiBhdHRhY2ggZmFpbGVkLCIKKwkJICAgICAgICJkZXYgbm90IGNvbm5lY3RlZCB0byB0aGUgdXNiIGJ1cy5cbiIsIGRldi0+bWlub3IpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwl1ZGV2ID0gJnVzYmR1eHN1YltpbmRleF07CisJZG93bigmdWRldi0+c2VtKTsKKwkvKiBwb2ludGVyIGJhY2sgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY29tZWRpIGRldmljZSAqLworCXVkZXYtPmNvbWVkaWRldiA9IGRldjsKKworCS8qIHRyeWluZyB0byB1cGxvYWQgdGhlIGZpcm13YXJlIGludG8gdGhlIEZYMiAqLworCWlmIChjb21lZGlfYXV4X2RhdGEoaXQtPm9wdGlvbnMsIDApICYmCisJICAgIGl0LT5vcHRpb25zW0NPTUVESV9ERVZDT05GX0FVWF9EQVRBX0xFTkdUSF0pIHsKKwkJZmlybXdhcmVVcGxvYWQodWRldiwgY29tZWRpX2F1eF9kYXRhKGl0LT5vcHRpb25zLCAwKSwKKwkJCSAgICAgICBpdC0+b3B0aW9uc1tDT01FRElfREVWQ09ORl9BVVhfREFUQV9MRU5HVEhdKTsKKwl9CisKKwlkZXYtPmJvYXJkX25hbWUgPSBCT0FSRE5BTUU7CisKKwkvKiBzZXQgbnVtYmVyIG9mIHN1YmRldmljZXMgKi8KKwlpZiAodWRldi0+aGlnaF9zcGVlZCkgeworCQkvKiB3aXRoIHB3bSAqLworCQlkZXYtPm5fc3ViZGV2aWNlcyA9IDQ7CisJfSBlbHNlIHsKKwkJLyogd2l0aG91dCBwd20gKi8KKwkJZGV2LT5uX3N1YmRldmljZXMgPSAzOworCX0KKworCS8qIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgc3ViZGV2aWNlcyAqLworCXJldCA9IGFsbG9jX3N1YmRldmljZXMoZGV2LCBkZXYtPm5fc3ViZGV2aWNlcyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmdWRldi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiY29tZWRpJWQ6IG5vIHNwYWNlIGZvciBzdWJkZXZcbiIsIGRldi0+bWlub3IpOworCQl1cCgmc3RhcnRfc3RvcF9zZW0pOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIHByaXZhdGUgc3RydWN0dXJlIGlzIGFsc28gc2ltcGx5IHRoZSB1c2Itc3RydWN0dXJlICovCisJZGV2LT5wcml2YXRlID0gdWRldjsKKworCS8qIHRoZSBmaXJzdCBzdWJkZXZpY2UgaXMgdGhlIEEvRCBjb252ZXJ0ZXIgKi8KKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgU1VCREVWX0FEOworCS8qIHRoZSBVUkJzIGdldCB0aGUgY29tZWRpIHN1YmRldmljZSAqLworCS8qIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciByZWFkaW5nICovCisJLyogdGhpcyBpcyB0aGUgc3ViZGV2aWNlIHdoaWNoIHJlYWRzIGRhdGEgKi8KKwlkZXYtPnJlYWRfc3ViZGV2ID0gczsKKwkvKiB0aGUgc3ViZGV2aWNlIHJlY2VpdmVzIGFzIHByaXZhdGUgc3RydWN0dXJlIHRoZSAqLworCS8qIHVzYi1zdHJ1Y3R1cmUgKi8KKwlzLT5wcml2YXRlID0gTlVMTDsKKwkvKiBhbmFsb2cgaW5wdXQgKi8KKwlzLT50eXBlID0gQ09NRURJX1NVQkRfQUk7CisJLyogcmVhZGFibGUgYW5kIHJlZiBpcyB0byBncm91bmQsIDMyIGJpdCB3aWRlIGRhdGEhICovCisJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1JFQURBQkxFIHwgU0RGX0dST1VORCB8CisJCVNERl9DTURfUkVBRCB8IFNERl9MU0FNUEw7CisJLyogMTYgQS9EIGNoYW5uZWxzICovCisJcy0+bl9jaGFuID0gTlVNQ0hBTk5FTFM7CisJLyogbGVuZ3RoIG9mIHRoZSBjaGFubmVsbGlzdCAqLworCXMtPmxlbl9jaGFubGlzdCA9IE5VTUNIQU5ORUxTOworCS8qIGNhbGxiYWNrIGZ1bmN0aW9ucyAqLworCXMtPmluc25fcmVhZCA9IHVzYmR1eF9haV9pbnNuX3JlYWQ7CisJcy0+ZG9fY21kdGVzdCA9IHVzYmR1eF9haV9jbWR0ZXN0OworCXMtPmRvX2NtZCA9IHVzYmR1eF9haV9jbWQ7CisJcy0+Y2FuY2VsID0gdXNiZHV4X2FpX2NhbmNlbDsKKwkvKiBtYXggdmFsdWUgZnJvbSB0aGUgQS9EIGNvbnZlcnRlciAoMjRiaXQpICovCisJcy0+bWF4ZGF0YSA9IDB4MDBGRkZGRkY7CisJLyogcmFuZ2UgdGFibGUgdG8gY29udmVydCB0byBwaHlzaWNhbCB1bml0cyAqLworCXMtPnJhbmdlX3RhYmxlID0gKCZyYW5nZV91c2JkdXhfYWlfcmFuZ2UpOworCisJLyogYW5hbG9nIG91dCAqLworCXMgPSBkZXYtPnN1YmRldmljZXMgKyBTVUJERVZfREE7CisJLyogYW5hbG9nIG91dCAqLworCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BTzsKKwkvKiBiYWNrd2FyZCBwb2ludGVyICovCisJZGV2LT53cml0ZV9zdWJkZXYgPSBzOworCS8qIHRoZSBzdWJkZXZpY2UgcmVjZWl2ZXMgYXMgcHJpdmF0ZSBzdHJ1Y3R1cmUgdGhlICovCisJLyogdXNiLXN0cnVjdHVyZSAqLworCXMtPnByaXZhdGUgPSBOVUxMOworCS8qIGFyZSB3cml0YWJsZSAqLworCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9HUk9VTkQgfCBTREZfQ01EX1dSSVRFOworCS8qIDQgY2hhbm5lbHMgKi8KKwlzLT5uX2NoYW4gPSA0OworCS8qIGxlbmd0aCBvZiB0aGUgY2hhbm5lbGxpc3QgKi8KKwlzLT5sZW5fY2hhbmxpc3QgPSA0OworCS8qIDggYml0IHJlc29sdXRpb24gKi8KKwlzLT5tYXhkYXRhID0gMHgwMGZmOworCS8qIHVuaXBvbGFyIHJhbmdlICovCisJcy0+cmFuZ2VfdGFibGUgPSAoJnJhbmdlX3VzYmR1eF9hb19yYW5nZSk7CisJLyogY2FsbGJhY2sgKi8KKwlzLT5kb19jbWR0ZXN0ID0gdXNiZHV4X2FvX2NtZHRlc3Q7CisJcy0+ZG9fY21kID0gdXNiZHV4X2FvX2NtZDsKKwlzLT5jYW5jZWwgPSB1c2JkdXhfYW9fY2FuY2VsOworCXMtPmluc25fcmVhZCA9IHVzYmR1eF9hb19pbnNuX3JlYWQ7CisJcy0+aW5zbl93cml0ZSA9IHVzYmR1eF9hb19pbnNuX3dyaXRlOworCisJLyogZGlnaXRhbCBJL08gKi8KKwlzID0gZGV2LT5zdWJkZXZpY2VzICsgU1VCREVWX0RJTzsKKwlzLT50eXBlID0gQ09NRURJX1NVQkRfRElPOworCXMtPnN1YmRldl9mbGFncyA9IFNERl9SRUFEQUJMRSB8IFNERl9XUklUQUJMRTsKKwkvKiA4IGV4dGVybmFsIGFuZCAxNiBpbnRlcm5hbCBjaGFubmVscyAqLworCXMtPm5fY2hhbiA9IDI0OworCXMtPm1heGRhdGEgPSAxOworCXMtPnJhbmdlX3RhYmxlID0gKCZyYW5nZV9kaWdpdGFsKTsKKwlzLT5pbnNuX2JpdHMgPSB1c2JkdXhfZGlvX2luc25fYml0czsKKwlzLT5pbnNuX2NvbmZpZyA9IHVzYmR1eF9kaW9faW5zbl9jb25maWc7CisJLyogd2UgZG9uJ3QgdXNlIGl0ICovCisJcy0+cHJpdmF0ZSA9IE5VTEw7CisKKwlpZiAodWRldi0+aGlnaF9zcGVlZCkgeworCQkvKiB0aW1lciAvIHB3bSAqLworCQlzID0gZGV2LT5zdWJkZXZpY2VzICsgU1VCREVWX1BXTTsKKwkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1BXTTsKKwkJcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFIHwgU0RGX1BXTV9IQlJJREdFOworCQlzLT5uX2NoYW4gPSA4OworCQkvKiB0aGlzIGRlZmluZXMgdGhlIG1heCBkdXR5IGN5Y2xlIHJlc29sdXRpb24gKi8KKwkJcy0+bWF4ZGF0YSA9IHVkZXYtPnNpemVQd21CdWY7CisJCXMtPmluc25fd3JpdGUgPSB1c2JkdXhfcHdtX3dyaXRlOworCQlzLT5pbnNuX3JlYWQgPSB1c2JkdXhfcHdtX3JlYWQ7CisJCXMtPmluc25fY29uZmlnID0gdXNiZHV4X3B3bV9jb25maWc7CisJCXVzYmR1eF9wd21fcGVyaW9kKGRldiwgcywgUFdNX0RFRkFVTFRfUEVSSU9EKTsKKwl9CisJLyogZmluYWxseSBkZWNpZGUgdGhhdCBpdCdzIGF0dGFjaGVkICovCisJdWRldi0+YXR0YWNoZWQgPSAxOworCisJdXAoJnVkZXYtPnNlbSk7CisKKwl1cCgmc3RhcnRfc3RvcF9zZW0pOworCisJb2Zmc2V0ID0gdXNiZHV4X2dldHN0YXR1c2luZm8oZGV2LCAwKTsKKwlpZiAob2Zmc2V0IDwgMCkKKwkJZGV2X2VycigmdWRldi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiQ29tbXVuaWNhdGlvbiB0byBVU0JEVVhTSUdNQSBmYWlsZWQhIgorCQkJIkNoZWNrIGZpcm13YXJlIGFuZCBjYWJsaW5nLiIpOworCisJZGV2X2luZm8oJnVkZXYtPmludGVyZmFjZS0+ZGV2LAorCQkgImNvbWVkaSVkOiBhdHRhY2hlZCwgQURDX3plcm8gPSAleCIsIGRldi0+bWlub3IsIG9mZnNldCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1c2JkdXhzaWdtYV9kZXRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdXNiZHV4c3ViICp1c2JkdXhzdWJfdG1wOworCisJaWYgKCFkZXYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiY29tZWRpPyB1c2JkdXhzaWdtYSBkZXRhY2g6IGRldj1OVUxMXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJdXNiZHV4c3ViX3RtcCA9IGRldi0+cHJpdmF0ZTsKKwlpZiAoIXVzYmR1eHN1Yl90bXApIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiY29tZWRpPzogdXNiZHV4c2lnbWEgZGV0YWNoOiBwcml2YXRlPU5VTExcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlkZXZfZGJnKCZ1c2JkdXhzdWJfdG1wLT5pbnRlcmZhY2UtPmRldiwKKwkJImNvbWVkaSVkOiBkZXRhY2ggdXNiIGRldmljZVxuIiwKKwkJZGV2LT5taW5vcik7CisKKwlkb3duKCZ1c2JkdXhzdWJfdG1wLT5zZW0pOworCS8qIERvbid0IGFsbG93IGRldGFjaCB0byBmcmVlIHRoZSBwcml2YXRlIHN0cnVjdHVyZSAqLworCS8qIEl0J3Mgb25lIGVudHJ5IG9mIG9mIHVzYmR1eHN1YltdICovCisJZGV2LT5wcml2YXRlID0gTlVMTDsKKwl1c2JkdXhzdWJfdG1wLT5hdHRhY2hlZCA9IDA7CisJdXNiZHV4c3ViX3RtcC0+Y29tZWRpZGV2ID0gTlVMTDsKKwlkZXZfaW5mbygmdXNiZHV4c3ViX3RtcC0+aW50ZXJmYWNlLT5kZXYsCisJCSJjb21lZGklZDogc3VjY2Vzc2Z1bGx5IGRldGFjaGVkLlxuIiwgZGV2LT5taW5vcik7CisJdXAoJnVzYmR1eHN1Yl90bXAtPnNlbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIG1haW4gZHJpdmVyIHN0cnVjdCAqLworc3RhdGljIHN0cnVjdCBjb21lZGlfZHJpdmVyIGRyaXZlcl91c2JkdXhzaWdtYSA9IHsKKwkuZHJpdmVyX25hbWUgPSAidXNiZHV4c2lnbWEiLAorCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkuYXR0YWNoID0gdXNiZHV4c2lnbWFfYXR0YWNoLAorCS5kZXRhY2ggPSB1c2JkdXhzaWdtYV9kZXRhY2gsCit9OworCisvKiBUYWJsZSB3aXRoIHRoZSBVU0ItZGV2aWNlcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIHVzYmR1eHNpZ21hX3RhYmxlW10gPSB7CisJe1VTQl9ERVZJQ0UoMHgxM2Q4LCAweDAwMjApfSwKKwl7VVNCX0RFVklDRSgweDEzZDgsIDB4MDAyMSl9LAorCXtVU0JfREVWSUNFKDB4MTNkOCwgMHgwMDIyKX0sCisJe30JCQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHVzYmR1eHNpZ21hX3RhYmxlKTsKKworLyogVGhlIHVzYmR1eHN1Yi1kcml2ZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB1c2JkdXhzaWdtYV9kcml2ZXIgPSB7CisJLm5hbWUgPSBCT0FSRE5BTUUsCisJLnByb2JlID0gdXNiZHV4c2lnbWFfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSB1c2JkdXhzaWdtYV9kaXNjb25uZWN0LAorCS5pZF90YWJsZSA9IHVzYmR1eHNpZ21hX3RhYmxlLAorfTsKKworLyogQ2FuJ3QgdXNlIHRoZSBuaWNlIG1hY3JvIGFzIEkgaGF2ZSBhbHNvIHRvIGluaXRpYWxpc2UgdGhlIFVTQiAqLworLyogc3Vic3lzdGVtOiAqLworLyogcmVnaXN0ZXJpbmcgdGhlIHVzYi1zeXN0ZW0gX2FuZF8gdGhlIGNvbWVkaS1kcml2ZXIgKi8KK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdXNiZHV4c2lnbWEodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPIEtCVUlMRF9NT0ROQU1FICI6ICIKKwkgICAgICAgRFJJVkVSX1ZFUlNJT04gIjoiIERSSVZFUl9ERVNDICJcbiIpOworCXVzYl9yZWdpc3RlcigmdXNiZHV4c2lnbWFfZHJpdmVyKTsKKwljb21lZGlfZHJpdmVyX3JlZ2lzdGVyKCZkcml2ZXJfdXNiZHV4c2lnbWEpOworCXJldHVybiAwOworfQorCisvKiBkZXJlZ2lzdGVyaW5nIHRoZSBjb21lZGkgZHJpdmVyIGFuZCB0aGUgdXNiLXN1YnN5c3RlbSAqLworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfdXNiZHV4c2lnbWEodm9pZCkKK3sKKwljb21lZGlfZHJpdmVyX3VucmVnaXN0ZXIoJmRyaXZlcl91c2JkdXhzaWdtYSk7CisJdXNiX2RlcmVnaXN0ZXIoJnVzYmR1eHNpZ21hX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfdXNiZHV4c2lnbWEpOworbW9kdWxlX2V4aXQoZXhpdF91c2JkdXhzaWdtYSk7CisKK01PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CitNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9iY19kdHNfZGVmcy5oIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9iY19kdHNfZGVmcy5oCmluZGV4IDc3OGU3NmEuLmZkZTViMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvYmNfZHRzX2RlZnMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2JjX2R0c19kZWZzLmgKQEAgLTg0LDcgKzg0LDcgQEAKIAlCQ19PUFRfTElOS19PVVRfRU5DUllQVAkJPSBCQ19CSVQoMjkpLAogfTsKIAotc3RydWN0IEJDX1JFR19DT05GSUd7CitzdHJ1Y3QgQkNfUkVHX0NPTkZJRyB7CiAJdWludDMyX3QJCURiZ09wdGlvbnM7CiB9OwogCkBAIC0zOTEsNyArMzkxLDcgQEAKICAqICAgIFByb2NPdXQgSW5mbwkJCQkJKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogT3B0aW9uYWwgZmxhZ3MgZm9yIFByb2NPdXQgSW50ZXJmYWNlLiovCi1lbnVtIFBPVVRfT1BUSU9OQUxfSU5fRkxBR1NfeworZW51bSBQT1VUX09QVElPTkFMX0lOX0ZMQUdTXyB7CiAJLyogRmxhZ3MgZnJvbSBBcHAgdG8gRGV2aWNlICovCiAJQkNfUE9VVF9GTEFHU19ZVjEyCSAgPSAweDAxLAkvKiBDb3B5IERhdGEgaW4gWVYxMiBmb3JtYXQgKi8KIAlCQ19QT1VUX0ZMQUdTX1NUUklERQkgID0gMHgwMiwJLyogU3RyaWRlIHNpemUgaXMgdmFsaWQuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2JjX2R0c19nbG9iX2xueC5oIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9iY19kdHNfZ2xvYl9sbnguaAppbmRleCA4MGI3YTczLi5iYmU1MTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2JjX2R0c19nbG9iX2xueC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvYmNfZHRzX2dsb2JfbG54LmgKQEAgLTE3NSw3ICsxNzUsNyBAQAogCXVpbnQzMl90CQlSZWZDbnQ7CiB9OwogCi1lbnVtIERFQ09VVF9DT01QTEVUSU9OX0ZMQUdTeworZW51bSBERUNPVVRfQ09NUExFVElPTl9GTEFHUyB7CiAJQ09NUF9GTEFHX05PX0lORk8JPSAweDAwLAogCUNPTVBfRkxBR19GTVRfQ0hBTkdFCT0gMHgwMSwKIAlDT01QX0ZMQUdfUElCX1ZBTElECT0gMHgwMiwKQEAgLTE4NCw3ICsxODQsNyBAQAogCUNPTVBfRkxBR19EQVRBX0JPVAk9IDB4MTAsCiB9OwogCi1zdHJ1Y3QgQkNfREVDX09VVF9CVUZGeworc3RydWN0IEJDX0RFQ19PVVRfQlVGRiB7CiAJc3RydWN0IEJDX0RFQ19ZVVZfQlVGRlMJT3V0UHV0QnVmZnM7CiAJc3RydWN0IEJDX1BJQ19JTkZPX0JMT0NLIFBpYkluZm87CiAJdWludDMyX3QJCUZsYWdzOwpAQCAtMjg5LDcgKzI4OSw3IEBACiAJc3RydWN0IGNyeXN0YWxoZF9pb2N0bF9kYXRhICpuZXh0OwkvKiBMaXN0L0ZpZm8gbWFuYWdlbWVudCAqLwogfTsKIAotZW51bSBjcnlzdGFsaGRfa21vZF92ZXJ7CitlbnVtIGNyeXN0YWxoZF9rbW9kX3ZlciB7CiAJY3J5c3RhbGhkX2ttb2RfbWFqb3IJPSAwLAogCWNyeXN0YWxoZF9rbW9kX21pbm9yCT0gOSwKIAljcnlzdGFsaGRfa21vZF9yZXYJPSAyNywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvYmNfZHRzX3R5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2JjX2R0c190eXBlcy5oCmluZGV4IGQyMTMxZTcuLjEwODVhOTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvYmNfZHRzX3R5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9iY19kdHNfdHlwZXMuaApAQCAtMjUsMzIgKzI1LDcgQEAKICNpZm5kZWYgX0JDX0RUU19UWVBFU19IXwogI2RlZmluZSBfQkNfRFRTX1RZUEVTX0hfCiAKLSNpZmRlZiBfX0xJTlVYX1VTRVJfXyAgLyogRG9uJ3QgaW5jbHVkZSB0aGVzZSBmb3IgS0VSTkVMLi4gKi8KICNpbmNsdWRlIDxzdGRpbnQuaD4KLSNlbmRpZgotCi0jaWZuZGVmIFBWT0lECi10eXBlZGVmIHZvaWQJKlBWT0lEOwotI2VuZGlmCi0KLSNpZm5kZWYgQk9PTAotdHlwZWRlZiBpbnQJQk9PTDsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0tFUk5FTF9fKSB8fCBkZWZpbmVkKF9fTElOVVhfVVNFUl9fKQotCi0jaWZkZWYgX19MSU5VWF9VU0VSX18JLyogRG9uJ3QgaW5jbHVkZSB0aGVzZSBmb3IgS0VSTkVMICovCi10eXBlZGVmIHVpbnQzMl90CVVMT05HOwotdHlwZWRlZiBpbnQzMl90CQlMT05HOwotdHlwZWRlZiB2b2lkCQkqSEFORExFOwotI2lmbmRlZiBWT0lECi10eXBlZGVmIHZvaWQJCVZPSUQ7Ci0jZW5kaWYKLXR5cGVkZWYgdm9pZAkJKkxQVk9JRDsKLXR5cGVkZWYgdWludDMyX3QJRFdPUkQ7Ci10eXBlZGVmIHVpbnQzMl90CVVJTlQzMjsKLXR5cGVkZWYgdWludDMyX3QJKkxQRFdPUkQ7Ci10eXBlZGVmIHVuc2lnbmVkIGNoYXIJKlBVQ0hBUjsKIAogI2lmbmRlZiBUUlVFCiAJI2RlZmluZSBUUlVFCQkxCkBAIC02MiwzNiArMzcsNCBAQAogCiAjZGVmaW5lIFRFWFQKIAotI2Vsc2UKLQotLyogRm9yIEtlcm5lbCB1c2FnZS4uICovCiAjZW5kaWYKLQotI2Vsc2UKLQotI2lmbmRlZiB1aW50NjRfdAotdHlwZWRlZiBzdHJ1Y3QgX3VpbnQ2NF90IHsKLQl1aW50MzJfdCBsb3dfZHc7Ci0JdWludDMyX3QgaGlfZHc7Ci19IHVpbnQ2NF90OwotI2VuZGlmCi0KLSNpZm5kZWYgaW50MzJfdAotdHlwZWRlZiBzaWduZWQgbG9uZwkJaW50MzJfdDsKLSNlbmRpZgotCi0jaWZuZGVmIHVpbnQzMl90Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcJdWludDMyX3Q7Ci0jZW5kaWYKLQotI2lmbmRlZiB1aW50MTZfdAotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydAl1aW50MTZfdDsKLSNlbmRpZgotCi0jaWZuZGVmIHVpbnQ4X3QKLXR5cGVkZWYgdW5zaWduZWQgY2hhcgl1aW50OF90OwotI2VuZGlmCi0jZW5kaWYKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2NtZHMuaCBiL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2NtZHMuaAppbmRleCAxMDEzMDI5Li5mMGEyNzk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9jbWRzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfY21kcy5oCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSAiY3J5c3RhbGhkX21pc2MuaCIKICNpbmNsdWRlICJjcnlzdGFsaGRfaHcuaCIKIAotZW51bSBjcnlzdGFsaGRfc3RhdGV7CitlbnVtIGNyeXN0YWxoZF9zdGF0ZSB7CiAJQkNfTElOS19JTlZBTElECQk9IDB4MDAsCiAJQkNfTElOS19JTklUCQk9IDB4MDEsCiAJQkNfTElOS19DQVBfRU4JCT0gMHgwMiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2Z3X2lmLmggYi9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9md19pZi5oCmluZGV4IDc3NTYwZDQuLjllMjgzMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX2Z3X2lmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfZndfaWYuaApAQCAtMzEsMzMgKzMxLDMzIEBACiAKIC8qIFVzZXIgRGF0YSBIZWFkZXIgKi8KIHN0cnVjdCB1c2VyX2RhdGEgewotICAgc3RydWN0IHVzZXJfZGF0YQkqbmV4dDsKLSAgIHVpbnQzMl90CQl0eXBlOwotICAgdWludDMyX3QJCXNpemU7CisJc3RydWN0IHVzZXJfZGF0YQkqbmV4dDsKKwl1aW50MzJfdAkJdHlwZTsKKwl1aW50MzJfdAkJc2l6ZTsKIH07CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgogICogICAgTVBFRyBFeHRlbnNpb24gdG8gdGhlIFBQQgkJCSAqCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdHJ1Y3QgcHBiX21wZWcgewotICAgdWludDMyX3QJCXRvX2JlX2RlZmluZWQ7Ci0gICB1aW50MzJfdAkJdmFsaWQ7CisJdWludDMyX3QJCXRvX2JlX2RlZmluZWQ7CisJdWludDMyX3QJCXZhbGlkOwogCi0gICAvKiBBbHdheXMgdmFsaWQsIGRlZmF1bHRzIHRvIHBpY3R1cmUgc2l6ZSBpZiBubwotICAgICAgc2VxdWVuY2UgZGlzcGxheSBleHRlbnNpb24gaW4gdGhlIHN0cmVhbS4gKi8KLSAgIHVpbnQzMl90CQlkaXNwbGF5X2hvcml6b250YWxfc2l6ZTsKLSAgIHVpbnQzMl90CQlkaXNwbGF5X3ZlcnRpY2FsX3NpemU7CisJLyogQWx3YXlzIHZhbGlkLCBkZWZhdWx0cyB0byBwaWN0dXJlIHNpemUgaWYgbm8KKwkgICBzZXF1ZW5jZSBkaXNwbGF5IGV4dGVuc2lvbiBpbiB0aGUgc3RyZWFtLiAqLworCXVpbnQzMl90CQlkaXNwbGF5X2hvcml6b250YWxfc2l6ZTsKKwl1aW50MzJfdAkJZGlzcGxheV92ZXJ0aWNhbF9zaXplOwogCi0gICAvKiBNUEVHX1ZBTElEX1BBTlNDQU4KLSAgICAgIE9mZnNldHMgYXJlIGEgY29weSB2YWx1ZXMgZnJvbSB0aGUgTVBFRyBzdHJlYW0uICovCi0gICB1aW50MzJfdAkJb2Zmc2V0X2NvdW50OwotICAgaW50MzJfdAkJaG9yaXpvbnRhbF9vZmZzZXRbM107Ci0gICBpbnQzMl90CQl2ZXJ0aWNhbF9vZmZzZXRbM107CisJLyogTVBFR19WQUxJRF9QQU5TQ0FOCisJICAgT2Zmc2V0cyBhcmUgYSBjb3B5IHZhbHVlcyBmcm9tIHRoZSBNUEVHIHN0cmVhbS4gKi8KKwl1aW50MzJfdAkJb2Zmc2V0X2NvdW50OworCWludDMyX3QJCWhvcml6b250YWxfb2Zmc2V0WzNdOworCWludDMyX3QJCXZlcnRpY2FsX29mZnNldFszXTsKIAotICAgLyogTVBFR19WQUxJRF9VU0VSREFUQQotICAgICAgVXNlciBkYXRhIGlzIGluIHRoZSBmb3JtIG9mIGEgbGlua2VkIGxpc3QuICovCi0gICBpbnQzMl90CQl1c2VyRGF0YVNpemU7Ci0gICBzdHJ1Y3QgdXNlcl9kYXRhCSp1c2VyRGF0YTsKKwkvKiBNUEVHX1ZBTElEX1VTRVJEQVRBCisJICAgVXNlciBkYXRhIGlzIGluIHRoZSBmb3JtIG9mIGEgbGlua2VkIGxpc3QuICovCisJaW50MzJfdAkJdXNlckRhdGFTaXplOworCXN0cnVjdCB1c2VyX2RhdGEJKnVzZXJEYXRhOwogCiB9OwogCkBAIC02NiwyNSArNjYsMjUgQEAKICAqICAgIFZDMSBFeHRlbnNpb24gdG8gdGhlIFBQQgkJCSAgKgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogc3RydWN0IHBwYl92YzEgewotICAgdWludDMyX3QJCXRvX2JlX2RlZmluZWQ7Ci0gICB1aW50MzJfdAkJdmFsaWQ7CisJdWludDMyX3QJCXRvX2JlX2RlZmluZWQ7CisJdWludDMyX3QJCXZhbGlkOwogCi0gICAvKiBBbHdheXMgdmFsaWQsIGRlZmF1bHRzIHRvIHBpY3R1cmUgc2l6ZSBpZiBubwotICAgICAgc2VxdWVuY2UgZGlzcGxheSBleHRlbnNpb24gaW4gdGhlIHN0cmVhbS4gKi8KLSAgIHVpbnQzMl90CQlkaXNwbGF5X2hvcml6b250YWxfc2l6ZTsKLSAgIHVpbnQzMl90CQlkaXNwbGF5X3ZlcnRpY2FsX3NpemU7CisJLyogQWx3YXlzIHZhbGlkLCBkZWZhdWx0cyB0byBwaWN0dXJlIHNpemUgaWYgbm8KKwkgICBzZXF1ZW5jZSBkaXNwbGF5IGV4dGVuc2lvbiBpbiB0aGUgc3RyZWFtLiAqLworCXVpbnQzMl90CQlkaXNwbGF5X2hvcml6b250YWxfc2l6ZTsKKwl1aW50MzJfdAkJZGlzcGxheV92ZXJ0aWNhbF9zaXplOwogCi0gIC8qIFZDMSBwYW4gc2NhbiB3aW5kb3dzICovCi0gICB1aW50MzJfdAkJbnVtX3BhbnNjYW5fd2luZG93czsKLSAgIGludDMyX3QJCXBzX2hvcml6X29mZnNldFs0XTsKLSAgIGludDMyX3QJCXBzX3ZlcnRfb2Zmc2V0WzRdOwotICAgaW50MzJfdAkJcHNfd2lkdGhbNF07Ci0gICBpbnQzMl90CQlwc19oZWlnaHRbNF07CisJLyogVkMxIHBhbiBzY2FuIHdpbmRvd3MgKi8KKwl1aW50MzJfdAkJbnVtX3BhbnNjYW5fd2luZG93czsKKwlpbnQzMl90CQlwc19ob3Jpel9vZmZzZXRbNF07CisJaW50MzJfdAkJcHNfdmVydF9vZmZzZXRbNF07CisJaW50MzJfdAkJcHNfd2lkdGhbNF07CisJaW50MzJfdAkJcHNfaGVpZ2h0WzRdOwogCi0gICAvKiBWQzFfVkFMSURfVVNFUkRBVEEKLSAgICAgIFVzZXIgZGF0YSBpcyBpbiB0aGUgZm9ybSBvZiBhIGxpbmtlZCBsaXN0LiAqLwotICAgaW50MzJfdAkJdXNlckRhdGFTaXplOwotICAgc3RydWN0IHVzZXJfZGF0YQkqdXNlckRhdGE7CisJLyogVkMxX1ZBTElEX1VTRVJEQVRBCisJICAgVXNlciBkYXRhIGlzIGluIHRoZSBmb3JtIG9mIGEgbGlua2VkIGxpc3QuICovCisJaW50MzJfdAkJdXNlckRhdGFTaXplOworCXN0cnVjdCB1c2VyX2RhdGEJKnVzZXJEYXRhOwogCiB9OwogCkBAIC0xMDUsMTQ1ICsxMDUsMTQ1IEBACiAjZGVmaW5lIE1BWF9GR1RfVkFMVUVfSU5URVJWQUwJKDI1NikKIAogc3RydWN0IGZndF9zZWkgewotICAgIHN0cnVjdCBmZ3Rfc2VpICpuZXh0OwotICAgIHVuc2lnbmVkIGNoYXIgbW9kZWxfdmFsdWVzWzNdW01BWF9GR1RfVkFMVUVfSU5URVJWQUxdW01BWF9GR1RfTU9ERUxfVkFMVUVdOwotICAgIHVuc2lnbmVkIGNoYXIgdXBwZXJfYm91bmRbM11bTUFYX0ZHVF9WQUxVRV9JTlRFUlZBTF07Ci0gICAgdW5zaWduZWQgY2hhciBsb3dlcl9ib3VuZFszXVtNQVhfRkdUX1ZBTFVFX0lOVEVSVkFMXTsKKwlzdHJ1Y3QgZmd0X3NlaSAqbmV4dDsKKwl1bnNpZ25lZCBjaGFyIG1vZGVsX3ZhbHVlc1szXVtNQVhfRkdUX1ZBTFVFX0lOVEVSVkFMXVtNQVhfRkdUX01PREVMX1ZBTFVFXTsKKwl1bnNpZ25lZCBjaGFyIHVwcGVyX2JvdW5kWzNdW01BWF9GR1RfVkFMVUVfSU5URVJWQUxdOworCXVuc2lnbmVkIGNoYXIgbG93ZXJfYm91bmRbM11bTUFYX0ZHVF9WQUxVRV9JTlRFUlZBTF07CiAKLSAgICB1bnNpZ25lZCBjaGFyIGNhbmNlbF9mbGFnOwkvKiBDYW5jZWwgZmxhZzogMSBubyBmaWxtIGdyYWluLiAqLwotICAgIHVuc2lnbmVkIGNoYXIgbW9kZWxfaWQ7CS8qIE1vZGVsIGlkLiAqLworCXVuc2lnbmVkIGNoYXIgY2FuY2VsX2ZsYWc7CS8qIENhbmNlbCBmbGFnOiAxIG5vIGZpbG0gZ3JhaW4uICovCisJdW5zaWduZWQgY2hhciBtb2RlbF9pZDsJLyogTW9kZWwgaWQuICovCiAKLSAgICAvKiArdW51c2VkIFNFIGJhc2VkIG9uIFRob21zb24gc3BlYyAqLwotICAgIHVuc2lnbmVkIGNoYXIgY29sb3JfZGVzY19mbGFnOwkvKiBTZXBhcmF0ZSBjb2xvciBkZXNjcml0aW9uIGZsYWcuICovCi0gICAgdW5zaWduZWQgY2hhciBiaXRfZGVwdGhfbHVtYTsJLyogQml0IGRlcHRoIGx1bWEgbWludXMgOC4gKi8KLSAgICB1bnNpZ25lZCBjaGFyIGJpdF9kZXB0aF9jaHJvbWE7CS8qIEJpdCBkZXB0aCBjaHJvbWEgbWludXMgOC4gKi8KLSAgICB1bnNpZ25lZCBjaGFyIGZ1bGxfcmFuZ2VfZmxhZzsJLyogRnVsbCByYW5nZSBmbGFnLiAqLwotICAgIHVuc2lnbmVkIGNoYXIgY29sb3JfcHJpbWFyaWVzOwkvKiBDb2xvciBwcmltYXJpZXMuICovCi0gICAgdW5zaWduZWQgY2hhciB0cmFuc2Zlcl9jaGFyYWN0OwkvKiBUcmFuc2ZlciBjaGFyYWN0ZXJpc3RpY3MuICovCi0gICAgdW5zaWduZWQgY2hhciBtYXRyaXhfY29lZmY7CQkvKjwgTWF0cml4IGNvZWZmaWNpZW50cy4gKi8KLSAgICAvKiAtdW51c2VkIFNFIGJhc2VkIG9uIFRob21zb24gc3BlYyAqLworCS8qICt1bnVzZWQgU0UgYmFzZWQgb24gVGhvbXNvbiBzcGVjICovCisJdW5zaWduZWQgY2hhciBjb2xvcl9kZXNjX2ZsYWc7CS8qIFNlcGFyYXRlIGNvbG9yIGRlc2NyaXRpb24gZmxhZy4gKi8KKwl1bnNpZ25lZCBjaGFyIGJpdF9kZXB0aF9sdW1hOwkvKiBCaXQgZGVwdGggbHVtYSBtaW51cyA4LiAqLworCXVuc2lnbmVkIGNoYXIgYml0X2RlcHRoX2Nocm9tYTsJLyogQml0IGRlcHRoIGNocm9tYSBtaW51cyA4LiAqLworCXVuc2lnbmVkIGNoYXIgZnVsbF9yYW5nZV9mbGFnOwkvKiBGdWxsIHJhbmdlIGZsYWcuICovCisJdW5zaWduZWQgY2hhciBjb2xvcl9wcmltYXJpZXM7CS8qIENvbG9yIHByaW1hcmllcy4gKi8KKwl1bnNpZ25lZCBjaGFyIHRyYW5zZmVyX2NoYXJhY3Q7CS8qIFRyYW5zZmVyIGNoYXJhY3RlcmlzdGljcy4gKi8KKwl1bnNpZ25lZCBjaGFyIG1hdHJpeF9jb2VmZjsJCS8qPCBNYXRyaXggY29lZmZpY2llbnRzLiAqLworCS8qIC11bnVzZWQgU0UgYmFzZWQgb24gVGhvbXNvbiBzcGVjICovCiAKLSAgICB1bnNpZ25lZCBjaGFyIGJsZW5kaW5nX21vZGVfaWQ7CS8qIEJsZW5kaW5nIG1vZGUuICovCi0gICAgdW5zaWduZWQgY2hhciBsb2cyX3NjYWxlX2ZhY3RvcjsJLyogTG9nMiBzY2FsZSBmYWN0b3IgKDItNykuICovCi0gICAgdW5zaWduZWQgY2hhciBjb21wX2ZsYWdbM107CQkvKiBDb21wb25lbnRzIFswLDJdIHBhcmFtZXRlcnMgcHJlc2VudCBmbGFnLiAqLwotICAgIHVuc2lnbmVkIGNoYXIgbnVtX2ludGVydmFsc19taW51czFbM107IC8qIE51bWJlciBvZiBpbnRlbnNpdHkgbGV2ZWwgaW50ZXJ2YWxzLiAqLwotICAgIHVuc2lnbmVkIGNoYXIgbnVtX21vZGVsX3ZhbHVlc1szXTsJLyogTnVtYmVyIG9mIG1vZGVsIHZhbHVlcy4gKi8KLSAgICB1aW50MTZfdCAgICAgIHJlcGV0aXRpb25fcGVyaW9kOwkvKiBSZXBldGl0aW9uIHBlcmlvZCAoMC0xNjM4NCkgKi8KKwl1bnNpZ25lZCBjaGFyIGJsZW5kaW5nX21vZGVfaWQ7CS8qIEJsZW5kaW5nIG1vZGUuICovCisJdW5zaWduZWQgY2hhciBsb2cyX3NjYWxlX2ZhY3RvcjsJLyogTG9nMiBzY2FsZSBmYWN0b3IgKDItNykuICovCisJdW5zaWduZWQgY2hhciBjb21wX2ZsYWdbM107CQkvKiBDb21wb25lbnRzIFswLDJdIHBhcmFtZXRlcnMgcHJlc2VudCBmbGFnLiAqLworCXVuc2lnbmVkIGNoYXIgbnVtX2ludGVydmFsc19taW51czFbM107IC8qIE51bWJlciBvZiBpbnRlbnNpdHkgbGV2ZWwgaW50ZXJ2YWxzLiAqLworCXVuc2lnbmVkIGNoYXIgbnVtX21vZGVsX3ZhbHVlc1szXTsJLyogTnVtYmVyIG9mIG1vZGVsIHZhbHVlcy4gKi8KKwl1aW50MTZfdCAgICAgIHJlcGV0aXRpb25fcGVyaW9kOwkvKiBSZXBldGl0aW9uIHBlcmlvZCAoMC0xNjM4NCkgKi8KIAogfTsKIAogc3RydWN0IHBwYl9oMjY0IHsKLSAgIC8qICd2YWxpZCcgc3BlY2lmaWVzIHdoaWNoIGZpZWxkcyAob3Igc2V0cyBvZgotICAgICogZmllbGRzKSBiZWxvdyBhcmUgdmFsaWQuICBJZiB0aGUgY29ycmVzcG9uZGluZwotICAgICogYml0IGluICd2YWxpZCcgaXMgTk9UIHNldCB0aGVuIHRoYXQgZmllbGQocykKLSAgICAqIGlzIChhcmUpIG5vdCBpbml0aWFsaXplZC4gKi8KLSAgIHVpbnQzMl90CXZhbGlkOworCS8qICd2YWxpZCcgc3BlY2lmaWVzIHdoaWNoIGZpZWxkcyAob3Igc2V0cyBvZgorCSAqIGZpZWxkcykgYmVsb3cgYXJlIHZhbGlkLiAgSWYgdGhlIGNvcnJlc3BvbmRpbmcKKwkgKiBiaXQgaW4gJ3ZhbGlkJyBpcyBOT1Qgc2V0IHRoZW4gdGhhdCBmaWVsZChzKQorCSAqIGlzIChhcmUpIG5vdCBpbml0aWFsaXplZC4gKi8KKwl1aW50MzJfdAl2YWxpZDsKIAotICAgaW50MzJfdAkJcG9jX3RvcDsJLyogUE9DIGZvciBUb3AgRmllbGQvRnJhbWUgKi8KLSAgIGludDMyX3QJCXBvY19ib3R0b207CS8qIFBPQyBmb3IgQm90dG9tIEZpZWxkICAgICovCi0gICB1aW50MzJfdAkJaWRyX3BpY19pZDsKKwlpbnQzMl90CQlwb2NfdG9wOwkvKiBQT0MgZm9yIFRvcCBGaWVsZC9GcmFtZSAqLworCWludDMyX3QJCXBvY19ib3R0b207CS8qIFBPQyBmb3IgQm90dG9tIEZpZWxkICAgICovCisJdWludDMyX3QJCWlkcl9waWNfaWQ7CiAKLSAgIC8qIEgyNjRfVkFMSURfUEFOU0NBTiAqLwotICAgdWludDMyX3QJCXBhbl9zY2FuX2NvdW50OwotICAgaW50MzJfdAkJcGFuX3NjYW5fbGVmdFszXTsKLSAgIGludDMyX3QJCXBhbl9zY2FuX3JpZ2h0WzNdOwotICAgaW50MzJfdAkJcGFuX3NjYW5fdG9wWzNdOwotICAgaW50MzJfdAkJcGFuX3NjYW5fYm90dG9tWzNdOworCS8qIEgyNjRfVkFMSURfUEFOU0NBTiAqLworCXVpbnQzMl90CQlwYW5fc2Nhbl9jb3VudDsKKwlpbnQzMl90CQlwYW5fc2Nhbl9sZWZ0WzNdOworCWludDMyX3QJCXBhbl9zY2FuX3JpZ2h0WzNdOworCWludDMyX3QJCXBhbl9zY2FuX3RvcFszXTsKKwlpbnQzMl90CQlwYW5fc2Nhbl9ib3R0b21bM107CiAKLSAgIC8qIEgyNjRfVkFMSURfQ1RfVFlQRSAqLwotICAgdWludDMyX3QJCWN0X3R5cGVfY291bnQ7Ci0gICB1aW50MzJfdAkJY3RfdHlwZVszXTsKKwkvKiBIMjY0X1ZBTElEX0NUX1RZUEUgKi8KKwl1aW50MzJfdAkJY3RfdHlwZV9jb3VudDsKKwl1aW50MzJfdAkJY3RfdHlwZVszXTsKIAotICAgLyogSDI2NF9WQUxJRF9TUFNfQ1JPUCAqLwotICAgaW50MzJfdAkJc3BzX2Nyb3BfbGVmdDsKLSAgIGludDMyX3QJCXNwc19jcm9wX3JpZ2h0OwotICAgaW50MzJfdAkJc3BzX2Nyb3BfdG9wOwotICAgaW50MzJfdAkJc3BzX2Nyb3BfYm90dG9tOworCS8qIEgyNjRfVkFMSURfU1BTX0NST1AgKi8KKwlpbnQzMl90CQlzcHNfY3JvcF9sZWZ0OworCWludDMyX3QJCXNwc19jcm9wX3JpZ2h0OworCWludDMyX3QJCXNwc19jcm9wX3RvcDsKKwlpbnQzMl90CQlzcHNfY3JvcF9ib3R0b207CiAKLSAgIC8qIEgyNjRfVkFMSURfVlVJICovCi0gICB1aW50MzJfdAkJY2hyb21hX3RvcDsKLSAgIHVpbnQzMl90CQljaHJvbWFfYm90dG9tOworCS8qIEgyNjRfVkFMSURfVlVJICovCisJdWludDMyX3QJCWNocm9tYV90b3A7CisJdWludDMyX3QJCWNocm9tYV9ib3R0b207CiAKLSAgIC8qIEgyNjRfVkFMSURfVVNFUiAqLwotICAgdWludDMyX3QJCXVzZXJfZGF0YV9zaXplOwotICAgc3RydWN0IHVzZXJfZGF0YQkqdXNlcl9kYXRhOworCS8qIEgyNjRfVkFMSURfVVNFUiAqLworCXVpbnQzMl90CQl1c2VyX2RhdGFfc2l6ZTsKKwlzdHJ1Y3QgdXNlcl9kYXRhCSp1c2VyX2RhdGE7CiAKLSAgIC8qIEgyNjQgVkFMSUQgRkdUICovCi0gICBzdHJ1Y3QgZmd0X3NlaQkqcGZndDsKKwkvKiBIMjY0IFZBTElEIEZHVCAqLworCXN0cnVjdCBmZ3Rfc2VpCSpwZmd0OwogCiB9OwogCiBzdHJ1Y3QgcHBiIHsKLSAgIC8qIENvbW1vbiBmaWVsZHMuICovCi0gICB1aW50MzJfdAlwaWN0dXJlX251bWJlcjsJLyogT3JkaW5hbCBkaXNwbGF5IG51bWJlciAqLwotICAgdWludDMyX3QJdmlkZW9fYnVmZmVyOwkvKiBWaWRlbyAocGljYnVmKSBudW1iZXIgKi8KLSAgIHVpbnQzMl90CXZpZGVvX2FkZHJlc3M7CS8qIEFkZHJlc3Mgb2YgcGljYnVmIFkgKi8KLSAgIHVpbnQzMl90CXZpZGVvX2FkZHJlc3NfdXY7IC8qIEFkZHJlc3Mgb2YgcGljYnVmIFVWICovCi0gICB1aW50MzJfdAl2aWRlb19zdHJpcGU7CS8qIFBpY2J1ZiBzdHJpcGUgKi8KLSAgIHVpbnQzMl90CXZpZGVvX3dpZHRoOwkvKiBQaWNidWYgd2lkdGggKi8KLSAgIHVpbnQzMl90CXZpZGVvX2hlaWdodDsJLyogUGljYnVmIGhlaWdodCAqLworCS8qIENvbW1vbiBmaWVsZHMuICovCisJdWludDMyX3QJcGljdHVyZV9udW1iZXI7CS8qIE9yZGluYWwgZGlzcGxheSBudW1iZXIgKi8KKwl1aW50MzJfdAl2aWRlb19idWZmZXI7CS8qIFZpZGVvIChwaWNidWYpIG51bWJlciAqLworCXVpbnQzMl90CXZpZGVvX2FkZHJlc3M7CS8qIEFkZHJlc3Mgb2YgcGljYnVmIFkgKi8KKwl1aW50MzJfdAl2aWRlb19hZGRyZXNzX3V2OyAvKiBBZGRyZXNzIG9mIHBpY2J1ZiBVViAqLworCXVpbnQzMl90CXZpZGVvX3N0cmlwZTsJLyogUGljYnVmIHN0cmlwZSAqLworCXVpbnQzMl90CXZpZGVvX3dpZHRoOwkvKiBQaWNidWYgd2lkdGggKi8KKwl1aW50MzJfdAl2aWRlb19oZWlnaHQ7CS8qIFBpY2J1ZiBoZWlnaHQgKi8KIAotICAgdWludDMyX3QJY2hhbm5lbF9pZDsJLyogRGVjb2RlciBjaGFubmVsIElEICovCi0gICB1aW50MzJfdAlzdGF0dXM7CQkvKiByZXNlcnZlZCAqLwotICAgdWludDMyX3QJd2lkdGg7CQkvKiBwaXhlbHMgKi8KLSAgIHVpbnQzMl90CWhlaWdodDsJCS8qIHBpeGVscyAqLwotICAgdWludDMyX3QJY2hyb21hX2Zvcm1hdDsJLyogc2VlIGFib3ZlICovCi0gICB1aW50MzJfdAlwdWxsZG93bjsJLyogc2VlIGFib3ZlICovCi0gICB1aW50MzJfdAlmbGFnczsJCS8qIHNlZSBhYm92ZSAqLwotICAgdWludDMyX3QJcHRzOwkJLyogMzIgTFNCcyBvZiBQVFMgKi8KLSAgIHVpbnQzMl90CXByb3RvY29sOwkvKiBwcm90b2NvbFhYWCAoYWJvdmUpICovCisJdWludDMyX3QJY2hhbm5lbF9pZDsJLyogRGVjb2RlciBjaGFubmVsIElEICovCisJdWludDMyX3QJc3RhdHVzOwkJLyogcmVzZXJ2ZWQgKi8KKwl1aW50MzJfdAl3aWR0aDsJCS8qIHBpeGVscyAqLworCXVpbnQzMl90CWhlaWdodDsJCS8qIHBpeGVscyAqLworCXVpbnQzMl90CWNocm9tYV9mb3JtYXQ7CS8qIHNlZSBhYm92ZSAqLworCXVpbnQzMl90CXB1bGxkb3duOwkvKiBzZWUgYWJvdmUgKi8KKwl1aW50MzJfdAlmbGFnczsJCS8qIHNlZSBhYm92ZSAqLworCXVpbnQzMl90CXB0czsJCS8qIDMyIExTQnMgb2YgUFRTICovCisJdWludDMyX3QJcHJvdG9jb2w7CS8qIHByb3RvY29sWFhYIChhYm92ZSkgKi8KIAotICAgdWludDMyX3QJZnJhbWVfcmF0ZTsJLyogc2VlIGFib3ZlICovCi0gICB1aW50MzJfdAltYXRyaXhfY29lZmY7CS8qIHNlZSBhYm92ZSAqLwotICAgdWludDMyX3QJYXNwZWN0X3JhdGlvOwkvKiBzZWUgYWJvdmUgKi8KLSAgIHVpbnQzMl90CWNvbG91cl9wcmltYXJpZXM7IC8qIHNlZSBhYm92ZSAqLwotICAgdWludDMyX3QJdHJhbnNmZXJfY2hhcjsJLyogc2VlIGFib3ZlICovCi0gICB1aW50MzJfdAlwY3Jfb2Zmc2V0OwkvKiA0NWtIeiBpZiBQQ1IgdHlwZTsgZWxzZSAyN01IeiAqLwotICAgdWludDMyX3QJbl9kcm9wOwkJLyogTnVtYmVyIG9mIHBpY3R1cmVzIHRvIGJlIGRyb3BwZWQgKi8KKwl1aW50MzJfdAlmcmFtZV9yYXRlOwkvKiBzZWUgYWJvdmUgKi8KKwl1aW50MzJfdAltYXRyaXhfY29lZmY7CS8qIHNlZSBhYm92ZSAqLworCXVpbnQzMl90CWFzcGVjdF9yYXRpbzsJLyogc2VlIGFib3ZlICovCisJdWludDMyX3QJY29sb3VyX3ByaW1hcmllczsgLyogc2VlIGFib3ZlICovCisJdWludDMyX3QJdHJhbnNmZXJfY2hhcjsJLyogc2VlIGFib3ZlICovCisJdWludDMyX3QJcGNyX29mZnNldDsJLyogNDVrSHogaWYgUENSIHR5cGU7IGVsc2UgMjdNSHogKi8KKwl1aW50MzJfdAluX2Ryb3A7CQkvKiBOdW1iZXIgb2YgcGljdHVyZXMgdG8gYmUgZHJvcHBlZCAqLwogCi0gICB1aW50MzJfdAljdXN0b21fYXNwZWN0X3JhdGlvX3dpZHRoX2hlaWdodDsKLQkJCS8qIHVwcGVyIDE2LWJpdHMgaXMgWSBhbmQgbG93ZXIgMTYtYml0cyBpcyBYICovCisJdWludDMyX3QJY3VzdG9tX2FzcGVjdF9yYXRpb193aWR0aF9oZWlnaHQ7CisJLyogdXBwZXIgMTYtYml0cyBpcyBZIGFuZCBsb3dlciAxNi1iaXRzIGlzIFggKi8KIAotICAgdWludDMyX3QJcGljdHVyZV90YWc7CS8qIEluZGV4aW5nIHRhZyBmcm9tIEJVRCBwYWNrZXRzICovCi0gICB1aW50MzJfdAlwaWN0dXJlX2RvbmVfcGF5bG9hZDsKLSAgIHVpbnQzMl90CXBpY3R1cmVfbWV0YV9wYXlsb2FkOwotICAgdWludDMyX3QJcmVzZXJ2ZWRbMV07CisJdWludDMyX3QJcGljdHVyZV90YWc7CS8qIEluZGV4aW5nIHRhZyBmcm9tIEJVRCBwYWNrZXRzICovCisJdWludDMyX3QJcGljdHVyZV9kb25lX3BheWxvYWQ7CisJdWludDMyX3QJcGljdHVyZV9tZXRhX3BheWxvYWQ7CisJdWludDMyX3QJcmVzZXJ2ZWRbMV07CiAKLSAgIC8qIFByb3RvY29sLXNwZWNpZmljIGV4dGVuc2lvbnMuICovCi0gICB1bmlvbiB7Ci0gICAgICBzdHJ1Y3QgcHBiX2gyNjQJaDI2NDsKLSAgICAgIHN0cnVjdCBwcGJfbXBlZwltcGVnOwotICAgICAgc3RydWN0IHBwYl92YzEJIHZjMTsKLSAgIH0gb3RoZXI7CisJLyogUHJvdG9jb2wtc3BlY2lmaWMgZXh0ZW5zaW9ucy4gKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBwcGJfaDI2NAloMjY0OworCQlzdHJ1Y3QgcHBiX21wZWcJbXBlZzsKKwkJc3RydWN0IHBwYl92YzEJIHZjMTsKKwl9IG90aGVyOwogCiB9OwogCiBzdHJ1Y3QgYzAxMV9waWIgewotICAgdWludDMyX3QJYkZvcm1hdENoYW5nZTsKLSAgIHVpbnQzMl90CXJlc29sdXRpb247Ci0gICB1aW50MzJfdAljaGFubmVsSWQ7Ci0gICB1aW50MzJfdAlwcGJQdHI7Ci0gICBpbnQzMl90CXB0c1N0Y09mZnNldDsKLSAgIHVpbnQzMl90CXplcm9QYW5zY2FuVmFsaWQ7Ci0gICB1aW50MzJfdAlkcmFtT3V0QnVmQWRkcjsKLSAgIHVpbnQzMl90CXlDb21wb25lbnQ7Ci0gICBzdHJ1Y3QgcHBiCXBwYjsKKwl1aW50MzJfdAliRm9ybWF0Q2hhbmdlOworCXVpbnQzMl90CXJlc29sdXRpb247CisJdWludDMyX3QJY2hhbm5lbElkOworCXVpbnQzMl90CXBwYlB0cjsKKwlpbnQzMl90CXB0c1N0Y09mZnNldDsKKwl1aW50MzJfdAl6ZXJvUGFuc2NhblZhbGlkOworCXVpbnQzMl90CWRyYW1PdXRCdWZBZGRyOworCXVpbnQzMl90CXlDb21wb25lbnQ7CisJc3RydWN0IHBwYglwcGI7CiAKIH07CiAKIHN0cnVjdCBkZWNfcnNwX2NoYW5uZWxfc3RhcnRfdmlkZW8gewotICAgIHVpbnQzMl90CWNvbW1hbmQ7Ci0gICAgdWludDMyX3QJc2VxdWVuY2U7Ci0gICAgdWludDMyX3QJc3RhdHVzOwotICAgIHVpbnQzMl90CXBpY0J1ZjsKLSAgICB1aW50MzJfdAlwaWNSZWxCdWY7Ci0gICAgdWludDMyX3QJcGljSW5mb0RlbGl2ZXJ5UTsKLSAgICB1aW50MzJfdAlwaWNJbmZvUmVsZWFzZVE7Ci0gICAgdWludDMyX3QJY2hhbm5lbFN0YXR1czsKLSAgICB1aW50MzJfdAl1c2VyRGF0YURlbGl2ZXJ5UTsKLSAgICB1aW50MzJfdAl1c2VyRGF0YVJlbGVhc2VROwotICAgIHVpbnQzMl90CXRyYW5zcG9ydFN0cmVhbUNhcHR1cmVBZGRyOwotICAgIHVpbnQzMl90CWFzeW5jRXZlbnRROworCXVpbnQzMl90CWNvbW1hbmQ7CisJdWludDMyX3QJc2VxdWVuY2U7CisJdWludDMyX3QJc3RhdHVzOworCXVpbnQzMl90CXBpY0J1ZjsKKwl1aW50MzJfdAlwaWNSZWxCdWY7CisJdWludDMyX3QJcGljSW5mb0RlbGl2ZXJ5UTsKKwl1aW50MzJfdAlwaWNJbmZvUmVsZWFzZVE7CisJdWludDMyX3QJY2hhbm5lbFN0YXR1czsKKwl1aW50MzJfdAl1c2VyRGF0YURlbGl2ZXJ5UTsKKwl1aW50MzJfdAl1c2VyRGF0YVJlbGVhc2VROworCXVpbnQzMl90CXRyYW5zcG9ydFN0cmVhbUNhcHR1cmVBZGRyOworCXVpbnQzMl90CWFzeW5jRXZlbnRROwogCiB9OwogCkBAIC0yNTEsMTEyICsyNTEsMTEyIEBACiAKIC8qIGhvc3QgY29tbWFuZHMgKi8KIGVudW0gIGMwMTFfdHNfY21kIHsKLSAgICBlQ01EX1RTX0dFVF9ORVhUX1BJQwk9IDB4NzM3NkYxMDAsIC8qIGRlYnVnIGdldCBuZXh0IHBpY3R1cmUgKi8KLSAgICBlQ01EX1RTX0dFVF9MQVNUX1BJQwk9IDB4NzM3NkYxMDIsIC8qIGRlYnVnIGdldCBsYXN0IHBpYyBzdGF0dXMgKi8KLSAgICBlQ01EX1RTX1JFQURfV1JJVEVfTUVNCT0gMHg3Mzc2RjEwNCwgLyogZGVidWcgcmVhZCB3cml0ZSBtZW1vcnkgKi8KKwllQ01EX1RTX0dFVF9ORVhUX1BJQwk9IDB4NzM3NkYxMDAsIC8qIGRlYnVnIGdldCBuZXh0IHBpY3R1cmUgKi8KKwllQ01EX1RTX0dFVF9MQVNUX1BJQwk9IDB4NzM3NkYxMDIsIC8qIGRlYnVnIGdldCBsYXN0IHBpYyBzdGF0dXMgKi8KKwllQ01EX1RTX1JFQURfV1JJVEVfTUVNCT0gMHg3Mzc2RjEwNCwgLyogZGVidWcgcmVhZCB3cml0ZSBtZW1vcnkgKi8KIAotICAgIC8qIE5ldyBBUEkgY29tbWFuZHMgKi8KLSAgICAvKiBHZW5lcmFsIGNvbW1hbmRzICovCi0gICAgZUNNRF9DMDExX0lOSVQJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgwMSwKLSAgICBlQ01EX0MwMTFfUkVTRVQJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgwMiwKLSAgICBlQ01EX0MwMTFfU0VMRl9URVNUCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MDMsCi0gICAgZUNNRF9DMDExX0dFVF9WRVJTSU9OCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgwNCwKLSAgICBlQ01EX0MwMTFfR1BJTwkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDA1LAotICAgIGVDTURfQzAxMV9ERUJVR19TRVRVUAk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MDYsCisJLyogTmV3IEFQSSBjb21tYW5kcyAqLworCS8qIEdlbmVyYWwgY29tbWFuZHMgKi8KKwllQ01EX0MwMTFfSU5JVAkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDAxLAorCWVDTURfQzAxMV9SRVNFVAkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDAyLAorCWVDTURfQzAxMV9TRUxGX1RFU1QJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgwMywKKwllQ01EX0MwMTFfR0VUX1ZFUlNJT04JPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDA0LAorCWVDTURfQzAxMV9HUElPCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MDUsCisJZUNNRF9DMDExX0RFQlVHX1NFVFVQCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgwNiwKIAotICAgIC8qIERlY29kaW5nIGNvbW1hbmRzICovCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX09QRU4JCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTAwLAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9DTE9TRQkJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMDEsCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX0FDVElWQVRFCQkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEwMiwKLSAgICBlQ01EX0MwMTFfREVDX0NIQU5fU1RBVFVTCQkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEwMywKLSAgICBlQ01EX0MwMTFfREVDX0NIQU5fRkxVU0gJCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTA0LAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9UUklDS19QTEFZCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTA1LAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9UU19QSURTCQkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEwNiwKLSAgICBlQ01EX0MwMTFfREVDX0NIQU5fUFNfU1RSRUFNX0lECQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTA3LAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9JTlBVVF9QQVJBTVMJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMDgsCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX1ZJREVPX09VVFBVVAkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEwOSwKLSAgICBlQ01EX0MwMTFfREVDX0NIQU5fT1VUUFVUX0ZPUk1BVAkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEwQSwKLSAgICBlQ01EX0MwMTFfREVDX0NIQU5fU0NBTElOR19GSUxURVJTCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTBCLAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9PU0RfTU9ERQkJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMEQsCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX0RST1AJCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTBFLAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9SRUxFQVNFCQkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEwRiwKLSAgICBlQ01EX0MwMTFfREVDX0NIQU5fU1RSRUFNX1NFVFRJTkdTCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTEwLAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9QQVVTRV9PVVRQVVQJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMTEsCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX0NIQU5HRQkJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMTIsCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9TVEMJCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTEzLAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9TRVRfUFRTCQkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDExNCwKLSAgICBlQ01EX0MwMTFfREVDX0NIQU5fQ0NfTU9ERQkJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMTUsCi0gICAgZUNNRF9DMDExX0RFQ19DUkVBVEVfQVVESU9fQ09OVEVYVAkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDExNiwKLSAgICBlQ01EX0MwMTFfREVDX0NPUFlfQVVESU9fQ09OVEVYVAkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDExNywKLSAgICBlQ01EX0MwMTFfREVDX0RFTEVURV9BVURJT19DT05URVhUCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTE4LAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9TRVRfREVDWVBUSU9OCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTE5LAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9TVEFSVF9WSURFTwkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDExQSwKLSAgICBlQ01EX0MwMTFfREVDX0NIQU5fU1RPUF9WSURFTwkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDExQiwKLSAgICBlQ01EX0MwMTFfREVDX0NIQU5fUElDX0NBUFRVUkUJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMUMsCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX1BBVVNFCQkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDExRCwKLSAgICBlQ01EX0MwMTFfREVDX0NIQU5fUEFVU0VfU1RBVEUJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMUUsCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9TTE9XTV9SQVRFCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTFGLAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9HRVRfU0xPV01fUkFURQkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEyMCwKLSAgICBlQ01EX0MwMTFfREVDX0NIQU5fU0VUX0ZGX1JBVEUJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMjEsCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX0dFVF9GRl9SQVRFCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTIyLAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9GUkFNRV9BRFZBTkNFCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTIzLAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9TRVRfU0tJUF9QSUNfTU9ERQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTI0LAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9HRVRfU0tJUF9QSUNfTU9ERQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTI1LAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9GSUxMX1BJQ19CVUYJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMjYsCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9DT05USU5VSVRZX0NIRUNLCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMjcsCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX0dFVF9DT05USU5VSVRZX0NIRUNLCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMjgsCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9CUkNNX1RSSUNLX01PREUJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEyOSwKLSAgICBlQ01EX0MwMTFfREVDX0NIQU5fR0VUX0JSQ01fVFJJQ0tfTU9ERQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTJBLAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9SRVZFUlNFX0ZJRUxEX1NUQVRVUwk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTJCLAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9JX1BJQ1RVUkVfRk9VTkQJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMkMsCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9QQVJBTUVURVIJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMkQsCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9VU0VSX0RBVEFfTU9ERQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTJFLAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9TRVRfUEFVU0VfRElTUExBWV9NT0RFCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMkYsCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9TTE9XX0RJU1BMQVlfTU9ERQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTMwLAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9TRVRfRkZfRElTUExBWV9NT0RFCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMzEsCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9ESVNQTEFZX1RJTUlOR19NT0RFCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMzIsCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9ESVNQTEFZX01PREUJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMzMsCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX0dFVF9ESVNQTEFZX01PREUJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMzQsCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9SRVZFUlNFX0ZJRUxECT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMzUsCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX1NUUkVBTV9PUEVOCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTM2LAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9TRVRfUENSX1BJRAkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEzNywKLSAgICBlQ01EX0MwMTFfREVDX0NIQU5fU0VUX1ZJRF9QSUQJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMzgsCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9QQU5fU0NBTl9NT0RFCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMzksCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX1NUQVJUX0RJU1BMQVlfQVRfUFRTCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxNDAsCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX1NUT1BfRElTUExBWV9BVF9QVFMJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDE0MSwKLSAgICBlQ01EX0MwMTFfREVDX0NIQU5fU0VUX0RJU1BMQVlfT1JERVIJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDE0MiwKLSAgICBlQ01EX0MwMTFfREVDX0NIQU5fR0VUX0RJU1BMQVlfT1JERVIJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDE0MywKLSAgICBlQ01EX0MwMTFfREVDX0NIQU5fU0VUX0hPU1RfVFJJQ0tfTU9ERQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTQ0LAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9TRVRfT1BFUkFUSU9OX01PREUJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDE0NSwKLSAgICBlQ01EX0MwMTFfREVDX0NIQU5fRElTUExBWV9QQVVTRV9VTlRPX1BUUwk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTQ2LAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9TRVRfUFRTX1NUQ19ESUZGX1RIUkVTSE9MRCA9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTQ3LAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9TRU5EX0NPTVBSRVNTRURfQlVGCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxNDgsCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9DTElQUElORwkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDE0OSwKLSAgICBlQ01EX0MwMTFfREVDX0NIQU5fU0VUX1BBUkFNRVRFUlNfRk9SX0hBUkRfUkVTRVRfSU5URVJSVVBUX1RPX0hPU1QKLQkJCQkJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxNTAsCisJLyogRGVjb2RpbmcgY29tbWFuZHMgKi8KKwllQ01EX0MwMTFfREVDX0NIQU5fT1BFTgkJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMDAsCisJZUNNRF9DMDExX0RFQ19DSEFOX0NMT1NFCQkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEwMSwKKwllQ01EX0MwMTFfREVDX0NIQU5fQUNUSVZBVEUJCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTAyLAorCWVDTURfQzAxMV9ERUNfQ0hBTl9TVEFUVVMJCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTAzLAorCWVDTURfQzAxMV9ERUNfQ0hBTl9GTFVTSAkJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMDQsCisJZUNNRF9DMDExX0RFQ19DSEFOX1RSSUNLX1BMQVkJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMDUsCisJZUNNRF9DMDExX0RFQ19DSEFOX1RTX1BJRFMJCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTA2LAorCWVDTURfQzAxMV9ERUNfQ0hBTl9QU19TVFJFQU1fSUQJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMDcsCisJZUNNRF9DMDExX0RFQ19DSEFOX0lOUFVUX1BBUkFNUwkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEwOCwKKwllQ01EX0MwMTFfREVDX0NIQU5fVklERU9fT1VUUFVUCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTA5LAorCWVDTURfQzAxMV9ERUNfQ0hBTl9PVVRQVVRfRk9STUFUCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTBBLAorCWVDTURfQzAxMV9ERUNfQ0hBTl9TQ0FMSU5HX0ZJTFRFUlMJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMEIsCisJZUNNRF9DMDExX0RFQ19DSEFOX09TRF9NT0RFCQkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEwRCwKKwllQ01EX0MwMTFfREVDX0NIQU5fRFJPUAkJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMEUsCisJZUNNRF9DMDExX0RFQ19DSEFOX1JFTEVBU0UJCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTBGLAorCWVDTURfQzAxMV9ERUNfQ0hBTl9TVFJFQU1fU0VUVElOR1MJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMTAsCisJZUNNRF9DMDExX0RFQ19DSEFOX1BBVVNFX09VVFBVVAkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDExMSwKKwllQ01EX0MwMTFfREVDX0NIQU5fQ0hBTkdFCQkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDExMiwKKwllQ01EX0MwMTFfREVDX0NIQU5fU0VUX1NUQwkJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMTMsCisJZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9QVFMJCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTE0LAorCWVDTURfQzAxMV9ERUNfQ0hBTl9DQ19NT0RFCQkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDExNSwKKwllQ01EX0MwMTFfREVDX0NSRUFURV9BVURJT19DT05URVhUCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTE2LAorCWVDTURfQzAxMV9ERUNfQ09QWV9BVURJT19DT05URVhUCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTE3LAorCWVDTURfQzAxMV9ERUNfREVMRVRFX0FVRElPX0NPTlRFWFQJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMTgsCisJZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9ERUNZUFRJT04JCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMTksCisJZUNNRF9DMDExX0RFQ19DSEFOX1NUQVJUX1ZJREVPCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTFBLAorCWVDTURfQzAxMV9ERUNfQ0hBTl9TVE9QX1ZJREVPCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTFCLAorCWVDTURfQzAxMV9ERUNfQ0hBTl9QSUNfQ0FQVFVSRQkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDExQywKKwllQ01EX0MwMTFfREVDX0NIQU5fUEFVU0UJCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTFELAorCWVDTURfQzAxMV9ERUNfQ0hBTl9QQVVTRV9TVEFURQkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDExRSwKKwllQ01EX0MwMTFfREVDX0NIQU5fU0VUX1NMT1dNX1JBVEUJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMUYsCisJZUNNRF9DMDExX0RFQ19DSEFOX0dFVF9TTE9XTV9SQVRFCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTIwLAorCWVDTURfQzAxMV9ERUNfQ0hBTl9TRVRfRkZfUkFURQkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEyMSwKKwllQ01EX0MwMTFfREVDX0NIQU5fR0VUX0ZGX1JBVEUJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMjIsCisJZUNNRF9DMDExX0RFQ19DSEFOX0ZSQU1FX0FEVkFOQ0UJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMjMsCisJZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9TS0lQX1BJQ19NT0RFCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMjQsCisJZUNNRF9DMDExX0RFQ19DSEFOX0dFVF9TS0lQX1BJQ19NT0RFCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMjUsCisJZUNNRF9DMDExX0RFQ19DSEFOX0ZJTExfUElDX0JVRgkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEyNiwKKwllQ01EX0MwMTFfREVDX0NIQU5fU0VUX0NPTlRJTlVJVFlfQ0hFQ0sJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEyNywKKwllQ01EX0MwMTFfREVDX0NIQU5fR0VUX0NPTlRJTlVJVFlfQ0hFQ0sJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEyOCwKKwllQ01EX0MwMTFfREVDX0NIQU5fU0VUX0JSQ01fVFJJQ0tfTU9ERQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTI5LAorCWVDTURfQzAxMV9ERUNfQ0hBTl9HRVRfQlJDTV9UUklDS19NT0RFCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMkEsCisJZUNNRF9DMDExX0RFQ19DSEFOX1JFVkVSU0VfRklFTERfU1RBVFVTCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMkIsCisJZUNNRF9DMDExX0RFQ19DSEFOX0lfUElDVFVSRV9GT1VORAkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEyQywKKwllQ01EX0MwMTFfREVDX0NIQU5fU0VUX1BBUkFNRVRFUgkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEyRCwKKwllQ01EX0MwMTFfREVDX0NIQU5fU0VUX1VTRVJfREFUQV9NT0RFCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMkUsCisJZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9QQVVTRV9ESVNQTEFZX01PREUJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEyRiwKKwllQ01EX0MwMTFfREVDX0NIQU5fU0VUX1NMT1dfRElTUExBWV9NT0RFCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMzAsCisJZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9GRl9ESVNQTEFZX01PREUJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEzMSwKKwllQ01EX0MwMTFfREVDX0NIQU5fU0VUX0RJU1BMQVlfVElNSU5HX01PREUJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEzMiwKKwllQ01EX0MwMTFfREVDX0NIQU5fU0VUX0RJU1BMQVlfTU9ERQkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEzMywKKwllQ01EX0MwMTFfREVDX0NIQU5fR0VUX0RJU1BMQVlfTU9ERQkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEzNCwKKwllQ01EX0MwMTFfREVDX0NIQU5fU0VUX1JFVkVSU0VfRklFTEQJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEzNSwKKwllQ01EX0MwMTFfREVDX0NIQU5fU1RSRUFNX09QRU4JCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxMzYsCisJZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9QQ1JfUElECQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTM3LAorCWVDTURfQzAxMV9ERUNfQ0hBTl9TRVRfVklEX1BJRAkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEzOCwKKwllQ01EX0MwMTFfREVDX0NIQU5fU0VUX1BBTl9TQ0FOX01PREUJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDEzOSwKKwllQ01EX0MwMTFfREVDX0NIQU5fU1RBUlRfRElTUExBWV9BVF9QVFMJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDE0MCwKKwllQ01EX0MwMTFfREVDX0NIQU5fU1RPUF9ESVNQTEFZX0FUX1BUUwk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTQxLAorCWVDTURfQzAxMV9ERUNfQ0hBTl9TRVRfRElTUExBWV9PUkRFUgk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTQyLAorCWVDTURfQzAxMV9ERUNfQ0hBTl9HRVRfRElTUExBWV9PUkRFUgk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTQzLAorCWVDTURfQzAxMV9ERUNfQ0hBTl9TRVRfSE9TVF9UUklDS19NT0RFCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxNDQsCisJZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9PUEVSQVRJT05fTU9ERQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTQ1LAorCWVDTURfQzAxMV9ERUNfQ0hBTl9ESVNQTEFZX1BBVVNFX1VOVE9fUFRTCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxNDYsCisJZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9QVFNfU1RDX0RJRkZfVEhSRVNIT0xEID0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxNDcsCisJZUNNRF9DMDExX0RFQ19DSEFOX1NFTkRfQ09NUFJFU1NFRF9CVUYJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDE0OCwKKwllQ01EX0MwMTFfREVDX0NIQU5fU0VUX0NMSVBQSU5HCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTQ5LAorCWVDTURfQzAxMV9ERUNfQ0hBTl9TRVRfUEFSQU1FVEVSU19GT1JfSEFSRF9SRVNFVF9JTlRFUlJVUFRfVE9fSE9TVAorCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTUwLAogCi0gICAgLyogRGVjb2RlciBSZXZEIGNvbW1hbmRzICovCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9DU0MJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDE4MCwgLyogY29sb3Igc3BhY2UgY29udmVyc2lvbiAqLwotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9TRVRfUkFOR0VfUkVNQVAJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDE4MSwKLSAgICBlQ01EX0MwMTFfREVDX0NIQU5fU0VUX0ZHVAkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDE4MiwKLSAgICAvKiBOb3RlOiAweDE4MyBub3QgaW1wbGVtZW50ZWQgeWV0IGluIFJldiBEIG1haW4gKi8KLSAgICBlQ01EX0MwMTFfREVDX0NIQU5fU0VUX0xBU1RQSUNUVVJFX1BBRERJTkcgPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDE4MywKKwkvKiBEZWNvZGVyIFJldkQgY29tbWFuZHMgKi8KKwllQ01EX0MwMTFfREVDX0NIQU5fU0VUX0NTQwk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTgwLCAvKiBjb2xvciBzcGFjZSBjb252ZXJzaW9uICovCisJZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9SQU5HRV9SRU1BUAk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTgxLAorCWVDTURfQzAxMV9ERUNfQ0hBTl9TRVRfRkdUCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTgyLAorCS8qIE5vdGU6IDB4MTgzIG5vdCBpbXBsZW1lbnRlZCB5ZXQgaW4gUmV2IEQgbWFpbiAqLworCWVDTURfQzAxMV9ERUNfQ0hBTl9TRVRfTEFTVFBJQ1RVUkVfUEFERElORyA9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTgzLAogCi0gICAgLyogRGVjb2RlciA3NDEyIGNvbW1hbmRzICg3NDEyLW9ubHkpICovCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9DT05URU5UX0tFWQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTkwLAotICAgIGVDTURfQzAxMV9ERUNfQ0hBTl9TRVRfU0VTU0lPTl9LRVkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDE5MSwKLSAgICBlQ01EX0MwMTFfREVDX0NIQU5fRk1UX0NIQU5HRV9BQ0sJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDE5MiwKKwkvKiBEZWNvZGVyIDc0MTIgY29tbWFuZHMgKDc0MTItb25seSkgKi8KKwllQ01EX0MwMTFfREVDX0NIQU5fU0VUX0NPTlRFTlRfS0VZCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgxOTAsCisJZUNNRF9DMDExX0RFQ19DSEFOX1NFVF9TRVNTSU9OX0tFWQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTkxLAorCWVDTURfQzAxMV9ERUNfQ0hBTl9GTVRfQ0hBTkdFX0FDSwk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MTkyLAogCi0gICAgZUNNRF9DMDExX0RFQ19DSEFOX0NVU1RPTV9WSURPVVQgICAgPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDFGRiwKKwllQ01EX0MwMTFfREVDX0NIQU5fQ1VTVE9NX1ZJRE9VVCAgICA9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MUZGLAogCi0gICAgLyogRW5jb2RpbmcgY29tbWFuZHMgKi8KLSAgICBlQ01EX0MwMTFfRU5DX0NIQU5fT1BFTgkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDIwMCwKLSAgICBlQ01EX0MwMTFfRU5DX0NIQU5fQ0xPU0UJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgyMDEsCi0gICAgZUNNRF9DMDExX0VOQ19DSEFOX0FDVElWQVRFCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MjAyLAotICAgIGVDTURfQzAxMV9FTkNfQ0hBTl9DT05UUk9MCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MjAzLAotICAgIGVDTURfQzAxMV9FTkNfQ0hBTl9TVEFUSVNUSUNTCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgyMDQsCisJLyogRW5jb2RpbmcgY29tbWFuZHMgKi8KKwllQ01EX0MwMTFfRU5DX0NIQU5fT1BFTgkJPSBlQ01EX0MwMTFfQ01EX0JBU0UgKyAweDIwMCwKKwllQ01EX0MwMTFfRU5DX0NIQU5fQ0xPU0UJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgyMDEsCisJZUNNRF9DMDExX0VOQ19DSEFOX0FDVElWQVRFCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MjAyLAorCWVDTURfQzAxMV9FTkNfQ0hBTl9DT05UUk9MCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MjAzLAorCWVDTURfQzAxMV9FTkNfQ0hBTl9TVEFUSVNUSUNTCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgyMDQsCiAKLSAgICBlTk9USUZZX0MwMTFfRU5DX0NIQU5fRVZFTlQJCT0gZUNNRF9DMDExX0NNRF9CQVNFICsgMHgyMTAsCisJZU5PVElGWV9DMDExX0VOQ19DSEFOX0VWRU5UCQk9IGVDTURfQzAxMV9DTURfQkFTRSArIDB4MjEwLAogCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9taXNjLmggYi9kcml2ZXJzL3N0YWdpbmcvY3J5c3RhbGhkL2NyeXN0YWxoZF9taXNjLmgKaW5kZXggMzgyMDc4ZS4uNGQ2MTcyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NyeXN0YWxoZC9jcnlzdGFsaGRfbWlzYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jcnlzdGFsaGQvY3J5c3RhbGhkX21pc2MuaApAQCAtMjA1LDEyICsyMDUsMTIgQEAKIAogI2RlZmluZSBCQ01MT0dfRU5URVIJCQkJXAogaWYgKGdfbGlua2xvZ19sZXZlbCAmIEJDTUxPR19FTlRFUl9MRUFWRSkgewlcCi0JcHJpbnRrKCJFbnRlcmVkICVzXG4iLCBfX2Z1bmNfXyk7CVwKKwlwcmludGsoS0VSTl9ERUJVRyAiRW50ZXJlZCAlc1xuIiwgX19mdW5jX18pOwlcCiB9CiAKICNkZWZpbmUgQkNNTE9HX0xFQVZFCQkJCVwKIGlmIChnX2xpbmtsb2dfbGV2ZWwgJiBCQ01MT0dfRU5URVJfTEVBVkUpIHsJXAotCXByaW50aygiTGVhdmluZyAlc1xuIiwgX19mdW5jX18pOwlcCisJcHJpbnRrKEtFUk5fREVCVUcgIkxlYXZpbmcgJXNcbiIsIF9fZnVuY19fKTsJXAogfQogCiAjZGVmaW5lIEJDTUxPRyh0cmFjZSwgZm10LCBhcmdzLi4uKQkJXApAQCAtMjIxLDcgKzIyMSw3IEBACiAjZGVmaW5lIEJDTUxPR19FUlIoZm10LCBhcmdzLi4uKQkJCQkJXAogZG8gewkJCQkJCQkJCVwKIAlpZiAoZ19saW5rbG9nX2xldmVsICYgQkNNTE9HX0VSUk9SKSB7CQkJCVwKLQkJcHJpbnRrKCIqRVJSKjolczolZDogImZtdCwgX19GSUxFX18sIF9fTElORV9fLCAjI2FyZ3MpOwlcCisJCXByaW50ayhLRVJOX0VSUiAiKkVSUio6JXM6JWQ6ICJmbXQsIF9fRklMRV9fLCBfX0xJTkVfXywgIyNhcmdzKTsJXAogCX0JCQkJCQkJCVwKIH0gd2hpbGUgKDApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWFsc2EuYyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYWxzYS5jCmluZGV4IGViZGJhN2MuLjA5ZTk5ZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYWxzYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYWxzYS5jCkBAIC03MDgsNyArNzA4LDcgQEAKIAljaGlwLT5pcnEgPSBkZXYtPnBjaS0+aXJxOwogCiAJZXJyID0gcmVxdWVzdF9pcnEoZGV2LT5wY2ktPmlycSwgY3gyNTgyMV9pcnEsCi0JCQkgIElSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCwgY2hpcC0+ZGV2LT5uYW1lLCBjaGlwKTsKKwkJCSAgSVJRRl9TSEFSRUQsIGNoaXAtPmRldi0+bmFtZSwgY2hpcCk7CiAKIAlpZiAoZXJyIDwgMCkgewogCQlwcl9lcnIoIkVSUk9SICVzOiBjYW4ndCBnZXQgSVJRICVkIGZvciBBTFNBXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1hdWRpby11cHN0cmVhbS5jIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1hdWRpby11cHN0cmVhbS5jCmluZGV4IDBmOWNhNzcuLmMyMGQ2ZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYXVkaW8tdXBzdHJlYW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWF1ZGlvLXVwc3RyZWFtLmMKQEAgLTEwNyw3ICsxMDcsNyBAQAogewogCXVuc2lnbmVkIGludCBsaW5lOwogCXN0cnVjdCBzcmFtX2NoYW5uZWwgKnNyYW1fY2ggPQotCSAgIGRldi0+Y2hhbm5lbHNbZGV2LT5fYXVkaW9fdXBzdHJlYW1fY2hhbm5lbF9zZWxlY3RdLnNyYW1fY2hhbm5lbHM7CisJICAgZGV2LT5jaGFubmVsc1tkZXYtPl9hdWRpb191cHN0cmVhbV9jaGFubmVsXS5zcmFtX2NoYW5uZWxzOwogCWludCBvZmZzZXQgPSAwOwogCiAJLyogc2NhbiBsaW5lcyAqLwpAQCAtMzQ5LDEwICszNDksOCBAQAogCQlyZXR1cm47CiAJfQogCi0JY3gyNTgyMV9nZXRfYXVkaW9fZGF0YShkZXYsCi0JCQkgICAgICBkZXYtPmNoYW5uZWxzW2Rldi0+Ci0JCQkJICAgICAgIF9hdWRpb191cHN0cmVhbV9jaGFubmVsX3NlbGVjdF0uCi0JCQkJICAgICAgIHNyYW1fY2hhbm5lbHMpOworCWN4MjU4MjFfZ2V0X2F1ZGlvX2RhdGEoZGV2LCBkZXYtPmNoYW5uZWxzW2Rldi0+X2F1ZGlvX3Vwc3RyZWFtX2NoYW5uZWxdLgorCQkJc3JhbV9jaGFubmVscyk7CiB9CiAKIGludCBjeDI1ODIxX29wZW5maWxlX2F1ZGlvKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LApAQCAtNTQwLDEzICs1MzgsOSBAQAogCQkJCSAgICBBVURJT19SSVNDX0RNQV9CVUZfU0laRTsKIAogCQkJCXJwID0gY3gyNTgyMV9yaXNjX2ZpZWxkX3Vwc3RyZWFtX2F1ZGlvKGRldiwKLQkJCQkJCQkJICAgICAgIGRldi0+Ci0JCQkJCQkJCSAgICAgICBfcmlzY192aXJ0X3N0YXJ0X2FkZHIKLQkJCQkJCQkJICAgICAgICsgMSwKLQkJCQkJCQkJICAgICAgIGRldi0+Ci0JCQkJCQkJCSAgICAgICBfYXVkaW9kYXRhX2J1Zl9waHlzX2FkZHIsCi0JCQkJCQkJCSAgICAgICBBVURJT19MSU5FX1NJWkUsCi0JCQkJCQkJCSAgICAgICBGSUZPX0RJU0FCTEUpOworCQkJCQkJZGV2LT5fcmlzY192aXJ0X3N0YXJ0X2FkZHIgKyAxLAorCQkJCQkJZGV2LT5fYXVkaW9kYXRhX2J1Zl9waHlzX2FkZHIsCisJCQkJCQlBVURJT19MSU5FX1NJWkUsIEZJRk9fRElTQUJMRSk7CiAKIAkJCQlpZiAoVVNFX1JJU0NfTk9PUF9BVURJTykgewogCQkJCQlmb3IgKGkgPSAwOyBpIDwgTlVNX05PX09QUzsgaSsrKSB7CkBAIC01NTUsOCArNTQ5LDcgQEAKIAkJCQkJfQogCQkJCX0KIAkJCQkvKiBKdW1wIHRvIDJuZCBBdWRpbyBGcmFtZSAqLwotCQkJCSoocnArKykgPQotCQkJCSAgICBjcHVfdG9fbGUzMihSSVNDX0pVTVAgfCBSSVNDX0lSUTEgfAorCQkJCSoocnArKykgPSBjcHVfdG9fbGUzMihSSVNDX0pVTVAgfCBSSVNDX0lSUTEgfAogCQkJCQkJUklTQ19DTlRfUkVTRVQpOwogCQkJCSoocnArKykgPSBjcHVfdG9fbGUzMihyaXNjX3BoeXNfanVtcF9hZGRyKTsKIAkJCQkqKHJwKyspID0gY3B1X3RvX2xlMzIoMCk7CkBAIC02MDQsMTggKzU5NywxNSBAQAogCWlmICghZGV2KQogCQlyZXR1cm4gLTE7CiAKLQlzcmFtX2NoID0gZGV2LT5jaGFubmVsc1tkZXYtPl9hdWRpb191cHN0cmVhbV9jaGFubmVsX3NlbGVjdF0uc3JhbV9jaGFubmVsczsKKwlzcmFtX2NoID0gZGV2LT5jaGFubmVsc1tkZXYtPl9hdWRpb191cHN0cmVhbV9jaGFubmVsXS5zcmFtX2NoYW5uZWxzOwogCiAJbXNrX3N0YXQgPSBjeF9yZWFkKHNyYW1fY2gtPmludF9tc3RhdCk7CiAJYXVkaW9fc3RhdHVzID0gY3hfcmVhZChzcmFtX2NoLT5pbnRfc3RhdCk7CiAKIAkvKiBPbmx5IGRlYWwgd2l0aCBvdXIgaW50ZXJydXB0ICovCiAJaWYgKGF1ZGlvX3N0YXR1cykgewotCQloYW5kbGVkID0KLQkJICAgIGN4MjU4MjFfYXVkaW9fdXBzdHJlYW1faXJxKGRldiwKLQkJCQkJICAgICAgIGRldi0+Ci0JCQkJCSAgICAgICBfYXVkaW9fdXBzdHJlYW1fY2hhbm5lbF9zZWxlY3QsCi0JCQkJCSAgICAgICBhdWRpb19zdGF0dXMpOworCQloYW5kbGVkID0gY3gyNTgyMV9hdWRpb191cHN0cmVhbV9pcnEoZGV2LAorCQkJCWRldi0+X2F1ZGlvX3Vwc3RyZWFtX2NoYW5uZWwsIGF1ZGlvX3N0YXR1cyk7CiAJfQogCiAJaWYgKGhhbmRsZWQgPCAwKQpAQCAtNjkwLDcgKzY4MCw3IEBACiAKIAllcnIgPQogCSAgICByZXF1ZXN0X2lycShkZXYtPnBjaS0+aXJxLCBjeDI1ODIxX3Vwc3RyZWFtX2lycV9hdWRpbywKLQkJCUlSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCwgZGV2LT5uYW1lLCBkZXYpOworCQkJSVJRRl9TSEFSRUQsIGRldi0+bmFtZSwgZGV2KTsKIAlpZiAoZXJyIDwgMCkgewogCQlwcl9lcnIoIiVzOiBjYW4ndCBnZXQgdXBzdHJlYW0gSVJRICVkXG4iLAogCQkgICAgICAgZGV2LT5uYW1lLCBkZXYtPnBjaS0+aXJxKTsKQEAgLTcyNiw3ICs3MTYsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlkZXYtPl9hdWRpb191cHN0cmVhbV9jaGFubmVsX3NlbGVjdCA9IGNoYW5uZWxfc2VsZWN0OworCWRldi0+X2F1ZGlvX3Vwc3RyZWFtX2NoYW5uZWwgPSBjaGFubmVsX3NlbGVjdDsKIAlzcmFtX2NoID0gZGV2LT5jaGFubmVsc1tjaGFubmVsX3NlbGVjdF0uc3JhbV9jaGFubmVsczsKIAogCS8qIFdvcmsgcXVldWUgKi8KQEAgLTc3MCw5ICs3NjAsOCBAQAogCQltZW1jcHkoZGV2LT5fYXVkaW9maWxlbmFtZSwgX2RlZmF1bHRBdWRpb05hbWUsIHN0cl9sZW5ndGggKyAxKTsKIAl9CiAKLQlyZXR2YWwgPQotCSAgICBjeDI1ODIxX3NyYW1fY2hhbm5lbF9zZXR1cF91cHN0cmVhbV9hdWRpbyhkZXYsIHNyYW1fY2gsIF9saW5lX3NpemUsCi0JCQkJCQkgICAgICAwKTsKKwlyZXR2YWwgPSBjeDI1ODIxX3NyYW1fY2hhbm5lbF9zZXR1cF91cHN0cmVhbV9hdWRpbyhkZXYsIHNyYW1fY2gsCisJCQkJCQkJX2xpbmVfc2l6ZSwgMCk7CiAKIAlkZXYtPmF1ZGlvX3Vwc3RyZWFtX3Jpc2NidWZfc2l6ZSA9CiAJICAgIEFVRElPX1JJU0NfRE1BX0JVRl9TSVpFICogTlVNX0FVRElPX1BST0dTICsKQEAgLTc4MCw4ICs3NjksOCBAQAogCWRldi0+YXVkaW9fdXBzdHJlYW1fZGF0YWJ1Zl9zaXplID0gQVVESU9fREFUQV9CVUZfU1ogKiBOVU1fQVVESU9fUFJPR1M7CiAKIAkvKiBBbGxvY2F0aW5nIGJ1ZmZlcnMgYW5kIHByZXBhcmUgUklTQyBwcm9ncmFtICovCi0JcmV0dmFsID0KLQkgICAgY3gyNTgyMV9hdWRpb191cHN0cmVhbV9idWZmZXJfcHJlcGFyZShkZXYsIHNyYW1fY2gsIF9saW5lX3NpemUpOworCXJldHZhbCA9IGN4MjU4MjFfYXVkaW9fdXBzdHJlYW1fYnVmZmVyX3ByZXBhcmUoZGV2LCBzcmFtX2NoLAorCQkJCQkJCV9saW5lX3NpemUpOwogCWlmIChyZXR2YWwgPCAwKSB7CiAJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgdXAgQXVkaW8gdXBzdHJlYW0gYnVmZmVycyFcbiIsCiAJCSAgICAgICBkZXYtPm5hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1hdWRpby11cHN0cmVhbS5oIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1hdWRpby11cHN0cmVhbS5oCmluZGV4IDY2OGE0ZjEuLmFmMmFlN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYXVkaW8tdXBzdHJlYW0uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWF1ZGlvLXVwc3RyZWFtLmgKQEAgLTQ2LDExICs0NiwxNiBAQAogI2RlZmluZSBVU0VfUklTQ19OT09QX0FVRElPICAgMQogCiAjaWZkZWYgVVNFX1JJU0NfTk9PUF9BVURJTwotI2RlZmluZSBBVURJT19SSVNDX0RNQV9CVUZfU0laRSAgICAoTElORVNfUEVSX0FVRElPX0JVRkZFUipSSVNDX1JFQURfSU5TVFJVQ1RJT05fU0laRSArIFJJU0NfV1JJVEVDUl9JTlNUUlVDVElPTl9TSVpFICsgTlVNX05PX09QUypEV09SRF9TSVpFICsgUklTQ19KVU1QX0lOU1RSVUNUSU9OX1NJWkUpCisjZGVmaW5lIEFVRElPX1JJU0NfRE1BX0JVRl9TSVpFCQkJCQkJXAorCShMSU5FU19QRVJfQVVESU9fQlVGRkVSICogUklTQ19SRUFEX0lOU1RSVUNUSU9OX1NJWkUgKwkJXAorCSBSSVNDX1dSSVRFQ1JfSU5TVFJVQ1RJT05fU0laRSArIE5VTV9OT19PUFMgKiBEV09SRF9TSVpFICsJXAorCSBSSVNDX0pVTVBfSU5TVFJVQ1RJT05fU0laRSkKICNlbmRpZgogCiAjaWZuZGVmIFVTRV9SSVNDX05PT1BfQVVESU8KLSNkZWZpbmUgQVVESU9fUklTQ19ETUFfQlVGX1NJWkUgICAgKExJTkVTX1BFUl9BVURJT19CVUZGRVIqUklTQ19SRUFEX0lOU1RSVUNUSU9OX1NJWkUgKyBSSVNDX1dSSVRFQ1JfSU5TVFJVQ1RJT05fU0laRSArIFJJU0NfSlVNUF9JTlNUUlVDVElPTl9TSVpFKQorI2RlZmluZSBBVURJT19SSVNDX0RNQV9CVUZfU0laRQkJCQkJCVwKKwkoTElORVNfUEVSX0FVRElPX0JVRkZFUiAqIFJJU0NfUkVBRF9JTlNUUlVDVElPTl9TSVpFICsJCVwKKwkgUklTQ19XUklURUNSX0lOU1RSVUNUSU9OX1NJWkUgKyBSSVNDX0pVTVBfSU5TVFJVQ1RJT05fU0laRSkKICNlbmRpZgogCiBzdGF0aWMgaW50IF9saW5lX3NpemU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWF1ZGlvLmggYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWF1ZGlvLmgKaW5kZXggMjc3MTcyNS4uOGViNTViNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1hdWRpby5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtYXVkaW8uaApAQCAtMzYsMTMgKzM2LDE1IEBACiAgKi8KICNpZm5kZWYgVVNFX1JJU0NfTk9PUAogI2RlZmluZSBNQVhfQlVGRkVSX1BST0dSQU1fU0laRSAgICAgXAotCSgyKkxJTkVTX1BFUl9CVUZGRVIqUklTQ19XUklURV9JTlNUUlVDVElPTl9TSVpFICsgUklTQ19XUklURUNSX0lOU1RSVUNUSU9OX1NJWkUqNCkKKwkoMiAqIExJTkVTX1BFUl9CVUZGRVIgKiBSSVNDX1dSSVRFX0lOU1RSVUNUSU9OX1NJWkUgKyBcCisJUklTQ19XUklURUNSX0lOU1RSVUNUSU9OX1NJWkUgKiA0KQogI2VuZGlmCiAKIC8qIE1BRSAxMiBKdWx5IDIwMDUgVHJ5IHRvIHVzZSBOT09QIFJJU0MgaW5zdHJ1Y3Rpb24gaW5zdGVhZCAqLwogI2lmZGVmIFVTRV9SSVNDX05PT1AKICNkZWZpbmUgTUFYX0JVRkZFUl9QUk9HUkFNX1NJWkUgICAgIFwKLQkoMipMSU5FU19QRVJfQlVGRkVSKlJJU0NfV1JJVEVfSU5TVFJVQ1RJT05fU0laRSArIFJJU0NfTk9PUF9JTlNUUlVDVElPTl9TSVpFKjQpCisJKDIgKiBMSU5FU19QRVJfQlVGRkVSICogUklTQ19XUklURV9JTlNUUlVDVElPTl9TSVpFICsgXAorCVJJU0NfTk9PUF9JTlNUUlVDVElPTl9TSVpFICogNCkKICNlbmRpZgogCiAvKiBTaXplcyBvZiB2YXJpb3VzIGluc3RydWN0aW9ucyBpbiBieXRlcy4gIFVzZWQgd2hlbiBhZGRpbmcgaW5zdHJ1Y3Rpb25zLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1jYXJkcy5jIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1jYXJkcy5jCmluZGV4IDk0ZThkNjguLjZhY2U2MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtY2FyZHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWNhcmRzLmMKQEAgLTM2LDE3ICszNiwxNyBAQAogCiBzdHJ1Y3QgY3gyNTgyMV9ib2FyZCBjeDI1ODIxX2JvYXJkc1tdID0gewogCVtVTktOT1dOX0JPQVJEXSA9IHsKLQkJCSAgIC5uYW1lID0gIlVOS05PV04vR0VORVJJQyIsCi0JCQkgICAvKiBFbnN1cmUgc2FmZSBkZWZhdWx0IGZvciB1bmtub3duIGJvYXJkcyAqLwotCQkJICAgLmNsa19mcmVxID0gMCwKLQkJCSAgIH0sCisJCS5uYW1lID0gIlVOS05PV04vR0VORVJJQyIsCisJCS8qIEVuc3VyZSBzYWZlIGRlZmF1bHQgZm9yIHVua25vd24gYm9hcmRzICovCisJCS5jbGtfZnJlcSA9IDAsCisJfSwKIAogCVtDWDI1ODIxX0JPQVJEXSA9IHsKLQkJCSAgIC5uYW1lID0gIkNYMjU4MjEiLAotCQkJICAgLnBvcnRiID0gQ1gyNTgyMV9SQVcsCi0JCQkgICAucG9ydGMgPSBDWDI1ODIxXzI2NCwKLQkJCSAgIC5pbnB1dFswXS50eXBlID0gQ1gyNTgyMV9WTVVYX0NPTVBPU0lURSwKLQkJCSAgIH0sCisJCS5uYW1lID0gIkNYMjU4MjEiLAorCQkucG9ydGIgPSBDWDI1ODIxX1JBVywKKwkJLnBvcnRjID0gQ1gyNTgyMV8yNjQsCisJCS5pbnB1dFswXS50eXBlID0gQ1gyNTgyMV9WTVVYX0NPTVBPU0lURSwKKwl9LAogCiB9OwogCkBAIC01NCwxMCArNTQsMTAgQEAKIAogc3RydWN0IGN4MjU4MjFfc3ViaWQgY3gyNTgyMV9zdWJpZHNbXSA9IHsKIAl7Ci0JIC5zdWJ2ZW5kb3IgPSAweDE0ZjEsCi0JIC5zdWJkZXZpY2UgPSAweDA5MjAsCi0JIC5jYXJkID0gQ1gyNTgyMV9CT0FSRCwKLQkgfSwKKwkJLnN1YnZlbmRvciA9IDB4MTRmMSwKKwkJLnN1YmRldmljZSA9IDB4MDkyMCwKKwkJLmNhcmQgPSBDWDI1ODIxX0JPQVJELAorCX0sCiB9OwogCiB2b2lkIGN4MjU4MjFfY2FyZF9zZXR1cChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1jb3JlLmMKaW5kZXggNTIzYWM1ZS4uYTdmYTM4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1jb3JlLmMKQEAgLTUwLDI3MCArNTAsMjcwIEBACiAKIHN0cnVjdCBzcmFtX2NoYW5uZWwgY3gyNTgyMV9zcmFtX2NoYW5uZWxzW10gPSB7CiAJW1NSQU1fQ0gwMF0gPSB7Ci0JCSAgICAgICAuaSA9IFNSQU1fQ0gwMCwKLQkJICAgICAgIC5uYW1lID0gIlZJRCBBIiwKLQkJICAgICAgIC5jbWRzX3N0YXJ0ID0gVklEX0FfRE9XTl9DTURTLAotCQkgICAgICAgLmN0cmxfc3RhcnQgPSBWSURfQV9JUSwKLQkJICAgICAgIC5jZHQgPSBWSURfQV9DRFQsCi0JCSAgICAgICAuZmlmb19zdGFydCA9IFZJRF9BX0RPV05fQ0xVU1RFUl8xLAotCQkgICAgICAgLmZpZm9fc2l6ZSA9IChWSURfQ0xVU1RFUl9TSVpFIDw8IDIpLAotCQkgICAgICAgLnB0cjFfcmVnID0gRE1BMV9QVFIxLAotCQkgICAgICAgLnB0cjJfcmVnID0gRE1BMV9QVFIyLAotCQkgICAgICAgLmNudDFfcmVnID0gRE1BMV9DTlQxLAotCQkgICAgICAgLmNudDJfcmVnID0gRE1BMV9DTlQyLAotCQkgICAgICAgLmludF9tc2sgPSBWSURfQV9JTlRfTVNLLAotCQkgICAgICAgLmludF9zdGF0ID0gVklEX0FfSU5UX1NUQVQsCi0JCSAgICAgICAuaW50X21zdGF0ID0gVklEX0FfSU5UX01TVEFULAotCQkgICAgICAgLmRtYV9jdGwgPSBWSURfRFNUX0FfRE1BX0NUTCwKLQkJICAgICAgIC5ncGNudF9jdGwgPSBWSURfRFNUX0FfR1BDTlRfQ1RMLAotCQkgICAgICAgLmdwY250ID0gVklEX0RTVF9BX0dQQ05ULAotCQkgICAgICAgLnZpcF9jdGwgPSBWSURfRFNUX0FfVklQX0NUTCwKLQkJICAgICAgIC5waXhfZnJtdCA9IFZJRF9EU1RfQV9QSVhfRlJNVCwKLQkJICAgICAgIH0sCisJCS5pID0gU1JBTV9DSDAwLAorCQkubmFtZSA9ICJWSUQgQSIsCisJCS5jbWRzX3N0YXJ0ID0gVklEX0FfRE9XTl9DTURTLAorCQkuY3RybF9zdGFydCA9IFZJRF9BX0lRLAorCQkuY2R0ID0gVklEX0FfQ0RULAorCQkuZmlmb19zdGFydCA9IFZJRF9BX0RPV05fQ0xVU1RFUl8xLAorCQkuZmlmb19zaXplID0gKFZJRF9DTFVTVEVSX1NJWkUgPDwgMiksCisJCS5wdHIxX3JlZyA9IERNQTFfUFRSMSwKKwkJLnB0cjJfcmVnID0gRE1BMV9QVFIyLAorCQkuY250MV9yZWcgPSBETUExX0NOVDEsCisJCS5jbnQyX3JlZyA9IERNQTFfQ05UMiwKKwkJLmludF9tc2sgPSBWSURfQV9JTlRfTVNLLAorCQkuaW50X3N0YXQgPSBWSURfQV9JTlRfU1RBVCwKKwkJLmludF9tc3RhdCA9IFZJRF9BX0lOVF9NU1RBVCwKKwkJLmRtYV9jdGwgPSBWSURfRFNUX0FfRE1BX0NUTCwKKwkJLmdwY250X2N0bCA9IFZJRF9EU1RfQV9HUENOVF9DVEwsCisJCS5ncGNudCA9IFZJRF9EU1RfQV9HUENOVCwKKwkJLnZpcF9jdGwgPSBWSURfRFNUX0FfVklQX0NUTCwKKwkJLnBpeF9mcm10ID0gVklEX0RTVF9BX1BJWF9GUk1ULAorCX0sCiAKIAlbU1JBTV9DSDAxXSA9IHsKLQkJICAgICAgIC5pID0gU1JBTV9DSDAxLAotCQkgICAgICAgLm5hbWUgPSAiVklEIEIiLAotCQkgICAgICAgLmNtZHNfc3RhcnQgPSBWSURfQl9ET1dOX0NNRFMsCi0JCSAgICAgICAuY3RybF9zdGFydCA9IFZJRF9CX0lRLAotCQkgICAgICAgLmNkdCA9IFZJRF9CX0NEVCwKLQkJICAgICAgIC5maWZvX3N0YXJ0ID0gVklEX0JfRE9XTl9DTFVTVEVSXzEsCi0JCSAgICAgICAuZmlmb19zaXplID0gKFZJRF9DTFVTVEVSX1NJWkUgPDwgMiksCi0JCSAgICAgICAucHRyMV9yZWcgPSBETUEyX1BUUjEsCi0JCSAgICAgICAucHRyMl9yZWcgPSBETUEyX1BUUjIsCi0JCSAgICAgICAuY250MV9yZWcgPSBETUEyX0NOVDEsCi0JCSAgICAgICAuY250Ml9yZWcgPSBETUEyX0NOVDIsCi0JCSAgICAgICAuaW50X21zayA9IFZJRF9CX0lOVF9NU0ssCi0JCSAgICAgICAuaW50X3N0YXQgPSBWSURfQl9JTlRfU1RBVCwKLQkJICAgICAgIC5pbnRfbXN0YXQgPSBWSURfQl9JTlRfTVNUQVQsCi0JCSAgICAgICAuZG1hX2N0bCA9IFZJRF9EU1RfQl9ETUFfQ1RMLAotCQkgICAgICAgLmdwY250X2N0bCA9IFZJRF9EU1RfQl9HUENOVF9DVEwsCi0JCSAgICAgICAuZ3BjbnQgPSBWSURfRFNUX0JfR1BDTlQsCi0JCSAgICAgICAudmlwX2N0bCA9IFZJRF9EU1RfQl9WSVBfQ1RMLAotCQkgICAgICAgLnBpeF9mcm10ID0gVklEX0RTVF9CX1BJWF9GUk1ULAotCQkgICAgICAgfSwKKwkJLmkgPSBTUkFNX0NIMDEsCisJCS5uYW1lID0gIlZJRCBCIiwKKwkJLmNtZHNfc3RhcnQgPSBWSURfQl9ET1dOX0NNRFMsCisJCS5jdHJsX3N0YXJ0ID0gVklEX0JfSVEsCisJCS5jZHQgPSBWSURfQl9DRFQsCisJCS5maWZvX3N0YXJ0ID0gVklEX0JfRE9XTl9DTFVTVEVSXzEsCisJCS5maWZvX3NpemUgPSAoVklEX0NMVVNURVJfU0laRSA8PCAyKSwKKwkJLnB0cjFfcmVnID0gRE1BMl9QVFIxLAorCQkucHRyMl9yZWcgPSBETUEyX1BUUjIsCisJCS5jbnQxX3JlZyA9IERNQTJfQ05UMSwKKwkJLmNudDJfcmVnID0gRE1BMl9DTlQyLAorCQkuaW50X21zayA9IFZJRF9CX0lOVF9NU0ssCisJCS5pbnRfc3RhdCA9IFZJRF9CX0lOVF9TVEFULAorCQkuaW50X21zdGF0ID0gVklEX0JfSU5UX01TVEFULAorCQkuZG1hX2N0bCA9IFZJRF9EU1RfQl9ETUFfQ1RMLAorCQkuZ3BjbnRfY3RsID0gVklEX0RTVF9CX0dQQ05UX0NUTCwKKwkJLmdwY250ID0gVklEX0RTVF9CX0dQQ05ULAorCQkudmlwX2N0bCA9IFZJRF9EU1RfQl9WSVBfQ1RMLAorCQkucGl4X2ZybXQgPSBWSURfRFNUX0JfUElYX0ZSTVQsCisJfSwKIAogCVtTUkFNX0NIMDJdID0gewotCQkgICAgICAgLmkgPSBTUkFNX0NIMDIsCi0JCSAgICAgICAubmFtZSA9ICJWSUQgQyIsCi0JCSAgICAgICAuY21kc19zdGFydCA9IFZJRF9DX0RPV05fQ01EUywKLQkJICAgICAgIC5jdHJsX3N0YXJ0ID0gVklEX0NfSVEsCi0JCSAgICAgICAuY2R0ID0gVklEX0NfQ0RULAotCQkgICAgICAgLmZpZm9fc3RhcnQgPSBWSURfQ19ET1dOX0NMVVNURVJfMSwKLQkJICAgICAgIC5maWZvX3NpemUgPSAoVklEX0NMVVNURVJfU0laRSA8PCAyKSwKLQkJICAgICAgIC5wdHIxX3JlZyA9IERNQTNfUFRSMSwKLQkJICAgICAgIC5wdHIyX3JlZyA9IERNQTNfUFRSMiwKLQkJICAgICAgIC5jbnQxX3JlZyA9IERNQTNfQ05UMSwKLQkJICAgICAgIC5jbnQyX3JlZyA9IERNQTNfQ05UMiwKLQkJICAgICAgIC5pbnRfbXNrID0gVklEX0NfSU5UX01TSywKLQkJICAgICAgIC5pbnRfc3RhdCA9IFZJRF9DX0lOVF9TVEFULAotCQkgICAgICAgLmludF9tc3RhdCA9IFZJRF9DX0lOVF9NU1RBVCwKLQkJICAgICAgIC5kbWFfY3RsID0gVklEX0RTVF9DX0RNQV9DVEwsCi0JCSAgICAgICAuZ3BjbnRfY3RsID0gVklEX0RTVF9DX0dQQ05UX0NUTCwKLQkJICAgICAgIC5ncGNudCA9IFZJRF9EU1RfQ19HUENOVCwKLQkJICAgICAgIC52aXBfY3RsID0gVklEX0RTVF9DX1ZJUF9DVEwsCi0JCSAgICAgICAucGl4X2ZybXQgPSBWSURfRFNUX0NfUElYX0ZSTVQsCi0JCSAgICAgICB9LAorCQkuaSA9IFNSQU1fQ0gwMiwKKwkJLm5hbWUgPSAiVklEIEMiLAorCQkuY21kc19zdGFydCA9IFZJRF9DX0RPV05fQ01EUywKKwkJLmN0cmxfc3RhcnQgPSBWSURfQ19JUSwKKwkJLmNkdCA9IFZJRF9DX0NEVCwKKwkJLmZpZm9fc3RhcnQgPSBWSURfQ19ET1dOX0NMVVNURVJfMSwKKwkJLmZpZm9fc2l6ZSA9IChWSURfQ0xVU1RFUl9TSVpFIDw8IDIpLAorCQkucHRyMV9yZWcgPSBETUEzX1BUUjEsCisJCS5wdHIyX3JlZyA9IERNQTNfUFRSMiwKKwkJLmNudDFfcmVnID0gRE1BM19DTlQxLAorCQkuY250Ml9yZWcgPSBETUEzX0NOVDIsCisJCS5pbnRfbXNrID0gVklEX0NfSU5UX01TSywKKwkJLmludF9zdGF0ID0gVklEX0NfSU5UX1NUQVQsCisJCS5pbnRfbXN0YXQgPSBWSURfQ19JTlRfTVNUQVQsCisJCS5kbWFfY3RsID0gVklEX0RTVF9DX0RNQV9DVEwsCisJCS5ncGNudF9jdGwgPSBWSURfRFNUX0NfR1BDTlRfQ1RMLAorCQkuZ3BjbnQgPSBWSURfRFNUX0NfR1BDTlQsCisJCS52aXBfY3RsID0gVklEX0RTVF9DX1ZJUF9DVEwsCisJCS5waXhfZnJtdCA9IFZJRF9EU1RfQ19QSVhfRlJNVCwKKwl9LAogCiAJW1NSQU1fQ0gwM10gPSB7Ci0JCSAgICAgICAuaSA9IFNSQU1fQ0gwMywKLQkJICAgICAgIC5uYW1lID0gIlZJRCBEIiwKLQkJICAgICAgIC5jbWRzX3N0YXJ0ID0gVklEX0RfRE9XTl9DTURTLAotCQkgICAgICAgLmN0cmxfc3RhcnQgPSBWSURfRF9JUSwKLQkJICAgICAgIC5jZHQgPSBWSURfRF9DRFQsCi0JCSAgICAgICAuZmlmb19zdGFydCA9IFZJRF9EX0RPV05fQ0xVU1RFUl8xLAotCQkgICAgICAgLmZpZm9fc2l6ZSA9IChWSURfQ0xVU1RFUl9TSVpFIDw8IDIpLAotCQkgICAgICAgLnB0cjFfcmVnID0gRE1BNF9QVFIxLAotCQkgICAgICAgLnB0cjJfcmVnID0gRE1BNF9QVFIyLAotCQkgICAgICAgLmNudDFfcmVnID0gRE1BNF9DTlQxLAotCQkgICAgICAgLmNudDJfcmVnID0gRE1BNF9DTlQyLAotCQkgICAgICAgLmludF9tc2sgPSBWSURfRF9JTlRfTVNLLAotCQkgICAgICAgLmludF9zdGF0ID0gVklEX0RfSU5UX1NUQVQsCi0JCSAgICAgICAuaW50X21zdGF0ID0gVklEX0RfSU5UX01TVEFULAotCQkgICAgICAgLmRtYV9jdGwgPSBWSURfRFNUX0RfRE1BX0NUTCwKLQkJICAgICAgIC5ncGNudF9jdGwgPSBWSURfRFNUX0RfR1BDTlRfQ1RMLAotCQkgICAgICAgLmdwY250ID0gVklEX0RTVF9EX0dQQ05ULAotCQkgICAgICAgLnZpcF9jdGwgPSBWSURfRFNUX0RfVklQX0NUTCwKLQkJICAgICAgIC5waXhfZnJtdCA9IFZJRF9EU1RfRF9QSVhfRlJNVCwKLQkJICAgICAgIH0sCisJCS5pID0gU1JBTV9DSDAzLAorCQkubmFtZSA9ICJWSUQgRCIsCisJCS5jbWRzX3N0YXJ0ID0gVklEX0RfRE9XTl9DTURTLAorCQkuY3RybF9zdGFydCA9IFZJRF9EX0lRLAorCQkuY2R0ID0gVklEX0RfQ0RULAorCQkuZmlmb19zdGFydCA9IFZJRF9EX0RPV05fQ0xVU1RFUl8xLAorCQkuZmlmb19zaXplID0gKFZJRF9DTFVTVEVSX1NJWkUgPDwgMiksCisJCS5wdHIxX3JlZyA9IERNQTRfUFRSMSwKKwkJLnB0cjJfcmVnID0gRE1BNF9QVFIyLAorCQkuY250MV9yZWcgPSBETUE0X0NOVDEsCisJCS5jbnQyX3JlZyA9IERNQTRfQ05UMiwKKwkJLmludF9tc2sgPSBWSURfRF9JTlRfTVNLLAorCQkuaW50X3N0YXQgPSBWSURfRF9JTlRfU1RBVCwKKwkJLmludF9tc3RhdCA9IFZJRF9EX0lOVF9NU1RBVCwKKwkJLmRtYV9jdGwgPSBWSURfRFNUX0RfRE1BX0NUTCwKKwkJLmdwY250X2N0bCA9IFZJRF9EU1RfRF9HUENOVF9DVEwsCisJCS5ncGNudCA9IFZJRF9EU1RfRF9HUENOVCwKKwkJLnZpcF9jdGwgPSBWSURfRFNUX0RfVklQX0NUTCwKKwkJLnBpeF9mcm10ID0gVklEX0RTVF9EX1BJWF9GUk1ULAorCX0sCiAKIAlbU1JBTV9DSDA0XSA9IHsKLQkJICAgICAgIC5pID0gU1JBTV9DSDA0LAotCQkgICAgICAgLm5hbWUgPSAiVklEIEUiLAotCQkgICAgICAgLmNtZHNfc3RhcnQgPSBWSURfRV9ET1dOX0NNRFMsCi0JCSAgICAgICAuY3RybF9zdGFydCA9IFZJRF9FX0lRLAotCQkgICAgICAgLmNkdCA9IFZJRF9FX0NEVCwKLQkJICAgICAgIC5maWZvX3N0YXJ0ID0gVklEX0VfRE9XTl9DTFVTVEVSXzEsCi0JCSAgICAgICAuZmlmb19zaXplID0gKFZJRF9DTFVTVEVSX1NJWkUgPDwgMiksCi0JCSAgICAgICAucHRyMV9yZWcgPSBETUE1X1BUUjEsCi0JCSAgICAgICAucHRyMl9yZWcgPSBETUE1X1BUUjIsCi0JCSAgICAgICAuY250MV9yZWcgPSBETUE1X0NOVDEsCi0JCSAgICAgICAuY250Ml9yZWcgPSBETUE1X0NOVDIsCi0JCSAgICAgICAuaW50X21zayA9IFZJRF9FX0lOVF9NU0ssCi0JCSAgICAgICAuaW50X3N0YXQgPSBWSURfRV9JTlRfU1RBVCwKLQkJICAgICAgIC5pbnRfbXN0YXQgPSBWSURfRV9JTlRfTVNUQVQsCi0JCSAgICAgICAuZG1hX2N0bCA9IFZJRF9EU1RfRV9ETUFfQ1RMLAotCQkgICAgICAgLmdwY250X2N0bCA9IFZJRF9EU1RfRV9HUENOVF9DVEwsCi0JCSAgICAgICAuZ3BjbnQgPSBWSURfRFNUX0VfR1BDTlQsCi0JCSAgICAgICAudmlwX2N0bCA9IFZJRF9EU1RfRV9WSVBfQ1RMLAotCQkgICAgICAgLnBpeF9mcm10ID0gVklEX0RTVF9FX1BJWF9GUk1ULAotCQkgICAgICAgfSwKKwkJLmkgPSBTUkFNX0NIMDQsCisJCS5uYW1lID0gIlZJRCBFIiwKKwkJLmNtZHNfc3RhcnQgPSBWSURfRV9ET1dOX0NNRFMsCisJCS5jdHJsX3N0YXJ0ID0gVklEX0VfSVEsCisJCS5jZHQgPSBWSURfRV9DRFQsCisJCS5maWZvX3N0YXJ0ID0gVklEX0VfRE9XTl9DTFVTVEVSXzEsCisJCS5maWZvX3NpemUgPSAoVklEX0NMVVNURVJfU0laRSA8PCAyKSwKKwkJLnB0cjFfcmVnID0gRE1BNV9QVFIxLAorCQkucHRyMl9yZWcgPSBETUE1X1BUUjIsCisJCS5jbnQxX3JlZyA9IERNQTVfQ05UMSwKKwkJLmNudDJfcmVnID0gRE1BNV9DTlQyLAorCQkuaW50X21zayA9IFZJRF9FX0lOVF9NU0ssCisJCS5pbnRfc3RhdCA9IFZJRF9FX0lOVF9TVEFULAorCQkuaW50X21zdGF0ID0gVklEX0VfSU5UX01TVEFULAorCQkuZG1hX2N0bCA9IFZJRF9EU1RfRV9ETUFfQ1RMLAorCQkuZ3BjbnRfY3RsID0gVklEX0RTVF9FX0dQQ05UX0NUTCwKKwkJLmdwY250ID0gVklEX0RTVF9FX0dQQ05ULAorCQkudmlwX2N0bCA9IFZJRF9EU1RfRV9WSVBfQ1RMLAorCQkucGl4X2ZybXQgPSBWSURfRFNUX0VfUElYX0ZSTVQsCisJfSwKIAogCVtTUkFNX0NIMDVdID0gewotCQkgICAgICAgLmkgPSBTUkFNX0NIMDUsCi0JCSAgICAgICAubmFtZSA9ICJWSUQgRiIsCi0JCSAgICAgICAuY21kc19zdGFydCA9IFZJRF9GX0RPV05fQ01EUywKLQkJICAgICAgIC5jdHJsX3N0YXJ0ID0gVklEX0ZfSVEsCi0JCSAgICAgICAuY2R0ID0gVklEX0ZfQ0RULAotCQkgICAgICAgLmZpZm9fc3RhcnQgPSBWSURfRl9ET1dOX0NMVVNURVJfMSwKLQkJICAgICAgIC5maWZvX3NpemUgPSAoVklEX0NMVVNURVJfU0laRSA8PCAyKSwKLQkJICAgICAgIC5wdHIxX3JlZyA9IERNQTZfUFRSMSwKLQkJICAgICAgIC5wdHIyX3JlZyA9IERNQTZfUFRSMiwKLQkJICAgICAgIC5jbnQxX3JlZyA9IERNQTZfQ05UMSwKLQkJICAgICAgIC5jbnQyX3JlZyA9IERNQTZfQ05UMiwKLQkJICAgICAgIC5pbnRfbXNrID0gVklEX0ZfSU5UX01TSywKLQkJICAgICAgIC5pbnRfc3RhdCA9IFZJRF9GX0lOVF9TVEFULAotCQkgICAgICAgLmludF9tc3RhdCA9IFZJRF9GX0lOVF9NU1RBVCwKLQkJICAgICAgIC5kbWFfY3RsID0gVklEX0RTVF9GX0RNQV9DVEwsCi0JCSAgICAgICAuZ3BjbnRfY3RsID0gVklEX0RTVF9GX0dQQ05UX0NUTCwKLQkJICAgICAgIC5ncGNudCA9IFZJRF9EU1RfRl9HUENOVCwKLQkJICAgICAgIC52aXBfY3RsID0gVklEX0RTVF9GX1ZJUF9DVEwsCi0JCSAgICAgICAucGl4X2ZybXQgPSBWSURfRFNUX0ZfUElYX0ZSTVQsCi0JCSAgICAgICB9LAorCQkuaSA9IFNSQU1fQ0gwNSwKKwkJLm5hbWUgPSAiVklEIEYiLAorCQkuY21kc19zdGFydCA9IFZJRF9GX0RPV05fQ01EUywKKwkJLmN0cmxfc3RhcnQgPSBWSURfRl9JUSwKKwkJLmNkdCA9IFZJRF9GX0NEVCwKKwkJLmZpZm9fc3RhcnQgPSBWSURfRl9ET1dOX0NMVVNURVJfMSwKKwkJLmZpZm9fc2l6ZSA9IChWSURfQ0xVU1RFUl9TSVpFIDw8IDIpLAorCQkucHRyMV9yZWcgPSBETUE2X1BUUjEsCisJCS5wdHIyX3JlZyA9IERNQTZfUFRSMiwKKwkJLmNudDFfcmVnID0gRE1BNl9DTlQxLAorCQkuY250Ml9yZWcgPSBETUE2X0NOVDIsCisJCS5pbnRfbXNrID0gVklEX0ZfSU5UX01TSywKKwkJLmludF9zdGF0ID0gVklEX0ZfSU5UX1NUQVQsCisJCS5pbnRfbXN0YXQgPSBWSURfRl9JTlRfTVNUQVQsCisJCS5kbWFfY3RsID0gVklEX0RTVF9GX0RNQV9DVEwsCisJCS5ncGNudF9jdGwgPSBWSURfRFNUX0ZfR1BDTlRfQ1RMLAorCQkuZ3BjbnQgPSBWSURfRFNUX0ZfR1BDTlQsCisJCS52aXBfY3RsID0gVklEX0RTVF9GX1ZJUF9DVEwsCisJCS5waXhfZnJtdCA9IFZJRF9EU1RfRl9QSVhfRlJNVCwKKwl9LAogCiAJW1NSQU1fQ0gwNl0gPSB7Ci0JCSAgICAgICAuaSA9IFNSQU1fQ0gwNiwKLQkJICAgICAgIC5uYW1lID0gIlZJRCBHIiwKLQkJICAgICAgIC5jbWRzX3N0YXJ0ID0gVklEX0dfRE9XTl9DTURTLAotCQkgICAgICAgLmN0cmxfc3RhcnQgPSBWSURfR19JUSwKLQkJICAgICAgIC5jZHQgPSBWSURfR19DRFQsCi0JCSAgICAgICAuZmlmb19zdGFydCA9IFZJRF9HX0RPV05fQ0xVU1RFUl8xLAotCQkgICAgICAgLmZpZm9fc2l6ZSA9IChWSURfQ0xVU1RFUl9TSVpFIDw8IDIpLAotCQkgICAgICAgLnB0cjFfcmVnID0gRE1BN19QVFIxLAotCQkgICAgICAgLnB0cjJfcmVnID0gRE1BN19QVFIyLAotCQkgICAgICAgLmNudDFfcmVnID0gRE1BN19DTlQxLAotCQkgICAgICAgLmNudDJfcmVnID0gRE1BN19DTlQyLAotCQkgICAgICAgLmludF9tc2sgPSBWSURfR19JTlRfTVNLLAotCQkgICAgICAgLmludF9zdGF0ID0gVklEX0dfSU5UX1NUQVQsCi0JCSAgICAgICAuaW50X21zdGF0ID0gVklEX0dfSU5UX01TVEFULAotCQkgICAgICAgLmRtYV9jdGwgPSBWSURfRFNUX0dfRE1BX0NUTCwKLQkJICAgICAgIC5ncGNudF9jdGwgPSBWSURfRFNUX0dfR1BDTlRfQ1RMLAotCQkgICAgICAgLmdwY250ID0gVklEX0RTVF9HX0dQQ05ULAotCQkgICAgICAgLnZpcF9jdGwgPSBWSURfRFNUX0dfVklQX0NUTCwKLQkJICAgICAgIC5waXhfZnJtdCA9IFZJRF9EU1RfR19QSVhfRlJNVCwKLQkJICAgICAgIH0sCisJCS5pID0gU1JBTV9DSDA2LAorCQkubmFtZSA9ICJWSUQgRyIsCisJCS5jbWRzX3N0YXJ0ID0gVklEX0dfRE9XTl9DTURTLAorCQkuY3RybF9zdGFydCA9IFZJRF9HX0lRLAorCQkuY2R0ID0gVklEX0dfQ0RULAorCQkuZmlmb19zdGFydCA9IFZJRF9HX0RPV05fQ0xVU1RFUl8xLAorCQkuZmlmb19zaXplID0gKFZJRF9DTFVTVEVSX1NJWkUgPDwgMiksCisJCS5wdHIxX3JlZyA9IERNQTdfUFRSMSwKKwkJLnB0cjJfcmVnID0gRE1BN19QVFIyLAorCQkuY250MV9yZWcgPSBETUE3X0NOVDEsCisJCS5jbnQyX3JlZyA9IERNQTdfQ05UMiwKKwkJLmludF9tc2sgPSBWSURfR19JTlRfTVNLLAorCQkuaW50X3N0YXQgPSBWSURfR19JTlRfU1RBVCwKKwkJLmludF9tc3RhdCA9IFZJRF9HX0lOVF9NU1RBVCwKKwkJLmRtYV9jdGwgPSBWSURfRFNUX0dfRE1BX0NUTCwKKwkJLmdwY250X2N0bCA9IFZJRF9EU1RfR19HUENOVF9DVEwsCisJCS5ncGNudCA9IFZJRF9EU1RfR19HUENOVCwKKwkJLnZpcF9jdGwgPSBWSURfRFNUX0dfVklQX0NUTCwKKwkJLnBpeF9mcm10ID0gVklEX0RTVF9HX1BJWF9GUk1ULAorCX0sCiAKIAlbU1JBTV9DSDA3XSA9IHsKLQkJICAgICAgIC5pID0gU1JBTV9DSDA3LAotCQkgICAgICAgLm5hbWUgPSAiVklEIEgiLAotCQkgICAgICAgLmNtZHNfc3RhcnQgPSBWSURfSF9ET1dOX0NNRFMsCi0JCSAgICAgICAuY3RybF9zdGFydCA9IFZJRF9IX0lRLAotCQkgICAgICAgLmNkdCA9IFZJRF9IX0NEVCwKLQkJICAgICAgIC5maWZvX3N0YXJ0ID0gVklEX0hfRE9XTl9DTFVTVEVSXzEsCi0JCSAgICAgICAuZmlmb19zaXplID0gKFZJRF9DTFVTVEVSX1NJWkUgPDwgMiksCi0JCSAgICAgICAucHRyMV9yZWcgPSBETUE4X1BUUjEsCi0JCSAgICAgICAucHRyMl9yZWcgPSBETUE4X1BUUjIsCi0JCSAgICAgICAuY250MV9yZWcgPSBETUE4X0NOVDEsCi0JCSAgICAgICAuY250Ml9yZWcgPSBETUE4X0NOVDIsCi0JCSAgICAgICAuaW50X21zayA9IFZJRF9IX0lOVF9NU0ssCi0JCSAgICAgICAuaW50X3N0YXQgPSBWSURfSF9JTlRfU1RBVCwKLQkJICAgICAgIC5pbnRfbXN0YXQgPSBWSURfSF9JTlRfTVNUQVQsCi0JCSAgICAgICAuZG1hX2N0bCA9IFZJRF9EU1RfSF9ETUFfQ1RMLAotCQkgICAgICAgLmdwY250X2N0bCA9IFZJRF9EU1RfSF9HUENOVF9DVEwsCi0JCSAgICAgICAuZ3BjbnQgPSBWSURfRFNUX0hfR1BDTlQsCi0JCSAgICAgICAudmlwX2N0bCA9IFZJRF9EU1RfSF9WSVBfQ1RMLAotCQkgICAgICAgLnBpeF9mcm10ID0gVklEX0RTVF9IX1BJWF9GUk1ULAotCQkgICAgICAgfSwKKwkJLmkgPSBTUkFNX0NIMDcsCisJCS5uYW1lID0gIlZJRCBIIiwKKwkJLmNtZHNfc3RhcnQgPSBWSURfSF9ET1dOX0NNRFMsCisJCS5jdHJsX3N0YXJ0ID0gVklEX0hfSVEsCisJCS5jZHQgPSBWSURfSF9DRFQsCisJCS5maWZvX3N0YXJ0ID0gVklEX0hfRE9XTl9DTFVTVEVSXzEsCisJCS5maWZvX3NpemUgPSAoVklEX0NMVVNURVJfU0laRSA8PCAyKSwKKwkJLnB0cjFfcmVnID0gRE1BOF9QVFIxLAorCQkucHRyMl9yZWcgPSBETUE4X1BUUjIsCisJCS5jbnQxX3JlZyA9IERNQThfQ05UMSwKKwkJLmNudDJfcmVnID0gRE1BOF9DTlQyLAorCQkuaW50X21zayA9IFZJRF9IX0lOVF9NU0ssCisJCS5pbnRfc3RhdCA9IFZJRF9IX0lOVF9TVEFULAorCQkuaW50X21zdGF0ID0gVklEX0hfSU5UX01TVEFULAorCQkuZG1hX2N0bCA9IFZJRF9EU1RfSF9ETUFfQ1RMLAorCQkuZ3BjbnRfY3RsID0gVklEX0RTVF9IX0dQQ05UX0NUTCwKKwkJLmdwY250ID0gVklEX0RTVF9IX0dQQ05ULAorCQkudmlwX2N0bCA9IFZJRF9EU1RfSF9WSVBfQ1RMLAorCQkucGl4X2ZybXQgPSBWSURfRFNUX0hfUElYX0ZSTVQsCisJfSwKIAogCVtTUkFNX0NIMDhdID0gewotCQkgICAgICAgLm5hbWUgPSAiYXVkaW8gZnJvbSIsCi0JCSAgICAgICAuY21kc19zdGFydCA9IEFVRF9BX0RPV05fQ01EUywKLQkJICAgICAgIC5jdHJsX3N0YXJ0ID0gQVVEX0FfSVEsCi0JCSAgICAgICAuY2R0ID0gQVVEX0FfQ0RULAotCQkgICAgICAgLmZpZm9fc3RhcnQgPSBBVURfQV9ET1dOX0NMVVNURVJfMSwKLQkJICAgICAgIC5maWZvX3NpemUgPSBBVURJT19DTFVTVEVSX1NJWkUgKiAzLAotCQkgICAgICAgLnB0cjFfcmVnID0gRE1BMTdfUFRSMSwKLQkJICAgICAgIC5wdHIyX3JlZyA9IERNQTE3X1BUUjIsCi0JCSAgICAgICAuY250MV9yZWcgPSBETUExN19DTlQxLAotCQkgICAgICAgLmNudDJfcmVnID0gRE1BMTdfQ05UMiwKLQkJICAgICAgIH0sCisJCS5uYW1lID0gImF1ZGlvIGZyb20iLAorCQkuY21kc19zdGFydCA9IEFVRF9BX0RPV05fQ01EUywKKwkJLmN0cmxfc3RhcnQgPSBBVURfQV9JUSwKKwkJLmNkdCA9IEFVRF9BX0NEVCwKKwkJLmZpZm9fc3RhcnQgPSBBVURfQV9ET1dOX0NMVVNURVJfMSwKKwkJLmZpZm9fc2l6ZSA9IEFVRElPX0NMVVNURVJfU0laRSAqIDMsCisJCS5wdHIxX3JlZyA9IERNQTE3X1BUUjEsCisJCS5wdHIyX3JlZyA9IERNQTE3X1BUUjIsCisJCS5jbnQxX3JlZyA9IERNQTE3X0NOVDEsCisJCS5jbnQyX3JlZyA9IERNQTE3X0NOVDIsCisJfSwKIAogCVtTUkFNX0NIMDldID0gewotCQkgICAgICAgLmkgPSBTUkFNX0NIMDksCi0JCSAgICAgICAubmFtZSA9ICJWSUQgVXBzdHJlYW0gSSIsCi0JCSAgICAgICAuY21kc19zdGFydCA9IFZJRF9JX1VQX0NNRFMsCi0JCSAgICAgICAuY3RybF9zdGFydCA9IFZJRF9JX0lRLAotCQkgICAgICAgLmNkdCA9IFZJRF9JX0NEVCwKLQkJICAgICAgIC5maWZvX3N0YXJ0ID0gVklEX0lfVVBfQ0xVU1RFUl8xLAotCQkgICAgICAgLmZpZm9fc2l6ZSA9IChWSURfQ0xVU1RFUl9TSVpFIDw8IDIpLAotCQkgICAgICAgLnB0cjFfcmVnID0gRE1BMTVfUFRSMSwKLQkJICAgICAgIC5wdHIyX3JlZyA9IERNQTE1X1BUUjIsCi0JCSAgICAgICAuY250MV9yZWcgPSBETUExNV9DTlQxLAotCQkgICAgICAgLmNudDJfcmVnID0gRE1BMTVfQ05UMiwKLQkJICAgICAgIC5pbnRfbXNrID0gVklEX0lfSU5UX01TSywKLQkJICAgICAgIC5pbnRfc3RhdCA9IFZJRF9JX0lOVF9TVEFULAotCQkgICAgICAgLmludF9tc3RhdCA9IFZJRF9JX0lOVF9NU1RBVCwKLQkJICAgICAgIC5kbWFfY3RsID0gVklEX1NSQ19JX0RNQV9DVEwsCi0JCSAgICAgICAuZ3BjbnRfY3RsID0gVklEX1NSQ19JX0dQQ05UX0NUTCwKLQkJICAgICAgIC5ncGNudCA9IFZJRF9TUkNfSV9HUENOVCwKKwkJLmkgPSBTUkFNX0NIMDksCisJCS5uYW1lID0gIlZJRCBVcHN0cmVhbSBJIiwKKwkJLmNtZHNfc3RhcnQgPSBWSURfSV9VUF9DTURTLAorCQkuY3RybF9zdGFydCA9IFZJRF9JX0lRLAorCQkuY2R0ID0gVklEX0lfQ0RULAorCQkuZmlmb19zdGFydCA9IFZJRF9JX1VQX0NMVVNURVJfMSwKKwkJLmZpZm9fc2l6ZSA9IChWSURfQ0xVU1RFUl9TSVpFIDw8IDIpLAorCQkucHRyMV9yZWcgPSBETUExNV9QVFIxLAorCQkucHRyMl9yZWcgPSBETUExNV9QVFIyLAorCQkuY250MV9yZWcgPSBETUExNV9DTlQxLAorCQkuY250Ml9yZWcgPSBETUExNV9DTlQyLAorCQkuaW50X21zayA9IFZJRF9JX0lOVF9NU0ssCisJCS5pbnRfc3RhdCA9IFZJRF9JX0lOVF9TVEFULAorCQkuaW50X21zdGF0ID0gVklEX0lfSU5UX01TVEFULAorCQkuZG1hX2N0bCA9IFZJRF9TUkNfSV9ETUFfQ1RMLAorCQkuZ3BjbnRfY3RsID0gVklEX1NSQ19JX0dQQ05UX0NUTCwKKwkJLmdwY250ID0gVklEX1NSQ19JX0dQQ05ULAogCi0JCSAgICAgICAudmlkX2ZtdF9jdGwgPSBWSURfU1JDX0lfRk1UX0NUTCwKLQkJICAgICAgIC52aWRfYWN0aXZlX2N0bDEgPSBWSURfU1JDX0lfQUNUSVZFX0NUTDEsCi0JCSAgICAgICAudmlkX2FjdGl2ZV9jdGwyID0gVklEX1NSQ19JX0FDVElWRV9DVEwyLAotCQkgICAgICAgLnZpZF9jZHRfc2l6ZSA9IFZJRF9TUkNfSV9DRFRfU1osCi0JCSAgICAgICAuaXJxX2JpdCA9IDgsCi0JCSAgICAgICB9LAorCQkudmlkX2ZtdF9jdGwgPSBWSURfU1JDX0lfRk1UX0NUTCwKKwkJLnZpZF9hY3RpdmVfY3RsMSA9IFZJRF9TUkNfSV9BQ1RJVkVfQ1RMMSwKKwkJLnZpZF9hY3RpdmVfY3RsMiA9IFZJRF9TUkNfSV9BQ1RJVkVfQ1RMMiwKKwkJLnZpZF9jZHRfc2l6ZSA9IFZJRF9TUkNfSV9DRFRfU1osCisJCS5pcnFfYml0ID0gOCwKKwl9LAogCiAJW1NSQU1fQ0gxMF0gPSB7Ci0JCSAgICAgICAuaSA9IFNSQU1fQ0gxMCwKLQkJICAgICAgIC5uYW1lID0gIlZJRCBVcHN0cmVhbSBKIiwKLQkJICAgICAgIC5jbWRzX3N0YXJ0ID0gVklEX0pfVVBfQ01EUywKLQkJICAgICAgIC5jdHJsX3N0YXJ0ID0gVklEX0pfSVEsCi0JCSAgICAgICAuY2R0ID0gVklEX0pfQ0RULAotCQkgICAgICAgLmZpZm9fc3RhcnQgPSBWSURfSl9VUF9DTFVTVEVSXzEsCi0JCSAgICAgICAuZmlmb19zaXplID0gKFZJRF9DTFVTVEVSX1NJWkUgPDwgMiksCi0JCSAgICAgICAucHRyMV9yZWcgPSBETUExNl9QVFIxLAotCQkgICAgICAgLnB0cjJfcmVnID0gRE1BMTZfUFRSMiwKLQkJICAgICAgIC5jbnQxX3JlZyA9IERNQTE2X0NOVDEsCi0JCSAgICAgICAuY250Ml9yZWcgPSBETUExNl9DTlQyLAotCQkgICAgICAgLmludF9tc2sgPSBWSURfSl9JTlRfTVNLLAotCQkgICAgICAgLmludF9zdGF0ID0gVklEX0pfSU5UX1NUQVQsCi0JCSAgICAgICAuaW50X21zdGF0ID0gVklEX0pfSU5UX01TVEFULAotCQkgICAgICAgLmRtYV9jdGwgPSBWSURfU1JDX0pfRE1BX0NUTCwKLQkJICAgICAgIC5ncGNudF9jdGwgPSBWSURfU1JDX0pfR1BDTlRfQ1RMLAotCQkgICAgICAgLmdwY250ID0gVklEX1NSQ19KX0dQQ05ULAorCQkuaSA9IFNSQU1fQ0gxMCwKKwkJLm5hbWUgPSAiVklEIFVwc3RyZWFtIEoiLAorCQkuY21kc19zdGFydCA9IFZJRF9KX1VQX0NNRFMsCisJCS5jdHJsX3N0YXJ0ID0gVklEX0pfSVEsCisJCS5jZHQgPSBWSURfSl9DRFQsCisJCS5maWZvX3N0YXJ0ID0gVklEX0pfVVBfQ0xVU1RFUl8xLAorCQkuZmlmb19zaXplID0gKFZJRF9DTFVTVEVSX1NJWkUgPDwgMiksCisJCS5wdHIxX3JlZyA9IERNQTE2X1BUUjEsCisJCS5wdHIyX3JlZyA9IERNQTE2X1BUUjIsCisJCS5jbnQxX3JlZyA9IERNQTE2X0NOVDEsCisJCS5jbnQyX3JlZyA9IERNQTE2X0NOVDIsCisJCS5pbnRfbXNrID0gVklEX0pfSU5UX01TSywKKwkJLmludF9zdGF0ID0gVklEX0pfSU5UX1NUQVQsCisJCS5pbnRfbXN0YXQgPSBWSURfSl9JTlRfTVNUQVQsCisJCS5kbWFfY3RsID0gVklEX1NSQ19KX0RNQV9DVEwsCisJCS5ncGNudF9jdGwgPSBWSURfU1JDX0pfR1BDTlRfQ1RMLAorCQkuZ3BjbnQgPSBWSURfU1JDX0pfR1BDTlQsCiAKLQkJICAgICAgIC52aWRfZm10X2N0bCA9IFZJRF9TUkNfSl9GTVRfQ1RMLAotCQkgICAgICAgLnZpZF9hY3RpdmVfY3RsMSA9IFZJRF9TUkNfSl9BQ1RJVkVfQ1RMMSwKLQkJICAgICAgIC52aWRfYWN0aXZlX2N0bDIgPSBWSURfU1JDX0pfQUNUSVZFX0NUTDIsCi0JCSAgICAgICAudmlkX2NkdF9zaXplID0gVklEX1NSQ19KX0NEVF9TWiwKLQkJICAgICAgIC5pcnFfYml0ID0gOSwKLQkJICAgICAgIH0sCisJCS52aWRfZm10X2N0bCA9IFZJRF9TUkNfSl9GTVRfQ1RMLAorCQkudmlkX2FjdGl2ZV9jdGwxID0gVklEX1NSQ19KX0FDVElWRV9DVEwxLAorCQkudmlkX2FjdGl2ZV9jdGwyID0gVklEX1NSQ19KX0FDVElWRV9DVEwyLAorCQkudmlkX2NkdF9zaXplID0gVklEX1NSQ19KX0NEVF9TWiwKKwkJLmlycV9iaXQgPSA5LAorCX0sCiAKIAlbU1JBTV9DSDExXSA9IHsKLQkJICAgICAgIC5pID0gU1JBTV9DSDExLAotCQkgICAgICAgLm5hbWUgPSAiQXVkaW8gVXBzdHJlYW0gQ2hhbm5lbCBCIiwKLQkJICAgICAgIC5jbWRzX3N0YXJ0ID0gQVVEX0JfVVBfQ01EUywKLQkJICAgICAgIC5jdHJsX3N0YXJ0ID0gQVVEX0JfSVEsCi0JCSAgICAgICAuY2R0ID0gQVVEX0JfQ0RULAotCQkgICAgICAgLmZpZm9fc3RhcnQgPSBBVURfQl9VUF9DTFVTVEVSXzEsCi0JCSAgICAgICAuZmlmb19zaXplID0gKEFVRElPX0NMVVNURVJfU0laRSAqIDMpLAotCQkgICAgICAgLnB0cjFfcmVnID0gRE1BMjJfUFRSMSwKLQkJICAgICAgIC5wdHIyX3JlZyA9IERNQTIyX1BUUjIsCi0JCSAgICAgICAuY250MV9yZWcgPSBETUEyMl9DTlQxLAotCQkgICAgICAgLmNudDJfcmVnID0gRE1BMjJfQ05UMiwKLQkJICAgICAgIC5pbnRfbXNrID0gQVVEX0JfSU5UX01TSywKLQkJICAgICAgIC5pbnRfc3RhdCA9IEFVRF9CX0lOVF9TVEFULAotCQkgICAgICAgLmludF9tc3RhdCA9IEFVRF9CX0lOVF9NU1RBVCwKLQkJICAgICAgIC5kbWFfY3RsID0gQVVEX0lOVF9ETUFfQ1RMLAotCQkgICAgICAgLmdwY250X2N0bCA9IEFVRF9CX0dQQ05UX0NUTCwKLQkJICAgICAgIC5ncGNudCA9IEFVRF9CX0dQQ05ULAotCQkgICAgICAgLmF1ZF9sZW5ndGggPSBBVURfQl9MTkdUSCwKLQkJICAgICAgIC5hdWRfY2ZnID0gQVVEX0JfQ0ZHLAotCQkgICAgICAgLmZsZF9hdWRfZmlmb19lbiA9IEZMRF9BVURfU1JDX0JfRklGT19FTiwKLQkJICAgICAgIC5mbGRfYXVkX3Jpc2NfZW4gPSBGTERfQVVEX1NSQ19CX1JJU0NfRU4sCi0JCSAgICAgICAuaXJxX2JpdCA9IDExLAotCQkgICAgICAgfSwKKwkJLmkgPSBTUkFNX0NIMTEsCisJCS5uYW1lID0gIkF1ZGlvIFVwc3RyZWFtIENoYW5uZWwgQiIsCisJCS5jbWRzX3N0YXJ0ID0gQVVEX0JfVVBfQ01EUywKKwkJLmN0cmxfc3RhcnQgPSBBVURfQl9JUSwKKwkJLmNkdCA9IEFVRF9CX0NEVCwKKwkJLmZpZm9fc3RhcnQgPSBBVURfQl9VUF9DTFVTVEVSXzEsCisJCS5maWZvX3NpemUgPSAoQVVESU9fQ0xVU1RFUl9TSVpFICogMyksCisJCS5wdHIxX3JlZyA9IERNQTIyX1BUUjEsCisJCS5wdHIyX3JlZyA9IERNQTIyX1BUUjIsCisJCS5jbnQxX3JlZyA9IERNQTIyX0NOVDEsCisJCS5jbnQyX3JlZyA9IERNQTIyX0NOVDIsCisJCS5pbnRfbXNrID0gQVVEX0JfSU5UX01TSywKKwkJLmludF9zdGF0ID0gQVVEX0JfSU5UX1NUQVQsCisJCS5pbnRfbXN0YXQgPSBBVURfQl9JTlRfTVNUQVQsCisJCS5kbWFfY3RsID0gQVVEX0lOVF9ETUFfQ1RMLAorCQkuZ3BjbnRfY3RsID0gQVVEX0JfR1BDTlRfQ1RMLAorCQkuZ3BjbnQgPSBBVURfQl9HUENOVCwKKwkJLmF1ZF9sZW5ndGggPSBBVURfQl9MTkdUSCwKKwkJLmF1ZF9jZmcgPSBBVURfQl9DRkcsCisJCS5mbGRfYXVkX2ZpZm9fZW4gPSBGTERfQVVEX1NSQ19CX0ZJRk9fRU4sCisJCS5mbGRfYXVkX3Jpc2NfZW4gPSBGTERfQVVEX1NSQ19CX1JJU0NfRU4sCisJCS5pcnFfYml0ID0gMTEsCisJfSwKIH07CiBFWFBPUlRfU1lNQk9MKGN4MjU4MjFfc3JhbV9jaGFubmVscyk7CiAKQEAgLTE0MjgsNyArMTQyOCw3IEBACiAJfQogCiAJZXJyID0KLQkgICAgcmVxdWVzdF9pcnEocGNpX2Rldi0+aXJxLCBjeDI1ODIxX2lycSwgSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVELAorCSAgICByZXF1ZXN0X2lycShwY2lfZGV2LT5pcnEsIGN4MjU4MjFfaXJxLCBJUlFGX1NIQVJFRCwKIAkJCWRldi0+bmFtZSwgZGV2KTsKIAogCWlmIChlcnIgPCAwKSB7CkBAIC0xNDczLDE3ICsxNDczLDE3IEBACiAJa2ZyZWUoZGV2KTsKIH0KIAotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGN4MjU4MjFfcGNpX3RibFtdID0geworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGN4MjU4MjFfcGNpX3RibCkgPSB7CiAJewotCSAvKiBDWDI1ODIxIEF0aGVuYSAqLwotCSAudmVuZG9yID0gMHgxNGYxLAotCSAuZGV2aWNlID0gMHg4MjEwLAotCSAuc3VidmVuZG9yID0gMHgxNGYxLAotCSAuc3ViZGV2aWNlID0gMHgwOTIwLAotCSB9LAorCQkvKiBDWDI1ODIxIEF0aGVuYSAqLworCQkudmVuZG9yID0gMHgxNGYxLAorCQkuZGV2aWNlID0gMHg4MjEwLAorCQkuc3VidmVuZG9yID0gMHgxNGYxLAorCQkuc3ViZGV2aWNlID0gMHgwOTIwLAorCX0sCiAJewotCSAvKiAtLS0gZW5kIG9mIGxpc3QgLS0tICovCi0JIH0KKwkJLyogLS0tIGVuZCBvZiBsaXN0IC0tLSAqLworCX0KIH07CiAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjeDI1ODIxX3BjaV90YmwpOwpAQCAtMTUxMiw3ICsxNTEyLDYgQEAKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmN4MjU4MjFfcGNpX2RyaXZlcik7CiB9CiAKLUVYUE9SVF9TWU1CT0woY3gyNTgyMV9zZXRfZ3Bpb3Bpbl9kaXJlY3Rpb24pOwogCiBtb2R1bGVfaW5pdChjeDI1ODIxX2luaXQpOwogbW9kdWxlX2V4aXQoY3gyNTgyMV9maW5pKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtZ3Bpby5jIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1ncGlvLmMKaW5kZXggMmYxNTRiMy4uMjllNDNiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1ncGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1ncGlvLmMKQEAgLTUwLDYgKzUwLDcgQEAKIAogCWN4X3dyaXRlKGdwaW9fb2VfcmVnLCB2YWx1ZSk7CiB9CitFWFBPUlRfU1lNQk9MKGN4MjU4MjFfc2V0X2dwaW9waW5fZGlyZWN0aW9uKTsKIAogc3RhdGljIHZvaWQgY3gyNTgyMV9zZXRfZ3Bpb3Bpbl9sb2dpY3ZhbHVlKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAogCQkJCQkgICBpbnQgcGluX251bWJlciwgaW50IHBpbl9sb2dpY192YWx1ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtZ3Bpby5oIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1ncGlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMDc2NDQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1ncGlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLQotdm9pZCBjeDI1ODIxX2dwaW9faW5pdChzdHJ1Y3QgYXRoZW5hX2RldiAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtaTJjLmMgYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLWkyYy5jCmluZGV4IDEzMGRmZWIuLjRkM2QwY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtaTJjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS1pMmMuYwpAQCAtMzcwLDE2ICszNzAsMTYgQEAKIAogCXN0cnVjdCBpMmNfbXNnIG1zZ3NbMl0gPSB7CiAJCXsKLQkJIC5hZGRyID0gY2xpZW50LT5hZGRyLAotCQkgLmZsYWdzID0gMCwKLQkJIC5sZW4gPSAyLAotCQkgLmJ1ZiA9IGFkZHIsCi0JCSB9LCB7Ci0JCSAgICAgLmFkZHIgPSBjbGllbnQtPmFkZHIsCi0JCSAgICAgLmZsYWdzID0gSTJDX01fUkQsCi0JCSAgICAgLmxlbiA9IDQsCi0JCSAgICAgLmJ1ZiA9IGJ1ZiwKLQkJICAgICB9CisJCQkuYWRkciA9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncyA9IDAsCisJCQkubGVuID0gMiwKKwkJCS5idWYgPSBhZGRyLAorCQl9LCB7CisJCQkuYWRkciA9IGNsaWVudC0+YWRkciwKKwkJCS5mbGFncyA9IEkyQ19NX1JELAorCQkJLmxlbiA9IDQsCisJCQkuYnVmID0gYnVmLAorCQl9CiAJfTsKIAogCWFkZHJbMF0gPSAocmVnX2FkZHIgPj4gOCk7CkBAIC00MDMsMTEgKzQwMywxMSBAQAogCiAJc3RydWN0IGkyY19tc2cgbXNnc1sxXSA9IHsKIAkJewotCQkgLmFkZHIgPSBjbGllbnQtPmFkZHIsCi0JCSAuZmxhZ3MgPSAwLAotCQkgLmxlbiA9IDYsCi0JCSAuYnVmID0gYnVmLAotCQkgfQorCQkJLmFkZHIgPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MgPSAwLAorCQkJLmxlbiA9IDYsCisJCQkuYnVmID0gYnVmLAorCQl9CiAJfTsKIAogCWJ1ZlswXSA9IHJlZ19hZGRyID4+IDg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLWNoMi5jIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby11cHN0cmVhbS1jaDIuYwppbmRleCA2NTUzNTdkLi4yYTcyNGRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLWNoMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0tY2gyLmMKQEAgLTQwLDggKzQwLDggQEAKIE1PRFVMRV9BVVRIT1IoIkhpZXAgSHV5bmggPGhpZXAuaHV5bmhAY29uZXhhbnQuY29tPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1zdGF0aWMgaW50IF9pbnRyX21zayA9Ci0JRkxEX1ZJRF9TUkNfUklTQzEgfCBGTERfVklEX1NSQ19VRiB8IEZMRF9WSURfU1JDX1NZTkMgfCBGTERfVklEX1NSQ19PUENfRVJSOworc3RhdGljIGludCBfaW50cl9tc2sgPSBGTERfVklEX1NSQ19SSVNDMSB8IEZMRF9WSURfU1JDX1VGIHwgRkxEX1ZJRF9TUkNfU1lOQyB8CisJCQlGTERfVklEX1NSQ19PUENfRVJSOwogCiBzdGF0aWMgX19sZTMyICpjeDI1ODIxX3VwZGF0ZV9yaXNjcHJvZ3JhbV9jaDIoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCiAJCQkJCSAgICAgIF9fbGUzMiAqcnAsIHVuc2lnbmVkIGludCBvZmZzZXQsCkBAIC0xNDUsMTUgKzE0NSwxNiBAQAogCWlmIChkZXYtPl9pc05UU0NfY2gyKSB7CiAJCW9kZF9udW1fbGluZXMgPSBzaW5nbGVmaWVsZF9saW5lcyArIDE7CiAJCXJpc2NfcHJvZ3JhbV9zaXplID0gRlJBTUUxX1ZJRF9QUk9HX1NJWkU7Ci0JCWZyYW1lX3NpemUgPQotCQkgICAgKGJwbCA9PQotCQkgICAgIFk0MTFfTElORV9TWikgPyBGUkFNRV9TSVpFX05UU0NfWTQxMSA6Ci0JCSAgICBGUkFNRV9TSVpFX05UU0NfWTQyMjsKKwkJaWYgKGJwbCA9PSBZNDExX0xJTkVfU1opCisJCQlmcmFtZV9zaXplID0gRlJBTUVfU0laRV9OVFNDX1k0MTE7CisJCWVsc2UKKwkJCWZyYW1lX3NpemUgPSBGUkFNRV9TSVpFX05UU0NfWTQyMjsKIAl9IGVsc2UgewogCQlyaXNjX3Byb2dyYW1fc2l6ZSA9IFBBTF9WSURfUFJPR19TSVpFOwotCQlmcmFtZV9zaXplID0KLQkJICAgIChicGwgPT0KLQkJICAgICBZNDExX0xJTkVfU1opID8gRlJBTUVfU0laRV9QQUxfWTQxMSA6IEZSQU1FX1NJWkVfUEFMX1k0MjI7CisJCWlmIChicGwgPT0gWTQxMV9MSU5FX1NaKQorCQkJZnJhbWVfc2l6ZSA9IEZSQU1FX1NJWkVfUEFMX1k0MTE7CisJCWVsc2UKKwkJCWZyYW1lX3NpemUgPSBGUkFNRV9TSVpFX1BBTF9ZNDIyOwogCX0KIAogCS8qIFZpcnR1YWwgYWRkcmVzcyBvZiBSaXNjIGJ1ZmZlciBwcm9ncmFtICovCkBAIC0xNjUsMzAgKzE2NiwyMyBAQAogCQlpZiAoVU5TRVQgIT0gdG9wX29mZnNldCkgewogCQkJZmlmb19lbmFibGUgPSAoZnJhbWUgPT0gMCkgPyBGSUZPX0VOQUJMRSA6IEZJRk9fRElTQUJMRTsKIAkJCXJwID0gY3gyNTgyMV9yaXNjX2ZpZWxkX3Vwc3RyZWFtX2NoMihkZXYsIHJwLAotCQkJCQkJCSAgICAgZGV2LT4KLQkJCQkJCQkgICAgIF9kYXRhX2J1Zl9waHlzX2FkZHJfY2gyCi0JCQkJCQkJICAgICArIGRhdGFidWZfb2Zmc2V0LAotCQkJCQkJCSAgICAgdG9wX29mZnNldCwgMCwgYnBsLAotCQkJCQkJCSAgICAgb2RkX251bV9saW5lcywKLQkJCQkJCQkgICAgIGZpZm9fZW5hYmxlLAotCQkJCQkJCSAgICAgT0REX0ZJRUxEKTsKKwkJCQlkZXYtPl9kYXRhX2J1Zl9waHlzX2FkZHJfY2gyICsgZGF0YWJ1Zl9vZmZzZXQsCisJCQkJdG9wX29mZnNldCwgMCwgYnBsLCBvZGRfbnVtX2xpbmVzLCBmaWZvX2VuYWJsZSwKKwkJCQlPRERfRklFTEQpOwogCQl9CiAKIAkJZmlmb19lbmFibGUgPSBGSUZPX0RJU0FCTEU7CiAKIAkgICAgICAgLyogRXZlbiBmaWVsZCAqLwogCQlycCA9IGN4MjU4MjFfcmlzY19maWVsZF91cHN0cmVhbV9jaDIoZGV2LCBycCwKLQkJCQkJCSAgICAgZGV2LT4KLQkJCQkJCSAgICAgX2RhdGFfYnVmX3BoeXNfYWRkcl9jaDIgKwotCQkJCQkJICAgICBkYXRhYnVmX29mZnNldCwKLQkJCQkJCSAgICAgYm90dG9tX29mZnNldCwgMHgyMDAsIGJwbCwKLQkJCQkJCSAgICAgc2luZ2xlZmllbGRfbGluZXMsCi0JCQkJCQkgICAgIGZpZm9fZW5hYmxlLCBFVkVOX0ZJRUxEKTsKKwkJCQlkZXYtPl9kYXRhX2J1Zl9waHlzX2FkZHJfY2gyICsgZGF0YWJ1Zl9vZmZzZXQsCisJCQkJYm90dG9tX29mZnNldCwgMHgyMDAsIGJwbCwgc2luZ2xlZmllbGRfbGluZXMsCisJCQkJZmlmb19lbmFibGUsIEVWRU5fRklFTEQpOwogCiAJCWlmIChmcmFtZSA9PSAwKSB7CiAJCQlyaXNjX2ZsYWcgPSBSSVNDX0NOVF9SRVNFVDsKLQkJCXJpc2NfcGh5c19qdW1wX2FkZHIgPQotCQkJICAgIGRldi0+X2RtYV9waHlzX3N0YXJ0X2FkZHJfY2gyICsgcmlzY19wcm9ncmFtX3NpemU7CisJCQlyaXNjX3BoeXNfanVtcF9hZGRyID0gZGV2LT5fZG1hX3BoeXNfc3RhcnRfYWRkcl9jaDIgKworCQkJCQlyaXNjX3Byb2dyYW1fc2l6ZTsKIAkJfSBlbHNlIHsKIAkJCXJpc2NfZmxhZyA9IFJJU0NfQ05UX0lOQzsKIAkJCXJpc2NfcGh5c19qdW1wX2FkZHIgPSBkZXYtPl9kbWFfcGh5c19zdGFydF9hZGRyX2NoMjsKQEAgLTUxMCw5ICs1MDQsOCBAQAogCQlyZXR1cm4gcmV0OwogCiAJLyogQ3JlYXRpbmcgUklTQyBwcm9ncmFtcyAqLwotCXJldCA9Ci0JICAgIGN4MjU4MjFfcmlzY19idWZmZXJfdXBzdHJlYW1fY2gyKGRldiwgZGV2LT5wY2ksIDAsIGJwbCwKLQkJCQkJICAgICBkZXYtPl9saW5lc19jb3VudF9jaDIpOworCXJldCA9IGN4MjU4MjFfcmlzY19idWZmZXJfdXBzdHJlYW1fY2gyKGRldiwgZGV2LT5wY2ksIDAsIGJwbCwKKwkJCQkJCWRldi0+X2xpbmVzX2NvdW50X2NoMik7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJfaW5mbygiRmFpbGVkIGNyZWF0aW5nIFZpZGVvIFVwc3RyZWFtIFJpc2MgcHJvZ3JhbXMhXG4iKTsKIAkJZ290byBlcnJvcjsKQEAgLTUyMCw3ICs1MTMsNyBAQAogCiAJcmV0dXJuIDA7CiAKLQllcnJvcjoKK2Vycm9yOgogCXJldHVybiByZXQ7CiB9CiAKQEAgLTU2NSwyMyArNTU4LDE5IEBACiAJCQl9CiAKIAkJCWlmIChkZXYtPl9kbWFfdmlydF9zdGFydF9hZGRyX2NoMiAhPSBOVUxMKSB7Ci0JCQkJbGluZV9zaXplX2luX2J5dGVzID0KLQkJCQkgICAgKGRldi0+X3BpeGVsX2Zvcm1hdF9jaDIgPT0KLQkJCQkgICAgIFBJWEVMX0ZSTVRfNDExKSA/IFk0MTFfTElORV9TWiA6Ci0JCQkJICAgIFk0MjJfTElORV9TWjsKKwkJCQlpZiAoZGV2LT5fcGl4ZWxfZm9ybWF0X2NoMiA9PSBQSVhFTF9GUk1UXzQxMSkKKwkJCQkJbGluZV9zaXplX2luX2J5dGVzID0gWTQxMV9MSU5FX1NaOworCQkJCWVsc2UKKwkJCQkJbGluZV9zaXplX2luX2J5dGVzID0gWTQyMl9MSU5FX1NaOwogCQkJCXJpc2NfcGh5c19qdW1wX2FkZHIgPQogCQkJCSAgICBkZXYtPl9kbWFfcGh5c19zdGFydF9hZGRyX2NoMiArCiAJCQkJICAgIG9kZF9yaXNjX3Byb2dfc2l6ZTsKIAogCQkJCXJwID0gY3gyNTgyMV91cGRhdGVfcmlzY3Byb2dyYW1fY2gyKGRldiwKLQkJCQkJCQkJICAgIGRldi0+Ci0JCQkJCQkJCSAgICBfZG1hX3ZpcnRfc3RhcnRfYWRkcl9jaDIsCi0JCQkJCQkJCSAgICBUT1BfT0ZGU0VULAotCQkJCQkJCQkgICAgbGluZV9zaXplX2luX2J5dGVzLAotCQkJCQkJCQkgICAgMHgwLAotCQkJCQkJCQkgICAgc2luZ2xlZmllbGRfbGluZXMsCi0JCQkJCQkJCSAgICBGSUZPX0RJU0FCTEUsCi0JCQkJCQkJCSAgICBPRERfRklFTEQpOworCQkJCQkJZGV2LT5fZG1hX3ZpcnRfc3RhcnRfYWRkcl9jaDIsCisJCQkJCQlUT1BfT0ZGU0VULCBsaW5lX3NpemVfaW5fYnl0ZXMsCisJCQkJCQkweDAsIHNpbmdsZWZpZWxkX2xpbmVzLAorCQkJCQkJRklGT19ESVNBQkxFLCBPRERfRklFTEQpOwogCiAJCQkgICAgICAgLyogSnVtcCB0byBFdmVuIFJpc2MgcHJvZ3JhbSBvZiAxc3QgRnJhbWUgKi8KIAkJCQkqKHJwKyspID0gY3B1X3RvX2xlMzIoUklTQ19KVU1QKTsKQEAgLTcwNCw3ICs2OTMsNyBAQAogCiAJZXJyID0KIAkgICAgcmVxdWVzdF9pcnEoZGV2LT5wY2ktPmlycSwgY3gyNTgyMV91cHN0cmVhbV9pcnFfY2gyLAotCQkJSVJRRl9TSEFSRUQgfCBJUlFGX0RJU0FCTEVELCBkZXYtPm5hbWUsIGRldik7CisJCQlJUlFGX1NIQVJFRCwgZGV2LT5uYW1lLCBkZXYpOwogCWlmIChlcnIgPCAwKSB7CiAJCXByX2VycigiJXM6IGNhbid0IGdldCB1cHN0cmVhbSBJUlEgJWRcbiIsCiAJCSAgICAgICBkZXYtPm5hbWUsIGRldi0+cGNpLT5pcnEpOwpAQCAtNzE5LDcgKzcwOCw3IEBACiAKIAlyZXR1cm4gMDsKIAotCWZhaWxfaXJxOgorZmFpbF9pcnE6CiAJY3gyNTgyMV9kZXZfdW5yZWdpc3RlcihkZXYpOwogCXJldHVybiBlcnI7CiB9CkBAIC04MDUsOCArNzk0LDcgQEAKIAkJfQogCX0KIAotCXJldHZhbCA9Ci0JICAgIGN4MjU4MjFfc3JhbV9jaGFubmVsX3NldHVwX3Vwc3RyZWFtKGRldiwgc3JhbV9jaCwKKwlyZXR2YWwgPSBjeDI1ODIxX3NyYW1fY2hhbm5lbF9zZXR1cF91cHN0cmVhbShkZXYsIHNyYW1fY2gsCiAJCQkJCQlkZXYtPl9saW5lX3NpemVfY2gyLCAwKTsKIAogCS8qIHNldHVwIGZpZm8gKyBmb3JtYXQgKi8KQEAgLTgxNiw4ICs4MDQsNyBAQAogCWRldi0+dXBzdHJlYW1fZGF0YWJ1Zl9zaXplX2NoMiA9IGRhdGFfZnJhbWVfc2l6ZSAqIDI7CiAKIAkvKiBBbGxvY2F0aW5nIGJ1ZmZlcnMgYW5kIHByZXBhcmUgUklTQyBwcm9ncmFtICovCi0JcmV0dmFsID0KLQkgICAgY3gyNTgyMV91cHN0cmVhbV9idWZmZXJfcHJlcGFyZV9jaDIoZGV2LCBzcmFtX2NoLAorCXJldHZhbCA9IGN4MjU4MjFfdXBzdHJlYW1fYnVmZmVyX3ByZXBhcmVfY2gyKGRldiwgc3JhbV9jaCwKIAkJCQkJCWRldi0+X2xpbmVfc2l6ZV9jaDIpOwogCWlmIChyZXR2YWwgPCAwKSB7CiAJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgdXAgVmlkZW8gdXBzdHJlYW0gYnVmZmVycyFcbiIsCkBAIC04MjksNyArODE2LDcgQEAKIAogCXJldHVybiAwOwogCi0JZXJyb3I6CitlcnJvcjoKIAljeDI1ODIxX2Rldl91bnJlZ2lzdGVyKGRldik7CiAKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby11cHN0cmVhbS1jaDIuaCBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0tY2gyLmgKaW5kZXggMDI5ZTgzMC4uZDQyZGFiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby11cHN0cmVhbS1jaDIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLWNoMi5oCkBAIC02NSwzNyArNjUsNzQgQEAKICNkZWZpbmUgVVNFX1JJU0NfTk9PUF9WSURFTyAgIDEKIAogI2lmZGVmIFVTRV9SSVNDX05PT1BfVklERU8KLSNkZWZpbmUgUEFMX1VTX1ZJRF9QUk9HX1NJWkUgICAgICAoKFBBTF9GSUVMRF9IRUlHSFQpICogMyAqIERXT1JEX1NJWkUgKyBSSVNDX1dSSVRFQ1JfSU5TVFJVQ1RJT05fU0laRSArICAgXAotCQkJCSAgICBSSVNDX1NZTkNfSU5TVFJVQ1RJT05fU0laRSArIE5VTV9OT19PUFMqRFdPUkRfU0laRSkKKyNkZWZpbmUgUEFMX1VTX1ZJRF9QUk9HX1NJWkUJCQkJCQlcCisJKFBBTF9GSUVMRF9IRUlHSFQgKiAzICogRFdPUkRfU0laRSArCQkJCVwKKwkgUklTQ19XUklURUNSX0lOU1RSVUNUSU9OX1NJWkUgKyBSSVNDX1NZTkNfSU5TVFJVQ1RJT05fU0laRSArCVwKKwkgTlVNX05PX09QUyAqIERXT1JEX1NJWkUpCiAKICNkZWZpbmUgUEFMX1JJU0NfQlVGX1NJWkUgICAgICAgICAoMiAqIFBBTF9VU19WSURfUFJPR19TSVpFKQogCi0jZGVmaW5lIFBBTF9WSURfUFJPR19TSVpFICAgICAgICAgKChQQUxfRklFTERfSEVJR0hUKjIpICogMyAqIERXT1JEX1NJWkUgKyAyKlJJU0NfU1lOQ19JTlNUUlVDVElPTl9TSVpFICsgXAotCQkJCSAgICBSSVNDX1dSSVRFQ1JfSU5TVFJVQ1RJT05fU0laRSArIEpVTVBfSU5TVFJVQ1RJT05fU0laRSArIDIqTlVNX05PX09QUypEV09SRF9TSVpFKQorI2RlZmluZSBQQUxfVklEX1BST0dfU0laRQkJCQkJCVwKKwkoKFBBTF9GSUVMRF9IRUlHSFQgKiAyKSAqIDMgKiBEV09SRF9TSVpFICsJCQlcCisJIDIgKiBSSVNDX1NZTkNfSU5TVFJVQ1RJT05fU0laRSArIFJJU0NfV1JJVEVDUl9JTlNUUlVDVElPTl9TSVpFICsgXAorCSBKVU1QX0lOU1RSVUNUSU9OX1NJWkUgKyAyICogTlVNX05PX09QUyAqIERXT1JEX1NJWkUpCiAKLSNkZWZpbmUgT0REX0ZMRF9QQUxfUFJPR19TSVpFICAgICAoKFBBTF9GSUVMRF9IRUlHSFQpICogMyAqIERXT1JEX1NJWkUgKyBSSVNDX1NZTkNfSU5TVFJVQ1RJT05fU0laRSArIFwKLQkJCQkgICAgUklTQ19XUklURUNSX0lOU1RSVUNUSU9OX1NJWkUgKyBOVU1fTk9fT1BTKkRXT1JEX1NJWkUpCisjZGVmaW5lIE9ERF9GTERfUEFMX1BST0dfU0laRQkJCQkJCVwKKwkoUEFMX0ZJRUxEX0hFSUdIVCAqIDMgKiBEV09SRF9TSVpFICsJCQkJXAorCSBSSVNDX1NZTkNfSU5TVFJVQ1RJT05fU0laRSArIFJJU0NfV1JJVEVDUl9JTlNUUlVDVElPTl9TSVpFICsJXAorCSBOVU1fTk9fT1BTICogRFdPUkRfU0laRSkKIAotI2RlZmluZSBOVFNDX1VTX1ZJRF9QUk9HX1NJWkUgICAgICgoTlRTQ19PRERfRkxEX0xJTkVTICsgMSkgKiAzICogRFdPUkRfU0laRSArIFJJU0NfV1JJVEVDUl9JTlNUUlVDVElPTl9TSVpFICsgXAotCQkJCSAgICBKVU1QX0lOU1RSVUNUSU9OX1NJWkUgKyBOVU1fTk9fT1BTKkRXT1JEX1NJWkUpCisjZGVmaW5lIE5UU0NfVVNfVklEX1BST0dfU0laRQkJCQkJCVwKKwkoKE5UU0NfT0REX0ZMRF9MSU5FUyArIDEpICogMyAqIERXT1JEX1NJWkUgKwkJCVwKKwkgUklTQ19XUklURUNSX0lOU1RSVUNUSU9OX1NJWkUgKyBKVU1QX0lOU1RSVUNUSU9OX1NJWkUgKwlcCisJIE5VTV9OT19PUFMgKiBEV09SRF9TSVpFKQogCi0jZGVmaW5lIE5UU0NfUklTQ19CVUZfU0laRSAgICAgICAgKDIgKiAoUklTQ19TWU5DX0lOU1RSVUNUSU9OX1NJWkUgKyBOVFNDX1VTX1ZJRF9QUk9HX1NJWkUpKQorI2RlZmluZSBOVFNDX1JJU0NfQlVGX1NJWkUJCQkJCQlcCisJKDIgKiAoUklTQ19TWU5DX0lOU1RSVUNUSU9OX1NJWkUgKyBOVFNDX1VTX1ZJRF9QUk9HX1NJWkUpKQogCi0jZGVmaW5lIEZSQU1FMV9WSURfUFJPR19TSVpFICAgICAgKChOVFNDX09ERF9GTERfTElORVMgKyBOVFNDX0ZJRUxEX0hFSUdIVCkgKiAzICogRFdPUkRfU0laRSArIDIqUklTQ19TWU5DX0lOU1RSVUNUSU9OX1NJWkUgKyBcCi0JCQkJICAgIFJJU0NfV1JJVEVDUl9JTlNUUlVDVElPTl9TSVpFICsgSlVNUF9JTlNUUlVDVElPTl9TSVpFICsgMipOVU1fTk9fT1BTKkRXT1JEX1NJWkUpCi0jZGVmaW5lIE9ERF9GTERfTlRTQ19QUk9HX1NJWkUgICAgKChOVFNDX09ERF9GTERfTElORVMpICogMyAqIERXT1JEX1NJWkUgKyBSSVNDX1NZTkNfSU5TVFJVQ1RJT05fU0laRSArIFwKLQkJCQkgICAgUklTQ19XUklURUNSX0lOU1RSVUNUSU9OX1NJWkUgKyBOVU1fTk9fT1BTKkRXT1JEX1NJWkUpCisjZGVmaW5lIEZSQU1FMV9WSURfUFJPR19TSVpFCQkJCQkJXAorCSgoTlRTQ19PRERfRkxEX0xJTkVTICsgTlRTQ19GSUVMRF9IRUlHSFQpICoJCQlcCisJIDMgKiBEV09SRF9TSVpFICsgMiAqIFJJU0NfU1lOQ19JTlNUUlVDVElPTl9TSVpFICsJCVwKKwkgUklTQ19XUklURUNSX0lOU1RSVUNUSU9OX1NJWkUgKyBKVU1QX0lOU1RSVUNUSU9OX1NJWkUgKwlcCisJIDIgKiBOVU1fTk9fT1BTICogRFdPUkRfU0laRSkKKworI2RlZmluZSBPRERfRkxEX05UU0NfUFJPR19TSVpFCQkJCQkJXAorCShOVFNDX09ERF9GTERfTElORVMgKiAzICogRFdPUkRfU0laRSArCQkJCVwKKwkgUklTQ19TWU5DX0lOU1RSVUNUSU9OX1NJWkUgKyBSSVNDX1dSSVRFQ1JfSU5TVFJVQ1RJT05fU0laRSArCVwKKwkgTlVNX05PX09QUyAqIERXT1JEX1NJWkUpCiAjZW5kaWYKIAogI2lmbmRlZiBVU0VfUklTQ19OT09QX1ZJREVPCi0jZGVmaW5lIFBBTF9VU19WSURfUFJPR19TSVpFICAgICAgKChQQUxfRklFTERfSEVJR0hUICsgMSkgKiAzICogRFdPUkRfU0laRSArIFJJU0NfV1JJVEVDUl9JTlNUUlVDVElPTl9TSVpFKQotI2RlZmluZSBQQUxfUklTQ19CVUZfU0laRSAgICAgICAgICgyICogKFJJU0NfU1lOQ19JTlNUUlVDVElPTl9TSVpFICsgUEFMX1VTX1ZJRF9QUk9HX1NJWkUpKQotI2RlZmluZSBQQUxfVklEX1BST0dfU0laRSAgICAgICAgICgoUEFMX0ZJRUxEX0hFSUdIVCoyKSAqIDMgKiBEV09SRF9TSVpFICsgMipSSVNDX1NZTkNfSU5TVFJVQ1RJT05fU0laRSArIFwKLQkJCQkgICAgUklTQ19XUklURUNSX0lOU1RSVUNUSU9OX1NJWkUgKyBKVU1QX0lOU1RSVUNUSU9OX1NJWkUpCi0jZGVmaW5lIE9ERF9GTERfUEFMX1BST0dfU0laRSAgICAgKChQQUxfRklFTERfSEVJR0hUKSAqIDMgKiBEV09SRF9TSVpFICsgUklTQ19TWU5DX0lOU1RSVUNUSU9OX1NJWkUgKyBSSVNDX1dSSVRFQ1JfSU5TVFJVQ1RJT05fU0laRSkKLSNkZWZpbmUgT0REX0ZMRF9OVFNDX1BST0dfU0laRSAgICAoKE5UU0NfT0REX0ZMRF9MSU5FUykgKiAzICogRFdPUkRfU0laRSArIFJJU0NfU1lOQ19JTlNUUlVDVElPTl9TSVpFICsgUklTQ19XUklURUNSX0lOU1RSVUNUSU9OX1NJWkUpCi0jZGVmaW5lIE5UU0NfVVNfVklEX1BST0dfU0laRSAgICAgKChOVFNDX09ERF9GTERfTElORVMgKyAxKSAqIDMgKiBEV09SRF9TSVpFICsgUklTQ19XUklURUNSX0lOU1RSVUNUSU9OX1NJWkUgKyBKVU1QX0lOU1RSVUNUSU9OX1NJWkUpCi0jZGVmaW5lIE5UU0NfUklTQ19CVUZfU0laRSAgICAgICAgKDIgKiAoUklTQ19TWU5DX0lOU1RSVUNUSU9OX1NJWkUgKyBOVFNDX1VTX1ZJRF9QUk9HX1NJWkUpKQotI2RlZmluZSBGUkFNRTFfVklEX1BST0dfU0laRSAgICAgICgoTlRTQ19PRERfRkxEX0xJTkVTICsgTlRTQ19GSUVMRF9IRUlHSFQpICogMyAqIERXT1JEX1NJWkUgKyAyKlJJU0NfU1lOQ19JTlNUUlVDVElPTl9TSVpFICsgXAotCQkJCSAgICBSSVNDX1dSSVRFQ1JfSU5TVFJVQ1RJT05fU0laRSArIEpVTVBfSU5TVFJVQ1RJT05fU0laRSkKKyNkZWZpbmUgUEFMX1VTX1ZJRF9QUk9HX1NJWkUJCQkJCQlcCisJKChQQUxfRklFTERfSEVJR0hUICsgMSkgKiAzICogRFdPUkRfU0laRSArCQkJXAorCSBSSVNDX1dSSVRFQ1JfSU5TVFJVQ1RJT05fU0laRSkKKworI2RlZmluZSBQQUxfUklTQ19CVUZfU0laRQkJCQkJCVwKKwkoMiAqIChSSVNDX1NZTkNfSU5TVFJVQ1RJT05fU0laRSArIFBBTF9VU19WSURfUFJPR19TSVpFKSkKKworI2RlZmluZSBQQUxfVklEX1BST0dfU0laRQkJCQkJCVwKKwkoKFBBTF9GSUVMRF9IRUlHSFQgKiAyKSAqIDMgKiBEV09SRF9TSVpFICsJCQlcCisJIDIgKiBSSVNDX1NZTkNfSU5TVFJVQ1RJT05fU0laRSArIFJJU0NfV1JJVEVDUl9JTlNUUlVDVElPTl9TSVpFICsgXAorCSBKVU1QX0lOU1RSVUNUSU9OX1NJWkUpCisKKyNkZWZpbmUgT0REX0ZMRF9QQUxfUFJPR19TSVpFCQkJCQkJXAorCShQQUxfRklFTERfSEVJR0hUICogMyAqIERXT1JEX1NJWkUgKwkJCQlcCisJIFJJU0NfU1lOQ19JTlNUUlVDVElPTl9TSVpFICsgUklTQ19XUklURUNSX0lOU1RSVUNUSU9OX1NJWkUpCisKKyNkZWZpbmUgT0REX0ZMRF9OVFNDX1BST0dfU0laRQkJCQkJCVwKKwkoTlRTQ19PRERfRkxEX0xJTkVTICogMyAqIERXT1JEX1NJWkUgKwkJCQlcCisJIFJJU0NfU1lOQ19JTlNUUlVDVElPTl9TSVpFICsgUklTQ19XUklURUNSX0lOU1RSVUNUSU9OX1NJWkUpCisKKyNkZWZpbmUgTlRTQ19VU19WSURfUFJPR19TSVpFCQkJCQkJXAorCSgoTlRTQ19PRERfRkxEX0xJTkVTICsgMSkgKiAzICogRFdPUkRfU0laRSArCQkJXAorCSBSSVNDX1dSSVRFQ1JfSU5TVFJVQ1RJT05fU0laRSArIEpVTVBfSU5TVFJVQ1RJT05fU0laRSkKKworI2RlZmluZSBOVFNDX1JJU0NfQlVGX1NJWkUJCQkJCQlcCisJKDIgKiAoUklTQ19TWU5DX0lOU1RSVUNUSU9OX1NJWkUgKyBOVFNDX1VTX1ZJRF9QUk9HX1NJWkUpKQorCisjZGVmaW5lIEZSQU1FMV9WSURfUFJPR19TSVpFCQkJCQkJXAorCSgoTlRTQ19PRERfRkxEX0xJTkVTICsgTlRTQ19GSUVMRF9IRUlHSFQpICoJCQlcCisJIDMgKiBEV09SRF9TSVpFICsgMiAqIFJJU0NfU1lOQ19JTlNUUlVDVElPTl9TSVpFICsJCVwKKwkgUklTQ19XUklURUNSX0lOU1RSVUNUSU9OX1NJWkUgKyBKVU1QX0lOU1RSVUNUSU9OX1NJWkUpCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby11cHN0cmVhbS5jIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby11cHN0cmVhbS5jCmluZGV4IGViMDE3MmIuLmMwYjgwMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLmMKQEAgLTQwLDggKzQwLDggQEAKIE1PRFVMRV9BVVRIT1IoIkhpZXAgSHV5bmggPGhpZXAuaHV5bmhAY29uZXhhbnQuY29tPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1zdGF0aWMgaW50IF9pbnRyX21zayA9Ci0JRkxEX1ZJRF9TUkNfUklTQzEgfCBGTERfVklEX1NSQ19VRiB8IEZMRF9WSURfU1JDX1NZTkMgfCBGTERfVklEX1NSQ19PUENfRVJSOworc3RhdGljIGludCBfaW50cl9tc2sgPSBGTERfVklEX1NSQ19SSVNDMSB8IEZMRF9WSURfU1JDX1VGIHwgRkxEX1ZJRF9TUkNfU1lOQyB8CisJCQlGTERfVklEX1NSQ19PUENfRVJSOwogCiBpbnQgY3gyNTgyMV9zcmFtX2NoYW5uZWxfc2V0dXBfdXBzdHJlYW0oc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCiAJCQkJCXN0cnVjdCBzcmFtX2NoYW5uZWwgKmNoLApAQCAtNjE1LDE0ICs2MTUsMTAgQEAKIAkJCQkgICAgb2RkX3Jpc2NfcHJvZ19zaXplOwogCiAJCQkJcnAgPSBjeDI1ODIxX3VwZGF0ZV9yaXNjcHJvZ3JhbShkZXYsCi0JCQkJCQkJCWRldi0+Ci0JCQkJCQkJCV9kbWFfdmlydF9zdGFydF9hZGRyLAotCQkJCQkJCQlUT1BfT0ZGU0VULAotCQkJCQkJCQlsaW5lX3NpemVfaW5fYnl0ZXMsCi0JCQkJCQkJCTB4MCwKLQkJCQkJCQkJc2luZ2xlZmllbGRfbGluZXMsCi0JCQkJCQkJCUZJRk9fRElTQUJMRSwKLQkJCQkJCQkJT0REX0ZJRUxEKTsKKwkJCQkJZGV2LT5fZG1hX3ZpcnRfc3RhcnRfYWRkciwgVE9QX09GRlNFVCwKKwkJCQkJbGluZV9zaXplX2luX2J5dGVzLCAweDAsCisJCQkJCXNpbmdsZWZpZWxkX2xpbmVzLCBGSUZPX0RJU0FCTEUsCisJCQkJCU9ERF9GSUVMRCk7CiAKIAkJCQkvKiBKdW1wIHRvIEV2ZW4gUmlzYyBwcm9ncmFtIG9mIDFzdCBGcmFtZSAqLwogCQkJCSoocnArKykgPSBjcHVfdG9fbGUzMihSSVNDX0pVTVApOwpAQCAtNzUzLDcgKzc0OSw3IEBACiAKIAllcnIgPQogCSAgICByZXF1ZXN0X2lycShkZXYtPnBjaS0+aXJxLCBjeDI1ODIxX3Vwc3RyZWFtX2lycSwKLQkJCUlSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRCwgZGV2LT5uYW1lLCBkZXYpOworCQkJSVJRRl9TSEFSRUQsIGRldi0+bmFtZSwgZGV2KTsKIAlpZiAoZXJyIDwgMCkgewogCQlwcl9lcnIoIiVzOiBjYW4ndCBnZXQgdXBzdHJlYW0gSVJRICVkXG4iLAogCQkgICAgICAgZGV2LT5uYW1lLCBkZXYtPnBjaS0+aXJxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0uaCBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8tdXBzdHJlYW0uaAppbmRleCBmMGIzYWMwLi4yNjhlYzhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLXVwc3RyZWFtLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby11cHN0cmVhbS5oCkBAIC02Niw0NCArNjYsNzQgQEAKICNkZWZpbmUgVVNFX1JJU0NfTk9PUF9WSURFTyAgIDEKIAogI2lmZGVmIFVTRV9SSVNDX05PT1BfVklERU8KLSNkZWZpbmUgUEFMX1VTX1ZJRF9QUk9HX1NJWkUgICAgICAgICgoUEFMX0ZJRUxEX0hFSUdIVCkgKiAzICogRFdPUkRfU0laRSArIFJJU0NfV1JJVEVDUl9JTlNUUlVDVElPTl9TSVpFICsgICBcCi0JCQkJICAgICAgUklTQ19TWU5DX0lOU1RSVUNUSU9OX1NJWkUgKyBOVU1fTk9fT1BTKkRXT1JEX1NJWkUpCisjZGVmaW5lIFBBTF9VU19WSURfUFJPR19TSVpFCQkJCQkJXAorCShQQUxfRklFTERfSEVJR0hUICogMyAqIERXT1JEX1NJWkUgKwkJCQlcCisJIFJJU0NfV1JJVEVDUl9JTlNUUlVDVElPTl9TSVpFICsgUklTQ19TWU5DX0lOU1RSVUNUSU9OX1NJWkUgKwlcCisJIE5VTV9OT19PUFMgKiBEV09SRF9TSVpFKQogCiAjZGVmaW5lIFBBTF9SSVNDX0JVRl9TSVpFICAgICAgICAgICAoMiAqIFBBTF9VU19WSURfUFJPR19TSVpFKQogCi0jZGVmaW5lIFBBTF9WSURfUFJPR19TSVpFICAgICAgICAgICAoKFBBTF9GSUVMRF9IRUlHSFQqMikgKiAzICogRFdPUkRfU0laRSArIDIqUklTQ19TWU5DX0lOU1RSVUNUSU9OX1NJWkUgKyBcCi0JCQkJICAgICAgUklTQ19XUklURUNSX0lOU1RSVUNUSU9OX1NJWkUgKyBKVU1QX0lOU1RSVUNUSU9OX1NJWkUgKyAyKk5VTV9OT19PUFMqRFdPUkRfU0laRSkKKyNkZWZpbmUgUEFMX1ZJRF9QUk9HX1NJWkUJCQkJCQlcCisJKChQQUxfRklFTERfSEVJR0hUICogMikgKiAzICogRFdPUkRfU0laRSArCQkJXAorCSAyICogUklTQ19TWU5DX0lOU1RSVUNUSU9OX1NJWkUgKyBSSVNDX1dSSVRFQ1JfSU5TVFJVQ1RJT05fU0laRSArIFwKKwkgSlVNUF9JTlNUUlVDVElPTl9TSVpFICsgMiAqIE5VTV9OT19PUFMgKiBEV09SRF9TSVpFKQogCi0jZGVmaW5lIE9ERF9GTERfUEFMX1BST0dfU0laRSAgICAgICAoKFBBTF9GSUVMRF9IRUlHSFQpICogMyAqIERXT1JEX1NJWkUgKyBSSVNDX1NZTkNfSU5TVFJVQ1RJT05fU0laRSArIFwKLQkJCQkgICAgICBSSVNDX1dSSVRFQ1JfSU5TVFJVQ1RJT05fU0laRSArIE5VTV9OT19PUFMqRFdPUkRfU0laRSkKKyNkZWZpbmUgT0REX0ZMRF9QQUxfUFJPR19TSVpFCQkJCQkJXAorCShQQUxfRklFTERfSEVJR0hUICogMyAqIERXT1JEX1NJWkUgKwkJCQlcCisJIFJJU0NfU1lOQ19JTlNUUlVDVElPTl9TSVpFICsgUklTQ19XUklURUNSX0lOU1RSVUNUSU9OX1NJWkUgKwlcCisJIE5VTV9OT19PUFMgKiBEV09SRF9TSVpFKQogCi0jZGVmaW5lIE9ERF9GTERfTlRTQ19QUk9HX1NJWkUgICAgICAoKE5UU0NfT0REX0ZMRF9MSU5FUykgKiAzICogRFdPUkRfU0laRSArIFJJU0NfU1lOQ19JTlNUUlVDVElPTl9TSVpFICsgXAotCQkJCSAgICAgIFJJU0NfV1JJVEVDUl9JTlNUUlVDVElPTl9TSVpFICsgTlVNX05PX09QUypEV09SRF9TSVpFKQorI2RlZmluZSBPRERfRkxEX05UU0NfUFJPR19TSVpFCQkJCQkJXAorCShOVFNDX09ERF9GTERfTElORVMgKiAzICogRFdPUkRfU0laRSArCQkJCVwKKwkgUklTQ19TWU5DX0lOU1RSVUNUSU9OX1NJWkUgKyBSSVNDX1dSSVRFQ1JfSU5TVFJVQ1RJT05fU0laRSArCVwKKwkgTlVNX05PX09QUyAqIERXT1JEX1NJWkUpCiAKLSNkZWZpbmUgTlRTQ19VU19WSURfUFJPR19TSVpFICAgICAgICgoTlRTQ19PRERfRkxEX0xJTkVTICsgMSkgKiAzICogRFdPUkRfU0laRSArIFJJU0NfV1JJVEVDUl9JTlNUUlVDVElPTl9TSVpFICsgXAotCQkJCSAgICAgIEpVTVBfSU5TVFJVQ1RJT05fU0laRSArIE5VTV9OT19PUFMqRFdPUkRfU0laRSkKKyNkZWZpbmUgTlRTQ19VU19WSURfUFJPR19TSVpFCQkJCQkJXAorCSgoTlRTQ19PRERfRkxEX0xJTkVTICsgMSkgKiAzICogRFdPUkRfU0laRSArCQkJXAorCSBSSVNDX1dSSVRFQ1JfSU5TVFJVQ1RJT05fU0laRSArIEpVTVBfSU5TVFJVQ1RJT05fU0laRSArCVwKKwkgTlVNX05PX09QUyAqIERXT1JEX1NJWkUpCiAKLSNkZWZpbmUgTlRTQ19SSVNDX0JVRl9TSVpFICAgICAgICAgICgyICogKFJJU0NfU1lOQ19JTlNUUlVDVElPTl9TSVpFICsgTlRTQ19VU19WSURfUFJPR19TSVpFKSkKKyNkZWZpbmUgTlRTQ19SSVNDX0JVRl9TSVpFCQkJCQkJXAorCSgyICogKFJJU0NfU1lOQ19JTlNUUlVDVElPTl9TSVpFICsgTlRTQ19VU19WSURfUFJPR19TSVpFKSkKIAotI2RlZmluZSBGUkFNRTFfVklEX1BST0dfU0laRSAgICAgICAgKChOVFNDX09ERF9GTERfTElORVMgKyBOVFNDX0ZJRUxEX0hFSUdIVCkgKiAzICogRFdPUkRfU0laRSArIDIqUklTQ19TWU5DX0lOU1RSVUNUSU9OX1NJWkUgKyBcCi0JCQkJICAgICAgUklTQ19XUklURUNSX0lOU1RSVUNUSU9OX1NJWkUgKyBKVU1QX0lOU1RSVUNUSU9OX1NJWkUgKyAyKk5VTV9OT19PUFMqRFdPUkRfU0laRSkKKyNkZWZpbmUgRlJBTUUxX1ZJRF9QUk9HX1NJWkUJCQkJCQlcCisJKChOVFNDX09ERF9GTERfTElORVMgKyBOVFNDX0ZJRUxEX0hFSUdIVCkgKiAzICogRFdPUkRfU0laRSArCVwKKwkgMiAqIFJJU0NfU1lOQ19JTlNUUlVDVElPTl9TSVpFICsgUklTQ19XUklURUNSX0lOU1RSVUNUSU9OX1NJWkUgKyBcCisJIEpVTVBfSU5TVFJVQ1RJT05fU0laRSArIDIgKiBOVU1fTk9fT1BTICogRFdPUkRfU0laRSkKIAogI2VuZGlmCiAKICNpZm5kZWYgVVNFX1JJU0NfTk9PUF9WSURFTwotI2RlZmluZSBQQUxfVVNfVklEX1BST0dfU0laRSAgICAgICAgKChQQUxfRklFTERfSEVJR0hUKSAqIDMgKiBEV09SRF9TSVpFICsgUklTQ19XUklURUNSX0lOU1RSVUNUSU9OX1NJWkUgKyBcCi0JCQkJICAgICAgUklTQ19TWU5DX0lOU1RSVUNUSU9OX1NJWkUgKyBKVU1QX0lOU1RSVUNUSU9OX1NJWkUpCisjZGVmaW5lIFBBTF9VU19WSURfUFJPR19TSVpFCQkJCQkJXAorCShQQUxfRklFTERfSEVJR0hUICogMyAqIERXT1JEX1NJWkUgKwkJCQlcCisJIFJJU0NfV1JJVEVDUl9JTlNUUlVDVElPTl9TSVpFICsgUklTQ19TWU5DX0lOU1RSVUNUSU9OX1NJWkUgKwlcCisJIEpVTVBfSU5TVFJVQ1RJT05fU0laRSkKIAotI2RlZmluZSBQQUxfUklTQ19CVUZfU0laRSAgICAgICAgICAgKDIgKiBQQUxfVVNfVklEX1BST0dfU0laRSkKKyNkZWZpbmUgUEFMX1JJU0NfQlVGX1NJWkUJCSgyICogUEFMX1VTX1ZJRF9QUk9HX1NJWkUpCiAKLSNkZWZpbmUgUEFMX1ZJRF9QUk9HX1NJWkUgICAgICAgICAgICgoUEFMX0ZJRUxEX0hFSUdIVCoyKSAqIDMgKiBEV09SRF9TSVpFICsgMipSSVNDX1NZTkNfSU5TVFJVQ1RJT05fU0laRSArIFwKLQkJCQkgICAgICBSSVNDX1dSSVRFQ1JfSU5TVFJVQ1RJT05fU0laRSArIEpVTVBfSU5TVFJVQ1RJT05fU0laRSkKKyNkZWZpbmUgUEFMX1ZJRF9QUk9HX1NJWkUJCQkJCQlcCisJKChQQUxfRklFTERfSEVJR0hUICogMikgKiAzICogRFdPUkRfU0laRSArCQkJXAorCSAyICogUklTQ19TWU5DX0lOU1RSVUNUSU9OX1NJWkUgKyBSSVNDX1dSSVRFQ1JfSU5TVFJVQ1RJT05fU0laRSArIFwKKwkgSlVNUF9JTlNUUlVDVElPTl9TSVpFKQogCi0jZGVmaW5lIE9ERF9GTERfUEFMX1BST0dfU0laRSAgICAgICAoKFBBTF9GSUVMRF9IRUlHSFQpICogMyAqIERXT1JEX1NJWkUgKyBSSVNDX1NZTkNfSU5TVFJVQ1RJT05fU0laRSArIFJJU0NfV1JJVEVDUl9JTlNUUlVDVElPTl9TSVpFKQotI2RlZmluZSBPRERfRkxEX05UU0NfUFJPR19TSVpFICAgICAgKChOVFNDX09ERF9GTERfTElORVMpICogMyAqIERXT1JEX1NJWkUgKyBSSVNDX1NZTkNfSU5TVFJVQ1RJT05fU0laRSArIFJJU0NfV1JJVEVDUl9JTlNUUlVDVElPTl9TSVpFKQorI2RlZmluZSBPRERfRkxEX1BBTF9QUk9HX1NJWkUJCQkJCQlcCisJKFBBTF9GSUVMRF9IRUlHSFQgKiAzICogRFdPUkRfU0laRSArCQkJCVwKKwkgUklTQ19TWU5DX0lOU1RSVUNUSU9OX1NJWkUgKyBSSVNDX1dSSVRFQ1JfSU5TVFJVQ1RJT05fU0laRSkKIAotI2RlZmluZSBOVFNDX1VTX1ZJRF9QUk9HX1NJWkUgICAgICAgKChOVFNDX09ERF9GTERfTElORVMgKyAxKSAqIDMgKiBEV09SRF9TSVpFICsgUklTQ19XUklURUNSX0lOU1RSVUNUSU9OX1NJWkUgKyBKVU1QX0lOU1RSVUNUSU9OX1NJWkUpCi0jZGVmaW5lIE5UU0NfUklTQ19CVUZfU0laRSAgICAgICAgICAoMiAqIChSSVNDX1NZTkNfSU5TVFJVQ1RJT05fU0laRSArIE5UU0NfVVNfVklEX1BST0dfU0laRSkpCi0jZGVmaW5lIEZSQU1FMV9WSURfUFJPR19TSVpFICAgICAgICAoKE5UU0NfT0REX0ZMRF9MSU5FUyArIE5UU0NfRklFTERfSEVJR0hUKSAqIDMgKiBEV09SRF9TSVpFICsgMipSSVNDX1NZTkNfSU5TVFJVQ1RJT05fU0laRSArIFwKLQkJCQkgICAgICBSSVNDX1dSSVRFQ1JfSU5TVFJVQ1RJT05fU0laRSArIEpVTVBfSU5TVFJVQ1RJT05fU0laRSkKKyNkZWZpbmUgT0REX0ZMRF9OVFNDX1BST0dfU0laRQkJCQkJCVwKKwkoTlRTQ19PRERfRkxEX0xJTkVTICogMyAqIERXT1JEX1NJWkUgKwkJCQlcCisJIFJJU0NfU1lOQ19JTlNUUlVDVElPTl9TSVpFICsgUklTQ19XUklURUNSX0lOU1RSVUNUSU9OX1NJWkUpCisKKyNkZWZpbmUgTlRTQ19VU19WSURfUFJPR19TSVpFCQkJCQkJXAorCSgoTlRTQ19PRERfRkxEX0xJTkVTICsgMSkgKiAzICogRFdPUkRfU0laRSArCQkJXAorCSBSSVNDX1dSSVRFQ1JfSU5TVFJVQ1RJT05fU0laRSArIEpVTVBfSU5TVFJVQ1RJT05fU0laRSkKKworI2RlZmluZSBOVFNDX1JJU0NfQlVGX1NJWkUJCQkJCQlcCisJKDIgKiAoUklTQ19TWU5DX0lOU1RSVUNUSU9OX1NJWkUgKyBOVFNDX1VTX1ZJRF9QUk9HX1NJWkUpKQorCisjZGVmaW5lIEZSQU1FMV9WSURfUFJPR19TSVpFCQkJCQkJXAorCSgoTlRTQ19PRERfRkxEX0xJTkVTICsgTlRTQ19GSUVMRF9IRUlHSFQpICogMyAqIERXT1JEX1NJWkUgKwlcCisJIDIgKiBSSVNDX1NZTkNfSU5TVFJVQ1RJT05fU0laRSArIFJJU0NfV1JJVEVDUl9JTlNUUlVDVElPTl9TSVpFICsgXAorCSBKVU1QX0lOU1RSVUNUSU9OX1NJWkUpCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby5jIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby5jCmluZGV4IDdhMDMwNGEuLjA4NGZjMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLmMKQEAgLTk4LDkgKzk4LDggQEAKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAotCWlmIChmb3VyY2MgPT0gVjRMMl9QSVhfRk1UX1k0MVAgfHwgZm91cmNjID09IFY0TDJfUElYX0ZNVF9ZVVY0MTFQKSB7CisJaWYgKGZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfWTQxUCB8fCBmb3VyY2MgPT0gVjRMMl9QSVhfRk1UX1lVVjQxMVApCiAJCXJldHVybiBmb3JtYXRzICsgMTsKLQl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmb3JtYXRzKTsgaSsrKQogCQlpZiAoZm9ybWF0c1tpXS5mb3VyY2MgPT0gZm91cmNjKQpAQCAtMTEwLDcgKzEwOSw4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgY3gyNTgyMV9kdW1wX3ZpZGVvX3F1ZXVlKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSAqcSkKK3ZvaWQgY3gyNTgyMV9kdW1wX3ZpZGVvX3F1ZXVlKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAorCQkJICAgICAgc3RydWN0IGN4MjU4MjFfZG1hcXVldWUgKnEpCiB7CiAJc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWY7CiAJc3RydWN0IGxpc3RfaGVhZCAqaXRlbTsKQEAgLTE0Niw5ICsxNDYsOCBAQAogCQkvKiBjb3VudCBjb21lcyBmcm9tIHRoZSBodyBhbmQgaXQgaXMgMTZiaXQgd2lkZSAtLQogCQkgKiB0aGlzIHRyaWNrIGhhbmRsZXMgd3JhcC1hcm91bmRzIGNvcnJlY3RseSBmb3IKIAkJICogdXAgdG8gMzI3NjcgYnVmZmVycyBpbiBmbGlnaHQuLi4gKi8KLQkJaWYgKChzMTYpIChjb3VudCAtIGJ1Zi0+Y291bnQpIDwgMCkgeworCQlpZiAoKHMxNikgKGNvdW50IC0gYnVmLT5jb3VudCkgPCAwKQogCQkJYnJlYWs7Ci0JCX0KIAogCQlkb19nZXR0aW1lb2ZkYXkoJmJ1Zi0+dmIudHMpOwogCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfRE9ORTsKQEAgLTE2MSw4ICsxNjAsNyBAQAogCWVsc2UKIAkJbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzICsgQlVGRkVSX1RJTUVPVVQpOwogCWlmIChiYyAhPSAxKQotCQlwcl9lcnIoIiVzOiAlZCBidWZmZXJzIGhhbmRsZWQgKHNob3VsZCBiZSAxKVxuIiwKLQkJICAgICAgIF9fZnVuY19fLCBiYyk7CisJCXByX2VycigiJXM6ICVkIGJ1ZmZlcnMgaGFuZGxlZCAoc2hvdWxkIGJlIDEpXG4iLCBfX2Z1bmNfXywgYmMpOwogfQogCiAjaWZkZWYgVFVORVJfRkxBRwpAQCAtMjAzLDI0ICsyMDEsMjUgQEAKIC8qCiBzdGF0aWMgaW50IGN4MjU4MjFfY3RybF9xdWVyeShzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsKQogewotICAgIGludCBpOworCWludCBpOwogCi0gICAgaWYgKHFjdHJsLT5pZCA8IFY0TDJfQ0lEX0JBU0UgfHwgcWN0cmwtPmlkID49IFY0TDJfQ0lEX0xBU1RQMSkKLQlyZXR1cm4gLUVJTlZBTDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgQ1gyNTgyMV9DVExTOyBpKyspCi0JaWYgKGN4MjU4MjFfY3Rsc1tpXS52LmlkID09IHFjdHJsLT5pZCkKLQkgICAgYnJlYWs7Ci0gICAgaWYgKGkgPT0gQ1gyNTgyMV9DVExTKSB7Ci0JKnFjdHJsID0gbm9fY3RsOworCWlmIChxY3RybC0+aWQgPCBWNEwyX0NJRF9CQVNFIHx8IHFjdHJsLT5pZCA+PSBWNEwyX0NJRF9MQVNUUDEpCisJCXJldHVybiAtRUlOVkFMOworCWZvciAoaSA9IDA7IGkgPCBDWDI1ODIxX0NUTFM7IGkrKykKKwkJaWYgKGN4MjU4MjFfY3Rsc1tpXS52LmlkID09IHFjdHJsLT5pZCkKKwkJCWJyZWFrOworCWlmIChpID09IENYMjU4MjFfQ1RMUykgeworCQkqcWN0cmwgPSBub19jdGw7CisJCXJldHVybiAwOworCX0KKwkqcWN0cmwgPSBjeDI1ODIxX2N0bHNbaV0udjsKIAlyZXR1cm4gMDsKLSAgICB9Ci0gICAgKnFjdHJsID0gY3gyNTgyMV9jdGxzW2ldLnY7Ci0gICAgcmV0dXJuIDA7CiB9CiAqLwogCiAvKiByZXNvdXJjZSBtYW5hZ2VtZW50ICovCi1pbnQgY3gyNTgyMV9yZXNfZ2V0KHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBzdHJ1Y3QgY3gyNTgyMV9maCAqZmgsIHVuc2lnbmVkIGludCBiaXQpCitpbnQgY3gyNTgyMV9yZXNfZ2V0KHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBzdHJ1Y3QgY3gyNTgyMV9maCAqZmgsCisJCSAgICB1bnNpZ25lZCBpbnQgYml0KQogewogCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAlpZiAoZmgtPnJlc291cmNlcyAmIGJpdCkKQEAgLTIyOSwxNCArMjI4LDE0IEBACiAKIAkvKiBpcyBpdCBmcmVlPyAqLwogCW11dGV4X2xvY2soJmRldi0+bG9jayk7Ci0gICAgICAgaWYgKGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnJlc291cmNlcyAmIGJpdCkgeworCWlmIChkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5yZXNvdXJjZXMgJiBiaXQpIHsKIAkJLyogbm8sIHNvbWVvbmUgZWxzZSB1c2VzIGl0ICovCiAJCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIAkJcmV0dXJuIDA7CiAJfQogCS8qIGl0J3MgZnJlZSwgZ3JhYiBpdCAqLwogCWZoLT5yZXNvdXJjZXMgfD0gYml0OwotICAgICAgIGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnJlc291cmNlcyB8PSBiaXQ7CisJZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucmVzb3VyY2VzIHw9IGJpdDsKIAlkcHJpbnRrKDEsICJyZXM6IGdldCAlZFxuIiwgYml0KTsKIAltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiAJcmV0dXJuIDE7CkBAIC0yNDksMTcgKzI0OCwxOCBAQAogCiBpbnQgY3gyNTgyMV9yZXNfbG9ja2VkKHN0cnVjdCBjeDI1ODIxX2ZoICpmaCwgdW5zaWduZWQgaW50IGJpdCkKIHsKLSAgICAgICByZXR1cm4gZmgtPmRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnJlc291cmNlcyAmIGJpdDsKKwlyZXR1cm4gZmgtPmRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnJlc291cmNlcyAmIGJpdDsKIH0KIAotdm9pZCBjeDI1ODIxX3Jlc19mcmVlKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBzdHJ1Y3QgY3gyNTgyMV9maCAqZmgsIHVuc2lnbmVkIGludCBiaXRzKQordm9pZCBjeDI1ODIxX3Jlc19mcmVlKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBzdHJ1Y3QgY3gyNTgyMV9maCAqZmgsCisJCSAgICAgIHVuc2lnbmVkIGludCBiaXRzKQogewogCUJVR19PTigoZmgtPnJlc291cmNlcyAmIGJpdHMpICE9IGJpdHMpOwogCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAogCW11dGV4X2xvY2soJmRldi0+bG9jayk7CiAJZmgtPnJlc291cmNlcyAmPSB+Yml0czsKLSAgICAgICBkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5yZXNvdXJjZXMgJj0gfmJpdHM7CisJZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucmVzb3VyY2VzICY9IH5iaXRzOwogCWRwcmludGsoMSwgInJlczogcHV0ICVkXG4iLCBiaXRzKTsKIAltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiB9CkBAIC0zNTMsNyArMzUzLDcgQEAKIAkJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9BQ1RJVkU7CiAJCQlidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKIAkJCXByZXYtPnJpc2Muam1wWzFdID0gY3B1X3RvX2xlMzIoYnVmLT5yaXNjLmRtYSk7Ci0JCQlwcmV2LT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOwkvKiBCaXRzIDYzIC0gMzIgKi8KKwkJCXByZXYtPnJpc2Muam1wWzJdID0gY3B1X3RvX2xlMzIoMCk7IC8qIEJpdHMgNjMgLSAzMiAqLwogCQl9IGVsc2UgewogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTM2NiwxMSArMzY2LDExIEBACiAJc3RydWN0IGN4MjU4MjFfZGF0YSAqdGltZW91dF9kYXRhID0gKHN0cnVjdCBjeDI1ODIxX2RhdGEgKilkYXRhOwogCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gdGltZW91dF9kYXRhLT5kZXY7CiAJc3RydWN0IHNyYW1fY2hhbm5lbCAqY2hhbm5lbCA9IHRpbWVvdXRfZGF0YS0+Y2hhbm5lbDsKLSAgICAgICBzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSAqcSA9ICZkZXYtPmNoYW5uZWxzW2NoYW5uZWwtPmldLnZpZHE7CisJc3RydWN0IGN4MjU4MjFfZG1hcXVldWUgKnEgPSAmZGV2LT5jaGFubmVsc1tjaGFubmVsLT5pXS52aWRxOwogCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLSAgICAgICAvKiBjeDI1ODIxX3NyYW1fY2hhbm5lbF9kdW1wKGRldiwgY2hhbm5lbCk7ICovCisJLyogY3gyNTgyMV9zcmFtX2NoYW5uZWxfZHVtcChkZXYsIGNoYW5uZWwpOyAqLwogCWN4X2NsZWFyKGNoYW5uZWwtPmRtYV9jdGwsIDB4MTEpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2xvY2ssIGZsYWdzKTsKQEAgLTM5Miw3ICszOTIsNyBAQAogCXUzMiBjb3VudCA9IDA7CiAJaW50IGhhbmRsZWQgPSAwOwogCXUzMiBtYXNrOwotICAgICAgIHN0cnVjdCBzcmFtX2NoYW5uZWwgKmNoYW5uZWwgPSBkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS5zcmFtX2NoYW5uZWxzOworCXN0cnVjdCBzcmFtX2NoYW5uZWwgKmNoYW5uZWwgPSBkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS5zcmFtX2NoYW5uZWxzOwogCiAJbWFzayA9IGN4X3JlYWQoY2hhbm5lbC0+aW50X21zayk7CiAJaWYgKDAgPT0gKHN0YXR1cyAmIG1hc2spKQpAQCAtNDEyLDggKzQxMiw4IEBACiAJaWYgKHN0YXR1cyAmIEZMRF9WSURfRFNUX1JJU0MxKSB7CiAJCXNwaW5fbG9jaygmZGV2LT5zbG9jayk7CiAJCWNvdW50ID0gY3hfcmVhZChjaGFubmVsLT5ncGNudCk7Ci0JICAgICAgIGN4MjU4MjFfdmlkZW9fd2FrZXVwKGRldiwKLQkJICAgICAgICZkZXYtPmNoYW5uZWxzW2NoYW5uZWwtPmldLnZpZHEsIGNvdW50KTsKKwkJY3gyNTgyMV92aWRlb193YWtldXAoZGV2LCAmZGV2LT5jaGFubmVsc1tjaGFubmVsLT5pXS52aWRxLAorCQkJCWNvdW50KTsKIAkJc3Bpbl91bmxvY2soJmRldi0+c2xvY2spOwogCQloYW5kbGVkKys7CiAJfQpAQCAtNDIyLDkgKzQyMiw4IEBACiAJaWYgKHN0YXR1cyAmIDB4MTApIHsKIAkJZHByaW50aygyLCAic3RvcHBlciB2aWRlb1xuIik7CiAJCXNwaW5fbG9jaygmZGV2LT5zbG9jayk7Ci0JICAgICAgIGN4MjU4MjFfcmVzdGFydF92aWRlb19xdWV1ZShkZXYsCi0JCQkgICAgICAgJmRldi0+Y2hhbm5lbHNbY2hhbm5lbC0+aV0udmlkcSwKLQkJCQkgICAgICAgY2hhbm5lbCk7CisJCWN4MjU4MjFfcmVzdGFydF92aWRlb19xdWV1ZShkZXYsCisJCQkJJmRldi0+Y2hhbm5lbHNbY2hhbm5lbC0+aV0udmlkcSwgY2hhbm5lbCk7CiAJCXNwaW5fdW5sb2NrKCZkZXYtPnNsb2NrKTsKIAkJaGFuZGxlZCsrOwogCX0KQEAgLTQ0NywxOCArNDQ2LDE4IEBACiB7CiAJY3hfY2xlYXIoUENJX0lOVF9NU0ssIDEpOwogCi0gICAgICAgaWYgKGRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLnZpZGVvX2RldikgewotCSAgICAgICBpZiAodmlkZW9faXNfcmVnaXN0ZXJlZChkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS52aWRlb19kZXYpKQotCQkgICAgICAgdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoCi0JCQkgICAgICAgZGV2LT5jaGFubmVsc1tjaGFuX251bV0udmlkZW9fZGV2KTsKKwlpZiAoZGV2LT5jaGFubmVsc1tjaGFuX251bV0udmlkZW9fZGV2KSB7CisJCWlmICh2aWRlb19pc19yZWdpc3RlcmVkKGRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLnZpZGVvX2RldikpCisJCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgKKwkJCQkJZGV2LT5jaGFubmVsc1tjaGFuX251bV0udmlkZW9fZGV2KTsKIAkJZWxzZQotCQkgICAgICAgdmlkZW9fZGV2aWNlX3JlbGVhc2UoCi0JCQkgICAgICAgZGV2LT5jaGFubmVsc1tjaGFuX251bV0udmlkZW9fZGV2KTsKKwkJCXZpZGVvX2RldmljZV9yZWxlYXNlKAorCQkJCQlkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS52aWRlb19kZXYpOwogCi0JICAgICAgIGRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLnZpZGVvX2RldiA9IE5VTEw7CisJCWRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLnZpZGVvX2RldiA9IE5VTEw7CiAKLQkgICAgICAgYnRjeF9yaXNjbWVtX2ZyZWUoZGV2LT5wY2ksCi0JCSAgICAgICAmZGV2LT5jaGFubmVsc1tjaGFuX251bV0udmlkcS5zdG9wcGVyKTsKKwkJYnRjeF9yaXNjbWVtX2ZyZWUoZGV2LT5wY2ksCisJCQkJJmRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLnZpZHEuc3RvcHBlcik7CiAKIAkJcHJfd2FybigiZGV2aWNlICVkIHJlbGVhc2VkIVxuIiwgY2hhbl9udW0pOwogCX0KQEAgLTQ2OCw3NCArNDY3LDcyIEBACiBpbnQgY3gyNTgyMV92aWRlb19yZWdpc3RlcihzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldikKIHsKIAlpbnQgZXJyOwotICAgICAgIGludCBpOworCWludCBpOwogCi0gICAgICAgc3RydWN0IHZpZGVvX2RldmljZSBjeDI1ODIxX3ZpZGVvX2RldmljZSA9IHsKLQkgICAgICAgLm5hbWUgPSAiY3gyNTgyMS12aWRlbyIsCi0JICAgICAgIC5mb3BzID0gJnZpZGVvX2ZvcHMsCi0JICAgICAgIC5taW5vciA9IC0xLAotCSAgICAgICAuaW9jdGxfb3BzID0gJnZpZGVvX2lvY3RsX29wcywKLQkgICAgICAgLnR2bm9ybXMgPSBDWDI1ODIxX05PUk1TLAotCSAgICAgICAuY3VycmVudF9ub3JtID0gVjRMMl9TVERfTlRTQ19NLAotICAgICAgIH07CisJc3RydWN0IHZpZGVvX2RldmljZSBjeDI1ODIxX3ZpZGVvX2RldmljZSA9IHsKKwkJLm5hbWUgPSAiY3gyNTgyMS12aWRlbyIsCisJCS5mb3BzID0gJnZpZGVvX2ZvcHMsCisJCS5taW5vciA9IC0xLAorCQkuaW9jdGxfb3BzID0gJnZpZGVvX2lvY3RsX29wcywKKwkJLnR2bm9ybXMgPSBDWDI1ODIxX05PUk1TLAorCQkuY3VycmVudF9ub3JtID0gVjRMMl9TVERfTlRTQ19NLAorCX07CiAKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT5zbG9jayk7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1ZJRF9DSEFOTkVMX05VTSAtIDE7ICsraSkgewotCSAgICAgICBjeDI1ODIxX2luaXRfY29udHJvbHMoZGV2LCBpKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1ZJRF9DSEFOTkVMX05VTSAtIDE7ICsraSkgeworCQljeDI1ODIxX2luaXRfY29udHJvbHMoZGV2LCBpKTsKIAotCSAgICAgICBjeDI1ODIxX3Jpc2Nfc3RvcHBlcihkZXYtPnBjaSwKLQkJCSAgICAgICAmZGV2LT5jaGFubmVsc1tpXS52aWRxLnN0b3BwZXIsCi0JCQkgICAgICAgZGV2LT5jaGFubmVsc1tpXS5zcmFtX2NoYW5uZWxzLT5kbWFfY3RsLAotCQkJICAgICAgIDB4MTEsIDApOworCQljeDI1ODIxX3Jpc2Nfc3RvcHBlcihkZXYtPnBjaSwgJmRldi0+Y2hhbm5lbHNbaV0udmlkcS5zdG9wcGVyLAorCQkJCWRldi0+Y2hhbm5lbHNbaV0uc3JhbV9jaGFubmVscy0+ZG1hX2N0bCwKKwkJCQkweDExLCAwKTsKIAotCSAgICAgICBkZXYtPmNoYW5uZWxzW2ldLnNyYW1fY2hhbm5lbHMgPSAmY3gyNTgyMV9zcmFtX2NoYW5uZWxzW2ldOwotCSAgICAgICBkZXYtPmNoYW5uZWxzW2ldLnZpZGVvX2RldiA9IE5VTEw7Ci0JICAgICAgIGRldi0+Y2hhbm5lbHNbaV0ucmVzb3VyY2VzID0gMDsKKwkJZGV2LT5jaGFubmVsc1tpXS5zcmFtX2NoYW5uZWxzID0gJmN4MjU4MjFfc3JhbV9jaGFubmVsc1tpXTsKKwkJZGV2LT5jaGFubmVsc1tpXS52aWRlb19kZXYgPSBOVUxMOworCQlkZXYtPmNoYW5uZWxzW2ldLnJlc291cmNlcyA9IDA7CiAKLQkgICAgICAgY3hfd3JpdGUoZGV2LT5jaGFubmVsc1tpXS5zcmFtX2NoYW5uZWxzLT5pbnRfc3RhdCwKLQkJCSAgICAgICAweGZmZmZmZmZmKTsKKwkJY3hfd3JpdGUoZGV2LT5jaGFubmVsc1tpXS5zcmFtX2NoYW5uZWxzLT5pbnRfc3RhdCwgMHhmZmZmZmZmZik7CiAKLQkgICAgICAgSU5JVF9MSVNUX0hFQUQoJmRldi0+Y2hhbm5lbHNbaV0udmlkcS5hY3RpdmUpOwotCSAgICAgICBJTklUX0xJU1RfSEVBRCgmZGV2LT5jaGFubmVsc1tpXS52aWRxLnF1ZXVlZCk7CisJCUlOSVRfTElTVF9IRUFEKCZkZXYtPmNoYW5uZWxzW2ldLnZpZHEuYWN0aXZlKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmRldi0+Y2hhbm5lbHNbaV0udmlkcS5xdWV1ZWQpOwogCi0JICAgICAgIGRldi0+Y2hhbm5lbHNbaV0udGltZW91dF9kYXRhLmRldiA9IGRldjsKLQkgICAgICAgZGV2LT5jaGFubmVsc1tpXS50aW1lb3V0X2RhdGEuY2hhbm5lbCA9Ci0JCQkJICAgICAgICZjeDI1ODIxX3NyYW1fY2hhbm5lbHNbaV07Ci0JICAgICAgIGRldi0+Y2hhbm5lbHNbaV0udmlkcS50aW1lb3V0LmZ1bmN0aW9uID0KLQkJCQkgICAgICAgY3gyNTgyMV92aWRfdGltZW91dDsKLQkgICAgICAgZGV2LT5jaGFubmVsc1tpXS52aWRxLnRpbWVvdXQuZGF0YSA9Ci0JCSAgICAgICAodW5zaWduZWQgbG9uZykmZGV2LT5jaGFubmVsc1tpXS50aW1lb3V0X2RhdGE7Ci0JICAgICAgIGluaXRfdGltZXIoJmRldi0+Y2hhbm5lbHNbaV0udmlkcS50aW1lb3V0KTsKKwkJZGV2LT5jaGFubmVsc1tpXS50aW1lb3V0X2RhdGEuZGV2ID0gZGV2OworCQlkZXYtPmNoYW5uZWxzW2ldLnRpbWVvdXRfZGF0YS5jaGFubmVsID0KKwkJCSZjeDI1ODIxX3NyYW1fY2hhbm5lbHNbaV07CisJCWRldi0+Y2hhbm5lbHNbaV0udmlkcS50aW1lb3V0LmZ1bmN0aW9uID0KKwkJCWN4MjU4MjFfdmlkX3RpbWVvdXQ7CisJCWRldi0+Y2hhbm5lbHNbaV0udmlkcS50aW1lb3V0LmRhdGEgPQorCQkJKHVuc2lnbmVkIGxvbmcpJmRldi0+Y2hhbm5lbHNbaV0udGltZW91dF9kYXRhOworCQlpbml0X3RpbWVyKCZkZXYtPmNoYW5uZWxzW2ldLnZpZHEudGltZW91dCk7CiAKLQkgICAgICAgLyogcmVnaXN0ZXIgdjRsIGRldmljZXMgKi8KLQkgICAgICAgZGV2LT5jaGFubmVsc1tpXS52aWRlb19kZXYgPSBjeDI1ODIxX3ZkZXZfaW5pdChkZXYsCi0JCSAgICAgICBkZXYtPnBjaSwgJmN4MjU4MjFfdmlkZW9fZGV2aWNlLCAidmlkZW8iKTsKKwkJLyogcmVnaXN0ZXIgdjRsIGRldmljZXMgKi8KKwkJZGV2LT5jaGFubmVsc1tpXS52aWRlb19kZXYgPSBjeDI1ODIxX3ZkZXZfaW5pdChkZXYsCisJCQkJZGV2LT5wY2ksICZjeDI1ODIxX3ZpZGVvX2RldmljZSwgInZpZGVvIik7CiAKLQkgICAgICAgZXJyID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKGRldi0+Y2hhbm5lbHNbaV0udmlkZW9fZGV2LAotCQkJICAgICAgIFZGTF9UWVBFX0dSQUJCRVIsIHZpZGVvX25yW2Rldi0+bnJdKTsKKwkJZXJyID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKGRldi0+Y2hhbm5lbHNbaV0udmlkZW9fZGV2LAorCQkJCVZGTF9UWVBFX0dSQUJCRVIsIHZpZGVvX25yW2Rldi0+bnJdKTsKIAotCSAgICAgICBpZiAoZXJyIDwgMCkKLQkJICAgICAgIGdvdG8gZmFpbF91bnJlZzsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGZhaWxfdW5yZWc7CiAKIAl9CiAKLSAgICAvKiBzZXQgUENJIGludGVycnVwdCAqLworCS8qIHNldCBQQ0kgaW50ZXJydXB0ICovCiAJY3hfc2V0KFBDSV9JTlRfTVNLLCAweGZmKTsKIAogCS8qIGluaXRpYWwgZGV2aWNlIGNvbmZpZ3VyYXRpb24gKi8KIAltdXRleF9sb2NrKCZkZXYtPmxvY2spOwogI2lmZGVmIFRVTkVSX0ZMQUcKLSAgICAgICBkZXYtPnR2bm9ybSA9IGN4MjU4MjFfdmlkZW9fZGV2aWNlLmN1cnJlbnRfbm9ybTsKKwlkZXYtPnR2bm9ybSA9IGN4MjU4MjFfdmlkZW9fZGV2aWNlLmN1cnJlbnRfbm9ybTsKIAljeDI1ODIxX3NldF90dm5vcm0oZGV2LCBkZXYtPnR2bm9ybSk7CiAjZW5kaWYKIAltdXRleF91bmxvY2soJmRldi0+bG9jayk7CiAKIAotICAgIHJldHVybiAwOworCXJldHVybiAwOwogCiBmYWlsX3VucmVnOgotICAgICAgIGN4MjU4MjFfdmlkZW9fdW5yZWdpc3RlcihkZXYsIGkpOworCWN4MjU4MjFfdmlkZW9fdW5yZWdpc3RlcihkZXYsIGkpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTU2Niw3ICs1NjMsNyBAQAogCXUzMiBsaW5lMF9vZmZzZXQsIGxpbmUxX29mZnNldDsKIAlzdHJ1Y3QgdmlkZW9idWZfZG1hYnVmICpkbWEgPSB2aWRlb2J1Zl90b19kbWEoJmJ1Zi0+dmIpOwogCWludCBicGxfbG9jYWwgPSBMSU5FX1NJWkVfRDE7Ci0gICAgICAgaW50IGNoYW5uZWxfb3BlbmVkID0gZmgtPmNoYW5uZWxfaWQ7CisJaW50IGNoYW5uZWxfb3BlbmVkID0gZmgtPmNoYW5uZWxfaWQ7CiAKIAlCVUdfT04oTlVMTCA9PSBmaC0+Zm10KTsKIAlpZiAoZmgtPndpZHRoIDwgNDggfHwgZmgtPndpZHRoID4gNzIwIHx8CkBAIC02MDIsMjQgKzU5OSwyNCBAQAogCWlmIChpbml0X2J1ZmZlcikgewogCiAJCWNoYW5uZWxfb3BlbmVkID0gZGV2LT5jaGFubmVsX29wZW5lZDsKLQkJY2hhbm5lbF9vcGVuZWQgPSAoY2hhbm5lbF9vcGVuZWQgPCAwCi0JCQkJICB8fCBjaGFubmVsX29wZW5lZCA+IDcpID8gNyA6IGNoYW5uZWxfb3BlbmVkOworCQlpZiAoY2hhbm5lbF9vcGVuZWQgPCAwIHx8IGNoYW5uZWxfb3BlbmVkID4gNykKKwkJCWNoYW5uZWxfb3BlbmVkID0gNzsKIAotCSAgICAgICBpZiAoZGV2LT5jaGFubmVsc1tjaGFubmVsX29wZW5lZF0KLQkJICAgICAgIC5waXhlbF9mb3JtYXRzID09IFBJWEVMX0ZSTVRfNDExKQorCQlpZiAoZGV2LT5jaGFubmVsc1tjaGFubmVsX29wZW5lZF0ucGl4ZWxfZm9ybWF0cyA9PQorCQkJCVBJWEVMX0ZSTVRfNDExKQogCQkJYnVmLT5icGwgPSAoYnVmLT5mbXQtPmRlcHRoICogYnVmLT52Yi53aWR0aCkgPj4gMzsKIAkJZWxzZQogCQkJYnVmLT5icGwgPSAoYnVmLT5mbXQtPmRlcHRoID4+IDMpICogKGJ1Zi0+dmIud2lkdGgpOwogCi0JICAgICAgIGlmIChkZXYtPmNoYW5uZWxzW2NoYW5uZWxfb3BlbmVkXQotCQkgICAgICAgLnBpeGVsX2Zvcm1hdHMgPT0gUElYRUxfRlJNVF80MTEpIHsKKwkJaWYgKGRldi0+Y2hhbm5lbHNbY2hhbm5lbF9vcGVuZWRdLnBpeGVsX2Zvcm1hdHMgPT0KKwkJCQlQSVhFTF9GUk1UXzQxMSkgewogCQkJYnBsX2xvY2FsID0gYnVmLT5icGw7CiAJCX0gZWxzZSB7Ci0JCSAgICAgICBicGxfbG9jYWwgPSBidWYtPmJwbDsgICAvKiBEZWZhdWx0ICovCisJCQlicGxfbG9jYWwgPSBidWYtPmJwbDsgICAvKiBEZWZhdWx0ICovCiAKIAkJCWlmIChjaGFubmVsX29wZW5lZCA+PSAwICYmIGNoYW5uZWxfb3BlbmVkIDw9IDcpIHsKLQkJCSAgICAgICBpZiAoZGV2LT5jaGFubmVsc1tjaGFubmVsX29wZW5lZF0KLQkJCQkJICAgICAgIC51c2VfY2lmX3Jlc29sdXRpb24pIHsKKwkJCQlpZiAoZGV2LT5jaGFubmVsc1tjaGFubmVsX29wZW5lZF0KKwkJCQkJCS51c2VfY2lmX3Jlc29sdXRpb24pIHsKIAkJCQkJaWYgKGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0JHCiAJCQkJCSAgICB8fCBkZXYtPnR2bm9ybSAmIFY0TDJfU1REX1BBTF9ESykKIAkJCQkJCWJwbF9sb2NhbCA9IDM1MiA8PCAxOwpAQCAtNjc5LDEyICs2NzYsMTMgQEAKIAogCXJldHVybiAwOwogCi0gICAgICBmYWlsOgorZmFpbDoKIAljeDI1ODIxX2ZyZWVfYnVmZmVyKHEsIGJ1Zik7CiAJcmV0dXJuIHJjOwogfQogCi12b2lkIGN4MjU4MjFfYnVmZmVyX3JlbGVhc2Uoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKK3ZvaWQgY3gyNTgyMV9idWZmZXJfcmVsZWFzZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsCisJCQkgICAgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCiB7CiAJc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWYgPQogCSAgICBjb250YWluZXJfb2YodmIsIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIpOwpAQCAtNzI0LDM4NSArNzIyLDM4MSBAQAogCiBzdGF0aWMgdm9pZCBidWZmZXJfcXVldWUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICp2cSwgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCiB7Ci0gICAgICAgc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWYgPQorCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmID0KIAkgICBjb250YWluZXJfb2YodmIsIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIpOwotICAgICAgIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqcHJldjsKLSAgICAgICBzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSB2cS0+cHJpdl9kYXRhOwotICAgICAgIHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLSAgICAgICBzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSAqcSA9ICZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS52aWRxOworCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqcHJldjsKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSB2cS0+cHJpdl9kYXRhOworCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKKwlzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSAqcSA9ICZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS52aWRxOwogCi0gICAgICAgLyogYWRkIGp1bXAgdG8gc3RvcHBlciAqLwotICAgICAgIGJ1Zi0+cmlzYy5qbXBbMF0gPSBjcHVfdG9fbGUzMihSSVNDX0pVTVAgfCBSSVNDX0lSUTEgfCBSSVNDX0NOVF9JTkMpOwotICAgICAgIGJ1Zi0+cmlzYy5qbXBbMV0gPSBjcHVfdG9fbGUzMihxLT5zdG9wcGVyLmRtYSk7Ci0gICAgICAgYnVmLT5yaXNjLmptcFsyXSA9IGNwdV90b19sZTMyKDApOyAgICAgIC8qIGJpdHMgNjMtMzIgKi8KKwkvKiBhZGQganVtcCB0byBzdG9wcGVyICovCisJYnVmLT5yaXNjLmptcFswXSA9IGNwdV90b19sZTMyKFJJU0NfSlVNUCB8IFJJU0NfSVJRMSB8IFJJU0NfQ05UX0lOQyk7CisJYnVmLT5yaXNjLmptcFsxXSA9IGNwdV90b19sZTMyKHEtPnN0b3BwZXIuZG1hKTsKKwlidWYtPnJpc2Muam1wWzJdID0gY3B1X3RvX2xlMzIoMCk7ICAgICAgLyogYml0cyA2My0zMiAqLwogCi0gICAgICAgZHByaW50aygyLCAiam1wIHRvIHN0b3BwZXIgKDB4JXgpXG4iLCBidWYtPnJpc2Muam1wWzFdKTsKKwlkcHJpbnRrKDIsICJqbXAgdG8gc3RvcHBlciAoMHgleClcbiIsIGJ1Zi0+cmlzYy5qbXBbMV0pOwogCi0gICAgICAgaWYgKCFsaXN0X2VtcHR5KCZxLT5xdWV1ZWQpKSB7Ci0JICAgICAgIGxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5xdWV1ZWQpOwotCSAgICAgICBidWYtPnZiLnN0YXRlID0gVklERU9CVUZfUVVFVUVEOwotCSAgICAgICBkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBxdWV1ZWRcbiIsIGJ1ZiwKLQkJICAgICAgIGJ1Zi0+dmIuaSk7CisJaWYgKCFsaXN0X2VtcHR5KCZxLT5xdWV1ZWQpKSB7CisJCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5xdWV1ZWQpOworCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfUVVFVUVEOworCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGFwcGVuZCB0byBxdWV1ZWRcbiIsIGJ1ZiwKKwkJCQlidWYtPnZiLmkpOwogCi0gICAgICAgfSBlbHNlIGlmIChsaXN0X2VtcHR5KCZxLT5hY3RpdmUpKSB7Ci0JICAgICAgIGxpc3RfYWRkX3RhaWwoJmJ1Zi0+dmIucXVldWUsICZxLT5hY3RpdmUpOwotCSAgICAgICBjeDI1ODIxX3N0YXJ0X3ZpZGVvX2RtYShkZXYsIHEsIGJ1ZiwKLQkJCQkgICAgICAgZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0uCi0JCQkJICAgICAgIHNyYW1fY2hhbm5lbHMpOwotCSAgICAgICBidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOwotCSAgICAgICBidWYtPmNvdW50ID0gcS0+Y291bnQrKzsKLQkgICAgICAgbW9kX3RpbWVyKCZxLT50aW1lb3V0LCBqaWZmaWVzICsgQlVGRkVSX1RJTUVPVVQpOwotCSAgICAgICBkcHJpbnRrKDIsCi0JCSAgICAgICAiWyVwLyVkXSBidWZmZXJfcXVldWUgLSBmaXJzdCBhY3RpdmUsIGJ1ZiBjbnQgPSAlZCwgXAotCQkgICAgICAgcS0+Y291bnQgPSAlZFxuIiwKLQkJICAgICAgIGJ1ZiwgYnVmLT52Yi5pLCBidWYtPmNvdW50LCBxLT5jb3VudCk7Ci0gICAgICAgfSBlbHNlIHsKLQkgICAgICAgcHJldiA9Ci0JCSAgIGxpc3RfZW50cnkocS0+YWN0aXZlLnByZXYsIHN0cnVjdCBjeDI1ODIxX2J1ZmZlciwgdmIucXVldWUpOwotCSAgICAgICBpZiAocHJldi0+dmIud2lkdGggPT0gYnVmLT52Yi53aWR0aAorCX0gZWxzZSBpZiAobGlzdF9lbXB0eSgmcS0+YWN0aXZlKSkgeworCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+YWN0aXZlKTsKKwkJY3gyNTgyMV9zdGFydF92aWRlb19kbWEoZGV2LCBxLCBidWYsCisJCQkJZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0uc3JhbV9jaGFubmVscyk7CisJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9BQ1RJVkU7CisJCWJ1Zi0+Y291bnQgPSBxLT5jb3VudCsrOworCQltb2RfdGltZXIoJnEtPnRpbWVvdXQsIGppZmZpZXMgKyBCVUZGRVJfVElNRU9VVCk7CisJCWRwcmludGsoMiwgIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gZmlyc3QgYWN0aXZlLCBidWYgY250ID0gJWQsIHEtPmNvdW50ID0gJWRcbiIsCisJCQkJYnVmLCBidWYtPnZiLmksIGJ1Zi0+Y291bnQsIHEtPmNvdW50KTsKKwl9IGVsc2UgeworCQlwcmV2ID0gbGlzdF9lbnRyeShxLT5hY3RpdmUucHJldiwgc3RydWN0IGN4MjU4MjFfYnVmZmVyLAorCQkJCXZiLnF1ZXVlKTsKKwkJaWYgKHByZXYtPnZiLndpZHRoID09IGJ1Zi0+dmIud2lkdGgKIAkJICAgJiYgcHJldi0+dmIuaGVpZ2h0ID09IGJ1Zi0+dmIuaGVpZ2h0CiAJCSAgICYmIHByZXYtPmZtdCA9PSBidWYtPmZtdCkgewotCQkgICAgICAgbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPmFjdGl2ZSk7Ci0JCSAgICAgICBidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOwotCQkgICAgICAgYnVmLT5jb3VudCA9IHEtPmNvdW50Kys7Ci0JCSAgICAgICBwcmV2LT5yaXNjLmptcFsxXSA9IGNwdV90b19sZTMyKGJ1Zi0+cmlzYy5kbWEpOworCQkJbGlzdF9hZGRfdGFpbCgmYnVmLT52Yi5xdWV1ZSwgJnEtPmFjdGl2ZSk7CisJCQlidWYtPnZiLnN0YXRlID0gVklERU9CVUZfQUNUSVZFOworCQkJYnVmLT5jb3VudCA9IHEtPmNvdW50Kys7CisJCQlwcmV2LT5yaXNjLmptcFsxXSA9IGNwdV90b19sZTMyKGJ1Zi0+cmlzYy5kbWEpOwogCi0JCSAgICAgICAvKiA2NCBiaXQgYml0cyA2My0zMiAqLwotCQkgICAgICAgcHJldi0+cmlzYy5qbXBbMl0gPSBjcHVfdG9fbGUzMigwKTsKLQkJICAgICAgIGRwcmludGsoMiwKLQkJCSAgICAgICAiWyVwLyVkXSBidWZmZXJfcXVldWUgLSBhcHBlbmQgdG8gYWN0aXZlLCBcCi0JCQkgICAgICAgYnVmLT5jb3VudD0lZFxuIiwKLQkJCSAgICAgICBidWYsIGJ1Zi0+dmIuaSwgYnVmLT5jb3VudCk7CisJCQkvKiA2NCBiaXQgYml0cyA2My0zMiAqLworCQkJcHJldi0+cmlzYy5qbXBbMl0gPSBjcHVfdG9fbGUzMigwKTsKKwkJCWRwcmludGsoMiwgIlslcC8lZF0gYnVmZmVyX3F1ZXVlIC0gYXBwZW5kIHRvIGFjdGl2ZSwgYnVmLT5jb3VudD0lZFxuIiwKKwkJCQkJYnVmLCBidWYtPnZiLmksIGJ1Zi0+Y291bnQpOwogCi0JICAgICAgIH0gZWxzZSB7Ci0JCSAgICAgICBsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+cXVldWVkKTsKLQkJICAgICAgIGJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7Ci0JCSAgICAgICBkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGZpcnN0IHF1ZXVlZFxuIiwgYnVmLAotCQkJICAgICAgIGJ1Zi0+dmIuaSk7Ci0JICAgICAgIH0KLSAgICAgICB9CisJCX0gZWxzZSB7CisJCQlsaXN0X2FkZF90YWlsKCZidWYtPnZiLnF1ZXVlLCAmcS0+cXVldWVkKTsKKwkJCWJ1Zi0+dmIuc3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7CisJCQlkcHJpbnRrKDIsICJbJXAvJWRdIGJ1ZmZlcl9xdWV1ZSAtIGZpcnN0IHF1ZXVlZFxuIiwgYnVmLAorCQkJCQlidWYtPnZiLmkpOworCQl9CisJfQogCi0gICAgICAgaWYgKGxpc3RfZW1wdHkoJnEtPmFjdGl2ZSkpCi0JICAgICAgIGRwcmludGsoMiwgImFjdGl2ZSBxdWV1ZSBlbXB0eSFcbiIpOworCWlmIChsaXN0X2VtcHR5KCZxLT5hY3RpdmUpKQorCQlkcHJpbnRrKDIsICJhY3RpdmUgcXVldWUgZW1wdHkhXG4iKTsKIH0KIAogc3RhdGljIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgY3gyNTgyMV92aWRlb19xb3BzID0gewotICAgICAgIC5idWZfc2V0dXAgPSBjeDI1ODIxX2J1ZmZlcl9zZXR1cCwKLSAgICAgICAuYnVmX3ByZXBhcmUgPSBjeDI1ODIxX2J1ZmZlcl9wcmVwYXJlLAotICAgICAgIC5idWZfcXVldWUgPSBidWZmZXJfcXVldWUsCi0gICAgICAgLmJ1Zl9yZWxlYXNlID0gY3gyNTgyMV9idWZmZXJfcmVsZWFzZSwKKwkuYnVmX3NldHVwID0gY3gyNTgyMV9idWZmZXJfc2V0dXAsCisJLmJ1Zl9wcmVwYXJlID0gY3gyNTgyMV9idWZmZXJfcHJlcGFyZSwKKwkuYnVmX3F1ZXVlID0gYnVmZmVyX3F1ZXVlLAorCS5idWZfcmVsZWFzZSA9IGN4MjU4MjFfYnVmZmVyX3JlbGVhc2UsCiB9OwogCiBzdGF0aWMgaW50IHZpZGVvX29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0gICAgICAgc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmRhdGEoZmlsZSk7Ci0gICAgICAgc3RydWN0IGN4MjU4MjFfZGV2ICpoLCAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKLSAgICAgICBzdHJ1Y3QgY3gyNTgyMV9maCAqZmg7Ci0gICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKLSAgICAgICBpbnQgbWlub3IgPSB2aWRlb19kZXZkYXRhKGZpbGUpLT5taW5vcjsKLSAgICAgICBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLSAgICAgICB1MzIgcGl4X2Zvcm1hdDsKLSAgICAgICBpbnQgY2hfaWQgPSAwOwotICAgICAgIGludCBpOworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBjeDI1ODIxX2RldiAqaCwgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IGN4MjU4MjFfZmggKmZoOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJaW50IG1pbm9yID0gdmlkZW9fZGV2ZGF0YShmaWxlKS0+bWlub3I7CisJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJdTMyIHBpeF9mb3JtYXQ7CisJaW50IGNoX2lkID0gMDsKKwlpbnQgaTsKIAotICAgICAgIGRwcmludGsoMSwgIm9wZW4gZGV2PSVzIHR5cGU9JXNcbiIsCi0JCSAgICAgICB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKHZkZXYpLAotCQkgICAgICAgdjRsMl90eXBlX25hbWVzW3R5cGVdKTsKKwlkcHJpbnRrKDEsICJvcGVuIGRldj0lcyB0eXBlPSVzXG4iLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKHZkZXYpLAorCQkJdjRsMl90eXBlX25hbWVzW3R5cGVdKTsKIAotICAgICAgIC8qIGFsbG9jYXRlICsgaW5pdGlhbGl6ZSBwZXIgZmlsZWhhbmRsZSBkYXRhICovCi0gICAgICAgZmggPSBremFsbG9jKHNpemVvZigqZmgpLCBHRlBfS0VSTkVMKTsKLSAgICAgICBpZiAoTlVMTCA9PSBmaCkKLQkgICAgICAgcmV0dXJuIC1FTk9NRU07CisJLyogYWxsb2NhdGUgKyBpbml0aWFsaXplIHBlciBmaWxlaGFuZGxlIGRhdGEgKi8KKwlmaCA9IGt6YWxsb2Moc2l6ZW9mKCpmaCksIEdGUF9LRVJORUwpOworCWlmIChOVUxMID09IGZoKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCW11dGV4X2xvY2soJmN4MjU4MjFfZGV2bGlzdF9tdXRleCk7CiAKLSAgICAgICBsaXN0X2Zvcl9lYWNoKGxpc3QsICZjeDI1ODIxX2Rldmxpc3QpCi0gICAgICAgewotCSAgICAgICBoID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgY3gyNTgyMV9kZXYsIGRldmxpc3QpOworCWxpc3RfZm9yX2VhY2gobGlzdCwgJmN4MjU4MjFfZGV2bGlzdCkKKwl7CisJCWggPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjeDI1ODIxX2RldiwgZGV2bGlzdCk7CiAKLQkgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9WSURfQ0hBTk5FTF9OVU07IGkrKykgewotCQkgICAgICAgaWYgKGgtPmNoYW5uZWxzW2ldLnZpZGVvX2RldiAmJgorCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1ZJRF9DSEFOTkVMX05VTTsgaSsrKSB7CisJCQlpZiAoaC0+Y2hhbm5lbHNbaV0udmlkZW9fZGV2ICYmCiAJCQkgICBoLT5jaGFubmVsc1tpXS52aWRlb19kZXYtPm1pbm9yID09IG1pbm9yKSB7Ci0JCQkgICAgICAgZGV2ID0gaDsKLQkJCSAgICAgICBjaF9pZCA9IGk7Ci0JCQkgICAgICAgdHlwZSAgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0JCSAgICAgICB9Ci0JICAgICAgIH0KLSAgICAgICB9CisJCQkJZGV2ID0gaDsKKwkJCQljaF9pZCA9IGk7CisJCQkJdHlwZSAgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJCQl9CisJCX0KKwl9CiAKLSAgICAgICBpZiAoTlVMTCA9PSBkZXYpIHsKKwlpZiAoTlVMTCA9PSBkZXYpIHsKIAkJbXV0ZXhfdW5sb2NrKCZjeDI1ODIxX2Rldmxpc3RfbXV0ZXgpOwogCQlrZnJlZShmaCk7CiAJCXJldHVybiAtRU5PREVWOwotICAgICAgIH0KKwl9CiAKLSAgICAgICBmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKLSAgICAgICBmaC0+ZGV2ID0gZGV2OwotICAgICAgIGZoLT50eXBlID0gdHlwZTsKLSAgICAgICBmaC0+d2lkdGggPSA3MjA7Ci0gICAgZmgtPmNoYW5uZWxfaWQgPSBjaF9pZDsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBmaDsKKwlmaC0+ZGV2ID0gZGV2OworCWZoLT50eXBlID0gdHlwZTsKKwlmaC0+d2lkdGggPSA3MjA7CisJZmgtPmNoYW5uZWxfaWQgPSBjaF9pZDsKIAotICAgICAgIGlmIChkZXYtPnR2bm9ybSAmIFY0TDJfU1REX1BBTF9CRyB8fCBkZXYtPnR2bm9ybSAmIFY0TDJfU1REX1BBTF9ESykKLQkgICAgICAgZmgtPmhlaWdodCA9IDU3NjsKLSAgICAgICBlbHNlCi0JICAgICAgIGZoLT5oZWlnaHQgPSA0ODA7CisJaWYgKGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0JHIHx8IGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0RLKQorCQlmaC0+aGVpZ2h0ID0gNTc2OworCWVsc2UKKwkJZmgtPmhlaWdodCA9IDQ4MDsKIAotICAgICAgIGRldi0+Y2hhbm5lbF9vcGVuZWQgPSBmaC0+Y2hhbm5lbF9pZDsKLSAgICAgICBwaXhfZm9ybWF0ID0KLQkgICAoZGV2LT5jaGFubmVsc1tjaF9pZF0ucGl4ZWxfZm9ybWF0cyA9PQotCSAgICBQSVhFTF9GUk1UXzQxMSkgPyBWNEwyX1BJWF9GTVRfWTQxUCA6IFY0TDJfUElYX0ZNVF9ZVVlWOwotICAgICAgIGZoLT5mbXQgPSBjeDI1ODIxX2Zvcm1hdF9ieV9mb3VyY2MocGl4X2Zvcm1hdCk7CisJZGV2LT5jaGFubmVsX29wZW5lZCA9IGZoLT5jaGFubmVsX2lkOworCWlmIChkZXYtPmNoYW5uZWxzW2NoX2lkXS5waXhlbF9mb3JtYXRzID09IFBJWEVMX0ZSTVRfNDExKQorCQlwaXhfZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1k0MVA7CisJZWxzZQorCQlwaXhfZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1lVWVY7CisJZmgtPmZtdCA9IGN4MjU4MjFfZm9ybWF0X2J5X2ZvdXJjYyhwaXhfZm9ybWF0KTsKIAotICAgICAgIHY0bDJfcHJpb19vcGVuKCZkZXYtPmNoYW5uZWxzW2NoX2lkXS5wcmlvLCAmZmgtPnByaW8pOworCXY0bDJfcHJpb19vcGVuKCZkZXYtPmNoYW5uZWxzW2NoX2lkXS5wcmlvLCAmZmgtPnByaW8pOwogCi0gICAgICAgdmlkZW9idWZfcXVldWVfc2dfaW5pdCgmZmgtPnZpZHEsICZjeDI1ODIxX3ZpZGVvX3FvcHMsCisJdmlkZW9idWZfcXVldWVfc2dfaW5pdCgmZmgtPnZpZHEsICZjeDI1ODIxX3ZpZGVvX3FvcHMsCiAJCQkgICAgICAmZGV2LT5wY2ktPmRldiwgJmRldi0+c2xvY2ssCiAJCQkgICAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCiAJCQkgICAgICBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQsCiAJCQkgICAgICBzaXplb2Yoc3RydWN0IGN4MjU4MjFfYnVmZmVyKSwgZmgsIE5VTEwpOwogCi0gICAgICAgZHByaW50aygxLCAicG9zdCB2aWRlb2J1Zl9xdWV1ZV9pbml0KClcbiIpOworCWRwcmludGsoMSwgInBvc3QgdmlkZW9idWZfcXVldWVfaW5pdCgpXG4iKTsKIAltdXRleF91bmxvY2soJmN4MjU4MjFfZGV2bGlzdF9tdXRleCk7CiAKLSAgICAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3QgdmlkZW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKiBkYXRhLCBzaXplX3QgY291bnQsCiAJCQkgbG9mZl90ICpwcG9zKQogewotICAgICAgIHN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAKLSAgICAgICBzd2l0Y2ggKGZoLT50eXBlKSB7Ci0gICAgICAgY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU6Ci0JICAgICAgIGlmIChjeDI1ODIxX3Jlc19sb2NrZWQoZmgsIFJFU09VUkNFX1ZJREVPMCkpCi0JCSAgICAgICByZXR1cm4gLUVCVVNZOworCXN3aXRjaCAoZmgtPnR5cGUpIHsKKwljYXNlIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRToKKwkJaWYgKGN4MjU4MjFfcmVzX2xvY2tlZChmaCwgUkVTT1VSQ0VfVklERU8wKSkKKwkJCXJldHVybiAtRUJVU1k7CiAKLQkgICAgICAgcmV0dXJuIHZpZGVvYnVmX3JlYWRfb25lKCZmaC0+dmlkcSwgZGF0YSwgY291bnQsIHBwb3MsCisJCXJldHVybiB2aWRlb2J1Zl9yZWFkX29uZSgmZmgtPnZpZHEsIGRhdGEsIGNvdW50LCBwcG9zLAogCQkJCQlmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CiAKLSAgICAgICBkZWZhdWx0OgotCSAgICAgICBCVUcoKTsKLQkgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgfQorCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm4gMDsKKwl9CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdmlkZW9fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCSAgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKIHsKLSAgICAgICBzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0gICAgICAgc3RydWN0IGN4MjU4MjFfYnVmZmVyICpidWY7CisJc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjeDI1ODIxX2J1ZmZlciAqYnVmOwogCi0gICAgICAgaWYgKGN4MjU4MjFfcmVzX2NoZWNrKGZoLCBSRVNPVVJDRV9WSURFTzApKSB7Ci0JICAgICAgIC8qIHN0cmVhbWluZyBjYXB0dXJlICovCi0JICAgICAgIGlmIChsaXN0X2VtcHR5KCZmaC0+dmlkcS5zdHJlYW0pKQotCQkgICAgICAgcmV0dXJuIFBPTExFUlI7Ci0JICAgICAgIGJ1ZiA9IGxpc3RfZW50cnkoZmgtPnZpZHEuc3RyZWFtLm5leHQsCisJaWYgKGN4MjU4MjFfcmVzX2NoZWNrKGZoLCBSRVNPVVJDRV9WSURFTzApKSB7CisJCS8qIHN0cmVhbWluZyBjYXB0dXJlICovCisJCWlmIChsaXN0X2VtcHR5KCZmaC0+dmlkcS5zdHJlYW0pKQorCQkJcmV0dXJuIFBPTExFUlI7CisJCWJ1ZiA9IGxpc3RfZW50cnkoZmgtPnZpZHEuc3RyZWFtLm5leHQsCiAJCQkJc3RydWN0IGN4MjU4MjFfYnVmZmVyLCB2Yi5zdHJlYW0pOwotICAgICAgIH0gZWxzZSB7Ci0JICAgICAgIC8qIHJlYWQoKSBjYXB0dXJlICovCi0JICAgICAgIGJ1ZiA9IChzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKilmaC0+dmlkcS5yZWFkX2J1ZjsKLQkgICAgICAgaWYgKE5VTEwgPT0gYnVmKQotCQkgICAgICAgcmV0dXJuIFBPTExFUlI7Ci0gICAgICAgfQorCX0gZWxzZSB7CisJCS8qIHJlYWQoKSBjYXB0dXJlICovCisJCWJ1ZiA9IChzdHJ1Y3QgY3gyNTgyMV9idWZmZXIgKilmaC0+dmlkcS5yZWFkX2J1ZjsKKwkJaWYgKE5VTEwgPT0gYnVmKQorCQkJcmV0dXJuIFBPTExFUlI7CisJfQogCi0gICAgICAgcG9sbF93YWl0KGZpbGUsICZidWYtPnZiLmRvbmUsIHdhaXQpOwotICAgICAgIGlmIChidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0RPTkUgfHwgYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9FUlJPUikgewotCSAgICAgICBpZiAoYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9ET05FKSB7Ci0JCSAgICAgICBzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7CisJcG9sbF93YWl0KGZpbGUsICZidWYtPnZiLmRvbmUsIHdhaXQpOworCWlmIChidWYtPnZiLnN0YXRlID09IFZJREVPQlVGX0RPTkUgfHwgYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9FUlJPUikgeworCQlpZiAoYnVmLT52Yi5zdGF0ZSA9PSBWSURFT0JVRl9ET05FKSB7CisJCQlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7CiAKLQkJICAgICAgIGlmIChkZXYgJiYgZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0KLQkJCQkJICAgICAgIC51c2VfY2lmX3Jlc29sdXRpb24pIHsKLQkJCSAgICAgICB1OCBjYW1faWQgPSAqKChjaGFyICopYnVmLT52Yi5iYWRkciArIDMpOwotCQkJICAgICAgIG1lbWNweSgoY2hhciAqKWJ1Zi0+dmIuYmFkZHIsCisJCQlpZiAoZGV2ICYmIGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdCisJCQkJCS51c2VfY2lmX3Jlc29sdXRpb24pIHsKKwkJCQl1OCBjYW1faWQgPSAqKChjaGFyICopYnVmLT52Yi5iYWRkciArIDMpOworCQkJCW1lbWNweSgoY2hhciAqKWJ1Zi0+dmIuYmFkZHIsCiAJCQkJICAgICAgKGNoYXIgKilidWYtPnZiLmJhZGRyICsgKGZoLT53aWR0aCAqIDIpLAogCQkJCSAgICAgIChmaC0+d2lkdGggKiAyKSk7Ci0JCQkgICAgICAgKigoY2hhciAqKWJ1Zi0+dmIuYmFkZHIgKyAzKSA9IGNhbV9pZDsKLQkJICAgICAgIH0KLQkgICAgICAgfQorCQkJCSooKGNoYXIgKilidWYtPnZiLmJhZGRyICsgMykgPSBjYW1faWQ7CisJCQl9CisJCX0KIAotCSAgICAgICByZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKLSAgICAgICB9CisJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworCX0KIAotICAgICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHZpZGVvX3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0gICAgICAgc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotICAgICAgIHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwogCi0gICAgICAgLyogc3RvcCB0aGUgcmlzYyBlbmdpbmUgYW5kIGZpZm8gKi8KLSAgICAgICBjeF93cml0ZShjaGFubmVsMC0+ZG1hX2N0bCwgMCk7IC8qIEZJRk8gYW5kIFJJU0MgZGlzYWJsZSAqLworCS8qIHN0b3AgdGhlIHJpc2MgZW5naW5lIGFuZCBmaWZvICovCisJY3hfd3JpdGUoY2hhbm5lbDAtPmRtYV9jdGwsIDApOyAvKiBGSUZPIGFuZCBSSVNDIGRpc2FibGUgKi8KIAotICAgICAgIC8qIHN0b3AgdmlkZW8gY2FwdHVyZSAqLwotICAgICAgIGlmIChjeDI1ODIxX3Jlc19jaGVjayhmaCwgUkVTT1VSQ0VfVklERU8wKSkgewotCSAgICAgICB2aWRlb2J1Zl9xdWV1ZV9jYW5jZWwoJmZoLT52aWRxKTsKLQkgICAgICAgY3gyNTgyMV9yZXNfZnJlZShkZXYsIGZoLCBSRVNPVVJDRV9WSURFTzApOwotICAgICAgIH0KKwkvKiBzdG9wIHZpZGVvIGNhcHR1cmUgKi8KKwlpZiAoY3gyNTgyMV9yZXNfY2hlY2soZmgsIFJFU09VUkNFX1ZJREVPMCkpIHsKKwkJdmlkZW9idWZfcXVldWVfY2FuY2VsKCZmaC0+dmlkcSk7CisJCWN4MjU4MjFfcmVzX2ZyZWUoZGV2LCBmaCwgUkVTT1VSQ0VfVklERU8wKTsKKwl9CiAKLSAgICAgICBpZiAoZmgtPnZpZHEucmVhZF9idWYpIHsKLQkgICAgICAgY3gyNTgyMV9idWZmZXJfcmVsZWFzZSgmZmgtPnZpZHEsIGZoLT52aWRxLnJlYWRfYnVmKTsKLQkgICAgICAga2ZyZWUoZmgtPnZpZHEucmVhZF9idWYpOwotICAgICAgIH0KKwlpZiAoZmgtPnZpZHEucmVhZF9idWYpIHsKKwkJY3gyNTgyMV9idWZmZXJfcmVsZWFzZSgmZmgtPnZpZHEsIGZoLT52aWRxLnJlYWRfYnVmKTsKKwkJa2ZyZWUoZmgtPnZpZHEucmVhZF9idWYpOworCX0KIAotICAgICAgIHZpZGVvYnVmX21tYXBfZnJlZSgmZmgtPnZpZHEpOworCXZpZGVvYnVmX21tYXBfZnJlZSgmZmgtPnZpZHEpOwogCi0gICAgICAgdjRsMl9wcmlvX2Nsb3NlKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvLCBmaC0+cHJpbyk7Ci0gICAgICAgZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKLSAgICAgICBrZnJlZShmaCk7CisJdjRsMl9wcmlvX2Nsb3NlKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvLCBmaC0+cHJpbyk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlrZnJlZShmaCk7CiAKLSAgICAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQogewotICAgICAgIHN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0gICAgICAgc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwogCi0gICAgICAgaWYgKHVubGlrZWx5KGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkpCi0JICAgICAgIHJldHVybiAtRUlOVkFMOworCWlmICh1bmxpa2VseShmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotICAgICAgIGlmICh1bmxpa2VseShpICE9IGZoLT50eXBlKSkKLQkgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJaWYgKHVubGlrZWx5KGkgIT0gZmgtPnR5cGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotICAgICAgIGlmICh1bmxpa2VseSghY3gyNTgyMV9yZXNfZ2V0KGRldiwgZmgsCi0JCSAgICAgICBjeDI1ODIxX2dldF9yZXNvdXJjZShmaCwgUkVTT1VSQ0VfVklERU8wKSkpKQotCSAgICAgICByZXR1cm4gLUVCVVNZOworCWlmICh1bmxpa2VseSghY3gyNTgyMV9yZXNfZ2V0KGRldiwgZmgsIGN4MjU4MjFfZ2V0X3Jlc291cmNlKGZoLAorCQkJCQkJUkVTT1VSQ0VfVklERU8wKSkpKQorCQlyZXR1cm4gLUVCVVNZOwogCi0gICAgICAgcmV0dXJuIHZpZGVvYnVmX3N0cmVhbW9uKGdldF9xdWV1ZShmaCkpOworCXJldHVybiB2aWRlb2J1Zl9zdHJlYW1vbihnZXRfcXVldWUoZmgpKTsKIH0KIAogc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKIHsKLSAgICAgICBzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotICAgICAgIHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLSAgICAgICBpbnQgZXJyLCByZXM7CisJc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7CisJaW50IGVyciwgcmVzOwogCi0gICAgICAgaWYgKGZoLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKLQkgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgaWYgKGkgIT0gZmgtPnR5cGUpCi0JICAgICAgIHJldHVybiAtRUlOVkFMOworCWlmIChmaC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpICE9IGZoLT50eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotICAgICAgIHJlcyA9IGN4MjU4MjFfZ2V0X3Jlc291cmNlKGZoLCBSRVNPVVJDRV9WSURFTzApOwotICAgICAgIGVyciA9IHZpZGVvYnVmX3N0cmVhbW9mZihnZXRfcXVldWUoZmgpKTsKLSAgICAgICBpZiAoZXJyIDwgMCkKLQkgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICBjeDI1ODIxX3Jlc19mcmVlKGRldiwgZmgsIHJlcyk7Ci0gICAgICAgcmV0dXJuIDA7CisJcmVzID0gY3gyNTgyMV9nZXRfcmVzb3VyY2UoZmgsIFJFU09VUkNFX1ZJREVPMCk7CisJZXJyID0gdmlkZW9idWZfc3RyZWFtb2ZmKGdldF9xdWV1ZShmaCkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWN4MjU4MjFfcmVzX2ZyZWUoZGV2LCBmaCwgcmVzKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB2aWRpb2Nfc19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCisJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewotICAgICAgIHN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0gICAgICAgc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OworCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7CiAJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCBtYnVzX2ZtdDsKLSAgICAgICBpbnQgZXJyOwotICAgICAgIGludCBwaXhfZm9ybWF0ID0gUElYRUxfRlJNVF80MjI7CisJaW50IGVycjsKKwlpbnQgcGl4X2Zvcm1hdCA9IFBJWEVMX0ZSTVRfNDIyOwogCi0gICAgICAgaWYgKGZoKSB7Ci0JICAgICAgIGVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0KLQkJCQkJICAgICAgIC5wcmlvLCBmaC0+cHJpbyk7Ci0JICAgICAgIGlmICgwICE9IGVycikKLQkJICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgfQorCWlmIChmaCkgeworCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnByaW8sCisJCQkJICAgICAgZmgtPnByaW8pOworCQlpZiAoMCAhPSBlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KIAotICAgICAgIGRwcmludGsoMiwgIiVzKClcbiIsIF9fZnVuY19fKTsKLSAgICAgICBlcnIgPSBjeDI1ODIxX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAoZmlsZSwgcHJpdiwgZik7CisJZHByaW50aygyLCAiJXMoKVxuIiwgX19mdW5jX18pOworCWVyciA9IGN4MjU4MjFfdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChmaWxlLCBwcml2LCBmKTsKIAotICAgICAgIGlmICgwICE9IGVycikKLQkgICAgICAgcmV0dXJuIGVycjsKKwlpZiAoMCAhPSBlcnIpCisJCXJldHVybiBlcnI7CiAKLSAgICAgICBmaC0+Zm10ID0gY3gyNTgyMV9mb3JtYXRfYnlfZm91cmNjKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQpOwotICAgICAgIGZoLT52aWRxLmZpZWxkID0gZi0+Zm10LnBpeC5maWVsZDsKKwlmaC0+Zm10ID0gY3gyNTgyMV9mb3JtYXRfYnlfZm91cmNjKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQpOworCWZoLT52aWRxLmZpZWxkID0gZi0+Zm10LnBpeC5maWVsZDsKIAotICAgICAgIC8qIGNoZWNrIGlmIHdpZHRoIGFuZCBoZWlnaHQgaXMgdmFsaWQgYmFzZWQgb24gc2V0IHN0YW5kYXJkICovCi0gICAgICAgaWYgKGN4MjU4MjFfaXNfdmFsaWRfd2lkdGgoZi0+Zm10LnBpeC53aWR0aCwgZGV2LT50dm5vcm0pKQotCSAgICAgICBmaC0+d2lkdGggPSBmLT5mbXQucGl4LndpZHRoOworCS8qIGNoZWNrIGlmIHdpZHRoIGFuZCBoZWlnaHQgaXMgdmFsaWQgYmFzZWQgb24gc2V0IHN0YW5kYXJkICovCisJaWYgKGN4MjU4MjFfaXNfdmFsaWRfd2lkdGgoZi0+Zm10LnBpeC53aWR0aCwgZGV2LT50dm5vcm0pKQorCQlmaC0+d2lkdGggPSBmLT5mbXQucGl4LndpZHRoOwogCi0gICAgICAgaWYgKGN4MjU4MjFfaXNfdmFsaWRfaGVpZ2h0KGYtPmZtdC5waXguaGVpZ2h0LCBkZXYtPnR2bm9ybSkpCi0JICAgICAgIGZoLT5oZWlnaHQgPSBmLT5mbXQucGl4LmhlaWdodDsKKwlpZiAoY3gyNTgyMV9pc192YWxpZF9oZWlnaHQoZi0+Zm10LnBpeC5oZWlnaHQsIGRldi0+dHZub3JtKSkKKwkJZmgtPmhlaWdodCA9IGYtPmZtdC5waXguaGVpZ2h0OwogCi0gICAgICAgaWYgKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1k0MVApCi0JICAgICAgIHBpeF9mb3JtYXQgPSBQSVhFTF9GUk1UXzQxMTsKLSAgICAgICBlbHNlIGlmIChmLT5mbXQucGl4LnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9ZVVlWKQotCSAgICAgICBwaXhfZm9ybWF0ID0gUElYRUxfRlJNVF80MjI7Ci0gICAgICAgZWxzZQotCSAgICAgICByZXR1cm4gLUVJTlZBTDsKKwlpZiAoZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfWTQxUCkKKwkJcGl4X2Zvcm1hdCA9IFBJWEVMX0ZSTVRfNDExOworCWVsc2UgaWYgKGYtPmZtdC5waXgucGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1lVWVYpCisJCXBpeF9mb3JtYXQgPSBQSVhFTF9GUk1UXzQyMjsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOwogCi0gICAgICAgY3gyNTgyMV9zZXRfcGl4ZWxfZm9ybWF0KGRldiwgU1JBTV9DSDAwLCBwaXhfZm9ybWF0KTsKKwljeDI1ODIxX3NldF9waXhlbF9mb3JtYXQoZGV2LCBTUkFNX0NIMDAsIHBpeF9mb3JtYXQpOwogCi0gICAgICAgLyogY2hlY2sgaWYgY2lmIHJlc29sdXRpb24gKi8KLSAgICAgICBpZiAoZmgtPndpZHRoID09IDMyMCB8fCBmaC0+d2lkdGggPT0gMzUyKQotCSAgICAgICBkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS51c2VfY2lmX3Jlc29sdXRpb24gPSAxOwotICAgICAgIGVsc2UKLQkgICAgICAgZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0udXNlX2NpZl9yZXNvbHV0aW9uID0gMDsKKwkvKiBjaGVjayBpZiBjaWYgcmVzb2x1dGlvbiAqLworCWlmIChmaC0+d2lkdGggPT0gMzIwIHx8IGZoLT53aWR0aCA9PSAzNTIpCisJCWRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnVzZV9jaWZfcmVzb2x1dGlvbiA9IDE7CisJZWxzZQorCQlkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS51c2VfY2lmX3Jlc29sdXRpb24gPSAwOwogCi0gICAgICAgZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0uY2lmX3dpZHRoID0gZmgtPndpZHRoOwotICAgICAgIG1lZHVzYV9zZXRfcmVzb2x1dGlvbihkZXYsIGZoLT53aWR0aCwgU1JBTV9DSDAwKTsKKwlkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5jaWZfd2lkdGggPSBmaC0+d2lkdGg7CisJbWVkdXNhX3NldF9yZXNvbHV0aW9uKGRldiwgZmgtPndpZHRoLCBTUkFNX0NIMDApOwogCiAJZHByaW50aygyLCAiJXMoKTogd2lkdGg9JWQgaGVpZ2h0PSVkIGZpZWxkPSVkXG4iLCBfX2Z1bmNfXywgZmgtPndpZHRoLAogCQlmaC0+aGVpZ2h0LCBmaC0+dmlkcS5maWVsZCk7CiAJdjRsMl9maWxsX21idXNfZm9ybWF0KCZtYnVzX2ZtdCwgJmYtPmZtdC5waXgsIFY0TDJfTUJVU19GTVRfRklYRUQpOwogCWN4MjU4MjFfY2FsbF9hbGwoZGV2LCB2aWRlbywgc19tYnVzX2ZtdCwgJm1idXNfZm10KTsKIAotICAgICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHZpZGlvY19kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpwKQogewotICAgICAgIGludCByZXRfdmFsID0gMDsKLSAgICAgICBzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwotICAgICAgIHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7CisJaW50IHJldF92YWwgPSAwOworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKIAotICAgICAgIHJldF92YWwgPSB2aWRlb2J1Zl9kcWJ1ZihnZXRfcXVldWUoZmgpLCBwLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJcmV0X3ZhbCA9IHZpZGVvYnVmX2RxYnVmKGdldF9xdWV1ZShmaCksIHAsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKIAotICAgIHAtPnNlcXVlbmNlID0gZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0udmlkcS5jb3VudDsKKwlwLT5zZXF1ZW5jZSA9IGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnZpZHEuY291bnQ7CiAKLSAgICAgICByZXR1cm4gcmV0X3ZhbDsKKwlyZXR1cm4gcmV0X3ZhbDsKIH0KIAogc3RhdGljIGludCB2aWRpb2NfbG9nX3N0YXR1cyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdikKIHsKLSAgICAgICBzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotICAgICAgIHN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7Ci0gICAgICAgY2hhciBuYW1lWzMyICsgMl07CisJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKKwlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OworCWNoYXIgbmFtZVszMiArIDJdOwogCi0gICAgICAgc3RydWN0IHNyYW1fY2hhbm5lbCAqc3JhbV9jaCA9IGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdCi0JCQkJCQkgICAgICAgLnNyYW1fY2hhbm5lbHM7Ci0gICAgICAgdTMyIHRtcCA9IDA7CisJc3RydWN0IHNyYW1fY2hhbm5lbCAqc3JhbV9jaCA9IGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdCisJCQkJCQkJCS5zcmFtX2NoYW5uZWxzOworCXUzMiB0bXAgPSAwOwogCi0gICAgICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMvMiIsIGRldi0+bmFtZSk7CisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMvMiIsIGRldi0+bmFtZSk7CiAJcHJfaW5mbygiJXMvMjogPT09PT09PT09PT09ICBTVEFSVCBMT0cgU1RBVFVTICA9PT09PT09PT09PT1cbiIsCiAJCWRldi0+bmFtZSk7Ci0gICAgICAgY3gyNTgyMV9jYWxsX2FsbChkZXYsIGNvcmUsIGxvZ19zdGF0dXMpOwotICAgICAgIHRtcCA9IGN4X3JlYWQoc3JhbV9jaC0+ZG1hX2N0bCk7CisJY3gyNTgyMV9jYWxsX2FsbChkZXYsIGNvcmUsIGxvZ19zdGF0dXMpOworCXRtcCA9IGN4X3JlYWQoc3JhbV9jaC0+ZG1hX2N0bCk7CiAJcHJfaW5mbygiVmlkZW8gaW5wdXQgMCBpcyAlc1xuIiwKIAkJKHRtcCAmIDB4MTEpID8gInN0cmVhbWluZyIgOiAic3RvcHBlZCIpOwogCXByX2luZm8oIiVzLzI6ID09PT09PT09PT09PT0gIEVORCBMT0cgU1RBVFVTICA9PT09PT09PT09PT09XG4iLAogCQlkZXYtPm5hbWUpOwotICAgICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCiAJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdGwpCiB7Ci0gICAgICAgc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKLSAgICAgICBzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotICAgICAgIGludCBlcnI7CisJc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OworCWludCBlcnI7CiAKLSAgICAgICBpZiAoZmgpIHsKLQkgICAgICAgZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXQotCQkJCQkgICAgICAgLnByaW8sIGZoLT5wcmlvKTsKLQkgICAgICAgaWYgKDAgIT0gZXJyKQotCQkgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICB9CisJaWYgKGZoKSB7CisJCWVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucHJpbywKKwkJCQkgICAgICBmaC0+cHJpbyk7CisJCWlmICgwICE9IGVycikKKwkJCXJldHVybiBlcnI7CisJfQogCi0gICAgICAgcmV0dXJuIGN4MjU4MjFfc2V0X2NvbnRyb2woZGV2LCBjdGwsIGZoLT5jaGFubmVsX2lkKTsKKwlyZXR1cm4gY3gyNTgyMV9zZXRfY29udHJvbChkZXYsIGN0bCwgZmgtPmNoYW5uZWxfaWQpOwogfQogCi0vKiBWSURFTyBJT0NUTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLWludCBjeDI1ODIxX3ZpZGlvY19nX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCisvKiBWSURFTyBJT0NUTFMgKi8KK2ludCBjeDI1ODIxX3ZpZGlvY19nX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCSBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7CiAJc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKIApAQCAtMTExNiw3ICsxMTEwLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGN4MjU4MjFfdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoraW50IGN4MjU4MjFfdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7CiAJc3RydWN0IGN4MjU4MjFfZm10ICpmbXQ7CiAJZW51bSB2NGwyX2ZpZWxkIGZpZWxkOwpAQCAtMTEzMSw4ICsxMTI2LDEwIEBACiAJbWF4aCA9IDU3NjsKIAogCWlmIChWNEwyX0ZJRUxEX0FOWSA9PSBmaWVsZCkgewotCQlmaWVsZCA9IChmLT5mbXQucGl4LmhlaWdodCA+IG1heGggLyAyKQotCQkgICAgPyBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQgOiBWNEwyX0ZJRUxEX1RPUDsKKwkJaWYgKGYtPmZtdC5waXguaGVpZ2h0ID4gbWF4aCAvIDIpCisJCQlmaWVsZCA9IFY0TDJfRklFTERfSU5URVJMQUNFRDsKKwkJZWxzZQorCQkJZmllbGQgPSBWNEwyX0ZJRUxEX1RPUDsKIAl9CiAKIAlzd2l0Y2ggKGZpZWxkKSB7CkBAIC0xMTYyLDcgKzExNTksOCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgY3gyNTgyMV92aWRpb2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCkKK2ludCBjeDI1ODIxX3ZpZGlvY19xdWVyeWNhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCiB7CiAJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKIApAQCAtMTE4OSwxMyArMTE4NywxNSBAQAogCXJldHVybiAwOwogfQogCi1pbnQgY3gyNTgyMV92aWRpb2NfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnApCitpbnQgY3gyNTgyMV92aWRpb2NfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgIHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpwKQogewogCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CiAJcmV0dXJuIHZpZGVvYnVmX3JlcWJ1ZnMoZ2V0X3F1ZXVlKGZoKSwgcCk7CiB9CiAKLWludCBjeDI1ODIxX3ZpZGlvY19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpwKQoraW50IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5YnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqcCkKIHsKIAlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwogCXJldHVybiB2aWRlb2J1Zl9xdWVyeWJ1ZihnZXRfcXVldWUoZmgpLCBwKTsKQEAgLTEyMTAsMjAgKzEyMTAsMjEgQEAKIGludCBjeDI1ODIxX3ZpZGlvY19nX3ByaW9yaXR5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmLCBlbnVtIHY0bDJfcHJpb3JpdHkgKnApCiB7CiAJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopZiktPmRldjsKLSAgICAgICBzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmOworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGY7CiAKLSAgICAgICAqcCA9IHY0bDJfcHJpb19tYXgoJmRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnByaW8pOworCSpwID0gdjRsMl9wcmlvX21heCgmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucHJpbyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGN4MjU4MjFfdmlkaW9jX3NfcHJpb3JpdHkoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmYsIGVudW0gdjRsMl9wcmlvcml0eSBwcmlvKQoraW50IGN4MjU4MjFfdmlkaW9jX3NfcHJpb3JpdHkoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmYsCisJCQkgICAgICBlbnVtIHY0bDJfcHJpb3JpdHkgcHJpbykKIHsKIAlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmOwogCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKWYpLT5kZXY7CiAKLSAgICAgICByZXR1cm4gdjRsMl9wcmlvX2NoYW5nZSgmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0KLQkJCQkgICAgICAgLnByaW8sICZmaC0+cHJpbywgcHJpbyk7CisJcmV0dXJuIHY0bDJfcHJpb19jaGFuZ2UoJmRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnByaW8sICZmaC0+cHJpbywKKwkJCXByaW8pOwogfQogCiAjaWZkZWYgVFVORVJfRkxBRwpAQCAtMTIzNiwxNSArMTIzNywxNCBAQAogCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAogCWlmIChmaCkgewotCSAgICAgICBlcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdCi0JCQkJCSAgICAgICAucHJpbywgZmgtPnByaW8pOworCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnByaW8sCisJCQkJICAgICAgZmgtPnByaW8pOwogCQlpZiAoMCAhPSBlcnIpCiAJCQlyZXR1cm4gZXJyOwogCX0KIAotCWlmIChkZXYtPnR2bm9ybSA9PSAqdHZub3JtcykgeworCWlmIChkZXYtPnR2bm9ybSA9PSAqdHZub3JtcykKIAkJcmV0dXJuIDA7Ci0JfQogCiAJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKIAljeDI1ODIxX3NldF90dm5vcm0oZGV2LCAqdHZub3Jtcyk7CkBAIC0xMjU4LDcgKzEyNTgsNyBAQAogCiBpbnQgY3gyNTgyMV9lbnVtX2lucHV0KHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBzdHJ1Y3QgdjRsMl9pbnB1dCAqaSkKIHsKLQlzdGF0aWMgY29uc3QgY2hhciAqaW5hbWVbXSA9IHsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGluYW1lW10gPSB7CiAJCVtDWDI1ODIxX1ZNVVhfQ09NUE9TSVRFXSA9ICJDb21wb3NpdGUiLAogCQlbQ1gyNTgyMV9WTVVYX1NWSURFT10gPSAiUy1WaWRlbyIsCiAJCVtDWDI1ODIxX1ZNVVhfREVCVUddID0gImZvciBkZWJ1ZyBvbmx5IiwKQEAgLTEyODAsNyArMTI4MCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBjeDI1ODIxX3ZpZGlvY19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9pbnB1dCAqaSkKK2ludCBjeDI1ODIxX3ZpZGlvY19lbnVtX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgICAgc3RydWN0IHY0bDJfaW5wdXQgKmkpCiB7CiAJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSAoKHN0cnVjdCBjeDI1ODIxX2ZoICopcHJpdiktPmRldjsKIAlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CkBAIC0xMzA1LDggKzEzMDYsOCBAQAogCWRwcmludGsoMSwgIiVzKCVkKVxuIiwgX19mdW5jX18sIGkpOwogCiAJaWYgKGZoKSB7Ci0JICAgICAgIGVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0KLQkJCQkJICAgICAgIC5wcmlvLCBmaC0+cHJpbyk7CisJCWVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucHJpbywKKwkJCQkgICAgICBmaC0+cHJpbyk7CiAJCWlmICgwICE9IGVycikKIAkJCXJldHVybiBlcnI7CiAJfQpAQCAtMTMyMyw3ICsxMzI0LDggQEAKIH0KIAogI2lmZGVmIFRVTkVSX0ZMQUcKLWludCBjeDI1ODIxX3ZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQoraW50IGN4MjU4MjFfdmlkaW9jX2dfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgICAgIHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKIHsKIAlzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBwcml2OwogCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKQEAgLTEzNTAsMjEgKzEzNTIsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGN4MjU4MjFfdmlkaW9jX3NfZnJlcXVlbmN5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpCitpbnQgY3gyNTgyMV92aWRpb2Nfc19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgICAgc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQogewogCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CiAJc3RydWN0IGN4MjU4MjFfZGV2ICpkZXY7CiAJaW50IGVycjsKIAogCWlmIChmaCkgewotCSAgICAgICBkZXYgPSBmaC0+ZGV2OwotCSAgICAgICBlcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdCi0JCQkJCSAgICAgICAucHJpbywgZmgtPnByaW8pOworCQlkZXYgPSBmaC0+ZGV2OworCQllcnIgPSB2NGwyX3ByaW9fY2hlY2soJmRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLnByaW8sCisJCQkJICAgICAgZmgtPnByaW8pOwogCQlpZiAoMCAhPSBlcnIpCiAJCQlyZXR1cm4gZXJyOwotICAgICAgIH0gZWxzZSB7Ci0JICAgICAgIHByX2VycigiSW52YWxpZCBmaCBwb2ludGVyIVxuIik7Ci0JICAgICAgIHJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCXByX2VycigiSW52YWxpZCBmaCBwb2ludGVyIVxuIik7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXJldHVybiBjeDI1ODIxX3NldF9mcmVxKGRldiwgZik7CkBAIC0xNDI2LDggKzE0MjksOCBAQAogCWludCBlcnI7CiAKIAlpZiAoZmgpIHsKLQkgICAgICAgZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXQotCQkJCQkgICAgICAgLnByaW8sIGZoLT5wcmlvKTsKKwkJZXJyID0gdjRsMl9wcmlvX2NoZWNrKCZkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5wcmlvLAorCQkJCSAgICAgIGZoLT5wcmlvKTsKIAkJaWYgKDAgIT0gZXJyKQogCQkJcmV0dXJuIGVycjsKIAl9CkBAIC0xNTIyLDEwICsxNTI1LDExIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLWludCBjeDI1ODIxX3ZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0bCkKK2ludCBjeDI1ODIxX3ZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0bCkKIHsKIAlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9ICgoc3RydWN0IGN4MjU4MjFfZmggKilwcml2KS0+ZGV2OwotICAgICAgIHN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IGN4MjU4MjFfZmggKmZoID0gcHJpdjsKIAogCWNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqY3RybDsKIApAQCAtMTUzNSwxNiArMTUzOSwxNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlzd2l0Y2ggKGN0bC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6Ci0JICAgICAgIGN0bC0+dmFsdWUgPSBkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5jdGxfYnJpZ2h0OworCQljdGwtPnZhbHVlID0gZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0uY3RsX2JyaWdodDsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9IVUU6Ci0JICAgICAgIGN0bC0+dmFsdWUgPSBkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5jdGxfaHVlOworCQljdGwtPnZhbHVlID0gZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0uY3RsX2h1ZTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKLQkgICAgICAgY3RsLT52YWx1ZSA9IGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLmN0bF9jb250cmFzdDsKKwkJY3RsLT52YWx1ZSA9IGRldi0+Y2hhbm5lbHNbZmgtPmNoYW5uZWxfaWRdLmN0bF9jb250cmFzdDsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgotCSAgICAgICBjdGwtPnZhbHVlID0gZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0uY3RsX3NhdHVyYXRpb247CisJCWN0bC0+dmFsdWUgPSBkZXYtPmNoYW5uZWxzW2ZoLT5jaGFubmVsX2lkXS5jdGxfc2F0dXJhdGlvbjsKIAkJYnJlYWs7CiAJfQogCXJldHVybiAwOwpAQCAtMTU3OCwxOSArMTU4MiwxOSBAQAogCiAJc3dpdGNoIChjdGwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgotCSAgICAgICBkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS5jdGxfYnJpZ2h0ID0gY3RsLT52YWx1ZTsKKwkJZGV2LT5jaGFubmVsc1tjaGFuX251bV0uY3RsX2JyaWdodCA9IGN0bC0+dmFsdWU7CiAJCW1lZHVzYV9zZXRfYnJpZ2h0bmVzcyhkZXYsIGN0bC0+dmFsdWUsIGNoYW5fbnVtKTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9IVUU6Ci0JICAgICAgIGRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLmN0bF9odWUgPSBjdGwtPnZhbHVlOworCQlkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS5jdGxfaHVlID0gY3RsLT52YWx1ZTsKIAkJbWVkdXNhX3NldF9odWUoZGV2LCBjdGwtPnZhbHVlLCBjaGFuX251bSk7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfQ09OVFJBU1Q6Ci0JICAgICAgIGRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLmN0bF9jb250cmFzdCA9IGN0bC0+dmFsdWU7CisJCWRldi0+Y2hhbm5lbHNbY2hhbl9udW1dLmN0bF9jb250cmFzdCA9IGN0bC0+dmFsdWU7CiAJCW1lZHVzYV9zZXRfY29udHJhc3QoZGV2LCBjdGwtPnZhbHVlLCBjaGFuX251bSk7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfU0FUVVJBVElPTjoKLQkgICAgICAgZGV2LT5jaGFubmVsc1tjaGFuX251bV0uY3RsX3NhdHVyYXRpb24gPSBjdGwtPnZhbHVlOworCQlkZXYtPmNoYW5uZWxzW2NoYW5fbnVtXS5jdGxfc2F0dXJhdGlvbiA9IGN0bC0+dmFsdWU7CiAJCW1lZHVzYV9zZXRfc2F0dXJhdGlvbihkZXYsIGN0bC0+dmFsdWUsIGNoYW5fbnVtKTsKIAkJYnJlYWs7CiAJfQpAQCAtMTYxMiw3ICsxNjE2LDggQEAKIAl9CiB9CiAKLWludCBjeDI1ODIxX3ZpZGlvY19jcm9wY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9jcm9wY2FwICpjcm9wY2FwKQoraW50IGN4MjU4MjFfdmlkaW9jX2Nyb3BjYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICBzdHJ1Y3QgdjRsMl9jcm9wY2FwICpjcm9wY2FwKQogewogCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gKChzdHJ1Y3QgY3gyNTgyMV9maCAqKXByaXYpLT5kZXY7CiAKQEAgLTE2MjIsOSArMTYyNyw5IEBACiAJY3JvcGNhcC0+Ym91bmRzLndpZHRoID0gNzIwOwogCWNyb3BjYXAtPmJvdW5kcy5oZWlnaHQgPSBkZXYtPnR2bm9ybSA9PSBWNEwyX1NURF9QQUxfQkcgPyA1NzYgOiA0ODA7CiAJY3JvcGNhcC0+cGl4ZWxhc3BlY3QubnVtZXJhdG9yID0KLQkgICAgZGV2LT50dm5vcm0gPT0gVjRMMl9TVERfUEFMX0JHID8gNTkgOiAxMDsKKwkJZGV2LT50dm5vcm0gPT0gVjRMMl9TVERfUEFMX0JHID8gNTkgOiAxMDsKIAljcm9wY2FwLT5waXhlbGFzcGVjdC5kZW5vbWluYXRvciA9Ci0JICAgIGRldi0+dHZub3JtID09IFY0TDJfU1REX1BBTF9CRyA/IDU0IDogMTE7CisJCWRldi0+dHZub3JtID09IFY0TDJfU1REX1BBTF9CRyA/IDU0IDogMTE7CiAJY3JvcGNhcC0+ZGVmcmVjdCA9IGNyb3BjYXAtPmJvdW5kczsKIAlyZXR1cm4gMDsKIH0KQEAgLTE2MzYsMjQgKzE2NDEsMjQgQEAKIAlpbnQgZXJyOwogCiAJaWYgKGZoKSB7Ci0JICAgICAgIGVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0uCi0JCQkJCSAgICAgICBwcmlvLCBmaC0+cHJpbyk7CisJCWVyciA9IHY0bDJfcHJpb19jaGVjaygmZGV2LT5jaGFubmVsc1tmaC0+Y2hhbm5lbF9pZF0ucHJpbywKKwkJCQkgICAgICBmaC0+cHJpbyk7CiAJCWlmICgwICE9IGVycikKIAkJCXJldHVybiBlcnI7CiAJfQotICAgICAgIC8qIGN4MjU4MjFfdmlkaW9jX3NfY3JvcCBub3Qgc3VwcG9ydGVkICovCisJLyogY3gyNTgyMV92aWRpb2Nfc19jcm9wIG5vdCBzdXBwb3J0ZWQgKi8KIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAogaW50IGN4MjU4MjFfdmlkaW9jX2dfY3JvcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfY3JvcCAqY3JvcCkKIHsKLSAgICAgICAvKiBjeDI1ODIxX3ZpZGlvY19nX2Nyb3Agbm90IHN1cHBvcnRlZCAqLworCS8qIGN4MjU4MjFfdmlkaW9jX2dfY3JvcCBub3Qgc3VwcG9ydGVkICovCiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKIGludCBjeDI1ODIxX3ZpZGlvY19xdWVyeXN0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgdjRsMl9zdGRfaWQgKiBub3JtKQogewotICAgICAgIC8qIG1lZHVzYSBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIHN0YW5kYXJkIHNlbnNpbmcgb2YgY3VycmVudCBpbnB1dCAqLworCS8qIG1lZHVzYSBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIHN0YW5kYXJkIHNlbnNpbmcgb2YgY3VycmVudCBpbnB1dCAqLwogCSpub3JtID0gQ1gyNTgyMV9OT1JNUzsKIAogCXJldHVybiAwOwpAQCAtMTY5OSwzMTAgKzE3MDQsMzA5IEBACiBzdGF0aWMgbG9uZyB2aWRlb19pb2N0bF91cHN0cmVhbTkoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkJIHVuc2lnbmVkIGxvbmcgYXJnKQogewotICAgICAgIHN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLSAgICAgICBzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0gICAgICAgaW50IGNvbW1hbmQgPSAwOwotICAgICAgIHN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCAqZGF0YV9mcm9tX3VzZXI7CisJc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKKwlpbnQgY29tbWFuZCA9IDA7CisJc3RydWN0IHVwc3RyZWFtX3VzZXJfc3RydWN0ICpkYXRhX2Zyb21fdXNlcjsKIAotICAgICAgIGRhdGFfZnJvbV91c2VyID0gKHN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCAqKWFyZzsKKwlkYXRhX2Zyb21fdXNlciA9IChzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QgKilhcmc7CiAKIAlpZiAoIWRhdGFfZnJvbV91c2VyKSB7CiAJCXByX2VycigiJXMoKTogVXBzdHJlYW0gZGF0YSBpcyBJTlZBTElELiBSZXR1cm5pbmdcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0gICAgICAgY29tbWFuZCA9IGRhdGFfZnJvbV91c2VyLT5jb21tYW5kOworCWNvbW1hbmQgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKIAotICAgICAgIGlmIChjb21tYW5kICE9IFVQU1RSRUFNX1NUQVJUX1ZJREVPICYmCi0JICAgICAgIGNvbW1hbmQgIT0gVVBTVFJFQU1fU1RPUF9WSURFTykKLQkgICAgICAgcmV0dXJuIDA7CisJaWYgKGNvbW1hbmQgIT0gVVBTVFJFQU1fU1RBUlRfVklERU8gJiYgY29tbWFuZCAhPSBVUFNUUkVBTV9TVE9QX1ZJREVPKQorCQlyZXR1cm4gMDsKIAotICAgICAgIGRldi0+aW5wdXRfZmlsZW5hbWUgPSBkYXRhX2Zyb21fdXNlci0+aW5wdXRfZmlsZW5hbWU7Ci0gICAgICAgZGV2LT5pbnB1dF9hdWRpb2ZpbGVuYW1lID0gZGF0YV9mcm9tX3VzZXItPmlucHV0X2ZpbGVuYW1lOwotICAgICAgIGRldi0+dmlkX3N0ZG5hbWUgPSBkYXRhX2Zyb21fdXNlci0+dmlkX3N0ZG5hbWU7Ci0gICAgICAgZGV2LT5waXhlbF9mb3JtYXQgPSBkYXRhX2Zyb21fdXNlci0+cGl4ZWxfZm9ybWF0OwotICAgICAgIGRldi0+Y2hhbm5lbF9zZWxlY3QgPSBkYXRhX2Zyb21fdXNlci0+Y2hhbm5lbF9zZWxlY3Q7Ci0gICAgICAgZGV2LT5jb21tYW5kID0gZGF0YV9mcm9tX3VzZXItPmNvbW1hbmQ7CisJZGV2LT5pbnB1dF9maWxlbmFtZSA9IGRhdGFfZnJvbV91c2VyLT5pbnB1dF9maWxlbmFtZTsKKwlkZXYtPmlucHV0X2F1ZGlvZmlsZW5hbWUgPSBkYXRhX2Zyb21fdXNlci0+aW5wdXRfZmlsZW5hbWU7CisJZGV2LT52aWRfc3RkbmFtZSA9IGRhdGFfZnJvbV91c2VyLT52aWRfc3RkbmFtZTsKKwlkZXYtPnBpeGVsX2Zvcm1hdCA9IGRhdGFfZnJvbV91c2VyLT5waXhlbF9mb3JtYXQ7CisJZGV2LT5jaGFubmVsX3NlbGVjdCA9IGRhdGFfZnJvbV91c2VyLT5jaGFubmVsX3NlbGVjdDsKKwlkZXYtPmNvbW1hbmQgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKIAotICAgICAgIHN3aXRjaCAoY29tbWFuZCkgewotICAgICAgIGNhc2UgVVBTVFJFQU1fU1RBUlRfVklERU86Ci0JICAgICAgIGN4MjU4MjFfc3RhcnRfdXBzdHJlYW1fdmlkZW9fY2gxKGRldiwgZGF0YV9mcm9tX3VzZXIpOwotCSAgICAgICBicmVhazsKKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKwljYXNlIFVQU1RSRUFNX1NUQVJUX1ZJREVPOgorCQljeDI1ODIxX3N0YXJ0X3Vwc3RyZWFtX3ZpZGVvX2NoMShkZXYsIGRhdGFfZnJvbV91c2VyKTsKKwkJYnJlYWs7CiAKLSAgICAgICBjYXNlIFVQU1RSRUFNX1NUT1BfVklERU86Ci0JICAgICAgIGN4MjU4MjFfc3RvcF91cHN0cmVhbV92aWRlb19jaDEoZGV2KTsKLQkgICAgICAgYnJlYWs7Ci0gICAgICAgfQorCWNhc2UgVVBTVFJFQU1fU1RPUF9WSURFTzoKKwkJY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX3ZpZGVvX2NoMShkZXYpOworCQlicmVhazsKKwl9CiAKLSAgICAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGxvbmcgdmlkZW9faW9jdGxfdXBzdHJlYW0xMChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgYXJnKQogewotICAgICAgIHN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLSAgICAgICBzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7Ci0gICAgICAgaW50IGNvbW1hbmQgPSAwOwotICAgICAgIHN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCAqZGF0YV9mcm9tX3VzZXI7CisJc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKKwlpbnQgY29tbWFuZCA9IDA7CisJc3RydWN0IHVwc3RyZWFtX3VzZXJfc3RydWN0ICpkYXRhX2Zyb21fdXNlcjsKIAotICAgICAgIGRhdGFfZnJvbV91c2VyID0gKHN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCAqKWFyZzsKKwlkYXRhX2Zyb21fdXNlciA9IChzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QgKilhcmc7CiAKIAlpZiAoIWRhdGFfZnJvbV91c2VyKSB7CiAJCXByX2VycigiJXMoKTogVXBzdHJlYW0gZGF0YSBpcyBJTlZBTElELiBSZXR1cm5pbmdcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0gICAgICAgY29tbWFuZCA9IGRhdGFfZnJvbV91c2VyLT5jb21tYW5kOworCWNvbW1hbmQgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKIAotICAgICAgIGlmIChjb21tYW5kICE9IFVQU1RSRUFNX1NUQVJUX1ZJREVPICYmCi0JICAgICAgIGNvbW1hbmQgIT0gVVBTVFJFQU1fU1RPUF9WSURFTykKLQkgICAgICAgcmV0dXJuIDA7CisJaWYgKGNvbW1hbmQgIT0gVVBTVFJFQU1fU1RBUlRfVklERU8gJiYgY29tbWFuZCAhPSBVUFNUUkVBTV9TVE9QX1ZJREVPKQorCQlyZXR1cm4gMDsKIAotICAgICAgIGRldi0+aW5wdXRfZmlsZW5hbWVfY2gyID0gZGF0YV9mcm9tX3VzZXItPmlucHV0X2ZpbGVuYW1lOwotICAgICAgIGRldi0+aW5wdXRfYXVkaW9maWxlbmFtZSA9IGRhdGFfZnJvbV91c2VyLT5pbnB1dF9maWxlbmFtZTsKLSAgICAgICBkZXYtPnZpZF9zdGRuYW1lX2NoMiA9IGRhdGFfZnJvbV91c2VyLT52aWRfc3RkbmFtZTsKLSAgICAgICBkZXYtPnBpeGVsX2Zvcm1hdF9jaDIgPSBkYXRhX2Zyb21fdXNlci0+cGl4ZWxfZm9ybWF0OwotICAgICAgIGRldi0+Y2hhbm5lbF9zZWxlY3RfY2gyID0gZGF0YV9mcm9tX3VzZXItPmNoYW5uZWxfc2VsZWN0OwotICAgICAgIGRldi0+Y29tbWFuZF9jaDIgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKKwlkZXYtPmlucHV0X2ZpbGVuYW1lX2NoMiA9IGRhdGFfZnJvbV91c2VyLT5pbnB1dF9maWxlbmFtZTsKKwlkZXYtPmlucHV0X2F1ZGlvZmlsZW5hbWUgPSBkYXRhX2Zyb21fdXNlci0+aW5wdXRfZmlsZW5hbWU7CisJZGV2LT52aWRfc3RkbmFtZV9jaDIgPSBkYXRhX2Zyb21fdXNlci0+dmlkX3N0ZG5hbWU7CisJZGV2LT5waXhlbF9mb3JtYXRfY2gyID0gZGF0YV9mcm9tX3VzZXItPnBpeGVsX2Zvcm1hdDsKKwlkZXYtPmNoYW5uZWxfc2VsZWN0X2NoMiA9IGRhdGFfZnJvbV91c2VyLT5jaGFubmVsX3NlbGVjdDsKKwlkZXYtPmNvbW1hbmRfY2gyID0gZGF0YV9mcm9tX3VzZXItPmNvbW1hbmQ7CiAKLSAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKLSAgICAgICBjYXNlIFVQU1RSRUFNX1NUQVJUX1ZJREVPOgotCSAgICAgICBjeDI1ODIxX3N0YXJ0X3Vwc3RyZWFtX3ZpZGVvX2NoMihkZXYsIGRhdGFfZnJvbV91c2VyKTsKLQkgICAgICAgYnJlYWs7CisJc3dpdGNoIChjb21tYW5kKSB7CisJY2FzZSBVUFNUUkVBTV9TVEFSVF9WSURFTzoKKwkJY3gyNTgyMV9zdGFydF91cHN0cmVhbV92aWRlb19jaDIoZGV2LCBkYXRhX2Zyb21fdXNlcik7CisJCWJyZWFrOwogCi0gICAgICAgY2FzZSBVUFNUUkVBTV9TVE9QX1ZJREVPOgotCSAgICAgICBjeDI1ODIxX3N0b3BfdXBzdHJlYW1fdmlkZW9fY2gyKGRldik7Ci0JICAgICAgIGJyZWFrOwotICAgICAgIH0KKwljYXNlIFVQU1RSRUFNX1NUT1BfVklERU86CisJCWN4MjU4MjFfc3RvcF91cHN0cmVhbV92aWRlb19jaDIoZGV2KTsKKwkJYnJlYWs7CisJfQogCi0gICAgICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBsb25nIHZpZGVvX2lvY3RsX3Vwc3RyZWFtMTEoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCiAJCQkJICB1bnNpZ25lZCBsb25nIGFyZykKIHsKLSAgICAgICBzdHJ1Y3QgY3gyNTgyMV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0gICAgICAgc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYgPSBmaC0+ZGV2OwotICAgICAgIGludCBjb21tYW5kID0gMDsKLSAgICAgICBzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QgKmRhdGFfZnJvbV91c2VyOworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7CisJaW50IGNvbW1hbmQgPSAwOworCXN0cnVjdCB1cHN0cmVhbV91c2VyX3N0cnVjdCAqZGF0YV9mcm9tX3VzZXI7CiAKLSAgICAgICBkYXRhX2Zyb21fdXNlciA9IChzdHJ1Y3QgdXBzdHJlYW1fdXNlcl9zdHJ1Y3QgKilhcmc7CisJZGF0YV9mcm9tX3VzZXIgPSAoc3RydWN0IHVwc3RyZWFtX3VzZXJfc3RydWN0ICopYXJnOwogCiAJaWYgKCFkYXRhX2Zyb21fdXNlcikgewogCQlwcl9lcnIoIiVzKCk6IFVwc3RyZWFtIGRhdGEgaXMgSU5WQUxJRC4gUmV0dXJuaW5nXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIAotICAgICAgIGNvbW1hbmQgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKKwljb21tYW5kID0gZGF0YV9mcm9tX3VzZXItPmNvbW1hbmQ7CiAKLSAgICAgICBpZiAoY29tbWFuZCAhPSBVUFNUUkVBTV9TVEFSVF9BVURJTyAmJgotCSAgICAgICBjb21tYW5kICE9IFVQU1RSRUFNX1NUT1BfQVVESU8pCi0JICAgICAgIHJldHVybiAwOworCWlmIChjb21tYW5kICE9IFVQU1RSRUFNX1NUQVJUX0FVRElPICYmIGNvbW1hbmQgIT0gVVBTVFJFQU1fU1RPUF9BVURJTykKKwkJcmV0dXJuIDA7CiAKLSAgICAgICBkZXYtPmlucHV0X2ZpbGVuYW1lID0gZGF0YV9mcm9tX3VzZXItPmlucHV0X2ZpbGVuYW1lOwotICAgICAgIGRldi0+aW5wdXRfYXVkaW9maWxlbmFtZSA9IGRhdGFfZnJvbV91c2VyLT5pbnB1dF9maWxlbmFtZTsKLSAgICAgICBkZXYtPnZpZF9zdGRuYW1lID0gZGF0YV9mcm9tX3VzZXItPnZpZF9zdGRuYW1lOwotICAgICAgIGRldi0+cGl4ZWxfZm9ybWF0ID0gZGF0YV9mcm9tX3VzZXItPnBpeGVsX2Zvcm1hdDsKLSAgICAgICBkZXYtPmNoYW5uZWxfc2VsZWN0ID0gZGF0YV9mcm9tX3VzZXItPmNoYW5uZWxfc2VsZWN0OwotICAgICAgIGRldi0+Y29tbWFuZCA9IGRhdGFfZnJvbV91c2VyLT5jb21tYW5kOworCWRldi0+aW5wdXRfZmlsZW5hbWUgPSBkYXRhX2Zyb21fdXNlci0+aW5wdXRfZmlsZW5hbWU7CisJZGV2LT5pbnB1dF9hdWRpb2ZpbGVuYW1lID0gZGF0YV9mcm9tX3VzZXItPmlucHV0X2ZpbGVuYW1lOworCWRldi0+dmlkX3N0ZG5hbWUgPSBkYXRhX2Zyb21fdXNlci0+dmlkX3N0ZG5hbWU7CisJZGV2LT5waXhlbF9mb3JtYXQgPSBkYXRhX2Zyb21fdXNlci0+cGl4ZWxfZm9ybWF0OworCWRldi0+Y2hhbm5lbF9zZWxlY3QgPSBkYXRhX2Zyb21fdXNlci0+Y2hhbm5lbF9zZWxlY3Q7CisJZGV2LT5jb21tYW5kID0gZGF0YV9mcm9tX3VzZXItPmNvbW1hbmQ7CiAKLSAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKLSAgICAgICBjYXNlIFVQU1RSRUFNX1NUQVJUX0FVRElPOgotCSAgICAgICBjeDI1ODIxX3N0YXJ0X3Vwc3RyZWFtX2F1ZGlvKGRldiwgZGF0YV9mcm9tX3VzZXIpOwotCSAgICAgICBicmVhazsKKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKwljYXNlIFVQU1RSRUFNX1NUQVJUX0FVRElPOgorCQljeDI1ODIxX3N0YXJ0X3Vwc3RyZWFtX2F1ZGlvKGRldiwgZGF0YV9mcm9tX3VzZXIpOworCQlicmVhazsKIAotICAgICAgIGNhc2UgVVBTVFJFQU1fU1RPUF9BVURJTzoKLQkgICAgICAgY3gyNTgyMV9zdG9wX3Vwc3RyZWFtX2F1ZGlvKGRldik7Ci0JICAgICAgIGJyZWFrOwotICAgICAgIH0KKwljYXNlIFVQU1RSRUFNX1NUT1BfQVVESU86CisJCWN4MjU4MjFfc3RvcF91cHN0cmVhbV9hdWRpbyhkZXYpOworCQlicmVhazsKKwl9CiAKLSAgICAgICByZXR1cm4gMDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGxvbmcgdmlkZW9faW9jdGxfc2V0KHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAogCQkJICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0gICAgICAgc3RydWN0IGN4MjU4MjFfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotICAgICAgIHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2ID0gZmgtPmRldjsKLSAgICAgICBzdHJ1Y3QgZG93bnN0cmVhbV91c2VyX3N0cnVjdCAqZGF0YV9mcm9tX3VzZXI7Ci0gICAgICAgaW50IGNvbW1hbmQ7Ci0gICAgICAgaW50IHdpZHRoID0gNzIwOwotICAgICAgIGludCBzZWxlY3RlZF9jaGFubmVsID0gMCwgcGl4X2Zvcm1hdCA9IDAsIGkgPSAwOwotICAgICAgIGludCBjaWZfZW5hYmxlID0gMCwgY2lmX3dpZHRoID0gMDsKLSAgICAgICB1MzIgdmFsdWUgPSAwOworCXN0cnVjdCBjeDI1ODIxX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiA9IGZoLT5kZXY7CisJc3RydWN0IGRvd25zdHJlYW1fdXNlcl9zdHJ1Y3QgKmRhdGFfZnJvbV91c2VyOworCWludCBjb21tYW5kOworCWludCB3aWR0aCA9IDcyMDsKKwlpbnQgc2VsZWN0ZWRfY2hhbm5lbCA9IDAsIHBpeF9mb3JtYXQgPSAwLCBpID0gMDsKKwlpbnQgY2lmX2VuYWJsZSA9IDAsIGNpZl93aWR0aCA9IDA7CisJdTMyIHZhbHVlID0gMDsKIAotICAgICAgIGRhdGFfZnJvbV91c2VyID0gKHN0cnVjdCBkb3duc3RyZWFtX3VzZXJfc3RydWN0ICopYXJnOworCWRhdGFfZnJvbV91c2VyID0gKHN0cnVjdCBkb3duc3RyZWFtX3VzZXJfc3RydWN0ICopYXJnOwogCiAJaWYgKCFkYXRhX2Zyb21fdXNlcikgewogCQlwcl9lcnIoIiVzKCk6IFVzZXIgZGF0YSBpcyBJTlZBTElELiBSZXR1cm5pbmdcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0gICAgICAgY29tbWFuZCA9IGRhdGFfZnJvbV91c2VyLT5jb21tYW5kOworCWNvbW1hbmQgPSBkYXRhX2Zyb21fdXNlci0+Y29tbWFuZDsKIAotICAgICAgIGlmIChjb21tYW5kICE9IFNFVF9WSURFT19TVEQgJiYgY29tbWFuZCAhPSBTRVRfUElYRUxfRk9STUFUCisJaWYgKGNvbW1hbmQgIT0gU0VUX1ZJREVPX1NURCAmJiBjb21tYW5kICE9IFNFVF9QSVhFTF9GT1JNQVQKIAkgICAmJiBjb21tYW5kICE9IEVOQUJMRV9DSUZfUkVTT0xVVElPTiAmJiBjb21tYW5kICE9IFJFR19SRUFECiAJICAgJiYgY29tbWFuZCAhPSBSRUdfV1JJVEUgJiYgY29tbWFuZCAhPSBNRURVU0FfUkVBRAogCSAgICYmIGNvbW1hbmQgIT0gTUVEVVNBX1dSSVRFKSB7Ci0JICAgICAgIHJldHVybiAwOwotICAgICAgIH0KKwkJcmV0dXJuIDA7CisJfQogCi0gICAgICAgc3dpdGNoIChjb21tYW5kKSB7Ci0gICAgICAgY2FzZSBTRVRfVklERU9fU1REOgotCSAgICAgICBkZXYtPnR2bm9ybSA9Ci0JCSAgICFzdHJjbXAoZGF0YV9mcm9tX3VzZXItPnZpZF9zdGRuYW1lLAotCQkJICAgIlBBTCIpID8gVjRMMl9TVERfUEFMX0JHIDogVjRMMl9TVERfTlRTQ19NOwotCSAgICAgICBtZWR1c2Ffc2V0X3ZpZGVvc3RhbmRhcmQoZGV2KTsKLQkgICAgICAgYnJlYWs7CisJc3dpdGNoIChjb21tYW5kKSB7CisJY2FzZSBTRVRfVklERU9fU1REOgorCQlpZiAoIXN0cmNtcChkYXRhX2Zyb21fdXNlci0+dmlkX3N0ZG5hbWUsICJQQUwiKSkKKwkJCWRldi0+dHZub3JtID0gVjRMMl9TVERfUEFMX0JHOworCQllbHNlCisJCQlkZXYtPnR2bm9ybSA9IFY0TDJfU1REX05UU0NfTTsKKwkJbWVkdXNhX3NldF92aWRlb3N0YW5kYXJkKGRldik7CisJCWJyZWFrOwogCi0gICAgICAgY2FzZSBTRVRfUElYRUxfRk9STUFUOgotCSAgICAgICBzZWxlY3RlZF9jaGFubmVsID0gZGF0YV9mcm9tX3VzZXItPmRlY29kZXJfc2VsZWN0OwotCSAgICAgICBwaXhfZm9ybWF0ID0gZGF0YV9mcm9tX3VzZXItPnBpeGVsX2Zvcm1hdDsKKwljYXNlIFNFVF9QSVhFTF9GT1JNQVQ6CisJCXNlbGVjdGVkX2NoYW5uZWwgPSBkYXRhX2Zyb21fdXNlci0+ZGVjb2Rlcl9zZWxlY3Q7CisJCXBpeF9mb3JtYXQgPSBkYXRhX2Zyb21fdXNlci0+cGl4ZWxfZm9ybWF0OwogCi0JICAgICAgIGlmICghKHNlbGVjdGVkX2NoYW5uZWwgPD0gNyAmJiBzZWxlY3RlZF9jaGFubmVsID49IDApKSB7Ci0JCSAgICAgICBzZWxlY3RlZF9jaGFubmVsIC09IDQ7Ci0JCSAgICAgICBzZWxlY3RlZF9jaGFubmVsID0gc2VsZWN0ZWRfY2hhbm5lbCAlIDg7Ci0JICAgICAgIH0KKwkJaWYgKCEoc2VsZWN0ZWRfY2hhbm5lbCA8PSA3ICYmIHNlbGVjdGVkX2NoYW5uZWwgPj0gMCkpIHsKKwkJCXNlbGVjdGVkX2NoYW5uZWwgLT0gNDsKKwkJCXNlbGVjdGVkX2NoYW5uZWwgPSBzZWxlY3RlZF9jaGFubmVsICUgODsKKwkJfQogCi0JICAgICAgIGlmIChzZWxlY3RlZF9jaGFubmVsID49IDApCi0JCSAgICAgICBjeDI1ODIxX3NldF9waXhlbF9mb3JtYXQoZGV2LCBzZWxlY3RlZF9jaGFubmVsLAorCQlpZiAoc2VsZWN0ZWRfY2hhbm5lbCA+PSAwKQorCQkJY3gyNTgyMV9zZXRfcGl4ZWxfZm9ybWF0KGRldiwgc2VsZWN0ZWRfY2hhbm5lbCwKIAkJCQkJCXBpeF9mb3JtYXQpOwogCi0JICAgICAgIGJyZWFrOworCQlicmVhazsKIAotICAgICAgIGNhc2UgRU5BQkxFX0NJRl9SRVNPTFVUSU9OOgotCSAgICAgICBzZWxlY3RlZF9jaGFubmVsID0gZGF0YV9mcm9tX3VzZXItPmRlY29kZXJfc2VsZWN0OwotCSAgICAgICBjaWZfZW5hYmxlID0gZGF0YV9mcm9tX3VzZXItPmNpZl9yZXNvbHV0aW9uX2VuYWJsZTsKLQkgICAgICAgY2lmX3dpZHRoID0gZGF0YV9mcm9tX3VzZXItPmNpZl93aWR0aDsKKwljYXNlIEVOQUJMRV9DSUZfUkVTT0xVVElPTjoKKwkJc2VsZWN0ZWRfY2hhbm5lbCA9IGRhdGFfZnJvbV91c2VyLT5kZWNvZGVyX3NlbGVjdDsKKwkJY2lmX2VuYWJsZSA9IGRhdGFfZnJvbV91c2VyLT5jaWZfcmVzb2x1dGlvbl9lbmFibGU7CisJCWNpZl93aWR0aCA9IGRhdGFfZnJvbV91c2VyLT5jaWZfd2lkdGg7CiAKLQkgICAgICAgaWYgKGNpZl9lbmFibGUpIHsKLQkJICAgICAgIGlmIChkZXYtPnR2bm9ybSAmIFY0TDJfU1REX1BBTF9CRwotCQkJICAgfHwgZGV2LT50dm5vcm0gJiBWNEwyX1NURF9QQUxfREspCi0JCQkgICAgICAgd2lkdGggPSAzNTI7Ci0JCSAgICAgICBlbHNlCi0JCQkgICAgICAgd2lkdGggPSAoY2lmX3dpZHRoID09IDMyMAotCQkJCQl8fCBjaWZfd2lkdGggPT0gMzUyKSA/IGNpZl93aWR0aCA6IDMyMDsKLQkgICAgICAgfQorCQlpZiAoY2lmX2VuYWJsZSkgeworCQkJaWYgKGRldi0+dHZub3JtICYgVjRMMl9TVERfUEFMX0JHCisJCQkgICAgfHwgZGV2LT50dm5vcm0gJiBWNEwyX1NURF9QQUxfREspIHsKKwkJCQl3aWR0aCA9IDM1MjsKKwkJCX0gZWxzZSB7CisJCQkJd2lkdGggPSBjaWZfd2lkdGg7CisJCQkJaWYgKGNpZl93aWR0aCAhPSAzMjAgJiYgY2lmX3dpZHRoICE9IDM1MikKKwkJCQkJd2lkdGggPSAzMjA7CisJCQl9CisJCX0KIAotCSAgICAgICBpZiAoIShzZWxlY3RlZF9jaGFubmVsIDw9IDcgJiYgc2VsZWN0ZWRfY2hhbm5lbCA+PSAwKSkgewotCQkgICAgICAgc2VsZWN0ZWRfY2hhbm5lbCAtPSA0OwotCQkgICAgICAgc2VsZWN0ZWRfY2hhbm5lbCA9IHNlbGVjdGVkX2NoYW5uZWwgJSA4OwotCSAgICAgICB9CisJCWlmICghKHNlbGVjdGVkX2NoYW5uZWwgPD0gNyAmJiBzZWxlY3RlZF9jaGFubmVsID49IDApKSB7CisJCQlzZWxlY3RlZF9jaGFubmVsIC09IDQ7CisJCQlzZWxlY3RlZF9jaGFubmVsID0gc2VsZWN0ZWRfY2hhbm5lbCAlIDg7CisJCX0KIAotCSAgICAgICBpZiAoc2VsZWN0ZWRfY2hhbm5lbCA8PSA3ICYmIHNlbGVjdGVkX2NoYW5uZWwgPj0gMCkgewotCQkgICAgICAgZGV2LT5jaGFubmVsc1tzZWxlY3RlZF9jaGFubmVsXS4KLQkJCSAgICAgICB1c2VfY2lmX3Jlc29sdXRpb24gPSBjaWZfZW5hYmxlOwotCQkgICAgICAgZGV2LT5jaGFubmVsc1tzZWxlY3RlZF9jaGFubmVsXS5jaWZfd2lkdGggPSB3aWR0aDsKLQkgICAgICAgfSBlbHNlIHsKLQkJICAgICAgIGZvciAoaSA9IDA7IGkgPCBWSURfQ0hBTk5FTF9OVU07IGkrKykgewotCQkJICAgICAgIGRldi0+Y2hhbm5lbHNbaV0udXNlX2NpZl9yZXNvbHV0aW9uID0KLQkJCQkgICAgICAgY2lmX2VuYWJsZTsKLQkJCSAgICAgICBkZXYtPmNoYW5uZWxzW2ldLmNpZl93aWR0aCA9IHdpZHRoOwotCQkgICAgICAgfQotCSAgICAgICB9CisJCWlmIChzZWxlY3RlZF9jaGFubmVsIDw9IDcgJiYgc2VsZWN0ZWRfY2hhbm5lbCA+PSAwKSB7CisJCQlkZXYtPmNoYW5uZWxzW3NlbGVjdGVkX2NoYW5uZWxdLgorCQkJCXVzZV9jaWZfcmVzb2x1dGlvbiA9IGNpZl9lbmFibGU7CisJCQlkZXYtPmNoYW5uZWxzW3NlbGVjdGVkX2NoYW5uZWxdLmNpZl93aWR0aCA9IHdpZHRoOworCQl9IGVsc2UgeworCQkJZm9yIChpID0gMDsgaSA8IFZJRF9DSEFOTkVMX05VTTsgaSsrKSB7CisJCQkJZGV2LT5jaGFubmVsc1tpXS51c2VfY2lmX3Jlc29sdXRpb24gPQorCQkJCQljaWZfZW5hYmxlOworCQkJCWRldi0+Y2hhbm5lbHNbaV0uY2lmX3dpZHRoID0gd2lkdGg7CisJCQl9CisJCX0KIAotCSAgICAgICBtZWR1c2Ffc2V0X3Jlc29sdXRpb24oZGV2LCB3aWR0aCwgc2VsZWN0ZWRfY2hhbm5lbCk7Ci0JICAgICAgIGJyZWFrOwotICAgICAgIGNhc2UgUkVHX1JFQUQ6Ci0JICAgICAgIGRhdGFfZnJvbV91c2VyLT5yZWdfZGF0YSA9IGN4X3JlYWQoZGF0YV9mcm9tX3VzZXItPnJlZ19hZGRyZXNzKTsKLQkgICAgICAgYnJlYWs7Ci0gICAgICAgY2FzZSBSRUdfV1JJVEU6Ci0JICAgICAgIGN4X3dyaXRlKGRhdGFfZnJvbV91c2VyLT5yZWdfYWRkcmVzcywgZGF0YV9mcm9tX3VzZXItPnJlZ19kYXRhKTsKLQkgICAgICAgYnJlYWs7Ci0gICAgICAgY2FzZSBNRURVU0FfUkVBRDoKLQkgICAgICAgdmFsdWUgPQotCQkgICBjeDI1ODIxX2kyY19yZWFkKCZkZXYtPmkyY19idXNbMF0sCi0JCQkJICAgICh1MTYpIGRhdGFfZnJvbV91c2VyLT5yZWdfYWRkcmVzcywKLQkJCQkgICAgJmRhdGFfZnJvbV91c2VyLT5yZWdfZGF0YSk7Ci0JICAgICAgIGJyZWFrOwotICAgICAgIGNhc2UgTUVEVVNBX1dSSVRFOgotCSAgICAgICBjeDI1ODIxX2kyY193cml0ZSgmZGV2LT5pMmNfYnVzWzBdLAotCQkJCSAodTE2KSBkYXRhX2Zyb21fdXNlci0+cmVnX2FkZHJlc3MsCi0JCQkJIGRhdGFfZnJvbV91c2VyLT5yZWdfZGF0YSk7Ci0JICAgICAgIGJyZWFrOwotICAgICAgIH0KKwkJbWVkdXNhX3NldF9yZXNvbHV0aW9uKGRldiwgd2lkdGgsIHNlbGVjdGVkX2NoYW5uZWwpOworCQlicmVhazsKKwljYXNlIFJFR19SRUFEOgorCQlkYXRhX2Zyb21fdXNlci0+cmVnX2RhdGEgPSBjeF9yZWFkKGRhdGFfZnJvbV91c2VyLT5yZWdfYWRkcmVzcyk7CisJCWJyZWFrOworCWNhc2UgUkVHX1dSSVRFOgorCQljeF93cml0ZShkYXRhX2Zyb21fdXNlci0+cmVnX2FkZHJlc3MsIGRhdGFfZnJvbV91c2VyLT5yZWdfZGF0YSk7CisJCWJyZWFrOworCWNhc2UgTUVEVVNBX1JFQUQ6CisJCXZhbHVlID0gY3gyNTgyMV9pMmNfcmVhZCgmZGV2LT5pMmNfYnVzWzBdLAorCQkJCQkgKHUxNikgZGF0YV9mcm9tX3VzZXItPnJlZ19hZGRyZXNzLAorCQkJCQkgJmRhdGFfZnJvbV91c2VyLT5yZWdfZGF0YSk7CisJCWJyZWFrOworCWNhc2UgTUVEVVNBX1dSSVRFOgorCQljeDI1ODIxX2kyY193cml0ZSgmZGV2LT5pMmNfYnVzWzBdLAorCQkJCSAgKHUxNikgZGF0YV9mcm9tX3VzZXItPnJlZ19hZGRyZXNzLAorCQkJCSAgZGF0YV9mcm9tX3VzZXItPnJlZ19kYXRhKTsKKwkJYnJlYWs7CisJfQogCi0gICAgICAgcmV0dXJuIDA7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBsb25nIGN4MjU4MjFfdmlkZW9faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCisJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0gICAgICAgaW50ICByZXQgPSAwOworCWludCAgcmV0ID0gMDsKIAotICAgICAgIHN0cnVjdCBjeDI1ODIxX2ZoICAqZmggID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBjeDI1ODIxX2ZoICAqZmggID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCi0gICAgICAgLyogY2hlY2sgdG8gc2VlIGlmIGl0J3MgdGhlIHZpZGVvIHVwc3RyZWFtICovCi0gICAgICAgaWYgKGZoLT5jaGFubmVsX2lkID09IFNSQU1fQ0gwOSkgewotCSAgICAgICByZXQgPSB2aWRlb19pb2N0bF91cHN0cmVhbTkoZmlsZSwgY21kLCBhcmcpOwotCSAgICAgICByZXR1cm4gcmV0OwotICAgICAgIH0gZWxzZSBpZiAoZmgtPmNoYW5uZWxfaWQgPT0gU1JBTV9DSDEwKSB7Ci0JICAgICAgIHJldCA9IHZpZGVvX2lvY3RsX3Vwc3RyZWFtMTAoZmlsZSwgY21kLCBhcmcpOwotCSAgICAgICByZXR1cm4gcmV0OwotICAgICAgIH0gZWxzZSBpZiAoZmgtPmNoYW5uZWxfaWQgPT0gU1JBTV9DSDExKSB7Ci0JICAgICAgIHJldCA9IHZpZGVvX2lvY3RsX3Vwc3RyZWFtMTEoZmlsZSwgY21kLCBhcmcpOwotCSAgICAgICByZXQgPSB2aWRlb19pb2N0bF9zZXQoZmlsZSwgY21kLCBhcmcpOwotCSAgICAgICByZXR1cm4gcmV0OwotICAgICAgIH0KKwkvKiBjaGVjayB0byBzZWUgaWYgaXQncyB0aGUgdmlkZW8gdXBzdHJlYW0gKi8KKwlpZiAoZmgtPmNoYW5uZWxfaWQgPT0gU1JBTV9DSDA5KSB7CisJCXJldCA9IHZpZGVvX2lvY3RsX3Vwc3RyZWFtOShmaWxlLCBjbWQsIGFyZyk7CisJCXJldHVybiByZXQ7CisJfSBlbHNlIGlmIChmaC0+Y2hhbm5lbF9pZCA9PSBTUkFNX0NIMTApIHsKKwkJcmV0ID0gdmlkZW9faW9jdGxfdXBzdHJlYW0xMChmaWxlLCBjbWQsIGFyZyk7CisJCXJldHVybiByZXQ7CisJfSBlbHNlIGlmIChmaC0+Y2hhbm5lbF9pZCA9PSBTUkFNX0NIMTEpIHsKKwkJcmV0ID0gdmlkZW9faW9jdGxfdXBzdHJlYW0xMShmaWxlLCBjbWQsIGFyZyk7CisJCXJldCA9IHZpZGVvX2lvY3RsX3NldChmaWxlLCBjbWQsIGFyZyk7CisJCXJldHVybiByZXQ7CisJfQogCi0gICAgcmV0dXJuIHZpZGVvX2lvY3RsMihmaWxlLCBjbWQsIGFyZyk7CisJcmV0dXJuIHZpZGVvX2lvY3RsMihmaWxlLCBjbWQsIGFyZyk7CiB9CiAKIC8qIGV4cG9ydGVkIHN0dWZmICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHZpZGVvX2ZvcHMgPSB7Ci0gICAgICAgLm93bmVyID0gVEhJU19NT0RVTEUsCi0gICAgICAgLm9wZW4gPSB2aWRlb19vcGVuLAotICAgICAgIC5yZWxlYXNlID0gdmlkZW9fcmVsZWFzZSwKLSAgICAgICAucmVhZCA9IHZpZGVvX3JlYWQsCi0gICAgICAgLnBvbGwgPSB2aWRlb19wb2xsLAotICAgICAgIC5tbWFwID0gY3gyNTgyMV92aWRlb19tbWFwLAotICAgICAgIC5pb2N0bCA9IGN4MjU4MjFfdmlkZW9faW9jdGwsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSB2aWRlb19vcGVuLAorCS5yZWxlYXNlID0gdmlkZW9fcmVsZWFzZSwKKwkucmVhZCA9IHZpZGVvX3JlYWQsCisJLnBvbGwgPSB2aWRlb19wb2xsLAorCS5tbWFwID0gY3gyNTgyMV92aWRlb19tbWFwLAorCS5pb2N0bCA9IGN4MjU4MjFfdmlkZW9faW9jdGwsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIHZpZGVvX2lvY3RsX29wcyA9IHsKLSAgICAgICAudmlkaW9jX3F1ZXJ5Y2FwID0gY3gyNTgyMV92aWRpb2NfcXVlcnljYXAsCi0gICAgICAgLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfZW51bV9mbXRfdmlkX2NhcCwKLSAgICAgICAudmlkaW9jX2dfZm10X3ZpZF9jYXAgPSBjeDI1ODIxX3ZpZGlvY19nX2ZtdF92aWRfY2FwLAotICAgICAgIC52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwLAotICAgICAgIC52aWRpb2Nfc19mbXRfdmlkX2NhcCA9IHZpZGlvY19zX2ZtdF92aWRfY2FwLAotICAgICAgIC52aWRpb2NfcmVxYnVmcyA9IGN4MjU4MjFfdmlkaW9jX3JlcWJ1ZnMsCi0gICAgICAgLnZpZGlvY19xdWVyeWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5YnVmLAotICAgICAgIC52aWRpb2NfcWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3FidWYsCi0gICAgICAgLnZpZGlvY19kcWJ1ZiA9IHZpZGlvY19kcWJ1ZiwKKwkudmlkaW9jX3F1ZXJ5Y2FwID0gY3gyNTgyMV92aWRpb2NfcXVlcnljYXAsCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfZW51bV9mbXRfdmlkX2NhcCwKKwkudmlkaW9jX2dfZm10X3ZpZF9jYXAgPSBjeDI1ODIxX3ZpZGlvY19nX2ZtdF92aWRfY2FwLAorCS52aWRpb2NfdHJ5X2ZtdF92aWRfY2FwID0gY3gyNTgyMV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwLAorCS52aWRpb2Nfc19mbXRfdmlkX2NhcCA9IHZpZGlvY19zX2ZtdF92aWRfY2FwLAorCS52aWRpb2NfcmVxYnVmcyA9IGN4MjU4MjFfdmlkaW9jX3JlcWJ1ZnMsCisJLnZpZGlvY19xdWVyeWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5YnVmLAorCS52aWRpb2NfcWJ1ZiA9IGN4MjU4MjFfdmlkaW9jX3FidWYsCisJLnZpZGlvY19kcWJ1ZiA9IHZpZGlvY19kcWJ1ZiwKICNpZmRlZiBUVU5FUl9GTEFHCi0gICAgICAgLnZpZGlvY19zX3N0ZCA9IGN4MjU4MjFfdmlkaW9jX3Nfc3RkLAotICAgICAgIC52aWRpb2NfcXVlcnlzdGQgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeXN0ZCwKKwkudmlkaW9jX3Nfc3RkID0gY3gyNTgyMV92aWRpb2Nfc19zdGQsCisJLnZpZGlvY19xdWVyeXN0ZCA9IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5c3RkLAogI2VuZGlmCi0gICAgICAgLnZpZGlvY19jcm9wY2FwID0gY3gyNTgyMV92aWRpb2NfY3JvcGNhcCwKLSAgICAgICAudmlkaW9jX3NfY3JvcCA9IGN4MjU4MjFfdmlkaW9jX3NfY3JvcCwKLSAgICAgICAudmlkaW9jX2dfY3JvcCA9IGN4MjU4MjFfdmlkaW9jX2dfY3JvcCwKLSAgICAgICAudmlkaW9jX2VudW1faW5wdXQgPSBjeDI1ODIxX3ZpZGlvY19lbnVtX2lucHV0LAotICAgICAgIC52aWRpb2NfZ19pbnB1dCA9IGN4MjU4MjFfdmlkaW9jX2dfaW5wdXQsCi0gICAgICAgLnZpZGlvY19zX2lucHV0ID0gY3gyNTgyMV92aWRpb2Nfc19pbnB1dCwKLSAgICAgICAudmlkaW9jX2dfY3RybCA9IGN4MjU4MjFfdmlkaW9jX2dfY3RybCwKLSAgICAgICAudmlkaW9jX3NfY3RybCA9IHZpZGlvY19zX2N0cmwsCi0gICAgICAgLnZpZGlvY19xdWVyeWN0cmwgPSBjeDI1ODIxX3ZpZGlvY19xdWVyeWN0cmwsCi0gICAgICAgLnZpZGlvY19zdHJlYW1vbiA9IHZpZGlvY19zdHJlYW1vbiwKLSAgICAgICAudmlkaW9jX3N0cmVhbW9mZiA9IHZpZGlvY19zdHJlYW1vZmYsCi0gICAgICAgLnZpZGlvY19sb2dfc3RhdHVzID0gdmlkaW9jX2xvZ19zdGF0dXMsCi0gICAgICAgLnZpZGlvY19nX3ByaW9yaXR5ID0gY3gyNTgyMV92aWRpb2NfZ19wcmlvcml0eSwKLSAgICAgICAudmlkaW9jX3NfcHJpb3JpdHkgPSBjeDI1ODIxX3ZpZGlvY19zX3ByaW9yaXR5LAorCS52aWRpb2NfY3JvcGNhcCA9IGN4MjU4MjFfdmlkaW9jX2Nyb3BjYXAsCisJLnZpZGlvY19zX2Nyb3AgPSBjeDI1ODIxX3ZpZGlvY19zX2Nyb3AsCisJLnZpZGlvY19nX2Nyb3AgPSBjeDI1ODIxX3ZpZGlvY19nX2Nyb3AsCisJLnZpZGlvY19lbnVtX2lucHV0ID0gY3gyNTgyMV92aWRpb2NfZW51bV9pbnB1dCwKKwkudmlkaW9jX2dfaW5wdXQgPSBjeDI1ODIxX3ZpZGlvY19nX2lucHV0LAorCS52aWRpb2Nfc19pbnB1dCA9IGN4MjU4MjFfdmlkaW9jX3NfaW5wdXQsCisJLnZpZGlvY19nX2N0cmwgPSBjeDI1ODIxX3ZpZGlvY19nX2N0cmwsCisJLnZpZGlvY19zX2N0cmwgPSB2aWRpb2Nfc19jdHJsLAorCS52aWRpb2NfcXVlcnljdHJsID0gY3gyNTgyMV92aWRpb2NfcXVlcnljdHJsLAorCS52aWRpb2Nfc3RyZWFtb24gPSB2aWRpb2Nfc3RyZWFtb24sCisJLnZpZGlvY19zdHJlYW1vZmYgPSB2aWRpb2Nfc3RyZWFtb2ZmLAorCS52aWRpb2NfbG9nX3N0YXR1cyA9IHZpZGlvY19sb2dfc3RhdHVzLAorCS52aWRpb2NfZ19wcmlvcml0eSA9IGN4MjU4MjFfdmlkaW9jX2dfcHJpb3JpdHksCisJLnZpZGlvY19zX3ByaW9yaXR5ID0gY3gyNTgyMV92aWRpb2Nfc19wcmlvcml0eSwKICNpZmRlZiBUVU5FUl9GTEFHCi0gICAgICAgLnZpZGlvY19nX3R1bmVyID0gY3gyNTgyMV92aWRpb2NfZ190dW5lciwKLSAgICAgICAudmlkaW9jX3NfdHVuZXIgPSBjeDI1ODIxX3ZpZGlvY19zX3R1bmVyLAotICAgICAgIC52aWRpb2NfZ19mcmVxdWVuY3kgPSBjeDI1ODIxX3ZpZGlvY19nX2ZyZXF1ZW5jeSwKLSAgICAgICAudmlkaW9jX3NfZnJlcXVlbmN5ID0gY3gyNTgyMV92aWRpb2Nfc19mcmVxdWVuY3ksCisJLnZpZGlvY19nX3R1bmVyID0gY3gyNTgyMV92aWRpb2NfZ190dW5lciwKKwkudmlkaW9jX3NfdHVuZXIgPSBjeDI1ODIxX3ZpZGlvY19zX3R1bmVyLAorCS52aWRpb2NfZ19mcmVxdWVuY3kgPSBjeDI1ODIxX3ZpZGlvY19nX2ZyZXF1ZW5jeSwKKwkudmlkaW9jX3NfZnJlcXVlbmN5ID0gY3gyNTgyMV92aWRpb2Nfc19mcmVxdWVuY3ksCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCi0gICAgICAgLnZpZGlvY19nX3JlZ2lzdGVyID0gY3gyNTgyMV92aWRpb2NfZ19yZWdpc3RlciwKLSAgICAgICAudmlkaW9jX3NfcmVnaXN0ZXIgPSBjeDI1ODIxX3ZpZGlvY19zX3JlZ2lzdGVyLAorCS52aWRpb2NfZ19yZWdpc3RlciA9IGN4MjU4MjFfdmlkaW9jX2dfcmVnaXN0ZXIsCisJLnZpZGlvY19zX3JlZ2lzdGVyID0gY3gyNTgyMV92aWRpb2Nfc19yZWdpc3RlciwKICNlbmRpZgogfTsKIAogc3RydWN0IHZpZGVvX2RldmljZSBjeDI1ODIxX3ZpZGVvaW9jdGxfdGVtcGxhdGUgPSB7Ci0JICAgICAgIC5uYW1lID0gImN4MjU4MjEtdmlkZW9pb2N0bCIsCi0JICAgICAgIC5mb3BzID0gJnZpZGVvX2ZvcHMsCi0JICAgICAgIC5pb2N0bF9vcHMgPSAmdmlkZW9faW9jdGxfb3BzLAotCSAgICAgICAudHZub3JtcyA9IENYMjU4MjFfTk9STVMsCi0JICAgICAgIC5jdXJyZW50X25vcm0gPSBWNEwyX1NURF9OVFNDX00sCisJLm5hbWUgPSAiY3gyNTgyMS12aWRlb2lvY3RsIiwKKwkuZm9wcyA9ICZ2aWRlb19mb3BzLAorCS5pb2N0bF9vcHMgPSAmdmlkZW9faW9jdGxfb3BzLAorCS50dm5vcm1zID0gQ1gyNTgyMV9OT1JNUywKKwkuY3VycmVudF9ub3JtID0gVjRMMl9TVERfTlRTQ19NLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEtdmlkZW8uaAppbmRleCBmNGVlODA1Li5kMGQ5NTM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLXZpZGVvLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS12aWRlby5oCkBAIC02Myw3ICs2Myw3IEBACiAjZGVmaW5lIFJFR19SRUFECQkgICAgOTAwCiAjZGVmaW5lIFJFR19XUklURQkJICAgIDkwMQogI2RlZmluZSBNRURVU0FfUkVBRAkJICAgIDkxMAotI2RlZmluZSBNRURVU0FfV1JJVEUJCTkxMQorI2RlZmluZSBNRURVU0FfV1JJVEUJCSAgICA5MTEKIAogZXh0ZXJuIHN0cnVjdCBzcmFtX2NoYW5uZWwgKmNoYW5uZWwwOwogZXh0ZXJuIHN0cnVjdCBzcmFtX2NoYW5uZWwgKmNoYW5uZWwxOwpAQCAtODcsNyArODcsNyBAQAogZXh0ZXJuIHN0cnVjdCBjeDI1ODIxX2RhdGEgdGltZW91dF9kYXRhW01BWF9WSURfQ0hBTk5FTF9OVU1dOwogCiBleHRlcm4gdm9pZCBjeDI1ODIxX2R1bXBfdmlkZW9fcXVldWUoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsCi0JCQkgICAgIHN0cnVjdCBjeDI1ODIxX2RtYXF1ZXVlICpxKTsKKwkJCQkgICAgIHN0cnVjdCBjeDI1ODIxX2RtYXF1ZXVlICpxKTsKIGV4dGVybiB2b2lkIGN4MjU4MjFfdmlkZW9fd2FrZXVwKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LAogCQkJCSBzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSAqcSwgdTMyIGNvdW50KTsKIApAQCAtOTYsMTEgKzk2LDExIEBACiAjZW5kaWYKIAogZXh0ZXJuIGludCBjeDI1ODIxX3Jlc19nZXQoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIHN0cnVjdCBjeDI1ODIxX2ZoICpmaCwKLQkJICAgdW5zaWduZWQgaW50IGJpdCk7CisJCQkgICB1bnNpZ25lZCBpbnQgYml0KTsKIGV4dGVybiBpbnQgY3gyNTgyMV9yZXNfY2hlY2soc3RydWN0IGN4MjU4MjFfZmggKmZoLCB1bnNpZ25lZCBpbnQgYml0KTsKIGV4dGVybiBpbnQgY3gyNTgyMV9yZXNfbG9ja2VkKHN0cnVjdCBjeDI1ODIxX2ZoICpmaCwgdW5zaWduZWQgaW50IGJpdCk7CiBleHRlcm4gdm9pZCBjeDI1ODIxX3Jlc19mcmVlKHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCBzdHJ1Y3QgY3gyNTgyMV9maCAqZmgsCi0JCSAgICAgdW5zaWduZWQgaW50IGJpdHMpOworCQkJICAgICB1bnNpZ25lZCBpbnQgYml0cyk7CiBleHRlcm4gaW50IGN4MjU4MjFfdmlkZW9fbXV4KHN0cnVjdCBjeDI1ODIxX2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgaW5wdXQpOwogZXh0ZXJuIGludCBjeDI1ODIxX3N0YXJ0X3ZpZGVvX2RtYShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKIAkJCQkgICBzdHJ1Y3QgY3gyNTgyMV9kbWFxdWV1ZSAqcSwKQEAgLTExNSw2MyArMTE1LDc0IEBACiBleHRlcm4gaW50IGN4MjU4MjFfZ2V0X2Zvcm1hdF9zaXplKHZvaWQpOwogCiBleHRlcm4gaW50IGN4MjU4MjFfYnVmZmVyX3NldHVwKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwgdW5zaWduZWQgaW50ICpjb3VudCwKLQkJCXVuc2lnbmVkIGludCAqc2l6ZSk7Ci1leHRlcm4gaW50IGN4MjU4MjFfYnVmZmVyX3ByZXBhcmUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLCBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwKLQkJCSAgZW51bSB2NGwyX2ZpZWxkIGZpZWxkKTsKKwkJCQl1bnNpZ25lZCBpbnQgKnNpemUpOworZXh0ZXJuIGludCBjeDI1ODIxX2J1ZmZlcl9wcmVwYXJlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwKKwkJCQkgIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiLAorCQkJCSAgZW51bSB2NGwyX2ZpZWxkIGZpZWxkKTsKIGV4dGVybiB2b2lkIGN4MjU4MjFfYnVmZmVyX3JlbGVhc2Uoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLAotCQkJICAgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpOworCQkJCSAgIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKTsKIGV4dGVybiBzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKmdldF9xdWV1ZShzdHJ1Y3QgY3gyNTgyMV9maCAqZmgpOwogZXh0ZXJuIGludCBjeDI1ODIxX2dldF9yZXNvdXJjZShzdHJ1Y3QgY3gyNTgyMV9maCAqZmgsIGludCByZXNvdXJjZSk7CiBleHRlcm4gaW50IGN4MjU4MjFfdmlkZW9fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwogZXh0ZXJuIGludCBjeDI1ODIxX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOworCQkJCQkgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZik7CiBleHRlcm4gaW50IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKTsKKwkJCQkgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApOwogZXh0ZXJuIGludCBjeDI1ODIxX3ZpZGlvY19lbnVtX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCSAgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpOworCQkJCQkgICBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKTsKIGV4dGVybiBpbnQgY3gyNTgyMV92aWRpb2NfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnApOworCQkJCSAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnApOwogZXh0ZXJuIGludCBjeDI1ODIxX3ZpZGlvY19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqcCk7Ci1leHRlcm4gaW50IGN4MjU4MjFfdmlkaW9jX3FidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2J1ZmZlciAqcCk7Ci1leHRlcm4gaW50IGN4MjU4MjFfdmlkaW9jX3Nfc3RkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB2NGwyX3N0ZF9pZCAqIHR2bm9ybXMpOworCQkJCSAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqcCk7CitleHRlcm4gaW50IGN4MjU4MjFfdmlkaW9jX3FidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgICAgc3RydWN0IHY0bDJfYnVmZmVyICpwKTsKK2V4dGVybiBpbnQgY3gyNTgyMV92aWRpb2Nfc19zdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJdjRsMl9zdGRfaWQgKnR2bm9ybXMpOwogZXh0ZXJuIGludCBjeDI1ODIxX2VudW1faW5wdXQoc3RydWN0IGN4MjU4MjFfZGV2ICpkZXYsIHN0cnVjdCB2NGwyX2lucHV0ICppKTsKIGV4dGVybiBpbnQgY3gyNTgyMV92aWRpb2NfZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgICAgc3RydWN0IHY0bDJfaW5wdXQgKmkpOwotZXh0ZXJuIGludCBjeDI1ODIxX3ZpZGlvY19nX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgKmkpOwotZXh0ZXJuIGludCBjeDI1ODIxX3ZpZGlvY19zX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgaSk7CisJCQkJICAgICBzdHJ1Y3QgdjRsMl9pbnB1dCAqaSk7CitleHRlcm4gaW50IGN4MjU4MjFfdmlkaW9jX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJICB1bnNpZ25lZCBpbnQgKmkpOworZXh0ZXJuIGludCBjeDI1ODIxX3ZpZGlvY19zX2lucHV0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCSAgdW5zaWduZWQgaW50IGkpOwogZXh0ZXJuIGludCBjeDI1ODIxX3ZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgc3RydWN0IHY0bDJfY29udHJvbCAqY3RsKTsKKwkJCQkgc3RydWN0IHY0bDJfY29udHJvbCAqY3RsKTsKIGV4dGVybiBpbnQgY3gyNTgyMV92aWRpb2NfZ19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOworCQkJCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpOwogZXh0ZXJuIGludCBjeDI1ODIxX3ZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZik7CisJCQkJICAgICAgc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKTsKIGV4dGVybiBpbnQgY3gyNTgyMV9zZXRfZnJlcShzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwgc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKTsKIGV4dGVybiBpbnQgY3gyNTgyMV92aWRpb2Nfc19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgdjRsMl9mcmVxdWVuY3kgKmYpOworCQkJCSAgICAgIHN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZik7CiBleHRlcm4gaW50IGN4MjU4MjFfdmlkaW9jX2dfcmVnaXN0ZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAotCQkJICAgICBzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZyk7CisJCQkJICAgICBzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZyk7CiBleHRlcm4gaW50IGN4MjU4MjFfdmlkaW9jX3NfcmVnaXN0ZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAotCQkJICAgICBzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZyk7Ci1leHRlcm4gaW50IGN4MjU4MjFfdmlkaW9jX2dfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX3R1bmVyICp0KTsKLWV4dGVybiBpbnQgY3gyNTgyMV92aWRpb2Nfc190dW5lcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfdHVuZXIgKnQpOworCQkJCSAgICAgc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyICpyZWcpOworZXh0ZXJuIGludCBjeDI1ODIxX3ZpZGlvY19nX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCSAgc3RydWN0IHY0bDJfdHVuZXIgKnQpOworZXh0ZXJuIGludCBjeDI1ODIxX3ZpZGlvY19zX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCSAgc3RydWN0IHY0bDJfdHVuZXIgKnQpOwogCiBleHRlcm4gaW50IGN4MjU4MjFfaXNfdmFsaWRfd2lkdGgodTMyIHdpZHRoLCB2NGwyX3N0ZF9pZCB0dm5vcm0pOwogZXh0ZXJuIGludCBjeDI1ODIxX2lzX3ZhbGlkX2hlaWdodCh1MzIgaGVpZ2h0LCB2NGwyX3N0ZF9pZCB0dm5vcm0pOwogCi1leHRlcm4gaW50IGN4MjU4MjFfdmlkaW9jX2dfcHJpb3JpdHkoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmYsIGVudW0gdjRsMl9wcmlvcml0eSAqcCk7CitleHRlcm4gaW50IGN4MjU4MjFfdmlkaW9jX2dfcHJpb3JpdHkoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmYsCisJCQkJICAgICBlbnVtIHY0bDJfcHJpb3JpdHkgKnApOwogZXh0ZXJuIGludCBjeDI1ODIxX3ZpZGlvY19zX3ByaW9yaXR5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmLAotCQkJICAgICBlbnVtIHY0bDJfcHJpb3JpdHkgcHJpbyk7CisJCQkJICAgICBlbnVtIHY0bDJfcHJpb3JpdHkgcHJpbyk7CiAKIGV4dGVybiBpbnQgY3gyNTgyMV92aWRpb2NfcXVlcnljdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJICAgIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmwpOworCQkJCSAgICBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnFjdHJsKTsKIGV4dGVybiBpbnQgY3gyNTgyMV9zZXRfY29udHJvbChzdHJ1Y3QgY3gyNTgyMV9kZXYgKmRldiwKIAkJCSAgICAgICBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsLCBpbnQgY2hhbl9udW0pOwogCiBleHRlcm4gaW50IGN4MjU4MjFfdmlkaW9jX2Nyb3BjYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAotCQkJICBzdHJ1Y3QgdjRsMl9jcm9wY2FwICpjcm9wY2FwKTsKLWV4dGVybiBpbnQgY3gyNTgyMV92aWRpb2Nfc19jcm9wKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9jcm9wICpjcm9wKTsKLWV4dGVybiBpbnQgY3gyNTgyMV92aWRpb2NfZ19jcm9wKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9jcm9wICpjcm9wKTsKKwkJCQkgIHN0cnVjdCB2NGwyX2Nyb3BjYXAgKmNyb3BjYXApOworZXh0ZXJuIGludCBjeDI1ODIxX3ZpZGlvY19zX2Nyb3Aoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJIHN0cnVjdCB2NGwyX2Nyb3AgKmNyb3ApOworZXh0ZXJuIGludCBjeDI1ODIxX3ZpZGlvY19nX2Nyb3Aoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJIHN0cnVjdCB2NGwyX2Nyb3AgKmNyb3ApOwogCi1leHRlcm4gaW50IGN4MjU4MjFfdmlkaW9jX3F1ZXJ5c3RkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCB2NGwyX3N0ZF9pZCAqIG5vcm0pOworZXh0ZXJuIGludCBjeDI1ODIxX3ZpZGlvY19xdWVyeXN0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkgICB2NGwyX3N0ZF9pZCAqbm9ybSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEuaCBiL2RyaXZlcnMvc3RhZ2luZy9jeDI1ODIxL2N4MjU4MjEuaAppbmRleCA2MjMwMjQzLi5kYjI2MTViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3gyNTgyMS9jeDI1ODIxLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4MjU4MjEvY3gyNTgyMS5oCkBAIC0xNzksMTUgKzE3OSwxNyBAQAogCXUzMiBncGlvMCwgZ3BpbzEsIGdwaW8yLCBncGlvMzsKIH07CiAKLXR5cGVkZWYgZW51bSB7CitlbnVtIHBvcnQgewogCUNYMjU4MjFfVU5ERUZJTkVEID0gMCwKIAlDWDI1ODIxX1JBVywKIAlDWDI1ODIxXzI2NAotfSBwb3J0X3Q7Cit9OwogCiBzdHJ1Y3QgY3gyNTgyMV9ib2FyZCB7CiAJY2hhciAqbmFtZTsKLQlwb3J0X3QgcG9ydGEsIHBvcnRiLCBwb3J0YzsKKwllbnVtIHBvcnQgcG9ydGE7CisJZW51bSBwb3J0IHBvcnRiOworCWVudW0gcG9ydCBwb3J0YzsKIAl1bnNpZ25lZCBpbnQgdHVuZXJfdHlwZTsKIAl1bnNpZ25lZCBpbnQgcmFkaW9fdHlwZTsKIAl1bnNpZ25lZCBjaGFyIHR1bmVyX2FkZHI7CkBAIC0zMDgsNyArMzEwLDcgQEAKIAlpbnQgX2F1ZGlvZmlsZV9zdGF0dXM7CiAJaW50IF9hdWRpb19saW5lc19jb3VudDsKIAlpbnQgX2F1ZGlvZnJhbWVfY291bnQ7Ci0JaW50IF9hdWRpb191cHN0cmVhbV9jaGFubmVsX3NlbGVjdDsKKwlpbnQgX2F1ZGlvX3Vwc3RyZWFtX2NoYW5uZWw7CiAJaW50IF9sYXN0X2luZGV4X2lycTsgICAgLyogVGhlIGxhc3QgaW50ZXJydXB0IGluZGV4IHByb2Nlc3NlZC4gKi8KIAogCV9fbGUzMiAqX3Jpc2NfYXVkaW9fam1wX2FkZHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3hkMjA5OS9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9jeGQyMDk5L01ha2VmaWxlCmluZGV4IDcyYjE0NTUuLjY0Y2ZjNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jeGQyMDk5L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeGQyMDk5L01ha2VmaWxlCkBAIC0xLDUgKzEsNSBAQAogb2JqLSQoQ09ORklHX0RWQl9DWEQyMDk5KSArPSBjeGQyMDk5Lm8KIAotRVhUUkFfQ0ZMQUdTICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvCi1FWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvCitjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8KK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy8KK2NjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvbGludXguYwppbmRleCA5Y2VkMDhmLi4yNGUwMDljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3h0MWUxL2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9saW51eC5jCkBAIC0xMDE3LDEzICsxMDE3LDcgQEAKICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICAgICBpZiAocmVxdWVzdF9pcnEgKGlycTAsICZjNF9saW51eF9pbnRlcnJ1cHQsCi0jaWYgZGVmaW5lZChTQkVfSVNSX1RBU0tMRVQpCi0gICAgICAgICAgICAgICAgICAgICBJUlFGX0RJU0FCTEVEIHwgSVJRRl9TSEFSRUQsCi0jZWxpZiBkZWZpbmVkKFNCRV9JU1JfSU1NRURJQVRFKQotICAgICAgICAgICAgICAgICAgICAgSVJRRl9ESVNBQkxFRCB8IElSUUZfU0hBUkVELAotI2VsaWYgZGVmaW5lZChTQkVfSVNSX0lOTElORSkKICAgICAgICAgICAgICAgICAgICAgIElSUUZfU0hBUkVELAotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICBuZGV2LT5uYW1lLCBuZGV2KSkKICAgICB7CiAgICAgICAgIHByX3dhcm5pbmcoIiVzOiBNVVNZQ0MgY291bGQgbm90IGdldCBpcnE6ICVkXG4iLCBuZGV2LT5uYW1lLCBpcnEwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeHQxZTEvc2JlY29tX2lubGluZV9saW51eC5oIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9zYmVjb21faW5saW5lX2xpbnV4LmgKaW5kZXggYzA1NjNlNi4uOWVhMmMwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9zYmVjb21faW5saW5lX2xpbnV4LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4dDFlMS9zYmVjb21faW5saW5lX2xpbnV4LmgKQEAgLTQzLDgxICs0MywxNyBAQAogICovCiAKIAotI2lmIGRlZmluZWQgKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkIChfX05ldEJTRF9fKQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2Vsc2UKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgISBkZWZpbmVkKF9fU01QX18pCi0jZGVmaW5lIF9fU01QX18KLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX01PRFZFUlNJT05TKSAmJiBkZWZpbmVkKE1PRFVMRSkgJiYgISBkZWZpbmVkKE1PRFZFUlNJT05TKQotI2RlZmluZSBNT0RWRVJTSU9OUwotI2VuZGlmCi0KLSNpZmRlZiBNT0RVTEUKLSNpZmRlZiBNT0RWRVJTSU9OUwotI2luY2x1ZGUgPGNvbmZpZy9tb2R2ZXJzaW9ucy5oPgotI2VuZGlmCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jZW5kaWYKLSNlbmRpZgotCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+ICAgICAgIC8qIHJlc29sdmVzIGttYWxsb2MgcmVmZXJlbmNlcyAqLwogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPiAgICAgICAvKiByZXNvbHZlcyBza2IgcmVmZXJlbmNlcyAqLwogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPiAgICAvKiByZXNvbHZlcyBkZXZfa3JlZV9za2JfYW55ICovCiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPiAgICAgIC8qIHJlc29sdmVzIGNwdV90b19sZTMyICovCiAKLSNpZiAwCi0KLS8qKiogUE9SVCBQT0lOVCBXQVJOSU5HCi0gKioqCi0gKioqIFVuZGVyIExpbnV4IDIuNiBpdCBoYXMgYmVlbiBmb3VuZCB0aGF0IGNvbXBpbGVyIGlzIHJlLW9yZGVyaW5nCi0gKioqIGluLWxpbmVkIHBjaV93cml0ZV8zMigpIGZ1bmN0aW9ucyB0byB0aGUgZGV0cmVtZW50IG9mIGNvcnJlY3QKLSAqKiogaGFyZHdhcmUgc2V0dXAuICBUaGVyZWZvcmUsIGlubGluaW5nIG9mIFBDSSBhY2Nlc3NlcyBoYXMgYmVlbgotICoqKiBkZS1pbXBsZW1lbnRlZCwgYW5kIHN1YnJvdXRpbmUgY2FsbHMgaGF2ZSBiZWVuIGltcGxlbWVudGVkLgotICoqKi8KLQotc3RhdGljIGlubGluZSB1X2ludDMyX3QKLXBjaV9yZWFkXzMyICh1X2ludDMyX3QgKnApCi17Ci0jaWZkZWYgRkxPV19ERUJVRwotICAgIHVfaW50MzJfdCAgIHY7Ci0KLSAgICBGTFVTSF9QQ0lfUkVBRCAoKTsKLSAgICB2ID0gbGUzMl90b19jcHUgKCpwKTsKLSAgICBpZiAoY3h0MWUxX2xvZ19sZXZlbCA+PSBMT0dfREVCVUcpCi0gICAgICAgIHByX2luZm8oInBjaV9yZWFkIDogJXggPSAleFxuIiwgKHVfaW50MzJfdCkgcCwgdik7Ci0gICAgcmV0dXJuIHY7Ci0jZWxzZQotICAgICAgICAgICAgICAgIEZMVVNIX1BDSV9SRUFEICgpOyAgICAgIC8qICovCi0gICAgcmV0dXJuIGxlMzJfdG9fY3B1ICgqcCk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1wY2lfd3JpdGVfMzIgKHVfaW50MzJfdCAqcCwgdV9pbnQzMl90IHYpCi17Ci0jaWZkZWYgRkxPV19ERUJVRwotICAgIGlmIChjeHQxZTFfbG9nX2xldmVsID49IExPR19ERUJVRykKLSAgICAgICAgcHJfaW5mbygicGNpX3dyaXRlOiAleCA9ICV4XG4iLCAodV9pbnQzMl90KSBwLCB2KTsKLSNlbmRpZgotICAgICpwID0gY3B1X3RvX2xlMzIgKHYpOwotICAgIEZMVVNIX1BDSV9XUklURSAoKTsgICAgICAgICAgICAgLyogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBmcm9tIHJvdXRpbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3aGljaCBkbyBtdWx0aXBsZSByZWdpc3RlciB3cml0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdoaWNoIHRoZW1zZWx2ZXMgbmVlZCBmbHVzaGluZyBiZXR3ZWVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3cml0ZXMgaW4gb3JkZXIgdG8gZ3VhcmFudGVlIHdyaXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvcmRlcmluZy4gIEl0IGlzIGxlc3MgY29kZS1jdW1iZXJzb21lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0byBmbHVzaCBoZXJlLWluIHRoZW4gdG8gaW52ZXN0aWdhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBjb2RlIHRoZSBtYW55IG90aGVyIHJlZ2lzdGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3cml0aW5nIHJvdXRpbmVzLiAqLwotfQotI2Vsc2UKIC8qIGZvcndhcmQgcmVmZXJlbmNlICovCiB1X2ludDMyX3QgICBwY2lfcmVhZF8zMiAodV9pbnQzMl90ICpwKTsKIHZvaWQgICAgICAgIHBjaV93cml0ZV8zMiAodV9pbnQzMl90ICpwLCB1X2ludDMyX3Qgdik7CiAKLSNlbmRpZgotCiAKIC8qCiAgKiBzeXN0ZW0gZGVwZW5kZW50IGNhbGxiYWNrcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2R0MzE1NXY0bC9kdDMxNTV2NGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTV2NGwvZHQzMTU1djRsLmMKaW5kZXggMDVhYTQxYy4uNWIyMTJkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2R0MzE1NXY0bC9kdDMxNTV2NGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1djRsL2R0MzE1NXY0bC5jCkBAIC0xOCw2ICsxOCw3IEBACiAgKiAgIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLiAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC0xMDMsMTggKzEwNCwxMyBAQAogCWlvd3JpdGUzMigodG1wPDwxNykgfCBJSUNfUkVBRCwgYWRkciArIElJQ19DU1IyKTsKIAltbWlvd2IoKTsKIAl1ZGVsYXkoNDUpOyAvKiB3YWl0IGF0IGxlYXN0IDQzIHVzZWMgZm9yIE5FV19DWUNMRSB0byBjbGVhciAqLwotCWlmIChpb3JlYWQzMihhZGRyICsgSUlDX0NTUjIpICYgTkVXX0NZQ0xFKSB7Ci0JCS8qIGVycm9yOiBORVdfQ1lDTEUgbm90IGNsZWFyZWQgKi8KLQkJcHJpbnRrKEtFUk5fRVJSICJkdDMxNTU6IE5FV19DWUNMRSBub3QgY2xlYXJlZFxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KKwlpZiAoaW9yZWFkMzIoYWRkciArIElJQ19DU1IyKSAmIE5FV19DWUNMRSkKKwkJcmV0dXJuIC1FSU87IC8qIGVycm9yOiBORVdfQ1lDTEUgbm90IGNsZWFyZWQgKi8KIAl0bXAgPSBpb3JlYWQzMihhZGRyICsgSUlDX0NTUjEpOwogCWlmICh0bXAgJiBESVJFQ1RfQUJPUlQpIHsKLQkJLyogZXJyb3I6IERJUkVDVF9BQk9SVCBzZXQgKi8KLQkJcHJpbnRrKEtFUk5fRVJSICJkdDMxNTU6IERJUkVDVF9BQk9SVCBzZXRcbiIpOwogCQkvKiByZXNldCBESVJFQ1RfQUJPUlQgYml0ICovCiAJCWlvd3JpdGUzMihESVJFQ1RfQUJPUlQsIGFkZHIgKyBJSUNfQ1NSMSk7Ci0JCXJldHVybiAtRUlPOworCQlyZXR1cm4gLUVJTzsgLyogZXJyb3I6IERJUkVDVF9BQk9SVCBzZXQgKi8KIAl9CiAJKmRhdGEgPSB0bXA+PjI0OwogCXJldHVybiAwOwpAQCAtMTQwLDE3ICsxMzYsMTIgQEAKIAlpb3dyaXRlMzIoKHRtcDw8MTcpIHwgSUlDX1dSSVRFIHwgZGF0YSwgYWRkciArIElJQ19DU1IyKTsKIAltbWlvd2IoKTsKIAl1ZGVsYXkoNjUpOyAvKiB3YWl0IGF0IGxlYXN0IDYzIHVzZWMgZm9yIE5FV19DWUNMRSB0byBjbGVhciAqLwotCWlmIChpb3JlYWQzMihhZGRyICsgSUlDX0NTUjIpICYgTkVXX0NZQ0xFKSB7Ci0JCS8qIGVycm9yOiBORVdfQ1lDTEUgbm90IGNsZWFyZWQgKi8KLQkJcHJpbnRrKEtFUk5fRVJSICJkdDMxNTU6IE5FV19DWUNMRSBub3QgY2xlYXJlZFxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KKwlpZiAoaW9yZWFkMzIoYWRkciArIElJQ19DU1IyKSAmIE5FV19DWUNMRSkKKwkJcmV0dXJuIC1FSU87IC8qIGVycm9yOiBORVdfQ1lDTEUgbm90IGNsZWFyZWQgKi8KIAlpZiAoaW9yZWFkMzIoYWRkciArIElJQ19DU1IxKSAmIERJUkVDVF9BQk9SVCkgewotCQkvKiBlcnJvcjogRElSRUNUX0FCT1JUIHNldCAqLwotCQlwcmludGsoS0VSTl9FUlIgImR0MzE1NTogRElSRUNUX0FCT1JUIHNldFxuIik7CiAJCS8qIHJlc2V0IERJUkVDVF9BQk9SVCBiaXQgKi8KIAkJaW93cml0ZTMyKERJUkVDVF9BQk9SVCwgYWRkciArIElJQ19DU1IxKTsKLQkJcmV0dXJuIC1FSU87CisJCXJldHVybiAtRUlPOyAvKiBlcnJvcjogRElSRUNUX0FCT1JUIHNldCAqLwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTE4NiwxNyArMTc3LDEyIEBACiB7CiAJaWYgKGlvcmVhZDMyKGFkZHIgKyBJSUNfQ1NSMikgJiBORVdfQ1lDTEUpCiAJCXVkZWxheSg2NSk7IC8qIHdhaXQgYXQgbGVhc3QgNjMgdXNlYyBmb3IgTkVXX0NZQ0xFIHRvIGNsZWFyICovCi0JaWYgKGlvcmVhZDMyKGFkZHIgKyBJSUNfQ1NSMikgJiBORVdfQ1lDTEUpIHsKLQkJLyogZXJyb3I6IE5FV19DWUNMRSBub3QgY2xlYXJlZCAqLwotCQlwcmludGsoS0VSTl9FUlIgImR0MzE1NTogTkVXX0NZQ0xFIG5vdCBjbGVhcmVkXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQorCWlmIChpb3JlYWQzMihhZGRyICsgSUlDX0NTUjIpICYgTkVXX0NZQ0xFKQorCQlyZXR1cm4gLUVJTzsgLyogZXJyb3I6IE5FV19DWUNMRSBub3QgY2xlYXJlZCAqLwogCWlmIChpb3JlYWQzMihhZGRyICsgSUlDX0NTUjEpICYgRElSRUNUX0FCT1JUKSB7Ci0JCS8qIGVycm9yOiBESVJFQ1RfQUJPUlQgc2V0ICovCi0JCXByaW50ayhLRVJOX0VSUiAiZHQzMTU1OiBESVJFQ1RfQUJPUlQgc2V0XG4iKTsKIAkJLyogcmVzZXQgRElSRUNUX0FCT1JUIGJpdCAqLwogCQlpb3dyaXRlMzIoRElSRUNUX0FCT1JULCBhZGRyICsgSUlDX0NTUjEpOwotCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIC1FSU87IC8qIGVycm9yOiBESVJFQ1RfQUJPUlQgc2V0ICovCiAJfQogCXJldHVybiAwOwogfQpAQCAtMzQ0LDE3ICszMzAsMTQgQEAKIAkJaXBkLT5maWVsZF9jb3VudCsrOwogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7IC8qIHN0YXJ0IG9mIGZpZWxkIGlycSAqLwogCX0KLQlpZiAoKHRtcCAmIEZMRF9TVEFSVCkgJiYgKHRtcCAmIEZMRF9FTkRfT0REKSkgewotCQlpZiAoIWlwZC0+c3RhdHMuc3RhcnRfYmVmb3JlX2VuZCsrKQotCQkJcHJpbnRrKEtFUk5fRVJSICJkdDMxNTU6IGlycTogU1RBUlQgYmVmb3JlIEVORFxuIik7Ci0JfQorCWlmICgodG1wICYgRkxEX1NUQVJUKSAmJiAodG1wICYgRkxEX0VORF9PREQpKQorCQlpcGQtPnN0YXRzLnN0YXJ0X2JlZm9yZV9lbmQrKzsKIAkvKgljaGVjayBmb3IgY29ycnVwdGVkIGZpZWxkcyAgICAgKi8KIC8qCXdyaXRlX2kyY19yZWcoaXBkLT5yZWdzLCBFVkVOX0NTUiwgQ1NSX0VSUk9SIHwgQ1NSX0RPTkUpOwkqLwogLyoJd3JpdGVfaTJjX3JlZyhpcGQtPnJlZ3MsIE9ERF9DU1IsIENTUl9FUlJPUiB8IENTUl9ET05FKTsJKi8KIAl0bXAgPSBpb3JlYWQzMihpcGQtPnJlZ3MgKyBDU1IxKSAmIChGTERfQ1JQVF9FVkVOIHwgRkxEX0NSUFRfT0REKTsKIAlpZiAodG1wKSB7Ci0JCWlmICghaXBkLT5zdGF0cy5jb3JydXB0ZWRfZmllbGRzKyspCi0JCQlwcmludGsoS0VSTl9FUlIgImR0MzE1NTogY29ycnVwdGVkIGZpZWxkICV1XG4iLCB0bXApOworCQlpcGQtPnN0YXRzLmNvcnJ1cHRlZF9maWVsZHMrKzsKIAkJaW93cml0ZTMyKEZJRk9fRU4gfCBTUlNUIHwgRkxEX0NSUFRfT0REIHwgRkxEX0NSUFRfRVZFTiB8CiAJCQkJCQlGTERfRE5fT0REIHwgRkxEX0ROX0VWRU4gfAogCQkJCQkJQ0FQX0NPTlRfRVZFTiB8IENBUF9DT05UX09ERCwKQEAgLTQwNCwxMyArMzg3LDkgQEAKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgZHQzMTU1X3ByaXYgKnBkID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKIAotCXByaW50ayhLRVJOX0lORk8gImR0MzE1NTogb3BlbigpOiBtaW5vcjogJWksIHVzZXJzOiAlaVxuIiwKLQkJCQkJCXBkLT52ZGV2LT5taW5vciwgcGQtPnVzZXJzKTsKLQogCWlmICghcGQtPnVzZXJzKSB7CiAJCXBkLT5xID0ga3phbGxvYyhzaXplb2YoKnBkLT5xKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghcGQtPnEpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiZHQzMTU1OiBlcnJvcjogYWxsb2MgcXVldWVcbiIpOwogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gZXJyX2FsbG9jX3F1ZXVlOwogCQl9CkBAIC00MjcsMTMgKzQwNiwxMCBAQAogCQkvKiBkaXNhYmxlIGFsbCBpcnFzLCBjbGVhciBhbGwgaXJxIGZsYWdzICovCiAJCWlvd3JpdGUzMihGTERfU1RBUlQgfCBGTERfRU5EX0VWRU4gfCBGTERfRU5EX09ERCwKIAkJCQkJCXBkLT5yZWdzICsgSU5UX0NTUik7Ci0JCXBkLT5pcnFfaGFuZGxlciA9IGR0MzE1NV9pcnFfaGFuZGxlcl9ldmVuOwotCQlyZXQgPSByZXF1ZXN0X2lycShwZC0+cGRldi0+aXJxLCBwZC0+aXJxX2hhbmRsZXIsCisJCXJldCA9IHJlcXVlc3RfaXJxKHBkLT5wZGV2LT5pcnEsIGR0MzE1NV9pcnFfaGFuZGxlcl9ldmVuLAogCQkJCQkJSVJRRl9TSEFSRUQsIERUMzE1NV9OQU1FLCBwZCk7Ci0JCWlmIChyZXQpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiZHQzMTU1OiBlcnJvcjogcmVxdWVzdF9pcnFcbiIpOworCQlpZiAocmV0KQogCQkJZ290byBlcnJfcmVxdWVzdF9pcnE7Ci0JCX0KIAl9CiAJcGQtPnVzZXJzKys7CiAJcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgKi8KQEAgLTQ0OSw5ICs0MjUsNiBAQAogewogCXN0cnVjdCBkdDMxNTVfcHJpdiAqcGQgPSB2aWRlb19kcnZkYXRhKGZpbHApOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiZHQzMTU1OiByZWxlYXNlKCk6IG1pbm9yOiAlaSwgdXNlcnM6ICVpXG4iLAotCQkJCQlwZC0+dmRldi0+bWlub3IsIHBkLT51c2VycyAtIDEpOwotCiAJcGQtPnVzZXJzLS07CiAJQlVHX09OKHBkLT51c2VycyA8IDApOwogCWlmICghcGQtPnVzZXJzKSB7CkBAIC04MDQsMTEgKzc3Nyw4IEBACiAJLyogYWxsb2NhdGUgbWVtb3J5LCBhbmQgaW5pdGlhbGl6ZSB0aGUgRE1BIG1hY2hpbmUgKi8KIAlidWZfY3B1ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwZGV2LT5kZXYsIERUMzE1NV9CVUZfU0laRSwgJmJ1Zl9kbWEsCiAJCQkJCQkJCUdGUF9LRVJORUwpOwotCWlmICghYnVmX2NwdSkgewotCQlwcmludGsoS0VSTl9FUlIgImR0MzE1NTogZG1hX2FsbG9jX2NvaGVyZW50ICIKLQkJCQkJIihpbiBkdDMxNTVfaW5pdF9ib2FyZCkgZmFpbGVkXG4iKTsKKwlpZiAoIWJ1Zl9jcHUpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAlpb3dyaXRlMzIoYnVmX2RtYSwgcGQtPnJlZ3MgKyBFVkVOX0RNQV9TVEFSVCk7CiAJaW93cml0ZTMyKGJ1Zl9kbWEsIHBkLT5yZWdzICsgT0REX0RNQV9TVEFSVCk7CiAJaW93cml0ZTMyKDAsIHBkLT5yZWdzICsgRVZFTl9ETUFfU1RSSURFKTsKQEAgLTgyOSwxMCArNzk5LDggQEAKIAogCS8qICBkZWFsbG9jYXRlIG1lbW9yeSAgKi8KIAlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LCBEVDMxNTVfQlVGX1NJWkUsIGJ1Zl9jcHUsIGJ1Zl9kbWEpOwotCWlmICh0bXAgJiBCVVNZX0VWRU4pIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJkdDMxNTU6IEJVU1lfRVZFTiBub3QgY2xlYXJlZFxuIik7CisJaWYgKHRtcCAmIEJVU1lfRVZFTikKIAkJcmV0dXJuIC1FSU87Ci0JfQogCXJldHVybiAwOwogfQogCkBAIC05MTYsMjcgKzg4NCwxOCBAQAogCWludCBlcnI7CiAJc3RydWN0IGR0MzE1NV9wcml2ICpwZDsKIAotCXByaW50ayhLRVJOX0lORk8gImR0MzE1NTogcHJvYmUoKVxuIik7CiAJZXJyID0gZG1hX3NldF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSygzMikpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJkdDMxNTU6IGNhbm5vdCBzZXQgZG1hX21hc2tcbiIpOworCWlmIChlcnIpCiAJCXJldHVybiAtRU5PREVWOwotCX0KIAllcnIgPSBkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7Ci0JaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgImR0MzE1NTogY2Fubm90IHNldCBkbWFfY29oZXJlbnRfbWFza1xuIik7CisJaWYgKGVycikKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JfQogCXBkID0ga3phbGxvYyhzaXplb2YoKnBkKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwZCkgewotCQlwcmludGsoS0VSTl9FUlIgImR0MzE1NTogY2Fubm90IGFsbG9jYXRlIGR0MzE1NV9wcml2XG4iKTsKKwlpZiAoIXBkKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAJcGQtPnZkZXYgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKLQlpZiAoIXBkLT52ZGV2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZHQzMTU1OiBjYW5ub3QgYWxsb2NhdGUgdmRldiBzdHJ1Y3R1cmVcbiIpOworCWlmICghcGQtPnZkZXYpCiAJCWdvdG8gZXJyX3ZpZGVvX2RldmljZV9hbGxvYzsKLQl9CiAJKnBkLT52ZGV2ID0gZHQzMTU1X3ZkZXY7CiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIHBkKTsgICAgLyogZm9yIHVzZSBpbiBkdDMxNTVfcmVtb3ZlKCkgKi8KIAl2aWRlb19zZXRfZHJ2ZGF0YShwZC0+dmRldiwgcGQpOyAgLyogZm9yIHVzZSBpbiB2aWRlb19mb3BzICovCkBAIC05NDksMzQgKzkwOCwyNSBAQAogCXBkLT5jc3IyID0gY3NyMl9pbml0OwogCXBkLT5jb25maWcgPSBjb25maWdfaW5pdDsKIAllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKLQlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZHQzMTU1OiBwY2lfZGV2IG5vdCBlbmFibGVkXG4iKTsKKwlpZiAoZXJyKQogCQlnb3RvIGVycl9lbmFibGVfZGV2OwotCX0KIAllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMCwgcGNpX25hbWUocGRldikpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX3JlcV9yZWdpb247CiAJcGQtPnJlZ3MgPSBwY2lfaW9tYXAocGRldiwgMCwgcGNpX3Jlc291cmNlX2xlbihwZC0+cGRldiwgMCkpOwotCWlmICghcGQtPnJlZ3MpIHsKKwlpZiAoIXBkLT5yZWdzKQogCQllcnIgPSAtRU5PTUVNOwotCQlwcmludGsoS0VSTl9FUlIgImR0MzE1NTogcGNpX2lvbWFwIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX3BjaV9pb21hcDsKLQl9CiAJZXJyID0gZHQzMTU1X2luaXRfYm9hcmQocGRldik7Ci0JaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgImR0MzE1NTogZHQzMTU1X2luaXRfYm9hcmQgZmFpbGVkXG4iKTsKLQkJZ290byBlcnJfaW5pdF9ib2FyZDsKLQl9Ci0JZXJyID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHBkLT52ZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCAtMSk7Ci0JaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgImR0MzE1NTogQ2Fubm90IHJlZ2lzdGVyIHZpZGVvIGRldmljZVxuIik7Ci0JCWdvdG8gZXJyX2luaXRfYm9hcmQ7Ci0JfQotCWVyciA9IGR0MzE1NV9hbGxvY19jb2hlcmVudCgmcGRldi0+ZGV2LCBEVDMxNTVfQ0hVTktfU0laRSwKLQkJCQkJCQlETUFfTUVNT1JZX01BUCk7CiAJaWYgKGVycikKLQkJcHJpbnRrKEtFUk5fSU5GTyAiZHQzMTU1OiBwcmVhbGxvY2F0ZWQgOCBidWZmZXJzXG4iKTsKLQlwcmludGsoS0VSTl9JTkZPICJkdDMxNTU6IC9kZXYvdmlkZW8laSBpcyByZWFkeVxuIiwgcGQtPnZkZXYtPm1pbm9yKTsKKwkJZ290byBlcnJfaW5pdF9ib2FyZDsKKwllcnIgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UocGQtPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIC0xKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9pbml0X2JvYXJkOworCWlmIChkdDMxNTVfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwgRFQzMTU1X0NIVU5LX1NJWkUsCisJCQkJCQkJRE1BX01FTU9SWV9NQVApKQorCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAicHJlYWxsb2NhdGVkIDggYnVmZmVyc1xuIik7CisJZGV2X2luZm8oJnBkZXYtPmRldiwgIi9kZXYvdmlkZW8laSBpcyByZWFkeVxuIiwgcGQtPnZkZXYtPm1pbm9yKTsKIAlyZXR1cm4gMDsgIC8qICAgc3VjY2VzcyAgICovCiAKIGVycl9pbml0X2JvYXJkOgpAQCAtOTk3LDcgKzk0Nyw2IEBACiB7CiAJc3RydWN0IGR0MzE1NV9wcml2ICpwZCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCXByaW50ayhLRVJOX0lORk8gImR0MzE1NTogcmVtb3ZlKClcbiIpOwogCWR0MzE1NV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYpOwogCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHBkLT52ZGV2KTsKIAlwY2lfaW91bm1hcChwZGV2LCBwZC0+cmVncyk7CkBAIC0xMDI2LDI0ICs5NzUsMTMgQEAKIHN0YXRpYyBpbnQgX19pbml0CiBkdDMxNTVfaW5pdF9tb2R1bGUodm9pZCkKIHsKLQlpbnQgZXJyOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiZHQzMTU1OiA9PT09PT09PT09PT09PT09PT1cbiIpOwotCXByaW50ayhLRVJOX0lORk8gImR0MzE1NTogaW5pdCgpXG4iKTsKLQllcnIgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZwY2lfZHJpdmVyKTsKLQlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZHQzMTU1OiBjYW5ub3QgcmVnaXN0ZXIgcGNpX2RyaXZlclxuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCXJldHVybiAwOyAvKiBzdWNjZXMgKi8KKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcGNpX2RyaXZlcik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdAogZHQzMTU1X2V4aXRfbW9kdWxlKHZvaWQpCiB7CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZwY2lfZHJpdmVyKTsKLQlwcmludGsoS0VSTl9JTkZPICJkdDMxNTU6IGV4aXQoKVxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiZHQzMTU1OiA9PT09PT09PT09PT09PT09PT1cbiIpOwogfQogCiBtb2R1bGVfaW5pdChkdDMxNTVfaW5pdF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2R0MzE1NXY0bC9kdDMxNTV2NGwuaCBiL2RyaXZlcnMvc3RhZ2luZy9kdDMxNTV2NGwvZHQzMTU1djRsLmgKaW5kZXggYjA3OTJiMy4uMmU0Zjg5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2R0MzE1NXY0bC9kdDMxNTV2NGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZHQzMTU1djRsL2R0MzE1NXY0bC5oCkBAIC0xODMsNyArMTgzLDYgQEAKICAqIEBxCQkJcG9pbnRlciB0byB2YjJfcXVldWUgc3RydWN0dXJlCiAgKiBAY3Vycl9idWY6CQlwb2ludGVyIHRvIGN1cnJlbiBidWZmZXIKICAqIEBtdXg6CQltdXRleCB0byBwcm90ZWN0IHRoZSBpbnN0YW5jZQotICogQGlycV9oYW5kbGVyOglpcnEgaGFuZGxlciBmb3IgdGhlIGRyaXZlcgogICogQGRtYXEJCXF1ZXVlIGZvciBkbWEgYnVmZmVycwogICogQGxvY2sJCXNwaW5sb2NrIGZvciBkbWEgcXVldWUKICAqIEBmaWVsZF9jb3VudAkJZmllbGRzIGNvdW50ZXIKQEAgLTE5OSwxMiArMTk4LDExIEBACiAJc3RydWN0IHZiMl9xdWV1ZSAqcTsKIAlzdHJ1Y3QgdmIyX2J1ZmZlciAqY3Vycl9idWY7CiAJc3RydWN0IG11dGV4IG11eDsKLQlpcnFfaGFuZGxlcl90IGlycV9oYW5kbGVyOwogCXN0cnVjdCBsaXN0X2hlYWQgZG1hcTsKIAlzcGlubG9ja190IGxvY2s7CiAJdW5zaWduZWQgaW50IGZpZWxkX2NvdW50OwogCXN0cnVjdCBkdDMxNTVfc3RhdHMgc3RhdHM7Ci0Jdm9pZCAqcmVnczsKKwl2b2lkIF9faW9tZW0gKnJlZ3M7CiAJaW50IHVzZXJzOwogCXU4IGNzcjIsIGNvbmZpZzsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwLmggYi9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwLmgKaW5kZXggMjJiMjRiNi4uN2IyNTZhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXAuaApAQCAtMzI0LDEzICszMjQsNiBAQAogCWludCBsb3N0W0lOUFVUX01BTlldOwogCWludCBtZXJpdFsxODBdOwogCi0Jc3RydWN0IHRpbWV2YWwgdGltZXZhbDA7Ci0Jc3RydWN0IHRpbWV2YWwgdGltZXZhbDE7Ci0Jc3RydWN0IHRpbWV2YWwgdGltZXZhbDI7Ci0Jc3RydWN0IHRpbWV2YWwgdGltZXZhbDM7Ci0Jc3RydWN0IHRpbWV2YWwgdGltZXZhbDY7Ci0Jc3RydWN0IHRpbWV2YWwgdGltZXZhbDc7Ci0Jc3RydWN0IHRpbWV2YWwgdGltZXZhbDg7CiAJbG9uZyBsb25nIGludCBkbmJ5ZHQ7CiAKIAlpbnQgICAgdmlkZW9faW50ZXJmYWNlOwpAQCAtNTQzLDEwICs1MzYsNiBAQAogaW50ICAgICAgICAgICAgICB3cml0ZV92dChzdHJ1Y3QgdXNiX2RldmljZSAqLCB1MTYsIHUxNik7CiBpbnQJCWlzZG9uZ2xlKHN0cnVjdCBlYXN5Y2FwICopOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RydWN0IHNpZ25lZF9kaXZfcmVzdWx0IHsKLQlsb25nIGxvbmcgaW50IHF1b3RpZW50OwotCXVuc2lnbmVkIGxvbmcgbG9uZyBpbnQgcmVtYWluZGVyOwotfSBzaWduZWRfZGl2KGxvbmcgbG9uZyBpbnQsIGxvbmcgbG9uZyBpbnQpOwogCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfaW9jdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfaW9jdGwuYwppbmRleCAwYWNjYWI5Li5jOTlhZGRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX2lvY3RsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9pb2N0bC5jCkBAIC05MzEsNyArOTMxLDYgQEAKIAkJCXN3aXRjaCAocGVhc3ljYXAtPm11dGUpIHsKIAkJCWNhc2UgMTogewogCQkJCXBlYXN5Y2FwLT5hdWRpb19pZGxlID0gMTsKLQkJCQlwZWFzeWNhcC0+dGltZXZhbDAudHZfc2VjID0gMDsKIAkJCQlTQU0oImFkanVzdGluZyBtdXRlOiAlaT1wZWFzeWNhcC0+YXVkaW9faWRsZVxuIiwKIAkJCQkgICAgcGVhc3ljYXAtPmF1ZGlvX2lkbGUpOwogCQkJCXJldHVybiAwOwpAQCAtMTMxNywxNyArMTMxNiwxMiBAQAogCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpwdjRsMl9jb250cm9sOwogCiAJCUpPTSg4LCAiVklESU9DX0dfQ1RSTFxuIik7Ci0JCXB2NGwyX2NvbnRyb2wgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdjRsMl9jb250cm9sKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcHY0bDJfY29udHJvbCkgewotCQkJU0FNKCJFUlJPUjogb3V0IG9mIG1lbW9yeVxuIik7CisJCXB2NGwyX2NvbnRyb2wgPSBtZW1kdXBfdXNlcigodm9pZCBfX3VzZXIgKilhcmcsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IHY0bDJfY29udHJvbCkpOworCQlpZiAoSVNfRVJSKHB2NGwyX2NvbnRyb2wpKSB7CisJCQlTQU0oIkVSUk9SOiBjb3B5IGZyb20gdXNlciBmYWlsZWRcbiIpOwogCQkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwZGM2MF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JCWlmICgwICE9IGNvcHlfZnJvbV91c2VyKHB2NGwyX2NvbnRyb2wsICh2b2lkIF9fdXNlciAqKWFyZywKLQkJCQlzaXplb2Yoc3RydWN0IHY0bDJfY29udHJvbCkpKSB7Ci0JCQlrZnJlZShwdjRsMl9jb250cm9sKTsKLQkJCW11dGV4X3VubG9jaygmZWFzeWNhcGRjNjBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiBQVFJfRVJSKHB2NGwyX2NvbnRyb2wpOwogCQl9CiAKIAkJc3dpdGNoIChwdjRsMl9jb250cm9sLT5pZCkgewpAQCAtMjMzOCw3ICsyMzMyLDYgQEAKIAogCQlwZWFzeWNhcC0+dmlkZW9faWRsZSA9IDE7CiAJCXBlYXN5Y2FwLT5hdWRpb19pZGxlID0gMTsKLQkJcGVhc3ljYXAtPnRpbWV2YWwwLnR2X3NlYyA9IDA7CiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKgogICogIElGIFRIRSBXQUlUIFFVRVVFUyBBUkUgTk9UIENMRUFSRUQgSU4gUkVTUE9OU0UgVE8gVEhFIFNUUkVBTU9GRiBDT01NQU5ECkBAIC0yMzU2LDE3ICsyMzQ5LDEyIEBACiAJCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnB2NGwyX3N0cmVhbXBhcm07CiAKIAkJSk9NKDgsICJWSURJT0NfR19QQVJNXG4iKTsKLQkJcHY0bDJfc3RyZWFtcGFybSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0pLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwdjRsMl9zdHJlYW1wYXJtKSB7Ci0JCQlTQU0oIkVSUk9SOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcHY0bDJfc3RyZWFtcGFybSA9IG1lbWR1cF91c2VyKCh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtKSk7CisJCWlmIChJU19FUlIocHY0bDJfc3RyZWFtcGFybSkpIHsKKwkJCVNBTSgiRVJST1I6IGNvcHkgZnJvbSB1c2VyIGZhaWxlZFxuIik7CiAJCQltdXRleF91bmxvY2soJmVhc3ljYXBkYzYwX2RvbmdsZVtrZF0ubXV0ZXhfdmlkZW8pOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKHB2NGwyX3N0cmVhbXBhcm0sCi0JCQkodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtKSkpIHsKLQkJCWtmcmVlKHB2NGwyX3N0cmVhbXBhcm0pOwotCQkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwZGM2MF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKLQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIFBUUl9FUlIocHY0bDJfc3RyZWFtcGFybSk7CiAJCX0KIAogCQlpZiAocHY0bDJfc3RyZWFtcGFybS0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9tYWluLmMKaW5kZXggYmVhMjgxNi4uYTQ1YzBiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9tYWluLmMKQEAgLTU4LDcgKzU4LDcgQEAKIAogc3RhdGljIGJvb2wgZWFzeWNhcF9udHNjOwogbW9kdWxlX3BhcmFtX25hbWVkKG50c2MsIGVhc3ljYXBfbnRzYywgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOwotTU9EVUxFX1BBUk1fREVTQyhudHNjLCAiTlRDUyBkZWZhdWx0IGVuY29kaW5nIChkZWZhdWx0IFBBTCkiKTsKK01PRFVMRV9QQVJNX0RFU0MobnRzYywgIk5UU0MgZGVmYXVsdCBlbmNvZGluZyAoZGVmYXVsdCBQQUwpIik7CiAKIAogCkBAIC0yNzAsNyArMjcwLDYgQEAKIAogCXBlYXN5Y2FwLT52aWRlb19lb2YgPSAwOwogCXBlYXN5Y2FwLT5hdWRpb19lb2YgPSAwOwotCWRvX2dldHRpbWVvZmRheSgmcGVhc3ljYXAtPnRpbWV2YWw3KTsKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCiAgKiBSRVNUT1JFIElOUFVUIEFORCBGT1JDRSBSRUZSRVNIIE9GIFNUQU5EQVJELCBGT1JNQVQsIEVUQy4KQEAgLTk1Myw4ICs5NTIsMTAgQEAKIAkgKiAgcGVhc3ljYXAsIElOIFdISUNIIENBU0UgQSBSRVBFQVQgQ0FMTCBUTyBpc2RvbmdsZSgpIFdJTEwgRkFJTC4KIAkgKiAgSUYgTkVDRVNTQVJZLCBCQUlMIE9VVC4KIAkgKi8KLQkJaWYgKGtkICE9IGlzZG9uZ2xlKHBlYXN5Y2FwKSkKKwkJaWYgKGtkICE9IGlzZG9uZ2xlKHBlYXN5Y2FwKSkgeworCQkJbXV0ZXhfdW5sb2NrKCZlYXN5Y2FwZGM2MF9kb25nbGVba2RdLm11dGV4X3ZpZGVvKTsKIAkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCX0KIAkJaWYgKCFmaWxlKSB7CiAJCQlTQVkoIkVSUk9SOiAgZmlsZSBpcyBOVUxMXG4iKTsKIAkJCW11dGV4X3VubG9jaygmZWFzeWNhcGRjNjBfZG9uZ2xlW2tkXS5tdXRleF92aWRlbyk7CkBAIC0xMjEzLDEwICsxMjE0LDYgQEAKIGludAogZmllbGQyZnJhbWUoc3RydWN0IGVhc3ljYXAgKnBlYXN5Y2FwKQogewotCXN0cnVjdCB0aW1ldmFsIHRpbWV2YWw7Ci0JbG9uZyBsb25nIGludCBhYm92ZSwgYmVsb3c7Ci0JdTMyIHJlbWFpbmRlcjsKLQlzdHJ1Y3Qgc2lnbmVkX2Rpdl9yZXN1bHQgc2RyOwogCiAJdm9pZCAqcGV4LCAqcGFkOwogCWludCBrZXgsIGthZCwgbWV4LCBtYWQsIHJleCwgcmFkLCByYWQyOwpAQCAtMTU3NCw1MiArMTU3MSwxMSBAQAogCWlmIChwZWFzeWNhcC0+ZmllbGRfcmVhZCA9PSBwZWFzeWNhcC0+ZmllbGRfZmlsbCkKIAkJU0FNKCJXQVJOSU5HOiBvbiBleGl0LCBmaWxsaW5nIGZpZWxkIGJ1ZmZlciAlaVxuIiwKIAkJCQkJCXBlYXN5Y2FwLT5maWVsZF9yZWFkKTsKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qCi0gKiAgQ0FMQ1VMQVRFIFZJREVPIFNUUkVBTUlORyBSQVRFCi0gKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQlkb19nZXR0aW1lb2ZkYXkoJnRpbWV2YWwpOwotCWlmIChwZWFzeWNhcC0+dGltZXZhbDYudHZfc2VjKSB7Ci0JCWJlbG93ID0gKChsb25nIGxvbmcgaW50KSgxMDAwMDAwKSkgKgotCQkJKChsb25nIGxvbmcgaW50KSh0aW1ldmFsLnR2X3NlYyAtCi0JCQkJCQlwZWFzeWNhcC0+dGltZXZhbDYudHZfc2VjKSkgKwotCQkJIChsb25nIGxvbmcgaW50KSh0aW1ldmFsLnR2X3VzZWMgLSBwZWFzeWNhcC0+dGltZXZhbDYudHZfdXNlYyk7Ci0JCWFib3ZlID0gKGxvbmcgbG9uZyBpbnQpMTAwMDAwMDsKLQotCQlzZHIgPSBzaWduZWRfZGl2KGFib3ZlLCBiZWxvdyk7Ci0JCWFib3ZlID0gc2RyLnF1b3RpZW50OwotCQlyZW1haW5kZXIgPSAodTMyKXNkci5yZW1haW5kZXI7Ci0KLQkJSk9NKDgsICJ2aWRlbyBzdHJlYW1pbmcgYXQgJTNsbGkuJTAzaSBmaWVsZHMgcGVyIHNlY29uZFxuIiwKLQkJCQlhYm92ZSwgKHJlbWFpbmRlci8xMDAwKSk7Ci0JfQotCXBlYXN5Y2FwLT50aW1ldmFsNiA9IHRpbWV2YWw7CiAKIAlpZiAoY2FjaGVzKQogCQlKT00oOCwgIiVpPWNhY2hlc1xuIiwgY2FjaGVzKTsKIAlyZXR1cm4gMDsKIH0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0cnVjdCBzaWduZWRfZGl2X3Jlc3VsdAotc2lnbmVkX2Rpdihsb25nIGxvbmcgaW50IGFib3ZlLCBsb25nIGxvbmcgaW50IGJlbG93KQotewotCXN0cnVjdCBzaWduZWRfZGl2X3Jlc3VsdCBzZHI7Ci0KLQlpZiAoKCgwIDw9IGFib3ZlKSAmJiAoMCA8PSBiZWxvdykpIHx8ICgoMCAgPiBhYm92ZSkgJiYgKDAgID4gYmVsb3cpKSkgewotCQlzZHIucmVtYWluZGVyID0gKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIGRvX2RpdihhYm92ZSwgYmVsb3cpOwotCQlzZHIucXVvdGllbnQgID0gKGxvbmcgbG9uZyBpbnQpIGFib3ZlOwotCX0gZWxzZSB7Ci0JCWlmICgwID4gYWJvdmUpCi0JCQlhYm92ZSA9IC1hYm92ZTsKLQkJaWYgKDAgPiBiZWxvdykKLQkJCWJlbG93ID0gLWJlbG93OwotCQlzZHIucmVtYWluZGVyID0gKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQpIGRvX2RpdihhYm92ZSwgYmVsb3cpOwotCQlzZHIucXVvdGllbnQgID0gLSgobG9uZyBsb25nIGludCkgYWJvdmUpOwotCX0KLQlyZXR1cm4gc2RyOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqICBERUNJTUFUSU9OIEFORCBDT0xPVVJTUEFDRSBDT05WRVJTSU9OLgpAQCAtMjc1Myw4ICsyNzA5LDYgQEAKIAkJCQkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUKIAkJCQkJCQkJKCYocGVhc3ljYXAtPgogCQkJCQkJCQkJIHdxX3ZpZGVvKSk7Ci0JCQkJCQkJZG9fZ2V0dGltZW9mZGF5Ci0JCQkJCQkJCSgmcGVhc3ljYXAtPnRpbWV2YWw3KTsKIAkJCQkJCX0gZWxzZSB7CiAJCQkJCQlwZWFzeWNhcC0+dmlkZW9fanVuaysrOwogCQkJCQkJaWYgKGJhZCAmIDB4MDAxMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfc291bmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9lYXN5Y2FwL2Vhc3ljYXBfc291bmQuYwppbmRleCAyMTNkMDQwLi5iMjJiYjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZWFzeWNhcC9lYXN5Y2FwX3NvdW5kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Vhc3ljYXAvZWFzeWNhcF9zb3VuZC5jCkBAIC02NjYsOSArNjY2LDYgQEAKIAlwZWFzeWNhcC0+YXVkaW9fZW9mID0gMDsKIAlwZWFzeWNhcC0+YXVkaW9faWRsZSA9IDA7CiAKLQlwZWFzeWNhcC0+dGltZXZhbDEudHZfc2VjICA9IDA7Ci0JcGVhc3ljYXAtPnRpbWV2YWwxLnR2X3VzZWMgPSAwOwotCiAJc3VibWl0X2F1ZGlvX3VyYnMocGVhc3ljYXApOwogCiAJSk9NKDQsICJmaW5pc2hlZCBpbml0aWFsaXphdGlvblxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L0tjb25maWcKaW5kZXggZTExY2YzNC4uZjBlZDA4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvS2NvbmZpZwpAQCAtNywxMiArNywzIEBACiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGV0MTMxeC4KLQotY29uZmlnIEVUMTMxWF9ERUJVRwotCWJvb2wgIkVuYWJsZSBldDEzMXggZGVidWdnaW5nIgotCWRlcGVuZHMgb24gRVQxMzFYCi0JZGVmYXVsdCBuCi0JLS0taGVscC0tLQotCSAgU2F5IFkgZm9yIGRldGFpbGVkIGRlYnVnIGluZm9ybWF0aW9uLgotCi0JICBJZiBpbiBkb3VidCwgc2F5IE4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9NYWtlZmlsZQppbmRleCBkZmNkMmJmLi4wMjdmZjk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvTWFrZWZpbGUKQEAgLTMsMTMgKzMsMyBAQAogIwogCiBvYmotJChDT05GSUdfRVQxMzFYKSArPSBldDEzMXgubwotCi1ldDEzMXgteSA6PQlldDEzMTBfZWVwcm9tLm8gXAotCQlldDEzMTBfbWFjLm8gXAotCQlldDEzMTBfcGh5Lm8gXAotCQlldDEzMTBfcG0ubyBcCi0JCWV0MTMxMF9yeC5vIFwKLQkJZXQxMzEwX3R4Lm8gXAotCQlldDEzMXhfaW5pdHBjaS5vIFwKLQkJZXQxMzF4X2lzci5vIFwKLQkJZXQxMzF4X25ldGRldi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L1JFQURNRSBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvUkVBRE1FCmluZGV4IDI4NzUyYTUuLjM0NThhYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvUkVBRE1FCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvUkVBRE1FCkBAIC0yLDI0ICsyLDE1IEBACiAKIEJhc2VkIG9uIHRoZSBkcml2ZXIgZm91bmQgYXQgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvZXQxMzF4LwogCi1DbGVhbmVkIHVwIGltbWVuc2VseSBieSBPbGFmIEhhcnRtYW4gPG8uaGFydG1hbm5AdGVsb3ZpdGFsLmNvbT4gYW5kIENocmlzdG9waAotSGVsbHdpZyA8aGNoQGluZnJhZGVhZC5vcmc+CitDbGVhbmVkIHVwIGltbWVuc2VseSBieSBPbGFmIEhhcnRtYW4gYW5kIENocmlzdG9waCBIZWxsd2lnIDxoY2hAaW5mcmFkZWFkLm9yZz4KIAogTm90ZSwgdGhlIHBvd2VybWFuYWdlbWVudCBvcHRpb25zIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSB2ZW5kb3IgcHJvdmlkZWQKIGRyaXZlciBhcyB0aGV5IGRpZCBub3QgYnVpbGQgcHJvcGVybHkgYXQgdGhlIHRpbWUuCiAKIFRPRE86Ci0JLSBrZXJuZWwgY29kaW5nIHN0eWxlIGNsZWFudXBzCi0JLSBmb3J3YXJkIHBvcnQgZm9yIGxhdGVzdCBuZXR3b3JrIGRyaXZlciBjaGFuZ2VzCi0JLSBraWxsIHVzZWxlc3MgdHlwZWNhc3RzIChlLmcuIGluIGV0MTMxMF9waHkuYykKLQktIGFsbG9jX2V0aGVyZGV2IGlzIGluaXRpYWxpemluZyBtZW1vcnkgd2l0aCB6ZXJvPyE/Ci0JLSBhZGRfdGltZXIgY2FsbCBpbiBldDEzMXhfbmV0ZGV2LmMgaXMgY29ycmVjdD8KLQktIEFkZCBwb3dlciBzYXZpbmcgZnVuY3Rpb25hbGl0eSAoc3VzcGVuZCwgc2xlZXAsIHJlc3VtZSkKLQktIEltcGxlbWVudCBhIGZldyBtb3JlIGtlcm5lbCBQYXJhbWV0ZXIgKHNldCBtYWMgKQorCS0gVXNlIG9mIGttZW1fY2FjaGUgc2VlbXMgYSBiaXQgdW51c3VhbAogCiBQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvOgogCUdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQHN1c2UuZGU+Ci0KLUFuZCBDYzogT2xhZiBIYXJ0bWFubiA8by5oYXJ0bWFubkB0ZWxvdml0YWwuY29tPiBhcyBoZSBoYXMgdGhpcyBkZXZpY2UgYW5kIGNhbgotdGVzdCBhbnkgY2hhbmdlcy4KKwlNYXJrIEVpbm9uIDxtYXJrLmVpbm9uQGdtYWlsLmNvbT4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfYWRkcmVzc19tYXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX2FkZHJlc3NfbWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMDY3N2UuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfYWRkcmVzc19tYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MzQgKzAsMCBAQAotLyoKLSAqIEFnZXJlIFN5c3RlbXMgSW5jLgotICogMTAvMTAwLzEwMDAgQmFzZS1UIEV0aGVybmV0IERyaXZlciBmb3IgdGhlIEVUMTMwMSBhbmQgRVQxMzF4IHNlcmllcyBNQUNzCi0gKgotICogQ29weXJpZ2h0IMKpIDIwMDUgQWdlcmUgU3lzdGVtcyBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogZXQxMzEwX2FkZHJlc3NfbWFwLmggLSBDb250YWlucyB0aGUgcmVnaXN0ZXIgbWFwcGluZyBmb3IgdGhlIEVUMTMxMAotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogU09GVFdBUkUgTElDRU5TRQotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAotICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwotICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbwotICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgotICoKLSAqIENvcHlyaWdodCDCqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICoKLSAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCi0gKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwotICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCi0gKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBEaXNjbGFpbWVyCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCi0gKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCi0gKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgotICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLSAqIERBTUFHRS4KLSAqCi0gKi8KLQotI2lmbmRlZiBfRVQxMzEwX0FERFJFU1NfTUFQX0hfCi0jZGVmaW5lIF9FVDEzMTBfQUREUkVTU19NQVBfSF8KLQotCi0vKiBTVEFSVCBPRiBHTE9CQUwgUkVHSVNURVIgQUREUkVTUyBNQVAgKi8KLQotLyoKLSAqIDEwYml0IHJlZ2lzdGVycwotICoKLSAqIFR4IHF1ZXVlIHN0YXJ0IGFkZHJlc3MgcmVnIGluIGdsb2JhbCBhZGRyZXNzIG1hcCBhdCBhZGRyZXNzIDB4MDAwMAotICogdHggcXVldWUgZW5kIGFkZHJlc3MgcmVnIGluIGdsb2JhbCBhZGRyZXNzIG1hcCBhdCBhZGRyZXNzIDB4MDAwNAotICogcnggcXVldWUgc3RhcnQgYWRkcmVzcyByZWcgaW4gZ2xvYmFsIGFkZHJlc3MgbWFwIGF0IGFkZHJlc3MgMHgwMDA4Ci0gKiByeCBxdWV1ZSBlbmQgYWRkcmVzcyByZWcgaW4gZ2xvYmFsIGFkZHJlc3MgbWFwIGF0IGFkZHJlc3MgMHgwMDBDCi0gKi8KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgcG93ZXIgbWFuYWdlbWVudCBjb250cm9sIHN0YXR1cyByZWcgaW4gZ2xvYmFsIGFkZHJlc3MgbWFwCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgwMDEwCi0gKglqYWdjb3JlX3J4X3JkeQliaXQgOQotICoJamFnY29yZV90eF9yZHkJYml0IDgKLSAqCXBoeV9scGVkX2VuCWJpdCA3Ci0gKglwaHlfc3dfY29tYQliaXQgNgotICoJcnhjbGtfZ2F0ZQliaXQgNQotICoJdHhjbGtfZ2F0ZQliaXQgNAotICoJc3lzY2xrX2dhdGUJYml0IDMKLSAqCWphZ2NvcmVfcnhfZW4JYml0IDIKLSAqCWphZ2NvcmVfdHhfZW4JYml0IDEKLSAqCWdpZ2VwaHlfZW4JYml0IDAKLSAqLwotCi0jZGVmaW5lIEVUX1BNX1BIWV9TV19DT01BCQkweDQwCi0jZGVmaW5lIEVUX1BNQ1NSX0lOSVQJCQkweDM4Ci0KLS8qCi0gKiBJbnRlcnJ1cHQgc3RhdHVzIHJlZyBhdCBhZGRyZXNzIDB4MDAxOAotICovCi0KLSNkZWZpbmUJRVRfSU5UUl9UWERNQV9JU1IJMHgwMDAwMDAwOAotI2RlZmluZSBFVF9JTlRSX1RYRE1BX0VSUgkweDAwMDAwMDEwCi0jZGVmaW5lIEVUX0lOVFJfUlhETUFfWEZSX0RPTkUJMHgwMDAwMDAyMAotI2RlZmluZSBFVF9JTlRSX1JYRE1BX0ZCX1IwX0xPVwkweDAwMDAwMDQwCi0jZGVmaW5lIEVUX0lOVFJfUlhETUFfRkJfUjFfTE9XCTB4MDAwMDAwODAKLSNkZWZpbmUgRVRfSU5UUl9SWERNQV9TVEFUX0xPVwkweDAwMDAwMTAwCi0jZGVmaW5lIEVUX0lOVFJfUlhETUFfRVJSCTB4MDAwMDAyMDAKLSNkZWZpbmUgRVRfSU5UUl9XQVRDSERPRwkweDAwMDA0MDAwCi0jZGVmaW5lIEVUX0lOVFJfV09MCQkweDAwMDA4MDAwCi0jZGVmaW5lIEVUX0lOVFJfUEhZCQkweDAwMDEwMDAwCi0jZGVmaW5lIEVUX0lOVFJfVFhNQUMJCTB4MDAwMjAwMDAKLSNkZWZpbmUgRVRfSU5UUl9SWE1BQwkJMHgwMDA0MDAwMAotI2RlZmluZSBFVF9JTlRSX01BQ19TVEFUCTB4MDAwODAwMDAKLSNkZWZpbmUgRVRfSU5UUl9TTFZfVElNRU9VVAkweDAwMTAwMDAwCi0KLS8qCi0gKiBJbnRlcnJ1cHQgbWFzayByZWdpc3RlciBhdCBhZGRyZXNzIDB4MDAxQwotICogSW50ZXJydXB0IGFsaWFzIGNsZWFyIG1hc2sgcmVnIGF0IGFkZHJlc3MgMHgwMDIwCi0gKiBJbnRlcnJ1cHQgc3RhdHVzIGFsaWFzIHJlZyBhdCBhZGRyZXNzIDB4MDAyNAotICoKLSAqIFNhbWUgbWFza3MgYXMgYWJvdmUKLSAqLwotCi0vKgotICogU29mdHdhcmUgcmVzZXQgcmVnIGF0IGFkZHJlc3MgMHgwMDI4Ci0gKiAwOgl0eGRtYV9zd19yZXNldAotICogMToJcnhkbWFfc3dfcmVzZXQKLSAqIDI6CXR4bWFjX3N3X3Jlc2V0Ci0gKiAzOglyeG1hY19zd19yZXNldAotICogNDoJbWFjX3N3X3Jlc2V0Ci0gKiA1OgltYWNfc3RhdF9zd19yZXNldAotICogNjoJbW1jX3N3X3Jlc2V0Ci0gKjMxOglzZWxmY2xyX2Rpc2FibGUKLSAqLwotCi0vKgotICogU0xWIFRpbWVyIHJlZyBhdCBhZGRyZXNzIDB4MDAyQyAobG93IDI0IGJpdHMpCi0gKi8KLQotLyoKLSAqIE1TSSBDb25maWd1cmF0aW9uIHJlZyBhdCBhZGRyZXNzIDB4MDAzMAotICovCi0KLSNkZWZpbmUgRVRfTVNJX1ZFQ1RPUgkweDAwMDAwMDFGCi0jZGVmaW5lIEVUX01TSV9UQwkweDAwMDcwMDAwCi0KLS8qCi0gKiBMb29wYmFjayByZWcgbG9jYXRlZCBhdCBhZGRyZXNzIDB4MDAzNAotICovCi0KLSNkZWZpbmUgRVRfTE9PUF9NQUMJMHgwMDAwMDAwMQotI2RlZmluZSBFVF9MT09QX0RNQQkweDAwMDAwMDAyCi0KLS8qCi0gKiBHTE9CQUwgTW9kdWxlIG9mIEpBR0NvcmUgQWRkcmVzcyBNYXBwaW5nCi0gKiBMb2NhdGVkIGF0IGFkZHJlc3MgMHgwMDAwCi0gKi8KLXN0cnVjdCBnbG9iYWxfcmVncyB7CQkJLyogTG9jYXRpb246ICovCi0JdTMyIHR4cV9zdGFydF9hZGRyOwkJCS8qICAweDAwMDAgKi8KLQl1MzIgdHhxX2VuZF9hZGRyOwkJCS8qICAweDAwMDQgKi8KLQl1MzIgcnhxX3N0YXJ0X2FkZHI7CQkJLyogIDB4MDAwOCAqLwotCXUzMiByeHFfZW5kX2FkZHI7CQkJLyogIDB4MDAwQyAqLwotCXUzMiBwbV9jc3I7CQkJCS8qICAweDAwMTAgKi8KLQl1MzIgdW51c2VkOwkJCQkvKiAgMHgwMDE0ICovCi0JdTMyIGludF9zdGF0dXM7CQkJCS8qICAweDAwMTggKi8KLQl1MzIgaW50X21hc2s7CQkJCS8qICAweDAwMUMgKi8KLQl1MzIgaW50X2FsaWFzX2Nscl9lbjsJCQkvKiAgMHgwMDIwICovCi0JdTMyIGludF9zdGF0dXNfYWxpYXM7CQkJLyogIDB4MDAyNCAqLwotCXUzMiBzd19yZXNldDsJCQkJLyogIDB4MDAyOCAqLwotCXUzMiBzbHZfdGltZXI7CQkJCS8qICAweDAwMkMgKi8KLQl1MzIgbXNpX2NvbmZpZzsJCQkJLyogIDB4MDAzMCAqLwotCXUzMiBsb29wYmFjazsJCQkvKiAgMHgwMDM0ICovCi0JdTMyIHdhdGNoZG9nX3RpbWVyOwkJCS8qICAweDAwMzggKi8KLX07Ci0KLQotLyogU1RBUlQgT0YgVFhETUEgUkVHSVNURVIgQUREUkVTUyBNQVAgKi8KLQotLyoKLSAqIHR4ZG1hIGNvbnRyb2wgc3RhdHVzIHJlZyBhdCBhZGRyZXNzIDB4MTAwMAotICovCi0KLSNkZWZpbmUgRVRfVFhETUFfQ1NSX0hBTFQJMHgwMDAwMDAwMQotI2RlZmluZSBFVF9UWERNQV9EUk9QX1RMUAkweDAwMDAwMDAyCi0jZGVmaW5lIEVUX1RYRE1BX0NBQ0hFX1RIUlMJMHgwMDAwMDBGMAotI2RlZmluZSBFVF9UWERNQV9DQUNIRV9TSElGVAk0Ci0jZGVmaW5lIEVUX1RYRE1BX1NOR0xfRVBLVAkweDAwMDAwMTAwCi0jZGVmaW5lIEVUX1RYRE1BX0NMQVNTCQkweDAwMDAxRTAwCi0KLS8qCi0gKiBzdHJ1Y3R1cmUgZm9yIHR4ZG1hIHBhY2tldCByaW5nIGJhc2UgYWRkcmVzcyBoaSByZWcgaW4gdHhkbWEgYWRkcmVzcyBtYXAKLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDEwMDQKLSAqIERlZmluZWQgZWFybGllciAodTMyKQotICovCi0KLS8qCi0gKiBzdHJ1Y3R1cmUgZm9yIHR4ZG1hIHBhY2tldCByaW5nIGJhc2UgYWRkcmVzcyBsb3cgcmVnIGluIHR4ZG1hIGFkZHJlc3MgbWFwCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgxMDA4Ci0gKiBEZWZpbmVkIGVhcmxpZXIgKHUzMikKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciB0eGRtYSBwYWNrZXQgcmluZyBudW1iZXIgb2YgZGVzY3JpcHRvciByZWcgaW4gdHhkbWEgYWRkcmVzcwotICogbWFwLiAgTG9jYXRlZCBhdCBhZGRyZXNzIDB4MTAwQwotICoKLSAqIDMxLTEwOiB1bnVzZWQKLSAqIDktMDogcHIgbmRlcwotICovCi0KLSNkZWZpbmUgRVRfRE1BMTJfTUFTSwkJMHgwRkZGCS8qIDEyIGJpdCBtYXNrIGZvciBETUExMlcgdHlwZXMgKi8KLSNkZWZpbmUgRVRfRE1BMTJfV1JBUAkJMHgxMDAwCi0jZGVmaW5lIEVUX0RNQTEwX01BU0sJCTB4MDNGRgkvKiAxMCBiaXQgbWFzayBmb3IgRE1BMTBXIHR5cGVzICovCi0jZGVmaW5lIEVUX0RNQTEwX1dSQVAJCTB4MDQwMAotI2RlZmluZSBFVF9ETUE0X01BU0sJCTB4MDAwRgkvKiA0IGJpdCBtYXNrIGZvciBETUE0VyB0eXBlcyAqLwotI2RlZmluZSBFVF9ETUE0X1dSQVAJCTB4MDAxMAotCi0jZGVmaW5lIElOREVYMTIoeCkJKCh4KSAmIEVUX0RNQTEyX01BU0spCi0jZGVmaW5lIElOREVYMTAoeCkJKCh4KSAmIEVUX0RNQTEwX01BU0spCi0jZGVmaW5lIElOREVYNCh4KQkoKHgpICYgRVRfRE1BNF9NQVNLKQotCi1leHRlcm4gaW5saW5lIHZvaWQgYWRkXzEwYml0KHUzMiAqdiwgaW50IG4pCi17Ci0JKnYgPSBJTkRFWDEwKCp2ICsgbikgfCAoKnYgJiBFVF9ETUExMF9XUkFQKTsKLX0KLQotZXh0ZXJuIGlubGluZSB2b2lkIGFkZF8xMmJpdCh1MzIgKnYsIGludCBuKQotewotCSp2ID0gSU5ERVgxMigqdiArIG4pIHwgKCp2ICYgRVRfRE1BMTJfV1JBUCk7Ci19Ci0KLS8qCi0gKiAxMGJpdCBETUEgd2l0aCB3cmFwCi0gKiB0eGRtYSB0eCBxdWV1ZSB3cml0ZSBhZGRyZXNzIHJlZyBpbiB0eGRtYSBhZGRyZXNzIG1hcCBhdCAweDEwMTAKLSAqIHR4ZG1hIHR4IHF1ZXVlIHdyaXRlIGFkZHJlc3MgZXh0ZXJuYWwgcmVnIGluIHR4ZG1hIGFkZHJlc3MgbWFwIGF0IDB4MTAxNAotICogdHhkbWEgdHggcXVldWUgcmVhZCBhZGRyZXNzIHJlZyBpbiB0eGRtYSBhZGRyZXNzIG1hcCBhdCAweDEwMTgKLSAqCi0gKiB1MzIKLSAqIHR4ZG1hIHN0YXR1cyB3cml0ZWJhY2sgYWRkcmVzcyBoaSByZWcgaW4gdHhkbWEgYWRkcmVzcyBtYXAgYXQweDEwMUMKLSAqIHR4ZG1hIHN0YXR1cyB3cml0ZWJhY2sgYWRkcmVzcyBsbyByZWcgaW4gdHhkbWEgYWRkcmVzcyBtYXAgYXQgMHgxMDIwCi0gKgotICogMTBiaXQgRE1BIHdpdGggd3JhcAotICogdHhkbWEgc2VydmljZSByZXF1ZXN0IHJlZyBpbiB0eGRtYSBhZGRyZXNzIG1hcCBhdCAweDEwMjQKLSAqIHN0cnVjdHVyZSBmb3IgdHhkbWEgc2VydmljZSBjb21wbGV0ZSByZWcgaW4gdHhkbWEgYWRkcmVzcyBtYXAgYXQgMHgxMDI4Ci0gKgotICogNGJpdCBETUEgd2l0aCB3cmFwCi0gKiB0eGRtYSB0eCBkZXNjcmlwdG9yIGNhY2hlIHJlYWQgaW5kZXggcmVnIGluIHR4ZG1hIGFkZHJlc3MgbWFwIGF0IDB4MTAyQwotICogdHhkbWEgdHggZGVzY3JpcHRvciBjYWNoZSB3cml0ZSBpbmRleCByZWcgaW4gdHhkbWEgYWRkcmVzcyBtYXAgYXQgMHgxMDMwCi0gKgotICogdHhkbWEgZXJyb3IgcmVnIGluIHR4ZG1hIGFkZHJlc3MgbWFwIGF0IGFkZHJlc3MgMHgxMDM0Ci0gKiAwOiBQeWxkUmVzZW5kCi0gKiAxOiBQeWxkUmV3aW5kCi0gKiA0OiBEZXNjclJlc2VuZAotICogNTogRGVzY3JSZXdpbmQKLSAqIDg6IFdyYmtSZXNlbmQKLSAqIDk6IFdyYmtSZXdpbmQKLSAqLwotCi0vKgotICogVHggRE1BIE1vZHVsZSBvZiBKQUdDb3JlIEFkZHJlc3MgTWFwcGluZwotICogTG9jYXRlZCBhdCBhZGRyZXNzIDB4MTAwMAotICovCi1zdHJ1Y3QgdHhkbWFfcmVncyB7CQkJLyogTG9jYXRpb246ICovCi0JdTMyIGNzcjsJCQkvKiAgMHgxMDAwICovCi0JdTMyIHByX2Jhc2VfaGk7CQkJLyogIDB4MTAwNCAqLwotCXUzMiBwcl9iYXNlX2xvOwkJCS8qICAweDEwMDggKi8KLQl1MzIgcHJfbnVtX2RlczsJCQkvKiAgMHgxMDBDICovCi0JdTMyIHR4cV93cl9hZGRyOwkJLyogIDB4MTAxMCAqLwotCXUzMiB0eHFfd3JfYWRkcl9leHQ7CQkvKiAgMHgxMDE0ICovCi0JdTMyIHR4cV9yZF9hZGRyOwkJLyogIDB4MTAxOCAqLwotCXUzMiBkbWFfd2JfYmFzZV9oaTsJCS8qICAweDEwMUMgKi8KLQl1MzIgZG1hX3diX2Jhc2VfbG87CQkvKiAgMHgxMDIwICovCi0JdTMyIHNlcnZpY2VfcmVxdWVzdDsJCS8qICAweDEwMjQgKi8KLQl1MzIgc2VydmljZV9jb21wbGV0ZTsJCS8qICAweDEwMjggKi8KLQl1MzIgY2FjaGVfcmRfaW5kZXg7CQkvKiAgMHgxMDJDICovCi0JdTMyIGNhY2hlX3dyX2luZGV4OwkJLyogIDB4MTAzMCAqLwotCXUzMiB0eF9kbWFfZXJyb3I7CQkvKiAgMHgxMDM0ICovCi0JdTMyIGRlc2NfYWJvcnRfY250OwkJLyogIDB4MTAzOCAqLwotCXUzMiBwYXlsb2FkX2Fib3J0X2NudDsJCS8qICAweDEwM2MgKi8KLQl1MzIgd3JpdGViYWNrX2Fib3J0X2NudDsJLyogIDB4MTA0MCAqLwotCXUzMiBkZXNjX3RpbWVvdXRfY250OwkJLyogIDB4MTA0NCAqLwotCXUzMiBwYXlsb2FkX3RpbWVvdXRfY250OwkvKiAgMHgxMDQ4ICovCi0JdTMyIHdyaXRlYmFja190aW1lb3V0X2NudDsJLyogIDB4MTA0YyAqLwotCXUzMiBkZXNjX2Vycm9yX2NudDsJCS8qICAweDEwNTAgKi8KLQl1MzIgcGF5bG9hZF9lcnJvcl9jbnQ7CQkvKiAgMHgxMDU0ICovCi0JdTMyIHdyaXRlYmFja19lcnJvcl9jbnQ7CS8qICAweDEwNTggKi8KLQl1MzIgZHJvcHBlZF90bHBfY250OwkJLyogIDB4MTA1YyAqLwotCXUzMiBuZXdfc2VydmljZV9jb21wbGV0ZTsJLyogIDB4MTA2MCAqLwotCXUzMiBldGhlcm5ldF9wYWNrZXRfY250OwkvKiAgMHgxMDY0ICovCi19OwotCi0vKiBFTkQgT0YgVFhETUEgUkVHSVNURVIgQUREUkVTUyBNQVAgKi8KLQotCi0vKiBTVEFSVCBPRiBSWERNQSBSRUdJU1RFUiBBRERSRVNTIE1BUCAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBjb250cm9sIHN0YXR1cyByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKLSAqIExvY2F0ZWQgYXQgYWRkcmVzcyAweDIwMDAKLSAqCi0gKiBDU1IKLSAqIDA6IGhhbHQKLSAqIDEtMzogdGMKLSAqIDQ6IGZicl9iaWdfZW5kaWFuCi0gKiA1OiBwc3JfYmlnX2VuZGlhbgotICogNjogcGt0X2JpZ19lbmRpYW4KLSAqIDc6IGRtYV9iaWdfZW5kaWFuCi0gKiA4LTk6IGZicjBfc2l6ZQotICogMTA6IGZicjBfZW5hYmxlCi0gKiAxMS0xMjogZmJyMV9zaXplCi0gKiAxMzogZmJyMV9lbmFibGUKLSAqIDE0OiB1bnVzZWQKLSAqIDE1OiBwa3RfZHJvcF9kaXNhYmxlCi0gKiAxNjogcGt0X2RvbmVfZmx1c2gKLSAqIDE3OiBoYWx0X3N0YXR1cwotICogMTgtMzE6IHVudXNlZAotICovCi0KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgZG1hIHdyaXRlYmFjayBsbyByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwMDQKLSAqIERlZmluZWQgZWFybGllciAodTMyKQotICovCi0KLS8qCi0gKiBzdHJ1Y3R1cmUgZm9yIGRtYSB3cml0ZWJhY2sgaGkgcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDA4Ci0gKiBEZWZpbmVkIGVhcmxpZXIgKHUzMikKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBudW1iZXIgb2YgcGFja2V0cyBkb25lIHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcAotICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MjAwQwotICoKLSAqIDMxLTg6IHVudXNlZAotICogNy0wOiBudW0gZG9uZQotICovCi0KLS8qCi0gKiBzdHJ1Y3R1cmUgZm9yIG1heCBwYWNrZXQgdGltZSByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwMTAKLSAqCi0gKiAzMS0xODogdW51c2VkCi0gKiAxNy0wOiB0aW1lIGRvbmUKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciByeCBxdWV1ZSByZWFkIGFkZHJlc3MgcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDE0Ci0gKiBEZWZpbmVkIGVhcmxpZXIgKHUzMikKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciByeCBxdWV1ZSByZWFkIGFkZHJlc3MgZXh0ZXJuYWwgcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDE4Ci0gKiBEZWZpbmVkIGVhcmxpZXIgKHUzMikKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciByeCBxdWV1ZSB3cml0ZSBhZGRyZXNzIHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcAotICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MjAxQwotICogRGVmaW5lZCBlYXJsaWVyICh1MzIpCi0gKi8KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgcGFja2V0IHN0YXR1cyByaW5nIGJhc2UgYWRkcmVzcyBsbyByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwMjAKLSAqIERlZmluZWQgZWFybGllciAodTMyKQotICovCi0KLS8qCi0gKiBzdHJ1Y3R1cmUgZm9yIHBhY2tldCBzdGF0dXMgcmluZyBiYXNlIGFkZHJlc3MgaGkgcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDI0Ci0gKiBEZWZpbmVkIGVhcmxpZXIgKHUzMikKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBwYWNrZXQgc3RhdHVzIHJpbmcgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIHJlZyBpbiByeGRtYSBhZGRyZXNzCi0gKiBtYXAuICBMb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDI4Ci0gKgotICogMzEtMTI6IHVudXNlZAotICogMTEtMDogcHNyIG5kZXMKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBwYWNrZXQgc3RhdHVzIHJpbmcgYXZhaWxhYmxlIG9mZnNldCByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwMkMKLSAqCi0gKiAzMS0xMzogdW51c2VkCi0gKiAxMjogcHNyIGF2YWlsIHdyYXAKLSAqIDExLTA6IHBzciBhdmFpbAotICovCi0KLS8qCi0gKiBzdHJ1Y3R1cmUgZm9yIHBhY2tldCBzdGF0dXMgcmluZyBmdWxsIG9mZnNldCByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwMzAKLSAqCi0gKiAzMS0xMzogdW51c2VkCi0gKiAxMjogcHNyIGZ1bGwgd3JhcAotICogMTEtMDogcHNyIGZ1bGwKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBwYWNrZXQgc3RhdHVzIHJpbmcgYWNjZXNzIGluZGV4IHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcAotICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MjAzNAotICoKLSAqIDMxLTU6IHVudXNlZAotICogNC0wOiBwc3JfYWkKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBwYWNrZXQgc3RhdHVzIHJpbmcgbWluaW11bSBkZXNjcmlwdG9ycyByZWcgaW4gcnhkbWEgYWRkcmVzcwotICogbWFwLiAgTG9jYXRlZCBhdCBhZGRyZXNzIDB4MjAzOAotICoKLSAqIDMxLTEyOiB1bnVzZWQKLSAqIDExLTA6IHBzcl9taW4KLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBmcmVlIGJ1ZmZlciByaW5nIGJhc2UgbG8gYWRkcmVzcyByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwM0MKLSAqIERlZmluZWQgZWFybGllciAodTMyKQotICovCi0KLS8qCi0gKiBzdHJ1Y3R1cmUgZm9yIGZyZWUgYnVmZmVyIHJpbmcgYmFzZSBoaSBhZGRyZXNzIHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcAotICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MjA0MAotICogRGVmaW5lZCBlYXJsaWVyICh1MzIpCi0gKi8KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgZnJlZSBidWZmZXIgcmluZyBudW1iZXIgb2YgZGVzY3JpcHRvcnMgcmVnIGluIHJ4ZG1hIGFkZHJlc3MKLSAqIG1hcC4gIExvY2F0ZWQgYXQgYWRkcmVzcyAweDIwNDQKLSAqCi0gKiAzMS0xMDogdW51c2VkCi0gKiA5LTA6IGZiciBuZGVzYwotICovCi0KLS8qCi0gKiBzdHJ1Y3R1cmUgZm9yIGZyZWUgYnVmZmVyIHJpbmcgMCBhdmFpbGFibGUgb2Zmc2V0IHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcAotICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MjA0OAotICogRGVmaW5lZCBlYXJsaWVyICh1MzIpCi0gKi8KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgZnJlZSBidWZmZXIgcmluZyAwIGZ1bGwgb2Zmc2V0IHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcAotICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MjA0QwotICogRGVmaW5lZCBlYXJsaWVyICh1MzIpCi0gKi8KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgZnJlZSBidWZmZXIgY2FjaGUgMCBmdWxsIG9mZnNldCByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwNTAKLSAqCi0gKiAzMS01OiB1bnVzZWQKLSAqIDQtMDogZmJjIHJkaQotICovCi0KLS8qCi0gKiBzdHJ1Y3R1cmUgZm9yIGZyZWUgYnVmZmVyIHJpbmcgMCBtaW5pbXVtIGRlc2NyaXB0b3IgcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDU0Ci0gKgotICogMzEtMTA6IHVudXNlZAotICogOS0wOiBmYnIgbWluCi0gKi8KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgZnJlZSBidWZmZXIgcmluZyAxIGJhc2UgYWRkcmVzcyBsbyByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwNTggLSAweDIwNUMKLSAqIERlZmluZWQgZWFybGllciAoUlhETUFfRkJSX0JBU0VfTE9fdCBhbmQgUlhETUFfRkJSX0JBU0VfSElfdCkKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBmcmVlIGJ1ZmZlciByaW5nIDEgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIHJlZyBpbiByeGRtYSBhZGRyZXNzCi0gKiBtYXAuICBMb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDYwCi0gKiBEZWZpbmVkIGVhcmxpZXIgKFJYRE1BX0ZCUl9OVU1fREVTX3QpCi0gKi8KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgZnJlZSBidWZmZXIgcmluZyAxIGF2YWlsYWJsZSBvZmZzZXQgcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDY0Ci0gKiBEZWZpbmVkIEVhcmxpZXIgKFJYRE1BX0ZCUl9BVkFJTF9PRkZTRVRfdCkKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBmcmVlIGJ1ZmZlciByaW5nIDEgZnVsbCBvZmZzZXQgcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDY4Ci0gKiBEZWZpbmVkIEVhcmxpZXIgKFJYRE1BX0ZCUl9GVUxMX09GRlNFVF90KQotICovCi0KLS8qCi0gKiBzdHJ1Y3R1cmUgZm9yIGZyZWUgYnVmZmVyIGNhY2hlIDEgcmVhZCBpbmRleCByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwNkMKLSAqIERlZmluZWQgRWFybGllciAoUlhETUFfRkJDX1JEX0lOREVYX3QpCi0gKi8KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgZnJlZSBidWZmZXIgcmluZyAxIG1pbmltdW0gZGVzY3JpcHRvciByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwNzAKLSAqIERlZmluZWQgRWFybGllciAoUlhETUFfRkJSX01JTl9ERVNfdCkKLSAqLwotCi0vKgotICogUnggRE1BIE1vZHVsZSBvZiBKQUdDb3JlIEFkZHJlc3MgTWFwcGluZwotICogTG9jYXRlZCBhdCBhZGRyZXNzIDB4MjAwMAotICovCi1zdHJ1Y3QgcnhkbWFfcmVncyB7CQkJCQkvKiBMb2NhdGlvbjogKi8KLQl1MzIgY3NyOwkJCQkJLyogIDB4MjAwMCAqLwotCXUzMiBkbWFfd2JfYmFzZV9sbzsJCQkJLyogIDB4MjAwNCAqLwotCXUzMiBkbWFfd2JfYmFzZV9oaTsJCQkJLyogIDB4MjAwOCAqLwotCXUzMiBudW1fcGt0X2RvbmU7CQkJCS8qICAweDIwMEMgKi8KLQl1MzIgbWF4X3BrdF90aW1lOwkJCQkvKiAgMHgyMDEwICovCi0JdTMyIHJ4cV9yZF9hZGRyOwkJCQkvKiAgMHgyMDE0ICovCi0JdTMyIHJ4cV9yZF9hZGRyX2V4dDsJCQkJLyogIDB4MjAxOCAqLwotCXUzMiByeHFfd3JfYWRkcjsJCQkJLyogIDB4MjAxQyAqLwotCXUzMiBwc3JfYmFzZV9sbzsJCQkJLyogIDB4MjAyMCAqLwotCXUzMiBwc3JfYmFzZV9oaTsJCQkJLyogIDB4MjAyNCAqLwotCXUzMiBwc3JfbnVtX2RlczsJCQkJLyogIDB4MjAyOCAqLwotCXUzMiBwc3JfYXZhaWxfb2Zmc2V0OwkJCQkvKiAgMHgyMDJDICovCi0JdTMyIHBzcl9mdWxsX29mZnNldDsJCQkJLyogIDB4MjAzMCAqLwotCXUzMiBwc3JfYWNjZXNzX2luZGV4OwkJCQkvKiAgMHgyMDM0ICovCi0JdTMyIHBzcl9taW5fZGVzOwkJCQkvKiAgMHgyMDM4ICovCi0JdTMyIGZicjBfYmFzZV9sbzsJCQkJLyogIDB4MjAzQyAqLwotCXUzMiBmYnIwX2Jhc2VfaGk7CQkJCS8qICAweDIwNDAgKi8KLQl1MzIgZmJyMF9udW1fZGVzOwkJCQkvKiAgMHgyMDQ0ICovCi0JdTMyIGZicjBfYXZhaWxfb2Zmc2V0OwkJCQkvKiAgMHgyMDQ4ICovCi0JdTMyIGZicjBfZnVsbF9vZmZzZXQ7CQkJCS8qICAweDIwNEMgKi8KLQl1MzIgZmJyMF9yZF9pbmRleDsJCQkJLyogIDB4MjA1MCAqLwotCXUzMiBmYnIwX21pbl9kZXM7CQkJCS8qICAweDIwNTQgKi8KLQl1MzIgZmJyMV9iYXNlX2xvOwkJCQkvKiAgMHgyMDU4ICovCi0JdTMyIGZicjFfYmFzZV9oaTsJCQkJLyogIDB4MjA1QyAqLwotCXUzMiBmYnIxX251bV9kZXM7CQkJCS8qICAweDIwNjAgKi8KLQl1MzIgZmJyMV9hdmFpbF9vZmZzZXQ7CQkJCS8qICAweDIwNjQgKi8KLQl1MzIgZmJyMV9mdWxsX29mZnNldDsJCQkJLyogIDB4MjA2OCAqLwotCXUzMiBmYnIxX3JkX2luZGV4OwkJCQkvKiAgMHgyMDZDICovCi0JdTMyIGZicjFfbWluX2RlczsJCQkJLyogIDB4MjA3MCAqLwotfTsKLQotLyogRU5EIE9GIFJYRE1BIFJFR0lTVEVSIEFERFJFU1MgTUFQICovCi0KLQotLyogU1RBUlQgT0YgVFhNQUMgUkVHSVNURVIgQUREUkVTUyBNQVAgKi8KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgY29udHJvbCByZWcgaW4gdHhtYWMgYWRkcmVzcyBtYXAKLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDMwMDAKLSAqCi0gKiBiaXRzCi0gKiAzMS04OiB1bnVzZWQKLSAqIDc6IGNrbHNlZ19kaXNhYmxlCi0gKiA2OiBja2JjbnRfZGlzYWJsZQotICogNTogY2tzZWdudW0KLSAqIDQ6IGFzeW5jX2Rpc2FibGUKLSAqIDM6IGZjX2Rpc2FibGUKLSAqIDI6IG1jaWZfZGlzYWJsZQotICogMTogbWlmX2Rpc2FibGUKLSAqIDA6IHR4bWFjX2VuCi0gKi8KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3Igc2hhZG93IHBvaW50ZXIgcmVnIGluIHR4bWFjIGFkZHJlc3MgbWFwCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgzMDA0Ci0gKiAzMS0yNzogcmVzZXJ2ZWQKLSAqIDI2LTE2OiB0eHEgcmQgcHRyCi0gKiAxNS0xMTogcmVzZXJ2ZWQKLSAqIDEwLTA6IHR4cSB3ciBwdHIKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBlcnJvciBjb3VudCByZWcgaW4gdHhtYWMgYWRkcmVzcyBtYXAKLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDMwMDgKLSAqCi0gKiAzMS0xMjogdW51c2VkCi0gKiAxMS04OiByZXNlcnZlZAotICogNy00OiB0eHFfdW5kZXJydW4KLSAqIDMtMDogZmlmb191bmRlcnJ1bgotICovCi0KLS8qCi0gKiBzdHJ1Y3R1cmUgZm9yIG1heCBmaWxsIHJlZyBpbiB0eG1hYyBhZGRyZXNzIG1hcAotICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MzAwQwotICogMzEtMTI6IHVudXNlZAotICogMTEtMDogbWF4IGZpbGwKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBjZiBwYXJhbWV0ZXIgcmVnIGluIHR4bWFjIGFkZHJlc3MgbWFwCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgzMDEwCi0gKiAzMS0xNjogY2ZlcAotICogMTUtMDogY2ZwdAotICovCi0KLS8qCi0gKiBzdHJ1Y3R1cmUgZm9yIHR4IHRlc3QgcmVnIGluIHR4bWFjIGFkZHJlc3MgbWFwCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgzMDE0Ci0gKiAzMS0xNzogdW51c2VkCi0gKiAxNjogcmVzZXJ2ZWQxCi0gKiAxNTogdHh0ZXN0X2VuCi0gKiAxNC0xMTogdW51c2VkCi0gKiAxMC0wOiB0eHEgdGVzdCBwb2ludGVyCi0gKi8KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgZXJyb3IgcmVnIGluIHR4bWFjIGFkZHJlc3MgbWFwCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgzMDE4Ci0gKgotICogMzEtOTogdW51c2VkCi0gKiA4OiBmaWZvX3VuZGVycnVuCi0gKiA3LTY6IHVudXNlZAotICogNTogY3RybDJfZXJyCi0gKiA0OiB0eHFfdW5kZXJydW4KLSAqIDM6IGJjbnRfZXJyCi0gKiAyOiBsc2VnX2VycgotICogMTogc2VnbnVtX2VycgotICogMDogc2VnMF9lcnIKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBlcnJvciBpbnRlcnJ1cHQgcmVnIGluIHR4bWFjIGFkZHJlc3MgbWFwCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgzMDFDCi0gKgotICogMzEtOTogdW51c2VkCi0gKiA4OiBmaWZvX3VuZGVycnVuCi0gKiA3LTY6IHVudXNlZAotICogNTogY3RybDJfZXJyCi0gKiA0OiB0eHFfdW5kZXJydW4KLSAqIDM6IGJjbnRfZXJyCi0gKiAyOiBsc2VnX2VycgotICogMTogc2VnbnVtX2VycgotICogMDogc2VnMF9lcnIKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBlcnJvciBpbnRlcnJ1cHQgcmVnIGluIHR4bWFjIGFkZHJlc3MgbWFwCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgzMDIwCi0gKgotICogMzEtMjogdW51c2VkCi0gKiAxOiBicF9yZXEKLSAqIDA6IGJwX3hvbnhvZmYKLSAqLwotCi0vKgotICogVHggTUFDIE1vZHVsZSBvZiBKQUdDb3JlIEFkZHJlc3MgTWFwcGluZwotICovCi1zdHJ1Y3QgdHhtYWNfcmVncyB7CQkJLyogTG9jYXRpb246ICovCi0JdTMyIGN0bDsJCQkvKiAgMHgzMDAwICovCi0JdTMyIHNoYWRvd19wdHI7CQkJLyogIDB4MzAwNCAqLwotCXUzMiBlcnJfY250OwkJCS8qICAweDMwMDggKi8KLQl1MzIgbWF4X2ZpbGw7CQkJLyogIDB4MzAwQyAqLwotCXUzMiBjZl9wYXJhbTsJCQkvKiAgMHgzMDEwICovCi0JdTMyIHR4X3Rlc3Q7CQkJLyogIDB4MzAxNCAqLwotCXUzMiBlcnI7CQkJLyogIDB4MzAxOCAqLwotCXUzMiBlcnJfaW50OwkJCS8qICAweDMwMUMgKi8KLQl1MzIgYnBfY3RybDsJCQkvKiAgMHgzMDIwICovCi19OwotCi0vKiBFTkQgT0YgVFhNQUMgUkVHSVNURVIgQUREUkVTUyBNQVAgKi8KLQotLyogU1RBUlQgT0YgUlhNQUMgUkVHSVNURVIgQUREUkVTUyBNQVAgKi8KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgcnhtYWMgY29udHJvbCByZWcgaW4gcnhtYWMgYWRkcmVzcyBtYXAKLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDQwMDAKLSAqCi0gKiAzMS03OiByZXNlcnZlZAotICogNjogcnhtYWNfaW50X2Rpc2FibGUKLSAqIDU6IGFzeW5jX2Rpc2FibGUKLSAqIDQ6IG1pZl9kaXNhYmxlCi0gKiAzOiB3b2xfZGlzYWJsZQotICogMjogcGt0X2ZpbHRlcl9kaXNhYmxlCi0gKiAxOiBtY2lmX2Rpc2FibGUKLSAqIDA6IHJ4bWFjX2VuCi0gKi8KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgV2FrZSBPbiBMYW4gQ29udHJvbCBhbmQgQ1JDIDAgcmVnIGluIHJ4bWFjIGFkZHJlc3MgbWFwCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg0MDA0Ci0gKiAzMS0xNjogY3JjCi0gKiAxNS0xMjogcmVzZXJ2ZWQKLSAqIDExOiBpZ25vcmVfcHAKLSAqIDEwOiBpZ25vcmVfbXAKLSAqIDk6IGNscl9pbnRyCi0gKiA4OiBpZ25vcmVfbGlua19jaGcKLSAqIDc6IGlnbm9yZV91bmkKLSAqIDY6IGlnbm9yZV9tdWx0aQotICogNTogaWdub3JlX2Jyb2FkCi0gKiA0LTA6IHZhbGlkX2NyYyA0LTAKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBDUkMgMSBhbmQgQ1JDIDIgcmVnIGluIHJ4bWFjIGFkZHJlc3MgbWFwCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg0MDA4Ci0gKgotICogMzEtMTY6IGNyYzIKLSAqIDE1LTA6IGNyYzEKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBDUkMgMyBhbmQgQ1JDIDQgcmVnIGluIHJ4bWFjIGFkZHJlc3MgbWFwCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg0MDBDCi0gKgotICogMzEtMTY6IGNyYzQKLSAqIDE1LTA6IGNyYzMKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBXYWtlIE9uIExhbiBTb3VyY2UgQWRkcmVzcyBMbyByZWcgaW4gcnhtYWMgYWRkcmVzcyBtYXAKLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDQwMTAKLSAqCi0gKiAzMS0yNDogc2EzCi0gKiAyMy0xNjogc2E0Ci0gKiAxNS04OiBzYTUKLSAqIDctMDogc2E2Ci0gKi8KLQotI2RlZmluZSBFVF9XT0xfTE9fU0EzX1NISUZUIDI0Ci0jZGVmaW5lIEVUX1dPTF9MT19TQTRfU0hJRlQgMTYKLSNkZWZpbmUgRVRfV09MX0xPX1NBNV9TSElGVCA4Ci0KLS8qCi0gKiBzdHJ1Y3R1cmUgZm9yIFdha2UgT24gTGFuIFNvdXJjZSBBZGRyZXNzIEhpIHJlZyBpbiByeG1hYyBhZGRyZXNzIG1hcAotICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NDAxNAotICoKLSAqIDMxLTE2OiByZXNlcnZlZAotICogMTUtODogc2ExCi0gKiA3LTA6IHNhMgotICovCi0KLSNkZWZpbmUgRVRfV09MX0hJX1NBMV9TSElGVCA4Ci0KLS8qCi0gKiBzdHJ1Y3R1cmUgZm9yIFdha2UgT24gTGFuIG1hc2sgcmVnIGluIHJ4bWFjIGFkZHJlc3MgbWFwCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg0MDE4IC0gMHg0MDY0Ci0gKiBEZWZpbmVkIGVhcmxpZXIgKHUzMikKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBVbmljYXN0IFBha2V0IEZpbHRlciBBZGRyZXNzIDEgcmVnIGluIHJ4bWFjIGFkZHJlc3MgbWFwCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg0MDY4Ci0gKgotICogMzEtMjQ6IGFkZHIxXzMKLSAqIDIzLTE2OiBhZGRyMV80Ci0gKiAxNS04OiBhZGRyMV81Ci0gKiA3LTA6IGFkZHIxXzYKLSAqLwotCi0jZGVmaW5lIEVUX1VOSV9QRl9BRERSMV8zX1NISUZUIDI0Ci0jZGVmaW5lIEVUX1VOSV9QRl9BRERSMV80X1NISUZUIDE2Ci0jZGVmaW5lIEVUX1VOSV9QRl9BRERSMV81X1NISUZUIDgKLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgVW5pY2FzdCBQYWtldCBGaWx0ZXIgQWRkcmVzcyAyIHJlZyBpbiByeG1hYyBhZGRyZXNzIG1hcAotICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NDA2QwotICoKLSAqIDMxLTI0OiBhZGRyMl8zCi0gKiAyMy0xNjogYWRkcjJfNAotICogMTUtODogYWRkcjJfNQotICogNy0wOiBhZGRyMl82Ci0gKi8KLQotI2RlZmluZSBFVF9VTklfUEZfQUREUjJfM19TSElGVCAyNAotI2RlZmluZSBFVF9VTklfUEZfQUREUjJfNF9TSElGVCAxNgotI2RlZmluZSBFVF9VTklfUEZfQUREUjJfNV9TSElGVCA4Ci0KLS8qCi0gKiBzdHJ1Y3R1cmUgZm9yIFVuaWNhc3QgUGFrZXQgRmlsdGVyIEFkZHJlc3MgMSAmIDIgcmVnIGluIHJ4bWFjIGFkZHJlc3MgbWFwCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg0MDcwCi0gKgotICogMzEtMjQ6IGFkZHIyXzEKLSAqIDIzLTE2OiBhZGRyMl8yCi0gKiAxNS04OiBhZGRyMV8xCi0gKiA3LTA6IGFkZHIxXzIKLSAqLwotCi0jZGVmaW5lIEVUX1VOSV9QRl9BRERSMl8xX1NISUZUIDI0Ci0jZGVmaW5lIEVUX1VOSV9QRl9BRERSMl8yX1NISUZUIDE2Ci0jZGVmaW5lIEVUX1VOSV9QRl9BRERSMV8xX1NISUZUIDgKLQotCi0vKgotICogc3RydWN0dXJlIGZvciBNdWx0aWNhc3QgSGFzaCByZWcgaW4gcnhtYWMgYWRkcmVzcyBtYXAKLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDQwNzQgLSAweDQwODAKLSAqIERlZmluZWQgZWFybGllciAodTMyKQotICovCi0KLS8qCi0gKiBzdHJ1Y3R1cmUgZm9yIFBhY2tldCBGaWx0ZXIgQ29udHJvbCByZWcgaW4gcnhtYWMgYWRkcmVzcyBtYXAKLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDQwODQKLSAqCi0gKiAzMS0yMzogdW51c2VkCi0gKiAyMi0xNjogbWluX3BrdF9zaXplCi0gKiAxNS00OiB1bnVzZWQKLSAqIDM6IGZpbHRlcl9mcmFnX2VuCi0gKiAyOiBmaWx0ZXJfdW5pX2VuCi0gKiAxOiBmaWx0ZXJfbXVsdGlfZW4KLSAqIDA6IGZpbHRlcl9icm9hZF9lbgotICovCi0KLS8qCi0gKiBzdHJ1Y3R1cmUgZm9yIE1lbW9yeSBDb250cm9sbGVyIEludGVyZmFjZSBDb250cm9sIE1heCBTZWdtZW50IHJlZyBpbiByeG1hYwotICogYWRkcmVzcyBtYXAuICBMb2NhdGVkIGF0IGFkZHJlc3MgMHg0MDg4Ci0gKgotICogMzEtMTA6IHJlc2VydmVkCi0gKiA5LTI6IG1heF9zaXplCi0gKiAxOiBmY19lbgotICogMDogc2VnX2VuCi0gKi8KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgTWVtb3J5IENvbnRyb2xsZXIgSW50ZXJmYWNlIFdhdGVyIE1hcmsgcmVnIGluIHJ4bWFjIGFkZHJlc3MKLSAqIG1hcC4gIExvY2F0ZWQgYXQgYWRkcmVzcyAweDQwOEMKLSAqCi0gKiAzMS0yNjogdW51c2VkCi0gKiAyNS0xNjogbWFya19oaQotICogMTUtMTA6IHVudXNlZAotICogOS0wOiBtYXJrX2xvCi0gKi8KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgUnggUXVldWUgRGlhbG9nIHJlZyBpbiByeG1hYyBhZGRyZXNzIG1hcC4KLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDQwOTAKLSAqCi0gKiAzMS0yNjogcmVzZXJ2ZWQKLSAqIDI1LTE2OiByZF9wdHIKLSAqIDE1LTEwOiByZXNlcnZlZAotICogOS0wOiB3cl9wdHIKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBzcGFjZSBhdmFpbGFibGUgcmVnIGluIHJ4bWFjIGFkZHJlc3MgbWFwLgotICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NDA5NAotICoKLSAqIDMxLTE3OiByZXNlcnZlZAotICogMTY6IHNwYWNlX2F2YWlsX2VuCi0gKiAxNS0xMDogcmVzZXJ2ZWQKLSAqIDktMDogc3BhY2VfYXZhaWwKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBtYW5hZ2VtZW50IGludGVyZmFjZSByZWcgaW4gcnhtYWMgYWRkcmVzcyBtYXAuCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg0MDk4Ci0gKgotICogMzEtMTg6IHJlc2VydmVkCi0gKiAxNzogZHJvcF9wa3RfZW4KLSAqIDE2LTA6IGRyb3BfcGt0X21hc2sKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBFcnJvciByZWcgaW4gcnhtYWMgYWRkcmVzcyBtYXAuCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg0MDlDCi0gKgotICogMzEtNDogdW51c2VkCi0gKiAzOiBtaWYKLSAqIDI6IGFzeW5jCi0gKiAxOiBwa3RfZmlsdGVyCi0gKiAwOiBtY2lmCi0gKi8KLQotLyoKLSAqIFJ4IE1BQyBNb2R1bGUgb2YgSkFHQ29yZSBBZGRyZXNzIE1hcHBpbmcKLSAqLwotc3RydWN0IHJ4bWFjX3JlZ3MgewkJCQkJLyogTG9jYXRpb246ICovCi0JdTMyIGN0cmw7CQkJCQkvKiAgMHg0MDAwICovCi0JdTMyIGNyYzA7CQkJCQkvKiAgMHg0MDA0ICovCi0JdTMyIGNyYzEyOwkJCQkJLyogIDB4NDAwOCAqLwotCXUzMiBjcmMzNDsJCQkJCS8qICAweDQwMEMgKi8KLQl1MzIgc2FfbG87CQkJCQkvKiAgMHg0MDEwICovCi0JdTMyIHNhX2hpOwkJCQkJLyogIDB4NDAxNCAqLwotCXUzMiBtYXNrMF93b3JkMDsJCQkJLyogIDB4NDAxOCAqLwotCXUzMiBtYXNrMF93b3JkMTsJCQkJLyogIDB4NDAxQyAqLwotCXUzMiBtYXNrMF93b3JkMjsJCQkJLyogIDB4NDAyMCAqLwotCXUzMiBtYXNrMF93b3JkMzsJCQkJLyogIDB4NDAyNCAqLwotCXUzMiBtYXNrMV93b3JkMDsJCQkJLyogIDB4NDAyOCAqLwotCXUzMiBtYXNrMV93b3JkMTsJCQkJLyogIDB4NDAyQyAqLwotCXUzMiBtYXNrMV93b3JkMjsJCQkJLyogIDB4NDAzMCAqLwotCXUzMiBtYXNrMV93b3JkMzsJCQkJLyogIDB4NDAzNCAqLwotCXUzMiBtYXNrMl93b3JkMDsJCQkJLyogIDB4NDAzOCAqLwotCXUzMiBtYXNrMl93b3JkMTsJCQkJLyogIDB4NDAzQyAqLwotCXUzMiBtYXNrMl93b3JkMjsJCQkJLyogIDB4NDA0MCAqLwotCXUzMiBtYXNrMl93b3JkMzsJCQkJLyogIDB4NDA0NCAqLwotCXUzMiBtYXNrM193b3JkMDsJCQkJLyogIDB4NDA0OCAqLwotCXUzMiBtYXNrM193b3JkMTsJCQkJLyogIDB4NDA0QyAqLwotCXUzMiBtYXNrM193b3JkMjsJCQkJLyogIDB4NDA1MCAqLwotCXUzMiBtYXNrM193b3JkMzsJCQkJLyogIDB4NDA1NCAqLwotCXUzMiBtYXNrNF93b3JkMDsJCQkJLyogIDB4NDA1OCAqLwotCXUzMiBtYXNrNF93b3JkMTsJCQkJLyogIDB4NDA1QyAqLwotCXUzMiBtYXNrNF93b3JkMjsJCQkJLyogIDB4NDA2MCAqLwotCXUzMiBtYXNrNF93b3JkMzsJCQkJLyogIDB4NDA2NCAqLwotCXUzMiB1bmlfcGZfYWRkcjE7CQkJCS8qICAweDQwNjggKi8KLQl1MzIgdW5pX3BmX2FkZHIyOwkJCQkvKiAgMHg0MDZDICovCi0JdTMyIHVuaV9wZl9hZGRyMzsJCQkJLyogIDB4NDA3MCAqLwotCXUzMiBtdWx0aV9oYXNoMTsJCQkJLyogIDB4NDA3NCAqLwotCXUzMiBtdWx0aV9oYXNoMjsJCQkJLyogIDB4NDA3OCAqLwotCXUzMiBtdWx0aV9oYXNoMzsJCQkJLyogIDB4NDA3QyAqLwotCXUzMiBtdWx0aV9oYXNoNDsJCQkJLyogIDB4NDA4MCAqLwotCXUzMiBwZl9jdHJsOwkJCQkJLyogIDB4NDA4NCAqLwotCXUzMiBtY2lmX2N0cmxfbWF4X3NlZzsJCQkJLyogIDB4NDA4OCAqLwotCXUzMiBtY2lmX3dhdGVyX21hcms7CQkJCS8qICAweDQwOEMgKi8KLQl1MzIgcnhxX2RpYWc7CQkJCQkvKiAgMHg0MDkwICovCi0JdTMyIHNwYWNlX2F2YWlsOwkJCQkvKiAgMHg0MDk0ICovCi0KLQl1MzIgbWlmX2N0cmw7CQkJCQkvKiAgMHg0MDk4ICovCi0JdTMyIGVycl9yZWc7CQkJCQkvKiAgMHg0MDlDICovCi19OwotCi0vKiBFTkQgT0YgUlhNQUMgUkVHSVNURVIgQUREUkVTUyBNQVAgKi8KLQotCi0vKiBTVEFSVCBPRiBNQUMgUkVHSVNURVIgQUREUkVTUyBNQVAgKi8KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgY29uZmlndXJhdGlvbiAjMSByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgotICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTAwMAotICoKLSAqIDMxOiBzb2Z0IHJlc2V0Ci0gKiAzMDogc2ltIHJlc2V0Ci0gKiAyOS0yMDogcmVzZXJ2ZWQKLSAqIDE5OiByZXNldCByeCBtYwotICogMTg6IHJlc2V0IHR4IG1jCi0gKiAxNzogcmVzZXQgcnggZnVuYwotICogMTY6IHJlc2V0IHR4IGZuYwotICogMTUtOTogcmVzZXJ2ZWQKLSAqIDg6IGxvb3BiYWNrCi0gKiA3LTY6IHJlc2VydmVkCi0gKiA1OiByeCBmbG93Ci0gKiA0OiB0eCBmbG93Ci0gKiAzOiBzeW5jZCByeCBlbgotICogMjogcnggZW5hYmxlCi0gKiAxOiBzeW5jZCB0eCBlbgotICogMDogdHggZW5hYmxlCi0gKi8KLQotI2RlZmluZSBDRkcxX0xPT1BCQUNLCTB4MDAwMDAxMDAKLSNkZWZpbmUgQ0ZHMV9SWF9GTE9XCTB4MDAwMDAwMjAKLSNkZWZpbmUgQ0ZHMV9UWF9GTE9XCTB4MDAwMDAwMTAKLSNkZWZpbmUgQ0ZHMV9SWF9FTkFCTEUJMHgwMDAwMDAwNAotI2RlZmluZSBDRkcxX1RYX0VOQUJMRQkweDAwMDAwMDAxCi0jZGVmaW5lIENGRzFfV0FJVAkweDAwMDAwMDBBCS8qIFJYICYgVFggc3luY2QgKi8KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgY29uZmlndXJhdGlvbiAjMiByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgotICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTAwNAotICogMzEtMTY6IHJlc2VydmVkCi0gKiAxNS0xMjogcHJlYW1ibGUKLSAqIDExLTEwOiByZXNlcnZlZAotICogOS04OiBpZiBtb2RlCi0gKiA3LTY6IHJlc2VydmVkCi0gKiA1OiBodWdlIGZyYW1lCi0gKiA0OiBsZW5ndGggY2hlY2sKLSAqIDM6IHVuZGVmaW5lZAotICogMjogcGFkIGNyYwotICogMTogY3JjIGVuYWJsZQotICogMDogZnVsbCBkdXBsZXgKLSAqLwotCi0KLS8qCi0gKiBzdHJ1Y3R1cmUgZm9yIEludGVycGFja2V0IGdhcCByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgotICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTAwOAotICoKLSAqIDMxOiByZXNlcnZlZAotICogMzAtMjQ6IG5vbiBCMkIgaXBnIDEKLSAqIDIzOiB1bmRlZmluZWQKLSAqIDIyLTE2OiBub24gQjJCIGlwZyAyCi0gKiAxNS04OiBNaW4gaWZnIGVuZm9yY2UKLSAqIDctMDogQjJCIGlwZwotICoKLSAqIHN0cnVjdHVyZSBmb3IgaGFsZiBkdXBsZXggcmVnIGluIG1hYyBhZGRyZXNzIG1hcC4KLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDUwMEMKLSAqIDMxLTI0OiByZXNlcnZlZAotICogMjMtMjA6IEFsdCBCRUIgdHJ1bmMKLSAqIDE5OiBBbHQgQkVCIGVuYWJsZQotICogMTg6IEJQIG5vIGJhY2tvZmYKLSAqIDE3OiBubyBiYWNrb2ZmCi0gKiAxNjogZXhjZXNzIGRlZmVyCi0gKiAxNS0xMjogcmUteG1pdCBtYXgKLSAqIDExLTEwOiByZXNlcnZlZAotICogOS0wOiBjb2xsaXNpb24gd2luZG93Ci0gKi8KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgTWF4aW11bSBGcmFtZSBMZW5ndGggcmVnIGluIG1hYyBhZGRyZXNzIG1hcC4KLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDUwMTA6IGJpdHMgMC0xNSBob2xkIHRoZSBsZW5ndGguCi0gKi8KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgUmVzZXJ2ZSAxIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDE0IC0gMHg1MDE4Ci0gKiBEZWZpbmVkIGVhcmxpZXIgKHUzMikKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBUZXN0IHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDFDCi0gKiB0ZXN0OiBiaXRzIDAtMiwgcmVzdCB1bnVzZWQKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBNSUkgTWFuYWdlbWVudCBDb25maWd1cmF0aW9uIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDIwCi0gKgotICogMzE6IHJlc2V0IE1JSSBtZ210Ci0gKiAzMC02OiB1bnVzZWQKLSAqIDU6IHNjYW4gYXV0byBpbmNyZW1lbnQKLSAqIDQ6IHByZWFtYmxlIHN1cHByZXNzCi0gKiAzOiB1bmRlZmluZWQKLSAqIDItMDogbWdtdCBjbG9jayByZXNldAotICovCi0KLS8qCi0gKiBzdHJ1Y3R1cmUgZm9yIE1JSSBNYW5hZ2VtZW50IENvbW1hbmQgcmVnIGluIG1hYyBhZGRyZXNzIG1hcC4KLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDUwMjQKLSAqIGJpdCAxOiBzY2FuIGN5Y2xlCi0gKiBiaXQgMDogcmVhZCBjeWNsZQotICovCi0KLS8qCi0gKiBzdHJ1Y3R1cmUgZm9yIE1JSSBNYW5hZ2VtZW50IEFkZHJlc3MgcmVnIGluIG1hYyBhZGRyZXNzIG1hcC4KLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDUwMjgKLSAqIDMxLTEzOiByZXNlcnZlZAotICogMTItODogcGh5IGFkZHIKLSAqIDctNTogcmVzZXJ2ZWQKLSAqIDQtMDogcmVnaXN0ZXIKLSAqLwotCi0jZGVmaW5lIE1JSV9BRERSKHBoeSwgcmVnKQkoKHBoeSkgPDwgOCB8IChyZWcpKQotCi0vKgotICogc3RydWN0dXJlIGZvciBNSUkgTWFuYWdlbWVudCBDb250cm9sIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDJDCi0gKiAzMS0xNjogcmVzZXJ2ZWQKLSAqIDE1LTA6IHBoeSBjb250cm9sCi0gKi8KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgTUlJIE1hbmFnZW1lbnQgU3RhdHVzIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDMwCi0gKiAzMS0xNjogcmVzZXJ2ZWQKLSAqIDE1LTA6IHBoeSBjb250cm9sCi0gKi8KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgTUlJIE1hbmFnZW1lbnQgSW5kaWNhdG9ycyByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgotICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTAzNAotICogMzEtMzogcmVzZXJ2ZWQKLSAqIDI6IG5vdCB2YWxpZAotICogMTogc2Nhbm5pbmcKLSAqIDA6IGJ1c3kKLSAqLwotCi0jZGVmaW5lIE1HTVRfQlVTWQkweDAwMDAwMDAxCS8qIGJ1c3kgKi8KLSNkZWZpbmUgTUdNVF9XQUlUCTB4MDAwMDAwMDUJLyogYnVzeSB8IG5vdCB2YWxpZCAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBJbnRlcmZhY2UgQ29udHJvbCByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgotICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTAzOAotICoKLSAqIDMxOiByZXNldCBpZiBtb2R1bGUKLSAqIDMwLTI4OiByZXNlcnZlZAotICogMjc6IHRiaSBtb2RlCi0gKiAyNjogZ2hkIG1vZGUKLSAqIDI1OiBsaGQgbW9kZQotICogMjQ6IHBoeSBtb2RlCi0gKiAyMzogcmVzZXQgcGVyIG1paQotICogMjItMTc6IHJlc2VydmVkCi0gKiAxNjogc3BlZWQKLSAqIDE1OiByZXNldCBwZTEwMHgKLSAqIDE0LTExOiByZXNlcnZlZAotICogMTA6IGZvcmNlIHF1aWV0Ci0gKiA5OiBubyBjaXBoZXIKLSAqIDg6IGRpc2FibGUgbGluayBmYWlsCi0gKiA3OiByZXNldCBncHNpCi0gKiA2LTE6IHJlc2VydmVkCi0gKiAwOiBlbmFibGUgamFiYmVyIHByb3RlY3Rpb24KLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBJbnRlcmZhY2UgU3RhdHVzIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDNDCi0gKgotICogMzEtMTA6IHJlc2VydmVkCi0gKiA5OiBleGNlc3NfZGVmZXIKLSAqIDg6IGNsYXNoCi0gKiA3OiBwaHlfamFiYmVyCi0gKiA2OiBwaHlfbGlua19vawotICogNTogcGh5X2Z1bGxfZHVwbGV4Ci0gKiA0OiBwaHlfc3BlZWQKLSAqIDM6IHBlMTAweF9saW5rX2ZhaWwKLSAqIDI6IHBlMTB0X2xvc3NfY2FycmllcgotICogMTogcGUxMHRfc3FlX2Vycm9yCi0gKiAwOiBwZTEwdF9qYWJiZXIKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBNYWMgU3RhdGlvbiBBZGRyZXNzLCBQYXJ0IDEgcmVnIGluIG1hYyBhZGRyZXNzIG1hcC4KLSAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDUwNDAKLSAqCi0gKiAzMS0yNDogT2N0ZXQ2Ci0gKiAyMy0xNjogT2N0ZXQ1Ci0gKiAxNS04OiBPY3RldDQKLSAqIDctMDogT2N0ZXQzCi0gKi8KLQotI2RlZmluZSBFVF9NQUNfU1RBVElPTl9BRERSMV9PQzZfU0hJRlQgMjQKLSNkZWZpbmUgRVRfTUFDX1NUQVRJT05fQUREUjFfT0M1X1NISUZUIDE2Ci0jZGVmaW5lIEVUX01BQ19TVEFUSU9OX0FERFIxX09DNF9TSElGVCA4Ci0KLS8qCi0gKiBzdHJ1Y3R1cmUgZm9yIE1hYyBTdGF0aW9uIEFkZHJlc3MsIFBhcnQgMiByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgotICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTA0NAotICoKLSAqIDMxLTI0OiBPY3RldDIKLSAqIDIzLTE2OiBPY3RldDEKLSAqIDE1LTA6IHJlc2VydmVkCi0gKi8KLQotI2RlZmluZSBFVF9NQUNfU1RBVElPTl9BRERSMl9PQzJfU0hJRlQgMjQKLSNkZWZpbmUgRVRfTUFDX1NUQVRJT05fQUREUjJfT0MxX1NISUZUIDE2Ci0KLS8qCi0gKiBNQUMgTW9kdWxlIG9mIEpBR0NvcmUgQWRkcmVzcyBNYXBwaW5nCi0gKi8KLXN0cnVjdCBtYWNfcmVncyB7CQkJCQkvKiBMb2NhdGlvbjogKi8KLQl1MzIgY2ZnMTsJCQkJCS8qICAweDUwMDAgKi8KLQl1MzIgY2ZnMjsJCQkJCS8qICAweDUwMDQgKi8KLQl1MzIgaXBnOwkJCQkJLyogIDB4NTAwOCAqLwotCXUzMiBoZmRwOwkJCQkJLyogIDB4NTAwQyAqLwotCXUzMiBtYXhfZm1fbGVuOwkJCQkJLyogIDB4NTAxMCAqLwotCXUzMiByc3YxOwkJCQkJLyogIDB4NTAxNCAqLwotCXUzMiByc3YyOwkJCQkJLyogIDB4NTAxOCAqLwotCXUzMiBtYWNfdGVzdDsJCQkJCS8qICAweDUwMUMgKi8KLQl1MzIgbWlpX21nbXRfY2ZnOwkJCQkvKiAgMHg1MDIwICovCi0JdTMyIG1paV9tZ210X2NtZDsJCQkJLyogIDB4NTAyNCAqLwotCXUzMiBtaWlfbWdtdF9hZGRyOwkJCQkvKiAgMHg1MDI4ICovCi0JdTMyIG1paV9tZ210X2N0cmw7CQkJCS8qICAweDUwMkMgKi8KLQl1MzIgbWlpX21nbXRfc3RhdDsJCQkJLyogIDB4NTAzMCAqLwotCXUzMiBtaWlfbWdtdF9pbmRpY2F0b3I7CQkJCS8qICAweDUwMzQgKi8KLQl1MzIgaWZfY3RybDsJCQkJCS8qICAweDUwMzggKi8KLQl1MzIgaWZfc3RhdDsJCQkJCS8qICAweDUwM0MgKi8KLQl1MzIgc3RhdGlvbl9hZGRyXzE7CQkJCS8qICAweDUwNDAgKi8KLQl1MzIgc3RhdGlvbl9hZGRyXzI7CQkJCS8qICAweDUwNDQgKi8KLX07Ci0KLS8qIEVORCBPRiBNQUMgUkVHSVNURVIgQUREUkVTUyBNQVAgKi8KLQotLyogU1RBUlQgT0YgTUFDIFNUQVQgUkVHSVNURVIgQUREUkVTUyBNQVAgKi8KLQotLyoKLSAqIHN0cnVjdHVyZSBmb3IgQ2FycnkgUmVnaXN0ZXIgT25lIGFuZCBpdCdzIE1hc2sgUmVnaXN0ZXIgcmVnIGxvY2F0ZWQgaW4gbWFjCi0gKiBzdGF0IGFkZHJlc3MgbWFwIGFkZHJlc3MgMHg2MTMwIGFuZCAweDYxMzguCi0gKgotICogMzE6IHRyNjQKLSAqIDMwOiB0cjEyNwotICogMjk6IHRyMjU1Ci0gKiAyODogdHI1MTEKLSAqIDI3OiB0cjFrCi0gKiAyNjogdHJtYXgKLSAqIDI1OiB0cm1ndgotICogMjQtMTc6IHVudXNlZAotICogMTY6IHJieXQKLSAqIDE1OiBycGt0Ci0gKiAxNDogcmZjcwotICogMTM6IHJtY2EKLSAqIDEyOiByYmNhCi0gKiAxMTogcnhjZgotICogMTA6IHJ4cGYKLSAqIDk6IHJ4dW8KLSAqIDg6IHJhbG4KLSAqIDc6IHJmbHIKLSAqIDY6IHJjZGUKLSAqIDU6IHJjc2UKLSAqIDQ6IHJ1bmQKLSAqIDM6IHJvdnIKLSAqIDI6IHJmcmcKLSAqIDE6IHJqYnIKLSAqIDA6IHJkcnAKLSAqLwotCi0vKgotICogc3RydWN0dXJlIGZvciBDYXJyeSBSZWdpc3RlciBUd28gTWFzayBSZWdpc3RlciByZWcgaW4gbWFjIHN0YXQgYWRkcmVzcyBtYXAuCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg2MTNDCi0gKgotICogMzEtMjA6IHVudXNlZAotICogMTk6IHRqYnIKLSAqIDE4OiB0ZmNzCi0gKiAxNzogdHhjZgotICogMTY6IHRvdnIKLSAqIDE1OiB0dW5kCi0gKiAxNDogdHJmZwotICogMTM6IHRieXQKLSAqIDEyOiB0cGt0Ci0gKiAxMTogdG1jYQotICogMTA6IHRiY2EKLSAqIDk6IHR4cGYKLSAqIDg6IHRkZnIKLSAqIDc6IHRlZGYKLSAqIDY6IHRzY2wKLSAqIDU6IHRtY2wKLSAqIDQ6IHRsY2wKLSAqIDM6IHR4Y2wKLSAqIDI6IHRuY2wKLSAqIDE6IHRwZmgKLSAqIDA6IHRkcnAKLSAqLwotCi0vKgotICogTUFDIFNUQVRTIE1vZHVsZSBvZiBKQUdDb3JlIEFkZHJlc3MgTWFwcGluZwotICovCi1zdHJ1Y3QgbWFjc3RhdF9yZWdzIHsJCQkvKiBMb2NhdGlvbjogKi8KLQl1MzIgcGFkWzMyXTsJCQkvKiAgMHg2MDAwIC0gNjA3QyAqLwotCi0JLyogVHgvUnggMC02NCBCeXRlIEZyYW1lIENvdW50ZXIgKi8KLQl1MzIgdHhyeF8wXzY0X2J5dGVfZnJhbWVzOwkvKiAgMHg2MDgwICovCi0KLQkvKiBUeC9SeCA2NS0xMjcgQnl0ZSBGcmFtZSBDb3VudGVyICovCi0JdTMyIHR4cnhfNjVfMTI3X2J5dGVfZnJhbWVzOwkvKiAgMHg2MDg0ICovCi0KLQkvKiBUeC9SeCAxMjgtMjU1IEJ5dGUgRnJhbWUgQ291bnRlciAqLwotCXUzMiB0eHJ4XzEyOF8yNTVfYnl0ZV9mcmFtZXM7CS8qICAweDYwODggKi8KLQotCS8qIFR4L1J4IDI1Ni01MTEgQnl0ZSBGcmFtZSBDb3VudGVyICovCi0JdTMyIHR4cnhfMjU2XzUxMV9ieXRlX2ZyYW1lczsJLyogIDB4NjA4QyAqLwotCi0JLyogVHgvUnggNTEyLTEwMjMgQnl0ZSBGcmFtZSBDb3VudGVyICovCi0JdTMyIHR4cnhfNTEyXzEwMjNfYnl0ZV9mcmFtZXM7CS8qICAweDYwOTAgKi8KLQotCS8qIFR4L1J4IDEwMjQtMTUxOCBCeXRlIEZyYW1lIENvdW50ZXIgKi8KLQl1MzIgdHhyeF8xMDI0XzE1MThfYnl0ZV9mcmFtZXM7CS8qICAweDYwOTQgKi8KLQotCS8qIFR4L1J4IDE1MTktMTUyMiBCeXRlIEdvb2QgVkxBTiBGcmFtZSBDb3VudCAqLwotCXUzMiB0eHJ4XzE1MTlfMTUyMl9ndmxuX2ZyYW1lczsJLyogIDB4NjA5OCAqLwotCi0JLyogUnggQnl0ZSBDb3VudGVyICovCi0JdTMyIHJ4X2J5dGVzOwkJCS8qICAweDYwOUMgKi8KLQotCS8qIFJ4IFBhY2tldCBDb3VudGVyICovCi0JdTMyIHJ4X3BhY2tldHM7CQkJLyogIDB4NjBBMCAqLwotCi0JLyogUnggRkNTIEVycm9yIENvdW50ZXIgKi8KLQl1MzIgcnhfZmNzX2VycnM7CQkvKiAgMHg2MEE0ICovCi0KLQkvKiBSeCBNdWx0aWNhc3QgUGFja2V0IENvdW50ZXIgKi8KLQl1MzIgcnhfbXVsdGljYXN0X3BhY2tldHM7CS8qICAweDYwQTggKi8KLQotCS8qIFJ4IEJyb2FkY2FzdCBQYWNrZXQgQ291bnRlciAqLwotCXUzMiByeF9icm9hZGNhc3RfcGFja2V0czsJLyogIDB4NjBBQyAqLwotCi0JLyogUnggQ29udHJvbCBGcmFtZSBQYWNrZXQgQ291bnRlciAqLwotCXUzMiByeF9jb250cm9sX2ZyYW1lczsJCS8qICAweDYwQjAgKi8KLQotCS8qIFJ4IFBhdXNlIEZyYW1lIFBhY2tldCBDb3VudGVyICovCi0JdTMyIHJ4X3BhdXNlX2ZyYW1lczsJCS8qICAweDYwQjQgKi8KLQotCS8qIFJ4IFVua25vd24gT1AgQ29kZSBDb3VudGVyICovCi0JdTMyIHJ4X3Vua25vd25fb3Bjb2RlczsJCS8qICAweDYwQjggKi8KLQotCS8qIFJ4IEFsaWdubWVudCBFcnJvciBDb3VudGVyICovCi0JdTMyIHJ4X2FsaWduX2VycnM7CQkvKiAgMHg2MEJDICovCi0KLQkvKiBSeCBGcmFtZSBMZW5ndGggRXJyb3IgQ291bnRlciAqLwotCXUzMiByeF9mcmFtZV9sZW5fZXJyczsJCS8qICAweDYwQzAgKi8KLQotCS8qIFJ4IENvZGUgRXJyb3IgQ291bnRlciAqLwotCXUzMiByeF9jb2RlX2VycnM7CQkvKiAgMHg2MEM0ICovCi0KLQkvKiBSeCBDYXJyaWVyIFNlbnNlIEVycm9yIENvdW50ZXIgKi8KLQl1MzIgcnhfY2Fycmllcl9zZW5zZV9lcnJzOwkvKiAgMHg2MEM4ICovCi0KLQkvKiBSeCBVbmRlcnNpemUgUGFja2V0IENvdW50ZXIgKi8KLQl1MzIgcnhfdW5kZXJzaXplX3BhY2tldHM7CS8qICAweDYwQ0MgKi8KLQotCS8qIFJ4IE92ZXJzaXplIFBhY2tldCBDb3VudGVyICovCi0JdTMyIHJ4X292ZXJzaXplX3BhY2tldHM7CS8qICAweDYwRDAgKi8KLQotCS8qIFJ4IEZyYWdtZW50IENvdW50ZXIgKi8KLQl1MzIgcnhfZnJhZ21lbnRfcGFja2V0czsJLyogIDB4NjBENCAqLwotCi0JLyogUnggSmFiYmVyIENvdW50ZXIgKi8KLQl1MzIgcnhfamFiYmVyczsJCQkvKiAgMHg2MEQ4ICovCi0KLQkvKiBSeCBEcm9wICovCi0JdTMyIHJ4X2Ryb3BzOwkJCS8qICAweDYwREMgKi8KLQotCS8qIFR4IEJ5dGUgQ291bnRlciAqLwotCXUzMiB0eF9ieXRlczsJCQkvKiAgMHg2MEUwICovCi0KLQkvKiBUeCBQYWNrZXQgQ291bnRlciAqLwotCXUzMiB0eF9wYWNrZXRzOwkJCS8qICAweDYwRTQgKi8KLQotCS8qIFR4IE11bHRpY2FzdCBQYWNrZXQgQ291bnRlciAqLwotCXUzMiB0eF9tdWx0aWNhc3RfcGFja2V0czsJLyogIDB4NjBFOCAqLwotCi0JLyogVHggQnJvYWRjYXN0IFBhY2tldCBDb3VudGVyICovCi0JdTMyIHR4X2Jyb2FkY2FzdF9wYWNrZXRzOwkvKiAgMHg2MEVDICovCi0KLQkvKiBUeCBQYXVzZSBDb250cm9sIEZyYW1lIENvdW50ZXIgKi8KLQl1MzIgdHhfcGF1c2VfZnJhbWVzOwkJLyogIDB4NjBGMCAqLwotCi0JLyogVHggRGVmZXJyYWwgUGFja2V0IENvdW50ZXIgKi8KLQl1MzIgdHhfZGVmZXJyZWQ7CQkvKiAgMHg2MEY0ICovCi0KLQkvKiBUeCBFeGNlc3NpdmUgRGVmZXJyYWwgUGFja2V0IENvdW50ZXIgKi8KLQl1MzIgdHhfZXhjZXNzaXZlX2RlZmVycmVkOwkvKiAgMHg2MEY4ICovCi0KLQkvKiBUeCBTaW5nbGUgQ29sbGlzaW9uIFBhY2tldCBDb3VudGVyICovCi0JdTMyIHR4X3NpbmdsZV9jb2xsaXNpb25zOwkvKiAgMHg2MEZDICovCi0KLQkvKiBUeCBNdWx0aXBsZSBDb2xsaXNpb24gUGFja2V0IENvdW50ZXIgKi8KLQl1MzIgdHhfbXVsdGlwbGVfY29sbGlzaW9uczsJLyogIDB4NjEwMCAqLwotCi0JLyogVHggTGF0ZSBDb2xsaXNpb24gUGFja2V0IENvdW50ZXIgKi8KLQl1MzIgdHhfbGF0ZV9jb2xsaXNpb25zOwkJLyogIDB4NjEwNCAqLwotCi0JLyogVHggRXhjZXNzaXZlIENvbGxpc2lvbiBQYWNrZXQgQ291bnRlciAqLwotCXUzMiB0eF9leGNlc3NpdmVfY29sbGlzaW9uczsJLyogIDB4NjEwOCAqLwotCi0JLyogVHggVG90YWwgQ29sbGlzaW9uIFBhY2tldCBDb3VudGVyICovCi0JdTMyIHR4X3RvdGFsX2NvbGxpc2lvbnM7CS8qICAweDYxMEMgKi8KLQotCS8qIFR4IFBhdXNlIEZyYW1lIEhvbm9yZWQgQ291bnRlciAqLwotCXUzMiB0eF9wYXVzZV9ob25vcmVkX2ZyYW1lczsJLyogIDB4NjExMCAqLwotCi0JLyogVHggRHJvcCBGcmFtZSBDb3VudGVyICovCi0JdTMyIHR4X2Ryb3BzOwkJCS8qICAweDYxMTQgKi8KLQotCS8qIFR4IEphYmJlciBGcmFtZSBDb3VudGVyICovCi0JdTMyIHR4X2phYmJlcnM7CQkJLyogIDB4NjExOCAqLwotCi0JLyogVHggRkNTIEVycm9yIENvdW50ZXIgKi8KLQl1MzIgdHhfZmNzX2VycnM7CQkvKiAgMHg2MTFDICovCi0KLQkvKiBUeCBDb250cm9sIEZyYW1lIENvdW50ZXIgKi8KLQl1MzIgdHhfY29udHJvbF9mcmFtZXM7CQkvKiAgMHg2MTIwICovCi0KLQkvKiBUeCBPdmVyc2l6ZSBGcmFtZSBDb3VudGVyICovCi0JdTMyIHR4X292ZXJzaXplX2ZyYW1lczsJCS8qICAweDYxMjQgKi8KLQotCS8qIFR4IFVuZGVyc2l6ZSBGcmFtZSBDb3VudGVyICovCi0JdTMyIHR4X3VuZGVyc2l6ZV9mcmFtZXM7CS8qICAweDYxMjggKi8KLQotCS8qIFR4IEZyYWdtZW50cyBGcmFtZSBDb3VudGVyICovCi0JdTMyIHR4X2ZyYWdtZW50czsJCS8qICAweDYxMkMgKi8KLQotCS8qIENhcnJ5IFJlZ2lzdGVyIE9uZSBSZWdpc3RlciAqLwotCXUzMiBjYXJyeV9yZWcxOwkJCS8qICAweDYxMzAgKi8KLQotCS8qIENhcnJ5IFJlZ2lzdGVyIFR3byBSZWdpc3RlciAqLwotCXUzMiBjYXJyeV9yZWcyOwkJCS8qICAweDYxMzQgKi8KLQotCS8qIENhcnJ5IFJlZ2lzdGVyIE9uZSBNYXNrIFJlZ2lzdGVyICovCi0JdTMyIGNhcnJ5X3JlZzFfbWFzazsJCS8qICAweDYxMzggKi8KLQotCS8qIENhcnJ5IFJlZ2lzdGVyIFR3byBNYXNrIFJlZ2lzdGVyICovCi0JdTMyIGNhcnJ5X3JlZzJfbWFzazsJCS8qICAweDYxM0MgKi8KLX07Ci0KLS8qIEVORCBPRiBNQUMgU1RBVCBSRUdJU1RFUiBBRERSRVNTIE1BUCAqLwotCi0KLS8qIFNUQVJUIE9GIE1NQyBSRUdJU1RFUiBBRERSRVNTIE1BUCAqLwotCi0vKgotICogTWFpbiBNZW1vcnkgQ29udHJvbGxlciBDb250cm9sIHJlZyBpbiBtbWMgYWRkcmVzcyBtYXAuCi0gKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg3MDAwCi0gKi8KLQotI2RlZmluZSBFVF9NTUNfRU5BQkxFCQkxCi0jZGVmaW5lIEVUX01NQ19BUkJfRElTQUJMRQkyCi0jZGVmaW5lIEVUX01NQ19SWE1BQ19ESVNBQkxFCTQKLSNkZWZpbmUgRVRfTU1DX1RYTUFDX0RJU0FCTEUJOAotI2RlZmluZSBFVF9NTUNfVFhETUFfRElTQUJMRQkxNgotI2RlZmluZSBFVF9NTUNfUlhETUFfRElTQUJMRQkzMgotI2RlZmluZSBFVF9NTUNfRk9SQ0VfQ0UJCTY0Ci0KLS8qCi0gKiBNYWluIE1lbW9yeSBDb250cm9sbGVyIEhvc3QgTWVtb3J5IEFjY2VzcyBBZGRyZXNzIHJlZyBpbiBtbWMKLSAqIGFkZHJlc3MgbWFwLiAgTG9jYXRlZCBhdCBhZGRyZXNzIDB4NzAwNC4gVG9wIDE2IGJpdHMgaG9sZCB0aGUgYWRkcmVzcyBiaXRzCi0gKi8KLQotI2RlZmluZSBFVF9TUkFNX1JFUV9BQ0NFU1MJMQotI2RlZmluZSBFVF9TUkFNX1dSX0FDQ0VTUwkyCi0jZGVmaW5lIEVUX1NSQU1fSVNfQ1RSTAkJNAotCi0vKgotICogc3RydWN0dXJlIGZvciBNYWluIE1lbW9yeSBDb250cm9sbGVyIEhvc3QgTWVtb3J5IEFjY2VzcyBEYXRhIHJlZyBpbiBtbWMKLSAqIGFkZHJlc3MgbWFwLiAgTG9jYXRlZCBhdCBhZGRyZXNzIDB4NzAwOCAtIDB4NzAxNAotICogRGVmaW5lZCBlYXJsaWVyICh1MzIpCi0gKi8KLQotLyoKLSAqIE1lbW9yeSBDb250cm9sIE1vZHVsZSBvZiBKQUdDb3JlIEFkZHJlc3MgTWFwcGluZwotICovCi1zdHJ1Y3QgbW1jX3JlZ3MgewkJLyogTG9jYXRpb246ICovCi0JdTMyIG1tY19jdHJsOwkJLyogIDB4NzAwMCAqLwotCXUzMiBzcmFtX2FjY2VzczsJLyogIDB4NzAwNCAqLwotCXUzMiBzcmFtX3dvcmQxOwkJLyogIDB4NzAwOCAqLwotCXUzMiBzcmFtX3dvcmQyOwkJLyogIDB4NzAwQyAqLwotCXUzMiBzcmFtX3dvcmQzOwkJLyogIDB4NzAxMCAqLwotCXUzMiBzcmFtX3dvcmQ0OwkJLyogIDB4NzAxNCAqLwotfTsKLQotLyogRU5EIE9GIE1NQyBSRUdJU1RFUiBBRERSRVNTIE1BUCAqLwotCi0KLS8qCi0gKiBKQUdDb3JlIEFkZHJlc3MgTWFwcGluZwotICovCi1zdHJ1Y3QgYWRkcmVzc19tYXAgewotCXN0cnVjdCBnbG9iYWxfcmVncyBnbG9iYWw7Ci0JLyogdW51c2VkIHNlY3Rpb24gb2YgZ2xvYmFsIGFkZHJlc3MgbWFwICovCi0JdTggdW51c2VkX2dsb2JhbFs0MDk2IC0gc2l6ZW9mKHN0cnVjdCBnbG9iYWxfcmVncyldOwotCXN0cnVjdCB0eGRtYV9yZWdzIHR4ZG1hOwotCS8qIHVudXNlZCBzZWN0aW9uIG9mIHR4ZG1hIGFkZHJlc3MgbWFwICovCi0JdTggdW51c2VkX3R4ZG1hWzQwOTYgLSBzaXplb2Yoc3RydWN0IHR4ZG1hX3JlZ3MpXTsKLQlzdHJ1Y3QgcnhkbWFfcmVncyByeGRtYTsKLQkvKiB1bnVzZWQgc2VjdGlvbiBvZiByeGRtYSBhZGRyZXNzIG1hcCAqLwotCXU4IHVudXNlZF9yeGRtYVs0MDk2IC0gc2l6ZW9mKHN0cnVjdCByeGRtYV9yZWdzKV07Ci0Jc3RydWN0IHR4bWFjX3JlZ3MgdHhtYWM7Ci0JLyogdW51c2VkIHNlY3Rpb24gb2YgdHhtYWMgYWRkcmVzcyBtYXAgKi8KLQl1OCB1bnVzZWRfdHhtYWNbNDA5NiAtIHNpemVvZihzdHJ1Y3QgdHhtYWNfcmVncyldOwotCXN0cnVjdCByeG1hY19yZWdzIHJ4bWFjOwotCS8qIHVudXNlZCBzZWN0aW9uIG9mIHJ4bWFjIGFkZHJlc3MgbWFwICovCi0JdTggdW51c2VkX3J4bWFjWzQwOTYgLSBzaXplb2Yoc3RydWN0IHJ4bWFjX3JlZ3MpXTsKLQlzdHJ1Y3QgbWFjX3JlZ3MgbWFjOwotCS8qIHVudXNlZCBzZWN0aW9uIG9mIG1hYyBhZGRyZXNzIG1hcCAqLwotCXU4IHVudXNlZF9tYWNbNDA5NiAtIHNpemVvZihzdHJ1Y3QgbWFjX3JlZ3MpXTsKLQlzdHJ1Y3QgbWFjc3RhdF9yZWdzIG1hY3N0YXQ7Ci0JLyogdW51c2VkIHNlY3Rpb24gb2YgbWFjIHN0YXQgYWRkcmVzcyBtYXAgKi8KLQl1OCB1bnVzZWRfbWFjX3N0YXRbNDA5NiAtIHNpemVvZihzdHJ1Y3QgbWFjc3RhdF9yZWdzKV07Ci0Jc3RydWN0IG1tY19yZWdzIG1tYzsKLQkvKiB1bnVzZWQgc2VjdGlvbiBvZiBtbWMgYWRkcmVzcyBtYXAgKi8KLQl1OCB1bnVzZWRfbW1jWzQwOTYgLSBzaXplb2Yoc3RydWN0IG1tY19yZWdzKV07Ci0JLyogdW51c2VkIHNlY3Rpb24gb2YgYWRkcmVzcyBtYXAgKi8KLQl1OCB1bnVzZWRfWzEwMTU4MDhdOwotCi0JdTggdW51c2VkX2V4cF9yb21bNDA5Nl07CS8qIE1HUy1zaXplIFRCRCAqLwotCXU4IHVudXNlZF9fWzUyNDI4OF07CS8qIHVudXNlZCBzZWN0aW9uIG9mIGFkZHJlc3MgbWFwICovCi19OwotCi0jZW5kaWYgLyogX0VUMTMxMF9BRERSRVNTX01BUF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfZWVwcm9tLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9lZXByb20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3NTg0MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9lZXByb20uYworKysgL2Rldi9udWxsCkBAIC0xLDQwNyArMCwwIEBACi0vKgotICogQWdlcmUgU3lzdGVtcyBJbmMuCi0gKiAxMC8xMDAvMTAwMCBCYXNlLVQgRXRoZXJuZXQgRHJpdmVyIGZvciB0aGUgRVQxMzAxIGFuZCBFVDEzMXggc2VyaWVzIE1BQ3MKLSAqCi0gKiBDb3B5cmlnaHQgwqkgMjAwNSBBZ2VyZSBTeXN0ZW1zIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBldDEzMTBfZWVwcm9tLmMgLSBDb2RlIHVzZWQgdG8gYWNjZXNzIHRoZSBkZXZpY2UncyBFRVBST00KLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIFNPRlRXQVJFIExJQ0VOU0UKLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKLSAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKLSAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KLSAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KLSAqCi0gKiBDb3B5cmlnaHQgwqkgMjAwNSBBZ2VyZSBTeXN0ZW1zIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqCi0gKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwotICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKLSAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgotICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogRGlzY2xhaW1lcgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAotICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQotICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KLSAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi0gKiBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJldDEzMXhfdmVyc2lvbi5oIgotI2luY2x1ZGUgImV0MTMxeF9kZWZzLmgiCi0KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0KLSNpbmNsdWRlICJldDEzMTBfcGh5LmgiCi0jaW5jbHVkZSAiZXQxMzF4X2FkYXB0ZXIuaCIKLSNpbmNsdWRlICJldDEzMXguaCIKLQotLyoKLSAqIEVFUFJPTSBEZWZpbmVzCi0gKi8KLQotLyogTEJDSUYgUmVnaXN0ZXIgR3JvdXBzIChhZGRyZXNzZWQgdmlhIDMyLWJpdCBvZmZzZXRzKSAqLwotI2RlZmluZSBMQkNJRl9EV09SRDBfR1JPVVAgICAgICAgMHhBQwotI2RlZmluZSBMQkNJRl9EV09SRDFfR1JPVVAgICAgICAgMHhCMAotCi0vKiBMQkNJRiBSZWdpc3RlcnMgKGFkZHJlc3NlZCB2aWEgOC1iaXQgb2Zmc2V0cykgKi8KLSNkZWZpbmUgTEJDSUZfQUREUkVTU19SRUdJU1RFUiAgIDB4QUMKLSNkZWZpbmUgTEJDSUZfREFUQV9SRUdJU1RFUiAgICAgIDB4QjAKLSNkZWZpbmUgTEJDSUZfQ09OVFJPTF9SRUdJU1RFUiAgIDB4QjEKLSNkZWZpbmUgTEJDSUZfU1RBVFVTX1JFR0lTVEVSICAgIDB4QjIKLQotLyogTEJDSUYgQ29udHJvbCBSZWdpc3RlciBCaXRzICovCi0jZGVmaW5lIExCQ0lGX0NPTlRST0xfU0VRVUVOVElBTF9SRUFEICAgMHgwMQotI2RlZmluZSBMQkNJRl9DT05UUk9MX1BBR0VfV1JJVEUgICAgICAgIDB4MDIKLSNkZWZpbmUgTEJDSUZfQ09OVFJPTF9FRVBST01fUkVMT0FEICAgICAweDA4Ci0jZGVmaW5lIExCQ0lGX0NPTlRST0xfVFdPX0JZVEVfQUREUiAgICAgMHgyMAotI2RlZmluZSBMQkNJRl9DT05UUk9MX0kyQ19XUklURSAgICAgICAgIDB4NDAKLSNkZWZpbmUgTEJDSUZfQ09OVFJPTF9MQkNJRl9FTkFCTEUgICAgICAweDgwCi0KLS8qIExCQ0lGIFN0YXR1cyBSZWdpc3RlciBCaXRzICovCi0jZGVmaW5lIExCQ0lGX1NUQVRVU19QSFlfUVVFVUVfQVZBSUwgICAgMHgwMQotI2RlZmluZSBMQkNJRl9TVEFUVVNfSTJDX0lETEUgICAgICAgICAgIDB4MDIKLSNkZWZpbmUgTEJDSUZfU1RBVFVTX0FDS19FUlJPUiAgICAgICAgICAweDA0Ci0jZGVmaW5lIExCQ0lGX1NUQVRVU19HRU5FUkFMX0VSUk9SICAgICAgMHgwOAotI2RlZmluZSBMQkNJRl9TVEFUVVNfQ0hFQ0tTVU1fRVJST1IgICAgIDB4NDAKLSNkZWZpbmUgTEJDSUZfU1RBVFVTX0VFUFJPTV9QUkVTRU5UICAgICAweDgwCi0KLS8qIE1pc2NlbGxhbmVvdXMgQ29uc3RyYWludHMgKi8KLSNkZWZpbmUgTUFYX05VTV9SRUdJU1RFUl9QT0xMUyAgICAgICAgICAxMDAwCi0jZGVmaW5lIE1BWF9OVU1fV1JJVEVfUkVUUklFUyAgICAgICAgICAgMgotCi1zdGF0aWMgaW50IGVlcHJvbV93YWl0X3JlYWR5KHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1MzIgKnN0YXR1cykKLXsKLQl1MzIgcmVnOwotCWludCBpOwotCi0JLyoKLQkgKiAxLiBDaGVjayBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIgZm9yIGJpdHMgNiAmIDM6MiBhbGwgZXF1YWwgdG8gMCBhbmQKLQkgKiAgICBiaXRzIDcsMTowIGJvdGggZXF1YWwgdG8gMSwgYXQgbGVhc3Qgb25jZSBhZnRlciByZXNldC4KLQkgKiAgICBTdWJzZXF1ZW50IG9wZXJhdGlvbnMgbmVlZCBvbmx5IHRvIGNoZWNrIHRoYXQgYml0cyAxOjAgYXJlIGVxdWFsCi0JICogICAgdG8gMSBwcmlvciB0byBzdGFydGluZyBhIHNpbmdsZSBieXRlIHJlYWQvd3JpdGUKLQkgKi8KLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1JFR0lTVEVSX1BPTExTOyBpKyspIHsKLQkJLyogUmVhZCByZWdpc3RlcnMgZ3JvdXBlZCBpbiBEV09SRDEgKi8KLQkJaWYgKHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBMQkNJRl9EV09SRDFfR1JPVVAsICZyZWcpKQotCQkJcmV0dXJuIC1FSU87Ci0KLQkJLyogSTJDIGlkbGUgYW5kIFBoeSBRdWV1ZSBBdmFpbCBib3RoIHRydWUgKi8KLQkJaWYgKChyZWcgJiAweDMwMDApID09IDB4MzAwMCkgewotCQkJaWYgKHN0YXR1cykKLQkJCQkqc3RhdHVzID0gcmVnOwotCQkJcmV0dXJuIHJlZyAmIDB4RkY7Ci0JCX0KLQl9Ci0JcmV0dXJuIC1FVElNRURPVVQ7Ci19Ci0KLQotLyoqCi0gKiBlZXByb21fd3JpdGUgLSBXcml0ZSBhIGJ5dGUgdG8gdGhlIEVUMTMxMCdzIEVFUFJPTQotICogQGV0ZGV2OiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCi0gKiBAYWRkcjogdGhlIGFkZHJlc3MgdG8gd3JpdGUKLSAqIEBkYXRhOiB0aGUgdmFsdWUgdG8gd3JpdGUKLSAqCi0gKiBSZXR1cm5zIDEgZm9yIGEgc3VjY2Vzc2Z1bCB3cml0ZS4KLSAqLwotc3RhdGljIGludCBlZXByb21fd3JpdGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgdTMyIGFkZHIsIHU4IGRhdGEpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBldGRldi0+cGRldjsKLQlpbnQgaW5kZXggPSAwOwotCWludCByZXRyaWVzOwotCWludCBlcnIgPSAwOwotCWludCBpMmNfd2FjayA9IDA7Ci0JaW50IHdyaXRlb2sgPSAwOwotCXUzMiBzdGF0dXM7Ci0JdTMyIHZhbCA9IDA7Ci0KLQkvKgotCSAqIEZvciBhbiBFRVBST00sIGFuIEkyQyBzaW5nbGUgYnl0ZSB3cml0ZSBpcyBkZWZpbmVkIGFzIGEgU1RBUlQKLQkgKiBjb25kaXRpb24gZm9sbG93ZWQgYnkgdGhlIGRldmljZSBhZGRyZXNzLCBFRVBST00gYWRkcmVzcywgb25lIGJ5dGUKLQkgKiBvZiBkYXRhIGFuZCBhIFNUT1AgY29uZGl0aW9uLiAgVGhlIFNUT1AgY29uZGl0aW9uIHdpbGwgdHJpZ2dlciB0aGUKLQkgKiBFRVBST00ncyBpbnRlcm5hbGx5IHRpbWVkIHdyaXRlIGN5Y2xlIHRvIHRoZSBub252b2xhdGlsZSBtZW1vcnkuCi0JICogQWxsIGlucHV0cyBhcmUgZGlzYWJsZWQgZHVyaW5nIHRoaXMgd3JpdGUgY3ljbGUgYW5kIHRoZSBFRVBST00gd2lsbAotCSAqIG5vdCByZXNwb25kIHRvIGFueSBhY2Nlc3MgdW50aWwgdGhlIGludGVybmFsIHdyaXRlIGlzIGNvbXBsZXRlLgotCSAqLwotCi0JZXJyID0gZWVwcm9tX3dhaXRfcmVhZHkocGRldiwgTlVMTCk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCSAvKgotCSAqIDIuIFdyaXRlIHRvIHRoZSBMQkNJRiBDb250cm9sIFJlZ2lzdGVyOiAgYml0IDc9MSwgYml0IDY9MSwgYml0IDM9MCwKLQkgKiAgICBhbmQgYml0cyAxOjAgYm90aCA9MC4gIEJpdCA1IHNob3VsZCBiZSBzZXQgYWNjb3JkaW5nIHRvIHRoZQotCSAqICAgIHR5cGUgb2YgRUVQUk9NIGJlaW5nIGFjY2Vzc2VkICgxPXR3byBieXRlIGFkZHJlc3NpbmcsIDA9b25lCi0JICogICAgYnl0ZSBhZGRyZXNzaW5nKS4KLQkgKi8KLQlpZiAocGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIExCQ0lGX0NPTlRST0xfUkVHSVNURVIsCi0JCQlMQkNJRl9DT05UUk9MX0xCQ0lGX0VOQUJMRSB8IExCQ0lGX0NPTlRST0xfSTJDX1dSSVRFKSkKLQkJcmV0dXJuIC1FSU87Ci0KLQlpMmNfd2FjayA9IDE7Ci0KLQkvKiBQcmVwYXJlIEVFUFJPTSBhZGRyZXNzIGZvciBTdGVwIDMgKi8KLQotCWZvciAocmV0cmllcyA9IDA7IHJldHJpZXMgPCBNQVhfTlVNX1dSSVRFX1JFVFJJRVM7IHJldHJpZXMrKykgewotCQkvKiBXcml0ZSB0aGUgYWRkcmVzcyB0byB0aGUgTEJDSUYgQWRkcmVzcyBSZWdpc3RlciAqLwotCQlpZiAocGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBMQkNJRl9BRERSRVNTX1JFR0lTVEVSLCBhZGRyKSkKLQkJCWJyZWFrOwotCQkvKgotCQkgKiBXcml0ZSB0aGUgZGF0YSB0byB0aGUgTEJDSUYgRGF0YSBSZWdpc3RlciAodGhlIEkyQyB3cml0ZQotCQkgKiB3aWxsIGJlZ2luKS4KLQkJICovCi0JCWlmIChwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgTEJDSUZfREFUQV9SRUdJU1RFUiwgZGF0YSkpCi0JCQlicmVhazsKLQkJLyoKLQkJICogTW9uaXRvciBiaXQgMTowIG9mIHRoZSBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIuICBXaGVuIGJpdHMKLQkJICogMTowIGFyZSBib3RoIGVxdWFsIHRvIDEsIHRoZSBJMkMgd3JpdGUgaGFzIGNvbXBsZXRlZCBhbmQgdGhlCi0JCSAqIGludGVybmFsIHdyaXRlIGN5Y2xlIG9mIHRoZSBFRVBST00gaXMgYWJvdXQgdG8gc3RhcnQuCi0JCSAqIChiaXRzIDE6MCA9IDAxIGlzIGEgbGVnYWwgc3RhdGUgd2hpbGUgd2FpdGluZyBmcm9tIGJvdGgKLQkJICogZXF1YWwgdG8gMSwgYnV0IGJpdHMgMTowID0gMTAgaXMgaW52YWxpZCBhbmQgaW1wbGllcyB0aGF0Ci0JCSAqIHNvbWV0aGluZyBpcyBicm9rZW4pLgotCQkgKi8KLQkJZXJyID0gZWVwcm9tX3dhaXRfcmVhZHkocGRldiwgJnN0YXR1cyk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIDA7Ci0KLQkJLyoKLQkJICogQ2hlY2sgYml0IDMgb2YgdGhlIExCQ0lGIFN0YXR1cyBSZWdpc3Rlci4gIElmICBlcXVhbCB0byAxLAotCQkgKiBhbiBlcnJvciBoYXMgb2NjdXJyZWQuRG9uJ3QgYnJlYWsgaGVyZSBpZiB3ZSBhcmUgcmV2aXNpb24KLQkJICogMSwgdGhpcyBpcyBzbyB3ZSBkbyBhIGJsaW5kIHdyaXRlIGZvciBsb2FkIGJ1Zy4KLQkJICovCi0JCWlmICgoc3RhdHVzICYgTEJDSUZfU1RBVFVTX0dFTkVSQUxfRVJST1IpCi0JCQkmJiBldGRldi0+cGRldi0+cmV2aXNpb24gPT0gMCkKLQkJCWJyZWFrOwotCi0JCS8qCi0JCSAqIENoZWNrIGJpdCAyIG9mIHRoZSBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIuICBJZiBlcXVhbCB0byAxIGFuCi0JCSAqIEFDSyBlcnJvciBoYXMgb2NjdXJyZWQgb24gdGhlIGFkZHJlc3MgcGhhc2Ugb2YgdGhlIHdyaXRlLgotCQkgKiBUaGlzIGNvdWxkIGJlIGR1ZSB0byBhbiBhY3R1YWwgaGFyZHdhcmUgZmFpbHVyZSBvciB0aGUKLQkJICogRUVQUk9NIG1heSBzdGlsbCBiZSBpbiBpdHMgaW50ZXJuYWwgd3JpdGUgY3ljbGUgZnJvbSBhCi0JCSAqIHByZXZpb3VzIHdyaXRlLiBUaGlzIHdyaXRlIG9wZXJhdGlvbiB3YXMgaWdub3JlZCBhbmQgbXVzdCBiZQotCQkgICpyZXBlYXRlZCBsYXRlci4KLQkJICovCi0JCWlmIChzdGF0dXMgJiBMQkNJRl9TVEFUVVNfQUNLX0VSUk9SKSB7Ci0JCQkvKgotCQkJICogVGhpcyBjb3VsZCBiZSBkdWUgdG8gYW4gYWN0dWFsIGhhcmR3YXJlIGZhaWx1cmUKLQkJCSAqIG9yIHRoZSBFRVBST00gbWF5IHN0aWxsIGJlIGluIGl0cyBpbnRlcm5hbCB3cml0ZQotCQkJICogY3ljbGUgZnJvbSBhIHByZXZpb3VzIHdyaXRlLiBUaGlzIHdyaXRlIG9wZXJhdGlvbgotCQkJICogd2FzIGlnbm9yZWQgYW5kIG11c3QgYmUgcmVwZWF0ZWQgbGF0ZXIuCi0JCQkgKi8KLQkJCXVkZWxheSgxMCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXdyaXRlb2sgPSAxOwotCQlicmVhazsKLQl9Ci0KLQkvKgotCSAqIFNldCBiaXQgNiBvZiB0aGUgTEJDSUYgQ29udHJvbCBSZWdpc3RlciA9IDAuCi0JICovCi0JdWRlbGF5KDEwKTsKLQotCXdoaWxlIChpMmNfd2FjaykgewotCQlpZiAocGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIExCQ0lGX0NPTlRST0xfUkVHSVNURVIsCi0JCQlMQkNJRl9DT05UUk9MX0xCQ0lGX0VOQUJMRSkpCi0JCQl3cml0ZW9rID0gMDsKLQotCQkvKiBEbyByZWFkIHVudGlsIGludGVybmFsIEFDS19FUlJPUiBnb2VzIGF3YXkgbWVhbmluZyB3cml0ZQotCQkgKiBjb21wbGV0ZWQKLQkJICovCi0JCWRvIHsKLQkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwKLQkJCQkJICAgICAgIExCQ0lGX0FERFJFU1NfUkVHSVNURVIsCi0JCQkJCSAgICAgICBhZGRyKTsKLQkJCWRvIHsKLQkJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwKLQkJCQkJTEJDSUZfREFUQV9SRUdJU1RFUiwgJnZhbCk7Ci0JCQl9IHdoaWxlICgodmFsICYgMHgwMDAxMDAwMCkgPT0gMCk7Ci0JCX0gd2hpbGUgKHZhbCAmIDB4MDAwNDAwMDApOwotCi0JCWlmICgodmFsICYgMHhGRjAwKSAhPSAweEMwMDAgfHwgaW5kZXggPT0gMTAwMDApCi0JCQlicmVhazsKLQkJaW5kZXgrKzsKLQl9Ci0JcmV0dXJuIHdyaXRlb2sgPyAwIDogLUVJTzsKLX0KLQotLyoqCi0gKiBlZXByb21fcmVhZCAtIFJlYWQgYSBieXRlIGZyb20gdGhlIEVUMTMxMCdzIEVFUFJPTQotICogQGV0ZGV2OiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCi0gKiBAYWRkcjogdGhlIGFkZHJlc3MgZnJvbSB3aGljaCB0byByZWFkCi0gKiBAcGRhdGE6IGEgcG9pbnRlciB0byBhIGJ5dGUgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSByZWFkCi0gKiBAZWVwcm9tX2lkOiB0aGUgSUQgb2YgdGhlIEVFUFJPTQotICogQGFkZHJtb2RlOiBob3cgdGhlIEVFUFJPTSBpcyB0byBiZSBhY2Nlc3NlZAotICoKLSAqIFJldHVybnMgMSBmb3IgYSBzdWNjZXNzZnVsIHJlYWQKLSAqLwotc3RhdGljIGludCBlZXByb21fcmVhZChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCB1MzIgYWRkciwgdTggKnBkYXRhKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZXRkZXYtPnBkZXY7Ci0JaW50IGVycjsKLQl1MzIgc3RhdHVzOwotCi0JLyoKLQkgKiBBIHNpbmdsZSBieXRlIHJlYWQgaXMgc2ltaWxhciB0byB0aGUgc2luZ2xlIGJ5dGUgd3JpdGUsIHdpdGggdGhlCi0JICogZXhjZXB0aW9uIG9mIHRoZSBkYXRhIGZsb3c6Ci0JICovCi0KLQllcnIgPSBlZXByb21fd2FpdF9yZWFkeShwZGV2LCBOVUxMKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCS8qCi0JICogV3JpdGUgdG8gdGhlIExCQ0lGIENvbnRyb2wgUmVnaXN0ZXI6ICBiaXQgNz0xLCBiaXQgNj0wLCBiaXQgMz0wLAotCSAqIGFuZCBiaXRzIDE6MCBib3RoID0wLiAgQml0IDUgc2hvdWxkIGJlIHNldCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUKLQkgKiBvZiBFRVBST00gYmVpbmcgYWNjZXNzZWQgKDE9dHdvIGJ5dGUgYWRkcmVzc2luZywgMD1vbmUgYnl0ZQotCSAqIGFkZHJlc3NpbmcpLgotCSAqLwotCWlmIChwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgTEJDSUZfQ09OVFJPTF9SRUdJU1RFUiwKLQkJCQkgIExCQ0lGX0NPTlRST0xfTEJDSUZfRU5BQkxFKSkKLQkJcmV0dXJuIC1FSU87Ci0JLyoKLQkgKiBXcml0ZSB0aGUgYWRkcmVzcyB0byB0aGUgTEJDSUYgQWRkcmVzcyBSZWdpc3RlciAoSTJDIHJlYWQgd2lsbAotCSAqIGJlZ2luKS4KLQkgKi8KLQlpZiAocGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBMQkNJRl9BRERSRVNTX1JFR0lTVEVSLCBhZGRyKSkKLQkJcmV0dXJuIC1FSU87Ci0JLyoKLQkgKiBNb25pdG9yIGJpdCAwIG9mIHRoZSBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIuICBXaGVuID0gMSwgSTJDIHJlYWQKLQkgKiBpcyBjb21wbGV0ZS4gKGlmIGJpdCAxID0xIGFuZCBiaXQgMCBzdGF5cyA9IDAsIGEgaGFyZHdhcmUgZmFpbHVyZQotCSAqIGhhcyBvY2N1cnJlZCkuCi0JICovCi0JZXJyID0gZWVwcm9tX3dhaXRfcmVhZHkocGRldiwgJnN0YXR1cyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JLyoKLQkgKiBSZWdhcmRsZXNzIG9mIGVycm9yIHN0YXR1cywgcmVhZCBkYXRhIGJ5dGUgZnJvbSBMQkNJRiBEYXRhCi0JICogUmVnaXN0ZXIuCi0JICovCi0JKnBkYXRhID0gZXJyOwotCS8qCi0JICogQ2hlY2sgYml0IDIgb2YgdGhlIExCQ0lGIFN0YXR1cyBSZWdpc3Rlci4gIElmID0gMSwKLQkgKiB0aGVuIGFuIGVycm9yIGhhcyBvY2N1cnJlZC4KLQkgKi8KLQlyZXR1cm4gKHN0YXR1cyAmIExCQ0lGX1NUQVRVU19BQ0tfRVJST1IpID8gLUVJTyA6IDA7Ci19Ci0KLWludCBldDEzMXhfaW5pdF9lZXByb20oc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGV0ZGV2LT5wZGV2OwotCXU4IGVlc3RhdHVzOwotCi0JLyogV2UgZmlyc3QgbmVlZCB0byBjaGVjayB0aGUgRUVQUk9NIFN0YXR1cyBjb2RlIGxvY2F0ZWQgYXQgb2Zmc2V0Ci0JICogMHhCMiBvZiBjb25maWcgc3BhY2UKLQkgKi8KLQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBFVDEzMTBfUENJX0VFUFJPTV9TVEFUVVMsCi0JCQkJICAgICAgJmVlc3RhdHVzKTsKLQotCS8qIFRISVMgSVMgQSBXT1JLQVJPVU5EOgotCSAqIEkgbmVlZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gdHdpY2UgdG8gZ2V0IG15IGNhcmQgaW4gYQotCSAqIExHIE0xIEV4cHJlc3MgRHVhbCBydW5uaW5nLiBJIHRyaWVkIGFsc28gYSBtc2xlZXAgYmVmb3JlIHRoaXMKLQkgKiBmdW5jdGlvbiwgYmVjYXVzZSBJIHRob3VndGggdGhlcmUgY291bGQgYmUgc29tZSB0aW1lIGNvbmRpZGlvbnMKLQkgKiBidXQgaXQgZGlkbid0IHdvcmsuIENhbGwgdGhlIHdob2xlIGZ1bmN0aW9uIHR3aWNlIGFsc28gd29yay4KLQkgKi8KLQlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgRVQxMzEwX1BDSV9FRVBST01fU1RBVFVTLCAmZWVzdGF0dXMpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJICAgICAgICJDb3VsZCBub3QgcmVhZCBQQ0kgY29uZmlnIHNwYWNlIGZvciBFRVBST00gU3RhdHVzXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JLyogRGV0ZXJtaW5lIGlmIHRoZSBlcnJvcihzKSB3ZSBjYXJlIGFib3V0IGFyZSBwcmVzZW50LiBJZiB0aGV5IGFyZQotCSAqIHByZXNlbnQgd2UgbmVlZCB0byBmYWlsLgotCSAqLwotCWlmIChlZXN0YXR1cyAmIDB4NEMpIHsKLQkJaW50IHdyaXRlX2ZhaWxlZCA9IDA7Ci0JCWlmIChwZGV2LT5yZXZpc2lvbiA9PSAweDAxKSB7Ci0JCQlpbnQJaTsKLQkJCXN0YXRpYyBjb25zdCB1OCBlZWRhdGFbNF0gPSB7IDB4RkUsIDB4MTMsIDB4MTAsIDB4RkYgfTsKLQotCQkJLyogUmUtd3JpdGUgdGhlIGZpcnN0IDQgYnl0ZXMgaWYgd2UgaGF2ZSBhbiBlZXByb20KLQkJCSAqIHByZXNlbnQgYW5kIHRoZSByZXZpc2lvbiBpZCBpcyAxLCB0aGlzIGZpeGVzIHRoZQotCQkJICogY29ycnVwdGlvbiBzZWVuIHdpdGggMTMxMCBCIFNpbGljb24KLQkJCSAqLwotCQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKLQkJCQlpZiAoZWVwcm9tX3dyaXRlKGV0ZGV2LCBpLCBlZWRhdGFbaV0pIDwgMCkKLQkJCQkJd3JpdGVfZmFpbGVkID0gMTsKLQkJfQotCQlpZiAocGRldi0+cmV2aXNpb24gICE9IDB4MDEgfHwgd3JpdGVfZmFpbGVkKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkgICAgIkZhdGFsIEVFUFJPTSBTdGF0dXMgRXJyb3IgLSAweCUwNHhcbiIsIGVlc3RhdHVzKTsKLQotCQkJLyogVGhpcyBlcnJvciBjb3VsZCBtZWFuIHRoYXQgdGhlcmUgd2FzIGFuIGVycm9yCi0JCQkgKiByZWFkaW5nIHRoZSBlZXByb20gb3IgdGhhdCB0aGUgZWVwcm9tIGRvZXNuJ3QgZXhpc3QuCi0JCQkgKiBXZSB3aWxsIHRyZWF0IGVhY2ggY2FzZSB0aGUgc2FtZSBhbmQgbm90IHRyeSB0bwotCQkJICogZ2F0aGVyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhhdCBub3JtYWxseSB3b3VsZAotCQkJICogY29tZSBmcm9tIHRoZSBlZXByb20sIGxpa2UgTUFDIEFkZHJlc3MKLQkJCSAqLwotCQkJZXRkZXYtPmhhc19lZXByb20gPSAwOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQl9Ci0JZXRkZXYtPmhhc19lZXByb20gPSAxOwotCi0JLyogUmVhZCB0aGUgRUVQUk9NIGZvciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgTEVEIGJlaGF2aW9yLiBSZWZlciB0bwotCSAqIEVUMTMxMF9waHkuYywgZXQxMzF4X3hjdnJfaW5pdCgpLCBmb3IgaXRzIHVzZS4KLQkgKi8KLQllZXByb21fcmVhZChldGRldiwgMHg3MCwgJmV0ZGV2LT5lZXByb21fZGF0YVswXSk7Ci0JZWVwcm9tX3JlYWQoZXRkZXYsIDB4NzEsICZldGRldi0+ZWVwcm9tX2RhdGFbMV0pOwotCi0JaWYgKGV0ZGV2LT5lZXByb21fZGF0YVswXSAhPSAweGNkKQotCQkvKiBEaXNhYmxlIGFsbCBvcHRpb25hbCBmZWF0dXJlcyAqLwotCQlldGRldi0+ZWVwcm9tX2RhdGFbMV0gPSAweDAwOwotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9tYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX21hYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTZiZTRiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX21hYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNjU0ICswLDAgQEAKLS8qCi0gKiBBZ2VyZSBTeXN0ZW1zIEluYy4KLSAqIDEwLzEwMC8xMDAwIEJhc2UtVCBFdGhlcm5ldCBEcml2ZXIgZm9yIHRoZSBFVDEzMDEgYW5kIEVUMTMxeCBzZXJpZXMgTUFDcwotICoKLSAqIENvcHlyaWdodCDCqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIGV0MTMxMF9tYWMuYyAtIEFsbCBjb2RlIGFuZCByb3V0aW5lcyBwZXJ0YWluaW5nIHRvIHRoZSBNQUMKLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIFNPRlRXQVJFIExJQ0VOU0UKLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKLSAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKLSAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KLSAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KLSAqCi0gKiBDb3B5cmlnaHQgwqkgMjAwNSBBZ2VyZSBTeXN0ZW1zIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqCi0gKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwotICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKLSAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgotICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogRGlzY2xhaW1lcgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAotICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQotICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KLSAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi0gKiBEQU1BR0UuCi0gKgotICovCi0KLSNpbmNsdWRlICJldDEzMXhfdmVyc2lvbi5oIgotI2luY2x1ZGUgImV0MTMxeF9kZWZzLmgiCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KLQotI2luY2x1ZGUgImV0MTMxMF9waHkuaCIKLSNpbmNsdWRlICJldDEzMXhfYWRhcHRlci5oIgotI2luY2x1ZGUgImV0MTMxeC5oIgotCi0KLSNkZWZpbmUgQ09VTlRFUl9XUkFQXzI4X0JJVCAweDEwMDAwMDAwCi0jZGVmaW5lIENPVU5URVJfV1JBUF8yMl9CSVQgMHg0MDAwMDAKLSNkZWZpbmUgQ09VTlRFUl9XUkFQXzE2X0JJVCAweDEwMDAwCi0jZGVmaW5lIENPVU5URVJfV1JBUF8xMl9CSVQgMHgxMDAwCi0KLSNkZWZpbmUgQ09VTlRFUl9NQVNLXzI4X0JJVCAoQ09VTlRFUl9XUkFQXzI4X0JJVCAtIDEpCi0jZGVmaW5lIENPVU5URVJfTUFTS18yMl9CSVQgKENPVU5URVJfV1JBUF8yMl9CSVQgLSAxKQotI2RlZmluZSBDT1VOVEVSX01BU0tfMTZfQklUIChDT1VOVEVSX1dSQVBfMTZfQklUIC0gMSkKLSNkZWZpbmUgQ09VTlRFUl9NQVNLXzEyX0JJVCAoQ09VTlRFUl9XUkFQXzEyX0JJVCAtIDEpCi0KLS8qKgotICogQ29uZmlnTWFjUmVnczEgLSBJbml0aWFsaXplIHRoZSBmaXJzdCBwYXJ0IG9mIE1BQyByZWdzCi0gKiBAcEFkcGF0ZXI6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIgc3RydWN0dXJlCi0gKi8KLXZvaWQgQ29uZmlnTUFDUmVnczEoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKLQlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqcE1hYyA9ICZldGRldi0+cmVncy0+bWFjOwotCXUzMiBzdGF0aW9uMTsKLQl1MzIgc3RhdGlvbjI7Ci0JdTMyIGlwZzsKLQotCS8qIEZpcnN0IHdlIG5lZWQgdG8gcmVzZXQgZXZlcnl0aGluZy4gIFdyaXRlIHRvIE1BQyBjb25maWd1cmF0aW9uCi0JICogcmVnaXN0ZXIgMSB0byBwZXJmb3JtIHJlc2V0LgotCSAqLwotCXdyaXRlbCgweEMwMEYwMDAwLCAmcE1hYy0+Y2ZnMSk7Ci0KLQkvKiBOZXh0IGxldHMgY29uZmlndXJlIHRoZSBNQUMgSW50ZXItcGFja2V0IGdhcCByZWdpc3RlciAqLwotCWlwZyA9IDB4MzgwMDU4NjA7CQkvKiBJUEcxIDB4MzggSVBHMiAweDU4IEIyQiAweDYwICovCi0JaXBnIHw9IDB4NTAgPDwgODsJCS8qIGlmZyBlbmZvcmNlIDB4NTAgKi8KLQl3cml0ZWwoaXBnLCAmcE1hYy0+aXBnKTsKLQotCS8qIE5leHQgbGV0cyBjb25maWd1cmUgdGhlIE1BQyBIYWxmIER1cGxleCByZWdpc3RlciAqLwotCS8qIEJFQiB0cnVuYyAweEEsIEV4IERlZmVyLCBSZXhtaXQgMHhGIENvbGwgMHgzNyAqLwotCXdyaXRlbCgweDAwQTFGMDM3LCAmcE1hYy0+aGZkcCk7Ci0KLQkvKiBOZXh0IGxldHMgY29uZmlndXJlIHRoZSBNQUMgSW50ZXJmYWNlIENvbnRyb2wgcmVnaXN0ZXIgKi8KLQl3cml0ZWwoMCwgJnBNYWMtPmlmX2N0cmwpOwotCi0JLyogTGV0J3MgbW92ZSBvbiB0byBzZXR0aW5nIHVwIHRoZSBtaWkgbWFuYWdlbWVudCBjb25maWd1cmF0aW9uICovCi0Jd3JpdGVsKDB4MDcsICZwTWFjLT5taWlfbWdtdF9jZmcpOwkvKiBDbG9jayByZXNldCAweDcgKi8KLQotCS8qIE5leHQgbGV0cyBjb25maWd1cmUgdGhlIE1BQyBTdGF0aW9uIEFkZHJlc3MgcmVnaXN0ZXIuICBUaGVzZQotCSAqIHZhbHVlcyBhcmUgcmVhZCBmcm9tIHRoZSBFRVBST00gZHVyaW5nIGluaXRpYWxpemF0aW9uIGFuZCBzdG9yZWQKLQkgKiBpbiB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUuICBXZSB3cml0ZSB3aGF0IGlzIHN0b3JlZCBpbiB0aGUgYWRhcHRlcgotCSAqIHN0cnVjdHVyZSB0byB0aGUgTUFDIFN0YXRpb24gQWRkcmVzcyByZWdpc3RlcnMgaGlnaCBhbmQgbG93LiAgVGhpcwotCSAqIHN0YXRpb24gYWRkcmVzcyBpcyB1c2VkIGZvciBnZW5lcmF0aW5nIGFuZCBjaGVja2luZyBwYXVzZSBjb250cm9sCi0JICogcGFja2V0cy4KLQkgKi8KLQlzdGF0aW9uMiA9IChldGRldi0+YWRkclsxXSA8PCBFVF9NQUNfU1RBVElPTl9BRERSMl9PQzJfU0hJRlQpIHwKLQkJICAgKGV0ZGV2LT5hZGRyWzBdIDw8IEVUX01BQ19TVEFUSU9OX0FERFIyX09DMV9TSElGVCk7Ci0Jc3RhdGlvbjEgPSAoZXRkZXYtPmFkZHJbNV0gPDwgRVRfTUFDX1NUQVRJT05fQUREUjFfT0M2X1NISUZUKSB8Ci0JCSAgIChldGRldi0+YWRkcls0XSA8PCBFVF9NQUNfU1RBVElPTl9BRERSMV9PQzVfU0hJRlQpIHwKLQkJICAgKGV0ZGV2LT5hZGRyWzNdIDw8IEVUX01BQ19TVEFUSU9OX0FERFIxX09DNF9TSElGVCkgfAotCQkgICAgZXRkZXYtPmFkZHJbMl07Ci0Jd3JpdGVsKHN0YXRpb24xLCAmcE1hYy0+c3RhdGlvbl9hZGRyXzEpOwotCXdyaXRlbChzdGF0aW9uMiwgJnBNYWMtPnN0YXRpb25fYWRkcl8yKTsKLQotCS8qIE1heCBldGhlcm5ldCBwYWNrZXQgaW4gYnl0ZXMgdGhhdCB3aWxsIHBhc3NlZCBieSB0aGUgbWFjIHdpdGhvdXQKLQkgKiBiZWluZyB0cnVuY2F0ZWQuICBBbGxvdyB0aGUgTUFDIHRvIHBhc3MgNCBtb3JlIHRoYW4gb3VyIG1heCBwYWNrZXQKLQkgKiBzaXplLiAgVGhpcyBpcyA0IGZvciB0aGUgRXRoZXJuZXQgQ1JDLgotCSAqCi0JICogUGFja2V0cyBsYXJnZXIgdGhhbiAoUmVnaXN0cnlKdW1ib1BhY2tldCkgdGhhdCBkbyBub3QgY29udGFpbiBhCi0JICogVkxBTiBJRCB3aWxsIGJlIGRyb3BwZWQgYnkgdGhlIFJ4IGZ1bmN0aW9uLgotCSAqLwotCXdyaXRlbChldGRldi0+UmVnaXN0cnlKdW1ib1BhY2tldCArIDQsICZwTWFjLT5tYXhfZm1fbGVuKTsKLQotCS8qIGNsZWFyIG91dCBNQUMgY29uZmlnIHJlc2V0ICovCi0Jd3JpdGVsKDAsICZwTWFjLT5jZmcxKTsKLX0KLQotLyoqCi0gKiBDb25maWdNYWNSZWdzMiAtIEluaXRpYWxpemUgdGhlIHNlY29uZCBwYXJ0IG9mIE1BQyByZWdzCi0gKiBAcEFkcGF0ZXI6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIgc3RydWN0dXJlCi0gKi8KLXZvaWQgQ29uZmlnTUFDUmVnczIoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKLQlpbnQzMl90IGRlbGF5ID0gMDsKLQlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqcE1hYyA9ICZldGRldi0+cmVncy0+bWFjOwotCXUzMiBjZmcxOwotCXUzMiBjZmcyOwotCXUzMiBpZmN0cmw7Ci0JdTMyIGN0bDsKLQotCWN0bCA9IHJlYWRsKCZldGRldi0+cmVncy0+dHhtYWMuY3RsKTsKLQljZmcxID0gcmVhZGwoJnBNYWMtPmNmZzEpOwotCWNmZzIgPSByZWFkbCgmcE1hYy0+Y2ZnMik7Ci0JaWZjdHJsID0gcmVhZGwoJnBNYWMtPmlmX2N0cmwpOwotCi0JLyogU2V0IHVwIHRoZSBpZiBtb2RlIGJpdHMgKi8KLQljZmcyICY9IH4weDMwMDsKLQlpZiAoZXRkZXYtPmxpbmtzcGVlZCA9PSBUUlVFUEhZX1NQRUVEXzEwMDBNQlBTKSB7Ci0JCWNmZzIgfD0gMHgyMDA7Ci0JCS8qIFBoeSBtb2RlIGJpdCAqLwotCQlpZmN0cmwgJj0gfigxIDw8IDI0KTsKLQl9IGVsc2UgewotCQljZmcyIHw9IDB4MTAwOwotCQlpZmN0cmwgfD0gKDEgPDwgMjQpOwotCX0KLQotCS8qIFdlIG5lZWQgdG8gZW5hYmxlIFJ4L1R4ICovCi0JY2ZnMSB8PSBDRkcxX1JYX0VOQUJMRXxDRkcxX1RYX0VOQUJMRXxDRkcxX1RYX0ZMT1c7Ci0JLyogSW5pdGlhbGl6ZSBsb29wIGJhY2sgdG8gb2ZmICovCi0JY2ZnMSAmPSB+KENGRzFfTE9PUEJBQ0t8Q0ZHMV9SWF9GTE9XKTsKLQlpZiAoZXRkZXYtPmZsb3djb250cm9sID09IEZMT1dfUlhPTkxZIHx8IGV0ZGV2LT5mbG93Y29udHJvbCA9PSBGTE9XX0JPVEgpCi0JCWNmZzEgfD0gQ0ZHMV9SWF9GTE9XOwotCXdyaXRlbChjZmcxLCAmcE1hYy0+Y2ZnMSk7Ci0KLQkvKiBOb3cgd2UgbmVlZCB0byBpbml0aWFsaXplIHRoZSBNQUMgQ29uZmlndXJhdGlvbiAyIHJlZ2lzdGVyICovCi0JLyogcHJlYW1ibGUgNywgY2hlY2sgbGVuZ3RoLCBodWdlIGZyYW1lIG9mZiwgcGFkIGNyYywgY3JjIGVuYWJsZQotCSAgIGZ1bGwgZHVwbGV4IG9mZiAqLwotCWNmZzIgfD0gMHg3MDE2OwotCWNmZzIgJj0gfjB4MDAyMTsKLQotCS8qIFR1cm4gb24gZHVwbGV4IGlmIG5lZWRlZCAqLwotCWlmIChldGRldi0+ZHVwbGV4X21vZGUpCi0JCWNmZzIgfD0gMHgwMTsKLQotCWlmY3RybCAmPSB+KDEgPDwgMjYpOwotCWlmICghZXRkZXYtPmR1cGxleF9tb2RlKQotCQlpZmN0cmwgfD0gKDE8PDI2KTsJLyogRW5hYmxlIGdoZCAqLwotCi0Jd3JpdGVsKGlmY3RybCwgJnBNYWMtPmlmX2N0cmwpOwotCXdyaXRlbChjZmcyLCAmcE1hYy0+Y2ZnMik7Ci0KLQlkbyB7Ci0JCXVkZWxheSgxMCk7Ci0JCWRlbGF5Kys7Ci0JCWNmZzEgPSByZWFkbCgmcE1hYy0+Y2ZnMSk7Ci0JfSB3aGlsZSAoKGNmZzEgJiBDRkcxX1dBSVQpICE9IENGRzFfV0FJVCAmJiBkZWxheSA8IDEwMCk7Ci0KLQlpZiAoZGVsYXkgPT0gMTAwKSB7Ci0JCWRldl93YXJuKCZldGRldi0+cGRldi0+ZGV2LAotCQkgICAgIlN5bmNkIGJpdHMgZGlkIG5vdCByZXNwb25kIGNvcnJlY3RseSBjZmcxIHdvcmQgMHglMDh4XG4iLAotCQkJY2ZnMSk7Ci0JfQotCi0JLyogRW5hYmxlIFRYTUFDICovCi0JY3RsIHw9IDB4MDk7CS8qIFRYIG1hYyBlbmFibGUsIEZDIGRpc2FibGUgKi8KLQl3cml0ZWwoY3RsLCAmZXRkZXYtPnJlZ3MtPnR4bWFjLmN0bCk7Ci0KLQkvKiBSZWFkeSB0byBzdGFydCB0aGUgUlhETUEvVFhETUEgZW5naW5lICovCi0JaWYgKGV0ZGV2LT5mbGFncyAmIGZNUF9BREFQVEVSX0xPV0VSX1BPV0VSKSB7Ci0JCWV0MTMxeF9yeF9kbWFfZW5hYmxlKGV0ZGV2KTsKLQkJZXQxMzF4X3R4X2RtYV9lbmFibGUoZXRkZXYpOwotCX0KLX0KLQotdm9pZCBDb25maWdSeE1hY1JlZ3Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKLQlzdHJ1Y3QgcnhtYWNfcmVncyBfX2lvbWVtICpwUnhNYWMgPSAmZXRkZXYtPnJlZ3MtPnJ4bWFjOwotCXUzMiBzYV9sbzsKLQl1MzIgc2FfaGkgPSAwOwotCXUzMiBwZl9jdHJsID0gMDsKLQotCS8qIERpc2FibGUgdGhlIE1BQyB3aGlsZSBpdCBpcyBiZWluZyBjb25maWd1cmVkIChhbHNvIGRpc2FibGUgV09MKSAqLwotCXdyaXRlbCgweDgsICZwUnhNYWMtPmN0cmwpOwotCi0JLyogSW5pdGlhbGl6ZSBXT0wgdG8gZGlzYWJsZWQuICovCi0Jd3JpdGVsKDAsICZwUnhNYWMtPmNyYzApOwotCXdyaXRlbCgwLCAmcFJ4TWFjLT5jcmMxMik7Ci0Jd3JpdGVsKDAsICZwUnhNYWMtPmNyYzM0KTsKLQotCS8qIFdlIG5lZWQgdG8gc2V0IHRoZSBXT0wgbWFzazAgLSBtYXNrNCBuZXh0LiAgV2UgaW5pdGlhbGl6ZSBpdCB0bwotCSAqIGl0cyBkZWZhdWx0IFZhbHVlcyBvZiAweDAwMDAwMDAwIGJlY2F1c2UgdGhlcmUgYXJlIG5vdCBXT0wgbWFza3MKLQkgKiBhcyBvZiB0aGlzIHRpbWUuCi0JICovCi0Jd3JpdGVsKDAsICZwUnhNYWMtPm1hc2swX3dvcmQwKTsKLQl3cml0ZWwoMCwgJnBSeE1hYy0+bWFzazBfd29yZDEpOwotCXdyaXRlbCgwLCAmcFJ4TWFjLT5tYXNrMF93b3JkMik7Ci0Jd3JpdGVsKDAsICZwUnhNYWMtPm1hc2swX3dvcmQzKTsKLQotCXdyaXRlbCgwLCAmcFJ4TWFjLT5tYXNrMV93b3JkMCk7Ci0Jd3JpdGVsKDAsICZwUnhNYWMtPm1hc2sxX3dvcmQxKTsKLQl3cml0ZWwoMCwgJnBSeE1hYy0+bWFzazFfd29yZDIpOwotCXdyaXRlbCgwLCAmcFJ4TWFjLT5tYXNrMV93b3JkMyk7Ci0KLQl3cml0ZWwoMCwgJnBSeE1hYy0+bWFzazJfd29yZDApOwotCXdyaXRlbCgwLCAmcFJ4TWFjLT5tYXNrMl93b3JkMSk7Ci0Jd3JpdGVsKDAsICZwUnhNYWMtPm1hc2syX3dvcmQyKTsKLQl3cml0ZWwoMCwgJnBSeE1hYy0+bWFzazJfd29yZDMpOwotCi0Jd3JpdGVsKDAsICZwUnhNYWMtPm1hc2szX3dvcmQwKTsKLQl3cml0ZWwoMCwgJnBSeE1hYy0+bWFzazNfd29yZDEpOwotCXdyaXRlbCgwLCAmcFJ4TWFjLT5tYXNrM193b3JkMik7Ci0Jd3JpdGVsKDAsICZwUnhNYWMtPm1hc2szX3dvcmQzKTsKLQotCXdyaXRlbCgwLCAmcFJ4TWFjLT5tYXNrNF93b3JkMCk7Ci0Jd3JpdGVsKDAsICZwUnhNYWMtPm1hc2s0X3dvcmQxKTsKLQl3cml0ZWwoMCwgJnBSeE1hYy0+bWFzazRfd29yZDIpOwotCXdyaXRlbCgwLCAmcFJ4TWFjLT5tYXNrNF93b3JkMyk7Ci0KLQkvKiBMZXRzIHNldHVwIHRoZSBXT0wgU291cmNlIEFkZHJlc3MgKi8KLQlzYV9sbyA9IChldGRldi0+YWRkclsyXSA8PCBFVF9XT0xfTE9fU0EzX1NISUZUKSB8Ci0JCShldGRldi0+YWRkclszXSA8PCBFVF9XT0xfTE9fU0E0X1NISUZUKSB8Ci0JCShldGRldi0+YWRkcls0XSA8PCBFVF9XT0xfTE9fU0E1X1NISUZUKSB8Ci0JCSBldGRldi0+YWRkcls1XTsKLQl3cml0ZWwoc2FfbG8sICZwUnhNYWMtPnNhX2xvKTsKLQotCXNhX2hpID0gKHUzMikgKGV0ZGV2LT5hZGRyWzBdIDw8IEVUX1dPTF9ISV9TQTFfU0hJRlQpIHwKLQkgICAgICAgICAgICAgICBldGRldi0+YWRkclsxXTsKLQl3cml0ZWwoc2FfaGksICZwUnhNYWMtPnNhX2hpKTsKLQotCS8qIERpc2FibGUgYWxsIFBhY2tldCBGaWx0ZXJpbmcgKi8KLQl3cml0ZWwoMCwgJnBSeE1hYy0+cGZfY3RybCk7Ci0KLQkvKiBMZXQncyBpbml0aWFsaXplIHRoZSBVbmljYXN0IFBhY2tldCBmaWx0ZXJpbmcgYWRkcmVzcyAqLwotCWlmIChldGRldi0+UGFja2V0RmlsdGVyICYgRVQxMzFYX1BBQ0tFVF9UWVBFX0RJUkVDVEVEKSB7Ci0JCVNldHVwRGV2aWNlRm9yVW5pY2FzdChldGRldik7Ci0JCXBmX2N0cmwgfD0gNDsJLyogVW5pY2FzdCBmaWx0ZXIgKi8KLQl9IGVsc2UgewotCQl3cml0ZWwoMCwgJnBSeE1hYy0+dW5pX3BmX2FkZHIxKTsKLQkJd3JpdGVsKDAsICZwUnhNYWMtPnVuaV9wZl9hZGRyMik7Ci0JCXdyaXRlbCgwLCAmcFJ4TWFjLT51bmlfcGZfYWRkcjMpOwotCX0KLQotCS8qIExldCdzIGluaXRpYWxpemUgdGhlIE11bHRpY2FzdCBoYXNoICovCi0JaWYgKCEoZXRkZXYtPlBhY2tldEZpbHRlciAmIEVUMTMxWF9QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUKSkgewotCQlwZl9jdHJsIHw9IDI7CS8qIE11bHRpY2FzdCBmaWx0ZXIgKi8KLQkJU2V0dXBEZXZpY2VGb3JNdWx0aWNhc3QoZXRkZXYpOwotCX0KLQotCS8qIFJ1bnQgcGFja2V0IGZpbHRlcmluZy4gIERpZG4ndCB3b3JrIGluIHZlcnNpb24gQSBzaWxpY29uLiAqLwotCXBmX2N0cmwgfD0gKE5JQ19NSU5fUEFDS0VUX1NJWkUgKyA0KSA8PCAxNjsKLQlwZl9jdHJsIHw9IDg7CS8qIEZyYWdtZW50IGZpbHRlciAqLwotCi0JaWYgKGV0ZGV2LT5SZWdpc3RyeUp1bWJvUGFja2V0ID4gODE5MikKLQkJLyogSW4gb3JkZXIgdG8gdHJhbnNtaXQganVtYm8gcGFja2V0cyBncmVhdGVyIHRoYW4gOGssIHRoZQotCQkgKiBGSUZPIGJldHdlZW4gUnhNQUMgYW5kIFJ4RE1BIG5lZWRzIHRvIGJlIHJlZHVjZWQgaW4gc2l6ZQotCQkgKiB0byAoMTZrIC0gSnVtYm8gcGFja2V0IHNpemUpLiAgSW4gb3JkZXIgdG8gaW1wbGVtZW50IHRoaXMsCi0JCSAqIHdlIG11c3QgdXNlICJjdXQgdGhyb3VnaCIgbW9kZSBpbiB0aGUgUnhNQUMsIHdoaWNoIGNob3BzCi0JCSAqIHBhY2tldHMgZG93biBpbnRvIHNlZ21lbnRzIHdoaWNoIGFyZSAobWF4X3NpemUgKiAxNikuICBJbgotCQkgKiB0aGlzIGNhc2Ugd2Ugc2VsZWN0ZWQgMjU2IGJ5dGVzLCBzaW5jZSB0aGlzIGlzIHRoZSBzaXplIG9mCi0JCSAqIHRoZSBQQ0ktRXhwcmVzcyBUTFAncyB0aGF0IHRoZSAxMzEwIHVzZXMuCi0JCSAqCi0JCSAqIHNlZ19lbiBvbiwgZmNfZW4gb2ZmLCBzaXplIDB4MTAKLQkJICovCi0JCXdyaXRlbCgweDQxLCAmcFJ4TWFjLT5tY2lmX2N0cmxfbWF4X3NlZyk7Ci0JZWxzZQotCQl3cml0ZWwoMCwgJnBSeE1hYy0+bWNpZl9jdHJsX21heF9zZWcpOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgTUNJRiB3YXRlciBtYXJrcyAqLwotCXdyaXRlbCgwLCAmcFJ4TWFjLT5tY2lmX3dhdGVyX21hcmspOwotCi0JLyogIEluaXRpYWxpemUgdGhlIE1JRiBjb250cm9sICovCi0Jd3JpdGVsKDAsICZwUnhNYWMtPm1pZl9jdHJsKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIFNwYWNlIEF2YWlsYWJsZSBSZWdpc3RlciAqLwotCXdyaXRlbCgwLCAmcFJ4TWFjLT5zcGFjZV9hdmFpbCk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSB0aGUgbWlmX2N0cmwgcmVnaXN0ZXIKLQkgKiBiaXQgMzogIFJlY2VpdmUgY29kZSBlcnJvci4gT25lIG9yIG1vcmUgbmliYmxlcyB3ZXJlIHNpZ25hbGVkIGFzCi0JICoJICAgZXJyb3JzICBkdXJpbmcgdGhlIHJlY2VwdGlvbiBvZiB0aGUgcGFja2V0LiAgQ2xlYXIgdGhpcwotCSAqCSAgIGJpdCBpbiBHaWdhYml0LCBzZXQgaXQgaW4gMTAwTWJpdC4gIFRoaXMgd2FzIGRlcml2ZWQKLQkgKgkgICBleHBlcmltZW50YWxseSBhdCBVTkguCi0JICogYml0IDQ6ICBSZWNlaXZlIENSQyBlcnJvci4gVGhlIHBhY2tldCdzIENSQyBkaWQgbm90IG1hdGNoIHRoZQotCSAqCSAgIGludGVybmFsbHkgZ2VuZXJhdGVkIENSQy4KLQkgKiBiaXQgNTogIFJlY2VpdmUgbGVuZ3RoIGNoZWNrIGVycm9yLiBJbmRpY2F0ZXMgdGhhdCBmcmFtZSBsZW5ndGgKLQkgKgkgICBmaWVsZCB2YWx1ZSBpbiB0aGUgcGFja2V0IGRvZXMgbm90IG1hdGNoIHRoZSBhY3R1YWwgZGF0YQotCSAqCSAgIGJ5dGUgbGVuZ3RoIGFuZCBpcyBub3QgYSB0eXBlIGZpZWxkLgotCSAqIGJpdCAxNjogUmVjZWl2ZSBmcmFtZSB0cnVuY2F0ZWQuCi0JICogYml0IDE3OiBEcm9wIHBhY2tldCBlbmFibGUKLQkgKi8KLQlpZiAoZXRkZXYtPmxpbmtzcGVlZCA9PSBUUlVFUEhZX1NQRUVEXzEwME1CUFMpCi0JCXdyaXRlbCgweDMwMDM4LCAmcFJ4TWFjLT5taWZfY3RybCk7Ci0JZWxzZQotCQl3cml0ZWwoMHgzMDAzMCwgJnBSeE1hYy0+bWlmX2N0cmwpOwotCi0JLyogRmluYWxseSB3ZSBpbml0aWFsaXplIFJ4TWFjIHRvIGJlIGVuYWJsZWQgJiBXT0wgZGlzYWJsZWQuICBQYWNrZXQKLQkgKiBmaWx0ZXIgaXMgYWx3YXlzIGVuYWJsZWQgc2luY2UgaXQgaXMgd2hlcmUgdGhlIHJ1bnQgcGFja2V0cyBhcmUKLQkgKiBzdXBwb3NlZCB0byBiZSBkcm9wcGVkLiAgRm9yIHZlcnNpb24gQSBzaWxpY29uLCBydW50IHBhY2tldAotCSAqIGRyb3BwaW5nIGRvZXNuJ3Qgd29yaywgc28gaXQgaXMgZGlzYWJsZWQgaW4gdGhlIHBmX2N0cmwgcmVnaXN0ZXIsCi0JICogYnV0IHdlIHN0aWxsIGxlYXZlIHRoZSBwYWNrZXQgZmlsdGVyIG9uLgotCSAqLwotCXdyaXRlbChwZl9jdHJsLCAmcFJ4TWFjLT5wZl9jdHJsKTsKLQl3cml0ZWwoMHg5LCAmcFJ4TWFjLT5jdHJsKTsKLX0KLQotdm9pZCBDb25maWdUeE1hY1JlZ3Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKLQlzdHJ1Y3QgdHhtYWNfcmVncyAqdHhtYWMgPSAmZXRkZXYtPnJlZ3MtPnR4bWFjOwotCi0JLyogV2UgbmVlZCB0byB1cGRhdGUgdGhlIENvbnRyb2wgRnJhbWUgUGFyYW1ldGVycwotCSAqIGNmcHQgLSBjb250cm9sIGZyYW1lIHBhdXNlIHRpbWVyIHNldCB0byA2NCAoMHg0MCkKLQkgKiBjZmVwIC0gY29udHJvbCBmcmFtZSBleHRlbmRlZCBwYXVzZSB0aW1lciBzZXQgdG8gMHgwCi0JICovCi0JaWYgKGV0ZGV2LT5mbG93Y29udHJvbCA9PSBGTE9XX05PTkUpCi0JCXdyaXRlbCgwLCAmdHhtYWMtPmNmX3BhcmFtKTsKLQllbHNlCi0JCXdyaXRlbCgweDQwLCAmdHhtYWMtPmNmX3BhcmFtKTsKLX0KLQotdm9pZCBDb25maWdNYWNTdGF0UmVncyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCXN0cnVjdCBtYWNzdGF0X3JlZ3MgX19pb21lbSAqbWFjc3RhdCA9Ci0JCSZldGRldi0+cmVncy0+bWFjc3RhdDsKLQotCS8qIE5leHQgd2UgbmVlZCB0byBpbml0aWFsaXplIGFsbCB0aGUgbWFjc3RhdCByZWdpc3RlcnMgdG8gemVybyBvbgotCSAqIHRoZSBkZXZpY2UuCi0JICovCi0Jd3JpdGVsKDAsICZtYWNzdGF0LT50eHJ4XzBfNjRfYnl0ZV9mcmFtZXMpOwotCXdyaXRlbCgwLCAmbWFjc3RhdC0+dHhyeF82NV8xMjdfYnl0ZV9mcmFtZXMpOwotCXdyaXRlbCgwLCAmbWFjc3RhdC0+dHhyeF8xMjhfMjU1X2J5dGVfZnJhbWVzKTsKLQl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4cnhfMjU2XzUxMV9ieXRlX2ZyYW1lcyk7Ci0Jd3JpdGVsKDAsICZtYWNzdGF0LT50eHJ4XzUxMl8xMDIzX2J5dGVfZnJhbWVzKTsKLQl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4cnhfMTAyNF8xNTE4X2J5dGVfZnJhbWVzKTsKLQl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4cnhfMTUxOV8xNTIyX2d2bG5fZnJhbWVzKTsKLQotCXdyaXRlbCgwLCAmbWFjc3RhdC0+cnhfYnl0ZXMpOwotCXdyaXRlbCgwLCAmbWFjc3RhdC0+cnhfcGFja2V0cyk7Ci0Jd3JpdGVsKDAsICZtYWNzdGF0LT5yeF9mY3NfZXJycyk7Ci0Jd3JpdGVsKDAsICZtYWNzdGF0LT5yeF9tdWx0aWNhc3RfcGFja2V0cyk7Ci0Jd3JpdGVsKDAsICZtYWNzdGF0LT5yeF9icm9hZGNhc3RfcGFja2V0cyk7Ci0Jd3JpdGVsKDAsICZtYWNzdGF0LT5yeF9jb250cm9sX2ZyYW1lcyk7Ci0Jd3JpdGVsKDAsICZtYWNzdGF0LT5yeF9wYXVzZV9mcmFtZXMpOwotCXdyaXRlbCgwLCAmbWFjc3RhdC0+cnhfdW5rbm93bl9vcGNvZGVzKTsKLQl3cml0ZWwoMCwgJm1hY3N0YXQtPnJ4X2FsaWduX2VycnMpOwotCXdyaXRlbCgwLCAmbWFjc3RhdC0+cnhfZnJhbWVfbGVuX2VycnMpOwotCXdyaXRlbCgwLCAmbWFjc3RhdC0+cnhfY29kZV9lcnJzKTsKLQl3cml0ZWwoMCwgJm1hY3N0YXQtPnJ4X2NhcnJpZXJfc2Vuc2VfZXJycyk7Ci0Jd3JpdGVsKDAsICZtYWNzdGF0LT5yeF91bmRlcnNpemVfcGFja2V0cyk7Ci0Jd3JpdGVsKDAsICZtYWNzdGF0LT5yeF9vdmVyc2l6ZV9wYWNrZXRzKTsKLQl3cml0ZWwoMCwgJm1hY3N0YXQtPnJ4X2ZyYWdtZW50X3BhY2tldHMpOwotCXdyaXRlbCgwLCAmbWFjc3RhdC0+cnhfamFiYmVycyk7Ci0Jd3JpdGVsKDAsICZtYWNzdGF0LT5yeF9kcm9wcyk7Ci0KLQl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4X2J5dGVzKTsKLQl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4X3BhY2tldHMpOwotCXdyaXRlbCgwLCAmbWFjc3RhdC0+dHhfbXVsdGljYXN0X3BhY2tldHMpOwotCXdyaXRlbCgwLCAmbWFjc3RhdC0+dHhfYnJvYWRjYXN0X3BhY2tldHMpOwotCXdyaXRlbCgwLCAmbWFjc3RhdC0+dHhfcGF1c2VfZnJhbWVzKTsKLQl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4X2RlZmVycmVkKTsKLQl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4X2V4Y2Vzc2l2ZV9kZWZlcnJlZCk7Ci0Jd3JpdGVsKDAsICZtYWNzdGF0LT50eF9zaW5nbGVfY29sbGlzaW9ucyk7Ci0Jd3JpdGVsKDAsICZtYWNzdGF0LT50eF9tdWx0aXBsZV9jb2xsaXNpb25zKTsKLQl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4X2xhdGVfY29sbGlzaW9ucyk7Ci0Jd3JpdGVsKDAsICZtYWNzdGF0LT50eF9leGNlc3NpdmVfY29sbGlzaW9ucyk7Ci0Jd3JpdGVsKDAsICZtYWNzdGF0LT50eF90b3RhbF9jb2xsaXNpb25zKTsKLQl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4X3BhdXNlX2hvbm9yZWRfZnJhbWVzKTsKLQl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4X2Ryb3BzKTsKLQl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4X2phYmJlcnMpOwotCXdyaXRlbCgwLCAmbWFjc3RhdC0+dHhfZmNzX2VycnMpOwotCXdyaXRlbCgwLCAmbWFjc3RhdC0+dHhfY29udHJvbF9mcmFtZXMpOwotCXdyaXRlbCgwLCAmbWFjc3RhdC0+dHhfb3ZlcnNpemVfZnJhbWVzKTsKLQl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4X3VuZGVyc2l6ZV9mcmFtZXMpOwotCXdyaXRlbCgwLCAmbWFjc3RhdC0+dHhfZnJhZ21lbnRzKTsKLQl3cml0ZWwoMCwgJm1hY3N0YXQtPmNhcnJ5X3JlZzEpOwotCXdyaXRlbCgwLCAmbWFjc3RhdC0+Y2FycnlfcmVnMik7Ci0KLQkvKiBVbm1hc2sgYW55IGNvdW50ZXJzIHRoYXQgd2Ugd2FudCB0byB0cmFjayB0aGUgb3ZlcmZsb3cgb2YuCi0JICogSW5pdGlhbGx5IHRoaXMgd2lsbCBiZSBhbGwgY291bnRlcnMuICBJdCBtYXkgYmVjb21lIGNsZWFyIGxhdGVyCi0JICogdGhhdCB3ZSBkbyBub3QgbmVlZCB0byB0cmFjayBhbGwgY291bnRlcnMuCi0JICovCi0Jd3JpdGVsKDB4RkZGRkJFMzIsICZtYWNzdGF0LT5jYXJyeV9yZWcxX21hc2spOwotCXdyaXRlbCgweEZGRkU3RThCLCAmbWFjc3RhdC0+Y2FycnlfcmVnMl9tYXNrKTsKLX0KLQotdm9pZCBDb25maWdGbG93Q29udHJvbChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCWlmIChldGRldi0+ZHVwbGV4X21vZGUgPT0gMCkgewotCQlldGRldi0+Zmxvd2NvbnRyb2wgPSBGTE9XX05PTkU7Ci0JfSBlbHNlIHsKLQkJY2hhciByZW1vdGVfcGF1c2UsIHJlbW90ZV9hc3luY19wYXVzZTsKLQotCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoZXRkZXYsCi0JCQkJICAgICAgVFJVRVBIWV9CSVRfUkVBRCwgNSwgMTAsICZyZW1vdGVfcGF1c2UpOwotCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoZXRkZXYsCi0JCQkJICAgICAgVFJVRVBIWV9CSVRfUkVBRCwgNSwgMTEsCi0JCQkJICAgICAgJnJlbW90ZV9hc3luY19wYXVzZSk7Ci0KLQkJaWYgKChyZW1vdGVfcGF1c2UgPT0gVFJVRVBIWV9CSVRfU0VUKSAmJgotCQkgICAgKHJlbW90ZV9hc3luY19wYXVzZSA9PSBUUlVFUEhZX0JJVF9TRVQpKSB7Ci0JCQlldGRldi0+Zmxvd2NvbnRyb2wgPSBldGRldi0+d2FudGVkX2Zsb3c7Ci0JCX0gZWxzZSBpZiAoKHJlbW90ZV9wYXVzZSA9PSBUUlVFUEhZX0JJVF9TRVQpICYmCi0JCQkgICAocmVtb3RlX2FzeW5jX3BhdXNlID09IFRSVUVQSFlfQklUX0NMRUFSKSkgewotCQkJaWYgKGV0ZGV2LT53YW50ZWRfZmxvdyA9PSBGTE9XX0JPVEgpCi0JCQkJZXRkZXYtPmZsb3djb250cm9sID0gRkxPV19CT1RIOwotCQkJZWxzZQotCQkJCWV0ZGV2LT5mbG93Y29udHJvbCA9IEZMT1dfTk9ORTsKLQkJfSBlbHNlIGlmICgocmVtb3RlX3BhdXNlID09IFRSVUVQSFlfQklUX0NMRUFSKSAmJgotCQkJICAgKHJlbW90ZV9hc3luY19wYXVzZSA9PSBUUlVFUEhZX0JJVF9DTEVBUikpIHsKLQkJCWV0ZGV2LT5mbG93Y29udHJvbCA9IEZMT1dfTk9ORTsKLQkJfSBlbHNlIHsvKiBpZiAocmVtb3RlX3BhdXNlID09IFRSVUVQSFlfQ0xFQVJfQklUICYmCi0JCQkgICAgICAgcmVtb3RlX2FzeW5jX3BhdXNlID09IFRSVUVQSFlfU0VUX0JJVCkgKi8KLQkJCWlmIChldGRldi0+d2FudGVkX2Zsb3cgPT0gRkxPV19CT1RIKQotCQkJCWV0ZGV2LT5mbG93Y29udHJvbCA9IEZMT1dfUlhPTkxZOwotCQkJZWxzZQotCQkJCWV0ZGV2LT5mbG93Y29udHJvbCA9IEZMT1dfTk9ORTsKLQkJfQotCX0KLX0KLQotLyoqCi0gKiBVcGRhdGVNYWNTdGF0SG9zdENvdW50ZXJzIC0gVXBkYXRlIHRoZSBsb2NhbCBjb3B5IG9mIHRoZSBzdGF0aXN0aWNzCi0gKiBAZXRkZXY6IHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIgc3RydWN0dXJlCi0gKi8KLXZvaWQgVXBkYXRlTWFjU3RhdEhvc3RDb3VudGVycyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCXN0cnVjdCBjZV9zdGF0cyAqc3RhdHMgPSAmZXRkZXYtPnN0YXRzOwotCXN0cnVjdCBtYWNzdGF0X3JlZ3MgX19pb21lbSAqbWFjc3RhdCA9Ci0JCSZldGRldi0+cmVncy0+bWFjc3RhdDsKLQotCXN0YXRzLT5jb2xsaXNpb25zICs9IHJlYWRsKCZtYWNzdGF0LT50eF90b3RhbF9jb2xsaXNpb25zKTsKLQlzdGF0cy0+Zmlyc3RfY29sbGlzaW9uICs9IHJlYWRsKCZtYWNzdGF0LT50eF9zaW5nbGVfY29sbGlzaW9ucyk7Ci0Jc3RhdHMtPnR4X2RlZmVycmVkICs9IHJlYWRsKCZtYWNzdGF0LT50eF9kZWZlcnJlZCk7Ci0Jc3RhdHMtPmV4Y2Vzc2l2ZV9jb2xsaXNpb25zICs9IHJlYWRsKCZtYWNzdGF0LT50eF9tdWx0aXBsZV9jb2xsaXNpb25zKTsKLQlzdGF0cy0+bGF0ZV9jb2xsaXNpb25zICs9IHJlYWRsKCZtYWNzdGF0LT50eF9sYXRlX2NvbGxpc2lvbnMpOwotCXN0YXRzLT50eF91ZmxvICs9IHJlYWRsKCZtYWNzdGF0LT50eF91bmRlcnNpemVfZnJhbWVzKTsKLQlzdGF0cy0+bWF4X3BrdF9lcnJvciArPSByZWFkbCgmbWFjc3RhdC0+dHhfb3ZlcnNpemVfZnJhbWVzKTsKLQotCXN0YXRzLT5hbGlnbm1lbnRfZXJyICs9IHJlYWRsKCZtYWNzdGF0LT5yeF9hbGlnbl9lcnJzKTsKLQlzdGF0cy0+Y3JjX2VyciArPSByZWFkbCgmbWFjc3RhdC0+cnhfY29kZV9lcnJzKTsKLQlzdGF0cy0+bm9yY3ZidWYgKz0gcmVhZGwoJm1hY3N0YXQtPnJ4X2Ryb3BzKTsKLQlzdGF0cy0+cnhfb3ZfZmxvdyArPSByZWFkbCgmbWFjc3RhdC0+cnhfb3ZlcnNpemVfcGFja2V0cyk7Ci0Jc3RhdHMtPmNvZGVfdmlvbGF0aW9ucyArPSByZWFkbCgmbWFjc3RhdC0+cnhfZmNzX2VycnMpOwotCXN0YXRzLT5sZW5ndGhfZXJyICs9IHJlYWRsKCZtYWNzdGF0LT5yeF9mcmFtZV9sZW5fZXJycyk7Ci0KLQlzdGF0cy0+b3RoZXJfZXJyb3JzICs9IHJlYWRsKCZtYWNzdGF0LT5yeF9mcmFnbWVudF9wYWNrZXRzKTsKLX0KLQotLyoqCi0gKiBIYW5kbGVNYWNTdGF0SW50ZXJydXB0Ci0gKiBAZXRkZXY6IHBvaW50ZXIgdG8gdGhlIGFkYXB0ZXIgc3RydWN0dXJlCi0gKgotICogT25lIG9mIHRoZSBNQUNTVEFUIGNvdW50ZXJzIGhhcyB3cmFwcGVkLiAgVXBkYXRlIHRoZSBsb2NhbCBjb3B5IG9mCi0gKiB0aGUgc3RhdGlzdGljcyBoZWxkIGluIHRoZSBhZGFwdGVyIHN0cnVjdHVyZSwgY2hlY2tpbmcgdGhlICJ3cmFwIgotICogYml0IGZvciBlYWNoIGNvdW50ZXIuCi0gKi8KLXZvaWQgSGFuZGxlTWFjU3RhdEludGVycnVwdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCXUzMiBjYXJyeV9yZWcxOwotCXUzMiBjYXJyeV9yZWcyOwotCi0JLyogUmVhZCB0aGUgaW50ZXJydXB0IGJpdHMgZnJvbSB0aGUgcmVnaXN0ZXIocykuICBUaGVzZSBhcmUgQ2xlYXIgT24KLQkgKiBXcml0ZS4KLQkgKi8KLQljYXJyeV9yZWcxID0gcmVhZGwoJmV0ZGV2LT5yZWdzLT5tYWNzdGF0LmNhcnJ5X3JlZzEpOwotCWNhcnJ5X3JlZzIgPSByZWFkbCgmZXRkZXYtPnJlZ3MtPm1hY3N0YXQuY2FycnlfcmVnMik7Ci0KLQl3cml0ZWwoY2FycnlfcmVnMiwgJmV0ZGV2LT5yZWdzLT5tYWNzdGF0LmNhcnJ5X3JlZzEpOwotCXdyaXRlbChjYXJyeV9yZWcyLCAmZXRkZXYtPnJlZ3MtPm1hY3N0YXQuY2FycnlfcmVnMik7Ci0KLQkvKiBXZSBuZWVkIHRvIGRvIHVwZGF0ZSB0aGUgaG9zdCBjb3B5IG9mIGFsbCB0aGUgTUFDX1NUQVQgY291bnRlcnMuCi0JICogRm9yIGVhY2ggY291bnRlciwgY2hlY2sgaXQncyBvdmVyZmxvdyBiaXQuICBJZiB0aGUgb3ZlcmZsb3cgYml0IGlzCi0JICogc2V0LCB0aGVuIGluY3JlbWVudCB0aGUgaG9zdCB2ZXJzaW9uIG9mIHRoZSBjb3VudCBieSBvbmUgY29tcGxldGUKLQkgKiByZXZvbHV0aW9uIG9mIHRoZSBjb3VudGVyLiAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSBjb3VudGVyCi0JICogYmxvY2sgaW5kaWNhdGVzIHRoYXQgb25lIG9mIHRoZSBjb3VudGVycyBoYXMgd3JhcHBlZC4KLQkgKi8KLQlpZiAoY2FycnlfcmVnMSAmICgxIDw8IDE0KSkKLQkJZXRkZXYtPnN0YXRzLmNvZGVfdmlvbGF0aW9ucyArPSBDT1VOVEVSX1dSQVBfMTZfQklUOwotCWlmIChjYXJyeV9yZWcxICYgKDEgPDwgOCkpCi0JCWV0ZGV2LT5zdGF0cy5hbGlnbm1lbnRfZXJyICs9IENPVU5URVJfV1JBUF8xMl9CSVQ7Ci0JaWYgKGNhcnJ5X3JlZzEgJiAoMSA8PCA3KSkKLQkJZXRkZXYtPnN0YXRzLmxlbmd0aF9lcnIgKz0gQ09VTlRFUl9XUkFQXzE2X0JJVDsKLQlpZiAoY2FycnlfcmVnMSAmICgxIDw8IDIpKQotCQlldGRldi0+c3RhdHMub3RoZXJfZXJyb3JzICs9IENPVU5URVJfV1JBUF8xNl9CSVQ7Ci0JaWYgKGNhcnJ5X3JlZzEgJiAoMSA8PCA2KSkKLQkJZXRkZXYtPnN0YXRzLmNyY19lcnIgKz0gQ09VTlRFUl9XUkFQXzE2X0JJVDsKLQlpZiAoY2FycnlfcmVnMSAmICgxIDw8IDMpKQotCQlldGRldi0+c3RhdHMucnhfb3ZfZmxvdyArPSBDT1VOVEVSX1dSQVBfMTZfQklUOwotCWlmIChjYXJyeV9yZWcxICYgKDEgPDwgMCkpCi0JCWV0ZGV2LT5zdGF0cy5ub3JjdmJ1ZiArPSBDT1VOVEVSX1dSQVBfMTZfQklUOwotCWlmIChjYXJyeV9yZWcyICYgKDEgPDwgMTYpKQotCQlldGRldi0+c3RhdHMubWF4X3BrdF9lcnJvciArPSBDT1VOVEVSX1dSQVBfMTJfQklUOwotCWlmIChjYXJyeV9yZWcyICYgKDEgPDwgMTUpKQotCQlldGRldi0+c3RhdHMudHhfdWZsbyArPSBDT1VOVEVSX1dSQVBfMTJfQklUOwotCWlmIChjYXJyeV9yZWcyICYgKDEgPDwgNikpCi0JCWV0ZGV2LT5zdGF0cy5maXJzdF9jb2xsaXNpb24gKz0gQ09VTlRFUl9XUkFQXzEyX0JJVDsKLQlpZiAoY2FycnlfcmVnMiAmICgxIDw8IDgpKQotCQlldGRldi0+c3RhdHMudHhfZGVmZXJyZWQgKz0gQ09VTlRFUl9XUkFQXzEyX0JJVDsKLQlpZiAoY2FycnlfcmVnMiAmICgxIDw8IDUpKQotCQlldGRldi0+c3RhdHMuZXhjZXNzaXZlX2NvbGxpc2lvbnMgKz0gQ09VTlRFUl9XUkFQXzEyX0JJVDsKLQlpZiAoY2FycnlfcmVnMiAmICgxIDw8IDQpKQotCQlldGRldi0+c3RhdHMubGF0ZV9jb2xsaXNpb25zICs9IENPVU5URVJfV1JBUF8xMl9CSVQ7Ci0JaWYgKGNhcnJ5X3JlZzIgJiAoMSA8PCAyKSkKLQkJZXRkZXYtPnN0YXRzLmNvbGxpc2lvbnMgKz0gQ09VTlRFUl9XUkFQXzEyX0JJVDsKLX0KLQotdm9pZCBTZXR1cERldmljZUZvck11bHRpY2FzdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCXN0cnVjdCByeG1hY19yZWdzIF9faW9tZW0gKnJ4bWFjID0gJmV0ZGV2LT5yZWdzLT5yeG1hYzsKLQl1aW50MzJfdCBuSW5kZXg7Ci0JdWludDMyX3QgcmVzdWx0OwotCXVpbnQzMl90IGhhc2gxID0gMDsKLQl1aW50MzJfdCBoYXNoMiA9IDA7Ci0JdWludDMyX3QgaGFzaDMgPSAwOwotCXVpbnQzMl90IGhhc2g0ID0gMDsKLQl1MzIgcG1fY3NyOwotCi0JLyogSWYgRVQxMzFYX1BBQ0tFVF9UWVBFX01VTFRJQ0FTVCBpcyBzcGVjaWZpZWQsIHRoZW4gd2UgcHJvdmlzaW9uCi0JICogdGhlIG11bHRpLWNhc3QgTElTVC4gIElmIGl0IGlzIE5PVCBzcGVjaWZpZWQsIChhbmQgIkFMTCIgaXMgbm90Ci0JICogc3BlY2lmaWVkKSB0aGVuIHdlIHNob3VsZCBwYXNzIE5PIG11bHRpLWNhc3QgYWRkcmVzc2VzIHRvIHRoZQotCSAqIGRyaXZlci4KLQkgKi8KLQlpZiAoZXRkZXYtPlBhY2tldEZpbHRlciAmIEVUMTMxWF9QQUNLRVRfVFlQRV9NVUxUSUNBU1QpIHsKLQkJLyogTG9vcCB0aHJvdWdoIG91ciBtdWx0aWNhc3QgYXJyYXkgYW5kIHNldCB1cCB0aGUgZGV2aWNlICovCi0JCWZvciAobkluZGV4ID0gMDsgbkluZGV4IDwgZXRkZXYtPk1DQWRkcmVzc0NvdW50OyBuSW5kZXgrKykgewotCQkJcmVzdWx0ID0gZXRoZXJfY3JjKDYsIGV0ZGV2LT5NQ0xpc3RbbkluZGV4XSk7Ci0KLQkJCXJlc3VsdCA9IChyZXN1bHQgJiAweDNGODAwMDAwKSA+PiAyMzsKLQotCQkJaWYgKHJlc3VsdCA8IDMyKSB7Ci0JCQkJaGFzaDEgfD0gKDEgPDwgcmVzdWx0KTsKLQkJCX0gZWxzZSBpZiAoKDMxIDwgcmVzdWx0KSAmJiAocmVzdWx0IDwgNjQpKSB7Ci0JCQkJcmVzdWx0IC09IDMyOwotCQkJCWhhc2gyIHw9ICgxIDw8IHJlc3VsdCk7Ci0JCQl9IGVsc2UgaWYgKCg2MyA8IHJlc3VsdCkgJiYgKHJlc3VsdCA8IDk2KSkgewotCQkJCXJlc3VsdCAtPSA2NDsKLQkJCQloYXNoMyB8PSAoMSA8PCByZXN1bHQpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQgLT0gOTY7Ci0JCQkJaGFzaDQgfD0gKDEgPDwgcmVzdWx0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIFdyaXRlIG91dCB0aGUgbmV3IGhhc2ggdG8gdGhlIGRldmljZSAqLwotCXBtX2NzciA9IHJlYWRsKCZldGRldi0+cmVncy0+Z2xvYmFsLnBtX2Nzcik7Ci0JaWYgKChwbV9jc3IgJiBFVF9QTV9QSFlfU1dfQ09NQSkgPT0gMCkgewotCQl3cml0ZWwoaGFzaDEsICZyeG1hYy0+bXVsdGlfaGFzaDEpOwotCQl3cml0ZWwoaGFzaDIsICZyeG1hYy0+bXVsdGlfaGFzaDIpOwotCQl3cml0ZWwoaGFzaDMsICZyeG1hYy0+bXVsdGlfaGFzaDMpOwotCQl3cml0ZWwoaGFzaDQsICZyeG1hYy0+bXVsdGlfaGFzaDQpOwotCX0KLX0KLQotdm9pZCBTZXR1cERldmljZUZvclVuaWNhc3Qoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKLQlzdHJ1Y3QgcnhtYWNfcmVncyBfX2lvbWVtICpyeG1hYyA9ICZldGRldi0+cmVncy0+cnhtYWM7Ci0JdTMyIHVuaV9wZjE7Ci0JdTMyIHVuaV9wZjI7Ci0JdTMyIHVuaV9wZjM7Ci0JdTMyIHBtX2NzcjsKLQotCS8qIFNldCB1cCB1bmljYXN0IHBhY2tldCBmaWx0ZXIgcmVnIDMgdG8gYmUgdGhlIGZpcnN0IHR3byBvY3RldHMgb2YKLQkgKiB0aGUgTUFDIGFkZHJlc3MgZm9yIGJvdGggYWRkcmVzcwotCSAqCi0JICogU2V0IHVwIHVuaWNhc3QgcGFja2V0IGZpbHRlciByZWcgMiB0byBiZSB0aGUgb2N0ZXRzIDIgLSA1IG9mIHRoZQotCSAqIE1BQyBhZGRyZXNzIGZvciBzZWNvbmQgYWRkcmVzcwotCSAqCi0JICogU2V0IHVwIHVuaWNhc3QgcGFja2V0IGZpbHRlciByZWcgMyB0byBiZSB0aGUgb2N0ZXRzIDIgLSA1IG9mIHRoZQotCSAqIE1BQyBhZGRyZXNzIGZvciBmaXJzdCBhZGRyZXNzCi0JICovCi0JdW5pX3BmMyA9IChldGRldi0+YWRkclswXSA8PCBFVF9VTklfUEZfQUREUjJfMV9TSElGVCkgfAotCQkgIChldGRldi0+YWRkclsxXSA8PCBFVF9VTklfUEZfQUREUjJfMl9TSElGVCkgfAotCQkgIChldGRldi0+YWRkclswXSA8PCBFVF9VTklfUEZfQUREUjFfMV9TSElGVCkgfAotCQkgICBldGRldi0+YWRkclsxXTsKLQotCXVuaV9wZjIgPSAoZXRkZXYtPmFkZHJbMl0gPDwgRVRfVU5JX1BGX0FERFIyXzNfU0hJRlQpIHwKLQkJICAoZXRkZXYtPmFkZHJbM10gPDwgRVRfVU5JX1BGX0FERFIyXzRfU0hJRlQpIHwKLQkJICAoZXRkZXYtPmFkZHJbNF0gPDwgRVRfVU5JX1BGX0FERFIyXzVfU0hJRlQpIHwKLQkJICAgZXRkZXYtPmFkZHJbNV07Ci0KLQl1bmlfcGYxID0gKGV0ZGV2LT5hZGRyWzJdIDw8IEVUX1VOSV9QRl9BRERSMV8zX1NISUZUKSB8Ci0JCSAgKGV0ZGV2LT5hZGRyWzNdIDw8IEVUX1VOSV9QRl9BRERSMV80X1NISUZUKSB8Ci0JCSAgKGV0ZGV2LT5hZGRyWzRdIDw8IEVUX1VOSV9QRl9BRERSMV81X1NISUZUKSB8Ci0JCSAgIGV0ZGV2LT5hZGRyWzVdOwotCi0JcG1fY3NyID0gcmVhZGwoJmV0ZGV2LT5yZWdzLT5nbG9iYWwucG1fY3NyKTsKLQlpZiAoKHBtX2NzciAmIEVUX1BNX1BIWV9TV19DT01BKSA9PSAwKSB7Ci0JCXdyaXRlbCh1bmlfcGYxLCAmcnhtYWMtPnVuaV9wZl9hZGRyMSk7Ci0JCXdyaXRlbCh1bmlfcGYyLCAmcnhtYWMtPnVuaV9wZl9hZGRyMik7Ci0JCXdyaXRlbCh1bmlfcGYzLCAmcnhtYWMtPnVuaV9wZl9hZGRyMyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfcGh5LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9waHkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjYjdmYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9waHkuYworKysgL2Rldi9udWxsCkBAIC0xLDk3OSArMCwwIEBACi0vKgotICogQWdlcmUgU3lzdGVtcyBJbmMuCi0gKiAxMC8xMDAvMTAwMCBCYXNlLVQgRXRoZXJuZXQgRHJpdmVyIGZvciB0aGUgRVQxMzAxIGFuZCBFVDEzMXggc2VyaWVzIE1BQ3MKLSAqCi0gKiBDb3B5cmlnaHQgKiAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIGV0MTMxMF9waHkuYyAtIFJvdXRpbmVzIGZvciBjb25maWd1cmluZyBhbmQgYWNjZXNzaW5nIHRoZSBQSFkKLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIFNPRlRXQVJFIExJQ0VOU0UKLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKLSAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKLSAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KLSAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KLSAqCi0gKiBDb3B5cmlnaHQgKiAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICoKLSAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCi0gKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwotICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCi0gKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBEaXNjbGFpbWVyCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCi0gKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCi0gKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgotICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLSAqIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImV0MTMxeF92ZXJzaW9uLmgiCi0jaW5jbHVkZSAiZXQxMzF4X2RlZnMuaCIKLQotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KLQotI2luY2x1ZGUgImV0MTMxMF9waHkuaCIKLQotI2luY2x1ZGUgImV0MTMxeF9hZGFwdGVyLmgiCi0KLSNpbmNsdWRlICJldDEzMTBfYWRkcmVzc19tYXAuaCIKLSNpbmNsdWRlICJldDEzMTBfdHguaCIKLSNpbmNsdWRlICJldDEzMTBfcnguaCIKLQotI2luY2x1ZGUgImV0MTMxeC5oIgotCi0vKiBQcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgd2l0aCBsb2NhbCBzY29wZSAqLwotc3RhdGljIHZvaWQgZXQxMzF4X3hjdnJfaW5pdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KTsKLQotLyoqCi0gKiBQaHlNaVJlYWQgLSBSZWFkIGZyb20gdGhlIFBIWSB0aHJvdWdoIHRoZSBNSUkgSW50ZXJmYWNlIG9uIHRoZSBNQUMKLSAqIEBldGRldjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQotICogQHhjdnJBZGRyOiB0aGUgYWRkcmVzcyBvZiB0aGUgdHJhbnNjZWl2ZXIKLSAqIEB4Y3ZyUmVnOiB0aGUgcmVnaXN0ZXIgdG8gcmVhZAotICogQHZhbHVlOiBwb2ludGVyIHRvIGEgMTYtYml0IHZhbHVlIGluIHdoaWNoIHRoZSB2YWx1ZSB3aWxsIGJlIHN0b3JlZAotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpCi0gKi8KLWludCBQaHlNaVJlYWQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgdTggeGN2ckFkZHIsCi0JICAgICAgdTggeGN2clJlZywgdTE2ICp2YWx1ZSkKLXsKLQlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqbWFjID0gJmV0ZGV2LT5yZWdzLT5tYWM7Ci0JaW50IHN0YXR1cyA9IDA7Ci0JdTMyIGRlbGF5OwotCXUzMiBtaWlBZGRyOwotCXUzMiBtaWlDbWQ7Ci0JdTMyIG1paUluZGljYXRvcjsKLQotCS8qIFNhdmUgYSBsb2NhbCBjb3B5IG9mIHRoZSByZWdpc3RlcnMgd2UgYXJlIGRlYWxpbmcgd2l0aCBzbyB3ZSBjYW4KLQkgKiBzZXQgdGhlbSBiYWNrCi0JICovCi0JbWlpQWRkciA9IHJlYWRsKCZtYWMtPm1paV9tZ210X2FkZHIpOwotCW1paUNtZCA9IHJlYWRsKCZtYWMtPm1paV9tZ210X2NtZCk7Ci0KLQkvKiBTdG9wIHRoZSBjdXJyZW50IG9wZXJhdGlvbiAqLwotCXdyaXRlbCgwLCAmbWFjLT5taWlfbWdtdF9jbWQpOwotCi0JLyogU2V0IHVwIHRoZSByZWdpc3RlciB3ZSBuZWVkIHRvIHJlYWQgZnJvbSBvbiB0aGUgY29ycmVjdCBQSFkgKi8KLQl3cml0ZWwoTUlJX0FERFIoeGN2ckFkZHIsIHhjdnJSZWcpLCAmbWFjLT5taWlfbWdtdF9hZGRyKTsKLQotCS8qIEtpY2sgdGhlIHJlYWQgY3ljbGUgb2ZmICovCi0JZGVsYXkgPSAwOwotCi0Jd3JpdGVsKDB4MSwgJm1hYy0+bWlpX21nbXRfY21kKTsKLQotCWRvIHsKLQkJdWRlbGF5KDUwKTsKLQkJZGVsYXkrKzsKLQkJbWlpSW5kaWNhdG9yID0gcmVhZGwoJm1hYy0+bWlpX21nbXRfaW5kaWNhdG9yKTsKLQl9IHdoaWxlICgobWlpSW5kaWNhdG9yICYgTUdNVF9XQUlUKSAmJiBkZWxheSA8IDUwKTsKLQotCS8qIElmIHdlIGhpdCB0aGUgbWF4IGRlbGF5LCB3ZSBjb3VsZCBub3QgcmVhZCB0aGUgcmVnaXN0ZXIgKi8KLQlpZiAoZGVsYXkgPT0gNTApIHsKLQkJZGV2X3dhcm4oJmV0ZGV2LT5wZGV2LT5kZXYsCi0JCQkgICAgInhjdnJSZWcgMHglMDh4IGNvdWxkIG5vdCBiZSByZWFkXG4iLCB4Y3ZyUmVnKTsKLQkJZGV2X3dhcm4oJmV0ZGV2LT5wZGV2LT5kZXYsICJzdGF0dXMgaXMgIDB4JTA4eFxuIiwKLQkJCSAgICBtaWlJbmRpY2F0b3IpOwotCi0JCXN0YXR1cyA9IC1FSU87Ci0JfQotCi0JLyogSWYgd2UgaGl0IGhlcmUgd2Ugd2VyZSBhYmxlIHRvIHJlYWQgdGhlIHJlZ2lzdGVyIGFuZCB3ZSBuZWVkIHRvCi0JICogcmV0dXJuIHRoZSB2YWx1ZSB0byB0aGUgY2FsbGVyICovCi0JKnZhbHVlID0gcmVhZGwoJm1hYy0+bWlpX21nbXRfc3RhdCkgJiAweEZGRkY7Ci0KLQkvKiBTdG9wIHRoZSByZWFkIG9wZXJhdGlvbiAqLwotCXdyaXRlbCgwLCAmbWFjLT5taWlfbWdtdF9jbWQpOwotCi0JLyogc2V0IHRoZSByZWdpc3RlcnMgd2UgdG91Y2hlZCBiYWNrIHRvIHRoZSBzdGF0ZSBhdCB3aGljaCB3ZSBlbnRlcmVkCi0JICogdGhpcyBmdW5jdGlvbgotCSAqLwotCXdyaXRlbChtaWlBZGRyLCAmbWFjLT5taWlfbWdtdF9hZGRyKTsKLQl3cml0ZWwobWlpQ21kLCAmbWFjLT5taWlfbWdtdF9jbWQpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqCi0gKiBNaVdyaXRlIC0gV3JpdGUgdG8gYSBQSFkgcmVnaXN0ZXIgdGhyb3VnaCB0aGUgTUlJIGludGVyZmFjZSBvZiB0aGUgTUFDCi0gKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqIEB4Y3ZyUmVnOiB0aGUgcmVnaXN0ZXIgdG8gcmVhZAotICogQHZhbHVlOiAxNi1iaXQgdmFsdWUgdG8gd3JpdGUKLSAqCi0gKiBGSVhNRTogb25lIGNhbGxlciBpbiBuZXRkZXYgc3RpbGwKLSAqCi0gKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpCi0gKi8KLWludCBNaVdyaXRlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIHU4IHhjdnJSZWcsIHUxNiB2YWx1ZSkKLXsKLQlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqbWFjID0gJmV0ZGV2LT5yZWdzLT5tYWM7Ci0JaW50IHN0YXR1cyA9IDA7Ci0JdTggeGN2ckFkZHIgPSBldGRldi0+c3RhdHMueGN2cl9hZGRyOwotCXUzMiBkZWxheTsKLQl1MzIgbWlpQWRkcjsKLQl1MzIgbWlpQ21kOwotCXUzMiBtaWlJbmRpY2F0b3I7Ci0KLQkvKiBTYXZlIGEgbG9jYWwgY29weSBvZiB0aGUgcmVnaXN0ZXJzIHdlIGFyZSBkZWFsaW5nIHdpdGggc28gd2UgY2FuCi0JICogc2V0IHRoZW0gYmFjawotCSAqLwotCW1paUFkZHIgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9hZGRyKTsKLQltaWlDbWQgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9jbWQpOwotCi0JLyogU3RvcCB0aGUgY3VycmVudCBvcGVyYXRpb24gKi8KLQl3cml0ZWwoMCwgJm1hYy0+bWlpX21nbXRfY21kKTsKLQotCS8qIFNldCB1cCB0aGUgcmVnaXN0ZXIgd2UgbmVlZCB0byB3cml0ZSB0byBvbiB0aGUgY29ycmVjdCBQSFkgKi8KLQl3cml0ZWwoTUlJX0FERFIoeGN2ckFkZHIsIHhjdnJSZWcpLCAmbWFjLT5taWlfbWdtdF9hZGRyKTsKLQotCS8qIEFkZCB0aGUgdmFsdWUgdG8gd3JpdGUgdG8gdGhlIHJlZ2lzdGVycyB0byB0aGUgbWFjICovCi0Jd3JpdGVsKHZhbHVlLCAmbWFjLT5taWlfbWdtdF9jdHJsKTsKLQlkZWxheSA9IDA7Ci0KLQlkbyB7Ci0JCXVkZWxheSg1MCk7Ci0JCWRlbGF5Kys7Ci0JCW1paUluZGljYXRvciA9IHJlYWRsKCZtYWMtPm1paV9tZ210X2luZGljYXRvcik7Ci0JfSB3aGlsZSAoKG1paUluZGljYXRvciAmIE1HTVRfQlVTWSkgJiYgZGVsYXkgPCAxMDApOwotCi0JLyogSWYgd2UgaGl0IHRoZSBtYXggZGVsYXksIHdlIGNvdWxkIG5vdCB3cml0ZSB0aGUgcmVnaXN0ZXIgKi8KLQlpZiAoZGVsYXkgPT0gMTAwKSB7Ci0JCXUxNiBUZW1wVmFsdWU7Ci0KLQkJZGV2X3dhcm4oJmV0ZGV2LT5wZGV2LT5kZXYsCi0JCSAgICAieGN2clJlZyAweCUwOHggY291bGQgbm90IGJlIHdyaXR0ZW4iLCB4Y3ZyUmVnKTsKLQkJZGV2X3dhcm4oJmV0ZGV2LT5wZGV2LT5kZXYsICJzdGF0dXMgaXMgIDB4JTA4eFxuIiwKLQkJCSAgICBtaWlJbmRpY2F0b3IpOwotCQlkZXZfd2FybigmZXRkZXYtPnBkZXYtPmRldiwgImNvbW1hbmQgaXMgIDB4JTA4eFxuIiwKLQkJCSAgICByZWFkbCgmbWFjLT5taWlfbWdtdF9jbWQpKTsKLQotCQlNaVJlYWQoZXRkZXYsIHhjdnJSZWcsICZUZW1wVmFsdWUpOwotCi0JCXN0YXR1cyA9IC1FSU87Ci0JfQotCS8qIFN0b3AgdGhlIHdyaXRlIG9wZXJhdGlvbiAqLwotCXdyaXRlbCgwLCAmbWFjLT5taWlfbWdtdF9jbWQpOwotCi0JLyogc2V0IHRoZSByZWdpc3RlcnMgd2UgdG91Y2hlZCBiYWNrIHRvIHRoZSBzdGF0ZSBhdCB3aGljaCB3ZSBlbnRlcmVkCi0JICogdGhpcyBmdW5jdGlvbgotCSAqLwotCXdyaXRlbChtaWlBZGRyLCAmbWFjLT5taWlfbWdtdF9hZGRyKTsKLQl3cml0ZWwobWlpQ21kLCAmbWFjLT5taWlfbWdtdF9jbWQpOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqCi0gKiBldDEzMXhfeGN2cl9maW5kIC0gRmluZCB0aGUgUEhZIElECi0gKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKQotICovCi1pbnQgZXQxMzF4X3hjdnJfZmluZChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCXU4IHhjdnJfYWRkcjsKLQl1MTYgaWRyMTsKLQl1MTYgaWRyMjsKLQl1MzIgeGN2cl9pZDsKLQotCS8qIFdlIG5lZWQgdG8gZ2V0IHhjdnIgaWQgYW5kIGFkZHJlc3Mgd2UganVzdCBnZXQgdGhlIGZpcnN0IG9uZSAqLwotCWZvciAoeGN2cl9hZGRyID0gMDsgeGN2cl9hZGRyIDwgMzI7IHhjdnJfYWRkcisrKSB7Ci0JCS8qIFJlYWQgdGhlIElEIGZyb20gdGhlIFBIWSAqLwotCQlQaHlNaVJlYWQoZXRkZXYsIHhjdnJfYWRkciwKLQkJCSAgKHU4KSBvZmZzZXRvZihzdHJ1Y3QgbWlfcmVncywgaWRyMSksCi0JCQkgICZpZHIxKTsKLQkJUGh5TWlSZWFkKGV0ZGV2LCB4Y3ZyX2FkZHIsCi0JCQkgICh1OCkgb2Zmc2V0b2Yoc3RydWN0IG1pX3JlZ3MsIGlkcjIpLAotCQkJICAmaWRyMik7Ci0KLQkJeGN2cl9pZCA9ICh1MzIpICgoaWRyMSA8PCAxNikgfCBpZHIyKTsKLQotCQlpZiAoaWRyMSAhPSAwICYmIGlkcjEgIT0gMHhmZmZmKSB7Ci0JCQlldGRldi0+c3RhdHMueGN2cl9pZCA9IHhjdnJfaWQ7Ci0JCQlldGRldi0+c3RhdHMueGN2cl9hZGRyID0geGN2cl9hZGRyOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXZvaWQgRVQxMzEwX1BoeVJlc2V0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCi17Ci0JTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIDB4ODAwMCk7Ci19Ci0KLS8qKgotICoJRVQxMzEwX1BoeVBvd2VyRG93bgktCVBIWSBwb3dlciBjb250cm9sCi0gKglAZXRkZXY6IGRldmljZSB0byBjb250cm9sCi0gKglAZG93bjogdHJ1ZSBmb3Igb2ZmL2ZhbHNlIGZvciBiYWNrIG9uCi0gKgotICoJb25lIGh1bmRyZWQsIHRlbiwgb25lIHRob3VzYW5kIG1lZ3MKLSAqCUhvdyB3b3VsZCB5b3UgbGlrZSB0byBoYXZlIHlvdXIgTEFOIGFjY2Vzc2VkCi0gKglDYW4ndCB5b3Ugc2VlIHRoYXQgdGhpcyBjb2RlIHByb2Nlc3NlZAotICoJUGh5IHBvd2VyLCBwaHkgcG93ZXIuLgotICovCi0KLXZvaWQgRVQxMzEwX1BoeVBvd2VyRG93bihzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCBib29sIGRvd24pCi17Ci0JdTE2IGRhdGE7Ci0KLQlNaVJlYWQoZXRkZXYsIFBIWV9DT05UUk9MLCAmZGF0YSk7Ci0JZGF0YSAmPSB+MHgwODAwOwkvKiBQb3dlciBVUCAqLwotCWlmIChkb3duKSAvKiBQb3dlciBET1dOICovCi0JCWRhdGEgfD0gMHgwODAwOwotCU1pV3JpdGUoZXRkZXYsIFBIWV9DT05UUk9MLCBkYXRhKTsKLX0KLQotLyoqCi0gKglFVDEzMF9QaHlBdXRvTkVnCS0JYXV0b25lZ290aWF0ZSBjb250cm9sCi0gKglAZXRkZXY6IGRldmljZSB0byBjb250cm9sCi0gKglAZW5hYmU6IGF1dG9uZWcgb24vb2ZmCi0gKgotICoJU2V0IHVwIHRoZSBhdXRvbmVnb3RpYXRpb24gc3RhdGUgYWNjb3JkaW5nIHRvIHdoZXRoZXIgd2Ugd2lsbCBiZQotICoJbmVnb3RpYXRpbmcgdGhlIHN0YXRlIG9yIGZvcmNpbmcgYSBzcGVlZC4KLSAqLwotCi1zdGF0aWMgdm9pZCBFVDEzMTBfUGh5QXV0b05lZyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCBib29sIGVuYWJsZSkKLXsKLQl1MTYgZGF0YTsKLQotCU1pUmVhZChldGRldiwgUEhZX0NPTlRST0wsICZkYXRhKTsKLQlkYXRhICY9IH4weDEwMDA7CS8qIEF1dG9uZWdvdGlhdGlvbiBPRkYgKi8KLQlpZiAoZW5hYmxlKQotCQlkYXRhIHw9IDB4MTAwMDsJCS8qIEF1dG9uZWdvdGlhdGlvbiBPTiAqLwotCU1pV3JpdGUoZXRkZXYsIFBIWV9DT05UUk9MLCBkYXRhKTsKLX0KLQotLyoqCi0gKglFVDEzMF9QaHlEdXBsZXhNb2RlCS0JZHVwbGV4IGNvbnRyb2wKLSAqCUBldGRldjogZGV2aWNlIHRvIGNvbnRyb2wKLSAqCUBkdXBsZXg6IGR1cGxleCBvbi9vZmYKLSAqCi0gKglTZXQgdXAgdGhlIGR1cGxleCBzdGF0ZSBvbiB0aGUgUEhZCi0gKi8KLQotc3RhdGljIHZvaWQgRVQxMzEwX1BoeUR1cGxleE1vZGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgdTE2IGR1cGxleCkKLXsKLQl1MTYgZGF0YTsKLQotCU1pUmVhZChldGRldiwgUEhZX0NPTlRST0wsICZkYXRhKTsKLQlkYXRhICY9IH4weDEwMDsJCS8qIFNldCBIYWxmIER1cGxleCAqLwotCWlmIChkdXBsZXggPT0gVFJVRVBIWV9EVVBMRVhfRlVMTCkKLQkJZGF0YSB8PSAweDEwMDsJLyogU2V0IEZ1bGwgRHVwbGV4ICovCi0JTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIGRhdGEpOwotfQotCi0vKioKLSAqCUVUMTMwX1BoeVNwZWVkU2VsZWN0CS0Jc3BlZWQgY29udHJvbAotICoJQGV0ZGV2OiBkZXZpY2UgdG8gY29udHJvbAotICoJQGR1cGxleDogZHVwbGV4IG9uL29mZgotICoKLSAqCVNldCB0aGUgc3BlZWQgb2Ygb3VyIFBIWS4KLSAqLwotCi1zdGF0aWMgdm9pZCBFVDEzMTBfUGh5U3BlZWRTZWxlY3Qoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwgdTE2IHNwZWVkKQotewotCXUxNiBkYXRhOwotCXN0YXRpYyBjb25zdCB1MTYgYml0c1szXSA9IHsweDAwMDAsIDB4MjAwMCwgMHgwMDQwfTsKLQotCS8qIFJlYWQgdGhlIFBIWSBjb250cm9sIHJlZ2lzdGVyICovCi0JTWlSZWFkKGV0ZGV2LCBQSFlfQ09OVFJPTCwgJmRhdGEpOwotCS8qIENsZWFyIGFsbCBTcGVlZCBzZXR0aW5ncyAoQml0cyA2LCAxMykgKi8KLQlkYXRhICY9IH4weDIwNDA7Ci0JLyogV3JpdGUgYmFjayB0aGUgbmV3IHNwZWVkICovCi0JTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIGRhdGEgfCBiaXRzW3NwZWVkXSk7Ci19Ci0KLS8qKgotICoJRVQxMzEwX1BoeUxpbmtTdGF0dXMJLQlyZWFkIGxpbmsgc3RhdGUKLSAqCUBldGRldjogZGV2aWNlIHRvIHJlYWQKLSAqCUBsaW5rX3N0YXR1czogcmVwb3J0ZWQgbGluayBzdGF0ZQotICoJQGF1dG9uZWc6IHJlcG9ydGVkIGF1dG9uZWdvdGlhdGlvbiBzdGF0ZSAoY29tcGxldGUvaW5jb21wbGV0ZS9kaXNhYmxlZCkKLSAqCUBsaW5rc3BlZWQ6IHJldHVybmVkbGluayBzcGVlZCBpbiB1c2UKLSAqCUBkdXBsZXhfbW9kZTogcmVwb3J0ZWQgaGFsZi9mdWxsIGR1cGxleCBzdGF0ZQotICoJQG1kaV9tZGl4OiBub3QgeWV0IHdvcmtpbmcKLSAqCUBtYXN0ZXJzbGF2ZTogcmVwb3J0IHdoZXRoZXIgd2UgYXJlIG1hc3RlciBvciBzbGF2ZQotICoJQHBvbGFyaXR5OiBsaW5rIHBvbGFyaXR5Ci0gKgotICoJSSBjYW4gcmVhZCB5b3VyIGxhbiBsaWtlIGEgbWFnYXppbmUKLSAqCUkgc2VlIGlmIHlvdXIgdXAKLSAqCUkga25vdyB5b3VyIGxpbmsgc3BlZWQKLSAqCUkgc2VlIGFsbCB0aGUgc2V0dGluZyB0aGF0IHlvdSdkIHJhdGhlciBrZWVwCi0gKi8KLQotc3RhdGljIHZvaWQgRVQxMzEwX1BoeUxpbmtTdGF0dXMoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwKLQkJCSAgdTggKmxpbmtfc3RhdHVzLAotCQkJICB1MzIgKmF1dG9uZWcsCi0JCQkgIHUzMiAqbGlua3NwZWVkLAotCQkJICB1MzIgKmR1cGxleF9tb2RlLAotCQkJICB1MzIgKm1kaV9tZGl4LAotCQkJICB1MzIgKm1hc3RlcnNsYXZlLCB1MzIgKnBvbGFyaXR5KQotewotCXUxNiBtaXN0YXR1cyA9IDA7Ci0JdTE2IGlzMTAwMEJhc2VUID0gMDsKLQl1MTYgdm1pX3BoeXN0YXR1cyA9IDA7Ci0JdTE2IGNvbnRyb2wgPSAwOwotCi0JTWlSZWFkKGV0ZGV2LCBQSFlfU1RBVFVTLCAmbWlzdGF0dXMpOwotCU1pUmVhZChldGRldiwgUEhZXzEwMDBfU1RBVFVTLCAmaXMxMDAwQmFzZVQpOwotCU1pUmVhZChldGRldiwgUEhZX1BIWV9TVEFUVVMsICZ2bWlfcGh5c3RhdHVzKTsKLQlNaVJlYWQoZXRkZXYsIFBIWV9DT05UUk9MLCAmY29udHJvbCk7Ci0KLQkqbGlua19zdGF0dXMgPSAodm1pX3BoeXN0YXR1cyAmIDB4MDA0MCkgPyAxIDogMDsKLQkqYXV0b25lZyA9IChjb250cm9sICYgMHgxMDAwKSA/ICgodm1pX3BoeXN0YXR1cyAmIDB4MDAyMCkgPwotCQkJCQkgICAgVFJVRVBIWV9BTkVHX0NPTVBMRVRFIDoKLQkJCQkJICAgIFRSVUVQSFlfQU5FR19OT1RfQ09NUExFVEUpIDoKLQkJICAgIFRSVUVQSFlfQU5FR19ESVNBQkxFRDsKLQkqbGlua3NwZWVkID0gKHZtaV9waHlzdGF0dXMgJiAweDAzMDApID4+IDg7Ci0JKmR1cGxleF9tb2RlID0gKHZtaV9waHlzdGF0dXMgJiAweDAwODApID4+IDc7Ci0JLyogTk9URTogTmVlZCB0byBjb21wbGV0ZSB0aGlzICovCi0JKm1kaV9tZGl4ID0gMDsKLQotCSptYXN0ZXJzbGF2ZSA9IChpczEwMDBCYXNlVCAmIDB4NDAwMCkgPwotCQkJVFJVRVBIWV9DRkdfTUFTVEVSIDogVFJVRVBIWV9DRkdfU0xBVkU7Ci0JKnBvbGFyaXR5ID0gKHZtaV9waHlzdGF0dXMgJiAweDA0MDApID8KLQkJCVRSVUVQSFlfUE9MQVJJVFlfSU5WRVJURUQgOiBUUlVFUEhZX1BPTEFSSVRZX05PUk1BTDsKLX0KLQotc3RhdGljIHZvaWQgRVQxMzEwX1BoeUFuZE9yUmVnKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsCi0JCQl1MTYgcmVnbnVtLCB1MTYgYW5kTWFzaywgdTE2IG9yTWFzaykKLXsKLQl1MTYgcmVnOwotCi0JTWlSZWFkKGV0ZGV2LCByZWdudW0sICZyZWcpOwotCXJlZyAmPSBhbmRNYXNrOwotCXJlZyB8PSBvck1hc2s7Ci0JTWlXcml0ZShldGRldiwgcmVnbnVtLCByZWcpOwotfQotCi0vKiBTdGlsbCB1c2VkIGZyb20gX21hYyAgZm9yIEJJVF9SRUFEICovCi12b2lkIEVUMTMxMF9QaHlBY2Nlc3NNaUJpdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCB1MTYgYWN0aW9uLAotCQkJICAgdTE2IHJlZ251bSwgdTE2IGJpdG51bSwgdTggKnZhbHVlKQotewotCXUxNiByZWc7Ci0JdTE2IG1hc2sgPSAweDAwMDEgPDwgYml0bnVtOwotCi0JLyogUmVhZCB0aGUgcmVxdWVzdGVkIHJlZ2lzdGVyICovCi0JTWlSZWFkKGV0ZGV2LCByZWdudW0sICZyZWcpOwotCi0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIFRSVUVQSFlfQklUX1JFQUQ6Ci0JCSp2YWx1ZSA9IChyZWcgJiBtYXNrKSA+PiBiaXRudW07Ci0JCWJyZWFrOwotCi0JY2FzZSBUUlVFUEhZX0JJVF9TRVQ6Ci0JCU1pV3JpdGUoZXRkZXYsIHJlZ251bSwgcmVnIHwgbWFzayk7Ci0JCWJyZWFrOwotCi0JY2FzZSBUUlVFUEhZX0JJVF9DTEVBUjoKLQkJTWlXcml0ZShldGRldiwgcmVnbnVtLCByZWcgJiB+bWFzayk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotfQotCi12b2lkIEVUMTMxMF9QaHlBZHZlcnRpc2UxMDAwQmFzZVQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwKLQkJCQkgIHUxNiBkdXBsZXgpCi17Ci0JdTE2IGRhdGE7Ci0KLQkvKiBSZWFkIHRoZSBQSFkgMTAwMCBCYXNlLVQgQ29udHJvbCBSZWdpc3RlciAqLwotCU1pUmVhZChldGRldiwgUEhZXzEwMDBfQ09OVFJPTCwgJmRhdGEpOwotCi0JLyogQ2xlYXIgQml0cyA4LDkgKi8KLQlkYXRhICY9IH4weDAzMDA7Ci0KLQlzd2l0Y2ggKGR1cGxleCkgewotCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkU6Ci0JCS8qIER1cGxleCBhbHJlYWR5IGNsZWFyZWQsIGRvIG5vdGhpbmcgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9GVUxMOgotCQkvKiBTZXQgQml0IDkgKi8KLQkJZGF0YSB8PSAweDAyMDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfSEFMRjoKLQkJLyogU2V0IEJpdCA4ICovCi0JCWRhdGEgfD0gMHgwMTAwOwotCQlicmVhazsKLQotCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX0JPVEg6Ci0JZGVmYXVsdDoKLQkJZGF0YSB8PSAweDAzMDA7Ci0JCWJyZWFrOwotCX0KLQotCS8qIFdyaXRlIGJhY2sgYWR2ZXJ0aXNlbWVudCAqLwotCU1pV3JpdGUoZXRkZXYsIFBIWV8xMDAwX0NPTlRST0wsIGRhdGEpOwotfQotCi1zdGF0aWMgdm9pZCBFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwQmFzZVQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwKLQkJCQkgdTE2IGR1cGxleCkKLXsKLQl1MTYgZGF0YTsKLQotCS8qIFJlYWQgdGhlIEF1dG9uZWdvdGlhdGlvbiBSZWdpc3RlciAoMTAvMTAwKSAqLwotCU1pUmVhZChldGRldiwgUEhZX0FVVE9fQURWRVJUSVNFTUVOVCwgJmRhdGEpOwotCi0JLyogQ2xlYXIgYml0cyA3LDggKi8KLQlkYXRhICY9IH4weDAxODA7Ci0KLQlzd2l0Y2ggKGR1cGxleCkgewotCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkU6Ci0JCS8qIER1cGxleCBhbHJlYWR5IGNsZWFyZWQsIGRvIG5vdGhpbmcgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9GVUxMOgotCQkvKiBTZXQgQml0IDggKi8KLQkJZGF0YSB8PSAweDAxMDA7Ci0JCWJyZWFrOwotCi0JY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfSEFMRjoKLQkJLyogU2V0IEJpdCA3ICovCi0JCWRhdGEgfD0gMHgwMDgwOwotCQlicmVhazsKLQotCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX0JPVEg6Ci0JZGVmYXVsdDoKLQkJLyogU2V0IEJpdHMgNyw4ICovCi0JCWRhdGEgfD0gMHgwMTgwOwotCQlicmVhazsKLQl9Ci0KLQkvKiBXcml0ZSBiYWNrIGFkdmVydGlzZW1lbnQgKi8KLQlNaVdyaXRlKGV0ZGV2LCBQSFlfQVVUT19BRFZFUlRJU0VNRU5ULCBkYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgRVQxMzEwX1BoeUFkdmVydGlzZTEwQmFzZVQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiwKLQkJCQl1MTYgZHVwbGV4KQotewotCXUxNiBkYXRhOwotCi0JLyogUmVhZCB0aGUgQXV0b25lZ290aWF0aW9uIFJlZ2lzdGVyICgxMC8xMDApICovCi0JTWlSZWFkKGV0ZGV2LCBQSFlfQVVUT19BRFZFUlRJU0VNRU5ULCAmZGF0YSk7Ci0KLQkvKiBDbGVhciBiaXRzIDUsNiAqLwotCWRhdGEgJj0gfjB4MDA2MDsKLQotCXN3aXRjaCAoZHVwbGV4KSB7Ci0JY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORToKLQkJLyogRHVwbGV4IGFscmVhZHkgY2xlYXJlZCwgZG8gbm90aGluZyAqLwotCQlicmVhazsKLQotCWNhc2UgVFJVRVBIWV9BRFZfRFVQTEVYX0ZVTEw6Ci0JCS8qIFNldCBCaXQgNiAqLwotCQlkYXRhIHw9IDB4MDA0MDsKLQkJYnJlYWs7Ci0KLQljYXNlIFRSVUVQSFlfQURWX0RVUExFWF9IQUxGOgotCQkvKiBTZXQgQml0IDUgKi8KLQkJZGF0YSB8PSAweDAwMjA7Ci0JCWJyZWFrOwotCi0JY2FzZSBUUlVFUEhZX0FEVl9EVVBMRVhfQk9USDoKLQlkZWZhdWx0OgotCQkvKiBTZXQgQml0cyA1LDYgKi8KLQkJZGF0YSB8PSAweDAwNjA7Ci0JCWJyZWFrOwotCX0KLQotCS8qIFdyaXRlIGJhY2sgYWR2ZXJ0aXNlbWVudCAqLwotCU1pV3JpdGUoZXRkZXYsIFBIWV9BVVRPX0FEVkVSVElTRU1FTlQsIGRhdGEpOwotfQotCi0vKioKLSAqIGV0MTMxeF9zZXRwaHlfbm9ybWFsIC0gU2V0IFBIWSBmb3Igbm9ybWFsIG9wZXJhdGlvbi4KLSAqIEBldGRldjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQotICoKLSAqIFVzZWQgYnkgUG93ZXIgTWFuYWdlbWVudCB0byBmb3JjZSB0aGUgUEhZIGludG8gMTAgQmFzZSBUIGhhbGYtZHVwbGV4IG1vZGUsCi0gKiB3aGVuIGdvaW5nIHRvIEQzIGluIFdPTCBtb2RlLiBBbHNvIHVzZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uIHRvIHNldCB0aGUKLSAqIFBIWSBmb3Igbm9ybWFsIG9wZXJhdGlvbi4KLSAqLwotdm9pZCBldDEzMXhfc2V0cGh5X25vcm1hbChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCS8qIE1ha2Ugc3VyZSB0aGUgUEhZIGlzIHBvd2VyZWQgdXAgKi8KLQlFVDEzMTBfUGh5UG93ZXJEb3duKGV0ZGV2LCAwKTsKLQlldDEzMXhfeGN2cl9pbml0KGV0ZGV2KTsKLX0KLQotCi0vKioKLSAqIGV0MTMxeF94Y3ZyX2luaXQgLSBJbml0IHRoZSBwaHkgaWYgd2UgYXJlIHNldHRpbmcgaXQgaW50byBmb3JjZSBtb2RlCi0gKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqCi0gKi8KLXN0YXRpYyB2b2lkIGV0MTMxeF94Y3ZyX2luaXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKLQl1MTYgaW1yOwotCXUxNiBpc3I7Ci0JdTE2IGxjcjI7Ci0KLQkvKiBaZXJvIG91dCB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUgdmFyaWFibGUgcmVwcmVzZW50aW5nIEJNU1IgKi8KLQlldGRldi0+Ym1zciA9IDA7Ci0KLQlNaVJlYWQoZXRkZXYsICh1OCkgb2Zmc2V0b2Yoc3RydWN0IG1pX3JlZ3MsIGlzciksICZpc3IpOwotCU1pUmVhZChldGRldiwgKHU4KSBvZmZzZXRvZihzdHJ1Y3QgbWlfcmVncywgaW1yKSwgJmltcik7Ci0KLQkvKiBTZXQgdGhlIGxpbmsgc3RhdHVzIGludGVycnVwdCBvbmx5LiAgQmFkIGJlaGF2aW9yIHdoZW4gbGluayBzdGF0dXMKLQkgKiBhbmQgYXV0byBuZWcgYXJlIHNldCwgd2UgcnVuIGludG8gYSBuZXN0ZWQgaW50ZXJydXB0IHByb2JsZW0KLQkgKi8KLQlpbXIgfD0gMHgwMTA1OwotCi0JTWlXcml0ZShldGRldiwgKHU4KSBvZmZzZXRvZihzdHJ1Y3QgbWlfcmVncywgaW1yKSwgaW1yKTsKLQotCS8qIFNldCB0aGUgTEVEIGJlaGF2aW9yIHN1Y2ggdGhhdCBMRUQgMSBpbmRpY2F0ZXMgc3BlZWQgKG9mZiA9Ci0JICogMTBNYml0cywgYmxpbmsgPSAxMDBNYml0cywgb24gPSAxMDAwTWJpdHMpIGFuZCBMRUQgMiBpbmRpY2F0ZXMKLQkgKiBsaW5rIGFuZCBhY3Rpdml0eSAob24gZm9yIGxpbmssIGJsaW5rIG9mZiBmb3IgYWN0aXZpdHkpLgotCSAqCi0JICogTk9URTogU29tZSBjdXN0b21pemF0aW9ucyBoYXZlIGJlZW4gYWRkZWQgaGVyZSBmb3Igc3BlY2lmaWMKLQkgKiB2ZW5kb3JzOyBUaGUgTEVEIGJlaGF2aW9yIGlzIG5vdyBkZXRlcm1pbmVkIGJ5IHZlbmRvciBkYXRhIGluIHRoZQotCSAqIEVFUFJPTS4gSG93ZXZlciwgdGhlIGFib3ZlIGRlc2NyaXB0aW9uIGlzIHRoZSBkZWZhdWx0LgotCSAqLwotCWlmICgoZXRkZXYtPmVlcHJvbV9kYXRhWzFdICYgMHg0KSA9PSAwKSB7Ci0JCU1pUmVhZChldGRldiwgKHU4KSBvZmZzZXRvZihzdHJ1Y3QgbWlfcmVncywgbGNyMiksCi0JCSAgICAgICAmbGNyMik7Ci0KLQkJbGNyMiAmPSAweDAwRkY7Ci0JCWxjcjIgfD0gMHhBMDAwOwkvKiBsZWQgbGluayAqLwotCi0JCWlmICgoZXRkZXYtPmVlcHJvbV9kYXRhWzFdICYgMHg4KSA9PSAwKQotCQkJbGNyMiB8PSAweDAzMDA7Ci0JCWVsc2UKLQkJCWxjcjIgfD0gMHgwNDAwOwotCi0JCU1pV3JpdGUoZXRkZXYsICh1OCkgb2Zmc2V0b2Yoc3RydWN0IG1pX3JlZ3MsIGxjcjIpLAotCQkJbGNyMik7Ci0JfQotCi0JLyogRGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8gZ28gaW50byBhIGZvcmNlIG1vZGUgYW5kIHNldCBpdCAqLwotCWlmIChldGRldi0+QWlGb3JjZVNwZWVkID09IDAgJiYgZXRkZXYtPkFpRm9yY2VEcHggPT0gMCkgewotCQlpZiAoZXRkZXYtPndhbnRlZF9mbG93ID09IEZMT1dfVFhPTkxZIHx8Ci0JCSAgICBldGRldi0+d2FudGVkX2Zsb3cgPT0gRkxPV19CT1RIKQotCQkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGV0ZGV2LAotCQkJCQkgICAgICBUUlVFUEhZX0JJVF9TRVQsIDQsIDExLCBOVUxMKTsKLQkJZWxzZQotCQkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGV0ZGV2LAotCQkJCQkgICAgICBUUlVFUEhZX0JJVF9DTEVBUiwgNCwgMTEsIE5VTEwpOwotCi0JCWlmIChldGRldi0+d2FudGVkX2Zsb3cgPT0gRkxPV19CT1RIKQotCQkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGV0ZGV2LAotCQkJCQkgICAgICBUUlVFUEhZX0JJVF9TRVQsIDQsIDEwLCBOVUxMKTsKLQkJZWxzZQotCQkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGV0ZGV2LAotCQkJCQkgICAgICBUUlVFUEhZX0JJVF9DTEVBUiwgNCwgMTAsIE5VTEwpOwotCi0JCS8qIFNldCB0aGUgcGh5IHRvIGF1dG9uZWdvdGlhdGlvbiAqLwotCQlFVDEzMTBfUGh5QXV0b05lZyhldGRldiwgdHJ1ZSk7Ci0KLQkJLyogTk9URSAtIERvIHdlIG5lZWQgdGhpcz8gKi8KLQkJRVQxMzEwX1BoeUFjY2Vzc01pQml0KGV0ZGV2LCBUUlVFUEhZX0JJVF9TRVQsIDAsIDksIE5VTEwpOwotCQlyZXR1cm47Ci0JfQotCi0JRVQxMzEwX1BoeUF1dG9OZWcoZXRkZXYsIGZhbHNlKTsKLQotCS8qIFNldCB0byB0aGUgY29ycmVjdCBmb3JjZSBtb2RlLiAqLwotCWlmIChldGRldi0+QWlGb3JjZURweCAhPSAxKSB7Ci0JCWlmIChldGRldi0+d2FudGVkX2Zsb3cgPT0gRkxPV19UWE9OTFkgfHwKLQkJICAgIGV0ZGV2LT53YW50ZWRfZmxvdyA9PSBGTE9XX0JPVEgpCi0JCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoZXRkZXYsCi0JCQkJICAgICAgVFJVRVBIWV9CSVRfU0VULCA0LCAxMSwgTlVMTCk7Ci0JCWVsc2UKLQkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChldGRldiwKLQkJCQkJICAgICAgVFJVRVBIWV9CSVRfQ0xFQVIsIDQsIDExLCBOVUxMKTsKLQotCQlpZiAoZXRkZXYtPndhbnRlZF9mbG93ID09IEZMT1dfQk9USCkKLQkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChldGRldiwKLQkJCQkJICAgICAgVFJVRVBIWV9CSVRfU0VULCA0LCAxMCwgTlVMTCk7Ci0JCWVsc2UKLQkJCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChldGRldiwKLQkJCQkJICAgICAgVFJVRVBIWV9CSVRfQ0xFQVIsIDQsIDEwLCBOVUxMKTsKLQl9IGVsc2UgewotCQlFVDEzMTBfUGh5QWNjZXNzTWlCaXQoZXRkZXYsIFRSVUVQSFlfQklUX0NMRUFSLCA0LCAxMCwgTlVMTCk7Ci0JCUVUMTMxMF9QaHlBY2Nlc3NNaUJpdChldGRldiwgVFJVRVBIWV9CSVRfQ0xFQVIsIDQsIDExLCBOVUxMKTsKLQl9Ci0JRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMSk7Ci0Jc3dpdGNoIChldGRldi0+QWlGb3JjZVNwZWVkKSB7Ci0JY2FzZSAxMDoKLQkJLyogRmlyc3Qgd2UgbmVlZCB0byB0dXJuIG9mZiBhbGwgb3RoZXIgYWR2ZXJ0aXNlbWVudCAqLwotCQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0JCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDBCYXNlVChldGRldiwgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUpOwotCQlpZiAoZXRkZXYtPkFpRm9yY2VEcHggPT0gMSkgewotCQkJLyogU2V0IG91ciBhZHZlcnRpc2UgdmFsdWVzIGFjY29yZGluZ2x5ICovCi0JCQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTBCYXNlVChldGRldiwKLQkJCQkJCVRSVUVQSFlfQURWX0RVUExFWF9IQUxGKTsKLQkJfSBlbHNlIGlmIChldGRldi0+QWlGb3JjZURweCA9PSAyKSB7Ci0JCQkvKiBTZXQgb3VyIGFkdmVydGlzZSB2YWx1ZXMgYWNjb3JkaW5nbHkgKi8KLQkJCUVUMTMxMF9QaHlBZHZlcnRpc2UxMEJhc2VUKGV0ZGV2LAotCQkJCQkJVFJVRVBIWV9BRFZfRFVQTEVYX0ZVTEwpOwotCQl9IGVsc2UgewotCQkJLyogRGlzYWJsZSBhdXRvbmVnICovCi0JCQlFVDEzMTBfUGh5QXV0b05lZyhldGRldiwgZmFsc2UpOwotCQkJLyogRGlzYWJsZSByZXN0IG9mIHRoZSBhZHZlcnRpc2VtZW50cyAqLwotCQkJRVQxMzEwX1BoeUFkdmVydGlzZTEwQmFzZVQoZXRkZXYsCi0JCQkJCVRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKLQkJCS8qIEZvcmNlIDEwIE1icHMgKi8KLQkJCUVUMTMxMF9QaHlTcGVlZFNlbGVjdChldGRldiwgVFJVRVBIWV9TUEVFRF8xME1CUFMpOwotCQkJLyogRm9yY2UgRnVsbCBkdXBsZXggKi8KLQkJCUVUMTMxMF9QaHlEdXBsZXhNb2RlKGV0ZGV2LCBUUlVFUEhZX0RVUExFWF9GVUxMKTsKLQkJfQotCQlicmVhazsKLQljYXNlIDEwMDoKLQkJLyogZmlyc3Qgd2UgbmVlZCB0byB0dXJuIG9mZiBhbGwgb3RoZXIgYWR2ZXJ0aXNlbWVudCAqLwotCQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0JCUVUMTMxMF9QaHlBZHZlcnRpc2UxMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0JCWlmIChldGRldi0+QWlGb3JjZURweCA9PSAxKSB7Ci0JCQkvKiBTZXQgb3VyIGFkdmVydGlzZSB2YWx1ZXMgYWNjb3JkaW5nbHkgKi8KLQkJCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDBCYXNlVChldGRldiwKLQkJCQkJCVRSVUVQSFlfQURWX0RVUExFWF9IQUxGKTsKLQkJCS8qIFNldCBzcGVlZCAqLwotCQkJRVQxMzEwX1BoeVNwZWVkU2VsZWN0KGV0ZGV2LCBUUlVFUEhZX1NQRUVEXzEwME1CUFMpOwotCQl9IGVsc2UgaWYgKGV0ZGV2LT5BaUZvcmNlRHB4ID09IDIpIHsKLQkJCS8qIFNldCBvdXIgYWR2ZXJ0aXNlIHZhbHVlcyBhY2NvcmRpbmdseSAqLwotCQkJRVQxMzEwX1BoeUFkdmVydGlzZTEwMEJhc2VUKGV0ZGV2LAotCQkJCQkJVFJVRVBIWV9BRFZfRFVQTEVYX0ZVTEwpOwotCQl9IGVsc2UgewotCQkJLyogRGlzYWJsZSBhdXRvbmVnICovCi0JCQlFVDEzMTBfUGh5QXV0b05lZyhldGRldiwgZmFsc2UpOwotCQkJLyogRGlzYWJsZSBvdGhlciBhZHZlcnRpc2VtZW50ICovCi0JCQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwQmFzZVQoZXRkZXYsCi0JCQkJCQlUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0JCQkvKiBGb3JjZSAxMDAgTWJwcyAqLwotCQkJRVQxMzEwX1BoeVNwZWVkU2VsZWN0KGV0ZGV2LCBUUlVFUEhZX1NQRUVEXzEwME1CUFMpOwotCQkJLyogRm9yY2UgRnVsbCBkdXBsZXggKi8KLQkJCUVUMTMxMF9QaHlEdXBsZXhNb2RlKGV0ZGV2LCBUUlVFUEhZX0RVUExFWF9GVUxMKTsKLQkJfQotCQlicmVhazsKLQljYXNlIDEwMDA6Ci0JCS8qIGZpcnN0IHdlIG5lZWQgdG8gdHVybiBvZmYgYWxsIG90aGVyIGFkdmVydGlzZW1lbnQgKi8KLQkJRVQxMzEwX1BoeUFkdmVydGlzZTEwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0JCUVUMTMxMF9QaHlBZHZlcnRpc2UxMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfTk9ORSk7Ci0JCS8qIHNldCBvdXIgYWR2ZXJ0aXNlIHZhbHVlcyBhY2NvcmRpbmdseSAqLwotCQlFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwMEJhc2VUKGV0ZGV2LCBUUlVFUEhZX0FEVl9EVVBMRVhfRlVMTCk7Ci0JCWJyZWFrOwotCX0KLQlFVDEzMTBfUGh5UG93ZXJEb3duKGV0ZGV2LCAwKTsKLX0KLQotdm9pZCBldDEzMXhfTWlpX2NoZWNrKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsCi0JCSAgICAgIHUxNiBibXNyLCB1MTYgYm1zcl9pbnRzKQotewotCXU4IGxpbmtfc3RhdHVzOwotCXUzMiBhdXRvbmVnX3N0YXR1czsKLQl1MzIgc3BlZWQ7Ci0JdTMyIGR1cGxleDsKLQl1MzIgbWRpX21kaXg7Ci0JdTMyIG1hc3RlcnNsYXZlOwotCXUzMiBwb2xhcml0eTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGJtc3JfaW50cyAmIE1JX0JNU1JfTElOS19TVEFUVVMpIHsKLQkJaWYgKGJtc3IgJiBNSV9CTVNSX0xJTktfU1RBVFVTKSB7Ci0JCQlldGRldi0+Ym9vdF9jb21hID0gMjA7Ci0KLQkJCS8qIFVwZGF0ZSBvdXIgc3RhdGUgdmFyaWFibGVzIGFuZCBpbmRpY2F0ZSB0aGUKLQkJCSAqIGNvbm5lY3RlZCBzdGF0ZQotCQkJICovCi0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXRkZXYtPkxvY2ssIGZsYWdzKTsKLQotCQkJZXRkZXYtPk1lZGlhU3RhdGUgPSBORVRJRl9TVEFUVVNfTUVESUFfQ09OTkVDVDsKLQotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPkxvY2ssIGZsYWdzKTsKLQotCQkJbmV0aWZfY2Fycmllcl9vbihldGRldi0+bmV0ZGV2KTsKLQkJfSBlbHNlIHsKLQkJCWRldl93YXJuKCZldGRldi0+cGRldi0+ZGV2LAotCQkJICAgICJMaW5rIGRvd24gLSBjYWJsZSBwcm9ibGVtID9cbiIpOwotCi0JCQlpZiAoZXRkZXYtPmxpbmtzcGVlZCA9PSBUUlVFUEhZX1NQRUVEXzEwTUJQUykgewotCQkJCS8qIE5PVEUgLSBJcyB0aGVyZSBhIHdheSB0byBxdWVyeSB0aGlzIHdpdGhvdXQKLQkJCQkgKiBUcnVlUEhZPwotCQkJCSAqICYmIFRSVV9RdWVyeUNvcmVUeXBlKGV0ZGV2LT5oVHJ1ZVBoeSwgMCkgPT0KLQkJCQkgKiBFTUlfVFJVRVBIWV9BMTNPKSB7Ci0JCQkJICovCi0JCQkJdTE2IFJlZ2lzdGVyMTg7Ci0KLQkJCQlNaVJlYWQoZXRkZXYsIDB4MTIsICZSZWdpc3RlcjE4KTsKLQkJCQlNaVdyaXRlKGV0ZGV2LCAweDEyLCBSZWdpc3RlcjE4IHwgMHg0KTsKLQkJCQlNaVdyaXRlKGV0ZGV2LCAweDEwLCBSZWdpc3RlcjE4IHwgMHg4NDAyKTsKLQkJCQlNaVdyaXRlKGV0ZGV2LCAweDExLCBSZWdpc3RlcjE4IHwgNTExKTsKLQkJCQlNaVdyaXRlKGV0ZGV2LCAweDEyLCBSZWdpc3RlcjE4KTsKLQkJCX0KLQotCQkJLyogRm9yIHRoZSBmaXJzdCBOIHNlY29uZHMgb2YgbGlmZSwgd2UgYXJlIGluICJsaW5rCi0JCQkgKiBkZXRlY3Rpb24iIFdoZW4gd2UgYXJlIGluIHRoaXMgc3RhdGUsIHdlIHNob3VsZAotCQkJICogb25seSByZXBvcnQgImNvbm5lY3RlZCIuIFdoZW4gdGhlIExpbmtEZXRlY3Rpb24KLQkJCSAqIFRpbWVyIGV4cGlyZXMsIHdlIGNhbiByZXBvcnQgZGlzY29ubmVjdGVkIChoYW5kbGVkCi0JCQkgKiBpbiB0aGUgTGlua0RldGVjdGlvbkRQQykuCi0JCQkgKi8KLQkJCWlmICgoZXRkZXYtPk1lZGlhU3RhdGUgPT0gTkVUSUZfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QpKSB7Ci0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5Mb2NrLCBmbGFncyk7Ci0JCQkJZXRkZXYtPk1lZGlhU3RhdGUgPQotCQkJCSAgICBORVRJRl9TVEFUVVNfTUVESUFfRElTQ09OTkVDVDsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+TG9jaywKLQkJCQkJCSAgICAgICBmbGFncyk7Ci0KLQkJCQluZXRpZl9jYXJyaWVyX29mZihldGRldi0+bmV0ZGV2KTsKLQkJCX0KLQotCQkJZXRkZXYtPmxpbmtzcGVlZCA9IDA7Ci0JCQlldGRldi0+ZHVwbGV4X21vZGUgPSAwOwotCi0JCQkvKiBGcmVlIHRoZSBwYWNrZXRzIGJlaW5nIGFjdGl2ZWx5IHNlbnQgJiBzdG9wcGVkICovCi0JCQlldDEzMXhfZnJlZV9idXN5X3NlbmRfcGFja2V0cyhldGRldik7Ci0KLQkJCS8qIFJlLWluaXRpYWxpemUgdGhlIHNlbmQgc3RydWN0dXJlcyAqLwotCQkJZXQxMzF4X2luaXRfc2VuZChldGRldik7Ci0KLQkJCS8qIFJlc2V0IHRoZSBSRkQgbGlzdCBhbmQgcmUtc3RhcnQgUlUgKi8KLQkJCWV0MTMxeF9yZXNldF9yZWN2KGV0ZGV2KTsKLQotCQkJLyoKLQkJCSAqIEJyaW5nIHRoZSBkZXZpY2UgYmFjayB0byB0aGUgc3RhdGUgaXQgd2FzIGR1cmluZwotCQkJICogaW5pdCBwcmlvciB0byBhdXRvbmVnb3RpYXRpb24gYmVpbmcgY29tcGxldGUuIFRoaXMKLQkJCSAqIHdheSwgd2hlbiB3ZSBnZXQgdGhlIGF1dG8tbmVnIGNvbXBsZXRlIGludGVycnVwdCwKLQkJCSAqIHdlIGNhbiBjb21wbGV0ZSBpbml0IGJ5IGNhbGxpbmcgQ29uZmlnTWFjUkVHUzIuCi0JCQkgKi8KLQkJCWV0MTMxeF9zb2Z0X3Jlc2V0KGV0ZGV2KTsKLQotCQkJLyogU2V0dXAgRVQxMzEwIGFzIHBlciB0aGUgZG9jdW1lbnRhdGlvbiAqLwotCQkJZXQxMzF4X2FkYXB0ZXJfc2V0dXAoZXRkZXYpOwotCi0JCQkvKiBTZXR1cCB0aGUgUEhZIGludG8gY29tYSBtb2RlIHVudGlsIHRoZSBjYWJsZSBpcwotCQkJICogcGx1Z2dlZCBiYWNrIGluCi0JCQkgKi8KLQkJCWlmIChldGRldi0+UmVnaXN0cnlQaHlDb21hID09IDEpCi0JCQkJRW5hYmxlUGh5Q29tYShldGRldik7Ci0JCX0KLQl9Ci0KLQlpZiAoKGJtc3JfaW50cyAmIE1JX0JNU1JfQVVUT19ORUdfQ09NUExFVEUpIHx8Ci0JICAgIChldGRldi0+QWlGb3JjZURweCA9PSAzICYmIChibXNyX2ludHMgJiBNSV9CTVNSX0xJTktfU1RBVFVTKSkpIHsKLQkJaWYgKChibXNyICYgTUlfQk1TUl9BVVRPX05FR19DT01QTEVURSkgfHwKLQkJICAgIGV0ZGV2LT5BaUZvcmNlRHB4ID09IDMpIHsKLQkJCUVUMTMxMF9QaHlMaW5rU3RhdHVzKGV0ZGV2LAotCQkJCQkgICAgICZsaW5rX3N0YXR1cywgJmF1dG9uZWdfc3RhdHVzLAotCQkJCQkgICAgICZzcGVlZCwgJmR1cGxleCwgJm1kaV9tZGl4LAotCQkJCQkgICAgICZtYXN0ZXJzbGF2ZSwgJnBvbGFyaXR5KTsKLQotCQkJZXRkZXYtPmxpbmtzcGVlZCA9IHNwZWVkOwotCQkJZXRkZXYtPmR1cGxleF9tb2RlID0gZHVwbGV4OwotCi0JCQlldGRldi0+Ym9vdF9jb21hID0gMjA7Ci0KLQkJCWlmIChldGRldi0+bGlua3NwZWVkID09IFRSVUVQSFlfU1BFRURfMTBNQlBTKSB7Ci0JCQkJLyoKLQkJCQkgKiBOT1RFIC0gSXMgdGhlcmUgYSB3YXkgdG8gcXVlcnkgdGhpcyB3aXRob3V0Ci0JCQkJICogVHJ1ZVBIWT8KLQkJCQkgKiAmJiBUUlVfUXVlcnlDb3JlVHlwZShldGRldi0+aFRydWVQaHksIDApPT0KLQkJCQkgKiBFTUlfVFJVRVBIWV9BMTNPKSB7Ci0JCQkJICovCi0JCQkJdTE2IFJlZ2lzdGVyMTg7Ci0KLQkJCQlNaVJlYWQoZXRkZXYsIDB4MTIsICZSZWdpc3RlcjE4KTsKLQkJCQlNaVdyaXRlKGV0ZGV2LCAweDEyLCBSZWdpc3RlcjE4IHwgMHg0KTsKLQkJCQlNaVdyaXRlKGV0ZGV2LCAweDEwLCBSZWdpc3RlcjE4IHwgMHg4NDAyKTsKLQkJCQlNaVdyaXRlKGV0ZGV2LCAweDExLCBSZWdpc3RlcjE4IHwgNTExKTsKLQkJCQlNaVdyaXRlKGV0ZGV2LCAweDEyLCBSZWdpc3RlcjE4KTsKLQkJCX0KLQotCQkJQ29uZmlnRmxvd0NvbnRyb2woZXRkZXYpOwotCi0JCQlpZiAoZXRkZXYtPmxpbmtzcGVlZCA9PSBUUlVFUEhZX1NQRUVEXzEwMDBNQlBTICYmCi0JCQkJCWV0ZGV2LT5SZWdpc3RyeUp1bWJvUGFja2V0ID4gMjA0OCkKLQkJCQlFVDEzMTBfUGh5QW5kT3JSZWcoZXRkZXYsIDB4MTYsIDB4Y2ZmZiwKLQkJCQkJCQkJICAgMHgyMDAwKTsKLQotCQkJU2V0UnhEbWFUaW1lcihldGRldik7Ci0JCQlDb25maWdNQUNSZWdzMihldGRldik7Ci0JCX0KLQl9Ci19Ci0KLS8qCi0gKiBUaGUgcm91dGluZXMgd2hpY2ggZm9sbG93IHByb3ZpZGUgbG93LWxldmVsIGFjY2VzcyB0byB0aGUgUEhZLCBhbmQgYXJlIHVzZWQKLSAqIHByaW1hcmlseSBieSB0aGUgcm91dGluZXMgYWJvdmUgKGFsdGhvdWdoIHRoZXJlIGFyZSBhIGZldyBwbGFjZXMgZWxzZXdoZXJlCi0gKiBpbiB0aGUgZHJpdmVyIHdoZXJlIHRoaXMgbGV2ZWwgb2YgYWNjZXNzIGlzIHJlcXVpcmVkKS4KLSAqLwotCi1zdGF0aWMgY29uc3QgdTE2IENvbmZpZ1BoeVsyNV1bMl0gPSB7Ci0JLyogUmVnICAgICAgVmFsdWUgICAgICBSZWdpc3RlciAqLwotCS8qIEFkZHIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQl7MHg4ODBCLCAweDA5MjZ9LAkvKiBBZmVJZkNyZWc0QjEwMDBNc2JzICovCi0JezB4ODgwQywgMHgwOTI2fSwJLyogQWZlSWZDcmVnNEIxMDBNc2JzICovCi0JezB4ODgwRCwgMHgwOTI2fSwJLyogQWZlSWZDcmVnNEIxME1zYnMgKi8KLQotCXsweDg4MEUsIDB4QjREM30sCS8qIEFmZUlmQ3JlZzRCMTAwMExzYnMgKi8KLQl7MHg4ODBGLCAweEI0RDN9LAkvKiBBZmVJZkNyZWc0QjEwMExzYnMgKi8KLQl7MHg4ODEwLCAweEI0RDN9LAkvKiBBZmVJZkNyZWc0QjEwTHNicyAqLwotCi0JezB4ODgwNSwgMHhCMDNFfSwJLyogQWZlSWZDcmVnM0IxMDAwTXNicyAqLwotCXsweDg4MDYsIDB4QjAzRX0sCS8qIEFmZUlmQ3JlZzNCMTAwTXNicyAqLwotCXsweDg4MDcsIDB4RkYwMH0sCS8qIEFmZUlmQ3JlZzNCMTBNc2JzICovCi0KLQl7MHg4ODA4LCAweEUwOTB9LAkvKiBBZmVJZkNyZWczQjEwMDBMc2JzICovCi0JezB4ODgwOSwgMHhFMTEwfSwJLyogQWZlSWZDcmVnM0IxMDBMc2JzICovCi0JezB4ODgwQSwgMHgwMDAwfSwJLyogQWZlSWZDcmVnM0IxMExzYnMgKi8KLQotCXsweDMwMEQsIDF9LAkJLyogRGlzYWJsZU5vcm0gKi8KLQotCXsweDI4MEMsIDB4MDE4MH0sCS8qIExpbmtIb2xkRW5kICovCi0KLQl7MHgxQzIxLCAweDAwMDJ9LAkvKiBBbHBoYU0gKi8KLQotCXsweDM4MjEsIDZ9LAkJLyogRmZlTGtnVHgwICovCi0JezB4MzgxRCwgMX0sCQkvKiBGZmVMa2cxZzQgKi8KLQl7MHgzODFFLCAxfSwJCS8qIEZmZUxrZzFnNSAqLwotCXsweDM4MUYsIDF9LAkJLyogRmZlTGtnMWc2ICovCi0JezB4MzgyMCwgMX0sCQkvKiBGZmVMa2cxZzcgKi8KLQotCXsweDg0MDIsIDB4MDFGMH0sCS8qIEJ0aW5hY3QgKi8KLQl7MHg4MDBFLCAyMH0sCQkvKiBMZnRyYWluVGltZSAqLwotCXsweDgwMEYsIDI0fSwJCS8qIER2Z3VhcmRUaW1lICovCi0JezB4ODAxMCwgNDZ9LAkJLyogSWRsZ3VhcmRUaW1lICovCi0KLQl7MCwgMH0KLQotfTsKLQotLyogY29uZGVuc2VkIHZlcnNpb24gb2YgdGhlIHBoeSBpbml0aWFsaXphdGlvbiByb3V0aW5lICovCi12b2lkIEVUMTMxMF9QaHlJbml0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCi17Ci0JdTE2IGRhdGEsIGluZGV4OwotCi0JaWYgKGV0ZGV2ID09IE5VTEwpCi0JCXJldHVybjsKLQotCS8qIGdldCB0aGUgaWRlbnRpdHkgKGFnYWluID8pICovCi0JTWlSZWFkKGV0ZGV2LCBQSFlfSURfMSwgJmRhdGEpOwotCU1pUmVhZChldGRldiwgUEhZX0lEXzIsICZkYXRhKTsKLQotCS8qIHdoYXQgZG9lcyB0aGlzIGRvL2FjaGlldmUgPyAqLwotCU1pUmVhZChldGRldiwgUEhZX01QSFlfQ09OVFJPTF9SRUcsICZkYXRhKTsgLyogc2hvdWxkIHJlYWQgMDAwMiAqLwotCU1pV3JpdGUoZXRkZXYsIFBIWV9NUEhZX0NPTlRST0xfUkVHLAkweDAwMDYpOwotCi0JLyogcmVhZCBtb2RlbSByZWdpc3RlciAwNDAyLCBzaG91bGQgSSBkbyBzb21ldGhpbmcgd2l0aCB0aGUgcmV0dXJuCi0JICAgZGF0YSA/ICovCi0JTWlXcml0ZShldGRldiwgUEhZX0lOREVYX1JFRywgMHgwNDAyKTsKLQlNaVJlYWQoZXRkZXYsIFBIWV9EQVRBX1JFRywgJmRhdGEpOwotCi0JLyogd2hhdCBkb2VzIHRoaXMgZG8vYWNoaWV2ZSA/ICovCi0JTWlXcml0ZShldGRldiwgUEhZX01QSFlfQ09OVFJPTF9SRUcsIDB4MDAwMik7Ci0KLQkvKiBnZXQgdGhlIGlkZW50aXR5IChhZ2FpbiA/KSAqLwotCU1pUmVhZChldGRldiwgUEhZX0lEXzEsICZkYXRhKTsKLQlNaVJlYWQoZXRkZXYsIFBIWV9JRF8yLCAmZGF0YSk7Ci0KLQkvKiB3aGF0IGRvZXMgdGhpcyBhY2hpZXZlID8gKi8KLQlNaVJlYWQoZXRkZXYsIFBIWV9NUEhZX0NPTlRST0xfUkVHLCAmZGF0YSk7IC8qIHNob3VsZCByZWFkIDAwMDIgKi8KLQlNaVdyaXRlKGV0ZGV2LCBQSFlfTVBIWV9DT05UUk9MX1JFRywgMHgwMDA2KTsKLQotCS8qIHJlYWQgbW9kZW0gcmVnaXN0ZXIgMDQwMiwgc2hvdWxkIEkgZG8gc29tZXRoaW5nIHdpdGgKLQkgICB0aGUgcmV0dXJuIGRhdGE/ICovCi0JTWlXcml0ZShldGRldiwgUEhZX0lOREVYX1JFRywgMHgwNDAyKTsKLQlNaVJlYWQoZXRkZXYsIFBIWV9EQVRBX1JFRywgJmRhdGEpOwotCi0JTWlXcml0ZShldGRldiwgUEhZX01QSFlfQ09OVFJPTF9SRUcsIDB4MDAwMik7Ci0KLQkvKiB3aGF0IGRvZXMgdGhpcyBhY2hpZXZlIChzaG91bGQgcmV0dXJuIDB4MTA0MCkgKi8KLQlNaVJlYWQoZXRkZXYsIFBIWV9DT05UUk9MLCAmZGF0YSk7Ci0JTWlSZWFkKGV0ZGV2LCBQSFlfTVBIWV9DT05UUk9MX1JFRywgJmRhdGEpOyAvKiBzaG91bGQgcmVhZCAwMDAyICovCi0JTWlXcml0ZShldGRldiwgUEhZX0NPTlRST0wsIDB4MTg0MCk7Ci0KLQlNaVdyaXRlKGV0ZGV2LCBQSFlfTVBIWV9DT05UUk9MX1JFRywgMHgwMDA3KTsKLQotCS8qIGhlcmUgdGhlIHdyaXRpbmcgb2YgdGhlIGFycmF5IHN0YXJ0cy4uLi4gKi8KLQlpbmRleCA9IDA7Ci0Jd2hpbGUgKENvbmZpZ1BoeVtpbmRleF1bMF0gIT0gMHgwMDAwKSB7Ci0JCS8qIHdyaXRlIHZhbHVlICovCi0JCU1pV3JpdGUoZXRkZXYsIFBIWV9JTkRFWF9SRUcsIENvbmZpZ1BoeVtpbmRleF1bMF0pOwotCQlNaVdyaXRlKGV0ZGV2LCBQSFlfREFUQV9SRUcsIENvbmZpZ1BoeVtpbmRleF1bMV0pOwotCi0JCS8qIHJlYWQgaXQgYmFjayAqLwotCQlNaVdyaXRlKGV0ZGV2LCBQSFlfSU5ERVhfUkVHLCBDb25maWdQaHlbaW5kZXhdWzBdKTsKLQkJTWlSZWFkKGV0ZGV2LCBQSFlfREFUQV9SRUcsICZkYXRhKTsKLQotCQkvKiBkbyBhIGNoZWNrIG9uIHRoZSB2YWx1ZSByZWFkIGJhY2sgPyAqLwotCQlpbmRleCsrOwotCX0KLQkvKiBoZXJlIHRoZSB3cml0aW5nIG9mIHRoZSBhcnJheSBlbmRzLi4uICovCi0KLQlNaVJlYWQoZXRkZXYsIFBIWV9DT05UUk9MLCAmZGF0YSk7CQkvKiAweDE4NDAgKi8KLQlNaVJlYWQoZXRkZXYsIFBIWV9NUEhZX0NPTlRST0xfUkVHLCAmZGF0YSk7Lyogc2hvdWxkIHJlYWQgMDAwNyAqLwotCU1pV3JpdGUoZXRkZXYsIFBIWV9DT05UUk9MLCAweDEwNDApOwotCU1pV3JpdGUoZXRkZXYsIFBIWV9NUEhZX0NPTlRST0xfUkVHLCAweDAwMDIpOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9waHkuaCBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3BoeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjM4YTNlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3BoeS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDU4ICswLDAgQEAKLS8qCi0gKiBBZ2VyZSBTeXN0ZW1zIEluYy4KLSAqIDEwLzEwMC8xMDAwIEJhc2UtVCBFdGhlcm5ldCBEcml2ZXIgZm9yIHRoZSBFVDEzMDEgYW5kIEVUMTMxeCBzZXJpZXMgTUFDcwotICoKLSAqIENvcHlyaWdodCDCqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIGV0MTMxMF9waHkuaCAtIERlZmluZXMsIHN0cnVjdHMsIGVudW1zLCBwcm90b3R5cGVzLCBldGMuIHBlcnRhaW5pbmcgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICBQSFkuCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBTT0ZUV0FSRSBMSUNFTlNFCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCi0gKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCi0gKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCi0gKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCi0gKgotICogQ29weXJpZ2h0IMKpIDIwMDUgQWdlcmUgU3lzdGVtcyBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKgotICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKLSAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCi0gKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KLSAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIERpc2NsYWltZXIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKLSAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKLSAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCi0gKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAotICogREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIF9FVDEzMTBfUEhZX0hfCi0jZGVmaW5lIF9FVDEzMTBfUEhZX0hfCi0KLSNpbmNsdWRlICJldDEzMTBfYWRkcmVzc19tYXAuaCIKLQotLyogTUkgUmVnaXN0ZXIgQWRkcmVzc2VzICovCi0jZGVmaW5lIE1JX0NPTlRST0xfUkVHICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgTUlfU1RBVFVTX1JFRyAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBNSV9QSFlfSURFTlRJRklFUl8xX1JFRyAgICAgICAgICAgICAyCi0jZGVmaW5lIE1JX1BIWV9JREVOVElGSUVSXzJfUkVHICAgICAgICAgICAgIDMKLSNkZWZpbmUgTUlfQVVUT05FR19BRFZFUlRJU0VNRU5UX1JFRyAgICAgICAgNAotI2RlZmluZSBNSV9BVVRPTkVHX0xJTktfUEFSVE5FUl9BQklMSVRZX1JFRyA1Ci0jZGVmaW5lIE1JX0FVVE9ORUdfRVhQQU5TSU9OX1JFRyAgICAgICAgICAgIDYKLSNkZWZpbmUgTUlfQVVUT05FR19ORVhUX1BBR0VfVFJBTlNNSVRfUkVHICAgNwotI2RlZmluZSBNSV9MSU5LX1BBUlRORVJfTkVYVF9QQUdFX1JFRyAgICAgICA4Ci0jZGVmaW5lIE1JXzEwMDBCQVNFVF9DT05UUk9MX1JFRyAgICAgICAgICAgIDkKLSNkZWZpbmUgTUlfMTAwMEJBU0VUX1NUQVRVU19SRUcgICAgICAgICAgICAgMTAKLSNkZWZpbmUgTUlfUkVTRVJWRUQxMV9SRUcgICAgICAgICAgICAgICAgICAgMTEKLSNkZWZpbmUgTUlfUkVTRVJWRUQxMl9SRUcgICAgICAgICAgICAgICAgICAgMTIKLSNkZWZpbmUgTUlfUkVTRVJWRUQxM19SRUcgICAgICAgICAgICAgICAgICAgMTMKLSNkZWZpbmUgTUlfUkVTRVJWRUQxNF9SRUcgICAgICAgICAgICAgICAgICAgMTQKLSNkZWZpbmUgTUlfRVhURU5ERURfU1RBVFVTX1JFRyAgICAgICAgICAgICAgMTUKLQotLyogVk1JIFJlZ2lzdGVyIEFkZHJlc3NlcyAqLwotI2RlZmluZSBWTUlfUkVTRVJWRUQxNl9SRUcgICAgICAgICAgICAgICAgICAxNgotI2RlZmluZSBWTUlfUkVTRVJWRUQxN19SRUcgICAgICAgICAgICAgICAgICAxNwotI2RlZmluZSBWTUlfUkVTRVJWRUQxOF9SRUcgICAgICAgICAgICAgICAgICAxOAotI2RlZmluZSBWTUlfTE9PUEJBQ0tfQ09OVFJPTF9SRUcgICAgICAgICAgICAxOQotI2RlZmluZSBWTUlfUkVTRVJWRUQyMF9SRUcgICAgICAgICAgICAgICAgICAyMAotI2RlZmluZSBWTUlfTUlfQ09OVFJPTF9SRUcgICAgICAgICAgICAgICAgICAyMQotI2RlZmluZSBWTUlfUEhZX0NPTkZJR1VSQVRJT05fUkVHICAgICAgICAgICAyMgotI2RlZmluZSBWTUlfUEhZX0NPTlRST0xfUkVHICAgICAgICAgICAgICAgICAyMwotI2RlZmluZSBWTUlfSU5URVJSVVBUX01BU0tfUkVHICAgICAgICAgICAgICAyNAotI2RlZmluZSBWTUlfSU5URVJSVVBUX1NUQVRVU19SRUcgICAgICAgICAgICAyNQotI2RlZmluZSBWTUlfUEhZX1NUQVRVU19SRUcgICAgICAgICAgICAgICAgICAyNgotI2RlZmluZSBWTUlfTEVEX0NPTlRST0xfMV9SRUcgICAgICAgICAgICAgICAyNwotI2RlZmluZSBWTUlfTEVEX0NPTlRST0xfMl9SRUcgICAgICAgICAgICAgICAyOAotI2RlZmluZSBWTUlfUkVTRVJWRUQyOV9SRUcgICAgICAgICAgICAgICAgICAyOQotI2RlZmluZSBWTUlfUkVTRVJWRUQzMF9SRUcgICAgICAgICAgICAgICAgICAzMAotI2RlZmluZSBWTUlfUkVTRVJWRUQzMV9SRUcgICAgICAgICAgICAgICAgICAzMQotCi0vKiBQSFkgUmVnaXN0ZXIgTWFwcGluZyhNSSkgTWFuYWdlbWVudCBJbnRlcmZhY2UgUmVncyAqLwotc3RydWN0IG1pX3JlZ3MgewotCXU4IGJtY3I7CS8qIEJhc2ljIG1vZGUgY29udHJvbCByZWcoUmVnIDB4MDApICovCi0JdTggYm1zcjsJLyogQmFzaWMgbW9kZSBzdGF0dXMgcmVnKFJlZyAweDAxKSAqLwotCXU4IGlkcjE7CS8qIFBoeSBpZGVudGlmaWVyIHJlZyAxKFJlZyAweDAyKSAqLwotCXU4IGlkcjI7CS8qIFBoeSBpZGVudGlmaWVyIHJlZyAyKFJlZyAweDAzKSAqLwotCXU4IGFuYXI7CS8qIEF1dG8tTmVnb3RpYXRpb24gYWR2ZXJ0aXNlbWVudChSZWcgMHgwNCkgKi8KLQl1OCBhbmxwYXI7CS8qIEF1dG8tTmVnb3RpYXRpb24gbGluayBQYXJ0bmVyIEFiaWxpdHkoUmVnIDB4MDUpICovCi0JdTggYW5lcjsJLyogQXV0by1OZWdvdGlhdGlvbiBleHBhbnNpb24gcmVnKFJlZyAweDA2KSAqLwotCXU4IGFubnB0cjsJLyogQXV0by1OZWdvdGlhdGlvbiBuZXh0IHBhZ2UgdHJhbnNtaXQgcmVnKFJlZyAweDA3KSAqLwotCXU4IGxwbnByOwkvKiBsaW5rIHBhcnRuZXIgbmV4dCBwYWdlIHJlZyhSZWcgMHgwOCkgKi8KLQl1OCBnY3I7CQkvKiBHaWdhYml0IGJhc2ljIG1vZGUgY29udHJvbCByZWcoUmVnIDB4MDkpICovCi0JdTggZ3NyOwkJLyogR2lnYWJpdCBiYXNpYyBtb2RlIHN0YXR1cyByZWcoUmVnIDB4MEEpICovCi0JdTggbWlfcmVzMVs0XTsJLyogRnV0dXJlIHVzZSBieSBNSSB3b3JraW5nIGdyb3VwKFJlZyAweDBCIC0gMHgwRSkgKi8KLQl1OCBlc3I7CQkvKiBFeHRlbmRlZCBzdGF0dXMgcmVnKFJlZyAweDBGKSAqLwotCXU4IG1pX3JlczJbM107CS8qIEZ1dHVyZSB1c2UgYnkgTUkgd29ya2luZyBncm91cChSZWcgMHgxMCAtIDB4MTIpICovCi0JdTggbG9vcF9jdGw7CS8qIExvb3BiYWNrIENvbnRyb2wgUmVnKFJlZyAweDEzKSAqLwotCXU4IG1pX3JlczM7CS8qIEZ1dHVyZSB1c2UgYnkgTUkgd29ya2luZyBncm91cChSZWcgMHgxNCkgKi8KLQl1OCBtY3I7CQkvKiBNSSBDb250cm9sIFJlZyhSZWcgMHgxNSkgKi8KLQl1OCBwY3I7CQkvKiBDb25maWd1cmF0aW9uIFJlZyhSZWcgMHgxNikgKi8KLQl1OCBwaHlfY3RsOwkvKiBQSFkgQ29udHJvbCBSZWcoUmVnIDB4MTcpICovCi0JdTggaW1yOwkJLyogSW50ZXJydXB0IE1hc2sgUmVnKFJlZyAweDE4KSAqLwotCXU4IGlzcjsJCS8qIEludGVycnVwdCBTdGF0dXMgUmVnKFJlZyAweDE5KSAqLwotCXU4IHBzcjsJCS8qIFBIWSBTdGF0dXMgUmVnKFJlZyAweDFBKSAqLwotCXU4IGxjcjE7CQkvKiBMRUQgQ29udHJvbCAxIFJlZyhSZWcgMHgxQikgKi8KLQl1OCBsY3IyOwkJLyogTEVEIENvbnRyb2wgMiBSZWcoUmVnIDB4MUMpICovCi0JdTggbWlfcmVzNFszXTsJLyogRnV0dXJlIHVzZSBieSBNSSB3b3JraW5nIGdyb3VwKFJlZyAweDFEIC0gMHgxRikgKi8KLX07Ci0KLS8qCi0gKiBNSSBSZWdpc3RlciAwOiBCYXNpYyBtb2RlIGNvbnRyb2wgcmVnaXN0ZXIKLSAqCTE1OglyZXNldAotICoJMTQ6CWxvb3BiYWNrCi0gKgkxMzoJc3BlZWRfc2VsCi0gKgkxMjoJZW5hYmxlX2F1dG9uZWcKLSAqCTExOglwb3dlcl9kb3duCi0gKgkxMDoJaXNvbGF0ZQotICoJOToJcmVzdGFydF9hdXRvbmVnCi0gKgk4OglkdXBsZXhfbW9kZQotICoJNzoJY29sX3Rlc3QKLSAqCTY6CXNwZWVkXzEwMDBfc2VsCi0gKgk1LTA6CXJlczEKLSAqLwotCi0vKgotICogTUkgUmVnaXN0ZXIgMTogIEJhc2ljIG1vZGUgc3RhdHVzIHJlZ2lzdGVyCi0gKgkxNToJbGlua18xMDBUNAotICoJMTQ6CWxpbmtfMTAwZmR4Ci0gKgkxMzoJbGlua18xMDBoZHgKLSAqCTEyOglsaW5rXzEwZmR4Ci0gKgkxMToJbGlua18xMGhkeAotICoJMTA6CWxpbmtfMTAwVDJmZHgKLSAqCTk6CWxpbmtfMTAwVDJoZHgKLSAqCTg6CWV4dGVuZF9zdGF0dXMKLSAqCTc6CXJlczEKLSAqCTY6CXByZWFtYmxlX3N1cHJlc3MKLSAqCTU6CWF1dG9fbmVnX2NvbXBsZXRlCi0gKgk0OglyZW1vdGVfZmF1bHQKLSAqCTM6CWF1dG9fbmVnX2FibGUKLSAqCTI6CWxpbmtfc3RhdHVzCi0gKgkxOglqYWJiZXJfZGV0ZWN0Ci0gKgkwOglleHRfY2FwCi0gKi8KLQotI2RlZmluZSBNSV9CTVNSX0xJTktfU1RBVFVTCSAgMHgwNAotI2RlZmluZSBNSV9CTVNSX0FVVE9fTkVHX0NPTVBMRVRFIDB4MjAKLQotLyoKLSAqIE1JIFJlZ2lzdGVyIDQ6IEF1dG8tbmVnb3RpYXRpb24gYWR2ZXJ0aXNlbWVudCByZWdpc3RlcgotICoKLSAqCTE1OglucF9pbmRpY2F0aW9uCi0gKgkxNDoJcmVzMgotICoJMTM6CXJlbW90ZV9mYXVsdAotICoJMTI6CXJlczEKLSAqCTExOgljYXBfYXNtcGF1c2UKLSAqCTEwOgljYXBfcGF1c2UKLSAqCTk6CWNhcF8xMDBUNAotICoJODoJY2FwXzEwMGZkeAotICoJNzoJY2FwXzEwMGhkeAotICoJNjoJY2FwXzEwZmR4Ci0gKgk1OgljYXBfMTBoZHgKLSAqCTQtMDoJc2VsZWN0b3IKLSAqLwotCi0vKiBNSSBSZWdpc3RlciA1OiBBdXRvLW5lZ290aWF0aW9uIGxpbmsgcGFydG5lciBhZHZlcnRpc2VtZW50IHJlZ2lzdGVyCi0gKgkxNToJbnBfaW5kaWNhdGlvbgotICoJMTQ6CWFja25vd2xlZGdlCi0gKgkxMzoJcmVtb3RlX2ZhdWx0Ci0gKgkxMjoJcmVzMQotICoJMTE6CWNhcF9hc21wYXVzZQotICoJMTA6CWNhcF9wYXVzZQotICoJOToJY2FwXzEwMFQ0Ci0gKgk4OgljYXBfMTAwZmR4Ci0gKgk3OgljYXBfMTAwaGR4Ci0gKgk2OgljYXBfMTBmZHgKLSAqCTU6CWNhcF8xMGhkeAotICoJNC0wOglzZWxlY3RvcgotICovCi0KLS8qIE1JIFJlZ2lzdGVyIDY6IEF1dG8tbmVnb3RpYXRpb24gZXhwYW5zaW9uIHJlZ2lzdGVyCi0gKgkxNS01OglyZXNlcnZlZAotICoJNDoJcGRmCi0gKgkzOglscF9ucF9hYmxlCi0gKgkyOglucF9hYmxlCi0gKgkxOglwYWdlX3J4Ci0gKgkwOglscF9hbl9hYmxlCi0gKi8KLQotLyogTUkgUmVnaXN0ZXIgNzogQXV0by1uZWdvdGlhdGlvbiBuZXh0IHBhZ2UgdHJhbnNtaXQgcmVnKDB4MDcpCi0gKgkxNToJbnAKLSAqCTE0OglyZXNlcnZlZAotICoJMTM6CW1zZ19wYWdlCi0gKgkxMjoJYWNrMgotICoJMTE6CXRvZ2dsZQotICoJMTAtMAltc2cKLSAqLwotCi0vKiBNSSBSZWdpc3RlciA4OiBMaW5rIFBhcnRuZXIgTmV4dCBQYWdlIFJlZygweDA4KQotICoJMTU6CW5wCi0gKgkxNDoJYWNrCi0gKgkxMzoJbXNnX3BhZ2UKLSAqCTEyOglhY2syCi0gKgkxMToJdG9nZ2xlCi0gKgkxMC0wOgltc2cKLSAqLwotCi0vKiBNSSBSZWdpc3RlciA5OiAxMDAwQmFzZVQgQ29udHJvbCBSZWcoMHgwOSkKLSAqCTE1LTEzOgl0ZXN0X21vZGUKLSAqCTEyOgltc19jb25maWdfZW4KLSAqCTExOgltc192YWx1ZQotICoJMTA6CXBvcnRfdHlwZQotICoJOToJbGlua18xMDAwZmR4Ci0gKgk4OglsaW5rXzEwMDBoZHgKLSAqCTctMDoJcmVzZXJ2ZWQKLSAqLwotCi0vKiBNSSBSZWdpc3RlciAxMDogMTAwMEJhc2VUIFN0YXR1cyBSZWcoMHgwQSkKLSAqCTE1Ogltc19jb25maWdfZmF1bHQKLSAqCTE0Ogltc19yZXNvbHZlCi0gKgkxMzoJbG9jYWxfcnhfc3RhdHVzCi0gKgkxMjoJcmVtb3RlX3J4X3N0YXR1cwotICoJMTE6CWxpbmtfMTAwMGZkeAotICoJMTA6CWxpbmtfMTAwMGhkeAotICoJOS04OglyZXNlcnZlZAotICoJNy0wOglpZGxlX2Vycl9jbnQKLSAqLwotCi0vKiBNSSBSZWdpc3RlciAxMSAtIDE0OiBSZXNlcnZlZCBSZWdzKDB4MEIgLSAweDBFKSAqLwotCi0vKiBNSSBSZWdpc3RlciAxNTogRXh0ZW5kZWQgc3RhdHVzIFJlZygweDBGKQotICoJMTU6CWxpbmtfMTAwMFhmZHgKLSAqCTE0OglsaW5rXzEwMDBYaGR4Ci0gKgkxMzoJbGlua18xMDAwZmR4Ci0gKgkxMjoJbGlua18xMDAwaGR4Ci0gKgkxMS0wOglyZXNlcnZlZAotICovCi0KLS8qIE1JIFJlZ2lzdGVyIDE2IC0gMTg6IFJlc2VydmVkIFJlZygweDEwLTB4MTIpICovCi0KLS8qIE1JIFJlZ2lzdGVyIDE5OiBMb29wYmFjayBDb250cm9sIFJlZygweDEzKQotICoJMTU6CW1paV9lbgotICoJMTQ6CXBjc19lbgotICoJMTM6CXBtZF9lbgotICoJMTI6CWFsbF9kaWdpdGFsX2VuCi0gKgkxMToJcmVwbGljYV9lbgotICoJMTA6CWxpbmVfZHJpdmVyX2VuCi0gKgk5LTA6CXJlc2VydmVkCi0gKi8KLQotLyogTUkgUmVnaXN0ZXIgMjA6IFJlc2VydmVkIFJlZygweDE0KSAqLwotCi0vKiBNSSBSZWdpc3RlciAyMTogTWFuYWdlbWVudCBJbnRlcmZhY2UgQ29udHJvbCBSZWcoMHgxNSkKLSAqCTE1LTExOglyZXNlcnZlZAotICoJMTAtNDoJbWlfZXJyb3JfY291bnQKLSAqCTM6CXJlc2VydmVkCi0gKgkyOglpZ25vcmVfMTBnX2ZyCi0gKgkxOglyZXNlcnZlZAotICoJMDoJcHJlYW1ibGVfc3VwcmVzc19lbgotICovCi0KLS8qIE1JIFJlZ2lzdGVyIDIyOiBQSFkgQ29uZmlndXJhdGlvbiBSZWcoMHgxNikKLSAqCTE1OgljcnNfdHhfZW4KLSAqCTE0OglyZXNlcnZlZAotICoJMTMtMTI6CXR4X2ZpZm9fZGVwdGgKLSAqCTExLTEwOglzcGVlZF9kb3duc2hpZnQKLSAqCTk6CXBiaV9kZXRlY3QKLSAqCTg6CXRiaV9yYXRlCi0gKgk3OglhbHRlcm5hdGVfbnAKLSAqCTY6CWdyb3VwX21kaW9fZW4KLSAqCTU6CXR4X2Nsb2NrX2VuCi0gKgk0OglzeXNfY2xvY2tfZW4KLSAqCTM6CXJlc2VydmVkCi0gKgkyLTA6CW1hY19pZl9tb2RlCi0gKi8KLQotLyogTUkgUmVnaXN0ZXIgMjM6IFBIWSBDT05UUk9MIFJlZygweDE3KQotICoJMTU6CXJlc2VydmVkCi0gKgkxNDoJdGRyX2VuCi0gKgkxMzoJcmVzZXJ2ZWQKLSAqCTEyLTExOglkb3duc2hpZnRfYXR0ZW1wdHMKLSAqCTEwLTY6CXJlc2VydmVkCi0gKgk1OglqYWJiZXJfMTBiYXNlVAotICoJNDoJc3FlXzEwYmFzZVQKLSAqCTM6CXRwX2xvb3BiYWNrXzEwYmFzZVQKLSAqCTI6CXByZWFtYmxlX2dlbl9lbgotICoJMToJcmVzZXJ2ZWQKLSAqCTA6CWZvcmNlX2ludAotICovCi0KLS8qIE1JIFJlZ2lzdGVyIDI0OiBJbnRlcnJ1cHQgTWFzayBSZWcoMHgxOCkKLSAqCTE1LTEwOglyZXNlcnZlZAotICoJOToJbWRpb19zeW5jX2xvc3QKLSAqCTg6CWF1dG9uZWdfc3RhdHVzCi0gKgk3OgloaV9iaXRfZXJyCi0gKgk2OglucF9yeAotICoJNToJZXJyX2NvdW50ZXJfZnVsbAotICoJNDoJZmlmb19vdmVyX3VuZGVyZmxvdwotICoJMzoJcnhfc3RhdHVzCi0gKgkyOglsaW5rX3N0YXR1cwotICoJMToJYXV0b21hdGljX3NwZWVkCi0gKgkwOglpbnRfZW4KLSAqLwotCi0KLS8qIE1JIFJlZ2lzdGVyIDI1OiBJbnRlcnJ1cHQgU3RhdHVzIFJlZygweDE5KQotICoJMTUtMTA6CXJlc2VydmVkCi0gKgk5OgltZGlvX3N5bmNfbG9zdAotICoJODoJYXV0b25lZ19zdGF0dXMKLSAqCTc6CWhpX2JpdF9lcnIKLSAqCTY6CW5wX3J4Ci0gKgk1OgllcnJfY291bnRlcl9mdWxsCi0gKgk0OglmaWZvX292ZXJfdW5kZXJmbG93Ci0gKgkzOglyeF9zdGF0dXMKLSAqCTI6CWxpbmtfc3RhdHVzCi0gKgkxOglhdXRvbWF0aWNfc3BlZWQKLSAqCTA6CWludF9lbgotICovCi0KLS8qIE1JIFJlZ2lzdGVyIDI2OiBQSFkgU3RhdHVzIFJlZygweDFBKQotICoJMTU6CXJlc2VydmVkCi0gKgkxNC0xMzoJYXV0b25lZ19mYXVsdAotICoJMTI6CWF1dG9uZWdfc3RhdHVzCi0gKgkxMToJbWRpX3hfc3RhdHVzCi0gKgkxMDoJcG9sYXJpdHlfc3RhdHVzCi0gKgk5LTg6CXNwZWVkX3N0YXR1cwotICoJNzoJZHVwbGV4X3N0YXR1cwotICoJNjoJbGlua19zdGF0dXMKLSAqCTU6CXR4X3N0YXR1cwotICoJNDoJcnhfc3RhdHVzCi0gKgkzOgljb2xsaXNpb25fc3RhdHVzCi0gKgkyOglhdXRvbmVnX2VuCi0gKgkxOglwYXVzZV9lbgotICoJMDoJYXN5bW1ldHJpY19kaXIKLSAqLwotCi0vKiBNSSBSZWdpc3RlciAyNzogTEVEIENvbnRyb2wgUmVnIDEoMHgxQikKLSAqCTE1LTE0OglyZXNlcnZlZAotICoJMTMtMTI6CWxlZF9kdXBfaW5kaWNhdGUKLSAqCTExLTEwOglsZWRfMTBiYXNlVAotICoJOS04OglsZWRfY29sbGlzaW9uCi0gKgk3LTQ6CXJlc2VydmVkCi0gKgkzLTI6CXB1bHNlX2R1cgotICoJMToJcHVsc2Vfc3RyZXRjaDEKLSAqCTA6CXB1bHNlX3N0cmV0Y2gwCi0gKi8KLQotLyogTUkgUmVnaXN0ZXIgMjg6IExFRCBDb250cm9sIFJlZyAyKDB4MUMpCi0gKgkxNS0xMjoJbGVkX2xpbmsKLSAqCTExLTg6CWxlZF90eF9yeAotICoJNy00OglsZWRfMTAwQmFzZVRYCi0gKgkzLTA6CWxlZF8xMDAwQmFzZVQKLSAqLwotCi0vKiBNSSBSZWdpc3RlciAyOSAtIDMxOiBSZXNlcnZlZCBSZWcoMHgxRCAtIDB4MUUpICovCi0KLQotLyogUHJvdG90eXBlcyBmb3IgRVQxMzEwX3BoeS5jICovCi0vKiBEZWZpbmVzIGZvciBQSFkgYWNjZXNzIHJvdXRpbmVzICovCi0KLS8qIERlZmluZSBiaXQgb3BlcmF0aW9uIGZsYWdzICovCi0jZGVmaW5lIFRSVUVQSFlfQklUX0NMRUFSICAgICAgICAgICAgICAgMAotI2RlZmluZSBUUlVFUEhZX0JJVF9TRVQgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgVFJVRVBIWV9CSVRfUkVBRCAgICAgICAgICAgICAgICAyCi0KLS8qIERlZmluZSByZWFkL3dyaXRlIG9wZXJhdGlvbiBmbGFncyAqLwotI2lmbmRlZiBUUlVFUEhZX1JFQUQKLSNkZWZpbmUgVFJVRVBIWV9SRUFEICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFRSVUVQSFlfV1JJVEUgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBUUlVFUEhZX01BU0sgICAgICAgICAgICAgICAgICAgIDIKLSNlbmRpZgotCi0vKiBEZWZpbmUgc3BlZWRzICovCi0jZGVmaW5lIFRSVUVQSFlfU1BFRURfMTBNQlBTICAgICAgICAgICAgMAotI2RlZmluZSBUUlVFUEhZX1NQRUVEXzEwME1CUFMgICAgICAgICAgIDEKLSNkZWZpbmUgVFJVRVBIWV9TUEVFRF8xMDAwTUJQUyAgICAgICAgICAyCi0KLS8qIERlZmluZSBkdXBsZXggbW9kZXMgKi8KLSNkZWZpbmUgVFJVRVBIWV9EVVBMRVhfSEFMRiAgICAgICAgICAgICAwCi0jZGVmaW5lIFRSVUVQSFlfRFVQTEVYX0ZVTEwgICAgICAgICAgICAgMQotCi0vKiBEZWZpbmUgbWFzdGVyL3NsYXZlIGNvbmZpZ3VyYXRpb24gdmFsdWVzICovCi0jZGVmaW5lIFRSVUVQSFlfQ0ZHX1NMQVZFICAgICAgICAgICAgICAgMAotI2RlZmluZSBUUlVFUEhZX0NGR19NQVNURVIgICAgICAgICAgICAgIDEKLQotLyogRGVmaW5lIE1ESS9NREktWCBzZXR0aW5ncyAqLwotI2RlZmluZSBUUlVFUEhZX01ESSAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgVFJVRVBIWV9NRElYICAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIFRSVUVQSFlfQVVUT19NRElfTURJWCAgICAgICAgICAgMgotCi0vKiBEZWZpbmUgMTBCYXNlLVQgbGluayBwb2xhcml0aWVzICovCi0jZGVmaW5lIFRSVUVQSFlfUE9MQVJJVFlfTk9STUFMICAgICAgICAgMAotI2RlZmluZSBUUlVFUEhZX1BPTEFSSVRZX0lOVkVSVEVEICAgICAgIDEKLQotLyogRGVmaW5lIGF1dG8tbmVnb3RpYXRpb24gcmVzdWx0cyAqLwotI2RlZmluZSBUUlVFUEhZX0FORUdfTk9UX0NPTVBMRVRFICAgICAgIDAKLSNkZWZpbmUgVFJVRVBIWV9BTkVHX0NPTVBMRVRFICAgICAgICAgICAxCi0jZGVmaW5lIFRSVUVQSFlfQU5FR19ESVNBQkxFRCAgICAgICAgICAgMgotCi0vKiBEZWZpbmUgZHVwbGV4IGFkdmVydGlzZW1lbnQgZmxhZ3MgKi8KLSNkZWZpbmUgVFJVRVBIWV9BRFZfRFVQTEVYX05PTkUgICAgICAgICAweDAwCi0jZGVmaW5lIFRSVUVQSFlfQURWX0RVUExFWF9GVUxMICAgICAgICAgMHgwMQotI2RlZmluZSBUUlVFUEhZX0FEVl9EVVBMRVhfSEFMRiAgICAgICAgIDB4MDIKLSNkZWZpbmUgVFJVRVBIWV9BRFZfRFVQTEVYX0JPVEggICAgIFwKLQkoVFJVRVBIWV9BRFZfRFVQTEVYX0ZVTEwgfCBUUlVFUEhZX0FEVl9EVVBMRVhfSEFMRikKLQotI2RlZmluZSBQSFlfQ09OVFJPTCAgICAgICAgICAgICAgICAweDAwCS8qICNkZWZpbmUgVFJVX01JX0NPTlRST0xfUkVHSVNURVIgICAgICAgICAgICAgICAgIDAgKi8KLSNkZWZpbmUgUEhZX1NUQVRVUyAgICAgICAgICAgICAgICAgMHgwMQkvKiAjZGVmaW5lIFRSVV9NSV9TVEFUVVNfUkVHSVNURVIgICAgICAgICAgICAgICAgICAxICovCi0jZGVmaW5lIFBIWV9JRF8xICAgICAgICAgICAgICAgICAgIDB4MDIJLyogI2RlZmluZSBUUlVfTUlfUEhZX0lERU5USUZJRVJfMV9SRUdJU1RFUiAgICAgICAgMiAqLwotI2RlZmluZSBQSFlfSURfMiAgICAgICAgICAgICAgICAgICAweDAzCS8qICNkZWZpbmUgVFJVX01JX1BIWV9JREVOVElGSUVSXzJfUkVHSVNURVIgICAgICAgIDMgKi8KLSNkZWZpbmUgUEhZX0FVVE9fQURWRVJUSVNFTUVOVCAgICAgMHgwNAkvKiAjZGVmaW5lIFRSVV9NSV9BRFZFUlRJU0VNRU5UX1JFR0lTVEVSICAgICAgICAgICA0ICovCi0jZGVmaW5lIFBIWV9BVVRPX0xJTktfUEFSVE5FUiAgICAgIDB4MDUJLyogI2RlZmluZSBUUlVfTUlfTElOS19QQVJUTkVSX0FCSUxJVFlfUkVHSVNURVIgICAgNSAqLwotI2RlZmluZSBQSFlfQVVUT19FWFBBTlNJT04gICAgICAgICAweDA2CS8qICNkZWZpbmUgVFJVX01JX0VYUEFOU0lPTl9SRUdJU1RFUiAgICAgICAgICAgICAgIDYgKi8KLSNkZWZpbmUgUEhZX0FVVE9fTkVYVF9QQUdFX1RYICAgICAgMHgwNwkvKiAjZGVmaW5lIFRSVV9NSV9ORVhUX1BBR0VfVFJBTlNNSVRfUkVHSVNURVIgICAgICA3ICovCi0jZGVmaW5lIFBIWV9MSU5LX1BBUlRORVJfTkVYVF9QQUdFIDB4MDgJLyogI2RlZmluZSBUUlVfTUlfTElOS19QQVJUTkVSX05FWFRfUEFHRV9SRUdJU1RFUiAgOCAqLwotI2RlZmluZSBQSFlfMTAwMF9DT05UUk9MICAgICAgICAgICAweDA5CS8qICNkZWZpbmUgVFJVX01JXzEwMDBCQVNFVF9DT05UUk9MX1JFR0lTVEVSICAgICAgIDkgKi8KLSNkZWZpbmUgUEhZXzEwMDBfU1RBVFVTICAgICAgICAgICAgMHgwQQkvKiAjZGVmaW5lIFRSVV9NSV8xMDAwQkFTRVRfU1RBVFVTX1JFR0lTVEVSICAgICAgICAxMCAqLwotCi0jZGVmaW5lIFBIWV9FWFRFTkRFRF9TVEFUVVMgICAgICAgIDB4MEYJLyogI2RlZmluZSBUUlVfTUlfRVhURU5ERURfU1RBVFVTX1JFR0lTVEVSICAgICAgICAgMTUgKi8KLQotLyogc29tZSBkZWZpbmVzIGZvciBtb2RlbSByZWdpc3RlcnMgdGhhdCBzZWVtIHRvIGJlICdyZXNlcnZlZCcgKi8KLSNkZWZpbmUgUEhZX0lOREVYX1JFRyAgICAgICAgICAgICAgMHgxMAotI2RlZmluZSBQSFlfREFUQV9SRUcgICAgICAgICAgICAgICAweDExCi0KLSNkZWZpbmUgUEhZX01QSFlfQ09OVFJPTF9SRUcgICAgICAgMHgxMgkvKiAjZGVmaW5lIFRSVV9WTUlfTVBIWV9DT05UUk9MX1JFR0lTVEVSICAgICAgICAgICAxOCAqLwotCi0jZGVmaW5lIFBIWV9MT09QQkFDS19DT05UUk9MICAgICAgIDB4MTMJLyogI2RlZmluZSBUUlVfVk1JX0xPT1BCQUNLX0NPTlRST0xfMV9SRUdJU1RFUiAgICAgMTkgKi8KLQkJCQkJLyogI2RlZmluZSBUUlVfVk1JX0xPT1BCQUNLX0NPTlRST0xfMl9SRUdJU1RFUiAgICAgMjAgKi8KLSNkZWZpbmUgUEhZX1JFR0lTVEVSX01HTVRfQ09OVFJPTCAgMHgxNQkvKiAjZGVmaW5lIFRSVV9WTUlfTUlfU0VRX0NPTlRST0xfUkVHSVNURVIgICAgICAgICAyMSAqLwotI2RlZmluZSBQSFlfQ09ORklHICAgICAgICAgICAgICAgICAweDE2CS8qICNkZWZpbmUgVFJVX1ZNSV9DT05GSUdVUkFUSU9OX1JFR0lTVEVSICAgICAgICAgIDIyICovCi0jZGVmaW5lIFBIWV9QSFlfQ09OVFJPTCAgICAgICAgICAgIDB4MTcJLyogI2RlZmluZSBUUlVfVk1JX1BIWV9DT05UUk9MX1JFR0lTVEVSICAgICAgICAgICAgMjMgKi8KLSNkZWZpbmUgUEhZX0lOVEVSUlVQVF9NQVNLICAgICAgICAgMHgxOAkvKiAjZGVmaW5lIFRSVV9WTUlfSU5URVJSVVBUX01BU0tfUkVHSVNURVIgICAgICAgICAyNCAqLwotI2RlZmluZSBQSFlfSU5URVJSVVBUX1NUQVRVUyAgICAgICAweDE5CS8qICNkZWZpbmUgVFJVX1ZNSV9JTlRFUlJVUFRfU1RBVFVTX1JFR0lTVEVSICAgICAgIDI1ICovCi0jZGVmaW5lIFBIWV9QSFlfU1RBVFVTICAgICAgICAgICAgIDB4MUEJLyogI2RlZmluZSBUUlVfVk1JX1BIWV9TVEFUVVNfUkVHSVNURVIgICAgICAgICAgICAgMjYgKi8KLSNkZWZpbmUgUEhZX0xFRF8xICAgICAgICAgICAgICAgICAgMHgxQgkvKiAjZGVmaW5lIFRSVV9WTUlfTEVEX0NPTlRST0xfMV9SRUdJU1RFUiAgICAgICAgICAyNyAqLwotI2RlZmluZSBQSFlfTEVEXzIgICAgICAgICAgICAgICAgICAweDFDCS8qICNkZWZpbmUgVFJVX1ZNSV9MRURfQ09OVFJPTF8yX1JFR0lTVEVSICAgICAgICAgIDI4ICovCi0JCQkJCS8qICNkZWZpbmUgVFJVX1ZNSV9MSU5LX0NPTlRST0xfUkVHSVNURVIgICAgICAgICAgIDI5ICovCi0JCQkJCS8qICNkZWZpbmUgVFJVX1ZNSV9USU1JTkdfQ09OVFJPTF9SRUdJU1RFUiAqLwotCi0jZW5kaWYgLyogX0VUMTMxMF9QSFlfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3BtLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9wbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWQ0ZDY2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzEwX3BtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoKLSAqIEFnZXJlIFN5c3RlbXMgSW5jLgotICogMTAvMTAwLzEwMDAgQmFzZS1UIEV0aGVybmV0IERyaXZlciBmb3IgdGhlIEVUMTMwMSBhbmQgRVQxMzF4IHNlcmllcyBNQUNzCi0gKgotICogQ29weXJpZ2h0IMKpIDIwMDUgQWdlcmUgU3lzdGVtcyBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogZXQxMzEwX3BtLmMgLSBBbGwgcG93ZXIgbWFuYWdlbWVudCByZWxhdGVkIGNvZGUgKG5vdCBjb21wbGV0ZWx5IGltcGxlbWVudGVkKQotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogU09GVFdBUkUgTElDRU5TRQotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAotICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwotICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbwotICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgotICoKLSAqIENvcHlyaWdodCDCqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICoKLSAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCi0gKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwotICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCi0gKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBEaXNjbGFpbWVyCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCi0gKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCi0gKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgotICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLSAqIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImV0MTMxeF92ZXJzaW9uLmgiCi0jaW5jbHVkZSAiZXQxMzF4X2RlZnMuaCIKLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLQotI2luY2x1ZGUgImV0MTMxMF9waHkuaCIKLSNpbmNsdWRlICJldDEzMTBfcnguaCIKLSNpbmNsdWRlICJldDEzMXhfYWRhcHRlci5oIgotI2luY2x1ZGUgImV0MTMxeC5oIgotCi0vKioKLSAqIEVuYWJsZVBoeUNvbWEgLSBjYWxsZWQgd2hlbiBuZXR3b3JrIGNhYmxlIGlzIHVucGx1Z2dlZAotICogQGV0ZGV2OiBwb2ludGVyIHRvIG91ciBhZGFwdGVyIHN0cnVjdHVyZQotICoKLSAqIGRyaXZlciByZWNlaXZlIGFuIHBoeSBzdGF0dXMgY2hhbmdlIGludGVycnVwdCB3aGlsZSBpbiBEMCBhbmQgY2hlY2sgdGhhdAotICogcGh5X3N0YXR1cyBpcyBkb3duLgotICoKLSAqICAgICAgICAgIC0tIGdhdGUgb2ZmIEpBR0NvcmU7Ci0gKiAgICAgICAgICAtLSBzZXQgZ2lnRSBQSFkgaW4gQ29tYSBtb2RlCi0gKiAgICAgICAgICAtLSB3YWtlIG9uIHBoeV9pbnRlcnJ1cHQ7IFBlcmZvcm0gc29mdHdhcmUgcmVzZXQgSkFHQ29yZSwKLSAqICAgICAgICAgICAgIHJlLWluaXRpYWxpemUgamFnY29yZSBhbmQgZ2lnRSBQSFkKLSAqCi0gKiAgICAgIEFkZCBEMC1BU1BNLVBoeUxpbmtEb3duIFN1cHBvcnQ6Ci0gKiAgICAgICAgICAtLSB3aGlsZSBpbiBEMCwgd2hlbiB0aGVyZSBpcyBhIHBoeV9pbnRlcnJ1cHQgaW5kaWNhdGluZyBwaHkgbGluawotICogICAgICAgICAgICAgZG93biBzdGF0dXMsIGNhbGwgdGhlIE1QU2V0UGh5Q29tYSByb3V0aW5lIHRvIGVudGVyIHRoaXMgYWN0aXZlCi0gKiAgICAgICAgICAgICBzdGF0ZSBwb3dlciBzYXZpbmcgbW9kZQotICogICAgICAgICAgLS0gd2hpbGUgaW4gRDAtQVNQTS1QaHlMaW5rRG93biBtb2RlLCB3aGVuIHRoZXJlIGlzIGEgcGh5X2ludGVycnVwdAotICogICAgICAgaW5kaWNhdGluZyBsaW5rdXAgc3RhdHVzLCBjYWxsIHRoZSBNUERpc2FibGVQaHlDb21hIHJvdXRpbmUgdG8KLSAqICAgICAgICAgICAgIHJlc3RvcmUgSkFHQ29yZSBhbmQgZ2lnRSBQSFkKLSAqLwotdm9pZCBFbmFibGVQaHlDb21hKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgcG1jc3I7Ci0KLQlwbWNzciA9IHJlYWRsKCZldGRldi0+cmVncy0+Z2xvYmFsLnBtX2Nzcik7Ci0KLQkvKiBTYXZlIHRoZSBHYkUgUEhZIHNwZWVkIGFuZCBkdXBsZXggbW9kZXMuIE5lZWQgdG8gcmVzdG9yZSB0aGlzCi0JICogd2hlbiBjYWJsZSBpcyBwbHVnZ2VkIGJhY2sgaW4KLQkgKi8KLQlldGRldi0+cGRvd25fc3BlZWQgPSBldGRldi0+QWlGb3JjZVNwZWVkOwotCWV0ZGV2LT5wZG93bl9kdXBsZXggPSBldGRldi0+QWlGb3JjZURweDsKLQotCS8qIFN0b3Agc2VuZGluZyBwYWNrZXRzLiAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZldGRldi0+c2VuZF9od19sb2NrLCBmbGFncyk7Ci0JZXRkZXYtPmZsYWdzIHw9IGZNUF9BREFQVEVSX0xPV0VSX1BPV0VSOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0ZGV2LT5zZW5kX2h3X2xvY2ssIGZsYWdzKTsKLQotCS8qIFdhaXQgZm9yIG91dHN0YW5kaW5nIFJlY2VpdmUgcGFja2V0cyAqLwotCi0JLyogR2F0ZSBvZmYgSkFHQ29yZSAzIGNsb2NrIGRvbWFpbnMgKi8KLQlwbWNzciAmPSB+RVRfUE1DU1JfSU5JVDsKLQl3cml0ZWwocG1jc3IsICZldGRldi0+cmVncy0+Z2xvYmFsLnBtX2Nzcik7Ci0KLQkvKiBQcm9ncmFtIGdpZ0UgUEhZIGluIHRvIENvbWEgbW9kZSAqLwotCXBtY3NyIHw9IEVUX1BNX1BIWV9TV19DT01BOwotCXdyaXRlbChwbWNzciwgJmV0ZGV2LT5yZWdzLT5nbG9iYWwucG1fY3NyKTsKLX0KLQotLyoqCi0gKiBEaXNhYmxlUGh5Q29tYSAtIERpc2FibGUgdGhlIFBoeSBDb21hIE1vZGUKLSAqIEBldGRldjogcG9pbnRlciB0byBvdXIgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqLwotdm9pZCBEaXNhYmxlUGh5Q29tYShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCXUzMiBwbWNzcjsKLQotCXBtY3NyID0gcmVhZGwoJmV0ZGV2LT5yZWdzLT5nbG9iYWwucG1fY3NyKTsKLQotCS8qIERpc2FibGUgcGh5X3N3X2NvbWEgcmVnaXN0ZXIgYW5kIHJlLWVuYWJsZSBKQUdDb3JlIGNsb2NrcyAqLwotCXBtY3NyIHw9IEVUX1BNQ1NSX0lOSVQ7Ci0JcG1jc3IgJj0gfkVUX1BNX1BIWV9TV19DT01BOwotCXdyaXRlbChwbWNzciwgJmV0ZGV2LT5yZWdzLT5nbG9iYWwucG1fY3NyKTsKLQotCS8qIFJlc3RvcmUgdGhlIEdiRSBQSFkgc3BlZWQgYW5kIGR1cGxleCBtb2RlczsKLQkgKiBSZXNldCBKQUdDb3JlOyByZS1jb25maWd1cmUgYW5kIGluaXRpYWxpemUgSkFHQ29yZSBhbmQgZ2lnRSBQSFkKLQkgKi8KLQlldGRldi0+QWlGb3JjZVNwZWVkID0gZXRkZXYtPnBkb3duX3NwZWVkOwotCWV0ZGV2LT5BaUZvcmNlRHB4ID0gZXRkZXYtPnBkb3duX2R1cGxleDsKLQotCS8qIFJlLWluaXRpYWxpemUgdGhlIHNlbmQgc3RydWN0dXJlcyAqLwotCWV0MTMxeF9pbml0X3NlbmQoZXRkZXYpOwotCi0JLyogUmVzZXQgdGhlIFJGRCBsaXN0IGFuZCByZS1zdGFydCBSVSAgKi8KLQlldDEzMXhfcmVzZXRfcmVjdihldGRldik7Ci0KLQkvKiBCcmluZyB0aGUgZGV2aWNlIGJhY2sgdG8gdGhlIHN0YXRlIGl0IHdhcyBkdXJpbmcgaW5pdCBwcmlvciB0bwotCSAqIGF1dG9uZWdvdGlhdGlvbiBiZWluZyBjb21wbGV0ZS4gIFRoaXMgd2F5LCB3aGVuIHdlIGdldCB0aGUgYXV0by1uZWcKLQkgKiBjb21wbGV0ZSBpbnRlcnJ1cHQsIHdlIGNhbiBjb21wbGV0ZSBpbml0IGJ5IGNhbGxpbmcgQ29uZmlnTWFjUkVHUzIuCi0JICovCi0JZXQxMzF4X3NvZnRfcmVzZXQoZXRkZXYpOwotCi0JLyogc2V0dXAgZXQxMzEwIGFzIHBlciB0aGUgZG9jdW1lbnRhdGlvbiA/PyAqLwotCWV0MTMxeF9hZGFwdGVyX3NldHVwKGV0ZGV2KTsKLQotCS8qIEFsbG93IFR4IHRvIHJlc3RhcnQgKi8KLQlldGRldi0+ZmxhZ3MgJj0gfmZNUF9BREFQVEVSX0xPV0VSX1BPV0VSOwotCi0JLyogTmVlZCB0byByZS1lbmFibGUgUnguICovCi0JZXQxMzF4X3J4X2RtYV9lbmFibGUoZXRkZXYpOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9yeC5jIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfcnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UzODZlMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9yeC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE1MiArMCwwIEBACi0vKgotICogQWdlcmUgU3lzdGVtcyBJbmMuCi0gKiAxMC8xMDAvMTAwMCBCYXNlLVQgRXRoZXJuZXQgRHJpdmVyIGZvciB0aGUgRVQxMzAxIGFuZCBFVDEzMXggc2VyaWVzIE1BQ3MKLSAqCi0gKiBDb3B5cmlnaHQgwqkgMjAwNSBBZ2VyZSBTeXN0ZW1zIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBldDEzMTBfcnguYyAtIFJvdXRpbmVzIHVzZWQgdG8gcGVyZm9ybSBkYXRhIHJlY2VwdGlvbgotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogU09GVFdBUkUgTElDRU5TRQotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAotICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwotICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbwotICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgotICoKLSAqIENvcHlyaWdodCDCqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICoKLSAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCi0gKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwotICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCi0gKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBEaXNjbGFpbWVyCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCi0gKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCi0gKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgotICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLSAqIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImV0MTMxeF92ZXJzaW9uLmgiCi0jaW5jbHVkZSAiZXQxMzF4X2RlZnMuaCIKLQotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0KLSNpbmNsdWRlICJldDEzMTBfcGh5LmgiCi0jaW5jbHVkZSAiZXQxMzF4X2FkYXB0ZXIuaCIKLSNpbmNsdWRlICJldDEzMTBfcnguaCIKLSNpbmNsdWRlICJldDEzMXguaCIKLQotc3RhdGljIGlubGluZSB1MzIgYnVtcF9mYnIodTMyICpmYnIsIHUzMiBsaW1pdCkKLXsKLQl1MzIgdiA9ICpmYnI7Ci0JdisrOwotCS8qIFRoaXMgd29ya3MgZm9yIGFsbCBjYXNlcyB3aGVyZSBsaW1pdCA8IDEwMjQuIFRoZSAxMDIzIGNhc2UKLQkgICB3b3JrcyBiZWNhdXNlIDEwMjMrKyBpcyAxMDI0IHdoaWNoIG1lYW5zIHRoZSBpZiBjb25kaXRpb24gaXMgbm90Ci0JICAgdGFrZW4gYnV0IHRoZSBjYXJyeSBvZiB0aGUgYml0IGludG8gdGhlIHdyYXAgYml0IHRvZ2dsZXMgdGhlIHdyYXAKLQkgICB2YWx1ZSBjb3JyZWN0bHkgKi8KLQlpZiAoKHYgJiBFVF9ETUExMF9NQVNLKSA+IGxpbWl0KSB7Ci0JCXYgJj0gfkVUX0RNQTEwX01BU0s7Ci0JCXYgXj0gRVRfRE1BMTBfV1JBUDsKLQl9Ci0JLyogRm9yIHRoZSAxMDIzIGNhc2UgKi8KLQl2ICY9IChFVF9ETUExMF9NQVNLfEVUX0RNQTEwX1dSQVApOwotCSpmYnIgPSB2OwotCXJldHVybiB2OwotfQotCi0vKioKLSAqIGV0MTMxeF9yeF9kbWFfbWVtb3J5X2FsbG9jCi0gKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpCi0gKgotICogQWxsb2NhdGVzIEZyZWUgYnVmZmVyIHJpbmcgMSBmb3Igc3VyZSwgZnJlZSBidWZmZXIgcmluZyAwIGlmIHJlcXVpcmVkLAotICogYW5kIHRoZSBQYWNrZXQgU3RhdHVzIFJpbmcuCi0gKi8KLWludCBldDEzMXhfcnhfZG1hX21lbW9yeV9hbGxvYyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JdTMyIGksIGo7Ci0JdTMyIGJ1ZnNpemU7Ci0JdTMyIHBrdFN0YXRSaW5nU2l6ZSwgRkJSQ2h1bmtTaXplOwotCXN0cnVjdCByeF9yaW5nICpyeF9yaW5nOwotCi0JLyogU2V0dXAgc29tZSBjb252ZW5pZW5jZSBwb2ludGVycyAqLwotCXJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZzsKLQotCS8qIEFsbG9jIG1lbW9yeSBmb3IgdGhlIGxvb2t1cCB0YWJsZSAqLwotI2lmZGVmIFVTRV9GQlIwCi0JcnhfcmluZy0+ZmJyWzBdID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZicl9sb29rdXApLCBHRlBfS0VSTkVMKTsKLSNlbmRpZgotCXJ4X3JpbmctPmZiclsxXSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmYnJfbG9va3VwKSwgR0ZQX0tFUk5FTCk7Ci0KLQkvKiBUaGUgZmlyc3QgdGhpbmcgd2Ugd2lsbCBkbyBpcyBjb25maWd1cmUgdGhlIHNpemVzIG9mIHRoZSBidWZmZXIKLQkgKiByaW5ncy4gVGhlc2Ugd2lsbCBjaGFuZ2UgYmFzZWQgb24ganVtYm8gcGFja2V0IHN1cHBvcnQuICBMYXJnZXIKLQkgKiBqdW1ibyBwYWNrZXRzIGluY3JlYXNlcyB0aGUgc2l6ZSBvZiBlYWNoIGVudHJ5IGluIEZCUjAsIGFuZCB0aGUKLQkgKiBudW1iZXIgb2YgZW50cmllcyBpbiBGQlIwLCB3aGlsZSBhdCB0aGUgc2FtZSB0aW1lIGRlY3JlYXNpbmcgdGhlCi0JICogbnVtYmVyIG9mIGVudHJpZXMgaW4gRkJSMS4KLQkgKgotCSAqIEZCUjEgaG9sZHMgImxhcmdlIiBmcmFtZXMsIEZCUjAgaG9sZHMgInNtYWxsIiBmcmFtZXMuICBJZiBGQlIxCi0JICogZW50cmllcyBhcmUgaHVnZSBpbiBvcmRlciB0byBhY2NvbW1vZGF0ZSBhICJqdW1ibyIgZnJhbWUsIHRoZW4gaXQKLQkgKiB3aWxsIGhhdmUgbGVzcyBlbnRyaWVzLiAgQ29udmVyc2VseSwgRkJSMSB3aWxsIG5vdyBiZSByZWxpZWQgdXBvbgotCSAqIHRvIGNhcnJ5IG1vcmUgIm5vcm1hbCIgZnJhbWVzLCB0aHVzIGl0J3MgZW50cnkgc2l6ZSBhbHNvIGluY3JlYXNlcwotCSAqIGFuZCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgZ29lcyB1cCB0b28gKHNpbmNlIGl0IG5vdyBjYXJyaWVzCi0JICogInNtYWxsIiArICJyZWd1bGFyIiBwYWNrZXRzLgotCSAqCi0JICogSW4gdGhpcyBzY2hlbWUsIHdlIHRyeSB0byBtYWludGFpbiA1MTIgZW50cmllcyBiZXR3ZWVuIHRoZSB0d28KLQkgKiByaW5ncy4gQWxzbywgRkJSMSByZW1haW5zIGEgY29uc3RhbnQgc2l6ZSAtIHdoZW4gaXQncyBzaXplIGRvdWJsZXMKLQkgKiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaGFsdmVzLiAgRkJSMCBpbmNyZWFzZXMgaW4gc2l6ZSwgaG93ZXZlci4KLQkgKi8KLQotCWlmIChhZGFwdGVyLT5SZWdpc3RyeUp1bWJvUGFja2V0IDwgMjA0OCkgewotI2lmZGVmIFVTRV9GQlIwCi0JCXJ4X3JpbmctPkZicjBCdWZmZXJTaXplID0gMjU2OwotCQlyeF9yaW5nLT5GYnIwTnVtRW50cmllcyA9IDUxMjsKLSNlbmRpZgotCQlyeF9yaW5nLT5GYnIxQnVmZmVyU2l6ZSA9IDIwNDg7Ci0JCXJ4X3JpbmctPkZicjFOdW1FbnRyaWVzID0gNTEyOwotCX0gZWxzZSBpZiAoYWRhcHRlci0+UmVnaXN0cnlKdW1ib1BhY2tldCA8IDQwOTYpIHsKLSNpZmRlZiBVU0VfRkJSMAotCQlyeF9yaW5nLT5GYnIwQnVmZmVyU2l6ZSA9IDUxMjsKLQkJcnhfcmluZy0+RmJyME51bUVudHJpZXMgPSAxMDI0OwotI2VuZGlmCi0JCXJ4X3JpbmctPkZicjFCdWZmZXJTaXplID0gNDA5NjsKLQkJcnhfcmluZy0+RmJyMU51bUVudHJpZXMgPSA1MTI7Ci0JfSBlbHNlIHsKLSNpZmRlZiBVU0VfRkJSMAotCQlyeF9yaW5nLT5GYnIwQnVmZmVyU2l6ZSA9IDEwMjQ7Ci0JCXJ4X3JpbmctPkZicjBOdW1FbnRyaWVzID0gNzY4OwotI2VuZGlmCi0JCXJ4X3JpbmctPkZicjFCdWZmZXJTaXplID0gMTYzODQ7Ci0JCXJ4X3JpbmctPkZicjFOdW1FbnRyaWVzID0gMTI4OwotCX0KLQotI2lmZGVmIFVTRV9GQlIwCi0JYWRhcHRlci0+cnhfcmluZy5Qc3JOdW1FbnRyaWVzID0gYWRhcHRlci0+cnhfcmluZy5GYnIwTnVtRW50cmllcyArCi0JICAgIGFkYXB0ZXItPnJ4X3JpbmcuRmJyMU51bUVudHJpZXM7Ci0jZWxzZQotCWFkYXB0ZXItPnJ4X3JpbmcuUHNyTnVtRW50cmllcyA9IGFkYXB0ZXItPnJ4X3JpbmcuRmJyMU51bUVudHJpZXM7Ci0jZW5kaWYKLQotCS8qIEFsbG9jYXRlIGFuIGFyZWEgb2YgbWVtb3J5IGZvciBGcmVlIEJ1ZmZlciBSaW5nIDEgKi8KLQlidWZzaXplID0gKHNpemVvZihzdHJ1Y3QgZmJyX2Rlc2MpICogcnhfcmluZy0+RmJyMU51bUVudHJpZXMpICsgMHhmZmY7Ci0JcnhfcmluZy0+cEZicjFSaW5nVmEgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LAotCQkJCQkJICAgIGJ1ZnNpemUsCi0JCQkJCQkgICAgJnJ4X3JpbmctPnBGYnIxUmluZ1BhKTsKLQlpZiAoIXJ4X3JpbmctPnBGYnIxUmluZ1ZhKSB7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCSAgIkNhbm5vdCBhbGxvYyBtZW1vcnkgZm9yIEZyZWUgQnVmZmVyIFJpbmcgMVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qIFNhdmUgcGh5c2ljYWwgYWRkcmVzcwotCSAqCi0JICogTk9URTogcGNpX2FsbG9jX2NvbnNpc3RlbnQoKSwgdXNlZCBhYm92ZSB0byBhbGxvYyBETUEgcmVnaW9ucywKLQkgKiBBTFdBWVMgcmV0dXJucyBTQUMgKDMyLWJpdCkgYWRkcmVzc2VzLiBJZiBEQUMgKDY0LWJpdCkgYWRkcmVzc2VzCi0JICogYXJlIGV2ZXIgcmV0dXJuZWQsIG1ha2Ugc3VyZSB0aGUgaGlnaCBwYXJ0IGlzIHJldHJpZXZlZCBoZXJlCi0JICogYmVmb3JlIHN0b3JpbmcgdGhlIGFkanVzdGVkIGFkZHJlc3MuCi0JICovCi0JcnhfcmluZy0+RmJyMVJlYWxwYSA9IHJ4X3JpbmctPnBGYnIxUmluZ1BhOwotCi0JLyogQWxpZ24gRnJlZSBCdWZmZXIgUmluZyAxIG9uIGEgNEsgYm91bmRhcnkgKi8KLQlldDEzMXhfYWxpZ25fYWxsb2NhdGVkX21lbW9yeShhZGFwdGVyLAotCQkJCSAgICAgICZyeF9yaW5nLT5GYnIxUmVhbHBhLAotCQkJCSAgICAgICZyeF9yaW5nLT5GYnIxb2Zmc2V0LCAweDBGRkYpOwotCi0JcnhfcmluZy0+cEZicjFSaW5nVmEgPSAodm9pZCAqKSgodTggKikgcnhfcmluZy0+cEZicjFSaW5nVmEgKwotCQkJCQlyeF9yaW5nLT5GYnIxb2Zmc2V0KTsKLQotI2lmZGVmIFVTRV9GQlIwCi0JLyogQWxsb2NhdGUgYW4gYXJlYSBvZiBtZW1vcnkgZm9yIEZyZWUgQnVmZmVyIFJpbmcgMCAqLwotCWJ1ZnNpemUgPSAoc2l6ZW9mKHN0cnVjdCBmYnJfZGVzYykgKiByeF9yaW5nLT5GYnIwTnVtRW50cmllcykgKyAweGZmZjsKLQlyeF9yaW5nLT5wRmJyMFJpbmdWYSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsCi0JCQkJCQkgICAgYnVmc2l6ZSwKLQkJCQkJCSAgICAmcnhfcmluZy0+cEZicjBSaW5nUGEpOwotCWlmICghcnhfcmluZy0+cEZicjBSaW5nVmEpIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJICAiQ2Fubm90IGFsbG9jIG1lbW9yeSBmb3IgRnJlZSBCdWZmZXIgUmluZyAwXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogU2F2ZSBwaHlzaWNhbCBhZGRyZXNzCi0JICoKLQkgKiBOT1RFOiBwY2lfYWxsb2NfY29uc2lzdGVudCgpLCB1c2VkIGFib3ZlIHRvIGFsbG9jIERNQSByZWdpb25zLAotCSAqIEFMV0FZUyByZXR1cm5zIFNBQyAoMzItYml0KSBhZGRyZXNzZXMuIElmIERBQyAoNjQtYml0KSBhZGRyZXNzZXMKLQkgKiBhcmUgZXZlciByZXR1cm5lZCwgbWFrZSBzdXJlIHRoZSBoaWdoIHBhcnQgaXMgcmV0cmlldmVkIGhlcmUgYmVmb3JlCi0JICogc3RvcmluZyB0aGUgYWRqdXN0ZWQgYWRkcmVzcy4KLQkgKi8KLQlyeF9yaW5nLT5GYnIwUmVhbHBhID0gcnhfcmluZy0+cEZicjBSaW5nUGE7Ci0KLQkvKiBBbGlnbiBGcmVlIEJ1ZmZlciBSaW5nIDAgb24gYSA0SyBib3VuZGFyeSAqLwotCWV0MTMxeF9hbGlnbl9hbGxvY2F0ZWRfbWVtb3J5KGFkYXB0ZXIsCi0JCQkJICAgICAgJnJ4X3JpbmctPkZicjBSZWFscGEsCi0JCQkJICAgICAgJnJ4X3JpbmctPkZicjBvZmZzZXQsIDB4MEZGRik7Ci0KLQlyeF9yaW5nLT5wRmJyMFJpbmdWYSA9ICh2b2lkICopKCh1OCAqKSByeF9yaW5nLT5wRmJyMFJpbmdWYSArCi0JCQkJCXJ4X3JpbmctPkZicjBvZmZzZXQpOwotI2VuZGlmCi0KLQlmb3IgKGkgPSAwOyBpIDwgKHJ4X3JpbmctPkZicjFOdW1FbnRyaWVzIC8gRkJSX0NIVU5LUyk7Ci0JICAgICBpKyspIHsKLQkJdTY0IEZicjFPZmZzZXQ7Ci0JCXU2NCBGYnIxVGVtcFBhOwotCQl1MzIgRmJyMUFsaWduOwotCi0JCS8qIFRoaXMgY29kZSBhbGxvY2F0ZXMgYW4gYXJlYSBvZiBtZW1vcnkgYmlnIGVub3VnaCBmb3IgTgotCQkgKiBmcmVlIGJ1ZmZlcnMgKyAoYnVmZmVyX3NpemUgLSAxKSBzbyB0aGF0IHRoZSBidWZmZXJzIGNhbgotCQkgKiBiZSBhbGlnbmVkIG9uIDRrIGJvdW5kYXJpZXMuICBJZiBlYWNoIGJ1ZmZlciB3ZXJlIGFsaWduZWQKLQkJICogdG8gYSBidWZmZXJfc2l6ZSBib3VuZGFyeSwgdGhlIGVmZmVjdCB3b3VsZCBiZSB0byBkb3VibGUKLQkJICogdGhlIHNpemUgb2YgRkJSMC4gIEJ5IGFsbG9jYXRpbmcgTiBidWZmZXJzIGF0IG9uY2UsIHdlCi0JCSAqIHJlZHVjZSB0aGlzIG92ZXJoZWFkLgotCQkgKi8KLQkJaWYgKHJ4X3JpbmctPkZicjFCdWZmZXJTaXplID4gNDA5NikKLQkJCUZicjFBbGlnbiA9IDQwOTY7Ci0JCWVsc2UKLQkJCUZicjFBbGlnbiA9IHJ4X3JpbmctPkZicjFCdWZmZXJTaXplOwotCi0JCUZCUkNodW5rU2l6ZSA9Ci0JCSAgICAoRkJSX0NIVU5LUyAqIHJ4X3JpbmctPkZicjFCdWZmZXJTaXplKSArIEZicjFBbGlnbiAtIDE7Ci0JCXJ4X3JpbmctPkZicjFNZW1WYVtpXSA9Ci0JCSAgICBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBGQlJDaHVua1NpemUsCi0JCQkJCSAmcnhfcmluZy0+RmJyMU1lbVBhW2ldKTsKLQotCQlpZiAoIXJ4X3JpbmctPkZicjFNZW1WYVtpXSkgewotCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJCSJDb3VsZCBub3QgYWxsb2MgbWVtb3J5XG4iKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KLQkJLyogU2VlIE5PVEUgaW4gIlNhdmUgUGh5c2ljYWwgQWRkcmVzcyIgY29tbWVudCBhYm92ZSAqLwotCQlGYnIxVGVtcFBhID0gcnhfcmluZy0+RmJyMU1lbVBhW2ldOwotCi0JCWV0MTMxeF9hbGlnbl9hbGxvY2F0ZWRfbWVtb3J5KGFkYXB0ZXIsCi0JCQkJCSAgICAgICZGYnIxVGVtcFBhLAotCQkJCQkgICAgICAmRmJyMU9mZnNldCwgKEZicjFBbGlnbiAtIDEpKTsKLQotCQlmb3IgKGogPSAwOyBqIDwgRkJSX0NIVU5LUzsgaisrKSB7Ci0JCQl1MzIgaW5kZXggPSAoaSAqIEZCUl9DSFVOS1MpICsgajsKLQotCQkJLyogU2F2ZSB0aGUgVmlydHVhbCBhZGRyZXNzIG9mIHRoaXMgaW5kZXggZm9yIHF1aWNrCi0JCQkgKiBhY2Nlc3MgbGF0ZXIKLQkJCSAqLwotCQkJcnhfcmluZy0+ZmJyWzFdLT52aXJ0W2luZGV4XSA9Ci0JCQkgICAgKHU4ICopIHJ4X3JpbmctPkZicjFNZW1WYVtpXSArCi0JCQkgICAgKGogKiByeF9yaW5nLT5GYnIxQnVmZmVyU2l6ZSkgKyBGYnIxT2Zmc2V0OwotCi0JCQkvKiBub3cgc3RvcmUgdGhlIHBoeXNpY2FsIGFkZHJlc3MgaW4gdGhlIGRlc2NyaXB0b3IKLQkJCSAqIHNvIHRoZSBkZXZpY2UgY2FuIGFjY2VzcyBpdAotCQkJICovCi0JCQlyeF9yaW5nLT5mYnJbMV0tPmJ1c19oaWdoW2luZGV4XSA9Ci0JCQkgICAgKHUzMikgKEZicjFUZW1wUGEgPj4gMzIpOwotCQkJcnhfcmluZy0+ZmJyWzFdLT5idXNfbG93W2luZGV4XSA9ICh1MzIpIEZicjFUZW1wUGE7Ci0KLQkJCUZicjFUZW1wUGEgKz0gcnhfcmluZy0+RmJyMUJ1ZmZlclNpemU7Ci0KLQkJCXJ4X3JpbmctPmZiclsxXS0+YnVmZmVyMVtpbmRleF0gPQotCQkJICAgIHJ4X3JpbmctPmZiclsxXS0+dmlydFtpbmRleF07Ci0JCQlyeF9yaW5nLT5mYnJbMV0tPmJ1ZmZlcjJbaW5kZXhdID0KLQkJCSAgICByeF9yaW5nLT5mYnJbMV0tPnZpcnRbaW5kZXhdIC0gNDsKLQkJfQotCX0KLQotI2lmZGVmIFVTRV9GQlIwCi0JLyogU2FtZSBmb3IgRkJSMCAoaWYgaW4gdXNlKSAqLwotCWZvciAoaSA9IDA7IGkgPCAocnhfcmluZy0+RmJyME51bUVudHJpZXMgLyBGQlJfQ0hVTktTKTsKLQkgICAgIGkrKykgewotCQl1NjQgRmJyME9mZnNldDsKLQkJdTY0IEZicjBUZW1wUGE7Ci0KLQkJRkJSQ2h1bmtTaXplID0gKChGQlJfQ0hVTktTICsgMSkgKiByeF9yaW5nLT5GYnIwQnVmZmVyU2l6ZSkgLSAxOwotCQlyeF9yaW5nLT5GYnIwTWVtVmFbaV0gPQotCQkgICAgcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgRkJSQ2h1bmtTaXplLAotCQkJCQkgJnJ4X3JpbmctPkZicjBNZW1QYVtpXSk7Ci0KLQkJaWYgKCFyeF9yaW5nLT5GYnIwTWVtVmFbaV0pIHsKLQkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCQkiQ291bGQgbm90IGFsbG9jIG1lbW9yeVxuIik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCi0JCS8qIFNlZSBOT1RFIGluICJTYXZlIFBoeXNpY2FsIEFkZHJlc3MiIGNvbW1lbnQgYWJvdmUgKi8KLQkJRmJyMFRlbXBQYSA9IHJ4X3JpbmctPkZicjBNZW1QYVtpXTsKLQotCQlldDEzMXhfYWxpZ25fYWxsb2NhdGVkX21lbW9yeShhZGFwdGVyLAotCQkJCQkgICAgICAmRmJyMFRlbXBQYSwKLQkJCQkJICAgICAgJkZicjBPZmZzZXQsCi0JCQkJCSAgICAgIHJ4X3JpbmctPkZicjBCdWZmZXJTaXplIC0gMSk7Ci0KLQkJZm9yIChqID0gMDsgaiA8IEZCUl9DSFVOS1M7IGorKykgewotCQkJdTMyIGluZGV4ID0gKGkgKiBGQlJfQ0hVTktTKSArIGo7Ci0KLQkJCXJ4X3JpbmctPmZiclswXS0+dmlydFtpbmRleF0gPQotCQkJICAgICh1OCAqKSByeF9yaW5nLT5GYnIwTWVtVmFbaV0gKwotCQkJICAgIChqICogcnhfcmluZy0+RmJyMEJ1ZmZlclNpemUpICsgRmJyME9mZnNldDsKLQotCQkJcnhfcmluZy0+ZmJyWzBdLT5idXNfaGlnaFtpbmRleF0gPQotCQkJICAgICh1MzIpIChGYnIwVGVtcFBhID4+IDMyKTsKLQkJCXJ4X3JpbmctPmZiclswXS0+YnVzX2xvd1tpbmRleF0gPSAodTMyKSBGYnIwVGVtcFBhOwotCi0JCQlGYnIwVGVtcFBhICs9IHJ4X3JpbmctPkZicjBCdWZmZXJTaXplOwotCi0JCQlyeF9yaW5nLT5mYnJbMF0tPmJ1ZmZlcjFbaW5kZXhdID0KLQkJCSAgICByeF9yaW5nLT5mYnJbMF0tPnZpcnRbaW5kZXhdOwotCQkJcnhfcmluZy0+ZmJyWzBdLT5idWZmZXIyW2luZGV4XSA9Ci0JCQkgICAgcnhfcmluZy0+ZmJyWzBdLT52aXJ0W2luZGV4XSAtIDQ7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCS8qIEFsbG9jYXRlIGFuIGFyZWEgb2YgbWVtb3J5IGZvciBGSUZPIG9mIFBhY2tldCBTdGF0dXMgcmluZyBlbnRyaWVzICovCi0JcGt0U3RhdFJpbmdTaXplID0KLQkgICAgc2l6ZW9mKHN0cnVjdCBwa3Rfc3RhdF9kZXNjKSAqIGFkYXB0ZXItPnJ4X3JpbmcuUHNyTnVtRW50cmllczsKLQotCXJ4X3JpbmctPnBQU1JpbmdWYSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsCi0JCQkJCQkgIHBrdFN0YXRSaW5nU2l6ZSwKLQkJCQkJCSAgJnJ4X3JpbmctPnBQU1JpbmdQYSk7Ci0KLQlpZiAoIXJ4X3JpbmctPnBQU1JpbmdWYSkgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkgICJDYW5ub3QgYWxsb2MgbWVtb3J5IGZvciBQYWNrZXQgU3RhdHVzIFJpbmdcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcHJpbnRrKEtFUk5fSU5GTyAiUFNSICVseFxuIiwgKHVuc2lnbmVkIGxvbmcpIHJ4X3JpbmctPnBQU1JpbmdQYSk7Ci0KLQkvKgotCSAqIE5PVEUgOiBwY2lfYWxsb2NfY29uc2lzdGVudCgpLCB1c2VkIGFib3ZlIHRvIGFsbG9jIERNQSByZWdpb25zLAotCSAqIEFMV0FZUyByZXR1cm5zIFNBQyAoMzItYml0KSBhZGRyZXNzZXMuIElmIERBQyAoNjQtYml0KSBhZGRyZXNzZXMKLQkgKiBhcmUgZXZlciByZXR1cm5lZCwgbWFrZSBzdXJlIHRoZSBoaWdoIHBhcnQgaXMgcmV0cmlldmVkIGhlcmUgYmVmb3JlCi0JICogc3RvcmluZyB0aGUgYWRqdXN0ZWQgYWRkcmVzcy4KLQkgKi8KLQotCS8qIEFsbG9jYXRlIGFuIGFyZWEgb2YgbWVtb3J5IGZvciB3cml0ZWJhY2sgb2Ygc3RhdHVzIGluZm9ybWF0aW9uICovCi0JcnhfcmluZy0+cnhfc3RhdHVzX2Jsb2NrID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwKLQkJCQkJICAgIHNpemVvZihzdHJ1Y3Qgcnhfc3RhdHVzX2Jsb2NrKSwKLQkJCQkJICAgICZyeF9yaW5nLT5yeF9zdGF0dXNfYnVzKTsKLQlpZiAoIXJ4X3JpbmctPnJ4X3N0YXR1c19ibG9jaykgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkgICJDYW5ub3QgYWxsb2MgbWVtb3J5IGZvciBTdGF0dXMgQmxvY2tcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcnhfcmluZy0+TnVtUmZkID0gTklDX0RFRkFVTFRfTlVNX1JGRDsKLQlwcmludGsoS0VSTl9JTkZPICJQUlMgJWx4XG4iLCAodW5zaWduZWQgbG9uZylyeF9yaW5nLT5yeF9zdGF0dXNfYnVzKTsKLQotCS8qIFJlY3YKLQkgKiBwY2lfcG9vbF9jcmVhdGUgaW5pdGlhbGl6ZXMgYSBsb29rYXNpZGUgbGlzdC4gQWZ0ZXIgc3VjY2Vzc2Z1bAotCSAqIGNyZWF0aW9uLCBub25wYWdlZCBmaXhlZC1zaXplIGJsb2NrcyBjYW4gYmUgYWxsb2NhdGVkIGZyb20gYW5kCi0JICogZnJlZWQgdG8gdGhlIGxvb2thc2lkZSBsaXN0LgotCSAqIFJGRHMgd2lsbCBiZSBhbGxvY2F0ZWQgZnJvbSB0aGlzIHBvb2wuCi0JICovCi0JcnhfcmluZy0+UmVjdkxvb2thc2lkZSA9IGttZW1fY2FjaGVfY3JlYXRlKGFkYXB0ZXItPm5ldGRldi0+bmFtZSwKLQkJCQkJCSAgIHNpemVvZihzdHJ1Y3QgcmZkKSwKLQkJCQkJCSAgIDAsCi0JCQkJCQkgICBTTEFCX0NBQ0hFX0RNQSB8Ci0JCQkJCQkgICBTTEFCX0hXQ0FDSEVfQUxJR04sCi0JCQkJCQkgICBOVUxMKTsKLQotCWFkYXB0ZXItPmZsYWdzIHw9IGZNUF9BREFQVEVSX1JFQ1ZfTE9PS0FTSURFOwotCi0JLyogVGhlIFJGRHMgYXJlIGdvaW5nIHRvIGJlIHB1dCBvbiBsaXN0cyBsYXRlciBvbiwgc28gaW5pdGlhbGl6ZSB0aGUKLQkgKiBsaXN0cyBub3cuCi0JICovCi0JSU5JVF9MSVNUX0hFQUQoJnJ4X3JpbmctPlJlY3ZMaXN0KTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBldDEzMXhfcnhfZG1hX21lbW9yeV9mcmVlIC0gRnJlZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCB3aXRoaW4gdGhpcyBtb2R1bGUuCi0gKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQotICovCi12b2lkIGV0MTMxeF9yeF9kbWFfbWVtb3J5X2ZyZWUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQotewotCXUzMiBpbmRleDsKLQl1MzIgYnVmc2l6ZTsKLQl1MzIgcGt0U3RhdFJpbmdTaXplOwotCXN0cnVjdCByZmQgKnJmZDsKLQlzdHJ1Y3QgcnhfcmluZyAqcnhfcmluZzsKLQotCS8qIFNldHVwIHNvbWUgY29udmVuaWVuY2UgcG9pbnRlcnMgKi8KLQlyeF9yaW5nID0gJmFkYXB0ZXItPnJ4X3Jpbmc7Ci0KLQkvKiBGcmVlIFJGRHMgYW5kIGFzc29jaWF0ZWQgcGFja2V0IGRlc2NyaXB0b3JzICovCi0JV0FSTl9PTihyeF9yaW5nLT5uUmVhZHlSZWN2ICE9IHJ4X3JpbmctPk51bVJmZCk7Ci0KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJnJ4X3JpbmctPlJlY3ZMaXN0KSkgewotCQlyZmQgPSAoc3RydWN0IHJmZCAqKSBsaXN0X2VudHJ5KHJ4X3JpbmctPlJlY3ZMaXN0Lm5leHQsCi0JCQkJc3RydWN0IHJmZCwgbGlzdF9ub2RlKTsKLQotCQlsaXN0X2RlbCgmcmZkLT5saXN0X25vZGUpOwotCQlyZmQtPnNrYiA9IE5VTEw7Ci0JCWttZW1fY2FjaGVfZnJlZShhZGFwdGVyLT5yeF9yaW5nLlJlY3ZMb29rYXNpZGUsIHJmZCk7Ci0JfQotCi0JLyogRnJlZSBGcmVlIEJ1ZmZlciBSaW5nIDEgKi8KLQlpZiAocnhfcmluZy0+cEZicjFSaW5nVmEpIHsKLQkJLyogRmlyc3QgdGhlIHBhY2tldCBtZW1vcnkgKi8KLQkJZm9yIChpbmRleCA9IDA7IGluZGV4IDwKLQkJICAgICAocnhfcmluZy0+RmJyMU51bUVudHJpZXMgLyBGQlJfQ0hVTktTKTsgaW5kZXgrKykgewotCQkJaWYgKHJ4X3JpbmctPkZicjFNZW1WYVtpbmRleF0pIHsKLQkJCQl1MzIgRmJyMUFsaWduOwotCi0JCQkJaWYgKHJ4X3JpbmctPkZicjFCdWZmZXJTaXplID4gNDA5NikKLQkJCQkJRmJyMUFsaWduID0gNDA5NjsKLQkJCQllbHNlCi0JCQkJCUZicjFBbGlnbiA9IHJ4X3JpbmctPkZicjFCdWZmZXJTaXplOwotCi0JCQkJYnVmc2l6ZSA9Ci0JCQkJICAgIChyeF9yaW5nLT5GYnIxQnVmZmVyU2l6ZSAqIEZCUl9DSFVOS1MpICsKLQkJCQkgICAgRmJyMUFsaWduIC0gMTsKLQotCQkJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwKLQkJCQkJCSAgICBidWZzaXplLAotCQkJCQkJICAgIHJ4X3JpbmctPkZicjFNZW1WYVtpbmRleF0sCi0JCQkJCQkgICAgcnhfcmluZy0+RmJyMU1lbVBhW2luZGV4XSk7Ci0KLQkJCQlyeF9yaW5nLT5GYnIxTWVtVmFbaW5kZXhdID0gTlVMTDsKLQkJCX0KLQkJfQotCi0JCS8qIE5vdyB0aGUgRklGTyBpdHNlbGYgKi8KLQkJcnhfcmluZy0+cEZicjFSaW5nVmEgPSAodm9pZCAqKSgodTggKikKLQkJCQlyeF9yaW5nLT5wRmJyMVJpbmdWYSAtIHJ4X3JpbmctPkZicjFvZmZzZXQpOwotCi0JCWJ1ZnNpemUgPSAoc2l6ZW9mKHN0cnVjdCBmYnJfZGVzYykgKiByeF9yaW5nLT5GYnIxTnVtRW50cmllcykKLQkJCQkJCQkgICAgKyAweGZmZjsKLQotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsIGJ1ZnNpemUsCi0JCQkJcnhfcmluZy0+cEZicjFSaW5nVmEsIHJ4X3JpbmctPnBGYnIxUmluZ1BhKTsKLQotCQlyeF9yaW5nLT5wRmJyMVJpbmdWYSA9IE5VTEw7Ci0JfQotCi0jaWZkZWYgVVNFX0ZCUjAKLQkvKiBOb3cgdGhlIHNhbWUgZm9yIEZyZWUgQnVmZmVyIFJpbmcgMCAqLwotCWlmIChyeF9yaW5nLT5wRmJyMFJpbmdWYSkgewotCQkvKiBGaXJzdCB0aGUgcGFja2V0IG1lbW9yeSAqLwotCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPAotCQkgICAgIChyeF9yaW5nLT5GYnIwTnVtRW50cmllcyAvIEZCUl9DSFVOS1MpOyBpbmRleCsrKSB7Ci0JCQlpZiAocnhfcmluZy0+RmJyME1lbVZhW2luZGV4XSkgewotCQkJCWJ1ZnNpemUgPQotCQkJCSAgICAocnhfcmluZy0+RmJyMEJ1ZmZlclNpemUgKgotCQkJCSAgICAgKEZCUl9DSFVOS1MgKyAxKSkgLSAxOwotCi0JCQkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LAotCQkJCQkJICAgIGJ1ZnNpemUsCi0JCQkJCQkgICAgcnhfcmluZy0+RmJyME1lbVZhW2luZGV4XSwKLQkJCQkJCSAgICByeF9yaW5nLT5GYnIwTWVtUGFbaW5kZXhdKTsKLQotCQkJCXJ4X3JpbmctPkZicjBNZW1WYVtpbmRleF0gPSBOVUxMOwotCQkJfQotCQl9Ci0KLQkJLyogTm93IHRoZSBGSUZPIGl0c2VsZiAqLwotCQlyeF9yaW5nLT5wRmJyMFJpbmdWYSA9ICh2b2lkICopKCh1OCAqKQotCQkJCXJ4X3JpbmctPnBGYnIwUmluZ1ZhIC0gcnhfcmluZy0+RmJyMG9mZnNldCk7Ci0KLQkJYnVmc2l6ZSA9IChzaXplb2Yoc3RydWN0IGZicl9kZXNjKSAqIHJ4X3JpbmctPkZicjBOdW1FbnRyaWVzKQotCQkJCQkJCSAgICArIDB4ZmZmOwotCi0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwKLQkJCQkgICAgYnVmc2l6ZSwKLQkJCQkgICAgcnhfcmluZy0+cEZicjBSaW5nVmEsIHJ4X3JpbmctPnBGYnIwUmluZ1BhKTsKLQotCQlyeF9yaW5nLT5wRmJyMFJpbmdWYSA9IE5VTEw7Ci0JfQotI2VuZGlmCi0KLQkvKiBGcmVlIFBhY2tldCBTdGF0dXMgUmluZyAqLwotCWlmIChyeF9yaW5nLT5wUFNSaW5nVmEpIHsKLQkJcGt0U3RhdFJpbmdTaXplID0KLQkJICBzaXplb2Yoc3RydWN0IHBrdF9zdGF0X2Rlc2MpICogYWRhcHRlci0+cnhfcmluZy5Qc3JOdW1FbnRyaWVzOwotCi0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwgcGt0U3RhdFJpbmdTaXplLAotCQkJCSAgICByeF9yaW5nLT5wUFNSaW5nVmEsIHJ4X3JpbmctPnBQU1JpbmdQYSk7Ci0KLQkJcnhfcmluZy0+cFBTUmluZ1ZhID0gTlVMTDsKLQl9Ci0KLQkvKiBGcmVlIGFyZWEgb2YgbWVtb3J5IGZvciB0aGUgd3JpdGViYWNrIG9mIHN0YXR1cyBpbmZvcm1hdGlvbiAqLwotCWlmIChyeF9yaW5nLT5yeF9zdGF0dXNfYmxvY2spIHsKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LAotCQkJc2l6ZW9mKHN0cnVjdCByeF9zdGF0dXNfYmxvY2spLAotCQkJcnhfcmluZy0+cnhfc3RhdHVzX2Jsb2NrLCByeF9yaW5nLT5yeF9zdGF0dXNfYnVzKTsKLQkJcnhfcmluZy0+cnhfc3RhdHVzX2Jsb2NrID0gTlVMTDsKLQl9Ci0KLQkvKiBGcmVlIHJlY2VpdmUgYnVmZmVyIHBvb2wgKi8KLQotCS8qIEZyZWUgcmVjZWl2ZSBwYWNrZXQgcG9vbCAqLwotCi0JLyogRGVzdHJveSB0aGUgbG9va2FzaWRlIChSRkQpIHBvb2wgKi8KLQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBmTVBfQURBUFRFUl9SRUNWX0xPT0tBU0lERSkgewotCQlrbWVtX2NhY2hlX2Rlc3Ryb3kocnhfcmluZy0+UmVjdkxvb2thc2lkZSk7Ci0JCWFkYXB0ZXItPmZsYWdzICY9IH5mTVBfQURBUFRFUl9SRUNWX0xPT0tBU0lERTsKLQl9Ci0KLQkvKiBGcmVlIHRoZSBGQlIgTG9va3VwIFRhYmxlICovCi0jaWZkZWYgVVNFX0ZCUjAKLQlrZnJlZShyeF9yaW5nLT5mYnJbMF0pOwotI2VuZGlmCi0KLQlrZnJlZShyeF9yaW5nLT5mYnJbMV0pOwotCi0JLyogUmVzZXQgQ291bnRlcnMgKi8KLQlyeF9yaW5nLT5uUmVhZHlSZWN2ID0gMDsKLX0KLQotLyoqCi0gKiBldDEzMXhfaW5pdF9yZWN2IC0gSW5pdGlhbGl6ZSByZWNlaXZlIGRhdGEgc3RydWN0dXJlcy4KLSAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIGVycm5vIG9uIGZhaWx1cmUgKGFzIGRlZmluZWQgaW4gZXJybm8uaCkKLSAqLwotaW50IGV0MTMxeF9pbml0X3JlY3Yoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQotewotCWludCBzdGF0dXMgPSAtRU5PTUVNOwotCXN0cnVjdCByZmQgKnJmZCA9IE5VTEw7Ci0JdTMyIHJmZGN0OwotCXUzMiBudW1yZmQgPSAwOwotCXN0cnVjdCByeF9yaW5nICpyeF9yaW5nOwotCi0JLyogU2V0dXAgc29tZSBjb252ZW5pZW5jZSBwb2ludGVycyAqLwotCXJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZzsKLQotCS8qIFNldHVwIGVhY2ggUkZEICovCi0JZm9yIChyZmRjdCA9IDA7IHJmZGN0IDwgcnhfcmluZy0+TnVtUmZkOyByZmRjdCsrKSB7Ci0JCXJmZCA9IGttZW1fY2FjaGVfYWxsb2MocnhfcmluZy0+UmVjdkxvb2thc2lkZSwKLQkJCQkJCSAgICAgR0ZQX0FUT01JQyB8IEdGUF9ETUEpOwotCi0JCWlmICghcmZkKSB7Ci0JCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkJICAiQ291bGRuJ3QgYWxsb2MgUkZEIG91dCBvZiBrbWVtX2NhY2hlXG4iKTsKLQkJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXJmZC0+c2tiID0gTlVMTDsKLQotCQkvKiBBZGQgdGhpcyBSRkQgdG8gdGhlIFJlY3ZMaXN0ICovCi0JCWxpc3RfYWRkX3RhaWwoJnJmZC0+bGlzdF9ub2RlLCAmcnhfcmluZy0+UmVjdkxpc3QpOwotCi0JCS8qIEluY3JlbWVudCBib3RoIHRoZSBhdmFpbGFibGUgUkZEJ3MsIGFuZCB0aGUgdG90YWwgUkZEJ3MuICovCi0JCXJ4X3JpbmctPm5SZWFkeVJlY3YrKzsKLQkJbnVtcmZkKys7Ci0JfQotCi0JaWYgKG51bXJmZCA+IE5JQ19NSU5fTlVNX1JGRCkKLQkJc3RhdHVzID0gMDsKLQotCXJ4X3JpbmctPk51bVJmZCA9IG51bXJmZDsKLQotCWlmIChzdGF0dXMgIT0gMCkgewotCQlrbWVtX2NhY2hlX2ZyZWUocnhfcmluZy0+UmVjdkxvb2thc2lkZSwgcmZkKTsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJICAiQWxsb2NhdGlvbiBwcm9ibGVtcyBpbiBldDEzMXhfaW5pdF9yZWN2XG4iKTsKLQl9Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqCi0gKiBDb25maWdSeERtYVJlZ3MgLSBTdGFydCBvZiBSeF9ETUEgaW5pdCBzZXF1ZW5jZQotICogQGV0ZGV2OiBwb2ludGVyIHRvIG91ciBhZGFwdGVyIHN0cnVjdHVyZQotICovCi12b2lkIENvbmZpZ1J4RG1hUmVncyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCXN0cnVjdCByeGRtYV9yZWdzIF9faW9tZW0gKnJ4X2RtYSA9ICZldGRldi0+cmVncy0+cnhkbWE7Ci0Jc3RydWN0IHJ4X3JpbmcgKnJ4X2xvY2FsID0gJmV0ZGV2LT5yeF9yaW5nOwotCXN0cnVjdCBmYnJfZGVzYyAqZmJyX2VudHJ5OwotCXUzMiBlbnRyeTsKLQl1MzIgcHNyX251bV9kZXM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIEhhbHQgUlhETUEgdG8gcGVyZm9ybSB0aGUgcmVjb25maWd1cmUuICAqLwotCWV0MTMxeF9yeF9kbWFfZGlzYWJsZShldGRldik7Ci0KLQkvKiBMb2FkIHRoZSBjb21wbGV0aW9uIHdyaXRlYmFjayBwaHlzaWNhbCBhZGRyZXNzCi0JICoKLQkgKiBOT1RFIDogcGNpX2FsbG9jX2NvbnNpc3RlbnQoKSwgdXNlZCBhYm92ZSB0byBhbGxvYyBETUEgcmVnaW9ucywKLQkgKiBBTFdBWVMgcmV0dXJucyBTQUMgKDMyLWJpdCkgYWRkcmVzc2VzLiBJZiBEQUMgKDY0LWJpdCkgYWRkcmVzc2VzCi0JICogYXJlIGV2ZXIgcmV0dXJuZWQsIG1ha2Ugc3VyZSB0aGUgaGlnaCBwYXJ0IGlzIHJldHJpZXZlZCBoZXJlCi0JICogYmVmb3JlIHN0b3JpbmcgdGhlIGFkanVzdGVkIGFkZHJlc3MuCi0JICovCi0Jd3JpdGVsKCh1MzIpICgodTY0KXJ4X2xvY2FsLT5yeF9zdGF0dXNfYnVzID4+IDMyKSwKLQkgICAgICAgJnJ4X2RtYS0+ZG1hX3diX2Jhc2VfaGkpOwotCXdyaXRlbCgodTMyKSByeF9sb2NhbC0+cnhfc3RhdHVzX2J1cywgJnJ4X2RtYS0+ZG1hX3diX2Jhc2VfbG8pOwotCi0JbWVtc2V0KHJ4X2xvY2FsLT5yeF9zdGF0dXNfYmxvY2ssIDAsIHNpemVvZihzdHJ1Y3Qgcnhfc3RhdHVzX2Jsb2NrKSk7Ci0KLQkvKiBTZXQgdGhlIGFkZHJlc3MgYW5kIHBhcmFtZXRlcnMgb2YgdGhlIHBhY2tldCBzdGF0dXMgcmluZyBpbnRvIHRoZQotCSAqIDEzMTAncyByZWdpc3RlcnMKLQkgKi8KLQl3cml0ZWwoKHUzMikgKCh1NjQpcnhfbG9jYWwtPnBQU1JpbmdQYSA+PiAzMiksCi0JICAgICAgICZyeF9kbWEtPnBzcl9iYXNlX2hpKTsKLQl3cml0ZWwoKHUzMikgcnhfbG9jYWwtPnBQU1JpbmdQYSwgJnJ4X2RtYS0+cHNyX2Jhc2VfbG8pOwotCXdyaXRlbChyeF9sb2NhbC0+UHNyTnVtRW50cmllcyAtIDEsICZyeF9kbWEtPnBzcl9udW1fZGVzKTsKLQl3cml0ZWwoMCwgJnJ4X2RtYS0+cHNyX2Z1bGxfb2Zmc2V0KTsKLQotCXBzcl9udW1fZGVzID0gcmVhZGwoJnJ4X2RtYS0+cHNyX251bV9kZXMpICYgMHhGRkY7Ci0Jd3JpdGVsKChwc3JfbnVtX2RlcyAqIExPX01BUktfUEVSQ0VOVF9GT1JfUFNSKSAvIDEwMCwKLQkgICAgICAgJnJ4X2RtYS0+cHNyX21pbl9kZXMpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5yY3ZfbG9jaywgZmxhZ3MpOwotCi0JLyogVGhlc2UgbG9jYWwgdmFyaWFibGVzIHRyYWNrIHRoZSBQU1IgaW4gdGhlIGFkYXB0ZXIgc3RydWN0dXJlICovCi0JcnhfbG9jYWwtPmxvY2FsX3Bzcl9mdWxsID0gMDsKLQotCS8qIE5vdydzIHRoZSBiZXN0IHRpbWUgdG8gaW5pdGlhbGl6ZSBGQlIxIGNvbnRlbnRzICovCi0JZmJyX2VudHJ5ID0gKHN0cnVjdCBmYnJfZGVzYyAqKSByeF9sb2NhbC0+cEZicjFSaW5nVmE7Ci0JZm9yIChlbnRyeSA9IDA7IGVudHJ5IDwgcnhfbG9jYWwtPkZicjFOdW1FbnRyaWVzOyBlbnRyeSsrKSB7Ci0JCWZicl9lbnRyeS0+YWRkcl9oaSA9IHJ4X2xvY2FsLT5mYnJbMV0tPmJ1c19oaWdoW2VudHJ5XTsKLQkJZmJyX2VudHJ5LT5hZGRyX2xvID0gcnhfbG9jYWwtPmZiclsxXS0+YnVzX2xvd1tlbnRyeV07Ci0JCWZicl9lbnRyeS0+d29yZDIgPSBlbnRyeTsKLQkJZmJyX2VudHJ5Kys7Ci0JfQotCi0JLyogU2V0IHRoZSBhZGRyZXNzIGFuZCBwYXJhbWV0ZXJzIG9mIEZyZWUgYnVmZmVyIHJpbmcgMSAoYW5kIDAgaWYKLQkgKiByZXF1aXJlZCkgaW50byB0aGUgMTMxMCdzIHJlZ2lzdGVycwotCSAqLwotCXdyaXRlbCgodTMyKSAocnhfbG9jYWwtPkZicjFSZWFscGEgPj4gMzIpLCAmcnhfZG1hLT5mYnIxX2Jhc2VfaGkpOwotCXdyaXRlbCgodTMyKSByeF9sb2NhbC0+RmJyMVJlYWxwYSwgJnJ4X2RtYS0+ZmJyMV9iYXNlX2xvKTsKLQl3cml0ZWwocnhfbG9jYWwtPkZicjFOdW1FbnRyaWVzIC0gMSwgJnJ4X2RtYS0+ZmJyMV9udW1fZGVzKTsKLQl3cml0ZWwoRVRfRE1BMTBfV1JBUCwgJnJ4X2RtYS0+ZmJyMV9mdWxsX29mZnNldCk7Ci0KLQkvKiBUaGlzIHZhcmlhYmxlIHRyYWNrcyB0aGUgZnJlZSBidWZmZXIgcmluZyAxIGZ1bGwgcG9zaXRpb24sIHNvIGl0Ci0JICogaGFzIHRvIG1hdGNoIHRoZSBhYm92ZS4KLQkgKi8KLQlyeF9sb2NhbC0+bG9jYWxfRmJyMV9mdWxsID0gRVRfRE1BMTBfV1JBUDsKLQl3cml0ZWwoKChyeF9sb2NhbC0+RmJyMU51bUVudHJpZXMgKiBMT19NQVJLX1BFUkNFTlRfRk9SX1JYKSAvIDEwMCkgLSAxLAotCSAgICAgICAmcnhfZG1hLT5mYnIxX21pbl9kZXMpOwotCi0jaWZkZWYgVVNFX0ZCUjAKLQkvKiBOb3cncyB0aGUgYmVzdCB0aW1lIHRvIGluaXRpYWxpemUgRkJSMCBjb250ZW50cyAqLwotCWZicl9lbnRyeSA9IChzdHJ1Y3QgZmJyX2Rlc2MgKikgcnhfbG9jYWwtPnBGYnIwUmluZ1ZhOwotCWZvciAoZW50cnkgPSAwOyBlbnRyeSA8IHJ4X2xvY2FsLT5GYnIwTnVtRW50cmllczsgZW50cnkrKykgewotCQlmYnJfZW50cnktPmFkZHJfaGkgPSByeF9sb2NhbC0+ZmJyWzBdLT5idXNfaGlnaFtlbnRyeV07Ci0JCWZicl9lbnRyeS0+YWRkcl9sbyA9IHJ4X2xvY2FsLT5mYnJbMF0tPmJ1c19sb3dbZW50cnldOwotCQlmYnJfZW50cnktPndvcmQyID0gZW50cnk7Ci0JCWZicl9lbnRyeSsrOwotCX0KLQotCXdyaXRlbCgodTMyKSAocnhfbG9jYWwtPkZicjBSZWFscGEgPj4gMzIpLCAmcnhfZG1hLT5mYnIwX2Jhc2VfaGkpOwotCXdyaXRlbCgodTMyKSByeF9sb2NhbC0+RmJyMFJlYWxwYSwgJnJ4X2RtYS0+ZmJyMF9iYXNlX2xvKTsKLQl3cml0ZWwocnhfbG9jYWwtPkZicjBOdW1FbnRyaWVzIC0gMSwgJnJ4X2RtYS0+ZmJyMF9udW1fZGVzKTsKLQl3cml0ZWwoRVRfRE1BMTBfV1JBUCwgJnJ4X2RtYS0+ZmJyMF9mdWxsX29mZnNldCk7Ci0KLQkvKiBUaGlzIHZhcmlhYmxlIHRyYWNrcyB0aGUgZnJlZSBidWZmZXIgcmluZyAwIGZ1bGwgcG9zaXRpb24sIHNvIGl0Ci0JICogaGFzIHRvIG1hdGNoIHRoZSBhYm92ZS4KLQkgKi8KLQlyeF9sb2NhbC0+bG9jYWxfRmJyMF9mdWxsID0gRVRfRE1BMTBfV1JBUDsKLQl3cml0ZWwoKChyeF9sb2NhbC0+RmJyME51bUVudHJpZXMgKiBMT19NQVJLX1BFUkNFTlRfRk9SX1JYKSAvIDEwMCkgLSAxLAotCSAgICAgICAmcnhfZG1hLT5mYnIwX21pbl9kZXMpOwotI2VuZGlmCi0KLQkvKiBQcm9ncmFtIHRoZSBudW1iZXIgb2YgcGFja2V0cyB3ZSB3aWxsIHJlY2VpdmUgYmVmb3JlIGdlbmVyYXRpbmcgYW4KLQkgKiBpbnRlcnJ1cHQuCi0JICogRm9yIHZlcnNpb24gQiBzaWxpY29uLCB0aGlzIHZhbHVlIGdldHMgdXBkYXRlZCBvbmNlIGF1dG9uZWcgaXMKLQkgKmNvbXBsZXRlLgotCSAqLwotCXdyaXRlbChQQVJNX1JYX05VTV9CVUZTX0RFRiwgJnJ4X2RtYS0+bnVtX3BrdF9kb25lKTsKLQotCS8qIFRoZSAidGltZV9kb25lIiBpcyBub3Qgd29ya2luZyBjb3JyZWN0bHkgdG8gY29hbGVzY2UgaW50ZXJydXB0cwotCSAqIGFmdGVyIGEgZ2l2ZW4gdGltZSBwZXJpb2QsIGJ1dCByYXRoZXIgaXMgZ2l2aW5nIHVzIGFuIGludGVycnVwdAotCSAqIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSBoYXZlIHJlY2VpdmVkIHBhY2tldHMuCi0JICogVGhpcyB2YWx1ZSBnZXRzIHVwZGF0ZWQgb25jZSBhdXRvbmVnIGlzIGNvbXBsZXRlLgotCSAqLwotCXdyaXRlbChQQVJNX1JYX1RJTUVfSU5UX0RFRiwgJnJ4X2RtYS0+bWF4X3BrdF90aW1lKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0ZGV2LT5yY3ZfbG9jaywgZmxhZ3MpOwotfQotCi0vKioKLSAqIFNldFJ4RG1hVGltZXIgLSBTZXQgdGhlIGhlYXJ0YmVhdCB0aW1lciBhY2NvcmRpbmcgdG8gbGluZSByYXRlLgotICogQGV0ZGV2OiBwb2ludGVyIHRvIG91ciBhZGFwdGVyIHN0cnVjdHVyZQotICovCi12b2lkIFNldFJ4RG1hVGltZXIoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKLQkvKiBGb3IgdmVyc2lvbiBCIHNpbGljb24sIHdlIGRvIG5vdCB1c2UgdGhlIFJ4RE1BIHRpbWVyIGZvciAxMCBhbmQgMTAwCi0JICogTWJpdHMvcyBsaW5lIHJhdGVzLiBXZSBkbyBub3QgZW5hYmxlIGFuZCBSeERNQSBpbnRlcnJ1cHQgY29hbGVzY2luZy4KLQkgKi8KLQlpZiAoKGV0ZGV2LT5saW5rc3BlZWQgPT0gVFJVRVBIWV9TUEVFRF8xMDBNQlBTKSB8fAotCSAgICAoZXRkZXYtPmxpbmtzcGVlZCA9PSBUUlVFUEhZX1NQRUVEXzEwTUJQUykpIHsKLQkJd3JpdGVsKDAsICZldGRldi0+cmVncy0+cnhkbWEubWF4X3BrdF90aW1lKTsKLQkJd3JpdGVsKDEsICZldGRldi0+cmVncy0+cnhkbWEubnVtX3BrdF9kb25lKTsKLQl9Ci19Ci0KLS8qKgotICogTklDUmV0dXJuUkZEIC0gUmVjeWNsZSBhIFJGRCBhbmQgcHV0IGl0IGJhY2sgb250byB0aGUgcmVjZWl2ZSBsaXN0Ci0gKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLSAqIEByZmQ6IHBvaW50ZXIgdG8gdGhlIFJGRAotICovCi12b2lkIG5pY19yZXR1cm5fcmZkKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIHN0cnVjdCByZmQgKnJmZCkKLXsKLQlzdHJ1Y3QgcnhfcmluZyAqcnhfbG9jYWwgPSAmZXRkZXYtPnJ4X3Jpbmc7Ci0Jc3RydWN0IHJ4ZG1hX3JlZ3MgX19pb21lbSAqcnhfZG1hID0gJmV0ZGV2LT5yZWdzLT5yeGRtYTsKLQl1MTYgYmkgPSByZmQtPmJ1ZmZlcmluZGV4OwotCXU4IHJpID0gcmZkLT5yaW5naW5kZXg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIFdlIGRvbid0IHVzZSBhbnkgb2YgdGhlIE9PQiBkYXRhIGJlc2lkZXMgc3RhdHVzLiBPdGhlcndpc2UsIHdlCi0JICogbmVlZCB0byBjbGVhbiB1cCBPT0IgZGF0YQotCSAqLwotCWlmICgKLSNpZmRlZiBVU0VfRkJSMAotCSAgICAocmkgPT0gMCAmJiBiaSA8IHJ4X2xvY2FsLT5GYnIwTnVtRW50cmllcykgfHwKLSNlbmRpZgotCSAgICAocmkgPT0gMSAmJiBiaSA8IHJ4X2xvY2FsLT5GYnIxTnVtRW50cmllcykpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5GYnJMb2NrLCBmbGFncyk7Ci0KLQkJaWYgKHJpID09IDEpIHsKLQkJCXN0cnVjdCBmYnJfZGVzYyAqbmV4dCA9Ci0JCQkgICAgKHN0cnVjdCBmYnJfZGVzYyAqKSAocnhfbG9jYWwtPnBGYnIxUmluZ1ZhKSArCi0JCQkJCSBJTkRFWDEwKHJ4X2xvY2FsLT5sb2NhbF9GYnIxX2Z1bGwpOwotCi0JCQkvKiBIYW5kbGUgdGhlIEZyZWUgQnVmZmVyIFJpbmcgYWR2YW5jZW1lbnQgaGVyZS4gV3JpdGUKLQkJCSAqIHRoZSBQQSAvIEJ1ZmZlciBJbmRleCBmb3IgdGhlIHJldHVybmVkIGJ1ZmZlciBpbnRvCi0JCQkgKiB0aGUgb2xkZXN0IChuZXh0IHRvIGJlIGZyZWVkKUZCUiBlbnRyeQotCQkJICovCi0JCQluZXh0LT5hZGRyX2hpID0gcnhfbG9jYWwtPmZiclsxXS0+YnVzX2hpZ2hbYmldOwotCQkJbmV4dC0+YWRkcl9sbyA9IHJ4X2xvY2FsLT5mYnJbMV0tPmJ1c19sb3dbYmldOwotCQkJbmV4dC0+d29yZDIgPSBiaTsKLQotCQkJd3JpdGVsKGJ1bXBfZmJyKCZyeF9sb2NhbC0+bG9jYWxfRmJyMV9mdWxsLAotCQkJCXJ4X2xvY2FsLT5GYnIxTnVtRW50cmllcyAtIDEpLAotCQkJCSZyeF9kbWEtPmZicjFfZnVsbF9vZmZzZXQpOwotCQl9Ci0jaWZkZWYgVVNFX0ZCUjAKLQkJZWxzZSB7Ci0JCQlzdHJ1Y3QgZmJyX2Rlc2MgKm5leHQgPSAoc3RydWN0IGZicl9kZXNjICopCi0JCQkJcnhfbG9jYWwtPnBGYnIwUmluZ1ZhICsKLQkJCQkJSU5ERVgxMChyeF9sb2NhbC0+bG9jYWxfRmJyMF9mdWxsKTsKLQotCQkJLyogSGFuZGxlIHRoZSBGcmVlIEJ1ZmZlciBSaW5nIGFkdmFuY2VtZW50IGhlcmUuIFdyaXRlCi0JCQkgKiB0aGUgUEEgLyBCdWZmZXIgSW5kZXggZm9yIHRoZSByZXR1cm5lZCBidWZmZXIgaW50bwotCQkJICogdGhlIG9sZGVzdCAobmV4dCB0byBiZSBmcmVlZCkgRkJSIGVudHJ5Ci0JCQkgKi8KLQkJCW5leHQtPmFkZHJfaGkgPSByeF9sb2NhbC0+ZmJyWzBdLT5idXNfaGlnaFtiaV07Ci0JCQluZXh0LT5hZGRyX2xvID0gcnhfbG9jYWwtPmZiclswXS0+YnVzX2xvd1tiaV07Ci0JCQluZXh0LT53b3JkMiA9IGJpOwotCi0JCQl3cml0ZWwoYnVtcF9mYnIoJnJ4X2xvY2FsLT5sb2NhbF9GYnIwX2Z1bGwsCi0JCQkJCXJ4X2xvY2FsLT5GYnIwTnVtRW50cmllcyAtIDEpLAotCQkJICAgICAgICZyeF9kbWEtPmZicjBfZnVsbF9vZmZzZXQpOwotCQl9Ci0jZW5kaWYKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPkZickxvY2ssIGZsYWdzKTsKLQl9IGVsc2UgewotCQlkZXZfZXJyKCZldGRldi0+cGRldi0+ZGV2LAotCQkJICAiTklDUmV0dXJuUkZEIGlsbGVnYWwgQnVmZmVyIEluZGV4IHJldHVybmVkXG4iKTsKLQl9Ci0KLQkvKiBUaGUgcHJvY2Vzc2luZyBvbiB0aGlzIFJGRCBpcyBkb25lLCBzbyBwdXQgaXQgYmFjayBvbiB0aGUgdGFpbCBvZgotCSAqIG91ciBsaXN0Ci0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5yY3ZfbG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJnJmZC0+bGlzdF9ub2RlLCAmcnhfbG9jYWwtPlJlY3ZMaXN0KTsKLQlyeF9sb2NhbC0+blJlYWR5UmVjdisrOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0ZGV2LT5yY3ZfbG9jaywgZmxhZ3MpOwotCi0JV0FSTl9PTihyeF9sb2NhbC0+blJlYWR5UmVjdiA+IHJ4X2xvY2FsLT5OdW1SZmQpOwotfQotCi0vKioKLSAqIGV0MTMxeF9yeF9kbWFfZGlzYWJsZSAtIFN0b3Agb2YgUnhfRE1BIG9uIHRoZSBFVDEzMTAKLSAqIEBldGRldjogcG9pbnRlciB0byBvdXIgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqLwotdm9pZCBldDEzMXhfcnhfZG1hX2Rpc2FibGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKLQl1MzIgY3NyOwotCS8qIFNldHVwIHRoZSByZWNlaXZlIGRtYSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0Jd3JpdGVsKDB4MDAwMDIwMDEsICZldGRldi0+cmVncy0+cnhkbWEuY3NyKTsKLQljc3IgPSByZWFkbCgmZXRkZXYtPnJlZ3MtPnJ4ZG1hLmNzcik7Ci0JaWYgKChjc3IgJiAweDAwMDIwMDAwKSA9PSAwKSB7CS8qIENoZWNrIGhhbHQgc3RhdHVzIChiaXQgMTcpICovCi0JCXVkZWxheSg1KTsKLQkJY3NyID0gcmVhZGwoJmV0ZGV2LT5yZWdzLT5yeGRtYS5jc3IpOwotCQlpZiAoKGNzciAmIDB4MDAwMjAwMDApID09IDApCi0JCQlkZXZfZXJyKCZldGRldi0+cGRldi0+ZGV2LAotCQkJIlJYIERtYSBmYWlsZWQgdG8gZW50ZXIgaGFsdCBzdGF0ZS4gQ1NSIDB4JTA4eFxuIiwKLQkJCQljc3IpOwotCX0KLX0KLQotLyoqCi0gKiBldDEzMXhfcnhfZG1hX2VuYWJsZSAtIHJlLXN0YXJ0IG9mIFJ4X0RNQSBvbiB0aGUgRVQxMzEwLgotICogQGV0ZGV2OiBwb2ludGVyIHRvIG91ciBhZGFwdGVyIHN0cnVjdHVyZQotICovCi12b2lkIGV0MTMxeF9yeF9kbWFfZW5hYmxlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCi17Ci0JLyogU2V0dXAgdGhlIHJlY2VpdmUgZG1hIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgZm9yIG5vcm1hbCBvcGVyYXRpb24gKi8KLQl1MzIgY3NyID0gIDB4MjAwMDsJLyogRkJSMSBlbmFibGUgKi8KLQotCWlmIChldGRldi0+cnhfcmluZy5GYnIxQnVmZmVyU2l6ZSA9PSA0MDk2KQotCQljc3IgfD0gMHgwODAwOwotCWVsc2UgaWYgKGV0ZGV2LT5yeF9yaW5nLkZicjFCdWZmZXJTaXplID09IDgxOTIpCi0JCWNzciB8PSAweDEwMDA7Ci0JZWxzZSBpZiAoZXRkZXYtPnJ4X3JpbmcuRmJyMUJ1ZmZlclNpemUgPT0gMTYzODQpCi0JCWNzciB8PSAweDE4MDA7Ci0jaWZkZWYgVVNFX0ZCUjAKLQljc3IgfD0gMHgwNDAwOwkJLyogRkJSMCBlbmFibGUgKi8KLQlpZiAoZXRkZXYtPnJ4X3JpbmcuRmJyMEJ1ZmZlclNpemUgPT0gMjU2KQotCQljc3IgfD0gMHgwMTAwOwotCWVsc2UgaWYgKGV0ZGV2LT5yeF9yaW5nLkZicjBCdWZmZXJTaXplID09IDUxMikKLQkJY3NyIHw9IDB4MDIwMDsKLQllbHNlIGlmIChldGRldi0+cnhfcmluZy5GYnIwQnVmZmVyU2l6ZSA9PSAxMDI0KQotCQljc3IgfD0gMHgwMzAwOwotI2VuZGlmCi0Jd3JpdGVsKGNzciwgJmV0ZGV2LT5yZWdzLT5yeGRtYS5jc3IpOwotCi0JY3NyID0gcmVhZGwoJmV0ZGV2LT5yZWdzLT5yeGRtYS5jc3IpOwotCWlmICgoY3NyICYgMHgwMDAyMDAwMCkgIT0gMCkgewotCQl1ZGVsYXkoNSk7Ci0JCWNzciA9IHJlYWRsKCZldGRldi0+cmVncy0+cnhkbWEuY3NyKTsKLQkJaWYgKChjc3IgJiAweDAwMDIwMDAwKSAhPSAwKSB7Ci0JCQlkZXZfZXJyKCZldGRldi0+cGRldi0+ZGV2LAotCQkJICAgICJSWCBEbWEgZmFpbGVkIHRvIGV4aXQgaGFsdCBzdGF0ZS4gIENTUiAweCUwOHhcbiIsCi0JCQkJY3NyKTsKLQkJfQotCX0KLX0KLQotLyoqCi0gKiBuaWNfcnhfcGt0cyAtIENoZWNrcyB0aGUgaGFyZHdhcmUgZm9yIGF2YWlsYWJsZSBwYWNrZXRzCi0gKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLSAqCi0gKiBSZXR1cm5zIHJmZCwgYSBwb2ludGVyIHRvIG91ciBNUFJGRC4KLSAqCi0gKiBDaGVja3MgdGhlIGhhcmR3YXJlIGZvciBhdmFpbGFibGUgcGFja2V0cywgdXNpbmcgY29tcGxldGlvbiByaW5nCi0gKiBJZiBwYWNrZXRzIGFyZSBhdmFpbGFibGUsIGl0IGdldHMgYW4gUkZEIGZyb20gdGhlIFJlY3ZMaXN0LCBhdHRhY2hlcwotICogdGhlIHBhY2tldCB0byBpdCwgcHV0cyB0aGUgUkZEIGluIHRoZSBSZWN2UGVuZExpc3QsIGFuZCBhbHNvIHJldHVybnMKLSAqIHRoZSBwb2ludGVyIHRvIHRoZSBSRkQuCi0gKi8KLXN0cnVjdCByZmQgKm5pY19yeF9wa3RzKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCi17Ci0Jc3RydWN0IHJ4X3JpbmcgKnJ4X2xvY2FsID0gJmV0ZGV2LT5yeF9yaW5nOwotCXN0cnVjdCByeF9zdGF0dXNfYmxvY2sgKnN0YXR1czsKLQlzdHJ1Y3QgcGt0X3N0YXRfZGVzYyAqcHNyOwotCXN0cnVjdCByZmQgKnJmZDsKLQl1MzIgaTsKLQl1OCAqYnVmOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKLQl1OCByaW5kZXg7Ci0JdTE2IGJpbmRleDsKLQl1MzIgbGVuOwotCXUzMiB3b3JkMDsKLQl1MzIgd29yZDE7Ci0KLQkvKiBSWCBTdGF0dXMgYmxvY2sgaXMgd3JpdHRlbiBieSB0aGUgRE1BIGVuZ2luZSBwcmlvciB0byBldmVyeQotCSAqIGludGVycnVwdC4gSXQgY29udGFpbnMgdGhlIG5leHQgdG8gYmUgdXNlZCBlbnRyeSBpbiB0aGUgUGFja2V0Ci0JICogU3RhdHVzIFJpbmcsIGFuZCBhbHNvIHRoZSB0d28gRnJlZSBCdWZmZXIgcmluZ3MuCi0JICovCi0Jc3RhdHVzID0gcnhfbG9jYWwtPnJ4X3N0YXR1c19ibG9jazsKLQl3b3JkMSA9IHN0YXR1cy0+V29yZDEgPj4gMTY7CS8qIEdldCB0aGUgdXNlZnVsIGJpdHMgKi8KLQotCS8qIENoZWNrIHRoZSBQU1IgYW5kIHdyYXAgYml0cyBkbyBub3QgbWF0Y2ggKi8KLQlpZiAoKHdvcmQxICYgMHgxRkZGKSA9PSAocnhfbG9jYWwtPmxvY2FsX3Bzcl9mdWxsICYgMHgxRkZGKSkKLQkJLyogTG9va3MgbGlrZSB0aGlzIHJpbmcgaXMgbm90IHVwZGF0ZWQgeWV0ICovCi0JCXJldHVybiBOVUxMOwotCi0JLyogVGhlIHBhY2tldCBzdGF0dXMgcmluZyBpbmRpY2F0ZXMgdGhhdCBkYXRhIGlzIGF2YWlsYWJsZS4gKi8KLQlwc3IgPSAoc3RydWN0IHBrdF9zdGF0X2Rlc2MgKikgKHJ4X2xvY2FsLT5wUFNSaW5nVmEpICsKLQkJCShyeF9sb2NhbC0+bG9jYWxfcHNyX2Z1bGwgJiAweEZGRik7Ci0KLQkvKiBHcmFiIGFueSBpbmZvcm1hdGlvbiB0aGF0IGlzIHJlcXVpcmVkIG9uY2UgdGhlIFBTUiBpcwotCSAqIGFkdmFuY2VkLCBzaW5jZSB3ZSBjYW4gbm8gbG9uZ2VyIHJlbHkgb24gdGhlIG1lbW9yeSBiZWluZwotCSAqIGFjY3VyYXRlCi0JICovCi0JbGVuID0gcHNyLT53b3JkMSAmIDB4RkZGRjsKLQlyaW5kZXggPSAocHNyLT53b3JkMSA+PiAyNikgJiAweDAzOwotCWJpbmRleCA9IChwc3ItPndvcmQxID4+IDE2KSAmIDB4M0ZGOwotCXdvcmQwID0gcHNyLT53b3JkMDsKLQotCS8qIEluZGljYXRlIHRoYXQgd2UgaGF2ZSB1c2VkIHRoaXMgUFNSIGVudHJ5LiAqLwotCS8qIEZJWE1FIHdyYXAgMTIgKi8KLQlhZGRfMTJiaXQoJnJ4X2xvY2FsLT5sb2NhbF9wc3JfZnVsbCwgMSk7Ci0JaWYgKChyeF9sb2NhbC0+bG9jYWxfcHNyX2Z1bGwgJiAweEZGRikgID4gcnhfbG9jYWwtPlBzck51bUVudHJpZXMgLSAxKSB7Ci0JCS8qIENsZWFyIHBzciBmdWxsIGFuZCB0b2dnbGUgdGhlIHdyYXAgYml0ICovCi0JCXJ4X2xvY2FsLT5sb2NhbF9wc3JfZnVsbCAmPSAgfjB4RkZGOwotCQlyeF9sb2NhbC0+bG9jYWxfcHNyX2Z1bGwgXj0gMHgxMDAwOwotCX0KLQotCXdyaXRlbChyeF9sb2NhbC0+bG9jYWxfcHNyX2Z1bGwsCi0JICAgICAgICZldGRldi0+cmVncy0+cnhkbWEucHNyX2Z1bGxfb2Zmc2V0KTsKLQotI2lmbmRlZiBVU0VfRkJSMAotCWlmIChyaW5kZXggIT0gMSkKLQkJcmV0dXJuIE5VTEw7Ci0jZW5kaWYKLQotI2lmZGVmIFVTRV9GQlIwCi0JaWYgKHJpbmRleCA+IDEgfHwKLQkJKHJpbmRleCA9PSAwICYmCi0JCWJpbmRleCA+IHJ4X2xvY2FsLT5GYnIwTnVtRW50cmllcyAtIDEpIHx8Ci0JCShyaW5kZXggPT0gMSAmJgotCQliaW5kZXggPiByeF9sb2NhbC0+RmJyMU51bUVudHJpZXMgLSAxKSkKLSNlbHNlCi0JaWYgKHJpbmRleCAhPSAxIHx8IGJpbmRleCA+IHJ4X2xvY2FsLT5GYnIxTnVtRW50cmllcyAtIDEpCi0jZW5kaWYKLQl7Ci0JCS8qIElsbGVnYWwgYnVmZmVyIG9yIHJpbmcgaW5kZXggY2Fubm90IGJlIHVzZWQgYnkgUy9XKi8KLQkJZGV2X2VycigmZXRkZXYtPnBkZXYtPmRldiwKLQkJCSAgIk5JQ1J4UGt0cyBQU1IgRW50cnkgJWQgaW5kaWNhdGVzICIKLQkJCSAgImxlbmd0aCBvZiAlZCBhbmQvb3IgYmFkIGJpKCVkKVxuIiwKLQkJCSAgcnhfbG9jYWwtPmxvY2FsX3Bzcl9mdWxsICYgMHhGRkYsCi0JCQkgIGxlbiwgYmluZGV4KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyogR2V0IGFuZCBmaWxsIHRoZSBSRkQuICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5yY3ZfbG9jaywgZmxhZ3MpOwotCi0JcmZkID0gTlVMTDsKLQllbGVtZW50ID0gcnhfbG9jYWwtPlJlY3ZMaXN0Lm5leHQ7Ci0JcmZkID0gKHN0cnVjdCByZmQgKikgbGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgcmZkLCBsaXN0X25vZGUpOwotCi0JaWYgKHJmZCA9PSBOVUxMKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0ZGV2LT5yY3ZfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlsaXN0X2RlbCgmcmZkLT5saXN0X25vZGUpOwotCXJ4X2xvY2FsLT5uUmVhZHlSZWN2LS07Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+cmN2X2xvY2ssIGZsYWdzKTsKLQotCXJmZC0+YnVmZmVyaW5kZXggPSBiaW5kZXg7Ci0JcmZkLT5yaW5naW5kZXggPSByaW5kZXg7Ci0KLQkvKiBJbiBWMSBzaWxpY29uLCB0aGVyZSBpcyBhIGJ1ZyB3aGljaCBzY3Jld3MgdXAgZmlsdGVyaW5nIG9mCi0JICogcnVudCBwYWNrZXRzLiAgVGhlcmVmb3JlIHJ1bnQgcGFja2V0IGZpbHRlcmluZyBpcyBkaXNhYmxlZAotCSAqIGluIHRoZSBNQUMgYW5kIHRoZSBwYWNrZXRzIGFyZSBkcm9wcGVkIGhlcmUuICBUaGV5IGFyZQotCSAqIGFsc28gY291bnRlZCBoZXJlLgotCSAqLwotCWlmIChsZW4gPCAoTklDX01JTl9QQUNLRVRfU0laRSArIDQpKSB7Ci0JCWV0ZGV2LT5zdGF0cy5vdGhlcl9lcnJvcnMrKzsKLQkJbGVuID0gMDsKLQl9Ci0KLQlpZiAobGVuKSB7Ci0JCWlmIChldGRldi0+UmVwbGljYVBoeUxvb3BiayA9PSAxKSB7Ci0JCQlidWYgPSByeF9sb2NhbC0+ZmJyW3JpbmRleF0tPnZpcnRbYmluZGV4XTsKLQotCQkJaWYgKG1lbWNtcCgmYnVmWzZdLCBldGRldi0+YWRkciwgRVRIX0FMRU4pID09IDApIHsKLQkJCQlpZiAobWVtY21wKCZidWZbNDJdLCAiUmVwbGljYSBwYWNrZXQiLAotCQkJCQkgICBFVEhfSExFTikpIHsKLQkJCQkJZXRkZXYtPlJlcGxpY2FQaHlMb29wYmtQRiA9IDE7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyogRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBtdWx0aWNhc3QgcGFja2V0IGNvbWluZyBpbiAqLwotCQlpZiAoKHdvcmQwICYgQUxDQVRFTF9NVUxUSUNBU1RfUEtUKSAmJgotCQkgICAgISh3b3JkMCAmIEFMQ0FURUxfQlJPQURDQVNUX1BLVCkpIHsKLQkJCS8qIFByb21pc2N1b3VzIG1vZGUgYW5kIE11bHRpY2FzdCBtb2RlIGFyZQotCQkJICogbm90IG11dHVhbGx5IGV4Y2x1c2l2ZSBhcyB3YXMgZmlyc3QKLQkJCSAqIHRob3VnaHQuICBJIGd1ZXNzIFByb21pc2N1b3VzIGlzIGp1c3QKLQkJCSAqIGNvbnNpZGVyZWQgYSBzdXBlci1zZXQgb2YgdGhlIG90aGVyCi0JCQkgKiBmaWx0ZXJzLiBHZW5lcmFsbHkgZmlsdGVyIGlzIDB4MmIgd2hlbiBpbgotCQkJICogcHJvbWlzY3VvdXMgbW9kZS4KLQkJCSAqLwotCQkJaWYgKChldGRldi0+UGFja2V0RmlsdGVyICYgRVQxMzFYX1BBQ0tFVF9UWVBFX01VTFRJQ0FTVCkKLQkJCSAgICAmJiAhKGV0ZGV2LT5QYWNrZXRGaWx0ZXIgJiBFVDEzMVhfUEFDS0VUX1RZUEVfUFJPTUlTQ1VPVVMpCi0JCQkgICAgJiYgIShldGRldi0+UGFja2V0RmlsdGVyICYgRVQxMzFYX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1QpKSB7Ci0JCQkJYnVmID0gcnhfbG9jYWwtPmZicltyaW5kZXhdLT4KLQkJCQkJCXZpcnRbYmluZGV4XTsKLQotCQkJCS8qIExvb3AgdGhyb3VnaCBvdXIgbGlzdCB0byBzZWUgaWYgdGhlCi0JCQkJICogZGVzdGluYXRpb24gYWRkcmVzcyBvZiB0aGlzIHBhY2tldAotCQkJCSAqIG1hdGNoZXMgb25lIGluIG91ciBsaXN0LgotCQkJCSAqLwotCQkJCWZvciAoaSA9IDA7Ci0JCQkJICAgICBpIDwgZXRkZXYtPk1DQWRkcmVzc0NvdW50OwotCQkJCSAgICAgaSsrKSB7Ci0JCQkJCWlmIChidWZbMF0gPT0KLQkJCQkJICAgIGV0ZGV2LT5NQ0xpc3RbaV1bMF0KLQkJCQkJICAgICYmIGJ1ZlsxXSA9PQotCQkJCQkgICAgZXRkZXYtPk1DTGlzdFtpXVsxXQotCQkJCQkgICAgJiYgYnVmWzJdID09Ci0JCQkJCSAgICBldGRldi0+TUNMaXN0W2ldWzJdCi0JCQkJCSAgICAmJiBidWZbM10gPT0KLQkJCQkJICAgIGV0ZGV2LT5NQ0xpc3RbaV1bM10KLQkJCQkJICAgICYmIGJ1Zls0XSA9PQotCQkJCQkgICAgZXRkZXYtPk1DTGlzdFtpXVs0XQotCQkJCQkgICAgJiYgYnVmWzVdID09Ci0JCQkJCSAgICBldGRldi0+TUNMaXN0W2ldWzVdKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8qIElmIG91ciBpbmRleCBpcyBlcXVhbCB0byB0aGUgbnVtYmVyCi0JCQkJICogb2YgTXVsdGljYXN0IGFkZHJlc3Mgd2UgaGF2ZSwgdGhlbgotCQkJCSAqIHRoaXMgbWVhbnMgd2UgZGlkIG5vdCBmaW5kIHRoaXMKLQkJCQkgKiBwYWNrZXQncyBtYXRjaGluZyBhZGRyZXNzIGluIG91cgotCQkJCSAqIGxpc3QuICBTZXQgdGhlIGxlbiB0byB6ZXJvLAotCQkJCSAqIHNvIHdlIGZyZWUgb3VyIFJGRCB3aGVuIHdlIHJldHVybgotCQkJCSAqIGZyb20gdGhpcyBmdW5jdGlvbi4KLQkJCQkgKi8KLQkJCQlpZiAoaSA9PSBldGRldi0+TUNBZGRyZXNzQ291bnQpCi0JCQkJCWxlbiA9IDA7Ci0JCQl9Ci0KLQkJCWlmIChsZW4gPiAwKQotCQkJCWV0ZGV2LT5zdGF0cy5tdWx0aXJjdisrOwotCQl9IGVsc2UgaWYgKHdvcmQwICYgQUxDQVRFTF9CUk9BRENBU1RfUEtUKQotCQkJZXRkZXYtPnN0YXRzLmJyZGNzdHJjdisrOwotCQllbHNlCi0JCQkvKiBOb3Qgc3VyZSB3aGF0IHRoaXMgY291bnRlciBtZWFzdXJlcyBpbgotCQkJICogcHJvbWlzY3VvdXMgbW9kZS4gUGVyaGFwcyB3ZSBzaG91bGQgY2hlY2sKLQkJCSAqIHRoZSBNQUMgYWRkcmVzcyB0byBzZWUgaWYgaXQgaXMgZGlyZWN0ZWQKLQkJCSAqIHRvIHVzIGluIHByb21pc2N1b3VzIG1vZGUuCi0JCQkgKi8KLQkJCWV0ZGV2LT5zdGF0cy51bmlyY3YrKzsKLQl9Ci0KLQlpZiAobGVuID4gMCkgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKLQotCQkvKnJmZC0+bGVuID0gbGVuIC0gNDsgKi8KLQkJcmZkLT5sZW4gPSBsZW47Ci0KLQkJc2tiID0gZGV2X2FsbG9jX3NrYihyZmQtPmxlbiArIDIpOwotCQlpZiAoIXNrYikgewotCQkJZGV2X2VycigmZXRkZXYtPnBkZXYtPmRldiwKLQkJCQkgICJDb3VsZG4ndCBhbGxvYyBhbiBTS0IgZm9yIFJ4XG4iKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0KLQkJZXRkZXYtPm5ldF9zdGF0cy5yeF9ieXRlcyArPSByZmQtPmxlbjsKLQotCQltZW1jcHkoc2tiX3B1dChza2IsIHJmZC0+bGVuKSwKLQkJICAgICAgIHJ4X2xvY2FsLT5mYnJbcmluZGV4XS0+dmlydFtiaW5kZXhdLAotCQkgICAgICAgcmZkLT5sZW4pOwotCi0JCXNrYi0+ZGV2ID0gZXRkZXYtPm5ldGRldjsKLQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgZXRkZXYtPm5ldGRldik7Ci0JCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKLQotCQluZXRpZl9yeChza2IpOwotCX0gZWxzZSB7Ci0JCXJmZC0+bGVuID0gMDsKLQl9Ci0KLQluaWNfcmV0dXJuX3JmZChldGRldiwgcmZkKTsKLQlyZXR1cm4gcmZkOwotfQotCi0vKioKLSAqIGV0MTMxeF9yZXNldF9yZWN2IC0gUmVzZXQgdGhlIHJlY2VpdmUgbGlzdAotICogQGV0ZGV2OiBwb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gKgotICogQXNzdW1wdGlvbiwgUmN2IHNwaW5sb2NrIGhhcyBiZWVuIGFjcXVpcmVkLgotICovCi12b2lkIGV0MTMxeF9yZXNldF9yZWN2KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCi17Ci0JV0FSTl9PTihsaXN0X2VtcHR5KCZldGRldi0+cnhfcmluZy5SZWN2TGlzdCkpOwotCi19Ci0KLS8qKgotICogZXQxMzF4X2hhbmRsZV9yZWN2X2ludGVycnVwdCAtIEludGVycnVwdCBoYW5kbGVyIGZvciByZWNlaXZlIHByb2Nlc3NpbmcKLSAqIEBldGRldjogcG9pbnRlciB0byBvdXIgYWRhcHRlcgotICoKLSAqIEFzc3VtcHRpb24sIFJjdiBzcGlubG9jayBoYXMgYmVlbiBhY3F1aXJlZC4KLSAqLwotdm9pZCBldDEzMXhfaGFuZGxlX3JlY3ZfaW50ZXJydXB0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCi17Ci0Jc3RydWN0IHJmZCAqcmZkID0gTlVMTDsKLQl1MzIgY291bnQgPSAwOwotCWJvb2wgZG9uZSA9IHRydWU7Ci0KLQkvKiBQcm9jZXNzIHVwIHRvIGF2YWlsYWJsZSBSRkQncyAqLwotCXdoaWxlIChjb3VudCA8IE5VTV9QQUNLRVRTX0hBTkRMRUQpIHsKLQkJaWYgKGxpc3RfZW1wdHkoJmV0ZGV2LT5yeF9yaW5nLlJlY3ZMaXN0KSkgewotCQkJV0FSTl9PTihldGRldi0+cnhfcmluZy5uUmVhZHlSZWN2ICE9IDApOwotCQkJZG9uZSA9IGZhbHNlOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlyZmQgPSBuaWNfcnhfcGt0cyhldGRldik7Ci0KLQkJaWYgKHJmZCA9PSBOVUxMKQotCQkJYnJlYWs7Ci0KLQkJLyogRG8gbm90IHJlY2VpdmUgYW55IHBhY2tldHMgdW50aWwgYSBmaWx0ZXIgaGFzIGJlZW4gc2V0LgotCQkgKiBEbyBub3QgcmVjZWl2ZSBhbnkgcGFja2V0cyB1bnRpbCB3ZSBoYXZlIGxpbmsuCi0JCSAqIElmIGxlbmd0aCBpcyB6ZXJvLCByZXR1cm4gdGhlIFJGRCBpbiBvcmRlciB0byBhZHZhbmNlIHRoZQotCQkgKiBGcmVlIGJ1ZmZlciByaW5nLgotCQkgKi8KLQkJaWYgKCFldGRldi0+UGFja2V0RmlsdGVyIHx8Ci0JCSAgICAhbmV0aWZfY2Fycmllcl9vayhldGRldi0+bmV0ZGV2KSB8fAotCQkgICAgcmZkLT5sZW4gPT0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIEluY3JlbWVudCB0aGUgbnVtYmVyIG9mIHBhY2tldHMgd2UgcmVjZWl2ZWQgKi8KLQkJZXRkZXYtPm5ldF9zdGF0cy5yeF9wYWNrZXRzKys7Ci0KLQkJLyogU2V0IHRoZSBzdGF0dXMgb24gdGhlIHBhY2tldCwgZWl0aGVyIHJlc291cmNlcyBvciBzdWNjZXNzICovCi0JCWlmIChldGRldi0+cnhfcmluZy5uUmVhZHlSZWN2IDwgUkZEX0xPV19XQVRFUl9NQVJLKSB7Ci0JCQlkZXZfd2FybigmZXRkZXYtPnBkZXYtPmRldiwKLQkJCQkgICAgIlJGRCdzIGFyZSBydW5uaW5nIG91dFxuIik7Ci0JCX0KLQkJY291bnQrKzsKLQl9Ci0KLQlpZiAoY291bnQgPT0gTlVNX1BBQ0tFVFNfSEFORExFRCB8fCAhZG9uZSkgewotCQlldGRldi0+cnhfcmluZy5VbmZpbmlzaGVkUmVjZWl2ZXMgPSB0cnVlOwotCQl3cml0ZWwoUEFSTV9UWF9USU1FX0lOVF9ERUYgKiBOQU5PX0lOX0FfTUlDUk8sCi0JCSAgICAgICAmZXRkZXYtPnJlZ3MtPmdsb2JhbC53YXRjaGRvZ190aW1lcik7Ci0JfSBlbHNlCi0JCS8qIFdhdGNoZG9nIHRpbWVyIHdpbGwgZGlzYWJsZSBpdHNlbGYgaWYgYXBwcm9wcmlhdGUuICovCi0JCWV0ZGV2LT5yeF9yaW5nLlVuZmluaXNoZWRSZWNlaXZlcyA9IGZhbHNlOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9yeC5oIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfcnguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThjNjUzZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF9yeC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qCi0gKiBBZ2VyZSBTeXN0ZW1zIEluYy4KLSAqIDEwLzEwMC8xMDAwIEJhc2UtVCBFdGhlcm5ldCBEcml2ZXIgZm9yIHRoZSBFVDEzMDEgYW5kIEVUMTMxeCBzZXJpZXMgTUFDcwotICoKLSAqIENvcHlyaWdodCDCqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIGV0MTMxMF9yeC5oIC0gRGVmaW5lcywgc3RydWN0cywgZW51bXMsIHByb3RvdHlwZXMsIGV0Yy4gcGVydGFpbmluZyB0byBkYXRhCi0gKiAgICAgICAgICAgICAgIHJlY2VwdGlvbi4KLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIFNPRlRXQVJFIExJQ0VOU0UKLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKLSAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKLSAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KLSAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KLSAqCi0gKiBDb3B5cmlnaHQgwqkgMjAwNSBBZ2VyZSBTeXN0ZW1zIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqCi0gKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwotICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKLSAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgotICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogRGlzY2xhaW1lcgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAotICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQotICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KLSAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi0gKiBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgX19FVDEzMTBfUlhfSF9fCi0jZGVmaW5lIF9fRVQxMzEwX1JYX0hfXwotCi0jaW5jbHVkZSAiZXQxMzEwX2FkZHJlc3NfbWFwLmgiCi0KLSNkZWZpbmUgVVNFX0ZCUjAgdHJ1ZQotCi0jaWZkZWYgVVNFX0ZCUjAKLS8qICNkZWZpbmUgRkJSMF9CVUZGRVJfU0laRSAyNTYgKi8KLSNlbmRpZgotCi0vKiAjZGVmaW5lIEZCUjFfQlVGRkVSX1NJWkUgMjA0OCAqLwotCi0jZGVmaW5lIEZCUl9DSFVOS1MgMzIKLQotI2RlZmluZSBNQVhfREVTQ19QRVJfUklOR19SWCAgICAgICAgIDEwMjQKLQotLyogbnVtYmVyIG9mIFJGRHMgLSBkZWZhdWx0IGFuZCBtaW4gKi8KLSNpZmRlZiBVU0VfRkJSMAotI2RlZmluZSBSRkRfTE9XX1dBVEVSX01BUksJNDAKLSNkZWZpbmUgTklDX01JTl9OVU1fUkZECQk2NAotI2RlZmluZSBOSUNfREVGQVVMVF9OVU1fUkZECTEwMjQKLSNlbHNlCi0jZGVmaW5lIFJGRF9MT1dfV0FURVJfTUFSSwkyMAotI2RlZmluZSBOSUNfTUlOX05VTV9SRkQJCTY0Ci0jZGVmaW5lIE5JQ19ERUZBVUxUX05VTV9SRkQJMjU2Ci0jZW5kaWYKLQotI2RlZmluZSBOVU1fUEFDS0VUU19IQU5ETEVECTI1NgotCi0jZGVmaW5lIEFMQ0FURUxfQkFEX1NUQVRVUwkweGU0N2YwMDAwCi0jZGVmaW5lIEFMQ0FURUxfTVVMVElDQVNUX1BLVAkweDAxMDAwMDAwCi0jZGVmaW5lIEFMQ0FURUxfQlJPQURDQVNUX1BLVAkweDAyMDAwMDAwCi0KLS8qIHR5cGVkZWZzIGZvciBGcmVlIEJ1ZmZlciBEZXNjcmlwdG9ycyAqLwotc3RydWN0IGZicl9kZXNjIHsKLQl1MzIgYWRkcl9sbzsKLQl1MzIgYWRkcl9oaTsKLQl1MzIgd29yZDI7CQkvKiBCaXRzIDEwLTMxIHJlc2VydmVkLCAwLTkgZGVzY3JpcHRvciAqLwotfTsKLQotLyogUGFja2V0IFN0YXR1cyBSaW5nIERlc2NyaXB0b3JzCi0gKgotICogV29yZCAwOgotICoKLSAqIHRvcCAxNiBiaXRzIGFyZSBmcm9tIHRoZSBBbGNhdGVsIFN0YXR1cyBXb3JkIGFzIGVudW1lcmF0ZWQgaW4KLSAqIFBFLU1DWE1BQyBEYXRhIFNoZWV0IElQRCBEUzU0IDAyMTAtMSAoYWxzbyBJUEQtRFM4MCAwMjA1LTIpCi0gKgotICogMDogaHAJCQloYXNoIHBhc3MKLSAqIDE6IGlwYQkJCUlQIGNoZWNrc3VtIGFzc2lzdAotICogMjogaXBwCQkJSVAgY2hlY2tzdW0gcGFzcwotICogMzogdGNwYQkJCVRDUCBjaGVja3N1bSBhc3Npc3QKLSAqIDQ6IHRjcHAJCQlUQ1AgY2hlY2tzdW0gcGFzcwotICogNTogd29sCQkJV09MIEV2ZW50Ci0gKiA2OiByeG1hY19lcnJvcgkJUlhNQUMgRXJyb3IgSW5kaWNhdG9yCi0gKiA3OiBkcm9wCQkJRHJvcCBwYWNrZXQKLSAqIDg6IGZ0CQkJRnJhbWUgVHJ1bmNhdGVkCi0gKiA5OiBqcAkJCUp1bWJvIFBhY2tldAotICogMTA6IHZwCQkJVkxBTiBQYWNrZXQKLSAqIDExLTE1OiB1bnVzZWQKLSAqIDE2OiBhc3dfcHJldl9wa3RfZHJvcHBlZAllLmcuIElGRyB0b28gc21hbGwgb24gcHJldmlvdXMKLSAqIDE3OiBhc3dfUlhfRFZfZXZlbnQJCXNob3J0IHJlY2VpdmUgZXZlbnQgZGV0ZWN0ZWQKLSAqIDE4OiBhc3dfZmFsc2VfY2Fycmllcl9ldmVudAliYWQgY2FycmllciBzaW5jZSBsYXN0IGdvb2QgcGFja2V0Ci0gKiAxOTogYXN3X2NvZGVfZXJyCQlvbmUgb3IgbW9yZSBuaWJibGVzIHNpZ25hbGxlZCBhcyBlcnJvcnMKLSAqIDIwOiBhc3dfQ1JDX2VycgkJQ1JDIGVycm9yCi0gKiAyMTogYXN3X2xlbl9jaGtfZXJyCQlmcmFtZSBsZW5ndGggZmllbGQgaW5jb3JyZWN0Ci0gKiAyMjogYXN3X3Rvb19sb25nCQlmcmFtZSBsZW5ndGggPiAxNTE4IGJ5dGVzCi0gKiAyMzogYXN3X09LCQkJdmFsaWQgQ1JDICsgbm8gY29kZSBlcnJvcgotICogMjQ6IGFzd19tdWx0aWNhc3QJCWhhcyBhIG11bHRpY2FzdCBhZGRyZXNzCi0gKiAyNTogYXN3X2Jyb2FkY2FzdAkJaGFzIGEgYnJvYWRjYXN0IGFkZHJlc3MKLSAqIDI2OiBhc3dfZHJpYmJsZV9uaWJibGUJc3B1cmlvdXMgYml0cyBhZnRlciBFT1AKLSAqIDI3OiBhc3dfY29udHJvbF9mcmFtZQlpcyBhIGNvbnRyb2wgZnJhbWUKLSAqIDI4OiBhc3dfcGF1c2VfZnJhbWUJCWlzIGEgcGF1c2UgZnJhbWUKLSAqIDI5OiBhc3dfdW5zdXBwb3J0ZWRfb3AJdW5zdXBwb3J0ZWQgT1AgY29kZQotICogMzA6IGFzd19WTEFOX3RhZwkJVkxBTiB0YWcgZGV0ZWN0ZWQKLSAqIDMxOiBhc3dfbG9uZ19ldnQJCVJ4IGxvbmcgZXZlbnQKLSAqCi0gKiBXb3JkIDE6Ci0gKiAwLTE1OiBsZW5ndGgJCQlsZW5ndGggaW4gYnl0ZXMKLSAqIDE2LTI1OiBiaQkJCUJ1ZmZlciBJbmRleAotICogMjYtMjc6IHJpCQkJUmluZyBJbmRleAotICogMjgtMzE6IHJlc2VydmVkCi0gKi8KLQotc3RydWN0IHBrdF9zdGF0X2Rlc2MgewotCXUzMiB3b3JkMDsKLQl1MzIgd29yZDE7Ci19OwotCi0vKiBUeXBlZGVmcyBmb3IgdGhlIFJYIERNQSBzdGF0dXMgd29yZCAqLwotCi0vKgotICogcnggc3RhdHVzIHdvcmQgMCBob2xkcyBwYXJ0IG9mIHRoZSBzdGF0dXMgYml0cyBvZiB0aGUgUnggRE1BIGVuZ2luZQotICogdGhhdCBnZXQgY29waWVkIG91dCB0byBtZW1vcnkgYnkgdGhlIEVULTEzMTAuICBXb3JkIDAgaXMgYSAzMiBiaXQgd29yZAotICogd2hpY2ggY29udGFpbnMgdGhlIEZyZWUgQnVmZmVyIHJpbmcgMCBhbmQgMSBhdmFpbGFibGUgb2Zmc2V0LgotICoKLSAqIGJpdCAwLTkgRkJSMSBvZmZzZXQKLSAqIGJpdCAxMCBXcmFwIGZsYWcgZm9yIEZCUjEKLSAqIGJpdCAxNi0yNSBGQlIwIG9mZnNldAotICogYml0IDI2IFdyYXAgZmxhZyBmb3IgRkJSMAotICovCi0KLS8qCi0gKiBSWFNUQVRfV09SRDFfdCBzdHJ1Y3R1cmUgaG9sZHMgcGFydCBvZiB0aGUgc3RhdHVzIGJpdHMgb2YgdGhlIFJ4IERNQSBlbmdpbmUKLSAqIHRoYXQgZ2V0IGNvcGllZCBvdXQgdG8gbWVtb3J5IGJ5IHRoZSBFVC0xMzEwLiAgV29yZCAzIGlzIGEgMzIgYml0IHdvcmQKLSAqIHdoaWNoIGNvbnRhaW5zIHRoZSBQYWNrZXQgU3RhdHVzIFJpbmcgYXZhaWxhYmxlIG9mZnNldC4KLSAqCi0gKiBiaXQgMC0xNSByZXNlcnZlZAotICogYml0IDE2LTI3IFBTUm9mZnNldAotICogYml0IDI4IFBTUndyYXAKLSAqIGJpdCAyOS0zMSB1bnVzZWQKLSAqLwotCi0vKgotICogc3RydWN0IHJ4X3N0YXR1c19ibG9jayBpcyBhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIHN0YXR1cyBvZiB0aGUgUngKLSAqIERNQSBlbmdpbmUgaXQgc2l0cyBpbiBmcmVlIG1lbW9yeSwgYW5kIGlzIHBvaW50ZWQgdG8gYnkgMHgxMDFjIC8gMHgxMDIwCi0gKi8KLXN0cnVjdCByeF9zdGF0dXNfYmxvY2sgewotCXUzMiBXb3JkMDsKLQl1MzIgV29yZDE7Ci19OwotCi0vKgotICogU3RydWN0dXJlIGZvciBsb29rLXVwIHRhYmxlIGhvbGRpbmcgZnJlZSBidWZmZXIgcmluZyBwb2ludGVycwotICovCi1zdHJ1Y3QgZmJyX2xvb2t1cCB7Ci0Jdm9pZCAqdmlydFtNQVhfREVTQ19QRVJfUklOR19SWF07Ci0Jdm9pZCAqYnVmZmVyMVtNQVhfREVTQ19QRVJfUklOR19SWF07Ci0Jdm9pZCAqYnVmZmVyMltNQVhfREVTQ19QRVJfUklOR19SWF07Ci0JdTMyIGJ1c19oaWdoW01BWF9ERVNDX1BFUl9SSU5HX1JYXTsKLQl1MzIgYnVzX2xvd1tNQVhfREVTQ19QRVJfUklOR19SWF07Ci19OwotCi0vKgotICogc3RydWN0IHJ4X3JpbmcgaXMgdGhlIHNzcnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGFkYXB0b3IncyBsb2NhbAotICogcmVmZXJlbmNlKHMpIHRvIHRoZSByaW5ncwotICovCi1zdHJ1Y3QgcnhfcmluZyB7Ci0jaWZkZWYgVVNFX0ZCUjAKLQl2b2lkICpwRmJyMFJpbmdWYTsKLQlkbWFfYWRkcl90IHBGYnIwUmluZ1BhOwotCXZvaWQgKkZicjBNZW1WYVtNQVhfREVTQ19QRVJfUklOR19SWCAvIEZCUl9DSFVOS1NdOwotCWRtYV9hZGRyX3QgRmJyME1lbVBhW01BWF9ERVNDX1BFUl9SSU5HX1JYIC8gRkJSX0NIVU5LU107Ci0JdWludDY0X3QgRmJyMFJlYWxwYTsKLQl1aW50NjRfdCBGYnIwb2Zmc2V0OwotCXUzMiBsb2NhbF9GYnIwX2Z1bGw7Ci0JdTMyIEZicjBOdW1FbnRyaWVzOwotCXUzMiBGYnIwQnVmZmVyU2l6ZTsKLSNlbmRpZgotCXZvaWQgKnBGYnIxUmluZ1ZhOwotCWRtYV9hZGRyX3QgcEZicjFSaW5nUGE7Ci0Jdm9pZCAqRmJyMU1lbVZhW01BWF9ERVNDX1BFUl9SSU5HX1JYIC8gRkJSX0NIVU5LU107Ci0JZG1hX2FkZHJfdCBGYnIxTWVtUGFbTUFYX0RFU0NfUEVSX1JJTkdfUlggLyBGQlJfQ0hVTktTXTsKLQl1aW50NjRfdCBGYnIxUmVhbHBhOwotCXVpbnQ2NF90IEZicjFvZmZzZXQ7Ci0Jc3RydWN0IGZicl9sb29rdXAgKmZiclsyXTsJLyogT25lIHBlciByaW5nICovCi0JdTMyIGxvY2FsX0ZicjFfZnVsbDsKLQl1MzIgRmJyMU51bUVudHJpZXM7Ci0JdTMyIEZicjFCdWZmZXJTaXplOwotCi0Jdm9pZCAqcFBTUmluZ1ZhOwotCWRtYV9hZGRyX3QgcFBTUmluZ1BhOwotCXUzMiBsb2NhbF9wc3JfZnVsbDsKLQl1MzIgUHNyTnVtRW50cmllczsKLQotCXN0cnVjdCByeF9zdGF0dXNfYmxvY2sgKnJ4X3N0YXR1c19ibG9jazsKLQlkbWFfYWRkcl90IHJ4X3N0YXR1c19idXM7Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkIFJlY3ZCdWZmZXJQb29sOwotCi0JLyogUkVDViAqLwotCXN0cnVjdCBsaXN0X2hlYWQgUmVjdkxpc3Q7Ci0JdTMyIG5SZWFkeVJlY3Y7Ci0KLQl1MzIgTnVtUmZkOwotCi0JYm9vbCBVbmZpbmlzaGVkUmVjZWl2ZXM7Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkIFJlY3ZQYWNrZXRQb29sOwotCi0JLyogbG9va2FzaWRlIGxpc3RzICovCi0Jc3RydWN0IGttZW1fY2FjaGUgKlJlY3ZMb29rYXNpZGU7Ci19OwotCi0jZW5kaWYgLyogX19FVDEzMTBfUlhfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF90eC5jIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfdHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRmNTFlNi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF90eC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzk3ICswLDAgQEAKLS8qCi0gKiBBZ2VyZSBTeXN0ZW1zIEluYy4KLSAqIDEwLzEwMC8xMDAwIEJhc2UtVCBFdGhlcm5ldCBEcml2ZXIgZm9yIHRoZSBFVDEzMDEgYW5kIEVUMTMxeCBzZXJpZXMgTUFDcwotICoKLSAqIENvcHlyaWdodCDCqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIGV0MTMxMF90eC5jIC0gUm91dGluZXMgdXNlZCB0byBwZXJmb3JtIGRhdGEgdHJhbnNtaXNzaW9uLgotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogU09GVFdBUkUgTElDRU5TRQotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAotICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwotICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbwotICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgotICoKLSAqIENvcHlyaWdodCDCqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICoKLSAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCi0gKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwotICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCi0gKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBEaXNjbGFpbWVyCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCi0gKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCi0gKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgotICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLSAqIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImV0MTMxeF92ZXJzaW9uLmgiCi0jaW5jbHVkZSAiZXQxMzF4X2RlZnMuaCIKLQotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0KLSNpbmNsdWRlICJldDEzMTBfcGh5LmgiCi0jaW5jbHVkZSAiZXQxMzF4X2FkYXB0ZXIuaCIKLSNpbmNsdWRlICJldDEzMTBfdHguaCIKLSNpbmNsdWRlICJldDEzMXguaCIKLQotc3RhdGljIGlubGluZSB2b2lkIGV0MTMxeF9mcmVlX3NlbmRfcGFja2V0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsCi0JCQkJCSAgIHN0cnVjdCB0Y2IgKnRjYik7Ci1zdGF0aWMgaW50IGV0MTMxeF9zZW5kX3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldik7Ci1zdGF0aWMgaW50IG5pY19zZW5kX3BhY2tldChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2LCBzdHJ1Y3QgdGNiICp0Y2IpOwotCi0vKioKLSAqIGV0MTMxeF90eF9kbWFfbWVtb3J5X2FsbG9jCi0gKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpLgotICoKLSAqIEFsbG9jYXRlcyBtZW1vcnkgdGhhdCB3aWxsIGJlIHZpc2libGUgYm90aCB0byB0aGUgZGV2aWNlIGFuZCB0byB0aGUgQ1BVLgotICogVGhlIE9TIHdpbGwgcGFzcyB1cyBwYWNrZXRzLCBwb2ludGVycyB0byB3aGljaCB3ZSB3aWxsIGluc2VydCBpbiB0aGUgVHgKLSAqIERlc2NyaXB0b3IgcXVldWUuIFRoZSBkZXZpY2Ugd2lsbCByZWFkIHRoaXMgcXVldWUgdG8gZmluZCB0aGUgcGFja2V0cyBpbgotICogbWVtb3J5LiBUaGUgZGV2aWNlIHdpbGwgdXBkYXRlIHRoZSAic3RhdHVzIiBpbiBtZW1vcnkgZWFjaCB0aW1lIGl0IHhtaXRzIGEKLSAqIHBhY2tldC4KLSAqLwotaW50IGV0MTMxeF90eF9kbWFfbWVtb3J5X2FsbG9jKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlpbnQgZGVzY19zaXplID0gMDsKLQlzdHJ1Y3QgdHhfcmluZyAqdHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nOwotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgVENCJ3MgKFRyYW5zbWl0IENvbnRyb2wgQmxvY2spICovCi0JYWRhcHRlci0+dHhfcmluZy50Y2JfcmluZyA9Ci0JCWtjYWxsb2MoTlVNX1RDQiwgc2l6ZW9mKHN0cnVjdCB0Y2IpLCBHRlBfQVRPTUlDIHwgR0ZQX0RNQSk7Ci0JaWYgKCFhZGFwdGVyLT50eF9yaW5nLnRjYl9yaW5nKSB7Ci0JCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIkNhbm5vdCBhbGxvYyBtZW1vcnkgZm9yIFRDQnNcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IGZvciB0aGUgVHggZGVzY3JpcHRvciByaW5nLCBhbmQgYWxsb2NhdGUKLQkgKiBzb21lIGV4dHJhIHNvIHRoYXQgdGhlIHJpbmcgY2FuIGJlIGFsaWduZWQgb24gYSA0ayBib3VuZGFyeS4KLQkgKi8KLQlkZXNjX3NpemUgPSAoc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqIE5VTV9ERVNDX1BFUl9SSU5HX1RYKSArIDQwOTYgLSAxOwotCXR4X3JpbmctPnR4X2Rlc2NfcmluZyA9Ci0JICAgIChzdHJ1Y3QgdHhfZGVzYyAqKSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCBkZXNjX3NpemUsCi0JCQkJCQkgICAgJnR4X3JpbmctPnR4X2Rlc2NfcmluZ19wYSk7Ci0JaWYgKCFhZGFwdGVyLT50eF9yaW5nLnR4X2Rlc2NfcmluZykgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkJCSJDYW5ub3QgYWxsb2MgbWVtb3J5IGZvciBUeCBSaW5nXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogU2F2ZSBwaHlzaWNhbCBhZGRyZXNzCi0JICoKLQkgKiBOT1RFOiBwY2lfYWxsb2NfY29uc2lzdGVudCgpLCB1c2VkIGFib3ZlIHRvIGFsbG9jIERNQSByZWdpb25zLAotCSAqIEFMV0FZUyByZXR1cm5zIFNBQyAoMzItYml0KSBhZGRyZXNzZXMuIElmIERBQyAoNjQtYml0KSBhZGRyZXNzZXMKLQkgKiBhcmUgZXZlciByZXR1cm5lZCwgbWFrZSBzdXJlIHRoZSBoaWdoIHBhcnQgaXMgcmV0cmlldmVkIGhlcmUgYmVmb3JlCi0JICogc3RvcmluZyB0aGUgYWRqdXN0ZWQgYWRkcmVzcy4KLQkgKi8KLQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBUeCBzdGF0dXMgYmxvY2sgKi8KLQl0eF9yaW5nLT50eF9zdGF0dXMgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LAotCQkJCQkJICAgIHNpemVvZih1MzIpLAotCQkJCQkJICAgICZ0eF9yaW5nLT50eF9zdGF0dXNfcGEpOwotCWlmICghYWRhcHRlci0+dHhfcmluZy50eF9zdGF0dXNfcGEpIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJCSAgIkNhbm5vdCBhbGxvYyBtZW1vcnkgZm9yIFR4IHN0YXR1cyBibG9ja1xuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBldDEzMXhfdHhfZG1hX21lbW9yeV9mcmVlIC0gRnJlZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCB3aXRoaW4gdGhpcyBtb2R1bGUKLSAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MgYW5kIGVycm5vIG9uIGZhaWx1cmUgKGFzIGRlZmluZWQgaW4gZXJybm8uaCkuCi0gKi8KLXZvaWQgZXQxMzF4X3R4X2RtYV9tZW1vcnlfZnJlZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaW50IGRlc2Nfc2l6ZSA9IDA7Ci0KLQlpZiAoYWRhcHRlci0+dHhfcmluZy50eF9kZXNjX3JpbmcpIHsKLQkJLyogRnJlZSBtZW1vcnkgcmVsYXRpbmcgdG8gVHggcmluZ3MgaGVyZSAqLwotCQlkZXNjX3NpemUgPSAoc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqIE5VTV9ERVNDX1BFUl9SSU5HX1RYKQotCQkJCQkJCQkrIDQwOTYgLSAxOwotCQlwY2lfZnJlZV9jb25zaXN0ZW50KGFkYXB0ZXItPnBkZXYsCi0JCQkJICAgIGRlc2Nfc2l6ZSwKLQkJCQkgICAgYWRhcHRlci0+dHhfcmluZy50eF9kZXNjX3JpbmcsCi0JCQkJICAgIGFkYXB0ZXItPnR4X3JpbmcudHhfZGVzY19yaW5nX3BhKTsKLQkJYWRhcHRlci0+dHhfcmluZy50eF9kZXNjX3JpbmcgPSBOVUxMOwotCX0KLQotCS8qIEZyZWUgbWVtb3J5IGZvciB0aGUgVHggc3RhdHVzIGJsb2NrICovCi0JaWYgKGFkYXB0ZXItPnR4X3JpbmcudHhfc3RhdHVzKSB7Ci0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoYWRhcHRlci0+cGRldiwKLQkJCQkgICAgc2l6ZW9mKHUzMiksCi0JCQkJICAgIGFkYXB0ZXItPnR4X3JpbmcudHhfc3RhdHVzLAotCQkJCSAgICBhZGFwdGVyLT50eF9yaW5nLnR4X3N0YXR1c19wYSk7Ci0KLQkJYWRhcHRlci0+dHhfcmluZy50eF9zdGF0dXMgPSBOVUxMOwotCX0KLQkvKiBGcmVlIHRoZSBtZW1vcnkgZm9yIHRoZSB0Y2Igc3RydWN0dXJlcyAqLwotCWtmcmVlKGFkYXB0ZXItPnR4X3JpbmcudGNiX3JpbmcpOwotfQotCi0vKioKLSAqIENvbmZpZ1R4RG1hUmVncyAtIFNldCB1cCB0aGUgdHggZG1hIHNlY3Rpb24gb2YgdGhlIEpBR0NvcmUuCi0gKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqCi0gKiBDb25maWd1cmUgdGhlIHRyYW5zbWl0IGVuZ2luZSB3aXRoIHRoZSByaW5nIGJ1ZmZlcnMgd2UgaGF2ZSBjcmVhdGVkCi0gKiBhbmQgcHJlcGFyZSBpdCBmb3IgdXNlLgotICovCi12b2lkIENvbmZpZ1R4RG1hUmVncyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCXN0cnVjdCB0eGRtYV9yZWdzIF9faW9tZW0gKnR4ZG1hID0gJmV0ZGV2LT5yZWdzLT50eGRtYTsKLQotCS8qIExvYWQgdGhlIGhhcmR3YXJlIHdpdGggdGhlIHN0YXJ0IG9mIHRoZSB0cmFuc21pdCBkZXNjcmlwdG9yIHJpbmcuICovCi0Jd3JpdGVsKCh1MzIpICgodTY0KWV0ZGV2LT50eF9yaW5nLnR4X2Rlc2NfcmluZ19wYSA+PiAzMiksCi0JICAgICAgICZ0eGRtYS0+cHJfYmFzZV9oaSk7Ci0Jd3JpdGVsKCh1MzIpIGV0ZGV2LT50eF9yaW5nLnR4X2Rlc2NfcmluZ19wYSwKLQkgICAgICAgJnR4ZG1hLT5wcl9iYXNlX2xvKTsKLQotCS8qIEluaXRpYWxpc2UgdGhlIHRyYW5zbWl0IERNQSBlbmdpbmUgKi8KLQl3cml0ZWwoTlVNX0RFU0NfUEVSX1JJTkdfVFggLSAxLCAmdHhkbWEtPnByX251bV9kZXMpOwotCi0JLyogTG9hZCB0aGUgY29tcGxldGlvbiB3cml0ZWJhY2sgcGh5c2ljYWwgYWRkcmVzcyAqLwotCXdyaXRlbCgodTMyKSgodTY0KWV0ZGV2LT50eF9yaW5nLnR4X3N0YXR1c19wYSA+PiAzMiksCi0JCQkJCQkmdHhkbWEtPmRtYV93Yl9iYXNlX2hpKTsKLQl3cml0ZWwoKHUzMilldGRldi0+dHhfcmluZy50eF9zdGF0dXNfcGEsICZ0eGRtYS0+ZG1hX3diX2Jhc2VfbG8pOwotCi0JKmV0ZGV2LT50eF9yaW5nLnR4X3N0YXR1cyA9IDA7Ci0KLQl3cml0ZWwoMCwgJnR4ZG1hLT5zZXJ2aWNlX3JlcXVlc3QpOwotCWV0ZGV2LT50eF9yaW5nLnNlbmRfaWR4ID0gMDsKLX0KLQotLyoqCi0gKiBldDEzMXhfdHhfZG1hX2Rpc2FibGUgLSBTdG9wIG9mIFR4X0RNQSBvbiB0aGUgRVQxMzEwCi0gKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIgc3RydWN0dXJlCi0gKi8KLXZvaWQgZXQxMzF4X3R4X2RtYV9kaXNhYmxlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCi17Ci0JLyogU2V0dXAgdGhlIHRyYW1zbWl0IGRtYSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCi0Jd3JpdGVsKEVUX1RYRE1BX0NTUl9IQUxUfEVUX1RYRE1BX1NOR0xfRVBLVCwKLQkJCQkJJmV0ZGV2LT5yZWdzLT50eGRtYS5jc3IpOwotfQotCi0vKioKLSAqIGV0MTMxeF90eF9kbWFfZW5hYmxlIC0gcmUtc3RhcnQgb2YgVHhfRE1BIG9uIHRoZSBFVDEzMTAuCi0gKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIgc3RydWN0dXJlCi0gKgotICogTWFpbmx5IHVzZWQgYWZ0ZXIgYSByZXR1cm4gdG8gdGhlIEQwIChmdWxsLXBvd2VyKSBzdGF0ZSBmcm9tIGEgbG93ZXIgc3RhdGUuCi0gKi8KLXZvaWQgZXQxMzF4X3R4X2RtYV9lbmFibGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldikKLXsKLQkvKiBTZXR1cCB0aGUgdHJhbnNtaXQgZG1hIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgZm9yIG5vcm1hbAotCSAqIG9wZXJhdGlvbgotCSAqLwotCXdyaXRlbChFVF9UWERNQV9TTkdMX0VQS1R8KFBBUk1fRE1BX0NBQ0hFX0RFRiA8PCBFVF9UWERNQV9DQUNIRV9TSElGVCksCi0JCQkJCSZldGRldi0+cmVncy0+dHhkbWEuY3NyKTsKLX0KLQotLyoqCi0gKiBldDEzMXhfaW5pdF9zZW5kIC0gSW5pdGlhbGl6ZSBzZW5kIGRhdGEgc3RydWN0dXJlcwotICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqLwotdm9pZCBldDEzMXhfaW5pdF9zZW5kKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgdGNiICp0Y2I7Ci0JdTMyIGN0OwotCXN0cnVjdCB0eF9yaW5nICp0eF9yaW5nOwotCi0JLyogU2V0dXAgc29tZSBjb252ZW5pZW5jZSBwb2ludGVycyAqLwotCXR4X3JpbmcgPSAmYWRhcHRlci0+dHhfcmluZzsKLQl0Y2IgPSBhZGFwdGVyLT50eF9yaW5nLnRjYl9yaW5nOwotCi0JdHhfcmluZy0+dGNiX3FoZWFkID0gdGNiOwotCi0JbWVtc2V0KHRjYiwgMCwgc2l6ZW9mKHN0cnVjdCB0Y2IpICogTlVNX1RDQik7Ci0KLQkvKiBHbyB0aHJvdWdoIGFuZCBzZXQgdXAgZWFjaCBUQ0IgKi8KLQlmb3IgKGN0ID0gMDsgY3QrKyA8IE5VTV9UQ0I7IHRjYisrKQotCQkvKiBTZXQgdGhlIGxpbmsgcG9pbnRlciBpbiBIVyBUQ0IgdG8gdGhlIG5leHQgVENCIGluIHRoZQotCQkgKiBjaGFpbgotCQkgKi8KLQkJdGNiLT5uZXh0ID0gdGNiICsgMTsKLQotCS8qIFNldCB0aGUgIHRhaWwgcG9pbnRlciAqLwotCXRjYi0tOwotCXR4X3JpbmctPnRjYl9xdGFpbCA9IHRjYjsKLQl0Y2ItPm5leHQgPSBOVUxMOwotCS8qIEN1cnIgc2VuZCBxdWV1ZSBzaG91bGQgbm93IGJlIGVtcHR5ICovCi0JdHhfcmluZy0+c2VuZF9oZWFkID0gTlVMTDsKLQl0eF9yaW5nLT5zZW5kX3RhaWwgPSBOVUxMOwotfQotCi0vKioKLSAqIGV0MTMxeF9zZW5kX3BhY2tldHMgLSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgT1MgdG8gc2VuZCBwYWNrZXRzCi0gKiBAc2tiOiB0aGUgcGFja2V0KHMpIHRvIHNlbmQKLSAqIEBuZXRkZXY6ZGV2aWNlIG9uIHdoaWNoIHRvIFRYIHRoZSBhYm92ZSBwYWNrZXQocykKLSAqCi0gKiBSZXR1cm4gMCBpbiBhbG1vc3QgYWxsIGNhc2VzOyBub24temVybyB2YWx1ZSBpbiBleHRyZW1lIGhhcmQgZmFpbHVyZSBvbmx5Ci0gKi8KLWludCBldDEzMXhfc2VuZF9wYWNrZXRzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0JaW50IHN0YXR1cyA9IDA7Ci0Jc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiA9IE5VTEw7Ci0KLQlldGRldiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLQkvKiBTZW5kIHRoZXNlIHBhY2tldHMKLQkgKgotCSAqIE5PVEU6IFRoZSBMaW51eCBUeCBlbnRyeSBwb2ludCBpcyBvbmx5IGdpdmVuIG9uZSBwYWNrZXQgYXQgYSB0aW1lCi0JICogdG8gVHgsIHNvIHRoZSBQYWNrZXRDb3VudCBhbmQgaXQncyBhcnJheSB1c2VkIG1ha2VzIG5vIHNlbnNlIGhlcmUKLQkgKi8KLQotCS8qIFRDQiBpcyBub3QgYXZhaWxhYmxlICovCi0JaWYgKGV0ZGV2LT50eF9yaW5nLnVzZWQgPj0gTlVNX1RDQikgewotCQkvKiBOT1RFOiBJZiB0aGVyZSdzIGFuIGVycm9yIG9uIHNlbmQsIG5vIG5lZWQgdG8gcXVldWUgdGhlCi0JCSAqIHBhY2tldCB1bmRlciBMaW51eDsgaWYgd2UganVzdCBzZW5kIGFuIGVycm9yIHVwIHRvIHRoZQotCQkgKiBuZXRpZiBsYXllciwgaXQgd2lsbCByZXNlbmQgdGhlIHNrYiB0byB1cy4KLQkJICovCi0JCXN0YXR1cyA9IC1FTk9NRU07Ci0JfSBlbHNlIHsKLQkJLyogV2UgbmVlZCB0byBzZWUgaWYgdGhlIGxpbmsgaXMgdXA7IGlmIGl0J3Mgbm90LCBtYWtlIHRoZQotCQkgKiBuZXRpZiBsYXllciB0aGluayB3ZSdyZSBnb29kIGFuZCBkcm9wIHRoZSBwYWNrZXQKLQkJICovCi0JCWlmICgoZXRkZXYtPmZsYWdzICYgZk1QX0FEQVBURVJfRkFJTF9TRU5EX01BU0spIHx8Ci0JCQkJCSFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKLQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCQlza2IgPSBOVUxMOwotCi0JCQlldGRldi0+bmV0X3N0YXRzLnR4X2Ryb3BwZWQrKzsKLQkJfSBlbHNlIHsKLQkJCXN0YXR1cyA9IGV0MTMxeF9zZW5kX3BhY2tldChza2IsIGV0ZGV2KTsKLQkJCWlmIChzdGF0dXMgIT0gMCAmJiBzdGF0dXMgIT0gLUVOT01FTSkgewotCQkJCS8qIE9uIGFueSBvdGhlciBlcnJvciwgbWFrZSBuZXRpZiB0aGluayB3ZSdyZQotCQkJCSAqIE9LIGFuZCBkcm9wIHRoZSBwYWNrZXQKLQkJCQkgKi8KLQkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQkJCXNrYiA9IE5VTEw7Ci0JCQkJZXRkZXYtPm5ldF9zdGF0cy50eF9kcm9wcGVkKys7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqCi0gKiBldDEzMXhfc2VuZF9wYWNrZXQgLSBEbyB0aGUgd29yayB0byBzZW5kIGEgcGFja2V0Ci0gKiBAc2tiOiB0aGUgcGFja2V0KHMpIHRvIHNlbmQKLSAqIEBldGRldjogYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCi0gKgotICogUmV0dXJuIDAgaW4gYWxtb3N0IGFsbCBjYXNlczsgbm9uLXplcm8gdmFsdWUgaW4gZXh0cmVtZSBoYXJkIGZhaWx1cmUgb25seS4KLSAqCi0gKiBBc3N1bXB0aW9uOiBTZW5kIHNwaW5sb2NrIGhhcyBiZWVuIGFjcXVpcmVkCi0gKi8KLXN0YXRpYyBpbnQgZXQxMzF4X3NlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICBzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCWludCBzdGF0dXM7Ci0Jc3RydWN0IHRjYiAqdGNiID0gTlVMTDsKLQl1MTYgKnNoYnVmdmE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIEFsbCBwYWNrZXRzIG11c3QgaGF2ZSBhdCBsZWFzdCBhIE1BQyBhZGRyZXNzIGFuZCBhIHByb3RvY29sIHR5cGUgKi8KLQlpZiAoc2tiLT5sZW4gPCBFVEhfSExFTikKLQkJcmV0dXJuIC1FSU87Ci0KLQkvKiBHZXQgYSBUQ0IgZm9yIHRoaXMgcGFja2V0ICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5UQ0JSZWFkeVFMb2NrLCBmbGFncyk7Ci0KLQl0Y2IgPSBldGRldi0+dHhfcmluZy50Y2JfcWhlYWQ7Ci0KLQlpZiAodGNiID09IE5VTEwpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPlRDQlJlYWR5UUxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZXRkZXYtPnR4X3JpbmcudGNiX3FoZWFkID0gdGNiLT5uZXh0OwotCi0JaWYgKGV0ZGV2LT50eF9yaW5nLnRjYl9xaGVhZCA9PSBOVUxMKQotCQlldGRldi0+dHhfcmluZy50Y2JfcXRhaWwgPSBOVUxMOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPlRDQlJlYWR5UUxvY2ssIGZsYWdzKTsKLQotCXRjYi0+c2tiID0gc2tiOwotCi0JaWYgKHNrYi0+ZGF0YSAhPSBOVUxMICYmIHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbiA+PSA2KSB7Ci0JCXNoYnVmdmEgPSAodTE2ICopIHNrYi0+ZGF0YTsKLQotCQlpZiAoKHNoYnVmdmFbMF0gPT0gMHhmZmZmKSAmJgotCQkgICAgKHNoYnVmdmFbMV0gPT0gMHhmZmZmKSAmJiAoc2hidWZ2YVsyXSA9PSAweGZmZmYpKSB7Ci0JCQl0Y2ItPmZsYWdzIHw9IGZNUF9ERVNUX0JST0FEOwotCQl9IGVsc2UgaWYgKChzaGJ1ZnZhWzBdICYgMHgzKSA9PSAweDAwMDEpIHsKLQkJCXRjYi0+ZmxhZ3MgfD0gIGZNUF9ERVNUX01VTFRJOwotCQl9Ci0JfQotCi0JdGNiLT5uZXh0ID0gTlVMTDsKLQotCS8qIENhbGwgdGhlIE5JQyBzcGVjaWZpYyBzZW5kIGhhbmRsZXIuICovCi0Jc3RhdHVzID0gbmljX3NlbmRfcGFja2V0KGV0ZGV2LCB0Y2IpOwotCi0JaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZldGRldi0+VENCUmVhZHlRTG9jaywgZmxhZ3MpOwotCi0JCWlmIChldGRldi0+dHhfcmluZy50Y2JfcXRhaWwpCi0JCQlldGRldi0+dHhfcmluZy50Y2JfcXRhaWwtPm5leHQgPSB0Y2I7Ci0JCWVsc2UKLQkJCS8qIEFwcGFyZW50bHkgcmVhZHkgUSBpcyBlbXB0eS4gKi8KLQkJCWV0ZGV2LT50eF9yaW5nLnRjYl9xaGVhZCA9IHRjYjsKLQotCQlldGRldi0+dHhfcmluZy50Y2JfcXRhaWwgPSB0Y2I7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0ZGV2LT5UQ0JSZWFkeVFMb2NrLCBmbGFncyk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCVdBUk5fT04oZXRkZXYtPnR4X3JpbmcudXNlZCA+IE5VTV9UQ0IpOwotCXJldHVybiAwOwotfQotCi0vKioKLSAqIG5pY19zZW5kX3BhY2tldCAtIE5JQyBzcGVjaWZpYyBzZW5kIGhhbmRsZXIgZm9yIHZlcnNpb24gQiBzaWxpY29uLgotICogQGV0ZGV2OiBwb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gKiBAdGNiOiBwb2ludGVyIHRvIHN0cnVjdCB0Y2IKLSAqCi0gKiBSZXR1cm5zIDAgb3IgZXJybm8uCi0gKi8KLXN0YXRpYyBpbnQgbmljX3NlbmRfcGFja2V0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsIHN0cnVjdCB0Y2IgKnRjYikKLXsKLQl1MzIgaTsKLQlzdHJ1Y3QgdHhfZGVzYyBkZXNjWzI0XTsJLyogMjQgeCAxNiBieXRlICovCi0JdTMyIGZyYWcgPSAwOwotCXUzMiB0aGlzY29weSwgcmVtYWluZGVyOwotCXN0cnVjdCBza19idWZmICpza2IgPSB0Y2ItPnNrYjsKLQl1MzIgbnJfZnJhZ3MgPSBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMTsKLQlzdHJ1Y3Qgc2tiX2ZyYWdfc3RydWN0ICpmcmFncyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBQYXJ0IG9mIHRoZSBvcHRpbWl6YXRpb25zIG9mIHRoaXMgc2VuZCByb3V0aW5lIHJlc3RyaWN0IHVzIHRvCi0JICogc2VuZGluZyAyNCBmcmFnbWVudHMgYXQgYSBwYXNzLiAgSW4gcHJhY3RpY2Ugd2Ugc2hvdWxkIG5ldmVyIHNlZQotCSAqIG1vcmUgdGhhbiA1IGZyYWdtZW50cy4KLQkgKgotCSAqIE5PVEU6IFRoZSBvbGRlciB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gKGJlbG93KSBjYW4gaGFuZGxlIGFueQotCSAqIG51bWJlciBvZiBmcmFnbWVudHMuIElmIG5lZWRlZCwgd2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiwKLQkgKiBhbHRob3VnaCBpdCBpcyBsZXNzIGVmZmljaWVudC4KLQkgKi8KLQlpZiAobnJfZnJhZ3MgPiAyMykKLQkJcmV0dXJuIC1FSU87Ci0KLQltZW1zZXQoZGVzYywgMCwgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqIChucl9mcmFncyArIDEpKTsKLQotCWZvciAoaSA9IDA7IGkgPCBucl9mcmFnczsgaSsrKSB7Ci0JCS8qIElmIHRoZXJlIGlzIHNvbWV0aGluZyBpbiB0aGlzIGVsZW1lbnQsIGxldHMgZ2V0IGEKLQkJICogZGVzY3JpcHRvciBmcm9tIHRoZSByaW5nIGFuZCBnZXQgdGhlIG5lY2Vzc2FyeSBkYXRhCi0JCSAqLwotCQlpZiAoaSA9PSAwKSB7Ci0JCQkvKiBJZiB0aGUgZnJhZ21lbnRzIGFyZSBzbWFsbGVyIHRoYW4gYSBzdGFuZGFyZCBNVFUsCi0JCQkgKiB0aGVuIG1hcCB0aGVtIHRvIGEgc2luZ2xlIGRlc2NyaXB0b3IgaW4gdGhlIFR4Ci0JCQkgKiBEZXNjIHJpbmcuIEhvd2V2ZXIsIGlmIHRoZXkncmUgbGFyZ2VyLCBhcyBpcwotCQkJICogcG9zc2libGUgd2l0aCBzdXBwb3J0IGZvciBqdW1ibyBwYWNrZXRzLCB0aGVuCi0JCQkgKiBzcGxpdCB0aGVtIGVhY2ggYWNyb3NzIDIgZGVzY3JpcHRvcnMuCi0JCQkgKgotCQkJICogVGhpcyB3aWxsIHdvcmsgdW50aWwgd2UgZGV0ZXJtaW5lIHdoeSB0aGUgaGFyZHdhcmUKLQkJCSAqIGRvZXNuJ3Qgc2VlbSB0byBsaWtlIGxhcmdlIGZyYWdtZW50cy4KLQkJCSAqLwotCQkJaWYgKChza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW4pIDw9IDE1MTQpIHsKLQkJCQlkZXNjW2ZyYWddLmFkZHJfaGkgPSAwOwotCQkJCS8qIExvdyAxNmJpdHMgYXJlIGxlbmd0aCwgaGlnaCBpcyB2bGFuIGFuZAotCQkJCSAgIHVudXNlZCBjdXJyZW50bHkgc28gemVybyAqLwotCQkJCWRlc2NbZnJhZ10ubGVuX3ZsYW4gPQotCQkJCQlza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW47Ci0KLQkJCQkvKiBOT1RFOiBIZXJlLCB0aGUgZG1hX2FkZHJfdCByZXR1cm5lZCBmcm9tCi0JCQkJICogcGNpX21hcF9zaW5nbGUoKSBpcyBpbXBsaWNpdGx5IGNhc3QgYXMgYQotCQkJCSAqIHUzMi4gQWx0aG91Z2ggZG1hX2FkZHJfdCBjYW4gYmUKLQkJCQkgKiA2NC1iaXQsIHRoZSBhZGRyZXNzIHJldHVybmVkIGJ5Ci0JCQkJICogcGNpX21hcF9zaW5nbGUoKSBpcyBhbHdheXMgMzItYml0Ci0JCQkJICogYWRkcmVzc2FibGUgKGFzIGRlZmluZWQgYnkgdGhlIHBjaS9kbWEKLQkJCQkgKiBzdWJzeXN0ZW0pCi0JCQkJICovCi0JCQkJZGVzY1tmcmFnKytdLmFkZHJfbG8gPQotCQkJCSAgICBwY2lfbWFwX3NpbmdsZShldGRldi0+cGRldiwKLQkJCQkJCSAgIHNrYi0+ZGF0YSwKLQkJCQkJCSAgIHNrYi0+bGVuIC0KLQkJCQkJCSAgIHNrYi0+ZGF0YV9sZW4sCi0JCQkJCQkgICBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGVzY1tmcmFnXS5hZGRyX2hpID0gMDsKLQkJCQlkZXNjW2ZyYWddLmxlbl92bGFuID0KLQkJCQkgICAgKHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbikgLyAyOwotCi0JCQkJLyogTk9URTogSGVyZSwgdGhlIGRtYV9hZGRyX3QgcmV0dXJuZWQgZnJvbQotCQkJCSAqIHBjaV9tYXBfc2luZ2xlKCkgaXMgaW1wbGljaXRseSBjYXN0IGFzIGEKLQkJCQkgKiB1MzIuIEFsdGhvdWdoIGRtYV9hZGRyX3QgY2FuIGJlCi0JCQkJICogNjQtYml0LCB0aGUgYWRkcmVzcyByZXR1cm5lZCBieQotCQkJCSAqIHBjaV9tYXBfc2luZ2xlKCkgaXMgYWx3YXlzIDMyLWJpdAotCQkJCSAqIGFkZHJlc3NhYmxlIChhcyBkZWZpbmVkIGJ5IHRoZSBwY2kvZG1hCi0JCQkJICogc3Vic3lzdGVtKQotCQkJCSAqLwotCQkJCWRlc2NbZnJhZysrXS5hZGRyX2xvID0KLQkJCQkgICAgcGNpX21hcF9zaW5nbGUoZXRkZXYtPnBkZXYsCi0JCQkJCQkgICBza2ItPmRhdGEsCi0JCQkJCQkgICAoKHNrYi0+bGVuIC0KLQkJCQkJCSAgICAgc2tiLT5kYXRhX2xlbikgLyAyKSwKLQkJCQkJCSAgIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJCWRlc2NbZnJhZ10uYWRkcl9oaSA9IDA7Ci0KLQkJCQlkZXNjW2ZyYWddLmxlbl92bGFuID0KLQkJCQkgICAgKHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbikgLyAyOwotCi0JCQkJLyogTk9URTogSGVyZSwgdGhlIGRtYV9hZGRyX3QgcmV0dXJuZWQgZnJvbQotCQkJCSAqIHBjaV9tYXBfc2luZ2xlKCkgaXMgaW1wbGljaXRseSBjYXN0IGFzIGEKLQkJCQkgKiB1MzIuIEFsdGhvdWdoIGRtYV9hZGRyX3QgY2FuIGJlCi0JCQkJICogNjQtYml0LCB0aGUgYWRkcmVzcyByZXR1cm5lZCBieQotCQkJCSAqIHBjaV9tYXBfc2luZ2xlKCkgaXMgYWx3YXlzIDMyLWJpdAotCQkJCSAqIGFkZHJlc3NhYmxlIChhcyBkZWZpbmVkIGJ5IHRoZSBwY2kvZG1hCi0JCQkJICogc3Vic3lzdGVtKQotCQkJCSAqLwotCQkJCWRlc2NbZnJhZysrXS5hZGRyX2xvID0KLQkJCQkgICAgcGNpX21hcF9zaW5nbGUoZXRkZXYtPnBkZXYsCi0JCQkJCQkgICBza2ItPmRhdGEgKwotCQkJCQkJICAgKChza2ItPmxlbiAtCi0JCQkJCQkgICAgIHNrYi0+ZGF0YV9sZW4pIC8gMiksCi0JCQkJCQkgICAoKHNrYi0+bGVuIC0KLQkJCQkJCSAgICAgc2tiLT5kYXRhX2xlbikgLyAyKSwKLQkJCQkJCSAgIFBDSV9ETUFfVE9ERVZJQ0UpOwotCQkJfQotCQl9IGVsc2UgewotCQkJZGVzY1tmcmFnXS5hZGRyX2hpID0gMDsKLQkJCWRlc2NbZnJhZ10ubGVuX3ZsYW4gPQotCQkJCQlmcmFnc1tpIC0gMV0uc2l6ZTsKLQotCQkJLyogTk9URTogSGVyZSwgdGhlIGRtYV9hZGRyX3QgcmV0dXJuZWQgZnJvbQotCQkJICogcGNpX21hcF9wYWdlKCkgaXMgaW1wbGljaXRseSBjYXN0IGFzIGEgdTMyLgotCQkJICogQWx0aG91Z2ggZG1hX2FkZHJfdCBjYW4gYmUgNjQtYml0LCB0aGUgYWRkcmVzcwotCQkJICogcmV0dXJuZWQgYnkgcGNpX21hcF9wYWdlKCkgaXMgYWx3YXlzIDMyLWJpdAotCQkJICogYWRkcmVzc2FibGUgKGFzIGRlZmluZWQgYnkgdGhlIHBjaS9kbWEgc3Vic3lzdGVtKQotCQkJICovCi0JCQlkZXNjW2ZyYWcrK10uYWRkcl9sbyA9IHNrYl9mcmFnX2RtYV9tYXAoCi0JCQkJCQkJJmV0ZGV2LT5wZGV2LT5kZXYsCi0JCQkJCQkJJmZyYWdzW2kgLSAxXSwKLQkJCQkJCQkwLAotCQkJCQkJCWZyYWdzW2kgLSAxXS5zaXplLAotCQkJCQkJCURNQV9UT19ERVZJQ0UpOwotCQl9Ci0JfQotCi0JaWYgKGZyYWcgPT0gMCkKLQkJcmV0dXJuIC1FSU87Ci0KLQlpZiAoZXRkZXYtPmxpbmtzcGVlZCA9PSBUUlVFUEhZX1NQRUVEXzEwMDBNQlBTKSB7Ci0JCWlmICgrK2V0ZGV2LT50eF9yaW5nLnNpbmNlX2lycSA9PSBQQVJNX1RYX05VTV9CVUZTX0RFRikgewotCQkJLyogTGFzdCBlbGVtZW50ICYgSW50ZXJydXB0IGZsYWcgKi8KLQkJCWRlc2NbZnJhZyAtIDFdLmZsYWdzID0gMHg1OwotCQkJZXRkZXYtPnR4X3Jpbmcuc2luY2VfaXJxID0gMDsKLQkJfSBlbHNlIHsgLyogTGFzdCBlbGVtZW50ICovCi0JCQlkZXNjW2ZyYWcgLSAxXS5mbGFncyA9IDB4MTsKLQkJfQotCX0gZWxzZQotCQlkZXNjW2ZyYWcgLSAxXS5mbGFncyA9IDB4NTsKLQotCWRlc2NbMF0uZmxhZ3MgfD0gMjsJLyogRmlyc3QgZWxlbWVudCBmbGFnICovCi0KLQl0Y2ItPmluZGV4X3N0YXJ0ID0gZXRkZXYtPnR4X3Jpbmcuc2VuZF9pZHg7Ci0JdGNiLT5zdGFsZSA9IDA7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZXRkZXYtPnNlbmRfaHdfbG9jaywgZmxhZ3MpOwotCi0JdGhpc2NvcHkgPSBOVU1fREVTQ19QRVJfUklOR19UWCAtCi0JCQkJSU5ERVgxMChldGRldi0+dHhfcmluZy5zZW5kX2lkeCk7Ci0KLQlpZiAodGhpc2NvcHkgPj0gZnJhZykgewotCQlyZW1haW5kZXIgPSAwOwotCQl0aGlzY29weSA9IGZyYWc7Ci0JfSBlbHNlIHsKLQkJcmVtYWluZGVyID0gZnJhZyAtIHRoaXNjb3B5OwotCX0KLQotCW1lbWNweShldGRldi0+dHhfcmluZy50eF9kZXNjX3JpbmcgKwotCSAgICAgICBJTkRFWDEwKGV0ZGV2LT50eF9yaW5nLnNlbmRfaWR4KSwgZGVzYywKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqIHRoaXNjb3B5KTsKLQotCWFkZF8xMGJpdCgmZXRkZXYtPnR4X3Jpbmcuc2VuZF9pZHgsIHRoaXNjb3B5KTsKLQotCWlmIChJTkRFWDEwKGV0ZGV2LT50eF9yaW5nLnNlbmRfaWR4KSA9PSAwIHx8Ci0JCSAgICBJTkRFWDEwKGV0ZGV2LT50eF9yaW5nLnNlbmRfaWR4KSA9PSBOVU1fREVTQ19QRVJfUklOR19UWCkgewotCQlldGRldi0+dHhfcmluZy5zZW5kX2lkeCAmPSB+RVRfRE1BMTBfTUFTSzsKLQkJZXRkZXYtPnR4X3Jpbmcuc2VuZF9pZHggXj0gRVRfRE1BMTBfV1JBUDsKLQl9Ci0KLQlpZiAocmVtYWluZGVyKSB7Ci0JCW1lbWNweShldGRldi0+dHhfcmluZy50eF9kZXNjX3JpbmcsCi0JCSAgICAgICBkZXNjICsgdGhpc2NvcHksCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IHR4X2Rlc2MpICogcmVtYWluZGVyKTsKLQotCQlhZGRfMTBiaXQoJmV0ZGV2LT50eF9yaW5nLnNlbmRfaWR4LCByZW1haW5kZXIpOwotCX0KLQotCWlmIChJTkRFWDEwKGV0ZGV2LT50eF9yaW5nLnNlbmRfaWR4KSA9PSAwKSB7Ci0JCWlmIChldGRldi0+dHhfcmluZy5zZW5kX2lkeCkKLQkJCXRjYi0+aW5kZXggPSBOVU1fREVTQ19QRVJfUklOR19UWCAtIDE7Ci0JCWVsc2UKLQkJCXRjYi0+aW5kZXggPSBFVF9ETUExMF9XUkFQfChOVU1fREVTQ19QRVJfUklOR19UWCAtIDEpOwotCX0gZWxzZQotCQl0Y2ItPmluZGV4ID0gZXRkZXYtPnR4X3Jpbmcuc2VuZF9pZHggLSAxOwotCi0Jc3Bpbl9sb2NrKCZldGRldi0+VENCU2VuZFFMb2NrKTsKLQotCWlmIChldGRldi0+dHhfcmluZy5zZW5kX3RhaWwpCi0JCWV0ZGV2LT50eF9yaW5nLnNlbmRfdGFpbC0+bmV4dCA9IHRjYjsKLQllbHNlCi0JCWV0ZGV2LT50eF9yaW5nLnNlbmRfaGVhZCA9IHRjYjsKLQotCWV0ZGV2LT50eF9yaW5nLnNlbmRfdGFpbCA9IHRjYjsKLQotCVdBUk5fT04odGNiLT5uZXh0ICE9IE5VTEwpOwotCi0JZXRkZXYtPnR4X3JpbmcudXNlZCsrOwotCi0Jc3Bpbl91bmxvY2soJmV0ZGV2LT5UQ0JTZW5kUUxvY2spOwotCi0JLyogV3JpdGUgdGhlIG5ldyB3cml0ZSBwb2ludGVyIGJhY2sgdG8gdGhlIGRldmljZS4gKi8KLQl3cml0ZWwoZXRkZXYtPnR4X3Jpbmcuc2VuZF9pZHgsCi0JICAgICAgICZldGRldi0+cmVncy0+dHhkbWEuc2VydmljZV9yZXF1ZXN0KTsKLQotCS8qIEZvciBHaWcgb25seSwgd2UgdXNlIFR4IEludGVycnVwdCBjb2FsZXNjaW5nLiAgRW5hYmxlIHRoZSBzb2Z0d2FyZQotCSAqIHRpbWVyIHRvIHdha2UgdXMgdXAgaWYgdGhpcyBwYWNrZXQgaXNuJ3QgZm9sbG93ZWQgYnkgTiBtb3JlLgotCSAqLwotCWlmIChldGRldi0+bGlua3NwZWVkID09IFRSVUVQSFlfU1BFRURfMTAwME1CUFMpIHsKLQkJd3JpdGVsKFBBUk1fVFhfVElNRV9JTlRfREVGICogTkFOT19JTl9BX01JQ1JPLAotCQkgICAgICAgJmV0ZGV2LT5yZWdzLT5nbG9iYWwud2F0Y2hkb2dfdGltZXIpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+c2VuZF9od19sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKioKLSAqIGV0MTMxeF9mcmVlX3NlbmRfcGFja2V0IC0gUmVjeWNsZSBhIHN0cnVjdCB0Y2IKLSAqIEBldGRldjogcG9pbnRlciB0byBvdXIgYWRhcHRlcgotICogQHRjYjogcG9pbnRlciB0byBzdHJ1Y3QgdGNiCi0gKgotICogQ29tcGxldGUgdGhlIHBhY2tldCBpZiBuZWNlc3NhcnkKLSAqIEFzc3VtcHRpb24gLSBTZW5kIHNwaW5sb2NrIGhhcyBiZWVuIGFjcXVpcmVkCi0gKi8KLWlubGluZSB2b2lkIGV0MTMxeF9mcmVlX3NlbmRfcGFja2V0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYsCi0JCQkJCQlzdHJ1Y3QgdGNiICp0Y2IpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgdHhfZGVzYyAqZGVzYyA9IE5VTEw7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmV0ZGV2LT5uZXRfc3RhdHM7Ci0KLQlpZiAodGNiLT5mbGFncyAmIGZNUF9ERVNUX0JST0FEKQotCQlhdG9taWNfaW5jKCZldGRldi0+c3RhdHMuYnJkY3N0eG10KTsKLQllbHNlIGlmICh0Y2ItPmZsYWdzICYgZk1QX0RFU1RfTVVMVEkpCi0JCWF0b21pY19pbmMoJmV0ZGV2LT5zdGF0cy5tdWx0aXhtdCk7Ci0JZWxzZQotCQlhdG9taWNfaW5jKCZldGRldi0+c3RhdHMudW5peG10KTsKLQotCWlmICh0Y2ItPnNrYikgewotCQlzdGF0cy0+dHhfYnl0ZXMgKz0gdGNiLT5za2ItPmxlbjsKLQotCQkvKiBJdGVyYXRlIHRocm91Z2ggdGhlIFRYIGRlc2NyaXB0b3JzIG9uIHRoZSByaW5nCi0JCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBwYWNrZXQgYW5kIHVtYXAgdGhlIGZyYWdtZW50cwotCQkgKiB0aGV5IHBvaW50IHRvCi0JCSAqLwotCQlkbyB7Ci0JCQlkZXNjID0gKHN0cnVjdCB0eF9kZXNjICopKGV0ZGV2LT50eF9yaW5nLnR4X2Rlc2NfcmluZyArCi0JCQkJCQlJTkRFWDEwKHRjYi0+aW5kZXhfc3RhcnQpKTsKLQotCQkJcGNpX3VubWFwX3NpbmdsZShldGRldi0+cGRldiwKLQkJCQkJIGRlc2MtPmFkZHJfbG8sCi0JCQkJCSBkZXNjLT5sZW5fdmxhbiwgUENJX0RNQV9UT0RFVklDRSk7Ci0KLQkJCWFkZF8xMGJpdCgmdGNiLT5pbmRleF9zdGFydCwgMSk7Ci0JCQlpZiAoSU5ERVgxMCh0Y2ItPmluZGV4X3N0YXJ0KSA+PQotCQkJCQkJCU5VTV9ERVNDX1BFUl9SSU5HX1RYKSB7Ci0JCQkJdGNiLT5pbmRleF9zdGFydCAmPSB+RVRfRE1BMTBfTUFTSzsKLQkJCQl0Y2ItPmluZGV4X3N0YXJ0IF49IEVUX0RNQTEwX1dSQVA7Ci0JCQl9Ci0JCX0gd2hpbGUgKGRlc2MgIT0gKGV0ZGV2LT50eF9yaW5nLnR4X2Rlc2NfcmluZyArCi0JCQkJSU5ERVgxMCh0Y2ItPmluZGV4KSkpOwotCi0JCWRldl9rZnJlZV9za2JfYW55KHRjYi0+c2tiKTsKLQl9Ci0KLQltZW1zZXQodGNiLCAwLCBzaXplb2Yoc3RydWN0IHRjYikpOwotCi0JLyogQWRkIHRoZSBUQ0IgdG8gdGhlIFJlYWR5IFEgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZXRkZXYtPlRDQlJlYWR5UUxvY2ssIGZsYWdzKTsKLQotCWV0ZGV2LT5uZXRfc3RhdHMudHhfcGFja2V0cysrOwotCi0JaWYgKGV0ZGV2LT50eF9yaW5nLnRjYl9xdGFpbCkKLQkJZXRkZXYtPnR4X3JpbmcudGNiX3F0YWlsLT5uZXh0ID0gdGNiOwotCWVsc2UKLQkJLyogQXBwYXJlbnRseSByZWFkeSBRIGlzIGVtcHR5LiAqLwotCQlldGRldi0+dHhfcmluZy50Y2JfcWhlYWQgPSB0Y2I7Ci0KLQlldGRldi0+dHhfcmluZy50Y2JfcXRhaWwgPSB0Y2I7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+VENCUmVhZHlRTG9jaywgZmxhZ3MpOwotCVdBUk5fT04oZXRkZXYtPnR4X3JpbmcudXNlZCA8IDApOwotfQotCi0vKioKLSAqIGV0MTMxeF9mcmVlX2J1c3lfc2VuZF9wYWNrZXRzIC0gRnJlZSBhbmQgY29tcGxldGUgdGhlIHN0b3BwZWQgYWN0aXZlIHNlbmRzCi0gKiBAZXRkZXY6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKLSAqCi0gKiBBc3N1bXB0aW9uIC0gU2VuZCBzcGlubG9jayBoYXMgYmVlbiBhY3F1aXJlZAotICovCi12b2lkIGV0MTMxeF9mcmVlX2J1c3lfc2VuZF9wYWNrZXRzKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCi17Ci0Jc3RydWN0IHRjYiAqdGNiOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIGZyZWVkID0gMDsKLQotCS8qIEFueSBwYWNrZXRzIGJlaW5nIHNlbnQ/IENoZWNrIHRoZSBmaXJzdCBUQ0Igb24gdGhlIHNlbmQgbGlzdCAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZldGRldi0+VENCU2VuZFFMb2NrLCBmbGFncyk7Ci0KLQl0Y2IgPSBldGRldi0+dHhfcmluZy5zZW5kX2hlYWQ7Ci0KLQl3aGlsZSAodGNiICE9IE5VTEwgJiYgZnJlZWQgPCBOVU1fVENCKSB7Ci0JCXN0cnVjdCB0Y2IgKm5leHQgPSB0Y2ItPm5leHQ7Ci0KLQkJZXRkZXYtPnR4X3Jpbmcuc2VuZF9oZWFkID0gbmV4dDsKLQotCQlpZiAobmV4dCA9PSBOVUxMKQotCQkJZXRkZXYtPnR4X3Jpbmcuc2VuZF90YWlsID0gTlVMTDsKLQotCQlldGRldi0+dHhfcmluZy51c2VkLS07Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPlRDQlNlbmRRTG9jaywgZmxhZ3MpOwotCi0JCWZyZWVkKys7Ci0JCWV0MTMxeF9mcmVlX3NlbmRfcGFja2V0KGV0ZGV2LCB0Y2IpOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZldGRldi0+VENCU2VuZFFMb2NrLCBmbGFncyk7Ci0KLQkJdGNiID0gZXRkZXYtPnR4X3Jpbmcuc2VuZF9oZWFkOwotCX0KLQotCVdBUk5fT04oZnJlZWQgPT0gTlVNX1RDQik7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+VENCU2VuZFFMb2NrLCBmbGFncyk7Ci0KLQlldGRldi0+dHhfcmluZy51c2VkID0gMDsKLX0KLQotLyoqCi0gKiBldDEzMXhfaGFuZGxlX3NlbmRfaW50ZXJydXB0IC0gSW50ZXJydXB0IGhhbmRsZXIgZm9yIHNlbmRpbmcgcHJvY2Vzc2luZwotICogQGV0ZGV2OiBwb2ludGVyIHRvIG91ciBhZGFwdGVyCi0gKgotICogUmUtY2xhaW0gdGhlIHNlbmQgcmVzb3VyY2VzLCBjb21wbGV0ZSBzZW5kcyBhbmQgZ2V0IG1vcmUgdG8gc2VuZCBmcm9tCi0gKiB0aGUgc2VuZCB3YWl0IHF1ZXVlLgotICoKLSAqIEFzc3VtcHRpb24gLSBTZW5kIHNwaW5sb2NrIGhhcyBiZWVuIGFjcXVpcmVkCi0gKi8KLXZvaWQgZXQxMzF4X2hhbmRsZV9zZW5kX2ludGVycnVwdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIHNlcnZpY2VkOwotCXN0cnVjdCB0Y2IgKnRjYjsKLQl1MzIgaW5kZXg7Ci0KLQlzZXJ2aWNlZCA9IHJlYWRsKCZldGRldi0+cmVncy0+dHhkbWEubmV3X3NlcnZpY2VfY29tcGxldGUpOwotCWluZGV4ID0gSU5ERVgxMChzZXJ2aWNlZCk7Ci0KLQkvKiBIYXMgdGhlIHJpbmcgd3JhcHBlZD8gIFByb2Nlc3MgYW55IGRlc2NyaXB0b3JzIHRoYXQgZG8gbm90IGhhdmUKLQkgKiB0aGUgc2FtZSAid3JhcCIgaW5kaWNhdG9yIGFzIHRoZSBjdXJyZW50IGNvbXBsZXRpb24gaW5kaWNhdG9yCi0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5UQ0JTZW5kUUxvY2ssIGZsYWdzKTsKLQotCXRjYiA9IGV0ZGV2LT50eF9yaW5nLnNlbmRfaGVhZDsKLQotCXdoaWxlICh0Y2IgJiYKLQkgICAgICAgKChzZXJ2aWNlZCBeIHRjYi0+aW5kZXgpICYgRVRfRE1BMTBfV1JBUCkgJiYKLQkgICAgICAgaW5kZXggPCBJTkRFWDEwKHRjYi0+aW5kZXgpKSB7Ci0JCWV0ZGV2LT50eF9yaW5nLnVzZWQtLTsKLQkJZXRkZXYtPnR4X3Jpbmcuc2VuZF9oZWFkID0gdGNiLT5uZXh0OwotCQlpZiAodGNiLT5uZXh0ID09IE5VTEwpCi0JCQlldGRldi0+dHhfcmluZy5zZW5kX3RhaWwgPSBOVUxMOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0ZGV2LT5UQ0JTZW5kUUxvY2ssIGZsYWdzKTsKLQkJZXQxMzF4X2ZyZWVfc2VuZF9wYWNrZXQoZXRkZXYsIHRjYik7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZldGRldi0+VENCU2VuZFFMb2NrLCBmbGFncyk7Ci0KLQkJLyogR290byB0aGUgbmV4dCBwYWNrZXQgKi8KLQkJdGNiID0gZXRkZXYtPnR4X3Jpbmcuc2VuZF9oZWFkOwotCX0KLQl3aGlsZSAodGNiICYmCi0JICAgICAgICEoKHNlcnZpY2VkIF4gdGNiLT5pbmRleCkgJiBFVF9ETUExMF9XUkFQKQotCSAgICAgICAmJiBpbmRleCA+ICh0Y2ItPmluZGV4ICYgRVRfRE1BMTBfTUFTSykpIHsKLQkJZXRkZXYtPnR4X3JpbmcudXNlZC0tOwotCQlldGRldi0+dHhfcmluZy5zZW5kX2hlYWQgPSB0Y2ItPm5leHQ7Ci0JCWlmICh0Y2ItPm5leHQgPT0gTlVMTCkKLQkJCWV0ZGV2LT50eF9yaW5nLnNlbmRfdGFpbCA9IE5VTEw7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPlRDQlNlbmRRTG9jaywgZmxhZ3MpOwotCQlldDEzMXhfZnJlZV9zZW5kX3BhY2tldChldGRldiwgdGNiKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmV0ZGV2LT5UQ0JTZW5kUUxvY2ssIGZsYWdzKTsKLQotCQkvKiBHb3RvIHRoZSBuZXh0IHBhY2tldCAqLwotCQl0Y2IgPSBldGRldi0+dHhfcmluZy5zZW5kX2hlYWQ7Ci0JfQotCi0JLyogV2FrZSB1cCB0aGUgcXVldWUgd2hlbiB3ZSBoaXQgYSBsb3ctd2F0ZXIgbWFyayAqLwotCWlmIChldGRldi0+dHhfcmluZy51c2VkIDw9IE5VTV9UQ0IgLyAzKQotCQluZXRpZl93YWtlX3F1ZXVlKGV0ZGV2LT5uZXRkZXYpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXRkZXYtPlRDQlNlbmRRTG9jaywgZmxhZ3MpOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF90eC5oIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMTBfdHguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJkMDZlOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxMF90eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0gKiBBZ2VyZSBTeXN0ZW1zIEluYy4KLSAqIDEwLzEwMC8xMDAwIEJhc2UtVCBFdGhlcm5ldCBEcml2ZXIgZm9yIHRoZSBFVDEzMDEgYW5kIEVUMTMxeCBzZXJpZXMgTUFDcwotICoKLSAqIENvcHlyaWdodCDCqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIGV0MTMxMF90eC5oIC0gRGVmaW5lcywgc3RydWN0cywgZW51bXMsIHByb3RvdHlwZXMsIGV0Yy4gcGVydGFpbmluZyB0byBkYXRhCi0gKiAgICAgICAgICAgICAgIHRyYW5zbWlzc2lvbi4KLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIFNPRlRXQVJFIExJQ0VOU0UKLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9ucywKLSAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKLSAqIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KLSAqIG5vdCBhZ3JlZSB3aXRoIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLCBkbyBub3QgdXNlIHRoZSBzb2Z0d2FyZS4KLSAqCi0gKiBDb3B5cmlnaHQgwqkgMjAwNSBBZ2VyZSBTeXN0ZW1zIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqCi0gKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwotICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKLSAqICAgIHdlbGwgYXMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIC4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAotICogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgotICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKLSAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQotICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogRGlzY2xhaW1lcgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAotICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgotICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIEFOWQotICogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KLSAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgQ09OVFJBQ1QsIFNUUklDVAotICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICi0gKiBEQU1BR0UuCi0gKgotICovCi0KLSNpZm5kZWYgX19FVDEzMTBfVFhfSF9fCi0jZGVmaW5lIF9fRVQxMzEwX1RYX0hfXwotCi0KLS8qIFR5cGVkZWZzIGZvciBUeCBEZXNjcmlwdG9yIFJpbmcgKi8KLQotLyoKLSAqIHdvcmQgMiBvZiB0aGUgY29udHJvbCBiaXRzIGluIHRoZSBUeCBEZXNjcmlwdG9yIHJpbmcgZm9yIHRoZSBFVC0xMzEwCi0gKgotICogMC0xNTogbGVuZ3RoIG9mIHBhY2tldAotICogMTYtMjc6IFZMQU4gdGFnCi0gKiAyODogVkxBTiBDRkkKLSAqIDI5LTMxOiBWTEFOIHByaW9yaXR5Ci0gKgotICogd29yZCAzIG9mIHRoZSBjb250cm9sIGJpdHMgaW4gdGhlIFR4IERlc2NyaXB0b3IgcmluZyBmb3IgdGhlIEVULTEzMTAKLSAqCi0gKiAwOiBsYXN0IHBhY2tldCBpbiB0aGUgc2VxdWVuY2UKLSAqIDE6IGZpcnN0IHBhY2tldCBpbiB0aGUgc2VxdWVuY2UKLSAqIDI6IGludGVycnVwdCB0aGUgcHJvY2Vzc29yIHdoZW4gdGhpcyBwa3Qgc2VudAotICogMzogQ29udHJvbCB3b3JkIC0gbm8gcGFja2V0IGRhdGEKLSAqIDQ6IElzc3VlIGhhbGYtZHVwbGV4IGJhY2twcmVzc3VyZSA6IFhPTi9YT0ZGCi0gKiA1OiBzZW5kIHBhdXNlIGZyYW1lCi0gKiA2OiBUeCBmcmFtZSBoYXMgZXJyb3IKLSAqIDc6IGFwcGVuZCBDUkMKLSAqIDg6IE1BQyBvdmVycmlkZQotICogOTogcGFkIHBhY2tldAotICogMTA6IFBhY2tldCBpcyBhIEh1Z2UgcGFja2V0Ci0gKiAxMTogYXBwZW5kIFZMQU4gdGFnCi0gKiAxMjogSVAgY2hlY2tzdW0gYXNzaXN0Ci0gKiAxMzogVENQIGNoZWNrc3VtIGFzc2lzdAotICogMTQ6IFVEUCBjaGVja3N1bSBhc3Npc3QKLSAqLwotCi0vKiBzdHJ1Y3QgdHhfZGVzYyByZXByZXNlbnRzIGVhY2ggZGVzY3JpcHRvciBvbiB0aGUgcmluZyAqLwotc3RydWN0IHR4X2Rlc2MgewotCXUzMiBhZGRyX2hpOwotCXUzMiBhZGRyX2xvOwotCXUzMiBsZW5fdmxhbjsJLyogY29udHJvbCB3b3JkcyBob3cgdG8geG1pdCB0aGUgKi8KLQl1MzIgZmxhZ3M7CS8qIGRhdGEgKGRldGFpbGVkIGFib3ZlKSAqLwotfTsKLQotLyoKLSAqIFRoZSBzdGF0dXMgb2YgdGhlIFR4IERNQSBlbmdpbmUgaXQgc2l0cyBpbiBmcmVlIG1lbW9yeSwgYW5kIGlzIHBvaW50ZWQgdG8KLSAqIGJ5IDB4MTAxYyAvIDB4MTAyMC4gVGhpcyBpcyBhIERNQTEwIHR5cGUKLSAqLwotCi0vKiBUQ0IgKFRyYW5zbWl0IENvbnRyb2wgQmxvY2s6IEhvc3QgU2lkZSkgKi8KLXN0cnVjdCB0Y2IgewotCXN0cnVjdCB0Y2IgKm5leHQ7CS8qIE5leHQgZW50cnkgaW4gcmluZyAqLwotCXUzMiBmbGFnczsJCS8qIE91ciBmbGFncyBmb3IgdGhlIHBhY2tldCAqLwotCXUzMiBjb3VudDsJCS8qIFVzZWQgdG8gc3BvdCBzdHVjay9sb3N0IHBhY2tldHMgKi8KLQl1MzIgc3RhbGU7CQkvKiBVc2VkIHRvIHNwb3Qgc3R1Y2svbG9zdCBwYWNrZXRzICovCi0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsJLyogTmV0d29yayBza2Igd2UgYXJlIHRpZWQgdG8gKi8KLQl1MzIgaW5kZXg7CQkvKiBSaW5nIGluZGV4ZXMgKi8KLQl1MzIgaW5kZXhfc3RhcnQ7Ci19OwotCi0vKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIG91ciBsb2NhbCByZWZlcmVuY2UocykgdG8gdGhlIHJpbmcgKi8KLXN0cnVjdCB0eF9yaW5nIHsKLQkvKiBUQ0IgKFRyYW5zbWl0IENvbnRyb2wgQmxvY2spIG1lbW9yeSBhbmQgbGlzdHMgKi8KLQlzdHJ1Y3QgdGNiICp0Y2JfcmluZzsKLQotCS8qIExpc3Qgb2YgVENCcyB0aGF0IGFyZSByZWFkeSB0byBiZSB1c2VkICovCi0Jc3RydWN0IHRjYiAqdGNiX3FoZWFkOwotCXN0cnVjdCB0Y2IgKnRjYl9xdGFpbDsKLQotCS8qIGxpc3Qgb2YgVENCcyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcgc2VudC4gIE5PVEUgdGhhdCBhY2Nlc3MgdG8gYWxsCi0JICogdGhyZWUgb2YgdGhlc2UgKGluY2x1ZGluZyB1c2VkKSBhcmUgY29udHJvbGxlZCB2aWEgdGhlCi0JICogVENCU2VuZFFMb2NrLiAgVGhpcyBsb2NrIHNob3VsZCBiZSBzZWN1cmVkIHByaW9yIHRvIGluY2VtZW50aW5nIC8KLQkgKiBkZWNyZW1lbnRpbmcgdXNlZCwgb3IgYW55IHF1ZXVlIG1hbmlwdWxhdGlvbiBvbiBzZW5kX2hlYWQgLwotCSAqIHRhaWwKLQkgKi8KLQlzdHJ1Y3QgdGNiICpzZW5kX2hlYWQ7Ci0Jc3RydWN0IHRjYiAqc2VuZF90YWlsOwotCWludCB1c2VkOwotCi0JLyogVGhlIGFjdHVhbCBkZXNjcmlwdG9yIHJpbmcgKi8KLQlzdHJ1Y3QgdHhfZGVzYyAqdHhfZGVzY19yaW5nOwotCWRtYV9hZGRyX3QgdHhfZGVzY19yaW5nX3BhOwotCi0JLyogc2VuZF9pZHggaW5kaWNhdGVzIHdoZXJlIHdlIGxhc3Qgd3JvdGUgdG8gaW4gdGhlIGRlc2NyaXB0b3IgcmluZy4gKi8KLQl1MzIgc2VuZF9pZHg7Ci0KLQkvKiBUaGUgbG9jYXRpb24gb2YgdGhlIHdyaXRlLWJhY2sgc3RhdHVzIGJsb2NrICovCi0JdTMyICp0eF9zdGF0dXM7Ci0JZG1hX2FkZHJfdCB0eF9zdGF0dXNfcGE7Ci0KLQkvKiBQYWNrZXRzIHNpbmNlIHRoZSBsYXN0IElSUTogdXNlZCBmb3IgaW50ZXJydXB0IGNvYWxlc2NpbmcgKi8KLQlpbnQgc2luY2VfaXJxOwotfTsKLQotI2VuZGlmIC8qIF9fRVQxMzEwX1RYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVmNDRhMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4LmMKQEAgLTAsMCArMSw1NTE0IEBACisvKgorICogQWdlcmUgU3lzdGVtcyBJbmMuCisgKiAxMC8xMDAvMTAwMCBCYXNlLVQgRXRoZXJuZXQgRHJpdmVyIGZvciB0aGUgRVQxMzAxIGFuZCBFVDEzMXggc2VyaWVzIE1BQ3MKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAwNSBBZ2VyZSBTeXN0ZW1zIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExIE1hcmsgRWlub24gPG1hcmsuZWlub25AZ21haWwuY29tPgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU09GVFdBUkUgTElDRU5TRQorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAorICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcworICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbworICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgorICoKKyAqIENvcHlyaWdodCDCqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9waHkuaD4KKworI2luY2x1ZGUgImV0MTMxeC5oIgorCitNT0RVTEVfQVVUSE9SKCJWaWN0b3IgU29yaWFubyA8dmpzb3JpYW5vQGFnZXJlLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIk1hcmsgRWlub24gPG1hcmsuZWlub25AZ21haWwuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCIxMC8xMDAvMTAwMCBCYXNlLVQgRXRoZXJuZXQgRHJpdmVyICIKKwkJICAgImZvciB0aGUgRVQxMzEwIGJ5IEFnZXJlIFN5c3RlbXMiKTsKKworLyogRUVQUk9NIGRlZmluZXMgKi8KKyNkZWZpbmUgTUFYX05VTV9SRUdJU1RFUl9QT0xMUyAgICAgICAgICAxMDAwCisjZGVmaW5lIE1BWF9OVU1fV1JJVEVfUkVUUklFUyAgICAgICAgICAgMgorCisvKiBNQUMgZGVmaW5lcyAqLworI2RlZmluZSBDT1VOVEVSX1dSQVBfMTZfQklUIDB4MTAwMDAKKyNkZWZpbmUgQ09VTlRFUl9XUkFQXzEyX0JJVCAweDEwMDAKKworLyogUENJIGRlZmluZXMgKi8KKyNkZWZpbmUgSU5URVJOQUxfTUVNX1NJWkUgICAgICAgMHg0MDAJLyogMTAyNCBvZiBpbnRlcm5hbCBtZW1vcnkgKi8KKyNkZWZpbmUgSU5URVJOQUxfTUVNX1JYX09GRlNFVCAgMHgxRkYJLyogNTAlICAgVHgsIDUwJSAgIFJ4ICovCisKKy8qIElTUiBkZWZpbmVzICovCisvKgorICogRm9yIGludGVycnVwdHMsIG5vcm1hbCBydW5uaW5nIGlzOgorICogICAgICAgcnhkbWFfeGZyX2RvbmUsIHBoeV9pbnRlcnJ1cHQsIG1hY19zdGF0X2ludGVycnVwdCwKKyAqICAgICAgIHdhdGNoZG9nX2ludGVycnVwdCAmIHR4ZG1hX3hmZXJfZG9uZQorICoKKyAqIEluIGJvdGggY2FzZXMsIHdoZW4gZmxvdyBjb250cm9sIGlzIGVuYWJsZWQgZm9yIGVpdGhlciBUeCBvciBiaS1kaXJlY3Rpb24sCisgKiB3ZSBhZGRpdGlvbmFsIGVuYWJsZSByeF9mYnIwX2xvdyBhbmQgcnhfZmJyMV9sb3csIHNvIHdlIGtub3cgd2hlbiB0aGUKKyAqIGJ1ZmZlciByaW5ncyBhcmUgcnVubmluZyBsb3cuCisgKi8KKyNkZWZpbmUgSU5UX01BU0tfRElTQUJMRSAgICAgICAgICAgIDB4ZmZmZmZmZmYKKworLyogTk9URTogTWFza2luZyBvdXQgTUFDX1NUQVQgSW50ZXJydXB0IGZvciBub3cuLi4KKyAqICNkZWZpbmUgSU5UX01BU0tfRU5BQkxFICAgICAgICAgICAgIDB4ZmZmNmJmMTcKKyAqICNkZWZpbmUgSU5UX01BU0tfRU5BQkxFX05PX0ZMT1cgICAgIDB4ZmZmNmJmZDcKKyAqLworI2RlZmluZSBJTlRfTUFTS19FTkFCTEUgICAgICAgICAgICAgMHhmZmZlYmYxNworI2RlZmluZSBJTlRfTUFTS19FTkFCTEVfTk9fRkxPVyAgICAgMHhmZmZlYmZkNworCisvKiBHZW5lcmFsIGRlZmluZXMgKi8KKy8qIFBhY2tldCBhbmQgaGVhZGVyIHNpemVzICovCisjZGVmaW5lIE5JQ19NSU5fUEFDS0VUX1NJWkUJNjAKKworLyogTXVsdGljYXN0IGxpc3Qgc2l6ZSAqLworI2RlZmluZSBOSUNfTUFYX01DQVNUX0xJU1QJMTI4CisKKy8qIFN1cHBvcnRlZCBGaWx0ZXJzICovCisjZGVmaW5lIEVUMTMxWF9QQUNLRVRfVFlQRV9ESVJFQ1RFRAkJMHgwMDAxCisjZGVmaW5lIEVUMTMxWF9QQUNLRVRfVFlQRV9NVUxUSUNBU1QJCTB4MDAwMgorI2RlZmluZSBFVDEzMVhfUEFDS0VUX1RZUEVfQlJPQURDQVNUCQkweDAwMDQKKyNkZWZpbmUgRVQxMzFYX1BBQ0tFVF9UWVBFX1BST01JU0NVT1VTCQkweDAwMDgKKyNkZWZpbmUgRVQxMzFYX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1QJMHgwMDEwCisKKy8qIFR4IFRpbWVvdXQgKi8KKyNkZWZpbmUgRVQxMzFYX1RYX1RJTUVPVVQJKDEgKiBIWikKKyNkZWZpbmUgTklDX1NFTkRfSEFOR19USFJFU0hPTEQJMAorCisvKiBNUF9UQ0IgZmxhZ3MgKi8KKyNkZWZpbmUgZk1QX0RFU1RfTVVMVEkJCQkweDAwMDAwMDAxCisjZGVmaW5lIGZNUF9ERVNUX0JST0FECQkJMHgwMDAwMDAwMgorCisvKiBNUF9BREFQVEVSIGZsYWdzICovCisjZGVmaW5lIGZNUF9BREFQVEVSX1JFQ1ZfTE9PS0FTSURFCTB4MDAwMDAwMDQKKyNkZWZpbmUgZk1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRQkweDAwMDAwMDA4CisKKy8qIE1QX1NIQVJFRCBmbGFncyAqLworI2RlZmluZSBmTVBfQURBUFRFUl9MT1dFUl9QT1dFUgkJMHgwMDIwMDAwMAorCisjZGVmaW5lIGZNUF9BREFQVEVSX05PTl9SRUNPVkVSX0VSUk9SCTB4MDA4MDAwMDAKKyNkZWZpbmUgZk1QX0FEQVBURVJfSEFSRFdBUkVfRVJST1IJMHgwNDAwMDAwMAorCisjZGVmaW5lIGZNUF9BREFQVEVSX0ZBSUxfU0VORF9NQVNLCTB4M2ZmMDAwMDAKKworLyogU29tZSBvZmZzZXRzIGluIFBDSSBjb25maWcgc3BhY2UgdGhhdCBhcmUgYWN0dWFsbHkgdXNlZC4gKi8KKyNkZWZpbmUgRVQxMzEwX1BDSV9NQVhfUFlMRAkJMHg0QworI2RlZmluZSBFVDEzMTBfUENJX01BQ19BRERSRVNTCQkweEE0CisjZGVmaW5lIEVUMTMxMF9QQ0lfRUVQUk9NX1NUQVRVUwkweEIyCisjZGVmaW5lIEVUMTMxMF9QQ0lfQUNLX05BQ0sJCTB4QzAKKyNkZWZpbmUgRVQxMzEwX1BDSV9SRVBMQVkJCTB4QzIKKyNkZWZpbmUgRVQxMzEwX1BDSV9MMEwxTEFURU5DWQkJMHhDRgorCisvKiBQQ0kgUHJvZHVjdCBJRHMgKi8KKyNkZWZpbmUgRVQxMzFYX1BDSV9ERVZJQ0VfSURfR0lHCTB4RUQwMAkvKiBFVDEzMTAgMTAwMCBCYXNlLVQgOCAqLworI2RlZmluZSBFVDEzMVhfUENJX0RFVklDRV9JRF9GQVNUCTB4RUQwMQkvKiBFVDEzMTAgMTAwICBCYXNlLVQgKi8KKworLyogRGVmaW5lIG9yZGVyIG9mIG1hZ25pdHVkZSBjb252ZXJ0ZXIgKi8KKyNkZWZpbmUgTkFOT19JTl9BX01JQ1JPCTEwMDAKKworI2RlZmluZSBQQVJNX1JYX05VTV9CVUZTX0RFRiAgICA0CisjZGVmaW5lIFBBUk1fUlhfVElNRV9JTlRfREVGICAgIDEwCisjZGVmaW5lIFBBUk1fUlhfTUVNX0VORF9ERUYgICAgIDB4MmJjCisjZGVmaW5lIFBBUk1fVFhfVElNRV9JTlRfREVGICAgIDQwCisjZGVmaW5lIFBBUk1fVFhfTlVNX0JVRlNfREVGICAgIDQKKyNkZWZpbmUgUEFSTV9ETUFfQ0FDSEVfREVGICAgICAgMAorCisvKiBSWCBkZWZpbmVzICovCisjZGVmaW5lIFVTRV9GQlIwIDEKKworI2RlZmluZSBGQlJfQ0hVTktTIDMyCisKKyNkZWZpbmUgTUFYX0RFU0NfUEVSX1JJTkdfUlggICAgICAgICAxMDI0CisKKy8qIG51bWJlciBvZiBSRkRzIC0gZGVmYXVsdCBhbmQgbWluICovCisjaWZkZWYgVVNFX0ZCUjAKKyNkZWZpbmUgUkZEX0xPV19XQVRFUl9NQVJLCTQwCisjZGVmaW5lIE5JQ19ERUZBVUxUX05VTV9SRkQJMTAyNAorI2RlZmluZSBOVU1fRkJSUwkJMgorI2Vsc2UKKyNkZWZpbmUgUkZEX0xPV19XQVRFUl9NQVJLCTIwCisjZGVmaW5lIE5JQ19ERUZBVUxUX05VTV9SRkQJMjU2CisjZGVmaW5lIE5VTV9GQlJTCQkxCisjZW5kaWYKKworI2RlZmluZSBOSUNfTUlOX05VTV9SRkQJCTY0CisKKyNkZWZpbmUgTlVNX1BBQ0tFVFNfSEFORExFRAkyNTYKKworI2RlZmluZSBBTENBVEVMX01VTFRJQ0FTVF9QS1QJMHgwMTAwMDAwMAorI2RlZmluZSBBTENBVEVMX0JST0FEQ0FTVF9QS1QJMHgwMjAwMDAwMAorCisvKiB0eXBlZGVmcyBmb3IgRnJlZSBCdWZmZXIgRGVzY3JpcHRvcnMgKi8KK3N0cnVjdCBmYnJfZGVzYyB7CisJdTMyIGFkZHJfbG87CisJdTMyIGFkZHJfaGk7CisJdTMyIHdvcmQyOwkJLyogQml0cyAxMC0zMSByZXNlcnZlZCwgMC05IGRlc2NyaXB0b3IgKi8KK307CisKKy8qIFBhY2tldCBTdGF0dXMgUmluZyBEZXNjcmlwdG9ycworICoKKyAqIFdvcmQgMDoKKyAqCisgKiB0b3AgMTYgYml0cyBhcmUgZnJvbSB0aGUgQWxjYXRlbCBTdGF0dXMgV29yZCBhcyBlbnVtZXJhdGVkIGluCisgKiBQRS1NQ1hNQUMgRGF0YSBTaGVldCBJUEQgRFM1NCAwMjEwLTEgKGFsc28gSVBELURTODAgMDIwNS0yKQorICoKKyAqIDA6IGhwCQkJaGFzaCBwYXNzCisgKiAxOiBpcGEJCQlJUCBjaGVja3N1bSBhc3Npc3QKKyAqIDI6IGlwcAkJCUlQIGNoZWNrc3VtIHBhc3MKKyAqIDM6IHRjcGEJCQlUQ1AgY2hlY2tzdW0gYXNzaXN0CisgKiA0OiB0Y3BwCQkJVENQIGNoZWNrc3VtIHBhc3MKKyAqIDU6IHdvbAkJCVdPTCBFdmVudAorICogNjogcnhtYWNfZXJyb3IJCVJYTUFDIEVycm9yIEluZGljYXRvcgorICogNzogZHJvcAkJCURyb3AgcGFja2V0CisgKiA4OiBmdAkJCUZyYW1lIFRydW5jYXRlZAorICogOToganAJCQlKdW1ibyBQYWNrZXQKKyAqIDEwOiB2cAkJCVZMQU4gUGFja2V0CisgKiAxMS0xNTogdW51c2VkCisgKiAxNjogYXN3X3ByZXZfcGt0X2Ryb3BwZWQJZS5nLiBJRkcgdG9vIHNtYWxsIG9uIHByZXZpb3VzCisgKiAxNzogYXN3X1JYX0RWX2V2ZW50CQlzaG9ydCByZWNlaXZlIGV2ZW50IGRldGVjdGVkCisgKiAxODogYXN3X2ZhbHNlX2NhcnJpZXJfZXZlbnQJYmFkIGNhcnJpZXIgc2luY2UgbGFzdCBnb29kIHBhY2tldAorICogMTk6IGFzd19jb2RlX2VycgkJb25lIG9yIG1vcmUgbmliYmxlcyBzaWduYWxsZWQgYXMgZXJyb3JzCisgKiAyMDogYXN3X0NSQ19lcnIJCUNSQyBlcnJvcgorICogMjE6IGFzd19sZW5fY2hrX2VycgkJZnJhbWUgbGVuZ3RoIGZpZWxkIGluY29ycmVjdAorICogMjI6IGFzd190b29fbG9uZwkJZnJhbWUgbGVuZ3RoID4gMTUxOCBieXRlcworICogMjM6IGFzd19PSwkJCXZhbGlkIENSQyArIG5vIGNvZGUgZXJyb3IKKyAqIDI0OiBhc3dfbXVsdGljYXN0CQloYXMgYSBtdWx0aWNhc3QgYWRkcmVzcworICogMjU6IGFzd19icm9hZGNhc3QJCWhhcyBhIGJyb2FkY2FzdCBhZGRyZXNzCisgKiAyNjogYXN3X2RyaWJibGVfbmliYmxlCXNwdXJpb3VzIGJpdHMgYWZ0ZXIgRU9QCisgKiAyNzogYXN3X2NvbnRyb2xfZnJhbWUJaXMgYSBjb250cm9sIGZyYW1lCisgKiAyODogYXN3X3BhdXNlX2ZyYW1lCQlpcyBhIHBhdXNlIGZyYW1lCisgKiAyOTogYXN3X3Vuc3VwcG9ydGVkX29wCXVuc3VwcG9ydGVkIE9QIGNvZGUKKyAqIDMwOiBhc3dfVkxBTl90YWcJCVZMQU4gdGFnIGRldGVjdGVkCisgKiAzMTogYXN3X2xvbmdfZXZ0CQlSeCBsb25nIGV2ZW50CisgKgorICogV29yZCAxOgorICogMC0xNTogbGVuZ3RoCQkJbGVuZ3RoIGluIGJ5dGVzCisgKiAxNi0yNTogYmkJCQlCdWZmZXIgSW5kZXgKKyAqIDI2LTI3OiByaQkJCVJpbmcgSW5kZXgKKyAqIDI4LTMxOiByZXNlcnZlZAorICovCisKK3N0cnVjdCBwa3Rfc3RhdF9kZXNjIHsKKwl1MzIgd29yZDA7CisJdTMyIHdvcmQxOworfTsKKworLyogVHlwZWRlZnMgZm9yIHRoZSBSWCBETUEgc3RhdHVzIHdvcmQgKi8KKworLyoKKyAqIHJ4IHN0YXR1cyB3b3JkIDAgaG9sZHMgcGFydCBvZiB0aGUgc3RhdHVzIGJpdHMgb2YgdGhlIFJ4IERNQSBlbmdpbmUKKyAqIHRoYXQgZ2V0IGNvcGllZCBvdXQgdG8gbWVtb3J5IGJ5IHRoZSBFVC0xMzEwLiAgV29yZCAwIGlzIGEgMzIgYml0IHdvcmQKKyAqIHdoaWNoIGNvbnRhaW5zIHRoZSBGcmVlIEJ1ZmZlciByaW5nIDAgYW5kIDEgYXZhaWxhYmxlIG9mZnNldC4KKyAqCisgKiBiaXQgMC05IEZCUjEgb2Zmc2V0CisgKiBiaXQgMTAgV3JhcCBmbGFnIGZvciBGQlIxCisgKiBiaXQgMTYtMjUgRkJSMCBvZmZzZXQKKyAqIGJpdCAyNiBXcmFwIGZsYWcgZm9yIEZCUjAKKyAqLworCisvKgorICogUlhTVEFUX1dPUkQxX3Qgc3RydWN0dXJlIGhvbGRzIHBhcnQgb2YgdGhlIHN0YXR1cyBiaXRzIG9mIHRoZSBSeCBETUEgZW5naW5lCisgKiB0aGF0IGdldCBjb3BpZWQgb3V0IHRvIG1lbW9yeSBieSB0aGUgRVQtMTMxMC4gIFdvcmQgMyBpcyBhIDMyIGJpdCB3b3JkCisgKiB3aGljaCBjb250YWlucyB0aGUgUGFja2V0IFN0YXR1cyBSaW5nIGF2YWlsYWJsZSBvZmZzZXQuCisgKgorICogYml0IDAtMTUgcmVzZXJ2ZWQKKyAqIGJpdCAxNi0yNyBQU1JvZmZzZXQKKyAqIGJpdCAyOCBQU1J3cmFwCisgKiBiaXQgMjktMzEgdW51c2VkCisgKi8KKworLyoKKyAqIHN0cnVjdCByeF9zdGF0dXNfYmxvY2sgaXMgYSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBzdGF0dXMgb2YgdGhlIFJ4CisgKiBETUEgZW5naW5lIGl0IHNpdHMgaW4gZnJlZSBtZW1vcnksIGFuZCBpcyBwb2ludGVkIHRvIGJ5IDB4MTAxYyAvIDB4MTAyMAorICovCitzdHJ1Y3Qgcnhfc3RhdHVzX2Jsb2NrIHsKKwl1MzIgd29yZDA7CisJdTMyIHdvcmQxOworfTsKKworLyoKKyAqIFN0cnVjdHVyZSBmb3IgbG9vay11cCB0YWJsZSBob2xkaW5nIGZyZWUgYnVmZmVyIHJpbmcgcG9pbnRlcnMsIGFkZHJlc3NlcworICogYW5kIHN0YXRlLgorICovCitzdHJ1Y3QgZmJyX2xvb2t1cCB7CisJdm9pZAkJKnZpcnRbTUFYX0RFU0NfUEVSX1JJTkdfUlhdOworCXZvaWQJCSpidWZmZXIxW01BWF9ERVNDX1BFUl9SSU5HX1JYXTsKKwl2b2lkCQkqYnVmZmVyMltNQVhfREVTQ19QRVJfUklOR19SWF07CisJdTMyCQkgYnVzX2hpZ2hbTUFYX0RFU0NfUEVSX1JJTkdfUlhdOworCXUzMgkJIGJ1c19sb3dbTUFYX0RFU0NfUEVSX1JJTkdfUlhdOworCXZvaWQJCSpyaW5nX3ZpcnRhZGRyOworCWRtYV9hZGRyX3QJIHJpbmdfcGh5c2FkZHI7CisJdm9pZAkJKm1lbV92aXJ0YWRkcnNbTUFYX0RFU0NfUEVSX1JJTkdfUlggLyBGQlJfQ0hVTktTXTsKKwlkbWFfYWRkcl90CSBtZW1fcGh5c2FkZHJzW01BWF9ERVNDX1BFUl9SSU5HX1JYIC8gRkJSX0NIVU5LU107CisJdWludDY0X3QJIHJlYWxfcGh5c2FkZHI7CisJdWludDY0X3QJIG9mZnNldDsKKwl1MzIJCSBsb2NhbF9mdWxsOworCXUzMgkJIG51bV9lbnRyaWVzOworCXUzMgkJIGJ1ZmZzaXplOworfTsKKworLyoKKyAqIHN0cnVjdCByeF9yaW5nIGlzIHRoZSBzcnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGFkYXB0b3IncyBsb2NhbAorICogcmVmZXJlbmNlKHMpIHRvIHRoZSByaW5ncworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIElNUE9SVEFOVCBOT1RFIDotIGZicl9sb29rdXAgKmZicltOVU1fRkJSU10gdXNlcyBpbmRleCAwIHRvIHJlZmVyIHRvIEZCUjEKKyAqCQkJYW5kIGluZGV4IDEgdG8gcmVmZXIgdG8gRlJCMAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCitzdHJ1Y3QgcnhfcmluZyB7CisJc3RydWN0IGZicl9sb29rdXAgKmZicltOVU1fRkJSU107CisJdm9pZCAqcHNfcmluZ192aXJ0YWRkcjsKKwlkbWFfYWRkcl90IHBzX3JpbmdfcGh5c2FkZHI7CisJdTMyIGxvY2FsX3Bzcl9mdWxsOworCXUzMiBwc3JfbnVtX2VudHJpZXM7CisKKwlzdHJ1Y3Qgcnhfc3RhdHVzX2Jsb2NrICpyeF9zdGF0dXNfYmxvY2s7CisJZG1hX2FkZHJfdCByeF9zdGF0dXNfYnVzOworCisJLyogUkVDViAqLworCXN0cnVjdCBsaXN0X2hlYWQgcmVjdl9saXN0OworCXUzMiBudW1fcmVhZHlfcmVjdjsKKworCXUzMiBudW1fcmZkOworCisJYm9vbCB1bmZpbmlzaGVkX3JlY2VpdmVzOworCisJLyogbG9va2FzaWRlIGxpc3RzICovCisJc3RydWN0IGttZW1fY2FjaGUgKnJlY3ZfbG9va2FzaWRlOworfTsKKworLyogVFggZGVmaW5lcyAqLworLyoKKyAqIHdvcmQgMiBvZiB0aGUgY29udHJvbCBiaXRzIGluIHRoZSBUeCBEZXNjcmlwdG9yIHJpbmcgZm9yIHRoZSBFVC0xMzEwCisgKgorICogMC0xNTogbGVuZ3RoIG9mIHBhY2tldAorICogMTYtMjc6IFZMQU4gdGFnCisgKiAyODogVkxBTiBDRkkKKyAqIDI5LTMxOiBWTEFOIHByaW9yaXR5CisgKgorICogd29yZCAzIG9mIHRoZSBjb250cm9sIGJpdHMgaW4gdGhlIFR4IERlc2NyaXB0b3IgcmluZyBmb3IgdGhlIEVULTEzMTAKKyAqCisgKiAwOiBsYXN0IHBhY2tldCBpbiB0aGUgc2VxdWVuY2UKKyAqIDE6IGZpcnN0IHBhY2tldCBpbiB0aGUgc2VxdWVuY2UKKyAqIDI6IGludGVycnVwdCB0aGUgcHJvY2Vzc29yIHdoZW4gdGhpcyBwa3Qgc2VudAorICogMzogQ29udHJvbCB3b3JkIC0gbm8gcGFja2V0IGRhdGEKKyAqIDQ6IElzc3VlIGhhbGYtZHVwbGV4IGJhY2twcmVzc3VyZSA6IFhPTi9YT0ZGCisgKiA1OiBzZW5kIHBhdXNlIGZyYW1lCisgKiA2OiBUeCBmcmFtZSBoYXMgZXJyb3IKKyAqIDc6IGFwcGVuZCBDUkMKKyAqIDg6IE1BQyBvdmVycmlkZQorICogOTogcGFkIHBhY2tldAorICogMTA6IFBhY2tldCBpcyBhIEh1Z2UgcGFja2V0CisgKiAxMTogYXBwZW5kIFZMQU4gdGFnCisgKiAxMjogSVAgY2hlY2tzdW0gYXNzaXN0CisgKiAxMzogVENQIGNoZWNrc3VtIGFzc2lzdAorICogMTQ6IFVEUCBjaGVja3N1bSBhc3Npc3QKKyAqLworCisvKiBzdHJ1Y3QgdHhfZGVzYyByZXByZXNlbnRzIGVhY2ggZGVzY3JpcHRvciBvbiB0aGUgcmluZyAqLworc3RydWN0IHR4X2Rlc2MgeworCXUzMiBhZGRyX2hpOworCXUzMiBhZGRyX2xvOworCXUzMiBsZW5fdmxhbjsJLyogY29udHJvbCB3b3JkcyBob3cgdG8geG1pdCB0aGUgKi8KKwl1MzIgZmxhZ3M7CS8qIGRhdGEgKGRldGFpbGVkIGFib3ZlKSAqLworfTsKKworLyoKKyAqIFRoZSBzdGF0dXMgb2YgdGhlIFR4IERNQSBlbmdpbmUgaXQgc2l0cyBpbiBmcmVlIG1lbW9yeSwgYW5kIGlzIHBvaW50ZWQgdG8KKyAqIGJ5IDB4MTAxYyAvIDB4MTAyMC4gVGhpcyBpcyBhIERNQTEwIHR5cGUKKyAqLworCisvKiBUQ0IgKFRyYW5zbWl0IENvbnRyb2wgQmxvY2s6IEhvc3QgU2lkZSkgKi8KK3N0cnVjdCB0Y2IgeworCXN0cnVjdCB0Y2IgKm5leHQ7CS8qIE5leHQgZW50cnkgaW4gcmluZyAqLworCXUzMiBmbGFnczsJCS8qIE91ciBmbGFncyBmb3IgdGhlIHBhY2tldCAqLworCXUzMiBjb3VudDsJCS8qIFVzZWQgdG8gc3BvdCBzdHVjay9sb3N0IHBhY2tldHMgKi8KKwl1MzIgc3RhbGU7CQkvKiBVc2VkIHRvIHNwb3Qgc3R1Y2svbG9zdCBwYWNrZXRzICovCisJc3RydWN0IHNrX2J1ZmYgKnNrYjsJLyogTmV0d29yayBza2Igd2UgYXJlIHRpZWQgdG8gKi8KKwl1MzIgaW5kZXg7CQkvKiBSaW5nIGluZGV4ZXMgKi8KKwl1MzIgaW5kZXhfc3RhcnQ7Cit9OworCisvKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIG91ciBsb2NhbCByZWZlcmVuY2UocykgdG8gdGhlIHJpbmcgKi8KK3N0cnVjdCB0eF9yaW5nIHsKKwkvKiBUQ0IgKFRyYW5zbWl0IENvbnRyb2wgQmxvY2spIG1lbW9yeSBhbmQgbGlzdHMgKi8KKwlzdHJ1Y3QgdGNiICp0Y2JfcmluZzsKKworCS8qIExpc3Qgb2YgVENCcyB0aGF0IGFyZSByZWFkeSB0byBiZSB1c2VkICovCisJc3RydWN0IHRjYiAqdGNiX3FoZWFkOworCXN0cnVjdCB0Y2IgKnRjYl9xdGFpbDsKKworCS8qIGxpc3Qgb2YgVENCcyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcgc2VudC4gIE5PVEUgdGhhdCBhY2Nlc3MgdG8gYWxsCisJICogdGhyZWUgb2YgdGhlc2UgKGluY2x1ZGluZyB1c2VkKSBhcmUgY29udHJvbGxlZCB2aWEgdGhlCisJICogVENCU2VuZFFMb2NrLiAgVGhpcyBsb2NrIHNob3VsZCBiZSBzZWN1cmVkIHByaW9yIHRvIGluY2VtZW50aW5nIC8KKwkgKiBkZWNyZW1lbnRpbmcgdXNlZCwgb3IgYW55IHF1ZXVlIG1hbmlwdWxhdGlvbiBvbiBzZW5kX2hlYWQgLworCSAqIHRhaWwKKwkgKi8KKwlzdHJ1Y3QgdGNiICpzZW5kX2hlYWQ7CisJc3RydWN0IHRjYiAqc2VuZF90YWlsOworCWludCB1c2VkOworCisJLyogVGhlIGFjdHVhbCBkZXNjcmlwdG9yIHJpbmcgKi8KKwlzdHJ1Y3QgdHhfZGVzYyAqdHhfZGVzY19yaW5nOworCWRtYV9hZGRyX3QgdHhfZGVzY19yaW5nX3BhOworCisJLyogc2VuZF9pZHggaW5kaWNhdGVzIHdoZXJlIHdlIGxhc3Qgd3JvdGUgdG8gaW4gdGhlIGRlc2NyaXB0b3IgcmluZy4gKi8KKwl1MzIgc2VuZF9pZHg7CisKKwkvKiBUaGUgbG9jYXRpb24gb2YgdGhlIHdyaXRlLWJhY2sgc3RhdHVzIGJsb2NrICovCisJdTMyICp0eF9zdGF0dXM7CisJZG1hX2FkZHJfdCB0eF9zdGF0dXNfcGE7CisKKwkvKiBQYWNrZXRzIHNpbmNlIHRoZSBsYXN0IElSUTogdXNlZCBmb3IgaW50ZXJydXB0IGNvYWxlc2NpbmcgKi8KKwlpbnQgc2luY2VfaXJxOworfTsKKworLyogQURBUFRFUiBkZWZpbmVzICovCisvKgorICogRG8gbm90IGNoYW5nZSB0aGVzZSB2YWx1ZXM6IGlmIGNoYW5nZWQsIHRoZW4gY2hhbmdlIGFsc28gaW4gcmVzcGVjdGl2ZQorICogVFhkbWEgYW5kIFJ4ZG1hIGVuZ2luZXMKKyAqLworI2RlZmluZSBOVU1fREVTQ19QRVJfUklOR19UWCAgICAgICAgIDUxMiAgICAvKiBUWCBEbyBub3QgY2hhbmdlIHRoZXNlIHZhbHVlcyAqLworI2RlZmluZSBOVU1fVENCICAgICAgICAgICAgICAgICAgICAgIDY0CisKKy8qCisgKiBUaGVzZSB2YWx1ZXMgYXJlIGFsbCBzdXBlcnNlZGVkIGJ5IHJlZ2lzdHJ5IGVudHJpZXMgdG8gZmFjaWxpdGF0ZSB0dW5pbmcuCisgKiBPbmNlIHRoZSBkZXNpcmVkIHBlcmZvcm1hbmNlIGhhcyBiZWVuIGFjaGlldmVkLCB0aGUgb3B0aW1hbCByZWdpc3RyeSB2YWx1ZXMKKyAqIHNob3VsZCBiZSByZS1wb3B1bGF0ZWQgdG8gdGhlc2UgI2RlZmluZXM6CisgKi8KKyNkZWZpbmUgVFhfRVJST1JfUEVSSU9EICAgICAgICAgICAgIDEwMDAKKworI2RlZmluZSBMT19NQVJLX1BFUkNFTlRfRk9SX1BTUiAgICAgMTUKKyNkZWZpbmUgTE9fTUFSS19QRVJDRU5UX0ZPUl9SWCAgICAgIDE1CisKKy8qIFJGRCAoUmVjZWl2ZSBGcmFtZSBEZXNjcmlwdG9yKSAqLworc3RydWN0IHJmZCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0X25vZGU7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1MzIgbGVuOwkvKiB0b3RhbCBzaXplIG9mIHJlY2VpdmUgZnJhbWUgKi8KKwl1MTYgYnVmZmVyaW5kZXg7CisJdTggcmluZ2luZGV4OworfTsKKworLyogRmxvdyBDb250cm9sICovCisjZGVmaW5lIEZMT1dfQk9USAkwCisjZGVmaW5lIEZMT1dfVFhPTkxZCTEKKyNkZWZpbmUgRkxPV19SWE9OTFkJMgorI2RlZmluZSBGTE9XX05PTkUJMworCisvKiBTdHJ1Y3QgdG8gZGVmaW5lIHNvbWUgZGV2aWNlIHN0YXRpc3RpY3MgKi8KK3N0cnVjdCBjZV9zdGF0cyB7CisJLyogTUlCIElJIHZhcmlhYmxlcworCSAqCisJICogTk9URTogYXRvbWljX3QgdHlwZXMgYXJlIG9ubHkgZ3VhcmFudGVlZCB0byBzdG9yZSAyNC1iaXRzOyBpZiB3ZQorCSAqIE1VU1QgaGF2ZSAzMiwgdGhlbiB3ZSdsbCBuZWVkIGFub3RoZXIgd2F5IHRvIHBlcmZvcm0gYXRvbWljCisJICogb3BlcmF0aW9ucworCSAqLworCXUzMgkJdW5pY2FzdF9wa3RzX3JjdmQ7CisJYXRvbWljX3QJdW5pY2FzdF9wa3RzX3htdGQ7CisJdTMyCQltdWx0aWNhc3RfcGt0c19yY3ZkOworCWF0b21pY190CW11bHRpY2FzdF9wa3RzX3htdGQ7CisJdTMyCQlicm9hZGNhc3RfcGt0c19yY3ZkOworCWF0b21pY190CWJyb2FkY2FzdF9wa3RzX3htdGQ7CisJdTMyCQlyY3ZkX3BrdHNfZHJvcHBlZDsKKworCS8qIFR4IFN0YXRpc3RpY3MuICovCisJdTMyCQl0eF91bmRlcmZsb3dzOworCisJdTMyCQl0eF9jb2xsaXNpb25zOworCXUzMgkJdHhfZXhjZXNzaXZlX2NvbGxpc2lvbnM7CisJdTMyCQl0eF9maXJzdF9jb2xsaXNpb25zOworCXUzMgkJdHhfbGF0ZV9jb2xsaXNpb25zOworCXUzMgkJdHhfbWF4X3BrdF9lcnJzOworCXUzMgkJdHhfZGVmZXJyZWQ7CisKKwkvKiBSeCBTdGF0aXN0aWNzLiAqLworCXUzMgkJcnhfb3ZlcmZsb3dzOworCisJdTMyCQlyeF9sZW5ndGhfZXJyczsKKwl1MzIJCXJ4X2FsaWduX2VycnM7CisJdTMyCQlyeF9jcmNfZXJyczsKKwl1MzIJCXJ4X2NvZGVfdmlvbGF0aW9uczsKKwl1MzIJCXJ4X290aGVyX2VycnM7CisKKwl1MzIJCXN5bmNocm9ub3VzX2l0ZXJhdGlvbnM7CisJdTMyCQlpbnRlcnJ1cHRfc3RhdHVzOworfTsKKworLyogVGhlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBldDEzMXhfYWRhcHRlciB7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgbWlpX2J1cyAqbWlpX2J1czsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2OworCXN0cnVjdCB3b3JrX3N0cnVjdCB0YXNrOworCisJLyogRmxhZ3MgdGhhdCBpbmRpY2F0ZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhZGFwdGVyICovCisJdTMyIGZsYWdzOworCisJLyogbG9jYWwgbGluayBzdGF0ZSwgdG8gZGV0ZXJtaW5lIGlmIGEgc3RhdGUgY2hhbmdlIGhhcyBvY2N1cnJlZCAqLworCWludCBsaW5rOworCisJLyogQ29uZmlndXJhdGlvbiAgKi8KKwl1OCByb21fYWRkcltFVEhfQUxFTl07CisJdTggYWRkcltFVEhfQUxFTl07CisJYm9vbCBoYXNfZWVwcm9tOworCXU4IGVlcHJvbV9kYXRhWzJdOworCisJLyogU3BpbmxvY2tzICovCisJc3BpbmxvY2tfdCBsb2NrOworCisJc3BpbmxvY2tfdCB0Y2Jfc2VuZF9xbG9jazsKKwlzcGlubG9ja190IHRjYl9yZWFkeV9xbG9jazsKKwlzcGlubG9ja190IHNlbmRfaHdfbG9jazsKKworCXNwaW5sb2NrX3QgcmN2X2xvY2s7CisJc3BpbmxvY2tfdCByY3ZfcGVuZF9sb2NrOworCXNwaW5sb2NrX3QgZmJyX2xvY2s7CisKKwlzcGlubG9ja190IHBoeV9sb2NrOworCisJLyogUGFja2V0IEZpbHRlciBhbmQgbG9vayBhaGVhZCBzaXplICovCisJdTMyIHBhY2tldF9maWx0ZXI7CisKKwkvKiBtdWx0aWNhc3QgbGlzdCAqLworCXUzMiBtdWx0aWNhc3RfYWRkcl9jb3VudDsKKwl1OCBtdWx0aWNhc3RfbGlzdFtOSUNfTUFYX01DQVNUX0xJU1RdW0VUSF9BTEVOXTsKKworCS8qIFBvaW50ZXIgdG8gdGhlIGRldmljZSdzIFBDSSByZWdpc3RlciBzcGFjZSAqLworCXN0cnVjdCBhZGRyZXNzX21hcCBfX2lvbWVtICpyZWdzOworCisJLyogUmVnaXN0cnkgcGFyYW1ldGVycyAqLworCXU4IHdhbnRlZF9mbG93OwkJLyogRmxvdyB3ZSB3YW50IGZvciA4MDIuM3ggZmxvdyBjb250cm9sICovCisJdTMyIHJlZ2lzdHJ5X2p1bWJvX3BhY2tldDsJLyogTWF4IHN1cHBvcnRlZCBldGhlcm5ldCBwYWNrZXQgc2l6ZSAqLworCisJLyogRGVyaXZlZCBmcm9tIHRoZSByZWdpc3RyeTogKi8KKwl1OCBmbG93Y29udHJvbDsJCS8qIGZsb3cgY29udHJvbCB2YWxpZGF0ZWQgYnkgdGhlIGZhci1lbmQgKi8KKworCS8qIE1pbmltaXplIGluaXQtdGltZSAqLworCXN0cnVjdCB0aW1lcl9saXN0IGVycm9yX3RpbWVyOworCisJLyogdmFyaWFibGUgcHV0dGluZyB0aGUgcGh5IGludG8gY29tYSBtb2RlIHdoZW4gYm9vdCB1cCB3aXRoIG5vIGNhYmxlCisJICogcGx1Z2dlZCBpbiBhZnRlciA1IHNlY29uZHMKKwkgKi8KKwl1OCBib290X2NvbWE7CisKKwkvKiBOZXh0IHR3byB1c2VkIHRvIHNhdmUgcG93ZXIgaW5mb3JtYXRpb24gYXQgcG93ZXIgZG93bi4gVGhpcworCSAqIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBkdXJpbmcgcG93ZXIgdXAgdG8gc2V0IHVwIHBhcnRzIG9mIFBvd2VyCisJICogTWFuYWdlbWVudCBpbiBKQUdDb3JlCisJICovCisJdTE2IHBkb3duX3NwZWVkOworCXU4IHBkb3duX2R1cGxleDsKKworCS8qIFR4IE1lbW9yeSBWYXJpYWJsZXMgKi8KKwlzdHJ1Y3QgdHhfcmluZyB0eF9yaW5nOworCisJLyogUnggTWVtb3J5IFZhcmlhYmxlcyAqLworCXN0cnVjdCByeF9yaW5nIHJ4X3Jpbmc7CisKKwkvKiBTdGF0cyAqLworCXN0cnVjdCBjZV9zdGF0cyBzdGF0czsKKworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldF9zdGF0czsKK307CisKKy8qIEVFUFJPTSBmdW5jdGlvbnMgKi8KKworc3RhdGljIGludCBlZXByb21fd2FpdF9yZWFkeShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTMyICpzdGF0dXMpCit7CisJdTMyIHJlZzsKKwlpbnQgaTsKKworCS8qCisJICogMS4gQ2hlY2sgTEJDSUYgU3RhdHVzIFJlZ2lzdGVyIGZvciBiaXRzIDYgJiAzOjIgYWxsIGVxdWFsIHRvIDAgYW5kCisJICogICAgYml0cyA3LDE6MCBib3RoIGVxdWFsIHRvIDEsIGF0IGxlYXN0IG9uY2UgYWZ0ZXIgcmVzZXQuCisJICogICAgU3Vic2VxdWVudCBvcGVyYXRpb25zIG5lZWQgb25seSB0byBjaGVjayB0aGF0IGJpdHMgMTowIGFyZSBlcXVhbAorCSAqICAgIHRvIDEgcHJpb3IgdG8gc3RhcnRpbmcgYSBzaW5nbGUgYnl0ZSByZWFkL3dyaXRlCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9SRUdJU1RFUl9QT0xMUzsgaSsrKSB7CisJCS8qIFJlYWQgcmVnaXN0ZXJzIGdyb3VwZWQgaW4gRFdPUkQxICovCisJCWlmIChwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgTEJDSUZfRFdPUkQxX0dST1VQLCAmcmVnKSkKKwkJCXJldHVybiAtRUlPOworCisJCS8qIEkyQyBpZGxlIGFuZCBQaHkgUXVldWUgQXZhaWwgYm90aCB0cnVlICovCisJCWlmICgocmVnICYgMHgzMDAwKSA9PSAweDMwMDApIHsKKwkJCWlmIChzdGF0dXMpCisJCQkJKnN0YXR1cyA9IHJlZzsKKwkJCXJldHVybiByZWcgJiAweEZGOworCQl9CisJfQorCXJldHVybiAtRVRJTUVET1VUOworfQorCisKKy8qKgorICogZWVwcm9tX3dyaXRlIC0gV3JpdGUgYSBieXRlIHRvIHRoZSBFVDEzMTAncyBFRVBST00KKyAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKiBAYWRkcjogdGhlIGFkZHJlc3MgdG8gd3JpdGUKKyAqIEBkYXRhOiB0aGUgdmFsdWUgdG8gd3JpdGUKKyAqCisgKiBSZXR1cm5zIDEgZm9yIGEgc3VjY2Vzc2Z1bCB3cml0ZS4KKyAqLworc3RhdGljIGludCBlZXByb21fd3JpdGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLCB1MzIgYWRkciwgdTggZGF0YSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJaW50IGluZGV4ID0gMDsKKwlpbnQgcmV0cmllczsKKwlpbnQgZXJyID0gMDsKKwlpbnQgaTJjX3dhY2sgPSAwOworCWludCB3cml0ZW9rID0gMDsKKwl1MzIgc3RhdHVzOworCXUzMiB2YWwgPSAwOworCisJLyoKKwkgKiBGb3IgYW4gRUVQUk9NLCBhbiBJMkMgc2luZ2xlIGJ5dGUgd3JpdGUgaXMgZGVmaW5lZCBhcyBhIFNUQVJUCisJICogY29uZGl0aW9uIGZvbGxvd2VkIGJ5IHRoZSBkZXZpY2UgYWRkcmVzcywgRUVQUk9NIGFkZHJlc3MsIG9uZSBieXRlCisJICogb2YgZGF0YSBhbmQgYSBTVE9QIGNvbmRpdGlvbi4gIFRoZSBTVE9QIGNvbmRpdGlvbiB3aWxsIHRyaWdnZXIgdGhlCisJICogRUVQUk9NJ3MgaW50ZXJuYWxseSB0aW1lZCB3cml0ZSBjeWNsZSB0byB0aGUgbm9udm9sYXRpbGUgbWVtb3J5LgorCSAqIEFsbCBpbnB1dHMgYXJlIGRpc2FibGVkIGR1cmluZyB0aGlzIHdyaXRlIGN5Y2xlIGFuZCB0aGUgRUVQUk9NIHdpbGwKKwkgKiBub3QgcmVzcG9uZCB0byBhbnkgYWNjZXNzIHVudGlsIHRoZSBpbnRlcm5hbCB3cml0ZSBpcyBjb21wbGV0ZS4KKwkgKi8KKworCWVyciA9IGVlcHJvbV93YWl0X3JlYWR5KHBkZXYsIE5VTEwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkgLyoKKwkgKiAyLiBXcml0ZSB0byB0aGUgTEJDSUYgQ29udHJvbCBSZWdpc3RlcjogIGJpdCA3PTEsIGJpdCA2PTEsIGJpdCAzPTAsCisJICogICAgYW5kIGJpdHMgMTowIGJvdGggPTAuICBCaXQgNSBzaG91bGQgYmUgc2V0IGFjY29yZGluZyB0byB0aGUKKwkgKiAgICB0eXBlIG9mIEVFUFJPTSBiZWluZyBhY2Nlc3NlZCAoMT10d28gYnl0ZSBhZGRyZXNzaW5nLCAwPW9uZQorCSAqICAgIGJ5dGUgYWRkcmVzc2luZykuCisJICovCisJaWYgKHBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBMQkNJRl9DT05UUk9MX1JFR0lTVEVSLAorCQkJTEJDSUZfQ09OVFJPTF9MQkNJRl9FTkFCTEUgfCBMQkNJRl9DT05UUk9MX0kyQ19XUklURSkpCisJCXJldHVybiAtRUlPOworCisJaTJjX3dhY2sgPSAxOworCisJLyogUHJlcGFyZSBFRVBST00gYWRkcmVzcyBmb3IgU3RlcCAzICovCisKKwlmb3IgKHJldHJpZXMgPSAwOyByZXRyaWVzIDwgTUFYX05VTV9XUklURV9SRVRSSUVTOyByZXRyaWVzKyspIHsKKwkJLyogV3JpdGUgdGhlIGFkZHJlc3MgdG8gdGhlIExCQ0lGIEFkZHJlc3MgUmVnaXN0ZXIgKi8KKwkJaWYgKHBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgTEJDSUZfQUREUkVTU19SRUdJU1RFUiwgYWRkcikpCisJCQlicmVhazsKKwkJLyoKKwkJICogV3JpdGUgdGhlIGRhdGEgdG8gdGhlIExCQ0lGIERhdGEgUmVnaXN0ZXIgKHRoZSBJMkMgd3JpdGUKKwkJICogd2lsbCBiZWdpbikuCisJCSAqLworCQlpZiAocGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIExCQ0lGX0RBVEFfUkVHSVNURVIsIGRhdGEpKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIE1vbml0b3IgYml0IDE6MCBvZiB0aGUgTEJDSUYgU3RhdHVzIFJlZ2lzdGVyLiAgV2hlbiBiaXRzCisJCSAqIDE6MCBhcmUgYm90aCBlcXVhbCB0byAxLCB0aGUgSTJDIHdyaXRlIGhhcyBjb21wbGV0ZWQgYW5kIHRoZQorCQkgKiBpbnRlcm5hbCB3cml0ZSBjeWNsZSBvZiB0aGUgRUVQUk9NIGlzIGFib3V0IHRvIHN0YXJ0LgorCQkgKiAoYml0cyAxOjAgPSAwMSBpcyBhIGxlZ2FsIHN0YXRlIHdoaWxlIHdhaXRpbmcgZnJvbSBib3RoCisJCSAqIGVxdWFsIHRvIDEsIGJ1dCBiaXRzIDE6MCA9IDEwIGlzIGludmFsaWQgYW5kIGltcGxpZXMgdGhhdAorCQkgKiBzb21ldGhpbmcgaXMgYnJva2VuKS4KKwkJICovCisJCWVyciA9IGVlcHJvbV93YWl0X3JlYWR5KHBkZXYsICZzdGF0dXMpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiAwOworCisJCS8qCisJCSAqIENoZWNrIGJpdCAzIG9mIHRoZSBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIuICBJZiAgZXF1YWwgdG8gMSwKKwkJICogYW4gZXJyb3IgaGFzIG9jY3VycmVkLkRvbid0IGJyZWFrIGhlcmUgaWYgd2UgYXJlIHJldmlzaW9uCisJCSAqIDEsIHRoaXMgaXMgc28gd2UgZG8gYSBibGluZCB3cml0ZSBmb3IgbG9hZCBidWcuCisJCSAqLworCQlpZiAoKHN0YXR1cyAmIExCQ0lGX1NUQVRVU19HRU5FUkFMX0VSUk9SKQorCQkJJiYgYWRhcHRlci0+cGRldi0+cmV2aXNpb24gPT0gMCkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIENoZWNrIGJpdCAyIG9mIHRoZSBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIuICBJZiBlcXVhbCB0byAxIGFuCisJCSAqIEFDSyBlcnJvciBoYXMgb2NjdXJyZWQgb24gdGhlIGFkZHJlc3MgcGhhc2Ugb2YgdGhlIHdyaXRlLgorCQkgKiBUaGlzIGNvdWxkIGJlIGR1ZSB0byBhbiBhY3R1YWwgaGFyZHdhcmUgZmFpbHVyZSBvciB0aGUKKwkJICogRUVQUk9NIG1heSBzdGlsbCBiZSBpbiBpdHMgaW50ZXJuYWwgd3JpdGUgY3ljbGUgZnJvbSBhCisJCSAqIHByZXZpb3VzIHdyaXRlLiBUaGlzIHdyaXRlIG9wZXJhdGlvbiB3YXMgaWdub3JlZCBhbmQgbXVzdCBiZQorCQkgICpyZXBlYXRlZCBsYXRlci4KKwkJICovCisJCWlmIChzdGF0dXMgJiBMQkNJRl9TVEFUVVNfQUNLX0VSUk9SKSB7CisJCQkvKgorCQkJICogVGhpcyBjb3VsZCBiZSBkdWUgdG8gYW4gYWN0dWFsIGhhcmR3YXJlIGZhaWx1cmUKKwkJCSAqIG9yIHRoZSBFRVBST00gbWF5IHN0aWxsIGJlIGluIGl0cyBpbnRlcm5hbCB3cml0ZQorCQkJICogY3ljbGUgZnJvbSBhIHByZXZpb3VzIHdyaXRlLiBUaGlzIHdyaXRlIG9wZXJhdGlvbgorCQkJICogd2FzIGlnbm9yZWQgYW5kIG11c3QgYmUgcmVwZWF0ZWQgbGF0ZXIuCisJCQkgKi8KKwkJCXVkZWxheSgxMCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXdyaXRlb2sgPSAxOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIFNldCBiaXQgNiBvZiB0aGUgTEJDSUYgQ29udHJvbCBSZWdpc3RlciA9IDAuCisJICovCisJdWRlbGF5KDEwKTsKKworCXdoaWxlIChpMmNfd2FjaykgeworCQlpZiAocGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIExCQ0lGX0NPTlRST0xfUkVHSVNURVIsCisJCQlMQkNJRl9DT05UUk9MX0xCQ0lGX0VOQUJMRSkpCisJCQl3cml0ZW9rID0gMDsKKworCQkvKiBEbyByZWFkIHVudGlsIGludGVybmFsIEFDS19FUlJPUiBnb2VzIGF3YXkgbWVhbmluZyB3cml0ZQorCQkgKiBjb21wbGV0ZWQKKwkJICovCisJCWRvIHsKKwkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwKKwkJCQkJICAgICAgIExCQ0lGX0FERFJFU1NfUkVHSVNURVIsCisJCQkJCSAgICAgICBhZGRyKTsKKwkJCWRvIHsKKwkJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwKKwkJCQkJTEJDSUZfREFUQV9SRUdJU1RFUiwgJnZhbCk7CisJCQl9IHdoaWxlICgodmFsICYgMHgwMDAxMDAwMCkgPT0gMCk7CisJCX0gd2hpbGUgKHZhbCAmIDB4MDAwNDAwMDApOworCisJCWlmICgodmFsICYgMHhGRjAwKSAhPSAweEMwMDAgfHwgaW5kZXggPT0gMTAwMDApCisJCQlicmVhazsKKwkJaW5kZXgrKzsKKwl9CisJcmV0dXJuIHdyaXRlb2sgPyAwIDogLUVJTzsKK30KKworLyoqCisgKiBlZXByb21fcmVhZCAtIFJlYWQgYSBieXRlIGZyb20gdGhlIEVUMTMxMCdzIEVFUFJPTQorICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqIEBhZGRyOiB0aGUgYWRkcmVzcyBmcm9tIHdoaWNoIHRvIHJlYWQKKyAqIEBwZGF0YTogYSBwb2ludGVyIHRvIGEgYnl0ZSBpbiB3aGljaCB0byBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIHJlYWQKKyAqIEBlZXByb21faWQ6IHRoZSBJRCBvZiB0aGUgRUVQUk9NCisgKiBAYWRkcm1vZGU6IGhvdyB0aGUgRUVQUk9NIGlzIHRvIGJlIGFjY2Vzc2VkCisgKgorICogUmV0dXJucyAxIGZvciBhIHN1Y2Nlc3NmdWwgcmVhZAorICovCitzdGF0aWMgaW50IGVlcHJvbV9yZWFkKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwgdTMyIGFkZHIsIHU4ICpwZGF0YSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJaW50IGVycjsKKwl1MzIgc3RhdHVzOworCisJLyoKKwkgKiBBIHNpbmdsZSBieXRlIHJlYWQgaXMgc2ltaWxhciB0byB0aGUgc2luZ2xlIGJ5dGUgd3JpdGUsIHdpdGggdGhlCisJICogZXhjZXB0aW9uIG9mIHRoZSBkYXRhIGZsb3c6CisJICovCisKKwllcnIgPSBlZXByb21fd2FpdF9yZWFkeShwZGV2LCBOVUxMKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCS8qCisJICogV3JpdGUgdG8gdGhlIExCQ0lGIENvbnRyb2wgUmVnaXN0ZXI6ICBiaXQgNz0xLCBiaXQgNj0wLCBiaXQgMz0wLAorCSAqIGFuZCBiaXRzIDE6MCBib3RoID0wLiAgQml0IDUgc2hvdWxkIGJlIHNldCBhY2NvcmRpbmcgdG8gdGhlIHR5cGUKKwkgKiBvZiBFRVBST00gYmVpbmcgYWNjZXNzZWQgKDE9dHdvIGJ5dGUgYWRkcmVzc2luZywgMD1vbmUgYnl0ZQorCSAqIGFkZHJlc3NpbmcpLgorCSAqLworCWlmIChwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgTEJDSUZfQ09OVFJPTF9SRUdJU1RFUiwKKwkJCQkgIExCQ0lGX0NPTlRST0xfTEJDSUZfRU5BQkxFKSkKKwkJcmV0dXJuIC1FSU87CisJLyoKKwkgKiBXcml0ZSB0aGUgYWRkcmVzcyB0byB0aGUgTEJDSUYgQWRkcmVzcyBSZWdpc3RlciAoSTJDIHJlYWQgd2lsbAorCSAqIGJlZ2luKS4KKwkgKi8KKwlpZiAocGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBMQkNJRl9BRERSRVNTX1JFR0lTVEVSLCBhZGRyKSkKKwkJcmV0dXJuIC1FSU87CisJLyoKKwkgKiBNb25pdG9yIGJpdCAwIG9mIHRoZSBMQkNJRiBTdGF0dXMgUmVnaXN0ZXIuICBXaGVuID0gMSwgSTJDIHJlYWQKKwkgKiBpcyBjb21wbGV0ZS4gKGlmIGJpdCAxID0xIGFuZCBiaXQgMCBzdGF5cyA9IDAsIGEgaGFyZHdhcmUgZmFpbHVyZQorCSAqIGhhcyBvY2N1cnJlZCkuCisJICovCisJZXJyID0gZWVwcm9tX3dhaXRfcmVhZHkocGRldiwgJnN0YXR1cyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJLyoKKwkgKiBSZWdhcmRsZXNzIG9mIGVycm9yIHN0YXR1cywgcmVhZCBkYXRhIGJ5dGUgZnJvbSBMQkNJRiBEYXRhCisJICogUmVnaXN0ZXIuCisJICovCisJKnBkYXRhID0gZXJyOworCS8qCisJICogQ2hlY2sgYml0IDIgb2YgdGhlIExCQ0lGIFN0YXR1cyBSZWdpc3Rlci4gIElmID0gMSwKKwkgKiB0aGVuIGFuIGVycm9yIGhhcyBvY2N1cnJlZC4KKwkgKi8KKwlyZXR1cm4gKHN0YXR1cyAmIExCQ0lGX1NUQVRVU19BQ0tfRVJST1IpID8gLUVJTyA6IDA7Cit9CisKK2ludCBldDEzMXhfaW5pdF9lZXByb20oc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKwl1OCBlZXN0YXR1czsKKworCS8qIFdlIGZpcnN0IG5lZWQgdG8gY2hlY2sgdGhlIEVFUFJPTSBTdGF0dXMgY29kZSBsb2NhdGVkIGF0IG9mZnNldAorCSAqIDB4QjIgb2YgY29uZmlnIHNwYWNlCisJICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgRVQxMzEwX1BDSV9FRVBST01fU1RBVFVTLAorCQkJCSAgICAgICZlZXN0YXR1cyk7CisKKwkvKiBUSElTIElTIEEgV09SS0FST1VORDoKKwkgKiBJIG5lZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHR3aWNlIHRvIGdldCBteSBjYXJkIGluIGEKKwkgKiBMRyBNMSBFeHByZXNzIER1YWwgcnVubmluZy4gSSB0cmllZCBhbHNvIGEgbXNsZWVwIGJlZm9yZSB0aGlzCisJICogZnVuY3Rpb24sIGJlY2F1c2UgSSB0aG91Z3RoIHRoZXJlIGNvdWxkIGJlIHNvbWUgdGltZSBjb25kaWRpb25zCisJICogYnV0IGl0IGRpZG4ndCB3b3JrLiBDYWxsIHRoZSB3aG9sZSBmdW5jdGlvbiB0d2ljZSBhbHNvIHdvcmsuCisJICovCisJaWYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIEVUMTMxMF9QQ0lfRUVQUk9NX1NUQVRVUywgJmVlc3RhdHVzKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCSAgICAgICAiQ291bGQgbm90IHJlYWQgUENJIGNvbmZpZyBzcGFjZSBmb3IgRUVQUk9NIFN0YXR1c1xuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIERldGVybWluZSBpZiB0aGUgZXJyb3Iocykgd2UgY2FyZSBhYm91dCBhcmUgcHJlc2VudC4gSWYgdGhleSBhcmUKKwkgKiBwcmVzZW50IHdlIG5lZWQgdG8gZmFpbC4KKwkgKi8KKwlpZiAoZWVzdGF0dXMgJiAweDRDKSB7CisJCWludCB3cml0ZV9mYWlsZWQgPSAwOworCQlpZiAocGRldi0+cmV2aXNpb24gPT0gMHgwMSkgeworCQkJaW50CWk7CisJCQlzdGF0aWMgY29uc3QgdTggZWVkYXRhWzRdID0geyAweEZFLCAweDEzLCAweDEwLCAweEZGIH07CisKKwkJCS8qIFJlLXdyaXRlIHRoZSBmaXJzdCA0IGJ5dGVzIGlmIHdlIGhhdmUgYW4gZWVwcm9tCisJCQkgKiBwcmVzZW50IGFuZCB0aGUgcmV2aXNpb24gaWQgaXMgMSwgdGhpcyBmaXhlcyB0aGUKKwkJCSAqIGNvcnJ1cHRpb24gc2VlbiB3aXRoIDEzMTAgQiBTaWxpY29uCisJCQkgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQkJaWYgKGVlcHJvbV93cml0ZShhZGFwdGVyLCBpLCBlZWRhdGFbaV0pIDwgMCkKKwkJCQkJd3JpdGVfZmFpbGVkID0gMTsKKwkJfQorCQlpZiAocGRldi0+cmV2aXNpb24gICE9IDB4MDEgfHwgd3JpdGVfZmFpbGVkKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkgICAgIkZhdGFsIEVFUFJPTSBTdGF0dXMgRXJyb3IgLSAweCUwNHhcbiIsIGVlc3RhdHVzKTsKKworCQkJLyogVGhpcyBlcnJvciBjb3VsZCBtZWFuIHRoYXQgdGhlcmUgd2FzIGFuIGVycm9yCisJCQkgKiByZWFkaW5nIHRoZSBlZXByb20gb3IgdGhhdCB0aGUgZWVwcm9tIGRvZXNuJ3QgZXhpc3QuCisJCQkgKiBXZSB3aWxsIHRyZWF0IGVhY2ggY2FzZSB0aGUgc2FtZSBhbmQgbm90IHRyeSB0bworCQkJICogZ2F0aGVyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhhdCBub3JtYWxseSB3b3VsZAorCQkJICogY29tZSBmcm9tIHRoZSBlZXByb20sIGxpa2UgTUFDIEFkZHJlc3MKKwkJCSAqLworCQkJYWRhcHRlci0+aGFzX2VlcHJvbSA9IDA7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKwlhZGFwdGVyLT5oYXNfZWVwcm9tID0gMTsKKworCS8qIFJlYWQgdGhlIEVFUFJPTSBmb3IgaW5mb3JtYXRpb24gcmVnYXJkaW5nIExFRCBiZWhhdmlvci4gUmVmZXIgdG8KKwkgKiBFVDEzMTBfcGh5LmMsIGV0MTMxeF94Y3ZyX2luaXQoKSwgZm9yIGl0cyB1c2UuCisJICovCisJZWVwcm9tX3JlYWQoYWRhcHRlciwgMHg3MCwgJmFkYXB0ZXItPmVlcHJvbV9kYXRhWzBdKTsKKwllZXByb21fcmVhZChhZGFwdGVyLCAweDcxLCAmYWRhcHRlci0+ZWVwcm9tX2RhdGFbMV0pOworCisJaWYgKGFkYXB0ZXItPmVlcHJvbV9kYXRhWzBdICE9IDB4Y2QpCisJCS8qIERpc2FibGUgYWxsIG9wdGlvbmFsIGZlYXR1cmVzICovCisJCWFkYXB0ZXItPmVlcHJvbV9kYXRhWzFdID0gMHgwMDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGV0MTMxeF9yeF9kbWFfZW5hYmxlIC0gcmUtc3RhcnQgb2YgUnhfRE1BIG9uIHRoZSBFVDEzMTAuCisgKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqLwordm9pZCBldDEzMXhfcnhfZG1hX2VuYWJsZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJLyogU2V0dXAgdGhlIHJlY2VpdmUgZG1hIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgZm9yIG5vcm1hbCBvcGVyYXRpb24gKi8KKwl1MzIgY3NyID0gIDB4MjAwMDsJLyogRkJSMSBlbmFibGUgKi8KKworCWlmIChhZGFwdGVyLT5yeF9yaW5nLmZiclswXS0+YnVmZnNpemUgPT0gNDA5NikKKwkJY3NyIHw9IDB4MDgwMDsKKwllbHNlIGlmIChhZGFwdGVyLT5yeF9yaW5nLmZiclswXS0+YnVmZnNpemUgPT0gODE5MikKKwkJY3NyIHw9IDB4MTAwMDsKKwllbHNlIGlmIChhZGFwdGVyLT5yeF9yaW5nLmZiclswXS0+YnVmZnNpemUgPT0gMTYzODQpCisJCWNzciB8PSAweDE4MDA7CisjaWZkZWYgVVNFX0ZCUjAKKwljc3IgfD0gMHgwNDAwOwkJLyogRkJSMCBlbmFibGUgKi8KKwlpZiAoYWRhcHRlci0+cnhfcmluZy5mYnJbMV0tPmJ1ZmZzaXplID09IDI1NikKKwkJY3NyIHw9IDB4MDEwMDsKKwllbHNlIGlmIChhZGFwdGVyLT5yeF9yaW5nLmZiclsxXS0+YnVmZnNpemUgPT0gNTEyKQorCQljc3IgfD0gMHgwMjAwOworCWVsc2UgaWYgKGFkYXB0ZXItPnJ4X3JpbmcuZmJyWzFdLT5idWZmc2l6ZSA9PSAxMDI0KQorCQljc3IgfD0gMHgwMzAwOworI2VuZGlmCisJd3JpdGVsKGNzciwgJmFkYXB0ZXItPnJlZ3MtPnJ4ZG1hLmNzcik7CisKKwljc3IgPSByZWFkbCgmYWRhcHRlci0+cmVncy0+cnhkbWEuY3NyKTsKKwlpZiAoKGNzciAmIDB4MDAwMjAwMDApICE9IDApIHsKKwkJdWRlbGF5KDUpOworCQljc3IgPSByZWFkbCgmYWRhcHRlci0+cmVncy0+cnhkbWEuY3NyKTsKKwkJaWYgKChjc3IgJiAweDAwMDIwMDAwKSAhPSAwKSB7CisJCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkgICAgIlJYIERtYSBmYWlsZWQgdG8gZXhpdCBoYWx0IHN0YXRlLiAgQ1NSIDB4JTA4eFxuIiwKKwkJCQljc3IpOworCQl9CisJfQorfQorCisvKioKKyAqIGV0MTMxeF9yeF9kbWFfZGlzYWJsZSAtIFN0b3Agb2YgUnhfRE1BIG9uIHRoZSBFVDEzMTAKKyAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBhZGFwdGVyIHN0cnVjdHVyZQorICovCit2b2lkIGV0MTMxeF9yeF9kbWFfZGlzYWJsZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIGNzcjsKKwkvKiBTZXR1cCB0aGUgcmVjZWl2ZSBkbWEgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworCXdyaXRlbCgweDAwMDAyMDAxLCAmYWRhcHRlci0+cmVncy0+cnhkbWEuY3NyKTsKKwljc3IgPSByZWFkbCgmYWRhcHRlci0+cmVncy0+cnhkbWEuY3NyKTsKKwlpZiAoKGNzciAmIDB4MDAwMjAwMDApID09IDApIHsJLyogQ2hlY2sgaGFsdCBzdGF0dXMgKGJpdCAxNykgKi8KKwkJdWRlbGF5KDUpOworCQljc3IgPSByZWFkbCgmYWRhcHRlci0+cmVncy0+cnhkbWEuY3NyKTsKKwkJaWYgKChjc3IgJiAweDAwMDIwMDAwKSA9PSAwKQorCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJIlJYIERtYSBmYWlsZWQgdG8gZW50ZXIgaGFsdCBzdGF0ZS4gQ1NSIDB4JTA4eFxuIiwKKwkJCQljc3IpOworCX0KK30KKworLyoqCisgKiBldDEzMXhfdHhfZG1hX2VuYWJsZSAtIHJlLXN0YXJ0IG9mIFR4X0RNQSBvbiB0aGUgRVQxMzEwLgorICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogTWFpbmx5IHVzZWQgYWZ0ZXIgYSByZXR1cm4gdG8gdGhlIEQwIChmdWxsLXBvd2VyKSBzdGF0ZSBmcm9tIGEgbG93ZXIgc3RhdGUuCisgKi8KK3ZvaWQgZXQxMzF4X3R4X2RtYV9lbmFibGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQoreworCS8qIFNldHVwIHRoZSB0cmFuc21pdCBkbWEgY29uZmlndXJhdGlvbiByZWdpc3RlciBmb3Igbm9ybWFsCisJICogb3BlcmF0aW9uCisJICovCisJd3JpdGVsKEVUX1RYRE1BX1NOR0xfRVBLVHwoUEFSTV9ETUFfQ0FDSEVfREVGIDw8IEVUX1RYRE1BX0NBQ0hFX1NISUZUKSwKKwkJCQkJJmFkYXB0ZXItPnJlZ3MtPnR4ZG1hLmNzcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRfMTBiaXQodTMyICp2LCBpbnQgbikKK3sKKwkqdiA9IElOREVYMTAoKnYgKyBuKSB8ICgqdiAmIEVUX0RNQTEwX1dSQVApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWRkXzEyYml0KHUzMiAqdiwgaW50IG4pCit7CisJKnYgPSBJTkRFWDEyKCp2ICsgbikgfCAoKnYgJiBFVF9ETUExMl9XUkFQKTsKK30KKworLyoqCisgKiBuaWNfcnhfcGt0cyAtIENoZWNrcyB0aGUgaGFyZHdhcmUgZm9yIGF2YWlsYWJsZSBwYWNrZXRzCisgKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgYWRhcHRlcgorICoKKyAqIFJldHVybnMgcmZkLCBhIHBvaW50ZXIgdG8gb3VyIE1QUkZELgorICoKKyAqIENoZWNrcyB0aGUgaGFyZHdhcmUgZm9yIGF2YWlsYWJsZSBwYWNrZXRzLCB1c2luZyBjb21wbGV0aW9uIHJpbmcKKyAqIElmIHBhY2tldHMgYXJlIGF2YWlsYWJsZSwgaXQgZ2V0cyBhbiBSRkQgZnJvbSB0aGUgcmVjdl9saXN0LCBhdHRhY2hlcworICogdGhlIHBhY2tldCB0byBpdCwgcHV0cyB0aGUgUkZEIGluIHRoZSBSZWN2UGVuZExpc3QsIGFuZCBhbHNvIHJldHVybnMKKyAqIHRoZSBwb2ludGVyIHRvIHRoZSBSRkQuCisgKi8KKy8qIE1BQyBmdW5jdGlvbnMgKi8KKworLyoqCisgKiBldDEzMTBfY29uZmlnX21hY19yZWdzMSAtIEluaXRpYWxpemUgdGhlIGZpcnN0IHBhcnQgb2YgTUFDIHJlZ3MKKyAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBhZGFwdGVyIHN0cnVjdHVyZQorICovCit2b2lkIGV0MTMxMF9jb25maWdfbWFjX3JlZ3MxKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqbWFjcmVncyA9ICZhZGFwdGVyLT5yZWdzLT5tYWM7CisJdTMyIHN0YXRpb24xOworCXUzMiBzdGF0aW9uMjsKKwl1MzIgaXBnOworCisJLyogRmlyc3Qgd2UgbmVlZCB0byByZXNldCBldmVyeXRoaW5nLiAgV3JpdGUgdG8gTUFDIGNvbmZpZ3VyYXRpb24KKwkgKiByZWdpc3RlciAxIHRvIHBlcmZvcm0gcmVzZXQuCisJICovCisJd3JpdGVsKDB4QzAwRjAwMDAsICZtYWNyZWdzLT5jZmcxKTsKKworCS8qIE5leHQgbGV0cyBjb25maWd1cmUgdGhlIE1BQyBJbnRlci1wYWNrZXQgZ2FwIHJlZ2lzdGVyICovCisJaXBnID0gMHgzODAwNTg2MDsJCS8qIElQRzEgMHgzOCBJUEcyIDB4NTggQjJCIDB4NjAgKi8KKwlpcGcgfD0gMHg1MCA8PCA4OwkJLyogaWZnIGVuZm9yY2UgMHg1MCAqLworCXdyaXRlbChpcGcsICZtYWNyZWdzLT5pcGcpOworCisJLyogTmV4dCBsZXRzIGNvbmZpZ3VyZSB0aGUgTUFDIEhhbGYgRHVwbGV4IHJlZ2lzdGVyICovCisJLyogQkVCIHRydW5jIDB4QSwgRXggRGVmZXIsIFJleG1pdCAweEYgQ29sbCAweDM3ICovCisJd3JpdGVsKDB4MDBBMUYwMzcsICZtYWNyZWdzLT5oZmRwKTsKKworCS8qIE5leHQgbGV0cyBjb25maWd1cmUgdGhlIE1BQyBJbnRlcmZhY2UgQ29udHJvbCByZWdpc3RlciAqLworCXdyaXRlbCgwLCAmbWFjcmVncy0+aWZfY3RybCk7CisKKwkvKiBMZXQncyBtb3ZlIG9uIHRvIHNldHRpbmcgdXAgdGhlIG1paSBtYW5hZ2VtZW50IGNvbmZpZ3VyYXRpb24gKi8KKwl3cml0ZWwoMHgwNywgJm1hY3JlZ3MtPm1paV9tZ210X2NmZyk7CS8qIENsb2NrIHJlc2V0IDB4NyAqLworCisJLyogTmV4dCBsZXRzIGNvbmZpZ3VyZSB0aGUgTUFDIFN0YXRpb24gQWRkcmVzcyByZWdpc3Rlci4gIFRoZXNlCisJICogdmFsdWVzIGFyZSByZWFkIGZyb20gdGhlIEVFUFJPTSBkdXJpbmcgaW5pdGlhbGl6YXRpb24gYW5kIHN0b3JlZAorCSAqIGluIHRoZSBhZGFwdGVyIHN0cnVjdHVyZS4gIFdlIHdyaXRlIHdoYXQgaXMgc3RvcmVkIGluIHRoZSBhZGFwdGVyCisJICogc3RydWN0dXJlIHRvIHRoZSBNQUMgU3RhdGlvbiBBZGRyZXNzIHJlZ2lzdGVycyBoaWdoIGFuZCBsb3cuICBUaGlzCisJICogc3RhdGlvbiBhZGRyZXNzIGlzIHVzZWQgZm9yIGdlbmVyYXRpbmcgYW5kIGNoZWNraW5nIHBhdXNlIGNvbnRyb2wKKwkgKiBwYWNrZXRzLgorCSAqLworCXN0YXRpb24yID0gKGFkYXB0ZXItPmFkZHJbMV0gPDwgRVRfTUFDX1NUQVRJT05fQUREUjJfT0MyX1NISUZUKSB8CisJCSAgIChhZGFwdGVyLT5hZGRyWzBdIDw8IEVUX01BQ19TVEFUSU9OX0FERFIyX09DMV9TSElGVCk7CisJc3RhdGlvbjEgPSAoYWRhcHRlci0+YWRkcls1XSA8PCBFVF9NQUNfU1RBVElPTl9BRERSMV9PQzZfU0hJRlQpIHwKKwkJICAgKGFkYXB0ZXItPmFkZHJbNF0gPDwgRVRfTUFDX1NUQVRJT05fQUREUjFfT0M1X1NISUZUKSB8CisJCSAgIChhZGFwdGVyLT5hZGRyWzNdIDw8IEVUX01BQ19TVEFUSU9OX0FERFIxX09DNF9TSElGVCkgfAorCQkgICAgYWRhcHRlci0+YWRkclsyXTsKKwl3cml0ZWwoc3RhdGlvbjEsICZtYWNyZWdzLT5zdGF0aW9uX2FkZHJfMSk7CisJd3JpdGVsKHN0YXRpb24yLCAmbWFjcmVncy0+c3RhdGlvbl9hZGRyXzIpOworCisJLyogTWF4IGV0aGVybmV0IHBhY2tldCBpbiBieXRlcyB0aGF0IHdpbGwgcGFzc2VkIGJ5IHRoZSBtYWMgd2l0aG91dAorCSAqIGJlaW5nIHRydW5jYXRlZC4gIEFsbG93IHRoZSBNQUMgdG8gcGFzcyA0IG1vcmUgdGhhbiBvdXIgbWF4IHBhY2tldAorCSAqIHNpemUuICBUaGlzIGlzIDQgZm9yIHRoZSBFdGhlcm5ldCBDUkMuCisJICoKKwkgKiBQYWNrZXRzIGxhcmdlciB0aGFuIChyZWdpc3RyeV9qdW1ib19wYWNrZXQpIHRoYXQgZG8gbm90IGNvbnRhaW4gYQorCSAqIFZMQU4gSUQgd2lsbCBiZSBkcm9wcGVkIGJ5IHRoZSBSeCBmdW5jdGlvbi4KKwkgKi8KKwl3cml0ZWwoYWRhcHRlci0+cmVnaXN0cnlfanVtYm9fcGFja2V0ICsgNCwgJm1hY3JlZ3MtPm1heF9mbV9sZW4pOworCisJLyogY2xlYXIgb3V0IE1BQyBjb25maWcgcmVzZXQgKi8KKwl3cml0ZWwoMCwgJm1hY3JlZ3MtPmNmZzEpOworfQorCisvKioKKyAqIGV0MTMxMF9jb25maWdfbWFjX3JlZ3MyIC0gSW5pdGlhbGl6ZSB0aGUgc2Vjb25kIHBhcnQgb2YgTUFDIHJlZ3MKKyAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBhZGFwdGVyIHN0cnVjdHVyZQorICovCit2b2lkIGV0MTMxMF9jb25maWdfbWFjX3JlZ3MyKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQzMl90IGRlbGF5ID0gMDsKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqbWFjID0gJmFkYXB0ZXItPnJlZ3MtPm1hYzsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gYWRhcHRlci0+cGh5ZGV2OworCXUzMiBjZmcxOworCXUzMiBjZmcyOworCXUzMiBpZmN0cmw7CisJdTMyIGN0bDsKKworCWN0bCA9IHJlYWRsKCZhZGFwdGVyLT5yZWdzLT50eG1hYy5jdGwpOworCWNmZzEgPSByZWFkbCgmbWFjLT5jZmcxKTsKKwljZmcyID0gcmVhZGwoJm1hYy0+Y2ZnMik7CisJaWZjdHJsID0gcmVhZGwoJm1hYy0+aWZfY3RybCk7CisKKwkvKiBTZXQgdXAgdGhlIGlmIG1vZGUgYml0cyAqLworCWNmZzIgJj0gfjB4MzAwOworCWlmIChwaHlkZXYgJiYgcGh5ZGV2LT5zcGVlZCA9PSBTUEVFRF8xMDAwKSB7CisJCWNmZzIgfD0gMHgyMDA7CisJCS8qIFBoeSBtb2RlIGJpdCAqLworCQlpZmN0cmwgJj0gfigxIDw8IDI0KTsKKwl9IGVsc2UgeworCQljZmcyIHw9IDB4MTAwOworCQlpZmN0cmwgfD0gKDEgPDwgMjQpOworCX0KKworCS8qIFdlIG5lZWQgdG8gZW5hYmxlIFJ4L1R4ICovCisJY2ZnMSB8PSBDRkcxX1JYX0VOQUJMRSB8IENGRzFfVFhfRU5BQkxFIHwgQ0ZHMV9UWF9GTE9XOworCS8qIEluaXRpYWxpemUgbG9vcCBiYWNrIHRvIG9mZiAqLworCWNmZzEgJj0gfihDRkcxX0xPT1BCQUNLIHwgQ0ZHMV9SWF9GTE9XKTsKKwlpZiAoYWRhcHRlci0+Zmxvd2NvbnRyb2wgPT0gRkxPV19SWE9OTFkgfHwKKwkJCQlhZGFwdGVyLT5mbG93Y29udHJvbCA9PSBGTE9XX0JPVEgpCisJCWNmZzEgfD0gQ0ZHMV9SWF9GTE9XOworCXdyaXRlbChjZmcxLCAmbWFjLT5jZmcxKTsKKworCS8qIE5vdyB3ZSBuZWVkIHRvIGluaXRpYWxpemUgdGhlIE1BQyBDb25maWd1cmF0aW9uIDIgcmVnaXN0ZXIgKi8KKwkvKiBwcmVhbWJsZSA3LCBjaGVjayBsZW5ndGgsIGh1Z2UgZnJhbWUgb2ZmLCBwYWQgY3JjLCBjcmMgZW5hYmxlCisJICAgZnVsbCBkdXBsZXggb2ZmICovCisJY2ZnMiB8PSAweDcwMTY7CisJY2ZnMiAmPSB+MHgwMDIxOworCisJLyogVHVybiBvbiBkdXBsZXggaWYgbmVlZGVkICovCisJaWYgKHBoeWRldiAmJiBwaHlkZXYtPmR1cGxleCA9PSBEVVBMRVhfRlVMTCkKKwkJY2ZnMiB8PSAweDAxOworCisJaWZjdHJsICY9IH4oMSA8PCAyNik7CisJaWYgKHBoeWRldiAmJiBwaHlkZXYtPmR1cGxleCA9PSBEVVBMRVhfSEFMRikKKwkJaWZjdHJsIHw9ICgxPDwyNik7CS8qIEVuYWJsZSBnaGQgKi8KKworCXdyaXRlbChpZmN0cmwsICZtYWMtPmlmX2N0cmwpOworCXdyaXRlbChjZmcyLCAmbWFjLT5jZmcyKTsKKworCWRvIHsKKwkJdWRlbGF5KDEwKTsKKwkJZGVsYXkrKzsKKwkJY2ZnMSA9IHJlYWRsKCZtYWMtPmNmZzEpOworCX0gd2hpbGUgKChjZmcxICYgQ0ZHMV9XQUlUKSAhPSBDRkcxX1dBSVQgJiYgZGVsYXkgPCAxMDApOworCisJaWYgKGRlbGF5ID09IDEwMCkgeworCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkgICAgIlN5bmNkIGJpdHMgZGlkIG5vdCByZXNwb25kIGNvcnJlY3RseSBjZmcxIHdvcmQgMHglMDh4XG4iLAorCQkJY2ZnMSk7CisJfQorCisJLyogRW5hYmxlIHR4bWFjICovCisJY3RsIHw9IDB4MDk7CS8qIFRYIG1hYyBlbmFibGUsIEZDIGRpc2FibGUgKi8KKwl3cml0ZWwoY3RsLCAmYWRhcHRlci0+cmVncy0+dHhtYWMuY3RsKTsKKworCS8qIFJlYWR5IHRvIHN0YXJ0IHRoZSBSWERNQS9UWERNQSBlbmdpbmUgKi8KKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBmTVBfQURBUFRFUl9MT1dFUl9QT1dFUikgeworCQlldDEzMXhfcnhfZG1hX2VuYWJsZShhZGFwdGVyKTsKKwkJZXQxMzF4X3R4X2RtYV9lbmFibGUoYWRhcHRlcik7CisJfQorfQorCisvKioKKyAqIGV0MTMxMF9pbl9waHlfY29tYSAtIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgaW4gcGh5IGNvbWEKKyAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMCBpZiB0aGUgZGV2aWNlIGlzIG5vdCBpbiBwaHkgY29tYSwgMSBpZiBpdCBpcyBpbiBwaHkgY29tYQorICovCitpbnQgZXQxMzEwX2luX3BoeV9jb21hKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgcG1jc3I7CisKKwlwbWNzciA9IHJlYWRsKCZhZGFwdGVyLT5yZWdzLT5nbG9iYWwucG1fY3NyKTsKKworCXJldHVybiBFVF9QTV9QSFlfU1dfQ09NQSAmIHBtY3NyID8gMSA6IDA7Cit9CisKK3ZvaWQgZXQxMzEwX3NldHVwX2RldmljZV9mb3JfbXVsdGljYXN0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgcnhtYWNfcmVncyBfX2lvbWVtICpyeG1hYyA9ICZhZGFwdGVyLT5yZWdzLT5yeG1hYzsKKwl1aW50MzJfdCBuSW5kZXg7CisJdWludDMyX3QgcmVzdWx0OworCXVpbnQzMl90IGhhc2gxID0gMDsKKwl1aW50MzJfdCBoYXNoMiA9IDA7CisJdWludDMyX3QgaGFzaDMgPSAwOworCXVpbnQzMl90IGhhc2g0ID0gMDsKKwl1MzIgcG1fY3NyOworCisJLyogSWYgRVQxMzFYX1BBQ0tFVF9UWVBFX01VTFRJQ0FTVCBpcyBzcGVjaWZpZWQsIHRoZW4gd2UgcHJvdmlzaW9uCisJICogdGhlIG11bHRpLWNhc3QgTElTVC4gIElmIGl0IGlzIE5PVCBzcGVjaWZpZWQsIChhbmQgIkFMTCIgaXMgbm90CisJICogc3BlY2lmaWVkKSB0aGVuIHdlIHNob3VsZCBwYXNzIE5PIG11bHRpLWNhc3QgYWRkcmVzc2VzIHRvIHRoZQorCSAqIGRyaXZlci4KKwkgKi8KKwlpZiAoYWRhcHRlci0+cGFja2V0X2ZpbHRlciAmIEVUMTMxWF9QQUNLRVRfVFlQRV9NVUxUSUNBU1QpIHsKKwkJLyogTG9vcCB0aHJvdWdoIG91ciBtdWx0aWNhc3QgYXJyYXkgYW5kIHNldCB1cCB0aGUgZGV2aWNlICovCisJCWZvciAobkluZGV4ID0gMDsgbkluZGV4IDwgYWRhcHRlci0+bXVsdGljYXN0X2FkZHJfY291bnQ7CisJCSAgICAgbkluZGV4KyspIHsKKwkJCXJlc3VsdCA9IGV0aGVyX2NyYyg2LCBhZGFwdGVyLT5tdWx0aWNhc3RfbGlzdFtuSW5kZXhdKTsKKworCQkJcmVzdWx0ID0gKHJlc3VsdCAmIDB4M0Y4MDAwMDApID4+IDIzOworCisJCQlpZiAocmVzdWx0IDwgMzIpIHsKKwkJCQloYXNoMSB8PSAoMSA8PCByZXN1bHQpOworCQkJfSBlbHNlIGlmICgoMzEgPCByZXN1bHQpICYmIChyZXN1bHQgPCA2NCkpIHsKKwkJCQlyZXN1bHQgLT0gMzI7CisJCQkJaGFzaDIgfD0gKDEgPDwgcmVzdWx0KTsKKwkJCX0gZWxzZSBpZiAoKDYzIDwgcmVzdWx0KSAmJiAocmVzdWx0IDwgOTYpKSB7CisJCQkJcmVzdWx0IC09IDY0OworCQkJCWhhc2gzIHw9ICgxIDw8IHJlc3VsdCk7CisJCQl9IGVsc2UgeworCQkJCXJlc3VsdCAtPSA5NjsKKwkJCQloYXNoNCB8PSAoMSA8PCByZXN1bHQpOworCQkJfQorCQl9CisJfQorCisJLyogV3JpdGUgb3V0IHRoZSBuZXcgaGFzaCB0byB0aGUgZGV2aWNlICovCisJcG1fY3NyID0gcmVhZGwoJmFkYXB0ZXItPnJlZ3MtPmdsb2JhbC5wbV9jc3IpOworCWlmICghZXQxMzEwX2luX3BoeV9jb21hKGFkYXB0ZXIpKSB7CisJCXdyaXRlbChoYXNoMSwgJnJ4bWFjLT5tdWx0aV9oYXNoMSk7CisJCXdyaXRlbChoYXNoMiwgJnJ4bWFjLT5tdWx0aV9oYXNoMik7CisJCXdyaXRlbChoYXNoMywgJnJ4bWFjLT5tdWx0aV9oYXNoMyk7CisJCXdyaXRlbChoYXNoNCwgJnJ4bWFjLT5tdWx0aV9oYXNoNCk7CisJfQorfQorCit2b2lkIGV0MTMxMF9zZXR1cF9kZXZpY2VfZm9yX3VuaWNhc3Qoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCByeG1hY19yZWdzIF9faW9tZW0gKnJ4bWFjID0gJmFkYXB0ZXItPnJlZ3MtPnJ4bWFjOworCXUzMiB1bmlfcGYxOworCXUzMiB1bmlfcGYyOworCXUzMiB1bmlfcGYzOworCXUzMiBwbV9jc3I7CisKKwkvKiBTZXQgdXAgdW5pY2FzdCBwYWNrZXQgZmlsdGVyIHJlZyAzIHRvIGJlIHRoZSBmaXJzdCB0d28gb2N0ZXRzIG9mCisJICogdGhlIE1BQyBhZGRyZXNzIGZvciBib3RoIGFkZHJlc3MKKwkgKgorCSAqIFNldCB1cCB1bmljYXN0IHBhY2tldCBmaWx0ZXIgcmVnIDIgdG8gYmUgdGhlIG9jdGV0cyAyIC0gNSBvZiB0aGUKKwkgKiBNQUMgYWRkcmVzcyBmb3Igc2Vjb25kIGFkZHJlc3MKKwkgKgorCSAqIFNldCB1cCB1bmljYXN0IHBhY2tldCBmaWx0ZXIgcmVnIDMgdG8gYmUgdGhlIG9jdGV0cyAyIC0gNSBvZiB0aGUKKwkgKiBNQUMgYWRkcmVzcyBmb3IgZmlyc3QgYWRkcmVzcworCSAqLworCXVuaV9wZjMgPSAoYWRhcHRlci0+YWRkclswXSA8PCBFVF9VTklfUEZfQUREUjJfMV9TSElGVCkgfAorCQkgIChhZGFwdGVyLT5hZGRyWzFdIDw8IEVUX1VOSV9QRl9BRERSMl8yX1NISUZUKSB8CisJCSAgKGFkYXB0ZXItPmFkZHJbMF0gPDwgRVRfVU5JX1BGX0FERFIxXzFfU0hJRlQpIHwKKwkJICAgYWRhcHRlci0+YWRkclsxXTsKKworCXVuaV9wZjIgPSAoYWRhcHRlci0+YWRkclsyXSA8PCBFVF9VTklfUEZfQUREUjJfM19TSElGVCkgfAorCQkgIChhZGFwdGVyLT5hZGRyWzNdIDw8IEVUX1VOSV9QRl9BRERSMl80X1NISUZUKSB8CisJCSAgKGFkYXB0ZXItPmFkZHJbNF0gPDwgRVRfVU5JX1BGX0FERFIyXzVfU0hJRlQpIHwKKwkJICAgYWRhcHRlci0+YWRkcls1XTsKKworCXVuaV9wZjEgPSAoYWRhcHRlci0+YWRkclsyXSA8PCBFVF9VTklfUEZfQUREUjFfM19TSElGVCkgfAorCQkgIChhZGFwdGVyLT5hZGRyWzNdIDw8IEVUX1VOSV9QRl9BRERSMV80X1NISUZUKSB8CisJCSAgKGFkYXB0ZXItPmFkZHJbNF0gPDwgRVRfVU5JX1BGX0FERFIxXzVfU0hJRlQpIHwKKwkJICAgYWRhcHRlci0+YWRkcls1XTsKKworCXBtX2NzciA9IHJlYWRsKCZhZGFwdGVyLT5yZWdzLT5nbG9iYWwucG1fY3NyKTsKKwlpZiAoIWV0MTMxMF9pbl9waHlfY29tYShhZGFwdGVyKSkgeworCQl3cml0ZWwodW5pX3BmMSwgJnJ4bWFjLT51bmlfcGZfYWRkcjEpOworCQl3cml0ZWwodW5pX3BmMiwgJnJ4bWFjLT51bmlfcGZfYWRkcjIpOworCQl3cml0ZWwodW5pX3BmMywgJnJ4bWFjLT51bmlfcGZfYWRkcjMpOworCX0KK30KKwordm9pZCBldDEzMTBfY29uZmlnX3J4bWFjX3JlZ3Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCByeG1hY19yZWdzIF9faW9tZW0gKnJ4bWFjID0gJmFkYXB0ZXItPnJlZ3MtPnJ4bWFjOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBhZGFwdGVyLT5waHlkZXY7CisJdTMyIHNhX2xvOworCXUzMiBzYV9oaSA9IDA7CisJdTMyIHBmX2N0cmwgPSAwOworCisJLyogRGlzYWJsZSB0aGUgTUFDIHdoaWxlIGl0IGlzIGJlaW5nIGNvbmZpZ3VyZWQgKGFsc28gZGlzYWJsZSBXT0wpICovCisJd3JpdGVsKDB4OCwgJnJ4bWFjLT5jdHJsKTsKKworCS8qIEluaXRpYWxpemUgV09MIHRvIGRpc2FibGVkLiAqLworCXdyaXRlbCgwLCAmcnhtYWMtPmNyYzApOworCXdyaXRlbCgwLCAmcnhtYWMtPmNyYzEyKTsKKwl3cml0ZWwoMCwgJnJ4bWFjLT5jcmMzNCk7CisKKwkvKiBXZSBuZWVkIHRvIHNldCB0aGUgV09MIG1hc2swIC0gbWFzazQgbmV4dC4gIFdlIGluaXRpYWxpemUgaXQgdG8KKwkgKiBpdHMgZGVmYXVsdCBWYWx1ZXMgb2YgMHgwMDAwMDAwMCBiZWNhdXNlIHRoZXJlIGFyZSBub3QgV09MIG1hc2tzCisJICogYXMgb2YgdGhpcyB0aW1lLgorCSAqLworCXdyaXRlbCgwLCAmcnhtYWMtPm1hc2swX3dvcmQwKTsKKwl3cml0ZWwoMCwgJnJ4bWFjLT5tYXNrMF93b3JkMSk7CisJd3JpdGVsKDAsICZyeG1hYy0+bWFzazBfd29yZDIpOworCXdyaXRlbCgwLCAmcnhtYWMtPm1hc2swX3dvcmQzKTsKKworCXdyaXRlbCgwLCAmcnhtYWMtPm1hc2sxX3dvcmQwKTsKKwl3cml0ZWwoMCwgJnJ4bWFjLT5tYXNrMV93b3JkMSk7CisJd3JpdGVsKDAsICZyeG1hYy0+bWFzazFfd29yZDIpOworCXdyaXRlbCgwLCAmcnhtYWMtPm1hc2sxX3dvcmQzKTsKKworCXdyaXRlbCgwLCAmcnhtYWMtPm1hc2syX3dvcmQwKTsKKwl3cml0ZWwoMCwgJnJ4bWFjLT5tYXNrMl93b3JkMSk7CisJd3JpdGVsKDAsICZyeG1hYy0+bWFzazJfd29yZDIpOworCXdyaXRlbCgwLCAmcnhtYWMtPm1hc2syX3dvcmQzKTsKKworCXdyaXRlbCgwLCAmcnhtYWMtPm1hc2szX3dvcmQwKTsKKwl3cml0ZWwoMCwgJnJ4bWFjLT5tYXNrM193b3JkMSk7CisJd3JpdGVsKDAsICZyeG1hYy0+bWFzazNfd29yZDIpOworCXdyaXRlbCgwLCAmcnhtYWMtPm1hc2szX3dvcmQzKTsKKworCXdyaXRlbCgwLCAmcnhtYWMtPm1hc2s0X3dvcmQwKTsKKwl3cml0ZWwoMCwgJnJ4bWFjLT5tYXNrNF93b3JkMSk7CisJd3JpdGVsKDAsICZyeG1hYy0+bWFzazRfd29yZDIpOworCXdyaXRlbCgwLCAmcnhtYWMtPm1hc2s0X3dvcmQzKTsKKworCS8qIExldHMgc2V0dXAgdGhlIFdPTCBTb3VyY2UgQWRkcmVzcyAqLworCXNhX2xvID0gKGFkYXB0ZXItPmFkZHJbMl0gPDwgRVRfV09MX0xPX1NBM19TSElGVCkgfAorCQkoYWRhcHRlci0+YWRkclszXSA8PCBFVF9XT0xfTE9fU0E0X1NISUZUKSB8CisJCShhZGFwdGVyLT5hZGRyWzRdIDw8IEVUX1dPTF9MT19TQTVfU0hJRlQpIHwKKwkJIGFkYXB0ZXItPmFkZHJbNV07CisJd3JpdGVsKHNhX2xvLCAmcnhtYWMtPnNhX2xvKTsKKworCXNhX2hpID0gKHUzMikgKGFkYXB0ZXItPmFkZHJbMF0gPDwgRVRfV09MX0hJX1NBMV9TSElGVCkgfAorCQkgICAgICAgYWRhcHRlci0+YWRkclsxXTsKKwl3cml0ZWwoc2FfaGksICZyeG1hYy0+c2FfaGkpOworCisJLyogRGlzYWJsZSBhbGwgUGFja2V0IEZpbHRlcmluZyAqLworCXdyaXRlbCgwLCAmcnhtYWMtPnBmX2N0cmwpOworCisJLyogTGV0J3MgaW5pdGlhbGl6ZSB0aGUgVW5pY2FzdCBQYWNrZXQgZmlsdGVyaW5nIGFkZHJlc3MgKi8KKwlpZiAoYWRhcHRlci0+cGFja2V0X2ZpbHRlciAmIEVUMTMxWF9QQUNLRVRfVFlQRV9ESVJFQ1RFRCkgeworCQlldDEzMTBfc2V0dXBfZGV2aWNlX2Zvcl91bmljYXN0KGFkYXB0ZXIpOworCQlwZl9jdHJsIHw9IDQ7CS8qIFVuaWNhc3QgZmlsdGVyICovCisJfSBlbHNlIHsKKwkJd3JpdGVsKDAsICZyeG1hYy0+dW5pX3BmX2FkZHIxKTsKKwkJd3JpdGVsKDAsICZyeG1hYy0+dW5pX3BmX2FkZHIyKTsKKwkJd3JpdGVsKDAsICZyeG1hYy0+dW5pX3BmX2FkZHIzKTsKKwl9CisKKwkvKiBMZXQncyBpbml0aWFsaXplIHRoZSBNdWx0aWNhc3QgaGFzaCAqLworCWlmICghKGFkYXB0ZXItPnBhY2tldF9maWx0ZXIgJiBFVDEzMVhfUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVCkpIHsKKwkJcGZfY3RybCB8PSAyOwkvKiBNdWx0aWNhc3QgZmlsdGVyICovCisJCWV0MTMxMF9zZXR1cF9kZXZpY2VfZm9yX211bHRpY2FzdChhZGFwdGVyKTsKKwl9CisKKwkvKiBSdW50IHBhY2tldCBmaWx0ZXJpbmcuICBEaWRuJ3Qgd29yayBpbiB2ZXJzaW9uIEEgc2lsaWNvbi4gKi8KKwlwZl9jdHJsIHw9IChOSUNfTUlOX1BBQ0tFVF9TSVpFICsgNCkgPDwgMTY7CisJcGZfY3RybCB8PSA4OwkvKiBGcmFnbWVudCBmaWx0ZXIgKi8KKworCWlmIChhZGFwdGVyLT5yZWdpc3RyeV9qdW1ib19wYWNrZXQgPiA4MTkyKQorCQkvKiBJbiBvcmRlciB0byB0cmFuc21pdCBqdW1ibyBwYWNrZXRzIGdyZWF0ZXIgdGhhbiA4aywgdGhlCisJCSAqIEZJRk8gYmV0d2VlbiBSeE1BQyBhbmQgUnhETUEgbmVlZHMgdG8gYmUgcmVkdWNlZCBpbiBzaXplCisJCSAqIHRvICgxNmsgLSBKdW1ibyBwYWNrZXQgc2l6ZSkuICBJbiBvcmRlciB0byBpbXBsZW1lbnQgdGhpcywKKwkJICogd2UgbXVzdCB1c2UgImN1dCB0aHJvdWdoIiBtb2RlIGluIHRoZSBSeE1BQywgd2hpY2ggY2hvcHMKKwkJICogcGFja2V0cyBkb3duIGludG8gc2VnbWVudHMgd2hpY2ggYXJlIChtYXhfc2l6ZSAqIDE2KS4gIEluCisJCSAqIHRoaXMgY2FzZSB3ZSBzZWxlY3RlZCAyNTYgYnl0ZXMsIHNpbmNlIHRoaXMgaXMgdGhlIHNpemUgb2YKKwkJICogdGhlIFBDSS1FeHByZXNzIFRMUCdzIHRoYXQgdGhlIDEzMTAgdXNlcy4KKwkJICoKKwkJICogc2VnX2VuIG9uLCBmY19lbiBvZmYsIHNpemUgMHgxMAorCQkgKi8KKwkJd3JpdGVsKDB4NDEsICZyeG1hYy0+bWNpZl9jdHJsX21heF9zZWcpOworCWVsc2UKKwkJd3JpdGVsKDAsICZyeG1hYy0+bWNpZl9jdHJsX21heF9zZWcpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgTUNJRiB3YXRlciBtYXJrcyAqLworCXdyaXRlbCgwLCAmcnhtYWMtPm1jaWZfd2F0ZXJfbWFyayk7CisKKwkvKiAgSW5pdGlhbGl6ZSB0aGUgTUlGIGNvbnRyb2wgKi8KKwl3cml0ZWwoMCwgJnJ4bWFjLT5taWZfY3RybCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBTcGFjZSBBdmFpbGFibGUgUmVnaXN0ZXIgKi8KKwl3cml0ZWwoMCwgJnJ4bWFjLT5zcGFjZV9hdmFpbCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSB0aGUgbWlmX2N0cmwgcmVnaXN0ZXIKKwkgKiBiaXQgMzogIFJlY2VpdmUgY29kZSBlcnJvci4gT25lIG9yIG1vcmUgbmliYmxlcyB3ZXJlIHNpZ25hbGVkIGFzCisJICoJICAgZXJyb3JzICBkdXJpbmcgdGhlIHJlY2VwdGlvbiBvZiB0aGUgcGFja2V0LiAgQ2xlYXIgdGhpcworCSAqCSAgIGJpdCBpbiBHaWdhYml0LCBzZXQgaXQgaW4gMTAwTWJpdC4gIFRoaXMgd2FzIGRlcml2ZWQKKwkgKgkgICBleHBlcmltZW50YWxseSBhdCBVTkguCisJICogYml0IDQ6ICBSZWNlaXZlIENSQyBlcnJvci4gVGhlIHBhY2tldCdzIENSQyBkaWQgbm90IG1hdGNoIHRoZQorCSAqCSAgIGludGVybmFsbHkgZ2VuZXJhdGVkIENSQy4KKwkgKiBiaXQgNTogIFJlY2VpdmUgbGVuZ3RoIGNoZWNrIGVycm9yLiBJbmRpY2F0ZXMgdGhhdCBmcmFtZSBsZW5ndGgKKwkgKgkgICBmaWVsZCB2YWx1ZSBpbiB0aGUgcGFja2V0IGRvZXMgbm90IG1hdGNoIHRoZSBhY3R1YWwgZGF0YQorCSAqCSAgIGJ5dGUgbGVuZ3RoIGFuZCBpcyBub3QgYSB0eXBlIGZpZWxkLgorCSAqIGJpdCAxNjogUmVjZWl2ZSBmcmFtZSB0cnVuY2F0ZWQuCisJICogYml0IDE3OiBEcm9wIHBhY2tldCBlbmFibGUKKwkgKi8KKwlpZiAocGh5ZGV2ICYmIHBoeWRldi0+c3BlZWQgPT0gU1BFRURfMTAwKQorCQl3cml0ZWwoMHgzMDAzOCwgJnJ4bWFjLT5taWZfY3RybCk7CisJZWxzZQorCQl3cml0ZWwoMHgzMDAzMCwgJnJ4bWFjLT5taWZfY3RybCk7CisKKwkvKiBGaW5hbGx5IHdlIGluaXRpYWxpemUgUnhNYWMgdG8gYmUgZW5hYmxlZCAmIFdPTCBkaXNhYmxlZC4gIFBhY2tldAorCSAqIGZpbHRlciBpcyBhbHdheXMgZW5hYmxlZCBzaW5jZSBpdCBpcyB3aGVyZSB0aGUgcnVudCBwYWNrZXRzIGFyZQorCSAqIHN1cHBvc2VkIHRvIGJlIGRyb3BwZWQuICBGb3IgdmVyc2lvbiBBIHNpbGljb24sIHJ1bnQgcGFja2V0CisJICogZHJvcHBpbmcgZG9lc24ndCB3b3JrLCBzbyBpdCBpcyBkaXNhYmxlZCBpbiB0aGUgcGZfY3RybCByZWdpc3RlciwKKwkgKiBidXQgd2Ugc3RpbGwgbGVhdmUgdGhlIHBhY2tldCBmaWx0ZXIgb24uCisJICovCisJd3JpdGVsKHBmX2N0cmwsICZyeG1hYy0+cGZfY3RybCk7CisJd3JpdGVsKDB4OSwgJnJ4bWFjLT5jdHJsKTsKK30KKwordm9pZCBldDEzMTBfY29uZmlnX3R4bWFjX3JlZ3Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCB0eG1hY19yZWdzIF9faW9tZW0gKnR4bWFjID0gJmFkYXB0ZXItPnJlZ3MtPnR4bWFjOworCisJLyogV2UgbmVlZCB0byB1cGRhdGUgdGhlIENvbnRyb2wgRnJhbWUgUGFyYW1ldGVycworCSAqIGNmcHQgLSBjb250cm9sIGZyYW1lIHBhdXNlIHRpbWVyIHNldCB0byA2NCAoMHg0MCkKKwkgKiBjZmVwIC0gY29udHJvbCBmcmFtZSBleHRlbmRlZCBwYXVzZSB0aW1lciBzZXQgdG8gMHgwCisJICovCisJaWYgKGFkYXB0ZXItPmZsb3djb250cm9sID09IEZMT1dfTk9ORSkKKwkJd3JpdGVsKDAsICZ0eG1hYy0+Y2ZfcGFyYW0pOworCWVsc2UKKwkJd3JpdGVsKDB4NDAsICZ0eG1hYy0+Y2ZfcGFyYW0pOworfQorCit2b2lkIGV0MTMxMF9jb25maWdfbWFjc3RhdF9yZWdzKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgbWFjc3RhdF9yZWdzIF9faW9tZW0gKm1hY3N0YXQgPQorCQkmYWRhcHRlci0+cmVncy0+bWFjc3RhdDsKKworCS8qIE5leHQgd2UgbmVlZCB0byBpbml0aWFsaXplIGFsbCB0aGUgbWFjc3RhdCByZWdpc3RlcnMgdG8gemVybyBvbgorCSAqIHRoZSBkZXZpY2UuCisJICovCisJd3JpdGVsKDAsICZtYWNzdGF0LT50eHJ4XzBfNjRfYnl0ZV9mcmFtZXMpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+dHhyeF82NV8xMjdfYnl0ZV9mcmFtZXMpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+dHhyeF8xMjhfMjU1X2J5dGVfZnJhbWVzKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4cnhfMjU2XzUxMV9ieXRlX2ZyYW1lcyk7CisJd3JpdGVsKDAsICZtYWNzdGF0LT50eHJ4XzUxMl8xMDIzX2J5dGVfZnJhbWVzKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4cnhfMTAyNF8xNTE4X2J5dGVfZnJhbWVzKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4cnhfMTUxOV8xNTIyX2d2bG5fZnJhbWVzKTsKKworCXdyaXRlbCgwLCAmbWFjc3RhdC0+cnhfYnl0ZXMpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+cnhfcGFja2V0cyk7CisJd3JpdGVsKDAsICZtYWNzdGF0LT5yeF9mY3NfZXJycyk7CisJd3JpdGVsKDAsICZtYWNzdGF0LT5yeF9tdWx0aWNhc3RfcGFja2V0cyk7CisJd3JpdGVsKDAsICZtYWNzdGF0LT5yeF9icm9hZGNhc3RfcGFja2V0cyk7CisJd3JpdGVsKDAsICZtYWNzdGF0LT5yeF9jb250cm9sX2ZyYW1lcyk7CisJd3JpdGVsKDAsICZtYWNzdGF0LT5yeF9wYXVzZV9mcmFtZXMpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+cnhfdW5rbm93bl9vcGNvZGVzKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPnJ4X2FsaWduX2VycnMpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+cnhfZnJhbWVfbGVuX2VycnMpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+cnhfY29kZV9lcnJzKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPnJ4X2NhcnJpZXJfc2Vuc2VfZXJycyk7CisJd3JpdGVsKDAsICZtYWNzdGF0LT5yeF91bmRlcnNpemVfcGFja2V0cyk7CisJd3JpdGVsKDAsICZtYWNzdGF0LT5yeF9vdmVyc2l6ZV9wYWNrZXRzKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPnJ4X2ZyYWdtZW50X3BhY2tldHMpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+cnhfamFiYmVycyk7CisJd3JpdGVsKDAsICZtYWNzdGF0LT5yeF9kcm9wcyk7CisKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4X2J5dGVzKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4X3BhY2tldHMpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+dHhfbXVsdGljYXN0X3BhY2tldHMpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+dHhfYnJvYWRjYXN0X3BhY2tldHMpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+dHhfcGF1c2VfZnJhbWVzKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4X2RlZmVycmVkKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4X2V4Y2Vzc2l2ZV9kZWZlcnJlZCk7CisJd3JpdGVsKDAsICZtYWNzdGF0LT50eF9zaW5nbGVfY29sbGlzaW9ucyk7CisJd3JpdGVsKDAsICZtYWNzdGF0LT50eF9tdWx0aXBsZV9jb2xsaXNpb25zKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4X2xhdGVfY29sbGlzaW9ucyk7CisJd3JpdGVsKDAsICZtYWNzdGF0LT50eF9leGNlc3NpdmVfY29sbGlzaW9ucyk7CisJd3JpdGVsKDAsICZtYWNzdGF0LT50eF90b3RhbF9jb2xsaXNpb25zKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4X3BhdXNlX2hvbm9yZWRfZnJhbWVzKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4X2Ryb3BzKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4X2phYmJlcnMpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+dHhfZmNzX2VycnMpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+dHhfY29udHJvbF9mcmFtZXMpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+dHhfb3ZlcnNpemVfZnJhbWVzKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPnR4X3VuZGVyc2l6ZV9mcmFtZXMpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+dHhfZnJhZ21lbnRzKTsKKwl3cml0ZWwoMCwgJm1hY3N0YXQtPmNhcnJ5X3JlZzEpOworCXdyaXRlbCgwLCAmbWFjc3RhdC0+Y2FycnlfcmVnMik7CisKKwkvKiBVbm1hc2sgYW55IGNvdW50ZXJzIHRoYXQgd2Ugd2FudCB0byB0cmFjayB0aGUgb3ZlcmZsb3cgb2YuCisJICogSW5pdGlhbGx5IHRoaXMgd2lsbCBiZSBhbGwgY291bnRlcnMuICBJdCBtYXkgYmVjb21lIGNsZWFyIGxhdGVyCisJICogdGhhdCB3ZSBkbyBub3QgbmVlZCB0byB0cmFjayBhbGwgY291bnRlcnMuCisJICovCisJd3JpdGVsKDB4RkZGRkJFMzIsICZtYWNzdGF0LT5jYXJyeV9yZWcxX21hc2spOworCXdyaXRlbCgweEZGRkU3RThCLCAmbWFjc3RhdC0+Y2FycnlfcmVnMl9tYXNrKTsKK30KKworLyoqCisgKiBldDEzMXhfcGh5X21paV9yZWFkIC0gUmVhZCBmcm9tIHRoZSBQSFkgdGhyb3VnaCB0aGUgTUlJIEludGVyZmFjZSBvbiB0aGUgTUFDCisgKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICogQGFkZHI6IHRoZSBhZGRyZXNzIG9mIHRoZSB0cmFuc2NlaXZlcgorICogQHJlZzogdGhlIHJlZ2lzdGVyIHRvIHJlYWQKKyAqIEB2YWx1ZTogcG9pbnRlciB0byBhIDE2LWJpdCB2YWx1ZSBpbiB3aGljaCB0aGUgdmFsdWUgd2lsbCBiZSBzdG9yZWQKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKQorICovCitpbnQgZXQxMzF4X3BoeV9taWlfcmVhZChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IGFkZHIsCisJICAgICAgdTggcmVnLCB1MTYgKnZhbHVlKQoreworCXN0cnVjdCBtYWNfcmVncyBfX2lvbWVtICptYWMgPSAmYWRhcHRlci0+cmVncy0+bWFjOworCWludCBzdGF0dXMgPSAwOworCXUzMiBkZWxheSA9IDA7CisJdTMyIG1paV9hZGRyOworCXUzMiBtaWlfY21kOworCXUzMiBtaWlfaW5kaWNhdG9yOworCisJLyogU2F2ZSBhIGxvY2FsIGNvcHkgb2YgdGhlIHJlZ2lzdGVycyB3ZSBhcmUgZGVhbGluZyB3aXRoIHNvIHdlIGNhbgorCSAqIHNldCB0aGVtIGJhY2sKKwkgKi8KKwltaWlfYWRkciA9IHJlYWRsKCZtYWMtPm1paV9tZ210X2FkZHIpOworCW1paV9jbWQgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9jbWQpOworCisJLyogU3RvcCB0aGUgY3VycmVudCBvcGVyYXRpb24gKi8KKwl3cml0ZWwoMCwgJm1hYy0+bWlpX21nbXRfY21kKTsKKworCS8qIFNldCB1cCB0aGUgcmVnaXN0ZXIgd2UgbmVlZCB0byByZWFkIGZyb20gb24gdGhlIGNvcnJlY3QgUEhZICovCisJd3JpdGVsKE1JSV9BRERSKGFkZHIsIHJlZyksICZtYWMtPm1paV9tZ210X2FkZHIpOworCisJd3JpdGVsKDB4MSwgJm1hYy0+bWlpX21nbXRfY21kKTsKKworCWRvIHsKKwkJdWRlbGF5KDUwKTsKKwkJZGVsYXkrKzsKKwkJbWlpX2luZGljYXRvciA9IHJlYWRsKCZtYWMtPm1paV9tZ210X2luZGljYXRvcik7CisJfSB3aGlsZSAoKG1paV9pbmRpY2F0b3IgJiBNR01UX1dBSVQpICYmIGRlbGF5IDwgNTApOworCisJLyogSWYgd2UgaGl0IHRoZSBtYXggZGVsYXksIHdlIGNvdWxkIG5vdCByZWFkIHRoZSByZWdpc3RlciAqLworCWlmIChkZWxheSA9PSA1MCkgeworCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJICAgICJyZWcgMHglMDh4IGNvdWxkIG5vdCBiZSByZWFkXG4iLCByZWcpOworCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LCAic3RhdHVzIGlzICAweCUwOHhcbiIsCisJCQkgICAgbWlpX2luZGljYXRvcik7CisKKwkJc3RhdHVzID0gLUVJTzsKKwl9CisKKwkvKiBJZiB3ZSBoaXQgaGVyZSB3ZSB3ZXJlIGFibGUgdG8gcmVhZCB0aGUgcmVnaXN0ZXIgYW5kIHdlIG5lZWQgdG8KKwkgKiByZXR1cm4gdGhlIHZhbHVlIHRvIHRoZSBjYWxsZXIgKi8KKwkqdmFsdWUgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9zdGF0KSAmIDB4RkZGRjsKKworCS8qIFN0b3AgdGhlIHJlYWQgb3BlcmF0aW9uICovCisJd3JpdGVsKDAsICZtYWMtPm1paV9tZ210X2NtZCk7CisKKwkvKiBzZXQgdGhlIHJlZ2lzdGVycyB3ZSB0b3VjaGVkIGJhY2sgdG8gdGhlIHN0YXRlIGF0IHdoaWNoIHdlIGVudGVyZWQKKwkgKiB0aGlzIGZ1bmN0aW9uCisJICovCisJd3JpdGVsKG1paV9hZGRyLCAmbWFjLT5taWlfbWdtdF9hZGRyKTsKKwl3cml0ZWwobWlpX2NtZCwgJm1hYy0+bWlpX21nbXRfY21kKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBldDEzMXhfbWlpX3JlYWQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLCB1OCByZWcsIHUxNiAqdmFsdWUpCit7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGFkYXB0ZXItPnBoeWRldjsKKworCWlmICghcGh5ZGV2KQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBldDEzMXhfcGh5X21paV9yZWFkKGFkYXB0ZXIsIHBoeWRldi0+YWRkciwgcmVnLCB2YWx1ZSk7Cit9CisKKy8qKgorICogZXQxMzF4X21paV93cml0ZSAtIFdyaXRlIHRvIGEgUEhZIHJlZ2lzdGVyIHRocm91Z2ggdGhlIE1JSSBpbnRlcmZhY2Ugb2YgdGhlIE1BQworICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqIEByZWc6IHRoZSByZWdpc3RlciB0byByZWFkCisgKiBAdmFsdWU6IDE2LWJpdCB2YWx1ZSB0byB3cml0ZQorICoKKyAqIEZJWE1FOiBvbmUgY2FsbGVyIGluIG5ldGRldiBzdGlsbAorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUgKGFzIGRlZmluZWQgaW4gZXJybm8uaCkKKyAqLworaW50IGV0MTMxeF9taWlfd3JpdGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLCB1OCByZWcsIHUxNiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbWFjX3JlZ3MgX19pb21lbSAqbWFjID0gJmFkYXB0ZXItPnJlZ3MtPm1hYzsKKwlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2ID0gYWRhcHRlci0+cGh5ZGV2OworCWludCBzdGF0dXMgPSAwOworCXU4IGFkZHI7CisJdTMyIGRlbGF5ID0gMDsKKwl1MzIgbWlpX2FkZHI7CisJdTMyIG1paV9jbWQ7CisJdTMyIG1paV9pbmRpY2F0b3I7CisKKwlpZiAoIXBoeWRldikKKwkJcmV0dXJuIC1FSU87CisKKwlhZGRyID0gcGh5ZGV2LT5hZGRyOworCisJLyogU2F2ZSBhIGxvY2FsIGNvcHkgb2YgdGhlIHJlZ2lzdGVycyB3ZSBhcmUgZGVhbGluZyB3aXRoIHNvIHdlIGNhbgorCSAqIHNldCB0aGVtIGJhY2sKKwkgKi8KKwltaWlfYWRkciA9IHJlYWRsKCZtYWMtPm1paV9tZ210X2FkZHIpOworCW1paV9jbWQgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9jbWQpOworCisJLyogU3RvcCB0aGUgY3VycmVudCBvcGVyYXRpb24gKi8KKwl3cml0ZWwoMCwgJm1hYy0+bWlpX21nbXRfY21kKTsKKworCS8qIFNldCB1cCB0aGUgcmVnaXN0ZXIgd2UgbmVlZCB0byB3cml0ZSB0byBvbiB0aGUgY29ycmVjdCBQSFkgKi8KKwl3cml0ZWwoTUlJX0FERFIoYWRkciwgcmVnKSwgJm1hYy0+bWlpX21nbXRfYWRkcik7CisKKwkvKiBBZGQgdGhlIHZhbHVlIHRvIHdyaXRlIHRvIHRoZSByZWdpc3RlcnMgdG8gdGhlIG1hYyAqLworCXdyaXRlbCh2YWx1ZSwgJm1hYy0+bWlpX21nbXRfY3RybCk7CisKKwlkbyB7CisJCXVkZWxheSg1MCk7CisJCWRlbGF5Kys7CisJCW1paV9pbmRpY2F0b3IgPSByZWFkbCgmbWFjLT5taWlfbWdtdF9pbmRpY2F0b3IpOworCX0gd2hpbGUgKChtaWlfaW5kaWNhdG9yICYgTUdNVF9CVVNZKSAmJiBkZWxheSA8IDEwMCk7CisKKwkvKiBJZiB3ZSBoaXQgdGhlIG1heCBkZWxheSwgd2UgY291bGQgbm90IHdyaXRlIHRoZSByZWdpc3RlciAqLworCWlmIChkZWxheSA9PSAxMDApIHsKKwkJdTE2IHRtcDsKKworCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkgICAgInJlZyAweCUwOHggY291bGQgbm90IGJlIHdyaXR0ZW4iLCByZWcpOworCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LCAic3RhdHVzIGlzICAweCUwOHhcbiIsCisJCQkgICAgbWlpX2luZGljYXRvcik7CisJCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJjb21tYW5kIGlzICAweCUwOHhcbiIsCisJCQkgICAgcmVhZGwoJm1hYy0+bWlpX21nbXRfY21kKSk7CisKKwkJZXQxMzF4X21paV9yZWFkKGFkYXB0ZXIsIHJlZywgJnRtcCk7CisKKwkJc3RhdHVzID0gLUVJTzsKKwl9CisJLyogU3RvcCB0aGUgd3JpdGUgb3BlcmF0aW9uICovCisJd3JpdGVsKDAsICZtYWMtPm1paV9tZ210X2NtZCk7CisKKwkvKgorCSAqIHNldCB0aGUgcmVnaXN0ZXJzIHdlIHRvdWNoZWQgYmFjayB0byB0aGUgc3RhdGUgYXQgd2hpY2ggd2UgZW50ZXJlZAorCSAqIHRoaXMgZnVuY3Rpb24KKwkgKi8KKwl3cml0ZWwobWlpX2FkZHIsICZtYWMtPm1paV9tZ210X2FkZHIpOworCXdyaXRlbChtaWlfY21kLCAmbWFjLT5taWlfbWdtdF9jbWQpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogU3RpbGwgdXNlZCBmcm9tIF9tYWMgZm9yIEJJVF9SRUFEICovCit2b2lkIGV0MTMxMF9waHlfYWNjZXNzX21paV9iaXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLCB1MTYgYWN0aW9uLAorCQkJICAgICAgIHUxNiByZWdudW0sIHUxNiBiaXRudW0sIHU4ICp2YWx1ZSkKK3sKKwl1MTYgcmVnOworCXUxNiBtYXNrID0gMHgwMDAxIDw8IGJpdG51bTsKKworCS8qIFJlYWQgdGhlIHJlcXVlc3RlZCByZWdpc3RlciAqLworCWV0MTMxeF9taWlfcmVhZChhZGFwdGVyLCByZWdudW0sICZyZWcpOworCisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIFRSVUVQSFlfQklUX1JFQUQ6CisJCSp2YWx1ZSA9IChyZWcgJiBtYXNrKSA+PiBiaXRudW07CisJCWJyZWFrOworCisJY2FzZSBUUlVFUEhZX0JJVF9TRVQ6CisJCWV0MTMxeF9taWlfd3JpdGUoYWRhcHRlciwgcmVnbnVtLCByZWcgfCBtYXNrKTsKKwkJYnJlYWs7CisKKwljYXNlIFRSVUVQSFlfQklUX0NMRUFSOgorCQlldDEzMXhfbWlpX3dyaXRlKGFkYXB0ZXIsIHJlZ251bSwgcmVnICYgfm1hc2spOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKwordm9pZCBldDEzMTBfY29uZmlnX2Zsb3dfY29udHJvbChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGFkYXB0ZXItPnBoeWRldjsKKworCWlmIChwaHlkZXYtPmR1cGxleCA9PSBEVVBMRVhfSEFMRikgeworCQlhZGFwdGVyLT5mbG93Y29udHJvbCA9IEZMT1dfTk9ORTsKKwl9IGVsc2UgeworCQljaGFyIHJlbW90ZV9wYXVzZSwgcmVtb3RlX2FzeW5jX3BhdXNlOworCisJCWV0MTMxMF9waHlfYWNjZXNzX21paV9iaXQoYWRhcHRlciwKKwkJCQlUUlVFUEhZX0JJVF9SRUFELCA1LCAxMCwgJnJlbW90ZV9wYXVzZSk7CisJCWV0MTMxMF9waHlfYWNjZXNzX21paV9iaXQoYWRhcHRlciwKKwkJCQlUUlVFUEhZX0JJVF9SRUFELCA1LCAxMSwKKwkJCQkmcmVtb3RlX2FzeW5jX3BhdXNlKTsKKworCQlpZiAoKHJlbW90ZV9wYXVzZSA9PSBUUlVFUEhZX0JJVF9TRVQpICYmCisJCSAgICAocmVtb3RlX2FzeW5jX3BhdXNlID09IFRSVUVQSFlfQklUX1NFVCkpIHsKKwkJCWFkYXB0ZXItPmZsb3djb250cm9sID0gYWRhcHRlci0+d2FudGVkX2Zsb3c7CisJCX0gZWxzZSBpZiAoKHJlbW90ZV9wYXVzZSA9PSBUUlVFUEhZX0JJVF9TRVQpICYmCisJCQkgICAocmVtb3RlX2FzeW5jX3BhdXNlID09IFRSVUVQSFlfQklUX0NMRUFSKSkgeworCQkJaWYgKGFkYXB0ZXItPndhbnRlZF9mbG93ID09IEZMT1dfQk9USCkKKwkJCQlhZGFwdGVyLT5mbG93Y29udHJvbCA9IEZMT1dfQk9USDsKKwkJCWVsc2UKKwkJCQlhZGFwdGVyLT5mbG93Y29udHJvbCA9IEZMT1dfTk9ORTsKKwkJfSBlbHNlIGlmICgocmVtb3RlX3BhdXNlID09IFRSVUVQSFlfQklUX0NMRUFSKSAmJgorCQkJICAgKHJlbW90ZV9hc3luY19wYXVzZSA9PSBUUlVFUEhZX0JJVF9DTEVBUikpIHsKKwkJCWFkYXB0ZXItPmZsb3djb250cm9sID0gRkxPV19OT05FOworCQl9IGVsc2Ugey8qIGlmIChyZW1vdGVfcGF1c2UgPT0gVFJVRVBIWV9DTEVBUl9CSVQgJiYKKwkJCSAgICAgICByZW1vdGVfYXN5bmNfcGF1c2UgPT0gVFJVRVBIWV9TRVRfQklUKSAqLworCQkJaWYgKGFkYXB0ZXItPndhbnRlZF9mbG93ID09IEZMT1dfQk9USCkKKwkJCQlhZGFwdGVyLT5mbG93Y29udHJvbCA9IEZMT1dfUlhPTkxZOworCQkJZWxzZQorCQkJCWFkYXB0ZXItPmZsb3djb250cm9sID0gRkxPV19OT05FOworCQl9CisJfQorfQorCisvKioKKyAqIGV0MTMxMF91cGRhdGVfbWFjc3RhdF9ob3N0X2NvdW50ZXJzIC0gVXBkYXRlIHRoZSBsb2NhbCBjb3B5IG9mIHRoZSBzdGF0aXN0aWNzCisgKiBAYWRhcHRlcjogcG9pbnRlciB0byB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqLwordm9pZCBldDEzMTBfdXBkYXRlX21hY3N0YXRfaG9zdF9jb3VudGVycyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGNlX3N0YXRzICpzdGF0cyA9ICZhZGFwdGVyLT5zdGF0czsKKwlzdHJ1Y3QgbWFjc3RhdF9yZWdzIF9faW9tZW0gKm1hY3N0YXQgPQorCQkmYWRhcHRlci0+cmVncy0+bWFjc3RhdDsKKworCXN0YXRzLT50eF9jb2xsaXNpb25zCSAgICAgICArPSByZWFkbCgmbWFjc3RhdC0+dHhfdG90YWxfY29sbGlzaW9ucyk7CisJc3RhdHMtPnR4X2ZpcnN0X2NvbGxpc2lvbnMgICAgICs9IHJlYWRsKCZtYWNzdGF0LT50eF9zaW5nbGVfY29sbGlzaW9ucyk7CisJc3RhdHMtPnR4X2RlZmVycmVkCSAgICAgICArPSByZWFkbCgmbWFjc3RhdC0+dHhfZGVmZXJyZWQpOworCXN0YXRzLT50eF9leGNlc3NpdmVfY29sbGlzaW9ucyArPQorCQkJCXJlYWRsKCZtYWNzdGF0LT50eF9tdWx0aXBsZV9jb2xsaXNpb25zKTsKKwlzdGF0cy0+dHhfbGF0ZV9jb2xsaXNpb25zICAgICAgKz0gcmVhZGwoJm1hY3N0YXQtPnR4X2xhdGVfY29sbGlzaW9ucyk7CisJc3RhdHMtPnR4X3VuZGVyZmxvd3MJICAgICAgICs9IHJlYWRsKCZtYWNzdGF0LT50eF91bmRlcnNpemVfZnJhbWVzKTsKKwlzdGF0cy0+dHhfbWF4X3BrdF9lcnJzCSAgICAgICArPSByZWFkbCgmbWFjc3RhdC0+dHhfb3ZlcnNpemVfZnJhbWVzKTsKKworCXN0YXRzLT5yeF9hbGlnbl9lcnJzICAgICAgICArPSByZWFkbCgmbWFjc3RhdC0+cnhfYWxpZ25fZXJycyk7CisJc3RhdHMtPnJ4X2NyY19lcnJzICAgICAgICAgICs9IHJlYWRsKCZtYWNzdGF0LT5yeF9jb2RlX2VycnMpOworCXN0YXRzLT5yY3ZkX3BrdHNfZHJvcHBlZCAgICArPSByZWFkbCgmbWFjc3RhdC0+cnhfZHJvcHMpOworCXN0YXRzLT5yeF9vdmVyZmxvd3MgICAgICAgICArPSByZWFkbCgmbWFjc3RhdC0+cnhfb3ZlcnNpemVfcGFja2V0cyk7CisJc3RhdHMtPnJ4X2NvZGVfdmlvbGF0aW9ucyAgICs9IHJlYWRsKCZtYWNzdGF0LT5yeF9mY3NfZXJycyk7CisJc3RhdHMtPnJ4X2xlbmd0aF9lcnJzICAgICAgICs9IHJlYWRsKCZtYWNzdGF0LT5yeF9mcmFtZV9sZW5fZXJycyk7CisJc3RhdHMtPnJ4X290aGVyX2VycnMgICAgICAgICs9IHJlYWRsKCZtYWNzdGF0LT5yeF9mcmFnbWVudF9wYWNrZXRzKTsKK30KKworLyoqCisgKiBldDEzMTBfaGFuZGxlX21hY3N0YXRfaW50ZXJydXB0CisgKiBAYWRhcHRlcjogcG9pbnRlciB0byB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiBPbmUgb2YgdGhlIE1BQ1NUQVQgY291bnRlcnMgaGFzIHdyYXBwZWQuICBVcGRhdGUgdGhlIGxvY2FsIGNvcHkgb2YKKyAqIHRoZSBzdGF0aXN0aWNzIGhlbGQgaW4gdGhlIGFkYXB0ZXIgc3RydWN0dXJlLCBjaGVja2luZyB0aGUgIndyYXAiCisgKiBiaXQgZm9yIGVhY2ggY291bnRlci4KKyAqLwordm9pZCBldDEzMTBfaGFuZGxlX21hY3N0YXRfaW50ZXJydXB0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgY2FycnlfcmVnMTsKKwl1MzIgY2FycnlfcmVnMjsKKworCS8qIFJlYWQgdGhlIGludGVycnVwdCBiaXRzIGZyb20gdGhlIHJlZ2lzdGVyKHMpLiAgVGhlc2UgYXJlIENsZWFyIE9uCisJICogV3JpdGUuCisJICovCisJY2FycnlfcmVnMSA9IHJlYWRsKCZhZGFwdGVyLT5yZWdzLT5tYWNzdGF0LmNhcnJ5X3JlZzEpOworCWNhcnJ5X3JlZzIgPSByZWFkbCgmYWRhcHRlci0+cmVncy0+bWFjc3RhdC5jYXJyeV9yZWcyKTsKKworCXdyaXRlbChjYXJyeV9yZWcxLCAmYWRhcHRlci0+cmVncy0+bWFjc3RhdC5jYXJyeV9yZWcxKTsKKwl3cml0ZWwoY2FycnlfcmVnMiwgJmFkYXB0ZXItPnJlZ3MtPm1hY3N0YXQuY2FycnlfcmVnMik7CisKKwkvKiBXZSBuZWVkIHRvIGRvIHVwZGF0ZSB0aGUgaG9zdCBjb3B5IG9mIGFsbCB0aGUgTUFDX1NUQVQgY291bnRlcnMuCisJICogRm9yIGVhY2ggY291bnRlciwgY2hlY2sgaXQncyBvdmVyZmxvdyBiaXQuICBJZiB0aGUgb3ZlcmZsb3cgYml0IGlzCisJICogc2V0LCB0aGVuIGluY3JlbWVudCB0aGUgaG9zdCB2ZXJzaW9uIG9mIHRoZSBjb3VudCBieSBvbmUgY29tcGxldGUKKwkgKiByZXZvbHV0aW9uIG9mIHRoZSBjb3VudGVyLiAgVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSBjb3VudGVyCisJICogYmxvY2sgaW5kaWNhdGVzIHRoYXQgb25lIG9mIHRoZSBjb3VudGVycyBoYXMgd3JhcHBlZC4KKwkgKi8KKwlpZiAoY2FycnlfcmVnMSAmICgxIDw8IDE0KSkKKwkJYWRhcHRlci0+c3RhdHMucnhfY29kZV92aW9sYXRpb25zCSs9IENPVU5URVJfV1JBUF8xNl9CSVQ7CisJaWYgKGNhcnJ5X3JlZzEgJiAoMSA8PCA4KSkKKwkJYWRhcHRlci0+c3RhdHMucnhfYWxpZ25fZXJycwkrPSBDT1VOVEVSX1dSQVBfMTJfQklUOworCWlmIChjYXJyeV9yZWcxICYgKDEgPDwgNykpCisJCWFkYXB0ZXItPnN0YXRzLnJ4X2xlbmd0aF9lcnJzCSs9IENPVU5URVJfV1JBUF8xNl9CSVQ7CisJaWYgKGNhcnJ5X3JlZzEgJiAoMSA8PCAyKSkKKwkJYWRhcHRlci0+c3RhdHMucnhfb3RoZXJfZXJycwkrPSBDT1VOVEVSX1dSQVBfMTZfQklUOworCWlmIChjYXJyeV9yZWcxICYgKDEgPDwgNikpCisJCWFkYXB0ZXItPnN0YXRzLnJ4X2NyY19lcnJzCSs9IENPVU5URVJfV1JBUF8xNl9CSVQ7CisJaWYgKGNhcnJ5X3JlZzEgJiAoMSA8PCAzKSkKKwkJYWRhcHRlci0+c3RhdHMucnhfb3ZlcmZsb3dzCSs9IENPVU5URVJfV1JBUF8xNl9CSVQ7CisJaWYgKGNhcnJ5X3JlZzEgJiAoMSA8PCAwKSkKKwkJYWRhcHRlci0+c3RhdHMucmN2ZF9wa3RzX2Ryb3BwZWQJKz0gQ09VTlRFUl9XUkFQXzE2X0JJVDsKKwlpZiAoY2FycnlfcmVnMiAmICgxIDw8IDE2KSkKKwkJYWRhcHRlci0+c3RhdHMudHhfbWF4X3BrdF9lcnJzCSs9IENPVU5URVJfV1JBUF8xMl9CSVQ7CisJaWYgKGNhcnJ5X3JlZzIgJiAoMSA8PCAxNSkpCisJCWFkYXB0ZXItPnN0YXRzLnR4X3VuZGVyZmxvd3MJKz0gQ09VTlRFUl9XUkFQXzEyX0JJVDsKKwlpZiAoY2FycnlfcmVnMiAmICgxIDw8IDYpKQorCQlhZGFwdGVyLT5zdGF0cy50eF9maXJzdF9jb2xsaXNpb25zICs9IENPVU5URVJfV1JBUF8xMl9CSVQ7CisJaWYgKGNhcnJ5X3JlZzIgJiAoMSA8PCA4KSkKKwkJYWRhcHRlci0+c3RhdHMudHhfZGVmZXJyZWQJKz0gQ09VTlRFUl9XUkFQXzEyX0JJVDsKKwlpZiAoY2FycnlfcmVnMiAmICgxIDw8IDUpKQorCQlhZGFwdGVyLT5zdGF0cy50eF9leGNlc3NpdmVfY29sbGlzaW9ucyArPSBDT1VOVEVSX1dSQVBfMTJfQklUOworCWlmIChjYXJyeV9yZWcyICYgKDEgPDwgNCkpCisJCWFkYXB0ZXItPnN0YXRzLnR4X2xhdGVfY29sbGlzaW9ucwkrPSBDT1VOVEVSX1dSQVBfMTJfQklUOworCWlmIChjYXJyeV9yZWcyICYgKDEgPDwgMikpCisJCWFkYXB0ZXItPnN0YXRzLnR4X2NvbGxpc2lvbnMJKz0gQ09VTlRFUl9XUkFQXzEyX0JJVDsKK30KKworLyogUEhZIGZ1bmN0aW9ucyAqLworCitpbnQgZXQxMzF4X21kaW9fcmVhZChzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgcGh5X2FkZHIsIGludCByZWcpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGJ1cy0+cHJpdjsKKwlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXUxNiB2YWx1ZTsKKwlpbnQgcmV0OworCisJcmV0ID0gZXQxMzF4X3BoeV9taWlfcmVhZChhZGFwdGVyLCBwaHlfYWRkciwgcmVnLCAmdmFsdWUpOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJZWxzZQorCQlyZXR1cm4gdmFsdWU7Cit9CisKK2ludCBldDEzMXhfbWRpb193cml0ZShzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgcGh5X2FkZHIsIGludCByZWcsIHUxNiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYnVzLT5wcml2OworCXN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlyZXR1cm4gZXQxMzF4X21paV93cml0ZShhZGFwdGVyLCByZWcsIHZhbHVlKTsKK30KKworaW50IGV0MTMxeF9tZGlvX3Jlc2V0KHN0cnVjdCBtaWlfYnVzICpidXMpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGJ1cy0+cHJpdjsKKwlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJZXQxMzF4X21paV93cml0ZShhZGFwdGVyLCBNSUlfQk1DUiwgQk1DUl9SRVNFVCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglldDEzMTBfcGh5X3Bvd2VyX2Rvd24JLQlQSFkgcG93ZXIgY29udHJvbAorICoJQGFkYXB0ZXI6IGRldmljZSB0byBjb250cm9sCisgKglAZG93bjogdHJ1ZSBmb3Igb2ZmL2ZhbHNlIGZvciBiYWNrIG9uCisgKgorICoJb25lIGh1bmRyZWQsIHRlbiwgb25lIHRob3VzYW5kIG1lZ3MKKyAqCUhvdyB3b3VsZCB5b3UgbGlrZSB0byBoYXZlIHlvdXIgTEFOIGFjY2Vzc2VkCisgKglDYW4ndCB5b3Ugc2VlIHRoYXQgdGhpcyBjb2RlIHByb2Nlc3NlZAorICoJUGh5IHBvd2VyLCBwaHkgcG93ZXIuLgorICovCit2b2lkIGV0MTMxMF9waHlfcG93ZXJfZG93bihzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIsIGJvb2wgZG93bikKK3sKKwl1MTYgZGF0YTsKKworCWV0MTMxeF9taWlfcmVhZChhZGFwdGVyLCBNSUlfQk1DUiwgJmRhdGEpOworCWRhdGEgJj0gfkJNQ1JfUERPV047CisJaWYgKGRvd24pCisJCWRhdGEgfD0gQk1DUl9QRE9XTjsKKwlldDEzMXhfbWlpX3dyaXRlKGFkYXB0ZXIsIE1JSV9CTUNSLCBkYXRhKTsKK30KKworLyoqCisgKiBldDEzMXhfeGN2cl9pbml0IC0gSW5pdCB0aGUgcGh5IGlmIHdlIGFyZSBzZXR0aW5nIGl0IGludG8gZm9yY2UgbW9kZQorICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKi8KK3ZvaWQgZXQxMzF4X3hjdnJfaW5pdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTE2IGltcjsKKwl1MTYgaXNyOworCXUxNiBsY3IyOworCisJZXQxMzF4X21paV9yZWFkKGFkYXB0ZXIsIFBIWV9JTlRFUlJVUFRfU1RBVFVTLCAmaXNyKTsKKwlldDEzMXhfbWlpX3JlYWQoYWRhcHRlciwgUEhZX0lOVEVSUlVQVF9NQVNLLCAmaW1yKTsKKworCS8qIFNldCB0aGUgbGluayBzdGF0dXMgaW50ZXJydXB0IG9ubHkuICBCYWQgYmVoYXZpb3Igd2hlbiBsaW5rIHN0YXR1cworCSAqIGFuZCBhdXRvIG5lZyBhcmUgc2V0LCB3ZSBydW4gaW50byBhIG5lc3RlZCBpbnRlcnJ1cHQgcHJvYmxlbQorCSAqLworCWltciB8PSAoRVRfUEhZX0lOVF9NQVNLX0FVVE9ORUdTVEFUICYKKwkJRVRfUEhZX0lOVF9NQVNLX0xJTktTVEFUICYKKwkJRVRfUEhZX0lOVF9NQVNLX0VOQUJMRSk7CisKKwlldDEzMXhfbWlpX3dyaXRlKGFkYXB0ZXIsIFBIWV9JTlRFUlJVUFRfTUFTSywgaW1yKTsKKworCS8qIFNldCB0aGUgTEVEIGJlaGF2aW9yIHN1Y2ggdGhhdCBMRUQgMSBpbmRpY2F0ZXMgc3BlZWQgKG9mZiA9CisJICogMTBNYml0cywgYmxpbmsgPSAxMDBNYml0cywgb24gPSAxMDAwTWJpdHMpIGFuZCBMRUQgMiBpbmRpY2F0ZXMKKwkgKiBsaW5rIGFuZCBhY3Rpdml0eSAob24gZm9yIGxpbmssIGJsaW5rIG9mZiBmb3IgYWN0aXZpdHkpLgorCSAqCisJICogTk9URTogU29tZSBjdXN0b21pemF0aW9ucyBoYXZlIGJlZW4gYWRkZWQgaGVyZSBmb3Igc3BlY2lmaWMKKwkgKiB2ZW5kb3JzOyBUaGUgTEVEIGJlaGF2aW9yIGlzIG5vdyBkZXRlcm1pbmVkIGJ5IHZlbmRvciBkYXRhIGluIHRoZQorCSAqIEVFUFJPTS4gSG93ZXZlciwgdGhlIGFib3ZlIGRlc2NyaXB0aW9uIGlzIHRoZSBkZWZhdWx0LgorCSAqLworCWlmICgoYWRhcHRlci0+ZWVwcm9tX2RhdGFbMV0gJiAweDQpID09IDApIHsKKwkJZXQxMzF4X21paV9yZWFkKGFkYXB0ZXIsIFBIWV9MRURfMiwgJmxjcjIpOworCisJCWxjcjIgJj0gKEVUX0xFRDJfTEVEXzEwMFRYICYgRVRfTEVEMl9MRURfMTAwMFQpOworCQlsY3IyIHw9IChMRURfVkFMX0xJTktPTl9BQ1RJVkUgPDwgTEVEX0xJTktfU0hJRlQpOworCisJCWlmICgoYWRhcHRlci0+ZWVwcm9tX2RhdGFbMV0gJiAweDgpID09IDApCisJCQlsY3IyIHw9IChMRURfVkFMXzEwMDBCVF8xMDBCVFggPDwgTEVEX1RYUlhfU0hJRlQpOworCQllbHNlCisJCQlsY3IyIHw9IChMRURfVkFMX0xJTktPTiA8PCBMRURfVFhSWF9TSElGVCk7CisKKwkJZXQxMzF4X21paV93cml0ZShhZGFwdGVyLCBQSFlfTEVEXzIsIGxjcjIpOworCX0KK30KKworLyoqCisgKiBldDEzMXhfY29uZmlndXJlX2dsb2JhbF9yZWdzCS0JY29uZmlndXJlIEpBR0NvcmUgZ2xvYmFsIHJlZ3MKKyAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqIFVzZWQgdG8gY29uZmlndXJlIHRoZSBnbG9iYWwgcmVnaXN0ZXJzIG9uIHRoZSBKQUdDb3JlCisgKi8KK3ZvaWQgZXQxMzF4X2NvbmZpZ3VyZV9nbG9iYWxfcmVncyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IGdsb2JhbF9yZWdzIF9faW9tZW0gKnJlZ3MgPSAmYWRhcHRlci0+cmVncy0+Z2xvYmFsOworCisJd3JpdGVsKDAsICZyZWdzLT5yeHFfc3RhcnRfYWRkcik7CisJd3JpdGVsKElOVEVSTkFMX01FTV9TSVpFIC0gMSwgJnJlZ3MtPnR4cV9lbmRfYWRkcik7CisKKwlpZiAoYWRhcHRlci0+cmVnaXN0cnlfanVtYm9fcGFja2V0IDwgMjA0OCkgeworCQkvKiBUeCAvIFJ4RE1BIGFuZCBUeC9SeCBNQUMgaW50ZXJmYWNlcyBoYXZlIGEgMWsgd29yZAorCQkgKiBibG9jayBvZiBSQU0gdGhhdCB0aGUgZHJpdmVyIGNhbiBzcGxpdCBiZXR3ZWVuIFR4CisJCSAqIGFuZCBSeCBhcyBpdCBkZXNpcmVzLiAgT3VyIGRlZmF1bHQgaXMgdG8gc3BsaXQgaXQKKwkJICogNTAvNTA6CisJCSAqLworCQl3cml0ZWwoUEFSTV9SWF9NRU1fRU5EX0RFRiwgJnJlZ3MtPnJ4cV9lbmRfYWRkcik7CisJCXdyaXRlbChQQVJNX1JYX01FTV9FTkRfREVGICsgMSwgJnJlZ3MtPnR4cV9zdGFydF9hZGRyKTsKKwl9IGVsc2UgaWYgKGFkYXB0ZXItPnJlZ2lzdHJ5X2p1bWJvX3BhY2tldCA8IDgxOTIpIHsKKwkJLyogRm9yIGp1bWJvIHBhY2tldHMgPiAyayBidXQgPCA4aywgc3BsaXQgNTAtNTAuICovCisJCXdyaXRlbChJTlRFUk5BTF9NRU1fUlhfT0ZGU0VULCAmcmVncy0+cnhxX2VuZF9hZGRyKTsKKwkJd3JpdGVsKElOVEVSTkFMX01FTV9SWF9PRkZTRVQgKyAxLCAmcmVncy0+dHhxX3N0YXJ0X2FkZHIpOworCX0gZWxzZSB7CisJCS8qIDkyMTYgaXMgdGhlIG9ubHkgcGFja2V0IHNpemUgZ3JlYXRlciB0aGFuIDhrIHRoYXQKKwkJICogaXMgYXZhaWxhYmxlLiBUaGUgVHggYnVmZmVyIGhhcyB0byBiZSBiaWcgZW5vdWdoCisJCSAqIGZvciBvbmUgd2hvbGUgcGFja2V0IG9uIHRoZSBUeCBzaWRlLiBXZSdsbCBtYWtlCisJCSAqIHRoZSBUeCA5NDA4LCBhbmQgZ2l2ZSB0aGUgcmVzdCB0byBSeAorCQkgKi8KKwkJd3JpdGVsKDB4MDFiMywgJnJlZ3MtPnJ4cV9lbmRfYWRkcik7CisJCXdyaXRlbCgweDAxYjQsICZyZWdzLT50eHFfc3RhcnRfYWRkcik7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgbG9vcGJhY2sgcmVnaXN0ZXIuIERpc2FibGUgYWxsIGxvb3BiYWNrcy4gKi8KKwl3cml0ZWwoMCwgJnJlZ3MtPmxvb3BiYWNrKTsKKworCS8qIE1TSSBSZWdpc3RlciAqLworCXdyaXRlbCgwLCAmcmVncy0+bXNpX2NvbmZpZyk7CisKKwkvKiBCeSBkZWZhdWx0LCBkaXNhYmxlIHRoZSB3YXRjaGRvZyB0aW1lci4gIEl0IHdpbGwgYmUgZW5hYmxlZCB3aGVuCisJICogYSBwYWNrZXQgaXMgcXVldWVkLgorCSAqLworCXdyaXRlbCgwLCAmcmVncy0+d2F0Y2hkb2dfdGltZXIpOworfQorCisvKiBQTSBmdW5jdGlvbnMgKi8KKworLyoqCisgKiBldDEzMXhfY29uZmlnX3J4X2RtYV9yZWdzIC0gU3RhcnQgb2YgUnhfRE1BIGluaXQgc2VxdWVuY2UKKyAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBhZGFwdGVyIHN0cnVjdHVyZQorICovCit2b2lkIGV0MTMxeF9jb25maWdfcnhfZG1hX3JlZ3Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCByeGRtYV9yZWdzIF9faW9tZW0gKnJ4X2RtYSA9ICZhZGFwdGVyLT5yZWdzLT5yeGRtYTsKKwlzdHJ1Y3QgcnhfcmluZyAqcnhfbG9jYWwgPSAmYWRhcHRlci0+cnhfcmluZzsKKwlzdHJ1Y3QgZmJyX2Rlc2MgKmZicl9lbnRyeTsKKwl1MzIgZW50cnk7CisJdTMyIHBzcl9udW1fZGVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBIYWx0IFJYRE1BIHRvIHBlcmZvcm0gdGhlIHJlY29uZmlndXJlLiAgKi8KKwlldDEzMXhfcnhfZG1hX2Rpc2FibGUoYWRhcHRlcik7CisKKwkvKiBMb2FkIHRoZSBjb21wbGV0aW9uIHdyaXRlYmFjayBwaHlzaWNhbCBhZGRyZXNzCisJICoKKwkgKiBOT1RFIDogZG1hX2FsbG9jX2NvaGVyZW50KCksIHVzZWQgYWJvdmUgdG8gYWxsb2MgRE1BIHJlZ2lvbnMsCisJICogQUxXQVlTIHJldHVybnMgU0FDICgzMi1iaXQpIGFkZHJlc3Nlcy4gSWYgREFDICg2NC1iaXQpIGFkZHJlc3NlcworCSAqIGFyZSBldmVyIHJldHVybmVkLCBtYWtlIHN1cmUgdGhlIGhpZ2ggcGFydCBpcyByZXRyaWV2ZWQgaGVyZQorCSAqIGJlZm9yZSBzdG9yaW5nIHRoZSBhZGp1c3RlZCBhZGRyZXNzLgorCSAqLworCXdyaXRlbCgodTMyKSAoKHU2NClyeF9sb2NhbC0+cnhfc3RhdHVzX2J1cyA+PiAzMiksCisJICAgICAgICZyeF9kbWEtPmRtYV93Yl9iYXNlX2hpKTsKKwl3cml0ZWwoKHUzMikgcnhfbG9jYWwtPnJ4X3N0YXR1c19idXMsICZyeF9kbWEtPmRtYV93Yl9iYXNlX2xvKTsKKworCW1lbXNldChyeF9sb2NhbC0+cnhfc3RhdHVzX2Jsb2NrLCAwLCBzaXplb2Yoc3RydWN0IHJ4X3N0YXR1c19ibG9jaykpOworCisJLyogU2V0IHRoZSBhZGRyZXNzIGFuZCBwYXJhbWV0ZXJzIG9mIHRoZSBwYWNrZXQgc3RhdHVzIHJpbmcgaW50byB0aGUKKwkgKiAxMzEwJ3MgcmVnaXN0ZXJzCisJICovCisJd3JpdGVsKCh1MzIpICgodTY0KXJ4X2xvY2FsLT5wc19yaW5nX3BoeXNhZGRyID4+IDMyKSwKKwkgICAgICAgJnJ4X2RtYS0+cHNyX2Jhc2VfaGkpOworCXdyaXRlbCgodTMyKSByeF9sb2NhbC0+cHNfcmluZ19waHlzYWRkciwgJnJ4X2RtYS0+cHNyX2Jhc2VfbG8pOworCXdyaXRlbChyeF9sb2NhbC0+cHNyX251bV9lbnRyaWVzIC0gMSwgJnJ4X2RtYS0+cHNyX251bV9kZXMpOworCXdyaXRlbCgwLCAmcnhfZG1hLT5wc3JfZnVsbF9vZmZzZXQpOworCisJcHNyX251bV9kZXMgPSByZWFkbCgmcnhfZG1hLT5wc3JfbnVtX2RlcykgJiAweEZGRjsKKwl3cml0ZWwoKHBzcl9udW1fZGVzICogTE9fTUFSS19QRVJDRU5UX0ZPUl9QU1IpIC8gMTAwLAorCSAgICAgICAmcnhfZG1hLT5wc3JfbWluX2Rlcyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+cmN2X2xvY2ssIGZsYWdzKTsKKworCS8qIFRoZXNlIGxvY2FsIHZhcmlhYmxlcyB0cmFjayB0aGUgUFNSIGluIHRoZSBhZGFwdGVyIHN0cnVjdHVyZSAqLworCXJ4X2xvY2FsLT5sb2NhbF9wc3JfZnVsbCA9IDA7CisKKwkvKiBOb3cncyB0aGUgYmVzdCB0aW1lIHRvIGluaXRpYWxpemUgRkJSMSBjb250ZW50cyAqLworCWZicl9lbnRyeSA9IChzdHJ1Y3QgZmJyX2Rlc2MgKikgcnhfbG9jYWwtPmZiclswXS0+cmluZ192aXJ0YWRkcjsKKwlmb3IgKGVudHJ5ID0gMDsgZW50cnkgPCByeF9sb2NhbC0+ZmJyWzBdLT5udW1fZW50cmllczsgZW50cnkrKykgeworCQlmYnJfZW50cnktPmFkZHJfaGkgPSByeF9sb2NhbC0+ZmJyWzBdLT5idXNfaGlnaFtlbnRyeV07CisJCWZicl9lbnRyeS0+YWRkcl9sbyA9IHJ4X2xvY2FsLT5mYnJbMF0tPmJ1c19sb3dbZW50cnldOworCQlmYnJfZW50cnktPndvcmQyID0gZW50cnk7CisJCWZicl9lbnRyeSsrOworCX0KKworCS8qIFNldCB0aGUgYWRkcmVzcyBhbmQgcGFyYW1ldGVycyBvZiBGcmVlIGJ1ZmZlciByaW5nIDEgKGFuZCAwIGlmCisJICogcmVxdWlyZWQpIGludG8gdGhlIDEzMTAncyByZWdpc3RlcnMKKwkgKi8KKwl3cml0ZWwoKHUzMikgKHJ4X2xvY2FsLT5mYnJbMF0tPnJlYWxfcGh5c2FkZHIgPj4gMzIpLAorCSAgICAgICAmcnhfZG1hLT5mYnIxX2Jhc2VfaGkpOworCXdyaXRlbCgodTMyKSByeF9sb2NhbC0+ZmJyWzBdLT5yZWFsX3BoeXNhZGRyLCAmcnhfZG1hLT5mYnIxX2Jhc2VfbG8pOworCXdyaXRlbChyeF9sb2NhbC0+ZmJyWzBdLT5udW1fZW50cmllcyAtIDEsICZyeF9kbWEtPmZicjFfbnVtX2Rlcyk7CisJd3JpdGVsKEVUX0RNQTEwX1dSQVAsICZyeF9kbWEtPmZicjFfZnVsbF9vZmZzZXQpOworCisJLyogVGhpcyB2YXJpYWJsZSB0cmFja3MgdGhlIGZyZWUgYnVmZmVyIHJpbmcgMSBmdWxsIHBvc2l0aW9uLCBzbyBpdAorCSAqIGhhcyB0byBtYXRjaCB0aGUgYWJvdmUuCisJICovCisJcnhfbG9jYWwtPmZiclswXS0+bG9jYWxfZnVsbCA9IEVUX0RNQTEwX1dSQVA7CisJd3JpdGVsKAorCSAgICgocnhfbG9jYWwtPmZiclswXS0+bnVtX2VudHJpZXMgKiBMT19NQVJLX1BFUkNFTlRfRk9SX1JYKSAvIDEwMCkgLSAxLAorCSAgICZyeF9kbWEtPmZicjFfbWluX2Rlcyk7CisKKyNpZmRlZiBVU0VfRkJSMAorCS8qIE5vdydzIHRoZSBiZXN0IHRpbWUgdG8gaW5pdGlhbGl6ZSBGQlIwIGNvbnRlbnRzICovCisJZmJyX2VudHJ5ID0gKHN0cnVjdCBmYnJfZGVzYyAqKSByeF9sb2NhbC0+ZmJyWzFdLT5yaW5nX3ZpcnRhZGRyOworCWZvciAoZW50cnkgPSAwOyBlbnRyeSA8IHJ4X2xvY2FsLT5mYnJbMV0tPm51bV9lbnRyaWVzOyBlbnRyeSsrKSB7CisJCWZicl9lbnRyeS0+YWRkcl9oaSA9IHJ4X2xvY2FsLT5mYnJbMV0tPmJ1c19oaWdoW2VudHJ5XTsKKwkJZmJyX2VudHJ5LT5hZGRyX2xvID0gcnhfbG9jYWwtPmZiclsxXS0+YnVzX2xvd1tlbnRyeV07CisJCWZicl9lbnRyeS0+d29yZDIgPSBlbnRyeTsKKwkJZmJyX2VudHJ5Kys7CisJfQorCisJd3JpdGVsKCh1MzIpIChyeF9sb2NhbC0+ZmJyWzFdLT5yZWFsX3BoeXNhZGRyID4+IDMyKSwKKwkgICAgICAgJnJ4X2RtYS0+ZmJyMF9iYXNlX2hpKTsKKwl3cml0ZWwoKHUzMikgcnhfbG9jYWwtPmZiclsxXS0+cmVhbF9waHlzYWRkciwgJnJ4X2RtYS0+ZmJyMF9iYXNlX2xvKTsKKwl3cml0ZWwocnhfbG9jYWwtPmZiclsxXS0+bnVtX2VudHJpZXMgLSAxLCAmcnhfZG1hLT5mYnIwX251bV9kZXMpOworCXdyaXRlbChFVF9ETUExMF9XUkFQLCAmcnhfZG1hLT5mYnIwX2Z1bGxfb2Zmc2V0KTsKKworCS8qIFRoaXMgdmFyaWFibGUgdHJhY2tzIHRoZSBmcmVlIGJ1ZmZlciByaW5nIDAgZnVsbCBwb3NpdGlvbiwgc28gaXQKKwkgKiBoYXMgdG8gbWF0Y2ggdGhlIGFib3ZlLgorCSAqLworCXJ4X2xvY2FsLT5mYnJbMV0tPmxvY2FsX2Z1bGwgPSBFVF9ETUExMF9XUkFQOworCXdyaXRlbCgKKwkgICAoKHJ4X2xvY2FsLT5mYnJbMV0tPm51bV9lbnRyaWVzICogTE9fTUFSS19QRVJDRU5UX0ZPUl9SWCkgLyAxMDApIC0gMSwKKwkgICAmcnhfZG1hLT5mYnIwX21pbl9kZXMpOworI2VuZGlmCisKKwkvKiBQcm9ncmFtIHRoZSBudW1iZXIgb2YgcGFja2V0cyB3ZSB3aWxsIHJlY2VpdmUgYmVmb3JlIGdlbmVyYXRpbmcgYW4KKwkgKiBpbnRlcnJ1cHQuCisJICogRm9yIHZlcnNpb24gQiBzaWxpY29uLCB0aGlzIHZhbHVlIGdldHMgdXBkYXRlZCBvbmNlIGF1dG9uZWcgaXMKKwkgKmNvbXBsZXRlLgorCSAqLworCXdyaXRlbChQQVJNX1JYX05VTV9CVUZTX0RFRiwgJnJ4X2RtYS0+bnVtX3BrdF9kb25lKTsKKworCS8qIFRoZSAidGltZV9kb25lIiBpcyBub3Qgd29ya2luZyBjb3JyZWN0bHkgdG8gY29hbGVzY2UgaW50ZXJydXB0cworCSAqIGFmdGVyIGEgZ2l2ZW4gdGltZSBwZXJpb2QsIGJ1dCByYXRoZXIgaXMgZ2l2aW5nIHVzIGFuIGludGVycnVwdAorCSAqIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSBoYXZlIHJlY2VpdmVkIHBhY2tldHMuCisJICogVGhpcyB2YWx1ZSBnZXRzIHVwZGF0ZWQgb25jZSBhdXRvbmVnIGlzIGNvbXBsZXRlLgorCSAqLworCXdyaXRlbChQQVJNX1JYX1RJTUVfSU5UX0RFRiwgJnJ4X2RtYS0+bWF4X3BrdF90aW1lKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnJjdl9sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogZXQxMzF4X2NvbmZpZ190eF9kbWFfcmVncyAtIFNldCB1cCB0aGUgdHggZG1hIHNlY3Rpb24gb2YgdGhlIEpBR0NvcmUuCisgKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqIENvbmZpZ3VyZSB0aGUgdHJhbnNtaXQgZW5naW5lIHdpdGggdGhlIHJpbmcgYnVmZmVycyB3ZSBoYXZlIGNyZWF0ZWQKKyAqIGFuZCBwcmVwYXJlIGl0IGZvciB1c2UuCisgKi8KK3ZvaWQgZXQxMzF4X2NvbmZpZ190eF9kbWFfcmVncyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IHR4ZG1hX3JlZ3MgX19pb21lbSAqdHhkbWEgPSAmYWRhcHRlci0+cmVncy0+dHhkbWE7CisKKwkvKiBMb2FkIHRoZSBoYXJkd2FyZSB3aXRoIHRoZSBzdGFydCBvZiB0aGUgdHJhbnNtaXQgZGVzY3JpcHRvciByaW5nLiAqLworCXdyaXRlbCgodTMyKSAoKHU2NClhZGFwdGVyLT50eF9yaW5nLnR4X2Rlc2NfcmluZ19wYSA+PiAzMiksCisJICAgICAgICZ0eGRtYS0+cHJfYmFzZV9oaSk7CisJd3JpdGVsKCh1MzIpIGFkYXB0ZXItPnR4X3JpbmcudHhfZGVzY19yaW5nX3BhLAorCSAgICAgICAmdHhkbWEtPnByX2Jhc2VfbG8pOworCisJLyogSW5pdGlhbGlzZSB0aGUgdHJhbnNtaXQgRE1BIGVuZ2luZSAqLworCXdyaXRlbChOVU1fREVTQ19QRVJfUklOR19UWCAtIDEsICZ0eGRtYS0+cHJfbnVtX2Rlcyk7CisKKwkvKiBMb2FkIHRoZSBjb21wbGV0aW9uIHdyaXRlYmFjayBwaHlzaWNhbCBhZGRyZXNzICovCisJd3JpdGVsKCh1MzIpKCh1NjQpYWRhcHRlci0+dHhfcmluZy50eF9zdGF0dXNfcGEgPj4gMzIpLAorCQkJCQkJJnR4ZG1hLT5kbWFfd2JfYmFzZV9oaSk7CisJd3JpdGVsKCh1MzIpYWRhcHRlci0+dHhfcmluZy50eF9zdGF0dXNfcGEsICZ0eGRtYS0+ZG1hX3diX2Jhc2VfbG8pOworCisJKmFkYXB0ZXItPnR4X3JpbmcudHhfc3RhdHVzID0gMDsKKworCXdyaXRlbCgwLCAmdHhkbWEtPnNlcnZpY2VfcmVxdWVzdCk7CisJYWRhcHRlci0+dHhfcmluZy5zZW5kX2lkeCA9IDA7Cit9CisKKy8qKgorICogZXQxMzF4X2FkYXB0ZXJfc2V0dXAgLSBTZXQgdGhlIGFkYXB0ZXIgdXAgYXMgcGVyIGNhc3NpbmkrIGRvY3VtZW50YXRpb24KKyAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUgKGFzIGRlZmluZWQgaW4gZXJybm8uaCkKKyAqLwordm9pZCBldDEzMXhfYWRhcHRlcl9zZXR1cChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJLyogQ29uZmlndXJlIHRoZSBKQUdDb3JlICovCisJZXQxMzF4X2NvbmZpZ3VyZV9nbG9iYWxfcmVncyhhZGFwdGVyKTsKKworCWV0MTMxMF9jb25maWdfbWFjX3JlZ3MxKGFkYXB0ZXIpOworCisJLyogQ29uZmlndXJlIHRoZSBNTUMgcmVnaXN0ZXJzICovCisJLyogQWxsIHdlIG5lZWQgdG8gZG8gaXMgaW5pdGlhbGl6ZSB0aGUgTWVtb3J5IENvbnRyb2wgUmVnaXN0ZXIgKi8KKwl3cml0ZWwoRVRfTU1DX0VOQUJMRSwgJmFkYXB0ZXItPnJlZ3MtPm1tYy5tbWNfY3RybCk7CisKKwlldDEzMTBfY29uZmlnX3J4bWFjX3JlZ3MoYWRhcHRlcik7CisJZXQxMzEwX2NvbmZpZ190eG1hY19yZWdzKGFkYXB0ZXIpOworCisJZXQxMzF4X2NvbmZpZ19yeF9kbWFfcmVncyhhZGFwdGVyKTsKKwlldDEzMXhfY29uZmlnX3R4X2RtYV9yZWdzKGFkYXB0ZXIpOworCisJZXQxMzEwX2NvbmZpZ19tYWNzdGF0X3JlZ3MoYWRhcHRlcik7CisKKwlldDEzMTBfcGh5X3Bvd2VyX2Rvd24oYWRhcHRlciwgMCk7CisJZXQxMzF4X3hjdnJfaW5pdChhZGFwdGVyKTsKK30KKworLyoqCisgKiBldDEzMXhfc29mdF9yZXNldCAtIElzc3VlIGEgc29mdCByZXNldCB0byB0aGUgaGFyZHdhcmUsIGNvbXBsZXRlIGZvciBFVDEzMTAKKyAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKi8KK3ZvaWQgZXQxMzF4X3NvZnRfcmVzZXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQoreworCS8qIERpc2FibGUgTUFDIENvcmUgKi8KKwl3cml0ZWwoMHhjMDBmMDAwMCwgJmFkYXB0ZXItPnJlZ3MtPm1hYy5jZmcxKTsKKworCS8qIFNldCBldmVyeXRoaW5nIHRvIGEgcmVzZXQgdmFsdWUgKi8KKwl3cml0ZWwoMHg3RiwgJmFkYXB0ZXItPnJlZ3MtPmdsb2JhbC5zd19yZXNldCk7CisJd3JpdGVsKDB4MDAwZjAwMDAsICZhZGFwdGVyLT5yZWdzLT5tYWMuY2ZnMSk7CisJd3JpdGVsKDB4MDAwMDAwMDAsICZhZGFwdGVyLT5yZWdzLT5tYWMuY2ZnMSk7Cit9CisKKy8qKgorICoJZXQxMzF4X2VuYWJsZV9pbnRlcnJ1cHRzCS0JZW5hYmxlIGludGVycnVwdAorICoJQGFkYXB0ZXI6IGV0MTMxeCBkZXZpY2UKKyAqCisgKglFbmFibGUgdGhlIGFwcHJvcHJpYXRlIGludGVycnVwdHMgb24gdGhlIEVUMTMxeCBhY2NvcmRpbmcgdG8gb3VyCisgKgljb25maWd1cmF0aW9uCisgKi8KK3ZvaWQgZXQxMzF4X2VuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgbWFzazsKKworCS8qIEVuYWJsZSBhbGwgZ2xvYmFsIGludGVycnVwdHMgKi8KKwlpZiAoYWRhcHRlci0+Zmxvd2NvbnRyb2wgPT0gRkxPV19UWE9OTFkgfHwKKwkJCSAgICBhZGFwdGVyLT5mbG93Y29udHJvbCA9PSBGTE9XX0JPVEgpCisJCW1hc2sgPSBJTlRfTUFTS19FTkFCTEU7CisJZWxzZQorCQltYXNrID0gSU5UX01BU0tfRU5BQkxFX05PX0ZMT1c7CisKKwl3cml0ZWwobWFzaywgJmFkYXB0ZXItPnJlZ3MtPmdsb2JhbC5pbnRfbWFzayk7Cit9CisKKy8qKgorICoJZXQxMzF4X2Rpc2FibGVfaW50ZXJydXB0cwktCWludGVycnVwdCBkaXNhYmxlCisgKglAYWRhcHRlcjogZXQxMzF4IGRldmljZQorICoKKyAqCUJsb2NrIGFsbCBpbnRlcnJ1cHRzIGZyb20gdGhlIGV0MTMxeCBkZXZpY2UgYXQgdGhlIGRldmljZSBpdHNlbGYKKyAqLwordm9pZCBldDEzMXhfZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwkvKiBEaXNhYmxlIGFsbCBnbG9iYWwgaW50ZXJydXB0cyAqLworCXdyaXRlbChJTlRfTUFTS19ESVNBQkxFLCAmYWRhcHRlci0+cmVncy0+Z2xvYmFsLmludF9tYXNrKTsKK30KKworLyoqCisgKiBldDEzMXhfdHhfZG1hX2Rpc2FibGUgLSBTdG9wIG9mIFR4X0RNQSBvbiB0aGUgRVQxMzEwCisgKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqLwordm9pZCBldDEzMXhfdHhfZG1hX2Rpc2FibGUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQoreworCS8qIFNldHVwIHRoZSB0cmFtc21pdCBkbWEgY29uZmlndXJhdGlvbiByZWdpc3RlciAqLworCXdyaXRlbChFVF9UWERNQV9DU1JfSEFMVHxFVF9UWERNQV9TTkdMX0VQS1QsCisJCQkJCSZhZGFwdGVyLT5yZWdzLT50eGRtYS5jc3IpOworfQorCisvKioKKyAqIGV0MTMxeF9lbmFibGVfdHhyeCAtIEVuYWJsZSB0eC9yeCBxdWV1ZXMKKyAqIEBuZXRkZXY6IGRldmljZSB0byBiZSBlbmFibGVkCisgKi8KK3ZvaWQgZXQxMzF4X2VuYWJsZV90eHJ4KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCS8qIEVuYWJsZSB0aGUgVHggYW5kIFJ4IERNQSBlbmdpbmVzIChpZiBub3QgYWxyZWFkeSBlbmFibGVkKSAqLworCWV0MTMxeF9yeF9kbWFfZW5hYmxlKGFkYXB0ZXIpOworCWV0MTMxeF90eF9kbWFfZW5hYmxlKGFkYXB0ZXIpOworCisJLyogRW5hYmxlIGRldmljZSBpbnRlcnJ1cHRzICovCisJaWYgKGFkYXB0ZXItPmZsYWdzICYgZk1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRSkKKwkJZXQxMzF4X2VuYWJsZV9pbnRlcnJ1cHRzKGFkYXB0ZXIpOworCisJLyogV2UncmUgcmVhZHkgdG8gbW92ZSBzb21lIGRhdGEsIHNvIHN0YXJ0IHRoZSBxdWV1ZSAqLworCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7Cit9CisKKy8qKgorICogZXQxMzF4X2Rpc2FibGVfdHhyeCAtIERpc2FibGUgdHgvcnggcXVldWVzCisgKiBAbmV0ZGV2OiBkZXZpY2UgdG8gYmUgZGlzYWJsZWQKKyAqLwordm9pZCBldDEzMXhfZGlzYWJsZV90eHJ4KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCS8qIEZpcnN0IHRoaW5nIGlzIHRvIHN0b3AgdGhlIHF1ZXVlICovCisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCisJLyogU3RvcCB0aGUgVHggYW5kIFJ4IERNQSBlbmdpbmVzICovCisJZXQxMzF4X3J4X2RtYV9kaXNhYmxlKGFkYXB0ZXIpOworCWV0MTMxeF90eF9kbWFfZGlzYWJsZShhZGFwdGVyKTsKKworCS8qIERpc2FibGUgZGV2aWNlIGludGVycnVwdHMgKi8KKwlldDEzMXhfZGlzYWJsZV9pbnRlcnJ1cHRzKGFkYXB0ZXIpOworfQorCisvKioKKyAqIGV0MTMxeF9pbml0X3NlbmQgLSBJbml0aWFsaXplIHNlbmQgZGF0YSBzdHJ1Y3R1cmVzCisgKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICovCit2b2lkIGV0MTMxeF9pbml0X3NlbmQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCB0Y2IgKnRjYjsKKwl1MzIgY3Q7CisJc3RydWN0IHR4X3JpbmcgKnR4X3Jpbmc7CisKKwkvKiBTZXR1cCBzb21lIGNvbnZlbmllbmNlIHBvaW50ZXJzICovCisJdHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nOworCXRjYiA9IGFkYXB0ZXItPnR4X3JpbmcudGNiX3Jpbmc7CisKKwl0eF9yaW5nLT50Y2JfcWhlYWQgPSB0Y2I7CisKKwltZW1zZXQodGNiLCAwLCBzaXplb2Yoc3RydWN0IHRjYikgKiBOVU1fVENCKTsKKworCS8qIEdvIHRocm91Z2ggYW5kIHNldCB1cCBlYWNoIFRDQiAqLworCWZvciAoY3QgPSAwOyBjdCsrIDwgTlVNX1RDQjsgdGNiKyspCisJCS8qIFNldCB0aGUgbGluayBwb2ludGVyIGluIEhXIFRDQiB0byB0aGUgbmV4dCBUQ0IgaW4gdGhlCisJCSAqIGNoYWluCisJCSAqLworCQl0Y2ItPm5leHQgPSB0Y2IgKyAxOworCisJLyogU2V0IHRoZSAgdGFpbCBwb2ludGVyICovCisJdGNiLS07CisJdHhfcmluZy0+dGNiX3F0YWlsID0gdGNiOworCXRjYi0+bmV4dCA9IE5VTEw7CisJLyogQ3VyciBzZW5kIHF1ZXVlIHNob3VsZCBub3cgYmUgZW1wdHkgKi8KKwl0eF9yaW5nLT5zZW5kX2hlYWQgPSBOVUxMOworCXR4X3JpbmctPnNlbmRfdGFpbCA9IE5VTEw7Cit9CisKKy8qKgorICogZXQxMzEwX2VuYWJsZV9waHlfY29tYSAtIGNhbGxlZCB3aGVuIG5ldHdvcmsgY2FibGUgaXMgdW5wbHVnZ2VkCisgKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiBkcml2ZXIgcmVjZWl2ZSBhbiBwaHkgc3RhdHVzIGNoYW5nZSBpbnRlcnJ1cHQgd2hpbGUgaW4gRDAgYW5kIGNoZWNrIHRoYXQKKyAqIHBoeV9zdGF0dXMgaXMgZG93bi4KKyAqCisgKiAgICAgICAgICAtLSBnYXRlIG9mZiBKQUdDb3JlOworICogICAgICAgICAgLS0gc2V0IGdpZ0UgUEhZIGluIENvbWEgbW9kZQorICogICAgICAgICAgLS0gd2FrZSBvbiBwaHlfaW50ZXJydXB0OyBQZXJmb3JtIHNvZnR3YXJlIHJlc2V0IEpBR0NvcmUsCisgKiAgICAgICAgICAgICByZS1pbml0aWFsaXplIGphZ2NvcmUgYW5kIGdpZ0UgUEhZCisgKgorICogICAgICBBZGQgRDAtQVNQTS1QaHlMaW5rRG93biBTdXBwb3J0OgorICogICAgICAgICAgLS0gd2hpbGUgaW4gRDAsIHdoZW4gdGhlcmUgaXMgYSBwaHlfaW50ZXJydXB0IGluZGljYXRpbmcgcGh5IGxpbmsKKyAqICAgICAgICAgICAgIGRvd24gc3RhdHVzLCBjYWxsIHRoZSBNUFNldFBoeUNvbWEgcm91dGluZSB0byBlbnRlciB0aGlzIGFjdGl2ZQorICogICAgICAgICAgICAgc3RhdGUgcG93ZXIgc2F2aW5nIG1vZGUKKyAqICAgICAgICAgIC0tIHdoaWxlIGluIEQwLUFTUE0tUGh5TGlua0Rvd24gbW9kZSwgd2hlbiB0aGVyZSBpcyBhIHBoeV9pbnRlcnJ1cHQKKyAqICAgICAgIGluZGljYXRpbmcgbGlua3VwIHN0YXR1cywgY2FsbCB0aGUgTVBEaXNhYmxlUGh5Q29tYSByb3V0aW5lIHRvCisgKiAgICAgICAgICAgICByZXN0b3JlIEpBR0NvcmUgYW5kIGdpZ0UgUEhZCisgKi8KK3ZvaWQgZXQxMzEwX2VuYWJsZV9waHlfY29tYShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgcG1jc3I7CisKKwlwbWNzciA9IHJlYWRsKCZhZGFwdGVyLT5yZWdzLT5nbG9iYWwucG1fY3NyKTsKKworCS8qIFNhdmUgdGhlIEdiRSBQSFkgc3BlZWQgYW5kIGR1cGxleCBtb2Rlcy4gTmVlZCB0byByZXN0b3JlIHRoaXMKKwkgKiB3aGVuIGNhYmxlIGlzIHBsdWdnZWQgYmFjayBpbgorCSAqLworCS8qCisJICogVE9ETyAtIHdoZW4gUE0gaXMgcmUtZW5hYmxlZCwgY2hlY2sgaWYgd2UgbmVlZCB0bworCSAqIHBlcmZvcm0gYSBzaW1pbGFyIHRhc2sgYXMgdGhpcyAtCisJICogYWRhcHRlci0+cGRvd25fc3BlZWQgPSBhZGFwdGVyLT5haV9mb3JjZV9zcGVlZDsKKwkgKiBhZGFwdGVyLT5wZG93bl9kdXBsZXggPSBhZGFwdGVyLT5haV9mb3JjZV9kdXBsZXg7CisJICovCisKKwkvKiBTdG9wIHNlbmRpbmcgcGFja2V0cy4gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+c2VuZF9od19sb2NrLCBmbGFncyk7CisJYWRhcHRlci0+ZmxhZ3MgfD0gZk1QX0FEQVBURVJfTE9XRVJfUE9XRVI7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+c2VuZF9od19sb2NrLCBmbGFncyk7CisKKwkvKiBXYWl0IGZvciBvdXRzdGFuZGluZyBSZWNlaXZlIHBhY2tldHMgKi8KKworCWV0MTMxeF9kaXNhYmxlX3R4cngoYWRhcHRlci0+bmV0ZGV2KTsKKworCS8qIEdhdGUgb2ZmIEpBR0NvcmUgMyBjbG9jayBkb21haW5zICovCisJcG1jc3IgJj0gfkVUX1BNQ1NSX0lOSVQ7CisJd3JpdGVsKHBtY3NyLCAmYWRhcHRlci0+cmVncy0+Z2xvYmFsLnBtX2Nzcik7CisKKwkvKiBQcm9ncmFtIGdpZ0UgUEhZIGluIHRvIENvbWEgbW9kZSAqLworCXBtY3NyIHw9IEVUX1BNX1BIWV9TV19DT01BOworCXdyaXRlbChwbWNzciwgJmFkYXB0ZXItPnJlZ3MtPmdsb2JhbC5wbV9jc3IpOworfQorCisvKioKKyAqIGV0MTMxMF9kaXNhYmxlX3BoeV9jb21hIC0gRGlzYWJsZSB0aGUgUGh5IENvbWEgTW9kZQorICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIgc3RydWN0dXJlCisgKi8KK3ZvaWQgZXQxMzEwX2Rpc2FibGVfcGh5X2NvbWEoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQoreworCXUzMiBwbWNzcjsKKworCXBtY3NyID0gcmVhZGwoJmFkYXB0ZXItPnJlZ3MtPmdsb2JhbC5wbV9jc3IpOworCisJLyogRGlzYWJsZSBwaHlfc3dfY29tYSByZWdpc3RlciBhbmQgcmUtZW5hYmxlIEpBR0NvcmUgY2xvY2tzICovCisJcG1jc3IgfD0gRVRfUE1DU1JfSU5JVDsKKwlwbWNzciAmPSB+RVRfUE1fUEhZX1NXX0NPTUE7CisJd3JpdGVsKHBtY3NyLCAmYWRhcHRlci0+cmVncy0+Z2xvYmFsLnBtX2Nzcik7CisKKwkvKiBSZXN0b3JlIHRoZSBHYkUgUEhZIHNwZWVkIGFuZCBkdXBsZXggbW9kZXM7CisJICogUmVzZXQgSkFHQ29yZTsgcmUtY29uZmlndXJlIGFuZCBpbml0aWFsaXplIEpBR0NvcmUgYW5kIGdpZ0UgUEhZCisJICovCisJLyogVE9ETyAtIHdoZW4gUE0gaXMgcmUtZW5hYmxlZCwgY2hlY2sgaWYgd2UgbmVlZCB0bworCSAqIHBlcmZvcm0gYSBzaW1pbGFyIHRhc2sgYXMgdGhpcyAtCisJICogYWRhcHRlci0+YWlfZm9yY2Vfc3BlZWQgPSBhZGFwdGVyLT5wZG93bl9zcGVlZDsKKwkgKiBhZGFwdGVyLT5haV9mb3JjZV9kdXBsZXggPSBhZGFwdGVyLT5wZG93bl9kdXBsZXg7CisJICovCisKKwkvKiBSZS1pbml0aWFsaXplIHRoZSBzZW5kIHN0cnVjdHVyZXMgKi8KKwlldDEzMXhfaW5pdF9zZW5kKGFkYXB0ZXIpOworCisJLyogQnJpbmcgdGhlIGRldmljZSBiYWNrIHRvIHRoZSBzdGF0ZSBpdCB3YXMgZHVyaW5nIGluaXQgcHJpb3IgdG8KKwkgKiBhdXRvbmVnb3RpYXRpb24gYmVpbmcgY29tcGxldGUuICBUaGlzIHdheSwgd2hlbiB3ZSBnZXQgdGhlIGF1dG8tbmVnCisJICogY29tcGxldGUgaW50ZXJydXB0LCB3ZSBjYW4gY29tcGxldGUgaW5pdCBieSBjYWxsaW5nIENvbmZpZ01hY1JFR1MyLgorCSAqLworCWV0MTMxeF9zb2Z0X3Jlc2V0KGFkYXB0ZXIpOworCisJLyogc2V0dXAgZXQxMzEwIGFzIHBlciB0aGUgZG9jdW1lbnRhdGlvbiA/PyAqLworCWV0MTMxeF9hZGFwdGVyX3NldHVwKGFkYXB0ZXIpOworCisJLyogQWxsb3cgVHggdG8gcmVzdGFydCAqLworCWFkYXB0ZXItPmZsYWdzICY9IH5mTVBfQURBUFRFUl9MT1dFUl9QT1dFUjsKKworCWV0MTMxeF9lbmFibGVfdHhyeChhZGFwdGVyLT5uZXRkZXYpOworfQorCisvKiBSWCBmdW5jdGlvbnMgKi8KKworc3RhdGljIGlubGluZSB1MzIgYnVtcF9mcmVlX2J1ZmZfcmluZyh1MzIgKmZyZWVfYnVmZl9yaW5nLCB1MzIgbGltaXQpCit7CisJdTMyIHRtcF9mcmVlX2J1ZmZfcmluZyA9ICpmcmVlX2J1ZmZfcmluZzsKKwl0bXBfZnJlZV9idWZmX3JpbmcrKzsKKwkvKiBUaGlzIHdvcmtzIGZvciBhbGwgY2FzZXMgd2hlcmUgbGltaXQgPCAxMDI0LiBUaGUgMTAyMyBjYXNlCisJICAgd29ya3MgYmVjYXVzZSAxMDIzKysgaXMgMTAyNCB3aGljaCBtZWFucyB0aGUgaWYgY29uZGl0aW9uIGlzIG5vdAorCSAgIHRha2VuIGJ1dCB0aGUgY2Fycnkgb2YgdGhlIGJpdCBpbnRvIHRoZSB3cmFwIGJpdCB0b2dnbGVzIHRoZSB3cmFwCisJICAgdmFsdWUgY29ycmVjdGx5ICovCisJaWYgKCh0bXBfZnJlZV9idWZmX3JpbmcgJiBFVF9ETUExMF9NQVNLKSA+IGxpbWl0KSB7CisJCXRtcF9mcmVlX2J1ZmZfcmluZyAmPSB+RVRfRE1BMTBfTUFTSzsKKwkJdG1wX2ZyZWVfYnVmZl9yaW5nIF49IEVUX0RNQTEwX1dSQVA7CisJfQorCS8qIEZvciB0aGUgMTAyMyBjYXNlICovCisJdG1wX2ZyZWVfYnVmZl9yaW5nICY9IChFVF9ETUExMF9NQVNLfEVUX0RNQTEwX1dSQVApOworCSpmcmVlX2J1ZmZfcmluZyA9IHRtcF9mcmVlX2J1ZmZfcmluZzsKKwlyZXR1cm4gdG1wX2ZyZWVfYnVmZl9yaW5nOworfQorCisvKioKKyAqIGV0MTMxeF9hbGlnbl9hbGxvY2F0ZWRfbWVtb3J5IC0gQWxpZ24gYWxsb2NhdGVkIG1lbW9yeSBvbiBhIGdpdmVuIGJvdW5kYXJ5CisgKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqIEBwaHlzX2FkZHI6IHBvaW50ZXIgdG8gUGh5c2ljYWwgYWRkcmVzcworICogQG9mZnNldDogcG9pbnRlciB0byB0aGUgb2Zmc2V0IHZhcmlhYmxlCisgKiBAbWFzazogY29ycmVjdCBtYXNrCisgKi8KK3ZvaWQgZXQxMzF4X2FsaWduX2FsbG9jYXRlZF9tZW1vcnkoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLAorCQkJCSAgIHVpbnQ2NF90ICpwaHlzX2FkZHIsCisJCQkJICAgdWludDY0X3QgKm9mZnNldCwgdWludDY0X3QgbWFzaykKK3sKKwl1aW50NjRfdCBuZXdfYWRkcjsKKworCSpvZmZzZXQgPSAwOworCisJbmV3X2FkZHIgPSAqcGh5c19hZGRyICYgfm1hc2s7CisKKwlpZiAobmV3X2FkZHIgIT0gKnBoeXNfYWRkcikgeworCQkvKiBNb3ZlIHRvIG5leHQgYWxpZ25lZCBibG9jayAqLworCQluZXdfYWRkciArPSBtYXNrICsgMTsKKwkJLyogUmV0dXJuIG9mZnNldCBmb3IgYWRqdXN0aW5nIHZpcnQgYWRkciAqLworCQkqb2Zmc2V0ID0gbmV3X2FkZHIgLSAqcGh5c19hZGRyOworCQkvKiBSZXR1cm4gbmV3IHBoeXNpY2FsIGFkZHJlc3MgKi8KKwkJKnBoeXNfYWRkciA9IG5ld19hZGRyOworCX0KK30KKworLyoqCisgKiBldDEzMXhfcnhfZG1hX21lbW9yeV9hbGxvYworICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKQorICoKKyAqIEFsbG9jYXRlcyBGcmVlIGJ1ZmZlciByaW5nIDEgZm9yIHN1cmUsIGZyZWUgYnVmZmVyIHJpbmcgMCBpZiByZXF1aXJlZCwKKyAqIGFuZCB0aGUgUGFja2V0IFN0YXR1cyBSaW5nLgorICovCitpbnQgZXQxMzF4X3J4X2RtYV9tZW1vcnlfYWxsb2Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQoreworCXUzMiBpLCBqOworCXUzMiBidWZzaXplOworCXUzMiBwa3RzdGF0X3JpbmdzaXplLCBmYnJfY2h1bmtzaXplOworCXN0cnVjdCByeF9yaW5nICpyeF9yaW5nOworCisJLyogU2V0dXAgc29tZSBjb252ZW5pZW5jZSBwb2ludGVycyAqLworCXJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZzsKKworCS8qIEFsbG9jIG1lbW9yeSBmb3IgdGhlIGxvb2t1cCB0YWJsZSAqLworI2lmZGVmIFVTRV9GQlIwCisJcnhfcmluZy0+ZmJyWzFdID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZicl9sb29rdXApLCBHRlBfS0VSTkVMKTsKKyNlbmRpZgorCXJ4X3JpbmctPmZiclswXSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmYnJfbG9va3VwKSwgR0ZQX0tFUk5FTCk7CisKKwkvKiBUaGUgZmlyc3QgdGhpbmcgd2Ugd2lsbCBkbyBpcyBjb25maWd1cmUgdGhlIHNpemVzIG9mIHRoZSBidWZmZXIKKwkgKiByaW5ncy4gVGhlc2Ugd2lsbCBjaGFuZ2UgYmFzZWQgb24ganVtYm8gcGFja2V0IHN1cHBvcnQuICBMYXJnZXIKKwkgKiBqdW1ibyBwYWNrZXRzIGluY3JlYXNlcyB0aGUgc2l6ZSBvZiBlYWNoIGVudHJ5IGluIEZCUjAsIGFuZCB0aGUKKwkgKiBudW1iZXIgb2YgZW50cmllcyBpbiBGQlIwLCB3aGlsZSBhdCB0aGUgc2FtZSB0aW1lIGRlY3JlYXNpbmcgdGhlCisJICogbnVtYmVyIG9mIGVudHJpZXMgaW4gRkJSMS4KKwkgKgorCSAqIEZCUjEgaG9sZHMgImxhcmdlIiBmcmFtZXMsIEZCUjAgaG9sZHMgInNtYWxsIiBmcmFtZXMuICBJZiBGQlIxCisJICogZW50cmllcyBhcmUgaHVnZSBpbiBvcmRlciB0byBhY2NvbW1vZGF0ZSBhICJqdW1ibyIgZnJhbWUsIHRoZW4gaXQKKwkgKiB3aWxsIGhhdmUgbGVzcyBlbnRyaWVzLiAgQ29udmVyc2VseSwgRkJSMSB3aWxsIG5vdyBiZSByZWxpZWQgdXBvbgorCSAqIHRvIGNhcnJ5IG1vcmUgIm5vcm1hbCIgZnJhbWVzLCB0aHVzIGl0J3MgZW50cnkgc2l6ZSBhbHNvIGluY3JlYXNlcworCSAqIGFuZCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgZ29lcyB1cCB0b28gKHNpbmNlIGl0IG5vdyBjYXJyaWVzCisJICogInNtYWxsIiArICJyZWd1bGFyIiBwYWNrZXRzLgorCSAqCisJICogSW4gdGhpcyBzY2hlbWUsIHdlIHRyeSB0byBtYWludGFpbiA1MTIgZW50cmllcyBiZXR3ZWVuIHRoZSB0d28KKwkgKiByaW5ncy4gQWxzbywgRkJSMSByZW1haW5zIGEgY29uc3RhbnQgc2l6ZSAtIHdoZW4gaXQncyBzaXplIGRvdWJsZXMKKwkgKiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaGFsdmVzLiAgRkJSMCBpbmNyZWFzZXMgaW4gc2l6ZSwgaG93ZXZlci4KKwkgKi8KKworCWlmIChhZGFwdGVyLT5yZWdpc3RyeV9qdW1ib19wYWNrZXQgPCAyMDQ4KSB7CisjaWZkZWYgVVNFX0ZCUjAKKwkJcnhfcmluZy0+ZmJyWzFdLT5idWZmc2l6ZSA9IDI1NjsKKwkJcnhfcmluZy0+ZmJyWzFdLT5udW1fZW50cmllcyA9IDUxMjsKKyNlbmRpZgorCQlyeF9yaW5nLT5mYnJbMF0tPmJ1ZmZzaXplID0gMjA0ODsKKwkJcnhfcmluZy0+ZmJyWzBdLT5udW1fZW50cmllcyA9IDUxMjsKKwl9IGVsc2UgaWYgKGFkYXB0ZXItPnJlZ2lzdHJ5X2p1bWJvX3BhY2tldCA8IDQwOTYpIHsKKyNpZmRlZiBVU0VfRkJSMAorCQlyeF9yaW5nLT5mYnJbMV0tPmJ1ZmZzaXplID0gNTEyOworCQlyeF9yaW5nLT5mYnJbMV0tPm51bV9lbnRyaWVzID0gMTAyNDsKKyNlbmRpZgorCQlyeF9yaW5nLT5mYnJbMF0tPmJ1ZmZzaXplID0gNDA5NjsKKwkJcnhfcmluZy0+ZmJyWzBdLT5udW1fZW50cmllcyA9IDUxMjsKKwl9IGVsc2UgeworI2lmZGVmIFVTRV9GQlIwCisJCXJ4X3JpbmctPmZiclsxXS0+YnVmZnNpemUgPSAxMDI0OworCQlyeF9yaW5nLT5mYnJbMV0tPm51bV9lbnRyaWVzID0gNzY4OworI2VuZGlmCisJCXJ4X3JpbmctPmZiclswXS0+YnVmZnNpemUgPSAxNjM4NDsKKwkJcnhfcmluZy0+ZmJyWzBdLT5udW1fZW50cmllcyA9IDEyODsKKwl9CisKKyNpZmRlZiBVU0VfRkJSMAorCWFkYXB0ZXItPnJ4X3JpbmcucHNyX251bV9lbnRyaWVzID0KKwkJCQlhZGFwdGVyLT5yeF9yaW5nLmZiclsxXS0+bnVtX2VudHJpZXMgKworCQkJCWFkYXB0ZXItPnJ4X3JpbmcuZmJyWzBdLT5udW1fZW50cmllczsKKyNlbHNlCisJYWRhcHRlci0+cnhfcmluZy5wc3JfbnVtX2VudHJpZXMgPSBhZGFwdGVyLT5yeF9yaW5nLmZiclswXS0+bnVtX2VudHJpZXM7CisjZW5kaWYKKworCS8qIEFsbG9jYXRlIGFuIGFyZWEgb2YgbWVtb3J5IGZvciBGcmVlIEJ1ZmZlciBSaW5nIDEgKi8KKwlidWZzaXplID0gKHNpemVvZihzdHJ1Y3QgZmJyX2Rlc2MpICogcnhfcmluZy0+ZmJyWzBdLT5udW1fZW50cmllcykgKworCQkJCQkJCQkJMHhmZmY7CisJcnhfcmluZy0+ZmJyWzBdLT5yaW5nX3ZpcnRhZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkJCWJ1ZnNpemUsCisJCQkJCSZyeF9yaW5nLT5mYnJbMF0tPnJpbmdfcGh5c2FkZHIsCisJCQkJCUdGUF9LRVJORUwpOworCWlmICghcnhfcmluZy0+ZmJyWzBdLT5yaW5nX3ZpcnRhZGRyKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSAgIkNhbm5vdCBhbGxvYyBtZW1vcnkgZm9yIEZyZWUgQnVmZmVyIFJpbmcgMVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFNhdmUgcGh5c2ljYWwgYWRkcmVzcworCSAqCisJICogTk9URTogZG1hX2FsbG9jX2NvaGVyZW50KCksIHVzZWQgYWJvdmUgdG8gYWxsb2MgRE1BIHJlZ2lvbnMsCisJICogQUxXQVlTIHJldHVybnMgU0FDICgzMi1iaXQpIGFkZHJlc3Nlcy4gSWYgREFDICg2NC1iaXQpIGFkZHJlc3NlcworCSAqIGFyZSBldmVyIHJldHVybmVkLCBtYWtlIHN1cmUgdGhlIGhpZ2ggcGFydCBpcyByZXRyaWV2ZWQgaGVyZQorCSAqIGJlZm9yZSBzdG9yaW5nIHRoZSBhZGp1c3RlZCBhZGRyZXNzLgorCSAqLworCXJ4X3JpbmctPmZiclswXS0+cmVhbF9waHlzYWRkciA9IHJ4X3JpbmctPmZiclswXS0+cmluZ19waHlzYWRkcjsKKworCS8qIEFsaWduIEZyZWUgQnVmZmVyIFJpbmcgMSBvbiBhIDRLIGJvdW5kYXJ5ICovCisJZXQxMzF4X2FsaWduX2FsbG9jYXRlZF9tZW1vcnkoYWRhcHRlciwKKwkJCQkgICAgICAmcnhfcmluZy0+ZmJyWzBdLT5yZWFsX3BoeXNhZGRyLAorCQkJCSAgICAgICZyeF9yaW5nLT5mYnJbMF0tPm9mZnNldCwgMHgwRkZGKTsKKworCXJ4X3JpbmctPmZiclswXS0+cmluZ192aXJ0YWRkciA9CisJCQkodm9pZCAqKSgodTggKikgcnhfcmluZy0+ZmJyWzBdLT5yaW5nX3ZpcnRhZGRyICsKKwkJCXJ4X3JpbmctPmZiclswXS0+b2Zmc2V0KTsKKworI2lmZGVmIFVTRV9GQlIwCisJLyogQWxsb2NhdGUgYW4gYXJlYSBvZiBtZW1vcnkgZm9yIEZyZWUgQnVmZmVyIFJpbmcgMCAqLworCWJ1ZnNpemUgPSAoc2l6ZW9mKHN0cnVjdCBmYnJfZGVzYykgKiByeF9yaW5nLT5mYnJbMV0tPm51bV9lbnRyaWVzKSArCisJCQkJCQkJCQkweGZmZjsKKwlyeF9yaW5nLT5mYnJbMV0tPnJpbmdfdmlydGFkZHIgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkJCWJ1ZnNpemUsCisJCQkJCQkmcnhfcmluZy0+ZmJyWzFdLT5yaW5nX3BoeXNhZGRyLAorCQkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFyeF9yaW5nLT5mYnJbMV0tPnJpbmdfdmlydGFkZHIpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJICAiQ2Fubm90IGFsbG9jIG1lbW9yeSBmb3IgRnJlZSBCdWZmZXIgUmluZyAwXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogU2F2ZSBwaHlzaWNhbCBhZGRyZXNzCisJICoKKwkgKiBOT1RFOiBkbWFfYWxsb2NfY29oZXJlbnQoKSwgdXNlZCBhYm92ZSB0byBhbGxvYyBETUEgcmVnaW9ucywKKwkgKiBBTFdBWVMgcmV0dXJucyBTQUMgKDMyLWJpdCkgYWRkcmVzc2VzLiBJZiBEQUMgKDY0LWJpdCkgYWRkcmVzc2VzCisJICogYXJlIGV2ZXIgcmV0dXJuZWQsIG1ha2Ugc3VyZSB0aGUgaGlnaCBwYXJ0IGlzIHJldHJpZXZlZCBoZXJlIGJlZm9yZQorCSAqIHN0b3JpbmcgdGhlIGFkanVzdGVkIGFkZHJlc3MuCisJICovCisJcnhfcmluZy0+ZmJyWzFdLT5yZWFsX3BoeXNhZGRyID0gcnhfcmluZy0+ZmJyWzFdLT5yaW5nX3BoeXNhZGRyOworCisJLyogQWxpZ24gRnJlZSBCdWZmZXIgUmluZyAwIG9uIGEgNEsgYm91bmRhcnkgKi8KKwlldDEzMXhfYWxpZ25fYWxsb2NhdGVkX21lbW9yeShhZGFwdGVyLAorCQkJCSAgICAgICZyeF9yaW5nLT5mYnJbMV0tPnJlYWxfcGh5c2FkZHIsCisJCQkJICAgICAgJnJ4X3JpbmctPmZiclsxXS0+b2Zmc2V0LCAweDBGRkYpOworCisJcnhfcmluZy0+ZmJyWzFdLT5yaW5nX3ZpcnRhZGRyID0KKwkJCSh2b2lkICopKCh1OCAqKSByeF9yaW5nLT5mYnJbMV0tPnJpbmdfdmlydGFkZHIgKworCQkJcnhfcmluZy0+ZmJyWzFdLT5vZmZzZXQpOworI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IChyeF9yaW5nLT5mYnJbMF0tPm51bV9lbnRyaWVzIC8gRkJSX0NIVU5LUyk7IGkrKykgeworCQl1NjQgZmJyMV9vZmZzZXQ7CisJCXU2NCBmYnIxX3RtcF9waHlzYWRkcjsKKwkJdTMyIGZicjFfYWxpZ247CisKKwkJLyogVGhpcyBjb2RlIGFsbG9jYXRlcyBhbiBhcmVhIG9mIG1lbW9yeSBiaWcgZW5vdWdoIGZvciBOCisJCSAqIGZyZWUgYnVmZmVycyArIChidWZmZXJfc2l6ZSAtIDEpIHNvIHRoYXQgdGhlIGJ1ZmZlcnMgY2FuCisJCSAqIGJlIGFsaWduZWQgb24gNGsgYm91bmRhcmllcy4gIElmIGVhY2ggYnVmZmVyIHdlcmUgYWxpZ25lZAorCQkgKiB0byBhIGJ1ZmZlcl9zaXplIGJvdW5kYXJ5LCB0aGUgZWZmZWN0IHdvdWxkIGJlIHRvIGRvdWJsZQorCQkgKiB0aGUgc2l6ZSBvZiBGQlIwLiAgQnkgYWxsb2NhdGluZyBOIGJ1ZmZlcnMgYXQgb25jZSwgd2UKKwkJICogcmVkdWNlIHRoaXMgb3ZlcmhlYWQuCisJCSAqLworCQlpZiAocnhfcmluZy0+ZmJyWzBdLT5idWZmc2l6ZSA+IDQwOTYpCisJCQlmYnIxX2FsaWduID0gNDA5NjsKKwkJZWxzZQorCQkJZmJyMV9hbGlnbiA9IHJ4X3JpbmctPmZiclswXS0+YnVmZnNpemU7CisKKwkJZmJyX2NodW5rc2l6ZSA9CisJCSAgICAoRkJSX0NIVU5LUyAqIHJ4X3JpbmctPmZiclswXS0+YnVmZnNpemUpICsgZmJyMV9hbGlnbiAtIDE7CisJCXJ4X3JpbmctPmZiclswXS0+bWVtX3ZpcnRhZGRyc1tpXSA9CisJCSAgICBkbWFfYWxsb2NfY29oZXJlbnQoJmFkYXB0ZXItPnBkZXYtPmRldiwgZmJyX2NodW5rc2l6ZSwKKwkJCQkgICAgICAgJnJ4X3JpbmctPmZiclswXS0+bWVtX3BoeXNhZGRyc1tpXSwKKwkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisKKwkJaWYgKCFyeF9yaW5nLT5mYnJbMF0tPm1lbV92aXJ0YWRkcnNbaV0pIHsKKwkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkiQ291bGQgbm90IGFsbG9jIG1lbW9yeVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCS8qIFNlZSBOT1RFIGluICJTYXZlIFBoeXNpY2FsIEFkZHJlc3MiIGNvbW1lbnQgYWJvdmUgKi8KKwkJZmJyMV90bXBfcGh5c2FkZHIgPSByeF9yaW5nLT5mYnJbMF0tPm1lbV9waHlzYWRkcnNbaV07CisKKwkJZXQxMzF4X2FsaWduX2FsbG9jYXRlZF9tZW1vcnkoYWRhcHRlciwKKwkJCQkJICAgICAgJmZicjFfdG1wX3BoeXNhZGRyLAorCQkJCQkgICAgICAmZmJyMV9vZmZzZXQsIChmYnIxX2FsaWduIC0gMSkpOworCisJCWZvciAoaiA9IDA7IGogPCBGQlJfQ0hVTktTOyBqKyspIHsKKwkJCXUzMiBpbmRleCA9IChpICogRkJSX0NIVU5LUykgKyBqOworCisJCQkvKiBTYXZlIHRoZSBWaXJ0dWFsIGFkZHJlc3Mgb2YgdGhpcyBpbmRleCBmb3IgcXVpY2sKKwkJCSAqIGFjY2VzcyBsYXRlcgorCQkJICovCisJCQlyeF9yaW5nLT5mYnJbMF0tPnZpcnRbaW5kZXhdID0KKwkJCSAgICAodTggKikgcnhfcmluZy0+ZmJyWzBdLT5tZW1fdmlydGFkZHJzW2ldICsKKwkJCSAgICAoaiAqIHJ4X3JpbmctPmZiclswXS0+YnVmZnNpemUpICsgZmJyMV9vZmZzZXQ7CisKKwkJCS8qIG5vdyBzdG9yZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBpbiB0aGUgZGVzY3JpcHRvcgorCQkJICogc28gdGhlIGRldmljZSBjYW4gYWNjZXNzIGl0CisJCQkgKi8KKwkJCXJ4X3JpbmctPmZiclswXS0+YnVzX2hpZ2hbaW5kZXhdID0KKwkJCSAgICAodTMyKSAoZmJyMV90bXBfcGh5c2FkZHIgPj4gMzIpOworCQkJcnhfcmluZy0+ZmJyWzBdLT5idXNfbG93W2luZGV4XSA9CisJCQkgICAgKHUzMikgZmJyMV90bXBfcGh5c2FkZHI7CisKKwkJCWZicjFfdG1wX3BoeXNhZGRyICs9IHJ4X3JpbmctPmZiclswXS0+YnVmZnNpemU7CisKKwkJCXJ4X3JpbmctPmZiclswXS0+YnVmZmVyMVtpbmRleF0gPQorCQkJICAgIHJ4X3JpbmctPmZiclswXS0+dmlydFtpbmRleF07CisJCQlyeF9yaW5nLT5mYnJbMF0tPmJ1ZmZlcjJbaW5kZXhdID0KKwkJCSAgICByeF9yaW5nLT5mYnJbMF0tPnZpcnRbaW5kZXhdIC0gNDsKKwkJfQorCX0KKworI2lmZGVmIFVTRV9GQlIwCisJLyogU2FtZSBmb3IgRkJSMCAoaWYgaW4gdXNlKSAqLworCWZvciAoaSA9IDA7IGkgPCAocnhfcmluZy0+ZmJyWzFdLT5udW1fZW50cmllcyAvIEZCUl9DSFVOS1MpOyBpKyspIHsKKwkJdTY0IGZicjBfb2Zmc2V0OworCQl1NjQgZmJyMF90bXBfcGh5c2FkZHI7CisKKwkJZmJyX2NodW5rc2l6ZSA9CisJCSAgICAoKEZCUl9DSFVOS1MgKyAxKSAqIHJ4X3JpbmctPmZiclsxXS0+YnVmZnNpemUpIC0gMTsKKwkJcnhfcmluZy0+ZmJyWzFdLT5tZW1fdmlydGFkZHJzW2ldID0KKwkJICAgIGRtYV9hbGxvY19jb2hlcmVudCgmYWRhcHRlci0+cGRldi0+ZGV2LCBmYnJfY2h1bmtzaXplLAorCQkJCSAgICAgICAmcnhfcmluZy0+ZmJyWzFdLT5tZW1fcGh5c2FkZHJzW2ldLAorCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKworCQlpZiAoIXJ4X3JpbmctPmZiclsxXS0+bWVtX3ZpcnRhZGRyc1tpXSkgeworCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCSJDb3VsZCBub3QgYWxsb2MgbWVtb3J5XG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJLyogU2VlIE5PVEUgaW4gIlNhdmUgUGh5c2ljYWwgQWRkcmVzcyIgY29tbWVudCBhYm92ZSAqLworCQlmYnIwX3RtcF9waHlzYWRkciA9IHJ4X3JpbmctPmZiclsxXS0+bWVtX3BoeXNhZGRyc1tpXTsKKworCQlldDEzMXhfYWxpZ25fYWxsb2NhdGVkX21lbW9yeShhZGFwdGVyLAorCQkJCQkgICAgICAmZmJyMF90bXBfcGh5c2FkZHIsCisJCQkJCSAgICAgICZmYnIwX29mZnNldCwKKwkJCQkJICAgICAgcnhfcmluZy0+ZmJyWzFdLT5idWZmc2l6ZSAtIDEpOworCisJCWZvciAoaiA9IDA7IGogPCBGQlJfQ0hVTktTOyBqKyspIHsKKwkJCXUzMiBpbmRleCA9IChpICogRkJSX0NIVU5LUykgKyBqOworCisJCQlyeF9yaW5nLT5mYnJbMV0tPnZpcnRbaW5kZXhdID0KKwkJCSAgICAodTggKikgcnhfcmluZy0+ZmJyWzFdLT5tZW1fdmlydGFkZHJzW2ldICsKKwkJCSAgICAoaiAqIHJ4X3JpbmctPmZiclsxXS0+YnVmZnNpemUpICsgZmJyMF9vZmZzZXQ7CisKKwkJCXJ4X3JpbmctPmZiclsxXS0+YnVzX2hpZ2hbaW5kZXhdID0KKwkJCSAgICAodTMyKSAoZmJyMF90bXBfcGh5c2FkZHIgPj4gMzIpOworCQkJcnhfcmluZy0+ZmJyWzFdLT5idXNfbG93W2luZGV4XSA9CisJCQkgICAgKHUzMikgZmJyMF90bXBfcGh5c2FkZHI7CisKKwkJCWZicjBfdG1wX3BoeXNhZGRyICs9IHJ4X3JpbmctPmZiclsxXS0+YnVmZnNpemU7CisKKwkJCXJ4X3JpbmctPmZiclsxXS0+YnVmZmVyMVtpbmRleF0gPQorCQkJICAgIHJ4X3JpbmctPmZiclsxXS0+dmlydFtpbmRleF07CisJCQlyeF9yaW5nLT5mYnJbMV0tPmJ1ZmZlcjJbaW5kZXhdID0KKwkJCSAgICByeF9yaW5nLT5mYnJbMV0tPnZpcnRbaW5kZXhdIC0gNDsKKwkJfQorCX0KKyNlbmRpZgorCisJLyogQWxsb2NhdGUgYW4gYXJlYSBvZiBtZW1vcnkgZm9yIEZJRk8gb2YgUGFja2V0IFN0YXR1cyByaW5nIGVudHJpZXMgKi8KKwlwa3RzdGF0X3JpbmdzaXplID0KKwkgICAgc2l6ZW9mKHN0cnVjdCBwa3Rfc3RhdF9kZXNjKSAqIGFkYXB0ZXItPnJ4X3JpbmcucHNyX251bV9lbnRyaWVzOworCisJcnhfcmluZy0+cHNfcmluZ192aXJ0YWRkciA9IGRtYV9hbGxvY19jb2hlcmVudCgmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCQkJICBwa3RzdGF0X3JpbmdzaXplLAorCQkJCQkJICAmcnhfcmluZy0+cHNfcmluZ19waHlzYWRkciwKKwkJCQkJCSAgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXJ4X3JpbmctPnBzX3JpbmdfdmlydGFkZHIpIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJICAiQ2Fubm90IGFsbG9jIG1lbW9yeSBmb3IgUGFja2V0IFN0YXR1cyBSaW5nXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXByaW50ayhLRVJOX0lORk8gIlBhY2tldCBTdGF0dXMgUmluZyAlbHhcbiIsCisJICAgICh1bnNpZ25lZCBsb25nKSByeF9yaW5nLT5wc19yaW5nX3BoeXNhZGRyKTsKKworCS8qCisJICogTk9URSA6IGRtYV9hbGxvY19jb2hlcmVudCgpLCB1c2VkIGFib3ZlIHRvIGFsbG9jIERNQSByZWdpb25zLAorCSAqIEFMV0FZUyByZXR1cm5zIFNBQyAoMzItYml0KSBhZGRyZXNzZXMuIElmIERBQyAoNjQtYml0KSBhZGRyZXNzZXMKKwkgKiBhcmUgZXZlciByZXR1cm5lZCwgbWFrZSBzdXJlIHRoZSBoaWdoIHBhcnQgaXMgcmV0cmlldmVkIGhlcmUgYmVmb3JlCisJICogc3RvcmluZyB0aGUgYWRqdXN0ZWQgYWRkcmVzcy4KKwkgKi8KKworCS8qIEFsbG9jYXRlIGFuIGFyZWEgb2YgbWVtb3J5IGZvciB3cml0ZWJhY2sgb2Ygc3RhdHVzIGluZm9ybWF0aW9uICovCisJcnhfcmluZy0+cnhfc3RhdHVzX2Jsb2NrID0gZG1hX2FsbG9jX2NvaGVyZW50KCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IHJ4X3N0YXR1c19ibG9jayksCisJCQkJCSAgICAmcnhfcmluZy0+cnhfc3RhdHVzX2J1cywKKwkJCQkJICAgIEdGUF9LRVJORUwpOworCWlmICghcnhfcmluZy0+cnhfc3RhdHVzX2Jsb2NrKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSAgIkNhbm5vdCBhbGxvYyBtZW1vcnkgZm9yIFN0YXR1cyBCbG9ja1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyeF9yaW5nLT5udW1fcmZkID0gTklDX0RFRkFVTFRfTlVNX1JGRDsKKwlwcmludGsoS0VSTl9JTkZPICJQUlMgJWx4XG4iLCAodW5zaWduZWQgbG9uZylyeF9yaW5nLT5yeF9zdGF0dXNfYnVzKTsKKworCS8qIFJlY3YKKwkgKiBrbWVtX2NhY2hlX2NyZWF0ZSBpbml0aWFsaXplcyBhIGxvb2thc2lkZSBsaXN0LiBBZnRlciBzdWNjZXNzZnVsCisJICogY3JlYXRpb24sIG5vbnBhZ2VkIGZpeGVkLXNpemUgYmxvY2tzIGNhbiBiZSBhbGxvY2F0ZWQgZnJvbSBhbmQKKwkgKiBmcmVlZCB0byB0aGUgbG9va2FzaWRlIGxpc3QuCisJICogUkZEcyB3aWxsIGJlIGFsbG9jYXRlZCBmcm9tIHRoaXMgcG9vbC4KKwkgKi8KKwlyeF9yaW5nLT5yZWN2X2xvb2thc2lkZSA9IGttZW1fY2FjaGVfY3JlYXRlKGFkYXB0ZXItPm5ldGRldi0+bmFtZSwKKwkJCQkJCSAgIHNpemVvZihzdHJ1Y3QgcmZkKSwKKwkJCQkJCSAgIDAsCisJCQkJCQkgICBTTEFCX0NBQ0hFX0RNQSB8CisJCQkJCQkgICBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCQkJCQkgICBOVUxMKTsKKworCWFkYXB0ZXItPmZsYWdzIHw9IGZNUF9BREFQVEVSX1JFQ1ZfTE9PS0FTSURFOworCisJLyogVGhlIFJGRHMgYXJlIGdvaW5nIHRvIGJlIHB1dCBvbiBsaXN0cyBsYXRlciBvbiwgc28gaW5pdGlhbGl6ZSB0aGUKKwkgKiBsaXN0cyBub3cuCisJICovCisJSU5JVF9MSVNUX0hFQUQoJnJ4X3JpbmctPnJlY3ZfbGlzdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZXQxMzF4X3J4X2RtYV9tZW1vcnlfZnJlZSAtIEZyZWUgYWxsIG1lbW9yeSBhbGxvY2F0ZWQgd2l0aGluIHRoaXMgbW9kdWxlLgorICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqLwordm9pZCBldDEzMXhfcnhfZG1hX21lbW9yeV9mcmVlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1MzIgaW5kZXg7CisJdTMyIGJ1ZnNpemU7CisJdTMyIHBrdHN0YXRfcmluZ3NpemU7CisJc3RydWN0IHJmZCAqcmZkOworCXN0cnVjdCByeF9yaW5nICpyeF9yaW5nOworCisJLyogU2V0dXAgc29tZSBjb252ZW5pZW5jZSBwb2ludGVycyAqLworCXJ4X3JpbmcgPSAmYWRhcHRlci0+cnhfcmluZzsKKworCS8qIEZyZWUgUkZEcyBhbmQgYXNzb2NpYXRlZCBwYWNrZXQgZGVzY3JpcHRvcnMgKi8KKwlXQVJOX09OKHJ4X3JpbmctPm51bV9yZWFkeV9yZWN2ICE9IHJ4X3JpbmctPm51bV9yZmQpOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZyeF9yaW5nLT5yZWN2X2xpc3QpKSB7CisJCXJmZCA9IChzdHJ1Y3QgcmZkICopIGxpc3RfZW50cnkocnhfcmluZy0+cmVjdl9saXN0Lm5leHQsCisJCQkJc3RydWN0IHJmZCwgbGlzdF9ub2RlKTsKKworCQlsaXN0X2RlbCgmcmZkLT5saXN0X25vZGUpOworCQlyZmQtPnNrYiA9IE5VTEw7CisJCWttZW1fY2FjaGVfZnJlZShhZGFwdGVyLT5yeF9yaW5nLnJlY3ZfbG9va2FzaWRlLCByZmQpOworCX0KKworCS8qIEZyZWUgRnJlZSBCdWZmZXIgUmluZyAxICovCisJaWYgKHJ4X3JpbmctPmZiclswXS0+cmluZ192aXJ0YWRkcikgeworCQkvKiBGaXJzdCB0aGUgcGFja2V0IG1lbW9yeSAqLworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPAorCQkgICAgIChyeF9yaW5nLT5mYnJbMF0tPm51bV9lbnRyaWVzIC8gRkJSX0NIVU5LUyk7IGluZGV4KyspIHsKKwkJCWlmIChyeF9yaW5nLT5mYnJbMF0tPm1lbV92aXJ0YWRkcnNbaW5kZXhdKSB7CisJCQkJdTMyIGZicjFfYWxpZ247CisKKwkJCQlpZiAocnhfcmluZy0+ZmJyWzBdLT5idWZmc2l6ZSA+IDQwOTYpCisJCQkJCWZicjFfYWxpZ24gPSA0MDk2OworCQkJCWVsc2UKKwkJCQkJZmJyMV9hbGlnbiA9IHJ4X3JpbmctPmZiclswXS0+YnVmZnNpemU7CisKKwkJCQlidWZzaXplID0KKwkJCQkgICAgKHJ4X3JpbmctPmZiclswXS0+YnVmZnNpemUgKiBGQlJfQ0hVTktTKSArCisJCQkJICAgIGZicjFfYWxpZ24gLSAxOworCisJCQkJZG1hX2ZyZWVfY29oZXJlbnQoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkJYnVmc2l6ZSwKKwkJCQkJcnhfcmluZy0+ZmJyWzBdLT5tZW1fdmlydGFkZHJzW2luZGV4XSwKKwkJCQkJcnhfcmluZy0+ZmJyWzBdLT5tZW1fcGh5c2FkZHJzW2luZGV4XSk7CisKKwkJCQlyeF9yaW5nLT5mYnJbMF0tPm1lbV92aXJ0YWRkcnNbaW5kZXhdID0gTlVMTDsKKwkJCX0KKwkJfQorCisJCS8qIE5vdyB0aGUgRklGTyBpdHNlbGYgKi8KKwkJcnhfcmluZy0+ZmJyWzBdLT5yaW5nX3ZpcnRhZGRyID0gKHZvaWQgKikoKHU4ICopCisJCSAgICByeF9yaW5nLT5mYnJbMF0tPnJpbmdfdmlydGFkZHIgLSByeF9yaW5nLT5mYnJbMF0tPm9mZnNldCk7CisKKwkJYnVmc2l6ZSA9CisJCSAgICAoc2l6ZW9mKHN0cnVjdCBmYnJfZGVzYykgKiByeF9yaW5nLT5mYnJbMF0tPm51bV9lbnRyaWVzKSArCisJCQkJCQkJCQkweGZmZjsKKworCQlkbWFfZnJlZV9jb2hlcmVudCgmYWRhcHRlci0+cGRldi0+ZGV2LCBidWZzaXplLAorCQkJCSAgICByeF9yaW5nLT5mYnJbMF0tPnJpbmdfdmlydGFkZHIsCisJCQkJICAgIHJ4X3JpbmctPmZiclswXS0+cmluZ19waHlzYWRkcik7CisKKwkJcnhfcmluZy0+ZmJyWzBdLT5yaW5nX3ZpcnRhZGRyID0gTlVMTDsKKwl9CisKKyNpZmRlZiBVU0VfRkJSMAorCS8qIE5vdyB0aGUgc2FtZSBmb3IgRnJlZSBCdWZmZXIgUmluZyAwICovCisJaWYgKHJ4X3JpbmctPmZiclsxXS0+cmluZ192aXJ0YWRkcikgeworCQkvKiBGaXJzdCB0aGUgcGFja2V0IG1lbW9yeSAqLworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPAorCQkgICAgIChyeF9yaW5nLT5mYnJbMV0tPm51bV9lbnRyaWVzIC8gRkJSX0NIVU5LUyk7IGluZGV4KyspIHsKKwkJCWlmIChyeF9yaW5nLT5mYnJbMV0tPm1lbV92aXJ0YWRkcnNbaW5kZXhdKSB7CisJCQkJYnVmc2l6ZSA9CisJCQkJICAgIChyeF9yaW5nLT5mYnJbMV0tPmJ1ZmZzaXplICoKKwkJCQkgICAgIChGQlJfQ0hVTktTICsgMSkpIC0gMTsKKworCQkJCWRtYV9mcmVlX2NvaGVyZW50KCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkJCWJ1ZnNpemUsCisJCQkJCXJ4X3JpbmctPmZiclsxXS0+bWVtX3ZpcnRhZGRyc1tpbmRleF0sCisJCQkJCXJ4X3JpbmctPmZiclsxXS0+bWVtX3BoeXNhZGRyc1tpbmRleF0pOworCisJCQkJcnhfcmluZy0+ZmJyWzFdLT5tZW1fdmlydGFkZHJzW2luZGV4XSA9IE5VTEw7CisJCQl9CisJCX0KKworCQkvKiBOb3cgdGhlIEZJRk8gaXRzZWxmICovCisJCXJ4X3JpbmctPmZiclsxXS0+cmluZ192aXJ0YWRkciA9ICh2b2lkICopKCh1OCAqKQorCQkgICAgcnhfcmluZy0+ZmJyWzFdLT5yaW5nX3ZpcnRhZGRyIC0gcnhfcmluZy0+ZmJyWzFdLT5vZmZzZXQpOworCisJCWJ1ZnNpemUgPQorCQkgICAgKHNpemVvZihzdHJ1Y3QgZmJyX2Rlc2MpICogcnhfcmluZy0+ZmJyWzFdLT5udW1fZW50cmllcykgKworCQkJCQkJCQkJMHhmZmY7CisKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkgIGJ1ZnNpemUsCisJCQkJICByeF9yaW5nLT5mYnJbMV0tPnJpbmdfdmlydGFkZHIsCisJCQkJICByeF9yaW5nLT5mYnJbMV0tPnJpbmdfcGh5c2FkZHIpOworCisJCXJ4X3JpbmctPmZiclsxXS0+cmluZ192aXJ0YWRkciA9IE5VTEw7CisJfQorI2VuZGlmCisKKwkvKiBGcmVlIFBhY2tldCBTdGF0dXMgUmluZyAqLworCWlmIChyeF9yaW5nLT5wc19yaW5nX3ZpcnRhZGRyKSB7CisJCXBrdHN0YXRfcmluZ3NpemUgPQorCQkgICAgc2l6ZW9mKHN0cnVjdCBwa3Rfc3RhdF9kZXNjKSAqCisJCSAgICBhZGFwdGVyLT5yeF9yaW5nLnBzcl9udW1fZW50cmllczsKKworCQlkbWFfZnJlZV9jb2hlcmVudCgmYWRhcHRlci0+cGRldi0+ZGV2LCBwa3RzdGF0X3JpbmdzaXplLAorCQkJCSAgICByeF9yaW5nLT5wc19yaW5nX3ZpcnRhZGRyLAorCQkJCSAgICByeF9yaW5nLT5wc19yaW5nX3BoeXNhZGRyKTsKKworCQlyeF9yaW5nLT5wc19yaW5nX3ZpcnRhZGRyID0gTlVMTDsKKwl9CisKKwkvKiBGcmVlIGFyZWEgb2YgbWVtb3J5IGZvciB0aGUgd3JpdGViYWNrIG9mIHN0YXR1cyBpbmZvcm1hdGlvbiAqLworCWlmIChyeF9yaW5nLT5yeF9zdGF0dXNfYmxvY2spIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCXNpemVvZihzdHJ1Y3Qgcnhfc3RhdHVzX2Jsb2NrKSwKKwkJCXJ4X3JpbmctPnJ4X3N0YXR1c19ibG9jaywgcnhfcmluZy0+cnhfc3RhdHVzX2J1cyk7CisJCXJ4X3JpbmctPnJ4X3N0YXR1c19ibG9jayA9IE5VTEw7CisJfQorCisJLyogRGVzdHJveSB0aGUgbG9va2FzaWRlIChSRkQpIHBvb2wgKi8KKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBmTVBfQURBUFRFUl9SRUNWX0xPT0tBU0lERSkgeworCQlrbWVtX2NhY2hlX2Rlc3Ryb3kocnhfcmluZy0+cmVjdl9sb29rYXNpZGUpOworCQlhZGFwdGVyLT5mbGFncyAmPSB+Zk1QX0FEQVBURVJfUkVDVl9MT09LQVNJREU7CisJfQorCisJLyogRnJlZSB0aGUgRkJSIExvb2t1cCBUYWJsZSAqLworI2lmZGVmIFVTRV9GQlIwCisJa2ZyZWUocnhfcmluZy0+ZmJyWzFdKTsKKyNlbmRpZgorCisJa2ZyZWUocnhfcmluZy0+ZmJyWzBdKTsKKworCS8qIFJlc2V0IENvdW50ZXJzICovCisJcnhfcmluZy0+bnVtX3JlYWR5X3JlY3YgPSAwOworfQorCisvKioKKyAqIGV0MTMxeF9pbml0X3JlY3YgLSBJbml0aWFsaXplIHJlY2VpdmUgZGF0YSBzdHJ1Y3R1cmVzLgorICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBhbmQgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKQorICovCitpbnQgZXQxMzF4X2luaXRfcmVjdihzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IHN0YXR1cyA9IC1FTk9NRU07CisJc3RydWN0IHJmZCAqcmZkID0gTlVMTDsKKwl1MzIgcmZkY3Q7CisJdTMyIG51bXJmZCA9IDA7CisJc3RydWN0IHJ4X3JpbmcgKnJ4X3Jpbmc7CisKKwkvKiBTZXR1cCBzb21lIGNvbnZlbmllbmNlIHBvaW50ZXJzICovCisJcnhfcmluZyA9ICZhZGFwdGVyLT5yeF9yaW5nOworCisJLyogU2V0dXAgZWFjaCBSRkQgKi8KKwlmb3IgKHJmZGN0ID0gMDsgcmZkY3QgPCByeF9yaW5nLT5udW1fcmZkOyByZmRjdCsrKSB7CisJCXJmZCA9IGttZW1fY2FjaGVfYWxsb2MocnhfcmluZy0+cmVjdl9sb29rYXNpZGUsCisJCQkJCQkgICAgIEdGUF9BVE9NSUMgfCBHRlBfRE1BKTsKKworCQlpZiAoIXJmZCkgeworCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCSAgIkNvdWxkbid0IGFsbG9jIFJGRCBvdXQgb2Yga21lbV9jYWNoZVxuIik7CisJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJY29udGludWU7CisJCX0KKworCQlyZmQtPnNrYiA9IE5VTEw7CisKKwkJLyogQWRkIHRoaXMgUkZEIHRvIHRoZSByZWN2X2xpc3QgKi8KKwkJbGlzdF9hZGRfdGFpbCgmcmZkLT5saXN0X25vZGUsICZyeF9yaW5nLT5yZWN2X2xpc3QpOworCisJCS8qIEluY3JlbWVudCBib3RoIHRoZSBhdmFpbGFibGUgUkZEJ3MsIGFuZCB0aGUgdG90YWwgUkZEJ3MuICovCisJCXJ4X3JpbmctPm51bV9yZWFkeV9yZWN2Kys7CisJCW51bXJmZCsrOworCX0KKworCWlmIChudW1yZmQgPiBOSUNfTUlOX05VTV9SRkQpCisJCXN0YXR1cyA9IDA7CisKKwlyeF9yaW5nLT5udW1fcmZkID0gbnVtcmZkOworCisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCWttZW1fY2FjaGVfZnJlZShyeF9yaW5nLT5yZWN2X2xvb2thc2lkZSwgcmZkKTsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJICAiQWxsb2NhdGlvbiBwcm9ibGVtcyBpbiBldDEzMXhfaW5pdF9yZWN2XG4iKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBldDEzMXhfc2V0X3J4X2RtYV90aW1lciAtIFNldCB0aGUgaGVhcnRiZWF0IHRpbWVyIGFjY29yZGluZyB0byBsaW5lIHJhdGUuCisgKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqLwordm9pZCBldDEzMXhfc2V0X3J4X2RtYV90aW1lcihzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGFkYXB0ZXItPnBoeWRldjsKKworCWlmICghcGh5ZGV2KQorCQlyZXR1cm47CisKKwkvKiBGb3IgdmVyc2lvbiBCIHNpbGljb24sIHdlIGRvIG5vdCB1c2UgdGhlIFJ4RE1BIHRpbWVyIGZvciAxMCBhbmQgMTAwCisJICogTWJpdHMvcyBsaW5lIHJhdGVzLiBXZSBkbyBub3QgZW5hYmxlIGFuZCBSeERNQSBpbnRlcnJ1cHQgY29hbGVzY2luZy4KKwkgKi8KKwlpZiAoKHBoeWRldi0+c3BlZWQgPT0gU1BFRURfMTAwKSB8fCAocGh5ZGV2LT5zcGVlZCA9PSBTUEVFRF8xMCkpIHsKKwkJd3JpdGVsKDAsICZhZGFwdGVyLT5yZWdzLT5yeGRtYS5tYXhfcGt0X3RpbWUpOworCQl3cml0ZWwoMSwgJmFkYXB0ZXItPnJlZ3MtPnJ4ZG1hLm51bV9wa3RfZG9uZSk7CisJfQorfQorCisvKioKKyAqIE5JQ1JldHVyblJGRCAtIFJlY3ljbGUgYSBSRkQgYW5kIHB1dCBpdCBiYWNrIG9udG8gdGhlIHJlY2VpdmUgbGlzdAorICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAqIEByZmQ6IHBvaW50ZXIgdG8gdGhlIFJGRAorICovCitzdGF0aWMgdm9pZCBuaWNfcmV0dXJuX3JmZChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCByZmQgKnJmZCkKK3sKKwlzdHJ1Y3QgcnhfcmluZyAqcnhfbG9jYWwgPSAmYWRhcHRlci0+cnhfcmluZzsKKwlzdHJ1Y3QgcnhkbWFfcmVncyBfX2lvbWVtICpyeF9kbWEgPSAmYWRhcHRlci0+cmVncy0+cnhkbWE7CisJdTE2IGJ1ZmZfaW5kZXggPSByZmQtPmJ1ZmZlcmluZGV4OworCXU4IHJpbmdfaW5kZXggPSByZmQtPnJpbmdpbmRleDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogV2UgZG9uJ3QgdXNlIGFueSBvZiB0aGUgT09CIGRhdGEgYmVzaWRlcyBzdGF0dXMuIE90aGVyd2lzZSwgd2UKKwkgKiBuZWVkIHRvIGNsZWFuIHVwIE9PQiBkYXRhCisJICovCisJaWYgKAorI2lmZGVmIFVTRV9GQlIwCisJICAgIChyaW5nX2luZGV4ID09IDAgJiYgYnVmZl9pbmRleCA8IHJ4X2xvY2FsLT5mYnJbMV0tPm51bV9lbnRyaWVzKSB8fAorI2VuZGlmCisJICAgIChyaW5nX2luZGV4ID09IDEgJiYgYnVmZl9pbmRleCA8IHJ4X2xvY2FsLT5mYnJbMF0tPm51bV9lbnRyaWVzKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+ZmJyX2xvY2ssIGZsYWdzKTsKKworCQlpZiAocmluZ19pbmRleCA9PSAxKSB7CisJCQlzdHJ1Y3QgZmJyX2Rlc2MgKm5leHQgPSAoc3RydWN0IGZicl9kZXNjICopCisJCQkJCShyeF9sb2NhbC0+ZmJyWzBdLT5yaW5nX3ZpcnRhZGRyKSArCisJCQkJCUlOREVYMTAocnhfbG9jYWwtPmZiclswXS0+bG9jYWxfZnVsbCk7CisKKwkJCS8qIEhhbmRsZSB0aGUgRnJlZSBCdWZmZXIgUmluZyBhZHZhbmNlbWVudCBoZXJlLiBXcml0ZQorCQkJICogdGhlIFBBIC8gQnVmZmVyIEluZGV4IGZvciB0aGUgcmV0dXJuZWQgYnVmZmVyIGludG8KKwkJCSAqIHRoZSBvbGRlc3QgKG5leHQgdG8gYmUgZnJlZWQpRkJSIGVudHJ5CisJCQkgKi8KKwkJCW5leHQtPmFkZHJfaGkgPSByeF9sb2NhbC0+ZmJyWzBdLT5idXNfaGlnaFtidWZmX2luZGV4XTsKKwkJCW5leHQtPmFkZHJfbG8gPSByeF9sb2NhbC0+ZmJyWzBdLT5idXNfbG93W2J1ZmZfaW5kZXhdOworCQkJbmV4dC0+d29yZDIgPSBidWZmX2luZGV4OworCisJCQl3cml0ZWwoYnVtcF9mcmVlX2J1ZmZfcmluZygKKwkJCQkJJnJ4X2xvY2FsLT5mYnJbMF0tPmxvY2FsX2Z1bGwsCisJCQkJCXJ4X2xvY2FsLT5mYnJbMF0tPm51bV9lbnRyaWVzIC0gMSksCisJCQkJCSZyeF9kbWEtPmZicjFfZnVsbF9vZmZzZXQpOworCQl9CisjaWZkZWYgVVNFX0ZCUjAKKwkJZWxzZSB7CisJCQlzdHJ1Y3QgZmJyX2Rlc2MgKm5leHQgPSAoc3RydWN0IGZicl9kZXNjICopCisJCQkJcnhfbG9jYWwtPmZiclsxXS0+cmluZ192aXJ0YWRkciArCisJCQkJICAgIElOREVYMTAocnhfbG9jYWwtPmZiclsxXS0+bG9jYWxfZnVsbCk7CisKKwkJCS8qIEhhbmRsZSB0aGUgRnJlZSBCdWZmZXIgUmluZyBhZHZhbmNlbWVudCBoZXJlLiBXcml0ZQorCQkJICogdGhlIFBBIC8gQnVmZmVyIEluZGV4IGZvciB0aGUgcmV0dXJuZWQgYnVmZmVyIGludG8KKwkJCSAqIHRoZSBvbGRlc3QgKG5leHQgdG8gYmUgZnJlZWQpIEZCUiBlbnRyeQorCQkJICovCisJCQluZXh0LT5hZGRyX2hpID0gcnhfbG9jYWwtPmZiclsxXS0+YnVzX2hpZ2hbYnVmZl9pbmRleF07CisJCQluZXh0LT5hZGRyX2xvID0gcnhfbG9jYWwtPmZiclsxXS0+YnVzX2xvd1tidWZmX2luZGV4XTsKKwkJCW5leHQtPndvcmQyID0gYnVmZl9pbmRleDsKKworCQkJd3JpdGVsKGJ1bXBfZnJlZV9idWZmX3JpbmcoCisJCQkJCSZyeF9sb2NhbC0+ZmJyWzFdLT5sb2NhbF9mdWxsLAorCQkJCQlyeF9sb2NhbC0+ZmJyWzFdLT5udW1fZW50cmllcyAtIDEpLAorCQkJICAgICAgICZyeF9kbWEtPmZicjBfZnVsbF9vZmZzZXQpOworCQl9CisjZW5kaWYKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+ZmJyX2xvY2ssIGZsYWdzKTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkgICIlcyBpbGxlZ2FsIEJ1ZmZlciBJbmRleCByZXR1cm5lZFxuIiwgX19mdW5jX18pOworCX0KKworCS8qIFRoZSBwcm9jZXNzaW5nIG9uIHRoaXMgUkZEIGlzIGRvbmUsIHNvIHB1dCBpdCBiYWNrIG9uIHRoZSB0YWlsIG9mCisJICogb3VyIGxpc3QKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+cmN2X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZyZmQtPmxpc3Rfbm9kZSwgJnJ4X2xvY2FsLT5yZWN2X2xpc3QpOworCXJ4X2xvY2FsLT5udW1fcmVhZHlfcmVjdisrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnJjdl9sb2NrLCBmbGFncyk7CisKKwlXQVJOX09OKHJ4X2xvY2FsLT5udW1fcmVhZHlfcmVjdiA+IHJ4X2xvY2FsLT5udW1fcmZkKTsKK30KKworc3RhdGljIHN0cnVjdCByZmQgKm5pY19yeF9wa3RzKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgcnhfcmluZyAqcnhfbG9jYWwgPSAmYWRhcHRlci0+cnhfcmluZzsKKwlzdHJ1Y3Qgcnhfc3RhdHVzX2Jsb2NrICpzdGF0dXM7CisJc3RydWN0IHBrdF9zdGF0X2Rlc2MgKnBzcjsKKwlzdHJ1Y3QgcmZkICpyZmQ7CisJdTMyIGk7CisJdTggKmJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7CisJdTggcmluZ19pbmRleDsKKwl1MTYgYnVmZl9pbmRleDsKKwl1MzIgbGVuOworCXUzMiB3b3JkMDsKKwl1MzIgd29yZDE7CisKKwkvKiBSWCBTdGF0dXMgYmxvY2sgaXMgd3JpdHRlbiBieSB0aGUgRE1BIGVuZ2luZSBwcmlvciB0byBldmVyeQorCSAqIGludGVycnVwdC4gSXQgY29udGFpbnMgdGhlIG5leHQgdG8gYmUgdXNlZCBlbnRyeSBpbiB0aGUgUGFja2V0CisJICogU3RhdHVzIFJpbmcsIGFuZCBhbHNvIHRoZSB0d28gRnJlZSBCdWZmZXIgcmluZ3MuCisJICovCisJc3RhdHVzID0gcnhfbG9jYWwtPnJ4X3N0YXR1c19ibG9jazsKKwl3b3JkMSA9IHN0YXR1cy0+d29yZDEgPj4gMTY7CS8qIEdldCB0aGUgdXNlZnVsIGJpdHMgKi8KKworCS8qIENoZWNrIHRoZSBQU1IgYW5kIHdyYXAgYml0cyBkbyBub3QgbWF0Y2ggKi8KKwlpZiAoKHdvcmQxICYgMHgxRkZGKSA9PSAocnhfbG9jYWwtPmxvY2FsX3Bzcl9mdWxsICYgMHgxRkZGKSkKKwkJLyogTG9va3MgbGlrZSB0aGlzIHJpbmcgaXMgbm90IHVwZGF0ZWQgeWV0ICovCisJCXJldHVybiBOVUxMOworCisJLyogVGhlIHBhY2tldCBzdGF0dXMgcmluZyBpbmRpY2F0ZXMgdGhhdCBkYXRhIGlzIGF2YWlsYWJsZS4gKi8KKwlwc3IgPSAoc3RydWN0IHBrdF9zdGF0X2Rlc2MgKikgKHJ4X2xvY2FsLT5wc19yaW5nX3ZpcnRhZGRyKSArCisJCQkocnhfbG9jYWwtPmxvY2FsX3Bzcl9mdWxsICYgMHhGRkYpOworCisJLyogR3JhYiBhbnkgaW5mb3JtYXRpb24gdGhhdCBpcyByZXF1aXJlZCBvbmNlIHRoZSBQU1IgaXMKKwkgKiBhZHZhbmNlZCwgc2luY2Ugd2UgY2FuIG5vIGxvbmdlciByZWx5IG9uIHRoZSBtZW1vcnkgYmVpbmcKKwkgKiBhY2N1cmF0ZQorCSAqLworCWxlbiA9IHBzci0+d29yZDEgJiAweEZGRkY7CisJcmluZ19pbmRleCA9IChwc3ItPndvcmQxID4+IDI2KSAmIDB4MDM7CisJYnVmZl9pbmRleCA9IChwc3ItPndvcmQxID4+IDE2KSAmIDB4M0ZGOworCXdvcmQwID0gcHNyLT53b3JkMDsKKworCS8qIEluZGljYXRlIHRoYXQgd2UgaGF2ZSB1c2VkIHRoaXMgUFNSIGVudHJ5LiAqLworCS8qIEZJWE1FIHdyYXAgMTIgKi8KKwlhZGRfMTJiaXQoJnJ4X2xvY2FsLT5sb2NhbF9wc3JfZnVsbCwgMSk7CisJaWYgKAorCSAgKHJ4X2xvY2FsLT5sb2NhbF9wc3JfZnVsbCAmIDB4RkZGKSA+IHJ4X2xvY2FsLT5wc3JfbnVtX2VudHJpZXMgLSAxKSB7CisJCS8qIENsZWFyIHBzciBmdWxsIGFuZCB0b2dnbGUgdGhlIHdyYXAgYml0ICovCisJCXJ4X2xvY2FsLT5sb2NhbF9wc3JfZnVsbCAmPSAgfjB4RkZGOworCQlyeF9sb2NhbC0+bG9jYWxfcHNyX2Z1bGwgXj0gMHgxMDAwOworCX0KKworCXdyaXRlbChyeF9sb2NhbC0+bG9jYWxfcHNyX2Z1bGwsCisJICAgICAgICZhZGFwdGVyLT5yZWdzLT5yeGRtYS5wc3JfZnVsbF9vZmZzZXQpOworCisjaWZuZGVmIFVTRV9GQlIwCisJaWYgKHJpbmdfaW5kZXggIT0gMSkKKwkJcmV0dXJuIE5VTEw7CisjZW5kaWYKKworI2lmZGVmIFVTRV9GQlIwCisJaWYgKHJpbmdfaW5kZXggPiAxIHx8CisJCShyaW5nX2luZGV4ID09IDAgJiYKKwkJYnVmZl9pbmRleCA+IHJ4X2xvY2FsLT5mYnJbMV0tPm51bV9lbnRyaWVzIC0gMSkgfHwKKwkJKHJpbmdfaW5kZXggPT0gMSAmJgorCQlidWZmX2luZGV4ID4gcnhfbG9jYWwtPmZiclswXS0+bnVtX2VudHJpZXMgLSAxKSkKKyNlbHNlCisJaWYgKHJpbmdfaW5kZXggIT0gMSB8fCBidWZmX2luZGV4ID4gcnhfbG9jYWwtPmZiclswXS0+bnVtX2VudHJpZXMgLSAxKQorI2VuZGlmCisJeworCQkvKiBJbGxlZ2FsIGJ1ZmZlciBvciByaW5nIGluZGV4IGNhbm5vdCBiZSB1c2VkIGJ5IFMvVyovCisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSAgIk5JQ1J4UGt0cyBQU1IgRW50cnkgJWQgaW5kaWNhdGVzICIKKwkJCSAgImxlbmd0aCBvZiAlZCBhbmQvb3IgYmFkIGJpKCVkKVxuIiwKKwkJCSAgcnhfbG9jYWwtPmxvY2FsX3Bzcl9mdWxsICYgMHhGRkYsCisJCQkgIGxlbiwgYnVmZl9pbmRleCk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIEdldCBhbmQgZmlsbCB0aGUgUkZELiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5yY3ZfbG9jaywgZmxhZ3MpOworCisJcmZkID0gTlVMTDsKKwllbGVtZW50ID0gcnhfbG9jYWwtPnJlY3ZfbGlzdC5uZXh0OworCXJmZCA9IChzdHJ1Y3QgcmZkICopIGxpc3RfZW50cnkoZWxlbWVudCwgc3RydWN0IHJmZCwgbGlzdF9ub2RlKTsKKworCWlmIChyZmQgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5yY3ZfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlsaXN0X2RlbCgmcmZkLT5saXN0X25vZGUpOworCXJ4X2xvY2FsLT5udW1fcmVhZHlfcmVjdi0tOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+cmN2X2xvY2ssIGZsYWdzKTsKKworCXJmZC0+YnVmZmVyaW5kZXggPSBidWZmX2luZGV4OworCXJmZC0+cmluZ2luZGV4ID0gcmluZ19pbmRleDsKKworCS8qIEluIFYxIHNpbGljb24sIHRoZXJlIGlzIGEgYnVnIHdoaWNoIHNjcmV3cyB1cCBmaWx0ZXJpbmcgb2YKKwkgKiBydW50IHBhY2tldHMuICBUaGVyZWZvcmUgcnVudCBwYWNrZXQgZmlsdGVyaW5nIGlzIGRpc2FibGVkCisJICogaW4gdGhlIE1BQyBhbmQgdGhlIHBhY2tldHMgYXJlIGRyb3BwZWQgaGVyZS4gIFRoZXkgYXJlCisJICogYWxzbyBjb3VudGVkIGhlcmUuCisJICovCisJaWYgKGxlbiA8IChOSUNfTUlOX1BBQ0tFVF9TSVpFICsgNCkpIHsKKwkJYWRhcHRlci0+c3RhdHMucnhfb3RoZXJfZXJycysrOworCQlsZW4gPSAwOworCX0KKworCWlmIChsZW4pIHsKKwkJLyogRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBtdWx0aWNhc3QgcGFja2V0IGNvbWluZyBpbiAqLworCQlpZiAoKHdvcmQwICYgQUxDQVRFTF9NVUxUSUNBU1RfUEtUKSAmJgorCQkgICAgISh3b3JkMCAmIEFMQ0FURUxfQlJPQURDQVNUX1BLVCkpIHsKKwkJCS8qIFByb21pc2N1b3VzIG1vZGUgYW5kIE11bHRpY2FzdCBtb2RlIGFyZQorCQkJICogbm90IG11dHVhbGx5IGV4Y2x1c2l2ZSBhcyB3YXMgZmlyc3QKKwkJCSAqIHRob3VnaHQuICBJIGd1ZXNzIFByb21pc2N1b3VzIGlzIGp1c3QKKwkJCSAqIGNvbnNpZGVyZWQgYSBzdXBlci1zZXQgb2YgdGhlIG90aGVyCisJCQkgKiBmaWx0ZXJzLiBHZW5lcmFsbHkgZmlsdGVyIGlzIDB4MmIgd2hlbiBpbgorCQkJICogcHJvbWlzY3VvdXMgbW9kZS4KKwkJCSAqLworCQkJaWYgKChhZGFwdGVyLT5wYWNrZXRfZmlsdGVyICYKKwkJCQkJRVQxMzFYX1BBQ0tFVF9UWVBFX01VTFRJQ0FTVCkKKwkJCSAgICAmJiAhKGFkYXB0ZXItPnBhY2tldF9maWx0ZXIgJgorCQkJCQlFVDEzMVhfUEFDS0VUX1RZUEVfUFJPTUlTQ1VPVVMpCisJCQkgICAgJiYgIShhZGFwdGVyLT5wYWNrZXRfZmlsdGVyICYKKwkJCQkJRVQxMzFYX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1QpKSB7CisJCQkJLyoKKwkJCQkgKiBOb3RlIC0gcmluZ19pbmRleCBmb3IgZmJyW10gYXJyYXkgaXMgcmV2ZXJzZWQKKwkJCQkgKiAxIGZvciBGQlIwIGV0YworCQkJCSAqLworCQkJCWJ1ZiA9IHJ4X2xvY2FsLT5mYnJbKHJpbmdfaW5kZXggPT0gMCA/IDEgOiAwKV0tPgorCQkJCQkJdmlydFtidWZmX2luZGV4XTsKKworCQkJCS8qIExvb3AgdGhyb3VnaCBvdXIgbGlzdCB0byBzZWUgaWYgdGhlCisJCQkJICogZGVzdGluYXRpb24gYWRkcmVzcyBvZiB0aGlzIHBhY2tldAorCQkJCSAqIG1hdGNoZXMgb25lIGluIG91ciBsaXN0LgorCQkJCSAqLworCQkJCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5tdWx0aWNhc3RfYWRkcl9jb3VudDsKKwkJCQkgICAgIGkrKykgeworCQkJCQlpZiAoYnVmWzBdID09CisJCQkJCQlhZGFwdGVyLT5tdWx0aWNhc3RfbGlzdFtpXVswXQorCQkJCQkgICAgJiYgYnVmWzFdID09CisJCQkJCQlhZGFwdGVyLT5tdWx0aWNhc3RfbGlzdFtpXVsxXQorCQkJCQkgICAgJiYgYnVmWzJdID09CisJCQkJCQlhZGFwdGVyLT5tdWx0aWNhc3RfbGlzdFtpXVsyXQorCQkJCQkgICAgJiYgYnVmWzNdID09CisJCQkJCQlhZGFwdGVyLT5tdWx0aWNhc3RfbGlzdFtpXVszXQorCQkJCQkgICAgJiYgYnVmWzRdID09CisJCQkJCQlhZGFwdGVyLT5tdWx0aWNhc3RfbGlzdFtpXVs0XQorCQkJCQkgICAgJiYgYnVmWzVdID09CisJCQkJCQlhZGFwdGVyLT5tdWx0aWNhc3RfbGlzdFtpXVs1XSkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvKiBJZiBvdXIgaW5kZXggaXMgZXF1YWwgdG8gdGhlIG51bWJlcgorCQkJCSAqIG9mIE11bHRpY2FzdCBhZGRyZXNzIHdlIGhhdmUsIHRoZW4KKwkJCQkgKiB0aGlzIG1lYW5zIHdlIGRpZCBub3QgZmluZCB0aGlzCisJCQkJICogcGFja2V0J3MgbWF0Y2hpbmcgYWRkcmVzcyBpbiBvdXIKKwkJCQkgKiBsaXN0LiAgU2V0IHRoZSBsZW4gdG8gemVybywKKwkJCQkgKiBzbyB3ZSBmcmVlIG91ciBSRkQgd2hlbiB3ZSByZXR1cm4KKwkJCQkgKiBmcm9tIHRoaXMgZnVuY3Rpb24uCisJCQkJICovCisJCQkJaWYgKGkgPT0gYWRhcHRlci0+bXVsdGljYXN0X2FkZHJfY291bnQpCisJCQkJCWxlbiA9IDA7CisJCQl9CisKKwkJCWlmIChsZW4gPiAwKQorCQkJCWFkYXB0ZXItPnN0YXRzLm11bHRpY2FzdF9wa3RzX3JjdmQrKzsKKwkJfSBlbHNlIGlmICh3b3JkMCAmIEFMQ0FURUxfQlJPQURDQVNUX1BLVCkKKwkJCWFkYXB0ZXItPnN0YXRzLmJyb2FkY2FzdF9wa3RzX3JjdmQrKzsKKwkJZWxzZQorCQkJLyogTm90IHN1cmUgd2hhdCB0aGlzIGNvdW50ZXIgbWVhc3VyZXMgaW4KKwkJCSAqIHByb21pc2N1b3VzIG1vZGUuIFBlcmhhcHMgd2Ugc2hvdWxkIGNoZWNrCisJCQkgKiB0aGUgTUFDIGFkZHJlc3MgdG8gc2VlIGlmIGl0IGlzIGRpcmVjdGVkCisJCQkgKiB0byB1cyBpbiBwcm9taXNjdW91cyBtb2RlLgorCQkJICovCisJCQlhZGFwdGVyLT5zdGF0cy51bmljYXN0X3BrdHNfcmN2ZCsrOworCX0KKworCWlmIChsZW4gPiAwKSB7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCisJCS8qcmZkLT5sZW4gPSBsZW4gLSA0OyAqLworCQlyZmQtPmxlbiA9IGxlbjsKKworCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHJmZC0+bGVuICsgMik7CisJCWlmICghc2tiKSB7CisJCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkJICAiQ291bGRuJ3QgYWxsb2MgYW4gU0tCIGZvciBSeFxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWFkYXB0ZXItPm5ldF9zdGF0cy5yeF9ieXRlcyArPSByZmQtPmxlbjsKKworCQkvKgorCQkgKiBOb3RlIC0gcmluZ19pbmRleCBmb3IgZmJyW10gYXJyYXkgaXMgcmV2ZXJzZWQsCisJCSAqIDEgZm9yIEZCUjAgZXRjCisJCSAqLworCQltZW1jcHkoc2tiX3B1dChza2IsIHJmZC0+bGVuKSwKKwkJICAgIHJ4X2xvY2FsLT5mYnJbKHJpbmdfaW5kZXggPT0gMCA/IDEgOiAwKV0tPnZpcnRbYnVmZl9pbmRleF0sCisJCSAgICByZmQtPmxlbik7CisKKwkJc2tiLT5kZXYgPSBhZGFwdGVyLT5uZXRkZXY7CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGFkYXB0ZXItPm5ldGRldik7CisJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKKworCQluZXRpZl9yeChza2IpOworCX0gZWxzZSB7CisJCXJmZC0+bGVuID0gMDsKKwl9CisKKwluaWNfcmV0dXJuX3JmZChhZGFwdGVyLCByZmQpOworCXJldHVybiByZmQ7Cit9CisKKy8qKgorICogZXQxMzF4X2hhbmRsZV9yZWN2X2ludGVycnVwdCAtIEludGVycnVwdCBoYW5kbGVyIGZvciByZWNlaXZlIHByb2Nlc3NpbmcKKyAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBhZGFwdGVyCisgKgorICogQXNzdW1wdGlvbiwgUmN2IHNwaW5sb2NrIGhhcyBiZWVuIGFjcXVpcmVkLgorICovCit2b2lkIGV0MTMxeF9oYW5kbGVfcmVjdl9pbnRlcnJ1cHQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCByZmQgKnJmZCA9IE5VTEw7CisJdTMyIGNvdW50ID0gMDsKKwlib29sIGRvbmUgPSB0cnVlOworCisJLyogUHJvY2VzcyB1cCB0byBhdmFpbGFibGUgUkZEJ3MgKi8KKwl3aGlsZSAoY291bnQgPCBOVU1fUEFDS0VUU19IQU5ETEVEKSB7CisJCWlmIChsaXN0X2VtcHR5KCZhZGFwdGVyLT5yeF9yaW5nLnJlY3ZfbGlzdCkpIHsKKwkJCVdBUk5fT04oYWRhcHRlci0+cnhfcmluZy5udW1fcmVhZHlfcmVjdiAhPSAwKTsKKwkJCWRvbmUgPSBmYWxzZTsKKwkJCWJyZWFrOworCQl9CisKKwkJcmZkID0gbmljX3J4X3BrdHMoYWRhcHRlcik7CisKKwkJaWYgKHJmZCA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwkJLyogRG8gbm90IHJlY2VpdmUgYW55IHBhY2tldHMgdW50aWwgYSBmaWx0ZXIgaGFzIGJlZW4gc2V0LgorCQkgKiBEbyBub3QgcmVjZWl2ZSBhbnkgcGFja2V0cyB1bnRpbCB3ZSBoYXZlIGxpbmsuCisJCSAqIElmIGxlbmd0aCBpcyB6ZXJvLCByZXR1cm4gdGhlIFJGRCBpbiBvcmRlciB0byBhZHZhbmNlIHRoZQorCQkgKiBGcmVlIGJ1ZmZlciByaW5nLgorCQkgKi8KKwkJaWYgKCFhZGFwdGVyLT5wYWNrZXRfZmlsdGVyIHx8CisJCSAgICAhbmV0aWZfY2Fycmllcl9vayhhZGFwdGVyLT5uZXRkZXYpIHx8CisJCSAgICByZmQtPmxlbiA9PSAwKQorCQkJY29udGludWU7CisKKwkJLyogSW5jcmVtZW50IHRoZSBudW1iZXIgb2YgcGFja2V0cyB3ZSByZWNlaXZlZCAqLworCQlhZGFwdGVyLT5uZXRfc3RhdHMucnhfcGFja2V0cysrOworCisJCS8qIFNldCB0aGUgc3RhdHVzIG9uIHRoZSBwYWNrZXQsIGVpdGhlciByZXNvdXJjZXMgb3Igc3VjY2VzcyAqLworCQlpZiAoYWRhcHRlci0+cnhfcmluZy5udW1fcmVhZHlfcmVjdiA8IFJGRF9MT1dfV0FURVJfTUFSSykgeworCQkJZGV2X3dhcm4oJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkgICAgIlJGRCdzIGFyZSBydW5uaW5nIG91dFxuIik7CisJCX0KKwkJY291bnQrKzsKKwl9CisKKwlpZiAoY291bnQgPT0gTlVNX1BBQ0tFVFNfSEFORExFRCB8fCAhZG9uZSkgeworCQlhZGFwdGVyLT5yeF9yaW5nLnVuZmluaXNoZWRfcmVjZWl2ZXMgPSB0cnVlOworCQl3cml0ZWwoUEFSTV9UWF9USU1FX0lOVF9ERUYgKiBOQU5PX0lOX0FfTUlDUk8sCisJCSAgICAgICAmYWRhcHRlci0+cmVncy0+Z2xvYmFsLndhdGNoZG9nX3RpbWVyKTsKKwl9IGVsc2UKKwkJLyogV2F0Y2hkb2cgdGltZXIgd2lsbCBkaXNhYmxlIGl0c2VsZiBpZiBhcHByb3ByaWF0ZS4gKi8KKwkJYWRhcHRlci0+cnhfcmluZy51bmZpbmlzaGVkX3JlY2VpdmVzID0gZmFsc2U7Cit9CisKKy8qIFRYIGZ1bmN0aW9ucyAqLworCisvKioKKyAqIGV0MTMxeF90eF9kbWFfbWVtb3J5X2FsbG9jCisgKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpLgorICoKKyAqIEFsbG9jYXRlcyBtZW1vcnkgdGhhdCB3aWxsIGJlIHZpc2libGUgYm90aCB0byB0aGUgZGV2aWNlIGFuZCB0byB0aGUgQ1BVLgorICogVGhlIE9TIHdpbGwgcGFzcyB1cyBwYWNrZXRzLCBwb2ludGVycyB0byB3aGljaCB3ZSB3aWxsIGluc2VydCBpbiB0aGUgVHgKKyAqIERlc2NyaXB0b3IgcXVldWUuIFRoZSBkZXZpY2Ugd2lsbCByZWFkIHRoaXMgcXVldWUgdG8gZmluZCB0aGUgcGFja2V0cyBpbgorICogbWVtb3J5LiBUaGUgZGV2aWNlIHdpbGwgdXBkYXRlIHRoZSAic3RhdHVzIiBpbiBtZW1vcnkgZWFjaCB0aW1lIGl0IHhtaXRzIGEKKyAqIHBhY2tldC4KKyAqLworaW50IGV0MTMxeF90eF9kbWFfbWVtb3J5X2FsbG9jKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgZGVzY19zaXplID0gMDsKKwlzdHJ1Y3QgdHhfcmluZyAqdHhfcmluZyA9ICZhZGFwdGVyLT50eF9yaW5nOworCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgVENCJ3MgKFRyYW5zbWl0IENvbnRyb2wgQmxvY2spICovCisJYWRhcHRlci0+dHhfcmluZy50Y2JfcmluZyA9CisJCWtjYWxsb2MoTlVNX1RDQiwgc2l6ZW9mKHN0cnVjdCB0Y2IpLCBHRlBfQVRPTUlDIHwgR0ZQX0RNQSk7CisJaWYgKCFhZGFwdGVyLT50eF9yaW5nLnRjYl9yaW5nKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIkNhbm5vdCBhbGxvYyBtZW1vcnkgZm9yIFRDQnNcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBBbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IGZvciB0aGUgVHggZGVzY3JpcHRvciByaW5nLCBhbmQgYWxsb2NhdGUKKwkgKiBzb21lIGV4dHJhIHNvIHRoYXQgdGhlIHJpbmcgY2FuIGJlIGFsaWduZWQgb24gYSA0ayBib3VuZGFyeS4KKwkgKi8KKwlkZXNjX3NpemUgPSAoc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqIE5VTV9ERVNDX1BFUl9SSU5HX1RYKSArIDQwOTYgLSAxOworCXR4X3JpbmctPnR4X2Rlc2NfcmluZyA9CisJICAgIChzdHJ1Y3QgdHhfZGVzYyAqKSBkbWFfYWxsb2NfY29oZXJlbnQoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkJCSAgZGVzY19zaXplLAorCQkJCQkJICAmdHhfcmluZy0+dHhfZGVzY19yaW5nX3BhLAorCQkJCQkJICBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkYXB0ZXItPnR4X3JpbmcudHhfZGVzY19yaW5nKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSJDYW5ub3QgYWxsb2MgbWVtb3J5IGZvciBUeCBSaW5nXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogU2F2ZSBwaHlzaWNhbCBhZGRyZXNzCisJICoKKwkgKiBOT1RFOiBkbWFfYWxsb2NfY29oZXJlbnQoKSwgdXNlZCBhYm92ZSB0byBhbGxvYyBETUEgcmVnaW9ucywKKwkgKiBBTFdBWVMgcmV0dXJucyBTQUMgKDMyLWJpdCkgYWRkcmVzc2VzLiBJZiBEQUMgKDY0LWJpdCkgYWRkcmVzc2VzCisJICogYXJlIGV2ZXIgcmV0dXJuZWQsIG1ha2Ugc3VyZSB0aGUgaGlnaCBwYXJ0IGlzIHJldHJpZXZlZCBoZXJlIGJlZm9yZQorCSAqIHN0b3JpbmcgdGhlIGFkanVzdGVkIGFkZHJlc3MuCisJICovCisJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgVHggc3RhdHVzIGJsb2NrICovCisJdHhfcmluZy0+dHhfc3RhdHVzID0gZG1hX2FsbG9jX2NvaGVyZW50KCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkJCQkgICAgc2l6ZW9mKHUzMiksCisJCQkJCQkgICAgJnR4X3JpbmctPnR4X3N0YXR1c19wYSwKKwkJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkYXB0ZXItPnR4X3JpbmcudHhfc3RhdHVzX3BhKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkgICJDYW5ub3QgYWxsb2MgbWVtb3J5IGZvciBUeCBzdGF0dXMgYmxvY2tcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZXQxMzF4X3R4X2RtYV9tZW1vcnlfZnJlZSAtIEZyZWUgYWxsIG1lbW9yeSBhbGxvY2F0ZWQgd2l0aGluIHRoaXMgbW9kdWxlCisgKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIGFuZCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpLgorICovCit2b2lkIGV0MTMxeF90eF9kbWFfbWVtb3J5X2ZyZWUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBkZXNjX3NpemUgPSAwOworCisJaWYgKGFkYXB0ZXItPnR4X3JpbmcudHhfZGVzY19yaW5nKSB7CisJCS8qIEZyZWUgbWVtb3J5IHJlbGF0aW5nIHRvIFR4IHJpbmdzIGhlcmUgKi8KKwkJZGVzY19zaXplID0gKHNpemVvZihzdHJ1Y3QgdHhfZGVzYykgKiBOVU1fREVTQ19QRVJfUklOR19UWCkKKwkJCQkJCQkJKyA0MDk2IC0gMTsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkgICAgZGVzY19zaXplLAorCQkJCSAgICBhZGFwdGVyLT50eF9yaW5nLnR4X2Rlc2NfcmluZywKKwkJCQkgICAgYWRhcHRlci0+dHhfcmluZy50eF9kZXNjX3JpbmdfcGEpOworCQlhZGFwdGVyLT50eF9yaW5nLnR4X2Rlc2NfcmluZyA9IE5VTEw7CisJfQorCisJLyogRnJlZSBtZW1vcnkgZm9yIHRoZSBUeCBzdGF0dXMgYmxvY2sgKi8KKwlpZiAoYWRhcHRlci0+dHhfcmluZy50eF9zdGF0dXMpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkgICAgc2l6ZW9mKHUzMiksCisJCQkJICAgIGFkYXB0ZXItPnR4X3JpbmcudHhfc3RhdHVzLAorCQkJCSAgICBhZGFwdGVyLT50eF9yaW5nLnR4X3N0YXR1c19wYSk7CisKKwkJYWRhcHRlci0+dHhfcmluZy50eF9zdGF0dXMgPSBOVUxMOworCX0KKwkvKiBGcmVlIHRoZSBtZW1vcnkgZm9yIHRoZSB0Y2Igc3RydWN0dXJlcyAqLworCWtmcmVlKGFkYXB0ZXItPnR4X3JpbmcudGNiX3JpbmcpOworfQorCisvKioKKyAqIG5pY19zZW5kX3BhY2tldCAtIE5JQyBzcGVjaWZpYyBzZW5kIGhhbmRsZXIgZm9yIHZlcnNpb24gQiBzaWxpY29uLgorICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAqIEB0Y2I6IHBvaW50ZXIgdG8gc3RydWN0IHRjYgorICoKKyAqIFJldHVybnMgMCBvciBlcnJuby4KKyAqLworc3RhdGljIGludCBuaWNfc2VuZF9wYWNrZXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgdGNiICp0Y2IpCit7CisJdTMyIGk7CisJc3RydWN0IHR4X2Rlc2MgZGVzY1syNF07CS8qIDI0IHggMTYgYnl0ZSAqLworCXUzMiBmcmFnID0gMDsKKwl1MzIgdGhpc2NvcHksIHJlbWFpbmRlcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdGNiLT5za2I7CisJdTMyIG5yX2ZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDE7CisJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZ3MgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1swXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBhZGFwdGVyLT5waHlkZXY7CisKKwkvKiBQYXJ0IG9mIHRoZSBvcHRpbWl6YXRpb25zIG9mIHRoaXMgc2VuZCByb3V0aW5lIHJlc3RyaWN0IHVzIHRvCisJICogc2VuZGluZyAyNCBmcmFnbWVudHMgYXQgYSBwYXNzLiAgSW4gcHJhY3RpY2Ugd2Ugc2hvdWxkIG5ldmVyIHNlZQorCSAqIG1vcmUgdGhhbiA1IGZyYWdtZW50cy4KKwkgKgorCSAqIE5PVEU6IFRoZSBvbGRlciB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gKGJlbG93KSBjYW4gaGFuZGxlIGFueQorCSAqIG51bWJlciBvZiBmcmFnbWVudHMuIElmIG5lZWRlZCwgd2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiwKKwkgKiBhbHRob3VnaCBpdCBpcyBsZXNzIGVmZmljaWVudC4KKwkgKi8KKwlpZiAobnJfZnJhZ3MgPiAyMykKKwkJcmV0dXJuIC1FSU87CisKKwltZW1zZXQoZGVzYywgMCwgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqIChucl9mcmFncyArIDEpKTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9mcmFnczsgaSsrKSB7CisJCS8qIElmIHRoZXJlIGlzIHNvbWV0aGluZyBpbiB0aGlzIGVsZW1lbnQsIGxldHMgZ2V0IGEKKwkJICogZGVzY3JpcHRvciBmcm9tIHRoZSByaW5nIGFuZCBnZXQgdGhlIG5lY2Vzc2FyeSBkYXRhCisJCSAqLworCQlpZiAoaSA9PSAwKSB7CisJCQkvKiBJZiB0aGUgZnJhZ21lbnRzIGFyZSBzbWFsbGVyIHRoYW4gYSBzdGFuZGFyZCBNVFUsCisJCQkgKiB0aGVuIG1hcCB0aGVtIHRvIGEgc2luZ2xlIGRlc2NyaXB0b3IgaW4gdGhlIFR4CisJCQkgKiBEZXNjIHJpbmcuIEhvd2V2ZXIsIGlmIHRoZXkncmUgbGFyZ2VyLCBhcyBpcworCQkJICogcG9zc2libGUgd2l0aCBzdXBwb3J0IGZvciBqdW1ibyBwYWNrZXRzLCB0aGVuCisJCQkgKiBzcGxpdCB0aGVtIGVhY2ggYWNyb3NzIDIgZGVzY3JpcHRvcnMuCisJCQkgKgorCQkJICogVGhpcyB3aWxsIHdvcmsgdW50aWwgd2UgZGV0ZXJtaW5lIHdoeSB0aGUgaGFyZHdhcmUKKwkJCSAqIGRvZXNuJ3Qgc2VlbSB0byBsaWtlIGxhcmdlIGZyYWdtZW50cy4KKwkJCSAqLworCQkJaWYgKChza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW4pIDw9IDE1MTQpIHsKKwkJCQlkZXNjW2ZyYWddLmFkZHJfaGkgPSAwOworCQkJCS8qIExvdyAxNmJpdHMgYXJlIGxlbmd0aCwgaGlnaCBpcyB2bGFuIGFuZAorCQkJCSAgIHVudXNlZCBjdXJyZW50bHkgc28gemVybyAqLworCQkJCWRlc2NbZnJhZ10ubGVuX3ZsYW4gPQorCQkJCQlza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW47CisKKwkJCQkvKiBOT1RFOiBIZXJlLCB0aGUgZG1hX2FkZHJfdCByZXR1cm5lZCBmcm9tCisJCQkJICogZG1hX21hcF9zaW5nbGUoKSBpcyBpbXBsaWNpdGx5IGNhc3QgYXMgYQorCQkJCSAqIHUzMi4gQWx0aG91Z2ggZG1hX2FkZHJfdCBjYW4gYmUKKwkJCQkgKiA2NC1iaXQsIHRoZSBhZGRyZXNzIHJldHVybmVkIGJ5CisJCQkJICogZG1hX21hcF9zaW5nbGUoKSBpcyBhbHdheXMgMzItYml0CisJCQkJICogYWRkcmVzc2FibGUgKGFzIGRlZmluZWQgYnkgdGhlIHBjaS9kbWEKKwkJCQkgKiBzdWJzeXN0ZW0pCisJCQkJICovCisJCQkJZGVzY1tmcmFnKytdLmFkZHJfbG8gPQorCQkJCSAgICBkbWFfbWFwX3NpbmdsZSgmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCQkJICAgc2tiLT5kYXRhLAorCQkJCQkJICAgc2tiLT5sZW4gLQorCQkJCQkJICAgc2tiLT5kYXRhX2xlbiwKKwkJCQkJCSAgIERNQV9UT19ERVZJQ0UpOworCQkJfSBlbHNlIHsKKwkJCQlkZXNjW2ZyYWddLmFkZHJfaGkgPSAwOworCQkJCWRlc2NbZnJhZ10ubGVuX3ZsYW4gPQorCQkJCSAgICAoc2tiLT5sZW4gLSBza2ItPmRhdGFfbGVuKSAvIDI7CisKKwkJCQkvKiBOT1RFOiBIZXJlLCB0aGUgZG1hX2FkZHJfdCByZXR1cm5lZCBmcm9tCisJCQkJICogZG1hX21hcF9zaW5nbGUoKSBpcyBpbXBsaWNpdGx5IGNhc3QgYXMgYQorCQkJCSAqIHUzMi4gQWx0aG91Z2ggZG1hX2FkZHJfdCBjYW4gYmUKKwkJCQkgKiA2NC1iaXQsIHRoZSBhZGRyZXNzIHJldHVybmVkIGJ5CisJCQkJICogZG1hX21hcF9zaW5nbGUoKSBpcyBhbHdheXMgMzItYml0CisJCQkJICogYWRkcmVzc2FibGUgKGFzIGRlZmluZWQgYnkgdGhlIHBjaS9kbWEKKwkJCQkgKiBzdWJzeXN0ZW0pCisJCQkJICovCisJCQkJZGVzY1tmcmFnKytdLmFkZHJfbG8gPQorCQkJCSAgICBkbWFfbWFwX3NpbmdsZSgmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCQkJICAgc2tiLT5kYXRhLAorCQkJCQkJICAgKChza2ItPmxlbiAtCisJCQkJCQkgICAgIHNrYi0+ZGF0YV9sZW4pIC8gMiksCisJCQkJCQkgICBETUFfVE9fREVWSUNFKTsKKwkJCQlkZXNjW2ZyYWddLmFkZHJfaGkgPSAwOworCisJCQkJZGVzY1tmcmFnXS5sZW5fdmxhbiA9CisJCQkJICAgIChza2ItPmxlbiAtIHNrYi0+ZGF0YV9sZW4pIC8gMjsKKworCQkJCS8qIE5PVEU6IEhlcmUsIHRoZSBkbWFfYWRkcl90IHJldHVybmVkIGZyb20KKwkJCQkgKiBkbWFfbWFwX3NpbmdsZSgpIGlzIGltcGxpY2l0bHkgY2FzdCBhcyBhCisJCQkJICogdTMyLiBBbHRob3VnaCBkbWFfYWRkcl90IGNhbiBiZQorCQkJCSAqIDY0LWJpdCwgdGhlIGFkZHJlc3MgcmV0dXJuZWQgYnkKKwkJCQkgKiBkbWFfbWFwX3NpbmdsZSgpIGlzIGFsd2F5cyAzMi1iaXQKKwkJCQkgKiBhZGRyZXNzYWJsZSAoYXMgZGVmaW5lZCBieSB0aGUgcGNpL2RtYQorCQkJCSAqIHN1YnN5c3RlbSkKKwkJCQkgKi8KKwkJCQlkZXNjW2ZyYWcrK10uYWRkcl9sbyA9CisJCQkJICAgIGRtYV9tYXBfc2luZ2xlKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkJCQkgICBza2ItPmRhdGEgKworCQkJCQkJICAgKChza2ItPmxlbiAtCisJCQkJCQkgICAgIHNrYi0+ZGF0YV9sZW4pIC8gMiksCisJCQkJCQkgICAoKHNrYi0+bGVuIC0KKwkJCQkJCSAgICAgc2tiLT5kYXRhX2xlbikgLyAyKSwKKwkJCQkJCSAgIERNQV9UT19ERVZJQ0UpOworCQkJfQorCQl9IGVsc2UgeworCQkJZGVzY1tmcmFnXS5hZGRyX2hpID0gMDsKKwkJCWRlc2NbZnJhZ10ubGVuX3ZsYW4gPQorCQkJCQlmcmFnc1tpIC0gMV0uc2l6ZTsKKworCQkJLyogTk9URTogSGVyZSwgdGhlIGRtYV9hZGRyX3QgcmV0dXJuZWQgZnJvbQorCQkJICogZG1hX21hcF9wYWdlKCkgaXMgaW1wbGljaXRseSBjYXN0IGFzIGEgdTMyLgorCQkJICogQWx0aG91Z2ggZG1hX2FkZHJfdCBjYW4gYmUgNjQtYml0LCB0aGUgYWRkcmVzcworCQkJICogcmV0dXJuZWQgYnkgZG1hX21hcF9wYWdlKCkgaXMgYWx3YXlzIDMyLWJpdAorCQkJICogYWRkcmVzc2FibGUgKGFzIGRlZmluZWQgYnkgdGhlIHBjaS9kbWEgc3Vic3lzdGVtKQorCQkJICovCisJCQlkZXNjW2ZyYWcrK10uYWRkcl9sbyA9IHNrYl9mcmFnX2RtYV9tYXAoCisJCQkJCQkJJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkJCQkmZnJhZ3NbaSAtIDFdLAorCQkJCQkJCTAsCisJCQkJCQkJZnJhZ3NbaSAtIDFdLnNpemUsCisJCQkJCQkJRE1BX1RPX0RFVklDRSk7CisJCX0KKwl9CisKKwlpZiAocGh5ZGV2ICYmIHBoeWRldi0+c3BlZWQgPT0gU1BFRURfMTAwMCkgeworCQlpZiAoKythZGFwdGVyLT50eF9yaW5nLnNpbmNlX2lycSA9PSBQQVJNX1RYX05VTV9CVUZTX0RFRikgeworCQkJLyogTGFzdCBlbGVtZW50ICYgSW50ZXJydXB0IGZsYWcgKi8KKwkJCWRlc2NbZnJhZyAtIDFdLmZsYWdzID0gMHg1OworCQkJYWRhcHRlci0+dHhfcmluZy5zaW5jZV9pcnEgPSAwOworCQl9IGVsc2UgeyAvKiBMYXN0IGVsZW1lbnQgKi8KKwkJCWRlc2NbZnJhZyAtIDFdLmZsYWdzID0gMHgxOworCQl9CisJfSBlbHNlCisJCWRlc2NbZnJhZyAtIDFdLmZsYWdzID0gMHg1OworCisJZGVzY1swXS5mbGFncyB8PSAyOwkvKiBGaXJzdCBlbGVtZW50IGZsYWcgKi8KKworCXRjYi0+aW5kZXhfc3RhcnQgPSBhZGFwdGVyLT50eF9yaW5nLnNlbmRfaWR4OworCXRjYi0+c3RhbGUgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPnNlbmRfaHdfbG9jaywgZmxhZ3MpOworCisJdGhpc2NvcHkgPSBOVU1fREVTQ19QRVJfUklOR19UWCAtCisJCQkJSU5ERVgxMChhZGFwdGVyLT50eF9yaW5nLnNlbmRfaWR4KTsKKworCWlmICh0aGlzY29weSA+PSBmcmFnKSB7CisJCXJlbWFpbmRlciA9IDA7CisJCXRoaXNjb3B5ID0gZnJhZzsKKwl9IGVsc2UgeworCQlyZW1haW5kZXIgPSBmcmFnIC0gdGhpc2NvcHk7CisJfQorCisJbWVtY3B5KGFkYXB0ZXItPnR4X3JpbmcudHhfZGVzY19yaW5nICsKKwkgICAgICAgSU5ERVgxMChhZGFwdGVyLT50eF9yaW5nLnNlbmRfaWR4KSwgZGVzYywKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqIHRoaXNjb3B5KTsKKworCWFkZF8xMGJpdCgmYWRhcHRlci0+dHhfcmluZy5zZW5kX2lkeCwgdGhpc2NvcHkpOworCisJaWYgKElOREVYMTAoYWRhcHRlci0+dHhfcmluZy5zZW5kX2lkeCkgPT0gMCB8fAorCQkgIElOREVYMTAoYWRhcHRlci0+dHhfcmluZy5zZW5kX2lkeCkgPT0gTlVNX0RFU0NfUEVSX1JJTkdfVFgpIHsKKwkJYWRhcHRlci0+dHhfcmluZy5zZW5kX2lkeCAmPSB+RVRfRE1BMTBfTUFTSzsKKwkJYWRhcHRlci0+dHhfcmluZy5zZW5kX2lkeCBePSBFVF9ETUExMF9XUkFQOworCX0KKworCWlmIChyZW1haW5kZXIpIHsKKwkJbWVtY3B5KGFkYXB0ZXItPnR4X3JpbmcudHhfZGVzY19yaW5nLAorCQkgICAgICAgZGVzYyArIHRoaXNjb3B5LAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB0eF9kZXNjKSAqIHJlbWFpbmRlcik7CisKKwkJYWRkXzEwYml0KCZhZGFwdGVyLT50eF9yaW5nLnNlbmRfaWR4LCByZW1haW5kZXIpOworCX0KKworCWlmIChJTkRFWDEwKGFkYXB0ZXItPnR4X3Jpbmcuc2VuZF9pZHgpID09IDApIHsKKwkJaWYgKGFkYXB0ZXItPnR4X3Jpbmcuc2VuZF9pZHgpCisJCQl0Y2ItPmluZGV4ID0gTlVNX0RFU0NfUEVSX1JJTkdfVFggLSAxOworCQllbHNlCisJCQl0Y2ItPmluZGV4ID0gRVRfRE1BMTBfV1JBUHwoTlVNX0RFU0NfUEVSX1JJTkdfVFggLSAxKTsKKwl9IGVsc2UKKwkJdGNiLT5pbmRleCA9IGFkYXB0ZXItPnR4X3Jpbmcuc2VuZF9pZHggLSAxOworCisJc3Bpbl9sb2NrKCZhZGFwdGVyLT50Y2Jfc2VuZF9xbG9jayk7CisKKwlpZiAoYWRhcHRlci0+dHhfcmluZy5zZW5kX3RhaWwpCisJCWFkYXB0ZXItPnR4X3Jpbmcuc2VuZF90YWlsLT5uZXh0ID0gdGNiOworCWVsc2UKKwkJYWRhcHRlci0+dHhfcmluZy5zZW5kX2hlYWQgPSB0Y2I7CisKKwlhZGFwdGVyLT50eF9yaW5nLnNlbmRfdGFpbCA9IHRjYjsKKworCVdBUk5fT04odGNiLT5uZXh0ICE9IE5VTEwpOworCisJYWRhcHRlci0+dHhfcmluZy51c2VkKys7CisKKwlzcGluX3VubG9jaygmYWRhcHRlci0+dGNiX3NlbmRfcWxvY2spOworCisJLyogV3JpdGUgdGhlIG5ldyB3cml0ZSBwb2ludGVyIGJhY2sgdG8gdGhlIGRldmljZS4gKi8KKwl3cml0ZWwoYWRhcHRlci0+dHhfcmluZy5zZW5kX2lkeCwKKwkgICAgICAgJmFkYXB0ZXItPnJlZ3MtPnR4ZG1hLnNlcnZpY2VfcmVxdWVzdCk7CisKKwkvKiBGb3IgR2lnIG9ubHksIHdlIHVzZSBUeCBJbnRlcnJ1cHQgY29hbGVzY2luZy4gIEVuYWJsZSB0aGUgc29mdHdhcmUKKwkgKiB0aW1lciB0byB3YWtlIHVzIHVwIGlmIHRoaXMgcGFja2V0IGlzbid0IGZvbGxvd2VkIGJ5IE4gbW9yZS4KKwkgKi8KKwlpZiAocGh5ZGV2ICYmIHBoeWRldi0+c3BlZWQgPT0gU1BFRURfMTAwMCkgeworCQl3cml0ZWwoUEFSTV9UWF9USU1FX0lOVF9ERUYgKiBOQU5PX0lOX0FfTUlDUk8sCisJCSAgICAgICAmYWRhcHRlci0+cmVncy0+Z2xvYmFsLndhdGNoZG9nX3RpbWVyKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+c2VuZF9od19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzZW5kX3BhY2tldCAtIERvIHRoZSB3b3JrIHRvIHNlbmQgYSBwYWNrZXQKKyAqIEBza2I6IHRoZSBwYWNrZXQocykgdG8gc2VuZAorICogQGFkYXB0ZXI6IGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqIFJldHVybiAwIGluIGFsbW9zdCBhbGwgY2FzZXM7IG5vbi16ZXJvIHZhbHVlIGluIGV4dHJlbWUgaGFyZCBmYWlsdXJlIG9ubHkuCisgKgorICogQXNzdW1wdGlvbjogU2VuZCBzcGlubG9jayBoYXMgYmVlbiBhY3F1aXJlZAorICovCitzdGF0aWMgaW50IHNlbmRfcGFja2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCB0Y2IgKnRjYiA9IE5VTEw7CisJdTE2ICpzaGJ1ZnZhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBBbGwgcGFja2V0cyBtdXN0IGhhdmUgYXQgbGVhc3QgYSBNQUMgYWRkcmVzcyBhbmQgYSBwcm90b2NvbCB0eXBlICovCisJaWYgKHNrYi0+bGVuIDwgRVRIX0hMRU4pCisJCXJldHVybiAtRUlPOworCisJLyogR2V0IGEgVENCIGZvciB0aGlzIHBhY2tldCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT50Y2JfcmVhZHlfcWxvY2ssIGZsYWdzKTsKKworCXRjYiA9IGFkYXB0ZXItPnR4X3JpbmcudGNiX3FoZWFkOworCisJaWYgKHRjYiA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnRjYl9yZWFkeV9xbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlhZGFwdGVyLT50eF9yaW5nLnRjYl9xaGVhZCA9IHRjYi0+bmV4dDsKKworCWlmIChhZGFwdGVyLT50eF9yaW5nLnRjYl9xaGVhZCA9PSBOVUxMKQorCQlhZGFwdGVyLT50eF9yaW5nLnRjYl9xdGFpbCA9IE5VTEw7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT50Y2JfcmVhZHlfcWxvY2ssIGZsYWdzKTsKKworCXRjYi0+c2tiID0gc2tiOworCisJaWYgKHNrYi0+ZGF0YSAhPSBOVUxMICYmIHNrYi0+bGVuIC0gc2tiLT5kYXRhX2xlbiA+PSA2KSB7CisJCXNoYnVmdmEgPSAodTE2ICopIHNrYi0+ZGF0YTsKKworCQlpZiAoKHNoYnVmdmFbMF0gPT0gMHhmZmZmKSAmJgorCQkgICAgKHNoYnVmdmFbMV0gPT0gMHhmZmZmKSAmJiAoc2hidWZ2YVsyXSA9PSAweGZmZmYpKSB7CisJCQl0Y2ItPmZsYWdzIHw9IGZNUF9ERVNUX0JST0FEOworCQl9IGVsc2UgaWYgKChzaGJ1ZnZhWzBdICYgMHgzKSA9PSAweDAwMDEpIHsKKwkJCXRjYi0+ZmxhZ3MgfD0gIGZNUF9ERVNUX01VTFRJOworCQl9CisJfQorCisJdGNiLT5uZXh0ID0gTlVMTDsKKworCS8qIENhbGwgdGhlIE5JQyBzcGVjaWZpYyBzZW5kIGhhbmRsZXIuICovCisJc3RhdHVzID0gbmljX3NlbmRfcGFja2V0KGFkYXB0ZXIsIHRjYik7CisKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPnRjYl9yZWFkeV9xbG9jaywgZmxhZ3MpOworCisJCWlmIChhZGFwdGVyLT50eF9yaW5nLnRjYl9xdGFpbCkKKwkJCWFkYXB0ZXItPnR4X3JpbmcudGNiX3F0YWlsLT5uZXh0ID0gdGNiOworCQllbHNlCisJCQkvKiBBcHBhcmVudGx5IHJlYWR5IFEgaXMgZW1wdHkuICovCisJCQlhZGFwdGVyLT50eF9yaW5nLnRjYl9xaGVhZCA9IHRjYjsKKworCQlhZGFwdGVyLT50eF9yaW5nLnRjYl9xdGFpbCA9IHRjYjsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+dGNiX3JlYWR5X3Fsb2NrLCBmbGFncyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCVdBUk5fT04oYWRhcHRlci0+dHhfcmluZy51c2VkID4gTlVNX1RDQik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZXQxMzF4X3NlbmRfcGFja2V0cyAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBPUyB0byBzZW5kIHBhY2tldHMKKyAqIEBza2I6IHRoZSBwYWNrZXQocykgdG8gc2VuZAorICogQG5ldGRldjpkZXZpY2Ugb24gd2hpY2ggdG8gVFggdGhlIGFib3ZlIHBhY2tldChzKQorICoKKyAqIFJldHVybiAwIGluIGFsbW9zdCBhbGwgY2FzZXM7IG5vbi16ZXJvIHZhbHVlIGluIGV4dHJlbWUgaGFyZCBmYWlsdXJlIG9ubHkKKyAqLworaW50IGV0MTMxeF9zZW5kX3BhY2tldHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJLyogU2VuZCB0aGVzZSBwYWNrZXRzCisJICoKKwkgKiBOT1RFOiBUaGUgTGludXggVHggZW50cnkgcG9pbnQgaXMgb25seSBnaXZlbiBvbmUgcGFja2V0IGF0IGEgdGltZQorCSAqIHRvIFR4LCBzbyB0aGUgUGFja2V0Q291bnQgYW5kIGl0J3MgYXJyYXkgdXNlZCBtYWtlcyBubyBzZW5zZSBoZXJlCisJICovCisKKwkvKiBUQ0IgaXMgbm90IGF2YWlsYWJsZSAqLworCWlmIChhZGFwdGVyLT50eF9yaW5nLnVzZWQgPj0gTlVNX1RDQikgeworCQkvKiBOT1RFOiBJZiB0aGVyZSdzIGFuIGVycm9yIG9uIHNlbmQsIG5vIG5lZWQgdG8gcXVldWUgdGhlCisJCSAqIHBhY2tldCB1bmRlciBMaW51eDsgaWYgd2UganVzdCBzZW5kIGFuIGVycm9yIHVwIHRvIHRoZQorCQkgKiBuZXRpZiBsYXllciwgaXQgd2lsbCByZXNlbmQgdGhlIHNrYiB0byB1cy4KKwkJICovCisJCXN0YXR1cyA9IC1FTk9NRU07CisJfSBlbHNlIHsKKwkJLyogV2UgbmVlZCB0byBzZWUgaWYgdGhlIGxpbmsgaXMgdXA7IGlmIGl0J3Mgbm90LCBtYWtlIHRoZQorCQkgKiBuZXRpZiBsYXllciB0aGluayB3ZSdyZSBnb29kIGFuZCBkcm9wIHRoZSBwYWNrZXQKKwkJICovCisJCWlmICgoYWRhcHRlci0+ZmxhZ3MgJiBmTVBfQURBUFRFUl9GQUlMX1NFTkRfTUFTSykgfHwKKwkJCQkJIW5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgeworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCXNrYiA9IE5VTEw7CisKKwkJCWFkYXB0ZXItPm5ldF9zdGF0cy50eF9kcm9wcGVkKys7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBzZW5kX3BhY2tldChza2IsIGFkYXB0ZXIpOworCQkJaWYgKHN0YXR1cyAhPSAwICYmIHN0YXR1cyAhPSAtRU5PTUVNKSB7CisJCQkJLyogT24gYW55IG90aGVyIGVycm9yLCBtYWtlIG5ldGlmIHRoaW5rIHdlJ3JlCisJCQkJICogT0sgYW5kIGRyb3AgdGhlIHBhY2tldAorCQkJCSAqLworCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQkJc2tiID0gTlVMTDsKKwkJCQlhZGFwdGVyLT5uZXRfc3RhdHMudHhfZHJvcHBlZCsrOworCQkJfQorCQl9CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogZnJlZV9zZW5kX3BhY2tldCAtIFJlY3ljbGUgYSBzdHJ1Y3QgdGNiCisgKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgYWRhcHRlcgorICogQHRjYjogcG9pbnRlciB0byBzdHJ1Y3QgdGNiCisgKgorICogQ29tcGxldGUgdGhlIHBhY2tldCBpZiBuZWNlc3NhcnkKKyAqIEFzc3VtcHRpb24gLSBTZW5kIHNwaW5sb2NrIGhhcyBiZWVuIGFjcXVpcmVkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3NlbmRfcGFja2V0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJCXN0cnVjdCB0Y2IgKnRjYikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB0eF9kZXNjICpkZXNjID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmYWRhcHRlci0+bmV0X3N0YXRzOworCisJaWYgKHRjYi0+ZmxhZ3MgJiBmTVBfREVTVF9CUk9BRCkKKwkJYXRvbWljX2luYygmYWRhcHRlci0+c3RhdHMuYnJvYWRjYXN0X3BrdHNfeG10ZCk7CisJZWxzZSBpZiAodGNiLT5mbGFncyAmIGZNUF9ERVNUX01VTFRJKQorCQlhdG9taWNfaW5jKCZhZGFwdGVyLT5zdGF0cy5tdWx0aWNhc3RfcGt0c194bXRkKTsKKwllbHNlCisJCWF0b21pY19pbmMoJmFkYXB0ZXItPnN0YXRzLnVuaWNhc3RfcGt0c194bXRkKTsKKworCWlmICh0Y2ItPnNrYikgeworCQlzdGF0cy0+dHhfYnl0ZXMgKz0gdGNiLT5za2ItPmxlbjsKKworCQkvKiBJdGVyYXRlIHRocm91Z2ggdGhlIFRYIGRlc2NyaXB0b3JzIG9uIHRoZSByaW5nCisJCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBwYWNrZXQgYW5kIHVtYXAgdGhlIGZyYWdtZW50cworCQkgKiB0aGV5IHBvaW50IHRvCisJCSAqLworCQlkbyB7CisJCQlkZXNjID0gKHN0cnVjdCB0eF9kZXNjICopCisJCQkJICAgIChhZGFwdGVyLT50eF9yaW5nLnR4X2Rlc2NfcmluZyArCisJCQkJCQlJTkRFWDEwKHRjYi0+aW5kZXhfc3RhcnQpKTsKKworCQkJZG1hX3VubWFwX3NpbmdsZSgmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCQkgZGVzYy0+YWRkcl9sbywKKwkJCQkJIGRlc2MtPmxlbl92bGFuLCBETUFfVE9fREVWSUNFKTsKKworCQkJYWRkXzEwYml0KCZ0Y2ItPmluZGV4X3N0YXJ0LCAxKTsKKwkJCWlmIChJTkRFWDEwKHRjYi0+aW5kZXhfc3RhcnQpID49CisJCQkJCQkJTlVNX0RFU0NfUEVSX1JJTkdfVFgpIHsKKwkJCQl0Y2ItPmluZGV4X3N0YXJ0ICY9IH5FVF9ETUExMF9NQVNLOworCQkJCXRjYi0+aW5kZXhfc3RhcnQgXj0gRVRfRE1BMTBfV1JBUDsKKwkJCX0KKwkJfSB3aGlsZSAoZGVzYyAhPSAoYWRhcHRlci0+dHhfcmluZy50eF9kZXNjX3JpbmcgKworCQkJCUlOREVYMTAodGNiLT5pbmRleCkpKTsKKworCQlkZXZfa2ZyZWVfc2tiX2FueSh0Y2ItPnNrYik7CisJfQorCisJbWVtc2V0KHRjYiwgMCwgc2l6ZW9mKHN0cnVjdCB0Y2IpKTsKKworCS8qIEFkZCB0aGUgVENCIHRvIHRoZSBSZWFkeSBRICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPnRjYl9yZWFkeV9xbG9jaywgZmxhZ3MpOworCisJYWRhcHRlci0+bmV0X3N0YXRzLnR4X3BhY2tldHMrKzsKKworCWlmIChhZGFwdGVyLT50eF9yaW5nLnRjYl9xdGFpbCkKKwkJYWRhcHRlci0+dHhfcmluZy50Y2JfcXRhaWwtPm5leHQgPSB0Y2I7CisJZWxzZQorCQkvKiBBcHBhcmVudGx5IHJlYWR5IFEgaXMgZW1wdHkuICovCisJCWFkYXB0ZXItPnR4X3JpbmcudGNiX3FoZWFkID0gdGNiOworCisJYWRhcHRlci0+dHhfcmluZy50Y2JfcXRhaWwgPSB0Y2I7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT50Y2JfcmVhZHlfcWxvY2ssIGZsYWdzKTsKKwlXQVJOX09OKGFkYXB0ZXItPnR4X3JpbmcudXNlZCA8IDApOworfQorCisvKioKKyAqIGV0MTMxeF9mcmVlX2J1c3lfc2VuZF9wYWNrZXRzIC0gRnJlZSBhbmQgY29tcGxldGUgdGhlIHN0b3BwZWQgYWN0aXZlIHNlbmRzCisgKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgYWRhcHRlcgorICoKKyAqIEFzc3VtcHRpb24gLSBTZW5kIHNwaW5sb2NrIGhhcyBiZWVuIGFjcXVpcmVkCisgKi8KK3ZvaWQgZXQxMzF4X2ZyZWVfYnVzeV9zZW5kX3BhY2tldHMoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCB0Y2IgKnRjYjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBmcmVlZCA9IDA7CisKKwkvKiBBbnkgcGFja2V0cyBiZWluZyBzZW50PyBDaGVjayB0aGUgZmlyc3QgVENCIG9uIHRoZSBzZW5kIGxpc3QgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+dGNiX3NlbmRfcWxvY2ssIGZsYWdzKTsKKworCXRjYiA9IGFkYXB0ZXItPnR4X3Jpbmcuc2VuZF9oZWFkOworCisJd2hpbGUgKHRjYiAhPSBOVUxMICYmIGZyZWVkIDwgTlVNX1RDQikgeworCQlzdHJ1Y3QgdGNiICpuZXh0ID0gdGNiLT5uZXh0OworCisJCWFkYXB0ZXItPnR4X3Jpbmcuc2VuZF9oZWFkID0gbmV4dDsKKworCQlpZiAobmV4dCA9PSBOVUxMKQorCQkJYWRhcHRlci0+dHhfcmluZy5zZW5kX3RhaWwgPSBOVUxMOworCisJCWFkYXB0ZXItPnR4X3JpbmcudXNlZC0tOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnRjYl9zZW5kX3Fsb2NrLCBmbGFncyk7CisKKwkJZnJlZWQrKzsKKwkJZnJlZV9zZW5kX3BhY2tldChhZGFwdGVyLCB0Y2IpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT50Y2Jfc2VuZF9xbG9jaywgZmxhZ3MpOworCisJCXRjYiA9IGFkYXB0ZXItPnR4X3Jpbmcuc2VuZF9oZWFkOworCX0KKworCVdBUk5fT04oZnJlZWQgPT0gTlVNX1RDQik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT50Y2Jfc2VuZF9xbG9jaywgZmxhZ3MpOworCisJYWRhcHRlci0+dHhfcmluZy51c2VkID0gMDsKK30KKworLyoqCisgKiBldDEzMXhfaGFuZGxlX3NlbmRfaW50ZXJydXB0IC0gSW50ZXJydXB0IGhhbmRsZXIgZm9yIHNlbmRpbmcgcHJvY2Vzc2luZworICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIKKyAqCisgKiBSZS1jbGFpbSB0aGUgc2VuZCByZXNvdXJjZXMsIGNvbXBsZXRlIHNlbmRzIGFuZCBnZXQgbW9yZSB0byBzZW5kIGZyb20KKyAqIHRoZSBzZW5kIHdhaXQgcXVldWUuCisgKgorICogQXNzdW1wdGlvbiAtIFNlbmQgc3BpbmxvY2sgaGFzIGJlZW4gYWNxdWlyZWQKKyAqLwordm9pZCBldDEzMXhfaGFuZGxlX3NlbmRfaW50ZXJydXB0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBzZXJ2aWNlZDsKKwlzdHJ1Y3QgdGNiICp0Y2I7CisJdTMyIGluZGV4OworCisJc2VydmljZWQgPSByZWFkbCgmYWRhcHRlci0+cmVncy0+dHhkbWEubmV3X3NlcnZpY2VfY29tcGxldGUpOworCWluZGV4ID0gSU5ERVgxMChzZXJ2aWNlZCk7CisKKwkvKiBIYXMgdGhlIHJpbmcgd3JhcHBlZD8gIFByb2Nlc3MgYW55IGRlc2NyaXB0b3JzIHRoYXQgZG8gbm90IGhhdmUKKwkgKiB0aGUgc2FtZSAid3JhcCIgaW5kaWNhdG9yIGFzIHRoZSBjdXJyZW50IGNvbXBsZXRpb24gaW5kaWNhdG9yCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPnRjYl9zZW5kX3Fsb2NrLCBmbGFncyk7CisKKwl0Y2IgPSBhZGFwdGVyLT50eF9yaW5nLnNlbmRfaGVhZDsKKworCXdoaWxlICh0Y2IgJiYKKwkgICAgICAgKChzZXJ2aWNlZCBeIHRjYi0+aW5kZXgpICYgRVRfRE1BMTBfV1JBUCkgJiYKKwkgICAgICAgaW5kZXggPCBJTkRFWDEwKHRjYi0+aW5kZXgpKSB7CisJCWFkYXB0ZXItPnR4X3JpbmcudXNlZC0tOworCQlhZGFwdGVyLT50eF9yaW5nLnNlbmRfaGVhZCA9IHRjYi0+bmV4dDsKKwkJaWYgKHRjYi0+bmV4dCA9PSBOVUxMKQorCQkJYWRhcHRlci0+dHhfcmluZy5zZW5kX3RhaWwgPSBOVUxMOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnRjYl9zZW5kX3Fsb2NrLCBmbGFncyk7CisJCWZyZWVfc2VuZF9wYWNrZXQoYWRhcHRlciwgdGNiKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPnRjYl9zZW5kX3Fsb2NrLCBmbGFncyk7CisKKwkJLyogR290byB0aGUgbmV4dCBwYWNrZXQgKi8KKwkJdGNiID0gYWRhcHRlci0+dHhfcmluZy5zZW5kX2hlYWQ7CisJfQorCXdoaWxlICh0Y2IgJiYKKwkgICAgICAgISgoc2VydmljZWQgXiB0Y2ItPmluZGV4KSAmIEVUX0RNQTEwX1dSQVApCisJICAgICAgICYmIGluZGV4ID4gKHRjYi0+aW5kZXggJiBFVF9ETUExMF9NQVNLKSkgeworCQlhZGFwdGVyLT50eF9yaW5nLnVzZWQtLTsKKwkJYWRhcHRlci0+dHhfcmluZy5zZW5kX2hlYWQgPSB0Y2ItPm5leHQ7CisJCWlmICh0Y2ItPm5leHQgPT0gTlVMTCkKKwkJCWFkYXB0ZXItPnR4X3Jpbmcuc2VuZF90YWlsID0gTlVMTDsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT50Y2Jfc2VuZF9xbG9jaywgZmxhZ3MpOworCQlmcmVlX3NlbmRfcGFja2V0KGFkYXB0ZXIsIHRjYik7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT50Y2Jfc2VuZF9xbG9jaywgZmxhZ3MpOworCisJCS8qIEdvdG8gdGhlIG5leHQgcGFja2V0ICovCisJCXRjYiA9IGFkYXB0ZXItPnR4X3Jpbmcuc2VuZF9oZWFkOworCX0KKworCS8qIFdha2UgdXAgdGhlIHF1ZXVlIHdoZW4gd2UgaGl0IGEgbG93LXdhdGVyIG1hcmsgKi8KKwlpZiAoYWRhcHRlci0+dHhfcmluZy51c2VkIDw9IE5VTV9UQ0IgLyAzKQorCQluZXRpZl93YWtlX3F1ZXVlKGFkYXB0ZXItPm5ldGRldik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT50Y2Jfc2VuZF9xbG9jaywgZmxhZ3MpOworfQorCisvKiBFVEhUT09MIGZ1bmN0aW9ucyAqLworCitzdGF0aWMgaW50IGV0MTMxeF9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJcmV0dXJuIHBoeV9ldGh0b29sX2dzZXQoYWRhcHRlci0+cGh5ZGV2LCBjbWQpOworfQorCitzdGF0aWMgaW50IGV0MTMxeF9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJcmV0dXJuIHBoeV9ldGh0b29sX3NzZXQoYWRhcHRlci0+cGh5ZGV2LCBjbWQpOworfQorCitzdGF0aWMgaW50IGV0MTMxeF9nZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKyNkZWZpbmUgRVQxMzFYX1JFR1NfTEVOIDI1NgorCXJldHVybiBFVDEzMVhfUkVHU19MRU4gKiBzaXplb2YodTMyKTsKK30KKworc3RhdGljIHZvaWQgZXQxMzF4X2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywgdm9pZCAqcmVnc19kYXRhKQoreworCXN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGFkZHJlc3NfbWFwIF9faW9tZW0gKmFyZWdzID0gYWRhcHRlci0+cmVnczsKKwl1MzIgKnJlZ3NfYnVmZiA9IHJlZ3NfZGF0YTsKKwl1MzIgbnVtID0gMDsKKworCW1lbXNldChyZWdzX2RhdGEsIDAsIGV0MTMxeF9nZXRfcmVnc19sZW4obmV0ZGV2KSk7CisKKwlyZWdzLT52ZXJzaW9uID0gKDEgPDwgMjQpIHwgKGFkYXB0ZXItPnBkZXYtPnJldmlzaW9uIDw8IDE2KSB8CisJCQlhZGFwdGVyLT5wZGV2LT5kZXZpY2U7CisKKwkvKiBQSFkgcmVncyAqLworCWV0MTMxeF9taWlfcmVhZChhZGFwdGVyLCBNSUlfQk1DUiwgKHUxNiAqKSZyZWdzX2J1ZmZbbnVtKytdKTsKKwlldDEzMXhfbWlpX3JlYWQoYWRhcHRlciwgTUlJX0JNU1IsICh1MTYgKikmcmVnc19idWZmW251bSsrXSk7CisJZXQxMzF4X21paV9yZWFkKGFkYXB0ZXIsIE1JSV9QSFlTSUQxLCAodTE2ICopJnJlZ3NfYnVmZltudW0rK10pOworCWV0MTMxeF9taWlfcmVhZChhZGFwdGVyLCBNSUlfUEhZU0lEMiwgKHUxNiAqKSZyZWdzX2J1ZmZbbnVtKytdKTsKKwlldDEzMXhfbWlpX3JlYWQoYWRhcHRlciwgTUlJX0FEVkVSVElTRSwgKHUxNiAqKSZyZWdzX2J1ZmZbbnVtKytdKTsKKwlldDEzMXhfbWlpX3JlYWQoYWRhcHRlciwgTUlJX0xQQSwgKHUxNiAqKSZyZWdzX2J1ZmZbbnVtKytdKTsKKwlldDEzMXhfbWlpX3JlYWQoYWRhcHRlciwgTUlJX0VYUEFOU0lPTiwgKHUxNiAqKSZyZWdzX2J1ZmZbbnVtKytdKTsKKwkvKiBBdXRvbmVnIG5leHQgcGFnZSB0cmFuc21pdCByZWcgKi8KKwlldDEzMXhfbWlpX3JlYWQoYWRhcHRlciwgMHgwNywgKHUxNiAqKSZyZWdzX2J1ZmZbbnVtKytdKTsKKwkvKiBMaW5rIHBhcnRuZXIgbmV4dCBwYWdlIHJlZyAqLworCWV0MTMxeF9taWlfcmVhZChhZGFwdGVyLCAweDA4LCAodTE2ICopJnJlZ3NfYnVmZltudW0rK10pOworCWV0MTMxeF9taWlfcmVhZChhZGFwdGVyLCBNSUlfQ1RSTDEwMDAsICh1MTYgKikmcmVnc19idWZmW251bSsrXSk7CisJZXQxMzF4X21paV9yZWFkKGFkYXB0ZXIsIE1JSV9TVEFUMTAwMCwgKHUxNiAqKSZyZWdzX2J1ZmZbbnVtKytdKTsKKwlldDEzMXhfbWlpX3JlYWQoYWRhcHRlciwgTUlJX0VTVEFUVVMsICh1MTYgKikmcmVnc19idWZmW251bSsrXSk7CisJZXQxMzF4X21paV9yZWFkKGFkYXB0ZXIsIFBIWV9JTkRFWF9SRUcsICh1MTYgKikmcmVnc19idWZmW251bSsrXSk7CisJZXQxMzF4X21paV9yZWFkKGFkYXB0ZXIsIFBIWV9EQVRBX1JFRywgKHUxNiAqKSZyZWdzX2J1ZmZbbnVtKytdKTsKKwlldDEzMXhfbWlpX3JlYWQoYWRhcHRlciwgUEhZX01QSFlfQ09OVFJPTF9SRUcsCisJCQkodTE2ICopJnJlZ3NfYnVmZltudW0rK10pOworCWV0MTMxeF9taWlfcmVhZChhZGFwdGVyLCBQSFlfTE9PUEJBQ0tfQ09OVFJPTCwKKwkJCSh1MTYgKikmcmVnc19idWZmW251bSsrXSk7CisJZXQxMzF4X21paV9yZWFkKGFkYXB0ZXIsIFBIWV9MT09QQkFDS19DT05UUk9MKzEsCisJCQkodTE2ICopJnJlZ3NfYnVmZltudW0rK10pOworCWV0MTMxeF9taWlfcmVhZChhZGFwdGVyLCBQSFlfUkVHSVNURVJfTUdNVF9DT05UUk9MLAorCQkJKHUxNiAqKSZyZWdzX2J1ZmZbbnVtKytdKTsKKwlldDEzMXhfbWlpX3JlYWQoYWRhcHRlciwgUEhZX0NPTkZJRywgKHUxNiAqKSZyZWdzX2J1ZmZbbnVtKytdKTsKKwlldDEzMXhfbWlpX3JlYWQoYWRhcHRlciwgUEhZX1BIWV9DT05UUk9MLCAodTE2ICopJnJlZ3NfYnVmZltudW0rK10pOworCWV0MTMxeF9taWlfcmVhZChhZGFwdGVyLCBQSFlfSU5URVJSVVBUX01BU0ssICh1MTYgKikmcmVnc19idWZmW251bSsrXSk7CisJZXQxMzF4X21paV9yZWFkKGFkYXB0ZXIsIFBIWV9JTlRFUlJVUFRfU1RBVFVTLAorCQkJKHUxNiAqKSZyZWdzX2J1ZmZbbnVtKytdKTsKKwlldDEzMXhfbWlpX3JlYWQoYWRhcHRlciwgUEhZX1BIWV9TVEFUVVMsICh1MTYgKikmcmVnc19idWZmW251bSsrXSk7CisJZXQxMzF4X21paV9yZWFkKGFkYXB0ZXIsIFBIWV9MRURfMSwgKHUxNiAqKSZyZWdzX2J1ZmZbbnVtKytdKTsKKwlldDEzMXhfbWlpX3JlYWQoYWRhcHRlciwgUEhZX0xFRF8yLCAodTE2ICopJnJlZ3NfYnVmZltudW0rK10pOworCisJLyogR2xvYmFsIHJlZ3MgKi8KKwlyZWdzX2J1ZmZbbnVtKytdID0gcmVhZGwoJmFyZWdzLT5nbG9iYWwudHhxX3N0YXJ0X2FkZHIpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPmdsb2JhbC50eHFfZW5kX2FkZHIpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPmdsb2JhbC5yeHFfc3RhcnRfYWRkcik7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+Z2xvYmFsLnJ4cV9lbmRfYWRkcik7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+Z2xvYmFsLnBtX2Nzcik7CisJcmVnc19idWZmW251bSsrXSA9IGFkYXB0ZXItPnN0YXRzLmludGVycnVwdF9zdGF0dXM7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+Z2xvYmFsLmludF9tYXNrKTsKKwlyZWdzX2J1ZmZbbnVtKytdID0gcmVhZGwoJmFyZWdzLT5nbG9iYWwuaW50X2FsaWFzX2Nscl9lbik7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+Z2xvYmFsLmludF9zdGF0dXNfYWxpYXMpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPmdsb2JhbC5zd19yZXNldCk7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+Z2xvYmFsLnNsdl90aW1lcik7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+Z2xvYmFsLm1zaV9jb25maWcpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPmdsb2JhbC5sb29wYmFjayk7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+Z2xvYmFsLndhdGNoZG9nX3RpbWVyKTsKKworCS8qIFRYRE1BIHJlZ3MgKi8KKwlyZWdzX2J1ZmZbbnVtKytdID0gcmVhZGwoJmFyZWdzLT50eGRtYS5jc3IpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPnR4ZG1hLnByX2Jhc2VfaGkpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPnR4ZG1hLnByX2Jhc2VfbG8pOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPnR4ZG1hLnByX251bV9kZXMpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPnR4ZG1hLnR4cV93cl9hZGRyKTsKKwlyZWdzX2J1ZmZbbnVtKytdID0gcmVhZGwoJmFyZWdzLT50eGRtYS50eHFfd3JfYWRkcl9leHQpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPnR4ZG1hLnR4cV9yZF9hZGRyKTsKKwlyZWdzX2J1ZmZbbnVtKytdID0gcmVhZGwoJmFyZWdzLT50eGRtYS5kbWFfd2JfYmFzZV9oaSk7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+dHhkbWEuZG1hX3diX2Jhc2VfbG8pOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPnR4ZG1hLnNlcnZpY2VfcmVxdWVzdCk7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+dHhkbWEuc2VydmljZV9jb21wbGV0ZSk7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+dHhkbWEuY2FjaGVfcmRfaW5kZXgpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPnR4ZG1hLmNhY2hlX3dyX2luZGV4KTsKKwlyZWdzX2J1ZmZbbnVtKytdID0gcmVhZGwoJmFyZWdzLT50eGRtYS50eF9kbWFfZXJyb3IpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPnR4ZG1hLmRlc2NfYWJvcnRfY250KTsKKwlyZWdzX2J1ZmZbbnVtKytdID0gcmVhZGwoJmFyZWdzLT50eGRtYS5wYXlsb2FkX2Fib3J0X2NudCk7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+dHhkbWEud3JpdGViYWNrX2Fib3J0X2NudCk7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+dHhkbWEuZGVzY190aW1lb3V0X2NudCk7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+dHhkbWEucGF5bG9hZF90aW1lb3V0X2NudCk7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+dHhkbWEud3JpdGViYWNrX3RpbWVvdXRfY250KTsKKwlyZWdzX2J1ZmZbbnVtKytdID0gcmVhZGwoJmFyZWdzLT50eGRtYS5kZXNjX2Vycm9yX2NudCk7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+dHhkbWEucGF5bG9hZF9lcnJvcl9jbnQpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPnR4ZG1hLndyaXRlYmFja19lcnJvcl9jbnQpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPnR4ZG1hLmRyb3BwZWRfdGxwX2NudCk7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+dHhkbWEubmV3X3NlcnZpY2VfY29tcGxldGUpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPnR4ZG1hLmV0aGVybmV0X3BhY2tldF9jbnQpOworCisJLyogUlhETUEgcmVncyAqLworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPnJ4ZG1hLmNzcik7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+cnhkbWEuZG1hX3diX2Jhc2VfaGkpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPnJ4ZG1hLmRtYV93Yl9iYXNlX2xvKTsKKwlyZWdzX2J1ZmZbbnVtKytdID0gcmVhZGwoJmFyZWdzLT5yeGRtYS5udW1fcGt0X2RvbmUpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPnJ4ZG1hLm1heF9wa3RfdGltZSk7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+cnhkbWEucnhxX3JkX2FkZHIpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPnJ4ZG1hLnJ4cV9yZF9hZGRyX2V4dCk7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+cnhkbWEucnhxX3dyX2FkZHIpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPnJ4ZG1hLnBzcl9iYXNlX2hpKTsKKwlyZWdzX2J1ZmZbbnVtKytdID0gcmVhZGwoJmFyZWdzLT5yeGRtYS5wc3JfYmFzZV9sbyk7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+cnhkbWEucHNyX251bV9kZXMpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPnJ4ZG1hLnBzcl9hdmFpbF9vZmZzZXQpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPnJ4ZG1hLnBzcl9mdWxsX29mZnNldCk7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+cnhkbWEucHNyX2FjY2Vzc19pbmRleCk7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+cnhkbWEucHNyX21pbl9kZXMpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPnJ4ZG1hLmZicjBfYmFzZV9sbyk7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+cnhkbWEuZmJyMF9iYXNlX2hpKTsKKwlyZWdzX2J1ZmZbbnVtKytdID0gcmVhZGwoJmFyZWdzLT5yeGRtYS5mYnIwX251bV9kZXMpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPnJ4ZG1hLmZicjBfYXZhaWxfb2Zmc2V0KTsKKwlyZWdzX2J1ZmZbbnVtKytdID0gcmVhZGwoJmFyZWdzLT5yeGRtYS5mYnIwX2Z1bGxfb2Zmc2V0KTsKKwlyZWdzX2J1ZmZbbnVtKytdID0gcmVhZGwoJmFyZWdzLT5yeGRtYS5mYnIwX3JkX2luZGV4KTsKKwlyZWdzX2J1ZmZbbnVtKytdID0gcmVhZGwoJmFyZWdzLT5yeGRtYS5mYnIwX21pbl9kZXMpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPnJ4ZG1hLmZicjFfYmFzZV9sbyk7CisJcmVnc19idWZmW251bSsrXSA9IHJlYWRsKCZhcmVncy0+cnhkbWEuZmJyMV9iYXNlX2hpKTsKKwlyZWdzX2J1ZmZbbnVtKytdID0gcmVhZGwoJmFyZWdzLT5yeGRtYS5mYnIxX251bV9kZXMpOworCXJlZ3NfYnVmZltudW0rK10gPSByZWFkbCgmYXJlZ3MtPnJ4ZG1hLmZicjFfYXZhaWxfb2Zmc2V0KTsKKwlyZWdzX2J1ZmZbbnVtKytdID0gcmVhZGwoJmFyZWdzLT5yeGRtYS5mYnIxX2Z1bGxfb2Zmc2V0KTsKKwlyZWdzX2J1ZmZbbnVtKytdID0gcmVhZGwoJmFyZWdzLT5yeGRtYS5mYnIxX3JkX2luZGV4KTsKKwlyZWdzX2J1ZmZbbnVtKytdID0gcmVhZGwoJmFyZWdzLT5yeGRtYS5mYnIxX21pbl9kZXMpOworfQorCisjZGVmaW5lIEVUMTMxWF9EUlZJTkZPX0xFTiAzMiAvKiB2YWx1ZSBmcm9tIGV0aHRvb2wuaCAqLworc3RhdGljIHZvaWQgZXQxMzF4X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJc3RybmNweShpbmZvLT5kcml2ZXIsIERSSVZFUl9OQU1FLCBFVDEzMVhfRFJWSU5GT19MRU4pOworCXN0cm5jcHkoaW5mby0+dmVyc2lvbiwgRFJJVkVSX1ZFUlNJT04sIEVUMTMxWF9EUlZJTkZPX0xFTik7CisJc3RybmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYWRhcHRlci0+cGRldiksIEVUMTMxWF9EUlZJTkZPX0xFTik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgZXQxMzF4X2V0aHRvb2xfb3BzID0geworCS5nZXRfc2V0dGluZ3MJPSBldDEzMXhfZ2V0X3NldHRpbmdzLAorCS5zZXRfc2V0dGluZ3MJPSBldDEzMXhfc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbwk9IGV0MTMxeF9nZXRfZHJ2aW5mbywKKwkuZ2V0X3JlZ3NfbGVuCT0gZXQxMzF4X2dldF9yZWdzX2xlbiwKKwkuZ2V0X3JlZ3MJPSBldDEzMXhfZ2V0X3JlZ3MsCisJLmdldF9saW5rID0gZXRodG9vbF9vcF9nZXRfbGluaywKK307CisKK3ZvaWQgZXQxMzF4X3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZldDEzMXhfZXRodG9vbF9vcHMpOworfQorCisvKiBQQ0kgZnVuY3Rpb25zICovCisKKy8qKgorICogZXQxMzF4X2h3YWRkcl9pbml0IC0gc2V0IHVwIHRoZSBNQUMgQWRkcmVzcyBvbiB0aGUgRVQxMzEwCisgKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICovCit2b2lkIGV0MTMxeF9od2FkZHJfaW5pdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJLyogSWYgaGF2ZSBvdXIgZGVmYXVsdCBtYWMgZnJvbSBpbml0IGFuZCBubyBtYWMgYWRkcmVzcyBmcm9tCisJICogRUVQUk9NIHRoZW4gd2UgbmVlZCB0byBnZW5lcmF0ZSB0aGUgbGFzdCBvY3RldCBhbmQgc2V0IGl0IG9uIHRoZQorCSAqIGRldmljZQorCSAqLworCWlmIChhZGFwdGVyLT5yb21fYWRkclswXSA9PSAweDAwICYmCisJICAgIGFkYXB0ZXItPnJvbV9hZGRyWzFdID09IDB4MDAgJiYKKwkgICAgYWRhcHRlci0+cm9tX2FkZHJbMl0gPT0gMHgwMCAmJgorCSAgICBhZGFwdGVyLT5yb21fYWRkclszXSA9PSAweDAwICYmCisJICAgIGFkYXB0ZXItPnJvbV9hZGRyWzRdID09IDB4MDAgJiYKKwkgICAgYWRhcHRlci0+cm9tX2FkZHJbNV0gPT0gMHgwMCkgeworCQkvKgorCQkgKiBXZSBuZWVkIHRvIHJhbmRvbWx5IGdlbmVyYXRlIHRoZSBsYXN0IG9jdGV0IHNvIHdlCisJCSAqIGRlY3JlYXNlIG91ciBjaGFuY2VzIG9mIHNldHRpbmcgdGhlIG1hYyBhZGRyZXNzIHRvCisJCSAqIHNhbWUgYXMgYW5vdGhlciBvbmUgb2Ygb3VyIGNhcmRzIGluIHRoZSBzeXN0ZW0KKwkJICovCisJCWdldF9yYW5kb21fYnl0ZXMoJmFkYXB0ZXItPmFkZHJbNV0sIDEpOworCQkvKgorCQkgKiBXZSBoYXZlIHRoZSBkZWZhdWx0IHZhbHVlIGluIHRoZSByZWdpc3RlciB3ZSBhcmUKKwkJICogd29ya2luZyB3aXRoIHNvIHdlIG5lZWQgdG8gY29weSB0aGUgY3VycmVudAorCQkgKiBhZGRyZXNzIGludG8gdGhlIHBlcm1hbmVudCBhZGRyZXNzCisJCSAqLworCQltZW1jcHkoYWRhcHRlci0+cm9tX2FkZHIsCisJCQlhZGFwdGVyLT5hZGRyLCBFVEhfQUxFTik7CisJfSBlbHNlIHsKKwkJLyogV2UgZG8gbm90IGhhdmUgYW4gb3ZlcnJpZGUgYWRkcmVzcywgc28gc2V0IHRoZQorCQkgKiBjdXJyZW50IGFkZHJlc3MgdG8gdGhlIHBlcm1hbmVudCBhZGRyZXNzIGFuZCBhZGQKKwkJICogaXQgdG8gdGhlIGRldmljZQorCQkgKi8KKwkJbWVtY3B5KGFkYXB0ZXItPmFkZHIsCisJCSAgICAgICBhZGFwdGVyLT5yb21fYWRkciwgRVRIX0FMRU4pOworCX0KK30KKworLyoqCisgKiBldDEzMXhfcGNpX2luaXQJIC0gaW5pdGlhbCBQQ0kgc2V0dXAKKyAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKiBAcGRldjogb3VyIFBDSSBkZXZpY2UKKyAqCisgKiBQZXJmb3JtIHRoZSBpbml0aWFsIHNldHVwIG9mIFBDSSByZWdpc3RlcnMgYW5kIGlmIHBvc3NpYmxlIGluaXRpYWxpc2UKKyAqIHRoZSBNQUMgYWRkcmVzcy4gQXQgdGhpcyBwb2ludCB0aGUgSS9PIHJlZ2lzdGVycyBoYXZlIHlldCB0byBiZSBtYXBwZWQKKyAqLworc3RhdGljIGludCBldDEzMXhfcGNpX2luaXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLAorCQkJCQkJc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJaW50IGk7CisJdTggbWF4X3BheWxvYWQ7CisJdTggcmVhZF9zaXplX3JlZzsKKworCWlmIChldDEzMXhfaW5pdF9lZXByb20oYWRhcHRlcikgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIExldCdzIHNldCB1cCB0aGUgUE9SVCBMT0dJQyBSZWdpc3Rlci4gIEZpcnN0IHdlIG5lZWQgdG8ga25vdyB3aGF0CisJICogdGhlIG1heF9wYXlsb2FkX3NpemUgaXMKKwkgKi8KKwlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgRVQxMzEwX1BDSV9NQVhfUFlMRCwgJm1heF9wYXlsb2FkKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCSAgICAiQ291bGQgbm90IHJlYWQgUENJIGNvbmZpZyBzcGFjZSBmb3IgTWF4IFBheWxvYWQgU2l6ZVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFByb2dyYW0gdGhlIEFjay9OYWsgbGF0ZW5jeSBhbmQgcmVwbGF5IHRpbWVycyAqLworCW1heF9wYXlsb2FkICY9IDB4MDc7CS8qIE9ubHkgdGhlIGxvd2VyIDMgYml0cyBhcmUgdmFsaWQgKi8KKworCWlmIChtYXhfcGF5bG9hZCA8IDIpIHsKKwkJc3RhdGljIGNvbnN0IHUxNiBhY2tuYWtbMl0gPSB7IDB4NzYsIDB4RDAgfTsKKwkJc3RhdGljIGNvbnN0IHUxNiByZXBsYXlbMl0gPSB7IDB4MUUwLCAweDJFRCB9OworCisJCWlmIChwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgRVQxMzEwX1BDSV9BQ0tfTkFDSywKKwkJCQkJICAgICAgIGFja25ha1ttYXhfcGF5bG9hZF0pKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkgICJDb3VsZCBub3Qgd3JpdGUgUENJIGNvbmZpZyBzcGFjZSBmb3IgQUNLL05BS1xuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlpZiAocGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIEVUMTMxMF9QQ0lfUkVQTEFZLAorCQkJCQkgICAgICAgcmVwbGF5W21heF9wYXlsb2FkXSkpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSAgIkNvdWxkIG5vdCB3cml0ZSBQQ0kgY29uZmlnIHNwYWNlIGZvciBSZXBsYXkgVGltZXJcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwkvKiBsMHMgYW5kIGwxIGxhdGVuY3kgdGltZXJzLiAgV2UgYXJlIHVzaW5nIGRlZmF1bHQgdmFsdWVzLgorCSAqIFJlcHJlc2VudGluZyAwMDEgZm9yIEwwcyBhbmQgMDEwIGZvciBMMQorCSAqLworCWlmIChwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgRVQxMzEwX1BDSV9MMEwxTEFURU5DWSwgMHgxMSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkgICJDb3VsZCBub3Qgd3JpdGUgUENJIGNvbmZpZyBzcGFjZSBmb3IgTGF0ZW5jeSBUaW1lcnNcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBDaGFuZ2UgdGhlIG1heCByZWFkIHNpemUgdG8gMmsgKi8KKwlpZiAocGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgMHg1MSwgJnJlYWRfc2l6ZV9yZWcpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJDb3VsZCBub3QgcmVhZCBQQ0kgY29uZmlnIHNwYWNlIGZvciBNYXggcmVhZCBzaXplXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmVhZF9zaXplX3JlZyAmPSAweDhmOworCXJlYWRfc2l6ZV9yZWcgfD0gMHg0MDsKKworCWlmIChwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg1MSwgcmVhZF9zaXplX3JlZykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkgICAgICAiQ291bGQgbm90IHdyaXRlIFBDSSBjb25maWcgc3BhY2UgZm9yIE1heCByZWFkIHNpemVcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBHZXQgTUFDIGFkZHJlc3MgZnJvbSBjb25maWcgc3BhY2UgaWYgYW4gZWVwcm9tIGV4aXN0cywgb3RoZXJ3aXNlCisJICogdGhlIE1BQyBhZGRyZXNzIHRoZXJlIHdpbGwgbm90IGJlIHZhbGlkCisJICovCisJaWYgKCFhZGFwdGVyLT5oYXNfZWVwcm9tKSB7CisJCWV0MTMxeF9od2FkZHJfaW5pdChhZGFwdGVyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKKwkJaWYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIEVUMTMxMF9QQ0lfTUFDX0FERFJFU1MgKyBpLAorCQkJCQlhZGFwdGVyLT5yb21fYWRkciArIGkpKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZCBub3QgcmVhZCBQQ0kgY29uZmlnIHNwYWNlIGZvciBNQUMgYWRkcmVzc1xuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKwltZW1jcHkoYWRhcHRlci0+YWRkciwgYWRhcHRlci0+cm9tX2FkZHIsIEVUSF9BTEVOKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBldDEzMXhfZXJyb3JfdGltZXJfaGFuZGxlcgorICogQGRhdGE6IHRpbWVyLXNwZWNpZmljIHZhcmlhYmxlOyBoZXJlIGEgcG9pbnRlciB0byBvdXIgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiBUaGUgcm91dGluZSBjYWxsZWQgd2hlbiB0aGUgZXJyb3IgdGltZXIgZXhwaXJlcywgdG8gdHJhY2sgdGhlIG51bWJlciBvZgorICogcmVjdXJyaW5nIGVycm9ycy4KKyAqLwordm9pZCBldDEzMXhfZXJyb3JfdGltZXJfaGFuZGxlcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqKSBkYXRhOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBhZGFwdGVyLT5waHlkZXY7CisKKwlpZiAoZXQxMzEwX2luX3BoeV9jb21hKGFkYXB0ZXIpKSB7CisJCS8qIEJyaW5nIHRoZSBkZXZpY2UgaW1tZWRpYXRlbHkgb3V0IG9mIGNvbWEsIHRvCisJCSAqIHByZXZlbnQgaXQgZnJvbSBzbGVlcGluZyBpbmRlZmluaXRlbHksIHRoaXMKKwkJICogbWVjaGFuaXNtIGNvdWxkIGJlIGltcHJvdmVkISAqLworCQlldDEzMTBfZGlzYWJsZV9waHlfY29tYShhZGFwdGVyKTsKKwkJYWRhcHRlci0+Ym9vdF9jb21hID0gMjA7CisJfSBlbHNlIHsKKwkJZXQxMzEwX3VwZGF0ZV9tYWNzdGF0X2hvc3RfY291bnRlcnMoYWRhcHRlcik7CisJfQorCisJaWYgKCFwaHlkZXYtPmxpbmsgJiYgYWRhcHRlci0+Ym9vdF9jb21hIDwgMTEpCisJCWFkYXB0ZXItPmJvb3RfY29tYSsrOworCisJaWYgKGFkYXB0ZXItPmJvb3RfY29tYSA9PSAxMCkgeworCQlpZiAoIXBoeWRldi0+bGluaykgeworCQkJaWYgKCFldDEzMTBfaW5fcGh5X2NvbWEoYWRhcHRlcikpIHsKKwkJCQkvKiBOT1RFIC0gVGhpcyB3YXMgb3JpZ2luYWxseSBhICdzeW5jIHdpdGgKKwkJCQkgKiAgaW50ZXJydXB0Jy4gSG93IHRvIGRvIHRoYXQgdW5kZXIgTGludXg/CisJCQkJICovCisJCQkJZXQxMzF4X2VuYWJsZV9pbnRlcnJ1cHRzKGFkYXB0ZXIpOworCQkJCWV0MTMxMF9lbmFibGVfcGh5X2NvbWEoYWRhcHRlcik7CisJCQl9CisJCX0KKwl9CisKKwkvKiBUaGlzIGlzIGEgcGVyaW9kaWMgdGltZXIsIHNvIHJlc2NoZWR1bGUgKi8KKwltb2RfdGltZXIoJmFkYXB0ZXItPmVycm9yX3RpbWVyLCBqaWZmaWVzICsKKwkJCQkJICBUWF9FUlJPUl9QRVJJT0QgKiBIWiAvIDEwMDApOworfQorCisvKioKKyAqIGV0MTMxeF9hZGFwdGVyX21lbW9yeV9hbGxvYworICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKS4KKyAqCisgKiBBbGxvY2F0ZSBhbGwgdGhlIG1lbW9yeSBibG9ja3MgZm9yIHNlbmQsIHJlY2VpdmUgYW5kIG90aGVycy4KKyAqLworaW50IGV0MTMxeF9hZGFwdGVyX21lbW9yeV9hbGxvYyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJaW50IHN0YXR1czsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIFR4IFJpbmcgKi8KKwlzdGF0dXMgPSBldDEzMXhfdHhfZG1hX21lbW9yeV9hbGxvYyhhZGFwdGVyKTsKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJICAiZXQxMzF4X3R4X2RtYV9tZW1vcnlfYWxsb2MgRkFJTEVEXG4iKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJLyogUmVjZWl2ZSBidWZmZXIgbWVtb3J5IGFsbG9jYXRpb24gKi8KKwlzdGF0dXMgPSBldDEzMXhfcnhfZG1hX21lbW9yeV9hbGxvYyhhZGFwdGVyKTsKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJICAiZXQxMzF4X3J4X2RtYV9tZW1vcnlfYWxsb2MgRkFJTEVEXG4iKTsKKwkJZXQxMzF4X3R4X2RtYV9tZW1vcnlfZnJlZShhZGFwdGVyKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKiBJbml0IHJlY2VpdmUgZGF0YSBzdHJ1Y3R1cmVzICovCisJc3RhdHVzID0gZXQxMzF4X2luaXRfcmVjdihhZGFwdGVyKTsKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJImV0MTMxeF9pbml0X3JlY3YgRkFJTEVEXG4iKTsKKwkJZXQxMzF4X3R4X2RtYV9tZW1vcnlfZnJlZShhZGFwdGVyKTsKKwkJZXQxMzF4X3J4X2RtYV9tZW1vcnlfZnJlZShhZGFwdGVyKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBldDEzMXhfYWRhcHRlcl9tZW1vcnlfZnJlZSAtIEZyZWUgYWxsIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHVzZSBieSBUeCAmIFJ4CisgKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICovCit2b2lkIGV0MTMxeF9hZGFwdGVyX21lbW9yeV9mcmVlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwkvKiBGcmVlIERNQSBtZW1vcnkgKi8KKwlldDEzMXhfdHhfZG1hX21lbW9yeV9mcmVlKGFkYXB0ZXIpOworCWV0MTMxeF9yeF9kbWFfbWVtb3J5X2ZyZWUoYWRhcHRlcik7Cit9CisKK3N0YXRpYyB2b2lkIGV0MTMxeF9hZGp1c3RfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0ICBwaHlfZGV2aWNlICpwaHlkZXYgPSBhZGFwdGVyLT5waHlkZXY7CisKKwlpZiAobmV0aWZfY2Fycmllcl9vayhuZXRkZXYpKSB7CisJCWFkYXB0ZXItPmJvb3RfY29tYSA9IDIwOworCisJCWlmIChwaHlkZXYgJiYgcGh5ZGV2LT5zcGVlZCA9PSBTUEVFRF8xMCkgeworCQkJLyoKKwkJCSAqIE5PVEUgLSBJcyB0aGVyZSBhIHdheSB0byBxdWVyeSB0aGlzIHdpdGhvdXQKKwkJCSAqIFRydWVQSFk/CisJCQkgKiAmJiBUUlVfUXVlcnlDb3JlVHlwZShhZGFwdGVyLT5oVHJ1ZVBoeSwgMCk9PQorCQkJICogRU1JX1RSVUVQSFlfQTEzTykgeworCQkJICovCisJCQl1MTYgcmVnaXN0ZXIxODsKKworCQkJZXQxMzF4X21paV9yZWFkKGFkYXB0ZXIsIFBIWV9NUEhZX0NPTlRST0xfUkVHLAorCQkJCQkgJnJlZ2lzdGVyMTgpOworCQkJZXQxMzF4X21paV93cml0ZShhZGFwdGVyLCBQSFlfTVBIWV9DT05UUk9MX1JFRywKKwkJCQkJIHJlZ2lzdGVyMTggfCAweDQpOworCQkJZXQxMzF4X21paV93cml0ZShhZGFwdGVyLCBQSFlfSU5ERVhfUkVHLAorCQkJCQkgcmVnaXN0ZXIxOCB8IDB4ODQwMik7CisJCQlldDEzMXhfbWlpX3dyaXRlKGFkYXB0ZXIsIFBIWV9EQVRBX1JFRywKKwkJCQkJIHJlZ2lzdGVyMTggfCA1MTEpOworCQkJZXQxMzF4X21paV93cml0ZShhZGFwdGVyLCBQSFlfTVBIWV9DT05UUk9MX1JFRywKKwkJCQkJIHJlZ2lzdGVyMTgpOworCQl9CisKKwkJZXQxMzEwX2NvbmZpZ19mbG93X2NvbnRyb2woYWRhcHRlcik7CisKKwkJaWYgKHBoeWRldiAmJiBwaHlkZXYtPnNwZWVkID09IFNQRUVEXzEwMDAgJiYKKwkJCQlhZGFwdGVyLT5yZWdpc3RyeV9qdW1ib19wYWNrZXQgPiAyMDQ4KSB7CisJCQl1MTYgcmVnOworCisJCQlldDEzMXhfbWlpX3JlYWQoYWRhcHRlciwgUEhZX0NPTkZJRywgJnJlZyk7CisJCQlyZWcgJj0gfkVUX1BIWV9DT05GSUdfVFhfRklGT19ERVBUSDsKKwkJCXJlZyB8PSBFVF9QSFlfQ09ORklHX0ZJRk9fREVQVEhfMzI7CisJCQlldDEzMXhfbWlpX3dyaXRlKGFkYXB0ZXIsIFBIWV9DT05GSUcsIHJlZyk7CisJCX0KKworCQlldDEzMXhfc2V0X3J4X2RtYV90aW1lcihhZGFwdGVyKTsKKwkJZXQxMzEwX2NvbmZpZ19tYWNfcmVnczIoYWRhcHRlcik7CisJfQorCisJaWYgKHBoeWRldiAmJiBwaHlkZXYtPmxpbmsgIT0gYWRhcHRlci0+bGluaykgeworCQkvKgorCQkgKiBDaGVjayB0byBzZWUgaWYgd2UgYXJlIGluIGNvbWEgbW9kZSBhbmQgaWYKKwkJICogc28sIGRpc2FibGUgaXQgYmVjYXVzZSB3ZSB3aWxsIG5vdCBiZSBhYmxlCisJCSAqIHRvIHJlYWQgUEhZIHZhbHVlcyB1bnRpbCB3ZSBhcmUgb3V0LgorCQkgKi8KKwkJaWYgKGV0MTMxMF9pbl9waHlfY29tYShhZGFwdGVyKSkKKwkJCWV0MTMxMF9kaXNhYmxlX3BoeV9jb21hKGFkYXB0ZXIpOworCisJCWlmIChwaHlkZXYtPmxpbmspIHsKKwkJCWFkYXB0ZXItPmJvb3RfY29tYSA9IDIwOworCQl9IGVsc2UgeworCQkJZGV2X3dhcm4oJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSAgICAiTGluayBkb3duIC0gY2FibGUgcHJvYmxlbSA/XG4iKTsKKwkJCWFkYXB0ZXItPmJvb3RfY29tYSA9IDA7CisKKwkJCWlmIChwaHlkZXYtPnNwZWVkID09IFNQRUVEXzEwKSB7CisJCQkJLyogTk9URSAtIElzIHRoZXJlIGEgd2F5IHRvIHF1ZXJ5IHRoaXMgd2l0aG91dAorCQkJCSAqIFRydWVQSFk/CisJCQkJICogJiYgVFJVX1F1ZXJ5Q29yZVR5cGUoYWRhcHRlci0+aFRydWVQaHksIDApID09CisJCQkJICogRU1JX1RSVUVQSFlfQTEzTykKKwkJCQkgKi8KKwkJCQl1MTYgcmVnaXN0ZXIxODsKKworCQkJCWV0MTMxeF9taWlfcmVhZChhZGFwdGVyLCBQSFlfTVBIWV9DT05UUk9MX1JFRywKKwkJCQkJCSAmcmVnaXN0ZXIxOCk7CisJCQkJZXQxMzF4X21paV93cml0ZShhZGFwdGVyLCBQSFlfTVBIWV9DT05UUk9MX1JFRywKKwkJCQkJCSByZWdpc3RlcjE4IHwgMHg0KTsKKwkJCQlldDEzMXhfbWlpX3dyaXRlKGFkYXB0ZXIsIFBIWV9JTkRFWF9SRUcsCisJCQkJCQkgcmVnaXN0ZXIxOCB8IDB4ODQwMik7CisJCQkJZXQxMzF4X21paV93cml0ZShhZGFwdGVyLCBQSFlfREFUQV9SRUcsCisJCQkJCQkgcmVnaXN0ZXIxOCB8IDUxMSk7CisJCQkJZXQxMzF4X21paV93cml0ZShhZGFwdGVyLCBQSFlfTVBIWV9DT05UUk9MX1JFRywKKwkJCQkJCSByZWdpc3RlcjE4KTsKKwkJCX0KKworCQkJLyogRnJlZSB0aGUgcGFja2V0cyBiZWluZyBhY3RpdmVseSBzZW50ICYgc3RvcHBlZCAqLworCQkJZXQxMzF4X2ZyZWVfYnVzeV9zZW5kX3BhY2tldHMoYWRhcHRlcik7CisKKwkJCS8qIFJlLWluaXRpYWxpemUgdGhlIHNlbmQgc3RydWN0dXJlcyAqLworCQkJZXQxMzF4X2luaXRfc2VuZChhZGFwdGVyKTsKKworCQkJLyoKKwkJCSAqIEJyaW5nIHRoZSBkZXZpY2UgYmFjayB0byB0aGUgc3RhdGUgaXQgd2FzIGR1cmluZworCQkJICogaW5pdCBwcmlvciB0byBhdXRvbmVnb3RpYXRpb24gYmVpbmcgY29tcGxldGUuIFRoaXMKKwkJCSAqIHdheSwgd2hlbiB3ZSBnZXQgdGhlIGF1dG8tbmVnIGNvbXBsZXRlIGludGVycnVwdCwKKwkJCSAqIHdlIGNhbiBjb21wbGV0ZSBpbml0IGJ5IGNhbGxpbmcgY29uZmlnX21hY19yZWdzMi4KKwkJCSAqLworCQkJZXQxMzF4X3NvZnRfcmVzZXQoYWRhcHRlcik7CisKKwkJCS8qIFNldHVwIEVUMTMxMCBhcyBwZXIgdGhlIGRvY3VtZW50YXRpb24gKi8KKwkJCWV0MTMxeF9hZGFwdGVyX3NldHVwKGFkYXB0ZXIpOworCisJCQkvKiBwZXJmb3JtIHJlc2V0IG9mIHR4L3J4ICovCisJCQlldDEzMXhfZGlzYWJsZV90eHJ4KG5ldGRldik7CisJCQlldDEzMXhfZW5hYmxlX3R4cngobmV0ZGV2KTsKKwkJfQorCisJCWFkYXB0ZXItPmxpbmsgPSBwaHlkZXYtPmxpbms7CisKKwkJcGh5X3ByaW50X3N0YXR1cyhwaHlkZXYpOworCX0KK30KKworc3RhdGljIGludCBldDEzMXhfbWlpX3Byb2JlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgIHBoeV9kZXZpY2UgKnBoeWRldiA9IE5VTEw7CisKKwlwaHlkZXYgPSBwaHlfZmluZF9maXJzdChhZGFwdGVyLT5taWlfYnVzKTsKKwlpZiAoIXBoeWRldikgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJubyBQSFkgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwaHlkZXYgPSBwaHlfY29ubmVjdChuZXRkZXYsIGRldl9uYW1lKCZwaHlkZXYtPmRldiksCisJCQkmZXQxMzF4X2FkanVzdF9saW5rLCAwLCBQSFlfSU5URVJGQUNFX01PREVfTUlJKTsKKworCWlmIChJU19FUlIocGh5ZGV2KSkgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJDb3VsZCBub3QgYXR0YWNoIHRvIFBIWVxuIik7CisJCXJldHVybiBQVFJfRVJSKHBoeWRldik7CisJfQorCisJcGh5ZGV2LT5zdXBwb3J0ZWQgJj0gKFNVUFBPUlRFRF8xMGJhc2VUX0hhbGYKKwkJCQl8IFNVUFBPUlRFRF8xMGJhc2VUX0Z1bGwKKwkJCQl8IFNVUFBPUlRFRF8xMDBiYXNlVF9IYWxmCisJCQkJfCBTVVBQT1JURURfMTAwYmFzZVRfRnVsbAorCQkJCXwgU1VQUE9SVEVEX0F1dG9uZWcKKwkJCQl8IFNVUFBPUlRFRF9NSUkKKwkJCQl8IFNVUFBPUlRFRF9UUCk7CisKKwlpZiAoYWRhcHRlci0+cGRldi0+ZGV2aWNlICE9IEVUMTMxWF9QQ0lfREVWSUNFX0lEX0ZBU1QpCisJCXBoeWRldi0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbDsKKworCXBoeWRldi0+YWR2ZXJ0aXNpbmcgPSBwaHlkZXYtPnN1cHBvcnRlZDsKKwlhZGFwdGVyLT5waHlkZXYgPSBwaHlkZXY7CisKKwlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiYXR0YWNoZWQgUEhZIGRyaXZlciBbJXNdICIKKwkJICIobWlpX2J1czpwaHlfYWRkcj0lcylcbiIsCisJCSBwaHlkZXYtPmRydi0+bmFtZSwgZGV2X25hbWUoJnBoeWRldi0+ZGV2KSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBldDEzMXhfYWRhcHRlcl9pbml0CisgKiBAYWRhcHRlcjogcG9pbnRlciB0byB0aGUgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdAorICogQHBkZXY6IHBvaW50ZXIgdG8gdGhlIFBDSSBkZXZpY2UKKyAqCisgKiBJbml0aWFsaXplIHRoZSBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoZSBldDEzMXhfYWRhcHRlciBvYmplY3QgYW5kIGxpbmsKKyAqIHRoZW0gdG9nZXRoZXIgd2l0aCB0aGUgcGxhdGZvcm0gcHJvdmlkZWQgZGV2aWNlIHN0cnVjdHVyZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0MTMxeF9hZGFwdGVyX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RhdGljIGNvbnN0IHU4IGRlZmF1bHRfbWFjW10gPSB7IDB4MDAsIDB4MDUsIDB4M2QsIDB4MDAsIDB4MDIsIDB4MDAgfTsKKworCXN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcjsKKworCS8qIEFsbG9jYXRlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3QgYW5kIGNvcHkgaW4gcmVsZXZhbnQgaW5mb3JtYXRpb24gKi8KKwlhZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlhZGFwdGVyLT5wZGV2ID0gcGNpX2Rldl9nZXQocGRldik7CisJYWRhcHRlci0+bmV0ZGV2ID0gbmV0ZGV2OworCisJLyogRG8gdGhlIHNhbWUgZm9yIHRoZSBuZXRkZXYgc3RydWN0ICovCisJbmV0ZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJbmV0ZGV2LT5iYXNlX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7CisKKwkvKiBJbml0aWFsaXplIHNwaW5sb2NrcyBoZXJlICovCisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT50Y2Jfc2VuZF9xbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPnRjYl9yZWFkeV9xbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPnNlbmRfaHdfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPnJjdl9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+cmN2X3BlbmRfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPmZicl9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+cGh5X2xvY2spOworCisJYWRhcHRlci0+cmVnaXN0cnlfanVtYm9fcGFja2V0ID0gMTUxNDsJLyogMTUxNC05MjE2ICovCisKKwkvKiBTZXQgdGhlIE1BQyBhZGRyZXNzIHRvIGEgZGVmYXVsdCAqLworCW1lbWNweShhZGFwdGVyLT5hZGRyLCBkZWZhdWx0X21hYywgRVRIX0FMRU4pOworCisJcmV0dXJuIGFkYXB0ZXI7Cit9CisKKy8qKgorICogZXQxMzF4X3BjaV9yZW1vdmUKKyAqIEBwZGV2OiBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCisgKgorICogUmVnaXN0ZXJlZCBpbiB0aGUgcGNpX2RyaXZlciBzdHJ1Y3R1cmUsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdGhlCisgKiBQQ0kgc3Vic3lzdGVtIGRldGVjdHMgdGhhdCBhIFBDSSBkZXZpY2Ugd2hpY2ggbWF0Y2hlcyB0aGUgaW5mb3JtYXRpb24KKyAqIGNvbnRhaW5lZCBpbiB0aGUgcGNpX2RldmljZV9pZCB0YWJsZSBoYXMgYmVlbiByZW1vdmVkLgorICovCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZXQxMzF4X3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKKwltZGlvYnVzX3VucmVnaXN0ZXIoYWRhcHRlci0+bWlpX2J1cyk7CisJa2ZyZWUoYWRhcHRlci0+bWlpX2J1cy0+aXJxKTsKKwltZGlvYnVzX2ZyZWUoYWRhcHRlci0+bWlpX2J1cyk7CisKKwlldDEzMXhfYWRhcHRlcl9tZW1vcnlfZnJlZShhZGFwdGVyKTsKKwlpb3VubWFwKGFkYXB0ZXItPnJlZ3MpOworCXBjaV9kZXZfcHV0KHBkZXYpOworCisJZnJlZV9uZXRkZXYobmV0ZGV2KTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK30KKworLyoqCisgKiBldDEzMXhfdXAgLSBCcmluZyB1cCBhIGRldmljZSBmb3IgdXNlLgorICogQG5ldGRldjogZGV2aWNlIHRvIGJlIG9wZW5lZAorICovCit2b2lkIGV0MTMxeF91cChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlldDEzMXhfZW5hYmxlX3R4cngobmV0ZGV2KTsKKwlwaHlfc3RhcnQoYWRhcHRlci0+cGh5ZGV2KTsKK30KKworLyoqCisgKiBldDEzMXhfZG93biAtIEJyaW5nIGRvd24gdGhlIGRldmljZQorICogQG5ldGRldjogZGV2aWNlIHRvIGJlIGJyb2dodCBkb3duCisgKi8KK3ZvaWQgZXQxMzF4X2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJLyogU2F2ZSB0aGUgdGltZXN0YW1wIGZvciB0aGUgVFggd2F0Y2hkb2csIHByZXZlbnQgYSB0aW1lb3V0ICovCisJbmV0ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlwaHlfc3RvcChhZGFwdGVyLT5waHlkZXYpOworCWV0MTMxeF9kaXNhYmxlX3R4cngobmV0ZGV2KTsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBldDEzMXhfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOworCQlldDEzMXhfZG93bihuZXRkZXYpOworCQlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBldDEzMXhfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCQlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKwkJZXQxMzF4X3VwKG5ldGRldik7CisJCW5ldGlmX2RldmljZV9hdHRhY2gobmV0ZGV2KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogSVNSIGZ1bmN0aW9ucyAqLworCisvKioKKyAqIGV0MTMxeF9pc3IgLSBUaGUgSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZSBmb3IgdGhlIGRyaXZlci4KKyAqIEBpcnE6IHRoZSBJUlEgb24gd2hpY2ggdGhlIGludGVycnVwdCB3YXMgcmVjZWl2ZWQuCisgKiBAZGV2X2lkOiBkZXZpY2Utc3BlY2lmaWMgaW5mbyAoaGVyZSBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlIHN0cnVjdCkKKyAqCisgKiBSZXR1cm5zIGEgdmFsdWUgaW5kaWNhdGluZyBpZiB0aGUgaW50ZXJydXB0IHdhcyBoYW5kbGVkLgorICovCitpcnFyZXR1cm5fdCBldDEzMXhfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlib29sIGhhbmRsZWQgPSB0cnVlOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisJc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyID0gTlVMTDsKKwl1MzIgc3RhdHVzOworCisJaWYgKCFuZXRpZl9kZXZpY2VfcHJlc2VudChuZXRkZXYpKSB7CisJCWhhbmRsZWQgPSBmYWxzZTsKKwkJZ290byBvdXQ7CisJfQorCisJYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwkvKiBJZiB0aGUgYWRhcHRlciBpcyBpbiBsb3cgcG93ZXIgc3RhdGUsIHRoZW4gaXQgc2hvdWxkIG5vdAorCSAqIHJlY29nbml6ZSBhbnkgaW50ZXJydXB0CisJICovCisKKwkvKiBEaXNhYmxlIERldmljZSBJbnRlcnJ1cHRzICovCisJZXQxMzF4X2Rpc2FibGVfaW50ZXJydXB0cyhhZGFwdGVyKTsKKworCS8qIEdldCBhIGNvcHkgb2YgdGhlIHZhbHVlIGluIHRoZSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyCisJICogc28gd2UgY2FuIHByb2Nlc3MgdGhlIGludGVycnVwdGluZyBzZWN0aW9uCisJICovCisJc3RhdHVzID0gcmVhZGwoJmFkYXB0ZXItPnJlZ3MtPmdsb2JhbC5pbnRfc3RhdHVzKTsKKworCWlmIChhZGFwdGVyLT5mbG93Y29udHJvbCA9PSBGTE9XX1RYT05MWSB8fAorCSAgICBhZGFwdGVyLT5mbG93Y29udHJvbCA9PSBGTE9XX0JPVEgpIHsKKwkJc3RhdHVzICY9IH5JTlRfTUFTS19FTkFCTEU7CisJfSBlbHNlIHsKKwkJc3RhdHVzICY9IH5JTlRfTUFTS19FTkFCTEVfTk9fRkxPVzsKKwl9CisKKwkvKiBNYWtlIHN1cmUgdGhpcyBpcyBvdXIgaW50ZXJydXB0ICovCisJaWYgKCFzdGF0dXMpIHsKKwkJaGFuZGxlZCA9IGZhbHNlOworCQlldDEzMXhfZW5hYmxlX2ludGVycnVwdHMoYWRhcHRlcik7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFRoaXMgaXMgb3VyIGludGVycnVwdCwgc28gcHJvY2VzcyBhY2NvcmRpbmdseSAqLworCisJaWYgKHN0YXR1cyAmIEVUX0lOVFJfV0FUQ0hET0cpIHsKKwkJc3RydWN0IHRjYiAqdGNiID0gYWRhcHRlci0+dHhfcmluZy5zZW5kX2hlYWQ7CisKKwkJaWYgKHRjYikKKwkJCWlmICgrK3RjYi0+c3RhbGUgPiAxKQorCQkJCXN0YXR1cyB8PSBFVF9JTlRSX1RYRE1BX0lTUjsKKworCQlpZiAoYWRhcHRlci0+cnhfcmluZy51bmZpbmlzaGVkX3JlY2VpdmVzKQorCQkJc3RhdHVzIHw9IEVUX0lOVFJfUlhETUFfWEZSX0RPTkU7CisJCWVsc2UgaWYgKHRjYiA9PSBOVUxMKQorCQkJd3JpdGVsKDAsICZhZGFwdGVyLT5yZWdzLT5nbG9iYWwud2F0Y2hkb2dfdGltZXIpOworCisJCXN0YXR1cyAmPSB+RVRfSU5UUl9XQVRDSERPRzsKKwl9CisKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJLyogVGhpcyBpbnRlcnJ1cHQgaGFzIGluIHNvbWUgd2F5IGJlZW4gImhhbmRsZWQiIGJ5CisJCSAqIHRoZSBJU1IuIEVpdGhlciBpdCB3YXMgYSBzcHVyaW91cyBSeCBpbnRlcnJ1cHQsIG9yCisJCSAqIGl0IHdhcyBhIFR4IGludGVycnVwdCB0aGF0IGhhcyBiZWVuIGZpbHRlcmVkIGJ5CisJCSAqIHRoZSBJU1IuCisJCSAqLworCQlldDEzMXhfZW5hYmxlX2ludGVycnVwdHMoYWRhcHRlcik7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFdlIG5lZWQgdG8gc2F2ZSB0aGUgaW50ZXJydXB0IHN0YXR1cyB2YWx1ZSBmb3IgdXNlIGluIG91cgorCSAqIERQQy4gV2Ugd2lsbCBjbGVhciB0aGUgc29mdHdhcmUgY29weSBvZiB0aGF0IGluIHRoYXQKKwkgKiByb3V0aW5lLgorCSAqLworCWFkYXB0ZXItPnN0YXRzLmludGVycnVwdF9zdGF0dXMgPSBzdGF0dXM7CisKKwkvKiBTY2hlZHVsZSB0aGUgSVNSIGhhbmRsZXIgYXMgYSBib3R0b20taGFsZiB0YXNrIGluIHRoZQorCSAqIGtlcm5lbCdzIHRxX2ltbWVkaWF0ZSBxdWV1ZSwgYW5kIG1hcmsgdGhlIHF1ZXVlIGZvcgorCSAqIGV4ZWN1dGlvbgorCSAqLworCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPnRhc2spOworb3V0OgorCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKioKKyAqIGV0MTMxeF9pc3JfaGFuZGxlciAtIFRoZSBJU1IgaGFuZGxlcgorICogQHBfYWRhcHRlciwgYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCisgKgorICogc2NoZWR1bGVkIHRvIHJ1biBpbiBhIGRlZmVycmVkIGNvbnRleHQgYnkgdGhlIElTUi4gVGhpcyBpcyB3aGVyZSB0aGUgSVNSJ3MKKyAqIHdvcmsgYWN0dWFsbHkgZ2V0cyBkb25lLgorICovCit2b2lkIGV0MTMxeF9pc3JfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBldDEzMXhfYWRhcHRlciwgdGFzayk7CisJdTMyIHN0YXR1cyA9IGFkYXB0ZXItPnN0YXRzLmludGVycnVwdF9zdGF0dXM7CisJc3RydWN0IGFkZHJlc3NfbWFwIF9faW9tZW0gKmlvbWVtID0gYWRhcHRlci0+cmVnczsKKworCS8qCisJICogVGhlc2UgZmlyc3QgdHdvIGFyZSBieSBmYXIgdGhlIG1vc3QgY29tbW9uLiAgT25jZSBoYW5kbGVkLCB3ZSBjbGVhcgorCSAqIHRoZWlyIHR3byBiaXRzIGluIHRoZSBzdGF0dXMgd29yZC4gIElmIHRoZSB3b3JkIGlzIG5vdyB6ZXJvLCB3ZQorCSAqIGV4aXQuCisJICovCisJLyogSGFuZGxlIGFsbCB0aGUgY29tcGxldGVkIFRyYW5zbWl0IGludGVycnVwdHMgKi8KKwlpZiAoc3RhdHVzICYgRVRfSU5UUl9UWERNQV9JU1IpCisJCWV0MTMxeF9oYW5kbGVfc2VuZF9pbnRlcnJ1cHQoYWRhcHRlcik7CisKKwkvKiBIYW5kbGUgYWxsIHRoZSBjb21wbGV0ZWQgUmVjZWl2ZXMgaW50ZXJydXB0cyAqLworCWlmIChzdGF0dXMgJiBFVF9JTlRSX1JYRE1BX1hGUl9ET05FKQorCQlldDEzMXhfaGFuZGxlX3JlY3ZfaW50ZXJydXB0KGFkYXB0ZXIpOworCisJc3RhdHVzICY9IDB4ZmZmZmZmZDc7CisKKwlpZiAoc3RhdHVzKSB7CisJCS8qIEhhbmRsZSB0aGUgVFhETUEgRXJyb3IgaW50ZXJydXB0ICovCisJCWlmIChzdGF0dXMgJiBFVF9JTlRSX1RYRE1BX0VSUikgeworCQkJdTMyIHR4ZG1hX2VycjsKKworCQkJLyogRm9sbG93aW5nIHJlYWQgYWxzbyBjbGVhcnMgdGhlIHJlZ2lzdGVyIChDT1IpICovCisJCQl0eGRtYV9lcnIgPSByZWFkbCgmaW9tZW0tPnR4ZG1hLnR4X2RtYV9lcnJvcik7CisKKwkJCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkJICAgICJUWERNQV9FUlIgaW50ZXJydXB0LCBlcnJvciA9ICVkXG4iLAorCQkJCSAgICB0eGRtYV9lcnIpOworCQl9CisKKwkJLyogSGFuZGxlIEZyZWUgQnVmZmVyIFJpbmcgMCBhbmQgMSBMb3cgaW50ZXJydXB0ICovCisJCWlmIChzdGF0dXMgJgorCQkgICAgKEVUX0lOVFJfUlhETUFfRkJfUjBfTE9XIHwgRVRfSU5UUl9SWERNQV9GQl9SMV9MT1cpKSB7CisJCQkvKgorCQkJICogVGhpcyBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiB1bnVzZWQgYnVmZmVycyBpbgorCQkJICogUlhETUEgZnJlZSBidWZmZXIgcmluZyAwIGlzIDw9IHRoZSBsaW1pdCB5b3UKKwkJCSAqIHByb2dyYW1tZWQuIEZyZWUgYnVmZmVyIHJlc291cmNlcyBuZWVkIHRvIGJlCisJCQkgKiByZXR1cm5lZC4gIEZyZWUgYnVmZmVycyBhcmUgY29uc3VtZWQgYXMgcGFja2V0cworCQkJICogYXJlIHBhc3NlZCBmcm9tIHRoZSBuZXR3b3JrIHRvIHRoZSBob3N0LiBUaGUgaG9zdAorCQkJICogYmVjb21lcyBhd2FyZSBvZiB0aGUgcGFja2V0cyBmcm9tIHRoZSBjb250ZW50cyBvZgorCQkJICogdGhlIHBhY2tldCBzdGF0dXMgcmluZy4gVGhpcyByaW5nIGlzIHF1ZXJpZWQgd2hlbgorCQkJICogdGhlIHBhY2tldCBkb25lIGludGVycnVwdCBvY2N1cnMuIFBhY2tldHMgYXJlIHRoZW4KKwkJCSAqIHBhc3NlZCB0byB0aGUgT1MuIFdoZW4gdGhlIE9TIGlzIGRvbmUgd2l0aCB0aGUKKwkJCSAqIHBhY2tldHMgdGhlIHJlc291cmNlcyBjYW4gYmUgcmV0dXJuZWQgdG8gdGhlCisJCQkgKiBFVDEzMTAgZm9yIHJlLXVzZS4gVGhpcyBpbnRlcnJ1cHQgaXMgb25lIG1ldGhvZCBvZgorCQkJICogcmV0dXJuaW5nIHJlc291cmNlcy4KKwkJCSAqLworCisJCQkvKiBJZiB0aGUgdXNlciBoYXMgZmxvdyBjb250cm9sIG9uLCB0aGVuIHdlIHdpbGwKKwkJCSAqIHNlbmQgYSBwYXVzZSBwYWNrZXQsIG90aGVyd2lzZSBqdXN0IGV4aXQKKwkJCSAqLworCQkJaWYgKGFkYXB0ZXItPmZsb3djb250cm9sID09IEZMT1dfVFhPTkxZIHx8CisJCQkgICAgYWRhcHRlci0+Zmxvd2NvbnRyb2wgPT0gRkxPV19CT1RIKSB7CisJCQkJdTMyIHBtX2NzcjsKKworCQkJCS8qIFRlbGwgdGhlIGRldmljZSB0byBzZW5kIGEgcGF1c2UgcGFja2V0IHZpYQorCQkJCSAqIHRoZSBiYWNrIHByZXNzdXJlIHJlZ2lzdGVyIChicCByZXEgIGFuZAorCQkJCSAqIGJwIHhvbi94b2ZmKQorCQkJCSAqLworCQkJCXBtX2NzciA9IHJlYWRsKCZpb21lbS0+Z2xvYmFsLnBtX2Nzcik7CisJCQkJaWYgKCFldDEzMTBfaW5fcGh5X2NvbWEoYWRhcHRlcikpCisJCQkJCXdyaXRlbCgzLCAmaW9tZW0tPnR4bWFjLmJwX2N0cmwpOworCQkJfQorCQl9CisKKwkJLyogSGFuZGxlIFBhY2tldCBTdGF0dXMgUmluZyBMb3cgSW50ZXJydXB0ICovCisJCWlmIChzdGF0dXMgJiBFVF9JTlRSX1JYRE1BX1NUQVRfTE9XKSB7CisKKwkJCS8qCisJCQkgKiBTYW1lIGlkZWEgYXMgd2l0aCB0aGUgdHdvIEZyZWUgQnVmZmVyIFJpbmdzLgorCQkJICogUGFja2V0cyBnb2luZyBmcm9tIHRoZSBuZXR3b3JrIHRvIHRoZSBob3N0IGVhY2gKKwkJCSAqIGNvbnN1bWUgYSBmcmVlIGJ1ZmZlciByZXNvdXJjZSBhbmQgYSBwYWNrZXQgc3RhdHVzCisJCQkgKiByZXNvdXJjZS4gIFRoZXNlIHJlc291cmVzIGFyZSBwYXNzZWQgdG8gdGhlIE9TLgorCQkJICogV2hlbiB0aGUgT1MgaXMgZG9uZSB3aXRoIHRoZSByZXNvdXJjZXMsIHRoZXkgbmVlZAorCQkJICogdG8gYmUgcmV0dXJuZWQgdG8gdGhlIEVUMTMxMC4gVGhpcyBpcyBvbmUgbWV0aG9kCisJCQkgKiBvZiByZXR1cm5pbmcgdGhlIHJlc291cmNlcy4KKwkJCSAqLworCQl9CisKKwkJLyogSGFuZGxlIFJYRE1BIEVycm9yIEludGVycnVwdCAqLworCQlpZiAoc3RhdHVzICYgRVRfSU5UUl9SWERNQV9FUlIpIHsKKwkJCS8qCisJCQkgKiBUaGUgcnhkbWFfZXJyb3IgaW50ZXJydXB0IGlzIHNlbnQgd2hlbiBhIHRpbWUtb3V0CisJCQkgKiBvbiBhIHJlcXVlc3QgaXNzdWVkIGJ5IHRoZSBKQUdDb3JlIGhhcyBvY2N1cnJlZCBvcgorCQkJICogYSBjb21wbGV0aW9uIGlzIHJldHVybmVkIHdpdGggYW4gdW4tc3VjY2Vzc2Z1bAorCQkJICogc3RhdHVzLiAgSW4gYm90aCBjYXNlcyB0aGUgcmVxdWVzdCBpcyBjb25zaWRlcmVkCisJCQkgKiBjb21wbGV0ZS4gVGhlIEpBR0NvcmUgd2lsbCBhdXRvbWF0aWNhbGx5IHJlLXRyeSB0aGUKKwkJCSAqIHJlcXVlc3QgaW4gcXVlc3Rpb24uIE5vcm1hbGx5IGluZm9ybWF0aW9uIG9uIGV2ZW50cworCQkJICogbGlrZSB0aGVzZSBhcmUgc2VudCB0byB0aGUgaG9zdCB1c2luZyB0aGUgIkFkdmFuY2VkCisJCQkgKiBFcnJvciBSZXBvcnRpbmciIGNhcGFiaWxpdHkuIFRoaXMgaW50ZXJydXB0IGlzCisJCQkgKiBhbm90aGVyIHdheSBvZiBnZXR0aW5nIHNpbWlsYXIgaW5mb3JtYXRpb24uIFRoZQorCQkJICogb25seSB0aGluZyByZXF1aXJlZCBpcyB0byBjbGVhciB0aGUgaW50ZXJydXB0IGJ5CisJCQkgKiByZWFkaW5nIHRoZSBJU1IgaW4gdGhlIGdsb2JhbCByZXNvdXJjZXMuIFRoZQorCQkJICogSkFHQ29yZSB3aWxsIGRvIGEgcmUtdHJ5IG9uIHRoZSByZXF1ZXN0LiAgTm9ybWFsbHkKKwkJCSAqIHlvdSBzaG91bGQgbmV2ZXIgc2VlIHRoaXMgaW50ZXJydXB0LiBJZiB5b3Ugc3RhcnQKKwkJCSAqIHRvIHNlZSB0aGlzIGludGVycnVwdCBvY2N1cnJpbmcgZnJlcXVlbnRseSB0aGVuCisJCQkgKiBzb21ldGhpbmcgYmFkIGhhcyBvY2N1cnJlZC4gQSByZXNldCBtaWdodCBiZSB0aGUKKwkJCSAqIHRoaW5nIHRvIGRvLgorCQkJICovCisJCQkvKiBUUkFQKCk7Ki8KKworCQkJZGV2X3dhcm4oJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkgICAgIlJ4RE1BX0VSUiBpbnRlcnJ1cHQsIGVycm9yICV4XG4iLAorCQkJCSAgICByZWFkbCgmaW9tZW0tPnR4bWFjLnR4X3Rlc3QpKTsKKwkJfQorCisJCS8qIEhhbmRsZSB0aGUgV2FrZSBvbiBMQU4gRXZlbnQgKi8KKwkJaWYgKHN0YXR1cyAmIEVUX0lOVFJfV09MKSB7CisJCQkvKgorCQkJICogVGhpcyBpcyBhIHNlY29uZGFyeSBpbnRlcnJ1cHQgZm9yIHdha2Ugb24gTEFOLgorCQkJICogVGhlIGRyaXZlciBzaG91bGQgbmV2ZXIgc2VlIHRoaXMsIGlmIGl0IGRvZXMsCisJCQkgKiBzb21ldGhpbmcgc2VyaW91cyBpcyB3cm9uZy4gV2Ugd2lsbCBUUkFQIHRoZQorCQkJICogbWVzc2FnZSB3aGVuIHdlIGFyZSBpbiBEQkcgbW9kZSwgb3RoZXJ3aXNlIHdlCisJCQkgKiB3aWxsIGlnbm9yZSBpdC4KKwkJCSAqLworCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiV0FLRV9PTl9MQU4gaW50ZXJydXB0XG4iKTsKKwkJfQorCisJCS8qIExldCdzIG1vdmUgb24gdG8gdGhlIFR4TWFjICovCisJCWlmIChzdGF0dXMgJiBFVF9JTlRSX1RYTUFDKSB7CisJCQl1MzIgZXJyID0gcmVhZGwoJmlvbWVtLT50eG1hYy5lcnIpOworCisJCQkvKgorCQkJICogV2hlbiBhbnkgb2YgdGhlIGVycm9ycyBvY2N1ciBhbmQgVFhNQUMgZ2VuZXJhdGVzCisJCQkgKiBhbiBpbnRlcnJ1cHQgdG8gcmVwb3J0IHRoZXNlIGVycm9ycywgaXQgdXN1YWxseQorCQkJICogbWVhbnMgdGhhdCBUWE1BQyBoYXMgZGV0ZWN0ZWQgYW4gZXJyb3IgaW4gdGhlIGRhdGEKKwkJCSAqIHN0cmVhbSByZXRyaWV2ZWQgZnJvbSB0aGUgb24tY2hpcCBUeCBRLiBBbGwgb2YKKwkJCSAqIHRoZXNlIGVycm9ycyBhcmUgY2F0YXN0cm9waGljIGFuZCBUWE1BQyB3b24ndCBiZQorCQkJICogYWJsZSB0byByZWNvdmVyIGRhdGEgd2hlbiB0aGVzZSBlcnJvcnMgb2NjdXIuICBJbgorCQkJICogYSBudXRzaGVsbCwgdGhlIHdob2xlIFR4IHBhdGggd2lsbCBoYXZlIHRvIGJlIHJlc2V0CisJCQkgKiBhbmQgcmUtY29uZmlndXJlZCBhZnRlcndhcmRzLgorCQkJICovCisJCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCSAgICAiVFhNQUMgaW50ZXJydXB0LCBlcnJvciAweCUwOHhcbiIsCisJCQkJICAgIGVycik7CisKKwkJCS8qIElmIHdlIGFyZSBkZWJ1Z2dpbmcsIHdlIHdhbnQgdG8gc2VlIHRoaXMgZXJyb3IsCisJCQkgKiBvdGhlcndpc2Ugd2UganVzdCB3YW50IHRoZSBkZXZpY2UgdG8gYmUgcmVzZXQgYW5kCisJCQkgKiBjb250aW51ZQorCQkJICovCisJCX0KKworCQkvKiBIYW5kbGUgUlhNQUMgSW50ZXJydXB0ICovCisJCWlmIChzdGF0dXMgJiBFVF9JTlRSX1JYTUFDKSB7CisJCQkvKgorCQkJICogVGhlc2UgaW50ZXJydXB0cyBhcmUgY2F0YXN0cm9waGljIHRvIHRoZSBkZXZpY2UsCisJCQkgKiB3aGF0IHdlIG5lZWQgdG8gZG8gaXMgZGlzYWJsZSB0aGUgaW50ZXJydXB0cyBhbmQKKwkJCSAqIHNldCB0aGUgZmxhZyB0byBjYXVzZSB1cyB0byByZXNldCBzbyB3ZSBjYW4gc29sdmUKKwkJCSAqIHRoaXMgaXNzdWUuCisJCQkgKi8KKwkJCS8qIE1QX1NFVF9GTEFHKCBhZGFwdGVyLAorCQkJCQkJZk1QX0FEQVBURVJfSEFSRFdBUkVfRVJST1IpOyAqLworCisJCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJICAiUlhNQUMgaW50ZXJydXB0LCBlcnJvciAweCUwOHguICBSZXF1ZXN0aW5nIHJlc2V0XG4iLAorCQkJCSAgICByZWFkbCgmaW9tZW0tPnJ4bWFjLmVycl9yZWcpKTsKKworCQkJZGV2X3dhcm4oJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkgICAgIkVuYWJsZSAweCUwOHgsIERpYWcgMHglMDh4XG4iLAorCQkJCSAgICByZWFkbCgmaW9tZW0tPnJ4bWFjLmN0cmwpLAorCQkJCSAgICByZWFkbCgmaW9tZW0tPnJ4bWFjLnJ4cV9kaWFnKSk7CisKKwkJCS8qCisJCQkgKiBJZiB3ZSBhcmUgZGVidWdnaW5nLCB3ZSB3YW50IHRvIHNlZSB0aGlzIGVycm9yLAorCQkJICogb3RoZXJ3aXNlIHdlIGp1c3Qgd2FudCB0aGUgZGV2aWNlIHRvIGJlIHJlc2V0IGFuZAorCQkJICogY29udGludWUKKwkJCSAqLworCQl9CisKKwkJLyogSGFuZGxlIE1BQ19TVEFUIEludGVycnVwdCAqLworCQlpZiAoc3RhdHVzICYgRVRfSU5UUl9NQUNfU1RBVCkgeworCQkJLyoKKwkJCSAqIFRoaXMgbWVhbnMgYXQgbGVhc3Qgb25lIG9mIHRoZSB1bi1tYXNrZWQgY291bnRlcnMKKwkJCSAqIGluIHRoZSBNQUNfU1RBVCBibG9jayBoYXMgcm9sbGVkIG92ZXIuICBVc2UgdGhpcworCQkJICogdG8gbWFpbnRhaW4gdGhlIHRvcCwgc29mdHdhcmUgbWFuYWdlZCBiaXRzIG9mIHRoZQorCQkJICogY291bnRlcihzKS4KKwkJCSAqLworCQkJZXQxMzEwX2hhbmRsZV9tYWNzdGF0X2ludGVycnVwdChhZGFwdGVyKTsKKwkJfQorCisJCS8qIEhhbmRsZSBTTFYgVGltZW91dCBJbnRlcnJ1cHQgKi8KKwkJaWYgKHN0YXR1cyAmIEVUX0lOVFJfU0xWX1RJTUVPVVQpIHsKKwkJCS8qCisJCQkgKiBUaGlzIG1lYW5zIGEgdGltZW91dCBoYXMgb2NjdXJyZWQgb24gYSByZWFkIG9yCisJCQkgKiB3cml0ZSByZXF1ZXN0IHRvIG9uZSBvZiB0aGUgSkFHQ29yZSByZWdpc3RlcnMuIFRoZQorCQkJICogR2xvYmFsIFJlc291cmNlcyBibG9jayBoYXMgdGVybWluYXRlZCB0aGUgcmVxdWVzdAorCQkJICogYW5kIG9uIGEgcmVhZCByZXF1ZXN0LCByZXR1cm5lZCBhICJmYWtlIiB2YWx1ZS4KKwkJCSAqIFRoZSBtb3N0IGxpa2VseSByZWFzb25zIGFyZTogQmFkIEFkZHJlc3Mgb3IgdGhlCisJCQkgKiBhZGRyZXNzZWQgbW9kdWxlIGlzIGluIGEgcG93ZXItZG93biBzdGF0ZSBhbmQKKwkJCSAqIGNhbid0IHJlc3BvbmQuCisJCQkgKi8KKwkJfQorCX0KKwlldDEzMXhfZW5hYmxlX2ludGVycnVwdHMoYWRhcHRlcik7Cit9CisKKy8qIE5FVERFViBmdW5jdGlvbnMgKi8KKworLyoqCisgKiBldDEzMXhfc3RhdHMgLSBSZXR1cm4gdGhlIGN1cnJlbnQgZGV2aWNlIHN0YXRpc3RpY3MuCisgKiBAbmV0ZGV2OiBkZXZpY2Ugd2hvc2Ugc3RhdHMgYXJlIGJlaW5nIHF1ZXJpZWQKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKQorICovCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmV0MTMxeF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmFkYXB0ZXItPm5ldF9zdGF0czsKKwlzdHJ1Y3QgY2Vfc3RhdHMgKmRldnN0YXQgPSAmYWRhcHRlci0+c3RhdHM7CisKKwlzdGF0cy0+cnhfZXJyb3JzID0gZGV2c3RhdC0+cnhfbGVuZ3RoX2VycnMgKworCQkJICAgZGV2c3RhdC0+cnhfYWxpZ25fZXJycyArCisJCQkgICBkZXZzdGF0LT5yeF9jcmNfZXJycyArCisJCQkgICBkZXZzdGF0LT5yeF9jb2RlX3Zpb2xhdGlvbnMgKworCQkJICAgZGV2c3RhdC0+cnhfb3RoZXJfZXJyczsKKwlzdGF0cy0+dHhfZXJyb3JzID0gZGV2c3RhdC0+dHhfbWF4X3BrdF9lcnJzOworCXN0YXRzLT5tdWx0aWNhc3QgPSBkZXZzdGF0LT5tdWx0aWNhc3RfcGt0c19yY3ZkOworCXN0YXRzLT5jb2xsaXNpb25zID0gZGV2c3RhdC0+dHhfY29sbGlzaW9uczsKKworCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzID0gZGV2c3RhdC0+cnhfbGVuZ3RoX2VycnM7CisJc3RhdHMtPnJ4X292ZXJfZXJyb3JzID0gZGV2c3RhdC0+cnhfb3ZlcmZsb3dzOworCXN0YXRzLT5yeF9jcmNfZXJyb3JzID0gZGV2c3RhdC0+cnhfY3JjX2VycnM7CisKKwkvKiBOT1RFOiBUaGVzZSBzdGF0cyBkb24ndCBoYXZlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluIENFX1NUQVRTLAorCSAqIHNvIHdlJ3JlIGdvaW5nIHRvIGhhdmUgdG8gdXBkYXRlIHRoZXNlIGRpcmVjdGx5IGZyb20gd2l0aGluIHRoZQorCSAqIFRYL1JYIGNvZGUKKwkgKi8KKwkvKiBzdGF0cy0+cnhfYnl0ZXMgICAgICAgICAgICA9IDIwOyBkZXZzdGF0LT47ICovCisJLyogc3RhdHMtPnR4X2J5dGVzICAgICAgICAgICAgPSAyMDsgIGRldnN0YXQtPjsgKi8KKwkvKiBzdGF0cy0+cnhfZHJvcHBlZCAgICAgICAgICA9IGRldnN0YXQtPjsgKi8KKwkvKiBzdGF0cy0+dHhfZHJvcHBlZCAgICAgICAgICA9IGRldnN0YXQtPjsgKi8KKworCS8qICBOT1RFOiBOb3QgdXNlZCwgY2FuJ3QgZmluZCBhbmFsb2dvdXMgc3RhdGlzdGljcyAqLworCS8qIHN0YXRzLT5yeF9mcmFtZV9lcnJvcnMgICAgID0gZGV2c3RhdC0+OyAqLworCS8qIHN0YXRzLT5yeF9maWZvX2Vycm9ycyAgICAgID0gZGV2c3RhdC0+OyAqLworCS8qIHN0YXRzLT5yeF9taXNzZWRfZXJyb3JzICAgID0gZGV2c3RhdC0+OyAqLworCisJLyogc3RhdHMtPnR4X2Fib3J0ZWRfZXJyb3JzICAgPSBkZXZzdGF0LT47ICovCisJLyogc3RhdHMtPnR4X2NhcnJpZXJfZXJyb3JzICAgPSBkZXZzdGF0LT47ICovCisJLyogc3RhdHMtPnR4X2ZpZm9fZXJyb3JzICAgICAgPSBkZXZzdGF0LT47ICovCisJLyogc3RhdHMtPnR4X2hlYXJ0YmVhdF9lcnJvcnMgPSBkZXZzdGF0LT47ICovCisJLyogc3RhdHMtPnR4X3dpbmRvd19lcnJvcnMgICAgPSBkZXZzdGF0LT47ICovCisJcmV0dXJuIHN0YXRzOworfQorCisvKioKKyAqIGV0MTMxeF9vcGVuIC0gT3BlbiB0aGUgZGV2aWNlIGZvciB1c2UuCisgKiBAbmV0ZGV2OiBkZXZpY2UgdG8gYmUgb3BlbmVkCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUgKGFzIGRlZmluZWQgaW4gZXJybm8uaCkKKyAqLworaW50IGV0MTMxeF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCS8qIFN0YXJ0IHRoZSB0aW1lciB0byB0cmFjayBOSUMgZXJyb3JzICovCisJaW5pdF90aW1lcigmYWRhcHRlci0+ZXJyb3JfdGltZXIpOworCWFkYXB0ZXItPmVycm9yX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgVFhfRVJST1JfUEVSSU9EICogSFogLyAxMDAwOworCWFkYXB0ZXItPmVycm9yX3RpbWVyLmZ1bmN0aW9uID0gZXQxMzF4X2Vycm9yX3RpbWVyX2hhbmRsZXI7CisJYWRhcHRlci0+ZXJyb3JfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWFkYXB0ZXI7CisJYWRkX3RpbWVyKCZhZGFwdGVyLT5lcnJvcl90aW1lcik7CisKKwkvKiBSZWdpc3RlciBvdXIgSVJRICovCisJcmVzdWx0ID0gcmVxdWVzdF9pcnEobmV0ZGV2LT5pcnEsIGV0MTMxeF9pc3IsIElSUUZfU0hBUkVELAorCQkJCQluZXRkZXYtPm5hbWUsIG5ldGRldik7CisJaWYgKHJlc3VsdCkgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJjb3VsZCBub3QgcmVnaXN0ZXIgSVJRICVkXG4iLAorCQkJbmV0ZGV2LT5pcnEpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCWFkYXB0ZXItPmZsYWdzIHw9IGZNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0U7CisKKwlldDEzMXhfdXAobmV0ZGV2KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogZXQxMzF4X2Nsb3NlIC0gQ2xvc2UgdGhlIGRldmljZQorICogQG5ldGRldjogZGV2aWNlIHRvIGJlIGNsb3NlZAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpCisgKi8KK2ludCBldDEzMXhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJZXQxMzF4X2Rvd24obmV0ZGV2KTsKKworCWFkYXB0ZXItPmZsYWdzICY9IH5mTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFOworCWZyZWVfaXJxKG5ldGRldi0+aXJxLCBuZXRkZXYpOworCisJLyogU3RvcCB0aGUgZXJyb3IgdGltZXIgKi8KKwlyZXR1cm4gZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPmVycm9yX3RpbWVyKTsKK30KKworLyoqCisgKiBldDEzMXhfaW9jdGwgLSBUaGUgSS9PIENvbnRyb2wgaGFuZGxlciBmb3IgdGhlIGRyaXZlcgorICogQG5ldGRldjogZGV2aWNlIG9uIHdoaWNoIHRoZSBjb250cm9sIHJlcXVlc3QgaXMgYmVpbmcgbWFkZQorICogQHJlcWJ1ZjogYSBwb2ludGVyIHRvIHRoZSBJT0NUTCByZXF1ZXN0IGJ1ZmZlcgorICogQGNtZDogdGhlIElPQ1RMIGNvbW1hbmQgY29kZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpCisgKi8KK3N0YXRpYyBpbnQgZXQxMzF4X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBpZnJlcSAqcmVxYnVmLAorCQkJaW50IGNtZCkKK3sKKwlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKCFhZGFwdGVyLT5waHlkZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHBoeV9taWlfaW9jdGwoYWRhcHRlci0+cGh5ZGV2LCByZXFidWYsIGNtZCk7Cit9CisKKy8qKgorICogZXQxMzF4X3NldF9wYWNrZXRfZmlsdGVyIC0gQ29uZmlndXJlcyB0aGUgUnggUGFja2V0IGZpbHRlcmluZyBvbiB0aGUgZGV2aWNlCisgKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQorICoKKyAqIEZJWE1FOiBsb3Qgb2YgZHVwcyB3aXRoIE1BQyBjb2RlCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBldDEzMXhfc2V0X3BhY2tldF9maWx0ZXIoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBzdGF0dXMgPSAwOworCXVpbnQzMl90IGZpbHRlciA9IGFkYXB0ZXItPnBhY2tldF9maWx0ZXI7CisJdTMyIGN0cmw7CisJdTMyIHBmX2N0cmw7CisKKwljdHJsID0gcmVhZGwoJmFkYXB0ZXItPnJlZ3MtPnJ4bWFjLmN0cmwpOworCXBmX2N0cmwgPSByZWFkbCgmYWRhcHRlci0+cmVncy0+cnhtYWMucGZfY3RybCk7CisKKwkvKiBEZWZhdWx0IHRvIGRpc2FibGVkIHBhY2tldCBmaWx0ZXJpbmcuICBFbmFibGUgaXQgaW4gdGhlIGluZGl2aWR1YWwKKwkgKiBjYXNlIHN0YXRlbWVudHMgdGhhdCByZXF1aXJlIHRoZSBkZXZpY2UgdG8gZmlsdGVyIHNvbWV0aGluZworCSAqLworCWN0cmwgfD0gMHgwNDsKKworCS8qIFNldCB1cyB0byBiZSBpbiBwcm9taXNjdW91cyBtb2RlIHNvIHdlIHJlY2VpdmUgZXZlcnl0aGluZywgdGhpcworCSAqIGlzIGFsc28gdHJ1ZSB3aGVuIHdlIGdldCBhIHBhY2tldCBmaWx0ZXIgb2YgMAorCSAqLworCWlmICgoZmlsdGVyICYgRVQxMzFYX1BBQ0tFVF9UWVBFX1BST01JU0NVT1VTKSB8fCBmaWx0ZXIgPT0gMCkKKwkJcGZfY3RybCAmPSB+NzsJLyogQ2xlYXIgZmlsdGVyIGJpdHMgKi8KKwllbHNlIHsKKwkJLyoKKwkJICogU2V0IHVzIHVwIHdpdGggTXVsdGljYXN0IHBhY2tldCBmaWx0ZXJpbmcuICBUaHJlZSBjYXNlcyBhcmUKKwkJICogcG9zc2libGUgLSAoMSkgd2UgaGF2ZSBhIG11bHRpLWNhc3QgbGlzdCwgKDIpIHdlIHJlY2VpdmUgQUxMCisJCSAqIG11bHRpY2FzdCBlbnRyaWVzIG9yICgzKSB3ZSByZWNlaXZlIG5vbmUuCisJCSAqLworCQlpZiAoZmlsdGVyICYgRVQxMzFYX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1QpCisJCQlwZl9jdHJsICY9IH4yOwkvKiBNdWx0aWNhc3QgZmlsdGVyIGJpdCAqLworCQllbHNlIHsKKwkJCWV0MTMxMF9zZXR1cF9kZXZpY2VfZm9yX211bHRpY2FzdChhZGFwdGVyKTsKKwkJCXBmX2N0cmwgfD0gMjsKKwkJCWN0cmwgJj0gfjB4MDQ7CisJCX0KKworCQkvKiBTZXQgdXMgdXAgd2l0aCBVbmljYXN0IHBhY2tldCBmaWx0ZXJpbmcgKi8KKwkJaWYgKGZpbHRlciAmIEVUMTMxWF9QQUNLRVRfVFlQRV9ESVJFQ1RFRCkgeworCQkJZXQxMzEwX3NldHVwX2RldmljZV9mb3JfdW5pY2FzdChhZGFwdGVyKTsKKwkJCXBmX2N0cmwgfD0gNDsKKwkJCWN0cmwgJj0gfjB4MDQ7CisJCX0KKworCQkvKiBTZXQgdXMgdXAgd2l0aCBCcm9hZGNhc3QgcGFja2V0IGZpbHRlcmluZyAqLworCQlpZiAoZmlsdGVyICYgRVQxMzFYX1BBQ0tFVF9UWVBFX0JST0FEQ0FTVCkgeworCQkJcGZfY3RybCB8PSAxOwkvKiBCcm9hZGNhc3QgZmlsdGVyIGJpdCAqLworCQkJY3RybCAmPSB+MHgwNDsKKwkJfSBlbHNlCisJCQlwZl9jdHJsICY9IH4xOworCisJCS8qIFNldHVwIHRoZSByZWNlaXZlIG1hYyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAtIFBhY2tldAorCQkgKiBGaWx0ZXIgY29udHJvbCArIHRoZSBlbmFibGUgLyBkaXNhYmxlIGZvciBwYWNrZXQgZmlsdGVyCisJCSAqIGluIHRoZSBjb250cm9sIHJlZy4KKwkJICovCisJCXdyaXRlbChwZl9jdHJsLCAmYWRhcHRlci0+cmVncy0+cnhtYWMucGZfY3RybCk7CisJCXdyaXRlbChjdHJsLCAmYWRhcHRlci0+cmVncy0+cnhtYWMuY3RybCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogZXQxMzF4X211bHRpY2FzdCAtIFRoZSBoYW5kbGVyIHRvIGNvbmZpZ3VyZSBtdWx0aWNhc3Rpbmcgb24gdGhlIGludGVyZmFjZQorICogQG5ldGRldjogYSBwb2ludGVyIHRvIGEgbmV0X2RldmljZSBzdHJ1Y3QgcmVwcmVzZW50aW5nIHRoZSBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgZXQxMzF4X211bHRpY2FzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJdWludDMyX3QgcGFja2V0X2ZpbHRlciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOworCWludCBpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmxvY2ssIGZsYWdzKTsKKworCS8qIEJlZm9yZSB3ZSBtb2RpZnkgdGhlIHBsYXRmb3JtLWluZGVwZW5kZW50IGZpbHRlciBmbGFncywgc3RvcmUgdGhlbQorCSAqIGxvY2FsbHkuIFRoaXMgYWxsb3dzIHVzIHRvIGRldGVybWluZSBpZiBhbnl0aGluZydzIGNoYW5nZWQgYW5kIGlmCisJICogd2UgZXZlbiBuZWVkIHRvIGJvdGhlciB0aGUgaGFyZHdhcmUKKwkgKi8KKwlwYWNrZXRfZmlsdGVyID0gYWRhcHRlci0+cGFja2V0X2ZpbHRlcjsKKworCS8qIENsZWFyIHRoZSAnbXVsdGljYXN0JyBmbGFnIGxvY2FsbHk7IGJlY2F1c2Ugd2Ugb25seSBoYXZlIGEgc2luZ2xlCisJICogZmxhZyB0byBjaGVjayBtdWx0aWNhc3QsIGFuZCBtdWx0aXBsZSBtdWx0aWNhc3QgYWRkcmVzc2VzIGNhbiBiZQorCSAqIHNldCwgdGhpcyBpcyB0aGUgZWFzaWVzdCB3YXkgdG8gZGV0ZXJtaW5lIGlmIG1vcmUgdGhhbiBvbmUKKwkgKiBtdWx0aWNhc3QgYWRkcmVzcyBpcyBiZWluZyBzZXQuCisJICovCisJcGFja2V0X2ZpbHRlciAmPSB+RVQxMzFYX1BBQ0tFVF9UWVBFX01VTFRJQ0FTVDsKKworCS8qIENoZWNrIHRoZSBuZXRfZGV2aWNlIGZsYWdzIGFuZCBzZXQgdGhlIGRldmljZSBpbmRlcGVuZGVudCBmbGFncworCSAqIGFjY29yZGluZ2x5CisJICovCisKKwlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQorCQlhZGFwdGVyLT5wYWNrZXRfZmlsdGVyIHw9IEVUMTMxWF9QQUNLRVRfVFlQRV9QUk9NSVNDVU9VUzsKKwllbHNlCisJCWFkYXB0ZXItPnBhY2tldF9maWx0ZXIgJj0gfkVUMTMxWF9QQUNLRVRfVFlQRV9QUk9NSVNDVU9VUzsKKworCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKQorCQlhZGFwdGVyLT5wYWNrZXRfZmlsdGVyIHw9IEVUMTMxWF9QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUOworCisJaWYgKG5ldGRldl9tY19jb3VudChuZXRkZXYpID4gTklDX01BWF9NQ0FTVF9MSVNUKQorCQlhZGFwdGVyLT5wYWNrZXRfZmlsdGVyIHw9IEVUMTMxWF9QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUOworCisJaWYgKG5ldGRldl9tY19jb3VudChuZXRkZXYpIDwgMSkgeworCQlhZGFwdGVyLT5wYWNrZXRfZmlsdGVyICY9IH5FVDEzMVhfUEFDS0VUX1RZUEVfQUxMX01VTFRJQ0FTVDsKKwkJYWRhcHRlci0+cGFja2V0X2ZpbHRlciAmPSB+RVQxMzFYX1BBQ0tFVF9UWVBFX01VTFRJQ0FTVDsKKwl9IGVsc2UKKwkJYWRhcHRlci0+cGFja2V0X2ZpbHRlciB8PSBFVDEzMVhfUEFDS0VUX1RZUEVfTVVMVElDQVNUOworCisJLyogU2V0IHZhbHVlcyBpbiB0aGUgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdCAqLworCWkgPSAwOworCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBuZXRkZXYpIHsKKwkJaWYgKGkgPT0gTklDX01BWF9NQ0FTVF9MSVNUKQorCQkJYnJlYWs7CisJCW1lbWNweShhZGFwdGVyLT5tdWx0aWNhc3RfbGlzdFtpKytdLCBoYS0+YWRkciwgRVRIX0FMRU4pOworCX0KKwlhZGFwdGVyLT5tdWx0aWNhc3RfYWRkcl9jb3VudCA9IGk7CisKKwkvKiBBcmUgdGhlIG5ldyBmbGFncyBkaWZmZXJlbnQgZnJvbSB0aGUgcHJldmlvdXMgb25lcz8gSWYgbm90LCB0aGVuIG5vCisJICogYWN0aW9uIGlzIHJlcXVpcmVkCisJICoKKwkgKiBOT1RFIC0gVGhpcyBibG9jayB3aWxsIGFsd2F5cyB1cGRhdGUgdGhlIG11bHRpY2FzdF9saXN0IHdpdGggdGhlCisJICogICAgICAgIGhhcmR3YXJlLCBldmVuIGlmIHRoZSBhZGRyZXNzZXMgYXJlbid0IHRoZSBzYW1lLgorCSAqLworCWlmIChwYWNrZXRfZmlsdGVyICE9IGFkYXB0ZXItPnBhY2tldF9maWx0ZXIpIHsKKwkJLyogQ2FsbCB0aGUgZGV2aWNlJ3MgZmlsdGVyIGZ1bmN0aW9uICovCisJCWV0MTMxeF9zZXRfcGFja2V0X2ZpbHRlcihhZGFwdGVyKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIGV0MTMxeF90eCAtIFRoZSBoYW5kbGVyIHRvIHR4IGEgcGFja2V0IG9uIHRoZSBkZXZpY2UKKyAqIEBza2I6IGRhdGEgdG8gYmUgVHgnZAorICogQG5ldGRldjogZGV2aWNlIG9uIHdoaWNoIGRhdGEgaXMgdG8gYmUgVHgnZAorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpCisgKi8KK3N0YXRpYyBpbnQgZXQxMzF4X3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCS8qIHN0b3AgdGhlIHF1ZXVlIGlmIGl0J3MgZ2V0dGluZyBmdWxsICovCisJaWYgKGFkYXB0ZXItPnR4X3JpbmcudXNlZCA+PSBOVU1fVENCIC0gMSAmJgorCSAgICAhbmV0aWZfcXVldWVfc3RvcHBlZChuZXRkZXYpKQorCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKKwkvKiBTYXZlIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSBUWCB0aW1lb3V0IHdhdGNoZG9nICovCisJbmV0ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwkvKiBDYWxsIHRoZSBkZXZpY2Utc3BlY2lmaWMgZGF0YSBUeCByb3V0aW5lICovCisJc3RhdHVzID0gZXQxMzF4X3NlbmRfcGFja2V0cyhza2IsIG5ldGRldik7CisKKwkvKiBDaGVjayBzdGF0dXMgYW5kIG1hbmFnZSB0aGUgbmV0aWYgcXVldWUgaWYgbmVjZXNzYXJ5ICovCisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCWlmIChzdGF0dXMgPT0gLUVOT01FTSkKKwkJCXN0YXR1cyA9IE5FVERFVl9UWF9CVVNZOworCQllbHNlCisJCQlzdGF0dXMgPSBORVRERVZfVFhfT0s7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogZXQxMzF4X3R4X3RpbWVvdXQgLSBUaW1lb3V0IGhhbmRsZXIKKyAqIEBuZXRkZXY6IGEgcG9pbnRlciB0byBhIG5ldF9kZXZpY2Ugc3RydWN0IHJlcHJlc2VudGluZyB0aGUgZGV2aWNlCisgKgorICogVGhlIGhhbmRsZXIgY2FsbGVkIHdoZW4gYSBUeCByZXF1ZXN0IHRpbWVzIG91dC4gVGhlIHRpbWVvdXQgcGVyaW9kIGlzCisgKiBzcGVjaWZpZWQgYnkgdGhlICd0eF90aW1lbyIgZWxlbWVudCBpbiB0aGUgbmV0X2RldmljZSBzdHJ1Y3R1cmUgKHNlZQorICogZXQxMzF4X2FsbG9jX2RldmljZSgpIHRvIHNlZSBob3cgdGhpcyB2YWx1ZSBpcyBzZXQpLgorICovCitzdGF0aWMgdm9pZCBldDEzMXhfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IHRjYiAqdGNiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBJZiB0aGUgZGV2aWNlIGlzIGNsb3NlZCwgaWdub3JlIHRoZSB0aW1lb3V0ICovCisJaWYgKH4oYWRhcHRlci0+ZmxhZ3MgJiBmTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKSkKKwkJcmV0dXJuOworCisJLyogQW55IG5vbnJlY292ZXJhYmxlIGhhcmR3YXJlIGVycm9yPworCSAqIENoZWNrcyBhZGFwdGVyLT5mbGFncyBmb3IgYW55IGZhaWx1cmUgaW4gcGh5IHJlYWRpbmcKKwkgKi8KKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBmTVBfQURBUFRFUl9OT05fUkVDT1ZFUl9FUlJPUikKKwkJcmV0dXJuOworCisJLyogSGFyZHdhcmUgZmFpbHVyZT8gKi8KKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBmTVBfQURBUFRFUl9IQVJEV0FSRV9FUlJPUikgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJoYXJkd2FyZSBlcnJvciAtIHJlc2V0XG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIElzIHNlbmQgc3R1Y2s/ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPnRjYl9zZW5kX3Fsb2NrLCBmbGFncyk7CisKKwl0Y2IgPSBhZGFwdGVyLT50eF9yaW5nLnNlbmRfaGVhZDsKKworCWlmICh0Y2IgIT0gTlVMTCkgeworCQl0Y2ItPmNvdW50Kys7CisKKwkJaWYgKHRjYi0+Y291bnQgPiBOSUNfU0VORF9IQU5HX1RIUkVTSE9MRCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+dGNiX3NlbmRfcWxvY2ssCisJCQkJCSAgICAgICBmbGFncyk7CisKKwkJCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkJIlNlbmQgc3R1Y2sgLSByZXNldC4gIHRjYi0+V3JJbmRleCAleCwgZmxhZ3MgMHglMDh4XG4iLAorCQkJCXRjYi0+aW5kZXgsCisJCQkJdGNiLT5mbGFncyk7CisKKwkJCWFkYXB0ZXItPm5ldF9zdGF0cy50eF9lcnJvcnMrKzsKKworCQkJLyogcGVyZm9ybSByZXNldCBvZiB0eC9yeCAqLworCQkJZXQxMzF4X2Rpc2FibGVfdHhyeChuZXRkZXYpOworCQkJZXQxMzF4X2VuYWJsZV90eHJ4KG5ldGRldik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT50Y2Jfc2VuZF9xbG9jaywgZmxhZ3MpOworfQorCisvKioKKyAqIGV0MTMxeF9jaGFuZ2VfbXR1IC0gVGhlIGhhbmRsZXIgY2FsbGVkIHRvIGNoYW5nZSB0aGUgTVRVIGZvciB0aGUgZGV2aWNlCisgKiBAbmV0ZGV2OiBkZXZpY2Ugd2hvc2UgTVRVIGlzIHRvIGJlIGNoYW5nZWQKKyAqIEBuZXdfbXR1OiB0aGUgZGVzaXJlZCBNVFUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKQorICovCitzdGF0aWMgaW50IGV0MTMxeF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBuZXdfbXR1KQoreworCWludCByZXN1bHQgPSAwOworCXN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwkvKiBNYWtlIHN1cmUgdGhlIHJlcXVlc3RlZCBNVFUgaXMgdmFsaWQgKi8KKwlpZiAobmV3X210dSA8IDY0IHx8IG5ld19tdHUgPiA5MjE2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWV0MTMxeF9kaXNhYmxlX3R4cngobmV0ZGV2KTsKKwlldDEzMXhfaGFuZGxlX3NlbmRfaW50ZXJydXB0KGFkYXB0ZXIpOworCWV0MTMxeF9oYW5kbGVfcmVjdl9pbnRlcnJ1cHQoYWRhcHRlcik7CisKKwkvKiBTZXQgdGhlIG5ldyBNVFUgKi8KKwluZXRkZXYtPm10dSA9IG5ld19tdHU7CisKKwkvKiBGcmVlIFJ4IERNQSBtZW1vcnkgKi8KKwlldDEzMXhfYWRhcHRlcl9tZW1vcnlfZnJlZShhZGFwdGVyKTsKKworCS8qIFNldCB0aGUgY29uZmlnIHBhcmFtZXRlciBmb3IgSnVtYm8gUGFja2V0IHN1cHBvcnQgKi8KKwlhZGFwdGVyLT5yZWdpc3RyeV9qdW1ib19wYWNrZXQgPSBuZXdfbXR1ICsgMTQ7CisJZXQxMzF4X3NvZnRfcmVzZXQoYWRhcHRlcik7CisKKwkvKiBBbGxvYyBhbmQgaW5pdCBSeCBETUEgbWVtb3J5ICovCisJcmVzdWx0ID0gZXQxMzF4X2FkYXB0ZXJfbWVtb3J5X2FsbG9jKGFkYXB0ZXIpOworCWlmIChyZXN1bHQgIT0gMCkgeworCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJIkNoYW5nZSBNVFUgZmFpbGVkOyBjb3VsZG4ndCByZS1hbGxvYyBETUEgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlldDEzMXhfaW5pdF9zZW5kKGFkYXB0ZXIpOworCisJZXQxMzF4X2h3YWRkcl9pbml0KGFkYXB0ZXIpOworCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBhZGFwdGVyLT5hZGRyLCBFVEhfQUxFTik7CisKKwkvKiBJbml0IHRoZSBkZXZpY2Ugd2l0aCB0aGUgbmV3IHNldHRpbmdzICovCisJZXQxMzF4X2FkYXB0ZXJfc2V0dXAoYWRhcHRlcik7CisKKwlldDEzMXhfZW5hYmxlX3R4cngobmV0ZGV2KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogZXQxMzF4X3NldF9tYWNfYWRkciAtIGhhbmRsZXIgdG8gY2hhbmdlIHRoZSBNQUMgYWRkcmVzcyBmb3IgdGhlIGRldmljZQorICogQG5ldGRldjogZGV2aWNlIHdob3NlIE1BQyBpcyB0byBiZSBjaGFuZ2VkCisgKiBAbmV3X21hYzogdGhlIGRlc2lyZWQgTUFDIGFkZHJlc3MKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKQorICoKKyAqIElNUExFTUVOVEVEIEJZIDogYmx1eCBodHRwOi8vYmVybmRsdXguZGUgMjIuMDEuMjAwNyAyMToxNAorICovCitzdGF0aWMgaW50IGV0MTMxeF9zZXRfbWFjX2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdm9pZCAqbmV3X21hYykKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBzb2NrYWRkciAqYWRkcmVzcyA9IG5ld19tYWM7CisKKwkvKiBiZWdpbiBibHV4ICovCisKKwlpZiAoYWRhcHRlciA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIE1ha2Ugc3VyZSB0aGUgcmVxdWVzdGVkIE1BQyBpcyB2YWxpZCAqLworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihhZGRyZXNzLT5zYV9kYXRhKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlldDEzMXhfZGlzYWJsZV90eHJ4KG5ldGRldik7CisJZXQxMzF4X2hhbmRsZV9zZW5kX2ludGVycnVwdChhZGFwdGVyKTsKKwlldDEzMXhfaGFuZGxlX3JlY3ZfaW50ZXJydXB0KGFkYXB0ZXIpOworCisJLyogU2V0IHRoZSBuZXcgTUFDICovCisJLyogbmV0ZGV2LT5zZXRfbWFjX2FkZHJlc3MgID0gJm5ld19tYWM7ICovCisKKwltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRkcmVzcy0+c2FfZGF0YSwgbmV0ZGV2LT5hZGRyX2xlbik7CisKKwlwcmludGsoS0VSTl9JTkZPICIlczogU2V0dGluZyBNQUMgYWRkcmVzcyB0byAlcE1cbiIsCisJCQluZXRkZXYtPm5hbWUsIG5ldGRldi0+ZGV2X2FkZHIpOworCisJLyogRnJlZSBSeCBETUEgbWVtb3J5ICovCisJZXQxMzF4X2FkYXB0ZXJfbWVtb3J5X2ZyZWUoYWRhcHRlcik7CisKKwlldDEzMXhfc29mdF9yZXNldChhZGFwdGVyKTsKKworCS8qIEFsbG9jIGFuZCBpbml0IFJ4IERNQSBtZW1vcnkgKi8KKwlyZXN1bHQgPSBldDEzMXhfYWRhcHRlcl9tZW1vcnlfYWxsb2MoYWRhcHRlcik7CisJaWYgKHJlc3VsdCAhPSAwKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCSJDaGFuZ2UgTUFDIGZhaWxlZDsgY291bGRuJ3QgcmUtYWxsb2MgRE1BIG1lbW9yeVxuIik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJZXQxMzF4X2luaXRfc2VuZChhZGFwdGVyKTsKKworCWV0MTMxeF9od2FkZHJfaW5pdChhZGFwdGVyKTsKKworCS8qIEluaXQgdGhlIGRldmljZSB3aXRoIHRoZSBuZXcgc2V0dGluZ3MgKi8KKwlldDEzMXhfYWRhcHRlcl9zZXR1cChhZGFwdGVyKTsKKworCWV0MTMxeF9lbmFibGVfdHhyeChuZXRkZXYpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBldDEzMXhfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gZXQxMzF4X29wZW4sCisJLm5kb19zdG9wCQk9IGV0MTMxeF9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gZXQxMzF4X3R4LAorCS5uZG9fc2V0X3J4X21vZGUJPSBldDEzMXhfbXVsdGljYXN0LAorCS5uZG9fdHhfdGltZW91dAkJPSBldDEzMXhfdHhfdGltZW91dCwKKwkubmRvX2NoYW5nZV9tdHUJCT0gZXQxMzF4X2NoYW5nZV9tdHUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldDEzMXhfc2V0X21hY19hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fZ2V0X3N0YXRzCQk9IGV0MTMxeF9zdGF0cywKKwkubmRvX2RvX2lvY3RsCQk9IGV0MTMxeF9pb2N0bCwKK307CisKKy8qKgorICogZXQxMzF4X2RldmljZV9hbGxvYworICoKKyAqIFJldHVybnMgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCBuZXRfZGV2aWNlIHN0cnVjdCBmb3IKKyAqIHRoaXMgZGV2aWNlLgorICoKKyAqIENyZWF0ZSBpbnN0YW5jZXMgb2YgbmV0X2RldmljZSBhbmQgd2xfcHJpdmF0ZSBmb3IgdGhlIG5ldyBhZGFwdGVyIGFuZAorICogcmVnaXN0ZXIgdGhlIGRldmljZSdzIGVudHJ5IHBvaW50cyBpbiB0aGUgbmV0X2RldmljZSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBuZXRfZGV2aWNlICpldDEzMXhfZGV2aWNlX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKworCS8qIEFsbG9jIG5ldF9kZXZpY2UgYW5kIGFkYXB0ZXIgc3RydWN0cyAqLworCW5ldGRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIpKTsKKworCWlmICghbmV0ZGV2KSB7CisJCXByaW50ayhLRVJOX0VSUiAiZXQxMzF4OiBBbGxvYyBvZiBuZXRfZGV2aWNlIHN0cnVjdCBmYWlsZWRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKgorCSAqIFNldHVwIHRoZSBmdW5jdGlvbiByZWdpc3RyYXRpb24gdGFibGUgKGFuZCBvdGhlciBkYXRhKSBmb3IgYQorCSAqIG5ldF9kZXZpY2UKKwkgKi8KKwluZXRkZXYtPndhdGNoZG9nX3RpbWVvID0gRVQxMzFYX1RYX1RJTUVPVVQ7CisJbmV0ZGV2LT5uZXRkZXZfb3BzICAgICA9ICZldDEzMXhfbmV0ZGV2X29wczsKKworCS8qIFBvbGw/ICovCisJLyogbmV0ZGV2LT5wb2xsICAgICAgICAgICAgICAgPSAmZXQxMzF4X3BvbGw7ICovCisJLyogbmV0ZGV2LT5wb2xsX2NvbnRyb2xsZXIgICAgPSAmZXQxMzF4X3BvbGxfY29udHJvbGxlcjsgKi8KKwlyZXR1cm4gbmV0ZGV2OworfQorCisvKioKKyAqIGV0MTMxeF9wY2lfc2V0dXAgLSBQZXJmb3JtIGRldmljZSBpbml0aWFsaXphdGlvbgorICogQHBkZXY6IGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKKyAqIEBlbnQ6IHRoaXMgZGV2aWNlJ3MgZW50cnkgaW4gdGhlIHBjaV9kZXZpY2VfaWQgdGFibGUKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKQorICoKKyAqIFJlZ2lzdGVyZWQgaW4gdGhlIHBjaV9kcml2ZXIgc3RydWN0dXJlLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZQorICogUENJIHN1YnN5c3RlbSBmaW5kcyBhIG5ldyBQQ0kgZGV2aWNlIHdoaWNoIG1hdGNoZXMgdGhlIGluZm9ybWF0aW9uCisgKiBjb250YWluZWQgaW4gdGhlIHBjaV9kZXZpY2VfaWQgdGFibGUuIFRoaXMgcm91dGluZSBpcyB0aGUgZXF1aXZhbGVudCB0bworICogYSBkZXZpY2UgaW5zZXJ0aW9uIHJvdXRpbmUuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGV0MTMxeF9wY2lfc2V0dXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyOworCWludCBpaTsKKworCXJlc3VsdCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChyZXN1bHQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicGNpX2VuYWJsZV9kZXZpY2UoKSBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogUGVyZm9ybSBzb21lIGJhc2ljIFBDSSBjaGVja3MgKi8KKwlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgZmluZCBQQ0kgZGV2aWNlJ3MgYmFzZSBhZGRyZXNzXG4iKTsKKwkJZ290byBlcnJfZGlzYWJsZTsKKwl9CisKKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUklWRVJfTkFNRSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgZ2V0IFBDSSByZXNvdXJjZXNcbiIpOworCQlnb3RvIGVycl9kaXNhYmxlOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJLyogQ2hlY2sgdGhlIERNQSBhZGRyZXNzaW5nIHN1cHBvcnQgb2YgdGhpcyBkZXZpY2UgKi8KKwlpZiAoIWRtYV9zZXRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soNjQpKSkgeworCQlyZXN1bHQgPSBkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDY0KSk7CisJCWlmIChyZXN1bHQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSAgIlVuYWJsZSB0byBvYnRhaW4gNjQgYml0IERNQSBmb3IgY29uc2lzdGVudCBhbGxvY2F0aW9uc1xuIik7CisJCQlnb3RvIGVycl9yZWxlYXNlX3JlczsKKwkJfQorCX0gZWxzZSBpZiAoIWRtYV9zZXRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKSkgeworCQlyZXN1bHQgPSBkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJCWlmIChyZXN1bHQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSAgIlVuYWJsZSB0byBvYnRhaW4gMzIgYml0IERNQSBmb3IgY29uc2lzdGVudCBhbGxvY2F0aW9uc1xuIik7CisJCQlnb3RvIGVycl9yZWxlYXNlX3JlczsKKwkJfQorCX0gZWxzZSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHVzYWJsZSBETUEgYWRkcmVzc2luZyBtZXRob2RcbiIpOworCQlyZXN1bHQgPSAtRUlPOworCQlnb3RvIGVycl9yZWxlYXNlX3JlczsKKwl9CisKKwkvKiBBbGxvY2F0ZSBuZXRkZXYgYW5kIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3RzICovCisJbmV0ZGV2ID0gZXQxMzF4X2RldmljZV9hbGxvYygpOworCWlmICghbmV0ZGV2KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkbid0IGFsbG9jIG5ldGRldiBzdHJ1Y3RcbiIpOworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9yZWxlYXNlX3JlczsKKwl9CisKKwlTRVRfTkVUREVWX0RFVihuZXRkZXYsICZwZGV2LT5kZXYpOworCWV0MTMxeF9zZXRfZXRodG9vbF9vcHMobmV0ZGV2KTsKKworCWFkYXB0ZXIgPSBldDEzMXhfYWRhcHRlcl9pbml0KG5ldGRldiwgcGRldik7CisKKwkvKiBJbml0aWFsaXNlIHRoZSBQQ0kgc2V0dXAgZm9yIHRoZSBkZXZpY2UgKi8KKwlldDEzMXhfcGNpX2luaXQoYWRhcHRlciwgcGRldik7CisKKwkvKiBNYXAgdGhlIGJ1cy1yZWxhdGl2ZSByZWdpc3RlcnMgdG8gc3lzdGVtIHZpcnR1YWwgbWVtb3J5ICovCisJYWRhcHRlci0+cmVncyA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCAwKTsKKwlpZiAoIWFkYXB0ZXItPnJlZ3MpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IG1hcCBkZXZpY2UgcmVnaXN0ZXJzXG4iKTsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9kZXY7CisJfQorCisJLyogSWYgUGh5IENPTUEgbW9kZSB3YXMgZW5hYmxlZCB3aGVuIHdlIHdlbnQgZG93biwgZGlzYWJsZSBpdCBoZXJlLiAqLworCXdyaXRlbChFVF9QTUNTUl9JTklULCAgJmFkYXB0ZXItPnJlZ3MtPmdsb2JhbC5wbV9jc3IpOworCisJLyogSXNzdWUgYSBnbG9iYWwgcmVzZXQgdG8gdGhlIGV0MTMxMCAqLworCWV0MTMxeF9zb2Z0X3Jlc2V0KGFkYXB0ZXIpOworCisJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAocGFyYW5vaWQpICovCisJZXQxMzF4X2Rpc2FibGVfaW50ZXJydXB0cyhhZGFwdGVyKTsKKworCS8qIEFsbG9jYXRlIERNQSBtZW1vcnkgKi8KKwlyZXN1bHQgPSBldDEzMXhfYWRhcHRlcl9tZW1vcnlfYWxsb2MoYWRhcHRlcik7CisJaWYgKHJlc3VsdCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZCBub3QgYWxsb2MgYWRhcGF0ZXIgbWVtb3J5IChETUEpXG4iKTsKKwkJZ290byBlcnJfaW91bm1hcDsKKwl9CisKKwkvKiBJbml0IHNlbmQgZGF0YSBzdHJ1Y3R1cmVzICovCisJZXQxMzF4X2luaXRfc2VuZChhZGFwdGVyKTsKKworCS8qIFNldCB1cCB0aGUgdGFzayBzdHJ1Y3R1cmUgZm9yIHRoZSBJU1IncyBkZWZlcnJlZCBoYW5kbGVyICovCisJSU5JVF9XT1JLKCZhZGFwdGVyLT50YXNrLCBldDEzMXhfaXNyX2hhbmRsZXIpOworCisJLyogQ29weSBhZGRyZXNzIGludG8gdGhlIG5ldF9kZXZpY2Ugc3RydWN0ICovCisJbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkYXB0ZXItPmFkZHIsIEVUSF9BTEVOKTsKKworCS8qIEluaXQgdmFyaWFibGUgZm9yIGNvdW50aW5nIGhvdyBsb25nIHdlIGRvIG5vdCBoYXZlIGxpbmsgc3RhdHVzICovCisJYWRhcHRlci0+Ym9vdF9jb21hID0gMDsKKwlldDEzMTBfZGlzYWJsZV9waHlfY29tYShhZGFwdGVyKTsKKworCS8qIFNldHVwIHRoZSBtaWlfYnVzIHN0cnVjdCAqLworCWFkYXB0ZXItPm1paV9idXMgPSBtZGlvYnVzX2FsbG9jKCk7CisJaWYgKCFhZGFwdGVyLT5taWlfYnVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkFsbG9jIG9mIG1paV9idXMgc3RydWN0IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX21lbV9mcmVlOworCX0KKworCWFkYXB0ZXItPm1paV9idXMtPm5hbWUgPSAiZXQxMzF4X2V0aF9taWkiOworCXNucHJpbnRmKGFkYXB0ZXItPm1paV9idXMtPmlkLCBNSUlfQlVTX0lEX1NJWkUsICIleCIsCisJCShhZGFwdGVyLT5wZGV2LT5idXMtPm51bWJlciA8PCA4KSB8IGFkYXB0ZXItPnBkZXYtPmRldmZuKTsKKwlhZGFwdGVyLT5taWlfYnVzLT5wcml2ID0gbmV0ZGV2OworCWFkYXB0ZXItPm1paV9idXMtPnJlYWQgPSBldDEzMXhfbWRpb19yZWFkOworCWFkYXB0ZXItPm1paV9idXMtPndyaXRlID0gZXQxMzF4X21kaW9fd3JpdGU7CisJYWRhcHRlci0+bWlpX2J1cy0+cmVzZXQgPSBldDEzMXhfbWRpb19yZXNldDsKKwlhZGFwdGVyLT5taWlfYnVzLT5pcnEgPSBrbWFsbG9jKHNpemVvZihpbnQpKlBIWV9NQVhfQUREUiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhZGFwdGVyLT5taWlfYnVzLT5pcnEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibWlpX2J1cyBpcnEgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGVycl9tZGlvX2ZyZWU7CisJfQorCisJZm9yIChpaSA9IDA7IGlpIDwgUEhZX01BWF9BRERSOyBpaSsrKQorCQlhZGFwdGVyLT5taWlfYnVzLT5pcnFbaWldID0gUEhZX1BPTEw7CisKKwlpZiAobWRpb2J1c19yZWdpc3RlcihhZGFwdGVyLT5taWlfYnVzKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgTUlJIGJ1c1xuIik7CisJCW1kaW9idXNfZnJlZShhZGFwdGVyLT5taWlfYnVzKTsKKwkJZ290byBlcnJfbWRpb19mcmVlX2lycTsKKwl9CisKKwlpZiAoZXQxMzF4X21paV9wcm9iZShuZXRkZXYpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBwcm9iZSBNSUkgYnVzXG4iKTsKKwkJZ290byBlcnJfbWRpb191bnJlZ2lzdGVyOworCX0KKworCS8qIFNldHVwIGV0MTMxMCBhcyBwZXIgdGhlIGRvY3VtZW50YXRpb24gKi8KKwlldDEzMXhfYWRhcHRlcl9zZXR1cChhZGFwdGVyKTsKKworCS8qIFdlIGNhbiBlbmFibGUgaW50ZXJydXB0cyBub3cKKwkgKgorCSAqICBOT1RFIC0gQmVjYXVzZSByZWdpc3RyYXRpb24gb2YgaW50ZXJydXB0IGhhbmRsZXIgaXMgZG9uZSBpbiB0aGUKKwkgKiAgICAgICAgIGRldmljZSdzIG9wZW4oKSwgZGVmZXIgZW5hYmxpbmcgZGV2aWNlIGludGVycnVwdHMgdG8gdGhhdAorCSAqICAgICAgICAgcG9pbnQKKwkgKi8KKworCS8qIFJlZ2lzdGVyIHRoZSBuZXRfZGV2aWNlIHN0cnVjdCB3aXRoIHRoZSBMaW51eCBuZXR3b3JrIGxheWVyICovCisJcmVzdWx0ID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CisJaWYgKHJlc3VsdCAhPSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInJlZ2lzdGVyX25ldGRldigpIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX21kaW9fdW5yZWdpc3RlcjsKKwl9CisKKwkvKiBSZWdpc3RlciB0aGUgbmV0X2RldmljZSBzdHJ1Y3Qgd2l0aCB0aGUgUENJIHN1YnN5c3RlbS4gU2F2ZSBhIGNvcHkKKwkgKiBvZiB0aGUgUENJIGNvbmZpZyBzcGFjZSBmb3IgdGhpcyBkZXZpY2Ugbm93IHRoYXQgdGhlIGRldmljZSBoYXMKKwkgKiBiZWVuIGluaXRpYWxpemVkLCBqdXN0IGluIGNhc2UgaXQgbmVlZHMgdG8gYmUgcXVpY2tseSByZXN0b3JlZC4KKwkgKi8KKwlwY2lfc2V0X2RydmRhdGEocGRldiwgbmV0ZGV2KTsKKwlwY2lfc2F2ZV9zdGF0ZShhZGFwdGVyLT5wZGV2KTsKKworCXJldHVybiByZXN1bHQ7CisKK2Vycl9tZGlvX3VucmVnaXN0ZXI6CisJbWRpb2J1c191bnJlZ2lzdGVyKGFkYXB0ZXItPm1paV9idXMpOworZXJyX21kaW9fZnJlZV9pcnE6CisJa2ZyZWUoYWRhcHRlci0+bWlpX2J1cy0+aXJxKTsKK2Vycl9tZGlvX2ZyZWU6CisJbWRpb2J1c19mcmVlKGFkYXB0ZXItPm1paV9idXMpOworZXJyX21lbV9mcmVlOgorCWV0MTMxeF9hZGFwdGVyX21lbW9yeV9mcmVlKGFkYXB0ZXIpOworZXJyX2lvdW5tYXA6CisJaW91bm1hcChhZGFwdGVyLT5yZWdzKTsKK2Vycl9mcmVlX2RldjoKKwlwY2lfZGV2X3B1dChwZGV2KTsKKwlmcmVlX25ldGRldihuZXRkZXYpOworZXJyX3JlbGVhc2VfcmVzOgorCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CitlcnJfZGlzYWJsZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CitlcnJfb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhldDEzMXhfcG1fb3BzLCBldDEzMXhfc3VzcGVuZCwgZXQxMzF4X3Jlc3VtZSk7CisjZGVmaW5lIEVUMTMxWF9QTV9PUFMgKCZldDEzMXhfcG1fb3BzKQorI2Vsc2UKKyNkZWZpbmUgRVQxMzFYX1BNX09QUyBOVUxMCisjZW5kaWYKKworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGV0MTMxeF9wY2lfdGFibGUpID0geworCXsgUENJX1ZERVZJQ0UoQVRULCBFVDEzMVhfUENJX0RFVklDRV9JRF9HSUcpLCAwVUx9LAorCXsgUENJX1ZERVZJQ0UoQVRULCBFVDEzMVhfUENJX0RFVklDRV9JRF9GQVNUKSwgMFVMfSwKKwl7MCx9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGV0MTMxeF9wY2lfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZXQxMzF4X2RyaXZlciA9IHsKKwkubmFtZQkJPSBEUklWRVJfTkFNRSwKKwkuaWRfdGFibGUJPSBldDEzMXhfcGNpX3RhYmxlLAorCS5wcm9iZQkJPSBldDEzMXhfcGNpX3NldHVwLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZXQxMzF4X3BjaV9yZW1vdmUpLAorCS5kcml2ZXIucG0JPSBFVDEzMVhfUE1fT1BTLAorfTsKKworLyoqCisgKiBldDEzMXhfaW5pdF9tb2R1bGUgLSBUaGUgIm1haW4iIGVudHJ5IHBvaW50IGNhbGxlZCBvbiBkcml2ZXIgaW5pdGlhbGl6YXRpb24KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKQorICovCitzdGF0aWMgaW50IF9faW5pdCBldDEzMXhfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmZXQxMzF4X2RyaXZlcik7Cit9CisKKy8qKgorICogZXQxMzF4X2NsZWFudXBfbW9kdWxlIC0gVGhlIGVudHJ5IHBvaW50IGNhbGxlZCBvbiBkcml2ZXIgY2xlYW51cAorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgZXQxMzF4X2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZldDEzMXhfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoZXQxMzF4X2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGV0MTMxeF9jbGVhbnVwX21vZHVsZSk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4LmggYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeC5oCmluZGV4IDQ4ZWJhYzAuLjdlZWQzYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXguaApAQCAtMSw2ICsxLDQgQEAKIC8qCi0gKiBNZXJnZWQgZnJvbSBmaWxlcwotICoKICAqIENvcHlyaWdodCDCqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KQEAgLTQ4LDEwNiArNDYsMTYyMSBAQAogICoKICAqLwogCi0vKiBldDEzMXhfZWVwcm9tLmMgKi8KLWludCBldDEzMXhfaW5pdF9lZXByb20oc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldik7CisjZGVmaW5lIERSSVZFUl9OQU1FICJldDEzMXgiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICJ2Mi4wIgogCi0vKiBldDEzMXhfaW5pdHBjaS5jICovCi12b2lkIENvbmZpZ0dsb2JhbFJlZ3Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICpwQWRhcHRlcik7Ci12b2lkIENvbmZpZ01NQ1JlZ3Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICpwQWRhcHRlcik7Ci12b2lkIGV0MTMxeF9lbmFibGVfaW50ZXJydXB0cyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBldDEzMXhfZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIGV0MTMxeF9hbGlnbl9hbGxvY2F0ZWRfbWVtb3J5KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkgICB1NjQgKnBoeXNfYWRkciwKLQkJCQkgICB1NjQgKm9mZnNldCwgdTY0IG1hc2spOworLyogRUVQUk9NIHJlZ2lzdGVycyAqLwogCi1pbnQgZXQxMzF4X2FkYXB0ZXJfc2V0dXAoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLWludCBldDEzMXhfYWRhcHRlcl9tZW1vcnlfYWxsb2Moc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgZXQxMzF4X2FkYXB0ZXJfbWVtb3J5X2ZyZWUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgZXQxMzF4X2h3YWRkcl9pbml0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIGV0MTMxeF9zb2Z0X3Jlc2V0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7CisvKiBMQkNJRiBSZWdpc3RlciBHcm91cHMgKGFkZHJlc3NlZCB2aWEgMzItYml0IG9mZnNldHMpICovCisjZGVmaW5lIExCQ0lGX0RXT1JEMF9HUk9VUCAgICAgICAweEFDCisjZGVmaW5lIExCQ0lGX0RXT1JEMV9HUk9VUCAgICAgICAweEIwCiAKLS8qIGV0MTMxeF9pc3IuYyAqLwotaXJxcmV0dXJuX3QgZXQxMzF4X2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwotdm9pZCBldDEzMXhfaXNyX2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKy8qIExCQ0lGIFJlZ2lzdGVycyAoYWRkcmVzc2VkIHZpYSA4LWJpdCBvZmZzZXRzKSAqLworI2RlZmluZSBMQkNJRl9BRERSRVNTX1JFR0lTVEVSICAgMHhBQworI2RlZmluZSBMQkNJRl9EQVRBX1JFR0lTVEVSICAgICAgMHhCMAorI2RlZmluZSBMQkNJRl9DT05UUk9MX1JFR0lTVEVSICAgMHhCMQorI2RlZmluZSBMQkNJRl9TVEFUVVNfUkVHSVNURVIgICAgMHhCMgogCi0vKiBldDEzMTBfbWFjLmMgKi8KLXZvaWQgQ29uZmlnTUFDUmVnczEoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgQ29uZmlnTUFDUmVnczIoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgQ29uZmlnUnhNYWNSZWdzKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIENvbmZpZ1R4TWFjUmVncyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBDb25maWdNYWNTdGF0UmVncyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBDb25maWdGbG93Q29udHJvbChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBVcGRhdGVNYWNTdGF0SG9zdENvdW50ZXJzKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIEhhbmRsZU1hY1N0YXRJbnRlcnJ1cHQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgU2V0dXBEZXZpY2VGb3JNdWx0aWNhc3Qoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgU2V0dXBEZXZpY2VGb3JVbmljYXN0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7CisvKiBMQkNJRiBDb250cm9sIFJlZ2lzdGVyIEJpdHMgKi8KKyNkZWZpbmUgTEJDSUZfQ09OVFJPTF9TRVFVRU5USUFMX1JFQUQgICAweDAxCisjZGVmaW5lIExCQ0lGX0NPTlRST0xfUEFHRV9XUklURSAgICAgICAgMHgwMgorI2RlZmluZSBMQkNJRl9DT05UUk9MX0VFUFJPTV9SRUxPQUQgICAgIDB4MDgKKyNkZWZpbmUgTEJDSUZfQ09OVFJPTF9UV09fQllURV9BRERSICAgICAweDIwCisjZGVmaW5lIExCQ0lGX0NPTlRST0xfSTJDX1dSSVRFICAgICAgICAgMHg0MAorI2RlZmluZSBMQkNJRl9DT05UUk9MX0xCQ0lGX0VOQUJMRSAgICAgIDB4ODAKIAotLyogZXQxMzF4X25ldGRldi5jICovCi1zdHJ1Y3QgbmV0X2RldmljZSAqZXQxMzF4X2RldmljZV9hbGxvYyh2b2lkKTsKKy8qIExCQ0lGIFN0YXR1cyBSZWdpc3RlciBCaXRzICovCisjZGVmaW5lIExCQ0lGX1NUQVRVU19QSFlfUVVFVUVfQVZBSUwgICAgMHgwMQorI2RlZmluZSBMQkNJRl9TVEFUVVNfSTJDX0lETEUgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgTEJDSUZfU1RBVFVTX0FDS19FUlJPUiAgICAgICAgICAweDA0CisjZGVmaW5lIExCQ0lGX1NUQVRVU19HRU5FUkFMX0VSUk9SICAgICAgMHgwOAorI2RlZmluZSBMQkNJRl9TVEFUVVNfQ0hFQ0tTVU1fRVJST1IgICAgIDB4NDAKKyNkZWZpbmUgTEJDSUZfU1RBVFVTX0VFUFJPTV9QUkVTRU5UICAgICAweDgwCiAKLS8qIGV0MTMxeF9wbS5jICovCi12b2lkIEVuYWJsZVBoeUNvbWEoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgRGlzYWJsZVBoeUNvbWEoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKKy8qIFNUQVJUIE9GIEdMT0JBTCBSRUdJU1RFUiBBRERSRVNTIE1BUCAqLwogCi0vKiBldDEzMXhfcGh5LmMgKi8KLXZvaWQgRVQxMzEwX1BoeUluaXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgRVQxMzEwX1BoeVJlc2V0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIEVUMTMxMF9QaHlQb3dlckRvd24oc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLCBib29sIGRvd24pOwotdm9pZCBFVDEzMTBfUGh5QWR2ZXJ0aXNlMTAwMEJhc2VUKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkgIHUxNiBkdXBsZXgpOwotdm9pZCBFVDEzMTBfUGh5QWNjZXNzTWlCaXQoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyLAotCQkJICAgdTE2IGFjdGlvbiwKLQkJCSAgIHUxNiByZWdudW0sIHUxNiBiaXRudW0sIHU4ICp2YWx1ZSk7Ci0KLWludCBldDEzMXhfeGN2cl9maW5kKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIGV0MTMxeF9zZXRwaHlfbm9ybWFsKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Ci0KLS8qIHN0YXRpYyBpbmxpbmUgZnVuY3Rpb24gZG9lcyBub3Qgd29yayBiZWNhdXNlIGV0MTMxeF9hZGFwdGVyIGlzIG5vdCBhbHdheXMKLSAqIGRlZmluZWQKKy8qCisgKiAxMGJpdCByZWdpc3RlcnMKKyAqCisgKiBUeCBxdWV1ZSBzdGFydCBhZGRyZXNzIHJlZyBpbiBnbG9iYWwgYWRkcmVzcyBtYXAgYXQgYWRkcmVzcyAweDAwMDAKKyAqIHR4IHF1ZXVlIGVuZCBhZGRyZXNzIHJlZyBpbiBnbG9iYWwgYWRkcmVzcyBtYXAgYXQgYWRkcmVzcyAweDAwMDQKKyAqIHJ4IHF1ZXVlIHN0YXJ0IGFkZHJlc3MgcmVnIGluIGdsb2JhbCBhZGRyZXNzIG1hcCBhdCBhZGRyZXNzIDB4MDAwOAorICogcnggcXVldWUgZW5kIGFkZHJlc3MgcmVnIGluIGdsb2JhbCBhZGRyZXNzIG1hcCBhdCBhZGRyZXNzIDB4MDAwQwogICovCi1pbnQgUGh5TWlSZWFkKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwgdTggeGN2ckFkZHIsCi0JICAgICAgdTggeGN2clJlZywgdTE2ICp2YWx1ZSk7Ci0jZGVmaW5lIE1pUmVhZChhZGFwdGVyLCB4Y3ZyUmVnLCB2YWx1ZSkgXAotCVBoeU1pUmVhZCgoYWRhcHRlciksIChhZGFwdGVyKS0+c3RhdHMueGN2cl9hZGRyLCAoeGN2clJlZyksICh2YWx1ZSkpCiAKLWludDMyX3QgTWlXcml0ZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCXU4IHhjdlJlZywgdTE2IHZhbHVlKTsKLXZvaWQgZXQxMzF4X01paV9jaGVjayhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKnBBZGFwdGVyLAotCQkgICAgICB1MTYgYm1zciwgdTE2IGJtc3JfaW50cyk7Ci0KLS8qIFRoaXMgbGFzdCBpcyBub3Qgc3RyaWN0bHkgcmVxdWlyZWQgKHRoZSBkcml2ZXIgY291bGQgY2FsbCB0aGUgVFBBTAotICogdmVyc2lvbiBpbnN0ZWFkKSwgYnV0IHRoaXMgc2V0cyB0aGUgYWRhcHRlciB1cCBjb3JyZWN0bHksIGFuZCBjYWxscyB0aGUKLSAqIGFjY2VzcyByb3V0aW5lIGluZGlyZWN0bHkuICBUaGlzIHByb3RlY3RzIHRoZSBkcml2ZXIgZnJvbSBjaGFuZ2VzIGluIFRQQUwuCisvKgorICogc3RydWN0dXJlIGZvciBwb3dlciBtYW5hZ2VtZW50IGNvbnRyb2wgc3RhdHVzIHJlZyBpbiBnbG9iYWwgYWRkcmVzcyBtYXAKKyAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDAwMTAKKyAqCWphZ2NvcmVfcnhfcmR5CWJpdCA5CisgKglqYWdjb3JlX3R4X3JkeQliaXQgOAorICoJcGh5X2xwZWRfZW4JYml0IDcKKyAqCXBoeV9zd19jb21hCWJpdCA2CisgKglyeGNsa19nYXRlCWJpdCA1CisgKgl0eGNsa19nYXRlCWJpdCA0CisgKglzeXNjbGtfZ2F0ZQliaXQgMworICoJamFnY29yZV9yeF9lbgliaXQgMgorICoJamFnY29yZV90eF9lbgliaXQgMQorICoJZ2lnZXBoeV9lbgliaXQgMAogICovCi12b2lkIFNldFBoeV8xMEJhc2VUSGFsZkR1cGxleChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOworCisjZGVmaW5lIEVUX1BNX1BIWV9TV19DT01BCQkweDQwCisjZGVmaW5lIEVUX1BNQ1NSX0lOSVQJCQkweDM4CisKKy8qCisgKiBJbnRlcnJ1cHQgc3RhdHVzIHJlZyBhdCBhZGRyZXNzIDB4MDAxOAorICovCisKKyNkZWZpbmUJRVRfSU5UUl9UWERNQV9JU1IJMHgwMDAwMDAwOAorI2RlZmluZSBFVF9JTlRSX1RYRE1BX0VSUgkweDAwMDAwMDEwCisjZGVmaW5lIEVUX0lOVFJfUlhETUFfWEZSX0RPTkUJMHgwMDAwMDAyMAorI2RlZmluZSBFVF9JTlRSX1JYRE1BX0ZCX1IwX0xPVwkweDAwMDAwMDQwCisjZGVmaW5lIEVUX0lOVFJfUlhETUFfRkJfUjFfTE9XCTB4MDAwMDAwODAKKyNkZWZpbmUgRVRfSU5UUl9SWERNQV9TVEFUX0xPVwkweDAwMDAwMTAwCisjZGVmaW5lIEVUX0lOVFJfUlhETUFfRVJSCTB4MDAwMDAyMDAKKyNkZWZpbmUgRVRfSU5UUl9XQVRDSERPRwkweDAwMDA0MDAwCisjZGVmaW5lIEVUX0lOVFJfV09MCQkweDAwMDA4MDAwCisjZGVmaW5lIEVUX0lOVFJfUEhZCQkweDAwMDEwMDAwCisjZGVmaW5lIEVUX0lOVFJfVFhNQUMJCTB4MDAwMjAwMDAKKyNkZWZpbmUgRVRfSU5UUl9SWE1BQwkJMHgwMDA0MDAwMAorI2RlZmluZSBFVF9JTlRSX01BQ19TVEFUCTB4MDAwODAwMDAKKyNkZWZpbmUgRVRfSU5UUl9TTFZfVElNRU9VVAkweDAwMTAwMDAwCisKKy8qCisgKiBJbnRlcnJ1cHQgbWFzayByZWdpc3RlciBhdCBhZGRyZXNzIDB4MDAxQworICogSW50ZXJydXB0IGFsaWFzIGNsZWFyIG1hc2sgcmVnIGF0IGFkZHJlc3MgMHgwMDIwCisgKiBJbnRlcnJ1cHQgc3RhdHVzIGFsaWFzIHJlZyBhdCBhZGRyZXNzIDB4MDAyNAorICoKKyAqIFNhbWUgbWFza3MgYXMgYWJvdmUKKyAqLworCisvKgorICogU29mdHdhcmUgcmVzZXQgcmVnIGF0IGFkZHJlc3MgMHgwMDI4CisgKiAwOgl0eGRtYV9zd19yZXNldAorICogMToJcnhkbWFfc3dfcmVzZXQKKyAqIDI6CXR4bWFjX3N3X3Jlc2V0CisgKiAzOglyeG1hY19zd19yZXNldAorICogNDoJbWFjX3N3X3Jlc2V0CisgKiA1OgltYWNfc3RhdF9zd19yZXNldAorICogNjoJbW1jX3N3X3Jlc2V0CisgKjMxOglzZWxmY2xyX2Rpc2FibGUKKyAqLworCisvKgorICogU0xWIFRpbWVyIHJlZyBhdCBhZGRyZXNzIDB4MDAyQyAobG93IDI0IGJpdHMpCisgKi8KKworLyoKKyAqIE1TSSBDb25maWd1cmF0aW9uIHJlZyBhdCBhZGRyZXNzIDB4MDAzMAorICovCisKKyNkZWZpbmUgRVRfTVNJX1ZFQ1RPUgkweDAwMDAwMDFGCisjZGVmaW5lIEVUX01TSV9UQwkweDAwMDcwMDAwCisKKy8qCisgKiBMb29wYmFjayByZWcgbG9jYXRlZCBhdCBhZGRyZXNzIDB4MDAzNAorICovCisKKyNkZWZpbmUgRVRfTE9PUF9NQUMJMHgwMDAwMDAwMQorI2RlZmluZSBFVF9MT09QX0RNQQkweDAwMDAwMDAyCisKKy8qCisgKiBHTE9CQUwgTW9kdWxlIG9mIEpBR0NvcmUgQWRkcmVzcyBNYXBwaW5nCisgKiBMb2NhdGVkIGF0IGFkZHJlc3MgMHgwMDAwCisgKi8KK3N0cnVjdCBnbG9iYWxfcmVncyB7CQkJCS8qIExvY2F0aW9uOiAqLworCXUzMiB0eHFfc3RhcnRfYWRkcjsJCQkvKiAgMHgwMDAwICovCisJdTMyIHR4cV9lbmRfYWRkcjsJCQkvKiAgMHgwMDA0ICovCisJdTMyIHJ4cV9zdGFydF9hZGRyOwkJCS8qICAweDAwMDggKi8KKwl1MzIgcnhxX2VuZF9hZGRyOwkJCS8qICAweDAwMEMgKi8KKwl1MzIgcG1fY3NyOwkJCQkvKiAgMHgwMDEwICovCisJdTMyIHVudXNlZDsJCQkJLyogIDB4MDAxNCAqLworCXUzMiBpbnRfc3RhdHVzOwkJCQkvKiAgMHgwMDE4ICovCisJdTMyIGludF9tYXNrOwkJCQkvKiAgMHgwMDFDICovCisJdTMyIGludF9hbGlhc19jbHJfZW47CQkJLyogIDB4MDAyMCAqLworCXUzMiBpbnRfc3RhdHVzX2FsaWFzOwkJCS8qICAweDAwMjQgKi8KKwl1MzIgc3dfcmVzZXQ7CQkJCS8qICAweDAwMjggKi8KKwl1MzIgc2x2X3RpbWVyOwkJCQkvKiAgMHgwMDJDICovCisJdTMyIG1zaV9jb25maWc7CQkJCS8qICAweDAwMzAgKi8KKwl1MzIgbG9vcGJhY2s7CQkJCS8qICAweDAwMzQgKi8KKwl1MzIgd2F0Y2hkb2dfdGltZXI7CQkJLyogIDB4MDAzOCAqLworfTsKIAogCi0vKiBldDEzMTBfcnguYyAqLwotaW50IGV0MTMxeF9yeF9kbWFfbWVtb3J5X2FsbG9jKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIGV0MTMxeF9yeF9kbWFfbWVtb3J5X2ZyZWUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKLWludCBldDEzMXhfcmZkX3Jlc291cmNlc19hbGxvYyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkgICAgICAgc3RydWN0IHJmZCAqcmZkKTsKLXZvaWQgZXQxMzF4X3JmZF9yZXNvdXJjZXNfZnJlZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkgICAgICAgc3RydWN0IHJmZCAqcmZkKTsKLWludCBldDEzMXhfaW5pdF9yZWN2KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7CisvKiBTVEFSVCBPRiBUWERNQSBSRUdJU1RFUiBBRERSRVNTIE1BUCAqLwogCi12b2lkIENvbmZpZ1J4RG1hUmVncyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBTZXRSeERtYVRpbWVyKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIGV0MTMxeF9yeF9kbWFfZGlzYWJsZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBldDEzMXhfcnhfZG1hX2VuYWJsZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOworLyoKKyAqIHR4ZG1hIGNvbnRyb2wgc3RhdHVzIHJlZyBhdCBhZGRyZXNzIDB4MTAwMAorICovCiAKLXZvaWQgZXQxMzF4X3Jlc2V0X3JlY3Yoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKTsKKyNkZWZpbmUgRVRfVFhETUFfQ1NSX0hBTFQJMHgwMDAwMDAwMQorI2RlZmluZSBFVF9UWERNQV9EUk9QX1RMUAkweDAwMDAwMDAyCisjZGVmaW5lIEVUX1RYRE1BX0NBQ0hFX1RIUlMJMHgwMDAwMDBGMAorI2RlZmluZSBFVF9UWERNQV9DQUNIRV9TSElGVAk0CisjZGVmaW5lIEVUX1RYRE1BX1NOR0xfRVBLVAkweDAwMDAwMTAwCisjZGVmaW5lIEVUX1RYRE1BX0NMQVNTCQkweDAwMDAxRTAwCiAKLXZvaWQgZXQxMzF4X2hhbmRsZV9yZWN2X2ludGVycnVwdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOworLyoKKyAqIHN0cnVjdHVyZSBmb3IgdHhkbWEgcGFja2V0IHJpbmcgYmFzZSBhZGRyZXNzIGhpIHJlZyBpbiB0eGRtYSBhZGRyZXNzIG1hcAorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MTAwNAorICogRGVmaW5lZCBlYXJsaWVyICh1MzIpCisgKi8KIAotLyogZXQxMzF4X3R4LmMgKi8KLWludCBldDEzMXhfdHhfZG1hX21lbW9yeV9hbGxvYyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBldDEzMXhfdHhfZG1hX21lbW9yeV9mcmVlKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIENvbmZpZ1R4RG1hUmVncyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBldDEzMXhfaW5pdF9zZW5kKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIGV0MTMxeF90eF9kbWFfZGlzYWJsZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBldDEzMXhfdHhfZG1hX2VuYWJsZShzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpOwotdm9pZCBldDEzMXhfaGFuZGxlX3NlbmRfaW50ZXJydXB0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Ci12b2lkIGV0MTMxeF9mcmVlX2J1c3lfc2VuZF9wYWNrZXRzKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcik7Ci1pbnQgZXQxMzF4X3NlbmRfcGFja2V0cyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIHR4ZG1hIHBhY2tldCByaW5nIGJhc2UgYWRkcmVzcyBsb3cgcmVnIGluIHR4ZG1hIGFkZHJlc3MgbWFwCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgxMDA4CisgKiBEZWZpbmVkIGVhcmxpZXIgKHUzMikKKyAqLworCisvKgorICogc3RydWN0dXJlIGZvciB0eGRtYSBwYWNrZXQgcmluZyBudW1iZXIgb2YgZGVzY3JpcHRvciByZWcgaW4gdHhkbWEgYWRkcmVzcworICogbWFwLiAgTG9jYXRlZCBhdCBhZGRyZXNzIDB4MTAwQworICoKKyAqIDMxLTEwOiB1bnVzZWQKKyAqIDktMDogcHIgbmRlcworICovCisKKyNkZWZpbmUgRVRfRE1BMTJfTUFTSwkJMHgwRkZGCS8qIDEyIGJpdCBtYXNrIGZvciBETUExMlcgdHlwZXMgKi8KKyNkZWZpbmUgRVRfRE1BMTJfV1JBUAkJMHgxMDAwCisjZGVmaW5lIEVUX0RNQTEwX01BU0sJCTB4MDNGRgkvKiAxMCBiaXQgbWFzayBmb3IgRE1BMTBXIHR5cGVzICovCisjZGVmaW5lIEVUX0RNQTEwX1dSQVAJCTB4MDQwMAorI2RlZmluZSBFVF9ETUE0X01BU0sJCTB4MDAwRgkvKiA0IGJpdCBtYXNrIGZvciBETUE0VyB0eXBlcyAqLworI2RlZmluZSBFVF9ETUE0X1dSQVAJCTB4MDAxMAorCisjZGVmaW5lIElOREVYMTIoeCkJKCh4KSAmIEVUX0RNQTEyX01BU0spCisjZGVmaW5lIElOREVYMTAoeCkJKCh4KSAmIEVUX0RNQTEwX01BU0spCisjZGVmaW5lIElOREVYNCh4KQkoKHgpICYgRVRfRE1BNF9NQVNLKQorCisvKgorICogMTBiaXQgRE1BIHdpdGggd3JhcAorICogdHhkbWEgdHggcXVldWUgd3JpdGUgYWRkcmVzcyByZWcgaW4gdHhkbWEgYWRkcmVzcyBtYXAgYXQgMHgxMDEwCisgKiB0eGRtYSB0eCBxdWV1ZSB3cml0ZSBhZGRyZXNzIGV4dGVybmFsIHJlZyBpbiB0eGRtYSBhZGRyZXNzIG1hcCBhdCAweDEwMTQKKyAqIHR4ZG1hIHR4IHF1ZXVlIHJlYWQgYWRkcmVzcyByZWcgaW4gdHhkbWEgYWRkcmVzcyBtYXAgYXQgMHgxMDE4CisgKgorICogdTMyCisgKiB0eGRtYSBzdGF0dXMgd3JpdGViYWNrIGFkZHJlc3MgaGkgcmVnIGluIHR4ZG1hIGFkZHJlc3MgbWFwIGF0MHgxMDFDCisgKiB0eGRtYSBzdGF0dXMgd3JpdGViYWNrIGFkZHJlc3MgbG8gcmVnIGluIHR4ZG1hIGFkZHJlc3MgbWFwIGF0IDB4MTAyMAorICoKKyAqIDEwYml0IERNQSB3aXRoIHdyYXAKKyAqIHR4ZG1hIHNlcnZpY2UgcmVxdWVzdCByZWcgaW4gdHhkbWEgYWRkcmVzcyBtYXAgYXQgMHgxMDI0CisgKiBzdHJ1Y3R1cmUgZm9yIHR4ZG1hIHNlcnZpY2UgY29tcGxldGUgcmVnIGluIHR4ZG1hIGFkZHJlc3MgbWFwIGF0IDB4MTAyOAorICoKKyAqIDRiaXQgRE1BIHdpdGggd3JhcAorICogdHhkbWEgdHggZGVzY3JpcHRvciBjYWNoZSByZWFkIGluZGV4IHJlZyBpbiB0eGRtYSBhZGRyZXNzIG1hcCBhdCAweDEwMkMKKyAqIHR4ZG1hIHR4IGRlc2NyaXB0b3IgY2FjaGUgd3JpdGUgaW5kZXggcmVnIGluIHR4ZG1hIGFkZHJlc3MgbWFwIGF0IDB4MTAzMAorICoKKyAqIHR4ZG1hIGVycm9yIHJlZyBpbiB0eGRtYSBhZGRyZXNzIG1hcCBhdCBhZGRyZXNzIDB4MTAzNAorICogMDogUHlsZFJlc2VuZAorICogMTogUHlsZFJld2luZAorICogNDogRGVzY3JSZXNlbmQKKyAqIDU6IERlc2NyUmV3aW5kCisgKiA4OiBXcmJrUmVzZW5kCisgKiA5OiBXcmJrUmV3aW5kCisgKi8KKworLyoKKyAqIFR4IERNQSBNb2R1bGUgb2YgSkFHQ29yZSBBZGRyZXNzIE1hcHBpbmcKKyAqIExvY2F0ZWQgYXQgYWRkcmVzcyAweDEwMDAKKyAqLworc3RydWN0IHR4ZG1hX3JlZ3MgewkJCS8qIExvY2F0aW9uOiAqLworCXUzMiBjc3I7CQkJLyogIDB4MTAwMCAqLworCXUzMiBwcl9iYXNlX2hpOwkJCS8qICAweDEwMDQgKi8KKwl1MzIgcHJfYmFzZV9sbzsJCQkvKiAgMHgxMDA4ICovCisJdTMyIHByX251bV9kZXM7CQkJLyogIDB4MTAwQyAqLworCXUzMiB0eHFfd3JfYWRkcjsJCS8qICAweDEwMTAgKi8KKwl1MzIgdHhxX3dyX2FkZHJfZXh0OwkJLyogIDB4MTAxNCAqLworCXUzMiB0eHFfcmRfYWRkcjsJCS8qICAweDEwMTggKi8KKwl1MzIgZG1hX3diX2Jhc2VfaGk7CQkvKiAgMHgxMDFDICovCisJdTMyIGRtYV93Yl9iYXNlX2xvOwkJLyogIDB4MTAyMCAqLworCXUzMiBzZXJ2aWNlX3JlcXVlc3Q7CQkvKiAgMHgxMDI0ICovCisJdTMyIHNlcnZpY2VfY29tcGxldGU7CQkvKiAgMHgxMDI4ICovCisJdTMyIGNhY2hlX3JkX2luZGV4OwkJLyogIDB4MTAyQyAqLworCXUzMiBjYWNoZV93cl9pbmRleDsJCS8qICAweDEwMzAgKi8KKwl1MzIgdHhfZG1hX2Vycm9yOwkJLyogIDB4MTAzNCAqLworCXUzMiBkZXNjX2Fib3J0X2NudDsJCS8qICAweDEwMzggKi8KKwl1MzIgcGF5bG9hZF9hYm9ydF9jbnQ7CQkvKiAgMHgxMDNjICovCisJdTMyIHdyaXRlYmFja19hYm9ydF9jbnQ7CS8qICAweDEwNDAgKi8KKwl1MzIgZGVzY190aW1lb3V0X2NudDsJCS8qICAweDEwNDQgKi8KKwl1MzIgcGF5bG9hZF90aW1lb3V0X2NudDsJLyogIDB4MTA0OCAqLworCXUzMiB3cml0ZWJhY2tfdGltZW91dF9jbnQ7CS8qICAweDEwNGMgKi8KKwl1MzIgZGVzY19lcnJvcl9jbnQ7CQkvKiAgMHgxMDUwICovCisJdTMyIHBheWxvYWRfZXJyb3JfY250OwkJLyogIDB4MTA1NCAqLworCXUzMiB3cml0ZWJhY2tfZXJyb3JfY250OwkvKiAgMHgxMDU4ICovCisJdTMyIGRyb3BwZWRfdGxwX2NudDsJCS8qICAweDEwNWMgKi8KKwl1MzIgbmV3X3NlcnZpY2VfY29tcGxldGU7CS8qICAweDEwNjAgKi8KKwl1MzIgZXRoZXJuZXRfcGFja2V0X2NudDsJLyogIDB4MTA2NCAqLworfTsKKworLyogRU5EIE9GIFRYRE1BIFJFR0lTVEVSIEFERFJFU1MgTUFQICovCisKKworLyogU1RBUlQgT0YgUlhETUEgUkVHSVNURVIgQUREUkVTUyBNQVAgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgY29udHJvbCBzdGF0dXMgcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCisgKiBMb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDAwCisgKgorICogQ1NSCisgKiAwOiBoYWx0CisgKiAxLTM6IHRjCisgKiA0OiBmYnJfYmlnX2VuZGlhbgorICogNTogcHNyX2JpZ19lbmRpYW4KKyAqIDY6IHBrdF9iaWdfZW5kaWFuCisgKiA3OiBkbWFfYmlnX2VuZGlhbgorICogOC05OiBmYnIwX3NpemUKKyAqIDEwOiBmYnIwX2VuYWJsZQorICogMTEtMTI6IGZicjFfc2l6ZQorICogMTM6IGZicjFfZW5hYmxlCisgKiAxNDogdW51c2VkCisgKiAxNTogcGt0X2Ryb3BfZGlzYWJsZQorICogMTY6IHBrdF9kb25lX2ZsdXNoCisgKiAxNzogaGFsdF9zdGF0dXMKKyAqIDE4LTMxOiB1bnVzZWQKKyAqLworCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIGRtYSB3cml0ZWJhY2sgbG8gcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDA0CisgKiBEZWZpbmVkIGVhcmxpZXIgKHUzMikKKyAqLworCisvKgorICogc3RydWN0dXJlIGZvciBkbWEgd3JpdGViYWNrIGhpIHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcAorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MjAwOAorICogRGVmaW5lZCBlYXJsaWVyICh1MzIpCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgbnVtYmVyIG9mIHBhY2tldHMgZG9uZSByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKKyAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwMEMKKyAqCisgKiAzMS04OiB1bnVzZWQKKyAqIDctMDogbnVtIGRvbmUKKyAqLworCisvKgorICogc3RydWN0dXJlIGZvciBtYXggcGFja2V0IHRpbWUgcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDEwCisgKgorICogMzEtMTg6IHVudXNlZAorICogMTctMDogdGltZSBkb25lCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgcnggcXVldWUgcmVhZCBhZGRyZXNzIHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcAorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MjAxNAorICogRGVmaW5lZCBlYXJsaWVyICh1MzIpCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgcnggcXVldWUgcmVhZCBhZGRyZXNzIGV4dGVybmFsIHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcAorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MjAxOAorICogRGVmaW5lZCBlYXJsaWVyICh1MzIpCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgcnggcXVldWUgd3JpdGUgYWRkcmVzcyByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKKyAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwMUMKKyAqIERlZmluZWQgZWFybGllciAodTMyKQorICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIHBhY2tldCBzdGF0dXMgcmluZyBiYXNlIGFkZHJlc3MgbG8gcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDIwCisgKiBEZWZpbmVkIGVhcmxpZXIgKHUzMikKKyAqLworCisvKgorICogc3RydWN0dXJlIGZvciBwYWNrZXQgc3RhdHVzIHJpbmcgYmFzZSBhZGRyZXNzIGhpIHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcAorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MjAyNAorICogRGVmaW5lZCBlYXJsaWVyICh1MzIpCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgcGFja2V0IHN0YXR1cyByaW5nIG51bWJlciBvZiBkZXNjcmlwdG9ycyByZWcgaW4gcnhkbWEgYWRkcmVzcworICogbWFwLiAgTG9jYXRlZCBhdCBhZGRyZXNzIDB4MjAyOAorICoKKyAqIDMxLTEyOiB1bnVzZWQKKyAqIDExLTA6IHBzciBuZGVzCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgcGFja2V0IHN0YXR1cyByaW5nIGF2YWlsYWJsZSBvZmZzZXQgcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDJDCisgKgorICogMzEtMTM6IHVudXNlZAorICogMTI6IHBzciBhdmFpbCB3cmFwCisgKiAxMS0wOiBwc3IgYXZhaWwKKyAqLworCisvKgorICogc3RydWN0dXJlIGZvciBwYWNrZXQgc3RhdHVzIHJpbmcgZnVsbCBvZmZzZXQgcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDMwCisgKgorICogMzEtMTM6IHVudXNlZAorICogMTI6IHBzciBmdWxsIHdyYXAKKyAqIDExLTA6IHBzciBmdWxsCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgcGFja2V0IHN0YXR1cyByaW5nIGFjY2VzcyBpbmRleCByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKKyAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwMzQKKyAqCisgKiAzMS01OiB1bnVzZWQKKyAqIDQtMDogcHNyX2FpCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgcGFja2V0IHN0YXR1cyByaW5nIG1pbmltdW0gZGVzY3JpcHRvcnMgcmVnIGluIHJ4ZG1hIGFkZHJlc3MKKyAqIG1hcC4gIExvY2F0ZWQgYXQgYWRkcmVzcyAweDIwMzgKKyAqCisgKiAzMS0xMjogdW51c2VkCisgKiAxMS0wOiBwc3JfbWluCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgZnJlZSBidWZmZXIgcmluZyBiYXNlIGxvIGFkZHJlc3MgcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDNDCisgKiBEZWZpbmVkIGVhcmxpZXIgKHUzMikKKyAqLworCisvKgorICogc3RydWN0dXJlIGZvciBmcmVlIGJ1ZmZlciByaW5nIGJhc2UgaGkgYWRkcmVzcyByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKKyAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwNDAKKyAqIERlZmluZWQgZWFybGllciAodTMyKQorICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIGZyZWUgYnVmZmVyIHJpbmcgbnVtYmVyIG9mIGRlc2NyaXB0b3JzIHJlZyBpbiByeGRtYSBhZGRyZXNzCisgKiBtYXAuICBMb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDQ0CisgKgorICogMzEtMTA6IHVudXNlZAorICogOS0wOiBmYnIgbmRlc2MKKyAqLworCisvKgorICogc3RydWN0dXJlIGZvciBmcmVlIGJ1ZmZlciByaW5nIDAgYXZhaWxhYmxlIG9mZnNldCByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKKyAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwNDgKKyAqIERlZmluZWQgZWFybGllciAodTMyKQorICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIGZyZWUgYnVmZmVyIHJpbmcgMCBmdWxsIG9mZnNldCByZWcgaW4gcnhkbWEgYWRkcmVzcyBtYXAKKyAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDIwNEMKKyAqIERlZmluZWQgZWFybGllciAodTMyKQorICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIGZyZWUgYnVmZmVyIGNhY2hlIDAgZnVsbCBvZmZzZXQgcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDUwCisgKgorICogMzEtNTogdW51c2VkCisgKiA0LTA6IGZiYyByZGkKKyAqLworCisvKgorICogc3RydWN0dXJlIGZvciBmcmVlIGJ1ZmZlciByaW5nIDAgbWluaW11bSBkZXNjcmlwdG9yIHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcAorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MjA1NAorICoKKyAqIDMxLTEwOiB1bnVzZWQKKyAqIDktMDogZmJyIG1pbgorICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIGZyZWUgYnVmZmVyIHJpbmcgMSBiYXNlIGFkZHJlc3MgbG8gcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDU4IC0gMHgyMDVDCisgKiBEZWZpbmVkIGVhcmxpZXIgKFJYRE1BX0ZCUl9CQVNFX0xPX3QgYW5kIFJYRE1BX0ZCUl9CQVNFX0hJX3QpCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgZnJlZSBidWZmZXIgcmluZyAxIG51bWJlciBvZiBkZXNjcmlwdG9ycyByZWcgaW4gcnhkbWEgYWRkcmVzcworICogbWFwLiAgTG9jYXRlZCBhdCBhZGRyZXNzIDB4MjA2MAorICogRGVmaW5lZCBlYXJsaWVyIChSWERNQV9GQlJfTlVNX0RFU190KQorICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIGZyZWUgYnVmZmVyIHJpbmcgMSBhdmFpbGFibGUgb2Zmc2V0IHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcAorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MjA2NAorICogRGVmaW5lZCBFYXJsaWVyIChSWERNQV9GQlJfQVZBSUxfT0ZGU0VUX3QpCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgZnJlZSBidWZmZXIgcmluZyAxIGZ1bGwgb2Zmc2V0IHJlZyBpbiByeGRtYSBhZGRyZXNzIG1hcAorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MjA2OAorICogRGVmaW5lZCBFYXJsaWVyIChSWERNQV9GQlJfRlVMTF9PRkZTRVRfdCkKKyAqLworCisvKgorICogc3RydWN0dXJlIGZvciBmcmVlIGJ1ZmZlciBjYWNoZSAxIHJlYWQgaW5kZXggcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDZDCisgKiBEZWZpbmVkIEVhcmxpZXIgKFJYRE1BX0ZCQ19SRF9JTkRFWF90KQorICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIGZyZWUgYnVmZmVyIHJpbmcgMSBtaW5pbXVtIGRlc2NyaXB0b3IgcmVnIGluIHJ4ZG1hIGFkZHJlc3MgbWFwCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgyMDcwCisgKiBEZWZpbmVkIEVhcmxpZXIgKFJYRE1BX0ZCUl9NSU5fREVTX3QpCisgKi8KKworLyoKKyAqIFJ4IERNQSBNb2R1bGUgb2YgSkFHQ29yZSBBZGRyZXNzIE1hcHBpbmcKKyAqIExvY2F0ZWQgYXQgYWRkcmVzcyAweDIwMDAKKyAqLworc3RydWN0IHJ4ZG1hX3JlZ3MgewkJCQkJLyogTG9jYXRpb246ICovCisJdTMyIGNzcjsJCQkJCS8qICAweDIwMDAgKi8KKwl1MzIgZG1hX3diX2Jhc2VfbG87CQkJCS8qICAweDIwMDQgKi8KKwl1MzIgZG1hX3diX2Jhc2VfaGk7CQkJCS8qICAweDIwMDggKi8KKwl1MzIgbnVtX3BrdF9kb25lOwkJCQkvKiAgMHgyMDBDICovCisJdTMyIG1heF9wa3RfdGltZTsJCQkJLyogIDB4MjAxMCAqLworCXUzMiByeHFfcmRfYWRkcjsJCQkJLyogIDB4MjAxNCAqLworCXUzMiByeHFfcmRfYWRkcl9leHQ7CQkJCS8qICAweDIwMTggKi8KKwl1MzIgcnhxX3dyX2FkZHI7CQkJCS8qICAweDIwMUMgKi8KKwl1MzIgcHNyX2Jhc2VfbG87CQkJCS8qICAweDIwMjAgKi8KKwl1MzIgcHNyX2Jhc2VfaGk7CQkJCS8qICAweDIwMjQgKi8KKwl1MzIgcHNyX251bV9kZXM7CQkJCS8qICAweDIwMjggKi8KKwl1MzIgcHNyX2F2YWlsX29mZnNldDsJCQkJLyogIDB4MjAyQyAqLworCXUzMiBwc3JfZnVsbF9vZmZzZXQ7CQkJCS8qICAweDIwMzAgKi8KKwl1MzIgcHNyX2FjY2Vzc19pbmRleDsJCQkJLyogIDB4MjAzNCAqLworCXUzMiBwc3JfbWluX2RlczsJCQkJLyogIDB4MjAzOCAqLworCXUzMiBmYnIwX2Jhc2VfbG87CQkJCS8qICAweDIwM0MgKi8KKwl1MzIgZmJyMF9iYXNlX2hpOwkJCQkvKiAgMHgyMDQwICovCisJdTMyIGZicjBfbnVtX2RlczsJCQkJLyogIDB4MjA0NCAqLworCXUzMiBmYnIwX2F2YWlsX29mZnNldDsJCQkJLyogIDB4MjA0OCAqLworCXUzMiBmYnIwX2Z1bGxfb2Zmc2V0OwkJCQkvKiAgMHgyMDRDICovCisJdTMyIGZicjBfcmRfaW5kZXg7CQkJCS8qICAweDIwNTAgKi8KKwl1MzIgZmJyMF9taW5fZGVzOwkJCQkvKiAgMHgyMDU0ICovCisJdTMyIGZicjFfYmFzZV9sbzsJCQkJLyogIDB4MjA1OCAqLworCXUzMiBmYnIxX2Jhc2VfaGk7CQkJCS8qICAweDIwNUMgKi8KKwl1MzIgZmJyMV9udW1fZGVzOwkJCQkvKiAgMHgyMDYwICovCisJdTMyIGZicjFfYXZhaWxfb2Zmc2V0OwkJCQkvKiAgMHgyMDY0ICovCisJdTMyIGZicjFfZnVsbF9vZmZzZXQ7CQkJCS8qICAweDIwNjggKi8KKwl1MzIgZmJyMV9yZF9pbmRleDsJCQkJLyogIDB4MjA2QyAqLworCXUzMiBmYnIxX21pbl9kZXM7CQkJCS8qICAweDIwNzAgKi8KK307CisKKy8qIEVORCBPRiBSWERNQSBSRUdJU1RFUiBBRERSRVNTIE1BUCAqLworCisKKy8qIFNUQVJUIE9GIFRYTUFDIFJFR0lTVEVSIEFERFJFU1MgTUFQICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIGNvbnRyb2wgcmVnIGluIHR4bWFjIGFkZHJlc3MgbWFwCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgzMDAwCisgKgorICogYml0cworICogMzEtODogdW51c2VkCisgKiA3OiBja2xzZWdfZGlzYWJsZQorICogNjogY2tiY250X2Rpc2FibGUKKyAqIDU6IGNrc2VnbnVtCisgKiA0OiBhc3luY19kaXNhYmxlCisgKiAzOiBmY19kaXNhYmxlCisgKiAyOiBtY2lmX2Rpc2FibGUKKyAqIDE6IG1pZl9kaXNhYmxlCisgKiAwOiB0eG1hY19lbgorICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIHNoYWRvdyBwb2ludGVyIHJlZyBpbiB0eG1hYyBhZGRyZXNzIG1hcAorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MzAwNAorICogMzEtMjc6IHJlc2VydmVkCisgKiAyNi0xNjogdHhxIHJkIHB0cgorICogMTUtMTE6IHJlc2VydmVkCisgKiAxMC0wOiB0eHEgd3IgcHRyCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgZXJyb3IgY291bnQgcmVnIGluIHR4bWFjIGFkZHJlc3MgbWFwCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHgzMDA4CisgKgorICogMzEtMTI6IHVudXNlZAorICogMTEtODogcmVzZXJ2ZWQKKyAqIDctNDogdHhxX3VuZGVycnVuCisgKiAzLTA6IGZpZm9fdW5kZXJydW4KKyAqLworCisvKgorICogc3RydWN0dXJlIGZvciBtYXggZmlsbCByZWcgaW4gdHhtYWMgYWRkcmVzcyBtYXAKKyAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDMwMEMKKyAqIDMxLTEyOiB1bnVzZWQKKyAqIDExLTA6IG1heCBmaWxsCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgY2YgcGFyYW1ldGVyIHJlZyBpbiB0eG1hYyBhZGRyZXNzIG1hcAorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MzAxMAorICogMzEtMTY6IGNmZXAKKyAqIDE1LTA6IGNmcHQKKyAqLworCisvKgorICogc3RydWN0dXJlIGZvciB0eCB0ZXN0IHJlZyBpbiB0eG1hYyBhZGRyZXNzIG1hcAorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MzAxNAorICogMzEtMTc6IHVudXNlZAorICogMTY6IHJlc2VydmVkMQorICogMTU6IHR4dGVzdF9lbgorICogMTQtMTE6IHVudXNlZAorICogMTAtMDogdHhxIHRlc3QgcG9pbnRlcgorICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIGVycm9yIHJlZyBpbiB0eG1hYyBhZGRyZXNzIG1hcAorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MzAxOAorICoKKyAqIDMxLTk6IHVudXNlZAorICogODogZmlmb191bmRlcnJ1bgorICogNy02OiB1bnVzZWQKKyAqIDU6IGN0cmwyX2VycgorICogNDogdHhxX3VuZGVycnVuCisgKiAzOiBiY250X2VycgorICogMjogbHNlZ19lcnIKKyAqIDE6IHNlZ251bV9lcnIKKyAqIDA6IHNlZzBfZXJyCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgZXJyb3IgaW50ZXJydXB0IHJlZyBpbiB0eG1hYyBhZGRyZXNzIG1hcAorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MzAxQworICoKKyAqIDMxLTk6IHVudXNlZAorICogODogZmlmb191bmRlcnJ1bgorICogNy02OiB1bnVzZWQKKyAqIDU6IGN0cmwyX2VycgorICogNDogdHhxX3VuZGVycnVuCisgKiAzOiBiY250X2VycgorICogMjogbHNlZ19lcnIKKyAqIDE6IHNlZ251bV9lcnIKKyAqIDA6IHNlZzBfZXJyCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgZXJyb3IgaW50ZXJydXB0IHJlZyBpbiB0eG1hYyBhZGRyZXNzIG1hcAorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4MzAyMAorICoKKyAqIDMxLTI6IHVudXNlZAorICogMTogYnBfcmVxCisgKiAwOiBicF94b254b2ZmCisgKi8KKworLyoKKyAqIFR4IE1BQyBNb2R1bGUgb2YgSkFHQ29yZSBBZGRyZXNzIE1hcHBpbmcKKyAqLworc3RydWN0IHR4bWFjX3JlZ3MgewkJCS8qIExvY2F0aW9uOiAqLworCXUzMiBjdGw7CQkJLyogIDB4MzAwMCAqLworCXUzMiBzaGFkb3dfcHRyOwkJCS8qICAweDMwMDQgKi8KKwl1MzIgZXJyX2NudDsJCQkvKiAgMHgzMDA4ICovCisJdTMyIG1heF9maWxsOwkJCS8qICAweDMwMEMgKi8KKwl1MzIgY2ZfcGFyYW07CQkJLyogIDB4MzAxMCAqLworCXUzMiB0eF90ZXN0OwkJCS8qICAweDMwMTQgKi8KKwl1MzIgZXJyOwkJCS8qICAweDMwMTggKi8KKwl1MzIgZXJyX2ludDsJCQkvKiAgMHgzMDFDICovCisJdTMyIGJwX2N0cmw7CQkJLyogIDB4MzAyMCAqLworfTsKKworLyogRU5EIE9GIFRYTUFDIFJFR0lTVEVSIEFERFJFU1MgTUFQICovCisKKy8qIFNUQVJUIE9GIFJYTUFDIFJFR0lTVEVSIEFERFJFU1MgTUFQICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIHJ4bWFjIGNvbnRyb2wgcmVnIGluIHJ4bWFjIGFkZHJlc3MgbWFwCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg0MDAwCisgKgorICogMzEtNzogcmVzZXJ2ZWQKKyAqIDY6IHJ4bWFjX2ludF9kaXNhYmxlCisgKiA1OiBhc3luY19kaXNhYmxlCisgKiA0OiBtaWZfZGlzYWJsZQorICogMzogd29sX2Rpc2FibGUKKyAqIDI6IHBrdF9maWx0ZXJfZGlzYWJsZQorICogMTogbWNpZl9kaXNhYmxlCisgKiAwOiByeG1hY19lbgorICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIFdha2UgT24gTGFuIENvbnRyb2wgYW5kIENSQyAwIHJlZyBpbiByeG1hYyBhZGRyZXNzIG1hcAorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NDAwNAorICogMzEtMTY6IGNyYworICogMTUtMTI6IHJlc2VydmVkCisgKiAxMTogaWdub3JlX3BwCisgKiAxMDogaWdub3JlX21wCisgKiA5OiBjbHJfaW50cgorICogODogaWdub3JlX2xpbmtfY2hnCisgKiA3OiBpZ25vcmVfdW5pCisgKiA2OiBpZ25vcmVfbXVsdGkKKyAqIDU6IGlnbm9yZV9icm9hZAorICogNC0wOiB2YWxpZF9jcmMgNC0wCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgQ1JDIDEgYW5kIENSQyAyIHJlZyBpbiByeG1hYyBhZGRyZXNzIG1hcAorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NDAwOAorICoKKyAqIDMxLTE2OiBjcmMyCisgKiAxNS0wOiBjcmMxCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgQ1JDIDMgYW5kIENSQyA0IHJlZyBpbiByeG1hYyBhZGRyZXNzIG1hcAorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NDAwQworICoKKyAqIDMxLTE2OiBjcmM0CisgKiAxNS0wOiBjcmMzCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgV2FrZSBPbiBMYW4gU291cmNlIEFkZHJlc3MgTG8gcmVnIGluIHJ4bWFjIGFkZHJlc3MgbWFwCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg0MDEwCisgKgorICogMzEtMjQ6IHNhMworICogMjMtMTY6IHNhNAorICogMTUtODogc2E1CisgKiA3LTA6IHNhNgorICovCisKKyNkZWZpbmUgRVRfV09MX0xPX1NBM19TSElGVCAyNAorI2RlZmluZSBFVF9XT0xfTE9fU0E0X1NISUZUIDE2CisjZGVmaW5lIEVUX1dPTF9MT19TQTVfU0hJRlQgOAorCisvKgorICogc3RydWN0dXJlIGZvciBXYWtlIE9uIExhbiBTb3VyY2UgQWRkcmVzcyBIaSByZWcgaW4gcnhtYWMgYWRkcmVzcyBtYXAKKyAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDQwMTQKKyAqCisgKiAzMS0xNjogcmVzZXJ2ZWQKKyAqIDE1LTg6IHNhMQorICogNy0wOiBzYTIKKyAqLworCisjZGVmaW5lIEVUX1dPTF9ISV9TQTFfU0hJRlQgOAorCisvKgorICogc3RydWN0dXJlIGZvciBXYWtlIE9uIExhbiBtYXNrIHJlZyBpbiByeG1hYyBhZGRyZXNzIG1hcAorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NDAxOCAtIDB4NDA2NAorICogRGVmaW5lZCBlYXJsaWVyICh1MzIpCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgVW5pY2FzdCBQYWtldCBGaWx0ZXIgQWRkcmVzcyAxIHJlZyBpbiByeG1hYyBhZGRyZXNzIG1hcAorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NDA2OAorICoKKyAqIDMxLTI0OiBhZGRyMV8zCisgKiAyMy0xNjogYWRkcjFfNAorICogMTUtODogYWRkcjFfNQorICogNy0wOiBhZGRyMV82CisgKi8KKworI2RlZmluZSBFVF9VTklfUEZfQUREUjFfM19TSElGVCAyNAorI2RlZmluZSBFVF9VTklfUEZfQUREUjFfNF9TSElGVCAxNgorI2RlZmluZSBFVF9VTklfUEZfQUREUjFfNV9TSElGVCA4CisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIFVuaWNhc3QgUGFrZXQgRmlsdGVyIEFkZHJlc3MgMiByZWcgaW4gcnhtYWMgYWRkcmVzcyBtYXAKKyAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDQwNkMKKyAqCisgKiAzMS0yNDogYWRkcjJfMworICogMjMtMTY6IGFkZHIyXzQKKyAqIDE1LTg6IGFkZHIyXzUKKyAqIDctMDogYWRkcjJfNgorICovCisKKyNkZWZpbmUgRVRfVU5JX1BGX0FERFIyXzNfU0hJRlQgMjQKKyNkZWZpbmUgRVRfVU5JX1BGX0FERFIyXzRfU0hJRlQgMTYKKyNkZWZpbmUgRVRfVU5JX1BGX0FERFIyXzVfU0hJRlQgOAorCisvKgorICogc3RydWN0dXJlIGZvciBVbmljYXN0IFBha2V0IEZpbHRlciBBZGRyZXNzIDEgJiAyIHJlZyBpbiByeG1hYyBhZGRyZXNzIG1hcAorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NDA3MAorICoKKyAqIDMxLTI0OiBhZGRyMl8xCisgKiAyMy0xNjogYWRkcjJfMgorICogMTUtODogYWRkcjFfMQorICogNy0wOiBhZGRyMV8yCisgKi8KKworI2RlZmluZSBFVF9VTklfUEZfQUREUjJfMV9TSElGVCAyNAorI2RlZmluZSBFVF9VTklfUEZfQUREUjJfMl9TSElGVCAxNgorI2RlZmluZSBFVF9VTklfUEZfQUREUjFfMV9TSElGVCA4CisKKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgTXVsdGljYXN0IEhhc2ggcmVnIGluIHJ4bWFjIGFkZHJlc3MgbWFwCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg0MDc0IC0gMHg0MDgwCisgKiBEZWZpbmVkIGVhcmxpZXIgKHUzMikKKyAqLworCisvKgorICogc3RydWN0dXJlIGZvciBQYWNrZXQgRmlsdGVyIENvbnRyb2wgcmVnIGluIHJ4bWFjIGFkZHJlc3MgbWFwCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg0MDg0CisgKgorICogMzEtMjM6IHVudXNlZAorICogMjItMTY6IG1pbl9wa3Rfc2l6ZQorICogMTUtNDogdW51c2VkCisgKiAzOiBmaWx0ZXJfZnJhZ19lbgorICogMjogZmlsdGVyX3VuaV9lbgorICogMTogZmlsdGVyX211bHRpX2VuCisgKiAwOiBmaWx0ZXJfYnJvYWRfZW4KKyAqLworCisvKgorICogc3RydWN0dXJlIGZvciBNZW1vcnkgQ29udHJvbGxlciBJbnRlcmZhY2UgQ29udHJvbCBNYXggU2VnbWVudCByZWcgaW4gcnhtYWMKKyAqIGFkZHJlc3MgbWFwLiAgTG9jYXRlZCBhdCBhZGRyZXNzIDB4NDA4OAorICoKKyAqIDMxLTEwOiByZXNlcnZlZAorICogOS0yOiBtYXhfc2l6ZQorICogMTogZmNfZW4KKyAqIDA6IHNlZ19lbgorICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIE1lbW9yeSBDb250cm9sbGVyIEludGVyZmFjZSBXYXRlciBNYXJrIHJlZyBpbiByeG1hYyBhZGRyZXNzCisgKiBtYXAuICBMb2NhdGVkIGF0IGFkZHJlc3MgMHg0MDhDCisgKgorICogMzEtMjY6IHVudXNlZAorICogMjUtMTY6IG1hcmtfaGkKKyAqIDE1LTEwOiB1bnVzZWQKKyAqIDktMDogbWFya19sbworICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIFJ4IFF1ZXVlIERpYWxvZyByZWcgaW4gcnhtYWMgYWRkcmVzcyBtYXAuCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg0MDkwCisgKgorICogMzEtMjY6IHJlc2VydmVkCisgKiAyNS0xNjogcmRfcHRyCisgKiAxNS0xMDogcmVzZXJ2ZWQKKyAqIDktMDogd3JfcHRyCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3Igc3BhY2UgYXZhaWxhYmxlIHJlZyBpbiByeG1hYyBhZGRyZXNzIG1hcC4KKyAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDQwOTQKKyAqCisgKiAzMS0xNzogcmVzZXJ2ZWQKKyAqIDE2OiBzcGFjZV9hdmFpbF9lbgorICogMTUtMTA6IHJlc2VydmVkCisgKiA5LTA6IHNwYWNlX2F2YWlsCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgbWFuYWdlbWVudCBpbnRlcmZhY2UgcmVnIGluIHJ4bWFjIGFkZHJlc3MgbWFwLgorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NDA5OAorICoKKyAqIDMxLTE4OiByZXNlcnZlZAorICogMTc6IGRyb3BfcGt0X2VuCisgKiAxNi0wOiBkcm9wX3BrdF9tYXNrCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgRXJyb3IgcmVnIGluIHJ4bWFjIGFkZHJlc3MgbWFwLgorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NDA5QworICoKKyAqIDMxLTQ6IHVudXNlZAorICogMzogbWlmCisgKiAyOiBhc3luYworICogMTogcGt0X2ZpbHRlcgorICogMDogbWNpZgorICovCisKKy8qCisgKiBSeCBNQUMgTW9kdWxlIG9mIEpBR0NvcmUgQWRkcmVzcyBNYXBwaW5nCisgKi8KK3N0cnVjdCByeG1hY19yZWdzIHsJCQkJCS8qIExvY2F0aW9uOiAqLworCXUzMiBjdHJsOwkJCQkJLyogIDB4NDAwMCAqLworCXUzMiBjcmMwOwkJCQkJLyogIDB4NDAwNCAqLworCXUzMiBjcmMxMjsJCQkJCS8qICAweDQwMDggKi8KKwl1MzIgY3JjMzQ7CQkJCQkvKiAgMHg0MDBDICovCisJdTMyIHNhX2xvOwkJCQkJLyogIDB4NDAxMCAqLworCXUzMiBzYV9oaTsJCQkJCS8qICAweDQwMTQgKi8KKwl1MzIgbWFzazBfd29yZDA7CQkJCS8qICAweDQwMTggKi8KKwl1MzIgbWFzazBfd29yZDE7CQkJCS8qICAweDQwMUMgKi8KKwl1MzIgbWFzazBfd29yZDI7CQkJCS8qICAweDQwMjAgKi8KKwl1MzIgbWFzazBfd29yZDM7CQkJCS8qICAweDQwMjQgKi8KKwl1MzIgbWFzazFfd29yZDA7CQkJCS8qICAweDQwMjggKi8KKwl1MzIgbWFzazFfd29yZDE7CQkJCS8qICAweDQwMkMgKi8KKwl1MzIgbWFzazFfd29yZDI7CQkJCS8qICAweDQwMzAgKi8KKwl1MzIgbWFzazFfd29yZDM7CQkJCS8qICAweDQwMzQgKi8KKwl1MzIgbWFzazJfd29yZDA7CQkJCS8qICAweDQwMzggKi8KKwl1MzIgbWFzazJfd29yZDE7CQkJCS8qICAweDQwM0MgKi8KKwl1MzIgbWFzazJfd29yZDI7CQkJCS8qICAweDQwNDAgKi8KKwl1MzIgbWFzazJfd29yZDM7CQkJCS8qICAweDQwNDQgKi8KKwl1MzIgbWFzazNfd29yZDA7CQkJCS8qICAweDQwNDggKi8KKwl1MzIgbWFzazNfd29yZDE7CQkJCS8qICAweDQwNEMgKi8KKwl1MzIgbWFzazNfd29yZDI7CQkJCS8qICAweDQwNTAgKi8KKwl1MzIgbWFzazNfd29yZDM7CQkJCS8qICAweDQwNTQgKi8KKwl1MzIgbWFzazRfd29yZDA7CQkJCS8qICAweDQwNTggKi8KKwl1MzIgbWFzazRfd29yZDE7CQkJCS8qICAweDQwNUMgKi8KKwl1MzIgbWFzazRfd29yZDI7CQkJCS8qICAweDQwNjAgKi8KKwl1MzIgbWFzazRfd29yZDM7CQkJCS8qICAweDQwNjQgKi8KKwl1MzIgdW5pX3BmX2FkZHIxOwkJCQkvKiAgMHg0MDY4ICovCisJdTMyIHVuaV9wZl9hZGRyMjsJCQkJLyogIDB4NDA2QyAqLworCXUzMiB1bmlfcGZfYWRkcjM7CQkJCS8qICAweDQwNzAgKi8KKwl1MzIgbXVsdGlfaGFzaDE7CQkJCS8qICAweDQwNzQgKi8KKwl1MzIgbXVsdGlfaGFzaDI7CQkJCS8qICAweDQwNzggKi8KKwl1MzIgbXVsdGlfaGFzaDM7CQkJCS8qICAweDQwN0MgKi8KKwl1MzIgbXVsdGlfaGFzaDQ7CQkJCS8qICAweDQwODAgKi8KKwl1MzIgcGZfY3RybDsJCQkJCS8qICAweDQwODQgKi8KKwl1MzIgbWNpZl9jdHJsX21heF9zZWc7CQkJCS8qICAweDQwODggKi8KKwl1MzIgbWNpZl93YXRlcl9tYXJrOwkJCQkvKiAgMHg0MDhDICovCisJdTMyIHJ4cV9kaWFnOwkJCQkJLyogIDB4NDA5MCAqLworCXUzMiBzcGFjZV9hdmFpbDsJCQkJLyogIDB4NDA5NCAqLworCisJdTMyIG1pZl9jdHJsOwkJCQkJLyogIDB4NDA5OCAqLworCXUzMiBlcnJfcmVnOwkJCQkJLyogIDB4NDA5QyAqLworfTsKKworLyogRU5EIE9GIFJYTUFDIFJFR0lTVEVSIEFERFJFU1MgTUFQICovCisKKworLyogU1RBUlQgT0YgTUFDIFJFR0lTVEVSIEFERFJFU1MgTUFQICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIGNvbmZpZ3VyYXRpb24gIzEgcmVnIGluIG1hYyBhZGRyZXNzIG1hcC4KKyAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDUwMDAKKyAqCisgKiAzMTogc29mdCByZXNldAorICogMzA6IHNpbSByZXNldAorICogMjktMjA6IHJlc2VydmVkCisgKiAxOTogcmVzZXQgcnggbWMKKyAqIDE4OiByZXNldCB0eCBtYworICogMTc6IHJlc2V0IHJ4IGZ1bmMKKyAqIDE2OiByZXNldCB0eCBmbmMKKyAqIDE1LTk6IHJlc2VydmVkCisgKiA4OiBsb29wYmFjaworICogNy02OiByZXNlcnZlZAorICogNTogcnggZmxvdworICogNDogdHggZmxvdworICogMzogc3luY2QgcnggZW4KKyAqIDI6IHJ4IGVuYWJsZQorICogMTogc3luY2QgdHggZW4KKyAqIDA6IHR4IGVuYWJsZQorICovCisKKyNkZWZpbmUgQ0ZHMV9MT09QQkFDSwkweDAwMDAwMTAwCisjZGVmaW5lIENGRzFfUlhfRkxPVwkweDAwMDAwMDIwCisjZGVmaW5lIENGRzFfVFhfRkxPVwkweDAwMDAwMDEwCisjZGVmaW5lIENGRzFfUlhfRU5BQkxFCTB4MDAwMDAwMDQKKyNkZWZpbmUgQ0ZHMV9UWF9FTkFCTEUJMHgwMDAwMDAwMQorI2RlZmluZSBDRkcxX1dBSVQJMHgwMDAwMDAwQQkvKiBSWCAmIFRYIHN5bmNkICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIGNvbmZpZ3VyYXRpb24gIzIgcmVnIGluIG1hYyBhZGRyZXNzIG1hcC4KKyAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDUwMDQKKyAqIDMxLTE2OiByZXNlcnZlZAorICogMTUtMTI6IHByZWFtYmxlCisgKiAxMS0xMDogcmVzZXJ2ZWQKKyAqIDktODogaWYgbW9kZQorICogNy02OiByZXNlcnZlZAorICogNTogaHVnZSBmcmFtZQorICogNDogbGVuZ3RoIGNoZWNrCisgKiAzOiB1bmRlZmluZWQKKyAqIDI6IHBhZCBjcmMKKyAqIDE6IGNyYyBlbmFibGUKKyAqIDA6IGZ1bGwgZHVwbGV4CisgKi8KKworCisvKgorICogc3RydWN0dXJlIGZvciBJbnRlcnBhY2tldCBnYXAgcmVnIGluIG1hYyBhZGRyZXNzIG1hcC4KKyAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDUwMDgKKyAqCisgKiAzMTogcmVzZXJ2ZWQKKyAqIDMwLTI0OiBub24gQjJCIGlwZyAxCisgKiAyMzogdW5kZWZpbmVkCisgKiAyMi0xNjogbm9uIEIyQiBpcGcgMgorICogMTUtODogTWluIGlmZyBlbmZvcmNlCisgKiA3LTA6IEIyQiBpcGcKKyAqCisgKiBzdHJ1Y3R1cmUgZm9yIGhhbGYgZHVwbGV4IHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDBDCisgKiAzMS0yNDogcmVzZXJ2ZWQKKyAqIDIzLTIwOiBBbHQgQkVCIHRydW5jCisgKiAxOTogQWx0IEJFQiBlbmFibGUKKyAqIDE4OiBCUCBubyBiYWNrb2ZmCisgKiAxNzogbm8gYmFja29mZgorICogMTY6IGV4Y2VzcyBkZWZlcgorICogMTUtMTI6IHJlLXhtaXQgbWF4CisgKiAxMS0xMDogcmVzZXJ2ZWQKKyAqIDktMDogY29sbGlzaW9uIHdpbmRvdworICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIE1heGltdW0gRnJhbWUgTGVuZ3RoIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDEwOiBiaXRzIDAtMTUgaG9sZCB0aGUgbGVuZ3RoLgorICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIFJlc2VydmUgMSByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTAxNCAtIDB4NTAxOAorICogRGVmaW5lZCBlYXJsaWVyICh1MzIpCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgVGVzdCByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTAxQworICogdGVzdDogYml0cyAwLTIsIHJlc3QgdW51c2VkCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgTUlJIE1hbmFnZW1lbnQgQ29uZmlndXJhdGlvbiByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTAyMAorICoKKyAqIDMxOiByZXNldCBNSUkgbWdtdAorICogMzAtNjogdW51c2VkCisgKiA1OiBzY2FuIGF1dG8gaW5jcmVtZW50CisgKiA0OiBwcmVhbWJsZSBzdXBwcmVzcworICogMzogdW5kZWZpbmVkCisgKiAyLTA6IG1nbXQgY2xvY2sgcmVzZXQKKyAqLworCisvKgorICogc3RydWN0dXJlIGZvciBNSUkgTWFuYWdlbWVudCBDb21tYW5kIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDI0CisgKiBiaXQgMTogc2NhbiBjeWNsZQorICogYml0IDA6IHJlYWQgY3ljbGUKKyAqLworCisvKgorICogc3RydWN0dXJlIGZvciBNSUkgTWFuYWdlbWVudCBBZGRyZXNzIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDI4CisgKiAzMS0xMzogcmVzZXJ2ZWQKKyAqIDEyLTg6IHBoeSBhZGRyCisgKiA3LTU6IHJlc2VydmVkCisgKiA0LTA6IHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBNSUlfQUREUihwaHksIHJlZykJKChwaHkpIDw8IDggfCAocmVnKSkKKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgTUlJIE1hbmFnZW1lbnQgQ29udHJvbCByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTAyQworICogMzEtMTY6IHJlc2VydmVkCisgKiAxNS0wOiBwaHkgY29udHJvbAorICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIE1JSSBNYW5hZ2VtZW50IFN0YXR1cyByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTAzMAorICogMzEtMTY6IHJlc2VydmVkCisgKiAxNS0wOiBwaHkgY29udHJvbAorICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIE1JSSBNYW5hZ2VtZW50IEluZGljYXRvcnMgcmVnIGluIG1hYyBhZGRyZXNzIG1hcC4KKyAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDUwMzQKKyAqIDMxLTM6IHJlc2VydmVkCisgKiAyOiBub3QgdmFsaWQKKyAqIDE6IHNjYW5uaW5nCisgKiAwOiBidXN5CisgKi8KKworI2RlZmluZSBNR01UX0JVU1kJMHgwMDAwMDAwMQkvKiBidXN5ICovCisjZGVmaW5lIE1HTVRfV0FJVAkweDAwMDAwMDA1CS8qIGJ1c3kgfCBub3QgdmFsaWQgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgSW50ZXJmYWNlIENvbnRyb2wgcmVnIGluIG1hYyBhZGRyZXNzIG1hcC4KKyAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDUwMzgKKyAqCisgKiAzMTogcmVzZXQgaWYgbW9kdWxlCisgKiAzMC0yODogcmVzZXJ2ZWQKKyAqIDI3OiB0YmkgbW9kZQorICogMjY6IGdoZCBtb2RlCisgKiAyNTogbGhkIG1vZGUKKyAqIDI0OiBwaHkgbW9kZQorICogMjM6IHJlc2V0IHBlciBtaWkKKyAqIDIyLTE3OiByZXNlcnZlZAorICogMTY6IHNwZWVkCisgKiAxNTogcmVzZXQgcGUxMDB4CisgKiAxNC0xMTogcmVzZXJ2ZWQKKyAqIDEwOiBmb3JjZSBxdWlldAorICogOTogbm8gY2lwaGVyCisgKiA4OiBkaXNhYmxlIGxpbmsgZmFpbAorICogNzogcmVzZXQgZ3BzaQorICogNi0xOiByZXNlcnZlZAorICogMDogZW5hYmxlIGphYmJlciBwcm90ZWN0aW9uCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgSW50ZXJmYWNlIFN0YXR1cyByZWcgaW4gbWFjIGFkZHJlc3MgbWFwLgorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NTAzQworICoKKyAqIDMxLTEwOiByZXNlcnZlZAorICogOTogZXhjZXNzX2RlZmVyCisgKiA4OiBjbGFzaAorICogNzogcGh5X2phYmJlcgorICogNjogcGh5X2xpbmtfb2sKKyAqIDU6IHBoeV9mdWxsX2R1cGxleAorICogNDogcGh5X3NwZWVkCisgKiAzOiBwZTEwMHhfbGlua19mYWlsCisgKiAyOiBwZTEwdF9sb3NzX2NhcnJpZXIKKyAqIDE6IHBlMTB0X3NxZV9lcnJvcgorICogMDogcGUxMHRfamFiYmVyCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgTWFjIFN0YXRpb24gQWRkcmVzcywgUGFydCAxIHJlZyBpbiBtYWMgYWRkcmVzcyBtYXAuCisgKiBsb2NhdGVkIGF0IGFkZHJlc3MgMHg1MDQwCisgKgorICogMzEtMjQ6IE9jdGV0NgorICogMjMtMTY6IE9jdGV0NQorICogMTUtODogT2N0ZXQ0CisgKiA3LTA6IE9jdGV0MworICovCisKKyNkZWZpbmUgRVRfTUFDX1NUQVRJT05fQUREUjFfT0M2X1NISUZUIDI0CisjZGVmaW5lIEVUX01BQ19TVEFUSU9OX0FERFIxX09DNV9TSElGVCAxNgorI2RlZmluZSBFVF9NQUNfU1RBVElPTl9BRERSMV9PQzRfU0hJRlQgOAorCisvKgorICogc3RydWN0dXJlIGZvciBNYWMgU3RhdGlvbiBBZGRyZXNzLCBQYXJ0IDIgcmVnIGluIG1hYyBhZGRyZXNzIG1hcC4KKyAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDUwNDQKKyAqCisgKiAzMS0yNDogT2N0ZXQyCisgKiAyMy0xNjogT2N0ZXQxCisgKiAxNS0wOiByZXNlcnZlZAorICovCisKKyNkZWZpbmUgRVRfTUFDX1NUQVRJT05fQUREUjJfT0MyX1NISUZUIDI0CisjZGVmaW5lIEVUX01BQ19TVEFUSU9OX0FERFIyX09DMV9TSElGVCAxNgorCisvKgorICogTUFDIE1vZHVsZSBvZiBKQUdDb3JlIEFkZHJlc3MgTWFwcGluZworICovCitzdHJ1Y3QgbWFjX3JlZ3MgewkJCQkJLyogTG9jYXRpb246ICovCisJdTMyIGNmZzE7CQkJCQkvKiAgMHg1MDAwICovCisJdTMyIGNmZzI7CQkJCQkvKiAgMHg1MDA0ICovCisJdTMyIGlwZzsJCQkJCS8qICAweDUwMDggKi8KKwl1MzIgaGZkcDsJCQkJCS8qICAweDUwMEMgKi8KKwl1MzIgbWF4X2ZtX2xlbjsJCQkJCS8qICAweDUwMTAgKi8KKwl1MzIgcnN2MTsJCQkJCS8qICAweDUwMTQgKi8KKwl1MzIgcnN2MjsJCQkJCS8qICAweDUwMTggKi8KKwl1MzIgbWFjX3Rlc3Q7CQkJCQkvKiAgMHg1MDFDICovCisJdTMyIG1paV9tZ210X2NmZzsJCQkJLyogIDB4NTAyMCAqLworCXUzMiBtaWlfbWdtdF9jbWQ7CQkJCS8qICAweDUwMjQgKi8KKwl1MzIgbWlpX21nbXRfYWRkcjsJCQkJLyogIDB4NTAyOCAqLworCXUzMiBtaWlfbWdtdF9jdHJsOwkJCQkvKiAgMHg1MDJDICovCisJdTMyIG1paV9tZ210X3N0YXQ7CQkJCS8qICAweDUwMzAgKi8KKwl1MzIgbWlpX21nbXRfaW5kaWNhdG9yOwkJCQkvKiAgMHg1MDM0ICovCisJdTMyIGlmX2N0cmw7CQkJCQkvKiAgMHg1MDM4ICovCisJdTMyIGlmX3N0YXQ7CQkJCQkvKiAgMHg1MDNDICovCisJdTMyIHN0YXRpb25fYWRkcl8xOwkJCQkvKiAgMHg1MDQwICovCisJdTMyIHN0YXRpb25fYWRkcl8yOwkJCQkvKiAgMHg1MDQ0ICovCit9OworCisvKiBFTkQgT0YgTUFDIFJFR0lTVEVSIEFERFJFU1MgTUFQICovCisKKy8qIFNUQVJUIE9GIE1BQyBTVEFUIFJFR0lTVEVSIEFERFJFU1MgTUFQICovCisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIENhcnJ5IFJlZ2lzdGVyIE9uZSBhbmQgaXQncyBNYXNrIFJlZ2lzdGVyIHJlZyBsb2NhdGVkIGluIG1hYworICogc3RhdCBhZGRyZXNzIG1hcCBhZGRyZXNzIDB4NjEzMCBhbmQgMHg2MTM4LgorICoKKyAqIDMxOiB0cjY0CisgKiAzMDogdHIxMjcKKyAqIDI5OiB0cjI1NQorICogMjg6IHRyNTExCisgKiAyNzogdHIxaworICogMjY6IHRybWF4CisgKiAyNTogdHJtZ3YKKyAqIDI0LTE3OiB1bnVzZWQKKyAqIDE2OiByYnl0CisgKiAxNTogcnBrdAorICogMTQ6IHJmY3MKKyAqIDEzOiBybWNhCisgKiAxMjogcmJjYQorICogMTE6IHJ4Y2YKKyAqIDEwOiByeHBmCisgKiA5OiByeHVvCisgKiA4OiByYWxuCisgKiA3OiByZmxyCisgKiA2OiByY2RlCisgKiA1OiByY3NlCisgKiA0OiBydW5kCisgKiAzOiByb3ZyCisgKiAyOiByZnJnCisgKiAxOiByamJyCisgKiAwOiByZHJwCisgKi8KKworLyoKKyAqIHN0cnVjdHVyZSBmb3IgQ2FycnkgUmVnaXN0ZXIgVHdvIE1hc2sgUmVnaXN0ZXIgcmVnIGluIG1hYyBzdGF0IGFkZHJlc3MgbWFwLgorICogbG9jYXRlZCBhdCBhZGRyZXNzIDB4NjEzQworICoKKyAqIDMxLTIwOiB1bnVzZWQKKyAqIDE5OiB0amJyCisgKiAxODogdGZjcworICogMTc6IHR4Y2YKKyAqIDE2OiB0b3ZyCisgKiAxNTogdHVuZAorICogMTQ6IHRyZmcKKyAqIDEzOiB0Ynl0CisgKiAxMjogdHBrdAorICogMTE6IHRtY2EKKyAqIDEwOiB0YmNhCisgKiA5OiB0eHBmCisgKiA4OiB0ZGZyCisgKiA3OiB0ZWRmCisgKiA2OiB0c2NsCisgKiA1OiB0bWNsCisgKiA0OiB0bGNsCisgKiAzOiB0eGNsCisgKiAyOiB0bmNsCisgKiAxOiB0cGZoCisgKiAwOiB0ZHJwCisgKi8KKworLyoKKyAqIE1BQyBTVEFUUyBNb2R1bGUgb2YgSkFHQ29yZSBBZGRyZXNzIE1hcHBpbmcKKyAqLworc3RydWN0IG1hY3N0YXRfcmVncyB7CQkJLyogTG9jYXRpb246ICovCisJdTMyIHBhZFszMl07CQkJLyogIDB4NjAwMCAtIDYwN0MgKi8KKworCS8qIFR4L1J4IDAtNjQgQnl0ZSBGcmFtZSBDb3VudGVyICovCisJdTMyIHR4cnhfMF82NF9ieXRlX2ZyYW1lczsJLyogIDB4NjA4MCAqLworCisJLyogVHgvUnggNjUtMTI3IEJ5dGUgRnJhbWUgQ291bnRlciAqLworCXUzMiB0eHJ4XzY1XzEyN19ieXRlX2ZyYW1lczsJLyogIDB4NjA4NCAqLworCisJLyogVHgvUnggMTI4LTI1NSBCeXRlIEZyYW1lIENvdW50ZXIgKi8KKwl1MzIgdHhyeF8xMjhfMjU1X2J5dGVfZnJhbWVzOwkvKiAgMHg2MDg4ICovCisKKwkvKiBUeC9SeCAyNTYtNTExIEJ5dGUgRnJhbWUgQ291bnRlciAqLworCXUzMiB0eHJ4XzI1Nl81MTFfYnl0ZV9mcmFtZXM7CS8qICAweDYwOEMgKi8KKworCS8qIFR4L1J4IDUxMi0xMDIzIEJ5dGUgRnJhbWUgQ291bnRlciAqLworCXUzMiB0eHJ4XzUxMl8xMDIzX2J5dGVfZnJhbWVzOwkvKiAgMHg2MDkwICovCisKKwkvKiBUeC9SeCAxMDI0LTE1MTggQnl0ZSBGcmFtZSBDb3VudGVyICovCisJdTMyIHR4cnhfMTAyNF8xNTE4X2J5dGVfZnJhbWVzOwkvKiAgMHg2MDk0ICovCisKKwkvKiBUeC9SeCAxNTE5LTE1MjIgQnl0ZSBHb29kIFZMQU4gRnJhbWUgQ291bnQgKi8KKwl1MzIgdHhyeF8xNTE5XzE1MjJfZ3Zsbl9mcmFtZXM7CS8qICAweDYwOTggKi8KKworCS8qIFJ4IEJ5dGUgQ291bnRlciAqLworCXUzMiByeF9ieXRlczsJCQkvKiAgMHg2MDlDICovCisKKwkvKiBSeCBQYWNrZXQgQ291bnRlciAqLworCXUzMiByeF9wYWNrZXRzOwkJCS8qICAweDYwQTAgKi8KKworCS8qIFJ4IEZDUyBFcnJvciBDb3VudGVyICovCisJdTMyIHJ4X2Zjc19lcnJzOwkJLyogIDB4NjBBNCAqLworCisJLyogUnggTXVsdGljYXN0IFBhY2tldCBDb3VudGVyICovCisJdTMyIHJ4X211bHRpY2FzdF9wYWNrZXRzOwkvKiAgMHg2MEE4ICovCisKKwkvKiBSeCBCcm9hZGNhc3QgUGFja2V0IENvdW50ZXIgKi8KKwl1MzIgcnhfYnJvYWRjYXN0X3BhY2tldHM7CS8qICAweDYwQUMgKi8KKworCS8qIFJ4IENvbnRyb2wgRnJhbWUgUGFja2V0IENvdW50ZXIgKi8KKwl1MzIgcnhfY29udHJvbF9mcmFtZXM7CQkvKiAgMHg2MEIwICovCisKKwkvKiBSeCBQYXVzZSBGcmFtZSBQYWNrZXQgQ291bnRlciAqLworCXUzMiByeF9wYXVzZV9mcmFtZXM7CQkvKiAgMHg2MEI0ICovCisKKwkvKiBSeCBVbmtub3duIE9QIENvZGUgQ291bnRlciAqLworCXUzMiByeF91bmtub3duX29wY29kZXM7CQkvKiAgMHg2MEI4ICovCisKKwkvKiBSeCBBbGlnbm1lbnQgRXJyb3IgQ291bnRlciAqLworCXUzMiByeF9hbGlnbl9lcnJzOwkJLyogIDB4NjBCQyAqLworCisJLyogUnggRnJhbWUgTGVuZ3RoIEVycm9yIENvdW50ZXIgKi8KKwl1MzIgcnhfZnJhbWVfbGVuX2VycnM7CQkvKiAgMHg2MEMwICovCisKKwkvKiBSeCBDb2RlIEVycm9yIENvdW50ZXIgKi8KKwl1MzIgcnhfY29kZV9lcnJzOwkJLyogIDB4NjBDNCAqLworCisJLyogUnggQ2FycmllciBTZW5zZSBFcnJvciBDb3VudGVyICovCisJdTMyIHJ4X2NhcnJpZXJfc2Vuc2VfZXJyczsJLyogIDB4NjBDOCAqLworCisJLyogUnggVW5kZXJzaXplIFBhY2tldCBDb3VudGVyICovCisJdTMyIHJ4X3VuZGVyc2l6ZV9wYWNrZXRzOwkvKiAgMHg2MENDICovCisKKwkvKiBSeCBPdmVyc2l6ZSBQYWNrZXQgQ291bnRlciAqLworCXUzMiByeF9vdmVyc2l6ZV9wYWNrZXRzOwkvKiAgMHg2MEQwICovCisKKwkvKiBSeCBGcmFnbWVudCBDb3VudGVyICovCisJdTMyIHJ4X2ZyYWdtZW50X3BhY2tldHM7CS8qICAweDYwRDQgKi8KKworCS8qIFJ4IEphYmJlciBDb3VudGVyICovCisJdTMyIHJ4X2phYmJlcnM7CQkJLyogIDB4NjBEOCAqLworCisJLyogUnggRHJvcCAqLworCXUzMiByeF9kcm9wczsJCQkvKiAgMHg2MERDICovCisKKwkvKiBUeCBCeXRlIENvdW50ZXIgKi8KKwl1MzIgdHhfYnl0ZXM7CQkJLyogIDB4NjBFMCAqLworCisJLyogVHggUGFja2V0IENvdW50ZXIgKi8KKwl1MzIgdHhfcGFja2V0czsJCQkvKiAgMHg2MEU0ICovCisKKwkvKiBUeCBNdWx0aWNhc3QgUGFja2V0IENvdW50ZXIgKi8KKwl1MzIgdHhfbXVsdGljYXN0X3BhY2tldHM7CS8qICAweDYwRTggKi8KKworCS8qIFR4IEJyb2FkY2FzdCBQYWNrZXQgQ291bnRlciAqLworCXUzMiB0eF9icm9hZGNhc3RfcGFja2V0czsJLyogIDB4NjBFQyAqLworCisJLyogVHggUGF1c2UgQ29udHJvbCBGcmFtZSBDb3VudGVyICovCisJdTMyIHR4X3BhdXNlX2ZyYW1lczsJCS8qICAweDYwRjAgKi8KKworCS8qIFR4IERlZmVycmFsIFBhY2tldCBDb3VudGVyICovCisJdTMyIHR4X2RlZmVycmVkOwkJLyogIDB4NjBGNCAqLworCisJLyogVHggRXhjZXNzaXZlIERlZmVycmFsIFBhY2tldCBDb3VudGVyICovCisJdTMyIHR4X2V4Y2Vzc2l2ZV9kZWZlcnJlZDsJLyogIDB4NjBGOCAqLworCisJLyogVHggU2luZ2xlIENvbGxpc2lvbiBQYWNrZXQgQ291bnRlciAqLworCXUzMiB0eF9zaW5nbGVfY29sbGlzaW9uczsJLyogIDB4NjBGQyAqLworCisJLyogVHggTXVsdGlwbGUgQ29sbGlzaW9uIFBhY2tldCBDb3VudGVyICovCisJdTMyIHR4X211bHRpcGxlX2NvbGxpc2lvbnM7CS8qICAweDYxMDAgKi8KKworCS8qIFR4IExhdGUgQ29sbGlzaW9uIFBhY2tldCBDb3VudGVyICovCisJdTMyIHR4X2xhdGVfY29sbGlzaW9uczsJCS8qICAweDYxMDQgKi8KKworCS8qIFR4IEV4Y2Vzc2l2ZSBDb2xsaXNpb24gUGFja2V0IENvdW50ZXIgKi8KKwl1MzIgdHhfZXhjZXNzaXZlX2NvbGxpc2lvbnM7CS8qICAweDYxMDggKi8KKworCS8qIFR4IFRvdGFsIENvbGxpc2lvbiBQYWNrZXQgQ291bnRlciAqLworCXUzMiB0eF90b3RhbF9jb2xsaXNpb25zOwkvKiAgMHg2MTBDICovCisKKwkvKiBUeCBQYXVzZSBGcmFtZSBIb25vcmVkIENvdW50ZXIgKi8KKwl1MzIgdHhfcGF1c2VfaG9ub3JlZF9mcmFtZXM7CS8qICAweDYxMTAgKi8KKworCS8qIFR4IERyb3AgRnJhbWUgQ291bnRlciAqLworCXUzMiB0eF9kcm9wczsJCQkvKiAgMHg2MTE0ICovCisKKwkvKiBUeCBKYWJiZXIgRnJhbWUgQ291bnRlciAqLworCXUzMiB0eF9qYWJiZXJzOwkJCS8qICAweDYxMTggKi8KKworCS8qIFR4IEZDUyBFcnJvciBDb3VudGVyICovCisJdTMyIHR4X2Zjc19lcnJzOwkJLyogIDB4NjExQyAqLworCisJLyogVHggQ29udHJvbCBGcmFtZSBDb3VudGVyICovCisJdTMyIHR4X2NvbnRyb2xfZnJhbWVzOwkJLyogIDB4NjEyMCAqLworCisJLyogVHggT3ZlcnNpemUgRnJhbWUgQ291bnRlciAqLworCXUzMiB0eF9vdmVyc2l6ZV9mcmFtZXM7CQkvKiAgMHg2MTI0ICovCisKKwkvKiBUeCBVbmRlcnNpemUgRnJhbWUgQ291bnRlciAqLworCXUzMiB0eF91bmRlcnNpemVfZnJhbWVzOwkvKiAgMHg2MTI4ICovCisKKwkvKiBUeCBGcmFnbWVudHMgRnJhbWUgQ291bnRlciAqLworCXUzMiB0eF9mcmFnbWVudHM7CQkvKiAgMHg2MTJDICovCisKKwkvKiBDYXJyeSBSZWdpc3RlciBPbmUgUmVnaXN0ZXIgKi8KKwl1MzIgY2FycnlfcmVnMTsJCQkvKiAgMHg2MTMwICovCisKKwkvKiBDYXJyeSBSZWdpc3RlciBUd28gUmVnaXN0ZXIgKi8KKwl1MzIgY2FycnlfcmVnMjsJCQkvKiAgMHg2MTM0ICovCisKKwkvKiBDYXJyeSBSZWdpc3RlciBPbmUgTWFzayBSZWdpc3RlciAqLworCXUzMiBjYXJyeV9yZWcxX21hc2s7CQkvKiAgMHg2MTM4ICovCisKKwkvKiBDYXJyeSBSZWdpc3RlciBUd28gTWFzayBSZWdpc3RlciAqLworCXUzMiBjYXJyeV9yZWcyX21hc2s7CQkvKiAgMHg2MTNDICovCit9OworCisvKiBFTkQgT0YgTUFDIFNUQVQgUkVHSVNURVIgQUREUkVTUyBNQVAgKi8KKworLyogU1RBUlQgT0YgTU1DIFJFR0lTVEVSIEFERFJFU1MgTUFQICovCisKKy8qCisgKiBNYWluIE1lbW9yeSBDb250cm9sbGVyIENvbnRyb2wgcmVnIGluIG1tYyBhZGRyZXNzIG1hcC4KKyAqIGxvY2F0ZWQgYXQgYWRkcmVzcyAweDcwMDAKKyAqLworCisjZGVmaW5lIEVUX01NQ19FTkFCTEUJCTEKKyNkZWZpbmUgRVRfTU1DX0FSQl9ESVNBQkxFCTIKKyNkZWZpbmUgRVRfTU1DX1JYTUFDX0RJU0FCTEUJNAorI2RlZmluZSBFVF9NTUNfVFhNQUNfRElTQUJMRQk4CisjZGVmaW5lIEVUX01NQ19UWERNQV9ESVNBQkxFCTE2CisjZGVmaW5lIEVUX01NQ19SWERNQV9ESVNBQkxFCTMyCisjZGVmaW5lIEVUX01NQ19GT1JDRV9DRQkJNjQKKworLyoKKyAqIE1haW4gTWVtb3J5IENvbnRyb2xsZXIgSG9zdCBNZW1vcnkgQWNjZXNzIEFkZHJlc3MgcmVnIGluIG1tYworICogYWRkcmVzcyBtYXAuICBMb2NhdGVkIGF0IGFkZHJlc3MgMHg3MDA0LiBUb3AgMTYgYml0cyBob2xkIHRoZSBhZGRyZXNzIGJpdHMKKyAqLworCisjZGVmaW5lIEVUX1NSQU1fUkVRX0FDQ0VTUwkxCisjZGVmaW5lIEVUX1NSQU1fV1JfQUNDRVNTCTIKKyNkZWZpbmUgRVRfU1JBTV9JU19DVFJMCQk0CisKKy8qCisgKiBzdHJ1Y3R1cmUgZm9yIE1haW4gTWVtb3J5IENvbnRyb2xsZXIgSG9zdCBNZW1vcnkgQWNjZXNzIERhdGEgcmVnIGluIG1tYworICogYWRkcmVzcyBtYXAuICBMb2NhdGVkIGF0IGFkZHJlc3MgMHg3MDA4IC0gMHg3MDE0CisgKiBEZWZpbmVkIGVhcmxpZXIgKHUzMikKKyAqLworCisvKgorICogTWVtb3J5IENvbnRyb2wgTW9kdWxlIG9mIEpBR0NvcmUgQWRkcmVzcyBNYXBwaW5nCisgKi8KK3N0cnVjdCBtbWNfcmVncyB7CQkvKiBMb2NhdGlvbjogKi8KKwl1MzIgbW1jX2N0cmw7CQkvKiAgMHg3MDAwICovCisJdTMyIHNyYW1fYWNjZXNzOwkvKiAgMHg3MDA0ICovCisJdTMyIHNyYW1fd29yZDE7CQkvKiAgMHg3MDA4ICovCisJdTMyIHNyYW1fd29yZDI7CQkvKiAgMHg3MDBDICovCisJdTMyIHNyYW1fd29yZDM7CQkvKiAgMHg3MDEwICovCisJdTMyIHNyYW1fd29yZDQ7CQkvKiAgMHg3MDE0ICovCit9OworCisvKiBFTkQgT0YgTU1DIFJFR0lTVEVSIEFERFJFU1MgTUFQICovCisKKworLyoKKyAqIEpBR0NvcmUgQWRkcmVzcyBNYXBwaW5nCisgKi8KK3N0cnVjdCBhZGRyZXNzX21hcCB7CisJc3RydWN0IGdsb2JhbF9yZWdzIGdsb2JhbDsKKwkvKiB1bnVzZWQgc2VjdGlvbiBvZiBnbG9iYWwgYWRkcmVzcyBtYXAgKi8KKwl1OCB1bnVzZWRfZ2xvYmFsWzQwOTYgLSBzaXplb2Yoc3RydWN0IGdsb2JhbF9yZWdzKV07CisJc3RydWN0IHR4ZG1hX3JlZ3MgdHhkbWE7CisJLyogdW51c2VkIHNlY3Rpb24gb2YgdHhkbWEgYWRkcmVzcyBtYXAgKi8KKwl1OCB1bnVzZWRfdHhkbWFbNDA5NiAtIHNpemVvZihzdHJ1Y3QgdHhkbWFfcmVncyldOworCXN0cnVjdCByeGRtYV9yZWdzIHJ4ZG1hOworCS8qIHVudXNlZCBzZWN0aW9uIG9mIHJ4ZG1hIGFkZHJlc3MgbWFwICovCisJdTggdW51c2VkX3J4ZG1hWzQwOTYgLSBzaXplb2Yoc3RydWN0IHJ4ZG1hX3JlZ3MpXTsKKwlzdHJ1Y3QgdHhtYWNfcmVncyB0eG1hYzsKKwkvKiB1bnVzZWQgc2VjdGlvbiBvZiB0eG1hYyBhZGRyZXNzIG1hcCAqLworCXU4IHVudXNlZF90eG1hY1s0MDk2IC0gc2l6ZW9mKHN0cnVjdCB0eG1hY19yZWdzKV07CisJc3RydWN0IHJ4bWFjX3JlZ3MgcnhtYWM7CisJLyogdW51c2VkIHNlY3Rpb24gb2YgcnhtYWMgYWRkcmVzcyBtYXAgKi8KKwl1OCB1bnVzZWRfcnhtYWNbNDA5NiAtIHNpemVvZihzdHJ1Y3QgcnhtYWNfcmVncyldOworCXN0cnVjdCBtYWNfcmVncyBtYWM7CisJLyogdW51c2VkIHNlY3Rpb24gb2YgbWFjIGFkZHJlc3MgbWFwICovCisJdTggdW51c2VkX21hY1s0MDk2IC0gc2l6ZW9mKHN0cnVjdCBtYWNfcmVncyldOworCXN0cnVjdCBtYWNzdGF0X3JlZ3MgbWFjc3RhdDsKKwkvKiB1bnVzZWQgc2VjdGlvbiBvZiBtYWMgc3RhdCBhZGRyZXNzIG1hcCAqLworCXU4IHVudXNlZF9tYWNfc3RhdFs0MDk2IC0gc2l6ZW9mKHN0cnVjdCBtYWNzdGF0X3JlZ3MpXTsKKwlzdHJ1Y3QgbW1jX3JlZ3MgbW1jOworCS8qIHVudXNlZCBzZWN0aW9uIG9mIG1tYyBhZGRyZXNzIG1hcCAqLworCXU4IHVudXNlZF9tbWNbNDA5NiAtIHNpemVvZihzdHJ1Y3QgbW1jX3JlZ3MpXTsKKwkvKiB1bnVzZWQgc2VjdGlvbiBvZiBhZGRyZXNzIG1hcCAqLworCXU4IHVudXNlZF9bMTAxNTgwOF07CisKKwl1OCB1bnVzZWRfZXhwX3JvbVs0MDk2XTsJLyogTUdTLXNpemUgVEJEICovCisJdTggdW51c2VkX19bNTI0Mjg4XTsJLyogdW51c2VkIHNlY3Rpb24gb2YgYWRkcmVzcyBtYXAgKi8KK307CisKKy8qCisgKiBEZWZpbmVzIGZvciBnZW5lcmljIE1JSSByZWdpc3RlcnMgMHgwMCAtPiAweDBGIGNhbiBiZSBmb3VuZCBpbgorICogaW5jbHVkZS9saW51eC9taWkuaAorICovCisKKy8qIHNvbWUgZGVmaW5lcyBmb3IgbW9kZW0gcmVnaXN0ZXJzIHRoYXQgc2VlbSB0byBiZSAncmVzZXJ2ZWQnICovCisjZGVmaW5lIFBIWV9JTkRFWF9SRUcgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgUEhZX0RBVEFfUkVHICAgICAgICAgICAgICAgMHgxMQorI2RlZmluZSBQSFlfTVBIWV9DT05UUk9MX1JFRyAgICAgICAweDEyCisKKy8qIGRlZmluZXMgZm9yIHNwZWNpZmllZCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgUEhZX0xPT1BCQUNLX0NPTlRST0wgICAgICAgMHgxMwkvKiBUUlVfVk1JX0xPT1BCQUNLX0NPTlRST0xfMV9SRUcgMTkgKi8KKwkJCQkJLyogVFJVX1ZNSV9MT09QQkFDS19DT05UUk9MXzJfUkVHIDIwICovCisjZGVmaW5lIFBIWV9SRUdJU1RFUl9NR01UX0NPTlRST0wgIDB4MTUJLyogVFJVX1ZNSV9NSV9TRVFfQ09OVFJPTF9SRUcgICAgIDIxICovCisjZGVmaW5lIFBIWV9DT05GSUcgICAgICAgICAgICAgICAgIDB4MTYJLyogVFJVX1ZNSV9DT05GSUdVUkFUSU9OX1JFRyAgICAgIDIyICovCisjZGVmaW5lIFBIWV9QSFlfQ09OVFJPTCAgICAgICAgICAgIDB4MTcJLyogVFJVX1ZNSV9QSFlfQ09OVFJPTF9SRUcgICAgICAgIDIzICovCisjZGVmaW5lIFBIWV9JTlRFUlJVUFRfTUFTSyAgICAgICAgIDB4MTgJLyogVFJVX1ZNSV9JTlRFUlJVUFRfTUFTS19SRUcgICAgIDI0ICovCisjZGVmaW5lIFBIWV9JTlRFUlJVUFRfU1RBVFVTICAgICAgIDB4MTkJLyogVFJVX1ZNSV9JTlRFUlJVUFRfU1RBVFVTX1JFRyAgIDI1ICovCisjZGVmaW5lIFBIWV9QSFlfU1RBVFVTICAgICAgICAgICAgIDB4MUEJLyogVFJVX1ZNSV9QSFlfU1RBVFVTX1JFRyAgICAgICAgIDI2ICovCisjZGVmaW5lIFBIWV9MRURfMSAgICAgICAgICAgICAgICAgIDB4MUIJLyogVFJVX1ZNSV9MRURfQ09OVFJPTF8xX1JFRyAgICAgIDI3ICovCisjZGVmaW5lIFBIWV9MRURfMiAgICAgICAgICAgICAgICAgIDB4MUMJLyogVFJVX1ZNSV9MRURfQ09OVFJPTF8yX1JFRyAgICAgIDI4ICovCisJCQkJCS8qIFRSVV9WTUlfTElOS19DT05UUk9MX1JFRyAgICAgICAyOSAqLworCQkJCQkvKiBUUlVfVk1JX1RJTUlOR19DT05UUk9MX1JFRyAgICAgICAgKi8KKworLyogTUkgUmVnaXN0ZXIgMTA6IEdpZ2FiaXQgYmFzaWMgbW9kZSBzdGF0dXMgcmVnKFJlZyAweDBBKSAqLworI2RlZmluZSBFVF8xMDAwQlRfTVNUUl9TTFYgMHg0MDAwCisKKy8qIE1JIFJlZ2lzdGVyIDE2IC0gMTg6IFJlc2VydmVkIFJlZygweDEwLTB4MTIpICovCisKKy8qIE1JIFJlZ2lzdGVyIDE5OiBMb29wYmFjayBDb250cm9sIFJlZygweDEzKQorICoJMTU6CW1paV9lbgorICoJMTQ6CXBjc19lbgorICoJMTM6CXBtZF9lbgorICoJMTI6CWFsbF9kaWdpdGFsX2VuCisgKgkxMToJcmVwbGljYV9lbgorICoJMTA6CWxpbmVfZHJpdmVyX2VuCisgKgk5LTA6CXJlc2VydmVkCisgKi8KKworLyogTUkgUmVnaXN0ZXIgMjA6IFJlc2VydmVkIFJlZygweDE0KSAqLworCisvKiBNSSBSZWdpc3RlciAyMTogTWFuYWdlbWVudCBJbnRlcmZhY2UgQ29udHJvbCBSZWcoMHgxNSkKKyAqCTE1LTExOglyZXNlcnZlZAorICoJMTAtNDoJbWlfZXJyb3JfY291bnQKKyAqCTM6CXJlc2VydmVkCisgKgkyOglpZ25vcmVfMTBnX2ZyCisgKgkxOglyZXNlcnZlZAorICoJMDoJcHJlYW1ibGVfc3VwcmVzc19lbgorICovCisKKy8qIE1JIFJlZ2lzdGVyIDIyOiBQSFkgQ29uZmlndXJhdGlvbiBSZWcoMHgxNikKKyAqCTE1OgljcnNfdHhfZW4KKyAqCTE0OglyZXNlcnZlZAorICoJMTMtMTI6CXR4X2ZpZm9fZGVwdGgKKyAqCTExLTEwOglzcGVlZF9kb3duc2hpZnQKKyAqCTk6CXBiaV9kZXRlY3QKKyAqCTg6CXRiaV9yYXRlCisgKgk3OglhbHRlcm5hdGVfbnAKKyAqCTY6CWdyb3VwX21kaW9fZW4KKyAqCTU6CXR4X2Nsb2NrX2VuCisgKgk0OglzeXNfY2xvY2tfZW4KKyAqCTM6CXJlc2VydmVkCisgKgkyLTA6CW1hY19pZl9tb2RlCisgKi8KKworI2RlZmluZSBFVF9QSFlfQ09ORklHX1RYX0ZJRk9fREVQVEgJMHgzMDAwCisKKyNkZWZpbmUgRVRfUEhZX0NPTkZJR19GSUZPX0RFUFRIXzgJMHgwMDAwCisjZGVmaW5lIEVUX1BIWV9DT05GSUdfRklGT19ERVBUSF8xNgkweDEwMDAKKyNkZWZpbmUgRVRfUEhZX0NPTkZJR19GSUZPX0RFUFRIXzMyCTB4MjAwMAorI2RlZmluZSBFVF9QSFlfQ09ORklHX0ZJRk9fREVQVEhfNjQJMHgzMDAwCisKKy8qIE1JIFJlZ2lzdGVyIDIzOiBQSFkgQ09OVFJPTCBSZWcoMHgxNykKKyAqCTE1OglyZXNlcnZlZAorICoJMTQ6CXRkcl9lbgorICoJMTM6CXJlc2VydmVkCisgKgkxMi0xMToJZG93bnNoaWZ0X2F0dGVtcHRzCisgKgkxMC02OglyZXNlcnZlZAorICoJNToJamFiYmVyXzEwYmFzZVQKKyAqCTQ6CXNxZV8xMGJhc2VUCisgKgkzOgl0cF9sb29wYmFja18xMGJhc2VUCisgKgkyOglwcmVhbWJsZV9nZW5fZW4KKyAqCTE6CXJlc2VydmVkCisgKgkwOglmb3JjZV9pbnQKKyAqLworCisvKiBNSSBSZWdpc3RlciAyNDogSW50ZXJydXB0IE1hc2sgUmVnKDB4MTgpCisgKgkxNS0xMDoJcmVzZXJ2ZWQKKyAqCTk6CW1kaW9fc3luY19sb3N0CisgKgk4OglhdXRvbmVnX3N0YXR1cworICoJNzoJaGlfYml0X2VycgorICoJNjoJbnBfcngKKyAqCTU6CWVycl9jb3VudGVyX2Z1bGwKKyAqCTQ6CWZpZm9fb3Zlcl91bmRlcmZsb3cKKyAqCTM6CXJ4X3N0YXR1cworICoJMjoJbGlua19zdGF0dXMKKyAqCTE6CWF1dG9tYXRpY19zcGVlZAorICoJMDoJaW50X2VuCisgKi8KKworI2RlZmluZSBFVF9QSFlfSU5UX01BU0tfQVVUT05FR1NUQVQJMHgwMTAwCisjZGVmaW5lIEVUX1BIWV9JTlRfTUFTS19MSU5LU1RBVAkweDAwMDQKKyNkZWZpbmUgRVRfUEhZX0lOVF9NQVNLX0VOQUJMRQkJMHgwMDAxCisKKy8qIE1JIFJlZ2lzdGVyIDI1OiBJbnRlcnJ1cHQgU3RhdHVzIFJlZygweDE5KQorICoJMTUtMTA6CXJlc2VydmVkCisgKgk5OgltZGlvX3N5bmNfbG9zdAorICoJODoJYXV0b25lZ19zdGF0dXMKKyAqCTc6CWhpX2JpdF9lcnIKKyAqCTY6CW5wX3J4CisgKgk1OgllcnJfY291bnRlcl9mdWxsCisgKgk0OglmaWZvX292ZXJfdW5kZXJmbG93CisgKgkzOglyeF9zdGF0dXMKKyAqCTI6CWxpbmtfc3RhdHVzCisgKgkxOglhdXRvbWF0aWNfc3BlZWQKKyAqCTA6CWludF9lbgorICovCisKKy8qIE1JIFJlZ2lzdGVyIDI2OiBQSFkgU3RhdHVzIFJlZygweDFBKQorICoJMTU6CXJlc2VydmVkCisgKgkxNC0xMzoJYXV0b25lZ19mYXVsdAorICoJMTI6CWF1dG9uZWdfc3RhdHVzCisgKgkxMToJbWRpX3hfc3RhdHVzCisgKgkxMDoJcG9sYXJpdHlfc3RhdHVzCisgKgk5LTg6CXNwZWVkX3N0YXR1cworICoJNzoJZHVwbGV4X3N0YXR1cworICoJNjoJbGlua19zdGF0dXMKKyAqCTU6CXR4X3N0YXR1cworICoJNDoJcnhfc3RhdHVzCisgKgkzOgljb2xsaXNpb25fc3RhdHVzCisgKgkyOglhdXRvbmVnX2VuCisgKgkxOglwYXVzZV9lbgorICoJMDoJYXN5bW1ldHJpY19kaXIKKyAqLworI2RlZmluZSBFVF9QSFlfQVVUT05FR19TVEFUVVMJMHgxMDAwCisjZGVmaW5lIEVUX1BIWV9QT0xBUklUWV9TVEFUVVMJMHgwNDAwCisjZGVmaW5lIEVUX1BIWV9TUEVFRF9TVEFUVVMJMHgwMzAwCisjZGVmaW5lIEVUX1BIWV9EVVBMRVhfU1RBVFVTCTB4MDA4MAorI2RlZmluZSBFVF9QSFlfTFNUQVRVUwkJMHgwMDQwCisjZGVmaW5lIEVUX1BIWV9BVVRPTkVHX0VOQUJMRQkweDAwMjAKKworLyogTUkgUmVnaXN0ZXIgMjc6IExFRCBDb250cm9sIFJlZyAxKDB4MUIpCisgKgkxNS0xNDoJcmVzZXJ2ZWQKKyAqCTEzLTEyOglsZWRfZHVwX2luZGljYXRlCisgKgkxMS0xMDoJbGVkXzEwYmFzZVQKKyAqCTktODoJbGVkX2NvbGxpc2lvbgorICoJNy00OglyZXNlcnZlZAorICoJMy0yOglwdWxzZV9kdXIKKyAqCTE6CXB1bHNlX3N0cmV0Y2gxCisgKgkwOglwdWxzZV9zdHJldGNoMAorICovCisKKy8qIE1JIFJlZ2lzdGVyIDI4OiBMRUQgQ29udHJvbCBSZWcgMigweDFDKQorICoJMTUtMTI6CWxlZF9saW5rCisgKgkxMS04OglsZWRfdHhfcngKKyAqCTctNDoJbGVkXzEwMEJhc2VUWAorICoJMy0wOglsZWRfMTAwMEJhc2VUCisgKi8KKyNkZWZpbmUgRVRfTEVEMl9MRURfTElOSwkweEYwMDAKKyNkZWZpbmUgRVRfTEVEMl9MRURfVFhSWAkweDBGMDAKKyNkZWZpbmUgRVRfTEVEMl9MRURfMTAwVFgJMHgwMEYwCisjZGVmaW5lIEVUX0xFRDJfTEVEXzEwMDBUCTB4MDAwRgorCisvKiBkZWZpbmVzIGZvciBMRUQgY29udHJvbCByZWcgMiB2YWx1ZXMgKi8KKyNkZWZpbmUgTEVEX1ZBTF8xMDAwQlQJCQkweDAKKyNkZWZpbmUgTEVEX1ZBTF8xMDBCVFgJCQkweDEKKyNkZWZpbmUgTEVEX1ZBTF8xMEJUCQkJMHgyCisjZGVmaW5lIExFRF9WQUxfMTAwMEJUXzEwMEJUWAkJMHgzIC8qIDEwMDBCVCBvbiwgMTAwQlRYIGJsaW5rICovCisjZGVmaW5lIExFRF9WQUxfTElOS09OCQkJMHg0CisjZGVmaW5lIExFRF9WQUxfVFgJCQkweDUKKyNkZWZpbmUgTEVEX1ZBTF9SWAkJCTB4NgorI2RlZmluZSBMRURfVkFMX1RYUlgJCQkweDcgLyogVFggb3IgUlggKi8KKyNkZWZpbmUgTEVEX1ZBTF9EVVBMRVhGVUxMCQkweDgKKyNkZWZpbmUgTEVEX1ZBTF9DT0xMSVNJT04JCTB4OQorI2RlZmluZSBMRURfVkFMX0xJTktPTl9BQ1RJVkUJCTB4QSAvKiBMaW5rIG9uLCBhY3Rpdml0eSBibGluayAqLworI2RlZmluZSBMRURfVkFMX0xJTktPTl9SRUNWCQkweEIgLyogTGluayBvbiwgcmVjZWl2ZSBibGluayAqLworI2RlZmluZSBMRURfVkFMX0RVUExFWEZVTExfQ09MTElTSU9OCTB4QyAvKiBEdXBsZXggb24sIGNvbGxpc2lvbiBibGluayAqLworI2RlZmluZSBMRURfVkFMX0JMSU5LCQkJMHhECisjZGVmaW5lIExFRF9WQUxfT04JCQkweEUKKyNkZWZpbmUgTEVEX1ZBTF9PRkYJCQkweEYKKworI2RlZmluZSBMRURfTElOS19TSElGVAkJCTEyCisjZGVmaW5lIExFRF9UWFJYX1NISUZUCQkJOAorI2RlZmluZSBMRURfMTAwVFhfU0hJRlQJCQk0CisKKy8qIE1JIFJlZ2lzdGVyIDI5IC0gMzE6IFJlc2VydmVkIFJlZygweDFEIC0gMHgxRSkgKi8KKworLyogRGVmaW5lcyBmb3IgUEhZIGFjY2VzcyByb3V0aW5lcyAqLworCisvKiBEZWZpbmUgYml0IG9wZXJhdGlvbiBmbGFncyAqLworI2RlZmluZSBUUlVFUEhZX0JJVF9DTEVBUiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVFJVRVBIWV9CSVRfU0VUICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFRSVUVQSFlfQklUX1JFQUQgICAgICAgICAgICAgICAgMgorCisvKiBEZWZpbmUgcmVhZC93cml0ZSBvcGVyYXRpb24gZmxhZ3MgKi8KKyNpZm5kZWYgVFJVRVBIWV9SRUFECisjZGVmaW5lIFRSVUVQSFlfUkVBRCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBUUlVFUEhZX1dSSVRFICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVFJVRVBIWV9NQVNLICAgICAgICAgICAgICAgICAgICAyCisjZW5kaWYKKworLyogRGVmaW5lIG1hc3Rlci9zbGF2ZSBjb25maWd1cmF0aW9uIHZhbHVlcyAqLworI2RlZmluZSBUUlVFUEhZX0NGR19TTEFWRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVFJVRVBIWV9DRkdfTUFTVEVSICAgICAgICAgICAgICAxCisKKy8qIERlZmluZSBNREkvTURJLVggc2V0dGluZ3MgKi8KKyNkZWZpbmUgVFJVRVBIWV9NREkgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFRSVUVQSFlfTURJWCAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBUUlVFUEhZX0FVVE9fTURJX01ESVggICAgICAgICAgIDIKKworLyogRGVmaW5lIDEwQmFzZS1UIGxpbmsgcG9sYXJpdGllcyAqLworI2RlZmluZSBUUlVFUEhZX1BPTEFSSVRZX05PUk1BTCAgICAgICAgIDAKKyNkZWZpbmUgVFJVRVBIWV9QT0xBUklUWV9JTlZFUlRFRCAgICAgICAxCisKKy8qIERlZmluZSBhdXRvLW5lZ290aWF0aW9uIHJlc3VsdHMgKi8KKyNkZWZpbmUgVFJVRVBIWV9BTkVHX05PVF9DT01QTEVURSAgICAgICAwCisjZGVmaW5lIFRSVUVQSFlfQU5FR19DT01QTEVURSAgICAgICAgICAgMQorI2RlZmluZSBUUlVFUEhZX0FORUdfRElTQUJMRUQgICAgICAgICAgIDIKKworLyogRGVmaW5lIGR1cGxleCBhZHZlcnRpc2VtZW50IGZsYWdzICovCisjZGVmaW5lIFRSVUVQSFlfQURWX0RVUExFWF9OT05FICAgICAgICAgMHgwMAorI2RlZmluZSBUUlVFUEhZX0FEVl9EVVBMRVhfRlVMTCAgICAgICAgIDB4MDEKKyNkZWZpbmUgVFJVRVBIWV9BRFZfRFVQTEVYX0hBTEYgICAgICAgICAweDAyCisjZGVmaW5lIFRSVUVQSFlfQURWX0RVUExFWF9CT1RIICAgICBcCisJKFRSVUVQSFlfQURWX0RVUExFWF9GVUxMIHwgVFJVRVBIWV9BRFZfRFVQTEVYX0hBTEYpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2FkYXB0ZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2FkYXB0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4YzUwYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9hZGFwdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoKLSAqIEFnZXJlIFN5c3RlbXMgSW5jLgotICogMTAvMTAwLzEwMDAgQmFzZS1UIEV0aGVybmV0IERyaXZlciBmb3IgdGhlIEVUMTMwMSBhbmQgRVQxMzF4IHNlcmllcyBNQUNzCi0gKgotICogQ29weXJpZ2h0IMKpIDIwMDUgQWdlcmUgU3lzdGVtcyBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogZXQxMzF4X2FkYXB0ZXIuaCAtIEhlYWRlciB3aGljaCBpbmNsdWRlcyB0aGUgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZSwgYWxvbmcKLSAqICAgICAgICAgICAgICAgICAgICB3aXRoIHJlbGF0ZWQgc3VwcG9ydCBzdHJ1Y3R1cmVzLCBtYWNyb3MsIGRlZmluaXRpb25zLCBldGMuCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBTT0ZUV0FSRSBMSUNFTlNFCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCi0gKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCi0gKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCi0gKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCi0gKgotICogQ29weXJpZ2h0IMKpIDIwMDUgQWdlcmUgU3lzdGVtcyBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKgotICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKLSAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCi0gKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KLSAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIERpc2NsYWltZXIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKLSAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKLSAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCi0gKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAotICogREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIF9fRVQxMzFYX0FEQVBURVJfSF9fCi0jZGVmaW5lIF9fRVQxMzFYX0FEQVBURVJfSF9fCi0KLSNpbmNsdWRlICJldDEzMTBfYWRkcmVzc19tYXAuaCIKLSNpbmNsdWRlICJldDEzMTBfdHguaCIKLSNpbmNsdWRlICJldDEzMTBfcnguaCIKLQotLyoKLSAqIERvIG5vdCBjaGFuZ2UgdGhlc2UgdmFsdWVzOiBpZiBjaGFuZ2VkLCB0aGVuIGNoYW5nZSBhbHNvIGluIHJlc3BlY3RpdmUKLSAqIFRYZG1hIGFuZCBSeGRtYSBlbmdpbmVzCi0gKi8KLSNkZWZpbmUgTlVNX0RFU0NfUEVSX1JJTkdfVFggICAgICAgICA1MTIgICAgLyogVFggRG8gbm90IGNoYW5nZSB0aGVzZSB2YWx1ZXMgKi8KLSNkZWZpbmUgTlVNX1RDQiAgICAgICAgICAgICAgICAgICAgICA2NAotCi0vKgotICogVGhlc2UgdmFsdWVzIGFyZSBhbGwgc3VwZXJzZWRlZCBieSByZWdpc3RyeSBlbnRyaWVzIHRvIGZhY2lsaXRhdGUgdHVuaW5nLgotICogT25jZSB0aGUgZGVzaXJlZCBwZXJmb3JtYW5jZSBoYXMgYmVlbiBhY2hpZXZlZCwgdGhlIG9wdGltYWwgcmVnaXN0cnkgdmFsdWVzCi0gKiBzaG91bGQgYmUgcmUtcG9wdWxhdGVkIHRvIHRoZXNlICNkZWZpbmVzOgotICovCi0jZGVmaW5lIE5VTV9UUkFGRklDX0NMQVNTRVMgICAgICAgICAgMQotCi0jZGVmaW5lIFRYX0VSUk9SX1BFUklPRCAgICAgICAgICAgICAxMDAwCi0KLSNkZWZpbmUgTE9fTUFSS19QRVJDRU5UX0ZPUl9QU1IgICAgIDE1Ci0jZGVmaW5lIExPX01BUktfUEVSQ0VOVF9GT1JfUlggICAgICAxNQotCi0vKiBSRkQgKFJlY2VpdmUgRnJhbWUgRGVzY3JpcHRvcikgKi8KLXN0cnVjdCByZmQgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9ub2RlOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JdTMyIGxlbjsJLyogdG90YWwgc2l6ZSBvZiByZWNlaXZlIGZyYW1lICovCi0JdTE2IGJ1ZmZlcmluZGV4OwotCXU4IHJpbmdpbmRleDsKLX07Ci0KLS8qIEZsb3cgQ29udHJvbCAqLwotI2RlZmluZSBGTE9XX0JPVEgJMAotI2RlZmluZSBGTE9XX1RYT05MWQkxCi0jZGVmaW5lIEZMT1dfUlhPTkxZCTIKLSNkZWZpbmUgRkxPV19OT05FCTMKLQotLyogU3RydWN0IHRvIGRlZmluZSBzb21lIGRldmljZSBzdGF0aXN0aWNzICovCi1zdHJ1Y3QgY2Vfc3RhdHMgewotCS8qIE1JQiBJSSB2YXJpYWJsZXMKLQkgKgotCSAqIE5PVEU6IGF0b21pY190IHR5cGVzIGFyZSBvbmx5IGd1YXJhbnRlZWQgdG8gc3RvcmUgMjQtYml0czsgaWYgd2UKLQkgKiBNVVNUIGhhdmUgMzIsIHRoZW4gd2UnbGwgbmVlZCBhbm90aGVyIHdheSB0byBwZXJmb3JtIGF0b21pYwotCSAqIG9wZXJhdGlvbnMKLQkgKi8KLQl1MzIgdW5pcmN2OwkvKiAjIG11bHRpY2FzdCBwYWNrZXRzIHJlY2VpdmVkICovCi0JYXRvbWljX3QgdW5peG10OwkvKiAjIG11bHRpY2FzdCBwYWNrZXRzIGZvciBUeCAqLwotCXUzMiBtdWx0aXJjdjsJLyogIyBtdWx0aWNhc3QgcGFja2V0cyByZWNlaXZlZCAqLwotCWF0b21pY190IG11bHRpeG10OwkvKiAjIG11bHRpY2FzdCBwYWNrZXRzIGZvciBUeCAqLwotCXUzMiBicmRjc3RyY3Y7CS8qICMgYnJvYWRjYXN0IHBhY2tldHMgcmVjZWl2ZWQgKi8KLQlhdG9taWNfdCBicmRjc3R4bXQ7CS8qICMgYnJvYWRjYXN0IHBhY2tldHMgZm9yIFR4ICovCi0JdTMyIG5vcmN2YnVmOwkvKiAjIFJ4IHBhY2tldHMgZGlzY2FyZGVkICovCi0JdTMyIG5veG10YnVmOwkvKiAjIFR4IHBhY2tldHMgZGlzY2FyZGVkICovCi0KLQkvKiBUcmFuc2NlaXZlciBzdGF0ZSBpbmZvcm1hdGlvbnMuICovCi0JdTggeGN2cl9hZGRyOwotCXUzMiB4Y3ZyX2lkOwotCi0JLyogVHggU3RhdGlzdGljcy4gKi8KLQl1MzIgdHhfdWZsbzsJCS8qIFR4IFVuZGVycnVucyAqLwotCi0JdTMyIGNvbGxpc2lvbnM7Ci0JdTMyIGV4Y2Vzc2l2ZV9jb2xsaXNpb25zOwotCXUzMiBmaXJzdF9jb2xsaXNpb247Ci0JdTMyIGxhdGVfY29sbGlzaW9uczsKLQl1MzIgbWF4X3BrdF9lcnJvcjsKLQl1MzIgdHhfZGVmZXJyZWQ7Ci0KLQkvKiBSeCBTdGF0aXN0aWNzLiAqLwotCXUzMiByeF9vdl9mbG93OwkvKiBSeCBPdmVyZmxvdyAqLwotCi0JdTMyIGxlbmd0aF9lcnI7Ci0JdTMyIGFsaWdubWVudF9lcnI7Ci0JdTMyIGNyY19lcnI7Ci0JdTMyIGNvZGVfdmlvbGF0aW9uczsKLQl1MzIgb3RoZXJfZXJyb3JzOwotCi0JdTMyIFN5bmNocm91bm91c0l0ZXJhdGlvbnM7Ci0JdTMyIEludGVycnVwdFN0YXR1czsKLX07Ci0KLQotLyogVGhlIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCBldDEzMXhfYWRhcHRlciB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLQotCXN0cnVjdCB3b3JrX3N0cnVjdCB0YXNrOwotCi0JLyogRmxhZ3MgdGhhdCBpbmRpY2F0ZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBhZGFwdGVyICovCi0JdTMyIGZsYWdzOwotCXUzMiBId0VyckNvdW50OwotCi0JLyogQ29uZmlndXJhdGlvbiAgKi8KLQl1OCByb21fYWRkcltFVEhfQUxFTl07Ci0JdTggYWRkcltFVEhfQUxFTl07Ci0JYm9vbCBoYXNfZWVwcm9tOwotCXU4IGVlcHJvbV9kYXRhWzJdOwotCi0JLyogU3BpbmxvY2tzICovCi0Jc3BpbmxvY2tfdCBMb2NrOwotCi0Jc3BpbmxvY2tfdCBUQ0JTZW5kUUxvY2s7Ci0Jc3BpbmxvY2tfdCBUQ0JSZWFkeVFMb2NrOwotCXNwaW5sb2NrX3Qgc2VuZF9od19sb2NrOwotCi0Jc3BpbmxvY2tfdCByY3ZfbG9jazsKLQlzcGlubG9ja190IFJjdlBlbmRMb2NrOwotCXNwaW5sb2NrX3QgRmJyTG9jazsKLQotCXNwaW5sb2NrX3QgUEhZTG9jazsKLQotCS8qIFBhY2tldCBGaWx0ZXIgYW5kIGxvb2sgYWhlYWQgc2l6ZSAqLwotCXUzMiBQYWNrZXRGaWx0ZXI7Ci0JdTMyIGxpbmtzcGVlZDsKLQl1MzIgZHVwbGV4X21vZGU7Ci0KLQkvKiBtdWx0aWNhc3QgbGlzdCAqLwotCXUzMiBNQ0FkZHJlc3NDb3VudDsKLQl1OCBNQ0xpc3RbTklDX01BWF9NQ0FTVF9MSVNUXVtFVEhfQUxFTl07Ci0KLQkvKiBQb2ludGVyIHRvIHRoZSBkZXZpY2UncyBQQ0kgcmVnaXN0ZXIgc3BhY2UgKi8KLQlzdHJ1Y3QgYWRkcmVzc19tYXAgX19pb21lbSAqcmVnczsKLQotCS8qIFJlZ2lzdHJ5IHBhcmFtZXRlcnMgKi8KLQl1OCBTcGVlZER1cGxleDsJCS8qIHNwZWVkL2R1cGxleCAqLwotCXU4IHdhbnRlZF9mbG93OwkJLyogRmxvdyB3ZSB3YW50IGZvciA4MDIuM3ggZmxvdyBjb250cm9sICovCi0JdTggUmVnaXN0cnlQaHlDb21hOwkvKiBQaHkgQ29tYSBtb2RlIGVuYWJsZS9kaXNhYmxlICovCi0KLQl1MzIgUmVnaXN0cnlSeE1lbUVuZDsJLyogU2l6ZSBvZiBpbnRlcm5hbCByeCBtZW1vcnkgKi8KLQl1MzIgUmVnaXN0cnlKdW1ib1BhY2tldDsJLyogTWF4IHN1cHBvcnRlZCBldGhlcm5ldCBwYWNrZXQgc2l6ZSAqLwotCi0KLQkvKiBEZXJpdmVkIGZyb20gdGhlIHJlZ2lzdHJ5OiAqLwotCXU4IEFpRm9yY2VEcHg7CQkvKiBkdXBsZXggc2V0dGluZyAqLwotCXUxNiBBaUZvcmNlU3BlZWQ7CS8qICdTcGVlZCcsIHVzZXIgb3Zlci1yaWRlIG9mIGxpbmUgc3BlZWQgKi8KLQl1OCBmbG93Y29udHJvbDsJCS8qIGZsb3cgY29udHJvbCB2YWxpZGF0ZWQgYnkgdGhlIGZhci1lbmQgKi8KLQllbnVtIHsKLQkJTkVUSUZfU1RBVFVTX0lOVkFMSUQgPSAwLAotCQlORVRJRl9TVEFUVVNfTUVESUFfQ09OTkVDVCwKLQkJTkVUSUZfU1RBVFVTX01FRElBX0RJU0NPTk5FQ1QsCi0JCU5FVElGX1NUQVRVU19NQVgKLQl9IE1lZGlhU3RhdGU7Ci0KLQkvKiBNaW5pbWl6ZSBpbml0LXRpbWUgKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdCBFcnJvclRpbWVyOwotCi0JLyogdmFyaWFibGUgcHV0dGluZyB0aGUgcGh5IGludG8gY29tYSBtb2RlIHdoZW4gYm9vdCB1cCB3aXRoIG5vIGNhYmxlCi0JICogcGx1Z2dlZCBpbiBhZnRlciA1IHNlY29uZHMKLQkgKi8KLQl1OCBib290X2NvbWE7Ci0KLQkvKiBOZXh0IHR3byB1c2VkIHRvIHNhdmUgcG93ZXIgaW5mb3JtYXRpb24gYXQgcG93ZXIgZG93bi4gVGhpcwotCSAqIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBkdXJpbmcgcG93ZXIgdXAgdG8gc2V0IHVwIHBhcnRzIG9mIFBvd2VyCi0JICogTWFuYWdlbWVudCBpbiBKQUdDb3JlCi0JICovCi0JdTE2IHBkb3duX3NwZWVkOwotCXU4IHBkb3duX2R1cGxleDsKLQotCXUzMiBDYWNoZWRNYXNrVmFsdWU7Ci0KLQkvKiBYY3ZyIHN0YXR1cyBhdCBsYXN0IHBvbGwgKi8KLQl1MTYgYm1zcjsKLQotCS8qIFR4IE1lbW9yeSBWYXJpYWJsZXMgKi8KLQlzdHJ1Y3QgdHhfcmluZyB0eF9yaW5nOwotCi0JLyogUnggTWVtb3J5IFZhcmlhYmxlcyAqLwotCXN0cnVjdCByeF9yaW5nIHJ4X3Jpbmc7Ci0KLQkvKiBMb29wYmFjayBzcGVjaWZpY3MgKi8KLQl1OCBSZXBsaWNhUGh5TG9vcGJrOwkvKiBSZXBsaWNhIEVuYWJsZSAqLwotCXU4IFJlcGxpY2FQaHlMb29wYmtQRjsJLyogUmVwbGljYSBFbmFibGUgUGFzcy9GYWlsICovCi0KLQkvKiBTdGF0cyAqLwotCXN0cnVjdCBjZV9zdGF0cyBzdGF0czsKLQotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldF9zdGF0czsKLX07Ci0KLSNlbmRpZiAvKiBfX0VUMTMxWF9BREFQVEVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfZGVmcy5oIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfZGVmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDUxOTNmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2RlZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogQWdlcmUgU3lzdGVtcyBJbmMuCi0gKiAxMC8xMDAvMTAwMCBCYXNlLVQgRXRoZXJuZXQgRHJpdmVyIGZvciB0aGUgRVQxMzAxIGFuZCBFVDEzMXggc2VyaWVzIE1BQ3MKLSAqCi0gKiBDb3B5cmlnaHQgwqkgMjAwNSBBZ2VyZSBTeXN0ZW1zIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBldDEzMXhfZGVmcy5oIC0gRGVmaW5lcywgc3RydWN0cywgZW51bXMsIHByb3RvdHlwZXMsIGV0Yy4gdG8gYXNzaXN0IHdpdGggT1MKLSAqICAgICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5Ci0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBTT0ZUV0FSRSBMSUNFTlNFCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCi0gKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCi0gKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCi0gKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCi0gKgotICogQ29weXJpZ2h0IMKpIDIwMDUgQWdlcmUgU3lzdGVtcyBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKgotICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKLSAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCi0gKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KLSAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIERpc2NsYWltZXIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKLSAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKLSAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCi0gKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAotICogREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIF9fRVQxMzFYX0RFRlNfSF9fCi0jZGVmaW5lIF9fRVQxMzFYX0RFRlNfSF9fCi0KLS8qIFBhY2tldCBhbmQgaGVhZGVyIHNpemVzICovCi0jZGVmaW5lIE5JQ19NSU5fUEFDS0VUX1NJWkUJNjAKLQotLyogTXVsdGljYXN0IGxpc3Qgc2l6ZSAqLwotI2RlZmluZSBOSUNfTUFYX01DQVNUX0xJU1QJMTI4Ci0KLS8qIFN1cHBvcnRlZCBGaWx0ZXJzICovCi0jZGVmaW5lIEVUMTMxWF9QQUNLRVRfVFlQRV9ESVJFQ1RFRAkJMHgwMDAxCi0jZGVmaW5lIEVUMTMxWF9QQUNLRVRfVFlQRV9NVUxUSUNBU1QJCTB4MDAwMgotI2RlZmluZSBFVDEzMVhfUEFDS0VUX1RZUEVfQlJPQURDQVNUCQkweDAwMDQKLSNkZWZpbmUgRVQxMzFYX1BBQ0tFVF9UWVBFX1BST01JU0NVT1VTCQkweDAwMDgKLSNkZWZpbmUgRVQxMzFYX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1QJMHgwMDEwCi0KLS8qIFR4IFRpbWVvdXQgKi8KLSNkZWZpbmUgRVQxMzFYX1RYX1RJTUVPVVQJKDEgKiBIWikKLSNkZWZpbmUgTklDX1NFTkRfSEFOR19USFJFU0hPTEQJMAotCi0vKiBNUF9UQ0IgZmxhZ3MgKi8KLSNkZWZpbmUgZk1QX0RFU1RfTVVMVEkJCQkweDAwMDAwMDAxCi0jZGVmaW5lIGZNUF9ERVNUX0JST0FECQkJMHgwMDAwMDAwMgotCi0vKiBNUF9BREFQVEVSIGZsYWdzICovCi0jZGVmaW5lIGZNUF9BREFQVEVSX1JFQ1ZfTE9PS0FTSURFCTB4MDAwMDAwMDQKLSNkZWZpbmUgZk1QX0FEQVBURVJfSU5URVJSVVBUX0lOX1VTRQkweDAwMDAwMDA4Ci0jZGVmaW5lIGZNUF9BREFQVEVSX1NFQ09OREFSWQkJMHgwMDAwMDAxMAotCi0vKiBNUF9TSEFSRUQgZmxhZ3MgKi8KLSNkZWZpbmUgZk1QX0FEQVBURVJfU0hVVERPV04JCTB4MDAxMDAwMDAKLSNkZWZpbmUgZk1QX0FEQVBURVJfTE9XRVJfUE9XRVIJCTB4MDAyMDAwMDAKLQotI2RlZmluZSBmTVBfQURBUFRFUl9OT05fUkVDT1ZFUl9FUlJPUgkweDAwODAwMDAwCi0jZGVmaW5lIGZNUF9BREFQVEVSX1JFU0VUX0lOX1BST0dSRVNTCTB4MDEwMDAwMDAKLSNkZWZpbmUgZk1QX0FEQVBURVJfTk9fQ0FCTEUJCTB4MDIwMDAwMDAKLSNkZWZpbmUgZk1QX0FEQVBURVJfSEFSRFdBUkVfRVJST1IJMHgwNDAwMDAwMAotI2RlZmluZSBmTVBfQURBUFRFUl9SRU1PVkVfSU5fUFJPR1JFU1MJMHgwODAwMDAwMAotI2RlZmluZSBmTVBfQURBUFRFUl9IQUxUX0lOX1BST0dSRVNTCTB4MTAwMDAwMDAKLQotI2RlZmluZSBmTVBfQURBUFRFUl9GQUlMX1NFTkRfTUFTSwkweDNmZjAwMDAwCi0jZGVmaW5lIGZNUF9BREFQVEVSX05PVF9SRUFEWV9NQVNLCTB4M2ZmMDAwMDAKLQotLyogU29tZSBvZmZzZXRzIGluIFBDSSBjb25maWcgc3BhY2UgdGhhdCBhcmUgYWN0dWFsbHkgdXNlZC4gKi8KLSNkZWZpbmUgRVQxMzEwX1BDSV9NQVhfUFlMRAkJMHg0QwotI2RlZmluZSBFVDEzMTBfUENJX01BQ19BRERSRVNTCQkweEE0Ci0jZGVmaW5lIEVUMTMxMF9QQ0lfRUVQUk9NX1NUQVRVUwkweEIyCi0jZGVmaW5lIEVUMTMxMF9QQ0lfQUNLX05BQ0sJCTB4QzAKLSNkZWZpbmUgRVQxMzEwX1BDSV9SRVBMQVkJCTB4QzIKLSNkZWZpbmUgRVQxMzEwX1BDSV9MMEwxTEFURU5DWQkJMHhDRgotCi0vKiBQQ0kgVmVuZG9yL1Byb2R1Y3QgSURzICovCi0jZGVmaW5lIEVUMTMxWF9QQ0lfVkVORE9SX0lECQkweDExQzEJLyogQWdlcmUgU3lzdGVtcyAqLwotI2RlZmluZSBFVDEzMVhfUENJX0RFVklDRV9JRF9HSUcJMHhFRDAwCS8qIEVUMTMxMCAxMDAwIEJhc2UtVCA4ICovCi0jZGVmaW5lIEVUMTMxWF9QQ0lfREVWSUNFX0lEX0ZBU1QJMHhFRDAxCS8qIEVUMTMxMCAxMDAgIEJhc2UtVCAqLwotCi0vKiBEZWZpbmUgb3JkZXIgb2YgbWFnbml0dWRlIGNvbnZlcnRlciAqLwotI2RlZmluZSBOQU5PX0lOX0FfTUlDUk8JMTAwMAotCi0jZGVmaW5lIFBBUk1fUlhfTlVNX0JVRlNfREVGICAgIDQKLSNkZWZpbmUgUEFSTV9SWF9USU1FX0lOVF9ERUYgICAgMTAKLSNkZWZpbmUgUEFSTV9SWF9NRU1fRU5EX0RFRiAgICAgMHgyYmMKLSNkZWZpbmUgUEFSTV9UWF9USU1FX0lOVF9ERUYgICAgNDAKLSNkZWZpbmUgUEFSTV9UWF9OVU1fQlVGU19ERUYgICAgNAotI2RlZmluZSBQQVJNX0RNQV9DQUNIRV9ERUYgICAgICAwCi0KLQotI2VuZGlmIC8qIF9fRVQxMzFYX0RFRlNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9pbml0cGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9pbml0cGNpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjOGQ2YjguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfaW5pdHBjaS5jCisrKyAvZGV2L251bGwKQEAgLTEsODQ4ICswLDAgQEAKLS8qCi0gKiBBZ2VyZSBTeXN0ZW1zIEluYy4KLSAqIDEwLzEwMC8xMDAwIEJhc2UtVCBFdGhlcm5ldCBEcml2ZXIgZm9yIHRoZSBFVDEzMDEgYW5kIEVUMTMxeCBzZXJpZXMgTUFDcwotICoKLSAqIENvcHlyaWdodCDCqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KLSAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIGV0MTMxeF9pbml0cGNpLmMgLSBSb3V0aW5lcyBhbmQgZGF0YSB1c2VkIHRvIHJlZ2lzdGVyIHRoZSBkcml2ZXIgd2l0aCB0aGUKLSAqICAgICAgICAgICAgICAgICAgICBQQ0kgKGFuZCBQQ0kgRXhwcmVzcykgc3Vic3lzdGVtLCBhcyB3ZWxsIGFzIGJhc2ljIGRyaXZlcgotICogICAgICAgICAgICAgICAgICAgIGluaXQgYW5kIHN0YXJ0dXAuCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBTT0ZUV0FSRSBMSUNFTlNFCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCi0gKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCi0gKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCi0gKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCi0gKgotICogQ29weXJpZ2h0IMKpIDIwMDUgQWdlcmUgU3lzdGVtcyBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKgotICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKLSAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCi0gKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KLSAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIERpc2NsYWltZXIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKLSAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKLSAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCi0gKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAotICogREFNQUdFLgotICoKLSAqLwotCi0jaW5jbHVkZSAiZXQxMzF4X3ZlcnNpb24uaCIKLSNpbmNsdWRlICJldDEzMXhfZGVmcy5oIgotCi0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgotI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgotCi0jaW5jbHVkZSAiZXQxMzEwX3BoeS5oIgotCi0jaW5jbHVkZSAiZXQxMzF4X2FkYXB0ZXIuaCIKLQotI2luY2x1ZGUgImV0MTMxMF9hZGRyZXNzX21hcC5oIgotI2luY2x1ZGUgImV0MTMxMF90eC5oIgotI2luY2x1ZGUgImV0MTMxMF9yeC5oIgotI2luY2x1ZGUgImV0MTMxeC5oIgotCi0jZGVmaW5lIElOVEVSTkFMX01FTV9TSVpFICAgICAgIDB4NDAwCS8qIDEwMjQgb2YgaW50ZXJuYWwgbWVtb3J5ICovCi0jZGVmaW5lIElOVEVSTkFMX01FTV9SWF9PRkZTRVQgIDB4MUZGCS8qIDUwJSAgIFR4LCA1MCUgICBSeCAqLwotCi0vKiBEZWZpbmVzIGZvciBQYXJhbWV0ZXIgRGVmYXVsdC9NaW4vTWF4IHZhdWxlcyAqLwotI2RlZmluZSBQQVJNX1NQRUVEX0RVUExFWF9NSU4gICAwCi0jZGVmaW5lIFBBUk1fU1BFRURfRFVQTEVYX01BWCAgIDUKLQotLyogTW9kdWxlIHBhcmFtZXRlciBmb3IgbWFudWFsIHNwZWVkIHNldHRpbmcKLSAqIFNldCBMaW5rIHNwZWVkIGFuZCBkdWJsZXggbWFudWFsbHkgKDAtNSkgIFswXQotICogIDEgOiAxME1iICAgSGFsZi1EdXBsZXgKLSAqICAyIDogMTBNYiAgIEZ1bGwtRHVwbGV4Ci0gKiAgMyA6IDEwME1iICBIYWxmLUR1cGxleAotICogIDQgOiAxMDBNYiAgRnVsbC1EdXBsZXgKLSAqICA1IDogMTAwME1iIEZ1bGwtRHVwbGV4Ci0gKiAgMCA6IEF1dG8gU3BlZWQgQXV0byBEdXBsZXggLy8gZGVmYXVsdAotICovCi1zdGF0aWMgdTMyIGV0MTMxeF9zcGVlZF9zZXQ7Ci1tb2R1bGVfcGFyYW0oZXQxMzF4X3NwZWVkX3NldCwgdWludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGV0MTMxeF9zcGVlZF9zZXQsCi0JCSJTZXQgTGluayBzcGVlZCBhbmQgZHVibGV4IG1hbnVhbGx5ICgwLTUpICBbMF1cbiIKLQkJIjEgOiAxME1iICAgSGFsZi1EdXBsZXhcbiIKLQkJIjIgOiAxME1iICAgRnVsbC1EdXBsZXhcbiIKLQkJIjMgOiAxMDBNYiAgSGFsZi1EdXBsZXhcbiIKLQkJIjQgOiAxMDBNYiAgRnVsbC1EdXBsZXhcbiIKLQkJIjUgOiAxMDAwTWIgRnVsbC1EdXBsZXhcbiIKLQkJIjAgOiBBdXRvIFNwZWVkIEF1dG8gRHVibGV4Iik7Ci0KLS8qKgotICogZXQxMzF4X2h3YWRkcl9pbml0IC0gc2V0IHVwIHRoZSBNQUMgQWRkcmVzcyBvbiB0aGUgRVQxMzEwCi0gKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQotICovCi12b2lkIGV0MTMxeF9od2FkZHJfaW5pdChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JLyogSWYgaGF2ZSBvdXIgZGVmYXVsdCBtYWMgZnJvbSBpbml0IGFuZCBubyBtYWMgYWRkcmVzcyBmcm9tCi0JICogRUVQUk9NIHRoZW4gd2UgbmVlZCB0byBnZW5lcmF0ZSB0aGUgbGFzdCBvY3RldCBhbmQgc2V0IGl0IG9uIHRoZQotCSAqIGRldmljZQotCSAqLwotCWlmIChhZGFwdGVyLT5yb21fYWRkclswXSA9PSAweDAwICYmCi0JICAgIGFkYXB0ZXItPnJvbV9hZGRyWzFdID09IDB4MDAgJiYKLQkgICAgYWRhcHRlci0+cm9tX2FkZHJbMl0gPT0gMHgwMCAmJgotCSAgICBhZGFwdGVyLT5yb21fYWRkclszXSA9PSAweDAwICYmCi0JICAgIGFkYXB0ZXItPnJvbV9hZGRyWzRdID09IDB4MDAgJiYKLQkgICAgYWRhcHRlci0+cm9tX2FkZHJbNV0gPT0gMHgwMCkgewotCQkvKgotCQkgKiBXZSBuZWVkIHRvIHJhbmRvbWx5IGdlbmVyYXRlIHRoZSBsYXN0IG9jdGV0IHNvIHdlCi0JCSAqIGRlY3JlYXNlIG91ciBjaGFuY2VzIG9mIHNldHRpbmcgdGhlIG1hYyBhZGRyZXNzIHRvCi0JCSAqIHNhbWUgYXMgYW5vdGhlciBvbmUgb2Ygb3VyIGNhcmRzIGluIHRoZSBzeXN0ZW0KLQkJICovCi0JCWdldF9yYW5kb21fYnl0ZXMoJmFkYXB0ZXItPmFkZHJbNV0sIDEpOwotCQkvKgotCQkgKiBXZSBoYXZlIHRoZSBkZWZhdWx0IHZhbHVlIGluIHRoZSByZWdpc3RlciB3ZSBhcmUKLQkJICogd29ya2luZyB3aXRoIHNvIHdlIG5lZWQgdG8gY29weSB0aGUgY3VycmVudAotCQkgKiBhZGRyZXNzIGludG8gdGhlIHBlcm1hbmVudCBhZGRyZXNzCi0JCSAqLwotCQltZW1jcHkoYWRhcHRlci0+cm9tX2FkZHIsCi0JCQlhZGFwdGVyLT5hZGRyLCBFVEhfQUxFTik7Ci0JfSBlbHNlIHsKLQkJLyogV2UgZG8gbm90IGhhdmUgYW4gb3ZlcnJpZGUgYWRkcmVzcywgc28gc2V0IHRoZQotCQkgKiBjdXJyZW50IGFkZHJlc3MgdG8gdGhlIHBlcm1hbmVudCBhZGRyZXNzIGFuZCBhZGQKLQkJICogaXQgdG8gdGhlIGRldmljZQotCQkgKi8KLQkJbWVtY3B5KGFkYXB0ZXItPmFkZHIsCi0JCSAgICAgICBhZGFwdGVyLT5yb21fYWRkciwgRVRIX0FMRU4pOwotCX0KLX0KLQotCi0vKioKLSAqIGV0MTMxeF9wY2lfaW5pdAkgLSBpbml0aWFsIFBDSSBzZXR1cAotICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqIEBwZGV2OiBvdXIgUENJIGRldmljZQotICoKLSAqIFBlcmZvcm0gdGhlIGluaXRpYWwgc2V0dXAgb2YgUENJIHJlZ2lzdGVycyBhbmQgaWYgcG9zc2libGUgaW5pdGlhbGlzZQotICogdGhlIE1BQyBhZGRyZXNzLiBBdCB0aGlzIHBvaW50IHRoZSBJL08gcmVnaXN0ZXJzIGhhdmUgeWV0IHRvIGJlIG1hcHBlZAotICovCi0KLXN0YXRpYyBpbnQgZXQxMzF4X3BjaV9pbml0KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkJCXN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCWludCBpOwotCXU4IG1heF9wYXlsb2FkOwotCXU4IHJlYWRfc2l6ZV9yZWc7Ci0KLQlpZiAoZXQxMzF4X2luaXRfZWVwcm9tKGFkYXB0ZXIpIDwgMCkKLQkJcmV0dXJuIC1FSU87Ci0KLQkvKiBMZXQncyBzZXQgdXAgdGhlIFBPUlQgTE9HSUMgUmVnaXN0ZXIuICBGaXJzdCB3ZSBuZWVkIHRvIGtub3cgd2hhdAotCSAqIHRoZSBtYXhfcGF5bG9hZF9zaXplIGlzCi0JICovCi0JaWYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIEVUMTMxMF9QQ0lfTUFYX1BZTEQsICZtYXhfcGF5bG9hZCkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkgICAgIkNvdWxkIG5vdCByZWFkIFBDSSBjb25maWcgc3BhY2UgZm9yIE1heCBQYXlsb2FkIFNpemVcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKiBQcm9ncmFtIHRoZSBBY2svTmFrIGxhdGVuY3kgYW5kIHJlcGxheSB0aW1lcnMgKi8KLQltYXhfcGF5bG9hZCAmPSAweDA3OwkvKiBPbmx5IHRoZSBsb3dlciAzIGJpdHMgYXJlIHZhbGlkICovCi0KLQlpZiAobWF4X3BheWxvYWQgPCAyKSB7Ci0JCXN0YXRpYyBjb25zdCB1MTYgYWNrbmFrWzJdID0geyAweDc2LCAweEQwIH07Ci0JCXN0YXRpYyBjb25zdCB1MTYgcmVwbGF5WzJdID0geyAweDFFMCwgMHgyRUQgfTsKLQotCQlpZiAocGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIEVUMTMxMF9QQ0lfQUNLX05BQ0ssCi0JCQkJCSAgICAgICBhY2tuYWtbbWF4X3BheWxvYWRdKSkgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJICAiQ291bGQgbm90IHdyaXRlIFBDSSBjb25maWcgc3BhY2UgZm9yIEFDSy9OQUtcbiIpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQkJaWYgKHBjaV93cml0ZV9jb25maWdfd29yZChwZGV2LCBFVDEzMTBfUENJX1JFUExBWSwKLQkJCQkJICAgICAgIHJlcGxheVttYXhfcGF5bG9hZF0pKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkgICJDb3VsZCBub3Qgd3JpdGUgUENJIGNvbmZpZyBzcGFjZSBmb3IgUmVwbGF5IFRpbWVyXG4iKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0JfQotCi0JLyogbDBzIGFuZCBsMSBsYXRlbmN5IHRpbWVycy4gIFdlIGFyZSB1c2luZyBkZWZhdWx0IHZhbHVlcy4KLQkgKiBSZXByZXNlbnRpbmcgMDAxIGZvciBMMHMgYW5kIDAxMCBmb3IgTDEKLQkgKi8KLQlpZiAocGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIEVUMTMxMF9QQ0lfTDBMMUxBVEVOQ1ksIDB4MTEpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJICAiQ291bGQgbm90IHdyaXRlIFBDSSBjb25maWcgc3BhY2UgZm9yIExhdGVuY3kgVGltZXJzXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JLyogQ2hhbmdlIHRoZSBtYXggcmVhZCBzaXplIHRvIDJrICovCi0JaWYgKHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTEsICZyZWFkX3NpemVfcmVnKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiQ291bGQgbm90IHJlYWQgUENJIGNvbmZpZyBzcGFjZSBmb3IgTWF4IHJlYWQgc2l6ZVxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXJlYWRfc2l6ZV9yZWcgJj0gMHg4ZjsKLQlyZWFkX3NpemVfcmVnIHw9IDB4NDA7Ci0KLQlpZiAocGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NTEsIHJlYWRfc2l6ZV9yZWcpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJICAgICAgIkNvdWxkIG5vdCB3cml0ZSBQQ0kgY29uZmlnIHNwYWNlIGZvciBNYXggcmVhZCBzaXplXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JLyogR2V0IE1BQyBhZGRyZXNzIGZyb20gY29uZmlnIHNwYWNlIGlmIGFuIGVlcHJvbSBleGlzdHMsIG90aGVyd2lzZQotCSAqIHRoZSBNQUMgYWRkcmVzcyB0aGVyZSB3aWxsIG5vdCBiZSB2YWxpZAotCSAqLwotCWlmICghYWRhcHRlci0+aGFzX2VlcHJvbSkgewotCQlldDEzMXhfaHdhZGRyX2luaXQoYWRhcHRlcik7Ci0JCXJldHVybiAwOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKSB7Ci0JCWlmIChwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBFVDEzMTBfUENJX01BQ19BRERSRVNTICsgaSwKLQkJCQkJYWRhcHRlci0+cm9tX2FkZHIgKyBpKSkgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGQgbm90IHJlYWQgUENJIGNvbmZpZyBzcGFjZSBmb3IgTUFDIGFkZHJlc3NcbiIpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQl9Ci0JbWVtY3B5KGFkYXB0ZXItPmFkZHIsIGFkYXB0ZXItPnJvbV9hZGRyLCBFVEhfQUxFTik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogZXQxMzF4X2Vycm9yX3RpbWVyX2hhbmRsZXIKLSAqIEBkYXRhOiB0aW1lci1zcGVjaWZpYyB2YXJpYWJsZTsgaGVyZSBhIHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIgc3RydWN0dXJlCi0gKgotICogVGhlIHJvdXRpbmUgY2FsbGVkIHdoZW4gdGhlIGVycm9yIHRpbWVyIGV4cGlyZXMsIHRvIHRyYWNrIHRoZSBudW1iZXIgb2YKLSAqIHJlY3VycmluZyBlcnJvcnMuCi0gKi8KLXZvaWQgZXQxMzF4X2Vycm9yX3RpbWVyX2hhbmRsZXIodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYgPSAoc3RydWN0IGV0MTMxeF9hZGFwdGVyICopIGRhdGE7Ci0JdTMyIHBtX2NzcjsKLQotCXBtX2NzciA9IHJlYWRsKCZldGRldi0+cmVncy0+Z2xvYmFsLnBtX2Nzcik7Ci0KLQlpZiAoKHBtX2NzciAmIEVUX1BNX1BIWV9TV19DT01BKSA9PSAwKQotCQlVcGRhdGVNYWNTdGF0SG9zdENvdW50ZXJzKGV0ZGV2KTsKLQllbHNlCi0JCWRldl9lcnIoJmV0ZGV2LT5wZGV2LT5kZXYsCi0JCSAgICAiTm8gaW50ZXJydXB0cywgaW4gUEhZIGNvbWEsIHBtX2NzciA9IDB4JXhcbiIsIHBtX2Nzcik7Ci0KLQlpZiAoIShldGRldi0+Ym1zciAmIE1JX0JNU1JfTElOS19TVEFUVVMpICYmCi0JICAgIGV0ZGV2LT5SZWdpc3RyeVBoeUNvbWEgJiYKLQkgICAgZXRkZXYtPmJvb3RfY29tYSA8IDExKSB7Ci0JCWV0ZGV2LT5ib290X2NvbWErKzsKLQl9Ci0KLQlpZiAoZXRkZXYtPmJvb3RfY29tYSA9PSAxMCkgewotCQlpZiAoIShldGRldi0+Ym1zciAmIE1JX0JNU1JfTElOS19TVEFUVVMpCi0JCSAgICAmJiBldGRldi0+UmVnaXN0cnlQaHlDb21hKSB7Ci0JCQlpZiAoKHBtX2NzciAmIEVUX1BNX1BIWV9TV19DT01BKSA9PSAwKSB7Ci0JCQkJLyogTk9URSAtIFRoaXMgd2FzIG9yaWdpbmFsbHkgYSAnc3luYyB3aXRoCi0JCQkJICogIGludGVycnVwdCcuIEhvdyB0byBkbyB0aGF0IHVuZGVyIExpbnV4PwotCQkJCSAqLwotCQkJCWV0MTMxeF9lbmFibGVfaW50ZXJydXB0cyhldGRldik7Ci0JCQkJRW5hYmxlUGh5Q29tYShldGRldik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBUaGlzIGlzIGEgcGVyaW9kaWMgdGltZXIsIHNvIHJlc2NoZWR1bGUgKi8KLQltb2RfdGltZXIoJmV0ZGV2LT5FcnJvclRpbWVyLCBqaWZmaWVzICsKLQkJCQkJICBUWF9FUlJPUl9QRVJJT0QgKiBIWiAvIDEwMDApOwotfQotCi0vKioKLSAqIGV0MTMxeF9saW5rX2RldGVjdGlvbl9oYW5kbGVyCi0gKgotICogVGltZXIgZnVuY3Rpb24gZm9yIGxpbmsgdXAgYXQgZHJpdmVyIGxvYWQgdGltZQotICovCi12b2lkIGV0MTMxeF9saW5rX2RldGVjdGlvbl9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2ID0gKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqKSBkYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoZXRkZXYtPk1lZGlhU3RhdGUgPT0gMCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZXRkZXYtPkxvY2ssIGZsYWdzKTsKLQotCQlldGRldi0+TWVkaWFTdGF0ZSA9IE5FVElGX1NUQVRVU19NRURJQV9ESVNDT05ORUNUOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV0ZGV2LT5Mb2NrLCBmbGFncyk7Ci0KLQkJbmV0aWZfY2Fycmllcl9vZmYoZXRkZXYtPm5ldGRldik7Ci0JfQotfQotCi0vKioKLSAqIGV0MTMxeF9jb25maWd1cmVfZ2xvYmFsX3JlZ3MJLQljb25maWd1cmUgSkFHQ29yZSBnbG9iYWwgcmVncwotICogQGV0ZGV2OiBwb2ludGVyIHRvIG91ciBhZGFwdGVyIHN0cnVjdHVyZQotICoKLSAqIFVzZWQgdG8gY29uZmlndXJlIHRoZSBnbG9iYWwgcmVnaXN0ZXJzIG9uIHRoZSBKQUdDb3JlCi0gKi8KLXZvaWQgQ29uZmlnR2xvYmFsUmVncyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0ZGV2KQotewotCXN0cnVjdCBnbG9iYWxfcmVncyBfX2lvbWVtICpyZWdzID0gJmV0ZGV2LT5yZWdzLT5nbG9iYWw7Ci0KLQl3cml0ZWwoMCwgJnJlZ3MtPnJ4cV9zdGFydF9hZGRyKTsKLQl3cml0ZWwoSU5URVJOQUxfTUVNX1NJWkUgLSAxLCAmcmVncy0+dHhxX2VuZF9hZGRyKTsKLQotCWlmIChldGRldi0+UmVnaXN0cnlKdW1ib1BhY2tldCA8IDIwNDgpIHsKLQkJLyogVHggLyBSeERNQSBhbmQgVHgvUnggTUFDIGludGVyZmFjZXMgaGF2ZSBhIDFrIHdvcmQKLQkJICogYmxvY2sgb2YgUkFNIHRoYXQgdGhlIGRyaXZlciBjYW4gc3BsaXQgYmV0d2VlbiBUeAotCQkgKiBhbmQgUnggYXMgaXQgZGVzaXJlcy4gIE91ciBkZWZhdWx0IGlzIHRvIHNwbGl0IGl0Ci0JCSAqIDUwLzUwOgotCQkgKi8KLQkJd3JpdGVsKFBBUk1fUlhfTUVNX0VORF9ERUYsICZyZWdzLT5yeHFfZW5kX2FkZHIpOwotCQl3cml0ZWwoUEFSTV9SWF9NRU1fRU5EX0RFRiArIDEsICZyZWdzLT50eHFfc3RhcnRfYWRkcik7Ci0JfSBlbHNlIGlmIChldGRldi0+UmVnaXN0cnlKdW1ib1BhY2tldCA8IDgxOTIpIHsKLQkJLyogRm9yIGp1bWJvIHBhY2tldHMgPiAyayBidXQgPCA4aywgc3BsaXQgNTAtNTAuICovCi0JCXdyaXRlbChJTlRFUk5BTF9NRU1fUlhfT0ZGU0VULCAmcmVncy0+cnhxX2VuZF9hZGRyKTsKLQkJd3JpdGVsKElOVEVSTkFMX01FTV9SWF9PRkZTRVQgKyAxLCAmcmVncy0+dHhxX3N0YXJ0X2FkZHIpOwotCX0gZWxzZSB7Ci0JCS8qIDkyMTYgaXMgdGhlIG9ubHkgcGFja2V0IHNpemUgZ3JlYXRlciB0aGFuIDhrIHRoYXQKLQkJICogaXMgYXZhaWxhYmxlLiBUaGUgVHggYnVmZmVyIGhhcyB0byBiZSBiaWcgZW5vdWdoCi0JCSAqIGZvciBvbmUgd2hvbGUgcGFja2V0IG9uIHRoZSBUeCBzaWRlLiBXZSdsbCBtYWtlCi0JCSAqIHRoZSBUeCA5NDA4LCBhbmQgZ2l2ZSB0aGUgcmVzdCB0byBSeAotCQkgKi8KLQkJd3JpdGVsKDB4MDFiMywgJnJlZ3MtPnJ4cV9lbmRfYWRkcik7Ci0JCXdyaXRlbCgweDAxYjQsICZyZWdzLT50eHFfc3RhcnRfYWRkcik7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSB0aGUgbG9vcGJhY2sgcmVnaXN0ZXIuIERpc2FibGUgYWxsIGxvb3BiYWNrcy4gKi8KLQl3cml0ZWwoMCwgJnJlZ3MtPmxvb3BiYWNrKTsKLQotCS8qIE1TSSBSZWdpc3RlciAqLwotCXdyaXRlbCgwLCAmcmVncy0+bXNpX2NvbmZpZyk7Ci0KLQkvKiBCeSBkZWZhdWx0LCBkaXNhYmxlIHRoZSB3YXRjaGRvZyB0aW1lci4gIEl0IHdpbGwgYmUgZW5hYmxlZCB3aGVuCi0JICogYSBwYWNrZXQgaXMgcXVldWVkLgotCSAqLwotCXdyaXRlbCgwLCAmcmVncy0+d2F0Y2hkb2dfdGltZXIpOwotfQotCi0KLS8qKgotICogZXQxMzF4X2FkYXB0ZXJfc2V0dXAgLSBTZXQgdGhlIGFkYXB0ZXIgdXAgYXMgcGVyIGNhc3NpbmkrIGRvY3VtZW50YXRpb24KLSAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUgKGFzIGRlZmluZWQgaW4gZXJybm8uaCkKLSAqLwotaW50IGV0MTMxeF9hZGFwdGVyX3NldHVwKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXYpCi17Ci0JaW50IHN0YXR1cyA9IDA7Ci0KLQkvKiBDb25maWd1cmUgdGhlIEpBR0NvcmUgKi8KLQlDb25maWdHbG9iYWxSZWdzKGV0ZGV2KTsKLQotCUNvbmZpZ01BQ1JlZ3MxKGV0ZGV2KTsKLQotCS8qIENvbmZpZ3VyZSB0aGUgTU1DIHJlZ2lzdGVycyAqLwotCS8qIEFsbCB3ZSBuZWVkIHRvIGRvIGlzIGluaXRpYWxpemUgdGhlIE1lbW9yeSBDb250cm9sIFJlZ2lzdGVyICovCi0Jd3JpdGVsKEVUX01NQ19FTkFCTEUsICZldGRldi0+cmVncy0+bW1jLm1tY19jdHJsKTsKLQotCUNvbmZpZ1J4TWFjUmVncyhldGRldik7Ci0JQ29uZmlnVHhNYWNSZWdzKGV0ZGV2KTsKLQotCUNvbmZpZ1J4RG1hUmVncyhldGRldik7Ci0JQ29uZmlnVHhEbWFSZWdzKGV0ZGV2KTsKLQotCUNvbmZpZ01hY1N0YXRSZWdzKGV0ZGV2KTsKLQotCS8qIE1vdmUgdGhlIGZvbGxvd2luZyBjb2RlIHRvIFRpbWVyIGZ1bmN0aW9uPz8gKi8KLQlzdGF0dXMgPSBldDEzMXhfeGN2cl9maW5kKGV0ZGV2KTsKLQotCWlmIChzdGF0dXMgIT0gMCkKLQkJZGV2X3dhcm4oJmV0ZGV2LT5wZGV2LT5kZXYsICJDb3VsZCBub3QgZmluZCB0aGUgeGN2clxuIik7Ci0KLQkvKiBQcmVwYXJlIHRoZSBUUlVFUEhZIGxpYnJhcnkuICovCi0JRVQxMzEwX1BoeUluaXQoZXRkZXYpOwotCi0JLyogUmVzZXQgdGhlIHBoeSBub3cgc28gY2hhbmdlcyB0YWtlIHBsYWNlICovCi0JRVQxMzEwX1BoeVJlc2V0KGV0ZGV2KTsKLQotCS8qIFBvd2VyIGRvd24gUEhZICovCi0JRVQxMzEwX1BoeVBvd2VyRG93bihldGRldiwgMSk7Ci0KLQkvKgotCSAqIFdlIG5lZWQgdG8gdHVybiBvZmYgMTAwMCBiYXNlIGhhbGYgZHVscGxleCwgdGhlIG1hYyBkb2VzIG5vdAotCSAqIHN1cHBvcnQgaXQuIEZvciB0aGUgMTAvMTAwIHBhcnQsIHR1cm4gb2ZmIGFsbCBnaWcgYWR2ZXJ0aXNlbWVudAotCSAqLwotCWlmIChldGRldi0+cGRldi0+ZGV2aWNlICE9IEVUMTMxWF9QQ0lfREVWSUNFX0lEX0ZBU1QpCi0JCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDAwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9GVUxMKTsKLQllbHNlCi0JCUVUMTMxMF9QaHlBZHZlcnRpc2UxMDAwQmFzZVQoZXRkZXYsIFRSVUVQSFlfQURWX0RVUExFWF9OT05FKTsKLQotCS8qIFBvd2VyIHVwIFBIWSAqLwotCUVUMTMxMF9QaHlQb3dlckRvd24oZXRkZXYsIDApOwotCi0JZXQxMzF4X3NldHBoeV9ub3JtYWwoZXRkZXYpOwotOwlyZXR1cm4gc3RhdHVzOwotfQotCi0vKioKLSAqIGV0MTMxeF9zb2Z0X3Jlc2V0IC0gSXNzdWUgYSBzb2Z0IHJlc2V0IHRvIHRoZSBoYXJkd2FyZSwgY29tcGxldGUgZm9yIEVUMTMxMAotICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIHByaXZhdGUgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqLwotdm9pZCBldDEzMXhfc29mdF9yZXNldChzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JLyogRGlzYWJsZSBNQUMgQ29yZSAqLwotCXdyaXRlbCgweGMwMGYwMDAwLCAmYWRhcHRlci0+cmVncy0+bWFjLmNmZzEpOwotCi0JLyogU2V0IGV2ZXJ5dGhpbmcgdG8gYSByZXNldCB2YWx1ZSAqLwotCXdyaXRlbCgweDdGLCAmYWRhcHRlci0+cmVncy0+Z2xvYmFsLnN3X3Jlc2V0KTsKLQl3cml0ZWwoMHgwMDBmMDAwMCwgJmFkYXB0ZXItPnJlZ3MtPm1hYy5jZmcxKTsKLQl3cml0ZWwoMHgwMDAwMDAwMCwgJmFkYXB0ZXItPnJlZ3MtPm1hYy5jZmcxKTsKLX0KLQotLyoqCi0gKiBldDEzMXhfYWxpZ25fYWxsb2NhdGVkX21lbW9yeSAtIEFsaWduIGFsbG9jYXRlZCBtZW1vcnkgb24gYSBnaXZlbiBib3VuZGFyeQotICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gb3VyIGFkYXB0ZXIgc3RydWN0dXJlCi0gKiBAcGh5c19hZGRyOiBwb2ludGVyIHRvIFBoeXNpY2FsIGFkZHJlc3MKLSAqIEBvZmZzZXQ6IHBvaW50ZXIgdG8gdGhlIG9mZnNldCB2YXJpYWJsZQotICogQG1hc2s6IGNvcnJlY3QgbWFzawotICovCi12b2lkIGV0MTMxeF9hbGlnbl9hbGxvY2F0ZWRfbWVtb3J5KHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciwKLQkJCQkgICB1aW50NjRfdCAqcGh5c19hZGRyLAotCQkJCSAgIHVpbnQ2NF90ICpvZmZzZXQsIHVpbnQ2NF90IG1hc2spCi17Ci0JdWludDY0X3QgbmV3X2FkZHI7Ci0KLQkqb2Zmc2V0ID0gMDsKLQotCW5ld19hZGRyID0gKnBoeXNfYWRkciAmIH5tYXNrOwotCi0JaWYgKG5ld19hZGRyICE9ICpwaHlzX2FkZHIpIHsKLQkJLyogTW92ZSB0byBuZXh0IGFsaWduZWQgYmxvY2sgKi8KLQkJbmV3X2FkZHIgKz0gbWFzayArIDE7Ci0JCS8qIFJldHVybiBvZmZzZXQgZm9yIGFkanVzdGluZyB2aXJ0IGFkZHIgKi8KLQkJKm9mZnNldCA9IG5ld19hZGRyIC0gKnBoeXNfYWRkcjsKLQkJLyogUmV0dXJuIG5ldyBwaHlzaWNhbCBhZGRyZXNzICovCi0JCSpwaHlzX2FkZHIgPSBuZXdfYWRkcjsKLQl9Ci19Ci0KLS8qKgotICogZXQxMzF4X2FkYXB0ZXJfbWVtb3J5X2FsbG9jCi0gKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpLgotICoKLSAqIEFsbG9jYXRlIGFsbCB0aGUgbWVtb3J5IGJsb2NrcyBmb3Igc2VuZCwgcmVjZWl2ZSBhbmQgb3RoZXJzLgotICovCi1pbnQgZXQxMzF4X2FkYXB0ZXJfbWVtb3J5X2FsbG9jKHN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlpbnQgc3RhdHVzOwotCi0JLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgVHggUmluZyAqLwotCXN0YXR1cyA9IGV0MTMxeF90eF9kbWFfbWVtb3J5X2FsbG9jKGFkYXB0ZXIpOwotCWlmIChzdGF0dXMgIT0gMCkgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkgICJldDEzMXhfdHhfZG1hX21lbW9yeV9hbGxvYyBGQUlMRURcbiIpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkvKiBSZWNlaXZlIGJ1ZmZlciBtZW1vcnkgYWxsb2NhdGlvbiAqLwotCXN0YXR1cyA9IGV0MTMxeF9yeF9kbWFfbWVtb3J5X2FsbG9jKGFkYXB0ZXIpOwotCWlmIChzdGF0dXMgIT0gMCkgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkgICJldDEzMXhfcnhfZG1hX21lbW9yeV9hbGxvYyBGQUlMRURcbiIpOwotCQlldDEzMXhfdHhfZG1hX21lbW9yeV9mcmVlKGFkYXB0ZXIpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qIEluaXQgcmVjZWl2ZSBkYXRhIHN0cnVjdHVyZXMgKi8KLQlzdGF0dXMgPSBldDEzMXhfaW5pdF9yZWN2KGFkYXB0ZXIpOwotCWlmIChzdGF0dXMgIT0gMCkgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkiZXQxMzF4X2luaXRfcmVjdiBGQUlMRURcbiIpOwotCQlldDEzMXhfdHhfZG1hX21lbW9yeV9mcmVlKGFkYXB0ZXIpOwotCQlldDEzMXhfcnhfZG1hX21lbW9yeV9mcmVlKGFkYXB0ZXIpOwotCX0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKioKLSAqIGV0MTMxeF9hZGFwdGVyX21lbW9yeV9mcmVlIC0gRnJlZSBhbGwgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdXNlIGJ5IFR4ICYgUngKLSAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIG91ciBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCi0gKi8KLXZvaWQgZXQxMzF4X2FkYXB0ZXJfbWVtb3J5X2ZyZWUoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQotewotCS8qIEZyZWUgRE1BIG1lbW9yeSAqLwotCWV0MTMxeF90eF9kbWFfbWVtb3J5X2ZyZWUoYWRhcHRlcik7Ci0JZXQxMzF4X3J4X2RtYV9tZW1vcnlfZnJlZShhZGFwdGVyKTsKLX0KLQotCi0KLS8qKgotICogZXQxMzF4X2FkYXB0ZXJfaW5pdAotICogQGV0ZGV2OiBwb2ludGVyIHRvIHRoZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0Ci0gKiBAcGRldjogcG9pbnRlciB0byB0aGUgUENJIGRldmljZQotICoKLSAqIEluaXRpYWxpemUgdGhlIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhlIGV0MTMxeF9hZGFwdGVyIG9iamVjdCBhbmQgbGluawotICogdGhlbSB0b2dldGhlciB3aXRoIHRoZSBwbGF0Zm9ybSBwcm92aWRlZCBkZXZpY2Ugc3RydWN0dXJlcy4KLSAqLwotCi0KLXN0YXRpYyBzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmV0MTMxeF9hZGFwdGVyX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RhdGljIGNvbnN0IHU4IGRlZmF1bHRfbWFjW10gPSB7IDB4MDAsIDB4MDUsIDB4M2QsIDB4MDAsIDB4MDIsIDB4MDAgfTsKLQlzdGF0aWMgY29uc3QgdTggZHVwbGV4W10gPSB7IDAsIDEsIDIsIDEsIDIsIDIgfTsKLQlzdGF0aWMgY29uc3QgdTE2IHNwZWVkW10gPSB7IDAsIDEwLCAxMCwgMTAwLCAxMDAsIDEwMDAgfTsKLQotCXN0cnVjdCBldDEzMXhfYWRhcHRlciAqZXRkZXY7Ci0KLQkvKiBTZXR1cCB0aGUgZnVuZGFtZW50YWwgbmV0X2RldmljZSBhbmQgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQotCSAqIGVsZW1lbnRzICAqLwotCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJnBkZXYtPmRldik7Ci0KLQkvKiBBbGxvY2F0ZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0IGFuZCBjb3B5IGluIHJlbGV2YW50IGluZm9ybWF0aW9uICovCi0JZXRkZXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWV0ZGV2LT5wZGV2ID0gcGNpX2Rldl9nZXQocGRldik7Ci0JZXRkZXYtPm5ldGRldiA9IG5ldGRldjsKLQotCS8qIERvIHRoZSBzYW1lIGZvciB0aGUgbmV0ZGV2IHN0cnVjdCAqLwotCW5ldGRldi0+aXJxID0gcGRldi0+aXJxOwotCW5ldGRldi0+YmFzZV9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOwotCi0JLyogSW5pdGlhbGl6ZSBzcGlubG9ja3MgaGVyZSAqLwotCXNwaW5fbG9ja19pbml0KCZldGRldi0+TG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmV0ZGV2LT5UQ0JTZW5kUUxvY2spOwotCXNwaW5fbG9ja19pbml0KCZldGRldi0+VENCUmVhZHlRTG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmV0ZGV2LT5zZW5kX2h3X2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZldGRldi0+cmN2X2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZldGRldi0+UmN2UGVuZExvY2spOwotCXNwaW5fbG9ja19pbml0KCZldGRldi0+RmJyTG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmV0ZGV2LT5QSFlMb2NrKTsKLQotCS8qIFBhcnNlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBpbnRvIHRoZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0ICovCi0JaWYgKGV0MTMxeF9zcGVlZF9zZXQpCi0JCWRldl9pbmZvKCZldGRldi0+cGRldi0+ZGV2LAotCQkJIlNwZWVkIHNldCBtYW51YWxseSB0byA6ICVkXG4iLCBldDEzMXhfc3BlZWRfc2V0KTsKLQotCWV0ZGV2LT5TcGVlZER1cGxleCA9IGV0MTMxeF9zcGVlZF9zZXQ7Ci0JZXRkZXYtPlJlZ2lzdHJ5SnVtYm9QYWNrZXQgPSAxNTE0OwkvKiAxNTE0LTkyMTYgKi8KLQotCS8qIFNldCB0aGUgTUFDIGFkZHJlc3MgdG8gYSBkZWZhdWx0ICovCi0JbWVtY3B5KGV0ZGV2LT5hZGRyLCBkZWZhdWx0X21hYywgRVRIX0FMRU4pOwotCi0JLyogRGVjb2RlIFNwZWVkRHVwbGV4Ci0JICoKLQkgKiBTZXQgdXAgYXMgaWYgd2UgYXJlIGF1dG8gbmVnb3RpYXRpbmcgYWx3YXlzIGFuZCB0aGVuIGNoYW5nZSBpZiB3ZQotCSAqIGdvIGludG8gZm9yY2UgbW9kZQotCSAqCi0JICogSWYgd2UgYXJlIHRoZSAxMC8xMDAgZGV2aWNlLCBhbmQgZ2lnYWJpdCBpcyBzb21laG93IHJlcXVlc3RlZCB0aGVuCi0JICoga25vY2sgaXQgZG93biB0byAxMDAgZnVsbC4KLQkgKi8KLQlpZiAoZXRkZXYtPnBkZXYtPmRldmljZSA9PSBFVDEzMVhfUENJX0RFVklDRV9JRF9GQVNUICYmCi0JICAgIGV0ZGV2LT5TcGVlZER1cGxleCA9PSA1KQotCQlldGRldi0+U3BlZWREdXBsZXggPSA0OwotCi0JZXRkZXYtPkFpRm9yY2VTcGVlZCA9IHNwZWVkW2V0ZGV2LT5TcGVlZER1cGxleF07Ci0JZXRkZXYtPkFpRm9yY2VEcHggPSBkdXBsZXhbZXRkZXYtPlNwZWVkRHVwbGV4XTsJLyogQXV0byBGRFggKi8KLQotCXJldHVybiBldGRldjsKLX0KLQotLyoqCi0gKiBldDEzMXhfcGNpX3NldHVwIC0gUGVyZm9ybSBkZXZpY2UgaW5pdGlhbGl6YXRpb24KLSAqIEBwZGV2OiBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSdzIHBjaV9kZXYgc3RydWN0dXJlCi0gKiBAZW50OiB0aGlzIGRldmljZSdzIGVudHJ5IGluIHRoZSBwY2lfZGV2aWNlX2lkIHRhYmxlCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUgKGFzIGRlZmluZWQgaW4gZXJybm8uaCkKLSAqCi0gKiBSZWdpc3RlcmVkIGluIHRoZSBwY2lfZHJpdmVyIHN0cnVjdHVyZSwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUKLSAqIFBDSSBzdWJzeXN0ZW0gZmluZHMgYSBuZXcgUENJIGRldmljZSB3aGljaCBtYXRjaGVzIHRoZSBpbmZvcm1hdGlvbgotICogY29udGFpbmVkIGluIHRoZSBwY2lfZGV2aWNlX2lkIHRhYmxlLiBUaGlzIHJvdXRpbmUgaXMgdGhlIGVxdWl2YWxlbnQgdG8KLSAqIGEgZGV2aWNlIGluc2VydGlvbiByb3V0aW5lLgotICovCi0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGV0MTMxeF9wY2lfc2V0dXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKLXsKLQlpbnQgcmVzdWx0ID0gLUVCVVNZOwotCWludCBwbV9jYXA7Ci0JYm9vbCBwY2lfdXNpbmdfZGFjOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7Ci0Jc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyOwotCi0JLyogRW5hYmxlIHRoZSBkZXZpY2UgdmlhIHRoZSBQQ0kgc3Vic3lzdGVtICovCi0JaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpICE9IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJInBjaV9lbmFibGVfZGV2aWNlKCkgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JLyogUGVyZm9ybSBzb21lIGJhc2ljIFBDSSBjaGVja3MgKi8KLQlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJICAiQ2FuJ3QgZmluZCBQQ0kgZGV2aWNlJ3MgYmFzZSBhZGRyZXNzXG4iKTsKLQkJZ290byBlcnJfZGlzYWJsZTsKLQl9Ci0KLQlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUklWRVJfTkFNRSkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJIkNhbid0IGdldCBQQ0kgcmVzb3VyY2VzXG4iKTsKLQkJZ290byBlcnJfZGlzYWJsZTsKLQl9Ci0KLQkvKiBFbmFibGUgUENJIGJ1cyBtYXN0ZXJpbmcgKi8KLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKLQotCS8qIFF1ZXJ5IFBDSSBmb3IgUG93ZXIgTWdtdCBDYXBhYmlsaXRpZXMKLQkgKgotCSAqIE5PVEU6IE5vdyByZWFkaW5nIFBvd2VyTWdtdCBpbiBhbm90aGVyIGxvY2F0aW9uOyBpcyB0aGlzIHN0aWxsCi0JICogbmVlZGVkPwotCSAqLwotCXBtX2NhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9QTSk7Ci0JaWYgKHBtX2NhcCA9PSAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCSAgIkNhbm5vdCBmaW5kIFBvd2VyIE1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzXG4iKTsKLQkJcmVzdWx0ID0gLUVJTzsKLQkJZ290byBlcnJfcmVsZWFzZV9yZXM7Ci0JfQotCi0JLyogQ2hlY2sgdGhlIERNQSBhZGRyZXNzaW5nIHN1cHBvcnQgb2YgdGhpcyBkZXZpY2UgKi8KLQlpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSkpIHsKLQkJcGNpX3VzaW5nX2RhYyA9IHRydWU7Ci0KLQkJcmVzdWx0ID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpOwotCQlpZiAocmVzdWx0ICE9IDApIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCQkgICJVbmFibGUgdG8gb2J0YWluIDY0IGJpdCBETUEgZm9yIGNvbnNpc3RlbnQgYWxsb2NhdGlvbnNcbiIpOwotCQkJZ290byBlcnJfcmVsZWFzZV9yZXM7Ci0JCX0KLQl9IGVsc2UgaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpKSB7Ci0JCXBjaV91c2luZ19kYWMgPSBmYWxzZTsKLQl9IGVsc2UgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkiTm8gdXNhYmxlIERNQSBhZGRyZXNzaW5nIG1ldGhvZFxuIik7Ci0JCXJlc3VsdCA9IC1FSU87Ci0JCWdvdG8gZXJyX3JlbGVhc2VfcmVzOwotCX0KLQotCS8qIEFsbG9jYXRlIG5ldGRldiBhbmQgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHMgKi8KLQluZXRkZXYgPSBldDEzMXhfZGV2aWNlX2FsbG9jKCk7Ci0JaWYgKG5ldGRldiA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNvdWxkbid0IGFsbG9jIG5ldGRldiBzdHJ1Y3RcbiIpOwotCQlyZXN1bHQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9yZWxlYXNlX3JlczsKLQl9Ci0JYWRhcHRlciA9IGV0MTMxeF9hZGFwdGVyX2luaXQobmV0ZGV2LCBwZGV2KTsKLQkvKiBJbml0aWFsaXNlIHRoZSBQQ0kgc2V0dXAgZm9yIHRoZSBkZXZpY2UgKi8KLQlldDEzMXhfcGNpX2luaXQoYWRhcHRlciwgcGRldik7Ci0KLQkvKiBNYXAgdGhlIGJ1cy1yZWxhdGl2ZSByZWdpc3RlcnMgdG8gc3lzdGVtIHZpcnR1YWwgbWVtb3J5ICovCi0JYWRhcHRlci0+cmVncyA9IHBjaV9pb3JlbWFwX2JhcihwZGV2LCAwKTsKLQlpZiAoYWRhcHRlci0+cmVncyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBtYXAgZGV2aWNlIHJlZ2lzdGVyc1xuIik7Ci0JCXJlc3VsdCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2ZyZWVfZGV2OwotCX0KLQotCS8qIElmIFBoeSBDT01BIG1vZGUgd2FzIGVuYWJsZWQgd2hlbiB3ZSB3ZW50IGRvd24sIGRpc2FibGUgaXQgaGVyZS4gKi8KLQl3cml0ZWwoRVRfUE1DU1JfSU5JVCwgICZhZGFwdGVyLT5yZWdzLT5nbG9iYWwucG1fY3NyKTsKLQotCS8qIElzc3VlIGEgZ2xvYmFsIHJlc2V0IHRvIHRoZSBldDEzMTAgKi8KLQlldDEzMXhfc29mdF9yZXNldChhZGFwdGVyKTsKLQotCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKHBhcmFub2lkKSAqLwotCWV0MTMxeF9kaXNhYmxlX2ludGVycnVwdHMoYWRhcHRlcik7Ci0KLQkvKiBBbGxvY2F0ZSBETUEgbWVtb3J5ICovCi0JcmVzdWx0ID0gZXQxMzF4X2FkYXB0ZXJfbWVtb3J5X2FsbG9jKGFkYXB0ZXIpOwotCWlmIChyZXN1bHQgIT0gMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDb3VsZCBub3QgYWxsb2MgYWRhcGF0ZXIgbWVtb3J5IChETUEpXG4iKTsKLQkJZ290byBlcnJfaW91bm1hcDsKLQl9Ci0KLQkvKiBJbml0IHNlbmQgZGF0YSBzdHJ1Y3R1cmVzICovCi0JZXQxMzF4X2luaXRfc2VuZChhZGFwdGVyKTsKLQotCS8qCi0JICogU2V0IHVwIHRoZSB0YXNrIHN0cnVjdHVyZSBmb3IgdGhlIElTUidzIGRlZmVycmVkIGhhbmRsZXIKLQkgKi8KLQlJTklUX1dPUksoJmFkYXB0ZXItPnRhc2ssIGV0MTMxeF9pc3JfaGFuZGxlcik7Ci0KLQkvKiBDb3B5IGFkZHJlc3MgaW50byB0aGUgbmV0X2RldmljZSBzdHJ1Y3QgKi8KLQltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRhcHRlci0+YWRkciwgRVRIX0FMRU4pOwotCi0JLyogU2V0dXAgZXQxMzEwIGFzIHBlciB0aGUgZG9jdW1lbnRhdGlvbiAqLwotCWV0MTMxeF9hZGFwdGVyX3NldHVwKGFkYXB0ZXIpOwotCi0JLyogQ3JlYXRlIGEgdGltZXIgdG8gY291bnQgZXJyb3JzIHJlY2VpdmVkIGJ5IHRoZSBOSUMgKi8KLQlpbml0X3RpbWVyKCZhZGFwdGVyLT5FcnJvclRpbWVyKTsKLQotCWFkYXB0ZXItPkVycm9yVGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBUWF9FUlJPUl9QRVJJT0QgKiBIWiAvIDEwMDA7Ci0JYWRhcHRlci0+RXJyb3JUaW1lci5mdW5jdGlvbiA9IGV0MTMxeF9lcnJvcl90aW1lcl9oYW5kbGVyOwotCWFkYXB0ZXItPkVycm9yVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWFkYXB0ZXI7Ci0KLQkvKiBJbml0aWFsaXplIGxpbmsgc3RhdGUgKi8KLQlldDEzMXhfbGlua19kZXRlY3Rpb25faGFuZGxlcigodW5zaWduZWQgbG9uZylhZGFwdGVyKTsKLQotCS8qIEluaXRpYWxpemUgdmFyaWFibGUgZm9yIGNvdW50aW5nIGhvdyBsb25nIHdlIGRvIG5vdCBoYXZlCi0JCQkJCQkJbGluayBzdGF0dXMgKi8KLQlhZGFwdGVyLT5ib290X2NvbWEgPSAwOwotCi0JLyogV2UgY2FuIGVuYWJsZSBpbnRlcnJ1cHRzIG5vdwotCSAqCi0JICogIE5PVEUgLSBCZWNhdXNlIHJlZ2lzdHJhdGlvbiBvZiBpbnRlcnJ1cHQgaGFuZGxlciBpcyBkb25lIGluIHRoZQotCSAqICAgICAgICAgZGV2aWNlJ3Mgb3BlbigpLCBkZWZlciBlbmFibGluZyBkZXZpY2UgaW50ZXJydXB0cyB0byB0aGF0Ci0JICogICAgICAgICBwb2ludAotCSAqLwotCi0JLyogUmVnaXN0ZXIgdGhlIG5ldF9kZXZpY2Ugc3RydWN0IHdpdGggdGhlIExpbnV4IG5ldHdvcmsgbGF5ZXIgKi8KLQlyZXN1bHQgPSByZWdpc3Rlcl9uZXRkZXYobmV0ZGV2KTsKLQlpZiAocmVzdWx0ICE9IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVnaXN0ZXJfbmV0ZGV2KCkgZmFpbGVkXG4iKTsKLQkJZ290byBlcnJfbWVtX2ZyZWU7Ci0JfQotCi0JLyogUmVnaXN0ZXIgdGhlIG5ldF9kZXZpY2Ugc3RydWN0IHdpdGggdGhlIFBDSSBzdWJzeXN0ZW0uIFNhdmUgYSBjb3B5Ci0JICogb2YgdGhlIFBDSSBjb25maWcgc3BhY2UgZm9yIHRoaXMgZGV2aWNlIG5vdyB0aGF0IHRoZSBkZXZpY2UgaGFzCi0JICogYmVlbiBpbml0aWFsaXplZCwganVzdCBpbiBjYXNlIGl0IG5lZWRzIHRvIGJlIHF1aWNrbHkgcmVzdG9yZWQuCi0JICovCi0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIG5ldGRldik7Ci0JcGNpX3NhdmVfc3RhdGUoYWRhcHRlci0+cGRldik7Ci0JcmV0dXJuIHJlc3VsdDsKLQotZXJyX21lbV9mcmVlOgotCWV0MTMxeF9hZGFwdGVyX21lbW9yeV9mcmVlKGFkYXB0ZXIpOwotZXJyX2lvdW5tYXA6Ci0JaW91bm1hcChhZGFwdGVyLT5yZWdzKTsKLWVycl9mcmVlX2RldjoKLQlwY2lfZGV2X3B1dChwZGV2KTsKLQlmcmVlX25ldGRldihuZXRkZXYpOwotZXJyX3JlbGVhc2VfcmVzOgotCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci1lcnJfZGlzYWJsZToKLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBldDEzMXhfcGNpX3JlbW92ZQotICogQHBkZXY6IGEgcG9pbnRlciB0byB0aGUgZGV2aWNlJ3MgcGNpX2RldiBzdHJ1Y3R1cmUKLSAqCi0gKiBSZWdpc3RlcmVkIGluIHRoZSBwY2lfZHJpdmVyIHN0cnVjdHVyZSwgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUKLSAqIFBDSSBzdWJzeXN0ZW0gZGV0ZWN0cyB0aGF0IGEgUENJIGRldmljZSB3aGljaCBtYXRjaGVzIHRoZSBpbmZvcm1hdGlvbgotICogY29udGFpbmVkIGluIHRoZSBwY2lfZGV2aWNlX2lkIHRhYmxlIGhhcyBiZWVuIHJlbW92ZWQuCi0gKi8KLQotc3RhdGljIHZvaWQgX19kZXZleGl0IGV0MTMxeF9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7Ci0Jc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyOwotCi0JLyogUmV0cmlldmUgdGhlIG5ldF9kZXZpY2UgcG9pbnRlciBmcm9tIHRoZSBwY2lfZGV2IHN0cnVjdCwgYXMgd2VsbAotCSAqIGFzIHRoZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0Ci0JICovCi0JbmV0ZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCWFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JLyogUGVyZm9ybSBkZXZpY2UgY2xlYW51cCAqLwotCXVucmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7Ci0JZXQxMzF4X2FkYXB0ZXJfbWVtb3J5X2ZyZWUoYWRhcHRlcik7Ci0JaW91bm1hcChhZGFwdGVyLT5yZWdzKTsKLQlwY2lfZGV2X3B1dChhZGFwdGVyLT5wZGV2KTsKLQlmcmVlX25ldGRldihuZXRkZXYpOwotCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotfQotCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZXQxMzF4X3BjaV90YWJsZVtdIF9fZGV2aW5pdGRhdGEgPSB7Ci0Je0VUMTMxWF9QQ0lfVkVORE9SX0lELCBFVDEzMVhfUENJX0RFVklDRV9JRF9HSUcsIFBDSV9BTllfSUQsCi0JIFBDSV9BTllfSUQsIDAsIDAsIDBVTH0sCi0Je0VUMTMxWF9QQ0lfVkVORE9SX0lELCBFVDEzMVhfUENJX0RFVklDRV9JRF9GQVNULCBQQ0lfQU5ZX0lELAotCSBQQ0lfQU5ZX0lELCAwLCAwLCAwVUx9LAotCXswLH0KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBldDEzMXhfcGNpX3RhYmxlKTsKLQotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGV0MTMxeF9kcml2ZXIgPSB7Ci0JLm5hbWUJCT0gRFJJVkVSX05BTUUsCi0JLmlkX3RhYmxlCT0gZXQxMzF4X3BjaV90YWJsZSwKLQkucHJvYmUJCT0gZXQxMzF4X3BjaV9zZXR1cCwKLQkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGV0MTMxeF9wY2lfcmVtb3ZlKSwKLQkuc3VzcGVuZAk9IE5VTEwsCQkvKiBldDEzMXhfcGNpX3N1c3BlbmQgKi8KLQkucmVzdW1lCQk9IE5VTEwsCQkvKiBldDEzMXhfcGNpX3Jlc3VtZSAqLwotfTsKLQotCi0vKioKLSAqIGV0MTMxeF9pbml0X21vZHVsZSAtIFRoZSAibWFpbiIgZW50cnkgcG9pbnQgY2FsbGVkIG9uIGRyaXZlciBpbml0aWFsaXphdGlvbgotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGV0MTMxeF9pbml0X21vZHVsZSh2b2lkKQotewotCWlmIChldDEzMXhfc3BlZWRfc2V0IDwgUEFSTV9TUEVFRF9EVVBMRVhfTUlOIHx8Ci0JICAgIGV0MTMxeF9zcGVlZF9zZXQgPiBQQVJNX1NQRUVEX0RVUExFWF9NQVgpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZXQxMzF4OiBpbnZhbGlkIHNwZWVkIHNldHRpbmcgaWdub3JlZC5cbiIpOwotCQlldDEzMXhfc3BlZWRfc2V0ID0gMDsKLQl9Ci0JcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmV0MTMxeF9kcml2ZXIpOwotfQotCi0vKioKLSAqIGV0MTMxeF9jbGVhbnVwX21vZHVsZSAtIFRoZSBlbnRyeSBwb2ludCBjYWxsZWQgb24gZHJpdmVyIGNsZWFudXAKLSAqLwotc3RhdGljIHZvaWQgX19leGl0IGV0MTMxeF9jbGVhbnVwX21vZHVsZSh2b2lkKQotewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZXQxMzF4X2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGV0MTMxeF9pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChldDEzMXhfY2xlYW51cF9tb2R1bGUpOwotCi0vKiBNb2RpbmZvIHBhcmFtZXRlcnMgKGZpbGxlZCBvdXQgdXNpbmcgZGVmaW5lcyBmcm9tIGV0MTMxeF92ZXJzaW9uLmgpICovCi1NT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwotTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9JTkZPKTsKLU1PRFVMRV9MSUNFTlNFKERSSVZFUl9MSUNFTlNFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X2lzci5jIGIvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfaXNyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMzMyMDkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfaXNyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODAgKzAsMCBAQAotLyoKLSAqIEFnZXJlIFN5c3RlbXMgSW5jLgotICogMTAvMTAwLzEwMDAgQmFzZS1UIEV0aGVybmV0IERyaXZlciBmb3IgdGhlIEVUMTMwMSBhbmQgRVQxMzF4IHNlcmllcyBNQUNzCi0gKgotICogQ29weXJpZ2h0IMKpIDIwMDUgQWdlcmUgU3lzdGVtcyBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogICBodHRwOi8vd3d3LmFnZXJlLmNvbQotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogZXQxMzF4X2lzci5jIC0gRmlsZSB3aGljaCBjb250YWlucyB0aGUgSVNSLCBJU1IgaGFuZGxlciwgYW5kIHJlbGF0ZWQgcm91dGluZXMKLSAqICAgICAgICAgICAgICAgIGZvciBwcm9jZXNzaW5nIGludGVycnVwdHMgZnJvbSB0aGUgZGV2aWNlLgotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogU09GVFdBUkUgTElDRU5TRQotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAotICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwotICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbwotICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgotICoKLSAqIENvcHlyaWdodCDCqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICoKLSAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCi0gKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwotICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCi0gKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBEaXNjbGFpbWVyCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCi0gKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCi0gKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgotICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLSAqIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImV0MTMxeF92ZXJzaW9uLmgiCi0jaW5jbHVkZSAiZXQxMzF4X2RlZnMuaCIKLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLQotI2luY2x1ZGUgImV0MTMxMF9waHkuaCIKLSNpbmNsdWRlICJldDEzMXhfYWRhcHRlci5oIgotI2luY2x1ZGUgImV0MTMxeC5oIgotCi0vKgotICogRm9yIGludGVycnVwdHMsIG5vcm1hbCBydW5uaW5nIGlzOgotICogICAgICAgcnhkbWFfeGZyX2RvbmUsIHBoeV9pbnRlcnJ1cHQsIG1hY19zdGF0X2ludGVycnVwdCwKLSAqICAgICAgIHdhdGNoZG9nX2ludGVycnVwdCAmIHR4ZG1hX3hmZXJfZG9uZQotICoKLSAqIEluIGJvdGggY2FzZXMsIHdoZW4gZmxvdyBjb250cm9sIGlzIGVuYWJsZWQgZm9yIGVpdGhlciBUeCBvciBiaS1kaXJlY3Rpb24sCi0gKiB3ZSBhZGRpdGlvbmFsIGVuYWJsZSByeF9mYnIwX2xvdyBhbmQgcnhfZmJyMV9sb3csIHNvIHdlIGtub3cgd2hlbiB0aGUKLSAqIGJ1ZmZlciByaW5ncyBhcmUgcnVubmluZyBsb3cuCi0gKi8KLSNkZWZpbmUgSU5UX01BU0tfRElTQUJMRSAgICAgICAgICAgIDB4ZmZmZmZmZmYKLQotLyogTk9URTogTWFza2luZyBvdXQgTUFDX1NUQVQgSW50ZXJydXB0IGZvciBub3cuLi4KLSAqICNkZWZpbmUgSU5UX01BU0tfRU5BQkxFICAgICAgICAgICAgIDB4ZmZmNmJmMTcKLSAqICNkZWZpbmUgSU5UX01BU0tfRU5BQkxFX05PX0ZMT1cgICAgIDB4ZmZmNmJmZDcKLSAqLwotI2RlZmluZSBJTlRfTUFTS19FTkFCTEUgICAgICAgICAgICAgMHhmZmZlYmYxNwotI2RlZmluZSBJTlRfTUFTS19FTkFCTEVfTk9fRkxPVyAgICAgMHhmZmZlYmZkNwotCi0KLS8qKgotICoJZXQxMzF4X2VuYWJsZV9pbnRlcnJ1cHRzCS0JZW5hYmxlIGludGVycnVwdAotICoJQGFkYXB0ZXI6IGV0MTMxeCBkZXZpY2UKLSAqCi0gKglFbmFibGUgdGhlIGFwcHJvcHJpYXRlIGludGVycnVwdHMgb24gdGhlIEVUMTMxeCBhY2NvcmRpbmcgdG8gb3VyCi0gKgljb25maWd1cmF0aW9uCi0gKi8KLQotdm9pZCBldDEzMXhfZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyKQotewotCXUzMiBtYXNrOwotCi0JLyogRW5hYmxlIGFsbCBnbG9iYWwgaW50ZXJydXB0cyAqLwotCWlmIChhZGFwdGVyLT5mbG93Y29udHJvbCA9PSBGTE9XX1RYT05MWSB8fCBhZGFwdGVyLT5mbG93Y29udHJvbCA9PSBGTE9XX0JPVEgpCi0JCW1hc2sgPSBJTlRfTUFTS19FTkFCTEU7Ci0JZWxzZQotCQltYXNrID0gSU5UX01BU0tfRU5BQkxFX05PX0ZMT1c7Ci0KLQlhZGFwdGVyLT5DYWNoZWRNYXNrVmFsdWUgPSBtYXNrOwotCXdyaXRlbChtYXNrLCAmYWRhcHRlci0+cmVncy0+Z2xvYmFsLmludF9tYXNrKTsKLX0KLQotLyoqCi0gKglldDEzMXhfZGlzYWJsZV9pbnRlcnJ1cHRzCS0JaW50ZXJydXB0IGRpc2FibGUKLSAqCUBhZGFwdGVyOiBldDEzMXggZGV2aWNlCi0gKgotICoJQmxvY2sgYWxsIGludGVycnVwdHMgZnJvbSB0aGUgZXQxMzF4IGRldmljZSBhdCB0aGUgZGV2aWNlIGl0c2VsZgotICovCi0KLXZvaWQgZXQxMzF4X2Rpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JLyogRGlzYWJsZSBhbGwgZ2xvYmFsIGludGVycnVwdHMgKi8KLQlhZGFwdGVyLT5DYWNoZWRNYXNrVmFsdWUgPSBJTlRfTUFTS19ESVNBQkxFOwotCXdyaXRlbChJTlRfTUFTS19ESVNBQkxFLCAmYWRhcHRlci0+cmVncy0+Z2xvYmFsLmludF9tYXNrKTsKLX0KLQotCi0vKioKLSAqIGV0MTMxeF9pc3IgLSBUaGUgSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZSBmb3IgdGhlIGRyaXZlci4KLSAqIEBpcnE6IHRoZSBJUlEgb24gd2hpY2ggdGhlIGludGVycnVwdCB3YXMgcmVjZWl2ZWQuCi0gKiBAZGV2X2lkOiBkZXZpY2Utc3BlY2lmaWMgaW5mbyAoaGVyZSBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlIHN0cnVjdCkKLSAqCi0gKiBSZXR1cm5zIGEgdmFsdWUgaW5kaWNhdGluZyBpZiB0aGUgaW50ZXJydXB0IHdhcyBoYW5kbGVkLgotICovCi0KLWlycXJldHVybl90IGV0MTMxeF9pc3IoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCWJvb2wgaGFuZGxlZCA9IHRydWU7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKLQlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBOVUxMOwotCXUzMiBzdGF0dXM7Ci0KLQlpZiAoIW5ldGlmX2RldmljZV9wcmVzZW50KG5ldGRldikpIHsKLQkJaGFuZGxlZCA9IGZhbHNlOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlhZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQotCS8qIElmIHRoZSBhZGFwdGVyIGlzIGluIGxvdyBwb3dlciBzdGF0ZSwgdGhlbiBpdCBzaG91bGQgbm90Ci0JICogcmVjb2duaXplIGFueSBpbnRlcnJ1cHQKLQkgKi8KLQotCS8qIERpc2FibGUgRGV2aWNlIEludGVycnVwdHMgKi8KLQlldDEzMXhfZGlzYWJsZV9pbnRlcnJ1cHRzKGFkYXB0ZXIpOwotCi0JLyogR2V0IGEgY29weSBvZiB0aGUgdmFsdWUgaW4gdGhlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIKLQkgKiBzbyB3ZSBjYW4gcHJvY2VzcyB0aGUgaW50ZXJydXB0aW5nIHNlY3Rpb24KLQkgKi8KLQlzdGF0dXMgPSByZWFkbCgmYWRhcHRlci0+cmVncy0+Z2xvYmFsLmludF9zdGF0dXMpOwotCi0JaWYgKGFkYXB0ZXItPmZsb3djb250cm9sID09IEZMT1dfVFhPTkxZIHx8Ci0JICAgIGFkYXB0ZXItPmZsb3djb250cm9sID09IEZMT1dfQk9USCkgewotCQlzdGF0dXMgJj0gfklOVF9NQVNLX0VOQUJMRTsKLQl9IGVsc2UgewotCQlzdGF0dXMgJj0gfklOVF9NQVNLX0VOQUJMRV9OT19GTE9XOwotCX0KLQotCS8qIE1ha2Ugc3VyZSB0aGlzIGlzIG91ciBpbnRlcnJ1cHQgKi8KLQlpZiAoIXN0YXR1cykgewotCQloYW5kbGVkID0gZmFsc2U7Ci0JCWV0MTMxeF9lbmFibGVfaW50ZXJydXB0cyhhZGFwdGVyKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogVGhpcyBpcyBvdXIgaW50ZXJydXB0LCBzbyBwcm9jZXNzIGFjY29yZGluZ2x5ICovCi0KLQlpZiAoc3RhdHVzICYgRVRfSU5UUl9XQVRDSERPRykgewotCQlzdHJ1Y3QgdGNiICp0Y2IgPSBhZGFwdGVyLT50eF9yaW5nLnNlbmRfaGVhZDsKLQotCQlpZiAodGNiKQotCQkJaWYgKCsrdGNiLT5zdGFsZSA+IDEpCi0JCQkJc3RhdHVzIHw9IEVUX0lOVFJfVFhETUFfSVNSOwotCi0JCWlmIChhZGFwdGVyLT5yeF9yaW5nLlVuZmluaXNoZWRSZWNlaXZlcykKLQkJCXN0YXR1cyB8PSBFVF9JTlRSX1JYRE1BX1hGUl9ET05FOwotCQllbHNlIGlmICh0Y2IgPT0gTlVMTCkKLQkJCXdyaXRlbCgwLCAmYWRhcHRlci0+cmVncy0+Z2xvYmFsLndhdGNoZG9nX3RpbWVyKTsKLQotCQlzdGF0dXMgJj0gfkVUX0lOVFJfV0FUQ0hET0c7Ci0JfQotCi0JaWYgKHN0YXR1cyA9PSAwKSB7Ci0JCS8qIFRoaXMgaW50ZXJydXB0IGhhcyBpbiBzb21lIHdheSBiZWVuICJoYW5kbGVkIiBieQotCQkgKiB0aGUgSVNSLiBFaXRoZXIgaXQgd2FzIGEgc3B1cmlvdXMgUnggaW50ZXJydXB0LCBvcgotCQkgKiBpdCB3YXMgYSBUeCBpbnRlcnJ1cHQgdGhhdCBoYXMgYmVlbiBmaWx0ZXJlZCBieQotCQkgKiB0aGUgSVNSLgotCQkgKi8KLQkJZXQxMzF4X2VuYWJsZV9pbnRlcnJ1cHRzKGFkYXB0ZXIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBXZSBuZWVkIHRvIHNhdmUgdGhlIGludGVycnVwdCBzdGF0dXMgdmFsdWUgZm9yIHVzZSBpbiBvdXIKLQkgKiBEUEMuIFdlIHdpbGwgY2xlYXIgdGhlIHNvZnR3YXJlIGNvcHkgb2YgdGhhdCBpbiB0aGF0Ci0JICogcm91dGluZS4KLQkgKi8KLQlhZGFwdGVyLT5zdGF0cy5JbnRlcnJ1cHRTdGF0dXMgPSBzdGF0dXM7Ci0KLQkvKiBTY2hlZHVsZSB0aGUgSVNSIGhhbmRsZXIgYXMgYSBib3R0b20taGFsZiB0YXNrIGluIHRoZQotCSAqIGtlcm5lbCdzIHRxX2ltbWVkaWF0ZSBxdWV1ZSwgYW5kIG1hcmsgdGhlIHF1ZXVlIGZvcgotCSAqIGV4ZWN1dGlvbgotCSAqLwotCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPnRhc2spOwotb3V0OgotCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOwotfQotCi0vKioKLSAqIGV0MTMxeF9pc3JfaGFuZGxlciAtIFRoZSBJU1IgaGFuZGxlcgotICogQHBfYWRhcHRlciwgYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UncyBwcml2YXRlIGFkYXB0ZXIgc3RydWN0dXJlCi0gKgotICogc2NoZWR1bGVkIHRvIHJ1biBpbiBhIGRlZmVycmVkIGNvbnRleHQgYnkgdGhlIElTUi4gVGhpcyBpcyB3aGVyZSB0aGUgSVNSJ3MKLSAqIHdvcmsgYWN0dWFsbHkgZ2V0cyBkb25lLgotICovCi12b2lkIGV0MTMxeF9pc3JfaGFuZGxlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIsIHRhc2spOwotCXUzMiBzdGF0dXMgPSBldGRldi0+c3RhdHMuSW50ZXJydXB0U3RhdHVzOwotCXN0cnVjdCBhZGRyZXNzX21hcCBfX2lvbWVtICppb21lbSA9IGV0ZGV2LT5yZWdzOwotCi0JLyoKLQkgKiBUaGVzZSBmaXJzdCB0d28gYXJlIGJ5IGZhciB0aGUgbW9zdCBjb21tb24uICBPbmNlIGhhbmRsZWQsIHdlIGNsZWFyCi0JICogdGhlaXIgdHdvIGJpdHMgaW4gdGhlIHN0YXR1cyB3b3JkLiAgSWYgdGhlIHdvcmQgaXMgbm93IHplcm8sIHdlCi0JICogZXhpdC4KLQkgKi8KLQkvKiBIYW5kbGUgYWxsIHRoZSBjb21wbGV0ZWQgVHJhbnNtaXQgaW50ZXJydXB0cyAqLwotCWlmIChzdGF0dXMgJiBFVF9JTlRSX1RYRE1BX0lTUikKLQkJZXQxMzF4X2hhbmRsZV9zZW5kX2ludGVycnVwdChldGRldik7Ci0KLQkvKiBIYW5kbGUgYWxsIHRoZSBjb21wbGV0ZWQgUmVjZWl2ZXMgaW50ZXJydXB0cyAqLwotCWlmIChzdGF0dXMgJiBFVF9JTlRSX1JYRE1BX1hGUl9ET05FKQotCQlldDEzMXhfaGFuZGxlX3JlY3ZfaW50ZXJydXB0KGV0ZGV2KTsKLQotCXN0YXR1cyAmPSAweGZmZmZmZmQ3OwotCi0JaWYgKHN0YXR1cykgewotCQkvKiBIYW5kbGUgdGhlIFRYRE1BIEVycm9yIGludGVycnVwdCAqLwotCQlpZiAoc3RhdHVzICYgRVRfSU5UUl9UWERNQV9FUlIpIHsKLQkJCXUzMiB0eGRtYV9lcnI7Ci0KLQkJCS8qIEZvbGxvd2luZyByZWFkIGFsc28gY2xlYXJzIHRoZSByZWdpc3RlciAoQ09SKSAqLwotCQkJdHhkbWFfZXJyID0gcmVhZGwoJmlvbWVtLT50eGRtYS50eF9kbWFfZXJyb3IpOwotCi0JCQlkZXZfd2FybigmZXRkZXYtPnBkZXYtPmRldiwKLQkJCQkgICAgIlRYRE1BX0VSUiBpbnRlcnJ1cHQsIGVycm9yID0gJWRcbiIsCi0JCQkJICAgIHR4ZG1hX2Vycik7Ci0JCX0KLQotCQkvKiBIYW5kbGUgRnJlZSBCdWZmZXIgUmluZyAwIGFuZCAxIExvdyBpbnRlcnJ1cHQgKi8KLQkJaWYgKHN0YXR1cyAmIChFVF9JTlRSX1JYRE1BX0ZCX1IwX0xPVyB8IEVUX0lOVFJfUlhETUFfRkJfUjFfTE9XKSkgewotCQkJLyoKLQkJCSAqIFRoaXMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgdW51c2VkIGJ1ZmZlcnMgaW4KLQkJCSAqIFJYRE1BIGZyZWUgYnVmZmVyIHJpbmcgMCBpcyA8PSB0aGUgbGltaXQgeW91Ci0JCQkgKiBwcm9ncmFtbWVkLiBGcmVlIGJ1ZmZlciByZXNvdXJjZXMgbmVlZCB0byBiZQotCQkJICogcmV0dXJuZWQuICBGcmVlIGJ1ZmZlcnMgYXJlIGNvbnN1bWVkIGFzIHBhY2tldHMKLQkJCSAqIGFyZSBwYXNzZWQgZnJvbSB0aGUgbmV0d29yayB0byB0aGUgaG9zdC4gVGhlIGhvc3QKLQkJCSAqIGJlY29tZXMgYXdhcmUgb2YgdGhlIHBhY2tldHMgZnJvbSB0aGUgY29udGVudHMgb2YKLQkJCSAqIHRoZSBwYWNrZXQgc3RhdHVzIHJpbmcuIFRoaXMgcmluZyBpcyBxdWVyaWVkIHdoZW4KLQkJCSAqIHRoZSBwYWNrZXQgZG9uZSBpbnRlcnJ1cHQgb2NjdXJzLiBQYWNrZXRzIGFyZSB0aGVuCi0JCQkgKiBwYXNzZWQgdG8gdGhlIE9TLiBXaGVuIHRoZSBPUyBpcyBkb25lIHdpdGggdGhlCi0JCQkgKiBwYWNrZXRzIHRoZSByZXNvdXJjZXMgY2FuIGJlIHJldHVybmVkIHRvIHRoZQotCQkJICogRVQxMzEwIGZvciByZS11c2UuIFRoaXMgaW50ZXJydXB0IGlzIG9uZSBtZXRob2Qgb2YKLQkJCSAqIHJldHVybmluZyByZXNvdXJjZXMuCi0JCQkgKi8KLQotCQkJLyogSWYgdGhlIHVzZXIgaGFzIGZsb3cgY29udHJvbCBvbiwgdGhlbiB3ZSB3aWxsCi0JCQkgKiBzZW5kIGEgcGF1c2UgcGFja2V0LCBvdGhlcndpc2UganVzdCBleGl0Ci0JCQkgKi8KLQkJCWlmIChldGRldi0+Zmxvd2NvbnRyb2wgPT0gRkxPV19UWE9OTFkgfHwKLQkJCSAgICBldGRldi0+Zmxvd2NvbnRyb2wgPT0gRkxPV19CT1RIKSB7Ci0JCQkJdTMyIHBtX2NzcjsKLQotCQkJCS8qIFRlbGwgdGhlIGRldmljZSB0byBzZW5kIGEgcGF1c2UgcGFja2V0IHZpYQotCQkJCSAqIHRoZSBiYWNrIHByZXNzdXJlIHJlZ2lzdGVyIChicCByZXEgIGFuZAotCQkJCSAqIGJwIHhvbi94b2ZmKQotCQkJCSAqLwotCQkJCXBtX2NzciA9IHJlYWRsKCZpb21lbS0+Z2xvYmFsLnBtX2Nzcik7Ci0JCQkJaWYgKChwbV9jc3IgJiBFVF9QTV9QSFlfU1dfQ09NQSkgPT0gMCkKLQkJCQkJd3JpdGVsKDMsICZpb21lbS0+dHhtYWMuYnBfY3RybCk7Ci0JCQl9Ci0JCX0KLQotCQkvKiBIYW5kbGUgUGFja2V0IFN0YXR1cyBSaW5nIExvdyBJbnRlcnJ1cHQgKi8KLQkJaWYgKHN0YXR1cyAmIEVUX0lOVFJfUlhETUFfU1RBVF9MT1cpIHsKLQotCQkJLyoKLQkJCSAqIFNhbWUgaWRlYSBhcyB3aXRoIHRoZSB0d28gRnJlZSBCdWZmZXIgUmluZ3MuCi0JCQkgKiBQYWNrZXRzIGdvaW5nIGZyb20gdGhlIG5ldHdvcmsgdG8gdGhlIGhvc3QgZWFjaAotCQkJICogY29uc3VtZSBhIGZyZWUgYnVmZmVyIHJlc291cmNlIGFuZCBhIHBhY2tldCBzdGF0dXMKLQkJCSAqIHJlc291cmNlLiAgVGhlc2UgcmVzb3VyZXMgYXJlIHBhc3NlZCB0byB0aGUgT1MuCi0JCQkgKiBXaGVuIHRoZSBPUyBpcyBkb25lIHdpdGggdGhlIHJlc291cmNlcywgdGhleSBuZWVkCi0JCQkgKiB0byBiZSByZXR1cm5lZCB0byB0aGUgRVQxMzEwLiBUaGlzIGlzIG9uZSBtZXRob2QKLQkJCSAqIG9mIHJldHVybmluZyB0aGUgcmVzb3VyY2VzLgotCQkJICovCi0JCX0KLQotCQkvKiBIYW5kbGUgUlhETUEgRXJyb3IgSW50ZXJydXB0ICovCi0JCWlmIChzdGF0dXMgJiBFVF9JTlRSX1JYRE1BX0VSUikgewotCQkJLyoKLQkJCSAqIFRoZSByeGRtYV9lcnJvciBpbnRlcnJ1cHQgaXMgc2VudCB3aGVuIGEgdGltZS1vdXQKLQkJCSAqIG9uIGEgcmVxdWVzdCBpc3N1ZWQgYnkgdGhlIEpBR0NvcmUgaGFzIG9jY3VycmVkIG9yCi0JCQkgKiBhIGNvbXBsZXRpb24gaXMgcmV0dXJuZWQgd2l0aCBhbiB1bi1zdWNjZXNzZnVsCi0JCQkgKiBzdGF0dXMuICBJbiBib3RoIGNhc2VzIHRoZSByZXF1ZXN0IGlzIGNvbnNpZGVyZWQKLQkJCSAqIGNvbXBsZXRlLiBUaGUgSkFHQ29yZSB3aWxsIGF1dG9tYXRpY2FsbHkgcmUtdHJ5IHRoZQotCQkJICogcmVxdWVzdCBpbiBxdWVzdGlvbi4gTm9ybWFsbHkgaW5mb3JtYXRpb24gb24gZXZlbnRzCi0JCQkgKiBsaWtlIHRoZXNlIGFyZSBzZW50IHRvIHRoZSBob3N0IHVzaW5nIHRoZSAiQWR2YW5jZWQKLQkJCSAqIEVycm9yIFJlcG9ydGluZyIgY2FwYWJpbGl0eS4gVGhpcyBpbnRlcnJ1cHQgaXMKLQkJCSAqIGFub3RoZXIgd2F5IG9mIGdldHRpbmcgc2ltaWxhciBpbmZvcm1hdGlvbi4gVGhlCi0JCQkgKiBvbmx5IHRoaW5nIHJlcXVpcmVkIGlzIHRvIGNsZWFyIHRoZSBpbnRlcnJ1cHQgYnkKLQkJCSAqIHJlYWRpbmcgdGhlIElTUiBpbiB0aGUgZ2xvYmFsIHJlc291cmNlcy4gVGhlCi0JCQkgKiBKQUdDb3JlIHdpbGwgZG8gYSByZS10cnkgb24gdGhlIHJlcXVlc3QuICBOb3JtYWxseQotCQkJICogeW91IHNob3VsZCBuZXZlciBzZWUgdGhpcyBpbnRlcnJ1cHQuIElmIHlvdSBzdGFydAotCQkJICogdG8gc2VlIHRoaXMgaW50ZXJydXB0IG9jY3VycmluZyBmcmVxdWVudGx5IHRoZW4KLQkJCSAqIHNvbWV0aGluZyBiYWQgaGFzIG9jY3VycmVkLiBBIHJlc2V0IG1pZ2h0IGJlIHRoZQotCQkJICogdGhpbmcgdG8gZG8uCi0JCQkgKi8KLQkJCS8qIFRSQVAoKTsqLwotCi0JCQlkZXZfd2FybigmZXRkZXYtPnBkZXYtPmRldiwKLQkJCQkgICAgIlJ4RE1BX0VSUiBpbnRlcnJ1cHQsIGVycm9yICV4XG4iLAotCQkJCSAgICByZWFkbCgmaW9tZW0tPnR4bWFjLnR4X3Rlc3QpKTsKLQkJfQotCi0JCS8qIEhhbmRsZSB0aGUgV2FrZSBvbiBMQU4gRXZlbnQgKi8KLQkJaWYgKHN0YXR1cyAmIEVUX0lOVFJfV09MKSB7Ci0JCQkvKgotCQkJICogVGhpcyBpcyBhIHNlY29uZGFyeSBpbnRlcnJ1cHQgZm9yIHdha2Ugb24gTEFOLgotCQkJICogVGhlIGRyaXZlciBzaG91bGQgbmV2ZXIgc2VlIHRoaXMsIGlmIGl0IGRvZXMsCi0JCQkgKiBzb21ldGhpbmcgc2VyaW91cyBpcyB3cm9uZy4gV2Ugd2lsbCBUUkFQIHRoZQotCQkJICogbWVzc2FnZSB3aGVuIHdlIGFyZSBpbiBEQkcgbW9kZSwgb3RoZXJ3aXNlIHdlCi0JCQkgKiB3aWxsIGlnbm9yZSBpdC4KLQkJCSAqLwotCQkJZGV2X2VycigmZXRkZXYtPnBkZXYtPmRldiwgIldBS0VfT05fTEFOIGludGVycnVwdFxuIik7Ci0JCX0KLQotCQkvKiBIYW5kbGUgdGhlIFBIWSBpbnRlcnJ1cHQgKi8KLQkJaWYgKHN0YXR1cyAmIEVUX0lOVFJfUEhZKSB7Ci0JCQl1MzIgcG1fY3NyOwotCQkJdTE2IGJtc3JfaW50czsKLQkJCXUxNiBibXNyX2RhdGE7Ci0JCQl1MTYgbXlpc3I7Ci0KLQkJCS8qIElmIHdlIGFyZSBpbiBjb21hIG1vZGUgd2hlbiB3ZSBnZXQgdGhpcyBpbnRlcnJ1cHQsCi0JCQkgKiB3ZSBuZWVkIHRvIGRpc2FibGUgaXQuCi0JCQkgKi8KLQkJCXBtX2NzciA9IHJlYWRsKCZpb21lbS0+Z2xvYmFsLnBtX2Nzcik7Ci0JCQlpZiAocG1fY3NyICYgRVRfUE1fUEhZX1NXX0NPTUEpIHsKLQkJCQkvKgotCQkJCSAqIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgaW4gY29tYSBtb2RlIGFuZCBpZgotCQkJCSAqIHNvLCBkaXNhYmxlIGl0IGJlY2F1c2Ugd2Ugd2lsbCBub3QgYmUgYWJsZQotCQkJCSAqIHRvIHJlYWQgUEhZIHZhbHVlcyB1bnRpbCB3ZSBhcmUgb3V0LgotCQkJCSAqLwotCQkJCURpc2FibGVQaHlDb21hKGV0ZGV2KTsKLQkJCX0KLQotCQkJLyogUmVhZCB0aGUgUEhZIElTUiB0byBjbGVhciB0aGUgcmVhc29uIGZvciB0aGUKLQkJCSAqIGludGVycnVwdC4KLQkJCSAqLwotCQkJTWlSZWFkKGV0ZGV2LCAodWludDhfdCkgb2Zmc2V0b2Yoc3RydWN0IG1pX3JlZ3MsIGlzciksCi0JCQkgICAgICAgJm15aXNyKTsKLQotCQkJaWYgKCFldGRldi0+UmVwbGljYVBoeUxvb3BiaykgewotCQkJCU1pUmVhZChldGRldiwKLQkJCQkgICAgICAgKHVpbnQ4X3QpIG9mZnNldG9mKHN0cnVjdCBtaV9yZWdzLCBibXNyKSwKLQkJCQkgICAgICAgJmJtc3JfZGF0YSk7Ci0KLQkJCQlibXNyX2ludHMgPSBldGRldi0+Ym1zciBeIGJtc3JfZGF0YTsKLQkJCQlldGRldi0+Ym1zciA9IGJtc3JfZGF0YTsKLQotCQkJCS8qIERvIGFsbCB0aGUgY2FibGUgaW4gLyBjYWJsZSBvdXQgc3R1ZmYgKi8KLQkJCQlldDEzMXhfTWlpX2NoZWNrKGV0ZGV2LCBibXNyX2RhdGEsIGJtc3JfaW50cyk7Ci0JCQl9Ci0JCX0KLQotCQkvKiBMZXQncyBtb3ZlIG9uIHRvIHRoZSBUeE1hYyAqLwotCQlpZiAoc3RhdHVzICYgRVRfSU5UUl9UWE1BQykgewotCQkJdTMyIGVyciA9IHJlYWRsKCZpb21lbS0+dHhtYWMuZXJyKTsKLQotCQkJLyoKLQkJCSAqIFdoZW4gYW55IG9mIHRoZSBlcnJvcnMgb2NjdXIgYW5kIFRYTUFDIGdlbmVyYXRlcwotCQkJICogYW4gaW50ZXJydXB0IHRvIHJlcG9ydCB0aGVzZSBlcnJvcnMsIGl0IHVzdWFsbHkKLQkJCSAqIG1lYW5zIHRoYXQgVFhNQUMgaGFzIGRldGVjdGVkIGFuIGVycm9yIGluIHRoZSBkYXRhCi0JCQkgKiBzdHJlYW0gcmV0cmlldmVkIGZyb20gdGhlIG9uLWNoaXAgVHggUS4gQWxsIG9mCi0JCQkgKiB0aGVzZSBlcnJvcnMgYXJlIGNhdGFzdHJvcGhpYyBhbmQgVFhNQUMgd29uJ3QgYmUKLQkJCSAqIGFibGUgdG8gcmVjb3ZlciBkYXRhIHdoZW4gdGhlc2UgZXJyb3JzIG9jY3VyLiAgSW4KLQkJCSAqIGEgbnV0c2hlbGwsIHRoZSB3aG9sZSBUeCBwYXRoIHdpbGwgaGF2ZSB0byBiZSByZXNldAotCQkJICogYW5kIHJlLWNvbmZpZ3VyZWQgYWZ0ZXJ3YXJkcy4KLQkJCSAqLwotCQkJZGV2X3dhcm4oJmV0ZGV2LT5wZGV2LT5kZXYsCi0JCQkJICAgICJUWE1BQyBpbnRlcnJ1cHQsIGVycm9yIDB4JTA4eFxuIiwKLQkJCQkgICAgZXJyKTsKLQotCQkJLyogSWYgd2UgYXJlIGRlYnVnZ2luZywgd2Ugd2FudCB0byBzZWUgdGhpcyBlcnJvciwKLQkJCSAqIG90aGVyd2lzZSB3ZSBqdXN0IHdhbnQgdGhlIGRldmljZSB0byBiZSByZXNldCBhbmQKLQkJCSAqIGNvbnRpbnVlCi0JCQkgKi8KLQkJfQotCi0JCS8qIEhhbmRsZSBSWE1BQyBJbnRlcnJ1cHQgKi8KLQkJaWYgKHN0YXR1cyAmIEVUX0lOVFJfUlhNQUMpIHsKLQkJCS8qCi0JCQkgKiBUaGVzZSBpbnRlcnJ1cHRzIGFyZSBjYXRhc3Ryb3BoaWMgdG8gdGhlIGRldmljZSwKLQkJCSAqIHdoYXQgd2UgbmVlZCB0byBkbyBpcyBkaXNhYmxlIHRoZSBpbnRlcnJ1cHRzIGFuZAotCQkJICogc2V0IHRoZSBmbGFnIHRvIGNhdXNlIHVzIHRvIHJlc2V0IHNvIHdlIGNhbiBzb2x2ZQotCQkJICogdGhpcyBpc3N1ZS4KLQkJCSAqLwotCQkJLyogTVBfU0VUX0ZMQUcoIGV0ZGV2LAotCQkJCQkJZk1QX0FEQVBURVJfSEFSRFdBUkVfRVJST1IpOyAqLwotCi0JCQlkZXZfd2FybigmZXRkZXYtPnBkZXYtPmRldiwKLQkJCSAgIlJYTUFDIGludGVycnVwdCwgZXJyb3IgMHglMDh4LiAgUmVxdWVzdGluZyByZXNldFxuIiwKLQkJCQkgICAgcmVhZGwoJmlvbWVtLT5yeG1hYy5lcnJfcmVnKSk7Ci0KLQkJCWRldl93YXJuKCZldGRldi0+cGRldi0+ZGV2LAotCQkJCSAgICAiRW5hYmxlIDB4JTA4eCwgRGlhZyAweCUwOHhcbiIsCi0JCQkJICAgIHJlYWRsKCZpb21lbS0+cnhtYWMuY3RybCksCi0JCQkJICAgIHJlYWRsKCZpb21lbS0+cnhtYWMucnhxX2RpYWcpKTsKLQotCQkJLyoKLQkJCSAqIElmIHdlIGFyZSBkZWJ1Z2dpbmcsIHdlIHdhbnQgdG8gc2VlIHRoaXMgZXJyb3IsCi0JCQkgKiBvdGhlcndpc2Ugd2UganVzdCB3YW50IHRoZSBkZXZpY2UgdG8gYmUgcmVzZXQgYW5kCi0JCQkgKiBjb250aW51ZQotCQkJICovCi0JCX0KLQotCQkvKiBIYW5kbGUgTUFDX1NUQVQgSW50ZXJydXB0ICovCi0JCWlmIChzdGF0dXMgJiBFVF9JTlRSX01BQ19TVEFUKSB7Ci0JCQkvKgotCQkJICogVGhpcyBtZWFucyBhdCBsZWFzdCBvbmUgb2YgdGhlIHVuLW1hc2tlZCBjb3VudGVycwotCQkJICogaW4gdGhlIE1BQ19TVEFUIGJsb2NrIGhhcyByb2xsZWQgb3Zlci4gIFVzZSB0aGlzCi0JCQkgKiB0byBtYWludGFpbiB0aGUgdG9wLCBzb2Z0d2FyZSBtYW5hZ2VkIGJpdHMgb2YgdGhlCi0JCQkgKiBjb3VudGVyKHMpLgotCQkJICovCi0JCQlIYW5kbGVNYWNTdGF0SW50ZXJydXB0KGV0ZGV2KTsKLQkJfQotCi0JCS8qIEhhbmRsZSBTTFYgVGltZW91dCBJbnRlcnJ1cHQgKi8KLQkJaWYgKHN0YXR1cyAmIEVUX0lOVFJfU0xWX1RJTUVPVVQpIHsKLQkJCS8qCi0JCQkgKiBUaGlzIG1lYW5zIGEgdGltZW91dCBoYXMgb2NjdXJyZWQgb24gYSByZWFkIG9yCi0JCQkgKiB3cml0ZSByZXF1ZXN0IHRvIG9uZSBvZiB0aGUgSkFHQ29yZSByZWdpc3RlcnMuIFRoZQotCQkJICogR2xvYmFsIFJlc291cmNlcyBibG9jayBoYXMgdGVybWluYXRlZCB0aGUgcmVxdWVzdAotCQkJICogYW5kIG9uIGEgcmVhZCByZXF1ZXN0LCByZXR1cm5lZCBhICJmYWtlIiB2YWx1ZS4KLQkJCSAqIFRoZSBtb3N0IGxpa2VseSByZWFzb25zIGFyZTogQmFkIEFkZHJlc3Mgb3IgdGhlCi0JCQkgKiBhZGRyZXNzZWQgbW9kdWxlIGlzIGluIGEgcG93ZXItZG93biBzdGF0ZSBhbmQKLQkJCSAqIGNhbid0IHJlc3BvbmQuCi0JCQkgKi8KLQkJfQotCX0KLQlldDEzMXhfZW5hYmxlX2ludGVycnVwdHMoZXRkZXYpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2V0MTMxeC9ldDEzMXhfbmV0ZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9uZXRkZXYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQwNjYzMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF9uZXRkZXYuYworKysgL2Rldi9udWxsCkBAIC0xLDY4NiArMCwwIEBACi0vKgotICogQWdlcmUgU3lzdGVtcyBJbmMuCi0gKiAxMC8xMDAvMTAwMCBCYXNlLVQgRXRoZXJuZXQgRHJpdmVyIGZvciB0aGUgRVQxMzAxIGFuZCBFVDEzMXggc2VyaWVzIE1BQ3MKLSAqCi0gKiBDb3B5cmlnaHQgwqkgMjAwNSBBZ2VyZSBTeXN0ZW1zIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBldDEzMXhfbmV0ZGV2LmMgLSBSb3V0aW5lcyBhbmQgZGF0YSByZXF1aXJlZCBieSBhbGwgTGludXggbmV0d29yayBkZXZpY2VzLgotICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogU09GVFdBUkUgTElDRU5TRQotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAotICogd2hpY2ggeW91IHNob3VsZCByZWFkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmcgdGhlIHNvZnR3YXJlLiAgVXNpbmcgdGhpcwotICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbwotICogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgotICoKLSAqIENvcHlyaWdodCDCqSAyMDA1IEFnZXJlIFN5c3RlbXMgSW5jLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICoKLSAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCi0gKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwotICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCi0gKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCi0gKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycwotICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBEaXNjbGFpbWVyCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCi0gKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0gKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCi0gKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgotICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCi0gKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLSAqIERBTUFHRS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImV0MTMxeF92ZXJzaW9uLmgiCi0jaW5jbHVkZSAiZXQxMzF4X2RlZnMuaCIKLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotCi0jaW5jbHVkZSA8bGludXgvbWlpLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLQotI2luY2x1ZGUgImV0MTMxMF9waHkuaCIKLSNpbmNsdWRlICJldDEzMTBfdHguaCIKLSNpbmNsdWRlICJldDEzMXhfYWRhcHRlci5oIgotI2luY2x1ZGUgImV0MTMxeC5oIgotCi0vKioKLSAqIGV0MTMxeF9zdGF0cyAtIFJldHVybiB0aGUgY3VycmVudCBkZXZpY2Ugc3RhdGlzdGljcy4KLSAqIEBuZXRkZXY6IGRldmljZSB3aG9zZSBzdGF0cyBhcmUgYmVpbmcgcXVlcmllZAotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqZXQxMzF4X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0Jc3RydWN0IGV0MTMxeF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmYWRhcHRlci0+bmV0X3N0YXRzOwotCXN0cnVjdCBjZV9zdGF0cyAqZGV2c3RhdCA9ICZhZGFwdGVyLT5zdGF0czsKLQotCXN0YXRzLT5yeF9lcnJvcnMgPSBkZXZzdGF0LT5sZW5ndGhfZXJyICsgZGV2c3RhdC0+YWxpZ25tZW50X2VyciArCi0JICAgIGRldnN0YXQtPmNyY19lcnIgKyBkZXZzdGF0LT5jb2RlX3Zpb2xhdGlvbnMgKyBkZXZzdGF0LT5vdGhlcl9lcnJvcnM7Ci0Jc3RhdHMtPnR4X2Vycm9ycyA9IGRldnN0YXQtPm1heF9wa3RfZXJyb3I7Ci0Jc3RhdHMtPm11bHRpY2FzdCA9IGRldnN0YXQtPm11bHRpcmN2OwotCXN0YXRzLT5jb2xsaXNpb25zID0gZGV2c3RhdC0+Y29sbGlzaW9uczsKLQotCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzID0gZGV2c3RhdC0+bGVuZ3RoX2VycjsKLQlzdGF0cy0+cnhfb3Zlcl9lcnJvcnMgPSBkZXZzdGF0LT5yeF9vdl9mbG93OwotCXN0YXRzLT5yeF9jcmNfZXJyb3JzID0gZGV2c3RhdC0+Y3JjX2VycjsKLQotCS8qIE5PVEU6IFRoZXNlIHN0YXRzIGRvbid0IGhhdmUgY29ycmVzcG9uZGluZyB2YWx1ZXMgaW4gQ0VfU1RBVFMsCi0JICogc28gd2UncmUgZ29pbmcgdG8gaGF2ZSB0byB1cGRhdGUgdGhlc2UgZGlyZWN0bHkgZnJvbSB3aXRoaW4gdGhlCi0JICogVFgvUlggY29kZQotCSAqLwotCS8qIHN0YXRzLT5yeF9ieXRlcyAgICAgICAgICAgID0gMjA7IGRldnN0YXQtPjsgKi8KLQkvKiBzdGF0cy0+dHhfYnl0ZXMgICAgICAgICAgICA9IDIwOyAgZGV2c3RhdC0+OyAqLwotCS8qIHN0YXRzLT5yeF9kcm9wcGVkICAgICAgICAgID0gZGV2c3RhdC0+OyAqLwotCS8qIHN0YXRzLT50eF9kcm9wcGVkICAgICAgICAgID0gZGV2c3RhdC0+OyAqLwotCi0JLyogIE5PVEU6IE5vdCB1c2VkLCBjYW4ndCBmaW5kIGFuYWxvZ291cyBzdGF0aXN0aWNzICovCi0JLyogc3RhdHMtPnJ4X2ZyYW1lX2Vycm9ycyAgICAgPSBkZXZzdGF0LT47ICovCi0JLyogc3RhdHMtPnJ4X2ZpZm9fZXJyb3JzICAgICAgPSBkZXZzdGF0LT47ICovCi0JLyogc3RhdHMtPnJ4X21pc3NlZF9lcnJvcnMgICAgPSBkZXZzdGF0LT47ICovCi0KLQkvKiBzdGF0cy0+dHhfYWJvcnRlZF9lcnJvcnMgICA9IGRldnN0YXQtPjsgKi8KLQkvKiBzdGF0cy0+dHhfY2Fycmllcl9lcnJvcnMgICA9IGRldnN0YXQtPjsgKi8KLQkvKiBzdGF0cy0+dHhfZmlmb19lcnJvcnMgICAgICA9IGRldnN0YXQtPjsgKi8KLQkvKiBzdGF0cy0+dHhfaGVhcnRiZWF0X2Vycm9ycyA9IGRldnN0YXQtPjsgKi8KLQkvKiBzdGF0cy0+dHhfd2luZG93X2Vycm9ycyAgICA9IGRldnN0YXQtPjsgKi8KLQlyZXR1cm4gc3RhdHM7Ci19Ci0KLS8qKgotICogZXQxMzF4X29wZW4gLSBPcGVuIHRoZSBkZXZpY2UgZm9yIHVzZS4KLSAqIEBuZXRkZXY6IGRldmljZSB0byBiZSBvcGVuZWQKLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKQotICovCi1pbnQgZXQxMzF4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JLyogU3RhcnQgdGhlIHRpbWVyIHRvIHRyYWNrIE5JQyBlcnJvcnMgKi8KLQlhZGRfdGltZXIoJmFkYXB0ZXItPkVycm9yVGltZXIpOwotCi0JLyogUmVnaXN0ZXIgb3VyIElSUSAqLwotCXJlc3VsdCA9IHJlcXVlc3RfaXJxKG5ldGRldi0+aXJxLCBldDEzMXhfaXNyLCBJUlFGX1NIQVJFRCwKLQkJCQkJbmV0ZGV2LT5uYW1lLCBuZXRkZXYpOwotCWlmIChyZXN1bHQpIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiYyBvdWxkIG5vdCByZWdpc3RlciBJUlEgJWRcbiIsCi0JCQluZXRkZXYtPmlycSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyogRW5hYmxlIHRoZSBUeCBhbmQgUnggRE1BIGVuZ2luZXMgKGlmIG5vdCBhbHJlYWR5IGVuYWJsZWQpICovCi0JZXQxMzF4X3J4X2RtYV9lbmFibGUoYWRhcHRlcik7Ci0JZXQxMzF4X3R4X2RtYV9lbmFibGUoYWRhcHRlcik7Ci0KLQkvKiBFbmFibGUgZGV2aWNlIGludGVycnVwdHMgKi8KLQlldDEzMXhfZW5hYmxlX2ludGVycnVwdHMoYWRhcHRlcik7Ci0KLQlhZGFwdGVyLT5mbGFncyB8PSBmTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFOwotCi0JLyogV2UncmUgcmVhZHkgdG8gbW92ZSBzb21lIGRhdGEsIHNvIHN0YXJ0IHRoZSBxdWV1ZSAqLwotCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoqCi0gKiBldDEzMXhfY2xvc2UgLSBDbG9zZSB0aGUgZGV2aWNlCi0gKiBAbmV0ZGV2OiBkZXZpY2UgdG8gYmUgY2xvc2VkCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUgKGFzIGRlZmluZWQgaW4gZXJybm8uaCkKLSAqLwotaW50IGV0MTMxeF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQotewotCXN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0KLQkvKiBGaXJzdCB0aGluZyBpcyB0byBzdG9wIHRoZSBxdWV1ZSAqLwotCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKLQotCS8qIFN0b3AgdGhlIFR4IGFuZCBSeCBETUEgZW5naW5lcyAqLwotCWV0MTMxeF9yeF9kbWFfZGlzYWJsZShhZGFwdGVyKTsKLQlldDEzMXhfdHhfZG1hX2Rpc2FibGUoYWRhcHRlcik7Ci0KLQkvKiBEaXNhYmxlIGRldmljZSBpbnRlcnJ1cHRzICovCi0JZXQxMzF4X2Rpc2FibGVfaW50ZXJydXB0cyhhZGFwdGVyKTsKLQotCS8qIERlcmVnaXN0ZXJpbmcgSVNSICovCi0JYWRhcHRlci0+ZmxhZ3MgJj0gfmZNUF9BREFQVEVSX0lOVEVSUlVQVF9JTl9VU0U7Ci0JZnJlZV9pcnEobmV0ZGV2LT5pcnEsIG5ldGRldik7Ci0KLQkvKiBTdG9wIHRoZSBlcnJvciB0aW1lciAqLwotCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT5FcnJvclRpbWVyKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBldDEzMXhfaW9jdGxfbWlpIC0gVGhlIGZ1bmN0aW9uIHdoaWNoIGhhbmRsZXMgTUlJIElPQ1RMcwotICogQG5ldGRldjogZGV2aWNlIG9uIHdoaWNoIHRoZSBxdWVyeSBpcyBiZWluZyBtYWRlCi0gKiBAcmVxYnVmOiB0aGUgcmVxdWVzdC1zcGVjaWZpYyBkYXRhIGJ1ZmZlcgotICogQGNtZDogdGhlIGNvbW1hbmQgcmVxdWVzdCBjb2RlCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUgKGFzIGRlZmluZWQgaW4gZXJybm8uaCkKLSAqLwotaW50IGV0MTMxeF9pb2N0bF9taWkoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGlmcmVxICpyZXFidWYsIGludCBjbWQpCi17Ci0JaW50IHN0YXR1cyA9IDA7Ci0Jc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0Jc3RydWN0IG1paV9pb2N0bF9kYXRhICpkYXRhID0gaWZfbWlpKHJlcWJ1Zik7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU0lPQ0dNSUlQSFk6Ci0JCWRhdGEtPnBoeV9pZCA9IGV0ZGV2LT5zdGF0cy54Y3ZyX2FkZHI7Ci0JCWJyZWFrOwotCi0JY2FzZSBTSU9DR01JSVJFRzoKLQkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQotCQkJc3RhdHVzID0gLUVQRVJNOwotCQllbHNlCi0JCQlzdGF0dXMgPSBNaVJlYWQoZXRkZXYsCi0JCQkJCWRhdGEtPnJlZ19udW0sICZkYXRhLT52YWxfb3V0KTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNJT0NTTUlJUkVHOgotCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCi0JCQlzdGF0dXMgPSAtRVBFUk07Ci0JCWVsc2UKLQkJCXN0YXR1cyA9IE1pV3JpdGUoZXRkZXYsIGRhdGEtPnJlZ19udW0sCi0JCQkJCSBkYXRhLT52YWxfaW4pOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXN0YXR1cyA9IC1FT1BOT1RTVVBQOwotCX0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi0vKioKLSAqIGV0MTMxeF9pb2N0bCAtIFRoZSBJL08gQ29udHJvbCBoYW5kbGVyIGZvciB0aGUgZHJpdmVyCi0gKiBAbmV0ZGV2OiBkZXZpY2Ugb24gd2hpY2ggdGhlIGNvbnRyb2wgcmVxdWVzdCBpcyBiZWluZyBtYWRlCi0gKiBAcmVxYnVmOiBhIHBvaW50ZXIgdG8gdGhlIElPQ1RMIHJlcXVlc3QgYnVmZmVyCi0gKiBAY21kOiB0aGUgSU9DVEwgY29tbWFuZCBjb2RlCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUgKGFzIGRlZmluZWQgaW4gZXJybm8uaCkKLSAqLwotaW50IGV0MTMxeF9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgaWZyZXEgKnJlcWJ1ZiwgaW50IGNtZCkKLXsKLQlpbnQgc3RhdHVzID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTSU9DR01JSVBIWToKLQljYXNlIFNJT0NHTUlJUkVHOgotCWNhc2UgU0lPQ1NNSUlSRUc6Ci0JCXN0YXR1cyA9IGV0MTMxeF9pb2N0bF9taWkobmV0ZGV2LCByZXFidWYsIGNtZCk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJc3RhdHVzID0gLUVPUE5PVFNVUFA7Ci0JfQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qKgotICogZXQxMzF4X3NldF9wYWNrZXRfZmlsdGVyIC0gQ29uZmlndXJlcyB0aGUgUnggUGFja2V0IGZpbHRlcmluZyBvbiB0aGUgZGV2aWNlCi0gKiBAYWRhcHRlcjogcG9pbnRlciB0byBvdXIgcHJpdmF0ZSBhZGFwdGVyIHN0cnVjdHVyZQotICoKLSAqIEZJWE1FOiBsb3Qgb2YgZHVwcyB3aXRoIE1BQyBjb2RlCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUKLSAqLwotaW50IGV0MTMxeF9zZXRfcGFja2V0X2ZpbHRlcihzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaW50IHN0YXR1cyA9IDA7Ci0JdWludDMyX3QgZmlsdGVyID0gYWRhcHRlci0+UGFja2V0RmlsdGVyOwotCXUzMiBjdHJsOwotCXUzMiBwZl9jdHJsOwotCi0JY3RybCA9IHJlYWRsKCZhZGFwdGVyLT5yZWdzLT5yeG1hYy5jdHJsKTsKLQlwZl9jdHJsID0gcmVhZGwoJmFkYXB0ZXItPnJlZ3MtPnJ4bWFjLnBmX2N0cmwpOwotCi0JLyogRGVmYXVsdCB0byBkaXNhYmxlZCBwYWNrZXQgZmlsdGVyaW5nLiAgRW5hYmxlIGl0IGluIHRoZSBpbmRpdmlkdWFsCi0JICogY2FzZSBzdGF0ZW1lbnRzIHRoYXQgcmVxdWlyZSB0aGUgZGV2aWNlIHRvIGZpbHRlciBzb21ldGhpbmcKLQkgKi8KLQljdHJsIHw9IDB4MDQ7Ci0KLQkvKiBTZXQgdXMgdG8gYmUgaW4gcHJvbWlzY3VvdXMgbW9kZSBzbyB3ZSByZWNlaXZlIGV2ZXJ5dGhpbmcsIHRoaXMKLQkgKiBpcyBhbHNvIHRydWUgd2hlbiB3ZSBnZXQgYSBwYWNrZXQgZmlsdGVyIG9mIDAKLQkgKi8KLQlpZiAoKGZpbHRlciAmIEVUMTMxWF9QQUNLRVRfVFlQRV9QUk9NSVNDVU9VUykgfHwgZmlsdGVyID09IDApCi0JCXBmX2N0cmwgJj0gfjc7CS8qIENsZWFyIGZpbHRlciBiaXRzICovCi0JZWxzZSB7Ci0JCS8qCi0JCSAqIFNldCB1cyB1cCB3aXRoIE11bHRpY2FzdCBwYWNrZXQgZmlsdGVyaW5nLiAgVGhyZWUgY2FzZXMgYXJlCi0JCSAqIHBvc3NpYmxlIC0gKDEpIHdlIGhhdmUgYSBtdWx0aS1jYXN0IGxpc3QsICgyKSB3ZSByZWNlaXZlIEFMTAotCQkgKiBtdWx0aWNhc3QgZW50cmllcyBvciAoMykgd2UgcmVjZWl2ZSBub25lLgotCQkgKi8KLQkJaWYgKGZpbHRlciAmIEVUMTMxWF9QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUKQotCQkJcGZfY3RybCAmPSB+MjsJLyogTXVsdGljYXN0IGZpbHRlciBiaXQgKi8KLQkJZWxzZSB7Ci0JCQlTZXR1cERldmljZUZvck11bHRpY2FzdChhZGFwdGVyKTsKLQkJCXBmX2N0cmwgfD0gMjsKLQkJCWN0cmwgJj0gfjB4MDQ7Ci0JCX0KLQotCQkvKiBTZXQgdXMgdXAgd2l0aCBVbmljYXN0IHBhY2tldCBmaWx0ZXJpbmcgKi8KLQkJaWYgKGZpbHRlciAmIEVUMTMxWF9QQUNLRVRfVFlQRV9ESVJFQ1RFRCkgewotCQkJU2V0dXBEZXZpY2VGb3JVbmljYXN0KGFkYXB0ZXIpOwotCQkJcGZfY3RybCB8PSA0OwotCQkJY3RybCAmPSB+MHgwNDsKLQkJfQotCi0JCS8qIFNldCB1cyB1cCB3aXRoIEJyb2FkY2FzdCBwYWNrZXQgZmlsdGVyaW5nICovCi0JCWlmIChmaWx0ZXIgJiBFVDEzMVhfUEFDS0VUX1RZUEVfQlJPQURDQVNUKSB7Ci0JCQlwZl9jdHJsIHw9IDE7CS8qIEJyb2FkY2FzdCBmaWx0ZXIgYml0ICovCi0JCQljdHJsICY9IH4weDA0OwotCQl9IGVsc2UKLQkJCXBmX2N0cmwgJj0gfjE7Ci0KLQkJLyogU2V0dXAgdGhlIHJlY2VpdmUgbWFjIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIC0gUGFja2V0Ci0JCSAqIEZpbHRlciBjb250cm9sICsgdGhlIGVuYWJsZSAvIGRpc2FibGUgZm9yIHBhY2tldCBmaWx0ZXIKLQkJICogaW4gdGhlIGNvbnRyb2wgcmVnLgotCQkgKi8KLQkJd3JpdGVsKHBmX2N0cmwsICZhZGFwdGVyLT5yZWdzLT5yeG1hYy5wZl9jdHJsKTsKLQkJd3JpdGVsKGN0cmwsICZhZGFwdGVyLT5yZWdzLT5yeG1hYy5jdHJsKTsKLQl9Ci0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqCi0gKiBldDEzMXhfbXVsdGljYXN0IC0gVGhlIGhhbmRsZXIgdG8gY29uZmlndXJlIG11bHRpY2FzdGluZyBvbiB0aGUgaW50ZXJmYWNlCi0gKiBAbmV0ZGV2OiBhIHBvaW50ZXIgdG8gYSBuZXRfZGV2aWNlIHN0cnVjdCByZXByZXNlbnRpbmcgdGhlIGRldmljZQotICovCi12b2lkIGV0MTMxeF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLXsKLQlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCXVpbnQzMl90IFBhY2tldEZpbHRlciA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOwotCWludCBpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPkxvY2ssIGZsYWdzKTsKLQotCS8qIEJlZm9yZSB3ZSBtb2RpZnkgdGhlIHBsYXRmb3JtLWluZGVwZW5kZW50IGZpbHRlciBmbGFncywgc3RvcmUgdGhlbQotCSAqIGxvY2FsbHkuIFRoaXMgYWxsb3dzIHVzIHRvIGRldGVybWluZSBpZiBhbnl0aGluZydzIGNoYW5nZWQgYW5kIGlmCi0JICogd2UgZXZlbiBuZWVkIHRvIGJvdGhlciB0aGUgaGFyZHdhcmUKLQkgKi8KLQlQYWNrZXRGaWx0ZXIgPSBhZGFwdGVyLT5QYWNrZXRGaWx0ZXI7Ci0KLQkvKiBDbGVhciB0aGUgJ211bHRpY2FzdCcgZmxhZyBsb2NhbGx5OyBiZWNhdXNlIHdlIG9ubHkgaGF2ZSBhIHNpbmdsZQotCSAqIGZsYWcgdG8gY2hlY2sgbXVsdGljYXN0LCBhbmQgbXVsdGlwbGUgbXVsdGljYXN0IGFkZHJlc3NlcyBjYW4gYmUKLQkgKiBzZXQsIHRoaXMgaXMgdGhlIGVhc2llc3Qgd2F5IHRvIGRldGVybWluZSBpZiBtb3JlIHRoYW4gb25lCi0JICogbXVsdGljYXN0IGFkZHJlc3MgaXMgYmVpbmcgc2V0LgotCSAqLwotCVBhY2tldEZpbHRlciAmPSB+RVQxMzFYX1BBQ0tFVF9UWVBFX01VTFRJQ0FTVDsKLQotCS8qIENoZWNrIHRoZSBuZXRfZGV2aWNlIGZsYWdzIGFuZCBzZXQgdGhlIGRldmljZSBpbmRlcGVuZGVudCBmbGFncwotCSAqIGFjY29yZGluZ2x5Ci0JICovCi0KLQlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQotCQlhZGFwdGVyLT5QYWNrZXRGaWx0ZXIgfD0gRVQxMzFYX1BBQ0tFVF9UWVBFX1BST01JU0NVT1VTOwotCWVsc2UKLQkJYWRhcHRlci0+UGFja2V0RmlsdGVyICY9IH5FVDEzMVhfUEFDS0VUX1RZUEVfUFJPTUlTQ1VPVVM7Ci0KLQlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkKLQkJYWRhcHRlci0+UGFja2V0RmlsdGVyIHw9IEVUMTMxWF9QQUNLRVRfVFlQRV9BTExfTVVMVElDQVNUOwotCi0JaWYgKG5ldGRldl9tY19jb3VudChuZXRkZXYpID4gTklDX01BWF9NQ0FTVF9MSVNUKQotCQlhZGFwdGVyLT5QYWNrZXRGaWx0ZXIgfD0gRVQxMzFYX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1Q7Ci0KLQlpZiAobmV0ZGV2X21jX2NvdW50KG5ldGRldikgPCAxKSB7Ci0JCWFkYXB0ZXItPlBhY2tldEZpbHRlciAmPSB+RVQxMzFYX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1Q7Ci0JCWFkYXB0ZXItPlBhY2tldEZpbHRlciAmPSB+RVQxMzFYX1BBQ0tFVF9UWVBFX01VTFRJQ0FTVDsKLQl9IGVsc2UKLQkJYWRhcHRlci0+UGFja2V0RmlsdGVyIHw9IEVUMTMxWF9QQUNLRVRfVFlQRV9NVUxUSUNBU1Q7Ci0KLQkvKiBTZXQgdmFsdWVzIGluIHRoZSBwcml2YXRlIGFkYXB0ZXIgc3RydWN0ICovCi0JaSA9IDA7Ci0JbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIG5ldGRldikgewotCQlpZiAoaSA9PSBOSUNfTUFYX01DQVNUX0xJU1QpCi0JCQlicmVhazsKLQkJbWVtY3B5KGFkYXB0ZXItPk1DTGlzdFtpKytdLCBoYS0+YWRkciwgRVRIX0FMRU4pOwotCX0KLQlhZGFwdGVyLT5NQ0FkZHJlc3NDb3VudCA9IGk7Ci0KLQkvKiBBcmUgdGhlIG5ldyBmbGFncyBkaWZmZXJlbnQgZnJvbSB0aGUgcHJldmlvdXMgb25lcz8gSWYgbm90LCB0aGVuIG5vCi0JICogYWN0aW9uIGlzIHJlcXVpcmVkCi0JICoKLQkgKiBOT1RFIC0gVGhpcyBibG9jayB3aWxsIGFsd2F5cyB1cGRhdGUgdGhlIE1DTGlzdCB3aXRoIHRoZSBoYXJkd2FyZSwKLQkgKiAgICAgICAgZXZlbiBpZiB0aGUgYWRkcmVzc2VzIGFyZW4ndCB0aGUgc2FtZS4KLQkgKi8KLQlpZiAoUGFja2V0RmlsdGVyICE9IGFkYXB0ZXItPlBhY2tldEZpbHRlcikgewotCQkvKiBDYWxsIHRoZSBkZXZpY2UncyBmaWx0ZXIgZnVuY3Rpb24gKi8KLQkJZXQxMzF4X3NldF9wYWNrZXRfZmlsdGVyKGFkYXB0ZXIpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5Mb2NrLCBmbGFncyk7Ci19Ci0KLS8qKgotICogZXQxMzF4X3R4IC0gVGhlIGhhbmRsZXIgdG8gdHggYSBwYWNrZXQgb24gdGhlIGRldmljZQotICogQHNrYjogZGF0YSB0byBiZSBUeCdkCi0gKiBAbmV0ZGV2OiBkZXZpY2Ugb24gd2hpY2ggZGF0YSBpcyB0byBiZSBUeCdkCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG9uIGZhaWx1cmUgKGFzIGRlZmluZWQgaW4gZXJybm8uaCkKLSAqLwotaW50IGV0MTMxeF90eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQotewotCWludCBzdGF0dXMgPSAwOwotCi0JLyogU2F2ZSB0aGUgdGltZXN0YW1wIGZvciB0aGUgVFggdGltZW91dCB3YXRjaGRvZyAqLwotCW5ldGRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwotCi0JLyogQ2FsbCB0aGUgZGV2aWNlLXNwZWNpZmljIGRhdGEgVHggcm91dGluZSAqLwotCXN0YXR1cyA9IGV0MTMxeF9zZW5kX3BhY2tldHMoc2tiLCBuZXRkZXYpOwotCi0JLyogQ2hlY2sgc3RhdHVzIGFuZCBtYW5hZ2UgdGhlIG5ldGlmIHF1ZXVlIGlmIG5lY2Vzc2FyeSAqLwotCWlmIChzdGF0dXMgIT0gMCkgewotCQlpZiAoc3RhdHVzID09IC1FTk9NRU0pIHsKLQkJCS8qIFB1dCB0aGUgcXVldWUgdG8gc2xlZXAgdW50aWwgcmVzb3VyY2VzIGFyZQotCQkJICogYXZhaWxhYmxlCi0JCQkgKi8KLQkJCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKLQkJCXN0YXR1cyA9IE5FVERFVl9UWF9CVVNZOwotCQl9IGVsc2UgewotCQkJc3RhdHVzID0gTkVUREVWX1RYX09LOwotCQl9Ci0JfQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qKgotICogZXQxMzF4X3R4X3RpbWVvdXQgLSBUaW1lb3V0IGhhbmRsZXIKLSAqIEBuZXRkZXY6IGEgcG9pbnRlciB0byBhIG5ldF9kZXZpY2Ugc3RydWN0IHJlcHJlc2VudGluZyB0aGUgZGV2aWNlCi0gKgotICogVGhlIGhhbmRsZXIgY2FsbGVkIHdoZW4gYSBUeCByZXF1ZXN0IHRpbWVzIG91dC4gVGhlIHRpbWVvdXQgcGVyaW9kIGlzCi0gKiBzcGVjaWZpZWQgYnkgdGhlICd0eF90aW1lbyIgZWxlbWVudCBpbiB0aGUgbmV0X2RldmljZSBzdHJ1Y3R1cmUgKHNlZQotICogZXQxMzF4X2FsbG9jX2RldmljZSgpIHRvIHNlZSBob3cgdGhpcyB2YWx1ZSBpcyBzZXQpLgotICovCi12b2lkIGV0MTMxeF90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi17Ci0Jc3RydWN0IGV0MTMxeF9hZGFwdGVyICpldGRldiA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0Jc3RydWN0IHRjYiAqdGNiOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBBbnkgbm9ucmVjb3ZlcmFibGUgaGFyZHdhcmUgZXJyb3I/Ci0JICogQ2hlY2tzIGFkYXB0ZXItPmZsYWdzIGZvciBhbnkgZmFpbHVyZSBpbiBwaHkgcmVhZGluZwotCSAqLwotCWlmIChldGRldi0+ZmxhZ3MgJiBmTVBfQURBUFRFUl9OT05fUkVDT1ZFUl9FUlJPUikKLQkJcmV0dXJuOwotCi0JLyogSGFyZHdhcmUgZmFpbHVyZT8gKi8KLQlpZiAoZXRkZXYtPmZsYWdzICYgZk1QX0FEQVBURVJfSEFSRFdBUkVfRVJST1IpIHsKLQkJZGV2X2VycigmZXRkZXYtPnBkZXYtPmRldiwgImhhcmR3YXJlIGVycm9yIC0gcmVzZXRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogSXMgc2VuZCBzdHVjaz8gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZXRkZXYtPlRDQlNlbmRRTG9jaywgZmxhZ3MpOwotCi0JdGNiID0gZXRkZXYtPnR4X3Jpbmcuc2VuZF9oZWFkOwotCi0JaWYgKHRjYiAhPSBOVUxMKSB7Ci0JCXRjYi0+Y291bnQrKzsKLQotCQlpZiAodGNiLT5jb3VudCA+IE5JQ19TRU5EX0hBTkdfVEhSRVNIT0xEKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+VENCU2VuZFFMb2NrLAotCQkJCQkgICAgICAgZmxhZ3MpOwotCi0JCQlkZXZfd2FybigmZXRkZXYtPnBkZXYtPmRldiwKLQkJCQkiU2VuZCBzdHVjayAtIHJlc2V0LiAgdGNiLT5XckluZGV4ICV4LCBmbGFncyAweCUwOHhcbiIsCi0JCQkJdGNiLT5pbmRleCwKLQkJCQl0Y2ItPmZsYWdzKTsKLQotCQkJZXQxMzF4X2Nsb3NlKG5ldGRldik7Ci0JCQlldDEzMXhfb3BlbihuZXRkZXYpOwotCi0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldGRldi0+VENCU2VuZFFMb2NrLCBmbGFncyk7Ci19Ci0KLS8qKgotICogZXQxMzF4X2NoYW5nZV9tdHUgLSBUaGUgaGFuZGxlciBjYWxsZWQgdG8gY2hhbmdlIHRoZSBNVFUgZm9yIHRoZSBkZXZpY2UKLSAqIEBuZXRkZXY6IGRldmljZSB3aG9zZSBNVFUgaXMgdG8gYmUgY2hhbmdlZAotICogQG5ld19tdHU6IHRoZSBkZXNpcmVkIE1UVQotICoKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBlcnJubyBvbiBmYWlsdXJlIChhcyBkZWZpbmVkIGluIGVycm5vLmgpCi0gKi8KLWludCBldDEzMXhfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgbmV3X210dSkKLXsKLQlpbnQgcmVzdWx0ID0gMDsKLQlzdHJ1Y3QgZXQxMzF4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCi0JLyogTWFrZSBzdXJlIHRoZSByZXF1ZXN0ZWQgTVRVIGlzIHZhbGlkICovCi0JaWYgKG5ld19tdHUgPCA2NCB8fCBuZXdfbXR1ID4gOTIxNikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBTdG9wIHRoZSBuZXRpZiBxdWV1ZSAqLwotCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKLQotCS8qIFN0b3AgdGhlIFR4IGFuZCBSeCBETUEgZW5naW5lcyAqLwotCWV0MTMxeF9yeF9kbWFfZGlzYWJsZShhZGFwdGVyKTsKLQlldDEzMXhfdHhfZG1hX2Rpc2FibGUoYWRhcHRlcik7Ci0KLQkvKiBEaXNhYmxlIGRldmljZSBpbnRlcnJ1cHRzICovCi0JZXQxMzF4X2Rpc2FibGVfaW50ZXJydXB0cyhhZGFwdGVyKTsKLQlldDEzMXhfaGFuZGxlX3NlbmRfaW50ZXJydXB0KGFkYXB0ZXIpOwotCWV0MTMxeF9oYW5kbGVfcmVjdl9pbnRlcnJ1cHQoYWRhcHRlcik7Ci0KLQkvKiBTZXQgdGhlIG5ldyBNVFUgKi8KLQluZXRkZXYtPm10dSA9IG5ld19tdHU7Ci0KLQkvKiBGcmVlIFJ4IERNQSBtZW1vcnkgKi8KLQlldDEzMXhfYWRhcHRlcl9tZW1vcnlfZnJlZShhZGFwdGVyKTsKLQotCS8qIFNldCB0aGUgY29uZmlnIHBhcmFtZXRlciBmb3IgSnVtYm8gUGFja2V0IHN1cHBvcnQgKi8KLQlhZGFwdGVyLT5SZWdpc3RyeUp1bWJvUGFja2V0ID0gbmV3X210dSArIDE0OwotCWV0MTMxeF9zb2Z0X3Jlc2V0KGFkYXB0ZXIpOwotCi0JLyogQWxsb2MgYW5kIGluaXQgUnggRE1BIG1lbW9yeSAqLwotCXJlc3VsdCA9IGV0MTMxeF9hZGFwdGVyX21lbW9yeV9hbGxvYyhhZGFwdGVyKTsKLQlpZiAocmVzdWx0ICE9IDApIHsKLQkJZGV2X3dhcm4oJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCSJDaGFuZ2UgTVRVIGZhaWxlZDsgY291bGRuJ3QgcmUtYWxsb2MgRE1BIG1lbW9yeVxuIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JZXQxMzF4X2luaXRfc2VuZChhZGFwdGVyKTsKLQotCWV0MTMxeF9od2FkZHJfaW5pdChhZGFwdGVyKTsKLQltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgYWRhcHRlci0+YWRkciwgRVRIX0FMRU4pOwotCi0JLyogSW5pdCB0aGUgZGV2aWNlIHdpdGggdGhlIG5ldyBzZXR0aW5ncyAqLwotCWV0MTMxeF9hZGFwdGVyX3NldHVwKGFkYXB0ZXIpOwotCi0JLyogRW5hYmxlIGludGVycnVwdHMgKi8KLQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBmTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKQotCQlldDEzMXhfZW5hYmxlX2ludGVycnVwdHMoYWRhcHRlcik7Ci0KLQkvKiBSZXN0YXJ0IHRoZSBUeCBhbmQgUnggRE1BIGVuZ2luZXMgKi8KLQlldDEzMXhfcnhfZG1hX2VuYWJsZShhZGFwdGVyKTsKLQlldDEzMXhfdHhfZG1hX2VuYWJsZShhZGFwdGVyKTsKLQotCS8qIFJlc3RhcnQgdGhlIG5ldGlmIHF1ZXVlICovCi0JbmV0aWZfd2FrZV9xdWV1ZShuZXRkZXYpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLS8qKgotICogZXQxMzF4X3NldF9tYWNfYWRkciAtIGhhbmRsZXIgdG8gY2hhbmdlIHRoZSBNQUMgYWRkcmVzcyBmb3IgdGhlIGRldmljZQotICogQG5ldGRldjogZGV2aWNlIHdob3NlIE1BQyBpcyB0byBiZSBjaGFuZ2VkCi0gKiBAbmV3X21hYzogdGhlIGRlc2lyZWQgTUFDIGFkZHJlc3MKLSAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJybm8gb24gZmFpbHVyZSAoYXMgZGVmaW5lZCBpbiBlcnJuby5oKQotICoKLSAqIElNUExFTUVOVEVEIEJZIDogYmx1eCBodHRwOi8vYmVybmRsdXguZGUgMjIuMDEuMjAwNyAyMToxNAotICovCi1pbnQgZXQxMzF4X3NldF9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB2b2lkICpuZXdfbWFjKQotewotCWludCByZXN1bHQgPSAwOwotCXN0cnVjdCBldDEzMXhfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0Jc3RydWN0IHNvY2thZGRyICphZGRyZXNzID0gbmV3X21hYzsKLQotCS8qIGJlZ2luIGJsdXggKi8KLQotCWlmIChhZGFwdGVyID09IE5VTEwpCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyogTWFrZSBzdXJlIHRoZSByZXF1ZXN0ZWQgTUFDIGlzIHZhbGlkICovCi0JaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGFkZHJlc3MtPnNhX2RhdGEpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIFN0b3AgdGhlIG5ldGlmIHF1ZXVlICovCi0JbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwotCi0JLyogU3RvcCB0aGUgVHggYW5kIFJ4IERNQSBlbmdpbmVzICovCi0JZXQxMzF4X3J4X2RtYV9kaXNhYmxlKGFkYXB0ZXIpOwotCWV0MTMxeF90eF9kbWFfZGlzYWJsZShhZGFwdGVyKTsKLQotCS8qIERpc2FibGUgZGV2aWNlIGludGVycnVwdHMgKi8KLQlldDEzMXhfZGlzYWJsZV9pbnRlcnJ1cHRzKGFkYXB0ZXIpOwotCWV0MTMxeF9oYW5kbGVfc2VuZF9pbnRlcnJ1cHQoYWRhcHRlcik7Ci0JZXQxMzF4X2hhbmRsZV9yZWN2X2ludGVycnVwdChhZGFwdGVyKTsKLQotCS8qIFNldCB0aGUgbmV3IE1BQyAqLwotCS8qIG5ldGRldi0+c2V0X21hY19hZGRyZXNzICA9ICZuZXdfbWFjOyAqLwotCS8qIG5ldGRldi0+bXR1ID0gbmV3X210dTsgKi8KLQotCW1lbWNweShuZXRkZXYtPmRldl9hZGRyLCBhZGRyZXNzLT5zYV9kYXRhLCBuZXRkZXYtPmFkZHJfbGVuKTsKLQotCXByaW50ayhLRVJOX0lORk8gIiVzOiBTZXR0aW5nIE1BQyBhZGRyZXNzIHRvICVwTVxuIiwKLQkJCW5ldGRldi0+bmFtZSwgbmV0ZGV2LT5kZXZfYWRkcik7Ci0KLQkvKiBGcmVlIFJ4IERNQSBtZW1vcnkgKi8KLQlldDEzMXhfYWRhcHRlcl9tZW1vcnlfZnJlZShhZGFwdGVyKTsKLQotCS8qIFNldCB0aGUgY29uZmlnIHBhcmFtZXRlciBmb3IgSnVtYm8gUGFja2V0IHN1cHBvcnQgKi8KLQkvKiBhZGFwdGVyLT5SZWdpc3RyeUp1bWJvUGFja2V0ID0gbmV3X210dSArIDE0OyAqLwotCS8qIGJsdXg6IG5vdCBuZWVkZXQgaGVyZSwgd2UnbGwgY2hhbmdlIHRoZSBNQUMgKi8KLQotCWV0MTMxeF9zb2Z0X3Jlc2V0KGFkYXB0ZXIpOwotCi0JLyogQWxsb2MgYW5kIGluaXQgUnggRE1BIG1lbW9yeSAqLwotCXJlc3VsdCA9IGV0MTMxeF9hZGFwdGVyX21lbW9yeV9hbGxvYyhhZGFwdGVyKTsKLQlpZiAocmVzdWx0ICE9IDApIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJIkNoYW5nZSBNQUMgZmFpbGVkOyBjb3VsZG4ndCByZS1hbGxvYyBETUEgbWVtb3J5XG4iKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlldDEzMXhfaW5pdF9zZW5kKGFkYXB0ZXIpOwotCi0JZXQxMzF4X2h3YWRkcl9pbml0KGFkYXB0ZXIpOwotCi0JLyogSW5pdCB0aGUgZGV2aWNlIHdpdGggdGhlIG5ldyBzZXR0aW5ncyAqLwotCWV0MTMxeF9hZGFwdGVyX3NldHVwKGFkYXB0ZXIpOwotCi0JLyogRW5hYmxlIGludGVycnVwdHMgKi8KLQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBmTVBfQURBUFRFUl9JTlRFUlJVUFRfSU5fVVNFKQotCQlldDEzMXhfZW5hYmxlX2ludGVycnVwdHMoYWRhcHRlcik7Ci0KLQkvKiBSZXN0YXJ0IHRoZSBUeCBhbmQgUnggRE1BIGVuZ2luZXMgKi8KLQlldDEzMXhfcnhfZG1hX2VuYWJsZShhZGFwdGVyKTsKLQlldDEzMXhfdHhfZG1hX2VuYWJsZShhZGFwdGVyKTsKLQotCS8qIFJlc3RhcnQgdGhlIG5ldGlmIHF1ZXVlICovCi0JbmV0aWZfd2FrZV9xdWV1ZShuZXRkZXYpOwotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZXQxMzF4X25ldGRldl9vcHMgPSB7Ci0JLm5kb19vcGVuCQk9IGV0MTMxeF9vcGVuLAotCS5uZG9fc3RvcAkJPSBldDEzMXhfY2xvc2UsCi0JLm5kb19zdGFydF94bWl0CQk9IGV0MTMxeF90eCwKLQkubmRvX3NldF9yeF9tb2RlCT0gZXQxMzF4X211bHRpY2FzdCwKLQkubmRvX3R4X3RpbWVvdXQJCT0gZXQxMzF4X3R4X3RpbWVvdXQsCi0JLm5kb19jaGFuZ2VfbXR1CQk9IGV0MTMxeF9jaGFuZ2VfbXR1LAotCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXQxMzF4X3NldF9tYWNfYWRkciwKLQkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKLQkubmRvX2dldF9zdGF0cwkJPSBldDEzMXhfc3RhdHMsCi0JLm5kb19kb19pb2N0bAkJPSBldDEzMXhfaW9jdGwsCi19OwotCi0vKioKLSAqIGV0MTMxeF9kZXZpY2VfYWxsb2MKLSAqCi0gKiBSZXR1cm5zIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgbmV0X2RldmljZSBzdHJ1Y3QgZm9yCi0gKiB0aGlzIGRldmljZS4KLSAqCi0gKiBDcmVhdGUgaW5zdGFuY2VzIG9mIG5ldF9kZXZpY2UgYW5kIHdsX3ByaXZhdGUgZm9yIHRoZSBuZXcgYWRhcHRlciBhbmQKLSAqIHJlZ2lzdGVyIHRoZSBkZXZpY2UncyBlbnRyeSBwb2ludHMgaW4gdGhlIG5ldF9kZXZpY2Ugc3RydWN0dXJlLgotICovCi1zdHJ1Y3QgbmV0X2RldmljZSAqZXQxMzF4X2RldmljZV9hbGxvYyh2b2lkKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7Ci0KLQkvKiBBbGxvYyBuZXRfZGV2aWNlIGFuZCBhZGFwdGVyIHN0cnVjdHMgKi8KLQluZXRkZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IGV0MTMxeF9hZGFwdGVyKSk7Ci0KLQlpZiAobmV0ZGV2ID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJldDEzMXg6IEFsbG9jIG9mIG5ldF9kZXZpY2Ugc3RydWN0IGZhaWxlZFxuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCS8qIFNldHVwIHRoZSBmdW5jdGlvbiByZWdpc3RyYXRpb24gdGFibGUgKGFuZCBvdGhlciBkYXRhKSBmb3IgYQotCSAqIG5ldF9kZXZpY2UKLQkgKi8KLQkvKiBuZXRkZXYtPmluaXQgICAgICAgICAgICAgICA9ICZldDEzMXhfaW5pdDsgKi8KLQkvKiBuZXRkZXYtPnNldF9jb25maWcgPSAmZXQxMzF4X2NvbmZpZzsgKi8KLQluZXRkZXYtPndhdGNoZG9nX3RpbWVvID0gRVQxMzFYX1RYX1RJTUVPVVQ7Ci0JbmV0ZGV2LT5uZXRkZXZfb3BzID0gJmV0MTMxeF9uZXRkZXZfb3BzOwotCi0JLyogbmV0ZGV2LT5ldGh0b29sX29wcyAgICAgICAgPSAmZXQxMzF4X2V0aHRvb2xfb3BzOyAqLwotCi0JLyogUG9sbD8gKi8KLQkvKiBuZXRkZXYtPnBvbGwgICAgICAgICAgICAgICA9ICZldDEzMXhfcG9sbDsgKi8KLQkvKiBuZXRkZXYtPnBvbGxfY29udHJvbGxlciAgICA9ICZldDEzMXhfcG9sbF9jb250cm9sbGVyOyAqLwotCXJldHVybiBuZXRkZXY7Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X3ZlcnNpb24uaCBiL2RyaXZlcnMvc3RhZ2luZy9ldDEzMXgvZXQxMzF4X3ZlcnNpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFhOWJkYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZXQxMzF4L2V0MTMxeF92ZXJzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKgotICogQWdlcmUgU3lzdGVtcyBJbmMuCi0gKiAxMC8xMDAvMTAwMCBCYXNlLVQgRXRoZXJuZXQgRHJpdmVyIGZvciB0aGUgRVQxMzAxIGFuZCBFVDEzMXggc2VyaWVzIE1BQ3MKLSAqCi0gKiBDb3B5cmlnaHQgwqkgMjAwNSBBZ2VyZSBTeXN0ZW1zIEluYy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgIGh0dHA6Ly93d3cuYWdlcmUuY29tCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBldDEzMXhfdmVyc2lvbi5oIC0gVGhpcyBmaWxlIHByb3ZpZGVzIHN5c3RlbSBhbmQgZGV2aWNlIHZlcnNpb24gaW5mb3JtYXRpb24uCi0gKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiBTT0ZUV0FSRSBMSUNFTlNFCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCi0gKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCi0gKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCi0gKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCi0gKgotICogQ29weXJpZ2h0IMKpIDIwMDUgQWdlcmUgU3lzdGVtcyBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb25zLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKgotICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKLSAqICAgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGFzIGNvbW1lbnRzIGluIHRoZSBjb2RlIGFzCi0gKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KLSAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCi0gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKLSAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIERpc2NsYWltZXIKLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKLSAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBJTkZSSU5HRU1FTlQgQU5EIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKLSAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCi0gKiBSSVNLLiBJTiBOTyBFVkVOVCBTSEFMTCBBR0VSRSBTWVNURU1TIElOQy4gT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKLSAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAotICogREFNQUdFLgotICoKLSAqLwotCi0jaWZuZGVmIF9fRVQxMzFYX1ZFUlNJT05fSF9fCi0jZGVmaW5lIF9fRVQxMzFYX1ZFUlNJT05fSF9fCi0KLSNkZWZpbmUgRFJJVkVSX0FVVEhPUgkJIlZpY3RvciBTb3JpYW5vICh2anNvcmlhbm9AYWdlcmUuY29tKSIKLSNkZWZpbmUgRFJJVkVSX0xJQ0VOU0UJCSJEdWFsIEJTRC9HUEwiCi0jZGVmaW5lIERSSVZFUl9ERVZJQ0VfU1RSSU5HCSJFVDEzMTAiCi0jZGVmaW5lIERSSVZFUl9OQU1FCQkiZXQxMzF4IgotI2RlZmluZSBEUklWRVJfVkVSU0lPTl9TVFJJTkcJIjEuMi4zLWxrIgotI2RlZmluZSBEUklWRVJfVkVORE9SCQkiQWdlcmUgU3lzdGVtcywgaHR0cDovL3d3dy5hZ2VyZS5jb20iCi0jZGVmaW5lIERSSVZFUl9ERVNDCQkiMTAvMTAwLzEwMDAgQmFzZS1UIEV0aGVybmV0IERyaXZlciIKLQotI2RlZmluZSBEUklWRVJfSU5GTwkJRFJJVkVSX0RFU0MgIiBmb3IgdGhlICJcCi0JCQkJRFJJVkVSX0RFVklDRV9TVFJJTkcgIiwgdiIgXAotCQkJCURSSVZFUl9WRVJTSU9OX1NUUklORyAiIGJ5ICIgXAotCQkJCURSSVZFUl9WRU5ET1IKLQotI2VuZGlmIC8qIF9fRVQxMzFYX1ZFUlNJT05fSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwLmggYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwLmgKaW5kZXggM2IwMTMwZi4uYWRiNDM2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXBjbWNpYS9mdDEwMDAuaApAQCAtNjgsNiArNjgsMTYgQEAKIAljaGFyIG5ldGRldm5hbWVbSUZOQU1TSVpdOwogfTsKIAorc3RydWN0IHBjbWNpYV9kZXZpY2U7CitzdHJ1Y3QgbmV0X2RldmljZTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqaW5pdF9mdDEwMDBfY2FyZChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaywKKwkJCQkJCXZvaWQgKmZ0MTAwMF9yZXNldCk7CitleHRlcm4gdm9pZCBzdG9wX2Z0MTAwMF9jYXJkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBjYXJkX2Rvd25sb2FkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHU4ICpwRmlsZVN0YXJ0LAorCQkJc2l6ZV90IEZpbGVMZW5ndGgpOworZXh0ZXJuIHZvaWQgZnQxMDAwSW5pdFByb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBmdDEwMDBDbGVhbnVwUHJvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwogZXh0ZXJuIHUxNiBmdDEwMDBfcmVhZF9kcHJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgb2Zmc2V0KTsKIGV4dGVybiB2b2lkIGNhcmRfYm9vdGxvYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBleHRlcm4gdTE2IGZ0MTAwMF9yZWFkX2RwcmFtX21hZ18xNihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgb2Zmc2V0LCBpbnQgSW5kZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9jcy5jIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9jcy5jCmluZGV4IDZhMWMxZDQuLmYzNzZjYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXBjbWNpYS9mdDEwMDBfY3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX2NzLmMKQEAgLTQxLDE0ICs0MSwxMiBAQAogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAotc3RydWN0IG5ldF9kZXZpY2UgKmluaXRfZnQxMDAwX2NhcmQoc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmssCi0JCQkJCXZvaWQgKmZ0MTAwMF9yZXNldCk7Ci12b2lkIHN0b3BfZnQxMDAwX2NhcmQoc3RydWN0IG5ldF9kZXZpY2UgKik7Ci0KIHN0YXRpYyBpbnQgZnQxMDAwX2NvbmZpZyhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayk7CiBzdGF0aWMgdm9pZCBmdDEwMDBfZGV0YWNoKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rKTsKIHN0YXRpYyBpbnQgZnQxMDAwX2F0dGFjaChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluayk7CiAKKyNpbmNsdWRlICJmdDEwMDAuaCIKKwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIHN0YXRpYyB2b2lkIGZ0MTAwMF9yZXNldChzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaykKQEAgLTc1LDcgKzczLDcgQEAKIAlmcmVlX25ldGRldihkZXYpOwogfQogCi1pbnQgZnQxMDAwX2NvbmZjaGVjayhzdHJ1Y3QgcGNtY2lhX2RldmljZSAqbGluaywgdm9pZCAqcHJpdl9kYXRhKQorc3RhdGljIGludCBmdDEwMDBfY29uZmNoZWNrKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rLCB2b2lkICpwcml2X2RhdGEpCiB7CiAJcmV0dXJuIHBjbWNpYV9yZXF1ZXN0X2lvKGxpbmspOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9kbmxkLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX2RubGQuYwppbmRleCBjOTU2ODU3Li5mOGI4ZTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX2RubGQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX2RubGQuYwpAQCAtMjg3LDcgKzI4Nyw4IEBACiAJcmV0dXJuIGNoa3N1bTsKIH0KIAotaW50IGNhcmRfZG93bmxvYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdTggKnBGaWxlU3RhcnQsIHUzMiBGaWxlTGVuZ3RoKQoraW50IGNhcmRfZG93bmxvYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdTggKnBGaWxlU3RhcnQsCisJCSAgc2l6ZV90IEZpbGVMZW5ndGgpCiB7CiAJc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gKHN0cnVjdCBmdDEwMDBfaW5mbyAqKSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBTdGF0dXMgPSBTVUNDRVNTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9ody5jIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9ody5jCmluZGV4IDk5MGIyYWYuLmIzZDc0M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXBjbWNpYS9mdDEwMDBfaHcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX2h3LmMKQEAgLTU2LDE2ICs1NiwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSAiZnQxMDAwLmgiCiAKLWludCBjYXJkX2Rvd25sb2FkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHU4ICpwRmlsZVN0YXJ0LCB1MzIgRmlsZUxlbmd0aCk7Ci0KLXZvaWQgZnQxMDAwSW5pdFByb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci12b2lkIGZ0MTAwMENsZWFudXBQcm9jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCi1jb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3X2VudHJ5Oworc3RhdGljIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfZW50cnk7CiAKIHN0YXRpYyB2b2lkIGZ0MTAwMF9oYmNoayh1X2xvbmcgZGF0YSk7CiBzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgcG9sbF90aW1lciA9IHsKLSAgICAgIGZ1bmN0aW9uOmZ0MTAwMF9oYmNoaworICAgICAgLmZ1bmN0aW9uID0gZnQxMDAwX2hiY2hrCiB9OwogCiBzdGF0aWMgdTE2IGNtZGJ1ZmZlclsxMDI0XTsKQEAgLTc4OCw3ICs3ODMsNyBAQAogLy8gT3V0cHV0OgogLy8KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIGZ0MTAwMF9zZW5kX2NtZCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2ICpwdGVtcGJ1ZmZlciwgaW50IHNpemUsIHUxNiBxdHlwZSkKK3N0YXRpYyB2b2lkIGZ0MTAwMF9zZW5kX2NtZCAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2ICpwdGVtcGJ1ZmZlciwgaW50IHNpemUsIHUxNiBxdHlwZSkKIHsKIAlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBpOwpAQCAtODczLDcgKzg2OCw4IEBACiAvLyAgICAgICAgICA9IDEgKHN1Y2Nlc3NmdWwpCiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWJvb2wgZnQxMDAwX3JlY2VpdmVfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiAqIHBidWZmZXIsIGludCBtYXhzeiwgdTE2ICpwbnh0cGgpCitzdGF0aWMgYm9vbCBmdDEwMDBfcmVjZWl2ZV9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2ICpwYnVmZmVyLAorCQkJCWludCBtYXhzeiwgdTE2ICpwbnh0cGgpCiB7CiAJc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MTYgc2l6ZTsKQEAgLTk2Niw3ICs5NjIsNyBAQAogLy8gICAgIG5vbmUKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBmdDEwMDBfcHJvY19kcnZtc2coc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGZ0MTAwMF9wcm9jX2Rydm1zZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdTE2IG1zZ3R5cGU7CkBAIC0xMjQ1LDcgKzEyNDEsNyBAQAogLy8gICAgICAgICAgICAgIFNVQ0NFU1MKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50IGZ0MTAwMF9wYXJzZV9kcHJhbV9tc2coc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgZnQxMDAwX3BhcnNlX2RwcmFtX21zZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdTE2IGRvb3JiZWxsOwpAQCAtMTU0Niw3ICsxNTQyLDcgQEAKIC8vICAgICAgICAgICAgICBTVUNDRVNTCiAvLwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBmdDEwMDBfY29weV91cF9wa3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgZnQxMDAwX2NvcHlfdXBfcGt0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJdTE2IHRlbXB3b3JkOwogCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CkBAIC0xNzM0LDcgKzE3MzAsNyBAQAogLy8gICAgICAgICAgICAgIFNVQ0NFU1MKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50IGZ0MTAwMF9jb3B5X2Rvd25fcGt0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiAqIHBhY2tldCwgdTE2IGxlbikKK3N0YXRpYyBpbnQgZnQxMDAwX2NvcHlfZG93bl9wa3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2ICogcGFja2V0LCB1MTYgbGVuKQogewogCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdW5pb24gewpAQCAtMjEwMiw3ICsyMDk4LDcgQEAKIH07CiAKIHN0cnVjdCBuZXRfZGV2aWNlICppbml0X2Z0MTAwMF9jYXJkKHN0cnVjdCBwY21jaWFfZGV2aWNlICpsaW5rLAotCQkJCQl2b2lkICpmdDEwMDBfcmVzZXQpCisJCQkJCQl2b2lkICpmdDEwMDBfcmVzZXQpCiB7CiAJc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX3Byb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXBjbWNpYS9mdDEwMDBfcHJvYy5jCmluZGV4IDllNzI4YjMuLjdmYWVhZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXBjbWNpYS9mdDEwMDBfcHJvYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXBjbWNpYS9mdDEwMDBfcHJvYy5jCkBAIC00OCw4ICs0OCw4IEBACiAJfSBcCiAJbGVuICs9IHNucHJpbnRmKHBhZ2UrbGVuLCBQQUdFX1NJWkUgLSBsZW4sICIlZFxuIiwgdmFyW2ldKQogCi1pbnQgZnQxMDAwUmVhZFByb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCi0JCSAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGZ0MTAwMFJlYWRQcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJaW50IGxlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfaHcuYyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfaHcuYwppbmRleCAzZjMwM2VhLi5hYWY0NGMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2h3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9ody5jCkBAIC00ODUsNyArNDg1LDcgQEAKIAogCURFQlVHKCJjYXJkX3NlbmRfY29tbWFuZDogZW50ZXIgY2FyZF9zZW5kX2NvbW1hbmQuLi4gc2l6ZT0lZFxuIiwgc2l6ZSk7CiAKLQljb21tYW5kYnVmID0gKHVuc2lnbmVkIGNoYXIgKilrbWFsbG9jKHNpemUgKyAyLCBHRlBfS0VSTkVMKTsKKwljb21tYW5kYnVmID0ga21hbGxvYyhzaXplICsgMiwgR0ZQX0tFUk5FTCk7CiAJbWVtY3B5KCh2b2lkICopY29tbWFuZGJ1ZiArIDIsICh2b2lkICopcHRlbXBidWZmZXIsIHNpemUpOwogCiAJZnQxMDAwX3JlYWRfcmVnaXN0ZXIoZnQxMDAwZGV2LCAmdGVtcCwgRlQxMDAwX1JFR19ET09SQkVMTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL2FjY2VsXzJkLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL2FjY2VsXzJkLmMKaW5kZXggMTQ0MDBmYy4uMTE0Yjk5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9hY2NlbF8yZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvYWNjZWxfMmQuYwpAQCAtMTExLDE0ICsxMTEsMTUgQEAKIAlpbnQgcmV0ID0gMDsKIAlpbnQgaTsKIAl1bnNpZ25lZCBzdWJtaXRfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JbXV0ZXhfbG9jaygmZGV2X3ByaXYtPm11dGV4XzJkKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmxvY2tfMmQsIGZsYWdzKTsKIAl3aGlsZSAoc2l6ZSA+IDApIHsKIAkJc3VibWl0X3NpemUgPSAoc2l6ZSA8IDB4NjApID8gc2l6ZSA6IDB4NjA7CiAJCXNpemUgLT0gc3VibWl0X3NpemU7CiAJCXJldCA9IHBzYl8yZF93YWl0X2F2YWlsYWJsZShkZXZfcHJpdiwgc3VibWl0X3NpemUpOwogCQlpZiAocmV0KQotCQkgICAgICAgIGJyZWFrOworCQkJYnJlYWs7CiAKIAkJc3VibWl0X3NpemUgPDw9IDI7CiAKQEAgLTEyNyw3ICsxMjgsNyBAQAogCiAJCSh2b2lkKVBTQl9SU0dYMzIoUFNCX1NHWF8yRF9TTEFWRV9QT1JUICsgaSAtIDQpOwogCX0KLQltdXRleF91bmxvY2soJmRldl9wcml2LT5tdXRleF8yZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmxvY2tfMmQsIGZsYWdzKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zMjcsOCArMzI4LDkgQEAKIAlzdHJ1Y3QgZHJtX3BzYl9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAJdW5zaWduZWQgbG9uZyBfZW5kID0gamlmZmllcyArIERSTV9IWjsKIAlpbnQgYnVzeSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCW11dGV4X2xvY2soJmRldl9wcml2LT5tdXRleF8yZCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldl9wcml2LT5sb2NrXzJkLCBmbGFncyk7CiAJLyoKIAkgKiBGaXJzdCBpZGxlIHRoZSAyRCBlbmdpbmUuCiAJICovCkBAIC0zNTcsNyArMzU5LDcgQEAKIAkJCQkJX1BTQl9DMkJfU1RBVFVTX0JVU1kpICE9IDApOwogCiBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+bXV0ZXhfMmQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5sb2NrXzJkLCBmbGFncyk7CiAJcmV0dXJuIChidXN5KSA/IC1FQlVTWSA6IDA7CiB9CiAKQEAgLTM4OCwxOSArMzkwLDE5IEBACiAJZm9yIChpID0gMDsgaSA8IG9wLT5zaXplOyBpKyssIG9wX3B0cisrKSB7CiAJCXUzMiByID0gKm9wX3B0ciAmIDB4RjAwMDAwMDA7CiAJCS8qIEZpbGwgaW4gdGhlIEdUVCBvZmZzZXRzIGZvciB0aGUgY29tbWFuZCBidWZmZXIgKi8KLSAgICAgICAgCWlmIChyID09IFBTQl8yRF9TUkNfU1VSRl9CSCB8fAotCQkJciA9PSBQU0JfMkRfRFNUX1NVUkZfQkggfHwgCisJCWlmIChyID09IFBTQl8yRF9TUkNfU1VSRl9CSCB8fAorCQkJciA9PSBQU0JfMkRfRFNUX1NVUkZfQkggfHwKIAkJCXIgPT0gUFNCXzJEX01BU0tfU1VSRl9CSCB8fAogCQkJciA9PSBQU0JfMkRfUEFUX1NVUkZfQkgpIHsKIAkJCWkrKzsKIAkJCW9wX3B0cisrOwogCQkJaWYgKGkgPT0gb3AtPnNpemUpCiAJCQkJZ290byBiYWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKm9wX3B0cikKKwkJCWlmICgqb3BfcHRyKQogCQkJCWdvdG8gYmFkOwotICAgICAgICAgICAgICAgICAgICAgICAgKm9wX3B0ciA9IGd0dC0+b2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQorCQkJKm9wX3B0ciA9IGd0dC0+b2Zmc2V0OworCQkJY29udGludWU7CisJCX0KIAl9CiAJcHNiZmJfMmRfc3VibWl0KGRldl9wcml2LCBvcC0+Y21kLCBvcC0+c2l6ZSk7CiAJZXJyID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvY2R2X2RldmljZS5jIGIvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9jZHZfZGV2aWNlLmMKaW5kZXggODc2MTRlMC4uOGVjMTBjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9jZHZfZGV2aWNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9jZHZfZGV2aWNlLmMKQEAgLTMwLDcgKzMwLDYgQEAKICNkZWZpbmUgVkdBX1NSX0lOREVYCQkweDNjNAogI2RlZmluZSBWR0FfU1JfREFUQQkJMHgzYzUKIAotLyogRklYTUU6IHNob3VsZCBjaGVjayBpZiB3ZSBhcmUgdGhlIGFjdGl2ZSBWR0EgZGV2aWNlID8/ICovCiBzdGF0aWMgdm9pZCBjZHZfZGlzYWJsZV92Z2Eoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsKIAl1OCBzcjE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL2ZyYW1lYnVmZmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL2ZyYW1lYnVmZmVyLmMKaW5kZXggZWJmZGUxMy4uM2YzOWEzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9mcmFtZWJ1ZmZlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvZnJhbWVidWZmZXIuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgInBzYl9pbnRlbF9yZWcuaCIKICNpbmNsdWRlICJwc2JfaW50ZWxfZHJ2LmgiCiAjaW5jbHVkZSAiZnJhbWVidWZmZXIuaCIKKyNpbmNsdWRlICJndHQuaCIKIAogI2luY2x1ZGUgIm1kZmxkX291dHB1dC5oIgogCkBAIC05MSw2ICs5MiwyMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHBzYmZiX3BhbihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IHBzYl9mYmRldiAqZmJkZXYgPSBpbmZvLT5wYXI7CisJc3RydWN0IHBzYl9mcmFtZWJ1ZmZlciAqcHNiZmIgPSAmZmJkZXYtPnBmYjsKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gcHNiZmItPmJhc2UuZGV2OworCisJLyoKKwkgKglXZSBoYXZlIHRvIHBva2Ugb3VyIG5vc2UgaW4gaGVyZS4gVGhlIGNvcmUgZmIgY29kZSBhc3N1bWVzCisJICoJcGFubmluZyBpcyBwYXJ0IG9mIHRoZSBoYXJkd2FyZSB0aGF0IGNhbiBiZSBpbnZva2VkIGJlZm9yZQorCSAqCXRoZSBhY3R1YWwgZmIgaXMgbWFwcGVkLiBJbiBvdXIgY2FzZSB0aGF0IGlzbid0IHF1aXRlIHRydWUuCisJICovCisJaWYgKHBzYmZiLT5ndHQtPm5wYWdlKQorICAgICAgICAJcHNiX2d0dF9yb2xsKGRldiwgcHNiZmItPmd0dCwgdmFyLT55b2Zmc2V0KTsKKwlyZXR1cm4gMDsKK30KIAogdm9pZCBwc2JmYl9zdXNwZW5kKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CkBAIC0yMTcsNiArMjMzLDIxIEBACiAJLmZiX2lvY3RsID0gcHNiZmJfaW9jdGwsCiB9OwogCitzdGF0aWMgc3RydWN0IGZiX29wcyBwc2JmYl9yb2xsX29wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuZmJfY2hlY2tfdmFyID0gZHJtX2ZiX2hlbHBlcl9jaGVja192YXIsCisJLmZiX3NldF9wYXIgPSBkcm1fZmJfaGVscGVyX3NldF9wYXIsCisJLmZiX2JsYW5rID0gZHJtX2ZiX2hlbHBlcl9ibGFuaywKKwkuZmJfc2V0Y29scmVnID0gcHNiZmJfc2V0Y29scmVnLAorCS5mYl9maWxscmVjdCA9IGNmYl9maWxscmVjdCwKKwkuZmJfY29weWFyZWEgPSBjZmJfY29weWFyZWEsCisJLmZiX2ltYWdlYmxpdCA9IGNmYl9pbWFnZWJsaXQsCisJLmZiX3Bhbl9kaXNwbGF5ID0gcHNiZmJfcGFuLAorCS5mYl9tbWFwID0gcHNiZmJfbW1hcCwKKwkuZmJfc3luYyA9IHBzYmZiX3N5bmMsCisJLmZiX2lvY3RsID0gcHNiZmJfaW9jdGwsCit9OworCiBzdGF0aWMgc3RydWN0IGZiX29wcyBwc2JmYl91bmFjY2VsX29wcyA9IHsKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkuZmJfY2hlY2tfdmFyID0gZHJtX2ZiX2hlbHBlcl9jaGVja192YXIsCkBAIC0zMDQsNiArMzM1LDcgQEAKICAqCXBzYmZiX2FsbG9jCQktCWFsbG9jYXRlIGZyYW1lIGJ1ZmZlciBtZW1vcnkKICAqCUBkZXY6IHRoZSBEUk0gZGV2aWNlCiAgKglAYWxpZ25lZF9zaXplOiBzcGFjZSBuZWVkZWQKKyAqCUBmb3JjZTogZmFsbCBiYWNrIHRvIEdFTSBidWZmZXJzIGlmIG5lZWQgYmUKICAqCiAgKglBbGxvY2F0ZSB0aGUgZnJhbWUgYnVmZmVyLiBJbiB0aGUgdXN1YWwgY2FzZSB3ZSBnZXQgYSBHVFQgcmFuZ2UgdGhhdAogICoJaXMgc3RvbGVuIG1lbW9yeSBiYWNrZWQgYW5kIGxpZmUgaXMgc2ltcGxlLiBJZiB0aGVyZSBpc24ndCBzdWZmaWNpZW50CkBAIC0zMTEsMTEgKzM0Myw5IEBACiAgKglhbmQgYmFjayBpdCB3aXRoIGEgR0VNIG9iamVjdC4KICAqCiAgKglJbiB0aGlzIGNhc2UgdGhlIEdFTSBvYmplY3QgaGFzIG5vIGhhbmRsZS4KLSAqCi0gKglGSVhNRTogY29uc29sZSBzcGVlZCB1cCAtIGFsbG9jYXRlIHR3aWNlIHRoZSBzcGFjZSBpZiByb29tIGFuZCB1c2UKLSAqCWhhcmR3YXJlIHNjcm9sbGluZyBmb3IgYWNjZWxlcmF0aW9uLgogICovCi1zdGF0aWMgc3RydWN0IGd0dF9yYW5nZSAqcHNiZmJfYWxsb2Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGFsaWduZWRfc2l6ZSkKK3N0YXRpYyBzdHJ1Y3QgZ3R0X3JhbmdlICpwc2JmYl9hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQkJaW50IGFsaWduZWRfc2l6ZSwgaW50IGZvcmNlKQogewogCXN0cnVjdCBndHRfcmFuZ2UgKmJhY2tpbmc7CiAJLyogQmVnaW4gYnkgdHJ5aW5nIHRvIHVzZSBzdG9sZW4gbWVtb3J5IGJhY2tpbmcgKi8KQEAgLTMyNiw2ICszNTYsOSBAQAogCQkJcmV0dXJuIGJhY2tpbmc7CiAJCXBzYl9ndHRfZnJlZV9yYW5nZShkZXYsIGJhY2tpbmcpOwogCX0KKwlpZiAoIWZvcmNlKQorCQlyZXR1cm4gTlVMTDsKKwogCS8qIE5leHQgdHJ5IHVzaW5nIEdFTSBob3N0IG1lbW9yeSAqLwogCWJhY2tpbmcgPSBwc2JfZ3R0X2FsbG9jX3JhbmdlKGRldiwgYWxpZ25lZF9zaXplLCAiZmIoZ2VtKSIsIDApOwogCWlmIChiYWNraW5nID09IE5VTEwpCkBAIC0zNTksNiArMzkyLDcgQEAKIAlpbnQgc2l6ZTsKIAlpbnQgcmV0OwogCXN0cnVjdCBndHRfcmFuZ2UgKmJhY2tpbmc7CisJaW50IGd0dF9yb2xsID0gMTsKIAogCW1vZGVfY21kLndpZHRoID0gc2l6ZXMtPnN1cmZhY2Vfd2lkdGg7CiAJbW9kZV9jbWQuaGVpZ2h0ID0gc2l6ZXMtPnN1cmZhY2VfaGVpZ2h0OwpAQCAtMzY4LDE3ICs0MDIsMzcgQEAKIAlpZiAobW9kZV9jbWQuYnBwID09IDI0KQogCQltb2RlX2NtZC5icHAgPSAzMjsKIAotCS8qIEhXIHJlcXVpcmVzIHBpdGNoIHRvIGJlIDY0IGJ5dGUgYWxpZ25lZCAqLwotCW1vZGVfY21kLnBpdGNoID0gIEFMSUdOKG1vZGVfY21kLndpZHRoICogKChtb2RlX2NtZC5icHAgKyA3KSAvIDgpLCA2NCk7CisJLyogQWNjZWxlcmF0aW9uIHZpYSB0aGUgR1RUIHJlcXVpcmVzIHBpdGNoIHRvIGJlIDQwOTYgYnl0ZSBhbGlnbmVkIAorCSAgIChpZSAxMDI0IG9yIDIwNDggcGl4ZWxzIGluIG5vcm1hbCB1c2UpICovCisJbW9kZV9jbWQucGl0Y2ggPSAgQUxJR04obW9kZV9jbWQud2lkdGggKiAoKG1vZGVfY21kLmJwcCArIDcpIC8gOCksIDQwOTYpOwogCW1vZGVfY21kLmRlcHRoID0gc2l6ZXMtPnN1cmZhY2VfZGVwdGg7CiAKIAlzaXplID0gbW9kZV9jbWQucGl0Y2ggKiBtb2RlX2NtZC5oZWlnaHQ7CiAJc2l6ZSA9IEFMSUdOKHNpemUsIFBBR0VfU0laRSk7CiAKIAkvKiBBbGxvY2F0ZSB0aGUgZnJhbWVidWZmZXIgaW4gdGhlIEdUVCB3aXRoIHN0b2xlbiBwYWdlIGJhY2tpbmcgKi8KLQliYWNraW5nID0gcHNiZmJfYWxsb2MoZGV2LCBzaXplKTsKLQlpZiAoYmFja2luZyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKKwliYWNraW5nID0gcHNiZmJfYWxsb2MoZGV2LCBzaXplLCAwKTsKKwlpZiAoYmFja2luZyA9PSBOVUxMKSB7CisJCS8qCisJCSAqCVdlIGNvdWxkbid0IGdldCB0aGUgc3BhY2Ugd2Ugd2FudGVkLCBmYWxsIGJhY2sgdG8gdGhlCisJCSAqCWRpc3BsYXkgZW5naW5lIHJlcXVpcmVtZW50IGluc3RlYWQuICBUaGUgSFcgcmVxdWlyZXMKKwkJICoJdGhlIHBpdGNoIHRvIGJlIDY0IGJ5dGUgYWxpZ25lZAorCQkgKi8KKworCQlndHRfcm9sbCA9IDA7CS8qIERvbid0IHVzZSBHVFQgYWNjZWxlcmF0ZWQgc2Nyb2xsaW5nICovCisKKwkJbW9kZV9jbWQucGl0Y2ggPSAgQUxJR04obW9kZV9jbWQud2lkdGggKiAoKG1vZGVfY21kLmJwcCArIDcpIC8gOCksIDY0KTsKKwkJbW9kZV9jbWQuZGVwdGggPSBzaXplcy0+c3VyZmFjZV9kZXB0aDsKKworCQlzaXplID0gbW9kZV9jbWQucGl0Y2ggKiBtb2RlX2NtZC5oZWlnaHQ7CisJCXNpemUgPSBBTElHTihzaXplLCBQQUdFX1NJWkUpOworCisJCS8qIEFsbG9jYXRlIHRoZSBmcmFtZWJ1ZmZlciBpbiB0aGUgR1RUIHdpdGggc3RvbGVuIHBhZ2UKKwkJICAgYmFja2luZyB3aGVuIHRoZXJlIGlzIHJvb20gKi8KKwkJYmFja2luZyA9IHBzYmZiX2FsbG9jKGRldiwgc2l6ZSwgMSk7CisJCWlmIChiYWNraW5nID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKIAltdXRleF9sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CiAKQEAgLTQwMiwxMSArNDU2LDE0IEBACiAJc3RyY3B5KGluZm8tPmZpeC5pZCwgInBzYmZiIik7CiAKIAlpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUOwotCS8qIE5vIDJEIGVuZ2luZSAqLwotCWlmICghZGV2X3ByaXYtPm9wcy0+YWNjZWxfMmQpCi0JCWluZm8tPmZib3BzID0gJnBzYmZiX3VuYWNjZWxfb3BzOwotCWVsc2UKKwlpZiAoZ3R0X3JvbGwpIHsJLyogR1RUIHJvbGxpbmcgc2VlbXMgYmVzdCAqLworCQlpbmZvLT5mYm9wcyA9ICZwc2JmYl9yb2xsX29wczsKKwkJaW5mby0+ZmxhZ3MgfD0gRkJJTkZPX0hXQUNDRUxfWVBBTjsKKyAgICAgICAgfQorCWVsc2UgaWYgKGRldl9wcml2LT5vcHMtPmFjY2VsXzJkKQkvKiAyRCBlbmdpbmUgKi8KIAkJaW5mby0+ZmJvcHMgPSAmcHNiZmJfb3BzOworCWVsc2UJLyogU29mdHdhcmUgKi8KKwkJaW5mby0+ZmJvcHMgPSAmcHNiZmJfdW5hY2NlbF9vcHM7CiAKIAlyZXQgPSBmYl9hbGxvY19jbWFwKCZpbmZvLT5jbWFwLCAyNTYsIDApOwogCWlmIChyZXQpIHsKQEAgLTQxNiw2ICs0NzMsOCBAQAogCiAJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBkZXYtPm1vZGVfY29uZmlnLmZiX2Jhc2U7CiAJaW5mby0+Zml4LnNtZW1fbGVuID0gc2l6ZTsKKwlpbmZvLT5maXgueXdyYXBzdGVwID0gZ3R0X3JvbGw7CisJaW5mby0+Zml4LnlwYW5zdGVwID0gZ3R0X3JvbGw7CiAKIAlpZiAoYmFja2luZy0+c3RvbGVuKSB7CiAJCS8qIEFjY2Vzc2VkIHN0b2xlbiBtZW1vcnkgZGlyZWN0bHkgKi8KQEAgLTczMyw5ICs3OTIsMTIgQEAKIAkJCWNsb25lX21hc2sgPSAoMSA8PCBJTlRFTF9PVVRQVVRfTUlQSTIpOwogCQkJYnJlYWs7CiAJCWNhc2UgSU5URUxfT1VUUFVUX0hETUk6Ci0JCQlpZiAoSVNfTUZMRChkZXYpKQorCQkgICAgICAgIC8qIEhETUkgb24gY3J0YyAxIGZvciBTb0MgZGV2aWNlcyBhbmQgY3J0YyAwIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VkYXJ2aWV3LiBIRE1JIG9uIFBvdWxzYm8gaXMgb25seSB2aWEgZXh0ZXJuYWwKKwkJCSAgIGxvZ2ljICovCisJCQlpZiAoSVNfTUZMRChkZXYpIHx8IElTX01SU1QoZGV2KSkKIAkJCQljcnRjX21hc2sgPSAoMSA8PCAxKTsKLQkJCWVsc2UJLyogRklYTUU6IHJldmlldyBPYWt0cmFpbCAqLworCQkJZWxzZQogCQkJCWNydGNfbWFzayA9ICgxIDw8IDApOwkvKiBDZWRhcnZpZXcgKi8KIAkJCWNsb25lX21hc2sgPSAoMSA8PCBJTlRFTF9PVVRQVVRfSERNSSk7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvZ2VtLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL2dlbS5jCmluZGV4IDY1ZmRkNmIuLmY2NDMzYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvZ2VtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9nZW0uYwpAQCAtMTIwLDggKzEyMCw3IEBACiAJLyogSW5pdGlhbGl6ZSB0aGUgZXh0cmEgZ29vZGllcyBHRU0gbmVlZHMgdG8gZG8gYWxsIHRoZSBoYXJkIHdvcmsgKi8KIAlpZiAoZHJtX2dlbV9vYmplY3RfaW5pdChkZXYsICZyLT5nZW0sIHNpemUpICE9IDApIHsKIAkJcHNiX2d0dF9mcmVlX3JhbmdlKGRldiwgcik7Ci0JCS8qIEdFTSBkb2Vzbid0IGdpdmUgYW4gZXJyb3IgY29kZSBhbmQgd2UgZG9uJ3QgaGF2ZSBhbgotCQkgICBFR0VNU1VDS1Mgc28gbWFrZSBzb21ldGhpbmcgdXAgZm9yIG5vdyAtIEZJWE1FICovCisJCS8qIEdFTSBkb2Vzbid0IGdpdmUgYW4gZXJyb3IgY29kZSBzbyB1c2UgLUVOT01FTSAqLwogCQlkZXZfZXJyKGRldi0+ZGV2LCAiR0VNIGluaXQgZmFpbGVkIGZvciAlbGxkXG4iLCBzaXplKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMTkxLDggKzE5MCw2IEBACiAgKglUaGUgVk1BIHdhcyBzZXQgdXAgYnkgR0VNLiBJbiBkb2luZyBzbyBpdCBhbHNvIGVuc3VyZWQgdGhhdCB0aGUKICAqCXZtYS0+dm1fcHJpdmF0ZV9kYXRhIHBvaW50cyB0byB0aGUgR0VNIG9iamVjdCB0aGF0IGlzIGJhY2tpbmcgdGhpcwogICoJbWFwcGluZy4KLSAqCi0gKglGSVhNRQogICovCiBpbnQgcHNiX2dlbV9mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL2d0dC5jIGIvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9ndHQuYwppbmRleCA0NjFlYWQyLi5lNzcwYmQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL2d0dC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvZ3R0LmMKQEAgLTcyLDkgKzcyLDggQEAKICAqCUByOiBvdXIgR1RUIHJhbmdlCiAgKgogICoJVGFrZSBvdXIgcHJlYWxsb2NhdGVkIEdUVCByYW5nZSBhbmQgaW5zZXJ0IHRoZSBHRU0gb2JqZWN0IGludG8KLSAqCXRoZSBHVFQuCi0gKgotICoJRklYTUU6IGd0dCBsb2NrID8KKyAqCXRoZSBHVFQuIFRoaXMgaXMgcHJvdGVjdGVkIHZpYSB0aGUgZ3R0IG11dGV4IHdoaWNoIHRoZSBjYWxsZXIKKyAqCW11c3QgaG9sZC4KICAqLwogc3RhdGljIGludCBwc2JfZ3R0X2luc2VydChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZ3R0X3JhbmdlICpyKQogewpAQCAtOTYsMTIgKzk1LDE3IEBACiAJc2V0X3BhZ2VzX2FycmF5X3VjKHBhZ2VzLCByLT5ucGFnZSk7CiAKIAkvKiBXcml0ZSBvdXIgcGFnZSBlbnRyaWVzIGludG8gdGhlIEdUVCBpdHNlbGYgKi8KLQlmb3IgKGkgPSAwOyBpIDwgci0+bnBhZ2U7IGkrKykgewotCQlwdGUgPSBwc2JfZ3R0X21hc2tfcHRlKHBhZ2VfdG9fcGZuKCpwYWdlcysrKSwgMC8qdHlwZSovKTsKKwlmb3IgKGkgPSByLT5yb2xsOyBpIDwgci0+bnBhZ2U7IGkrKykgeworCQlwdGUgPSBwc2JfZ3R0X21hc2tfcHRlKHBhZ2VfdG9fcGZuKHItPnBhZ2VzW2ldKSwgMCk7CisJCWlvd3JpdGUzMihwdGUsIGd0dF9zbG90KyspOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgci0+cm9sbDsgaSsrKSB7CisJCXB0ZSA9IHBzYl9ndHRfbWFza19wdGUocGFnZV90b19wZm4oci0+cGFnZXNbaV0pLCAwKTsKIAkJaW93cml0ZTMyKHB0ZSwgZ3R0X3Nsb3QrKyk7CiAJfQogCS8qIE1ha2Ugc3VyZSBhbGwgdGhlIGVudHJpZXMgYXJlIHNldCBiZWZvcmUgd2UgcmV0dXJuICovCiAJaW9yZWFkMzIoZ3R0X3Nsb3QgLSAxKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMTEsOSArMTE1LDkgQEAKICAqCUByOiBvdXIgR1RUIHJhbmdlCiAgKgogICoJUmVtb3ZlIGEgcHJlYWxsb2NhdGVkIEdUVCByYW5nZSBmcm9tIHRoZSBHVFQuIE92ZXJ3cml0ZSBhbGwgdGhlCi0gKglwYWdlIHRhYmxlIGVudHJpZXMgd2l0aCB0aGUgZHVtbXkgcGFnZQorICoJcGFnZSB0YWJsZSBlbnRyaWVzIHdpdGggdGhlIGR1bW15IHBhZ2UuIFRoaXMgaXMgcHJvdGVjdGVkIHZpYSB0aGUgZ3R0CisgKgltdXRleCB3aGljaCB0aGUgY2FsbGVyIG11c3QgaG9sZC4KICAqLwotCiBzdGF0aWMgdm9pZCBwc2JfZ3R0X3JlbW92ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZ3R0X3JhbmdlICpyKQogewogCXN0cnVjdCBkcm1fcHNiX3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTEzMiwxMSArMTM2LDUyIEBACiB9CiAKIC8qKgorICoJcHNiX2d0dF9yb2xsCS0Jc2V0IHNjcm9sbGluZyBwb3NpdGlvbgorICoJQGRldjogb3VyIERSTSBkZXZpY2UKKyAqCUByOiB0aGUgZ3R0IG1hcHBpbmcgd2UgYXJlIHVzaW5nCisgKglAcm9sbDogcm9sbCBvZmZzZXQKKyAqCisgKglSb2xsIGFuIGV4aXN0aW5nIHBpbm5lZCBtYXBwaW5nIGJ5IG1vdmluZyB0aGUgcGFnZXMgdGhyb3VnaCB0aGUgR1RULgorICoJVGhpcyBhbGxvd3MgdXMgdG8gaW1wbGVtZW50IGhhcmR3YXJlIHNjcm9sbGluZyBvbiB0aGUgY29uc29sZXMgd2l0aG91dAorICoJYSAyRCBlbmdpbmUKKyAqLwordm9pZCBwc2JfZ3R0X3JvbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGd0dF9yYW5nZSAqciwgaW50IHJvbGwpCit7CisJdTMyICpndHRfc2xvdCwgcHRlOworCWludCBpOworCisJaWYgKHJvbGwgPj0gci0+bnBhZ2UpIHsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuOworCX0KKworCXItPnJvbGwgPSByb2xsOworCisJLyogTm90IGN1cnJlbnRseSBpbiB0aGUgR1RUIC0gbm8gd29ycnkgd2Ugd2lsbCB3cml0ZSB0aGUgbWFwcGluZyBhdAorCSAgIHRoZSByaWdodCBwb3NpdGlvbiB3aGVuIGl0IGdldHMgcGlubmVkICovCisJaWYgKCFyLT5zdG9sZW4gJiYgIXItPmluX2dhcnQpCisJCXJldHVybjsKKworCWd0dF9zbG90ID0gcHNiX2d0dF9lbnRyeShkZXYsIHIpOworCisJZm9yIChpID0gci0+cm9sbDsgaSA8IHItPm5wYWdlOyBpKyspIHsKKwkJcHRlID0gcHNiX2d0dF9tYXNrX3B0ZShwYWdlX3RvX3BmbihyLT5wYWdlc1tpXSksIDApOworCQlpb3dyaXRlMzIocHRlLCBndHRfc2xvdCsrKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IHItPnJvbGw7IGkrKykgeworCQlwdGUgPSBwc2JfZ3R0X21hc2tfcHRlKHBhZ2VfdG9fcGZuKHItPnBhZ2VzW2ldKSwgMCk7CisJCWlvd3JpdGUzMihwdGUsIGd0dF9zbG90KyspOworCX0KKwlpb3JlYWQzMihndHRfc2xvdCAtIDEpOworfQorCisvKioKICAqCXBzYl9ndHRfYXR0YWNoX3BhZ2VzCS0JYXR0YWNoIGFuZCBwaW4gR0VNIHBhZ2VzCiAgKglAZ3Q6IHRoZSBndHQgcmFuZ2UKICAqCiAgKglQaW4gYW5kIGJ1aWxkIGFuIGluIGtlcm5lbCBsaXN0IG9mIHRoZSBwYWdlcyB0aGF0IGJhY2sgb3VyIEdFTSBvYmplY3QuCi0gKglXaGlsZSB3ZSBob2xkIHRoaXMgdGhlIHBhZ2VzIGNhbm5vdCBiZSBzd2FwcGVkIG91dAorICoJV2hpbGUgd2UgaG9sZCB0aGlzIHRoZSBwYWdlcyBjYW5ub3QgYmUgc3dhcHBlZCBvdXQuIFRoaXMgaXMgcHJvdGVjdGVkCisgKgl2aWEgdGhlIGd0dCBtdXRleCB3aGljaCB0aGUgY2FsbGVyIG11c3QgaG9sZC4KICAqLwogc3RhdGljIGludCBwc2JfZ3R0X2F0dGFjaF9wYWdlcyhzdHJ1Y3QgZ3R0X3JhbmdlICpndCkKIHsKQEAgLTE1OCw3ICsyMDMsNyBAQAogCWd0LT5ucGFnZSA9IHBhZ2VzOwogCiAJZm9yIChpID0gMDsgaSA8IHBhZ2VzOyBpKyspIHsKLQkJLyogRklYTUU6IHJldmlldyBmbGFncyBsYXRlciAqLworCQkvKiBGSVhNRTogbmVlZHMgdXBkYXRpbmcgYXMgcGVyIG1haWwgZnJvbSBIdWdoIERpY2tpbnMgKi8KIAkJcCA9IHJlYWRfY2FjaGVfcGFnZV9nZnAobWFwcGluZywgaSwKIAkJCQkJX19HRlBfQ09MRCB8IEdGUF9LRVJORUwpOwogCQlpZiAoSVNfRVJSKHApKQpAQCAtMTgxLDcgKzIyNiw4IEBACiAgKgogICoJVW5kbyB0aGUgZWZmZWN0IG9mIHBzYl9ndHRfYXR0YWNoX3BhZ2VzLiBBdCB0aGlzIHBvaW50IHRoZSBwYWdlcwogICoJbXVzdCBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBHVFQgYXMgdGhleSBjb3VsZCBub3cgYmUgcGFnZWQgb3V0Ci0gKglhbmQgbW92ZSBidXMgYWRkcmVzcy4KKyAqCWFuZCBtb3ZlIGJ1cyBhZGRyZXNzLiBUaGlzIGlzIHByb3RlY3RlZCB2aWEgdGhlIGd0dCBtdXRleCB3aGljaCB0aGUKKyAqCWNhbGxlciBtdXN0IGhvbGQuCiAgKi8KIHN0YXRpYyB2b2lkIHBzYl9ndHRfZGV0YWNoX3BhZ2VzKHN0cnVjdCBndHRfcmFuZ2UgKmd0KQogewpAQCAtMzAwLDYgKzM0Niw3IEBACiAJZ3QtPnJlc291cmNlLm5hbWUgPSBuYW1lOwogCWd0LT5zdG9sZW4gPSBiYWNrZWQ7CiAJZ3QtPmluX2dhcnQgPSBiYWNrZWQ7CisJZ3QtPnJvbGwgPSAwOwogCS8qIEVuc3VyZSB0aGlzIGlzIHNldCBmb3Igbm9uIEdFTSBvYmplY3RzICovCiAJZ3QtPmdlbS5kZXYgPSBkZXY7CiAJcmV0ID0gYWxsb2NhdGVfcmVzb3VyY2UoZGV2X3ByaXYtPmd0dF9tZW0sICZndC0+cmVzb3VyY2UsCkBAIC0zOTAsMTUgKzQzNywxOCBAQAogCXBnLT5ndHRfcGh5c19zdGFydCA9IGRldl9wcml2LT5wZ2VfY3RsICYgUEFHRV9NQVNLOwogCiAJLyoKLQkgKglGSVhNRTogdmlkZW8gbW11IGhhcyBodyBidWcgdG8gYWNjZXNzIDB4MEQwMDAwMDAwLAotCSAqCXRoZW4gbWFrZSBnYXR0IHN0YXJ0IGF0IDB4MGUwMDAsMDAwMAorCSAqCVRoZSB2aWRlbyBtbXUgaGFzIGEgaHcgYnVnIHdoZW4gYWNjZXNzaW5nIDB4MEQwMDAwMDAwLgorCSAqCU1ha2UgZ2F0dCBzdGFydCBhdCAweDBlMDAwLDAwMDAuIFRoaXMgZG9lc24ndCBhY3R1YWxseQorCSAqCW1hdHRlciBmb3IgdXMgYnV0IG1heSBkbyBpZiB0aGUgdmlkZW8gYWNjZWxlcmF0aW9uIGV2ZXIKKwkgKglnZXRzIG9wZW5lZCB1cC4KIAkgKi8KIAlwZy0+bW11X2dhdHRfc3RhcnQgPSAweEUwMDAwMDAwOwogCiAJcGctPmd0dF9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIFBTQl9HVFRfUkVTT1VSQ0UpOwogCWd0dF9wYWdlcyA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCBQU0JfR1RUX1JFU09VUkNFKQogCQkJCQkJCQk+PiBQQUdFX1NISUZUOwotCS8qIENEViB3b3JrYXJvdW5kICovCisJLyogU29tZSBDRFYgZmlybXdhcmUgZG9lc24ndCByZXBvcnQgdGhpcyBjdXJyZW50bHkuIEluIHdoaWNoIGNhc2UgdGhlCisJICAgc3lzdGVtIGhhcyA2NCBndHQgcGFnZXMgKi8KIAlpZiAocGctPmd0dF9zdGFydCA9PSAwIHx8IGd0dF9wYWdlcyA9PSAwKSB7CiAJCWRldl9lcnIoZGV2LT5kZXYsICJHVFQgUENJIEJBUiBub3QgaW5pdGlhbGl6ZWQuXG4iKTsKIAkJZ3R0X3BhZ2VzID0gNjQ7CkBAIC00MTIsMTMgKzQ2MiwxNiBAQAogCiAJaWYgKHBnLT5nYXR0X3BhZ2VzID09IDAgfHwgcGctPmdhdHRfc3RhcnQgPT0gMCkgewogCQlzdGF0aWMgc3RydWN0IHJlc291cmNlIGZ1ZGdlOwkvKiBQcmVmZXJhYmx5IHBlcHBlcm1pbnQgKi8KLQogCQkvKiBUaGlzIGNhbiBvY2N1ciBvbiBDRFYgU0RWIHN5c3RlbXMuIEZ1ZGdlIGl0IGluIHRoaXMgY2FzZS4KIAkJICAgV2UgcmVhbGx5IGRvbid0IGNhcmUgd2hhdCBpbWFnaW5hcnkgc3BhY2UgaXMgYmVpbmcgYWxsb2NhdGVkCiAJCSAgIGF0IHRoaXMgcG9pbnQgKi8KIAkJZGV2X2VycihkZXYtPmRldiwgIkdBVFQgUENJIEJBUiBub3QgaW5pdGlhbGl6ZWQuXG4iKTsKIAkJcGctPmdhdHRfc3RhcnQgPSAweDQwMDAwMDAwOwogCQlwZy0+Z2F0dF9wYWdlcyA9ICgxMjggKiAxMDI0ICogMTAyNCkgPj4gUEFHRV9TSElGVDsKKwkJLyogVGhpcyBpcyBhIGxpdHRsZSBjb25mdXNpbmcgYnV0IGluIGZhY3QgdGhlIEdUVCBpcyBwcm92aWRpbmcKKwkJICAgYSB2aWV3IGZyb20gdGhlIEdQVSBpbnRvIG1lbW9yeSBhbmQgbm90IHZpY2UgdmVyc2EuIEFzIHN1Y2gKKwkJICAgdGhpcyBpcyByZWFsbHkgYWxsb2NhdGluZyBzcGFjZSB0aGF0IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUKKwkJICAgQ1BVIGFkZHJlc3Mgc3BhY2Ugb24gQ0RWICovCiAJCWZ1ZGdlLnN0YXJ0ID0gMHg0MDAwMDAwMDsKIAkJZnVkZ2UuZW5kID0gMHg0MDAwMDAwMCArIDEyOCAqIDEwMjQgKiAxMDI0IC0gMTsKIAkJZnVkZ2UubmFtZSA9ICJmdWRnZSI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL2d0dC5oIGIvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9ndHQuaAppbmRleCBlMGUxY2I2Li5hYTE3NDIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL2d0dC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvZ3R0LmgKQEAgLTQ5LDYgKzQ5LDcgQEAKIAlib29sIG1tYXBwaW5nOwkJCS8qIElzIG1tYXBwYWJsZSAqLwogCXN0cnVjdCBwYWdlICoqcGFnZXM7CQkvKiBCYWNraW5nIHBhZ2VzIGlmIHByZXNlbnQgKi8KIAlpbnQgbnBhZ2U7CQkJLyogTnVtYmVyIG9mIGJhY2tpbmcgcGFnZXMgKi8KKwlpbnQgcm9sbDsJCQkvKiBSb2xsIGFwcGxpZWQgdG8gdGhlIEdUVCBlbnRyaWVzICovCiB9OwogCiBleHRlcm4gc3RydWN0IGd0dF9yYW5nZSAqcHNiX2d0dF9hbGxvY19yYW5nZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgbGVuLApAQCAtNTcsNSArNTgsNyBAQAogZXh0ZXJuIHZvaWQgcHNiX2d0dF9mcmVlX3JhbmdlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVjdCBndHRfcmFuZ2UgKmd0KTsKIGV4dGVybiBpbnQgcHNiX2d0dF9waW4oc3RydWN0IGd0dF9yYW5nZSAqZ3QpOwogZXh0ZXJuIHZvaWQgcHNiX2d0dF91bnBpbihzdHJ1Y3QgZ3R0X3JhbmdlICpndCk7CitleHRlcm4gdm9pZCBwc2JfZ3R0X3JvbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGd0dF9yYW5nZSAqZ3QsIGludCByb2xsKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL2ludGVsX29wcmVnaW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL2ludGVsX29wcmVnaW9uLmMKaW5kZXggZDJlNjAzNy4uZDk0NmJjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9pbnRlbF9vcHJlZ2lvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvaW50ZWxfb3ByZWdpb24uYwpAQCAtMjAsNiArMjAsNyBAQAogICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgogICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogICoKKyAqIEZJWE1FOiByZXNvbHZlIHdpdGggdGhlIGk5MTUgdmVyc2lvbgogICovCiAKICNpbmNsdWRlICJwc2JfZHJ2LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL21kZmxkX2ludGVsX2Rpc3BsYXkuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbWRmbGRfaW50ZWxfZGlzcGxheS5jCmluZGV4IGFhMmZmNTUuLjhlYjgyN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbWRmbGRfaW50ZWxfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbWRmbGRfaW50ZWxfZGlzcGxheS5jCkBAIC0yODIsNyArMjgyLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCQkKLSNpZiAxIC8qIEZJWE1FX0pMSVU3IGNhbid0IGVuYWxiZSBjdXJzb3JCL0MgSFcgaXNzdWUuIG5lZWQgdG8gcmVtb3ZlIGFmdGVyIEhXIGZpeCAqLworI2lmIDEgLyogRklYTUVfSkxJVTcgY2FuJ3QgZW5hYmxlIGN1cnNvckIvQyBIVyBpc3N1ZS4gbmVlZCB0byByZW1vdmUgYWZ0ZXIgSFcgZml4ICovCiAJaWYgKHBpcGUgIT0gMCkKIAkJcmV0dXJuIDA7CiAjZW5kaWYgCkBAIC00ODQsNyArNDg0LDcgQEAKIAogCS8qIEZJWE1FX0pMSVU3IE1ERkxEX1BPIHJldmlzaXQgKi8KIAkvKiBXYWl0IGZvciB2YmxhbmsgZm9yIHRoZSBkaXNhYmxlIHRvIHRha2UgZWZmZWN0ICovCi0vLyBNREZMRF9QT19KTElVNwkJcHNiX2ludGVsX3dhaXRfZm9yX3ZibGFuayhkZXYpOworLyogTURGTERfUE9fSkxJVTcJCXBzYl9pbnRlbF93YWl0X2Zvcl92YmxhbmsoZGV2KTsgKi8KIAogCS8qIE5leHQsIGRpc2FibGUgZGlzcGxheSBwaXBlcyAqLwogCXRlbXAgPSBSRUdfUkVBRChwaXBlY29uZl9yZWcpOwpAQCAtNTYxLDcgKzU2MSw2IEBACiAJICAgIC8vZ2JkaXNwc3RhdHVzID0gdHJ1ZTsKIAl9CiAKLQogLyogRklYTUVfSkxJVTcgTURGTERfUE8gcmVwbGFjZWQgdy8gdGhlIGZvbGxvd2luZyBmdW5jdGlvbiAqLwogLyogbWRmbGRfZGJpX2RwbXMgKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlLCBib29sIGVuYWJsZWQpICovCiAKQEAgLTExNTAsOCArMTE0OSwxMSBAQAogCQkJZGV2LT5tb2RlX2NvbmZpZy5zY2FsaW5nX21vZGVfcHJvcGVydHksICZzY2FsaW5nVHlwZSk7CiAKIAlpZiAoc2NhbGluZ1R5cGUgPT0gRFJNX01PREVfU0NBTEVfTk9fU0NBTEUpIHsKLQkJLypNb29yZXN0b3duIGRvZXNuJ3QgaGF2ZSByZWdpc3RlciBzdXBwb3J0IGZvciBjZW50ZXJpbmcgc28gd2UgbmVlZCB0bwotCQkgIG1lc3Mgd2l0aCB0aGUgaC92YmxhbmsgYW5kIGgvdnN5bmMgc3RhcnQgYW5kIGVuZHMgdG8gZ2V0IGNlbnRlcmluZyovCisJCS8qCisJCSAqCU1lZGZpZWxkIGRvZXNuJ3QgaGF2ZSByZWdpc3RlciBzdXBwb3J0IGZvciBjZW50ZXJpbmcgc28KKwkJICoJd2UgbmVlZCB0byBtZXNzIHdpdGggdGhlIGgvdmJsYW5rIGFuZCBoL3ZzeW5jIHN0YXJ0IGFuZAorCQkgKgllbmRzIHRvIGdldCBjZW50cmFsCisJCSAqLwogCQlpbnQgb2Zmc2V0WCA9IDAsIG9mZnNldFkgPSAwOwogCiAJCW9mZnNldFggPSAoYWRqdXN0ZWRfbW9kZS0+Y3J0Y19oZGlzcGxheSAtIG1vZGUtPmNydGNfaGRpc3BsYXkpIC8gMjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbXJzdF9jcnRjLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL21yc3RfY3J0Yy5jCmluZGV4IDcyNDY0ZGQuLmM5MzExYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvbXJzdF9jcnRjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9tcnN0X2NydGMuYwpAQCAtNTIxLDEyICs1MjEsMTEgQEAKIAkJCSAgICBpbnQgeCwgaW50IHksIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKm9sZF9mYikKIHsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwotCS8qIHN0cnVjdCBkcm1faTkxNV9tYXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXY7ICovCiAJc3RydWN0IHBzYl9pbnRlbF9jcnRjICpwc2JfaW50ZWxfY3J0YyA9IHRvX3BzYl9pbnRlbF9jcnRjKGNydGMpOwogCXN0cnVjdCBwc2JfZnJhbWVidWZmZXIgKnBzYmZiID0gdG9fcHNiX2ZiKGNydGMtPmZiKTsKIAlpbnQgcGlwZSA9IHBzYl9pbnRlbF9jcnRjLT5waXBlOwogCXVuc2lnbmVkIGxvbmcgc3RhcnQsIG9mZnNldDsKLQkvKiBGSVhNRTogY2hlY2sgaWYgd2UgbmVlZCB0aGlzIHN1cmVseSBNUlNUIGlzIHBpcGUgMCBvbmx5ICovCisKIAlpbnQgZHNwYmFzZSA9IChwaXBlID09IDAgPyBEU1BBTElOT0ZGIDogRFNQQkJBU0UpOwogCWludCBkc3BzdXJmID0gKHBpcGUgPT0gMCA/IERTUEFTVVJGIDogRFNQQlNVUkYpOwogCWludCBkc3BzdHJpZGUgPSAocGlwZSA9PSAwKSA/IERTUEFTVFJJREUgOiBEU1BCU1RSSURFOwpAQCAtNTcyLDE1ICs1NzEsMTAgQEAKIAl9CiAJUkVHX1dSSVRFKGRzcGNudHJfcmVnLCBkc3BjbnRyKTsKIAotCWlmICgwIC8qIEZJWE1FQUMgLSBjaGVjayB3aGF0IFBTQiBuZWVkcyAqLykgewotCQlSRUdfV1JJVEUoZHNwYmFzZSwgb2Zmc2V0KTsKLQkJUkVHX1JFQUQoZHNwYmFzZSk7Ci0JCVJFR19XUklURShkc3BzdXJmLCBzdGFydCk7Ci0JCVJFR19SRUFEKGRzcHN1cmYpOwotCX0gZWxzZSB7Ci0JCVJFR19XUklURShkc3BiYXNlLCBzdGFydCArIG9mZnNldCk7Ci0JCVJFR19SRUFEKGRzcGJhc2UpOwotCX0KKwlSRUdfV1JJVEUoZHNwYmFzZSwgb2Zmc2V0KTsKKwlSRUdfUkVBRChkc3BiYXNlKTsKKwlSRUdfV1JJVEUoZHNwc3VyZiwgc3RhcnQpOworCVJFR19SRUFEKGRzcHN1cmYpOwogCiBwaXBlX3NldF9iYXNlX2V4aXQ6CiAJZ21hX3Bvd2VyX2VuZChkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wb3dlci5jIGIvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wb3dlci5jCmluZGV4IDk3MmJlYTcuLjQzNmZlOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcG93ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3Bvd2VyLmMKQEAgLTgzLDcgKzgzLDcgQEAKIHsKIAlzdHJ1Y3QgZHJtX3BzYl9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKLQlpZiAoZGV2X3ByaXYtPnN1c3BlbmRlZCkKKwlpZiAoIWRldl9wcml2LT5kaXNwbGF5X3Bvd2VyKQogCQlyZXR1cm47CiAJZGV2X3ByaXYtPm9wcy0+c2F2ZV9yZWdzKGRldik7CiAJZGV2X3ByaXYtPm9wcy0+cG93ZXJfZG93bihkZXYpOwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgZHJtX3BzYl9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKLQlpZiAoZGV2X3ByaXYtPnN1c3BlbmRlZCA9PSBmYWxzZSkKKwlpZiAoZGV2X3ByaXYtPmRpc3BsYXlfcG93ZXIpCiAJCXJldHVybjsKIAogCS8qIHR1cm4gb24gdGhlIGRpc3BsYXkgcG93ZXIgaXNsYW5kICovCkBAIC0yNjUsNiArMjY1LDggQEAKIAkvKiBPayBwb3dlciB1cCBuZWVkZWQgKi8KIAlyZXQgPSBnbWFfcmVzdW1lX3BjaShkZXYtPnBkZXYpOwogCWlmIChyZXQgPT0gMCkgeworCQkvKiBGSVhNRTogd2Ugd2FudCB0byBkZWZlciB0aGlzIGZvciBNZWRmaWVsZC9PYWt0cmFpbCAqLworCQlnbWFfcmVzdW1lX2Rpc3BsYXkoZGV2KTsKIAkJcHNiX2lycV9wcmVpbnN0YWxsKGRldik7CiAJCXBzYl9pcnFfcG9zdGluc3RhbGwoZGV2KTsKIAkJcG1fcnVudGltZV9nZXQoJmRldi0+cGRldi0+ZGV2KTsKQEAgLTMwMiw3ICszMDQsNyBAQAogCiBpbnQgcHNiX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZ21hX3Bvd2VyX3Jlc3VtZShkZXYpOzsKIH0KIAogaW50IHBzYl9ydW50aW1lX2lkbGUoc3RydWN0IGRldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wc2JfZGV2aWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9kZXZpY2UuYwppbmRleCA0NjU5MTMyLi5iOTdhYTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9kZXZpY2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9kZXZpY2UuYwpAQCAtMjEzLDcgKzIxMyw2IEBACiAJc3RydWN0IGRybV9wc2JfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKIAlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwotCWludCBwcF9zdGF0OwogCiAJLyogRGlzcGxheSBhcmJpdHJhdGlvbiArIHdhdGVybWFya3MgKi8KIAlQU0JfV1ZEQzMyKGRldl9wcml2LT5zYXZlRFNQQVJCLCBEU1BBUkIpOwpAQCAtMjM3LDM3ICsyMzYsNiBAQAogCQljb25uZWN0b3ItPmZ1bmNzLT5yZXN0b3JlKGNvbm5lY3Rvcik7CiAKIAltdXRleF91bmxvY2soJmRldi0+bW9kZV9jb25maWcubXV0ZXgpOwotCi0JaWYgKGRldl9wcml2LT5pTFZEU19lbmFibGUpIHsKLQkJLypzaHV0ZG93biB0aGUgcGFuZWwqLwotCQlQU0JfV1ZEQzMyKDAsIFBQX0NPTlRST0wpOwotCQlkbyB7Ci0JCQlwcF9zdGF0ID0gUFNCX1JWREMzMihQUF9TVEFUVVMpOwotCQl9IHdoaWxlIChwcF9zdGF0ICYgMHg4MDAwMDAwMCk7Ci0KLQkJLyogVHVybiBvZmYgdGhlIHBsYW5lICovCi0JCVBTQl9XVkRDMzIoMHg1ODAwMDAwMCwgRFNQQUNOVFIpOwotCQlQU0JfV1ZEQzMyKDAsIERTUEFTVVJGKTsvKnRyaWdnZXIgdGhlIHBsYW5lIGRpc2FibGUqLwotCQkvKiBXYWl0IH40IHRpY2tzICovCi0JCW1zbGVlcCg0KTsKLQkJLyogVHVybiBvZmYgcGlwZSAqLwotCQlQU0JfV1ZEQzMyKDB4MCwgUElQRUFDT05GKTsKLQkJLyogV2FpdCB+OCB0aWNrcyAqLwotCQltc2xlZXAoOCk7Ci0KLQkJLyogVHVybiBvZmYgUExMcyAqLwotCQlQU0JfV1ZEQzMyKDAsIE1SU1RfRFBMTF9BKTsKLQl9IGVsc2UgewotCQlQU0JfV1ZEQzMyKERQSV9TSFVUX0RPV04sIERQSV9DT05UUk9MX1JFRyk7Ci0JCVBTQl9XVkRDMzIoMHgwLCBQSVBFQUNPTkYpOwotCQlQU0JfV1ZEQzMyKDB4MmZhZjAwMDAsIEJMQ19QV01fQ1RMKTsKLQkJd2hpbGUgKFJFR19SRUFEKDB4NzAwMDgpICYgMHg0MDAwMDAwMCkKLQkJCWNwdV9yZWxheCgpOwotCQl3aGlsZSAoKFBTQl9SVkRDMzIoR0VOX0ZJRk9fU1RBVF9SRUcpICYgRFBJX0ZJRk9fRU1QVFkpCi0JCQkhPSBEUElfRklGT19FTVBUWSkKLQkJCWNwdV9yZWxheCgpOwotCQlQU0JfV1ZEQzMyKDAsIERFVklDRV9SRUFEWV9SRUcpOwotCX0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wc2JfZHJ2LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9kcnYuYwppbmRleCBiMmNkY2U3Li5kYzY3NmMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9kcnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9kcnYuYwpAQCAtMTgzLDcgKzE4Myw2IEBACiAKIHN0YXRpYyB2b2lkIHBzYl9kb190YWtlZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewotCS8qIEZJWE1FOiBkbyB3ZSBuZWVkIHRvIGNsZWFuIHVwIHRoZSBndHQgaGVyZSA/ICovCiB9CiAKIHN0YXRpYyBpbnQgcHNiX2RvX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKQEAgLTIyOSw3ICsyMjgsNyBAQAogCiAKIAlzcGluX2xvY2tfaW5pdCgmZGV2X3ByaXYtPmlycW1hc2tfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmZGV2X3ByaXYtPm11dGV4XzJkKTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2X3ByaXYtPmxvY2tfMmQpOwogCiAJUFNCX1dTR1gzMigweDAwMDAwMDAwLCBQU0JfQ1JfQklGX0JBTkswKTsKIAlQU0JfV1NHWDMyKDB4MDAwMDAwMDAsIFBTQl9DUl9CSUZfQkFOSzEpOwpAQCAtMzI5LDYgKzMyOCwxMSBAQAogCWRldl9wcml2LT5kZXYgPSBkZXY7CiAJZGV2LT5kZXZfcHJpdmF0ZSA9ICh2b2lkICopIGRldl9wcml2OwogCisJaWYgKCFJU19QU0IoZGV2KSkgeworCQlpZiAocGNpX2VuYWJsZV9tc2koZGV2LT5wZGV2KSkKKwkJCWRldl93YXJuKGRldi0+ZGV2LCAiRW5hYmxpbmcgTVNJIGZhaWxlZCFcbiIpOworCX0KKwogCWRldl9wcml2LT5udW1fcGlwZSA9IGRldl9wcml2LT5vcHMtPnBpcGVzOwogCiAJcmVzb3VyY2Vfc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCBQU0JfTU1JT19SRVNPVVJDRSk7CkBAIC00MTAsNyArNDE0LDcgQEAKIAlQU0JfV1ZEQzMyKDB4MDAwMDAwMDAsIFBTQl9JTlRfRU5BQkxFX1IpOwogCVBTQl9XVkRDMzIoMHhGRkZGRkZGRiwgUFNCX0lOVF9NQVNLX1IpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldl9wcml2LT5pcnFtYXNrX2xvY2ssIGlycWZsYWdzKTsKLQlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKKwlpZiAoSVNfUFNCKGRldikgJiYgZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKIAkJZHJtX2lycV9pbnN0YWxsKGRldik7CiAKIAlkZXYtPnZibGFua19kaXNhYmxlX2FsbG93ZWQgPSAxOwpAQCAtNDQ0LDEyICs0NDgsOSBAQAogCiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLSNpZiAwCi0JLyplbmFibGUgcnVudGltZSBwbSBhdCBsYXN0Ki8KLQlwbV9ydW50aW1lX2VuYWJsZSgmZGV2LT5wZGV2LT5kZXYpOworCisJLyogRW5hYmxlIHJ1bnRpbWUgcG0gYXQgbGFzdCAqLwogCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZSgmZGV2LT5wZGV2LT5kZXYpOwotI2VuZGlmCi0JLypJbnRlbCBkcm0gZHJpdmVyIGxvYWQgaXMgZG9uZSwgY29udGludWUgZG9pbmcgcHZyIGxvYWQqLwogCXJldHVybiAwOwogb3V0X2VycjoKIAlwc2JfZHJpdmVyX3VubG9hZChkZXYpOwpAQCAtNDY2LDE0ICs0NjcsMTMgQEAKIAkJCSAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQogewogCXN0cnVjdCBkcm1fcHNiX3ByaXZhdGUgKmRldl9wcml2ID0gcHNiX3ByaXYoZGV2KTsKLQlzdHJ1Y3QgZHJtX3BzYl9zaXplc19hcmcgKmFyZyA9Ci0JCShzdHJ1Y3QgZHJtX3BzYl9zaXplc19hcmcgKikgZGF0YTsKKwlzdHJ1Y3QgZHJtX3BzYl9zaXplc19hcmcgKmFyZyA9IGRhdGE7CiAKIAkqYXJnID0gZGV2X3ByaXYtPnNpemVzOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBzYl9kY19zdGF0ZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICogZGF0YSwKK3N0YXRpYyBpbnQgcHNiX2RjX3N0YXRlX2lvY3RsKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCQkJc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCiB7CiAJdWludDMyX3QgZmxhZ3M7CkBAIC00ODEsOCArNDgxLDcgQEAKIAlzdHJ1Y3QgZHJtX21vZGVfb2JqZWN0ICpvYmo7CiAJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7Ci0Jc3RydWN0IGRybV9wc2JfZGNfc3RhdGVfYXJnICphcmcgPQotCQkoc3RydWN0IGRybV9wc2JfZGNfc3RhdGVfYXJnICopZGF0YTsKKwlzdHJ1Y3QgZHJtX3BzYl9kY19zdGF0ZV9hcmcgKmFyZyA9IGRhdGE7CiAKIAogCS8qIERvdWJsZSBjaGVjayBNUlNUIGNhc2UgKi8KQEAgLTExMTAsMTUgKzExMDksMTIgQEAKIHsKIAlzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZmlsZV9wcml2LT5taW5vci0+ZGV2OwotCXN0cnVjdCBkcm1fcHNiX3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQlzdGF0aWMgdW5zaWduZWQgaW50IHJ1bnRpbWVfYWxsb3dlZDsKLQotCWlmIChydW50aW1lX2FsbG93ZWQgPT0gMSAmJiBkZXZfcHJpdi0+aXNfbHZkc19vbikgewotCQlydW50aW1lX2FsbG93ZWQrKzsKLQkJcG1fcnVudGltZV9hbGxvdygmZGV2LT5wZGV2LT5kZXYpOwotCQlkZXZfcHJpdi0+cnBtX2VuYWJsZWQgPSAxOwotCX0KLQlyZXR1cm4gZHJtX2lvY3RsKGZpbHAsIGNtZCwgYXJnKTsKKwlpbnQgcmV0OworCQorCXBtX3J1bnRpbWVfZm9yYmlkKGRldi0+ZGV2KTsKKwlyZXQgPSBkcm1faW9jdGwoZmlscCwgY21kLCBhcmcpOworCXBtX3J1bnRpbWVfYWxsb3coZGV2LT5kZXYpOworCXJldHVybiByZXQ7CiAJLyogRklYTUU6IGRvIHdlIG5lZWQgdG8gd3JhcCB0aGUgb3RoZXIgc2lkZSBvZiB0aGlzICovCiB9CiAKQEAgLTExMzcsOCArMTEzMywxMiBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgcHNiX3BtX29wcyA9IHsKLQkucmVzdW1lID0gZ21hX3Bvd2VyX3Jlc3VtZSwKIAkuc3VzcGVuZCA9IGdtYV9wb3dlcl9zdXNwZW5kLAorCS5yZXN1bWUgPSBnbWFfcG93ZXJfcmVzdW1lLAorCS5mcmVlemUgPSBnbWFfcG93ZXJfc3VzcGVuZCwKKwkudGhhdyA9IGdtYV9wb3dlcl9yZXN1bWUsCisJLnBvd2Vyb2ZmID0gZ21hX3Bvd2VyX3N1c3BlbmQsCisJLnJlc3RvcmUgPSBnbWFfcG93ZXJfcmVzdW1lLAogCS5ydW50aW1lX3N1c3BlbmQgPSBwc2JfcnVudGltZV9zdXNwZW5kLAogCS5ydW50aW1lX3Jlc3VtZSA9IHBzYl9ydW50aW1lX3Jlc3VtZSwKIAkucnVudGltZV9pZGxlID0gcHNiX3J1bnRpbWVfaWRsZSwKQEAgLTEyMDcsOSArMTIwNyw2IEBACiAKIHN0YXRpYyBpbnQgcHNiX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogewotCS8qIE1MRCBBZGRlZCB0aGlzIGZyb20gSW5ha3kncyBwYXRjaCAqLwotCWlmIChwY2lfZW5hYmxlX21zaShwZGV2KSkKLQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkVuYWJsZSBNU0kgZmFpbGVkIVxuIik7CiAJcmV0dXJuIGRybV9nZXRfcGNpX2RldihwZGV2LCBlbnQsICZkcml2ZXIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9kcnYuaCBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2Rydi5oCmluZGV4IGZkNDczMmQuLjExZDk2M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2Rydi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2Rydi5oCkBAIC00Myw2ICs0Myw3IEBACiAJQ0hJUF9NRkxEXzAxMzAgPSAzLAkJLyogTWVkZmllbGQgKi8KIH07CiAKKyNkZWZpbmUgSVNfUFNCKGRldikgKCgoZGV2KS0+cGNpX2RldmljZSAmIDB4ZmZmZSkgPT0gMHg4MTA4KQogI2RlZmluZSBJU19NUlNUKGRldikgKCgoZGV2KS0+cGNpX2RldmljZSAmIDB4ZmZmYykgPT0gMHg0MTAwKQogI2RlZmluZSBJU19NRkxEKGRldikgKCgoZGV2KS0+cGNpX2RldmljZSAmIDB4ZmZmOCkgPT0gMHgwMTMwKQogCkBAIC0xMzQsNiArMTM1LDkgQEAKICNkZWZpbmUgX1BTQl9JUlFfTVNWRFhfRkxBRwkgICgxPDwxOSkKICNkZWZpbmUgX0xOQ19JUlFfVE9QQVpfRkxBRwkgICgxPDwyMCkKIAorI2RlZmluZSBfUFNCX1BJUEVfRVZFTlRfRkxBRwkoX1BTQl9WU1lOQ19QSVBFQV9GTEFHIHwgXAorCQkJCSBfUFNCX1ZTWU5DX1BJUEVCX0ZMQUcpCisKIC8qIFRoaXMgZmxhZyBpbmNsdWRlcyBhbGwgdGhlIGRpc3BsYXkgSVJRIGJpdHMgZXhjZXB0cyB0aGUgdmJsYW5rIGlycXMuICovCiAjZGVmaW5lIF9NREZMRF9ESVNQX0FMTF9JUlFfRkxBRyAoX01ERkxEX1BJUEVDX0VWRU5UX0ZMQUcgfCBcCiAJCQkJICBfTURGTERfUElQRUJfRVZFTlRfRkxBRyB8IFwKQEAgLTYwOCw3ICs2MTIsNyBAQAogCXZvaWQgKCpleGl0X2lkbGUpKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHUzMiB1cGRhdGVfc3JjKTsKIAogCS8qIDJEIGFjY2VsZXJhdGlvbiAqLwotCXN0cnVjdCBtdXRleCBtdXRleF8yZDsKKwlzcGlubG9ja190IGxvY2tfMmQ7CiAKIAkvKiBGSVhNRTogQXJyYXlzIGFueW9uZSA/ICovCiAJc3RydWN0IG1kZmxkX2RzaV9lbmNvZGVyICplbmNvZGVyMDsJCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9pbnRlbF9kaXNwbGF5LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9pbnRlbF9kaXNwbGF5LmMKaW5kZXggNGFmYTY3MS4uY2FhOWQ4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wc2JfaW50ZWxfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2ludGVsX2Rpc3BsYXkuYwpAQCAtMTEwMiwxMCArMTEwMiw2IEBACiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gc2V0LT5jcnRjLT5kZXY7Ci0Jc3RydWN0IGRybV9wc2JfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCi0JaWYgKCFkZXZfcHJpdi0+cnBtX2VuYWJsZWQpCi0JCXJldHVybiBkcm1fY3J0Y19oZWxwZXJfc2V0X2NvbmZpZyhzZXQpOwogCiAJcG1fcnVudGltZV9mb3JiaWQoJmRldi0+cGRldi0+ZGV2KTsKIAlyZXQgPSBkcm1fY3J0Y19oZWxwZXJfc2V0X2NvbmZpZyhzZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wc2JfaW50ZWxfbHZkcy5jIGIvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wc2JfaW50ZWxfbHZkcy5jCmluZGV4IGM2NDM2ZGEuLjIxMDIyZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2ludGVsX2x2ZHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9pbnRlbF9sdmRzLmMKQEAgLTY4LDIwICs2OCwyMyBAQAogc3RhdGljIHUzMiBwc2JfaW50ZWxfbHZkc19nZXRfbWF4X2JhY2tsaWdodChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkcm1fcHNiX3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKLQl1MzIgcmV0VmFsOworCXUzMiByZXQ7CiAKIAlpZiAoZ21hX3Bvd2VyX2JlZ2luKGRldiwgZmFsc2UpKSB7Ci0JCXJldFZhbCA9ICgoUkVHX1JFQUQoQkxDX1BXTV9DVEwpICYKLQkJCSAgQkFDS0xJR0hUX01PRFVMQVRJT05fRlJFUV9NQVNLKSA+PgotCQkJICBCQUNLTElHSFRfTU9EVUxBVElPTl9GUkVRX1NISUZUKSAqIDI7Ci0KKwkJcmV0ID0gUkVHX1JFQUQoQkxDX1BXTV9DVEwpOwogCQlnbWFfcG93ZXJfZW5kKGRldik7Ci0JfSBlbHNlCi0JCXJldFZhbCA9ICgoZGV2X3ByaXYtPnNhdmVCTENfUFdNX0NUTCAmCi0JCQkgIEJBQ0tMSUdIVF9NT0RVTEFUSU9OX0ZSRVFfTUFTSykgPj4KLQkJCSAgQkFDS0xJR0hUX01PRFVMQVRJT05fRlJFUV9TSElGVCkgKiAyOworCX0gZWxzZSAvKiBQb3dlcmVkIG9mZiwgdXNlIHRoZSBzYXZlZCB2YWx1ZSAqLworCQlyZXQgPSBkZXZfcHJpdi0+c2F2ZUJMQ19QV01fQ1RMOwogCi0JcmV0dXJuIHJldFZhbDsKKwkvKiBUb3AgMTViaXRzIGhvbGQgdGhlIGZyZXF1ZW5jeSBtYXNrICovCisJcmV0ID0gKHJldCAmICBCQUNLTElHSFRfTU9EVUxBVElPTl9GUkVRX01BU0spID4+CisJCQkJCUJBQ0tMSUdIVF9NT0RVTEFUSU9OX0ZSRVFfU0hJRlQ7CisKKyAgICAgICAgcmV0ICo9IDI7CS8qIFJldHVybiBhIDE2Yml0IHJhbmdlIGFzIG5lZWRlZCBmb3Igc2V0dGluZyAqLworICAgICAgICBpZiAocmV0ID09IDApCisgICAgICAgICAgICAgICAgZGV2X2VycihkZXYtPmRldiwgIkJMIGJ1ZzogUmVnICUwOHggc2F2ZSAlMDhYXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgUkVHX1JFQUQoQkxDX1BXTV9DVEwpLCBkZXZfcHJpdi0+c2F2ZUJMQ19QV01fQ1RMKTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtMTQyLDcgKzE0NSw3IEBACiAJbWF4X3B3bV9ibGMgPSBwc2JfaW50ZWxfbHZkc19nZXRfbWF4X2JhY2tsaWdodChkZXYpOwogCiAJLypCTENfUFdNX0NUTCBTaG91bGQgYmUgaW5pdGlhdGVkIHdoaWxlIGJhY2tsaWdodCBkZXZpY2UgaW5pdCovCi0JQlVHX09OKChtYXhfcHdtX2JsYyAmIFBTQl9CTENfTUFYX1BXTV9SRUdfRlJFUSkgPT0gMCk7CisJQlVHX09OKG1heF9wd21fYmxjID09IDApOwogCiAJYmxjX3B3bV9kdXR5X2N5Y2xlID0gbGV2ZWwgKiBtYXhfcHdtX2JsYyAvIEJSSUdIVE5FU1NfTUFYX0xFVkVMOwogCkBAIC0xNTQsNiArMTU3LDEwIEBACiAJCSAgKG1heF9wd21fYmxjIDw8IFBTQl9CQUNLTElHSFRfUFdNX0NUTF9TSElGVCkgfAogCQkgIChibGNfcHdtX2R1dHlfY3ljbGUpKTsKIAorICAgICAgICBkZXZfaW5mbyhkZXYtPmRldiwgIkJhY2tsaWdodCBsdmRzIHNldCBicmlnaHRuZXNzICUwOHhcbiIsCisJCSAgKG1heF9wd21fYmxjIDw8IFBTQl9CQUNLTElHSFRfUFdNX0NUTF9TSElGVCkgfAorCQkgIChibGNfcHdtX2R1dHlfY3ljbGUpKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNjIsMTQgKzE2OSwxMiBAQAogICovCiB2b2lkIHBzYl9pbnRlbF9sdmRzX3NldF9icmlnaHRuZXNzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBsZXZlbCkKIHsKLQkvKnUzMiBibGNfcHdtX2N0bDsqLwotCXN0cnVjdCBkcm1fcHNiX3ByaXZhdGUgKmRldl9wcml2ID0KLQkJCShzdHJ1Y3QgZHJtX3BzYl9wcml2YXRlICopZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgZHJtX3BzYl9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CiAKIAlkZXZfZGJnKGRldi0+ZGV2LCAiYmFja2xpZ2h0IGxldmVsIGlzICVkXG4iLCBsZXZlbCk7CiAKIAlpZiAoIWRldl9wcml2LT5sdmRzX2JsKSB7Ci0JCWRldl9lcnIoZGV2LT5kZXYsICJOTyBMVkRTIEJhY2tsaWdodCBJbmZvXG4iKTsKKwkJZGV2X2VycihkZXYtPmRldiwgIk5PIExWRFMgYmFja2xpZ2h0IGluZm9cbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xOTAsMTEgKzE5NSwxMyBAQAogCXUzMiBibGNfcHdtX2N0bDsKIAogCWlmIChnbWFfcG93ZXJfYmVnaW4oZGV2LCBmYWxzZSkpIHsKLQkJYmxjX3B3bV9jdGwgPQotCQkJUkVHX1JFQUQoQkxDX1BXTV9DVEwpICYgfkJBQ0tMSUdIVF9EVVRZX0NZQ0xFX01BU0s7CisJCWJsY19wd21fY3RsID0gUkVHX1JFQUQoQkxDX1BXTV9DVEwpOworCQlibGNfcHdtX2N0bCAmPSB+QkFDS0xJR0hUX0RVVFlfQ1lDTEVfTUFTSzsKIAkJUkVHX1dSSVRFKEJMQ19QV01fQ1RMLAogCQkJCShibGNfcHdtX2N0bCB8CiAJCQkJKGxldmVsIDw8IEJBQ0tMSUdIVF9EVVRZX0NZQ0xFX1NISUZUKSkpOworCQlkZXZfcHJpdi0+c2F2ZUJMQ19QV01fQ1RMID0gKGJsY19wd21fY3RsIHwKKwkJCQkJKGxldmVsIDw8IEJBQ0tMSUdIVF9EVVRZX0NZQ0xFX1NISUZUKSk7CiAJCWdtYV9wb3dlcl9lbmQoZGV2KTsKIAl9IGVsc2UgewogCQlibGNfcHdtX2N0bCA9IGRldl9wcml2LT5zYXZlQkxDX1BXTV9DVEwgJgpAQCAtMjEyLDkgKzIxOSwxMSBAQAogewogCXUzMiBwcF9zdGF0dXM7CiAKLQlpZiAoIWdtYV9wb3dlcl9iZWdpbihkZXYsIHRydWUpKQorCWlmICghZ21hX3Bvd2VyX2JlZ2luKGRldiwgdHJ1ZSkpIHsKKwkgICAgICAgIGRldl9lcnIoZGV2LT5kZXYsICJzZXQgcG93ZXIsIGNoaXAgb2ZmIVxuIik7CiAJCXJldHVybjsKLQorICAgICAgICB9CisgICAgICAgIAogCWlmIChvbikgewogCQlSRUdfV1JJVEUoUFBfQ09OVFJPTCwgUkVHX1JFQUQoUFBfQ09OVFJPTCkgfAogCQkJICBQT1dFUl9UQVJHRVRfT04pOwpAQCAtMjk2LDkgKzMwNSw2IEBACiB7CiAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNvbm5lY3Rvci0+ZGV2OwogCXUzMiBwcF9zdGF0dXM7Ci0KLQkvKnN0cnVjdCBkcm1fcHNiX3ByaXZhdGUgKmRldl9wcml2ID0KLQkJCQkoc3RydWN0IGRybV9wc2JfcHJpdmF0ZSAqKWRldi0+ZGV2X3ByaXZhdGU7Ki8KIAlzdHJ1Y3QgcHNiX2ludGVsX291dHB1dCAqcHNiX2ludGVsX291dHB1dCA9CiAJCQkJCXRvX3BzYl9pbnRlbF9vdXRwdXQoY29ubmVjdG9yKTsKIAlzdHJ1Y3QgcHNiX2ludGVsX2x2ZHNfcHJpdiAqbHZkc19wcml2ID0KQEAgLTM4Miw3ICszODgsNiBAQAogCWlmIChwc2JfaW50ZWxfb3V0cHV0LT50eXBlID09IElOVEVMX09VVFBVVF9NSVBJMikKIAkJcGFuZWxfZml4ZWRfbW9kZSA9IG1vZGVfZGV2LT5wYW5lbF9maXhlZF9tb2RlMjsKIAotCS8qIEZJWE1FOiByZXZpZXcgZm9yIE1lZGZpZWxkICovCiAJLyogUFNCIHJlcXVpcmVzIHRoZSBMVkRTIGlzIG9uIHBpcGUgQiwgTVJTVCBoYXMgb25seSBvbmUgcGlwZSBhbnl3YXkgKi8KIAlpZiAoIUlTX01SU1QoZGV2KSAmJiBwc2JfaW50ZWxfY3J0Yy0+cGlwZSA9PSAwKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3Qgc3VwcG9ydCBMVkRTIG9uIHBpcGUgQVxuIik7CkBAIC02MjIsNyArNjI3LDggQEAKIAkJCWdvdG8gc2V0X3Byb3BfZXJyb3I7CiAJCWVsc2UgewogI2lmZGVmIENPTkZJR19CQUNLTElHSFRfQ0xBU1NfREVWSUNFCi0JCQlzdHJ1Y3QgZHJtX3BzYl9wcml2YXRlICpkZXZwID0gZW5jb2Rlci0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwkJCXN0cnVjdCBkcm1fcHNiX3ByaXZhdGUgKmRldnAgPQorCQkJCQkJZW5jb2Rlci0+ZGV2LT5kZXZfcHJpdmF0ZTsKIAkJCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCA9IGRldnAtPmJhY2tsaWdodF9kZXZpY2U7CiAJCQlpZiAoYmQpIHsKIAkJCQliZC0+cHJvcHMuYnJpZ2h0bmVzcyA9IHZhbHVlOwpAQCAtNjk1LDggKzcwMSw3IEBACiAJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyOwogCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpzY2FuOwkvKiAqbW9kZXMsICpiaW9zX21vZGU7ICovCiAJc3RydWN0IGRybV9jcnRjICpjcnRjOwotCXN0cnVjdCBkcm1fcHNiX3ByaXZhdGUgKmRldl9wcml2ID0KLQkJCQkoc3RydWN0IGRybV9wc2JfcHJpdmF0ZSAqKWRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0IGRybV9wc2JfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwogCXUzMiBsdmRzOwogCWludCBwaXBlOwogCkBAIC03MTIsOCArNzE3LDggQEAKIAl9CiAKIAlwc2JfaW50ZWxfb3V0cHV0LT5kZXZfcHJpdiA9IGx2ZHNfcHJpdjsKLQogCXBzYl9pbnRlbF9vdXRwdXQtPm1vZGVfZGV2ID0gbW9kZV9kZXY7CisKIAljb25uZWN0b3IgPSAmcHNiX2ludGVsX291dHB1dC0+YmFzZTsKIAllbmNvZGVyID0gJnBzYl9pbnRlbF9vdXRwdXQtPmVuYzsKIAlkcm1fY29ubmVjdG9yX2luaXQoZGV2LCAmcHNiX2ludGVsX291dHB1dC0+YmFzZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nbWE1MDAvcHNiX2lycS5jIGIvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wc2JfaXJxLmMKaW5kZXggNGEwZmE0Mi4uMzZkZDYzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wc2JfaXJxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wc2JfaXJxLmMKQEAgLTEzOSwyMSArMTM5LDEwIEBACiB9CiAKIC8qKgotICogRGlzcGxheSBjb250cm9sbGVyIGludGVycnVwdCBoYW5kbGVyIGZvciB2c3luYy92YmxhbmsuCi0gKgotICovCi1zdGF0aWMgdm9pZCBtaWRfdmJsYW5rX2hhbmRsZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgcGlwZSkKLXsKLQlkcm1faGFuZGxlX3ZibGFuayhkZXYsIHBpcGUpOwotfQotCi0KLS8qKgogICogRGlzcGxheSBjb250cm9sbGVyIGludGVycnVwdCBoYW5kbGVyIGZvciBwaXBlIGV2ZW50LgogICoKICAqLwotI2RlZmluZSBXQUlUX1NUQVRVU19DTEVBUl9MT09QX0NPVU5UIDB4ZmZmZgotc3RhdGljIHZvaWQgbWlkX3BpcGVfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1aW50MzJfdCBwaXBlKQorc3RhdGljIHZvaWQgbWlkX3BpcGVfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSkKIHsKIAlzdHJ1Y3QgZHJtX3BzYl9wcml2YXRlICpkZXZfcHJpdiA9CiAJICAgIChzdHJ1Y3QgZHJtX3BzYl9wcml2YXRlICopIGRldi0+ZGV2X3ByaXZhdGU7CkBAIC0xNjIsNiArMTUxLDcgQEAKIAl1aW50MzJfdCBwaXBlX3N0YXRfcmVnID0gcHNiX3BpcGVzdGF0KHBpcGUpOwogCXVpbnQzMl90IHBpcGVfZW5hYmxlID0gZGV2X3ByaXYtPnBpcGVzdGF0W3BpcGVdOwogCXVpbnQzMl90IHBpcGVfc3RhdHVzID0gZGV2X3ByaXYtPnBpcGVzdGF0W3BpcGVdID4+IDE2OworCXVpbnQzMl90IHBpcGVfY2xlYXI7CiAJdWludDMyX3QgaSA9IDA7CiAKIAlzcGluX2xvY2soJmRldl9wcml2LT5pcnFtYXNrX2xvY2spOwpAQCAtMTcyLDI3ICsxNjIsMjMgQEAKIAogCXNwaW5fdW5sb2NrKCZkZXZfcHJpdi0+aXJxbWFza19sb2NrKTsKIAotCS8qIGNsZWFyIHRoZSAybmQgbGV2ZWwgaW50ZXJydXB0IHN0YXR1cyBiaXRzICovCi0JLyoqCi0JKiBGSVhNRTogc2hvdWxkbid0IHVzZSB3aGlsZSBsb29wIGhlcmUuIEhvd2V2ZXIsIHRoZSBpbnRlcnJ1cHQKLQkqIHN0YXR1cyAnc3RpY2t5JyBiaXRzIGNhbm5vdCBiZSBjbGVhcmVkIGJ5IHNldHRpbmcgJzEnIHRvIHRoYXQKLQkqIGJpdCBvbmNlLi4uCi0JKi8KLQlmb3IgKGkgPSAwOyBpIDwgV0FJVF9TVEFUVVNfQ0xFQVJfTE9PUF9DT1VOVDsgaSsrKSB7CisJLyogQ2xlYXIgdGhlIDJuZCBsZXZlbCBpbnRlcnJ1cHQgc3RhdHVzIGJpdHMKKwkgKiBTb21ldGltZXMgdGhlIGJpdHMgYXJlIHZlcnkgc3RpY2t5IHNvIHdlIHJlcGVhdCB1bnRpbCB0aGV5IHVuc3RpY2sgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMHhmZmZmOyBpKyspIHsKIAkJUFNCX1dWREMzMihQU0JfUlZEQzMyKHBpcGVfc3RhdF9yZWcpLCBwaXBlX3N0YXRfcmVnKTsKLQkJKHZvaWQpIFBTQl9SVkRDMzIocGlwZV9zdGF0X3JlZyk7CisJCXBpcGVfY2xlYXIgPSBQU0JfUlZEQzMyKHBpcGVfc3RhdF9yZWcpICYgcGlwZV9zdGF0dXM7CiAKLQkJaWYgKChQU0JfUlZEQzMyKHBpcGVfc3RhdF9yZWcpICYgcGlwZV9zdGF0dXMpID09IDApCisJCWlmIChwaXBlX2NsZWFyID09IDApCiAJCQlicmVhazsKIAl9CiAKLQlpZiAoaSA9PSBXQUlUX1NUQVRVU19DTEVBUl9MT09QX0NPVU5UKQorCWlmIChwaXBlX2NsZWFyKQogCQlkZXZfZXJyKGRldi0+ZGV2LAotCSIlcywgY2FuJ3QgY2xlYXIgdGhlIHN0YXR1cyBiaXRzIGluIHBpcGVfc3RhdF9yZWcsIGl0cyB2YWx1ZSA9IDB4JXguXG4iLAotCQkJX19mdW5jX18sIFBTQl9SVkRDMzIocGlwZV9zdGF0X3JlZykpOworCQkiJXMsIGNhbid0IGNsZWFyIHN0YXR1cyBiaXRzIGZvciBwaXBlICVkLCBpdHMgdmFsdWUgPSAweCV4LlxuIiwKKwkJX19mdW5jX18sIHBpcGUsIFBTQl9SVkRDMzIocGlwZV9zdGF0X3JlZykpOwogCiAJaWYgKHBpcGVfc3RhdF92YWwgJiBQSVBFX1ZCTEFOS19TVEFUVVMpCi0JCW1pZF92YmxhbmtfaGFuZGxlcihkZXYsIHBpcGUpOworCQlkcm1faGFuZGxlX3ZibGFuayhkZXYsIHBpcGUpOwogCiAJaWYgKHBpcGVfc3RhdF92YWwgJiBQSVBFX1RFX1NUQVRVUykKIAkJZHJtX2hhbmRsZV92YmxhbmsoZGV2LCBwaXBlKTsKQEAgLTIwMyw4ICsxODksMTEgQEAKICAqLwogc3RhdGljIHZvaWQgcHNiX3ZkY19pbnRlcnJ1cHQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdWludDMyX3QgdmRjX3N0YXQpCiB7Ci0JaWYgKHZkY19zdGF0ICYgX1BTQl9QSVBFQV9FVkVOVF9GTEFHKQorCWlmICh2ZGNfc3RhdCAmIF9QU0JfVlNZTkNfUElQRUFfRkxBRykKIAkJbWlkX3BpcGVfZXZlbnRfaGFuZGxlcihkZXYsIDApOworCisJaWYgKHZkY19zdGF0ICYgX1BTQl9WU1lOQ19QSVBFQl9GTEFHKQorCQltaWRfcGlwZV9ldmVudF9oYW5kbGVyKGRldiwgMSk7CiB9CiAKIGlycXJldHVybl90IHBzYl9pcnFfaGFuZGxlcihEUk1fSVJRX0FSR1MpCkBAIC0yMjAsOCArMjA5LDEzIEBACiAKIAl2ZGNfc3RhdCA9IFBTQl9SVkRDMzIoUFNCX0lOVF9JREVOVElUWV9SKTsKIAorCWlmICh2ZGNfc3RhdCAmIF9QU0JfUElQRV9FVkVOVF9GTEFHKQorCQlkc3BfaW50ID0gMTsKKworCS8qIEZJWE1FOiBIYW5kbGUgTWVkZmllbGQKIAlpZiAodmRjX3N0YXQgJiBfTURGTERfRElTUF9BTExfSVJRX0ZMQUcpCiAJCWRzcF9pbnQgPSAxOworCSovCiAKIAlpZiAodmRjX3N0YXQgJiBfUFNCX0lSUV9TR1hfRkxBRykKIAkJc2d4X2ludCA9IDE7CkBAIC0yNjcsMTMgKzI2MSwxOCBAQAogCWlmIChnbWFfcG93ZXJfaXNfb24oZGV2KSkKIAkJUFNCX1dWREMzMigweEZGRkZGRkZGLCBQU0JfSFdTVEFNKTsKIAlpZiAoZGV2LT52YmxhbmtfZW5hYmxlZFswXSkKLQkJZGV2X3ByaXYtPnZkY19pcnFfbWFzayB8PSBfUFNCX1BJUEVBX0VWRU5UX0ZMQUc7CisJCWRldl9wcml2LT52ZGNfaXJxX21hc2sgfD0gX1BTQl9WU1lOQ19QSVBFQV9GTEFHOworCWlmIChkZXYtPnZibGFua19lbmFibGVkWzFdKQorCQlkZXZfcHJpdi0+dmRjX2lycV9tYXNrIHw9IF9QU0JfVlNZTkNfUElQRUJfRkxBRzsKKworCS8qIEZJWE1FOiBIYW5kbGUgTWVkZmllbGQgaXJxIG1hc2sKIAlpZiAoZGV2LT52YmxhbmtfZW5hYmxlZFsxXSkKIAkJZGV2X3ByaXYtPnZkY19pcnFfbWFzayB8PSBfTURGTERfUElQRUJfRVZFTlRfRkxBRzsKIAlpZiAoZGV2LT52YmxhbmtfZW5hYmxlZFsyXSkKIAkJZGV2X3ByaXYtPnZkY19pcnFfbWFzayB8PSBfTURGTERfUElQRUNfRVZFTlRfRkxBRzsKKwkqLwogCi0JLypUaGlzIHJlZ2lzdGVyIGlzIHNhZmUgZXZlbiBpZiBkaXNwbGF5IGlzbGFuZCBpcyBvZmYqLworCS8qIFRoaXMgcmVnaXN0ZXIgaXMgc2FmZSBldmVuIGlmIGRpc3BsYXkgaXNsYW5kIGlzIG9mZiAqLwogCVBTQl9XVkRDMzIofmRldl9wcml2LT52ZGNfaXJxX21hc2ssIFBTQl9JTlRfTUFTS19SKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+aXJxbWFza19sb2NrLCBpcnFmbGFncyk7CiB9CkBAIC00NzEsNyArNDcwLDEzIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmlycW1hc2tfbG9jaywgaXJxZmxhZ3MpOwogCi0JbWlkX2VuYWJsZV9waXBlX2V2ZW50KGRldl9wcml2LCBwaXBlKTsKKwlpZiAocGlwZSA9PSAwKQorCQlkZXZfcHJpdi0+dmRjX2lycV9tYXNrIHw9IF9QU0JfVlNZTkNfUElQRUFfRkxBRzsKKwllbHNlIGlmIChwaXBlID09IDEpCisJCWRldl9wcml2LT52ZGNfaXJxX21hc2sgfD0gX1BTQl9WU1lOQ19QSVBFQl9GTEFHOworCisJUFNCX1dWREMzMih+ZGV2X3ByaXYtPnZkY19pcnFfbWFzaywgUFNCX0lOVF9NQVNLX1IpOworCVBTQl9XVkRDMzIoZGV2X3ByaXYtPnZkY19pcnFfbWFzaywgUFNCX0lOVF9FTkFCTEVfUik7CiAJcHNiX2VuYWJsZV9waXBlc3RhdChkZXZfcHJpdiwgcGlwZSwgUElQRV9WQkxBTktfSU5URVJSVVBUX0VOQUJMRSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZfcHJpdi0+aXJxbWFza19sb2NrLCBpcnFmbGFncyk7CkBAIC00OTMsNyArNDk4LDEzIEBACiAjZW5kaWYKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2X3ByaXYtPmlycW1hc2tfbG9jaywgaXJxZmxhZ3MpOwogCi0JbWlkX2Rpc2FibGVfcGlwZV9ldmVudChkZXZfcHJpdiwgcGlwZSk7CisJaWYgKHBpcGUgPT0gMCkKKwkJZGV2X3ByaXYtPnZkY19pcnFfbWFzayAmPSB+X1BTQl9WU1lOQ19QSVBFQV9GTEFHOworCWVsc2UgaWYgKHBpcGUgPT0gMSkKKwkJZGV2X3ByaXYtPnZkY19pcnFfbWFzayAmPSB+X1BTQl9WU1lOQ19QSVBFQl9GTEFHOworCisJUFNCX1dWREMzMih+ZGV2X3ByaXYtPnZkY19pcnFfbWFzaywgUFNCX0lOVF9NQVNLX1IpOworCVBTQl9XVkRDMzIoZGV2X3ByaXYtPnZkY19pcnFfbWFzaywgUFNCX0lOVF9FTkFCTEVfUik7CiAJcHNiX2Rpc2FibGVfcGlwZXN0YXQoZGV2X3ByaXYsIHBpcGUsIFBJUEVfVkJMQU5LX0lOVEVSUlVQVF9FTkFCTEUpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2X3ByaXYtPmlycW1hc2tfbG9jaywgaXJxZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wc2JfbGlkLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ21hNTAwL3BzYl9saWQuYwppbmRleCBhZjMyODUxLi5iODY3YWFiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wc2JfbGlkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dtYTUwMC9wc2JfbGlkLmMKQEAgLTUyLDggKzUyLDYgQEAKIAkJCXBwX3N0YXR1cyA9IFJFR19SRUFEKFBQX1NUQVRVUyk7CiAJCX0gd2hpbGUgKChwcF9zdGF0dXMgJiBQUF9PTikgPT0gMCk7CiAJfQotCQkvKiBwcmludGsoS0VSTl9JTkZPIiVzOiBsaWQ6IGNsb3NlZFxuIiwgX19GVU5DVElPTl9fKTsgKi8KLQogCWRldl9wcml2LT5saWRfbGFzdF9zdGF0ZSA9ICByZWFkbChsaWRfc3RhdGUpOwogCiBsaWRfdGltZXJfc2NoZWR1bGU6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2dvNzAwNy9NYWtlZmlsZQppbmRleCA2MGE5MTg1Li42ZWU4MzdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvTWFrZWZpbGUKQEAgLTIwLDE1ICsyMCwxMSBAQAogczIyNTAteSA6PSBzMjI1MC1ib2FyZC5vCiAKICMgVW5jb21tZW50IHdoZW4gdGhlIHNhYTcxMzQgcGF0Y2hlcyBnZXQgaW50byB1cHN0cmVhbQotI2lmbmVxICgkKENPTkZJR19WSURFT19TQUE3MTM0KSwpCiAjb2JqLSQoQ09ORklHX1ZJREVPX1NBQTcxMzQpICs9IHNhYTcxMzQtZ283MDA3Lm8KLSNFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQgLURTQUE3MTM0X01QRUdfR083MDA3PTMKLSNlbmRpZgorI2NjZmxhZ3MtJChDT05GSUdfVklERU9fU0FBNzEzNDptPXkpICs9IC1JZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0IC1EU0FBNzEzNF9NUEVHX0dPNzAwNz0zCiAKICMgUzIyNTAgbmVlZHMgY3lwcmVzcyBlenVzYiBsb2FkZXIgZnJvbSBkdmItdXNiCi1pZm5lcSAoJChDT05GSUdfVklERU9fR083MDA3X1VTQl9TMjI1MF9CT0FSRCksKQotY2NmbGFncy15IDo9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYgotZW5kaWYKK2NjZmxhZ3MtJChDT05GSUdfVklERU9fR083MDA3X1VTQl9TMjI1MF9CT0FSRDptPXkpICs9IC1JZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYgogCiBjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMKIGNjZmxhZ3MteSArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ283MDA3L3dpcy10dzI4MDQuYyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLXR3MjgwNC5jCmluZGV4IDViMjE4YzUuLjkxMzRmMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLXR3MjgwNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nbzcwMDcvd2lzLXR3MjgwNC5jCkBAIC0zMyw4ICszMyw3IEBACiAJaW50IGh1ZTsKIH07CiAKLXN0YXRpYyB1OCBnbG9iYWxfcmVnaXN0ZXJzW10gPQoteworc3RhdGljIHU4IGdsb2JhbF9yZWdpc3RlcnNbXSA9IHsKIAkweDM5LCAweDAwLAogCTB4M2EsIDB4ZmYsCiAJMHgzYiwgMHg4NCwKQEAgLTQ1LDggKzQ0LDcgQEAKIAkweGZmLCAweGZmLCAvKiBUZXJtaW5hdG9yIChyZWcgMHhmZiBkb2VzIG5vdCBleGlzdCkgKi8KIH07CiAKLXN0YXRpYyB1OCBjaGFubmVsX3JlZ2lzdGVyc1tdID0KLXsKK3N0YXRpYyB1OCBjaGFubmVsX3JlZ2lzdGVyc1tdID0gewogCTB4MDEsIDB4YzQsCiAJMHgwMiwgMHhhNSwKIAkweDAzLCAweDIwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaHYvS2NvbmZpZwppbmRleCA1ZTBjOWY2Li4wNzIxODVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvS2NvbmZpZwpAQCAtMSw0NiArMSwxNyBAQAotY29uZmlnIEhZUEVSVgotCXRyaXN0YXRlICJNaWNyb3NvZnQgSHlwZXItViBjbGllbnQgZHJpdmVycyIKLQlkZXBlbmRzIG9uIFg4NiAmJiBBQ1BJICYmIFBDSSAmJiBtCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIHJ1biBMaW51eCBhcyBhIEh5cGVyLVYgY2xpZW50IG9wZXJhdGluZwotCSAgc3lzdGVtLgotCi1pZiBIWVBFUlYKLQogY29uZmlnIEhZUEVSVl9TVE9SQUdFCiAJdHJpc3RhdGUgIk1pY3Jvc29mdCBIeXBlci1WIHZpcnR1YWwgc3RvcmFnZSBkcml2ZXIiCi0JZGVwZW5kcyBvbiBTQ1NJCi0JZGVmYXVsdCBIWVBFUlYKKwlkZXBlbmRzIG9uIEhZUEVSViAmJiBTQ1NJCiAJaGVscAogCSBTZWxlY3QgdGhpcyBvcHRpb24gdG8gZW5hYmxlIHRoZSBIeXBlci1WIHZpcnR1YWwgc3RvcmFnZSBkcml2ZXIuCiAKLWNvbmZpZyBIWVBFUlZfQkxPQ0sKLQl0cmlzdGF0ZSAiTWljcm9zb2Z0IEh5cGVyLVYgdmlydHVhbCBibG9jayBkcml2ZXIiCi0JZGVwZW5kcyBvbiBCTE9DSyAmJiBTQ1NJICYmIChMQkRBRiB8fCA2NEJJVCkKLQlkZWZhdWx0IEhZUEVSVgotCWhlbHAKLQkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byBlbmFibGUgdGhlIEh5cGVyLVYgdmlydHVhbCBibG9jayBkcml2ZXIuCi0KIGNvbmZpZyBIWVBFUlZfTkVUCiAJdHJpc3RhdGUgIk1pY3Jvc29mdCBIeXBlci1WIHZpcnR1YWwgbmV0d29yayBkcml2ZXIiCi0JZGVwZW5kcyBvbiBORVQKLQlkZWZhdWx0IEhZUEVSVgorCWRlcGVuZHMgb24gSFlQRVJWICYmIE5FVAogCWhlbHAKIAkgIFNlbGVjdCB0aGlzIG9wdGlvbiB0byBlbmFibGUgdGhlIEh5cGVyLVYgdmlydHVhbCBuZXR3b3JrIGRyaXZlci4KIAotY29uZmlnIEhZUEVSVl9VVElMUwotCXRyaXN0YXRlICJNaWNyb3NvZnQgSHlwZXItViBVdGlsaXRpZXMgZHJpdmVyIgotCWRlcGVuZHMgb24gQ09OTkVDVE9SICYmIE5MUwotCWRlZmF1bHQgSFlQRVJWCi0JaGVscAotCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIGVuYWJsZSB0aGUgSHlwZXItViBVdGlsaXRpZXMuCi0KIGNvbmZpZyBIWVBFUlZfTU9VU0UKIAl0cmlzdGF0ZSAiTWljcm9zb2Z0IEh5cGVyLVYgbW91c2UgZHJpdmVyIgotCWRlcGVuZHMgb24gSElECi0JZGVmYXVsdCBIWVBFUlYKKwlkZXBlbmRzIG9uIEhZUEVSViAmJiBISUQKIAloZWxwCiAJICBTZWxlY3QgdGhpcyBvcHRpb24gdG8gZW5hYmxlIHRoZSBIeXBlci1WIG1vdXNlIGRyaXZlci4KLQotZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9odi9NYWtlZmlsZQppbmRleCAzMDA0Njc0Li5lMDcxYzEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L01ha2VmaWxlCkBAIC0xLDE0ICsxLDcgQEAKLW9iai0kKENPTkZJR19IWVBFUlYpCQkrPSBodl92bWJ1cy5vIGh2X3RpbWVzb3VyY2Uubworb2JqLSQoQ09ORklHX0hZUEVSVikJCSs9IGh2X3RpbWVzb3VyY2Uubwogb2JqLSQoQ09ORklHX0hZUEVSVl9TVE9SQUdFKQkrPSBodl9zdG9ydnNjLm8KLW9iai0kKENPTkZJR19IWVBFUlZfQkxPQ0spCSs9IGh2X2Jsa3ZzYy5vCiBvYmotJChDT05GSUdfSFlQRVJWX05FVCkJKz0gaHZfbmV0dnNjLm8KLW9iai0kKENPTkZJR19IWVBFUlZfVVRJTFMpCSs9IGh2X3V0aWxzLm8KIG9iai0kKENPTkZJR19IWVBFUlZfTU9VU0UpCSs9IGh2X21vdXNlLm8KIAotaHZfdm1idXMteSA6PSB2bWJ1c19kcnYubyBcCi0JCSBodi5vIGNvbm5lY3Rpb24ubyBjaGFubmVsLm8gXAotCQkgY2hhbm5lbF9tZ210Lm8gcmluZ19idWZmZXIubwotaHZfc3RvcnZzYy15IDo9IHN0b3J2c2NfZHJ2Lm8gc3RvcnZzYy5vCi1odl9ibGt2c2MteSA6PSBibGt2c2NfZHJ2Lm8gIHN0b3J2c2MubworaHZfc3RvcnZzYy15IDo9IHN0b3J2c2NfZHJ2Lm8KIGh2X25ldHZzYy15IDo9IG5ldHZzY19kcnYubyBuZXR2c2MubyBybmRpc19maWx0ZXIubwotaHZfdXRpbHMteSA6PSBodl91dGlsLm8gaHZfa3ZwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2h2L1RPRE8KaW5kZXggNTgyZmQ0YS4uZWQ0ZDYzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L1RPRE8KKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L1RPRE8KQEAgLTEsMTQgKzEsNyBAQAogVE9ETzoKLQktIGZpeCByZW1haW5pbmcgY2hlY2twYXRjaCB3YXJuaW5ncyBhbmQgZXJyb3JzCi0JLSBhdWRpdCB0aGUgdm1idXMgdG8gdmVyaWZ5IGl0IGlzIHdvcmtpbmcgcHJvcGVybHkgd2l0aCB0aGUKLQkgIGRyaXZlciBtb2RlbAotCS0gc2VlIGlmIHRoZSB2bWJ1cyBjYW4gYmUgbWVyZ2VkIHdpdGggdGhlIG90aGVyIHZpcnR1YWwgYnVzc2VzCi0JICBpbiB0aGUga2VybmVsCiAJLSBhdWRpdCB0aGUgbmV0d29yayBkcml2ZXIKLQkgIC0gY2hlY2tpbmcgZm9yIGNhcnJpZXIgaW5zaWRlIG9wZW4gaXMgd3JvbmcsIG5ldHdvcmsgZGV2aWNlIEFQSQotICAgICAgICAgICAgY29uZnVzaW9uPz8KLQktIGF1ZGl0IHRoZSBibG9jayBkcml2ZXIKIAktIGF1ZGl0IHRoZSBzY3NpIGRyaXZlcgogCiBQbGVhc2Ugc2VuZCBwYXRjaGVzIGZvciB0aGlzIGNvZGUgdG8gR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAc3VzZS5kZT4sCi1IYW5rIEphbnNzZW4gPGhqYW5zc2VuQG1pY3Jvc29mdC5jb20+LCBhbmQgSGFpeWFuZyBaaGFuZyA8aGFpeWFuZ3pAbWljcm9zb2Z0LmNvbT4uCitIYW5rIEphbnNzZW4gPGhqYW5zc2VuQG1pY3Jvc29mdC5jb20+LCBIYWl5YW5nIFpoYW5nIDxoYWl5YW5nekBtaWNyb3NvZnQuY29tPiwKK0suIFkuIFNyaW5pdmFzYW4gPGt5c0BtaWNyb3NvZnQuY29tPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L2Jsa3ZzY19kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9ibGt2c2NfZHJ2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyODZiMjIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L2Jsa3ZzY19kcnYuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgTWljcm9zb2Z0IENvcnBvcmF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCi0gKiBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KLSAqCi0gKiBBdXRob3JzOgotICogICBIYWl5YW5nIFpoYW5nIDxoYWl5YW5nekBtaWNyb3NvZnQuY29tPgotICogICBIYW5rIEphbnNzZW4gIDxoamFuc3NlbkBtaWNyb3NvZnQuY29tPgotICogICBLLiBZLiBTcmluaXZhc2FuIDxreXNAbWljcm9zb2Z0LmNvbT4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8c2NzaS9zY3NpLmg+Ci0jaW5jbHVkZSA8c2NzaS9zY3NpX2NtbmQuaD4KLSNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KLSNpbmNsdWRlIDxzY3NpL3Njc2lfZGJnLmg+Ci0KLSNpbmNsdWRlICJoeXBlcnYuaCIKLSNpbmNsdWRlICJoeXBlcnZfc3RvcmFnZS5oIgotCi0KLSNkZWZpbmUgQkxLVlNDX01JTk9SUwk2NAotCi1lbnVtIGJsa3ZzY19kZXZpY2VfdHlwZSB7Ci0JVU5LTk9XTl9ERVZfVFlQRSwKLQlIQVJERElTS19UWVBFLAotCURWRF9UWVBFLAotfTsKLQotZW51bSBibGt2c2Nfb3BfdHlwZSB7Ci0JRE9fSU5RVUlSWSwKLQlET19DQVBBQ0lUWSwKLQlET19GTFVTSCwKLX07Ci0KLS8qCi0gKiBUaGlzIHJlcXVlc3QgdGllcyB0aGUgc3RydWN0IHJlcXVlc3QgYW5kIHN0cnVjdAotICogYmxrdnNjX3JlcXVlc3QvaHZfc3RvcnZzY19yZXF1ZXN0IHRvZ2V0aGVyIEEgc3RydWN0IHJlcXVlc3QgbWF5IGJlCi0gKiByZXByZXNlbnRlZCBieSAxIG9yIG1vcmUgc3RydWN0IGJsa3ZzY19yZXF1ZXN0Ci0gKi8KLXN0cnVjdCBibGt2c2NfcmVxdWVzdF9ncm91cCB7Ci0JaW50IG91dHN0YW5kaW5nOwotCWludCBzdGF0dXM7Ci0Jc3RydWN0IGxpc3RfaGVhZCBibGt2c2NfcmVxX2xpc3Q7CS8qIGxpc3Qgb2YgYmxrdnNjX3JlcXVlc3RzICovCi19OwotCi1zdHJ1Y3QgYmxrdnNjX3JlcXVlc3QgewotCS8qIGJsa3ZzY19yZXF1ZXN0X2dyb3VwLmJsa3ZzY19yZXFfbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgcmVxX2VudHJ5OwotCi0JLyogYmxvY2tfZGV2aWNlX2NvbnRleHQucGVuZGluZ19saXN0ICovCi0Jc3RydWN0IGxpc3RfaGVhZCBwZW5kX2VudHJ5OwotCi0JLyogVGhpcyBtYXkgYmUgbnVsbCBpZiB3ZSBnZW5lcmF0ZSBhIHJlcXVlc3QgaW50ZXJuYWxseSAqLwotCXN0cnVjdCByZXF1ZXN0ICpyZXE7Ci0KLQlzdHJ1Y3QgYmxvY2tfZGV2aWNlX2NvbnRleHQgKmRldjsKLQotCS8qIFRoZSBncm91cCB0aGlzIHJlcXVlc3QgaXMgcGFydCBvZi4gTWF5YmUgbnVsbCAqLwotCXN0cnVjdCBibGt2c2NfcmVxdWVzdF9ncm91cCAqZ3JvdXA7Ci0KLQlpbnQgd3JpdGU7Ci0Jc2VjdG9yX3Qgc2VjdG9yX3N0YXJ0OwotCXVuc2lnbmVkIGxvbmcgc2VjdG9yX2NvdW50OwotCi0JdW5zaWduZWQgY2hhciBzZW5zZV9idWZmZXJbU0NTSV9TRU5TRV9CVUZGRVJTSVpFXTsKLQl1bnNpZ25lZCBjaGFyIGNtZF9sZW47Ci0JdW5zaWduZWQgY2hhciBjbW5kW01BWF9DT01NQU5EX1NJWkVdOwotCi0Jc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCByZXF1ZXN0OwotfTsKLQotLyogUGVyIGRldmljZSBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCBibG9ja19kZXZpY2VfY29udGV4dCB7Ci0JLyogcG9pbnQgYmFjayB0byBvdXIgZGV2aWNlIGNvbnRleHQgKi8KLQlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2VfY3R4OwotCXN0cnVjdCBrbWVtX2NhY2hlICpyZXF1ZXN0X3Bvb2w7Ci0Jc3BpbmxvY2tfdCBsb2NrOwotCXN0cnVjdCBnZW5kaXNrICpnZDsKLQllbnVtIGJsa3ZzY19kZXZpY2VfdHlwZQlkZXZpY2VfdHlwZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHBlbmRpbmdfbGlzdDsKLQotCXVuc2lnbmVkIGNoYXIgZGV2aWNlX2lkWzY0XTsKLQl1bnNpZ25lZCBpbnQgZGV2aWNlX2lkX2xlbjsKLQlpbnQgbnVtX291dHN0YW5kaW5nX3JlcXM7Ci0JaW50IHNodXR0aW5nX2Rvd247Ci0JdW5zaWduZWQgaW50IHNlY3Rvcl9zaXplOwotCXNlY3Rvcl90IGNhcGFjaXR5OwotCXVuc2lnbmVkIGludCBwb3J0OwotCXVuc2lnbmVkIGNoYXIgcGF0aDsKLQl1bnNpZ25lZCBjaGFyIHRhcmdldDsKLQlpbnQgdXNlcnM7Ci19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqZHJ2X25hbWUgPSAiYmxrdnNjIjsKLQotLyogezMyNDEyNjMyLTg2Y2ItNDRhMi05YjVjLTUwZDE0MTczNTRmNX0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaHZfZ3VpZCBkZXZfdHlwZSA9IHsKLQkuZGF0YSA9IHsKLQkJMHgzMiwgMHgyNiwgMHg0MSwgMHgzMiwgMHhjYiwgMHg4NiwgMHhhMiwgMHg0NCwKLQkJMHg5YiwgMHg1YywgMHg1MCwgMHhkMSwgMHg0MSwgMHg3MywgMHg1NCwgMHhmNQotCX0KLX07Ci0KLS8qCi0gKiBUaGVyZSBpcyBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgaW52b2x2aW5nIGJsa3ZzY19yZXF1ZXN0X2NvbXBsZXRpb24oKQotICogYW5kIGJsa3ZzY19kb19yZXF1ZXN0KCkuCi0gKi8KLXN0YXRpYyB2b2lkIGJsa3ZzY19yZXF1ZXN0X2NvbXBsZXRpb24oc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCAqcmVxdWVzdCk7Ci0KLXN0YXRpYyBpbnQgYmxrdnNjX3JpbmdidWZmZXJfc2l6ZSA9IEJMS1ZTQ19SSU5HX0JVRkZFUl9TSVpFOwotCi1tb2R1bGVfcGFyYW0oYmxrdnNjX3JpbmdidWZmZXJfc2l6ZSwgaW50LCBTX0lSVUdPKTsKLU1PRFVMRV9QQVJNX0RFU0MocmluZ19zaXplLCAiUmluZyBidWZmZXIgc2l6ZSAoaW4gYnl0ZXMpIik7Ci0KLS8qCi0gKiBUaGVyZSBpcyBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgaW52b2x2aW5nIGJsa3ZzY19wcm9iZSgpCi0gKiBhbmQgYmxvY2tfb3BzLgotICovCi1zdGF0aWMgaW50IGJsa3ZzY19wcm9iZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYpOwotCi1zdGF0aWMgaW50IGJsa3ZzY19kZXZpY2VfYWRkKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKLQkJCQl2b2lkICphZGRpdGlvbmFsX2luZm8pCi17Ci0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvOwotCWludCByZXQgPSAwOwotCi0JZGV2aWNlX2luZm8gPSAoc3RydWN0IHN0b3J2c2NfZGV2aWNlX2luZm8gKilhZGRpdGlvbmFsX2luZm87Ci0KLQlkZXZpY2VfaW5mby0+cmluZ19idWZmZXJfc2l6ZSA9IGJsa3ZzY19yaW5nYnVmZmVyX3NpemU7Ci0KLQlyZXQgPSBzdG9ydnNjX2Rldl9hZGQoZGV2aWNlLCBhZGRpdGlvbmFsX2luZm8pOwotCWlmIChyZXQgIT0gMCkKLQkJcmV0dXJuIHJldDsKLQotCS8qCi0JICogV2UgbmVlZCB0byB1c2UgdGhlIGRldmljZSBpbnN0YW5jZSBndWlkIHRvIHNldCB0aGUgcGF0aCBhbmQgdGFyZ2V0Ci0JICogaWQuIEZvciBJREUgZGV2aWNlcywgdGhlIGRldmljZSBpbnN0YW5jZSBpZCBpcyBmb3JtYXR0ZWQgYXMKLQkgKiA8YnVzIGlkPiAqIC0gPGRldmljZSBpZD4gLSA4ODk5IC0gMDAwMDAwMDAwMDAwLgotCSAqLwotCWRldmljZV9pbmZvLT5wYXRoX2lkID0gZGV2aWNlLT5kZXZfaW5zdGFuY2UuZGF0YVszXSA8PCAyNCB8Ci0JCQkgICAgIGRldmljZS0+ZGV2X2luc3RhbmNlLmRhdGFbMl0gPDwgMTYgfAotCQkJICAgICBkZXZpY2UtPmRldl9pbnN0YW5jZS5kYXRhWzFdIDw8IDggIHwKLQkJCSAgICAgZGV2aWNlLT5kZXZfaW5zdGFuY2UuZGF0YVswXTsKLQotCWRldmljZV9pbmZvLT50YXJnZXRfaWQgPSBkZXZpY2UtPmRldl9pbnN0YW5jZS5kYXRhWzVdIDw8IDggfAotCQkJICAgICAgIGRldmljZS0+ZGV2X2luc3RhbmNlLmRhdGFbNF07Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGJsa3ZzY19zdWJtaXRfcmVxdWVzdChzdHJ1Y3QgYmxrdnNjX3JlcXVlc3QgKmJsa3ZzY19yZXEsCi0JCQl2b2lkICgqcmVxdWVzdF9jb21wbGV0aW9uKShzdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0ICopKQotewotCXN0cnVjdCBibG9ja19kZXZpY2VfY29udGV4dCAqYmxrZGV2ID0gYmxrdnNjX3JlcS0+ZGV2OwotCXN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgKnN0b3J2c2NfcmVxOwotCXN0cnVjdCB2bXNjc2lfcmVxdWVzdCAqdm1fc3JiOwotCWludCByZXQ7Ci0KLQotCXN0b3J2c2NfcmVxID0gJmJsa3ZzY19yZXEtPnJlcXVlc3Q7Ci0Jdm1fc3JiID0gJnN0b3J2c2NfcmVxLT52c3Rvcl9wYWNrZXQudm1fc3JiOwotCi0Jdm1fc3JiLT5kYXRhX2luID0gYmxrdnNjX3JlcS0+d3JpdGUgPyBXUklURV9UWVBFIDogUkVBRF9UWVBFOwotCi0Jc3RvcnZzY19yZXEtPm9uX2lvX2NvbXBsZXRpb24gPSByZXF1ZXN0X2NvbXBsZXRpb247Ci0Jc3RvcnZzY19yZXEtPmNvbnRleHQgPSBibGt2c2NfcmVxOwotCi0Jdm1fc3JiLT5wb3J0X251bWJlciA9IGJsa2Rldi0+cG9ydDsKLQl2bV9zcmItPnBhdGhfaWQgPSBibGtkZXYtPnBhdGg7Ci0Jdm1fc3JiLT50YXJnZXRfaWQgPSBibGtkZXYtPnRhcmdldDsKLQl2bV9zcmItPmx1biA9IDA7CSAvKiB0aGlzIGlzIG5vdCByZWFsbHkgdXNlZCBhdCBhbGwgKi8KLQotCXZtX3NyYi0+Y2RiX2xlbmd0aCA9IGJsa3ZzY19yZXEtPmNtZF9sZW47Ci0KLQltZW1jcHkodm1fc3JiLT5jZGIsIGJsa3ZzY19yZXEtPmNtbmQsIHZtX3NyYi0+Y2RiX2xlbmd0aCk7Ci0KLQlzdG9ydnNjX3JlcS0+c2Vuc2VfYnVmZmVyID0gYmxrdnNjX3JlcS0+c2Vuc2VfYnVmZmVyOwotCi0JcmV0ID0gIHN0b3J2c2NfZG9faW8oYmxrZGV2LT5kZXZpY2VfY3R4LAotCQkJCQkgICAmYmxrdnNjX3JlcS0+cmVxdWVzdCk7Ci0JaWYgKHJldCA9PSAwKQotCQlibGtkZXYtPm51bV9vdXRzdGFuZGluZ19yZXFzKys7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgYmxrdnNjX29wZW4oc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgZm1vZGVfdCBtb2RlKQotewotCXN0cnVjdCBibG9ja19kZXZpY2VfY29udGV4dCAqYmxrZGV2ID0gYmRldi0+YmRfZGlzay0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmxrZGV2LT5sb2NrLCBmbGFncyk7Ci0KLQlibGtkZXYtPnVzZXJzKys7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGtkZXYtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgYmxrdnNjX2dldGdlbyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZCwgc3RydWN0IGhkX2dlb21ldHJ5ICpoZykKLXsKLQlzZWN0b3JfdCBuc2VjdCA9IGdldF9jYXBhY2l0eShiZC0+YmRfZGlzayk7Ci0Jc2VjdG9yX3QgY3lsaW5kZXJzID0gbnNlY3Q7Ci0KLQkvKgotCSAqIFdlIGFyZSBtYWtpbmcgdXAgdGhlc2UgdmFsdWVzOyBsZXQgdXMga2VlcCBpdCBzaW1wbGUuCi0JICovCi0JaGctPmhlYWRzID0gMHhmZjsKLQloZy0+c2VjdG9ycyA9IDB4M2Y7Ci0Jc2VjdG9yX2RpdihjeWxpbmRlcnMsIGhnLT5oZWFkcyAqIGhnLT5zZWN0b3JzKTsKLQloZy0+Y3lsaW5kZXJzID0gY3lsaW5kZXJzOwotCWlmICgoc2VjdG9yX3QpKGhnLT5jeWxpbmRlcnMgKyAxKSAqIGhnLT5oZWFkcyAqIGhnLT5zZWN0b3JzIDwgbnNlY3QpCi0JCWhnLT5jeWxpbmRlcnMgPSAweGZmZmY7Ci0JcmV0dXJuIDA7Ci0KLX0KLQotCi1zdGF0aWMgdm9pZCBibGt2c2NfaW5pdF9ydyhzdHJ1Y3QgYmxrdnNjX3JlcXVlc3QgKmJsa3ZzY19yZXEpCi17Ci0KLQlibGt2c2NfcmVxLT5jbWRfbGVuID0gMTY7Ci0KLQlpZiAocnFfZGF0YV9kaXIoYmxrdnNjX3JlcS0+cmVxKSkgewotCQlibGt2c2NfcmVxLT53cml0ZSA9IDE7Ci0JCWJsa3ZzY19yZXEtPmNtbmRbMF0gPSBXUklURV8xNjsKLQl9IGVsc2UgewotCQlibGt2c2NfcmVxLT53cml0ZSA9IDA7Ci0JCWJsa3ZzY19yZXEtPmNtbmRbMF0gPSBSRUFEXzE2OwotCX0KLQotCWJsa3ZzY19yZXEtPmNtbmRbMV0gfD0KLQkoYmxrdnNjX3JlcS0+cmVxLT5jbWRfZmxhZ3MgJiBSRVFfRlVBKSA/IDB4OCA6IDA7Ci0KLQkqKHVuc2lnbmVkIGxvbmcgbG9uZyAqKSZibGt2c2NfcmVxLT5jbW5kWzJdID0KLQljcHVfdG9fYmU2NChibGt2c2NfcmVxLT5zZWN0b3Jfc3RhcnQpOwotCSoodW5zaWduZWQgaW50ICopJmJsa3ZzY19yZXEtPmNtbmRbMTBdID0KLQljcHVfdG9fYmUzMihibGt2c2NfcmVxLT5zZWN0b3JfY291bnQpOwotfQotCi0KLXN0YXRpYyBpbnQgYmxrdnNjX2lvY3RsKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkLCBmbW9kZV90IG1vZGUsCi0JCQl1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBibG9ja19kZXZpY2VfY29udGV4dCAqYmxrZGV2ID0gYmQtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsKLQlpbnQgcmV0ID0gMDsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBIRElPX0dFVF9JREVOVElUWToKLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIGJsa2Rldi0+ZGV2aWNlX2lkLAotCQkJCSBibGtkZXYtPmRldmljZV9pZF9sZW4pKQotCQkJcmV0ID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgYmxrdnNjX2NtZF9jb21wbGV0aW9uKHN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgKnJlcXVlc3QpCi17Ci0Jc3RydWN0IGJsa3ZzY19yZXF1ZXN0ICpibGt2c2NfcmVxID0KLQkJCShzdHJ1Y3QgYmxrdnNjX3JlcXVlc3QgKilyZXF1ZXN0LT5jb250ZXh0OwotCXN0cnVjdCBibG9ja19kZXZpY2VfY29udGV4dCAqYmxrZGV2ID0KLQkJCShzdHJ1Y3QgYmxvY2tfZGV2aWNlX2NvbnRleHQgKilibGt2c2NfcmVxLT5kZXY7Ci0Jc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNlbnNlX2hkcjsKLQlzdHJ1Y3Qgdm1zY3NpX3JlcXVlc3QgKnZtX3NyYjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0KLQl2bV9zcmIgPSAmYmxrdnNjX3JlcS0+cmVxdWVzdC52c3Rvcl9wYWNrZXQudm1fc3JiOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJsa2Rldi0+bG9jaywgZmxhZ3MpOwotCWJsa2Rldi0+bnVtX291dHN0YW5kaW5nX3JlcXMtLTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGtkZXYtPmxvY2ssIGZsYWdzKTsKLQotCWlmICh2bV9zcmItPnNjc2lfc3RhdHVzKQotCQlpZiAoc2NzaV9ub3JtYWxpemVfc2Vuc2UoYmxrdnNjX3JlcS0+c2Vuc2VfYnVmZmVyLAotCQkJCQkgU0NTSV9TRU5TRV9CVUZGRVJTSVpFLCAmc2Vuc2VfaGRyKSkKLQkJCXNjc2lfcHJpbnRfc2Vuc2VfaGRyKCJibGt2c2MiLCAmc2Vuc2VfaGRyKTsKLQotCWNvbXBsZXRlKCZibGt2c2NfcmVxLT5yZXF1ZXN0LndhaXRfZXZlbnQpOwotfQotCi0KLXN0YXRpYyBpbnQgYmxrdnNjX2RvX29wZXJhdGlvbihzdHJ1Y3QgYmxvY2tfZGV2aWNlX2NvbnRleHQgKmJsa2RldiwKLQkJCQllbnVtIGJsa3ZzY19vcF90eXBlIG9wKQotewotCXN0cnVjdCBibGt2c2NfcmVxdWVzdCAqYmxrdnNjX3JlcTsKLQlzdHJ1Y3QgcGFnZSAqcGFnZV9idWY7Ci0JdW5zaWduZWQgY2hhciAqYnVmOwotCXVuc2lnbmVkIGNoYXIgZGV2aWNlX3R5cGU7Ci0Jc3RydWN0IHNjc2lfc2Vuc2VfaGRyIHNlbnNlX2hkcjsKLQlzdHJ1Y3Qgdm1zY3NpX3JlcXVlc3QgKnZtX3NyYjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaW50IHJldCA9IDA7Ci0KLQlibGt2c2NfcmVxID0ga21lbV9jYWNoZV96YWxsb2MoYmxrZGV2LT5yZXF1ZXN0X3Bvb2wsIEdGUF9LRVJORUwpOwotCWlmICghYmxrdnNjX3JlcSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwYWdlX2J1ZiA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYWdlX2J1ZikgewotCQlrbWVtX2NhY2hlX2ZyZWUoYmxrZGV2LT5yZXF1ZXN0X3Bvb2wsIGJsa3ZzY19yZXEpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQl2bV9zcmIgPSAmYmxrdnNjX3JlcS0+cmVxdWVzdC52c3Rvcl9wYWNrZXQudm1fc3JiOwotCWluaXRfY29tcGxldGlvbigmYmxrdnNjX3JlcS0+cmVxdWVzdC53YWl0X2V2ZW50KTsKLQlibGt2c2NfcmVxLT5kZXYgPSBibGtkZXY7Ci0JYmxrdnNjX3JlcS0+cmVxID0gTlVMTDsKLQlibGt2c2NfcmVxLT53cml0ZSA9IDA7Ci0KLQlibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLnBmbl9hcnJheVswXSA9Ci0JcGFnZV90b19wZm4ocGFnZV9idWYpOwotCWJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIub2Zmc2V0ID0gMDsKLQotCXN3aXRjaCAob3ApIHsKLQljYXNlIERPX0lOUVVJUlk6Ci0JCWJsa3ZzY19yZXEtPmNtbmRbMF0gPSBJTlFVSVJZOwotCQlibGt2c2NfcmVxLT5jbW5kWzFdID0gMHgxOwkJLyogR2V0IHByb2R1Y3QgZGF0YSAqLwotCQlibGt2c2NfcmVxLT5jbW5kWzJdID0gMHg4MzsJCS8qIG1vZGUgcGFnZSA4MyAqLwotCQlibGt2c2NfcmVxLT5jbW5kWzRdID0gNjQ7Ci0JCWJsa3ZzY19yZXEtPmNtZF9sZW4gPSA2OwotCQlibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLmxlbiA9IDY0OwotCQlicmVhazsKLQotCWNhc2UgRE9fQ0FQQUNJVFk6Ci0JCWJsa2Rldi0+c2VjdG9yX3NpemUgPSAwOwotCQlibGtkZXYtPmNhcGFjaXR5ID0gMDsKLQotCQlibGt2c2NfcmVxLT5jbW5kWzBdID0gUkVBRF9DQVBBQ0lUWTsKLQkJYmxrdnNjX3JlcS0+Y21kX2xlbiA9IDE2OwotCQlibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLmxlbiA9IDg7Ci0JCWJyZWFrOwotCi0JY2FzZSBET19GTFVTSDoKLQkJYmxrdnNjX3JlcS0+Y21uZFswXSA9IFNZTkNIUk9OSVpFX0NBQ0hFOwotCQlibGt2c2NfcmVxLT5jbWRfbGVuID0gMTA7Ci0JCWJsa3ZzY19yZXEtPnJlcXVlc3QuZGF0YV9idWZmZXIucGZuX2FycmF5WzBdID0gMDsKLQkJYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci5sZW4gPSAwOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJsa2Rldi0+bG9jaywgZmxhZ3MpOwotCWJsa3ZzY19zdWJtaXRfcmVxdWVzdChibGt2c2NfcmVxLCBibGt2c2NfY21kX2NvbXBsZXRpb24pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsa2Rldi0+bG9jaywgZmxhZ3MpOwotCi0Jd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKCZibGt2c2NfcmVxLT5yZXF1ZXN0LndhaXRfZXZlbnQpOwotCi0JLyogY2hlY2sgZXJyb3IgKi8KLQlpZiAodm1fc3JiLT5zY3NpX3N0YXR1cykgewotCQlzY3NpX25vcm1hbGl6ZV9zZW5zZShibGt2c2NfcmVxLT5zZW5zZV9idWZmZXIsCi0JCQkJICAgICBTQ1NJX1NFTlNFX0JVRkZFUlNJWkUsICZzZW5zZV9oZHIpOwotCi0JCXJldHVybiAwOwotCX0KLQotCWJ1ZiA9IGttYXAocGFnZV9idWYpOwotCi0Jc3dpdGNoIChvcCkgewotCWNhc2UgRE9fSU5RVUlSWToKLQkJZGV2aWNlX3R5cGUgPSBidWZbMF0gJiAweDFGOwotCi0JCWlmIChkZXZpY2VfdHlwZSA9PSAweDApCi0JCQlibGtkZXYtPmRldmljZV90eXBlID0gSEFSRERJU0tfVFlQRTsKLQkJIGVsc2UKLQkJCWJsa2Rldi0+ZGV2aWNlX3R5cGUgPSBVTktOT1dOX0RFVl9UWVBFOwotCi0JCWJsa2Rldi0+ZGV2aWNlX2lkX2xlbiA9IGJ1Zls3XTsKLQkJaWYgKGJsa2Rldi0+ZGV2aWNlX2lkX2xlbiA+IDY0KQotCQkJYmxrZGV2LT5kZXZpY2VfaWRfbGVuID0gNjQ7Ci0KLQkJbWVtY3B5KGJsa2Rldi0+ZGV2aWNlX2lkLCAmYnVmWzhdLCBibGtkZXYtPmRldmljZV9pZF9sZW4pOwotCQlicmVhazsKLQotCWNhc2UgRE9fQ0FQQUNJVFk6Ci0JCS8qIGJlIHRvIGxlICovCi0JCWJsa2Rldi0+Y2FwYWNpdHkgPQotCQkoKGJ1ZlswXSA8PCAyNCkgfCAoYnVmWzFdIDw8IDE2KSB8Ci0JCShidWZbMl0gPDwgOCkgfCBidWZbM10pICsgMTsKLQotCQlibGtkZXYtPnNlY3Rvcl9zaXplID0KLQkJKGJ1Zls0XSA8PCAyNCkgfCAoYnVmWzVdIDw8IDE2KSB8Ci0JCShidWZbNl0gPDwgOCkgfCBidWZbN107Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCi0JfQotCi1jbGVhbnVwOgotCi0Ja3VubWFwKHBhZ2VfYnVmKTsKLQotCV9fZnJlZV9wYWdlKHBhZ2VfYnVmKTsKLQotCWttZW1fY2FjaGVfZnJlZShibGtkZXYtPnJlcXVlc3RfcG9vbCwgYmxrdnNjX3JlcSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgYmxrdnNjX2NhbmNlbF9wZW5kaW5nX3JlcXMoc3RydWN0IGJsb2NrX2RldmljZV9jb250ZXh0ICpibGtkZXYpCi17Ci0Jc3RydWN0IGJsa3ZzY19yZXF1ZXN0ICpwZW5kX3JlcSwgKnRtcDsKLQlzdHJ1Y3QgYmxrdnNjX3JlcXVlc3QgKmNvbXBfcmVxLCAqdG1wMjsKLQlzdHJ1Y3Qgdm1zY3NpX3JlcXVlc3QgKnZtX3NyYjsKLQotCWludCByZXQgPSAwOwotCi0KLQkvKiBGbHVzaCB0aGUgcGVuZGluZyBsaXN0IGZpcnN0ICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBlbmRfcmVxLCB0bXAsICZibGtkZXYtPnBlbmRpbmdfbGlzdCwKLQkJCQkgcGVuZF9lbnRyeSkgewotCQkvKgotCQkgKiBUaGUgcGVuZF9yZXEgY291bGQgYmUgcGFydCBvZiBhIHBhcnRpYWxseSBjb21wbGV0ZWQKLQkJICogcmVxdWVzdC4gSWYgc28sIGNvbXBsZXRlIHRob3NlIHJlcSBmaXJzdCB1bnRpbCB3ZQotCQkgKiBoaXQgdGhlIHBlbmRfcmVxCi0JCSAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY29tcF9yZXEsIHRtcDIsCi0JCQkJCSAmcGVuZF9yZXEtPmdyb3VwLT5ibGt2c2NfcmVxX2xpc3QsCi0JCQkJCSByZXFfZW50cnkpIHsKLQotCQkJaWYgKGNvbXBfcmVxID09IHBlbmRfcmVxKQotCQkJCWJyZWFrOwotCi0JCQlsaXN0X2RlbCgmY29tcF9yZXEtPnJlcV9lbnRyeSk7Ci0KLQkJCWlmIChjb21wX3JlcS0+cmVxKSB7Ci0JCQkJdm1fc3JiID0KLQkJCQkmY29tcF9yZXEtPnJlcXVlc3QudnN0b3JfcGFja2V0LgotCQkJCXZtX3NyYjsKLQkJCQlyZXQgPSBfX2Jsa19lbmRfcmVxdWVzdChjb21wX3JlcS0+cmVxLAotCQkJCQkoIXZtX3NyYi0+c2NzaV9zdGF0dXMgPyAwIDogLUVJTyksCi0JCQkJCWNvbXBfcmVxLT5zZWN0b3JfY291bnQgKgotCQkJCQlibGtkZXYtPnNlY3Rvcl9zaXplKTsKLQotCQkJCS8qIEZJWE1FOiBzaG91bGRuJ3QgdGhpcyBkbyBtb3JlIHRoYW4gcmV0dXJuPyAqLwotCQkJCWlmIChyZXQpCi0JCQkJCWdvdG8gb3V0OwotCQkJfQotCi0JCQlrbWVtX2NhY2hlX2ZyZWUoYmxrZGV2LT5yZXF1ZXN0X3Bvb2wsIGNvbXBfcmVxKTsKLQkJfQotCi0JCWxpc3RfZGVsKCZwZW5kX3JlcS0+cGVuZF9lbnRyeSk7Ci0KLQkJbGlzdF9kZWwoJnBlbmRfcmVxLT5yZXFfZW50cnkpOwotCi0JCWlmIChjb21wX3JlcS0+cmVxKSB7Ci0JCQlpZiAoIV9fYmxrX2VuZF9yZXF1ZXN0KHBlbmRfcmVxLT5yZXEsIC1FSU8sCi0JCQkJCSAgICAgICBwZW5kX3JlcS0+c2VjdG9yX2NvdW50ICoKLQkJCQkJICAgICAgIGJsa2Rldi0+c2VjdG9yX3NpemUpKSB7Ci0JCQkJLyoKLQkJCQkgKiBBbGwgdGhlIHNlY3RvcnMgaGF2ZSBiZWVuIHhmZXJyZWQgaWUgdGhlCi0JCQkJICogcmVxdWVzdCBpcyBkb25lCi0JCQkJICovCi0JCQkJa21lbV9jYWNoZV9mcmVlKGJsa2Rldi0+cmVxdWVzdF9wb29sLAotCQkJCQkJcGVuZF9yZXEtPmdyb3VwKTsKLQkJCX0KLQkJfQotCi0JCWttZW1fY2FjaGVfZnJlZShibGtkZXYtPnJlcXVlc3RfcG9vbCwgcGVuZF9yZXEpOwotCX0KLQotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLQotLyoKLSAqIGJsa3ZzY19yZW1vdmUoKSAtIENhbGxiYWNrIHdoZW4gb3VyIGRldmljZSBpcyByZW1vdmVkCi0gKi8KLXN0YXRpYyBpbnQgYmxrdnNjX3JlbW92ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGJsb2NrX2RldmljZV9jb250ZXh0ICpibGtkZXYgPSBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2aWNlKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0KLQkvKiBHZXQgdG8gYSBrbm93biBzdGF0ZSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZibGtkZXYtPmxvY2ssIGZsYWdzKTsKLQotCWJsa2Rldi0+c2h1dHRpbmdfZG93biA9IDE7Ci0KLQlibGtfc3RvcF9xdWV1ZShibGtkZXYtPmdkLT5xdWV1ZSk7Ci0KLQlibGt2c2NfY2FuY2VsX3BlbmRpbmdfcmVxcyhibGtkZXYpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxrZGV2LT5sb2NrLCBmbGFncyk7Ci0KLQlibGt2c2NfZG9fb3BlcmF0aW9uKGJsa2RldiwgRE9fRkxVU0gpOwotCi0JaWYgKGJsa2Rldi0+dXNlcnMgPT0gMCkgewotCQlkZWxfZ2VuZGlzayhibGtkZXYtPmdkKTsKLQkJcHV0X2Rpc2soYmxrZGV2LT5nZCk7Ci0JCWJsa19jbGVhbnVwX3F1ZXVlKGJsa2Rldi0+Z2QtPnF1ZXVlKTsKLQotCQlzdG9ydnNjX2Rldl9yZW1vdmUoYmxrZGV2LT5kZXZpY2VfY3R4KTsKLQotCQlrbWVtX2NhY2hlX2Rlc3Ryb3koYmxrZGV2LT5yZXF1ZXN0X3Bvb2wpOwotCQlrZnJlZShibGtkZXYpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBibGt2c2Nfc2h1dGRvd24oc3RydWN0IGh2X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBibG9ja19kZXZpY2VfY29udGV4dCAqYmxrZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldmljZSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghYmxrZGV2KQotCQlyZXR1cm47Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYmxrZGV2LT5sb2NrLCBmbGFncyk7Ci0KLQlibGtkZXYtPnNodXR0aW5nX2Rvd24gPSAxOwotCi0JYmxrX3N0b3BfcXVldWUoYmxrZGV2LT5nZC0+cXVldWUpOwotCi0JYmxrdnNjX2NhbmNlbF9wZW5kaW5nX3JlcXMoYmxrZGV2KTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsa2Rldi0+bG9jaywgZmxhZ3MpOwotCi0JYmxrdnNjX2RvX29wZXJhdGlvbihibGtkZXYsIERPX0ZMVVNIKTsKLQotCS8qCi0JICogTm93IHdhaXQgZm9yIGFsbCBvdXRnb2luZyBJL08gdG8gYmUgZHJhaW5lZC4KLQkgKi8KLQlzdG9ydnNjX3dhaXRfdG9fZHJhaW4oKHN0cnVjdCBzdG9ydnNjX2RldmljZSAqKWRldi0+ZXh0KTsKLQotfQotCi1zdGF0aWMgaW50IGJsa3ZzY19yZWxlYXNlKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBmbW9kZV90IG1vZGUpCi17Ci0Jc3RydWN0IGJsb2NrX2RldmljZV9jb250ZXh0ICpibGtkZXYgPSBkaXNrLT5wcml2YXRlX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZibGtkZXYtPmxvY2ssIGZsYWdzKTsKLQotCWlmICgoLS1ibGtkZXYtPnVzZXJzID09IDApICYmIChibGtkZXYtPnNodXR0aW5nX2Rvd24pKSB7Ci0JCWJsa19zdG9wX3F1ZXVlKGJsa2Rldi0+Z2QtPnF1ZXVlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxrZGV2LT5sb2NrLCBmbGFncyk7Ci0KLQkJYmxrdnNjX2RvX29wZXJhdGlvbihibGtkZXYsIERPX0ZMVVNIKTsKLQkJZGVsX2dlbmRpc2soYmxrZGV2LT5nZCk7Ci0JCXB1dF9kaXNrKGJsa2Rldi0+Z2QpOwotCQlibGtfY2xlYW51cF9xdWV1ZShibGtkZXYtPmdkLT5xdWV1ZSk7Ci0KLQkJc3RvcnZzY19kZXZfcmVtb3ZlKGJsa2Rldi0+ZGV2aWNlX2N0eCk7Ci0KLQkJa21lbV9jYWNoZV9kZXN0cm95KGJsa2Rldi0+cmVxdWVzdF9wb29sKTsKLQkJa2ZyZWUoYmxrZGV2KTsKLQl9IGVsc2UKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxrZGV2LT5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogV2UgYnJlYWsgdGhlIHJlcXVlc3QgaW50byAxIG9yIG1vcmUgYmxrdnNjX3JlcXVlc3RzIGFuZCBzdWJtaXQKLSAqIHRoZW0uICBJZiB3ZSBjYW50IHN1Ym1pdCB0aGVtIGFsbCwgd2UgcHV0IHRoZW0gb24gdGhlCi0gKiBwZW5kaW5nX2xpc3QuIFRoZSBibGt2c2NfcmVxdWVzdCgpIHdpbGwgd29yayBvbiB0aGUgcGVuZGluZ19saXN0LgotICovCi1zdGF0aWMgaW50IGJsa3ZzY19kb19yZXF1ZXN0KHN0cnVjdCBibG9ja19kZXZpY2VfY29udGV4dCAqYmxrZGV2LAotCQkJICAgICBzdHJ1Y3QgcmVxdWVzdCAqcmVxKQotewotCXN0cnVjdCBiaW8gKmJpbyA9IE5VTEw7Ci0Jc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBOVUxMOwotCXN0cnVjdCBiaW9fdmVjICpwcmV2X2J2ZWMgPSBOVUxMOwotCXN0cnVjdCBibGt2c2NfcmVxdWVzdCAqYmxrdnNjX3JlcSA9IE5VTEw7Ci0Jc3RydWN0IGJsa3ZzY19yZXF1ZXN0ICp0bXA7Ci0JaW50IGRhdGFidWZfaWR4ID0gMDsKLQlpbnQgc2VnX2lkeCA9IDA7Ci0Jc2VjdG9yX3Qgc3RhcnRfc2VjdG9yOwotCXVuc2lnbmVkIGxvbmcgbnVtX3NlY3RvcnMgPSAwOwotCWludCByZXQgPSAwOwotCWludCBwZW5kaW5nID0gMDsKLQlzdHJ1Y3QgYmxrdnNjX3JlcXVlc3RfZ3JvdXAgKmdyb3VwID0gTlVMTDsKLQotCS8qIENyZWF0ZSBhIGdyb3VwIHRvIHRpZSByZXEgdG8gbGlzdCBvZiBibGt2c2NfcmVxcyAqLwotCWdyb3VwID0ga21lbV9jYWNoZV96YWxsb2MoYmxrZGV2LT5yZXF1ZXN0X3Bvb2wsIEdGUF9BVE9NSUMpOwotCWlmICghZ3JvdXApCi0JCXJldHVybiAtRU5PTUVNOwotCi0JSU5JVF9MSVNUX0hFQUQoJmdyb3VwLT5ibGt2c2NfcmVxX2xpc3QpOwotCWdyb3VwLT5vdXRzdGFuZGluZyA9IGdyb3VwLT5zdGF0dXMgPSAwOwotCi0Jc3RhcnRfc2VjdG9yID0gYmxrX3JxX3BvcyhyZXEpOwotCi0JLyogZm9yZWFjaCBiaW8gaW4gdGhlIHJlcXVlc3QgKi8KLQlpZiAocmVxLT5iaW8pIHsKLQkJZm9yIChiaW8gPSByZXEtPmJpbzsgYmlvOyBiaW8gPSBiaW8tPmJpX25leHQpIHsKLQkJCS8qCi0JCQkgKiBNYXAgdGhpcyBiaW8gaW50byBhbiBleGlzdGluZyBvciBuZXcgc3RvcnZzYyByZXF1ZXN0Ci0JCQkgKi8KLQkJCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgc2VnX2lkeCkgewotCQkJCS8qIEdldCBhIG5ldyBzdG9ydnNjIHJlcXVlc3QgKi8KLQkJCQkvKiAxc3QtdGltZSAqLwotCQkJCWlmICgoIWJsa3ZzY19yZXEpIHx8Ci0JCQkJICAgIChkYXRhYnVmX2lkeCA+PSBNQVhfTVVMVElQQUdFX0JVRkZFUl9DT1VOVCkKLQkJCQkgICAgLyogaG9sZSBhdCB0aGUgYmVnaW4gb2YgcGFnZSAqLwotCQkJCSAgICB8fCAoYnZlYy0+YnZfb2Zmc2V0ICE9IDApIHx8Ci0JCQkJICAgIC8qIGhvbGQgYXQgdGhlIGVuZCBvZiBwYWdlICovCi0JCQkJICAgIChwcmV2X2J2ZWMgJiYKLQkJCQkgICAgIChwcmV2X2J2ZWMtPmJ2X2xlbiAhPSBQQUdFX1NJWkUpKSkgewotCQkJCQkvKiBzdWJtaXQgdGhlIHByZXYgb25lICovCi0JCQkJCWlmIChibGt2c2NfcmVxKSB7Ci0JCQkJCQlibGt2c2NfcmVxLT5zZWN0b3Jfc3RhcnQgPQotCQkJCQkJc3RhcnRfc2VjdG9yOwotCQkJCQkJc2VjdG9yX2RpdigKLQkJCQkJCWJsa3ZzY19yZXEtPnNlY3Rvcl9zdGFydCwKLQkJCQkJCShibGtkZXYtPnNlY3Rvcl9zaXplID4+IDkpKTsKLQotCQkJCQkJYmxrdnNjX3JlcS0+c2VjdG9yX2NvdW50ID0KLQkJCQkJCW51bV9zZWN0b3JzIC8KLQkJCQkJCShibGtkZXYtPnNlY3Rvcl9zaXplID4+IDkpOwotCQkJCQkJYmxrdnNjX2luaXRfcncoYmxrdnNjX3JlcSk7Ci0JCQkJCX0KLQotCQkJCQkvKgotCQkJCQkgKiBDcmVhdGUgbmV3IGJsa3ZzY19yZXEgdG8gcmVwcmVzZW50Ci0JCQkJCSAqIHRoZSBjdXJyZW50IGJ2ZWMKLQkJCQkJICovCi0JCQkJCWJsa3ZzY19yZXEgPQotCQkJCQlrbWVtX2NhY2hlX3phbGxvYygKLQkJCQkJYmxrZGV2LT5yZXF1ZXN0X3Bvb2wsIEdGUF9BVE9NSUMpOwotCQkJCQlpZiAoIWJsa3ZzY19yZXEpIHsKLQkJCQkJCS8qIGZyZWUgdXAgZXZlcnl0aGluZyAqLwotCQkJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKAotCQkJCQkJCWJsa3ZzY19yZXEsIHRtcCwKLQkJCQkJCQkmZ3JvdXAtPmJsa3ZzY19yZXFfbGlzdCwKLQkJCQkJCQlyZXFfZW50cnkpIHsKLQkJCQkJCQlsaXN0X2RlbCgKLQkJCQkJCQkmYmxrdnNjX3JlcS0+cmVxX2VudHJ5KTsKLQkJCQkJCQlrbWVtX2NhY2hlX2ZyZWUoCi0JCQkJCQkJYmxrZGV2LT5yZXF1ZXN0X3Bvb2wsCi0JCQkJCQkJYmxrdnNjX3JlcSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCWttZW1fY2FjaGVfZnJlZSgKLQkJCQkJCWJsa2Rldi0+cmVxdWVzdF9wb29sLCBncm91cCk7Ci0JCQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCQkJfQotCi0JCQkJCW1lbXNldChibGt2c2NfcmVxLCAwLAotCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBibGt2c2NfcmVxdWVzdCkpOwotCi0JCQkJCWJsa3ZzY19yZXEtPmRldiA9IGJsa2RldjsKLQkJCQkJYmxrdnNjX3JlcS0+cmVxID0gcmVxOwotCQkJCQlibGt2c2NfcmVxLT5yZXF1ZXN0LgotCQkJCQlkYXRhX2J1ZmZlci5vZmZzZXQKLQkJCQkJPSBidmVjLT5idl9vZmZzZXQ7Ci0JCQkJCWJsa3ZzY19yZXEtPnJlcXVlc3QuCi0JCQkJCWRhdGFfYnVmZmVyLmxlbiA9IDA7Ci0KLQkJCQkJLyogQWRkIHRvIHRoZSBncm91cCAqLwotCQkJCQlibGt2c2NfcmVxLT5ncm91cCA9IGdyb3VwOwotCQkJCQlibGt2c2NfcmVxLT5ncm91cC0+b3V0c3RhbmRpbmcrKzsKLQkJCQkJbGlzdF9hZGRfdGFpbCgmYmxrdnNjX3JlcS0+cmVxX2VudHJ5LAotCQkJCQkmYmxrdnNjX3JlcS0+Z3JvdXAtPmJsa3ZzY19yZXFfbGlzdCk7Ci0KLQkJCQkJc3RhcnRfc2VjdG9yICs9IG51bV9zZWN0b3JzOwotCQkJCQludW1fc2VjdG9ycyA9IDA7Ci0JCQkJCWRhdGFidWZfaWR4ID0gMDsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIEFkZCB0aGUgY3VyciBidmVjL3NlZ21lbnQgdG8gdGhlIGN1cnIKLQkJCQkgKiBibGt2c2NfcmVxCi0JCQkJICovCi0JCQkJYmxrdnNjX3JlcS0+cmVxdWVzdC5kYXRhX2J1ZmZlci4KLQkJCQkJcGZuX2FycmF5W2RhdGFidWZfaWR4XQotCQkJCQkJPSBwYWdlX3RvX3BmbihidmVjLT5idl9wYWdlKTsKLQkJCQlibGt2c2NfcmVxLT5yZXF1ZXN0LmRhdGFfYnVmZmVyLmxlbgotCQkJCQkrPSBidmVjLT5idl9sZW47Ci0KLQkJCQlwcmV2X2J2ZWMgPSBidmVjOwotCi0JCQkJZGF0YWJ1Zl9pZHgrKzsKLQkJCQludW1fc2VjdG9ycyArPSBidmVjLT5idl9sZW4gPj4gOTsKLQotCQkJfSAvKiBiaW9fZm9yX2VhY2hfc2VnbWVudCAqLwotCi0JCX0gLyogcnFfZm9yX2VhY2hfYmlvICovCi0JfQotCi0JLyogSGFuZGxlIHRoZSBsYXN0IG9uZSAqLwotCWlmIChibGt2c2NfcmVxKSB7Ci0JCWJsa3ZzY19yZXEtPnNlY3Rvcl9zdGFydCA9IHN0YXJ0X3NlY3RvcjsKLQkJc2VjdG9yX2RpdihibGt2c2NfcmVxLT5zZWN0b3Jfc3RhcnQsCi0JCQkgICAoYmxrZGV2LT5zZWN0b3Jfc2l6ZSA+PiA5KSk7Ci0KLQkJYmxrdnNjX3JlcS0+c2VjdG9yX2NvdW50ID0gbnVtX3NlY3RvcnMgLwotCQkJCQkgICAoYmxrZGV2LT5zZWN0b3Jfc2l6ZSA+PiA5KTsKLQotCQlibGt2c2NfaW5pdF9ydyhibGt2c2NfcmVxKTsKLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJsa3ZzY19yZXEsICZncm91cC0+YmxrdnNjX3JlcV9saXN0LCByZXFfZW50cnkpIHsKLQkJaWYgKHBlbmRpbmcpIHsKLQotCQkJbGlzdF9hZGRfdGFpbCgmYmxrdnNjX3JlcS0+cGVuZF9lbnRyeSwKLQkJCQkgICAgICAmYmxrZGV2LT5wZW5kaW5nX2xpc3QpOwotCQl9IGVsc2UgewotCQkJcmV0ID0gYmxrdnNjX3N1Ym1pdF9yZXF1ZXN0KGJsa3ZzY19yZXEsCi0JCQkJCQkgICAgYmxrdnNjX3JlcXVlc3RfY29tcGxldGlvbik7Ci0JCQlpZiAocmV0ID09IC0xKSB7Ci0JCQkJcGVuZGluZyA9IDE7Ci0JCQkJbGlzdF9hZGRfdGFpbCgmYmxrdnNjX3JlcS0+cGVuZF9lbnRyeSwKLQkJCQkJICAgICAgJmJsa2Rldi0+cGVuZGluZ19saXN0KTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JcmV0dXJuIHBlbmRpbmc7Ci19Ci0KLXN0YXRpYyBpbnQgYmxrdnNjX2RvX3BlbmRpbmdfcmVxcyhzdHJ1Y3QgYmxvY2tfZGV2aWNlX2NvbnRleHQgKmJsa2RldikKLXsKLQlzdHJ1Y3QgYmxrdnNjX3JlcXVlc3QgKnBlbmRfcmVxLCAqdG1wOwotCWludCByZXQgPSAwOwotCi0JLyogRmx1c2ggdGhlIHBlbmRpbmcgbGlzdCBmaXJzdCAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwZW5kX3JlcSwgdG1wLCAmYmxrZGV2LT5wZW5kaW5nX2xpc3QsCi0JCQkJIHBlbmRfZW50cnkpIHsKLQotCQlyZXQgPSBibGt2c2Nfc3VibWl0X3JlcXVlc3QocGVuZF9yZXEsCi0JCQkJCSAgICBibGt2c2NfcmVxdWVzdF9jb21wbGV0aW9uKTsKLQkJaWYgKHJldCAhPSAwKQotCQkJYnJlYWs7Ci0JCWVsc2UKLQkJCWxpc3RfZGVsKCZwZW5kX3JlcS0+cGVuZF9lbnRyeSk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgdm9pZCBibGt2c2NfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcXVldWUpCi17Ci0Jc3RydWN0IGJsb2NrX2RldmljZV9jb250ZXh0ICpibGtkZXYgPSBOVUxMOwotCXN0cnVjdCByZXF1ZXN0ICpyZXE7Ci0JaW50IHJldCA9IDA7Ci0KLQl3aGlsZSAoKHJlcSA9IGJsa19wZWVrX3JlcXVlc3QocXVldWUpKSAhPSBOVUxMKSB7Ci0KLQkJYmxrZGV2ID0gcmVxLT5ycV9kaXNrLT5wcml2YXRlX2RhdGE7Ci0JCWlmIChibGtkZXYtPnNodXR0aW5nX2Rvd24gfHwgcmVxLT5jbWRfdHlwZSAhPSBSRVFfVFlQRV9GUykgewotCQkJX19ibGtfZW5kX3JlcXVlc3RfY3VyKHJlcSwgMCk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXJldCA9IGJsa3ZzY19kb19wZW5kaW5nX3JlcXMoYmxrZGV2KTsKLQotCQlpZiAocmV0ICE9IDApIHsKLQkJCWJsa19zdG9wX3F1ZXVlKHF1ZXVlKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJYmxrX3N0YXJ0X3JlcXVlc3QocmVxKTsKLQotCQlyZXQgPSBibGt2c2NfZG9fcmVxdWVzdChibGtkZXYsIHJlcSk7Ci0JCWlmIChyZXQgPiAwKSB7Ci0JCQlibGtfc3RvcF9xdWV1ZShxdWV1ZSk7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmIChyZXQgPCAwKSB7Ci0JCQlibGtfcmVxdWV1ZV9yZXF1ZXN0KHF1ZXVlLCByZXEpOwotCQkJYmxrX3N0b3BfcXVldWUocXVldWUpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLQotCi0vKiBUaGUgb25lIGFuZCBvbmx5IG9uZSAqLwotc3RhdGljICBzdHJ1Y3QgaHZfZHJpdmVyIGJsa3ZzY19kcnYgPSB7Ci0JLnByb2JlID0gIGJsa3ZzY19wcm9iZSwKLQkucmVtb3ZlID0gIGJsa3ZzY19yZW1vdmUsCi0JLnNodXRkb3duID0gYmxrdnNjX3NodXRkb3duLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyBibG9ja19vcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSBibGt2c2Nfb3BlbiwKLQkucmVsZWFzZSA9IGJsa3ZzY19yZWxlYXNlLAotCS5nZXRnZW8gPSBibGt2c2NfZ2V0Z2VvLAotCS5pb2N0bCAgPSBibGt2c2NfaW9jdGwsCi19OwotCi0vKgotICogYmxrdnNjX2Rydl9pbml0IC0gIEJsa1ZzYyBkcml2ZXIgaW5pdGlhbGl6YXRpb24uCi0gKi8KLXN0YXRpYyBpbnQgYmxrdnNjX2Rydl9pbml0KHZvaWQpCi17Ci0Jc3RydWN0IGh2X2RyaXZlciAqZHJ2ID0gJmJsa3ZzY19kcnY7Ci0JaW50IHJldDsKLQotCUJVSUxEX0JVR19PTihzaXplb2Yoc2VjdG9yX3QpICE9IDgpOwotCi0JbWVtY3B5KCZkcnYtPmRldl90eXBlLCAmZGV2X3R5cGUsIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpOwotCWRydi0+ZHJpdmVyLm5hbWUgPSBkcnZfbmFtZTsKLQotCS8qIFRoZSBkcml2ZXIgYmVsb25ncyB0byB2bWJ1cyAqLwotCXJldCA9IHZtYnVzX2NoaWxkX2RyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgdm9pZCBibGt2c2NfZHJ2X2V4aXQodm9pZCkKLXsKLQotCXZtYnVzX2NoaWxkX2RyaXZlcl91bnJlZ2lzdGVyKCZibGt2c2NfZHJ2LmRyaXZlcik7Ci19Ci0KLS8qCi0gKiBibGt2c2NfcHJvYmUgLSBBZGQgYSBuZXcgZGV2aWNlIGZvciB0aGlzIGRyaXZlcgotICovCi1zdGF0aWMgaW50IGJsa3ZzY19wcm9iZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGJsb2NrX2RldmljZV9jb250ZXh0ICpibGtkZXYgPSBOVUxMOwotCXN0cnVjdCBzdG9ydnNjX2RldmljZV9pbmZvIGRldmljZV9pbmZvOwotCXN0cnVjdCBzdG9ydnNjX21ham9yX2luZm8gbWFqb3JfaW5mbzsKLQlpbnQgcmV0ID0gMDsKLQotCWJsa2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBibG9ja19kZXZpY2VfY29udGV4dCksIEdGUF9LRVJORUwpOwotCWlmICghYmxrZGV2KSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQlJTklUX0xJU1RfSEVBRCgmYmxrZGV2LT5wZW5kaW5nX2xpc3QpOwotCi0JLyogSW5pdGlhbGl6ZSB3aGF0IHdlIGNhbiBoZXJlICovCi0Jc3Bpbl9sb2NrX2luaXQoJmJsa2Rldi0+bG9jayk7Ci0KLQotCWJsa2Rldi0+cmVxdWVzdF9wb29sID0ga21lbV9jYWNoZV9jcmVhdGUoZGV2X25hbWUoJmRldi0+ZGV2aWNlKSwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBibGt2c2NfcmVxdWVzdCksIDAsCi0JCQkJCVNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7Ci0JaWYgKCFibGtkZXYtPnJlcXVlc3RfcG9vbCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0KLQlyZXQgPSBibGt2c2NfZGV2aWNlX2FkZChkZXYsICZkZXZpY2VfaW5mbyk7Ci0JaWYgKHJldCAhPSAwKQotCQlnb3RvIGNsZWFudXA7Ci0KLQlibGtkZXYtPmRldmljZV9jdHggPSBkZXY7Ci0JLyogdGhpcyBpZGVudGlmaWVkIHRoZSBkZXZpY2UgMCBvciAxICovCi0JYmxrZGV2LT50YXJnZXQgPSBkZXZpY2VfaW5mby50YXJnZXRfaWQ7Ci0JLyogdGhpcyBpZGVudGlmaWVkIHRoZSBpZGUgY3RybCAwIG9yIDEgKi8KLQlibGtkZXYtPnBhdGggPSBkZXZpY2VfaW5mby5wYXRoX2lkOwotCi0JZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldmljZSwgYmxrZGV2KTsKLQotCXJldCA9IHN0b3J2c2NfZ2V0X21ham9yX2luZm8oJmRldmljZV9pbmZvLCAmbWFqb3JfaW5mbyk7Ci0KLQlpZiAocmV0KQotCQlnb3RvIGNsZWFudXA7Ci0KLQlpZiAobWFqb3JfaW5mby5kb19yZWdpc3RlcikgewotCQlyZXQgPSByZWdpc3Rlcl9ibGtkZXYobWFqb3JfaW5mby5tYWpvciwgbWFqb3JfaW5mby5kZXZuYW1lKTsKLQotCQlpZiAocmV0ICE9IDApIHsKLQkJCURQUklOVF9FUlIoQkxLVlNDX0RSViwKLQkJCQkgICAicmVnaXN0ZXJfYmxrZGV2KCkgZmFpbGVkISByZXQgJWQiLCByZXQpOwotCQkJZ290byByZW1vdmU7Ci0JCX0KLQl9Ci0KLQlEUFJJTlRfSU5GTyhCTEtWU0NfRFJWLCAiYmxrdnNjIHJlZ2lzdGVyZWQgZm9yIG1ham9yICVkISEiLAotCQkJbWFqb3JfaW5mby5tYWpvcik7Ci0KLQlibGtkZXYtPmdkID0gYWxsb2NfZGlzayhCTEtWU0NfTUlOT1JTKTsKLQlpZiAoIWJsa2Rldi0+Z2QpIHsKLQkJcmV0ID0gLTE7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQlibGtkZXYtPmdkLT5xdWV1ZSA9IGJsa19pbml0X3F1ZXVlKGJsa3ZzY19yZXF1ZXN0LCAmYmxrZGV2LT5sb2NrKTsKLQotCWJsa19xdWV1ZV9tYXhfc2VnbWVudF9zaXplKGJsa2Rldi0+Z2QtPnF1ZXVlLCBQQUdFX1NJWkUpOwotCWJsa19xdWV1ZV9tYXhfc2VnbWVudHMoYmxrZGV2LT5nZC0+cXVldWUsIE1BWF9NVUxUSVBBR0VfQlVGRkVSX0NPVU5UKTsKLQlibGtfcXVldWVfc2VnbWVudF9ib3VuZGFyeShibGtkZXYtPmdkLT5xdWV1ZSwgUEFHRV9TSVpFLTEpOwotCWJsa19xdWV1ZV9ib3VuY2VfbGltaXQoYmxrZGV2LT5nZC0+cXVldWUsIEJMS19CT1VOQ0VfQU5ZKTsKLQlibGtfcXVldWVfZG1hX2FsaWdubWVudChibGtkZXYtPmdkLT5xdWV1ZSwgNTExKTsKLQotCWJsa2Rldi0+Z2QtPm1ham9yID0gbWFqb3JfaW5mby5tYWpvcjsKLQlpZiAobWFqb3JfaW5mby5pbmRleCA9PSAxIHx8IG1ham9yX2luZm8uaW5kZXggPT0gMykKLQkJYmxrZGV2LT5nZC0+Zmlyc3RfbWlub3IgPSBCTEtWU0NfTUlOT1JTOwotCWVsc2UKLQkJYmxrZGV2LT5nZC0+Zmlyc3RfbWlub3IgPSAwOwotCWJsa2Rldi0+Z2QtPmZvcHMgPSAmYmxvY2tfb3BzOwotCWJsa2Rldi0+Z2QtPnByaXZhdGVfZGF0YSA9IGJsa2RldjsKLQlibGtkZXYtPmdkLT5kcml2ZXJmc19kZXYgPSAmKGJsa2Rldi0+ZGV2aWNlX2N0eC0+ZGV2aWNlKTsKLQlzcHJpbnRmKGJsa2Rldi0+Z2QtPmRpc2tfbmFtZSwgImhkJWMiLCAnYScgKyBtYWpvcl9pbmZvLmluZGV4KTsKLQotCWJsa3ZzY19kb19vcGVyYXRpb24oYmxrZGV2LCBET19JTlFVSVJZKTsKLQlibGt2c2NfZG9fb3BlcmF0aW9uKGJsa2RldiwgRE9fQ0FQQUNJVFkpOwotCi0Jc2V0X2NhcGFjaXR5KGJsa2Rldi0+Z2QsIGJsa2Rldi0+Y2FwYWNpdHkgKiAoYmxrZGV2LT5zZWN0b3Jfc2l6ZS81MTIpKTsKLQlibGtfcXVldWVfbG9naWNhbF9ibG9ja19zaXplKGJsa2Rldi0+Z2QtPnF1ZXVlLCBibGtkZXYtPnNlY3Rvcl9zaXplKTsKLQkvKiBnbyEgKi8KLQlhZGRfZGlzayhibGtkZXYtPmdkKTsKLQotCURQUklOVF9JTkZPKEJMS1ZTQ19EUlYsICIlcyBhZGRlZCEhIGNhcGFjaXR5ICVsdSBzZWN0b3Jfc2l6ZSAlZCIsCi0JCSAgICBibGtkZXYtPmdkLT5kaXNrX25hbWUsICh1bnNpZ25lZCBsb25nKWJsa2Rldi0+Y2FwYWNpdHksCi0JCSAgICBibGtkZXYtPnNlY3Rvcl9zaXplKTsKLQotCXJldHVybiByZXQ7Ci0KLXJlbW92ZToKLQlzdG9ydnNjX2Rldl9yZW1vdmUoZGV2KTsKLQotY2xlYW51cDoKLQlpZiAoYmxrZGV2KSB7Ci0JCWlmIChibGtkZXYtPnJlcXVlc3RfcG9vbCkgewotCQkJa21lbV9jYWNoZV9kZXN0cm95KGJsa2Rldi0+cmVxdWVzdF9wb29sKTsKLQkJCWJsa2Rldi0+cmVxdWVzdF9wb29sID0gTlVMTDsKLQkJfQotCQlrZnJlZShibGtkZXYpOwotCQlibGtkZXYgPSBOVUxMOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGJsa3ZzY19yZXF1ZXN0X2NvbXBsZXRpb24oc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCAqcmVxdWVzdCkKLXsKLQlzdHJ1Y3QgYmxrdnNjX3JlcXVlc3QgKmJsa3ZzY19yZXEgPQotCQkJKHN0cnVjdCBibGt2c2NfcmVxdWVzdCAqKXJlcXVlc3QtPmNvbnRleHQ7Ci0Jc3RydWN0IGJsb2NrX2RldmljZV9jb250ZXh0ICpibGtkZXYgPQotCQkJKHN0cnVjdCBibG9ja19kZXZpY2VfY29udGV4dCAqKWJsa3ZzY19yZXEtPmRldjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBibGt2c2NfcmVxdWVzdCAqY29tcF9yZXEsICp0bXA7Ci0Jc3RydWN0IHZtc2NzaV9yZXF1ZXN0ICp2bV9zcmI7Ci0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZibGtkZXYtPmxvY2ssIGZsYWdzKTsKLQotCWJsa2Rldi0+bnVtX291dHN0YW5kaW5nX3JlcXMtLTsKLQlibGt2c2NfcmVxLT5ncm91cC0+b3V0c3RhbmRpbmctLTsKLQotCS8qCi0JICogT25seSBzdGFydCBwcm9jZXNzaW5nIHdoZW4gYWxsIHRoZSBibGt2c2NfcmVxcyBhcmUKLQkgKiBjb21wbGV0ZWQuIFRoaXMgZ3VhcmFudGVlcyBubyBvdXQtb2Ytb3JkZXIgYmxrdnNjX3JlcQotCSAqIGNvbXBsZXRpb24gd2hlbiBjYWxsaW5nIGVuZF90aGF0X3JlcXVlc3RfZmlyc3QoKQotCSAqLwotCWlmIChibGt2c2NfcmVxLT5ncm91cC0+b3V0c3RhbmRpbmcgPT0gMCkgewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY29tcF9yZXEsIHRtcCwKLQkJCQkJICZibGt2c2NfcmVxLT5ncm91cC0+YmxrdnNjX3JlcV9saXN0LAotCQkJCQkgcmVxX2VudHJ5KSB7Ci0KLQkJCWxpc3RfZGVsKCZjb21wX3JlcS0+cmVxX2VudHJ5KTsKLQotCQkJdm1fc3JiID0KLQkJCSZjb21wX3JlcS0+cmVxdWVzdC52c3Rvcl9wYWNrZXQudm1fc3JiOwotCQkJaWYgKCFfX2Jsa19lbmRfcmVxdWVzdChjb21wX3JlcS0+cmVxLAotCQkJCSghdm1fc3JiLT5zY3NpX3N0YXR1cyA/IDAgOiAtRUlPKSwKLQkJCQljb21wX3JlcS0+c2VjdG9yX2NvdW50ICogYmxrZGV2LT5zZWN0b3Jfc2l6ZSkpIHsKLQkJCQkvKgotCQkJCSAqIEFsbCB0aGUgc2VjdG9ycyBoYXZlIGJlZW4geGZlcnJlZCBpZSB0aGUKLQkJCQkgKiByZXF1ZXN0IGlzIGRvbmUKLQkJCQkgKi8KLQkJCQlrbWVtX2NhY2hlX2ZyZWUoYmxrZGV2LT5yZXF1ZXN0X3Bvb2wsCi0JCQkJCQljb21wX3JlcS0+Z3JvdXApOwotCQkJfQotCi0JCQlrbWVtX2NhY2hlX2ZyZWUoYmxrZGV2LT5yZXF1ZXN0X3Bvb2wsIGNvbXBfcmVxKTsKLQkJfQotCi0JCWlmICghYmxrZGV2LT5zaHV0dGluZ19kb3duKSB7Ci0JCQlibGt2c2NfZG9fcGVuZGluZ19yZXFzKGJsa2Rldik7Ci0JCQlibGtfc3RhcnRfcXVldWUoYmxrZGV2LT5nZC0+cXVldWUpOwotCQkJYmxrdnNjX3JlcXVlc3QoYmxrZGV2LT5nZC0+cXVldWUpOwotCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmxrZGV2LT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBibGt2c2NfZXhpdCh2b2lkKQotewotCWJsa3ZzY19kcnZfZXhpdCgpOwotfQotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfVkVSU0lPTihIVl9EUlZfVkVSU0lPTik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk1pY3Jvc29mdCBIeXBlci1WIHZpcnR1YWwgYmxvY2sgZHJpdmVyIik7Ci1tb2R1bGVfaW5pdChibGt2c2NfZHJ2X2luaXQpOwotbW9kdWxlX2V4aXQoYmxrdnNjX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L2h2X21vdXNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaHYvaHZfbW91c2UuYwppbmRleCBkOTU3ZmMyLi5jY2QzOWM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvaHZfbW91c2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvaHZfbW91c2UuYwpAQCAtMjIsMjAgKzIyLDE1IEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9oaWQuaD4KICNpbmNsdWRlIDxsaW51eC9oaWRkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWkuaD4KLQotI2luY2x1ZGUgImh5cGVydi5oIgorI2luY2x1ZGUgPGxpbnV4L2h5cGVydi5oPgogCiAKLS8qCi0gKiBEYXRhIHR5cGVzCi0gKi8KIHN0cnVjdCBodl9pbnB1dF9kZXZfaW5mbyB7CisJdW5zaWduZWQgaW50IHNpemU7CiAJdW5zaWduZWQgc2hvcnQgdmVuZG9yOwogCXVuc2lnbmVkIHNob3J0IHByb2R1Y3Q7CiAJdW5zaWduZWQgc2hvcnQgdmVyc2lvbjsKLQljaGFyIG5hbWVbMTI4XTsKKwl1bnNpZ25lZCBzaG9ydCByZXNlcnZlZFsxMV07CiB9OwogCiAvKiBUaGUgbWF4aW11bSBzaXplIG9mIGEgc3ludGhldGljIGlucHV0IG1lc3NhZ2UuICovCkBAIC01NCwxNyArNDksMTcgQEAKIAkJCQkJIChTWU5USEhJRF9JTlBVVF9WRVJTSU9OX01BSk9SIDw8IDE2KSkKIAogCi0jcHJhZ21hIHBhY2socHVzaCwxKQorI3ByYWdtYSBwYWNrKHB1c2gsIDEpCiAvKgogICogTWVzc2FnZSB0eXBlcyBpbiB0aGUgc3ludGhldGljIGlucHV0IHByb3RvY29sCiAgKi8KIGVudW0gc3ludGhoaWRfbXNnX3R5cGUgewotCVN5bnRoSGlkUHJvdG9jb2xSZXF1ZXN0LAotCVN5bnRoSGlkUHJvdG9jb2xSZXNwb25zZSwKLQlTeW50aEhpZEluaXRpYWxEZXZpY2VJbmZvLAotCVN5bnRoSGlkSW5pdGlhbERldmljZUluZm9BY2ssCi0JU3ludGhIaWRJbnB1dFJlcG9ydCwKLQlTeW50aEhpZE1heAorCVNZTlRIX0hJRF9QUk9UT0NPTF9SRVFVRVNULAorCVNZTlRIX0hJRF9QUk9UT0NPTF9SRVNQT05TRSwKKwlTWU5USF9ISURfSU5JVElBTF9ERVZJQ0VfSU5GTywKKwlTWU5USF9ISURfSU5JVElBTF9ERVZJQ0VfSU5GT19BQ0ssCisJU1lOVEhfSElEX0lOUFVUX1JFUE9SVCwKKwlTWU5USF9ISURfTUFYCiB9OwogCiAvKgpAQCAtMTIwLDE1ICsxMTUsMTUgQEAKIAogI3ByYWdtYSBwYWNrKHBvcCkKIAotI2RlZmluZSBJTlBVVFZTQ19TRU5EX1JJTkdfQlVGRkVSX1NJWkUJCTEwKlBBR0VfU0laRQotI2RlZmluZSBJTlBVVFZTQ19SRUNWX1JJTkdfQlVGRkVSX1NJWkUJCTEwKlBBR0VfU0laRQorI2RlZmluZSBJTlBVVFZTQ19TRU5EX1JJTkdfQlVGRkVSX1NJWkUJCSgxMCpQQUdFX1NJWkUpCisjZGVmaW5lIElOUFVUVlNDX1JFQ1ZfUklOR19CVUZGRVJfU0laRQkJKDEwKlBBR0VfU0laRSkKIAogI2RlZmluZSBOQklUUyh4KSAoKCh4KS9CSVRTX1BFUl9MT05HKSsxKQogCiBlbnVtIHBpcGVfcHJvdF9tc2dfdHlwZSB7Ci0JUGlwZU1lc3NhZ2VJbnZhbGlkID0gMCwKLQlQaXBlTWVzc2FnZURhdGEsCi0JUGlwZU1lc3NhZ2VNYXhpbXVtCisJUElQRV9NRVNTQUdFX0lOVkFMSUQsCisJUElQRV9NRVNTQUdFX0RBVEEsCisJUElQRV9NRVNTQUdFX01BWElNVU0KIH07CiAKIApAQCAtMTM4LDkgKzEzMyw2IEBACiAJY2hhciBkYXRhWzFdOwogfTsKIAotLyoKLSAqIERhdGEgdHlwZXMKLSAqLwogc3RydWN0ICBtb3VzZXZzY19wcnRfbXNnIHsKIAllbnVtIHBpcGVfcHJvdF9tc2dfdHlwZSB0eXBlOwogCXUzMiBzaXplOwpAQCAtMTU2LDM4ICsxNDgsMjIgQEAKICAqLwogc3RydWN0IG1vdXNldnNjX2RldiB7CiAJc3RydWN0IGh2X2RldmljZQkqZGV2aWNlOwotCS8qIDAgaW5kaWNhdGVzIHRoZSBkZXZpY2UgaXMgYmVpbmcgZGVzdHJveWVkICovCi0JYXRvbWljX3QJCXJlZl9jb3VudDsKLQlpbnQJCQludW1fb3V0c3RhbmRpbmdfcmVxOwogCXVuc2lnbmVkIGNoYXIJCWluaXRfY29tcGxldGU7CiAJc3RydWN0IG1vdXNldnNjX3BydF9tc2cJcHJvdG9jb2xfcmVxOwogCXN0cnVjdCBtb3VzZXZzY19wcnRfbXNnCXByb3RvY29sX3Jlc3A7CiAJLyogU3luY2hyb25pemUgdGhlIHJlcXVlc3QvcmVzcG9uc2UgaWYgbmVlZGVkICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QJcHJvdG9jb2xfd2FpdF9ldmVudDsKLQl3YWl0X3F1ZXVlX2hlYWRfdAlkZXZfaW5mb193YWl0X2V2ZW50OwotCWludAkJCXByb3RvY29sX3dhaXRfY29uZGl0aW9uOwotCWludAkJCWRldmljZV93YWl0X2NvbmRpdGlvbjsKKwlzdHJ1Y3QgY29tcGxldGlvbgl3YWl0X2V2ZW50OwogCWludAkJCWRldl9pbmZvX3N0YXR1czsKIAogCXN0cnVjdCBoaWRfZGVzY3JpcHRvcgkqaGlkX2Rlc2M7CiAJdW5zaWduZWQgY2hhcgkJKnJlcG9ydF9kZXNjOwogCXUzMgkJCXJlcG9ydF9kZXNjX3NpemU7CiAJc3RydWN0IGh2X2lucHV0X2Rldl9pbmZvIGhpZF9kZXZfaW5mbzsKKwlpbnQJCQljb25uZWN0ZWQ7CisJc3RydWN0IGhpZF9kZXZpY2UgICAgICAgKmhpZF9kZXZpY2U7CiB9OwogCiAKLXN0YXRpYyBjb25zdCBjaGFyICpkcml2ZXJfbmFtZSA9ICJtb3VzZXZzYyI7Ci0KLS8qIHtDRkE4QjY5RS01QjRBLTRjYzAtQjk4Qi04QkExQTFGM0Y5NUF9ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGh2X2d1aWQgbW91c2VfZ3VpZCA9IHsKLQkuZGF0YSA9IHsweDlFLCAweEI2LCAweEE4LCAweENGLCAweDRBLCAweDVCLCAweGMwLCAweDRjLAotCQkgMHhCOSwgMHg4QiwgMHg4QiwgMHhBMSwgMHhBMSwgMHhGMywgMHhGOSwgMHg1QX0KLX07Ci0KLXN0YXRpYyB2b2lkIGRldmljZWluZm9fY2FsbGJhY2soc3RydWN0IGh2X2RldmljZSAqZGV2LCBzdHJ1Y3QgaHZfaW5wdXRfZGV2X2luZm8gKmluZm8pOwotc3RhdGljIHZvaWQgaW5wdXRyZXBvcnRfY2FsbGJhY2soc3RydWN0IGh2X2RldmljZSAqZGV2LCB2b2lkICpwYWNrZXQsIHUzMiBsZW4pOwotc3RhdGljIHZvaWQgcmVwb3J0ZGVzY19jYWxsYmFjayhzdHJ1Y3QgaHZfZGV2aWNlICpkZXYsIHZvaWQgKnBhY2tldCwgdTMyIGxlbik7Ci0KIHN0YXRpYyBzdHJ1Y3QgbW91c2V2c2NfZGV2ICphbGxvY19pbnB1dF9kZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBtb3VzZXZzY19kZXYgKmlucHV0X2RldjsKQEAgLTE5NywxMzAgKzE3MywyMSBAQAogCWlmICghaW5wdXRfZGV2KQogCQlyZXR1cm4gTlVMTDsKIAotCS8qCi0JICogU2V0IHRvIDIgdG8gYWxsb3cgYm90aCBpbmJvdW5kIGFuZCBvdXRib3VuZCB0cmFmZmljcwotCSAqIChpZSBnZXRfaW5wdXRfZGV2aWNlKCkgYW5kIG11c3RfZ2V0X2lucHV0X2RldmljZSgpKSB0byBwcm9jZWVkLgotCSAqLwotCWF0b21pY19jbXB4Y2hnKCZpbnB1dF9kZXYtPnJlZl9jb3VudCwgMCwgMik7Ci0KIAlpbnB1dF9kZXYtPmRldmljZSA9IGRldmljZTsKLQlkZXZpY2UtPmV4dCA9IGlucHV0X2RldjsKKwlodl9zZXRfZHJ2ZGF0YShkZXZpY2UsIGlucHV0X2Rldik7CisJaW5pdF9jb21wbGV0aW9uKCZpbnB1dF9kZXYtPndhaXRfZXZlbnQpOwogCiAJcmV0dXJuIGlucHV0X2RldjsKIH0KIAogc3RhdGljIHZvaWQgZnJlZV9pbnB1dF9kZXZpY2Uoc3RydWN0IG1vdXNldnNjX2RldiAqZGV2aWNlKQogewotCVdBUk5fT04oYXRvbWljX3JlYWQoJmRldmljZS0+cmVmX2NvdW50KSA9PSAwKTsKKwlrZnJlZShkZXZpY2UtPmhpZF9kZXNjKTsKKwlrZnJlZShkZXZpY2UtPnJlcG9ydF9kZXNjKTsKKwlodl9zZXRfZHJ2ZGF0YShkZXZpY2UtPmRldmljZSwgTlVMTCk7CiAJa2ZyZWUoZGV2aWNlKTsKIH0KIAotLyoKLSAqIEdldCB0aGUgaW5wdXRkZXZpY2Ugb2JqZWN0IGlmIGV4aXN0cyBhbmQgaXRzIHJlZmNvdW50ID4gMQotICovCi1zdGF0aWMgc3RydWN0IG1vdXNldnNjX2RldiAqZ2V0X2lucHV0X2RldmljZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCi17Ci0Jc3RydWN0IG1vdXNldnNjX2RldiAqaW5wdXRfZGV2OwotCi0JaW5wdXRfZGV2ID0gKHN0cnVjdCBtb3VzZXZzY19kZXYgKilkZXZpY2UtPmV4dDsKLQotLyoKLSAqCUZJWE1FCi0gKglUaGlzIHN1cmUgaXNuJ3QgYSB2YWxpZCB0aGluZyB0byBwcmludCBmb3IgZGVidWdnaW5nLCBubyBtYXR0ZXIKLSAqCXdoYXQgdGhlIGludGVudGlvbiBpcy4uLgotICoKLSAqCXByaW50ayhLRVJOX0VSUiAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gUkVGQ09VTlQgPSAlZCIsCi0gKgkgICAgICAgaW5wdXRfZGV2LT5yZWZfY291bnQpOwotICovCi0KLQlpZiAoaW5wdXRfZGV2ICYmIGF0b21pY19yZWFkKCZpbnB1dF9kZXYtPnJlZl9jb3VudCkgPiAxKQotCQlhdG9taWNfaW5jKCZpbnB1dF9kZXYtPnJlZl9jb3VudCk7Ci0JZWxzZQotCQlpbnB1dF9kZXYgPSBOVUxMOwotCi0JcmV0dXJuIGlucHV0X2RldjsKLX0KLQotLyoKLSAqIEdldCB0aGUgaW5wdXRkZXZpY2Ugb2JqZWN0IGlmZiBleGlzdHMgYW5kIGl0cyByZWZjb3VudCA+IDAKLSAqLwotc3RhdGljIHN0cnVjdCBtb3VzZXZzY19kZXYgKm11c3RfZ2V0X2lucHV0X2RldmljZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCi17Ci0Jc3RydWN0IG1vdXNldnNjX2RldiAqaW5wdXRfZGV2OwotCi0JaW5wdXRfZGV2ID0gKHN0cnVjdCBtb3VzZXZzY19kZXYgKilkZXZpY2UtPmV4dDsKLQotCWlmIChpbnB1dF9kZXYgJiYgYXRvbWljX3JlYWQoJmlucHV0X2Rldi0+cmVmX2NvdW50KSkKLQkJYXRvbWljX2luYygmaW5wdXRfZGV2LT5yZWZfY291bnQpOwotCWVsc2UKLQkJaW5wdXRfZGV2ID0gTlVMTDsKLQotCXJldHVybiBpbnB1dF9kZXY7Ci19Ci0KLXN0YXRpYyB2b2lkIHB1dF9pbnB1dF9kZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQotewotCXN0cnVjdCBtb3VzZXZzY19kZXYgKmlucHV0X2RldjsKLQotCWlucHV0X2RldiA9IChzdHJ1Y3QgbW91c2V2c2NfZGV2ICopZGV2aWNlLT5leHQ7Ci0KLQlhdG9taWNfZGVjKCZpbnB1dF9kZXYtPnJlZl9jb3VudCk7Ci19Ci0KLS8qCi0gKiBEcm9wIHJlZiBjb3VudCB0byAxIHRvIGVmZmVjdGl2ZWx5IGRpc2FibGUgZ2V0X2lucHV0X2RldmljZSgpCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbW91c2V2c2NfZGV2ICpyZWxlYXNlX2lucHV0X2RldmljZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCi17Ci0Jc3RydWN0IG1vdXNldnNjX2RldiAqaW5wdXRfZGV2OwotCi0JaW5wdXRfZGV2ID0gKHN0cnVjdCBtb3VzZXZzY19kZXYgKilkZXZpY2UtPmV4dDsKLQotCS8qIEJ1c3kgd2FpdCB1bnRpbCB0aGUgcmVmIGRyb3AgdG8gMiwgdGhlbiBzZXQgaXQgdG8gMSAgKi8KLQl3aGlsZSAoYXRvbWljX2NtcHhjaGcoJmlucHV0X2Rldi0+cmVmX2NvdW50LCAyLCAxKSAhPSAyKQotCQl1ZGVsYXkoMTAwKTsKLQotCXJldHVybiBpbnB1dF9kZXY7Ci19Ci0KLS8qCi0gKiBEcm9wIHJlZiBjb3VudCB0byAwLiBObyBvbmUgY2FuIHVzZSBpbnB1dF9kZXZpY2Ugb2JqZWN0LgotICovCi1zdGF0aWMgc3RydWN0IG1vdXNldnNjX2RldiAqZmluYWxfcmVsZWFzZV9pbnB1dF9kZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQotewotCXN0cnVjdCBtb3VzZXZzY19kZXYgKmlucHV0X2RldjsKLQotCWlucHV0X2RldiA9IChzdHJ1Y3QgbW91c2V2c2NfZGV2ICopZGV2aWNlLT5leHQ7Ci0KLQkvKiBCdXN5IHdhaXQgdW50aWwgdGhlIHJlZiBkcm9wIHRvIDEsIHRoZW4gc2V0IGl0IHRvIDAgICovCi0Jd2hpbGUgKGF0b21pY19jbXB4Y2hnKCZpbnB1dF9kZXYtPnJlZl9jb3VudCwgMSwgMCkgIT0gMSkKLQkJdWRlbGF5KDEwMCk7Ci0KLQlkZXZpY2UtPmV4dCA9IE5VTEw7Ci0JcmV0dXJuIGlucHV0X2RldjsKLX0KLQotc3RhdGljIHZvaWQgbW91c2V2c2Nfb25fc2VuZF9jb21wbGV0aW9uKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKLQkJCQkJc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IgKnBhY2tldCkKLXsKLQlzdHJ1Y3QgbW91c2V2c2NfZGV2ICppbnB1dF9kZXY7Ci0Jdm9pZCAqcmVxdWVzdDsKLQotCWlucHV0X2RldiA9IG11c3RfZ2V0X2lucHV0X2RldmljZShkZXZpY2UpOwotCWlmICghaW5wdXRfZGV2KSB7Ci0JCXByX2VycigidW5hYmxlIHRvIGdldCBpbnB1dCBkZXZpY2UuLi5kZXZpY2UgYmVpbmcgZGVzdHJveWVkPyIpOwotCQlyZXR1cm47Ci0JfQotCi0JcmVxdWVzdCA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpcGFja2V0LT50cmFuc19pZDsKLQotCWlmIChyZXF1ZXN0ID09ICZpbnB1dF9kZXYtPnByb3RvY29sX3JlcSkgewotCQkvKiBGSVhNRSAqLwotCQkvKiBTaG91bGRuJ3Qgd2UgYmUgZG9pbmcgc29tZXRoaW5nIGhlcmU/ICovCi0JfQotCi0JcHV0X2lucHV0X2RldmljZShkZXZpY2UpOwotfQogCiBzdGF0aWMgdm9pZCBtb3VzZXZzY19vbl9yZWNlaXZlX2RldmljZV9pbmZvKHN0cnVjdCBtb3VzZXZzY19kZXYgKmlucHV0X2RldmljZSwKIAkJCQlzdHJ1Y3Qgc3ludGhoaWRfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvKQpAQCAtMzMyLDMzICsxOTksMjcgQEAKIAkvKiBBc3N1bWUgc3VjY2VzcyBmb3Igbm93ICovCiAJaW5wdXRfZGV2aWNlLT5kZXZfaW5mb19zdGF0dXMgPSAwOwogCi0JLyogU2F2ZSB0aGUgZGV2aWNlIGF0dHIgKi8KIAltZW1jcHkoJmlucHV0X2RldmljZS0+aGlkX2Rldl9pbmZvLCAmZGV2aWNlX2luZm8tPmhpZF9kZXZfaW5mbywKIAkJc2l6ZW9mKHN0cnVjdCBodl9pbnB1dF9kZXZfaW5mbykpOwogCi0JLyogU2F2ZSB0aGUgaGlkIGRlc2MgKi8KIAlkZXNjID0gJmRldmljZV9pbmZvLT5oaWRfZGVzY3JpcHRvcjsKLQlXQVJOX09OKGRlc2MtPmJMZW5ndGggPiAwKTsKKwlXQVJOX09OKGRlc2MtPmJMZW5ndGggPT0gMCk7CiAKLQlpbnB1dF9kZXZpY2UtPmhpZF9kZXNjID0ga3phbGxvYyhkZXNjLT5iTGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwlpbnB1dF9kZXZpY2UtPmhpZF9kZXNjID0ga3phbGxvYyhkZXNjLT5iTGVuZ3RoLCBHRlBfQVRPTUlDKTsKIAotCWlmICghaW5wdXRfZGV2aWNlLT5oaWRfZGVzYykgewotCQlwcl9lcnIoInVuYWJsZSB0byBhbGxvY2F0ZSBoaWQgZGVzY3JpcHRvciAtIHNpemUgJWQiLCBkZXNjLT5iTGVuZ3RoKTsKLQkJZ290byBDbGVhbnVwOwotCX0KKwlpZiAoIWlucHV0X2RldmljZS0+aGlkX2Rlc2MpCisJCWdvdG8gY2xlYW51cDsKIAogCW1lbWNweShpbnB1dF9kZXZpY2UtPmhpZF9kZXNjLCBkZXNjLCBkZXNjLT5iTGVuZ3RoKTsKIAotCS8qIFNhdmUgdGhlIHJlcG9ydCBkZXNjICovCiAJaW5wdXRfZGV2aWNlLT5yZXBvcnRfZGVzY19zaXplID0gZGVzYy0+ZGVzY1swXS53RGVzY3JpcHRvckxlbmd0aDsKKwlpZiAoaW5wdXRfZGV2aWNlLT5yZXBvcnRfZGVzY19zaXplID09IDApCisJCWdvdG8gY2xlYW51cDsKIAlpbnB1dF9kZXZpY2UtPnJlcG9ydF9kZXNjID0ga3phbGxvYyhpbnB1dF9kZXZpY2UtPnJlcG9ydF9kZXNjX3NpemUsCi0JCQkJCSAgR0ZQX0tFUk5FTCk7CisJCQkJCSAgR0ZQX0FUT01JQyk7CiAKLQlpZiAoIWlucHV0X2RldmljZS0+cmVwb3J0X2Rlc2MpIHsKLQkJcHJfZXJyKCJ1bmFibGUgdG8gYWxsb2NhdGUgcmVwb3J0IGRlc2NyaXB0b3IgLSBzaXplICVkIiwKLQkJCSAgIGlucHV0X2RldmljZS0+cmVwb3J0X2Rlc2Nfc2l6ZSk7Ci0JCWdvdG8gQ2xlYW51cDsKLQl9CisJaWYgKCFpbnB1dF9kZXZpY2UtPnJlcG9ydF9kZXNjKQorCQlnb3RvIGNsZWFudXA7CiAKIAltZW1jcHkoaW5wdXRfZGV2aWNlLT5yZXBvcnRfZGVzYywKIAkgICAgICAgKCh1bnNpZ25lZCBjaGFyICopZGVzYykgKyBkZXNjLT5iTGVuZ3RoLApAQCAtMzY3LDEwICsyMjgsMTAgQEAKIAkvKiBTZW5kIHRoZSBhY2sgKi8KIAltZW1zZXQoJmFjaywgMCwgc2l6ZW9mKHN0cnVjdCBtb3VzZXZzY19wcnRfbXNnKSk7CiAKLQlhY2sudHlwZSA9IFBpcGVNZXNzYWdlRGF0YTsKKwlhY2sudHlwZSA9IFBJUEVfTUVTU0FHRV9EQVRBOwogCWFjay5zaXplID0gc2l6ZW9mKHN0cnVjdCBzeW50aGhpZF9kZXZpY2VfaW5mb19hY2spOwogCi0JYWNrLmFjay5oZWFkZXIudHlwZSA9IFN5bnRoSGlkSW5pdGlhbERldmljZUluZm9BY2s7CisJYWNrLmFjay5oZWFkZXIudHlwZSA9IFNZTlRIX0hJRF9JTklUSUFMX0RFVklDRV9JTkZPX0FDSzsKIAlhY2suYWNrLmhlYWRlci5zaXplID0gMTsKIAlhY2suYWNrLnJlc2VydmVkID0gMDsKIApAQCAtMzgxLDE4ICsyNDIsMTQgQEAKIAkJCSh1bnNpZ25lZCBsb25nKSZhY2ssCiAJCQlWTV9QS1RfREFUQV9JTkJBTkQsCiAJCQlWTUJVU19EQVRBX1BBQ0tFVF9GTEFHX0NPTVBMRVRJT05fUkVRVUVTVEVEKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJcHJfZXJyKCJ1bmFibGUgdG8gc2VuZCBzeW50aGhpZCBkZXZpY2UgaW5mbyBhY2sgLSByZXQgJWQiLAotCQkJICAgcmV0KTsKLQkJZ290byBDbGVhbnVwOwotCX0KKwlpZiAocmV0ICE9IDApCisJCWdvdG8gY2xlYW51cDsKIAotCWlucHV0X2RldmljZS0+ZGV2aWNlX3dhaXRfY29uZGl0aW9uID0gMTsKLQl3YWtlX3VwKCZpbnB1dF9kZXZpY2UtPmRldl9pbmZvX3dhaXRfZXZlbnQpOworCWNvbXBsZXRlKCZpbnB1dF9kZXZpY2UtPndhaXRfZXZlbnQpOwogCiAJcmV0dXJuOwogCi1DbGVhbnVwOgorY2xlYW51cDoKIAlrZnJlZShpbnB1dF9kZXZpY2UtPmhpZF9kZXNjKTsKIAlpbnB1dF9kZXZpY2UtPmhpZF9kZXNjID0gTlVMTDsKIApAQCAtNDAwLDI1ICsyNTcsNyBAQAogCWlucHV0X2RldmljZS0+cmVwb3J0X2Rlc2MgPSBOVUxMOwogCiAJaW5wdXRfZGV2aWNlLT5kZXZfaW5mb19zdGF0dXMgPSAtMTsKLQlpbnB1dF9kZXZpY2UtPmRldmljZV93YWl0X2NvbmRpdGlvbiA9IDE7Ci0Jd2FrZV91cCgmaW5wdXRfZGV2aWNlLT5kZXZfaW5mb193YWl0X2V2ZW50KTsKLX0KLQotc3RhdGljIHZvaWQgbW91c2V2c2Nfb25fcmVjZWl2ZV9pbnB1dF9yZXBvcnQoc3RydWN0IG1vdXNldnNjX2RldiAqaW5wdXRfZGV2aWNlLAotCQkJCXN0cnVjdCBzeW50aGhpZF9pbnB1dF9yZXBvcnQgKmlucHV0X3JlcG9ydCkKLXsKLQlzdHJ1Y3QgaHZfZHJpdmVyICppbnB1dF9kcnY7Ci0KLQlpZiAoIWlucHV0X2RldmljZS0+aW5pdF9jb21wbGV0ZSkgewotCQlwcl9pbmZvKCJJbml0aWFsaXphdGlvbiBpbmNvbXBsZXRlLi4uaWdub3JpbmcgaW5wdXRfcmVwb3J0IG1zZyIpOwotCQlyZXR1cm47Ci0JfQotCi0JaW5wdXRfZHJ2ID0gZHJ2X3RvX2h2X2RydihpbnB1dF9kZXZpY2UtPmRldmljZS0+ZGV2aWNlLmRyaXZlcik7Ci0KLQlpbnB1dHJlcG9ydF9jYWxsYmFjayhpbnB1dF9kZXZpY2UtPmRldmljZSwKLQkJCSAgICAgaW5wdXRfcmVwb3J0LT5idWZmZXIsCi0JCQkgICAgIGlucHV0X3JlcG9ydC0+aGVhZGVyLnNpemUpOworCWNvbXBsZXRlKCZpbnB1dF9kZXZpY2UtPndhaXRfZXZlbnQpOwogfQogCiBzdGF0aWMgdm9pZCBtb3VzZXZzY19vbl9yZWNlaXZlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKQEAgLTQyNiwzNyArMjY1LDI3IEBACiB7CiAJc3RydWN0IHBpcGVfcHJ0X21zZyAqcGlwZV9tc2c7CiAJc3RydWN0IHN5bnRoaGlkX21zZyAqaGlkX21zZzsKLQlzdHJ1Y3QgbW91c2V2c2NfZGV2ICppbnB1dF9kZXY7Ci0KLQlpbnB1dF9kZXYgPSBtdXN0X2dldF9pbnB1dF9kZXZpY2UoZGV2aWNlKTsKLQlpZiAoIWlucHV0X2RldikgewotCQlwcl9lcnIoInVuYWJsZSB0byBnZXQgaW5wdXQgZGV2aWNlLi4uZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKLQkJcmV0dXJuOwotCX0KKwlzdHJ1Y3QgbW91c2V2c2NfZGV2ICppbnB1dF9kZXYgPSBodl9nZXRfZHJ2ZGF0YShkZXZpY2UpOworCXN0cnVjdCBzeW50aGhpZF9pbnB1dF9yZXBvcnQgKmlucHV0X3JlcG9ydDsKIAogCXBpcGVfbXNnID0gKHN0cnVjdCBwaXBlX3BydF9tc2cgKikoKHVuc2lnbmVkIGxvbmcpcGFja2V0ICsKIAkJCQkJCShwYWNrZXQtPm9mZnNldDggPDwgMykpOwogCi0JaWYgKHBpcGVfbXNnLT50eXBlICE9IFBpcGVNZXNzYWdlRGF0YSkgewotCQlwcl9lcnIoInVua25vd24gcGlwZSBtc2cgdHlwZSAtIHR5cGUgJWQgbGVuICVkIiwKLQkJCSAgIHBpcGVfbXNnLT50eXBlLCBwaXBlX21zZy0+c2l6ZSk7Ci0JCXB1dF9pbnB1dF9kZXZpY2UoZGV2aWNlKTsKLQkJcmV0dXJuIDsKLQl9CisJaWYgKHBpcGVfbXNnLT50eXBlICE9IFBJUEVfTUVTU0FHRV9EQVRBKQorCQlyZXR1cm47CiAKIAloaWRfbXNnID0gKHN0cnVjdCBzeW50aGhpZF9tc2cgKikmcGlwZV9tc2ctPmRhdGFbMF07CiAKIAlzd2l0Y2ggKGhpZF9tc2ctPmhlYWRlci50eXBlKSB7Ci0JY2FzZSBTeW50aEhpZFByb3RvY29sUmVzcG9uc2U6CisJY2FzZSBTWU5USF9ISURfUFJPVE9DT0xfUkVTUE9OU0U6CiAJCW1lbWNweSgmaW5wdXRfZGV2LT5wcm90b2NvbF9yZXNwLCBwaXBlX21zZywKIAkJICAgICAgIHBpcGVfbXNnLT5zaXplICsgc2l6ZW9mKHN0cnVjdCBwaXBlX3BydF9tc2cpIC0KIAkJICAgICAgIHNpemVvZih1bnNpZ25lZCBjaGFyKSk7Ci0JCWlucHV0X2Rldi0+cHJvdG9jb2xfd2FpdF9jb25kaXRpb24gPSAxOwotCQl3YWtlX3VwKCZpbnB1dF9kZXYtPnByb3RvY29sX3dhaXRfZXZlbnQpOworCQljb21wbGV0ZSgmaW5wdXRfZGV2LT53YWl0X2V2ZW50KTsKIAkJYnJlYWs7CiAKLQljYXNlIFN5bnRoSGlkSW5pdGlhbERldmljZUluZm86Ci0JCVdBUk5fT04ocGlwZV9tc2ctPnNpemUgPj0gc2l6ZW9mKHN0cnVjdCBodl9pbnB1dF9kZXZfaW5mbykpOworCWNhc2UgU1lOVEhfSElEX0lOSVRJQUxfREVWSUNFX0lORk86CisJCVdBUk5fT04ocGlwZV9tc2ctPnNpemUgPCBzaXplb2Yoc3RydWN0IGh2X2lucHV0X2Rldl9pbmZvKSk7CiAKIAkJLyoKIAkJICogUGFyc2Ugb3V0IHRoZSBkZXZpY2UgaW5mbyBpbnRvIGRldmljZSBhdHRyLApAQCAtNDY1LDEwICsyOTQsMTQgQEAKIAkJbW91c2V2c2Nfb25fcmVjZWl2ZV9kZXZpY2VfaW5mbyhpbnB1dF9kZXYsCiAJCQkoc3RydWN0IHN5bnRoaGlkX2RldmljZV9pbmZvICopJnBpcGVfbXNnLT5kYXRhWzBdKTsKIAkJYnJlYWs7Ci0JY2FzZSBTeW50aEhpZElucHV0UmVwb3J0OgotCQltb3VzZXZzY19vbl9yZWNlaXZlX2lucHV0X3JlcG9ydChpbnB1dF9kZXYsCi0JCQkoc3RydWN0IHN5bnRoaGlkX2lucHV0X3JlcG9ydCAqKSZwaXBlX21zZy0+ZGF0YVswXSk7Ci0KKwljYXNlIFNZTlRIX0hJRF9JTlBVVF9SRVBPUlQ6CisJCWlucHV0X3JlcG9ydCA9CisJCQkoc3RydWN0IHN5bnRoaGlkX2lucHV0X3JlcG9ydCAqKSZwaXBlX21zZy0+ZGF0YVswXTsKKwkJaWYgKCFpbnB1dF9kZXYtPmluaXRfY29tcGxldGUpCisJCQlicmVhazsKKwkJaGlkX2lucHV0X3JlcG9ydChpbnB1dF9kZXYtPmhpZF9kZXZpY2UsCisJCQkJSElEX0lOUFVUX1JFUE9SVCwgaW5wdXRfcmVwb3J0LT5idWZmZXIsCisJCQkJaW5wdXRfcmVwb3J0LT5oZWFkZXIuc2l6ZSwgMSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByX2VycigidW5zdXBwb3J0ZWQgaGlkIG1zZyB0eXBlIC0gdHlwZSAlZCBsZW4gJWQiLApAQCAtNDc2LDcgKzMwOSw2IEBACiAJCWJyZWFrOwogCX0KIAotCXB1dF9pbnB1dF9kZXZpY2UoZGV2aWNlKTsKIH0KIAogc3RhdGljIHZvaWQgbW91c2V2c2Nfb25fY2hhbm5lbF9jYWxsYmFjayh2b2lkICpjb250ZXh0KQpAQCAtNDg0LDcgKzMxNiw2IEBACiAJY29uc3QgaW50IHBhY2tldFNpemUgPSAweDEwMDsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UgPSAoc3RydWN0IGh2X2RldmljZSAqKWNvbnRleHQ7Ci0Jc3RydWN0IG1vdXNldnNjX2RldiAqaW5wdXRfZGV2OwogCiAJdTMyIGJ5dGVzX3JlY3ZkOwogCXU2NCByZXFfaWQ7CkBAIC00OTMsMTIgKzMyNCw2IEBACiAJdW5zaWduZWQgY2hhcgkqYnVmZmVyID0gcGFja2V0OwogCWludAlidWZmZXJsZW4gPSBwYWNrZXRTaXplOwogCi0JaW5wdXRfZGV2ID0gbXVzdF9nZXRfaW5wdXRfZGV2aWNlKGRldmljZSk7Ci0KLQlpZiAoIWlucHV0X2RldikgewotCQlwcl9lcnIoInVuYWJsZSB0byBnZXQgaW5wdXQgZGV2aWNlLi4uZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKLQkJcmV0dXJuOwotCX0KIAogCWRvIHsKIAkJcmV0ID0gdm1idXNfcmVjdnBhY2tldF9yYXcoZGV2aWNlLT5jaGFubmVsLCBidWZmZXIsCkBAIC01MDksMjIgKzMzNCwyMCBAQAogCQkJCWRlc2MgPSAoc3RydWN0IHZtcGFja2V0X2Rlc2NyaXB0b3IgKilidWZmZXI7CiAKIAkJCQlzd2l0Y2ggKGRlc2MtPnR5cGUpIHsKLQkJCQkJY2FzZSBWTV9QS1RfQ09NUDoKLQkJCQkJCW1vdXNldnNjX29uX3NlbmRfY29tcGxldGlvbigKLQkJCQkJCQlkZXZpY2UsIGRlc2MpOwotCQkJCQkJYnJlYWs7CisJCQkJY2FzZSBWTV9QS1RfQ09NUDoKKwkJCQkJYnJlYWs7CiAKLQkJCQkJY2FzZSBWTV9QS1RfREFUQV9JTkJBTkQ6Ci0JCQkJCQltb3VzZXZzY19vbl9yZWNlaXZlKAotCQkJCQkJCWRldmljZSwgZGVzYyk7Ci0JCQkJCQlicmVhazsKKwkJCQljYXNlIFZNX1BLVF9EQVRBX0lOQkFORDoKKwkJCQkJbW91c2V2c2Nfb25fcmVjZWl2ZSgKKwkJCQkJCWRldmljZSwgZGVzYyk7CisJCQkJCWJyZWFrOwogCi0JCQkJCWRlZmF1bHQ6Ci0JCQkJCQlwcl9lcnIoInVuaGFuZGxlZCBwYWNrZXQgdHlwZSAlZCwgdGlkICVsbHggbGVuICVkXG4iLAotCQkJCQkJCSAgIGRlc2MtPnR5cGUsCi0JCQkJCQkJICAgcmVxX2lkLAotCQkJCQkJCSAgIGJ5dGVzX3JlY3ZkKTsKLQkJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXByX2VycigidW5oYW5kbGVkIHBhY2tldCB0eXBlICVkLCB0aWQgJWxseCBsZW4gJWRcbiIsCisJCQkJCQkgICBkZXNjLT50eXBlLAorCQkJCQkJICAgcmVxX2lkLAorCQkJCQkJICAgYnl0ZXNfcmVjdmQpOworCQkJCQlicmVhazsKIAkJCQl9CiAKIAkJCQkvKiByZXNldCAqLwpAQCAtNTM1LDEwICszNTgsNiBAQAogCQkJCQlidWZmZXJsZW4gPSBwYWNrZXRTaXplOwogCQkJCX0KIAkJCX0gZWxzZSB7Ci0JCQkJLyoKLQkJCQkgKiBwcl9kZWJ1Zygibm90aGluZyBlbHNlIHRvIHJlYWQuLi4iKTsKLQkJCQkgKiByZXNldAotCQkJCSAqLwogCQkJCWlmIChidWZmZXJsZW4gPiBwYWNrZXRTaXplKSB7CiAJCQkJCWtmcmVlKGJ1ZmZlcik7CiAKQEAgLTU0Nyw3OSArMzY2LDU3IEBACiAJCQkJfQogCQkJCWJyZWFrOwogCQkJfQotCQl9IGVsc2UgaWYgKHJldCA9PSAtMikgeworCQl9IGVsc2UgaWYgKHJldCA9PSAtRU5PQlVGUykgewogCQkJLyogSGFuZGxlIGxhcmdlIHBhY2tldCAqLwogCQkJYnVmZmVybGVuID0gYnl0ZXNfcmVjdmQ7Ci0JCQlidWZmZXIgPSBremFsbG9jKGJ5dGVzX3JlY3ZkLCBHRlBfS0VSTkVMKTsKKwkJCWJ1ZmZlciA9IGt6YWxsb2MoYnl0ZXNfcmVjdmQsIEdGUF9BVE9NSUMpOwogCiAJCQlpZiAoYnVmZmVyID09IE5VTEwpIHsKIAkJCQlidWZmZXIgPSBwYWNrZXQ7CiAJCQkJYnVmZmVybGVuID0gcGFja2V0U2l6ZTsKLQotCQkJCS8qIFRyeSBhZ2FpbiBuZXh0IHRpbWUgYXJvdW5kICovCi0JCQkJcHJfZXJyKCJ1bmFibGUgdG8gYWxsb2NhdGUgYnVmZmVyIG9mIHNpemUgJWQhIiwKLQkJCQkgICAgICAgYnl0ZXNfcmVjdmQpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CiAJfSB3aGlsZSAoMSk7CiAKLQlwdXRfaW5wdXRfZGV2aWNlKGRldmljZSk7Ci0KIAlyZXR1cm47CiB9CiAKIHN0YXRpYyBpbnQgbW91c2V2c2NfY29ubmVjdF90b192c3Aoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewogCWludCByZXQgPSAwOwotCXN0cnVjdCBtb3VzZXZzY19kZXYgKmlucHV0X2RldjsKKwlpbnQgdDsKKwlzdHJ1Y3QgbW91c2V2c2NfZGV2ICppbnB1dF9kZXYgPSBodl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwogCXN0cnVjdCBtb3VzZXZzY19wcnRfbXNnICpyZXF1ZXN0OwogCXN0cnVjdCBtb3VzZXZzY19wcnRfbXNnICpyZXNwb25zZTsKIAotCWlucHV0X2RldiA9IGdldF9pbnB1dF9kZXZpY2UoZGV2aWNlKTsKLQotCWlmICghaW5wdXRfZGV2KSB7Ci0JCXByX2VycigidW5hYmxlIHRvIGdldCBpbnB1dCBkZXZpY2UuLi5kZXZpY2UgYmVpbmcgZGVzdHJveWVkPyIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmaW5wdXRfZGV2LT5wcm90b2NvbF93YWl0X2V2ZW50KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbnB1dF9kZXYtPmRldl9pbmZvX3dhaXRfZXZlbnQpOwogCiAJcmVxdWVzdCA9ICZpbnB1dF9kZXYtPnByb3RvY29sX3JlcTsKIAotCS8qCi0JICogTm93LCBpbml0aWF0ZSB0aGUgdnNjL3ZzcCBpbml0aWFsaXphdGlvbiBwcm90b2NvbCBvbiB0aGUgb3BlbiBjaGFubmVsCi0JICovCiAJbWVtc2V0KHJlcXVlc3QsIDAsIHNpemVvZihzdHJ1Y3QgbW91c2V2c2NfcHJ0X21zZykpOwogCi0JcmVxdWVzdC0+dHlwZSA9IFBpcGVNZXNzYWdlRGF0YTsKKwlyZXF1ZXN0LT50eXBlID0gUElQRV9NRVNTQUdFX0RBVEE7CiAJcmVxdWVzdC0+c2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc3ludGhoaWRfcHJvdG9jb2xfcmVxdWVzdCk7CiAKLQlyZXF1ZXN0LT5yZXF1ZXN0LmhlYWRlci50eXBlID0gU3ludGhIaWRQcm90b2NvbFJlcXVlc3Q7Ci0JcmVxdWVzdC0+cmVxdWVzdC5oZWFkZXIuc2l6ZSA9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwlyZXF1ZXN0LT5yZXF1ZXN0LmhlYWRlci50eXBlID0gU1lOVEhfSElEX1BST1RPQ09MX1JFUVVFU1Q7CisJcmVxdWVzdC0+cmVxdWVzdC5oZWFkZXIuc2l6ZSA9IHNpemVvZih1bnNpZ25lZCBpbnQpOwogCXJlcXVlc3QtPnJlcXVlc3QudmVyc2lvbl9yZXF1ZXN0ZWQudmVyc2lvbiA9IFNZTlRISElEX0lOUFVUX1ZFUlNJT047CiAKLQlwcl9pbmZvKCJzeW50aGhpZCBwcm90b2NvbCByZXF1ZXN0Li4uIik7CiAKIAlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KGRldmljZS0+Y2hhbm5lbCwgcmVxdWVzdCwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBwaXBlX3BydF9tc2cpIC0KLQkJCQkJc2l6ZW9mKHVuc2lnbmVkIGNoYXIpICsKLQkJCQkJc2l6ZW9mKHN0cnVjdCBzeW50aGhpZF9wcm90b2NvbF9yZXF1ZXN0KSwKLQkJCQkJKHVuc2lnbmVkIGxvbmcpcmVxdWVzdCwKLQkJCQkJVk1fUEtUX0RBVEFfSU5CQU5ELAotCQkJCQlWTUJVU19EQVRBX1BBQ0tFVF9GTEFHX0NPTVBMRVRJT05fUkVRVUVTVEVEKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJcHJfZXJyKCJ1bmFibGUgdG8gc2VuZCBzeW50aGhpZCBwcm90b2NvbCByZXF1ZXN0LiIpOwotCQlnb3RvIENsZWFudXA7Ci0JfQorCQkJCXNpemVvZihzdHJ1Y3QgcGlwZV9wcnRfbXNnKSAtCisJCQkJc2l6ZW9mKHVuc2lnbmVkIGNoYXIpICsKKwkJCQlzaXplb2Yoc3RydWN0IHN5bnRoaGlkX3Byb3RvY29sX3JlcXVlc3QpLAorCQkJCSh1bnNpZ25lZCBsb25nKXJlcXVlc3QsCisJCQkJVk1fUEtUX0RBVEFfSU5CQU5ELAorCQkJCVZNQlVTX0RBVEFfUEFDS0VUX0ZMQUdfQ09NUExFVElPTl9SRVFVRVNURUQpOworCWlmIChyZXQgIT0gMCkKKwkJZ290byBjbGVhbnVwOwogCi0JaW5wdXRfZGV2LT5wcm90b2NvbF93YWl0X2NvbmRpdGlvbiA9IDA7Ci0Jd2FpdF9ldmVudF90aW1lb3V0KGlucHV0X2Rldi0+cHJvdG9jb2xfd2FpdF9ldmVudCwKLQkJaW5wdXRfZGV2LT5wcm90b2NvbF93YWl0X2NvbmRpdGlvbiwgbXNlY3NfdG9famlmZmllcygxMDAwKSk7Ci0JaWYgKGlucHV0X2Rldi0+cHJvdG9jb2xfd2FpdF9jb25kaXRpb24gPT0gMCkgeworCXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmlucHV0X2Rldi0+d2FpdF9ldmVudCwgNSpIWik7CisJaWYgKHQgPT0gMCkgewogCQlyZXQgPSAtRVRJTUVET1VUOwotCQlnb3RvIENsZWFudXA7CisJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAlyZXNwb25zZSA9ICZpbnB1dF9kZXYtPnByb3RvY29sX3Jlc3A7CkBAIC02MjcsMTc2ICs0MjQsMjggQEAKIAlpZiAoIXJlc3BvbnNlLT5yZXNwb25zZS5hcHByb3ZlZCkgewogCQlwcl9lcnIoInN5bnRoaGlkIHByb3RvY29sIHJlcXVlc3QgZmFpbGVkICh2ZXJzaW9uICVkKSIsCiAJCSAgICAgICBTWU5USEhJRF9JTlBVVF9WRVJTSU9OKTsKLQkJcmV0ID0gLTE7Ci0JCWdvdG8gQ2xlYW51cDsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBjbGVhbnVwOwogCX0KIAotCWlucHV0X2Rldi0+ZGV2aWNlX3dhaXRfY29uZGl0aW9uID0gMDsKLQl3YWl0X2V2ZW50X3RpbWVvdXQoaW5wdXRfZGV2LT5kZXZfaW5mb193YWl0X2V2ZW50LAotCQlpbnB1dF9kZXYtPmRldmljZV93YWl0X2NvbmRpdGlvbiwgbXNlY3NfdG9famlmZmllcygxMDAwKSk7Ci0JaWYgKGlucHV0X2Rldi0+ZGV2aWNlX3dhaXRfY29uZGl0aW9uID09IDApIHsKKwl0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpbnB1dF9kZXYtPndhaXRfZXZlbnQsIDUqSFopOworCWlmICh0ID09IDApIHsKIAkJcmV0ID0gLUVUSU1FRE9VVDsKLQkJZ290byBDbGVhbnVwOworCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJLyoKIAkgKiBXZSBzaG91bGQgaGF2ZSBnb3R0ZW4gdGhlIGRldmljZSBhdHRyLCBoaWQgZGVzYyBhbmQgcmVwb3J0CiAJICogZGVzYyBhdCB0aGlzIHBvaW50CiAJICovCi0JaWYgKCFpbnB1dF9kZXYtPmRldl9pbmZvX3N0YXR1cykKLQkJcHJfaW5mbygiKioqKiBpbnB1dCBjaGFubmVsIHVwIGFuZCBydW5uaW5nISEgKioqKiIpOwotCWVsc2UKLQkJcmV0ID0gLTE7CisJaWYgKGlucHV0X2Rldi0+ZGV2X2luZm9fc3RhdHVzKQorCQlyZXQgPSAtRU5PTUVNOwogCi1DbGVhbnVwOgotCXB1dF9pbnB1dF9kZXZpY2UoZGV2aWNlKTsKK2NsZWFudXA6CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG1vdXNldnNjX29uX2RldmljZV9hZGQoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAotCQkJCQl2b2lkICphZGRpdGlvbmFsX2luZm8pCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IG1vdXNldnNjX2RldiAqaW5wdXRfZGV2OwotCXN0cnVjdCBodl9kcml2ZXIgKmlucHV0X2RydjsKLQlzdHJ1Y3QgaHZfaW5wdXRfZGV2X2luZm8gZGV2X2luZm87Ci0KLQlpbnB1dF9kZXYgPSBhbGxvY19pbnB1dF9kZXZpY2UoZGV2aWNlKTsKLQotCWlmICghaW5wdXRfZGV2KSB7Ci0JCXJldCA9IC0xOwotCQlnb3RvIENsZWFudXA7Ci0JfQotCi0JaW5wdXRfZGV2LT5pbml0X2NvbXBsZXRlID0gZmFsc2U7Ci0KLQkvKiBPcGVuIHRoZSBjaGFubmVsICovCi0JcmV0ID0gdm1idXNfb3BlbihkZXZpY2UtPmNoYW5uZWwsCi0JCUlOUFVUVlNDX1NFTkRfUklOR19CVUZGRVJfU0laRSwKLQkJSU5QVVRWU0NfUkVDVl9SSU5HX0JVRkZFUl9TSVpFLAotCQlOVUxMLAotCQkwLAotCQltb3VzZXZzY19vbl9jaGFubmVsX2NhbGxiYWNrLAotCQlkZXZpY2UKLQkJKTsKLQotCWlmIChyZXQgIT0gMCkgewotCQlwcl9lcnIoInVuYWJsZSB0byBvcGVuIGNoYW5uZWw6ICVkIiwgcmV0KTsKLQkJZnJlZV9pbnB1dF9kZXZpY2UoaW5wdXRfZGV2KTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXByX2luZm8oIklucHV0VnNjIGNoYW5uZWwgb3BlbjogJWQiLCByZXQpOwotCi0JcmV0ID0gbW91c2V2c2NfY29ubmVjdF90b192c3AoZGV2aWNlKTsKLQotCWlmIChyZXQgIT0gMCkgewotCQlwcl9lcnIoInVuYWJsZSB0byBjb25uZWN0IGNoYW5uZWw6ICVkIiwgcmV0KTsKLQotCQl2bWJ1c19jbG9zZShkZXZpY2UtPmNoYW5uZWwpOwotCQlmcmVlX2lucHV0X2RldmljZShpbnB1dF9kZXYpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlucHV0X2RydiA9IGRydl90b19odl9kcnYoaW5wdXRfZGV2LT5kZXZpY2UtPmRldmljZS5kcml2ZXIpOwotCi0JZGV2X2luZm8udmVuZG9yID0gaW5wdXRfZGV2LT5oaWRfZGV2X2luZm8udmVuZG9yOwotCWRldl9pbmZvLnByb2R1Y3QgPSBpbnB1dF9kZXYtPmhpZF9kZXZfaW5mby5wcm9kdWN0OwotCWRldl9pbmZvLnZlcnNpb24gPSBpbnB1dF9kZXYtPmhpZF9kZXZfaW5mby52ZXJzaW9uOwotCXN0cmNweShkZXZfaW5mby5uYW1lLCAiTWljcm9zb2Z0IFZtYnVzIEhJRC1jb21wbGlhbnQgTW91c2UiKTsKLQotCS8qIFNlbmQgdGhlIGRldmljZSBpbmZvIGJhY2sgdXAgKi8KLQlkZXZpY2VpbmZvX2NhbGxiYWNrKGRldmljZSwgJmRldl9pbmZvKTsKLQotCS8qIFNlbmQgdGhlIHJlcG9ydCBkZXNjIGJhY2sgdXAgKi8KLQkvKiB3b3JrYXJvdW5kIFNBLTE2NyAqLwotCWlmIChpbnB1dF9kZXYtPnJlcG9ydF9kZXNjWzE0XSA9PSAweDI1KQotCQlpbnB1dF9kZXYtPnJlcG9ydF9kZXNjWzE0XSA9IDB4Mjk7Ci0KLQlyZXBvcnRkZXNjX2NhbGxiYWNrKGRldmljZSwgaW5wdXRfZGV2LT5yZXBvcnRfZGVzYywKLQkJCSAgICBpbnB1dF9kZXYtPnJlcG9ydF9kZXNjX3NpemUpOwotCi0JaW5wdXRfZGV2LT5pbml0X2NvbXBsZXRlID0gdHJ1ZTsKLQotQ2xlYW51cDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG1vdXNldnNjX29uX2RldmljZV9yZW1vdmUoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQotewotCXN0cnVjdCBtb3VzZXZzY19kZXYgKmlucHV0X2RldjsKLQlpbnQgcmV0ID0gMDsKLQotCXByX2luZm8oImRpc2FibGluZyBpbnB1dCBkZXZpY2UgKCVwKS4uLiIsCi0JCSAgICBkZXZpY2UtPmV4dCk7Ci0KLQlpbnB1dF9kZXYgPSByZWxlYXNlX2lucHV0X2RldmljZShkZXZpY2UpOwotCi0KLQkvKgotCSAqIEF0IHRoaXMgcG9pbnQsIGFsbCBvdXRib3VuZCB0cmFmZmljIHNob3VsZCBiZSBkaXNhYmxlLiBXZSBvbmx5Ci0JICogYWxsb3cgaW5ib3VuZCB0cmFmZmljIChyZXNwb25zZXMpIHRvIHByb2NlZWQKLQkgKgotCSAqIHNvIHRoYXQgb3V0c3RhbmRpbmcgcmVxdWVzdHMgY2FuIGJlIGNvbXBsZXRlZC4KLQkgKi8KLQl3aGlsZSAoaW5wdXRfZGV2LT5udW1fb3V0c3RhbmRpbmdfcmVxKSB7Ci0JCXByX2luZm8oIndhaXRpbmcgZm9yICVkIHJlcXVlc3RzIHRvIGNvbXBsZXRlLi4uIiwKLQkJCWlucHV0X2Rldi0+bnVtX291dHN0YW5kaW5nX3JlcSk7Ci0KLQkJdWRlbGF5KDEwMCk7Ci0JfQotCi0JcHJfaW5mbygicmVtb3ZpbmcgaW5wdXQgZGV2aWNlICglcCkuLi4iLCBkZXZpY2UtPmV4dCk7Ci0KLQlpbnB1dF9kZXYgPSBmaW5hbF9yZWxlYXNlX2lucHV0X2RldmljZShkZXZpY2UpOwotCi0JcHJfaW5mbygiaW5wdXQgZGV2aWNlICglcCkgc2FmZSB0byByZW1vdmUiLCBpbnB1dF9kZXYpOwotCi0JLyogQ2xvc2UgdGhlIGNoYW5uZWwgKi8KLQl2bWJ1c19jbG9zZShkZXZpY2UtPmNoYW5uZWwpOwotCi0JZnJlZV9pbnB1dF9kZXZpY2UoaW5wdXRfZGV2KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLQotLyoKLSAqIERhdGEgdHlwZXMKLSAqLwotc3RydWN0IGlucHV0X2RldmljZV9jb250ZXh0IHsKLQlzdHJ1Y3QgaHZfZGV2aWNlCSpkZXZpY2VfY3R4OwotCXN0cnVjdCBoaWRfZGV2aWNlCSpoaWRfZGV2aWNlOwotCXN0cnVjdCBodl9pbnB1dF9kZXZfaW5mbyBkZXZpY2VfaW5mbzsKLQlpbnQJCQljb25uZWN0ZWQ7Ci19OwotCi0KLXN0YXRpYyB2b2lkIGRldmljZWluZm9fY2FsbGJhY2soc3RydWN0IGh2X2RldmljZSAqZGV2LCBzdHJ1Y3QgaHZfaW5wdXRfZGV2X2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IGlucHV0X2RldmljZV9jb250ZXh0ICppbnB1dF9kZXZpY2VfY3R4ID0KLQkJZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldmljZSk7Ci0KLQltZW1jcHkoJmlucHV0X2RldmljZV9jdHgtPmRldmljZV9pbmZvLCBpbmZvLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGh2X2lucHV0X2Rldl9pbmZvKSk7Ci0KLQlEUFJJTlRfSU5GTyhJTlBVVFZTQ19EUlYsICIlcyIsIF9fZnVuY19fKTsKLX0KLQotc3RhdGljIHZvaWQgaW5wdXRyZXBvcnRfY2FsbGJhY2soc3RydWN0IGh2X2RldmljZSAqZGV2LCB2b2lkICpwYWNrZXQsIHUzMiBsZW4pCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlzdHJ1Y3QgaW5wdXRfZGV2aWNlX2NvbnRleHQgKmlucHV0X2Rldl9jdHggPQotCQlkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2aWNlKTsKLQotCXJldCA9IGhpZF9pbnB1dF9yZXBvcnQoaW5wdXRfZGV2X2N0eC0+aGlkX2RldmljZSwKLQkJCSAgICAgIEhJRF9JTlBVVF9SRVBPUlQsIHBhY2tldCwgbGVuLCAxKTsKLQotCURQUklOVF9EQkcoSU5QVVRWU0NfRFJWLCAiaGlkX2lucHV0X3JlcG9ydCAocmV0ICVkKSIsIHJldCk7Ci19Ci0KIHN0YXRpYyBpbnQgbW91c2V2c2NfaGlkX29wZW4oc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKIHsKIAlyZXR1cm4gMDsKQEAgLTgwNiwxNjkgKzQ1NSwxNDUgQEAKIHsKIH0KIAotc3RhdGljIGludCBtb3VzZXZzY19wcm9iZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYpCitzdGF0aWMgc3RydWN0IGhpZF9sbF9kcml2ZXIgbW91c2V2c2NfbGxfZHJpdmVyID0geworCS5vcGVuID0gbW91c2V2c2NfaGlkX29wZW4sCisJLmNsb3NlID0gbW91c2V2c2NfaGlkX2Nsb3NlLAorfTsKKworc3RhdGljIHN0cnVjdCBoaWRfZHJpdmVyIG1vdXNldnNjX2hpZF9kcml2ZXI7CisKK3N0YXRpYyB2b2lkIHJlcG9ydGRlc2NfY2FsbGJhY2soc3RydWN0IGh2X2RldmljZSAqZGV2LCB2b2lkICpwYWNrZXQsIHUzMiBsZW4pCiB7Ci0JaW50IHJldCA9IDA7CisJc3RydWN0IGhpZF9kZXZpY2UgKmhpZF9kZXY7CisJc3RydWN0IG1vdXNldnNjX2RldiAqaW5wdXRfZGV2aWNlID0gaHZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCXN0cnVjdCBpbnB1dF9kZXZpY2VfY29udGV4dCAqaW5wdXRfZGV2X2N0eDsKKwloaWRfZGV2ID0gaGlkX2FsbG9jYXRlX2RldmljZSgpOworCWlmIChJU19FUlIoaGlkX2RldikpCisJCXJldHVybjsKIAotCWlucHV0X2Rldl9jdHggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaW5wdXRfZGV2aWNlX2NvbnRleHQpLAotCQkJCUdGUF9LRVJORUwpOworCWhpZF9kZXYtPmxsX2RyaXZlciA9ICZtb3VzZXZzY19sbF9kcml2ZXI7CisJaGlkX2Rldi0+ZHJpdmVyID0gJm1vdXNldnNjX2hpZF9kcml2ZXI7CiAKLQlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2aWNlLCBpbnB1dF9kZXZfY3R4KTsKKwlpZiAoaGlkX3BhcnNlX3JlcG9ydChoaWRfZGV2LCBwYWNrZXQsIGxlbikpCisJCXJldHVybjsKIAotCS8qIENhbGwgdG8gdGhlIHZzYyBkcml2ZXIgdG8gYWRkIHRoZSBkZXZpY2UgKi8KLQlyZXQgPSBtb3VzZXZzY19vbl9kZXZpY2VfYWRkKGRldiwgTlVMTCk7CisJaGlkX2Rldi0+YnVzID0gQlVTX1ZJUlRVQUw7CisJaGlkX2Rldi0+dmVuZG9yID0gaW5wdXRfZGV2aWNlLT5oaWRfZGV2X2luZm8udmVuZG9yOworCWhpZF9kZXYtPnByb2R1Y3QgPSBpbnB1dF9kZXZpY2UtPmhpZF9kZXZfaW5mby5wcm9kdWN0OworCWhpZF9kZXYtPnZlcnNpb24gPSBpbnB1dF9kZXZpY2UtPmhpZF9kZXZfaW5mby52ZXJzaW9uOwogCi0JaWYgKHJldCAhPSAwKSB7Ci0JCURQUklOVF9FUlIoSU5QVVRWU0NfRFJWLCAidW5hYmxlIHRvIGFkZCBpbnB1dCB2c2MgZGV2aWNlIik7CisJc3ByaW50ZihoaWRfZGV2LT5uYW1lLCAiJXMiLCAiTWljcm9zb2Z0IFZtYnVzIEhJRC1jb21wbGlhbnQgTW91c2UiKTsKIAotCQlyZXR1cm4gLTE7CisJaWYgKCFoaWRpbnB1dF9jb25uZWN0KGhpZF9kZXYsIDApKSB7CisJCWhpZF9kZXYtPmNsYWltZWQgfD0gSElEX0NMQUlNRURfSU5QVVQ7CisKKwkJaW5wdXRfZGV2aWNlLT5jb25uZWN0ZWQgPSAxOworCiAJfQogCi0JcmV0dXJuIDA7CisJaW5wdXRfZGV2aWNlLT5oaWRfZGV2aWNlID0gaGlkX2RldjsKIH0KIAotc3RhdGljIGludCBtb3VzZXZzY19yZW1vdmUoc3RydWN0IGh2X2RldmljZSAqZGV2KQorc3RhdGljIGludCBtb3VzZXZzY19vbl9kZXZpY2VfYWRkKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKIHsKIAlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgbW91c2V2c2NfZGV2ICppbnB1dF9kZXY7CiAKLQlzdHJ1Y3QgaW5wdXRfZGV2aWNlX2NvbnRleHQgKmlucHV0X2Rldl9jdHg7CisJaW5wdXRfZGV2ID0gYWxsb2NfaW5wdXRfZGV2aWNlKGRldmljZSk7CiAKLQlpbnB1dF9kZXZfY3R4ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlucHV0X2RldmljZV9jb250ZXh0KSwKLQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWlucHV0X2RldikKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2aWNlLCBpbnB1dF9kZXZfY3R4KTsKKwlpbnB1dF9kZXYtPmluaXRfY29tcGxldGUgPSBmYWxzZTsKIAotCWlmIChpbnB1dF9kZXZfY3R4LT5jb25uZWN0ZWQpIHsKLQkJaGlkaW5wdXRfZGlzY29ubmVjdChpbnB1dF9kZXZfY3R4LT5oaWRfZGV2aWNlKTsKLQkJaW5wdXRfZGV2X2N0eC0+Y29ubmVjdGVkID0gMDsKLQl9Ci0KLQkvKgotCSAqIENhbGwgdG8gdGhlIHZzYyBkcml2ZXIgdG8gbGV0IGl0IGtub3cgdGhhdCB0aGUgZGV2aWNlCi0JICogaXMgYmVpbmcgcmVtb3ZlZAotCSAqLwotCXJldCA9IG1vdXNldnNjX29uX2RldmljZV9yZW1vdmUoZGV2KTsKKwlyZXQgPSB2bWJ1c19vcGVuKGRldmljZS0+Y2hhbm5lbCwKKwkJSU5QVVRWU0NfU0VORF9SSU5HX0JVRkZFUl9TSVpFLAorCQlJTlBVVFZTQ19SRUNWX1JJTkdfQlVGRkVSX1NJWkUsCisJCU5VTEwsCisJCTAsCisJCW1vdXNldnNjX29uX2NoYW5uZWxfY2FsbGJhY2ssCisJCWRldmljZQorCQkpOwogCiAJaWYgKHJldCAhPSAwKSB7Ci0JCURQUklOVF9FUlIoSU5QVVRWU0NfRFJWLAotCQkJICAgInVuYWJsZSB0byByZW1vdmUgdnNjIGRldmljZSAocmV0ICVkKSIsIHJldCk7CisJCWZyZWVfaW5wdXRfZGV2aWNlKGlucHV0X2Rldik7CisJCXJldHVybiByZXQ7CiAJfQogCi0Ja2ZyZWUoaW5wdXRfZGV2X2N0eCk7CisKKwlyZXQgPSBtb3VzZXZzY19jb25uZWN0X3RvX3ZzcChkZXZpY2UpOworCisJaWYgKHJldCAhPSAwKSB7CisJCXZtYnVzX2Nsb3NlKGRldmljZS0+Y2hhbm5lbCk7CisJCWZyZWVfaW5wdXRfZGV2aWNlKGlucHV0X2Rldik7CisJCXJldHVybiByZXQ7CisJfQorCisKKwkvKiB3b3JrYXJvdW5kIFNBLTE2NyAqLworCWlmIChpbnB1dF9kZXYtPnJlcG9ydF9kZXNjWzE0XSA9PSAweDI1KQorCQlpbnB1dF9kZXYtPnJlcG9ydF9kZXNjWzE0XSA9IDB4Mjk7CisKKwlyZXBvcnRkZXNjX2NhbGxiYWNrKGRldmljZSwgaW5wdXRfZGV2LT5yZXBvcnRfZGVzYywKKwkJCSAgICBpbnB1dF9kZXYtPnJlcG9ydF9kZXNjX3NpemUpOworCisJaW5wdXRfZGV2LT5pbml0X2NvbXBsZXRlID0gdHJ1ZTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIHJlcG9ydGRlc2NfY2FsbGJhY2soc3RydWN0IGh2X2RldmljZSAqZGV2LCB2b2lkICpwYWNrZXQsIHUzMiBsZW4pCitzdGF0aWMgaW50IG1vdXNldnNjX3Byb2JlKHN0cnVjdCBodl9kZXZpY2UgKmRldiwKKwkJCWNvbnN0IHN0cnVjdCBodl92bWJ1c19kZXZpY2VfaWQgKmRldl9pZCkKIHsKLQlzdHJ1Y3QgaW5wdXRfZGV2aWNlX2NvbnRleHQgKmlucHV0X2RldmljZV9jdHggPQotCQlkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2aWNlKTsKLQlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkX2RldjsKIAotCS8qIGhpZF9kZWJ1ZyA9IC0xOyAqLwotCWhpZF9kZXYgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGlkX2RldmljZSksIEdGUF9LRVJORUwpOworCXJldHVybiBtb3VzZXZzY19vbl9kZXZpY2VfYWRkKGRldik7CiAKLQlpZiAoaGlkX3BhcnNlX3JlcG9ydChoaWRfZGV2LCBwYWNrZXQsIGxlbikpIHsKLQkJRFBSSU5UX0lORk8oSU5QVVRWU0NfRFJWLCAiVW5hYmxlIHRvIGNhbGwgaGRfcGFyc2VfcmVwb3J0Iik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoaGlkX2RldikgewotCQlEUFJJTlRfSU5GTyhJTlBVVFZTQ19EUlYsICJoaWRfZGV2aWNlIGNyZWF0ZWQiKTsKLQotCQloaWRfZGV2LT5sbF9kcml2ZXItPm9wZW4gID0gbW91c2V2c2NfaGlkX29wZW47Ci0JCWhpZF9kZXYtPmxsX2RyaXZlci0+Y2xvc2UgPSBtb3VzZXZzY19oaWRfY2xvc2U7Ci0KLQkJaGlkX2Rldi0+YnVzID0gQlVTX1ZJUlRVQUw7Ci0JCWhpZF9kZXYtPnZlbmRvciA9IGlucHV0X2RldmljZV9jdHgtPmRldmljZV9pbmZvLnZlbmRvcjsKLQkJaGlkX2Rldi0+cHJvZHVjdCA9IGlucHV0X2RldmljZV9jdHgtPmRldmljZV9pbmZvLnByb2R1Y3Q7Ci0JCWhpZF9kZXYtPnZlcnNpb24gPSBpbnB1dF9kZXZpY2VfY3R4LT5kZXZpY2VfaW5mby52ZXJzaW9uOwotCQloaWRfZGV2LT5kZXYgPSBkZXYtPmRldmljZTsKLQotCQlzcHJpbnRmKGhpZF9kZXYtPm5hbWUsICIlcyIsCi0JCQlpbnB1dF9kZXZpY2VfY3R4LT5kZXZpY2VfaW5mby5uYW1lKTsKLQotCQkvKgotCQkgKiBISiBEbyB3ZSB3YW50IHRvIGNhbGwgaXQgd2l0aCBhIDAKLQkJICovCi0JCWlmICghaGlkaW5wdXRfY29ubmVjdChoaWRfZGV2LCAwKSkgewotCQkJaGlkX2Rldi0+Y2xhaW1lZCB8PSBISURfQ0xBSU1FRF9JTlBVVDsKLQotCQkJaW5wdXRfZGV2aWNlX2N0eC0+Y29ubmVjdGVkID0gMTsKLQotCQkJRFBSSU5UX0lORk8oSU5QVVRWU0NfRFJWLAotCQkJCSAgICAgIkhJRCBkZXZpY2UgY2xhaW1lZCBieSBpbnB1dFxuIik7Ci0JCX0KLQotCQlpZiAoIWhpZF9kZXYtPmNsYWltZWQpIHsKLQkJCURQUklOVF9FUlIoSU5QVVRWU0NfRFJWLAotCQkJCSAgICAiSElEIGRldmljZSBub3QgY2xhaW1lZCBieSAiCi0JCQkJICAgICJpbnB1dCBvciBoaWRkZXZcbiIpOwotCQl9Ci0KLQkJaW5wdXRfZGV2aWNlX2N0eC0+aGlkX2RldmljZSA9IGhpZF9kZXY7Ci0JfQotCi0Ja2ZyZWUoaGlkX2Rldik7CiB9CiAKLQotc3RhdGljIHN0cnVjdCAgaHZfZHJpdmVyIG1vdXNldnNjX2RydiA9IHsKLQkucHJvYmUgPSBtb3VzZXZzY19wcm9iZSwKLQkucmVtb3ZlID0gbW91c2V2c2NfcmVtb3ZlLAotfTsKLQotc3RhdGljIHZvaWQgbW91c2V2c2NfZHJ2X2V4aXQodm9pZCkKK3N0YXRpYyBpbnQgbW91c2V2c2NfcmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKmRldikKIHsKLQl2bWJ1c19jaGlsZF9kcml2ZXJfdW5yZWdpc3RlcigmbW91c2V2c2NfZHJ2LmRyaXZlcik7Ci19CisJc3RydWN0IG1vdXNldnNjX2RldiAqaW5wdXRfZGV2ID0gaHZfZ2V0X2RydmRhdGEoZGV2KTsKIAotc3RhdGljIGludCBfX2luaXQgbW91c2V2c2NfaW5pdCh2b2lkKQotewotCXN0cnVjdCBodl9kcml2ZXIgKmRydiA9ICZtb3VzZXZzY19kcnY7CisJdm1idXNfY2xvc2UoZGV2LT5jaGFubmVsKTsKIAotCURQUklOVF9JTkZPKElOUFVUVlNDX0RSViwgIkh5cGVyLVYgTW91c2UgZHJpdmVyIGluaXRpYWxpemluZy4iKTsKKwlpZiAoaW5wdXRfZGV2LT5jb25uZWN0ZWQpIHsKKwkJaGlkaW5wdXRfZGlzY29ubmVjdChpbnB1dF9kZXYtPmhpZF9kZXZpY2UpOworCQlpbnB1dF9kZXYtPmNvbm5lY3RlZCA9IDA7CisJCWhpZF9kZXN0cm95X2RldmljZShpbnB1dF9kZXYtPmhpZF9kZXZpY2UpOworCX0KIAotCW1lbWNweSgmZHJ2LT5kZXZfdHlwZSwgJm1vdXNlX2d1aWQsCi0JICAgICAgIHNpemVvZihzdHJ1Y3QgaHZfZ3VpZCkpOwotCi0JZHJ2LT5kcml2ZXIubmFtZSA9IGRyaXZlcl9uYW1lOwotCi0JLyogVGhlIGRyaXZlciBiZWxvbmdzIHRvIHZtYnVzICovCi0Jdm1idXNfY2hpbGRfZHJpdmVyX3JlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CisJZnJlZV9pbnB1dF9kZXZpY2UoaW5wdXRfZGV2KTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgbW91c2V2c2NfZXhpdCh2b2lkKQorc3RhdGljIGNvbnN0IHN0cnVjdCBodl92bWJ1c19kZXZpY2VfaWQgaWRfdGFibGVbXSA9IHsKKwkvKiBNb3VzZSBndWlkICovCisJeyBWTUJVU19ERVZJQ0UoMHg5RSwgMHhCNiwgMHhBOCwgMHhDRiwgMHg0QSwgMHg1QiwgMHhjMCwgMHg0YywKKwkJICAgICAgIDB4QjksIDB4OEIsIDB4OEIsIDB4QTEsIDB4QTEsIDB4RjMsIDB4RjksIDB4NUEpIH0sCisJeyB9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh2bWJ1cywgaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0ICBodl9kcml2ZXIgbW91c2V2c2NfZHJ2ID0geworCS5uYW1lID0gIm1vdXNldnNjIiwKKwkuaWRfdGFibGUgPSBpZF90YWJsZSwKKwkucHJvYmUgPSBtb3VzZXZzY19wcm9iZSwKKwkucmVtb3ZlID0gbW91c2V2c2NfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbW91c2V2c2NfaW5pdCh2b2lkKQogewotCW1vdXNldnNjX2Rydl9leGl0KCk7CisJcmV0dXJuIHZtYnVzX2RyaXZlcl9yZWdpc3RlcigmbW91c2V2c2NfZHJ2KTsKIH0KIAotLyoKLSAqIFdlIGRvbid0IHdhbnQgdG8gYXV0b21hdGljYWxseSBsb2FkIHRoaXMgZHJpdmVyIGp1c3QgeWV0LCBpdCdzIHF1aXRlCi0gKiBicm9rZW4uICBJdCdzIHNhZmUgaWYgeW91IHdhbnQgdG8gbG9hZCBpdCB5b3Vyc2VsZiBtYW51YWxseSwgYnV0Ci0gKiBkb24ndCBpbmZsaWN0IGl0IG9uIHVuc3VzcGVjdGluZyB1c2VycywgdGhhdCdzIGp1c3QgbWVhbi4KLSAqLwotI2lmIDAKLQotLyoKLSAqIFdlIHVzZSBhIFBDSSB0YWJsZSB0byBkZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIGF1dG9sb2FkIHRoaXMgZHJpdmVyICBUaGlzIGlzCi0gKiBuZWVkZWQgYnkgZGlzdHJvIHRvb2xzIHRvIGRldGVybWluZSBpZiB0aGUgaHlwZXJ2IGRyaXZlcnMgc2hvdWxkIGJlCi0gKiBpbnN0YWxsZWQgYW5kL29yIGNvbmZpZ3VyZWQuICBXZSBkb24ndCBkbyBhbnl0aGluZyBlbHNlIHdpdGggdGhlIHRhYmxlLCBidXQKLSAqIGl0IG5lZWRzIHRvIGJlIHByZXNlbnQuCi0gKi8KLWNvbnN0IHN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBtaWNyb3NvZnRfaHZfcGNpX3RhYmxlW10gPSB7Ci0JeyBQQ0lfREVWSUNFKDB4MTQxNCwgMHg1MzUzKSB9LAkvKiBWR0EgY29tcGF0aWJsZSBjb250cm9sbGVyICovCi0JeyAwIH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbWljcm9zb2Z0X2h2X3BjaV90YWJsZSk7Ci0jZW5kaWYKK3N0YXRpYyB2b2lkIF9fZXhpdCBtb3VzZXZzY19leGl0KHZvaWQpCit7CisJdm1idXNfZHJpdmVyX3VucmVnaXN0ZXIoJm1vdXNldnNjX2Rydik7Cit9CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9WRVJTSU9OKEhWX0RSVl9WRVJTSU9OKTsKIG1vZHVsZV9pbml0KG1vdXNldnNjX2luaXQpOwogbW9kdWxlX2V4aXQobW91c2V2c2NfZXhpdCk7Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9oeXBlcnZfbmV0LmggYi9kcml2ZXJzL3N0YWdpbmcvaHYvaHlwZXJ2X25ldC5oCmluZGV4IDI3Zjk4N2IuLmFjMWVjODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9oeXBlcnZfbmV0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L2h5cGVydl9uZXQuaApAQCAtMjYsNyArMjYsNyBAQAogI2RlZmluZSBfSFlQRVJWX05FVF9ICiAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSAiaHlwZXJ2LmgiCisjaW5jbHVkZSA8bGludXgvaHlwZXJ2Lmg+CiAKIC8qIEZ3ZCBkZWNsYXJhdGlvbiAqLwogc3RydWN0IGh2X25ldHZzY19wYWNrZXQ7CkBAIC05Niw3ICs5Niw2IEBACiAJCQkJdW5zaWduZWQgaW50IHN0YXR1cyk7CiBpbnQgbmV0dnNjX3JlY3ZfY2FsbGJhY2soc3RydWN0IGh2X2RldmljZSAqZGV2aWNlX29iaiwKIAkJCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwYWNrZXQpOwotaW50IG5ldHZzY19pbml0aWFsaXplKHN0cnVjdCBodl9kcml2ZXIgKmRydik7CiBpbnQgcm5kaXNfZmlsdGVyX29wZW4oc3RydWN0IGh2X2RldmljZSAqZGV2KTsKIGludCBybmRpc19maWx0ZXJfY2xvc2Uoc3RydWN0IGh2X2RldmljZSAqZGV2KTsKIGludCBybmRpc19maWx0ZXJfZGV2aWNlX2FkZChzdHJ1Y3QgaHZfZGV2aWNlICpkZXYsCkBAIC0zNzAsOCArMzY5LDggQEAKIHN0cnVjdCBuZXR2c2NfZGV2aWNlIHsKIAlzdHJ1Y3QgaHZfZGV2aWNlICpkZXY7CiAKLQlhdG9taWNfdCByZWZjbnQ7CiAJYXRvbWljX3QgbnVtX291dHN0YW5kaW5nX3NlbmRzOworCWJvb2wgZGVzdHJveTsKIAkvKgogCSAqIExpc3Qgb2YgZnJlZSBwcmVhbGxvY2F0ZWQgaHZfbmV0dnNjX3BhY2tldCB0byByZXByZXNlbnQgcmVjZWl2ZQogCSAqIHBhY2tldApAQCAtMzkzLDYgKzM5Miw4IEBACiAJc3RydWN0IG52c3BfbWVzc2FnZSByZXZva2VfcGFja2V0OwogCS8qIHVuc2lnbmVkIGNoYXIgSHdNYWNBZGRyW0hXX01BQ0FERFJfTEVOXTsgKi8KIAorCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OworCiAJLyogSG9sZHMgcm5kaXMgZGV2aWNlIGluZm8gKi8KIAl2b2lkICpleHRlbnNpb247CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L2h5cGVydl9zdG9yYWdlLmggYi9kcml2ZXJzL3N0YWdpbmcvaHYvaHlwZXJ2X3N0b3JhZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAxZjlhMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvaHlwZXJ2X3N0b3JhZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKgotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgTWljcm9zb2Z0IENvcnBvcmF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlCi0gKiBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KLSAqCi0gKiBBdXRob3JzOgotICogICBIYWl5YW5nIFpoYW5nIDxoYWl5YW5nekBtaWNyb3NvZnQuY29tPgotICogICBIYW5rIEphbnNzZW4gIDxoamFuc3NlbkBtaWNyb3NvZnQuY29tPgotICogICBLLiBZLiBTcmluaXZhc2FuIDxreXNAbWljcm9zb2Z0LmNvbT4KLSAqCi0gKi8KLQotI2lmbmRlZiBfSFlQRVJWX1NUT1JBR0VfSAotI2RlZmluZSBfSFlQRVJWX1NUT1JBR0VfSAotCi0KLS8qIHZzdG9yYWdlLncgcmV2aXNpb24gbnVtYmVyLiAgVGhpcyBpcyB1c2VkIGluIHRoZSBjYXNlIG9mIGEgdmVyc2lvbiBtYXRjaCwgKi8KLS8qIHRvIGFsZXJ0IHRoZSB1c2VyIHRoYXQgc3RydWN0dXJlIHNpemVzIG1heSBiZSBtaXNtYXRjaGVkIGV2ZW4gdGhvdWdoIHRoZSAqLwotLyogcHJvdG9jb2wgdmVyc2lvbnMgbWF0Y2guICovCi0KLQotI2RlZmluZSBSRVZJU0lPTl9TVFJJTkcoUkVWSVNJT05fKSAjUkVWSVNJT05fCi0jZGVmaW5lIEZJTExfVk1TVE9SX1JFVklTSU9OKFJFU1VMVF9MVkFMVUVfKQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQljaGFyICpyZXZpc2lvbl9zdHJpbmcJCQkJCVwKLQkJCT0gUkVWSVNJT05fU1RSSU5HKCRSZXYgOiA2ICQpICsgNjsJCVwKLQkJUkVTVUxUX0xWQUxVRV8gPSAwOwkJCQkJXAotCQl3aGlsZSAoKnJldmlzaW9uX3N0cmluZyA+PSAnMCcJCQkJXAotCQkJJiYgKnJldmlzaW9uX3N0cmluZyA8PSAnOScpIHsJCQlcCi0JCQlSRVNVTFRfTFZBTFVFXyAqPSAxMDsJCQkJXAotCQkJUkVTVUxUX0xWQUxVRV8gKz0gKnJldmlzaW9uX3N0cmluZyAtICcwJzsJXAotCQkJcmV2aXNpb25fc3RyaW5nKys7CQkJCVwKLQkJfQkJCQkJCQlcCi0JfSB3aGlsZSAoMCkKLQotLyogTWFqb3IvbWlub3IgbWFjcm9zLiAgTWlub3IgdmVyc2lvbiBpcyBpbiBMU0IsIG1lYW5pbmcgdGhhdCBlYXJsaWVyIGZsYXQgKi8KLS8qIHZlcnNpb24gbnVtYmVycyB3aWxsIGJlIGludGVycHJldGVkIGFzICIwLngiIChpLmUuLCAxIGJlY29tZXMgMC4xKS4gKi8KLSNkZWZpbmUgVk1TVE9SX1BST1RPQ09MX01BSk9SKFZFUlNJT05fKQkJKCgoVkVSU0lPTl8pID4+IDgpICYgMHhmZikKLSNkZWZpbmUgVk1TVE9SX1BST1RPQ09MX01JTk9SKFZFUlNJT05fKQkJKCgoVkVSU0lPTl8pKSAgICAgICYgMHhmZikKLSNkZWZpbmUgVk1TVE9SX1BST1RPQ09MX1ZFUlNJT04oTUFKT1JfLCBNSU5PUl8pCSgoKChNQUpPUl8pICYgMHhmZikgPDwgOCkgfCBcCi0JCQkJCQkgKCgoTUlOT1JfKSAmIDB4ZmYpKSkKLSNkZWZpbmUgVk1TVE9SX0lOVkFMSURfUFJPVE9DT0xfVkVSU0lPTgkJKC0xKQotCi0vKiBWZXJzaW9uIGhpc3Rvcnk6ICovCi0vKiBWMSBCZXRhICAgICAgICAgICAgICAgICAgICAwLjEgKi8KLS8qIFYxIFJDIDwgMjAwOC8xLzMxICAgICAgICAgIDEuMCAqLwotLyogVjEgUkMgPiAyMDA4LzEvMzEgICAgICAgICAgMi4wICovCi0jZGVmaW5lIFZNU1RPUl9QUk9UT0NPTF9WRVJTSU9OX0NVUlJFTlQgVk1TVE9SX1BST1RPQ09MX1ZFUlNJT04oMiwgMCkKLQotCi0KLQotLyogIFRoaXMgd2lsbCBnZXQgcmVwbGFjZWQgd2l0aCB0aGUgbWF4IHRyYW5zZmVyIGxlbmd0aCB0aGF0IGlzIHBvc3NpYmxlIG9uICovCi0vKiAgdGhlIGhvc3QgYWRhcHRlci4gKi8KLS8qICBUaGUgbWF4IHRyYW5zZmVyIGxlbmd0aCB3aWxsIGJlIHB1Ymxpc2hlZCB3aGVuIHdlIG9mZmVyIGEgdm1idXMgY2hhbm5lbC4gKi8KLSNkZWZpbmUgTUFYX1RSQU5TRkVSX0xFTkdUSAkweDQwMDAwCi0jZGVmaW5lIERFRkFVTFRfUEFDS0VUX1NJWkUgKHNpemVvZihzdHJ1Y3Qgdm1kYXRhX2dwYV9kaXJlY3QpICsJXAotCQkJc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpICsJCVwKLQkJCXNpemVzaXplb2YodTY0KSAqIChNQVhfVFJBTlNGRVJfTEVOR1RIIC8gUEFHRV9TSVpFKSkpCi0KLQotLyogIFBhY2tldCBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB2aXJ0dWFsIHN0b3JhZ2UgcmVxdWVzdHMuICovCi1lbnVtIHZzdG9yX3BhY2tldF9vcGVyYXRpb24gewotCVZTVE9SX09QRVJBVElPTl9DT01QTEVURV9JTwkJPSAxLAotCVZTVE9SX09QRVJBVElPTl9SRU1PVkVfREVWSUNFCQk9IDIsCi0JVlNUT1JfT1BFUkFUSU9OX0VYRUNVVEVfU1JCCQk9IDMsCi0JVlNUT1JfT1BFUkFUSU9OX1JFU0VUX0xVTgkJPSA0LAotCVZTVE9SX09QRVJBVElPTl9SRVNFVF9BREFQVEVSCQk9IDUsCi0JVlNUT1JfT1BFUkFUSU9OX1JFU0VUX0JVUwkJPSA2LAotCVZTVE9SX09QRVJBVElPTl9CRUdJTl9JTklUSUFMSVpBVElPTgk9IDcsCi0JVlNUT1JfT1BFUkFUSU9OX0VORF9JTklUSUFMSVpBVElPTgk9IDgsCi0JVlNUT1JfT1BFUkFUSU9OX1FVRVJZX1BST1RPQ09MX1ZFUlNJT04JPSA5LAotCVZTVE9SX09QRVJBVElPTl9RVUVSWV9QUk9QRVJUSUVTCT0gMTAsCi0JVlNUT1JfT1BFUkFUSU9OX01BWElNVU0JCQk9IDEwCi19OwotCi0vKgotICogUGxhdGZvcm0gbmV1dHJhbCBkZXNjcmlwdGlvbiBvZiBhIHNjc2kgcmVxdWVzdCAtCi0gKiB0aGlzIHJlbWFpbnMgdGhlIHNhbWUgYWNyb3NzIHRoZSB3cml0ZSByZWdhcmRsZXNzIG9mIDMyLzY0IGJpdAotICogbm90ZTogaXQncyBwYXR0ZXJuZWQgb2ZmIHRoZSBTQ1NJX1BBU1NfVEhST1VHSCBzdHJ1Y3R1cmUKLSAqLwotI2RlZmluZSBDREIxNkdFTkVSSUNfTEVOR1RICQkJMHgxMAotCi0jaWZuZGVmIFNFTlNFX0JVRkZFUl9TSVpFCi0jZGVmaW5lIFNFTlNFX0JVRkZFUl9TSVpFCQkJMHgxMgotI2VuZGlmCi0KLSNkZWZpbmUgTUFYX0RBVEFfQlVGX0xFTl9XSVRIX1BBRERJTkcJCTB4MTQKLQotc3RydWN0IHZtc2NzaV9yZXF1ZXN0IHsKLQl1bnNpZ25lZCBzaG9ydCBsZW5ndGg7Ci0JdW5zaWduZWQgY2hhciBzcmJfc3RhdHVzOwotCXVuc2lnbmVkIGNoYXIgc2NzaV9zdGF0dXM7Ci0KLQl1bnNpZ25lZCBjaGFyIHBvcnRfbnVtYmVyOwotCXVuc2lnbmVkIGNoYXIgcGF0aF9pZDsKLQl1bnNpZ25lZCBjaGFyIHRhcmdldF9pZDsKLQl1bnNpZ25lZCBjaGFyIGx1bjsKLQotCXVuc2lnbmVkIGNoYXIgY2RiX2xlbmd0aDsKLQl1bnNpZ25lZCBjaGFyIHNlbnNlX2luZm9fbGVuZ3RoOwotCXVuc2lnbmVkIGNoYXIgZGF0YV9pbjsKLQl1bnNpZ25lZCBjaGFyIHJlc2VydmVkOwotCi0JdW5zaWduZWQgaW50IGRhdGFfdHJhbnNmZXJfbGVuZ3RoOwotCi0JdW5pb24gewotCQl1bnNpZ25lZCBjaGFyIGNkYltDREIxNkdFTkVSSUNfTEVOR1RIXTsKLQkJdW5zaWduZWQgY2hhciBzZW5zZV9kYXRhW1NFTlNFX0JVRkZFUl9TSVpFXTsKLQkJdW5zaWduZWQgY2hhciByZXNlcnZlZF9hcnJheVtNQVhfREFUQV9CVUZfTEVOX1dJVEhfUEFERElOR107Ci0JfTsKLX0gX19hdHRyaWJ1dGUoKHBhY2tlZCkpOwotCi0KLS8qCi0gKiBUaGlzIHN0cnVjdHVyZSBpcyBzZW50IGR1cmluZyB0aGUgaW50aWFsaXphdGlvbiBwaGFzZSB0byBnZXQgdGhlIGRpZmZlcmVudAotICogcHJvcGVydGllcyBvZiB0aGUgY2hhbm5lbC4KLSAqLwotc3RydWN0IHZtc3RvcmFnZV9jaGFubmVsX3Byb3BlcnRpZXMgewotCXVuc2lnbmVkIHNob3J0IHByb3RvY29sX3ZlcnNpb247Ci0JdW5zaWduZWQgY2hhciBwYXRoX2lkOwotCXVuc2lnbmVkIGNoYXIgdGFyZ2V0X2lkOwotCi0JLyogTm90ZTogcG9ydCBudW1iZXIgaXMgb25seSByZWFsbHkga25vd24gb24gdGhlIGNsaWVudCBzaWRlICovCi0JdW5zaWduZWQgaW50IHBvcnRfbnVtYmVyOwotCXVuc2lnbmVkIGludCBmbGFnczsKLQl1bnNpZ25lZCBpbnQgbWF4X3RyYW5zZmVyX2J5dGVzOwotCi0JLyogIFRoaXMgaWQgaXMgdW5pcXVlIGZvciBlYWNoIGNoYW5uZWwgYW5kIHdpbGwgY29ycmVzcG9uZCB3aXRoICovCi0JLyogIHZlbmRvciBzcGVjaWZpYyBkYXRhIGluIHRoZSBpbnF1aXJ5ZGF0YSAqLwotCXVuc2lnbmVkIGxvbmcgbG9uZyB1bmlxdWVfaWQ7Ci19IF9fcGFja2VkOwotCi0vKiAgVGhpcyBzdHJ1Y3R1cmUgaXMgc2VudCBkdXJpbmcgdGhlIHN0b3JhZ2UgcHJvdG9jb2wgbmVnb3RpYXRpb25zLiAqLwotc3RydWN0IHZtc3RvcmFnZV9wcm90b2NvbF92ZXJzaW9uIHsKLQkvKiBNYWpvciAoTVNXKSBhbmQgbWlub3IgKExTVykgdmVyc2lvbiBudW1iZXJzLiAqLwotCXVuc2lnbmVkIHNob3J0IG1ham9yX21pbm9yOwotCi0JLyoKLQkgKiBSZXZpc2lvbiBudW1iZXIgaXMgYXV0by1pbmNyZW1lbnRlZCB3aGVuZXZlciB0aGlzIGZpbGUgaXMgY2hhbmdlZAotCSAqIChTZWUgRklMTF9WTVNUT1JfUkVWSVNJT04gbWFjcm8gYWJvdmUpLiAgTWlzbWF0Y2ggZG9lcyBub3QKLQkgKiBkZWZpbml0ZWx5IGluZGljYXRlIGluY29tcGF0aWJpbGl0eS0tYnV0IGl0IGRvZXMgaW5kaWNhdGUgbWlzbWF0Y2hlZAotCSAqIGJ1aWxkcy4KLQkgKi8KLQl1bnNpZ25lZCBzaG9ydCByZXZpc2lvbjsKLX0gX19wYWNrZWQ7Ci0KLS8qIENoYW5uZWwgUHJvcGVydHkgRmxhZ3MgKi8KLSNkZWZpbmUgU1RPUkFHRV9DSEFOTkVMX1JFTU9WQUJMRV9GTEFHCQkweDEKLSNkZWZpbmUgU1RPUkFHRV9DSEFOTkVMX0VNVUxBVEVEX0lERV9GTEFHCTB4MgotCi1zdHJ1Y3QgdnN0b3JfcGFja2V0IHsKLQkvKiBSZXF1ZXN0ZWQgb3BlcmF0aW9uIHR5cGUgKi8KLQllbnVtIHZzdG9yX3BhY2tldF9vcGVyYXRpb24gb3BlcmF0aW9uOwotCi0JLyogIEZsYWdzIC0gc2VlIGJlbG93IGZvciB2YWx1ZXMgKi8KLQl1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0KLQkvKiBTdGF0dXMgb2YgdGhlIHJlcXVlc3QgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyIHNpZGUuICovCi0JdW5zaWduZWQgaW50IHN0YXR1czsKLQotCS8qIERhdGEgcGF5bG9hZCBhcmVhICovCi0JdW5pb24gewotCQkvKgotCQkgKiBTdHJ1Y3R1cmUgdXNlZCB0byBmb3J3YXJkIFNDU0kgY29tbWFuZHMgZnJvbSB0aGUKLQkJICogY2xpZW50IHRvIHRoZSBzZXJ2ZXIuCi0JCSAqLwotCQlzdHJ1Y3Qgdm1zY3NpX3JlcXVlc3Qgdm1fc3JiOwotCi0JCS8qIFN0cnVjdHVyZSB1c2VkIHRvIHF1ZXJ5IGNoYW5uZWwgcHJvcGVydGllcy4gKi8KLQkJc3RydWN0IHZtc3RvcmFnZV9jaGFubmVsX3Byb3BlcnRpZXMgc3RvcmFnZV9jaGFubmVsX3Byb3BlcnRpZXM7Ci0KLQkJLyogVXNlZCBkdXJpbmcgdmVyc2lvbiBuZWdvdGlhdGlvbnMuICovCi0JCXN0cnVjdCB2bXN0b3JhZ2VfcHJvdG9jb2xfdmVyc2lvbiB2ZXJzaW9uOwotCX07Ci19IF9fcGFja2VkOwotCi0vKiBQYWNrZXQgZmxhZ3MgKi8KLS8qCi0gKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIHNlcnZlciBzaG91bGQgc2VuZCBiYWNrIGEgY29tcGxldGlvbiBmb3IgdGhpcwotICogcGFja2V0LgotICovCi0jZGVmaW5lIFJFUVVFU1RfQ09NUExFVElPTl9GTEFHCTB4MQotCi0vKiAgVGhpcyBpcyB0aGUgc2V0IG9mIGZsYWdzIHRoYXQgdGhlIHZzYyBjYW4gc2V0IGluIGFueSBwYWNrZXRzIGl0IHNlbmRzICovCi0jZGVmaW5lIFZTQ19MRUdBTF9GTEFHUwkJKFJFUVVFU1RfQ09NUExFVElPTl9GTEFHKQotCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSAiaHlwZXJ2X3N0b3JhZ2UuaCIKLSNpbmNsdWRlICJoeXBlcnYuaCIKLQotLyogRGVmaW5lcyAqLwotI2RlZmluZSBTVE9SVlNDX1JJTkdfQlVGRkVSX1NJWkUJCQkoMjAqUEFHRV9TSVpFKQotI2RlZmluZSBCTEtWU0NfUklOR19CVUZGRVJfU0laRQkJCQkoMjAqUEFHRV9TSVpFKQotCi0jZGVmaW5lIFNUT1JWU0NfTUFYX0lPX1JFUVVFU1RTCQkJCTEyOAotCi0vKgotICogSW4gSHlwZXItViwgZWFjaCBwb3J0L3BhdGgvdGFyZ2V0IG1hcHMgdG8gMSBzY3NpIGhvc3QgYWRhcHRlci4gIEluCi0gKiByZWFsaXR5LCB0aGUgcGF0aC90YXJnZXQgaXMgbm90IHVzZWQgKGllIGFsd2F5cyBzZXQgdG8gMCkgc28gb3VyCi0gKiBzY3NpIGhvc3QgYWRhcHRlciBlc3NlbnRpYWxseSBoYXMgMSBidXMgd2l0aCAxIHRhcmdldCB0aGF0IGNvbnRhaW5zCi0gKiB1cCB0byAyNTYgbHVucy4KLSAqLwotI2RlZmluZSBTVE9SVlNDX01BWF9MVU5TX1BFUl9UQVJHRVQJCQk2NAotI2RlZmluZSBTVE9SVlNDX01BWF9UQVJHRVRTCQkJCTEKLSNkZWZpbmUgU1RPUlZTQ19NQVhfQ0hBTk5FTFMJCQkJMQotCi1zdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0OwotCi0vKiBNYXRjaGVzIFdpbmRvd3MtZW5kICovCi1lbnVtIHN0b3J2c2NfcmVxdWVzdF90eXBlIHsKLQlXUklURV9UWVBFLAotCVJFQURfVFlQRSwKLQlVTktOT1dOX1RZUEUsCi19OwotCi0KLXN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgewotCXN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgKnJlcXVlc3Q7Ci0Jc3RydWN0IGh2X2RldmljZSAqZGV2aWNlOwotCi0JLyogU3luY2hyb25pemUgdGhlIHJlcXVlc3QvcmVzcG9uc2UgaWYgbmVlZGVkICovCi0Jc3RydWN0IGNvbXBsZXRpb24gd2FpdF9ldmVudDsKLQotCXVuc2lnbmVkIGNoYXIgKnNlbnNlX2J1ZmZlcjsKLQl2b2lkICpjb250ZXh0OwotCXZvaWQgKCpvbl9pb19jb21wbGV0aW9uKShzdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0ICpyZXF1ZXN0KTsKLQlzdHJ1Y3QgaHZfbXVsdGlwYWdlX2J1ZmZlciBkYXRhX2J1ZmZlcjsKLQotCXN0cnVjdCB2c3Rvcl9wYWNrZXQgdnN0b3JfcGFja2V0OwotfTsKLQotCi1zdHJ1Y3Qgc3RvcnZzY19kZXZpY2VfaW5mbyB7Ci0JdTMyIHJpbmdfYnVmZmVyX3NpemU7Ci0JdW5zaWduZWQgaW50IHBvcnRfbnVtYmVyOwotCXVuc2lnbmVkIGNoYXIgcGF0aF9pZDsKLQl1bnNpZ25lZCBjaGFyIHRhcmdldF9pZDsKLX07Ci0KLXN0cnVjdCBzdG9ydnNjX21ham9yX2luZm8gewotCWludCBtYWpvcjsKLQlpbnQgaW5kZXg7Ci0JYm9vbCBkb19yZWdpc3RlcjsKLQljaGFyICpkZXZuYW1lOwotCWNoYXIgKmRpc2tuYW1lOwotfTsKLQotLyogQSBzdG9ydnNjIGRldmljZSBpcyBhIGRldmljZSBvYmplY3QgdGhhdCBjb250YWlucyBhIHZtYnVzIGNoYW5uZWwgKi8KLXN0cnVjdCBzdG9ydnNjX2RldmljZSB7Ci0Jc3RydWN0IGh2X2RldmljZSAqZGV2aWNlOwotCi0JLyogMCBpbmRpY2F0ZXMgdGhlIGRldmljZSBpcyBiZWluZyBkZXN0cm95ZWQgKi8KLQlhdG9taWNfdCByZWZfY291bnQ7Ci0KLQlib29sCSBkcmFpbl9ub3RpZnk7Ci0JYXRvbWljX3QgbnVtX291dHN0YW5kaW5nX3JlcTsKLQotCXdhaXRfcXVldWVfaGVhZF90IHdhaXRpbmdfdG9fZHJhaW47Ci0KLQkvKgotCSAqIEVhY2ggdW5pcXVlIFBvcnQvUGF0aC9UYXJnZXQgcmVwcmVzZW50cyAxIGNoYW5uZWwgaWUgc2NzaQotCSAqIGNvbnRyb2xsZXIuIEluIHJlYWxpdHksIHRoZSBwYXRoaWQsIHRhcmdldGlkIGlzIGFsd2F5cyAwCi0JICogYW5kIHRoZSBwb3J0IGlzIHNldCBieSB1cwotCSAqLwotCXVuc2lnbmVkIGludCBwb3J0X251bWJlcjsKLQl1bnNpZ25lZCBjaGFyIHBhdGhfaWQ7Ci0JdW5zaWduZWQgY2hhciB0YXJnZXRfaWQ7Ci0KLQkvKiBVc2VkIGZvciB2c2MvdnNwIGNoYW5uZWwgcmVzZXQgcHJvY2VzcyAqLwotCXN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgaW5pdF9yZXF1ZXN0OwotCXN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgcmVzZXRfcmVxdWVzdDsKLX07Ci0KLQotLyogR2V0IHRoZSBzdG9yZGV2aWNlIG9iamVjdCBpZmYgZXhpc3RzIGFuZCBpdHMgcmVmY291bnQgPiAxICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzdG9ydnNjX2RldmljZSAqZ2V0X3N0b3JfZGV2aWNlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKLXsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JfZGV2aWNlOwotCi0Jc3Rvcl9kZXZpY2UgPSAoc3RydWN0IHN0b3J2c2NfZGV2aWNlICopZGV2aWNlLT5leHQ7Ci0JaWYgKHN0b3JfZGV2aWNlICYmIGF0b21pY19yZWFkKCZzdG9yX2RldmljZS0+cmVmX2NvdW50KSA+IDEpCi0JCWF0b21pY19pbmMoJnN0b3JfZGV2aWNlLT5yZWZfY291bnQpOwotCWVsc2UKLQkJc3Rvcl9kZXZpY2UgPSBOVUxMOwotCi0JcmV0dXJuIHN0b3JfZGV2aWNlOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfc3Rvcl9kZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQotewotCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7Ci0KLQlzdG9yX2RldmljZSA9IChzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKilkZXZpY2UtPmV4dDsKLQotCWF0b21pY19kZWMoJnN0b3JfZGV2aWNlLT5yZWZfY291bnQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3RvcnZzY193YWl0X3RvX2RyYWluKHN0cnVjdCBzdG9ydnNjX2RldmljZSAqZGV2KQotewotCWRldi0+ZHJhaW5fbm90aWZ5ID0gdHJ1ZTsKLQl3YWl0X2V2ZW50KGRldi0+d2FpdGluZ190b19kcmFpbiwKLQkJICAgYXRvbWljX3JlYWQoJmRldi0+bnVtX291dHN0YW5kaW5nX3JlcSkgPT0gMCk7Ci0JZGV2LT5kcmFpbl9ub3RpZnkgPSBmYWxzZTsKLX0KLQotLyogSW50ZXJmYWNlICovCi0KLWludCBzdG9ydnNjX2Rldl9hZGQoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAotCQkJCXZvaWQgKmFkZGl0aW9uYWxfaW5mbyk7Ci1pbnQgc3RvcnZzY19kZXZfcmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSk7Ci0KLWludCBzdG9ydnNjX2RvX2lvKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKLQkJCQlzdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0ICpyZXF1ZXN0KTsKLQotaW50IHN0b3J2c2NfZ2V0X21ham9yX2luZm8oc3RydWN0IHN0b3J2c2NfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvLAotCQkJCXN0cnVjdCBzdG9ydnNjX21ham9yX2luZm8gKm1ham9yX2luZm8pOwotCi0jZW5kaWYgLyogX0hZUEVSVl9TVE9SQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2MuYwppbmRleCBkYzVlNWM0Li5iOTAyNTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvbmV0dnNjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L25ldHZzYy5jCkBAIC0yNywxMjIgKzI3LDYzIEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KIAotI2luY2x1ZGUgImh5cGVydi5oIgogI2luY2x1ZGUgImh5cGVydl9uZXQuaCIKIAogCi0vKiBHbG9iYWxzICovCi1zdGF0aWMgY29uc3QgY2hhciAqZHJpdmVyX25hbWUgPSAibmV0dnNjIjsKLQotLyoge0Y4NjE1MTYzLURGM0UtNDZjNS05MTNGLUYyRDJGOTY1RUQwRX0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaHZfZ3VpZCBuZXR2c2NfZGV2aWNlX3R5cGUgPSB7Ci0JLmRhdGEgPSB7Ci0JCTB4NjMsIDB4NTEsIDB4NjEsIDB4RjgsIDB4M0UsIDB4REYsIDB4YzUsIDB4NDYsCi0JCTB4OTEsIDB4M0YsIDB4RjIsIDB4RDIsIDB4RjksIDB4NjUsIDB4RUQsIDB4MEUKLQl9Ci19OwotCi0KIHN0YXRpYyBzdHJ1Y3QgbmV0dnNjX2RldmljZSAqYWxsb2NfbmV0X2RldmljZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBodl9nZXRfZHJ2ZGF0YShkZXZpY2UpOwogCiAJbmV0X2RldmljZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXR2c2NfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuZXRfZGV2aWNlKQogCQlyZXR1cm4gTlVMTDsKIAotCS8qIFNldCB0byAyIHRvIGFsbG93IGJvdGggaW5ib3VuZCBhbmQgb3V0Ym91bmQgdHJhZmZpYyAqLwotCWF0b21pY19jbXB4Y2hnKCZuZXRfZGV2aWNlLT5yZWZjbnQsIDAsIDIpOwogCisJbmV0X2RldmljZS0+ZGVzdHJveSA9IGZhbHNlOwogCW5ldF9kZXZpY2UtPmRldiA9IGRldmljZTsKLQlkZXZpY2UtPmV4dCA9IG5ldF9kZXZpY2U7CisJbmV0X2RldmljZS0+bmRldiA9IG5kZXY7CiAKKwlodl9zZXRfZHJ2ZGF0YShkZXZpY2UsIG5ldF9kZXZpY2UpOwogCXJldHVybiBuZXRfZGV2aWNlOwogfQogCi1zdGF0aWMgdm9pZCBmcmVlX25ldF9kZXZpY2Uoc3RydWN0IG5ldHZzY19kZXZpY2UgKmRldmljZSkKLXsKLQlXQVJOX09OKGF0b21pY19yZWFkKCZkZXZpY2UtPnJlZmNudCkgIT0gMCk7Ci0JZGV2aWNlLT5kZXYtPmV4dCA9IE5VTEw7Ci0Ja2ZyZWUoZGV2aWNlKTsKLX0KLQotCi0vKiBHZXQgdGhlIG5ldCBkZXZpY2Ugb2JqZWN0IGlmZiBleGlzdHMgYW5kIGl0cyByZWZjb3VudCA+IDEgKi8KIHN0YXRpYyBzdHJ1Y3QgbmV0dnNjX2RldmljZSAqZ2V0X291dGJvdW5kX25ldF9kZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOwogCi0JbmV0X2RldmljZSA9IGRldmljZS0+ZXh0OwotCWlmIChuZXRfZGV2aWNlICYmIGF0b21pY19yZWFkKCZuZXRfZGV2aWNlLT5yZWZjbnQpID4gMSkKLQkJYXRvbWljX2luYygmbmV0X2RldmljZS0+cmVmY250KTsKLQllbHNlCisJbmV0X2RldmljZSA9IGh2X2dldF9kcnZkYXRhKGRldmljZSk7CisJaWYgKG5ldF9kZXZpY2UgJiYgbmV0X2RldmljZS0+ZGVzdHJveSkKIAkJbmV0X2RldmljZSA9IE5VTEw7CiAKIAlyZXR1cm4gbmV0X2RldmljZTsKIH0KIAotLyogR2V0IHRoZSBuZXQgZGV2aWNlIG9iamVjdCBpZmYgZXhpc3RzIGFuZCBpdHMgcmVmY291bnQgPiAwICovCiBzdGF0aWMgc3RydWN0IG5ldHZzY19kZXZpY2UgKmdldF9pbmJvdW5kX25ldF9kZXZpY2Uoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQogewogCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOwogCi0JbmV0X2RldmljZSA9IGRldmljZS0+ZXh0OwotCWlmIChuZXRfZGV2aWNlICYmIGF0b21pY19yZWFkKCZuZXRfZGV2aWNlLT5yZWZjbnQpKQotCQlhdG9taWNfaW5jKCZuZXRfZGV2aWNlLT5yZWZjbnQpOwotCWVsc2UKKwluZXRfZGV2aWNlID0gaHZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKKworCWlmICghbmV0X2RldmljZSkKKwkJZ290byBnZXRfaW5fZXJyOworCisJaWYgKG5ldF9kZXZpY2UtPmRlc3Ryb3kgJiYKKwkJYXRvbWljX3JlYWQoJm5ldF9kZXZpY2UtPm51bV9vdXRzdGFuZGluZ19zZW5kcykgPT0gMCkKIAkJbmV0X2RldmljZSA9IE5VTEw7CiAKK2dldF9pbl9lcnI6CiAJcmV0dXJuIG5ldF9kZXZpY2U7CiB9CiAKLXN0YXRpYyB2b2lkIHB1dF9uZXRfZGV2aWNlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKLXsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKLQotCW5ldF9kZXZpY2UgPSBkZXZpY2UtPmV4dDsKLQotCWF0b21pY19kZWMoJm5ldF9kZXZpY2UtPnJlZmNudCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgbmV0dnNjX2RldmljZSAqcmVsZWFzZV9vdXRib3VuZF9uZXRfZGV2aWNlKAotCQlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCi17Ci0Jc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7Ci0KLQluZXRfZGV2aWNlID0gZGV2aWNlLT5leHQ7Ci0JaWYgKG5ldF9kZXZpY2UgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkvKiBCdXN5IHdhaXQgdW50aWwgdGhlIHJlZiBkcm9wIHRvIDIsIHRoZW4gc2V0IGl0IHRvIDEgKi8KLQl3aGlsZSAoYXRvbWljX2NtcHhjaGcoJm5ldF9kZXZpY2UtPnJlZmNudCwgMiwgMSkgIT0gMikKLQkJdWRlbGF5KDEwMCk7Ci0KLQlyZXR1cm4gbmV0X2RldmljZTsKLX0KLQotc3RhdGljIHN0cnVjdCBuZXR2c2NfZGV2aWNlICpyZWxlYXNlX2luYm91bmRfbmV0X2RldmljZSgKLQkJc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQotewotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOwotCi0JbmV0X2RldmljZSA9IGRldmljZS0+ZXh0OwotCWlmIChuZXRfZGV2aWNlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JLyogQnVzeSB3YWl0IHVudGlsIHRoZSByZWYgZHJvcCB0byAxLCB0aGVuIHNldCBpdCB0byAwICovCi0Jd2hpbGUgKGF0b21pY19jbXB4Y2hnKCZuZXRfZGV2aWNlLT5yZWZjbnQsIDEsIDApICE9IDEpCi0JCXVkZWxheSgxMDApOwotCi0JZGV2aWNlLT5leHQgPSBOVUxMOwotCXJldHVybiBuZXRfZGV2aWNlOwotfQogCiBzdGF0aWMgaW50IG5ldHZzY19kZXN0cm95X3JlY3ZfYnVmKHN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlKQogewogCXN0cnVjdCBudnNwX21lc3NhZ2UgKnJldm9rZV9wYWNrZXQ7CiAJaW50IHJldCA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBuZXRfZGV2aWNlLT5uZGV2OwogCiAJLyoKIAkgKiBJZiB3ZSBnb3QgYSBzZWN0aW9uIGNvdW50LCBpdCBtZWFucyB3ZSByZWNlaXZlZCBhCkBAIC0xNzAsOSArMTExLDkgQEAKIAkJICogaGF2ZSBhIGxlYWsgcmF0aGVyIHRoYW4gY29udGludWUgYW5kIGEgYnVnY2hrCiAJCSAqLwogCQlpZiAocmV0ICE9IDApIHsKLQkJCWRldl9lcnIoJm5ldF9kZXZpY2UtPmRldi0+ZGV2aWNlLCAidW5hYmxlIHRvIHNlbmQgIgotCQkJCSJyZXZva2UgcmVjZWl2ZSBidWZmZXIgdG8gbmV0dnNwIik7Ci0JCQlyZXR1cm4gLTE7CisJCQluZXRkZXZfZXJyKG5kZXYsICJ1bmFibGUgdG8gc2VuZCAiCisJCQkJInJldm9rZSByZWNlaXZlIGJ1ZmZlciB0byBuZXR2c3BcbiIpOworCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KIApAQCAtMTg1LDkgKzEyNiw5IEBACiAJCSAqIHJhdGhlciB0aGFuIGNvbnRpbnVlIGFuZCBhIGJ1Z2NoawogCQkgKi8KIAkJaWYgKHJldCAhPSAwKSB7Ci0JCQlkZXZfZXJyKCZuZXRfZGV2aWNlLT5kZXYtPmRldmljZSwKLQkJCQkgICAidW5hYmxlIHRvIHRlYXJkb3duIHJlY2VpdmUgYnVmZmVyJ3MgZ3BhZGwiKTsKLQkJCXJldHVybiAtMTsKKwkJCW5ldGRldl9lcnIobmRldiwKKwkJCQkgICAidW5hYmxlIHRvIHRlYXJkb3duIHJlY2VpdmUgYnVmZmVyJ3MgZ3BhZGxcbiIpOworCQkJcmV0dXJuIHJldDsKIAkJfQogCQluZXRfZGV2aWNlLT5yZWN2X2J1Zl9ncGFkbF9oYW5kbGUgPSAwOwogCX0KQEAgLTIxNCwyMSArMTU1LDIwIEBACiAJaW50IHQ7CiAJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CiAJc3RydWN0IG52c3BfbWVzc2FnZSAqaW5pdF9wYWNrZXQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CiAKIAluZXRfZGV2aWNlID0gZ2V0X291dGJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKLQlpZiAoIW5ldF9kZXZpY2UpIHsKLQkJZGV2X2VycigmZGV2aWNlLT5kZXZpY2UsICJ1bmFibGUgdG8gZ2V0IG5ldCBkZXZpY2UuLi4iCi0JCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKLQkJcmV0dXJuIC0xOwotCX0KKwlpZiAoIW5ldF9kZXZpY2UpCisJCXJldHVybiAtRU5PREVWOworCW5kZXYgPSBuZXRfZGV2aWNlLT5uZGV2OwogCiAJbmV0X2RldmljZS0+cmVjdl9idWYgPQogCQkodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTHxfX0dGUF9aRVJPLAogCQkJCWdldF9vcmRlcihuZXRfZGV2aWNlLT5yZWN2X2J1Zl9zaXplKSk7CiAJaWYgKCFuZXRfZGV2aWNlLT5yZWN2X2J1ZikgewotCQlkZXZfZXJyKCZkZXZpY2UtPmRldmljZSwgInVuYWJsZSB0byBhbGxvY2F0ZSByZWNlaXZlICIKLQkJCSJidWZmZXIgb2Ygc2l6ZSAlZCIsIG5ldF9kZXZpY2UtPnJlY3ZfYnVmX3NpemUpOwotCQlyZXQgPSAtMTsKKwkJbmV0ZGV2X2VycihuZGV2LCAidW5hYmxlIHRvIGFsbG9jYXRlIHJlY2VpdmUgIgorCQkJImJ1ZmZlciBvZiBzaXplICVkXG4iLCBuZXRfZGV2aWNlLT5yZWN2X2J1Zl9zaXplKTsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBjbGVhbnVwOwogCX0KIApAQCAtMjQxLDggKzE4MSw4IEBACiAJCQkJICAgIG5ldF9kZXZpY2UtPnJlY3ZfYnVmX3NpemUsCiAJCQkJICAgICZuZXRfZGV2aWNlLT5yZWN2X2J1Zl9ncGFkbF9oYW5kbGUpOwogCWlmIChyZXQgIT0gMCkgewotCQlkZXZfZXJyKCZkZXZpY2UtPmRldmljZSwKLQkJCSJ1bmFibGUgdG8gZXN0YWJsaXNoIHJlY2VpdmUgYnVmZmVyJ3MgZ3BhZGwiKTsKKwkJbmV0ZGV2X2VycihuZGV2LAorCQkJInVuYWJsZSB0byBlc3RhYmxpc2ggcmVjZWl2ZSBidWZmZXIncyBncGFkbFxuIik7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKQEAgLTI2NSw4ICsyMDUsOCBAQAogCQkJICAgICAgIFZNX1BLVF9EQVRBX0lOQkFORCwKIAkJCSAgICAgICBWTUJVU19EQVRBX1BBQ0tFVF9GTEFHX0NPTVBMRVRJT05fUkVRVUVTVEVEKTsKIAlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2VycigmZGV2aWNlLT5kZXZpY2UsCi0JCQkidW5hYmxlIHRvIHNlbmQgcmVjZWl2ZSBidWZmZXIncyBncGFkbCB0byBuZXR2c3AiKTsKKwkJbmV0ZGV2X2VycihuZGV2LAorCQkJInVuYWJsZSB0byBzZW5kIHJlY2VpdmUgYnVmZmVyJ3MgZ3BhZGwgdG8gbmV0dnNwXG4iKTsKIAkJZ290byBjbGVhbnVwOwogCX0KIApAQCAtMjc3LDExICsyMTcsMTEgQEAKIAkvKiBDaGVjayB0aGUgcmVzcG9uc2UgKi8KIAlpZiAoaW5pdF9wYWNrZXQtPm1zZy52MV9tc2cuCiAJICAgIHNlbmRfcmVjdl9idWZfY29tcGxldGUuc3RhdHVzICE9IE5WU1BfU1RBVF9TVUNDRVNTKSB7Ci0JCWRldl9lcnIoJmRldmljZS0+ZGV2aWNlLCAiVW5hYmxlIHRvIGNvbXBsZXRlIHJlY2VpdmUgYnVmZmVyICIKLQkJCSAgICJpbml0aWFsemF0aW9uIHdpdGggTmV0VnNwIC0gc3RhdHVzICVkIiwKKwkJbmV0ZGV2X2VycihuZGV2LCAiVW5hYmxlIHRvIGNvbXBsZXRlIHJlY2VpdmUgYnVmZmVyICIKKwkJCSAgICJpbml0aWFsaXphdGlvbiB3aXRoIE5ldFZzcCAtIHN0YXR1cyAlZFxuIiwKIAkJCSAgIGluaXRfcGFja2V0LT5tc2cudjFfbXNnLgogCQkJICAgc2VuZF9yZWN2X2J1Zl9jb21wbGV0ZS5zdGF0dXMpOwotCQlyZXQgPSAtMTsKKwkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBjbGVhbnVwOwogCX0KIApAQCAtMjkzLDcgKzIzMyw3IEBACiAJbmV0X2RldmljZS0+cmVjdl9zZWN0aW9uID0ga21hbGxvYyhuZXRfZGV2aWNlLT5yZWN2X3NlY3Rpb25fY250CiAJCSogc2l6ZW9mKHN0cnVjdCBudnNwXzFfcmVjZWl2ZV9idWZmZXJfc2VjdGlvbiksIEdGUF9LRVJORUwpOwogCWlmIChuZXRfZGV2aWNlLT5yZWN2X3NlY3Rpb24gPT0gTlVMTCkgewotCQlyZXQgPSAtMTsKKwkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBjbGVhbnVwOwogCX0KIApAQCAtMzA5LDcgKzI0OSw3IEBACiAJICovCiAJaWYgKG5ldF9kZXZpY2UtPnJlY3Zfc2VjdGlvbl9jbnQgIT0gMSB8fAogCSAgICBuZXRfZGV2aWNlLT5yZWN2X3NlY3Rpb24tPm9mZnNldCAhPSAwKSB7Ci0JCXJldCA9IC0xOworCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCkBAIC0zMTksNyArMjU5LDYgQEAKIAluZXR2c2NfZGVzdHJveV9yZWN2X2J1ZihuZXRfZGV2aWNlKTsKIAogZXhpdDoKLQlwdXRfbmV0X2RldmljZShkZXZpY2UpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTMzMCwxMyArMjY5LDEyIEBACiAJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CiAJc3RydWN0IG52c3BfbWVzc2FnZSAqaW5pdF9wYWNrZXQ7CiAJaW50IG5kaXNfdmVyc2lvbjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAogCW5ldF9kZXZpY2UgPSBnZXRfb3V0Ym91bmRfbmV0X2RldmljZShkZXZpY2UpOwotCWlmICghbmV0X2RldmljZSkgewotCQlkZXZfZXJyKCZkZXZpY2UtPmRldmljZSwgInVuYWJsZSB0byBnZXQgbmV0IGRldmljZS4uLiIKLQkJCSAgICJkZXZpY2UgYmVpbmcgZGVzdHJveWVkPyIpOwotCQlyZXR1cm4gLTE7Ci0JfQorCWlmICghbmV0X2RldmljZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJbmRldiA9IG5ldF9kZXZpY2UtPm5kZXY7CiAKIAlpbml0X3BhY2tldCA9ICZuZXRfZGV2aWNlLT5jaGFubmVsX2luaXRfcGt0OwogCkBAIC0zNjYsMTMgKzMwNCwxMyBAQAogCiAJaWYgKGluaXRfcGFja2V0LT5tc2cuaW5pdF9tc2cuaW5pdF9jb21wbGV0ZS5zdGF0dXMgIT0KIAkgICAgTlZTUF9TVEFUX1NVQ0NFU1MpIHsKLQkJcmV0ID0gLTE7CisJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAlpZiAoaW5pdF9wYWNrZXQtPm1zZy5pbml0X21zZy5pbml0X2NvbXBsZXRlLgogCSAgICBuZWdvdGlhdGVkX3Byb3RvY29sX3ZlciAhPSBOVlNQX1BST1RPQ09MX1ZFUlNJT05fMSkgewotCQlyZXQgPSAtMTsKKwkJcmV0ID0gLUVQUk9UTzsKIAkJZ290byBjbGVhbnVwOwogCX0KIAkvKiBTZW5kIHRoZSBuZGlzIHZlcnNpb24gKi8KQEAgLTM5MywxNiArMzMxLDEzIEBACiAJCQkJc2l6ZW9mKHN0cnVjdCBudnNwX21lc3NhZ2UpLAogCQkJCSh1bnNpZ25lZCBsb25nKWluaXRfcGFja2V0LAogCQkJCVZNX1BLVF9EQVRBX0lOQkFORCwgMCk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCXJldCA9IC0xOworCWlmIChyZXQgIT0gMCkKIAkJZ290byBjbGVhbnVwOwotCX0KIAogCS8qIFBvc3QgdGhlIGJpZyByZWNlaXZlIGJ1ZmZlciB0byBOZXRWU1AgKi8KIAlyZXQgPSBuZXR2c2NfaW5pdF9yZWN2X2J1ZihkZXZpY2UpOwogCiBjbGVhbnVwOgotCXB1dF9uZXRfZGV2aWNlKGRldmljZSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDE4LDI5ICszNTMsNDAgQEAKIHsKIAlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKIAlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqbmV0dnNjX3BhY2tldCwgKnBvczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JLyogU3RvcCBvdXRib3VuZCB0cmFmZmljIGllIHNlbmRzIGFuZCByZWNlaXZlcyBjb21wbGV0aW9ucyAqLwotCW5ldF9kZXZpY2UgPSByZWxlYXNlX291dGJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKLQlpZiAoIW5ldF9kZXZpY2UpIHsKLQkJZGV2X2VycigmZGV2aWNlLT5kZXZpY2UsICJObyBuZXQgZGV2aWNlIHByZXNlbnQhISIpOwotCQlyZXR1cm4gLTE7Ci0JfQorCW5ldF9kZXZpY2UgPSBodl9nZXRfZHJ2ZGF0YShkZXZpY2UpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2UtPmNoYW5uZWwtPmluYm91bmRfbG9jaywgZmxhZ3MpOworCW5ldF9kZXZpY2UtPmRlc3Ryb3kgPSB0cnVlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+Y2hhbm5lbC0+aW5ib3VuZF9sb2NrLCBmbGFncyk7CiAKIAkvKiBXYWl0IGZvciBhbGwgc2VuZCBjb21wbGV0aW9ucyAqLwogCXdoaWxlIChhdG9taWNfcmVhZCgmbmV0X2RldmljZS0+bnVtX291dHN0YW5kaW5nX3NlbmRzKSkgewotCQlkZXZfZXJyKCZkZXZpY2UtPmRldmljZSwKLQkJCSJ3YWl0aW5nIGZvciAlZCByZXF1ZXN0cyB0byBjb21wbGV0ZS4uLiIsCisJCWRldl9pbmZvKCZkZXZpY2UtPmRldmljZSwKKwkJCSJ3YWl0aW5nIGZvciAlZCByZXF1ZXN0cyB0byBjb21wbGV0ZS4uLlxuIiwKIAkJCWF0b21pY19yZWFkKCZuZXRfZGV2aWNlLT5udW1fb3V0c3RhbmRpbmdfc2VuZHMpKTsKIAkJdWRlbGF5KDEwMCk7CiAJfQogCiAJbmV0dnNjX2Rpc2Nvbm5lY3RfdnNwKG5ldF9kZXZpY2UpOwogCi0JLyogU3RvcCBpbmJvdW5kIHRyYWZmaWMgaWUgcmVjZWl2ZXMgYW5kIHNlbmRzIGNvbXBsZXRpb25zICovCi0JbmV0X2RldmljZSA9IHJlbGVhc2VfaW5ib3VuZF9uZXRfZGV2aWNlKGRldmljZSk7CisJLyoKKwkgKiBTaW5jZSB3ZSBoYXZlIGFscmVhZHkgZHJhaW5lZCwgd2UgZG9uJ3QgbmVlZCB0byBidXN5IHdhaXQKKwkgKiBhcyB3YXMgZG9uZSBpbiBmaW5hbF9yZWxlYXNlX3N0b3JfZGV2aWNlKCkKKwkgKiBOb3RlIHRoYXQgd2UgY2Fubm90IHNldCB0aGUgZXh0IHBvaW50ZXIgdG8gTlVMTCB1bnRpbAorCSAqIHdlIGhhdmUgZHJhaW5lZCAtIHRvIGRyYWluIHRoZSBvdXRnb2luZyBwYWNrZXRzLCB3ZSBuZWVkIHRvCisJICogYWxsb3cgaW5jb21pbmcgcGFja2V0cy4KKwkgKi8KIAotCS8qIEF0IHRoaXMgcG9pbnQsIG5vIG9uZSBzaG91bGQgYmUgYWNjZXNzaW5nIG5ldERldmljZSBleGNlcHQgaW4gaGVyZSAqLwotCWRldl9ub3RpY2UoJmRldmljZS0+ZGV2aWNlLCAibmV0IGRldmljZSBzYWZlIHRvIHJlbW92ZSIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZpY2UtPmNoYW5uZWwtPmluYm91bmRfbG9jaywgZmxhZ3MpOworCWh2X3NldF9kcnZkYXRhKGRldmljZSwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2aWNlLT5jaGFubmVsLT5pbmJvdW5kX2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogQXQgdGhpcyBwb2ludCwgbm8gb25lIHNob3VsZCBiZSBhY2Nlc3NpbmcgbmV0X2RldmljZQorCSAqIGV4Y2VwdCBpbiBoZXJlCisJICovCisJZGV2X25vdGljZSgmZGV2aWNlLT5kZXZpY2UsICJuZXQgZGV2aWNlIHNhZmUgdG8gcmVtb3ZlXG4iKTsKIAogCS8qIE5vdywgd2UgY2FuIGNsb3NlIHRoZSBjaGFubmVsIHNhZmVseSAqLwogCXZtYnVzX2Nsb3NlKGRldmljZS0+Y2hhbm5lbCk7CkBAIC00NTIsNyArMzk4LDcgQEAKIAkJa2ZyZWUobmV0dnNjX3BhY2tldCk7CiAJfQogCi0JZnJlZV9uZXRfZGV2aWNlKG5ldF9kZXZpY2UpOworCWtmcmVlKG5ldF9kZXZpY2UpOwogCXJldHVybiAwOwogfQogCkBAIC00NjIsMTMgKzQwOCwxMiBAQAogCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlOwogCXN0cnVjdCBudnNwX21lc3NhZ2UgKm52c3BfcGFja2V0OwogCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpudnNjX3BhY2tldDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAogCW5ldF9kZXZpY2UgPSBnZXRfaW5ib3VuZF9uZXRfZGV2aWNlKGRldmljZSk7Ci0JaWYgKCFuZXRfZGV2aWNlKSB7Ci0JCWRldl9lcnIoJmRldmljZS0+ZGV2aWNlLCAidW5hYmxlIHRvIGdldCBuZXQgZGV2aWNlLi4uIgotCQkJICAgImRldmljZSBiZWluZyBkZXN0cm95ZWQ/Iik7CisJaWYgKCFuZXRfZGV2aWNlKQogCQlyZXR1cm47Ci0JfQorCW5kZXYgPSBuZXRfZGV2aWNlLT5uZGV2OwogCiAJbnZzcF9wYWNrZXQgPSAoc3RydWN0IG52c3BfbWVzc2FnZSAqKSgodW5zaWduZWQgbG9uZylwYWNrZXQgKwogCQkJKHBhY2tldC0+b2Zmc2V0OCA8PCAzKSk7CkBAIC00OTQsMTEgKzQzOSwxMCBAQAogCiAJCWF0b21pY19kZWMoJm5ldF9kZXZpY2UtPm51bV9vdXRzdGFuZGluZ19zZW5kcyk7CiAJfSBlbHNlIHsKLQkJZGV2X2VycigmZGV2aWNlLT5kZXZpY2UsICJVbmtub3duIHNlbmQgY29tcGxldGlvbiBwYWNrZXQgdHlwZS0gIgotCQkJICAgIiVkIHJlY2VpdmVkISEiLCBudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlKTsKKwkJbmV0ZGV2X2VycihuZGV2LCAiVW5rbm93biBzZW5kIGNvbXBsZXRpb24gcGFja2V0IHR5cGUtICIKKwkJCSAgICIlZCByZWNlaXZlZCEhXG4iLCBudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlKTsKIAl9CiAKLQlwdXRfbmV0X2RldmljZShkZXZpY2UpOwogfQogCiBpbnQgbmV0dnNjX3NlbmQoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLApAQCAtNTA2LDE1ICs0NTAsMTMgQEAKIHsKIAlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKIAlpbnQgcmV0ID0gMDsKLQogCXN0cnVjdCBudnNwX21lc3NhZ2Ugc2VuZE1lc3NhZ2U7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CiAKIAluZXRfZGV2aWNlID0gZ2V0X291dGJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKLQlpZiAoIW5ldF9kZXZpY2UpIHsKLQkJZGV2X2VycigmZGV2aWNlLT5kZXZpY2UsICJuZXQgZGV2aWNlICglcCkgc2h1dHRpbmcgZG93bi4uLiIKLQkJCSAgICJpZ25vcmluZyBvdXRib3VuZCBwYWNrZXRzIiwgbmV0X2RldmljZSk7Ci0JCXJldHVybiAtMjsKLQl9CisJaWYgKCFuZXRfZGV2aWNlKQorCQlyZXR1cm4gLUVOT0RFVjsKKwluZGV2ID0gbmV0X2RldmljZS0+bmRldjsKIAogCXNlbmRNZXNzYWdlLmhkci5tc2dfdHlwZSA9IE5WU1BfTVNHMV9UWVBFX1NFTkRfUk5ESVNfUEtUOwogCWlmIChwYWNrZXQtPmlzX2RhdGFfcGt0KSB7CkBAIC01NDcsMTEgKzQ4OSwxMSBAQAogCX0KIAogCWlmIChyZXQgIT0gMCkKLQkJZGV2X2VycigmZGV2aWNlLT5kZXZpY2UsICJVbmFibGUgdG8gc2VuZCBwYWNrZXQgJXAgcmV0ICVkIiwKKwkJbmV0ZGV2X2VycihuZGV2LCAiVW5hYmxlIHRvIHNlbmQgcGFja2V0ICVwIHJldCAlZFxuIiwKIAkJCSAgIHBhY2tldCwgcmV0KTsKKwllbHNlCisJCWF0b21pY19pbmMoJm5ldF9kZXZpY2UtPm51bV9vdXRzdGFuZGluZ19zZW5kcyk7CiAKLQlhdG9taWNfaW5jKCZuZXRfZGV2aWNlLT5udW1fb3V0c3RhbmRpbmdfc2VuZHMpOwotCXB1dF9uZXRfZGV2aWNlKGRldmljZSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTYxLDYgKzUwMywxMCBAQAogCXN0cnVjdCBudnNwX21lc3NhZ2UgcmVjdmNvbXBNZXNzYWdlOwogCWludCByZXRyaWVzID0gMDsKIAlpbnQgcmV0OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OworCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2aWNlID0gaHZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKKworCW5kZXYgPSBuZXRfZGV2aWNlLT5uZGV2OwogCiAJcmVjdmNvbXBNZXNzYWdlLmhkci5tc2dfdHlwZSA9CiAJCQkJTlZTUF9NU0cxX1RZUEVfU0VORF9STkRJU19QS1RfQ09NUExFVEU7CkBAIC01NzcsMjMgKzUyMywyMyBAQAogCWlmIChyZXQgPT0gMCkgewogCQkvKiBzdWNjZXNzICovCiAJCS8qIG5vLW9wICovCi0JfSBlbHNlIGlmIChyZXQgPT0gLTEpIHsKKwl9IGVsc2UgaWYgKHJldCA9PSAtRUFHQUlOKSB7CiAJCS8qIG5vIG1vcmUgcm9vbS4uLndhaXQgYSBiaXQgYW5kIGF0dGVtcHQgdG8gcmV0cnkgMyB0aW1lcyAqLwogCQlyZXRyaWVzKys7Ci0JCWRldl9lcnIoJmRldmljZS0+ZGV2aWNlLCAidW5hYmxlIHRvIHNlbmQgcmVjZWl2ZSBjb21wbGV0aW9uIHBrdCIKLQkJCSIgKHRpZCAlbGx4KS4uLnJldHJ5aW5nICVkIiwgdHJhbnNhY3Rpb25faWQsIHJldHJpZXMpOworCQluZXRkZXZfZXJyKG5kZXYsICJ1bmFibGUgdG8gc2VuZCByZWNlaXZlIGNvbXBsZXRpb24gcGt0IgorCQkJIiAodGlkICVsbHgpLi4ucmV0cnlpbmcgJWRcbiIsIHRyYW5zYWN0aW9uX2lkLCByZXRyaWVzKTsKIAogCQlpZiAocmV0cmllcyA8IDQpIHsKIAkJCXVkZWxheSgxMDApOwogCQkJZ290byByZXRyeV9zZW5kX2NtcGx0OwogCQl9IGVsc2UgewotCQkJZGV2X2VycigmZGV2aWNlLT5kZXZpY2UsICJ1bmFibGUgdG8gc2VuZCByZWNlaXZlICIKLQkJCQkiY29tcGxldGlvbiBwa3QgKHRpZCAlbGx4KS4uLmdpdmUgdXAgcmV0cnlpbmciLAorCQkJbmV0ZGV2X2VycihuZGV2LCAidW5hYmxlIHRvIHNlbmQgcmVjZWl2ZSAiCisJCQkJImNvbXBsZXRpb24gcGt0ICh0aWQgJWxseCkuLi5naXZlIHVwIHJldHJ5aW5nXG4iLAogCQkJCXRyYW5zYWN0aW9uX2lkKTsKIAkJfQogCX0gZWxzZSB7Ci0JCWRldl9lcnIoJmRldmljZS0+ZGV2aWNlLCAidW5hYmxlIHRvIHNlbmQgcmVjZWl2ZSAiCi0JCQkiY29tcGxldGlvbiBwa3QgLSAlbGx4IiwgdHJhbnNhY3Rpb25faWQpOworCQluZXRkZXZfZXJyKG5kZXYsICJ1bmFibGUgdG8gc2VuZCByZWNlaXZlICIKKwkJCSJjb21wbGV0aW9uIHBrdCAtICVsbHhcbiIsIHRyYW5zYWN0aW9uX2lkKTsKIAl9CiB9CiAKQEAgLTYwNiw2ICs1NTIsNyBAQAogCXU2NCB0cmFuc2FjdGlvbl9pZCA9IDA7CiAJYm9vbCBmc2VuZF9yZWNlaXZlX2NvbXAgPSBmYWxzZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwogCiAJLyoKIAkgKiBFdmVuIHRob3VnaCBpdCBzZWVtcyBsb2dpY2FsIHRvIGRvIGEgR2V0T3V0Ym91bmROZXREZXZpY2UoKSBoZXJlIHRvCkBAIC02MTMsMTEgKzU2MCw5IEBACiAJICogc2luY2Ugd2UgbWF5IGhhdmUgZGlzYWJsZSBvdXRib3VuZCB0cmFmZmljIGFscmVhZHkuCiAJICovCiAJbmV0X2RldmljZSA9IGdldF9pbmJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKLQlpZiAoIW5ldF9kZXZpY2UpIHsKLQkJZGV2X2VycigmZGV2aWNlLT5kZXZpY2UsICJ1bmFibGUgdG8gZ2V0IG5ldCBkZXZpY2UuLi4iCi0JCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKKwlpZiAoIW5ldF9kZXZpY2UpCiAJCXJldHVybjsKLQl9CisJbmRldiA9IG5ldF9kZXZpY2UtPm5kZXY7CiAKIAkvKiBPdmVybG9hZGluZyB1c2Ugb2YgdGhlIGxvY2suICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm5ldF9kZXZpY2UtPnJlY3ZfcGt0X2xpc3RfbG9jaywgZmxhZ3MpOwpAQCAtNjQ0LDcgKzU4OSw2IEBACiAJaWYgKGZzZW5kX3JlY2VpdmVfY29tcCkKIAkJbmV0dnNjX3NlbmRfcmVjdl9jb21wbGV0aW9uKGRldmljZSwgdHJhbnNhY3Rpb25faWQpOwogCi0JcHV0X25ldF9kZXZpY2UoZGV2aWNlKTsKIH0KIAogc3RhdGljIHZvaWQgbmV0dnNjX3JlY2VpdmUoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLApAQCAtNjYxLDI0ICs2MDUsMjIgQEAKIAlpbnQgaSwgajsKIAlpbnQgY291bnQgPSAwLCBieXRlc19yZW1haW4gPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CiAKIAlMSVNUX0hFQUQobGlzdEhlYWQpOwogCiAJbmV0X2RldmljZSA9IGdldF9pbmJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKLQlpZiAoIW5ldF9kZXZpY2UpIHsKLQkJZGV2X2VycigmZGV2aWNlLT5kZXZpY2UsICJ1bmFibGUgdG8gZ2V0IG5ldCBkZXZpY2UuLi4iCi0JCQkgICAiZGV2aWNlIGJlaW5nIGRlc3Ryb3llZD8iKTsKKwlpZiAoIW5ldF9kZXZpY2UpCiAJCXJldHVybjsKLQl9CisJbmRldiA9IG5ldF9kZXZpY2UtPm5kZXY7CiAKIAkvKgogCSAqIEFsbCBpbmJvdW5kIHBhY2tldHMgb3RoZXIgdGhhbiBzZW5kIGNvbXBsZXRpb24gc2hvdWxkIGJlIHhmZXIgcGFnZQogCSAqIHBhY2tldAogCSAqLwogCWlmIChwYWNrZXQtPnR5cGUgIT0gVk1fUEtUX0RBVEFfVVNJTkdfWEZFUl9QQUdFUykgewotCQlkZXZfZXJyKCZkZXZpY2UtPmRldmljZSwgIlVua25vd24gcGFja2V0IHR5cGUgcmVjZWl2ZWQgLSAlZCIsCisJCW5ldGRldl9lcnIobmRldiwgIlVua25vd24gcGFja2V0IHR5cGUgcmVjZWl2ZWQgLSAlZFxuIiwKIAkJCSAgIHBhY2tldC0+dHlwZSk7Ci0JCXB1dF9uZXRfZGV2aWNlKGRldmljZSk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTY4OCwxOSArNjMwLDE3IEBACiAJLyogTWFrZSBzdXJlIHRoaXMgaXMgYSB2YWxpZCBudnNwIHBhY2tldCAqLwogCWlmIChudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlICE9CiAJICAgIE5WU1BfTVNHMV9UWVBFX1NFTkRfUk5ESVNfUEtUKSB7Ci0JCWRldl9lcnIoJmRldmljZS0+ZGV2aWNlLCAiVW5rbm93biBudnNwIHBhY2tldCB0eXBlIHJlY2VpdmVkLSIKLQkJCSIgJWQiLCBudnNwX3BhY2tldC0+aGRyLm1zZ190eXBlKTsKLQkJcHV0X25ldF9kZXZpY2UoZGV2aWNlKTsKKwkJbmV0ZGV2X2VycihuZGV2LCAiVW5rbm93biBudnNwIHBhY2tldCB0eXBlIHJlY2VpdmVkLSIKKwkJCSIgJWRcbiIsIG52c3BfcGFja2V0LT5oZHIubXNnX3R5cGUpOwogCQlyZXR1cm47CiAJfQogCiAJdm14ZmVycGFnZV9wYWNrZXQgPSAoc3RydWN0IHZtdHJhbnNmZXJfcGFnZV9wYWNrZXRfaGVhZGVyICopcGFja2V0OwogCiAJaWYgKHZteGZlcnBhZ2VfcGFja2V0LT54ZmVyX3BhZ2VzZXRfaWQgIT0gTkVUVlNDX1JFQ0VJVkVfQlVGRkVSX0lEKSB7Ci0JCWRldl9lcnIoJmRldmljZS0+ZGV2aWNlLCAiSW52YWxpZCB4ZmVyIHBhZ2Ugc2V0IGlkIC0gIgotCQkJICAgImV4cGVjdGluZyAleCBnb3QgJXgiLCBORVRWU0NfUkVDRUlWRV9CVUZGRVJfSUQsCisJCW5ldGRldl9lcnIobmRldiwgIkludmFsaWQgeGZlciBwYWdlIHNldCBpZCAtICIKKwkJCSAgICJleHBlY3RpbmcgJXggZ290ICV4XG4iLCBORVRWU0NfUkVDRUlWRV9CVUZGRVJfSUQsCiAJCQkgICB2bXhmZXJwYWdlX3BhY2tldC0+eGZlcl9wYWdlc2V0X2lkKTsKLQkJcHV0X25ldF9kZXZpY2UoZGV2aWNlKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNzI0LDggKzY2NCw4IEBACiAJICogc29tZSBvZiB0aGUgeGZlciBwYWdlIHBhY2tldCByYW5nZXMuLi4KIAkgKi8KIAlpZiAoY291bnQgPCAyKSB7Ci0JCWRldl9lcnIoJmRldmljZS0+ZGV2aWNlLCAiR290IG9ubHkgJWQgbmV0dnNjIHBrdC4uLm5lZWRlZCAiCi0JCQkiJWQgcGt0cy4gRHJvcHBpbmcgdGhpcyB4ZmVyIHBhZ2UgcGFja2V0IGNvbXBsZXRlbHkhIiwKKwkJbmV0ZGV2X2VycihuZGV2LCAiR290IG9ubHkgJWQgbmV0dnNjIHBrdC4uLm5lZWRlZCAiCisJCQkiJWQgcGt0cy4gRHJvcHBpbmcgdGhpcyB4ZmVyIHBhZ2UgcGFja2V0IGNvbXBsZXRlbHkhXG4iLAogCQkJY291bnQsIHZteGZlcnBhZ2VfcGFja2V0LT5yYW5nZV9jbnQgKyAxKTsKIAogCQkvKiBSZXR1cm4gaXQgdG8gdGhlIGZyZWVsaXN0ICovCkBAIC03NDAsNyArNjgwLDYgQEAKIAkJbmV0dnNjX3NlbmRfcmVjdl9jb21wbGV0aW9uKGRldmljZSwKIAkJCQkJICAgIHZteGZlcnBhZ2VfcGFja2V0LT5kLnRyYW5zX2lkKTsKIAotCQlwdXRfbmV0X2RldmljZShkZXZpY2UpOwogCQlyZXR1cm47CiAJfQogCkBAIC03NTIsOCArNjkxLDggQEAKIAl4ZmVycGFnZV9wYWNrZXQtPmNvdW50ID0gY291bnQgLSAxOwogCiAJaWYgKHhmZXJwYWdlX3BhY2tldC0+Y291bnQgIT0gdm14ZmVycGFnZV9wYWNrZXQtPnJhbmdlX2NudCkgewotCQlkZXZfZXJyKCZkZXZpY2UtPmRldmljZSwgIk5lZWRlZCAlZCBuZXR2c2MgcGt0cyB0byBzYXRpc3kgIgotCQkJInRoaXMgeGZlciBwYWdlLi4uZ290ICVkIiwKKwkJbmV0ZGV2X2VycihuZGV2LCAiTmVlZGVkICVkIG5ldHZzYyBwa3RzIHRvIHNhdGlzZnkgIgorCQkJInRoaXMgeGZlciBwYWdlLi4uZ290ICVkXG4iLAogCQkJdm14ZmVycGFnZV9wYWNrZXQtPnJhbmdlX2NudCwgeGZlcnBhZ2VfcGFja2V0LT5jb3VudCk7CiAJfQogCkBAIC04MjgsNyArNzY3LDYgQEAKIAkJCQljb21wbGV0aW9uLnJlY3YucmVjdl9jb21wbGV0aW9uX2N0eCk7CiAJfQogCi0JcHV0X25ldF9kZXZpY2UoZGV2aWNlKTsKIH0KIAogc3RhdGljIHZvaWQgbmV0dnNjX2NoYW5uZWxfY2Iodm9pZCAqY29udGV4dCkKQEAgLTg0Miw2ICs3ODAsNyBAQAogCXN0cnVjdCB2bXBhY2tldF9kZXNjcmlwdG9yICpkZXNjOwogCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKIAlpbnQgYnVmZmVybGVuID0gTkVUVlNDX1BBQ0tFVF9TSVpFOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwogCiAJcGFja2V0ID0ga3phbGxvYyhORVRWU0NfUEFDS0VUX1NJWkUgKiBzaXplb2YodW5zaWduZWQgY2hhciksCiAJCQkgR0ZQX0FUT01JQyk7CkBAIC04NTAsMTEgKzc4OSw5IEBACiAJYnVmZmVyID0gcGFja2V0OwogCiAJbmV0X2RldmljZSA9IGdldF9pbmJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKLQlpZiAoIW5ldF9kZXZpY2UpIHsKLQkJZGV2X2VycigmZGV2aWNlLT5kZXZpY2UsICJuZXQgZGV2aWNlICglcCkgc2h1dHRpbmcgZG93bi4uLiIKLQkJCSAgICJpZ25vcmluZyBpbmJvdW5kIHBhY2tldHMiLCBuZXRfZGV2aWNlKTsKKwlpZiAoIW5ldF9kZXZpY2UpCiAJCWdvdG8gb3V0OwotCX0KKwluZGV2ID0gbmV0X2RldmljZS0+bmRldjsKIAogCWRvIHsKIAkJcmV0ID0gdm1idXNfcmVjdnBhY2tldF9yYXcoZGV2aWNlLT5jaGFubmVsLCBidWZmZXIsIGJ1ZmZlcmxlbiwKQEAgLTg3Miw3ICs4MDksNyBAQAogCQkJCQlicmVhazsKIAogCQkJCWRlZmF1bHQ6Ci0JCQkJCWRldl9lcnIoJmRldmljZS0+ZGV2aWNlLAorCQkJCQluZXRkZXZfZXJyKG5kZXYsCiAJCQkJCQkgICAidW5oYW5kbGVkIHBhY2tldCB0eXBlICVkLCAiCiAJCQkJCQkgICAidGlkICVsbHggbGVuICVkXG4iLAogCQkJCQkJICAgZGVzYy0+dHlwZSwgcmVxdWVzdF9pZCwKQEAgLTg5NiwxNCArODMzLDE0IEBACiAKIAkJCQlicmVhazsKIAkJCX0KLQkJfSBlbHNlIGlmIChyZXQgPT0gLTIpIHsKKwkJfSBlbHNlIGlmIChyZXQgPT0gLUVOT0JVRlMpIHsKIAkJCS8qIEhhbmRsZSBsYXJnZSBwYWNrZXQgKi8KIAkJCWJ1ZmZlciA9IGttYWxsb2MoYnl0ZXNfcmVjdmQsIEdGUF9BVE9NSUMpOwogCQkJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CiAJCQkJLyogVHJ5IGFnYWluIG5leHQgdGltZSBhcm91bmQgKi8KLQkJCQlkZXZfZXJyKCZkZXZpY2UtPmRldmljZSwKKwkJCQluZXRkZXZfZXJyKG5kZXYsCiAJCQkJCSAgICJ1bmFibGUgdG8gYWxsb2NhdGUgYnVmZmVyIG9mIHNpemUgIgotCQkJCQkgICAiKCVkKSEhIiwgYnl0ZXNfcmVjdmQpOworCQkJCQkgICAiKCVkKSEhXG4iLCBieXRlc19yZWN2ZCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTkxMSw3ICs4NDgsNiBAQAogCQl9CiAJfSB3aGlsZSAoMSk7CiAKLQlwdXRfbmV0X2RldmljZShkZXZpY2UpOwogb3V0OgogCWtmcmVlKGJ1ZmZlcik7CiAJcmV0dXJuOwpAQCAtOTI5LDEzICs4NjUsMjMgQEAKIAkoKHN0cnVjdCBuZXR2c2NfZGV2aWNlX2luZm8gKilhZGRpdGlvbmFsX2luZm8pLT5yaW5nX3NpemU7CiAJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CiAJc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKnBhY2tldCwgKnBvczsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAogCW5ldF9kZXZpY2UgPSBhbGxvY19uZXRfZGV2aWNlKGRldmljZSk7CiAJaWYgKCFuZXRfZGV2aWNlKSB7Ci0JCXJldCA9IC0xOworCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCisJLyoKKwkgKiBDb21pbmcgaW50byB0aGlzIGZ1bmN0aW9uLCBzdHJ1Y3QgbmV0X2RldmljZSAqIGlzCisJICogcmVnaXN0ZXJlZCBhcyB0aGUgZHJpdmVyIHByaXZhdGUgZGF0YS4KKwkgKiBJbiBhbGxvY19uZXRfZGV2aWNlKCksIHdlIHJlZ2lzdGVyIHN0cnVjdCBuZXR2c2NfZGV2aWNlICoKKwkgKiBhcyB0aGUgZHJpdmVyIHByaXZhdGUgZGF0YSBhbmQgc3Rhc2ggYXdheSBzdHJ1Y3QgbmV0X2RldmljZSAqCisJICogaW4gc3RydWN0IG5ldHZzY19kZXZpY2UgKi4KKwkgKi8KKwluZGV2ID0gbmV0X2RldmljZS0+bmRldjsKKwogCS8qIEluaXRpYWxpemUgdGhlIE5ldFZTQyBjaGFubmVsIGV4dGVuc2lvbiAqLwogCW5ldF9kZXZpY2UtPnJlY3ZfYnVmX3NpemUgPSBORVRWU0NfUkVDRUlWRV9CVUZGRVJfU0laRTsKIAlzcGluX2xvY2tfaW5pdCgmbmV0X2RldmljZS0+cmVjdl9wa3RfbGlzdF9sb2NrKTsKQEAgLTk2MCwyMCArOTA2LDE4IEBACiAJCQkgbmV0dnNjX2NoYW5uZWxfY2IsIGRldmljZSk7CiAKIAlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2VycigmZGV2aWNlLT5kZXZpY2UsICJ1bmFibGUgdG8gb3BlbiBjaGFubmVsOiAlZCIsIHJldCk7Ci0JCXJldCA9IC0xOworCQluZXRkZXZfZXJyKG5kZXYsICJ1bmFibGUgdG8gb3BlbiBjaGFubmVsOiAlZFxuIiwgcmV0KTsKIAkJZ290byBjbGVhbnVwOwogCX0KIAogCS8qIENoYW5uZWwgaXMgb3BlbmVkICovCi0JcHJfaW5mbygiaHZfbmV0dnNjIGNoYW5uZWwgb3BlbmVkIHN1Y2Nlc3NmdWxseSIpOworCXByX2luZm8oImh2X25ldHZzYyBjaGFubmVsIG9wZW5lZCBzdWNjZXNzZnVsbHlcbiIpOwogCiAJLyogQ29ubmVjdCB3aXRoIHRoZSBOZXRWc3AgKi8KIAlyZXQgPSBuZXR2c2NfY29ubmVjdF92c3AoZGV2aWNlKTsKIAlpZiAocmV0ICE9IDApIHsKLQkJZGV2X2VycigmZGV2aWNlLT5kZXZpY2UsCi0JCQkidW5hYmxlIHRvIGNvbm5lY3QgdG8gTmV0VlNQIC0gJWQiLCByZXQpOwotCQlyZXQgPSAtMTsKKwkJbmV0ZGV2X2VycihuZGV2LAorCQkJInVuYWJsZSB0byBjb25uZWN0IHRvIE5ldFZTUCAtICVkXG4iLCByZXQpOwogCQlnb3RvIGNsb3NlOwogCX0KIApAQCAtOTkzLDIzICs5MzcsOCBAQAogCQkJa2ZyZWUocGFja2V0KTsKIAkJfQogCi0JCXJlbGVhc2Vfb3V0Ym91bmRfbmV0X2RldmljZShkZXZpY2UpOwotCQlyZWxlYXNlX2luYm91bmRfbmV0X2RldmljZShkZXZpY2UpOwotCi0JCWZyZWVfbmV0X2RldmljZShuZXRfZGV2aWNlKTsKKwkJa2ZyZWUobmV0X2RldmljZSk7CiAJfQogCiAJcmV0dXJuIHJldDsKIH0KLQotLyoKLSAqIG5ldHZzY19pbml0aWFsaXplIC0gTWFpbiBlbnRyeSBwb2ludAotICovCi1pbnQgbmV0dnNjX2luaXRpYWxpemUoc3RydWN0IGh2X2RyaXZlciAqZHJ2KQotewotCi0JZHJ2LT5uYW1lID0gZHJpdmVyX25hbWU7Ci0JbWVtY3B5KCZkcnYtPmRldl90eXBlLCAmbmV0dnNjX2RldmljZV90eXBlLCBzaXplb2Yoc3RydWN0IGh2X2d1aWQpKTsKLQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2h2L25ldHZzY19kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9uZXR2c2NfZHJ2LmMKaW5kZXggNGM3NzM5Zi4uOTNiMGU5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2h2L25ldHZzY19kcnYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaHYvbmV0dnNjX2Rydi5jCkBAIC0zMywxNCArMzMsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWkuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxuZXQvYXJwLmg+CiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CiAKLSNpbmNsdWRlICJoeXBlcnYuaCIKICNpbmNsdWRlICJoeXBlcnZfbmV0LmgiCiAKIHN0cnVjdCBuZXRfZGV2aWNlX2NvbnRleHQgewpAQCAtNzIsMjAgKzY5LDE1IEBACiAJc3RydWN0IGh2X2RldmljZSAqZGV2aWNlX29iaiA9IG5ldF9kZXZpY2VfY3R4LT5kZXZpY2VfY3R4OwogCWludCByZXQgPSAwOwogCi0JaWYgKG5ldGlmX2NhcnJpZXJfb2sobmV0KSkgewotCQkvKiBPcGVuIHVwIHRoZSBkZXZpY2UgKi8KLQkJcmV0ID0gcm5kaXNfZmlsdGVyX29wZW4oZGV2aWNlX29iaik7Ci0JCWlmIChyZXQgIT0gMCkgewotCQkJbmV0ZGV2X2VycihuZXQsICJ1bmFibGUgdG8gb3BlbiBkZXZpY2UgKHJldCAlZCkuXG4iLAotCQkJCSAgIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJbmV0aWZfc3RhcnRfcXVldWUobmV0KTsKLQl9IGVsc2UgewotCQluZXRkZXZfZXJyKG5ldCwgInVuYWJsZSB0byBvcGVuIGRldmljZS4uLmxpbmsgaXMgZG93bi5cbiIpOworCS8qIE9wZW4gdXAgdGhlIGRldmljZSAqLworCXJldCA9IHJuZGlzX2ZpbHRlcl9vcGVuKGRldmljZV9vYmopOworCWlmIChyZXQgIT0gMCkgeworCQluZXRkZXZfZXJyKG5ldCwgInVuYWJsZSB0byBvcGVuIGRldmljZSAocmV0ICVkKS5cbiIsIHJldCk7CisJCXJldHVybiByZXQ7CiAJfQogCisJbmV0aWZfc3RhcnRfcXVldWUobmV0KTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE0MywxMiArMTM1LDEyIEBACiAJCQkgKG51bV9wYWdlcyAqIHNpemVvZihzdHJ1Y3QgaHZfcGFnZV9idWZmZXIpKSArCiAJCQkgc2l6ZW9mKHN0cnVjdCBybmRpc19maWx0ZXJfcGFja2V0KSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFwYWNrZXQpIHsKLQkJLyogb3V0IG9mIG1lbW9yeSwgc2lsZW50bHkgZHJvcCBwYWNrZXQgKi8KKwkJLyogb3V0IG9mIG1lbW9yeSwgZHJvcCBwYWNrZXQgKi8KIAkJbmV0ZGV2X2VycihuZXQsICJ1bmFibGUgdG8gYWxsb2NhdGUgaHZfbmV0dnNjX3BhY2tldFxuIik7CiAKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogCQluZXQtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKLQkJcmV0dXJuIE5FVERFVl9UWF9PSzsKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCX0KIAogCXBhY2tldC0+ZXh0ZW5zaW9uID0gKHZvaWQgKikodW5zaWduZWQgbG9uZylwYWNrZXQgKwpAQCAtMTkzLDEwICsxODUsMTEgQEAKIAl9IGVsc2UgewogCQkvKiB3ZSBhcmUgc2h1dHRpbmcgZG93biBvciBidXMgb3ZlcmxvYWRlZCwganVzdCBkcm9wIHBhY2tldCAqLwogCQluZXQtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKLQkJbmV0dnNjX3htaXRfY29tcGxldGlvbihwYWNrZXQpOworCQlrZnJlZShwYWNrZXQpOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCX0KIAotCXJldHVybiBORVRERVZfVFhfT0s7CisJcmV0dXJuIHJldCA/IE5FVERFVl9UWF9CVVNZIDogTkVUREVWX1RYX09LOwogfQogCiAvKgpAQCAtMjA1LDggKzE5OCwxMiBAQAogdm9pZCBuZXR2c2NfbGlua3N0YXR1c19jYWxsYmFjayhzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2Vfb2JqLAogCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc3RhdHVzKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQgPSBkZXZfZ2V0X2RydmRhdGEoJmRldmljZV9vYmotPmRldmljZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldDsKIAlzdHJ1Y3QgbmV0X2RldmljZV9jb250ZXh0ICpuZGV2X2N0eDsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKKworCW5ldF9kZXZpY2UgPSBodl9nZXRfZHJ2ZGF0YShkZXZpY2Vfb2JqKTsKKwluZXQgPSBuZXRfZGV2aWNlLT5uZGV2OwogCiAJaWYgKCFuZXQpIHsKIAkJbmV0ZGV2X2VycihuZXQsICJnb3QgbGluayBzdGF0dXMgYnV0IG5ldCBkZXZpY2UgIgpAQCAtMjE3LDggKzIxNCw4IEBACiAJaWYgKHN0YXR1cyA9PSAxKSB7CiAJCW5ldGlmX2NhcnJpZXJfb24obmV0KTsKIAkJbmV0aWZfd2FrZV9xdWV1ZShuZXQpOwotCQluZXRpZl9ub3RpZnlfcGVlcnMobmV0KTsKIAkJbmRldl9jdHggPSBuZXRkZXZfcHJpdihuZXQpOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm5kZXZfY3R4LT5kd29yaywgMCk7CiAJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbmRldl9jdHgtPmR3b3JrLCBtc2Vjc190b19qaWZmaWVzKDIwKSk7CiAJfSBlbHNlIHsKIAkJbmV0aWZfY2Fycmllcl9vZmYobmV0KTsKQEAgLTIzOCw2ICsyMzUsMTAgQEAKIAl2b2lkICpkYXRhOwogCWludCBpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CisKKwluZXRfZGV2aWNlID0gaHZfZ2V0X2RydmRhdGEoZGV2aWNlX29iaik7CisJbmV0ID0gbmV0X2RldmljZS0+bmRldjsKIAogCWlmICghbmV0KSB7CiAJCW5ldGRldl9lcnIobmV0LCAiZ290IHJlY2VpdmUgY2FsbGJhY2sgYnV0IG5ldCBkZXZpY2UiCkBAIC0zMjQsMTQgKzMyNSwxNyBAQAogewogCXN0cnVjdCBuZXRfZGV2aWNlX2NvbnRleHQgKm5kZXZfY3R4OwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQ7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CiAKIAluZGV2X2N0eCA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgbmV0X2RldmljZV9jb250ZXh0LCBkd29yay53b3JrKTsKLQluZXQgPSBkZXZfZ2V0X2RydmRhdGEoJm5kZXZfY3R4LT5kZXZpY2VfY3R4LT5kZXZpY2UpOworCW5ldF9kZXZpY2UgPSBodl9nZXRfZHJ2ZGF0YShuZGV2X2N0eC0+ZGV2aWNlX2N0eCk7CisJbmV0ID0gbmV0X2RldmljZS0+bmRldjsKIAluZXRpZl9ub3RpZnlfcGVlcnMobmV0KTsKIH0KIAogCi1zdGF0aWMgaW50IG5ldHZzY19wcm9iZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IG5ldHZzY19wcm9iZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYsCisJCQljb25zdCBzdHJ1Y3QgaHZfdm1idXNfZGV2aWNlX2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldCA9IE5VTEw7CiAJc3RydWN0IG5ldF9kZXZpY2VfY29udGV4dCAqbmV0X2RldmljZV9jdHg7CkBAIC0zNDAsNyArMzQ0LDcgQEAKIAogCW5ldCA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9jb250ZXh0KSk7CiAJaWYgKCFuZXQpCi0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBTZXQgaW5pdGlhbCBzdGF0ZSAqLwogCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldCk7CkBAIC0zNDgsMjQgKzM1Miw5IEBACiAJbmV0X2RldmljZV9jdHggPSBuZXRkZXZfcHJpdihuZXQpOwogCW5ldF9kZXZpY2VfY3R4LT5kZXZpY2VfY3R4ID0gZGV2OwogCWF0b21pY19zZXQoJm5ldF9kZXZpY2VfY3R4LT5hdmFpbCwgcmluZ19zaXplKTsKLQlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2aWNlLCBuZXQpOworCWh2X3NldF9kcnZkYXRhKGRldiwgbmV0KTsKIAlJTklUX0RFTEFZRURfV09SSygmbmV0X2RldmljZV9jdHgtPmR3b3JrLCBuZXR2c2Nfc2VuZF9nYXJwKTsKIAotCS8qIE5vdGlmeSB0aGUgbmV0dnNjIGRyaXZlciBvZiB0aGUgbmV3IGRldmljZSAqLwotCWRldmljZV9pbmZvLnJpbmdfc2l6ZSA9IHJpbmdfc2l6ZTsKLQlyZXQgPSBybmRpc19maWx0ZXJfZGV2aWNlX2FkZChkZXYsICZkZXZpY2VfaW5mbyk7Ci0JaWYgKHJldCAhPSAwKSB7Ci0JCWZyZWVfbmV0ZGV2KG5ldCk7Ci0JCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXZpY2UsIE5VTEwpOwotCi0JCW5ldGRldl9lcnIobmV0LCAidW5hYmxlIHRvIGFkZCBuZXR2c2MgZGV2aWNlIChyZXQgJWQpXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCW5ldGlmX2NhcnJpZXJfb24obmV0KTsKLQotCW1lbWNweShuZXQtPmRldl9hZGRyLCBkZXZpY2VfaW5mby5tYWNfYWRyLCBFVEhfQUxFTik7Ci0KIAluZXQtPm5ldGRldl9vcHMgPSAmZGV2aWNlX29wczsKIAogCS8qIFRPRE86IEFkZCBHU08gYW5kIENoZWNrc3VtIG9mZmxvYWQgKi8KQEAgLTM3NywxOCArMzY2LDM3IEBACiAKIAlyZXQgPSByZWdpc3Rlcl9uZXRkZXYobmV0KTsKIAlpZiAocmV0ICE9IDApIHsKLQkJLyogUmVtb3ZlIHRoZSBkZXZpY2UgYW5kIHJlbGVhc2UgdGhlIHJlc291cmNlICovCi0JCXJuZGlzX2ZpbHRlcl9kZXZpY2VfcmVtb3ZlKGRldik7CisJCXByX2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIG5ldGRldi5cbiIpOwogCQlmcmVlX25ldGRldihuZXQpOworCQlnb3RvIG91dDsKIAl9CiAKKwkvKiBOb3RpZnkgdGhlIG5ldHZzYyBkcml2ZXIgb2YgdGhlIG5ldyBkZXZpY2UgKi8KKwlkZXZpY2VfaW5mby5yaW5nX3NpemUgPSByaW5nX3NpemU7CisJcmV0ID0gcm5kaXNfZmlsdGVyX2RldmljZV9hZGQoZGV2LCAmZGV2aWNlX2luZm8pOworCWlmIChyZXQgIT0gMCkgeworCQluZXRkZXZfZXJyKG5ldCwgInVuYWJsZSB0byBhZGQgbmV0dnNjIGRldmljZSAocmV0ICVkKVxuIiwgcmV0KTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYobmV0KTsKKwkJZnJlZV9uZXRkZXYobmV0KTsKKwkJaHZfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJbWVtY3B5KG5ldC0+ZGV2X2FkZHIsIGRldmljZV9pbmZvLm1hY19hZHIsIEVUSF9BTEVOKTsKKworCW5ldGlmX2NhcnJpZXJfb24obmV0KTsKKworb3V0OgogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgbmV0dnNjX3JlbW92ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldCA9IGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXZpY2UpOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXQ7CiAJc3RydWN0IG5ldF9kZXZpY2VfY29udGV4dCAqbmRldl9jdHg7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CisKKwluZXRfZGV2aWNlID0gaHZfZ2V0X2RydmRhdGEoZGV2KTsKKwluZXQgPSBuZXRfZGV2aWNlLT5uZGV2OwogCiAJaWYgKG5ldCA9PSBOVUxMKSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2aWNlLCAiTm8gbmV0IGRldmljZSB0byByZW1vdmVcbiIpOwpAQCAtNDEzLDYxICs0MjEsMzMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBodl92bWJ1c19kZXZpY2VfaWQgaWRfdGFibGVbXSA9IHsKKwkvKiBOZXR3b3JrIGd1aWQgKi8KKwl7IFZNQlVTX0RFVklDRSgweDYzLCAweDUxLCAweDYxLCAweEY4LCAweDNFLCAweERGLCAweGM1LCAweDQ2LAorCQkgICAgICAgMHg5MSwgMHgzRiwgMHhGMiwgMHhEMiwgMHhGOSwgMHg2NSwgMHhFRCwgMHgwRSkgfSwKKwl7IH0sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHZtYnVzLCBpZF90YWJsZSk7CisKIC8qIFRoZSBvbmUgYW5kIG9ubHkgb25lICovCiBzdGF0aWMgc3RydWN0ICBodl9kcml2ZXIgbmV0dnNjX2RydiA9IHsKKwkubmFtZSA9ICJuZXR2c2MiLAorCS5pZF90YWJsZSA9IGlkX3RhYmxlLAogCS5wcm9iZSA9IG5ldHZzY19wcm9iZSwKIAkucmVtb3ZlID0gbmV0dnNjX3JlbW92ZSwKIH07CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBuZXR2c2NfZHJ2X2V4aXQodm9pZCkKIHsKLQl2bWJ1c19jaGlsZF9kcml2ZXJfdW5yZWdpc3RlcigmbmV0dnNjX2Rydi5kcml2ZXIpOworCXZtYnVzX2RyaXZlcl91bnJlZ2lzdGVyKCZuZXR2c2NfZHJ2KTsKIH0KIAotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0Y29uc3QKLWh2X25ldHZzY19kbWlfdGFibGVbXSBfX21heWJlX3VudXNlZCAgPSB7Ci0JewotCQkuaWRlbnQgPSAiSHlwZXItViIsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiTWljcm9zb2Z0IENvcnBvcmF0aW9uIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZpcnR1YWwgTWFjaGluZSIpLAotCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiVmlydHVhbCBNYWNoaW5lIiksCi0JCX0sCi0JfSwKLQl7IH0sCi19OwotTU9EVUxFX0RFVklDRV9UQUJMRShkbWksIGh2X25ldHZzY19kbWlfdGFibGUpOwotCiBzdGF0aWMgaW50IF9faW5pdCBuZXR2c2NfZHJ2X2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgaHZfZHJpdmVyICpkcnYgPSAmbmV0dnNjX2RydjsKLQlpbnQgcmV0OwotCi0JcHJfaW5mbygiaW5pdGlhbGl6aW5nLi4uLiIpOwotCi0JaWYgKCFkbWlfY2hlY2tfc3lzdGVtKGh2X25ldHZzY19kbWlfdGFibGUpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCi0JLyogQ2FsbGJhY2sgdG8gY2xpZW50IGRyaXZlciB0byBjb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gKi8KLQluZXR2c2NfaW5pdGlhbGl6ZShkcnYpOwotCi0JZHJ2LT5kcml2ZXIubmFtZSA9IGRydi0+bmFtZTsKLQotCS8qIFRoZSBkcml2ZXIgYmVsb25ncyB0byB2bWJ1cyAqLwotCXJldCA9IHZtYnVzX2NoaWxkX2RyaXZlcl9yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gdm1idXNfZHJpdmVyX3JlZ2lzdGVyKCZuZXR2c2NfZHJ2KTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIF9faW5pdGNvbnN0Ci1odl9uZXR2c2NfcGNpX3RhYmxlW10gX19tYXliZV91bnVzZWQgPSB7Ci0JeyBQQ0lfREVWSUNFKDB4MTQxNCwgMHg1MzUzKSB9LCAvKiBWR0EgY29tcGF0aWJsZSBjb250cm9sbGVyICovCi0JeyAwIH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaHZfbmV0dnNjX3BjaV90YWJsZSk7Ci0KIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9WRVJTSU9OKEhWX0RSVl9WRVJTSU9OKTsKIE1PRFVMRV9ERVNDUklQVElPTigiTWljcm9zb2Z0IEh5cGVyLVYgbmV0d29yayBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9odi9ybmRpc19maWx0ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9ybmRpc19maWx0ZXIuYwppbmRleCBkYmI1MjAxLi5iYWZjY2IzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvcm5kaXNfZmlsdGVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2h2L3JuZGlzX2ZpbHRlci5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KIAotI2luY2x1ZGUgImh5cGVydi5oIgogI2luY2x1ZGUgImh5cGVydl9uZXQuaCIKIAogCkBAIC00Miw3ICs0MSw3IEBACiAJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXY7CiAKIAllbnVtIHJuZGlzX2RldmljZV9zdGF0ZSBzdGF0ZTsKLQl1MzIgbGlua19zdGF0OworCWJvb2wgbGlua19zdGF0ZTsKIAlhdG9taWNfdCBuZXdfcmVxX2lkOwogCiAJc3BpbmxvY2tfdCByZXF1ZXN0X2xvY2s7CkBAIC0xNDIsNyArMTQxLDExIEBACiBzdGF0aWMgdm9pZCBkdW1wX3JuZGlzX21lc3NhZ2Uoc3RydWN0IGh2X2RldmljZSAqaHZfZGV2LAogCQkJc3RydWN0IHJuZGlzX21lc3NhZ2UgKnJuZGlzX21zZykKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZodl9kZXYtPmRldmljZSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKKworCW5ldF9kZXZpY2UgPSBodl9nZXRfZHJ2ZGF0YShodl9kZXYpOworCW5ldGRldiA9IG5ldF9kZXZpY2UtPm5kZXY7CiAKIAlzd2l0Y2ggKHJuZGlzX21zZy0+bmRpc19tc2dfdHlwZSkgewogCWNhc2UgUkVNT1RFX05ESVNfUEFDS0VUX01TRzoKQEAgLTI1MCw2ICsyNTMsOSBAQAogCXN0cnVjdCBybmRpc19yZXF1ZXN0ICpyZXF1ZXN0ID0gTlVMTDsKIAlib29sIGZvdW5kID0gZmFsc2U7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKworCW5kZXYgPSBkZXYtPm5ldF9kZXYtPm5kZXY7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5yZXF1ZXN0X2xvY2ssIGZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcXVlc3QsICZkZXYtPnJlcV9saXN0LCBsaXN0X2VudCkgewpAQCAtMjcwLDcgKzI3Niw3IEBACiAJCQltZW1jcHkoJnJlcXVlc3QtPnJlc3BvbnNlX21zZywgcmVzcCwKIAkJCSAgICAgICByZXNwLT5tc2dfbGVuKTsKIAkJfSBlbHNlIHsKLQkJCWRldl9lcnIoJmRldi0+bmV0X2Rldi0+ZGV2LT5kZXZpY2UsCisJCQluZXRkZXZfZXJyKG5kZXYsCiAJCQkJInJuZGlzIHJlc3BvbnNlIGJ1ZmZlciBvdmVyZmxvdyAiCiAJCQkJImRldGVjdGVkIChzaXplICV1IG1heCAlenUpXG4iLAogCQkJCXJlc3AtPm1zZ19sZW4sCkBAIC0yOTAsNyArMjk2LDcgQEAKIAogCQljb21wbGV0ZSgmcmVxdWVzdC0+d2FpdF9ldmVudCk7CiAJfSBlbHNlIHsKLQkJZGV2X2VycigmZGV2LT5uZXRfZGV2LT5kZXYtPmRldmljZSwKKwkJbmV0ZGV2X2VycihuZGV2LAogCQkJIm5vIHJuZGlzIHJlcXVlc3QgZm91bmQgZm9yIHRoaXMgcmVzcG9uc2UgIgogCQkJIihpZCAweCV4IHJlcyB0eXBlIDB4JXgpXG4iLAogCQkJcmVzcC0+bXNnLmluaXRfY29tcGxldGUucmVxX2lkLApAQCAtMzIzLDYgKzMyOSw3IEBACiB7CiAJc3RydWN0IHJuZGlzX3BhY2tldCAqcm5kaXNfcGt0OwogCXUzMiBkYXRhX29mZnNldDsKKwlpbnQgaTsKIAogCXJuZGlzX3BrdCA9ICZtc2ctPm1zZy5wa3Q7CiAKQEAgLTMzOCw2ICszNDUsMTUgQEAKIAlwa3QtPnBhZ2VfYnVmWzBdLm9mZnNldCArPSBkYXRhX29mZnNldDsKIAlwa3QtPnBhZ2VfYnVmWzBdLmxlbiAtPSBkYXRhX29mZnNldDsKIAorCS8qIERyb3AgdGhlIDB0aCBwYWdlLCBpZiBybmRpcyBkYXRhIGdvIGJleW9uZCBwYWdlIGJvdW5kYXJ5ICovCisJaWYgKHBrdC0+cGFnZV9idWZbMF0ub2Zmc2V0ID49IFBBR0VfU0laRSkgeworCQlwa3QtPnBhZ2VfYnVmWzFdLm9mZnNldCA9IHBrdC0+cGFnZV9idWZbMF0ub2Zmc2V0IC0gUEFHRV9TSVpFOworCQlwa3QtPnBhZ2VfYnVmWzFdLmxlbiAtPSBwa3QtPnBhZ2VfYnVmWzFdLm9mZnNldDsKKwkJcGt0LT5wYWdlX2J1Zl9jbnQtLTsKKwkJZm9yIChpID0gMDsgaSA8IHBrdC0+cGFnZV9idWZfY250OyBpKyspCisJCQlwa3QtPnBhZ2VfYnVmW2ldID0gcGt0LT5wYWdlX2J1ZltpKzFdOworCX0KKwogCXBrdC0+aXNfZGF0YV9wa3QgPSB0cnVlOwogCiAJbmV0dnNjX3JlY3ZfY2FsbGJhY2soZGV2LT5uZXRfZGV2LT5kZXYsIHBrdCk7CkBAIC0zNDYsMjYgKzM2MiwyOSBAQAogaW50IHJuZGlzX2ZpbHRlcl9yZWNlaXZlKHN0cnVjdCBodl9kZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldAkqcGt0KQogewotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXRfZGV2ID0gZGV2LT5leHQ7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXYgPSBodl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBybmRpc19kZXZpY2UgKnJuZGlzX2RldjsKIAlzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSBybmRpc19tc2c7CiAJc3RydWN0IHJuZGlzX21lc3NhZ2UgKnJuZGlzX2hkcjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAogCWlmICghbmV0X2RldikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwluZGV2ID0gbmV0X2Rldi0+bmRldjsKKwogCS8qIE1ha2Ugc3VyZSB0aGUgcm5kaXMgZGV2aWNlIHN0YXRlIGlzIGluaXRpYWxpemVkICovCiAJaWYgKCFuZXRfZGV2LT5leHRlbnNpb24pIHsKLQkJZGV2X2VycigmZGV2LT5kZXZpY2UsICJnb3Qgcm5kaXMgbWVzc2FnZSBidXQgbm8gcm5kaXMgZGV2aWNlIC0gIgorCQluZXRkZXZfZXJyKG5kZXYsICJnb3Qgcm5kaXMgbWVzc2FnZSBidXQgbm8gcm5kaXMgZGV2aWNlIC0gIgogCQkJICAiZHJvcHBpbmcgdGhpcyBtZXNzYWdlIVxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJcm5kaXNfZGV2ID0gKHN0cnVjdCBybmRpc19kZXZpY2UgKiluZXRfZGV2LT5leHRlbnNpb247CiAJaWYgKHJuZGlzX2Rldi0+c3RhdGUgPT0gUk5ESVNfREVWX1VOSU5JVElBTElaRUQpIHsKLQkJZGV2X2VycigmZGV2LT5kZXZpY2UsICJnb3Qgcm5kaXMgbWVzc2FnZSBidXQgcm5kaXMgZGV2aWNlICIKKwkJbmV0ZGV2X2VycihuZGV2LCAiZ290IHJuZGlzIG1lc3NhZ2UgYnV0IHJuZGlzIGRldmljZSAiCiAJCQkgICAidW5pbml0aWFsaXplZC4uLmRyb3BwaW5nIHRoaXMgbWVzc2FnZSFcbiIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRU5PREVWOwogCX0KIAogCXJuZGlzX2hkciA9IChzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSAqKWttYXBfYXRvbWljKApAQCAtMzc3LDcgKzM5Niw3IEBACiAJLyogTWFrZSBzdXJlIHdlIGdvdCBhIHZhbGlkIHJuZGlzIG1lc3NhZ2UgKi8KIAlpZiAoKHJuZGlzX2hkci0+bmRpc19tc2dfdHlwZSAhPSBSRU1PVEVfTkRJU19QQUNLRVRfTVNHKSAmJgogCSAgICAocm5kaXNfaGRyLT5tc2dfbGVuID4gc2l6ZW9mKHN0cnVjdCBybmRpc19tZXNzYWdlKSkpIHsKLQkJZGV2X2VycigmZGV2LT5kZXZpY2UsICJpbmNvbWluZyBybmRpcyBtZXNzYWdlIGJ1ZmZlciBvdmVyZmxvdyAiCisJCW5ldGRldl9lcnIobmRldiwgImluY29taW5nIHJuZGlzIG1lc3NhZ2UgYnVmZmVyIG92ZXJmbG93ICIKIAkJCSAgICJkZXRlY3RlZCAoZ290ICV1LCBtYXggJXp1KS4ubWFya2luZyBpdCBhbiBlcnJvciFcbiIsCiAJCQkgICBybmRpc19oZHItPm1zZ19sZW4sCiAJCQkgICBzaXplb2Yoc3RydWN0IHJuZGlzX21lc3NhZ2UpKTsKQEAgLTQxMCw3ICs0MjksNyBAQAogCQlybmRpc19maWx0ZXJfcmVjZWl2ZV9pbmRpY2F0ZV9zdGF0dXMocm5kaXNfZGV2LCAmcm5kaXNfbXNnKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2VycigmZGV2LT5kZXZpY2UsCisJCW5ldGRldl9lcnIobmRldiwKIAkJCSJ1bmhhbmRsZWQgcm5kaXMgbWVzc2FnZSAodHlwZSAldSBsZW4gJXUpXG4iLAogCQkJICAgcm5kaXNfbXNnLm5kaXNfbXNnX3R5cGUsCiAJCQkgICBybmRpc19tc2cubXNnX2xlbik7CkBAIC00MzcsOCArNDU2LDggQEAKIAlyZXF1ZXN0ID0gZ2V0X3JuZGlzX3JlcXVlc3QoZGV2LCBSRU1PVEVfTkRJU19RVUVSWV9NU0csCiAJCQlSTkRJU19NRVNTQUdFX1NJWkUoc3RydWN0IHJuZGlzX3F1ZXJ5X3JlcXVlc3QpKTsKIAlpZiAoIXJlcXVlc3QpIHsKLQkJcmV0ID0gLTE7Ci0JCWdvdG8gQ2xlYW51cDsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBjbGVhbnVwOwogCX0KIAogCS8qIFNldHVwIHRoZSBybmRpcyBxdWVyeSAqLwpAQCAtNDUwLDEyICs0NjksMTIgQEAKIAogCXJldCA9IHJuZGlzX2ZpbHRlcl9zZW5kX3JlcXVlc3QoZGV2LCByZXF1ZXN0KTsKIAlpZiAocmV0ICE9IDApCi0JCWdvdG8gQ2xlYW51cDsKKwkJZ290byBjbGVhbnVwOwogCiAJdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcmVxdWVzdC0+d2FpdF9ldmVudCwgNSpIWik7CiAJaWYgKHQgPT0gMCkgewogCQlyZXQgPSAtRVRJTUVET1VUOwotCQlnb3RvIENsZWFudXA7CisJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAkvKiBDb3B5IHRoZSByZXNwb25zZSBiYWNrICovCkBAIC00NjMsNyArNDgyLDcgQEAKIAogCWlmIChxdWVyeV9jb21wbGV0ZS0+aW5mb19idWZsZW4gPiBpbnJlc3VsdF9zaXplKSB7CiAJCXJldCA9IC0xOwotCQlnb3RvIENsZWFudXA7CisJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAltZW1jcHkocmVzdWx0LApAQCAtNDczLDcgKzQ5Miw3IEBACiAKIAkqcmVzdWx0X3NpemUgPSBxdWVyeV9jb21wbGV0ZS0+aW5mb19idWZsZW47CiAKLUNsZWFudXA6CitjbGVhbnVwOgogCWlmIChyZXF1ZXN0KQogCQlwdXRfcm5kaXNfcmVxdWVzdChkZXYsIHJlcXVlc3QpOwogCkBAIC00OTIsMTAgKzUxMSwxNSBAQAogc3RhdGljIGludCBybmRpc19maWx0ZXJfcXVlcnlfZGV2aWNlX2xpbmtfc3RhdHVzKHN0cnVjdCBybmRpc19kZXZpY2UgKmRldikKIHsKIAl1MzIgc2l6ZSA9IHNpemVvZih1MzIpOworCXUzMiBsaW5rX3N0YXR1czsKKwlpbnQgcmV0OwogCi0JcmV0dXJuIHJuZGlzX2ZpbHRlcl9xdWVyeV9kZXZpY2UoZGV2LAorCXJldCA9IHJuZGlzX2ZpbHRlcl9xdWVyeV9kZXZpY2UoZGV2LAogCQkJCSAgICAgIFJORElTX09JRF9HRU5fTUVESUFfQ09OTkVDVF9TVEFUVVMsCi0JCQkJICAgICAgJmRldi0+bGlua19zdGF0LCAmc2l6ZSk7CisJCQkJICAgICAgJmxpbmtfc3RhdHVzLCAmc2l6ZSk7CisJZGV2LT5saW5rX3N0YXRlID0gKGxpbmtfc3RhdHVzICE9IDApID8gdHJ1ZSA6IGZhbHNlOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBybmRpc19maWx0ZXJfc2V0X3BhY2tldF9maWx0ZXIoc3RydWN0IHJuZGlzX2RldmljZSAqZGV2LApAQCAtNTA2LDEzICs1MzAsMTYgQEAKIAlzdHJ1Y3Qgcm5kaXNfc2V0X2NvbXBsZXRlICpzZXRfY29tcGxldGU7CiAJdTMyIHN0YXR1czsKIAlpbnQgcmV0LCB0OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OworCisJbmRldiA9IGRldi0+bmV0X2Rldi0+bmRldjsKIAogCXJlcXVlc3QgPSBnZXRfcm5kaXNfcmVxdWVzdChkZXYsIFJFTU9URV9ORElTX1NFVF9NU0csCiAJCQlSTkRJU19NRVNTQUdFX1NJWkUoc3RydWN0IHJuZGlzX3NldF9yZXF1ZXN0KSArCiAJCQlzaXplb2YodTMyKSk7CiAJaWYgKCFyZXF1ZXN0KSB7Ci0JCXJldCA9IC0xOwotCQlnb3RvIENsZWFudXA7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gY2xlYW51cDsKIAl9CiAKIAkvKiBTZXR1cCB0aGUgcm5kaXMgc2V0ICovCkBAIC01MjYsMzAgKzU1MywyNyBAQAogCiAJcmV0ID0gcm5kaXNfZmlsdGVyX3NlbmRfcmVxdWVzdChkZXYsIHJlcXVlc3QpOwogCWlmIChyZXQgIT0gMCkKLQkJZ290byBDbGVhbnVwOworCQlnb3RvIGNsZWFudXA7CiAKIAl0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZyZXF1ZXN0LT53YWl0X2V2ZW50LCA1KkhaKTsKIAogCWlmICh0ID09IDApIHsKLQkJcmV0ID0gLTE7Ci0JCWRldl9lcnIoJmRldi0+bmV0X2Rldi0+ZGV2LT5kZXZpY2UsCisJCW5ldGRldl9lcnIobmRldiwKIAkJCSJ0aW1lb3V0IGJlZm9yZSB3ZSBnb3QgYSBzZXQgcmVzcG9uc2UuLi5cbiIpOwogCQkvKgogCQkgKiBXZSBjYW4ndCBkZWFsbG9jYXRlIHRoZSByZXF1ZXN0IHNpbmNlIHdlIG1heSBzdGlsbCByZWNlaXZlIGEKIAkJICogc2VuZCBjb21wbGV0aW9uIGZvciBpdC4KIAkJICovCi0JCWdvdG8gRXhpdDsKKwkJZ290byBleGl0OwogCX0gZWxzZSB7Ci0JCWlmIChyZXQgPiAwKQotCQkJcmV0ID0gMDsKIAkJc2V0X2NvbXBsZXRlID0gJnJlcXVlc3QtPnJlc3BvbnNlX21zZy5tc2cuc2V0X2NvbXBsZXRlOwogCQlzdGF0dXMgPSBzZXRfY29tcGxldGUtPnN0YXR1czsKIAl9CiAKLUNsZWFudXA6CitjbGVhbnVwOgogCWlmIChyZXF1ZXN0KQogCQlwdXRfcm5kaXNfcmVxdWVzdChkZXYsIHJlcXVlc3QpOwotRXhpdDoKK2V4aXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNTY1LDggKzU4OSw4IEBACiAJcmVxdWVzdCA9IGdldF9ybmRpc19yZXF1ZXN0KGRldiwgUkVNT1RFX05ESVNfSU5JVElBTElaRV9NU0csCiAJCQlSTkRJU19NRVNTQUdFX1NJWkUoc3RydWN0IHJuZGlzX2luaXRpYWxpemVfcmVxdWVzdCkpOwogCWlmICghcmVxdWVzdCkgewotCQlyZXQgPSAtMTsKLQkJZ290byBDbGVhbnVwOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJLyogU2V0dXAgdGhlIHJuZGlzIHNldCAqLwpAQCAtNTgxLDcgKzYwNSw3IEBACiAJcmV0ID0gcm5kaXNfZmlsdGVyX3NlbmRfcmVxdWVzdChkZXYsIHJlcXVlc3QpOwogCWlmIChyZXQgIT0gMCkgewogCQlkZXYtPnN0YXRlID0gUk5ESVNfREVWX1VOSU5JVElBTElaRUQ7Ci0JCWdvdG8gQ2xlYW51cDsKKwkJZ290byBjbGVhbnVwOwogCX0KIAogCkBAIC01ODksNyArNjEzLDcgQEAKIAogCWlmICh0ID09IDApIHsKIAkJcmV0ID0gLUVUSU1FRE9VVDsKLQkJZ290byBDbGVhbnVwOworCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJaW5pdF9jb21wbGV0ZSA9ICZyZXF1ZXN0LT5yZXNwb25zZV9tc2cubXNnLmluaXRfY29tcGxldGU7CkBAIC01OTksMTAgKzYyMywxMCBAQAogCQlyZXQgPSAwOwogCX0gZWxzZSB7CiAJCWRldi0+c3RhdGUgPSBSTkRJU19ERVZfVU5JTklUSUFMSVpFRDsKLQkJcmV0ID0gLTE7CisJCXJldCA9IC1FSU5WQUw7CiAJfQogCi1DbGVhbnVwOgorY2xlYW51cDoKIAlpZiAocmVxdWVzdCkKIAkJcHV0X3JuZGlzX3JlcXVlc3QoZGV2LCByZXF1ZXN0KTsKIApAQCAtNjE4LDcgKzY0Miw3IEBACiAJcmVxdWVzdCA9IGdldF9ybmRpc19yZXF1ZXN0KGRldiwgUkVNT1RFX05ESVNfSEFMVF9NU0csCiAJCQkJUk5ESVNfTUVTU0FHRV9TSVpFKHN0cnVjdCBybmRpc19oYWx0X3JlcXVlc3QpKTsKIAlpZiAoIXJlcXVlc3QpCi0JCWdvdG8gQ2xlYW51cDsKKwkJZ290byBjbGVhbnVwOwogCiAJLyogU2V0dXAgdGhlIHJuZGlzIHNldCAqLwogCWhhbHQgPSAmcmVxdWVzdC0+cmVxdWVzdF9tc2cubXNnLmhhbHRfcmVxOwpAQCAtNjI5LDcgKzY1Myw3IEBACiAKIAlkZXYtPnN0YXRlID0gUk5ESVNfREVWX1VOSU5JVElBTElaRUQ7CiAKLUNsZWFudXA6CitjbGVhbnVwOgogCWlmIChyZXF1ZXN0KQogCQlwdXRfcm5kaXNfcmVxdWVzdChkZXYsIHJlcXVlc3QpOwogCXJldHVybjsKQEAgLTY3MCwxMyArNjk0LDEzIEBACiAJCQkJICB2b2lkICphZGRpdGlvbmFsX2luZm8pCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlOwotCXN0cnVjdCBybmRpc19kZXZpY2UgKnJuZGlzRGV2aWNlOwotCXN0cnVjdCBuZXR2c2NfZGV2aWNlX2luZm8gKmRldmljZUluZm8gPSBhZGRpdGlvbmFsX2luZm87CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2U7CisJc3RydWN0IHJuZGlzX2RldmljZSAqcm5kaXNfZGV2aWNlOworCXN0cnVjdCBuZXR2c2NfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvID0gYWRkaXRpb25hbF9pbmZvOwogCi0Jcm5kaXNEZXZpY2UgPSBnZXRfcm5kaXNfZGV2aWNlKCk7Ci0JaWYgKCFybmRpc0RldmljZSkKLQkJcmV0dXJuIC0xOworCXJuZGlzX2RldmljZSA9IGdldF9ybmRpc19kZXZpY2UoKTsKKwlpZiAoIXJuZGlzX2RldmljZSkKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKgogCSAqIExldCB0aGUgaW5uZXIgZHJpdmVyIGhhbmRsZSB0aGlzIGZpcnN0IHRvIGNyZWF0ZSB0aGUgbmV0dnNjIGNoYW5uZWwKQEAgLTY4NSwxOSArNzA5LDE5IEBACiAJICovCiAJcmV0ID0gbmV0dnNjX2RldmljZV9hZGQoZGV2LCBhZGRpdGlvbmFsX2luZm8pOwogCWlmIChyZXQgIT0gMCkgewotCQlrZnJlZShybmRpc0RldmljZSk7CisJCWtmcmVlKHJuZGlzX2RldmljZSk7CiAJCXJldHVybiByZXQ7CiAJfQogCiAKIAkvKiBJbml0aWFsaXplIHRoZSBybmRpcyBkZXZpY2UgKi8KLQluZXREZXZpY2UgPSBkZXYtPmV4dDsKKwluZXRfZGV2aWNlID0gaHZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCW5ldERldmljZS0+ZXh0ZW5zaW9uID0gcm5kaXNEZXZpY2U7Ci0Jcm5kaXNEZXZpY2UtPm5ldF9kZXYgPSBuZXREZXZpY2U7CisJbmV0X2RldmljZS0+ZXh0ZW5zaW9uID0gcm5kaXNfZGV2aWNlOworCXJuZGlzX2RldmljZS0+bmV0X2RldiA9IG5ldF9kZXZpY2U7CiAKIAkvKiBTZW5kIHRoZSBybmRpcyBpbml0aWFsaXphdGlvbiBtZXNzYWdlICovCi0JcmV0ID0gcm5kaXNfZmlsdGVyX2luaXRfZGV2aWNlKHJuZGlzRGV2aWNlKTsKKwlyZXQgPSBybmRpc19maWx0ZXJfaW5pdF9kZXZpY2Uocm5kaXNfZGV2aWNlKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJLyoKIAkJICogVE9ETzogSWYgcm5kaXMgaW5pdCBmYWlsZWQsIHdlIHdpbGwgbmVlZCB0byBzaHV0IGRvd24gdGhlCkBAIC03MDYsMjkgKzczMCwyOSBAQAogCX0KIAogCS8qIEdldCB0aGUgbWFjIGFkZHJlc3MgKi8KLQlyZXQgPSBybmRpc19maWx0ZXJfcXVlcnlfZGV2aWNlX21hYyhybmRpc0RldmljZSk7CisJcmV0ID0gcm5kaXNfZmlsdGVyX3F1ZXJ5X2RldmljZV9tYWMocm5kaXNfZGV2aWNlKTsKIAlpZiAocmV0ICE9IDApIHsKIAkJLyoKIAkJICogVE9ETzogc2h1dGRvd24gcm5kaXMgZGV2aWNlIGFuZCB0aGUgY2hhbm5lbAogCQkgKi8KIAl9CiAKLQltZW1jcHkoZGV2aWNlSW5mby0+bWFjX2Fkciwgcm5kaXNEZXZpY2UtPmh3X21hY19hZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoZGV2aWNlX2luZm8tPm1hY19hZHIsIHJuZGlzX2RldmljZS0+aHdfbWFjX2FkciwgRVRIX0FMRU4pOwogCi0Jcm5kaXNfZmlsdGVyX3F1ZXJ5X2RldmljZV9saW5rX3N0YXR1cyhybmRpc0RldmljZSk7CisJcm5kaXNfZmlsdGVyX3F1ZXJ5X2RldmljZV9saW5rX3N0YXR1cyhybmRpc19kZXZpY2UpOwogCi0JZGV2aWNlSW5mby0+bGlua19zdGF0ZSA9IHJuZGlzRGV2aWNlLT5saW5rX3N0YXQ7CisJZGV2aWNlX2luZm8tPmxpbmtfc3RhdGUgPSBybmRpc19kZXZpY2UtPmxpbmtfc3RhdGU7CiAKLQlkZXZfaW5mbygmZGV2LT5kZXZpY2UsICJEZXZpY2UgTUFDICVwTSBsaW5rIHN0YXRlICVzIiwKLQkJIHJuZGlzRGV2aWNlLT5od19tYWNfYWRyLAotCQkgKChkZXZpY2VJbmZvLT5saW5rX3N0YXRlKSA/ICgiZG93blxuIikgOiAoInVwXG4iKSkpOworCWRldl9pbmZvKCZkZXYtPmRldmljZSwgIkRldmljZSBNQUMgJXBNIGxpbmsgc3RhdGUgJXNcbiIsCisJCSBybmRpc19kZXZpY2UtPmh3X21hY19hZHIsCisJCSBkZXZpY2VfaW5mby0+bGlua19zdGF0ZSA/ICJkb3duIiA6ICJ1cCIpOwogCiAJcmV0dXJuIHJldDsKIH0KIAogdm9pZCBybmRpc19maWx0ZXJfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXYgPSBkZXYtPmV4dDsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldiA9IGh2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IHJuZGlzX2RldmljZSAqcm5kaXNfZGV2ID0gbmV0X2Rldi0+ZXh0ZW5zaW9uOwogCiAJLyogSGFsdCBhbmQgcmVsZWFzZSB0aGUgcm5kaXMgZGV2aWNlICovCkBAIC03NDMsMTcgKzc2NywxNyBAQAogCiBpbnQgcm5kaXNfZmlsdGVyX29wZW4oc3RydWN0IGh2X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBuZXR2c2NfZGV2aWNlICpuZXREZXZpY2UgPSBkZXYtPmV4dDsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSA9IGh2X2dldF9kcnZkYXRhKGRldik7CiAKLQlpZiAoIW5ldERldmljZSkKKwlpZiAoIW5ldF9kZXZpY2UpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0dXJuIHJuZGlzX2ZpbHRlcl9vcGVuX2RldmljZShuZXREZXZpY2UtPmV4dGVuc2lvbik7CisJcmV0dXJuIHJuZGlzX2ZpbHRlcl9vcGVuX2RldmljZShuZXRfZGV2aWNlLT5leHRlbnNpb24pOwogfQogCiBpbnQgcm5kaXNfZmlsdGVyX2Nsb3NlKHN0cnVjdCBodl9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0RGV2aWNlID0gZGV2LT5leHQ7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldERldmljZSA9IGh2X2dldF9kcnZkYXRhKGRldik7CiAKIAlpZiAoIW5ldERldmljZSkKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvc3RvcnZzYy5jIGIvZHJpdmVycy9zdGFnaW5nL2h2L3N0b3J2c2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAyOTc4Ni4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvc3RvcnZzYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZQotICogUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuCi0gKgotICogQXV0aG9yczoKLSAqICAgSGFpeWFuZyBaaGFuZyA8aGFpeWFuZ3pAbWljcm9zb2Z0LmNvbT4KLSAqICAgSGFuayBKYW5zc2VuICA8aGphbnNzZW5AbWljcm9zb2Z0LmNvbT4KLSAqICAgSy4gWS4gU3Jpbml2YXNhbiA8a3lzQG1pY3Jvc29mdC5jb20+Ci0gKgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2luY2x1ZGUgImh5cGVydi5oIgotI2luY2x1ZGUgImh5cGVydl9zdG9yYWdlLmgiCi0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKmFsbG9jX3N0b3JfZGV2aWNlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKLXsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JfZGV2aWNlOwotCi0Jc3Rvcl9kZXZpY2UgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXN0b3JfZGV2aWNlKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIFNldCB0byAyIHRvIGFsbG93IGJvdGggaW5ib3VuZCBhbmQgb3V0Ym91bmQgdHJhZmZpY3MgKi8KLQkvKiAoaWUgZ2V0X3N0b3JfZGV2aWNlKCkgYW5kIG11c3RfZ2V0X3N0b3JfZGV2aWNlKCkpIHRvIHByb2NlZWQuICovCi0JYXRvbWljX2NtcHhjaGcoJnN0b3JfZGV2aWNlLT5yZWZfY291bnQsIDAsIDIpOwotCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmc3Rvcl9kZXZpY2UtPndhaXRpbmdfdG9fZHJhaW4pOwotCXN0b3JfZGV2aWNlLT5kZXZpY2UgPSBkZXZpY2U7Ci0JZGV2aWNlLT5leHQgPSBzdG9yX2RldmljZTsKLQotCXJldHVybiBzdG9yX2RldmljZTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGZyZWVfc3Rvcl9kZXZpY2Uoc3RydWN0IHN0b3J2c2NfZGV2aWNlICpkZXZpY2UpCi17Ci0Ja2ZyZWUoZGV2aWNlKTsKLX0KLQotLyogR2V0IHRoZSBzdG9yZGV2aWNlIG9iamVjdCBpZmYgZXhpc3RzIGFuZCBpdHMgcmVmY291bnQgPiAwICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzdG9ydnNjX2RldmljZSAqbXVzdF9nZXRfc3Rvcl9kZXZpY2UoCi0JCQkJCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKLXsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JfZGV2aWNlOwotCi0Jc3Rvcl9kZXZpY2UgPSAoc3RydWN0IHN0b3J2c2NfZGV2aWNlICopZGV2aWNlLT5leHQ7Ci0JaWYgKHN0b3JfZGV2aWNlICYmIGF0b21pY19yZWFkKCZzdG9yX2RldmljZS0+cmVmX2NvdW50KSkKLQkJYXRvbWljX2luYygmc3Rvcl9kZXZpY2UtPnJlZl9jb3VudCk7Ci0JZWxzZQotCQlzdG9yX2RldmljZSA9IE5VTEw7Ci0KLQlyZXR1cm4gc3Rvcl9kZXZpY2U7Ci19Ci0KLS8qIERyb3AgcmVmIGNvdW50IHRvIDEgdG8gZWZmZWN0aXZlbHkgZGlzYWJsZSBnZXRfc3Rvcl9kZXZpY2UoKSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnJlbGVhc2Vfc3Rvcl9kZXZpY2UoCi0JCQkJCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKLXsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JfZGV2aWNlOwotCi0Jc3Rvcl9kZXZpY2UgPSAoc3RydWN0IHN0b3J2c2NfZGV2aWNlICopZGV2aWNlLT5leHQ7Ci0KLQkvKiBCdXN5IHdhaXQgdW50aWwgdGhlIHJlZiBkcm9wIHRvIDIsIHRoZW4gc2V0IGl0IHRvIDEgKi8KLQl3aGlsZSAoYXRvbWljX2NtcHhjaGcoJnN0b3JfZGV2aWNlLT5yZWZfY291bnQsIDIsIDEpICE9IDIpCi0JCXVkZWxheSgxMDApOwotCi0JcmV0dXJuIHN0b3JfZGV2aWNlOwotfQotCi0vKiBEcm9wIHJlZiBjb3VudCB0byAwLiBObyBvbmUgY2FuIHVzZSBzdG9yX2RldmljZSBvYmplY3QuICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzdG9ydnNjX2RldmljZSAqZmluYWxfcmVsZWFzZV9zdG9yX2RldmljZSgKLQkJCXN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKLXsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JfZGV2aWNlOwotCi0Jc3Rvcl9kZXZpY2UgPSAoc3RydWN0IHN0b3J2c2NfZGV2aWNlICopZGV2aWNlLT5leHQ7Ci0KLQkvKiBCdXN5IHdhaXQgdW50aWwgdGhlIHJlZiBkcm9wIHRvIDEsIHRoZW4gc2V0IGl0IHRvIDAgKi8KLQl3aGlsZSAoYXRvbWljX2NtcHhjaGcoJnN0b3JfZGV2aWNlLT5yZWZfY291bnQsIDEsIDApICE9IDEpCi0JCXVkZWxheSgxMDApOwotCi0JZGV2aWNlLT5leHQgPSBOVUxMOwotCXJldHVybiBzdG9yX2RldmljZTsKLX0KLQotc3RhdGljIGludCBzdG9ydnNjX2NoYW5uZWxfaW5pdChzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCi17Ci0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yX2RldmljZTsKLQlzdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0ICpyZXF1ZXN0OwotCXN0cnVjdCB2c3Rvcl9wYWNrZXQgKnZzdG9yX3BhY2tldDsKLQlpbnQgcmV0LCB0OwotCi0Jc3Rvcl9kZXZpY2UgPSBnZXRfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKLQlpZiAoIXN0b3JfZGV2aWNlKQotCQlyZXR1cm4gLTE7Ci0KLQlyZXF1ZXN0ID0gJnN0b3JfZGV2aWNlLT5pbml0X3JlcXVlc3Q7Ci0JdnN0b3JfcGFja2V0ID0gJnJlcXVlc3QtPnZzdG9yX3BhY2tldDsKLQotCS8qCi0JICogTm93LCBpbml0aWF0ZSB0aGUgdnNjL3ZzcCBpbml0aWFsaXphdGlvbiBwcm90b2NvbCBvbiB0aGUgb3BlbgotCSAqIGNoYW5uZWwKLQkgKi8KLQltZW1zZXQocmVxdWVzdCwgMCwgc2l6ZW9mKHN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QpKTsKLQlpbml0X2NvbXBsZXRpb24oJnJlcXVlc3QtPndhaXRfZXZlbnQpOwotCXZzdG9yX3BhY2tldC0+b3BlcmF0aW9uID0gVlNUT1JfT1BFUkFUSU9OX0JFR0lOX0lOSVRJQUxJWkFUSU9OOwotCXZzdG9yX3BhY2tldC0+ZmxhZ3MgPSBSRVFVRVNUX0NPTVBMRVRJT05fRkxBRzsKLQotCURQUklOVF9JTkZPKFNUT1JWU0MsICJCRUdJTl9JTklUSUFMSVpBVElPTl9PUEVSQVRJT04uLi4iKTsKLQotCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoZGV2aWNlLT5jaGFubmVsLCB2c3Rvcl9wYWNrZXQsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXJlcXVlc3QsCi0JCQkgICAgICAgVk1fUEtUX0RBVEFfSU5CQU5ELAotCQkJICAgICAgIFZNQlVTX0RBVEFfUEFDS0VUX0ZMQUdfQ09NUExFVElPTl9SRVFVRVNURUQpOwotCWlmIChyZXQgIT0gMCkKLQkJZ290byBjbGVhbnVwOwotCi0JdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcmVxdWVzdC0+d2FpdF9ldmVudCwgNSpIWik7Ci0JaWYgKHQgPT0gMCkgewotCQlyZXQgPSAtRVRJTUVET1VUOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JaWYgKHZzdG9yX3BhY2tldC0+b3BlcmF0aW9uICE9IFZTVE9SX09QRVJBVElPTl9DT01QTEVURV9JTyB8fAotCSAgICB2c3Rvcl9wYWNrZXQtPnN0YXR1cyAhPSAwKQotCQlnb3RvIGNsZWFudXA7Ci0KLQlEUFJJTlRfSU5GTyhTVE9SVlNDLCAiUVVFUllfUFJPVE9DT0xfVkVSU0lPTl9PUEVSQVRJT04uLi4iKTsKLQotCS8qIHJldXNlIHRoZSBwYWNrZXQgZm9yIHZlcnNpb24gcmFuZ2Ugc3VwcG9ydGVkICovCi0JbWVtc2V0KHZzdG9yX3BhY2tldCwgMCwgc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpKTsKLQl2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbiA9IFZTVE9SX09QRVJBVElPTl9RVUVSWV9QUk9UT0NPTF9WRVJTSU9OOwotCXZzdG9yX3BhY2tldC0+ZmxhZ3MgPSBSRVFVRVNUX0NPTVBMRVRJT05fRkxBRzsKLQotCXZzdG9yX3BhY2tldC0+dmVyc2lvbi5tYWpvcl9taW5vciA9IFZNU1RPUl9QUk9UT0NPTF9WRVJTSU9OX0NVUlJFTlQ7Ci0JRklMTF9WTVNUT1JfUkVWSVNJT04odnN0b3JfcGFja2V0LT52ZXJzaW9uLnJldmlzaW9uKTsKLQotCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoZGV2aWNlLT5jaGFubmVsLCB2c3Rvcl9wYWNrZXQsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXJlcXVlc3QsCi0JCQkgICAgICAgVk1fUEtUX0RBVEFfSU5CQU5ELAotCQkJICAgICAgIFZNQlVTX0RBVEFfUEFDS0VUX0ZMQUdfQ09NUExFVElPTl9SRVFVRVNURUQpOwotCWlmIChyZXQgIT0gMCkKLQkJZ290byBjbGVhbnVwOwotCi0JdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcmVxdWVzdC0+d2FpdF9ldmVudCwgNSpIWik7Ci0JaWYgKHQgPT0gMCkgewotCQlyZXQgPSAtRVRJTUVET1VUOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JLyogVE9ETzogQ2hlY2sgcmV0dXJuZWQgdmVyc2lvbiAqLwotCWlmICh2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbiAhPSBWU1RPUl9PUEVSQVRJT05fQ09NUExFVEVfSU8gfHwKLQkgICAgdnN0b3JfcGFja2V0LT5zdGF0dXMgIT0gMCkKLQkJZ290byBjbGVhbnVwOwotCi0JLyogUXVlcnkgY2hhbm5lbCBwcm9wZXJ0aWVzICovCi0JRFBSSU5UX0lORk8oU1RPUlZTQywgIlFVRVJZX1BST1BFUlRJRVNfT1BFUkFUSU9OLi4uIik7Ci0KLQltZW1zZXQodnN0b3JfcGFja2V0LCAwLCBzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCkpOwotCXZzdG9yX3BhY2tldC0+b3BlcmF0aW9uID0gVlNUT1JfT1BFUkFUSU9OX1FVRVJZX1BST1BFUlRJRVM7Ci0JdnN0b3JfcGFja2V0LT5mbGFncyA9IFJFUVVFU1RfQ09NUExFVElPTl9GTEFHOwotCXZzdG9yX3BhY2tldC0+c3RvcmFnZV9jaGFubmVsX3Byb3BlcnRpZXMucG9ydF9udW1iZXIgPQotCQkJCQlzdG9yX2RldmljZS0+cG9ydF9udW1iZXI7Ci0KLQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KGRldmljZS0+Y2hhbm5lbCwgdnN0b3JfcGFja2V0LAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZylyZXF1ZXN0LAotCQkJICAgICAgIFZNX1BLVF9EQVRBX0lOQkFORCwKLQkJCSAgICAgICBWTUJVU19EQVRBX1BBQ0tFVF9GTEFHX0NPTVBMRVRJT05fUkVRVUVTVEVEKTsKLQotCWlmIChyZXQgIT0gMCkKLQkJZ290byBjbGVhbnVwOwotCi0JdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcmVxdWVzdC0+d2FpdF9ldmVudCwgNSpIWik7Ci0JaWYgKHQgPT0gMCkgewotCQlyZXQgPSAtRVRJTUVET1VUOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JLyogVE9ETzogQ2hlY2sgcmV0dXJuZWQgdmVyc2lvbiAqLwotCWlmICh2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbiAhPSBWU1RPUl9PUEVSQVRJT05fQ09NUExFVEVfSU8gfHwKLQkgICAgdnN0b3JfcGFja2V0LT5zdGF0dXMgIT0gMCkKLQkJZ290byBjbGVhbnVwOwotCi0Jc3Rvcl9kZXZpY2UtPnBhdGhfaWQgPSB2c3Rvcl9wYWNrZXQtPnN0b3JhZ2VfY2hhbm5lbF9wcm9wZXJ0aWVzLnBhdGhfaWQ7Ci0Jc3Rvcl9kZXZpY2UtPnRhcmdldF9pZAotCQk9IHZzdG9yX3BhY2tldC0+c3RvcmFnZV9jaGFubmVsX3Byb3BlcnRpZXMudGFyZ2V0X2lkOwotCi0JRFBSSU5UX0lORk8oU1RPUlZTQywgIkVORF9JTklUSUFMSVpBVElPTl9PUEVSQVRJT04uLi4iKTsKLQotCW1lbXNldCh2c3Rvcl9wYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSk7Ci0JdnN0b3JfcGFja2V0LT5vcGVyYXRpb24gPSBWU1RPUl9PUEVSQVRJT05fRU5EX0lOSVRJQUxJWkFUSU9OOwotCXZzdG9yX3BhY2tldC0+ZmxhZ3MgPSBSRVFVRVNUX0NPTVBMRVRJT05fRkxBRzsKLQotCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoZGV2aWNlLT5jaGFubmVsLCB2c3Rvcl9wYWNrZXQsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXJlcXVlc3QsCi0JCQkgICAgICAgVk1fUEtUX0RBVEFfSU5CQU5ELAotCQkJICAgICAgIFZNQlVTX0RBVEFfUEFDS0VUX0ZMQUdfQ09NUExFVElPTl9SRVFVRVNURUQpOwotCi0JaWYgKHJldCAhPSAwKQotCQlnb3RvIGNsZWFudXA7Ci0KLQl0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZyZXF1ZXN0LT53YWl0X2V2ZW50LCA1KkhaKTsKLQlpZiAodCA9PSAwKSB7Ci0JCXJldCA9IC1FVElNRURPVVQ7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQlpZiAodnN0b3JfcGFja2V0LT5vcGVyYXRpb24gIT0gVlNUT1JfT1BFUkFUSU9OX0NPTVBMRVRFX0lPIHx8Ci0JICAgIHZzdG9yX3BhY2tldC0+c3RhdHVzICE9IDApCi0JCWdvdG8gY2xlYW51cDsKLQotCURQUklOVF9JTkZPKFNUT1JWU0MsICIqKioqIHN0b3JhZ2UgY2hhbm5lbCB1cCBhbmQgcnVubmluZyEhICoqKioiKTsKLQotY2xlYW51cDoKLQlwdXRfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBzdG9ydnNjX29uX2lvX2NvbXBsZXRpb24oc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAotCQkJCSAgc3RydWN0IHZzdG9yX3BhY2tldCAqdnN0b3JfcGFja2V0LAotCQkJCSAgc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCAqcmVxdWVzdCkKLXsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JfZGV2aWNlOwotCXN0cnVjdCB2c3Rvcl9wYWNrZXQgKnN0b3JfcGt0OwotCi0Jc3Rvcl9kZXZpY2UgPSBtdXN0X2dldF9zdG9yX2RldmljZShkZXZpY2UpOwotCWlmICghc3Rvcl9kZXZpY2UpCi0JCXJldHVybjsKLQotCXN0b3JfcGt0ID0gJnJlcXVlc3QtPnZzdG9yX3BhY2tldDsKLQotCi0JLyogQ29weSBvdmVyIHRoZSBzdGF0dXMuLi5ldGMgKi8KLQlzdG9yX3BrdC0+dm1fc3JiLnNjc2lfc3RhdHVzID0gdnN0b3JfcGFja2V0LT52bV9zcmIuc2NzaV9zdGF0dXM7Ci0Jc3Rvcl9wa3QtPnZtX3NyYi5zcmJfc3RhdHVzID0gdnN0b3JfcGFja2V0LT52bV9zcmIuc3JiX3N0YXR1czsKLQlzdG9yX3BrdC0+dm1fc3JiLnNlbnNlX2luZm9fbGVuZ3RoID0KLQl2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zZW5zZV9pbmZvX2xlbmd0aDsKLQotCWlmICh2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zY3NpX3N0YXR1cyAhPSAwIHx8Ci0JCXZzdG9yX3BhY2tldC0+dm1fc3JiLnNyYl9zdGF0dXMgIT0gMSl7Ci0JCURQUklOVF9XQVJOKFNUT1JWU0MsCi0JCQkgICAgImNtZCAweCV4IHNjc2kgc3RhdHVzIDB4JXggc3JiIHN0YXR1cyAweCV4XG4iLAotCQkJICAgIHN0b3JfcGt0LT52bV9zcmIuY2RiWzBdLAotCQkJICAgIHZzdG9yX3BhY2tldC0+dm1fc3JiLnNjc2lfc3RhdHVzLAotCQkJICAgIHZzdG9yX3BhY2tldC0+dm1fc3JiLnNyYl9zdGF0dXMpOwotCX0KLQotCWlmICgodnN0b3JfcGFja2V0LT52bV9zcmIuc2NzaV9zdGF0dXMgJiAweEZGKSA9PSAweDAyKSB7Ci0JCS8qIENIRUNLX0NPTkRJVElPTiAqLwotCQlpZiAodnN0b3JfcGFja2V0LT52bV9zcmIuc3JiX3N0YXR1cyAmIDB4ODApIHsKLQkJCS8qIGF1dG9zZW5zZSBkYXRhIGF2YWlsYWJsZSAqLwotCQkJRFBSSU5UX1dBUk4oU1RPUlZTQywgInN0b3J2c2MgcGt0ICVwIGF1dG9zZW5zZSBkYXRhICIKLQkJCQkgICAgInZhbGlkIC0gbGVuICVkXG4iLCByZXF1ZXN0LAotCQkJCSAgICB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zZW5zZV9pbmZvX2xlbmd0aCk7Ci0KLQkJCW1lbWNweShyZXF1ZXN0LT5zZW5zZV9idWZmZXIsCi0JCQkgICAgICAgdnN0b3JfcGFja2V0LT52bV9zcmIuc2Vuc2VfZGF0YSwKLQkJCSAgICAgICB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zZW5zZV9pbmZvX2xlbmd0aCk7Ci0KLQkJfQotCX0KLQotCXN0b3JfcGt0LT52bV9zcmIuZGF0YV90cmFuc2Zlcl9sZW5ndGggPQotCXZzdG9yX3BhY2tldC0+dm1fc3JiLmRhdGFfdHJhbnNmZXJfbGVuZ3RoOwotCi0JcmVxdWVzdC0+b25faW9fY29tcGxldGlvbihyZXF1ZXN0KTsKLQotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZzdG9yX2RldmljZS0+bnVtX291dHN0YW5kaW5nX3JlcSkgJiYKLQkJc3Rvcl9kZXZpY2UtPmRyYWluX25vdGlmeSkKLQkJd2FrZV91cCgmc3Rvcl9kZXZpY2UtPndhaXRpbmdfdG9fZHJhaW4pOwotCi0KLQlwdXRfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKLX0KLQotc3RhdGljIHZvaWQgc3RvcnZzY19vbl9yZWNlaXZlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKLQkJCSAgICAgc3RydWN0IHZzdG9yX3BhY2tldCAqdnN0b3JfcGFja2V0LAotCQkJICAgICBzdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0ICpyZXF1ZXN0KQotewotCXN3aXRjaCAodnN0b3JfcGFja2V0LT5vcGVyYXRpb24pIHsKLQljYXNlIFZTVE9SX09QRVJBVElPTl9DT01QTEVURV9JTzoKLQkJc3RvcnZzY19vbl9pb19jb21wbGV0aW9uKGRldmljZSwgdnN0b3JfcGFja2V0LCByZXF1ZXN0KTsKLQkJYnJlYWs7Ci0JY2FzZSBWU1RPUl9PUEVSQVRJT05fUkVNT1ZFX0RFVklDRToKLQkJRFBSSU5UX0lORk8oU1RPUlZTQywgIlJFTU9WRV9ERVZJQ0VfT1BFUkFUSU9OIik7Ci0JCS8qIFRPRE86ICovCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJRFBSSU5UX0lORk8oU1RPUlZTQywgIlVua25vd24gb3BlcmF0aW9uIHJlY2VpdmVkIC0gJWQiLAotCQkJICAgIHZzdG9yX3BhY2tldC0+b3BlcmF0aW9uKTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBzdG9ydnNjX29uX2NoYW5uZWxfY2FsbGJhY2sodm9pZCAqY29udGV4dCkKLXsKLQlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UgPSAoc3RydWN0IGh2X2RldmljZSAqKWNvbnRleHQ7Ci0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yX2RldmljZTsKLQl1MzIgYnl0ZXNfcmVjdmQ7Ci0JdTY0IHJlcXVlc3RfaWQ7Ci0JdW5zaWduZWQgY2hhciBwYWNrZXRbQUxJR04oc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpLCA4KV07Ci0Jc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCAqcmVxdWVzdDsKLQlpbnQgcmV0OwotCi0KLQlzdG9yX2RldmljZSA9IG11c3RfZ2V0X3N0b3JfZGV2aWNlKGRldmljZSk7Ci0JaWYgKCFzdG9yX2RldmljZSkKLQkJcmV0dXJuOwotCi0JZG8gewotCQlyZXQgPSB2bWJ1c19yZWN2cGFja2V0KGRldmljZS0+Y2hhbm5lbCwgcGFja2V0LAotCQkJCSAgICAgICBBTElHTihzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCksIDgpLAotCQkJCSAgICAgICAmYnl0ZXNfcmVjdmQsICZyZXF1ZXN0X2lkKTsKLQkJaWYgKHJldCA9PSAwICYmIGJ5dGVzX3JlY3ZkID4gMCkgewotCi0JCQlyZXF1ZXN0ID0gKHN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgKikKLQkJCQkJKHVuc2lnbmVkIGxvbmcpcmVxdWVzdF9pZDsKLQotCQkJaWYgKChyZXF1ZXN0ID09ICZzdG9yX2RldmljZS0+aW5pdF9yZXF1ZXN0KSB8fAotCQkJICAgIChyZXF1ZXN0ID09ICZzdG9yX2RldmljZS0+cmVzZXRfcmVxdWVzdCkpIHsKLQotCQkJCW1lbWNweSgmcmVxdWVzdC0+dnN0b3JfcGFja2V0LCBwYWNrZXQsCi0JCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSk7Ci0JCQkJY29tcGxldGUoJnJlcXVlc3QtPndhaXRfZXZlbnQpOwotCQkJfSBlbHNlIHsKLQkJCQlzdG9ydnNjX29uX3JlY2VpdmUoZGV2aWNlLAotCQkJCQkJKHN0cnVjdCB2c3Rvcl9wYWNrZXQgKilwYWNrZXQsCi0JCQkJCQlyZXF1ZXN0KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWJyZWFrOwotCQl9Ci0JfSB3aGlsZSAoMSk7Ci0KLQlwdXRfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBpbnQgc3RvcnZzY19jb25uZWN0X3RvX3ZzcChzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsIHUzMiByaW5nX3NpemUpCi17Ci0Jc3RydWN0IHZtc3RvcmFnZV9jaGFubmVsX3Byb3BlcnRpZXMgcHJvcHM7Ci0JaW50IHJldDsKLQotCW1lbXNldCgmcHJvcHMsIDAsIHNpemVvZihzdHJ1Y3Qgdm1zdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllcykpOwotCi0JLyogT3BlbiB0aGUgY2hhbm5lbCAqLwotCXJldCA9IHZtYnVzX29wZW4oZGV2aWNlLT5jaGFubmVsLAotCQkJIHJpbmdfc2l6ZSwKLQkJCSByaW5nX3NpemUsCi0JCQkgKHZvaWQgKikmcHJvcHMsCi0JCQkgc2l6ZW9mKHN0cnVjdCB2bXN0b3JhZ2VfY2hhbm5lbF9wcm9wZXJ0aWVzKSwKLQkJCSBzdG9ydnNjX29uX2NoYW5uZWxfY2FsbGJhY2ssIGRldmljZSk7Ci0KLQlpZiAocmV0ICE9IDApCi0JCXJldHVybiAtMTsKLQotCXJldCA9IHN0b3J2c2NfY2hhbm5lbF9pbml0KGRldmljZSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgc3RvcnZzY19kZXZfYWRkKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKLQkJCQkJdm9pZCAqYWRkaXRpb25hbF9pbmZvKQotewotCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7Ci0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvOwotCWludCByZXQgPSAwOwotCi0JZGV2aWNlX2luZm8gPSAoc3RydWN0IHN0b3J2c2NfZGV2aWNlX2luZm8gKilhZGRpdGlvbmFsX2luZm87Ci0Jc3Rvcl9kZXZpY2UgPSBhbGxvY19zdG9yX2RldmljZShkZXZpY2UpOwotCWlmICghc3Rvcl9kZXZpY2UpIHsKLQkJcmV0ID0gLTE7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQkvKiBTYXZlIHRoZSBjaGFubmVsIHByb3BlcnRpZXMgdG8gb3VyIHN0b3J2c2MgY2hhbm5lbCAqLwotCi0JLyogRklYTUU6ICovCi0JLyoKLQkgKiBJZiB3ZSBzdXBwb3J0IG1vcmUgdGhhbiAxIHNjc2kgY2hhbm5lbCwgd2UgbmVlZCB0byBzZXQgdGhlCi0JICogcG9ydCBudW1iZXIgaGVyZSB0byB0aGUgc2NzaSBjaGFubmVsIGJ1dCBob3cgZG8gd2UgZ2V0IHRoZQotCSAqIHNjc2kgY2hhbm5lbCBwcmlvciB0byB0aGUgYnVzIHNjYW4KLQkgKi8KLQotCXN0b3JfZGV2aWNlLT5wb3J0X251bWJlciA9IGRldmljZV9pbmZvLT5wb3J0X251bWJlcjsKLQkvKiBTZW5kIGl0IGJhY2sgdXAgKi8KLQlyZXQgPSBzdG9ydnNjX2Nvbm5lY3RfdG9fdnNwKGRldmljZSwgZGV2aWNlX2luZm8tPnJpbmdfYnVmZmVyX3NpemUpOwotCi0JZGV2aWNlX2luZm8tPnBhdGhfaWQgPSBzdG9yX2RldmljZS0+cGF0aF9pZDsKLQlkZXZpY2VfaW5mby0+dGFyZ2V0X2lkID0gc3Rvcl9kZXZpY2UtPnRhcmdldF9pZDsKLQotY2xlYW51cDoKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgc3RvcnZzY19kZXZfcmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKLXsKLQlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JfZGV2aWNlOwotCi0JRFBSSU5UX0lORk8oU1RPUlZTQywgImRpc2FibGluZyBzdG9yYWdlIGRldmljZSAoJXApLi4uIiwKLQkJICAgIGRldmljZS0+ZXh0KTsKLQotCXN0b3JfZGV2aWNlID0gcmVsZWFzZV9zdG9yX2RldmljZShkZXZpY2UpOwotCi0JLyoKLQkgKiBBdCB0aGlzIHBvaW50LCBhbGwgb3V0Ym91bmQgdHJhZmZpYyBzaG91bGQgYmUgZGlzYWJsZS4gV2UKLQkgKiBvbmx5IGFsbG93IGluYm91bmQgdHJhZmZpYyAocmVzcG9uc2VzKSB0byBwcm9jZWVkIHNvIHRoYXQKLQkgKiBvdXRzdGFuZGluZyByZXF1ZXN0cyBjYW4gYmUgY29tcGxldGVkLgotCSAqLwotCi0Jc3RvcnZzY193YWl0X3RvX2RyYWluKHN0b3JfZGV2aWNlKTsKLQotCXN0b3JfZGV2aWNlID0gZmluYWxfcmVsZWFzZV9zdG9yX2RldmljZShkZXZpY2UpOwotCi0JLyogQ2xvc2UgdGhlIGNoYW5uZWwgKi8KLQl2bWJ1c19jbG9zZShkZXZpY2UtPmNoYW5uZWwpOwotCi0JZnJlZV9zdG9yX2RldmljZShzdG9yX2RldmljZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBzdG9ydnNjX2RvX2lvKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKLQkJCSAgICAgIHN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgKnJlcXVlc3QpCi17Ci0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yX2RldmljZTsKLQlzdHJ1Y3QgdnN0b3JfcGFja2V0ICp2c3Rvcl9wYWNrZXQ7Ci0JaW50IHJldCA9IDA7Ci0KLQl2c3Rvcl9wYWNrZXQgPSAmcmVxdWVzdC0+dnN0b3JfcGFja2V0OwotCXN0b3JfZGV2aWNlID0gZ2V0X3N0b3JfZGV2aWNlKGRldmljZSk7Ci0KLQlpZiAoIXN0b3JfZGV2aWNlKQotCQlyZXR1cm4gLTI7Ci0KLQotCXJlcXVlc3QtPmRldmljZSAgPSBkZXZpY2U7Ci0KLQotCXZzdG9yX3BhY2tldC0+ZmxhZ3MgfD0gUkVRVUVTVF9DT01QTEVUSU9OX0ZMQUc7Ci0KLQl2c3Rvcl9wYWNrZXQtPnZtX3NyYi5sZW5ndGggPSBzaXplb2Yoc3RydWN0IHZtc2NzaV9yZXF1ZXN0KTsKLQotCi0JdnN0b3JfcGFja2V0LT52bV9zcmIuc2Vuc2VfaW5mb19sZW5ndGggPSBTRU5TRV9CVUZGRVJfU0laRTsKLQotCi0JdnN0b3JfcGFja2V0LT52bV9zcmIuZGF0YV90cmFuc2Zlcl9sZW5ndGggPQotCXJlcXVlc3QtPmRhdGFfYnVmZmVyLmxlbjsKLQotCXZzdG9yX3BhY2tldC0+b3BlcmF0aW9uID0gVlNUT1JfT1BFUkFUSU9OX0VYRUNVVEVfU1JCOwotCi0JaWYgKHJlcXVlc3QtPmRhdGFfYnVmZmVyLmxlbikgewotCQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0X211bHRpcGFnZWJ1ZmZlcihkZXZpY2UtPmNoYW5uZWwsCi0JCQkJJnJlcXVlc3QtPmRhdGFfYnVmZmVyLAotCQkJCXZzdG9yX3BhY2tldCwKLQkJCQlzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCksCi0JCQkJKHVuc2lnbmVkIGxvbmcpcmVxdWVzdCk7Ci0JfSBlbHNlIHsKLQkJcmV0ID0gdm1idXNfc2VuZHBhY2tldChkZXZpY2UtPmNoYW5uZWwsIHZzdG9yX3BhY2tldCwKLQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZylyZXF1ZXN0LAotCQkJCSAgICAgICBWTV9QS1RfREFUQV9JTkJBTkQsCi0JCQkJICAgICAgIFZNQlVTX0RBVEFfUEFDS0VUX0ZMQUdfQ09NUExFVElPTl9SRVFVRVNURUQpOwotCX0KLQotCWlmIChyZXQgIT0gMCkKLQkJcmV0dXJuIHJldDsKLQotCWF0b21pY19pbmMoJnN0b3JfZGV2aWNlLT5udW1fb3V0c3RhbmRpbmdfcmVxKTsKLQotCXB1dF9zdG9yX2RldmljZShkZXZpY2UpOwotCXJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBUaGUgY2hhbm5lbCBwcm9wZXJ0aWVzIHVuaXF1ZWx5IHNwZWNpZnkgaG93IHRoZSBkZXZpY2UgaXMgdG8gYmUKLSAqIHByZXNlbnRlZCB0byB0aGUgZ3Vlc3QuIE1hcCB0aGlzIGluZm9ybWF0aW9uIGZvciB1c2UgYnkgdGhlIGJsb2NrCi0gKiBkcml2ZXIuIEZvciBMaW51eCBndWVzdHMgb24gSHlwZXItViwgd2UgZW11bGF0ZSBhIHNjc2kgSEJBIGluIHRoZSBndWVzdAotICogKHN0b3J2c2NfZHJ2KSBhbmQgc28gc2NzaSBkZXZpY2VzIGluIHRoZSBndWVzdCAgYXJlIGhhbmRsZWQgYnkKLSAqIG5hdGl2ZSB1cHBlciBsZXZlbCBMaW51eCBkcml2ZXJzLiBDb25zZXF1ZW50bHksIEh5cGVyLVYKLSAqIGJsb2NrIGRyaXZlciwgd2hpbGUgYmVpbmcgYSBnZW5lcmljIGJsb2NrIGRyaXZlciwgcHJlc2VudGx5IGRvZXMgbm90Ci0gKiBkZWFsIHdpdGggYW55dGhpbmcgb3RoZXIgdGhhbiBkZXZpY2VzIHRoYXQgd291bGQgbmVlZCB0byBiZSBwcmVzZW50ZWQKLSAqIHRvIHRoZSBndWVzdCBhcyBhbiBJREUgZGlzay4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIG1hcHMgdGhlIGNoYW5uZWwgcHJvcGVydGllcyBhcyBlbWJlZGRlZCBpbiB0aGUgaW5wdXQKLSAqIHBhcmFtZXRlciBkZXZpY2VfaW5mbyBvbnRvIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byByZWdpc3RlciB0aGUKLSAqIGNvcnJlc3BvbmRpbmcgYmxvY2sgZGV2aWNlLgotICoKLSAqIEN1cnJlbnRseSwgdGhlcmUgaXMgbm8gd2F5IHRvIHN0b3AgdGhlIGVtdWxhdGlvbiBvZiB0aGUgYmxvY2sgZGV2aWNlCi0gKiBvbiB0aGUgaG9zdCBzaWRlLiBBbmQgc28sIHRvIHByZXZlbnQgdGhlIG5hdGl2ZSBJREUgZHJpdmVycyBpbiBMaW51eAotICogZnJvbSB0YWtpbmcgb3ZlciB0aGVzZSBkZXZpY2VzICh0byBiZSBtYW5hZ2VkYnkgSHlwZXItViBibG9jawotICogZHJpdmVyKSwgd2Ugd2lsbCB0YWtlIG92ZXIgaWYgbmVlZCBiZSB0aGUgbWFqb3Igb2YgdGhlIElERSBjb250cm9sbGVycy4KLSAqCi0gKi8KLQotaW50IHN0b3J2c2NfZ2V0X21ham9yX2luZm8oc3RydWN0IHN0b3J2c2NfZGV2aWNlX2luZm8gKmRldmljZV9pbmZvLAotCQkJICAgIHN0cnVjdCBzdG9ydnNjX21ham9yX2luZm8gKm1ham9yX2luZm8pCi17Ci0Jc3RhdGljIGJvb2wgaWRlMF9yZWdpc3RlcmVkOwotCXN0YXRpYyBib29sIGlkZTFfcmVnaXN0ZXJlZDsKLQotCS8qCi0JICogRm9yIG5vdyB3ZSBvbmx5IHN1cHBvcnQgSURFIGRpc2tzLgotCSAqLwotCW1ham9yX2luZm8tPmRldm5hbWUgPSAiaWRlIjsKLQltYWpvcl9pbmZvLT5kaXNrbmFtZSA9ICJoZCI7Ci0KLQlpZiAoZGV2aWNlX2luZm8tPnBhdGhfaWQpIHsKLQkJbWFqb3JfaW5mby0+bWFqb3IgPSAyMjsKLQkJaWYgKCFpZGUxX3JlZ2lzdGVyZWQpIHsKLQkJCW1ham9yX2luZm8tPmRvX3JlZ2lzdGVyID0gdHJ1ZTsKLQkJCWlkZTFfcmVnaXN0ZXJlZCA9IHRydWU7Ci0JCX0gZWxzZQotCQkJbWFqb3JfaW5mby0+ZG9fcmVnaXN0ZXIgPSBmYWxzZTsKLQotCQlpZiAoZGV2aWNlX2luZm8tPnRhcmdldF9pZCkKLQkJCW1ham9yX2luZm8tPmluZGV4ID0gMzsKLQkJZWxzZQotCQkJbWFqb3JfaW5mby0+aW5kZXggPSAyOwotCi0JCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCW1ham9yX2luZm8tPm1ham9yID0gMzsKLQkJaWYgKCFpZGUwX3JlZ2lzdGVyZWQpIHsKLQkJCW1ham9yX2luZm8tPmRvX3JlZ2lzdGVyID0gdHJ1ZTsKLQkJCWlkZTBfcmVnaXN0ZXJlZCA9IHRydWU7Ci0JCX0gZWxzZQotCQkJbWFqb3JfaW5mby0+ZG9fcmVnaXN0ZXIgPSBmYWxzZTsKLQotCQlpZiAoZGV2aWNlX2luZm8tPnRhcmdldF9pZCkKLQkJCW1ham9yX2luZm8tPmluZGV4ID0gMTsKLQkJZWxzZQotCQkJbWFqb3JfaW5mby0+aW5kZXggPSAwOwotCi0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiAtRU5PREVWOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvc3RvcnZzY19kcnYuYyBiL2RyaXZlcnMvc3RhZ2luZy9odi9zdG9ydnNjX2Rydi5jCmluZGV4IDdlZmZhZjMuLmFlOGMzM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9odi9zdG9ydnNjX2Rydi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9odi9zdG9ydnNjX2Rydi5jCkBAIC0xOSwxMiArMTksMTkgQEAKICAqICAgSGFuayBKYW5zc2VuICA8aGphbnNzZW5AbWljcm9zb2Z0LmNvbT4KICAqICAgSy4gWS4gU3Jpbml2YXNhbiA8a3lzQG1pY3Jvc29mdC5jb20+CiAgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9oeXBlcnYuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CkBAIC0zNCwyMiArNDEsMjQ3IEBACiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmluZm8uaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfZGJnLmg+CiAKLSNpbmNsdWRlICJoeXBlcnYuaCIKLSNpbmNsdWRlICJoeXBlcnZfc3RvcmFnZS5oIgogCisjZGVmaW5lIFNUT1JWU0NfUklOR19CVUZGRVJfU0laRQkJCSgyMCpQQUdFX1NJWkUpCiBzdGF0aWMgaW50IHN0b3J2c2NfcmluZ2J1ZmZlcl9zaXplID0gU1RPUlZTQ19SSU5HX0JVRkZFUl9TSVpFOwogCiBtb2R1bGVfcGFyYW0oc3RvcnZzY19yaW5nYnVmZmVyX3NpemUsIGludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKHN0b3J2c2NfcmluZ2J1ZmZlcl9zaXplLCAiUmluZyBidWZmZXIgc2l6ZSAoYnl0ZXMpIik7CiAKLXN0YXRpYyBjb25zdCBjaGFyICpkcml2ZXJfbmFtZSA9ICJzdG9ydnNjIjsKKy8qIHRvIGFsZXJ0IHRoZSB1c2VyIHRoYXQgc3RydWN0dXJlIHNpemVzIG1heSBiZSBtaXNtYXRjaGVkIGV2ZW4gdGhvdWdoIHRoZSAqLworLyogcHJvdG9jb2wgdmVyc2lvbnMgbWF0Y2guICovCiAKLS8qIHtiYTYxNjNkOS0wNGExLTRkMjktYjYwNS03MmUyZmZiMWRjN2Z9ICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGh2X2d1aWQgc3Rvcl92c2NpX2RldmljZV90eXBlID0gewotCS5kYXRhID0gewotCQkweGQ5LCAweDYzLCAweDYxLCAweGJhLCAweGExLCAweDA0LCAweDI5LCAweDRkLAotCQkweGI2LCAweDA1LCAweDcyLCAweGUyLCAweGZmLCAweGIxLCAweGRjLCAweDdmCi0JfQorCisjZGVmaW5lIFJFVklTSU9OX1NUUklORyhSRVZJU0lPTl8pICNSRVZJU0lPTl8KKyNkZWZpbmUgRklMTF9WTVNUT1JfUkVWSVNJT04oUkVTVUxUX0xWQUxVRV8pCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWNoYXIgKnJldmlzaW9uX3N0cmluZwkJCQkJXAorCQkJPSBSRVZJU0lPTl9TVFJJTkcoJFJldiA6IDYgJCkgKyA2OwkJXAorCQlSRVNVTFRfTFZBTFVFXyA9IDA7CQkJCQlcCisJCXdoaWxlICgqcmV2aXNpb25fc3RyaW5nID49ICcwJwkJCQlcCisJCQkmJiAqcmV2aXNpb25fc3RyaW5nIDw9ICc5JykgewkJCVwKKwkJCVJFU1VMVF9MVkFMVUVfICo9IDEwOwkJCQlcCisJCQlSRVNVTFRfTFZBTFVFXyArPSAqcmV2aXNpb25fc3RyaW5nIC0gJzAnOwlcCisJCQlyZXZpc2lvbl9zdHJpbmcrKzsJCQkJXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgwKQorCisvKiBNYWpvci9taW5vciBtYWNyb3MuICBNaW5vciB2ZXJzaW9uIGlzIGluIExTQiwgbWVhbmluZyB0aGF0IGVhcmxpZXIgZmxhdCAqLworLyogdmVyc2lvbiBudW1iZXJzIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgIjAueCIgKGkuZS4sIDEgYmVjb21lcyAwLjEpLiAqLworI2RlZmluZSBWTVNUT1JfUFJPVE9DT0xfTUFKT1IoVkVSU0lPTl8pCQkoKChWRVJTSU9OXykgPj4gOCkgJiAweGZmKQorI2RlZmluZSBWTVNUT1JfUFJPVE9DT0xfTUlOT1IoVkVSU0lPTl8pCQkoKChWRVJTSU9OXykpICAgICAgJiAweGZmKQorI2RlZmluZSBWTVNUT1JfUFJPVE9DT0xfVkVSU0lPTihNQUpPUl8sIE1JTk9SXykJKCgoKE1BSk9SXykgJiAweGZmKSA8PCA4KSB8IFwKKwkJCQkJCSAoKChNSU5PUl8pICYgMHhmZikpKQorI2RlZmluZSBWTVNUT1JfSU5WQUxJRF9QUk9UT0NPTF9WRVJTSU9OCQkoLTEpCisKKy8qIFZlcnNpb24gaGlzdG9yeTogKi8KKy8qIFYxIEJldGEgICAgICAgICAgICAgICAgICAgIDAuMSAqLworLyogVjEgUkMgPCAyMDA4LzEvMzEgICAgICAgICAgMS4wICovCisvKiBWMSBSQyA+IDIwMDgvMS8zMSAgICAgICAgICAyLjAgKi8KKyNkZWZpbmUgVk1TVE9SX1BST1RPQ09MX1ZFUlNJT05fQ1VSUkVOVCBWTVNUT1JfUFJPVE9DT0xfVkVSU0lPTigyLCAwKQorCisKKworCisvKiAgVGhpcyB3aWxsIGdldCByZXBsYWNlZCB3aXRoIHRoZSBtYXggdHJhbnNmZXIgbGVuZ3RoIHRoYXQgaXMgcG9zc2libGUgb24gKi8KKy8qICB0aGUgaG9zdCBhZGFwdGVyLiAqLworLyogIFRoZSBtYXggdHJhbnNmZXIgbGVuZ3RoIHdpbGwgYmUgcHVibGlzaGVkIHdoZW4gd2Ugb2ZmZXIgYSB2bWJ1cyBjaGFubmVsLiAqLworI2RlZmluZSBNQVhfVFJBTlNGRVJfTEVOR1RICTB4NDAwMDAKKyNkZWZpbmUgREVGQVVMVF9QQUNLRVRfU0laRSAoc2l6ZW9mKHN0cnVjdCB2bWRhdGFfZ3BhX2RpcmVjdCkgKwlcCisJCQlzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCkgKwkJXAorCQkJc2l6ZXNpemVvZih1NjQpICogKE1BWF9UUkFOU0ZFUl9MRU5HVEggLyBQQUdFX1NJWkUpKSkKKworCisvKiAgUGFja2V0IHN0cnVjdHVyZSBkZXNjcmliaW5nIHZpcnR1YWwgc3RvcmFnZSByZXF1ZXN0cy4gKi8KK2VudW0gdnN0b3JfcGFja2V0X29wZXJhdGlvbiB7CisJVlNUT1JfT1BFUkFUSU9OX0NPTVBMRVRFX0lPCQk9IDEsCisJVlNUT1JfT1BFUkFUSU9OX1JFTU9WRV9ERVZJQ0UJCT0gMiwKKwlWU1RPUl9PUEVSQVRJT05fRVhFQ1VURV9TUkIJCT0gMywKKwlWU1RPUl9PUEVSQVRJT05fUkVTRVRfTFVOCQk9IDQsCisJVlNUT1JfT1BFUkFUSU9OX1JFU0VUX0FEQVBURVIJCT0gNSwKKwlWU1RPUl9PUEVSQVRJT05fUkVTRVRfQlVTCQk9IDYsCisJVlNUT1JfT1BFUkFUSU9OX0JFR0lOX0lOSVRJQUxJWkFUSU9OCT0gNywKKwlWU1RPUl9PUEVSQVRJT05fRU5EX0lOSVRJQUxJWkFUSU9OCT0gOCwKKwlWU1RPUl9PUEVSQVRJT05fUVVFUllfUFJPVE9DT0xfVkVSU0lPTgk9IDksCisJVlNUT1JfT1BFUkFUSU9OX1FVRVJZX1BST1BFUlRJRVMJPSAxMCwKKwlWU1RPUl9PUEVSQVRJT05fTUFYSU1VTQkJCT0gMTAKK307CisKKy8qCisgKiBQbGF0Zm9ybSBuZXV0cmFsIGRlc2NyaXB0aW9uIG9mIGEgc2NzaSByZXF1ZXN0IC0KKyAqIHRoaXMgcmVtYWlucyB0aGUgc2FtZSBhY3Jvc3MgdGhlIHdyaXRlIHJlZ2FyZGxlc3Mgb2YgMzIvNjQgYml0CisgKiBub3RlOiBpdCdzIHBhdHRlcm5lZCBvZmYgdGhlIFNDU0lfUEFTU19USFJPVUdIIHN0cnVjdHVyZQorICovCisjZGVmaW5lIENEQjE2R0VORVJJQ19MRU5HVEgJCQkweDEwCisKKyNpZm5kZWYgU0VOU0VfQlVGRkVSX1NJWkUKKyNkZWZpbmUgU0VOU0VfQlVGRkVSX1NJWkUJCQkweDEyCisjZW5kaWYKKworI2RlZmluZSBNQVhfREFUQV9CVUZfTEVOX1dJVEhfUEFERElORwkJMHgxNAorCitzdHJ1Y3Qgdm1zY3NpX3JlcXVlc3QgeworCXVuc2lnbmVkIHNob3J0IGxlbmd0aDsKKwl1bnNpZ25lZCBjaGFyIHNyYl9zdGF0dXM7CisJdW5zaWduZWQgY2hhciBzY3NpX3N0YXR1czsKKworCXVuc2lnbmVkIGNoYXIgcG9ydF9udW1iZXI7CisJdW5zaWduZWQgY2hhciBwYXRoX2lkOworCXVuc2lnbmVkIGNoYXIgdGFyZ2V0X2lkOworCXVuc2lnbmVkIGNoYXIgbHVuOworCisJdW5zaWduZWQgY2hhciBjZGJfbGVuZ3RoOworCXVuc2lnbmVkIGNoYXIgc2Vuc2VfaW5mb19sZW5ndGg7CisJdW5zaWduZWQgY2hhciBkYXRhX2luOworCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWQ7CisKKwl1bnNpZ25lZCBpbnQgZGF0YV90cmFuc2Zlcl9sZW5ndGg7CisKKwl1bmlvbiB7CisJCXVuc2lnbmVkIGNoYXIgY2RiW0NEQjE2R0VORVJJQ19MRU5HVEhdOworCQl1bnNpZ25lZCBjaGFyIHNlbnNlX2RhdGFbU0VOU0VfQlVGRkVSX1NJWkVdOworCQl1bnNpZ25lZCBjaGFyIHJlc2VydmVkX2FycmF5W01BWF9EQVRBX0JVRl9MRU5fV0lUSF9QQURESU5HXTsKKwl9OworfSBfX2F0dHJpYnV0ZSgocGFja2VkKSk7CisKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHNlbnQgZHVyaW5nIHRoZSBpbnRpYWxpemF0aW9uIHBoYXNlIHRvIGdldCB0aGUgZGlmZmVyZW50CisgKiBwcm9wZXJ0aWVzIG9mIHRoZSBjaGFubmVsLgorICovCitzdHJ1Y3Qgdm1zdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllcyB7CisJdW5zaWduZWQgc2hvcnQgcHJvdG9jb2xfdmVyc2lvbjsKKwl1bnNpZ25lZCBjaGFyIHBhdGhfaWQ7CisJdW5zaWduZWQgY2hhciB0YXJnZXRfaWQ7CisKKwkvKiBOb3RlOiBwb3J0IG51bWJlciBpcyBvbmx5IHJlYWxseSBrbm93biBvbiB0aGUgY2xpZW50IHNpZGUgKi8KKwl1bnNpZ25lZCBpbnQgcG9ydF9udW1iZXI7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXVuc2lnbmVkIGludCBtYXhfdHJhbnNmZXJfYnl0ZXM7CisKKwkvKiAgVGhpcyBpZCBpcyB1bmlxdWUgZm9yIGVhY2ggY2hhbm5lbCBhbmQgd2lsbCBjb3JyZXNwb25kIHdpdGggKi8KKwkvKiAgdmVuZG9yIHNwZWNpZmljIGRhdGEgaW4gdGhlIGlucXVpcnlkYXRhICovCisJdW5zaWduZWQgbG9uZyBsb25nIHVuaXF1ZV9pZDsKK30gX19wYWNrZWQ7CisKKy8qICBUaGlzIHN0cnVjdHVyZSBpcyBzZW50IGR1cmluZyB0aGUgc3RvcmFnZSBwcm90b2NvbCBuZWdvdGlhdGlvbnMuICovCitzdHJ1Y3Qgdm1zdG9yYWdlX3Byb3RvY29sX3ZlcnNpb24geworCS8qIE1ham9yIChNU1cpIGFuZCBtaW5vciAoTFNXKSB2ZXJzaW9uIG51bWJlcnMuICovCisJdW5zaWduZWQgc2hvcnQgbWFqb3JfbWlub3I7CisKKwkvKgorCSAqIFJldmlzaW9uIG51bWJlciBpcyBhdXRvLWluY3JlbWVudGVkIHdoZW5ldmVyIHRoaXMgZmlsZSBpcyBjaGFuZ2VkCisJICogKFNlZSBGSUxMX1ZNU1RPUl9SRVZJU0lPTiBtYWNybyBhYm92ZSkuICBNaXNtYXRjaCBkb2VzIG5vdAorCSAqIGRlZmluaXRlbHkgaW5kaWNhdGUgaW5jb21wYXRpYmlsaXR5LS1idXQgaXQgZG9lcyBpbmRpY2F0ZSBtaXNtYXRjaGVkCisJICogYnVpbGRzLgorCSAqLworCXVuc2lnbmVkIHNob3J0IHJldmlzaW9uOworfSBfX3BhY2tlZDsKKworLyogQ2hhbm5lbCBQcm9wZXJ0eSBGbGFncyAqLworI2RlZmluZSBTVE9SQUdFX0NIQU5ORUxfUkVNT1ZBQkxFX0ZMQUcJCTB4MQorI2RlZmluZSBTVE9SQUdFX0NIQU5ORUxfRU1VTEFURURfSURFX0ZMQUcJMHgyCisKK3N0cnVjdCB2c3Rvcl9wYWNrZXQgeworCS8qIFJlcXVlc3RlZCBvcGVyYXRpb24gdHlwZSAqLworCWVudW0gdnN0b3JfcGFja2V0X29wZXJhdGlvbiBvcGVyYXRpb247CisKKwkvKiAgRmxhZ3MgLSBzZWUgYmVsb3cgZm9yIHZhbHVlcyAqLworCXVuc2lnbmVkIGludCBmbGFnczsKKworCS8qIFN0YXR1cyBvZiB0aGUgcmVxdWVzdCByZXR1cm5lZCBmcm9tIHRoZSBzZXJ2ZXIgc2lkZS4gKi8KKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJLyogRGF0YSBwYXlsb2FkIGFyZWEgKi8KKwl1bmlvbiB7CisJCS8qCisJCSAqIFN0cnVjdHVyZSB1c2VkIHRvIGZvcndhcmQgU0NTSSBjb21tYW5kcyBmcm9tIHRoZQorCQkgKiBjbGllbnQgdG8gdGhlIHNlcnZlci4KKwkJICovCisJCXN0cnVjdCB2bXNjc2lfcmVxdWVzdCB2bV9zcmI7CisKKwkJLyogU3RydWN0dXJlIHVzZWQgdG8gcXVlcnkgY2hhbm5lbCBwcm9wZXJ0aWVzLiAqLworCQlzdHJ1Y3Qgdm1zdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllcyBzdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllczsKKworCQkvKiBVc2VkIGR1cmluZyB2ZXJzaW9uIG5lZ290aWF0aW9ucy4gKi8KKwkJc3RydWN0IHZtc3RvcmFnZV9wcm90b2NvbF92ZXJzaW9uIHZlcnNpb247CisJfTsKK30gX19wYWNrZWQ7CisKKy8qIFBhY2tldCBmbGFncyAqLworLyoKKyAqIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgc2VydmVyIHNob3VsZCBzZW5kIGJhY2sgYSBjb21wbGV0aW9uIGZvciB0aGlzCisgKiBwYWNrZXQuCisgKi8KKyNkZWZpbmUgUkVRVUVTVF9DT01QTEVUSU9OX0ZMQUcJMHgxCisKKy8qICBUaGlzIGlzIHRoZSBzZXQgb2YgZmxhZ3MgdGhhdCB0aGUgdnNjIGNhbiBzZXQgaW4gYW55IHBhY2tldHMgaXQgc2VuZHMgKi8KKyNkZWZpbmUgVlNDX0xFR0FMX0ZMQUdTCQkoUkVRVUVTVF9DT01QTEVUSU9OX0ZMQUcpCisKKworLyogRGVmaW5lcyAqLworCisjZGVmaW5lIFNUT1JWU0NfTUFYX0lPX1JFUVVFU1RTCQkJCTEyOAorCisvKgorICogSW4gSHlwZXItViwgZWFjaCBwb3J0L3BhdGgvdGFyZ2V0IG1hcHMgdG8gMSBzY3NpIGhvc3QgYWRhcHRlci4gIEluCisgKiByZWFsaXR5LCB0aGUgcGF0aC90YXJnZXQgaXMgbm90IHVzZWQgKGllIGFsd2F5cyBzZXQgdG8gMCkgc28gb3VyCisgKiBzY3NpIGhvc3QgYWRhcHRlciBlc3NlbnRpYWxseSBoYXMgMSBidXMgd2l0aCAxIHRhcmdldCB0aGF0IGNvbnRhaW5zCisgKiB1cCB0byAyNTYgbHVucy4KKyAqLworI2RlZmluZSBTVE9SVlNDX01BWF9MVU5TX1BFUl9UQVJHRVQJCQk2NAorI2RlZmluZSBTVE9SVlNDX01BWF9UQVJHRVRTCQkJCTEKKyNkZWZpbmUgU1RPUlZTQ19NQVhfQ0hBTk5FTFMJCQkJMQorI2RlZmluZSBTVE9SVlNDX01BWF9DTURfTEVOCQkJCTE2CisKK3N0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3Q7CisKKy8qIE1hdGNoZXMgV2luZG93cy1lbmQgKi8KK2VudW0gc3RvcnZzY19yZXF1ZXN0X3R5cGUgeworCVdSSVRFX1RZUEUsCisJUkVBRF9UWVBFLAorCVVOS05PV05fVFlQRSwKK307CisKKworc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCB7CisJc3RydWN0IGh2X2RldmljZSAqZGV2aWNlOworCisJLyogU3luY2hyb25pemUgdGhlIHJlcXVlc3QvcmVzcG9uc2UgaWYgbmVlZGVkICovCisJc3RydWN0IGNvbXBsZXRpb24gd2FpdF9ldmVudDsKKworCXVuc2lnbmVkIGNoYXIgKnNlbnNlX2J1ZmZlcjsKKwl2b2lkICpjb250ZXh0OworCXZvaWQgKCpvbl9pb19jb21wbGV0aW9uKShzdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0ICpyZXF1ZXN0KTsKKwlzdHJ1Y3QgaHZfbXVsdGlwYWdlX2J1ZmZlciBkYXRhX2J1ZmZlcjsKKworCXN0cnVjdCB2c3Rvcl9wYWNrZXQgdnN0b3JfcGFja2V0OworfTsKKworCisvKiBBIHN0b3J2c2MgZGV2aWNlIGlzIGEgZGV2aWNlIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgdm1idXMgY2hhbm5lbCAqLworc3RydWN0IHN0b3J2c2NfZGV2aWNlIHsKKwlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2U7CisKKwlib29sCSBkZXN0cm95OworCWJvb2wJIGRyYWluX25vdGlmeTsKKwlhdG9taWNfdCBudW1fb3V0c3RhbmRpbmdfcmVxOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0aW5nX3RvX2RyYWluOworCisJLyoKKwkgKiBFYWNoIHVuaXF1ZSBQb3J0L1BhdGgvVGFyZ2V0IHJlcHJlc2VudHMgMSBjaGFubmVsIGllIHNjc2kKKwkgKiBjb250cm9sbGVyLiBJbiByZWFsaXR5LCB0aGUgcGF0aGlkLCB0YXJnZXRpZCBpcyBhbHdheXMgMAorCSAqIGFuZCB0aGUgcG9ydCBpcyBzZXQgYnkgdXMKKwkgKi8KKwl1bnNpZ25lZCBpbnQgcG9ydF9udW1iZXI7CisJdW5zaWduZWQgY2hhciBwYXRoX2lkOworCXVuc2lnbmVkIGNoYXIgdGFyZ2V0X2lkOworCisJLyogVXNlZCBmb3IgdnNjL3ZzcCBjaGFubmVsIHJlc2V0IHByb2Nlc3MgKi8KKwlzdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0IGluaXRfcmVxdWVzdDsKKwlzdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0IHJlc2V0X3JlcXVlc3Q7CiB9OwogCiBzdHJ1Y3QgaHZfaG9zdF9kZXZpY2UgewpAQCAtNzAsNiArMzAyLDQzMCBAQAogCXN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgcmVxdWVzdDsKIH07CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN0b3J2c2NfZGV2aWNlICpnZXRfb3V0X3N0b3JfZGV2aWNlKAorCQkJCQlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yX2RldmljZTsKKworCXN0b3JfZGV2aWNlID0gaHZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKKworCWlmIChzdG9yX2RldmljZSAmJiBzdG9yX2RldmljZS0+ZGVzdHJveSkKKwkJc3Rvcl9kZXZpY2UgPSBOVUxMOworCisJcmV0dXJuIHN0b3JfZGV2aWNlOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9ydnNjX3dhaXRfdG9fZHJhaW4oc3RydWN0IHN0b3J2c2NfZGV2aWNlICpkZXYpCit7CisJZGV2LT5kcmFpbl9ub3RpZnkgPSB0cnVlOworCXdhaXRfZXZlbnQoZGV2LT53YWl0aW5nX3RvX2RyYWluLAorCQkgICBhdG9taWNfcmVhZCgmZGV2LT5udW1fb3V0c3RhbmRpbmdfcmVxKSA9PSAwKTsKKwlkZXYtPmRyYWluX25vdGlmeSA9IGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzdG9ydnNjX2RldmljZSAqZ2V0X2luX3N0b3JfZGV2aWNlKAorCQkJCQlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yX2RldmljZTsKKworCXN0b3JfZGV2aWNlID0gaHZfZ2V0X2RydmRhdGEoZGV2aWNlKTsKKworCWlmICghc3Rvcl9kZXZpY2UpCisJCWdvdG8gZ2V0X2luX2VycjsKKworCS8qCisJICogSWYgdGhlIGRldmljZSBpcyBiZWluZyBkZXN0cm95ZWQ7IGFsbG93IGluY29taW5nCisJICogdHJhZmZpYyBvbmx5IHRvIGNsZWFudXAgb3V0c3RhbmRpbmcgcmVxdWVzdHMuCisJICovCisKKwlpZiAoc3Rvcl9kZXZpY2UtPmRlc3Ryb3kgICYmCisJCShhdG9taWNfcmVhZCgmc3Rvcl9kZXZpY2UtPm51bV9vdXRzdGFuZGluZ19yZXEpID09IDApKQorCQlzdG9yX2RldmljZSA9IE5VTEw7CisKK2dldF9pbl9lcnI6CisJcmV0dXJuIHN0b3JfZGV2aWNlOworCit9CisKK3N0YXRpYyBpbnQgc3RvcnZzY19jaGFubmVsX2luaXQoc3RydWN0IGh2X2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7CisJc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCAqcmVxdWVzdDsKKwlzdHJ1Y3QgdnN0b3JfcGFja2V0ICp2c3Rvcl9wYWNrZXQ7CisJaW50IHJldCwgdDsKKworCXN0b3JfZGV2aWNlID0gZ2V0X291dF9zdG9yX2RldmljZShkZXZpY2UpOworCWlmICghc3Rvcl9kZXZpY2UpCisJCXJldHVybiAtRU5PREVWOworCisJcmVxdWVzdCA9ICZzdG9yX2RldmljZS0+aW5pdF9yZXF1ZXN0OworCXZzdG9yX3BhY2tldCA9ICZyZXF1ZXN0LT52c3Rvcl9wYWNrZXQ7CisKKwkvKgorCSAqIE5vdywgaW5pdGlhdGUgdGhlIHZzYy92c3AgaW5pdGlhbGl6YXRpb24gcHJvdG9jb2wgb24gdGhlIG9wZW4KKwkgKiBjaGFubmVsCisJICovCisJbWVtc2V0KHJlcXVlc3QsIDAsIHNpemVvZihzdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0KSk7CisJaW5pdF9jb21wbGV0aW9uKCZyZXF1ZXN0LT53YWl0X2V2ZW50KTsKKwl2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbiA9IFZTVE9SX09QRVJBVElPTl9CRUdJTl9JTklUSUFMSVpBVElPTjsKKwl2c3Rvcl9wYWNrZXQtPmZsYWdzID0gUkVRVUVTVF9DT01QTEVUSU9OX0ZMQUc7CisKKwlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KGRldmljZS0+Y2hhbm5lbCwgdnN0b3JfcGFja2V0LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZylyZXF1ZXN0LAorCQkJICAgICAgIFZNX1BLVF9EQVRBX0lOQkFORCwKKwkJCSAgICAgICBWTUJVU19EQVRBX1BBQ0tFVF9GTEFHX0NPTVBMRVRJT05fUkVRVUVTVEVEKTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gY2xlYW51cDsKKworCXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnJlcXVlc3QtPndhaXRfZXZlbnQsIDUqSFopOworCWlmICh0ID09IDApIHsKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWlmICh2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbiAhPSBWU1RPUl9PUEVSQVRJT05fQ09NUExFVEVfSU8gfHwKKwkgICAgdnN0b3JfcGFja2V0LT5zdGF0dXMgIT0gMCkKKwkJZ290byBjbGVhbnVwOworCisKKwkvKiByZXVzZSB0aGUgcGFja2V0IGZvciB2ZXJzaW9uIHJhbmdlIHN1cHBvcnRlZCAqLworCW1lbXNldCh2c3Rvcl9wYWNrZXQsIDAsIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSk7CisJdnN0b3JfcGFja2V0LT5vcGVyYXRpb24gPSBWU1RPUl9PUEVSQVRJT05fUVVFUllfUFJPVE9DT0xfVkVSU0lPTjsKKwl2c3Rvcl9wYWNrZXQtPmZsYWdzID0gUkVRVUVTVF9DT01QTEVUSU9OX0ZMQUc7CisKKwl2c3Rvcl9wYWNrZXQtPnZlcnNpb24ubWFqb3JfbWlub3IgPSBWTVNUT1JfUFJPVE9DT0xfVkVSU0lPTl9DVVJSRU5UOworCUZJTExfVk1TVE9SX1JFVklTSU9OKHZzdG9yX3BhY2tldC0+dmVyc2lvbi5yZXZpc2lvbik7CisKKwlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KGRldmljZS0+Y2hhbm5lbCwgdnN0b3JfcGFja2V0LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZylyZXF1ZXN0LAorCQkJICAgICAgIFZNX1BLVF9EQVRBX0lOQkFORCwKKwkJCSAgICAgICBWTUJVU19EQVRBX1BBQ0tFVF9GTEFHX0NPTVBMRVRJT05fUkVRVUVTVEVEKTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gY2xlYW51cDsKKworCXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnJlcXVlc3QtPndhaXRfZXZlbnQsIDUqSFopOworCWlmICh0ID09IDApIHsKKwkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWlmICh2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbiAhPSBWU1RPUl9PUEVSQVRJT05fQ09NUExFVEVfSU8gfHwKKwkgICAgdnN0b3JfcGFja2V0LT5zdGF0dXMgIT0gMCkKKwkJZ290byBjbGVhbnVwOworCisKKwltZW1zZXQodnN0b3JfcGFja2V0LCAwLCBzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCkpOworCXZzdG9yX3BhY2tldC0+b3BlcmF0aW9uID0gVlNUT1JfT1BFUkFUSU9OX1FVRVJZX1BST1BFUlRJRVM7CisJdnN0b3JfcGFja2V0LT5mbGFncyA9IFJFUVVFU1RfQ09NUExFVElPTl9GTEFHOworCXZzdG9yX3BhY2tldC0+c3RvcmFnZV9jaGFubmVsX3Byb3BlcnRpZXMucG9ydF9udW1iZXIgPQorCQkJCQlzdG9yX2RldmljZS0+cG9ydF9udW1iZXI7CisKKwlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KGRldmljZS0+Y2hhbm5lbCwgdnN0b3JfcGFja2V0LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZylyZXF1ZXN0LAorCQkJICAgICAgIFZNX1BLVF9EQVRBX0lOQkFORCwKKwkJCSAgICAgICBWTUJVU19EQVRBX1BBQ0tFVF9GTEFHX0NPTVBMRVRJT05fUkVRVUVTVEVEKTsKKworCWlmIChyZXQgIT0gMCkKKwkJZ290byBjbGVhbnVwOworCisJdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcmVxdWVzdC0+d2FpdF9ldmVudCwgNSpIWik7CisJaWYgKHQgPT0gMCkgeworCQlyZXQgPSAtRVRJTUVET1VUOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJaWYgKHZzdG9yX3BhY2tldC0+b3BlcmF0aW9uICE9IFZTVE9SX09QRVJBVElPTl9DT01QTEVURV9JTyB8fAorCSAgICB2c3Rvcl9wYWNrZXQtPnN0YXR1cyAhPSAwKQorCQlnb3RvIGNsZWFudXA7CisKKwlzdG9yX2RldmljZS0+cGF0aF9pZCA9IHZzdG9yX3BhY2tldC0+c3RvcmFnZV9jaGFubmVsX3Byb3BlcnRpZXMucGF0aF9pZDsKKwlzdG9yX2RldmljZS0+dGFyZ2V0X2lkCisJCT0gdnN0b3JfcGFja2V0LT5zdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllcy50YXJnZXRfaWQ7CisKKwltZW1zZXQodnN0b3JfcGFja2V0LCAwLCBzaXplb2Yoc3RydWN0IHZzdG9yX3BhY2tldCkpOworCXZzdG9yX3BhY2tldC0+b3BlcmF0aW9uID0gVlNUT1JfT1BFUkFUSU9OX0VORF9JTklUSUFMSVpBVElPTjsKKwl2c3Rvcl9wYWNrZXQtPmZsYWdzID0gUkVRVUVTVF9DT01QTEVUSU9OX0ZMQUc7CisKKwlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KGRldmljZS0+Y2hhbm5lbCwgdnN0b3JfcGFja2V0LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZylyZXF1ZXN0LAorCQkJICAgICAgIFZNX1BLVF9EQVRBX0lOQkFORCwKKwkJCSAgICAgICBWTUJVU19EQVRBX1BBQ0tFVF9GTEFHX0NPTVBMRVRJT05fUkVRVUVTVEVEKTsKKworCWlmIChyZXQgIT0gMCkKKwkJZ290byBjbGVhbnVwOworCisJdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcmVxdWVzdC0+d2FpdF9ldmVudCwgNSpIWik7CisJaWYgKHQgPT0gMCkgeworCQlyZXQgPSAtRVRJTUVET1VUOworCQlnb3RvIGNsZWFudXA7CisJfQorCisJaWYgKHZzdG9yX3BhY2tldC0+b3BlcmF0aW9uICE9IFZTVE9SX09QRVJBVElPTl9DT01QTEVURV9JTyB8fAorCSAgICB2c3Rvcl9wYWNrZXQtPnN0YXR1cyAhPSAwKQorCQlnb3RvIGNsZWFudXA7CisKKworY2xlYW51cDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzdG9ydnNjX29uX2lvX2NvbXBsZXRpb24oc3RydWN0IGh2X2RldmljZSAqZGV2aWNlLAorCQkJCSAgc3RydWN0IHZzdG9yX3BhY2tldCAqdnN0b3JfcGFja2V0LAorCQkJCSAgc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCAqcmVxdWVzdCkKK3sKKwlzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UgKnN0b3JfZGV2aWNlOworCXN0cnVjdCB2c3Rvcl9wYWNrZXQgKnN0b3JfcGt0OworCisJc3Rvcl9kZXZpY2UgPSBodl9nZXRfZHJ2ZGF0YShkZXZpY2UpOworCXN0b3JfcGt0ID0gJnJlcXVlc3QtPnZzdG9yX3BhY2tldDsKKworCS8qCisJICogVGhlIGN1cnJlbnQgU0NTSSBoYW5kbGluZyBvbiB0aGUgaG9zdCBzaWRlIGRvZXMKKwkgKiBub3QgY29ycmVjdGx5IGhhbmRsZToKKwkgKiBJTlFVSVJZIGNvbW1hbmQgd2l0aCBwYWdlIGNvZGUgcGFyYW1ldGVyIHNldCB0byAweDgwCisJICogTU9ERV9TRU5TRSBjb21tYW5kIHdpdGggY21kWzJdID09IDB4MWMKKwkgKgorCSAqIFNldHVwIHNyYiBhbmQgc2NzaSBzdGF0dXMgc28gdGhpcyB3b24ndCBiZSBmYXRhbC4KKwkgKiBXZSBkbyB0aGlzIHNvIHdlIGNhbiBkaXN0aW5ndWlzaCB0cnVseSBmYXRhbCBmYWlsdWVzCisJICogKHNyYiBzdGF0dXMgPT0gMHg0KSBhbmQgb2ZmLWxpbmUgdGhlIGRldmljZSBpbiB0aGF0IGNhc2UuCisJICovCisKKwlpZiAoKHN0b3JfcGt0LT52bV9zcmIuY2RiWzBdID09IElOUVVJUlkpIHx8CisJCShzdG9yX3BrdC0+dm1fc3JiLmNkYlswXSA9PSBNT0RFX1NFTlNFKSkgeworCQl2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zY3NpX3N0YXR1cyA9IDA7CisJCXZzdG9yX3BhY2tldC0+dm1fc3JiLnNyYl9zdGF0dXMgPSAweDE7CisJfQorCisKKwkvKiBDb3B5IG92ZXIgdGhlIHN0YXR1cy4uLmV0YyAqLworCXN0b3JfcGt0LT52bV9zcmIuc2NzaV9zdGF0dXMgPSB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zY3NpX3N0YXR1czsKKwlzdG9yX3BrdC0+dm1fc3JiLnNyYl9zdGF0dXMgPSB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zcmJfc3RhdHVzOworCXN0b3JfcGt0LT52bV9zcmIuc2Vuc2VfaW5mb19sZW5ndGggPQorCXZzdG9yX3BhY2tldC0+dm1fc3JiLnNlbnNlX2luZm9fbGVuZ3RoOworCisJaWYgKHZzdG9yX3BhY2tldC0+dm1fc3JiLnNjc2lfc3RhdHVzICE9IDAgfHwKKwkJdnN0b3JfcGFja2V0LT52bV9zcmIuc3JiX3N0YXR1cyAhPSAxKXsKKwkJZGV2X3dhcm4oJmRldmljZS0+ZGV2aWNlLAorCQkJICJjbWQgMHgleCBzY3NpIHN0YXR1cyAweCV4IHNyYiBzdGF0dXMgMHgleFxuIiwKKwkJCSBzdG9yX3BrdC0+dm1fc3JiLmNkYlswXSwKKwkJCSB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zY3NpX3N0YXR1cywKKwkJCSB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zcmJfc3RhdHVzKTsKKwl9CisKKwlpZiAoKHZzdG9yX3BhY2tldC0+dm1fc3JiLnNjc2lfc3RhdHVzICYgMHhGRikgPT0gMHgwMikgeworCQkvKiBDSEVDS19DT05ESVRJT04gKi8KKwkJaWYgKHZzdG9yX3BhY2tldC0+dm1fc3JiLnNyYl9zdGF0dXMgJiAweDgwKSB7CisJCQkvKiBhdXRvc2Vuc2UgZGF0YSBhdmFpbGFibGUgKi8KKwkJCWRldl93YXJuKCZkZXZpY2UtPmRldmljZSwKKwkJCQkgInN0b3IgcGt0ICVwIGF1dG9zZW5zZSBkYXRhIHZhbGlkIC0gbGVuICVkXG4iLAorCQkJCSByZXF1ZXN0LAorCQkJCSB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zZW5zZV9pbmZvX2xlbmd0aCk7CisKKwkJCW1lbWNweShyZXF1ZXN0LT5zZW5zZV9idWZmZXIsCisJCQkgICAgICAgdnN0b3JfcGFja2V0LT52bV9zcmIuc2Vuc2VfZGF0YSwKKwkJCSAgICAgICB2c3Rvcl9wYWNrZXQtPnZtX3NyYi5zZW5zZV9pbmZvX2xlbmd0aCk7CisKKwkJfQorCX0KKworCXN0b3JfcGt0LT52bV9zcmIuZGF0YV90cmFuc2Zlcl9sZW5ndGggPQorCXZzdG9yX3BhY2tldC0+dm1fc3JiLmRhdGFfdHJhbnNmZXJfbGVuZ3RoOworCisJcmVxdWVzdC0+b25faW9fY29tcGxldGlvbihyZXF1ZXN0KTsKKworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZzdG9yX2RldmljZS0+bnVtX291dHN0YW5kaW5nX3JlcSkgJiYKKwkJc3Rvcl9kZXZpY2UtPmRyYWluX25vdGlmeSkKKwkJd2FrZV91cCgmc3Rvcl9kZXZpY2UtPndhaXRpbmdfdG9fZHJhaW4pOworCisKK30KKworc3RhdGljIHZvaWQgc3RvcnZzY19vbl9yZWNlaXZlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKKwkJCSAgICAgc3RydWN0IHZzdG9yX3BhY2tldCAqdnN0b3JfcGFja2V0LAorCQkJICAgICBzdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0ICpyZXF1ZXN0KQoreworCXN3aXRjaCAodnN0b3JfcGFja2V0LT5vcGVyYXRpb24pIHsKKwljYXNlIFZTVE9SX09QRVJBVElPTl9DT01QTEVURV9JTzoKKwkJc3RvcnZzY19vbl9pb19jb21wbGV0aW9uKGRldmljZSwgdnN0b3JfcGFja2V0LCByZXF1ZXN0KTsKKwkJYnJlYWs7CisJY2FzZSBWU1RPUl9PUEVSQVRJT05fUkVNT1ZFX0RFVklDRToKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgc3RvcnZzY19vbl9jaGFubmVsX2NhbGxiYWNrKHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGh2X2RldmljZSAqZGV2aWNlID0gKHN0cnVjdCBodl9kZXZpY2UgKiljb250ZXh0OworCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7CisJdTMyIGJ5dGVzX3JlY3ZkOworCXU2NCByZXF1ZXN0X2lkOworCXVuc2lnbmVkIGNoYXIgcGFja2V0W0FMSUdOKHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSwgOCldOworCXN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgKnJlcXVlc3Q7CisJaW50IHJldDsKKworCisJc3Rvcl9kZXZpY2UgPSBnZXRfaW5fc3Rvcl9kZXZpY2UoZGV2aWNlKTsKKwlpZiAoIXN0b3JfZGV2aWNlKQorCQlyZXR1cm47CisKKwlkbyB7CisJCXJldCA9IHZtYnVzX3JlY3ZwYWNrZXQoZGV2aWNlLT5jaGFubmVsLCBwYWNrZXQsCisJCQkJICAgICAgIEFMSUdOKHNpemVvZihzdHJ1Y3QgdnN0b3JfcGFja2V0KSwgOCksCisJCQkJICAgICAgICZieXRlc19yZWN2ZCwgJnJlcXVlc3RfaWQpOworCQlpZiAocmV0ID09IDAgJiYgYnl0ZXNfcmVjdmQgPiAwKSB7CisKKwkJCXJlcXVlc3QgPSAoc3RydWN0IGh2X3N0b3J2c2NfcmVxdWVzdCAqKQorCQkJCQkodW5zaWduZWQgbG9uZylyZXF1ZXN0X2lkOworCisJCQlpZiAoKHJlcXVlc3QgPT0gJnN0b3JfZGV2aWNlLT5pbml0X3JlcXVlc3QpIHx8CisJCQkgICAgKHJlcXVlc3QgPT0gJnN0b3JfZGV2aWNlLT5yZXNldF9yZXF1ZXN0KSkgeworCisJCQkJbWVtY3B5KCZyZXF1ZXN0LT52c3Rvcl9wYWNrZXQsIHBhY2tldCwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpKTsKKwkJCQljb21wbGV0ZSgmcmVxdWVzdC0+d2FpdF9ldmVudCk7CisJCQl9IGVsc2UgeworCQkJCXN0b3J2c2Nfb25fcmVjZWl2ZShkZXZpY2UsCisJCQkJCQkoc3RydWN0IHZzdG9yX3BhY2tldCAqKXBhY2tldCwKKwkJCQkJCXJlcXVlc3QpOworCQkJfQorCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgxKTsKKworCXJldHVybjsKK30KKworc3RhdGljIGludCBzdG9ydnNjX2Nvbm5lY3RfdG9fdnNwKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwgdTMyIHJpbmdfc2l6ZSkKK3sKKwlzdHJ1Y3Qgdm1zdG9yYWdlX2NoYW5uZWxfcHJvcGVydGllcyBwcm9wczsKKwlpbnQgcmV0OworCisJbWVtc2V0KCZwcm9wcywgMCwgc2l6ZW9mKHN0cnVjdCB2bXN0b3JhZ2VfY2hhbm5lbF9wcm9wZXJ0aWVzKSk7CisKKwkvKiBPcGVuIHRoZSBjaGFubmVsICovCisJcmV0ID0gdm1idXNfb3BlbihkZXZpY2UtPmNoYW5uZWwsCisJCQkgcmluZ19zaXplLAorCQkJIHJpbmdfc2l6ZSwKKwkJCSAodm9pZCAqKSZwcm9wcywKKwkJCSBzaXplb2Yoc3RydWN0IHZtc3RvcmFnZV9jaGFubmVsX3Byb3BlcnRpZXMpLAorCQkJIHN0b3J2c2Nfb25fY2hhbm5lbF9jYWxsYmFjaywgZGV2aWNlKTsKKworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHN0b3J2c2NfY2hhbm5lbF9pbml0KGRldmljZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN0b3J2c2NfZGV2X3JlbW92ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yX2RldmljZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Rvcl9kZXZpY2UgPSBodl9nZXRfZHJ2ZGF0YShkZXZpY2UpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmljZS0+Y2hhbm5lbC0+aW5ib3VuZF9sb2NrLCBmbGFncyk7CisJc3Rvcl9kZXZpY2UtPmRlc3Ryb3kgPSB0cnVlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+Y2hhbm5lbC0+aW5ib3VuZF9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQsIGFsbCBvdXRib3VuZCB0cmFmZmljIHNob3VsZCBiZSBkaXNhYmxlLiBXZQorCSAqIG9ubHkgYWxsb3cgaW5ib3VuZCB0cmFmZmljIChyZXNwb25zZXMpIHRvIHByb2NlZWQgc28gdGhhdAorCSAqIG91dHN0YW5kaW5nIHJlcXVlc3RzIGNhbiBiZSBjb21wbGV0ZWQuCisJICovCisKKwlzdG9ydnNjX3dhaXRfdG9fZHJhaW4oc3Rvcl9kZXZpY2UpOworCisJLyoKKwkgKiBTaW5jZSB3ZSBoYXZlIGFscmVhZHkgZHJhaW5lZCwgd2UgZG9uJ3QgbmVlZCB0byBidXN5IHdhaXQKKwkgKiBhcyB3YXMgZG9uZSBpbiBmaW5hbF9yZWxlYXNlX3N0b3JfZGV2aWNlKCkKKwkgKiBOb3RlIHRoYXQgd2UgY2Fubm90IHNldCB0aGUgZXh0IHBvaW50ZXIgdG8gTlVMTCB1bnRpbAorCSAqIHdlIGhhdmUgZHJhaW5lZCAtIHRvIGRyYWluIHRoZSBvdXRnb2luZyBwYWNrZXRzLCB3ZSBuZWVkIHRvCisJICogYWxsb3cgaW5jb21pbmcgcGFja2V0cy4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2aWNlLT5jaGFubmVsLT5pbmJvdW5kX2xvY2ssIGZsYWdzKTsKKwlodl9zZXRfZHJ2ZGF0YShkZXZpY2UsIE5VTEwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmljZS0+Y2hhbm5lbC0+aW5ib3VuZF9sb2NrLCBmbGFncyk7CisKKwkvKiBDbG9zZSB0aGUgY2hhbm5lbCAqLworCXZtYnVzX2Nsb3NlKGRldmljZS0+Y2hhbm5lbCk7CisKKwlrZnJlZShzdG9yX2RldmljZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RvcnZzY19kb19pbyhzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCisJCQkgICAgICBzdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0ICpyZXF1ZXN0KQoreworCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7CisJc3RydWN0IHZzdG9yX3BhY2tldCAqdnN0b3JfcGFja2V0OworCWludCByZXQgPSAwOworCisJdnN0b3JfcGFja2V0ID0gJnJlcXVlc3QtPnZzdG9yX3BhY2tldDsKKwlzdG9yX2RldmljZSA9IGdldF9vdXRfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKKworCWlmICghc3Rvcl9kZXZpY2UpCisJCXJldHVybiAtRU5PREVWOworCisKKwlyZXF1ZXN0LT5kZXZpY2UgID0gZGV2aWNlOworCisKKwl2c3Rvcl9wYWNrZXQtPmZsYWdzIHw9IFJFUVVFU1RfQ09NUExFVElPTl9GTEFHOworCisJdnN0b3JfcGFja2V0LT52bV9zcmIubGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCB2bXNjc2lfcmVxdWVzdCk7CisKKworCXZzdG9yX3BhY2tldC0+dm1fc3JiLnNlbnNlX2luZm9fbGVuZ3RoID0gU0VOU0VfQlVGRkVSX1NJWkU7CisKKworCXZzdG9yX3BhY2tldC0+dm1fc3JiLmRhdGFfdHJhbnNmZXJfbGVuZ3RoID0KKwlyZXF1ZXN0LT5kYXRhX2J1ZmZlci5sZW47CisKKwl2c3Rvcl9wYWNrZXQtPm9wZXJhdGlvbiA9IFZTVE9SX09QRVJBVElPTl9FWEVDVVRFX1NSQjsKKworCWlmIChyZXF1ZXN0LT5kYXRhX2J1ZmZlci5sZW4pIHsKKwkJcmV0ID0gdm1idXNfc2VuZHBhY2tldF9tdWx0aXBhZ2VidWZmZXIoZGV2aWNlLT5jaGFubmVsLAorCQkJCSZyZXF1ZXN0LT5kYXRhX2J1ZmZlciwKKwkJCQl2c3Rvcl9wYWNrZXQsCisJCQkJc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpLAorCQkJCSh1bnNpZ25lZCBsb25nKXJlcXVlc3QpOworCX0gZWxzZSB7CisJCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoZGV2aWNlLT5jaGFubmVsLCB2c3Rvcl9wYWNrZXQsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXJlcXVlc3QsCisJCQkgICAgICAgVk1fUEtUX0RBVEFfSU5CQU5ELAorCQkJICAgICAgIFZNQlVTX0RBVEFfUEFDS0VUX0ZMQUdfQ09NUExFVElPTl9SRVFVRVNURUQpOworCX0KKworCWlmIChyZXQgIT0gMCkKKwkJcmV0dXJuIHJldDsKKworCWF0b21pY19pbmMoJnN0b3JfZGV2aWNlLT5udW1fb3V0c3RhbmRpbmdfcmVxKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHN0b3J2c2NfZ2V0X2lkZV9pbmZvKHN0cnVjdCBodl9kZXZpY2UgKmRldiwgaW50ICp0YXJnZXQsIGludCAqcGF0aCkKK3sKKwkqdGFyZ2V0ID0KKwkJZGV2LT5kZXZfaW5zdGFuY2UuYls1XSA8PCA4IHwgZGV2LT5kZXZfaW5zdGFuY2UuYls0XTsKKworCSpwYXRoID0KKwkJZGV2LT5kZXZfaW5zdGFuY2UuYlszXSA8PCAyNCB8CisJCWRldi0+ZGV2X2luc3RhbmNlLmJbMl0gPDwgMTYgfAorCQlkZXYtPmRldl9pbnN0YW5jZS5iWzFdIDw8IDggIHwgZGV2LT5kZXZfaW5zdGFuY2UuYlswXTsKK30KKwogCiBzdGF0aWMgaW50IHN0b3J2c2NfZGV2aWNlX2FsbG9jKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldmljZSkKIHsKQEAgLTMwNyw3ICs5NjMsOCBAQAogCiBzdGF0aWMgaW50IHN0b3J2c2NfcmVtb3ZlKHN0cnVjdCBodl9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKCZkZXYtPmRldmljZSk7CisJc3RydWN0IHN0b3J2c2NfZGV2aWNlICpzdG9yX2RldmljZSA9IGh2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IFNjc2lfSG9zdCAqaG9zdCA9IHN0b3JfZGV2aWNlLT5ob3N0OwogCXN0cnVjdCBodl9ob3N0X2RldmljZSAqaG9zdF9kZXYgPQogCQkJKHN0cnVjdCBodl9ob3N0X2RldmljZSAqKWhvc3QtPmhvc3RkYXRhOwogCkBAIC0zNTUsOSArMTAxMiw5IEBACiAJaW50IHJldCwgdDsKIAogCi0Jc3Rvcl9kZXZpY2UgPSBnZXRfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKKwlzdG9yX2RldmljZSA9IGdldF9vdXRfc3Rvcl9kZXZpY2UoZGV2aWNlKTsKIAlpZiAoIXN0b3JfZGV2aWNlKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRU5PREVWOwogCiAJcmVxdWVzdCA9ICZzdG9yX2RldmljZS0+cmVzZXRfcmVxdWVzdDsKIAl2c3Rvcl9wYWNrZXQgPSAmcmVxdWVzdC0+dnN0b3JfcGFja2V0OwpAQCAtMzg5LDcgKzEwNDYsNiBAQAogCSAqLwogCiBjbGVhbnVwOgotCXB1dF9zdG9yX2RldmljZShkZXZpY2UpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQxMyw5ICsxMDY5LDkgQEAKIAogCiAvKgotICogc3RvcnZzY19jb21tbWFuZF9jb21wbGV0aW9uIC0gQ29tbWFuZCBjb21wbGV0aW9uIHByb2Nlc3NpbmcKKyAqIHN0b3J2c2NfY29tbWFuZF9jb21wbGV0aW9uIC0gQ29tbWFuZCBjb21wbGV0aW9uIHByb2Nlc3NpbmcKICAqLwotc3RhdGljIHZvaWQgc3RvcnZzY19jb21tbWFuZF9jb21wbGV0aW9uKHN0cnVjdCBodl9zdG9ydnNjX3JlcXVlc3QgKnJlcXVlc3QpCitzdGF0aWMgdm9pZCBzdG9ydnNjX2NvbW1hbmRfY29tcGxldGlvbihzdHJ1Y3QgaHZfc3RvcnZzY19yZXF1ZXN0ICpyZXF1ZXN0KQogewogCXN0cnVjdCBzdG9ydnNjX2NtZF9yZXF1ZXN0ICpjbWRfcmVxdWVzdCA9CiAJCShzdHJ1Y3Qgc3RvcnZzY19jbWRfcmVxdWVzdCAqKXJlcXVlc3QtPmNvbnRleHQ7CkBAIC00MjYsMTggKzEwODIsMjYgQEAKIAlzdHJ1Y3Qgc2NzaV9zZW5zZV9oZHIgc2Vuc2VfaGRyOwogCXN0cnVjdCB2bXNjc2lfcmVxdWVzdCAqdm1fc3JiOwogCisJdm1fc3JiID0gJnJlcXVlc3QtPnZzdG9yX3BhY2tldC52bV9zcmI7CiAJaWYgKGNtZF9yZXF1ZXN0LT5ib3VuY2Vfc2dsX2NvdW50KSB7Ci0KLQkJLyogRklYTUU6IFdlIGNhbiBvcHRpbWl6ZSBvbiB3cml0ZXMgYnkganVzdCBza2lwcGluZyB0aGlzICovCi0JCWNvcHlfZnJvbV9ib3VuY2VfYnVmZmVyKHNjc2lfc2dsaXN0KHNjbW5kKSwKKwkJaWYgKHZtX3NyYi0+ZGF0YV9pbiA9PSBSRUFEX1RZUEUpIHsKKwkJCWNvcHlfZnJvbV9ib3VuY2VfYnVmZmVyKHNjc2lfc2dsaXN0KHNjbW5kKSwKIAkJCQkJY21kX3JlcXVlc3QtPmJvdW5jZV9zZ2wsCiAJCQkJCXNjc2lfc2dfY291bnQoc2NtbmQpKTsKLQkJZGVzdHJveV9ib3VuY2VfYnVmZmVyKGNtZF9yZXF1ZXN0LT5ib3VuY2Vfc2dsLAotCQkJCSAgICAgIGNtZF9yZXF1ZXN0LT5ib3VuY2Vfc2dsX2NvdW50KTsKKwkJCWRlc3Ryb3lfYm91bmNlX2J1ZmZlcihjbWRfcmVxdWVzdC0+Ym91bmNlX3NnbCwKKwkJCQkJY21kX3JlcXVlc3QtPmJvdW5jZV9zZ2xfY291bnQpOworCQl9CiAJfQogCi0Jdm1fc3JiID0gJnJlcXVlc3QtPnZzdG9yX3BhY2tldC52bV9zcmI7Ci0Jc2NtbmQtPnJlc3VsdCA9IHZtX3NyYi0+c2NzaV9zdGF0dXM7CisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhbiBlcnJvcjsgb2ZmbGluZSB0aGUgZGV2aWNlIHNpbmNlIGFsbAorCSAqIGVycm9yIHJlY292ZXJ5IHN0cmF0ZWdpZXMgd291bGQgaGF2ZSBhbHJlYWR5IGJlZW4KKwkgKiBkZXBsb3llZCBvbiB0aGUgaG9zdCBzaWRlLgorCSAqLworCWlmICh2bV9zcmItPnNyYl9zdGF0dXMgPT0gMHg0KQorCQlzY21uZC0+cmVzdWx0ID0gRElEX1RBUkdFVF9GQUlMVVJFIDw8IDE2OworCWVsc2UKKwkJc2NtbmQtPnJlc3VsdCA9IHZtX3NyYi0+c2NzaV9zdGF0dXM7CiAKIAlpZiAoc2NtbmQtPnJlc3VsdCkgewogCQlpZiAoc2NzaV9ub3JtYWxpemVfc2Vuc2Uoc2NtbmQtPnNlbnNlX2J1ZmZlciwKQEAgLTQ1OSw2ICsxMTIzLDIyIEBACiAJa21lbV9jYWNoZV9mcmVlKGhvc3RfZGV2LT5yZXF1ZXN0X3Bvb2wsIGNtZF9yZXF1ZXN0KTsKIH0KIAorc3RhdGljIGJvb2wgc3RvcnZzY19jaGVja19zY3NpX2NtZChzdHJ1Y3Qgc2NzaV9jbW5kICpzY21uZCkKK3sKKwlib29sIGFsbG93ZWQgPSB0cnVlOworCXU4IHNjc2lfb3AgPSBzY21uZC0+Y21uZFswXTsKKworCXN3aXRjaCAoc2NzaV9vcCkgeworCS8qIHNtYXJ0ZCBzZW5kcyB0aGlzIGNvbW1hbmQsIHdoaWNoIHdpbGwgb2ZmbGluZSB0aGUgZGV2aWNlICovCisJY2FzZSBTRVRfV0lORE9XOgorCQlzY21uZC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQlhbGxvd2VkID0gZmFsc2U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gYWxsb3dlZDsKK30KIAogLyoKICAqIHN0b3J2c2NfcXVldWVjb21tYW5kIC0gSW5pdGlhdGUgY29tbWFuZCBwcm9jZXNzaW5nCkBAIC00NzgsNiArMTE1OCwxMCBAQAogCXVuc2lnbmVkIGludCBzZ19jb3VudCA9IDA7CiAJc3RydWN0IHZtc2NzaV9yZXF1ZXN0ICp2bV9zcmI7CiAKKwlpZiAoc3RvcnZzY19jaGVja19zY3NpX2NtZChzY21uZCkgPT0gZmFsc2UpIHsKKwkJZG9uZShzY21uZCk7CisJCXJldHVybiAwOworCX0KIAogCS8qIElmIHJldHJ5aW5nLCBubyBuZWVkIHRvIHByZXAgdGhlIGNtZCAqLwogCWlmIChzY21uZC0+aG9zdF9zY3JpYmJsZSkgewpAQCAtNTIzLDcgKzEyMDcsNyBAQAogCQlicmVhazsKIAl9CiAKLQlyZXF1ZXN0LT5vbl9pb19jb21wbGV0aW9uID0gc3RvcnZzY19jb21tbWFuZF9jb21wbGV0aW9uOworCXJlcXVlc3QtPm9uX2lvX2NvbXBsZXRpb24gPSBzdG9ydnNjX2NvbW1hbmRfY29tcGxldGlvbjsKIAlyZXF1ZXN0LT5jb250ZXh0ID0gY21kX3JlcXVlc3Q7Lyogc2NtbmQ7ICovCiAKIAl2bV9zcmItPnBvcnRfbnVtYmVyID0gaG9zdF9kZXYtPnBvcnQ7CkBAIC01NjEsMTIgKzEyNDUsMTAgQEAKIAkJCQlBTElHTihzY3NpX2J1ZmZsZW4oc2NtbmQpLCBQQUdFX1NJWkUpID4+CiAJCQkJCVBBR0VfU0hJRlQ7CiAKLQkJCS8qCi0JCQkgKiBGSVhNRTogV2UgY2FuIG9wdGltaXplIG9uIHJlYWRzIGJ5IGp1c3Qgc2tpcHBpbmcKLQkJCSAqIHRoaXMKLQkJCSAqLwotCQkJY29weV90b19ib3VuY2VfYnVmZmVyKHNnbCwgY21kX3JlcXVlc3QtPmJvdW5jZV9zZ2wsCi0JCQkJCSAgICAgIHNjc2lfc2dfY291bnQoc2NtbmQpKTsKKwkJCWlmICh2bV9zcmItPmRhdGFfaW4gPT0gV1JJVEVfVFlQRSkKKwkJCQljb3B5X3RvX2JvdW5jZV9idWZmZXIoc2dsLAorCQkJCQljbWRfcmVxdWVzdC0+Ym91bmNlX3NnbCwKKwkJCQkJc2NzaV9zZ19jb3VudChzY21uZCkpOwogCiAJCQlzZ2wgPSBjbWRfcmVxdWVzdC0+Ym91bmNlX3NnbDsKIAkJCXNnX2NvdW50ID0gY21kX3JlcXVlc3QtPmJvdW5jZV9zZ2xfY291bnQ7CkBAIC01ODksMjAgKzEyNzEsMTIgQEAKIAkvKiBJbnZva2VzIHRoZSB2c2MgdG8gc3RhcnQgYW4gSU8gKi8KIAlyZXQgPSBzdG9ydnNjX2RvX2lvKGRldiwgJmNtZF9yZXF1ZXN0LT5yZXF1ZXN0KTsKIAotCWlmIChyZXQgPT0gLTEpIHsKKwlpZiAocmV0ID09IC1FQUdBSU4pIHsKIAkJLyogbm8gbW9yZSBzcGFjZSAqLwogCi0JCWlmIChjbWRfcmVxdWVzdC0+Ym91bmNlX3NnbF9jb3VudCkgewotCQkJLyoKLQkJCSAqIEZJWE1FOiBXZSBjYW4gb3B0aW1pemUgb24gd3JpdGVzIGJ5IGp1c3Qgc2tpcHBpbmcKLQkJCSAqIHRoaXMKLQkJCSAqLwotCQkJY29weV9mcm9tX2JvdW5jZV9idWZmZXIoc2NzaV9zZ2xpc3Qoc2NtbmQpLAotCQkJCQkJY21kX3JlcXVlc3QtPmJvdW5jZV9zZ2wsCi0JCQkJCQlzY3NpX3NnX2NvdW50KHNjbW5kKSk7CisJCWlmIChjbWRfcmVxdWVzdC0+Ym91bmNlX3NnbF9jb3VudCkKIAkJCWRlc3Ryb3lfYm91bmNlX2J1ZmZlcihjbWRfcmVxdWVzdC0+Ym91bmNlX3NnbCwKLQkJCQkJICAgICAgY21kX3JlcXVlc3QtPmJvdW5jZV9zZ2xfY291bnQpOwotCQl9CisJCQkJCWNtZF9yZXF1ZXN0LT5ib3VuY2Vfc2dsX2NvdW50KTsKIAogCQlrbWVtX2NhY2hlX2ZyZWUoaG9zdF9kZXYtPnJlcXVlc3RfcG9vbCwgY21kX3JlcXVlc3QpOwogCkBAIC02NDYsMjUgKzEzMjAsNDYgQEAKIAkuZG1hX2JvdW5kYXJ5ID0JCVBBR0VfU0laRS0xLAogfTsKIAorZW51bSB7CisJU0NTSV9HVUlELAorCUlERV9HVUlELAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBodl92bWJ1c19kZXZpY2VfaWQgaWRfdGFibGVbXSA9IHsKKwkvKiBTQ1NJIGd1aWQgKi8KKwl7IFZNQlVTX0RFVklDRSgweGQ5LCAweDYzLCAweDYxLCAweGJhLCAweGExLCAweDA0LCAweDI5LCAweDRkLAorCQkgICAgICAgMHhiNiwgMHgwNSwgMHg3MiwgMHhlMiwgMHhmZiwgMHhiMSwgMHhkYywgMHg3ZikKKwkgIC5kcml2ZXJfZGF0YSA9IFNDU0lfR1VJRCB9LAorCS8qIElERSBndWlkICovCisJeyBWTUJVU19ERVZJQ0UoMHgzMiwgMHgyNiwgMHg0MSwgMHgzMiwgMHhjYiwgMHg4NiwgMHhhMiwgMHg0NCwKKwkJICAgICAgIDB4OWIsIDB4NWMsIDB4NTAsIDB4ZDEsIDB4NDEsIDB4NzMsIDB4NTQsIDB4ZjUpCisJICAuZHJpdmVyX2RhdGEgPSBJREVfR1VJRCB9LAorCXsgfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUodm1idXMsIGlkX3RhYmxlKTsKKwogCiAvKgogICogc3RvcnZzY19wcm9iZSAtIEFkZCBhIG5ldyBkZXZpY2UgZm9yIHRoaXMgZHJpdmVyCiAgKi8KIAotc3RhdGljIGludCBzdG9ydnNjX3Byb2JlKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSkKK3N0YXRpYyBpbnQgc3RvcnZzY19wcm9iZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsCisJCQljb25zdCBzdHJ1Y3QgaHZfdm1idXNfZGV2aWNlX2lkICpkZXZfaWQpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OwogCXN0cnVjdCBodl9ob3N0X2RldmljZSAqaG9zdF9kZXY7Ci0Jc3RydWN0IHN0b3J2c2NfZGV2aWNlX2luZm8gZGV2aWNlX2luZm87CisJYm9vbCBkZXZfaXNfaWRlID0gKChkZXZfaWQtPmRyaXZlcl9kYXRhID09IElERV9HVUlEKSA/IHRydWUgOiBmYWxzZSk7CisJaW50IHBhdGggPSAwOworCWludCB0YXJnZXQgPSAwOworCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7CiAKIAlob3N0ID0gc2NzaV9ob3N0X2FsbG9jKCZzY3NpX2RyaXZlciwKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IGh2X2hvc3RfZGV2aWNlKSk7CiAJaWYgKCFob3N0KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWRldl9zZXRfZHJ2ZGF0YSgmZGV2aWNlLT5kZXZpY2UsIGhvc3QpOwotCiAJaG9zdF9kZXYgPSAoc3RydWN0IGh2X2hvc3RfZGV2aWNlICopaG9zdC0+aG9zdGRhdGE7CiAJbWVtc2V0KGhvc3RfZGV2LCAwLCBzaXplb2Yoc3RydWN0IGh2X2hvc3RfZGV2aWNlKSk7CiAKQEAgLTY4MSwxOSArMTM3NiwzMyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlkZXZpY2VfaW5mby5wb3J0X251bWJlciA9IGhvc3QtPmhvc3Rfbm87Ci0JZGV2aWNlX2luZm8ucmluZ19idWZmZXJfc2l6ZSAgPSBzdG9ydnNjX3JpbmdidWZmZXJfc2l6ZTsKLQkvKiBDYWxsIHRvIHRoZSB2c2MgZHJpdmVyIHRvIGFkZCB0aGUgZGV2aWNlICovCi0JcmV0ID0gc3RvcnZzY19kZXZfYWRkKGRldmljZSwgKHZvaWQgKikmZGV2aWNlX2luZm8pOwotCi0JaWYgKHJldCAhPSAwKSB7CisJc3Rvcl9kZXZpY2UgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RvcnZzY19kZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0b3JfZGV2aWNlKSB7CiAJCWttZW1fY2FjaGVfZGVzdHJveShob3N0X2Rldi0+cmVxdWVzdF9wb29sKTsKIAkJc2NzaV9ob3N0X3B1dChob3N0KTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlob3N0X2Rldi0+cGF0aCA9IGRldmljZV9pbmZvLnBhdGhfaWQ7Ci0JaG9zdF9kZXYtPnRhcmdldCA9IGRldmljZV9pbmZvLnRhcmdldF9pZDsKKwlzdG9yX2RldmljZS0+ZGVzdHJveSA9IGZhbHNlOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN0b3JfZGV2aWNlLT53YWl0aW5nX3RvX2RyYWluKTsKKwlzdG9yX2RldmljZS0+ZGV2aWNlID0gZGV2aWNlOworCXN0b3JfZGV2aWNlLT5ob3N0ID0gaG9zdDsKKwlodl9zZXRfZHJ2ZGF0YShkZXZpY2UsIHN0b3JfZGV2aWNlKTsKKworCXN0b3JfZGV2aWNlLT5wb3J0X251bWJlciA9IGhvc3QtPmhvc3Rfbm87CisJcmV0ID0gc3RvcnZzY19jb25uZWN0X3RvX3ZzcChkZXZpY2UsIHN0b3J2c2NfcmluZ2J1ZmZlcl9zaXplKTsKKwlpZiAocmV0KSB7CisJCWttZW1fY2FjaGVfZGVzdHJveShob3N0X2Rldi0+cmVxdWVzdF9wb29sKTsKKwkJc2NzaV9ob3N0X3B1dChob3N0KTsKKwkJa2ZyZWUoc3Rvcl9kZXZpY2UpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChkZXZfaXNfaWRlKQorCQlzdG9ydnNjX2dldF9pZGVfaW5mbyhkZXZpY2UsICZ0YXJnZXQsICZwYXRoKTsKKworCWhvc3RfZGV2LT5wYXRoID0gc3Rvcl9kZXZpY2UtPnBhdGhfaWQ7CisJaG9zdF9kZXYtPnRhcmdldCA9IHN0b3JfZGV2aWNlLT50YXJnZXRfaWQ7CiAKIAkvKiBtYXggIyBvZiBkZXZpY2VzIHBlciB0YXJnZXQgKi8KIAlob3N0LT5tYXhfbHVuID0gU1RPUlZTQ19NQVhfTFVOU19QRVJfVEFSR0VUOwpAQCAtNzAxLDU0ICsxNDEwLDQzIEBACiAJaG9zdC0+bWF4X2lkID0gU1RPUlZTQ19NQVhfVEFSR0VUUzsKIAkvKiBtYXggIyBvZiBjaGFubmVscyAqLwogCWhvc3QtPm1heF9jaGFubmVsID0gU1RPUlZTQ19NQVhfQ0hBTk5FTFMgLSAxOworCS8qIG1heCBjbWQgbGVuZ3RoICovCisJaG9zdC0+bWF4X2NtZF9sZW4gPSBTVE9SVlNDX01BWF9DTURfTEVOOwogCiAJLyogUmVnaXN0ZXIgdGhlIEhCQSBhbmQgc3RhcnQgdGhlIHNjc2kgYnVzIHNjYW4gKi8KIAlyZXQgPSBzY3NpX2FkZF9ob3N0KGhvc3QsICZkZXZpY2UtPmRldmljZSk7Ci0JaWYgKHJldCAhPSAwKSB7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGVycl9vdXQ7CiAKLQkJc3RvcnZzY19kZXZfcmVtb3ZlKGRldmljZSk7Ci0KLQkJa21lbV9jYWNoZV9kZXN0cm95KGhvc3RfZGV2LT5yZXF1ZXN0X3Bvb2wpOwotCQlzY3NpX2hvc3RfcHV0KGhvc3QpOwotCQlyZXR1cm4gLTE7CisJaWYgKCFkZXZfaXNfaWRlKSB7CisJCXNjc2lfc2Nhbl9ob3N0KGhvc3QpOworCQlyZXR1cm4gMDsKIAl9CisJcmV0ID0gc2NzaV9hZGRfZGV2aWNlKGhvc3QsIDAsIHRhcmdldCwgMCk7CisJaWYgKHJldCkgeworCQlzY3NpX3JlbW92ZV9ob3N0KGhvc3QpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCXJldHVybiAwOwogCi0Jc2NzaV9zY2FuX2hvc3QoaG9zdCk7Ci0JcmV0dXJuIHJldDsKK2Vycl9vdXQ6CisJc3RvcnZzY19kZXZfcmVtb3ZlKGRldmljZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KGhvc3RfZGV2LT5yZXF1ZXN0X3Bvb2wpOworCXNjc2lfaG9zdF9wdXQoaG9zdCk7CisJcmV0dXJuIC1FTk9ERVY7CiB9CiAKIC8qIFRoZSBvbmUgYW5kIG9ubHkgb25lICovCiAKIHN0YXRpYyBzdHJ1Y3QgaHZfZHJpdmVyIHN0b3J2c2NfZHJ2ID0geworCS5uYW1lID0gInN0b3J2c2MiLAorCS5pZF90YWJsZSA9IGlkX3RhYmxlLAogCS5wcm9iZSA9IHN0b3J2c2NfcHJvYmUsCiAJLnJlbW92ZSA9IHN0b3J2c2NfcmVtb3ZlLAogfTsKIAotLyoKLSAqIFdlIHVzZSBhIERNSSB0YWJsZSB0byBkZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIGF1dG9sb2FkIHRoaXMgZHJpdmVyICBUaGlzIGlzCi0gKiBuZWVkZWQgYnkgZGlzdHJvIHRvb2xzIHRvIGRldGVybWluZSBpZiB0aGUgaHlwZXJ2IGRyaXZlcnMgc2hvdWxkIGJlCi0gKiBpbnN0YWxsZWQgYW5kL29yIGNvbmZpZ3VyZWQuICBXZSBkb24ndCBkbyBhbnl0aGluZyBlbHNlIHdpdGggdGhlIHRhYmxlLCBidXQKLSAqIGl0IG5lZWRzIHRvIGJlIHByZXNlbnQuCi0gKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkIF9faW5pdGNvbnN0Ci1odl9zdG9yX2RtaV90YWJsZVtdIF9fbWF5YmVfdW51c2VkICA9IHsKLQl7Ci0JCS5pZGVudCA9ICJIeXBlci1WIiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJNaWNyb3NvZnQgQ29ycG9yYXRpb24iKSwKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVmlydHVhbCBNYWNoaW5lIiksCi0JCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJWaXJ0dWFsIE1hY2hpbmUiKSwKLQkJfSwKLQl9LAotCXsgfSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGRtaSwgaHZfc3Rvcl9kbWlfdGFibGUpOwotCiBzdGF0aWMgaW50IF9faW5pdCBzdG9ydnNjX2Rydl9pbml0KHZvaWQpCiB7Ci0JaW50IHJldDsKLQlzdHJ1Y3QgaHZfZHJpdmVyICpkcnYgPSAmc3RvcnZzY19kcnY7CiAJdTMyIG1heF9vdXRzdGFuZGluZ19yZXFfcGVyX2NoYW5uZWw7CiAKIAkvKgpAQCAtNzU3LDMyICsxNDU1LDIyIEBACiAJICogdGhlIHJpbmcgYnVmZmVyIGluZGljZXMpIGJ5IHRoZSBtYXggcmVxdWVzdCBzaXplICh3aGljaCBpcwogCSAqIHZtYnVzX2NoYW5uZWxfcGFja2V0X211bHRpcGFnZV9idWZmZXIgKyBzdHJ1Y3QgdnN0b3JfcGFja2V0ICsgdTY0KQogCSAqLwotCiAJbWF4X291dHN0YW5kaW5nX3JlcV9wZXJfY2hhbm5lbCA9Ci0JKChzdG9ydnNjX3JpbmdidWZmZXJfc2l6ZSAtIFBBR0VfU0laRSkgLwotCUFMSUdOKE1BWF9NVUxUSVBBR0VfQlVGRkVSX1BBQ0tFVCArCi0Jc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpICsgc2l6ZW9mKHU2NCksCi0Jc2l6ZW9mKHU2NCkpKTsKLQotCW1lbWNweSgmZHJ2LT5kZXZfdHlwZSwgJnN0b3JfdnNjaV9kZXZpY2VfdHlwZSwKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCBodl9ndWlkKSk7CisJCSgoc3RvcnZzY19yaW5nYnVmZmVyX3NpemUgLSBQQUdFX1NJWkUpIC8KKwkJQUxJR04oTUFYX01VTFRJUEFHRV9CVUZGRVJfUEFDS0VUICsKKwkJc2l6ZW9mKHN0cnVjdCB2c3Rvcl9wYWNrZXQpICsgc2l6ZW9mKHU2NCksCisJCXNpemVvZih1NjQpKSk7CiAKIAlpZiAobWF4X291dHN0YW5kaW5nX3JlcV9wZXJfY2hhbm5lbCA8CiAJICAgIFNUT1JWU0NfTUFYX0lPX1JFUVVFU1RTKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRUlOVkFMOwogCi0JZHJ2LT5kcml2ZXIubmFtZSA9IGRyaXZlcl9uYW1lOwotCi0KLQkvKiBUaGUgZHJpdmVyIGJlbG9uZ3MgdG8gdm1idXMgKi8KLQlyZXQgPSB2bWJ1c19jaGlsZF9kcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIHZtYnVzX2RyaXZlcl9yZWdpc3Rlcigmc3RvcnZzY19kcnYpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgc3RvcnZzY19kcnZfZXhpdCh2b2lkKQogewotCXZtYnVzX2NoaWxkX2RyaXZlcl91bnJlZ2lzdGVyKCZzdG9ydnNjX2Rydi5kcml2ZXIpOworCXZtYnVzX2RyaXZlcl91bnJlZ2lzdGVyKCZzdG9ydnNjX2Rydik7CiB9CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9nZW5lcmljX2J1ZmZlci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2dlbmVyaWNfYnVmZmVyLmMKaW5kZXggZjgyODk0Zi4uZDU4MDk1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2dlbmVyaWNfYnVmZmVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2dlbmVyaWNfYnVmZmVyLmMKQEAgLTE3Myw3ICsxNzMsNyBAQAogCQlyZXR1cm4gLTE7CiAKIAkvKiBGaW5kIHRoZSBkZXZpY2UgcmVxdWVzdGVkICovCi0JZGV2X251bSA9IGZpbmRfdHlwZV9ieV9uYW1lKGRldmljZV9uYW1lLCAiZGV2aWNlIik7CisJZGV2X251bSA9IGZpbmRfdHlwZV9ieV9uYW1lKGRldmljZV9uYW1lLCAiaWlvOmRldmljZSIpOwogCWlmIChkZXZfbnVtIDwgMCkgewogCQlwcmludGYoIkZhaWxlZCB0byBmaW5kIHRoZSAlc1xuIiwgZGV2aWNlX25hbWUpOwogCQlyZXQgPSAtRU5PREVWOwpAQCAtMTgxLDcgKzE4MSw3IEBACiAJfQogCXByaW50ZigiaWlvIGRldmljZSBudW1iZXIgYmVpbmcgdXNlZCBpcyAlZFxuIiwgZGV2X251bSk7CiAKLQlhc3ByaW50ZigmZGV2X2Rpcl9uYW1lLCAiJXNkZXZpY2UlZCIsIGlpb19kaXIsIGRldl9udW0pOworCWFzcHJpbnRmKCZkZXZfZGlyX25hbWUsICIlc2lpbzpkZXZpY2UlZCIsIGlpb19kaXIsIGRldl9udW0pOwogCWlmICh0cmlnZ2VyX25hbWUgPT0gTlVMTCkgewogCQkvKgogCQkgKiBCdWlsZCB0aGUgdHJpZ2dlciBuYW1lLiBJZiBpdCBpcyBkZXZpY2UgYXNzb2NpYXRlZCBpdCdzCkBAIC0yMTIsNiArMjEyLDcgQEAKIAlyZXQgPSBidWlsZF9jaGFubmVsX2FycmF5KGRldl9kaXJfbmFtZSwgJmluZm9hcnJheSwgJm51bV9jaGFubmVscyk7CiAJaWYgKHJldCkgewogCQlwcmludGYoIlByb2JsZW0gcmVhZGluZyBzY2FuIGVsZW1lbnQgaW5mb3JtYXRpb25cbiIpOworCQlwcmludGYoImRpYWcgJXNcbiIsIGRldl9kaXJfbmFtZSk7CiAJCWdvdG8gZXJyb3JfZnJlZV90cmlnZ2VybmFtZTsKIAl9CiAKQEAgLTIyMCw3ICsyMjEsOCBAQAogCSAqIEFzIHdlIGtub3cgdGhhdCB0aGUgbGlzM2wwMmRxIGhhcyBvbmx5IG9uZSBidWZmZXIgdGhpcyBtYXkKIAkgKiBiZSBidWlsdCByYXRoZXIgdGhhbiBmb3VuZC4KIAkgKi8KLQlyZXQgPSBhc3ByaW50ZigmYnVmX2Rpcl9uYW1lLCAiJXNkZXZpY2UlZDpidWZmZXIwIiwgaWlvX2RpciwgZGV2X251bSk7CisJcmV0ID0gYXNwcmludGYoJmJ1Zl9kaXJfbmFtZSwKKwkJICAgICAgICIlc2lpbzpkZXZpY2UlZC9idWZmZXIiLCBpaW9fZGlyLCBkZXZfbnVtKTsKIAlpZiAocmV0IDwgMCkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycm9yX2ZyZWVfdHJpZ2dlcm5hbWU7CkBAIC0yNTEsOSArMjUzLDcgQEAKIAkJZ290byBlcnJvcl9mcmVlX2J1Zl9kaXJfbmFtZTsKIAl9CiAKLQlyZXQgPSBhc3ByaW50ZigmYnVmZmVyX2FjY2VzcywKLQkJICAgICAgICIvZGV2L2RldmljZSVkOmJ1ZmZlcjAiLAotCQkgICAgICAgZGV2X251bSk7CisJcmV0ID0gYXNwcmludGYoJmJ1ZmZlcl9hY2Nlc3MsICIvZGV2L2lpbzpkZXZpY2UlZCIsIGRldl9udW0pOwogCWlmIChyZXQgPCAwKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfZnJlZV9kYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2lpb191dGlscy5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2lpb191dGlscy5oCmluZGV4IDE1MGY0NDAuLjc1OTM4YjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9paW9fdXRpbHMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vaWlvX3V0aWxzLmgKQEAgLTE2LDcgKzE2LDcgQEAKIAogI2RlZmluZSBJSU9fTUFYX05BTUVfTEVOR1RIIDMwCiAKLSNkZWZpbmUgRk9STUFUX1NDQU5fRUxFTUVOVFNfRElSICIlczpidWZmZXIwL3NjYW5fZWxlbWVudHMiCisjZGVmaW5lIEZPUk1BVF9TQ0FOX0VMRU1FTlRTX0RJUiAiJXMvc2Nhbl9lbGVtZW50cyIKICNkZWZpbmUgRk9STUFUX1RZUEVfRklMRSAiJXNfdHlwZSIKIAogY29uc3QgY2hhciAqaWlvX2RpciA9ICIvc3lzL2J1cy9paW8vZGV2aWNlcy8iOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL3N5c2ZzLWJ1cy1paW8gYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vc3lzZnMtYnVzLWlpbwppbmRleCA0NjdjNDlhLi4wZDY4MjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vc3lzZnMtYnVzLWlpbworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vc3lzZnMtYnVzLWlpbwpAQCAtMSwxNyArMSwxMSBAQAotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWAogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKLQkJSGFyZHdhcmUgY2hpcCBvciBkZXZpY2UgYWNjZXNzZWQgYnkgb24gY29tbXVuaWNhdGlvbiBwb3J0LgorCQlIYXJkd2FyZSBjaGlwIG9yIGRldmljZSBhY2Nlc3NlZCBieSBvbmUgY29tbXVuaWNhdGlvbiBwb3J0LgogCQlDb3JyZXNwb25kcyB0byBhIGdyb3VwaW5nIG9mIHNlbnNvciBjaGFubmVscy4gWCBpcyB0aGUgSUlPCiAJCWluZGV4IG9mIHRoZSBkZXZpY2UuCiAKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2Vbbl0vcG93ZXJfc3RhdGUKLUtlcm5lbFZlcnNpb246CTIuNi4zNwotQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwotRGVzY3JpcHRpb246Ci0JCVRoaXMgcHJvcGVydHkgZ2V0cy9zZXRzIHRoZSBkZXZpY2UgcG93ZXIgc3RhdGUuCi0KIFdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy90cmlnZ2VyWAogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCkBAIC0yNSwyMSArMTksMjIgQEAKIAkJZ2VuZXJhbGl6ZSB3ZWxsIGFuZCBoZW5jZSBhcmUgbm90IGRvY3VtZW50ZWQgaW4gdGhpcyBmaWxlLgogCQlYIGlzIHRoZSBJSU8gaW5kZXggb2YgdGhlIHRyaWdnZXIuCiAKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlcgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2J1ZmZlcgogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKLQkJTGluayB0byAvc3lzL2NsYXNzL2lpby9kZXZpY2VYL2RldmljZVg6YnVmZmVyLiBYIGluZGljYXRlcwotCQl0aGUgZGV2aWNlIHdpdGggd2hpY2ggdGhpcyBidWZmZXIgYnVmZmVyIGlzIGFzc29jaWF0ZWQuCisJCURpcmVjdG9yeSBvZiBhdHRyaWJ1dGVzIHJlbGF0aW5nIHRvIHRoZSBidWZmZXIgZm9yIHRoZSBkZXZpY2UuCiAKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL25hbWUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9uYW1lCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlEZXNjcmlwdGlvbiBvZiB0aGUgcGh5c2ljYWwgY2hpcCAvIGRldmljZSBmb3IgZGV2aWNlIFguCiAJCVR5cGljYWxseSBhIHBhcnQgbnVtYmVyLgogCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9zYW1wbGluZ19mcmVxdWVuY3kKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9zYW1wbGluZ19mcmVxdWVuY3kKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9idWZmZXIvc2FtcGxpbmdfZnJlcXVlbmN5CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvdHJpZ2dlclgvc2FtcGxpbmdfZnJlcXVlbmN5CiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgpAQCAtNTAsNDIgKzQ1LDMyIEBACiAJCWVmZmVjdHMgZGF0YXJkeSB0cmlnZ2VycywgaGFyZHdhcmUgYnVmZmVycyBhbmQgdGhlIHN5c2ZzCiAJCWRpcmVjdCBhY2Nlc3MgaW50ZXJmYWNlcywgaXQgbWF5IGJlIGZvdW5kIGluIGFueSBvZiB0aGUKIAkJcmVsZXZhbnQgZGlyZWN0b3JpZXMuICBJZiBpdCBlZmZlY3RzIGFsbCBvZiB0aGUgYWJvdmUKLQkJdGhlbiBpdCBpcyB0byBiZSBmb3VuZCBpbiB0aGUgYmFzZSBkZXZpY2UgZGlyZWN0b3J5IGFzIGhlcmUuCisJCXRoZW4gaXQgaXMgdG8gYmUgZm91bmQgaW4gdGhlIGJhc2UgZGV2aWNlIGRpcmVjdG9yeS4KIAotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL3NhbXBsaW5nX2ZyZXF1ZW5jeV9hdmFpbGFibGUKK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9idWZmZXIvc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL3RyaWdnZXJYL3NhbXBsaW5nX2ZyZXF1ZW5jeV9hdmFpbGFibGUKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCVdoZW4gdGhlIGludGVybmFsIHNhbXBsaW5nIGNsb2NrIGNhbiBvbmx5IHRha2UgYSBzbWFsbAogCQlkaXNjcmV0ZSBzZXQgb2YgdmFsdWVzLCB0aGlzIGZpbGUgbGlzdHMgdGhvc2UgYXZhaWxhYmxlLgogCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9yYW5nZQotS2VybmVsVmVyc2lvbjoJMi42LjM4Ci1Db250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCi1EZXNjcmlwdGlvbjoKLQkJSGFyZHdhcmUgZGVwZW5kZW50IEFEQyBGdWxsIFNjYWxlIFJhbmdlIGluIG1Wb2x0LgotCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9yYW5nZV9hdmFpbGFibGUKLUtlcm5lbFZlcnNpb246CTIuNi4zOAotQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwotRGVzY3JpcHRpb246Ci0JCUhhcmR3YXJlIGRlcGVuZGVudCBzdXBwb3J0ZWQgdmFsZXMgZm9yIEFEQyBGdWxsIFNjYWxlIFJhbmdlLgotCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9vdmVyc2FtcGxpbmdfcmF0aW8KK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9vdmVyc2FtcGxpbmdfcmF0aW8KIEtlcm5lbFZlcnNpb246CTIuNi4zOAogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCUhhcmR3YXJlIGRlcGVuZGVudCBBREMgb3ZlcnNhbXBsaW5nLiBDb250cm9scyB0aGUgc2FtcGxpbmcgcmF0aW8KIAkJb2YgdGhlIGRpZ2l0YWwgZmlsdGVyIGlmIGF2YWlsYWJsZS4KIAotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvb3ZlcnNhbXBsaW5nX3JhdGlvX2F2YWlsYWJsZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL292ZXJzYW1wbGluZ19yYXRpb19hdmFpbGFibGUKIEtlcm5lbFZlcnNpb246CTIuNi4zOAogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCUhhcmR3YXJlIGRlcGVuZGVudCB2YWx1ZXMgc3VwcG9ydGVkIGJ5IHRoZSBvdmVyc2FtcGxpbmcgZmlsdGVyLgogCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9pbllfcmF3Ci1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9pbllfc3VwcGx5X3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX3ZvbHRhZ2VZX3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX3ZvbHRhZ2VZX3N1cHBseV9yYXcKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CkBAIC05Myw5ICs3OCwxMCBAQAogCQljaGFubmVsIFkuIEluIHNwZWNpYWwgY2FzZXMgd2hlcmUgdGhlIGNoYW5uZWwgZG9lcyBub3QKIAkJY29ycmVzcG9uZCB0byBleHRlcm5hbGx5IGF2YWlsYWJsZSBpbnB1dCBvbmUgb2YgdGhlIG5hbWVkCiAJCXZlcnNpb25zIG1heSBiZSB1c2VkLiBUaGUgbnVtYmVyIG11c3QgYWx3YXlzIGJlIHNwZWNpZmllZCBhbmQKLQkJdW5pcXVlIHRvIGFsbG93IGFzc29jaWF0aW9uIHdpdGggZXZlbnQgY29kZXMuCisJCXVuaXF1ZSB0byBhbGxvdyBhc3NvY2lhdGlvbiB3aXRoIGV2ZW50IGNvZGVzLiBVbml0cyBhZnRlcgorCQlhcHBsaWNhdGlvbiBvZiBzY2FsZSBhbmQgb2Zmc2V0IGFyZSBtaWNyb3ZvbHRzLgogCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9pblktaW5aX3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX3ZvbHRhZ2VZLXZvbHRhZ2VaX3JhdwogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKQEAgLTEwMyw1MiArODksNzMgQEAKIAkJY2hhbm5lbCBZIC0gY2hhbm5lbCBaIHdoZXJlIHRoZXNlIGNoYW5uZWwgbnVtYmVycyBhcHBseSB0byB0aGUKIAkJcGh5c2ljYWxseSBlcXVpdmFsZW50IGlucHV0cyB3aGVuIG5vbiBkaWZmZXJlbnRpYWwgcmVhZGluZ3MgYXJlCiAJCXNlcGFyYXRlbHkgYXZhaWxhYmxlLiBJbiBkaWZmZXJlbnRpYWwgb25seSBwYXJ0cywgdGhlbiBhbGwgdGhhdAotCQlpcyByZXF1aXJlZCBpcyBhIGNvbnNpc3RlbnQgbGFiZWxpbmcuCisJCWlzIHJlcXVpcmVkIGlzIGEgY29uc2lzdGVudCBsYWJlbGluZy4gIFVuaXRzIGFmdGVyIGFwcGxpY2F0aW9uCisJCW9mIHNjYWxlIGFuZCBvZmZzZXQgYXJlIG1pY3Jvdm9sdHMuCiAKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL3RlbXBfcmF3Ci1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC90ZW1wX3hfcmF3Ci1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC90ZW1wX3lfcmF3Ci1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC90ZW1wX3pfcmF3CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fY2FwYWNpdGFuY2VZX3JhdworS2VybmVsVmVyc2lvbjoJMy4yCitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJUmF3IGNhcGFjaXRhbmNlIG1lYXN1cmVtZW50IGZyb20gY2hhbm5lbCBZLiBVbml0cyBhZnRlcgorCQlhcHBsaWNhdGlvbiBvZiBzY2FsZSBhbmQgb2Zmc2V0IGFyZSBuYW5vZmFyYWRzLgorCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvaW5fY2FwYWNpdGFuY2VZLWluX2NhcGFjaXRhbmNlWl9yYXcKK0tlcm5lbFZlcnNpb246CTMuMgorQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCVJhdyBkaWZmZXJlbnRpYWwgY2FwYWNpdGFuY2UgbWVhc3VyZW1lbnQgZXF1aXZhbGVudCB0bworCQljaGFubmVsIFkgLSBjaGFubmVsIFogd2hlcmUgdGhlc2UgY2hhbm5lbCBudW1iZXJzIGFwcGx5IHRvIHRoZQorCQlwaHlzaWNhbGx5IGVxdWl2YWxlbnQgaW5wdXRzIHdoZW4gbm9uIGRpZmZlcmVudGlhbCByZWFkaW5ncyBhcmUKKwkJc2VwYXJhdGVseSBhdmFpbGFibGUuIEluIGRpZmZlcmVudGlhbCBvbmx5IHBhcnRzLCB0aGVuIGFsbCB0aGF0CisJCWlzIHJlcXVpcmVkIGlzIGEgY29uc2lzdGVudCBsYWJlbGluZy4gIFVuaXRzIGFmdGVyIGFwcGxpY2F0aW9uCisJCW9mIHNjYWxlIGFuZCBvZmZzZXQgYXJlIG5hbm9mYXJhZHMuLgorCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fdGVtcF9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl90ZW1wWF9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl90ZW1wX3hfcmF3CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fdGVtcF95X3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX3RlbXBfel9yYXcKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCVJhdyAodW5zY2FsZWQgbm8gYmlhcyByZW1vdmFsIGV0YykgdGVtcGVyYXR1cmUgbWVhc3VyZW1lbnQuCiAJCUl0IGFuIGF4aXMgaXMgc3BlY2lmaWVkIGl0IGdlbmVyYWxseSBtZWFucyB0aGF0IHRoZSB0ZW1wZXJhdHVyZQogCQlzZW5zb3IgaXMgYXNzb2NpYXRlZCB3aXRoIG9uZSBwYXJ0IG9mIGEgY29tcG91bmQgZGV2aWNlIChlLmcuCi0JCWEgZ3lyb3Njb3BlIGF4aXMpLgorCQlhIGd5cm9zY29wZSBheGlzKS4gVW5pdHMgYWZ0ZXIgYXBwbGljYXRpb24gb2Ygc2NhbGUgYW5kIG9mZnNldAorCQlhcmUgbWlsbGkgZGVncmVlcyBDZWxzdWlzLgogCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC90ZW1wWF9pbnB1dAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX3RlbXBYX2lucHV0CiBLZXJuZWxWZXJzaW9uOgkyLjYuMzgKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlTY2FsZWQgdGVtcGVyYXR1cmUgbWVhc3VyZW1lbnQgaW4gbWlsbGkgZGVncmVlcyBDZWxzaXVzLgogCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9hY2NlbF94X3JhdwotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfeV9yYXcKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2FjY2VsX3pfcmF3CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fYWNjZWxfeF9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9hY2NlbF95X3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX2FjY2VsX3pfcmF3CiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlBY2NlbGVyYXRpb24gaW4gZGlyZWN0aW9uIHgsIHkgb3IgeiAobWF5IGJlIGFyYml0cmFyaWx5IGFzc2lnbmVkCi0JCWJ1dCBzaG91bGQgbWF0Y2ggb3RoZXIgc3VjaCBhc3NpZ25tZW50cyBvbiBkZXZpY2UpCi0JCWNoYW5uZWwgbSAobm90IHByZXNlbnQgaWYgb25seSBvbmUgYWNjZWxlcm9tZXRlciBjaGFubmVsIGF0Ci0JCXRoaXMgb3JpZW50YXRpb24pLiBIYXMgYWxsIG9mIHRoZSBlcXVpdmFsZW50IHBhcmFtZXRlcnMgYXMgcGVyCi0JCWluWS4gVW5pdHMgYWZ0ZXIgYXBwbGljYXRpb24gb2Ygc2NhbGUgYW5kIG9mZnNldCBhcmUgbS9zXjIuCisJCWJ1dCBzaG91bGQgbWF0Y2ggb3RoZXIgc3VjaCBhc3NpZ25tZW50cyBvbiBkZXZpY2UpLgorCQlIYXMgYWxsIG9mIHRoZSBlcXVpdmFsZW50IHBhcmFtZXRlcnMgYXMgcGVyIHZvbHRhZ2VZLiBVbml0cworCQlhZnRlciBhcHBsaWNhdGlvbiBvZiBzY2FsZSBhbmQgb2Zmc2V0IGFyZSBtL3NeMi4KIAotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvZ3lyb194X3JhdwotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvZ3lyb195X3JhdwotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvZ3lyb196X3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX2FuZ2x2ZWxfeF9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9hbmdsdmVsX3lfcmF3CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fYW5nbHZlbF96X3JhdwogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJQW5ndWxhciB2ZWxvY2l0eSBhYm91dCBheGlzIHgsIHkgb3IgeiAobWF5IGJlIGFyYml0cmFyaWx5CiAJCWFzc2lnbmVkKSBEYXRhIGNvbnZlcnRlZCBieSBhcHBsaWNhdGlvbiBvZiBvZmZzZXQgdGhlbiBzY2FsZSB0bwogCQlyYWRpYW5zIHBlciBzZWNvbmQuIEhhcyBhbGwgdGhlIGVxdWl2YWxlbnQgcGFyYW1ldGVycyBhcwotCQlwZXIgaW5ZLgorCQlwZXIgdm9sdGFnZVkuIFVuaXRzIGFmdGVyIGFwcGxpY2F0aW9uIG9mIHNjYWxlIGFuZCBvZmZzZXQgYXJlCisJCXJhZGlhbnMgcGVyIHNlY29uZC4KIAotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvaW5jbGlfeF9yYXcKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2luY2xpX3lfcmF3Ci1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9pbmNsaV96X3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX2luY2xpX3hfcmF3CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5faW5jbGlfeV9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9pbmNsaV96X3JhdwogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKQEAgLTE1Niw2MyArMTYzLDY5IEBACiAJCWFyYml0cmFyaWx5IGFzc2lnbmVkKS4gRGF0YSBjb252ZXJ0ZWQgYnkgYXBwbGljYXRpb24gb2Ygb2Zmc2V0CiAJCWFuZCBzY2FsZSB0byBEZWdyZWVzLgogCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9tYWduX3hfcmF3Ci1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9tYWduX3lfcmF3Ci1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9tYWduX3pfcmF3CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fbWFnbl94X3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX21hZ25feV9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9tYWduX3pfcmF3CiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlNYWduZXRpYyBmaWVsZCBhbG9uZyBheGlzIHgsIHkgb3IgeiAobWF5IGJlIGFyYml0cmFyaWx5Ci0JCWFzc2lnbmVkKSBjaGFubmVsIG0gKG5vdCBwcmVzZW50IGlmIG9ubHkgb25lIG1hZ25ldG9tZXRlcgotCQlhdCB0aGlzIG9yaWVudGF0aW9uKS4gIERhdGEgY29udmVydGVkIGJ5IGFwcGxpY2F0aW9uIG9mCi0JCW9mZnNldCB0aGVuIHNjYWxlIHRvIEdhdXNzLiBIYXMgYWxsIHRoZSBlcXVpdmFsZW50IG1vZGlmaWVycwotCQlhcyBwZXIgaW5ZLgorCQlhc3NpZ25lZCkuICBEYXRhIGNvbnZlcnRlZCBieSBhcHBsaWNhdGlvbiBvZiBvZmZzZXQKKwkJdGhlbiBzY2FsZSB0byBHYXVzcy4KIAotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfeF9wZWFrX3JhdwotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfeV9wZWFrX3JhdwotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfel9wZWFrX3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX2FjY2VsX3hfcGVha19yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9hY2NlbF95X3BlYWtfcmF3CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fYWNjZWxfel9wZWFrX3JhdwogS2VybmVsVmVyc2lvbjoJMi42LjM2CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKLQkJU29tZSBkZXZpY2VzIHByb3ZpZGUgYSBzdG9yZSBvZiB0aGUgaGlnaGVzdCB2YWx1ZSBzZWVuIHNpbmNlCi0JCXNvbWUgcmVzZXQgY29uZGl0aW9uLiAgVGhlc2UgYXR0cmlidXRlcyBhbGxvdyBhY2Nlc3MgdG8gdGhpcwotCQlhbmQgYXJlIG90aGVyd2lzZSB0aGUgZGlyZWN0IGVxdWl2YWxlbnQgb2YgdGhlCi0JCTx0eXBlPllbX25hbWVdX3JhdyBhdHRyaWJ1dGVzLgorCQlIaWdoZXN0IHZhbHVlIHNpbmNlIHNvbWUgcmVzZXQgY29uZGl0aW9uLiAgVGhlc2UKKwkJYXR0cmlidXRlcyBhbGxvdyBhY2Nlc3MgdG8gdGhpcyBhbmQgYXJlIG90aGVyd2lzZQorCQl0aGUgZGlyZWN0IGVxdWl2YWxlbnQgb2YgdGhlIDx0eXBlPllbX25hbWVdX3JhdyBhdHRyaWJ1dGVzLgogCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9hY2NlbF94eXpfc3F1YXJlZF9wZWFrX3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX2FjY2VsX3h5el9zcXVhcmVkX3BlYWtfcmF3CiBLZXJuZWxWZXJzaW9uOgkyLjYuMzYKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlBIGNvbXB1dGVkIHBlYWsgdmFsdWUgYmFzZWQgb24gdGhlIHN1bSBzcXVhcmVkIG1hZ25pdHVkZSBvZgogCQl0aGUgdW5kZXJseWluZyB2YWx1ZSBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdGlvbnMuCiAKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2FjY2VsX29mZnNldAotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvdGVtcF9vZmZzZXQKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9hY2NlbF9vZmZzZXQKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9hY2NlbF94X29mZnNldAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX2FjY2VsX3lfb2Zmc2V0CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fYWNjZWxfel9vZmZzZXQKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl92b2x0YWdlWV9vZmZzZXQKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl92b2x0YWdlX29mZnNldAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX3RlbXBZX29mZnNldAorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX3RlbXBfb2Zmc2V0CiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlJZiBrbm93biBmb3IgYSBkZXZpY2UsIG9mZnNldCB0byBiZSBhZGRlZCB0byA8dHlwZT5bWV1fcmF3IHByaW9yCiAJCXRvIHNjYWxpbmcgYnkgPHR5cGU+W1ldX3NjYWxlIGluIG9yZGVyIHRvIG9idGFpbiB2YWx1ZSBpbiB0aGUKIAkJPHR5cGU+IHVuaXRzIGFzIHNwZWNpZmllZCBpbiA8dHlwZT5beV1fcmF3IGRvY3VtZW50YXRpb24uCi0JCU5vdCBwcmVzZW50IGlmIHRoZSBvZmZzZXQgaXMgYWx3YXlzIDAgb3IgdW5rbm93bi4gSWYgWSBpcyBub3QKLQkJcHJlc2VudCwgdGhlbiB0aGUgb2Zmc2V0IGFwcGxpZXMgdG8gYWxsIGluIGNoYW5uZWxzIG9mIDx0eXBlPi4KKwkJTm90IHByZXNlbnQgaWYgdGhlIG9mZnNldCBpcyBhbHdheXMgMCBvciB1bmtub3duLiBJZiBZIG9yCisJCWF4aXMgPHh8eXx6PiBpcyBub3QgcHJlc2VudCwgdGhlbiB0aGUgb2Zmc2V0IGFwcGxpZXMgdG8gYWxsCisJCWluIGNoYW5uZWxzIG9mIDx0eXBlPi4KIAkJTWF5IGJlIHdyaXRhYmxlIGlmIGEgdmFyaWFibGUgb2Zmc2V0IGNhbiBiZSBhcHBsaWVkIG9uIHRoZQogCQlkZXZpY2UuIE5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCB0byBjYWxpYmJpYXMgd2hpY2gKIAkJaXMgZm9yIGRldmljZXMgKG9yIGRyaXZlcnMpIHRoYXQgYXBwbHkgb2Zmc2V0cyB0byBjb21wZW5zYXRlCiAJCWZvciB2YXJpYXRpb24gYmV0d2VlbiBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIHRoZSBwYXJ0LCB0eXBpY2FsbHkKIAkJYWRqdXN0ZWQgYnkgdXNpbmcgc29tZSBoYXJkd2FyZSBzdXBwb3J0ZWQgY2FsaWJyYXRpb24gcHJvY2VkdXJlLgorCQlDYWxpYmJpYXMgaXMgYXBwbGllZCBpbnRlcm5hbGx5LCBvZmZzZXQgaXMgYXBwbGllZCBpbiB1c2Vyc3BhY2UKKwkJdG8gdGhlIF9yYXcgb3V0cHV0LgogCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9pbllfc2NhbGUKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2luWV9zdXBwbHlfc2NhbGUKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2luX3NjYWxlCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9vdXRZX3NjYWxlCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9hY2NlbF9zY2FsZQotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfcGVha19zY2FsZQotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvZ3lyb19zY2FsZQotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvbWFnbl9zY2FsZQotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvbWFnbl94X3NjYWxlCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9tYWduX3lfc2NhbGUKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL21hZ25fel9zY2FsZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX3ZvbHRhZ2VZX3NjYWxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fdm9sdGFnZVlfc3VwcGx5X3NjYWxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fdm9sdGFnZV9zY2FsZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL291dF92b2x0YWdlWV9zY2FsZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX2FjY2VsX3NjYWxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fYWNjZWxfcGVha19zY2FsZQorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX2FuZ2x2ZWxfc2NhbGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9tYWduX3NjYWxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fbWFnbl94X3NjYWxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fbWFnbl95X3NjYWxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fbWFnbl96X3NjYWxlCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgpAQCAtMjIwLDMyICsyMzMsMzEgQEAKIAkJcG9zdCBhZGRpdGlvbiBvZiA8dHlwZT5bWV1bX25hbWVdX29mZnNldCBpbiBvcmRlciB0byBvYnRhaW4gdGhlCiAJCW1lYXN1cmVkIHZhbHVlIGluIDx0eXBlPiB1bml0cyBhcyBzcGVjaWZpZWQgaW4KIAkJPHR5cGU+W1ldW19uYW1lXV9yYXcgZG9jdW1lbnRhdGlvbi4uICBJZiBzaGFyZWQgYWNyb3NzIGFsbCBpbgotCQljaGFubmVscyB0aGVuIFkgaXMgbm90IHByZXNlbnQgYW5kIHRoZSB2YWx1ZSBpcyBjYWxsZWQKLQkJPHR5cGU+W1ldW19uYW1lXV9zY2FsZS4gVGhlIHBlYWsgbW9kaWZpZXIgbWVhbnMgdGhpcyB2YWx1ZQotCQlpcyBhcHBsaWVkIHRvIDx0eXBlPllbX25hbWVdX3BlYWtfcmF3IHZhbHVlcy4KKwkJY2hhbm5lbHMgdGhlbiBZIGFuZCA8eHx5fHo+IGFyZSBub3QgcHJlc2VudCBhbmQgdGhlIHZhbHVlIGlzCisJCWNhbGxlZCA8dHlwZT5bWV1bX25hbWVdX3NjYWxlLiBUaGUgcGVhayBtb2RpZmllciBtZWFucyB0aGlzCisJCXZhbHVlIGlzIGFwcGxpZWQgdG8gPHR5cGU+WVtfbmFtZV1fcGVha19yYXcgdmFsdWVzLgogCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9hY2NlbF94X2NhbGliYmlhcwotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfeV9jYWxpYmJpYXMKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2FjY2VsX3pfY2FsaWJiaWFzCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9neXJvX3hfY2FsaWJiaWFzCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9neXJvX3lfY2FsaWJiaWFzCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9neXJvX3pfY2FsaWJiaWFzCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fYWNjZWxfeF9jYWxpYmJpYXMKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9hY2NlbF95X2NhbGliYmlhcworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX2FjY2VsX3pfY2FsaWJiaWFzCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fYW5nbHZlbF94X2NhbGliYmlhcworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX2FuZ2x2ZWxfeV9jYWxpYmJpYXMKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9hbmdsdmVsX3pfY2FsaWJiaWFzCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlIYXJkd2FyZSBhcHBsaWVkIGNhbGlicmF0aW9uIG9mZnNldC4gKGFzc3VtZWQgdG8gZml4IHByb2R1Y3Rpb24KLQkJaW5hY2N1cmFjaWVzKS4gSWYgc2hhcmVkIGFjcm9zcyBhbGwgY2hhbm5lbHMsIDx0eXBlPl9jYWxpYmJpYXMKLQkJaXMgdXNlZC4KKwkJaW5hY2N1cmFjaWVzKS4KIAotV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9pbllfY2FsaWJzY2FsZQotV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9pbllfc3VwcGx5X2NhbGlic2NhbGUKLVdoYXQJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvaW5fY2FsaWJzY2FsZQotV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9hY2NlbF94X2NhbGlic2NhbGUKLVdoYXQJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvYWNjZWxfeV9jYWxpYnNjYWxlCi1XaGF0CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2FjY2VsX3pfY2FsaWJzY2FsZQotV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9neXJvX3hfY2FsaWJzY2FsZQotV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9neXJvX3lfY2FsaWJzY2FsZQotV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9neXJvX3pfY2FsaWJzY2FsZQorV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fdm9sdGFnZVlfY2FsaWJzY2FsZQorV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fdm9sdGFnZVlfc3VwcGx5X2NhbGlic2NhbGUKK1doYXQJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX3ZvbHRhZ2VfY2FsaWJzY2FsZQorV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fYWNjZWxfeF9jYWxpYnNjYWxlCitXaGF0CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9hY2NlbF95X2NhbGlic2NhbGUKK1doYXQJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX2FjY2VsX3pfY2FsaWJzY2FsZQorV2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fYW5nbHZlbF94X2NhbGlic2NhbGUKK1doYXQJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX2FuZ2x2ZWxfeV9jYWxpYnNjYWxlCitXaGF0CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9hbmdsdmVsX3pfY2FsaWJzY2FsZQogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKQEAgLTI1MywxNCArMjY1LDE4IEBACiAJCXByb2R1Y3Rpb24gaW5hY2N1cmFjaWVzKS4gIElmIHNoYXJlZCBhY3Jvc3MgYWxsIGNoYW5uZWxzLAogCQk8dHlwZT5fY2FsaWJzY2FsZSBpcyB1c2VkLgogCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9hY2NlbF9zY2FsZV9hdmFpbGFibGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9hY2NlbF9zY2FsZV9hdmFpbGFibGUKK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9pbl92b2x0YWdlWF9zY2FsZV9hdmFpbGFibGUKK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9pbl92b2x0YWdlLXZvbHRhZ2Vfc2NhbGVfYXZhaWxhYmxlCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvb3V0X3ZvbHRhZ2VYX3NjYWxlX2F2YWlsYWJsZQorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2luX2NhcGFjaXRhbmNlX3NjYWxlX2F2YWlsYWJsZQogS2VybmVsVmVyc2lvbjoJMi42MzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlJZiBhIGRpc2NyZXRlIHNldCBvZiBzY2FsZSB2YWx1ZXMgYXJlIGF2YWlsYWJsZSwgdGhleQogCQlhcmUgbGlzdGVkIGluIHRoaXMgYXR0cmlidXRlLgogCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9vdXRZX3JhdworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL291dF92b2x0YWdlWV9yYXcKIEtlcm5lbFZlcnNpb246CTIuNi4zNwogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CkBAIC0yNjgsNyArMjg0LDcgQEAKIAkJY2hhbm5lbCBZLiAgVGhlIG51bWJlciBtdXN0IGFsd2F5cyBiZSBzcGVjaWZpZWQgYW5kCiAJCXVuaXF1ZSBpZiB0aGUgb3V0cHV0IGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIGNoYW5uZWwuCiAKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL291dFkmWl9yYXcKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9vdXRfdm9sdGFnZVkmWl9yYXcKIEtlcm5lbFZlcnNpb246CTIuNi4zNwogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CkBAIC0yNzcsOCArMjkzLDggQEAKIAkJd2hlcmUgYSBzaW5nbGUgb3V0cHV0IHNldHMgdGhlIHZhbHVlIGZvciBtdWx0aXBsZSBjaGFubmVscwogCQlzaW11bHRhbmVvdXNseS4KIAotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvb3V0WV9wb3dlcmRvd25fbW9kZQotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvb3V0X3Bvd2VyZG93bl9tb2RlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvb3V0X3ZvbHRhZ2VZX3Bvd2VyZG93bl9tb2RlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvb3V0X3ZvbHRhZ2VfcG93ZXJkb3duX21vZGUKIEtlcm5lbFZlcnNpb246CTIuNi4zOAogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CkBAIC0yOTEsMTYgKzMwNywxNiBAQAogCQlvdXRYX3Bvd2VyZG93bl9tb2RlX2F2YWlsYWJsZS4gSWYgWSBpcyBub3QgcHJlc2VudCB0aGUKIAkJbW9kZSBpcyBzaGFyZWQgYWNyb3NzIGFsbCBvdXRwdXRzLgogCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9vdXRZX3Bvd2VyZG93bl9tb2RlX2F2YWlsYWJsZQotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvb3V0X3Bvd2VyZG93bl9tb2RlX2F2YWlsYWJsZQorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL291dF92b3RsYWdlWV9wb3dlcmRvd25fbW9kZV9hdmFpbGFibGUKK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9vdXRfdm9sdGFnZV9wb3dlcmRvd25fbW9kZV9hdmFpbGFibGUKIEtlcm5lbFZlcnNpb246CTIuNi4zOAogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCUxpc3RzIGFsbCBhdmFpbGFibGUgb3V0cHV0IHBvd2VyIGRvd24gbW9kZXMuCiAJCUlmIFkgaXMgbm90IHByZXNlbnQgdGhlIG1vZGUgaXMgc2hhcmVkIGFjcm9zcyBhbGwgb3V0cHV0cy4KIAotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvb3V0WV9wb3dlcmRvd24KLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL291dF9wb3dlcmRvd24KK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9vdXRfdm9sdGFnZVlfcG93ZXJkb3duCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvb3V0X3ZvbHRhZ2VfcG93ZXJkb3duCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzgKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgpAQCAtMzA5LDU1ICszMjUsNDcgQEAKIAkJbm9ybWFsIG9wZXJhdGlvbi4gWSBtYXkgYmUgc3VwcHJlc3NlZCBpZiBhbGwgb3V0cHV0cyBhcmUKIAkJY29udHJvbGxlZCB0b2dldGhlci4KIAotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVgvZGV2aWNlWDpldmVudFkKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9ldmVudHMKIEtlcm5lbFZlcnNpb246CTIuNi4zNQogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCUNvbmZpZ3VyYXRpb24gb2Ygd2hpY2ggaGFyZHdhcmUgZ2VuZXJhdGVkIGV2ZW50cyBhcmUgcGFzc2VkIHVwCiAJCXRvIHVzZXItc3BhY2UuCiAKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmV2ZW50L2RldgotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6ZXZlbnRZL2RldgotS2VybmVsVmVyc2lvbjoJMi42LjM1Ci1Db250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCi1EZXNjcmlwdGlvbjoKLQkJbWFqb3I6bWlub3IgY2hhcmFjdGVyIGRldmljZSBudW1iZXJzIGZvciB0aGUgZXZlbnQgbGluZSBZIG9mCi0JCWRldmljZSBYLgotCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeF90aHJlc2hfcmlzaW5nX2VuCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeF90aHJlc2hfZmFsbGluZ19lbgotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3lfdGhyZXNoX3Jpc2luZ19lbgotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3lfdGhyZXNoX2ZhbGxpbmdfZW4KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X3RocmVzaF9yaXNpbmdfZW4KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X3RocmVzaF9mYWxsaW5nX2VuCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb194X3RocmVzaF9yaXNpbmdfZW4KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3hfdGhyZXNoX2ZhbGxpbmdfZW4KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3lfdGhyZXNoX3Jpc2luZ19lbgotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feV90aHJlc2hfZmFsbGluZ19lbgotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9fel90aHJlc2hfcmlzaW5nX2VuCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb196X3RocmVzaF9mYWxsaW5nX2VuCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl94X3RocmVzaF9yaXNpbmdfZW4KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3hfdGhyZXNoX2ZhbGxpbmdfZW4KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3lfdGhyZXNoX3Jpc2luZ19lbgotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feV90aHJlc2hfZmFsbGluZ19lbgotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25fel90aHJlc2hfcmlzaW5nX2VuCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl96X3RocmVzaF9mYWxsaW5nX2VuCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3N1cHBseV90aHJlc2hfcmlzaW5nX2VuCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3N1cHBseV90aHJlc2hfZmFsbGluZ19lbgotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl90aHJlc2hfcmlzaW5nX2VuCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3RocmVzaF9mYWxsaW5nX2VuCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvdGVtcF90aHJlc2hfcmlzaW5nX2VuCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvdGVtcF90aHJlc2hfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2V2ZW50cy9pbl9hY2NlbF94X3RocmVzaF9yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9ldmVudHMvaW5fYWNjZWxfeF90aHJlc2hfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2V2ZW50cy9pbl9hY2NlbF95X3RocmVzaF9yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9ldmVudHMvaW5fYWNjZWxfeV90aHJlc2hfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2V2ZW50cy9pbl9hY2NlbF96X3RocmVzaF9yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9ldmVudHMvaW5fYWNjZWxfel90aHJlc2hfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2V2ZW50cy9pbl9hbmdsdmVsX3hfdGhyZXNoX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2V2ZW50cy9pbl9hbmdsdmVsX3hfdGhyZXNoX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9ldmVudHMvaW5fYW5nbHZlbF95X3RocmVzaF9yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9ldmVudHMvaW5fYW5nbHZlbF95X3RocmVzaF9mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvZXZlbnRzL2luX2FuZ2x2ZWxfel90aHJlc2hfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvZXZlbnRzL2luX2FuZ2x2ZWxfel90aHJlc2hfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2V2ZW50cy9pbl9tYWduX3hfdGhyZXNoX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2V2ZW50cy9pbl9tYWduX3hfdGhyZXNoX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9ldmVudHMvaW5fbWFnbl95X3RocmVzaF9yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9ldmVudHMvaW5fbWFnbl95X3RocmVzaF9mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvZXZlbnRzL2luX21hZ25fel90aHJlc2hfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvZXZlbnRzL2luX21hZ25fel90aHJlc2hfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2V2ZW50cy9pbl92b2x0YWdlWV9zdXBwbHlfdGhyZXNoX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2V2ZW50cy9pbl92b2x0YWdlWV9zdXBwbHlfdGhyZXNoX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9ldmVudHMvaW5fdm9sdGFnZVlfdGhyZXNoX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2V2ZW50cy9pbl92b2x0YWdlWV90aHJlc2hfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2V2ZW50cy9pbl90ZW1wWV90aHJlc2hfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvZXZlbnRzL2luX3RlbXBZX3RocmVzaF9mYWxsaW5nX2VuCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzcKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlFdmVudCBnZW5lcmF0ZWQgd2hlbiBjaGFubmVsIHBhc3NlcyBhIHRocmVzaG9sZCBpbiB0aGUgc3BlY2lmaWVkCiAJCShfcmlzaW5nfF9mYWxsaW5nKSBkaXJlY3Rpb24uIElmIHRoZSBkaXJlY3Rpb24gaXMgbm90IHNwZWNpZmllZCwKIAkJdGhlbiBlaXRoZXIgdGhlIGRldmljZSB3aWxsIHJlcG9ydCBhbiBldmVudCB3aGljaCBldmVyIGRpcmVjdGlvbgotCQlhIHNpbmdsZSB0aHJlc2hvbGQgdmFsdWUgaXMgY2FsbGVkIGluIChlLmcuCi0JCTx0eXBlPltaXVtfbmFtZV1fPHJhd3xpbnB1dD5fdGhyZXNoX3ZhbHVlKSBvcgotCQk8dHlwZT5bWl1bX25hbWVdXzxyYXd8aW5wdXQ+X3RocmVzaF9yaXNpbmdfdmFsdWUgYW5kCi0JCTx0eXBlPltaXVtfbmFtZV1fPHJhd3xpbnB1dD5fdGhyZXNoX2ZhbGxpbmdfdmFsdWUgbWF5IHRha2UKKwkJYSBzaW5nbGUgdGhyZXNob2xkIHZhbHVlIGlzIHBhc3NlZCBpbiAoZS5nLgorCQk8dHlwZT5bWV1bX25hbWVdXzxyYXd8aW5wdXQ+X3RocmVzaF92YWx1ZSkgb3IKKwkJPHR5cGU+W1ldW19uYW1lXV88cmF3fGlucHV0Pl90aHJlc2hfcmlzaW5nX3ZhbHVlIGFuZAorCQk8dHlwZT5bWV1bX25hbWVdXzxyYXd8aW5wdXQ+X3RocmVzaF9mYWxsaW5nX3ZhbHVlIG1heSB0YWtlCiAJCWRpZmZlcmVudCB2YWx1ZXMsIGJ1dCB0aGUgZGV2aWNlIGNhbiBvbmx5IGVuYWJsZSBib3RoIHRocmVzaG9sZHMKIAkJb3IgbmVpdGhlci4KIAkJTm90ZSB0aGUgZHJpdmVyIHdpbGwgYXNzdW1lIHRoZSBsYXN0IHAgZXZlbnRzIHJlcXVlc3RlZCBhcmUKQEAgLTM2OSwzMCArMzc3LDMwIEBACiAJCWEgZ2l2ZW4gZXZlbnQgdHlwZSBpcyBlbmFibGVkIGEgZnV0dXJlIHBvaW50IChhbmQgbm90IHRob3NlIGZvcgogCQl3aGF0ZXZlciBldmVudCB3YXMgcHJldmlvdXNseSBlbmFibGVkKS4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3hfcm9jX3Jpc2luZ19lbgotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3hfcm9jX2ZhbGxpbmdfZW4KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X3JvY19yaXNpbmdfZW4KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X3JvY19mYWxsaW5nX2VuCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel9yb2NfcmlzaW5nX2VuCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel9yb2NfZmFsbGluZ19lbgotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feF9yb2NfcmlzaW5nX2VuCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb194X3JvY19mYWxsaW5nX2VuCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb195X3JvY19yaXNpbmdfZW4KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3lfcm9jX2ZhbGxpbmdfZW4KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3pfcm9jX3Jpc2luZ19lbgotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9fel9yb2NfZmFsbGluZ19lbgotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feF9yb2NfcmlzaW5nX2VuCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl94X3JvY19mYWxsaW5nX2VuCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl95X3JvY19yaXNpbmdfZW4KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3lfcm9jX2ZhbGxpbmdfZW4KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3pfcm9jX3Jpc2luZ19lbgotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25fel9yb2NfZmFsbGluZ19lbgotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9zdXBwbHlfcm9jX3Jpc2luZ19lbgotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9zdXBwbHlfcm9jX2ZhbGxpbmdfZW4KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfcm9jX3Jpc2luZ19lbgotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9yb2NfZmFsbGluZ19lbgotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL3RlbXBfcm9jX3Jpc2luZ19lbgotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL3RlbXBfcm9jX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9ldmVudHMvaW5fYWNjZWxfeF9yb2NfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvZXZlbnRzL2luX2FjY2VsX3hfcm9jX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9ldmVudHMvaW5fYWNjZWxfeV9yb2NfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvZXZlbnRzL2luX2FjY2VsX3lfcm9jX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9ldmVudHMvaW5fYWNjZWxfel9yb2NfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvZXZlbnRzL2luX2FjY2VsX3pfcm9jX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9ldmVudHMvaW5fYW5nbHZlbF94X3JvY19yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9ldmVudHMvaW5fYW5nbHZlbF94X3JvY19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvZXZlbnRzL2luX2FuZ2x2ZWxfeV9yb2NfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvZXZlbnRzL2luX2FuZ2x2ZWxfeV9yb2NfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2V2ZW50cy9pbl9hbmdsdmVsX3pfcm9jX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2V2ZW50cy9pbl9hbmdsdmVsX3pfcm9jX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9ldmVudHMvaW5fbWFnbl94X3JvY19yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9ldmVudHMvaW5fbWFnbl94X3JvY19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvZXZlbnRzL2luX21hZ25feV9yb2NfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvZXZlbnRzL2luX21hZ25feV9yb2NfZmFsbGluZ19lbgorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2V2ZW50cy9pbl9tYWduX3pfcm9jX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2V2ZW50cy9pbl9tYWduX3pfcm9jX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9ldmVudHMvaW5fdm9sdGFnZVlfc3VwcGx5X3JvY19yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9ldmVudHMvaW5fdm9sdGFnZVlfc3VwcGx5X3JvY19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvZXZlbnRzL2luX3ZvbHRhZ2VZX3JvY19yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9ldmVudHMvaW5fdm9sdGFnZVlfcm9jX2ZhbGxpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9ldmVudHMvaW5fdGVtcFlfcm9jX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2V2ZW50cy9pbl90ZW1wWV9yb2NfZmFsbGluZ19lbgogS2VybmVsVmVyc2lvbjoJMi42LjM3CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKQEAgLTQwMCwxMCArNDA4LDEwIEBACiAJCWNoYW5nZSAoMXN0IGRpZmZlcmVudGlhbCkgaW4gdGhlIHNwZWNpZmllZCAoX3Jpc2luZ3xfZmFsbGluZykKIAkJZGlyZWN0aW9uLiBJZiB0aGUgZGlyZWN0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gZWl0aGVyIHRoZQogCQlkZXZpY2Ugd2lsbCByZXBvcnQgYW4gZXZlbnQgd2hpY2ggZXZlciBkaXJlY3Rpb24gYSBzaW5nbGUKLQkJdGhyZXNob2xkIHZhbHVlIGlzIGNhbGxlZCBpbiAoZS5nLgotCQk8dHlwZT5bWl1bX25hbWVdXzxyYXd8aW5wdXQ+X3JvY192YWx1ZSkgb3IKLQkJPHR5cGU+W1pdW19uYW1lXV88cmF3fGlucHV0Pl9yb2NfcmlzaW5nX3ZhbHVlIGFuZAotCQk8dHlwZT5bWl1bX25hbWVdXzxyYXd8aW5wdXQ+X3JvY19mYWxsaW5nX3ZhbHVlIG1heSB0YWtlCisJCXRocmVzaG9sZCB2YWx1ZSBpcyBwYXNzZWQgaW4gKGUuZy4KKwkJPHR5cGU+W1ldW19uYW1lXV88cmF3fGlucHV0Pl9yb2NfdmFsdWUpIG9yCisJCTx0eXBlPltZXVtfbmFtZV1fPHJhd3xpbnB1dD5fcm9jX3Jpc2luZ192YWx1ZSBhbmQKKwkJPHR5cGU+W1ldW19uYW1lXV88cmF3fGlucHV0Pl9yb2NfZmFsbGluZ192YWx1ZSBtYXkgdGFrZQogCQlkaWZmZXJlbnQgdmFsdWVzLCBidXQgdGhlIGRldmljZSBjYW4gb25seSBlbmFibGUgYm90aCByYXRlIG9mCiAJCWNoYW5nZSB0aHJlc2hvbGRzIG9yIG5laXRoZXIuCiAJCU5vdGUgdGhlIGRyaXZlciB3aWxsIGFzc3VtZSB0aGUgbGFzdCBwIGV2ZW50cyByZXF1ZXN0ZWQgYXJlCkBAIC00MTUsNzMgKzQyMyw3MyBAQAogCQlhIGdpdmVuIGV2ZW50IHR5cGUgaXMgZW5hYmxlZCBhIGZ1dHVyZSBwb2ludCAoYW5kIG5vdCB0aG9zZSBmb3IKIAkJd2hhdGV2ZXIgZXZlbnQgd2FzIHByZXZpb3VzbHkgZW5hYmxlZCkuCiAKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF94X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeF9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeV9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3hfcmF3X3RocmVzaF9yaXNpbmdfdmFsdWUKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3hfcmF3X3RocmVzaF9mYWxsaW5nX3ZhbHVlCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb195X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb195X3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9fel9yYXdfdGhyZXNoX3Jpc2luZ192YWx1ZQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9fel9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3hfcmF3X3RocmVzaF9yaXNpbmdfdmFsdWUKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3hfcmF3X3RocmVzaF9mYWxsaW5nX3ZhbHVlCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl95X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl95X3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25fel9yYXdfdGhyZXNoX3Jpc2luZ192YWx1ZQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25fel9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfc3VwcGx5X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3N1cHBseV9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfcmF3X3RocmVzaF9mYWxsaW5nX3ZhbHVlCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvaW5aX3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL3RlbXBfcmF3X3RocmVzaF9mYWxsaW5nX3ZhbHVlCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvdGVtcF9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYWNjZWxfeF9yYXdfdGhyZXNoX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF94X3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF95X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FjY2VsX3lfcmF3X3RocmVzaF9mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FjY2VsX3pfcmF3X3RocmVzaF9yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYWNjZWxfel9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYW5nbHZlbF94X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FuZ2x2ZWxfeF9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYW5nbHZlbF95X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FuZ2x2ZWxfeV9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYW5nbHZlbF96X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FuZ2x2ZWxfel9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fbWFnbl94X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX21hZ25feF9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fbWFnbl95X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX21hZ25feV9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fbWFnbl96X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX21hZ25fel9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fdm9sdGFnZVlfc3VwcGx5X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX3ZvbHRhZ2VZX3N1cHBseV9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fdm9sdGFnZVlfcmF3X3RocmVzaF9mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX3ZvbHRhZ2VZX3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl90ZW1wWV9yYXdfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fdGVtcFlfcmF3X3RocmVzaF9mYWxsaW5nX3ZhbHVlCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzcKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlTcGVjaWZpZXMgdGhlIHZhbHVlIG9mIHRocmVzaG9sZCB0aGF0IHRoZSBkZXZpY2UgaXMgY29tcGFyaW5nCiAJCWFnYWluc3QgZm9yIHRoZSBldmVudHMgZW5hYmxlZCBieQotCQk8dHlwZT5aW19uYW1lXV90aHJlc2hbX3Jpc2luZ3xmYWxsaW5nXV9lbi4KLQkJSWYgc2VwYXJhdGUgYXR0cmlidXRlcyAgZXhpc3QgZm9yIHRoZSB0d28gZGlyZWN0aW9ucywgYnV0CisJCTx0eXBlPllbX25hbWVdX3RocmVzaFtfcmlzaW5nfGZhbGxpbmddX2VuLgorCQlJZiBzZXBhcmF0ZSBhdHRyaWJ1dGVzIGV4aXN0IGZvciB0aGUgdHdvIGRpcmVjdGlvbnMsIGJ1dAogCQlkaXJlY3Rpb24gaXMgbm90IHNwZWNpZmllZCBmb3IgdGhpcyBhdHRyaWJ1dGUsIHRoZW4gYSBzaW5nbGUKIAkJdGhyZXNob2xkIHZhbHVlIGFwcGxpZXMgdG8gYm90aCBkaXJlY3Rpb25zLgogCQlUaGUgcmF3IG9yIGlucHV0IGVsZW1lbnQgb2YgdGhlIG5hbWUgaW5kaWNhdGVzIHdoZXRoZXIgdGhlCiAJCXZhbHVlIGlzIGluIHJhdyBkZXZpY2UgdW5pdHMgb3IgaW4gcHJvY2Vzc2VkIHVuaXRzIChhcyBfcmF3CiAJCWFuZCBfaW5wdXQgZG8gb24gc3lzZnMgZGlyZWN0IGNoYW5uZWwgcmVhZCBhdHRyaWJ1dGVzKS4KIAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3hfcmF3X3JvY19yaXNpbmdfdmFsdWUKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF94X3Jhd19yb2NfZmFsbGluZ192YWx1ZQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3lfcmF3X3JvY19yaXNpbmdfdmFsdWUKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X3Jhd19yb2NfZmFsbGluZ192YWx1ZQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3pfcmF3X3JvY19yaXNpbmdfdmFsdWUKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X3Jhd19yb2NfZmFsbGluZ192YWx1ZQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feF9yYXdfcm9jX3Jpc2luZ192YWx1ZQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feF9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3lfcmF3X3JvY19yaXNpbmdfdmFsdWUKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3lfcmF3X3JvY19mYWxsaW5nX3ZhbHVlCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb196X3Jhd19yb2NfcmlzaW5nX3ZhbHVlCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb196X3Jhd19yb2NfZmFsbGluZ192YWx1ZQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feF9yYXdfcm9jX3Jpc2luZ192YWx1ZQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feF9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3lfcmF3X3JvY19yaXNpbmdfdmFsdWUKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3lfcmF3X3JvY19mYWxsaW5nX3ZhbHVlCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl96X3Jhd19yb2NfcmlzaW5nX3ZhbHVlCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl96X3Jhd19yb2NfZmFsbGluZ192YWx1ZQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9zdXBwbHlfcmF3X3JvY19yaXNpbmdfdmFsdWUKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfc3VwcGx5X3Jhd19yb2NfZmFsbGluZ192YWx1ZQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfcmF3X3JvY19mYWxsaW5nX3ZhbHVlCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvdGVtcF9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS90ZW1wX3Jhd19yb2NfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF94X3Jhd19yb2NfcmlzaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FjY2VsX3hfcmF3X3JvY19mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FjY2VsX3lfcmF3X3JvY19yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYWNjZWxfeV9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYWNjZWxfel9yYXdfcm9jX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF96X3Jhd19yb2NfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hbmdsdmVsX3hfcmF3X3JvY19yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYW5nbHZlbF94X3Jhd19yb2NfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hbmdsdmVsX3lfcmF3X3JvY19yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYW5nbHZlbF95X3Jhd19yb2NfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hbmdsdmVsX3pfcmF3X3JvY19yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYW5nbHZlbF96X3Jhd19yb2NfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9tYWduX3hfcmF3X3JvY19yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fbWFnbl94X3Jhd19yb2NfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9tYWduX3lfcmF3X3JvY19yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fbWFnbl95X3Jhd19yb2NfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9tYWduX3pfcmF3X3JvY19yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fbWFnbl96X3Jhd19yb2NfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl92b2x0YWdlWV9zdXBwbHlfcmF3X3JvY19yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fdm9sdGFnZVlfc3VwcGx5X3Jhd19yb2NfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl92b2x0YWdlWV9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fdm9sdGFnZVlfcmF3X3JvY19mYWxsaW5nX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX3RlbXBZX3Jhd19yb2NfZmFsbGluZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl90ZW1wWV9yYXdfcm9jX2ZhbGxpbmdfdmFsdWUKIEtlcm5lbFZlcnNpb246CTIuNi4zNwogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCVNwZWNpZmllcyB0aGUgdmFsdWUgb2YgcmF0ZSBvZiBjaGFuZ2UgdGhyZXNob2xkIHRoYXQgdGhlCiAJCWRldmljZSBpcyBjb21wYXJpbmcgYWdhaW5zdCBmb3IgdGhlIGV2ZW50cyBlbmFibGVkIGJ5Ci0JCTx0eXBlPltaXVtfbmFtZV1fcm9jW19yaXNpbmd8ZmFsbGluZ11fZW4uCisJCTx0eXBlPltZXVtfbmFtZV1fcm9jW19yaXNpbmd8ZmFsbGluZ11fZW4uCiAJCUlmIHNlcGFyYXRlIGF0dHJpYnV0ZXMgZXhpc3QgZm9yIHRoZSB0d28gZGlyZWN0aW9ucywKIAkJYnV0IGRpcmVjdGlvbiBpcyBub3Qgc3BlY2lmaWVkIGZvciB0aGlzIGF0dHJpYnV0ZSwKIAkJdGhlbiBhIHNpbmdsZSB0aHJlc2hvbGQgdmFsdWUgYXBwbGllcyB0byBib3RoIGRpcmVjdGlvbnMuCkBAIC00ODksNTUgKzQ5Nyw1NSBAQAogCQl2YWx1ZSBpcyBpbiByYXcgZGV2aWNlIHVuaXRzIG9yIGluIHByb2Nlc3NlZCB1bml0cyAoYXMgX3JhdwogCQlhbmQgX2lucHV0IGRvIG9uIHN5c2ZzIGRpcmVjdCBjaGFubmVsIHJlYWQgYXR0cmlidXRlcykuCiAKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF94X3RocmVzaF9yaXNpbmdfcGVyaW9kCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeF90aHJlc2hfZmFsbGluZ19wZXJpb2QKLWhhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3hfcm9jX3Jpc2luZ19wZXJpb2QKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF94X3JvY19mYWxsaW5nX3BlcmlvZAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3lfdGhyZXNoX3Jpc2luZ19wZXJpb2QKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X3RocmVzaF9mYWxsaW5nX3BlcmlvZAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3lfcm9jX3Jpc2luZ19wZXJpb2QKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X3JvY19mYWxsaW5nX3BlcmlvZAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3pfdGhyZXNoX3Jpc2luZ19wZXJpb2QKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X3RocmVzaF9mYWxsaW5nX3BlcmlvZAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3pfcm9jX3Jpc2luZ19wZXJpb2QKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X3JvY19mYWxsaW5nX3BlcmlvZAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feF90aHJlc2hfcmlzaW5nX3BlcmlvZAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feF90aHJlc2hfZmFsbGluZ19wZXJpb2QKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3hfcm9jX3Jpc2luZ19wZXJpb2QKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3hfcm9jX2ZhbGxpbmdfcGVyaW9kCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb195X3RocmVzaF9yaXNpbmdfcGVyaW9kCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb195X3RocmVzaF9mYWxsaW5nX3BlcmlvZAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feV9yb2NfcmlzaW5nX3BlcmlvZAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2d5cm9feV9yb2NfZmFsbGluZ19wZXJpb2QKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3pfdGhyZXNoX3Jpc2luZ19wZXJpb2QKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9neXJvX3pfdGhyZXNoX2ZhbGxpbmdfcGVyaW9kCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb196X3JvY19yaXNpbmdfcGVyaW9kCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvZ3lyb196X3JvY19mYWxsaW5nX3BlcmlvZAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feF90aHJlc2hfcmlzaW5nX3BlcmlvZAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feF90aHJlc2hfZmFsbGluZ19wZXJpb2QKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3hfcm9jX3Jpc2luZ19wZXJpb2QKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3hfcm9jX2ZhbGxpbmdfcGVyaW9kCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl95X3RocmVzaF9yaXNpbmdfcGVyaW9kCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl95X3RocmVzaF9mYWxsaW5nX3BlcmlvZAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feV9yb2NfcmlzaW5nX3BlcmlvZAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL21hZ25feV9yb2NfZmFsbGluZ19wZXJpb2QKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3pfdGhyZXNoX3Jpc2luZ19wZXJpb2QKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9tYWduX3pfdGhyZXNoX2ZhbGxpbmdfcGVyaW9kCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl96X3JvY19yaXNpbmdfcGVyaW9kCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvbWFnbl96X3JvY19mYWxsaW5nX3BlcmlvZAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl9zdXBwbHlfdGhyZXNoX3Jpc2luZ19wZXJpb2QKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfc3VwcGx5X3RocmVzaF9mYWxsaW5nX3BlcmlvZAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luel9zdXBwbHlfcm9jX3Jpc2luZ19wZXJpb2QKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfc3VwcGx5X3JvY19mYWxsaW5nX3BlcmlvZAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl90aHJlc2hfcmlzaW5nX3BlcmlvZAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2luWl90aHJlc2hfZmFsbGluZ19wZXJpb2QKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfcm9jX3Jpc2luZ19wZXJpb2QKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9pblpfcm9jX2ZhbGxpbmdfcGVyaW9kCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvdGVtcF90aHJlc2hfcmlzaW5nX3BlcmlvZAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL3RlbXBfdGhyZXNoX2ZhbGxpbmdfcGVyaW9kCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvdGVtcF9yb2NfcmlzaW5nX3BlcmlvZAotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL3RlbXBfcm9jX2ZhbGxpbmdfcGVyaW9kCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeCZ5JnpfbWFnX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FjY2VsX3hfdGhyZXNoX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYWNjZWxfeF90aHJlc2hfZmFsbGluZ19wZXJpb2QKK2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF94X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FjY2VsX3hfcm9jX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FjY2VsX3lfdGhyZXNoX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYWNjZWxfeV90aHJlc2hfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYWNjZWxfeV9yb2NfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF95X3JvY19mYWxsaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF96X3RocmVzaF9yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FjY2VsX3pfdGhyZXNoX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FjY2VsX3pfcm9jX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYWNjZWxfel9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYW5nbHZlbF94X3RocmVzaF9yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FuZ2x2ZWxfeF90aHJlc2hfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYW5nbHZlbF94X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FuZ2x2ZWxfeF9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYW5nbHZlbF95X3RocmVzaF9yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FuZ2x2ZWxfeV90aHJlc2hfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYW5nbHZlbF95X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FuZ2x2ZWxfeV9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYW5nbHZlbF96X3RocmVzaF9yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FuZ2x2ZWxfel90aHJlc2hfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYW5nbHZlbF96X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FuZ2x2ZWxfel9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fbWFnbl94X3RocmVzaF9yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX21hZ25feF90aHJlc2hfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fbWFnbl94X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX21hZ25feF9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fbWFnbl95X3RocmVzaF9yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX21hZ25feV90aHJlc2hfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fbWFnbl95X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX21hZ25feV9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fbWFnbl96X3RocmVzaF9yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX21hZ25fel90aHJlc2hfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fbWFnbl96X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX21hZ25fel9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fdm9sdGFnZVlfc3VwcGx5X3RocmVzaF9yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX3ZvbHRhZ2VZX3N1cHBseV90aHJlc2hfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fdm9sdGFnZVlfc3VwcGx5X3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX3ZvbHRhZ2VZX3N1cHBseV9yb2NfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fdm9sdGFnZVlfdGhyZXNoX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fdm9sdGFnZVlfdGhyZXNoX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX3ZvbHRhZ2VZX3JvY19yaXNpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX3ZvbHRhZ2VZX3JvY19mYWxsaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl90ZW1wWV90aHJlc2hfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl90ZW1wWV90aHJlc2hfZmFsbGluZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fdGVtcFlfcm9jX3Jpc2luZ19wZXJpb2QKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fdGVtcFlfcm9jX2ZhbGxpbmdfcGVyaW9kCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FjY2VsX3gmeSZ6X21hZ19mYWxsaW5nX3BlcmlvZAogS2VybmVsVmVyc2lvbjoJMi42LjM3CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKQEAgLTU0NSwzMSArNTUzLDMxIEBACiAJCW1ldCBiZWZvcmUgYW4gZXZlbnQgaXMgZ2VuZXJhdGVkLiBJZiBkaXJlY3Rpb24gaXMgbm90CiAJCXNwZWNpZmllZCB0aGVuIHRoaXMgcGVyaW9kIGFwcGxpZXMgdG8gYm90aCBkaXJlY3Rpb25zLgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfbWFnX2VuCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfbWFnX3Jpc2luZ19lbgotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX21hZ19mYWxsaW5nX2VuCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeF9tYWdfZW4KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF94X21hZ19yaXNpbmdfZW4KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF94X21hZ19mYWxsaW5nX2VuCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeV9tYWdfZW4KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X21hZ19yaXNpbmdfZW4KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF95X21hZ19mYWxsaW5nX2VuCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfel9tYWdfZW4KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X21hZ19yaXNpbmdfZW4KLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmV2ZW50WS9hY2NlbF96X21hZ19mYWxsaW5nX2VuCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpldmVudFkvYWNjZWxfeCZ5JnpfbWFnX3Jpc2luZ19lbgotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6ZXZlbnRZL2FjY2VsX3gmeSZ6X21hZ19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvZXZlbnRzL2luX2FjY2VsX21hZ19lbgorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2V2ZW50cy9pbl9hY2NlbF9tYWdfcmlzaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvZXZlbnRzL2luX2FjY2VsX21hZ19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvZXZlbnRzL2luX2FjY2VsX3hfbWFnX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvZXZlbnRzL2luX2FjY2VsX3hfbWFnX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2V2ZW50cy9pbl9hY2NlbF94X21hZ19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvZXZlbnRzL2luX2FjY2VsX3lfbWFnX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvZXZlbnRzL2luX2FjY2VsX3lfbWFnX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2V2ZW50cy9pbl9hY2NlbF95X21hZ19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvZXZlbnRzL2luX2FjY2VsX3pfbWFnX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvZXZlbnRzL2luX2FjY2VsX3pfbWFnX3Jpc2luZ19lbgorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2V2ZW50cy9pbl9hY2NlbF96X21hZ19mYWxsaW5nX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvZXZlbnRzL2luX2FjY2VsX3gmeSZ6X21hZ19yaXNpbmdfZW4KK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9ldmVudHMvaW5fYWNjZWxfeCZ5JnpfbWFnX2ZhbGxpbmdfZW4KIEtlcm5lbFZlcnNpb246CTIuNi4zNwogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246Ci0JCVNpbWlsYXIgdG8gYWNjZWxfeF90aHJlc2hbX3Jpc2luZ3xfZmFsbGluZ11fZW4sIGJ1dCBoZXJlIHRoZQorCQlTaW1pbGFyIHRvIGluX2FjY2VsX3hfdGhyZXNoW19yaXNpbmd8X2ZhbGxpbmddX2VuLCBidXQgaGVyZSB0aGUKIAkJbWFnbml0dWRlIG9mIHRoZSBjaGFubmVsIGlzIGNvbXBhcmVkIHRvIHRoZSB0aHJlc2hvbGQsIG5vdCBpdHMKIAkJc2lnbmVkIHZhbHVlLgogCi1XaGF0OgkJL3N5cy8uLi4vYWNjZWxfcmF3X21hZ192YWx1ZQotV2hhdDoJCS9zeXMvLi4uL2FjY2VsX3hfcmF3X21hZ19yaXNpbmdfdmFsdWUKLVdoYXQ6CQkvc3lzLy4uLi9hY2NlbF95X3Jhd19tYWdfcmlzaW5nX3ZhbHVlCi1XaGF0OgkJL3N5cy8uLi4vYWNjZWxfel9yYXdfbWFnX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF9yYXdfbWFnX3ZhbHVlCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FjY2VsX3hfcmF3X21hZ19yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYWNjZWxfeV9yYXdfbWFnX3Jpc2luZ192YWx1ZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF96X3Jhd19tYWdfcmlzaW5nX3ZhbHVlCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzcKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgpAQCAtNTc3LDg2ICs1ODUsNzUgQEAKIAkJbnVtYmVyIG9yIGRpcmVjdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCBhcHBsaWVzIHRvIGFsbCBjaGFubmVscyBvZgogCQl0aGlzIHR5cGUuCiAKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlcjpldmVudC9kZXYKLUtlcm5lbFZlcnNpb246CTIuNi4zNQotQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwotRGVzY3JpcHRpb246Ci0JCUJ1ZmZlciBmb3IgZGV2aWNlIFggZXZlbnQgY2hhcmFjdGVyIGRldmljZSBtYWpvcjptaW5vciBudW1iZXJzLgotCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXI6YWNjZXNzL2RldgotS2VybmVsVmVyc2lvbjoJMi42LjM1Ci1Db250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCi1EZXNjcmlwdGlvbjoKLQkJQnVmZmVyIGZvciBkZXZpY2UgWCBhY2Nlc3MgY2hhcmFjdGVyIGRldmljZSBtYWpvcjptaW5vciBudW1iZXJzLgotCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvdHJpZ2dlcgorV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL3RyaWdnZXIvY3VycmVudF90cmlnZ2VyCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlUaGUgbmFtZSBvZiB0aGUgdHJpZ2dlciBzb3VyY2UgYmVpbmcgdXNlZCwgYXMgcGVyIHN0cmluZyBnaXZlbgogCQlpbiAvc3lzL2NsYXNzL2lpby90cmlnZ2VyWS9uYW1lLgogCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvbGVuZ3RoCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvYnVmZmVyL2xlbmd0aAogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJTnVtYmVyIG9mIHNjYW5zIGNvbnRhaW5lZCBieSB0aGUgYnVmZmVyLgogCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvYnl0ZXNfcGVyX2RhdHVtCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvYnVmZmVyL2J5dGVzX3Blcl9kYXR1bQogS2VybmVsVmVyc2lvbjoJMi42LjM3CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJQnl0ZXMgcGVyIHNjYW4uICBEdWUgdG8gYWxpZ25tZW50IGZ1biwgdGhlIHNjYW4gbWF5IGJlIGxhcmdlcgogCQl0aGFuIGltcGxpZWQgZGlyZWN0bHkgYnkgdGhlIHNjYW5fZWxlbWVudCBwYXJhbWV0ZXJzLgogCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvZW5hYmxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvYnVmZmVyL2VuYWJsZQogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJQWN0dWFsbHkgc3RhcnQgdGhlIGJ1ZmZlciBjYXB0dXJlIHVwLiAgV2lsbCBzdGFydCB0cmlnZ2VyCiAJCWlmIGZpcnN0IGRldmljZSBhbmQgYXBwcm9wcmlhdGUuCiAKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvYnVmZmVyL3NjYW5fZWxlbWVudHMKIEtlcm5lbFZlcnNpb246CTIuNi4zNwogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCURpcmVjdG9yeSBjb250YWluaW5nIGludGVyZmFjZXMgZm9yIGVsZW1lbnRzIHRoYXQgd2lsbCBiZQogCQljYXB0dXJlZCBmb3IgYSBzaW5nbGUgdHJpZ2dlcmVkIHNhbXBsZSBzZXQgaW4gdGhlIGJ1ZmZlci4KIAotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvYWNjZWxfeF9lbgotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvYWNjZWxfeV9lbgotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvYWNjZWxfel9lbgotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvZ3lyb194X2VuCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9neXJvX3lfZW4KLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2d5cm9fel9lbgotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvbWFnbl94X2VuCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9tYWduX3lfZW4KLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL21hZ25fel9lbgotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvdGltZXN0YW1wX2VuCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9pbllfc3VwcGx5X2VuCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9pbllfZW4KLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luWS1pblpfZW4KLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luY2xpX3hfZW4KLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luY2xpX3lfZW4KK1doYXQ6CQkvc3lzLy4uLi9idWZmZXIvc2Nhbl9lbGVtZW50cy9pbl9hY2NlbF94X2VuCitXaGF0OgkJL3N5cy8uLi4vYnVmZmVyL3NjYW5fZWxlbWVudHMvaW5fYWNjZWxfeV9lbgorV2hhdDoJCS9zeXMvLi4uL2J1ZmZlci9zY2FuX2VsZW1lbnRzL2luX2FjY2VsX3pfZW4KK1doYXQ6CQkvc3lzLy4uLi9idWZmZXIvc2Nhbl9lbGVtZW50cy9pbl9hbmdsdmVsX3hfZW4KK1doYXQ6CQkvc3lzLy4uLi9idWZmZXIvc2Nhbl9lbGVtZW50cy9pbl9hbmdsdmVsX3lfZW4KK1doYXQ6CQkvc3lzLy4uLi9idWZmZXIvc2Nhbl9lbGVtZW50cy9pbl9hbmdsdmVsX3pfZW4KK1doYXQ6CQkvc3lzLy4uLi9idWZmZXIvc2Nhbl9lbGVtZW50cy9pbl9tYWduX3hfZW4KK1doYXQ6CQkvc3lzLy4uLi9idWZmZXIvc2Nhbl9lbGVtZW50cy9pbl9tYWduX3lfZW4KK1doYXQ6CQkvc3lzLy4uLi9idWZmZXIvc2Nhbl9lbGVtZW50cy9pbl9tYWduX3pfZW4KK1doYXQ6CQkvc3lzLy4uLi9idWZmZXIvc2Nhbl9lbGVtZW50cy9pbl90aW1lc3RhbXBfZW4KK1doYXQ6CQkvc3lzLy4uLi9idWZmZXIvc2Nhbl9lbGVtZW50cy9pbl92b2x0YWdlWV9zdXBwbHlfZW4KK1doYXQ6CQkvc3lzLy4uLi9idWZmZXIvc2Nhbl9lbGVtZW50cy9pbl92b2x0YWdlWV9lbgorV2hhdDoJCS9zeXMvLi4uL2J1ZmZlci9zY2FuX2VsZW1lbnRzL2luX3ZvbHRhZ2VZLXZvbHRhZ2VaX2VuCitXaGF0OgkJL3N5cy8uLi4vYnVmZmVyL3NjYW5fZWxlbWVudHMvaW5faW5jbGlfeF9lbgorV2hhdDoJCS9zeXMvLi4uL2J1ZmZlci9zY2FuX2VsZW1lbnRzL2luX2luY2xpX3lfZW4KIEtlcm5lbFZlcnNpb246CTIuNi4zNwogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCVNjYW4gZWxlbWVudCBjb250cm9sIGZvciB0cmlnZ2VyZWQgZGF0YSBjYXB0dXJlLgogCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9hY2NlbF90eXBlCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9neXJvX3R5cGUKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL21hZ25fdHlwZQotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvaW5jbGlfdHlwZQotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvaW5ZX3R5cGUKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luLWluX3R5cGUKLVdoYXQ6CQkvc3lzLy4uLi9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2luWV9zdXBwbHlfdHlwZQotV2hhdDoJCS9zeXMvLi4uL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvdGltZXN0YW1wX3R5cGUKK1doYXQ6CQkvc3lzLy4uLi9idWZmZXIvc2Nhbl9lbGVtZW50cy9pbl9hY2NlbF90eXBlCitXaGF0OgkJL3N5cy8uLi4vYnVmZmVyL3NjYW5fZWxlbWVudHMvaW5fYW5nbHZlbF90eXBlCitXaGF0OgkJL3N5cy8uLi4vYnVmZmVyL3NjYW5fZWxlbWVudHMvaW5fbWFnbl90eXBlCitXaGF0OgkJL3N5cy8uLi4vYnVmZmVyL3NjYW5fZWxlbWVudHMvaW5faW5jbGlfdHlwZQorV2hhdDoJCS9zeXMvLi4uL2J1ZmZlci9zY2FuX2VsZW1lbnRzL2luX3ZvbHRhZ2VZX3R5cGUKK1doYXQ6CQkvc3lzLy4uLi9idWZmZXIvc2Nhbl9lbGVtZW50cy9pbl92b2x0YWdlLWluX3R5cGUKK1doYXQ6CQkvc3lzLy4uLi9idWZmZXIvc2Nhbl9lbGVtZW50cy9pbl92b2x0YWdlWV9zdXBwbHlfdHlwZQorV2hhdDoJCS9zeXMvLi4uL2J1ZmZlci9zY2FuX2VsZW1lbnRzL2luX3RpbWVzdGFtcF90eXBlCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzcKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlEZXNjcmlwdGlvbiBvZiB0aGUgc2NhbiBlbGVtZW50IGRhdGEgc3RvcmFnZSB3aXRoaW4gdGhlIGJ1ZmZlcgogCQlhbmQgaGVuY2UgdGhlIGZvcm0gaW4gd2hpY2ggaXQgaXMgcmVhZCBmcm9tIHVzZXItc3BhY2UuCi0JCUZvcm0gaXMgW3N8dV1iaXRzL3N0b3JhZ2ViaXRzWz4+c2hpZnRdLiAgcyBvciB1IHNwZWNpZmllcyBpZgorCQlGb3JtIGlzIFtiZXxsZV06W3N8dV1iaXRzL3N0b3JhZ2ViaXRzWz4+c2hpZnRdLgorCQliZSBvciBsZSBzcGVjaWZpZXMgYmlnIG9yIGxpdHRsZSBlbmRpYW4uIHMgb3IgdSBzcGVjaWZpZXMgaWYKIAkJc2lnbmVkICgyJ3MgY29tcGxlbWVudCkgb3IgdW5zaWduZWQuIGJpdHMgaXMgdGhlIG51bWJlciBvZiBiaXRzCiAJCW9mIGRhdGEgYW5kIHN0b3JhZ2ViaXRzIGlzIHRoZSBzcGFjZSAoYWZ0ZXIgcGFkZGluZykgdGhhdCBpdAogCQlvY2N1cGllcyBpbiB0aGUgYnVmZmVyLiBzaGlmdCBpZiBzcGVjaWZpZWQsIGlzIHRoZSBzaGlmdCB0aGF0CkBAIC02NzMsMjcgKzY3MCwyNyBAQAogCQlGb3Igb3RoZXIgc3RvcmFnZSBjb21iaW5hdGlvbnMgdGhpcyBhdHRyaWJ1dGUgd2lsbCBiZSBleHRlbmRlZAogCQlhcHByb3ByaWF0ZWx5LgogCi1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9hY2NlbF90eXBlX2F2YWlsYWJsZQorV2hhdDoJCS9zeXMvLi4uL2J1ZmZlci9zY2FuX2VsZW1lbnRzL2luX2FjY2VsX3R5cGVfYXZhaWxhYmxlCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzcKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlJZiB0aGUgdHlwZSBwYXJhbWV0ZXIgY2FuIHRha2Ugb25lIG9mIGEgc21hbGwgc2V0IG9mIHZhbHVlcywKIAkJdGhpcyBhdHRyaWJ1dGUgbGlzdHMgdGhlbS4KIAotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvaW5ZX2luZGV4Ci1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9pbllfc3VwcGx5X2luZGV4Ci1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9hY2NlbF94X2luZGV4Ci1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9hY2NlbF95X2luZGV4Ci1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9hY2NlbF96X2luZGV4Ci1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9neXJvX3hfaW5kZXgKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL2d5cm9feV9pbmRleAotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvZ3lyb196X2luZGV4Ci1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9tYWduX3hfaW5kZXgKLVdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYOmJ1ZmZlci9zY2FuX2VsZW1lbnRzL21hZ25feV9pbmRleAotV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2RldmljZVg6YnVmZmVyL3NjYW5fZWxlbWVudHMvbWFnbl96X2luZGV4Ci1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9pbmNsaV94X2luZGV4Ci1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy9pbmNsaV95X2luZGV4Ci1XaGF0OgkJL3N5cy8uLi4vZGV2aWNlWDpidWZmZXIvc2Nhbl9lbGVtZW50cy90aW1lc3RhbXBfaW5kZXgKK1doYXQ6CQkvc3lzLy4uLi9idWZmZXIvc2Nhbl9lbGVtZW50cy9pbl92b2x0YWdlWV9pbmRleAorV2hhdDoJCS9zeXMvLi4uL2J1ZmZlci9zY2FuX2VsZW1lbnRzL2luX3ZvbHRhZ2VZX3N1cHBseV9pbmRleAorV2hhdDoJCS9zeXMvLi4uL2J1ZmZlci9zY2FuX2VsZW1lbnRzL2luX2FjY2VsX3hfaW5kZXgKK1doYXQ6CQkvc3lzLy4uLi9idWZmZXIvc2Nhbl9lbGVtZW50cy9pbl9hY2NlbF95X2luZGV4CitXaGF0OgkJL3N5cy8uLi4vYnVmZmVyL3NjYW5fZWxlbWVudHMvaW5fYWNjZWxfel9pbmRleAorV2hhdDoJCS9zeXMvLi4uL2J1ZmZlci9zY2FuX2VsZW1lbnRzL2luX2FuZ2x2ZWxfeF9pbmRleAorV2hhdDoJCS9zeXMvLi4uL2J1ZmZlci9zY2FuX2VsZW1lbnRzL2luX2FuZ2x2ZWxfeV9pbmRleAorV2hhdDoJCS9zeXMvLi4uL2J1ZmZlci9zY2FuX2VsZW1lbnRzL2luX2FuZ2x2ZWxfel9pbmRleAorV2hhdDoJCS9zeXMvLi4uL2J1ZmZlci9zY2FuX2VsZW1lbnRzL2luX21hZ25feF9pbmRleAorV2hhdDoJCS9zeXMvLi4uL2J1ZmZlci9zY2FuX2VsZW1lbnRzL2luX21hZ25feV9pbmRleAorV2hhdDoJCS9zeXMvLi4uL2J1ZmZlci9zY2FuX2VsZW1lbnRzL2luX21hZ25fel9pbmRleAorV2hhdDoJCS9zeXMvLi4uL2J1ZmZlci9zY2FuX2VsZW1lbnRzL2luX2luY2xpX3hfaW5kZXgKK1doYXQ6CQkvc3lzLy4uLi9idWZmZXIvc2Nhbl9lbGVtZW50cy9pbl9pbmNsaV95X2luZGV4CitXaGF0OgkJL3N5cy8uLi4vYnVmZmVyL3NjYW5fZWxlbWVudHMvaW5fdGltZXN0YW1wX2luZGV4CiBLZXJuZWxWZXJzaW9uOgkyLjYuMzcKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgpAQCAtNzA1LDkgKzcwMiwzMCBAQAogCQlhbmQgdGhlIHJlbGV2YW50IF90eXBlIGF0dHJpYnV0ZXMgdG8gZXN0YWJsaXNoIHRoZSBkYXRhIHN0b3JhZ2UKIAkJZm9ybWF0LgogCi1XaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvZGV2aWNlWC9neXJvX3pfcXVhZHJhdHVyZV9jb3JyZWN0aW9uX3JhdworV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2luX2FuZ2x2ZWxfel9xdWFkcmF0dXJlX2NvcnJlY3Rpb25fcmF3CiBLZXJuZWxWZXJzaW9uOgkyLjYuMzgKLUNvbnRhY3Q6CWxpbnV4LWlpb0B4eHh4eHh4eHh4eHh4eHgKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHJlYWQgdGhlIGFtb3VudCBvZiBxdWFkcmF0dXJlIGVycm9yCiAJCXByZXNlbnQgaW4gdGhlIGRldmljZSBhdCBhIGdpdmVuIHRpbWUuCisKK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9hY19leGNpdGF0aW9uX2VuCitLZXJuZWxWZXJzaW9uOgkzLjEuMAorQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCVRoaXMgYXR0cmlidXRlLCBpZiBhdmFpbGFibGUsIGlzIHVzZWQgdG8gZW5hYmxlIHRoZSBBQworCQlleGNpdGF0aW9uIG1vZGUgZm91bmQgb24gc29tZSBjb252ZXJ0ZXJzLiBJbiBhYyBleGNpdGF0aW9uIG1vZGUsCisJCXRoZSBwb2xhcml0eSBvZiB0aGUgZXhjaXRhdGlvbiB2b2x0YWdlIGlzIHJldmVyc2VkIG9uCisJCWFsdGVybmF0ZSBjeWNsZXMsIHRvIGVsaW1pbmF0ZSBEQyBlcnJvcnMuCisKK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9icmlkZ2Vfc3dpdGNoX2VuCitLZXJuZWxWZXJzaW9uOgkzLjEuMAorQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCVRoaXMgYXR0cmlidXRlLCBpZiBhdmFpbGFibGUsIGlzIHVzZWQgdG8gY2xvc2Ugb3Igb3BlbiB0aGUKKwkJYnJpZGdlIHBvd2VyIGRvd24gc3dpdGNoIGZvdW5kIG9uIHNvbWUgY29udmVydGVycy4KKwkJSW4gYnJpZGdlIGFwcGxpY2F0aW9ucywgc3VjaCBhcyBzdHJhaW4gZ2F1Z2VzIGFuZCBsb2FkIGNlbGxzLAorCQl0aGUgYnJpZGdlIGl0c2VsZiBjb25zdW1lcyB0aGUgbWFqb3JpdHkgb2YgdGhlIGN1cnJlbnQgaW4gdGhlCisJCXN5c3RlbS4gVG8gbWluaW1pemUgdGhlIGN1cnJlbnQgY29uc3VtcHRpb24gb2YgdGhlIHN5c3RlbSwKKwkJdGhlIGJyaWRnZSBjYW4gYmUgZGlzY29ubmVjdGVkICh3aGVuIGl0IGlzIG5vdCBiZWluZyB1c2VkCisJCXVzaW5nIHRoZSBicmlkZ2Vfc3dpdGNoX2VuIGF0dHJpYnV0ZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9zeXNmcy1idXMtaWlvLWFkYy1hZDcyODBhIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL3N5c2ZzLWJ1cy1paW8tYWRjLWFkNzI4MGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzZDM4NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9zeXNmcy1idXMtaWlvLWFkYy1hZDcyODBhCkBAIC0wLDAgKzEsMjEgQEAKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2luWS1pblpfYmFsYW5jZV9zd2l0Y2hfZW4KK0tlcm5lbFZlcnNpb246CTMuMC4wCitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJV3JpdGluZyAxIGVuYWJsZXMgdGhlIGNlbGwgYmFsYW5jZSBvdXRwdXQgc3dpdGNoIGNvcnJlc3BvbmRpbmcKKwkJdG8gaW5wdXQgWS4gV3JpdGluZyAwIGRpc2FibGVzIGl0LiBJZiB0aGUgaW5ZLWluWl9iYWxhbmNlX3RpbWVyCisJCWlzIHNldCB0byBhIG5vbmUgemVybyB2YWx1ZSwgdGhlIGNvcnJlc3BvbmRpbmcgc3dpdGNoIHdpbGwKKwkJZW5hYmxlIGZvciB0aGUgcHJvZ3JhbW1lZCBhbW91bnQgb2YgdGltZSwgYmVmb3JlIGl0CisJCWF1dG9tYXRpY2FsbHkgZGlzYWJsZXMuCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9kZXZpY2VYL2luWS1pblpfYmFsYW5jZV90aW1lcgorS2VybmVsVmVyc2lvbjoJMy4wLjAKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlUaGUgaW5ZLWluWl9iYWxhbmNlX3RpbWVyIGZpbGUgYWxsb3dzIHRoZSB1c2VyIHRvIHByb2dyYW0KKwkJaW5kaXZpZHVhbCB0aW1lcyBmb3IgZWFjaCBjZWxsIGJhbGFuY2Ugb3V0cHV0LiBUaGUgQUQ3MjgwQQorCQlhbGxvd3MgdGhlIHVzZXIgdG8gc2V0IHRoZSB0aW1lciB0byBhIHZhbHVlIGZyb20gMCBtaW51dGVzIHRvCisJCTM2LjkgbWludXRlcy4gVGhlIHJlc29sdXRpb24gb2YgdGhlIHRpbWVyIGlzIDcxLjUgc2VjLgorCQlUaGUgdmFsdWUgd3JpdHRlbiBpcyB0aGUgb24tdGltZSBpbiBtaWxsaXNlY29uZHMuIFdoZW4gdGhlCisJCXRpbWVyIHZhbHVlIGlzIHNldCAwLCB0aGUgdGltZXIgaXMgZGlzYWJsZWQuIFRoZSBjZWxsIGJhbGFuY2UKKwkJb3V0cHV0cyBhcmUgY29udHJvbGxlZCBvbmx5IGJ5IGluWS1pblpfYmFsYW5jZV9zd2l0Y2hfZW4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vc3lzZnMtYnVzLWlpby1pbXBlZGFuY2UtYW5hbHl6ZXItYWQ1OTMzIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL3N5c2ZzLWJ1cy1paW8taW1wZWRhbmNlLWFuYWx5emVyLWFkNTkzMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWM3ZTg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL3N5c2ZzLWJ1cy1paW8taW1wZWRhbmNlLWFuYWx5emVyLWFkNTkzMwpAQCAtMCwwICsxLDMwIEBACitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvb3V0WV9mcmVxX3N0YXJ0CitLZXJuZWxWZXJzaW9uOgkzLjEuMAorQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUZyZXF1ZW5jeSBzd2VlcCBzdGFydCBmcmVxdWVuY3kgaW4gSHouCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9vdXRZX2ZyZXFfaW5jcmVtZW50CitLZXJuZWxWZXJzaW9uOgkzLjEuMAorQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUZyZXF1ZW5jeSBpbmNyZW1lbnQgaW4gSHogKHN0ZXAgc2l6ZSkgYmV0d2VlbiBjb25zZWN1dGl2ZQorCQlmcmVxdWVuY3kgcG9pbnRzIGFsb25nIHRoZSBzd2VlcC4KKworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL291dFlfZnJlcV9wb2ludHMKK0tlcm5lbFZlcnNpb246CTMuMS4wCitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJTnVtYmVyIG9mIGZyZXF1ZW5jeSBwb2ludHMgKHN0ZXBzKSBpbiB0aGUgZnJlcXVlbmN5IHN3ZWVwLgorCQlUaGlzIHZhbHVlLCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBvdXRZX2ZyZXFfc3RhcnQgYW5kIHRoZQorCQlvdXRZX2ZyZXFfaW5jcmVtZW50LCBkZXRlcm1pbmVzIHRoZSBmcmVxdWVuY3kgc3dlZXAgcmFuZ2UKKwkJZm9yIHRoZSBzd2VlcCBvcGVyYXRpb24uCisKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9vdXRZX3NldHRsaW5nX2N5Y2xlcworS2VybmVsVmVyc2lvbjoJMy4xLjAKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlOdW1iZXIgb2Ygb3V0cHV0IGV4Y2l0YXRpb24gY3ljbGVzIChzZXR0bGluZyB0aW1lIGN5Y2xlcykKKwkJdGhhdCBhcmUgYWxsb3dlZCB0byBwYXNzIHRocm91Z2ggdGhlIHVua25vd24gaW1wZWRhbmNlLAorCQlhZnRlciBlYWNoIGZyZXF1ZW5jeSBpbmNyZW1lbnQsIGFuZCBiZWZvcmUgdGhlIEFEQyBpcyB0cmlnZ2VyZWQKKwkJdG8gcGVyZm9ybSBhIGNvbnZlcnNpb24gc2VxdWVuY2Ugb2YgdGhlIHJlc3BvbnNlIHNpZ25hbC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vS2NvbmZpZwppbmRleCBkMzI5NjM1Li40ZWM5MTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9LY29uZmlnCkBAIC0xMiwxMyArMTIsMTMgQEAKIAkgIGRyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KIGlmIElJTwogCi1jb25maWcgSUlPX1JJTkdfQlVGRkVSCitjb25maWcgSUlPX0JVRkZFUgogCWJvb2wgIkVuYWJsZSBidWZmZXIgc3VwcG9ydCB3aXRoaW4gSUlPIgogCWhlbHAKIAkgIFByb3ZpZGUgY29yZSBzdXBwb3J0IGZvciB2YXJpb3VzIGJ1ZmZlciBiYXNlZCBkYXRhCiAJICBhY3F1aXNpdGlvbiBtZXRob2RzLgogCi1pZiBJSU9fUklOR19CVUZGRVIKK2lmIElJT19CVUZGRVIKIAogY29uZmlnIElJT19TV19SSU5HCiAgICAgICAgc2VsZWN0IElJT19UUklHR0VSCkBAIC0zOCw3ICszOCw3IEBACiAJICBubyBidWZmZXIgZXZlbnRzIHNvIGl0IGlzIHVwIHRvIHVzZXJzcGFjZSB0byB3b3JrIG91dCBob3cKIAkgIG9mdGVuIHRvIHJlYWQgZnJvbSB0aGUgYnVmZmVyLgogCi1lbmRpZiAjIElJT19SSU5HQlVGRkVSCitlbmRpZiAjIElJT19CVUZGRVIKIAogY29uZmlnIElJT19UUklHR0VSCiAJYm9vbGVhbiAiRW5hYmxlIHRyaWdnZXJlZCBzYW1wbGluZyBzdXBwb3J0IgpAQCAtNTksOSArNTksMTEgQEAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL0tjb25maWciCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vY2RjL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vZGFjL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vZGRzL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9LY29uZmlnIgorc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL2ltcGVkYW5jZS1hbmFseXplci9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL0tjb25maWciCkBAIC02OSw0ICs3MSwzMSBAQAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci9LY29uZmlnIgogCitjb25maWcgSUlPX0RVTU1ZX0VWR0VOCisgICAgICAgdHJpc3RhdGUKKworY29uZmlnIElJT19TSU1QTEVfRFVNTVkKKyAgICAgICB0cmlzdGF0ZSAiQW4gZXhhbXBsZSBkcml2ZXIgd2l0aCBubyBoYXJkd2FyZSByZXF1aXJlbWVudHMiCisgICAgICAgc2VsZWN0IElJT19TSU1QTEVfRFVNTVlfRVZHRU4gaWYgSUlPX1NJTVBMRV9EVU1NWV9FVkVOVFMKKyAgICAgICBoZWxwCisJIERyaXZlciBpbnRlbmRlZCBtYWlubHkgYXMgZG9jdW1lbnRhdGlvbiBmb3IgaG93IHRvIHdyaXRlCisJIGEgZHJpdmVyLiBNYXkgYWxzbyBiZSB1c2VmdWwgZm9yIHRlc3RpbmcgdXNlcnNwYWNlIGNvZGUKKwkgd2l0aG91dCBoYXJkd2FyZC4KKworaWYgSUlPX1NJTVBMRV9EVU1NWQorCitjb25maWcgSUlPX1NJTVBMRV9EVU1NWV9FVkVOVFMKKyAgICAgICBib29sZWFuICJFdmVudCBnZW5lcmF0aW9uIHN1cHBvcnQiCisgICAgICAgc2VsZWN0IElJT19EVU1NWV9FVkdFTgorICAgICAgIGhlbHAKKyAgICAgICAgIEFkZCBzb21lIGR1bW15IGV2ZW50cyB0byB0aGUgc2ltcGxlIGR1bW15IGRyaXZlci4KKworY29uZmlnIElJT19TSU1QTEVfRFVNTVlfQlVGRkVSCisgICAgICAgYm9vbGVhbiAiQnVmZmVyZWQgY2FwdHVyZSBzdXBwb3J0IgorICAgICAgIGRlcGVuZHMgb24gSUlPX0tGSUZPX0JVRgorICAgICAgIGhlbHAKKyAgICAgICAgIEFkZCBidWZmZXJlZCBkYXRhIGNhcHR1cmUgdG8gdGhlIHNpbXBsZSBkdW1teSBkcml2ZXIuCisKK2VuZGlmICMgSUlPX1NJTVBMRV9EVU1NWQorCiBlbmRpZiAjIElJTwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9paW8vTWFrZWZpbGUKaW5kZXggYmI1Yzk1Yy4uMTM0MGFlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL01ha2VmaWxlCkBAIC00LDE4ICs0LDI3IEBACiAKIG9iai0kKENPTkZJR19JSU8pICs9IGluZHVzdHJpYWxpby5vCiBpbmR1c3RyaWFsaW8teSA6PSBpbmR1c3RyaWFsaW8tY29yZS5vCi1pbmR1c3RyaWFsaW8tJChDT05GSUdfSUlPX1JJTkdfQlVGRkVSKSArPSBpbmR1c3RyaWFsaW8tcmluZy5vCitpbmR1c3RyaWFsaW8tJChDT05GSUdfSUlPX0JVRkZFUikgKz0gaW5kdXN0cmlhbGlvLWJ1ZmZlci5vCiBpbmR1c3RyaWFsaW8tJChDT05GSUdfSUlPX1RSSUdHRVIpICs9IGluZHVzdHJpYWxpby10cmlnZ2VyLm8KIAogb2JqLSQoQ09ORklHX0lJT19TV19SSU5HKSArPSByaW5nX3N3Lm8KIG9iai0kKENPTkZJR19JSU9fS0ZJRk9fQlVGKSArPSBrZmlmb19idWYubwogCitvYmotJChDT05GSUdfSUlPX1NJTVBMRV9EVU1NWSkgKz0gaWlvX2R1bW15Lm8KK2lpb19kdW1teS15IDo9IGlpb19zaW1wbGVfZHVtbXkubworaWlvX2R1bW15LSQoQ09ORklHX0lJT19TSU1QTEVfRFVNTVlfRVZFTlRTKSArPSBpaW9fc2ltcGxlX2R1bW15X2V2ZW50cy5vCitpaW9fZHVtbXktJChDT05GSUdfSUlPX1NJTVBMRV9EVU1NWV9CVUZGRVIpICs9IGlpb19zaW1wbGVfZHVtbXlfYnVmZmVyLm8KKworb2JqLSQoQ09ORklHX0lJT19EVU1NWV9FVkdFTikgKz0gaWlvX2R1bW15X2V2Z2VuLm8KKwogb2JqLXkgKz0gYWNjZWwvCiBvYmoteSArPSBhZGMvCiBvYmoteSArPSBhZGRhYy8KK29iai15ICs9IGNkYy8KIG9iai15ICs9IGRhYy8KIG9iai15ICs9IGRkcy8KIG9iai15ICs9IGd5cm8vCitvYmoteSArPSBpbXBlZGFuY2UtYW5hbHl6ZXIvCiBvYmoteSArPSBpbXUvCiBvYmoteSArPSBsaWdodC8KIG9iai15ICs9IG1hZ25ldG9tZXRlci8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvS2NvbmZpZwppbmRleCA4MWEzM2I2Li41YWI3MTY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9LY29uZmlnCkBAIC0xLDEzICsxLDEzIEBACiAjCiAjIEFjY2VsZXJvbWV0ZXIgZHJpdmVycwogIwotY29tbWVudCAiQWNjZWxlcm9tZXRlcnMiCittZW51ICJBY2NlbGVyb21ldGVycyIKIAogY29uZmlnIEFESVMxNjIwMQogCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRElTMTYyMDEgRHVhbC1BeGlzIERpZ2l0YWwgSW5jbGlub21ldGVyIGFuZCBBY2NlbGVyb21ldGVyIgogCWRlcGVuZHMgb24gU1BJCi0Jc2VsZWN0IElJT19UUklHR0VSIGlmIElJT19SSU5HX0JVRkZFUgotCXNlbGVjdCBJSU9fU1dfUklORyBpZiBJSU9fUklOR19CVUZGRVIKKwlzZWxlY3QgSUlPX1RSSUdHRVIgaWYgSUlPX0JVRkZFUgorCXNlbGVjdCBJSU9fU1dfUklORyBpZiBJSU9fQlVGRkVSCiAJaGVscAogCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIGFkaXMxNjIwMSBkdWFsLWF4aXMKIAkgIGRpZ2l0YWwgaW5jbGlub21ldGVyIGFuZCBhY2NlbGVyb21ldGVyLgpAQCAtMTUsOCArMTUsOCBAQAogY29uZmlnIEFESVMxNjIwMwogCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRElTMTYyMDMgUHJvZ3JhbW1hYmxlIDM2MCBEZWdyZWVzIEluY2xpbm9tZXRlciIKIAlkZXBlbmRzIG9uIFNQSQotCXNlbGVjdCBJSU9fVFJJR0dFUiBpZiBJSU9fUklOR19CVUZGRVIKLQlzZWxlY3QgSUlPX1NXX1JJTkcgaWYgSUlPX1JJTkdfQlVGRkVSCisJc2VsZWN0IElJT19UUklHR0VSIGlmIElJT19CVUZGRVIKKwlzZWxlY3QgSUlPX1NXX1JJTkcgaWYgSUlPX0JVRkZFUgogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBhZGlzMTYyMDMgUHJvZ3JhbW1hYmxlCiAJICAzNjAgRGVncmVlcyBJbmNsaW5vbWV0ZXIuCkBAIC0yNCw4ICsyNCw4IEBACiBjb25maWcgQURJUzE2MjA0CiAJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFESVMxNjIwNCBQcm9ncmFtbWFibGUgSGlnaC1nIERpZ2l0YWwgSW1wYWN0IFNlbnNvciBhbmQgUmVjb3JkZXIiCiAJZGVwZW5kcyBvbiBTUEkKLQlzZWxlY3QgSUlPX1RSSUdHRVIgaWYgSUlPX1JJTkdfQlVGRkVSCi0Jc2VsZWN0IElJT19TV19SSU5HIGlmIElJT19SSU5HX0JVRkZFUgorCXNlbGVjdCBJSU9fVFJJR0dFUiBpZiBJSU9fQlVGRkVSCisJc2VsZWN0IElJT19TV19SSU5HIGlmIElJT19CVUZGRVIKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgYWRpczE2MjA0IFByb2dyYW1tYWJsZQogCSAgSGlnaC1nIERpZ2l0YWwgSW1wYWN0IFNlbnNvciBhbmQgUmVjb3JkZXIuCkBAIC0zMyw4ICszMyw4IEBACiBjb25maWcgQURJUzE2MjA5CiAJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFESVMxNjIwOSBEdWFsLUF4aXMgRGlnaXRhbCBJbmNsaW5vbWV0ZXIgYW5kIEFjY2VsZXJvbWV0ZXIiCiAJZGVwZW5kcyBvbiBTUEkKLQlzZWxlY3QgSUlPX1RSSUdHRVIgaWYgSUlPX1JJTkdfQlVGRkVSCi0Jc2VsZWN0IElJT19TV19SSU5HIGlmIElJT19SSU5HX0JVRkZFUgorCXNlbGVjdCBJSU9fVFJJR0dFUiBpZiBJSU9fQlVGRkVSCisJc2VsZWN0IElJT19TV19SSU5HIGlmIElJT19CVUZGRVIKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgYWRpczE2MjA5IGR1YWwtYXhpcyBkaWdpdGFsIGluY2xpbm9tZXRlcgogCSAgYW5kIGFjY2VsZXJvbWV0ZXIuCkBAIC00OSw4ICs0OSw4IEBACiBjb25maWcgQURJUzE2MjQwCiAJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFESVMxNjI0MCBQcm9ncmFtbWFibGUgSW1wYWN0IFNlbnNvciBhbmQgUmVjb3JkZXIiCiAJZGVwZW5kcyBvbiBTUEkKLQlzZWxlY3QgSUlPX1RSSUdHRVIgaWYgSUlPX1JJTkdfQlVGRkVSCi0Jc2VsZWN0IElJT19TV19SSU5HIGlmIElJT19SSU5HX0JVRkZFUgorCXNlbGVjdCBJSU9fVFJJR0dFUiBpZiBJSU9fQlVGRkVSCisJc2VsZWN0IElJT19TV19SSU5HIGlmIElJT19CVUZGRVIKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgYWRpczE2MjQwIHByb2dyYW1tYWJsZQogCSAgaW1wYWN0IFNlbnNvciBhbmQgcmVjb3JkZXIuCkBAIC02NSw4ICs2NSw5IEBACiBjb25maWcgTElTM0wwMkRRCiAJdHJpc3RhdGUgIlNUIE1pY3JvZWxlY3Ryb25pY3MgTElTM0wwMkRRIEFjY2VsZXJvbWV0ZXIgRHJpdmVyIgogCWRlcGVuZHMgb24gU1BJCi0Jc2VsZWN0IElJT19UUklHR0VSIGlmIElJT19SSU5HX0JVRkZFUgotCWRlcGVuZHMgb24gIUlJT19SSU5HX0JVRkZFUiB8fCBJSU9fS0ZJRk9fQlVGIHx8IElJT19TV19SSU5HCisJc2VsZWN0IElJT19UUklHR0VSIGlmIElJT19CVUZGRVIKKwlkZXBlbmRzIG9uICFJSU9fQlVGRkVSIHx8IElJT19LRklGT19CVUYgfHwgSUlPX1NXX1JJTkcKKwlkZXBlbmRzIG9uIEdFTkVSSUNfR1BJTwogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBTUEkgc3VwcG9ydCBmb3IgdGhlIFNUIG1pY3JvZWxlY3Ryb25pY3MKIAkgIGFjY2VsZXJvbWV0ZXIuIFRoZSBkcml2ZXIgc3VwcGxpZXMgZGlyZWN0IGFjY2VzcyB2aWEgc3lzZnMgZmlsZXMKQEAgLTc0LDcgKzc1LDcgQEAKIAogY2hvaWNlCiAJcHJvbXB0ICJCdWZmZXIgdHlwZSIKLSAgICAgICAJZGVwZW5kcyBvbiBMSVMzTDAyRFEgJiYgSUlPX1JJTkdfQlVGRkVSCisgICAgICAgCWRlcGVuZHMgb24gTElTM0wwMkRRICYmIElJT19CVUZGRVIKIAogY29uZmlnIExJUzNMMDJEUV9CVUZfS0ZJRk8KICAgICAgICBkZXBlbmRzIG9uIElJT19LRklGT19CVUYKQEAgLTk0LDkgKzk1LDExIEBACiBlbmRjaG9pY2UKIAogY29uZmlnIFNDQTMwMDAKLQlkZXBlbmRzIG9uIElJT19SSU5HX0JVRkZFUgorCWRlcGVuZHMgb24gSUlPX0JVRkZFUgogCWRlcGVuZHMgb24gU1BJCiAJdHJpc3RhdGUgIlZUSSBTQ0EzMDAwIHNlcmllcyBhY2NlbGVyb21ldGVycyIKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgdGhlIFZUSSBTQ0EzMDAwIHNlcmllcyBvZiBTUEkKIAkgIGFjY2VsZXJvbWV0ZXJzLiBUaGVzZSBkZXZpY2VzIHVzZSBhIGhhcmR3YXJlIHJpbmcgYnVmZmVyLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9NYWtlZmlsZQppbmRleCAxYjJhNmQzLi45NWM2NjY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvTWFrZWZpbGUKQEAgLTMsMzIgKzMsMzIgQEAKICMKIAogYWRpczE2MjAxLXkgICAgICAgICAgICAgOj0gYWRpczE2MjAxX2NvcmUubwotYWRpczE2MjAxLSQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgKz0gYWRpczE2MjAxX3JpbmcubyBhZGlzMTYyMDFfdHJpZ2dlci5vCithZGlzMTYyMDEtJChDT05GSUdfSUlPX0JVRkZFUikgKz0gYWRpczE2MjAxX3JpbmcubyBhZGlzMTYyMDFfdHJpZ2dlci5vCiBvYmotJChDT05GSUdfQURJUzE2MjAxKSArPSBhZGlzMTYyMDEubwogCiBhZGlzMTYyMDMteSAgICAgICAgICAgICA6PSBhZGlzMTYyMDNfY29yZS5vCi1hZGlzMTYyMDMtJChDT05GSUdfSUlPX1JJTkdfQlVGRkVSKSArPSBhZGlzMTYyMDNfcmluZy5vIGFkaXMxNjIwM190cmlnZ2VyLm8KK2FkaXMxNjIwMy0kKENPTkZJR19JSU9fQlVGRkVSKSArPSBhZGlzMTYyMDNfcmluZy5vIGFkaXMxNjIwM190cmlnZ2VyLm8KIG9iai0kKENPTkZJR19BRElTMTYyMDMpICs9IGFkaXMxNjIwMy5vCiAKIGFkaXMxNjIwNC15ICAgICAgICAgICAgIDo9IGFkaXMxNjIwNF9jb3JlLm8KLWFkaXMxNjIwNC0kKENPTkZJR19JSU9fUklOR19CVUZGRVIpICs9IGFkaXMxNjIwNF9yaW5nLm8gYWRpczE2MjA0X3RyaWdnZXIubworYWRpczE2MjA0LSQoQ09ORklHX0lJT19CVUZGRVIpICs9IGFkaXMxNjIwNF9yaW5nLm8gYWRpczE2MjA0X3RyaWdnZXIubwogb2JqLSQoQ09ORklHX0FESVMxNjIwNCkgKz0gYWRpczE2MjA0Lm8KIAogYWRpczE2MjA5LXkgICAgICAgICAgICAgOj0gYWRpczE2MjA5X2NvcmUubwotYWRpczE2MjA5LSQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgKz0gYWRpczE2MjA5X3JpbmcubyBhZGlzMTYyMDlfdHJpZ2dlci5vCithZGlzMTYyMDktJChDT05GSUdfSUlPX0JVRkZFUikgKz0gYWRpczE2MjA5X3JpbmcubyBhZGlzMTYyMDlfdHJpZ2dlci5vCiBvYmotJChDT05GSUdfQURJUzE2MjA5KSArPSBhZGlzMTYyMDkubwogCiBhZGlzMTYyMjAteSAgICAgICAgICAgICA6PSBhZGlzMTYyMjBfY29yZS5vCiBvYmotJChDT05GSUdfQURJUzE2MjIwKSArPSBhZGlzMTYyMjAubwogCiBhZGlzMTYyNDAteSAgICAgICAgICAgICA6PSBhZGlzMTYyNDBfY29yZS5vCi1hZGlzMTYyNDAtJChDT05GSUdfSUlPX1JJTkdfQlVGRkVSKSArPSBhZGlzMTYyNDBfcmluZy5vIGFkaXMxNjI0MF90cmlnZ2VyLm8KK2FkaXMxNjI0MC0kKENPTkZJR19JSU9fQlVGRkVSKSArPSBhZGlzMTYyNDBfcmluZy5vIGFkaXMxNjI0MF90cmlnZ2VyLm8KIG9iai0kKENPTkZJR19BRElTMTYyNDApICs9IGFkaXMxNjI0MC5vCiAKIG9iai0kKENPTkZJR19LWFNEOSkJKz0ga3hzZDkubwogCiBsaXMzbDAyZHEteQkJOj0gbGlzM2wwMmRxX2NvcmUubwotbGlzM2wwMmRxLSQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgKz0gbGlzM2wwMmRxX3JpbmcubworbGlzM2wwMmRxLSQoQ09ORklHX0lJT19CVUZGRVIpICs9IGxpczNsMDJkcV9yaW5nLm8KIG9iai0kKENPTkZJR19MSVMzTDAyRFEpCSs9IGxpczNsMDJkcS5vCiAKIHNjYTMwMDAteQkJOj0gc2NhMzAwMF9jb3JlLm8gc2NhMzAwMF9yaW5nLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWNjZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWNjZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2NTFmOC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FjY2VsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0KLSNpbmNsdWRlICIuLi9zeXNmcy5oIgotCi0vKiBBY2NlbGVyb21ldGVyIHR5cGVzIG9mIGF0dHJpYnV0ZSAqLwotI2RlZmluZSBJSU9fREVWX0FUVFJfQUNDRUxfT0ZGU0VUKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJXAotCUlJT19ERVZJQ0VfQVRUUihhY2NlbF9vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKLQotI2RlZmluZSBJSU9fREVWX0FUVFJfQUNDRUxfWF9PRkZTRVQoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQlcCi0JSUlPX0RFVklDRV9BVFRSKGFjY2VsX3hfb2Zmc2V0LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDQ0VMX1lfT0ZGU0VUKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJXAotCUlJT19ERVZJQ0VfQVRUUihhY2NlbF95X29mZnNldCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQotCi0jZGVmaW5lIElJT19ERVZfQVRUUl9BQ0NFTF9aX09GRlNFVChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCVwKLQlJSU9fREVWSUNFX0FUVFIoYWNjZWxfel9vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKLQotI2RlZmluZSBJSU9fQ09OU1RfQVRUUl9BQ0NFTF9TQ0FMRShfc3RyaW5nKQkJXAotCUlJT19DT05TVF9BVFRSKGFjY2VsX3NjYWxlLCBfc3RyaW5nKQotCi0jZGVmaW5lIElJT19ERVZfQVRUUl9BQ0NFTF9TQ0FMRShfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQlcCi0JSUlPX0RFVklDRV9BVFRSKGFjY2VsX3NjYWxlLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDQ0VMX1hfU0NBTEUoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJXAotCUlJT19ERVZJQ0VfQVRUUihhY2NlbF94X3NjYWxlLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDQ0VMX1lfU0NBTEUoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJXAotCUlJT19ERVZJQ0VfQVRUUihhY2NlbF95X3NjYWxlLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDQ0VMX1pfU0NBTEUoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJXAotCUlJT19ERVZJQ0VfQVRUUihhY2NlbF96X3NjYWxlLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDQ0VMX0NBTElCQklBUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQlcCi0JSUlPX0RFVklDRV9BVFRSKGFjY2VsX2NhbGliYmlhcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQotCi0jZGVmaW5lIElJT19ERVZfQVRUUl9BQ0NFTF9YX0NBTElCQklBUyhfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQlcCi0JSUlPX0RFVklDRV9BVFRSKGFjY2VsX3hfY2FsaWJiaWFzLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDQ0VMX1lfQ0FMSUJCSUFTKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJCVwKLQlJSU9fREVWSUNFX0FUVFIoYWNjZWxfeV9jYWxpYmJpYXMsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKLQotI2RlZmluZSBJSU9fREVWX0FUVFJfQUNDRUxfWl9DQUxJQkJJQVMoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJXAotCUlJT19ERVZJQ0VfQVRUUihhY2NlbF96X2NhbGliYmlhcywgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQotCi0jZGVmaW5lIElJT19ERVZfQVRUUl9BQ0NFTF9DQUxJQlNDQUxFKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJCVwKLQlJSU9fREVWSUNFX0FUVFIoYWNjZWxfY2FsaWJzY2FsZSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQotCi0jZGVmaW5lIElJT19ERVZfQVRUUl9BQ0NFTF9YX0NBTElCU0NBTEUoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJXAotCUlJT19ERVZJQ0VfQVRUUihhY2NlbF94X2NhbGlic2NhbGUsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKLQotI2RlZmluZSBJSU9fREVWX0FUVFJfQUNDRUxfWV9DQUxJQlNDQUxFKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJCVwKLQlJSU9fREVWSUNFX0FUVFIoYWNjZWxfeV9jYWxpYnNjYWxlLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDQ0VMX1pfQ0FMSUJTQ0FMRShfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQlcCi0JSUlPX0RFVklDRV9BVFRSKGFjY2VsX3pfY2FsaWJzY2FsZSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQotCi0jZGVmaW5lIElJT19ERVZfQVRUUl9BQ0NFTChfc2hvdywgX2FkZHIpCQkJXAotCUlJT19ERVZJQ0VfQVRUUihhY2NlbF9yYXcsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKLQotI2RlZmluZSBJSU9fREVWX0FUVFJfQUNDRUxfWChfc2hvdywgX2FkZHIpCQkJXAotCUlJT19ERVZJQ0VfQVRUUihhY2NlbF94X3JhdywgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQotCi0jZGVmaW5lIElJT19ERVZfQVRUUl9BQ0NFTF9ZKF9zaG93LCBfYWRkcikJCQlcCi0JSUlPX0RFVklDRV9BVFRSKGFjY2VsX3lfcmF3LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDQ0VMX1ooX3Nob3csIF9hZGRyKQkJCVwKLQlJSU9fREVWSUNFX0FUVFIoYWNjZWxfel9yYXcsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKLQotI2RlZmluZSBJSU9fREVWX0FUVFJfQUNDRUxfWFkoX3Nob3csIF9hZGRyKQkJCVwKLQlJSU9fREVWSUNFX0FUVFIoYWNjZWxfeHksIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKLQotI2RlZmluZSBJSU9fREVWX0FUVFJfQUNDRUxfUEVBSyhfc2hvdywgX2FkZHIpCQkJXAotCUlJT19ERVZJQ0VfQVRUUihhY2NlbF9wZWFrLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDQ0VMX1hQRUFLKF9zaG93LCBfYWRkcikJCQlcCi0JSUlPX0RFVklDRV9BVFRSKGFjY2VsX3hwZWFrLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDQ0VMX1lQRUFLKF9zaG93LCBfYWRkcikJCQlcCi0JSUlPX0RFVklDRV9BVFRSKGFjY2VsX3lwZWFrLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDQ0VMX1pQRUFLKF9zaG93LCBfYWRkcikJCQlcCi0JSUlPX0RFVklDRV9BVFRSKGFjY2VsX3pwZWFrLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDQ0VMX1hZUEVBSyhfc2hvdywgX2FkZHIpCQlcCi0JSUlPX0RFVklDRV9BVFRSKGFjY2VsX3h5cGVhaywgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQotCi0jZGVmaW5lIElJT19ERVZfQVRUUl9BQ0NFTF9YWVpQRUFLKF9zaG93LCBfYWRkcikJCVwKLQlJSU9fREVWSUNFX0FUVFIoYWNjZWxfeHl6cGVhaywgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDEuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxLmgKaW5kZXggZGFjNTU0MC4uNzI3NTBmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMS5oCkBAIC04OSw3ICs4OSw3IEBACiAJQURJUzE2MjAxX1NDQU5fSU5DTElfWSwKIH07CiAKLSNpZmRlZiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSCisjaWZkZWYgQ09ORklHX0lJT19CVUZGRVIKIHZvaWQgYWRpczE2MjAxX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogaW50IGFkaXMxNjIwMV9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogCkBAIC0xMDAsNyArMTAwLDcgQEAKIGludCBhZGlzMTYyMDFfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiB2b2lkIGFkaXMxNjIwMV91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogCi0jZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisjZWxzZSAvKiBDT05GSUdfSUlPX0JVRkZFUiAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQgYWRpczE2MjAxX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CkBAIC0xMzcsNSArMTM3LDUgQEAKIHsKIH0KIAotI2VuZGlmIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKyNlbmRpZiAvKiBDT05GSUdfSUlPX0JVRkZFUiAqLwogI2VuZGlmIC8qIFNQSV9BRElTMTYyMDFfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxX2NvcmUuYwppbmRleCAyZmQwMWFlLi4xYzVkYWQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMV9jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfY29yZS5jCkBAIC0xMywxNCArMTMsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi9zeXNmcy5oIgotI2luY2x1ZGUgIi4uL3JpbmdfZ2VuZXJpYy5oIgotCi0jaW5jbHVkZSAiYWNjZWwuaCIKLSNpbmNsdWRlICJpbmNsaW5vbWV0ZXIuaCIKLSNpbmNsdWRlICIuLi9hZGMvYWRjLmgiCisjaW5jbHVkZSAiLi4vYnVmZmVyX2dlbmVyaWMuaCIKIAogI2luY2x1ZGUgImFkaXMxNjIwMS5oIgogCkBAIC0zMjgsNyArMzI1LDcgQEAKIAljYXNlICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpOgogCWNhc2UgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpOgogCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKLQkJY2FzZSBJSU9fSU46CisJCWNhc2UgSUlPX1ZPTFRBR0U6CiAJCQkqdmFsID0gMDsKIAkJCWlmIChjaGFuLT5jaGFubmVsID09IDApCiAJCQkJKnZhbDIgPSAxMjIwOwpAQCAtNDEwLDcgKzQwNyw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBhZGlzMTYyMDFfY2hhbm5lbHNbXSA9IHsKLQlJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsICJzdXBwbHkiLCAwLCAwLAorCUlJT19DSEFOKElJT19WT0xUQUdFLCAwLCAxLCAwLCAic3VwcGx5IiwgMCwgMCwKIAkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpLAogCQkgaW5fc3VwcGx5LCBBRElTMTYyMDFfU0NBTl9TVVBQTFksCiAJCSBJSU9fU1QoJ3UnLCAxMiwgMTYsIDApLCAwKSwKQEAgLTQyOSw3ICs0MjYsNyBAQAogCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQkJJQVNfU0VQQVJBVEUpLAogCQkgYWNjZWxfeSwgQURJUzE2MjAxX1NDQU5fQUNDX1ksCiAJCSBJSU9fU1QoJ3MnLCAxNCwgMTYsIDApLCAwKSwKLQlJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDEsIDAsCisJSUlPX0NIQU4oSUlPX1ZPTFRBR0UsIDAsIDEsIDAsIE5VTEwsIDEsIDAsCiAJCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwKIAkJIGluX2F1eCwgQURJUzE2MjAxX1NDQU5fQVVYX0FEQywKIAkJIElJT19TVCgndScsIDEyLCAxNiwgMCksIDApLApAQCAtNDY2LDcgKzQ2Myw3IEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGFkaXMxNjIwMV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCWludCByZXQsIHJlZ2RvbmUgPSAwOworCWludCByZXQ7CiAJc3RydWN0IGFkaXMxNjIwMV9zdGF0ZSAqc3Q7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKIApAQCAtNDk1LDE0ICs0OTIsOSBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CiAKLQlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOwotCXJlZ2RvbmUgPSAxOwotCi0JcmV0ID0gaWlvX3JpbmdfYnVmZmVyX3JlZ2lzdGVyX2V4KGluZGlvX2Rldi0+cmluZywgMCwKLQkJCQkJICBhZGlzMTYyMDFfY2hhbm5lbHMsCi0JCQkJCSAgQVJSQVlfU0laRShhZGlzMTYyMDFfY2hhbm5lbHMpKTsKKwlyZXQgPSBpaW9fYnVmZmVyX3JlZ2lzdGVyKGluZGlvX2RldiwKKwkJCQkgIGFkaXMxNjIwMV9jaGFubmVscywKKwkJCQkgIEFSUkFZX1NJWkUoYWRpczE2MjAxX2NoYW5uZWxzKSk7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBpbml0aWFsaXplIHRoZSByaW5nXG4iKTsKIAkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOwpAQCAtNTE4LDE5ICs1MTAsMjAgQEAKIAlyZXQgPSBhZGlzMTYyMDFfaW5pdGlhbF9zZXR1cChpbmRpb19kZXYpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfcmVtb3ZlX3RyaWdnZXI7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3JfcmVtb3ZlX3RyaWdnZXI7CiAJcmV0dXJuIDA7CiAKIGVycm9yX3JlbW92ZV90cmlnZ2VyOgogCWFkaXMxNjIwMV9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOwogZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc6Ci0JaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIGVycm9yX3VucmVnX3JpbmdfZnVuY3M6CiAJYWRpczE2MjAxX3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKIGVycm9yX2ZyZWVfZGV2OgotCWlmIChyZWdkb25lKQotCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKLQllbHNlCi0JCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogZXJyb3JfcmV0OgogCXJldHVybiByZXQ7CiB9CkBAIC01MzksMTAgKzUzMiwxMSBAQAogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKIAotCWFkaXMxNjIwMV9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOwotCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldi0+cmluZyk7CiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJYWRpczE2MjAxX3JlbW92ZV90cmlnZ2VyKGluZGlvX2Rldik7CisJaWlvX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldik7CiAJYWRpczE2MjAxX3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfcmluZy5jCmluZGV4IDY2ZTcwOGQuLmRiZDg4MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxX3JpbmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMV9yaW5nLmMKQEAgLTEsMTcgKzEsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgotI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCiAjaW5jbHVkZSAiLi4vcmluZ19zdy5oIgotI2luY2x1ZGUgImFjY2VsLmgiCi0jaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgorI2luY2x1ZGUgIi4uL3RyaWdnZXJfY29uc3VtZXIuaCIKICNpbmNsdWRlICJhZGlzMTYyMDEuaCIKIAogCkBAIC0zOCwxMCArMzMsMTIgQEAKIAkJeGZlcnNbaV0uY3NfY2hhbmdlID0gMTsKIAkJeGZlcnNbaV0ubGVuID0gMjsKIAkJeGZlcnNbaV0uZGVsYXlfdXNlY3MgPSAyMDsKLQkJeGZlcnNbaV0udHhfYnVmID0gc3QtPnR4ICsgMiAqIGk7Ci0JCXN0LT50eFsyICogaV0gPSBBRElTMTYyMDFfUkVBRF9SRUcoQURJUzE2MjAxX1NVUFBMWV9PVVQgKwotCQkJCQkJICAgMiAqIGkpOwotCQlzdC0+dHhbMiAqIGkgKyAxXSA9IDA7CisJCWlmIChpIDwgQURJUzE2MjAxX09VVFBVVFMpIHsKKwkJCXhmZXJzW2ldLnR4X2J1ZiA9IHN0LT50eCArIDIgKiBpOworCQkJc3QtPnR4WzIgKiBpXSA9IEFESVMxNjIwMV9SRUFEX1JFRyhBRElTMTYyMDFfU1VQUExZX09VVCArCisJCQkJCQkJICAgMiAqIGkpOworCQkJc3QtPnR4WzIgKiBpICsgMV0gPSAwOworCQl9CiAJCWlmIChpID49IDEpCiAJCQl4ZmVyc1tpXS5yeF9idWYgPSByeCArIDIgKiAoaSAtIDEpOwogCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbaV0sICZtc2cpOwpAQCAtNjIsOSArNTksOSBAQAogc3RhdGljIGlycXJldHVybl90IGFkaXMxNjIwMV90cmlnZ2VyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqcCkKIHsKIAlzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqcGYgPSBwOwotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwZi0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwZi0+aW5kaW9fZGV2OwogCXN0cnVjdCBhZGlzMTYyMDFfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gaW5kaW9fZGV2LT5yaW5nOworCXN0cnVjdCBpaW9fYnVmZmVyICpyaW5nID0gaW5kaW9fZGV2LT5idWZmZXI7CiAKIAlpbnQgaSA9IDA7CiAJczE2ICpkYXRhOwpAQCAtOTcsMjYgKzk0LDI2IEBACiB2b2lkIGFkaXMxNjIwMV91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJaWlvX2RlYWxsb2NfcG9sbGZ1bmMoaW5kaW9fZGV2LT5wb2xsZnVuYyk7Ci0JaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPmJ1ZmZlcik7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX3Jpbmdfc2V0dXBfb3BzIGFkaXMxNjIwMV9yaW5nX3NldHVwX29wcyA9IHsKLQkucHJlZW5hYmxlID0gJmlpb19zd19yaW5nX3ByZWVuYWJsZSwKLQkucG9zdGVuYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcG9zdGVuYWJsZSwKLQkucHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcHJlZGlzYWJsZSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMgYWRpczE2MjAxX3Jpbmdfc2V0dXBfb3BzID0geworCS5wcmVlbmFibGUgPSAmaWlvX3N3X2J1ZmZlcl9wcmVlbmFibGUsCisJLnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZSwKKwkucHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNhYmxlLAogfTsKIAogaW50IGFkaXMxNjIwMV9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCWludCByZXQgPSAwOwotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmc7CisJc3RydWN0IGlpb19idWZmZXIgKnJpbmc7CiAKIAlyaW5nID0gaWlvX3N3X3JiX2FsbG9jYXRlKGluZGlvX2Rldik7CiAJaWYgKCFyaW5nKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCXJldHVybiByZXQ7CiAJfQotCWluZGlvX2Rldi0+cmluZyA9IHJpbmc7CisJaW5kaW9fZGV2LT5idWZmZXIgPSByaW5nOwogCS8qIEVmZmVjdGl2ZWx5IHNlbGVjdCB0aGUgcmluZyBidWZmZXIgaW1wbGVtZW50YXRpb24gKi8KIAlyaW5nLT5icGUgPSAyOwogCXJpbmctPnNjYW5fdGltZXN0YW1wID0gdHJ1ZTsKQEAgLTEyNCwxNSArMTIxLDYgQEAKIAlyaW5nLT5zZXR1cF9vcHMgPSAmYWRpczE2MjAxX3Jpbmdfc2V0dXBfb3BzOwogCXJpbmctPm93bmVyID0gVEhJU19NT0RVTEU7CiAKLQkvKiBTZXQgZGVmYXVsdCBzY2FuIG1vZGUgKi8KLQlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLAlBRElTMTYyMDFfU0NBTl9TVVBQTFkpOwotCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIEFESVMxNjIwMV9TQ0FOX0FDQ19YKTsKLQlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBBRElTMTYyMDFfU0NBTl9BQ0NfWSk7Ci0JaWlvX3NjYW5fbWFza19zZXQocmluZywgQURJUzE2MjAxX1NDQU5fQVVYX0FEQyk7Ci0JaWlvX3NjYW5fbWFza19zZXQocmluZywgQURJUzE2MjAxX1NDQU5fVEVNUCk7Ci0JaWlvX3NjYW5fbWFza19zZXQocmluZywgQURJUzE2MjAxX1NDQU5fSU5DTElfWCk7Ci0JaWlvX3NjYW5fbWFza19zZXQocmluZywgQURJUzE2MjAxX1NDQU5fSU5DTElfWSk7Ci0KIAlpbmRpb19kZXYtPnBvbGxmdW5jID0gaWlvX2FsbG9jX3BvbGxmdW5jKCZpaW9fcG9sbGZ1bmNfc3RvcmVfdGltZSwKIAkJCQkJCSAmYWRpczE2MjAxX3RyaWdnZXJfaGFuZGxlciwKIAkJCQkJCSBJUlFGX09ORVNIT1QsCkBAIC0xNDQsOSArMTMyLDkgQEAKIAkJZ290byBlcnJvcl9paW9fc3dfcmJfZnJlZTsKIAl9CiAKLQlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX1JJTkdfVFJJR0dFUkVEOworCWluZGlvX2Rldi0+bW9kZXMgfD0gSU5ESU9fQlVGRkVSX1RSSUdHRVJFRDsKIAlyZXR1cm4gMDsKIGVycm9yX2lpb19zd19yYl9mcmVlOgotCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7CisJaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5idWZmZXIpOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMV90cmlnZ2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMV90cmlnZ2VyLmMKaW5kZXggM2E5NWMwOC4uZjQ0ODI1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfdHJpZ2dlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxX3RyaWdnZXIuYwpAQCAtMSwxMyArMSw4IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgotI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCiAjaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgogI2luY2x1ZGUgImFkaXMxNjIwMS5oIgogCkBAIC0yMyw2ICsxOCwxMSBAQAogCXJldHVybiBhZGlzMTYyMDFfc2V0X2lycShpbmRpb19kZXYsIHN0YXRlKTsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fdHJpZ2dlcl9vcHMgYWRpczE2MjAxX3RyaWdnZXJfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5zZXRfdHJpZ2dlcl9zdGF0ZSA9ICZhZGlzMTYyMDFfZGF0YV9yZHlfdHJpZ2dlcl9zZXRfc3RhdGUsCit9OworCiBpbnQgYWRpczE2MjAxX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKIAlpbnQgcmV0OwpAQCAtNDEsOSArNDEsOCBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfZnJlZV90cmlnOwogCXN0LT50cmlnLT5kZXYucGFyZW50ID0gJnN0LT51cy0+ZGV2OwotCXN0LT50cmlnLT5vd25lciA9IFRISVNfTU9EVUxFOworCXN0LT50cmlnLT5vcHMgPSAmYWRpczE2MjAxX3RyaWdnZXJfb3BzOwogCXN0LT50cmlnLT5wcml2YXRlX2RhdGEgPSBpbmRpb19kZXY7Ci0Jc3QtPnRyaWctPnNldF90cmlnZ2VyX3N0YXRlID0gJmFkaXMxNjIwMV9kYXRhX3JkeV90cmlnZ2VyX3NldF9zdGF0ZTsKIAlyZXQgPSBpaW9fdHJpZ2dlcl9yZWdpc3RlcihzdC0+dHJpZyk7CiAKIAkvKiBzZWxlY3QgZGVmYXVsdCB0cmlnZ2VyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMy5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDMuaAppbmRleCA0MDcxYmMwLi4zZjk2YWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzLmgKQEAgLTgyLDcgKzgyLDcgQEAKIAlBRElTMTYyMDNfU0NBTl9JTkNMSV9ZLAogfTsKIAotI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKKyNpZmRlZiBDT05GSUdfSUlPX0JVRkZFUgogdm9pZCBhZGlzMTYyMDNfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiBpbnQgYWRpczE2MjAzX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiAKQEAgLTkzLDcgKzkzLDcgQEAKIGludCBhZGlzMTYyMDNfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiB2b2lkIGFkaXMxNjIwM191bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogCi0jZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisjZWxzZSAvKiBDT05GSUdfSUlPX0JVRkZFUiAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQgYWRpczE2MjAzX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CkBAIC0xMjEsNSArMTIxLDUgQEAKIHsKIH0KIAotI2VuZGlmIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKyNlbmRpZiAvKiBDT05GSUdfSUlPX0JVRkZFUiAqLwogI2VuZGlmIC8qIFNQSV9BRElTMTYyMDNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX2NvcmUuYwppbmRleCBjZjVkMTVkLi44YTMzMzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwM19jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDNfY29yZS5jCkBAIC0xMywxMyArMTMsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi9zeXNmcy5oIgotI2luY2x1ZGUgImFjY2VsLmgiCi0jaW5jbHVkZSAiaW5jbGlub21ldGVyLmgiCi0jaW5jbHVkZSAiLi4vcmluZ19nZW5lcmljLmgiCi0jaW5jbHVkZSAiLi4vYWRjL2FkYy5oIgorI2luY2x1ZGUgIi4uL2J1ZmZlcl9nZW5lcmljLmgiCiAKICNpbmNsdWRlICJhZGlzMTYyMDMuaCIKIApAQCAtMzM0LDcgKzMzMiw3IEBACiAJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKToKIAljYXNlICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKToKIAkJc3dpdGNoIChjaGFuLT50eXBlKSB7Ci0JCWNhc2UgSUlPX0lOOgorCQljYXNlIElJT19WT0xUQUdFOgogCQkJKnZhbCA9IDA7CiAJCQlpZiAoY2hhbi0+Y2hhbm5lbCA9PSAwKQogCQkJCSp2YWwyID0gMTIyMDsKQEAgLTM3NSwxMSArMzczLDExIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBhZGlzMTYyMDNfY2hhbm5lbHNbXSA9IHsKLQlJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsICJzdXBwbHkiLCAwLCAwLAorCUlJT19DSEFOKElJT19WT0xUQUdFLCAwLCAxLCAwLCAic3VwcGx5IiwgMCwgMCwKIAkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpLAogCQkgaW5fc3VwcGx5LCBBRElTMTYyMDNfU0NBTl9TVVBQTFksCiAJCSBJSU9fU1QoJ3UnLCAxMiwgMTYsIDApLCAwKSwKLQlJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDEsIDAsCisJSUlPX0NIQU4oSUlPX1ZPTFRBR0UsIDAsIDEsIDAsIE5VTEwsIDEsIDAsCiAJCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwKIAkJIGluX2F1eCwgQURJUzE2MjAzX1NDQU5fQVVYX0FEQywKIAkJIElJT19TVCgndScsIDEyLCAxNiwgMCksIDApLApAQCAtNDIxLDcgKzQxOSw3IEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGFkaXMxNjIwM19wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCWludCByZXQsIHJlZ2RvbmUgPSAwOworCWludCByZXQ7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKIAlzdHJ1Y3QgYWRpczE2MjAzX3N0YXRlICpzdDsKIApAQCAtNDQ4LDE0ICs0NDYsOSBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CiAKLQlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOwotCXJlZ2RvbmUgPSAxOwotCi0JcmV0ID0gaWlvX3JpbmdfYnVmZmVyX3JlZ2lzdGVyX2V4KGluZGlvX2Rldi0+cmluZywgMCwKLQkJCQkJICBhZGlzMTYyMDNfY2hhbm5lbHMsCi0JCQkJCSAgQVJSQVlfU0laRShhZGlzMTYyMDNfY2hhbm5lbHMpKTsKKwlyZXQgPSBpaW9fYnVmZmVyX3JlZ2lzdGVyKGluZGlvX2RldiwKKwkJCQkgIGFkaXMxNjIwM19jaGFubmVscywKKwkJCQkgIEFSUkFZX1NJWkUoYWRpczE2MjAzX2NoYW5uZWxzKSk7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBpbml0aWFsaXplIHRoZSByaW5nXG4iKTsKIAkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOwpAQCAtNDcxLDE5ICs0NjQsMjEgQEAKIAlyZXQgPSBhZGlzMTYyMDNfaW5pdGlhbF9zZXR1cChpbmRpb19kZXYpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfcmVtb3ZlX3RyaWdnZXI7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZW1vdmVfdHJpZ2dlcjsKKwogCXJldHVybiAwOwogCiBlcnJvcl9yZW1vdmVfdHJpZ2dlcjoKIAlhZGlzMTYyMDNfcmVtb3ZlX3RyaWdnZXIoaW5kaW9fZGV2KTsKIGVycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOgotCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldi0+cmluZyk7CisJaWlvX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldik7CiBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOgogCWFkaXMxNjIwM191bmNvbmZpZ3VyZV9yaW5nKGluZGlvX2Rldik7CiBlcnJvcl9mcmVlX2RldjoKLQlpZiAocmVnZG9uZSkKLQkJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7Ci0JZWxzZQotCQlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIGVycm9yX3JldDoKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDkyLDEwICs0ODcsMTEgQEAKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CiAKLQlhZGlzMTYyMDNfcmVtb3ZlX3RyaWdnZXIoaW5kaW9fZGV2KTsKLQlpaW9fcmluZ19idWZmZXJfdW5yZWdpc3RlcihpbmRpb19kZXYtPnJpbmcpOwogCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWFkaXMxNjIwM19yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOworCWlpb19idWZmZXJfdW5yZWdpc3RlcihpbmRpb19kZXYpOwogCWFkaXMxNjIwM191bmNvbmZpZ3VyZV9yaW5nKGluZGlvX2Rldik7CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX3JpbmcuYwppbmRleCBkMmMwN2M1Li44MzhkMzAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwM19yaW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDNfcmluZy5jCkBAIC0xLDIwICsxLDEyIEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgotI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCiAjaW5jbHVkZSAiLi4vcmluZ19zdy5oIgotI2luY2x1ZGUgImFjY2VsLmgiCi0jaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgorI2luY2x1ZGUgIi4uL3RyaWdnZXJfY29uc3VtZXIuaCIKICNpbmNsdWRlICJhZGlzMTYyMDMuaCIKIAogLyoqCkBAIC02Nyw5ICs1OSw5IEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgYWRpczE2MjAzX3RyaWdnZXJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwKQogewogCXN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZiA9IHA7Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5pbmRpb19kZXY7CiAJc3RydWN0IGFkaXMxNjIwM19zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBpbmRpb19kZXYtPnJpbmc7CisJc3RydWN0IGlpb19idWZmZXIgKnJpbmcgPSBpbmRpb19kZXYtPmJ1ZmZlcjsKIAogCWludCBpID0gMDsKIAlzMTYgKmRhdGE7CkBAIC0xMDQsMjYgKzk2LDI2IEBACiB2b2lkIGFkaXMxNjIwM191bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJaWlvX2RlYWxsb2NfcG9sbGZ1bmMoaW5kaW9fZGV2LT5wb2xsZnVuYyk7Ci0JaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPmJ1ZmZlcik7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX3Jpbmdfc2V0dXBfb3BzIGFkaXMxNjIwM19yaW5nX3NldHVwX29wcyA9IHsKLQkucHJlZW5hYmxlID0gJmlpb19zd19yaW5nX3ByZWVuYWJsZSwKLQkucG9zdGVuYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcG9zdGVuYWJsZSwKLQkucHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcHJlZGlzYWJsZSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMgYWRpczE2MjAzX3Jpbmdfc2V0dXBfb3BzID0geworCS5wcmVlbmFibGUgPSAmaWlvX3N3X2J1ZmZlcl9wcmVlbmFibGUsCisJLnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZSwKKwkucHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNhYmxlLAogfTsKIAogaW50IGFkaXMxNjIwM19jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCWludCByZXQgPSAwOwotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmc7CisJc3RydWN0IGlpb19idWZmZXIgKnJpbmc7CiAKIAlyaW5nID0gaWlvX3N3X3JiX2FsbG9jYXRlKGluZGlvX2Rldik7CiAJaWYgKCFyaW5nKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCXJldHVybiByZXQ7CiAJfQotCWluZGlvX2Rldi0+cmluZyA9IHJpbmc7CisJaW5kaW9fZGV2LT5idWZmZXIgPSByaW5nOwogCS8qIEVmZmVjdGl2ZWx5IHNlbGVjdCB0aGUgcmluZyBidWZmZXIgaW1wbGVtZW50YXRpb24gKi8KIAlyaW5nLT5icGUgPSAyOwogCXJpbmctPnNjYW5fdGltZXN0YW1wID0gdHJ1ZTsKQEAgLTEzMSwxMyArMTIzLDYgQEAKIAlyaW5nLT5zZXR1cF9vcHMgPSAmYWRpczE2MjAzX3Jpbmdfc2V0dXBfb3BzOwogCXJpbmctPm93bmVyID0gVEhJU19NT0RVTEU7CiAKLQkvKiBTZXQgZGVmYXVsdCBzY2FuIG1vZGUgKi8KLQlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBBRElTMTYyMDNfU0NBTl9TVVBQTFkpOwotCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIEFESVMxNjIwM19TQ0FOX1RFTVApOwotCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIEFESVMxNjIwM19TQ0FOX0FVWF9BREMpOwotCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIEFESVMxNjIwM19TQ0FOX0lOQ0xJX1gpOwotCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIEFESVMxNjIwM19TQ0FOX0lOQ0xJX1kpOwotCiAJaW5kaW9fZGV2LT5wb2xsZnVuYyA9IGlpb19hbGxvY19wb2xsZnVuYygmaWlvX3BvbGxmdW5jX3N0b3JlX3RpbWUsCiAJCQkJCQkgJmFkaXMxNjIwM190cmlnZ2VyX2hhbmRsZXIsCiAJCQkJCQkgSVJRRl9PTkVTSE9ULApAQCAtMTQ5LDEwICsxMzQsMTAgQEAKIAkJZ290byBlcnJvcl9paW9fc3dfcmJfZnJlZTsKIAl9CiAKLQlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX1JJTkdfVFJJR0dFUkVEOworCWluZGlvX2Rldi0+bW9kZXMgfD0gSU5ESU9fQlVGRkVSX1RSSUdHRVJFRDsKIAlyZXR1cm4gMDsKIAogZXJyb3JfaWlvX3N3X3JiX2ZyZWU6Ci0JaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPmJ1ZmZlcik7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX3RyaWdnZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX3RyaWdnZXIuYwppbmRleCAzY2FmM2U4Li41MDE2NWY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwM190cmlnZ2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDNfdHJpZ2dlci5jCkBAIC0xLDE0ICsxLDggQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgotI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCiAjaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgogI2luY2x1ZGUgImFkaXMxNjIwMy5oIgogCkBAIC0yNCw2ICsxOCwxMSBAQAogCXJldHVybiBhZGlzMTYyMDNfc2V0X2lycShpbmRpb19kZXYsIHN0YXRlKTsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fdHJpZ2dlcl9vcHMgYWRpczE2MjAzX3RyaWdnZXJfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5zZXRfdHJpZ2dlcl9zdGF0ZSA9ICZhZGlzMTYyMDNfZGF0YV9yZHlfdHJpZ2dlcl9zZXRfc3RhdGUsCit9OworCiBpbnQgYWRpczE2MjAzX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKIAlpbnQgcmV0OwpAQCAtNDQsOSArNDMsOCBAQAogCQlnb3RvIGVycm9yX2ZyZWVfdHJpZzsKIAogCXN0LT50cmlnLT5kZXYucGFyZW50ID0gJnN0LT51cy0+ZGV2OwotCXN0LT50cmlnLT5vd25lciA9IFRISVNfTU9EVUxFOworCXN0LT50cmlnLT5vcHMgPSAmYWRpczE2MjAzX3RyaWdnZXJfb3BzOwogCXN0LT50cmlnLT5wcml2YXRlX2RhdGEgPSBpbmRpb19kZXY7Ci0Jc3QtPnRyaWctPnNldF90cmlnZ2VyX3N0YXRlID0gJmFkaXMxNjIwM19kYXRhX3JkeV90cmlnZ2VyX3NldF9zdGF0ZTsKIAlyZXQgPSBpaW9fdHJpZ2dlcl9yZWdpc3RlcihzdC0+dHJpZyk7CiAKIAkvKiBzZWxlY3QgZGVmYXVsdCB0cmlnZ2VyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDQuaAppbmRleCAzYmIwNDkwLi43Y2Y0ZTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0LmgKQEAgLTkwLDcgKzkwLDcgQEAKIAlBRElTMTYyMDRfU0NBTl9URU1QLAogfTsKIAotI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKKyNpZmRlZiBDT05GSUdfSUlPX0JVRkZFUgogdm9pZCBhZGlzMTYyMDRfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiBpbnQgYWRpczE2MjA0X3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiAKQEAgLTEwMSw3ICsxMDEsNyBAQAogaW50IGFkaXMxNjIwNF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIHZvaWQgYWRpczE2MjA0X3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiAKLSNlbHNlIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKyNlbHNlIC8qIENPTkZJR19JSU9fQlVGRkVSICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYyMDRfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKQEAgLTEyOSw1ICsxMjksNSBAQAogewogfQogCi0jZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2VuZGlmIC8qIENPTkZJR19JSU9fQlVGRkVSICovCiAjZW5kaWYgLyogU1BJX0FESVMxNjIwNF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfY29yZS5jCmluZGV4IDNlMmI2MjYuLjY0NGFjOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0X2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNF9jb3JlLmMKQEAgLTgsNyArOCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpAQCAtMTcsMTIgKzE2LDExIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vc3lzZnMuaCIKLSNpbmNsdWRlICIuLi9yaW5nX2dlbmVyaWMuaCIKLSNpbmNsdWRlICJhY2NlbC5oIgotI2luY2x1ZGUgIi4uL2FkYy9hZGMuaCIKKyNpbmNsdWRlICIuLi9idWZmZXJfZ2VuZXJpYy5oIgogCiAjaW5jbHVkZSAiYWRpczE2MjA0LmgiCiAKQEAgLTI5OSwxNSArMjk3LDE4IEBACiBlcnJfcmV0OgogCXJldHVybiByZXQ7CiB9CisKKy8qIFVuaXF1ZSB0byB0aGlzIGRyaXZlciBjdXJyZW50bHkgKi8KKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0FDQ0VMX1hZKF9zaG93LCBfYWRkcikJCQlcCisJSUlPX0RFVklDRV9BVFRSKGluX2FjY2VsX3h5LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCisjZGVmaW5lIElJT19ERVZfQVRUUl9BQ0NFTF9YWVBFQUsoX3Nob3csIF9hZGRyKQkJXAorCUlJT19ERVZJQ0VfQVRUUihpbl9hY2NlbF94eXBlYWssIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKKwogc3RhdGljIElJT19ERVZfQVRUUl9BQ0NFTF9YWShhZGlzMTYyMDRfcmVhZF8xNGJpdF9zaWduZWQsCiAJCUFESVMxNjIwNF9YWV9SU1NfT1VUKTsKLXN0YXRpYyBJSU9fREVWX0FUVFJfQUNDRUxfWFBFQUsoYWRpczE2MjA0X3JlYWRfMTRiaXRfc2lnbmVkLAotCQlBRElTMTYyMDRfWF9QRUFLX09VVCk7Ci1zdGF0aWMgSUlPX0RFVl9BVFRSX0FDQ0VMX1lQRUFLKGFkaXMxNjIwNF9yZWFkXzE0Yml0X3NpZ25lZCwKLQkJQURJUzE2MjA0X1lfUEVBS19PVVQpOwogc3RhdGljIElJT19ERVZfQVRUUl9BQ0NFTF9YWVBFQUsoYWRpczE2MjA0X3JlYWRfMTRiaXRfc2lnbmVkLAogCQlBRElTMTYyMDRfWFlfUEVBS19PVVQpOwotc3RhdGljIElJT19DT05TVF9BVFRSKGFjY2VsX3h5X3NjYWxlLCAiMC4wMTcxMjUiKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihpbl9hY2NlbF94eV9zY2FsZSwgIjAuMDE3MTI1Iik7CiAKIHN0YXRpYyBJSU9fREVWSUNFX0FUVFIocmVzZXQsIFNfSVdVU1IsIE5VTEwsIGFkaXMxNjIwNF93cml0ZV9yZXNldCwgMCk7CiAKQEAgLTMxOSwxMyArMzIwLDE2IEBACiAJYWNjZWxfeSwKIH07CiAKLXN0YXRpYyB1OCBhZGlzMTYyMDRfYWRkcmVzc2VzWzVdWzJdID0geworc3RhdGljIHU4IGFkaXMxNjIwNF9hZGRyZXNzZXNbNV1bM10gPSB7CiAJW2luX3N1cHBseV0gPSB7IEFESVMxNjIwNF9TVVBQTFlfT1VUIH0sCiAJW2luX2F1eF0gPSB7IEFESVMxNjIwNF9BVVhfQURDIH0sCiAJW3RlbXBdID0geyBBRElTMTYyMDRfVEVNUF9PVVQgfSwKLQlbYWNjZWxfeF0gPSB7IEFESVMxNjIwNF9YQUNDTF9PVVQsIEFESVMxNjIwNF9YQUNDTF9OVUxMIH0sCi0JW2FjY2VsX3ldID0geyBBRElTMTYyMDRfWEFDQ0xfT1VULCBBRElTMTYyMDRfWUFDQ0xfTlVMTCB9LAorCVthY2NlbF94XSA9IHsgQURJUzE2MjA0X1hBQ0NMX09VVCwgQURJUzE2MjA0X1hBQ0NMX05VTEwsCisJCSAgICAgIEFESVMxNjIwNF9YX1BFQUtfT1VUIH0sCisJW2FjY2VsX3ldID0geyBBRElTMTYyMDRfWEFDQ0xfT1VULCBBRElTMTYyMDRfWUFDQ0xfTlVMTCwKKwkJICAgICAgQURJUzE2MjA0X1lfUEVBS19PVVQgfSwKIH07CisKIHN0YXRpYyBpbnQgYWRpczE2MjA0X3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCiAJCQkgICAgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKIAkJCSAgICAgIGludCAqdmFsLCBpbnQgKnZhbDIsCkBAIC0zMzUsNiArMzM5LDcgQEAKIAlpbnQgYml0czsKIAl1OCBhZGRyOwogCXMxNiB2YWwxNjsKKwlpbnQgYWRkcmluZDsKIAogCXN3aXRjaCAobWFzaykgewogCWNhc2UgMDoKQEAgLTM2Myw3ICszNjgsNyBAQAogCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CiAJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKToKIAkJc3dpdGNoIChjaGFuLT50eXBlKSB7Ci0JCWNhc2UgSUlPX0lOOgorCQljYXNlIElJT19WT0xUQUdFOgogCQkJKnZhbCA9IDA7CiAJCQlpZiAoY2hhbi0+Y2hhbm5lbCA9PSAwKQogCQkJCSp2YWwyID0gMTIyMDsKQEAgLTM4OSwxNSArMzk0LDE2IEBACiAJCSp2YWwgPSAyNTsKIAkJcmV0dXJuIElJT19WQUxfSU5UOwogCWNhc2UgKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQkJJQVNfU0VQQVJBVEUpOgotCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKLQkJY2FzZSBJSU9fQUNDRUw6CisJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1BFQUtfU0VQQVJBVEUpOgorCQlpZiAobWFzayA9PSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSkpIHsKIAkJCWJpdHMgPSAxMjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX07CisJCQlhZGRyaW5kID0gMTsKKwkJfSBlbHNlIHsgLyogUEVBS19TRVBBUkFURSAqLworCQkJYml0cyA9IDE0OworCQkJYWRkcmluZCA9IDI7CisJCX0KIAkJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7Ci0JCWFkZHIgPSBhZGlzMTYyMDRfYWRkcmVzc2VzW2NoYW4tPmFkZHJlc3NdWzFdOworCQlhZGRyID0gYWRpczE2MjA0X2FkZHJlc3Nlc1tjaGFuLT5hZGRyZXNzXVthZGRyaW5kXTsKIAkJcmV0ID0gYWRpczE2MjA0X3NwaV9yZWFkX3JlZ18xNihpbmRpb19kZXYsIGFkZHIsICZ2YWwxNik7CiAJCWlmIChyZXQpIHsKIAkJCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CkBAIC00MzgsMTEgKzQ0NCwxMSBAQAogfQogCiBzdGF0aWMgc3RydWN0IGlpb19jaGFuX3NwZWMgYWRpczE2MjA0X2NoYW5uZWxzW10gPSB7Ci0JSUlPX0NIQU4oSUlPX0lOLCAwLCAwLCAwLCAic3VwcGx5IiwgMCwgMCwKKwlJSU9fQ0hBTihJSU9fVk9MVEFHRSwgMCwgMCwgMCwgInN1cHBseSIsIDAsIDAsCiAJCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwKIAkJIGluX3N1cHBseSwgQURJUzE2MjA0X1NDQU5fU1VQUExZLAogCQkgSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAxLCAwLAorCUlJT19DSEFOKElJT19WT0xUQUdFLCAwLCAxLCAwLCBOVUxMLCAxLCAwLAogCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TRVBBUkFURSksCiAJCSBpbl9hdXgsIEFESVMxNjIwNF9TQ0FOX0FVWF9BREMsCiAJCSBJSU9fU1QoJ3UnLCAxMiwgMTYsIDApLCAwKSwKQEAgLTQ1MywyMyArNDU5LDI0IEBACiAJCSBJSU9fU1QoJ3UnLCAxMiwgMTYsIDApLCAwKSwKIAlJSU9fQ0hBTihJSU9fQUNDRUwsIDEsIDAsIDAsIE5VTEwsIDAsIElJT19NT0RfWCwKIAkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpIHwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NFUEFSQVRFKSwKKwkJICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NFUEFSQVRFKSB8CisJCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1BFQUtfU0VQQVJBVEUpLAogCQkgYWNjZWxfeCwgQURJUzE2MjA0X1NDQU5fQUNDX1gsCiAJCSBJSU9fU1QoJ3MnLCAxNCwgMTYsIDApLCAwKSwKIAlJSU9fQ0hBTihJSU9fQUNDRUwsIDEsIDAsIDAsIE5VTEwsIDAsIElJT19NT0RfWSwKIAkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpIHwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NFUEFSQVRFKSwKKwkJICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NFUEFSQVRFKSB8CisJCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1BFQUtfU0VQQVJBVEUpLAogCQkgYWNjZWxfeSwgQURJUzE2MjA0X1NDQU5fQUNDX1ksCiAJCSBJSU9fU1QoJ3MnLCAxNCwgMTYsIDApLCAwKSwKIAlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCg1KSwKIH07CisKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYyMDRfYXR0cmlidXRlc1tdID0gewogCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2FjY2VsX3h5LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9hY2NlbF94cGVhay5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfYWNjZWxfeXBlYWsuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2FjY2VsX3h5cGVhay5kZXZfYXR0ci5hdHRyLAotCSZpaW9fY29uc3RfYXR0cl9hY2NlbF94eV9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fYWNjZWxfeHkuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX2FjY2VsX3h5cGVhay5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbl9hY2NlbF94eV9zY2FsZS5kZXZfYXR0ci5hdHRyLAogCU5VTEwKIH07CiAKQEAgLTQ4Niw3ICs0OTMsNyBAQAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhZGlzMTYyMDRfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlpbnQgcmV0LCByZWdkb25lID0gMDsKKwlpbnQgcmV0OwogCXN0cnVjdCBhZGlzMTYyMDRfc3RhdGUgKnN0OwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CiAKQEAgLTUxMywxNCArNTIwLDkgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX2ZyZWVfZGV2OwogCi0JcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKLQlyZWdkb25lID0gMTsKLQotCXJldCA9IGlpb19yaW5nX2J1ZmZlcl9yZWdpc3Rlcl9leChpbmRpb19kZXYtPnJpbmcsIDAsCi0JCQkJCSAgYWRpczE2MjA0X2NoYW5uZWxzLAotCQkJCQkgIEFSUkFZX1NJWkUoYWRpczE2MjA0X2NoYW5uZWxzKSk7CisJcmV0ID0gaWlvX2J1ZmZlcl9yZWdpc3RlcihpbmRpb19kZXYsCisJCQkJICBhZGlzMTYyMDRfY2hhbm5lbHMsCisJCQkJICBBUlJBWV9TSVpFKGFkaXMxNjIwNF9jaGFubmVscykpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7CiAJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKQEAgLTUzNiwxOSArNTM4LDIwIEBACiAJcmV0ID0gYWRpczE2MjA0X2luaXRpYWxfc2V0dXAoaW5kaW9fZGV2KTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCiAJcmV0dXJuIDA7CiAKIGVycm9yX3JlbW92ZV90cmlnZ2VyOgogCWFkaXMxNjIwNF9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOwogZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc6Ci0JaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIGVycm9yX3VucmVnX3JpbmdfZnVuY3M6CiAJYWRpczE2MjA0X3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKIGVycm9yX2ZyZWVfZGV2OgotCWlmIChyZWdkb25lKQotCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKLQllbHNlCi0JCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogZXJyb3JfcmV0OgogCXJldHVybiByZXQ7CiB9CkBAIC01NTcsMTAgKzU2MCwxMSBAQAogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKIAotCWFkaXMxNjIwNF9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOwotCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldi0+cmluZyk7CiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJYWRpczE2MjA0X3JlbW92ZV90cmlnZ2VyKGluZGlvX2Rldik7CisJaWlvX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldik7CiAJYWRpczE2MjA0X3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfcmluZy5jCmluZGV4IDg1MmRmMDYuLjA4NTUxYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0X3JpbmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNF9yaW5nLmMKQEAgLTEsMjAgKzEsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCi0jaW5jbHVkZSAiLi4vc3lzZnMuaCIKICNpbmNsdWRlICIuLi9yaW5nX3N3LmgiCi0jaW5jbHVkZSAiYWNjZWwuaCIKLSNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCisjaW5jbHVkZSAiLi4vdHJpZ2dlcl9jb25zdW1lci5oIgogI2luY2x1ZGUgImFkaXMxNjIwNC5oIgogCiAvKioKQEAgLTY1LDkgKzU3LDkgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBhZGlzMTYyMDRfdHJpZ2dlcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnApCiB7CiAJc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmID0gcDsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPmluZGlvX2RldjsKIAlzdHJ1Y3QgYWRpczE2MjA0X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0Jc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+cmluZzsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+YnVmZmVyOwogCWludCBpID0gMDsKIAlzMTYgKmRhdGE7CiAJc2l6ZV90IGRhdGFzaXplID0gcmluZy0+YWNjZXNzLT5nZXRfYnl0ZXNfcGVyX2RhdHVtKHJpbmcpOwpAQCAtOTksMjYgKzkxLDI2IEBACiB2b2lkIGFkaXMxNjIwNF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJaWlvX2RlYWxsb2NfcG9sbGZ1bmMoaW5kaW9fZGV2LT5wb2xsZnVuYyk7Ci0JaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPmJ1ZmZlcik7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX3Jpbmdfc2V0dXBfb3BzIGFkaXMxNjIwNF9yaW5nX3NldHVwX29wcyA9IHsKLQkucHJlZW5hYmxlID0gJmlpb19zd19yaW5nX3ByZWVuYWJsZSwKLQkucG9zdGVuYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcG9zdGVuYWJsZSwKLQkucHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcHJlZGlzYWJsZSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMgYWRpczE2MjA0X3Jpbmdfc2V0dXBfb3BzID0geworCS5wcmVlbmFibGUgPSAmaWlvX3N3X2J1ZmZlcl9wcmVlbmFibGUsCisJLnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZSwKKwkucHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNhYmxlLAogfTsKIAogaW50IGFkaXMxNjIwNF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCWludCByZXQgPSAwOwotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmc7CisJc3RydWN0IGlpb19idWZmZXIgKnJpbmc7CiAKIAlyaW5nID0gaWlvX3N3X3JiX2FsbG9jYXRlKGluZGlvX2Rldik7CiAJaWYgKCFyaW5nKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCXJldHVybiByZXQ7CiAJfQotCWluZGlvX2Rldi0+cmluZyA9IHJpbmc7CisJaW5kaW9fZGV2LT5idWZmZXIgPSByaW5nOwogCS8qIEVmZmVjdGl2ZWx5IHNlbGVjdCB0aGUgcmluZyBidWZmZXIgaW1wbGVtZW50YXRpb24gKi8KIAlyaW5nLT5hY2Nlc3MgPSAmcmluZ19zd19hY2Nlc3NfZnVuY3M7CiAJcmluZy0+YnBlID0gMjsKQEAgLTEyNiwxMyArMTE4LDYgQEAKIAlyaW5nLT5zZXR1cF9vcHMgPSAmYWRpczE2MjA0X3Jpbmdfc2V0dXBfb3BzOwogCXJpbmctPm93bmVyID0gVEhJU19NT0RVTEU7CiAKLQkvKiBTZXQgZGVmYXVsdCBzY2FuIG1vZGUgKi8KLQlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBBRElTMTYyMDRfU0NBTl9TVVBQTFkpOwotCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIEFESVMxNjIwNF9TQ0FOX0FDQ19YKTsKLQlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBBRElTMTYyMDRfU0NBTl9BQ0NfWSk7Ci0JaWlvX3NjYW5fbWFza19zZXQocmluZywgQURJUzE2MjA0X1NDQU5fQVVYX0FEQyk7Ci0JaWlvX3NjYW5fbWFza19zZXQocmluZywgQURJUzE2MjA0X1NDQU5fVEVNUCk7Ci0KIAlpbmRpb19kZXYtPnBvbGxmdW5jID0gaWlvX2FsbG9jX3BvbGxmdW5jKCZpaW9fcG9sbGZ1bmNfc3RvcmVfdGltZSwKIAkJCQkJCSAmYWRpczE2MjA0X3RyaWdnZXJfaGFuZGxlciwKIAkJCQkJCSBJUlFGX09ORVNIT1QsCkBAIC0xNDUsMTAgKzEzMCwxMCBAQAogCQlnb3RvIGVycm9yX2lpb19zd19yYl9mcmVlOwogCX0KIAotCWluZGlvX2Rldi0+bW9kZXMgfD0gSU5ESU9fUklOR19UUklHR0VSRUQ7CisJaW5kaW9fZGV2LT5tb2RlcyB8PSBJTkRJT19CVUZGRVJfVFJJR0dFUkVEOwogCXJldHVybiAwOwogCiBlcnJvcl9paW9fc3dfcmJfZnJlZToKLQlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPnJpbmcpOworCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+YnVmZmVyKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfdHJpZ2dlci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfdHJpZ2dlci5jCmluZGV4IDAxZjczYjkuLjU1YjY2MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0X3RyaWdnZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNF90cmlnZ2VyLmMKQEAgLTEsMTQgKzEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCi0jaW5jbHVkZSAiLi4vc3lzZnMuaCIKICNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCiAjaW5jbHVkZSAiYWRpczE2MjA0LmgiCiAKQEAgLTI0LDYgKzE4LDExIEBACiAJcmV0dXJuIGFkaXMxNjIwNF9zZXRfaXJxKGluZGlvX2Rldiwgc3RhdGUpOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb190cmlnZ2VyX29wcyBhZGlzMTYyMDRfdHJpZ2dlcl9vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnNldF90cmlnZ2VyX3N0YXRlID0gJmFkaXMxNjIwNF9kYXRhX3JkeV90cmlnZ2VyX3NldF9zdGF0ZSwKK307CisKIGludCBhZGlzMTYyMDRfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCWludCByZXQ7CkBAIC00NCw5ICs0Myw4IEBACiAJCWdvdG8gZXJyb3JfZnJlZV90cmlnOwogCiAJc3QtPnRyaWctPmRldi5wYXJlbnQgPSAmc3QtPnVzLT5kZXY7Ci0Jc3QtPnRyaWctPm93bmVyID0gVEhJU19NT0RVTEU7CisJc3QtPnRyaWctPm9wcyA9ICZhZGlzMTYyMDRfdHJpZ2dlcl9vcHM7CiAJc3QtPnRyaWctPnByaXZhdGVfZGF0YSA9IGluZGlvX2RldjsKLQlzdC0+dHJpZy0+c2V0X3RyaWdnZXJfc3RhdGUgPSAmYWRpczE2MjA0X2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlOwogCXJldCA9IGlpb190cmlnZ2VyX3JlZ2lzdGVyKHN0LT50cmlnKTsKIAogCS8qIHNlbGVjdCBkZWZhdWx0IHRyaWdnZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOS5oCmluZGV4IGM4YjdiMDAuLjNjODhiODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDkuaApAQCAtMTI4LDcgKzEyOCw3IEBACiAjZGVmaW5lIEFESVMxNjIwOV9TQ0FOX0lOQ0xJX1kJNgogI2RlZmluZSBBRElTMTYyMDlfU0NBTl9ST1QJNwogCi0jaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgorI2lmZGVmIENPTkZJR19JSU9fQlVGRkVSCiAKIHZvaWQgYWRpczE2MjA5X3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogaW50IGFkaXMxNjIwOV9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwpAQCAtMTQwLDcgKzE0MCw3IEBACiBpbnQgYWRpczE2MjA5X2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogdm9pZCBhZGlzMTYyMDlfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIAotI2Vsc2UgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2Vsc2UgLyogQ09ORklHX0lJT19CVUZGRVIgKi8KIAogc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjIwOV9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewpAQCAtMTY4LDUgKzE2OCw1IEBACiB7CiB9CiAKLSNlbmRpZiAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisjZW5kaWYgLyogQ09ORklHX0lJT19CVUZGRVIgKi8KICNlbmRpZiAvKiBTUElfQURJUzE2MjA5X0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOV9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOV9jb3JlLmMKaW5kZXggYmVjMWZhOC4uMGE4NTcxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDlfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5X2NvcmUuYwpAQCAtMTQsMTMgKzE0LDExIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vc3lzZnMuaCIKLSNpbmNsdWRlICIuLi9yaW5nX2dlbmVyaWMuaCIKLSNpbmNsdWRlICJhY2NlbC5oIgotI2luY2x1ZGUgImluY2xpbm9tZXRlci5oIgotI2luY2x1ZGUgIi4uL2FkYy9hZGMuaCIKKyNpbmNsdWRlICIuLi9idWZmZXJfZ2VuZXJpYy5oIgogCiAjaW5jbHVkZSAiYWRpczE2MjA5LmgiCiAKQEAgLTM2MCw3ICszNTgsNyBAQAogCWNhc2UgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TRVBBUkFURSk6CiAJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCk6CiAJCXN3aXRjaCAoY2hhbi0+dHlwZSkgewotCQljYXNlIElJT19JTjoKKwkJY2FzZSBJSU9fVk9MVEFHRToKIAkJCSp2YWwgPSAwOwogCQkJaWYgKGNoYW4tPmNoYW5uZWwgPT0gMCkKIAkJCQkqdmFsMiA9IDMwNTE4MDsKQEAgLTQxMSw3ICs0MDksNyBAQAogfQogCiBzdGF0aWMgc3RydWN0IGlpb19jaGFuX3NwZWMgYWRpczE2MjA5X2NoYW5uZWxzW10gPSB7Ci0JSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAwLCAwLAorCUlJT19DSEFOKElJT19WT0xUQUdFLCAwLCAxLCAwLCBOVUxMLCAwLCAwLAogCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TRVBBUkFURSksCiAJCSBpbl9zdXBwbHksIEFESVMxNjIwOV9TQ0FOX1NVUFBMWSwKIAkJIElJT19TVCgndScsIDE0LCAxNiwgMCksIDApLApAQCAtNDMwLDE1ICs0MjgsMTUgQEAKIAkJICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NFUEFSQVRFKSwKIAkJIGFjY2VsX3ksIEFESVMxNjIwOV9TQ0FOX0FDQ19ZLAogCQkgSUlPX1NUKCdzJywgMTQsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAxLCAwLAorCUlJT19DSEFOKElJT19WT0xUQUdFLCAwLCAxLCAwLCBOVUxMLCAxLCAwLAogCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TRVBBUkFURSksCiAJCSBpbl9hdXgsIEFESVMxNjIwOV9TQ0FOX0FVWF9BREMsCiAJCSBJSU9fU1QoJ3UnLCAxMiwgMTYsIDApLCAwKSwKLQlJSU9fQ0hBTihJSU9fSU5DTEksIDAsIDEsIDAsIE5VTEwsIDAsIElJT19NT0RfWCwKKwlJSU9fQ0hBTihJSU9fSU5DTEksIDEsIDAsIDAsIE5VTEwsIDAsIElJT19NT0RfWCwKIAkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKIAkJIGluY2xpX3gsIEFESVMxNjIwOV9TQ0FOX0lOQ0xJX1gsCiAJCSBJSU9fU1QoJ3MnLCAxNCwgMTYsIDApLCAwKSwKLQlJSU9fQ0hBTihJSU9fSU5DTEksIDAsIDEsIDAsIE5VTEwsIDAsIElJT19NT0RfWSwKKwlJSU9fQ0hBTihJSU9fSU5DTEksIDEsIDAsIDAsIE5VTEwsIDAsIElJT19NT0RfWSwKIAkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKIAkJIGluY2xpX3ksIEFESVMxNjIwOV9TQ0FOX0lOQ0xJX1ksCiAJCSBJSU9fU1QoJ3MnLCAxNCwgMTYsIDApLCAwKSwKQEAgLTQ2OSw3ICs0NjcsNyBAQAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhZGlzMTYyMDlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlpbnQgcmV0LCByZWdkb25lID0gMDsKKwlpbnQgcmV0OwogCXN0cnVjdCBhZGlzMTYyMDlfc3RhdGUgKnN0OwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CiAKQEAgLTQ5NiwxNCArNDk0LDkgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX2ZyZWVfZGV2OwogCi0JcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKLQlyZWdkb25lID0gMTsKLQotCXJldCA9IGlpb19yaW5nX2J1ZmZlcl9yZWdpc3Rlcl9leChpbmRpb19kZXYtPnJpbmcsIDAsCi0JCQkJCSAgYWRpczE2MjA5X2NoYW5uZWxzLAotCQkJCQkgIEFSUkFZX1NJWkUoYWRpczE2MjA5X2NoYW5uZWxzKSk7CisJcmV0ID0gaWlvX2J1ZmZlcl9yZWdpc3RlcihpbmRpb19kZXYsCisJCQkJICBhZGlzMTYyMDlfY2hhbm5lbHMsCisJCQkJICBBUlJBWV9TSVpFKGFkaXMxNjIwOV9jaGFubmVscykpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7CiAJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKQEAgLTUxOSwxOSArNTEyLDIwIEBACiAJcmV0ID0gYWRpczE2MjA5X2luaXRpYWxfc2V0dXAoaW5kaW9fZGV2KTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCiAJcmV0dXJuIDA7CiAKIGVycm9yX3JlbW92ZV90cmlnZ2VyOgogCWFkaXMxNjIwOV9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOwogZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc6Ci0JaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIGVycm9yX3VucmVnX3JpbmdfZnVuY3M6CiAJYWRpczE2MjA5X3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKIGVycm9yX2ZyZWVfZGV2OgotCWlmIChyZWdkb25lKQotCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKLQllbHNlCi0JCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogZXJyb3JfcmV0OgogCXJldHVybiByZXQ7CiB9CkBAIC01NDIsMTAgKzUzNiwxMSBAQAogCiAJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAotCWFkaXMxNjIwOV9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOwotCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldi0+cmluZyk7CiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJYWRpczE2MjA5X3JlbW92ZV90cmlnZ2VyKGluZGlvX2Rldik7CisJaWlvX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldik7CiAJYWRpczE2MjA5X3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDlfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDlfcmluZy5jCmluZGV4IDQ1MDE3ZDMuLmJiNjYzNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5X3JpbmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOV9yaW5nLmMKQEAgLTEsMjAgKzEsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCi0jaW5jbHVkZSAiLi4vc3lzZnMuaCIKICNpbmNsdWRlICIuLi9yaW5nX3N3LmgiCi0jaW5jbHVkZSAiYWNjZWwuaCIKLSNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCisjaW5jbHVkZSAiLi4vdHJpZ2dlcl9jb25zdW1lci5oIgogI2luY2x1ZGUgImFkaXMxNjIwOS5oIgogCiAvKioKQEAgLTY1LDkgKzU3LDkgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBhZGlzMTYyMDlfdHJpZ2dlcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnApCiB7CiAJc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmID0gcDsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPmluZGlvX2RldjsKIAlzdHJ1Y3QgYWRpczE2MjA5X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0Jc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+cmluZzsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+YnVmZmVyOwogCiAJaW50IGkgPSAwOwogCXMxNiAqZGF0YTsKQEAgLTk5LDI2ICs5MSwyNiBAQAogdm9pZCBhZGlzMTYyMDlfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCWlpb19kZWFsbG9jX3BvbGxmdW5jKGluZGlvX2Rldi0+cG9sbGZ1bmMpOwotCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7CisJaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5idWZmZXIpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGlpb19yaW5nX3NldHVwX29wcyBhZGlzMTYyMDlfcmluZ19zZXR1cF9vcHMgPSB7Ci0JLnByZWVuYWJsZSA9ICZpaW9fc3dfcmluZ19wcmVlbmFibGUsCi0JLnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3Bvc3RlbmFibGUsCi0JLnByZWRpc2FibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3ByZWRpc2FibGUsCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19idWZmZXJfc2V0dXBfb3BzIGFkaXMxNjIwOV9yaW5nX3NldHVwX29wcyA9IHsKKwkucHJlZW5hYmxlID0gJmlpb19zd19idWZmZXJfcHJlZW5hYmxlLAorCS5wb3N0ZW5hYmxlID0gJmlpb190cmlnZ2VyZWRfYnVmZmVyX3Bvc3RlbmFibGUsCisJLnByZWRpc2FibGUgPSAmaWlvX3RyaWdnZXJlZF9idWZmZXJfcHJlZGlzYWJsZSwKIH07CiAKIGludCBhZGlzMTYyMDlfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKIAlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nOworCXN0cnVjdCBpaW9fYnVmZmVyICpyaW5nOwogCiAJcmluZyA9IGlpb19zd19yYl9hbGxvY2F0ZShpbmRpb19kZXYpOwogCWlmICghcmluZykgewogCQlyZXQgPSAtRU5PTUVNOwogCQlyZXR1cm4gcmV0OwogCX0KLQlpbmRpb19kZXYtPnJpbmcgPSByaW5nOworCWluZGlvX2Rldi0+YnVmZmVyID0gcmluZzsKIAkvKiBFZmZlY3RpdmVseSBzZWxlY3QgdGhlIHJpbmcgYnVmZmVyIGltcGxlbWVudGF0aW9uICovCiAJcmluZy0+YWNjZXNzID0gJnJpbmdfc3dfYWNjZXNzX2Z1bmNzOwogCXJpbmctPmJwZSA9IDI7CkBAIC0xMjYsMTYgKzExOCw2IEBACiAJcmluZy0+c2V0dXBfb3BzID0gJmFkaXMxNjIwOV9yaW5nX3NldHVwX29wczsKIAlyaW5nLT5vd25lciA9IFRISVNfTU9EVUxFOwogCi0JLyogU2V0IGRlZmF1bHQgc2NhbiBtb2RlICovCi0JaWlvX3NjYW5fbWFza19zZXQocmluZywgQURJUzE2MjA5X1NDQU5fU1VQUExZKTsKLQlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBBRElTMTYyMDlfU0NBTl9BQ0NfWCk7Ci0JaWlvX3NjYW5fbWFza19zZXQocmluZywgQURJUzE2MjA5X1NDQU5fQUNDX1kpOwotCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIEFESVMxNjIwOV9TQ0FOX0FVWF9BREMpOwotCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIEFESVMxNjIwOV9TQ0FOX1RFTVApOwotCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIEFESVMxNjIwOV9TQ0FOX0lOQ0xJX1gpOwotCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIEFESVMxNjIwOV9TQ0FOX0lOQ0xJX1kpOwotCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIEFESVMxNjIwOV9TQ0FOX1JPVCk7Ci0KIAlpbmRpb19kZXYtPnBvbGxmdW5jID0gaWlvX2FsbG9jX3BvbGxmdW5jKCZpaW9fcG9sbGZ1bmNfc3RvcmVfdGltZSwKIAkJCQkJCSAmYWRpczE2MjA5X3RyaWdnZXJfaGFuZGxlciwKIAkJCQkJCSBJUlFGX09ORVNIT1QsCkBAIC0xNDgsMTAgKzEzMCwxMCBAQAogCQlnb3RvIGVycm9yX2lpb19zd19yYl9mcmVlOwogCX0KIAotCWluZGlvX2Rldi0+bW9kZXMgfD0gSU5ESU9fUklOR19UUklHR0VSRUQ7CisJaW5kaW9fZGV2LT5tb2RlcyB8PSBJTkRJT19CVUZGRVJfVFJJR0dFUkVEOwogCXJldHVybiAwOwogCiBlcnJvcl9paW9fc3dfcmJfZnJlZToKLQlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPnJpbmcpOworCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+YnVmZmVyKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDlfdHJpZ2dlci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDlfdHJpZ2dlci5jCmluZGV4IDZkZjdiNDcuLjhkZjhhOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5X3RyaWdnZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOV90cmlnZ2VyLmMKQEAgLTEsMTQgKzEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCi0jaW5jbHVkZSAiLi4vc3lzZnMuaCIKICNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCiAjaW5jbHVkZSAiYWRpczE2MjA5LmgiCiAKQEAgLTMzLDYgKzI3LDExIEBACiAJcmV0dXJuIGFkaXMxNjIwOV9zZXRfaXJxKGluZGlvX2Rldiwgc3RhdGUpOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb190cmlnZ2VyX29wcyBhZGlzMTYyMDlfdHJpZ2dlcl9vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnNldF90cmlnZ2VyX3N0YXRlID0gJmFkaXMxNjIwOV9kYXRhX3JkeV90cmlnZ2VyX3NldF9zdGF0ZSwKK307CisKIGludCBhZGlzMTYyMDlfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCWludCByZXQ7CkBAIC01Miw5ICs1MSw4IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9mcmVlX3RyaWc7CiAJc3QtPnRyaWctPmRldi5wYXJlbnQgPSAmc3QtPnVzLT5kZXY7Ci0Jc3QtPnRyaWctPm93bmVyID0gVEhJU19NT0RVTEU7CisJc3QtPnRyaWctPm9wcyA9ICZhZGlzMTYyMDlfdHJpZ2dlcl9vcHM7CiAJc3QtPnRyaWctPnByaXZhdGVfZGF0YSA9IGluZGlvX2RldjsKLQlzdC0+dHJpZy0+c2V0X3RyaWdnZXJfc3RhdGUgPSAmYWRpczE2MjA5X2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlOwogCXJldCA9IGlpb190cmlnZ2VyX3JlZ2lzdGVyKHN0LT50cmlnKTsKIAogCS8qIHNlbGVjdCBkZWZhdWx0IHRyaWdnZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjIwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjIwX2NvcmUuYwppbmRleCBiZjliYTA3Li42ZDQ1MDNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIyMF9jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMjBfY29yZS5jCkBAIC02LDkgKzYsNiBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpAQCAtMTYsMTIgKzEzLDEwIEBACiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCi0jaW5jbHVkZSAiYWNjZWwuaCIKLSNpbmNsdWRlICIuLi9hZGMvYWRjLmgiCiAKICNpbmNsdWRlICJhZGlzMTYyMjAuaCIKIApAQCAtMjksMTYgKzI0LDE1IEBACiAKIC8qKgogICogYWRpczE2MjIwX3NwaV93cml0ZV9yZWdfOCgpIC0gd3JpdGUgc2luZ2xlIGJ5dGUgdG8gYSByZWdpc3RlcgotICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQorICogQGluZGlvX2RldjogaWlvIGRldmljZSBhc3NvY2lhdGVkIHdpdGggY2hpbGQgb2YgYWN0dWFsIGRldmljZQogICogQHJlZ19hZGRyZXNzOiB0aGUgYWRkcmVzcyBvZiB0aGUgcmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgogICogQHZhbDogdGhlIHZhbHVlIHRvIHdyaXRlCiAgKiovCi1zdGF0aWMgaW50IGFkaXMxNjIyMF9zcGlfd3JpdGVfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAorc3RhdGljIGludCBhZGlzMTYyMjBfc3BpX3dyaXRlX3JlZ184KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCiAJCXU4IHJlZ19hZGRyZXNzLAogCQl1OCB2YWwpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGFkaXMxNjIyMF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCiAJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKQEAgLTUzLDE4ICs0NywxNyBAQAogCiAvKioKICAqIGFkaXMxNjIyMF9zcGlfd3JpdGVfcmVnXzE2KCkgLSB3cml0ZSAyIGJ5dGVzIHRvIGEgcGFpciBvZiByZWdpc3RlcnMKLSAqIEBkZXY6IGRldmljZSBhc3NvY2lhdGVkIHdpdGggY2hpbGQgb2YgYWN0dWFsIGRldmljZSAoaWlvX2RldiBvciBpaW9fdHJpZykKKyAqIEBpbmRpb19kZXY6ICBpaW8gZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlCiAgKiBAcmVnX2FkZHJlc3M6IHRoZSBhZGRyZXNzIG9mIHRoZSBsb3dlciBvZiB0aGUgdHdvIHJlZ2lzdGVycy4gU2Vjb25kIHJlZ2lzdGVyCiAgKiAgICAgICAgICAgICAgIGlzIGFzc3VtZWQgdG8gaGF2ZSBhZGRyZXNzIG9uZSBncmVhdGVyLgogICogQHZhbDogdmFsdWUgdG8gYmUgd3JpdHRlbgogICoqLwotc3RhdGljIGludCBhZGlzMTYyMjBfc3BpX3dyaXRlX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IGFkaXMxNjIyMF9zcGlfd3JpdGVfcmVnXzE2KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCiAJCXU4IGxvd2VyX3JlZ19hZGRyZXNzLAogCQl1MTYgdmFsdWUpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOwotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgYWRpczE2MjIwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0gewogCQl7CkBAIC03Nyw3ICs3MCw2IEBACiAJCQkudHhfYnVmID0gc3QtPnR4ICsgMiwKIAkJCS5iaXRzX3Blcl93b3JkID0gOCwKIAkJCS5sZW4gPSAyLAotCQkJLmNzX2NoYW5nZSA9IDEsCiAJCQkuZGVsYXlfdXNlY3MgPSAzNSwKIAkJfSwKIAl9OwpAQCAtOTksMTcgKzkxLDE2IEBACiAKIC8qKgogICogYWRpczE2MjIwX3NwaV9yZWFkX3JlZ18xNigpIC0gcmVhZCAyIGJ5dGVzIGZyb20gYSAxNi1iaXQgcmVnaXN0ZXIKLSAqIEBkZXY6IGRldmljZSBhc3NvY2lhdGVkIHdpdGggY2hpbGQgb2YgYWN0dWFsIGRldmljZSAoaWlvX2RldiBvciBpaW9fdHJpZykKKyAqIEBpbmRpb19kZXY6IGlpbyBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBkZXZpY2UKICAqIEByZWdfYWRkcmVzczogdGhlIGFkZHJlc3Mgb2YgdGhlIGxvd2VyIG9mIHRoZSB0d28gcmVnaXN0ZXJzLiBTZWNvbmQgcmVnaXN0ZXIKICAqICAgICAgICAgICAgICAgaXMgYXNzdW1lZCB0byBoYXZlIGFkZHJlc3Mgb25lIGdyZWF0ZXIuCiAgKiBAdmFsOiBzb21ld2hlcmUgdG8gcGFzcyBiYWNrIHRoZSB2YWx1ZSByZWFkCiAgKiovCi1zdGF0aWMgaW50IGFkaXMxNjIyMF9zcGlfcmVhZF9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAotCQl1OCBsb3dlcl9yZWdfYWRkcmVzcywKLQkJdTE2ICp2YWwpCitzdGF0aWMgaW50IGFkaXMxNjIyMF9zcGlfcmVhZF9yZWdfMTYoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkgICAgIHU4IGxvd2VyX3JlZ19hZGRyZXNzLAorCQkJCSAgICAgdTE2ICp2YWwpCiB7CiAJc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGFkaXMxNjIyMF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCWludCByZXQ7CiAJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0gewpAQCAtMTQ5LDUyICsxNDAsMjMgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3NpemVfdCBhZGlzMTYyMjBfc3BpX3JlYWRfc2lnbmVkKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZiwKLQkJdW5zaWduZWQgYml0cykKLXsKLQlpbnQgcmV0OwotCXMxNiB2YWwgPSAwOwotCXVuc2lnbmVkIHNoaWZ0ID0gMTYgLSBiaXRzOwotCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKLQotCXJldCA9IGFkaXMxNjIyMF9zcGlfcmVhZF9yZWdfMTYoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MsICh1MTYgKikmdmFsKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JdmFsID0gKChzMTYpKHZhbCA8PCBzaGlmdCkgPj4gc2hpZnQpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOwotfQotCi1zdGF0aWMgc3NpemVfdCBhZGlzMTYyMjBfcmVhZF8xMmJpdF91bnNpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCi17Ci0JaW50IHJldDsKLQl1MTYgdmFsID0gMDsKLQlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7Ci0KLQlyZXQgPSBhZGlzMTYyMjBfc3BpX3JlYWRfcmVnXzE2KGRldiwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZhbCAmIDB4MEZGRik7Ci19Ci0KIHN0YXRpYyBzc2l6ZV90IGFkaXMxNjIyMF9yZWFkXzE2Yml0KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCWNoYXIgKmJ1ZikKIHsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXNzaXplX3QgcmV0OworCXMxNiB2YWwgPSAwOwogCiAJLyogVGFrZSB0aGUgaWlvX2RldiBzdGF0dXMgbG9jayAqLwogCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOwotCXJldCA9ICBhZGlzMTYyMjBfc3BpX3JlYWRfc2lnbmVkKGRldiwgYXR0ciwgYnVmLCAxNik7CisJcmV0ID0gYWRpczE2MjIwX3NwaV9yZWFkX3JlZ18xNihpbmRpb19kZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywKKwkJCQkJKHUxNiAqKSZ2YWwpOwogCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7Ci0KLQlyZXR1cm4gcmV0OworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFkaXMxNjIyMF93cml0ZV8xNmJpdChzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC0yMDIsNiArMTY0LDcgQEAKIAkJY29uc3QgY2hhciAqYnVmLAogCQlzaXplX3QgbGVuKQogeworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CiAJaW50IHJldDsKIAlsb25nIHZhbDsKQEAgLTIwOSwzNCArMTcyLDM0IEBACiAJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX3JldDsKLQlyZXQgPSBhZGlzMTYyMjBfc3BpX3dyaXRlX3JlZ18xNihkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKKwlyZXQgPSBhZGlzMTYyMjBfc3BpX3dyaXRlX3JlZ18xNihpbmRpb19kZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKIAogZXJyb3JfcmV0OgogCXJldHVybiByZXQgPyByZXQgOiBsZW47CiB9CiAKLXN0YXRpYyBpbnQgYWRpczE2MjIwX2NhcHR1cmUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBhZGlzMTYyMjBfY2FwdHVyZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCWludCByZXQ7Ci0JcmV0ID0gYWRpczE2MjIwX3NwaV93cml0ZV9yZWdfMTYoZGV2LAorCXJldCA9IGFkaXMxNjIyMF9zcGlfd3JpdGVfcmVnXzE2KGluZGlvX2RldiwKIAkJCUFESVMxNjIyMF9HTE9CX0NNRCwKIAkJCTB4QkYwOCk7IC8qIGluaXRpYXRlcyBhIG1hbnVhbCBkYXRhIGNhcHR1cmUgKi8KIAlpZiAocmV0KQotCQlkZXZfZXJyKGRldiwgInByb2JsZW0gYmVnaW5uaW5nIGNhcHR1cmUiKTsKKwkJZGV2X2VycigmaW5kaW9fZGV2LT5kZXYsICJwcm9ibGVtIGJlZ2lubmluZyBjYXB0dXJlIik7CiAKIAltc2xlZXAoMTApOyAvKiBkZWxheSBmb3IgY2FwdHVyZSB0byBmaW5pc2ggKi8KIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgYWRpczE2MjIwX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgYWRpczE2MjIwX3Jlc2V0KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJaW50IHJldDsKLQlyZXQgPSBhZGlzMTYyMjBfc3BpX3dyaXRlX3JlZ184KGRldiwKKwlyZXQgPSBhZGlzMTYyMjBfc3BpX3dyaXRlX3JlZ184KGluZGlvX2RldiwKIAkJCUFESVMxNjIyMF9HTE9CX0NNRCwKIAkJCUFESVMxNjIyMF9HTE9CX0NNRF9TV19SRVNFVCk7CiAJaWYgKHJldCkKLQkJZGV2X2VycihkZXYsICJwcm9ibGVtIHJlc2V0dGluZyBkZXZpY2UiKTsKKwkJZGV2X2VycigmaW5kaW9fZGV2LT5kZXYsICJwcm9ibGVtIHJlc2V0dGluZyBkZXZpY2UiKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yNDUsNzIgKzIwOCw4NCBAQAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQogewotCWlmIChsZW4gPCAxKQotCQlyZXR1cm4gLTE7Ci0Jc3dpdGNoIChidWZbMF0pIHsKLQljYXNlICcxJzoKLQljYXNlICd5JzoKLQljYXNlICdZJzoKLQkJcmV0dXJuIGFkaXMxNjIyMF9yZXNldChkZXYpID09IDAgPyBsZW4gOiAtRUlPOwotCX0KLQlyZXR1cm4gLTE7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWJvb2wgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJ0b2Jvb2woYnVmLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWlmICghdmFsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IGFkaXMxNjIyMF9yZXNldChpbmRpb19kZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIGxlbjsKIH0KIAogc3RhdGljIHNzaXplX3QgYWRpczE2MjIwX3dyaXRlX2NhcHR1cmUoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQogewotCWlmIChsZW4gPCAxKQotCQlyZXR1cm4gLTE7Ci0Jc3dpdGNoIChidWZbMF0pIHsKLQljYXNlICcxJzoKLQljYXNlICd5JzoKLQljYXNlICdZJzoKLQkJcmV0dXJuIGFkaXMxNjIyMF9jYXB0dXJlKGRldikgPT0gMCA/IGxlbiA6IC1FSU87Ci0JfQotCXJldHVybiAtMTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJYm9vbCB2YWw7CisJaW50IHJldDsKKworCXJldCA9IHN0cnRvYm9vbChidWYsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJaWYgKCF2YWwpCisJCXJldHVybiAtRUlOVkFMOworCXJldCA9IGFkaXMxNjIyMF9jYXB0dXJlKGluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBsZW47CiB9CiAKLXN0YXRpYyBpbnQgYWRpczE2MjIwX2NoZWNrX3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGFkaXMxNjIyMF9jaGVja19zdGF0dXMoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKIAl1MTYgc3RhdHVzOwogCWludCByZXQ7CiAKLQlyZXQgPSBhZGlzMTYyMjBfc3BpX3JlYWRfcmVnXzE2KGRldiwgQURJUzE2MjIwX0RJQUdfU1RBVCwgJnN0YXR1cyk7CisJcmV0ID0gYWRpczE2MjIwX3NwaV9yZWFkX3JlZ18xNihpbmRpb19kZXYsIEFESVMxNjIyMF9ESUFHX1NUQVQsCisJCQkJCSZzdGF0dXMpOwogCiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkZXYsICJSZWFkaW5nIHN0YXR1cyBmYWlsZWRcbiIpOworCQlkZXZfZXJyKCZpbmRpb19kZXYtPmRldiwgIlJlYWRpbmcgc3RhdHVzIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyb3JfcmV0OwogCX0KIAlyZXQgPSBzdGF0dXMgJiAweDdGOwogCiAJaWYgKHN0YXR1cyAmIEFESVMxNjIyMF9ESUFHX1NUQVRfVklPTEFUSU9OKQotCQlkZXZfZXJyKGRldiwgIkNhcHR1cmUgcGVyaW9kIHZpb2xhdGlvbi9pbnRlcnJ1cHRpb25cbiIpOworCQlkZXZfZXJyKCZpbmRpb19kZXYtPmRldiwKKwkJCSJDYXB0dXJlIHBlcmlvZCB2aW9sYXRpb24vaW50ZXJydXB0aW9uXG4iKTsKIAlpZiAoc3RhdHVzICYgQURJUzE2MjIwX0RJQUdfU1RBVF9TUElfRkFJTCkKLQkJZGV2X2VycihkZXYsICJTUEkgZmFpbHVyZVxuIik7CisJCWRldl9lcnIoJmluZGlvX2Rldi0+ZGV2LCAiU1BJIGZhaWx1cmVcbiIpOwogCWlmIChzdGF0dXMgJiBBRElTMTYyMjBfRElBR19TVEFUX0ZMQVNIX1VQVCkKLQkJZGV2X2VycihkZXYsICJGbGFzaCB1cGRhdGUgZmFpbGVkXG4iKTsKKwkJZGV2X2VycigmaW5kaW9fZGV2LT5kZXYsICJGbGFzaCB1cGRhdGUgZmFpbGVkXG4iKTsKIAlpZiAoc3RhdHVzICYgQURJUzE2MjIwX0RJQUdfU1RBVF9QT1dFUl9ISUdIKQotCQlkZXZfZXJyKGRldiwgIlBvd2VyIHN1cHBseSBhYm92ZSAzLjYyNVZcbiIpOworCQlkZXZfZXJyKCZpbmRpb19kZXYtPmRldiwgIlBvd2VyIHN1cHBseSBhYm92ZSAzLjYyNVZcbiIpOwogCWlmIChzdGF0dXMgJiBBRElTMTYyMjBfRElBR19TVEFUX1BPV0VSX0xPVykKLQkJZGV2X2VycihkZXYsICJQb3dlciBzdXBwbHkgYmVsb3cgMy4xNVZcbiIpOworCQlkZXZfZXJyKCZpbmRpb19kZXYtPmRldiwgIlBvd2VyIHN1cHBseSBiZWxvdyAzLjE1VlxuIik7CiAKIGVycm9yX3JldDoKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGFkaXMxNjIyMF9zZWxmX3Rlc3Qoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBhZGlzMTYyMjBfc2VsZl90ZXN0KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJaW50IHJldDsKLQlyZXQgPSBhZGlzMTYyMjBfc3BpX3dyaXRlX3JlZ18xNihkZXYsCisJcmV0ID0gYWRpczE2MjIwX3NwaV93cml0ZV9yZWdfMTYoaW5kaW9fZGV2LAogCQkJQURJUzE2MjIwX01TQ19DVFJMLAogCQkJQURJUzE2MjIwX01TQ19DVFJMX1NFTEZfVEVTVF9FTik7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKGRldiwgInByb2JsZW0gc3RhcnRpbmcgc2VsZiB0ZXN0Iik7CisJCWRldl9lcnIoJmluZGlvX2Rldi0+ZGV2LCAicHJvYmxlbSBzdGFydGluZyBzZWxmIHRlc3QiKTsKIAkJZ290byBlcnJfcmV0OwogCX0KIAotCWFkaXMxNjIyMF9jaGVja19zdGF0dXMoZGV2KTsKKwlhZGlzMTYyMjBfY2hlY2tfc3RhdHVzKGluZGlvX2Rldik7CiAKIGVycl9yZXQ6CiAJcmV0dXJuIHJldDsKQEAgLTMxOSwyNCArMjk0LDIzIEBACiBzdGF0aWMgaW50IGFkaXMxNjIyMF9pbml0aWFsX3NldHVwKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaW5kaW9fZGV2LT5kZXY7CiAKIAkvKiBEbyBzZWxmIHRlc3QgKi8KLQlyZXQgPSBhZGlzMTYyMjBfc2VsZl90ZXN0KGRldik7CisJcmV0ID0gYWRpczE2MjIwX3NlbGZfdGVzdChpbmRpb19kZXYpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycihkZXYsICJzZWxmIHRlc3QgZmFpbHVyZSIpOworCQlkZXZfZXJyKCZpbmRpb19kZXYtPmRldiwgInNlbGYgdGVzdCBmYWlsdXJlIik7CiAJCWdvdG8gZXJyX3JldDsKIAl9CiAKIAkvKiBSZWFkIHN0YXR1cyByZWdpc3RlciB0byBjaGVjayB0aGUgcmVzdWx0ICovCi0JcmV0ID0gYWRpczE2MjIwX2NoZWNrX3N0YXR1cyhkZXYpOworCXJldCA9IGFkaXMxNjIyMF9jaGVja19zdGF0dXMoaW5kaW9fZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWFkaXMxNjIyMF9yZXNldChkZXYpOwotCQlkZXZfZXJyKGRldiwgImRldmljZSBub3QgcGxheWluZyBiYWxsIC0+IHJlc2V0Iik7CisJCWFkaXMxNjIyMF9yZXNldChpbmRpb19kZXYpOworCQlkZXZfZXJyKCZpbmRpb19kZXYtPmRldiwgImRldmljZSBub3QgcGxheWluZyBiYWxsIC0+IHJlc2V0Iik7CiAJCW1zbGVlcChBRElTMTYyMjBfU1RBUlRVUF9ERUxBWSk7Ci0JCXJldCA9IGFkaXMxNjIyMF9jaGVja19zdGF0dXMoZGV2KTsKKwkJcmV0ID0gYWRpczE2MjIwX2NoZWNrX3N0YXR1cyhpbmRpb19kZXYpOwogCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGRldiwgImdpdmluZyB1cCIpOworCQkJZGV2X2VycigmaW5kaW9fZGV2LT5kZXYsICJnaXZpbmcgdXAiKTsKIAkJCWdvdG8gZXJyX3JldDsKIAkJfQogCX0KQEAgLTM4MSw3ICszNTUsNyBAQAogCQljb3VudCA9IEFESVMxNjIyMF9DQVBUVVJFX1NJWkUgLSBvZmY7CiAKIAkvKiB3cml0ZSB0aGUgYmVnaW4gcG9zaXRpb24gb2YgY2FwdHVyZSBidWZmZXIgKi8KLQlyZXQgPSBhZGlzMTYyMjBfc3BpX3dyaXRlX3JlZ18xNigmaW5kaW9fZGV2LT5kZXYsCisJcmV0ID0gYWRpczE2MjIwX3NwaV93cml0ZV9yZWdfMTYoaW5kaW9fZGV2LAogCQkJCQlBRElTMTYyMjBfQ0FQVF9QTlRSLAogCQkJCQlvZmYgPiAxKTsKIAlpZiAocmV0KQpAQCAtNDgwLDI0ICs0NTQsNiBAQAogCS5zaXplID0gQURJUzE2MjIwX0NBUFRVUkVfU0laRSwKIH07CiAKLXN0YXRpYyBJSU9fREVWX0FUVFJfSU5fTkFNRURfUkFXKDAsIHN1cHBseSwgYWRpczE2MjIwX3JlYWRfMTJiaXRfdW5zaWduZWQsCi0JCUFESVMxNjIyMF9DQVBUX1NVUFBMWSk7Ci1zdGF0aWMgSUlPX0NPTlNUX0FUVFJfSU5fTkFNRURfU0NBTEUoMCwgc3VwcGx5LCAiMC4wMDEyMjA3Iik7Ci1zdGF0aWMgSUlPX0RFVl9BVFRSX0FDQ0VMKGFkaXMxNjIyMF9yZWFkXzE2Yml0LCBBRElTMTYyMjBfQ0FQVF9CVUZBKTsKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIoYWNjZWxfcGVha19yYXcsIFNfSVJVR08sIGFkaXMxNjIyMF9yZWFkXzE2Yml0LAotCQlOVUxMLCBBRElTMTYyMjBfQ0FQVF9QRUFLQSk7Ci1zdGF0aWMgSUlPX0RFVl9BVFRSX0FDQ0VMX09GRlNFVChTX0lXVVNSIHwgU19JUlVHTywKLQkJYWRpczE2MjIwX3JlYWRfMTZiaXQsCi0JCWFkaXMxNjIyMF93cml0ZV8xNmJpdCwKLQkJQURJUzE2MjIwX0FDQ0xfTlVMTCk7Ci1zdGF0aWMgSUlPX0NPTlNUX0FUVFJfQUNDRUxfU0NBTEUoIjAuMTg3MDQyMjM1NDUiKTsKLXN0YXRpYyBJSU9fREVWX0FUVFJfVEVNUF9SQVcoYWRpczE2MjIwX3JlYWRfMTJiaXRfdW5zaWduZWQpOwotc3RhdGljIElJT19DT05TVF9BVFRSX1RFTVBfT0ZGU0VUKCIyNSIpOwotc3RhdGljIElJT19DT05TVF9BVFRSX1RFTVBfU0NBTEUoIi0wLjQ3Iik7Ci0KLXN0YXRpYyBJSU9fREVWX0FUVFJfSU5fUkFXKDEsIGFkaXMxNjIyMF9yZWFkXzE2Yml0LCBBRElTMTYyMjBfQ0FQVF9CVUYxKTsKLXN0YXRpYyBJSU9fREVWX0FUVFJfSU5fUkFXKDIsIGFkaXMxNjIyMF9yZWFkXzE2Yml0LCBBRElTMTYyMjBfQ0FQVF9CVUYyKTsKLQogc3RhdGljIElJT19ERVZJQ0VfQVRUUihyZXNldCwgU19JV1VTUiwgTlVMTCwKIAkJYWRpczE2MjIwX3dyaXRlX3Jlc2V0LCAwKTsKIApAQCAtNTE0LDIxICs0NzAsMTQyIEBACiAJCWFkaXMxNjIyMF93cml0ZV8xNmJpdCwKIAkJQURJUzE2MjIwX0NBUFRfUE5UUik7CiAKLXN0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQU1QX0ZSRVFfQVZBSUwoIjEwMDIwMCIpOworZW51bSBhZGlzMTYyMjBfY2hhbm5lbCB7CisJaW5fc3VwcGx5LCBpbl8xLCBpbl8yLCBhY2NlbCwgdGVtcAorfTsKKworc3RydWN0IGFkaXMxNjIyMF9hZGRyZXNzX3NwZWMgeworCXU4IGFkZHI7CisJdTggYml0czsKKwlib29sIHNpZ247Cit9OworCisvKiBBZGRyZXNzIC8gYml0cyAvIHNpZ25lZCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBhZGlzMTYyMjBfYWRkcmVzc19zcGVjIGFkaXMxNjIyMF9hZGRyZXNzZXNbXVszXSA9IHsKKwlbaW5fc3VwcGx5XSA9CXsgeyBBRElTMTYyMjBfQ0FQVF9TVVBQTFksCTEyLCAwIH0sIH0sCisJW2luXzFdID0JeyB7IEFESVMxNjIyMF9DQVBUX0JVRjEsCTE2LCAxIH0sCisJCQkgIHsgQURJUzE2MjIwX0FJTjFfTlVMTCwJMTYsIDEgfSwKKwkJCSAgeyBBRElTMTYyMjBfQ0FQVF9QRUFLMSwJMTYsIDEgfSwgfSwKKwlbaW5fMl0gPQl7IHsgQURJUzE2MjIwX0NBUFRfQlVGMiwJMTYsIDEgfSwKKwkJCSAgeyBBRElTMTYyMjBfQUlOMl9OVUxMLAkxNiwgMSB9LAorCQkJICB7IEFESVMxNjIyMF9DQVBUX1BFQUsyLAkxNiwgMSB9LCB9LAorCVthY2NlbF0gPQl7IHsgQURJUzE2MjIwX0NBUFRfQlVGQSwJMTYsIDEgfSwKKwkJCSAgeyBBRElTMTYyMjBfQUNDTF9OVUxMLAkxNiwgMSB9LAorCQkJICB7IEFESVMxNjIyMF9DQVBUX1BFQUtBLAkxNiwgMSB9LCB9LAorCVt0ZW1wXSA9CXsgeyBBRElTMTYyMjBfQ0FQVF9URU1QLAkxMiwgMCB9LCB9Cit9OworCitzdGF0aWMgaW50IGFkaXMxNjIyMF9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICAgICBpbnQgKnZhbCwgaW50ICp2YWwyLAorCQkJICAgICAgbG9uZyBtYXNrKQoreworCWludCByZXQgPSAtRUlOVkFMOworCWludCBhZGRyaW5kID0gMDsKKwl1MTYgdXZhbDsKKwlzMTYgc3ZhbDsKKwl1OCBiaXRzOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSAwOgorCQlhZGRyaW5kID0gMDsKKwkJYnJlYWs7CisJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX09GRlNFVF9TRVBBUkFURSk6CisJCWlmIChjaGFuLT50eXBlID09IElJT19URU1QKSB7CisJCQkqdmFsID0gMjU7CisJCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJCX0KKwkJYWRkcmluZCA9IDE7CisJCWJyZWFrOworCWNhc2UgKDEgPDwgSUlPX0NIQU5fSU5GT19QRUFLX1NFUEFSQVRFKToKKwkJYWRkcmluZCA9IDI7CisJCWJyZWFrOworCWNhc2UgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TRVBBUkFURSk6CisJCSp2YWwgPSAwOworCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBJSU9fVEVNUDoKKwkJCSp2YWwyID0gLTQ3MDAwMDsKKwkJCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQljYXNlIElJT19BQ0NFTDoKKwkJCSp2YWwyID0gMTg4NzA0MjsKKwkJCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQljYXNlIElJT19WT0xUQUdFOgorCQkJaWYgKGNoYW4tPmNoYW5uZWwgPT0gMCkKKwkJCQkqdmFsMiA9IDAwMTIyMjE7CisJCQllbHNlIC8qIFNob3VsZCByZWFsbHkgYmUgZGVwZW5kZW50IG9uIFZERCAqLworCQkJCSp2YWwyID0gMzA1OworCQkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoYWRpczE2MjIwX2FkZHJlc3Nlc1tjaGFuLT5hZGRyZXNzXVthZGRyaW5kXS5zaWduKSB7CisJCXJldCA9IGFkaXMxNjIyMF9zcGlfcmVhZF9yZWdfMTYoaW5kaW9fZGV2LAorCQkJCQkJYWRpczE2MjIwX2FkZHJlc3Nlc1tjaGFuCisJCQkJCQkJCSAgICAtPmFkZHJlc3NdCisJCQkJCQlbYWRkcmluZF0uYWRkciwKKwkJCQkJCSZzdmFsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWJpdHMgPSBhZGlzMTYyMjBfYWRkcmVzc2VzW2NoYW4tPmFkZHJlc3NdW2FkZHJpbmRdLmJpdHM7CisJCXN2YWwgJj0gKDEgPDwgYml0cykgLSAxOworCQlzdmFsID0gKHMxNikoc3ZhbCA8PCAoMTYgLSBiaXRzKSkgPj4gKDE2IC0gYml0cyk7CisJCSp2YWwgPSBzdmFsOworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJfSBlbHNlIHsKKwkJcmV0ID0gYWRpczE2MjIwX3NwaV9yZWFkX3JlZ18xNihpbmRpb19kZXYsCisJCQkJCQlhZGlzMTYyMjBfYWRkcmVzc2VzW2NoYW4KKwkJCQkJCQkJICAgIC0+YWRkcmVzc10KKwkJCQkJCVthZGRyaW5kXS5hZGRyLAorCQkJCQkJJnV2YWwpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJYml0cyA9IGFkaXMxNjIyMF9hZGRyZXNzZXNbY2hhbi0+YWRkcmVzc11bYWRkcmluZF0uYml0czsKKwkJdXZhbCAmPSAoMSA8PCBiaXRzKSAtIDE7CisJCSp2YWwgPSB1dmFsOworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgYWRpczE2MjIwX2NoYW5uZWxzW10gPSB7CisJeworCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkuaW5kZXhlZCA9IDEsCisJCS5jaGFubmVsID0gMCwKKwkJLmV4dGVuZF9uYW1lID0gInN1cHBseSIsCisJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwKKwkJLmFkZHJlc3MgPSBpbl9zdXBwbHksCisJfSwgeworCQkudHlwZSA9IElJT19BQ0NFTCwKKwkJLmluZm9fbWFzayA9ICgxIDw8IElJT19DSEFOX0lORk9fT0ZGU0VUX1NFUEFSQVRFKSB8CisJCQkgICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpIHwKKwkJCSAgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19QRUFLX1NFUEFSQVRFKSwKKwkJLmFkZHJlc3MgPSBhY2NlbCwKKwl9LCB7CisJCS50eXBlID0gSUlPX1RFTVAsCisJCS5pbmRleGVkID0gMSwKKwkJLmNoYW5uZWwgPSAwLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19PRkZTRVRfU0VQQVJBVEUpIHwKKwkJCSAgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TRVBBUkFURSksCisJCS5hZGRyZXNzID0gdGVtcCwKKwl9LCB7CisJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCS5pbmRleGVkID0gMSwKKwkJLmNoYW5uZWwgPSAxLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19PRkZTRVRfU0VQQVJBVEUpIHwKKwkJCSAgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TRVBBUkFURSksCisJCS5hZGRyZXNzID0gaW5fMSwKKwl9LCB7CisJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCS5pbmRleGVkID0gMSwKKwkJLmNoYW5uZWwgPSAyLAorCQkuYWRkcmVzcyA9IGluXzIsCisJfQorfTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjIyMF9hdHRyaWJ1dGVzW10gPSB7Ci0JJmlpb19kZXZfYXR0cl9pbjBfc3VwcGx5X3Jhdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fY29uc3RfYXR0cl9pbjBfc3VwcGx5X3NjYWxlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9hY2NlbF9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2FjY2VsX29mZnNldC5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfYWNjZWxfcGVha19yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2NvbnN0X2F0dHJfYWNjZWxfc2NhbGUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX3RlbXBfcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9pbjFfcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9pbjJfcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19jb25zdF9hdHRyX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCi0JJmlpb19jb25zdF9hdHRyX3RlbXBfc2NhbGUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAogCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKIAkmaWlvX2Rldl9hdHRyX2NhcHR1cmUuZGV2X2F0dHIuYXR0ciwKIAkmaWlvX2Rldl9hdHRyX2NhcHR1cmVfY291bnQuZGV2X2F0dHIuYXR0ciwKQEAgLTU0MiwxMCArNjE5LDEyIEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkaXMxNjIyMF9pbmZvID0gewogCS5hdHRycyA9ICZhZGlzMTYyMjBfYXR0cmlidXRlX2dyb3VwLAogCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCisJLnJlYWRfcmF3ID0gJmFkaXMxNjIyMF9yZWFkX3JhdywKIH07CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGFkaXMxNjIyMF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCWludCByZXQsIHJlZ2RvbmUgPSAwOworCWludCByZXQ7CiAJc3RydWN0IGFkaXMxNjIyMF9zdGF0ZSAqc3Q7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKIApAQCAtNTY3LDE1ICs2NDYsMTYgQEAKIAlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CiAJaW5kaW9fZGV2LT5pbmZvID0gJmFkaXMxNjIyMF9pbmZvOwogCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gYWRpczE2MjIwX2NoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShhZGlzMTYyMjBfY2hhbm5lbHMpOwogCiAJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfZnJlZV9kZXY7Ci0JcmVnZG9uZSA9IDE7CiAKIAlyZXQgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmluZGlvX2Rldi0+ZGV2LmtvYmosICZhY2NlbF9iaW4pOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisJCWdvdG8gZXJyb3JfdW5yZWdpc3Rlcl9kZXY7CiAKIAlyZXQgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmluZGlvX2Rldi0+ZGV2LmtvYmosICZhZGMxX2Jpbik7CiAJaWYgKHJldCkKQEAgLTU5NywxMSArNjc3LDEwIEBACiAJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbmRpb19kZXYtPmRldi5rb2JqLCAmYWRjMV9iaW4pOwogZXJyb3Jfcm1fYWNjZWxfYmluOgogCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmaW5kaW9fZGV2LT5kZXYua29iaiwgJmFjY2VsX2Jpbik7CitlcnJvcl91bnJlZ2lzdGVyX2RldjoKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIGVycm9yX2ZyZWVfZGV2OgotCWlmIChyZWdkb25lKQotCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKLQllbHNlCi0JCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogZXJyb3JfcmV0OgogCXJldHVybiByZXQ7CiB9CkBAIC02MTYsNiArNjk1LDcgQEAKIAlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmluZGlvX2Rldi0+ZGV2LmtvYmosICZhZGMxX2Jpbik7CiAJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZpbmRpb19kZXYtPmRldi5rb2JqLCAmYWNjZWxfYmluKTsKIAlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyNDAuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjQwLmgKaW5kZXggZjFkZDA0Ny4uM2ZhYmNjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyNDAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MC5oCkBAIC0xNTIsNyArMTUyLDcgQEAKICNkZWZpbmUgQURJUzE2MjQwX1NDQU5fQVVYX0FEQwk0CiAjZGVmaW5lIEFESVMxNjI0MF9TQ0FOX1RFTVAJNQogCi0jaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgorI2lmZGVmIENPTkZJR19JSU9fQlVGRkVSCiB2b2lkIGFkaXMxNjI0MF9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIGludCBhZGlzMTYyNDBfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIApAQCAtMTY0LDcgKzE2NCw3IEBACiBpbnQgYWRpczE2MjQwX2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogdm9pZCBhZGlzMTYyNDBfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIAotI2Vsc2UgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2Vsc2UgLyogQ09ORklHX0lJT19CVUZGRVIgKi8KIAogc3RhdGljIGlubGluZSB2b2lkIGFkaXMxNjI0MF9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewpAQCAtMTkyLDUgKzE5Miw1IEBACiB7CiB9CiAKLSNlbmRpZiAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisjZW5kaWYgLyogQ09ORklHX0lJT19CVUZGRVIgKi8KICNlbmRpZiAvKiBTUElfQURJUzE2MjQwX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MF9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MF9jb3JlLmMKaW5kZXggYWVlOGI2OS4uYjhiZTI5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyNDBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjQwX2NvcmUuYwpAQCAtMTcsMTIgKzE3LDExIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vc3lzZnMuaCIKLSNpbmNsdWRlICIuLi9yaW5nX2dlbmVyaWMuaCIKLSNpbmNsdWRlICJhY2NlbC5oIgotI2luY2x1ZGUgIi4uL2FkYy9hZGMuaCIKKyNpbmNsdWRlICIuLi9idWZmZXJfZ2VuZXJpYy5oIgogCiAjaW5jbHVkZSAiYWRpczE2MjQwLmgiCiAKQEAgLTMyNiw3ICszMjUsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIoYWNjZWxfeHl6X3NxdWFyZWRfcGVha19yYXcsIFNfSVJVR08sCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluX2FjY2VsX3h5el9zcXVhcmVkX3BlYWtfcmF3LCBTX0lSVUdPLAogCQkgICAgICAgYWRpczE2MjQwX3JlYWRfMTJiaXRfc2lnbmVkLCBOVUxMLAogCQkgICAgICAgQURJUzE2MjQwX1hZWlBFQUtfT1VUKTsKIApAQCAtMzkzLDcgKzM5Miw3IEBACiAJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKToKIAljYXNlICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKToKIAkJc3dpdGNoIChjaGFuLT50eXBlKSB7Ci0JCWNhc2UgSUlPX0lOOgorCQljYXNlIElJT19WT0xUQUdFOgogCQkJKnZhbCA9IDA7CiAJCQlpZiAoY2hhbi0+Y2hhbm5lbCA9PSAwKQogCQkJCSp2YWwyID0gNDg4MDsKQEAgLTQ3MCwxMSArNDY5LDExIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBhZGlzMTYyNDBfY2hhbm5lbHNbXSA9IHsKLQlJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsICJzdXBwbHkiLCAwLCAwLAorCUlJT19DSEFOKElJT19WT0xUQUdFLCAwLCAxLCAwLCAic3VwcGx5IiwgMCwgMCwKIAkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpLAogCQkgaW5fc3VwcGx5LCBBRElTMTYyNDBfU0NBTl9TVVBQTFksCiAJCSBJSU9fU1QoJ3UnLCAxMCwgMTYsIDApLCAwKSwKLQlJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDEsIDAsCisJSUlPX0NIQU4oSUlPX1ZPTFRBR0UsIDAsIDEsIDAsIE5VTEwsIDEsIDAsCiAJCSAwLAogCQkgaW5fYXV4LCBBRElTMTYyNDBfU0NBTl9BVVhfQURDLAogCQkgSUlPX1NUKCd1JywgMTAsIDE2LCAwKSwgMCksCkBAIC01MDEsNyArNTAwLDcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYyNDBfYXR0cmlidXRlc1tdID0gewotCSZpaW9fZGV2X2F0dHJfYWNjZWxfeHl6X3NxdWFyZWRfcGVha19yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX2FjY2VsX3h5el9zcXVhcmVkX3BlYWtfcmF3LmRldl9hdHRyLmF0dHIsCiAJJmlpb19jb25zdF9hdHRyX3NhbXBsaW5nX2ZyZXF1ZW5jeV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKIAkmaWlvX2Rldl9hdHRyX3Jlc2V0LmRldl9hdHRyLmF0dHIsCiAJTlVMTApAQCAtNTIwLDcgKzUxOSw3IEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGFkaXMxNjI0MF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCWludCByZXQsIHJlZ2RvbmUgPSAwOworCWludCByZXQ7CiAJc3RydWN0IGFkaXMxNjI0MF9zdGF0ZSAqc3Q7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKIApAQCAtNTQ4LDE0ICs1NDcsOSBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CiAKLQlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOwotCXJlZ2RvbmUgPSAxOwotCi0JcmV0ID0gaWlvX3JpbmdfYnVmZmVyX3JlZ2lzdGVyX2V4KGluZGlvX2Rldi0+cmluZywgMCwKLQkJCQkJICBhZGlzMTYyNDBfY2hhbm5lbHMsCi0JCQkJCSAgQVJSQVlfU0laRShhZGlzMTYyNDBfY2hhbm5lbHMpKTsKKwlyZXQgPSBpaW9fYnVmZmVyX3JlZ2lzdGVyKGluZGlvX2RldiwKKwkJCQkgIGFkaXMxNjI0MF9jaGFubmVscywKKwkJCQkgIEFSUkFZX1NJWkUoYWRpczE2MjQwX2NoYW5uZWxzKSk7CiAJaWYgKHJldCkgewogCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBpbml0aWFsaXplIHRoZSByaW5nXG4iKTsKIAkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOwpAQCAtNTcxLDE5ICs1NjUsMTkgQEAKIAlyZXQgPSBhZGlzMTYyNDBfaW5pdGlhbF9zZXR1cChpbmRpb19kZXYpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfcmVtb3ZlX3RyaWdnZXI7CisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmVtb3ZlX3RyaWdnZXI7CiAJcmV0dXJuIDA7CiAKIGVycm9yX3JlbW92ZV90cmlnZ2VyOgogCWFkaXMxNjI0MF9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOwogZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc6Ci0JaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIGVycm9yX3VucmVnX3JpbmdfZnVuY3M6CiAJYWRpczE2MjQwX3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKIGVycm9yX2ZyZWVfZGV2OgotCWlmIChyZWdkb25lKQotCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKLQllbHNlCi0JCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogZXJyb3JfcmV0OgogCXJldHVybiByZXQ7CiB9CkBAIC01OTUsMTAgKzU4OSwxMSBAQAogCiAJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAotCWFkaXMxNjI0MF9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOwotCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldi0+cmluZyk7CiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJYWRpczE2MjQwX3JlbW92ZV90cmlnZ2VyKGluZGlvX2Rldik7CisJaWlvX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldik7CiAJYWRpczE2MjQwX3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyNDBfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyNDBfcmluZy5jCmluZGV4IGM4MTJhMzQuLjM0ZjFlN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjQwX3JpbmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MF9yaW5nLmMKQEAgLTEsMjAgKzEsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCi0jaW5jbHVkZSAiLi4vc3lzZnMuaCIKICNpbmNsdWRlICIuLi9yaW5nX3N3LmgiCi0jaW5jbHVkZSAiYWNjZWwuaCIKLSNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCisjaW5jbHVkZSAiLi4vdHJpZ2dlcl9jb25zdW1lci5oIgogI2luY2x1ZGUgImFkaXMxNjI0MC5oIgogCiAvKioKQEAgLTYyLDkgKzU0LDkgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBhZGlzMTYyNDBfdHJpZ2dlcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnApCiB7CiAJc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmID0gcDsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPmluZGlvX2RldjsKIAlzdHJ1Y3QgYWRpczE2MjQwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0Jc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+cmluZzsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+YnVmZmVyOwogCiAJaW50IGkgPSAwOwogCXMxNiAqZGF0YTsKQEAgLTk2LDI2ICs4OCwyNiBAQAogdm9pZCBhZGlzMTYyNDBfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCWlpb19kZWFsbG9jX3BvbGxmdW5jKGluZGlvX2Rldi0+cG9sbGZ1bmMpOwotCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7CisJaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5idWZmZXIpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGlpb19yaW5nX3NldHVwX29wcyBhZGlzMTYyNDBfcmluZ19zZXR1cF9vcHMgPSB7Ci0JLnByZWVuYWJsZSA9ICZpaW9fc3dfcmluZ19wcmVlbmFibGUsCi0JLnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3Bvc3RlbmFibGUsCi0JLnByZWRpc2FibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3ByZWRpc2FibGUsCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19idWZmZXJfc2V0dXBfb3BzIGFkaXMxNjI0MF9yaW5nX3NldHVwX29wcyA9IHsKKwkucHJlZW5hYmxlID0gJmlpb19zd19idWZmZXJfcHJlZW5hYmxlLAorCS5wb3N0ZW5hYmxlID0gJmlpb190cmlnZ2VyZWRfYnVmZmVyX3Bvc3RlbmFibGUsCisJLnByZWRpc2FibGUgPSAmaWlvX3RyaWdnZXJlZF9idWZmZXJfcHJlZGlzYWJsZSwKIH07CiAKIGludCBhZGlzMTYyNDBfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKIAlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nOworCXN0cnVjdCBpaW9fYnVmZmVyICpyaW5nOwogCiAJcmluZyA9IGlpb19zd19yYl9hbGxvY2F0ZShpbmRpb19kZXYpOwogCWlmICghcmluZykgewogCQlyZXQgPSAtRU5PTUVNOwogCQlyZXR1cm4gcmV0OwogCX0KLQlpbmRpb19kZXYtPnJpbmcgPSByaW5nOworCWluZGlvX2Rldi0+YnVmZmVyID0gcmluZzsKIAkvKiBFZmZlY3RpdmVseSBzZWxlY3QgdGhlIHJpbmcgYnVmZmVyIGltcGxlbWVudGF0aW9uICovCiAJcmluZy0+YWNjZXNzID0gJnJpbmdfc3dfYWNjZXNzX2Z1bmNzOwogCXJpbmctPmJwZSA9IDI7CkBAIC0xMjMsMTQgKzExNSw2IEBACiAJcmluZy0+c2V0dXBfb3BzID0gJmFkaXMxNjI0MF9yaW5nX3NldHVwX29wczsKIAlyaW5nLT5vd25lciA9IFRISVNfTU9EVUxFOwogCi0JLyogU2V0IGRlZmF1bHQgc2NhbiBtb2RlICovCi0JaWlvX3NjYW5fbWFza19zZXQocmluZywgQURJUzE2MjQwX1NDQU5fU1VQUExZKTsKLQlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBBRElTMTYyNDBfU0NBTl9BQ0NfWCk7Ci0JaWlvX3NjYW5fbWFza19zZXQocmluZywgQURJUzE2MjQwX1NDQU5fQUNDX1kpOwotCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIEFESVMxNjI0MF9TQ0FOX0FDQ19aKTsKLQlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBBRElTMTYyNDBfU0NBTl9BVVhfQURDKTsKLQlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCBBRElTMTYyNDBfU0NBTl9URU1QKTsKLQogCWluZGlvX2Rldi0+cG9sbGZ1bmMgPSBpaW9fYWxsb2NfcG9sbGZ1bmMoJmlpb19wb2xsZnVuY19zdG9yZV90aW1lLAogCQkJCQkJICZhZGlzMTYyNDBfdHJpZ2dlcl9oYW5kbGVyLAogCQkJCQkJIElSUUZfT05FU0hPVCwKQEAgLTE0MywxMCArMTI3LDEwIEBACiAJCWdvdG8gZXJyb3JfaWlvX3N3X3JiX2ZyZWU7CiAJfQogCi0JaW5kaW9fZGV2LT5tb2RlcyB8PSBJTkRJT19SSU5HX1RSSUdHRVJFRDsKKwlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX0JVRkZFUl9UUklHR0VSRUQ7CiAJcmV0dXJuIDA7CiAKIGVycm9yX2lpb19zd19yYl9mcmVlOgotCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7CisJaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5idWZmZXIpOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MF90cmlnZ2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MF90cmlnZ2VyLmMKaW5kZXggMTcxMzVmYzMuLjEzZjFkMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjQwX3RyaWdnZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MF90cmlnZ2VyLmMKQEAgLTEsMTQgKzEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCi0jaW5jbHVkZSAiLi4vc3lzZnMuaCIKICNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCiAjaW5jbHVkZSAiYWRpczE2MjQwLmgiCiAKQEAgLTMzLDYgKzI3LDExIEBACiAJcmV0dXJuIGFkaXMxNjI0MF9zZXRfaXJxKGluZGlvX2Rldiwgc3RhdGUpOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb190cmlnZ2VyX29wcyBhZGlzMTYyNDBfdHJpZ2dlcl9vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnNldF90cmlnZ2VyX3N0YXRlID0gJmFkaXMxNjI0MF9kYXRhX3JkeV90cmlnZ2VyX3NldF9zdGF0ZSwKK307CisKIGludCBhZGlzMTYyNDBfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCWludCByZXQ7CkBAIC01Myw5ICs1Miw4IEBACiAJCWdvdG8gZXJyb3JfZnJlZV90cmlnOwogCiAJc3QtPnRyaWctPmRldi5wYXJlbnQgPSAmc3QtPnVzLT5kZXY7Ci0Jc3QtPnRyaWctPm93bmVyID0gVEhJU19NT0RVTEU7CisJc3QtPnRyaWctPm9wcyA9ICZhZGlzMTYyNDBfdHJpZ2dlcl9vcHM7CiAJc3QtPnRyaWctPnByaXZhdGVfZGF0YSA9IGluZGlvX2RldjsKLQlzdC0+dHJpZy0+c2V0X3RyaWdnZXJfc3RhdGUgPSAmYWRpczE2MjQwX2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlOwogCXJldCA9IGlpb190cmlnZ2VyX3JlZ2lzdGVyKHN0LT50cmlnKTsKIAogCS8qIHNlbGVjdCBkZWZhdWx0IHRyaWdnZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvaW5jbGlub21ldGVyLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2luY2xpbm9tZXRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWY3M2Q3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvaW5jbGlub21ldGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogSW5jbGlub21ldGVyIHJlbGF0ZWQgYXR0cmlidXRlcwotICovCi0jaW5jbHVkZSAiLi4vc3lzZnMuaCIKLQotI2RlZmluZSBJSU9fREVWX0FUVFJfSU5DTElfWChfc2hvdywgX2FkZHIpCQkJXAotCUlJT19ERVZJQ0VfQVRUUihpbmNsaV94X3JhdywgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQotCi0jZGVmaW5lIElJT19ERVZfQVRUUl9JTkNMSV9ZKF9zaG93LCBfYWRkcikJCQlcCi0JSUlPX0RFVklDRV9BVFRSKGluY2xpX3lfcmF3LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0lOQ0xJX1ooX3Nob3csIF9hZGRyKQkJCVwKLQlJSU9fREVWSUNFX0FUVFIoaW5jbGlfel9yYXcsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKLQotI2RlZmluZSBJSU9fREVWX0FUVFJfSU5DTElfWF9PRkZTRVQoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKSBcCi0JSUlPX0RFVklDRV9BVFRSKGluY2xpX3hfb2Zmc2V0LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0lOQ0xJX1lfT0ZGU0VUKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikgXAotCUlJT19ERVZJQ0VfQVRUUihpbmNsaV95X29mZnNldCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQotCi0jZGVmaW5lIElJT19ERVZfQVRUUl9JTkNMSV9aX09GRlNFVChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpIFwKLQlJSU9fREVWSUNFX0FUVFIoaW5jbGlfel9vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKLQotI2RlZmluZSBJSU9fQ09OU1RfQVRUUl9JTkNMSV9TQ0FMRShfc3RyaW5nKSBcCi0JSUlPX0NPTlNUX0FUVFIoaW5jbGlfc2NhbGUsIF9zdHJpbmcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2t4c2Q5LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2t4c2Q5LmMKaW5kZXggYzhhMzU4YS4uNTIzODUwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9reHNkOS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwva3hzZDkuYwpAQCAtMjEsMTEgKzIxLDEwIEBACiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vc3lzZnMuaCIKLSNpbmNsdWRlICIuLi9hZGMvYWRjLmgiCi0jaW5jbHVkZSAiYWNjZWwuaCIKIAogI2RlZmluZSBLWFNEOV9SRUdfWAkJMHgwMAogI2RlZmluZSBLWFNEOV9SRUdfWQkJMHgwMgpAQCAtMzQsMTAgKzMzLDYgQEAKICNkZWZpbmUgS1hTRDlfUkVHX1JFU0VUCQkweDBhCiAjZGVmaW5lIEtYU0Q5X1JFR19DVFJMX0MJMHgwYwogCi0jZGVmaW5lIEtYU0Q5X0ZTXzgJCTB4MDAKLSNkZWZpbmUgS1hTRDlfRlNfNgkJMHgwMQotI2RlZmluZSBLWFNEOV9GU180CQkweDAyCi0jZGVmaW5lIEtYU0Q5X0ZTXzIJCTB4MDMKICNkZWZpbmUgS1hTRDlfRlNfTUFTSwkJMHgwMwogCiAjZGVmaW5lIEtYU0Q5X1JFR19DVFJMX0IJMHgwZApAQCAtNDYsMTMgKzQxLDggQEAKICNkZWZpbmUgS1hTRDlfUkVBRChhKSAoMHg4MCB8IChhKSkKICNkZWZpbmUgS1hTRDlfV1JJVEUoYSkgKGEpCiAKLSNkZWZpbmUgS1hTRDlfU0NBTEVfMkcgIjAuMDExOTc4IgotI2RlZmluZSBLWFNEOV9TQ0FMRV80RyAiMC4wMjM5MjciCi0jZGVmaW5lIEtYU0Q5X1NDQUxFXzZHICIwLjAzNTkzNCIKLSNkZWZpbmUgS1hTRDlfU0NBTEVfOEcgIjAuMDQ3ODUzIgotCiAjZGVmaW5lIEtYU0Q5X1NUQVRFX1JYX1NJWkUgMgotI2RlZmluZSBLWFNEOV9TVEFURV9UWF9TSVpFIDQKKyNkZWZpbmUgS1hTRDlfU1RBVEVfVFhfU0laRSAyCiAvKioKICAqIHN0cnVjdCBreHNkOV9zdGF0ZSAtIGRldmljZSByZWxhdGVkIHN0b3JhZ2UKICAqIEBidWZfbG9jazoJcHJvdGVjdCB0aGUgcnggYW5kIHR4IGJ1ZmZlcnMuCkBAIC02NywxNzAgKzU3LDcwIEBACiAJdTggdHhbS1hTRDlfU1RBVEVfVFhfU0laRV07CiB9OwogCi0vKiBUaGlzIG1heSB3YW50IHRvIG1vdmUgdG8gbWlsaSBnIHRvIGFsbG93IGZvciBub24gaW50ZWdlciByYW5nZXMgKi8KLXN0YXRpYyBzc2l6ZV90IGt4c2Q5X3JlYWRfc2NhbGUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCWNoYXIgKmJ1ZikKKyNkZWZpbmUgS1hTRDlfU0NBTEVfMkcgIjAuMDExOTc4IgorI2RlZmluZSBLWFNEOV9TQ0FMRV80RyAiMC4wMjM5MjciCisjZGVmaW5lIEtYU0Q5X1NDQUxFXzZHICIwLjAzNTkzNCIKKyNkZWZpbmUgS1hTRDlfU0NBTEVfOEcgIjAuMDQ3ODUzIgorCisvKiByZXZlcnNlIG9yZGVyICovCitzdGF0aWMgY29uc3QgaW50IGt4c2Q5X21pY3JvX3NjYWxlc1s0XSA9IHsgNDc4NTMsIDM1OTM0LCAyMzkyNywgMTE5NzggfTsKKworc3RhdGljIGludCBreHNkOV93cml0ZV9zY2FsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBpbnQgbWljcm8pCiB7Ci0JaW50IHJldDsKLQlzc2l6ZV90IGxlbiA9IDA7Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQsIGk7CiAJc3RydWN0IGt4c2Q5X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyID0gewotCQkuYml0c19wZXJfd29yZCA9IDgsCi0JCS5sZW4gPSAyLAotCQkuY3NfY2hhbmdlID0gMSwKLQkJLnR4X2J1ZiA9IHN0LT50eCwKLQkJLnJ4X2J1ZiA9IHN0LT5yeCwKLQl9OwotCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJYm9vbCBmb3VuZGl0ID0gZmFsc2U7CiAKLQltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOwotCXN0LT50eFswXSA9IEtYU0Q5X1JFQUQoS1hTRDlfUkVHX0NUUkxfQyk7Ci0Jc3QtPnR4WzFdID0gMDsKLQlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOwotCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKLQlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfcmV0OwotCi0Jc3dpdGNoIChzdC0+cnhbMV0gJiBLWFNEOV9GU19NQVNLKSB7Ci0JY2FzZSBLWFNEOV9GU184OgotCQlsZW4gKz0gc3ByaW50ZihidWYsICIlc1xuIiwgS1hTRDlfU0NBTEVfOEcpOwotCQlicmVhazsKLQljYXNlIEtYU0Q5X0ZTXzY6Ci0JCWxlbiArPSBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBLWFNEOV9TQ0FMRV82Ryk7Ci0JCWJyZWFrOwotCWNhc2UgS1hTRDlfRlNfNDoKLQkJbGVuICs9IHNwcmludGYoYnVmLCAiJXNcbiIsIEtYU0Q5X1NDQUxFXzRHKTsKLQkJYnJlYWs7Ci0JY2FzZSBLWFNEOV9GU18yOgotCQlsZW4gKz0gc3ByaW50ZihidWYsICIlc1xuIiwgS1hTRDlfU0NBTEVfMkcpOwotCQlicmVhazsKLQl9Ci0KLWVycm9yX3JldDoKLQltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7Ci0KLQlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOwotfQotc3RhdGljIHNzaXplX3Qga3hzZDlfd3JpdGVfc2NhbGUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgY29uc3QgY2hhciAqYnVmLAotCQkJCSBzaXplX3QgbGVuKQotewotCi0Jc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKLQlpbnQgcmV0OwotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3Qga3hzZDlfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQl1OCB2YWw7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1tdID0gewotCQl7Ci0JCQkuYml0c19wZXJfd29yZCA9IDgsCi0JCQkubGVuID0gMiwKLQkJCS5jc19jaGFuZ2UgPSAxLAotCQkJLnR4X2J1ZiA9IHN0LT50eCwKLQkJCS5yeF9idWYgPSBzdC0+cngsCi0JCX0sIHsKLQkJCS5iaXRzX3Blcl93b3JkID0gOCwKLQkJCS5sZW4gPSAyLAotCQkJLmNzX2NoYW5nZSA9IDEsCi0JCQkudHhfYnVmID0gc3QtPnR4LAotCQl9LAotCX07Ci0KLQlpZiAoIXN0cm5jbXAoYnVmLCBLWFNEOV9TQ0FMRV84RywKLQkJICAgICBzdHJsZW4oYnVmKSA8IHN0cmxlbihLWFNEOV9TQ0FMRV84RykKLQkJICAgICA/IHN0cmxlbihidWYpIDogc3RybGVuKEtYU0Q5X1NDQUxFXzhHKSkpCi0JCXZhbCA9IEtYU0Q5X0ZTXzg7Ci0JZWxzZSBpZiAoIXN0cm5jbXAoYnVmLCBLWFNEOV9TQ0FMRV82RywKLQkJCSAgc3RybGVuKGJ1ZikgPCBzdHJsZW4oS1hTRDlfU0NBTEVfNkcpCi0JCQkgID8gc3RybGVuKGJ1ZikgOiBzdHJsZW4oS1hTRDlfU0NBTEVfNkcpKSkKLQkJdmFsID0gS1hTRDlfRlNfNjsKLQllbHNlIGlmICghc3RybmNtcChidWYsIEtYU0Q5X1NDQUxFXzRHLAotCQkJICBzdHJsZW4oYnVmKSA8IHN0cmxlbihLWFNEOV9TQ0FMRV80RykKLQkJCSAgPyBzdHJsZW4oYnVmKSA6IHN0cmxlbihLWFNEOV9TQ0FMRV80RykpKQotCQl2YWwgPSBLWFNEOV9GU180OwotCWVsc2UgaWYgKCFzdHJuY21wKGJ1ZiwgS1hTRDlfU0NBTEVfMkcsCi0JCQkgIHN0cmxlbihidWYpIDwgc3RybGVuKEtYU0Q5X1NDQUxFXzJHKQotCQkJICA/IHN0cmxlbihidWYpIDogc3RybGVuKEtYU0Q5X1NDQUxFXzJHKSkpCi0JCXZhbCA9IEtYU0Q5X0ZTXzI7Ci0JZWxzZQorCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCWlmIChtaWNybyA9PSBreHNkOV9taWNyb19zY2FsZXNbaV0pIHsKKwkJCWZvdW5kaXQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwlpZiAoIWZvdW5kaXQpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKLQlzdC0+dHhbMF0gPSBLWFNEOV9SRUFEKEtYU0Q5X1JFR19DVFJMX0MpOwotCXN0LT50eFsxXSA9IDA7Ci0Jc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKLQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMF0sICZtc2cpOwotCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJcmV0ID0gc3BpX3c4cjgoc3QtPnVzLCBLWFNEOV9SRUFEKEtYU0Q5X1JFR19DVFJMX0MpKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX3JldDsKIAlzdC0+dHhbMF0gPSBLWFNEOV9XUklURShLWFNEOV9SRUdfQ1RSTF9DKTsKLQlzdC0+dHhbMV0gPSAoc3QtPnJ4WzFdICYgfktYU0Q5X0ZTX01BU0spIHwgdmFsOworCXN0LT50eFsxXSA9IChyZXQgJiB+S1hTRDlfRlNfTUFTSykgfCBpOwogCi0Jc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKLQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMV0sICZtc2cpOwotCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJcmV0ID0gc3BpX3dyaXRlKHN0LT51cywgc3QtPnR4LCAyKTsKIGVycm9yX3JldDoKIAltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7Ci0JcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3NpemVfdCBreHNkOV9yZWFkX2FjY2VsKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQljaGFyICpidWYpCitzdGF0aWMgaW50IGt4c2Q5X3JlYWQoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgdTggYWRkcmVzcykKIHsKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOwogCWludCByZXQ7Ci0Jc3NpemVfdCBsZW4gPSAwOwotCXUxNiB2YWw7Ci0Jc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOwotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3Qga3hzZDlfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7CiAJCXsKIAkJCS5iaXRzX3Blcl93b3JkID0gOCwKIAkJCS5sZW4gPSAxLAotCQkJLmNzX2NoYW5nZSA9IDAsCiAJCQkuZGVsYXlfdXNlY3MgPSAyMDAsCiAJCQkudHhfYnVmID0gc3QtPnR4LAogCQl9LCB7CiAJCQkuYml0c19wZXJfd29yZCA9IDgsCiAJCQkubGVuID0gMiwKLQkJCS5jc19jaGFuZ2UgPSAxLAogCQkJLnJ4X2J1ZiA9IHN0LT5yeCwKIAkJfSwKIAl9OwogCiAJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKLQlzdC0+dHhbMF0gPSBLWFNEOV9SRUFEKHRoaXNfYXR0ci0+YWRkcmVzcyk7CisJc3QtPnR4WzBdID0gS1hTRDlfUkVBRChhZGRyZXNzKTsKIAlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOwogCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1swXSwgJm1zZyk7CiAJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzFdLCAmbXNnKTsKIAlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfcmV0OwotCXZhbCA9ICgoKHUxNikoc3QtPnJ4WzBdKSkgPDwgOCkgfCAoc3QtPnJ4WzFdICYgMHhGMCk7Ci0JbGVuID0gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKLWVycm9yX3JldDoKLQltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7Ci0KLQlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworCQlyZXR1cm4gcmV0OworCXJldHVybiAoKCh1MTYpKHN0LT5yeFswXSkpIDw8IDgpIHwgKHN0LT5yeFsxXSAmIDB4RjApOwogfQogCi1zdGF0aWMgSUlPX0RFVl9BVFRSX0FDQ0VMX1goa3hzZDlfcmVhZF9hY2NlbCwgS1hTRDlfUkVHX1gpOwotc3RhdGljIElJT19ERVZfQVRUUl9BQ0NFTF9ZKGt4c2Q5X3JlYWRfYWNjZWwsIEtYU0Q5X1JFR19ZKTsKLXN0YXRpYyBJSU9fREVWX0FUVFJfQUNDRUxfWihreHNkOV9yZWFkX2FjY2VsLCBLWFNEOV9SRUdfWik7Ci1zdGF0aWMgSUlPX0RFVl9BVFRSX0lOX1JBVygwLCBreHNkOV9yZWFkX2FjY2VsLCBLWFNEOV9SRUdfQVVYKTsKLQotc3RhdGljIElJT19ERVZJQ0VfQVRUUihhY2NlbF9zY2FsZSwKLQkJU19JUlVHTyB8IFNfSVdVU1IsCi0JCWt4c2Q5X3JlYWRfc2NhbGUsCi0JCWt4c2Q5X3dyaXRlX3NjYWxlLAotCQkwKTsKLQogc3RhdGljIElJT19DT05TVF9BVFRSKGFjY2VsX3NjYWxlX2F2YWlsYWJsZSwKIAkJS1hTRDlfU0NBTEVfMkcgIiAiCiAJCUtYU0Q5X1NDQUxFXzRHICIgIgpAQCAtMjM4LDQ4ICsxMjgsOTQgQEAKIAkJS1hTRDlfU0NBTEVfOEcpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqa3hzZDlfYXR0cmlidXRlc1tdID0gewotCSZpaW9fZGV2X2F0dHJfYWNjZWxfeF9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2FjY2VsX3lfcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9hY2NlbF96X3Jhdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfaW4wX3Jhdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfYWNjZWxfc2NhbGUuZGV2X2F0dHIuYXR0ciwKIAkmaWlvX2NvbnN0X2F0dHJfYWNjZWxfc2NhbGVfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCiAJTlVMTCwKIH07CiAKK3N0YXRpYyBpbnQga3hzZDlfd3JpdGVfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCSAgIGludCB2YWwsCisJCQkgICBpbnQgdmFsMiwKKwkJCSAgIGxvbmcgbWFzaykKK3sKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWlmIChtYXNrID09ICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSkgeworCQkvKiBDaGVjayBubyBpbnRlZ2VyIGNvbXBvbmVudCAqLworCQlpZiAodmFsKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldCA9IGt4c2Q5X3dyaXRlX3NjYWxlKGluZGlvX2RldiwgdmFsMik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBreHNkOV9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCSAgaW50ICp2YWwsIGludCAqdmFsMiwgbG9uZyBtYXNrKQoreworCWludCByZXQgPSAtRUlOVkFMOworCXN0cnVjdCBreHNkOV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSAwOgorCQlyZXQgPSBreHNkOV9yZWFkKGluZGlvX2RldiwgY2hhbi0+YWRkcmVzcyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJvcl9yZXQ7CisJCSp2YWwgPSByZXQ7CisJCWJyZWFrOworCWNhc2UgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpOgorCQlyZXQgPSBzcGlfdzhyOChzdC0+dXMsIEtYU0Q5X1JFQUQoS1hTRDlfUkVHX0NUUkxfQykpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl9yZXQ7CisJCSp2YWwyID0ga3hzZDlfbWljcm9fc2NhbGVzW3JldCAmIEtYU0Q5X0ZTX01BU0tdOworCQlyZXQgPSBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQlicmVhazsKKwl9OworCitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK307CisjZGVmaW5lIEtYU0Q5X0FDQ0VMX0NIQU4oYXhpcykJCQkJCQlcCisJewkJCQkJCQkJXAorCQkudHlwZSA9IElJT19BQ0NFTCwJCQkJCVwKKwkJLm1vZGlmaWVkID0gMSwJCQkJCQlcCisJCS5jaGFubmVsMiA9IElJT19NT0RfIyNheGlzLAkJCQlcCisJCS5pbmZvX21hc2sgPSAxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVELAkJXAorCQkuYWRkcmVzcyA9IEtYU0Q5X1JFR18jI2F4aXMsCQkJCVwKKwl9CisKK3N0YXRpYyBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBreHNkOV9jaGFubmVsc1tdID0geworCUtYU0Q5X0FDQ0VMX0NIQU4oWCksIEtYU0Q5X0FDQ0VMX0NIQU4oWSksIEtYU0Q5X0FDQ0VMX0NIQU4oWiksCisJeworCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkuaW5kZXhlZCA9IDEsCisJCS5hZGRyZXNzID0gS1hTRDlfUkVHX0FVWCwKKwl9Cit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBreHNkOV9hdHRyaWJ1dGVfZ3JvdXAgPSB7CiAJLmF0dHJzID0ga3hzZDlfYXR0cmlidXRlcywKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGt4c2Q5X3Bvd2VyX3VwKHN0cnVjdCBreHNkOV9zdGF0ZSAqc3QpCiB7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyc1syXSA9IHsKLQkJewotCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAotCQkJLmxlbiA9IDIsCi0JCQkuY3NfY2hhbmdlID0gMSwKLQkJCS50eF9idWYgPSBzdC0+dHgsCi0JCX0sIHsKLQkJCS5iaXRzX3Blcl93b3JkID0gOCwKLQkJCS5sZW4gPSAyLAotCQkJLmNzX2NoYW5nZSA9IDEsCi0JCQkudHhfYnVmID0gc3QtPnR4ICsgMiwKLQkJfSwKLQl9OwotCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJaW50IHJldDsKKwogCXN0LT50eFswXSA9IDB4MGQ7CiAJc3QtPnR4WzFdID0gMHg0MDsKLQlzdC0+dHhbMl0gPSAweDBjOwotCXN0LT50eFszXSA9IDB4OWI7CisJcmV0ID0gc3BpX3dyaXRlKHN0LT51cywgc3QtPnR4LCAyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCi0Jc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKLQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMF0sICZtc2cpOwotCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1sxXSwgJm1zZyk7Ci0KLQlyZXR1cm4gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKKwlzdC0+dHhbMF0gPSAweDBjOworCXN0LT50eFsxXSA9IDB4OWI7CisJcmV0dXJuIHNwaV93cml0ZShzdC0+dXMsIHN0LT50eCwgMik7CiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGt4c2Q5X2luZm8gPSB7CisJLnJlYWRfcmF3ID0gJmt4c2Q5X3JlYWRfcmF3LAorCS53cml0ZV9yYXcgPSAma3hzZDlfd3JpdGVfcmF3LAogCS5hdHRycyA9ICZreHNkOV9hdHRyaWJ1dGVfZ3JvdXAsCiAJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKIH07CkBAIC0zMDAsNyArMjM2LDkgQEAKIAogCXN0LT51cyA9IHNwaTsKIAltdXRleF9pbml0KCZzdC0+YnVmX2xvY2spOwotCisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGt4c2Q5X2NoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShreHNkOV9jaGFubmVscyk7CisJaW5kaW9fZGV2LT5uYW1lID0gc3BpX2dldF9kZXZpY2VfaWQoc3BpKS0+bmFtZTsKIAlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CiAJaW5kaW9fZGV2LT5pbmZvID0gJmt4c2Q5X2luZm87CiAJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOwpAQCAtMzI0LDEwICsyNjIsMTUgQEAKIHN0YXRpYyBpbnQgX19kZXZleGl0IGt4c2Q5X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewogCWlpb19kZXZpY2VfdW5yZWdpc3RlcihzcGlfZ2V0X2RydmRhdGEoc3BpKSk7CisJaWlvX2ZyZWVfZGV2aWNlKHNwaV9nZXRfZHJ2ZGF0YShzcGkpKTsKIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQga3hzZDlfaWRbXSA9IHsKKwl7Imt4c2Q5IiwgMH0KK307CisKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBreHNkOV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAia3hzZDkiLApAQCAtMzM1LDYgKzI3OCw3IEBACiAJfSwKIAkucHJvYmUgPSBreHNkOV9wcm9iZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3Aoa3hzZDlfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBreHNkOV9pZCwKIH07CiAKIHN0YXRpYyBfX2luaXQgaW50IGt4c2Q5X3NwaV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcS5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9saXMzbDAyZHEuaAppbmRleCAxOGIyM2FjLi43MjM3YTlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvbGlzM2wwMmRxLmgKQEAgLTE3NCwyMCArMTc0LDIwIEBACiAKIGludCBsaXMzbDAyZHFfZGlzYWJsZV9hbGxfZXZlbnRzKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogCi0jaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgotLyogQXQgdGhlIG1vbWVudCB0cmlnZ2VycyBhcmUgb25seSB1c2VkIGZvciByaW5nIGJ1ZmZlcgorI2lmZGVmIENPTkZJR19JSU9fQlVGRkVSCisvKiBBdCB0aGUgbW9tZW50IHRyaWdnZXJzIGFyZSBvbmx5IHVzZWQgZm9yIGJ1ZmZlcgogICogZmlsbGluZy4gVGhpcyBtYXkgY2hhbmdlIQogICovCiB2b2lkIGxpczNsMDJkcV9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIGludCBsaXMzbDAyZHFfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIAotc3NpemVfdCBsaXMzbDAyZHFfcmVhZF9hY2NlbF9mcm9tX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZywKK3NzaXplX3QgbGlzM2wwMmRxX3JlYWRfYWNjZWxfZnJvbV9idWZmZXIoc3RydWN0IGlpb19idWZmZXIgKmJ1ZmZlciwKIAkJCQkgICAgICAgaW50IGluZGV4LAogCQkJCSAgICAgICBpbnQgKnZhbCk7CiAKIAotaW50IGxpczNsMDJkcV9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKLXZvaWQgbGlzM2wwMmRxX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CitpbnQgbGlzM2wwMmRxX2NvbmZpZ3VyZV9idWZmZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7Cit2b2lkIGxpczNsMDJkcV91bmNvbmZpZ3VyZV9idWZmZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiAKICNpZmRlZiBDT05GSUdfTElTM0wwMkRRX0JVRl9SSU5HX1NXCiAjZGVmaW5lIGxpczNsMDJkcV9mcmVlX2J1ZiBpaW9fc3dfcmJfZnJlZQpAQCAtMjAyLDggKzIwMiw4IEBACiBpcnFyZXR1cm5fdCBsaXMzbDAyZHFfZGF0YV9yZHlfdHJpZ19wb2xsKGludCBpcnEsIHZvaWQgKnByaXZhdGUpOwogI2RlZmluZSBsaXMzbDAyZHFfdGggbGlzM2wwMmRxX2RhdGFfcmR5X3RyaWdfcG9sbAogCi0jZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCi0jZGVmaW5lIGxpczNsMDJkcV90aCBsaXMzbDAyZHFfbm9yaW5nCisjZWxzZSAvKiBDT05GSUdfSUlPX0JVRkZFUiAqLworI2RlZmluZSBsaXMzbDAyZHFfdGggbGlzM2wwMmRxX25vYnVmZmVyCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBsaXMzbDAyZHFfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKQEAgLTIxMywxOSArMjEzLDE5IEBACiAJcmV0dXJuIDA7CiB9CiBzdGF0aWMgaW5saW5lIHNzaXplX3QKLWxpczNsMDJkcV9yZWFkX2FjY2VsX2Zyb21fcmluZyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nLAotCQkJICAgICAgIGludCBpbmRleCwKLQkJCSAgICAgICBpbnQgKnZhbCkKK2xpczNsMDJkcV9yZWFkX2FjY2VsX2Zyb21fYnVmZmVyKHN0cnVjdCBpaW9fYnVmZmVyICpidWZmZXIsCisJCQkJIGludCBpbmRleCwKKwkJCQkgaW50ICp2YWwpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbGlzM2wwMmRxX2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCitzdGF0aWMgaW50IGxpczNsMDJkcV9jb25maWd1cmVfYnVmZmVyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJcmV0dXJuIDA7CiB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgbGlzM2wwMmRxX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXMzbDAyZHFfdW5jb25maWd1cmVfYnVmZmVyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiB9Ci0jZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2VuZGlmIC8qIENPTkZJR19JSU9fQlVGRkVSICovCiAjZW5kaWYgLyogU1BJX0xJUzNMMDJEUV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9saXMzbDAyZHFfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9saXMzbDAyZHFfY29yZS5jCmluZGV4IGEyOWRmZDIuLjU1OTU0NWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvbGlzM2wwMmRxX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcV9jb3JlLmMKQEAgLTIxLDEyICsyMSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCi0jaW5jbHVkZSAiLi4vcmluZ19nZW5lcmljLmgiCi0KLSNpbmNsdWRlICJhY2NlbC5oIgorI2luY2x1ZGUgIi4uL2J1ZmZlcl9nZW5lcmljLmgiCiAKICNpbmNsdWRlICJsaXMzbDAyZHEuaCIKIApAQCAtMzUsOCArMzQsOCBAQAogICogVGhpcyBtZWFucyB0aGF0IHVzZSBjYW5ub3QgYmUgbWFkZSBvZiBzcGlfd3JpdGUgZXRjLgogICovCiAvKiBkaXJlY3QgY29weSBvZiB0aGUgaXJxX2RlZmF1bHRfcHJpbWFyeV9oYW5kbGVyICovCi0jaWZuZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKLXN0YXRpYyBpcnFyZXR1cm5fdCBsaXMzbDAyZHFfbm9yaW5nKGludCBpcnEsIHZvaWQgKnByaXZhdGUpCisjaWZuZGVmIENPTkZJR19JSU9fQlVGRkVSCitzdGF0aWMgaXJxcmV0dXJuX3QgbGlzM2wwMmRxX25vYnVmZmVyKGludCBpcnEsIHZvaWQgKnByaXZhdGUpCiB7CiAJcmV0dXJuIElSUV9XQUtFX1RIUkVBRDsKIH0KQEAgLTIwMSwxNCArMjAwLDE0IEBACiB9OwogCiBzdGF0aWMgaW50IGxpczNsMDJkcV9yZWFkX3RocmVzaChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAotCQkJCSBpbnQgZSwKKwkJCQkgdTY0IGUsCiAJCQkJIGludCAqdmFsKQogewogCXJldHVybiBsaXMzbDAyZHFfcmVhZF9yZWdfczE2KGluZGlvX2RldiwgTElTM0wwMkRRX1JFR19USFNfTF9BRERSLCB2YWwpOwogfQogCiBzdGF0aWMgaW50IGxpczNsMDJkcV93cml0ZV90aHJlc2goc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKLQkJCQkgIGludCBldmVudF9jb2RlLAorCQkJCSAgdTY0IGV2ZW50X2NvZGUsCiAJCQkJICBpbnQgdmFsKQogewogCXUxNiB2YWx1ZSA9IHZhbDsKQEAgLTI2MCwxMCArMjU5LDExIEBACiAJY2FzZSAwOgogCQkvKiBUYWtlIHRoZSBpaW9fZGV2IHN0YXR1cyBsb2NrICovCiAJCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOwotCQlpZiAoaW5kaW9fZGV2LT5jdXJyZW50bW9kZSA9PSBJTkRJT19SSU5HX1RSSUdHRVJFRCkKLQkJCXJldCA9IGxpczNsMDJkcV9yZWFkX2FjY2VsX2Zyb21fcmluZyhpbmRpb19kZXYtPnJpbmcsCi0JCQkJCQkJICAgICBjaGFuLT5zY2FuX2luZGV4LAotCQkJCQkJCSAgICAgdmFsKTsKKwkJaWYgKGluZGlvX2Rldi0+Y3VycmVudG1vZGUgPT0gSU5ESU9fQlVGRkVSX1RSSUdHRVJFRCkKKwkJCXJldCA9IGxpczNsMDJkcV9yZWFkX2FjY2VsX2Zyb21fYnVmZmVyKGluZGlvX2Rldi0+CisJCQkJCQkJICAgICAgIGJ1ZmZlciwKKwkJCQkJCQkgICAgICAgY2hhbi0+c2Nhbl9pbmRleCwKKwkJCQkJCQkgICAgICAgdmFsKTsKIAkJZWxzZSB7CiAJCQlyZWcgPSBsaXMzbDAyZHFfYXhpc19tYXAKIAkJCQlbTElTM0wwMkRRX0FDQ0VMXVtjaGFuLT5hZGRyZXNzXTsKQEAgLTQ1Myw1NSArNDUzLDU1IEBACiAJCQkJICZ0KTsKIAogCWlmICh0ICYgTElTM0wwMkRRX1JFR19XQUtFX1VQX1NSQ19JTlRFUlJVUFRfWl9ISUdIKQotCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsIDAsCi0JCQkgICAgICAgSUlPX01PRF9FVkVOVF9DT0RFKElJT19FVl9DTEFTU19BQ0NFTCwKKwkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LAorCQkJICAgICAgIElJT19NT0RfRVZFTlRfQ09ERShJSU9fQUNDRUwsCiAJCQkJCQkgIDAsCi0JCQkJCQkgIElJT19FVl9NT0RfWiwKKwkJCQkJCSAgSUlPX01PRF9aLAogCQkJCQkJICBJSU9fRVZfVFlQRV9USFJFU0gsCiAJCQkJCQkgIElJT19FVl9ESVJfUklTSU5HKSwKIAkJCSAgICAgICB0aW1lc3RhbXApOwogCiAJaWYgKHQgJiBMSVMzTDAyRFFfUkVHX1dBS0VfVVBfU1JDX0lOVEVSUlVQVF9aX0xPVykKLQkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LCAwLAotCQkJICAgICAgIElJT19NT0RfRVZFTlRfQ09ERShJSU9fRVZfQ0xBU1NfQUNDRUwsCisJCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwKKwkJCSAgICAgICBJSU9fTU9EX0VWRU5UX0NPREUoSUlPX0FDQ0VMLAogCQkJCQkJICAwLAotCQkJCQkJICBJSU9fRVZfTU9EX1osCisJCQkJCQkgIElJT19NT0RfWiwKIAkJCQkJCSAgSUlPX0VWX1RZUEVfVEhSRVNILAogCQkJCQkJICBJSU9fRVZfRElSX0ZBTExJTkcpLAogCQkJICAgICAgIHRpbWVzdGFtcCk7CiAKIAlpZiAodCAmIExJUzNMMDJEUV9SRUdfV0FLRV9VUF9TUkNfSU5URVJSVVBUX1lfSElHSCkKLQkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LCAwLAotCQkJICAgICAgIElJT19NT0RfRVZFTlRfQ09ERShJSU9fRVZfQ0xBU1NfQUNDRUwsCisJCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwKKwkJCSAgICAgICBJSU9fTU9EX0VWRU5UX0NPREUoSUlPX0FDQ0VMLAogCQkJCQkJICAwLAotCQkJCQkJICBJSU9fRVZfTU9EX1ksCisJCQkJCQkgIElJT19NT0RfWSwKIAkJCQkJCSAgSUlPX0VWX1RZUEVfVEhSRVNILAogCQkJCQkJICBJSU9fRVZfRElSX1JJU0lORyksCiAJCQkgICAgICAgdGltZXN0YW1wKTsKIAogCWlmICh0ICYgTElTM0wwMkRRX1JFR19XQUtFX1VQX1NSQ19JTlRFUlJVUFRfWV9MT1cpCi0JCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwgMCwKLQkJCSAgICAgICBJSU9fTU9EX0VWRU5UX0NPREUoSUlPX0VWX0NMQVNTX0FDQ0VMLAorCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsCisJCQkgICAgICAgSUlPX01PRF9FVkVOVF9DT0RFKElJT19BQ0NFTCwKIAkJCQkJCSAgMCwKLQkJCQkJCSAgSUlPX0VWX01PRF9ZLAorCQkJCQkJICBJSU9fTU9EX1ksCiAJCQkJCQkgIElJT19FVl9UWVBFX1RIUkVTSCwKIAkJCQkJCSAgSUlPX0VWX0RJUl9GQUxMSU5HKSwKIAkJCSAgICAgICB0aW1lc3RhbXApOwogCiAJaWYgKHQgJiBMSVMzTDAyRFFfUkVHX1dBS0VfVVBfU1JDX0lOVEVSUlVQVF9YX0hJR0gpCi0JCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwgMCwKLQkJCSAgICAgICBJSU9fTU9EX0VWRU5UX0NPREUoSUlPX0VWX0NMQVNTX0FDQ0VMLAorCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsCisJCQkgICAgICAgSUlPX01PRF9FVkVOVF9DT0RFKElJT19BQ0NFTCwKIAkJCQkJCSAgMCwKLQkJCQkJCSAgSUlPX0VWX01PRF9YLAorCQkJCQkJICBJSU9fTU9EX1gsCiAJCQkJCQkgIElJT19FVl9UWVBFX1RIUkVTSCwKIAkJCQkJCSAgSUlPX0VWX0RJUl9SSVNJTkcpLAogCQkJICAgICAgIHRpbWVzdGFtcCk7CiAKIAlpZiAodCAmIExJUzNMMDJEUV9SRUdfV0FLRV9VUF9TUkNfSU5URVJSVVBUX1hfTE9XKQotCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsIDAsCi0JCQkgICAgICAgSUlPX01PRF9FVkVOVF9DT0RFKElJT19FVl9DTEFTU19BQ0NFTCwKKwkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LAorCQkJICAgICAgIElJT19NT0RfRVZFTlRfQ09ERShJSU9fQUNDRUwsCiAJCQkJCQkgIDAsCi0JCQkJCQkgIElJT19FVl9NT0RfWCwKKwkJCQkJCSAgSUlPX01PRF9YLAogCQkJCQkJICBJSU9fRVZfVFlQRV9USFJFU0gsCiAJCQkJCQkgIElJT19FVl9ESVJfRkFMTElORyksCiAJCQkgICAgICAgdGltZXN0YW1wKTsKQEAgLTUzNSw3ICs1MzUsNyBAQAogCiAKIHN0YXRpYyBzc2l6ZV90IGxpczNsMDJkcV9yZWFkX2V2ZW50X2NvbmZpZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAotCQkJCQkgICBpbnQgZXZlbnRfY29kZSkKKwkJCQkJICAgdTY0IGV2ZW50X2NvZGUpCiB7CiAKIAl1OCB2YWw7CkBAIC01ODcsNyArNTg3LDcgQEAKIH0KIAogc3RhdGljIGludCBsaXMzbDAyZHFfd3JpdGVfZXZlbnRfY29uZmlnKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCi0JCQkJCWludCBldmVudF9jb2RlLAorCQkJCQl1NjQgZXZlbnRfY29kZSwKIAkJCQkJaW50IHN0YXRlKQogewogCWludCByZXQgPSAwOwpAQCAtNjUyLDcgKzY1Miw2IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGxpczNsMDJkcV9pbmZvID0gewotCS5udW1faW50ZXJydXB0X2xpbmVzID0gMSwKIAkucmVhZF9yYXcgPSAmbGlzM2wwMmRxX3JlYWRfcmF3LAogCS53cml0ZV9yYXcgPSAmbGlzM2wwMmRxX3dyaXRlX3JhdywKIAkucmVhZF9ldmVudF92YWx1ZSA9ICZsaXMzbDAyZHFfcmVhZF90aHJlc2gsCkBAIC02NjUsNyArNjY0LDcgQEAKIAogc3RhdGljIGludCBfX2RldmluaXQgbGlzM2wwMmRxX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7Ci0JaW50IHJldCwgcmVnZG9uZSA9IDA7CisJaW50IHJldDsKIAlzdHJ1Y3QgbGlzM2wwMmRxX3N0YXRlICpzdDsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OwogCkBAIC02ODgsMjEgKzY4NywxNiBAQAogCiAJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOwogCi0JcmV0ID0gbGlzM2wwMmRxX2NvbmZpZ3VyZV9yaW5nKGluZGlvX2Rldik7CisJcmV0ID0gbGlzM2wwMmRxX2NvbmZpZ3VyZV9idWZmZXIoaW5kaW9fZGV2KTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX2ZyZWVfZGV2OwogCi0JcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKLQlyZWdkb25lID0gMTsKLQotCXJldCA9IGlpb19yaW5nX2J1ZmZlcl9yZWdpc3Rlcl9leChpbmRpb19kZXYtPnJpbmcsIDAsCi0JCQkJCSAgbGlzM2wwMmRxX2NoYW5uZWxzLAotCQkJCQkgIEFSUkFZX1NJWkUobGlzM2wwMmRxX2NoYW5uZWxzKSk7CisJcmV0ID0gaWlvX2J1ZmZlcl9yZWdpc3RlcihpbmRpb19kZXYsCisJCQkJICBsaXMzbDAyZHFfY2hhbm5lbHMsCisJCQkJICBBUlJBWV9TSVpFKGxpczNsMDJkcV9jaGFubmVscykpOwogCWlmIChyZXQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7Ci0JCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKKwkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgYnVmZmVyXG4iKTsKKwkJZ290byBlcnJvcl91bnJlZ19idWZmZXJfZnVuY3M7CiAJfQogCiAJaWYgKHNwaS0+aXJxICYmIGdwaW9faXNfdmFsaWQoaXJxX3RvX2dwaW8oc3BpLT5pcnEpKSA+IDApIHsKQEAgLTcxMyw3ICs3MDcsNyBAQAogCQkJCQkgICAibGlzM2wwMmRxIiwKIAkJCQkJICAgaW5kaW9fZGV2KTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc7CisJCQlnb3RvIGVycm9yX3VuaW5pdGlhbGl6ZV9idWZmZXI7CiAKIAkJcmV0ID0gbGlzM2wwMmRxX3Byb2JlX3RyaWdnZXIoaW5kaW9fZGV2KTsKIAkJaWYgKHJldCkKQEAgLTcyNCwyMyArNzE4LDI1IEBACiAJcmV0ID0gbGlzM2wwMmRxX2luaXRpYWxfc2V0dXAoaW5kaW9fZGV2KTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmVtb3ZlX3RyaWdnZXI7CisKIAlyZXR1cm4gMDsKIAogZXJyb3JfcmVtb3ZlX3RyaWdnZXI6Ci0JaWYgKGluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19SSU5HX1RSSUdHRVJFRCkKKwlpZiAoaW5kaW9fZGV2LT5tb2RlcyAmIElORElPX0JVRkZFUl9UUklHR0VSRUQpCiAJCWxpczNsMDJkcV9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOwogZXJyb3JfZnJlZV9pbnRlcnJ1cHQ6CiAJaWYgKHNwaS0+aXJxICYmIGdwaW9faXNfdmFsaWQoaXJxX3RvX2dwaW8oc3BpLT5pcnEpKSA+IDApCiAJCWZyZWVfaXJxKHN0LT51cy0+aXJxLCBpbmRpb19kZXYpOwotZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc6Ci0JaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2LT5yaW5nKTsKLWVycm9yX3VucmVnX3JpbmdfZnVuY3M6Ci0JbGlzM2wwMmRxX3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKK2Vycm9yX3VuaW5pdGlhbGl6ZV9idWZmZXI6CisJaWlvX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldik7CitlcnJvcl91bnJlZ19idWZmZXJfZnVuY3M6CisJbGlzM2wwMmRxX3VuY29uZmlndXJlX2J1ZmZlcihpbmRpb19kZXYpOwogZXJyb3JfZnJlZV9kZXY6Ci0JaWYgKHJlZ2RvbmUpCi0JCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwotCWVsc2UKLQkJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiBlcnJvcl9yZXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTc3OCw2ICs3NzQsOCBAQAogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKIAlzdHJ1Y3QgbGlzM2wwMmRxX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwogCXJldCA9IGxpczNsMDJkcV9kaXNhYmxlX2FsbF9ldmVudHMoaW5kaW9fZGV2KTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9yZXQ7CkBAIC03OTAsMTIgKzc4OCwxMCBAQAogCQlmcmVlX2lycShzdC0+dXMtPmlycSwgaW5kaW9fZGV2KTsKIAogCWxpczNsMDJkcV9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOwotCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldi0+cmluZyk7Ci0JbGlzM2wwMmRxX3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKLQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlsaXMzbDAyZHFfdW5jb25maWd1cmVfYnVmZmVyKGluZGlvX2Rldik7CiAKLQlyZXR1cm4gMDsKLQorCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogZXJyX3JldDoKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9saXMzbDAyZHFfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9saXMzbDAyZHFfcmluZy5jCmluZGV4IDhkNWM4YWMuLjVjNTQyZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvbGlzM2wwMmRxX3JpbmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcV9yaW5nLmMKQEAgLTEsMTkgKzEsMTUgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKLSNpbmNsdWRlICIuLi9zeXNmcy5oIgogI2luY2x1ZGUgIi4uL3Jpbmdfc3cuaCIKICNpbmNsdWRlICIuLi9rZmlmb19idWYuaCIKLSNpbmNsdWRlICJhY2NlbC5oIgogI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKKyNpbmNsdWRlICIuLi90cmlnZ2VyX2NvbnN1bWVyLmgiCiAjaW5jbHVkZSAibGlzM2wwMmRxLmgiCiAKIC8qKgpAQCAtNDIsMzEgKzM4LDMyIEBACiB9CiAKIC8qKgotICogbGlzM2wwMmRxX3JlYWRfYWNjZWxfZnJvbV9yaW5nKCkgaW5kaXZpZHVhbCBhY2NlbGVyYXRpb24gcmVhZCBmcm9tIHJpbmcKKyAqIGxpczNsMDJkcV9yZWFkX2FjY2VsX2Zyb21fYnVmZmVyKCkgaW5kaXZpZHVhbCBhY2NlbGVyYXRpb24gcmVhZCBmcm9tIGJ1ZmZlcgogICoqLwotc3NpemVfdCBsaXMzbDAyZHFfcmVhZF9hY2NlbF9mcm9tX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZywKLQkJCQkgICAgICAgaW50IGluZGV4LAotCQkJCSAgICAgICBpbnQgKnZhbCkKK3NzaXplX3QgbGlzM2wwMmRxX3JlYWRfYWNjZWxfZnJvbV9idWZmZXIoc3RydWN0IGlpb19idWZmZXIgKmJ1ZmZlciwKKwkJCQkJIGludCBpbmRleCwKKwkJCQkJIGludCAqdmFsKQogewogCWludCByZXQ7CiAJczE2ICpkYXRhOwogCi0JaWYgKCFpaW9fc2Nhbl9tYXNrX3F1ZXJ5KHJpbmcsIGluZGV4KSkKKwlpZiAoIWlpb19zY2FuX21hc2tfcXVlcnkoYnVmZmVyLCBpbmRleCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCFyaW5nLT5hY2Nlc3MtPnJlYWRfbGFzdCkKKwlpZiAoIWJ1ZmZlci0+YWNjZXNzLT5yZWFkX2xhc3QpCiAJCXJldHVybiAtRUJVU1k7CiAKLQlkYXRhID0ga21hbGxvYyhyaW5nLT5hY2Nlc3MtPmdldF9ieXRlc19wZXJfZGF0dW0ocmluZyksCisJZGF0YSA9IGttYWxsb2MoYnVmZmVyLT5hY2Nlc3MtPmdldF9ieXRlc19wZXJfZGF0dW0oYnVmZmVyKSwKIAkJICAgICAgIEdGUF9LRVJORUwpOwogCWlmIChkYXRhID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcmV0ID0gcmluZy0+YWNjZXNzLT5yZWFkX2xhc3QocmluZywgKHU4ICopZGF0YSk7CisJcmV0ID0gYnVmZmVyLT5hY2Nlc3MtPnJlYWRfbGFzdChidWZmZXIsICh1OCAqKWRhdGEpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfZnJlZV9kYXRhOwotCSp2YWwgPSBkYXRhW2JpdG1hcF93ZWlnaHQoJnJpbmctPnNjYW5fbWFzaywgaW5kZXgpXTsKKwkqdmFsID0gZGF0YVtiaXRtYXBfd2VpZ2h0KGJ1ZmZlci0+c2Nhbl9tYXNrLCBpbmRleCldOwogZXJyb3JfZnJlZV9kYXRhOgorCiAJa2ZyZWUoZGF0YSk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtODksMTMgKzg2LDEzIEBACiAgKiovCiBzdGF0aWMgaW50IGxpczNsMDJkcV9yZWFkX2FsbChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCB1OCAqcnhfYXJyYXkpCiB7Ci0Jc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+cmluZzsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyID0gaW5kaW9fZGV2LT5idWZmZXI7CiAJc3RydWN0IGxpczNsMDJkcV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXJzOwogCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CiAJaW50IHJldCwgaSwgaiA9IDA7CiAKLQl4ZmVycyA9IGt6YWxsb2MoKHJpbmctPnNjYW5fY291bnQpICogMgorCXhmZXJzID0ga3phbGxvYygoYnVmZmVyLT5zY2FuX2NvdW50KSAqIDIKIAkJCSogc2l6ZW9mKCp4ZmVycyksIEdGUF9LRVJORUwpOwogCWlmICgheGZlcnMpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTAzLDcgKzEwMCw3IEBACiAJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlYWRfYWxsX3R4X2FycmF5KS80OyBpKyspCi0JCWlmIChyaW5nLT5zY2FuX21hc2sgJiAoMSA8PCBpKSkgeworCQlpZiAodGVzdF9iaXQoaSwgYnVmZmVyLT5zY2FuX21hc2spKSB7CiAJCQkvKiBsb3dlciBieXRlICovCiAJCQl4ZmVyc1tqXS50eF9idWYgPSBzdC0+dHggKyAyKmo7CiAJCQlzdC0+dHhbMipqXSA9IHJlYWRfYWxsX3R4X2FycmF5W2kqNF07CkBAIC0xMzEsNyArMTI4LDcgQEAKIAkgKiB2YWx1ZXMgaW4gYWx0ZXJuYXRlIGJ5dGVzCiAJICovCiAJc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKLQlmb3IgKGogPSAwOyBqIDwgcmluZy0+c2Nhbl9jb3VudCAqIDI7IGorKykKKwlmb3IgKGogPSAwOyBqIDwgYnVmZmVyLT5zY2FuX2NvdW50ICogMjsgaisrKQogCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbal0sICZtc2cpOwogCiAJcmV0ID0gc3BpX3N5bmMoc3QtPnVzLCAmbXNnKTsKQEAgLTE0MSwyMCArMTM4LDIwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBsaXMzbDAyZHFfZ2V0X3JpbmdfZWxlbWVudChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorc3RhdGljIGludCBsaXMzbDAyZHFfZ2V0X2J1ZmZlcl9lbGVtZW50KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCiAJCQkJdTggKmJ1ZikKIHsKIAlpbnQgcmV0LCBpOwogCXU4ICpyeF9hcnJheSA7CiAJczE2ICpkYXRhID0gKHMxNiAqKWJ1ZjsKIAotCXJ4X2FycmF5ID0ga3phbGxvYyg0ICogKGluZGlvX2Rldi0+cmluZy0+c2Nhbl9jb3VudCksIEdGUF9LRVJORUwpOworCXJ4X2FycmF5ID0ga3phbGxvYyg0ICogKGluZGlvX2Rldi0+YnVmZmVyLT5zY2FuX2NvdW50KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJ4X2FycmF5ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCXJldCA9IGxpczNsMDJkcV9yZWFkX2FsbChpbmRpb19kZXYsIHJ4X2FycmF5KTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKLQlmb3IgKGkgPSAwOyBpIDwgaW5kaW9fZGV2LT5yaW5nLT5zY2FuX2NvdW50OyBpKyspCisJZm9yIChpID0gMDsgaSA8IGluZGlvX2Rldi0+YnVmZmVyLT5zY2FuX2NvdW50OyBpKyspCiAJCWRhdGFbaV0gPSBjb21iaW5lXzhfdG9fMTYocnhfYXJyYXlbaSo0KzFdLAogCQkJCQlyeF9hcnJheVtpKjQrM10pOwogCWtmcmVlKHJ4X2FycmF5KTsKQEAgLTE2NSwyNyArMTYyLDI3IEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgbGlzM2wwMmRxX3RyaWdnZXJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwKQogewogCXN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZiA9IHA7Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+cmluZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPmluZGlvX2RldjsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyID0gaW5kaW9fZGV2LT5idWZmZXI7CiAJaW50IGxlbiA9IDA7Ci0Jc2l6ZV90IGRhdGFzaXplID0gcmluZy0+YWNjZXNzLT5nZXRfYnl0ZXNfcGVyX2RhdHVtKHJpbmcpOworCXNpemVfdCBkYXRhc2l6ZSA9IGJ1ZmZlci0+YWNjZXNzLT5nZXRfYnl0ZXNfcGVyX2RhdHVtKGJ1ZmZlcik7CiAJY2hhciAqZGF0YSA9IGttYWxsb2MoZGF0YXNpemUsIEdGUF9LRVJORUwpOwogCiAJaWYgKGRhdGEgPT0gTlVMTCkgewogCQlkZXZfZXJyKGluZGlvX2Rldi0+ZGV2LnBhcmVudCwKLQkJCSJtZW1vcnkgYWxsb2MgZmFpbGVkIGluIHJpbmcgYmgiKTsKKwkJCSJtZW1vcnkgYWxsb2MgZmFpbGVkIGluIGJ1ZmZlciBiaCIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlpZiAocmluZy0+c2Nhbl9jb3VudCkKLQkJbGVuID0gbGlzM2wwMmRxX2dldF9yaW5nX2VsZW1lbnQoaW5kaW9fZGV2LCBkYXRhKTsKKwlpZiAoYnVmZmVyLT5zY2FuX2NvdW50KQorCQlsZW4gPSBsaXMzbDAyZHFfZ2V0X2J1ZmZlcl9lbGVtZW50KGluZGlvX2RldiwgZGF0YSk7CiAKIAkgIC8qIEd1YXJhbnRlZWQgdG8gYmUgYWxpZ25lZCB3aXRoIDggYnl0ZSBib3VuZGFyeSAqLwotCWlmIChyaW5nLT5zY2FuX3RpbWVzdGFtcCkKKwlpZiAoYnVmZmVyLT5zY2FuX3RpbWVzdGFtcCkKIAkJKihzNjQgKikoKChwaHlzX2FkZHJfdClkYXRhICsgbGVuCiAJCQkJKyBzaXplb2YoczY0KSAtIDEpICYgfihzaXplb2YoczY0KSAtIDEpKQogCQkJPSBwZi0+dGltZXN0YW1wOwotCXJpbmctPmFjY2Vzcy0+c3RvcmVfdG8ocmluZywgKHU4ICopZGF0YSwgcGYtPnRpbWVzdGFtcCk7CisJYnVmZmVyLT5hY2Nlc3MtPnN0b3JlX3RvKGJ1ZmZlciwgKHU4ICopZGF0YSwgcGYtPnRpbWVzdGFtcCk7CiAKIAlpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShpbmRpb19kZXYtPnRyaWcpOwogCWtmcmVlKGRhdGEpOwpAQCAtMjU4LDcgKzI1NSw3IEBACiAgKgogICogSWYgZGlzYWJsaW5nIHRoZSBpbnRlcnJ1cHQgYWxzbyBkb2VzIGEgZmluYWwgcmVhZCB0byBlbnN1cmUgaXQgaXMgY2xlYXIuCiAgKiBUaGlzIGlzIG9ubHkgaW1wb3J0YW50IGluIHNvbWUgY2FzZXMgd2hlcmUgdGhlIHNjYW4gZW5hYmxlIGVsZW1lbnRzIGFyZQotICogc3dpdGNoZWQgYmVmb3JlIHRoZSByaW5nIGlzIHJlZW5hYmxlZC4KKyAqIHN3aXRjaGVkIGJlZm9yZSB0aGUgYnVmZmVyIGlzIHJlZW5hYmxlZC4KICAqKi8KIHN0YXRpYyBpbnQgbGlzM2wwMmRxX2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywKIAkJCQkJCWJvb2wgc3RhdGUpCkBAIC0zMDYsNiArMzAzLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX3RyaWdnZXJfb3BzIGxpczNsMDJkcV90cmlnZ2VyX29wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuc2V0X3RyaWdnZXJfc3RhdGUgPSAmbGlzM2wwMmRxX2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlLAorCS50cnlfcmVlbmFibGUgPSAmbGlzM2wwMmRxX3RyaWdfdHJ5X3JlZW4sCit9OworCiBpbnQgbGlzM2wwMmRxX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKIAlpbnQgcmV0OwpAQCAtMzE4LDEwICszMjEsOCBAQAogCX0KIAogCXN0LT50cmlnLT5kZXYucGFyZW50ID0gJnN0LT51cy0+ZGV2OwotCXN0LT50cmlnLT5vd25lciA9IFRISVNfTU9EVUxFOworCXN0LT50cmlnLT5vcHMgPSAmbGlzM2wwMmRxX3RyaWdnZXJfb3BzOwogCXN0LT50cmlnLT5wcml2YXRlX2RhdGEgPSBpbmRpb19kZXY7Ci0Jc3QtPnRyaWctPnNldF90cmlnZ2VyX3N0YXRlID0gJmxpczNsMDJkcV9kYXRhX3JkeV90cmlnZ2VyX3NldF9zdGF0ZTsKLQlzdC0+dHJpZy0+dHJ5X3JlZW5hYmxlID0gJmxpczNsMDJkcV90cmlnX3RyeV9yZWVuOwogCXJldCA9IGlpb190cmlnZ2VyX3JlZ2lzdGVyKHN0LT50cmlnKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX2ZyZWVfdHJpZzsKQEAgLTM0MiwxMyArMzQzLDEzIEBACiAJaWlvX2ZyZWVfdHJpZ2dlcihzdC0+dHJpZyk7CiB9CiAKLXZvaWQgbGlzM2wwMmRxX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3ZvaWQgbGlzM2wwMmRxX3VuY29uZmlndXJlX2J1ZmZlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCWlpb19kZWFsbG9jX3BvbGxmdW5jKGluZGlvX2Rldi0+cG9sbGZ1bmMpOwotCWxpczNsMDJkcV9mcmVlX2J1ZihpbmRpb19kZXYtPnJpbmcpOworCWxpczNsMDJkcV9mcmVlX2J1ZihpbmRpb19kZXYtPmJ1ZmZlcik7CiB9CiAKLXN0YXRpYyBpbnQgbGlzM2wwMmRxX3JpbmdfcG9zdGVuYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQorc3RhdGljIGludCBsaXMzbDAyZHFfYnVmZmVyX3Bvc3RlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKIAkvKiBEaXNhYmxlIHVud2FudGVkIGNoYW5uZWxzIG90aGVyd2lzZSB0aGUgaW50ZXJydXB0IHdpbGwgbm90IGNsZWFyICovCiAJdTggdDsKQEAgLTM2MSwxNyArMzYyLDE3IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9yZXQ7CiAKLQlpZiAoaWlvX3NjYW5fbWFza19xdWVyeShpbmRpb19kZXYtPnJpbmcsIDApKSB7CisJaWYgKGlpb19zY2FuX21hc2tfcXVlcnkoaW5kaW9fZGV2LT5idWZmZXIsIDApKSB7CiAJCXQgfD0gTElTM0wwMkRRX1JFR19DVFJMXzFfQVhFU19YX0VOQUJMRTsKIAkJb25lZW5hYmxlZCA9IHRydWU7CiAJfSBlbHNlCiAJCXQgJj0gfkxJUzNMMDJEUV9SRUdfQ1RSTF8xX0FYRVNfWF9FTkFCTEU7Ci0JaWYgKGlpb19zY2FuX21hc2tfcXVlcnkoaW5kaW9fZGV2LT5yaW5nLCAxKSkgeworCWlmIChpaW9fc2Nhbl9tYXNrX3F1ZXJ5KGluZGlvX2Rldi0+YnVmZmVyLCAxKSkgewogCQl0IHw9IExJUzNMMDJEUV9SRUdfQ1RSTF8xX0FYRVNfWV9FTkFCTEU7CiAJCW9uZWVuYWJsZWQgPSB0cnVlOwogCX0gZWxzZQogCQl0ICY9IH5MSVMzTDAyRFFfUkVHX0NUUkxfMV9BWEVTX1lfRU5BQkxFOwotCWlmIChpaW9fc2Nhbl9tYXNrX3F1ZXJ5KGluZGlvX2Rldi0+cmluZywgMikpIHsKKwlpZiAoaWlvX3NjYW5fbWFza19xdWVyeShpbmRpb19kZXYtPmJ1ZmZlciwgMikpIHsKIAkJdCB8PSBMSVMzTDAyRFFfUkVHX0NUUkxfMV9BWEVTX1pfRU5BQkxFOwogCQlvbmVlbmFibGVkID0gdHJ1ZTsKIAl9IGVsc2UKQEAgLTM4NSwxOCArMzg2LDE4IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9yZXQ7CiAKLQlyZXR1cm4gaWlvX3RyaWdnZXJlZF9yaW5nX3Bvc3RlbmFibGUoaW5kaW9fZGV2KTsKKwlyZXR1cm4gaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZShpbmRpb19kZXYpOwogZXJyb3JfcmV0OgogCXJldHVybiByZXQ7CiB9CiAKIC8qIFR1cm4gYWxsIGNoYW5uZWxzIG9uIGFnYWluICovCi1zdGF0aWMgaW50IGxpczNsMDJkcV9yaW5nX3ByZWRpc2FibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3N0YXRpYyBpbnQgbGlzM2wwMmRxX2J1ZmZlcl9wcmVkaXNhYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJdTggdDsKIAlpbnQgcmV0OwogCi0JcmV0ID0gaWlvX3RyaWdnZXJlZF9yaW5nX3ByZWRpc2FibGUoaW5kaW9fZGV2KTsKKwlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNhYmxlKGluZGlvX2Rldik7CiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9yZXQ7CiAKQEAgLTQxNywzNCArNDE4LDI5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fcmluZ19zZXR1cF9vcHMgbGlzM2wwMmRxX3Jpbmdfc2V0dXBfb3BzID0gewotCS5wcmVlbmFibGUgPSAmaWlvX3N3X3JpbmdfcHJlZW5hYmxlLAotCS5wb3N0ZW5hYmxlID0gJmxpczNsMDJkcV9yaW5nX3Bvc3RlbmFibGUsCi0JLnByZWRpc2FibGUgPSAmbGlzM2wwMmRxX3JpbmdfcHJlZGlzYWJsZSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMgbGlzM2wwMmRxX2J1ZmZlcl9zZXR1cF9vcHMgPSB7CisJLnByZWVuYWJsZSA9ICZpaW9fc3dfYnVmZmVyX3ByZWVuYWJsZSwKKwkucG9zdGVuYWJsZSA9ICZsaXMzbDAyZHFfYnVmZmVyX3Bvc3RlbmFibGUsCisJLnByZWRpc2FibGUgPSAmbGlzM2wwMmRxX2J1ZmZlcl9wcmVkaXNhYmxlLAogfTsKIAotaW50IGxpczNsMDJkcV9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoraW50IGxpczNsMDJkcV9jb25maWd1cmVfYnVmZmVyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nOworCXN0cnVjdCBpaW9fYnVmZmVyICpidWZmZXI7CiAKLQlyaW5nID0gbGlzM2wwMmRxX2FsbG9jX2J1ZihpbmRpb19kZXYpOwotCWlmICghcmluZykKKwlidWZmZXIgPSBsaXMzbDAyZHFfYWxsb2NfYnVmKGluZGlvX2Rldik7CisJaWYgKCFidWZmZXIpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaW5kaW9fZGV2LT5yaW5nID0gcmluZzsKLQkvKiBFZmZlY3RpdmVseSBzZWxlY3QgdGhlIHJpbmcgYnVmZmVyIGltcGxlbWVudGF0aW9uICovCi0JaW5kaW9fZGV2LT5yaW5nLT5hY2Nlc3MgPSAmbGlzM2wwMmRxX2FjY2Vzc19mdW5jczsKLQlyaW5nLT5icGUgPSAyOworCWluZGlvX2Rldi0+YnVmZmVyID0gYnVmZmVyOworCS8qIEVmZmVjdGl2ZWx5IHNlbGVjdCB0aGUgYnVmZmVyIGltcGxlbWVudGF0aW9uICovCisJaW5kaW9fZGV2LT5idWZmZXItPmFjY2VzcyA9ICZsaXMzbDAyZHFfYWNjZXNzX2Z1bmNzOworCWJ1ZmZlci0+YnBlID0gMjsKIAotCXJpbmctPnNjYW5fdGltZXN0YW1wID0gdHJ1ZTsKLQlyaW5nLT5zZXR1cF9vcHMgPSAmbGlzM2wwMmRxX3Jpbmdfc2V0dXBfb3BzOwotCXJpbmctPm93bmVyID0gVEhJU19NT0RVTEU7Ci0KLQkvKiBTZXQgZGVmYXVsdCBzY2FuIG1vZGUgKi8KLQlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCAwKTsKLQlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCAxKTsKLQlpaW9fc2Nhbl9tYXNrX3NldChyaW5nLCAyKTsKKwlidWZmZXItPnNjYW5fdGltZXN0YW1wID0gdHJ1ZTsKKwlidWZmZXItPnNldHVwX29wcyA9ICZsaXMzbDAyZHFfYnVmZmVyX3NldHVwX29wczsKKwlidWZmZXItPm93bmVyID0gVEhJU19NT0RVTEU7CiAKIAkvKiBGdW5jdGlvbnMgYXJlIE5VTEwgYXMgd2Ugc2V0IGhhbmRsZXIgYmVsb3cgKi8KIAlpbmRpb19kZXYtPnBvbGxmdW5jID0gaWlvX2FsbG9jX3BvbGxmdW5jKCZpaW9fcG9sbGZ1bmNfc3RvcmVfdGltZSwKQEAgLTQ1OSwxMCArNDU1LDEwIEBACiAJCWdvdG8gZXJyb3JfaWlvX3N3X3JiX2ZyZWU7CiAJfQogCi0JaW5kaW9fZGV2LT5tb2RlcyB8PSBJTkRJT19SSU5HX1RSSUdHRVJFRDsKKwlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX0JVRkZFUl9UUklHR0VSRUQ7CiAJcmV0dXJuIDA7CiAKIGVycm9yX2lpb19zd19yYl9mcmVlOgotCWxpczNsMDJkcV9mcmVlX2J1ZihpbmRpb19kZXYtPnJpbmcpOworCWxpczNsMDJkcV9mcmVlX2J1ZihpbmRpb19kZXYtPmJ1ZmZlcik7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwLmgKaW5kZXggMWUzOTZjZS4uYWQzOGRkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwLmgKQEAgLTIyMSw3ICsyMjEsNyBAQAogICoqLwogaW50IHNjYTMwMDBfd3JpdGVfcmVnKHN0cnVjdCBzY2EzMDAwX3N0YXRlICpzdCwgdTggYWRkcmVzcywgdTggdmFsKTsKIAotI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKKyNpZmRlZiBDT05GSUdfSUlPX0JVRkZFUgogLyoqCiAgKiBzY2EzMDAwX3JlZ2lzdGVyX3JpbmdfZnVuY3MoKSBzZXR1cCB0aGUgcmluZyBzdGF0ZSBjaGFuZ2UgZnVuY3Rpb25zCiAgKiovCkBAIC0yNDgsNyArMjQ4LDcgQEAKICAqIHNjYTMwMDBfcmluZ19pbnRfcHJvY2VzcygpIGhhbmRsZXMgcmluZyByZWxhdGVkIGV2ZW50IHB1c2hpbmcgYW5kIGVzY2FsYXRpb24KICAqIEB2YWw6CXRoZSBldmVudCBjb2RlCiAgKiovCi12b2lkIHNjYTMwMDBfcmluZ19pbnRfcHJvY2Vzcyh1OCB2YWwsIHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwordm9pZCBzY2EzMDAwX3JpbmdfaW50X3Byb2Nlc3ModTggdmFsLCBzdHJ1Y3QgaWlvX2J1ZmZlciAqcmluZyk7CiAKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgc2NhMzAwMF9yZWdpc3Rlcl9yaW5nX2Z1bmNzKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX2NvcmUuYwppbmRleCA2MDNmNWJjLi5hNDRhNzA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMF9jb3JlLmMKQEAgLTExLDE4ICsxMSwxNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vc3lzZnMuaCIKLSNpbmNsdWRlICIuLi9yaW5nX2dlbmVyaWMuaCIKKyNpbmNsdWRlICIuLi9idWZmZXJfZ2VuZXJpYy5oIgogCi0jaW5jbHVkZSAiYWNjZWwuaCIKICNpbmNsdWRlICJzY2EzMDAwLmgiCiAKIGVudW0gc2NhMzAwMF92YXJpYW50IHsKQEAgLTI2OCw4ICsyNjcsOCBAQAogCQkJCWNoYXIgKmJ1ZikKIHsKIAlpbnQgbGVuID0gMCwgcmV0OwotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBzY2EzMDAwX3N0YXRlICpzdCA9IGlpb19wcml2KGRldl9pbmZvKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNjYTMwMDBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAogCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKIAlyZXQgPSBzY2EzMDAwX3JlYWRfZGF0YV9zaG9ydChzdCwgU0NBMzAwMF9SRUdfQUREUl9SRVZJRCwgMSk7CkBAIC0yOTYsOCArMjk1LDggQEAKIAkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkgY2hhciAqYnVmKQogewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBzY2EzMDAwX3N0YXRlICpzdCA9IGlpb19wcml2KGRldl9pbmZvKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNjYTMwMDBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlpbnQgbGVuID0gMDsKIAogCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIjAgLSBub3JtYWwgbW9kZSIpOwpAQCAtMzI4LDggKzMyNyw4IEBACiAJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgICAgIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3Qgc2NhMzAwMF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihkZXZfaW5mbyk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzY2EzMDAwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJaW50IGxlbiA9IDAsIHJldDsKIAogCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKQEAgLTM3OSw4ICszNzgsOCBAQAogCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKIAkJCSAgICAgICBzaXplX3QgbGVuKQogewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBzY2EzMDAwX3N0YXRlICpzdCA9IGlpb19wcml2KGRldl9pbmZvKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNjYTMwMDBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlpbnQgcmV0OwogCWludCBtYXNrID0gMHgwMzsKIAlsb25nIHZhbDsKQEAgLTQyMiw3ICs0MjEsNyBAQAogCiAvKiBNb3JlIHN0YW5kYXJkIGF0dHJpYnV0ZXMgKi8KIAotc3RhdGljIElJT19ERVZfQVRUUl9SRVYoc2NhMzAwMF9zaG93X3Jldik7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHJldmlzaW9uLCBTX0lSVUdPLCBzY2EzMDAwX3Nob3dfcmV2LCBOVUxMLCAwKTsKIAogI2RlZmluZSBTQ0EzMDAwX0lORk9fTUFTSwkJCVwKIAkoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCkKQEAgLTY5NSw3ICs2OTQsNyBAQAogICogc2NhMzAwMF9yZWFkX3RocmVzaCgpIC0gcXVlcnkgb2YgYSB0aHJlc2hvbGQKICAqKi8KIHN0YXRpYyBpbnQgc2NhMzAwMF9yZWFkX3RocmVzaChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAotCQkJICAgICAgIGludCBlLAorCQkJICAgICAgIHU2NCBlLAogCQkJICAgICAgIGludCAqdmFsKQogewogCWludCByZXQsIGk7CkBAIC03MjMsOCArNzIyLDggQEAKICAqIHNjYTMwMDBfd3JpdGVfdGhyZXNoKCkgY29udHJvbCBvZiB0aHJlc2hvbGQKICAqKi8KIHN0YXRpYyBpbnQgc2NhMzAwMF93cml0ZV90aHJlc2goc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKLQkJCQkgICAgaW50IGUsCi0JCQkJICAgIGludCB2YWwpCisJCQkJdTY0IGUsCisJCQkJaW50IHZhbCkKIHsKIAlzdHJ1Y3Qgc2NhMzAwMF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCWludCBudW0gPSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX01PRElGSUVSKGUpOwpAQCAtNzcxLDkgKzc3MCw5IEBACiAJJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3lfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCiAJJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwKIAkvKiBPbmx5IHByZXNlbnQgaWYgdGVtcCBzZW5zb3IgaXMgKi8KLQkmaWlvX2Rldl9hdHRyX3RlbXBfcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19jb25zdF9hdHRyX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCi0JJmlpb19jb25zdF9hdHRyX3RlbXBfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX3RlbXBfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2luX3RlbXBfc2NhbGUuZGV2X2F0dHIuYXR0ciwKIAlOVUxMLAogfTsKIApAQCAtODEyLDQwICs4MTEsNDAgQEAKIAlpZiAocmV0KQogCQlnb3RvIGRvbmU7CiAKLQlzY2EzMDAwX3JpbmdfaW50X3Byb2Nlc3ModmFsLCBpbmRpb19kZXYtPnJpbmcpOworCXNjYTMwMDBfcmluZ19pbnRfcHJvY2Vzcyh2YWwsIGluZGlvX2Rldi0+YnVmZmVyKTsKIAogCWlmICh2YWwgJiBTQ0EzMDAwX0lOVF9TVEFUVVNfRlJFRV9GQUxMKQotCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsIDAsCi0JCQkgICAgICAgSUlPX01PRF9FVkVOVF9DT0RFKElJT19FVl9DTEFTU19BQ0NFTCwKKwkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LAorCQkJICAgICAgIElJT19NT0RfRVZFTlRfQ09ERShJSU9fQUNDRUwsCiAJCQkJCQkgIDAsCi0JCQkJCQkgIElJT19FVl9NT0RfWF9BTkRfWV9BTkRfWiwKKwkJCQkJCSAgSUlPX01PRF9YX0FORF9ZX0FORF9aLAogCQkJCQkJICBJSU9fRVZfVFlQRV9NQUcsCiAJCQkJCQkgIElJT19FVl9ESVJfRkFMTElORyksCiAJCQkgICAgICAgbGFzdF90aW1lc3RhbXApOwogCiAJaWYgKHZhbCAmIFNDQTMwMDBfSU5UX1NUQVRVU19ZX1RSSUdHRVIpCi0JCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwgMCwKLQkJCSAgICAgICBJSU9fTU9EX0VWRU5UX0NPREUoSUlPX0VWX0NMQVNTX0FDQ0VMLAorCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsCisJCQkgICAgICAgSUlPX01PRF9FVkVOVF9DT0RFKElJT19BQ0NFTCwKIAkJCQkJCSAgMCwKLQkJCQkJCSAgSUlPX0VWX01PRF9ZLAorCQkJCQkJICBJSU9fTU9EX1ksCiAJCQkJCQkgIElJT19FVl9UWVBFX01BRywKIAkJCQkJCSAgSUlPX0VWX0RJUl9SSVNJTkcpLAogCQkJICAgICAgIGxhc3RfdGltZXN0YW1wKTsKIAogCWlmICh2YWwgJiBTQ0EzMDAwX0lOVF9TVEFUVVNfWF9UUklHR0VSKQotCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsIDAsCi0JCQkgICAgICAgSUlPX01PRF9FVkVOVF9DT0RFKElJT19FVl9DTEFTU19BQ0NFTCwKKwkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LAorCQkJICAgICAgIElJT19NT0RfRVZFTlRfQ09ERShJSU9fQUNDRUwsCiAJCQkJCQkgIDAsCi0JCQkJCQkgIElJT19FVl9NT0RfWCwKKwkJCQkJCSAgSUlPX01PRF9YLAogCQkJCQkJICBJSU9fRVZfVFlQRV9NQUcsCiAJCQkJCQkgIElJT19FVl9ESVJfUklTSU5HKSwKIAkJCSAgICAgICBsYXN0X3RpbWVzdGFtcCk7CiAKIAlpZiAodmFsICYgU0NBMzAwMF9JTlRfU1RBVFVTX1pfVFJJR0dFUikKLQkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LCAwLAotCQkJICAgICAgIElJT19NT0RfRVZFTlRfQ09ERShJSU9fRVZfQ0xBU1NfQUNDRUwsCisJCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwKKwkJCSAgICAgICBJSU9fTU9EX0VWRU5UX0NPREUoSUlPX0FDQ0VMLAogCQkJCQkJICAwLAotCQkJCQkJICBJSU9fRVZfTU9EX1osCisJCQkJCQkgIElJT19NT0RfWiwKIAkJCQkJCSAgSUlPX0VWX1RZUEVfTUFHLAogCQkJCQkJICBJSU9fRVZfRElSX1JJU0lORyksCiAJCQkgICAgICAgbGFzdF90aW1lc3RhbXApOwpAQCAtODU4LDcgKzg1Nyw3IEBACiAgKiBzY2EzMDAwX3JlYWRfZXZlbnRfY29uZmlnKCkgd2hhdCBldmVudHMgYXJlIGVuYWJsZWQKICAqKi8KIHN0YXRpYyBpbnQgc2NhMzAwMF9yZWFkX2V2ZW50X2NvbmZpZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAotCQkJCSAgICAgaW50IGUpCisJCQkJICAgICB1NjQgZSkKIHsKIAlzdHJ1Y3Qgc2NhMzAwMF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCWludCByZXQ7CkBAIC05NjEsNyArOTYwLDcgQEAKICAqIHRoaXMgbW9kZSBpcyBkaXNhYmxlZC4gIEN1cnJlbnRseSBub3JtYWwgbW9kZSBpcyBhc3N1bWVkLgogICoqLwogc3RhdGljIGludCBzY2EzMDAwX3dyaXRlX2V2ZW50X2NvbmZpZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAotCQkJCSAgICAgIGludCBlLAorCQkJCSAgICAgIHU2NCBlLAogCQkJCSAgICAgIGludCBzdGF0ZSkKIHsKIAlzdHJ1Y3Qgc2NhMzAwMF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtMTAxOCwxNCArMTAxNywxNCBAQAogCiAvKiBGcmVlIGZhbGwgZGV0ZWN0b3IgcmVsYXRlZCBldmVudCBhdHRyaWJ1dGUgKi8KIHN0YXRpYyBJSU9fREVWSUNFX0FUVFJfTkFNRUQoYWNjZWxfeGF5YXpfbWFnX2ZhbGxpbmdfZW4sCi0JCQkgICAgIGFjY2VsX3gmeSZ6X21hZ19mYWxsaW5nX2VuLAorCQkJICAgICBpbl9hY2NlbF94Jnkmel9tYWdfZmFsbGluZ19lbiwKIAkJCSAgICAgU19JUlVHTyB8IFNfSVdVU1IsCiAJCQkgICAgIHNjYTMwMDBfcXVlcnlfZnJlZV9mYWxsX21vZGUsCiAJCQkgICAgIHNjYTMwMDBfc2V0X2ZyZWVfZmFsbF9tb2RlLAogCQkJICAgICAwKTsKIAogc3RhdGljIElJT19DT05TVF9BVFRSX05BTUVEKGFjY2VsX3hheWF6X21hZ19mYWxsaW5nX3BlcmlvZCwKLQkJCSAgICBhY2NlbF94Jnkmel9tYWdfZmFsbGluZ19wZXJpb2QsCisJCQkgICAgaW5fYWNjZWxfeCZ5JnpfbWFnX2ZhbGxpbmdfcGVyaW9kLAogCQkJICAgICIwLjIyNiIpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc2NhMzAwMF9ldmVudF9hdHRyaWJ1dGVzW10gPSB7CkBAIC0xMDM2LDYgKzEwMzUsNyBAQAogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBzY2EzMDAwX2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKIAkuYXR0cnMgPSBzY2EzMDAwX2V2ZW50X2F0dHJpYnV0ZXMsCisJLm5hbWUgPSAiZXZlbnRzIiwKIH07CiAKIC8qKgpAQCAtMTEwMiw3ICsxMTAyLDYgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gc2NhMzAwMF9pbmZvID0gewogCS5hdHRycyA9ICZzY2EzMDAwX2F0dHJpYnV0ZV9ncm91cCwKIAkucmVhZF9yYXcgPSAmc2NhMzAwMF9yZWFkX3JhdywKLQkubnVtX2ludGVycnVwdF9saW5lcyA9IDEsCiAJLmV2ZW50X2F0dHJzID0gJnNjYTMwMDBfZXZlbnRfYXR0cmlidXRlX2dyb3VwLAogCS5yZWFkX2V2ZW50X3ZhbHVlID0gJnNjYTMwMDBfcmVhZF90aHJlc2gsCiAJLndyaXRlX2V2ZW50X3ZhbHVlID0gJnNjYTMwMDBfd3JpdGVfdGhyZXNoLApAQCAtMTEyMyw3ICsxMTIyLDcgQEAKIAogc3RhdGljIGludCBfX2RldmluaXQgc2NhMzAwMF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCWludCByZXQsIHJlZ2RvbmUgPSAwOworCWludCByZXQ7CiAJc3RydWN0IHNjYTMwMDBfc3RhdGUgKnN0OwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CiAKQEAgLTExNTUsMTMgKzExNTQsMTkgQEAKIAlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3JfZnJlZV9kZXY7Ci0JcmVnZG9uZSA9IDE7Ci0JcmV0ID0gaWlvX3JpbmdfYnVmZmVyX3JlZ2lzdGVyX2V4KGluZGlvX2Rldi0+cmluZywgMCwKLQkJCQkJICBzY2EzMDAwX2NoYW5uZWxzLAotCQkJCQkgIEFSUkFZX1NJWkUoc2NhMzAwMF9jaGFubmVscykpOworCisJcmV0ID0gaWlvX2J1ZmZlcl9yZWdpc3RlcihpbmRpb19kZXYsCisJCQkJICBzY2EzMDAwX2NoYW5uZWxzLAorCQkJCSAgQVJSQVlfU0laRShzY2EzMDAwX2NoYW5uZWxzKSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3JfdW5yZWdpc3Rlcl9kZXY7Ci0JaWYgKHNwaS0+aXJxICYmIGdwaW9faXNfdmFsaWQoaXJxX3RvX2dwaW8oc3BpLT5pcnEpKSA+IDApIHsKKwlpZiAoaW5kaW9fZGV2LT5idWZmZXIpIHsKKwkJaWlvX3NjYW5fbWFza19zZXQoaW5kaW9fZGV2LT5idWZmZXIsIDApOworCQlpaW9fc2Nhbl9tYXNrX3NldChpbmRpb19kZXYtPmJ1ZmZlciwgMSk7CisJCWlpb19zY2FuX21hc2tfc2V0KGluZGlvX2Rldi0+YnVmZmVyLCAyKTsKKwl9CisKKwlpZiAoc3BpLT5pcnEpIHsKIAkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoc3BpLT5pcnEsCiAJCQkJCSAgIE5VTEwsCiAJCQkJCSAgICZzY2EzMDAwX2V2ZW50X2hhbmRsZXIsCkBAIC0xMTc4LDE2ICsxMTgzLDE0IEBACiAJcmV0dXJuIDA7CiAKIGVycm9yX2ZyZWVfaXJxOgotCWlmIChzcGktPmlycSAmJiBncGlvX2lzX3ZhbGlkKGlycV90b19ncGlvKHNwaS0+aXJxKSkgPiAwKQorCWlmIChzcGktPmlycSkKIAkJZnJlZV9pcnEoc3BpLT5pcnEsIGluZGlvX2Rldik7CiBlcnJvcl91bnJlZ2lzdGVyX3Jpbmc6Ci0JaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIGVycm9yX3VucmVnaXN0ZXJfZGV2OgorCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwogZXJyb3JfZnJlZV9kZXY6Ci0JaWYgKHJlZ2RvbmUpCi0JCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwotCWVsc2UKLQkJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiAKIGVycm9yX3JldDoKIAlyZXR1cm4gcmV0OwpAQCAtMTIyMCwxMSArMTIyMywxMiBAQAogCXJldCA9IHNjYTMwMDBfc3RvcF9hbGxfaW50ZXJydXB0cyhzdCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLQlpZiAoc3BpLT5pcnEgJiYgZ3Bpb19pc192YWxpZChpcnFfdG9fZ3BpbyhzcGktPmlycSkpID4gMCkKKwlpZiAoc3BpLT5pcnEpCiAJCWZyZWVfaXJxKHNwaS0+aXJxLCBpbmRpb19kZXYpOwotCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldi0+cmluZyk7Ci0Jc2NhMzAwMF91bmNvbmZpZ3VyZV9yaW5nKGluZGlvX2Rldik7CiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaWlvX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJc2NhMzAwMF91bmNvbmZpZ3VyZV9yaW5nKGluZGlvX2Rldik7CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMF9yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfcmluZy5jCmluZGV4IGE3MDRjNzUuLjRhOWEwMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMF9yaW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX3JpbmcuYwpAQCAtMTAsOSArMTAsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgpAQCAtMjIsOSArMjAsOCBAQAogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vc3lzZnMuaCIKLSNpbmNsdWRlICIuLi9yaW5nX2dlbmVyaWMuaCIKKyNpbmNsdWRlICIuLi9idWZmZXJfZ2VuZXJpYy5oIgogI2luY2x1ZGUgIi4uL3JpbmdfaHcuaCIKLSNpbmNsdWRlICJhY2NlbC5oIgogI2luY2x1ZGUgInNjYTMwMDAuaCIKIAogLyogUkZDIC8gZnV0dXJlIHdvcmsKQEAgLTg0LDEwICs4MSwxMCBAQAogICogY2FuIG9ubHkgYmUgaW5mZXJyZWQgYXBwcm94aW1hdGVseSBmcm9tIHJpbmcgYnVmZmVyIGV2ZW50cyBzdWNoIGFzIDUwJSBmdWxsCiAgKiBhbmQga25vd2xlZGdlIG9mIHdoZW4gYnVmZmVyIHdhcyBsYXN0IGVtcHRpZWQuICBUaGlzIGlzIGxlZnQgdG8gdXNlcnNwYWNlLgogICoqLwotc3RhdGljIGludCBzY2EzMDAwX3JlYWRfZmlyc3Rfbl9od19yYihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyLAorc3RhdGljIGludCBzY2EzMDAwX3JlYWRfZmlyc3Rfbl9od19yYihzdHJ1Y3QgaWlvX2J1ZmZlciAqciwKIAkJCQkgICAgICBzaXplX3QgY291bnQsIGNoYXIgX191c2VyICpidWYpCiB7Ci0Jc3RydWN0IGlpb19od19yaW5nX2J1ZmZlciAqaHdfcmluZyA9IGlpb190b19od19yaW5nX2J1ZihyKTsKKwlzdHJ1Y3QgaWlvX2h3X2J1ZmZlciAqaHdfcmluZyA9IGlpb190b19od19idWYocik7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGh3X3JpbmctPnByaXZhdGU7CiAJc3RydWN0IHNjYTMwMDBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAl1OCAqcng7CkBAIC0xMzcsMjUgKzEzNCwyMCBAQAogfQogCiAvKiBUaGlzIGlzIG9ubHkgdmFsaWQgd2l0aCBhbGwgMyBlbGVtZW50cyBlbmFibGVkICovCi1zdGF0aWMgaW50IHNjYTMwMDBfcmluZ19nZXRfbGVuZ3RoKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIpCitzdGF0aWMgaW50IHNjYTMwMDBfcmluZ19nZXRfbGVuZ3RoKHN0cnVjdCBpaW9fYnVmZmVyICpyKQogewogCXJldHVybiA2NDsKIH0KIAogLyogb25seSB2YWxpZCBpZiByZXNvbHV0aW9uIGlzIGtlcHQgYXQgMTFiaXRzICovCi1zdGF0aWMgaW50IHNjYTMwMDBfcmluZ19nZXRfYnl0ZXNfcGVyX2RhdHVtKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIpCitzdGF0aWMgaW50IHNjYTMwMDBfcmluZ19nZXRfYnl0ZXNfcGVyX2RhdHVtKHN0cnVjdCBpaW9fYnVmZmVyICpyKQogewogCXJldHVybiA2OwogfQotc3RhdGljIHZvaWQgc2NhMzAwMF9yaW5nX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIgPSB0b19paW9fcmluZ19idWZmZXIoZGV2KTsKLQlrZnJlZShpaW9fdG9faHdfcmluZ19idWYocikpOwotfQogCi1zdGF0aWMgSUlPX1JJTkdfRU5BQkxFX0FUVFI7Ci1zdGF0aWMgSUlPX1JJTkdfQllURVNfUEVSX0RBVFVNX0FUVFI7Ci1zdGF0aWMgSUlPX1JJTkdfTEVOR1RIX0FUVFI7CitzdGF0aWMgSUlPX0JVRkZFUl9FTkFCTEVfQVRUUjsKK3N0YXRpYyBJSU9fQlVGRkVSX0JZVEVTX1BFUl9EQVRVTV9BVFRSOworc3RhdGljIElJT19CVUZGRVJfTEVOR1RIX0FUVFI7CiAKIC8qKgogICogc2NhMzAwMF9xdWVyeV9yaW5nX2ludCgpIGlzIHRoZSBoYXJkd2FyZSByaW5nIHN0YXR1cyBpbnRlcnJ1cHQgZW5hYmxlZApAQCAtMTY2LDcgKzE1OCw3IEBACiB7CiAJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOwogCWludCByZXQsIHZhbDsKLQlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGlpb19idWZmZXIgKnJpbmcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcmluZy0+aW5kaW9fZGV2OwogCXN0cnVjdCBzY2EzMDAwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKQEAgLTE4OCw3ICsxODAsNyBAQAogCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKIAkJCQkgICAgICBzaXplX3QgbGVuKQogewotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqcmluZyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSByaW5nLT5pbmRpb19kZXY7CiAJc3RydWN0IHNjYTMwMDBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CkBAIC0yMjYsODYgKzIxOCwxOCBAQAogCQkgICAgICAgc2NhMzAwMF9zZXRfcmluZ19pbnQsCiAJCSAgICAgICBTQ0EzMDAwX0lOVF9NQVNLX1JJTkdfVEhSRUVfUVVBUlRFUik7CiAKLQotLyoqCi0gKiBzY2EzMDAwX3Nob3dfcmluZ19icHNlKCkgLXN5c2ZzIGZ1bmN0aW9uIHRvIHF1ZXJ5IGJpdHMgcGVyIHNhbXBsZSBmcm9tIHJpbmcKLSAqIEBkZXY6IHJpbmcgYnVmZmVyIGRldmljZQotICogQGF0dHI6IHRoaXMgZGV2aWNlIGF0dHJpYnV0ZQotICogQGJ1ZjogYnVmZmVyIHRvIHdyaXRlIHRvCi0gKiovCi1zdGF0aWMgc3NpemVfdCBzY2EzMDAwX3Nob3dfcmluZ19icHNlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgICBjaGFyICpidWYpCi17Ci0JaW50IGxlbiA9IDAsIHJldDsKLQlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHJpbmctPmluZGlvX2RldjsKLQlzdHJ1Y3Qgc2NhMzAwMF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCi0JbXV0ZXhfbG9jaygmc3QtPmxvY2spOwotCXJldCA9IHNjYTMwMDBfcmVhZF9kYXRhX3Nob3J0KHN0LCBTQ0EzMDAwX1JFR19BRERSX01PREUsIDEpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfcmV0OwotCWlmIChzdC0+cnhbMF0gJiBTQ0EzMDAwX1JJTkdfQlVGXzhCSVQpCi0JCWxlbiA9IHNwcmludGYoYnVmLCAiczgvOFxuIik7Ci0JZWxzZQotCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgInMxMS8xNlxuIik7Ci1lcnJvcl9yZXQ6Ci0JbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7Ci0KLQlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOwotfQotCi0vKioKLSAqIHNjYTMwMDBfc3RvcmVfcmluZ19icHNlKCkgLSBiaXRzIHBlciBzY2FuIGVsZW1lbnQKLSAqIEBkZXY6IHJpbmcgYnVmZmVyIGRldmljZQotICogQGF0dHI6IGF0dHJpYnV0ZSBjYWxsZWQgZnJvbQotICogQGJ1ZjogaW5wdXQgZnJvbSB1c2Vyc3BhY2UKLSAqIEBsZW46IGxlbmd0aCBvZiBpbnB1dAotICoqLwotc3RhdGljIHNzaXplX3Qgc2NhMzAwMF9zdG9yZV9yaW5nX2Jwc2Uoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCQkgICAgICBzaXplX3QgbGVuKQotewotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcmluZy0+aW5kaW9fZGV2OwotCXN0cnVjdCBzY2EzMDAwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0JaW50IHJldDsKLQotCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKLQotCXJldCA9IHNjYTMwMDBfcmVhZF9kYXRhX3Nob3J0KHN0LCBTQ0EzMDAwX1JFR19BRERSX01PREUsIDEpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfcmV0OwotCWlmIChzeXNmc19zdHJlcShidWYsICJzOC84IikpIHsKLQkJcmV0ID0gc2NhMzAwMF93cml0ZV9yZWcoc3QsIFNDQTMwMDBfUkVHX0FERFJfTU9ERSwKLQkJCQkJc3QtPnJ4WzBdIHwgU0NBMzAwMF9SSU5HX0JVRl84QklUKTsKLQkJc3QtPmJwc2UgPSA4OwotCX0gZWxzZSBpZiAoc3lzZnNfc3RyZXEoYnVmLCAiczExLzE2IikpIHsKLQkJcmV0ID0gc2NhMzAwMF93cml0ZV9yZWcoc3QsIFNDQTMwMDBfUkVHX0FERFJfTU9ERSwKLQkJCQkJc3QtPnJ4WzBdICYgflNDQTMwMDBfUklOR19CVUZfOEJJVCk7Ci0JCXN0LT5icHNlID0gMTE7Ci0JfSBlbHNlCi0JCXJldCA9IC1FSU5WQUw7Ci1lcnJvcl9yZXQ6Ci0JbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7Ci0KLQlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOwotfQotCiBzdGF0aWMgc3NpemVfdCBzY2EzMDAwX3Nob3dfYnVmZmVyX3NjYWxlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkgY2hhciAqYnVmKQogewotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqcmluZyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSByaW5nLT5pbmRpb19kZXY7CiAJc3RydWN0IHNjYTMwMDBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjAuJTA2ZFxuIiwgNCpzdC0+aW5mby0+c2NhbGUpOwogfQogCi1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKGFjY2VsX3NjYWxlLAorc3RhdGljIElJT19ERVZJQ0VfQVRUUihpbl9hY2NlbF9zY2FsZSwKIAkJICAgICAgIFNfSVJVR08sCiAJCSAgICAgICBzY2EzMDAwX3Nob3dfYnVmZmVyX3NjYWxlLAogCQkgICAgICAgTlVMTCwKQEAgLTMyMywyOCArMjQ3LDE5IEBACiAJJmRldl9hdHRyX2VuYWJsZS5hdHRyLAogCSZpaW9fZGV2X2F0dHJfNTBfcGVyY2VudC5kZXZfYXR0ci5hdHRyLAogCSZpaW9fZGV2X2F0dHJfNzVfcGVyY2VudC5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfYWNjZWxfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX2FjY2VsX3NjYWxlLmRldl9hdHRyLmF0dHIsCiAJTlVMTCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHNjYTMwMDBfcmluZ19hdHRyID0gewogCS5hdHRycyA9IHNjYTMwMDBfcmluZ19hdHRyaWJ1dGVzLAorCS5uYW1lID0gImJ1ZmZlciIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqc2NhMzAwMF9yaW5nX2F0dHJfZ3JvdXBzW10gPSB7Ci0JJnNjYTMwMDBfcmluZ19hdHRyLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX3R5cGUgc2NhMzAwMF9yaW5nX3R5cGUgPSB7Ci0JLnJlbGVhc2UgPSBzY2EzMDAwX3JpbmdfcmVsZWFzZSwKLQkuZ3JvdXBzID0gc2NhMzAwMF9yaW5nX2F0dHJfZ3JvdXBzLAotfTsKLQotc3RhdGljIHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnNjYTMwMDBfcmJfYWxsb2NhdGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3N0YXRpYyBzdHJ1Y3QgaWlvX2J1ZmZlciAqc2NhMzAwMF9yYl9hbGxvY2F0ZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKmJ1ZjsKLQlzdHJ1Y3QgaWlvX2h3X3JpbmdfYnVmZmVyICpyaW5nOworCXN0cnVjdCBpaW9fYnVmZmVyICpidWY7CisJc3RydWN0IGlpb19od19idWZmZXIgKnJpbmc7CiAKIAlyaW5nID0ga3phbGxvYyhzaXplb2YgKnJpbmcsIEdGUF9LRVJORUwpOwogCWlmICghcmluZykKQEAgLTM1MywyMSArMjY4LDE4IEBACiAJcmluZy0+cHJpdmF0ZSA9IGluZGlvX2RldjsKIAlidWYgPSAmcmluZy0+YnVmOwogCWJ1Zi0+c3R1ZmZ0b3JlYWQgPSAwOwotCWlpb19yaW5nX2J1ZmZlcl9pbml0KGJ1ZiwgaW5kaW9fZGV2KTsKLQlidWYtPmRldi50eXBlID0gJnNjYTMwMDBfcmluZ190eXBlOwotCWJ1Zi0+ZGV2LnBhcmVudCA9ICZpbmRpb19kZXYtPmRldjsKLQlkZXZfc2V0X2RydmRhdGEoJmJ1Zi0+ZGV2LCAodm9pZCAqKWJ1Zik7CisJYnVmLT5hdHRycyA9ICZzY2EzMDAwX3JpbmdfYXR0cjsKKwlpaW9fYnVmZmVyX2luaXQoYnVmLCBpbmRpb19kZXYpOwogCiAJcmV0dXJuIGJ1ZjsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNjYTMwMDBfcmJfZnJlZShzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyKQorc3RhdGljIGlubGluZSB2b2lkIHNjYTMwMDBfcmJfZnJlZShzdHJ1Y3QgaWlvX2J1ZmZlciAqcikKIHsKLQlpZiAocikKLQkJaWlvX3B1dF9yaW5nX2J1ZmZlcihyKTsKKwlrZnJlZShpaW9fdG9faHdfYnVmKHIpKTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fcmluZ19hY2Nlc3NfZnVuY3Mgc2NhMzAwMF9yaW5nX2FjY2Vzc19mdW5jcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9hY2Nlc3NfZnVuY3Mgc2NhMzAwMF9yaW5nX2FjY2Vzc19mdW5jcyA9IHsKIAkucmVhZF9maXJzdF9uID0gJnNjYTMwMDBfcmVhZF9maXJzdF9uX2h3X3JiLAogCS5nZXRfbGVuZ3RoID0gJnNjYTMwMDBfcmluZ19nZXRfbGVuZ3RoLAogCS5nZXRfYnl0ZXNfcGVyX2RhdHVtID0gJnNjYTMwMDBfcmluZ19nZXRfYnl0ZXNfcGVyX2RhdHVtLApAQCAtMzc1LDIzICsyODcsMTkgQEAKIAogaW50IHNjYTMwMDBfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKLQlpbmRpb19kZXYtPnJpbmcgPSBzY2EzMDAwX3JiX2FsbG9jYXRlKGluZGlvX2Rldik7Ci0JaWYgKGluZGlvX2Rldi0+cmluZyA9PSBOVUxMKQorCWluZGlvX2Rldi0+YnVmZmVyID0gc2NhMzAwMF9yYl9hbGxvY2F0ZShpbmRpb19kZXYpOworCWlmIChpbmRpb19kZXYtPmJ1ZmZlciA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX1JJTkdfSEFSRFdBUkVfQlVGRkVSOworCWluZGlvX2Rldi0+bW9kZXMgfD0gSU5ESU9fQlVGRkVSX0hBUkRXQVJFOwogCi0JaW5kaW9fZGV2LT5yaW5nLT5hY2Nlc3MgPSAmc2NhMzAwMF9yaW5nX2FjY2Vzc19mdW5jczsKLQotCWlpb19zY2FuX21hc2tfc2V0KGluZGlvX2Rldi0+cmluZywgMCk7Ci0JaWlvX3NjYW5fbWFza19zZXQoaW5kaW9fZGV2LT5yaW5nLCAxKTsKLQlpaW9fc2Nhbl9tYXNrX3NldChpbmRpb19kZXYtPnJpbmcsIDIpOworCWluZGlvX2Rldi0+YnVmZmVyLT5hY2Nlc3MgPSAmc2NhMzAwMF9yaW5nX2FjY2Vzc19mdW5jczsKIAogCXJldHVybiAwOwogfQogCiB2b2lkIHNjYTMwMDBfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewotCXNjYTMwMDBfcmJfZnJlZShpbmRpb19kZXYtPnJpbmcpOworCXNjYTMwMDBfcmJfZnJlZShpbmRpb19kZXYtPmJ1ZmZlcik7CiB9CiAKIHN0YXRpYyBpbmxpbmUKQEAgLTQzNSwxNCArMzQzLDE0IEBACiAJcmV0dXJuIF9fc2NhMzAwMF9od19yaW5nX3N0YXRlX3NldChpbmRpb19kZXYsIDApOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGlpb19yaW5nX3NldHVwX29wcyBzY2EzMDAwX3Jpbmdfc2V0dXBfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fYnVmZmVyX3NldHVwX29wcyBzY2EzMDAwX3Jpbmdfc2V0dXBfb3BzID0gewogCS5wcmVlbmFibGUgPSAmc2NhMzAwMF9od19yaW5nX3ByZWVuYWJsZSwKIAkucG9zdGRpc2FibGUgPSAmc2NhMzAwMF9od19yaW5nX3Bvc3RkaXNhYmxlLAogfTsKIAogdm9pZCBzY2EzMDAwX3JlZ2lzdGVyX3JpbmdfZnVuY3Moc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKLQlpbmRpb19kZXYtPnJpbmctPnNldHVwX29wcyA9ICZzY2EzMDAwX3Jpbmdfc2V0dXBfb3BzOworCWluZGlvX2Rldi0+YnVmZmVyLT5zZXR1cF9vcHMgPSAmc2NhMzAwMF9yaW5nX3NldHVwX29wczsKIH0KIAogLyoqCkBAIC00NTEsNyArMzU5LDcgQEAKICAqIFRoaXMgaXMgb25seSBzcGxpdCBmcm9tIHRoZSBtYWluIGludGVycnVwdCBoYW5kbGVyIHNvIGFzIHRvCiAgKiByZWR1Y2UgdGhlIGFtb3VudCBvZiBjb2RlIGlmIHRoZSByaW5nIGJ1ZmZlciBpcyBub3QgZW5hYmxlZC4KICAqKi8KLXZvaWQgc2NhMzAwMF9yaW5nX2ludF9wcm9jZXNzKHU4IHZhbCwgc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3ZvaWQgc2NhMzAwMF9yaW5nX2ludF9wcm9jZXNzKHU4IHZhbCwgc3RydWN0IGlpb19idWZmZXIgKnJpbmcpCiB7CiAJaWYgKHZhbCAmIChTQ0EzMDAwX0lOVF9TVEFUVVNfVEhSRUVfUVVBUlRFUlMgfAogCQkgICBTQ0EzMDAwX0lOVF9TVEFUVVNfSEFMRikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9LY29uZmlnCmluZGV4IGIzOWYyZTEuLmQ5ZGVjZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvS2NvbmZpZwpAQCAtMSwyOCArMSwxNCBAQAogIwogIyBBREMgZHJpdmVycwogIwotY29tbWVudCAiQW5hbG9nIHRvIGRpZ2l0YWwgY29udmVydG9ycyIKLQotY29uZmlnIEFENzE1MAotCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBhZDcxNTAvMS82IGNhcGFjaXRpdmUgc2Vuc29yIGRyaXZlciIKLQlkZXBlbmRzIG9uIEkyQwotCWhlbHAKLQkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBjYXBhY2l0aXZlIHNlbnNvcnMuCi0JICAoYWQ3MTUwLCBhZDcxNTEsIGFkNzE1NikgUHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB2aWEgc3lzZnMuCi0KLWNvbmZpZyBBRDcxNTIKLQl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgYWQ3MTUyLzMgY2FwYWNpdGl2ZSBzZW5zb3IgZHJpdmVyIgotCWRlcGVuZHMgb24gSTJDCi0JaGVscAotCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIGNhcGFjaXRpdmUgc2Vuc29ycy4KLQkgIChhZDcxNTIsIGFkNzE1MykgUHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB2aWEgc3lzZnMuCittZW51ICJBbmFsb2cgdG8gZGlnaXRhbCBjb252ZXJ0ZXJzIgogCiBjb25maWcgQUQ3MjkxCi0JdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFENzI5MSB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIgorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRDcyOTEgQURDIGRyaXZlciIKIAlkZXBlbmRzIG9uIEkyQwogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRDcyOTEKLQkgIHRlbXBlcmF0dXJlIHNlbnNvcnMuCisJICA4IENoYW5uZWwgQURDIHdpdGggdGVtcGVyYXR1cmUgc2Vuc29yLgogCiBjb25maWcgQUQ3Mjk4CiAJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFENzI5OCBBREMgZHJpdmVyIgpAQCAtMzQsMjIgKzIwLDE1IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhZDcyOTguCiAKLWNvbmZpZyBBRDczMTQKLQl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQUQ3MzE0IHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIiCi0JZGVwZW5kcyBvbiBTUEkKLQloZWxwCi0JICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQUQ3MzE0Ci0JICB0ZW1wZXJhdHVyZSBzZW5zb3JzLgotCiBjb25maWcgQUQ3NjA2CiAJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFENzYwNiBBREMgZHJpdmVyIgogCWRlcGVuZHMgb24gR1BJT0xJQgotCXNlbGVjdCBJSU9fUklOR19CVUZGRVIKKwlzZWxlY3QgSUlPX0JVRkZFUgogCXNlbGVjdCBJSU9fVFJJR0dFUgogCXNlbGVjdCBJSU9fU1dfUklORwogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlczoKLQkgIGFkNzYwNiwgYWQ3NjA2LTYsIGFkNzYwNi00IGFuYWxvZyB0byBkaWdpdGFsIGNvbnZlcnRvcnMgKEFEQykuCisJICBhZDc2MDYsIGFkNzYwNi02LCBhZDc2MDYtNCBhbmFsb2cgdG8gZGlnaXRhbCBjb252ZXJ0ZXJzIChBREMpLgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhZDc2MDYuCkBAIC03MiwxOCArNTEsMTggQEAKIGNvbmZpZyBBRDc5OVgKIAl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQUQ3OTl4IEFEQyBkcml2ZXIiCiAJZGVwZW5kcyBvbiBJMkMKLQlzZWxlY3QgSUlPX1RSSUdHRVIgaWYgSUlPX1JJTkdfQlVGRkVSCisJc2VsZWN0IElJT19UUklHR0VSIGlmIElJT19CVUZGRVIKIAlzZWxlY3QgQUQ3OTlYX1JJTkdfQlVGRkVSCiAJaGVscAogCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzOgogCSAgYWQ3OTkxLCBhZDc5OTUsIGFkNzk5OSwgYWQ3OTkyLCBhZDc5OTMsIGFkNzk5NCwgYWQ3OTk3LCBhZDc5OTgKLQkgIGkyYyBhbmFsb2cgdG8gZGlnaXRhbCBjb252ZXJ0b3JzIChBREMpLiBQcm92aWRlcyBkaXJlY3QgYWNjZXNzCisJICBpMmMgYW5hbG9nIHRvIGRpZ2l0YWwgY29udmVydGVycyAoQURDKS4gUHJvdmlkZXMgZGlyZWN0IGFjY2VzcwogCSAgdmlhIHN5c2ZzLgogCiBjb25maWcgQUQ3OTlYX1JJTkdfQlVGRkVSCiAJYm9vbCAiQW5hbG9nIERldmljZXMgQUQ3OTl4OiB1c2UgcmluZyBidWZmZXIiCiAJZGVwZW5kcyBvbiBBRDc5OVgKLQlzZWxlY3QgSUlPX1JJTkdfQlVGRkVSCisJc2VsZWN0IElJT19CVUZGRVIKIAlzZWxlY3QgSUlPX1NXX1JJTkcKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgdG8gaW5jbHVkZSByaW5nIGJ1ZmZlciBzdXBwb3J0IGluIHRoZSBBRDc5OVgKQEAgLTkyLDEzICs3MSwxMyBAQAogY29uZmlnIEFENzQ3NgogCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRDc0NzUvNi83LzggQUQ3NDY2LzcvOCBhbmQgQUQ3NDk1IEFEQyBkcml2ZXIiCiAJZGVwZW5kcyBvbiBTUEkKLQlzZWxlY3QgSUlPX1JJTkdfQlVGRkVSCisJc2VsZWN0IElJT19CVUZGRVIKIAlzZWxlY3QgSUlPX1NXX1JJTkcKIAlzZWxlY3QgSUlPX1RSSUdHRVIKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMKIAkgIEFENzQ3NSwgQUQ3NDc2LCBBRDc0NzcsIEFENzQ3OCwgQUQ3NDY2LCBBRDc0NjcsIEFENzQ2OCwgQUQ3NDk1Ci0JICBTUEkgYW5hbG9nIHRvIGRpZ2l0YWwgY29udmVydG9ycyAoQURDKS4KKwkgIFNQSSBhbmFsb2cgdG8gZGlnaXRhbCBjb252ZXJ0ZXJzIChBREMpLgogCSAgSWYgdW5zdXJlLCBzYXkgTiAoYnV0IGl0J3Mgc2FmZSB0byBzYXkgIlkiKS4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCkBAIC0xMDcsMTIgKzg2LDEyIEBACiBjb25maWcgQUQ3ODg3CiAJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFENzg4NyBBREMgZHJpdmVyIgogCWRlcGVuZHMgb24gU1BJCi0Jc2VsZWN0IElJT19SSU5HX0JVRkZFUgorCXNlbGVjdCBJSU9fQlVGRkVSCiAJc2VsZWN0IElJT19TV19SSU5HCiAJc2VsZWN0IElJT19UUklHR0VSCiAJaGVscAogCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzCi0JICBBRDc4ODcgU1BJIGFuYWxvZyB0byBkaWdpdGFsIGNvbnZlcnRvciAoQURDKS4KKwkgIEFENzg4NyBTUEkgYW5hbG9nIHRvIGRpZ2l0YWwgY29udmVydGVyIChBREMpLgogCSAgSWYgdW5zdXJlLCBzYXkgTiAoYnV0IGl0J3Mgc2FmZSB0byBzYXkgIlkiKS4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCkBAIC0xMjQsNyArMTAzLDcgQEAKIAlkZXBlbmRzIG9uIEdQSU9MSUIKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMKLQkgIEFENzc4MCBhbmQgQUQ3NzgxIFNQSSBhbmFsb2cgdG8gZGlnaXRhbCBjb252ZXJ0b3JzIChBREMpLgorCSAgQUQ3NzgwIGFuZCBBRDc3ODEgU1BJIGFuYWxvZyB0byBkaWdpdGFsIGNvbnZlcnRlcnMgKEFEQykuCiAJICBJZiB1bnN1cmUsIHNheSBOIChidXQgaXQncyBzYWZlIHRvIHNheSAiWSIpLgogCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKQEAgLTEzMyw0MCArMTEyLDM4IEBACiBjb25maWcgQUQ3NzkzCiAJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFENzc5MiBBRDc3OTMgQURDIGRyaXZlciIKIAlkZXBlbmRzIG9uIFNQSQotCXNlbGVjdCBJSU9fUklOR19CVUZGRVIKKwlzZWxlY3QgSUlPX0JVRkZFUgogCXNlbGVjdCBJSU9fU1dfUklORwogCXNlbGVjdCBJSU9fVFJJR0dFUgogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcwotCSAgQUQ3NzkyIGFuZCBBRDc3OTMgU1BJIGFuYWxvZyB0byBkaWdpdGFsIGNvbnZlcnRvcnMgKEFEQykuCisJICBBRDc3OTIgYW5kIEFENzc5MyBTUEkgYW5hbG9nIHRvIGRpZ2l0YWwgY29udmVydGVycyAoQURDKS4KIAkgIElmIHVuc3VyZSwgc2F5IE4gKGJ1dCBpdCdzIHNhZmUgdG8gc2F5ICJZIikuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIEFENzc5My4KIAotY29uZmlnIEFENzc0NQotCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRDc3NDUsIEFENzc0NiBBRDc3NDcgY2FwYWNpdGl2ZSBzZW5zb3IgZHJpdmVyIgotCWRlcGVuZHMgb24gSTJDCi0JaGVscAotCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIGNhcGFjaXRpdmUgc2Vuc29ycy4KLQkgIChBRDc3NDUsIEFENzc0NiwgQUQ3NzQ3KSBQcm92aWRlcyBkaXJlY3QgYWNjZXNzIHZpYSBzeXNmcy4KLQotCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCi0JICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWQ3NzQ1LgotCiBjb25maWcgQUQ3ODE2CiAJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFENzgxNi83LzggdGVtcGVyYXR1cmUgc2Vuc29yIGFuZCBBREMgZHJpdmVyIgogCWRlcGVuZHMgb24gU1BJCisJZGVwZW5kcyBvbiBHRU5FUklDX0dQSU8KIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQUQ3ODE2LzcvOAogCSAgdGVtcGVyYXR1cmUgc2Vuc29ycyBhbmQgQURDLgogCi1jb25maWcgQURUNzUKLQl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURUNzUgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciIKLQlkZXBlbmRzIG9uIEkyQworY29uZmlnIEFENzE5MgorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRDcxOTAgQUQ3MTkyIEFENzE5NSBBREMgZHJpdmVyIgorCWRlcGVuZHMgb24gU1BJCisJc2VsZWN0IElJT19CVUZGRVIKKwlzZWxlY3QgSUlPX1NXX1JJTkcKKwlzZWxlY3QgSUlPX1RSSUdHRVIKIAloZWxwCi0JICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURUNzUKLQkgIHRlbXBlcmF0dXJlIHNlbnNvcnMuCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQUQ3MTkwLAorCSAgQUQ3MTkyIG9yIEFENzE5NSBTUEkgYW5hbG9nIHRvIGRpZ2l0YWwgY29udmVydGVycyAoQURDKS4KKwkgIElmIHVuc3VyZSwgc2F5IE4gKGJ1dCBpdCdzIHNhZmUgdG8gc2F5ICJZIikuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFkNzE5Mi4KIAogY29uZmlnIEFEVDczMTAKIAl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURUNzMxMCB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIgpAQCAtMTgyLDE0ICsxNTksMjQgQEAKIAkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRFQ3NDEwCiAJICB0ZW1wZXJhdHVyZSBzZW5zb3JzLgogCitjb25maWcgQUQ3MjgwCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFENzI4MEEgTGl0aGl1bSBJb24gQmF0dGVyeSBNb25pdG9yaW5nIFN5c3RlbSIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRDcyODBBCisJICBMaXRoaXVtIElvbiBCYXR0ZXJ5IE1vbml0b3JpbmcgU3lzdGVtLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhZDcyODBhCisKIGNvbmZpZyBNQVgxMzYzCiAJdHJpc3RhdGUgIk1heGltIG1heDEzNjMgQURDIGRyaXZlciIKIAlkZXBlbmRzIG9uIEkyQwotCXNlbGVjdCBJSU9fVFJJR0dFUiBpZiBJSU9fUklOR19CVUZGRVIKKwlzZWxlY3QgSUlPX1RSSUdHRVIgaWYgSUlPX0JVRkZFUgogCXNlbGVjdCBNQVgxMzYzX1JJTkdfQlVGRkVSCiAJaGVscAogCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIG1hbnkgTWF4aW0gaTJjIGFuYWxvZyB0byBkaWdpdGFsCi0JICBjb252ZXJ0b3JzIChBREMpLiAobWF4MTM2MSwgbWF4MTM2MiwgbWF4MTM2MywgbWF4MTM2NCwgbWF4MTAzNiwKKwkgIGNvbnZlcnRlcnMgKEFEQykuIChtYXgxMzYxLCBtYXgxMzYyLCBtYXgxMzYzLCBtYXgxMzY0LCBtYXgxMDM2LAogCSAgbWF4MTAzNywgbWF4MTAzOCwgbWF4MTAzOSwgbWF4MTEzNiwgbWF4MTEzNiwgbWF4MTEzNywgbWF4MTEzOCwKIAkgIG1heDExMzksIG1heDEyMzYsIG1heDEyMzcsIG1heDExMjM4LCBtYXgxMjM5LCBtYXgxMTYwMCwgbWF4MTE2MDEsCiAJICBtYXgxMTYwMiwgbWF4MTE2MDMsIG1heDExNjA0LCBtYXgxMTYwNSwgbWF4MTE2MDYsIG1heDExNjA3LApAQCAtMjAwLDggKzE4NywxMCBAQAogY29uZmlnIE1BWDEzNjNfUklOR19CVUZGRVIKIAlib29sICJNYXhpbSBtYXgxMzYzOiB1c2UgcmluZyBidWZmZXIiCiAJZGVwZW5kcyBvbiBNQVgxMzYzCi0Jc2VsZWN0IElJT19SSU5HX0JVRkZFUgorCXNlbGVjdCBJSU9fQlVGRkVSCiAJc2VsZWN0IElJT19TV19SSU5HCiAJaGVscAogCSAgU2F5IHllcyBoZXJlIHRvIGluY2x1ZGUgcmluZyBidWZmZXIgc3VwcG9ydCBpbiB0aGUgTUFYMTM2MwogCSAgQURDIGRyaXZlci4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9NYWtlZmlsZQppbmRleCBmMDIwMzUxLi5jZWVlN2YzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9NYWtlZmlsZQpAQCAtOCw3ICs4LDcgQEAKIG9iai0kKENPTkZJR19NQVgxMzYzKSArPSBtYXgxMzYzLm8KIAogYWQ3NjA2LXkgOj0gYWQ3NjA2X2NvcmUubwotYWQ3NjA2LSQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgKz0gYWQ3NjA2X3JpbmcubworYWQ3NjA2LSQoQ09ORklHX0lJT19CVUZGRVIpICs9IGFkNzYwNl9yaW5nLm8KIGFkNzYwNi0kKENPTkZJR19BRDc2MDZfSUZBQ0VfUEFSQUxMRUwpICs9IGFkNzYwNl9wYXIubwogYWQ3NjA2LSQoQ09ORklHX0FENzYwNl9JRkFDRV9TUEkpICs9IGFkNzYwNl9zcGkubwogb2JqLSQoQ09ORklHX0FENzYwNikgKz0gYWQ3NjA2Lm8KQEAgLTE4LDI1ICsxOCwyMiBAQAogb2JqLSQoQ09ORklHX0FENzk5WCkgKz0gYWQ3OTl4Lm8KIAogYWQ3NDc2LXkgOj0gYWQ3NDc2X2NvcmUubwotYWQ3NDc2LSQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgKz0gYWQ3NDc2X3JpbmcubworYWQ3NDc2LSQoQ09ORklHX0lJT19CVUZGRVIpICs9IGFkNzQ3Nl9yaW5nLm8KIG9iai0kKENPTkZJR19BRDc0NzYpICs9IGFkNzQ3Ni5vCiAKIGFkNzg4Ny15IDo9IGFkNzg4N19jb3JlLm8KLWFkNzg4Ny0kKENPTkZJR19JSU9fUklOR19CVUZGRVIpICs9IGFkNzg4N19yaW5nLm8KK2FkNzg4Ny0kKENPTkZJR19JSU9fQlVGRkVSKSArPSBhZDc4ODdfcmluZy5vCiBvYmotJChDT05GSUdfQUQ3ODg3KSArPSBhZDc4ODcubwogCiBhZDcyOTgteSA6PSBhZDcyOThfY29yZS5vCi1hZDcyOTgtJChDT05GSUdfSUlPX1JJTkdfQlVGRkVSKSArPSBhZDcyOThfcmluZy5vCithZDcyOTgtJChDT05GSUdfSUlPX0JVRkZFUikgKz0gYWQ3Mjk4X3Jpbmcubwogb2JqLSQoQ09ORklHX0FENzI5OCkgKz0gYWQ3Mjk4Lm8KIAotb2JqLSQoQ09ORklHX0FENzE1MCkgKz0gYWQ3MTUwLm8KLW9iai0kKENPTkZJR19BRDcxNTIpICs9IGFkNzE1Mi5vCiBvYmotJChDT05GSUdfQUQ3MjkxKSArPSBhZDcyOTEubwotb2JqLSQoQ09ORklHX0FENzMxNCkgKz0gYWQ3MzE0Lm8KLW9iai0kKENPTkZJR19BRDc3NDUpICs9IGFkNzc0NS5vCiBvYmotJChDT05GSUdfQUQ3NzgwKSArPSBhZDc3ODAubwogb2JqLSQoQ09ORklHX0FENzc5MykgKz0gYWQ3NzkzLm8KIG9iai0kKENPTkZJR19BRDc4MTYpICs9IGFkNzgxNi5vCi1vYmotJChDT05GSUdfQURUNzUpICs9IGFkdDc1Lm8KK29iai0kKENPTkZJR19BRDcxOTIpICs9IGFkNzE5Mi5vCiBvYmotJChDT05GSUdfQURUNzMxMCkgKz0gYWR0NzMxMC5vCiBvYmotJChDT05GSUdfQURUNzQxMCkgKz0gYWR0NzQxMC5vCitvYmotJChDT05GSUdfQUQ3MjgwKSArPSBhZDcyODBhLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzE1MC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MTUwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MDE3ZWYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MTUwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MTIgKzAsMCBAQAotLyoKLSAqIEFENzE1MCBjYXBhY2l0aXZlIHNlbnNvciBkcml2ZXIgc3VwcG9ydGluZyBBRDcxNTAvMS82Ci0gKgotICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotCi0jaW5jbHVkZSAiLi4vaWlvLmgiCi0jaW5jbHVkZSAiLi4vc3lzZnMuaCIKLQotLyoKLSAqIEFENzE1MCByZWdpc3RlcnMgZGVmaW5pdGlvbgotICovCi0KLSNkZWZpbmUgQUQ3MTUwX1NUQVRVUyAgICAgICAgICAgICAgMAotI2RlZmluZSBBRDcxNTBfU1RBVFVTX09VVDEgICAgICAgICAoMSA8PCAzKQotI2RlZmluZSBBRDcxNTBfU1RBVFVTX09VVDIgICAgICAgICAoMSA8PCA1KQotI2RlZmluZSBBRDcxNTBfQ0gxX0RBVEFfSElHSCAgICAgICAxCi0jZGVmaW5lIEFENzE1MF9DSDFfREFUQV9MT1cgICAgICAgIDIKLSNkZWZpbmUgQUQ3MTUwX0NIMl9EQVRBX0hJR0ggICAgICAgMwotI2RlZmluZSBBRDcxNTBfQ0gyX0RBVEFfTE9XICAgICAgICA0Ci0jZGVmaW5lIEFENzE1MF9DSDFfQVZHX0hJR0ggICAgICAgIDUKLSNkZWZpbmUgQUQ3MTUwX0NIMV9BVkdfTE9XICAgICAgICAgNgotI2RlZmluZSBBRDcxNTBfQ0gyX0FWR19ISUdIICAgICAgICA3Ci0jZGVmaW5lIEFENzE1MF9DSDJfQVZHX0xPVyAgICAgICAgIDgKLSNkZWZpbmUgQUQ3MTUwX0NIMV9TRU5TSVRJVklUWSAgICAgOQotI2RlZmluZSBBRDcxNTBfQ0gxX1RIUl9IT0xEX0ggICAgICA5Ci0jZGVmaW5lIEFENzE1MF9DSDFfVElNRU9VVCAgICAgICAgIDEwCi0jZGVmaW5lIEFENzE1MF9DSDFfVEhSX0hPTERfTCAgICAgIDEwCi0jZGVmaW5lIEFENzE1MF9DSDFfU0VUVVAgICAgICAgICAgIDExCi0jZGVmaW5lIEFENzE1MF9DSDJfU0VOU0lUSVZJVFkgICAgIDEyCi0jZGVmaW5lIEFENzE1MF9DSDJfVEhSX0hPTERfSCAgICAgIDEyCi0jZGVmaW5lIEFENzE1MF9DSDJfVElNRU9VVCAgICAgICAgIDEzCi0jZGVmaW5lIEFENzE1MF9DSDJfVEhSX0hPTERfTCAgICAgIDEzCi0jZGVmaW5lIEFENzE1MF9DSDJfU0VUVVAgICAgICAgICAgIDE0Ci0jZGVmaW5lIEFENzE1MF9DRkcgICAgICAgICAgICAgICAgIDE1Ci0jZGVmaW5lIEFENzE1MF9DRkdfRklYICAgICAgICAgICAgICgxIDw8IDcpCi0jZGVmaW5lIEFENzE1MF9QRF9USU1FUiAgICAgICAgICAgIDE2Ci0jZGVmaW5lIEFENzE1MF9DSDFfQ0FQREFDICAgICAgICAgIDE3Ci0jZGVmaW5lIEFENzE1MF9DSDJfQ0FQREFDICAgICAgICAgIDE4Ci0jZGVmaW5lIEFENzE1MF9TTjMgICAgICAgICAgICAgICAgIDE5Ci0jZGVmaW5lIEFENzE1MF9TTjIgICAgICAgICAgICAgICAgIDIwCi0jZGVmaW5lIEFENzE1MF9TTjEgICAgICAgICAgICAgICAgIDIxCi0jZGVmaW5lIEFENzE1MF9TTjAgICAgICAgICAgICAgICAgIDIyCi0jZGVmaW5lIEFENzE1MF9JRCAgICAgICAgICAgICAgICAgIDIzCi0KLSNkZWZpbmUgQUQ3MTUwX01BWF9DT05WX01PREUgICAgICAgNAotCi0vKgotICogc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmMgaW5mb3JtYXRpb24KLSAqLwotCi1zdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKLQlib29sIGludGVyOwotCXUxNiBjaDFfdGhyZXNob2xkOyAgICAgLyogQ2gxIFRocmVzaG9sZCAoaW4gZml4ZWQgdGhyZXNob2xkIG1vZGUpICovCi0JdTggIGNoMV9zZW5zaXRpdml0eTsgICAvKiBDaDEgU2Vuc2l0aXZpdHkgKGluIGFkYXB0aXZlIHRocmVzaG9sZCBtb2RlKSAqLwotCXU4ICBjaDFfdGltZW91dDsgICAgICAgLyogQ2gxIFRpbWVvdXQgKGluIGFkYXB0aXZlIHRocmVzaG9sZCBtb2RlKSAqLwotCXU4ICBjaDFfc2V0dXA7Ci0JdTE2IGNoMl90aHJlc2hvbGQ7ICAgICAvKiBDaDIgVGhyZXNob2xkIChpbiBmaXhlZCB0aHJlc2hvbGQgbW9kZSkgKi8KLQl1OCAgY2gyX3NlbnNpdGl2aXR5OyAgIC8qIENoMSBTZW5zaXRpdml0eSAoaW4gYWRhcHRpdmUgdGhyZXNob2xkIG1vZGUpICovCi0JdTggIGNoMl90aW1lb3V0OyAgICAgICAvKiBDaDEgVGltZW91dCAoaW4gYWRhcHRpdmUgdGhyZXNob2xkIG1vZGUpICovCi0JdTggIGNoMl9zZXR1cDsKLQl1OCAgcG93ZXJkb3duX3RpbWVyOwotCWNoYXIgdGhyZXNob2xkX21vZGVbMTBdOyAvKiBhZGFwdGl2ZS9maXhlZCB0aHJlc2hvbGQgbW9kZSAqLwotCWludCBvbGRfc3RhdGU7Ci0JY2hhciAqY29udmVyc2lvbl9tb2RlOwotfTsKLQotc3RydWN0IGFkNzE1MF9jb252ZXJzaW9uX21vZGUgewotCWNoYXIgKm5hbWU7Ci0JdTggcmVnX2NmZzsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWQ3MTUwX2NvbnZlcnNpb25fbW9kZQotYWQ3MTUwX2NvbnZfbW9kZV90YWJsZVtBRDcxNTBfTUFYX0NPTlZfTU9ERV0gPSB7Ci0JeyAiaWRsZSIsIDAgfSwKLQl7ICJjb250aW51b3VzLWNvbnZlcnNpb24iLCAxIH0sCi0JeyAic2luZ2xlLWNvbnZlcnNpb24iLCAyIH0sCi0JeyAicG93ZXItZG93biIsIDMgfSwKLX07Ci0KLS8qCi0gKiBhZDcxNTAgcmVnaXN0ZXIgYWNjZXNzIGJ5IEkyQwotICovCi0KLXN0YXRpYyBpbnQgYWQ3MTUwX2kyY19yZWFkKHN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwLCB1OCByZWcsIHU4ICpkYXRhLCBpbnQgbGVuKQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7Ci0JaW50IHJldCA9IDA7Ci0KLQlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCAmcmVnLCAxKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyB3cml0ZSBlcnJvclxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwgZGF0YSwgbGVuKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyByZWFkIGVycm9yXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGFkNzE1MF9pMmNfd3JpdGUoc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTggZGF0YSkKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OwotCWludCByZXQgPSAwOwotCi0JdTggdHhbMl0gPSB7Ci0JCXJlZywKLQkJZGF0YSwKLQl9OwotCi0JcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgdHgsIDIpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyB3cml0ZSBlcnJvclxuIik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogc3lzZnMgbm9kZXMKLSAqLwotCi0jZGVmaW5lIElJT19ERVZfQVRUUl9BVkFJTF9DT05WRVJTSU9OX01PREVTKF9zaG93KQkJCQlcCi0JSUlPX0RFVklDRV9BVFRSKGF2YWlsYWJsZV9jb252ZXJzaW9uX21vZGVzLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0NPTlZFUlNJT05fTU9ERShfbW9kZSwgX3Nob3csIF9zdG9yZSkgICAgICAgICAgICAgIFwKLQlJSU9fREVWSUNFX0FUVFIoY29udmVyc2lvbl9tb2RlLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0FWQUlMX1RIUkVTSE9MRF9NT0RFUyhfc2hvdykJCQkJXAotCUlJT19ERVZJQ0VfQVRUUihhdmFpbGFibGVfdGhyZXNob2xkX21vZGVzLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKLSNkZWZpbmUgSUlPX0RFVl9BVFRSX1RIUkVTSE9MRF9NT0RFKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJXAotCUlJT19ERVZJQ0VfQVRUUih0aHJlc2hvbGRfbW9kZSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCi0jZGVmaW5lIElJT19ERVZfQVRUUl9DSDFfVEhSRVNIT0xEKF9tb2RlLCBfc2hvdywgX3N0b3JlKSAgICAgICAgICAgICAgXAotCUlJT19ERVZJQ0VfQVRUUihjaDFfdGhyZXNob2xkLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMl9USFJFU0hPTEQoX21vZGUsIF9zaG93LCBfc3RvcmUpICAgICAgICAgICAgICBcCi0JSUlPX0RFVklDRV9BVFRSKGNoMl90aHJlc2hvbGQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQotI2RlZmluZSBJSU9fREVWX0FUVFJfQ0gxX1NFTlNJVElWSVRZKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJXAotCUlJT19ERVZJQ0VfQVRUUihjaDFfc2Vuc2l0aXZpdHksIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQotI2RlZmluZSBJSU9fREVWX0FUVFJfQ0gyX1NFTlNJVElWSVRZKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJXAotCUlJT19ERVZJQ0VfQVRUUihjaDJfc2Vuc2l0aXZpdHksIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQotI2RlZmluZSBJSU9fREVWX0FUVFJfQ0gxX1RJTUVPVVQoX21vZGUsIF9zaG93LCBfc3RvcmUpCQlcCi0JSUlPX0RFVklDRV9BVFRSKGNoMV90aW1lb3V0LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMl9USU1FT1VUKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJXAotCUlJT19ERVZJQ0VfQVRUUihjaDJfdGltZW91dCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCi0jZGVmaW5lIElJT19ERVZfQVRUUl9DSDFfVkFMVUUoX3Nob3cpCQlcCi0JSUlPX0RFVklDRV9BVFRSKGNoMV92YWx1ZSwgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCi0jZGVmaW5lIElJT19ERVZfQVRUUl9DSDJfVkFMVUUoX3Nob3cpCQlcCi0JSUlPX0RFVklDRV9BVFRSKGNoMl92YWx1ZSwgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCi0jZGVmaW5lIElJT19ERVZfQVRUUl9DSDFfU0VUVVAoX21vZGUsIF9zaG93LCBfc3RvcmUpCQlcCi0JSUlPX0RFVklDRV9BVFRSKGNoMV9zZXR1cCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCi0jZGVmaW5lIElJT19ERVZfQVRUUl9DSDJfU0VUVVAoX21vZGUsIF9zaG93LCBfc3RvcmUpICAgICAgICAgICAgICBcCi0JSUlPX0RFVklDRV9BVFRSKGNoMl9zZXR1cCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCi0jZGVmaW5lIElJT19ERVZfQVRUUl9QT1dFUkRPV05fVElNRVIoX21vZGUsIF9zaG93LCBfc3RvcmUpICAgICAgICAgICAgICBcCi0JSUlPX0RFVklDRV9BVFRSKHBvd2VyZG93bl90aW1lciwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCi0KLXN0YXRpYyBzc2l6ZV90IGFkNzE1MF9zaG93X2NvbnZlcnNpb25fbW9kZXMoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQotewotCWludCBpOwotCWludCBsZW4gPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IEFENzE1MF9NQVhfQ09OVl9NT0RFOyBpKyspCi0JCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVzXG4iLCBhZDcxNTBfY29udl9tb2RlX3RhYmxlW2ldLm5hbWUpOwotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIElJT19ERVZfQVRUUl9BVkFJTF9DT05WRVJTSU9OX01PREVTKGFkNzE1MF9zaG93X2NvbnZlcnNpb25fbW9kZXMpOwotCi1zdGF0aWMgc3NpemVfdCBhZDcxNTBfc2hvd19jb252ZXJzaW9uX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNoaXAtPmNvbnZlcnNpb25fbW9kZSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzE1MF9zdG9yZV9jb252ZXJzaW9uX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgbGVuKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCXU4IGNmZzsKLQlpbnQgaTsKLQotCWFkNzE1MF9pMmNfcmVhZChjaGlwLCBBRDcxNTBfQ0ZHLCAmY2ZnLCAxKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBRDcxNTBfTUFYX0NPTlZfTU9ERTsgaSsrKSB7Ci0JCWlmIChzdHJuY21wKGJ1ZiwgYWQ3MTUwX2NvbnZfbW9kZV90YWJsZVtpXS5uYW1lLAotCQkJCXN0cmxlbihhZDcxNTBfY29udl9tb2RlX3RhYmxlW2ldLm5hbWUpIC0gMSkgPT0gMCkgewotCQkJY2hpcC0+Y29udmVyc2lvbl9tb2RlID0gYWQ3MTUwX2NvbnZfbW9kZV90YWJsZVtpXS5uYW1lOwotCQkJY2ZnIHw9IDB4MTggfCBhZDcxNTBfY29udl9tb2RlX3RhYmxlW2ldLnJlZ19jZmc7Ci0JCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DRkcsIGNmZyk7Ci0JCQlyZXR1cm4gbGVuOwotCQl9Ci0JfQotCi0JZGV2X2VycihkZXYsICJub3Qgc3VwcG9ydGVkIGNvbnZlcnNpb24gbW9kZVxuIik7Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIElJT19ERVZfQVRUUl9DT05WRVJTSU9OX01PREUoU19JUlVHTyB8IFNfSVdVU1IsCi0JCWFkNzE1MF9zaG93X2NvbnZlcnNpb25fbW9kZSwKLQkJYWQ3MTUwX3N0b3JlX2NvbnZlcnNpb25fbW9kZSk7Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzE1MF9zaG93X3RocmVzaG9sZF9tb2RlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCi17Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiYWRhcHRpdmVcbmZpeGVkXG4iKTsKLX0KLQotc3RhdGljIElJT19ERVZfQVRUUl9BVkFJTF9USFJFU0hPTERfTU9ERVMoYWQ3MTUwX3Nob3dfdGhyZXNob2xkX21vZGVzKTsKLQotc3RhdGljIHNzaXplX3QgYWQ3MTUwX3Nob3dfY2gxX3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQl1OCBkYXRhWzJdOwotCi0JYWQ3MTUwX2kyY19yZWFkKGNoaXAsIEFENzE1MF9DSDFfREFUQV9ISUdILCBkYXRhLCAyKTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKChpbnQpIGRhdGFbMF0gPDwgOCkgfCBkYXRhWzFdKTsKLX0KLQotc3RhdGljIElJT19ERVZfQVRUUl9DSDFfVkFMVUUoYWQ3MTUwX3Nob3dfY2gxX3ZhbHVlKTsKLQotc3RhdGljIHNzaXplX3QgYWQ3MTUwX3Nob3dfY2gyX3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQl1OCBkYXRhWzJdOwotCi0JYWQ3MTUwX2kyY19yZWFkKGNoaXAsIEFENzE1MF9DSDJfREFUQV9ISUdILCBkYXRhLCAyKTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgKChpbnQpIGRhdGFbMF0gPDwgOCkgfCBkYXRhWzFdKTsKLX0KLQotc3RhdGljIElJT19ERVZfQVRUUl9DSDJfVkFMVUUoYWQ3MTUwX3Nob3dfY2gyX3ZhbHVlKTsKLQotc3RhdGljIHNzaXplX3QgYWQ3MTUwX3Nob3dfdGhyZXNob2xkX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNoaXAtPnRocmVzaG9sZF9tb2RlKTsKLX0KLQotc3RhdGljIHNzaXplX3QgYWQ3MTUwX3N0b3JlX3RocmVzaG9sZF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQl1OCBjZmc7Ci0KLQlhZDcxNTBfaTJjX3JlYWQoY2hpcCwgQUQ3MTUwX0NGRywgJmNmZywgMSk7Ci0KLQlpZiAoc3RybmNtcChidWYsICJmaXhlZCIsIDUpID09IDApIHsKLQkJc3RyY3B5KGNoaXAtPnRocmVzaG9sZF9tb2RlLCAiZml4ZWQiKTsKLQkJY2ZnIHw9IEFENzE1MF9DRkdfRklYOwotCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DRkcsIGNmZyk7Ci0KLQkJcmV0dXJuIGxlbjsKLQl9IGVsc2UgaWYgKHN0cm5jbXAoYnVmLCAiYWRhcHRpdmUiLCA4KSA9PSAwKSB7Ci0JCXN0cmNweShjaGlwLT50aHJlc2hvbGRfbW9kZSwgImFkYXB0aXZlIik7Ci0JCWNmZyAmPSB+QUQ3MTUwX0NGR19GSVg7Ci0JCWFkNzE1MF9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUwX0NGRywgY2ZnKTsKLQotCQlyZXR1cm4gbGVuOwotCX0KLQotCWRldl9lcnIoZGV2LCAibm90IHN1cHBvcnRlZCB0aHJlc2hvbGQgbW9kZVxuIik7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBJSU9fREVWX0FUVFJfVEhSRVNIT0xEX01PREUoU19JUlVHTyB8IFNfSVdVU1IsCi0JCWFkNzE1MF9zaG93X3RocmVzaG9sZF9tb2RlLAotCQlhZDcxNTBfc3RvcmVfdGhyZXNob2xkX21vZGUpOwotCi1zdGF0aWMgc3NpemVfdCBhZDcxNTBfc2hvd19jaDFfdGhyZXNob2xkKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjaGlwLT5jaDFfdGhyZXNob2xkKTsKLX0KLQotc3RhdGljIHNzaXplX3QgYWQ3MTUwX3N0b3JlX2NoMV90aHJlc2hvbGQoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgbGVuKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCXVuc2lnbmVkIGxvbmcgZGF0YTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOwotCi0JaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwMDApKSB7Ci0JCWFkNzE1MF9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUwX0NIMV9USFJfSE9MRF9ILCBkYXRhID4+IDgpOwotCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DSDFfVEhSX0hPTERfTCwgZGF0YSk7Ci0JCWNoaXAtPmNoMV90aHJlc2hvbGQgPSBkYXRhOwotCQlyZXR1cm4gbGVuOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgSUlPX0RFVl9BVFRSX0NIMV9USFJFU0hPTEQoU19JUlVHTyB8IFNfSVdVU1IsCi0JCWFkNzE1MF9zaG93X2NoMV90aHJlc2hvbGQsCi0JCWFkNzE1MF9zdG9yZV9jaDFfdGhyZXNob2xkKTsKLQotc3RhdGljIHNzaXplX3QgYWQ3MTUwX3Nob3dfY2gyX3RocmVzaG9sZChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+Y2gyX3RocmVzaG9sZCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzE1MF9zdG9yZV9jaDJfdGhyZXNob2xkKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQl1bnNpZ25lZCBsb25nIGRhdGE7Ci0JaW50IHJldDsKLQotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKLQotCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMDAwKSkgewotCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DSDJfVEhSX0hPTERfSCwgZGF0YSA+PiA4KTsKLQkJYWQ3MTUwX2kyY193cml0ZShjaGlwLCBBRDcxNTBfQ0gyX1RIUl9IT0xEX0wsIGRhdGEpOwotCQljaGlwLT5jaDJfdGhyZXNob2xkID0gZGF0YTsKLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIElJT19ERVZfQVRUUl9DSDJfVEhSRVNIT0xEKFNfSVJVR08gfCBTX0lXVVNSLAotCQlhZDcxNTBfc2hvd19jaDJfdGhyZXNob2xkLAotCQlhZDcxNTBfc3RvcmVfY2gyX3RocmVzaG9sZCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzE1MF9zaG93X2NoMV9zZW5zaXRpdml0eShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+Y2gxX3NlbnNpdGl2aXR5KTsKLX0KLQotc3RhdGljIHNzaXplX3QgYWQ3MTUwX3N0b3JlX2NoMV9zZW5zaXRpdml0eShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljb25zdCBjaGFyICpidWYsCi0JCXNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0JdW5zaWduZWQgbG9uZyBkYXRhOwotCWludCByZXQ7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7Ci0KLQlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHgxMDApKSB7Ci0JCWFkNzE1MF9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUwX0NIMV9TRU5TSVRJVklUWSwgZGF0YSk7Ci0JCWNoaXAtPmNoMV9zZW5zaXRpdml0eSA9IGRhdGE7Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBJSU9fREVWX0FUVFJfQ0gxX1NFTlNJVElWSVRZKFNfSVJVR08gfCBTX0lXVVNSLAotCQlhZDcxNTBfc2hvd19jaDFfc2Vuc2l0aXZpdHksCi0JCWFkNzE1MF9zdG9yZV9jaDFfc2Vuc2l0aXZpdHkpOwotCi1zdGF0aWMgc3NpemVfdCBhZDcxNTBfc2hvd19jaDJfc2Vuc2l0aXZpdHkoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPmNoMl9zZW5zaXRpdml0eSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzE1MF9zdG9yZV9jaDJfc2Vuc2l0aXZpdHkoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgbGVuKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCXVuc2lnbmVkIGxvbmcgZGF0YTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOwotCi0JaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwKSkgewotCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DSDJfU0VOU0lUSVZJVFksIGRhdGEpOwotCQljaGlwLT5jaDJfc2Vuc2l0aXZpdHkgPSBkYXRhOwotCQlyZXR1cm4gbGVuOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgSUlPX0RFVl9BVFRSX0NIMl9TRU5TSVRJVklUWShTX0lSVUdPIHwgU19JV1VTUiwKLQkJYWQ3MTUwX3Nob3dfY2gyX3NlbnNpdGl2aXR5LAotCQlhZDcxNTBfc3RvcmVfY2gyX3NlbnNpdGl2aXR5KTsKLQotc3RhdGljIHNzaXplX3QgYWQ3MTUwX3Nob3dfY2gxX3RpbWVvdXQoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPmNoMV90aW1lb3V0KTsKLX0KLQotc3RhdGljIHNzaXplX3QgYWQ3MTUwX3N0b3JlX2NoMV90aW1lb3V0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQl1bnNpZ25lZCBsb25nIGRhdGE7Ci0JaW50IHJldDsKLQotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKLQotCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMCkpIHsKLQkJYWQ3MTUwX2kyY193cml0ZShjaGlwLCBBRDcxNTBfQ0gxX1RJTUVPVVQsIGRhdGEpOwotCQljaGlwLT5jaDFfdGltZW91dCA9IGRhdGE7Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBJSU9fREVWX0FUVFJfQ0gxX1RJTUVPVVQoU19JUlVHTyB8IFNfSVdVU1IsCi0JCWFkNzE1MF9zaG93X2NoMV90aW1lb3V0LAotCQlhZDcxNTBfc3RvcmVfY2gxX3RpbWVvdXQpOwotCi1zdGF0aWMgc3NpemVfdCBhZDcxNTBfc2hvd19jaDJfdGltZW91dChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+Y2gyX3RpbWVvdXQpOwotfQotCi1zdGF0aWMgc3NpemVfdCBhZDcxNTBfc3RvcmVfY2gyX3RpbWVvdXQoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgbGVuKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCXVuc2lnbmVkIGxvbmcgZGF0YTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOwotCi0JaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwKSkgewotCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DSDJfVElNRU9VVCwgZGF0YSk7Ci0JCWNoaXAtPmNoMl90aW1lb3V0ID0gZGF0YTsKLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIElJT19ERVZfQVRUUl9DSDJfVElNRU9VVChTX0lSVUdPIHwgU19JV1VTUiwKLQkJYWQ3MTUwX3Nob3dfY2gyX3RpbWVvdXQsCi0JCWFkNzE1MF9zdG9yZV9jaDJfdGltZW91dCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzE1MF9zaG93X2NoMV9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwMnhcbiIsIGNoaXAtPmNoMV9zZXR1cCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzE1MF9zdG9yZV9jaDFfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgbGVuKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCXVuc2lnbmVkIGxvbmcgZGF0YTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOwotCi0JaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwKSkgewotCQlhZDcxNTBfaTJjX3dyaXRlKGNoaXAsIEFENzE1MF9DSDFfU0VUVVAsIGRhdGEpOwotCQljaGlwLT5jaDFfc2V0dXAgPSBkYXRhOwotCQlyZXR1cm4gbGVuOwotCX0KLQotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBJSU9fREVWX0FUVFJfQ0gxX1NFVFVQKFNfSVJVR08gfCBTX0lXVVNSLAotCQlhZDcxNTBfc2hvd19jaDFfc2V0dXAsCi0JCWFkNzE1MF9zdG9yZV9jaDFfc2V0dXApOwotCi1zdGF0aWMgc3NpemVfdCBhZDcxNTBfc2hvd19jaDJfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDJ4XG4iLCBjaGlwLT5jaDJfc2V0dXApOwotfQotCi1zdGF0aWMgc3NpemVfdCBhZDcxNTBfc3RvcmVfY2gyX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQl1bnNpZ25lZCBsb25nIGRhdGE7Ci0JaW50IHJldDsKLQotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKLQotCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMCkpIHsKLQkJYWQ3MTUwX2kyY193cml0ZShjaGlwLCBBRDcxNTBfQ0gyX1NFVFVQLCBkYXRhKTsKLQkJY2hpcC0+Y2gyX3NldHVwID0gZGF0YTsKLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIElJT19ERVZfQVRUUl9DSDJfU0VUVVAoU19JUlVHTyB8IFNfSVdVU1IsCi0JCWFkNzE1MF9zaG93X2NoMl9zZXR1cCwKLQkJYWQ3MTUwX3N0b3JlX2NoMl9zZXR1cCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzE1MF9zaG93X3Bvd2VyZG93bl90aW1lcihzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwMnhcbiIsIGNoaXAtPnBvd2VyZG93bl90aW1lcik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzE1MF9zdG9yZV9wb3dlcmRvd25fdGltZXIoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgbGVuKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCXVuc2lnbmVkIGxvbmcgZGF0YTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOwotCi0JaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4NDApKSB7Ci0JCWNoaXAtPnBvd2VyZG93bl90aW1lciA9IGRhdGE7Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBJSU9fREVWX0FUVFJfUE9XRVJET1dOX1RJTUVSKFNfSVJVR08gfCBTX0lXVVNSLAotCQlhZDcxNTBfc2hvd19wb3dlcmRvd25fdGltZXIsCi0JCWFkNzE1MF9zdG9yZV9wb3dlcmRvd25fdGltZXIpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3MTUwX2F0dHJpYnV0ZXNbXSA9IHsKLQkmaWlvX2Rldl9hdHRyX2F2YWlsYWJsZV90aHJlc2hvbGRfbW9kZXMuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX3RocmVzaG9sZF9tb2RlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9jaDFfdGhyZXNob2xkLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9jaDJfdGhyZXNob2xkLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9jaDFfdGltZW91dC5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfY2gyX3RpbWVvdXQuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2NoMV9zZXR1cC5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfY2gyX3NldHVwLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9jaDFfc2Vuc2l0aXZpdHkuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2NoMl9zZW5zaXRpdml0eS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfcG93ZXJkb3duX3RpbWVyLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9jaDFfdmFsdWUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2NoMl92YWx1ZS5kZXZfYXR0ci5hdHRyLAotCU5VTEwsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDcxNTBfYXR0cmlidXRlX2dyb3VwID0gewotCS5hdHRycyA9IGFkNzE1MF9hdHRyaWJ1dGVzLAotfTsKLQotLyoKLSAqIHRocmVzaG9sZCBldmVudHMKLSAqLwotCi1zdGF0aWMgaXJxcmV0dXJuX3QgYWQ3MTUwX2V2ZW50X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqcHJpdmF0ZSkKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcHJpdmF0ZTsKLQlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0JdTggaW50X3N0YXR1czsKLQlzNjQgdGltZXN0YW1wID0gaWlvX2dldF90aW1lX25zKCk7Ci0KLQlhZDcxNTBfaTJjX3JlYWQoY2hpcCwgQUQ3MTUwX1NUQVRVUywgJmludF9zdGF0dXMsIDEpOwotCi0JaWYgKChpbnRfc3RhdHVzICYgQUQ3MTUwX1NUQVRVU19PVVQxKSAmJiAhKGNoaXAtPm9sZF9zdGF0ZSAmIEFENzE1MF9TVEFUVVNfT1VUMSkpCi0JCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwgMCwKLQkJCSAgICAgICBJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fRVZfQ0xBU1NfSU4sCi0JCQkJCQkgICAgMCwKLQkJCQkJCSAgICBJSU9fRVZfVFlQRV9USFJFU0gsCi0JCQkJCQkgICAgSUlPX0VWX0RJUl9SSVNJTkcpLAotCQkJCXRpbWVzdGFtcCk7Ci0JZWxzZSBpZiAoKCEoaW50X3N0YXR1cyAmIEFENzE1MF9TVEFUVVNfT1VUMSkpICYmIChjaGlwLT5vbGRfc3RhdGUgJiBBRDcxNTBfU1RBVFVTX09VVDEpKQotCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsIDAsCi0JCQkgICAgICAgSUlPX1VOTU9EX0VWRU5UX0NPREUoSUlPX0VWX0NMQVNTX0lOLAotCQkJCQkJICAgIDAsCi0JCQkJCQkgICAgSUlPX0VWX1RZUEVfVEhSRVNILAotCQkJCQkJICAgIElJT19FVl9ESVJfRkFMTElORyksCi0JCQkgICAgICAgdGltZXN0YW1wKTsKLQotCWlmICgoaW50X3N0YXR1cyAmIEFENzE1MF9TVEFUVVNfT1VUMikgJiYgIShjaGlwLT5vbGRfc3RhdGUgJiBBRDcxNTBfU1RBVFVTX09VVDIpKQotCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsIDAsCi0JCQkgICAgICAgSUlPX1VOTU9EX0VWRU5UX0NPREUoSUlPX0VWX0NMQVNTX0lOLAotCQkJCQkJICAgIDEsCi0JCQkJCQkgICAgSUlPX0VWX1RZUEVfVEhSRVNILAotCQkJCQkJICAgIElJT19FVl9ESVJfUklTSU5HKSwKLQkJCSAgICAgICB0aW1lc3RhbXApOwotCWVsc2UgaWYgKCghKGludF9zdGF0dXMgJiBBRDcxNTBfU1RBVFVTX09VVDIpKSAmJiAoY2hpcC0+b2xkX3N0YXRlICYgQUQ3MTUwX1NUQVRVU19PVVQyKSkKLQkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LCAwLAotCQkJICAgICAgIElJT19VTk1PRF9FVkVOVF9DT0RFKElJT19FVl9DTEFTU19JTiwKLQkJCQkJCSAgICAxLAotCQkJCQkJICAgIElJT19FVl9UWVBFX1RIUkVTSCwKLQkJCQkJCSAgICBJSU9fRVZfRElSX0ZBTExJTkcpLAotCQkJICAgICAgIHRpbWVzdGFtcCk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgSUlPX0NPTlNUX0FUVFIoY2gxX2hpZ2hfZW4sICIxIik7Ci1zdGF0aWMgSUlPX0NPTlNUX0FUVFIoY2gyX2hpZ2hfZW4sICIxIik7Ci1zdGF0aWMgSUlPX0NPTlNUX0FUVFIoY2gxX2xvd19lbiwgIjEiKTsKLXN0YXRpYyBJSU9fQ09OU1RfQVRUUihjaDJfbG93X2VuLCAiMSIpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3MTUwX2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKLQkmaWlvX2NvbnN0X2F0dHJfY2gxX2hpZ2hfZW4uZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2NvbnN0X2F0dHJfY2gyX2hpZ2hfZW4uZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2NvbnN0X2F0dHJfY2gxX2xvd19lbi5kZXZfYXR0ci5hdHRyLAotCSZpaW9fY29uc3RfYXR0cl9jaDJfbG93X2VuLmRldl9hdHRyLmF0dHIsCi0JTlVMTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNzE1MF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gYWQ3MTUwX2V2ZW50X2F0dHJpYnV0ZXMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkNzE1MF9pbmZvID0gewotCS5hdHRycyA9ICZhZDcxNTBfYXR0cmlidXRlX2dyb3VwLAotCS5udW1faW50ZXJydXB0X2xpbmVzID0gMSwKLQkuZXZlbnRfYXR0cnMgPSAmYWQ3MTUwX2V2ZW50X2F0dHJpYnV0ZV9ncm91cCwKLQkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAotfTsKLS8qCi0gKiBkZXZpY2UgcHJvYmUgYW5kIHJlbW92ZQotICovCi0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGFkNzE1MF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJldCA9IDAsIHJlZ2RvbmUgPSAwOwotCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwOwotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7Ci0KLQlpbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKHNpemVvZigqY2hpcCkpOwotCWlmIChpbmRpb19kZXYgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yX3JldDsKLQl9Ci0JY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0JLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRldmljZSByZW1vdmFsIHB1cnBvc2VzICovCi0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgaW5kaW9fZGV2KTsKLQotCWNoaXAtPmNsaWVudCA9IGNsaWVudDsKLQotCS8qIEVzdGFibGlzaCB0aGF0IHRoZSBpaW9fZGV2IGlzIGEgY2hpbGQgb2YgdGhlIGkyYyBkZXZpY2UgKi8KLQlpbmRpb19kZXYtPm5hbWUgPSBpZC0+bmFtZTsKLQlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7Ci0KLQlpbmRpb19kZXYtPmluZm8gPSAmYWQ3MTUwX2luZm87Ci0KLQlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7Ci0KLQlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcl9mcmVlX2RldjsKLQlyZWdkb25lID0gMTsKLQotCWlmIChjbGllbnQtPmlycSkgewotCQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShjbGllbnQtPmlycSwKLQkJCQkJICAgTlVMTCwKLQkJCQkJICAgJmFkNzE1MF9ldmVudF9oYW5kbGVyLAotCQkJCQkgICBJUlFGX1RSSUdHRVJfUklTSU5HIHwKLQkJCQkJICAgSVJRRl9UUklHR0VSX0ZBTExJTkcsCi0JCQkJCSAgICJhZDcxNTAiLAotCQkJCQkgICBpbmRpb19kZXYpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnJvcl9mcmVlX2RldjsKLQl9Ci0KLQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzIGNhcGFjaXRpdmUgc2Vuc29yIHJlZ2lzdGVyZWQsIGlycTogJWRcbiIsIGlkLT5uYW1lLCBjbGllbnQtPmlycSk7Ci0KLQlyZXR1cm4gMDsKLQotZXJyb3JfZnJlZV9kZXY6Ci0JaWYgKHJlZ2RvbmUpCi0JCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwotCWVsc2UKLQkJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7Ci1lcnJvcl9yZXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2RldmV4aXQgYWQ3MTUwX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKLQotCWlmIChjbGllbnQtPmlycSkKLQkJZnJlZV9pcnEoY2xpZW50LT5pcnEsIGluZGlvX2Rldik7Ci0JaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkNzE1MF9pZFtdID0gewotCXsgImFkNzE1MCIsIDAgfSwKLQl7ICJhZDcxNTEiLCAwIH0sCi0JeyAiYWQ3MTU2IiwgMCB9LAotCXt9Ci19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWQ3MTUwX2lkKTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkNzE1MF9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiYWQ3MTUwIiwKLQl9LAotCS5wcm9iZSA9IGFkNzE1MF9wcm9iZSwKLQkucmVtb3ZlID0gX19kZXZleGl0X3AoYWQ3MTUwX3JlbW92ZSksCi0JLmlkX3RhYmxlID0gYWQ3MTUwX2lkLAotfTsKLQotc3RhdGljIF9faW5pdCBpbnQgYWQ3MTUwX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmFkNzE1MF9kcml2ZXIpOwotfQotCi1zdGF0aWMgX19leGl0IHZvaWQgYWQ3MTUwX2V4aXQodm9pZCkKLXsKLQlpMmNfZGVsX2RyaXZlcigmYWQ3MTUwX2RyaXZlcik7Ci19Ci0KLU1PRFVMRV9BVVRIT1IoIkJhcnJ5IFNvbmcgPDIxY25iYW9AZ21haWwuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBhZDcxNTAvMS82IGNhcGFjaXRpdmUgc2Vuc29yIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotCi1tb2R1bGVfaW5pdChhZDcxNTBfaW5pdCk7Ci1tb2R1bGVfZXhpdChhZDcxNTBfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcxNTIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzE1Mi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWY1ZjM4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzE1Mi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTg2ICswLDAgQEAKLS8qCi0gKiBBRDcxNTIgY2FwYWNpdGl2ZSBzZW5zb3IgZHJpdmVyIHN1cHBvcnRpbmcgQUQ3MTUyLzMKLSAqCi0gKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLQotI2luY2x1ZGUgIi4uL2lpby5oIgotI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCi0KLS8qCi0gKiBBRDcxNTIgcmVnaXN0ZXJzIGRlZmluaXRpb24KLSAqLwotCi0jZGVmaW5lIEFENzE1Ml9TVEFUVVMgICAgICAgICAgICAgIDAKLSNkZWZpbmUgQUQ3MTUyX1NUQVRVU19SRFkxICAgICAgICAgKDEgPDwgMCkKLSNkZWZpbmUgQUQ3MTUyX1NUQVRVU19SRFkyICAgICAgICAgKDEgPDwgMSkKLSNkZWZpbmUgQUQ3MTUyX0NIMV9EQVRBX0hJR0ggICAgICAgMQotI2RlZmluZSBBRDcxNTJfQ0gxX0RBVEFfTE9XICAgICAgICAyCi0jZGVmaW5lIEFENzE1Ml9DSDJfREFUQV9ISUdIICAgICAgIDMKLSNkZWZpbmUgQUQ3MTUyX0NIMl9EQVRBX0xPVyAgICAgICAgNAotI2RlZmluZSBBRDcxNTJfQ0gxX09GRlNfSElHSCAgICAgICA1Ci0jZGVmaW5lIEFENzE1Ml9DSDFfT0ZGU19MT1cgICAgICAgIDYKLSNkZWZpbmUgQUQ3MTUyX0NIMl9PRkZTX0hJR0ggICAgICAgNwotI2RlZmluZSBBRDcxNTJfQ0gyX09GRlNfTE9XICAgICAgICA4Ci0jZGVmaW5lIEFENzE1Ml9DSDFfR0FJTl9ISUdIICAgICAgIDkKLSNkZWZpbmUgQUQ3MTUyX0NIMV9HQUlOX0xPVyAgICAgICAgMTAKLSNkZWZpbmUgQUQ3MTUyX0NIMV9TRVRVUCAgICAgICAgICAgMTEKLSNkZWZpbmUgQUQ3MTUyX0NIMl9HQUlOX0hJR0ggICAgICAgMTIKLSNkZWZpbmUgQUQ3MTUyX0NIMl9HQUlOX0xPVyAgICAgICAgMTMKLSNkZWZpbmUgQUQ3MTUyX0NIMl9TRVRVUCAgICAgICAgICAgMTQKLSNkZWZpbmUgQUQ3MTUyX0NGRyAgICAgICAgICAgICAgICAgMTUKLSNkZWZpbmUgQUQ3MTUyX1JFU0VWRVJEICAgICAgICAgICAgMTYKLSNkZWZpbmUgQUQ3MTUyX0NBUERBQ19QT1MgICAgICAgICAgMTcKLSNkZWZpbmUgQUQ3MTUyX0NBUERBQ19ORUcgICAgICAgICAgMTgKLSNkZWZpbmUgQUQ3MTUyX0NGRzIgICAgICAgICAgICAgICAgMjYKLQotI2RlZmluZSBBRDcxNTJfTUFYX0NPTlZfTU9ERSAgICAgICA2Ci0KLS8qCi0gKiBzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAtIGNoaXAgc3BlY2lmYyBpbmZvcm1hdGlvbgotICovCi0KLXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwotCXUxNiBjaDFfb2Zmc2V0OyAgICAgLyogQ2hhbm5lbCAxIG9mZnNldCBjYWxpYnJhdGlvbiBjb2VmZmljaWVudCAqLwotCXUxNiBjaDFfZ2FpbjsgICAgICAgLyogQ2hhbm5lbCAxIGdhaW4gY29lZmZpY2llbnQgKi8KLQl1OCAgY2gxX3NldHVwOwotCXUxNiBjaDJfb2Zmc2V0OyAgICAgLyogQ2hhbm5lbCAyIG9mZnNldCBjYWxpYnJhdGlvbiBjb2VmZmljaWVudCAqLwotCXUxNiBjaDJfZ2FpbjsgICAgICAgLyogQ2hhbm5lbCAxIGdhaW4gY29lZmZpY2llbnQgKi8KLQl1OCAgY2gyX3NldHVwOwotCXU4ICBmaWx0ZXJfcmF0ZV9zZXR1cDsgLyogQ2FwYWNpdGl2ZSBjaGFubmVsIGRpZ2l0YWwgZmlsdGVyIHNldHVwOyBjb252ZXJzaW9uIHRpbWUvdXBkYXRlIHJhdGUgc2V0dXAgcGVyIGNoYW5uZWwgKi8KLQljaGFyICpjb252ZXJzaW9uX21vZGU7Ci19OwotCi1zdHJ1Y3QgYWQ3MTUyX2NvbnZlcnNpb25fbW9kZSB7Ci0JY2hhciAqbmFtZTsKLQl1OCByZWdfY2ZnOwotfTsKLQotc3RhdGljIHN0cnVjdCBhZDcxNTJfY29udmVyc2lvbl9tb2RlCi1hZDcxNTJfY29udl9tb2RlX3RhYmxlW0FENzE1Ml9NQVhfQ09OVl9NT0RFXSA9IHsKLQl7ICJpZGxlIiwgMCB9LAotCXsgImNvbnRpbnVvdXMtY29udmVyc2lvbiIsIDEgfSwKLQl7ICJzaW5nbGUtY29udmVyc2lvbiIsIDIgfSwKLQl7ICJwb3dlci1kb3duIiwgMyB9LAotCXsgIm9mZnNldC1jYWxpYnJhdGlvbiIsIDUgfSwKLQl7ICJnYWluLWNhbGlicmF0aW9uIiwgNiB9LAotfTsKLQotLyoKLSAqIGFkNzE1MiByZWdpc3RlciBhY2Nlc3MgYnkgSTJDCi0gKi8KLQotc3RhdGljIGludCBhZDcxNTJfaTJjX3JlYWQoc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTggKmRhdGEsIGludCBsZW4pCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKLQlpbnQgcmV0OwotCi0JcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgJnJlZywgMSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgd3JpdGUgZXJyb3JcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsIGRhdGEsIGxlbik7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgcmVhZCBlcnJvclxuIik7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhZDcxNTJfaTJjX3dyaXRlKHN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwLCB1OCByZWcsIHU4IGRhdGEpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKLQlpbnQgcmV0OwotCi0JdTggdHhbMl0gPSB7Ci0JCXJlZywKLQkJZGF0YSwKLQl9OwotCi0JcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgdHgsIDIpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyB3cml0ZSBlcnJvclxuIik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogc3lzZnMgbm9kZXMKLSAqLwotCi0jZGVmaW5lIElJT19ERVZfQVRUUl9BVkFJTF9DT05WRVJTSU9OX01PREVTKF9zaG93KQkJCQlcCi0JSUlPX0RFVklDRV9BVFRSKGF2YWlsYWJsZV9jb252ZXJzaW9uX21vZGVzLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0NPTlZFUlNJT05fTU9ERShfbW9kZSwgX3Nob3csIF9zdG9yZSkgICAgICAgICAgICAgIFwKLQlJSU9fREVWSUNFX0FUVFIoY29udmVyc2lvbl9tb2RlLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMV9PRkZTRVQoX21vZGUsIF9zaG93LCBfc3RvcmUpCQlcCi0JSUlPX0RFVklDRV9BVFRSKGNoMV9vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQotI2RlZmluZSBJSU9fREVWX0FUVFJfQ0gyX09GRlNFVChfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKLQlJSU9fREVWSUNFX0FUVFIoY2gyX29mZnNldCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCi0jZGVmaW5lIElJT19ERVZfQVRUUl9DSDFfR0FJTihfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKLQlJSU9fREVWSUNFX0FUVFIoY2gxX2dhaW4sIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQotI2RlZmluZSBJSU9fREVWX0FUVFJfQ0gyX0dBSU4oX21vZGUsIF9zaG93LCBfc3RvcmUpCQlcCi0JSUlPX0RFVklDRV9BVFRSKGNoMl9nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMV9WQUxVRShfc2hvdykJCVwKLQlJSU9fREVWSUNFX0FUVFIoY2gxX3ZhbHVlLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMl9WQUxVRShfc2hvdykJCVwKLQlJSU9fREVWSUNFX0FUVFIoY2gyX3ZhbHVlLCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMV9TRVRVUChfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKLQlJSU9fREVWSUNFX0FUVFIoY2gxX3NldHVwLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0NIMl9TRVRVUChfbW9kZSwgX3Nob3csIF9zdG9yZSkgICAgICAgICAgICAgIFwKLQlJSU9fREVWSUNFX0FUVFIoY2gyX3NldHVwLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0ZJTFRFUl9SQVRFX1NFVFVQKF9tb2RlLCBfc2hvdywgX3N0b3JlKSAgICAgICAgICAgICAgXAotCUlJT19ERVZJQ0VfQVRUUihmaWx0ZXJfcmF0ZV9zZXR1cCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCi0KLXN0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zaG93X2NvbnZlcnNpb25fbW9kZXMoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQotewotCWludCBpOwotCWludCBsZW4gPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IEFENzE1Ml9NQVhfQ09OVl9NT0RFOyBpKyspCi0JCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVzICIsIGFkNzE1Ml9jb252X21vZGVfdGFibGVbaV0ubmFtZSk7Ci0KLQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJcbiIpOwotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIElJT19ERVZfQVRUUl9BVkFJTF9DT05WRVJTSU9OX01PREVTKGFkNzE1Ml9zaG93X2NvbnZlcnNpb25fbW9kZXMpOwotCi1zdGF0aWMgc3NpemVfdCBhZDcxNTJfc2hvd19jaDFfdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCXU4IGRhdGFbMl07Ci0KLQlhZDcxNTJfaTJjX3JlYWQoY2hpcCwgQUQ3MTUyX0NIMV9EQVRBX0hJR0gsIGRhdGEsIDIpOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoKGludClkYXRhWzBdIDw8IDgpIHwgZGF0YVsxXSk7Ci19Ci0KLXN0YXRpYyBJSU9fREVWX0FUVFJfQ0gxX1ZBTFVFKGFkNzE1Ml9zaG93X2NoMV92YWx1ZSk7Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zaG93X2NoMl92YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0JdTggZGF0YVsyXTsKLQotCWFkNzE1Ml9pMmNfcmVhZChjaGlwLCBBRDcxNTJfQ0gyX0RBVEFfSElHSCwgZGF0YSwgMik7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICgoaW50KWRhdGFbMF0gPDwgOCkgfCBkYXRhWzFdKTsKLX0KLQotc3RhdGljIElJT19ERVZfQVRUUl9DSDJfVkFMVUUoYWQ3MTUyX3Nob3dfY2gyX3ZhbHVlKTsKLQotc3RhdGljIHNzaXplX3QgYWQ3MTUyX3Nob3dfY29udmVyc2lvbl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBjaGlwLT5jb252ZXJzaW9uX21vZGUpOwotfQotCi1zdGF0aWMgc3NpemVfdCBhZDcxNTJfc3RvcmVfY29udmVyc2lvbl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQl1OCBjZmc7Ci0JaW50IGk7Ci0KLQlhZDcxNTJfaTJjX3JlYWQoY2hpcCwgQUQ3MTUyX0NGRywgJmNmZywgMSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQUQ3MTUyX01BWF9DT05WX01PREU7IGkrKykKLQkJaWYgKHN0cm5jbXAoYnVmLCBhZDcxNTJfY29udl9tb2RlX3RhYmxlW2ldLm5hbWUsCi0JCQkJc3RybGVuKGFkNzE1Ml9jb252X21vZGVfdGFibGVbaV0ubmFtZSkgLSAxKSA9PSAwKSB7Ci0JCQljaGlwLT5jb252ZXJzaW9uX21vZGUgPSBhZDcxNTJfY29udl9tb2RlX3RhYmxlW2ldLm5hbWU7Ci0JCQljZmcgfD0gMHgxOCB8IGFkNzE1Ml9jb252X21vZGVfdGFibGVbaV0ucmVnX2NmZzsKLQkJCWFkNzE1Ml9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUyX0NGRywgY2ZnKTsKLQkJCXJldHVybiBsZW47Ci0JCX0KLQotCWRldl9lcnIoZGV2LCAibm90IHN1cHBvcnRlZCBjb252ZXJzaW9uIG1vZGVcbiIpOwotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBJSU9fREVWX0FUVFJfQ09OVkVSU0lPTl9NT0RFKFNfSVJVR08gfCBTX0lXVVNSLAotCQlhZDcxNTJfc2hvd19jb252ZXJzaW9uX21vZGUsCi0JCWFkNzE1Ml9zdG9yZV9jb252ZXJzaW9uX21vZGUpOwotCi1zdGF0aWMgc3NpemVfdCBhZDcxNTJfc2hvd19jaDFfb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjaGlwLT5jaDFfb2Zmc2V0KTsKLX0KLQotc3RhdGljIHNzaXplX3QgYWQ3MTUyX3N0b3JlX2NoMV9vZmZzZXQoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgbGVuKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCXVuc2lnbmVkIGxvbmcgZGF0YTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOwotCi0JaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwMDApKSB7Ci0JCWFkNzE1Ml9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUyX0NIMV9PRkZTX0hJR0gsIGRhdGEgPj4gOCk7Ci0JCWFkNzE1Ml9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUyX0NIMV9PRkZTX0xPVywgZGF0YSk7Ci0JCWNoaXAtPmNoMV9vZmZzZXQgPSBkYXRhOwotCQlyZXR1cm4gbGVuOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgSUlPX0RFVl9BVFRSX0NIMV9PRkZTRVQoU19JUlVHTyB8IFNfSVdVU1IsCi0JCWFkNzE1Ml9zaG93X2NoMV9vZmZzZXQsCi0JCWFkNzE1Ml9zdG9yZV9jaDFfb2Zmc2V0KTsKLQotc3RhdGljIHNzaXplX3QgYWQ3MTUyX3Nob3dfY2gyX29mZnNldChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+Y2gyX29mZnNldCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zdG9yZV9jaDJfb2Zmc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQl1bnNpZ25lZCBsb25nIGRhdGE7Ci0JaW50IHJldDsKLQotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKLQotCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMDAwKSkgewotCQlhZDcxNTJfaTJjX3dyaXRlKGNoaXAsIEFENzE1Ml9DSDJfT0ZGU19ISUdILCBkYXRhID4+IDgpOwotCQlhZDcxNTJfaTJjX3dyaXRlKGNoaXAsIEFENzE1Ml9DSDJfT0ZGU19MT1csIGRhdGEpOwotCQljaGlwLT5jaDJfb2Zmc2V0ID0gZGF0YTsKLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIElJT19ERVZfQVRUUl9DSDJfT0ZGU0VUKFNfSVJVR08gfCBTX0lXVVNSLAotCQlhZDcxNTJfc2hvd19jaDJfb2Zmc2V0LAotCQlhZDcxNTJfc3RvcmVfY2gyX29mZnNldCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zaG93X2NoMV9nYWluKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjaGlwLT5jaDFfZ2Fpbik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zdG9yZV9jaDFfZ2FpbihzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljb25zdCBjaGFyICpidWYsCi0JCXNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0JdW5zaWduZWQgbG9uZyBkYXRhOwotCWludCByZXQ7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7Ci0KLQlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHgxMDAwMCkpIHsKLQkJYWQ3MTUyX2kyY193cml0ZShjaGlwLCBBRDcxNTJfQ0gxX0dBSU5fSElHSCwgZGF0YSA+PiA4KTsKLQkJYWQ3MTUyX2kyY193cml0ZShjaGlwLCBBRDcxNTJfQ0gxX0dBSU5fTE9XLCBkYXRhKTsKLQkJY2hpcC0+Y2gxX2dhaW4gPSBkYXRhOwotCQlyZXR1cm4gbGVuOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgSUlPX0RFVl9BVFRSX0NIMV9HQUlOKFNfSVJVR08gfCBTX0lXVVNSLAotCQlhZDcxNTJfc2hvd19jaDFfZ2FpbiwKLQkJYWQ3MTUyX3N0b3JlX2NoMV9nYWluKTsKLQotc3RhdGljIHNzaXplX3QgYWQ3MTUyX3Nob3dfY2gyX2dhaW4oc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPmNoMl9nYWluKTsKLX0KLQotc3RhdGljIHNzaXplX3QgYWQ3MTUyX3N0b3JlX2NoMl9nYWluKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQl1bnNpZ25lZCBsb25nIGRhdGE7Ci0JaW50IHJldDsKLQotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKLQotCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMDAwKSkgewotCQlhZDcxNTJfaTJjX3dyaXRlKGNoaXAsIEFENzE1Ml9DSDJfR0FJTl9ISUdILCBkYXRhID4+IDgpOwotCQlhZDcxNTJfaTJjX3dyaXRlKGNoaXAsIEFENzE1Ml9DSDJfR0FJTl9MT1csIGRhdGEpOwotCQljaGlwLT5jaDJfZ2FpbiA9IGRhdGE7Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBJSU9fREVWX0FUVFJfQ0gyX0dBSU4oU19JUlVHTyB8IFNfSVdVU1IsCi0JCWFkNzE1Ml9zaG93X2NoMl9nYWluLAotCQlhZDcxNTJfc3RvcmVfY2gyX2dhaW4pOwotCi1zdGF0aWMgc3NpemVfdCBhZDcxNTJfc2hvd19jaDFfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDJ4XG4iLCBjaGlwLT5jaDFfc2V0dXApOwotfQotCi1zdGF0aWMgc3NpemVfdCBhZDcxNTJfc3RvcmVfY2gxX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQl1bnNpZ25lZCBsb25nIGRhdGE7Ci0JaW50IHJldDsKLQotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKLQotCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMCkpIHsKLQkJYWQ3MTUyX2kyY193cml0ZShjaGlwLCBBRDcxNTJfQ0gxX1NFVFVQLCBkYXRhKTsKLQkJY2hpcC0+Y2gxX3NldHVwID0gZGF0YTsKLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIElJT19ERVZfQVRUUl9DSDFfU0VUVVAoU19JUlVHTyB8IFNfSVdVU1IsCi0JCWFkNzE1Ml9zaG93X2NoMV9zZXR1cCwKLQkJYWQ3MTUyX3N0b3JlX2NoMV9zZXR1cCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zaG93X2NoMl9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwMnhcbiIsIGNoaXAtPmNoMl9zZXR1cCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zdG9yZV9jaDJfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgbGVuKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCXVuc2lnbmVkIGxvbmcgZGF0YTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOwotCi0JaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwKSkgewotCQlhZDcxNTJfaTJjX3dyaXRlKGNoaXAsIEFENzE1Ml9DSDJfU0VUVVAsIGRhdGEpOwotCQljaGlwLT5jaDJfc2V0dXAgPSBkYXRhOwotCQlyZXR1cm4gbGVuOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgSUlPX0RFVl9BVFRSX0NIMl9TRVRVUChTX0lSVUdPIHwgU19JV1VTUiwKLQkJYWQ3MTUyX3Nob3dfY2gyX3NldHVwLAotCQlhZDcxNTJfc3RvcmVfY2gyX3NldHVwKTsKLQotc3RhdGljIHNzaXplX3QgYWQ3MTUyX3Nob3dfZmlsdGVyX3JhdGVfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDJ4XG4iLCBjaGlwLT5maWx0ZXJfcmF0ZV9zZXR1cCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zdG9yZV9maWx0ZXJfcmF0ZV9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljb25zdCBjaGFyICpidWYsCi0JCXNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0JdW5zaWduZWQgbG9uZyBkYXRhOwotCWludCByZXQ7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7Ci0KLQlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHgxMDApKSB7Ci0JCWFkNzE1Ml9pMmNfd3JpdGUoY2hpcCwgQUQ3MTUyX0NGRzIsIGRhdGEpOwotCQljaGlwLT5maWx0ZXJfcmF0ZV9zZXR1cCA9IGRhdGE7Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBJSU9fREVWX0FUVFJfRklMVEVSX1JBVEVfU0VUVVAoU19JUlVHTyB8IFNfSVdVU1IsCi0JCWFkNzE1Ml9zaG93X2ZpbHRlcl9yYXRlX3NldHVwLAotCQlhZDcxNTJfc3RvcmVfZmlsdGVyX3JhdGVfc2V0dXApOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3MTUyX2F0dHJpYnV0ZXNbXSA9IHsKLQkmaWlvX2Rldl9hdHRyX2F2YWlsYWJsZV9jb252ZXJzaW9uX21vZGVzLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9jb252ZXJzaW9uX21vZGUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2NoMV9nYWluLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9jaDJfZ2Fpbi5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfY2gxX29mZnNldC5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfY2gyX29mZnNldC5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfY2gxX3ZhbHVlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9jaDJfdmFsdWUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2NoMV9zZXR1cC5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfY2gyX3NldHVwLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9maWx0ZXJfcmF0ZV9zZXR1cC5kZXZfYXR0ci5hdHRyLAotCU5VTEwsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDcxNTJfYXR0cmlidXRlX2dyb3VwID0gewotCS5hdHRycyA9IGFkNzE1Ml9hdHRyaWJ1dGVzLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBhZDcxNTJfaW5mbyA9IHsKLQkuYXR0cnMgPSAmYWQ3MTUyX2F0dHJpYnV0ZV9ncm91cCwKLQkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAotfTsKLS8qCi0gKiBkZXZpY2UgcHJvYmUgYW5kIHJlbW92ZQotICovCi0KLXN0YXRpYyBpbnQgX19kZXZpbml0IGFkNzE1Ml9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXA7Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKLQotCWluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2Uoc2l6ZW9mKCpjaGlwKSk7Ci0JaWYgKGluZGlvX2RldiA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfcmV0OwotCX0KLQljaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgZGV2aWNlIHJlbW92YWwgcHVycG9zZXMgKi8KLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBpbmRpb19kZXYpOwotCi0JY2hpcC0+Y2xpZW50ID0gY2xpZW50OwotCi0JLyogRWNoaXBhYmlsaXNoIHRoYXQgdGhlIGlpb19kZXYgaXMgYSBjaGlsZCBvZiB0aGUgaTJjIGRldmljZSAqLwotCWluZGlvX2Rldi0+bmFtZSA9IGlkLT5uYW1lOwotCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKLQlpbmRpb19kZXYtPmluZm8gPSAmYWQ3MTUyX2luZm87Ci0JaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOwotCi0JcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfZnJlZV9kZXY7Ci0KLQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzIGNhcGFjaXRpdmUgc2Vuc29yIHJlZ2lzdGVyZWRcbiIsIGlkLT5uYW1lKTsKLQotCXJldHVybiAwOwotCi1lcnJvcl9mcmVlX2RldjoKLQlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKLWVycm9yX3JldDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDcxNTJfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0JaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkNzE1Ml9pZFtdID0gewotCXsgImFkNzE1MiIsIDAgfSwKLQl7ICJhZDcxNTMiLCAwIH0sCi0Je30KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhZDcxNTJfaWQpOwotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWQ3MTUyX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJhZDcxNTIiLAotCX0sCi0JLnByb2JlID0gYWQ3MTUyX3Byb2JlLAotCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDcxNTJfcmVtb3ZlKSwKLQkuaWRfdGFibGUgPSBhZDcxNTJfaWQsCi19OwotCi1zdGF0aWMgX19pbml0IGludCBhZDcxNTJfaW5pdCh2b2lkKQotewotCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWQ3MTUyX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyBfX2V4aXQgdm9pZCBhZDcxNTJfZXhpdCh2b2lkKQotewotCWkyY19kZWxfZHJpdmVyKCZhZDcxNTJfZHJpdmVyKTsKLX0KLQotTU9EVUxFX0FVVEhPUigiQmFycnkgU29uZyA8MjFjbmJhb0BnbWFpbC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIGFkNzE1Mi8zIGNhcGFjaXRpdmUgc2Vuc29yIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotCi1tb2R1bGVfaW5pdChhZDcxNTJfaW5pdCk7Ci1tb2R1bGVfZXhpdChhZDcxNTJfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcxOTIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzE5Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYzM3NmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcxOTIuYwpAQCAtMCwwICsxLDExNzkgQEAKKy8qCisgKiBBRDcxOTAgQUQ3MTkyIEFENzE5NSBTUEkgQURDIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDExIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIi4uL2J1ZmZlcl9nZW5lcmljLmgiCisjaW5jbHVkZSAiLi4vcmluZ19zdy5oIgorI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKKyNpbmNsdWRlICIuLi90cmlnZ2VyX2NvbnN1bWVyLmgiCisKKyNpbmNsdWRlICJhZDcxOTIuaCIKKworLyogUmVnaXN0ZXJzICovCisjZGVmaW5lIEFENzE5Ml9SRUdfQ09NTQkJMCAvKiBDb21tdW5pY2F0aW9ucyBSZWdpc3RlciAoV08sIDgtYml0KSAqLworI2RlZmluZSBBRDcxOTJfUkVHX1NUQVQJCTAgLyogU3RhdHVzIFJlZ2lzdGVyCSAgICAgKFJPLCA4LWJpdCkgKi8KKyNkZWZpbmUgQUQ3MTkyX1JFR19NT0RFCQkxIC8qIE1vZGUgUmVnaXN0ZXIJICAgICAoUlcsIDI0LWJpdCAqLworI2RlZmluZSBBRDcxOTJfUkVHX0NPTkYJCTIgLyogQ29uZmlndXJhdGlvbiBSZWdpc3RlciAgKFJXLCAyNC1iaXQpICovCisjZGVmaW5lIEFENzE5Ml9SRUdfREFUQQkJMyAvKiBEYXRhIFJlZ2lzdGVyCSAgICAgKFJPLCAyNC8zMi1iaXQpICovCisjZGVmaW5lIEFENzE5Ml9SRUdfSUQJCTQgLyogSUQgUmVnaXN0ZXIJICAgICAoUk8sIDgtYml0KSAqLworI2RlZmluZSBBRDcxOTJfUkVHX0dQT0NPTgk1IC8qIEdQT0NPTiBSZWdpc3RlcgkgICAgIChSTywgOC1iaXQpICovCisjZGVmaW5lIEFENzE5Ml9SRUdfT0ZGU0VUCTYgLyogT2Zmc2V0IFJlZ2lzdGVyCSAgICAgKFJXLCAxNi1iaXQKKwkJCQkgICAqIChBRDc3OTIpLzI0LWJpdCAoQUQ3MTkyKSkgKi8KKyNkZWZpbmUgQUQ3MTkyX1JFR19GVUxMU0FMRQk3IC8qIEZ1bGwtU2NhbGUgUmVnaXN0ZXIKKwkJCQkgICAqIChSVywgMTYtYml0IChBRDc3OTIpLzI0LWJpdCAoQUQ3MTkyKSkgKi8KKworLyogQ29tbXVuaWNhdGlvbnMgUmVnaXN0ZXIgQml0IERlc2lnbmF0aW9ucyAoQUQ3MTkyX1JFR19DT01NKSAqLworI2RlZmluZSBBRDcxOTJfQ09NTV9XRU4JCSgxIDw8IDcpIC8qIFdyaXRlIEVuYWJsZSAqLworI2RlZmluZSBBRDcxOTJfQ09NTV9XUklURQkoMCA8PCA2KSAvKiBXcml0ZSBPcGVyYXRpb24gKi8KKyNkZWZpbmUgQUQ3MTkyX0NPTU1fUkVBRAkoMSA8PCA2KSAvKiBSZWFkIE9wZXJhdGlvbiAqLworI2RlZmluZSBBRDcxOTJfQ09NTV9BRERSKHgpCSgoKHgpICYgMHg3KSA8PCAzKSAvKiBSZWdpc3RlciBBZGRyZXNzICovCisjZGVmaW5lIEFENzE5Ml9DT01NX0NSRUFECSgxIDw8IDIpIC8qIENvbnRpbnVvdXMgUmVhZCBvZiBEYXRhIFJlZ2lzdGVyICovCisKKy8qIFN0YXR1cyBSZWdpc3RlciBCaXQgRGVzaWduYXRpb25zIChBRDcxOTJfUkVHX1NUQVQpICovCisjZGVmaW5lIEFENzE5Ml9TVEFUX1JEWQkJKDEgPDwgNykgLyogUmVhZHkgKi8KKyNkZWZpbmUgQUQ3MTkyX1NUQVRfRVJSCQkoMSA8PCA2KSAvKiBFcnJvciAoT3ZlcnJhbmdlLCBVbmRlcnJhbmdlKSAqLworI2RlZmluZSBBRDcxOTJfU1RBVF9OT1JFRgkoMSA8PCA1KSAvKiBFcnJvciBubyBleHRlcm5hbCByZWZlcmVuY2UgKi8KKyNkZWZpbmUgQUQ3MTkyX1NUQVRfUEFSSVRZCSgxIDw8IDQpIC8qIFBhcml0eSAqLworI2RlZmluZSBBRDcxOTJfU1RBVF9DSDMJCSgxIDw8IDIpIC8qIENoYW5uZWwgMyAqLworI2RlZmluZSBBRDcxOTJfU1RBVF9DSDIJCSgxIDw8IDEpIC8qIENoYW5uZWwgMiAqLworI2RlZmluZSBBRDcxOTJfU1RBVF9DSDEJCSgxIDw8IDApIC8qIENoYW5uZWwgMSAqLworCisvKiBNb2RlIFJlZ2lzdGVyIEJpdCBEZXNpZ25hdGlvbnMgKEFENzE5Ml9SRUdfTU9ERSkgKi8KKyNkZWZpbmUgQUQ3MTkyX01PREVfU0VMKHgpCSgoKHgpICYgMHg3KSA8PCAyMSkgLyogT3BlcmF0aW9uIE1vZGUgU2VsZWN0ICovCisjZGVmaW5lIEFENzE5Ml9NT0RFX0RBVF9TVEEJKDEgPDwgMjApIC8qIFN0YXR1cyBSZWdpc3RlciB0cmFuc21pc3Npb24gKi8KKyNkZWZpbmUgQUQ3MTkyX01PREVfQ0xLU1JDKHgpCSgoKHgpICYgMHgzKSA8PCAxOCkgLyogQ2xvY2sgU291cmNlIFNlbGVjdCAqLworI2RlZmluZSBBRDcxOTJfTU9ERV9TSU5DMwkoMSA8PCAxNSkgLyogU0lOQzMgRmlsdGVyIFNlbGVjdCAqLworI2RlZmluZSBBRDcxOTJfTU9ERV9BQ1gJCSgxIDw8IDE0KSAvKiBBQyBleGNpdGF0aW9uIGVuYWJsZShBRDcxOTUgb25seSkqLworI2RlZmluZSBBRDcxOTJfTU9ERV9FTlBBUgkoMSA8PCAxMykgLyogUGFyaXR5IEVuYWJsZSAqLworI2RlZmluZSBBRDcxOTJfTU9ERV9DTEtESVYJKDEgPDwgMTIpIC8qIENsb2NrIGRpdmlkZSBieSAyIChBRDcxOTAvMiBvbmx5KSovCisjZGVmaW5lIEFENzE5Ml9NT0RFX1NDWUNMRQkoMSA8PCAxMSkgLyogU2luZ2xlIGN5Y2xlIGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgQUQ3MTkyX01PREVfUkVKNjAJKDEgPDwgMTApIC8qIDUwLzYwSHogbm90Y2ggZmlsdGVyICovCisjZGVmaW5lIEFENzE5Ml9NT0RFX1JBVEUoeCkJKCh4KSAmIDB4M0ZGKSAvKiBGaWx0ZXIgVXBkYXRlIFJhdGUgU2VsZWN0ICovCisKKy8qIE1vZGUgUmVnaXN0ZXI6IEFENzE5Ml9NT0RFX1NFTCBvcHRpb25zICovCisjZGVmaW5lIEFENzE5Ml9NT0RFX0NPTlQJCTAgLyogQ29udGludW91cyBDb252ZXJzaW9uIE1vZGUgKi8KKyNkZWZpbmUgQUQ3MTkyX01PREVfU0lOR0xFCQkxIC8qIFNpbmdsZSBDb252ZXJzaW9uIE1vZGUgKi8KKyNkZWZpbmUgQUQ3MTkyX01PREVfSURMRQkJMiAvKiBJZGxlIE1vZGUgKi8KKyNkZWZpbmUgQUQ3MTkyX01PREVfUFdSRE4JCTMgLyogUG93ZXItRG93biBNb2RlICovCisjZGVmaW5lIEFENzE5Ml9NT0RFX0NBTF9JTlRfWkVSTwk0IC8qIEludGVybmFsIFplcm8tU2NhbGUgQ2FsaWJyYXRpb24gKi8KKyNkZWZpbmUgQUQ3MTkyX01PREVfQ0FMX0lOVF9GVUxMCTUgLyogSW50ZXJuYWwgRnVsbC1TY2FsZSBDYWxpYnJhdGlvbiAqLworI2RlZmluZSBBRDcxOTJfTU9ERV9DQUxfU1lTX1pFUk8JNiAvKiBTeXN0ZW0gWmVyby1TY2FsZSBDYWxpYnJhdGlvbiAqLworI2RlZmluZSBBRDcxOTJfTU9ERV9DQUxfU1lTX0ZVTEwJNyAvKiBTeXN0ZW0gRnVsbC1TY2FsZSBDYWxpYnJhdGlvbiAqLworCisvKiBNb2RlIFJlZ2lzdGVyOiBBRDcxOTJfTU9ERV9DTEtTUkMgb3B0aW9ucyAqLworI2RlZmluZSBBRDcxOTJfQ0xLX0VYVF9NQ0xLMV8yCQkwIC8qIEV4dGVybmFsIDQuOTIgTUh6IENsb2NrIGNvbm5lY3RlZAorCQkJCQkgICAqIGZyb20gTUNMSzEgdG8gTUNMSzIgKi8KKyNkZWZpbmUgQUQ3MTkyX0NMS19FWFRfTUNMSzIJCTEgLyogRXh0ZXJuYWwgQ2xvY2sgYXBwbGllZCB0byBNQ0xLMiAqLworI2RlZmluZSBBRDcxOTJfQ0xLX0lOVAkJCTIgLyogSW50ZXJuYWwgNC45MiBNSHogQ2xvY2sgbm90CisJCQkJCSAgICogYXZhaWxhYmxlIGF0IHRoZSBNQ0xLMiBwaW4gKi8KKyNkZWZpbmUgQUQ3MTkyX0NMS19JTlRfQ08JCTMgLyogSW50ZXJuYWwgNC45MiBNSHogQ2xvY2sgYXZhaWxhYmxlCisJCQkJCSAgICogYXQgdGhlIE1DTEsyIHBpbiAqLworCisKKy8qIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgQml0IERlc2lnbmF0aW9ucyAoQUQ3MTkyX1JFR19DT05GKSAqLworCisjZGVmaW5lIEFENzE5Ml9DT05GX0NIT1AJKDEgPDwgMjMpIC8qIENIT1AgZW5hYmxlICovCisjZGVmaW5lIEFENzE5Ml9DT05GX1JFRlNFTAkoMSA8PCAyMCkgLyogUkVGSU4xL1JFRklOMiBSZWZlcmVuY2UgU2VsZWN0ICovCisjZGVmaW5lIEFENzE5Ml9DT05GX0NIQU4oeCkJKCgoeCkgJiAweEZGKSA8PCA4KSAvKiBDaGFubmVsIHNlbGVjdCAqLworI2RlZmluZSBBRDcxOTJfQ09ORl9CVVJOCSgxIDw8IDcpIC8qIEJ1cm5vdXQgY3VycmVudCBlbmFibGUgKi8KKyNkZWZpbmUgQUQ3MTkyX0NPTkZfUkVGREVUCSgxIDw8IDYpIC8qIFJlZmVyZW5jZSBkZXRlY3QgZW5hYmxlICovCisjZGVmaW5lIEFENzE5Ml9DT05GX0JVRgkJKDEgPDwgNCkgLyogQnVmZmVyZWQgTW9kZSBFbmFibGUgKi8KKyNkZWZpbmUgQUQ3MTkyX0NPTkZfVU5JUE9MQVIJKDEgPDwgMykgLyogVW5pcG9sYXIvQmlwb2xhciBFbmFibGUgKi8KKyNkZWZpbmUgQUQ3MTkyX0NPTkZfR0FJTih4KQkoKHgpICYgMHg3KSAvKiBHYWluIFNlbGVjdCAqLworCisjZGVmaW5lIEFENzE5Ml9DSF9BSU4xUF9BSU4yTQkwIC8qIEFJTjEoKykgLSBBSU4yKC0pICovCisjZGVmaW5lIEFENzE5Ml9DSF9BSU4zUF9BSU40TQkxIC8qIEFJTjMoKykgLSBBSU40KC0pICovCisjZGVmaW5lIEFENzE5Ml9DSF9URU1QCQkyIC8qIFRlbXAgU2Vuc29yICovCisjZGVmaW5lIEFENzE5Ml9DSF9BSU4yUF9BSU4yTQkzIC8qIEFJTjIoKykgLSBBSU4yKC0pICovCisjZGVmaW5lIEFENzE5Ml9DSF9BSU4xCQk0IC8qIEFJTjEgLSBBSU5DT00gKi8KKyNkZWZpbmUgQUQ3MTkyX0NIX0FJTjIJCTUgLyogQUlOMiAtIEFJTkNPTSAqLworI2RlZmluZSBBRDcxOTJfQ0hfQUlOMwkJNiAvKiBBSU4zIC0gQUlOQ09NICovCisjZGVmaW5lIEFENzE5Ml9DSF9BSU40CQk3IC8qIEFJTjQgLSBBSU5DT00gKi8KKworLyogSUQgUmVnaXN0ZXIgQml0IERlc2lnbmF0aW9ucyAoQUQ3MTkyX1JFR19JRCkgKi8KKyNkZWZpbmUgSURfQUQ3MTkwCQkweDQKKyNkZWZpbmUgSURfQUQ3MTkyCQkweDAKKyNkZWZpbmUgSURfQUQ3MTk1CQkweDYKKyNkZWZpbmUgQUQ3MTkyX0lEX01BU0sJCTB4MEYKKworLyogR1BPQ09OIFJlZ2lzdGVyIEJpdCBEZXNpZ25hdGlvbnMgKEFENzE5Ml9SRUdfR1BPQ09OKSAqLworI2RlZmluZSBBRDcxOTJfR1BPQ09OX0JQRFNXCSgxIDw8IDYpIC8qIEJyaWRnZSBwb3dlci1kb3duIHN3aXRjaCBlbmFibGUgKi8KKyNkZWZpbmUgQUQ3MTkyX0dQT0NPTl9HUDMyRU4JKDEgPDwgNSkgLyogRGlnaXRhbCBPdXRwdXQgUDMgYW5kIFAyIGVuYWJsZSAqLworI2RlZmluZSBBRDcxOTJfR1BPQ09OX0dQMTBFTgkoMSA8PCA0KSAvKiBEaWdpdGFsIE91dHB1dCBQMSBhbmQgUDAgZW5hYmxlICovCisjZGVmaW5lIEFENzE5Ml9HUE9DT05fUDNEQVQJKDEgPDwgMykgLyogUDMgc3RhdGUgKi8KKyNkZWZpbmUgQUQ3MTkyX0dQT0NPTl9QMkRBVAkoMSA8PCAyKSAvKiBQMiBzdGF0ZSAqLworI2RlZmluZSBBRDcxOTJfR1BPQ09OX1AxREFUCSgxIDw8IDEpIC8qIFAxIHN0YXRlICovCisjZGVmaW5lIEFENzE5Ml9HUE9DT05fUDBEQVQJKDEgPDwgMCkgLyogUDAgc3RhdGUgKi8KKworI2RlZmluZSBBRDcxOTJfSU5UX0ZSRVFfTUh6CTQ5MTUyMDAKKworLyogTk9URToKKyAqIFRoZSBBRDcxOTAvMi81IGZlYXR1cmVzIGEgZHVhbCB1c2UgZGF0YSBvdXQgcmVhZHkgRE9VVC9SRFkgb3V0cHV0LgorICogSW4gb3JkZXIgdG8gYXZvaWQgY29udGVudGlvbnMgb24gdGhlIFNQSSBidXMsIGl0J3MgdGhlcmVmb3JlIG5lY2Vzc2FyeQorICogdG8gdXNlIHNwaSBidXMgbG9ja2luZy4KKyAqCisgKiBUaGUgRE9VVC9SRFkgb3V0cHV0IG11c3QgYWxzbyBiZSB3aXJlZCB0byBhbiBpbnRlcnJ1cHQgY2FwYWJsZSBHUElPLgorICovCisKK3N0cnVjdCBhZDcxOTJfc3RhdGUgeworCXN0cnVjdCBzcGlfZGV2aWNlCQkqc3BpOworCXN0cnVjdCBpaW9fdHJpZ2dlcgkJKnRyaWc7CisJc3RydWN0IHJlZ3VsYXRvcgkJKnJlZzsKKwlzdHJ1Y3QgYWQ3MTkyX3BsYXRmb3JtX2RhdGEJKnBkYXRhOworCXdhaXRfcXVldWVfaGVhZF90CQl3cV9kYXRhX2F2YWlsOworCWJvb2wJCQkJZG9uZTsKKwlib29sCQkJCWlycV9kaXM7CisJdTE2CQkJCWludF92cmVmX212OworCXUzMgkJCQltY2xrOworCXUzMgkJCQlmX29yZGVyOworCXUzMgkJCQltb2RlOworCXUzMgkJCQljb25mOworCXUzMgkJCQlzY2FsZV9hdmFpbFs4XVsyXTsKKwlsb25nCQkJCWF2YWlsYWJsZV9zY2FuX21hc2tzWzldOworCXU4CQkJCWdwb2NvbjsKKwl1OAkJCQlkZXZpZDsKKwkvKgorCSAqIERNQSAodGh1cyBjYWNoZSBjb2hlcmVuY3kgbWFpbnRlbmFuY2UpIHJlcXVpcmVzIHRoZQorCSAqIHRyYW5zZmVyIGJ1ZmZlcnMgdG8gbGl2ZSBpbiB0aGVpciBvd24gY2FjaGUgbGluZXMuCisJICovCisJdTgJCQkJZGF0YVs0XSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7Cit9OworCitzdGF0aWMgaW50IF9fYWQ3MTkyX3dyaXRlX3JlZyhzdHJ1Y3QgYWQ3MTkyX3N0YXRlICpzdCwgYm9vbCBsb2NrZWQsCisJCQkgICAgICBib29sIGNzX2NoYW5nZSwgdW5zaWduZWQgY2hhciByZWcsCisJCQkgICAgICB1bnNpZ25lZCBzaXplLCB1bnNpZ25lZCB2YWwpCit7CisJdTggKmRhdGEgPSBzdC0+ZGF0YTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHQgPSB7CisJCS50eF9idWYJCT0gZGF0YSwKKwkJLmxlbgkJPSBzaXplICsgMSwKKwkJLmNzX2NoYW5nZQk9IGNzX2NoYW5nZSwKKwl9OworCXN0cnVjdCBzcGlfbWVzc2FnZSBtOworCisJZGF0YVswXSA9IEFENzE5Ml9DT01NX1dSSVRFIHwgQUQ3MTkyX0NPTU1fQUREUihyZWcpOworCisJc3dpdGNoIChzaXplKSB7CisJY2FzZSAzOgorCQlkYXRhWzFdID0gdmFsID4+IDE2OworCQlkYXRhWzJdID0gdmFsID4+IDg7CisJCWRhdGFbM10gPSB2YWw7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJZGF0YVsxXSA9IHZhbCA+PiA4OworCQlkYXRhWzJdID0gdmFsOworCQlicmVhazsKKwljYXNlIDE6CisJCWRhdGFbMV0gPSB2YWw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaV9tZXNzYWdlX2luaXQoJm0pOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0LCAmbSk7CisKKwlpZiAobG9ja2VkKQorCQlyZXR1cm4gc3BpX3N5bmNfbG9ja2VkKHN0LT5zcGksICZtKTsKKwllbHNlCisJCXJldHVybiBzcGlfc3luYyhzdC0+c3BpLCAmbSk7Cit9CisKK3N0YXRpYyBpbnQgYWQ3MTkyX3dyaXRlX3JlZyhzdHJ1Y3QgYWQ3MTkyX3N0YXRlICpzdCwKKwkJCSAgICB1bnNpZ25lZCByZWcsIHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIHZhbCkKK3sKKwlyZXR1cm4gX19hZDcxOTJfd3JpdGVfcmVnKHN0LCBmYWxzZSwgZmFsc2UsIHJlZywgc2l6ZSwgdmFsKTsKK30KKworc3RhdGljIGludCBfX2FkNzE5Ml9yZWFkX3JlZyhzdHJ1Y3QgYWQ3MTkyX3N0YXRlICpzdCwgYm9vbCBsb2NrZWQsCisJCQkgICAgIGJvb2wgY3NfY2hhbmdlLCB1bnNpZ25lZCBjaGFyIHJlZywKKwkJCSAgICAgaW50ICp2YWwsIHVuc2lnbmVkIHNpemUpCit7CisJdTggKmRhdGEgPSBzdC0+ZGF0YTsKKwlpbnQgcmV0OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgdFtdID0geworCQl7CisJCQkudHhfYnVmID0gZGF0YSwKKwkJCS5sZW4gPSAxLAorCQl9LCB7CisJCQkucnhfYnVmID0gZGF0YSwKKwkJCS5sZW4gPSBzaXplLAorCQkJLmNzX2NoYW5nZSA9IGNzX2NoYW5nZSwKKwkJfSwKKwl9OworCXN0cnVjdCBzcGlfbWVzc2FnZSBtOworCisJZGF0YVswXSA9IEFENzE5Ml9DT01NX1JFQUQgfCBBRDcxOTJfQ09NTV9BRERSKHJlZyk7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmdFswXSwgJm0pOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0WzFdLCAmbSk7CisKKwlpZiAobG9ja2VkKQorCQlyZXQgPSBzcGlfc3luY19sb2NrZWQoc3QtPnNwaSwgJm0pOworCWVsc2UKKwkJcmV0ID0gc3BpX3N5bmMoc3QtPnNwaSwgJm0pOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzd2l0Y2ggKHNpemUpIHsKKwljYXNlIDM6CisJCSp2YWwgPSBkYXRhWzBdIDw8IDE2IHwgZGF0YVsxXSA8PCA4IHwgZGF0YVsyXTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkqdmFsID0gZGF0YVswXSA8PCA4IHwgZGF0YVsxXTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkqdmFsID0gZGF0YVswXTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWQ3MTkyX3JlYWRfcmVnKHN0cnVjdCBhZDcxOTJfc3RhdGUgKnN0LAorCQkJICAgdW5zaWduZWQgcmVnLCBpbnQgKnZhbCwgdW5zaWduZWQgc2l6ZSkKK3sKKwlyZXR1cm4gX19hZDcxOTJfcmVhZF9yZWcoc3QsIDAsIDAsIHJlZywgdmFsLCBzaXplKTsKK30KKworc3RhdGljIGludCBhZDcxOTJfcmVhZChzdHJ1Y3QgYWQ3MTkyX3N0YXRlICpzdCwgdW5zaWduZWQgY2gsCisJCSAgICAgICB1bnNpZ25lZCBsZW4sIGludCAqdmFsKQoreworCWludCByZXQ7CisJc3QtPmNvbmYgPSAoc3QtPmNvbmYgJiB+QUQ3MTkyX0NPTkZfQ0hBTigtMSkpIHwKKwkJQUQ3MTkyX0NPTkZfQ0hBTigxIDw8IGNoKTsKKwlzdC0+bW9kZSA9IChzdC0+bW9kZSAmIH5BRDcxOTJfTU9ERV9TRUwoLTEpKSB8CisJCUFENzE5Ml9NT0RFX1NFTChBRDcxOTJfTU9ERV9TSU5HTEUpOworCisJYWQ3MTkyX3dyaXRlX3JlZyhzdCwgQUQ3MTkyX1JFR19DT05GLCAzLCBzdC0+Y29uZik7CisKKwlzcGlfYnVzX2xvY2soc3QtPnNwaS0+bWFzdGVyKTsKKwlzdC0+ZG9uZSA9IGZhbHNlOworCisJcmV0ID0gX19hZDcxOTJfd3JpdGVfcmVnKHN0LCAxLCAxLCBBRDcxOTJfUkVHX01PREUsIDMsIHN0LT5tb2RlKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlzdC0+aXJxX2RpcyA9IGZhbHNlOworCWVuYWJsZV9pcnEoc3QtPnNwaS0+aXJxKTsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc3QtPndxX2RhdGFfYXZhaWwsIHN0LT5kb25lKTsKKworCXJldCA9IF9fYWQ3MTkyX3JlYWRfcmVnKHN0LCAxLCAwLCBBRDcxOTJfUkVHX0RBVEEsIHZhbCwgbGVuKTsKK291dDoKKwlzcGlfYnVzX3VubG9jayhzdC0+c3BpLT5tYXN0ZXIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZDcxOTJfY2FsaWJyYXRlKHN0cnVjdCBhZDcxOTJfc3RhdGUgKnN0LCB1bnNpZ25lZCBtb2RlLCB1bnNpZ25lZCBjaCkKK3sKKwlpbnQgcmV0OworCisJc3QtPmNvbmYgPSAoc3QtPmNvbmYgJiB+QUQ3MTkyX0NPTkZfQ0hBTigtMSkpIHwKKwkJQUQ3MTkyX0NPTkZfQ0hBTigxIDw8IGNoKTsKKwlzdC0+bW9kZSA9IChzdC0+bW9kZSAmIH5BRDcxOTJfTU9ERV9TRUwoLTEpKSB8IEFENzE5Ml9NT0RFX1NFTChtb2RlKTsKKworCWFkNzE5Ml93cml0ZV9yZWcoc3QsIEFENzE5Ml9SRUdfQ09ORiwgMywgc3QtPmNvbmYpOworCisJc3BpX2J1c19sb2NrKHN0LT5zcGktPm1hc3Rlcik7CisJc3QtPmRvbmUgPSBmYWxzZTsKKworCXJldCA9IF9fYWQ3MTkyX3dyaXRlX3JlZyhzdCwgMSwgMSwgQUQ3MTkyX1JFR19NT0RFLCAzLAorCQkJCSAoc3QtPmRldmlkICE9IElEX0FENzE5NSkgPworCQkJCSBzdC0+bW9kZSB8IEFENzE5Ml9NT0RFX0NMS0RJViA6CisJCQkJIHN0LT5tb2RlKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlzdC0+aXJxX2RpcyA9IGZhbHNlOworCWVuYWJsZV9pcnEoc3QtPnNwaS0+aXJxKTsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc3QtPndxX2RhdGFfYXZhaWwsIHN0LT5kb25lKTsKKworCXN0LT5tb2RlID0gKHN0LT5tb2RlICYgfkFENzE5Ml9NT0RFX1NFTCgtMSkpIHwKKwkJQUQ3MTkyX01PREVfU0VMKEFENzE5Ml9NT0RFX0lETEUpOworCisJcmV0ID0gX19hZDcxOTJfd3JpdGVfcmVnKHN0LCAxLCAwLCBBRDcxOTJfUkVHX01PREUsIDMsIHN0LT5tb2RlKTsKK291dDoKKwlzcGlfYnVzX3VubG9jayhzdC0+c3BpLT5tYXN0ZXIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHU4IGFkNzE5Ml9jYWxpYl9hcnJbOF1bMl0gPSB7CisJe0FENzE5Ml9NT0RFX0NBTF9JTlRfWkVSTywgQUQ3MTkyX0NIX0FJTjF9LAorCXtBRDcxOTJfTU9ERV9DQUxfSU5UX0ZVTEwsIEFENzE5Ml9DSF9BSU4xfSwKKwl7QUQ3MTkyX01PREVfQ0FMX0lOVF9aRVJPLCBBRDcxOTJfQ0hfQUlOMn0sCisJe0FENzE5Ml9NT0RFX0NBTF9JTlRfRlVMTCwgQUQ3MTkyX0NIX0FJTjJ9LAorCXtBRDcxOTJfTU9ERV9DQUxfSU5UX1pFUk8sIEFENzE5Ml9DSF9BSU4zfSwKKwl7QUQ3MTkyX01PREVfQ0FMX0lOVF9GVUxMLCBBRDcxOTJfQ0hfQUlOM30sCisJe0FENzE5Ml9NT0RFX0NBTF9JTlRfWkVSTywgQUQ3MTkyX0NIX0FJTjR9LAorCXtBRDcxOTJfTU9ERV9DQUxfSU5UX0ZVTEwsIEFENzE5Ml9DSF9BSU40fQorfTsKKworc3RhdGljIGludCBhZDcxOTJfY2FsaWJyYXRlX2FsbChzdHJ1Y3QgYWQ3MTkyX3N0YXRlICpzdCkKK3sKKwlpbnQgaSwgcmV0OworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWQ3MTkyX2NhbGliX2Fycik7IGkrKykgeworCQlyZXQgPSBhZDcxOTJfY2FsaWJyYXRlKHN0LCBhZDcxOTJfY2FsaWJfYXJyW2ldWzBdLAorCQkJCSAgICAgICBhZDcxOTJfY2FsaWJfYXJyW2ldWzFdKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworCXJldHVybiAwOworb3V0OgorCWRldl9lcnIoJnN0LT5zcGktPmRldiwgIkNhbGlicmF0aW9uIGZhaWxlZFxuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZDcxOTJfc2V0dXAoc3RydWN0IGFkNzE5Ml9zdGF0ZSAqc3QpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHNwaV9nZXRfZHJ2ZGF0YShzdC0+c3BpKTsKKwlzdHJ1Y3QgYWQ3MTkyX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gc3QtPnBkYXRhOworCXVuc2lnbmVkIGxvbmcgbG9uZyBzY2FsZV91djsKKwlpbnQgaSwgcmV0LCBpZDsKKwl1OCBvbmVzWzZdOworCisJLyogcmVzZXQgdGhlIHNlcmlhbCBpbnRlcmZhY2UgKi8KKwltZW1zZXQoJm9uZXMsIDB4RkYsIDYpOworCXJldCA9IHNwaV93cml0ZShzdC0+c3BpLCAmb25lcywgNik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCW1zbGVlcCgxKTsgLyogV2FpdCBmb3IgYXQgbGVhc3QgNTAwdXMgKi8KKworCS8qIHdyaXRlL3JlYWQgdGVzdCBmb3IgZGV2aWNlIHByZXNlbmNlICovCisJcmV0ID0gYWQ3MTkyX3JlYWRfcmVnKHN0LCBBRDcxOTJfUkVHX0lELCAmaWQsIDEpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaWQgJj0gQUQ3MTkyX0lEX01BU0s7CisKKwlpZiAoaWQgIT0gc3QtPmRldmlkKQorCQlkZXZfd2Fybigmc3QtPnNwaS0+ZGV2LCAiZGV2aWNlIElEIHF1ZXJ5IGZhaWxlZCAoMHglWClcbiIsIGlkKTsKKworCXN3aXRjaCAocGRhdGEtPmNsb2NrX3NvdXJjZV9zZWwpIHsKKwljYXNlIEFENzE5Ml9DTEtfRVhUX01DTEsxXzI6CisJY2FzZSBBRDcxOTJfQ0xLX0VYVF9NQ0xLMjoKKwkJc3QtPm1jbGsgPSBBRDcxOTJfSU5UX0ZSRVFfTUh6OworCQlicmVhazsKKwljYXNlIEFENzE5Ml9DTEtfSU5UOgorCWNhc2UgQUQ3MTkyX0NMS19JTlRfQ086CisJCWlmIChwZGF0YS0+ZXh0X2Nsa19IeikKKwkJCXN0LT5tY2xrID0gcGRhdGEtPmV4dF9jbGtfSHo7CisJCWVsc2UKKwkJCXN0LT5tY2xrID0gQUQ3MTkyX0lOVF9GUkVRX01IejsKKwkJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXN0LT5tb2RlID0gQUQ3MTkyX01PREVfU0VMKEFENzE5Ml9NT0RFX0lETEUpIHwKKwkJQUQ3MTkyX01PREVfQ0xLU1JDKHBkYXRhLT5jbG9ja19zb3VyY2Vfc2VsKSB8CisJCUFENzE5Ml9NT0RFX1JBVEUoNDgwKTsKKworCXN0LT5jb25mID0gQUQ3MTkyX0NPTkZfR0FJTigwKTsKKworCWlmIChwZGF0YS0+cmVqNjBfZW4pCisJCXN0LT5tb2RlIHw9IEFENzE5Ml9NT0RFX1JFSjYwOworCisJaWYgKHBkYXRhLT5zaW5jM19lbikKKwkJc3QtPm1vZGUgfD0gQUQ3MTkyX01PREVfU0lOQzM7CisKKwlpZiAocGRhdGEtPnJlZmluMl9lbiAmJiAoc3QtPmRldmlkICE9IElEX0FENzE5NSkpCisJCXN0LT5jb25mIHw9IEFENzE5Ml9DT05GX1JFRlNFTDsKKworCWlmIChwZGF0YS0+Y2hvcF9lbikgeworCQlzdC0+Y29uZiB8PSBBRDcxOTJfQ09ORl9DSE9QOworCQlpZiAocGRhdGEtPnNpbmMzX2VuKQorCQkJc3QtPmZfb3JkZXIgPSAzOyAvKiBTSU5DIDNyZCBvcmRlciAqLworCQllbHNlCisJCQlzdC0+Zl9vcmRlciA9IDQ7IC8qIFNJTkMgNHRoIG9yZGVyICovCisJfSBlbHNlIHsKKwkJc3QtPmZfb3JkZXIgPSAxOworCX0KKworCWlmIChwZGF0YS0+YnVmX2VuKQorCQlzdC0+Y29uZiB8PSBBRDcxOTJfQ09ORl9CVUY7CisKKwlpZiAocGRhdGEtPnVuaXBvbGFyX2VuKQorCQlzdC0+Y29uZiB8PSBBRDcxOTJfQ09ORl9VTklQT0xBUjsKKworCWlmIChwZGF0YS0+YnVybm91dF9jdXJyX2VuKQorCQlzdC0+Y29uZiB8PSBBRDcxOTJfQ09ORl9CVVJOOworCisJcmV0ID0gYWQ3MTkyX3dyaXRlX3JlZyhzdCwgQUQ3MTkyX1JFR19NT0RFLCAzLCBzdC0+bW9kZSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBhZDcxOTJfd3JpdGVfcmVnKHN0LCBBRDcxOTJfUkVHX0NPTkYsIDMsIHN0LT5jb25mKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IGFkNzE5Ml9jYWxpYnJhdGVfYWxsKHN0KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCS8qIFBvcHVsYXRlIGF2YWlsYWJsZSBBREMgaW5wdXQgcmFuZ2VzICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3QtPnNjYWxlX2F2YWlsKTsgaSsrKSB7CisJCXNjYWxlX3V2ID0gKCh1NjQpc3QtPmludF92cmVmX212ICogMTAwMDAwMDAwKQorCQkJPj4gKGluZGlvX2Rldi0+Y2hhbm5lbHNbMF0uc2Nhbl90eXBlLnJlYWxiaXRzIC0KKwkJCSgoc3QtPmNvbmYgJiBBRDcxOTJfQ09ORl9VTklQT0xBUikgPyAwIDogMSkpOworCQlzY2FsZV91diA+Pj0gaTsKKworCQlzdC0+c2NhbGVfYXZhaWxbaV1bMV0gPSBkb19kaXYoc2NhbGVfdXYsIDEwMDAwMDAwMCkgKiAxMDsKKwkJc3QtPnNjYWxlX2F2YWlsW2ldWzBdID0gc2NhbGVfdXY7CisJfQorCisJcmV0dXJuIDA7CitvdXQ6CisJZGV2X2Vycigmc3QtPnNwaS0+ZGV2LCAic2V0dXAgZmFpbGVkXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkNzE5Ml9zY2FuX2Zyb21fcmluZyhzdHJ1Y3QgYWQ3MTkyX3N0YXRlICpzdCwgdW5zaWduZWQgY2gsIGludCAqdmFsKQoreworCXN0cnVjdCBpaW9fYnVmZmVyICpyaW5nID0gaWlvX3ByaXZfdG9fZGV2KHN0KS0+YnVmZmVyOworCWludCByZXQ7CisJczY0IGRhdDY0WzJdOworCXUzMiAqZGF0MzIgPSAodTMyICopZGF0NjQ7CisKKwlpZiAoISh0ZXN0X2JpdChjaCwgcmluZy0+c2Nhbl9tYXNrKSkpCisJCXJldHVybiAgLUVCVVNZOworCisJcmV0ID0gcmluZy0+YWNjZXNzLT5yZWFkX2xhc3QocmluZywgKHU4ICopICZkYXQ2NCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCSp2YWwgPSAqZGF0MzI7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZDcxOTJfcmluZ19wcmVlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3QgYWQ3MTkyX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJc3RydWN0IGlpb19idWZmZXIgKnJpbmcgPSBpbmRpb19kZXYtPmJ1ZmZlcjsKKwlzaXplX3QgZF9zaXplOworCXVuc2lnbmVkIGNoYW5uZWw7CisKKwlpZiAoIXJpbmctPnNjYW5fY291bnQpCisJCXJldHVybiAtRUlOVkFMOworCisJY2hhbm5lbCA9IGZpbmRfZmlyc3RfYml0KHJpbmctPnNjYW5fbWFzaywgaW5kaW9fZGV2LT5tYXNrbGVuZ3RoKTsKKworCWRfc2l6ZSA9IHJpbmctPnNjYW5fY291bnQgKgorCQkgaW5kaW9fZGV2LT5jaGFubmVsc1swXS5zY2FuX3R5cGUuc3RvcmFnZWJpdHMgLyA4OworCisJaWYgKHJpbmctPnNjYW5fdGltZXN0YW1wKSB7CisJCWRfc2l6ZSArPSBzaXplb2YoczY0KTsKKworCQlpZiAoZF9zaXplICUgc2l6ZW9mKHM2NCkpCisJCQlkX3NpemUgKz0gc2l6ZW9mKHM2NCkgLSAoZF9zaXplICUgc2l6ZW9mKHM2NCkpOworCX0KKworCWlmIChpbmRpb19kZXYtPmJ1ZmZlci0+YWNjZXNzLT5zZXRfYnl0ZXNfcGVyX2RhdHVtKQorCQlpbmRpb19kZXYtPmJ1ZmZlci0+YWNjZXNzLT4KKwkJCXNldF9ieXRlc19wZXJfZGF0dW0oaW5kaW9fZGV2LT5idWZmZXIsIGRfc2l6ZSk7CisKKwlzdC0+bW9kZSAgPSAoc3QtPm1vZGUgJiB+QUQ3MTkyX01PREVfU0VMKC0xKSkgfAorCQkgICAgQUQ3MTkyX01PREVfU0VMKEFENzE5Ml9NT0RFX0NPTlQpOworCXN0LT5jb25mICA9IChzdC0+Y29uZiAmIH5BRDcxOTJfQ09ORl9DSEFOKC0xKSkgfAorCQkgICAgQUQ3MTkyX0NPTkZfQ0hBTigxIDw8IGluZGlvX2Rldi0+Y2hhbm5lbHNbY2hhbm5lbF0uYWRkcmVzcyk7CisKKwlhZDcxOTJfd3JpdGVfcmVnKHN0LCBBRDcxOTJfUkVHX0NPTkYsIDMsIHN0LT5jb25mKTsKKworCXNwaV9idXNfbG9jayhzdC0+c3BpLT5tYXN0ZXIpOworCV9fYWQ3MTkyX3dyaXRlX3JlZyhzdCwgMSwgMSwgQUQ3MTkyX1JFR19NT0RFLCAzLCBzdC0+bW9kZSk7CisKKwlzdC0+aXJxX2RpcyA9IGZhbHNlOworCWVuYWJsZV9pcnEoc3QtPnNwaS0+aXJxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkNzE5Ml9yaW5nX3Bvc3RkaXNhYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGFkNzE5Ml9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJc3QtPm1vZGUgID0gKHN0LT5tb2RlICYgfkFENzE5Ml9NT0RFX1NFTCgtMSkpIHwKKwkJICAgIEFENzE5Ml9NT0RFX1NFTChBRDcxOTJfTU9ERV9JRExFKTsKKworCXN0LT5kb25lID0gZmFsc2U7CisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHN0LT53cV9kYXRhX2F2YWlsLCBzdC0+ZG9uZSk7CisKKwlpZiAoIXN0LT5pcnFfZGlzKQorCQlkaXNhYmxlX2lycV9ub3N5bmMoc3QtPnNwaS0+aXJxKTsKKworCV9fYWQ3MTkyX3dyaXRlX3JlZyhzdCwgMSwgMCwgQUQ3MTkyX1JFR19NT0RFLCAzLCBzdC0+bW9kZSk7CisKKwlyZXR1cm4gc3BpX2J1c191bmxvY2soc3QtPnNwaS0+bWFzdGVyKTsKK30KKworLyoqCisgKiBhZDcxOTJfdHJpZ2dlcl9oYW5kbGVyKCkgYmggb2YgdHJpZ2dlciBsYXVuY2hlZCBwb2xsaW5nIHRvIHJpbmcgYnVmZmVyCisgKiovCitzdGF0aWMgaXJxcmV0dXJuX3QgYWQ3MTkyX3RyaWdnZXJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwKQoreworCXN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZiA9IHA7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5pbmRpb19kZXY7CisJc3RydWN0IGlpb19idWZmZXIgKnJpbmcgPSBpbmRpb19kZXYtPmJ1ZmZlcjsKKwlzdHJ1Y3QgYWQ3MTkyX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJczY0IGRhdDY0WzJdOworCXMzMiAqZGF0MzIgPSAoczMyICopZGF0NjQ7CisKKwlpZiAocmluZy0+c2Nhbl9jb3VudCkKKwkJX19hZDcxOTJfcmVhZF9yZWcoc3QsIDEsIDEsIEFENzE5Ml9SRUdfREFUQSwKKwkJCQkgIGRhdDMyLAorCQkJCSAgaW5kaW9fZGV2LT5jaGFubmVsc1swXS5zY2FuX3R5cGUucmVhbGJpdHMvOCk7CisKKwkvKiBHdWFyYW50ZWVkIHRvIGJlIGFsaWduZWQgd2l0aCA4IGJ5dGUgYm91bmRhcnkgKi8KKwlpZiAocmluZy0+c2Nhbl90aW1lc3RhbXApCisJCWRhdDY0WzFdID0gcGYtPnRpbWVzdGFtcDsKKworCXJpbmctPmFjY2Vzcy0+c3RvcmVfdG8ocmluZywgKHU4ICopZGF0NjQsIHBmLT50aW1lc3RhbXApOworCisJaWlvX3RyaWdnZXJfbm90aWZ5X2RvbmUoaW5kaW9fZGV2LT50cmlnKTsKKwlzdC0+aXJxX2RpcyA9IGZhbHNlOworCWVuYWJsZV9pcnEoc3QtPnNwaS0+aXJxKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fYnVmZmVyX3NldHVwX29wcyBhZDcxOTJfcmluZ19zZXR1cF9vcHMgPSB7CisJLnByZWVuYWJsZSA9ICZhZDcxOTJfcmluZ19wcmVlbmFibGUsCisJLnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZSwKKwkucHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNhYmxlLAorCS5wb3N0ZGlzYWJsZSA9ICZhZDcxOTJfcmluZ19wb3N0ZGlzYWJsZSwKK307CisKK3N0YXRpYyBpbnQgYWQ3MTkyX3JlZ2lzdGVyX3JpbmdfZnVuY3NfYW5kX2luaXQoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgcmV0OworCisJaW5kaW9fZGV2LT5idWZmZXIgPSBpaW9fc3dfcmJfYWxsb2NhdGUoaW5kaW9fZGV2KTsKKwlpZiAoIWluZGlvX2Rldi0+YnVmZmVyKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwkvKiBFZmZlY3RpdmVseSBzZWxlY3QgdGhlIHJpbmcgYnVmZmVyIGltcGxlbWVudGF0aW9uICovCisJaW5kaW9fZGV2LT5idWZmZXItPmFjY2VzcyA9ICZyaW5nX3N3X2FjY2Vzc19mdW5jczsKKwlpbmRpb19kZXYtPnBvbGxmdW5jID0gaWlvX2FsbG9jX3BvbGxmdW5jKCZpaW9fcG9sbGZ1bmNfc3RvcmVfdGltZSwKKwkJCQkJCSAmYWQ3MTkyX3RyaWdnZXJfaGFuZGxlciwKKwkJCQkJCSBJUlFGX09ORVNIT1QsCisJCQkJCQkgaW5kaW9fZGV2LAorCQkJCQkJICJhZDcxOTJfY29uc3VtZXIlZCIsCisJCQkJCQkgaW5kaW9fZGV2LT5pZCk7CisJaWYgKGluZGlvX2Rldi0+cG9sbGZ1bmMgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2RlYWxsb2NhdGVfc3dfcmI7CisJfQorCisJLyogUmluZyBidWZmZXIgZnVuY3Rpb25zIC0gaGVyZSB0cmlnZ2VyIHNldHVwIHJlbGF0ZWQgKi8KKwlpbmRpb19kZXYtPmJ1ZmZlci0+c2V0dXBfb3BzID0gJmFkNzE5Ml9yaW5nX3NldHVwX29wczsKKworCS8qIEZsYWcgdGhhdCBwb2xsZWQgcmluZyBidWZmZXJpbmcgaXMgcG9zc2libGUgKi8KKwlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX0JVRkZFUl9UUklHR0VSRUQ7CisJcmV0dXJuIDA7CisKK2Vycm9yX2RlYWxsb2NhdGVfc3dfcmI6CisJaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5idWZmZXIpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGFkNzE5Ml9yaW5nX2NsZWFudXAoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpaW9fZGVhbGxvY19wb2xsZnVuYyhpbmRpb19kZXYtPnBvbGxmdW5jKTsKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPmJ1ZmZlcik7Cit9CisKKy8qKgorICogYWQ3MTkyX2RhdGFfcmR5X3RyaWdfcG9sbCgpIHRoZSBldmVudCBoYW5kbGVyIGZvciB0aGUgZGF0YSByZHkgdHJpZworICoqLworc3RhdGljIGlycXJldHVybl90IGFkNzE5Ml9kYXRhX3JkeV90cmlnX3BvbGwoaW50IGlycSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3QgYWQ3MTkyX3N0YXRlICpzdCA9IGlpb19wcml2KHByaXZhdGUpOworCisJc3QtPmRvbmUgPSB0cnVlOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmc3QtPndxX2RhdGFfYXZhaWwpOworCWRpc2FibGVfaXJxX25vc3luYyhpcnEpOworCXN0LT5pcnFfZGlzID0gdHJ1ZTsKKwlpaW9fdHJpZ2dlcl9wb2xsKHN0LT50cmlnLCBpaW9fZ2V0X3RpbWVfbnMoKSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgYWQ3MTkyX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3QgYWQ3MTkyX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKKworCXN0LT50cmlnID0gaWlvX2FsbG9jYXRlX3RyaWdnZXIoIiVzLWRldiVkIiwKKwkJCQkJc3BpX2dldF9kZXZpY2VfaWQoc3QtPnNwaSktPm5hbWUsCisJCQkJCWluZGlvX2Rldi0+aWQpOworCWlmIChzdC0+dHJpZyA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKworCXJldCA9IHJlcXVlc3RfaXJxKHN0LT5zcGktPmlycSwKKwkJCSAgYWQ3MTkyX2RhdGFfcmR5X3RyaWdfcG9sbCwKKwkJCSAgSVJRRl9UUklHR0VSX0xPVywKKwkJCSAgc3BpX2dldF9kZXZpY2VfaWQoc3QtPnNwaSktPm5hbWUsCisJCQkgIGluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX3RyaWc7CisKKwlkaXNhYmxlX2lycV9ub3N5bmMoc3QtPnNwaS0+aXJxKTsKKwlzdC0+aXJxX2RpcyA9IHRydWU7CisJc3QtPnRyaWctPmRldi5wYXJlbnQgPSAmc3QtPnNwaS0+ZGV2OworCXN0LT50cmlnLT5vd25lciA9IFRISVNfTU9EVUxFOworCXN0LT50cmlnLT5wcml2YXRlX2RhdGEgPSBpbmRpb19kZXY7CisKKwlyZXQgPSBpaW9fdHJpZ2dlcl9yZWdpc3RlcihzdC0+dHJpZyk7CisKKwkvKiBzZWxlY3QgZGVmYXVsdCB0cmlnZ2VyICovCisJaW5kaW9fZGV2LT50cmlnID0gc3QtPnRyaWc7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2lycTsKKworCXJldHVybiAwOworCitlcnJvcl9mcmVlX2lycToKKwlmcmVlX2lycShzdC0+c3BpLT5pcnEsIGluZGlvX2Rldik7CitlcnJvcl9mcmVlX3RyaWc6CisJaWlvX2ZyZWVfdHJpZ2dlcihzdC0+dHJpZyk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYWQ3MTkyX3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGFkNzE5Ml9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJaWlvX3RyaWdnZXJfdW5yZWdpc3RlcihzdC0+dHJpZyk7CisJZnJlZV9pcnEoc3QtPnNwaS0+aXJxLCBpbmRpb19kZXYpOworCWlpb19mcmVlX3RyaWdnZXIoc3QtPnRyaWcpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDcxOTJfcmVhZF9mcmVxdWVuY3koc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTkyX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc3QtPm1jbGsgLworCQkJKHN0LT5mX29yZGVyICogMTAyNCAqIEFENzE5Ml9NT0RFX1JBVEUoc3QtPm1vZGUpKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE5Ml93cml0ZV9mcmVxdWVuY3koc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTkyX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJdW5zaWduZWQgbG9uZyBsdmFsOworCWludCBkaXYsIHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZsdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJaWYgKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpKSB7CisJCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJZGl2ID0gc3QtPm1jbGsgLyAobHZhbCAqIHN0LT5mX29yZGVyICogMTAyNCk7CisJaWYgKGRpdiA8IDEgfHwgZGl2ID4gMTAyMykgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlzdC0+bW9kZSAmPSB+QUQ3MTkyX01PREVfUkFURSgtMSk7CisJc3QtPm1vZGUgfD0gQUQ3MTkyX01PREVfUkFURShkaXYpOworCWFkNzE5Ml93cml0ZV9yZWcoc3QsIEFENzE5Ml9SRUdfTU9ERSwgMywgc3QtPm1vZGUpOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfU0FNUF9GUkVRKFNfSVdVU1IgfCBTX0lSVUdPLAorCQlhZDcxOTJfcmVhZF9mcmVxdWVuY3ksCisJCWFkNzE5Ml93cml0ZV9mcmVxdWVuY3kpOworCisKK3N0YXRpYyBzc2l6ZV90IGFkNzE5Ml9zaG93X3NjYWxlX2F2YWlsYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTkyX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IGksIGxlbiA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdC0+c2NhbGVfYXZhaWwpOyBpKyspCisJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiVkLiUwOXUgIiwgc3QtPnNjYWxlX2F2YWlsW2ldWzBdLAorCQkJICAgICAgIHN0LT5zY2FsZV9hdmFpbFtpXVsxXSk7CisKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJcbiIpOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUl9OQU1FRChpbl92X21fdl9zY2FsZV9hdmFpbGFibGUsCisJCQkgICAgIGluX3ZvbHRhZ2Utdm9sdGFnZV9zY2FsZV9hdmFpbGFibGUsCisJCQkgICAgIFNfSVJVR08sIGFkNzE5Ml9zaG93X3NjYWxlX2F2YWlsYWJsZSwgTlVMTCwgMCk7CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW5fdm9sdGFnZV9zY2FsZV9hdmFpbGFibGUsIFNfSVJVR08sCisJCSAgICAgICBhZDcxOTJfc2hvd19zY2FsZV9hdmFpbGFibGUsIE5VTEwsIDApOworCitzdGF0aWMgc3NpemVfdCBhZDcxOTJfc2hvd19hY19leGNpdGF0aW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzE5Ml9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICEhKHN0LT5tb2RlICYgQUQ3MTkyX01PREVfQUNYKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE5Ml9zaG93X2JyaWRnZV9zd2l0Y2goc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTkyX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgISEoc3QtPmdwb2NvbiAmIEFENzE5Ml9HUE9DT05fQlBEU1cpKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MTkyX3NldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxOTJfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJaW50IHJldDsKKwlib29sIHZhbDsKKworCXJldCA9IHN0cnRvYm9vbChidWYsICZ2YWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJaWYgKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpKSB7CisJCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJc3dpdGNoICh0aGlzX2F0dHItPmFkZHJlc3MpIHsKKwljYXNlIEFENzE5Ml9SRUdfR1BPQ09OOgorCQlpZiAodmFsKQorCQkJc3QtPmdwb2NvbiB8PSBBRDcxOTJfR1BPQ09OX0JQRFNXOworCQllbHNlCisJCQlzdC0+Z3BvY29uICY9IH5BRDcxOTJfR1BPQ09OX0JQRFNXOworCisJCWFkNzE5Ml93cml0ZV9yZWcoc3QsIEFENzE5Ml9SRUdfR1BPQ09OLCAxLCBzdC0+Z3BvY29uKTsKKwkJYnJlYWs7CisJY2FzZSBBRDcxOTJfUkVHX01PREU6CisJCWlmICh2YWwpCisJCQlzdC0+bW9kZSB8PSBBRDcxOTJfTU9ERV9BQ1g7CisJCWVsc2UKKwkJCXN0LT5tb2RlICY9IH5BRDcxOTJfTU9ERV9BQ1g7CisKKwkJYWQ3MTkyX3dyaXRlX3JlZyhzdCwgQUQ3MTkyX1JFR19HUE9DT04sIDMsIHN0LT5tb2RlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihicmlkZ2Vfc3dpdGNoX2VuLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJICAgICAgIGFkNzE5Ml9zaG93X2JyaWRnZV9zd2l0Y2gsIGFkNzE5Ml9zZXQsCisJCSAgICAgICBBRDcxOTJfUkVHX0dQT0NPTik7CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoYWNfZXhjaXRhdGlvbl9lbiwgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgICAgICBhZDcxOTJfc2hvd19hY19leGNpdGF0aW9uLCBhZDcxOTJfc2V0LAorCQkgICAgICAgQUQ3MTkyX1JFR19NT0RFKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNzE5Ml9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX3ZfbV92X3NjYWxlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fdm9sdGFnZV9zY2FsZV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2JyaWRnZV9zd2l0Y2hfZW4uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2FjX2V4Y2l0YXRpb25fZW4uZGV2X2F0dHIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgbW9kZV90IGFkNzE5Ml9hdHRyX2lzX3Zpc2libGUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBpbnQgbikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxOTJfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCW1vZGVfdCBtb2RlID0gYXR0ci0+bW9kZTsKKworCWlmICgoc3QtPmRldmlkICE9IElEX0FENzE5NSkgJiYKKwkJKGF0dHIgPT0gJmlpb19kZXZfYXR0cl9hY19leGNpdGF0aW9uX2VuLmRldl9hdHRyLmF0dHIpKQorCQltb2RlID0gMDsKKworCXJldHVybiBtb2RlOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDcxOTJfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNzE5Ml9hdHRyaWJ1dGVzLAorCS5pc192aXNpYmxlID0gYWQ3MTkyX2F0dHJfaXNfdmlzaWJsZSwKK307CisKK3N0YXRpYyBpbnQgYWQ3MTkyX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCSAgIGludCAqdmFsLAorCQkJICAgaW50ICp2YWwyLAorCQkJICAgbG9uZyBtKQoreworCXN0cnVjdCBhZDcxOTJfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0LCBzbXBsID0gMDsKKwlib29sIHVuaXBvbGFyID0gISEoc3QtPmNvbmYgJiBBRDcxOTJfQ09ORl9VTklQT0xBUik7CisKKwlzd2l0Y2ggKG0pIHsKKwljYXNlIDA6CisJCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCQlpZiAoaWlvX2J1ZmZlcl9lbmFibGVkKGluZGlvX2RldikpCisJCQlyZXQgPSBhZDcxOTJfc2Nhbl9mcm9tX3Jpbmcoc3QsCisJCQkJCWNoYW4tPnNjYW5faW5kZXgsICZzbXBsKTsKKwkJZWxzZQorCQkJcmV0ID0gYWQ3MTkyX3JlYWQoc3QsIGNoYW4tPmFkZHJlc3MsCisJCQkJCWNoYW4tPnNjYW5fdHlwZS5yZWFsYml0cyAvIDgsICZzbXBsKTsKKwkJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJKnZhbCA9IChzbXBsID4+IGNoYW4tPnNjYW5fdHlwZS5zaGlmdCkgJgorCQkJKCgxIDw8IChjaGFuLT5zY2FuX3R5cGUucmVhbGJpdHMpKSAtIDEpOworCisJCXN3aXRjaCAoY2hhbi0+dHlwZSkgeworCQljYXNlIElJT19WT0xUQUdFOgorCQkJaWYgKCF1bmlwb2xhcikKKwkJCQkqdmFsIC09ICgxIDw8IChjaGFuLT5zY2FuX3R5cGUucmVhbGJpdHMgLSAxKSk7CisJCQlicmVhazsKKwkJY2FzZSBJSU9fVEVNUDoKKwkJCSp2YWwgLT0gMHg4MDAwMDA7CisJCQkqdmFsIC89IDI4MTU7IC8qIHRlbXAgS2VsdmluICovCisJCQkqdmFsIC09IDI3MzsgLyogdGVtcCBDZWxzaXVzICovCisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKworCWNhc2UgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpOgorCQltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwkJKnZhbCA9IHN0LT5zY2FsZV9hdmFpbFtBRDcxOTJfQ09ORl9HQUlOKHN0LT5jb25mKV1bMF07CisJCSp2YWwyID0gc3QtPnNjYWxlX2F2YWlsW0FENzE5Ml9DT05GX0dBSU4oc3QtPmNvbmYpXVsxXTsKKwkJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCQlyZXR1cm4gSUlPX1ZBTF9JTlRfUExVU19OQU5POworCisJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKToKKwkJKnZhbCA9ICAxMDAwOworCisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBhZDcxOTJfd3JpdGVfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICAgICAgaW50IHZhbCwKKwkJCSAgICAgICBpbnQgdmFsMiwKKwkJCSAgICAgICBsb25nIG1hc2spCit7CisJc3RydWN0IGFkNzE5Ml9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQsIGk7CisJdW5zaWduZWQgaW50IHRtcDsKKworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCWlmIChpaW9fYnVmZmVyX2VuYWJsZWQoaW5kaW9fZGV2KSkgeworCQltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpOgorCQlyZXQgPSAtRUlOVkFMOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdC0+c2NhbGVfYXZhaWwpOyBpKyspCisJCQlpZiAodmFsMiA9PSBzdC0+c2NhbGVfYXZhaWxbaV1bMV0pIHsKKwkJCQl0bXAgPSBzdC0+Y29uZjsKKwkJCQlzdC0+Y29uZiAmPSB+QUQ3MTkyX0NPTkZfR0FJTigtMSk7CisJCQkJc3QtPmNvbmYgfD0gQUQ3MTkyX0NPTkZfR0FJTihpKTsKKworCQkJCWlmICh0bXAgIT0gc3QtPmNvbmYpIHsKKwkJCQkJYWQ3MTkyX3dyaXRlX3JlZyhzdCwgQUQ3MTkyX1JFR19DT05GLAorCQkJCQkJCSAzLCBzdC0+Y29uZik7CisJCQkJCWFkNzE5Ml9jYWxpYnJhdGVfYWxsKHN0KTsKKwkJCQl9CisJCQkJcmV0ID0gMDsKKwkJCX0KKworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWQ3MTkyX3ZhbGlkYXRlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkgICBzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcpCit7CisJaWYgKGluZGlvX2Rldi0+dHJpZyAhPSB0cmlnKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkNzE5Ml93cml0ZV9yYXdfZ2V0X2ZtdChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgICAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgICAgIGxvbmcgbWFzaykKK3sKKwlyZXR1cm4gSUlPX1ZBTF9JTlRfUExVU19OQU5POworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkNzE5Ml9pbmZvID0geworCS5yZWFkX3JhdyA9ICZhZDcxOTJfcmVhZF9yYXcsCisJLndyaXRlX3JhdyA9ICZhZDcxOTJfd3JpdGVfcmF3LAorCS53cml0ZV9yYXdfZ2V0X2ZtdCA9ICZhZDcxOTJfd3JpdGVfcmF3X2dldF9mbXQsCisJLmF0dHJzID0gJmFkNzE5Ml9hdHRyaWJ1dGVfZ3JvdXAsCisJLnZhbGlkYXRlX3RyaWdnZXIgPSBhZDcxOTJfdmFsaWRhdGVfdHJpZ2dlciwKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorfTsKKworI2RlZmluZSBBRDcxOTJfQ0hBTl9ESUZGKF9jaGFuLCBfY2hhbjIsIF9uYW1lLCBfYWRkcmVzcywgX3NpKQkJXAorCXsgLnR5cGUgPSBJSU9fVk9MVEFHRSwJCQkJCQlcCisJICAuZGlmZmVyZW50aWFsID0gMSwJCQkJCQlcCisJICAuaW5kZXhlZCA9IDEsCQkJCQkJCVwKKwkgIC5leHRlbmRfbmFtZSA9IF9uYW1lLAkJCQkJCVwKKwkgIC5jaGFubmVsID0gX2NoYW4sCQkJCQkJXAorCSAgLmNoYW5uZWwyID0gX2NoYW4yLAkJCQkJCVwKKwkgIC5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCQlcCisJICAuYWRkcmVzcyA9IF9hZGRyZXNzLAkJCQkJCVwKKwkgIC5zY2FuX2luZGV4ID0gX3NpLAkJCQkJCVwKKwkgIC5zY2FuX3R5cGUgPSAgSUlPX1NUKCdzJywgMjQsIDMyLCAwKX0KKworI2RlZmluZSBBRDcxOTJfQ0hBTihfY2hhbiwgX2FkZHJlc3MsIF9zaSkJCQkJXAorCXsgLnR5cGUgPSBJSU9fVk9MVEFHRSwJCQkJCQlcCisJICAuaW5kZXhlZCA9IDEsCQkJCQkJCVwKKwkgIC5jaGFubmVsID0gX2NoYW4sCQkJCQkJXAorCSAgLmluZm9fbWFzayA9ICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwJCVwKKwkgIC5hZGRyZXNzID0gX2FkZHJlc3MsCQkJCQkJXAorCSAgLnNjYW5faW5kZXggPSBfc2ksCQkJCQkJXAorCSAgLnNjYW5fdHlwZSA9ICBJSU9fU1QoJ3MnLCAyNCwgMzIsIDApfQorCisjZGVmaW5lIEFENzE5Ml9DSEFOX1RFTVAoX2NoYW4sIF9hZGRyZXNzLCBfc2kpCQkJCVwKKwl7IC50eXBlID0gSUlPX1RFTVAsCQkJCQkJXAorCSAgLmluZGV4ZWQgPSAxLAkJCQkJCQlcCisJICAuY2hhbm5lbCA9IF9jaGFuLAkJCQkJCVwKKwkgIC5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwJCVwKKwkgIC5hZGRyZXNzID0gX2FkZHJlc3MsCQkJCQkJXAorCSAgLnNjYW5faW5kZXggPSBfc2ksCQkJCQkJXAorCSAgLnNjYW5fdHlwZSA9ICBJSU9fU1QoJ3MnLCAyNCwgMzIsIDApfQorCitzdGF0aWMgc3RydWN0IGlpb19jaGFuX3NwZWMgYWQ3MTkyX2NoYW5uZWxzW10gPSB7CisJQUQ3MTkyX0NIQU5fRElGRigxLCAyLCBOVUxMLCBBRDcxOTJfQ0hfQUlOMVBfQUlOMk0sIDApLAorCUFENzE5Ml9DSEFOX0RJRkYoMywgNCwgTlVMTCwgQUQ3MTkyX0NIX0FJTjNQX0FJTjRNLCAxKSwKKwlBRDcxOTJfQ0hBTl9URU1QKDAsIEFENzE5Ml9DSF9URU1QLCAyKSwKKwlBRDcxOTJfQ0hBTl9ESUZGKDIsIDIsICJzaG9ydGVkIiwgQUQ3MTkyX0NIX0FJTjJQX0FJTjJNLCAzKSwKKwlBRDcxOTJfQ0hBTigxLCBBRDcxOTJfQ0hfQUlOMSwgNCksCisJQUQ3MTkyX0NIQU4oMiwgQUQ3MTkyX0NIX0FJTjIsIDUpLAorCUFENzE5Ml9DSEFOKDMsIEFENzE5Ml9DSF9BSU4zLCA2KSwKKwlBRDcxOTJfQ0hBTig0LCBBRDcxOTJfQ0hfQUlONCwgNyksCisJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoOCksCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDcxOTJfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgYWQ3MTkyX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgYWQ3MTkyX3N0YXRlICpzdDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCWludCByZXQsIGkgLCB2b2x0YWdlX3V2ID0gMDsKKworCWlmICghcGRhdGEpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJubyBwbGF0Zm9ybSBkYXRhP1xuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICghc3BpLT5pcnEpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJubyBJUlE/XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZShzaXplb2YoKnN0KSk7CisJaWYgKGluZGlvX2RldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXN0LT5yZWcgPSByZWd1bGF0b3JfZ2V0KCZzcGktPmRldiwgInZjYyIpOworCWlmICghSVNfRVJSKHN0LT5yZWcpKSB7CisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoc3QtPnJlZyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3B1dF9yZWc7CisKKwkJdm9sdGFnZV91diA9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZShzdC0+cmVnKTsKKwl9CisKKwlzdC0+cGRhdGEgPSBwZGF0YTsKKworCWlmIChwZGF0YSAmJiBwZGF0YS0+dnJlZl9tdikKKwkJc3QtPmludF92cmVmX212ID0gcGRhdGEtPnZyZWZfbXY7CisJZWxzZSBpZiAodm9sdGFnZV91dikKKwkJc3QtPmludF92cmVmX212ID0gdm9sdGFnZV91diAvIDEwMDA7CisJZWxzZQorCQlkZXZfd2Fybigmc3BpLT5kZXYsICJyZWZlcmVuY2Ugdm9sdGFnZSB1bmRlZmluZWRcbiIpOworCisJc3BpX3NldF9kcnZkYXRhKHNwaSwgaW5kaW9fZGV2KTsKKwlzdC0+c3BpID0gc3BpOworCXN0LT5kZXZpZCA9IHNwaV9nZXRfZGV2aWNlX2lkKHNwaSktPmRyaXZlcl9kYXRhOworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlpbmRpb19kZXYtPm5hbWUgPSBzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5uYW1lOworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gYWQ3MTkyX2NoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShhZDcxOTJfY2hhbm5lbHMpOworCWluZGlvX2Rldi0+YXZhaWxhYmxlX3NjYW5fbWFza3MgPSBzdC0+YXZhaWxhYmxlX3NjYW5fbWFza3M7CisJaW5kaW9fZGV2LT5pbmZvID0gJmFkNzE5Ml9pbmZvOworCisJZm9yIChpID0gMDsgaSA8IGluZGlvX2Rldi0+bnVtX2NoYW5uZWxzOyBpKyspCisJCXN0LT5hdmFpbGFibGVfc2Nhbl9tYXNrc1tpXSA9ICgxIDw8IGkpIHwgKDEgPDwKKwkJCWluZGlvX2Rldi0+Y2hhbm5lbHNbaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgLSAxXS4KKwkJCXNjYW5faW5kZXgpOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmc3QtPndxX2RhdGFfYXZhaWwpOworCisJcmV0ID0gYWQ3MTkyX3JlZ2lzdGVyX3JpbmdfZnVuY3NfYW5kX2luaXQoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2Rpc2FibGVfcmVnOworCisJcmV0ID0gYWQ3MTkyX3Byb2JlX3RyaWdnZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JpbmdfY2xlYW51cDsKKworCXJldCA9IGlpb19idWZmZXJfcmVnaXN0ZXIoaW5kaW9fZGV2LAorCQkJCSAgaW5kaW9fZGV2LT5jaGFubmVscywKKwkJCQkgIGluZGlvX2Rldi0+bnVtX2NoYW5uZWxzKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCisJcmV0ID0gYWQ3MTkyX3NldHVwKHN0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3VucmVnX3Jpbmc7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3JfdW5yZWdfcmluZzsKKwlyZXR1cm4gMDsKKworZXJyb3JfdW5yZWdfcmluZzoKKwlpaW9fYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKK2Vycm9yX3JlbW92ZV90cmlnZ2VyOgorCWFkNzE5Ml9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOworZXJyb3JfcmluZ19jbGVhbnVwOgorCWFkNzE5Ml9yaW5nX2NsZWFudXAoaW5kaW9fZGV2KTsKK2Vycm9yX2Rpc2FibGVfcmVnOgorCWlmICghSVNfRVJSKHN0LT5yZWcpKQorCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnKTsKK2Vycm9yX3B1dF9yZWc6CisJaWYgKCFJU19FUlIoc3QtPnJlZykpCisJCXJlZ3VsYXRvcl9wdXQoc3QtPnJlZyk7CisKKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWQ3MTkyX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKKwlzdHJ1Y3QgYWQ3MTkyX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlhZDcxOTJfcmVtb3ZlX3RyaWdnZXIoaW5kaW9fZGV2KTsKKwlhZDcxOTJfcmluZ19jbGVhbnVwKGluZGlvX2Rldik7CisKKwlpZiAoIUlTX0VSUihzdC0+cmVnKSkgeworCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnKTsKKwkJcmVndWxhdG9yX3B1dChzdC0+cmVnKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGFkNzE5Ml9pZFtdID0geworCXsiYWQ3MTkwIiwgSURfQUQ3MTkwfSwKKwl7ImFkNzE5MiIsIElEX0FENzE5Mn0sCisJeyJhZDcxOTUiLCBJRF9BRDcxOTV9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQ3MTkyX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJhZDcxOTIiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBhZDcxOTJfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhZDcxOTJfcmVtb3ZlKSwKKwkuaWRfdGFibGUJPSBhZDcxOTJfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZDcxOTJfaW5pdCh2b2lkKQoreworCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZDcxOTJfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGFkNzE5Ml9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGFkNzE5Ml9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDcxOTJfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkNzE5Ml9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWljaGFlbCBIZW5uZXJpY2ggPGhlbm5lcmljaEBibGFja2Zpbi51Y2xpbnV4Lm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQ3MTkwLCBBRDcxOTIsIEFENzE5NSBBREMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzE5Mi5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MTkyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBhNWI2MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzE5Mi5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBBRDcxOTAgQUQ3MTkyIEFENzE5NSBTUEkgQURDIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAyMDExIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIuCisgKi8KKyNpZm5kZWYgSUlPX0FEQ19BRDcxOTJfSF8KKyNkZWZpbmUgSUlPX0FEQ19BRDcxOTJfSF8KKworLyoKKyAqIFRPRE86IHN0cnVjdCBhZDcxOTJfcGxhdGZvcm1fZGF0YSBuZWVkcyB0byBnbyBpbnRvIGluY2x1ZGUvbGludXgvaWlvCisgKi8KKworLyoqCisgKiBzdHJ1Y3QgYWQ3MTkyX3BsYXRmb3JtX2RhdGEgLSBwbGF0Zm9ybS9ib2FyZCBzcGVjaWZpYyBpbmZvcm1hdGlvbgorICogQHZyZWZfbXY6CQl0aGUgZXh0ZXJuYWwgcmVmZXJlbmNlIHZvbHRhZ2UgaW4gbWlsbGl2b2x0CisgKiBAY2xvY2tfc291cmNlX3NlbDoJWzAuLjNdCisgKgkJCTAgRXh0ZXJuYWwgNC45MiBNSHogY2xvY2sgY29ubmVjdGVkIGZyb20gTUNMSzEgdG8gTUNMSzIKKyAqCQkJMSBFeHRlcm5hbCBDbG9jayBhcHBsaWVkIHRvIE1DTEsyCisgKgkJCTIgSW50ZXJuYWwgNC45MiBNSHogQ2xvY2sgbm90IGF2YWlsYWJsZSBhdCB0aGUgTUNMSzIgcGluCisgKgkJCTMgSW50ZXJuYWwgNC45MiBNSHogQ2xvY2sgYXZhaWxhYmxlIGF0IHRoZSBNQ0xLMiBwaW4KKyAqIEBleHRfY2xrX0h6OgkJdGhlIGV4dGVybmFsIGNsb2NrIGZyZXF1ZW5jeSBpbiBIeiwgaWYgbm90IHNldAorICoJCQl0aGUgZHJpdmVyIHVzZXMgdGhlIGludGVybmFsIGNsb2NrICgxNi43NzYgTUh6KQorICogQHJlZmluMl9lbjoJCVJFRklOMS9SRUZJTjIgUmVmZXJlbmNlIFNlbGVjdCAoQUQ3MTkwLzIgb25seSkKKyAqIEByZWo2MF9lbjoJCTUwLzYwSHogbm90Y2ggZmlsdGVyIGVuYWJsZQorICogQHNpbmMzX2VuOgkJU0lOQzMgZmlsdGVyIGVuYWJsZSAoZGVmYXVsdCBTSU5DNCkKKyAqIEBjaG9wX2VuOgkJQ0hPUCBtb2RlIGVuYWJsZQorICogQGJ1Zl9lbjoJCWJ1ZmZlcmVkIGlucHV0IG1vZGUgZW5hYmxlCisgKiBAdW5pcG9sYXJfZW46CXVuaXBvbGFyIG1vZGUgZW5hYmxlCisgKiBAYnVybm91dF9jdXJyX2VuOgljb25zdGFudCBjdXJyZW50IGdlbmVyYXRvcnMgb24gQUlOKCt8LSkgZW5hYmxlCisgKi8KKworc3RydWN0IGFkNzE5Ml9wbGF0Zm9ybV9kYXRhIHsKKwl1MTYJCXZyZWZfbXY7CisJdTgJCWNsb2NrX3NvdXJjZV9zZWw7CisJdTMyCQlleHRfY2xrX0h6OworCWJvb2wJCXJlZmluMl9lbjsKKwlib29sCQlyZWo2MF9lbjsKKwlib29sCQlzaW5jM19lbjsKKwlib29sCQljaG9wX2VuOworCWJvb2wJCWJ1Zl9lbjsKKwlib29sCQl1bmlwb2xhcl9lbjsKKwlib29sCQlidXJub3V0X2N1cnJfZW47Cit9OworCisjZW5kaWYgLyogSUlPX0FEQ19BRDcxOTJfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzI4MGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzI4MGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzJkMDU5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MjgwYS5jCkBAIC0wLDAgKzEsOTk3IEBACisvKgorICogQUQ3MjgwQSBMaXRoaXVtIElvbiBCYXR0ZXJ5IE1vbml0b3JpbmcgU3lzdGVtCisgKgorICogQ29weXJpZ2h0IDIwMTEgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisjaW5jbHVkZSAiYWQ3MjgwYS5oIgorCisvKiBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgQUQ3MjgwQV9DRUxMX1ZPTFRBR0VfMQkJMHgwICAvKiBEMTEgdG8gRDAsIFJlYWQgb25seSAqLworI2RlZmluZSBBRDcyODBBX0NFTExfVk9MVEFHRV8yCQkweDEgIC8qIEQxMSB0byBEMCwgUmVhZCBvbmx5ICovCisjZGVmaW5lIEFENzI4MEFfQ0VMTF9WT0xUQUdFXzMJCTB4MiAgLyogRDExIHRvIEQwLCBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgQUQ3MjgwQV9DRUxMX1ZPTFRBR0VfNAkJMHgzICAvKiBEMTEgdG8gRDAsIFJlYWQgb25seSAqLworI2RlZmluZSBBRDcyODBBX0NFTExfVk9MVEFHRV81CQkweDQgIC8qIEQxMSB0byBEMCwgUmVhZCBvbmx5ICovCisjZGVmaW5lIEFENzI4MEFfQ0VMTF9WT0xUQUdFXzYJCTB4NSAgLyogRDExIHRvIEQwLCBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgQUQ3MjgwQV9BVVhfQURDXzEJCTB4NiAgLyogRDExIHRvIEQwLCBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgQUQ3MjgwQV9BVVhfQURDXzIJCTB4NyAgLyogRDExIHRvIEQwLCBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgQUQ3MjgwQV9BVVhfQURDXzMJCTB4OCAgLyogRDExIHRvIEQwLCBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgQUQ3MjgwQV9BVVhfQURDXzQJCTB4OSAgLyogRDExIHRvIEQwLCBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgQUQ3MjgwQV9BVVhfQURDXzUJCTB4QSAgLyogRDExIHRvIEQwLCBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgQUQ3MjgwQV9BVVhfQURDXzYJCTB4QiAgLyogRDExIHRvIEQwLCBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgQUQ3MjgwQV9TRUxGX1RFU1QJCTB4QyAgLyogRDExIHRvIEQwLCBSZWFkIG9ubHkgKi8KKyNkZWZpbmUgQUQ3MjgwQV9DT05UUk9MX0hCCQkweEQgIC8qIEQxNSB0byBEOCwgUmVhZC93cml0ZSAqLworI2RlZmluZSBBRDcyODBBX0NPTlRST0xfTEIJCTB4RSAgLyogRDcgdG8gRDAsIFJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgQUQ3MjgwQV9DRUxMX09WRVJWT0xUQUdFCTB4RiAgLyogRDcgdG8gRDAsIFJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgQUQ3MjgwQV9DRUxMX1VOREVSVk9MVEFHRQkweDEwIC8qIEQ3IHRvIEQwLCBSZWFkL3dyaXRlICovCisjZGVmaW5lIEFENzI4MEFfQVVYX0FEQ19PVkVSVk9MVEFHRQkweDExIC8qIEQ3IHRvIEQwLCBSZWFkL3dyaXRlICovCisjZGVmaW5lIEFENzI4MEFfQVVYX0FEQ19VTkRFUlZPTFRBR0UJMHgxMiAvKiBENyB0byBEMCwgUmVhZC93cml0ZSAqLworI2RlZmluZSBBRDcyODBBX0FMRVJUCQkJMHgxMyAvKiBENyB0byBEMCwgUmVhZC93cml0ZSAqLworI2RlZmluZSBBRDcyODBBX0NFTExfQkFMQU5DRQkJMHgxNCAvKiBENyB0byBEMCwgUmVhZC93cml0ZSAqLworI2RlZmluZSBBRDcyODBBX0NCMV9USU1FUgkJMHgxNSAvKiBENyB0byBEMCwgUmVhZC93cml0ZSAqLworI2RlZmluZSBBRDcyODBBX0NCMl9USU1FUgkJMHgxNiAvKiBENyB0byBEMCwgUmVhZC93cml0ZSAqLworI2RlZmluZSBBRDcyODBBX0NCM19USU1FUgkJMHgxNyAvKiBENyB0byBEMCwgUmVhZC93cml0ZSAqLworI2RlZmluZSBBRDcyODBBX0NCNF9USU1FUgkJMHgxOCAvKiBENyB0byBEMCwgUmVhZC93cml0ZSAqLworI2RlZmluZSBBRDcyODBBX0NCNV9USU1FUgkJMHgxOSAvKiBENyB0byBEMCwgUmVhZC93cml0ZSAqLworI2RlZmluZSBBRDcyODBBX0NCNl9USU1FUgkJMHgxQSAvKiBENyB0byBEMCwgUmVhZC93cml0ZSAqLworI2RlZmluZSBBRDcyODBBX1BEX1RJTUVSCQkweDFCIC8qIEQ3IHRvIEQwLCBSZWFkL3dyaXRlICovCisjZGVmaW5lIEFENzI4MEFfUkVBRAkJCTB4MUMgLyogRDcgdG8gRDAsIFJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgQUQ3MjgwQV9DTlZTVF9DT05UUk9MCQkweDFEIC8qIEQ3IHRvIEQwLCBSZWFkL3dyaXRlICovCisKKy8qIEJpdHMgYW5kIE1hc2tzICovCisjZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX0lOUFVUX0FMTAkJCSgwIDw8IDYpCisjZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX0lOUFVUXzZDRUxMX0FVWDFfM180CSgxIDw8IDYpCisjZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX0lOUFVUXzZDRUxMCQkoMiA8PCA2KQorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9JTlBVVF9TRUxGX1RFU1QJCSgzIDw8IDYpCisjZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX1JFU19SRUFEX0FMTAkJKDAgPDwgNCkKKyNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX0NPTlZfUkVTX1JFQURfNkNFTExfQVVYMV8zXzQJKDEgPDwgNCkKKyNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX0NPTlZfUkVTX1JFQURfNkNFTEwJCSgyIDw8IDQpCisjZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX1JFU19SRUFEX05PCQkoMyA8PCA0KQorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9TVEFSVF9DTlZTVAkJKDAgPDwgMykKKyNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX0NPTlZfU1RBUlRfQ1MJCQkoMSA8PCAzKQorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9BVkdfRElTCQkJKDAgPDwgMSkKKyNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX0NPTlZfQVZHXzIJCQkoMSA8PCAxKQorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9BVkdfNAkJCSgyIDw8IDEpCisjZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX0FWR184CQkJKDMgPDwgMSkKKyNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX0NPTlZfQVZHKHgpCQkJKCh4KSA8PCAxKQorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfUFdSRE5fU1cJCQkoMSA8PCAwKQorCisjZGVmaW5lIEFENzI4MEFfQ1RSTF9MQl9TV1JTVAkJCQkoMSA8PCA3KQorI2RlZmluZSBBRDcyODBBX0NUUkxfTEJfQUNRX1RJTUVfNDAwbnMJCQkoMCA8PCA1KQorI2RlZmluZSBBRDcyODBBX0NUUkxfTEJfQUNRX1RJTUVfODAwbnMJCQkoMSA8PCA1KQorI2RlZmluZSBBRDcyODBBX0NUUkxfTEJfQUNRX1RJTUVfMTIwMG5zCQkJKDIgPDwgNSkKKyNkZWZpbmUgQUQ3MjgwQV9DVFJMX0xCX0FDUV9USU1FXzE2MDBucwkJCSgzIDw8IDUpCisjZGVmaW5lIEFENzI4MEFfQ1RSTF9MQl9BQ1FfVElNRSh4KQkJCSgoeCkgPDwgNSkKKyNkZWZpbmUgQUQ3MjgwQV9DVFJMX0xCX01VU1RfU0VUCQkJKDEgPDwgNCkKKyNkZWZpbmUgQUQ3MjgwQV9DVFJMX0xCX1RIRVJNSVNUT1JfRU4JCQkoMSA8PCAzKQorI2RlZmluZSBBRDcyODBBX0NUUkxfTEJfTE9DS19ERVZfQUREUgkJCSgxIDw8IDIpCisjZGVmaW5lIEFENzI4MEFfQ1RSTF9MQl9JTkNfREVWX0FERFIJCQkoMSA8PCAxKQorI2RlZmluZSBBRDcyODBBX0NUUkxfTEJfREFJU1lfQ0hBSU5fUkJfRU4JCSgxIDw8IDApCisKKyNkZWZpbmUgQUQ3MjgwQV9BTEVSVF9HRU5fU1RBVElDX0hJR0gJCQkoMSA8PCA2KQorI2RlZmluZSBBRDcyODBBX0FMRVJUX1JFTEFZX1NJR19DSEFJTl9ET1dOCQkoMyA8PCA2KQorCisjZGVmaW5lIEFENzI4MEFfQUxMX0NFTExTCQkJCSgweEFEIDw8IDE2KQorCisjZGVmaW5lIEFENzI4MEFfTUFYX1NQSV9DTEtfSHoJCTcwMDAwMCAvKiA8IDFNSHogKi8KKyNkZWZpbmUgQUQ3MjgwQV9NQVhfQ0hBSU4JCTgKKyNkZWZpbmUgQUQ3MjgwQV9DRUxMU19QRVJfREVWCQk2CisjZGVmaW5lIEFENzI4MEFfQklUUwkJCTEyCisjZGVmaW5lIEFENzI4MEFfTlVNX0NICQkJKEFENzI4MEFfQVVYX0FEQ182IC0gXAorCQkJCQlBRDcyODBBX0NFTExfVk9MVEFHRV8xICsgMSkKKworI2RlZmluZSBBRDcyODBBX0RFVkFERFJfTUFTVEVSCQkwCisjZGVmaW5lIEFENzI4MEFfREVWQUREUl9BTEwJCTB4MUYKKy8qIDUtYml0IGRldmljZSBhZGRyZXNzIGlzIHNlbnQgTFNCIGZpcnN0ICovCisjZGVmaW5lIEFENzI4MEFfREVWQUREUihhZGRyKQkoKChhZGRyICYgMHgxKSA8PCA0KSB8ICgoYWRkciAmIDB4MikgPDwgMykgfCBcCisJCQkJKGFkZHIgJiAweDQpIHwgKChhZGRyICYgMHg4KSA+PiAzKSB8IFwKKwkJCQkoKGFkZHIgJiAweDEwKSA+PiA0KSkKKworLyogRHVyaW5nIGEgcmVhZCBhIHZhbGlkIHdyaXRlIGlzIG1hbmRhdG9yeS4KKyAqIFNvIHdyaXRpbmcgdG8gdGhlIGhpZ2hlc3QgYXZhaWxhYmxlIGFkZHJlc3MgKEFkZHJlc3MgMHgxRikKKyAqIGFuZCBzZXR0aW5nIHRoZSBhZGRyZXNzIGFsbCBwYXJ0cyBiaXQgdG8gMCBpcyByZWNvbW1lbmRlZAorICogU28gdGhlIFRYVkFMIGlzIEFENzI4MEFfREVWQUREUl9BTEwgKyBDUkMKKyAqLworI2RlZmluZSBBRDcyODBBX1JFQURfVFhWQUwJMHhGODAwMDMwQQorCisvKgorICogQUQ3MjgwIENSQworICoKKyAqIFAoeCkgPSB4XjggKyB4XjUgKyB4XjMgKyB4XjIgKyB4XjEgKyB4XjAgPSAwYjEwMDEwMTExMSA9PiAweDJGCisgKi8KKyNkZWZpbmUgUE9MWU5PTQkJMHgyRgorI2RlZmluZSBQT0xZTk9NX09SREVSCTgKKyNkZWZpbmUgSElHSEJJVAkJMSA8PCAoUE9MWU5PTV9PUkRFUiAtIDEpOworCitzdHJ1Y3QgYWQ3MjgwX3N0YXRlIHsKKwlzdHJ1Y3Qgc3BpX2RldmljZQkJKnNwaTsKKwlzdHJ1Y3QgaWlvX2NoYW5fc3BlYwkJKmNoYW5uZWxzOworCXN0cnVjdCBpaW9fZGV2X2F0dHIJCSppaW9fYXR0cjsKKwlpbnQJCQkJc2xhdmVfbnVtOworCWludAkJCQlzY2FuX2NudDsKKwlpbnQJCQkJcmVhZGJhY2tfZGVsYXlfdXM7CisJdW5zaWduZWQgY2hhcgkJCWNyY190YWJbMjU2XTsKKwl1bnNpZ25lZCBjaGFyCQkJY3RybF9oYjsKKwl1bnNpZ25lZCBjaGFyCQkJY3RybF9sYjsKKwl1bnNpZ25lZCBjaGFyCQkJY2VsbF90aHJlc2hoaWdoOworCXVuc2lnbmVkIGNoYXIJCQljZWxsX3RocmVzaGxvdzsKKwl1bnNpZ25lZCBjaGFyCQkJYXV4X3RocmVzaGhpZ2g7CisJdW5zaWduZWQgY2hhcgkJCWF1eF90aHJlc2hsb3c7CisJdW5zaWduZWQgY2hhcgkJCWNiX21hc2tbQUQ3MjgwQV9NQVhfQ0hBSU5dOworfTsKKworc3RhdGljIHZvaWQgYWQ3MjgwX2NyYzhfYnVpbGRfdGFibGUodW5zaWduZWQgY2hhciAqY3JjX3RhYikKK3sKKwl1bnNpZ25lZCBjaGFyIGJpdCwgY3JjOworCWludCBjbnQsIGk7CisKKwlmb3IgKGNudCA9IDA7IGNudCA8IDI1NjsgY250KyspIHsKKwkJY3JjID0gY250OworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQliaXQgPSBjcmMgJiBISUdIQklUOworCQkJY3JjIDw8PSAxOworCQkJaWYgKGJpdCkKKwkJCQljcmMgXj0gUE9MWU5PTTsKKwkJfQorCQljcmNfdGFiW2NudF0gPSBjcmM7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBhZDcyODBfY2FsY19jcmM4KHVuc2lnbmVkIGNoYXIgKmNyY190YWIsIHVuc2lnbmVkIHZhbCkKK3sKKwl1bnNpZ25lZCBjaGFyIGNyYzsKKworCWNyYyA9IGNyY190YWJbdmFsID4+IDE2ICYgMHhGRl07CisJY3JjID0gY3JjX3RhYltjcmMgXiAodmFsID4+IDggJiAweEZGKV07CisKKwlyZXR1cm4gIGNyYyBeICh2YWwgJiAweEZGKTsKK30KKworc3RhdGljIGludCBhZDcyODBfY2hlY2tfY3JjKHN0cnVjdCBhZDcyODBfc3RhdGUgKnN0LCB1bnNpZ25lZCB2YWwpCit7CisJdW5zaWduZWQgY2hhciBjcmMgPSBhZDcyODBfY2FsY19jcmM4KHN0LT5jcmNfdGFiLCB2YWwgPj4gMTApOworCisJaWYgKGNyYyAhPSAoKHZhbCA+PiAyKSAmIDB4RkYpKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiAwOworfQorCisvKiBBZnRlciBpbml0aWF0aW5nIGEgY29udmVyc2lvbiBzZXF1ZW5jZSB3ZSBuZWVkIHRvIHdhaXQgdW50aWwgdGhlCisgKiBjb252ZXJzaW9uIGlzIGRvbmUuIFRoZSBkZWxheSBpcyB0eXBpY2FsbHkgaW4gdGhlIHJhbmdlIG9mIDE1Li4zMCB1cworICogaG93ZXZlciBkZXBlbmRpbmcgYW4gdGhlIG51bWJlciBvZiBkZXZpY2VzIGluIHRoZSBkYWlzeSBjaGFpbiBhbmQgdGhlCisgKiBudW1iZXIgb2YgYXZlcmFnZXMgdGFrZW4sIGNvbnZlcnNpb24gZGVsYXlzIGFuZCBhY3F1aXNpdGlvbiB0aW1lIG9wdGlvbnMKKyAqIGl0IG1heSB0YWtlIHVwIHRvIDI1MHVzLCBpbiB0aGlzIGNhc2Ugd2UgYmV0dGVyIHNsZWVwIGluc3RlYWQgb2YgYnVzeQorICogd2FpdC4KKyAqLworCitzdGF0aWMgdm9pZCBhZDcyODBfZGVsYXkoc3RydWN0IGFkNzI4MF9zdGF0ZSAqc3QpCit7CisJaWYgKHN0LT5yZWFkYmFja19kZWxheV91cyA8IDUwKQorCQl1ZGVsYXkoc3QtPnJlYWRiYWNrX2RlbGF5X3VzKTsKKwllbHNlCisJCW1zbGVlcCgxKTsKK30KKworc3RhdGljIGludCBfX2FkNzI4MF9yZWFkMzIoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgdW5zaWduZWQgKnZhbCkKK3sKKwl1bnNpZ25lZCByeF9idWYsIHR4X2J1ZiA9IGNwdV90b19iZTMyKEFENzI4MEFfUkVBRF9UWFZBTCk7CisJaW50IHJldDsKKworCXN0cnVjdCBzcGlfdHJhbnNmZXIgdCA9IHsKKwkJLnR4X2J1Zgk9ICZ0eF9idWYsCisJCS5yeF9idWYgPSAmcnhfYnVmLAorCQkubGVuID0gNCwKKwl9OworCXN0cnVjdCBzcGlfbWVzc2FnZSBtOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbSk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnQsICZtKTsKKworCXJldCA9IHNwaV9zeW5jKHNwaSwgJm0pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkqdmFsID0gYmUzMl90b19jcHUocnhfYnVmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkNzI4MF93cml0ZShzdHJ1Y3QgYWQ3MjgwX3N0YXRlICpzdCwgdW5zaWduZWQgZGV2YWRkciwKKwkJCXVuc2lnbmVkIGFkZHIsIGJvb2wgYWxsLCB1bnNpZ25lZCB2YWwpCit7CisJdW5zaWduZWQgcmVnID0gKGRldmFkZHIgPDwgMjcgfCBhZGRyIDw8IDIxIHwKKwkJCSh2YWwgJiAweEZGKSA8PCAxMyB8IGFsbCA8PCAxMik7CisKKwlyZWcgfD0gYWQ3MjgwX2NhbGNfY3JjOChzdC0+Y3JjX3RhYiwgcmVnID4+IDExKSA8PCAzIHwgMHgyOworCXJlZyA9IGNwdV90b19iZTMyKHJlZyk7CisKKwlyZXR1cm4gc3BpX3dyaXRlKHN0LT5zcGksICZyZWcsIDQpOworfQorCitzdGF0aWMgaW50IGFkNzI4MF9yZWFkKHN0cnVjdCBhZDcyODBfc3RhdGUgKnN0LCB1bnNpZ25lZCBkZXZhZGRyLAorCQkJdW5zaWduZWQgYWRkcikKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIHRtcDsKKworCS8qIHR1cm5zIG9mZiB0aGUgcmVhZCBvcGVyYXRpb24gb24gYWxsIHBhcnRzICovCisJcmV0ID0gYWQ3MjgwX3dyaXRlKHN0LCBBRDcyODBBX0RFVkFERFJfTUFTVEVSLCBBRDcyODBBX0NPTlRST0xfSEIsIDEsCisJCQlBRDcyODBBX0NUUkxfSEJfQ09OVl9JTlBVVF9BTEwgfAorCQkJQUQ3MjgwQV9DVFJMX0hCX0NPTlZfUkVTX1JFQURfTk8gfAorCQkJc3QtPmN0cmxfaGIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiB0dXJucyBvbiB0aGUgcmVhZCBvcGVyYXRpb24gb24gdGhlIGFkZHJlc3NlZCBwYXJ0ICovCisJcmV0ID0gYWQ3MjgwX3dyaXRlKHN0LCBkZXZhZGRyLCBBRDcyODBBX0NPTlRST0xfSEIsIDAsCisJCQlBRDcyODBBX0NUUkxfSEJfQ09OVl9JTlBVVF9BTEwgfAorCQkJQUQ3MjgwQV9DVFJMX0hCX0NPTlZfUkVTX1JFQURfQUxMIHwKKwkJCXN0LT5jdHJsX2hiKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogU2V0IHJlZ2lzdGVyIGFkZHJlc3Mgb24gdGhlIHBhcnQgdG8gYmUgcmVhZCBmcm9tICovCisJcmV0ID0gYWQ3MjgwX3dyaXRlKHN0LCBkZXZhZGRyLCBBRDcyODBBX1JFQUQsIDAsIGFkZHIgPDwgMik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCV9fYWQ3MjgwX3JlYWQzMihzdC0+c3BpLCAmdG1wKTsKKworCWlmIChhZDcyODBfY2hlY2tfY3JjKHN0LCB0bXApKQorCQlyZXR1cm4gLUVJTzsKKworCWlmICgoKHRtcCA+PiAyNykgIT0gZGV2YWRkcikgfHwgKCgodG1wID4+IDIxKSAmIDB4M0YpICE9IGFkZHIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAodG1wID4+IDEzKSAmIDB4RkY7Cit9CisKK3N0YXRpYyBpbnQgYWQ3MjgwX3JlYWRfY2hhbm5lbChzdHJ1Y3QgYWQ3MjgwX3N0YXRlICpzdCwgdW5zaWduZWQgZGV2YWRkciwKKwkJCSAgICAgICB1bnNpZ25lZCBhZGRyKQoreworCWludCByZXQ7CisJdW5zaWduZWQgdG1wOworCisJcmV0ID0gYWQ3MjgwX3dyaXRlKHN0LCBkZXZhZGRyLCBBRDcyODBBX1JFQUQsIDAsIGFkZHIgPDwgMik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGFkNzI4MF93cml0ZShzdCwgQUQ3MjgwQV9ERVZBRERSX01BU1RFUiwgQUQ3MjgwQV9DT05UUk9MX0hCLCAxLAorCQkJQUQ3MjgwQV9DVFJMX0hCX0NPTlZfSU5QVVRfQUxMIHwKKwkJCUFENzI4MEFfQ1RSTF9IQl9DT05WX1JFU19SRUFEX05PIHwKKwkJCXN0LT5jdHJsX2hiKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYWQ3MjgwX3dyaXRlKHN0LCBkZXZhZGRyLCBBRDcyODBBX0NPTlRST0xfSEIsIDAsCisJCQlBRDcyODBBX0NUUkxfSEJfQ09OVl9JTlBVVF9BTEwgfAorCQkJQUQ3MjgwQV9DVFJMX0hCX0NPTlZfUkVTX1JFQURfQUxMIHwKKwkJCUFENzI4MEFfQ1RSTF9IQl9DT05WX1NUQVJUX0NTIHwKKwkJCXN0LT5jdHJsX2hiKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJYWQ3MjgwX2RlbGF5KHN0KTsKKworCV9fYWQ3MjgwX3JlYWQzMihzdC0+c3BpLCAmdG1wKTsKKworCWlmIChhZDcyODBfY2hlY2tfY3JjKHN0LCB0bXApKQorCQlyZXR1cm4gLUVJTzsKKworCWlmICgoKHRtcCA+PiAyNykgIT0gZGV2YWRkcikgfHwgKCgodG1wID4+IDIzKSAmIDB4RikgIT0gYWRkcikpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuICh0bXAgPj4gMTEpICYgMHhGRkY7Cit9CisKK3N0YXRpYyBpbnQgYWQ3MjgwX3JlYWRfYWxsX2NoYW5uZWxzKHN0cnVjdCBhZDcyODBfc3RhdGUgKnN0LCB1bnNpZ25lZCBjbnQsCisJCQkgICAgIHVuc2lnbmVkICphcnJheSkKK3sKKwlpbnQgaSwgcmV0OworCXVuc2lnbmVkIHRtcCwgc3VtID0gMDsKKworCXJldCA9IGFkNzI4MF93cml0ZShzdCwgQUQ3MjgwQV9ERVZBRERSX01BU1RFUiwgQUQ3MjgwQV9SRUFELCAxLAorCQkJICAgQUQ3MjgwQV9DRUxMX1ZPTFRBR0VfMSA8PCAyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYWQ3MjgwX3dyaXRlKHN0LCBBRDcyODBBX0RFVkFERFJfTUFTVEVSLCBBRDcyODBBX0NPTlRST0xfSEIsIDEsCisJCQlBRDcyODBBX0NUUkxfSEJfQ09OVl9JTlBVVF9BTEwgfAorCQkJQUQ3MjgwQV9DVFJMX0hCX0NPTlZfUkVTX1JFQURfQUxMIHwKKwkJCUFENzI4MEFfQ1RSTF9IQl9DT05WX1NUQVJUX0NTIHwKKwkJCXN0LT5jdHJsX2hiKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJYWQ3MjgwX2RlbGF5KHN0KTsKKworCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworCQlfX2FkNzI4MF9yZWFkMzIoc3QtPnNwaSwgJnRtcCk7CisKKwkJaWYgKGFkNzI4MF9jaGVja19jcmMoc3QsIHRtcCkpCisJCQlyZXR1cm4gLUVJTzsKKworCQlpZiAoYXJyYXkpCisJCQlhcnJheVtpXSA9IHRtcDsKKwkJLyogb25seSBzdW0gY2VsbCB2b2x0YWdlcyAqLworCQlpZiAoKCh0bXAgPj4gMjMpICYgMHhGKSA8PSBBRDcyODBBX0NFTExfVk9MVEFHRV82KQorCQkJc3VtICs9ICgodG1wID4+IDExKSAmIDB4RkZGKTsKKwl9CisKKwlyZXR1cm4gc3VtOworfQorCitzdGF0aWMgaW50IGFkNzI4MF9jaGFpbl9zZXR1cChzdHJ1Y3QgYWQ3MjgwX3N0YXRlICpzdCkKK3sKKwl1bnNpZ25lZCB2YWwsIG47CisJaW50IHJldDsKKworCXJldCA9IGFkNzI4MF93cml0ZShzdCwgQUQ3MjgwQV9ERVZBRERSX01BU1RFUiwgQUQ3MjgwQV9DT05UUk9MX0xCLCAxLAorCQkJQUQ3MjgwQV9DVFJMX0xCX0RBSVNZX0NIQUlOX1JCX0VOIHwKKwkJCUFENzI4MEFfQ1RSTF9MQl9MT0NLX0RFVl9BRERSIHwKKwkJCUFENzI4MEFfQ1RSTF9MQl9NVVNUX1NFVCB8CisJCQlBRDcyODBBX0NUUkxfTEJfU1dSU1QgfAorCQkJc3QtPmN0cmxfbGIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhZDcyODBfd3JpdGUoc3QsIEFENzI4MEFfREVWQUREUl9NQVNURVIsIEFENzI4MEFfQ09OVFJPTF9MQiwgMSwKKwkJCUFENzI4MEFfQ1RSTF9MQl9EQUlTWV9DSEFJTl9SQl9FTiB8CisJCQlBRDcyODBBX0NUUkxfTEJfTE9DS19ERVZfQUREUiB8CisJCQlBRDcyODBBX0NUUkxfTEJfTVVTVF9TRVQgfAorCQkJc3QtPmN0cmxfbGIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhZDcyODBfd3JpdGUoc3QsIEFENzI4MEFfREVWQUREUl9NQVNURVIsIEFENzI4MEFfUkVBRCwgMSwKKwkJCUFENzI4MEFfQ09OVFJPTF9MQiA8PCAyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChuID0gMDsgbiA8PSBBRDcyODBBX01BWF9DSEFJTjsgbisrKSB7CisJCV9fYWQ3MjgwX3JlYWQzMihzdC0+c3BpLCAmdmFsKTsKKwkJaWYgKHZhbCA9PSAwKQorCQkJcmV0dXJuIG4gLSAxOworCisJCWlmIChhZDcyODBfY2hlY2tfY3JjKHN0LCB2YWwpKQorCQkJcmV0dXJuIC1FSU87CisKKwkJaWYgKG4gIT0gQUQ3MjgwQV9ERVZBRERSKHZhbCA+PiAyNykpCisJCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MjgwX3Nob3dfYmFsYW5jZV9zdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyODBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKKwkJICAgICAgICEhKHN0LT5jYl9tYXNrW3RoaXNfYXR0ci0+YWRkcmVzcyA+PiA4XSAmCisJCSAgICAgICAoMSA8PCAoKHRoaXNfYXR0ci0+YWRkcmVzcyAmIDB4RkYpICsgMikpKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI4MF9zdG9yZV9iYWxhbmNlX3N3KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgY29uc3QgY2hhciAqYnVmLAorCQkJCQkgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI4MF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlib29sIHJlYWRpbjsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGRldmFkZHIsIGNoOworCisJcmV0ID0gc3RydG9ib29sKGJ1ZiwgJnJlYWRpbik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWRldmFkZHIgPSB0aGlzX2F0dHItPmFkZHJlc3MgPj4gODsKKwljaCA9IHRoaXNfYXR0ci0+YWRkcmVzcyAmIDB4RkY7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlpZiAocmVhZGluKQorCQlzdC0+Y2JfbWFza1tkZXZhZGRyXSB8PSAxIDw8IChjaCArIDIpOworCWVsc2UKKwkJc3QtPmNiX21hc2tbZGV2YWRkcl0gJj0gfigxIDw8IChjaCArIDIpKTsKKworCXJldCA9IGFkNzI4MF93cml0ZShzdCwgZGV2YWRkciwgQUQ3MjgwQV9DRUxMX0JBTEFOQ0UsCisJCQkgICAwLCBzdC0+Y2JfbWFza1tkZXZhZGRyXSk7CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI4MF9zaG93X2JhbGFuY2VfdGltZXIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjgwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCWludCByZXQ7CisJdW5zaWduZWQgbXNlY3M7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlyZXQgPSBhZDcyODBfcmVhZChzdCwgdGhpc19hdHRyLT5hZGRyZXNzID4+IDgsCisJCQl0aGlzX2F0dHItPmFkZHJlc3MgJiAweEZGKTsKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwltc2VjcyA9IChyZXQgPj4gMykgKiA3MTUwMDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBtc2Vjcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI4MF9zdG9yZV9iYWxhbmNlX3RpbWVyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgY29uc3QgY2hhciAqYnVmLAorCQkJCQkgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzI4MF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlsb25nIHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXZhbCAvPSA3MTUwMDsKKworCWlmICh2YWwgPiAzMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlyZXQgPSBhZDcyODBfd3JpdGUoc3QsIHRoaXNfYXR0ci0+YWRkcmVzcyA+PiA4LAorCQkJICAgdGhpc19hdHRyLT5hZGRyZXNzICYgMHhGRiwKKwkJCSAgIDAsICh2YWwgJiAweDFGKSA8PCAzKTsKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNzI4MF9hdHRyaWJ1dGVzW0FENzI4MEFfTUFYX0NIQUlOICoKKwkJCQkJICAgQUQ3MjgwQV9DRUxMU19QRVJfREVWICogMiArIDFdOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDcyODBfYXR0cnNfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWQ3MjgwX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IGFkNzI4MF9jaGFubmVsX2luaXQoc3RydWN0IGFkNzI4MF9zdGF0ZSAqc3QpCit7CisJaW50IGRldiwgY2gsIGNudDsKKworCXN0LT5jaGFubmVscyA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+Y2hhbm5lbHMpICoKKwkJCQkoKHN0LT5zbGF2ZV9udW0gKyAxKSAqIDEyICsgMiksIEdGUF9LRVJORUwpOworCWlmIChzdC0+Y2hhbm5lbHMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGRldiA9IDAsIGNudCA9IDA7IGRldiA8PSBzdC0+c2xhdmVfbnVtOyBkZXYrKykKKwkJZm9yIChjaCA9IEFENzI4MEFfQ0VMTF9WT0xUQUdFXzE7IGNoIDw9IEFENzI4MEFfQVVYX0FEQ182OyBjaCsrLAorCQkJY250KyspIHsKKwkJCWlmIChjaCA8IEFENzI4MEFfQVVYX0FEQ18xKSB7CisJCQkJc3QtPmNoYW5uZWxzW2NudF0udHlwZSA9IElJT19WT0xUQUdFOworCQkJCXN0LT5jaGFubmVsc1tjbnRdLmRpZmZlcmVudGlhbCA9IDE7CisJCQkJc3QtPmNoYW5uZWxzW2NudF0uY2hhbm5lbCA9IChkZXYgKiA2KSArIGNoOworCQkJCXN0LT5jaGFubmVsc1tjbnRdLmNoYW5uZWwyID0KKwkJCQkJc3QtPmNoYW5uZWxzW2NudF0uY2hhbm5lbCArIDE7CisJCQl9IGVsc2UgeworCQkJCXN0LT5jaGFubmVsc1tjbnRdLnR5cGUgPSBJSU9fVEVNUDsKKwkJCQlzdC0+Y2hhbm5lbHNbY250XS5jaGFubmVsID0gKGRldiAqIDYpICsgY2ggLSA2OworCQkJfQorCQkJc3QtPmNoYW5uZWxzW2NudF0uaW5kZXhlZCA9IDE7CisJCQlzdC0+Y2hhbm5lbHNbY250XS5pbmZvX21hc2sgPQorCQkJCSgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKTsKKwkJCXN0LT5jaGFubmVsc1tjbnRdLmFkZHJlc3MgPQorCQkJCUFENzI4MEFfREVWQUREUihkZXYpIDw8IDggfCBjaDsKKwkJCXN0LT5jaGFubmVsc1tjbnRdLnNjYW5faW5kZXggPSBjbnQ7CisJCQlzdC0+Y2hhbm5lbHNbY250XS5zY2FuX3R5cGUuc2lnbiA9ICd1JzsKKwkJCXN0LT5jaGFubmVsc1tjbnRdLnNjYW5fdHlwZS5yZWFsYml0cyA9IDEyOworCQkJc3QtPmNoYW5uZWxzW2NudF0uc2Nhbl90eXBlLnN0b3JhZ2ViaXRzID0gMzI7CisJCQlzdC0+Y2hhbm5lbHNbY250XS5zY2FuX3R5cGUuc2hpZnQgPSAwOworCQl9CisKKwlzdC0+Y2hhbm5lbHNbY250XS50eXBlID0gSUlPX1ZPTFRBR0U7CisJc3QtPmNoYW5uZWxzW2NudF0uZGlmZmVyZW50aWFsID0gMTsKKwlzdC0+Y2hhbm5lbHNbY250XS5jaGFubmVsID0gMDsKKwlzdC0+Y2hhbm5lbHNbY250XS5jaGFubmVsMiA9IGRldiAqIDY7CisJc3QtPmNoYW5uZWxzW2NudF0uYWRkcmVzcyA9IEFENzI4MEFfQUxMX0NFTExTOworCXN0LT5jaGFubmVsc1tjbnRdLmluZGV4ZWQgPSAxOworCXN0LT5jaGFubmVsc1tjbnRdLmluZm9fbWFzayA9ICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKTsKKwlzdC0+Y2hhbm5lbHNbY250XS5zY2FuX2luZGV4ID0gY250OworCXN0LT5jaGFubmVsc1tjbnRdLnNjYW5fdHlwZS5zaWduID0gJ3UnOworCXN0LT5jaGFubmVsc1tjbnRdLnNjYW5fdHlwZS5yZWFsYml0cyA9IDMyOworCXN0LT5jaGFubmVsc1tjbnRdLnNjYW5fdHlwZS5zdG9yYWdlYml0cyA9IDMyOworCXN0LT5jaGFubmVsc1tjbnRdLnNjYW5fdHlwZS5zaGlmdCA9IDA7CisJY250Kys7CisJc3QtPmNoYW5uZWxzW2NudF0udHlwZSA9IElJT19USU1FU1RBTVA7CisJc3QtPmNoYW5uZWxzW2NudF0uY2hhbm5lbCA9IC0xOworCXN0LT5jaGFubmVsc1tjbnRdLnNjYW5faW5kZXggPSBjbnQ7CisJc3QtPmNoYW5uZWxzW2NudF0uc2Nhbl90eXBlLnNpZ24gPSAncyc7CisJc3QtPmNoYW5uZWxzW2NudF0uc2Nhbl90eXBlLnJlYWxiaXRzID0gNjQ7CisJc3QtPmNoYW5uZWxzW2NudF0uc2Nhbl90eXBlLnN0b3JhZ2ViaXRzID0gNjQ7CisJc3QtPmNoYW5uZWxzW2NudF0uc2Nhbl90eXBlLnNoaWZ0ID0gMDsKKworCXJldHVybiBjbnQgKyAxOworfQorCitzdGF0aWMgaW50IGFkNzI4MF9hdHRyX2luaXQoc3RydWN0IGFkNzI4MF9zdGF0ZSAqc3QpCit7CisJaW50IGRldiwgY2gsIGNudDsKKworCXN0LT5paW9fYXR0ciA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+aWlvX2F0dHIpICogKHN0LT5zbGF2ZV9udW0gKyAxKSAqCisJCQkJQUQ3MjgwQV9DRUxMU19QRVJfREVWICogMiwgR0ZQX0tFUk5FTCk7CisJaWYgKHN0LT5paW9fYXR0ciA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoZGV2ID0gMCwgY250ID0gMDsgZGV2IDw9IHN0LT5zbGF2ZV9udW07IGRldisrKQorCQlmb3IgKGNoID0gQUQ3MjgwQV9DRUxMX1ZPTFRBR0VfMTsgY2ggPD0gQUQ3MjgwQV9DRUxMX1ZPTFRBR0VfNjsKKwkJCWNoKyssIGNudCsrKSB7CisJCQlzdC0+aWlvX2F0dHJbY250XS5hZGRyZXNzID0KKwkJCQlBRDcyODBBX0RFVkFERFIoZGV2KSA8PCA4IHwgY2g7CisJCQlzdC0+aWlvX2F0dHJbY250XS5kZXZfYXR0ci5hdHRyLm1vZGUgPQorCQkJCVNfSVdVU1IgfCBTX0lSVUdPOworCQkJc3QtPmlpb19hdHRyW2NudF0uZGV2X2F0dHIuc2hvdyA9CisJCQkJYWQ3MjgwX3Nob3dfYmFsYW5jZV9zdzsKKwkJCXN0LT5paW9fYXR0cltjbnRdLmRldl9hdHRyLnN0b3JlID0KKwkJCQlhZDcyODBfc3RvcmVfYmFsYW5jZV9zdzsKKwkJCXN0LT5paW9fYXR0cltjbnRdLmRldl9hdHRyLmF0dHIubmFtZSA9CisJCQkJa2FzcHJpbnRmKEdGUF9LRVJORUwsCisJCQkJCSJpbiVkLWluJWRfYmFsYW5jZV9zd2l0Y2hfZW4iLAorCQkJCQkoZGV2ICogQUQ3MjgwQV9DRUxMU19QRVJfREVWKSArIGNoLAorCQkJCQkoZGV2ICogQUQ3MjgwQV9DRUxMU19QRVJfREVWKSArIGNoICsgMSk7CisJCQlhZDcyODBfYXR0cmlidXRlc1tjbnRdID0KKwkJCQkmc3QtPmlpb19hdHRyW2NudF0uZGV2X2F0dHIuYXR0cjsKKwkJCWNudCsrOworCQkJc3QtPmlpb19hdHRyW2NudF0uYWRkcmVzcyA9CisJCQkJQUQ3MjgwQV9ERVZBRERSKGRldikgPDwgOCB8CisJCQkJKEFENzI4MEFfQ0IxX1RJTUVSICsgY2gpOworCQkJc3QtPmlpb19hdHRyW2NudF0uZGV2X2F0dHIuYXR0ci5tb2RlID0KKwkJCQlTX0lXVVNSIHwgU19JUlVHTzsKKwkJCXN0LT5paW9fYXR0cltjbnRdLmRldl9hdHRyLnNob3cgPQorCQkJCWFkNzI4MF9zaG93X2JhbGFuY2VfdGltZXI7CisJCQlzdC0+aWlvX2F0dHJbY250XS5kZXZfYXR0ci5zdG9yZSA9CisJCQkJYWQ3MjgwX3N0b3JlX2JhbGFuY2VfdGltZXI7CisJCQlzdC0+aWlvX2F0dHJbY250XS5kZXZfYXR0ci5hdHRyLm5hbWUgPQorCQkJCWthc3ByaW50ZihHRlBfS0VSTkVMLCAiaW4lZC1pbiVkX2JhbGFuY2VfdGltZXIiLAorCQkJCQkoZGV2ICogQUQ3MjgwQV9DRUxMU19QRVJfREVWKSArIGNoLAorCQkJCQkoZGV2ICogQUQ3MjgwQV9DRUxMU19QRVJfREVWKSArIGNoICsgMSk7CisJCQlhZDcyODBfYXR0cmlidXRlc1tjbnRdID0KKwkJCQkmc3QtPmlpb19hdHRyW2NudF0uZGV2X2F0dHIuYXR0cjsKKwkJfQorCisJYWQ3MjgwX2F0dHJpYnV0ZXNbY250XSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MjgwX3JlYWRfY2hhbm5lbF9jb25maWcoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjgwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCXVuc2lnbmVkIHZhbDsKKworCXN3aXRjaCAodGhpc19hdHRyLT5hZGRyZXNzKSB7CisJY2FzZSBBRDcyODBBX0NFTExfT1ZFUlZPTFRBR0U6CisJCXZhbCA9IDEwMDAgKyAoc3QtPmNlbGxfdGhyZXNoaGlnaCAqIDE1NjgpIC8gMTAwOworCQlicmVhazsKKwljYXNlIEFENzI4MEFfQ0VMTF9VTkRFUlZPTFRBR0U6CisJCXZhbCA9IDEwMDAgKyAoc3QtPmNlbGxfdGhyZXNobG93ICogMTU2OCkgLyAxMDA7CisJCWJyZWFrOworCWNhc2UgQUQ3MjgwQV9BVVhfQURDX09WRVJWT0xUQUdFOgorCQl2YWwgPSAoc3QtPmF1eF90aHJlc2hoaWdoICogMTk2KSAvIDEwOworCQlicmVhazsKKwljYXNlIEFENzI4MEFfQVVYX0FEQ19VTkRFUlZPTFRBR0U6CisJCXZhbCA9IChzdC0+YXV4X3RocmVzaGxvdyAqIDE5NikgLyAxMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzI4MF93cml0ZV9jaGFubmVsX2NvbmZpZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyODBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlsb25nIHZhbDsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc3dpdGNoICh0aGlzX2F0dHItPmFkZHJlc3MpIHsKKwljYXNlIEFENzI4MEFfQ0VMTF9PVkVSVk9MVEFHRToKKwljYXNlIEFENzI4MEFfQ0VMTF9VTkRFUlZPTFRBR0U6CisJCXZhbCA9ICgodmFsIC0gMTAwMCkgKiAxMDApIC8gMTU2ODsgLyogTFNCIDE1LjY4bVYgKi8KKwkJYnJlYWs7CisJY2FzZSBBRDcyODBBX0FVWF9BRENfT1ZFUlZPTFRBR0U6CisJY2FzZSBBRDcyODBBX0FVWF9BRENfVU5ERVJWT0xUQUdFOgorCQl2YWwgPSAodmFsICogMTApIC8gMTk2OyAvKiBMU0IgMTkuNm1WICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCXZhbCA9IGNsYW1wKHZhbCwgMEwsIDB4RkZMKTsKKworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCXN3aXRjaCAodGhpc19hdHRyLT5hZGRyZXNzKSB7CisJY2FzZSBBRDcyODBBX0NFTExfT1ZFUlZPTFRBR0U6CisJCXN0LT5jZWxsX3RocmVzaGhpZ2ggPSB2YWw7CisJCWJyZWFrOworCWNhc2UgQUQ3MjgwQV9DRUxMX1VOREVSVk9MVEFHRToKKwkJc3QtPmNlbGxfdGhyZXNobG93ID0gdmFsOworCQlicmVhazsKKwljYXNlIEFENzI4MEFfQVVYX0FEQ19PVkVSVk9MVEFHRToKKwkJc3QtPmF1eF90aHJlc2hoaWdoID0gdmFsOworCQlicmVhazsKKwljYXNlIEFENzI4MEFfQVVYX0FEQ19VTkRFUlZPTFRBR0U6CisJCXN0LT5hdXhfdGhyZXNobG93ID0gdmFsOworCQlicmVhazsKKwl9CisKKwlyZXQgPSBhZDcyODBfd3JpdGUoc3QsIEFENzI4MEFfREVWQUREUl9NQVNURVIsCisJCQkgICB0aGlzX2F0dHItPmFkZHJlc3MsIDEsIHZhbCk7CisKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIGlycXJldHVybl90IGFkNzI4MF9ldmVudF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHByaXZhdGU7CisJc3RydWN0IGFkNzI4MF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXVuc2lnbmVkICpjaGFubmVsczsKKwlpbnQgaSwgcmV0OworCisJY2hhbm5lbHMgPSBremFsbG9jKHNpemVvZigqY2hhbm5lbHMpICogc3QtPnNjYW5fY250LCBHRlBfS0VSTkVMKTsKKwlpZiAoY2hhbm5lbHMgPT0gTlVMTCkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJcmV0ID0gYWQ3MjgwX3JlYWRfYWxsX2NoYW5uZWxzKHN0LCBzdC0+c2Nhbl9jbnQsIGNoYW5uZWxzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJZm9yIChpID0gMDsgaSA8IHN0LT5zY2FuX2NudDsgaSsrKSB7CisJCWlmICgoKGNoYW5uZWxzW2ldID4+IDIzKSAmIDB4RikgPD0gQUQ3MjgwQV9DRUxMX1ZPTFRBR0VfNikgeworCQkJaWYgKCgoY2hhbm5lbHNbaV0gPj4gMTEpICYgMHhGRkYpID49CisJCQkJc3QtPmNlbGxfdGhyZXNoaGlnaCkKKwkJCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsCisJCQkJCUlJT19FVkVOVF9DT0RFKElJT19WT0xUQUdFLAorCQkJCQkJICAgICAgIDEsCisJCQkJCQkgICAgICAgMCwKKwkJCQkJCSAgICAgICBJSU9fRVZfRElSX1JJU0lORywKKwkJCQkJCSAgICAgICBJSU9fRVZfVFlQRV9USFJFU0gsCisJCQkJCQkgICAgICAgMCwgMCwgMCksCisJCQkJCWlpb19nZXRfdGltZV9ucygpKTsKKwkJCWVsc2UgaWYgKCgoY2hhbm5lbHNbaV0gPj4gMTEpICYgMHhGRkYpIDw9CisJCQkJc3QtPmNlbGxfdGhyZXNobG93KQorCQkJCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwKKwkJCQkJSUlPX0VWRU5UX0NPREUoSUlPX1ZPTFRBR0UsCisJCQkJCQkgICAgICAgMSwKKwkJCQkJCSAgICAgICAwLAorCQkJCQkJICAgICAgIElJT19FVl9ESVJfRkFMTElORywKKwkJCQkJCSAgICAgICBJSU9fRVZfVFlQRV9USFJFU0gsCisJCQkJCQkgICAgICAgMCwgMCwgMCksCisJCQkJCWlpb19nZXRfdGltZV9ucygpKTsKKwkJfSBlbHNlIHsKKwkJCWlmICgoKGNoYW5uZWxzW2ldID4+IDExKSAmIDB4RkZGKSA+PSBzdC0+YXV4X3RocmVzaGhpZ2gpCisJCQkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LAorCQkJCQlJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fVEVNUCwKKwkJCQkJMCwKKwkJCQkJSUlPX0VWX1RZUEVfVEhSRVNILAorCQkJCQlJSU9fRVZfRElSX1JJU0lORyksCisJCQkJCWlpb19nZXRfdGltZV9ucygpKTsKKwkJCWVsc2UgaWYgKCgoY2hhbm5lbHNbaV0gPj4gMTEpICYgMHhGRkYpIDw9CisJCQkJc3QtPmF1eF90aHJlc2hsb3cpCisJCQkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LAorCQkJCQlJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fVEVNUCwKKwkJCQkJMCwKKwkJCQkJSUlPX0VWX1RZUEVfVEhSRVNILAorCQkJCQlJSU9fRVZfRElSX0ZBTExJTkcpLAorCQkJCQlpaW9fZ2V0X3RpbWVfbnMoKSk7CisJCX0KKwl9CisKKwlrZnJlZShjaGFubmVscyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFJfTkFNRUQoaW5fdGhyZXNoX2xvd192YWx1ZSwKKwkJaW5fdm9sdGFnZS12b2x0YWdlX3RocmVzaF9sb3dfdmFsdWUsCisJCVNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcyODBfcmVhZF9jaGFubmVsX2NvbmZpZywKKwkJYWQ3MjgwX3dyaXRlX2NoYW5uZWxfY29uZmlnLAorCQlBRDcyODBBX0NFTExfVU5ERVJWT0xUQUdFKTsKKworc3RhdGljIElJT19ERVZJQ0VfQVRUUl9OQU1FRChpbl90aHJlc2hfaGlnaF92YWx1ZSwKKwkJaW5fdm9sdGFnZS12b2x0YWdlX3RocmVzaF9oaWdoX3ZhbHVlLAorCQlTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3MjgwX3JlYWRfY2hhbm5lbF9jb25maWcsCisJCWFkNzI4MF93cml0ZV9jaGFubmVsX2NvbmZpZywKKwkJQUQ3MjgwQV9DRUxMX09WRVJWT0xUQUdFKTsKKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihpbl90ZW1wX3RocmVzaF9sb3dfdmFsdWUsCisJCVNfSVJVR08gfCBTX0lXVVNSLAorCQlhZDcyODBfcmVhZF9jaGFubmVsX2NvbmZpZywKKwkJYWQ3MjgwX3dyaXRlX2NoYW5uZWxfY29uZmlnLAorCQlBRDcyODBBX0FVWF9BRENfVU5ERVJWT0xUQUdFKTsKKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihpbl90ZW1wX3RocmVzaF9oaWdoX3ZhbHVlLAorCQlTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3MjgwX3JlYWRfY2hhbm5lbF9jb25maWcsCisJCWFkNzI4MF93cml0ZV9jaGFubmVsX2NvbmZpZywKKwkJQUQ3MjgwQV9BVVhfQURDX09WRVJWT0xUQUdFKTsKKworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3MjgwX2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2luX3RocmVzaF9sb3dfdmFsdWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX3RocmVzaF9oaWdoX3ZhbHVlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbl90ZW1wX3RocmVzaF9sb3dfdmFsdWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX3RlbXBfdGhyZXNoX2hpZ2hfdmFsdWUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWQ3MjgwX2V2ZW50X2F0dHJzX2dyb3VwID0geworCS5hdHRycyA9IGFkNzI4MF9ldmVudF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBhZDcyODBfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCSAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgaW50ICp2YWwsCisJCQkgICBpbnQgKnZhbDIsCisJCQkgICBsb25nIG0pCit7CisJc3RydWN0IGFkNzI4MF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXVuc2lnbmVkIGludCBzY2FsZV91djsKKwlpbnQgcmV0OworCisJc3dpdGNoIChtKSB7CisJY2FzZSAwOgorCQltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwkJaWYgKGNoYW4tPmFkZHJlc3MgPT0gQUQ3MjgwQV9BTExfQ0VMTFMpCisJCQlyZXQgPSBhZDcyODBfcmVhZF9hbGxfY2hhbm5lbHMoc3QsIHN0LT5zY2FuX2NudCwgTlVMTCk7CisJCWVsc2UKKwkJCXJldCA9IGFkNzI4MF9yZWFkX2NoYW5uZWwoc3QsIGNoYW4tPmFkZHJlc3MgPj4gOCwKKwkJCQkJCSAgY2hhbi0+YWRkcmVzcyAmIDB4RkYpOworCQltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQkqdmFsID0gcmV0OworCisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwljYXNlICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKToKKwkJaWYgKChjaGFuLT5hZGRyZXNzICYgMHhGRikgPD0gQUQ3MjgwQV9DRUxMX1ZPTFRBR0VfNikKKwkJCXNjYWxlX3V2ID0gKDQwMDAgKiAxMDAwKSA+PiBBRDcyODBBX0JJVFM7CisJCWVsc2UKKwkJCXNjYWxlX3V2ID0gKDUwMDAgKiAxMDAwKSA+PiBBRDcyODBBX0JJVFM7CisKKwkJKnZhbCA9ICBzY2FsZV91diAvIDEwMDA7CisJCSp2YWwyID0gKHNjYWxlX3V2ICUgMTAwMCkgKiAxMDAwOworCQlyZXR1cm4gSUlPX1ZBTF9JTlRfUExVU19NSUNSTzsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gYWQ3MjgwX2luZm8gPSB7CisJLnJlYWRfcmF3ID0gJmFkNzI4MF9yZWFkX3JhdywKKwkuZXZlbnRfYXR0cnMgPSAmYWQ3MjgwX2V2ZW50X2F0dHJzX2dyb3VwLAorCS5hdHRycyA9ICZhZDcyODBfYXR0cnNfZ3JvdXAsCisJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWQ3MjgwX3BsYXRmb3JtX2RhdGEgYWQ3NzkzX2RlZmF1bHRfcGRhdGEgPSB7CisJLmFjcXVpc2l0aW9uX3RpbWUgPSBBRDcyODBBX0FDUV9USU1FXzQwMG5zLAorCS5jb252ZXJzaW9uX2F2ZXJhZ2luZyA9IEFENzI4MEFfQ09OVl9BVkdfRElTLAorCS50aGVybWlzdG9yX3Rlcm1fZW4gPSB0cnVlLAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYWQ3MjgwX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJY29uc3Qgc3RydWN0IGFkNzI4MF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHNwaS0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGFkNzI4MF9zdGF0ZSAqc3Q7CisJaW50IHJldDsKKwljb25zdCB1bnNpZ25lZCBzaG9ydCB0QUNRX25zWzRdID0gezQ2NSwgMTAxMCwgMTQ2MCwgMTg5MH07CisJY29uc3QgdW5zaWduZWQgc2hvcnQgbkFWR1s0XSA9IHsxLCAyLCA0LCA4fTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZShzaXplb2YoKnN0KSk7CisKKwlpZiAoaW5kaW9fZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIGluZGlvX2Rldik7CisJc3QtPnNwaSA9IHNwaTsKKworCWlmICghcGRhdGEpCisJCXBkYXRhID0gJmFkNzc5M19kZWZhdWx0X3BkYXRhOworCisJYWQ3MjgwX2NyYzhfYnVpbGRfdGFibGUoc3QtPmNyY190YWIpOworCisJc3QtPnNwaS0+bWF4X3NwZWVkX2h6ID0gQUQ3MjgwQV9NQVhfU1BJX0NMS19IejsKKwlzdC0+c3BpLT5tb2RlID0gU1BJX01PREVfMTsKKwlzcGlfc2V0dXAoc3QtPnNwaSk7CisKKwlzdC0+Y3RybF9sYiA9IEFENzI4MEFfQ1RSTF9MQl9BQ1FfVElNRShwZGF0YS0+YWNxdWlzaXRpb25fdGltZSAmIDB4Myk7CisJc3QtPmN0cmxfaGIgPSBBRDcyODBBX0NUUkxfSEJfQ09OVl9BVkcocGRhdGEtPmNvbnZlcnNpb25fYXZlcmFnaW5nCisJCQkmIDB4MykgfCAocGRhdGEtPnRoZXJtaXN0b3JfdGVybV9lbiA/CisJCQlBRDcyODBBX0NUUkxfTEJfVEhFUk1JU1RPUl9FTiA6IDApOworCisJcmV0ID0gYWQ3MjgwX2NoYWluX3NldHVwKHN0KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9mcmVlX2RldmljZTsKKworCXN0LT5zbGF2ZV9udW0gPSByZXQ7CisJc3QtPnNjYW5fY250ID0gKHN0LT5zbGF2ZV9udW0gKyAxKSAqIEFENzI4MEFfTlVNX0NIOworCXN0LT5jZWxsX3RocmVzaGhpZ2ggPSAweEZGOworCXN0LT5hdXhfdGhyZXNoaGlnaCA9IDB4RkY7CisKKwkvKgorCSAqIFRvdGFsIENvbnZlcnNpb24gVGltZSA9ICgodEFDUSArIHRDT05WKSAqCisJICoJCQkgICAoTnVtYmVyIG9mIENvbnZlcnNpb25zIHBlciBQYXJ0KSkg4oiSCisJICoJCQkgICB0QUNRICsgKChOIC0gMSkgKiB0REVMQVkpCisJICoKKwkgKiBSZWFkYmFjayBEZWxheSA9IFRvdGFsIENvbnZlcnNpb24gVGltZSArIHRXQUlUCisJICovCisKKwlzdC0+cmVhZGJhY2tfZGVsYXlfdXMgPQorCQkoKHRBQ1FfbnNbcGRhdGEtPmFjcXVpc2l0aW9uX3RpbWUgJiAweDNdICsgNjk1KSAqCisJCShBRDcyODBBX05VTV9DSCAqIG5BVkdbcGRhdGEtPmNvbnZlcnNpb25fYXZlcmFnaW5nICYgMHgzXSkpCisJCS0gdEFDUV9uc1twZGF0YS0+YWNxdWlzaXRpb25fdGltZSAmIDB4M10gKworCQlzdC0+c2xhdmVfbnVtICogMjUwOworCisJLyogQ29udmVydCB0byB1c2VjcyAqLworCXN0LT5yZWFkYmFja19kZWxheV91cyA9IERJVl9ST1VORF9VUChzdC0+cmVhZGJhY2tfZGVsYXlfdXMsIDEwMDApOworCXN0LT5yZWFkYmFja19kZWxheV91cyArPSA1OyAvKiBBZGQgdFdBSVQgKi8KKworCWluZGlvX2Rldi0+bmFtZSA9IHNwaV9nZXRfZGV2aWNlX2lkKHNwaSktPm5hbWU7CisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGFkNzI4MF9jaGFubmVsX2luaXQoc3QpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2aWNlOworCisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSByZXQ7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IHN0LT5jaGFubmVsczsKKwlpbmRpb19kZXYtPmluZm8gPSAmYWQ3MjgwX2luZm87CisKKwlyZXQgPSBhZDcyODBfYXR0cl9pbml0KHN0KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9mcmVlX2NoYW5uZWxzOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9hdHRyOworCisJaWYgKHNwaS0+aXJxID4gMCkgeworCQlyZXQgPSBhZDcyODBfd3JpdGUoc3QsIEFENzI4MEFfREVWQUREUl9NQVNURVIsCisJCQkJICAgQUQ3MjgwQV9BTEVSVCwgMSwKKwkJCQkgICBBRDcyODBBX0FMRVJUX1JFTEFZX1NJR19DSEFJTl9ET1dOKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3JfdW5yZWdpc3RlcjsKKworCQlyZXQgPSBhZDcyODBfd3JpdGUoc3QsIEFENzI4MEFfREVWQUREUihzdC0+c2xhdmVfbnVtKSwKKwkJCQkgICBBRDcyODBBX0FMRVJULCAwLAorCQkJCSAgIEFENzI4MEFfQUxFUlRfR0VOX1NUQVRJQ19ISUdIIHwKKwkJCQkgICAocGRhdGEtPmNoYWluX2xhc3RfYWxlcnRfaWdub3JlICYgMHhGKSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3VucmVnaXN0ZXI7CisKKwkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoc3BpLT5pcnEsCisJCQkJCSAgIE5VTEwsCisJCQkJCSAgIGFkNzI4MF9ldmVudF9oYW5kbGVyLAorCQkJCQkgICBJUlFGX1RSSUdHRVJfRkFMTElORyB8CisJCQkJCSAgIElSUUZfT05FU0hPVCwKKwkJCQkJICAgaW5kaW9fZGV2LT5uYW1lLAorCQkJCQkgICBpbmRpb19kZXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl91bnJlZ2lzdGVyOworCX0KKworCXJldHVybiAwOworZXJyb3JfdW5yZWdpc3RlcjoKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKworZXJyb3JfZnJlZV9hdHRyOgorCWtmcmVlKHN0LT5paW9fYXR0cik7CisKK2Vycm9yX2ZyZWVfY2hhbm5lbHM6CisJa2ZyZWUoc3QtPmNoYW5uZWxzKTsKKworZXJyb3JfZnJlZV9kZXZpY2U6CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDcyODBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBhZDcyODBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCWlmIChzcGktPmlycSA+IDApCisJCWZyZWVfaXJxKHNwaS0+aXJxLCBpbmRpb19kZXYpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCisJYWQ3MjgwX3dyaXRlKHN0LCBBRDcyODBBX0RFVkFERFJfTUFTVEVSLCBBRDcyODBBX0NPTlRST0xfSEIsIDEsCisJCQlBRDcyODBBX0NUUkxfSEJfUFdSRE5fU1cgfCBzdC0+Y3RybF9oYik7CisKKwlrZnJlZShzdC0+Y2hhbm5lbHMpOworCWtmcmVlKHN0LT5paW9fYXR0cik7CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGFkNzI4MF9pZFtdID0geworCXsiYWQ3MjgwYSIsIDB9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQ3MjgwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJhZDcyODAiLAorCQkuYnVzCT0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJCT0gYWQ3MjgwX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWQ3MjgwX3JlbW92ZSksCisJLmlkX3RhYmxlCT0gYWQ3MjgwX2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWQ3MjgwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWQ3MjgwX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZDcyODBfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZDcyODBfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWQ3MjgwX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZDcyODBfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1pY2hhZWwgSGVubmVyaWNoIDxoZW5uZXJpY2hAYmxhY2tmaW4udWNsaW51eC5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFENzI4MEEiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzI4MGEuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzI4MGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDQwMGIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MjgwYS5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBBRDcyODBBIExpdGhpdW0gSW9uIEJhdHRlcnkgTW9uaXRvcmluZyBTeXN0ZW0KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yLgorICovCisKKyNpZm5kZWYgSUlPX0FEQ19BRDcyODBfSF8KKyNkZWZpbmUgSUlPX0FEQ19BRDcyODBfSF8KKworLyoKKyAqIFRPRE86IHN0cnVjdCBhZDcyODBfcGxhdGZvcm1fZGF0YSBuZWVkcyB0byBnbyBpbnRvIGluY2x1ZGUvbGludXgvaWlvCisgKi8KKworI2RlZmluZSBBRDcyODBBX0FDUV9USU1FXzQwMG5zCQkJMAorI2RlZmluZSBBRDcyODBBX0FDUV9USU1FXzgwMG5zCQkJMQorI2RlZmluZSBBRDcyODBBX0FDUV9USU1FXzEyMDBucwkJCTIKKyNkZWZpbmUgQUQ3MjgwQV9BQ1FfVElNRV8xNjAwbnMJCQkzCisKKyNkZWZpbmUgQUQ3MjgwQV9DT05WX0FWR19ESVMJCQkwCisjZGVmaW5lIEFENzI4MEFfQ09OVl9BVkdfMgkJCTEKKyNkZWZpbmUgQUQ3MjgwQV9DT05WX0FWR180CQkJMgorI2RlZmluZSBBRDcyODBBX0NPTlZfQVZHXzgJCQkzCisKKyNkZWZpbmUgQUQ3MjgwQV9BTEVSVF9SRU1PVkVfVklONQkJKDEgPDwgMikKKyNkZWZpbmUgQUQ3MjgwQV9BTEVSVF9SRU1PVkVfVklONF9WSU41CQkoMiA8PCAyKQorI2RlZmluZSBBRDcyODBBX0FMRVJUX1JFTU9WRV9BVVg1CQkoMSA8PCAwKQorI2RlZmluZSBBRDcyODBBX0FMRVJUX1JFTU9WRV9BVVg0X0FVWDUJCSgyIDw8IDApCisKK3N0cnVjdCBhZDcyODBfcGxhdGZvcm1fZGF0YSB7CisJdW5zaWduZWQgYWNxdWlzaXRpb25fdGltZTsKKwl1bnNpZ25lZCBjb252ZXJzaW9uX2F2ZXJhZ2luZzsKKwl1bnNpZ25lZCBjaGFpbl9sYXN0X2FsZXJ0X2lnbm9yZTsKKwlib29sIHRoZXJtaXN0b3JfdGVybV9lbjsKK307CisKKyNlbmRpZiAvKiBJSU9fQURDX0FENzI4MF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MjkxLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcyOTEuYwppbmRleCA5NmNiYjE3Li4xMGU3OWU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcyOTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcyOTEuYwpAQCAtMSw4MyArMSwxMTAgQEAKIC8qCi0gKiBBRDcyOTEgZGlnaXRhbCB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIHN1cHBvcnRpbmcgQUQ3MjkxCisgKiBBRDcyOTEgOC1DaGFubmVsLCBJMkMsIDEyLUJpdCBTQVIgQURDIHdpdGggVGVtcGVyYXR1cmUgU2Vuc29yCiAgKgotICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICogQ29weXJpZ2h0IDIwMTAtMjAxMSBBbmFsb2cgRGV2aWNlcyBJbmMuCiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi9zeXNmcy5oIgogCiAvKgorICogU2ltcGxpZmllZCBoYW5kbGluZworICoKKyAqIElmIG5vIGV2ZW50cyBlbmFibGVkIC0gc2luZ2xlIHBvbGxlZCBjaGFubmVsIHJlYWQKKyAqIElmIGV2ZW50IGVuYWJsZWQgZGlyZWN0IHJlYWRzIGRpc2FibGUgdW5sZXNzIGNoYW5uZWwKKyAqIGlzIGluIHRoZSByZWFkIG1hc2suCisgKgorICogVGhlIG5vaXNlLWRlbGF5ZWQgYml0IGFzIHBlciBkYXRhc2hlZXQgc3VnZ2VzdGlvbiBpcyBhbHdheXMgZW5hYmxlZC4KKyAqCisgKi8KKworLyoKICAqIEFENzI5MSByZWdpc3RlcnMgZGVmaW5pdGlvbgogICovCi0jZGVmaW5lIEFENzI5MV9DT01NQU5ECQkJMAotI2RlZmluZSBBRDcyOTFfVk9MVEFHRQkJCTEKLSNkZWZpbmUgQUQ3MjkxX1RfU0VOU0UJCQkyCi0jZGVmaW5lIEFENzI5MV9UX0FWRVJBR0UJCTMKLSNkZWZpbmUgQUQ3MjkxX1ZPTFRBR0VfTElNSVRfQkFTRQk0Ci0jZGVmaW5lIEFENzI5MV9WT0xUQUdFX0xJTUlUX0NPVU5UCTgKLSNkZWZpbmUgQUQ3MjkxX1RfU0VOU0VfSElHSAkJMHgxYwotI2RlZmluZSBBRDcyOTFfVF9TRU5TRV9MT1cJCTB4MWQKLSNkZWZpbmUgQUQ3MjkxX1RfU0VOU0VfSFlTVAkJMHgxZQotI2RlZmluZSBBRDcyOTFfVk9MVEFHRV9BTEVSVF9TVEFUVVMJMHgxZgorI2RlZmluZSBBRDcyOTFfQ09NTUFORAkJCTB4MDAKKyNkZWZpbmUgQUQ3MjkxX1ZPTFRBR0UJCQkweDAxCisjZGVmaW5lIEFENzI5MV9UX1NFTlNFCQkJMHgwMgorI2RlZmluZSBBRDcyOTFfVF9BVkVSQUdFCQkweDAzCisjZGVmaW5lIEFENzI5MV9DSDBfREFUQV9ISUdICQkweDA0CisjZGVmaW5lIEFENzI5MV9DSDBfREFUQV9MT1cJCTB4MDUKKyNkZWZpbmUgQUQ3MjkxX0NIMF9IWVNUCQkJMHgwNgorI2RlZmluZSBBRDcyOTFfQ0gxX0RBVEFfSElHSAkJMHgwNworI2RlZmluZSBBRDcyOTFfQ0gxX0RBVEFfTE9XCQkweDA4CisjZGVmaW5lIEFENzI5MV9DSDFfSFlTVAkJCTB4MDkKKyNkZWZpbmUgQUQ3MjkxX0NIMl9EQVRBX0hJR0gJCTB4MEEKKyNkZWZpbmUgQUQ3MjkxX0NIMl9EQVRBX0xPVwkJMHgwQgorI2RlZmluZSBBRDcyOTFfQ0gyX0hZU1QJCQkweDBDCisjZGVmaW5lIEFENzI5MV9DSDNfREFUQV9ISUdICQkweDBECisjZGVmaW5lIEFENzI5MV9DSDNfREFUQV9MT1cJCTB4MEUKKyNkZWZpbmUgQUQ3MjkxX0NIM19IWVNUCQkJMHgwRgorI2RlZmluZSBBRDcyOTFfQ0g0X0RBVEFfSElHSAkJMHgxMAorI2RlZmluZSBBRDcyOTFfQ0g0X0RBVEFfTE9XCQkweDExCisjZGVmaW5lIEFENzI5MV9DSDRfSFlTVAkJCTB4MTIKKyNkZWZpbmUgQUQ3MjkxX0NINV9EQVRBX0hJR0gJCTB4MTMKKyNkZWZpbmUgQUQ3MjkxX0NINV9EQVRBX0xPVwkJMHgxNAorI2RlZmluZSBBRDcyOTFfQ0g1X0hZU1QJCQkweDE1CisjZGVmaW5lIEFENzI5MV9DSDZfREFUQV9ISUdICQkweDE2CisjZGVmaW5lIEFENzI5MV9DSDZfREFUQV9MT1cJCTB4MTcKKyNkZWZpbmUgQUQ3MjkxX0NINl9IWVNUCQkJMHgxOAorI2RlZmluZSBBRDcyOTFfQ0g3X0RBVEFfSElHSAkJMHgxOQorI2RlZmluZSBBRDcyOTFfQ0g3X0RBVEFfTE9XCQkweDFBCisjZGVmaW5lIEFENzI5MV9DSDdfSFlTVAkJCTB4MkIKKyNkZWZpbmUgQUQ3MjkxX1RfU0VOU0VfSElHSAkJMHgxQworI2RlZmluZSBBRDcyOTFfVF9TRU5TRV9MT1cJCTB4MUQKKyNkZWZpbmUgQUQ3MjkxX1RfU0VOU0VfSFlTVAkJMHgxRQorI2RlZmluZSBBRDcyOTFfVk9MVEFHRV9BTEVSVF9TVEFUVVMJMHgxRgogI2RlZmluZSBBRDcyOTFfVF9BTEVSVF9TVEFUVVMJCTB4MjAKIAorI2RlZmluZSBBRDcyOTFfVk9MVEFHRV9MSU1JVF9DT1VOVAk4CisKKwogLyoKICAqIEFENzI5MSBjb21tYW5kCiAgKi8KLSNkZWZpbmUgQUQ3MjkxX0FVVE9DWUNMRQkJMHgxCi0jZGVmaW5lIEFENzI5MV9SRVNFVAkJCTB4MgotI2RlZmluZSBBRDcyOTFfQUxBUlRfQ0xFQVIJCTB4NAotI2RlZmluZSBBRDcyOTFfQUxBUlRfUE9MQVJJVFkJCTB4OAotI2RlZmluZSBBRDcyOTFfRVhUX1JFRgkJCTB4MTAKLSNkZWZpbmUgQUQ3MjkxX05PSVNFX0RFTEFZCQkweDIwCi0jZGVmaW5lIEFENzI5MV9UX1NFTlNFX01BU0sJCTB4NDAKLSNkZWZpbmUgQUQ3MjkxX1ZPTFRBR0VfTUFTSwkJMHhmZjAwCisjZGVmaW5lIEFENzI5MV9BVVRPQ1lDTEUJCSgxIDw8IDApCisjZGVmaW5lIEFENzI5MV9SRVNFVAkJCSgxIDw8IDEpCisjZGVmaW5lIEFENzI5MV9BTEVSVF9DTEVBUgkJKDEgPDwgMikKKyNkZWZpbmUgQUQ3MjkxX0FMRVJUX1BPTEFSSVRZCQkoMSA8PCAzKQorI2RlZmluZSBBRDcyOTFfRVhUX1JFRgkJCSgxIDw8IDQpCisjZGVmaW5lIEFENzI5MV9OT0lTRV9ERUxBWQkJKDEgPDwgNSkKKyNkZWZpbmUgQUQ3MjkxX1RfU0VOU0VfTUFTSwkJKDEgPDwgNykKKyNkZWZpbmUgQUQ3MjkxX1ZPTFRBR0VfTUFTSwkJMHhGRjAwCiAjZGVmaW5lIEFENzI5MV9WT0xUQUdFX09GRlNFVAkJMHg4CiAKIC8qCiAgKiBBRDcyOTEgdmFsdWUgbWFza3MKICAqLwotI2RlZmluZSBBRDcyOTFfQ0hBTk5FTF9NQVNLCQkweGYwMDAKLSNkZWZpbmUgQUQ3MjkxX1ZBTFVFX01BU0sJCTB4ZmZmCisjZGVmaW5lIEFENzI5MV9DSEFOTkVMX01BU0sJCTB4RjAwMAorI2RlZmluZSBBRDcyOTFfQklUUwkJCTEyCisjZGVmaW5lIEFENzI5MV9WQUxVRV9NQVNLCQkweEZGRgogI2RlZmluZSBBRDcyOTFfVF9WQUxVRV9TSUdOCQkweDQwMAogI2RlZmluZSBBRDcyOTFfVF9WQUxVRV9GTE9BVF9PRkZTRVQJMgogI2RlZmluZSBBRDcyOTFfVF9WQUxVRV9GTE9BVF9NQVNLCTB4MgogCi0vKgotICogc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmMgaW5mb3JtYXRpb24KLSAqLworI2RlZmluZSBBRDcyOTFfQklUUwkJCTEyCiAKIHN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwotCXUxNiBjb21tYW5kOwotCXU4ICBjaGFubmVsczsJLyogQWN0aXZlIHZvbHRhZ2UgY2hhbm5lbHMgKi8KKwlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OworCXN0cnVjdCByZWd1bGF0b3IJKnJlZzsKKwl1MTYJCQlpbnRfdnJlZl9tdjsKKwl1MTYJCQljb21tYW5kOworCXUxNgkJCWNfbWFzazsJLyogQWN0aXZlIHZvbHRhZ2UgY2hhbm5lbHMgZm9yIGV2ZW50cyAqLworCXN0cnVjdCBtdXRleAkJc3RhdGVfbG9jazsKIH07CiAKLS8qCi0gKiBzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAtIGNoaXAgc3BlY2lmYyBpbmZvcm1hdGlvbgotICovCi0KLXN0cnVjdCBhZDcyOTFfbGltaXRfcmVncyB7Ci0JdTE2CWRhdGFfaGlnaDsKLQl1MTYJZGF0YV9sb3c7Ci0JdTE2CWh5c3RlcmVzaXM7Ci19OwotCi0vKgotICogYWQ3MjkxIHJlZ2lzdGVyIGFjY2VzcyBieSBJMkMKLSAqLwogc3RhdGljIGludCBhZDcyOTFfaTJjX3JlYWQoc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTE2ICpkYXRhKQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7CkBAIC05NiwzNTIgKzEyMywyNSBAQAogCiBzdGF0aWMgaW50IGFkNzI5MV9pMmNfd3JpdGUoc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAsIHU4IHJlZywgdTE2IGRhdGEpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKLQlpbnQgcmV0ID0gMDsKLQotCXJldCA9IGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCByZWcsIHN3YWIxNihkYXRhKSk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSTJDIHdyaXRlIGVycm9yXG4iKTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2hpcC0+Y2xpZW50LCByZWcsIHN3YWIxNihkYXRhKSk7CiB9CiAKLS8qIFJldHVybnMgbmVnYXRpdmUgZXJybm8sIG9yIGVsc2UgdGhlIG51bWJlciBvZiB3b3JkcyByZWFkLiAqLwotc3RhdGljIGludCBhZDcyOTFfaTJjX3JlYWRfZGF0YShzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCwgdTggcmVnLCB1MTYgKmRhdGEpCi17Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKLQl1OCBjb21tYW5kc1s0XTsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgaSwgY291bnQ7Ci0KLQlpZiAocmVnID09IEFENzI5MV9UX1NFTlNFIHx8IHJlZyA9PSBBRDcyOTFfVF9BVkVSQUdFKQotCQljb3VudCA9IDI7Ci0JZWxzZSBpZiAocmVnID09IEFENzI5MV9WT0xUQUdFKSB7Ci0JCWlmICghY2hpcC0+Y2hhbm5lbHMpIHsKLQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiTm8gdm9sdGFnZSBjaGFubmVsIGlzIHNlbGVjdGVkLlxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQljb3VudCA9IDIgKyBjaGlwLT5jaGFubmVscyAqIDI7Ci0JfSBlbHNlIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgd3JvbmcgZGF0YSByZWdpc3RlclxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNvbW1hbmRzWzBdID0gMDsKLQljb21tYW5kc1sxXSA9IChjaGlwLT5jb21tYW5kID4+IDgpICYgMHhmZjsKLQljb21tYW5kc1syXSA9IGNoaXAtPmNvbW1hbmQgJiAweGZmOwotCWNvbW1hbmRzWzNdID0gcmVnOwotCi0JcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgY29tbWFuZHMsIDQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSTJDIG1hc3RlciBzZW5kIGVycm9yXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCAodTggKilkYXRhLCBjb3VudCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgbWFzdGVyIHJlY2VpdmUgZXJyb3JcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXQgPj49IDI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmV0OyBpKyspCi0JCWRhdGFbaV0gPSBzd2FiMTYoZGF0YVtpXSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCBhZDcyOTFfc2hvd19tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQotCWlmIChjaGlwLT5jb21tYW5kICYgQUQ3MjkxX0FVVE9DWUNMRSkKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiYXV0b2N5Y2xlXG4iKTsKLQllbHNlCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgImNvbW1hbmRcbiIpOwotfQotCi1zdGF0aWMgc3NpemVfdCBhZDcyOTFfc3RvcmVfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljb25zdCBjaGFyICpidWYsCi0JCXNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0JdTE2IGNvbW1hbmQ7Ci0JaW50IHJldDsKLQotCWNvbW1hbmQgPSBjaGlwLT5jb21tYW5kICYgKH5BRDcyOTFfQVVUT0NZQ0xFKTsKLQlpZiAoc3RyY21wKGJ1ZiwgImF1dG9jeWNsZSIpKQotCQljb21tYW5kIHw9IEFENzI5MV9BVVRPQ1lDTEU7Ci0KLQlyZXQgPSBhZDcyOTFfaTJjX3dyaXRlKGNoaXAsIEFENzI5MV9DT01NQU5ELCBjb21tYW5kKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gLUVJTzsKLQotCWNoaXAtPmNvbW1hbmQgPSBjb21tYW5kOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIElJT19ERVZJQ0VfQVRUUihtb2RlLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJYWQ3MjkxX3Nob3dfbW9kZSwKLQkJYWQ3MjkxX3N0b3JlX21vZGUsCi0JCTApOwotCi1zdGF0aWMgc3NpemVfdCBhZDcyOTFfc2hvd19hdmFpbGFibGVfbW9kZXMoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQotewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgImNvbW1hbmRcbmF1dG9jeWNsZVxuIik7Ci19Ci0KLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIoYXZhaWxhYmxlX21vZGVzLCBTX0lSVUdPLCBhZDcyOTFfc2hvd19hdmFpbGFibGVfbW9kZXMsIE5VTEwsIDApOwotCiBzdGF0aWMgc3NpemVfdCBhZDcyOTFfc3RvcmVfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJY29uc3QgY2hhciAqYnVmLAogCQlzaXplX3QgbGVuKQogewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCXUxNiBjb21tYW5kOwotCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAotCWNvbW1hbmQgPSBjaGlwLT5jb21tYW5kIHwgQUQ3MjkxX1JFU0VUOwotCi0JcmV0ID0gYWQ3MjkxX2kyY193cml0ZShjaGlwLCBBRDcyOTFfQ09NTUFORCwgY29tbWFuZCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiBhZDcyOTFfaTJjX3dyaXRlKGNoaXAsIEFENzI5MV9DT01NQU5ELAorCQkJCWNoaXAtPmNvbW1hbmQgfCBBRDcyOTFfUkVTRVQpOwogfQogCi1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKHJlc2V0LCBTX0lXVVNSLAotCQlOVUxMLAotCQlhZDcyOTFfc3RvcmVfcmVzZXQsCi0JCTApOwotCi1zdGF0aWMgc3NpemVfdCBhZDcyOTFfc2hvd19leHRfcmVmKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAhIShjaGlwLT5jb21tYW5kICYgQUQ3MjkxX0VYVF9SRUYpKTsKLX0KLQotc3RhdGljIHNzaXplX3QgYWQ3MjkxX3N0b3JlX2V4dF9yZWYoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgbGVuKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCXUxNiBjb21tYW5kOwotCWludCByZXQ7Ci0KLQljb21tYW5kID0gY2hpcC0+Y29tbWFuZCAmICh+QUQ3MjkxX0VYVF9SRUYpOwotCWlmIChzdHJjbXAoYnVmLCAiMSIpKQotCQljb21tYW5kIHw9IEFENzI5MV9FWFRfUkVGOwotCi0JcmV0ID0gYWQ3MjkxX2kyY193cml0ZShjaGlwLCBBRDcyOTFfQ09NTUFORCwgY29tbWFuZCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIC1FSU87Ci0KLQljaGlwLT5jb21tYW5kID0gY29tbWFuZDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIoZXh0X3JlZiwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCWFkNzI5MV9zaG93X2V4dF9yZWYsCi0JCWFkNzI5MV9zdG9yZV9leHRfcmVmLAotCQkwKTsKLQotc3RhdGljIHNzaXplX3QgYWQ3MjkxX3Nob3dfbm9pc2VfZGVsYXkoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICEhKGNoaXAtPmNvbW1hbmQgJiBBRDcyOTFfTk9JU0VfREVMQVkpKTsKLX0KLQotc3RhdGljIHNzaXplX3QgYWQ3MjkxX3N0b3JlX25vaXNlX2RlbGF5KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQl1MTYgY29tbWFuZDsKLQlpbnQgcmV0OwotCi0JY29tbWFuZCA9IGNoaXAtPmNvbW1hbmQgJiAofkFENzI5MV9OT0lTRV9ERUxBWSk7Ci0JaWYgKHN0cmNtcChidWYsICIxIikpCi0JCWNvbW1hbmQgfD0gQUQ3MjkxX05PSVNFX0RFTEFZOwotCi0JcmV0ID0gYWQ3MjkxX2kyY193cml0ZShjaGlwLCBBRDcyOTFfQ09NTUFORCwgY29tbWFuZCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIC1FSU87Ci0KLQljaGlwLT5jb21tYW5kID0gY29tbWFuZDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIobm9pc2VfZGVsYXksIFNfSVJVR08gfCBTX0lXVVNSLAotCQlhZDcyOTFfc2hvd19ub2lzZV9kZWxheSwKLQkJYWQ3MjkxX3N0b3JlX25vaXNlX2RlbGF5LAotCQkwKTsKLQotc3RhdGljIHNzaXplX3QgYWQ3MjkxX3Nob3dfdF9zZW5zZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0JdTE2IGRhdGE7Ci0JY2hhciBzaWduID0gJyAnOwotCWludCByZXQ7Ci0KLQlyZXQgPSBhZDcyOTFfaTJjX3JlYWRfZGF0YShjaGlwLCBBRDcyOTFfVF9TRU5TRSwgJmRhdGEpOwotCWlmIChyZXQpCi0JCXJldHVybiAtRUlPOwotCi0JaWYgKGRhdGEgJiBBRDcyOTFfVF9WQUxVRV9TSUdOKSB7Ci0JCS8qIGNvbnZlcnQgc3VwcGxlbWVudCB0byBwb3NpdGl2ZSB2YWx1ZSAqLwotCQlkYXRhID0gKEFENzI5MV9UX1ZBTFVFX1NJR04gPDwgMSkgLSBkYXRhOwotCQlzaWduID0gJy0nOwotCX0KLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjJWQuJS4yZFxuIiwgc2lnbiwKLQkJKGRhdGEgPj4gQUQ3MjkxX1RfVkFMVUVfRkxPQVRfT0ZGU0VUKSwKLQkJKGRhdGEgJiBBRDcyOTFfVF9WQUxVRV9GTE9BVF9NQVNLKSAqIDI1KTsKLX0KLQotc3RhdGljIElJT19ERVZJQ0VfQVRUUih0X3NlbnNlLCBTX0lSVUdPLCBhZDcyOTFfc2hvd190X3NlbnNlLCBOVUxMLCAwKTsKLQotc3RhdGljIHNzaXplX3QgYWQ3MjkxX3Nob3dfdF9hdmVyYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQl1MTYgZGF0YTsKLQljaGFyIHNpZ24gPSAnICc7Ci0JaW50IHJldDsKLQotCXJldCA9IGFkNzI5MV9pMmNfcmVhZF9kYXRhKGNoaXAsIEFENzI5MV9UX0FWRVJBR0UsICZkYXRhKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gLUVJTzsKLQotCWlmIChkYXRhICYgQUQ3MjkxX1RfVkFMVUVfU0lHTikgewotCQkvKiBjb252ZXJ0IHN1cHBsZW1lbnQgdG8gcG9zaXRpdmUgdmFsdWUgKi8KLQkJZGF0YSA9IChBRDcyOTFfVF9WQUxVRV9TSUdOIDw8IDEpIC0gZGF0YTsKLQkJc2lnbiA9ICctJzsKLQl9Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlYyVkLiUuMmRcbiIsIHNpZ24sCi0JCShkYXRhID4+IEFENzI5MV9UX1ZBTFVFX0ZMT0FUX09GRlNFVCksCi0JCShkYXRhICYgQUQ3MjkxX1RfVkFMVUVfRkxPQVRfTUFTSykgKiAyNSk7Ci19Ci0KLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIodF9hdmVyYWdlLCBTX0lSVUdPLCBhZDcyOTFfc2hvd190X2F2ZXJhZ2UsIE5VTEwsIDApOwotCi1zdGF0aWMgc3NpemVfdCBhZDcyOTFfc2hvd192b2x0YWdlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQl1MTYgZGF0YVtBRDcyOTFfVk9MVEFHRV9MSU1JVF9DT1VOVF07Ci0JaW50IGksIHNpemUsIHJldDsKLQotCXJldCA9IGFkNzI5MV9pMmNfcmVhZF9kYXRhKGNoaXAsIEFENzI5MV9WT0xUQUdFLCBkYXRhKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gLUVJTzsKLQotCWZvciAoaSA9IDA7IGkgPCBBRDcyOTFfVk9MVEFHRV9MSU1JVF9DT1VOVDsgaSsrKSB7Ci0JCWlmIChjaGlwLT5jb21tYW5kICYgKEFENzI5MV9UX1NFTlNFX01BU0sgPDwgaSkpIHsKLQkJCXJldCA9IHNwcmludGYoYnVmLCAiY2hhbm5lbFslZF09JWRcbiIsIGksCi0JCQkJCWRhdGFbaV0gJiBBRDcyOTFfVkFMVUVfTUFTSyk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlicmVhazsKLQkJCWJ1ZiArPSByZXQ7Ci0JCQlzaXplICs9IHJldDsKLQkJfQotCX0KLQotCXJldHVybiBzaXplOwotfQotCi1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKHZvbHRhZ2UsIFNfSVJVR08sIGFkNzI5MV9zaG93X3ZvbHRhZ2UsIE5VTEwsIDApOwotCi1zdGF0aWMgc3NpemVfdCBhZDcyOTFfc2hvd19jaGFubmVsX21hc2soc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiMHgleFxuIiwgKGNoaXAtPmNvbW1hbmQgJiBBRDcyOTFfVk9MVEFHRV9NQVNLKSA+PgotCQkJQUQ3MjkxX1ZPTFRBR0VfT0ZGU0VUKTsKLX0KLQotc3RhdGljIHNzaXplX3QgYWQ3MjkxX3N0b3JlX2NoYW5uZWxfbWFzayhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljb25zdCBjaGFyICpidWYsCi0JCXNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0JdTE2IGNvbW1hbmQ7Ci0JdW5zaWduZWQgbG9uZyBkYXRhOwotCWludCBpLCByZXQ7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDE2LCAmZGF0YSk7Ci0JaWYgKHJldCB8fCBkYXRhID4gMHhmZikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljb21tYW5kID0gY2hpcC0+Y29tbWFuZCAmICh+QUQ3MjkxX1ZPTFRBR0VfTUFTSyk7Ci0JY29tbWFuZCB8PSBkYXRhIDw8IEFENzI5MV9WT0xUQUdFX09GRlNFVDsKLQotCXJldCA9IGFkNzI5MV9pMmNfd3JpdGUoY2hpcCwgQUQ3MjkxX0NPTU1BTkQsIGNvbW1hbmQpOwotCWlmIChyZXQpCi0JCXJldHVybiAtRUlPOwotCi0JY2hpcC0+Y29tbWFuZCA9IGNvbW1hbmQ7Ci0KLQlmb3IgKGkgPSAwLCBjaGlwLT5jaGFubmVscyA9IDA7IGkgPCBBRDcyOTFfVk9MVEFHRV9MSU1JVF9DT1VOVDsgaSsrKSB7Ci0JCWlmIChjaGlwLT5jb21tYW5kICYgKEFENzI5MV9UX1NFTlNFX01BU0sgPDwgaSkpCi0JCQljaGlwLT5jaGFubmVscysrOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIoY2hhbm5lbF9tYXNrLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJYWQ3MjkxX3Nob3dfY2hhbm5lbF9tYXNrLAotCQlhZDcyOTFfc3RvcmVfY2hhbm5lbF9tYXNrLAotCQkwKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIocmVzZXQsIFNfSVdVU1IsIE5VTEwsIGFkNzI5MV9zdG9yZV9yZXNldCwgMCk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDcyOTFfYXR0cmlidXRlc1tdID0gewotCSZpaW9fZGV2X2F0dHJfYXZhaWxhYmxlX21vZGVzLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9tb2RlLmRldl9hdHRyLmF0dHIsCiAJJmlpb19kZXZfYXR0cl9yZXNldC5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfZXh0X3JlZi5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfbm9pc2VfZGVsYXkuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX3Rfc2Vuc2UuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX3RfYXZlcmFnZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfdm9sdGFnZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfY2hhbm5lbF9tYXNrLmRldl9hdHRyLmF0dHIsCiAJTlVMTCwKIH07CiAKQEAgLTQ0OSwxMCArMTQ5LDYgQEAKIAkuYXR0cnMgPSBhZDcyOTFfYXR0cmlidXRlcywKIH07CiAKLS8qCi0gKiB0ZW1wZXJhdHVyZSBib3VuZCBldmVudHMKLSAqLwotCiBzdGF0aWMgaXJxcmV0dXJuX3QgYWQ3MjkxX2V2ZW50X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqcHJpdmF0ZSkKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcHJpdmF0ZTsKQEAgLTQ3MSwzNSArMTY3LDIyIEBACiAJaWYgKCEodF9zdGF0dXMgfHwgdl9zdGF0dXMpKQogCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAKLQljb21tYW5kID0gY2hpcC0+Y29tbWFuZCB8IEFENzI5MV9BTEFSVF9DTEVBUjsKKwljb21tYW5kID0gY2hpcC0+Y29tbWFuZCB8IEFENzI5MV9BTEVSVF9DTEVBUjsKIAlhZDcyOTFfaTJjX3dyaXRlKGNoaXAsIEFENzI5MV9DT01NQU5ELCBjb21tYW5kKTsKIAotCWNvbW1hbmQgPSBjaGlwLT5jb21tYW5kICYgfkFENzI5MV9BTEFSVF9DTEVBUjsKKwljb21tYW5kID0gY2hpcC0+Y29tbWFuZCAmIH5BRDcyOTFfQUxFUlRfQ0xFQVI7CiAJYWQ3MjkxX2kyY193cml0ZShjaGlwLCBBRDcyOTFfQ09NTUFORCwgY29tbWFuZCk7CiAKLQlpZiAodF9zdGF0dXMgJiAoMSA8PCAwKSkKLQkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LCAwLAorCS8qIEZvciBub3cgdHJlYXQgdF9zZW5zZSBhbmQgdF9zZW5zZV9hdmVyYWdlIHRoZSBzYW1lICovCisJaWYgKCh0X3N0YXR1cyAmICgxIDw8IDApKSB8fCAodF9zdGF0dXMgJiAoMSA8PCAyKSkpCisJCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwKIAkJCSAgICAgICBJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fVEVNUCwKIAkJCQkJCSAgICAwLAogCQkJCQkJICAgIElJT19FVl9UWVBFX1RIUkVTSCwKIAkJCQkJCSAgICBJSU9fRVZfRElSX0ZBTExJTkcpLAogCQkJICAgICAgIHRpbWVzdGFtcCk7Ci0JaWYgKHRfc3RhdHVzICYgKDEgPDwgMSkpCi0JCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwgMCwKLQkJCSAgICAgICBJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fVEVNUCwKLQkJCQkJCSAgICAwLAotCQkJCQkJICAgIElJT19FVl9UWVBFX1RIUkVTSCwKLQkJCQkJCSAgICBJSU9fRVZfRElSX1JJU0lORyksCi0JCQkgICAgICAgdGltZXN0YW1wKTsKLQlpZiAodF9zdGF0dXMgJiAoMSA8PCAyKSkKLQkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LCAwLAotCQkJICAgICAgIElJT19VTk1PRF9FVkVOVF9DT0RFKElJT19URU1QLAotCQkJCQkJICAgIDAsCi0JCQkJCQkgICAgSUlPX0VWX1RZUEVfVEhSRVNILAotCQkJCQkJICAgIElJT19FVl9ESVJfRkFMTElORyksCi0JCQkgICAgICAgdGltZXN0YW1wKTsKLQlpZiAodF9zdGF0dXMgJiAoMSA8PCAzKSkKLQkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LCAwLAorCWlmICgodF9zdGF0dXMgJiAoMSA8PCAxKSkgfHwgKHRfc3RhdHVzICYgKDEgPDwgMykpKQorCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsCiAJCQkgICAgICAgSUlPX1VOTU9EX0VWRU5UX0NPREUoSUlPX1RFTVAsCiAJCQkJCQkgICAgMCwKIAkJCQkJCSAgICBJSU9fRVZfVFlQRV9USFJFU0gsCkBAIC01MDgsMTUgKzE5MSwxNSBAQAogCiAJZm9yIChpID0gMDsgaSA8IEFENzI5MV9WT0xUQUdFX0xJTUlUX0NPVU5UKjI7IGkgKz0gMikgewogCQlpZiAodl9zdGF0dXMgJiAoMSA8PCBpKSkKLQkJCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwgMCwKLQkJCQkgICAgICAgSUlPX1VOTU9EX0VWRU5UX0NPREUoSUlPX0lOLAorCQkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LAorCQkJCSAgICAgICBJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fVk9MVEFHRSwKIAkJCQkJCQkgICAgaS8yLAogCQkJCQkJCSAgICBJSU9fRVZfVFlQRV9USFJFU0gsCiAJCQkJCQkJICAgIElJT19FVl9ESVJfRkFMTElORyksCiAJCQkJICAgICAgIHRpbWVzdGFtcCk7CiAJCWlmICh2X3N0YXR1cyAmICgxIDw8IChpICsgMSkpKQotCQkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LCAwLAotCQkJCSAgICAgICBJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fSU4sCisJCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsCisJCQkJICAgICAgIElJT19VTk1PRF9FVkVOVF9DT0RFKElJT19WT0xUQUdFLAogCQkJCQkJCSAgICBpLzIsCiAJCQkJCQkJICAgIElJT19FVl9UWVBFX1RIUkVTSCwKIAkJCQkJCQkgICAgSUlPX0VWX0RJUl9SSVNJTkcpLApAQCAtNTI2LDI3MyArMjA5LDM3NCBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGlubGluZSBzc2l6ZV90IGFkNzI5MV9zaG93X3RfYm91bmQoc3RydWN0IGRldmljZSAqZGV2LAorc3RhdGljIGlubGluZSBzc2l6ZV90IGFkNzI5MV9zaG93X2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJY2hhciAqYnVmKQogewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOwogCXUxNiBkYXRhOwotCWNoYXIgc2lnbiA9ICcgJzsKIAlpbnQgcmV0OwogCiAJcmV0ID0gYWQ3MjkxX2kyY19yZWFkKGNoaXAsIHRoaXNfYXR0ci0+YWRkcmVzcywgJmRhdGEpOwotCWlmIChyZXQpCi0JCXJldHVybiAtRUlPOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCi0JZGF0YSAmPSBBRDcyOTFfVkFMVUVfTUFTSzsKLQlpZiAoZGF0YSAmIEFENzI5MV9UX1ZBTFVFX1NJR04pIHsKLQkJLyogY29udmVydCBzdXBwbGVtZW50IHRvIHBvc2l0aXZlIHZhbHVlICovCi0JCWRhdGEgPSAoQUQ3MjkxX1RfVkFMVUVfU0lHTiA8PCAxKSAtIGRhdGE7Ci0JCXNpZ24gPSAnLSc7Ci0JfQotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWMlZC4lLjJkXG4iLCBzaWduLAotCQkJZGF0YSA+PiBBRDcyOTFfVF9WQUxVRV9GTE9BVF9PRkZTRVQsCi0JCQkoZGF0YSAmIEFENzI5MV9UX1ZBTFVFX0ZMT0FUX01BU0spICogMjUpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBkYXRhICYgQUQ3MjkxX1ZBTFVFX01BU0spOwogfQogCi1zdGF0aWMgaW5saW5lIHNzaXplX3QgYWQ3MjkxX3NldF90X2JvdW5kKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGxlbikKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZDcyOTFfc2V0X2h5c3Qoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgICAgICBzaXplX3QgbGVuKQogewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOwotCWxvbmcgdG1wMSwgdG1wMjsKIAl1MTYgZGF0YTsKLQljaGFyICpwb3M7CiAJaW50IHJldDsKIAotCXBvcyA9IHN0cmNocihidWYsICcuJyk7CisJcmV0ID0ga3N0cnRvdTE2KGJ1ZiwgMTAsICZkYXRhKTsKIAotCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnRtcDEpOwotCi0JaWYgKHJldCB8fCB0bXAxID4gMTI3IHx8IHRtcDEgPCAtMTI4KQorCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWlmIChkYXRhID4gQUQ3MjkxX1ZBTFVFX01BU0spCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHBvcykgewotCQlsZW4gPSBzdHJsZW4ocG9zKTsKLQkJaWYgKGxlbiA+IEFENzI5MV9UX1ZBTFVFX0ZMT0FUX09GRlNFVCkKLQkJCWxlbiA9IEFENzI5MV9UX1ZBTFVFX0ZMT0FUX09GRlNFVDsKLQkJcG9zW2xlbl0gPSAwOwotCQlyZXQgPSBzdHJpY3Rfc3RydG9sKHBvcywgMTAsICZ0bXAyKTsKLQotCQlpZiAoIXJldCkKLQkJCXRtcDIgPSAodG1wMiAvIDI1KSAqIDI1OwotCX0KLQotCWlmICh0bXAxIDwgMCkKLQkJZGF0YSA9ICh1MTYpKC10bXAxKTsKLQllbHNlCi0JCWRhdGEgPSAodTE2KXRtcDE7Ci0JZGF0YSA9IChkYXRhIDw8IEFENzI5MV9UX1ZBTFVFX0ZMT0FUX09GRlNFVCkgfAotCQkodG1wMiAmIEFENzI5MV9UX1ZBTFVFX0ZMT0FUX01BU0spOwotCWlmICh0bXAxIDwgMCkKLQkJLyogY29udmVydCBwb3NpdGl2ZSB2YWx1ZSB0byBzdXBwbHltZW50ICovCi0JCWRhdGEgPSAoQUQ3MjkxX1RfVkFMVUVfU0lHTiA8PCAxKSAtIGRhdGE7Ci0KIAlyZXQgPSBhZDcyOTFfaTJjX3dyaXRlKGNoaXAsIHRoaXNfYXR0ci0+YWRkcmVzcywgZGF0YSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIC1FSU87CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiBsZW47CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3NpemVfdCBhZDcyOTFfc2hvd192X2JvdW5kKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCXU4IGJvdW5kX3JlZywKLQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCXUxNiBkYXRhOwotCWludCByZXQ7Ci0KLQlpZiAoYm91bmRfcmVnIDwgQUQ3MjkxX1ZPTFRBR0VfTElNSVRfQkFTRSB8fAotCQlib3VuZF9yZWcgPj0gQUQ3MjkxX1ZPTFRBR0VfTElNSVRfQkFTRSArCi0JCUFENzI5MV9WT0xUQUdFX0xJTUlUX0NPVU5UKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldCA9IGFkNzI5MV9pMmNfcmVhZChjaGlwLCBib3VuZF9yZWcsICZkYXRhKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gLUVJTzsKLQotCWRhdGEgJj0gQUQ3MjkxX1ZBTFVFX01BU0s7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3NpemVfdCBhZDcyOTFfc2V0X3ZfYm91bmQoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJdTggYm91bmRfcmVnLAotCQljb25zdCBjaGFyICpidWYsCi0JCXNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0JdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQl1MTYgZGF0YTsKLQlpbnQgcmV0OwotCi0JaWYgKGJvdW5kX3JlZyA8IEFENzI5MV9WT0xUQUdFX0xJTUlUX0JBU0UgfHwKLQkJYm91bmRfcmVnID49IEFENzI5MV9WT0xUQUdFX0xJTUlUX0JBU0UgKwotCQlBRDcyOTFfVk9MVEFHRV9MSU1JVF9DT1VOVCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsdWUpOwotCi0JaWYgKHJldCB8fCB2YWx1ZSA+PSA0MDk2KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRhdGEgPSAodTE2KXZhbHVlOwotCXJldCA9IGFkNzI5MV9pMmNfd3JpdGUoY2hpcCwgYm91bmRfcmVnLCBkYXRhKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gLUVJTzsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIodF9zZW5zZV9oaWdoX3ZhbHVlLAorc3RhdGljIElJT19ERVZJQ0VfQVRUUihpbl90ZW1wMF90aHJlc2hfYm90aF9oeXN0X3JhdywKIAkJICAgICAgIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICAgICAgYWQ3MjkxX3Nob3dfdF9ib3VuZCwgYWQ3MjkxX3NldF90X2JvdW5kLAotCQkgICAgICAgQUQ3MjkxX1RfU0VOU0VfSElHSCk7Ci1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKHRfc2Vuc2VfbG93X3ZhbHVlLAotCQkgICAgICAgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgICAgICBhZDcyOTFfc2hvd190X2JvdW5kLCBhZDcyOTFfc2V0X3RfYm91bmQsCi0JCSAgICAgICBBRDcyOTFfVF9TRU5TRV9MT1cpOwotc3RhdGljIElJT19ERVZJQ0VfQVRUUih0X3NlbnNlX2h5c3RfdmFsdWUsCi0JCSAgICAgICBTX0lSVUdPIHwgU19JV1VTUiwKLQkJICAgICAgIGFkNzI5MV9zaG93X3RfYm91bmQsIGFkNzI5MV9zZXRfdF9ib3VuZCwKKwkJICAgICAgIGFkNzI5MV9zaG93X2h5c3QsIGFkNzI5MV9zZXRfaHlzdCwKIAkJICAgICAgIEFENzI5MV9UX1NFTlNFX0hZU1QpOwotc3RhdGljIElJT19ERVZJQ0VfQVRUUih2MF9oaWdoLAorc3RhdGljIElJT19ERVZJQ0VfQVRUUihpbl92b2x0YWdlMF90aHJlc2hfYm90aF9oeXN0X3JhdywKIAkJICAgICAgIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICAgICAgYWQ3MjkxX3Nob3dfdF9ib3VuZCwgYWQ3MjkxX3NldF90X2JvdW5kLCAweDA0KTsKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIodjBfbG93LAorCQkgICAgICAgYWQ3MjkxX3Nob3dfaHlzdCwgYWQ3MjkxX3NldF9oeXN0LCBBRDcyOTFfQ0gwX0hZU1QpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihpbl92b2x0YWdlMV90aHJlc2hfYm90aF9oeXN0X3JhdywKIAkJICAgICAgIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICAgICAgYWQ3MjkxX3Nob3dfdF9ib3VuZCwgYWQ3MjkxX3NldF90X2JvdW5kLCAweDA1KTsKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIodjBfaHlzdCwKKwkJICAgICAgIGFkNzI5MV9zaG93X2h5c3QsIGFkNzI5MV9zZXRfaHlzdCwgQUQ3MjkxX0NIMV9IWVNUKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW5fdm9sdGFnZTJfdGhyZXNoX2JvdGhfaHlzdF9yYXcsCiAJCSAgICAgICBTX0lSVUdPIHwgU19JV1VTUiwKLQkJICAgICAgIGFkNzI5MV9zaG93X3RfYm91bmQsIGFkNzI5MV9zZXRfdF9ib3VuZCwgMHgwNik7Ci1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKHYxX2hpZ2gsCisJCSAgICAgICBhZDcyOTFfc2hvd19oeXN0LCBhZDcyOTFfc2V0X2h5c3QsIEFENzI5MV9DSDJfSFlTVCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluX3ZvbHRhZ2UzX3RocmVzaF9ib3RoX2h5c3RfcmF3LAogCQkgICAgICAgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgICAgICBhZDcyOTFfc2hvd190X2JvdW5kLCBhZDcyOTFfc2V0X3RfYm91bmQsIDB4MDcpOwotc3RhdGljIElJT19ERVZJQ0VfQVRUUih2MV9sb3csCisJCSAgICAgICBhZDcyOTFfc2hvd19oeXN0LCBhZDcyOTFfc2V0X2h5c3QsIEFENzI5MV9DSDNfSFlTVCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluX3ZvbHRhZ2U0X3RocmVzaF9ib3RoX2h5c3RfcmF3LAogCQkgICAgICAgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgICAgICBhZDcyOTFfc2hvd190X2JvdW5kLCBhZDcyOTFfc2V0X3RfYm91bmQsIDB4MDgpOwotc3RhdGljIElJT19ERVZJQ0VfQVRUUih2MV9oeXN0LAorCQkgICAgICAgYWQ3MjkxX3Nob3dfaHlzdCwgYWQ3MjkxX3NldF9oeXN0LCBBRDcyOTFfQ0g0X0hZU1QpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihpbl92b2x0YWdlNV90aHJlc2hfYm90aF9oeXN0X3JhdywKIAkJICAgICAgIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICAgICAgYWQ3MjkxX3Nob3dfdF9ib3VuZCwgYWQ3MjkxX3NldF90X2JvdW5kLCAweDA5KTsKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIodjJfaGlnaCwKKwkJICAgICAgIGFkNzI5MV9zaG93X2h5c3QsIGFkNzI5MV9zZXRfaHlzdCwgQUQ3MjkxX0NINV9IWVNUKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW5fdm9sdGFnZTZfdGhyZXNoX2JvdGhfaHlzdF9yYXcsCiAJCSAgICAgICBTX0lSVUdPIHwgU19JV1VTUiwKLQkJICAgICAgIGFkNzI5MV9zaG93X3RfYm91bmQsIGFkNzI5MV9zZXRfdF9ib3VuZCwgMHgwQSk7Ci1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKHYyX2xvdywKKwkJICAgICAgIGFkNzI5MV9zaG93X2h5c3QsIGFkNzI5MV9zZXRfaHlzdCwgQUQ3MjkxX0NINl9IWVNUKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW5fdm9sdGFnZTdfdGhyZXNoX2JvdGhfaHlzdF9yYXcsCiAJCSAgICAgICBTX0lSVUdPIHwgU19JV1VTUiwKLQkJICAgICAgIGFkNzI5MV9zaG93X3RfYm91bmQsIGFkNzI5MV9zZXRfdF9ib3VuZCwgMHgwQik7Ci1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKHYyX2h5c3QsCi0JCSAgICAgICBTX0lSVUdPIHwgU19JV1VTUiwKLQkJICAgICAgIGFkNzI5MV9zaG93X3RfYm91bmQsIGFkNzI5MV9zZXRfdF9ib3VuZCwgMHgwQyk7Ci1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKHYzX2hpZ2gsCi0JCSAgICAgICBTX0lSVUdPIHwgU19JV1VTUiwKLQkJICAgICAgIC8qIERhdGFzaGVldCBzdWdnZXN0cyB0aGlzIG9uZSBhbmQgdGhpcyBvbmUgb25seQotCQkJICBoYXMgdGhlIHJlZ2lzdGVycyBpbiBkaWZmZXJlbnQgb3JkZXIgKi8KLQkJICAgICAgIGFkNzI5MV9zaG93X3RfYm91bmQsIGFkNzI5MV9zZXRfdF9ib3VuZCwgMHgwRSk7Ci1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKHYzX2xvdywKLQkJICAgICAgIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICAgICAgYWQ3MjkxX3Nob3dfdF9ib3VuZCwgYWQ3MjkxX3NldF90X2JvdW5kLCAweDBEKTsKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIodjNfaHlzdCwKLQkJICAgICAgIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICAgICAgYWQ3MjkxX3Nob3dfdF9ib3VuZCwgYWQ3MjkxX3NldF90X2JvdW5kLCAweDBGKTsKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIodjRfaGlnaCwKLQkJICAgICAgIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICAgICAgYWQ3MjkxX3Nob3dfdF9ib3VuZCwgYWQ3MjkxX3NldF90X2JvdW5kLCAweDEwKTsKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIodjRfbG93LAotCQkgICAgICAgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgICAgICBhZDcyOTFfc2hvd190X2JvdW5kLCBhZDcyOTFfc2V0X3RfYm91bmQsIDB4MTEpOwotc3RhdGljIElJT19ERVZJQ0VfQVRUUih2NF9oeXN0LAotCQkgICAgICAgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgICAgICBhZDcyOTFfc2hvd190X2JvdW5kLCBhZDcyOTFfc2V0X3RfYm91bmQsIDB4MTIpOwotc3RhdGljIElJT19ERVZJQ0VfQVRUUih2NV9oaWdoLAotCQkgICAgICAgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgICAgICBhZDcyOTFfc2hvd190X2JvdW5kLCBhZDcyOTFfc2V0X3RfYm91bmQsIDB4MTMpOwotc3RhdGljIElJT19ERVZJQ0VfQVRUUih2NV9sb3csCi0JCSAgICAgICBTX0lSVUdPIHwgU19JV1VTUiwKLQkJICAgICAgIGFkNzI5MV9zaG93X3RfYm91bmQsIGFkNzI5MV9zZXRfdF9ib3VuZCwgMHgxNCk7Ci1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKHY1X2h5c3QsCi0JCSAgICAgICBTX0lSVUdPIHwgU19JV1VTUiwKLQkJICAgICAgIGFkNzI5MV9zaG93X3RfYm91bmQsIGFkNzI5MV9zZXRfdF9ib3VuZCwgMHgxNSk7Ci1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKHY2X2hpZ2gsCi0JCSAgICAgICBTX0lSVUdPIHwgU19JV1VTUiwKLQkJICAgICAgIGFkNzI5MV9zaG93X3RfYm91bmQsIGFkNzI5MV9zZXRfdF9ib3VuZCwgMHgxNik7Ci1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKHY2X2xvdywKLQkJICAgICAgIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICAgICAgYWQ3MjkxX3Nob3dfdF9ib3VuZCwgYWQ3MjkxX3NldF90X2JvdW5kLCAweDE3KTsKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIodjZfaHlzdCwKLQkJICAgICAgIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICAgICAgYWQ3MjkxX3Nob3dfdF9ib3VuZCwgYWQ3MjkxX3NldF90X2JvdW5kLCAweDE4KTsKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIodjdfaGlnaCwKLQkJICAgICAgIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICAgICAgYWQ3MjkxX3Nob3dfdF9ib3VuZCwgYWQ3MjkxX3NldF90X2JvdW5kLCAweDE5KTsKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIodjdfbG93LAotCQkgICAgICAgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgICAgICBhZDcyOTFfc2hvd190X2JvdW5kLCBhZDcyOTFfc2V0X3RfYm91bmQsIDB4MUEpOwotc3RhdGljIElJT19ERVZJQ0VfQVRUUih2N19oeXN0LAotCQkgICAgICAgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgICAgICBhZDcyOTFfc2hvd190X2JvdW5kLCBhZDcyOTFfc2V0X3RfYm91bmQsIDB4MUIpOworCQkgICAgICAgYWQ3MjkxX3Nob3dfaHlzdCwgYWQ3MjkxX3NldF9oeXN0LCBBRDcyOTFfQ0g3X0hZU1QpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3MjkxX2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKLQkmaWlvX2Rldl9hdHRyX3Rfc2Vuc2VfaGlnaF92YWx1ZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfdF9zZW5zZV9sb3dfdmFsdWUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX3Rfc2Vuc2VfaHlzdF92YWx1ZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfdjBfaGlnaC5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfdjBfbG93LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl92MF9oeXN0LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl92MV9oaWdoLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl92MV9sb3cuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX3YxX2h5c3QuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX3YyX2hpZ2guZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX3YyX2xvdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfdjJfaHlzdC5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfdjNfaGlnaC5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfdjNfbG93LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl92M19oeXN0LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl92NF9oaWdoLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl92NF9sb3cuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX3Y0X2h5c3QuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX3Y1X2hpZ2guZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX3Y1X2xvdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfdjVfaHlzdC5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfdjZfaGlnaC5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfdjZfbG93LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl92Nl9oeXN0LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl92N19oaWdoLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl92N19sb3cuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX3Y3X2h5c3QuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX3RlbXAwX3RocmVzaF9ib3RoX2h5c3RfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbl92b2x0YWdlMF90aHJlc2hfYm90aF9oeXN0X3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fdm9sdGFnZTFfdGhyZXNoX2JvdGhfaHlzdF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX3ZvbHRhZ2UyX3RocmVzaF9ib3RoX2h5c3RfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbl92b2x0YWdlM190aHJlc2hfYm90aF9oeXN0X3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fdm9sdGFnZTRfdGhyZXNoX2JvdGhfaHlzdF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX3ZvbHRhZ2U1X3RocmVzaF9ib3RoX2h5c3RfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbl92b2x0YWdlNl90aHJlc2hfYm90aF9oeXN0X3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fdm9sdGFnZTdfdGhyZXNoX2JvdGhfaHlzdF9yYXcuZGV2X2F0dHIuYXR0ciwKIAlOVUxMLAogfTsKIAorLyogaGlnaCAvIGxvdyAqLworc3RhdGljIHU4IGFkNzI5MV9saW1pdF9yZWdzWzldWzJdID0geworCXsgQUQ3MjkxX0NIMF9EQVRBX0hJR0gsIEFENzI5MV9DSDBfREFUQV9MT1cgfSwKKwl7IEFENzI5MV9DSDFfREFUQV9ISUdILCBBRDcyOTFfQ0gxX0RBVEFfTE9XIH0sCisJeyBBRDcyOTFfQ0gyX0RBVEFfSElHSCwgQUQ3MjkxX0NIMl9EQVRBX0xPVyB9LAorCXsgQUQ3MjkxX0NIM19EQVRBX0hJR0gsIEFENzI5MV9DSDNfREFUQV9MT1cgfSwgLyogRklYTUU6ID8gKi8KKwl7IEFENzI5MV9DSDRfREFUQV9ISUdILCBBRDcyOTFfQ0g0X0RBVEFfTE9XIH0sCisJeyBBRDcyOTFfQ0g1X0RBVEFfSElHSCwgQUQ3MjkxX0NINV9EQVRBX0xPVyB9LAorCXsgQUQ3MjkxX0NINl9EQVRBX0hJR0gsIEFENzI5MV9DSDZfREFUQV9MT1cgfSwKKwl7IEFENzI5MV9DSDdfREFUQV9ISUdILCBBRDcyOTFfQ0g3X0RBVEFfTE9XIH0sCisJLyogdGVtcCAqLworCXsgQUQ3MjkxX1RfU0VOU0VfSElHSCwgQUQ3MjkxX1RfU0VOU0VfTE9XIH0sCit9OworCitzdGF0aWMgaW50IGFkNzI5MV9yZWFkX2V2ZW50X3ZhbHVlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkJICAgdTY0IGV2ZW50X2NvZGUsCisJCQkJICAgaW50ICp2YWwpCit7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJaW50IHJldDsKKwl1OCByZWc7CisJdTE2IHV2YWw7CisJczE2IHNpZ252YWw7CisKKwlzd2l0Y2ggKElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfQ0hBTl9UWVBFKGV2ZW50X2NvZGUpKSB7CisJY2FzZSBJSU9fVk9MVEFHRToKKwkJcmVnID0gYWQ3MjkxX2xpbWl0X3JlZ3NbSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9OVU0oZXZlbnRfY29kZSldCisJCQlbIShJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX0RJUihldmVudF9jb2RlKSA9PQorCQkJICAgSUlPX0VWX0RJUl9SSVNJTkcpXTsKKworCQlyZXQgPSBhZDcyOTFfaTJjX3JlYWQoY2hpcCwgcmVnLCAmdXZhbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnZhbCA9IHV2YWwgJiBBRDcyOTFfVkFMVUVfTUFTSzsKKwkJcmV0dXJuIDA7CisKKwljYXNlIElJT19URU1QOgorCQlyZWcgPSBhZDcyOTFfbGltaXRfcmVnc1s4XQorCQkJWyEoSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9ESVIoZXZlbnRfY29kZSkgPT0KKwkJCSAgIElJT19FVl9ESVJfUklTSU5HKV07CisKKwkJcmV0ID0gYWQ3MjkxX2kyY19yZWFkKGNoaXAsIHJlZywgJnNpZ252YWwpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXNpZ252YWwgPSAoczE2KSgoc2lnbnZhbCAmIEFENzI5MV9WQUxVRV9NQVNLKSA8PCA0KSA+PiA0OworCQkqdmFsID0gc2lnbnZhbDsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfTsKK30KKworc3RhdGljIGludCBhZDcyOTFfd3JpdGVfZXZlbnRfdmFsdWUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkgICAgdTY0IGV2ZW50X2NvZGUsCisJCQkJICAgIGludCB2YWwpCit7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXU4IHJlZzsKKwlzMTYgc2lnbnZhbDsKKworCXN3aXRjaCAoSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9DSEFOX1RZUEUoZXZlbnRfY29kZSkpIHsKKwljYXNlIElJT19WT0xUQUdFOgorCQlpZiAodmFsID4gQUQ3MjkxX1ZBTFVFX01BU0sgfHwgdmFsIDwgMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZWcgPSBhZDcyOTFfbGltaXRfcmVnc1tJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX05VTShldmVudF9jb2RlKV0KKwkJCVshKElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfRElSKGV2ZW50X2NvZGUpID09CisJCQkgICBJSU9fRVZfRElSX1JJU0lORyldOworCQlyZXR1cm4gYWQ3MjkxX2kyY193cml0ZShjaGlwLCByZWcsIHZhbCk7CisJY2FzZSBJSU9fVEVNUDoKKwkJaWYgKHZhbCA+IDIwNDcgfHwgdmFsIDwgLTIwNDgpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmVnID0gYWQ3MjkxX2xpbWl0X3JlZ3NbOF0KKwkJCVshKElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfRElSKGV2ZW50X2NvZGUpID09CisJCQkgICBJSU9fRVZfRElSX1JJU0lORyldOworCQlzaWdudmFsID0gdmFsOworCQlyZXR1cm4gYWQ3MjkxX2kyY193cml0ZShjaGlwLCByZWcsICoodTE2ICopJnNpZ252YWwpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX07Cit9CisKK3N0YXRpYyBpbnQgYWQ3MjkxX3JlYWRfZXZlbnRfY29uZmlnKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkJICAgIHU2NCBldmVudF9jb2RlKQoreworCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwkvKiBUbyBiZSBlbmFibGVkIHRoZSBjaGFubmVsIG11c3Qgc2ltcGx5IGJlIG9uLiBJZiBhbnkgYXJlIGVuYWJsZWQKKwkgICB3ZSBhcmUgaW4gY29udGludW91cyBzYW1wbGluZyBtb2RlICovCisKKwlzd2l0Y2ggKElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfQ0hBTl9UWVBFKGV2ZW50X2NvZGUpKSB7CisJY2FzZSBJSU9fVk9MVEFHRToKKwkJaWYgKGNoaXAtPmNfbWFzayAmCisJCSAgICAoMSA8PCAoMTUgLSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX05VTShldmVudF9jb2RlKSkpKQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAwOworCWNhc2UgSUlPX1RFTVA6CisJCS8qIGFsd2F5cyBvbiAqLworCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKK30KKworc3RhdGljIGludCBhZDcyOTFfd3JpdGVfZXZlbnRfY29uZmlnKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkJICAgICB1NjQgZXZlbnRfY29kZSwKKwkJCQkgICAgIGludCBzdGF0ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYWQ3MjkxX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJdTE2IHJlZ3ZhbDsKKworCW11dGV4X2xvY2soJmNoaXAtPnN0YXRlX2xvY2spOworCXJlZ3ZhbCA9IGNoaXAtPmNvbW1hbmQ7CisJLyoKKwkgKiBUbyBiZSBlbmFibGVkIHRoZSBjaGFubmVsIG11c3Qgc2ltcGx5IGJlIG9uLiBJZiBhbnkgYXJlIGVuYWJsZWQKKwkgKiB1c2UgY29udGludW91cyBzYW1wbGluZyBtb2RlLgorCSAqIFBvc3NpYmxlIHRvIGRpc2FibGUgdGVtcCBhcyB3ZWxsIGJ1dCB0aGF0IG1ha2VzIHNpbmdsZSByZWFkIHRyaWNreS4KKwkgKi8KKworCXN3aXRjaCAoSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9UWVBFKGV2ZW50X2NvZGUpKSB7CisJY2FzZSBJSU9fVk9MVEFHRToKKwkJaWYgKCghc3RhdGUpICYmIChjaGlwLT5jX21hc2sgJiAoMSA8PCAoMTUgLQorCQkJCUlJT19FVkVOVF9DT0RFX0VYVFJBQ1RfTlVNKGV2ZW50X2NvZGUpKSkpKQorCQkJY2hpcC0+Y19tYXNrICY9IH4oMSA8PCAoMTUgLSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX05VTQorCQkJCQkJCShldmVudF9jb2RlKSkpOworCQllbHNlIGlmIChzdGF0ZSAmJiAoIShjaGlwLT5jX21hc2sgJiAoMSA8PCAoMTUgLQorCQkJCUlJT19FVkVOVF9DT0RFX0VYVFJBQ1RfTlVNKGV2ZW50X2NvZGUpKSkpKSkKKwkJCWNoaXAtPmNfbWFzayB8PSAoMSA8PCAoMTUgLSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX05VTQorCQkJCQkJCShldmVudF9jb2RlKSkpOworCQllbHNlCisJCQlicmVhazsKKworCQlyZWd2YWwgJj0gfkFENzI5MV9BVVRPQ1lDTEU7CisJCXJlZ3ZhbCB8PSBjaGlwLT5jX21hc2s7CisJCWlmIChjaGlwLT5jX21hc2spIC8qIEVuYWJsZSBhdXRvY3ljbGU/ICovCisJCQlyZWd2YWwgfD0gQUQ3MjkxX0FVVE9DWUNMRTsKKworCQlyZXQgPSBhZDcyOTFfaTJjX3dyaXRlKGNoaXAsIEFENzI5MV9DT01NQU5ELCByZWd2YWwpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3JfcmV0OworCisJCWNoaXAtPmNvbW1hbmQgPSByZWd2YWw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5zdGF0ZV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkNzI5MV9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICBpbnQgKnZhbCwKKwkJCSAgIGludCAqdmFsMiwKKwkJCSAgIGxvbmcgbWFzaykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBpbnQgc2NhbGVfdXY7CisJdTE2IHJlZ3ZhbDsKKwlzMTYgc2lnbnZhbDsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgMDoKKwkJc3dpdGNoIChjaGFuLT50eXBlKSB7CisJCWNhc2UgSUlPX1ZPTFRBR0U6CisJCQltdXRleF9sb2NrKCZjaGlwLT5zdGF0ZV9sb2NrKTsKKwkJCS8qIElmIGluIGF1dG9jeWNsZSBtb2RlIGRyb3AgdGhyb3VnaCAqLworCQkJaWYgKGNoaXAtPmNvbW1hbmQgJiBBRDcyOTFfQVVUT0NZQ0xFKSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZjaGlwLT5zdGF0ZV9sb2NrKTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJLyogRW5hYmxlIHRoaXMgY2hhbm5lbCBhbG9uZSAqLworCQkJcmVndmFsID0gY2hpcC0+Y29tbWFuZCAmICh+QUQ3MjkxX1ZPTFRBR0VfTUFTSyk7CisJCQlyZWd2YWwgfD0gMSA8PCAoMTUgLSBjaGFuLT5jaGFubmVsKTsKKwkJCXJldCA9IGFkNzI5MV9pMmNfd3JpdGUoY2hpcCwgQUQ3MjkxX0NPTU1BTkQsIHJlZ3ZhbCk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCW11dGV4X3VubG9jaygmY2hpcC0+c3RhdGVfbG9jayk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCS8qIFJlYWQgdm9sdGFnZSAqLworCQkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNoaXAtPmNsaWVudCwKKwkJCQkJCSAgICAgICBBRDcyOTFfVk9MVEFHRSk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCW11dGV4X3VubG9jaygmY2hpcC0+c3RhdGVfbG9jayk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCSp2YWwgPSBzd2FiMTYoKHUxNilyZXQpICYgQUQ3MjkxX1ZBTFVFX01BU0s7CisJCQltdXRleF91bmxvY2soJmNoaXAtPnN0YXRlX2xvY2spOworCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQljYXNlIElJT19URU1QOgorCQkJLyogQXNzdW1lcyB0c2Vuc2UgYml0IG9mIGNvbW1hbmQgcmVnaXN0ZXIgYWx3YXlzIHNldCAqLworCQkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNoaXAtPmNsaWVudCwKKwkJCQkJCSAgICAgICBBRDcyOTFfVF9TRU5TRSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQkJc2lnbnZhbCA9IChzMTYpKChzd2FiMTYoKHUxNilyZXQpICYKKwkJCQlBRDcyOTFfVkFMVUVfTUFTSykgPDwgNCkgPj4gNDsKKwkJCSp2YWwgPSBzaWdudmFsOworCQkJcmV0dXJuIElJT19WQUxfSU5UOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwljYXNlICgxIDw8IElJT19DSEFOX0lORk9fQVZFUkFHRV9SQVdfU0VQQVJBVEUpOgorCQlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2hpcC0+Y2xpZW50LAorCQkJCQkgICAgICAgQUQ3MjkxX1RfQVZFUkFHRSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQkJc2lnbnZhbCA9IChzMTYpKChzd2FiMTYoKHUxNilyZXQpICYKKwkJCQlBRDcyOTFfVkFMVUVfTUFTSykgPDwgNCkgPj4gNDsKKwkJCSp2YWwgPSBzaWdudmFsOworCQkJcmV0dXJuIElJT19WQUxfSU5UOworCWNhc2UgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpOgorCQlzY2FsZV91diA9IChjaGlwLT5pbnRfdnJlZl9tdiAqIDEwMDApID4+IEFENzI5MV9CSVRTOworCQkqdmFsID0gIHNjYWxlX3V2IC8gMTAwMDsKKwkJKnZhbDIgPSAoc2NhbGVfdXYgJSAxMDAwKSAqIDEwMDA7CisJCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCWNhc2UgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TRVBBUkFURSk6CisJCS8qCisJCSogT25lIExTQiBvZiB0aGUgQURDIGNvcnJlc3BvbmRzIHRvIDAuMjUgZGVnIEMuCisJCSogVGhlIHRlbXBlcmF0dXJlIHJlYWRpbmcgaXMgaW4gMTItYml0IHR3b3MgY29tcGxlbWVudCBmb3JtYXQKKwkJKi8KKwkJKnZhbCA9IDI1MDsKKwkJcmV0dXJuIElJT19WQUxfSU5UOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworI2RlZmluZSBBRDcyOTFfVk9MVEFHRV9DSEFOKF9jaGFuKQkJCQkJXAorewkJCQkJCQkJCVwKKwkudHlwZSA9IElJT19WT0xUQUdFLAkJCQkJCVwKKwkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAkJCVwKKwkuaW5kZXhlZCA9IDEsCQkJCQkJCVwKKwkuY2hhbm5lbCA9IF9jaGFuLAkJCQkJCVwKKwkuZXZlbnRfbWFzayA9IElJT19FVl9CSVQoSUlPX0VWX1RZUEVfVEhSRVNILCBJSU9fRVZfRElSX1JJU0lORyl8XAorCUlJT19FVl9CSVQoSUlPX0VWX1RZUEVfVEhSRVNILCBJSU9fRVZfRElSX0ZBTExJTkcpCQlcCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBhZDcyOTFfY2hhbm5lbHNbXSA9IHsKKwlBRDcyOTFfVk9MVEFHRV9DSEFOKDApLAorCUFENzI5MV9WT0xUQUdFX0NIQU4oMSksCisJQUQ3MjkxX1ZPTFRBR0VfQ0hBTigyKSwKKwlBRDcyOTFfVk9MVEFHRV9DSEFOKDMpLAorCUFENzI5MV9WT0xUQUdFX0NIQU4oNCksCisJQUQ3MjkxX1ZPTFRBR0VfQ0hBTig1KSwKKwlBRDcyOTFfVk9MVEFHRV9DSEFOKDYpLAorCUFENzI5MV9WT0xUQUdFX0NIQU4oNyksCisJeworCQkudHlwZSA9IElJT19URU1QLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19BVkVSQUdFX1JBV19TRVBBUkFURSkgfAorCQkJCSgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpLAorCQkuaW5kZXhlZCA9IDEsCisJCS5jaGFubmVsID0gMCwKKwkJLmV2ZW50X21hc2sgPQorCQlJSU9fRVZfQklUKElJT19FVl9UWVBFX1RIUkVTSCwgSUlPX0VWX0RJUl9SSVNJTkcpfAorCQlJSU9fRVZfQklUKElJT19FVl9UWVBFX1RIUkVTSCwgSUlPX0VWX0RJUl9GQUxMSU5HKQorCX0KK307CisKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNzI5MV9ldmVudF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CiAJLmF0dHJzID0gYWQ3MjkxX2V2ZW50X2F0dHJpYnV0ZXMsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkNzI5MV9pbmZvID0gewogCS5hdHRycyA9ICZhZDcyOTFfYXR0cmlidXRlX2dyb3VwLAotCS5udW1faW50ZXJydXB0X2xpbmVzID0gMSwKKwkucmVhZF9yYXcgPSAmYWQ3MjkxX3JlYWRfcmF3LAorCS5yZWFkX2V2ZW50X2NvbmZpZyA9ICZhZDcyOTFfcmVhZF9ldmVudF9jb25maWcsCisJLndyaXRlX2V2ZW50X2NvbmZpZyA9ICZhZDcyOTFfd3JpdGVfZXZlbnRfY29uZmlnLAorCS5yZWFkX2V2ZW50X3ZhbHVlID0gJmFkNzI5MV9yZWFkX2V2ZW50X3ZhbHVlLAorCS53cml0ZV9ldmVudF92YWx1ZSA9ICZhZDcyOTFfd3JpdGVfZXZlbnRfdmFsdWUsCiAJLmV2ZW50X2F0dHJzID0gJmFkNzI5MV9ldmVudF9hdHRyaWJ1dGVfZ3JvdXAsCiB9OwogCi0vKgotICogZGV2aWNlIHByb2JlIGFuZCByZW1vdmUKLSAqLwotCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDcyOTFfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBhZDcyOTFfY2hpcF9pbmZvICpjaGlwOwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldCA9IDAsIHZvbHRhZ2VfdXYgPSAwOwogCiAJaW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZShzaXplb2YoKmNoaXApKTsKIAlpZiAoaW5kaW9fZGV2ID09IE5VTEwpIHsKQEAgLTgwMCwyMCArNTg0LDUxIEBACiAJCWdvdG8gZXJyb3JfcmV0OwogCX0KIAljaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCWNoaXAtPnJlZyA9IHJlZ3VsYXRvcl9nZXQoJmNsaWVudC0+ZGV2LCAidmNjIik7CisJaWYgKCFJU19FUlIoY2hpcC0+cmVnKSkgeworCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKGNoaXAtPnJlZyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3B1dF9yZWc7CisJCXZvbHRhZ2VfdXYgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UoY2hpcC0+cmVnKTsKKwl9CisKKwltdXRleF9pbml0KCZjaGlwLT5zdGF0ZV9sb2NrKTsKIAkvKiB0aGlzIGlzIG9ubHkgdXNlZCBmb3IgZGV2aWNlIHJlbW92YWwgcHVycG9zZXMgKi8KIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBpbmRpb19kZXYpOwogCiAJY2hpcC0+Y2xpZW50ID0gY2xpZW50OwotCWNoaXAtPmNvbW1hbmQgPSBBRDcyOTFfTk9JU0VfREVMQVkgfCBBRDcyOTFfVF9TRU5TRV9NQVNLOworCisJY2hpcC0+Y29tbWFuZCA9IEFENzI5MV9OT0lTRV9ERUxBWSB8CisJCQlBRDcyOTFfVF9TRU5TRV9NQVNLIHwgLyogVHNlbnNlIGFsd2F5cyBlbmFibGVkICovCisJCQlBRDcyOTFfQUxFUlRfUE9MQVJJVFk7IC8qIHNldCBpcnEgcG9sYXJpdHkgbG93IGxldmVsICovCisKKwlpZiAodm9sdGFnZV91dikgeworCQljaGlwLT5pbnRfdnJlZl9tdiA9IHZvbHRhZ2VfdXYgLyAxMDAwOworCQljaGlwLT5jb21tYW5kIHw9IEFENzI5MV9FWFRfUkVGOworCX0gZWxzZSB7CisJCWNoaXAtPmludF92cmVmX212ID0gMjUwMDsgLyogQnVpbGQtaW4gcmVmICovCisJfQogCiAJaW5kaW9fZGV2LT5uYW1lID0gaWQtPm5hbWU7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGFkNzI5MV9jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoYWQ3MjkxX2NoYW5uZWxzKTsKKwogCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKIAlpbmRpb19kZXYtPmluZm8gPSAmYWQ3MjkxX2luZm87CiAJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOwogCi0JcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisJcmV0ID0gYWQ3MjkxX2kyY193cml0ZShjaGlwLCBBRDcyOTFfQ09NTUFORCwgQUQ3MjkxX1JFU0VUKTsKKwlpZiAocmV0KSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyb3JfZGlzYWJsZV9yZWc7CisJfQorCisJcmV0ID0gYWQ3MjkxX2kyY193cml0ZShjaGlwLCBBRDcyOTFfQ09NTUFORCwgY2hpcC0+Y29tbWFuZCk7CisJaWYgKHJldCkgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycm9yX2Rpc2FibGVfcmVnOworCX0KIAogCWlmIChjbGllbnQtPmlycSA+IDApIHsKIAkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoY2xpZW50LT5pcnEsCkBAIC04MjMsMjggKzYzOCwyOCBAQAogCQkJCQkgICBpZC0+bmFtZSwKIAkJCQkJICAgaW5kaW9fZGV2KTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gZXJyb3JfdW5yZWdfZGV2OwotCi0JCS8qIHNldCBpcnEgcG9sYXJpdHkgbG93IGxldmVsICovCi0JCWNoaXAtPmNvbW1hbmQgfD0gQUQ3MjkxX0FMQVJUX1BPTEFSSVRZOworCQkJZ290byBlcnJvcl9kaXNhYmxlX3JlZzsKIAl9CiAKLQlyZXQgPSBhZDcyOTFfaTJjX3dyaXRlKGNoaXAsIEFENzI5MV9DT01NQU5ELCBjaGlwLT5jb21tYW5kKTsKLQlpZiAocmV0KSB7Ci0JCXJldCA9IC1FSU87CisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfdW5yZWdfaXJxOwotCX0KIAotCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIiVzIHRlbXBlcmF0dXJlIHNlbnNvciByZWdpc3RlcmVkLlxuIiwKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICIlcyBBREMgcmVnaXN0ZXJlZC5cbiIsCiAJCQkgaWQtPm5hbWUpOwogCiAJcmV0dXJuIDA7CiAKIGVycm9yX3VucmVnX2lycToKLQlmcmVlX2lycShjbGllbnQtPmlycSwgaW5kaW9fZGV2KTsKLWVycm9yX3VucmVnX2RldjoKLQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKLWVycm9yX2ZyZWVfZGV2OgorCWlmIChjbGllbnQtPmlycSkKKwkJZnJlZV9pcnEoY2xpZW50LT5pcnEsIGluZGlvX2Rldik7CitlcnJvcl9kaXNhYmxlX3JlZzoKKwlpZiAoIUlTX0VSUihjaGlwLT5yZWcpKQorCQlyZWd1bGF0b3JfZGlzYWJsZShjaGlwLT5yZWcpOworZXJyb3JfcHV0X3JlZzoKKwlpZiAoIUlTX0VSUihjaGlwLT5yZWcpKQorCQlyZWd1bGF0b3JfcHV0KGNoaXAtPnJlZyk7CisKIAlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIGVycm9yX3JldDoKIAlyZXR1cm4gcmV0OwpAQCAtODUzLDEwICs2NjgsMTggQEAKIHN0YXRpYyBpbnQgX19kZXZleGl0IGFkNzI5MV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJc3RydWN0IGFkNzI5MV9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CiAKIAlpZiAoY2xpZW50LT5pcnEpCiAJCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBpbmRpb19kZXYpOwotCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCisJaWYgKCFJU19FUlIoY2hpcC0+cmVnKSkgeworCQlyZWd1bGF0b3JfZGlzYWJsZShjaGlwLT5yZWcpOworCQlyZWd1bGF0b3JfcHV0KGNoaXAtPnJlZyk7CisJfQorCiAJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiAKIAlyZXR1cm4gMDsKQEAgLTg3MSw3ICs2OTQsNyBAQAogCiBzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWQ3MjkxX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkubmFtZSA9ICJhZDcyOTEiLAorCQkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCX0sCiAJLnByb2JlID0gYWQ3MjkxX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDcyOTFfcmVtb3ZlKSwKQEAgLTg4OSw4ICs3MTIsNyBAQAogfQogCiBNT0RVTEVfQVVUSE9SKCJTb25pYyBaaGFuZyA8c29uaWMuemhhbmdAYW5hbG9nLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQ3MjkxIGRpZ2l0YWwiCi0JCQkiIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQ3MjkxIEFEQyBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKIAogbW9kdWxlX2luaXQoYWQ3MjkxX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3Mjk4LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcyOTguaAppbmRleCA2MjhmNWFkLi45ZGRmNWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcyOTguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcyOTguaApAQCAtNTMsMTEgKzUzLDExIEBACiAJdW5zaWduZWQgc2hvcnQJCQl0eF9idWZbMl07CiB9OwogCi0jaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgorI2lmZGVmIENPTkZJR19JSU9fQlVGRkVSCiBpbnQgYWQ3Mjk4X3NjYW5fZnJvbV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIGxvbmcgY2gpOwogaW50IGFkNzI5OF9yZWdpc3Rlcl9yaW5nX2Z1bmNzX2FuZF9pbml0KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogdm9pZCBhZDcyOThfcmluZ19jbGVhbnVwKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwotI2Vsc2UgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2Vsc2UgLyogQ09ORklHX0lJT19CVUZGRVIgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGFkNzI5OF9zY2FuX2Zyb21fcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBsb25nIGNoKQogewogCXJldHVybiAwOwpAQCAtNzIsNSArNzIsNSBAQAogc3RhdGljIGlubGluZSB2b2lkIGFkNzI5OF9yaW5nX2NsZWFudXAoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKIH0KLSNlbmRpZiAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisjZW5kaWYgLyogQ09ORklHX0lJT19CVUZGRVIgKi8KICNlbmRpZiAvKiBJSU9fQURDX0FENzI5OF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3Mjk4X2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzI5OF9jb3JlLmMKaW5kZXggYjhlNGFlMi4uYzFkZTczYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3Mjk4X2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcyOThfY29yZS5jCkBAIC0xNCwxMSArMTQsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vc3lzZnMuaCIKLSNpbmNsdWRlICIuLi9yaW5nX2dlbmVyaWMuaCIKLSNpbmNsdWRlICJhZGMuaCIKKyNpbmNsdWRlICIuLi9idWZmZXJfZ2VuZXJpYy5oIgogCiAjaW5jbHVkZSAiYWQ3Mjk4LmgiCiAKQEAgLTI2LDI4ICsyNiwyOCBAQAogCUlJT19DSEFOKElJT19URU1QLCAwLCAxLCAwLCBOVUxMLCAwLCAwLAogCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TRVBBUkFURSksCiAJCSA5LCBBRDcyOThfQ0hfVEVNUCwgSUlPX1NUKCdzJywgMzIsIDMyLCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAwLCAwLAorCUlJT19DSEFOKElJT19WT0xUQUdFLCAwLCAxLCAwLCBOVUxMLCAwLCAwLAogCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAogCQkgMCwgMCwgSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAxLCAwLAorCUlJT19DSEFOKElJT19WT0xUQUdFLCAwLCAxLCAwLCBOVUxMLCAxLCAwLAogCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAogCQkgMSwgMSwgSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAyLCAwLAorCUlJT19DSEFOKElJT19WT0xUQUdFLCAwLCAxLCAwLCBOVUxMLCAyLCAwLAogCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAogCQkgMiwgMiwgSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAzLCAwLAorCUlJT19DSEFOKElJT19WT0xUQUdFLCAwLCAxLCAwLCBOVUxMLCAzLCAwLAogCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAogCQkgMywgMywgSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCA0LCAwLAorCUlJT19DSEFOKElJT19WT0xUQUdFLCAwLCAxLCAwLCBOVUxMLCA0LCAwLAogCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAogCQkgNCwgNCwgSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCA1LCAwLAorCUlJT19DSEFOKElJT19WT0xUQUdFLCAwLCAxLCAwLCBOVUxMLCA1LCAwLAogCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAogCQkgNSwgNSwgSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCA2LCAwLAorCUlJT19DSEFOKElJT19WT0xUQUdFLCAwLCAxLCAwLCBOVUxMLCA2LCAwLAogCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAogCQkgNiwgNiwgSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCA3LCAwLAorCUlJT19DSEFOKElJT19WT0xUQUdFLCAwLCAxLCAwLCBOVUxMLCA3LCAwLAogCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAogCQkgNywgNywgSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwgMCksCiAJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoOCksCkBAIC0xMDksMjQgKzEwOSwyNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFkNzI5OF9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8sCitzdGF0aWMgaW50IGFkNzI5OF9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAogCQkJICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCiAJCQkgICBpbnQgKnZhbCwKIAkJCSAgIGludCAqdmFsMiwKIAkJCSAgIGxvbmcgbSkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBhZDcyOThfc3RhdGUgKnN0ID0gaWlvX3ByaXYoZGV2X2luZm8pOworCXN0cnVjdCBhZDcyOThfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAl1bnNpZ25lZCBpbnQgc2NhbGVfdXY7CiAKIAlzd2l0Y2ggKG0pIHsKIAljYXNlIDA6Ci0JCW11dGV4X2xvY2soJmRldl9pbmZvLT5tbG9jayk7Ci0JCWlmIChpaW9fcmluZ19lbmFibGVkKGRldl9pbmZvKSkgeworCQltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwkJaWYgKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpKSB7CiAJCQlpZiAoY2hhbi0+YWRkcmVzcyA9PSBBRDcyOThfQ0hfVEVNUCkKIAkJCQlyZXQgPSAtRU5PREVWOwogCQkJZWxzZQotCQkJCXJldCA9IGFkNzI5OF9zY2FuX2Zyb21fcmluZyhkZXZfaW5mbywKKwkJCQlyZXQgPSBhZDcyOThfc2Nhbl9mcm9tX3JpbmcoaW5kaW9fZGV2LAogCQkJCQkJCSAgICBjaGFuLT5hZGRyZXNzKTsKIAkJfSBlbHNlIHsKIAkJCWlmIChjaGFuLT5hZGRyZXNzID09IEFENzI5OF9DSF9URU1QKQpAQCAtMTM0LDcgKzEzNCw3IEBACiAJCQllbHNlCiAJCQkJcmV0ID0gYWQ3Mjk4X3NjYW5fZGlyZWN0KHN0LCBjaGFuLT5hZGRyZXNzKTsKIAkJfQotCQltdXRleF91bmxvY2soJmRldl9pbmZvLT5tbG9jayk7CisJCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CiAKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwpAQCAtMTY1LDcgKzE2NSw3IEBACiB7CiAJc3RydWN0IGFkNzI5OF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHNwaS0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IGFkNzI5OF9zdGF0ZSAqc3Q7Ci0JaW50IHJldCwgcmVnZG9uZSA9IDA7CisJaW50IHJldDsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZShzaXplb2YoKnN0KSk7CiAKIAlpZiAoaW5kaW9fZGV2ID09IE5VTEwpCkBAIC0yMTgsMTkgKzIxOCwxOSBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfZGlzYWJsZV9yZWc7CiAKLQlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcl9kaXNhYmxlX3JlZzsKLQlyZWdkb25lID0gMTsKLQotCXJldCA9IGlpb19yaW5nX2J1ZmZlcl9yZWdpc3Rlcl9leChpbmRpb19kZXYtPnJpbmcsIDAsCi0JCQkJCSAgJmFkNzI5OF9jaGFubmVsc1sxXSwgLyogc2tpcCB0ZW1wMCAqLwotCQkJCQkgIEFSUkFZX1NJWkUoYWQ3Mjk4X2NoYW5uZWxzKSAtIDEpOworCXJldCA9IGlpb19idWZmZXJfcmVnaXN0ZXIoaW5kaW9fZGV2LAorCQkJCSAgJmFkNzI5OF9jaGFubmVsc1sxXSwgLyogc2tpcCB0ZW1wMCAqLworCQkJCSAgQVJSQVlfU0laRShhZDcyOThfY2hhbm5lbHMpIC0gMSk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9jbGVhbnVwX3Jpbmc7CisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfdW5yZWdpc3Rlcl9yaW5nOwogCiAJcmV0dXJuIDA7CiAKK2Vycm9yX3VucmVnaXN0ZXJfcmluZzoKKwlpaW9fYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIGVycm9yX2NsZWFudXBfcmluZzoKIAlhZDcyOThfcmluZ19jbGVhbnVwKGluZGlvX2Rldik7CiBlcnJvcl9kaXNhYmxlX3JlZzoKQEAgLTIzOSwxMSArMjM5LDcgQEAKIGVycm9yX3B1dF9yZWc6CiAJaWYgKCFJU19FUlIoc3QtPnJlZykpCiAJCXJlZ3VsYXRvcl9wdXQoc3QtPnJlZyk7Ci0KLQlpZiAocmVnZG9uZSkKLQkJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7Ci0JZWxzZQotCQlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yNTMsMTQgKzI0OSwxNCBAQAogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKIAlzdHJ1Y3QgYWQ3Mjk4X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKLQlpaW9fcmluZ19idWZmZXJfdW5yZWdpc3RlcihpbmRpb19kZXYtPnJpbmcpOwotCWFkNzI5OF9yaW5nX2NsZWFudXAoaW5kaW9fZGV2KTsKIAlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlhZDcyOThfcmluZ19jbGVhbnVwKGluZGlvX2Rldik7CiAJaWYgKCFJU19FUlIoc3QtPnJlZykpIHsKIAkJcmVndWxhdG9yX2Rpc2FibGUoc3QtPnJlZyk7CiAJCXJlZ3VsYXRvcl9wdXQoc3QtPnJlZyk7CiAJfQotCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcyOThfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3Mjk4X3JpbmcuYwppbmRleCBhMDRjMDMzLi40NzYzMGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcyOThfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzI5OF9yaW5nLmMKQEAgLTcsMjcgKzcsMjQgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCi0jaW5jbHVkZSAiLi4vcmluZ19nZW5lcmljLmgiCisjaW5jbHVkZSAiLi4vYnVmZmVyX2dlbmVyaWMuaCIKICNpbmNsdWRlICIuLi9yaW5nX3N3LmgiCi0jaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgotI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiLi4vdHJpZ2dlcl9jb25zdW1lci5oIgogCiAjaW5jbHVkZSAiYWQ3Mjk4LmgiCiAKLWludCBhZDcyOThfc2Nhbl9mcm9tX3Jpbmcoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvLCBsb25nIGNoKQoraW50IGFkNzI5OF9zY2FuX2Zyb21fcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBsb25nIGNoKQogewotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBkZXZfaW5mby0+cmluZzsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+YnVmZmVyOwogCWludCByZXQ7CiAJdTE2ICpyaW5nX2RhdGE7CiAKLQlpZiAoIShyaW5nLT5zY2FuX21hc2sgJiAoMSA8PCBjaCkpKSB7CisJaWYgKCEodGVzdF9iaXQoY2gsIHJpbmctPnNjYW5fbWFzaykpKSB7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBlcnJvcl9yZXQ7CiAJfQpAQCAtNjAsNyArNTcsNyBAQAogc3RhdGljIGludCBhZDcyOThfcmluZ19wcmVlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKIAlzdHJ1Y3QgYWQ3Mjk4X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0Jc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+cmluZzsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+YnVmZmVyOwogCXNpemVfdCBkX3NpemU7CiAJaW50IGksIG07CiAJdW5zaWduZWQgc2hvcnQgY29tbWFuZDsKQEAgLTgyLDcgKzc5LDcgQEAKIAljb21tYW5kID0gQUQ3Mjk4X1dSSVRFIHwgc3QtPmV4dF9yZWY7CiAKIAlmb3IgKGkgPSAwLCBtID0gQUQ3Mjk4X0NIKDApOyBpIDwgQUQ3Mjk4X01BWF9DSEFOOyBpKyssIG0gPj49IDEpCi0JCWlmIChyaW5nLT5zY2FuX21hc2sgJiAoMSA8PCBpKSkKKwkJaWYgKHRlc3RfYml0KGksIHJpbmctPnNjYW5fbWFzaykpCiAJCQljb21tYW5kIHw9IG07CiAKIAlzdC0+dHhfYnVmWzBdID0gY3B1X3RvX2JlMTYoY29tbWFuZCk7CkBAIC0xMjAsOSArMTE3LDkgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBhZDcyOThfdHJpZ2dlcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnApCiB7CiAJc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmID0gcDsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPmluZGlvX2RldjsKIAlzdHJ1Y3QgYWQ3Mjk4X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0Jc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+cmluZzsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+YnVmZmVyOwogCXM2NCB0aW1lX25zOwogCV9fdTE2IGJ1ZlsxNl07CiAJaW50IGJfc2VudCwgaTsKQEAgLTE0MCwyOSArMTM3LDI5IEBACiAJZm9yIChpID0gMDsgaSA8IHJpbmctPnNjYW5fY291bnQ7IGkrKykKIAkJYnVmW2ldID0gYmUxNl90b19jcHUoc3QtPnJ4X2J1ZltpXSk7CiAKLQlpbmRpb19kZXYtPnJpbmctPmFjY2Vzcy0+c3RvcmVfdG8ocmluZywgKHU4ICopYnVmLCB0aW1lX25zKTsKKwlpbmRpb19kZXYtPmJ1ZmZlci0+YWNjZXNzLT5zdG9yZV90byhyaW5nLCAodTggKilidWYsIHRpbWVfbnMpOwogCWlpb190cmlnZ2VyX25vdGlmeV9kb25lKGluZGlvX2Rldi0+dHJpZyk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX3Jpbmdfc2V0dXBfb3BzIGFkNzI5OF9yaW5nX3NldHVwX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMgYWQ3Mjk4X3Jpbmdfc2V0dXBfb3BzID0gewogCS5wcmVlbmFibGUgPSAmYWQ3Mjk4X3JpbmdfcHJlZW5hYmxlLAotCS5wb3N0ZW5hYmxlID0gJmlpb190cmlnZ2VyZWRfcmluZ19wb3N0ZW5hYmxlLAotCS5wcmVkaXNhYmxlID0gJmlpb190cmlnZ2VyZWRfcmluZ19wcmVkaXNhYmxlLAorCS5wb3N0ZW5hYmxlID0gJmlpb190cmlnZ2VyZWRfYnVmZmVyX3Bvc3RlbmFibGUsCisJLnByZWRpc2FibGUgPSAmaWlvX3RyaWdnZXJlZF9idWZmZXJfcHJlZGlzYWJsZSwKIH07CiAKIGludCBhZDcyOThfcmVnaXN0ZXJfcmluZ19mdW5jc19hbmRfaW5pdChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCWludCByZXQ7CiAKLQlpbmRpb19kZXYtPnJpbmcgPSBpaW9fc3dfcmJfYWxsb2NhdGUoaW5kaW9fZGV2KTsKLQlpZiAoIWluZGlvX2Rldi0+cmluZykgeworCWluZGlvX2Rldi0+YnVmZmVyID0gaWlvX3N3X3JiX2FsbG9jYXRlKGluZGlvX2Rldik7CisJaWYgKCFpbmRpb19kZXYtPmJ1ZmZlcikgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycm9yX3JldDsKIAl9CiAJLyogRWZmZWN0aXZlbHkgc2VsZWN0IHRoZSByaW5nIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiAqLwotCWluZGlvX2Rldi0+cmluZy0+YWNjZXNzID0gJnJpbmdfc3dfYWNjZXNzX2Z1bmNzOworCWluZGlvX2Rldi0+YnVmZmVyLT5hY2Nlc3MgPSAmcmluZ19zd19hY2Nlc3NfZnVuY3M7CiAKIAlpbmRpb19kZXYtPnBvbGxmdW5jID0gaWlvX2FsbG9jX3BvbGxmdW5jKE5VTEwsCiAJCQkJCQkgJmFkNzI5OF90cmlnZ2VyX2hhbmRsZXIsCkBAIC0xNzcsMjYgKzE3NCwyMSBAQAogCX0KIAogCS8qIFJpbmcgYnVmZmVyIGZ1bmN0aW9ucyAtIGhlcmUgdHJpZ2dlciBzZXR1cCByZWxhdGVkICovCi0JaW5kaW9fZGV2LT5yaW5nLT5zZXR1cF9vcHMgPSAmYWQ3Mjk4X3Jpbmdfc2V0dXBfb3BzOwotCWluZGlvX2Rldi0+cmluZy0+c2Nhbl90aW1lc3RhbXAgPSB0cnVlOworCWluZGlvX2Rldi0+YnVmZmVyLT5zZXR1cF9vcHMgPSAmYWQ3Mjk4X3Jpbmdfc2V0dXBfb3BzOworCWluZGlvX2Rldi0+YnVmZmVyLT5zY2FuX3RpbWVzdGFtcCA9IHRydWU7CiAKIAkvKiBGbGFnIHRoYXQgcG9sbGVkIHJpbmcgYnVmZmVyaW5nIGlzIHBvc3NpYmxlICovCi0JaW5kaW9fZGV2LT5tb2RlcyB8PSBJTkRJT19SSU5HX1RSSUdHRVJFRDsKKwlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX0JVRkZFUl9UUklHR0VSRUQ7CiAJcmV0dXJuIDA7CiAKIGVycm9yX2RlYWxsb2NhdGVfc3dfcmI6Ci0JaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPmJ1ZmZlcik7CiBlcnJvcl9yZXQ6CiAJcmV0dXJuIHJldDsKIH0KIAogdm9pZCBhZDcyOThfcmluZ19jbGVhbnVwKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7Ci0JaWYgKGluZGlvX2Rldi0+dHJpZykgewotCQlpaW9fcHV0X3RyaWdnZXIoaW5kaW9fZGV2LT50cmlnKTsKLQkJaWlvX3RyaWdnZXJfZGV0dGFjaF9wb2xsX2Z1bmMoaW5kaW9fZGV2LT50cmlnLAotCQkJCQkgICAgICBpbmRpb19kZXYtPnBvbGxmdW5jKTsKLQl9CiAJaWlvX2RlYWxsb2NfcG9sbGZ1bmMoaW5kaW9fZGV2LT5wb2xsZnVuYyk7Ci0JaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPmJ1ZmZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDczMTQuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzMxNC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDcwZDljLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzMxNC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qCi0gKiBBRDczMTQgZGlnaXRhbCB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIGZvciBBRDczMTQsIEFEVDczMDEgYW5kIEFEVDczMDIKLSAqCi0gKiBDb3B5cmlnaHQgMjAxMCBBbmFsb2cgRGV2aWNlcyBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0KLSNpbmNsdWRlICIuLi9paW8uaCIKLSNpbmNsdWRlICIuLi9zeXNmcy5oIgotCi0vKgotICogQUQ3MzE0IHBvd2VyIG1vZGUKLSAqLwotI2RlZmluZSBBRDczMTRfUEQJCTB4MjAwMAotCi0vKgotICogQUQ3MzE0IHRlbXBlcmF0dXJlIG1hc2tzCi0gKi8KLSNkZWZpbmUgQUQ3MzE0X1RFTVBfU0lHTgkJMHgyMDAKLSNkZWZpbmUgQUQ3MzE0X1RFTVBfTUFTSwkJMHg3RkUwCi0jZGVmaW5lIEFENzMxNF9URU1QX09GRlNFVAkJNQotI2RlZmluZSBBRDczMTRfVEVNUF9GTE9BVF9PRkZTRVQJMgotI2RlZmluZSBBRDczMTRfVEVNUF9GTE9BVF9NQVNLCQkweDMKLQotLyoKLSAqIEFEVDczMDEgYW5kIEFEVDczMDIgdGVtcGVyYXR1cmUgbWFza3MKLSAqLwotI2RlZmluZSBBRFQ3MzAxX1RFTVBfU0lHTgkJMHgyMDAwCi0jZGVmaW5lIEFEVDczMDFfVEVNUF9NQVNLCQkweDJGRkYKLSNkZWZpbmUgQURUNzMwMV9URU1QX0ZMT0FUX09GRlNFVAk1Ci0jZGVmaW5lIEFEVDczMDFfVEVNUF9GTE9BVF9NQVNLCQkweDFGCi0KLS8qCi0gKiBzdHJ1Y3QgYWQ3MzE0X2NoaXBfaW5mbyAtIGNoaXAgc3BlY2lmYyBpbmZvcm1hdGlvbgotICovCi0KLXN0cnVjdCBhZDczMTRfY2hpcF9pbmZvIHsKLQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldjsKLQlzNjQgbGFzdF90aW1lc3RhbXA7Ci0JdTggIG1vZGU7Ci19OwotCi0vKgotICogYWQ3MzE0IHJlZ2lzdGVyIGFjY2VzcyBieSBTUEkKLSAqLwotCi1zdGF0aWMgaW50IGFkNzMxNF9zcGlfcmVhZChzdHJ1Y3QgYWQ3MzE0X2NoaXBfaW5mbyAqY2hpcCwgdTE2ICpkYXRhKQotewotCXN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2ID0gY2hpcC0+c3BpX2RldjsKLQlpbnQgcmV0ID0gMDsKLQl1MTYgdmFsdWU7Ci0KLQlyZXQgPSBzcGlfcmVhZChzcGlfZGV2LCAodTggKikmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnNwaV9kZXYtPmRldiwgIlNQSSByZWFkIGVycm9yXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkqZGF0YSA9IGJlMTZfdG9fY3B1KCh1MTYpdmFsdWUpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhZDczMTRfc3BpX3dyaXRlKHN0cnVjdCBhZDczMTRfY2hpcF9pbmZvICpjaGlwLCB1MTYgZGF0YSkKLXsKLQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldiA9IGNoaXAtPnNwaV9kZXY7Ci0JaW50IHJldCA9IDA7Ci0JdTE2IHZhbHVlID0gY3B1X3RvX2JlMTYoZGF0YSk7Ci0KLQlyZXQgPSBzcGlfd3JpdGUoc3BpX2RldiwgKHU4ICopJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2Vycigmc3BpX2Rldi0+ZGV2LCAiU1BJIHdyaXRlIGVycm9yXG4iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzMxNF9zaG93X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDczMTRfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCi0JaWYgKGNoaXAtPm1vZGUpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgInBvd2VyLXNhdmVcbiIpOwotCWVsc2UKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiZnVsbFxuIik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzMxNF9zdG9yZV9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3MzE0X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQl1MTYgbW9kZSA9IDA7Ci0JaW50IHJldDsKLQotCWlmICghc3RyY21wKGJ1ZiwgImZ1bGwiKSkKLQkJbW9kZSA9IEFENzMxNF9QRDsKLQotCXJldCA9IGFkNzMxNF9zcGlfd3JpdGUoY2hpcCwgbW9kZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIC1FSU87Ci0KLQljaGlwLT5tb2RlID0gbW9kZTsKLQotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIobW9kZSwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCWFkNzMxNF9zaG93X21vZGUsCi0JCWFkNzMxNF9zdG9yZV9tb2RlLAotCQkwKTsKLQotc3RhdGljIHNzaXplX3QgYWQ3MzE0X3Nob3dfYXZhaWxhYmxlX21vZGVzKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc3ByaW50ZihidWYsICJmdWxsXG5wb3dlci1zYXZlXG4iKTsKLX0KLQotc3RhdGljIElJT19ERVZJQ0VfQVRUUihhdmFpbGFibGVfbW9kZXMsIFNfSVJVR08sIGFkNzMxNF9zaG93X2F2YWlsYWJsZV9tb2RlcywgTlVMTCwgMCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzMxNF9zaG93X3RlbXBlcmF0dXJlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3MzE0X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQl1MTYgZGF0YTsKLQljaGFyIHNpZ24gPSAnICc7Ci0JaW50IHJldDsKLQotCWlmIChjaGlwLT5tb2RlKSB7Ci0JCXJldCA9IGFkNzMxNF9zcGlfd3JpdGUoY2hpcCwgMCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXQgPSBhZDczMTRfc3BpX3JlYWQoY2hpcCwgJmRhdGEpOwotCWlmIChyZXQpCi0JCXJldHVybiAtRUlPOwotCi0JaWYgKGNoaXAtPm1vZGUpCi0JCWFkNzMxNF9zcGlfd3JpdGUoY2hpcCwgY2hpcC0+bW9kZSk7Ci0KLQlpZiAoc3RyY21wKGRldl9pbmZvLT5uYW1lLCAiYWQ3MzE0IikpIHsKLQkJZGF0YSA9IChkYXRhICYgQUQ3MzE0X1RFTVBfTUFTSykgPj4KLQkJCUFENzMxNF9URU1QX09GRlNFVDsKLQkJaWYgKGRhdGEgJiBBRDczMTRfVEVNUF9TSUdOKSB7Ci0JCQlkYXRhID0gKEFENzMxNF9URU1QX1NJR04gPDwgMSkgLSBkYXRhOwotCQkJc2lnbiA9ICctJzsKLQkJfQotCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjJWQuJS4yZFxuIiwgc2lnbiwKLQkJCQlkYXRhID4+IEFENzMxNF9URU1QX0ZMT0FUX09GRlNFVCwKLQkJCQkoZGF0YSAmIEFENzMxNF9URU1QX0ZMT0FUX01BU0spICogMjUpOwotCX0gZWxzZSB7Ci0JCWRhdGEgJj0gQURUNzMwMV9URU1QX01BU0s7Ci0JCWlmIChkYXRhICYgQURUNzMwMV9URU1QX1NJR04pIHsKLQkJCWRhdGEgPSAoQURUNzMwMV9URU1QX1NJR04gPDwgMSkgLSBkYXRhOwotCQkJc2lnbiA9ICctJzsKLQkJfQotCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjJWQuJS41ZFxuIiwgc2lnbiwKLQkJCQlkYXRhID4+IEFEVDczMDFfVEVNUF9GTE9BVF9PRkZTRVQsCi0JCQkJKGRhdGEgJiBBRFQ3MzAxX1RFTVBfRkxPQVRfTUFTSykgKiAzMTI1KTsKLQl9Ci19Ci0KLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIodGVtcGVyYXR1cmUsIFNfSVJVR08sIGFkNzMxNF9zaG93X3RlbXBlcmF0dXJlLCBOVUxMLCAwKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNzMxNF9hdHRyaWJ1dGVzW10gPSB7Ci0JJmlpb19kZXZfYXR0cl9hdmFpbGFibGVfbW9kZXMuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX21vZGUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX3RlbXBlcmF0dXJlLmRldl9hdHRyLmF0dHIsCi0JTlVMTCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNzMxNF9hdHRyaWJ1dGVfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gYWQ3MzE0X2F0dHJpYnV0ZXMsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkNzMxNF9pbmZvID0gewotCS5hdHRycyA9ICZhZDczMTRfYXR0cmlidXRlX2dyb3VwLAotCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCi19OwotLyoKLSAqIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZlCi0gKi8KLQotc3RhdGljIGludCBfX2RldmluaXQgYWQ3MzE0X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2KQotewotCXN0cnVjdCBhZDczMTRfY2hpcF9pbmZvICpjaGlwOwotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7Ci0JaW50IHJldCA9IDA7Ci0KLQlpbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKHNpemVvZigqY2hpcCkpOwotCWlmIChpbmRpb19kZXYgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yX3JldDsKLQl9Ci0JY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0JLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRldmljZSByZW1vdmFsIHB1cnBvc2VzICovCi0JZGV2X3NldF9kcnZkYXRhKCZzcGlfZGV2LT5kZXYsIGNoaXApOwotCi0JY2hpcC0+c3BpX2RldiA9IHNwaV9kZXY7Ci0KLQlpbmRpb19kZXYtPm5hbWUgPSBzcGlfZ2V0X2RldmljZV9pZChzcGlfZGV2KS0+bmFtZTsKLQlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpX2Rldi0+ZGV2OwotCWluZGlvX2Rldi0+aW5mbyA9ICZhZDczMTRfaW5mbzsKLQotCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX2ZyZWVfZGV2OwotCi0JZGV2X2luZm8oJnNwaV9kZXYtPmRldiwgIiVzIHRlbXBlcmF0dXJlIHNlbnNvciByZWdpc3RlcmVkLlxuIiwKLQkJCSBpbmRpb19kZXYtPm5hbWUpOwotCi0JcmV0dXJuIDA7Ci1lcnJvcl9mcmVlX2RldjoKLQlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKLWVycm9yX3JldDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDczMTRfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2KQotewotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaV9kZXYtPmRldik7Ci0KLQlkZXZfc2V0X2RydmRhdGEoJnNwaV9kZXYtPmRldiwgTlVMTCk7Ci0JaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGFkNzMxNF9pZFtdID0gewotCXsgImFkdDczMDEiLCAwIH0sCi0JeyAiYWR0NzMwMiIsIDAgfSwKLQl7ICJhZDczMTQiLCAwIH0sCi0Je30KLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZDczMTRfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImFkNzMxNCIsCi0JCS5idXMgPSAmc3BpX2J1c190eXBlLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQl9LAotCS5wcm9iZSA9IGFkNzMxNF9wcm9iZSwKLQkucmVtb3ZlID0gX19kZXZleGl0X3AoYWQ3MzE0X3JlbW92ZSksCi0JLmlkX3RhYmxlID0gYWQ3MzE0X2lkLAotfTsKLQotc3RhdGljIF9faW5pdCBpbnQgYWQ3MzE0X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWQ3MzE0X2RyaXZlcik7Ci19Ci0KLXN0YXRpYyBfX2V4aXQgdm9pZCBhZDczMTRfZXhpdCh2b2lkKQotewotCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWQ3MzE0X2RyaXZlcik7Ci19Ci0KLU1PRFVMRV9BVVRIT1IoIlNvbmljIFpoYW5nIDxzb25pYy56aGFuZ0BhbmFsb2cuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRDczMTQsIEFEVDczMDEgYW5kIEFEVDczMDIgZGlnaXRhbCIKLQkJCSIgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotCi1tb2R1bGVfaW5pdChhZDczMTRfaW5pdCk7Ci1tb2R1bGVfZXhpdChhZDczMTRfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc0NzYuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzQ3Ni5oCmluZGV4IDBkNDQ5NzYuLjYwMTQyOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzQ3Ni5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzQ3Ni5oCkBAIC00OSwxMSArNDksMTEgQEAKIAlJRF9BRDc0OTUKIH07CiAKLSNpZmRlZiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSCisjaWZkZWYgQ09ORklHX0lJT19CVUZGRVIKIGludCBhZDc0NzZfc2Nhbl9mcm9tX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiBpbnQgYWQ3NDc2X3JlZ2lzdGVyX3JpbmdfZnVuY3NfYW5kX2luaXQoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiB2b2lkIGFkNzQ3Nl9yaW5nX2NsZWFudXAoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7Ci0jZWxzZSAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCisjZWxzZSAvKiBDT05GSUdfSUlPX0JVRkZFUiAqLwogc3RhdGljIGlubGluZSBpbnQgYWQ3NDc2X3NjYW5fZnJvbV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJcmV0dXJuIDA7CkBAIC02OCw1ICs2OCw1IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgYWQ3NDc2X3JpbmdfY2xlYW51cChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogfQotI2VuZGlmIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKyNlbmRpZiAvKiBDT05GSUdfSUlPX0JVRkZFUiAqLwogI2VuZGlmIC8qIElJT19BRENfQUQ3NDc2X0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc0NzZfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NDc2X2NvcmUuYwppbmRleCBjMjEwODk4Li5mZDc5ZmFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc0NzZfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzQ3Nl9jb3JlLmMKQEAgLTEzLDExICsxMywxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCi0jaW5jbHVkZSAiLi4vcmluZ19nZW5lcmljLmgiCi0jaW5jbHVkZSAiYWRjLmgiCisjaW5jbHVkZSAiLi4vYnVmZmVyX2dlbmVyaWMuaCIKIAogI2luY2x1ZGUgImFkNzQ3Ni5oIgogCkBAIC0zMiwyNCArMzIsMjQgQEAKIAlyZXR1cm4gKHN0LT5kYXRhWzBdIDw8IDgpIHwgc3QtPmRhdGFbMV07CiB9CiAKLXN0YXRpYyBpbnQgYWQ3NDc2X3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbywKK3N0YXRpYyBpbnQgYWQ3NDc2X3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCiAJCQkgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKIAkJCSAgIGludCAqdmFsLAogCQkJICAgaW50ICp2YWwyLAogCQkJICAgbG9uZyBtKQogewogCWludCByZXQ7Ci0Jc3RydWN0IGFkNzQ3Nl9zdGF0ZSAqc3QgPSBpaW9fcHJpdihkZXZfaW5mbyk7CisJc3RydWN0IGFkNzQ3Nl9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCXVuc2lnbmVkIGludCBzY2FsZV91djsKIAogCXN3aXRjaCAobSkgewogCWNhc2UgMDoKLQkJbXV0ZXhfbG9jaygmZGV2X2luZm8tPm1sb2NrKTsKLQkJaWYgKGlpb19yaW5nX2VuYWJsZWQoZGV2X2luZm8pKQotCQkJcmV0ID0gYWQ3NDc2X3NjYW5fZnJvbV9yaW5nKGRldl9pbmZvKTsKKwkJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJCWlmIChpaW9fYnVmZmVyX2VuYWJsZWQoaW5kaW9fZGV2KSkKKwkJCXJldCA9IGFkNzQ3Nl9zY2FuX2Zyb21fcmluZyhpbmRpb19kZXYpOwogCQllbHNlCiAJCQlyZXQgPSBhZDc0NzZfc2Nhbl9kaXJlY3Qoc3QpOwotCQltdXRleF91bmxvY2soJmRldl9pbmZvLT5tbG9jayk7CisJCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CiAKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwpAQCAtNjgsNDkgKzY4LDQ5IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWQ3NDc2X2NoaXBfaW5mbyBhZDc0NzZfY2hpcF9pbmZvX3RibFtdID0gewogCVtJRF9BRDc0NjZdID0gewotCQkuY2hhbm5lbFswXSA9IElJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgMCwgMCwKKwkJLmNoYW5uZWxbMF0gPSBJSU9fQ0hBTihJSU9fVk9MVEFHRSwgMCwgMSwgMCwgTlVMTCwgMCwgMCwKIAkJCQkgICAgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAogCQkJCSAgICAgICAwLCAwLCBJSU9fU1QoJ3UnLCAxMiwgMTYsIDApLCAwKSwKIAkJLmNoYW5uZWxbMV0gPSBJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCgxKSwKIAl9LAogCVtJRF9BRDc0NjddID0gewotCQkuY2hhbm5lbFswXSA9IElJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgMCwgMCwKKwkJLmNoYW5uZWxbMF0gPSBJSU9fQ0hBTihJSU9fVk9MVEFHRSwgMCwgMSwgMCwgTlVMTCwgMCwgMCwKIAkJCQkgICAgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAogCQkJCSAgICAgICAwLCAwLCBJSU9fU1QoJ3UnLCAxMCwgMTYsIDIpLCAwKSwKIAkJLmNoYW5uZWxbMV0gPSBJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCgxKSwKIAl9LAogCVtJRF9BRDc0NjhdID0gewotCQkuY2hhbm5lbFswXSA9IElJT19DSEFOKElJT19JTiwgMCwgMSAsIDAsIE5VTEwsIDAsIDAsCisJCS5jaGFubmVsWzBdID0gSUlPX0NIQU4oSUlPX1ZPTFRBR0UsIDAsIDEgLCAwLCBOVUxMLCAwLCAwLAogCQkJCSAgICAgICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCiAJCQkJICAgICAgIDAsIDAsIElJT19TVCgndScsIDgsIDE2LCA0KSwgMCksCiAJCS5jaGFubmVsWzFdID0gSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoMSksCiAJfSwKIAlbSURfQUQ3NDc1XSA9IHsKLQkJLmNoYW5uZWxbMF0gPSBJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDAsIDAsCisJCS5jaGFubmVsWzBdID0gSUlPX0NIQU4oSUlPX1ZPTFRBR0UsIDAsIDEsIDAsIE5VTEwsIDAsIDAsCiAJCQkJICAgICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKIAkJCQkgICAgICAgMCwgMCwgSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwgMCksCiAJCS5jaGFubmVsWzFdID0gSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoMSksCiAJfSwKIAlbSURfQUQ3NDc2XSA9IHsKLQkJLmNoYW5uZWxbMF0gPSBJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDAsIDAsCisJCS5jaGFubmVsWzBdID0gSUlPX0NIQU4oSUlPX1ZPTFRBR0UsIDAsIDEsIDAsIE5VTEwsIDAsIDAsCiAJCQkJICAgICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKIAkJCQkgICAgICAgMCwgMCwgSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwgMCksCiAJCS5jaGFubmVsWzFdID0gSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoMSksCiAJfSwKIAlbSURfQUQ3NDc3XSA9IHsKLQkJLmNoYW5uZWxbMF0gPSBJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDAsIDAsCisJCS5jaGFubmVsWzBdID0gSUlPX0NIQU4oSUlPX1ZPTFRBR0UsIDAsIDEsIDAsIE5VTEwsIDAsIDAsCiAJCQkJICAgICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKIAkJCQkgICAgICAgMCwgMCwgSUlPX1NUKCd1JywgMTAsIDE2LCAyKSwgMCksCiAJCS5jaGFubmVsWzFdID0gSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoMSksCiAJfSwKIAlbSURfQUQ3NDc4XSA9IHsKLQkJLmNoYW5uZWxbMF0gPSBJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDAsIDAsCisJCS5jaGFubmVsWzBdID0gSUlPX0NIQU4oSUlPX1ZPTFRBR0UsIDAsIDEsIDAsIE5VTEwsIDAsIDAsCiAJCQkJICAgICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKIAkJCQkgICAgICAgMCwgMCwgSUlPX1NUKCd1JywgOCwgMTYsIDQpLCAwKSwKIAkJLmNoYW5uZWxbMV0gPSBJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCgxKSwKIAl9LAogCVtJRF9BRDc0OTVdID0gewotCQkuY2hhbm5lbFswXSA9IElJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgMCwgMCwKKwkJLmNoYW5uZWxbMF0gPSBJSU9fQ0hBTihJSU9fVk9MVEFHRSwgMCwgMSwgMCwgTlVMTCwgMCwgMCwKIAkJCQkgICAgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAogCQkJCSAgICAgICAwLCAwLCBJSU9fU1QoJ3UnLCAxMiwgMTYsIDApLCAwKSwKIAkJLmNoYW5uZWxbMV0gPSBJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCgxKSwKQEAgLTEyOSw4ICsxMjksNiBAQAogCXN0cnVjdCBhZDc0NzZfc3RhdGUgKnN0OwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CiAJaW50IHJldCwgdm9sdGFnZV91diA9IDA7Ci0JYm9vbCByZWdfZG9uZSA9IGZhbHNlOwotCXN0cnVjdCByZWd1bGF0b3IgKnJlZzsKIAogCWluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2Uoc2l6ZW9mKCpzdCkpOwogCWlmIChpbmRpb19kZXYgPT0gTlVMTCkgewpAQCAtMTM4LDE1ICsxMzYsMTQgQEAKIAkJZ290byBlcnJvcl9yZXQ7CiAJfQogCXN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQlyZWcgPSByZWd1bGF0b3JfZ2V0KCZzcGktPmRldiwgInZjYyIpOwotCWlmICghSVNfRVJSKHJlZykpIHsKLQkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShyZWcpOworCXN0LT5yZWcgPSByZWd1bGF0b3JfZ2V0KCZzcGktPmRldiwgInZjYyIpOworCWlmICghSVNfRVJSKHN0LT5yZWcpKSB7CisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoc3QtPnJlZyk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGVycm9yX3B1dF9yZWc7CiAKLQkJdm9sdGFnZV91diA9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZShyZWcpOworCQl2b2x0YWdlX3V2ID0gcmVndWxhdG9yX2dldF92b2x0YWdlKHN0LT5yZWcpOwogCX0KLQlzdC0+cmVnID0gcmVnOwogCXN0LT5jaGlwX2luZm8gPQogCQkmYWQ3NDc2X2NoaXBfaW5mb190Ymxbc3BpX2dldF9kZXZpY2VfaWQoc3BpKS0+ZHJpdmVyX2RhdGFdOwogCkBAIC0xODIsMjggKzE3OSwyOSBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfZGlzYWJsZV9yZWc7CiAKLQlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcl9kaXNhYmxlX3JlZzsKLQotCXJldCA9IGlpb19yaW5nX2J1ZmZlcl9yZWdpc3Rlcl9leChpbmRpb19kZXYtPnJpbmcsIDAsCi0JCQkJCSAgc3QtPmNoaXBfaW5mby0+Y2hhbm5lbCwKLQkJCQkJICBBUlJBWV9TSVpFKHN0LT5jaGlwX2luZm8tPmNoYW5uZWwpKTsKKwlyZXQgPSBpaW9fYnVmZmVyX3JlZ2lzdGVyKGluZGlvX2RldiwKKwkJCQkgIHN0LT5jaGlwX2luZm8tPmNoYW5uZWwsCisJCQkJICBBUlJBWV9TSVpFKHN0LT5jaGlwX2luZm8tPmNoYW5uZWwpKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX2NsZWFudXBfcmluZzsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JpbmdfdW5yZWdpc3RlcjsKIAlyZXR1cm4gMDsKIAorZXJyb3JfcmluZ191bnJlZ2lzdGVyOgorCWlpb19idWZmZXJfdW5yZWdpc3RlcihpbmRpb19kZXYpOwogZXJyb3JfY2xlYW51cF9yaW5nOgogCWFkNzQ3Nl9yaW5nX2NsZWFudXAoaW5kaW9fZGV2KTsKLQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIGVycm9yX2Rpc2FibGVfcmVnOgotCWlmICghSVNfRVJSKHJlZykpCisJaWYgKCFJU19FUlIoc3QtPnJlZykpCiAJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT5yZWcpOwogZXJyb3JfcHV0X3JlZzoKLQlpZiAoIUlTX0VSUihyZWcpKQotCQlyZWd1bGF0b3JfcHV0KHJlZyk7Ci0JaWYgKCFyZWdfZG9uZSkKLQkJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CisJaWYgKCFJU19FUlIoc3QtPnJlZykpCisJCXJlZ3VsYXRvcl9wdXQoc3QtPnJlZyk7CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CisKIGVycm9yX3JldDoKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjEyLDE2ICsyMTAsMTUgQEAKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CiAJc3RydWN0IGFkNzQ3Nl9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCS8qIGNvcHkgbmVlZGVkIGFzIHN0IHdpbGwgaGF2ZSBiZWVuIGZyZWVkICovCi0Jc3RydWN0IHJlZ3VsYXRvciAqcmVnID0gc3QtPnJlZzsKIAotCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldi0+cmluZyk7Ci0JYWQ3NDc2X3JpbmdfY2xlYW51cChpbmRpb19kZXYpOwogCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwotCWlmICghSVNfRVJSKHJlZykpIHsKLQkJcmVndWxhdG9yX2Rpc2FibGUocmVnKTsKLQkJcmVndWxhdG9yX3B1dChyZWcpOworCWlpb19idWZmZXJfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWFkNzQ3Nl9yaW5nX2NsZWFudXAoaW5kaW9fZGV2KTsKKwlpZiAoIUlTX0VSUihzdC0+cmVnKSkgeworCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnKTsKKwkJcmVndWxhdG9yX3B1dChzdC0+cmVnKTsKIAl9CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzQ3Nl9yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc0NzZfcmluZy5jCmluZGV4IGE5MmZjNWEuLmU4MmMxYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzQ3Nl9yaW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NDc2X3JpbmcuYwpAQCAtMTEsMjAgKzExLDE4IEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCi0jaW5jbHVkZSAiLi4vcmluZ19nZW5lcmljLmgiCisjaW5jbHVkZSAiLi4vYnVmZmVyX2dlbmVyaWMuaCIKICNpbmNsdWRlICIuLi9yaW5nX3N3LmgiCi0jaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgotI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiLi4vdHJpZ2dlcl9jb25zdW1lci5oIgogCiAjaW5jbHVkZSAiYWQ3NDc2LmgiCiAKIGludCBhZDc0NzZfc2Nhbl9mcm9tX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKLQlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gaW5kaW9fZGV2LT5yaW5nOworCXN0cnVjdCBpaW9fYnVmZmVyICpyaW5nID0gaW5kaW9fZGV2LT5idWZmZXI7CiAJaW50IHJldDsKIAl1OCAqcmluZ19kYXRhOwogCkBAIC01Niw3ICs1NCw3IEBACiBzdGF0aWMgaW50IGFkNzQ3Nl9yaW5nX3ByZWVuYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCXN0cnVjdCBhZDc0NzZfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gaW5kaW9fZGV2LT5yaW5nOworCXN0cnVjdCBpaW9fYnVmZmVyICpyaW5nID0gaW5kaW9fZGV2LT5idWZmZXI7CiAKIAlzdC0+ZF9zaXplID0gcmluZy0+c2Nhbl9jb3VudCAqCiAJCXN0LT5jaGlwX2luZm8tPmNoYW5uZWxbMF0uc2Nhbl90eXBlLnN0b3JhZ2ViaXRzIC8gODsKQEAgLTY4LDkgKzY2LDkgQEAKIAkJCXN0LT5kX3NpemUgKz0gc2l6ZW9mKHM2NCkgLSAoc3QtPmRfc2l6ZSAlIHNpemVvZihzNjQpKTsKIAl9CiAKLQlpZiAoaW5kaW9fZGV2LT5yaW5nLT5hY2Nlc3MtPnNldF9ieXRlc19wZXJfZGF0dW0pCi0JCWluZGlvX2Rldi0+cmluZy0+YWNjZXNzLT5zZXRfYnl0ZXNfcGVyX2RhdHVtKGluZGlvX2Rldi0+cmluZywKLQkJCQkJCQkgICAgc3QtPmRfc2l6ZSk7CisJaWYgKGluZGlvX2Rldi0+YnVmZmVyLT5hY2Nlc3MtPnNldF9ieXRlc19wZXJfZGF0dW0pCisJCWluZGlvX2Rldi0+YnVmZmVyLT5hY2Nlc3MtPgorCQkJc2V0X2J5dGVzX3Blcl9kYXR1bShpbmRpb19kZXYtPmJ1ZmZlciwgc3QtPmRfc2l6ZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc4LDcgKzc2LDcgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBhZDc0NzZfdHJpZ2dlcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgICpwKQogewogCXN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZiA9IHA7Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5pbmRpb19kZXY7CiAJc3RydWN0IGFkNzQ3Nl9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCXM2NCB0aW1lX25zOwogCV9fdTggKnJ4YnVmOwpAQCAtOTUsMTEgKzkzLDExIEBACiAKIAl0aW1lX25zID0gaWlvX2dldF90aW1lX25zKCk7CiAKLQlpZiAoaW5kaW9fZGV2LT5yaW5nLT5zY2FuX3RpbWVzdGFtcCkKKwlpZiAoaW5kaW9fZGV2LT5idWZmZXItPnNjYW5fdGltZXN0YW1wKQogCQltZW1jcHkocnhidWYgKyBzdC0+ZF9zaXplIC0gc2l6ZW9mKHM2NCksCiAJCQkmdGltZV9ucywgc2l6ZW9mKHRpbWVfbnMpKTsKIAotCWluZGlvX2Rldi0+cmluZy0+YWNjZXNzLT5zdG9yZV90byhpbmRpb19kZXYtPnJpbmcsIHJ4YnVmLCB0aW1lX25zKTsKKwlpbmRpb19kZXYtPmJ1ZmZlci0+YWNjZXNzLT5zdG9yZV90byhpbmRpb19kZXYtPmJ1ZmZlciwgcnhidWYsIHRpbWVfbnMpOwogZG9uZToKIAlpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShpbmRpb19kZXYtPnRyaWcpOwogCWtmcmVlKHJ4YnVmKTsKQEAgLTEwNywxMCArMTA1LDEwIEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGlpb19yaW5nX3NldHVwX29wcyBhZDc0NzZfcmluZ19zZXR1cF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19idWZmZXJfc2V0dXBfb3BzIGFkNzQ3Nl9yaW5nX3NldHVwX29wcyA9IHsKIAkucHJlZW5hYmxlID0gJmFkNzQ3Nl9yaW5nX3ByZWVuYWJsZSwKLQkucG9zdGVuYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcG9zdGVuYWJsZSwKLQkucHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcHJlZGlzYWJsZSwKKwkucG9zdGVuYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wb3N0ZW5hYmxlLAorCS5wcmVkaXNhYmxlID0gJmlpb190cmlnZ2VyZWRfYnVmZmVyX3ByZWRpc2FibGUsCiB9OwogCiBpbnQgYWQ3NDc2X3JlZ2lzdGVyX3JpbmdfZnVuY3NfYW5kX2luaXQoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKQEAgLTExOCwxMyArMTE2LDEzIEBACiAJc3RydWN0IGFkNzQ3Nl9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCWludCByZXQgPSAwOwogCi0JaW5kaW9fZGV2LT5yaW5nID0gaWlvX3N3X3JiX2FsbG9jYXRlKGluZGlvX2Rldik7Ci0JaWYgKCFpbmRpb19kZXYtPnJpbmcpIHsKKwlpbmRpb19kZXYtPmJ1ZmZlciA9IGlpb19zd19yYl9hbGxvY2F0ZShpbmRpb19kZXYpOworCWlmICghaW5kaW9fZGV2LT5idWZmZXIpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcl9yZXQ7CiAJfQogCS8qIEVmZmVjdGl2ZWx5IHNlbGVjdCB0aGUgcmluZyBidWZmZXIgaW1wbGVtZW50YXRpb24gKi8KLQlpbmRpb19kZXYtPnJpbmctPmFjY2VzcyA9ICZyaW5nX3N3X2FjY2Vzc19mdW5jczsKKwlpbmRpb19kZXYtPmJ1ZmZlci0+YWNjZXNzID0gJnJpbmdfc3dfYWNjZXNzX2Z1bmNzOwogCWluZGlvX2Rldi0+cG9sbGZ1bmMKIAkJPSBpaW9fYWxsb2NfcG9sbGZ1bmMoTlVMTCwKIAkJCQkgICAgICZhZDc0NzZfdHJpZ2dlcl9oYW5kbGVyLApAQCAtMTM5LDI3ICsxMzcsMjEgQEAKIAl9CiAKIAkvKiBSaW5nIGJ1ZmZlciBmdW5jdGlvbnMgLSBoZXJlIHRyaWdnZXIgc2V0dXAgcmVsYXRlZCAqLwotCWluZGlvX2Rldi0+cmluZy0+c2V0dXBfb3BzID0gJmFkNzQ3Nl9yaW5nX3NldHVwX29wczsKLQlpbmRpb19kZXYtPnJpbmctPnNjYW5fdGltZXN0YW1wID0gdHJ1ZTsKKwlpbmRpb19kZXYtPmJ1ZmZlci0+c2V0dXBfb3BzID0gJmFkNzQ3Nl9yaW5nX3NldHVwX29wczsKKwlpbmRpb19kZXYtPmJ1ZmZlci0+c2Nhbl90aW1lc3RhbXAgPSB0cnVlOwogCiAJLyogRmxhZyB0aGF0IHBvbGxlZCByaW5nIGJ1ZmZlcmluZyBpcyBwb3NzaWJsZSAqLwotCWluZGlvX2Rldi0+bW9kZXMgfD0gSU5ESU9fUklOR19UUklHR0VSRUQ7CisJaW5kaW9fZGV2LT5tb2RlcyB8PSBJTkRJT19CVUZGRVJfVFJJR0dFUkVEOwogCXJldHVybiAwOwogCiBlcnJvcl9kZWFsbG9jYXRlX3N3X3JiOgotCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7CisJaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5idWZmZXIpOwogZXJyb3JfcmV0OgogCXJldHVybiByZXQ7CiB9CiAKIHZvaWQgYWQ3NDc2X3JpbmdfY2xlYW51cChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewotCS8qIGVuc3VyZSB0aGF0IHRoZSB0cmlnZ2VyIGhhcyBiZWVuIGRldGFjaGVkICovCi0JaWYgKGluZGlvX2Rldi0+dHJpZykgewotCQlpaW9fcHV0X3RyaWdnZXIoaW5kaW9fZGV2LT50cmlnKTsKLQkJaWlvX3RyaWdnZXJfZGV0dGFjaF9wb2xsX2Z1bmMoaW5kaW9fZGV2LT50cmlnLAotCQkJCQkgICAgICBpbmRpb19kZXYtPnBvbGxmdW5jKTsKLQl9CiAJaWlvX2RlYWxsb2NfcG9sbGZ1bmMoaW5kaW9fZGV2LT5wb2xsZnVuYyk7Ci0JaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPmJ1ZmZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc2MDYuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzYwNi5oCmluZGV4IGI4YjNkOGUuLjM1MDE4YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzYwNi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzYwNi5oCkBAIC01MCw4ICs1MCw2IEBACiAKIHN0cnVjdCBhZDc2MDZfY2hpcF9pbmZvIHsKIAljb25zdCBjaGFyCQkJKm5hbWU7Ci0JdTgJCQkJYml0czsKLQljaGFyCQkJCXNpZ247CiAJdTE2CQkJCWludF92cmVmX212OwogCXN0cnVjdCBpaW9fY2hhbl9zcGVjCQkqY2hhbm5lbHM7CiAJdW5zaWduZWQJCQludW1fY2hhbm5lbHM7CkBAIC02OCwxOCArNjYsMTAgQEAKIAlzdHJ1Y3QgcmVndWxhdG9yCQkqcmVnOwogCXN0cnVjdCB3b3JrX3N0cnVjdAkJcG9sbF93b3JrOwogCXdhaXRfcXVldWVfaGVhZF90CQl3cV9kYXRhX2F2YWlsOwotCXNpemVfdAkJCQlkX3NpemU7CiAJY29uc3Qgc3RydWN0IGFkNzYwNl9idXNfb3BzCSpib3BzOwotCWludAkJCQlpcnE7Ci0JdW5zaWduZWQJCQlpZDsKIAl1bnNpZ25lZAkJCXJhbmdlOwogCXVuc2lnbmVkCQkJb3ZlcnNhbXBsaW5nOwogCWJvb2wJCQkJZG9uZTsKLQlib29sCQkJCWhhdmVfZnJzdGRhdGE7Ci0JYm9vbAkJCQloYXZlX29zOwotCWJvb2wJCQkJaGF2ZV9zdGJ5OwotCWJvb2wJCQkJaGF2ZV9yZXNldDsKLQlib29sCQkJCWhhdmVfcmFuZ2U7CiAJdm9pZCBfX2lvbWVtCQkJKmJhc2VfYWRkcmVzczsKIAogCS8qCkBAIC0xMDAsNyArOTAsNyBAQAogc3RydWN0IGlpb19kZXYgKmFkNzYwNl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpcnEsCiAJCQkgICAgICB2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcywgdW5zaWduZWQgaWQsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgYWQ3NjA2X2J1c19vcHMgKmJvcHMpOwotaW50IGFkNzYwNl9yZW1vdmUoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CitpbnQgYWQ3NjA2X3JlbW92ZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCBpbnQgaXJxKTsKIGludCBhZDc2MDZfcmVzZXQoc3RydWN0IGFkNzYwNl9zdGF0ZSAqc3QpOwogCiBlbnVtIGFkNzYwNl9zdXBwb3J0ZWRfZGV2aWNlX2lkcyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc2MDZfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NjA2X2NvcmUuYwppbmRleCA0NTkzNzFhLi41NDQyM2FiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc2MDZfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzYwNl9jb3JlLmMKQEAgLTE2LDE3ICsxNiwxNyBAQAogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi9zeXNmcy5oIgotI2luY2x1ZGUgIi4uL3JpbmdfZ2VuZXJpYy5oIgotI2luY2x1ZGUgImFkYy5oIgorI2luY2x1ZGUgIi4uL2J1ZmZlcl9nZW5lcmljLmgiCiAKICNpbmNsdWRlICJhZDc2MDYuaCIKIAogaW50IGFkNzYwNl9yZXNldChzdHJ1Y3QgYWQ3NjA2X3N0YXRlICpzdCkKIHsKLQlpZiAoc3QtPmhhdmVfcmVzZXQpIHsKKwlpZiAoZ3Bpb19pc192YWxpZChzdC0+cGRhdGEtPmdwaW9fcmVzZXQpKSB7CiAJCWdwaW9fc2V0X3ZhbHVlKHN0LT5wZGF0YS0+Z3Bpb19yZXNldCwgMSk7CiAJCW5kZWxheSgxMDApOyAvKiB0X3Jlc2V0ID49IDEwMG5zICovCiAJCWdwaW9fc2V0X3ZhbHVlKHN0LT5wZGF0YS0+Z3Bpb19yZXNldCwgMCk7CkBAIC00OCw3ICs0OCw3IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9yZXQ7CiAKLQlpZiAoc3QtPmhhdmVfZnJzdGRhdGEpIHsKKwlpZiAoZ3Bpb19pc192YWxpZChzdC0+cGRhdGEtPmdwaW9fZnJzdGRhdGEpKSB7CiAJCXJldCA9IHN0LT5ib3BzLT5yZWFkX2Jsb2NrKHN0LT5kZXYsIDEsIHN0LT5kYXRhKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyb3JfcmV0OwpAQCAtOTAsNyArOTAsNyBAQAogCXN3aXRjaCAobSkgewogCWNhc2UgMDoKIAkJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7Ci0JCWlmIChpaW9fcmluZ19lbmFibGVkKGluZGlvX2RldikpCisJCWlmIChpaW9fYnVmZmVyX2VuYWJsZWQoaW5kaW9fZGV2KSkKIAkJCXJldCA9IGFkNzYwNl9zY2FuX2Zyb21fcmluZyhpbmRpb19kZXYsIGNoYW4tPmFkZHJlc3MpOwogCQllbHNlCiAJCQlyZXQgPSBhZDc2MDZfc2Nhbl9kaXJlY3QoaW5kaW9fZGV2LCBjaGFuLT5hZGRyZXNzKTsKQEAgLTE0MCw5ICsxNDAsOSBAQAogCXJldHVybiBjb3VudDsKIH0KIAotc3RhdGljIElJT19ERVZJQ0VfQVRUUihyYW5nZSwgU19JUlVHTyB8IFNfSVdVU1IsIFwKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW5fdm9sdGFnZV9yYW5nZSwgU19JUlVHTyB8IFNfSVdVU1IsIFwKIAkJICAgICAgIGFkNzYwNl9zaG93X3JhbmdlLCBhZDc2MDZfc3RvcmVfcmFuZ2UsIDApOwotc3RhdGljIElJT19DT05TVF9BVFRSKHJhbmdlX2F2YWlsYWJsZSwgIjUwMDAgMTAwMDAiKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihpbl92b2x0YWdlX3JhbmdlX2F2YWlsYWJsZSwgIjUwMDAgMTAwMDAiKTsKIAogc3RhdGljIHNzaXplX3QgYWQ3NjA2X3Nob3dfb3ZlcnNhbXBsaW5nX3JhdGlvKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCkBAIC0xOTgsOCArMTk4LDggQEAKIHN0YXRpYyBJSU9fQ09OU1RfQVRUUihvdmVyc2FtcGxpbmdfcmF0aW9fYXZhaWxhYmxlLCAiMCAyIDQgOCAxNiAzMiA2NCIpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3NjA2X2F0dHJpYnV0ZXNbXSA9IHsKLQkmaWlvX2Rldl9hdHRyX3JhbmdlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19jb25zdF9hdHRyX3JhbmdlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fdm9sdGFnZV9yYW5nZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbl92b2x0YWdlX3JhbmdlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAogCSZpaW9fZGV2X2F0dHJfb3ZlcnNhbXBsaW5nX3JhdGlvLmRldl9hdHRyLmF0dHIsCiAJJmlpb19jb25zdF9hdHRyX292ZXJzYW1wbGluZ19yYXRpb19hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKIAlOVUxMLApAQCAtMjE0LDE1ICsyMTQsMTggQEAKIAogCW1vZGVfdCBtb2RlID0gYXR0ci0+bW9kZTsKIAotCWlmICghc3QtPmhhdmVfb3MgJiYKLQkJKGF0dHIgPT0gJmlpb19kZXZfYXR0cl9vdmVyc2FtcGxpbmdfcmF0aW8uZGV2X2F0dHIuYXR0ciB8fAotCQlhdHRyID09Ci0JCSZpaW9fY29uc3RfYXR0cl9vdmVyc2FtcGxpbmdfcmF0aW9fYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIpKQorCWlmICghKGdwaW9faXNfdmFsaWQoc3QtPnBkYXRhLT5ncGlvX29zMCkgJiYKKwkgICAgICBncGlvX2lzX3ZhbGlkKHN0LT5wZGF0YS0+Z3Bpb19vczEpICYmCisJICAgICAgZ3Bpb19pc192YWxpZChzdC0+cGRhdGEtPmdwaW9fb3MyKSkgJiYKKwkgICAgKGF0dHIgPT0gJmlpb19kZXZfYXR0cl9vdmVyc2FtcGxpbmdfcmF0aW8uZGV2X2F0dHIuYXR0ciB8fAorCSAgICAgYXR0ciA9PQorCSAgICAgJmlpb19jb25zdF9hdHRyX292ZXJzYW1wbGluZ19yYXRpb19hdmFpbGFibGUuZGV2X2F0dHIuYXR0cikpCiAJCW1vZGUgPSAwOwotCWVsc2UgaWYgKCFzdC0+aGF2ZV9yYW5nZSAmJgotCQkoYXR0ciA9PSAmaWlvX2Rldl9hdHRyX3JhbmdlLmRldl9hdHRyLmF0dHIgfHwKLQkJYXR0ciA9PSAmaWlvX2NvbnN0X2F0dHJfcmFuZ2VfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIpKQotCQkJbW9kZSA9IDA7CisJZWxzZSBpZiAoIWdwaW9faXNfdmFsaWQoc3QtPnBkYXRhLT5ncGlvX3JhbmdlKSAmJgorCQkgKGF0dHIgPT0gJmlpb19kZXZfYXR0cl9pbl92b2x0YWdlX3JhbmdlLmRldl9hdHRyLmF0dHIgfHwKKwkJICBhdHRyID09CisJCSAgJmlpb19jb25zdF9hdHRyX2luX3ZvbHRhZ2VfcmFuZ2VfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIpKQorCQltb2RlID0gMDsKIAogCXJldHVybiBtb2RlOwogfQpAQCAtMjMyLDY5ICsyMzUsNDMgQEAKIAkuaXNfdmlzaWJsZSA9IGFkNzYwNl9hdHRyX2lzX3Zpc2libGUsCiB9OwogCisjZGVmaW5lIEFENzYwNl9DSEFOTkVMKG51bSkJCQkJXAorCXsJCQkJCQlcCisJCS50eXBlID0gSUlPX1ZPTFRBR0UsCQkJXAorCQkuaW5kZXhlZCA9IDEsCQkJCVwKKwkJLmNoYW5uZWwgPSBudW0sCQkJCVwKKwkJLmFkZHJlc3MgPSBudW0sCQkJCVwKKwkJLnNjYW5faW5kZXggPSBudW0sCQkJXAorCQkuc2Nhbl90eXBlID0gSUlPX1NUKCdzJywgMTYsIDE2LCAwKSwJXAorCX0KKwogc3RhdGljIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGFkNzYwNl84X2NoYW5uZWxzW10gPSB7Ci0JSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAwLCAwLAotCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkgMCwgMCwgSUlPX1NUKCdzJywgMTYsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAxLCAwLAotCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkgMSwgMSwgSUlPX1NUKCdzJywgMTYsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAyLCAwLAotCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkgMiwgMiwgSUlPX1NUKCdzJywgMTYsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAzLCAwLAotCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkgMywgMywgSUlPX1NUKCdzJywgMTYsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCA0LCAwLAotCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkgNCwgNCwgSUlPX1NUKCdzJywgMTYsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCA1LCAwLAotCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkgNSwgNSwgSUlPX1NUKCdzJywgMTYsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCA2LCAwLAotCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkgNiwgNiwgSUlPX1NUKCdzJywgMTYsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCA3LCAwLAotCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkgNywgNywgSUlPX1NUKCdzJywgMTYsIDE2LCAwKSwgMCksCisJQUQ3NjA2X0NIQU5ORUwoMCksCisJQUQ3NjA2X0NIQU5ORUwoMSksCisJQUQ3NjA2X0NIQU5ORUwoMiksCisJQUQ3NjA2X0NIQU5ORUwoMyksCisJQUQ3NjA2X0NIQU5ORUwoNCksCisJQUQ3NjA2X0NIQU5ORUwoNSksCisJQUQ3NjA2X0NIQU5ORUwoNiksCisJQUQ3NjA2X0NIQU5ORUwoNyksCiAJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoOCksCiB9OwogCiBzdGF0aWMgc3RydWN0IGlpb19jaGFuX3NwZWMgYWQ3NjA2XzZfY2hhbm5lbHNbXSA9IHsKLQlJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDAsIDAsCi0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCSAwLCAwLCBJSU9fU1QoJ3MnLCAxNiwgMTYsIDApLCAwKSwKLQlJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDEsIDAsCi0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCSAxLCAxLCBJSU9fU1QoJ3MnLCAxNiwgMTYsIDApLCAwKSwKLQlJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDIsIDAsCi0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCSAyLCAyLCBJSU9fU1QoJ3MnLCAxNiwgMTYsIDApLCAwKSwKLQlJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDMsIDAsCi0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCSAzLCAzLCBJSU9fU1QoJ3MnLCAxNiwgMTYsIDApLCAwKSwKLQlJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDQsIDAsCi0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCSA0LCA0LCBJSU9fU1QoJ3MnLCAxNiwgMTYsIDApLCAwKSwKLQlJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDUsIDAsCi0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCSA1LCA1LCBJSU9fU1QoJ3MnLCAxNiwgMTYsIDApLCAwKSwKKwlBRDc2MDZfQ0hBTk5FTCgwKSwKKwlBRDc2MDZfQ0hBTk5FTCgxKSwKKwlBRDc2MDZfQ0hBTk5FTCgyKSwKKwlBRDc2MDZfQ0hBTk5FTCgzKSwKKwlBRDc2MDZfQ0hBTk5FTCg0KSwKKwlBRDc2MDZfQ0hBTk5FTCg1KSwKIAlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCg2KSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBhZDc2MDZfNF9jaGFubmVsc1tdID0gewotCUlJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgMCwgMCwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJIDAsIDAsIElJT19TVCgncycsIDE2LCAxNiwgMCksIDApLAotCUlJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgMSwgMCwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJIDEsIDEsIElJT19TVCgncycsIDE2LCAxNiwgMCksIDApLAotCUlJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgMiwgMCwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJIDIsIDIsIElJT19TVCgncycsIDE2LCAxNiwgMCksIDApLAotCUlJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgMywgMCwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJIDMsIDMsIElJT19TVCgncycsIDE2LCAxNiwgMCksIDApLAorCUFENzYwNl9DSEFOTkVMKDApLAorCUFENzYwNl9DSEFOTkVMKDEpLAorCUFENzYwNl9DSEFOTkVMKDIpLAorCUFENzYwNl9DSEFOTkVMKDMpLAogCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDQpLAogfTsKIApAQCAtMzQ2LDY0ICszMjMsOTYgQEAKIAl9OwogCWludCByZXQ7CiAKLQlyZXQgPSBncGlvX3JlcXVlc3Rfb25lKHN0LT5wZGF0YS0+Z3Bpb19jb252c3QsIEdQSU9GX09VVF9JTklUX0xPVywKLQkJCSAgICAgICAiQUQ3NjA2X0NPTlZTVCIpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihzdC0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgR1BJTyBDT05WU1RcbiIpOwotCQlyZXR1cm4gcmV0OworCWlmIChncGlvX2lzX3ZhbGlkKHN0LT5wZGF0YS0+Z3Bpb19jb252c3QpKSB7CisJCXJldCA9IGdwaW9fcmVxdWVzdF9vbmUoc3QtPnBkYXRhLT5ncGlvX2NvbnZzdCwKKwkJCQkgICAgICAgR1BJT0ZfT1VUX0lOSVRfTE9XLAorCQkJCSAgICAgICAiQUQ3NjA2X0NPTlZTVCIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKHN0LT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCBHUElPIENPTlZTVFxuIik7CisJCQlnb3RvIGVycm9yX3JldDsKKwkJfQorCX0gZWxzZSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyb3JfcmV0OwogCX0KIAotCXJldCA9IGdwaW9fcmVxdWVzdF9hcnJheShncGlvX2FycmF5LCBBUlJBWV9TSVpFKGdwaW9fYXJyYXkpKTsKLQlpZiAoIXJldCkgewotCQlzdC0+aGF2ZV9vcyA9IHRydWU7CisJaWYgKGdwaW9faXNfdmFsaWQoc3QtPnBkYXRhLT5ncGlvX29zMCkgJiYKKwkgICAgZ3Bpb19pc192YWxpZChzdC0+cGRhdGEtPmdwaW9fb3MxKSAmJgorCSAgICBncGlvX2lzX3ZhbGlkKHN0LT5wZGF0YS0+Z3Bpb19vczIpKSB7CisJCXJldCA9IGdwaW9fcmVxdWVzdF9hcnJheShncGlvX2FycmF5LCBBUlJBWV9TSVpFKGdwaW9fYXJyYXkpKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycm9yX2ZyZWVfY29udnN0OwogCX0KIAotCXJldCA9IGdwaW9fcmVxdWVzdF9vbmUoc3QtPnBkYXRhLT5ncGlvX3Jlc2V0LCBHUElPRl9PVVRfSU5JVF9MT1csCi0JCQkgICAgICAgIkFENzYwNl9SRVNFVCIpOwotCWlmICghcmV0KQotCQlzdC0+aGF2ZV9yZXNldCA9IHRydWU7CisJaWYgKGdwaW9faXNfdmFsaWQoc3QtPnBkYXRhLT5ncGlvX3Jlc2V0KSkgeworCQlyZXQgPSBncGlvX3JlcXVlc3Rfb25lKHN0LT5wZGF0YS0+Z3Bpb19yZXNldCwKKwkJCQkgICAgICAgR1BJT0ZfT1VUX0lOSVRfTE9XLAorCQkJCSAgICAgICAiQUQ3NjA2X1JFU0VUIik7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJvcl9mcmVlX29zOworCX0KIAotCXJldCA9IGdwaW9fcmVxdWVzdF9vbmUoc3QtPnBkYXRhLT5ncGlvX3JhbmdlLCBHUElPRl9ESVJfT1VUIHwKLQkJCQkoKHN0LT5yYW5nZSA9PSAxMDAwMCkgPyBHUElPRl9JTklUX0hJR0ggOgotCQkJCUdQSU9GX0lOSVRfTE9XKSwgIkFENzYwNl9SQU5HRSIpOwotCWlmICghcmV0KQotCQlzdC0+aGF2ZV9yYW5nZSA9IHRydWU7Ci0KLQlyZXQgPSBncGlvX3JlcXVlc3Rfb25lKHN0LT5wZGF0YS0+Z3Bpb19zdGJ5LCBHUElPRl9PVVRfSU5JVF9ISUdILAotCQkJICAgICAgICJBRDc2MDZfU1RCWSIpOwotCWlmICghcmV0KQotCQlzdC0+aGF2ZV9zdGJ5ID0gdHJ1ZTsKKwlpZiAoZ3Bpb19pc192YWxpZChzdC0+cGRhdGEtPmdwaW9fcmFuZ2UpKSB7CisJCXJldCA9IGdwaW9fcmVxdWVzdF9vbmUoc3QtPnBkYXRhLT5ncGlvX3JhbmdlLCBHUElPRl9ESVJfT1VUIHwKKwkJCQkgICAgICAgKChzdC0+cmFuZ2UgPT0gMTAwMDApID8gR1BJT0ZfSU5JVF9ISUdIIDoKKwkJCQkJR1BJT0ZfSU5JVF9MT1cpLCAiQUQ3NjA2X1JBTkdFIik7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJvcl9mcmVlX3Jlc2V0OworCX0KKwlpZiAoZ3Bpb19pc192YWxpZChzdC0+cGRhdGEtPmdwaW9fc3RieSkpIHsKKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0X29uZShzdC0+cGRhdGEtPmdwaW9fc3RieSwKKwkJCQkgICAgICAgR1BJT0ZfT1VUX0lOSVRfSElHSCwKKwkJCQkgICAgICAgIkFENzYwNl9TVEJZIik7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnJvcl9mcmVlX3JhbmdlOworCX0KIAogCWlmIChncGlvX2lzX3ZhbGlkKHN0LT5wZGF0YS0+Z3Bpb19mcnN0ZGF0YSkpIHsKIAkJcmV0ID0gZ3Bpb19yZXF1ZXN0X29uZShzdC0+cGRhdGEtPmdwaW9fZnJzdGRhdGEsIEdQSU9GX0lOLAogCQkJCSAgICAgICAiQUQ3NjA2X0ZSU1REQVRBIik7Ci0JCWlmICghcmV0KQotCQkJc3QtPmhhdmVfZnJzdGRhdGEgPSB0cnVlOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3JfZnJlZV9zdGJ5OwogCX0KIAogCXJldHVybiAwOworCitlcnJvcl9mcmVlX3N0Ynk6CisJaWYgKGdwaW9faXNfdmFsaWQoc3QtPnBkYXRhLT5ncGlvX3N0YnkpKQorCQlncGlvX2ZyZWUoc3QtPnBkYXRhLT5ncGlvX3N0YnkpOworZXJyb3JfZnJlZV9yYW5nZToKKwlpZiAoZ3Bpb19pc192YWxpZChzdC0+cGRhdGEtPmdwaW9fcmFuZ2UpKQorCQlncGlvX2ZyZWUoc3QtPnBkYXRhLT5ncGlvX3JhbmdlKTsKK2Vycm9yX2ZyZWVfcmVzZXQ6CisJaWYgKGdwaW9faXNfdmFsaWQoc3QtPnBkYXRhLT5ncGlvX3Jlc2V0KSkKKwkJZ3Bpb19mcmVlKHN0LT5wZGF0YS0+Z3Bpb19yZXNldCk7CitlcnJvcl9mcmVlX29zOgorCWlmIChncGlvX2lzX3ZhbGlkKHN0LT5wZGF0YS0+Z3Bpb19vczApICYmCisJICAgIGdwaW9faXNfdmFsaWQoc3QtPnBkYXRhLT5ncGlvX29zMSkgJiYKKwkgICAgZ3Bpb19pc192YWxpZChzdC0+cGRhdGEtPmdwaW9fb3MyKSkKKwkJZ3Bpb19mcmVlX2FycmF5KGdwaW9fYXJyYXksIEFSUkFZX1NJWkUoZ3Bpb19hcnJheSkpOworZXJyb3JfZnJlZV9jb252c3Q6CisJZ3Bpb19mcmVlKHN0LT5wZGF0YS0+Z3Bpb19jb252c3QpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGFkNzYwNl9mcmVlX2dwaW9zKHN0cnVjdCBhZDc2MDZfc3RhdGUgKnN0KQogewotCWlmIChzdC0+aGF2ZV9yYW5nZSkKLQkJZ3Bpb19mcmVlKHN0LT5wZGF0YS0+Z3Bpb19yYW5nZSk7Ci0KLQlpZiAoc3QtPmhhdmVfc3RieSkKLQkJZ3Bpb19mcmVlKHN0LT5wZGF0YS0+Z3Bpb19zdGJ5KTsKLQotCWlmIChzdC0+aGF2ZV9vcykgewotCQlncGlvX2ZyZWUoc3QtPnBkYXRhLT5ncGlvX29zMCk7Ci0JCWdwaW9fZnJlZShzdC0+cGRhdGEtPmdwaW9fb3MxKTsKLQkJZ3Bpb19mcmVlKHN0LT5wZGF0YS0+Z3Bpb19vczIpOwotCX0KLQotCWlmIChzdC0+aGF2ZV9yZXNldCkKLQkJZ3Bpb19mcmVlKHN0LT5wZGF0YS0+Z3Bpb19yZXNldCk7Ci0KLQlpZiAoc3QtPmhhdmVfZnJzdGRhdGEpCisJaWYgKGdwaW9faXNfdmFsaWQoc3QtPnBkYXRhLT5ncGlvX2Zyc3RkYXRhKSkKIAkJZ3Bpb19mcmVlKHN0LT5wZGF0YS0+Z3Bpb19mcnN0ZGF0YSk7Ci0KKwlpZiAoZ3Bpb19pc192YWxpZChzdC0+cGRhdGEtPmdwaW9fc3RieSkpCisJCWdwaW9fZnJlZShzdC0+cGRhdGEtPmdwaW9fc3RieSk7CisJaWYgKGdwaW9faXNfdmFsaWQoc3QtPnBkYXRhLT5ncGlvX3JhbmdlKSkKKwkJZ3Bpb19mcmVlKHN0LT5wZGF0YS0+Z3Bpb19yYW5nZSk7CisJaWYgKGdwaW9faXNfdmFsaWQoc3QtPnBkYXRhLT5ncGlvX3Jlc2V0KSkKKwkJZ3Bpb19mcmVlKHN0LT5wZGF0YS0+Z3Bpb19yZXNldCk7CisJaWYgKGdwaW9faXNfdmFsaWQoc3QtPnBkYXRhLT5ncGlvX29zMCkgJiYKKwkgICAgZ3Bpb19pc192YWxpZChzdC0+cGRhdGEtPmdwaW9fb3MxKSAmJgorCSAgICBncGlvX2lzX3ZhbGlkKHN0LT5wZGF0YS0+Z3Bpb19vczIpKSB7CisJCWdwaW9fZnJlZShzdC0+cGRhdGEtPmdwaW9fb3MyKTsKKwkJZ3Bpb19mcmVlKHN0LT5wZGF0YS0+Z3Bpb19vczEpOworCQlncGlvX2ZyZWUoc3QtPnBkYXRhLT5ncGlvX29zMCk7CisJfQogCWdwaW9fZnJlZShzdC0+cGRhdGEtPmdwaW9fY29udnN0KTsKIH0KIApAQCAtNDE1LDcgKzQyNCw3IEBACiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9pZDsKIAlzdHJ1Y3QgYWQ3NjA2X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKLQlpZiAoaWlvX3JpbmdfZW5hYmxlZChpbmRpb19kZXYpKSB7CisJaWYgKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpKSB7CiAJCWlmICghd29ya19wZW5kaW5nKCZzdC0+cG9sbF93b3JrKSkKIAkJCXNjaGVkdWxlX3dvcmsoJnN0LT5wb2xsX3dvcmspOwogCX0gZWxzZSB7CkBAIC00MzksNyArNDQ4LDcgQEAKIHsKIAlzdHJ1Y3QgYWQ3NjA2X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBhZDc2MDZfc3RhdGUgKnN0OwotCWludCByZXQsIHJlZ2RvbmUgPSAwOworCWludCByZXQ7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2Uoc2l6ZW9mKCpzdCkpOwogCiAJaWYgKGluZGlvX2RldiA9PSBOVUxMKSB7CkBAIC00NTAsOCArNDU5LDYgQEAKIAlzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKIAlzdC0+ZGV2ID0gZGV2OwotCXN0LT5pZCA9IGlkOwotCXN0LT5pcnEgPSBpcnE7CiAJc3QtPmJvcHMgPSBib3BzOwogCXN0LT5iYXNlX2FkZHJlc3MgPSBiYXNlX2FkZHJlc3M7CiAJc3QtPnJhbmdlID0gcGRhdGEtPmRlZmF1bHRfcmFuZ2UgPT0gMTAwMDAgPyAxMDAwMCA6IDUwMDA7CkBAIC00OTIsNyArNDk5LDcgQEAKIAlpZiAocmV0KQogCQlkZXZfd2FybihzdC0+ZGV2LCAiZmFpbGVkIHRvIFJFU0VUOiBubyBSRVNFVCBHUElPIHNwZWNpZmllZFxuIik7CiAKLQlyZXQgPSByZXF1ZXN0X2lycShzdC0+aXJxLCBhZDc2MDZfaW50ZXJydXB0LAorCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgYWQ3NjA2X2ludGVycnVwdCwKIAkJSVJRRl9UUklHR0VSX0ZBTExJTkcsIHN0LT5jaGlwX2luZm8tPm5hbWUsIGluZGlvX2Rldik7CiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9mcmVlX2dwaW9zOwpAQCAtNTAxLDI0ICs1MDgsMjQgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX2ZyZWVfaXJxOwogCi0JcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfZnJlZV9pcnE7Ci0JcmVnZG9uZSA9IDE7Ci0KLQlyZXQgPSBpaW9fcmluZ19idWZmZXJfcmVnaXN0ZXJfZXgoaW5kaW9fZGV2LT5yaW5nLCAwLAotCQkJCQkgIGluZGlvX2Rldi0+Y2hhbm5lbHMsCi0JCQkJCSAgaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMpOworCXJldCA9IGlpb19idWZmZXJfcmVnaXN0ZXIoaW5kaW9fZGV2LAorCQkJCSAgaW5kaW9fZGV2LT5jaGFubmVscywKKwkJCQkgIGluZGlvX2Rldi0+bnVtX2NoYW5uZWxzKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX2NsZWFudXBfcmluZzsKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl91bnJlZ2lzdGVyX3Jpbmc7CiAKIAlyZXR1cm4gaW5kaW9fZGV2OworZXJyb3JfdW5yZWdpc3Rlcl9yaW5nOgorCWlpb19idWZmZXJfdW5yZWdpc3RlcihpbmRpb19kZXYpOwogCiBlcnJvcl9jbGVhbnVwX3Jpbmc6CiAJYWQ3NjA2X3JpbmdfY2xlYW51cChpbmRpb19kZXYpOwogCiBlcnJvcl9mcmVlX2lycToKLQlmcmVlX2lycShzdC0+aXJxLCBpbmRpb19kZXYpOworCWZyZWVfaXJxKGlycSwgaW5kaW9fZGV2KTsKIAogZXJyb3JfZnJlZV9ncGlvczoKIAlhZDc2MDZfZnJlZV9ncGlvcyhzdCk7CkBAIC01MjksMjkgKzUzNiwyNyBAQAogZXJyb3JfcHV0X3JlZzoKIAlpZiAoIUlTX0VSUihzdC0+cmVnKSkKIAkJcmVndWxhdG9yX3B1dChzdC0+cmVnKTsKLQlpZiAocmVnZG9uZSkKLQkJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7Ci0JZWxzZQotCQlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIGVycm9yX3JldDoKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQogCi1pbnQgYWQ3NjA2X3JlbW92ZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoraW50IGFkNzYwNl9yZW1vdmUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgaW50IGlycSkKIHsKIAlzdHJ1Y3QgYWQ3NjA2X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKLQlpaW9fcmluZ19idWZmZXJfdW5yZWdpc3RlcihpbmRpb19kZXYtPnJpbmcpOworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlpb19idWZmZXJfdW5yZWdpc3RlcihpbmRpb19kZXYpOwogCWFkNzYwNl9yaW5nX2NsZWFudXAoaW5kaW9fZGV2KTsKIAotCWZyZWVfaXJxKHN0LT5pcnEsIGluZGlvX2Rldik7CisJZnJlZV9pcnEoaXJxLCBpbmRpb19kZXYpOwogCWlmICghSVNfRVJSKHN0LT5yZWcpKSB7CiAJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT5yZWcpOwogCQlyZWd1bGF0b3JfcHV0KHN0LT5yZWcpOwogCX0KIAogCWFkNzYwNl9mcmVlX2dwaW9zKHN0KTsKLQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtNTYwLDggKzU2NSw4IEBACiB7CiAJc3RydWN0IGFkNzYwNl9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCi0JaWYgKHN0LT5oYXZlX3N0YnkpIHsKLQkJaWYgKHN0LT5oYXZlX3JhbmdlKQorCWlmIChncGlvX2lzX3ZhbGlkKHN0LT5wZGF0YS0+Z3Bpb19zdGJ5KSkgeworCQlpZiAoZ3Bpb19pc192YWxpZChzdC0+cGRhdGEtPmdwaW9fcmFuZ2UpKQogCQkJZ3Bpb19zZXRfdmFsdWUoc3QtPnBkYXRhLT5ncGlvX3JhbmdlLCAxKTsKIAkJZ3Bpb19zZXRfdmFsdWUoc3QtPnBkYXRhLT5ncGlvX3N0YnksIDApOwogCX0KQEAgLTU3MSw4ICs1NzYsOCBAQAogewogCXN0cnVjdCBhZDc2MDZfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAotCWlmIChzdC0+aGF2ZV9zdGJ5KSB7Ci0JCWlmIChzdC0+aGF2ZV9yYW5nZSkKKwlpZiAoZ3Bpb19pc192YWxpZChzdC0+cGRhdGEtPmdwaW9fc3RieSkpIHsKKwkJaWYgKGdwaW9faXNfdmFsaWQoc3QtPnBkYXRhLT5ncGlvX3JhbmdlKSkKIAkJCWdwaW9fc2V0X3ZhbHVlKHN0LT5wZGF0YS0+Z3Bpb19yYW5nZSwKIAkJCQkJc3QtPnJhbmdlID09IDEwMDAwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NjA2X3Bhci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NjA2X3Bhci5jCmluZGV4IGQyMTIxOGQuLjY4ODYzMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzYwNl9wYXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc2MDZfcGFyLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCXN0cnVjdCBhZDc2MDZfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAotCWFkNzYwNl9yZW1vdmUoaW5kaW9fZGV2KTsKKwlhZDc2MDZfcmVtb3ZlKGluZGlvX2RldiwgcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKSk7CiAKIAlpb3VubWFwKHN0LT5iYXNlX2FkZHJlc3MpOwogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc2MDZfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NjA2X3JpbmcuYwppbmRleCBhMTk5YmY0Li4yMDkyN2ZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc2MDZfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzYwNl9yaW5nLmMKQEAgLTEwLDE5ICsxMCwxNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCi0jaW5jbHVkZSAiLi4vcmluZ19nZW5lcmljLmgiCisjaW5jbHVkZSAiLi4vYnVmZmVyX2dlbmVyaWMuaCIKICNpbmNsdWRlICIuLi9yaW5nX3N3LmgiCi0jaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgotI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiLi4vdHJpZ2dlcl9jb25zdW1lci5oIgogCiAjaW5jbHVkZSAiYWQ3NjA2LmgiCiAKIGludCBhZDc2MDZfc2Nhbl9mcm9tX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgdW5zaWduZWQgY2gpCiB7Ci0Jc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+cmluZzsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+YnVmZmVyOwogCWludCByZXQ7CiAJdTE2ICpyaW5nX2RhdGE7CiAKQEAgLTQ1LDQ1ICs0MywxMyBAQAogfQogCiAvKioKLSAqIGFkNzYwNl9yaW5nX3ByZWVuYWJsZSgpIHNldHVwIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSByaW5nIGJlZm9yZSBlbmFibGluZwotICoKLSAqIFRoZSBjb21wbGV4IG5hdHVyZSBvZiB0aGUgc2V0dGluZyBvZiB0aGUgbnViZXIgb2YgYnl0ZXMgcGVyIGRhdHVtIGlzIGR1ZQotICogdG8gdGhpcyBkcml2ZXIgY3VycmVudGx5IGVuc3VyaW5nIHRoYXQgdGhlIHRpbWVzdGFtcCBpcyBzdG9yZWQgYXQgYW4gOAotICogYnl0ZSBib3VuZGFyeS4KLSAqKi8KLXN0YXRpYyBpbnQgYWQ3NjA2X3JpbmdfcHJlZW5hYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCi17Ci0Jc3RydWN0IGFkNzYwNl9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBpbmRpb19kZXYtPnJpbmc7Ci0Jc2l6ZV90IGRfc2l6ZTsKLQotCWRfc2l6ZSA9IHN0LT5jaGlwX2luZm8tPm51bV9jaGFubmVscyAqCi0JCSBzdC0+Y2hpcF9pbmZvLT5jaGFubmVsc1swXS5zY2FuX3R5cGUuc3RvcmFnZWJpdHMgLyA4OwotCi0JaWYgKHJpbmctPnNjYW5fdGltZXN0YW1wKSB7Ci0JCWRfc2l6ZSArPSBzaXplb2YoczY0KTsKLQotCQlpZiAoZF9zaXplICUgc2l6ZW9mKHM2NCkpCi0JCQlkX3NpemUgKz0gc2l6ZW9mKHM2NCkgLSAoZF9zaXplICUgc2l6ZW9mKHM2NCkpOwotCX0KLQotCWlmIChyaW5nLT5hY2Nlc3MtPnNldF9ieXRlc19wZXJfZGF0dW0pCi0JCXJpbmctPmFjY2Vzcy0+c2V0X2J5dGVzX3Blcl9kYXR1bShyaW5nLCBkX3NpemUpOwotCi0Jc3QtPmRfc2l6ZSA9IGRfc2l6ZTsKLQotCXJldHVybiAwOwotfQotCi0vKioKICAqIGFkNzYwNl90cmlnZ2VyX2hhbmRsZXJfdGgoKSB0aC9iaCBvZiB0cmlnZ2VyIGxhdW5jaGVkIHBvbGxpbmcgdG8gcmluZyBidWZmZXIKICAqCiAgKiovCiBzdGF0aWMgaXJxcmV0dXJuX3QgYWQ3NjA2X3RyaWdnZXJfaGFuZGxlcl90aF9iaChpbnQgaXJxLCB2b2lkICpwKQogewogCXN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZiA9IHA7Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGFkNzYwNl9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXN0cnVjdCBhZDc2MDZfc3RhdGUgKnN0ID0gaWlvX3ByaXYocGYtPmluZGlvX2Rldik7CiAKIAlncGlvX3NldF92YWx1ZShzdC0+cGRhdGEtPmdwaW9fY29udnN0LCAxKTsKIApAQCAtMTA0LDE2ICs3MCwxNyBAQAogCXN0cnVjdCBhZDc2MDZfc3RhdGUgKnN0ID0gY29udGFpbmVyX29mKHdvcmtfcywgc3RydWN0IGFkNzYwNl9zdGF0ZSwKIAkJCQkJCXBvbGxfd29yayk7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGlpb19wcml2X3RvX2RldihzdCk7Ci0Jc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+cmluZzsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+YnVmZmVyOwogCXM2NCB0aW1lX25zOwogCV9fdTggKmJ1ZjsKIAlpbnQgcmV0OwogCi0JYnVmID0ga3phbGxvYyhzdC0+ZF9zaXplLCBHRlBfS0VSTkVMKTsKKwlidWYgPSBremFsbG9jKHJpbmctPmFjY2Vzcy0+Z2V0X2J5dGVzX3Blcl9kYXR1bShyaW5nKSwKKwkJICAgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKGJ1ZiA9PSBOVUxMKQogCQlyZXR1cm47CiAKLQlpZiAoc3QtPmhhdmVfZnJzdGRhdGEpIHsKKwlpZiAoZ3Bpb19pc192YWxpZChzdC0+cGRhdGEtPmdwaW9fZnJzdGRhdGEpKSB7CiAJCXJldCA9IHN0LT5ib3BzLT5yZWFkX2Jsb2NrKHN0LT5kZXYsIDEsIGJ1Zik7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGRvbmU7CkBAIC0xNDAsMjAgKzEwNywyMCBAQAogCXRpbWVfbnMgPSBpaW9fZ2V0X3RpbWVfbnMoKTsKIAogCWlmIChyaW5nLT5zY2FuX3RpbWVzdGFtcCkKLQkJbWVtY3B5KGJ1ZiArIHN0LT5kX3NpemUgLSBzaXplb2YoczY0KSwKLQkJCSZ0aW1lX25zLCBzaXplb2YodGltZV9ucykpOworCQkqKChzNjQgKikoYnVmICsgcmluZy0+YWNjZXNzLT5nZXRfYnl0ZXNfcGVyX2RhdHVtKHJpbmcpIC0KKwkJCSAgc2l6ZW9mKHM2NCkpKSA9IHRpbWVfbnM7CiAKLQlyaW5nLT5hY2Nlc3MtPnN0b3JlX3RvKGluZGlvX2Rldi0+cmluZywgYnVmLCB0aW1lX25zKTsKKwlyaW5nLT5hY2Nlc3MtPnN0b3JlX3RvKGluZGlvX2Rldi0+YnVmZmVyLCBidWYsIHRpbWVfbnMpOwogZG9uZToKIAlncGlvX3NldF92YWx1ZShzdC0+cGRhdGEtPmdwaW9fY29udnN0LCAwKTsKIAlpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShpbmRpb19kZXYtPnRyaWcpOwogCWtmcmVlKGJ1Zik7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX3Jpbmdfc2V0dXBfb3BzIGFkNzYwNl9yaW5nX3NldHVwX29wcyA9IHsKLQkucHJlZW5hYmxlID0gJmFkNzYwNl9yaW5nX3ByZWVuYWJsZSwKLQkucG9zdGVuYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcG9zdGVuYWJsZSwKLQkucHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcHJlZGlzYWJsZSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMgYWQ3NjA2X3Jpbmdfc2V0dXBfb3BzID0geworCS5wcmVlbmFibGUgPSAmaWlvX3N3X2J1ZmZlcl9wcmVlbmFibGUsCisJLnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZSwKKwkucHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNhYmxlLAogfTsKIAogaW50IGFkNzYwNl9yZWdpc3Rlcl9yaW5nX2Z1bmNzX2FuZF9pbml0KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCkBAIC0xNjEsMTQgKzEyOCwxNiBAQAogCXN0cnVjdCBhZDc2MDZfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlpbnQgcmV0OwogCi0JaW5kaW9fZGV2LT5yaW5nID0gaWlvX3N3X3JiX2FsbG9jYXRlKGluZGlvX2Rldik7Ci0JaWYgKCFpbmRpb19kZXYtPnJpbmcpIHsKKwlpbmRpb19kZXYtPmJ1ZmZlciA9IGlpb19zd19yYl9hbGxvY2F0ZShpbmRpb19kZXYpOworCWlmICghaW5kaW9fZGV2LT5idWZmZXIpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcl9yZXQ7CiAJfQogCiAJLyogRWZmZWN0aXZlbHkgc2VsZWN0IHRoZSByaW5nIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiAqLwotCWluZGlvX2Rldi0+cmluZy0+YWNjZXNzID0gJnJpbmdfc3dfYWNjZXNzX2Z1bmNzOworCWluZGlvX2Rldi0+YnVmZmVyLT5hY2Nlc3MgPSAmcmluZ19zd19hY2Nlc3NfZnVuY3M7CisJaW5kaW9fZGV2LT5idWZmZXItPmJwZSA9CisJCXN0LT5jaGlwX2luZm8tPmNoYW5uZWxzWzBdLnNjYW5fdHlwZS5zdG9yYWdlYml0cyAvIDg7CiAJaW5kaW9fZGV2LT5wb2xsZnVuYyA9IGlpb19hbGxvY19wb2xsZnVuYygmYWQ3NjA2X3RyaWdnZXJfaGFuZGxlcl90aF9iaCwKIAkJCQkJCSAmYWQ3NjA2X3RyaWdnZXJfaGFuZGxlcl90aF9iaCwKIAkJCQkJCSAwLApAQCAtMTgzLDI4ICsxNTIsMjMgQEAKIAogCS8qIFJpbmcgYnVmZmVyIGZ1bmN0aW9ucyAtIGhlcmUgdHJpZ2dlciBzZXR1cCByZWxhdGVkICovCiAKLQlpbmRpb19kZXYtPnJpbmctPnNldHVwX29wcyA9ICZhZDc2MDZfcmluZ19zZXR1cF9vcHM7Ci0JaW5kaW9fZGV2LT5yaW5nLT5zY2FuX3RpbWVzdGFtcCA9IHRydWUgOworCWluZGlvX2Rldi0+YnVmZmVyLT5zZXR1cF9vcHMgPSAmYWQ3NjA2X3Jpbmdfc2V0dXBfb3BzOworCWluZGlvX2Rldi0+YnVmZmVyLT5zY2FuX3RpbWVzdGFtcCA9IHRydWUgOwogCiAJSU5JVF9XT1JLKCZzdC0+cG9sbF93b3JrLCAmYWQ3NjA2X3BvbGxfYmhfdG9fcmluZyk7CiAKIAkvKiBGbGFnIHRoYXQgcG9sbGVkIHJpbmcgYnVmZmVyaW5nIGlzIHBvc3NpYmxlICovCi0JaW5kaW9fZGV2LT5tb2RlcyB8PSBJTkRJT19SSU5HX1RSSUdHRVJFRDsKKwlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX0JVRkZFUl9UUklHR0VSRUQ7CiAJcmV0dXJuIDA7CiAKIGVycm9yX2RlYWxsb2NhdGVfc3dfcmI6Ci0JaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPmJ1ZmZlcik7CiBlcnJvcl9yZXQ6CiAJcmV0dXJuIHJldDsKIH0KIAogdm9pZCBhZDc2MDZfcmluZ19jbGVhbnVwKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7Ci0JaWYgKGluZGlvX2Rldi0+dHJpZykgewotCQlpaW9fcHV0X3RyaWdnZXIoaW5kaW9fZGV2LT50cmlnKTsKLQkJaWlvX3RyaWdnZXJfZGV0dGFjaF9wb2xsX2Z1bmMoaW5kaW9fZGV2LT50cmlnLAotCQkJCQkgICAgICBpbmRpb19kZXYtPnBvbGxmdW5jKTsKLQl9CiAJaWlvX2RlYWxsb2NfcG9sbGZ1bmMoaW5kaW9fZGV2LT5wb2xsZnVuYyk7Ci0JaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPmJ1ZmZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc2MDZfc3BpLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc2MDZfc3BpLmMKaW5kZXggMDc2OWM4MC4uYWVkZTFiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NjA2X3NwaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzYwNl9zcGkuYwpAQCAtNTksNyArNTksNyBAQAogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKIAotCXJldHVybiBhZDc2MDZfcmVtb3ZlKGluZGlvX2Rldik7CisJcmV0dXJuIGFkNzYwNl9yZW1vdmUoaW5kaW9fZGV2LCBzcGktPmlycSk7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzc0NS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NzQ1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMTNmMjYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NzQ1LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NzQgKzAsMCBAQAotLyoKLSAqIEFENzc0WCBjYXBhY2l0aXZlIHNlbnNvciBkcml2ZXIgc3VwcG9ydGluZyBBRDc3NDUvNi83Ci0gKgotICogQ29weXJpZ2h0IDIwMTAgQW5hbG9nIERldmljZXMgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLQotI2luY2x1ZGUgIi4uL2lpby5oIgotI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCi0KLS8qCi0gKiBBRDc3NFggcmVnaXN0ZXJzIGRlZmluaXRpb24KLSAqLwotCi0jZGVmaW5lIEFENzc0WF9TVEFUVVMJCTAKLSNkZWZpbmUgQUQ3NzRYX1NUQVRVU19SRFkJKDEgPDwgMikKLSNkZWZpbmUgQUQ3NzRYX1NUQVRVU19SRFlWVAkoMSA8PCAxKQotI2RlZmluZSBBRDc3NFhfU1RBVFVTX1JEWUNBUAkoMSA8PCAwKQotI2RlZmluZSBBRDc3NFhfQ0FQX0RBVEFfSElHSAkxCi0jZGVmaW5lIEFENzc0WF9DQVBfREFUQV9NSUQJMgotI2RlZmluZSBBRDc3NFhfQ0FQX0RBVEFfTE9XCTMKLSNkZWZpbmUgQUQ3NzRYX1ZUX0RBVEFfSElHSAk0Ci0jZGVmaW5lIEFENzc0WF9WVF9EQVRBX01JRAk1Ci0jZGVmaW5lIEFENzc0WF9WVF9EQVRBX0xPVwk2Ci0jZGVmaW5lIEFENzc0WF9DQVBfU0VUVVAJNwotI2RlZmluZSBBRDc3NFhfVlRfU0VUVVAJCTgKLSNkZWZpbmUgQUQ3NzRYX0VYRUNfU0VUVVAJOQotI2RlZmluZSBBRDc3NFhfQ0ZHCQkxMAotI2RlZmluZSBBRDc3NFhfQ0FQREFDQQkJMTEKLSNkZWZpbmUgQUQ3NzRYX0NBUERBQ0IJCTEyCi0jZGVmaW5lIEFENzc0WF9DQVBEQUNfRU4JKDEgPDwgNykKLSNkZWZpbmUgQUQ3NzRYX0NBUF9PRkZICQkxMwotI2RlZmluZSBBRDc3NFhfQ0FQX09GRkwJCTE0Ci0jZGVmaW5lIEFENzc0WF9DQVBfR0FJTkgJMTUKLSNkZWZpbmUgQUQ3NzRYX0NBUF9HQUlOTAkxNgotI2RlZmluZSBBRDc3NFhfVk9MVF9HQUlOSAkxNwotI2RlZmluZSBBRDc3NFhfVk9MVF9HQUlOTAkxOAotCi0jZGVmaW5lIEFENzc0WF9NQVhfQ09OVl9NT0RFCTYKLQotLyoKLSAqIHN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvIC0gY2hpcCBzcGVjaWZjIGluZm9ybWF0aW9uCi0gKi8KLQotc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7Ci0JYm9vbCBpbnRlcjsKLQl1MTYgY2FwX29mZnM7ICAgICAgICAgICAgICAgICAgIC8qIENhcGFjaXRpdmUgb2Zmc2V0ICovCi0JdTE2IGNhcF9nYWluOyAgICAgICAgICAgICAgICAgICAvKiBDYXBhY2l0aXZlIGdhaW4gY2FsaWJyYXRpb24gKi8KLQl1MTYgdm9sdF9nYWluOyAgICAgICAgICAgICAgICAgIC8qIFZvbHRhZ2UgZ2FpbiBjYWxpYnJhdGlvbiAqLwotCXU4ICBjYXBfc2V0dXA7Ci0JdTggIHZ0X3NldHVwOwotCXU4ICBleGVjX3NldHVwOwotCi0JY2hhciAqY29udmVyc2lvbl9tb2RlOwotfTsKLQotc3RydWN0IGFkNzc0eF9jb252ZXJzaW9uX21vZGUgewotCWNoYXIgKm5hbWU7Ci0JdTggcmVnX2NmZzsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYWQ3NzR4X2NvbnZlcnNpb25fbW9kZQotYWQ3NzR4X2NvbnZfbW9kZV90YWJsZVtBRDc3NFhfTUFYX0NPTlZfTU9ERV0gPSB7Ci0JeyAiaWRsZSIsIDAgfSwKLQl7ICJjb250aW51b3VzLWNvbnZlcnNpb24iLCAxIH0sCi0JeyAic2luZ2xlLWNvbnZlcnNpb24iLCAyIH0sCi0JeyAicG93ZXItZG93biIsIDMgfSwKLQl7ICJvZmZzZXQtY2FsaWJyYXRpb24iLCA1IH0sCi0JeyAiZ2Fpbi1jYWxpYnJhdGlvbiIsIDYgfSwKLX07Ci0KLS8qCi0gKiBhZDc3NHggcmVnaXN0ZXIgYWNjZXNzIGJ5IEkyQwotICovCi0KLXN0YXRpYyBpbnQgYWQ3NzR4X2kyY19yZWFkKHN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwLCB1OCByZWcsIHU4ICpkYXRhLCBpbnQgbGVuKQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7Ci0JaW50IHJldDsKLQotCXJldCA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsICZyZWcsIDEpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSTJDIHdyaXRlIGVycm9yXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCBkYXRhLCBsZW4pOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSTJDIHJlYWQgZXJyb3JcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYWQ3NzR4X2kyY193cml0ZShzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCwgdTggcmVnLCB1OCBkYXRhKQotewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7Ci0JaW50IHJldDsKLQotCXU4IHR4WzJdID0gewotCQlyZWcsCi0JCWRhdGEsCi0JfTsKLQotCXJldCA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIHR4LCAyKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgd3JpdGUgZXJyb3JcbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIHN5c2ZzIG5vZGVzCi0gKi8KLQotI2RlZmluZSBJSU9fREVWX0FUVFJfQVZBSUxfQ09OVkVSU0lPTl9NT0RFUyhfc2hvdykJCQkJXAotCUlJT19ERVZJQ0VfQVRUUihhdmFpbGFibGVfY29udmVyc2lvbl9tb2RlcywgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCi0jZGVmaW5lIElJT19ERVZfQVRUUl9DT05WRVJTSU9OX01PREUoX21vZGUsIF9zaG93LCBfc3RvcmUpICAgICAgICAgICAgICBcCi0JSUlPX0RFVklDRV9BVFRSKGNvbnZlcnNpb25fbW9kZSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCi0jZGVmaW5lIElJT19ERVZfQVRUUl9DQVBfU0VUVVAoX21vZGUsIF9zaG93LCBfc3RvcmUpCQlcCi0JSUlPX0RFVklDRV9BVFRSKGNhcF9zZXR1cCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCi0jZGVmaW5lIElJT19ERVZfQVRUUl9WVF9TRVRVUChfbW9kZSwgX3Nob3csIF9zdG9yZSkgICAgICAgICAgICAgIFwKLQlJSU9fREVWSUNFX0FUVFIoaW4wX3NldHVwLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0VYRUNfU0VUVVAoX21vZGUsIF9zaG93LCBfc3RvcmUpICAgICAgICAgICAgICBcCi0JSUlPX0RFVklDRV9BVFRSKGV4ZWNfc2V0dXAsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQotI2RlZmluZSBJSU9fREVWX0FUVFJfVk9MVF9HQUlOKF9tb2RlLCBfc2hvdywgX3N0b3JlKQkJXAotCUlJT19ERVZJQ0VfQVRUUihpbjBfZ2FpbiwgX21vZGUsIF9zaG93LCBfc3RvcmUsIDApCi0jZGVmaW5lIElJT19ERVZfQVRUUl9DQVBfT0ZGUyhfbW9kZSwgX3Nob3csIF9zdG9yZSkJCVwKLQlJSU9fREVWSUNFX0FUVFIoY2FwX29mZnMsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCAwKQotI2RlZmluZSBJSU9fREVWX0FUVFJfQ0FQX0dBSU4oX21vZGUsIF9zaG93LCBfc3RvcmUpCQlcCi0JSUlPX0RFVklDRV9BVFRSKGNhcF9nYWluLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0NBUF9EQVRBKF9zaG93KQkJXAotCUlJT19ERVZJQ0VfQVRUUihjYXAwX3JhdywgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCi0jZGVmaW5lIElJT19ERVZfQVRUUl9WVF9EQVRBKF9zaG93KQkJXAotCUlJT19ERVZJQ0VfQVRUUihpbjBfcmF3LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKLQotc3RhdGljIHNzaXplX3QgYWQ3NzR4X3Nob3dfY29udmVyc2lvbl9tb2RlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCi17Ci0JaW50IGk7Ci0JaW50IGxlbiA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQUQ3NzRYX01BWF9DT05WX01PREU7IGkrKykKLQkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiJXMgIiwgYWQ3NzR4X2NvbnZfbW9kZV90YWJsZVtpXS5uYW1lKTsKLQotCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlxuIik7Ci0KLQlyZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgSUlPX0RFVl9BVFRSX0FWQUlMX0NPTlZFUlNJT05fTU9ERVMoYWQ3NzR4X3Nob3dfY29udmVyc2lvbl9tb2Rlcyk7Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzc0eF9zaG93X2NvbnZlcnNpb25fbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgY2hpcC0+Y29udmVyc2lvbl9tb2RlKTsKLX0KLQotc3RhdGljIHNzaXplX3QgYWQ3NzR4X3N0b3JlX2NvbnZlcnNpb25fbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljb25zdCBjaGFyICpidWYsCi0JCXNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0JdTggY2ZnOwotCWludCBpOwotCi0JYWQ3NzR4X2kyY19yZWFkKGNoaXAsIEFENzc0WF9DRkcsICZjZmcsIDEpOwotCi0JZm9yIChpID0gMDsgaSA8IEFENzc0WF9NQVhfQ09OVl9NT0RFOyBpKyspIHsKLQkJaWYgKHN0cm5jbXAoYnVmLCBhZDc3NHhfY29udl9tb2RlX3RhYmxlW2ldLm5hbWUsCi0JCQkJc3RybGVuKGFkNzc0eF9jb252X21vZGVfdGFibGVbaV0ubmFtZSkgLSAxKSA9PSAwKSB7Ci0JCQljaGlwLT5jb252ZXJzaW9uX21vZGUgPSBhZDc3NHhfY29udl9tb2RlX3RhYmxlW2ldLm5hbWU7Ci0JCQljZmcgfD0gMHgxOCB8IGFkNzc0eF9jb252X21vZGVfdGFibGVbaV0ucmVnX2NmZzsKLQkJCWFkNzc0eF9pMmNfd3JpdGUoY2hpcCwgQUQ3NzRYX0NGRywgY2ZnKTsKLQkJCXJldHVybiBsZW47Ci0JCX0KLQl9Ci0KLQlkZXZfZXJyKGRldiwgIm5vdCBzdXBwb3J0ZWQgY29udmVyc2lvbiBtb2RlXG4iKTsKLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgSUlPX0RFVl9BVFRSX0NPTlZFUlNJT05fTU9ERShTX0lSVUdPIHwgU19JV1VTUiwKLQkJYWQ3NzR4X3Nob3dfY29udmVyc2lvbl9tb2RlLAotCQlhZDc3NHhfc3RvcmVfY29udmVyc2lvbl9tb2RlKTsKLQotc3RhdGljIHNzaXplX3QgYWQ3NzR4X3Nob3dfZGFjX3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7Ci0JdTggZGF0YTsKLQotCWFkNzc0eF9pMmNfcmVhZChjaGlwLCB0aGlzX2F0dHItPmFkZHJlc3MsICZkYXRhLCAxKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiUwMnhcbiIsIGRhdGEgJiAweDdGKTsKLX0KLQotc3RhdGljIHNzaXplX3QgYWQ3NzR4X3N0b3JlX2RhY192YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljb25zdCBjaGFyICpidWYsCi0JCXNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0Jc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOwotCXVuc2lnbmVkIGxvbmcgZGF0YTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOwotCi0JaWYgKCFyZXQpIHsKLQkJYWQ3NzR4X2kyY193cml0ZShjaGlwLCB0aGlzX2F0dHItPmFkZHJlc3MsCi0JCQkoZGF0YSA/IEFENzc0WF9DQVBEQUNfRU4gOiAwKSB8IChkYXRhICYgMHg3RikpOwotCQlyZXR1cm4gbGVuOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKGNhcGRhYzBfcmF3LCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJCWFkNzc0eF9zaG93X2RhY192YWx1ZSwKLQkJCWFkNzc0eF9zdG9yZV9kYWNfdmFsdWUsCi0JCQlBRDc3NFhfQ0FQREFDQSk7Ci0KLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIoY2FwZGFjMV9yYXcsIFNfSVJVR08gfCBTX0lXVVNSLAotCQkJYWQ3NzR4X3Nob3dfZGFjX3ZhbHVlLAotCQkJYWQ3NzR4X3N0b3JlX2RhY192YWx1ZSwKLQkJCUFENzc0WF9DQVBEQUNCKTsKLQotc3RhdGljIHNzaXplX3QgYWQ3NzR4X3Nob3dfY2FwX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTAyeFxuIiwgY2hpcC0+Y2FwX3NldHVwKTsKLX0KLQotc3RhdGljIHNzaXplX3QgYWQ3NzR4X3N0b3JlX2NhcF9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljb25zdCBjaGFyICpidWYsCi0JCXNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0JdW5zaWduZWQgbG9uZyBkYXRhOwotCWludCByZXQ7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7Ci0KLQlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHgxMDApKSB7Ci0JCWFkNzc0eF9pMmNfd3JpdGUoY2hpcCwgQUQ3NzRYX0NBUF9TRVRVUCwgZGF0YSk7Ci0JCWNoaXAtPmNhcF9zZXR1cCA9IGRhdGE7Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBJSU9fREVWX0FUVFJfQ0FQX1NFVFVQKFNfSVJVR08gfCBTX0lXVVNSLAotCQlhZDc3NHhfc2hvd19jYXBfc2V0dXAsCi0JCWFkNzc0eF9zdG9yZV9jYXBfc2V0dXApOwotCi1zdGF0aWMgc3NpemVfdCBhZDc3NHhfc2hvd192dF9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwMnhcbiIsIGNoaXAtPnZ0X3NldHVwKTsKLX0KLQotc3RhdGljIHNzaXplX3QgYWQ3NzR4X3N0b3JlX3Z0X3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQl1bnNpZ25lZCBsb25nIGRhdGE7Ci0JaW50IHJldDsKLQotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKLQotCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMCkpIHsKLQkJYWQ3NzR4X2kyY193cml0ZShjaGlwLCBBRDc3NFhfVlRfU0VUVVAsIGRhdGEpOwotCQljaGlwLT52dF9zZXR1cCA9IGRhdGE7Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBJSU9fREVWX0FUVFJfVlRfU0VUVVAoU19JUlVHTyB8IFNfSVdVU1IsCi0JCWFkNzc0eF9zaG93X3Z0X3NldHVwLAotCQlhZDc3NHhfc3RvcmVfdnRfc2V0dXApOwotCi1zdGF0aWMgc3NpemVfdCBhZDc3NHhfc2hvd19leGVjX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTAyeFxuIiwgY2hpcC0+ZXhlY19zZXR1cCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzc0eF9zdG9yZV9leGVjX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQl1bnNpZ25lZCBsb25nIGRhdGE7Ci0JaW50IHJldDsKLQotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKLQotCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMCkpIHsKLQkJYWQ3NzR4X2kyY193cml0ZShjaGlwLCBBRDc3NFhfRVhFQ19TRVRVUCwgZGF0YSk7Ci0JCWNoaXAtPmV4ZWNfc2V0dXAgPSBkYXRhOwotCQlyZXR1cm4gbGVuOwotCX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgSUlPX0RFVl9BVFRSX0VYRUNfU0VUVVAoU19JUlVHTyB8IFNfSVdVU1IsCi0JCWFkNzc0eF9zaG93X2V4ZWNfc2V0dXAsCi0JCWFkNzc0eF9zdG9yZV9leGVjX3NldHVwKTsKLQotc3RhdGljIHNzaXplX3QgYWQ3NzR4X3Nob3dfdm9sdF9nYWluKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjaGlwLT52b2x0X2dhaW4pOwotfQotCi1zdGF0aWMgc3NpemVfdCBhZDc3NHhfc3RvcmVfdm9sdF9nYWluKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQl1bnNpZ25lZCBsb25nIGRhdGE7Ci0JaW50IHJldDsKLQotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZkYXRhKTsKLQotCWlmICgoIXJldCkgJiYgKGRhdGEgPCAweDEwMDAwKSkgewotCQlhZDc3NHhfaTJjX3dyaXRlKGNoaXAsIEFENzc0WF9WT0xUX0dBSU5ILCBkYXRhID4+IDgpOwotCQlhZDc3NHhfaTJjX3dyaXRlKGNoaXAsIEFENzc0WF9WT0xUX0dBSU5MLCBkYXRhKTsKLQkJY2hpcC0+dm9sdF9nYWluID0gZGF0YTsKLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIElJT19ERVZfQVRUUl9WT0xUX0dBSU4oU19JUlVHTyB8IFNfSVdVU1IsCi0JCWFkNzc0eF9zaG93X3ZvbHRfZ2FpbiwKLQkJYWQ3NzR4X3N0b3JlX3ZvbHRfZ2Fpbik7Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzc0eF9zaG93X2NhcF9kYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQl1bnNpZ25lZCBsb25nIGRhdGE7Ci0JY2hhciB0bXBbM107Ci0KLQlhZDc3NHhfaTJjX3JlYWQoY2hpcCwgQUQ3NzRYX0NBUF9EQVRBX0hJR0gsIHRtcCwgMyk7Ci0JZGF0YSA9ICgoaW50KXRtcFswXSA8PCAxNikgfCAoKGludCl0bXBbMV0gPDwgOCkgfCAoaW50KXRtcFsyXTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsZFxuIiwgZGF0YSk7Ci19Ci0KLXN0YXRpYyBJSU9fREVWX0FUVFJfQ0FQX0RBVEEoYWQ3NzR4X3Nob3dfY2FwX2RhdGEpOwotCi1zdGF0aWMgc3NpemVfdCBhZDc3NHhfc2hvd192dF9kYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQl1bnNpZ25lZCBsb25nIGRhdGE7Ci0JY2hhciB0bXBbM107Ci0KLQlhZDc3NHhfaTJjX3JlYWQoY2hpcCwgQUQ3NzRYX1ZUX0RBVEFfSElHSCwgdG1wLCAzKTsKLQlkYXRhID0gKChpbnQpdG1wWzBdIDw8IDE2KSB8ICgoaW50KXRtcFsxXSA8PCA4KSB8IChpbnQpdG1wWzJdOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBkYXRhKTsKLX0KLQotc3RhdGljIElJT19ERVZfQVRUUl9WVF9EQVRBKGFkNzc0eF9zaG93X3Z0X2RhdGEpOwotCi1zdGF0aWMgc3NpemVfdCBhZDc3NHhfc2hvd19jYXBfb2ZmcyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+Y2FwX29mZnMpOwotfQotCi1zdGF0aWMgc3NpemVfdCBhZDc3NHhfc3RvcmVfY2FwX29mZnMoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgbGVuKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDc3NHhfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCXVuc2lnbmVkIGxvbmcgZGF0YTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOwotCi0JaWYgKCghcmV0KSAmJiAoZGF0YSA8IDB4MTAwMDApKSB7Ci0JCWFkNzc0eF9pMmNfd3JpdGUoY2hpcCwgQUQ3NzRYX0NBUF9PRkZILCBkYXRhID4+IDgpOwotCQlhZDc3NHhfaTJjX3dyaXRlKGNoaXAsIEFENzc0WF9DQVBfT0ZGTCwgZGF0YSk7Ci0JCWNoaXAtPmNhcF9vZmZzID0gZGF0YTsKLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIElJT19ERVZfQVRUUl9DQVBfT0ZGUyhTX0lSVUdPIHwgU19JV1VTUiwKLQkJYWQ3NzR4X3Nob3dfY2FwX29mZnMsCi0JCWFkNzc0eF9zdG9yZV9jYXBfb2Zmcyk7Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzc0eF9zaG93X2NhcF9nYWluKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBjaGlwLT5jYXBfZ2Fpbik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNzc0eF9zdG9yZV9jYXBfZ2FpbihzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljb25zdCBjaGFyICpidWYsCi0JCXNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzc0eF9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0JdW5zaWduZWQgbG9uZyBkYXRhOwotCWludCByZXQ7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7Ci0KLQlpZiAoKCFyZXQpICYmIChkYXRhIDwgMHgxMDAwMCkpIHsKLQkJYWQ3NzR4X2kyY193cml0ZShjaGlwLCBBRDc3NFhfQ0FQX0dBSU5ILCBkYXRhID4+IDgpOwotCQlhZDc3NHhfaTJjX3dyaXRlKGNoaXAsIEFENzc0WF9DQVBfR0FJTkwsIGRhdGEpOwotCQljaGlwLT5jYXBfZ2FpbiA9IGRhdGE7Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBJSU9fREVWX0FUVFJfQ0FQX0dBSU4oU19JUlVHTyB8IFNfSVdVU1IsCi0JCWFkNzc0eF9zaG93X2NhcF9nYWluLAotCQlhZDc3NHhfc3RvcmVfY2FwX2dhaW4pOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3NzR4X2F0dHJpYnV0ZXNbXSA9IHsKLQkmaWlvX2Rldl9hdHRyX2F2YWlsYWJsZV9jb252ZXJzaW9uX21vZGVzLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9jb252ZXJzaW9uX21vZGUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2NhcF9zZXR1cC5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfaW4wX3NldHVwLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9leGVjX3NldHVwLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9jYXBfb2Zmcy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfY2FwX2dhaW4uZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2luMF9nYWluLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9pbjBfcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9jYXAwX3Jhdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfY2FwZGFjMF9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2NhcGRhYzFfcmF3LmRldl9hdHRyLmF0dHIsCi0JTlVMTCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNzc0eF9hdHRyaWJ1dGVfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gYWQ3NzR4X2F0dHJpYnV0ZXMsCi19OwotCi0vKgotICogZGF0YSByZWFkeSBldmVudHMKLSAqLwotCi0jZGVmaW5lIElJT19FVkVOVF9DT0RFX0NBUF9SRFkgICAgIDAKLSNkZWZpbmUgSUlPX0VWRU5UX0NPREVfVlRfUkRZICAgICAgMQotCi0jZGVmaW5lIElJT19FVkVOVF9BVFRSX0NBUF9SRFlfU0goX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCVwKLQlJSU9fRVZFTlRfQVRUUl9TSChjYXBfcmR5LCBfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykKLQotI2RlZmluZSBJSU9fRVZFTlRfQVRUUl9WVF9SRFlfU0goX2V2bGlzdCwgX3Nob3csIF9zdG9yZSwgX21hc2spCVwKLQlJSU9fRVZFTlRfQVRUUl9TSCh2dF9yZHksIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgYWQ3NzR4X2V2ZW50X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqcHJpdmF0ZSkKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcHJpdmF0ZTsKLQlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0JdTggaW50X3N0YXR1czsKLQotCWFkNzc0eF9pMmNfcmVhZChjaGlwLCBBRDc3NFhfU1RBVFVTLCAmaW50X3N0YXR1cywgMSk7Ci0KLQlpZiAoaW50X3N0YXR1cyAmIEFENzc0WF9TVEFUVVNfUkRZQ0FQKQotCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsIDAsCi0JCQkgICAgICAgSUlPX0VWRU5UX0NPREVfQ0FQX1JEWSwKLQkJCSAgICAgICBpaW9fZ2V0X3RpbWVfbnMoKSk7Ci0KLQlpZiAoaW50X3N0YXR1cyAmIEFENzc0WF9TVEFUVVNfUkRZVlQpCi0JCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwgMCwKLQkJCSAgICAgICBJSU9fRVZFTlRfQ09ERV9WVF9SRFksCi0JCQkgICAgICAgaWlvX2dldF90aW1lX25zKCkpOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgSUlPX0NPTlNUX0FUVFIoY2FwX3JkeV9lbiwgIjEiKTsKLXN0YXRpYyBJSU9fQ09OU1RfQVRUUih2dF9yZHlfZW4sICIxIik7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDc3NHhfZXZlbnRfYXR0cmlidXRlc1tdID0gewotCSZpaW9fY29uc3RfYXR0cl9jYXBfcmR5X2VuLmRldl9hdHRyLmF0dHIsCi0JJmlpb19jb25zdF9hdHRyX3Z0X3JkeV9lbi5kZXZfYXR0ci5hdHRyLAotCU5VTEwsCi19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDc3NHhfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0gewotCS5hdHRycyA9IGFkNzc0eF9ldmVudF9hdHRyaWJ1dGVzLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBhZDc3NHhfaW5mbyA9IHsKLQkuYXR0cnMgPSAmYWQ3NzR4X2V2ZW50X2F0dHJpYnV0ZV9ncm91cCwKLQkuZXZlbnRfYXR0cnMgPSAmYWQ3NzR4X2V2ZW50X2F0dHJpYnV0ZV9ncm91cCwKLQkubnVtX2ludGVycnVwdF9saW5lcyA9IDEsCi0JLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKLX07Ci0vKgotICogZGV2aWNlIHByb2JlIGFuZCByZW1vdmUKLSAqLwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBhZDc3NHhfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCWludCByZXQgPSAwLCByZWdkb25lID0gMDsKLQlzdHJ1Y3QgYWQ3NzR4X2NoaXBfaW5mbyAqY2hpcDsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OwotCi0JaW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZShzaXplb2YoKmNoaXApKTsKLQlpZiAoaW5kaW9fZGV2ID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcl9yZXQ7Ci0JfQotCWNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciBkZXZpY2UgcmVtb3ZhbCBwdXJwb3NlcyAqLwotCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGluZGlvX2Rldik7Ci0KLQljaGlwLT5jbGllbnQgPSBjbGllbnQ7Ci0KLQkvKiBFc3RhYmxpc2ggdGhhdCB0aGUgaWlvX2RldiBpcyBhIGNoaWxkIG9mIHRoZSBpMmMgZGV2aWNlICovCi0JaW5kaW9fZGV2LT5uYW1lID0gaWQtPm5hbWU7Ci0JaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OwotCWluZGlvX2Rldi0+aW5mbyA9ICZhZDc3NHhfaW5mbzsKLQlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7Ci0KLQlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcl9mcmVlX2RldjsKLQlyZWdkb25lID0gMTsKLQotCWlmIChjbGllbnQtPmlycSkgewotCQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShjbGllbnQtPmlycSwKLQkJCQkJICAgTlVMTCwKLQkJCQkJICAgJmFkNzc0eF9ldmVudF9oYW5kbGVyLAotCQkJCQkgICBJUlFGX1RSSUdHRVJfRkFMTElORywKLQkJCQkJICAgImFkNzc0eCIsCi0JCQkJCSAgIGluZGlvX2Rldik7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycm9yX2ZyZWVfZGV2OwotCX0KLQotCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXMgY2FwYWNpdGl2ZSBzZW5zb3IgcmVnaXN0ZXJlZCwgaXJxOiAlZFxuIiwgaWQtPm5hbWUsIGNsaWVudC0+aXJxKTsKLQotCXJldHVybiAwOwotCi1lcnJvcl9mcmVlX2RldjoKLQlpZiAocmVnZG9uZSkKLQkJZnJlZV9pcnEoY2xpZW50LT5pcnEsIGluZGlvX2Rldik7Ci0JZWxzZQotCQlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKLWVycm9yX3JldDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDc3NHhfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0JaWYgKGNsaWVudC0+aXJxKQotCQlmcmVlX2lycShjbGllbnQtPmlycSwgaW5kaW9fZGV2KTsKLQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWQ3NzR4X2lkW10gPSB7Ci0JeyAiYWQ3NzQ1IiwgMCB9LAotCXsgImFkNzc0NiIsIDAgfSwKLQl7ICJhZDc3NDciLCAwIH0sCi0Je30KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhZDc3NHhfaWQpOwotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWQ3NzR4X2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJhZDc3NHgiLAotCX0sCi0JLnByb2JlID0gYWQ3NzR4X3Byb2JlLAotCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDc3NHhfcmVtb3ZlKSwKLQkuaWRfdGFibGUgPSBhZDc3NHhfaWQsCi19OwotCi1zdGF0aWMgX19pbml0IGludCBhZDc3NHhfaW5pdCh2b2lkKQotewotCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWQ3NzR4X2RyaXZlcik7Ci19Ci0KLXN0YXRpYyBfX2V4aXQgdm9pZCBhZDc3NHhfZXhpdCh2b2lkKQotewotCWkyY19kZWxfZHJpdmVyKCZhZDc3NHhfZHJpdmVyKTsKLX0KLQotTU9EVUxFX0FVVEhPUigiQmFycnkgU29uZyA8MjFjbmJhb0BnbWFpbC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIGFkNzc0NS82LzcgY2FwYWNpdGl2ZSBzZW5zb3IgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci0KLW1vZHVsZV9pbml0KGFkNzc0eF9pbml0KTsKLW1vZHVsZV9leGl0KGFkNzc0eF9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzc4MC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NzgwLmMKaW5kZXggZTBjN2I2Yy4uN2E1NzlhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NzgwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NzgwLmMKQEAgLTE2LDExICsxNiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vc3lzZnMuaCIKLSNpbmNsdWRlICIuLi9yaW5nX2dlbmVyaWMuaCIKLSNpbmNsdWRlICJhZGMuaCIKIAogI2luY2x1ZGUgImFkNzc4MC5oIgogCkBAIC0xMjcsMTIgKzEyNiwxMiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFkNzc4MF9jaGlwX2luZm8gYWQ3NzgwX2NoaXBfaW5mb190YmxbXSA9IHsKIAlbSURfQUQ3NzgwXSA9IHsKLQkJLmNoYW5uZWwgPSBJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDAsIDAsCisJCS5jaGFubmVsID0gSUlPX0NIQU4oSUlPX1ZPTFRBR0UsIDAsIDEsIDAsIE5VTEwsIDAsIDAsCiAJCQkJICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKIAkJCQkgICAgMCwgMCwgSUlPX1NUKCdzJywgMjQsIDMyLCA4KSwgMCksCiAJfSwKIAlbSURfQUQ3NzgxXSA9IHsKLQkJLmNoYW5uZWwgPSBJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDAsIDAsCisJCS5jaGFubmVsID0gSUlPX0NIQU4oSUlPX1ZPTFRBR0UsIDAsIDEsIDAsIE5VTEwsIDAsIDAsCiAJCQkJICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKIAkJCQkgICAgMCwgMCwgSUlPX1NUKCdzJywgMjAsIDMyLCAxMiksIDApLAogCX0sCkBAIC0yNTYsMTMgKzI1NSwxNCBAQAogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKIAlzdHJ1Y3QgYWQ3NzgwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIAlmcmVlX2lycShzcGktPmlycSwgc3QpOwogCWdwaW9fZnJlZShzdC0+cGRhdGEtPmdwaW9fcGRyc3QpOwogCWlmICghSVNfRVJSKHN0LT5yZWcpKSB7CiAJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT5yZWcpOwogCQlyZWd1bGF0b3JfcHV0KHN0LT5yZWcpOwogCX0KLQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NzkzLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3OTMuYwppbmRleCA5MGY2YzAzLi5hODMxYjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3OTMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3OTMuYwpAQCAtMTksMTAgKzE5LDEwIEBACiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi9zeXNmcy5oIgotI2luY2x1ZGUgIi4uL3JpbmdfZ2VuZXJpYy5oIgorI2luY2x1ZGUgIi4uL2J1ZmZlcl9nZW5lcmljLmgiCiAjaW5jbHVkZSAiLi4vcmluZ19zdy5oIgogI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKLSNpbmNsdWRlICJhZGMuaCIKKyNpbmNsdWRlICIuLi90cmlnZ2VyX2NvbnN1bWVyLmgiCiAKICNpbmNsdWRlICJhZDc3OTMuaCIKIApAQCAtNTEsNyArNTEsOCBAQAogCXUxNgkJCQltb2RlOwogCXUxNgkJCQljb25mOwogCXUzMgkJCQlzY2FsZV9hdmFpbFs4XVsyXTsKLQl1MzIJCQkJYXZhaWxhYmxlX3NjYW5fbWFza3NbN107CisJLyogTm90ZSB0aGlzIHVzZXMgZmFjdCB0aGF0IDggdGhlIG1hc2sgYWx3YXlzIGZpdHMgaW4gYSBsb25nICovCisJdW5zaWduZWQgbG9uZwkJCWF2YWlsYWJsZV9zY2FuX21hc2tzWzddOwogCS8qCiAJICogRE1BICh0aHVzIGNhY2hlIGNvaGVyZW5jeSBtYWludGVuYW5jZSkgcmVxdWlyZXMgdGhlCiAJICogdHJhbnNmZXIgYnVmZmVycyB0byBsaXZlIGluIHRoZWlyIG93biBjYWNoZSBsaW5lcy4KQEAgLTMxNiwxMiArMzE3LDEyIEBACiAKIHN0YXRpYyBpbnQgYWQ3NzkzX3NjYW5fZnJvbV9yaW5nKHN0cnVjdCBhZDc3OTNfc3RhdGUgKnN0LCB1bnNpZ25lZCBjaCwgaW50ICp2YWwpCiB7Ci0Jc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyA9IGlpb19wcml2X3RvX2RldihzdCktPnJpbmc7CisJc3RydWN0IGlpb19idWZmZXIgKnJpbmcgPSBpaW9fcHJpdl90b19kZXYoc3QpLT5idWZmZXI7CiAJaW50IHJldDsKIAlzNjQgZGF0NjRbMl07CiAJdTMyICpkYXQzMiA9ICh1MzIgKilkYXQ2NDsKIAotCWlmICghKHJpbmctPnNjYW5fbWFzayAmICgxIDw8IGNoKSkpCisJaWYgKCEodGVzdF9iaXQoY2gsIHJpbmctPnNjYW5fbWFzaykpKQogCQlyZXR1cm4gIC1FQlVTWTsKIAogCXJldCA9IHJpbmctPmFjY2Vzcy0+cmVhZF9sYXN0KHJpbmcsICh1OCAqKSAmZGF0NjQpOwpAQCAtMzM2LDE0ICszMzcsMTUgQEAKIHN0YXRpYyBpbnQgYWQ3NzkzX3JpbmdfcHJlZW5hYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJc3RydWN0IGFkNzc5M19zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBpbmRpb19kZXYtPnJpbmc7CisJc3RydWN0IGlpb19idWZmZXIgKnJpbmcgPSBpbmRpb19kZXYtPmJ1ZmZlcjsKIAlzaXplX3QgZF9zaXplOwogCXVuc2lnbmVkIGNoYW5uZWw7CiAKIAlpZiAoIXJpbmctPnNjYW5fY291bnQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JY2hhbm5lbCA9IF9fZmZzKHJpbmctPnNjYW5fbWFzayk7CisJY2hhbm5lbCA9IGZpbmRfZmlyc3RfYml0KHJpbmctPnNjYW5fbWFzaywKKwkJCQkgaW5kaW9fZGV2LT5tYXNrbGVuZ3RoKTsKIAogCWRfc2l6ZSA9IHJpbmctPnNjYW5fY291bnQgKgogCQkgaW5kaW9fZGV2LT5jaGFubmVsc1swXS5zY2FuX3R5cGUuc3RvcmFnZWJpdHMgLyA4OwpAQCAtMzU1LDkgKzM1Nyw5IEBACiAJCQlkX3NpemUgKz0gc2l6ZW9mKHM2NCkgLSAoZF9zaXplICUgc2l6ZW9mKHM2NCkpOwogCX0KIAotCWlmIChpbmRpb19kZXYtPnJpbmctPmFjY2Vzcy0+c2V0X2J5dGVzX3Blcl9kYXR1bSkKLQkJaW5kaW9fZGV2LT5yaW5nLT5hY2Nlc3MtPnNldF9ieXRlc19wZXJfZGF0dW0oaW5kaW9fZGV2LT5yaW5nLAotCQkJCQkJCSAgICAgZF9zaXplKTsKKwlpZiAoaW5kaW9fZGV2LT5idWZmZXItPmFjY2Vzcy0+c2V0X2J5dGVzX3Blcl9kYXR1bSkKKwkJaW5kaW9fZGV2LT5idWZmZXItPmFjY2Vzcy0+CisJCQlzZXRfYnl0ZXNfcGVyX2RhdHVtKGluZGlvX2Rldi0+YnVmZmVyLCBkX3NpemUpOwogCiAJc3QtPm1vZGUgID0gKHN0LT5tb2RlICYgfkFENzc5M19NT0RFX1NFTCgtMSkpIHwKIAkJICAgIEFENzc5M19NT0RFX1NFTChBRDc3OTNfTU9ERV9DT05UKTsKQEAgLTQwMiw4ICs0MDQsOCBAQAogc3RhdGljIGlycXJldHVybl90IGFkNzc5M190cmlnZ2VyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqcCkKIHsKIAlzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqcGYgPSBwOwotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwZi0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBpbmRpb19kZXYtPnJpbmc7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5pbmRpb19kZXY7CisJc3RydWN0IGlpb19idWZmZXIgKnJpbmcgPSBpbmRpb19kZXYtPmJ1ZmZlcjsKIAlzdHJ1Y3QgYWQ3NzkzX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJczY0IGRhdDY0WzJdOwogCXMzMiAqZGF0MzIgPSAoczMyICopZGF0NjQ7CkBAIC00MjYsMTAgKzQyOCwxMCBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fcmluZ19zZXR1cF9vcHMgYWQ3NzkzX3Jpbmdfc2V0dXBfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fYnVmZmVyX3NldHVwX29wcyBhZDc3OTNfcmluZ19zZXR1cF9vcHMgPSB7CiAJLnByZWVuYWJsZSA9ICZhZDc3OTNfcmluZ19wcmVlbmFibGUsCi0JLnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3Bvc3RlbmFibGUsCi0JLnByZWRpc2FibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3ByZWRpc2FibGUsCisJLnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZSwKKwkucHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNhYmxlLAogCS5wb3N0ZGlzYWJsZSA9ICZhZDc3OTNfcmluZ19wb3N0ZGlzYWJsZSwKIH07CiAKQEAgLTQzNywxMyArNDM5LDEzIEBACiB7CiAJaW50IHJldDsKIAotCWluZGlvX2Rldi0+cmluZyA9IGlpb19zd19yYl9hbGxvY2F0ZShpbmRpb19kZXYpOwotCWlmICghaW5kaW9fZGV2LT5yaW5nKSB7CisJaW5kaW9fZGV2LT5idWZmZXIgPSBpaW9fc3dfcmJfYWxsb2NhdGUoaW5kaW9fZGV2KTsKKwlpZiAoIWluZGlvX2Rldi0+YnVmZmVyKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfcmV0OwogCX0KIAkvKiBFZmZlY3RpdmVseSBzZWxlY3QgdGhlIHJpbmcgYnVmZmVyIGltcGxlbWVudGF0aW9uICovCi0JaW5kaW9fZGV2LT5yaW5nLT5hY2Nlc3MgPSAmcmluZ19zd19hY2Nlc3NfZnVuY3M7CisJaW5kaW9fZGV2LT5idWZmZXItPmFjY2VzcyA9ICZyaW5nX3N3X2FjY2Vzc19mdW5jczsKIAlpbmRpb19kZXYtPnBvbGxmdW5jID0gaWlvX2FsbG9jX3BvbGxmdW5jKCZpaW9fcG9sbGZ1bmNfc3RvcmVfdGltZSwKIAkJCQkJCSAmYWQ3NzkzX3RyaWdnZXJfaGFuZGxlciwKIAkJCQkJCSBJUlFGX09ORVNIT1QsCkBAIC00NTYsMjggKzQ1OCwyMiBAQAogCX0KIAogCS8qIFJpbmcgYnVmZmVyIGZ1bmN0aW9ucyAtIGhlcmUgdHJpZ2dlciBzZXR1cCByZWxhdGVkICovCi0JaW5kaW9fZGV2LT5yaW5nLT5zZXR1cF9vcHMgPSAmYWQ3NzkzX3Jpbmdfc2V0dXBfb3BzOworCWluZGlvX2Rldi0+YnVmZmVyLT5zZXR1cF9vcHMgPSAmYWQ3NzkzX3Jpbmdfc2V0dXBfb3BzOwogCiAJLyogRmxhZyB0aGF0IHBvbGxlZCByaW5nIGJ1ZmZlcmluZyBpcyBwb3NzaWJsZSAqLwotCWluZGlvX2Rldi0+bW9kZXMgfD0gSU5ESU9fUklOR19UUklHR0VSRUQ7CisJaW5kaW9fZGV2LT5tb2RlcyB8PSBJTkRJT19CVUZGRVJfVFJJR0dFUkVEOwogCXJldHVybiAwOwogCiBlcnJvcl9kZWFsbG9jYXRlX3N3X3JiOgotCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7CisJaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5idWZmZXIpOwogZXJyb3JfcmV0OgogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGFkNzc5M19yaW5nX2NsZWFudXAoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKLQkvKiBlbnN1cmUgdGhhdCB0aGUgdHJpZ2dlciBoYXMgYmVlbiBkZXRhY2hlZCAqLwotCWlmIChpbmRpb19kZXYtPnRyaWcpIHsKLQkJaWlvX3B1dF90cmlnZ2VyKGluZGlvX2Rldi0+dHJpZyk7Ci0JCWlpb190cmlnZ2VyX2RldHRhY2hfcG9sbF9mdW5jKGluZGlvX2Rldi0+dHJpZywKLQkJCQkJICAgICAgaW5kaW9fZGV2LT5wb2xsZnVuYyk7Ci0JfQogCWlpb19kZWFsbG9jX3BvbGxmdW5jKGluZGlvX2Rldi0+cG9sbGZ1bmMpOwotCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7CisJaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5idWZmZXIpOwogfQogCiAvKioKQEAgLTU3NCw3ICs1NzAsNyBAQAogCWludCBpLCByZXQ7CiAKIAltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKLQlpZiAoaWlvX3JpbmdfZW5hYmxlZChpbmRpb19kZXYpKSB7CisJaWYgKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpKSB7CiAJCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CiAJCXJldHVybiAtRUJVU1k7CiAJfQpAQCAtNjUxLDcgKzY0Nyw3IEBACiAJc3dpdGNoIChtKSB7CiAJY2FzZSAwOgogCQltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKLQkJaWYgKGlpb19yaW5nX2VuYWJsZWQoaW5kaW9fZGV2KSkKKwkJaWYgKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpKQogCQkJcmV0ID0gYWQ3NzkzX3NjYW5fZnJvbV9yaW5nKHN0LAogCQkJCQljaGFuLT5zY2FuX2luZGV4LCAmc21wbCk7CiAJCWVsc2UKQEAgLTY3OCw3ICs2NzQsNyBAQAogCiAJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKToKIAkJc3dpdGNoIChjaGFuLT50eXBlKSB7Ci0JCWNhc2UgSUlPX0lOOgorCQljYXNlIElJT19WT0xUQUdFOgogCQkJLyogMTE3MG1WIC8gMl4yMyAqIDYgKi8KIAkJCXNjYWxlX3V2ID0gKDExNzBVTEwgKiAxMDAwMDAwMDBVTEwgKiA2VUxMKQogCQkJCT4+IChjaGFuLT5zY2FuX3R5cGUucmVhbGJpdHMgLQpAQCAtNzEzLDcgKzcwOSw3IEBACiAJdW5zaWduZWQgaW50IHRtcDsKIAogCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOwotCWlmIChpaW9fcmluZ19lbmFibGVkKGluZGlvX2RldikpIHsKKwlpZiAoaWlvX2J1ZmZlcl9lbmFibGVkKGluZGlvX2RldikpIHsKIAkJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC03NzEsNTcgKzc2NywxMzcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhZDc3OTNfY2hpcF9pbmZvIGFkNzc5M19jaGlwX2luZm9fdGJsW10gPSB7CiAJW0lEX0FENzc5M10gPSB7Ci0JCS5jaGFubmVsWzBdID0gSUlPX0NIQU4oSUlPX0lOX0RJRkYsIDAsIDEsIDAsIE5VTEwsIDAsIDAsCi0JCQkJICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJCQkgICAgQUQ3NzkzX0NIX0FJTjFQX0FJTjFNLAotCQkJCSAgICAwLCBJSU9fU1QoJ3MnLCAyNCwgMzIsIDApLCAwKSwKLQkJLmNoYW5uZWxbMV0gPSBJSU9fQ0hBTihJSU9fSU5fRElGRiwgMCwgMSwgMCwgTlVMTCwgMSwgMSwKLQkJCQkgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkJCSAgICBBRDc3OTNfQ0hfQUlOMlBfQUlOMk0sCi0JCQkJICAgIDEsIElJT19TVCgncycsIDI0LCAzMiwgMCksIDApLAotCQkuY2hhbm5lbFsyXSA9IElJT19DSEFOKElJT19JTl9ESUZGLCAwLCAxLCAwLCBOVUxMLCAyLCAyLAotCQkJCSAgICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCQkJICAgIEFENzc5M19DSF9BSU4zUF9BSU4zTSwKLQkJCQkgICAgMiwgSUlPX1NUKCdzJywgMjQsIDMyLCAwKSwgMCksCi0JCS5jaGFubmVsWzNdID0gSUlPX0NIQU4oSUlPX0lOX0RJRkYsIDAsIDEsIDAsICJzaG9ydGVkIiwgMCwgMCwKLQkJCQkgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkJCSAgICBBRDc3OTNfQ0hfQUlOMU1fQUlOMU0sCi0JCQkJICAgIDMsIElJT19TVCgncycsIDI0LCAzMiwgMCksIDApLAotCQkuY2hhbm5lbFs0XSA9IElJT19DSEFOKElJT19URU1QLCAwLCAxLCAwLCBOVUxMLCAwLCAwLAotCQkJCSAgICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwKLQkJCQkgICAgQUQ3NzkzX0NIX1RFTVAsCi0JCQkJICAgIDQsIElJT19TVCgncycsIDI0LCAzMiwgMCksIDApLAotCQkuY2hhbm5lbFs1XSA9IElJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgInN1cHBseSIsIDQsIDAsCi0JCQkJICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpLAotCQkJCSAgICBBRDc3OTNfQ0hfQVZERF9NT05JVE9SLAotCQkJCSAgICA1LCBJSU9fU1QoJ3MnLCAyNCwgMzIsIDApLCAwKSwKKwkJLmNoYW5uZWxbMF0gPSB7CisJCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkJLmRpZmZlcmVudGlhbCA9IDEsCisJCQkuaW5kZXhlZCA9IDEsCisJCQkuY2hhbm5lbCA9IDAsCisJCQkuY2hhbm5lbDIgPSAwLAorCQkJLmFkZHJlc3MgPSBBRDc3OTNfQ0hfQUlOMVBfQUlOMU0sCisJCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkJLnNjYW5faW5kZXggPSAwLAorCQkJLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDI0LCAzMiwgMCkKKwkJfSwKKwkJLmNoYW5uZWxbMV0gPSB7CisJCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkJLmRpZmZlcmVudGlhbCA9IDEsCisJCQkuaW5kZXhlZCA9IDEsCisJCQkuY2hhbm5lbCA9IDEsCisJCQkuY2hhbm5lbDIgPSAxLAorCQkJLmFkZHJlc3MgPSBBRDc3OTNfQ0hfQUlOMlBfQUlOMk0sCisJCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkJLnNjYW5faW5kZXggPSAxLAorCQkJLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDI0LCAzMiwgMCkKKwkJfSwKKwkJLmNoYW5uZWxbMl0gPSB7CisJCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkJLmRpZmZlcmVudGlhbCA9IDEsCisJCQkuaW5kZXhlZCA9IDEsCisJCQkuY2hhbm5lbCA9IDIsCisJCQkuY2hhbm5lbDIgPSAyLAorCQkJLmFkZHJlc3MgPSBBRDc3OTNfQ0hfQUlOM1BfQUlOM00sCisJCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkJLnNjYW5faW5kZXggPSAyLAorCQkJLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDI0LCAzMiwgMCkKKwkJfSwKKwkJLmNoYW5uZWxbM10gPSB7CisJCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkJLmRpZmZlcmVudGlhbCA9IDEsCisJCQkuZXh0ZW5kX25hbWUgPSAic2hvcnRlZCIsCisJCQkuaW5kZXhlZCA9IDEsCisJCQkuY2hhbm5lbCA9IDIsCisJCQkuY2hhbm5lbDIgPSAyLAorCQkJLmFkZHJlc3MgPSBBRDc3OTNfQ0hfQUlOMU1fQUlOMU0sCisJCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkJLnNjYW5faW5kZXggPSAyLAorCQkJLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDI0LCAzMiwgMCkKKwkJfSwKKwkJLmNoYW5uZWxbNF0gPSB7CisJCQkudHlwZSA9IElJT19URU1QLAorCQkJLmluZGV4ZWQgPSAxLAorCQkJLmNoYW5uZWwgPSAwLAorCQkJLmFkZHJlc3MgPSBBRDc3OTNfQ0hfVEVNUCwKKwkJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwKKwkJCS5zY2FuX2luZGV4ID0gNCwKKwkJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3MnLCAyNCwgMzIsIDApLAorCQl9LAorCQkuY2hhbm5lbFs1XSA9IHsKKwkJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCQkuZXh0ZW5kX25hbWUgPSAic3VwcGx5IiwKKwkJCS5pbmRleGVkID0gMSwKKwkJCS5jaGFubmVsID0gNCwKKwkJCS5hZGRyZXNzID0gQUQ3NzkzX0NIX0FWRERfTU9OSVRPUiwKKwkJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwKKwkJCS5zY2FuX2luZGV4ID0gNSwKKwkJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3MnLCAyNCwgMzIsIDApLAorCQl9LAogCQkuY2hhbm5lbFs2XSA9IElJT19DSEFOX1NPRlRfVElNRVNUQU1QKDYpLAogCX0sCiAJW0lEX0FENzc5Ml0gPSB7Ci0JCS5jaGFubmVsWzBdID0gSUlPX0NIQU4oSUlPX0lOX0RJRkYsIDAsIDEsIDAsIE5VTEwsIDAsIDAsCi0JCQkJICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJCQkgICAgQUQ3NzkzX0NIX0FJTjFQX0FJTjFNLAotCQkJCSAgICAwLCBJSU9fU1QoJ3MnLCAxNiwgMzIsIDApLCAwKSwKLQkJLmNoYW5uZWxbMV0gPSBJSU9fQ0hBTihJSU9fSU5fRElGRiwgMCwgMSwgMCwgTlVMTCwgMSwgMSwKLQkJCQkgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkJCSAgICBBRDc3OTNfQ0hfQUlOMlBfQUlOMk0sCi0JCQkJICAgIDEsIElJT19TVCgncycsIDE2LCAzMiwgMCksIDApLAotCQkuY2hhbm5lbFsyXSA9IElJT19DSEFOKElJT19JTl9ESUZGLCAwLCAxLCAwLCBOVUxMLCAyLCAyLAotCQkJCSAgICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCQkJICAgIEFENzc5M19DSF9BSU4zUF9BSU4zTSwKLQkJCQkgICAgMiwgSUlPX1NUKCdzJywgMTYsIDMyLCAwKSwgMCksCi0JCS5jaGFubmVsWzNdID0gSUlPX0NIQU4oSUlPX0lOX0RJRkYsIDAsIDEsIDAsICJzaG9ydGVkIiwgMCwgMCwKLQkJCQkgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkJCSAgICBBRDc3OTNfQ0hfQUlOMU1fQUlOMU0sCi0JCQkJICAgIDMsIElJT19TVCgncycsIDE2LCAzMiwgMCksIDApLAotCQkuY2hhbm5lbFs0XSA9IElJT19DSEFOKElJT19URU1QLCAwLCAxLCAwLCBOVUxMLCAwLCAwLAotCQkJCSAgICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwKLQkJCQkgICAgQUQ3NzkzX0NIX1RFTVAsCi0JCQkJICAgIDQsIElJT19TVCgncycsIDE2LCAzMiwgMCksIDApLAotCQkuY2hhbm5lbFs1XSA9IElJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgInN1cHBseSIsIDQsIDAsCi0JCQkJICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpLAotCQkJCSAgICBBRDc3OTNfQ0hfQVZERF9NT05JVE9SLAotCQkJCSAgICA1LCBJSU9fU1QoJ3MnLCAxNiwgMzIsIDApLCAwKSwKKwkJLmNoYW5uZWxbMF0gPSB7CisJCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkJLmRpZmZlcmVudGlhbCA9IDEsCisJCQkuaW5kZXhlZCA9IDEsCisJCQkuY2hhbm5lbCA9IDAsCisJCQkuY2hhbm5lbDIgPSAwLAorCQkJLmFkZHJlc3MgPSBBRDc3OTNfQ0hfQUlOMVBfQUlOMU0sCisJCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkJLnNjYW5faW5kZXggPSAwLAorCQkJLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDE2LCAzMiwgMCkKKwkJfSwKKwkJLmNoYW5uZWxbMV0gPSB7CisJCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkJLmRpZmZlcmVudGlhbCA9IDEsCisJCQkuaW5kZXhlZCA9IDEsCisJCQkuY2hhbm5lbCA9IDEsCisJCQkuY2hhbm5lbDIgPSAxLAorCQkJLmFkZHJlc3MgPSBBRDc3OTNfQ0hfQUlOMlBfQUlOMk0sCisJCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkJLnNjYW5faW5kZXggPSAxLAorCQkJLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDE2LCAzMiwgMCkKKwkJfSwKKwkJLmNoYW5uZWxbMl0gPSB7CisJCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkJLmRpZmZlcmVudGlhbCA9IDEsCisJCQkuaW5kZXhlZCA9IDEsCisJCQkuY2hhbm5lbCA9IDIsCisJCQkuY2hhbm5lbDIgPSAyLAorCQkJLmFkZHJlc3MgPSBBRDc3OTNfQ0hfQUlOM1BfQUlOM00sCisJCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkJLnNjYW5faW5kZXggPSAyLAorCQkJLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDE2LCAzMiwgMCkKKwkJfSwKKwkJLmNoYW5uZWxbM10gPSB7CisJCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkJLmRpZmZlcmVudGlhbCA9IDEsCisJCQkuZXh0ZW5kX25hbWUgPSAic2hvcnRlZCIsCisJCQkuaW5kZXhlZCA9IDEsCisJCQkuY2hhbm5lbCA9IDIsCisJCQkuY2hhbm5lbDIgPSAyLAorCQkJLmFkZHJlc3MgPSBBRDc3OTNfQ0hfQUlOMU1fQUlOMU0sCisJCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkJLnNjYW5faW5kZXggPSAyLAorCQkJLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDE2LCAzMiwgMCkKKwkJfSwKKwkJLmNoYW5uZWxbNF0gPSB7CisJCQkudHlwZSA9IElJT19URU1QLAorCQkJLmluZGV4ZWQgPSAxLAorCQkJLmNoYW5uZWwgPSAwLAorCQkJLmFkZHJlc3MgPSBBRDc3OTNfQ0hfVEVNUCwKKwkJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwKKwkJCS5zY2FuX2luZGV4ID0gNCwKKwkJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3MnLCAxNiwgMzIsIDApLAorCQl9LAorCQkuY2hhbm5lbFs1XSA9IHsKKwkJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCQkuZXh0ZW5kX25hbWUgPSAic3VwcGx5IiwKKwkJCS5pbmRleGVkID0gMSwKKwkJCS5jaGFubmVsID0gNCwKKwkJCS5hZGRyZXNzID0gQUQ3NzkzX0NIX0FWRERfTU9OSVRPUiwKKwkJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwKKwkJCS5zY2FuX2luZGV4ID0gNSwKKwkJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3MnLCAxNiwgMzIsIDApLAorCQl9LAogCQkuY2hhbm5lbFs2XSA9IElJT19DSEFOX1NPRlRfVElNRVNUQU1QKDYpLAogCX0sCiB9OwpAQCAtODMxLDcgKzkwNyw3IEBACiAJc3RydWN0IGFkNzc5M19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHNwaS0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IGFkNzc5M19zdGF0ZSAqc3Q7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKLQlpbnQgcmV0LCBpLCB2b2x0YWdlX3V2ID0gMCwgcmVnZG9uZSA9IDA7CisJaW50IHJldCwgaSwgdm9sdGFnZV91diA9IDA7CiAKIAlpZiAoIXBkYXRhKSB7CiAJCWRldl9lcnIoJnNwaS0+ZGV2LCAibm8gcGxhdGZvcm0gZGF0YT9cbiIpOwpAQCAtODgxLDEwICs5NTcsMTIgQEAKIAlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IDc7CiAJaW5kaW9fZGV2LT5pbmZvID0gJmFkNzc5M19pbmZvOwogCi0JZm9yIChpID0gMDsgaSA8IGluZGlvX2Rldi0+bnVtX2NoYW5uZWxzOyBpKyspCi0JCXN0LT5hdmFpbGFibGVfc2Nhbl9tYXNrc1tpXSA9ICgxIDw8IGkpIHwgKDEgPDwKLQkJCWluZGlvX2Rldi0+Y2hhbm5lbHNbaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgLSAxXS4KLQkJCXNjYW5faW5kZXgpOworCWZvciAoaSA9IDA7IGkgPCBpbmRpb19kZXYtPm51bV9jaGFubmVsczsgaSsrKSB7CisJCXNldF9iaXQoaSwgJnN0LT5hdmFpbGFibGVfc2Nhbl9tYXNrc1tpXSk7CisJCXNldF9iaXQoaW5kaW9fZGV2LT4KKwkJCWNoYW5uZWxzW2luZGlvX2Rldi0+bnVtX2NoYW5uZWxzIC0gMV0uc2Nhbl9pbmRleCwKKwkJCSZzdC0+YXZhaWxhYmxlX3NjYW5fbWFza3NbaV0pOworCX0KIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnN0LT53cV9kYXRhX2F2YWlsKTsKIApAQCAtODkyLDE4ICs5NzAsMTMgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX2Rpc2FibGVfcmVnOwogCi0JcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfdW5yZWdfcmluZzsKLQlyZWdkb25lID0gMTsKLQogCXJldCA9IGFkNzc5M19wcm9iZV90cmlnZ2VyKGluZGlvX2Rldik7CiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl91bnJlZ19yaW5nOwogCi0JcmV0ID0gaWlvX3JpbmdfYnVmZmVyX3JlZ2lzdGVyX2V4KGluZGlvX2Rldi0+cmluZywgMCwKLQkJCQkJICBpbmRpb19kZXYtPmNoYW5uZWxzLAotCQkJCQkgIGluZGlvX2Rldi0+bnVtX2NoYW5uZWxzKTsKKwlyZXQgPSBpaW9fYnVmZmVyX3JlZ2lzdGVyKGluZGlvX2RldiwKKwkJCQkgIGluZGlvX2Rldi0+Y2hhbm5lbHMsCisJCQkJICBpbmRpb19kZXYtPm51bV9jaGFubmVscyk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9yZW1vdmVfdHJpZ2dlcjsKIApAQCAtOTExLDEwICs5ODQsMTQgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOwogCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc7CisKIAlyZXR1cm4gMDsKIAogZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc6Ci0JaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIGVycm9yX3JlbW92ZV90cmlnZ2VyOgogCWFkNzc5M19yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOwogZXJyb3JfdW5yZWdfcmluZzoKQEAgLTkyNiwxMCArMTAwMyw3IEBACiAJaWYgKCFJU19FUlIoc3QtPnJlZykpCiAJCXJlZ3VsYXRvcl9wdXQoc3QtPnJlZyk7CiAKLQlpZiAocmVnZG9uZSkKLQkJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7Ci0JZWxzZQotCQlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC05MzksNyArMTAxMyw4IEBACiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOwogCXN0cnVjdCBhZDc3OTNfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAotCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldi0+cmluZyk7CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaWlvX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldik7CiAJYWQ3NzkzX3JlbW92ZV90cmlnZ2VyKGluZGlvX2Rldik7CiAJYWQ3NzkzX3JpbmdfY2xlYW51cChpbmRpb19kZXYpOwogCkBAIC05NDgsNyArMTAyMyw3IEBACiAJCXJlZ3VsYXRvcl9wdXQoc3QtPnJlZyk7CiAJfQogCi0JaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzgxNi5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3ODE2LmMKaW5kZXggMGM4NDIxNy4uYmRiOTA0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3ODE2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3ODE2LmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi9zeXNmcy5oIgpAQCAtMTExLDggKzExMiw4IEBACiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQljaGFyICpidWYpCiB7Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzgxNl9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAogCWlmIChjaGlwLT5tb2RlKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICJwb3dlci1zYXZlXG4iKTsKQEAgLTEyNSw4ICsxMjYsOCBAQAogCQljb25zdCBjaGFyICpidWYsCiAJCXNpemVfdCBsZW4pCiB7Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzgxNl9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAogCWlmIChzdHJjbXAoYnVmLCAiZnVsbCIpKSB7CiAJCWdwaW9fc2V0X3ZhbHVlKGNoaXAtPnJkd3JfcGluLCAxKTsKQEAgLTE1Nyw4ICsxNTgsOCBAQAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJY2hhciAqYnVmKQogewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3ODE2X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+Y2hhbm5lbF9pZCk7CiB9CkBAIC0xNjgsOCArMTY5LDggQEAKIAkJY29uc3QgY2hhciAqYnVmLAogCQlzaXplX3QgbGVuKQogewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3ODE2X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJdW5zaWduZWQgbG9uZyBkYXRhOwogCWludCByZXQ7CiAKQEAgLTE3OSwxMyArMTgwLDEzIEBACiAKIAlpZiAoZGF0YSA+IEFENzgxNl9DU19NQVggJiYgZGF0YSAhPSBBRDc4MTZfQ1NfTUFTSykgewogCQlkZXZfZXJyKCZjaGlwLT5zcGlfZGV2LT5kZXYsICJJbnZhbGlkIGNoYW5uZWwgaWQgJWx1IGZvciAlcy5cbiIsCi0JCQlkYXRhLCBkZXZfaW5mby0+bmFtZSk7CisJCQlkYXRhLCBpbmRpb19kZXYtPm5hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKLQl9IGVsc2UgaWYgKHN0cmNtcChkZXZfaW5mby0+bmFtZSwgImFkNzgxOCIpID09IDAgJiYgZGF0YSA+IDEpIHsKKwl9IGVsc2UgaWYgKHN0cmNtcChpbmRpb19kZXYtPm5hbWUsICJhZDc4MTgiKSA9PSAwICYmIGRhdGEgPiAxKSB7CiAJCWRldl9lcnIoJmNoaXAtPnNwaV9kZXYtPmRldiwKIAkJCSJJbnZhbGlkIGNoYW5uZWwgaWQgJWx1IGZvciBhZDc4MTguXG4iLCBkYXRhKTsKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JfSBlbHNlIGlmIChzdHJjbXAoZGV2X2luZm8tPm5hbWUsICJhZDc4MTYiKSA9PSAwICYmIGRhdGEgPiAwKSB7CisJfSBlbHNlIGlmIChzdHJjbXAoaW5kaW9fZGV2LT5uYW1lLCAiYWQ3ODE2IikgPT0gMCAmJiBkYXRhID4gMCkgewogCQlkZXZfZXJyKCZjaGlwLT5zcGlfZGV2LT5kZXYsCiAJCQkiSW52YWxpZCBjaGFubmVsIGlkICVsdSBmb3IgYWQ3ODE2LlxuIiwgZGF0YSk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjA2LDggKzIwNyw4IEBACiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQljaGFyICpidWYpCiB7Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNzgxNl9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAl1MTYgZGF0YTsKIAlzOCB2YWx1ZTsKIAlpbnQgcmV0OwpAQCAtMjQ2LDE2ICsyNDcsMTQgQEAKICAqIHRlbXBlcmF0dXJlIGJvdW5kIGV2ZW50cwogICovCiAKLSNkZWZpbmUgSUlPX0VWRU5UX0NPREVfQUQ3ODE2X09USSBJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fRVZfQ0xBU1NfVEVNUCwgXAorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9BRDc4MTZfT1RJIElJT19VTk1PRF9FVkVOVF9DT0RFKElJT19URU1QLAlcCiAJCQkJCQkgICAgICAgMCwJCVwKIAkJCQkJCSAgICAgICBJSU9fRVZfVFlQRV9USFJFU0gsIFwKIAkJCQkJCSAgICAgICBJSU9fRVZfRElSX0ZBTExJTkcpCiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBhZDc4MTZfZXZlbnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwcml2YXRlKQogewotCWlpb19wdXNoX2V2ZW50KHByaXZhdGUsIDAsCi0JCSAgICAgICBJSU9fRVZFTlRfQ09ERV9BRDc4MTZfT1RJLAotCQkgICAgICAgaWlvX2dldF90aW1lX25zKCkpOworCWlpb19wdXNoX2V2ZW50KHByaXZhdGUsIElJT19FVkVOVF9DT0RFX0FENzgxNl9PVEksIGlpb19nZXRfdGltZV9ucygpKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTI2Myw4ICsyNjIsOCBAQAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJY2hhciAqYnVmKQogewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3ODE2X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJaW50IHZhbHVlOwogCiAJaWYgKGNoaXAtPmNoYW5uZWxfaWQgPiBBRDc4MTZfQ1NfTUFYKSB7CkBAIC0yODQsOCArMjgzLDggQEAKIAkJY29uc3QgY2hhciAqYnVmLAogCQlzaXplX3QgbGVuKQogewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3ODE2X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJbG9uZyB2YWx1ZTsKIAl1OCBkYXRhOwogCWludCByZXQ7CkBAIC0zMjgsMTEgKzMyNywxMSBAQAogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDc4MTZfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0gewogCS5hdHRycyA9IGFkNzgxNl9ldmVudF9hdHRyaWJ1dGVzLAorCS5uYW1lID0gImV2ZW50cyIsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkNzgxNl9pbmZvID0gewogCS5hdHRycyA9ICZhZDc4MTZfYXR0cmlidXRlX2dyb3VwLAotCS5udW1faW50ZXJydXB0X2xpbmVzID0gMSwKIAkuZXZlbnRfYXR0cnMgPSAmYWQ3ODE2X2V2ZW50X2F0dHJpYnV0ZV9ncm91cCwKIAkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAogfTsKQEAgLTM5NywxMCArMzk2LDYgQEAKIAlpbmRpb19kZXYtPmluZm8gPSAmYWQ3ODE2X2luZm87CiAJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOwogCi0JcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfZnJlZV9ncGlvOwotCiAJaWYgKHNwaV9kZXYtPmlycSkgewogCQkvKiBPbmx5IGxvdyB0cmlnZ2VyIGlzIHN1cHBvcnRlZCBpbiBhZDc4MTYvNy84ICovCiAJCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKHNwaV9kZXYtPmlycSwKQEAgLTQxMCwxNiArNDA1LDE5IEBACiAJCQkJCSAgIGluZGlvX2Rldi0+bmFtZSwKIAkJCQkJICAgaW5kaW9fZGV2KTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gZXJyb3JfdW5yZWdfZGV2OworCQkJZ290byBlcnJvcl9mcmVlX2dwaW87CiAJfQogCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9pcnE7CisKIAlkZXZfaW5mbygmc3BpX2Rldi0+ZGV2LCAiJXMgdGVtcGVyYXR1cmUgc2Vuc29yIGFuZCBBREMgcmVnaXN0ZXJlZC5cbiIsCiAJCQkgaW5kaW9fZGV2LT5uYW1lKTsKIAogCXJldHVybiAwOwotCi1lcnJvcl91bnJlZ19kZXY6Ci0JaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CitlcnJvcl9mcmVlX2lycToKKwlmcmVlX2lycShzcGlfZGV2LT5pcnEsIGluZGlvX2Rldik7CiBlcnJvcl9mcmVlX2dwaW86CiAJZ3Bpb19mcmVlKGNoaXAtPmJ1c3lfcGluKTsKIGVycm9yX2ZyZWVfZ3Bpb19jb252ZXJ0OgpAQCAtNDM3LDEzICs0MzUsMTMgQEAKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZzcGlfZGV2LT5kZXYpOwogCXN0cnVjdCBhZDc4MTZfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAorCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwogCWRldl9zZXRfZHJ2ZGF0YSgmc3BpX2Rldi0+ZGV2LCBOVUxMKTsKIAlpZiAoc3BpX2Rldi0+aXJxKQogCQlmcmVlX2lycShzcGlfZGV2LT5pcnEsIGluZGlvX2Rldik7CiAJZ3Bpb19mcmVlKGNoaXAtPmJ1c3lfcGluKTsKIAlncGlvX2ZyZWUoY2hpcC0+Y29udmVydF9waW4pOwogCWdwaW9fZnJlZShjaGlwLT5yZHdyX3Bpbik7Ci0JaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CiAJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzg4Ny5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3ODg3LmgKaW5kZXggODM3MDQ2Yy4uMzQ1MmQxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3ODg3LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3ODg3LmgKQEAgLTgyLDEyICs4MiwxMiBAQAogCUlEX0FENzg4NwogfTsKIAotI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKLWludCBhZDc4ODdfc2Nhbl9mcm9tX3Jpbmcoc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QsIGxvbmcgbWFzayk7CisjaWZkZWYgQ09ORklHX0lJT19CVUZGRVIKK2ludCBhZDc4ODdfc2Nhbl9mcm9tX3Jpbmcoc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QsIGludCBjaGFubnVtKTsKIGludCBhZDc4ODdfcmVnaXN0ZXJfcmluZ19mdW5jc19hbmRfaW5pdChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIHZvaWQgYWQ3ODg3X3JpbmdfY2xlYW51cChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKLSNlbHNlIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGFkNzg4N19zY2FuX2Zyb21fcmluZyhzdHJ1Y3QgYWQ3ODg3X3N0YXRlICpzdCwgbG9uZyBtYXNrKQorI2Vsc2UgLyogQ09ORklHX0lJT19CVUZGRVIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGFkNzg4N19zY2FuX2Zyb21fcmluZyhzdHJ1Y3QgYWQ3ODg3X3N0YXRlICpzdCwgaW50IGNoYW5udW0pCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMDEsNSArMTAxLDUgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhZDc4ODdfcmluZ19jbGVhbnVwKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiB9Ci0jZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2VuZGlmIC8qIENPTkZJR19JSU9fQlVGRkVSICovCiAjZW5kaWYgLyogSUlPX0FEQ19BRDc4ODdfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzg4N19jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc4ODdfY29yZS5jCmluZGV4IDNkOTEyMWUuLjYwOWRjZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzg4N19jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3ODg3X2NvcmUuYwpAQCAtMTMsMTEgKzEzLDEyIEBACiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vc3lzZnMuaCIKLSNpbmNsdWRlICIuLi9yaW5nX2dlbmVyaWMuaCIKLSNpbmNsdWRlICJhZGMuaCIKKyNpbmNsdWRlICIuLi9idWZmZXJfZ2VuZXJpYy5oIgorCiAKICNpbmNsdWRlICJhZDc4ODcuaCIKIApAQCAtMzAsMjQgKzMxLDI0IEBACiAJcmV0dXJuIChzdC0+ZGF0YVsoY2ggKiAyKV0gPDwgOCkgfCBzdC0+ZGF0YVsoY2ggKiAyKSArIDFdOwogfQogCi1zdGF0aWMgaW50IGFkNzg4N19yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8sCitzdGF0aWMgaW50IGFkNzg4N19yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAogCQkJICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCiAJCQkgICBpbnQgKnZhbCwKIAkJCSAgIGludCAqdmFsMiwKIAkJCSAgIGxvbmcgbSkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBhZDc4ODdfc3RhdGUgKnN0ID0gaWlvX3ByaXYoZGV2X2luZm8pOworCXN0cnVjdCBhZDc4ODdfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAl1bnNpZ25lZCBpbnQgc2NhbGVfdXY7CiAKIAlzd2l0Y2ggKG0pIHsKIAljYXNlIDA6Ci0JCW11dGV4X2xvY2soJmRldl9pbmZvLT5tbG9jayk7Ci0JCWlmIChpaW9fcmluZ19lbmFibGVkKGRldl9pbmZvKSkKKwkJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJCWlmIChpaW9fYnVmZmVyX2VuYWJsZWQoaW5kaW9fZGV2KSkKIAkJCXJldCA9IGFkNzg4N19zY2FuX2Zyb21fcmluZyhzdCwgMSA8PCBjaGFuLT5hZGRyZXNzKTsKIAkJZWxzZQogCQkJcmV0ID0gYWQ3ODg3X3NjYW5fZGlyZWN0KHN0LCBjaGFuLT5hZGRyZXNzKTsKLQkJbXV0ZXhfdW5sb2NrKCZkZXZfaW5mby0+bWxvY2spOworCQltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOwogCiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKQEAgLTcwLDE0ICs3MSwyNCBAQAogCSAqIE1vcmUgZGV2aWNlcyBhZGRlZCBpbiBmdXR1cmUKIAkgKi8KIAlbSURfQUQ3ODg3XSA9IHsKLQkJLmNoYW5uZWxbMF0gPSBJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDEsIDAsCi0JCQkJICAgICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJCQkgICAgICAgMSwgMSwgSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwgMCksCi0KLQkJLmNoYW5uZWxbMV0gPSBJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDAsIDAsCi0JCQkJICAgICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJCQkgICAgICAgMCwgMCwgSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwgMCksCi0KKwkJLmNoYW5uZWxbMF0gPSB7CisJCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkJLmluZGV4ZWQgPSAxLAorCQkJLmNoYW5uZWwgPSAxLAorCQkJLmluZm9fbWFzayA9ICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKKwkJCS5hZGRyZXNzID0gMSwKKwkJCS5zY2FuX2luZGV4ID0gMSwKKwkJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3UnLCAxMiwgMTYsIDApLAorCQl9LAorCQkuY2hhbm5lbFsxXSA9IHsKKwkJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCQkuaW5kZXhlZCA9IDEsCisJCQkuY2hhbm5lbCA9IDAsCisJCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkJLmFkZHJlc3MgPSAwLAorCQkJLnNjYW5faW5kZXggPSAwLAorCQkJLnNjYW5fdHlwZSA9IElJT19TVCgndScsIDEyLCAxNiwgMCksCisJCX0sCiAJCS5jaGFubmVsWzJdID0gSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoMiksCiAJCS5pbnRfdnJlZl9tdiA9IDI1MDAsCiAJfSwKQEAgLTkyLDcgKzEwMyw3IEBACiB7CiAJc3RydWN0IGFkNzg4N19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHNwaS0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IGFkNzg4N19zdGF0ZSAqc3Q7Ci0JaW50IHJldCwgdm9sdGFnZV91diA9IDAsIHJlZ2RvbmUgPSAwOworCWludCByZXQsIHZvbHRhZ2VfdXYgPSAwOwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKHNpemVvZigqc3QpKTsKIAogCWlmIChpbmRpb19kZXYgPT0gTlVMTCkKQEAgLTE4OCwxOCArMTk5LDE5IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9kaXNhYmxlX3JlZzsKIAotCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX2Rpc2FibGVfcmVnOwotCXJlZ2RvbmUgPSAxOwotCi0JcmV0ID0gaWlvX3JpbmdfYnVmZmVyX3JlZ2lzdGVyX2V4KGluZGlvX2Rldi0+cmluZywgMCwKLQkJCQkJICBpbmRpb19kZXYtPmNoYW5uZWxzLAotCQkJCQkgIGluZGlvX2Rldi0+bnVtX2NoYW5uZWxzKTsKKwlyZXQgPSBpaW9fYnVmZmVyX3JlZ2lzdGVyKGluZGlvX2RldiwKKwkJCQkgIGluZGlvX2Rldi0+Y2hhbm5lbHMsCisJCQkJICBpbmRpb19kZXYtPm51bV9jaGFubmVscyk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9jbGVhbnVwX3Jpbmc7Ci0JcmV0dXJuIDA7CiAKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl91bnJlZ2lzdGVyX3Jpbmc7CisKKwlyZXR1cm4gMDsKK2Vycm9yX3VucmVnaXN0ZXJfcmluZzoKKwlpaW9fYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIGVycm9yX2NsZWFudXBfcmluZzoKIAlhZDc4ODdfcmluZ19jbGVhbnVwKGluZGlvX2Rldik7CiBlcnJvcl9kaXNhYmxlX3JlZzoKQEAgLTIwOCwxMCArMjIwLDcgQEAKIGVycm9yX3B1dF9yZWc6CiAJaWYgKCFJU19FUlIoc3QtPnJlZykpCiAJCXJlZ3VsYXRvcl9wdXQoc3QtPnJlZyk7Ci0JaWYgKHJlZ2RvbmUpCi0JCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwotCWVsc2UKLQkJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjIxLDEzICsyMzAsMTQgQEAKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CiAJc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCi0JaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIAlhZDc4ODdfcmluZ19jbGVhbnVwKGluZGlvX2Rldik7CiAJaWYgKCFJU19FUlIoc3QtPnJlZykpIHsKIAkJcmVndWxhdG9yX2Rpc2FibGUoc3QtPnJlZyk7CiAJCXJlZ3VsYXRvcl9wdXQoc3QtPnJlZyk7CiAJfQotCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc4ODdfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3ODg3X3JpbmcuYwppbmRleCAwYWM3YzBiLi5jYjc0Y2FkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc4ODdfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzg4N19yaW5nLmMKQEAgLTgsMjcgKzgsMjQgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCi0jaW5jbHVkZSAiLi4vcmluZ19nZW5lcmljLmgiCisjaW5jbHVkZSAiLi4vYnVmZmVyX2dlbmVyaWMuaCIKICNpbmNsdWRlICIuLi9yaW5nX3N3LmgiCi0jaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgotI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiLi4vdHJpZ2dlcl9jb25zdW1lci5oIgogCiAjaW5jbHVkZSAiYWQ3ODg3LmgiCiAKLWludCBhZDc4ODdfc2Nhbl9mcm9tX3Jpbmcoc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QsIGxvbmcgbWFzaykKK2ludCBhZDc4ODdfc2Nhbl9mcm9tX3Jpbmcoc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QsIGludCBjaGFubnVtKQogewotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBpaW9fcHJpdl90b19kZXYoc3QpLT5yaW5nOworCXN0cnVjdCBpaW9fYnVmZmVyICpyaW5nID0gaWlvX3ByaXZfdG9fZGV2KHN0KS0+YnVmZmVyOwogCWludCBjb3VudCA9IDAsIHJldDsKIAl1MTYgKnJpbmdfZGF0YTsKIAotCWlmICghKHJpbmctPnNjYW5fbWFzayAmIG1hc2spKSB7CisJaWYgKCEodGVzdF9iaXQoY2hhbm51bSwgcmluZy0+c2Nhbl9tYXNrKSkpIHsKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIGVycm9yX3JldDsKIAl9CkBAIC00NCw3ICs0MSw4IEBACiAJCWdvdG8gZXJyb3JfZnJlZV9yaW5nX2RhdGE7CiAKIAkvKiBmb3Igc2luZ2xlIGNoYW5uZWwgc2NhbiB0aGUgcmVzdWx0IGlzIHN0b3JlZCB3aXRoIHplcm8gb2Zmc2V0ICovCi0JaWYgKChyaW5nLT5zY2FuX21hc2sgPT0gKCgxIDw8IDEpIHwgKDEgPDwgMCkpKSAmJiAobWFzayA9PSAoMSA8PCAxKSkpCisJaWYgKCh0ZXN0X2JpdCgxLCByaW5nLT5zY2FuX21hc2spIHx8IHRlc3RfYml0KDAsIHJpbmctPnNjYW5fbWFzaykpICYmCisJICAgIChjaGFubnVtID09IDEpKQogCQljb3VudCA9IDE7CiAKIAlyZXQgPSBiZTE2X3RvX2NwdShyaW5nX2RhdGFbY291bnRdKTsKQEAgLTY1LDcgKzYzLDcgQEAKIHN0YXRpYyBpbnQgYWQ3ODg3X3JpbmdfcHJlZW5hYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJc3RydWN0IGFkNzg4N19zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBpbmRpb19kZXYtPnJpbmc7CisJc3RydWN0IGlpb19idWZmZXIgKnJpbmcgPSBpbmRpb19kZXYtPmJ1ZmZlcjsKIAogCXN0LT5kX3NpemUgPSByaW5nLT5zY2FuX2NvdW50ICoKIAkJc3QtPmNoaXBfaW5mby0+Y2hhbm5lbFswXS5zY2FuX3R5cGUuc3RvcmFnZWJpdHMgLyA4OwpAQCAtNzcsMTEgKzc1LDEyIEBACiAJCQlzdC0+ZF9zaXplICs9IHNpemVvZihzNjQpIC0gKHN0LT5kX3NpemUgJSBzaXplb2YoczY0KSk7CiAJfQogCi0JaWYgKGluZGlvX2Rldi0+cmluZy0+YWNjZXNzLT5zZXRfYnl0ZXNfcGVyX2RhdHVtKQotCQlpbmRpb19kZXYtPnJpbmctPmFjY2Vzcy0+c2V0X2J5dGVzX3Blcl9kYXR1bShpbmRpb19kZXYtPnJpbmcsCi0JCQkJCQkJICAgIHN0LT5kX3NpemUpOworCWlmIChpbmRpb19kZXYtPmJ1ZmZlci0+YWNjZXNzLT5zZXRfYnl0ZXNfcGVyX2RhdHVtKQorCQlpbmRpb19kZXYtPmJ1ZmZlci0+YWNjZXNzLT4KKwkJCXNldF9ieXRlc19wZXJfZGF0dW0oaW5kaW9fZGV2LT5idWZmZXIsIHN0LT5kX3NpemUpOwogCi0Jc3dpdGNoIChyaW5nLT5zY2FuX21hc2spIHsKKwkvKiBXZSBrbm93IHRoaXMgaXMgYSBzaW5nbGUgbG9uZyBzbyBjYW4gJ2NoZWF0JyAqLworCXN3aXRjaCAoKnJpbmctPnNjYW5fbWFzaykgewogCWNhc2UgKDEgPDwgMCk6CiAJCXN0LT5yaW5nX21zZyA9ICZzdC0+bXNnW0FENzg4N19DSDBdOwogCQlicmVhazsKQEAgLTExNSw5ICsxMTQsOSBAQAogc3RhdGljIGlycXJldHVybl90IGFkNzg4N190cmlnZ2VyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqcCkKIHsKIAlzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqcGYgPSBwOwotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwZi0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwZi0+aW5kaW9fZGV2OwogCXN0cnVjdCBhZDc4ODdfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gaW5kaW9fZGV2LT5yaW5nOworCXN0cnVjdCBpaW9fYnVmZmVyICpyaW5nID0gaW5kaW9fZGV2LT5idWZmZXI7CiAJczY0IHRpbWVfbnM7CiAJX191OCAqYnVmOwogCWludCBiX3NlbnQ7CkBAIC0xNDAsNyArMTM5LDcgQEAKIAkJbWVtY3B5KGJ1ZiArIHN0LT5kX3NpemUgLSBzaXplb2YoczY0KSwKIAkJICAgICAgICZ0aW1lX25zLCBzaXplb2YodGltZV9ucykpOwogCi0JaW5kaW9fZGV2LT5yaW5nLT5hY2Nlc3MtPnN0b3JlX3RvKGluZGlvX2Rldi0+cmluZywgYnVmLCB0aW1lX25zKTsKKwlpbmRpb19kZXYtPmJ1ZmZlci0+YWNjZXNzLT5zdG9yZV90byhpbmRpb19kZXYtPmJ1ZmZlciwgYnVmLCB0aW1lX25zKTsKIGRvbmU6CiAJa2ZyZWUoYnVmKTsKIAlpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShpbmRpb19kZXYtPnRyaWcpOwpAQCAtMTQ4LDEwICsxNDcsMTAgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX3Jpbmdfc2V0dXBfb3BzIGFkNzg4N19yaW5nX3NldHVwX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMgYWQ3ODg3X3Jpbmdfc2V0dXBfb3BzID0gewogCS5wcmVlbmFibGUgPSAmYWQ3ODg3X3JpbmdfcHJlZW5hYmxlLAotCS5wb3N0ZW5hYmxlID0gJmlpb190cmlnZ2VyZWRfcmluZ19wb3N0ZW5hYmxlLAotCS5wcmVkaXNhYmxlID0gJmlpb190cmlnZ2VyZWRfcmluZ19wcmVkaXNhYmxlLAorCS5wb3N0ZW5hYmxlID0gJmlpb190cmlnZ2VyZWRfYnVmZmVyX3Bvc3RlbmFibGUsCisJLnByZWRpc2FibGUgPSAmaWlvX3RyaWdnZXJlZF9idWZmZXJfcHJlZGlzYWJsZSwKIAkucG9zdGRpc2FibGUgPSAmYWQ3ODg3X3JpbmdfcG9zdGRpc2FibGUsCiB9OwogCkBAIC0xNTksMTMgKzE1OCwxMyBAQAogewogCWludCByZXQ7CiAKLQlpbmRpb19kZXYtPnJpbmcgPSBpaW9fc3dfcmJfYWxsb2NhdGUoaW5kaW9fZGV2KTsKLQlpZiAoIWluZGlvX2Rldi0+cmluZykgeworCWluZGlvX2Rldi0+YnVmZmVyID0gaWlvX3N3X3JiX2FsbG9jYXRlKGluZGlvX2Rldik7CisJaWYgKCFpbmRpb19kZXYtPmJ1ZmZlcikgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycm9yX3JldDsKIAl9CiAJLyogRWZmZWN0aXZlbHkgc2VsZWN0IHRoZSByaW5nIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiAqLwotCWluZGlvX2Rldi0+cmluZy0+YWNjZXNzID0gJnJpbmdfc3dfYWNjZXNzX2Z1bmNzOworCWluZGlvX2Rldi0+YnVmZmVyLT5hY2Nlc3MgPSAmcmluZ19zd19hY2Nlc3NfZnVuY3M7CiAJaW5kaW9fZGV2LT5wb2xsZnVuYyA9IGlpb19hbGxvY19wb2xsZnVuYygmaWlvX3BvbGxmdW5jX3N0b3JlX3RpbWUsCiAJCQkJCQkgJmFkNzg4N190cmlnZ2VyX2hhbmRsZXIsCiAJCQkJCQkgSVJRRl9PTkVTSE9ULApAQCAtMTc3LDI2ICsxNzYsMjAgQEAKIAkJZ290byBlcnJvcl9kZWFsbG9jYXRlX3N3X3JiOwogCX0KIAkvKiBSaW5nIGJ1ZmZlciBmdW5jdGlvbnMgLSBoZXJlIHRyaWdnZXIgc2V0dXAgcmVsYXRlZCAqLwotCWluZGlvX2Rldi0+cmluZy0+c2V0dXBfb3BzID0gJmFkNzg4N19yaW5nX3NldHVwX29wczsKKwlpbmRpb19kZXYtPmJ1ZmZlci0+c2V0dXBfb3BzID0gJmFkNzg4N19yaW5nX3NldHVwX29wczsKIAogCS8qIEZsYWcgdGhhdCBwb2xsZWQgcmluZyBidWZmZXJpbmcgaXMgcG9zc2libGUgKi8KLQlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX1JJTkdfVFJJR0dFUkVEOworCWluZGlvX2Rldi0+bW9kZXMgfD0gSU5ESU9fQlVGRkVSX1RSSUdHRVJFRDsKIAlyZXR1cm4gMDsKIAogZXJyb3JfZGVhbGxvY2F0ZV9zd19yYjoKLQlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPnJpbmcpOworCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+YnVmZmVyKTsKIGVycm9yX3JldDoKIAlyZXR1cm4gcmV0OwogfQogCiB2b2lkIGFkNzg4N19yaW5nX2NsZWFudXAoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKLQkvKiBlbnN1cmUgdGhhdCB0aGUgdHJpZ2dlciBoYXMgYmVlbiBkZXRhY2hlZCAqLwotCWlmIChpbmRpb19kZXYtPnRyaWcpIHsKLQkJaWlvX3B1dF90cmlnZ2VyKGluZGlvX2Rldi0+dHJpZyk7Ci0JCWlpb190cmlnZ2VyX2RldHRhY2hfcG9sbF9mdW5jKGluZGlvX2Rldi0+dHJpZywKLQkJCQkJICAgICAgaW5kaW9fZGV2LT5wb2xsZnVuYyk7Ci0JfQogCWlpb19kZWFsbG9jX3BvbGxmdW5jKGluZGlvX2Rldi0+cG9sbGZ1bmMpOwotCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7CisJaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5idWZmZXIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3OTl4LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc5OXguaAppbmRleCAwZGM5YjRjLi5lZGEwMWQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc5OXguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc5OXguaApAQCAtMTI0LDExICsxMjQsMTEgQEAKIGludCBhZDc5OTdfOF9zZXRfc2Nhbl9tb2RlKHN0cnVjdCBhZDc5OXhfc3RhdGUgKnN0LCB1bnNpZ25lZCBtYXNrKTsKIAogI2lmZGVmIENPTkZJR19BRDc5OVhfUklOR19CVUZGRVIKLWludCBhZDc5OXhfc2luZ2xlX2NoYW5uZWxfZnJvbV9yaW5nKHN0cnVjdCBhZDc5OXhfc3RhdGUgKnN0LCBsb25nIG1hc2spOworaW50IGFkNzk5eF9zaW5nbGVfY2hhbm5lbF9mcm9tX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgaW50IGNoYW5udW0pOwogaW50IGFkNzk5eF9yZWdpc3Rlcl9yaW5nX2Z1bmNzX2FuZF9pbml0KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogdm9pZCBhZDc5OXhfcmluZ19jbGVhbnVwKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogI2Vsc2UgLyogQ09ORklHX0FENzk5WF9SSU5HX0JVRkZFUiAqLwotaW50IGFkNzk5eF9zaW5nbGVfY2hhbm5lbF9mcm9tX3Jpbmcoc3RydWN0IGFkNzk5eF9zdGF0ZSAqc3QsIGxvbmcgbWFzaykKK2ludCBhZDc5OXhfc2luZ2xlX2NoYW5uZWxfZnJvbV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIGludCBjaGFubnVtKQogewogCXJldHVybiAtRUlOVkFMOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3OTl4X2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzk5eF9jb3JlLmMKaW5kZXggOTJjZmUyZS4uZWU2Y2Q3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3OTl4X2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc5OXhfY29yZS5jCkBAIC0zMSwxMiArMzEsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisjaW5jbHVkZSAiLi4vYnVmZmVyX2dlbmVyaWMuaCIKIAotI2luY2x1ZGUgIi4uL3JpbmdfZ2VuZXJpYy5oIgotI2luY2x1ZGUgImFkYy5oIgogI2luY2x1ZGUgImFkNzk5eC5oIgogCiAvKgpAQCAtMTM2LDQ5ICsxMzYsNTYgQEAKIAlyZXR1cm4gcnhidWY7CiB9CiAKLXN0YXRpYyBpbnQgYWQ3OTl4X3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbywKK3N0YXRpYyBpbnQgYWQ3OTl4X3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCiAJCQkgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKIAkJCSAgIGludCAqdmFsLAogCQkJICAgaW50ICp2YWwyLAogCQkJICAgbG9uZyBtKQogewogCWludCByZXQ7Ci0Jc3RydWN0IGFkNzk5eF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihkZXZfaW5mbyk7CisJc3RydWN0IGFkNzk5eF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCXVuc2lnbmVkIGludCBzY2FsZV91djsKIAogCXN3aXRjaCAobSkgewogCWNhc2UgMDoKLQkJbXV0ZXhfbG9jaygmZGV2X2luZm8tPm1sb2NrKTsKLQkJaWYgKGlpb19yaW5nX2VuYWJsZWQoZGV2X2luZm8pKQotCQkJcmV0ID0gYWQ3OTl4X3NpbmdsZV9jaGFubmVsX2Zyb21fcmluZyhzdCwKLQkJCQkxIDw8IGNoYW4tPmFkZHJlc3MpOworCQltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwkJaWYgKGlpb19idWZmZXJfZW5hYmxlZChpbmRpb19kZXYpKQorCQkJcmV0ID0gYWQ3OTl4X3NpbmdsZV9jaGFubmVsX2Zyb21fcmluZyhpbmRpb19kZXYsCisJCQkJCQkJICAgICAgY2hhbi0+c2Nhbl9pbmRleCk7CiAJCWVsc2UKLQkJCXJldCA9IGFkNzk5eF9zY2FuX2RpcmVjdChzdCwgY2hhbi0+YWRkcmVzcyk7Ci0JCW11dGV4X3VubG9jaygmZGV2X2luZm8tPm1sb2NrKTsKKwkJCXJldCA9IGFkNzk5eF9zY2FuX2RpcmVjdChzdCwgY2hhbi0+c2Nhbl9pbmRleCk7CisJCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CiAKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwotCQkqdmFsID0gKHJldCA+PiBzdC0+Y2hpcF9pbmZvLT5jaGFubmVsWzBdLnNjYW5fdHlwZS5zaGlmdCkgJgotCQkJUkVTX01BU0soc3QtPmNoaXBfaW5mby0+Y2hhbm5lbFswXS5zY2FuX3R5cGUucmVhbGJpdHMpOworCQkqdmFsID0gKHJldCA+PiBjaGFuLT5zY2FuX3R5cGUuc2hpZnQpICYKKwkJCVJFU19NQVNLKGNoYW4tPnNjYW5fdHlwZS5yZWFsYml0cyk7CiAJCXJldHVybiBJSU9fVkFMX0lOVDsKIAljYXNlICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKToKLQkJc2NhbGVfdXYgPSAoc3QtPmludF92cmVmX212ICogMTAwMCkKLQkJCT4+IHN0LT5jaGlwX2luZm8tPmNoYW5uZWxbMF0uc2Nhbl90eXBlLnJlYWxiaXRzOworCQlzY2FsZV91diA9IChzdC0+aW50X3ZyZWZfbXYgKiAxMDAwKSA+PiBjaGFuLT5zY2FuX3R5cGUucmVhbGJpdHM7CiAJCSp2YWwgPSAgc2NhbGVfdXYgLyAxMDAwOwogCQkqdmFsMiA9IChzY2FsZV91diAlIDEwMDApICogMTAwMDsKIAkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTUlDUk87CiAJfQogCXJldHVybiAtRUlOVkFMOwogfQotCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGFkNzk5OF9mcmVxdWVuY2llc1tdID0geworCVtBRDc5OThfQ1lDX0RJU10JPSAwLAorCVtBRDc5OThfQ1lDX1RDT05GXzMyXQk9IDE1NjI1LAorCVtBRDc5OThfQ1lDX1RDT05GXzY0XQk9IDc4MTIsCisJW0FENzk5OF9DWUNfVENPTkZfMTI4XQk9IDM5MDYsCisJW0FENzk5OF9DWUNfVENPTkZfNTEyXQk9IDk3NiwKKwlbQUQ3OTk4X0NZQ19UQ09ORl8xMDI0XQk9IDQ4OCwKKwlbQUQ3OTk4X0NZQ19UQ09ORl8yMDQ4XQk9IDI0NCwKK307CiBzdGF0aWMgc3NpemVfdCBhZDc5OXhfcmVhZF9mcmVxdWVuY3koc3RydWN0IGRldmljZSAqZGV2LAogCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkJY2hhciAqYnVmKQogewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDc5OXhfc3RhdGUgKnN0ID0gaWlvX3ByaXYoZGV2X2luZm8pOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3OTl4X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKLQlpbnQgcmV0LCBsZW4gPSAwOworCWludCByZXQ7CiAJdTggdmFsOwogCXJldCA9IGFkNzk5eF9pMmNfcmVhZDgoc3QsIEFENzk5OF9DWUNMRV9UTVJfUkVHLCAmdmFsKTsKIAlpZiAocmV0KQpAQCAtMTg2LDMzICsxOTMsNyBAQAogCiAJdmFsICY9IEFENzk5OF9DWUNfTUFTSzsKIAotCXN3aXRjaCAodmFsKSB7Ci0JY2FzZSBBRDc5OThfQ1lDX0RJUzoKLQkJbGVuID0gc3ByaW50ZihidWYsICIwXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRDc5OThfQ1lDX1RDT05GXzMyOgotCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIjE1NjI1XG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRDc5OThfQ1lDX1RDT05GXzY0OgotCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIjc4MTJcbiIpOwotCQlicmVhazsKLQljYXNlIEFENzk5OF9DWUNfVENPTkZfMTI4OgotCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIjM5MDZcbiIpOwotCQlicmVhazsKLQljYXNlIEFENzk5OF9DWUNfVENPTkZfMjU2OgotCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIjE5NTNcbiIpOwotCQlicmVhazsKLQljYXNlIEFENzk5OF9DWUNfVENPTkZfNTEyOgotCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIjk3NlxuIik7Ci0JCWJyZWFrOwotCWNhc2UgQUQ3OTk4X0NZQ19UQ09ORl8xMDI0OgotCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIjQ4OFxuIik7Ci0JCWJyZWFrOwotCWNhc2UgQUQ3OTk4X0NZQ19UQ09ORl8yMDQ4OgotCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIjI0NFxuIik7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gbGVuOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBhZDc5OThfZnJlcXVlbmNpZXNbdmFsXSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFkNzk5eF93cml0ZV9mcmVxdWVuY3koc3RydWN0IGRldmljZSAqZGV2LApAQCAtMjIwLDY4ICsyMDEsMTAxIEBACiAJCQkJCSBjb25zdCBjaGFyICpidWYsCiAJCQkJCSBzaXplX3QgbGVuKQogewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDc5OXhfc3RhdGUgKnN0ID0gaWlvX3ByaXYoZGV2X2luZm8pOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3OTl4X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKIAlsb25nIHZhbDsKLQlpbnQgcmV0OworCWludCByZXQsIGk7CiAJdTggdDsKIAogCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnZhbCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCW11dGV4X2xvY2soJmRldl9pbmZvLT5tbG9jayk7CisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CiAJcmV0ID0gYWQ3OTl4X2kyY19yZWFkOChzdCwgQUQ3OTk4X0NZQ0xFX1RNUl9SRUcsICZ0KTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX3JldF9tdXRleDsKIAkvKiBXaXBlIHRoZSBiaXRzIGNsZWFuICovCiAJdCAmPSB+QUQ3OTk4X0NZQ19NQVNLOwogCi0Jc3dpdGNoICh2YWwpIHsKLQljYXNlIDE1NjI1OgotCQl0IHw9IEFENzk5OF9DWUNfVENPTkZfMzI7Ci0JCWJyZWFrOwotCWNhc2UgNzgxMjoKLQkJdCB8PSBBRDc5OThfQ1lDX1RDT05GXzY0OwotCQlicmVhazsKLQljYXNlIDM5MDY6Ci0JCXQgfD0gQUQ3OTk4X0NZQ19UQ09ORl8xMjg7Ci0JCWJyZWFrOwotCWNhc2UgMTk1MzoKLQkJdCB8PSBBRDc5OThfQ1lDX1RDT05GXzI1NjsKLQkJYnJlYWs7Ci0JY2FzZSA5NzY6Ci0JCXQgfD0gQUQ3OTk4X0NZQ19UQ09ORl81MTI7Ci0JCWJyZWFrOwotCWNhc2UgNDg4OgotCQl0IHw9IEFENzk5OF9DWUNfVENPTkZfMTAyNDsKLQkJYnJlYWs7Ci0JY2FzZSAyNDQ6Ci0JCXQgfD0gQUQ3OTk4X0NZQ19UQ09ORl8yMDQ4OwotCQlicmVhazsKLQljYXNlICAwOgotCQl0IHw9IEFENzk5OF9DWUNfRElTOwotCQlicmVhazsKLQlkZWZhdWx0OgorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFkNzk5OF9mcmVxdWVuY2llcyk7IGkrKykKKwkJaWYgKHZhbCA9PSBhZDc5OThfZnJlcXVlbmNpZXNbaV0pCisJCQlicmVhazsKKwlpZiAoaSA9PSBBUlJBWV9TSVpFKGFkNzk5OF9mcmVxdWVuY2llcykpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBlcnJvcl9yZXRfbXV0ZXg7CiAJfQotCisJdCB8PSBpOwogCXJldCA9IGFkNzk5eF9pMmNfd3JpdGU4KHN0LCBBRDc5OThfQ1lDTEVfVE1SX1JFRywgdCk7CiAKIGVycm9yX3JldF9tdXRleDoKLQltdXRleF91bmxvY2soJmRldl9pbmZvLT5tbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKIAogCXJldHVybiByZXQgPyByZXQgOiBsZW47CiB9CiAKK3N0YXRpYyBpbnQgYWQ3OTl4X3JlYWRfZXZlbnRfY29uZmlnKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkJICAgIHU2NCBldmVudF9jb2RlKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgY29uc3QgdTggYWQ3OTl4X3RocmVzaG9sZF9hZGRyZXNzZXNbXVsyXSA9IHsKKwl7IEFENzk5OF9EQVRBTE9XX0NIMV9SRUcsIEFENzk5OF9EQVRBSElHSF9DSDFfUkVHIH0sCisJeyBBRDc5OThfREFUQUxPV19DSDJfUkVHLCBBRDc5OThfREFUQUhJR0hfQ0gyX1JFRyB9LAorCXsgQUQ3OTk4X0RBVEFMT1dfQ0gzX1JFRywgQUQ3OTk4X0RBVEFISUdIX0NIM19SRUcgfSwKKwl7IEFENzk5OF9EQVRBTE9XX0NINF9SRUcsIEFENzk5OF9EQVRBSElHSF9DSDRfUkVHIH0sCit9OworCitzdGF0aWMgaW50IGFkNzk5eF93cml0ZV9ldmVudF92YWx1ZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJCSAgICB1NjQgZXZlbnRfY29kZSwKKwkJCQkgICAgaW50IHZhbCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhZDc5OXhfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgZGlyZWN0aW9uID0gISEoSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9ESVIoZXZlbnRfY29kZSkgPT0KKwkJCSAgIElJT19FVl9ESVJfRkFMTElORyk7CisJaW50IG51bWJlciA9IElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfTlVNKGV2ZW50X2NvZGUpOworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJcmV0ID0gYWQ3OTl4X2kyY193cml0ZTE2KHN0LAorCQkJCSBhZDc5OXhfdGhyZXNob2xkX2FkZHJlc3Nlc1tudW1iZXJdW2RpcmVjdGlvbl0sCisJCQkJIHZhbCk7CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWQ3OTl4X3JlYWRfZXZlbnRfdmFsdWUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkgICAgdTY0IGV2ZW50X2NvZGUsCisJCQkJICAgIGludCAqdmFsKQoreworCWludCByZXQ7CisJc3RydWN0IGFkNzk5eF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCBkaXJlY3Rpb24gPSAhIShJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX0RJUihldmVudF9jb2RlKSA9PQorCQkJICAgSUlPX0VWX0RJUl9GQUxMSU5HKTsKKwlpbnQgbnVtYmVyID0gSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9OVU0oZXZlbnRfY29kZSk7CisJdTE2IHZhbGluOworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJcmV0ID0gYWQ3OTl4X2kyY19yZWFkMTYoc3QsCisJCQkJYWQ3OTl4X3RocmVzaG9sZF9hZGRyZXNzZXNbbnVtYmVyXVtkaXJlY3Rpb25dLAorCQkJCSZ2YWxpbik7CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwkqdmFsID0gdmFsaW47CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHNzaXplX3QgYWQ3OTl4X3JlYWRfY2hhbm5lbF9jb25maWcoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkJY2hhciAqYnVmKQogewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDc5OXhfc3RhdGUgKnN0ID0gaWlvX3ByaXYoZGV2X2luZm8pOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3OTl4X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOwogCiAJaW50IHJldDsKQEAgLTI5OCw4ICszMTIsOCBAQAogCQkJCQkgY29uc3QgY2hhciAqYnVmLAogCQkJCQkgc2l6ZV90IGxlbikKIHsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ3OTl4X3N0YXRlICpzdCA9IGlpb19wcml2KGRldl9pbmZvKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzk5eF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKIAogCWxvbmcgdmFsOwpAQCAtMzA5LDkgKzMyMyw5IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCW11dGV4X2xvY2soJmRldl9pbmZvLT5tbG9jayk7CisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CiAJcmV0ID0gYWQ3OTl4X2kyY193cml0ZTE2KHN0LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXZfaW5mby0+bWxvY2spOworCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CiAKIAlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOwogfQpAQCAtMzM0LDgzICszNDgsNDEgQEAKIAogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKIAkJaWYgKHN0YXR1cyAmICgxIDw8IGkpKQotCQkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LCAwLAorCQkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LAogCQkJCSAgICAgICBpICYgMHgxID8KLQkJCQkgICAgICAgSUlPX0VWRU5UX0NPREVfSU5fSElHSF9USFJFU0goaSA+PiAxKSA6Ci0JCQkJICAgICAgIElJT19FVkVOVF9DT0RFX0lOX0xPV19USFJFU0goaSA+PiAxKSwKKwkJCQkgICAgICAgSUlPX1VOTU9EX0VWRU5UX0NPREUoSUlPX1ZPTFRBR0UsCisJCQkJCQkJICAgIChpID4+IDEpLAorCQkJCQkJCSAgICBJSU9fRVZfVFlQRV9USFJFU0gsCisJCQkJCQkJICAgIElJT19FVl9ESVJfUklTSU5HKSA6CisJCQkJICAgICAgIElJT19VTk1PRF9FVkVOVF9DT0RFKElJT19WT0xUQUdFLAorCQkJCQkJCSAgICAoaSA+PiAxKSwKKwkJCQkJCQkgICAgSUlPX0VWX1RZUEVfVEhSRVNILAorCQkJCQkJCSAgICBJSU9fRVZfRElSX0ZBTExJTkcpLAogCQkJCSAgICAgICBpaW9fZ2V0X3RpbWVfbnMoKSk7CiAJfQogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluMF90aHJlc2hfbG93X3ZhbHVlLAotCQkgICAgICAgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgICAgICBhZDc5OXhfcmVhZF9jaGFubmVsX2NvbmZpZywKLQkJICAgICAgIGFkNzk5eF93cml0ZV9jaGFubmVsX2NvbmZpZywKLQkJICAgICAgIEFENzk5OF9EQVRBTE9XX0NIMV9SRUcpOwotCi1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluMF90aHJlc2hfaGlnaF92YWx1ZSwKLQkJICAgICAgIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICAgICAgYWQ3OTl4X3JlYWRfY2hhbm5lbF9jb25maWcsCi0JCSAgICAgICBhZDc5OXhfd3JpdGVfY2hhbm5lbF9jb25maWcsCi0JCSAgICAgICBBRDc5OThfREFUQUhJR0hfQ0gxX1JFRyk7Ci0KLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW4wX3RocmVzaF9ib3RoX2h5c3RfcmF3LAorc3RhdGljIElJT19ERVZJQ0VfQVRUUihpbl92b2x0YWdlMF90aHJlc2hfYm90aF9oeXN0X3JhdywKIAkJICAgICAgIFNfSVJVR08gfCBTX0lXVVNSLAogCQkgICAgICAgYWQ3OTl4X3JlYWRfY2hhbm5lbF9jb25maWcsCiAJCSAgICAgICBhZDc5OXhfd3JpdGVfY2hhbm5lbF9jb25maWcsCiAJCSAgICAgICBBRDc5OThfSFlTVF9DSDFfUkVHKTsKIAotc3RhdGljIElJT19ERVZJQ0VfQVRUUihpbjFfdGhyZXNoX2xvd192YWx1ZSwKLQkJICAgICAgIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICAgICAgYWQ3OTl4X3JlYWRfY2hhbm5lbF9jb25maWcsCi0JCSAgICAgICBhZDc5OXhfd3JpdGVfY2hhbm5lbF9jb25maWcsCi0JCSAgICAgICBBRDc5OThfREFUQUxPV19DSDJfUkVHKTsKLQotc3RhdGljIElJT19ERVZJQ0VfQVRUUihpbjFfdGhyZXNoX2hpZ2hfdmFsdWUsCi0JCSAgICAgICBTX0lSVUdPIHwgU19JV1VTUiwKLQkJICAgICAgIGFkNzk5eF9yZWFkX2NoYW5uZWxfY29uZmlnLAotCQkgICAgICAgYWQ3OTl4X3dyaXRlX2NoYW5uZWxfY29uZmlnLAotCQkgICAgICAgQUQ3OTk4X0RBVEFISUdIX0NIMl9SRUcpOwotCi1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluMV90aHJlc2hfYm90aF9oeXN0X3JhdywKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW5fdm9sdGFnZTFfdGhyZXNoX2JvdGhfaHlzdF9yYXcsCiAJCSAgICAgICBTX0lSVUdPIHwgU19JV1VTUiwKIAkJICAgICAgIGFkNzk5eF9yZWFkX2NoYW5uZWxfY29uZmlnLAogCQkgICAgICAgYWQ3OTl4X3dyaXRlX2NoYW5uZWxfY29uZmlnLAogCQkgICAgICAgQUQ3OTk4X0hZU1RfQ0gyX1JFRyk7CiAKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW4yX3RocmVzaF9sb3dfdmFsdWUsCi0JCSAgICAgICBTX0lSVUdPIHwgU19JV1VTUiwKLQkJICAgICAgIGFkNzk5eF9yZWFkX2NoYW5uZWxfY29uZmlnLAotCQkgICAgICAgYWQ3OTl4X3dyaXRlX2NoYW5uZWxfY29uZmlnLAotCQkgICAgICAgQUQ3OTk4X0RBVEFMT1dfQ0gzX1JFRyk7Ci0KLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW4yX3RocmVzaF9oaWdoX3ZhbHVlLAotCQkgICAgICAgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgICAgICBhZDc5OXhfcmVhZF9jaGFubmVsX2NvbmZpZywKLQkJICAgICAgIGFkNzk5eF93cml0ZV9jaGFubmVsX2NvbmZpZywKLQkJICAgICAgIEFENzk5OF9EQVRBSElHSF9DSDNfUkVHKTsKLQotc3RhdGljIElJT19ERVZJQ0VfQVRUUihpbjJfdGhyZXNoX2JvdGhfaHlzdF9yYXcsCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluX3ZvbHRhZ2UyX3RocmVzaF9ib3RoX2h5c3RfcmF3LAogCQkgICAgICAgU19JUlVHTyB8IFNfSVdVU1IsCiAJCSAgICAgICBhZDc5OXhfcmVhZF9jaGFubmVsX2NvbmZpZywKIAkJICAgICAgIGFkNzk5eF93cml0ZV9jaGFubmVsX2NvbmZpZywKIAkJICAgICAgIEFENzk5OF9IWVNUX0NIM19SRUcpOwogCi1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluM190aHJlc2hfbG93X3ZhbHVlLAotCQkgICAgICAgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgICAgICBhZDc5OXhfcmVhZF9jaGFubmVsX2NvbmZpZywKLQkJICAgICAgIGFkNzk5eF93cml0ZV9jaGFubmVsX2NvbmZpZywKLQkJICAgICAgIEFENzk5OF9EQVRBTE9XX0NINF9SRUcpOwotCi1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluM190aHJlc2hfaGlnaF92YWx1ZSwKLQkJICAgICAgIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICAgICAgYWQ3OTl4X3JlYWRfY2hhbm5lbF9jb25maWcsCi0JCSAgICAgICBhZDc5OXhfd3JpdGVfY2hhbm5lbF9jb25maWcsCi0JCSAgICAgICBBRDc5OThfREFUQUhJR0hfQ0g0X1JFRyk7Ci0KLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW4zX3RocmVzaF9ib3RoX2h5c3RfcmF3LAorc3RhdGljIElJT19ERVZJQ0VfQVRUUihpbl92b2x0YWdlM190aHJlc2hfYm90aF9oeXN0X3JhdywKIAkJICAgICAgIFNfSVJVR08gfCBTX0lXVVNSLAogCQkgICAgICAgYWQ3OTl4X3JlYWRfY2hhbm5lbF9jb25maWcsCiAJCSAgICAgICBhZDc5OXhfd3JpdGVfY2hhbm5lbF9jb25maWcsCkBAIC00MjIsMTggKzM5NCwxMCBAQAogc3RhdGljIElJT19DT05TVF9BVFRSX1NBTVBfRlJFUV9BVkFJTCgiMTU2MjUgNzgxMiAzOTA2IDE5NTMgOTc2IDQ4OCAyNDQgMCIpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3OTkzXzRfN184X2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKLQkmaWlvX2Rldl9hdHRyX2luMF90aHJlc2hfbG93X3ZhbHVlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9pbjBfdGhyZXNoX2hpZ2hfdmFsdWUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2luMF90aHJlc2hfYm90aF9oeXN0X3Jhdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfaW4xX3RocmVzaF9sb3dfdmFsdWUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2luMV90aHJlc2hfaGlnaF92YWx1ZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfaW4xX3RocmVzaF9ib3RoX2h5c3RfcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9pbjJfdGhyZXNoX2xvd192YWx1ZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfaW4yX3RocmVzaF9oaWdoX3ZhbHVlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9pbjJfdGhyZXNoX2JvdGhfaHlzdF9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2luM190aHJlc2hfbG93X3ZhbHVlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9pbjNfdGhyZXNoX2hpZ2hfdmFsdWUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2luM190aHJlc2hfYm90aF9oeXN0X3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fdm9sdGFnZTBfdGhyZXNoX2JvdGhfaHlzdF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX3ZvbHRhZ2UxX3RocmVzaF9ib3RoX2h5c3RfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbl92b2x0YWdlMl90aHJlc2hfYm90aF9oeXN0X3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fdm9sdGFnZTNfdGhyZXNoX2JvdGhfaHlzdF9yYXcuZGV2X2F0dHIuYXR0ciwKIAkmaWlvX2Rldl9hdHRyX3NhbXBsaW5nX2ZyZXF1ZW5jeS5kZXZfYXR0ci5hdHRyLAogCSZpaW9fY29uc3RfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3lfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCiAJTlVMTCwKQEAgLTQ0MSwxNSArNDA1LDEyIEBACiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNzk5M180XzdfOF9ldmVudF9hdHRyc19ncm91cCA9IHsKIAkuYXR0cnMgPSBhZDc5OTNfNF83XzhfZXZlbnRfYXR0cmlidXRlcywKKwkubmFtZSA9ICJldmVudHMiLAogfTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNzk5Ml9ldmVudF9hdHRyaWJ1dGVzW10gPSB7Ci0JJmlpb19kZXZfYXR0cl9pbjBfdGhyZXNoX2xvd192YWx1ZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfaW4wX3RocmVzaF9oaWdoX3ZhbHVlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9pbjBfdGhyZXNoX2JvdGhfaHlzdF9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2luMV90aHJlc2hfbG93X3ZhbHVlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9pbjFfdGhyZXNoX2hpZ2hfdmFsdWUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2luMV90aHJlc2hfYm90aF9oeXN0X3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fdm9sdGFnZTBfdGhyZXNoX2JvdGhfaHlzdF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX3ZvbHRhZ2UxX3RocmVzaF9ib3RoX2h5c3RfcmF3LmRldl9hdHRyLmF0dHIsCiAJJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwKIAkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAogCU5VTEwsCkBAIC00NTcsNiArNDE4LDcgQEAKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWQ3OTkyX2V2ZW50X2F0dHJzX2dyb3VwID0gewogCS5hdHRycyA9IGFkNzk5Ml9ldmVudF9hdHRyaWJ1dGVzLAorCS5uYW1lID0gImV2ZW50cyIsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkNzk5MV9pbmZvID0gewpAQCAtNDY2LDE4MSArNDI4LDM3NCBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkNzk5Ml9pbmZvID0gewogCS5yZWFkX3JhdyA9ICZhZDc5OXhfcmVhZF9yYXcsCi0JLm51bV9pbnRlcnJ1cHRfbGluZXMgPSAxLAogCS5ldmVudF9hdHRycyA9ICZhZDc5OTJfZXZlbnRfYXR0cnNfZ3JvdXAsCisJLnJlYWRfZXZlbnRfY29uZmlnID0gJmFkNzk5eF9yZWFkX2V2ZW50X2NvbmZpZywKKwkucmVhZF9ldmVudF92YWx1ZSA9ICZhZDc5OXhfcmVhZF9ldmVudF92YWx1ZSwKKwkud3JpdGVfZXZlbnRfdmFsdWUgPSAmYWQ3OTl4X3dyaXRlX2V2ZW50X3ZhbHVlLAogCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkNzk5M180XzdfOF9pbmZvID0gewogCS5yZWFkX3JhdyA9ICZhZDc5OXhfcmVhZF9yYXcsCi0JLm51bV9pbnRlcnJ1cHRfbGluZXMgPSAxLAogCS5ldmVudF9hdHRycyA9ICZhZDc5OTNfNF83XzhfZXZlbnRfYXR0cnNfZ3JvdXAsCisJLnJlYWRfZXZlbnRfY29uZmlnID0gJmFkNzk5eF9yZWFkX2V2ZW50X2NvbmZpZywKKwkucmVhZF9ldmVudF92YWx1ZSA9ICZhZDc5OXhfcmVhZF9ldmVudF92YWx1ZSwKKwkud3JpdGVfZXZlbnRfdmFsdWUgPSAmYWQ3OTl4X3dyaXRlX2V2ZW50X3ZhbHVlLAogCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCiB9OwogCisjZGVmaW5lIEFENzk5WF9FVl9NQVNLIChJSU9fRVZfQklUKElJT19FVl9UWVBFX1RIUkVTSCwgSUlPX0VWX0RJUl9SSVNJTkcpIHwgXAorCQkJSUlPX0VWX0JJVChJSU9fRVZfVFlQRV9USFJFU0gsIElJT19FVl9ESVJfRkFMTElORykpCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWQ3OTl4X2NoaXBfaW5mbyBhZDc5OXhfY2hpcF9pbmZvX3RibFtdID0gewogCVthZDc5OTFdID0gewotCQkuY2hhbm5lbFswXSA9IElJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgMCwgMCwKLQkJCQkgICAgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkJCSAgICAgICAwLCAwLCBJSU9fU1QoJ3UnLCAxMiwgMTYsIDApLCAwKSwKLQkJLmNoYW5uZWxbMV0gPSBJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDEsIDAsCi0JCQkJICAgICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJCQkgICAgICAgMSwgMSwgSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwgMCksCi0JCS5jaGFubmVsWzJdID0gSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAyLCAwLAotCQkJCSAgICAgICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCQkJICAgICAgIDIsIDIsIElJT19TVCgndScsIDEyLCAxNiwgMCksIDApLAotCQkuY2hhbm5lbFszXSA9IElJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgMywgMCwKLQkJCQkgICAgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkJCSAgICAgICAzLCAzLCBJSU9fU1QoJ3UnLCAxMiwgMTYsIDApLCAwKSwKLQkJLmNoYW5uZWxbNF0gPSBJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCg0KSwKKwkJLmNoYW5uZWwgPSB7CisJCQlbMF0gPSB7CisJCQkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJCQkuaW5kZXhlZCA9IDEsCisJCQkJLmNoYW5uZWwgPSAwLAorCQkJCS5zY2FuX2luZGV4ID0gMCwKKwkJCQkuc2Nhbl90eXBlID0gSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwKKwkJCX0sCisJCQlbMV0gPSB7CisJCQkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJCQkuaW5kZXhlZCA9IDEsCisJCQkJLmNoYW5uZWwgPSAxLAorCQkJCS5zY2FuX2luZGV4ID0gMSwKKwkJCQkuc2Nhbl90eXBlID0gSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwKKwkJCX0sCisJCQlbMl0gPSB7CisJCQkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJCQkuaW5kZXhlZCA9IDEsCisJCQkJLmNoYW5uZWwgPSAyLAorCQkJCS5zY2FuX2luZGV4ID0gMiwKKwkJCQkuc2Nhbl90eXBlID0gSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwKKwkJCX0sCisJCQlbM10gPSB7CisJCQkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJCQkuaW5kZXhlZCA9IDEsCisJCQkJLmNoYW5uZWwgPSAzLAorCQkJCS5zY2FuX2luZGV4ID0gMywKKwkJCQkuc2Nhbl90eXBlID0gSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwKKwkJCX0sCisJCQlbNF0gPSBJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCg0KSwKKwkJfSwKIAkJLm51bV9jaGFubmVscyA9IDUsCiAJCS5pbnRfdnJlZl9tdiA9IDQwOTYsCiAJCS5pbmZvID0gJmFkNzk5MV9pbmZvLAogCX0sCiAJW2FkNzk5NV0gPSB7Ci0JCS5jaGFubmVsWzBdID0gSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAwLCAwLAotCQkJCSAgICAgICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCQkJICAgICAgIDAsIDAsIElJT19TVCgndScsIDEwLCAxNiwgMCksIDApLAotCQkuY2hhbm5lbFsxXSA9IElJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgMSwgMCwKLQkJCQkgICAgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkJCSAgICAgICAxLCAxLCBJSU9fU1QoJ3UnLCAxMCwgMTYsIDApLCAwKSwKLQkJLmNoYW5uZWxbMl0gPSBJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDIsIDAsCi0JCQkJICAgICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJCQkgICAgICAgMiwgMiwgSUlPX1NUKCd1JywgMTAsIDE2LCAwKSwgMCksCi0JCS5jaGFubmVsWzNdID0gSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAzLCAwLAotCQkJCSAgICAgICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCQkJICAgICAgIDMsIDMsIElJT19TVCgndScsIDEwLCAxNiwgMCksIDApLAotCQkuY2hhbm5lbFs0XSA9IElJT19DSEFOX1NPRlRfVElNRVNUQU1QKDQpLAorCQkuY2hhbm5lbCA9IHsKKwkJCVswXSA9IHsKKwkJCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkJCS5pbmRleGVkID0gMSwKKwkJCQkuY2hhbm5lbCA9IDAsCisJCQkJLnNjYW5faW5kZXggPSAwLAorCQkJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3UnLCAxMCwgMTYsIDIpLAorCQkJfSwKKwkJCVsxXSA9IHsKKwkJCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkJCS5pbmRleGVkID0gMSwKKwkJCQkuY2hhbm5lbCA9IDEsCisJCQkJLnNjYW5faW5kZXggPSAxLAorCQkJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3UnLCAxMCwgMTYsIDIpLAorCQkJfSwKKwkJCVsyXSA9IHsKKwkJCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkJCS5pbmRleGVkID0gMSwKKwkJCQkuY2hhbm5lbCA9IDIsCisJCQkJLnNjYW5faW5kZXggPSAyLAorCQkJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3UnLCAxMCwgMTYsIDIpLAorCQkJfSwKKwkJCVszXSA9IHsKKwkJCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkJCS5pbmRleGVkID0gMSwKKwkJCQkuY2hhbm5lbCA9IDMsCisJCQkJLnNjYW5faW5kZXggPSAzLAorCQkJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3UnLCAxMCwgMTYsIDIpLAorCQkJfSwKKwkJCVs0XSA9IElJT19DSEFOX1NPRlRfVElNRVNUQU1QKDQpLAorCQl9LAogCQkubnVtX2NoYW5uZWxzID0gNSwKIAkJLmludF92cmVmX212ID0gMTAyNCwKIAkJLmluZm8gPSAmYWQ3OTkxX2luZm8sCiAJfSwKIAlbYWQ3OTk5XSA9IHsKLQkJLmNoYW5uZWxbMF0gPSBJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDAsIDAsCi0JCQkJICAgICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJCQkgICAgICAgMCwgMCwgSUlPX1NUKCd1JywgMTAsIDE2LCAwKSwgMCksCi0JCS5jaGFubmVsWzFdID0gSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAxLCAwLAotCQkJCSAgICAgICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCQkJICAgICAgIDEsIDEsIElJT19TVCgndScsIDEwLCAxNiwgMCksIDApLAotCQkuY2hhbm5lbFsyXSA9IElJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgMiwgMCwKLQkJCQkgICAgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkJCSAgICAgICAyLCAyLCBJSU9fU1QoJ3UnLCAxMCwgMTYsIDApLCAwKSwKLQkJLmNoYW5uZWxbM10gPSBJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDMsIDAsCi0JCQkJICAgICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJCQkgICAgICAgMywgMywgSUlPX1NUKCd1JywgMTAsIDE2LCAwKSwgMCksCi0JCS5jaGFubmVsWzRdID0gSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoNCksCisJCS5jaGFubmVsID0geworCQkJWzBdID0geworCQkJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCQkJLmluZGV4ZWQgPSAxLAorCQkJCS5jaGFubmVsID0gMCwKKwkJCQkuc2Nhbl9pbmRleCA9IDAsCisJCQkJLnNjYW5fdHlwZSA9IElJT19TVCgndScsIDgsIDE2LCA0KSwKKwkJCX0sCisJCQlbMV0gPSB7CisJCQkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJCQkuaW5kZXhlZCA9IDEsCisJCQkJLmNoYW5uZWwgPSAxLAorCQkJCS5zY2FuX2luZGV4ID0gMSwKKwkJCQkuc2Nhbl90eXBlID0gSUlPX1NUKCd1JywgOCwgMTYsIDQpLAorCQkJfSwKKwkJCVsyXSA9IHsKKwkJCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkJCS5pbmRleGVkID0gMSwKKwkJCQkuY2hhbm5lbCA9IDIsCisJCQkJLnNjYW5faW5kZXggPSAyLAorCQkJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3UnLCA4LCAxNiwgNCksCisJCQl9LAorCQkJWzNdID0geworCQkJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCQkJLmluZGV4ZWQgPSAxLAorCQkJCS5jaGFubmVsID0gMywKKwkJCQkuc2Nhbl9pbmRleCA9IDMsCisJCQkJLnNjYW5fdHlwZSA9IElJT19TVCgndScsIDgsIDE2LCA0KSwKKwkJCX0sCisJCQlbNF0gPSBJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCg0KSwKKwkJfSwKIAkJLm51bV9jaGFubmVscyA9IDUsCiAJCS5pbnRfdnJlZl9tdiA9IDEwMjQsCiAJCS5pbmZvID0gJmFkNzk5MV9pbmZvLAogCX0sCiAJW2FkNzk5Ml0gPSB7Ci0JCS5jaGFubmVsWzBdID0gSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAwLCAwLAotCQkJCSAgICAgICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCQkJICAgICAgIDAsIDAsIElJT19TVCgndScsIDEyLCAxNiwgMCksIDApLAotCQkuY2hhbm5lbFsxXSA9IElJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgMSwgMCwKLQkJCQkgICAgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkJCSAgICAgICAxLCAxLCBJSU9fU1QoJ3UnLCAxMiwgMTYsIDApLCAwKSwKLQkJLmNoYW5uZWxbMl0gPSBJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCgyKSwKKwkJLmNoYW5uZWwgPSB7CisJCQlbMF0gPSB7CisJCQkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJCQkuaW5kZXhlZCA9IDEsCisJCQkJLmNoYW5uZWwgPSAwLAorCQkJCS5zY2FuX2luZGV4ID0gMCwKKwkJCQkuc2Nhbl90eXBlID0gSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwKKwkJCQkuZXZlbnRfbWFzayA9IEFENzk5WF9FVl9NQVNLLAorCQkJfSwKKwkJCVsxXSA9IHsKKwkJCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkJCS5pbmRleGVkID0gMSwKKwkJCQkuY2hhbm5lbCA9IDEsCisJCQkJLnNjYW5faW5kZXggPSAxLAorCQkJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3UnLCAxMiwgMTYsIDApLAorCQkJCS5ldmVudF9tYXNrID0gQUQ3OTlYX0VWX01BU0ssCisJCQl9LAorCQkJWzJdID0gSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoMiksCisJCX0sCiAJCS5udW1fY2hhbm5lbHMgPSAzLAogCQkuaW50X3ZyZWZfbXYgPSA0MDk2LAogCQkuZGVmYXVsdF9jb25maWcgPSBBRDc5OThfQUxFUlRfRU4sCiAJCS5pbmZvID0gJmFkNzk5Ml9pbmZvLAogCX0sCiAJW2FkNzk5M10gPSB7Ci0JCS5jaGFubmVsWzBdID0gSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAwLCAwLAotCQkJCSAgICAgICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCQkJICAgICAgIDAsIDAsIElJT19TVCgndScsIDEwLCAxNiwgMCksIDApLAotCQkuY2hhbm5lbFsxXSA9IElJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgMSwgMCwKLQkJCQkgICAgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkJCSAgICAgICAxLCAxLCBJSU9fU1QoJ3UnLCAxMCwgMTYsIDApLCAwKSwKLQkJLmNoYW5uZWxbMl0gPSBJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDIsIDAsCi0JCQkJICAgICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJCQkgICAgICAgMiwgMiwgSUlPX1NUKCd1JywgMTAsIDE2LCAwKSwgMCksCi0JCS5jaGFubmVsWzNdID0gSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAzLCAwLAotCQkJCSAgICAgICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCQkJICAgICAgIDMsIDMsIElJT19TVCgndScsIDEwLCAxNiwgMCksIDApLAotCQkuY2hhbm5lbFs0XSA9IElJT19DSEFOX1NPRlRfVElNRVNUQU1QKDQpLAorCQkuY2hhbm5lbCA9IHsKKwkJCVswXSA9IHsKKwkJCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkJCS5pbmRleGVkID0gMSwKKwkJCQkuY2hhbm5lbCA9IDAsCisJCQkJLnNjYW5faW5kZXggPSAwLAorCQkJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3UnLCAxMCwgMTYsIDIpLAorCQkJCS5ldmVudF9tYXNrID0gQUQ3OTlYX0VWX01BU0ssCisJCQl9LAorCQkJWzFdID0geworCQkJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCQkJLmluZGV4ZWQgPSAxLAorCQkJCS5jaGFubmVsID0gMSwKKwkJCQkuc2Nhbl9pbmRleCA9IDEsCisJCQkJLnNjYW5fdHlwZSA9IElJT19TVCgndScsIDEwLCAxNiwgMiksCisJCQkJLmV2ZW50X21hc2sgPSBBRDc5OVhfRVZfTUFTSywKKwkJCX0sCisJCQlbMl0gPSB7CisJCQkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJCQkuaW5kZXhlZCA9IDEsCisJCQkJLmNoYW5uZWwgPSAyLAorCQkJCS5zY2FuX2luZGV4ID0gMiwKKwkJCQkuc2Nhbl90eXBlID0gSUlPX1NUKCd1JywgMTAsIDE2LCAyKSwKKwkJCQkuZXZlbnRfbWFzayA9IEFENzk5WF9FVl9NQVNLLAorCQkJfSwKKwkJCVszXSA9IHsKKwkJCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkJCS5pbmRleGVkID0gMSwKKwkJCQkuY2hhbm5lbCA9IDMsCisJCQkJLnNjYW5faW5kZXggPSAzLAorCQkJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3UnLCAxMCwgMTYsIDIpLAorCQkJCS5ldmVudF9tYXNrID0gQUQ3OTlYX0VWX01BU0ssCisJCQl9LAorCQkJWzRdID0gSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoNCksCisJCX0sCiAJCS5udW1fY2hhbm5lbHMgPSA1LAogCQkuaW50X3ZyZWZfbXYgPSAxMDI0LAogCQkuZGVmYXVsdF9jb25maWcgPSBBRDc5OThfQUxFUlRfRU4sCiAJCS5pbmZvID0gJmFkNzk5M180XzdfOF9pbmZvLAogCX0sCiAJW2FkNzk5NF0gPSB7Ci0JCS5jaGFubmVsWzBdID0gSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAwLCAwLAotCQkJCSAgICAgICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCQkJICAgICAgIDAsIDAsIElJT19TVCgndScsIDEyLCAxNiwgMCksIDApLAotCQkuY2hhbm5lbFsxXSA9IElJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgMSwgMCwKLQkJCQkgICAgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkJCSAgICAgICAxLCAxLCBJSU9fU1QoJ3UnLCAxMiwgMTYsIDApLCAwKSwKLQkJLmNoYW5uZWxbMl0gPSBJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDIsIDAsCi0JCQkJICAgICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJCQkgICAgICAgMiwgMiwgSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwgMCksCi0JCS5jaGFubmVsWzNdID0gSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAzLCAwLAotCQkJCSAgICAgICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCQkJICAgICAgIDMsIDMsIElJT19TVCgndScsIDEyLCAxNiwgMCksIDApLAotCQkuY2hhbm5lbFs0XSA9IElJT19DSEFOX1NPRlRfVElNRVNUQU1QKDQpLAorCQkuY2hhbm5lbCA9IHsKKwkJCVswXSA9IHsKKwkJCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkJCS5pbmRleGVkID0gMSwKKwkJCQkuY2hhbm5lbCA9IDAsCisJCQkJLnNjYW5faW5kZXggPSAwLAorCQkJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3UnLCAxMiwgMTYsIDApLAorCQkJCS5ldmVudF9tYXNrID0gQUQ3OTlYX0VWX01BU0ssCisJCQl9LAorCQkJWzFdID0geworCQkJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCQkJLmluZGV4ZWQgPSAxLAorCQkJCS5jaGFubmVsID0gMSwKKwkJCQkuc2Nhbl9pbmRleCA9IDEsCisJCQkJLnNjYW5fdHlwZSA9IElJT19TVCgndScsIDEyLCAxNiwgMCksCisJCQkJLmV2ZW50X21hc2sgPSBBRDc5OVhfRVZfTUFTSywKKwkJCX0sCisJCQlbMl0gPSB7CisJCQkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJCQkuaW5kZXhlZCA9IDEsCisJCQkJLmNoYW5uZWwgPSAyLAorCQkJCS5zY2FuX2luZGV4ID0gMiwKKwkJCQkuc2Nhbl90eXBlID0gSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwKKwkJCQkuZXZlbnRfbWFzayA9IEFENzk5WF9FVl9NQVNLLAorCQkJfSwKKwkJCVszXSA9IHsKKwkJCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkJCS5pbmRleGVkID0gMSwKKwkJCQkuY2hhbm5lbCA9IDMsCisJCQkJLnNjYW5faW5kZXggPSAzLAorCQkJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3UnLCAxMiwgMTYsIDApLAorCQkJCS5ldmVudF9tYXNrID0gQUQ3OTlYX0VWX01BU0ssCisJCQl9LAorCQkJWzRdID0gSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoNCksCisJCX0sCiAJCS5udW1fY2hhbm5lbHMgPSA1LAogCQkuaW50X3ZyZWZfbXYgPSA0MDk2LAogCQkuZGVmYXVsdF9jb25maWcgPSBBRDc5OThfQUxFUlRfRU4sCiAJCS5pbmZvID0gJmFkNzk5M180XzdfOF9pbmZvLAogCX0sCiAJW2FkNzk5N10gPSB7Ci0JCS5jaGFubmVsWzBdID0gSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAwLCAwLAotCQkJCQkgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJCQkJICAwLCAwLCBJSU9fU1QoJ3UnLCAxMCwgMTYsIDApLCAwKSwKLQkJLmNoYW5uZWxbMV0gPSBJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDEsIDAsCi0JCQkJCSAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkJCQkgIDEsIDEsIElJT19TVCgndScsIDEwLCAxNiwgMCksIDApLAotCQkuY2hhbm5lbFsyXSA9IElJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgMiwgMCwKLQkJCQkJICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCQkJCSAgMiwgMiwgSUlPX1NUKCd1JywgMTAsIDE2LCAwKSwgMCksCi0JCS5jaGFubmVsWzNdID0gSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAzLCAwLAotCQkJCQkgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJCQkJICAzLCAzLCBJSU9fU1QoJ3UnLCAxMCwgMTYsIDApLCAwKSwKLQkJLmNoYW5uZWxbNF0gPSBJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDQsIDAsCi0JCQkJCSAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkJCQkgIDQsIDQsIElJT19TVCgndScsIDEwLCAxNiwgMCksIDApLAotCQkuY2hhbm5lbFs1XSA9IElJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgNSwgMCwKLQkJCQkJICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCQkJCSAgNSwgNSwgSUlPX1NUKCd1JywgMTAsIDE2LCAwKSwgMCksCi0JCS5jaGFubmVsWzZdID0gSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCA2LCAwLAotCQkJCQkgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJCQkJICA2LCA2LCBJSU9fU1QoJ3UnLCAxMCwgMTYsIDApLCAwKSwKLQkJLmNoYW5uZWxbN10gPSBJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDcsIDAsCi0JCQkJCSAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkJCQkgIDcsIDcsIElJT19TVCgndScsIDEwLCAxNiwgMCksIDApLAotCQkuY2hhbm5lbFs4XSA9IElJT19DSEFOX1NPRlRfVElNRVNUQU1QKDgpLAorCQkuY2hhbm5lbCA9IHsKKwkJCVswXSA9IHsKKwkJCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkJCS5pbmRleGVkID0gMSwKKwkJCQkuY2hhbm5lbCA9IDAsCisJCQkJLnNjYW5faW5kZXggPSAwLAorCQkJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3UnLCAxMCwgMTYsIDIpLAorCQkJCS5ldmVudF9tYXNrID0gQUQ3OTlYX0VWX01BU0ssCisJCQl9LAorCQkJWzFdID0geworCQkJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCQkJLmluZGV4ZWQgPSAxLAorCQkJCS5jaGFubmVsID0gMSwKKwkJCQkuc2Nhbl9pbmRleCA9IDEsCisJCQkJLnNjYW5fdHlwZSA9IElJT19TVCgndScsIDEwLCAxNiwgMiksCisJCQkJLmV2ZW50X21hc2sgPSBBRDc5OVhfRVZfTUFTSywKKwkJCX0sCisJCQlbMl0gPSB7CisJCQkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJCQkuaW5kZXhlZCA9IDEsCisJCQkJLmNoYW5uZWwgPSAyLAorCQkJCS5zY2FuX2luZGV4ID0gMiwKKwkJCQkuc2Nhbl90eXBlID0gSUlPX1NUKCd1JywgMTAsIDE2LCAyKSwKKwkJCQkuZXZlbnRfbWFzayA9IEFENzk5WF9FVl9NQVNLLAorCQkJfSwKKwkJCVszXSA9IHsKKwkJCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkJCS5pbmRleGVkID0gMSwKKwkJCQkuY2hhbm5lbCA9IDMsCisJCQkJLnNjYW5faW5kZXggPSAzLAorCQkJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3UnLCAxMCwgMTYsIDIpLAorCQkJCS5ldmVudF9tYXNrID0gQUQ3OTlYX0VWX01BU0ssCisJCQl9LAorCQkJWzRdID0geworCQkJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCQkJLmluZGV4ZWQgPSAxLAorCQkJCS5jaGFubmVsID0gNCwKKwkJCQkuc2Nhbl9pbmRleCA9IDQsCisJCQkJLnNjYW5fdHlwZSA9IElJT19TVCgndScsIDEwLCAxNiwgMiksCisJCQl9LAorCQkJWzVdID0geworCQkJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCQkJLmluZGV4ZWQgPSAxLAorCQkJCS5jaGFubmVsID0gNSwKKwkJCQkuc2Nhbl9pbmRleCA9IDUsCisJCQkJLnNjYW5fdHlwZSA9IElJT19TVCgndScsIDEwLCAxNiwgMiksCisJCQl9LAorCQkJWzZdID0geworCQkJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCQkJLmluZGV4ZWQgPSAxLAorCQkJCS5jaGFubmVsID0gNiwKKwkJCQkuc2Nhbl9pbmRleCA9IDYsCisJCQkJLnNjYW5fdHlwZSA9IElJT19TVCgndScsIDEwLCAxNiwgMiksCisJCQl9LAorCQkJWzddID0geworCQkJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCQkJLmluZGV4ZWQgPSAxLAorCQkJCS5jaGFubmVsID0gNywKKwkJCQkuc2Nhbl9pbmRleCA9IDcsCisJCQkJLnNjYW5fdHlwZSA9IElJT19TVCgndScsIDEwLCAxNiwgMiksCisJCQl9LAorCQkJWzhdID0gSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoOCksCisJCX0sCiAJCS5udW1fY2hhbm5lbHMgPSA5LAogCQkuaW50X3ZyZWZfbXYgPSAxMDI0LAogCQkuZGVmYXVsdF9jb25maWcgPSBBRDc5OThfQUxFUlRfRU4sCiAJCS5pbmZvID0gJmFkNzk5M180XzdfOF9pbmZvLAogCX0sCiAJW2FkNzk5OF0gPSB7Ci0JCS5jaGFubmVsWzBdID0gSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAwLCAwLAotCQkJCSAgICAgICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCQkJICAgICAgIDAsIDAsIElJT19TVCgndScsIDEyLCAxNiwgMCksIDApLAotCQkuY2hhbm5lbFsxXSA9IElJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgMSwgMCwKLQkJCQkgICAgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkJCSAgICAgICAxLCAxLCBJSU9fU1QoJ3UnLCAxMiwgMTYsIDApLCAwKSwKLQkJLmNoYW5uZWxbMl0gPSBJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDIsIDAsCi0JCQkJICAgICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJCQkgICAgICAgMiwgMiwgSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwgMCksCi0JCS5jaGFubmVsWzNdID0gSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAzLCAwLAotCQkJCSAgICAgICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCQkJICAgICAgIDMsIDMsIElJT19TVCgndScsIDEyLCAxNiwgMCksIDApLAotCQkuY2hhbm5lbFs0XSA9IElJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgNCwgMCwKLQkJCQkgICAgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkJCSAgICAgICA0LCA0LCBJSU9fU1QoJ3UnLCAxMiwgMTYsIDApLCAwKSwKLQkJLmNoYW5uZWxbNV0gPSBJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDUsIDAsCi0JCQkJICAgICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJCQkgICAgICAgNSwgNSwgSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwgMCksCi0JCS5jaGFubmVsWzZdID0gSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCA2LCAwLAotCQkJCSAgICAgICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCQkJICAgICAgIDYsIDYsIElJT19TVCgndScsIDEyLCAxNiwgMCksIDApLAotCQkuY2hhbm5lbFs3XSA9IElJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgNywgMCwKLQkJCQkJICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCQkJCSAgNywgNywgSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwgMCksCi0JCS5jaGFubmVsWzhdID0gSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoOCksCisJCS5jaGFubmVsID0geworCQkJWzBdID0geworCQkJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCQkJLmluZGV4ZWQgPSAxLAorCQkJCS5jaGFubmVsID0gMCwKKwkJCQkuc2Nhbl9pbmRleCA9IDAsCisJCQkJLnNjYW5fdHlwZSA9IElJT19TVCgndScsIDEyLCAxNiwgMCksCisJCQkJLmV2ZW50X21hc2sgPSBBRDc5OVhfRVZfTUFTSywKKwkJCX0sCisJCQlbMV0gPSB7CisJCQkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJCQkuaW5kZXhlZCA9IDEsCisJCQkJLmNoYW5uZWwgPSAxLAorCQkJCS5zY2FuX2luZGV4ID0gMSwKKwkJCQkuc2Nhbl90eXBlID0gSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwKKwkJCQkuZXZlbnRfbWFzayA9IEFENzk5WF9FVl9NQVNLLAorCQkJfSwKKwkJCVsyXSA9IHsKKwkJCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkJCS5pbmRleGVkID0gMSwKKwkJCQkuY2hhbm5lbCA9IDIsCisJCQkJLnNjYW5faW5kZXggPSAyLAorCQkJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3UnLCAxMiwgMTYsIDApLAorCQkJCS5ldmVudF9tYXNrID0gQUQ3OTlYX0VWX01BU0ssCisJCQl9LAorCQkJWzNdID0geworCQkJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCQkJLmluZGV4ZWQgPSAxLAorCQkJCS5jaGFubmVsID0gMywKKwkJCQkuc2Nhbl9pbmRleCA9IDMsCisJCQkJLnNjYW5fdHlwZSA9IElJT19TVCgndScsIDEyLCAxNiwgMCksCisJCQkJLmV2ZW50X21hc2sgPSBBRDc5OVhfRVZfTUFTSywKKwkJCX0sCisJCQlbNF0gPSB7CisJCQkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJCQkuaW5kZXhlZCA9IDEsCisJCQkJLmNoYW5uZWwgPSA0LAorCQkJCS5zY2FuX2luZGV4ID0gNCwKKwkJCQkuc2Nhbl90eXBlID0gSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwKKwkJCX0sCisJCQlbNV0gPSB7CisJCQkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJCQkuaW5kZXhlZCA9IDEsCisJCQkJLmNoYW5uZWwgPSA1LAorCQkJCS5zY2FuX2luZGV4ID0gNSwKKwkJCQkuc2Nhbl90eXBlID0gSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwKKwkJCX0sCisJCQlbNl0gPSB7CisJCQkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJCQkuaW5kZXhlZCA9IDEsCisJCQkJLmNoYW5uZWwgPSA2LAorCQkJCS5zY2FuX2luZGV4ID0gNiwKKwkJCQkuc2Nhbl90eXBlID0gSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwKKwkJCX0sCisJCQlbN10gPSB7CisJCQkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJCQkuaW5kZXhlZCA9IDEsCisJCQkJLmNoYW5uZWwgPSA3LAorCQkJCS5zY2FuX2luZGV4ID0gNywKKwkJCQkuc2Nhbl90eXBlID0gSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwKKwkJCX0sCisJCQlbOF0gPSBJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCg4KSwKKwkJfSwKIAkJLm51bV9jaGFubmVscyA9IDksCiAJCS5pbnRfdnJlZl9tdiA9IDQwOTYsCiAJCS5kZWZhdWx0X2NvbmZpZyA9IEFENzk5OF9BTEVSVF9FTiwKQEAgLTY1MSw3ICs4MDYsNyBAQAogc3RhdGljIGludCBfX2RldmluaXQgYWQ3OTl4X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkJICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewotCWludCByZXQsIHJlZ2RvbmUgPSAwOworCWludCByZXQ7CiAJc3RydWN0IGFkNzk5eF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IGFkNzk5eF9zdGF0ZSAqc3Q7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2Uoc2l6ZW9mKCpzdCkpOwpAQCAtNjg1LDcgKzg0MCw2IEBACiAJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OwogCWluZGlvX2Rldi0+bmFtZSA9IGlkLT5uYW1lOwogCWluZGlvX2Rldi0+aW5mbyA9IHN0LT5jaGlwX2luZm8tPmluZm87Ci0JaW5kaW9fZGV2LT5uYW1lID0gaWQtPm5hbWU7CiAKIAlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CiAJaW5kaW9fZGV2LT5jaGFubmVscyA9IHN0LT5jaGlwX2luZm8tPmNoYW5uZWw7CkBAIC02OTUsMTQgKzg0OSw5IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9kaXNhYmxlX3JlZzsKIAotCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX2NsZWFudXBfcmluZzsKLQlyZWdkb25lID0gMTsKLQotCXJldCA9IGlpb19yaW5nX2J1ZmZlcl9yZWdpc3Rlcl9leChpbmRpb19kZXYtPnJpbmcsIDAsCi0JCQkJCSAgaW5kaW9fZGV2LT5jaGFubmVscywKLQkJCQkJICBpbmRpb19kZXYtPm51bV9jaGFubmVscyk7CisJcmV0ID0gaWlvX2J1ZmZlcl9yZWdpc3RlcihpbmRpb19kZXYsCisJCQkJICBpbmRpb19kZXYtPmNoYW5uZWxzLAorCQkJCSAgaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfY2xlYW51cF9yaW5nOwogCkBAIC03MTcsOSArODY2LDE0IEBACiAJCWlmIChyZXQpCiAJCQlnb3RvIGVycm9yX2NsZWFudXBfcmluZzsKIAl9CisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9pcnE7CiAKIAlyZXR1cm4gMDsKIAorZXJyb3JfZnJlZV9pcnE6CisJZnJlZV9pcnEoY2xpZW50LT5pcnEsIGluZGlvX2Rldik7CiBlcnJvcl9jbGVhbnVwX3Jpbmc6CiAJYWQ3OTl4X3JpbmdfY2xlYW51cChpbmRpb19kZXYpOwogZXJyb3JfZGlzYWJsZV9yZWc6CkBAIC03MjgsMTAgKzg4Miw3IEBACiBlcnJvcl9wdXRfcmVnOgogCWlmICghSVNfRVJSKHN0LT5yZWcpKQogCQlyZWd1bGF0b3JfcHV0KHN0LT5yZWcpOwotCWlmIChyZWdkb25lKQotCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKLQllbHNlCi0JCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTc0MSwxNiArODkyLDE3IEBACiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXN0cnVjdCBhZDc5OXhfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAorCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwogCWlmIChjbGllbnQtPmlycSA+IDApCiAJCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBpbmRpb19kZXYpOwogCi0JaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIAlhZDc5OXhfcmluZ19jbGVhbnVwKGluZGlvX2Rldik7CiAJaWYgKCFJU19FUlIoc3QtPnJlZykpIHsKIAkJcmVndWxhdG9yX2Rpc2FibGUoc3QtPnJlZyk7CiAJCXJlZ3VsYXRvcl9wdXQoc3QtPnJlZyk7CiAJfQotCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc5OXhfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3OTl4X3JpbmcuYwppbmRleCAwMzc2YTgyLi5lM2Y0Njk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc5OXhfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzk5eF9yaW5nLmMKQEAgLTEwLDI5ICsxMCwyNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKLSNpbmNsdWRlICIuLi9yaW5nX2dlbmVyaWMuaCIKKyNpbmNsdWRlICIuLi9idWZmZXJfZ2VuZXJpYy5oIgogI2luY2x1ZGUgIi4uL3Jpbmdfc3cuaCIKLSNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCi0jaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICIuLi90cmlnZ2VyX2NvbnN1bWVyLmgiCiAKICNpbmNsdWRlICJhZDc5OXguaCIKIAotaW50IGFkNzk5eF9zaW5nbGVfY2hhbm5lbF9mcm9tX3Jpbmcoc3RydWN0IGFkNzk5eF9zdGF0ZSAqc3QsIGxvbmcgbWFzaykKK2ludCBhZDc5OXhfc2luZ2xlX2NoYW5uZWxfZnJvbV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIGludCBjaGFubnVtKQogewotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBpaW9fcHJpdl90b19kZXYoc3QpLT5yaW5nOworCXN0cnVjdCBpaW9fYnVmZmVyICpyaW5nID0gaW5kaW9fZGV2LT5idWZmZXI7CiAJaW50IGNvdW50ID0gMCwgcmV0OwogCXUxNiAqcmluZ19kYXRhOwogCi0JaWYgKCEocmluZy0+c2Nhbl9tYXNrICYgbWFzaykpIHsKKwlpZiAoISh0ZXN0X2JpdChjaGFubnVtLCByaW5nLT5zY2FuX21hc2spKSkgewogCQlyZXQgPSAtRUJVU1k7CiAJCWdvdG8gZXJyb3JfcmV0OwogCX0KQEAgLTQ3LDEzICs0NCw3IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9mcmVlX3JpbmdfZGF0YTsKIAkvKiBOZWVkIGEgY291bnQgb2YgY2hhbm5lbHMgcHJpb3IgdG8gdGhpcyBvbmUgKi8KLQltYXNrID4+PSAxOwotCXdoaWxlIChtYXNrKSB7Ci0JCWlmIChtYXNrICYgcmluZy0+c2Nhbl9tYXNrKQotCQkJY291bnQrKzsKLQkJbWFzayA+Pj0gMTsKLQl9Ci0KKwljb3VudCA9IGJpdG1hcF93ZWlnaHQocmluZy0+c2Nhbl9tYXNrLCBjaGFubnVtKTsKIAlyZXQgPSBiZTE2X3RvX2NwdShyaW5nX2RhdGFbY291bnRdKTsKIAogZXJyb3JfZnJlZV9yaW5nX2RhdGE6CkBAIC03MSw3ICs2Miw3IEBACiAgKiovCiBzdGF0aWMgaW50IGFkNzk5eF9yaW5nX3ByZWVuYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBpbmRpb19kZXYtPnJpbmc7CisJc3RydWN0IGlpb19idWZmZXIgKnJpbmcgPSBpbmRpb19kZXYtPmJ1ZmZlcjsKIAlzdHJ1Y3QgYWQ3OTl4X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKIAkvKgpAQCAtODAsNyArNzEsNyBAQAogCSAqLwogCiAJaWYgKHN0LT5pZCA9PSBhZDc5OTcgfHwgc3QtPmlkID09IGFkNzk5OCkKLQkJYWQ3OTk3Xzhfc2V0X3NjYW5fbW9kZShzdCwgcmluZy0+c2Nhbl9tYXNrKTsKKwkJYWQ3OTk3Xzhfc2V0X3NjYW5fbW9kZShzdCwgKnJpbmctPnNjYW5fbWFzayk7CiAKIAlzdC0+ZF9zaXplID0gcmluZy0+c2Nhbl9jb3VudCAqIDI7CiAKQEAgLTkxLDkgKzgyLDkgQEAKIAkJCXN0LT5kX3NpemUgKz0gc2l6ZW9mKHM2NCkgLSAoc3QtPmRfc2l6ZSAlIHNpemVvZihzNjQpKTsKIAl9CiAKLQlpZiAoaW5kaW9fZGV2LT5yaW5nLT5hY2Nlc3MtPnNldF9ieXRlc19wZXJfZGF0dW0pCi0JCWluZGlvX2Rldi0+cmluZy0+YWNjZXNzLT5zZXRfYnl0ZXNfcGVyX2RhdHVtKGluZGlvX2Rldi0+cmluZywKLQkJCQkJCQkgICAgc3QtPmRfc2l6ZSk7CisJaWYgKGluZGlvX2Rldi0+YnVmZmVyLT5hY2Nlc3MtPnNldF9ieXRlc19wZXJfZGF0dW0pCisJCWluZGlvX2Rldi0+YnVmZmVyLT5hY2Nlc3MtPgorCQkJc2V0X2J5dGVzX3Blcl9kYXR1bShpbmRpb19kZXYtPmJ1ZmZlciwgc3QtPmRfc2l6ZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwOCw5ICs5OSw5IEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgYWQ3OTl4X3RyaWdnZXJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwKQogewogCXN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZiA9IHA7Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5pbmRpb19kZXY7CiAJc3RydWN0IGFkNzk5eF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBpbmRpb19kZXYtPnJpbmc7CisJc3RydWN0IGlpb19idWZmZXIgKnJpbmcgPSBpbmRpb19kZXYtPmJ1ZmZlcjsKIAlzNjQgdGltZV9uczsKIAlfX3U4ICpyeGJ1ZjsKIAlpbnQgYl9zZW50OwpAQCAtMTI0LDEyICsxMTUsMTIgQEAKIAljYXNlIGFkNzk5MToKIAljYXNlIGFkNzk5NToKIAljYXNlIGFkNzk5OToKLQkJY21kID0gc3QtPmNvbmZpZyB8IChyaW5nLT5zY2FuX21hc2sgPDwgQUQ3OTlYX0NIQU5ORUxfU0hJRlQpOworCQljbWQgPSBzdC0+Y29uZmlnIHwgKCpyaW5nLT5zY2FuX21hc2sgPDwgQUQ3OTlYX0NIQU5ORUxfU0hJRlQpOwogCQlicmVhazsKIAljYXNlIGFkNzk5MjoKIAljYXNlIGFkNzk5MzoKIAljYXNlIGFkNzk5NDoKLQkJY21kID0gKHJpbmctPnNjYW5fbWFzayA8PCBBRDc5OVhfQ0hBTk5FTF9TSElGVCkgfAorCQljbWQgPSAoKnJpbmctPnNjYW5fbWFzayA8PCBBRDc5OVhfQ0hBTk5FTF9TSElGVCkgfAogCQkJQUQ3OTk4X0NPTlZfUkVTX1JFRzsKIAkJYnJlYWs7CiAJY2FzZSBhZDc5OTc6CkBAIC0xNTEsNyArMTQyLDcgQEAKIAkJbWVtY3B5KHJ4YnVmICsgc3QtPmRfc2l6ZSAtIHNpemVvZihzNjQpLAogCQkJJnRpbWVfbnMsIHNpemVvZih0aW1lX25zKSk7CiAKLQlyaW5nLT5hY2Nlc3MtPnN0b3JlX3RvKGluZGlvX2Rldi0+cmluZywgcnhidWYsIHRpbWVfbnMpOworCXJpbmctPmFjY2Vzcy0+c3RvcmVfdG8oaW5kaW9fZGV2LT5idWZmZXIsIHJ4YnVmLCB0aW1lX25zKTsKIGRvbmU6CiAJa2ZyZWUocnhidWYpOwogCWlmIChiX3NlbnQgPCAwKQpAQCAtMTYyLDIzICsxNTMsMjMgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX3Jpbmdfc2V0dXBfb3BzIGFkNzk5eF9idWZfc2V0dXBfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fYnVmZmVyX3NldHVwX29wcyBhZDc5OXhfYnVmX3NldHVwX29wcyA9IHsKIAkucHJlZW5hYmxlID0gJmFkNzk5eF9yaW5nX3ByZWVuYWJsZSwKLQkucG9zdGVuYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcG9zdGVuYWJsZSwKLQkucHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcHJlZGlzYWJsZSwKKwkucG9zdGVuYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wb3N0ZW5hYmxlLAorCS5wcmVkaXNhYmxlID0gJmlpb190cmlnZ2VyZWRfYnVmZmVyX3ByZWRpc2FibGUsCiB9OwogCiBpbnQgYWQ3OTl4X3JlZ2lzdGVyX3JpbmdfZnVuY3NfYW5kX2luaXQoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKIAlpbnQgcmV0ID0gMDsKIAotCWluZGlvX2Rldi0+cmluZyA9IGlpb19zd19yYl9hbGxvY2F0ZShpbmRpb19kZXYpOwotCWlmICghaW5kaW9fZGV2LT5yaW5nKSB7CisJaW5kaW9fZGV2LT5idWZmZXIgPSBpaW9fc3dfcmJfYWxsb2NhdGUoaW5kaW9fZGV2KTsKKwlpZiAoIWluZGlvX2Rldi0+YnVmZmVyKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfcmV0OwogCX0KIAkvKiBFZmZlY3RpdmVseSBzZWxlY3QgdGhlIHJpbmcgYnVmZmVyIGltcGxlbWVudGF0aW9uICovCi0JaW5kaW9fZGV2LT5yaW5nLT5hY2Nlc3MgPSAmcmluZ19zd19hY2Nlc3NfZnVuY3M7CisJaW5kaW9fZGV2LT5idWZmZXItPmFjY2VzcyA9ICZyaW5nX3N3X2FjY2Vzc19mdW5jczsKIAlpbmRpb19kZXYtPnBvbGxmdW5jID0gaWlvX2FsbG9jX3BvbGxmdW5jKE5VTEwsCiAJCQkJCQkgJmFkNzk5eF90cmlnZ2VyX2hhbmRsZXIsCiAJCQkJCQkgSVJRRl9PTkVTSE9ULApAQCAtMTkyLDI3ICsxODMsMjEgQEAKIAl9CiAKIAkvKiBSaW5nIGJ1ZmZlciBmdW5jdGlvbnMgLSBoZXJlIHRyaWdnZXIgc2V0dXAgcmVsYXRlZCAqLwotCWluZGlvX2Rldi0+cmluZy0+c2V0dXBfb3BzID0gJmFkNzk5eF9idWZfc2V0dXBfb3BzOwotCWluZGlvX2Rldi0+cmluZy0+c2Nhbl90aW1lc3RhbXAgPSB0cnVlOworCWluZGlvX2Rldi0+YnVmZmVyLT5zZXR1cF9vcHMgPSAmYWQ3OTl4X2J1Zl9zZXR1cF9vcHM7CisJaW5kaW9fZGV2LT5idWZmZXItPnNjYW5fdGltZXN0YW1wID0gdHJ1ZTsKIAogCS8qIEZsYWcgdGhhdCBwb2xsZWQgcmluZyBidWZmZXJpbmcgaXMgcG9zc2libGUgKi8KLQlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX1JJTkdfVFJJR0dFUkVEOworCWluZGlvX2Rldi0+bW9kZXMgfD0gSU5ESU9fQlVGRkVSX1RSSUdHRVJFRDsKIAlyZXR1cm4gMDsKIAogZXJyb3JfZGVhbGxvY2F0ZV9zd19yYjoKLQlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPnJpbmcpOworCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+YnVmZmVyKTsKIGVycm9yX3JldDoKIAlyZXR1cm4gcmV0OwogfQogCiB2b2lkIGFkNzk5eF9yaW5nX2NsZWFudXAoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKLQkvKiBlbnN1cmUgdGhhdCB0aGUgdHJpZ2dlciBoYXMgYmVlbiBkZXRhY2hlZCAqLwotCWlmIChpbmRpb19kZXYtPnRyaWcpIHsKLQkJaWlvX3B1dF90cmlnZ2VyKGluZGlvX2Rldi0+dHJpZyk7Ci0JCWlpb190cmlnZ2VyX2RldHRhY2hfcG9sbF9mdW5jKGluZGlvX2Rldi0+dHJpZywKLQkJCQkJICAgICAgaW5kaW9fZGV2LT5wb2xsZnVuYyk7Ci0JfQogCWlpb19kZWFsbG9jX3BvbGxmdW5jKGluZGlvX2Rldi0+cG9sbGZ1bmMpOwotCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7CisJaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5idWZmZXIpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWRjLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjNTk0OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZGMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBhZGMuaCAtIHN5c2ZzIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIEFEQ3MKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBKb25hdGhhbiBDYW1lcm9uIDxqaWMyM0BjYW0uYWMudWs+Ci0gKgotICovCi0KLS8qIERlcHJlY2F0ZWQgKi8KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0FEQyhfbnVtLCBfc2hvdywgX2FkZHIpCQkJXAotICBJSU9fREVWSUNFX0FUVFIoYWRjXyMjX251bSwgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQotCi0jZGVmaW5lIElJT19ERVZfQVRUUl9JTl9SQVcoX251bSwgX3Nob3csIF9hZGRyKQkJCQlcCi0JSUlPX0RFVklDRV9BVFRSKGluIyNfbnVtIyNfcmF3LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0lOX05BTUVEX1JBVyhfbnVtLCBfbmFtZSwgX3Nob3csIF9hZGRyKQkJXAotCUlJT19ERVZJQ0VfQVRUUihpbiMjX251bSMjXyMjX25hbWUjI19yYXcsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKLQotI2RlZmluZSBJSU9fREVWX0FUVFJfSU5fRElGRl9SQVcoX251bXAsIF9udW1uLCBfc2hvdywgX2FkZHIpCQlcCi0JSUlPX0RFVklDRV9BVFRSX05BTUVEKGluIyNfbnVtcCMjbWluIyNfbnVtbiMjX3JhdywJCVwKLQkJCSAgICAgIGluIyNfbnVtcC1pbiMjX251bW4jI19yYXcsCQlcCi0JCQkgICAgICBTX0lSVUdPLAkJCQkJXAotCQkJICAgICAgX3Nob3csCQkJCQlcCi0JCQkgICAgICBOVUxMLAkJCQkJXAotCQkJICAgICAgX2FkZHIpCi0KLQotI2RlZmluZSBJSU9fQ09OU1RfQVRUUl9JTl9OQU1FRF9PRkZTRVQoX251bSwgX25hbWUsIF9zdHJpbmcpCVwKLQlJSU9fQ09OU1RfQVRUUihpbiMjX251bSMjXyMjX25hbWUjI19vZmZzZXQsIF9zdHJpbmcpCi0KLSNkZWZpbmUgSUlPX0NPTlNUX0FUVFJfSU5fTkFNRURfU0NBTEUoX251bSwgX25hbWUsIF9zdHJpbmcpCVwKLQlJSU9fQ09OU1RfQVRUUihpbiMjX251bSMjXyMjX25hbWUjI19zY2FsZSwgX3N0cmluZykKLQotI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9JTl9ISUdIX1RIUkVTSChhKQkJCQlcCi0JSUlPX1VOTU9EX0VWRU5UX0NPREUoSUlPX0VWX0NMQVNTX0lOLCBhLCBJSU9fRVZfVFlQRV9USFJFU0gsCVwKLQkJCSAgICAgSUlPX0VWX0RJUl9SSVNJTkcpCi0jZGVmaW5lIElJT19FVkVOVF9DT0RFX0lOX0xPV19USFJFU0goYSkJCQkJICAgICBcCi0JSUlPX1VOTU9EX0VWRU5UX0NPREUoSUlPX0VWX0NMQVNTX0lOLCBhLCBJSU9fRVZfVFlQRV9USFJFU0gsIFwKLQkJCSAgICAgSUlPX0VWX0RJUl9GQUxMSU5HKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWR0NzMxMC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWR0NzMxMC5jCmluZGV4IDFhNDFiODAuLmM5ZTBiZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkdDczMTAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZHQ3MzEwLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi9zeXNmcy5oIgpAQCAtMzk5LDE5ICs0MDAsMTkgQEAKIAkJcmV0dXJuIHJldDsKIAogCWlmIChzdGF0dXMgJiBBRFQ3MzEwX1NUQVRfVF9ISUdIKQotCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsIDAsCisJCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwKIAkJCSAgICAgICBJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fVEVNUCwgMCwKIAkJCQkJCSAgICBJSU9fRVZfVFlQRV9USFJFU0gsCiAJCQkJCQkgICAgSUlPX0VWX0RJUl9SSVNJTkcpLAogCQkJICAgICAgIHRpbWVzdGFtcCk7CiAJaWYgKHN0YXR1cyAmIEFEVDczMTBfU1RBVF9UX0xPVykKLQkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LCAwLAorCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsCiAJCQkgICAgICAgSUlPX1VOTU9EX0VWRU5UX0NPREUoSUlPX1RFTVAsIDAsCiAJCQkJCQkgICAgSUlPX0VWX1RZUEVfVEhSRVNILAogCQkJCQkJICAgIElJT19FVl9ESVJfRkFMTElORyksCiAJCQkgICAgICAgdGltZXN0YW1wKTsKIAlpZiAoc3RhdHVzICYgQURUNzMxMF9TVEFUX1RfQ1JJVCkKLQkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LCAwLAorCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsCiAJCQkgICAgICAgSUlPX1VOTU9EX0VWRU5UX0NPREUoSUlPX1RFTVAsIDAsCiAJCQkJCQkgICAgSUlPX0VWX1RZUEVfVEhSRVNILAogCQkJCQkJICAgIElJT19FVl9ESVJfUklTSU5HKSwKQEAgLTc0MCwxNCArNzQxLDE1IEBACiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZHQ3MzEwX2V2ZW50X2F0dHJpYnV0ZV9ncm91cFtBRFQ3MzEwX0lSUVNdID0gewogCXsKIAkJLmF0dHJzID0gYWR0NzMxMF9ldmVudF9pbnRfYXR0cmlidXRlcywKKwkJLm5hbWUgPSAiZXZlbnRzIiwKIAl9LCB7CiAJCS5hdHRycyA9IGFkdDczMTBfZXZlbnRfY3RfYXR0cmlidXRlcywKKwkJLm5hbWUgPSAiZXZlbnRzIiwKIAl9CiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkdDczMTBfaW5mbyA9IHsKIAkuYXR0cnMgPSAmYWR0NzMxMF9hdHRyaWJ1dGVfZ3JvdXAsCi0JLm51bV9pbnRlcnJ1cHRfbGluZXMgPSBBRFQ3MzEwX0lSUVMsCiAJLmV2ZW50X2F0dHJzID0gYWR0NzMxMF9ldmVudF9hdHRyaWJ1dGVfZ3JvdXAsCiAJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKIH07CkBAIC03ODAsMTAgKzc4Miw2IEBACiAJaW5kaW9fZGV2LT5pbmZvID0gJmFkdDczMTBfaW5mbzsKIAlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CiAKLQlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcl9mcmVlX2RldjsKLQogCS8qIENUIGNyaXRjYWwgdGVtcGVyYXR1cmUgZXZlbnQuIGxpbmUgMCAqLwogCWlmIChzcGlfZGV2LT5pcnEpIHsKIAkJaWYgKGFkdDczMTBfcGxhdGZvcm1fZGF0YVsyXSkKQEAgLTc5Nyw3ICs3OTUsNyBAQAogCQkJCQkgICBpbmRpb19kZXYtPm5hbWUsCiAJCQkJCSAgIGluZGlvX2Rldik7CiAJCWlmIChyZXQpCi0JCQlnb3RvIGVycm9yX3VucmVnX2RldjsKKwkJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CiAJfQogCiAJLyogSU5UIGJvdW5kIHRlbXBlcmF0dXJlIGFsYXJtIGV2ZW50LiBsaW5lIDEgKi8KQEAgLTgzNCw2ICs4MzIsMTAgQEAKIAkJfQogCX0KIAorCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3VucmVnX2ludF9pcnE7CisKIAlkZXZfaW5mbygmc3BpX2Rldi0+ZGV2LCAiJXMgdGVtcGVyYXR1cmUgc2Vuc29yIHJlZ2lzdGVyZWQuXG4iLAogCQkJaW5kaW9fZGV2LT5uYW1lKTsKIApAQCAtODQzLDggKzg0NSw2IEBACiAJZnJlZV9pcnEoYWR0NzMxMF9wbGF0Zm9ybV9kYXRhWzBdLCBpbmRpb19kZXYpOwogZXJyb3JfdW5yZWdfY3RfaXJxOgogCWZyZWVfaXJxKHNwaV9kZXYtPmlycSwgaW5kaW9fZGV2KTsKLWVycm9yX3VucmVnX2RldjoKLQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIGVycm9yX2ZyZWVfZGV2OgogCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogZXJyb3JfcmV0OgpAQCAtODU2LDEyICs4NTYsMTIgQEAKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZzcGlfZGV2LT5kZXYpOwogCXVuc2lnbmVkIGxvbmcgKmFkdDczMTBfcGxhdGZvcm1fZGF0YSA9IHNwaV9kZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CiAJZGV2X3NldF9kcnZkYXRhKCZzcGlfZGV2LT5kZXYsIE5VTEwpOwogCWlmIChhZHQ3MzEwX3BsYXRmb3JtX2RhdGFbMF0pCiAJCWZyZWVfaXJxKGFkdDczMTBfcGxhdGZvcm1fZGF0YVswXSwgaW5kaW9fZGV2KTsKIAlpZiAoc3BpX2Rldi0+aXJxKQogCQlmcmVlX2lycShzcGlfZGV2LT5pcnEsIGluZGlvX2Rldik7Ci0JaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CiAJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkdDc0MTAuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkdDc0MTAuYwppbmRleCA3NmFhMDYzLi5hMjg5ZTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZHQ3NDEwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWR0NzQxMC5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi9zeXNmcy5oIgpAQCAtMzY1LDE5ICszNjYsMTkgQEAKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCiAJaWYgKHN0YXR1cyAmIEFEVDc0MTBfU1RBVF9UX0hJR0gpCi0JCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwgMCwKKwkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LAogCQkJICAgICAgIElJT19VTk1PRF9FVkVOVF9DT0RFKElJT19URU1QLCAwLAogCQkJCQkJICAgIElJT19FVl9UWVBFX1RIUkVTSCwKIAkJCQkJCSAgICBJSU9fRVZfRElSX1JJU0lORyksCiAJCQkgICAgICAgdGltZXN0YW1wKTsKIAlpZiAoc3RhdHVzICYgQURUNzQxMF9TVEFUX1RfTE9XKQotCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsIDAsCisJCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwKIAkJCSAgICAgICBJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fVEVNUCwgMCwKIAkJCQkJCSAgICBJSU9fRVZfVFlQRV9USFJFU0gsCiAJCQkJCQkgICAgSUlPX0VWX0RJUl9GQUxMSU5HKSwKIAkJCSAgICAgICB0aW1lc3RhbXApOwogCWlmIChzdGF0dXMgJiBBRFQ3NDEwX1NUQVRfVF9DUklUKQotCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsIDAsCisJCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwKIAkJCSAgICAgICBJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fVEVNUCwgMCwKIAkJCQkJCSAgICBJSU9fRVZfVFlQRV9USFJFU0gsCiAJCQkJCQkgICAgSUlPX0VWX0RJUl9SSVNJTkcpLApAQCAtNzA3LDE0ICs3MDgsMTUgQEAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkdDc0MTBfZXZlbnRfYXR0cmlidXRlX2dyb3VwW0FEVDc0MTBfSVJRU10gPSB7CiAJewogCQkuYXR0cnMgPSBhZHQ3NDEwX2V2ZW50X2ludF9hdHRyaWJ1dGVzLAorCQkubmFtZSA9ICJldmVudHMiLAogCX0sIHsKIAkJLmF0dHJzID0gYWR0NzQxMF9ldmVudF9jdF9hdHRyaWJ1dGVzLAorCQkubmFtZSA9ICJldmVudHMiLAogCX0KIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gYWR0NzQxMF9pbmZvID0gewogCS5hdHRycyA9ICZhZHQ3NDEwX2F0dHJpYnV0ZV9ncm91cCwKLQkubnVtX2ludGVycnVwdF9saW5lcyA9IEFEVDc0MTBfSVJRUywKIAkuZXZlbnRfYXR0cnMgPSBhZHQ3NDEwX2V2ZW50X2F0dHJpYnV0ZV9ncm91cCwKIAkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAogfTsKQEAgLTc0NywxMCArNzQ5LDYgQEAKIAlpbmRpb19kZXYtPmluZm8gPSAmYWR0NzQxMF9pbmZvOwogCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKIAotCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX2ZyZWVfZGV2OwotCiAJLyogQ1QgY3JpdGNhbCB0ZW1wZXJhdHVyZSBldmVudC4gbGluZSAwICovCiAJaWYgKGNsaWVudC0+aXJxKSB7CiAJCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGNsaWVudC0+aXJxLApAQCAtNzYwLDcgKzc1OCw3IEBACiAJCQkJCSAgIGlkLT5uYW1lLAogCQkJCQkgICBpbmRpb19kZXYpOwogCQlpZiAocmV0KQotCQkJZ290byBlcnJvcl91bnJlZ19kZXY7CisJCQlnb3RvIGVycm9yX2ZyZWVfZGV2OwogCX0KIAogCS8qIElOVCBib3VuZCB0ZW1wZXJhdHVyZSBhbGFybSBldmVudC4gbGluZSAxICovCkBAIC03OTcsNiArNzk1LDkgQEAKIAkJCWdvdG8gZXJyb3JfdW5yZWdfaW50X2lycTsKIAkJfQogCX0KKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl91bnJlZ19pbnRfaXJxOwogCiAJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAiJXMgdGVtcGVyYXR1cmUgc2Vuc29yIHJlZ2lzdGVyZWQuXG4iLAogCQkJIGlkLT5uYW1lKTsKQEAgLTgwNyw4ICs4MDgsNiBAQAogCWZyZWVfaXJxKGFkdDc0MTBfcGxhdGZvcm1fZGF0YVswXSwgaW5kaW9fZGV2KTsKIGVycm9yX3VucmVnX2N0X2lycToKIAlmcmVlX2lycShjbGllbnQtPmlycSwgaW5kaW9fZGV2KTsKLWVycm9yX3VucmVnX2RldjoKLQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIGVycm9yX2ZyZWVfZGV2OgogCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogZXJyb3JfcmV0OgpAQCAtODIwLDExICs4MTksMTIgQEAKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJdW5zaWduZWQgbG9uZyAqYWR0NzQxMF9wbGF0Zm9ybV9kYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAorCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwogCWlmIChhZHQ3NDEwX3BsYXRmb3JtX2RhdGFbMF0pCiAJCWZyZWVfaXJxKGFkdDc0MTBfcGxhdGZvcm1fZGF0YVswXSwgaW5kaW9fZGV2KTsKIAlpZiAoY2xpZW50LT5pcnEpCiAJCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBpbmRpb19kZXYpOwotCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZHQ3NS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWR0NzUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhmMTQxZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZHQ3NS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjU3ICswLDAgQEAKLS8qCi0gKiBBRFQ3NSBkaWdpdGFsIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIgc3VwcG9ydGluZyBBRFQ3NQotICoKLSAqIENvcHlyaWdodCAyMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotCi0jaW5jbHVkZSAiLi4vaWlvLmgiCi0jaW5jbHVkZSAiLi4vc3lzZnMuaCIKLQotLyoKLSAqIEFEVDc1IHJlZ2lzdGVycyBkZWZpbml0aW9uCi0gKi8KLQotI2RlZmluZSBBRFQ3NV9URU1QRVJBVFVSRQkJMAotI2RlZmluZSBBRFQ3NV9DT05GSUcJCQkxCi0jZGVmaW5lIEFEVDc1X1RfSFlTVAkJCTIKLSNkZWZpbmUgQURUNzVfVF9PUwkJCTMKLSNkZWZpbmUgQURUNzVfT05FU0hPVAkJCTQKLQotLyoKLSAqIEFEVDc1IGNvbmZpZwotICovCi0jZGVmaW5lIEFEVDc1X1BECQkJMHgxCi0jZGVmaW5lIEFEVDc1X09TX0lOVAkJCTB4MgotI2RlZmluZSBBRFQ3NV9PU19QT0xBUklUWQkJMHg0Ci0jZGVmaW5lIEFEVDc1X0ZBVUxUX1FVRVVFX01BU0sJCTB4MTgKLSNkZWZpbmUgQURUNzVfRkFVTFRfUVVFVUVfT0ZGU0VUCTMKLSNkZWZpbmUgQURUNzVfU01CVVNfQUxBUlQJCTB4OAotCi0vKgotICogQURUNzUgbWFza3MKLSAqLwotI2RlZmluZSBBRFQ3NV9WQUxVRV9TSUdOCQkweDgwMAotI2RlZmluZSBBRFQ3NV9WQUxVRV9PRkZTRVQJCTQKLSNkZWZpbmUgQURUNzVfVkFMVUVfRkxPQVRfT0ZGU0VUCTQKLSNkZWZpbmUgQURUNzVfVkFMVUVfRkxPQVRfTUFTSwkJMHhGCi0KLQotLyoKLSAqIHN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmMgaW5mb3JtYXRpb24KLSAqLwotCi1zdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwotCXU4ICBjb25maWc7Ci19OwotCi0vKgotICogYWR0NzUgcmVnaXN0ZXIgYWNjZXNzIGJ5IEkyQwotICovCi0KLXN0YXRpYyBpbnQgYWR0NzVfaTJjX3JlYWQoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvLCB1OCByZWcsIHU4ICpkYXRhKQotewotCXN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKLQlpbnQgcmV0ID0gMCwgbGVuOwotCi0JcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCByZWcpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiSTJDIHJlYWQgcmVnaXN0ZXIgYWRkcmVzcyBlcnJvclxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKHJlZyA9PSBBRFQ3NV9DT05GSUcgfHwgcmVnID09IEFEVDc1X09ORVNIT1QpCi0JCWxlbiA9IDE7Ci0JZWxzZQotCQlsZW4gPSAyOwotCi0JcmV0ID0gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwgZGF0YSwgbGVuKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyByZWFkIGVycm9yXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGFkdDc1X2kyY193cml0ZShzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8sIHU4IHJlZywgdTggZGF0YSkKLXsKLQlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAocmVnID09IEFEVDc1X0NPTkZJRyB8fCByZWcgPT0gQURUNzVfT05FU0hPVCkKLQkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgZGF0YSk7Ci0JZWxzZQotCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCBkYXRhKTsKLQotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyB3cml0ZSBlcnJvclxuIik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCBhZHQ3NV9zaG93X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfZ2V0X2RydmRhdGEoZGV2KSk7Ci0KLQlpZiAoY2hpcC0+Y29uZmlnICYgQURUNzVfUEQpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgInBvd2VyLXNhdmVcbiIpOwotCWVsc2UKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiZnVsbFxuIik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFkdDc1X3N0b3JlX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgbGVuKQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfaW5mbyk7Ci0JaW50IHJldDsKLQl1OCBjb25maWc7Ci0KLQlyZXQgPSBhZHQ3NV9pMmNfcmVhZChkZXZfaW5mbywgQURUNzVfQ09ORklHLCAmY2hpcC0+Y29uZmlnKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gLUVJTzsKLQotCWNvbmZpZyA9IGNoaXAtPmNvbmZpZyAmIH5BRFQ3NV9QRDsKLQlpZiAoIXN0cmNtcChidWYsICJmdWxsIikpCi0JCWNvbmZpZyB8PSBBRFQ3NV9QRDsKLQotCXJldCA9IGFkdDc1X2kyY193cml0ZShkZXZfaW5mbywgQURUNzVfQ09ORklHLCBjb25maWcpOwotCWlmIChyZXQpCi0JCXJldHVybiAtRUlPOwotCi0JY2hpcC0+Y29uZmlnID0gY29uZmlnOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIElJT19ERVZJQ0VfQVRUUihtb2RlLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJYWR0NzVfc2hvd19tb2RlLAotCQlhZHQ3NV9zdG9yZV9tb2RlLAotCQkwKTsKLQotc3RhdGljIHNzaXplX3QgYWR0NzVfc2hvd19hdmFpbGFibGVfbW9kZXMoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQotewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgImZ1bGxcbnBvd2VyLWRvd25cbiIpOwotfQotCi1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKGF2YWlsYWJsZV9tb2RlcywgU19JUlVHTywgYWR0NzVfc2hvd19hdmFpbGFibGVfbW9kZXMsIE5VTEwsIDApOwotCi1zdGF0aWMgc3NpemVfdCBhZHQ3NV9zaG93X29uZXNob3Qoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBhZHQ3NV9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihkZXZfZ2V0X2RydmRhdGEoZGV2KSk7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgISEoY2hpcC0+Y29uZmlnICYgQURUNzVfT05FU0hPVCkpOwotfQotCi1zdGF0aWMgc3NpemVfdCBhZHQ3NV9zdG9yZV9vbmVzaG90KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCXVuc2lnbmVkIGxvbmcgZGF0YSA9IDA7Ci0JaW50IHJldDsKLQl1OCBjb25maWc7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQotCXJldCA9IGFkdDc1X2kyY19yZWFkKGRldl9pbmZvLCBBRFQ3NV9DT05GSUcsICZjaGlwLT5jb25maWcpOwotCWlmIChyZXQpCi0JCXJldHVybiAtRUlPOwotCi0JY29uZmlnID0gY2hpcC0+Y29uZmlnICYgfkFEVDc1X09ORVNIT1Q7Ci0JaWYgKGRhdGEpCi0JCWNvbmZpZyB8PSBBRFQ3NV9PTkVTSE9UOwotCi0JcmV0ID0gYWR0NzVfaTJjX3dyaXRlKGRldl9pbmZvLCBBRFQ3NV9DT05GSUcsIGNvbmZpZyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIC1FSU87Ci0KLQljaGlwLT5jb25maWcgPSBjb25maWc7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKG9uZXNob3QsIFNfSVJVR08gfCBTX0lXVVNSLAotCQlhZHQ3NV9zaG93X29uZXNob3QsCi0JCWFkdDc1X3N0b3JlX29uZXNob3QsCi0JCTApOwotCi1zdGF0aWMgc3NpemVfdCBhZHQ3NV9zaG93X3ZhbHVlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCXUxNiBkYXRhOwotCWNoYXIgc2lnbiA9ICcgJzsKLQlpbnQgcmV0OwotCi0JaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDc1X1BEKSB7Ci0JCWRldl9lcnIoZGV2LCAiQ2FuJ3QgcmVhZCB2YWx1ZSBpbiBwb3dlci1kb3duIG1vZGUuXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYgKGNoaXAtPmNvbmZpZyAmIEFEVDc1X09ORVNIT1QpIHsKLQkJLyogd3JpdGUgdG8gYWN0aXZlIGNvbnZlcnRlciAqLwotCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZShjaGlwLT5jbGllbnQsIEFEVDc1X09ORVNIT1QpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcmV0ID0gYWR0NzVfaTJjX3JlYWQoZGV2X2luZm8sIEFEVDc1X1RFTVBFUkFUVVJFLCAodTggKikmZGF0YSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIC1FSU87Ci0KLQlkYXRhID0gc3dhYjE2KGRhdGEpID4+IEFEVDc1X1ZBTFVFX09GRlNFVDsKLQlpZiAoZGF0YSAmIEFEVDc1X1ZBTFVFX1NJR04pIHsKLQkJLyogY29udmVydCBzdXBwbGVtZW50IHRvIHBvc2l0aXZlIHZhbHVlICovCi0JCWRhdGEgPSAoQURUNzVfVkFMVUVfU0lHTiA8PCAxKSAtIGRhdGE7Ci0JCXNpZ24gPSAnLSc7Ci0JfQotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWMlZC4lLjRkXG4iLCBzaWduLAotCQkoZGF0YSA+PiBBRFQ3NV9WQUxVRV9GTE9BVF9PRkZTRVQpLAotCQkoZGF0YSAmIEFEVDc1X1ZBTFVFX0ZMT0FUX01BU0spICogNjI1KTsKLX0KLQotc3RhdGljIElJT19ERVZJQ0VfQVRUUih2YWx1ZSwgU19JUlVHTywgYWR0NzVfc2hvd192YWx1ZSwgTlVMTCwgMCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZHQ3NV9hdHRyaWJ1dGVzW10gPSB7Ci0JJmlpb19kZXZfYXR0cl9hdmFpbGFibGVfbW9kZXMuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX21vZGUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX29uZXNob3QuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX3ZhbHVlLmRldl9hdHRyLmF0dHIsCi0JTlVMTCwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkdDc1X2F0dHJpYnV0ZV9ncm91cCA9IHsKLQkuYXR0cnMgPSBhZHQ3NV9hdHRyaWJ1dGVzLAotfTsKLQotLyoKLSAqIHRlbXBlcmF0dXJlIGJvdW5kIGV2ZW50cwotICovCi0KLSNkZWZpbmUgSUlPX0VWRU5UX0NPREVfQURUNzVfT1RJIElJT19VTk1PRF9FVkVOVF9DT0RFKElJT19FVl9DTEFTU19URU1QLCBcCi0JCQkJCQkgICAgICAwLAkJXAotCQkJCQkJICAgICAgSUlPX0VWX1RZUEVfVEhSRVNILCBcCi0JCQkJCQkgICAgICBJSU9fRVZfRElSX0ZBTExJTkcpCi0KLXN0YXRpYyBpcnFyZXR1cm5fdCBhZHQ3NV9ldmVudF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnByaXZhdGUpCi17Ci0JaWlvX3B1c2hfZXZlbnQocHJpdmF0ZSwgMCwKLQkJICAgICAgIElJT19FVkVOVF9DT0RFX0FEVDc1X09USSwKLQkJICAgICAgIGlpb19nZXRfdGltZV9ucygpKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIHNzaXplX3QgYWR0NzVfc2hvd19vdGlfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkdDc1X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQlpbnQgcmV0OwotCi0JLyogcmV0cml2ZSBBTEFSVCBzdGF0dXMgKi8KLQlyZXQgPSBhZHQ3NV9pMmNfcmVhZChkZXZfaW5mbywgQURUNzVfQ09ORklHLCAmY2hpcC0+Y29uZmlnKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gLUVJTzsKLQotCWlmIChjaGlwLT5jb25maWcgJiBBRFQ3NV9PU19JTlQpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgImludGVycnVwdFxuIik7Ci0JZWxzZQotCQlyZXR1cm4gc3ByaW50ZihidWYsICJjb21wYXJhdG9yXG4iKTsKLX0KLQotc3RhdGljIHNzaXplX3QgYWR0NzVfc2V0X290aV9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCWludCByZXQ7Ci0JdTggY29uZmlnOwotCi0JLyogcmV0cml2ZSBBTEFSVCBzdGF0dXMgKi8KLQlyZXQgPSBhZHQ3NV9pMmNfcmVhZChkZXZfaW5mbywgQURUNzVfQ09ORklHLCAmY2hpcC0+Y29uZmlnKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gLUVJTzsKLQotCWNvbmZpZyA9IGNoaXAtPmNvbmZpZyAmIH5BRFQ3NV9PU19JTlQ7Ci0JaWYgKHN0cmNtcChidWYsICJjb21wYXJhdG9yIikgIT0gMCkKLQkJY29uZmlnIHw9IEFEVDc1X09TX0lOVDsKLQotCXJldCA9IGFkdDc1X2kyY193cml0ZShkZXZfaW5mbywgQURUNzVfQ09ORklHLCBjb25maWcpOwotCWlmIChyZXQpCi0JCXJldHVybiAtRUlPOwotCi0JY2hpcC0+Y29uZmlnID0gY29uZmlnOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgYWR0NzVfc2hvd19hdmFpbGFibGVfb3RpX21vZGVzKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc3ByaW50ZihidWYsICJjb21wYXJhdG9yXG5pbnRlcnJ1cHRcbiIpOwotfQotCi1zdGF0aWMgc3NpemVfdCBhZHQ3NV9zaG93X3NtYnVzX2FsYXJ0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCWludCByZXQ7Ci0KLQkvKiByZXRyaXZlIEFMQVJUIHN0YXR1cyAqLwotCXJldCA9IGFkdDc1X2kyY19yZWFkKGRldl9pbmZvLCBBRFQ3NV9DT05GSUcsICZjaGlwLT5jb25maWcpOwotCWlmIChyZXQpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICEhKGNoaXAtPmNvbmZpZyAmIEFEVDc1X1NNQlVTX0FMQVJUKSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFkdDc1X3NldF9zbWJ1c19hbGFydChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljb25zdCBjaGFyICpidWYsCi0JCXNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkdDc1X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQl1bnNpZ25lZCBsb25nIGRhdGEgPSAwOwotCWludCByZXQ7Ci0JdTggY29uZmlnOwotCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJmRhdGEpOwotCWlmIChyZXQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogcmV0cml2ZSBBTEFSVCBzdGF0dXMgKi8KLQlyZXQgPSBhZHQ3NV9pMmNfcmVhZChkZXZfaW5mbywgQURUNzVfQ09ORklHLCAmY2hpcC0+Y29uZmlnKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gLUVJTzsKLQotCWNvbmZpZyA9IGNoaXAtPmNvbmZpZyAmIH5BRFQ3NV9TTUJVU19BTEFSVDsKLQlpZiAoZGF0YSkKLQkJY29uZmlnIHw9IEFEVDc1X1NNQlVTX0FMQVJUOwotCi0JcmV0ID0gYWR0NzVfaTJjX3dyaXRlKGRldl9pbmZvLCBBRFQ3NV9DT05GSUcsIGNvbmZpZyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIC1FSU87Ci0KLQljaGlwLT5jb25maWcgPSBjb25maWc7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCBhZHQ3NV9zaG93X2ZhdWx0X3F1ZXVlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWR0NzVfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwotCWludCByZXQ7Ci0KLQkvKiByZXRyaXZlIEFMQVJUIHN0YXR1cyAqLwotCXJldCA9IGFkdDc1X2kyY19yZWFkKGRldl9pbmZvLCBBRFQ3NV9DT05GSUcsICZjaGlwLT5jb25maWcpOwotCWlmIChyZXQpCi0JCXJldHVybiAtRUlPOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChjaGlwLT5jb25maWcgJiBBRFQ3NV9GQVVMVF9RVUVVRV9NQVNLKSA+PgotCQkJCUFEVDc1X0ZBVUxUX1FVRVVFX09GRlNFVCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGFkdDc1X3NldF9mYXVsdF9xdWV1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljb25zdCBjaGFyICpidWYsCi0JCXNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkdDc1X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGRldl9pbmZvKTsKLQl1bnNpZ25lZCBsb25nIGRhdGE7Ci0JaW50IHJldDsKLQl1OCBjb25maWc7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmZGF0YSk7Ci0JaWYgKHJldCB8fCBkYXRhID4gMykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiByZXRyaXZlIEFMQVJUIHN0YXR1cyAqLwotCXJldCA9IGFkdDc1X2kyY19yZWFkKGRldl9pbmZvLCBBRFQ3NV9DT05GSUcsICZjaGlwLT5jb25maWcpOwotCWlmIChyZXQpCi0JCXJldHVybiAtRUlPOwotCi0JY29uZmlnID0gY2hpcC0+Y29uZmlnICYgfkFEVDc1X0ZBVUxUX1FVRVVFX01BU0s7Ci0JY29uZmlnIHw9IChkYXRhIDw8IEFEVDc1X0ZBVUxUX1FVRVVFX09GRlNFVCk7Ci0JcmV0ID0gYWR0NzVfaTJjX3dyaXRlKGRldl9pbmZvLCBBRFQ3NV9DT05GSUcsIGNvbmZpZyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIC1FSU87Ci0KLQljaGlwLT5jb25maWcgPSBjb25maWc7Ci0KLQlyZXR1cm4gcmV0OwotfQotc3RhdGljIGlubGluZSBzc2l6ZV90IGFkdDc1X3Nob3dfdF9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCi17Ci0Jc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOwotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXUxNiBkYXRhOwotCWNoYXIgc2lnbiA9ICcgJzsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYWR0NzVfaTJjX3JlYWQoZGV2X2luZm8sIHRoaXNfYXR0ci0+YWRkcmVzcywgKHU4ICopJmRhdGEpOwotCWlmIChyZXQpCi0JCXJldHVybiAtRUlPOwotCi0JZGF0YSA9IHN3YWIxNihkYXRhKSA+PiBBRFQ3NV9WQUxVRV9PRkZTRVQ7Ci0JaWYgKGRhdGEgJiBBRFQ3NV9WQUxVRV9TSUdOKSB7Ci0JCS8qIGNvbnZlcnQgc3VwcGxlbWVudCB0byBwb3NpdGl2ZSB2YWx1ZSAqLwotCQlkYXRhID0gKEFEVDc1X1ZBTFVFX1NJR04gPDwgMSkgLSBkYXRhOwotCQlzaWduID0gJy0nOwotCX0KLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVjJWQuJS40ZFxuIiwgc2lnbiwKLQkJKGRhdGEgPj4gQURUNzVfVkFMVUVfRkxPQVRfT0ZGU0VUKSwKLQkJKGRhdGEgJiBBRFQ3NV9WQUxVRV9GTE9BVF9NQVNLKSAqIDYyNSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3NpemVfdCBhZHQ3NV9zZXRfdF9ib3VuZChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljb25zdCBjaGFyICpidWYsCi0JCXNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOwotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWxvbmcgdG1wMSwgdG1wMjsKLQl1MTYgZGF0YTsKLQljaGFyICpwb3M7Ci0JaW50IHJldDsKLQotCXBvcyA9IHN0cmNocihidWYsICcuJyk7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ0bXAxKTsKLQotCWlmIChyZXQgfHwgdG1wMSA+IDEyNyB8fCB0bXAxIDwgLTEyOCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAocG9zKSB7Ci0JCWxlbiA9IHN0cmxlbihwb3MpOwotCQlpZiAobGVuID4gQURUNzVfVkFMVUVfRkxPQVRfT0ZGU0VUKQotCQkJbGVuID0gQURUNzVfVkFMVUVfRkxPQVRfT0ZGU0VUOwotCQlwb3NbbGVuXSA9IDA7Ci0JCXJldCA9IHN0cmljdF9zdHJ0b2wocG9zLCAxMCwgJnRtcDIpOwotCi0JCWlmICghcmV0KQotCQkJdG1wMiA9ICh0bXAyIC8gNjI1KSAqIDYyNTsKLQl9Ci0KLQlpZiAodG1wMSA8IDApCi0JCWRhdGEgPSAodTE2KSgtdG1wMSk7Ci0JZWxzZQotCQlkYXRhID0gKHUxNil0bXAxOwotCWRhdGEgPSAoZGF0YSA8PCBBRFQ3NV9WQUxVRV9GTE9BVF9PRkZTRVQpIHwgKHRtcDIgJiBBRFQ3NV9WQUxVRV9GTE9BVF9NQVNLKTsKLQlpZiAodG1wMSA8IDApCi0JCS8qIGNvbnZlcnQgcG9zaXRpdmUgdmFsdWUgdG8gc3VwcGx5bWVudCAqLwotCQlkYXRhID0gKEFEVDc1X1ZBTFVFX1NJR04gPDwgMSkgLSBkYXRhOwotCWRhdGEgPDw9IEFEVDc1X1ZBTFVFX09GRlNFVDsKLQlkYXRhID0gc3dhYjE2KGRhdGEpOwotCi0JcmV0ID0gYWR0NzVfaTJjX3dyaXRlKGRldl9pbmZvLCB0aGlzX2F0dHItPmFkZHJlc3MsICh1OClkYXRhKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gLUVJTzsKLQotCXJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIElJT19ERVZJQ0VfQVRUUihvdGlfbW9kZSwKLQkJICAgICAgIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICAgICAgYWR0NzVfc2hvd19vdGlfbW9kZSwgYWR0NzVfc2V0X290aV9tb2RlLCAwKTsKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIoYXZhaWxhYmxlX290aV9tb2RlcywKLQkJICAgICAgIFNfSVJVR08sCi0JCSAgICAgICBhZHQ3NV9zaG93X2F2YWlsYWJsZV9vdGlfbW9kZXMsIE5VTEwsIDApOwotc3RhdGljIElJT19ERVZJQ0VfQVRUUihzbWJ1c19hbGFydCwKLQkJICAgICAgIFNfSVJVR08gfCBTX0lXVVNSLAotCQkgICAgICAgYWR0NzVfc2hvd19zbWJ1c19hbGFydCwgYWR0NzVfc2V0X3NtYnVzX2FsYXJ0LCAwKTsKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIoZmF1bHRfcXVldWUsCi0JCSAgICAgICBTX0lSVUdPIHwgU19JV1VTUiwKLQkJICAgICAgIGFkdDc1X3Nob3dfZmF1bHRfcXVldWUsIGFkdDc1X3NldF9mYXVsdF9xdWV1ZSwgMCk7Ci1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKHRfb3NfdmFsdWUsCi0JCSAgICAgICBTX0lSVUdPIHwgU19JV1VTUiwKLQkJICAgICAgIGFkdDc1X3Nob3dfdF9ib3VuZCwgYWR0NzVfc2V0X3RfYm91bmQsCi0JCSAgICAgICBBRFQ3NV9UX09TKTsKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIodF9oeXN0X3ZhbHVlLAotCQkgICAgICAgU19JUlVHTyB8IFNfSVdVU1IsCi0JCSAgICAgICBhZHQ3NV9zaG93X3RfYm91bmQsIGFkdDc1X3NldF90X2JvdW5kLAotCQkgICAgICAgQURUNzVfVF9IWVNUKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkdDc1X2V2ZW50X2F0dHJpYnV0ZXNbXSA9IHsKLQkmaWlvX2Rldl9hdHRyX290aV9tb2RlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9hdmFpbGFibGVfb3RpX21vZGVzLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9zbWJ1c19hbGFydC5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfZmF1bHRfcXVldWUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX3Rfb3NfdmFsdWUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX3RfaHlzdF92YWx1ZS5kZXZfYXR0ci5hdHRyLAotCU5VTEwsCi19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZHQ3NV9ldmVudF9hdHRyaWJ1dGVfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gYWR0NzVfZXZlbnRfYXR0cmlidXRlcywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gYWR0NzVfaW5mbyA9IHsKLQkuYXR0cnMgPSAmYWR0NzVfYXR0cmlidXRlX2dyb3VwLAotCS5udW1faW50ZXJydXB0X2xpbmVzID0gMSwKLQkuZXZlbnRfYXR0cnMgPSAmYWR0NzVfZXZlbnRfYXR0cmlidXRlX2dyb3VwLAotCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCi19OwotCi0vKgotICogZGV2aWNlIHByb2JlIGFuZCByZW1vdmUKLSAqLwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBhZHQ3NV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCi17Ci0Jc3RydWN0IGFkdDc1X2NoaXBfaW5mbyAqY2hpcDsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OwotCWludCByZXQgPSAwOwotCi0JaW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZShzaXplb2YoKmNoaXApKTsKLQlpZiAoaW5kaW9fZGV2ID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcl9yZXQ7Ci0JfQotCWNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCi0JLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRldmljZSByZW1vdmFsIHB1cnBvc2VzICovCi0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgaW5kaW9fZGV2KTsKLQotCWNoaXAtPmNsaWVudCA9IGNsaWVudDsKLQotCWluZGlvX2Rldi0+bmFtZSA9IGlkLT5uYW1lOwotCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKLQlpbmRpb19kZXYtPmluZm8gPSAmYWR0NzVfaW5mbzsKLQlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7Ci0KLQlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcl9mcmVlX2RldjsKLQotCWlmIChjbGllbnQtPmlycSA+IDApIHsKLQkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoY2xpZW50LT5pcnEsCi0JCQkJCSAgIE5VTEwsCi0JCQkJCSAgICZhZHQ3NV9ldmVudF9oYW5kbGVyLAotCQkJCQkgICBJUlFGX1RSSUdHRVJfTE9XLAotCQkJCQkgICBpbmRpb19kZXYtPm5hbWUsCi0JCQkJCSAgIGluZGlvX2Rldik7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycm9yX3VucmVnX2RldjsKLQotCQlyZXQgPSBhZHQ3NV9pMmNfcmVhZChpbmRpb19kZXYsIEFEVDc1X0NPTkZJRywgJmNoaXAtPmNvbmZpZyk7Ci0JCWlmIChyZXQpIHsKLQkJCXJldCA9IC1FSU87Ci0JCQlnb3RvIGVycm9yX3VucmVnX2lycTsKLQkJfQotCi0JCS8qIHNldCBpcnEgcG9sYXJpdHkgbG93IGxldmVsICovCi0JCWNoaXAtPmNvbmZpZyAmPSB+QURUNzVfT1NfUE9MQVJJVFk7Ci0KLQkJcmV0ID0gYWR0NzVfaTJjX3dyaXRlKGluZGlvX2RldiwgQURUNzVfQ09ORklHLCBjaGlwLT5jb25maWcpOwotCQlpZiAocmV0KSB7Ci0JCQlyZXQgPSAtRUlPOwotCQkJZ290byBlcnJvcl91bnJlZ19pcnE7Ci0JCX0KLQl9Ci0KLQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICIlcyB0ZW1wZXJhdHVyZSBzZW5zb3IgcmVnaXN0ZXJlZC5cbiIsCi0JCQkgaW5kaW9fZGV2LT5uYW1lKTsKLQotCXJldHVybiAwOwotZXJyb3JfdW5yZWdfaXJxOgotCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBpbmRpb19kZXYpOwotZXJyb3JfdW5yZWdfZGV2OgotCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwotZXJyb3JfZnJlZV9kZXY6Ci0JaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7Ci1lcnJvcl9yZXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2RldmV4aXQgYWR0NzVfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCi17Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0JaWYgKGNsaWVudC0+aXJxKQotCQlmcmVlX2lycShjbGllbnQtPmlycSwgaW5kaW9fZGV2KTsKLQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKLQlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgYWR0NzVfaWRbXSA9IHsKLQl7ICJhZHQ3NSIsIDAgfSwKLQl7fQotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFkdDc1X2lkKTsKLQotc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkdDc1X2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJhZHQ3NSIsCi0JfSwKLQkucHJvYmUgPSBhZHQ3NV9wcm9iZSwKLQkucmVtb3ZlID0gX19kZXZleGl0X3AoYWR0NzVfcmVtb3ZlKSwKLQkuaWRfdGFibGUgPSBhZHQ3NV9pZCwKLX07Ci0KLXN0YXRpYyBfX2luaXQgaW50IGFkdDc1X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmFkdDc1X2RyaXZlcik7Ci19Ci0KLXN0YXRpYyBfX2V4aXQgdm9pZCBhZHQ3NV9leGl0KHZvaWQpCi17Ci0JaTJjX2RlbF9kcml2ZXIoJmFkdDc1X2RyaXZlcik7Ci19Ci0KLU1PRFVMRV9BVVRIT1IoIlNvbmljIFpoYW5nIDxzb25pYy56aGFuZ0BhbmFsb2cuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRFQ3NSBkaWdpdGFsIgotCQkJIiB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci0KLW1vZHVsZV9pbml0KGFkdDc1X2luaXQpOwotbW9kdWxlX2V4aXQoYWR0NzVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9tYXgxMzYzLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9tYXgxMzYzLmgKaW5kZXggMzYwYmZjNS4uY2JjYjA4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvbWF4MTM2My5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL21heDEzNjMuaApAQCAtNTcsNiArNTcsNyBAQAogI2RlZmluZSBNQVgxMzYzX1NDQU5fTUFTSwkJCTB4NjAKICNkZWZpbmUgTUFYMTM2M19TRV9ERV9NQVNLCQkJMHgwMQogCisjZGVmaW5lIE1BWDEzNjNfTUFYX0NIQU5ORUxTIDI1CiAvKioKICAqIHN0cnVjdCBtYXgxMzYzX21vZGUgLSBzY2FuIG1vZGUgaW5mb3JtYXRpb24KICAqIEBjb25mOglUaGUgY29ycmVzcG9uZGluZyB2YWx1ZSBvZiB0aGUgY29uZmlndXJhdGlvbiByZWdpc3RlcgpAQCAtNjQsNyArNjUsNyBAQAogICovCiBzdHJ1Y3QgbWF4MTM2M19tb2RlIHsKIAlpbnQ4X3QJCWNvbmY7Ci0JbG9uZwkJbW9kZW1hc2s7CisJREVDTEFSRV9CSVRNQVAobW9kZW1hc2ssIE1BWDEzNjNfTUFYX0NIQU5ORUxTKTsKIH07CiAKIC8qIFRoaXMgbXVzdCBiZSBtYWludGFpbmVkIGFsb25nIHNpZGUgdGhlIG1heDEzNjNfbW9kZV90YWJsZSBpbiBtYXgxMzYzX2NvcmUgKi8KQEAgLTE0NSwxMyArMTQ2LDE0IEBACiB9OwogCiBjb25zdCBzdHJ1Y3QgbWF4MTM2M19tb2RlCi0qbWF4MTM2M19tYXRjaF9tb2RlKHUzMiBtYXNrLCBjb25zdCBzdHJ1Y3QgbWF4MTM2M19jaGlwX2luZm8gKmNpKTsKKyptYXgxMzYzX21hdGNoX21vZGUodW5zaWduZWQgbG9uZyAqbWFzaywgY29uc3Qgc3RydWN0IG1heDEzNjNfY2hpcF9pbmZvICpjaSk7CiAKIGludCBtYXgxMzYzX3NldF9zY2FuX21vZGUoc3RydWN0IG1heDEzNjNfc3RhdGUgKnN0KTsKIAogI2lmZGVmIENPTkZJR19NQVgxMzYzX1JJTkdfQlVGRkVSCiAKLWludCBtYXgxMzYzX3NpbmdsZV9jaGFubmVsX2Zyb21fcmluZyhsb25nIG1hc2ssIHN0cnVjdCBtYXgxMzYzX3N0YXRlICpzdCk7CitpbnQgbWF4MTM2M19zaW5nbGVfY2hhbm5lbF9mcm9tX3JpbmcoY29uc3QgbG9uZyAqbWFzaywKKwkJCQkgICAgIHN0cnVjdCBtYXgxMzYzX3N0YXRlICpzdCk7CiBpbnQgbWF4MTM2M19yZWdpc3Rlcl9yaW5nX2Z1bmNzX2FuZF9pbml0KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogdm9pZCBtYXgxMzYzX3JpbmdfY2xlYW51cChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvbWF4MTM2M19jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9tYXgxMzYzX2NvcmUuYwppbmRleCA3MmIwOTE3Li5lYjY5OWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9tYXgxMzYzX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9tYXgxMzYzX2NvcmUuYwpAQCAtMzAsMjYgKzMwLDI2IEBACiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICIuLi9idWZmZXJfZ2VuZXJpYy5oIgogCi0jaW5jbHVkZSAiLi4vcmluZ19nZW5lcmljLmgiCi0jaW5jbHVkZSAiYWRjLmgiCiAjaW5jbHVkZSAibWF4MTM2My5oIgogCiAjZGVmaW5lIE1BWDEzNjNfTU9ERV9TSU5HTEUoX251bSwgX21hc2spIHsJCQkJXAogCQkuY29uZiA9IE1BWDEzNjNfQ0hBTk5FTF9TRUwoX251bSkJCQlcCiAJCQl8IE1BWDEzNjNfQ09ORklHX1NDQU5fU0lOR0xFXzEJCQlcCiAJCQl8IE1BWDEzNjNfQ09ORklHX1NFLAkJCQlcCi0JCQkubW9kZW1hc2sgPSBfbWFzaywJCQkJXAorCQkJLm1vZGVtYXNrWzBdID0gX21hc2ssCQkJCVwKIAkJCX0KIAogI2RlZmluZSBNQVgxMzYzX01PREVfU0NBTl9UT19DSEFOTkVMKF9udW0sIF9tYXNrKSB7CQkJXAogCQkuY29uZiA9IE1BWDEzNjNfQ0hBTk5FTF9TRUwoX251bSkJCQlcCiAJCQl8IE1BWDEzNjNfQ09ORklHX1NDQU5fVE9fQ1MJCQlcCiAJCQl8IE1BWDEzNjNfQ09ORklHX1NFLAkJCQlcCi0JCQkubW9kZW1hc2sgPSBfbWFzaywJCQkJXAorCQkJLm1vZGVtYXNrWzBdID0gX21hc2ssCQkJCVwKIAkJCX0KIAogLyogbm90ZSBub3QgYXZhaWxhYmxlIGZvciBtYXgxMzYzIGhlbmNlIG5hbWluZyAqLwpAQCAtNTcsMTQgKzU3LDE0IEBACiAJCS5jb25mID0gTUFYMTM2M19DSEFOTkVMX1NFTChfbnVtKQkJCVwKIAkJCXwgTUFYMTIzNl9TQ0FOX01JRF9UT19DSEFOTkVMCQkJXAogCQkJfCBNQVgxMzYzX0NPTkZJR19TRSwJCQkJXAotCQkJLm1vZGVtYXNrID0gX21hc2sJCQkJXAorCQkJLm1vZGVtYXNrWzBdID0gX21hc2sJCQkJXAogfQogCiAjZGVmaW5lIE1BWDEzNjNfTU9ERV9ESUZGX1NJTkdMRShfbnVtcCwgX251bW0sIF9tYXNrKSB7CQkJXAogCQkuY29uZiA9IE1BWDEzNjNfQ0hBTk5FTF9TRUwoX251bXApCQkJXAogCQkJfCBNQVgxMzYzX0NPTkZJR19TQ0FOX1NJTkdMRV8xCQkJXAogCQkJfCBNQVgxMzYzX0NPTkZJR19ERSwJCQkJXAotCQkJLm1vZGVtYXNrID0gX21hc2sJCQkJXAorCQkJLm1vZGVtYXNrWzBdID0gX21hc2sJCQkJXAogCQkJfQogCiAvKiBDYW4ndCB0aGluayBob3cgdG8gYXV0b21hdGUgbmFtaW5nIHNvIHNwZWNpZnkgZm9yIG5vdyAqLwpAQCAtNzIsNyArNzIsNyBAQAogCQkuY29uZiA9IE1BWDEzNjNfQ0hBTk5FTF9TRUwoX251bSkJCQlcCiAJCQl8IE1BWDEzNjNfQ09ORklHX1NDQU5fVE9fQ1MJCQlcCiAJCQl8IE1BWDEzNjNfQ09ORklHX0RFLAkJCQlcCi0JCQkubW9kZW1hc2sgPSBfbWFzawkJCQlcCisJCQkubW9kZW1hc2tbMF0gPSBfbWFzawkJCQlcCiAJCQl9CiAKIC8qIG5vdGUgb25seSBhdmFpbGFibGUgZm9yIG1heDEzNjMgaGVuY2UgbmFtaW5nICovCkBAIC04MCw3ICs4MCw3IEBACiAJCS5jb25mID0gTUFYMTM2M19DSEFOTkVMX1NFTChfbnVtKQkJCVwKIAkJCXwgTUFYMTIzNl9TQ0FOX01JRF9UT19DSEFOTkVMCQkJXAogCQkJfCBNQVgxMzYzX0NPTkZJR19TRSwJCQkJXAotCQkJLm1vZGVtYXNrID0gX21hc2sJCQkJXAorCQkJLm1vZGVtYXNrWzBdID0gX21hc2sJCQkJXAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG1heDEzNjNfbW9kZSBtYXgxMzYzX21vZGVfdGFibGVbXSA9IHsKQEAgLTE0NywxMyArMTQ3LDE1IEBACiB9OwogCiBjb25zdCBzdHJ1Y3QgbWF4MTM2M19tb2RlCi0qbWF4MTM2M19tYXRjaF9tb2RlKHUzMiBtYXNrLCBjb25zdCBzdHJ1Y3QgbWF4MTM2M19jaGlwX2luZm8gKmNpKQorKm1heDEzNjNfbWF0Y2hfbW9kZSh1bnNpZ25lZCBsb25nICptYXNrLCBjb25zdCBzdHJ1Y3QgbWF4MTM2M19jaGlwX2luZm8gKmNpKQogewogCWludCBpOwogCWlmIChtYXNrKQogCQlmb3IgKGkgPSAwOyBpIDwgY2ktPm51bV9tb2RlczsgaSsrKQotCQkJaWYgKCEoKH5tYXgxMzYzX21vZGVfdGFibGVbY2ktPm1vZGVfbGlzdFtpXV0ubW9kZW1hc2spICYKLQkJCSAgICAgIG1hc2spKQorCQkJaWYgKGJpdG1hcF9zdWJzZXQobWFzaywKKwkJCQkJICBtYXgxMzYzX21vZGVfdGFibGVbY2ktPm1vZGVfbGlzdFtpXV0uCisJCQkJCSAgbW9kZW1hc2ssCisJCQkJCSAgTUFYMTM2M19NQVhfQ0hBTk5FTFMpKQogCQkJCXJldHVybiAmbWF4MTM2M19tb2RlX3RhYmxlW2NpLT5tb2RlX2xpc3RbaV1dOwogCXJldHVybiBOVUxMOwogfQpAQCAtMTg3LDcgKzE4OSw3IEBACiAJaW50IHJldCA9IDA7CiAJczMyIGRhdGE7CiAJY2hhciByeGJ1ZlsyXTsKLQlsb25nIG1hc2s7CisJY29uc3QgdW5zaWduZWQgbG9uZyAqbWFzazsKIAlzdHJ1Y3QgbWF4MTM2M19zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBzdC0+Y2xpZW50OwogCkBAIC0yMDMsNyArMjA1LDcgQEAKIAl9CiAKIAkvKiBJZiByaW5nIGJ1ZmZlciBjYXB0dXJlIGlzIG9jY3VycmluZywgcXVlcnkgdGhlIGJ1ZmZlciAqLwotCWlmIChpaW9fcmluZ19lbmFibGVkKGluZGlvX2RldikpIHsKKwlpZiAoaWlvX2J1ZmZlcl9lbmFibGVkKGluZGlvX2RldikpIHsKIAkJbWFzayA9IG1heDEzNjNfbW9kZV90YWJsZVtjaGFuLT5hZGRyZXNzXS5tb2RlbWFzazsKIAkJZGF0YSA9IG1heDEzNjNfc2luZ2xlX2NoYW5uZWxfZnJvbV9yaW5nKG1hc2ssIHN0KTsKIAkJaWYgKGRhdGEgPCAwKSB7CkBAIC0yNTUsNyArMjU3LDcgQEAKIAlzd2l0Y2ggKG0pIHsKIAljYXNlIDA6CiAJCXJldCA9IG1heDEzNjNfcmVhZF9zaW5nbGVfY2hhbihpbmRpb19kZXYsIGNoYW4sIHZhbCwgbSk7Ci0JCWlmIChyZXQpCisJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIAkJcmV0dXJuIElJT19WQUxfSU5UOwogCWNhc2UgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpOgpAQCAtMjg3LDcyICsyODksNTIgQEAKIAkoSUlPX0VWX0JJVChJSU9fRVZfVFlQRV9USFJFU0gsIElJT19FVl9ESVJfUklTSU5HKQlcCiAJIHwgSUlPX0VWX0JJVChJSU9fRVZfVFlQRV9USFJFU0gsIElJT19FVl9ESVJfRkFMTElORykpCiAjZGVmaW5lIE1BWDEzNjNfSU5GT19NQVNLICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKQotCi1zdGF0aWMgc3RydWN0IGlpb19jaGFuX3NwZWMgbWF4MTM2M19jaGFubmVsc1tdID0gewotCUlJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgMCwgMCwgTUFYMTM2M19JTkZPX01BU0ssCi0JCSBfczAsIDAsIElJT19TVCgndScsIDEyLCAxNiwgMCksIE1BWDEzNjNfRVZfTSksCi0JSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAxLCAwLCBNQVgxMzYzX0lORk9fTUFTSywKLQkJIF9zMSwgMSwgSUlPX1NUKCd1JywgMTIsIDE2LCAwKSwgTUFYMTM2M19FVl9NKSwKLQlJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDIsIDAsIE1BWDEzNjNfSU5GT19NQVNLLAotCQkgX3MyLCAyLCBJSU9fU1QoJ3UnLCAxMiwgMTYsIDApLCBNQVgxMzYzX0VWX00pLAotCUlJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgMywgMCwgTUFYMTM2M19JTkZPX01BU0ssCi0JCSBfczMsIDMsIElJT19TVCgndScsIDEyLCAxNiwgMCksIE1BWDEzNjNfRVZfTSksCi0JSUlPX0NIQU4oSUlPX0lOX0RJRkYsIDAsIDEsIDAsIE5VTEwsIDAsIDEsIE1BWDEzNjNfSU5GT19NQVNLLAotCQkgZDBtMSwgNCwgSUlPX1NUKCdzJywgMTIsIDE2LCAwKSwgTUFYMTM2M19FVl9NKSwKLQlJSU9fQ0hBTihJSU9fSU5fRElGRiwgMCwgMSwgMCwgTlVMTCwgMiwgMywgTUFYMTM2M19JTkZPX01BU0ssCi0JCSBkMm0zLCA1LCBJSU9fU1QoJ3MnLCAxMiwgMTYsIDApLCBNQVgxMzYzX0VWX00pLAotCUlJT19DSEFOKElJT19JTl9ESUZGLCAwLCAxLCAwLCBOVUxMLCAxLCAwLCBNQVgxMzYzX0lORk9fTUFTSywKLQkJIGQxbTAsIDYsIElJT19TVCgncycsIDEyLCAxNiwgMCksIE1BWDEzNjNfRVZfTSksCi0JSUlPX0NIQU4oSUlPX0lOX0RJRkYsIDAsIDEsIDAsIE5VTEwsIDMsIDIsIE1BWDEzNjNfSU5GT19NQVNLLAotCQkgZDNtMiwgNywgSUlPX1NUKCdzJywgMTIsIDE2LCAwKSwgTUFYMTM2M19FVl9NKSwKLQlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCg4KQotfTsKLQotc3RhdGljIHN0cnVjdCBpaW9fY2hhbl9zcGVjIG1heDEzNjFfY2hhbm5lbHNbXSA9IHsKLQlJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDAsIDAsIE1BWDEzNjNfSU5GT19NQVNLLAotCQkgX3MwLCAwLCBJSU9fU1QoJ3UnLCAxMCwgMTYsIDApLCBNQVgxMzYzX0VWX00pLAotCUlJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgMSwgMCwgTUFYMTM2M19JTkZPX01BU0ssCi0JCSBfczEsIDEsIElJT19TVCgndScsIDEwLCAxNiwgMCksIE1BWDEzNjNfRVZfTSksCi0JSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAyLCAwLCBNQVgxMzYzX0lORk9fTUFTSywKLQkJIF9zMiwgMiwgSUlPX1NUKCd1JywgMTAsIDE2LCAwKSwgTUFYMTM2M19FVl9NKSwKLQlJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDMsIDAsIE1BWDEzNjNfSU5GT19NQVNLLAotCQkgX3MzLCAzLCBJSU9fU1QoJ3UnLCAxMCwgMTYsIDApLCBNQVgxMzYzX0VWX00pLAotCUlJT19DSEFOKElJT19JTl9ESUZGLCAwLCAxLCAwLCBOVUxMLCAwLCAxLCBNQVgxMzYzX0lORk9fTUFTSywKLQkJIGQwbTEsIDQsIElJT19TVCgncycsIDEwLCAxNiwgMCksIE1BWDEzNjNfRVZfTSksCi0JSUlPX0NIQU4oSUlPX0lOX0RJRkYsIDAsIDEsIDAsIE5VTEwsIDIsIDMsIE1BWDEzNjNfSU5GT19NQVNLLAotCQkgZDJtMywgNSwgSUlPX1NUKCdzJywgMTAsIDE2LCAwKSwgTUFYMTM2M19FVl9NKSwKLQlJSU9fQ0hBTihJSU9fSU5fRElGRiwgMCwgMSwgMCwgTlVMTCwgMSwgMCwgTUFYMTM2M19JTkZPX01BU0ssCi0JCSBkMW0wLCA2LCBJSU9fU1QoJ3MnLCAxMCwgMTYsIDApLCBNQVgxMzYzX0VWX00pLAotCUlJT19DSEFOKElJT19JTl9ESUZGLCAwLCAxLCAwLCBOVUxMLCAzLCAyLCBNQVgxMzYzX0lORk9fTUFTSywKLQkJIGQzbTIsIDcsIElJT19TVCgncycsIDEwLCAxNiwgMCksIE1BWDEzNjNfRVZfTSksCi0JSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoOCkKLX07Ci0KLSNkZWZpbmUgTUFYMTM2M19DSEFOX1UobnVtLCBhZGRyZXNzLCBzY2FuX2luZGV4LCBiaXRzKQkJXAotCUlJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgbnVtLCAwLCBNQVgxMzYzX0lORk9fTUFTSywJXAotCQkgYWRkcmVzcywgc2Nhbl9pbmRleCwgSUlPX1NUKCd1JywgYml0cywJCVwKLQkJCQkJICAgICAoYml0cyA9PSA4KSA/IDggOiAxNiwgMCksIDApCi0vKiBiaXBvbGFyIGNoYW5uZWwgKi8KLSNkZWZpbmUgTUFYMTM2M19DSEFOX0IobnVtLCBudW0yLCBhZGRyZXNzLCBzY2FuX2luZGV4LCBiaXRzKQkJXAotCUlJT19DSEFOKElJT19JTl9ESUZGLCAwLCAxLCAwLCBOVUxMLCBudW0sIG51bTIsIE1BWDEzNjNfSU5GT19NQVNLLFwKLQkJIGFkZHJlc3MsIHNjYW5faW5kZXgsIElJT19TVCgncycsIGJpdHMsCQlcCi0JCQkJCSAgICAgKGJpdHMgPT0gOCkgPyA4IDogMTYsIDApLCAwKQotCi0jZGVmaW5lIE1BWDEzNjNfNFhfQ0hBTlMoYml0cykgewkJXAotCU1BWDEzNjNfQ0hBTl9VKDAsIF9zMCwgMCwgYml0cyksCVwKLQlNQVgxMzYzX0NIQU5fVSgxLCBfczEsIDEsIGJpdHMpLAlcCi0JTUFYMTM2M19DSEFOX1UoMiwgX3MyLCAyLCBiaXRzKSwJXAotCU1BWDEzNjNfQ0hBTl9VKDMsIF9zMywgMywgYml0cyksCVwKLQlNQVgxMzYzX0NIQU5fQigwLCAxLCBkMG0xLCA0LCBiaXRzKSwJXAotCU1BWDEzNjNfQ0hBTl9CKDIsIDMsIGQybTMsIDUsIGJpdHMpLAlcCi0JTUFYMTM2M19DSEFOX0IoMSwgMCwgZDFtMCwgNiwgYml0cyksCVwKLQlNQVgxMzYzX0NIQU5fQigzLCAyLCBkM20yLCA3LCBiaXRzKSwJXAotCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDgpCQlcCisjZGVmaW5lIE1BWDEzNjNfQ0hBTl9VKG51bSwgYWRkciwgc2ksIGJpdHMsIGV2bWFzaykJCQlcCisJewkJCQkJCQkJXAorCQkudHlwZSA9IElJT19WT0xUQUdFLAkJCQkJXAorCQkuaW5kZXhlZCA9IDEsCQkJCQkJXAorCQkuY2hhbm5lbCA9IG51bSwJCQkJCQlcCisJCS5hZGRyZXNzID0gYWRkciwJCQkJCVwKKwkJLmluZm9fbWFzayA9IE1BWDEzNjNfSU5GT19NQVNLLAkJCQlcCisJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3UnLCBiaXRzLCAoYml0cyA+IDgpID8gMTYgOiA4LCAwKSwgXAorCQkuc2Nhbl9pbmRleCA9IHNpLAkJCQkJXAorCQkuZXZlbnRfbWFzayA9IGV2bWFzaywJCQkJCVwKIAl9CiAKLXN0YXRpYyBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBtYXgxMDM2X2NoYW5uZWxzW10gPSBNQVgxMzYzXzRYX0NIQU5TKDgpOwotc3RhdGljIHN0cnVjdCBpaW9fY2hhbl9zcGVjIG1heDExMzZfY2hhbm5lbHNbXSA9IE1BWDEzNjNfNFhfQ0hBTlMoMTApOwotc3RhdGljIHN0cnVjdCBpaW9fY2hhbl9zcGVjIG1heDEyMzZfY2hhbm5lbHNbXSA9IE1BWDEzNjNfNFhfQ0hBTlMoMTIpOworLyogYmlwb2xhciBjaGFubmVsICovCisjZGVmaW5lIE1BWDEzNjNfQ0hBTl9CKG51bSwgbnVtMiwgYWRkciwgc2ksIGJpdHMsIGV2bWFzaykJCVwKKwl7CQkJCQkJCQlcCisJCS50eXBlID0gSUlPX1ZPTFRBR0UsCQkJCQlcCisJCS5kaWZmZXJlbnRpYWwgPSAxLAkJCQkJXAorCQkuaW5kZXhlZCA9IDEsCQkJCQkJXAorCQkuY2hhbm5lbCA9IG51bSwJCQkJCQlcCisJCS5jaGFubmVsMiA9IG51bTIsCQkJCQlcCisJCS5hZGRyZXNzID0gYWRkciwJCQkJCVwKKwkJLmluZm9fbWFzayA9IE1BWDEzNjNfSU5GT19NQVNLLAkJCQlcCisJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3UnLCBiaXRzLCAoYml0cyA+IDgpID8gMTYgOiA4LCAwKSwgXAorCQkuc2Nhbl9pbmRleCA9IHNpLAkJCQkJXAorCQkuZXZlbnRfbWFzayA9IGV2bWFzaywJCQkJCVwKKwl9CisKKyNkZWZpbmUgTUFYMTM2M180WF9DSEFOUyhiaXRzLCBlbSkgewkJCVwKKwlNQVgxMzYzX0NIQU5fVSgwLCBfczAsIDAsIGJpdHMsIGVtKSwJCVwKKwlNQVgxMzYzX0NIQU5fVSgxLCBfczEsIDEsIGJpdHMsIGVtKSwJCVwKKwlNQVgxMzYzX0NIQU5fVSgyLCBfczIsIDIsIGJpdHMsIGVtKSwJCVwKKwlNQVgxMzYzX0NIQU5fVSgzLCBfczMsIDMsIGJpdHMsIGVtKSwJCVwKKwlNQVgxMzYzX0NIQU5fQigwLCAxLCBkMG0xLCA0LCBiaXRzLCBlbSksCVwKKwlNQVgxMzYzX0NIQU5fQigyLCAzLCBkMm0zLCA1LCBiaXRzLCBlbSksCVwKKwlNQVgxMzYzX0NIQU5fQigxLCAwLCBkMW0wLCA2LCBiaXRzLCBlbSksCVwKKwlNQVgxMzYzX0NIQU5fQigzLCAyLCBkM20yLCA3LCBiaXRzLCBlbSksCVwKKwlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCg4KQkJCVwKKwl9CisKK3N0YXRpYyBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBtYXgxMDM2X2NoYW5uZWxzW10gPSBNQVgxMzYzXzRYX0NIQU5TKDgsIDApOworc3RhdGljIHN0cnVjdCBpaW9fY2hhbl9zcGVjIG1heDExMzZfY2hhbm5lbHNbXSA9IE1BWDEzNjNfNFhfQ0hBTlMoMTAsIDApOworc3RhdGljIHN0cnVjdCBpaW9fY2hhbl9zcGVjIG1heDEyMzZfY2hhbm5lbHNbXSA9IE1BWDEzNjNfNFhfQ0hBTlMoMTIsIDApOworc3RhdGljIHN0cnVjdCBpaW9fY2hhbl9zcGVjIG1heDEzNjFfY2hhbm5lbHNbXSA9CisJTUFYMTM2M180WF9DSEFOUygxMCwgTUFYMTM2M19FVl9NKTsKK3N0YXRpYyBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBtYXgxMzYzX2NoYW5uZWxzW10gPQorCU1BWDEzNjNfNFhfQ0hBTlMoMTIsIE1BWDEzNjNfRVZfTSk7CiAKIC8qIEFwcGllcyB0byBtYXgxMjM2LCBtYXgxMjM3ICovCiBzdGF0aWMgY29uc3QgZW51bSBtYXgxMzYzX21vZGVzIG1heDEyMzZfbW9kZV9saXN0W10gPSB7CkBAIC0zNzcsMzAgKzM1OSwzMCBAQAogfTsKIAogI2RlZmluZSBNQVgxMzYzXzEyWF9DSEFOUyhiaXRzKSB7CQkJXAotCU1BWDEzNjNfQ0hBTl9VKDAsIF9zMCwgMCwgYml0cyksCQlcCi0JTUFYMTM2M19DSEFOX1UoMSwgX3MxLCAxLCBiaXRzKSwJCVwKLQlNQVgxMzYzX0NIQU5fVSgyLCBfczIsIDIsIGJpdHMpLAkJXAotCU1BWDEzNjNfQ0hBTl9VKDMsIF9zMywgMywgYml0cyksCQlcCi0JTUFYMTM2M19DSEFOX1UoNCwgX3M0LCA0LCBiaXRzKSwJCVwKLQlNQVgxMzYzX0NIQU5fVSg1LCBfczUsIDUsIGJpdHMpLAkJXAotCU1BWDEzNjNfQ0hBTl9VKDYsIF9zNiwgNiwgYml0cyksCQlcCi0JTUFYMTM2M19DSEFOX1UoNywgX3M3LCA3LCBiaXRzKSwJCVwKLQlNQVgxMzYzX0NIQU5fVSg4LCBfczgsIDgsIGJpdHMpLAkJXAotCU1BWDEzNjNfQ0hBTl9VKDksIF9zOSwgOSwgYml0cyksCQlcCi0JTUFYMTM2M19DSEFOX1UoMTAsIF9zMTAsIDEwLCBiaXRzKSwJCVwKLQlNQVgxMzYzX0NIQU5fVSgxMSwgX3MxMSwgMTEsIGJpdHMpLAkJXAotCU1BWDEzNjNfQ0hBTl9CKDAsIDEsIGQwbTEsIDEyLCBiaXRzKSwJCVwKLQlNQVgxMzYzX0NIQU5fQigyLCAzLCBkMm0zLCAxMywgYml0cyksCQlcCi0JTUFYMTM2M19DSEFOX0IoNCwgNSwgZDRtNSwgMTQsIGJpdHMpLAkJXAotCU1BWDEzNjNfQ0hBTl9CKDYsIDcsIGQ2bTcsIDE1LCBiaXRzKSwJCVwKLQlNQVgxMzYzX0NIQU5fQig4LCA5LCBkOG05LCAxNiwgYml0cyksCQlcCi0JTUFYMTM2M19DSEFOX0IoMTAsIDExLCBkMTBtMTEsIDE3LCBiaXRzKSwJXAotCU1BWDEzNjNfQ0hBTl9CKDEsIDAsIGQxbTAsIDE4LCBiaXRzKSwJCVwKLQlNQVgxMzYzX0NIQU5fQigzLCAyLCBkM20yLCAxOSwgYml0cyksCQlcCi0JTUFYMTM2M19DSEFOX0IoNSwgNCwgZDVtNCwgMjAsIGJpdHMpLAkJXAotCU1BWDEzNjNfQ0hBTl9CKDcsIDYsIGQ3bTYsIDIxLCBiaXRzKSwJCVwKLQlNQVgxMzYzX0NIQU5fQig5LCA4LCBkOW04LCAyMiwgYml0cyksCQlcCi0JTUFYMTM2M19DSEFOX0IoMTEsIDEwLCBkMTFtMTAsIDIzLCBiaXRzKSwJXAorCU1BWDEzNjNfQ0hBTl9VKDAsIF9zMCwgMCwgYml0cywgMCksCQlcCisJTUFYMTM2M19DSEFOX1UoMSwgX3MxLCAxLCBiaXRzLCAwKSwJCVwKKwlNQVgxMzYzX0NIQU5fVSgyLCBfczIsIDIsIGJpdHMsIDApLAkJXAorCU1BWDEzNjNfQ0hBTl9VKDMsIF9zMywgMywgYml0cywgMCksCQlcCisJTUFYMTM2M19DSEFOX1UoNCwgX3M0LCA0LCBiaXRzLCAwKSwJCVwKKwlNQVgxMzYzX0NIQU5fVSg1LCBfczUsIDUsIGJpdHMsIDApLAkJXAorCU1BWDEzNjNfQ0hBTl9VKDYsIF9zNiwgNiwgYml0cywgMCksCQlcCisJTUFYMTM2M19DSEFOX1UoNywgX3M3LCA3LCBiaXRzLCAwKSwJCVwKKwlNQVgxMzYzX0NIQU5fVSg4LCBfczgsIDgsIGJpdHMsIDApLAkJXAorCU1BWDEzNjNfQ0hBTl9VKDksIF9zOSwgOSwgYml0cywgMCksCQlcCisJTUFYMTM2M19DSEFOX1UoMTAsIF9zMTAsIDEwLCBiaXRzLCAwKSwJCVwKKwlNQVgxMzYzX0NIQU5fVSgxMSwgX3MxMSwgMTEsIGJpdHMsIDApLAkJXAorCU1BWDEzNjNfQ0hBTl9CKDAsIDEsIGQwbTEsIDEyLCBiaXRzLCAwKSwJXAorCU1BWDEzNjNfQ0hBTl9CKDIsIDMsIGQybTMsIDEzLCBiaXRzLCAwKSwJXAorCU1BWDEzNjNfQ0hBTl9CKDQsIDUsIGQ0bTUsIDE0LCBiaXRzLCAwKSwJXAorCU1BWDEzNjNfQ0hBTl9CKDYsIDcsIGQ2bTcsIDE1LCBiaXRzLCAwKSwJXAorCU1BWDEzNjNfQ0hBTl9CKDgsIDksIGQ4bTksIDE2LCBiaXRzLCAwKSwJXAorCU1BWDEzNjNfQ0hBTl9CKDEwLCAxMSwgZDEwbTExLCAxNywgYml0cywgMCksCVwKKwlNQVgxMzYzX0NIQU5fQigxLCAwLCBkMW0wLCAxOCwgYml0cywgMCksCVwKKwlNQVgxMzYzX0NIQU5fQigzLCAyLCBkM20yLCAxOSwgYml0cywgMCksCVwKKwlNQVgxMzYzX0NIQU5fQig1LCA0LCBkNW00LCAyMCwgYml0cywgMCksCVwKKwlNQVgxMzYzX0NIQU5fQig3LCA2LCBkN202LCAyMSwgYml0cywgMCksCVwKKwlNQVgxMzYzX0NIQU5fQig5LCA4LCBkOW04LCAyMiwgYml0cywgMCksCVwKKwlNQVgxMzYzX0NIQU5fQigxMSwgMTAsIGQxMW0xMCwgMjMsIGJpdHMsIDApLAlcCiAJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoMjQpCQkJXAogCX0KIHN0YXRpYyBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBtYXgxMDM4X2NoYW5uZWxzW10gPSBNQVgxMzYzXzEyWF9DSEFOUyg4KTsKQEAgLTQyNSwyNSArNDA3LDI1IEBACiAJZDFtMHRvM20yLCBkMW0wdG81bTQsIGQxbTB0bzdtNiwKIH07CiAKLSNkZWZpbmUgTUFYMTM2M184WF9DSEFOUyhiaXRzKSB7CQkJCVwKLQkJTUFYMTM2M19DSEFOX1UoMCwgX3MwLCAwLCBiaXRzKSwJCVwKLQkJCU1BWDEzNjNfQ0hBTl9VKDEsIF9zMSwgMSwgYml0cyksCVwKLQkJCU1BWDEzNjNfQ0hBTl9VKDIsIF9zMiwgMiwgYml0cyksCVwKLQkJCU1BWDEzNjNfQ0hBTl9VKDMsIF9zMywgMywgYml0cyksCVwKLQkJCU1BWDEzNjNfQ0hBTl9VKDQsIF9zNCwgNCwgYml0cyksCVwKLQkJCU1BWDEzNjNfQ0hBTl9VKDUsIF9zNSwgNSwgYml0cyksCVwKLQkJCU1BWDEzNjNfQ0hBTl9VKDYsIF9zNiwgNiwgYml0cyksCVwKLQkJCU1BWDEzNjNfQ0hBTl9VKDcsIF9zNywgNywgYml0cyksCVwKLQkJCU1BWDEzNjNfQ0hBTl9CKDAsIDEsIGQwbTEsIDgsIGJpdHMpLAlcCi0JCQlNQVgxMzYzX0NIQU5fQigyLCAzLCBkMm0zLCA5LCBiaXRzKSwJXAotCQkJTUFYMTM2M19DSEFOX0IoNCwgNSwgZDRtNSwgMTAsIGJpdHMpLAlcCi0JCQlNQVgxMzYzX0NIQU5fQig2LCA3LCBkNm03LCAxMSwgYml0cyksCVwKLQkJCU1BWDEzNjNfQ0hBTl9CKDEsIDAsIGQxbTAsIDEyLCBiaXRzKSwJXAotCQkJTUFYMTM2M19DSEFOX0IoMywgMiwgZDNtMiwgMTMsIGJpdHMpLAlcCi0JCQlNQVgxMzYzX0NIQU5fQig1LCA0LCBkNW00LCAxNCwgYml0cyksCVwKLQkJCU1BWDEzNjNfQ0hBTl9CKDcsIDYsIGQ3bTYsIDE1LCBiaXRzKSwJXAotCQkJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoMTYpCQlcCi0JCX0KKyNkZWZpbmUgTUFYMTM2M184WF9DSEFOUyhiaXRzKSB7CQkJXAorCU1BWDEzNjNfQ0hBTl9VKDAsIF9zMCwgMCwgYml0cywgMCksCQlcCisJTUFYMTM2M19DSEFOX1UoMSwgX3MxLCAxLCBiaXRzLCAwKSwJCVwKKwlNQVgxMzYzX0NIQU5fVSgyLCBfczIsIDIsIGJpdHMsIDApLAkJXAorCU1BWDEzNjNfQ0hBTl9VKDMsIF9zMywgMywgYml0cywgMCksCQlcCisJTUFYMTM2M19DSEFOX1UoNCwgX3M0LCA0LCBiaXRzLCAwKSwJCVwKKwlNQVgxMzYzX0NIQU5fVSg1LCBfczUsIDUsIGJpdHMsIDApLAkJXAorCU1BWDEzNjNfQ0hBTl9VKDYsIF9zNiwgNiwgYml0cywgMCksCQlcCisJTUFYMTM2M19DSEFOX1UoNywgX3M3LCA3LCBiaXRzLCAwKSwJCVwKKwlNQVgxMzYzX0NIQU5fQigwLCAxLCBkMG0xLCA4LCBiaXRzLCAwKSwJXAorCU1BWDEzNjNfQ0hBTl9CKDIsIDMsIGQybTMsIDksIGJpdHMsIDApLAlcCisJTUFYMTM2M19DSEFOX0IoNCwgNSwgZDRtNSwgMTAsIGJpdHMsIDApLAlcCisJTUFYMTM2M19DSEFOX0IoNiwgNywgZDZtNywgMTEsIGJpdHMsIDApLAlcCisJTUFYMTM2M19DSEFOX0IoMSwgMCwgZDFtMCwgMTIsIGJpdHMsIDApLAlcCisJTUFYMTM2M19DSEFOX0IoMywgMiwgZDNtMiwgMTMsIGJpdHMsIDApLAlcCisJTUFYMTM2M19DSEFOX0IoNSwgNCwgZDVtNCwgMTQsIGJpdHMsIDApLAlcCisJTUFYMTM2M19DSEFOX0IoNywgNiwgZDdtNiwgMTUsIGJpdHMsIDApLAlcCisJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoMTYpCQkJXAorfQogc3RhdGljIHN0cnVjdCBpaW9fY2hhbl9zcGVjIG1heDExNjAyX2NoYW5uZWxzW10gPSBNQVgxMzYzXzhYX0NIQU5TKDgpOwogc3RhdGljIHN0cnVjdCBpaW9fY2hhbl9zcGVjIG1heDExNjA4X2NoYW5uZWxzW10gPSBNQVgxMzYzXzhYX0NIQU5TKDEwKTsKIHN0YXRpYyBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBtYXgxMTYxNF9jaGFubmVsc1tdID0gTUFYMTM2M184WF9DSEFOUygxMik7CkBAIC00NTMsMTAgKzQzNSwxMCBAQAogfTsKIAogI2RlZmluZSBNQVgxMzYzXzJYX0NIQU5TKGJpdHMpIHsJCQlcCi0JTUFYMTM2M19DSEFOX1UoMCwgX3MwLCAwLCBiaXRzKSwJCVwKLQlNQVgxMzYzX0NIQU5fVSgxLCBfczEsIDEsIGJpdHMpLAkJXAotCU1BWDEzNjNfQ0hBTl9CKDAsIDEsIGQwbTEsIDIsIGJpdHMpLAkJXAotCU1BWDEzNjNfQ0hBTl9CKDEsIDAsIGQxbTAsIDMsIGJpdHMpLAkJXAorCU1BWDEzNjNfQ0hBTl9VKDAsIF9zMCwgMCwgYml0cywgMCksCQlcCisJTUFYMTM2M19DSEFOX1UoMSwgX3MxLCAxLCBiaXRzLCAwKSwJCVwKKwlNQVgxMzYzX0NIQU5fQigwLCAxLCBkMG0xLCAyLCBiaXRzLCAwKSwJXAorCU1BWDEzNjNfQ0hBTl9CKDEsIDAsIGQxbTAsIDMsIGJpdHMsIDApLAlcCiAJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoNCkJCQlcCiAJfQogCkBAIC01NTEsNyArNTMzLDcgQEAKIAkJIjEzMzAwMCA2NjUwMDAgMzMzMDAgMTY2MDAgODMwMCA0MjAwIDIwMDAgMTAwMCIpOwogCiBzdGF0aWMgaW50IG1heDEzNjNfcmVhZF90aHJlc2goc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKLQkJCSAgICAgICBpbnQgZXZlbnRfY29kZSwKKwkJCSAgICAgICB1NjQgZXZlbnRfY29kZSwKIAkJCSAgICAgICBpbnQgKnZhbCkKIHsKIAlzdHJ1Y3QgbWF4MTM2M19zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtNTYzLDcgKzU0NSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgbWF4MTM2M193cml0ZV90aHJlc2goc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKLQkJCQlpbnQgZXZlbnRfY29kZSwKKwkJCQl1NjQgZXZlbnRfY29kZSwKIAkJCQlpbnQgdmFsKQogewogCXN0cnVjdCBtYXgxMzYzX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CkBAIC01OTEsMTEgKzU3MywyMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3QgaW50IG1heDEzNjNfZXZlbnRfY29kZXNbXSA9IHsKLQlJSU9fRVZFTlRfQ09ERV9JTl9MT1dfVEhSRVNIKDMpLCBJSU9fRVZFTlRfQ09ERV9JTl9ISUdIX1RIUkVTSCgzKSwKLQlJSU9fRVZFTlRfQ09ERV9JTl9MT1dfVEhSRVNIKDIpLCBJSU9fRVZFTlRfQ09ERV9JTl9ISUdIX1RIUkVTSCgyKSwKLQlJSU9fRVZFTlRfQ09ERV9JTl9MT1dfVEhSRVNIKDEpLCBJSU9fRVZFTlRfQ09ERV9JTl9ISUdIX1RIUkVTSCgxKSwKLQlJSU9fRVZFTlRfQ09ERV9JTl9MT1dfVEhSRVNIKDApLCBJSU9fRVZFTlRfQ09ERV9JTl9ISUdIX1RIUkVTSCgwKQorc3RhdGljIGNvbnN0IHU2NCBtYXgxMzYzX2V2ZW50X2NvZGVzW10gPSB7CisJSUlPX1VOTU9EX0VWRU5UX0NPREUoSUlPX1ZPTFRBR0UsIDAsCisJCQkgICAgIElJT19FVl9UWVBFX1RIUkVTSCwgSUlPX0VWX0RJUl9GQUxMSU5HKSwKKwlJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fVk9MVEFHRSwgMSwKKwkJCSAgICAgSUlPX0VWX1RZUEVfVEhSRVNILCBJSU9fRVZfRElSX0ZBTExJTkcpLAorCUlJT19VTk1PRF9FVkVOVF9DT0RFKElJT19WT0xUQUdFLCAyLAorCQkJICAgICBJSU9fRVZfVFlQRV9USFJFU0gsIElJT19FVl9ESVJfRkFMTElORyksCisJSUlPX1VOTU9EX0VWRU5UX0NPREUoSUlPX1ZPTFRBR0UsIDMsCisJCQkgICAgIElJT19FVl9UWVBFX1RIUkVTSCwgSUlPX0VWX0RJUl9GQUxMSU5HKSwKKwlJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fVk9MVEFHRSwgMCwKKwkJCSAgICAgSUlPX0VWX1RZUEVfVEhSRVNILCBJSU9fRVZfRElSX1JJU0lORyksCisJSUlPX1VOTU9EX0VWRU5UX0NPREUoSUlPX1ZPTFRBR0UsIDEsCisJCQkgICAgIElJT19FVl9UWVBFX1RIUkVTSCwgSUlPX0VWX0RJUl9SSVNJTkcpLAorCUlJT19VTk1PRF9FVkVOVF9DT0RFKElJT19WT0xUQUdFLCAyLAorCQkJICAgICBJSU9fRVZfVFlQRV9USFJFU0gsIElJT19FVl9ESVJfUklTSU5HKSwKKwlJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fVk9MVEFHRSwgMywKKwkJCSAgICAgSUlPX0VWX1RZUEVfVEhSRVNILCBJSU9fRVZfRElSX1JJU0lORyksCiB9OwogCiBzdGF0aWMgaXJxcmV0dXJuX3QgbWF4MTM2M19ldmVudF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnByaXZhdGUpCkBAIC02MTEsMTUgKzYwNSwxNCBAQAogCWkyY19tYXN0ZXJfcmVjdihzdC0+Y2xpZW50LCAmcngsIDEpOwogCW1hc2sgPSByeDsKIAlmb3JfZWFjaF9zZXRfYml0KGxvYywgJm1hc2ssIDgpCi0JCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwgMCwgbWF4MTM2M19ldmVudF9jb2Rlc1tsb2NdLAotCQkJICAgICAgIHRpbWVzdGFtcCk7CisJCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwgbWF4MTM2M19ldmVudF9jb2Rlc1tsb2NdLCB0aW1lc3RhbXApOwogCWkyY19tYXN0ZXJfc2VuZChzdC0+Y2xpZW50LCB0eCwgMik7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKIHN0YXRpYyBpbnQgbWF4MTM2M19yZWFkX2V2ZW50X2NvbmZpZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAotCQkJCSAgICAgaW50IGV2ZW50X2NvZGUpCisJCQkJICAgICB1NjQgZXZlbnRfY29kZSkKIHsKIAlzdHJ1Y3QgbWF4MTM2M19zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCkBAIC02NDEsNyArNjM0LDcgQEAKIAlpbnQgcmV0LCBpID0gMywgajsKIAl1bnNpZ25lZCBsb25nIG51bWVsZW1lbnRzOwogCWludCBsZW47Ci0JbG9uZyBtb2RlbWFzazsKKwljb25zdCBsb25nICptb2RlbWFzazsKIAogCWlmICghZW5hYmxlZCkgewogCQkvKiB0cmFuc2l0aW9uIHRvIHJpbmcgY2FwdHVyZSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCAqLwpAQCAtNjY5LDcgKzY2Miw3IEBACiAJCXN0LT5jb25maWdieXRlIHw9IG1heDEzNjNfbW9kZV90YWJsZVtkMW0wdG8zbTJdLmNvbmY7CiAJCW1vZGVtYXNrID0gbWF4MTM2M19tb2RlX3RhYmxlW2QxbTB0bzNtMl0ubW9kZW1hc2s7CiAJfQotCW51bWVsZW1lbnRzID0gaHdlaWdodF9sb25nKG1vZGVtYXNrKTsKKwludW1lbGVtZW50cyA9IGJpdG1hcF93ZWlnaHQobW9kZW1hc2ssIE1BWDEzNjNfTUFYX0NIQU5ORUxTKTsKIAlsZW4gPSAzICogbnVtZWxlbWVudHMgKyAzOwogCXR4X2J1ZiA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXR4X2J1ZikgewpAQCAtNjg1LDcgKzY3OCw3IEBACiAJICogc2V0dXAgdG8gbWF0Y2ggd2hhdCB3ZSBuZWVkLgogCSAqLwogCWZvciAoaiA9IDA7IGogPCA4OyBqKyspCi0JCWlmIChtb2RlbWFzayAmICgxIDw8IGopKSB7CisJCWlmICh0ZXN0X2JpdChqLCBtb2RlbWFzaykpIHsKIAkJCS8qIEVzdGFibGlzaCB0aGUgbW9kZSBpcyBpbiB0aGUgc2NhbiAqLwogCQkJaWYgKHN0LT5tYXNrX2xvdyAmICgxIDw8IGopKSB7CiAJCQkJdHhfYnVmW2ldID0gKHN0LT50aHJlc2hfbG93W2pdID4+IDQpICYgMHhGRjsKQEAgLTc3MSw3ICs3NjQsNyBAQAogfQogCiBzdGF0aWMgaW50IG1heDEzNjNfd3JpdGVfZXZlbnRfY29uZmlnKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCi0JCQkJICAgICAgaW50IGV2ZW50X2NvZGUsCisJCQkJICAgICAgdTY0IGV2ZW50X2NvZGUsCiAJCQkJICAgICAgaW50IHN0YXRlKQogewogCWludCByZXQgPSAwOwpAQCAtODIzLDYgKzgxNiw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG1heDEzNjNfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0gewogCS5hdHRycyA9IG1heDEzNjNfZXZlbnRfYXR0cmlidXRlcywKKwkubmFtZSA9ICJldmVudHMiLAogfTsKIAogI2RlZmluZSBNQVgxMzYzX0VWRU5UX0ZVTkNTCQkJCQkJXApAQCAtODQwLDcgKzgzNCw2IEBACiAJLndyaXRlX2V2ZW50X2NvbmZpZyA9ICZtYXgxMzYzX3dyaXRlX2V2ZW50X2NvbmZpZywKIAkucmVhZF9yYXcgPSAmbWF4MTM2M19yZWFkX3JhdywKIAkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAotCS5udW1faW50ZXJydXB0X2xpbmVzID0gMSwKIAkuZXZlbnRfYXR0cnMgPSAmbWF4MTM2M19ldmVudF9hdHRyaWJ1dGVfZ3JvdXAsCiB9OwogCkBAIC0xMjQ5LDcgKzEyNDIsNyBAQAogc3RhdGljIGludCBfX2RldmluaXQgbWF4MTM2M19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJCSAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKLQlpbnQgcmV0LCBpLCByZWdkb25lID0gMDsKKwlpbnQgcmV0LCBpOwogCXN0cnVjdCBtYXgxMzYzX3N0YXRlICpzdDsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OwogCXN0cnVjdCByZWd1bGF0b3IgKnJlZzsKQEAgLTEyNzgsNyArMTI3MSw3IEBACiAJc3QtPmNsaWVudCA9IGNsaWVudDsKIAogCWluZGlvX2Rldi0+YXZhaWxhYmxlX3NjYW5fbWFza3MKLQkJPSBremFsbG9jKHNpemVvZigqaW5kaW9fZGV2LT5hdmFpbGFibGVfc2Nhbl9tYXNrcykqCisJCT0ga3phbGxvYyhCSVRTX1RPX0xPTkdTKE1BWDEzNjNfTUFYX0NIQU5ORUxTKSpzaXplb2YobG9uZykqCiAJCQkgIChzdC0+Y2hpcF9pbmZvLT5udW1fbW9kZXMgKyAxKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbmRpb19kZXYtPmF2YWlsYWJsZV9zY2FuX21hc2tzKSB7CiAJCXJldCA9IC1FTk9NRU07CkBAIC0xMjg2LDE1ICsxMjc5LDE5IEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IHN0LT5jaGlwX2luZm8tPm51bV9tb2RlczsgaSsrKQotCQlpbmRpb19kZXYtPmF2YWlsYWJsZV9zY2FuX21hc2tzW2ldID0KLQkJCW1heDEzNjNfbW9kZV90YWJsZVtzdC0+Y2hpcF9pbmZvLT5tb2RlX2xpc3RbaV1dCi0JCQkubW9kZW1hc2s7CisJCWJpdG1hcF9jb3B5KGluZGlvX2Rldi0+YXZhaWxhYmxlX3NjYW5fbWFza3MgKworCQkJICAgIEJJVFNfVE9fTE9OR1MoTUFYMTM2M19NQVhfQ0hBTk5FTFMpKmksCisJCQkgICAgbWF4MTM2M19tb2RlX3RhYmxlW3N0LT5jaGlwX2luZm8tPm1vZGVfbGlzdFtpXV0KKwkJCSAgICAubW9kZW1hc2ssIE1BWDEzNjNfTUFYX0NIQU5ORUxTKTsKIAkvKiBFc3RhYmlsaXNoIHRoYXQgdGhlIGlpb19kZXYgaXMgYSBjaGlsZCBvZiB0aGUgaTJjIGRldmljZSAqLwogCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKIAlpbmRpb19kZXYtPm5hbWUgPSBpZC0+bmFtZTsKLQorCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBzdC0+Y2hpcF9pbmZvLT5jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IHN0LT5jaGlwX2luZm8tPm51bV9jaGFubmVsczsKIAlpbmRpb19kZXYtPmluZm8gPSBzdC0+Y2hpcF9pbmZvLT5pbmZvOwogCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gc3QtPmNoaXBfaW5mby0+Y2hhbm5lbHM7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBzdC0+Y2hpcF9pbmZvLT5udW1fY2hhbm5lbHM7CiAJcmV0ID0gbWF4MTM2M19pbml0aWFsX3NldHVwKHN0KTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcl9mcmVlX2F2YWlsYWJsZV9zY2FuX21hc2tzOwpAQCAtMTMwMywxMyArMTMwMCw5IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9mcmVlX2F2YWlsYWJsZV9zY2FuX21hc2tzOwogCi0JcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfY2xlYW51cF9yaW5nOwotCXJlZ2RvbmUgPSAxOwotCXJldCA9IGlpb19yaW5nX2J1ZmZlcl9yZWdpc3Rlcl9leChpbmRpb19kZXYtPnJpbmcsIDAsCi0JCQkJCSAgc3QtPmNoaXBfaW5mby0+Y2hhbm5lbHMsCi0JCQkJCSAgc3QtPmNoaXBfaW5mby0+bnVtX2NoYW5uZWxzKTsKKwlyZXQgPSBpaW9fYnVmZmVyX3JlZ2lzdGVyKGluZGlvX2RldiwKKwkJCQkgIHN0LT5jaGlwX2luZm8tPmNoYW5uZWxzLAorCQkJCSAgc3QtPmNoaXBfaW5mby0+bnVtX2NoYW5uZWxzKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX2NsZWFudXBfcmluZzsKIApAQCAtMTMyNSwxOSArMTMxOCwyMSBAQAogCQkJZ290byBlcnJvcl91bmluaXRfcmluZzsKIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3JfZnJlZV9pcnE7CiAKKwlyZXR1cm4gMDsKK2Vycm9yX2ZyZWVfaXJxOgorCWZyZWVfaXJxKHN0LT5jbGllbnQtPmlycSwgaW5kaW9fZGV2KTsKIGVycm9yX3VuaW5pdF9yaW5nOgotCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldi0+cmluZyk7CisJaWlvX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldik7CiBlcnJvcl9jbGVhbnVwX3Jpbmc6CiAJbWF4MTM2M19yaW5nX2NsZWFudXAoaW5kaW9fZGV2KTsKIGVycm9yX2ZyZWVfYXZhaWxhYmxlX3NjYW5fbWFza3M6CiAJa2ZyZWUoaW5kaW9fZGV2LT5hdmFpbGFibGVfc2Nhbl9tYXNrcyk7CiBlcnJvcl9mcmVlX2RldmljZToKLQlpZiAoIXJlZ2RvbmUpCi0JCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwotCWVsc2UKLQkJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiBlcnJvcl9kaXNhYmxlX3JlZzoKIAlyZWd1bGF0b3JfZGlzYWJsZShyZWcpOwogZXJyb3JfcHV0X3JlZzoKQEAgLTEzNTIsMTYgKzEzNDcsMTcgQEAKIAlzdHJ1Y3QgbWF4MTM2M19zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCXN0cnVjdCByZWd1bGF0b3IgKnJlZyA9IHN0LT5yZWc7CiAKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIAlpZiAoY2xpZW50LT5pcnEpCiAJCWZyZWVfaXJxKHN0LT5jbGllbnQtPmlycSwgaW5kaW9fZGV2KTsKLQlpaW9fcmluZ19idWZmZXJfdW5yZWdpc3RlcihpbmRpb19kZXYtPnJpbmcpOworCWlpb19idWZmZXJfdW5yZWdpc3RlcihpbmRpb19kZXYpOwogCW1heDEzNjNfcmluZ19jbGVhbnVwKGluZGlvX2Rldik7CiAJa2ZyZWUoaW5kaW9fZGV2LT5hdmFpbGFibGVfc2Nhbl9tYXNrcyk7CiAJaWYgKCFJU19FUlIocmVnKSkgewogCQlyZWd1bGF0b3JfZGlzYWJsZShyZWcpOwogCQlyZWd1bGF0b3JfcHV0KHJlZyk7CiAJfQotCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9tYXgxMzYzX3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL21heDEzNjNfcmluZy5jCmluZGV4IGY0M2JlZmQuLmRmNjg5M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL21heDEzNjNfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL21heDEzNjNfcmluZy5jCkBAIC05LDI4ICs5LDI2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgotI2luY2x1ZGUgIi4uL3JpbmdfZ2VuZXJpYy5oIgorI2luY2x1ZGUgIi4uL2J1ZmZlcl9nZW5lcmljLmgiCiAjaW5jbHVkZSAiLi4vcmluZ19zdy5oIgotI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKLSNpbmNsdWRlICIuLi9zeXNmcy5oIgorI2luY2x1ZGUgIi4uL3RyaWdnZXJfY29uc3VtZXIuaCIKIAogI2luY2x1ZGUgIm1heDEzNjMuaCIKIAotaW50IG1heDEzNjNfc2luZ2xlX2NoYW5uZWxfZnJvbV9yaW5nKGxvbmcgbWFzaywgc3RydWN0IG1heDEzNjNfc3RhdGUgKnN0KQoraW50IG1heDEzNjNfc2luZ2xlX2NoYW5uZWxfZnJvbV9yaW5nKGNvbnN0IGxvbmcgKm1hc2ssIHN0cnVjdCBtYXgxMzYzX3N0YXRlICpzdCkKIHsKLQlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gaWlvX3ByaXZfdG9fZGV2KHN0KS0+cmluZzsKLQlpbnQgY291bnQgPSAwLCByZXQ7CisJc3RydWN0IGlpb19idWZmZXIgKnJpbmcgPSBpaW9fcHJpdl90b19kZXYoc3QpLT5idWZmZXI7CisJaW50IGNvdW50ID0gMCwgcmV0LCBpbmRleDsKIAl1OCAqcmluZ19kYXRhOwotCWlmICghKHN0LT5jdXJyZW50X21vZGUtPm1vZGVtYXNrICYgbWFzaykpIHsKKwlpbmRleCA9IGZpbmRfZmlyc3RfYml0KG1hc2ssIE1BWDEzNjNfTUFYX0NIQU5ORUxTKTsKKworCWlmICghKHRlc3RfYml0KGluZGV4LCBzdC0+Y3VycmVudF9tb2RlLT5tb2RlbWFzaykpKSB7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBlcnJvcl9yZXQ7CiAJfQpAQCAtNDUsMTIgKzQzLDggQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX2ZyZWVfcmluZ19kYXRhOwogCS8qIE5lZWQgYSBjb3VudCBvZiBjaGFubmVscyBwcmlvciB0byB0aGlzIG9uZSAqLwotCW1hc2sgPj49IDE7Ci0Jd2hpbGUgKG1hc2spIHsKLQkJaWYgKG1hc2sgJiBzdC0+Y3VycmVudF9tb2RlLT5tb2RlbWFzaykKLQkJCWNvdW50Kys7Ci0JCW1hc2sgPj49IDE7Ci0JfQorCisJY291bnQgPSBiaXRtYXBfd2VpZ2h0KG1hc2ssIGluZGV4IC0gMSk7CiAJaWYgKHN0LT5jaGlwX2luZm8tPmJpdHMgIT0gOCkKIAkJcmV0ID0gKChpbnQpKHJpbmdfZGF0YVtjb3VudCoyICsgMF0gJiAweDBGKSA8PCA4KQogCQkJKyAoaW50KShyaW5nX2RhdGFbY291bnQqMiArIDFdKTsKQEAgLTc0LDcgKzY4LDcgQEAKIHN0YXRpYyBpbnQgbWF4MTM2M19yaW5nX3ByZWVuYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCXN0cnVjdCBtYXgxMzYzX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0Jc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+cmluZzsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+YnVmZmVyOwogCXNpemVfdCBkX3NpemUgPSAwOwogCXVuc2lnbmVkIGxvbmcgbnVtdmFsczsKIApAQCAtODksNyArODMsOCBAQAogCiAJbWF4MTM2M19zZXRfc2Nhbl9tb2RlKHN0KTsKIAotCW51bXZhbHMgPSBod2VpZ2h0X2xvbmcoc3QtPmN1cnJlbnRfbW9kZS0+bW9kZW1hc2spOworCW51bXZhbHMgPSBiaXRtYXBfd2VpZ2h0KHN0LT5jdXJyZW50X21vZGUtPm1vZGVtYXNrLAorCQkJCWluZGlvX2Rldi0+bWFza2xlbmd0aCk7CiAJaWYgKHJpbmctPmFjY2Vzcy0+c2V0X2J5dGVzX3Blcl9kYXR1bSkgewogCQlpZiAocmluZy0+c2Nhbl90aW1lc3RhbXApCiAJCQlkX3NpemUgKz0gc2l6ZW9mKHM2NCk7CkBAIC0xMDgsMTMgKzEwMywxNCBAQAogc3RhdGljIGlycXJldHVybl90IG1heDEzNjNfdHJpZ2dlcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnApCiB7CiAJc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmID0gcDsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPmluZGlvX2RldjsKIAlzdHJ1Y3QgbWF4MTM2M19zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCXM2NCB0aW1lX25zOwogCV9fdTggKnJ4YnVmOwogCWludCBiX3NlbnQ7CiAJc2l6ZV90IGRfc2l6ZTsKLQl1bnNpZ25lZCBsb25nIG51bXZhbHMgPSBod2VpZ2h0X2xvbmcoc3QtPmN1cnJlbnRfbW9kZS0+bW9kZW1hc2spOworCXVuc2lnbmVkIGxvbmcgbnVtdmFscyA9IGJpdG1hcF93ZWlnaHQoc3QtPmN1cnJlbnRfbW9kZS0+bW9kZW1hc2ssCisJCQkJCSAgICAgIE1BWDEzNjNfTUFYX0NIQU5ORUxTKTsKIAogCS8qIEVuc3VyZSB0aGUgdGltZXN0YW1wIGlzIDggYnl0ZSBhbGlnbmVkICovCiAJaWYgKHN0LT5jaGlwX2luZm8tPmJpdHMgIT0gOCkKQEAgLTE0NSw3ICsxNDEsNyBAQAogCiAJbWVtY3B5KHJ4YnVmICsgZF9zaXplIC0gc2l6ZW9mKHM2NCksICZ0aW1lX25zLCBzaXplb2YodGltZV9ucykpOwogCi0JaW5kaW9fZGV2LT5yaW5nLT5hY2Nlc3MtPnN0b3JlX3RvKGluZGlvX2Rldi0+cmluZywgcnhidWYsIHRpbWVfbnMpOworCWluZGlvX2Rldi0+YnVmZmVyLT5hY2Nlc3MtPnN0b3JlX3RvKGluZGlvX2Rldi0+YnVmZmVyLCByeGJ1ZiwgdGltZV9ucyk7CiBkb25lOgogCWlpb190cmlnZ2VyX25vdGlmeV9kb25lKGluZGlvX2Rldi0+dHJpZyk7CiAJa2ZyZWUocnhidWYpOwpAQCAtMTUzLDEwICsxNDksMTAgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX3Jpbmdfc2V0dXBfb3BzIG1heDEzNjNfcmluZ19zZXR1cF9vcHMgPSB7Ci0JLnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3Bvc3RlbmFibGUsCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19idWZmZXJfc2V0dXBfb3BzIG1heDEzNjNfcmluZ19zZXR1cF9vcHMgPSB7CisJLnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZSwKIAkucHJlZW5hYmxlID0gJm1heDEzNjNfcmluZ19wcmVlbmFibGUsCi0JLnByZWRpc2FibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3ByZWRpc2FibGUsCisJLnByZWRpc2FibGUgPSAmaWlvX3RyaWdnZXJlZF9idWZmZXJfcHJlZGlzYWJsZSwKIH07CiAKIGludCBtYXgxMzYzX3JlZ2lzdGVyX3JpbmdfZnVuY3NfYW5kX2luaXQoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKQEAgLTE2NCw4ICsxNjAsOCBAQAogCXN0cnVjdCBtYXgxMzYzX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJaW50IHJldCA9IDA7CiAKLQlpbmRpb19kZXYtPnJpbmcgPSBpaW9fc3dfcmJfYWxsb2NhdGUoaW5kaW9fZGV2KTsKLQlpZiAoIWluZGlvX2Rldi0+cmluZykgeworCWluZGlvX2Rldi0+YnVmZmVyID0gaWlvX3N3X3JiX2FsbG9jYXRlKGluZGlvX2Rldik7CisJaWYgKCFpbmRpb19kZXYtPmJ1ZmZlcikgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycm9yX3JldDsKIAl9CkBAIC0xODEsMTcgKzE3NywxNyBAQAogCQlnb3RvIGVycm9yX2RlYWxsb2NhdGVfc3dfcmI7CiAJfQogCS8qIEVmZmVjdGl2ZWx5IHNlbGVjdCB0aGUgcmluZyBidWZmZXIgaW1wbGVtZW50YXRpb24gKi8KLQlpbmRpb19kZXYtPnJpbmctPmFjY2VzcyA9ICZyaW5nX3N3X2FjY2Vzc19mdW5jczsKKwlpbmRpb19kZXYtPmJ1ZmZlci0+YWNjZXNzID0gJnJpbmdfc3dfYWNjZXNzX2Z1bmNzOwogCS8qIFJpbmcgYnVmZmVyIGZ1bmN0aW9ucyAtIGhlcmUgdHJpZ2dlciBzZXR1cCByZWxhdGVkICovCi0JaW5kaW9fZGV2LT5yaW5nLT5zZXR1cF9vcHMgPSAmbWF4MTM2M19yaW5nX3NldHVwX29wczsKKwlpbmRpb19kZXYtPmJ1ZmZlci0+c2V0dXBfb3BzID0gJm1heDEzNjNfcmluZ19zZXR1cF9vcHM7CiAKIAkvKiBGbGFnIHRoYXQgcG9sbGVkIHJpbmcgYnVmZmVyaW5nIGlzIHBvc3NpYmxlICovCi0JaW5kaW9fZGV2LT5tb2RlcyB8PSBJTkRJT19SSU5HX1RSSUdHRVJFRDsKKwlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX0JVRkZFUl9UUklHR0VSRUQ7CiAKIAlyZXR1cm4gMDsKIAogZXJyb3JfZGVhbGxvY2F0ZV9zd19yYjoKLQlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPnJpbmcpOworCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+YnVmZmVyKTsKIGVycm9yX3JldDoKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTk5LDExICsxOTUsNiBAQAogdm9pZCBtYXgxMzYzX3JpbmdfY2xlYW51cChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCS8qIGVuc3VyZSB0aGF0IHRoZSB0cmlnZ2VyIGhhcyBiZWVuIGRldGFjaGVkICovCi0JaWYgKGluZGlvX2Rldi0+dHJpZykgewotCQlpaW9fcHV0X3RyaWdnZXIoaW5kaW9fZGV2LT50cmlnKTsKLQkJaWlvX3RyaWdnZXJfZGV0dGFjaF9wb2xsX2Z1bmMoaW5kaW9fZGV2LT50cmlnLAotCQkJCQkgICAgICBpbmRpb19kZXYtPnBvbGxmdW5jKTsKLQl9CiAJaWlvX2RlYWxsb2NfcG9sbGZ1bmMoaW5kaW9fZGV2LT5wb2xsZnVuYyk7Ci0JaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPmJ1ZmZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL0tjb25maWcKaW5kZXggOTg0N2JhZi4uNjk4YTg5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvS2NvbmZpZwpAQCAtMSwxMCArMSwxMSBAQAogIwogIyBBRERBQyBkcml2ZXJzCiAjCi1jb21tZW50ICJBbmFsb2cgZGlnaXRhbCBiaS1kaXJlY3Rpb24gY29udmVydG9ycyIKK21lbnUgIkFuYWxvZyBkaWdpdGFsIGJpLWRpcmVjdGlvbiBjb252ZXJ0ZXJzIgogCiBjb25maWcgQURUNzMxNgogCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRFQ3MzE2LzcvOCBBRFQ3NTE2LzcvOSB0ZW1wZXJhdHVyZSBzZW5zb3IsIEFEQyBhbmQgREFDIGRyaXZlciIKKwlkZXBlbmRzIG9uIEdFTkVSSUNfR1BJTwogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRFQ3MzE2LCBBRFQ3MzE3LCBBRFQ3MzE4CiAJICBhbmQgQURUNzUxNiwgQURUNzUxNywgQURUNzUxOSB0ZW1wZXJhdHVyZSBzZW5zb3JzLCBBREMgYW5kIERBQy4KQEAgLTIzLDMgKzI0LDUgQEAKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgSTJDIGJ1cyBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRFQ3MzE2LzcvOAogCSAgYW5kIEFEVDc1MTYvNy85LgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL2FkdDczMTYtaTJjLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL2FkdDczMTYtaTJjLmMKaW5kZXggMWM4NmNmMS4uMDdkNzE4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGRhYy9hZHQ3MzE2LWkyYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi1pMmMuYwpAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiYWR0NzMxNi5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkZGFjL2FkdDczMTYuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi5jCmluZGV4IDYzNzMxNmYuLjhkZjI0NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRkYWMvYWR0NzMxNi5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vc3lzZnMuaCIKQEAgLTIwMyw3ICsyMDQsNyBAQAogI2RlZmluZSBBRFQ3MzE2X1RFTVBfSU5UX01BU0sJCTB4MUYKICNkZWZpbmUgQURUNzUxNl9BSU5fSU5UX01BU0sJCTB4RTAKICNkZWZpbmUgQURUNzMxNl9URU1QX0FJTl9JTlRfTUFTSwlcCi0JKEFEVDczMTZfVEVNUF9JTlRfTUFTSyB8IEFEVDczMTZfVEVNUF9JTlRfTUFTSykKKwkoQURUNzMxNl9URU1QX0lOVF9NQVNLKQogCiAvKgogICogc3RydWN0IGFkdDczMTZfY2hpcF9pbmZvIC0gY2hpcCBzcGVjaWZjIGluZm9ybWF0aW9uCkBAIC0xNzc2LDQ0ICsxNzc3LDQ0IEBACiAKIAkJdGltZSA9IGlpb19nZXRfdGltZV9ucygpOwogCQlpZiAoc3RhdDEgJiAoMSA8PCAwKSkKLQkJCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwgMCwKKwkJCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwKIAkJCQkgICAgICAgSUlPX1VOTU9EX0VWRU5UX0NPREUoSUlPX1RFTVAsIDAsCiAJCQkJCQkJICAgIElJT19FVl9UWVBFX1RIUkVTSCwKIAkJCQkJCQkgICAgSUlPX0VWX0RJUl9SSVNJTkcpLAogCQkJCSAgICAgICB0aW1lKTsKIAkJaWYgKHN0YXQxICYgKDEgPDwgMSkpCi0JCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsIDAsCisJCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsCiAJCQkJICAgICAgIElJT19VTk1PRF9FVkVOVF9DT0RFKElJT19URU1QLCAwLAogCQkJCQkJCSAgICBJSU9fRVZfVFlQRV9USFJFU0gsCiAJCQkJCQkJICAgIElJT19FVl9ESVJfRkFMTElORyksCiAJCQkJICAgICAgIHRpbWUpOwogCQlpZiAoc3RhdDEgJiAoMSA8PCAyKSkKLQkJCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwgMCwKKwkJCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwKIAkJCQkgICAgICAgSUlPX1VOTU9EX0VWRU5UX0NPREUoSUlPX1RFTVAsIDEsCiAJCQkJCQkJICAgIElJT19FVl9UWVBFX1RIUkVTSCwKIAkJCQkJCQkgICAgSUlPX0VWX0RJUl9SSVNJTkcpLAogCQkJCSAgICAgICB0aW1lKTsKIAkJaWYgKHN0YXQxICYgKDEgPDwgMykpCi0JCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsIDAsCisJCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsCiAJCQkJICAgICAgIElJT19VTk1PRF9FVkVOVF9DT0RFKElJT19URU1QLCAxLAogCQkJCQkJCSAgICBJSU9fRVZfVFlQRV9USFJFU0gsCiAJCQkJCQkJICAgIElJT19FVl9ESVJfRkFMTElORyksCiAJCQkJICAgICAgIHRpbWUpOwogCQlpZiAoc3RhdDEgJiAoMSA8PCA1KSkKLQkJCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwgMCwKLQkJCQkgICAgICAgSUlPX1VOTU9EX0VWRU5UX0NPREUoSUlPX0lOLCAxLAorCQkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LAorCQkJCSAgICAgICBJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fVk9MVEFHRSwgMSwKIAkJCQkJCQkgICAgSUlPX0VWX1RZUEVfVEhSRVNILAogCQkJCQkJCSAgICBJSU9fRVZfRElSX0VJVEhFUiksCiAJCQkJICAgICAgIHRpbWUpOwogCQlpZiAoc3RhdDEgJiAoMSA8PCA2KSkKLQkJCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwgMCwKLQkJCQkgICAgICAgSUlPX1VOTU9EX0VWRU5UX0NPREUoSUlPX0lOLCAyLAorCQkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LAorCQkJCSAgICAgICBJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fVk9MVEFHRSwgMiwKIAkJCQkJCQkgICAgSUlPX0VWX1RZUEVfVEhSRVNILAogCQkJCQkJCSAgICBJSU9fRVZfRElSX0VJVEhFUiksCiAJCQkJICAgICAgIHRpbWUpOwogCQlpZiAoc3RhdDEgJiAoMSA8PCA3KSkKLQkJCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwgMCwKLQkJCQkgICAgICAgSUlPX1VOTU9EX0VWRU5UX0NPREUoSUlPX0lOLCAzLAorCQkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LAorCQkJCSAgICAgICBJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fVk9MVEFHRSwgMywKIAkJCQkJCQkgICAgSUlPX0VWX1RZUEVfVEhSRVNILAogCQkJCQkJCSAgICBJSU9fRVZfRElSX0VJVEhFUiksCiAJCQkJICAgICAgIHRpbWUpOwpAQCAtMTgyMSw4ICsxODIyLDggQEAKIAlyZXQgPSBjaGlwLT5idXMucmVhZChjaGlwLT5idXMuY2xpZW50LCBBRFQ3MzE2X0lOVF9TVEFUMiwgJnN0YXQyKTsKIAlpZiAoIXJldCkgewogCQlpZiAoc3RhdDIgJiBBRFQ3MzE2X0lOVF9NQVNLMl9WREQpCi0JCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsIDAsCi0JCQkJICAgICAgIElJT19VTk1PRF9FVkVOVF9DT0RFKElJT19JTiwKKwkJCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwKKwkJCQkgICAgICAgSUlPX1VOTU9EX0VWRU5UX0NPREUoSUlPX1ZPTFRBR0UsCiAJCQkJCQkJICAgIDAsCiAJCQkJCQkJICAgIElJT19FVl9UWVBFX1RIUkVTSCwKIAkJCQkJCQkgICAgSUlPX0VWX0RJUl9SSVNJTkcpLApAQCAtMjA2Myw2ICsyMDY0LDcgQEAKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWR0NzMxNl9ldmVudF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CiAJLmF0dHJzID0gYWR0NzMxNl9ldmVudF9hdHRyaWJ1dGVzLAorCS5uYW1lID0gImV2ZW50cyIsCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWR0NzUxNl9ldmVudF9hdHRyaWJ1dGVzW10gPSB7CkBAIC0yMDgzLDYgKzIwODUsNyBAQAogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZHQ3NTE2X2V2ZW50X2F0dHJpYnV0ZV9ncm91cCA9IHsKIAkuYXR0cnMgPSBhZHQ3NTE2X2V2ZW50X2F0dHJpYnV0ZXMsCisJLm5hbWUgPSAiZXZlbnRzIiwKIH07CiAKICNpZmRlZiBDT05GSUdfUE0KQEAgLTIxMDcsMTQgKzIxMTAsMTIgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBhZHQ3MzE2X2luZm8gPSB7CiAJLmF0dHJzID0gJmFkdDczMTZfYXR0cmlidXRlX2dyb3VwLAotCS5udW1faW50ZXJydXB0X2xpbmVzID0gMSwKIAkuZXZlbnRfYXR0cnMgPSAmYWR0NzMxNl9ldmVudF9hdHRyaWJ1dGVfZ3JvdXAsCiAJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gYWR0NzUxNl9pbmZvID0gewogCS5hdHRycyA9ICZhZHQ3NTE2X2F0dHJpYnV0ZV9ncm91cCwKLQkubnVtX2ludGVycnVwdF9saW5lcyA9IDEsCiAJLmV2ZW50X2F0dHJzID0gJmFkdDc1MTZfZXZlbnRfYXR0cmlidXRlX2dyb3VwLAogCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCiB9OwpAQCAtMjE2NiwxMCArMjE2Nyw2IEBACiAJaW5kaW9fZGV2LT5uYW1lID0gbmFtZTsKIAlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CiAKLQlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcl9mcmVlX2RldjsKLQogCWlmIChjaGlwLT5idXMuaXJxID4gMCkgewogCQlpZiAoYWR0NzMxNl9wbGF0Zm9ybV9kYXRhWzBdKQogCQkJY2hpcC0+YnVzLmlycV9mbGFncyA9IGFkdDczMTZfcGxhdGZvcm1fZGF0YVswXTsKQEAgLTIxODEsNyArMjE3OCw3IEBACiAJCQkJCSAgIGluZGlvX2Rldi0+bmFtZSwKIAkJCQkJICAgaW5kaW9fZGV2KTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gZXJyb3JfdW5yZWdfZGV2OworCQkJZ290byBlcnJvcl9mcmVlX2RldjsKIAogCQlpZiAoY2hpcC0+YnVzLmlycV9mbGFncyAmIElSUUZfVFJJR0dFUl9ISUdIKQogCQkJY2hpcC0+Y29uZmlnMSB8PSBBRFQ3MzE2X0lOVF9QT0xBUklUWTsKQEAgLTIxOTksNiArMjE5NiwxMCBAQAogCQlnb3RvIGVycm9yX3VucmVnX2lycTsKIAl9CiAKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl91bnJlZ19pcnE7CisKIAlkZXZfaW5mbyhkZXYsICIlcyB0ZW1wZXJhdHVyZSBzZW5zb3IsIEFEQyBhbmQgREFDIHJlZ2lzdGVyZWQuXG4iLAogCQkJaW5kaW9fZGV2LT5uYW1lKTsKIApAQCAtMjIwNiw4ICsyMjA3LDYgQEAKIAogZXJyb3JfdW5yZWdfaXJxOgogCWZyZWVfaXJxKGNoaXAtPmJ1cy5pcnEsIGluZGlvX2Rldik7Ci1lcnJvcl91bnJlZ19kZXY6Ci0JaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CiBlcnJvcl9mcmVlX2RldjoKIAlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIGVycm9yX3JldDoKQEAgLTIyMjAsMTAgKzIyMTksOSBAQAogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgYWR0NzMxNl9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCi0JZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CiAJaWYgKGNoaXAtPmJ1cy5pcnEpCiAJCWZyZWVfaXJxKGNoaXAtPmJ1cy5pcnEsIGluZGlvX2Rldik7Ci0JaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CiAJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYnVmZmVyX2dlbmVyaWMuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYnVmZmVyX2dlbmVyaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZThmMDEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9idWZmZXJfZ2VuZXJpYy5oCkBAIC0wLDAgKzEsMjI4IEBACisvKiBUaGUgaW5kdXN0cmlhbCBJL08gY29yZSAtIGdlbmVyaWMgYnVmZmVyIGludGVyZmFjZXMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IEpvbmF0aGFuIENhbWVyb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX0lJT19CVUZGRVJfR0VORVJJQ19IXworI2RlZmluZSBfSUlPX0JVRkZFUl9HRU5FUklDX0hfCisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlICJpaW8uaCIKKyNpbmNsdWRlICJjaHJkZXYuaCIKKworI2lmZGVmIENPTkZJR19JSU9fQlVGRkVSCisKK3N0cnVjdCBpaW9fYnVmZmVyOworCisvKioKKyAqIHN0cnVjdCBpaW9fYnVmZmVyX2FjY2Vzc19mdW5jcyAtIGFjY2VzcyBmdW5jdGlvbnMgZm9yIGJ1ZmZlcnMuCisgKiBAbWFya19pbl91c2U6CXJlZmVyZW5jZSBjb3VudGluZywgdHlwaWNhbGx5IHRvIHByZXZlbnQgbW9kdWxlIHJlbW92YWwKKyAqIEB1bm1hcmtfaW5fdXNlOglyZWR1Y2UgcmVmZXJlbmNlIGNvdW50IHdoZW4gbm8gbG9uZ2VyIHVzaW5nIGJ1ZmZlcgorICogQHN0b3JlX3RvOgkJYWN0dWFsbHkgc3RvcmUgc3R1ZmYgdG8gdGhlIGJ1ZmZlcgorICogQHJlYWRfbGFzdDoJCWdldCB0aGUgbGFzdCBlbGVtZW50IHN0b3JlZAorICogQHJlYWRfZmlyc3RfbjoJdHJ5IHRvIGdldCBhIHNwZWNpZmllZCBudW1iZXIgb2YgZWxlbWVudHMgKG11c3QgZXhpc3QpCisgKiBAbWFya19wYXJhbV9jaGFuZ2U6CW5vdGlmeSBidWZmZXIgdGhhdCBzb21lIHJlbGV2YW50IHBhcmFtZXRlciBoYXMgY2hhbmdlZAorICoJCQlPZnRlbiB0aGlzIG1lYW5zIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UgbWF5IG5lZWQgdG8KKyAqCQkJY2hhbmdlLgorICogQHJlcXVlc3RfdXBkYXRlOglpZiBhIHBhcmFtZXRlciBjaGFuZ2UgaGFzIGJlZW4gbWFya2VkLCB1cGRhdGUgdW5kZXJseWluZworICoJCQlzdG9yYWdlLgorICogQGdldF9ieXRlc19wZXJfZGF0dW06Z2V0IGN1cnJlbnQgYnl0ZXMgcGVyIGRhdHVtCisgKiBAc2V0X2J5dGVzX3Blcl9kYXR1bTpzZXQgbnVtYmVyIG9mIGJ5dGVzIHBlciBkYXR1bQorICogQGdldF9sZW5ndGg6CQlnZXQgbnVtYmVyIG9mIGRhdHVtcyBpbiBidWZmZXIKKyAqIEBzZXRfbGVuZ3RoOgkJc2V0IG51bWJlciBvZiBkYXR1bXMgaW4gYnVmZmVyCisgKiBAaXNfZW5hYmxlZDoJCXF1ZXJ5IGlmIGJ1ZmZlciBpcyBjdXJyZW50bHkgYmVpbmcgdXNlZAorICogQGVuYWJsZToJCWVuYWJsZSB0aGUgYnVmZmVyCisgKgorICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBzdHJ1Y3R1cmUgaXMgdG8gbWFrZSB0aGUgYnVmZmVyIGVsZW1lbnQKKyAqIG1vZHVsYXIgYXMgZXZlbnQgZm9yIGEgZ2l2ZW4gZHJpdmVyLCBkaWZmZXJlbnQgdXNlY2FzZXMgbWF5IHJlcXVpcmUKKyAqIGRpZmZlcmVudCBidWZmZXIgZGVzaWducyAoc3BhY2UgZWZmaWNpZW5jeSB2cyBzcGVlZCBmb3IgZXhhbXBsZSkuCisgKgorICogSXQgaXMgd29ydGggbm90aW5nIHRoYXQgYSBnaXZlbiBidWZmZXIgaW1wbGVtZW50YXRpb24gbWF5IG9ubHkgc3VwcG9ydCBhCisgKiBzbWFsbCBwcm9wb3J0aW9uIG9mIHRoZXNlIGZ1bmN0aW9ucy4gIFRoZSBjb3JlIGNvZGUgJ3Nob3VsZCcgY29wZSBmaW5lIHdpdGgKKyAqIGFueSBvZiB0aGVtIG5vdCBleGlzdGluZy4KKyAqKi8KK3N0cnVjdCBpaW9fYnVmZmVyX2FjY2Vzc19mdW5jcyB7CisJdm9pZCAoKm1hcmtfaW5fdXNlKShzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyKTsKKwl2b2lkICgqdW5tYXJrX2luX3VzZSkoc3RydWN0IGlpb19idWZmZXIgKmJ1ZmZlcik7CisKKwlpbnQgKCpzdG9yZV90bykoc3RydWN0IGlpb19idWZmZXIgKmJ1ZmZlciwgdTggKmRhdGEsIHM2NCB0aW1lc3RhbXApOworCWludCAoKnJlYWRfbGFzdCkoc3RydWN0IGlpb19idWZmZXIgKmJ1ZmZlciwgdTggKmRhdGEpOworCWludCAoKnJlYWRfZmlyc3Rfbikoc3RydWN0IGlpb19idWZmZXIgKmJ1ZmZlciwKKwkJCSAgICBzaXplX3QgbiwKKwkJCSAgICBjaGFyIF9fdXNlciAqYnVmKTsKKworCWludCAoKm1hcmtfcGFyYW1fY2hhbmdlKShzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyKTsKKwlpbnQgKCpyZXF1ZXN0X3VwZGF0ZSkoc3RydWN0IGlpb19idWZmZXIgKmJ1ZmZlcik7CisKKwlpbnQgKCpnZXRfYnl0ZXNfcGVyX2RhdHVtKShzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyKTsKKwlpbnQgKCpzZXRfYnl0ZXNfcGVyX2RhdHVtKShzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyLCBzaXplX3QgYnBkKTsKKwlpbnQgKCpnZXRfbGVuZ3RoKShzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyKTsKKwlpbnQgKCpzZXRfbGVuZ3RoKShzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyLCBpbnQgbGVuZ3RoKTsKKworCWludCAoKmlzX2VuYWJsZWQpKHN0cnVjdCBpaW9fYnVmZmVyICpidWZmZXIpOworCWludCAoKmVuYWJsZSkoc3RydWN0IGlpb19idWZmZXIgKmJ1ZmZlcik7Cit9OworCisvKioKKyAqIHN0cnVjdCBpaW9fYnVmZmVyX3NldHVwX29wcyAtIGJ1ZmZlciBzZXR1cCByZWxhdGVkIGNhbGxiYWNrcworICogQHByZWVuYWJsZToJCVtEUklWRVJdIGZ1bmN0aW9uIHRvIHJ1biBwcmlvciB0byBtYXJraW5nIGJ1ZmZlciBlbmFibGVkCisgKiBAcG9zdGVuYWJsZToJCVtEUklWRVJdIGZ1bmN0aW9uIHRvIHJ1biBhZnRlciBtYXJraW5nIGJ1ZmZlciBlbmFibGVkCisgKiBAcHJlZGlzYWJsZToJCVtEUklWRVJdIGZ1bmN0aW9uIHRvIHJ1biBwcmlvciB0byBtYXJraW5nIGJ1ZmZlcgorICoJCQlkaXNhYmxlZAorICogQHBvc3RkaXNhYmxlOglbRFJJVkVSXSBmdW5jdGlvbiB0byBydW4gYWZ0ZXIgbWFya2luZyBidWZmZXIgZGlzYWJsZWQKKyAqLworc3RydWN0IGlpb19idWZmZXJfc2V0dXBfb3BzIHsKKwlpbnQJCQkJKCpwcmVlbmFibGUpKHN0cnVjdCBpaW9fZGV2ICopOworCWludAkJCQkoKnBvc3RlbmFibGUpKHN0cnVjdCBpaW9fZGV2ICopOworCWludAkJCQkoKnByZWRpc2FibGUpKHN0cnVjdCBpaW9fZGV2ICopOworCWludAkJCQkoKnBvc3RkaXNhYmxlKShzdHJ1Y3QgaWlvX2RldiAqKTsKK307CisKKy8qKgorICogc3RydWN0IGlpb19idWZmZXIgLSBnZW5lcmFsIGJ1ZmZlciBzdHJ1Y3R1cmUKKyAqIEBpbmRpb19kZXY6CQlpbmR1c3RyaWFsIEkvTyBkZXZpY2Ugc3RydWN0dXJlCisgKiBAb3duZXI6CQltb2R1bGUgdGhhdCBvd25zIHRoZSBidWZmZXIgKGZvciByZWYgY291bnRpbmcpCisgKiBAbGVuZ3RoOgkJW0RFVklDRV0gbnVtYmVyIG9mIGRhdHVtcyBpbiBidWZmZXIKKyAqIEBieXRlc19wZXJfZGF0dW06CVtERVZJQ0VdIHNpemUgb2YgaW5kaXZpZHVhbCBkYXR1bSBpbmNsdWRpbmcgdGltZXN0YW1wCisgKiBAYnBlOgkJW0RFVklDRV0gc2l6ZSBvZiBpbmRpdmlkdWFsIGNoYW5uZWwgdmFsdWUKKyAqIEBzY2FuX2VsX2F0dHJzOglbRFJJVkVSXSBjb250cm9sIG9mIHNjYW4gZWxlbWVudHMgaWYgdGhhdCBzY2FuIG1vZGUKKyAqCQkJY29udHJvbCBtZXRob2QgaXMgdXNlZAorICogQHNjYW5fY291bnQ6CVtJTlRFUk5dIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGN1cnJlbnQgc2NhbiBtb2RlCisgKiBAc2Nhbl9tYXNrOgkJW0lOVEVSTl0gYml0bWFzayB1c2VkIGluIG1hc2tpbmcgc2NhbiBtb2RlIGVsZW1lbnRzCisgKiBAc2Nhbl90aW1lc3RhbXA6CVtJTlRFUk5dIGRvZXMgdGhlIHNjYW4gbW9kZSBpbmNsdWRlIGEgdGltZXN0YW1wCisgKiBAYWNjZXNzOgkJW0RSSVZFUl0gYnVmZmVyIGFjY2VzcyBmdW5jdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZQorICoJCQlpbXBsZW1lbnRhdGlvbi4KKyAqIEBmbGFnczoJCVtJTlRFUk5dIGZpbGUgb3BzIHJlbGF0ZWQgZmxhZ3MgaW5jbHVkaW5nIGJ1c3kgZmxhZy4KKyAqKi8KK3N0cnVjdCBpaW9fYnVmZmVyIHsKKwlzdHJ1Y3QgaWlvX2RldgkJCQkqaW5kaW9fZGV2OworCXN0cnVjdCBtb2R1bGUJCQkJKm93bmVyOworCWludAkJCQkJbGVuZ3RoOworCWludAkJCQkJYnl0ZXNfcGVyX2RhdHVtOworCWludAkJCQkJYnBlOworCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAJCQkqc2Nhbl9lbF9hdHRyczsKKwlpbnQJCQkJCXNjYW5fY291bnQ7CisJbG9uZwkJCQkJKnNjYW5fbWFzazsKKwlib29sCQkJCQlzY2FuX3RpbWVzdGFtcDsKKwljb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9hY2Nlc3NfZnVuY3MJKmFjY2VzczsKKwljb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMJCSpzZXR1cF9vcHM7CisJc3RydWN0IGxpc3RfaGVhZAkJCXNjYW5fZWxfZGV2X2F0dHJfbGlzdDsKKwlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwCQkJc2Nhbl9lbF9ncm91cDsKKwl3YWl0X3F1ZXVlX2hlYWRfdAkJCXBvbGxxOworCWJvb2wJCQkJCXN0dWZmdG9yZWFkOworCXVuc2lnbmVkIGxvbmcJCQkJZmxhZ3M7CisJY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqYXR0cnM7Cit9OworCisvKioKKyAqIGlpb19idWZmZXJfaW5pdCgpIC0gSW5pdGlhbGl6ZSB0aGUgYnVmZmVyIHN0cnVjdHVyZQorICogQGJ1ZmZlcjogYnVmZmVyIHRvIGJlIGluaXRpYWxpemVkCisgKiBAaW5kaW9fZGV2OiB0aGUgaWlvIGRldmljZSB0aGUgYnVmZmVyIGlzIGFzc29jYXRlZCB3aXRoCisgKiovCit2b2lkIGlpb19idWZmZXJfaW5pdChzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyLAorCQkJICBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKKwordm9pZCBpaW9fYnVmZmVyX2RlaW5pdChzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyKTsKKworLyoqCisgKiBfX2lpb191cGRhdGVfYnVmZmVyKCkgLSB1cGRhdGUgY29tbW9uIGVsZW1lbnRzIG9mIGJ1ZmZlcnMKKyAqIEBidWZmZXI6CQlidWZmZXIgdGhhdCBpcyB0aGUgZXZlbnQgc291cmNlCisgKiBAYnl0ZXNfcGVyX2RhdHVtOglzaXplIG9mIGluZGl2aWR1YWwgZGF0dW0gaW5jbHVkaW5nIHRpbWVzdGFtcAorICogQGxlbmd0aDoJCW51bWJlciBvZiBkYXR1bXMgaW4gYnVmZmVyCisgKiovCitzdGF0aWMgaW5saW5lIHZvaWQgX19paW9fdXBkYXRlX2J1ZmZlcihzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyLAorCQkJCSAgICAgICBpbnQgYnl0ZXNfcGVyX2RhdHVtLCBpbnQgbGVuZ3RoKQoreworCWJ1ZmZlci0+Ynl0ZXNfcGVyX2RhdHVtID0gYnl0ZXNfcGVyX2RhdHVtOworCWJ1ZmZlci0+bGVuZ3RoID0gbGVuZ3RoOworfQorCitpbnQgaWlvX3NjYW5fbWFza19xdWVyeShzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyLCBpbnQgYml0KTsKKworLyoqCisgKiBpaW9fc2Nhbl9tYXNrX3NldCgpIC0gc2V0IHBhcnRpY3VsYXIgYml0IGluIHRoZSBzY2FuIG1hc2sKKyAqIEBidWZmZXI6IHRoZSBidWZmZXIgd2hvc2Ugc2NhbiBtYXNrIHdlIGFyZSBpbnRlcmVzdGVkIGluCisgKiBAYml0OiB0aGUgYml0IHRvIGJlIHNldC4KKyAqKi8KK2ludCBpaW9fc2Nhbl9tYXNrX3NldChzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyLCBpbnQgYml0KTsKKworI2RlZmluZSB0b19paW9fYnVmZmVyKGQpCQkJCVwKKwljb250YWluZXJfb2YoZCwgc3RydWN0IGlpb19idWZmZXIsIGRldikKKworLyoqCisgKiBpaW9fYnVmZmVyX3JlZ2lzdGVyKCkgLSByZWdpc3RlciB0aGUgYnVmZmVyIHdpdGggSUlPIGNvcmUKKyAqIEBpbmRpb19kZXY6IGRldmljZSB3aXRoIHRoZSBidWZmZXIgdG8gYmUgcmVnaXN0ZXJlZAorICoqLworaW50IGlpb19idWZmZXJfcmVnaXN0ZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCWNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjICpjaGFubmVscywKKwkJCWludCBudW1fY2hhbm5lbHMpOworCisvKioKKyAqIGlpb19idWZmZXJfdW5yZWdpc3RlcigpIC0gdW5yZWdpc3RlciB0aGUgYnVmZmVyIGZyb20gSUlPIGNvcmUKKyAqIEBpbmRpb19kZXY6IHRoZSBkZXZpY2Ugd2l0aCB0aGUgYnVmZmVyIHRvIGJlIHVucmVnaXN0ZXJlZAorICoqLwordm9pZCBpaW9fYnVmZmVyX3VucmVnaXN0ZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKKy8qKgorICogaWlvX2J1ZmZlcl9yZWFkX2xlbmd0aCgpIC0gYXR0ciBmdW5jIHRvIGdldCBudW1iZXIgb2YgZGF0dW1zIGluIHRoZSBidWZmZXIKKyAqKi8KK3NzaXplX3QgaWlvX2J1ZmZlcl9yZWFkX2xlbmd0aChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICAgY2hhciAqYnVmKTsKKy8qKgorICogaWlvX2J1ZmZlcl93cml0ZV9sZW5ndGgoKSAtIGF0dHIgZnVuYyB0byBzZXQgbnVtYmVyIG9mIGRhdHVtcyBpbiB0aGUgYnVmZmVyCisgKiovCitzc2l6ZV90IGlpb19idWZmZXJfd3JpdGVfbGVuZ3RoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY29uc3QgY2hhciAqYnVmLAorCQkJICAgICAgc2l6ZV90IGxlbik7CisvKioKKyAqIGlpb19idWZmZXJfcmVhZF9ieXRlc19wZXJfZGF0dW0oKSAtIGF0dHIgZm9yIG51bWJlciBvZiBieXRlcyBpbiB3aG9sZSBkYXR1bQorICoqLworc3NpemVfdCBpaW9fYnVmZmVyX3JlYWRfYnl0ZXNfcGVyX2RhdHVtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNoYXIgKmJ1Zik7CisvKioKKyAqIGlpb19idWZmZXJfc3RvcmVfZW5hYmxlKCkgLSBhdHRyIHRvIHR1cm4gdGhlIGJ1ZmZlciBvbgorICoqLworc3NpemVfdCBpaW9fYnVmZmVyX3N0b3JlX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLAorCQkJCXNpemVfdCBsZW4pOworLyoqCisgKiBpaW9fYnVmZmVyX3Nob3dfZW5hYmxlKCkgLSBhdHRyIHRvIHNlZSBpZiB0aGUgYnVmZmVyIGlzIG9uCisgKiovCitzc2l6ZV90IGlpb19idWZmZXJfc2hvd19lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgIGNoYXIgKmJ1Zik7CisjZGVmaW5lIElJT19CVUZGRVJfTEVOR1RIX0FUVFIgREVWSUNFX0FUVFIobGVuZ3RoLCBTX0lSVUdPIHwgU19JV1VTUiwJXAorCQkJCQkgICBpaW9fYnVmZmVyX3JlYWRfbGVuZ3RoLAlcCisJCQkJCSAgIGlpb19idWZmZXJfd3JpdGVfbGVuZ3RoKQorI2RlZmluZSBJSU9fQlVGRkVSX0JZVEVTX1BFUl9EQVRVTV9BVFRSCQkJCQlcCisJREVWSUNFX0FUVFIoYnl0ZXNfcGVyX2RhdHVtLCBTX0lSVUdPIHwgU19JV1VTUiwJCQlcCisJCSAgICBpaW9fYnVmZmVyX3JlYWRfYnl0ZXNfcGVyX2RhdHVtLCBOVUxMKQorCisjZGVmaW5lIElJT19CVUZGRVJfRU5BQkxFX0FUVFIgREVWSUNFX0FUVFIoZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwJXAorCQkJCQkgICBpaW9fYnVmZmVyX3Nob3dfZW5hYmxlLAlcCisJCQkJCSAgIGlpb19idWZmZXJfc3RvcmVfZW5hYmxlKQorCitpbnQgaWlvX3N3X2J1ZmZlcl9wcmVlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKKyNlbHNlIC8qIENPTkZJR19JSU9fQlVGRkVSICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGlpb19idWZmZXJfcmVnaXN0ZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkJICAgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW5uZWxzLAorCQkJCQkgICBpbnQgbnVtX2NoYW5uZWxzKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaWlvX2J1ZmZlcl91bnJlZ2lzdGVyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7fTsKKworI2VuZGlmIC8qIENPTkZJR19JSU9fQlVGRkVSICovCisKKyNlbmRpZiAvKiBfSUlPX0JVRkZFUl9HRU5FUklDX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2NkYy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2lpby9jZGMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDIxMWRmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9jZGMvS2NvbmZpZwpAQCAtMCwwICsxLDM2IEBACisjCisjIENEQyBkcml2ZXJzCisjCittZW51ICJDYXBhY2l0YW5jZSB0byBkaWdpdGFsIGNvbnZlcnRlcnMiCisKK2NvbmZpZyBBRDcxNTAKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgYWQ3MTUwLzEvNiBjYXBhY2l0aXZlIHNlbnNvciBkcml2ZXIiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgY2FwYWNpdGl2ZSBzZW5zb3JzLgorCSAgKGFkNzE1MCwgYWQ3MTUxLCBhZDcxNTYpIFByb3ZpZGVzIGRpcmVjdCBhY2Nlc3MgdmlhIHN5c2ZzLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhZDcxNTAuCisKK2NvbmZpZyBBRDcxNTIKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgYWQ3MTUyLzMgY2FwYWNpdGl2ZSBzZW5zb3IgZHJpdmVyIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIGNhcGFjaXRpdmUgc2Vuc29ycy4KKwkgIChhZDcxNTIsIGFkNzE1MykgUHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB2aWEgc3lzZnMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFkNzE1Mi4KKworY29uZmlnIEFENzc0NgorCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRDc3NDUsIEFENzc0NiBBRDc3NDcgY2FwYWNpdGl2ZSBzZW5zb3IgZHJpdmVyIgorCWRlcGVuZHMgb24gSTJDCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIGNhcGFjaXRpdmUgc2Vuc29ycy4KKwkgIChBRDc3NDUsIEFENzc0NiwgQUQ3NzQ3KSBQcm92aWRlcyBkaXJlY3QgYWNjZXNzIHZpYSBzeXNmcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWQ3NzQ2LgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2NkYy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9paW8vY2RjL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZmJhYmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2NkYy9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIGluZHVzdHJpYWwgSS9PIERBQyBkcml2ZXJzCisjCisKK29iai0kKENPTkZJR19BRDcxNTApICs9IGFkNzE1MC5vCitvYmotJChDT05GSUdfQUQ3MTUyKSArPSBhZDcxNTIubworb2JqLSQoQ09ORklHX0FENzc0NikgKz0gYWQ3NzQ2Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vY2RjL2FkNzE1MC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9jZGMvYWQ3MTUwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc2MWNhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vY2RjL2FkNzE1MC5jCkBAIC0wLDAgKzEsNjc2IEBACisvKgorICogQUQ3MTUwIGNhcGFjaXRpdmUgc2Vuc29yIGRyaXZlciBzdXBwb3J0aW5nIEFENzE1MC8xLzYKKyAqCisgKiBDb3B5cmlnaHQgMjAxMC0yMDExIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIgb3IgbGF0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisKKy8qCisgKiBBRDcxNTAgcmVnaXN0ZXJzIGRlZmluaXRpb24KKyAqLworCisjZGVmaW5lIEFENzE1MF9TVEFUVVMgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQUQ3MTUwX1NUQVRVU19PVVQxICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgQUQ3MTUwX1NUQVRVU19PVVQyICAgICAgICAgKDEgPDwgNSkKKyNkZWZpbmUgQUQ3MTUwX0NIMV9EQVRBX0hJR0ggICAgICAgMQorI2RlZmluZSBBRDcxNTBfQ0gyX0RBVEFfSElHSCAgICAgICAzCisjZGVmaW5lIEFENzE1MF9DSDFfQVZHX0hJR0ggICAgICAgIDUKKyNkZWZpbmUgQUQ3MTUwX0NIMl9BVkdfSElHSCAgICAgICAgNworI2RlZmluZSBBRDcxNTBfQ0gxX1NFTlNJVElWSVRZICAgICA5CisjZGVmaW5lIEFENzE1MF9DSDFfVEhSX0hPTERfSCAgICAgIDkKKyNkZWZpbmUgQUQ3MTUwX0NIMV9USU1FT1VUICAgICAgICAgMTAKKyNkZWZpbmUgQUQ3MTUwX0NIMV9TRVRVUCAgICAgICAgICAgMTEKKyNkZWZpbmUgQUQ3MTUwX0NIMl9TRU5TSVRJVklUWSAgICAgMTIKKyNkZWZpbmUgQUQ3MTUwX0NIMl9USFJfSE9MRF9IICAgICAgMTIKKyNkZWZpbmUgQUQ3MTUwX0NIMl9USU1FT1VUICAgICAgICAgMTMKKyNkZWZpbmUgQUQ3MTUwX0NIMl9TRVRVUCAgICAgICAgICAgMTQKKyNkZWZpbmUgQUQ3MTUwX0NGRyAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQUQ3MTUwX0NGR19GSVggICAgICAgICAgICAgKDEgPDwgNykKKyNkZWZpbmUgQUQ3MTUwX1BEX1RJTUVSICAgICAgICAgICAgMTYKKyNkZWZpbmUgQUQ3MTUwX0NIMV9DQVBEQUMgICAgICAgICAgMTcKKyNkZWZpbmUgQUQ3MTUwX0NIMl9DQVBEQUMgICAgICAgICAgMTgKKyNkZWZpbmUgQUQ3MTUwX1NOMyAgICAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgQUQ3MTUwX1NOMiAgICAgICAgICAgICAgICAgMjAKKyNkZWZpbmUgQUQ3MTUwX1NOMSAgICAgICAgICAgICAgICAgMjEKKyNkZWZpbmUgQUQ3MTUwX1NOMCAgICAgICAgICAgICAgICAgMjIKKyNkZWZpbmUgQUQ3MTUwX0lEICAgICAgICAgICAgICAgICAgMjMKKworLyoqCisgKiBzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAtIGluc3RhbmNlIHNwZWNpZmljIGNoaXAgZGF0YQorICogQGNsaWVudDogaTJjIGNsaWVudCBmb3IgdGhpcyBkZXZpY2UKKyAqIEBjdXJyZW50X2V2ZW50OiBkZXZpY2UgYWx3YXlzIGhhcyBvbmUgdHlwZSBvZiBldmVudCBlbmFibGVkLgorICoJVGhpcyBlbGVtZW50IHN0b3JlcyB0aGUgZXZlbnQgY29kZSBvZiB0aGUgY3VycmVudCBvbmUuCisgKiBAdGhyZXNob2xkOiB0aHJlc2hvbGRzIGZvciBzaW1wbGUgY2FwYWNpdGFuY2UgdmFsdWUgZXZlbnRzCisgKiBAdGhyZXNoX3NlbnNpdGl2aXR5OiB0aHJlc2hvbGQgZm9yIHNpbXBsZSBjYXBhY2l0YW5jZSBvZmZzZXQKKyAqCWZyb20gJ2F2ZXJhZ2UnIHZhbHVlLgorICogQG1hZ19zZW5zaXRpdHk6IHRocmVzaG9sZCBmb3IgbWFnbml0dWRlIG9mIGNhcGFjaXRhbmNlIG9mZnNldCBmcm9tCisgKglmcm9tICdhdmVyYWdlJyB2YWx1ZS4KKyAqIEB0aHJlc2hfdGltZW91dDogYSB0aW1lb3V0LCBpbiBzYW1wbGVzIGZyb20gdGhlIG1vbWVudCBhbgorICoJYWRhcHRpdmUgdGhyZXNob2xkIGV2ZW50IG9jY3VycyB0byB3aGVuIHRoZSBhdmVyYWdlCisgKgl2YWx1ZSBqdW1wcyB0byBjdXJyZW50IHZhbHVlLgorICogQG1hZ190aW1lb3V0OiBhIHRpbWVvdXQsIGluIHNhbXBsZSBmcm9tIHRoZSBtb21lbnQgYW4KKyAqCWFkYXB0aXZlIG1hZ25pdHVkZSBldmVudCBvY2N1cnMgdG8gd2hlbiB0aGUgYXZlcmFnZQorICoJdmFsdWUganVtcHMgdG8gdGhlIGN1cnJlbnQgdmFsdWUuCisgKiBAb2xkX3N0YXRlOiBzdG9yZSBzdGF0ZSBmcm9tIHByZXZpb3VzIGV2ZW50LCBhbGxvd2luZyBjb25maXJtYXRpb24KKyAqCW9mIG5ldyBjb25kaXRpb24uCisgKiBAY29udmVyc2lvbl9tb2RlOiB0aGUgY3VycmVudCBjb252ZXJzaW9uIG1vZGUuCisgKiBAc3RhdGVfbG9jazogZW5zdXJlIGNvbnNpc3RlbnQgc3RhdGUgb2YgdGhpcyBzdHJ1Y3R1cmUgd3J0IHRoZQorICoJaGFyZHdhcmUuCisgKi8KK3N0cnVjdCBhZDcxNTBfY2hpcF9pbmZvIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXU2NCBjdXJyZW50X2V2ZW50OworCXUxNiB0aHJlc2hvbGRbMl1bMl07CisJdTggdGhyZXNoX3NlbnNpdGl2aXR5WzJdWzJdOworCXU4IG1hZ19zZW5zaXRpdml0eVsyXVsyXTsKKwl1OCB0aHJlc2hfdGltZW91dFsyXVsyXTsKKwl1OCBtYWdfdGltZW91dFsyXVsyXTsKKwlpbnQgb2xkX3N0YXRlOworCWNoYXIgKmNvbnZlcnNpb25fbW9kZTsKKwlzdHJ1Y3QgbXV0ZXggc3RhdGVfbG9jazsKK307CisKKy8qCisgKiBzeXNmcyBub2RlcworICovCisKK3N0YXRpYyBjb25zdCB1OCBhZDcxNTBfYWRkcmVzc2VzW11bNl0gPSB7CisJeyBBRDcxNTBfQ0gxX0RBVEFfSElHSCwgQUQ3MTUwX0NIMV9BVkdfSElHSCwKKwkgIEFENzE1MF9DSDFfU0VUVVAsIEFENzE1MF9DSDFfVEhSX0hPTERfSCwKKwkgIEFENzE1MF9DSDFfU0VOU0lUSVZJVFksIEFENzE1MF9DSDFfVElNRU9VVCB9LAorCXsgQUQ3MTUwX0NIMl9EQVRBX0hJR0gsIEFENzE1MF9DSDJfQVZHX0hJR0gsCisJICBBRDcxNTBfQ0gyX1NFVFVQLCBBRDcxNTBfQ0gyX1RIUl9IT0xEX0gsCisJICBBRDcxNTBfQ0gyX1NFTlNJVElWSVRZLCBBRDcxNTBfQ0gyX1RJTUVPVVQgfSwKK307CisKK3N0YXRpYyBpbnQgYWQ3MTUwX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCSAgIGludCAqdmFsLAorCQkJICAgaW50ICp2YWwyLAorCQkJICAgbG9uZyBtYXNrKQoreworCWludCByZXQ7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSAwOgorCQlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2hpcC0+Y2xpZW50LAorCQkJCQlhZDcxNTBfYWRkcmVzc2VzW2NoYW4tPmNoYW5uZWxdWzBdKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkqdmFsID0gc3dhYjE2KHJldCk7CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwljYXNlICgxIDw8IElJT19DSEFOX0lORk9fQVZFUkFHRV9SQVdfU0VQQVJBVEUpOgorCQlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2hpcC0+Y2xpZW50LAorCQkJCQlhZDcxNTBfYWRkcmVzc2VzW2NoYW4tPmNoYW5uZWxdWzFdKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkqdmFsID0gc3dhYjE2KHJldCk7CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYWQ3MTUwX3JlYWRfZXZlbnRfY29uZmlnKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHU2NCBldmVudF9jb2RlKQoreworCWludCByZXQ7CisJdTggdGhyZXNodHlwZTsKKwlib29sIGFkYXB0aXZlOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmlzaW5nID0gISEoSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9ESVIoZXZlbnRfY29kZSkgPT0KKwkJCUlJT19FVl9ESVJfUklTSU5HKTsKKworCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjaGlwLT5jbGllbnQsIEFENzE1MF9DRkcpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJdGhyZXNodHlwZSA9IChyZXQgPj4gNSkgJiAweDAzOworCWFkYXB0aXZlID0gISEocmV0ICYgMHg4MCk7CisKKwlzd2l0Y2ggKElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfVFlQRShldmVudF9jb2RlKSkgeworCWNhc2UgSUlPX0VWX1RZUEVfTUFHX0FEQVBUSVZFOgorCQlpZiAocmlzaW5nKQorCQkJcmV0dXJuIGFkYXB0aXZlICYmICh0aHJlc2h0eXBlID09IDB4MSk7CisJCWVsc2UKKwkJCXJldHVybiBhZGFwdGl2ZSAmJiAodGhyZXNodHlwZSA9PSAweDApOworCWNhc2UgSUlPX0VWX1RZUEVfVEhSRVNIX0FEQVBUSVZFOgorCQlpZiAocmlzaW5nKQorCQkJcmV0dXJuIGFkYXB0aXZlICYmICh0aHJlc2h0eXBlID09IDB4Myk7CisJCWVsc2UKKwkJCXJldHVybiBhZGFwdGl2ZSAmJiAodGhyZXNodHlwZSA9PSAweDIpOworCisJY2FzZSBJSU9fRVZfVFlQRV9USFJFU0g6CisJCWlmIChyaXNpbmcpCisJCQlyZXR1cm4gIWFkYXB0aXZlICYmICh0aHJlc2h0eXBlID09IDB4MSk7CisJCWVsc2UKKwkJCXJldHVybiAhYWRhcHRpdmUgJiYgKHRocmVzaHR5cGUgPT0gMHgwKTsKKwl9OworCXJldHVybiAtRUlOVkFMOworfQorCisvKiBsb2NrIHNob3VsZCBiZSBoZWxkICovCitzdGF0aWMgaW50IGFkNzE1MF93cml0ZV9ldmVudF9wYXJhbXMoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgdTY0IGV2ZW50X2NvZGUpCit7CisJaW50IHJldDsKKwl1MTYgdmFsdWU7CisJdTggc2VucywgdGltZW91dDsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IGNoYW4gPSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX05VTShldmVudF9jb2RlKTsKKwlpbnQgcmlzaW5nID0gISEoSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9ESVIoZXZlbnRfY29kZSkgPT0KKwkJCUlJT19FVl9ESVJfUklTSU5HKTsKKworCWlmIChldmVudF9jb2RlICE9IGNoaXAtPmN1cnJlbnRfZXZlbnQpCisJCXJldHVybiAwOworCisJc3dpdGNoIChJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX1RZUEUoZXZlbnRfY29kZSkpIHsKKwkJLyogTm90ZSBjb21wbGV0ZWx5IGRpZmZlcmVudCBmcm9tIHRoZSBhZGFwdGl2ZSB2ZXJzaW9ucyAqLworCWNhc2UgSUlPX0VWX1RZUEVfVEhSRVNIOgorCQl2YWx1ZSA9IGNoaXAtPnRocmVzaG9sZFtyaXNpbmddW2NoYW5dOworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNoaXAtPmNsaWVudCwKKwkJCQkJCWFkNzE1MF9hZGRyZXNzZXNbY2hhbl1bM10sCisJCQkJCQlzd2FiMTYodmFsdWUpKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gMDsKKwljYXNlIElJT19FVl9UWVBFX01BR19BREFQVElWRToKKwkJc2VucyA9IGNoaXAtPm1hZ19zZW5zaXRpdml0eVtyaXNpbmddW2NoYW5dOworCQl0aW1lb3V0ID0gY2hpcC0+bWFnX3RpbWVvdXRbcmlzaW5nXVtjaGFuXTsKKwkJYnJlYWs7CisJY2FzZSBJSU9fRVZfVFlQRV9USFJFU0hfQURBUFRJVkU6CisJCXNlbnMgPSBjaGlwLT50aHJlc2hfc2Vuc2l0aXZpdHlbcmlzaW5nXVtjaGFuXTsKKwkJdGltZW91dCA9IGNoaXAtPnRocmVzaF90aW1lb3V0W3Jpc2luZ11bY2hhbl07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX07CisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjaGlwLT5jbGllbnQsCisJCQkJCWFkNzE1MF9hZGRyZXNzZXNbY2hhbl1bNF0sCisJCQkJCXNlbnMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjaGlwLT5jbGllbnQsCisJCQkJCWFkNzE1MF9hZGRyZXNzZXNbY2hhbl1bNV0sCisJCQkJCXRpbWVvdXQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWQ3MTUwX3dyaXRlX2V2ZW50X2NvbmZpZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJCSAgICAgdTY0IGV2ZW50X2NvZGUsIGludCBzdGF0ZSkKK3sKKwl1OCB0aHJlc2hfdHlwZSwgY2ZnLCBhZGFwdGl2ZTsKKwlpbnQgcmV0OworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmlzaW5nID0gISEoSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9ESVIoZXZlbnRfY29kZSkgPT0KKwkJCUlJT19FVl9ESVJfUklTSU5HKTsKKworCS8qIFNvbWV0aGluZyBtdXN0IGFsd2F5cyBiZSB0dXJuZWQgb24gKi8KKwlpZiAoc3RhdGUgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZXZlbnRfY29kZSA9PSBjaGlwLT5jdXJyZW50X2V2ZW50KQorCQlyZXR1cm4gMDsKKwltdXRleF9sb2NrKCZjaGlwLT5zdGF0ZV9sb2NrKTsKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2hpcC0+Y2xpZW50LCBBRDcxNTBfQ0ZHKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwljZmcgPSByZXQgJiB+KCgweDAzIDw8IDUpIHwgKDB4MSA8PCA3KSk7CisKKwlzd2l0Y2ggKElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfVFlQRShldmVudF9jb2RlKSkgeworCWNhc2UgSUlPX0VWX1RZUEVfTUFHX0FEQVBUSVZFOgorCQlhZGFwdGl2ZSA9IDE7CisJCWlmIChyaXNpbmcpCisJCQl0aHJlc2hfdHlwZSA9IDB4MTsKKwkJZWxzZQorCQkJdGhyZXNoX3R5cGUgPSAweDA7CisJCWJyZWFrOworCWNhc2UgSUlPX0VWX1RZUEVfVEhSRVNIX0FEQVBUSVZFOgorCQlhZGFwdGl2ZSA9IDE7CisJCWlmIChyaXNpbmcpCisJCQl0aHJlc2hfdHlwZSA9IDB4MzsKKwkJZWxzZQorCQkJdGhyZXNoX3R5cGUgPSAweDI7CisJCWJyZWFrOworCWNhc2UgSUlPX0VWX1RZUEVfVEhSRVNIOgorCQlhZGFwdGl2ZSA9IDA7CisJCWlmIChyaXNpbmcpCisJCQl0aHJlc2hfdHlwZSA9IDB4MTsKKwkJZWxzZQorCQkJdGhyZXNoX3R5cGUgPSAweDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3JfcmV0OworCX07CisKKwljZmcgfD0gKCFhZGFwdGl2ZSA8PCA3KSB8ICh0aHJlc2hfdHlwZSA8PCA1KTsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2hpcC0+Y2xpZW50LCBBRDcxNTBfQ0ZHLCBjZmcpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX3JldDsKKworCWNoaXAtPmN1cnJlbnRfZXZlbnQgPSBldmVudF9jb2RlOworCisJLyogdXBkYXRlIGNvbnRyb2wgYXR0cmlidXRlcyAqLworCXJldCA9IGFkNzE1MF93cml0ZV9ldmVudF9wYXJhbXMoaW5kaW9fZGV2LCBldmVudF9jb2RlKTsKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJmNoaXAtPnN0YXRlX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWQ3MTUwX3JlYWRfZXZlbnRfdmFsdWUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkgICB1NjQgZXZlbnRfY29kZSwKKwkJCQkgICBpbnQgKnZhbCkKK3sKKwlpbnQgY2hhbiA9IElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfTlVNKGV2ZW50X2NvZGUpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmlzaW5nID0gISEoSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9ESVIoZXZlbnRfY29kZSkgPT0KKwkJCUlJT19FVl9ESVJfUklTSU5HKTsKKworCS8qIENvbXBsZXggcmVnaXN0ZXIgc2hhcmluZyBnb2luZyBvbiBoZXJlICovCisJc3dpdGNoIChJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX1RZUEUoZXZlbnRfY29kZSkpIHsKKwljYXNlIElJT19FVl9UWVBFX01BR19BREFQVElWRToKKwkJKnZhbCA9IGNoaXAtPm1hZ19zZW5zaXRpdml0eVtyaXNpbmddW2NoYW5dOworCQlyZXR1cm4gMDsKKworCWNhc2UgSUlPX0VWX1RZUEVfVEhSRVNIX0FEQVBUSVZFOgorCQkqdmFsID0gY2hpcC0+dGhyZXNoX3NlbnNpdGl2aXR5W3Jpc2luZ11bY2hhbl07CisJCXJldHVybiAwOworCisJY2FzZSBJSU9fRVZfVFlQRV9USFJFU0g6CisJCSp2YWwgPSBjaGlwLT50aHJlc2hvbGRbcmlzaW5nXVtjaGFuXTsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9OworfQorCitzdGF0aWMgaW50IGFkNzE1MF93cml0ZV9ldmVudF92YWx1ZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJCSAgIHU2NCBldmVudF9jb2RlLAorCQkJCSAgIGludCB2YWwpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IGNoYW4gPSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX05VTShldmVudF9jb2RlKTsKKwlpbnQgcmlzaW5nID0gISEoSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9ESVIoZXZlbnRfY29kZSkgPT0KKwkJCUlJT19FVl9ESVJfUklTSU5HKTsKKworCW11dGV4X2xvY2soJmNoaXAtPnN0YXRlX2xvY2spOworCXN3aXRjaCAoSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9UWVBFKGV2ZW50X2NvZGUpKSB7CisJY2FzZSBJSU9fRVZfVFlQRV9NQUdfQURBUFRJVkU6CisJCWNoaXAtPm1hZ19zZW5zaXRpdml0eVtyaXNpbmddW2NoYW5dID0gdmFsOworCQlicmVhazsKKwljYXNlIElJT19FVl9UWVBFX1RIUkVTSF9BREFQVElWRToKKwkJY2hpcC0+dGhyZXNoX3NlbnNpdGl2aXR5W3Jpc2luZ11bY2hhbl0gPSB2YWw7CisJCWJyZWFrOworCWNhc2UgSUlPX0VWX1RZUEVfVEhSRVNIOgorCQljaGlwLT50aHJlc2hvbGRbcmlzaW5nXVtjaGFuXSA9IHZhbDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcl9yZXQ7CisJfTsKKworCS8qIHdyaXRlIGJhY2sgaWYgYWN0aXZlICovCisJcmV0ID0gYWQ3MTUwX3dyaXRlX2V2ZW50X3BhcmFtcyhpbmRpb19kZXYsIGV2ZW50X2NvZGUpOworCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5zdGF0ZV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhZDcxNTBfc2hvd190aW1lb3V0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJdTggdmFsdWU7CisKKwkvKiB1c2UgdGhlIGV2ZW50IGNvZGUgZm9yIGNvbnNpc3RlbmN5IHJlYXNvbnMgKi8KKwlpbnQgY2hhbiA9IElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfTlVNKHRoaXNfYXR0ci0+YWRkcmVzcyk7CisJaW50IHJpc2luZyA9ICEhKElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfRElSKHRoaXNfYXR0ci0+YWRkcmVzcykKKwkJCT09IElJT19FVl9ESVJfUklTSU5HKTsKKworCXN3aXRjaCAoSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9UWVBFKHRoaXNfYXR0ci0+YWRkcmVzcykpIHsKKwljYXNlIElJT19FVl9UWVBFX01BR19BREFQVElWRToKKwkJdmFsdWUgPSBjaGlwLT5tYWdfdGltZW91dFtyaXNpbmddW2NoYW5dOworCQlicmVhazsKKwljYXNlIElJT19FVl9UWVBFX1RIUkVTSF9BREFQVElWRToKKwkJdmFsdWUgPSBjaGlwLT50aHJlc2hfdGltZW91dFtyaXNpbmddW2NoYW5dOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbHVlKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3MTUwX3N0b3JlX3RpbWVvdXQoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUwX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCWludCBjaGFuID0gSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9OVU0odGhpc19hdHRyLT5hZGRyZXNzKTsKKwlpbnQgcmlzaW5nID0gISEoSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9ESVIodGhpc19hdHRyLT5hZGRyZXNzKSA9PQorCQkJSUlPX0VWX0RJUl9SSVNJTkcpOworCXU4IGRhdGE7CisJaW50IHJldDsKKworCXJldCA9IGtzdHJ0b3U4KGJ1ZiwgMTAsICZkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJmNoaXAtPnN0YXRlX2xvY2spOworCXN3aXRjaCAoSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9UWVBFKHRoaXNfYXR0ci0+YWRkcmVzcykpIHsKKwljYXNlIElJT19FVl9UWVBFX01BR19BREFQVElWRToKKwkJY2hpcC0+bWFnX3RpbWVvdXRbcmlzaW5nXVtjaGFuXSA9IGRhdGE7CisJCWJyZWFrOworCWNhc2UgSUlPX0VWX1RZUEVfVEhSRVNIX0FEQVBUSVZFOgorCQljaGlwLT50aHJlc2hfdGltZW91dFtyaXNpbmddW2NoYW5dID0gZGF0YTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcl9yZXQ7CisJfTsKKworCXJldCA9IGFkNzE1MF93cml0ZV9ldmVudF9wYXJhbXMoaW5kaW9fZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MpOworZXJyb3JfcmV0OgorCW11dGV4X3VubG9jaygmY2hpcC0+c3RhdGVfbG9jayk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBsZW47Cit9CisKKyNkZWZpbmUgQUQ3MTUwX1RJTUVPVVQoY2hhbiwgdHlwZSwgZGlyLCBldl90eXBlLCBldl9kaXIpCQlcCisJSUlPX0RFVklDRV9BVFRSKGluX2NhcGFjaXRhbmNlIyNjaGFuIyNfIyN0eXBlIyNfIyNkaXIjI190aW1lb3V0LCBcCisJCVNfSVJVR08gfCBTX0lXVVNSLAkJCQkJXAorCQkmYWQ3MTUwX3Nob3dfdGltZW91dCwJCQkJCVwKKwkJJmFkNzE1MF9zdG9yZV90aW1lb3V0LAkJCQkJXAorCQlJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fQ0FQQUNJVEFOQ0UsCQkJXAorCQkJCSAgICAgY2hhbiwJCQkJXAorCQkJCSAgICAgSUlPX0VWX1RZUEVfIyNldl90eXBlLAkJXAorCQkJCSAgICAgSUlPX0VWX0RJUl8jI2V2X2RpcikpCitzdGF0aWMgQUQ3MTUwX1RJTUVPVVQoMCwgbWFnX2FkYXB0aXZlLCByaXNpbmcsIE1BR19BREFQVElWRSwgUklTSU5HKTsKK3N0YXRpYyBBRDcxNTBfVElNRU9VVCgwLCBtYWdfYWRhcHRpdmUsIGZhbGxpbmcsIE1BR19BREFQVElWRSwgRkFMTElORyk7CitzdGF0aWMgQUQ3MTUwX1RJTUVPVVQoMSwgbWFnX2FkYXB0aXZlLCByaXNpbmcsIE1BR19BREFQVElWRSwgUklTSU5HKTsKK3N0YXRpYyBBRDcxNTBfVElNRU9VVCgxLCBtYWdfYWRhcHRpdmUsIGZhbGxpbmcsIE1BR19BREFQVElWRSwgRkFMTElORyk7CitzdGF0aWMgQUQ3MTUwX1RJTUVPVVQoMCwgdGhyZXNoX2FkYXB0aXZlLCByaXNpbmcsIFRIUkVTSF9BREFQVElWRSwgUklTSU5HKTsKK3N0YXRpYyBBRDcxNTBfVElNRU9VVCgwLCB0aHJlc2hfYWRhcHRpdmUsIGZhbGxpbmcsIFRIUkVTSF9BREFQVElWRSwgRkFMTElORyk7CitzdGF0aWMgQUQ3MTUwX1RJTUVPVVQoMSwgdGhyZXNoX2FkYXB0aXZlLCByaXNpbmcsIFRIUkVTSF9BREFQVElWRSwgUklTSU5HKTsKK3N0YXRpYyBBRDcxNTBfVElNRU9VVCgxLCB0aHJlc2hfYWRhcHRpdmUsIGZhbGxpbmcsIFRIUkVTSF9BREFQVElWRSwgRkFMTElORyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBhZDcxNTBfY2hhbm5lbHNbXSA9IHsKKwl7CisJCS50eXBlID0gSUlPX0NBUEFDSVRBTkNFLAorCQkuaW5kZXhlZCA9IDEsCisJCS5jaGFubmVsID0gMCwKKwkJLmluZm9fbWFzayA9ICgxIDw8IElJT19DSEFOX0lORk9fQVZFUkFHRV9SQVdfU0VQQVJBVEUpLAorCQkuZXZlbnRfbWFzayA9CisJCUlJT19FVl9CSVQoSUlPX0VWX1RZUEVfVEhSRVNILCBJSU9fRVZfRElSX1JJU0lORykgfAorCQlJSU9fRVZfQklUKElJT19FVl9UWVBFX1RIUkVTSCwgSUlPX0VWX0RJUl9GQUxMSU5HKSB8CisJCUlJT19FVl9CSVQoSUlPX0VWX1RZUEVfVEhSRVNIX0FEQVBUSVZFLCBJSU9fRVZfRElSX1JJU0lORykgfAorCQlJSU9fRVZfQklUKElJT19FVl9UWVBFX1RIUkVTSF9BREFQVElWRSwgSUlPX0VWX0RJUl9GQUxMSU5HKSB8CisJCUlJT19FVl9CSVQoSUlPX0VWX1RZUEVfTUFHX0FEQVBUSVZFLCBJSU9fRVZfRElSX1JJU0lORykgfAorCQlJSU9fRVZfQklUKElJT19FVl9UWVBFX01BR19BREFQVElWRSwgSUlPX0VWX0RJUl9GQUxMSU5HKQorCX0sIHsKKwkJLnR5cGUgPSBJSU9fQ0FQQUNJVEFOQ0UsCisJCS5pbmRleGVkID0gMSwKKwkJLmNoYW5uZWwgPSAxLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19BVkVSQUdFX1JBV19TRVBBUkFURSksCisJCS5ldmVudF9tYXNrID0KKwkJSUlPX0VWX0JJVChJSU9fRVZfVFlQRV9USFJFU0gsIElJT19FVl9ESVJfUklTSU5HKSB8CisJCUlJT19FVl9CSVQoSUlPX0VWX1RZUEVfVEhSRVNILCBJSU9fRVZfRElSX0ZBTExJTkcpIHwKKwkJSUlPX0VWX0JJVChJSU9fRVZfVFlQRV9USFJFU0hfQURBUFRJVkUsIElJT19FVl9ESVJfUklTSU5HKSB8CisJCUlJT19FVl9CSVQoSUlPX0VWX1RZUEVfVEhSRVNIX0FEQVBUSVZFLCBJSU9fRVZfRElSX0ZBTExJTkcpIHwKKwkJSUlPX0VWX0JJVChJSU9fRVZfVFlQRV9NQUdfQURBUFRJVkUsIElJT19FVl9ESVJfUklTSU5HKSB8CisJCUlJT19FVl9CSVQoSUlPX0VWX1RZUEVfTUFHX0FEQVBUSVZFLCBJSU9fRVZfRElSX0ZBTExJTkcpCisJfSwKK307CisKKy8qCisgKiB0aHJlc2hvbGQgZXZlbnRzCisgKi8KKworc3RhdGljIGlycXJldHVybl90IGFkNzE1MF9ldmVudF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHByaXZhdGU7CisJc3RydWN0IGFkNzE1MF9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXU4IGludF9zdGF0dXM7CisJczY0IHRpbWVzdGFtcCA9IGlpb19nZXRfdGltZV9ucygpOworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2hpcC0+Y2xpZW50LCBBRDcxNTBfU1RBVFVTKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJaW50X3N0YXR1cyA9IHJldDsKKworCWlmICgoaW50X3N0YXR1cyAmIEFENzE1MF9TVEFUVVNfT1VUMSkgJiYKKwkgICAgIShjaGlwLT5vbGRfc3RhdGUgJiBBRDcxNTBfU1RBVFVTX09VVDEpKQorCQlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsCisJCQkgICAgICAgSUlPX1VOTU9EX0VWRU5UX0NPREUoSUlPX0NBUEFDSVRBTkNFLAorCQkJCQkJICAgIDAsCisJCQkJCQkgICAgSUlPX0VWX1RZUEVfVEhSRVNILAorCQkJCQkJICAgIElJT19FVl9ESVJfUklTSU5HKSwKKwkJCQl0aW1lc3RhbXApOworCWVsc2UgaWYgKCghKGludF9zdGF0dXMgJiBBRDcxNTBfU1RBVFVTX09VVDEpKSAmJgorCQkgKGNoaXAtPm9sZF9zdGF0ZSAmIEFENzE1MF9TVEFUVVNfT1VUMSkpCisJCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwKKwkJCSAgICAgICBJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fQ0FQQUNJVEFOQ0UsCisJCQkJCQkgICAgMCwKKwkJCQkJCSAgICBJSU9fRVZfVFlQRV9USFJFU0gsCisJCQkJCQkgICAgSUlPX0VWX0RJUl9GQUxMSU5HKSwKKwkJCSAgICAgICB0aW1lc3RhbXApOworCisJaWYgKChpbnRfc3RhdHVzICYgQUQ3MTUwX1NUQVRVU19PVVQyKSAmJgorCSAgICAhKGNoaXAtPm9sZF9zdGF0ZSAmIEFENzE1MF9TVEFUVVNfT1VUMikpCisJCWlpb19wdXNoX2V2ZW50KGluZGlvX2RldiwKKwkJCSAgICAgICBJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fQ0FQQUNJVEFOQ0UsCisJCQkJCQkgICAgMSwKKwkJCQkJCSAgICBJSU9fRVZfVFlQRV9USFJFU0gsCisJCQkJCQkgICAgSUlPX0VWX0RJUl9SSVNJTkcpLAorCQkJICAgICAgIHRpbWVzdGFtcCk7CisJZWxzZSBpZiAoKCEoaW50X3N0YXR1cyAmIEFENzE1MF9TVEFUVVNfT1VUMikpICYmCisJCSAoY2hpcC0+b2xkX3N0YXRlICYgQUQ3MTUwX1NUQVRVU19PVVQyKSkKKwkJaWlvX3B1c2hfZXZlbnQoaW5kaW9fZGV2LAorCQkJICAgICAgIElJT19VTk1PRF9FVkVOVF9DT0RFKElJT19DQVBBQ0lUQU5DRSwKKwkJCQkJCSAgICAxLAorCQkJCQkJICAgIElJT19FVl9UWVBFX1RIUkVTSCwKKwkJCQkJCSAgICBJSU9fRVZfRElSX0ZBTExJTkcpLAorCQkJICAgICAgIHRpbWVzdGFtcCk7CisJLyogc3RvcmUgdGhlIHN0YXR1cyB0byBhdm9pZCByZXB1c2hpbmcgc2FtZSBldmVudHMgKi8KKwljaGlwLT5vbGRfc3RhdGUgPSBpbnRfc3RhdHVzOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBUaW1lb3V0cyBub3QgY3VycmVudGx5IGhhbmRsZWQgYnkgY29yZSAqLworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNzE1MF9ldmVudF9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9pbl9jYXBhY2l0YW5jZTBfbWFnX2FkYXB0aXZlX3Jpc2luZ190aW1lb3V0CisJLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbl9jYXBhY2l0YW5jZTBfbWFnX2FkYXB0aXZlX2ZhbGxpbmdfdGltZW91dAorCS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fY2FwYWNpdGFuY2UxX21hZ19hZGFwdGl2ZV9yaXNpbmdfdGltZW91dAorCS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fY2FwYWNpdGFuY2UxX21hZ19hZGFwdGl2ZV9mYWxsaW5nX3RpbWVvdXQKKwkuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX2NhcGFjaXRhbmNlMF90aHJlc2hfYWRhcHRpdmVfcmlzaW5nX3RpbWVvdXQKKwkuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX2NhcGFjaXRhbmNlMF90aHJlc2hfYWRhcHRpdmVfZmFsbGluZ190aW1lb3V0CisJLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbl9jYXBhY2l0YW5jZTFfdGhyZXNoX2FkYXB0aXZlX3Jpc2luZ190aW1lb3V0CisJLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbl9jYXBhY2l0YW5jZTFfdGhyZXNoX2FkYXB0aXZlX2ZhbGxpbmdfdGltZW91dAorCS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDcxNTBfZXZlbnRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNzE1MF9ldmVudF9hdHRyaWJ1dGVzLAorCS5uYW1lID0gImV2ZW50cyIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkNzE1MF9pbmZvID0geworCS5ldmVudF9hdHRycyA9ICZhZDcxNTBfZXZlbnRfYXR0cmlidXRlX2dyb3VwLAorCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCisJLnJlYWRfcmF3ID0gJmFkNzE1MF9yZWFkX3JhdywKKwkucmVhZF9ldmVudF9jb25maWcgPSAmYWQ3MTUwX3JlYWRfZXZlbnRfY29uZmlnLAorCS53cml0ZV9ldmVudF9jb25maWcgPSAmYWQ3MTUwX3dyaXRlX2V2ZW50X2NvbmZpZywKKwkucmVhZF9ldmVudF92YWx1ZSA9ICZhZDcxNTBfcmVhZF9ldmVudF92YWx1ZSwKKwkud3JpdGVfZXZlbnRfdmFsdWUgPSAmYWQ3MTUwX3dyaXRlX2V2ZW50X3ZhbHVlLAorfTsKKworLyoKKyAqIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZlCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgYWQ3MTUwX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBhZDcxNTBfY2hpcF9pbmZvICpjaGlwOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisKKwlpbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKHNpemVvZigqY2hpcCkpOworCWlmIChpbmRpb19kZXYgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJbXV0ZXhfaW5pdCgmY2hpcC0+c3RhdGVfbG9jayk7CisJLyogdGhpcyBpcyBvbmx5IHVzZWQgZm9yIGRldmljZSByZW1vdmFsIHB1cnBvc2VzICovCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgaW5kaW9fZGV2KTsKKworCWNoaXAtPmNsaWVudCA9IGNsaWVudDsKKworCWluZGlvX2Rldi0+bmFtZSA9IGlkLT5uYW1lOworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBhZDcxNTBfY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGFkNzE1MF9jaGFubmVscyk7CisJLyogRXN0YWJsaXNoIHRoYXQgdGhlIGlpb19kZXYgaXMgYSBjaGlsZCBvZiB0aGUgaTJjIGRldmljZSAqLworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKworCWluZGlvX2Rldi0+aW5mbyA9ICZhZDcxNTBfaW5mbzsKKworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCWlmIChjbGllbnQtPmlycSkgeworCQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShjbGllbnQtPmlycSwKKwkJCQkJICAgTlVMTCwKKwkJCQkJICAgJmFkNzE1MF9ldmVudF9oYW5kbGVyLAorCQkJCQkgICBJUlFGX1RSSUdHRVJfUklTSU5HIHwKKwkJCQkJICAgSVJRRl9UUklHR0VSX0ZBTExJTkcsCisJCQkJCSAgICJhZDcxNTBfaXJxMSIsCisJCQkJCSAgIGluZGlvX2Rldik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCX0KKworCWlmIChjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhKSB7CisJCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKCoodW5zaWduZWQgaW50ICopCisJCQkJCSAgIGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGEsCisJCQkJCSAgIE5VTEwsCisJCQkJCSAgICZhZDcxNTBfZXZlbnRfaGFuZGxlciwKKwkJCQkJICAgSVJRRl9UUklHR0VSX1JJU0lORyB8CisJCQkJCSAgIElSUUZfVFJJR0dFUl9GQUxMSU5HLAorCQkJCQkgICAiYWQ3MTUwX2lycTIiLAorCQkJCQkgICBpbmRpb19kZXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl9mcmVlX2lycTsKKwl9CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2lycTI7CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICIlcyBjYXBhY2l0aXZlIHNlbnNvciByZWdpc3RlcmVkLGlycTogJWRcbiIsCisJCSBpZC0+bmFtZSwgY2xpZW50LT5pcnEpOworCisJcmV0dXJuIDA7CitlcnJvcl9mcmVlX2lycTI6CisJaWYgKGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGEpCisJCWZyZWVfaXJxKCoodW5zaWduZWQgaW50ICopY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YSwKKwkJCSBpbmRpb19kZXYpOworZXJyb3JfZnJlZV9pcnE6CisJaWYgKGNsaWVudC0+aXJxKQorCQlmcmVlX2lycShjbGllbnQtPmlycSwgaW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfZGV2OgorCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IGFkNzE1MF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAoY2xpZW50LT5pcnEpCisJCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBpbmRpb19kZXYpOworCisJaWYgKGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGEpCisJCWZyZWVfaXJxKCoodW5zaWduZWQgaW50ICopY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YSwgaW5kaW9fZGV2KTsKKworCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhZDcxNTBfaWRbXSA9IHsKKwl7ICJhZDcxNTAiLCAwIH0sCisJeyAiYWQ3MTUxIiwgMCB9LAorCXsgImFkNzE1NiIsIDAgfSwKKwl7fQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGFkNzE1MF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhZDcxNTBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImFkNzE1MCIsCisJfSwKKwkucHJvYmUgPSBhZDcxNTBfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkNzE1MF9yZW1vdmUpLAorCS5pZF90YWJsZSA9IGFkNzE1MF9pZCwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkNzE1MF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZhZDcxNTBfZHJpdmVyKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIGFkNzE1MF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmFkNzE1MF9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQ3MTUwLzEvNiBjYXBhY2l0aXZlIHNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKworbW9kdWxlX2luaXQoYWQ3MTUwX2luaXQpOworbW9kdWxlX2V4aXQoYWQ3MTUwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9jZGMvYWQ3MTUyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2NkYy9hZDcxNTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjI1ODRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9jZGMvYWQ3MTUyLmMKQEAgLTAsMCArMSw1NTkgQEAKKy8qCisgKiBBRDcxNTIgY2FwYWNpdGl2ZSBzZW5zb3IgZHJpdmVyIHN1cHBvcnRpbmcgQUQ3MTUyLzMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMC0yMDExYSBBbmFsb2cgRGV2aWNlcyBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKworLyoKKyAqIFRPRE86IENoZWNrIGNvbXBsaWFuY2Ugb2YgY2FsaWJiaWFzIHdpdGggYWJpICh1bml0cykKKyAqLworLyoKKyAqIEFENzE1MiByZWdpc3RlcnMgZGVmaW5pdGlvbgorICovCisKKyNkZWZpbmUgQUQ3MTUyX1JFR19TVEFUVVMJCTAKKyNkZWZpbmUgQUQ3MTUyX1JFR19DSDFfREFUQV9ISUdICTEKKyNkZWZpbmUgQUQ3MTUyX1JFR19DSDJfREFUQV9ISUdICTMKKyNkZWZpbmUgQUQ3MTUyX1JFR19DSDFfT0ZGU19ISUdICTUKKyNkZWZpbmUgQUQ3MTUyX1JFR19DSDJfT0ZGU19ISUdICTcKKyNkZWZpbmUgQUQ3MTUyX1JFR19DSDFfR0FJTl9ISUdICTkKKyNkZWZpbmUgQUQ3MTUyX1JFR19DSDFfU0VUVVAJCTExCisjZGVmaW5lIEFENzE1Ml9SRUdfQ0gyX0dBSU5fSElHSAkxMgorI2RlZmluZSBBRDcxNTJfUkVHX0NIMl9TRVRVUAkJMTQKKyNkZWZpbmUgQUQ3MTUyX1JFR19DRkcJCQkxNQorI2RlZmluZSBBRDcxNTJfUkVHX1JFU0VWRVJECQkxNgorI2RlZmluZSBBRDcxNTJfUkVHX0NBUERBQ19QT1MJCTE3CisjZGVmaW5lIEFENzE1Ml9SRUdfQ0FQREFDX05FRwkJMTgKKyNkZWZpbmUgQUQ3MTUyX1JFR19DRkcyCQkJMjYKKworLyogU3RhdHVzIFJlZ2lzdGVyIEJpdCBEZXNpZ25hdGlvbnMgKEFENzE1Ml9SRUdfU1RBVFVTKSAqLworI2RlZmluZSBBRDcxNTJfU1RBVFVTX1JEWTEJCSgxIDw8IDApCisjZGVmaW5lIEFENzE1Ml9TVEFUVVNfUkRZMgkJKDEgPDwgMSkKKyNkZWZpbmUgQUQ3MTUyX1NUQVRVU19DMUMyCQkoMSA8PCAyKQorI2RlZmluZSBBRDcxNTJfU1RBVFVTX1BXRE4JCSgxIDw8IDcpCisKKy8qIFNldHVwIFJlZ2lzdGVyIEJpdCBEZXNpZ25hdGlvbnMgKEFENzE1Ml9SRUdfQ0h4X1NFVFVQKSAqLworI2RlZmluZSBBRDcxNTJfU0VUVVBfQ0FQRElGRgkJKDEgPDwgNSkKKyNkZWZpbmUgQUQ3MTUyX1NFVFVQX1JBTkdFXzJwRgkJKDAgPDwgNikKKyNkZWZpbmUgQUQ3MTUyX1NFVFVQX1JBTkdFXzBfNXBGCSgxIDw8IDYpCisjZGVmaW5lIEFENzE1Ml9TRVRVUF9SQU5HRV8xcEYJCSgyIDw8IDYpCisjZGVmaW5lIEFENzE1Ml9TRVRVUF9SQU5HRV80cEYJCSgzIDw8IDYpCisjZGVmaW5lIEFENzE1Ml9TRVRVUF9SQU5HRSh4KQkJKCh4KSA8PCA2KQorCisvKiBDb25maWcgUmVnaXN0ZXIgQml0IERlc2lnbmF0aW9ucyAoQUQ3MTUyX1JFR19DRkcpICovCisjZGVmaW5lIEFENzE1Ml9DT05GX0NIMkVOCQkoMSA8PCAzKQorI2RlZmluZSBBRDcxNTJfQ09ORl9DSDFFTgkJKDEgPDwgNCkKKyNkZWZpbmUgQUQ3MTUyX0NPTkZfTU9ERV9JRExFCQkoMCA8PCAwKQorI2RlZmluZSBBRDcxNTJfQ09ORl9NT0RFX0NPTlRfQ09OVgkoMSA8PCAwKQorI2RlZmluZSBBRDcxNTJfQ09ORl9NT0RFX1NJTkdMRV9DT05WCSgyIDw8IDApCisjZGVmaW5lIEFENzE1Ml9DT05GX01PREVfT0ZGU19DQUwJKDUgPDwgMCkKKyNkZWZpbmUgQUQ3MTUyX0NPTkZfTU9ERV9HQUlOX0NBTAkoNiA8PCAwKQorCisvKiBDYXBkYWMgUmVnaXN0ZXIgQml0IERlc2lnbmF0aW9ucyAoQUQ3MTUyX1JFR19DQVBEQUNfWFhYKSAqLworI2RlZmluZSBBRDcxNTJfQ0FQREFDX0RBQ0VOCQkoMSA8PCA3KQorI2RlZmluZSBBRDcxNTJfQ0FQREFDX0RBQ1AoeCkJCSgoeCkgJiAweDFGKQorCisvKiBDRkcyIFJlZ2lzdGVyIEJpdCBEZXNpZ25hdGlvbnMgKEFENzE1Ml9SRUdfQ0ZHMikgKi8KKyNkZWZpbmUgQUQ3MTUyX0NGRzJfT1NSKHgpCQkoKCh4KSAmIDB4MykgPDwgNCkKKworZW51bSB7CisJQUQ3MTUyX0RBVEEsCisJQUQ3MTUyX09GRlMsCisJQUQ3MTUyX0dBSU4sCisJQUQ3MTUyX1NFVFVQCit9OworCisvKgorICogc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmMgaW5mb3JtYXRpb24KKyAqLworCitzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwkvKgorCSAqIENhcGFjaXRpdmUgY2hhbm5lbCBkaWdpdGFsIGZpbHRlciBzZXR1cDsKKwkgKiBjb252ZXJzaW9uIHRpbWUvdXBkYXRlIHJhdGUgc2V0dXAgcGVyIGNoYW5uZWwKKwkgKi8KKwl1OAlmaWx0ZXJfcmF0ZV9zZXR1cDsKKwl1OAlzZXR1cFsyXTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3NpemVfdCBhZDcxNTJfc3RhcnRfY2FsaWIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjb25zdCBjaGFyICpidWYsCisJCQkJCSBzaXplX3QgbGVuLAorCQkJCQkgdTggcmVndmFsKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOworCWJvb2wgZG9pdDsKKwlpbnQgcmV0LCB0aW1lb3V0ID0gMTA7CisKKwlyZXQgPSBzdHJ0b2Jvb2woYnVmLCAmZG9pdCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoIWRvaXQpCisJCXJldHVybiAwOworCisJaWYgKHRoaXNfYXR0ci0+YWRkcmVzcyA9PSAwKQorCQlyZWd2YWwgfD0gQUQ3MTUyX0NPTkZfQ0gxRU47CisJZWxzZQorCQlyZWd2YWwgfD0gQUQ3MTUyX0NPTkZfQ0gyRU47CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwgQUQ3MTUyX1JFR19DRkcsIHJlZ3ZhbCk7CisJaWYgKHJldCA8IDApIHsKKwkJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkbyB7CisJCW1kZWxheSgyMCk7CisJCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjaGlwLT5jbGllbnQsIEFENzE1Ml9SRUdfQ0ZHKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfSB3aGlsZSAoKHJldCA9PSByZWd2YWwpICYmIHRpbWVvdXQtLSk7CisKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCXJldHVybiBsZW47Cit9CitzdGF0aWMgc3NpemVfdCBhZDcxNTJfc3RhcnRfb2Zmc2V0X2NhbGliKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgY29uc3QgY2hhciAqYnVmLAorCQkJCQkgc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYWQ3MTUyX3N0YXJ0X2NhbGliKGRldiwgYXR0ciwgYnVmLCBsZW4sCisJCQkJICBBRDcxNTJfQ09ORl9NT0RFX09GRlNfQ0FMKTsKK30KK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zdGFydF9nYWluX2NhbGliKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkgICAgICAgc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gYWQ3MTUyX3N0YXJ0X2NhbGliKGRldiwgYXR0ciwgYnVmLCBsZW4sCisJCQkJICBBRDcxNTJfQ09ORl9NT0RFX0dBSU5fQ0FMKTsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihpbl9jYXBhY2l0YW5jZTBfY2FsaWJiaWFzX2NhbGlicmF0aW9uLAorCQkgICAgICAgU19JV1VTUiwgTlVMTCwgYWQ3MTUyX3N0YXJ0X29mZnNldF9jYWxpYiwgMCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluX2NhcGFjaXRhbmNlMV9jYWxpYmJpYXNfY2FsaWJyYXRpb24sCisJCSAgICAgICBTX0lXVVNSLCBOVUxMLCBhZDcxNTJfc3RhcnRfb2Zmc2V0X2NhbGliLCAxKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW5fY2FwYWNpdGFuY2UwX2NhbGlic2NhbGVfY2FsaWJyYXRpb24sCisJCSAgICAgICBTX0lXVVNSLCBOVUxMLCBhZDcxNTJfc3RhcnRfZ2Fpbl9jYWxpYiwgMCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluX2NhcGFjaXRhbmNlMV9jYWxpYnNjYWxlX2NhbGlicmF0aW9uLAorCQkgICAgICAgU19JV1VTUiwgTlVMTCwgYWQ3MTUyX3N0YXJ0X2dhaW5fY2FsaWIsIDEpOworCisvKiBWYWx1ZXMgYXJlIFVwZGF0ZSBSYXRlIChIeiksIENvbnZlcnNpb24gVGltZSAobXMpICsgMSovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhZDcxNTJfZmlsdGVyX3JhdGVfdGFibGVbXVsyXSA9IHsKKwl7MjAwLCA1ICsgMX0sIHs1MCwgMjAgKyAxfSwgezIwLCA1MCArIDF9LCB7MTcsIDYwICsgMX0sCit9OworCitzdGF0aWMgc3NpemVfdCBhZDcxNTJfc2hvd19maWx0ZXJfcmF0ZV9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLAorCQkgICAgICAgYWQ3MTUyX2ZpbHRlcl9yYXRlX3RhYmxlW2NoaXAtPmZpbHRlcl9yYXRlX3NldHVwXVswXSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzE1Ml9zdG9yZV9maWx0ZXJfcmF0ZV9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQljb25zdCBjaGFyICpidWYsCisJCXNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDcxNTJfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1OCBkYXRhOworCWludCByZXQsIGk7CisKKwlyZXQgPSBrc3RydG91OChidWYsIDEwLCAmZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhZDcxNTJfZmlsdGVyX3JhdGVfdGFibGUpOyBpKyspCisJCWlmIChkYXRhID49IGFkNzE1Ml9maWx0ZXJfcmF0ZV90YWJsZVtpXVswXSkKKwkJCWJyZWFrOworCisJaWYgKGkgPj0gQVJSQVlfU0laRShhZDcxNTJfZmlsdGVyX3JhdGVfdGFibGUpKQorCQlpID0gQVJSQVlfU0laRShhZDcxNTJfZmlsdGVyX3JhdGVfdGFibGUpIC0gMTsKKworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2hpcC0+Y2xpZW50LAorCQkJQUQ3MTUyX1JFR19DRkcyLCBBRDcxNTJfQ0ZHMl9PU1IoaSkpOworCWlmIChyZXQgPCAwKSB7CisJCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJCXJldHVybiByZXQ7CisJfQorCisJY2hpcC0+ZmlsdGVyX3JhdGVfc2V0dXAgPSBpOworCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVl9BVFRSX1NBTVBfRlJFUShTX0lSVUdPIHwgU19JV1VTUiwKKwkJYWQ3MTUyX3Nob3dfZmlsdGVyX3JhdGVfc2V0dXAsCisJCWFkNzE1Ml9zdG9yZV9maWx0ZXJfcmF0ZV9zZXR1cCk7CisKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQU1QX0ZSRVFfQVZBSUwoIjIwMCA1MCAyMCAxNyIpOworCitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaW5fY2FwYWNpdGFuY2Vfc2NhbGVfYXZhaWxhYmxlLAorCQkgICAgICAiMC4wMDAwNjEwNTAgMC4wMDAwMzA1MjUgMC4wMDAwMTUyNjMgMC4wMDAwMDc2MzEiKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNzE1Ml9hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX2NhcGFjaXRhbmNlMF9jYWxpYmJpYXNfY2FsaWJyYXRpb24uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX2NhcGFjaXRhbmNlMV9jYWxpYmJpYXNfY2FsaWJyYXRpb24uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX2NhcGFjaXRhbmNlMF9jYWxpYnNjYWxlX2NhbGlicmF0aW9uLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbl9jYXBhY2l0YW5jZTFfY2FsaWJzY2FsZV9jYWxpYnJhdGlvbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbl9jYXBhY2l0YW5jZV9zY2FsZV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDcxNTJfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNzE1Ml9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGNvbnN0IHU4IGFkNzE1Ml9hZGRyZXNzZXNbXVs0XSA9IHsKKwl7IEFENzE1Ml9SRUdfQ0gxX0RBVEFfSElHSCwgQUQ3MTUyX1JFR19DSDFfT0ZGU19ISUdILAorCSAgQUQ3MTUyX1JFR19DSDFfR0FJTl9ISUdILCBBRDcxNTJfUkVHX0NIMV9TRVRVUCB9LAorCXsgQUQ3MTUyX1JFR19DSDJfREFUQV9ISUdILCBBRDcxNTJfUkVHX0NIMl9PRkZTX0hJR0gsCisJICBBRDcxNTJfUkVHX0NIMl9HQUlOX0hJR0gsIEFENzE1Ml9SRUdfQ0gyX1NFVFVQIH0sCit9OworCisvKiBWYWx1ZXMgYXJlIG5hbm8gcmVsYXRpdmUgdG8gcGYgYmFzZS4gKi8KK3N0YXRpYyBjb25zdCBpbnQgYWQ3MTUyX3NjYWxlX3RhYmxlW10gPSB7CisJMzA1MjUsIDc2MzEsIDE1MjYzLCA2MTA1MAorfTsKKworc3RhdGljIGludCBhZDcxNTJfd3JpdGVfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICAgaW50IHZhbCwKKwkJCSAgICBpbnQgdmFsMiwKKwkJCSAgICBsb25nIG1hc2spCit7CisJc3RydWN0IGFkNzE1Ml9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQsIGk7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQlNDQUxFX1NFUEFSQVRFKToKKwkJaWYgKHZhbCAhPSAxKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKworCQl2YWwgPSAodmFsMiAqIDEwMjQpIC8gMTU2MjU7CisKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjaGlwLT5jbGllbnQsCisJCQkJYWQ3MTUyX2FkZHJlc3Nlc1tjaGFuLT5jaGFubmVsXVtBRDcxNTJfR0FJTl0sCisJCQkJc3dhYjE2KHZhbCkpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCisJCXJldCA9IDA7CisJCWJyZWFrOworCisJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSk6CisJCWlmICgodmFsIDwgMCkgfCAodmFsID4gMHhGRkZGKSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2hpcC0+Y2xpZW50LAorCQkJCWFkNzE1Ml9hZGRyZXNzZXNbY2hhbi0+Y2hhbm5lbF1bQUQ3MTUyX09GRlNdLAorCQkJCXN3YWIxNih2YWwpKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKworCQlyZXQgPSAwOworCQlicmVhazsKKwljYXNlICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpOgorCQlpZiAodmFsICE9IDApIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhZDcxNTJfc2NhbGVfdGFibGUpOyBpKyspCisJCQlpZiAodmFsMiA9PSBhZDcxNTJfc2NhbGVfdGFibGVbaV0pCisJCQkJYnJlYWs7CisKKwkJY2hpcC0+c2V0dXBbY2hhbi0+Y2hhbm5lbF0gJj0gfkFENzE1Ml9TRVRVUF9SQU5HRV80cEY7CisJCWNoaXAtPnNldHVwW2NoYW4tPmNoYW5uZWxdIHw9IEFENzE1Ml9TRVRVUF9SQU5HRShpKTsKKworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwKKwkJCQlhZDcxNTJfYWRkcmVzc2VzW2NoYW4tPmNoYW5uZWxdW0FENzE1Ml9TRVRVUF0sCisJCQkJY2hpcC0+c2V0dXBbY2hhbi0+Y2hhbm5lbF0pOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCisJCXJldCA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIGludCBhZDcxNTJfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCSAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgaW50ICp2YWwsIGludCAqdmFsMiwKKwkJCSAgIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKKwl1OCByZWd2YWwgPSAwOworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIDA6CisJCS8qIEZpcnN0IHNldCB3aGV0aGVyIGluIGRpZmZlcmVudGlhbCBtb2RlICovCisKKwkJcmVndmFsID0gY2hpcC0+c2V0dXBbY2hhbi0+Y2hhbm5lbF07CisKKwkJaWYgKGNoYW4tPmRpZmZlcmVudGlhbCkKKwkJCWNoaXAtPnNldHVwW2NoYW4tPmNoYW5uZWxdIHw9IEFENzE1Ml9TRVRVUF9DQVBESUZGOworCQllbHNlCisJCQljaGlwLT5zZXR1cFtjaGFuLT5jaGFubmVsXSAmPSB+QUQ3MTUyX1NFVFVQX0NBUERJRkY7CisKKwkJaWYgKHJlZ3ZhbCAhPSBjaGlwLT5zZXR1cFtjaGFuLT5jaGFubmVsXSkgeworCQkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjaGlwLT5jbGllbnQsCisJCQkJYWQ3MTUyX2FkZHJlc3Nlc1tjaGFuLT5jaGFubmVsXVtBRDcxNTJfU0VUVVBdLAorCQkJCWNoaXAtPnNldHVwW2NoYW4tPmNoYW5uZWxdKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gb3V0OworCQl9CisJCS8qIE1ha2Ugc3VyZSB0aGUgY2hhbm5lbCBpcyBlbmFibGVkICovCisJCWlmIChjaGFuLT5jaGFubmVsID09IDApCisJCQlyZWd2YWwgPSBBRDcxNTJfQ09ORl9DSDFFTjsKKwkJZWxzZQorCQkJcmVndmFsID0gQUQ3MTUyX0NPTkZfQ0gyRU47CisKKwkJLyogVHJpZ2dlciBhIHNpbmdsZSByZWFkICovCisJCXJlZ3ZhbCB8PSBBRDcxNTJfQ09ORl9NT0RFX1NJTkdMRV9DT05WOworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwgQUQ3MTUyX1JFR19DRkcsCisJCQkJcmVndmFsKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKworCQltc2xlZXAoYWQ3MTUyX2ZpbHRlcl9yYXRlX3RhYmxlW2NoaXAtPmZpbHRlcl9yYXRlX3NldHVwXVsxXSk7CisJCS8qIE5vdyByZWFkIHRoZSBhY3R1YWwgcmVnaXN0ZXIgKi8KKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNoaXAtPmNsaWVudCwKKwkJCQlhZDcxNTJfYWRkcmVzc2VzW2NoYW4tPmNoYW5uZWxdW0FENzE1Ml9EQVRBXSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJCSp2YWwgPSBzd2FiMTYocmV0KTsKKworCQlpZiAoY2hhbi0+ZGlmZmVyZW50aWFsKQorCQkJKnZhbCAtPSAweDgwMDA7CisKKwkJcmV0ID0gSUlPX1ZBTF9JTlQ7CisJCWJyZWFrOworCWNhc2UgKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQlNDQUxFX1NFUEFSQVRFKToKKworCQlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2hpcC0+Y2xpZW50LAorCQkJCWFkNzE1Ml9hZGRyZXNzZXNbY2hhbi0+Y2hhbm5lbF1bQUQ3MTUyX0dBSU5dKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwkJLyogMSArIGdhaW5fdmFsIC8gMl4xNiAqLworCQkqdmFsID0gMTsKKwkJKnZhbDIgPSAoMTU2MjUgKiBzd2FiMTYocmV0KSkgLyAxMDI0OworCisJCXJldCA9IElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisJCWJyZWFrOworCWNhc2UgKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQkJJQVNfU0VQQVJBVEUpOgorCQlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2hpcC0+Y2xpZW50LAorCQkJCWFkNzE1Ml9hZGRyZXNzZXNbY2hhbi0+Y2hhbm5lbF1bQUQ3MTUyX09GRlNdKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwkJKnZhbCA9IHN3YWIxNihyZXQpOworCisJCXJldCA9IElJT19WQUxfSU5UOworCQlicmVhazsKKwljYXNlICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpOgorCQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2hpcC0+Y2xpZW50LAorCQkJCWFkNzE1Ml9hZGRyZXNzZXNbY2hhbi0+Y2hhbm5lbF1bQUQ3MTUyX1NFVFVQXSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJCSp2YWwgPSAwOworCQkqdmFsMiA9IGFkNzE1Ml9zY2FsZV90YWJsZVtyZXQgPj4gNl07CisKKwkJcmV0ID0gSUlPX1ZBTF9JTlRfUExVU19OQU5POworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX07CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkNzE1Ml93cml0ZV9yYXdfZ2V0X2ZtdChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgICAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgICAgIGxvbmcgbWFzaykKK3sKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpOgorCQlyZXR1cm4gSUlPX1ZBTF9JTlRfUExVU19OQU5POworCWRlZmF1bHQ6CisJCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBhZDcxNTJfaW5mbyA9IHsKKwkuYXR0cnMgPSAmYWQ3MTUyX2F0dHJpYnV0ZV9ncm91cCwKKwkucmVhZF9yYXcgPSAmYWQ3MTUyX3JlYWRfcmF3LAorCS53cml0ZV9yYXcgPSAmYWQ3MTUyX3dyaXRlX3JhdywKKwkud3JpdGVfcmF3X2dldF9mbXQgPSAmYWQ3MTUyX3dyaXRlX3Jhd19nZXRfZm10LAorCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgYWQ3MTUyX2NoYW5uZWxzW10gPSB7CisJeworCQkudHlwZSA9IElJT19DQVBBQ0lUQU5DRSwKKwkJLmluZGV4ZWQgPSAxLAorCQkuY2hhbm5lbCA9IDAsCisJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCU0NBTEVfU0VQQVJBVEUpIHwKKwkJKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQkJJQVNfU0VQQVJBVEUpIHwKKwkJKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TRVBBUkFURSksCisJfSwgeworCQkudHlwZSA9IElJT19DQVBBQ0lUQU5DRSwKKwkJLmRpZmZlcmVudGlhbCA9IDEsCisJCS5pbmRleGVkID0gMSwKKwkJLmNoYW5uZWwgPSAwLAorCQkuY2hhbm5lbDIgPSAyLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQlNDQUxFX1NFUEFSQVRFKSB8CisJCSgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NFUEFSQVRFKSB8CisJCSgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpLAorCX0sIHsKKwkJLnR5cGUgPSBJSU9fQ0FQQUNJVEFOQ0UsCisJCS5pbmRleGVkID0gMSwKKwkJLmNoYW5uZWwgPSAxLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQlNDQUxFX1NFUEFSQVRFKSB8CisJCSgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NFUEFSQVRFKSB8CisJCSgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpLAorCX0sIHsKKwkJLnR5cGUgPSBJSU9fQ0FQQUNJVEFOQ0UsCisJCS5kaWZmZXJlbnRpYWwgPSAxLAorCQkuaW5kZXhlZCA9IDEsCisJCS5jaGFubmVsID0gMSwKKwkJLmNoYW5uZWwyID0gMywKKwkJLmluZm9fbWFzayA9ICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJTQ0FMRV9TRVBBUkFURSkgfAorCQkoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSkgfAorCQkoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwKKwl9Cit9OworLyoKKyAqIGRldmljZSBwcm9iZSBhbmQgcmVtb3ZlCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgYWQ3MTUyX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYWQ3MTUyX2NoaXBfaW5mbyAqY2hpcDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCisJaW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZShzaXplb2YoKmNoaXApKTsKKwlpZiAoaW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCWNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciBkZXZpY2UgcmVtb3ZhbCBwdXJwb3NlcyAqLworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGluZGlvX2Rldik7CisKKwljaGlwLT5jbGllbnQgPSBjbGllbnQ7CisKKwkvKiBFc3RhYmxpc2ggdGhhdCB0aGUgaWlvX2RldiBpcyBhIGNoaWxkIG9mIHRoZSBpMmMgZGV2aWNlICovCisJaW5kaW9fZGV2LT5uYW1lID0gaWQtPm5hbWU7CisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWluZGlvX2Rldi0+aW5mbyA9ICZhZDcxNTJfaW5mbzsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gYWQ3MTUyX2NoYW5uZWxzOworCWlmIChpZC0+ZHJpdmVyX2RhdGEgPT0gMCkKKwkJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGFkNzE1Ml9jaGFubmVscyk7CisJZWxzZQorCQlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IDI7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGFkNzE1Ml9jaGFubmVscyk7CisJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlkZXZfZXJyKCZjbGllbnQtPmRldiwgIiVzIGNhcGFjaXRpdmUgc2Vuc29yIHJlZ2lzdGVyZWRcbiIsIGlkLT5uYW1lKTsKKworCXJldHVybiAwOworCitlcnJvcl9mcmVlX2RldjoKKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDcxNTJfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkNzE1Ml9pZFtdID0geworCXsgImFkNzE1MiIsIDAgfSwKKwl7ICJhZDcxNTMiLCAxIH0sCisJe30KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhZDcxNTJfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWQ3MTUyX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAorCX0sCisJLnByb2JlID0gYWQ3MTUyX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDcxNTJfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBhZDcxNTJfaWQsCit9OworCitzdGF0aWMgX19pbml0IGludCBhZDcxNTJfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWQ3MTUyX2RyaXZlcik7Cit9CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZDcxNTJfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhZDcxNTJfZHJpdmVyKTsKK30KKworTU9EVUxFX0FVVEhPUigiQmFycnkgU29uZyA8MjFjbmJhb0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFENzE1Mi8zIGNhcGFjaXRpdmUgc2Vuc29yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworCittb2R1bGVfaW5pdChhZDcxNTJfaW5pdCk7Cittb2R1bGVfZXhpdChhZDcxNTJfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2NkYy9hZDc3NDYuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vY2RjL2FkNzc0Ni5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4Njc5NDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2NkYy9hZDc3NDYuYwpAQCAtMCwwICsxLDgwNyBAQAorLyoKKyAqIEFENzc0NiBjYXBhY2l0aXZlIHNlbnNvciBkcml2ZXIgc3VwcG9ydGluZyBBRDc3NDUsIEFENzc0NiBhbmQgQUQ3NzQ3CisgKgorICogQ29weXJpZ2h0IDIwMTEgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisKKyNpbmNsdWRlICIuLi9paW8uaCIKKyNpbmNsdWRlICIuLi9zeXNmcy5oIgorCisjaW5jbHVkZSAiYWQ3NzQ2LmgiCisKKy8qCisgKiBBRDc3NDYgUmVnaXN0ZXIgRGVmaW5pdGlvbgorICovCisKKyNkZWZpbmUgQUQ3NzQ2X1JFR19TVEFUVVMJCTAKKyNkZWZpbmUgQUQ3NzQ2X1JFR19DQVBfREFUQV9ISUdICTEKKyNkZWZpbmUgQUQ3NzQ2X1JFR19DQVBfREFUQV9NSUQJCTIKKyNkZWZpbmUgQUQ3NzQ2X1JFR19DQVBfREFUQV9MT1cJCTMKKyNkZWZpbmUgQUQ3NzQ2X1JFR19WVF9EQVRBX0hJR0gJCTQKKyNkZWZpbmUgQUQ3NzQ2X1JFR19WVF9EQVRBX01JRAkJNQorI2RlZmluZSBBRDc3NDZfUkVHX1ZUX0RBVEFfTE9XCQk2CisjZGVmaW5lIEFENzc0Nl9SRUdfQ0FQX1NFVFVQCQk3CisjZGVmaW5lIEFENzc0Nl9SRUdfVlRfU0VUVVAJCTgKKyNkZWZpbmUgQUQ3NzQ2X1JFR19FWENfU0VUVVAJCTkKKyNkZWZpbmUgQUQ3NzQ2X1JFR19DRkcJCQkxMAorI2RlZmluZSBBRDc3NDZfUkVHX0NBUERBQ0EJCTExCisjZGVmaW5lIEFENzc0Nl9SRUdfQ0FQREFDQgkJMTIKKyNkZWZpbmUgQUQ3NzQ2X1JFR19DQVBfT0ZGSAkJMTMKKyNkZWZpbmUgQUQ3NzQ2X1JFR19DQVBfT0ZGTAkJMTQKKyNkZWZpbmUgQUQ3NzQ2X1JFR19DQVBfR0FJTkgJCTE1CisjZGVmaW5lIEFENzc0Nl9SRUdfQ0FQX0dBSU5MCQkxNgorI2RlZmluZSBBRDc3NDZfUkVHX1ZPTFRfR0FJTkgJCTE3CisjZGVmaW5lIEFENzc0Nl9SRUdfVk9MVF9HQUlOTAkJMTgKKworLyogU3RhdHVzIFJlZ2lzdGVyIEJpdCBEZXNpZ25hdGlvbnMgKEFENzc0Nl9SRUdfU1RBVFVTKSAqLworI2RlZmluZSBBRDc3NDZfU1RBVFVTX0VYQ0VSUgkJKDEgPDwgMykKKyNkZWZpbmUgQUQ3NzQ2X1NUQVRVU19SRFkJCSgxIDw8IDIpCisjZGVmaW5lIEFENzc0Nl9TVEFUVVNfUkRZVlQJCSgxIDw8IDEpCisjZGVmaW5lIEFENzc0Nl9TVEFUVVNfUkRZQ0FQCQkoMSA8PCAwKQorCisvKiBDYXBhY2l0aXZlIENoYW5uZWwgU2V0dXAgUmVnaXN0ZXIgQml0IERlc2lnbmF0aW9ucyAoQUQ3NzQ2X1JFR19DQVBfU0VUVVApICovCisjZGVmaW5lIEFENzc0Nl9DQVBTRVRVUF9DQVBFTgkJKDEgPDwgNykKKyNkZWZpbmUgQUQ3NzQ2X0NBUFNFVFVQX0NJTjIJCSgxIDw8IDYpIC8qIEFENzc0NiBvbmx5ICovCisjZGVmaW5lIEFENzc0Nl9DQVBTRVRVUF9DQVBESUZGCQkoMSA8PCA1KQorI2RlZmluZSBBRDc3NDZfQ0FQU0VUVVBfQ0FDSE9QCQkoMSA8PCAwKQorCisvKiBWb2x0YWdlL1RlbXBlcmF0dXJlIFNldHVwIFJlZ2lzdGVyIEJpdCBEZXNpZ25hdGlvbnMgKEFENzc0Nl9SRUdfVlRfU0VUVVApICovCisjZGVmaW5lIEFENzc0Nl9WVFNFVFVQX1ZURU4JCSgxIDw8IDcpCisjZGVmaW5lIEFENzc0Nl9WVFNFVFVQX1ZUTURfSU5UX1RFTVAJKDAgPDwgNSkKKyNkZWZpbmUgQUQ3NzQ2X1ZUU0VUVVBfVlRNRF9FWFRfVEVNUAkoMSA8PCA1KQorI2RlZmluZSBBRDc3NDZfVlRTRVRVUF9WVE1EX1ZERF9NT04JKDIgPDwgNSkKKyNkZWZpbmUgQUQ3NzQ2X1ZUU0VUVVBfVlRNRF9FWFRfVklOCSgzIDw8IDUpCisjZGVmaW5lIEFENzc0Nl9WVFNFVFVQX0VYVFJFRgkJKDEgPDwgNCkKKyNkZWZpbmUgQUQ3NzQ2X1ZUU0VUVVBfVlRTSE9SVAkJKDEgPDwgMSkKKyNkZWZpbmUgQUQ3NzQ2X1ZUU0VUVVBfVlRDSE9QCQkoMSA8PCAwKQorCisvKiBFeGNpdGF0aW9uIFNldHVwIFJlZ2lzdGVyIEJpdCBEZXNpZ25hdGlvbnMgKEFENzc0Nl9SRUdfRVhDX1NFVFVQKSAqLworI2RlZmluZSBBRDc3NDZfRVhDU0VUVVBfQ0xLQ1RSTAkJKDEgPDwgNykKKyNkZWZpbmUgQUQ3NzQ2X0VYQ1NFVFVQX0VYQ09OCQkoMSA8PCA2KQorI2RlZmluZSBBRDc3NDZfRVhDU0VUVVBfRVhDQgkJKDEgPDwgNSkKKyNkZWZpbmUgQUQ3NzQ2X0VYQ1NFVFVQX05FWENCCQkoMSA8PCA0KQorI2RlZmluZSBBRDc3NDZfRVhDU0VUVVBfRVhDQQkJKDEgPDwgMykKKyNkZWZpbmUgQUQ3NzQ2X0VYQ1NFVFVQX05FWENBCQkoMSA8PCAyKQorI2RlZmluZSBBRDc3NDZfRVhDU0VUVVBfRVhDTFZMKHgpCSgoKHgpICYgMHgzKSA8PCAwKQorCisvKiBDb25maWcgUmVnaXN0ZXIgQml0IERlc2lnbmF0aW9ucyAoQUQ3NzQ2X1JFR19DRkcpICovCisjZGVmaW5lIEFENzc0Nl9DT05GX1ZURlMoeCkJCSgoeCkgPDwgNikKKyNkZWZpbmUgQUQ3NzQ2X0NPTkZfQ0FQRlMoeCkJCSgoeCkgPDwgMykKKyNkZWZpbmUgQUQ3NzQ2X0NPTkZfTU9ERV9JRExFCQkoMCA8PCAwKQorI2RlZmluZSBBRDc3NDZfQ09ORl9NT0RFX0NPTlRfQ09OVgkoMSA8PCAwKQorI2RlZmluZSBBRDc3NDZfQ09ORl9NT0RFX1NJTkdMRV9DT05WCSgyIDw8IDApCisjZGVmaW5lIEFENzc0Nl9DT05GX01PREVfUFdSRE4JCSgzIDw8IDApCisjZGVmaW5lIEFENzc0Nl9DT05GX01PREVfT0ZGU19DQUwJKDUgPDwgMCkKKyNkZWZpbmUgQUQ3NzQ2X0NPTkZfTU9ERV9HQUlOX0NBTAkoNiA8PCAwKQorCisvKiBDQVBEQUMgUmVnaXN0ZXIgQml0IERlc2lnbmF0aW9ucyAoQUQ3NzQ2X1JFR19DQVBEQUN4KSAqLworI2RlZmluZSBBRDc3NDZfQ0FQREFDX0RBQ0VOCQkoMSA8PCA3KQorI2RlZmluZSBBRDc3NDZfQ0FQREFDX0RBQ1AoeCkJCSgoeCkgJiAweDdGKQorCisvKgorICogc3RydWN0IGFkNzc0Nl9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmMgaW5mb3JtYXRpb24KKyAqLworCitzdHJ1Y3QgYWQ3NzQ2X2NoaXBfaW5mbyB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwkvKgorCSAqIENhcGFjaXRpdmUgY2hhbm5lbCBkaWdpdGFsIGZpbHRlciBzZXR1cDsKKwkgKiBjb252ZXJzaW9uIHRpbWUvdXBkYXRlIHJhdGUgc2V0dXAgcGVyIGNoYW5uZWwKKwkgKi8KKwl1OAljb25maWc7CisJdTgJY2FwX3NldHVwOworCXU4CXZ0X3NldHVwOworCXU4CWNhcGRhY1syXVsyXTsKKwlzOAljYXBkYWNfc2V0OworfTsKKworZW51bSBhZDc3NDZfY2hhbiB7CisJVklOLAorCVZJTl9WREQsCisJVEVNUF9JTlQsCisJVEVNUF9FWFQsCisJQ0lOMSwKKwlDSU4xX0RJRkYsCisJQ0lOMiwKKwlDSU4yX0RJRkYsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgYWQ3NzQ2X2NoYW5uZWxzW10gPSB7CisJW1ZJTl0gPSB7CisJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCS5pbmRleGVkID0gMSwKKwkJLmNoYW5uZWwgPSAwLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkuYWRkcmVzcyA9IEFENzc0Nl9SRUdfVlRfREFUQV9ISUdIIDw8IDggfAorCQkJQUQ3NzQ2X1ZUU0VUVVBfVlRNRF9FWFRfVklOLAorCX0sCisJW1ZJTl9WRERdID0geworCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkuaW5kZXhlZCA9IDEsCisJCS5jaGFubmVsID0gMSwKKwkJLmV4dGVuZF9uYW1lID0gInN1cHBseSIsCisJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCisJCS5hZGRyZXNzID0gQUQ3NzQ2X1JFR19WVF9EQVRBX0hJR0ggPDwgOCB8CisJCQlBRDc3NDZfVlRTRVRVUF9WVE1EX1ZERF9NT04sCisJfSwKKwlbVEVNUF9JTlRdID0geworCQkudHlwZSA9IElJT19URU1QLAorCQkuaW5kZXhlZCA9IDEsCisJCS5jaGFubmVsID0gMCwKKwkJLnByb2Nlc3NlZF92YWwgPSBJSU9fUFJPQ0VTU0VELAorCQkuYWRkcmVzcyA9IEFENzc0Nl9SRUdfVlRfREFUQV9ISUdIIDw8IDggfAorCQkJQUQ3NzQ2X1ZUU0VUVVBfVlRNRF9JTlRfVEVNUCwKKwl9LAorCVtURU1QX0VYVF0gPSB7CisJCS50eXBlID0gSUlPX1RFTVAsCisJCS5pbmRleGVkID0gMSwKKwkJLmNoYW5uZWwgPSAxLAorCQkucHJvY2Vzc2VkX3ZhbCA9IElJT19QUk9DRVNTRUQsCisJCS5hZGRyZXNzID0gQUQ3NzQ2X1JFR19WVF9EQVRBX0hJR0ggPDwgOCB8CisJCQlBRDc3NDZfVlRTRVRVUF9WVE1EX0VYVF9URU1QLAorCX0sCisJW0NJTjFdID0geworCQkudHlwZSA9IElJT19DQVBBQ0lUQU5DRSwKKwkJLmluZGV4ZWQgPSAxLAorCQkuY2hhbm5lbCA9IDAsCisJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCU0NBTEVfU0VQQVJBVEUpIHwKKwkJKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQkJJQVNfU0hBUkVEKSB8CisJCSgxIDw8IElJT19DSEFOX0lORk9fT0ZGU0VUX1NFUEFSQVRFKSB8CisJCSgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKKwkJLmFkZHJlc3MgPSBBRDc3NDZfUkVHX0NBUF9EQVRBX0hJR0ggPDwgOCwKKwl9LAorCVtDSU4xX0RJRkZdID0geworCQkudHlwZSA9IElJT19DQVBBQ0lUQU5DRSwKKwkJLmRpZmZlcmVudGlhbCA9IDEsCisJCS5pbmRleGVkID0gMSwKKwkJLmNoYW5uZWwgPSAwLAorCQkuY2hhbm5lbDIgPSAyLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQlNDQUxFX1NFUEFSQVRFKSB8CisJCSgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NIQVJFRCkgfAorCQkoMSA8PCBJSU9fQ0hBTl9JTkZPX09GRlNFVF9TRVBBUkFURSkgfAorCQkoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCisJCS5hZGRyZXNzID0gQUQ3NzQ2X1JFR19DQVBfREFUQV9ISUdIIDw8IDggfAorCQkJQUQ3NzQ2X0NBUFNFVFVQX0NBUERJRkYKKwl9LAorCVtDSU4yXSA9IHsKKwkJLnR5cGUgPSBJSU9fQ0FQQUNJVEFOQ0UsCisJCS5pbmRleGVkID0gMSwKKwkJLmNoYW5uZWwgPSAxLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQlNDQUxFX1NFUEFSQVRFKSB8CisJCSgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NIQVJFRCkgfAorCQkoMSA8PCBJSU9fQ0hBTl9JTkZPX09GRlNFVF9TRVBBUkFURSkgfAorCQkoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCisJCS5hZGRyZXNzID0gQUQ3NzQ2X1JFR19DQVBfREFUQV9ISUdIIDw8IDggfAorCQkJQUQ3NzQ2X0NBUFNFVFVQX0NJTjIsCisJfSwKKwlbQ0lOMl9ESUZGXSA9IHsKKwkJLnR5cGUgPSBJSU9fQ0FQQUNJVEFOQ0UsCisJCS5kaWZmZXJlbnRpYWwgPSAxLAorCQkuaW5kZXhlZCA9IDEsCisJCS5jaGFubmVsID0gMSwKKwkJLmNoYW5uZWwyID0gMywKKwkJLmluZm9fbWFzayA9ICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJTQ0FMRV9TRVBBUkFURSkgfAorCQkoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TSEFSRUQpIHwKKwkJKDEgPDwgSUlPX0NIQU5fSU5GT19PRkZTRVRfU0VQQVJBVEUpIHwKKwkJKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkuYWRkcmVzcyA9IEFENzc0Nl9SRUdfQ0FQX0RBVEFfSElHSCA8PCA4IHwKKwkJCUFENzc0Nl9DQVBTRVRVUF9DQVBESUZGIHwgQUQ3NzQ2X0NBUFNFVFVQX0NJTjIsCisJfQorfTsKKworLyogVmFsdWVzIGFyZSBVcGRhdGUgUmF0ZSAoSHopLCBDb252ZXJzaW9uIFRpbWUgKG1zKSArIDEqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYWQ3NzQ2X3Z0X2ZpbHRlcl9yYXRlX3RhYmxlW11bMl0gPSB7CisJezUwLCAyMCArIDF9LCB7MzEsIDMyICsgMX0sIHsxNiwgNjIgKyAxfSwgezgsIDEyMiArIDF9LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgYWQ3NzQ2X2NhcF9maWx0ZXJfcmF0ZV90YWJsZVtdWzJdID0geworCXs5MSwgMTEgKyAxfSwgezg0LCAxMiArIDF9LCB7NTAsIDIwICsgMX0sIHsyNiwgMzggKyAxfSwKKwl7MTYsIDYyICsgMX0sIHsxMywgNzcgKyAxfSwgezExLCA5MiArIDF9LCB7OSwgMTEwICsgMX0sCit9OworCitzdGF0aWMgaW50IGFkNzc0Nl9zZWxlY3RfY2hhbm5lbChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuKQoreworCXN0cnVjdCBhZDc3NDZfY2hpcF9pbmZvICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0LCBkZWxheTsKKwl1OCB2dF9zZXR1cCwgY2FwX3NldHVwOworCisJc3dpdGNoIChjaGFuLT50eXBlKSB7CisJY2FzZSBJSU9fQ0FQQUNJVEFOQ0U6CisJCWNhcF9zZXR1cCA9IChjaGFuLT5hZGRyZXNzICYgMHhGRikgfCBBRDc3NDZfQ0FQU0VUVVBfQ0FQRU47CisJCXZ0X3NldHVwID0gY2hpcC0+dnRfc2V0dXAgJiB+QUQ3NzQ2X1ZUU0VUVVBfVlRFTjsKKwkJZGVsYXkgPSBhZDc3NDZfY2FwX2ZpbHRlcl9yYXRlX3RhYmxlWyhjaGlwLT5jb25maWcgPj4gMykgJgorCQkJMHg3XVsxXTsKKworCQlpZiAoY2hpcC0+Y2FwZGFjX3NldCAhPSBjaGFuLT5jaGFubmVsKSB7CisJCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwKKwkJCQlBRDc3NDZfUkVHX0NBUERBQ0EsCisJCQkJY2hpcC0+Y2FwZGFjW2NoYW4tPmNoYW5uZWxdWzBdKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwKKwkJCQlBRDc3NDZfUkVHX0NBUERBQ0IsCisJCQkJY2hpcC0+Y2FwZGFjW2NoYW4tPmNoYW5uZWxdWzFdKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisKKwkJCWNoaXAtPmNhcGRhY19zZXQgPSBjaGFuLT5jaGFubmVsOworCQl9CisJCWJyZWFrOworCWNhc2UgSUlPX1ZPTFRBR0U6CisJY2FzZSBJSU9fVEVNUDoKKwkJdnRfc2V0dXAgPSAoY2hhbi0+YWRkcmVzcyAmIDB4RkYpIHwgQUQ3NzQ2X1ZUU0VUVVBfVlRFTjsKKwkJY2FwX3NldHVwID0gY2hpcC0+Y2FwX3NldHVwICYgfkFENzc0Nl9DQVBTRVRVUF9DQVBFTjsKKwkJZGVsYXkgPSBhZDc3NDZfY2FwX2ZpbHRlcl9yYXRlX3RhYmxlWyhjaGlwLT5jb25maWcgPj4gNikgJgorCQkJMHgzXVsxXTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNoaXAtPmNhcF9zZXR1cCAhPSBjYXBfc2V0dXApIHsKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjaGlwLT5jbGllbnQsCisJCQkJCQlBRDc3NDZfUkVHX0NBUF9TRVRVUCwKKwkJCQkJCWNhcF9zZXR1cCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQljaGlwLT5jYXBfc2V0dXAgPSBjYXBfc2V0dXA7CisJfQorCisJaWYgKGNoaXAtPnZ0X3NldHVwICE9IHZ0X3NldHVwKSB7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2hpcC0+Y2xpZW50LAorCQkJCQkJQUQ3NzQ2X1JFR19WVF9TRVRVUCwKKwkJCQkJCXZ0X3NldHVwKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCWNoaXAtPnZ0X3NldHVwID0gdnRfc2V0dXA7CisJfQorCisJcmV0dXJuIGRlbGF5OworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgYWQ3NzQ2X3N0YXJ0X2NhbGliKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgY29uc3QgY2hhciAqYnVmLAorCQkJCQkgc2l6ZV90IGxlbiwKKwkJCQkJIHU4IHJlZ3ZhbCkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzc0Nl9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWJvb2wgZG9pdDsKKwlpbnQgcmV0LCB0aW1lb3V0ID0gMTA7CisKKwlyZXQgPSBzdHJ0b2Jvb2woYnVmLCAmZG9pdCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoIWRvaXQpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJcmVndmFsIHw9IGNoaXAtPmNvbmZpZzsKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwgQUQ3NzQ2X1JFR19DRkcsIHJlZ3ZhbCk7CisJaWYgKHJldCA8IDApIHsKKwkJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkbyB7CisJCW1zbGVlcCgyMCk7CisJCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjaGlwLT5jbGllbnQsIEFENzc0Nl9SRUdfQ0ZHKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfSB3aGlsZSAoKHJldCA9PSByZWd2YWwpICYmIHRpbWVvdXQtLSk7CisKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3NzQ2X3N0YXJ0X29mZnNldF9jYWxpYihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQgPSBhZDc3NDZfc2VsZWN0X2NoYW5uZWwoaW5kaW9fZGV2LAorCQkJICAgICAgJmFkNzc0Nl9jaGFubmVsc1t0b19paW9fZGV2X2F0dHIoYXR0ciktPmFkZHJlc3NdKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBhZDc3NDZfc3RhcnRfY2FsaWIoZGV2LCBhdHRyLCBidWYsIGxlbiwKKwkJCQkgIEFENzc0Nl9DT05GX01PREVfT0ZGU19DQUwpOworfQorCitzdGF0aWMgc3NpemVfdCBhZDc3NDZfc3RhcnRfZ2Fpbl9jYWxpYihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgICBjb25zdCBjaGFyICpidWYsCisJCQkJICAgICAgIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQgPSBhZDc3NDZfc2VsZWN0X2NoYW5uZWwoaW5kaW9fZGV2LAorCQkJICAgICAgJmFkNzc0Nl9jaGFubmVsc1t0b19paW9fZGV2X2F0dHIoYXR0ciktPmFkZHJlc3NdKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBhZDc3NDZfc3RhcnRfY2FsaWIoZGV2LCBhdHRyLCBidWYsIGxlbiwKKwkJCQkgIEFENzc0Nl9DT05GX01PREVfR0FJTl9DQUwpOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluX2NhcGFjaXRhbmNlMF9jYWxpYmJpYXNfY2FsaWJyYXRpb24sCisJCSAgICAgICBTX0lXVVNSLCBOVUxMLCBhZDc3NDZfc3RhcnRfb2Zmc2V0X2NhbGliLCBDSU4xKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW5fY2FwYWNpdGFuY2UxX2NhbGliYmlhc19jYWxpYnJhdGlvbiwKKwkJICAgICAgIFNfSVdVU1IsIE5VTEwsIGFkNzc0Nl9zdGFydF9vZmZzZXRfY2FsaWIsIENJTjIpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihpbl9jYXBhY2l0YW5jZTBfY2FsaWJzY2FsZV9jYWxpYnJhdGlvbiwKKwkJICAgICAgIFNfSVdVU1IsIE5VTEwsIGFkNzc0Nl9zdGFydF9nYWluX2NhbGliLCBDSU4xKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW5fY2FwYWNpdGFuY2UxX2NhbGlic2NhbGVfY2FsaWJyYXRpb24sCisJCSAgICAgICBTX0lXVVNSLCBOVUxMLCBhZDc3NDZfc3RhcnRfZ2Fpbl9jYWxpYiwgQ0lOMik7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluX3ZvbHRhZ2UwX2NhbGlic2NhbGVfY2FsaWJyYXRpb24sCisJCSAgICAgICBTX0lXVVNSLCBOVUxMLCBhZDc3NDZfc3RhcnRfZ2Fpbl9jYWxpYiwgVklOKTsKKworc3RhdGljIHNzaXplX3QgYWQ3NzQ2X3Nob3dfY2FwX2ZpbHRlcl9yYXRlX3NldHVwKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNzc0Nl9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGFkNzc0Nl9jYXBfZmlsdGVyX3JhdGVfdGFibGVbCisJCQkoY2hpcC0+Y29uZmlnID4+IDMpICYgMHg3XVswXSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNzc0Nl9zdG9yZV9jYXBfZmlsdGVyX3JhdGVfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzQ2X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJdTggZGF0YTsKKwlpbnQgcmV0LCBpOworCisJcmV0ID0ga3N0cnRvdTgoYnVmLCAxMCwgJmRhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWQ3NzQ2X2NhcF9maWx0ZXJfcmF0ZV90YWJsZSk7IGkrKykKKwkJaWYgKGRhdGEgPj0gYWQ3NzQ2X2NhcF9maWx0ZXJfcmF0ZV90YWJsZVtpXVswXSkKKwkJCWJyZWFrOworCisJaWYgKGkgPj0gQVJSQVlfU0laRShhZDc3NDZfY2FwX2ZpbHRlcl9yYXRlX3RhYmxlKSkKKwkJaSA9IEFSUkFZX1NJWkUoYWQ3NzQ2X2NhcF9maWx0ZXJfcmF0ZV90YWJsZSkgLSAxOworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJY2hpcC0+Y29uZmlnICY9IH5BRDc3NDZfQ09ORl9DQVBGUygweDcpOworCWNoaXAtPmNvbmZpZyB8PSBBRDc3NDZfQ09ORl9DQVBGUyhpKTsKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWQ3NzQ2X3Nob3dfdnRfZmlsdGVyX3JhdGVfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzQ2X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgYWQ3NzQ2X3Z0X2ZpbHRlcl9yYXRlX3RhYmxlWworCQkJKGNoaXAtPmNvbmZpZyA+PiA2KSAmIDB4M11bMF0pOworfQorCitzdGF0aWMgc3NpemVfdCBhZDc3NDZfc3RvcmVfdnRfZmlsdGVyX3JhdGVfc2V0dXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY29uc3QgY2hhciAqYnVmLAorCQlzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ3NzQ2X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJdTggZGF0YTsKKwlpbnQgcmV0LCBpOworCisJcmV0ID0ga3N0cnRvdTgoYnVmLCAxMCwgJmRhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWQ3NzQ2X3Z0X2ZpbHRlcl9yYXRlX3RhYmxlKTsgaSsrKQorCQlpZiAoZGF0YSA+PSBhZDc3NDZfdnRfZmlsdGVyX3JhdGVfdGFibGVbaV1bMF0pCisJCQlicmVhazsKKworCWlmIChpID49IEFSUkFZX1NJWkUoYWQ3NzQ2X3Z0X2ZpbHRlcl9yYXRlX3RhYmxlKSkKKwkJaSA9IEFSUkFZX1NJWkUoYWQ3NzQ2X3Z0X2ZpbHRlcl9yYXRlX3RhYmxlKSAtIDE7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwljaGlwLT5jb25maWcgJj0gfkFENzc0Nl9DT05GX1ZURlMoMHgzKTsKKwljaGlwLT5jb25maWcgfD0gQUQ3NzQ2X0NPTkZfVlRGUyhpKTsKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihpbl9jYXBhY2l0YW5jZV9zYW1wbGluZ19mcmVxdWVuY3ksCisJCSAgICAgICBTX0lSVUdPIHwgU19JV1VTUiwgYWQ3NzQ2X3Nob3dfY2FwX2ZpbHRlcl9yYXRlX3NldHVwLAorCQkJYWQ3NzQ2X3N0b3JlX2NhcF9maWx0ZXJfcmF0ZV9zZXR1cCwgMCk7CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW5fdm9sdGFnZV9zYW1wbGluZ19mcmVxdWVuY3ksCisJCSAgICAgICBTX0lSVUdPIHwgU19JV1VTUiwgYWQ3NzQ2X3Nob3dfdnRfZmlsdGVyX3JhdGVfc2V0dXAsCisJCSAgICAgICBhZDc3NDZfc3RvcmVfdnRfZmlsdGVyX3JhdGVfc2V0dXAsIDApOworCitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaW5fdm9sdGFnZV9zYW1wbGluZ19mcmVxdWVuY3lfYXZhaWxhYmxlLCAiNTAgMzEgMTYgOCIpOworc3RhdGljIElJT19DT05TVF9BVFRSKGluX2NhcGFjaXRhbmNlX3NhbXBsaW5nX2ZyZXF1ZW5jeV9hdmFpbGFibGUsCisJCSAgICAgICAiOTEgODQgNTAgMjYgMTYgMTMgMTEgOSIpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ3NzQ2X2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2Rldl9hdHRyX2luX2NhcGFjaXRhbmNlX3NhbXBsaW5nX2ZyZXF1ZW5jeS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fdm9sdGFnZV9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX2NhcGFjaXRhbmNlMF9jYWxpYmJpYXNfY2FsaWJyYXRpb24uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX2NhcGFjaXRhbmNlMF9jYWxpYnNjYWxlX2NhbGlicmF0aW9uLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbl9jYXBhY2l0YW5jZTFfY2FsaWJzY2FsZV9jYWxpYnJhdGlvbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fY2FwYWNpdGFuY2UxX2NhbGliYmlhc19jYWxpYnJhdGlvbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fdm9sdGFnZTBfY2FsaWJzY2FsZV9jYWxpYnJhdGlvbi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbl92b2x0YWdlX3NhbXBsaW5nX2ZyZXF1ZW5jeV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5fY2FwYWNpdGFuY2Vfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS4KKwlkZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDc3NDZfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNzc0Nl9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBhZDc3NDZfd3JpdGVfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICAgaW50IHZhbCwKKwkJCSAgICBpbnQgdmFsMiwKKwkJCSAgICBsb25nIG1hc2spCit7CisJc3RydWN0IGFkNzc0Nl9jaGlwX2luZm8gKmNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQsIHJlZzsKKworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCU0NBTEVfU0VQQVJBVEUpOgorCQlpZiAodmFsICE9IDEpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXZhbCA9ICh2YWwyICogMTAyNCkgLyAxNTYyNTsKKworCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBJSU9fQ0FQQUNJVEFOQ0U6CisJCQlyZWcgPSBBRDc3NDZfUkVHX0NBUF9HQUlOSDsKKwkJCWJyZWFrOworCQljYXNlIElJT19WT0xUQUdFOgorCQkJcmVnID0gQUQ3NzQ2X1JFR19WT0xUX0dBSU5IOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNoaXAtPmNsaWVudCwgcmVnLCBzd2FiMTYodmFsKSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TSEFSRUQpOgorCQlpZiAoKHZhbCA8IDApIHwgKHZhbCA+IDB4RkZGRikpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNoaXAtPmNsaWVudCwKKwkJCQlBRDc3NDZfUkVHX0NBUF9PRkZILCBzd2FiMTYodmFsKSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX09GRlNFVF9TRVBBUkFURSk6CisJCWlmICgodmFsIDwgMCkgfCAodmFsID4gNDMwMDgwMDApKSB7IC8qIDIxcEYgKi8KKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIENBUERBQyBTY2FsZSA9IDIxcEZfdHlwIC8gMTI3CisJCSAqIENJTiBTY2FsZSA9IDguMTkycEYgLyAyXjI0CisJCSAqIE9mZnNldCBTY2FsZSA9IENBUERBQyBTY2FsZSAvIENJTiBTY2FsZSA9IDMzODY0NgorCQkgKiAqLworCisJCXZhbCAvPSAzMzg2NDY7CisKKwkJY2hpcC0+Y2FwZGFjW2NoYW4tPmNoYW5uZWxdW2NoYW4tPmRpZmZlcmVudGlhbF0gPSAodmFsID4gMCA/CisJCQlBRDc3NDZfQ0FQREFDX0RBQ1AodmFsKSB8IEFENzc0Nl9DQVBEQUNfREFDRU4gOiAwKTsKKworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwKKwkJCUFENzc0Nl9SRUdfQ0FQREFDQSwKKwkJCWNoaXAtPmNhcGRhY1tjaGFuLT5jaGFubmVsXVswXSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2hpcC0+Y2xpZW50LAorCQkJQUQ3NzQ2X1JFR19DQVBEQUNCLAorCQkJY2hpcC0+Y2FwZGFjW2NoYW4tPmNoYW5uZWxdWzFdKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKworCQljaGlwLT5jYXBkYWNfc2V0ID0gY2hhbi0+Y2hhbm5lbDsKKworCQlyZXQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworb3V0OgorCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZDc3NDZfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCSAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgaW50ICp2YWwsIGludCAqdmFsMiwKKwkJCSAgIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgYWQ3NzQ2X2NoaXBfaW5mbyAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldCwgZGVsYXk7CisJdTggcmVndmFsLCByZWc7CisKKwl1bmlvbiB7CisJCXUzMiBkMzI7CisJCXU4IGQ4WzRdOworCX0gZGF0YTsKKworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSAwOgorCQlyZXQgPSBhZDc3NDZfc2VsZWN0X2NoYW5uZWwoaW5kaW9fZGV2LCBjaGFuKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwkJZGVsYXkgPSByZXQ7CisKKwkJcmVndmFsID0gY2hpcC0+Y29uZmlnIHwgQUQ3NzQ2X0NPTkZfTU9ERV9TSU5HTEVfQ09OVjsKKwkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjaGlwLT5jbGllbnQsIEFENzc0Nl9SRUdfQ0ZHLAorCQkJCXJlZ3ZhbCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJbXNsZWVwKGRlbGF5KTsKKwkJLyogTm93IHJlYWQgdGhlIGFjdHVhbCByZWdpc3RlciAqLworCisJCXJldCA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKGNoaXAtPmNsaWVudCwKKwkJCWNoYW4tPmFkZHJlc3MgPj4gOCwgMywgJmRhdGEuZDhbMV0pOworCisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJKnZhbCA9IChiZTMyX3RvX2NwdShkYXRhLmQzMikgJiAweEZGRkZGRikgLSAweDgwMDAwMDsKKworCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBJSU9fVEVNUDoKKwkJLyogdGVtcGVyYXR1cmUgaW4gbWlsbGkgZGVncmVlcyBDZWxzaXVzCisJCSAqIFQgPSAoKCp2YWwgLyAyMDQ4KSAtIDQwOTYpICogMTAwMAorCQkgKi8KKwkJCSp2YWwgPSAoKnZhbCAqIDEyNSkgLyAyNTY7CisJCQlicmVhazsKKwkJY2FzZSBJSU9fVk9MVEFHRToKKwkJCWlmIChjaGFuLT5jaGFubmVsID09IDEpIC8qIHN1cHBseV9yYXcqLworCQkJCSp2YWwgPSAqdmFsICogNjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQlyZXQgPSBJSU9fVkFMX0lOVDsKKwkJYnJlYWs7CisJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCU0NBTEVfU0VQQVJBVEUpOgorCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBJSU9fQ0FQQUNJVEFOQ0U6CisJCQlyZWcgPSBBRDc3NDZfUkVHX0NBUF9HQUlOSDsKKwkJCWJyZWFrOworCQljYXNlIElJT19WT0xUQUdFOgorCQkJcmVnID0gQUQ3NzQ2X1JFR19WT0xUX0dBSU5IOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2hpcC0+Y2xpZW50LCByZWcpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCQkvKiAxICsgZ2Fpbl92YWwgLyAyXjE2ICovCisJCSp2YWwgPSAxOworCQkqdmFsMiA9ICgxNTYyNSAqIHN3YWIxNihyZXQpKSAvIDEwMjQ7CisKKwkJcmV0ID0gSUlPX1ZBTF9JTlRfUExVU19NSUNSTzsKKwkJYnJlYWs7CisJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TSEFSRUQpOgorCQlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2hpcC0+Y2xpZW50LAorCQkJCQkgICAgICAgQUQ3NzQ2X1JFR19DQVBfT0ZGSCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJCSp2YWwgPSBzd2FiMTYocmV0KTsKKworCQlyZXQgPSBJSU9fVkFMX0lOVDsKKwkJYnJlYWs7CisJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX09GRlNFVF9TRVBBUkFURSk6CisJCSp2YWwgPSBBRDc3NDZfQ0FQREFDX0RBQ1AoY2hpcC0+Y2FwZGFjW2NoYW4tPmNoYW5uZWxdCisJCQlbY2hhbi0+ZGlmZmVyZW50aWFsXSkgKiAzMzg2NDY7CisKKwkJcmV0ID0gSUlPX1ZBTF9JTlQ7CisJCWJyZWFrOworCWNhc2UgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpOgorCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBJSU9fQ0FQQUNJVEFOQ0U6CisJCQkvKiA4LjE5MnBmIC8gMl4yNCAqLworCQkJKnZhbDIgPSA0ODg7CisJCQkqdmFsID0gIDA7CisJCQlicmVhazsKKwkJY2FzZSBJSU9fVk9MVEFHRToKKwkJCS8qIDExNzBtViAvIDJeMjMgKi8KKwkJCSp2YWwyID0gMTM5NDc1OworCQkJKnZhbCA9ICAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAgLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJcmV0ID0gSUlPX1ZBTF9JTlRfUExVU19OQU5POworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX07CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkNzc0Nl9pbmZvID0geworCS5hdHRycyA9ICZhZDc3NDZfYXR0cmlidXRlX2dyb3VwLAorCS5yZWFkX3JhdyA9ICZhZDc3NDZfcmVhZF9yYXcsCisJLndyaXRlX3JhdyA9ICZhZDc3NDZfd3JpdGVfcmF3LAorCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCit9OworCisvKgorICogZGV2aWNlIHByb2JlIGFuZCByZW1vdmUKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDc3NDZfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBhZDc3NDZfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBhZDc3NDZfY2hpcF9pbmZvICpjaGlwOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgY2hhciByZWd2YWwgPSAwOworCisJaW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZShzaXplb2YoKmNoaXApKTsKKwlpZiAoaW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCWNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCS8qIHRoaXMgaXMgb25seSB1c2VkIGZvciBkZXZpY2UgcmVtb3ZhbCBwdXJwb3NlcyAqLworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGluZGlvX2Rldik7CisKKwljaGlwLT5jbGllbnQgPSBjbGllbnQ7CisJY2hpcC0+Y2FwZGFjX3NldCA9IC0xOworCisJLyogRXN0YWJsaXNoIHRoYXQgdGhlIGlpb19kZXYgaXMgYSBjaGlsZCBvZiB0aGUgaTJjIGRldmljZSAqLworCWluZGlvX2Rldi0+bmFtZSA9IGlkLT5uYW1lOworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKKwlpbmRpb19kZXYtPmluZm8gPSAmYWQ3NzQ2X2luZm87CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGFkNzc0Nl9jaGFubmVsczsKKwlpZiAoaWQtPmRyaXZlcl9kYXRhID09IDc3NDYpCisJCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShhZDc3NDZfY2hhbm5lbHMpOworCWVsc2UKKwkJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSAgQVJSQVlfU0laRShhZDc3NDZfY2hhbm5lbHMpIC0gMjsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoYWQ3NzQ2X2NoYW5uZWxzKTsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlpZiAocGRhdGEpIHsKKwkJaWYgKHBkYXRhLT5leGNhX2VuKSB7CisJCQlpZiAocGRhdGEtPmV4Y2FfaW52X2VuKQorCQkJCXJlZ3ZhbCB8PSBBRDc3NDZfRVhDU0VUVVBfTkVYQ0E7CisJCQllbHNlCisJCQkJcmVndmFsIHw9IEFENzc0Nl9FWENTRVRVUF9FWENBOworCQl9CisKKwkJaWYgKHBkYXRhLT5leGNiX2VuKSB7CisJCQlpZiAocGRhdGEtPmV4Y2JfaW52X2VuKQorCQkJCXJlZ3ZhbCB8PSBBRDc3NDZfRVhDU0VUVVBfTkVYQ0I7CisJCQllbHNlCisJCQkJcmVndmFsIHw9IEFENzc0Nl9FWENTRVRVUF9FWENCOworCQl9CisKKwkJcmVndmFsIHw9IEFENzc0Nl9FWENTRVRVUF9FWENMVkwocGRhdGEtPmV4Y2x2bCk7CisJfSBlbHNlIHsKKwkJZGV2X3dhcm4oJmNsaWVudC0+ZGV2LCAiTm8gcGxhdGZvcm0gZGF0YT8gdXNpbmcgZGVmYXVsdFxuIik7CisJCXJlZ3ZhbCA9IEFENzc0Nl9FWENTRVRVUF9FWENBIHwgQUQ3NzQ2X0VYQ1NFVFVQX0VYQ0IgfAorCQkJQUQ3NzQ2X0VYQ1NFVFVQX0VYQ0xWTCgzKTsKKwl9CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwKKwkJCQkJQUQ3NzQ2X1JFR19FWENfU0VUVVAsIHJlZ3ZhbCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKworCWRldl9pbmZvKCZjbGllbnQtPmRldiwgIiVzIGNhcGFjaXRpdmUgc2Vuc29yIHJlZ2lzdGVyZWRcbiIsIGlkLT5uYW1lKTsKKworCXJldHVybiAwOworCitlcnJvcl9mcmVlX2RldjoKKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDc3NDZfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkNzc0Nl9pZFtdID0geworCXsgImFkNzc0NSIsIDc3NDUgfSwKKwl7ICJhZDc3NDYiLCA3NzQ2IH0sCisJeyAiYWQ3NzQ3IiwgNzc0NyB9LAorCXt9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgYWQ3NzQ2X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGFkNzc0Nl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKKwl9LAorCS5wcm9iZSA9IGFkNzc0Nl9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWQ3NzQ2X3JlbW92ZSksCisJLmlkX3RhYmxlID0gYWQ3NzQ2X2lkLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWQ3NzQ2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmFkNzc0Nl9kcml2ZXIpOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgYWQ3NzQ2X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmYWQ3NzQ2X2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIk1pY2hhZWwgSGVubmVyaWNoIDxoZW5uZXJpY2hAYmxhY2tmaW4udWNsaW51eC5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFENzc0Ni81LzcgY2FwYWNpdGl2ZSBzZW5zb3IgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisKK21vZHVsZV9pbml0KGFkNzc0Nl9pbml0KTsKK21vZHVsZV9leGl0KGFkNzc0Nl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vY2RjL2FkNzc0Ni5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9jZGMvYWQ3NzQ2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE4NTcyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vY2RjL2FkNzc0Ni5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBBRDc3NDYgY2FwYWNpdGl2ZSBzZW5zb3IgZHJpdmVyIHN1cHBvcnRpbmcgQUQ3NzQ1LCBBRDc3NDYgYW5kIEFENzc0NworICoKKyAqIENvcHlyaWdodCAyMDExIEFuYWxvZyBEZXZpY2VzIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMLTIuCisgKi8KKworI2lmbmRlZiBJSU9fQ0RDX0FENzc0Nl9IXworI2RlZmluZSBJSU9fQ0RDX0FENzc0Nl9IXworCisvKgorICogVE9ETzogc3RydWN0IGFkNzc0Nl9wbGF0Zm9ybV9kYXRhIG5lZWRzIHRvIGdvIGludG8gaW5jbHVkZS9saW51eC9paW8KKyAqLworCisjZGVmaW5lIEFENzQ2Nl9FWENMVkxfMAkJMCAvKiArLVZERC84ICovCisjZGVmaW5lIEFENzQ2Nl9FWENMVkxfMQkJMSAvKiArLVZERC80ICovCisjZGVmaW5lIEFENzQ2Nl9FWENMVkxfMgkJMiAvKiArLVZERCAqIDMvOCAqLworI2RlZmluZSBBRDc0NjZfRVhDTFZMXzMJCTMgLyogKy1WREQvMiAqLworCitzdHJ1Y3QgYWQ3NzQ2X3BsYXRmb3JtX2RhdGEgeworCXVuc2lnbmVkIGNoYXIgZXhjbHZsOwkvKkV4Y2l0YXRpb24gVm9sdGFnZSBMZXZlbCAqLworCWJvb2wgZXhjYV9lbjsJCS8qIGVuYWJsZXMgRVhDQSBwaW4gYXMgdGhlIGV4Y2l0YXRpb24gb3V0cHV0ICovCisJYm9vbCBleGNhX2ludl9lbjsJLyogZW5hYmxlcyAvRVhDQSBwaW4gYXMgdGhlIGV4Y2l0YXRpb24gb3V0cHV0ICovCisJYm9vbCBleGNiX2VuOwkJLyogZW5hYmxlcyBFWENCIHBpbiBhcyB0aGUgZXhjaXRhdGlvbiBvdXRwdXQgKi8KKwlib29sIGV4Y2JfaW52X2VuOwkvKiBlbmFibGVzIC9FWENCIHBpbiBhcyB0aGUgZXhjaXRhdGlvbiBvdXRwdXQgKi8KK307CisKKyNlbmRpZiAvKiBJSU9fQ0RDX0FENzc0Nl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9jaHJkZXYuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vY2hyZGV2LmgKaW5kZXggM2UzMWVlNi4uZDhlNzM2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9jaHJkZXYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2NocmRldi5oCkBAIC05LDI2ICs5LDYgQEAKIAogI2lmbmRlZiBfSUlPX0NIUkRFVl9IXwogI2RlZmluZSBfSUlPX0NIUkRFVl9IXwotc3RydWN0IGlpb19kZXY7Ci0KLS8qKgotICogc3RydWN0IGlpb19oYW5kbGVyIC0gU3RydWN0dXJlIHVzZWQgdG8gc3BlY2lmeSBmaWxlIG9wZXJhdGlvbnMKLSAqCQkJZm9yIGEgcGFydGljdWxhciBjaHJkZXYKLSAqIEBjaHJkZXY6CWNoYXJhY3RlciBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAaWQ6CQl0aGUgbG9jYXRpb24gaW4gdGhlIGhhbmRsZXIgdGFibGUgLSB1c2VkIGZvciBkZWFsbG9jYXRpb24uCi0gKiBAZmxhZ3M6CWZpbGUgb3BlcmF0aW9ucyByZWxhdGVkIGZsYWdzIGluY2x1ZGluZyBidXN5IGZsYWcuCi0gKiBAcHJpdmF0ZToJaGFuZGxlciBzcGVjaWZpYyBkYXRhIHVzZWQgYnkgdGhlIGZpbGVvcHMgcmVnaXN0ZXJlZCB3aXRoCi0gKgkJdGhlIGNocmRldi4KLSAqLwotc3RydWN0IGlpb19oYW5kbGVyIHsKLQlzdHJ1Y3QgY2RldgljaHJkZXY7Ci0JaW50CQlpZDsKLQl1bnNpZ25lZCBsb25nCWZsYWdzOwotCXZvaWQJCSpwcml2YXRlOwotfTsKLQotI2RlZmluZSBpaW9fY2Rldl90b19oYW5kbGVyKGNkKQkJCQlcCi0JY29udGFpbmVyX29mKGNkLCBzdHJ1Y3QgaWlvX2hhbmRsZXIsIGNocmRldikKIAogLyoqCiAgKiBzdHJ1Y3QgaWlvX2V2ZW50X2RhdGEgLSBUaGUgYWN0dWFsIGV2ZW50IGJlaW5nIHB1c2hlZCB0byB1c2Vyc3BhY2UKQEAgLTM3LDM5ICsxNyw5IEBACiAgKgkJdGhlIGludGVycnVwdCBoYW5kbGVyKQogICovCiBzdHJ1Y3QgaWlvX2V2ZW50X2RhdGEgewotCWludAlpZDsKKwl1NjQJaWQ7CiAJczY0CXRpbWVzdGFtcDsKIH07CiAKLS8qKgotICogc3RydWN0IGlpb19kZXRlY3RlZF9ldmVudF9saXN0IC0gbGlzdCBlbGVtZW50IGZvciBldmVudHMgdGhhdCBoYXZlIG9jY3VycmVkCi0gKiBAbGlzdDoJCWxpbmtlZCBsaXN0IGhlYWRlcgotICogQGV2OgkJCXRoZSBldmVudCBpdHNlbGYKLSAqLwotc3RydWN0IGlpb19kZXRlY3RlZF9ldmVudF9saXN0IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQlsaXN0OwotCXN0cnVjdCBpaW9fZXZlbnRfZGF0YQkJZXY7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBpaW9fZXZlbnRfaW50ZXJmYWNlIC0gY2hyZGV2IGludGVyZmFjZSBmb3IgYW4gZXZlbnQgbGluZQotICogQGRldjoJCWRldmljZSBhc3NvY2F0ZWQgd2l0aCBldmVudCBpbnRlcmZhY2UKLSAqIEBoYW5kbGVyOgkJZmlsZW9wZXJhdGlvbnMgYW5kIHJlbGF0ZWQgY29udHJvbCBmb3IgdGhlIGNocmRldgotICogQHdhaXQ6CQl3YWl0IHF1ZXVlIHRvIGFsbG93IGJsb2NraW5nIHJlYWRzIG9mIGV2ZW50cwotICogQGV2ZW50X2xpc3RfbG9jazoJbXV0ZXggdG8gcHJvdGVjdCB0aGUgbGlzdCBvZiBkZXRlY3RlZCBldmVudHMKLSAqIEBkZXRfZXZlbnRzOgkJbGlzdCBvZiBkZXRlY3RlZCBldmVudHMKLSAqIEBtYXhfZXZlbnRzOgkJbWF4aW11bSBudW1iZXIgb2YgZXZlbnRzIGJlZm9yZSBuZXcgb25lcyBhcmUgZHJvcHBlZAotICogQGN1cnJlbnRfZXZlbnRzOgludW1iZXIgb2YgZXZlbnRzIGluIGRldGVjdGVkIGxpc3QKLSAqLwotc3RydWN0IGlpb19ldmVudF9pbnRlcmZhY2UgewotCXN0cnVjdCBkZXZpY2UJCQkJZGV2OwotCXN0cnVjdCBpaW9faGFuZGxlcgkJCWhhbmRsZXI7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3QJCQl3YWl0OwotCXN0cnVjdCBtdXRleAkJCQlldmVudF9saXN0X2xvY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJCWRldF9ldmVudHM7Ci0JaW50CQkJCQltYXhfZXZlbnRzOwotCWludAkJCQkJY3VycmVudF9ldmVudHM7Ci0Jc3RydWN0IGxpc3RfaGVhZCBkZXZfYXR0cl9saXN0OwotfTsKLQorI2RlZmluZSBJSU9fR0VUX0VWRU5UX0ZEX0lPQ1RMIF9JT1IoJ2knLCAweDkwLCBpbnQpCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9LY29uZmlnCmluZGV4IDdkZGFlMzUuLmZhYzg1NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvS2NvbmZpZwpAQCAtMSwxNCArMSwzNSBAQAogIwogIyBEQUMgZHJpdmVycwogIwotY29tbWVudCAiRGlnaXRhbCB0byBhbmFsb2cgY29udmVydG9ycyIKK21lbnUgIkRpZ2l0YWwgdG8gYW5hbG9nIGNvbnZlcnRlcnMiCisKK2NvbmZpZyBBRDUwNjQKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQUQ1MDY0LzY0LTEvNDQvMjQgREFDIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNQSQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRDUwNjQsIEFENTA2NC0xLAorCSAgQUQ1MDQ0LCBBRDUwMjQgRGlnaXRhbCB0byBBbmFsb2cgQ29udmVydGVyLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhZDUwNjQuCisKK2NvbmZpZyBBRDUzNjAKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQW5hbG9nIERldmljZXMgQUQ1MzYwLzYxLzYyLzYzLzcwLzcxLzczIERBQyBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEkKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQUQ1MzYwLCBBRDUzNjEsCisJICBBRDUzNjIsIEFENTM2MywgQUQ1MzcwLCBBRDUzNzEsIEFENTM3MyBtdWx0aS1jaGFubmVsCisJICBEaWdpdGFsIHRvIEFuYWxvZyBDb252ZXJ0ZXJzIChEQUMpLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIG1vZHVsZSBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCisJICBhZDUzNjAuCiAKIGNvbmZpZyBBRDU2MjRSX1NQSQogCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRDU2MjQvNDQvNjRSIERBQyBzcGkgZHJpdmVyIgogCWRlcGVuZHMgb24gU1BJCiAJaGVscAogCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEFENTYyNFIsIEFENTY0NFIgYW5kCi0JICBBRDU2NjRSIGNvbnZlcnRvcnMgKERBQykuIFRoaXMgZHJpdmVyIHVzZXMgdGhlIGNvbW1vbiBTUEkgaW50ZXJmYWNlLgorCSAgQUQ1NjY0UiBjb252ZXJ0ZXJzIChEQUMpLiBUaGlzIGRyaXZlciB1c2VzIHRoZSBjb21tb24gU1BJIGludGVyZmFjZS4KIAogY29uZmlnIEFENTQ0NgogCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBBRDU0NDQvNiwgQUQ1NjIwLzQwLzYwIGFuZCBBRDU1NDJBLzEyQSBEQUMgU1BJIGRyaXZlciIKQEAgLTYyLDMgKzgzLDUgQEAKIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgbWF4NTE3LgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL01ha2VmaWxlCmluZGV4IDdmNGYyZWQuLjA3YjZmNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL01ha2VmaWxlCkBAIC0yLDcgKzIsOSBAQAogIyBNYWtlZmlsZSBmb3IgaW5kdXN0cmlhbCBJL08gREFDIGRyaXZlcnMKICMKIAorb2JqLSQoQ09ORklHX0FENTM2MCkgKz0gYWQ1MzYwLm8KIG9iai0kKENPTkZJR19BRDU2MjRSX1NQSSkgKz0gYWQ1NjI0cl9zcGkubworb2JqLSQoQ09ORklHX0FENTA2NCkgKz0gYWQ1MDY0Lm8KIG9iai0kKENPTkZJR19BRDU1MDQpICs9IGFkNTUwNC5vCiBvYmotJChDT05GSUdfQUQ1NDQ2KSArPSBhZDU0NDYubwogb2JqLSQoQ09ORklHX0FENTc5MSkgKz0gYWQ1NzkxLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTA2NC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvYWQ1MDY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyNzlmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTA2NC5jCkBAIC0wLDAgKzEsNDYzIEBACisvKgorICogQUQ1MDY0LCBBRDUwNjQtMSwgQUQ1MDQ0LCBBRDUwMjQgRGlnaXRhbCB0byBhbmFsb2cgY29udmVydGVycyAgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTEgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICJkYWMuaCIKKworI2RlZmluZSBBRDUwNjRfREFDX0NIQU5ORUxTCQkJNAorCisjZGVmaW5lIEFENTA2NF9BRERSKHgpCQkJCSgoeCkgPDwgMjApCisjZGVmaW5lIEFENTA2NF9DTUQoeCkJCQkJKCh4KSA8PCAyNCkKKworI2RlZmluZSBBRDUwNjRfQUREUl9EQUMoY2hhbikJCQkoY2hhbikKKyNkZWZpbmUgQUQ1MDY0X0FERFJfQUxMX0RBQwkJCTB4RgorCisjZGVmaW5lIEFENTA2NF9DTURfV1JJVEVfSU5QVVRfTgkJMHgwCisjZGVmaW5lIEFENTA2NF9DTURfVVBEQVRFX0RBQ19OCQkJMHgxCisjZGVmaW5lIEFENTA2NF9DTURfV1JJVEVfSU5QVVRfTl9VUERBVEVfQUxMCTB4MgorI2RlZmluZSBBRDUwNjRfQ01EX1dSSVRFX0lOUFVUX05fVVBEQVRFX04JMHgzCisjZGVmaW5lIEFENTA2NF9DTURfUE9XRVJET1dOX0RBQwkJMHg0CisjZGVmaW5lIEFENTA2NF9DTURfQ0xFQVIJCQkweDUKKyNkZWZpbmUgQUQ1MDY0X0NNRF9MREFDX01BU0sJCQkweDYKKyNkZWZpbmUgQUQ1MDY0X0NNRF9SRVNFVAkJCTB4NworI2RlZmluZSBBRDUwNjRfQ01EX0RBSVNZX0NIQUlOX0VOQUJMRQkJMHg4CisKKyNkZWZpbmUgQUQ1MDY0X0xEQUNfUFdSRE5fTk9ORQkJCTB4MAorI2RlZmluZSBBRDUwNjRfTERBQ19QV1JETl8xSwkJCTB4MQorI2RlZmluZSBBRDUwNjRfTERBQ19QV1JETl8xMDBLCQkJMHgyCisjZGVmaW5lIEFENTA2NF9MREFDX1BXUkROXzNTVEFURQkJMHgzCisKKy8qKgorICogc3RydWN0IGFkNTA2NF9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmljIGluZm9ybWF0aW9uCisgKiBAc2hhcmVkX3ZyZWY6CXdoZXRoZXIgdGhlIHZyZWYgc3VwcGx5IGlzIHNoYXJlZCBiZXR3ZWVuIGNoYW5uZWxzCisgKiBAY2hhbm5lbDoJCWNoYW5uZWwgc3BlY2lmaWNhdGlvbgorKi8KKworc3RydWN0IGFkNTA2NF9jaGlwX2luZm8geworCWJvb2wgc2hhcmVkX3ZyZWY7CisJc3RydWN0IGlpb19jaGFuX3NwZWMgY2hhbm5lbFtBRDUwNjRfREFDX0NIQU5ORUxTXTsKK307CisKKy8qKgorICogc3RydWN0IGFkNTA2NF9zdGF0ZSAtIGRyaXZlciBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhCisgKiBAc3BpOgkJc3BpX2RldmljZQorICogQGNoaXBfaW5mbzoJCWNoaXAgbW9kZWwgc3BlY2lmaWMgY29uc3RhbnRzLCBhdmFpbGFibGUgbW9kZXMgZXRjCisgKiBAdnJlZl9yZWc6CQl2cmVmIHN1cHBseSByZWd1bGF0b3JzCisgKiBAcHdyX2Rvd246CQl3aGV0aGVyIGNoYW5uZWwgaXMgcG93ZXJlZCBkb3duCisgKiBAcHdyX2Rvd25fbW9kZToJY2hhbm5lbCdzIGN1cnJlbnQgcG93ZXIgZG93biBtb2RlCisgKiBAZGFjX2NhY2hlOgkJY3VycmVudCBEQUMgcmF3IHZhbHVlIChjaGlwIGRvZXMgbm90IHN1cHBvcnQgcmVhZGJhY2spCisgKiBAZGF0YToJCXNwaSB0cmFuc2ZlciBidWZmZXJzCisgKi8KKworc3RydWN0IGFkNTA2NF9zdGF0ZSB7CisJc3RydWN0IHNwaV9kZXZpY2UJCSpzcGk7CisJY29uc3Qgc3RydWN0IGFkNTA2NF9jaGlwX2luZm8JKmNoaXBfaW5mbzsKKwlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YQl2cmVmX3JlZ1tBRDUwNjRfREFDX0NIQU5ORUxTXTsKKwlib29sCQkJCXB3cl9kb3duW0FENTA2NF9EQUNfQ0hBTk5FTFNdOworCXU4CQkJCXB3cl9kb3duX21vZGVbQUQ1MDY0X0RBQ19DSEFOTkVMU107CisJdW5zaWduZWQgaW50CQkJZGFjX2NhY2hlW0FENTA2NF9EQUNfQ0hBTk5FTFNdOworCisJLyoKKwkgKiBETUEgKHRodXMgY2FjaGUgY29oZXJlbmN5IG1haW50ZW5hbmNlKSByZXF1aXJlcyB0aGUKKwkgKiB0cmFuc2ZlciBidWZmZXJzIHRvIGxpdmUgaW4gdGhlaXIgb3duIGNhY2hlIGxpbmVzLgorCSAqLworCV9fYmUzMiBkYXRhIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKK307CisKK2VudW0gYWQ1MDY0X3R5cGUgeworCUlEX0FENTAyNCwKKwlJRF9BRDUwNDQsCisJSURfQUQ1MDY0LAorCUlEX0FENTA2NF8xLAorfTsKKworI2RlZmluZSBBRDUwNjRfQ0hBTk5FTChjaGFuLCBiaXRzKSB7CQkJCVwKKwkudHlwZSA9IElJT19WT0xUQUdFLAkJCQkJXAorCS5pbmRleGVkID0gMSwJCQkJCQlcCisJLm91dHB1dCA9IDEsCQkJCQkJXAorCS5jaGFubmVsID0gKGNoYW4pLAkJCQkJXAorCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwJXAorCS5hZGRyZXNzID0gQUQ1MDY0X0FERFJfREFDKGNoYW4pLAkJCVwKKwkuc2Nhbl90eXBlID0gSUlPX1NUKCd1JywgKGJpdHMpLCAxNiwgMjAgLSAoYml0cykpCVwKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhZDUwNjRfY2hpcF9pbmZvIGFkNTA2NF9jaGlwX2luZm9fdGJsW10gPSB7CisJW0lEX0FENTAyNF0gPSB7CisJCS5zaGFyZWRfdnJlZiA9IGZhbHNlLAorCQkuY2hhbm5lbFswXSA9IEFENTA2NF9DSEFOTkVMKDAsIDEyKSwKKwkJLmNoYW5uZWxbMV0gPSBBRDUwNjRfQ0hBTk5FTCgxLCAxMiksCisJCS5jaGFubmVsWzJdID0gQUQ1MDY0X0NIQU5ORUwoMiwgMTIpLAorCQkuY2hhbm5lbFszXSA9IEFENTA2NF9DSEFOTkVMKDMsIDEyKSwKKwl9LAorCVtJRF9BRDUwNDRdID0geworCQkuc2hhcmVkX3ZyZWYgPSBmYWxzZSwKKwkJLmNoYW5uZWxbMF0gPSBBRDUwNjRfQ0hBTk5FTCgwLCAxNCksCisJCS5jaGFubmVsWzFdID0gQUQ1MDY0X0NIQU5ORUwoMSwgMTQpLAorCQkuY2hhbm5lbFsyXSA9IEFENTA2NF9DSEFOTkVMKDIsIDE0KSwKKwkJLmNoYW5uZWxbM10gPSBBRDUwNjRfQ0hBTk5FTCgzLCAxNCksCisJfSwKKwlbSURfQUQ1MDY0XSA9IHsKKwkJLnNoYXJlZF92cmVmID0gZmFsc2UsCisJCS5jaGFubmVsWzBdID0gQUQ1MDY0X0NIQU5ORUwoMCwgMTYpLAorCQkuY2hhbm5lbFsxXSA9IEFENTA2NF9DSEFOTkVMKDEsIDE2KSwKKwkJLmNoYW5uZWxbMl0gPSBBRDUwNjRfQ0hBTk5FTCgyLCAxNiksCisJCS5jaGFubmVsWzNdID0gQUQ1MDY0X0NIQU5ORUwoMywgMTYpLAorCX0sCisJW0lEX0FENTA2NF8xXSA9IHsKKwkJLnNoYXJlZF92cmVmID0gdHJ1ZSwKKwkJLmNoYW5uZWxbMF0gPSBBRDUwNjRfQ0hBTk5FTCgwLCAxNiksCisJCS5jaGFubmVsWzFdID0gQUQ1MDY0X0NIQU5ORUwoMSwgMTYpLAorCQkuY2hhbm5lbFsyXSA9IEFENTA2NF9DSEFOTkVMKDIsIDE2KSwKKwkJLmNoYW5uZWxbM10gPSBBRDUwNjRfQ0hBTk5FTCgzLCAxNiksCisJfSwKK307CisKK3N0YXRpYyBpbnQgYWQ1MDY0X3NwaV93cml0ZShzdHJ1Y3QgYWQ1MDY0X3N0YXRlICpzdCwgdW5zaWduZWQgaW50IGNtZCwKKwl1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgaW50IHZhbCwgdW5zaWduZWQgaW50IHNoaWZ0KQoreworCXZhbCA8PD0gc2hpZnQ7CisKKwlzdC0+ZGF0YSA9IGNwdV90b19iZTMyKEFENTA2NF9DTUQoY21kKSB8IEFENTA2NF9BRERSKGFkZHIpIHwgdmFsKTsKKworCXJldHVybiBzcGlfd3JpdGUoc3QtPnNwaSwgJnN0LT5kYXRhLCBzaXplb2Yoc3QtPmRhdGEpKTsKK30KKworc3RhdGljIGludCBhZDUwNjRfc3luY19wb3dlcmRvd25fbW9kZShzdHJ1Y3QgYWQ1MDY0X3N0YXRlICpzdCwKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCByZXQ7CisKKwl2YWwgPSAoMHgxIDw8IGNoYW5uZWwpOworCisJaWYgKHN0LT5wd3JfZG93bltjaGFubmVsXSkKKwkJdmFsIHw9IHN0LT5wd3JfZG93bl9tb2RlW2NoYW5uZWxdIDw8IDg7CisKKwlyZXQgPSBhZDUwNjRfc3BpX3dyaXRlKHN0LCBBRDUwNjRfQ01EX1BPV0VSRE9XTl9EQUMsIDAsIHZhbCwgMCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgY2hhciBhZDUwNjRfcG93ZXJkb3duX21vZGVzW11bMTVdID0geworCVtBRDUwNjRfTERBQ19QV1JETl9OT05FXQk9ICIiLAorCVtBRDUwNjRfTERBQ19QV1JETl8xS10JCT0gIjFrb2htX3RvX2duZCIsCisJW0FENTA2NF9MREFDX1BXUkROXzEwMEtdCT0gIjEwMGtvaG1fdG9fZ25kIiwKKwlbQUQ1MDY0X0xEQUNfUFdSRE5fM1NUQVRFXQk9ICJ0aHJlZV9zdGF0ZSIsCit9OworCitzdGF0aWMgc3NpemVfdCBhZDUwNjRfcmVhZF9wb3dlcmRvd25fbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDUwNjRfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLAorCQlhZDUwNjRfcG93ZXJkb3duX21vZGVzW3N0LT5wd3JfZG93bl9tb2RlW3RoaXNfYXR0ci0+YWRkcmVzc11dKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ1MDY0X3dyaXRlX3Bvd2VyZG93bl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNTA2NF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXVuc2lnbmVkIGludCBtb2RlLCBpOworCWludCByZXQ7CisKKwltb2RlID0gMDsKKworCWZvciAoaSA9IDE7IGkgPCBBUlJBWV9TSVpFKGFkNTA2NF9wb3dlcmRvd25fbW9kZXMpOyArK2kpIHsKKwkJaWYgKHN5c2ZzX3N0cmVxKGJ1ZiwgYWQ1MDY0X3Bvd2VyZG93bl9tb2Rlc1tpXSkpIHsKKwkJCW1vZGUgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKG1vZGUgPT0gMCkKKwkJcmV0dXJuICAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJc3QtPnB3cl9kb3duX21vZGVbdGhpc19hdHRyLT5hZGRyZXNzXSA9IG1vZGU7CisKKwlyZXQgPSBhZDUwNjRfc3luY19wb3dlcmRvd25fbW9kZShzdCwgdGhpc19hdHRyLT5hZGRyZXNzKTsKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIHNzaXplX3QgYWQ1MDY0X3JlYWRfZGFjX3Bvd2VyZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDUwNjRfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc3QtPnB3cl9kb3duW3RoaXNfYXR0ci0+YWRkcmVzc10pOworfQorCitzdGF0aWMgc3NpemVfdCBhZDUwNjRfd3JpdGVfZGFjX3Bvd2VyZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNTA2NF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlib29sIHB3cl9kb3duOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJ0b2Jvb2woYnVmLCAmcHdyX2Rvd24pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlzdC0+cHdyX2Rvd25bdGhpc19hdHRyLT5hZGRyZXNzXSA9IHB3cl9kb3duOworCisJcmV0ID0gYWQ1MDY0X3N5bmNfcG93ZXJkb3duX21vZGUoc3QsIHRoaXNfYXR0ci0+YWRkcmVzcyk7CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCitzdGF0aWMgSUlPX0NPTlNUX0FUVFIob3V0X3ZvbHRhZ2VfcG93ZXJkb3duX21vZGVfYXZhaWxhYmxlLAorCQkJIjFrb2htX3RvX2duZCAxMDBrb2htX3RvX2duZCB0aHJlZV9zdGF0ZSIpOworCisjZGVmaW5lIElJT19ERVZfQVRUUl9EQUNfUE9XRVJET1dOX01PREUoX2NoYW4pIFwKKwlJSU9fREVWSUNFX0FUVFIob3V0X3ZvbHRhZ2UjI19jaGFuIyNfcG93ZXJkb3duX21vZGUsIFwKKwkJCVNfSVJVR08gfCBTX0lXVVNSLCBcCisJCQlhZDUwNjRfcmVhZF9wb3dlcmRvd25fbW9kZSwgXAorCQkJYWQ1MDY0X3dyaXRlX3Bvd2VyZG93bl9tb2RlLCBfY2hhbik7CisKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0RBQ19QT1dFUkRPV04oX2NoYW4pCQkJCVwKKwlJSU9fREVWSUNFX0FUVFIob3V0X3ZvbHRhZ2UjI19jaGFuIyNfcG93ZXJkb3duLAkJCVwKKwkJCVNfSVJVR08gfCBTX0lXVVNSLAkJCQlcCisJCQlhZDUwNjRfcmVhZF9kYWNfcG93ZXJkb3duLAkJCVwKKwkJCWFkNTA2NF93cml0ZV9kYWNfcG93ZXJkb3duLCBfY2hhbikKKworc3RhdGljIElJT19ERVZfQVRUUl9EQUNfUE9XRVJET1dOKDApOworc3RhdGljIElJT19ERVZfQVRUUl9EQUNfUE9XRVJET1dOX01PREUoMCk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0RBQ19QT1dFUkRPV04oMSk7CitzdGF0aWMgSUlPX0RFVl9BVFRSX0RBQ19QT1dFUkRPV05fTU9ERSgxKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfREFDX1BPV0VSRE9XTigyKTsKK3N0YXRpYyBJSU9fREVWX0FUVFJfREFDX1BPV0VSRE9XTl9NT0RFKDIpOworc3RhdGljIElJT19ERVZfQVRUUl9EQUNfUE9XRVJET1dOKDMpOworc3RhdGljIElJT19ERVZfQVRUUl9EQUNfUE9XRVJET1dOX01PREUoMyk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDUwNjRfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2UwX3Bvd2VyZG93bi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2UxX3Bvd2VyZG93bi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2UyX3Bvd2VyZG93bi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2UzX3Bvd2VyZG93bi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2UwX3Bvd2VyZG93bl9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXRfdm9sdGFnZTFfcG93ZXJkb3duX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dF92b2x0YWdlMl9wb3dlcmRvd25fbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2UzX3Bvd2VyZG93bl9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX291dF92b2x0YWdlX3Bvd2VyZG93bl9tb2RlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDUwNjRfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGFkNTA2NF9hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBhZDUwNjRfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCSAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgaW50ICp2YWwsCisJCQkgICBpbnQgKnZhbDIsCisJCQkgICBsb25nIG0pCit7CisJc3RydWN0IGFkNTA2NF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXVuc2lnbmVkIGxvbmcgc2NhbGVfdXY7CisJdW5zaWduZWQgaW50IHZyZWY7CisKKwlzd2l0Y2ggKG0pIHsKKwljYXNlIDA6CisJCSp2YWwgPSBzdC0+ZGFjX2NhY2hlW2NoYW4tPmNoYW5uZWxdOworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKToKKwkJdnJlZiA9IHN0LT5jaGlwX2luZm8tPnNoYXJlZF92cmVmID8gMCA6IGNoYW4tPmNoYW5uZWw7CisJCXNjYWxlX3V2ID0gcmVndWxhdG9yX2dldF92b2x0YWdlKHN0LT52cmVmX3JlZ1t2cmVmXS5jb25zdW1lcik7CisJCWlmIChzY2FsZV91diA8IDApCisJCQlyZXR1cm4gc2NhbGVfdXY7CisKKwkJc2NhbGVfdXYgPSAoc2NhbGVfdXYgKiAxMDApID4+IGNoYW4tPnNjYW5fdHlwZS5yZWFsYml0czsKKwkJKnZhbCA9ICBzY2FsZV91diAvIDEwMDAwMDsKKwkJKnZhbDIgPSAoc2NhbGVfdXYgJSAxMDAwMDApICogMTA7CisJCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBhZDUwNjRfd3JpdGVfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sIGludCB2YWwsIGludCB2YWwyLCBsb25nIG1hc2spCit7CisJc3RydWN0IGFkNTA2NF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQ7CisKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIDA6CisJCWlmICh2YWwgPiAoMSA8PCBjaGFuLT5zY2FuX3R5cGUucmVhbGJpdHMpIHx8IHZhbCA8IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwkJcmV0ID0gYWQ1MDY0X3NwaV93cml0ZShzdCwgQUQ1MDY0X0NNRF9XUklURV9JTlBVVF9OX1VQREFURV9OLAorCQkJCWNoYW4tPmFkZHJlc3MsIHZhbCwgY2hhbi0+c2Nhbl90eXBlLnNoaWZ0KTsKKwkJaWYgKHJldCA9PSAwKQorCQkJc3QtPmRhY19jYWNoZVtjaGFuLT5jaGFubmVsXSA9IHZhbDsKKwkJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkNTA2NF9pbmZvID0geworCS5yZWFkX3JhdyA9IGFkNTA2NF9yZWFkX3JhdywKKwkud3JpdGVfcmF3ID0gYWQ1MDY0X3dyaXRlX3JhdywKKwkuYXR0cnMgPSAmYWQ1MDY0X2F0dHJpYnV0ZV9ncm91cCwKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYWQ1MDY0X251bV92cmVmKHN0cnVjdCBhZDUwNjRfc3RhdGUgKnN0KQoreworCXJldHVybiBzdC0+Y2hpcF9pbmZvLT5zaGFyZWRfdnJlZiA/IDEgOiBBRDUwNjRfREFDX0NIQU5ORUxTOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFkNTA2NF92cmVmX25hbWVzW10gPSB7CisJInZyZWZBIiwKKwkidnJlZkIiLAorCSJ2cmVmQyIsCisJInZyZWZEIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWQ1MDY0X3ZyZWZfbmFtZShzdHJ1Y3QgYWQ1MDY0X3N0YXRlICpzdCwKKwl1bnNpZ25lZCBpbnQgdnJlZikKK3sKKwlyZXR1cm4gc3QtPmNoaXBfaW5mby0+c2hhcmVkX3ZyZWYgPyAidnJlZiIgOiBhZDUwNjRfdnJlZl9uYW1lc1t2cmVmXTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYWQ1MDY0X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJZW51bSBhZDUwNjRfdHlwZSB0eXBlID0gc3BpX2dldF9kZXZpY2VfaWQoc3BpKS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlzdHJ1Y3QgYWQ1MDY0X3N0YXRlICpzdDsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OworCisJaW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZShzaXplb2YoKnN0KSk7CisJaWYgKGluZGlvX2RldiA9PSBOVUxMKQorCQlyZXR1cm4gIC1FTk9NRU07CisKKwlzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJc3BpX3NldF9kcnZkYXRhKHNwaSwgaW5kaW9fZGV2KTsKKworCXN0LT5jaGlwX2luZm8gPSAmYWQ1MDY0X2NoaXBfaW5mb190YmxbdHlwZV07CisJc3QtPnNwaSA9IHNwaTsKKworCWZvciAoaSA9IDA7IGkgPCBhZDUwNjRfbnVtX3ZyZWYoc3QpOyArK2kpCisJCXN0LT52cmVmX3JlZ1tpXS5zdXBwbHkgPSBhZDUwNjRfdnJlZl9uYW1lKHN0LCBpKTsKKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2dldCgmc3QtPnNwaS0+ZGV2LCBhZDUwNjRfbnVtX3ZyZWYoc3QpLAorCQlzdC0+dnJlZl9yZWcpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZTsKKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShhZDUwNjRfbnVtX3ZyZWYoc3QpLCBzdC0+dnJlZl9yZWcpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9yZWc7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUQ1MDY0X0RBQ19DSEFOTkVMUzsgKytpKSB7CisJCXN0LT5wd3JfZG93bl9tb2RlW2ldID0gQUQ1MDY0X0xEQUNfUFdSRE5fMUs7CisJCXN0LT5kYWNfY2FjaGVbaV0gPSAweDgwMDA7CisJfQorCisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCWluZGlvX2Rldi0+bmFtZSA9IHNwaV9nZXRfZGV2aWNlX2lkKHNwaSktPm5hbWU7CisJaW5kaW9fZGV2LT5pbmZvID0gJmFkNTA2NF9pbmZvOworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gc3QtPmNoaXBfaW5mby0+Y2hhbm5lbDsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFENTA2NF9EQUNfQ0hBTk5FTFM7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9kaXNhYmxlX3JlZzsKKworCXJldHVybiAwOworCitlcnJvcl9kaXNhYmxlX3JlZzoKKwlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKGFkNTA2NF9udW1fdnJlZihzdCksIHN0LT52cmVmX3JlZyk7CitlcnJvcl9mcmVlX3JlZzoKKwlyZWd1bGF0b3JfYnVsa19mcmVlKGFkNTA2NF9udW1fdnJlZihzdCksIHN0LT52cmVmX3JlZyk7CitlcnJvcl9mcmVlOgorCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOworCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDUwNjRfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBhZDUwNjRfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShhZDUwNjRfbnVtX3ZyZWYoc3QpLCBzdC0+dnJlZl9yZWcpOworCXJlZ3VsYXRvcl9idWxrX2ZyZWUoYWQ1MDY0X251bV92cmVmKHN0KSwgc3QtPnZyZWZfcmVnKTsKKworCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBhZDUwNjRfaWRbXSA9IHsKKwl7ImFkNTAyNCIsIElEX0FENTAyNH0sCisJeyJhZDUwNDQiLCBJRF9BRDUwNDR9LAorCXsiYWQ1MDY0IiwgSURfQUQ1MDY0fSwKKwl7ImFkNTA2NC0xIiwgSURfQUQ1MDY0XzF9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShzcGksIGFkNTA2NF9pZCk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZDUwNjRfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gImFkNTA2NCIsCisJCSAgIC5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWQ1MDY0X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDUwNjRfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBhZDUwNjRfaWQsCit9OworCitzdGF0aWMgX19pbml0IGludCBhZDUwNjRfc3BpX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigmYWQ1MDY0X2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZDUwNjRfc3BpX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgYWQ1MDY0X3NwaV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDUwNjRfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkNTA2NF9zcGlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkxhcnMtUGV0ZXIgQ2xhdXNlbiA8bGFyc0BtZXRhZm9vLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRDUwNjQvNjQtMS80NC8yNCBEQUMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTM2MC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvYWQ1MzYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJkMGYzZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTM2MC5jCkBAIC0wLDAgKzEsNTgxIEBACisvKgorICogQW5hbG9nIGRldmljZXMgQUQ1MzYwLCBBRDUzNjEsIEFENTM2MiwgQUQ1MzYzLCBBRDUzNzAsIEFENTM3MSwgQUQ1MzczCisgKiBtdWx0aS1jaGFubmVsIERpZ2l0YWwgdG8gQW5hbG9nIENvbnZlcnRlcnMgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IDIwMTEgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICJkYWMuaCIKKworI2RlZmluZSBBRDUzNjBfQ01EKHgpCQkJCSgoeCkgPDwgMjIpCisjZGVmaW5lIEFENTM2MF9BRERSKHgpCQkJCSgoeCkgPDwgMTYpCisKKyNkZWZpbmUgQUQ1MzYwX1JFQURCQUNLX1RZUEUoeCkJCQkoKHgpIDw8IDEzKQorI2RlZmluZSBBRDUzNjBfUkVBREJBQ0tfQUREUih4KQkJCSgoeCkgPDwgNykKKworI2RlZmluZSBBRDUzNjBfQ0hBTl9BRERSKGNoYW4pCQkJKChjaGFuKSArIDB4OCkKKworI2RlZmluZSBBRDUzNjBfQ01EX1dSSVRFX0RBVEEJCQkweDMKKyNkZWZpbmUgQUQ1MzYwX0NNRF9XUklURV9PRkZTRVQJCQkweDIKKyNkZWZpbmUgQUQ1MzYwX0NNRF9XUklURV9HQUlOCQkJMHgxCisjZGVmaW5lIEFENTM2MF9DTURfU1BFQ0lBTF9GVU5DVElPTgkJMHgwCisKKy8qIFNwZWNpYWwgZnVuY3Rpb24gcmVnaXN0ZXIgYWRkcmVzc2VzICovCisjZGVmaW5lIEFENTM2MF9SRUdfU0ZfTk9QCQkJMHgwCisjZGVmaW5lIEFENTM2MF9SRUdfU0ZfQ1RSTAkJCTB4MQorI2RlZmluZSBBRDUzNjBfUkVHX1NGX09GUyh4KQkJCSgweDIgKyAoeCkpCisjZGVmaW5lIEFENTM2MF9SRUdfU0ZfUkVBREJBQ0sJCQkweDUKKworI2RlZmluZSBBRDUzNjBfU0ZfQ1RSTF9QV1JfRE9XTgkJCUJJVCgwKQorCisjZGVmaW5lIEFENTM2MF9SRUFEQkFDS19YMUEJCQkweDAKKyNkZWZpbmUgQUQ1MzYwX1JFQURCQUNLX1gxQgkJCTB4MQorI2RlZmluZSBBRDUzNjBfUkVBREJBQ0tfT0ZGU0VUCQkJMHgyCisjZGVmaW5lIEFENTM2MF9SRUFEQkFDS19HQUlOCQkJMHgzCisjZGVmaW5lIEFENTM2MF9SRUFEQkFDS19TRgkJCTB4NAorCisKKy8qKgorICogc3RydWN0IGFkNTM2MF9jaGlwX2luZm8gLSBjaGlwIHNwZWNpZmljIGluZm9ybWF0aW9uCisgKiBAY2hhbm5lbF90ZW1wbGF0ZToJY2hhbm5lbCBzcGVjaWZpY2F0aW9uIHRlbXBsYXRlCisgKiBAbnVtX2NoYW5uZWxzOgludW1iZXIgb2YgY2hhbm5lbHMKKyAqIEBjaGFubmVsc19wZXJfZ3JvdXA6CW51bWJlciBvZiBjaGFubmVscyBwZXIgZ3JvdXAKKyAqIEBudW1fdnJlZnM6CQludW1iZXIgb2YgdnJlZiBzdXBwbGllcyBmb3IgdGhlIGNoaXAKKyovCisKK3N0cnVjdCBhZDUzNjBfY2hpcF9pbmZvIHsKKwlzdHJ1Y3QgaWlvX2NoYW5fc3BlYwljaGFubmVsX3RlbXBsYXRlOworCXVuc2lnbmVkIGludAkJbnVtX2NoYW5uZWxzOworCXVuc2lnbmVkIGludAkJY2hhbm5lbHNfcGVyX2dyb3VwOworCXVuc2lnbmVkIGludAkJbnVtX3ZyZWZzOworfTsKKworLyoqCisgKiBzdHJ1Y3QgYWQ1MzYwX3N0YXRlIC0gZHJpdmVyIGluc3RhbmNlIHNwZWNpZmljIGRhdGEKKyAqIEBzcGk6CQlzcGlfZGV2aWNlCisgKiBAY2hpcF9pbmZvOgkJY2hpcCBtb2RlbCBzcGVjaWZpYyBjb25zdGFudHMsIGF2YWlsYWJsZSBtb2RlcyBldGMKKyAqIEB2cmVmX3JlZzoJCXZyZWYgc3VwcGx5IHJlZ3VsYXRvcnMKKyAqIEBjdHJsOgkJY29udHJvbCByZWdpc3RlciBjYWNoZQorICogQGRhdGE6CQlzcGkgdHJhbnNmZXIgYnVmZmVycworICovCisKK3N0cnVjdCBhZDUzNjBfc3RhdGUgeworCXN0cnVjdCBzcGlfZGV2aWNlCQkqc3BpOworCWNvbnN0IHN0cnVjdCBhZDUzNjBfY2hpcF9pbmZvCSpjaGlwX2luZm87CisJc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEJdnJlZl9yZWdbM107CisJdW5zaWduZWQgaW50CQkJY3RybDsKKworCS8qCisJICogRE1BICh0aHVzIGNhY2hlIGNvaGVyZW5jeSBtYWludGVuYW5jZSkgcmVxdWlyZXMgdGhlCisJICogdHJhbnNmZXIgYnVmZmVycyB0byBsaXZlIGluIHRoZWlyIG93biBjYWNoZSBsaW5lcy4KKwkgKi8KKwl1bmlvbiB7CisJCV9fYmUzMiBkMzI7CisJCXU4IGQ4WzRdOworCX0gZGF0YVsyXSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7Cit9OworCitlbnVtIGFkNTM2MF90eXBlIHsKKwlJRF9BRDUzNjAsCisJSURfQUQ1MzYxLAorCUlEX0FENTM2MiwKKwlJRF9BRDUzNjMsCisJSURfQUQ1MzcwLAorCUlEX0FENTM3MSwKKwlJRF9BRDUzNzIsCisJSURfQUQ1MzczLAorfTsKKworI2RlZmluZSBBRDUzNjBfQ0hBTk5FTChiaXRzKSB7CQkJCQlcCisJLnR5cGUgPSBJSU9fVk9MVEFHRSwJCQkJCVwKKwkuaW5kZXhlZCA9IDEsCQkJCQkJXAorCS5vdXRwdXQgPSAxLAkJCQkJCVwKKwkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TRVBBUkFURSkgfAlcCisJCSgxIDw8IElJT19DSEFOX0lORk9fT0ZGU0VUX1NFUEFSQVRFKSB8CQlcCisJCSgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJTQ0FMRV9TRVBBUkFURSkgfAlcCisJCSgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NFUEFSQVRFKSwJXAorCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3UnLCAoYml0cyksIDE2LCAxNiAtIChiaXRzKSkJXAorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFkNTM2MF9jaGlwX2luZm8gYWQ1MzYwX2NoaXBfaW5mb190YmxbXSA9IHsKKwlbSURfQUQ1MzYwXSA9IHsKKwkJLmNoYW5uZWxfdGVtcGxhdGUgPSBBRDUzNjBfQ0hBTk5FTCgxNiksCisJCS5udW1fY2hhbm5lbHMgPSAxNiwKKwkJLmNoYW5uZWxzX3Blcl9ncm91cCA9IDgsCisJCS5udW1fdnJlZnMgPSAyLAorCX0sCisJW0lEX0FENTM2MV0gPSB7CisJCS5jaGFubmVsX3RlbXBsYXRlID0gQUQ1MzYwX0NIQU5ORUwoMTQpLAorCQkubnVtX2NoYW5uZWxzID0gMTYsCisJCS5jaGFubmVsc19wZXJfZ3JvdXAgPSA4LAorCQkubnVtX3ZyZWZzID0gMiwKKwl9LAorCVtJRF9BRDUzNjJdID0geworCQkuY2hhbm5lbF90ZW1wbGF0ZSA9IEFENTM2MF9DSEFOTkVMKDE2KSwKKwkJLm51bV9jaGFubmVscyA9IDgsCisJCS5jaGFubmVsc19wZXJfZ3JvdXAgPSA0LAorCQkubnVtX3ZyZWZzID0gMiwKKwl9LAorCVtJRF9BRDUzNjNdID0geworCQkuY2hhbm5lbF90ZW1wbGF0ZSA9IEFENTM2MF9DSEFOTkVMKDE0KSwKKwkJLm51bV9jaGFubmVscyA9IDgsCisJCS5jaGFubmVsc19wZXJfZ3JvdXAgPSA0LAorCQkubnVtX3ZyZWZzID0gMiwKKwl9LAorCVtJRF9BRDUzNzBdID0geworCQkuY2hhbm5lbF90ZW1wbGF0ZSA9IEFENTM2MF9DSEFOTkVMKDE2KSwKKwkJLm51bV9jaGFubmVscyA9IDQwLAorCQkuY2hhbm5lbHNfcGVyX2dyb3VwID0gOCwKKwkJLm51bV92cmVmcyA9IDIsCisJfSwKKwlbSURfQUQ1MzcxXSA9IHsKKwkJLmNoYW5uZWxfdGVtcGxhdGUgPSBBRDUzNjBfQ0hBTk5FTCgxNCksCisJCS5udW1fY2hhbm5lbHMgPSA0MCwKKwkJLmNoYW5uZWxzX3Blcl9ncm91cCA9IDgsCisJCS5udW1fdnJlZnMgPSAzLAorCX0sCisJW0lEX0FENTM3Ml0gPSB7CisJCS5jaGFubmVsX3RlbXBsYXRlID0gQUQ1MzYwX0NIQU5ORUwoMTYpLAorCQkubnVtX2NoYW5uZWxzID0gMzIsCisJCS5jaGFubmVsc19wZXJfZ3JvdXAgPSA4LAorCQkubnVtX3ZyZWZzID0gMiwKKwl9LAorCVtJRF9BRDUzNzNdID0geworCQkuY2hhbm5lbF90ZW1wbGF0ZSA9IEFENTM2MF9DSEFOTkVMKDE0KSwKKwkJLm51bV9jaGFubmVscyA9IDMyLAorCQkuY2hhbm5lbHNfcGVyX2dyb3VwID0gOCwKKwkJLm51bV92cmVmcyA9IDIsCisJfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWQ1MzYwX2dldF9jaGFubmVsX3ZyZWZfaW5kZXgoc3RydWN0IGFkNTM2MF9zdGF0ZSAqc3QsCisJdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBUaGUgZmlyc3QgZ3JvdXBzIGhhdmUgdGhlaXIgb3duIHZyZWYsIHdoaWxlIHRoZSByZW1haW5pbmcgZ3JvdXBzCisJICogc2hhcmUgdGhlIGxhc3QgdnJlZiAqLworCWkgPSBjaGFubmVsIC8gc3QtPmNoaXBfaW5mby0+Y2hhbm5lbHNfcGVyX2dyb3VwOworCWlmIChpID49IHN0LT5jaGlwX2luZm8tPm51bV92cmVmcykKKwkJaSA9IHN0LT5jaGlwX2luZm8tPm51bV92cmVmcyAtIDE7CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBhZDUzNjBfZ2V0X2NoYW5uZWxfdnJlZihzdHJ1Y3QgYWQ1MzYwX3N0YXRlICpzdCwKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwl1bnNpZ25lZCBpbnQgaSA9IGFkNTM2MF9nZXRfY2hhbm5lbF92cmVmX2luZGV4KHN0LCBjaGFubmVsKTsKKworCXJldHVybiByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Uoc3QtPnZyZWZfcmVnW2ldLmNvbnN1bWVyKTsKK30KKworCitzdGF0aWMgaW50IGFkNTM2MF93cml0ZV91bmxvY2tlZChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgdmFsLAorCXVuc2lnbmVkIGludCBzaGlmdCkKK3sKKwlzdHJ1Y3QgYWQ1MzYwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwl2YWwgPDw9IHNoaWZ0OworCXZhbCB8PSBBRDUzNjBfQ01EKGNtZCkgfCBBRDUzNjBfQUREUihhZGRyKTsKKwlzdC0+ZGF0YVswXS5kMzIgPSBjcHVfdG9fYmUzMih2YWwpOworCisJcmV0dXJuIHNwaV93cml0ZShzdC0+c3BpLCAmc3QtPmRhdGFbMF0uZDhbMV0sIDMpOworfQorCitzdGF0aWMgaW50IGFkNTM2MF93cml0ZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCB1bnNpZ25lZCBpbnQgY21kLAorCXVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgdmFsLCB1bnNpZ25lZCBpbnQgc2hpZnQpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCXJldCA9IGFkNTM2MF93cml0ZV91bmxvY2tlZChpbmRpb19kZXYsIGNtZCwgYWRkciwgdmFsLCBzaGlmdCk7CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWQ1MzYwX3JlYWQoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgdW5zaWduZWQgaW50IHR5cGUsCisJdW5zaWduZWQgaW50IGFkZHIpCit7CisJc3RydWN0IGFkNTM2MF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXN0cnVjdCBzcGlfbWVzc2FnZSBtOworCWludCByZXQ7CisJc3RydWN0IHNwaV90cmFuc2ZlciB0W10gPSB7CisJCXsKKwkJCS50eF9idWYgPSAmc3QtPmRhdGFbMF0uZDhbMV0sCisJCQkubGVuID0gMywKKwkJCS5jc19jaGFuZ2UgPSAxLAorCQl9LCB7CisJCQkucnhfYnVmID0gJnN0LT5kYXRhWzFdLmQ4WzFdLAorCQkJLmxlbiA9IDMsCisJCX0sCisJfTsKKworCXNwaV9tZXNzYWdlX2luaXQoJm0pOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0WzBdLCAmbSk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRbMV0sICZtKTsKKworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJc3QtPmRhdGFbMF0uZDMyID0gY3B1X3RvX2JlMzIoQUQ1MzYwX0NNRChBRDUzNjBfQ01EX1NQRUNJQUxfRlVOQ1RJT04pIHwKKwkJQUQ1MzYwX0FERFIoQUQ1MzYwX1JFR19TRl9SRUFEQkFDSykgfAorCQlBRDUzNjBfUkVBREJBQ0tfVFlQRSh0eXBlKSB8CisJCUFENTM2MF9SRUFEQkFDS19BRERSKGFkZHIpKTsKKworCXJldCA9IHNwaV9zeW5jKHN0LT5zcGksICZtKTsKKwlpZiAocmV0ID49IDApCisJCXJldCA9IGJlMzJfdG9fY3B1KHN0LT5kYXRhWzFdLmQzMikgJiAweGZmZmY7CisKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWQ1MzYwX3JlYWRfZGFjX3Bvd2VyZG93bihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDUzNjBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoYm9vbCkoc3QtPmN0cmwgJiBBRDUzNjBfU0ZfQ1RSTF9QV1JfRE9XTikpOworfQorCitzdGF0aWMgaW50IGFkNTM2MF91cGRhdGVfY3RybChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCB1bnNpZ25lZCBpbnQgc2V0LAorCXVuc2lnbmVkIGludCBjbHIpCit7CisJc3RydWN0IGFkNTM2MF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXVuc2lnbmVkIGludCByZXQ7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXN0LT5jdHJsIHw9IHNldDsKKwlzdC0+Y3RybCAmPSB+Y2xyOworCisJcmV0ID0gYWQ1MzYwX3dyaXRlX3VubG9ja2VkKGluZGlvX2RldiwgQUQ1MzYwX0NNRF9TUEVDSUFMX0ZVTkNUSU9OLAorCQkJQUQ1MzYwX1JFR19TRl9DVFJMLCBzdC0+Y3RybCwgMCk7CisKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWQ1MzYwX3dyaXRlX2RhY19wb3dlcmRvd24oc3RydWN0IGRldmljZSAqZGV2LAorCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWJvb2wgcHdyX2Rvd247CisJaW50IHJldDsKKworCXJldCA9IHN0cnRvYm9vbChidWYsICZwd3JfZG93bik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChwd3JfZG93bikKKwkJcmV0ID0gYWQ1MzYwX3VwZGF0ZV9jdHJsKGluZGlvX2RldiwgQUQ1MzYwX1NGX0NUUkxfUFdSX0RPV04sIDApOworCWVsc2UKKwkJcmV0ID0gYWQ1MzYwX3VwZGF0ZV9jdHJsKGluZGlvX2RldiwgMCwgQUQ1MzYwX1NGX0NUUkxfUFdSX0RPV04pOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihvdXRfdm9sdGFnZV9wb3dlcmRvd24sCisJCQlTX0lSVUdPIHwgU19JV1VTUiwKKwkJCWFkNTM2MF9yZWFkX2RhY19wb3dlcmRvd24sCisJCQlhZDUzNjBfd3JpdGVfZGFjX3Bvd2VyZG93biwgMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDUzNjBfYXR0cmlidXRlc1tdID0geworCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2VfcG93ZXJkb3duLmRldl9hdHRyLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNTM2MF9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWQ1MzYwX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IGFkNTM2MF93cml0ZV9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCSAgICAgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCSAgICAgICBpbnQgdmFsLAorCQkJICAgICAgIGludCB2YWwyLAorCQkJICAgICAgIGxvbmcgbWFzaykKK3sKKwlzdHJ1Y3QgYWQ1MzYwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IG1heF92YWwgPSAoMSA8PCBjaGFuLT5zY2FuX3R5cGUucmVhbGJpdHMpOworCXVuc2lnbmVkIGludCBvZnNfaW5kZXg7CisKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIDA6CisJCWlmICh2YWwgPj0gbWF4X3ZhbCB8fCB2YWwgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcmV0dXJuIGFkNTM2MF93cml0ZShpbmRpb19kZXYsIEFENTM2MF9DTURfV1JJVEVfREFUQSwKKwkJCQkgY2hhbi0+YWRkcmVzcywgdmFsLCBjaGFuLT5zY2FuX3R5cGUuc2hpZnQpOworCisJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSk6CisJCWlmICh2YWwgPj0gbWF4X3ZhbCB8fCB2YWwgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcmV0dXJuIGFkNTM2MF93cml0ZShpbmRpb19kZXYsIEFENTM2MF9DTURfV1JJVEVfT0ZGU0VULAorCQkJCSBjaGFuLT5hZGRyZXNzLCB2YWwsIGNoYW4tPnNjYW5fdHlwZS5zaGlmdCk7CisKKwljYXNlICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJTQ0FMRV9TRVBBUkFURSk6CisJCWlmICh2YWwgPj0gbWF4X3ZhbCB8fCB2YWwgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcmV0dXJuIGFkNTM2MF93cml0ZShpbmRpb19kZXYsIEFENTM2MF9DTURfV1JJVEVfR0FJTiwKKwkJCQkgY2hhbi0+YWRkcmVzcywgdmFsLCBjaGFuLT5zY2FuX3R5cGUuc2hpZnQpOworCisJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX09GRlNFVF9TRVBBUkFURSk6CisJCWlmICh2YWwgPD0gLW1heF92YWwgfHwgdmFsID4gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXZhbCA9IC12YWw7CisKKwkJLyogb2Zmc2V0IGlzIHN1cHBvc2VkIHRvIGhhdmUgdGhlIHNhbWUgc2NhbGUgYXMgcmF3LCBidXQgaXQKKwkJICogaXMgYWx3YXlzIDE0Yml0cyB3aWRlLCBzbyBvbiBhIGNoaXAgd2hlcmUgdGhlIHJhdyB2YWx1ZSBoYXMKKwkJICogbW9yZSBiaXRzLCB3ZSBuZWVkIHRvIHNoaWZ0IG9mZnNldC4gKi8KKwkJdmFsID4+PSAoY2hhbi0+c2Nhbl90eXBlLnJlYWxiaXRzIC0gMTQpOworCisJCS8qIFRoZXJlIGlzIG9uZSBEQUMgb2Zmc2V0IHJlZ2lzdGVyIHBlciB2cmVmLiBDaGFuZ2luZyBvbmUKKwkJICogY2hhbm5lbHMgb2Zmc2V0IHdpbGwgYWxzbyBjaGFuZ2UgdGhlIG9mZnNldCBmb3IgYWxsIG90aGVyCisJCSAqIGNoYW5uZWxzIHdoaWNoIHNoYXJlIHRoZSBzYW1lIHZyZWYgc3VwcGx5LiAqLworCQlvZnNfaW5kZXggPSBhZDUzNjBfZ2V0X2NoYW5uZWxfdnJlZl9pbmRleChzdCwgY2hhbi0+Y2hhbm5lbCk7CisJCXJldHVybiBhZDUzNjBfd3JpdGUoaW5kaW9fZGV2LCBBRDUzNjBfQ01EX1NQRUNJQUxfRlVOQ1RJT04sCisJCQkJIEFENTM2MF9SRUdfU0ZfT0ZTKG9mc19pbmRleCksIHZhbCwgMCk7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgYWQ1MzYwX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCSAgIGludCAqdmFsLAorCQkJICAgaW50ICp2YWwyLAorCQkJICAgbG9uZyBtKQoreworCXN0cnVjdCBhZDUzNjBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwl1bnNpZ25lZCBsb25nIHNjYWxlX3V2OworCXVuc2lnbmVkIGludCBvZnNfaW5kZXg7CisJaW50IHJldDsKKworCXN3aXRjaCAobSkgeworCWNhc2UgMDoKKwkJcmV0ID0gYWQ1MzYwX3JlYWQoaW5kaW9fZGV2LCBBRDUzNjBfUkVBREJBQ0tfWDFBLAorCQkJY2hhbi0+YWRkcmVzcyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJKnZhbCA9IHJldCA+PiBjaGFuLT5zY2FuX3R5cGUuc2hpZnQ7CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwljYXNlICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpOgorCQkvKiB2b3V0ID0gNCAqIHZyZWYgKiBkYWNfY29kZSAqLworCQlzY2FsZV91diA9IGFkNTM2MF9nZXRfY2hhbm5lbF92cmVmKHN0LCBjaGFuLT5jaGFubmVsKSAqIDQgKiAxMDA7CisJCWlmIChzY2FsZV91diA8IDApCisJCQlyZXR1cm4gc2NhbGVfdXY7CisKKwkJc2NhbGVfdXYgPj49IChjaGFuLT5zY2FuX3R5cGUucmVhbGJpdHMpOworCQkqdmFsID0gIHNjYWxlX3V2IC8gMTAwMDAwOworCQkqdmFsMiA9IChzY2FsZV91diAlIDEwMDAwMCkgKiAxMDsKKwkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSk6CisJCXJldCA9IGFkNTM2MF9yZWFkKGluZGlvX2RldiwgQUQ1MzYwX1JFQURCQUNLX09GRlNFVCwKKwkJCWNoYW4tPmFkZHJlc3MpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCSp2YWwgPSByZXQ7CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwljYXNlICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJTQ0FMRV9TRVBBUkFURSk6CisJCXJldCA9IGFkNTM2MF9yZWFkKGluZGlvX2RldiwgQUQ1MzYwX1JFQURCQUNLX0dBSU4sCisJCQljaGFuLT5hZGRyZXNzKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkqdmFsID0gcmV0OworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX09GRlNFVF9TRVBBUkFURSk6CisJCW9mc19pbmRleCA9IGFkNTM2MF9nZXRfY2hhbm5lbF92cmVmX2luZGV4KHN0LCBjaGFuLT5jaGFubmVsKTsKKwkJcmV0ID0gYWQ1MzYwX3JlYWQoaW5kaW9fZGV2LCBBRDUzNjBfUkVBREJBQ0tfU0YsCisJCQlBRDUzNjBfUkVHX1NGX09GUyhvZnNfaW5kZXgpKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA8PD0gKGNoYW4tPnNjYW5fdHlwZS5yZWFsYml0cyAtIDE0KTsKKwkJKnZhbCA9IC1yZXQ7CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBhZDUzNjBfaW5mbyA9IHsKKwkucmVhZF9yYXcgPSBhZDUzNjBfcmVhZF9yYXcsCisJLndyaXRlX3JhdyA9IGFkNTM2MF93cml0ZV9yYXcsCisJLmF0dHJzID0gJmFkNTM2MF9hdHRyaWJ1dGVfZ3JvdXAsCisJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYWQ1MzYwX3ZyZWZfbmFtZVtdID0geworCSAidnJlZjAiLCAidnJlZjEiLCAidnJlZjIiCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDUzNjBfYWxsb2NfY2hhbm5lbHMoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3QgYWQ1MzYwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW5uZWxzOworCXVuc2lnbmVkIGludCBpOworCisJY2hhbm5lbHMgPSBrY2FsbG9jKHNpemVvZihzdHJ1Y3QgaWlvX2NoYW5fc3BlYyksCisJCQlzdC0+Y2hpcF9pbmZvLT5udW1fY2hhbm5lbHMsIEdGUF9LRVJORUwpOworCisJaWYgKCFjaGFubmVscykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgc3QtPmNoaXBfaW5mby0+bnVtX2NoYW5uZWxzOyArK2kpIHsKKwkJY2hhbm5lbHNbaV0gPSBzdC0+Y2hpcF9pbmZvLT5jaGFubmVsX3RlbXBsYXRlOworCQljaGFubmVsc1tpXS5jaGFubmVsID0gaTsKKwkJY2hhbm5lbHNbaV0uYWRkcmVzcyA9IEFENTM2MF9DSEFOX0FERFIoaSk7CisJfQorCisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGNoYW5uZWxzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkNTM2MF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCWVudW0gYWQ1MzYwX3R5cGUgdHlwZSA9IHNwaV9nZXRfZGV2aWNlX2lkKHNwaSktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IGFkNTM2MF9zdGF0ZSAqc3Q7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldDsKKworCWluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2Uoc2l6ZW9mKCpzdCkpOworCWlmIChpbmRpb19kZXYgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBpaW8gZGV2aWNlXG4iKTsKKwkJcmV0dXJuICAtRU5PTUVNOworCX0KKworCXN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBpbmRpb19kZXYpOworCisJc3QtPmNoaXBfaW5mbyA9ICZhZDUzNjBfY2hpcF9pbmZvX3RibFt0eXBlXTsKKwlzdC0+c3BpID0gc3BpOworCisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OworCWluZGlvX2Rldi0+bmFtZSA9IHNwaV9nZXRfZGV2aWNlX2lkKHNwaSktPm5hbWU7CisJaW5kaW9fZGV2LT5pbmZvID0gJmFkNTM2MF9pbmZvOworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IHN0LT5jaGlwX2luZm8tPm51bV9jaGFubmVsczsKKworCXJldCA9IGFkNTM2MF9hbGxvY19jaGFubmVscyhpbmRpb19kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgY2hhbm5lbCBzcGVjOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJvcl9mcmVlOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBzdC0+Y2hpcF9pbmZvLT5udW1fdnJlZnM7ICsraSkKKwkJc3QtPnZyZWZfcmVnW2ldLnN1cHBseSA9IGFkNTM2MF92cmVmX25hbWVbaV07CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19nZXQoJnN0LT5zcGktPmRldiwgc3QtPmNoaXBfaW5mby0+bnVtX3ZyZWZzLAorCQlzdC0+dnJlZl9yZWcpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCB2cmVmIHJlZ3VsYXRvcnM6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycm9yX2ZyZWVfY2hhbm5lbHM7CisJfQorCisJcmV0ID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKHN0LT5jaGlwX2luZm8tPm51bV92cmVmcywgc3QtPnZyZWZfcmVnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSB2cmVmIHJlZ3VsYXRvcnM6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycm9yX2ZyZWVfcmVnOworCX0KKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGlpbyBkZXZpY2U6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycm9yX2Rpc2FibGVfcmVnOworCX0KKworCXJldHVybiAwOworCitlcnJvcl9kaXNhYmxlX3JlZzoKKwlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKHN0LT5jaGlwX2luZm8tPm51bV92cmVmcywgc3QtPnZyZWZfcmVnKTsKK2Vycm9yX2ZyZWVfcmVnOgorCXJlZ3VsYXRvcl9idWxrX2ZyZWUoc3QtPmNoaXBfaW5mby0+bnVtX3ZyZWZzLCBzdC0+dnJlZl9yZWcpOworZXJyb3JfZnJlZV9jaGFubmVsczoKKwlrZnJlZShpbmRpb19kZXYtPmNoYW5uZWxzKTsKK2Vycm9yX2ZyZWU6CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDUzNjBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCXN0cnVjdCBhZDUzNjBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCisJa2ZyZWUoaW5kaW9fZGV2LT5jaGFubmVscyk7CisKKwlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKHN0LT5jaGlwX2luZm8tPm51bV92cmVmcywgc3QtPnZyZWZfcmVnKTsKKwlyZWd1bGF0b3JfYnVsa19mcmVlKHN0LT5jaGlwX2luZm8tPm51bV92cmVmcywgc3QtPnZyZWZfcmVnKTsKKworCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBhZDUzNjBfaWRzW10gPSB7CisJeyAiYWQ1MzYwIiwgSURfQUQ1MzYwIH0sCisJeyAiYWQ1MzYxIiwgSURfQUQ1MzYxIH0sCisJeyAiYWQ1MzYyIiwgSURfQUQ1MzYyIH0sCisJeyAiYWQ1MzYzIiwgSURfQUQ1MzYzIH0sCisJeyAiYWQ1MzcwIiwgSURfQUQ1MzcwIH0sCisJeyAiYWQ1MzcxIiwgSURfQUQ1MzcxIH0sCisJeyAiYWQ1MzcyIiwgSURfQUQ1MzcyIH0sCisJeyAiYWQ1MzczIiwgSURfQUQ1MzczIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgYWQ1MzYwX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZDUzNjBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gImFkNTM2MCIsCisJCSAgIC5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlID0gYWQ1MzYwX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDUzNjBfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBhZDUzNjBfaWRzLAorfTsKKworc3RhdGljIF9faW5pdCBpbnQgYWQ1MzYwX3NwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkNTM2MF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYWQ1MzYwX3NwaV9pbml0KTsKKworc3RhdGljIF9fZXhpdCB2b2lkIGFkNTM2MF9zcGlfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWQ1MzYwX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhZDUzNjBfc3BpX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQ1MzYwLzYxLzYyLzYzLzcwLzcxLzcyLzczIERBQyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvYWQ1NDQ2LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU0NDYuYwppbmRleCBlOGE5ZDBiLi5lMWMyMDRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU0NDYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU0NDYuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCkBAIC02Nyw4ICs2OCw4IEBACiAJCWNvbnN0IGNoYXIgKmJ1ZiwKIAkJc2l6ZV90IGxlbikKIHsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ1NDQ2X3N0YXRlICpzdCA9IGlpb19wcml2KGRldl9pbmZvKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNTQ0Nl9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCWludCByZXQ7CiAJbG9uZyB2YWw7CiAKQEAgLTgxLDExICs4MiwxMSBAQAogCQlnb3RvIGVycm9yX3JldDsKIAl9CiAKLQltdXRleF9sb2NrKCZkZXZfaW5mby0+bWxvY2spOworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOwogCXN0LT5jYWNoZWRfdmFsID0gdmFsOwogCXN0LT5jaGlwX2luZm8tPnN0b3JlX3NhbXBsZShzdCwgdmFsKTsKIAlyZXQgPSBzcGlfc3luYyhzdC0+c3BpLCAmc3QtPm1zZyk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXZfaW5mby0+bWxvY2spOworCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CiAKIGVycm9yX3JldDoKIAlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOwpAQCAtOTcsMjEgKzk4LDIxIEBACiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJY2hhciAqYnVmKQogewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDU0NDZfc3RhdGUgKnN0ID0gaWlvX3ByaXYoZGV2X2luZm8pOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ1NDQ2X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJLyogQ29ycmVzcG9uZHMgdG8gVnJlZiAvIDJeKGJpdHMpICovCiAJdW5zaWduZWQgaW50IHNjYWxlX3V2ID0gKHN0LT52cmVmX212ICogMTAwMCkgPj4gc3QtPmNoaXBfaW5mby0+Yml0czsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkLiUwM2RcbiIsIHNjYWxlX3V2IC8gMTAwMCwgc2NhbGVfdXYgJSAxMDAwKTsKIH0KLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIob3V0X3NjYWxlLCBTX0lSVUdPLCBhZDU0NDZfc2hvd19zY2FsZSwgTlVMTCwgMCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG91dF92b2x0YWdlX3NjYWxlLCBTX0lSVUdPLCBhZDU0NDZfc2hvd19zY2FsZSwgTlVMTCwgMCk7CiAKIHN0YXRpYyBzc2l6ZV90IGFkNTQ0Nl93cml0ZV9wb3dlcmRvd25fbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCiB7Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNTQ0Nl9zdGF0ZSAqc3QgPSBpaW9fcHJpdihkZXZfaW5mbyk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDU0NDZfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAogCWlmIChzeXNmc19zdHJlcShidWYsICIxa29obV90b19nbmQiKSkKIAkJc3QtPnB3cl9kb3duX21vZGUgPSBNT0RFX1BXUkRXTl8xazsKQEAgLTEyOCw4ICsxMjksOCBAQAogc3RhdGljIHNzaXplX3QgYWQ1NDQ2X3JlYWRfcG93ZXJkb3duX21vZGUoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNTQ0Nl9zdGF0ZSAqc3QgPSBpaW9fcHJpdihkZXZfaW5mbyk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDU0NDZfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAogCWNoYXIgbW9kZVtdWzE1XSA9IHsiIiwgIjFrb2htX3RvX2duZCIsICIxMDBrb2htX3RvX2duZCIsICJ0aHJlZV9zdGF0ZSJ9OwogCkBAIC0xNDAsOCArMTQxLDggQEAKIAkJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJCSAgIGNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ1NDQ2X3N0YXRlICpzdCA9IGlpb19wcml2KGRldl9pbmZvKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNTQ0Nl9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHN0LT5wd3JfZG93bik7CiB9CkBAIC0xNTAsOCArMTUxLDggQEAKIAkJCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQogewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDU0NDZfc3RhdGUgKnN0ID0gaWlvX3ByaXYoZGV2X2luZm8pOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ1NDQ2X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJdW5zaWduZWQgbG9uZyByZWFkaW47CiAJaW50IHJldDsKIApAQCAtMTYyLDcgKzE2Myw3IEBACiAJaWYgKHJlYWRpbiA+IDEpCiAJCXJldCA9IC1FSU5WQUw7CiAKLQltdXRleF9sb2NrKCZkZXZfaW5mby0+bWxvY2spOworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOwogCXN0LT5wd3JfZG93biA9IHJlYWRpbjsKIAogCWlmIChzdC0+cHdyX2Rvd24pCkBAIC0xNzEsMjggKzE3MiwyOCBAQAogCQlzdC0+Y2hpcF9pbmZvLT5zdG9yZV9zYW1wbGUoc3QsIHN0LT5jYWNoZWRfdmFsKTsKIAogCXJldCA9IHNwaV9zeW5jKHN0LT5zcGksICZzdC0+bXNnKTsKLQltdXRleF91bmxvY2soJmRldl9pbmZvLT5tbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKIAogCXJldHVybiByZXQgPyByZXQgOiBsZW47CiB9CiAKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIob3V0X3Bvd2VyZG93bl9tb2RlLCBTX0lSVUdPIHwgU19JV1VTUiwKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIob3V0X3ZvbHRhZ2VfcG93ZXJkb3duX21vZGUsIFNfSVJVR08gfCBTX0lXVVNSLAogCQkJYWQ1NDQ2X3JlYWRfcG93ZXJkb3duX21vZGUsCiAJCQlhZDU0NDZfd3JpdGVfcG93ZXJkb3duX21vZGUsIDApOwogCi1zdGF0aWMgSUlPX0NPTlNUX0FUVFIob3V0X3Bvd2VyZG93bl9tb2RlX2F2YWlsYWJsZSwKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihvdXRfdm9sdGFnZV9wb3dlcmRvd25fbW9kZV9hdmFpbGFibGUsCiAJCQkiMWtvaG1fdG9fZ25kIDEwMGtvaG1fdG9fZ25kIHRocmVlX3N0YXRlIik7CiAKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIob3V0MF9wb3dlcmRvd24sIFNfSVJVR08gfCBTX0lXVVNSLAorc3RhdGljIElJT19ERVZJQ0VfQVRUUihvdXRfdm9sdGFnZTBfcG93ZXJkb3duLCBTX0lSVUdPIHwgU19JV1VTUiwKIAkJCWFkNTQ0Nl9yZWFkX2RhY19wb3dlcmRvd24sCiAJCQlhZDU0NDZfd3JpdGVfZGFjX3Bvd2VyZG93biwgMCk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDU0NDZfYXR0cmlidXRlc1tdID0gewotCSZpaW9fZGV2X2F0dHJfb3V0MF9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX291dF9zY2FsZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfb3V0MF9wb3dlcmRvd24uZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX291dF9wb3dlcmRvd25fbW9kZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fY29uc3RfYXR0cl9vdXRfcG93ZXJkb3duX21vZGVfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXRfdm9sdGFnZTBfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXRfdm9sdGFnZV9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2UwX3Bvd2VyZG93bi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2VfcG93ZXJkb3duX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfb3V0X3ZvbHRhZ2VfcG93ZXJkb3duX21vZGVfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCiAJTlVMTCwKIH07CiAKQEAgLTIwMCwxNiArMjAxLDE4IEBACiAJCQkJICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBpbnQgbikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNTQ0Nl9zdGF0ZSAqc3QgPSBpaW9fcHJpdihkZXZfaW5mbyk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDU0NDZfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAogCW1vZGVfdCBtb2RlID0gYXR0ci0+bW9kZTsKIAogCWlmICghc3QtPmNoaXBfaW5mby0+c3RvcmVfcHdyX2Rvd24gJiYKLQkJKGF0dHIgPT0gJmlpb19kZXZfYXR0cl9vdXQwX3Bvd2VyZG93bi5kZXZfYXR0ci5hdHRyIHx8Ci0JCWF0dHIgPT0gJmlpb19kZXZfYXR0cl9vdXRfcG93ZXJkb3duX21vZGUuZGV2X2F0dHIuYXR0ciB8fAorCQkoYXR0ciA9PSAmaWlvX2Rldl9hdHRyX291dF92b2x0YWdlMF9wb3dlcmRvd24uZGV2X2F0dHIuYXR0ciB8fAorCQlhdHRyID09ICZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2VfcG93ZXJkb3duX21vZGUuCisJCSBkZXZfYXR0ci5hdHRyIHx8CiAJCWF0dHIgPT0KLQkJJmlpb19jb25zdF9hdHRyX291dF9wb3dlcmRvd25fbW9kZV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0cikpCisJCSZpaW9fY29uc3RfYXR0cl9vdXRfdm9sdGFnZV9wb3dlcmRvd25fbW9kZV9hdmFpbGFibGUuCisJCSBkZXZfYXR0ci5hdHRyKSkKIAkJbW9kZSA9IDA7CiAKIAlyZXR1cm4gbW9kZTsKQEAgLTQyMSwxMyArNDI0LDE0IEBACiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOwogCXN0cnVjdCBhZDU0NDZfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQlzdHJ1Y3QgcmVndWxhdG9yICpyZWcgPSBzdC0+cmVnOwogCiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWYgKCFJU19FUlIocmVnKSkgewotCQlyZWd1bGF0b3JfZGlzYWJsZShyZWcpOwotCQlyZWd1bGF0b3JfcHV0KHJlZyk7CisJaWYgKCFJU19FUlIoc3QtPnJlZykpIHsKKwkJcmVndWxhdG9yX2Rpc2FibGUoc3QtPnJlZyk7CisJCXJlZ3VsYXRvcl9wdXQoc3QtPnJlZyk7CiAJfQorCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTUwNC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvYWQ1NTA0LmMKaW5kZXggMTkxNWY0NS4uNjBkZDY0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvYWQ1NTA0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvYWQ1NTA0LmMKQEAgLTcsNyArNyw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtMTUsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vc3lzZnMuaCIKQEAgLTE2OCwxMCArMTY4LDEwIEBACiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZC4lMDNkXG4iLCBzY2FsZV91diAvIDEwMDAsIHNjYWxlX3V2ICUgMTAwMCk7CiB9Ci1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKG91dF9zY2FsZSwgU19JUlVHTywgYWQ1NTA0X3Nob3dfc2NhbGUsIE5VTEwsIDApOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihvdXRfdm9sdGFnZV9zY2FsZSwgU19JUlVHTywgYWQ1NTA0X3Nob3dfc2NhbGUsIE5VTEwsIDApOwogCiAjZGVmaW5lIElJT19ERVZfQVRUUl9PVVRfUldfUkFXKF9udW0sIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJXAotCUlJT19ERVZJQ0VfQVRUUihvdXQjI19udW0jI19yYXcsCQkJCVwKKwlJSU9fREVWSUNFX0FUVFIob3V0X3ZvbHRhZ2UjI19udW0jI19yYXcsCQkJXAogCQkJU19JUlVHTyB8IFNfSVdVU1IsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQogCiBzdGF0aWMgSUlPX0RFVl9BVFRSX09VVF9SV19SQVcoMCwgYWQ1NTA0X3JlYWRfZGFjLApAQCAtMTgzLDE3ICsxODMsMTYgQEAKIHN0YXRpYyBJSU9fREVWX0FUVFJfT1VUX1JXX1JBVygzLCBhZDU1MDRfcmVhZF9kYWMsCiAJYWQ1NTA0X3dyaXRlX2RhYywgQUQ1NTA0X0FERFJfREFDMyk7CiAKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIob3V0X3Bvd2VyZG93bl9tb2RlLCBTX0lSVUdPIHwKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIob3V0X3ZvbHRhZ2VfcG93ZXJkb3duX21vZGUsIFNfSVJVR08gfAogCQkJU19JV1VTUiwgYWQ1NTA0X3JlYWRfcG93ZXJkb3duX21vZGUsCiAJCQlhZDU1MDRfd3JpdGVfcG93ZXJkb3duX21vZGUsIDApOwogCi1zdGF0aWMgSUlPX0NPTlNUX0FUVFIob3V0X3Bvd2VyZG93bl9tb2RlX2F2YWlsYWJsZSwKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihvdXRfdm9sdGFnZV9wb3dlcmRvd25fbW9kZV9hdmFpbGFibGUsCiAJCQkiMjBrb2htX3RvX2duZCB0aHJlZV9zdGF0ZSIpOwogCiAjZGVmaW5lIElJT19ERVZfQVRUUl9EQUNfUE9XRVJET1dOKF9udW0sIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJXAotCUlJT19ERVZJQ0VfQVRUUihvdXQjI19udW0jI19wb3dlcmRvd24sCQkJCVwKKwlJSU9fREVWSUNFX0FUVFIob3V0X3ZvbHRhZ2UjI19udW0jI19wb3dlcmRvd24sCQkJXAogCQkJU19JUlVHTyB8IFNfSVdVU1IsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQotCiBzdGF0aWMgSUlPX0RFVl9BVFRSX0RBQ19QT1dFUkRPV04oMCwgYWQ1NTA0X3JlYWRfZGFjX3Bvd2VyZG93biwKIAkJCQkgICBhZDU1MDRfd3JpdGVfZGFjX3Bvd2VyZG93biwgMCk7CiBzdGF0aWMgSUlPX0RFVl9BVFRSX0RBQ19QT1dFUkRPV04oMSwgYWQ1NTA0X3JlYWRfZGFjX3Bvd2VyZG93biwKQEAgLTIwNCwxNyArMjAzLDE3IEBACiAJCQkJICAgYWQ1NTA0X3dyaXRlX2RhY19wb3dlcmRvd24sIDMpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ1NTA0X2F0dHJpYnV0ZXNbXSA9IHsKLQkmaWlvX2Rldl9hdHRyX291dDBfcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9vdXQxX3Jhdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfb3V0Ml9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX291dDNfcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9vdXQwX3Bvd2VyZG93bi5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfb3V0MV9wb3dlcmRvd24uZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX291dDJfcG93ZXJkb3duLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9vdXQzX3Bvd2VyZG93bi5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfb3V0X3Bvd2VyZG93bl9tb2RlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19jb25zdF9hdHRyX291dF9wb3dlcmRvd25fbW9kZV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX291dF9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2UwX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2UxX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2UyX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2UzX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2UwX3Bvd2VyZG93bi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2UxX3Bvd2VyZG93bi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2UyX3Bvd2VyZG93bi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2UzX3Bvd2VyZG93bi5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2VfcG93ZXJkb3duX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfb3V0X3ZvbHRhZ2VfcG93ZXJkb3duX21vZGVfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXRfdm9sdGFnZV9zY2FsZS5kZXZfYXR0ci5hdHRyLAogCU5VTEwsCiB9OwogCkBAIC0yMjMsMTEgKzIyMiwxMSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNTUwMV9hdHRyaWJ1dGVzW10gPSB7Ci0JJmlpb19kZXZfYXR0cl9vdXQwX3Jhdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfb3V0MF9wb3dlcmRvd24uZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX291dF9wb3dlcmRvd25fbW9kZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fY29uc3RfYXR0cl9vdXRfcG93ZXJkb3duX21vZGVfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9vdXRfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dF92b2x0YWdlMF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dF92b2x0YWdlMF9wb3dlcmRvd24uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dF92b2x0YWdlX3Bvd2VyZG93bl9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX291dF92b2x0YWdlX3Bvd2VyZG93bl9tb2RlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2Vfc2NhbGUuZGV2X2F0dHIuYXR0ciwKIAlOVUxMLAogfTsKIApAQCAtMjQ2LDEyICsyNDUsMTMgQEAKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWQ1NTA0X2V2X2F0dHJpYnV0ZV9ncm91cCA9IHsKIAkuYXR0cnMgPSBhZDU1MDRfZXZfYXR0cmlidXRlcywKKwkubmFtZSA9ICJldmVudHMiLAogfTsKIAogc3RhdGljIGlycXJldHVybl90IGFkNTUwNF9ldmVudF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnByaXZhdGUpCiB7Ci0JaWlvX3B1c2hfZXZlbnQocHJpdmF0ZSwgMCwKLQkJICAgICAgIElJT19VTk1PRF9FVkVOVF9DT0RFKElJT19FVl9DTEFTU19URU1QLAorCWlpb19wdXNoX2V2ZW50KHByaXZhdGUsCisJCSAgICAgICBJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fVEVNUCwKIAkJCQkJICAgIDAsCiAJCQkJCSAgICBJSU9fRVZfVFlQRV9USFJFU0gsCiAJCQkJCSAgICBJSU9fRVZfRElSX1JJU0lORyksCkBAIC0yNjIsMTQgKzI2MiwxMiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkNTUwNF9pbmZvID0gewogCS5hdHRycyA9ICZhZDU1MDRfYXR0cmlidXRlX2dyb3VwLAotCS5udW1faW50ZXJydXB0X2xpbmVzID0gMSwKIAkuZXZlbnRfYXR0cnMgPSAmYWQ1NTA0X2V2X2F0dHJpYnV0ZV9ncm91cCwKIAkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBhZDU1MDFfaW5mbyA9IHsKIAkuYXR0cnMgPSAmYWQ1NTAxX2F0dHJpYnV0ZV9ncm91cCwKLQkubnVtX2ludGVycnVwdF9saW5lcyA9IDEsCiAJLmV2ZW50X2F0dHJzID0gJmFkNTUwNF9ldl9hdHRyaWJ1dGVfZ3JvdXAsCiAJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKIH07CkBAIC0yODIsNiArMjgwLDExIEBACiAJc3RydWN0IHJlZ3VsYXRvciAqcmVnOwogCWludCByZXQsIHZvbHRhZ2VfdXYgPSAwOwogCisJaW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZShzaXplb2YoKnN0KSk7CisJaWYgKGluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KIAlyZWcgPSByZWd1bGF0b3JfZ2V0KCZzcGktPmRldiwgInZjYyIpOwogCWlmICghSVNfRVJSKHJlZykpIHsKIAkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShyZWcpOwpAQCAtMjkxLDExICsyOTQsNiBAQAogCQl2b2x0YWdlX3V2ID0gcmVndWxhdG9yX2dldF92b2x0YWdlKHJlZyk7CiAJfQogCi0JaW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZShzaXplb2YoKnN0KSk7Ci0JaWYgKGluZGlvX2RldiA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfZGlzYWJsZV9yZWc7Ci0JfQogCXNwaV9zZXRfZHJ2ZGF0YShzcGksIGluZGlvX2Rldik7CiAJc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCWlmICh2b2x0YWdlX3V2KQpAQCAtMzE1LDEwICszMTMsNiBAQAogCQlpbmRpb19kZXYtPmluZm8gPSAmYWQ1NTA0X2luZm87CiAJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOwogCi0JcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfZnJlZV9kZXY7Ci0KIAlpZiAoc3BpLT5pcnEpIHsKIAkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoc3BpLT5pcnEsCiAJCQkJCSAgIE5VTEwsCkBAIC0zMjcsMjIgKzMyMSwyNiBAQAogCQkJCQkgICBzcGlfZ2V0X2RldmljZV9pZChzdC0+c3BpKS0+bmFtZSwKIAkJCQkJICAgaW5kaW9fZGV2KTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gZXJyb3JfdW5yZWdfaWlvX2RldmljZTsKKwkJCWdvdG8gZXJyb3JfZGlzYWJsZV9yZWc7CiAJfQogCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9pcnE7CisKIAlyZXR1cm4gMDsKIAotZXJyb3JfdW5yZWdfaWlvX2RldmljZToKLQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKLWVycm9yX2ZyZWVfZGV2OgotCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOworZXJyb3JfZnJlZV9pcnE6CisJZnJlZV9pcnEoc3BpLT5pcnEsIGluZGlvX2Rldik7CiBlcnJvcl9kaXNhYmxlX3JlZzoKIAlpZiAoIUlTX0VSUihyZWcpKQotCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnKTsKKwkJcmVndWxhdG9yX2Rpc2FibGUocmVnKTsKIGVycm9yX3B1dF9yZWc6CiAJaWYgKCFJU19FUlIocmVnKSkKIAkJcmVndWxhdG9yX3B1dChyZWcpOwogCisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CitlcnJvcl9yZXQ6CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzUwLDE2ICszNDgsMTYgQEAKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CiAJc3RydWN0IGFkNTUwNF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCXN0cnVjdCByZWd1bGF0b3IgKnJlZyA9IHN0LT5yZWc7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIAlpZiAoc3BpLT5pcnEpCiAJCWZyZWVfaXJxKHNwaS0+aXJxLCBpbmRpb19kZXYpOwogCi0JaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7Ci0KLQlpZiAoIUlTX0VSUihyZWcpKSB7Ci0JCXJlZ3VsYXRvcl9kaXNhYmxlKHJlZyk7Ci0JCXJlZ3VsYXRvcl9wdXQocmVnKTsKKwlpZiAoIUlTX0VSUihzdC0+cmVnKSkgeworCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnKTsKKwkJcmVndWxhdG9yX3B1dChzdC0+cmVnKTsKIAl9CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTYyNHJfc3BpLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU2MjRyX3NwaS5jCmluZGV4IGE1YjM3NzYuLjI4NGQ4NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTYyNHJfc3BpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvYWQ1NjI0cl9zcGkuYwpAQCAtNyw3ICs3LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0xNSw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi9zeXNmcy5oIgpAQCAtMTcyLDIyICsxNzIsMjIgQEAKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkLiUwM2RcbiIsIHNjYWxlX3V2IC8gMTAwMCwgc2NhbGVfdXYgJSAxMDAwKTsKIH0KLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIob3V0X3NjYWxlLCBTX0lSVUdPLCBhZDU2MjRyX3Nob3dfc2NhbGUsIE5VTEwsIDApOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihvdXRfdm9sdGFnZV9zY2FsZSwgU19JUlVHTywgYWQ1NjI0cl9zaG93X3NjYWxlLCBOVUxMLCAwKTsKIAogc3RhdGljIElJT19ERVZfQVRUUl9PVVRfUkFXKDAsIGFkNTYyNHJfd3JpdGVfZGFjLCBBRDU2MjRSX0FERFJfREFDMCk7CiBzdGF0aWMgSUlPX0RFVl9BVFRSX09VVF9SQVcoMSwgYWQ1NjI0cl93cml0ZV9kYWMsIEFENTYyNFJfQUREUl9EQUMxKTsKIHN0YXRpYyBJSU9fREVWX0FUVFJfT1VUX1JBVygyLCBhZDU2MjRyX3dyaXRlX2RhYywgQUQ1NjI0Ul9BRERSX0RBQzIpOwogc3RhdGljIElJT19ERVZfQVRUUl9PVVRfUkFXKDMsIGFkNTYyNHJfd3JpdGVfZGFjLCBBRDU2MjRSX0FERFJfREFDMyk7CiAKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIob3V0X3Bvd2VyZG93bl9tb2RlLCBTX0lSVUdPIHwKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIob3V0X3ZvbHRhZ2VfcG93ZXJkb3duX21vZGUsIFNfSVJVR08gfAogCQkJU19JV1VTUiwgYWQ1NjI0cl9yZWFkX3Bvd2VyZG93bl9tb2RlLAogCQkJYWQ1NjI0cl93cml0ZV9wb3dlcmRvd25fbW9kZSwgMCk7CiAKLXN0YXRpYyBJSU9fQ09OU1RfQVRUUihvdXRfcG93ZXJkb3duX21vZGVfYXZhaWxhYmxlLAorc3RhdGljIElJT19DT05TVF9BVFRSKG91dF92b2x0YWdlX3Bvd2VyZG93bl9tb2RlX2F2YWlsYWJsZSwKIAkJCSIxa29obV90b19nbmQgMTAwa29obV90b19nbmQgdGhyZWVfc3RhdGUiKTsKIAogI2RlZmluZSBJSU9fREVWX0FUVFJfREFDX1BPV0VSRE9XTihfbnVtLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJCVwKLQlJSU9fREVWSUNFX0FUVFIob3V0IyNfbnVtIyNfcG93ZXJkb3duLAkJCQlcCisJSUlPX0RFVklDRV9BVFRSKG91dF92b2x0YWdlIyNfbnVtIyNfcG93ZXJkb3duLAkJCVwKIAkJCVNfSVJVR08gfCBTX0lXVVNSLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKIAogc3RhdGljIElJT19ERVZfQVRUUl9EQUNfUE9XRVJET1dOKDAsIGFkNTYyNHJfcmVhZF9kYWNfcG93ZXJkb3duLApAQCAtMjAwLDE3ICsyMDAsMTcgQEAKIAkJCQkgICBhZDU2MjRyX3dyaXRlX2RhY19wb3dlcmRvd24sIDMpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQ1NjI0cl9hdHRyaWJ1dGVzW10gPSB7Ci0JJmlpb19kZXZfYXR0cl9vdXQwX3Jhdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfb3V0MV9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX291dDJfcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9vdXQzX3Jhdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfb3V0MF9wb3dlcmRvd24uZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX291dDFfcG93ZXJkb3duLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9vdXQyX3Bvd2VyZG93bi5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfb3V0M19wb3dlcmRvd24uZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX291dF9wb3dlcmRvd25fbW9kZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fY29uc3RfYXR0cl9vdXRfcG93ZXJkb3duX21vZGVfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9vdXRfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dF92b2x0YWdlMF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dF92b2x0YWdlMV9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dF92b2x0YWdlMl9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dF92b2x0YWdlM19yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dF92b2x0YWdlMF9wb3dlcmRvd24uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dF92b2x0YWdlMV9wb3dlcmRvd24uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dF92b2x0YWdlMl9wb3dlcmRvd24uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dF92b2x0YWdlM19wb3dlcmRvd24uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dF92b2x0YWdlX3Bvd2VyZG93bl9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX291dF92b2x0YWdlX3Bvd2VyZG93bl9tb2RlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2Vfc2NhbGUuZGV2X2F0dHIuYXR0ciwKIAlOVUxMLAogfTsKIApAQCAtMjI3LDI0ICsyMjcsMjMgQEAKIHsKIAlzdHJ1Y3QgYWQ1NjI0cl9zdGF0ZSAqc3Q7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKLQlzdHJ1Y3QgcmVndWxhdG9yICpyZWc7CiAJaW50IHJldCwgdm9sdGFnZV91diA9IDA7CiAKLQlyZWcgPSByZWd1bGF0b3JfZ2V0KCZzcGktPmRldiwgInZjYyIpOwotCWlmICghSVNfRVJSKHJlZykpIHsKLQkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShyZWcpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnJvcl9wdXRfcmVnOwotCi0JCXZvbHRhZ2VfdXYgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UocmVnKTsKLQl9CiAJaW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZShzaXplb2YoKnN0KSk7CiAJaWYgKGluZGlvX2RldiA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfZGlzYWJsZV9yZWc7CisJCWdvdG8gZXJyb3JfcmV0OwogCX0KIAlzdCA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0Jc3QtPnJlZyA9IHJlZzsKKwlzdC0+cmVnID0gcmVndWxhdG9yX2dldCgmc3BpLT5kZXYsICJ2Y2MiKTsKKwlpZiAoIUlTX0VSUihzdC0+cmVnKSkgeworCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHN0LT5yZWcpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl9wdXRfcmVnOworCisJCXZvbHRhZ2VfdXYgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Uoc3QtPnJlZyk7CisJfQorCiAJc3BpX3NldF9kcnZkYXRhKHNwaSwgaW5kaW9fZGV2KTsKIAlzdC0+Y2hpcF9pbmZvID0KIAkJJmFkNTYyNHJfY2hpcF9pbmZvX3RibFtzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5kcml2ZXJfZGF0YV07CkBAIC0yNjEsMjUgKzI2MCwyNSBAQAogCWluZGlvX2Rldi0+aW5mbyA9ICZhZDU2MjRyX2luZm87CiAJaW5kaW9fZGV2LT5tb2RlcyA9IElORElPX0RJUkVDVF9NT0RFOwogCi0JcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfZnJlZV9kZXY7Ci0KIAlyZXQgPSBhZDU2MjRyX3NwaV93cml0ZShzcGksIEFENTYyNFJfQ01EX0lOVEVSTkFMX1JFRkVSX1NFVFVQLCAwLAogCQkJCSEhdm9sdGFnZV91diwgMTYpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisJCWdvdG8gZXJyb3JfZGlzYWJsZV9yZWc7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9kaXNhYmxlX3JlZzsKIAogCXJldHVybiAwOwogCi1lcnJvcl9mcmVlX2RldjoKLQlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIGVycm9yX2Rpc2FibGVfcmVnOgotCWlmICghSVNfRVJSKHJlZykpCi0JCXJlZ3VsYXRvcl9kaXNhYmxlKHJlZyk7CisJaWYgKCFJU19FUlIoc3QtPnJlZykpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT5yZWcpOwogZXJyb3JfcHV0X3JlZzoKLQlpZiAoIUlTX0VSUihyZWcpKQotCQlyZWd1bGF0b3JfcHV0KHJlZyk7CisJaWYgKCFJU19FUlIoc3QtPnJlZykpCisJCXJlZ3VsYXRvcl9wdXQoc3QtPnJlZyk7CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CitlcnJvcl9yZXQ6CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjg4LDEzICsyODcsMTMgQEAKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CiAJc3RydWN0IGFkNTYyNHJfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQlzdHJ1Y3QgcmVndWxhdG9yICpyZWcgPSBzdC0+cmVnOwogCiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWYgKCFJU19FUlIocmVnKSkgewotCQlyZWd1bGF0b3JfZGlzYWJsZShyZWcpOwotCQlyZWd1bGF0b3JfcHV0KHJlZyk7CisJaWYgKCFJU19FUlIoc3QtPnJlZykpIHsKKwkJcmVndWxhdG9yX2Rpc2FibGUoc3QtPnJlZyk7CisJCXJlZ3VsYXRvcl9wdXQoc3QtPnJlZyk7CiAJfQorCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU2ODYuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTY4Ni5jCmluZGV4IGZkNjdjZmEuLjQ4Mzg5ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTY4Ni5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTY4Ni5jCkBAIC03LDkgKzcsOSBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMjUsMTAgKzI1LDcgQEAKICNkZWZpbmUgQUQ1Njg2X0FERFIoeCkJCQkJKCh4KSA8PCAxNikKICNkZWZpbmUgQUQ1Njg2X0NNRCh4KQkJCQkoKHgpIDw8IDIwKQogCi0jZGVmaW5lIEFENTY4Nl9BRERSX0RBQzAJCQkweDEKLSNkZWZpbmUgQUQ1Njg2X0FERFJfREFDMQkJCTB4MgotI2RlZmluZSBBRDU2ODZfQUREUl9EQUMyCQkJMHg0Ci0jZGVmaW5lIEFENTY4Nl9BRERSX0RBQzMJCQkweDgKKyNkZWZpbmUgQUQ1Njg2X0FERFJfREFDKGNoYW4pCQkoMHgxIDw8IChjaGFuKSkKICNkZWZpbmUgQUQ1Njg2X0FERFJfQUxMX0RBQwkJCTB4RgogCiAjZGVmaW5lIEFENTY4Nl9DTURfTk9PUAkJCQkweDAKQEAgLTk2LDYzICs5MywzNSBAQAogCUlEX0FENTY4NSwKIAlJRF9BRDU2ODYsCiB9OwotCisjZGVmaW5lIEFENTg2OF9DSEFOTkVMKGNoYW4sIGJpdHMsIHNoaWZ0KSB7CQkJXAorCQkudHlwZSA9IElJT19WT0xUQUdFLAkJCQlcCisJCS5pbmRleGVkID0gMSwJCQkJCVwKKwkJLm91dHB1dCA9IDEsCQkJCQlcCisJCS5jaGFubmVsID0gY2hhbiwJCQkJXAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAlcCisJCS5hZGRyZXNzID0gQUQ1Njg2X0FERFJfREFDKGNoYW4pLAkJCVwKKwkJLnNjYW5fdHlwZSA9IElJT19TVCgndScsIGJpdHMsIDE2LCBzaGlmdCkJXAorfQogc3RhdGljIGNvbnN0IHN0cnVjdCBhZDU2ODZfY2hpcF9pbmZvIGFkNTY4Nl9jaGlwX2luZm9fdGJsW10gPSB7CiAJW0lEX0FENTY4NF0gPSB7Ci0JCS5jaGFubmVsWzBdID0gSUlPX0NIQU4oSUlPX09VVCwgMCwgMSwgMCwgTlVMTCwgMCwgMCwKLQkJCQkgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkJCSAgICBBRDU2ODZfQUREUl9EQUMwLAotCQkJCSAgICAwLCBJSU9fU1QoJ3UnLCAxMiwgMTYsIDQpLCAwKSwKLQkJLmNoYW5uZWxbMV0gPSBJSU9fQ0hBTihJSU9fT1VULCAwLCAxLCAwLCBOVUxMLCAxLCAwLAotCQkJCSAgICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCQkJICAgIEFENTY4Nl9BRERSX0RBQzEsCi0JCQkJICAgIDEsIElJT19TVCgndScsIDEyLCAxNiwgNCksIDApLAotCQkuY2hhbm5lbFsyXSA9IElJT19DSEFOKElJT19PVVQsIDAsIDEsIDAsIE5VTEwsIDIsIDAsCi0JCQkJICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJCQkgICAgQUQ1Njg2X0FERFJfREFDMiwKLQkJCQkgICAgMiwgSUlPX1NUKCd1JywgMTIsIDE2LCA0KSwgMCksCi0JCS5jaGFubmVsWzNdID0gSUlPX0NIQU4oSUlPX09VVCwgMCwgMSwgMCwgTlVMTCwgMywgMCwKLQkJCQkgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkJCSAgICBBRDU2ODZfQUREUl9EQUMzLAotCQkJCSAgICAzLCBJSU9fU1QoJ3UnLCAxMiwgMTYsIDQpLCAwKSwKKwkJLmNoYW5uZWxbMF0gPSBBRDU4NjhfQ0hBTk5FTCgwLCAxMiwgNCksCisJCS5jaGFubmVsWzFdID0gQUQ1ODY4X0NIQU5ORUwoMSwgMTIsIDQpLAorCQkuY2hhbm5lbFsyXSA9IEFENTg2OF9DSEFOTkVMKDIsIDEyLCA0KSwKKwkJLmNoYW5uZWxbM10gPSBBRDU4NjhfQ0hBTk5FTCgzLCAxMiwgNCksCiAJCS5pbnRfdnJlZl9tdiA9IDI1MDAsCiAJfSwKIAlbSURfQUQ1Njg1XSA9IHsKLQkJLmNoYW5uZWxbMF0gPSBJSU9fQ0hBTihJSU9fT1VULCAwLCAxLCAwLCBOVUxMLCAwLCAwLAotCQkJCSAgICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCQkJICAgIEFENTY4Nl9BRERSX0RBQzAsCi0JCQkJICAgIDAsIElJT19TVCgndScsIDE0LCAxNiwgMiksIDApLAotCQkuY2hhbm5lbFsxXSA9IElJT19DSEFOKElJT19PVVQsIDAsIDEsIDAsIE5VTEwsIDEsIDAsCi0JCQkJICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJCQkgICAgQUQ1Njg2X0FERFJfREFDMSwKLQkJCQkgICAgMSwgSUlPX1NUKCd1JywgMTQsIDE2LCAyKSwgMCksCi0JCS5jaGFubmVsWzJdID0gSUlPX0NIQU4oSUlPX09VVCwgMCwgMSwgMCwgTlVMTCwgMiwgMCwKLQkJCQkgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkJCSAgICBBRDU2ODZfQUREUl9EQUMyLAotCQkJCSAgICAyLCBJSU9fU1QoJ3UnLCAxNCwgMTYsIDIpLCAwKSwKLQkJLmNoYW5uZWxbM10gPSBJSU9fQ0hBTihJSU9fT1VULCAwLCAxLCAwLCBOVUxMLCAzLCAwLAotCQkJCSAgICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCQkJICAgIEFENTY4Nl9BRERSX0RBQzMsCi0JCQkJICAgIDMsIElJT19TVCgndScsIDE0LCAxNiwgMiksIDApLAorCQkuY2hhbm5lbFswXSA9IEFENTg2OF9DSEFOTkVMKDAsIDE0LCAyKSwKKwkJLmNoYW5uZWxbMV0gPSBBRDU4NjhfQ0hBTk5FTCgxLCAxNCwgMiksCisJCS5jaGFubmVsWzJdID0gQUQ1ODY4X0NIQU5ORUwoMiwgMTQsIDIpLAorCQkuY2hhbm5lbFszXSA9IEFENTg2OF9DSEFOTkVMKDMsIDE0LCAyKSwKIAkJLmludF92cmVmX212ID0gMjUwMCwKIAl9LAogCVtJRF9BRDU2ODZdID0gewotCQkuY2hhbm5lbFswXSA9IElJT19DSEFOKElJT19PVVQsIDAsIDEsIDAsIE5VTEwsIDAsIDAsCi0JCQkJICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJCQkgICAgQUQ1Njg2X0FERFJfREFDMCwKLQkJCQkgICAgMCwgSUlPX1NUKCd1JywgMTYsIDE2LCAwKSwgMCksCi0JCS5jaGFubmVsWzFdID0gSUlPX0NIQU4oSUlPX09VVCwgMCwgMSwgMCwgTlVMTCwgMSwgMCwKLQkJCQkgICAgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkJCSAgICBBRDU2ODZfQUREUl9EQUMxLAotCQkJCSAgICAxLCBJSU9fU1QoJ3UnLCAxNiwgMTYsIDApLCAwKSwKLQkJLmNoYW5uZWxbMl0gPSBJSU9fQ0hBTihJSU9fT1VULCAwLCAxLCAwLCBOVUxMLCAyLCAwLAotCQkJCSAgICAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCQkJICAgIEFENTY4Nl9BRERSX0RBQzIsCi0JCQkJICAgIDIsIElJT19TVCgndScsIDE2LCAxNiwgMCksIDApLAotCQkuY2hhbm5lbFszXSA9IElJT19DSEFOKElJT19PVVQsIDAsIDEsIDAsIE5VTEwsIDMsIDAsCi0JCQkJICAgICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJCQkgICAgQUQ1Njg2X0FERFJfREFDMywKLQkJCQkgICAgMywgSUlPX1NUKCd1JywgMTYsIDE2LCAwKSwgMCksCisJCS5jaGFubmVsWzBdID0gQUQ1ODY4X0NIQU5ORUwoMCwgMTYsIDApLAorCQkuY2hhbm5lbFsxXSA9IEFENTg2OF9DSEFOTkVMKDEsIDE2LCAwKSwKKwkJLmNoYW5uZWxbMl0gPSBBRDU4NjhfQ0hBTk5FTCgyLCAxNiwgMCksCisJCS5jaGFubmVsWzNdID0gQUQ1ODY4X0NIQU5ORUwoMywgMTYsIDApLAogCQkuaW50X3ZyZWZfbXYgPSAyNTAwLAogCX0sCiB9OwpAQCAtMjc0LDExICsyNDMsMTIgQEAKIAlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOwogfQogCi1zdGF0aWMgSUlPX0NPTlNUX0FUVFIob3V0X3Bvd2VyZG93bl9tb2RlX2F2YWlsYWJsZSwKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihvdXRfdm9sdGFnZV9wb3dlcmRvd25fbW9kZV9hdmFpbGFibGUsCiAJCQkiMWtvaG1fdG9fZ25kIDEwMGtvaG1fdG9fZ25kIHRocmVlX3N0YXRlIik7CiAKLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0RBQ19QT1dFUkRPV05fTU9ERShfbnVtKSBcCi0JSUlPX0RFVklDRV9BVFRSKG91dCMjX251bSMjX3Bvd2VyZG93bl9tb2RlLCBTX0lSVUdPIHwgU19JV1VTUiwJXAorI2RlZmluZSBJSU9fREVWX0FUVFJfREFDX1BPV0VSRE9XTl9NT0RFKF9udW0pCQkJCVwKKwlJSU9fREVWSUNFX0FUVFIob3V0X3ZvbHRhZ2UjI19udW0jI19wb3dlcmRvd25fbW9kZSwJCVwKKwkJCVNfSVJVR08gfCBTX0lXVVNSLAkJCQlcCiAJCQlhZDU2ODZfcmVhZF9wb3dlcmRvd25fbW9kZSwJCQlcCiAJCQlhZDU2ODZfd3JpdGVfcG93ZXJkb3duX21vZGUsIF9udW0pCiAKQEAgLTI4Nyw4ICsyNTcsOSBAQAogc3RhdGljIElJT19ERVZfQVRUUl9EQUNfUE9XRVJET1dOX01PREUoMik7CiBzdGF0aWMgSUlPX0RFVl9BVFRSX0RBQ19QT1dFUkRPV05fTU9ERSgzKTsKIAotI2RlZmluZSBJSU9fREVWX0FUVFJfREFDX1BPV0VSRE9XTihfbnVtKQlcCi0JSUlPX0RFVklDRV9BVFRSKG91dCMjX251bSMjX3Bvd2VyZG93biwgU19JUlVHTyB8IFNfSVdVU1IsCVwKKyNkZWZpbmUgSUlPX0RFVl9BVFRSX0RBQ19QT1dFUkRPV04oX251bSkJCQkJXAorCUlJT19ERVZJQ0VfQVRUUihvdXRfdm9sdGFnZSMjX251bSMjX3Bvd2VyZG93biwJCQlcCisJCQlTX0lSVUdPIHwgU19JV1VTUiwJCQkJXAogCQkJYWQ1Njg2X3JlYWRfZGFjX3Bvd2VyZG93biwJCQlcCiAJCQlhZDU2ODZfd3JpdGVfZGFjX3Bvd2VyZG93biwgX251bSkKIApAQCAtMjk4LDE1ICsyNjksMTUgQEAKIHN0YXRpYyBJSU9fREVWX0FUVFJfREFDX1BPV0VSRE9XTigzKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNTY4Nl9hdHRyaWJ1dGVzW10gPSB7Ci0JJmlpb19kZXZfYXR0cl9vdXQwX3Bvd2VyZG93bi5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfb3V0MV9wb3dlcmRvd24uZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX291dDJfcG93ZXJkb3duLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9vdXQzX3Bvd2VyZG93bi5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfb3V0MF9wb3dlcmRvd25fbW9kZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfb3V0MV9wb3dlcmRvd25fbW9kZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfb3V0Ml9wb3dlcmRvd25fbW9kZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfb3V0M19wb3dlcmRvd25fbW9kZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fY29uc3RfYXR0cl9vdXRfcG93ZXJkb3duX21vZGVfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXRfdm9sdGFnZTBfcG93ZXJkb3duLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXRfdm9sdGFnZTFfcG93ZXJkb3duLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXRfdm9sdGFnZTJfcG93ZXJkb3duLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXRfdm9sdGFnZTNfcG93ZXJkb3duLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXRfdm9sdGFnZTBfcG93ZXJkb3duX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dF92b2x0YWdlMV9wb3dlcmRvd25fbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2UyX3Bvd2VyZG93bl9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXRfdm9sdGFnZTNfcG93ZXJkb3duX21vZGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfb3V0X3ZvbHRhZ2VfcG93ZXJkb3duX21vZGVfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCiAJTlVMTCwKIH07CiAKQEAgLTM1Niw3ICszMjcsNyBAQAogCiAJc3dpdGNoIChtYXNrKSB7CiAJY2FzZSAwOgotCQlpZiAodmFsID4gKDEgPDwgY2hhbi0+c2Nhbl90eXBlLnJlYWxiaXRzKSkKKwkJaWYgKHZhbCA+ICgxIDw8IGNoYW4tPnNjYW5fdHlwZS5yZWFsYml0cykgfHwgdmFsIDwgMCkKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOwpAQCAtNDIwLDE2ICszOTEsMTYgQEAKIAlpbmRpb19kZXYtPmNoYW5uZWxzID0gc3QtPmNoaXBfaW5mby0+Y2hhbm5lbDsKIAlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFENTY4Nl9EQUNfQ0hBTk5FTFM7CiAKLQlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcl9kaXNhYmxlX3JlZzsKLQogCXJlZ2RvbmUgPSAxOwogCXJldCA9IGFkNTY4Nl9zcGlfd3JpdGUoc3QsIEFENTY4Nl9DTURfSU5URVJOQUxfUkVGRVJfU0VUVVAsIDAsCiAJCQkJISF2b2x0YWdlX3V2LCAwKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX2Rpc2FibGVfcmVnOwogCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZGlzYWJsZV9yZWc7CisKIAlyZXR1cm4gMDsKIAogZXJyb3JfZGlzYWJsZV9yZWc6CkBAIC00MzksMTAgKzQxMCw3IEBACiAJaWYgKCFJU19FUlIoc3QtPnJlZykpCiAJCXJlZ3VsYXRvcl9wdXQoc3QtPnJlZyk7CiAKLQlpZiAocmVnZG9uZSkKLQkJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7Ci0JZWxzZQotCQlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC00NTEsMTQgKzQxOSwxMyBAQAogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKIAlzdHJ1Y3QgYWQ1Njg2X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0Jc3RydWN0IHJlZ3VsYXRvciAqcmVnID0gc3QtPnJlZzsKLQotCWlmICghSVNfRVJSKHJlZykpIHsKLQkJcmVndWxhdG9yX2Rpc2FibGUocmVnKTsKLQkJcmVndWxhdG9yX3B1dChyZWcpOwotCX0KIAogCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlmICghSVNfRVJSKHN0LT5yZWcpKSB7CisJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT5yZWcpOworCQlyZWd1bGF0b3JfcHV0KHN0LT5yZWcpOworCX0KKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvYWQ1NzkxLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU3OTEuYwppbmRleCA2NDc3MGQyLi42ZmJjYThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU3OTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9hZDU3OTEuYwpAQCAtNyw3ICs3LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CkBAIC0xNSw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi9zeXNmcy5oIgpAQCAtNzEsNDggKzcxLDIzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHNzaXplX3QgYWQ1NzkxX3dyaXRlX2RhYyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCi17Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDU3OTFfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7Ci0JbG9uZyByZWFkaW47Ci0JaW50IHJldDsKLQotCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmLCAxMCwgJnJlYWRpbik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJlYWRpbiArPSAoMSA8PCAoc3QtPmNoaXBfaW5mby0+Yml0cyAtIDEpKTsKLQlyZWFkaW4gJj0gQUQ1NzkxX1JFU19NQVNLKHN0LT5jaGlwX2luZm8tPmJpdHMpOwotCXJlYWRpbiA8PD0gc3QtPmNoaXBfaW5mby0+bGVmdF9zaGlmdDsKLQotCXJldCA9IGFkNTc5MV9zcGlfd3JpdGUoc3QtPnNwaSwgdGhpc19hdHRyLT5hZGRyZXNzLCByZWFkaW4pOwotCXJldHVybiByZXQgPyByZXQgOiBsZW47CisjZGVmaW5lIEFENTc5MV9DSEFOKGJpdHMsIHNoaWZ0KSB7CQkJXAorCS50eXBlID0gSUlPX1ZPTFRBR0UsCQkJCVwKKwkub3V0cHV0ID0gMSwJCQkJCVwKKwkuaW5kZXhlZCA9IDEsCQkJCQlcCisJLmFkZHJlc3MgPSBBRDU3OTFfQUREUl9EQUMwLAkJCVwKKwkuY2hhbm5lbCA9IDAsCQkJCQlcCisJLmluZm9fbWFzayA9ICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSB8IFwKKwkJKDEgPDwgSUlPX0NIQU5fSU5GT19PRkZTRVRfU0hBUkVEKSwJXAorCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3UnLCBiaXRzLCAyNCwgc2hpZnQpCVwKIH0KIAotc3RhdGljIHNzaXplX3QgYWQ1NzkxX3JlYWRfZGFjKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCSAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkNTc5MV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKLQlpbnQgcmV0OwotCWludCB2YWw7Ci0KLQlyZXQgPSBhZDU3OTFfc3BpX3JlYWQoc3QtPnNwaSwgdGhpc19hdHRyLT5hZGRyZXNzLCAmdmFsKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JdmFsICY9IEFENTc5MV9EQUNfTUFTSzsKLQl2YWwgPj49IHN0LT5jaGlwX2luZm8tPmxlZnRfc2hpZnQ7Ci0JdmFsIC09ICgxIDw8IChzdC0+Y2hpcF9pbmZvLT5iaXRzIC0gMSkpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7Ci19CitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgYWQ1NzkxX2NoYW5uZWxzW10gPSB7CisJW0lEX0FENTc2MF0gPSBBRDU3OTFfQ0hBTigxNiwgNCksCisJW0lEX0FENTc4MF0gPSBBRDU3OTFfQ0hBTigxOCwgMiksCisJW0lEX0FENTc4MV0gPSBBRDU3OTFfQ0hBTigxOCwgMiksCisJW0lEX0FENTc5MV0gPSBBRDU3OTFfQ0hBTigyMCwgMCkKK307CiAKIHN0YXRpYyBzc2l6ZV90IGFkNTc5MV9yZWFkX3Bvd2VyZG93bl9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQpAQCAtMTgzLDU4ICsxNTgsMjQgQEAKIAlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOwogfQogCi1zdGF0aWMgc3NpemVfdCBhZDU3OTFfc2hvd19zY2FsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJY2hhciAqYnVmKQotewotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ1NzkxX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0JLyogQ29ycmVzcG9uZHMgdG8gVnJlZiAvIDJeKGJpdHMpICovCi0JdW5zaWduZWQgaW50IHNjYWxlX3V2ID0gKHN0LT52cmVmX212ICogMTAwMCkgPj4gc3QtPmNoaXBfaW5mby0+Yml0czsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkLiUwM2RcbiIsIHNjYWxlX3V2IC8gMTAwMCwgc2NhbGVfdXYgJSAxMDAwKTsKLX0KLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIob3V0X3NjYWxlLCBTX0lSVUdPLCBhZDU3OTFfc2hvd19zY2FsZSwgTlVMTCwgMCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGFkNTc5MV9zaG93X25hbWUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgY2hhciAqYnVmKQotewotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ1NzkxX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgc3BpX2dldF9kZXZpY2VfaWQoc3QtPnNwaSktPm5hbWUpOwotfQotc3RhdGljIElJT19ERVZJQ0VfQVRUUihuYW1lLCBTX0lSVUdPLCBhZDU3OTFfc2hvd19uYW1lLCBOVUxMLCAwKTsKLQotI2RlZmluZSBJSU9fREVWX0FUVFJfT1VUX1JXX1JBVyhfbnVtLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJCVwKLQlJSU9fREVWSUNFX0FUVFIob3V0IyNfbnVtIyNfcmF3LAkJCQlcCi0JCQlTX0lSVUdPIHwgU19JV1VTUiwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCi0KLXN0YXRpYyBJSU9fREVWX0FUVFJfT1VUX1JXX1JBVygwLCBhZDU3OTFfcmVhZF9kYWMsCi0JYWQ1NzkxX3dyaXRlX2RhYywgQUQ1NzkxX0FERFJfREFDMCk7Ci0KLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIob3V0X3Bvd2VyZG93bl9tb2RlLCBTX0lSVUdPIHwKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIob3V0X3ZvbHRhZ2VfcG93ZXJkb3duX21vZGUsIFNfSVJVR08gfAogCQkJU19JV1VTUiwgYWQ1NzkxX3JlYWRfcG93ZXJkb3duX21vZGUsCiAJCQlhZDU3OTFfd3JpdGVfcG93ZXJkb3duX21vZGUsIDApOwogCi1zdGF0aWMgSUlPX0NPTlNUX0FUVFIob3V0X3Bvd2VyZG93bl9tb2RlX2F2YWlsYWJsZSwKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihvdXRfdm9sdGFnZV9wb3dlcmRvd25fbW9kZV9hdmFpbGFibGUsCiAJCQkiNmtvaG1fdG9fZ25kIHRocmVlX3N0YXRlIik7CiAKICNkZWZpbmUgSUlPX0RFVl9BVFRSX0RBQ19QT1dFUkRPV04oX251bSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQlcCi0JSUlPX0RFVklDRV9BVFRSKG91dCMjX251bSMjX3Bvd2VyZG93biwJCQkJXAorCUlJT19ERVZJQ0VfQVRUUihvdXRfdm9sdGFnZSMjX251bSMjX3Bvd2VyZG93biwJCQlcCiAJCQlTX0lSVUdPIHwgU19JV1VTUiwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCiAKIHN0YXRpYyBJSU9fREVWX0FUVFJfREFDX1BPV0VSRE9XTigwLCBhZDU3OTFfcmVhZF9kYWNfcG93ZXJkb3duLAogCQkJCSAgIGFkNTc5MV93cml0ZV9kYWNfcG93ZXJkb3duLCAwKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNTc5MV9hdHRyaWJ1dGVzW10gPSB7Ci0JJmlpb19kZXZfYXR0cl9vdXQwX3Jhdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfb3V0MF9wb3dlcmRvd24uZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX291dF9wb3dlcmRvd25fbW9kZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fY29uc3RfYXR0cl9vdXRfcG93ZXJkb3duX21vZGVfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9vdXRfc2NhbGUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dF92b2x0YWdlMF9wb3dlcmRvd24uZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dF92b2x0YWdlX3Bvd2VyZG93bl9tb2RlLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX291dF92b2x0YWdlX3Bvd2VyZG93bl9tb2RlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAogCU5VTEwsCiB9OwogCkBAIC0yNjMsMzEgKzIwNCw3OCBAQAogCWVsc2UKIAkJcmV0dXJuIEFENTc4MF9MSU5DT01QXzEwXzIwOwogfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFkNTc5MV9jaGlwX2luZm8gYWQ1NzkxX2NoaXBfaW5mb190YmxbXSA9IHsKIAlbSURfQUQ1NzYwXSA9IHsKLQkJLmJpdHMgPSAxNiwKLQkJLmxlZnRfc2hpZnQgPSA0LAogCQkuZ2V0X2xpbl9jb21wID0gYWQ1NzgwX2dldF9saW5fY29tcCwKIAl9LAogCVtJRF9BRDU3ODBdID0gewotCQkuYml0cyA9IDE4LAotCQkubGVmdF9zaGlmdCA9IDIsCiAJCS5nZXRfbGluX2NvbXAgPSBhZDU3ODBfZ2V0X2xpbl9jb21wLAogCX0sCiAJW0lEX0FENTc4MV0gPSB7Ci0JCS5iaXRzID0gMTgsCi0JCS5sZWZ0X3NoaWZ0ID0gMiwKIAkJLmdldF9saW5fY29tcCA9IGFkNTc5MV9nZXRfbGluX2NvbXAsCiAJfSwKIAlbSURfQUQ1NzkxXSA9IHsKLQkJLmJpdHMgPSAyMCwKLQkJLmxlZnRfc2hpZnQgPSAwLAogCQkuZ2V0X2xpbl9jb21wID0gYWQ1NzkxX2dldF9saW5fY29tcCwKIAl9LAogfTsKIAorc3RhdGljIGludCBhZDU3OTFfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCSAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgaW50ICp2YWwsCisJCQkgICBpbnQgKnZhbDIsCisJCQkgICBsb25nIG0pCit7CisJc3RydWN0IGFkNTc5MV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXU2NCB2YWw2NDsKKwlpbnQgcmV0OworCisJc3dpdGNoIChtKSB7CisJY2FzZSAwOgorCQlyZXQgPSBhZDU3OTFfc3BpX3JlYWQoc3QtPnNwaSwgY2hhbi0+YWRkcmVzcywgdmFsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCSp2YWwgJj0gQUQ1NzkxX0RBQ19NQVNLOworCQkqdmFsID4+PSBjaGFuLT5zY2FuX3R5cGUuc2hpZnQ7CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwljYXNlICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKToKKwkJKnZhbCA9IDA7CisJCSp2YWwyID0gKCgodTY0KXN0LT52cmVmX212KSAqIDEwMDAwMDBVTEwpID4+IGNoYW4tPnNjYW5fdHlwZS5yZWFsYml0czsKKwkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX09GRlNFVF9TSEFSRUQpOgorCQl2YWw2NCA9ICgoKHU2NClzdC0+dnJlZl9uZWdfbXYpIDw8IGNoYW4tPnNjYW5fdHlwZS5yZWFsYml0cyk7CisJCWRvX2Rpdih2YWw2NCwgc3QtPnZyZWZfbXYpOworCQkqdmFsID0gLXZhbDY0OworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCit9OworCisKK3N0YXRpYyBpbnQgYWQ1NzkxX3dyaXRlX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgIGludCB2YWwsCisJCQkgICAgaW50IHZhbDIsCisJCQkgICAgbG9uZyBtYXNrKQoreworCXN0cnVjdCBhZDU3OTFfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgMDoKKwkJdmFsICY9IEFENTc5MV9SRVNfTUFTSyhjaGFuLT5zY2FuX3R5cGUucmVhbGJpdHMpOworCQl2YWwgPDw9IGNoYW4tPnNjYW5fdHlwZS5zaGlmdDsKKworCQlyZXR1cm4gYWQ1NzkxX3NwaV93cml0ZShzdC0+c3BpLCBjaGFuLT5hZGRyZXNzLCB2YWwpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkNTc5MV9pbmZvID0geworCS5yZWFkX3JhdyA9ICZhZDU3OTFfcmVhZF9yYXcsCisJLndyaXRlX3JhdyA9ICZhZDU3OTFfd3JpdGVfcmF3LAogCS5hdHRycyA9ICZhZDU3OTFfYXR0cmlidXRlX2dyb3VwLAogCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCiB9OwpAQCAtMjk2LDUwICsyODQsNTIgQEAKIHsKIAlzdHJ1Y3QgYWQ1NzkxX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OwotCXN0cnVjdCByZWd1bGF0b3IgKnJlZ192ZGQsICpyZWdfdnNzOwogCXN0cnVjdCBhZDU3OTFfc3RhdGUgKnN0OwogCWludCByZXQsIHBvc192b2x0YWdlX3V2ID0gMCwgbmVnX3ZvbHRhZ2VfdXYgPSAwOwogCi0JcmVnX3ZkZCA9IHJlZ3VsYXRvcl9nZXQoJnNwaS0+ZGV2LCAidmRkIik7Ci0JaWYgKCFJU19FUlIocmVnX3ZkZCkpIHsKLQkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShyZWdfdmRkKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyb3JfcHV0X3JlZ19wb3M7Ci0KLQkJcG9zX3ZvbHRhZ2VfdXYgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UocmVnX3ZkZCk7Ci0JfQotCi0JcmVnX3ZzcyA9IHJlZ3VsYXRvcl9nZXQoJnNwaS0+ZGV2LCAidnNzIik7Ci0JaWYgKCFJU19FUlIocmVnX3ZzcykpIHsKLQkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShyZWdfdnNzKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyb3JfcHV0X3JlZ19uZWc7Ci0KLQkJbmVnX3ZvbHRhZ2VfdXYgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UocmVnX3Zzcyk7Ci0JfQotCiAJaW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZShzaXplb2YoKnN0KSk7CiAJaWYgKGluZGlvX2RldiA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfZGlzYWJsZV9yZWdfbmVnOworCQlnb3RvIGVycm9yX3JldDsKIAl9CiAJc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXN0LT5yZWdfdmRkID0gcmVndWxhdG9yX2dldCgmc3BpLT5kZXYsICJ2ZGQiKTsKKwlpZiAoIUlTX0VSUihzdC0+cmVnX3ZkZCkpIHsKKwkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShzdC0+cmVnX3ZkZCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3B1dF9yZWdfcG9zOworCisJCXBvc192b2x0YWdlX3V2ID0gcmVndWxhdG9yX2dldF92b2x0YWdlKHN0LT5yZWdfdmRkKTsKKwl9CisKKwlzdC0+cmVnX3ZzcyA9IHJlZ3VsYXRvcl9nZXQoJnNwaS0+ZGV2LCAidnNzIik7CisJaWYgKCFJU19FUlIoc3QtPnJlZ192c3MpKSB7CisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoc3QtPnJlZ192c3MpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl9wdXRfcmVnX25lZzsKKworCQluZWdfdm9sdGFnZV91diA9IHJlZ3VsYXRvcl9nZXRfdm9sdGFnZShzdC0+cmVnX3Zzcyk7CisJfQorCiAJc3QtPnB3cl9kb3duID0gdHJ1ZTsKIAlzdC0+c3BpID0gc3BpOwogCi0JaWYgKCFJU19FUlIocmVnX3ZzcykgJiYgIUlTX0VSUihyZWdfdmRkKSkKLQkJc3QtPnZyZWZfbXYgPSAocG9zX3ZvbHRhZ2VfdXYgLSBuZWdfdm9sdGFnZV91dikgLyAxMDAwOwotCWVsc2UgaWYgKHBkYXRhKQotCQlzdC0+dnJlZl9tdiA9IHBkYXRhLT52cmVmX3Bvc19tdiAtIHBkYXRhLT52cmVmX25lZ19tdjsKLQllbHNlCisJaWYgKCFJU19FUlIoc3QtPnJlZ192c3MpICYmICFJU19FUlIoc3QtPnJlZ192ZGQpKSB7CisJCXN0LT52cmVmX212ID0gKHBvc192b2x0YWdlX3V2ICsgbmVnX3ZvbHRhZ2VfdXYpIC8gMTAwMDsKKwkJc3QtPnZyZWZfbmVnX212ID0gbmVnX3ZvbHRhZ2VfdXYgLyAxMDAwOworCX0gZWxzZSBpZiAocGRhdGEpIHsKKwkJc3QtPnZyZWZfbXYgPSBwZGF0YS0+dnJlZl9wb3NfbXYgKyBwZGF0YS0+dnJlZl9uZWdfbXY7CisJCXN0LT52cmVmX25lZ19tdiA9IHBkYXRhLT52cmVmX25lZ19tdjsKKwl9IGVsc2UgewogCQlkZXZfd2Fybigmc3BpLT5kZXYsICJyZWZlcmVuY2Ugdm9sdGFnZSB1bnNwZWNpZmllZFxuIik7CisJfQogCiAJcmV0ID0gYWQ1NzkxX3NwaV93cml0ZShzcGksIEFENTc5MV9BRERSX1NXX0NUUkwsIEFENTc5MV9TV0NUUkxfUkVTRVQpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisJCWdvdG8gZXJyb3JfZGlzYWJsZV9yZWdfbmVnOwogCi0Jc3QtPmNoaXBfaW5mbyA9Ci0JCSZhZDU3OTFfY2hpcF9pbmZvX3RibFtzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5kcml2ZXJfZGF0YV07CisJc3QtPmNoaXBfaW5mbyA9CSZhZDU3OTFfY2hpcF9pbmZvX3RibFtzcGlfZ2V0X2RldmljZV9pZChzcGkpCisJCQkJCSAgICAgIC0+ZHJpdmVyX2RhdGFdOwogCiAKIAlzdC0+Y3RybCA9IEFENTc2MV9DVFJMX0xJTkNPTVAoc3QtPmNoaXBfaW5mby0+Z2V0X2xpbl9jb21wKHN0LT52cmVmX212KSkKQEAgLTM0OSwzOSArMzM5LDM3IEBACiAJcmV0ID0gYWQ1NzkxX3NwaV93cml0ZShzcGksIEFENTc5MV9BRERSX0NUUkwsIHN0LT5jdHJsIHwKIAkJQUQ1NzkxX0NUUkxfT1BHTkQgfCBBRDU3OTFfQ1RSTF9EQUNUUkkpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfZnJlZV9kZXY7Ci0KLQlzdC0+cmVnX3ZkZCA9IHJlZ192ZGQ7Ci0Jc3QtPnJlZ192c3MgPSByZWdfdnNzOworCQlnb3RvIGVycm9yX2Rpc2FibGVfcmVnX25lZzsKIAogCXNwaV9zZXRfZHJ2ZGF0YShzcGksIGluZGlvX2Rldik7CiAJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OwogCWluZGlvX2Rldi0+aW5mbyA9ICZhZDU3OTFfaW5mbzsKIAlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7Ci0KKwlpbmRpb19kZXYtPmNoYW5uZWxzCisJCT0gJmFkNTc5MV9jaGFubmVsc1tzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5kcml2ZXJfZGF0YV07CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSAxOworCWluZGlvX2Rldi0+bmFtZSA9IHNwaV9nZXRfZGV2aWNlX2lkKHN0LT5zcGkpLT5uYW1lOwogCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKIAlpZiAocmV0KQotCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCQlnb3RvIGVycm9yX2Rpc2FibGVfcmVnX25lZzsKIAogCXJldHVybiAwOwogCi1lcnJvcl9mcmVlX2RldjoKLQlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKLQogZXJyb3JfZGlzYWJsZV9yZWdfbmVnOgotCWlmICghSVNfRVJSKHJlZ192c3MpKQotCQlyZWd1bGF0b3JfZGlzYWJsZShyZWdfdnNzKTsKKwlpZiAoIUlTX0VSUihzdC0+cmVnX3ZzcykpCisJCXJlZ3VsYXRvcl9kaXNhYmxlKHN0LT5yZWdfdnNzKTsKIGVycm9yX3B1dF9yZWdfbmVnOgotCWlmICghSVNfRVJSKHJlZ192c3MpKQotCQlyZWd1bGF0b3JfcHV0KHJlZ192c3MpOworCWlmICghSVNfRVJSKHN0LT5yZWdfdnNzKSkKKwkJcmVndWxhdG9yX3B1dChzdC0+cmVnX3Zzcyk7CiAKLQlpZiAoIUlTX0VSUihyZWdfdmRkKSkKLQkJcmVndWxhdG9yX2Rpc2FibGUocmVnX3ZkZCk7CisJaWYgKCFJU19FUlIoc3QtPnJlZ192ZGQpKQorCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnX3ZkZCk7CiBlcnJvcl9wdXRfcmVnX3BvczoKLQlpZiAoIUlTX0VSUihyZWdfdmRkKSkKLQkJcmVndWxhdG9yX3B1dChyZWdfdmRkKTsKLQorCWlmICghSVNfRVJSKHN0LT5yZWdfdmRkKSkKKwkJcmVndWxhdG9yX3B1dChzdC0+cmVnX3ZkZCk7CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiBlcnJvcl9yZXQ6CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zODksMjAgKzM3NywxOCBAQAogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKIAlzdHJ1Y3QgYWQ1NzkxX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0Jc3RydWN0IHJlZ3VsYXRvciAqcmVnX3ZkZCA9IHN0LT5yZWdfdmRkOwotCXN0cnVjdCByZWd1bGF0b3IgKnJlZ192c3MgPSBzdC0+cmVnX3ZzczsKIAogCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwotCiAJaWYgKCFJU19FUlIoc3QtPnJlZ192ZGQpKSB7Ci0JCXJlZ3VsYXRvcl9kaXNhYmxlKHJlZ192ZGQpOwotCQlyZWd1bGF0b3JfcHV0KHJlZ192ZGQpOworCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnX3ZkZCk7CisJCXJlZ3VsYXRvcl9wdXQoc3QtPnJlZ192ZGQpOwogCX0KIAogCWlmICghSVNfRVJSKHN0LT5yZWdfdnNzKSkgewotCQlyZWd1bGF0b3JfZGlzYWJsZShyZWdfdnNzKTsKLQkJcmVndWxhdG9yX3B1dChyZWdfdnNzKTsKKwkJcmVndWxhdG9yX2Rpc2FibGUoc3QtPnJlZ192c3MpOworCQlyZWd1bGF0b3JfcHV0KHN0LT5yZWdfdnNzKTsKIAl9CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2FkNTc5MS5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvYWQ1NzkxLmgKaW5kZXggYzgwN2YyNi4uZmQ3ZWRiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvYWQ1NzkxLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvYWQ1NzkxLmgKQEAgLTY4LDE0ICs2OCwxMCBAQAogCiAvKioKICAqIHN0cnVjdCBhZDU3OTFfY2hpcF9pbmZvIC0gY2hpcCBzcGVjaWZpYyBpbmZvcm1hdGlvbgotICogQGJpdHM6CQlhY2N1cmFjeSBvZiB0aGUgREFDIGluIGJpdHMKLSAqIEBsZWZ0X3NoaWZ0OgkJbnVtYmVyIG9mIGJpdHMgdGhlIGRhdHVtIG11c3QgYmUgc2hpZnRlZAogICogQGdldF9saW5fY29tcDoJZnVuY3Rpb24gcG9pbnRlciB0byB0aGUgZGV2aWNlIHNwZWNpZmljIGZ1bmN0aW9uCiAgKi8KIAogc3RydWN0IGFkNTc5MV9jaGlwX2luZm8gewotCXU4CQkJYml0czsKLQl1OAkJCWxlZnRfc2hpZnQ7CiAJaW50ICgqZ2V0X2xpbl9jb21wKQkodW5zaWduZWQgaW50IHNwYW4pOwogfTsKIApAQCAtODYsNiArODIsNyBAQAogICogQHJlZ192c3M6CQluZWdhdGl2ZSBzdXBwbHkgcmVndWxhdG9yCiAgKiBAY2hpcF9pbmZvOgkJY2hpcCBtb2RlbCBzcGVjaWZpYyBjb25zdGFudHMKICAqIEB2cmVmX212OgkJYWN0dWFsIHJlZmVyZW5jZSB2b2x0YWdlIHVzZWQKKyAqIEB2cmVmX25lZ19tdjoJdm9sdGFnZSBvZiB0aGUgbmVnYXRpdmUgc3VwcGx5CiAgKiBAcHdyX2Rvd25fbW9kZQljdXJyZW50IHBvd2VyIGRvd24gbW9kZQogICovCiAKQEAgLTk1LDYgKzkyLDcgQEAKIAlzdHJ1Y3QgcmVndWxhdG9yCQkqcmVnX3ZzczsKIAljb25zdCBzdHJ1Y3QgYWQ1NzkxX2NoaXBfaW5mbwkqY2hpcF9pbmZvOwogCXVuc2lnbmVkIHNob3J0CQkJdnJlZl9tdjsKKwl1bnNpZ25lZCBpbnQJCQl2cmVmX25lZ19tdjsKIAl1bnNpZ25lZAkJCWN0cmw7CiAJdW5zaWduZWQJCQlwd3JfZG93bl9tb2RlOwogCWJvb2wJCQkJcHdyX2Rvd247CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9kYWMuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2RhYy5oCmluZGV4IDFkODJmMzUuLjA3NTRkNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2RhYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGFjL2RhYy5oCkBAIC0zLDQgKzMsNCBAQAogICovCiAKICNkZWZpbmUgSUlPX0RFVl9BVFRSX09VVF9SQVcoX251bSwgX3N0b3JlLCBfYWRkcikJCQkJXAotCUlJT19ERVZJQ0VfQVRUUihvdXQjI19udW0jI19yYXcsIFNfSVdVU1IsIE5VTEwsIF9zdG9yZSwgX2FkZHIpCisJSUlPX0RFVklDRV9BVFRSKG91dF92b2x0YWdlIyNfbnVtIyNfcmF3LCBTX0lXVVNSLCBOVUxMLCBfc3RvcmUsIF9hZGRyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9kYWMvbWF4NTE3LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9tYXg1MTcuYwppbmRleCBlZDVkMzUxLi5hZGZiZDIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9tYXg1MTcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2RhYy9tYXg1MTcuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKICNpbmNsdWRlICJkYWMuaCIKIAogI2luY2x1ZGUgIm1heDUxNy5oIgpAQCAtNTgsOCArNTksOCBAQAogCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsIGludCBjaGFubmVsKQogewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBtYXg1MTdfZGF0YSAqZGF0YSA9IGlpb19wcml2KGRldl9pbmZvKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IG1heDUxN19kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OwogCXU4IG91dGJ1Zls0XTsgLyogMXggb3IgMnggY29tbWFuZCArIHZhbHVlICovCiAJaW50IG91dGJ1Zl9zaXplID0gMDsKQEAgLTExOSwxNSArMTIwLDE2IEBACiB7CiAJcmV0dXJuIG1heDUxN19zZXRfdmFsdWUoZGV2LCBhdHRyLCBidWYsIGNvdW50LCAzKTsKIH0KLXN0YXRpYyBJSU9fREVWSUNFX0FUVFJfTkFNRUQob3V0MWFuZDJfcmF3LCBvdXQxJjJfcmF3LCBTX0lXVVNSLCBOVUxMLAotCQltYXg1MTdfc2V0X3ZhbHVlX2JvdGgsIC0xKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFJfTkFNRUQob3V0X3ZvbHRhZ2UxYW5kMl9yYXcsCisJCQkgICAgIG91dF92b2x0YWdlMSYyX3JhdywgU19JV1VTUiwgTlVMTCwKKwkJCSAgICAgbWF4NTE3X3NldF92YWx1ZV9ib3RoLCAtMSk7CiAKIHN0YXRpYyBzc2l6ZV90IG1heDUxN19zaG93X3NjYWxlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQljaGFyICpidWYsIGludCBjaGFubmVsKQogewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBtYXg1MTdfZGF0YSAqZGF0YSA9IGlpb19wcml2KGRldl9pbmZvKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IG1heDUxN19kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAkvKiBDb3JyZXNwb25kcyB0byBWcmVmIC8gMl4oYml0cykgKi8KIAl1bnNpZ25lZCBpbnQgc2NhbGVfdXYgPSAoZGF0YS0+dnJlZl9tdltjaGFubmVsIC0gMV0gKiAxMDAwKSA+PiA4OwogCkBAIC0xNDAsNyArMTQyLDggQEAKIHsKIAlyZXR1cm4gbWF4NTE3X3Nob3dfc2NhbGUoZGV2LCBhdHRyLCBidWYsIDEpOwogfQotc3RhdGljIElJT19ERVZJQ0VfQVRUUihvdXQxX3NjYWxlLCBTX0lSVUdPLCBtYXg1MTdfc2hvd19zY2FsZTEsIE5VTEwsIDApOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihvdXRfdm9sdGFnZTFfc2NhbGUsIFNfSVJVR08sCisJCSAgICAgICBtYXg1MTdfc2hvd19zY2FsZTEsIE5VTEwsIDApOwogCiBzdGF0aWMgc3NpemVfdCBtYXg1MTdfc2hvd19zY2FsZTIoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLApAQCAtMTQ4LDEyICsxNTEsMTMgQEAKIHsKIAlyZXR1cm4gbWF4NTE3X3Nob3dfc2NhbGUoZGV2LCBhdHRyLCBidWYsIDIpOwogfQotc3RhdGljIElJT19ERVZJQ0VfQVRUUihvdXQyX3NjYWxlLCBTX0lSVUdPLCBtYXg1MTdfc2hvd19zY2FsZTIsIE5VTEwsIDApOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihvdXRfdm9sdGFnZTJfc2NhbGUsIFNfSVJVR08sCisJCSAgICAgICBtYXg1MTdfc2hvd19zY2FsZTIsIE5VTEwsIDApOwogCiAvKiBPbiBNQVg1MTcgdmFyaWFudCwgd2UgaGF2ZSBvbmUgb3V0cHV0ICovCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbWF4NTE3X2F0dHJpYnV0ZXNbXSA9IHsKLQkmaWlvX2Rldl9hdHRyX291dDFfcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9vdXQxX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXRfdm9sdGFnZTFfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXRfdm9sdGFnZTFfc2NhbGUuZGV2X2F0dHIuYXR0ciwKIAlOVUxMCiB9OwogCkBAIC0xNjMsMTEgKzE2NywxMSBAQAogCiAvKiBPbiBNQVg1MTggYW5kIE1BWDUxOSB2YXJpYW50LCB3ZSBoYXZlIHR3byBvdXRwdXRzICovCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbWF4NTE4X2F0dHJpYnV0ZXNbXSA9IHsKLQkmaWlvX2Rldl9hdHRyX291dDFfcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9vdXQxX3NjYWxlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9vdXQyX3Jhdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfb3V0Ml9zY2FsZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfb3V0MWFuZDJfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXRfdm9sdGFnZTFfcmF3LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXRfdm9sdGFnZTFfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dF92b2x0YWdlMl9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dF92b2x0YWdlMl9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2UxYW5kMl9yYXcuZGV2X2F0dHIuYXR0ciwKIAlOVUxMCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvS2NvbmZpZwppbmRleCBlMDc0MzFkLi45M2I3MTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL0tjb25maWcKQEAgLTEsNyArMSw3IEBACiAjCiAjIERpcmVjdCBEaWdpdGFsIFN5bnRoZXNpcyBkcml2ZXJzCiAjCi1jb21tZW50ICJEaXJlY3QgRGlnaXRhbCBTeW50aGVzaXMiCittZW51ICJEaXJlY3QgRGlnaXRhbCBTeW50aGVzaXMiCiAKIGNvbmZpZyBBRDU5MzAKIAl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgYWQ1OTMwLzU5MzIgZHJpdmVyIgpAQCAtNTcsMyArNTcsNSBAQAogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBERFMgY2hpcAogCSAgYWQ5OTUxLCBwcm92aWRlcyBkaXJlY3QgYWNjZXNzIHZpYSBzeXNmcy4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ1OTMwLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDU5MzAuYwppbmRleCAwYjJhYTRjLi5mNWUzNjhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDU5MzAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDU5MzAuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCkBAIC0xMjksNiArMTMwLDcgQEAKIHN0YXRpYyBpbnQgX19kZXZleGl0IGFkNTkzMF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3BpX2dldF9kcnZkYXRhKHNwaSkpOworCWlpb19mcmVlX2RldmljZShzcGlfZ2V0X2RydmRhdGEoc3BpKSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTgzMi5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5ODMyLmMKaW5kZXggNmYwZWZlNi4uOWI0ZmY2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5ODMyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5ODMyLmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKQEAgLTc2LDggKzc3LDggQEAKIAkJY29uc3QgY2hhciAqYnVmLAogCQlzaXplX3QgbGVuKQogewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDk4MzJfc3RhdGUgKnN0ID0gaWlvX3ByaXYoZGV2X2luZm8pOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ5ODMyX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOwogCWludCByZXQ7CiAJbG9uZyB2YWw7CkBAIC04Niw3ICs4Nyw3IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9yZXQ7CiAKLQltdXRleF9sb2NrKCZkZXZfaW5mby0+bWxvY2spOworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOwogCXN3aXRjaCAodGhpc19hdHRyLT5hZGRyZXNzKSB7CiAJY2FzZSBBRDk4MzJfRlJFUTBITToKIAljYXNlIEFEOTgzMl9GUkVRMUhNOgpAQCAtMTQ3LDcgKzE0OCw3IEBACiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVOT0RFVjsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZkZXZfaW5mby0+bWxvY2spOworCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CiAKIGVycm9yX3JldDoKIAlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOwpAQCAtMzI3LDEzICszMjgsMTQgQEAKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CiAJc3RydWN0IGFkOTgzMl9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCXN0cnVjdCByZWd1bGF0b3IgKnJlZyA9IHN0LT5yZWc7CiAKIAlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKLQlpZiAoIUlTX0VSUihyZWcpKSB7Ci0JCXJlZ3VsYXRvcl9kaXNhYmxlKHJlZyk7Ci0JCXJlZ3VsYXRvcl9wdXQocmVnKTsKKwlpZiAoIUlTX0VSUihzdC0+cmVnKSkgeworCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnKTsKKwkJcmVndWxhdG9yX3B1dChzdC0+cmVnKTsKIAl9CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5ODM0LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4MzQuYwppbmRleCBlNjQ1NGQ1Li5jNDY4ZjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4MzQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4MzQuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgpAQCAtNjUsOCArNjYsOCBAQAogCQljb25zdCBjaGFyICpidWYsCiAJCXNpemVfdCBsZW4pCiB7Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkOTgzNF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihkZXZfaW5mbyk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDk4MzRfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CiAJaW50IHJldDsKIAlsb25nIHZhbDsKQEAgLTc1LDcgKzc2LDcgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX3JldDsKIAotCW11dGV4X2xvY2soJmRldl9pbmZvLT5tbG9jayk7CisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CiAJc3dpdGNoICh0aGlzX2F0dHItPmFkZHJlc3MpIHsKIAljYXNlIEFEOTgzNF9SRUdfRlJFUTA6CiAJY2FzZSBBRDk4MzRfUkVHX0ZSRVExOgpAQCAtMTMzLDcgKzEzNCw3IEBACiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVOT0RFVjsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZkZXZfaW5mby0+bWxvY2spOworCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CiAKIGVycm9yX3JldDoKIAlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOwpAQCAtMTQ0LDEzICsxNDUsMTMgQEAKIAkJCQkgY29uc3QgY2hhciAqYnVmLAogCQkJCSBzaXplX3QgbGVuKQogewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZDk4MzRfc3RhdGUgKnN0ID0gaWlvX3ByaXYoZGV2X2luZm8pOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYWQ5ODM0X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOwogCWludCByZXQgPSAwOwogCWJvb2wgaXNfYWQ5ODMzXzcgPSAoc3QtPmRldmlkID09IElEX0FEOTgzMykgfHwgKHN0LT5kZXZpZCA9PSBJRF9BRDk4MzcpOwogCi0JbXV0ZXhfbG9jaygmZGV2X2luZm8tPm1sb2NrKTsKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKIAogCXN3aXRjaCAodGhpc19hdHRyLT5hZGRyZXNzKSB7CiAJY2FzZSAwOgpAQCAtMTkzLDcgKzE5NCw3IEBACiAJCXN0LT5kYXRhID0gY3B1X3RvX2JlMTYoQUQ5ODM0X1JFR19DTUQgfCBzdC0+Y29udHJvbCk7CiAJCXJldCA9IHNwaV9zeW5jKHN0LT5zcGksICZzdC0+bXNnKTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZkZXZfaW5mby0+bWxvY2spOworCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CiAKIAlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOwogfQpAQCAtMjAyLDggKzIwMyw4IEBACiAJCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkJCWNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ5ODM0X3N0YXRlICpzdCA9IGlpb19wcml2KGRldl9pbmZvKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkOTgzNF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCWNoYXIgKnN0cjsKIAogCWlmICgoc3QtPmRldmlkID09IElEX0FEOTgzMykgfHwgKHN0LT5kZXZpZCA9PSBJRF9BRDk4MzcpKQpAQCAtMjI0LDggKzIyNSw4IEBACiAJCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkJCWNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWQ5ODM0X3N0YXRlICpzdCA9IGlpb19wcml2KGRldl9pbmZvKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkOTgzNF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCWNoYXIgKnN0cjsKIAogCWlmIChzdC0+Y29udHJvbCAmIEFEOTgzNF9NT0RFKQpAQCAtMjg0LDggKzI4NSw4IEBACiAJCQkJICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBpbnQgbikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkOTgzNF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihkZXZfaW5mbyk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDk4MzRfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAogCW1vZGVfdCBtb2RlID0gYXR0ci0+bW9kZTsKIApAQCAtNDE2LDEzICs0MTcsMTMgQEAKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CiAJc3RydWN0IGFkOTgzNF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCXN0cnVjdCByZWd1bGF0b3IgKnJlZyA9IHN0LT5yZWc7CiAKIAlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKLQlpZiAoIUlTX0VSUihyZWcpKSB7Ci0JCXJlZ3VsYXRvcl9kaXNhYmxlKHJlZyk7Ci0JCXJlZ3VsYXRvcl9wdXQocmVnKTsKKwlpZiAoIUlTX0VSUihzdC0+cmVnKSkgeworCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnKTsKKwkJcmVndWxhdG9yX3B1dChzdC0+cmVnKTsKIAl9CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTg1MC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5ODUwLmMKaW5kZXggZDdjOWQwNS4uYTE0NzcxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5ODUwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9kZHMvYWQ5ODUwLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi9zeXNmcy5oIgpAQCAtMTE1LDYgKzExNiw3IEBACiBzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDk4NTBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKHNwaV9nZXRfZHJ2ZGF0YShzcGkpKTsKKwlpaW9fZnJlZV9kZXZpY2Uoc3BpX2dldF9kcnZkYXRhKHNwaSkpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk4NTIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTg1Mi5jCmluZGV4IDAxODQ1ODUuLmNmY2VhYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTg1Mi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTg1Mi5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vc3lzZnMuaCIKQEAgLTIxNyw3ICsyMTgsNiBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWQ5ODUyX2F0dHJpYnV0ZV9ncm91cCA9IHsKLQkubmFtZSA9IERSVl9OQU1FLAogCS5hdHRycyA9IGFkOTg1Ml9hdHRyaWJ1dGVzLAogfTsKIApAQCAtMjY3LDYgKzI2Nyw3IEBACiBzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDk4NTJfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKHNwaV9nZXRfZHJ2ZGF0YShzcGkpKTsKKwlpaW9fZnJlZV9kZXZpY2Uoc3BpX2dldF9kcnZkYXRhKHNwaSkpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk5MTAuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTkxMC5jCmluZGV4IDBmYTIxN2YuLmRhODNkMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTkxMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTkxMC5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vc3lzZnMuaCIKQEAgLTM1Miw3ICszNTMsNiBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWQ5OTEwX2F0dHJpYnV0ZV9ncm91cCA9IHsKLQkubmFtZSA9IERSVl9OQU1FLAogCS5hdHRycyA9IGFkOTkxMF9hdHRyaWJ1dGVzLAogfTsKIApAQCAtNDAwLDYgKzQwMCw3IEBACiBzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDk5MTBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKHNwaV9nZXRfZHJ2ZGF0YShzcGkpKTsKKwlpaW9fZnJlZV9kZXZpY2Uoc3BpX2dldF9kcnZkYXRhKHNwaSkpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2Rkcy9hZDk5NTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTk1MS5jCmluZGV4IGQzNjFkMWYuLjIwYzE4MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTk1MS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZGRzL2FkOTk1MS5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vc3lzZnMuaCIKQEAgLTE2MSw3ICsxNjIsNiBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWQ5OTUxX2F0dHJpYnV0ZV9ncm91cCA9IHsKLQkubmFtZSA9IERSVl9OQU1FLAogCS5hdHRycyA9IGFkOTk1MV9hdHRyaWJ1dGVzLAogfTsKIApAQCAtMjExLDYgKzIxMSw3IEBACiBzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDk5NTFfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKHNwaV9nZXRfZHJ2ZGF0YShzcGkpKTsKKwlpaW9fZnJlZV9kZXZpY2Uoc3BpX2dldF9kcnZkYXRhKHNwaSkpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9LY29uZmlnCmluZGV4IGFlMmU3ZDMuLjIyYWVhNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9LY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBJSU8gRGlnaXRhbCBHeXJvc2NvcGUgU2Vuc29yIGRyaXZlcnMgY29uZmlndXJhdGlvbgogIwotY29tbWVudCAiRGlnaXRhbCBneXJvc2NvcGUgc2Vuc29ycyIKK21lbnUgIkRpZ2l0YWwgZ3lyb3Njb3BlIHNlbnNvcnMiCiAKIGNvbmZpZyBBRElTMTYwNjAKIAl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURJUzE2MDYwIFlhdyBSYXRlIEd5cm9zY29wZSB3aXRoIFNQSSBkcml2ZXIiCkBAIC0yNyw4ICsyNyw4IEBACiBjb25maWcgQURJUzE2MjYwCiAJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFESVMxNjI2MCBEaWdpdGFsIEd5cm9zY29wZSBTZW5zb3IgU1BJIGRyaXZlciIKIAlkZXBlbmRzIG9uIFNQSQotCXNlbGVjdCBJSU9fVFJJR0dFUiBpZiBJSU9fUklOR19CVUZGRVIKLQlzZWxlY3QgSUlPX1NXX1JJTkcgaWYgSUlPX1JJTkdfQlVGRkVSCisJc2VsZWN0IElJT19UUklHR0VSIGlmIElJT19CVUZGRVIKKwlzZWxlY3QgSUlPX1NXX1JJTkcgaWYgSUlPX0JVRkZFUgogCWhlbHAKIAkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBBRElTMTYyNjAgQURJUzE2MjY1CiAJICBBRElTMTYyNTAgQURJUzE2MjU1IGFuZCBBRElTMTYyNTEgcHJvZ3JhbW1hYmxlIGRpZ2l0YWwgZ3lyb3Njb3BlIHNlbnNvcnMuCkBAIC00NSwzICs0NSw1IEBACiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGFkeHJzNDUwLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vTWFrZWZpbGUKaW5kZXggMjIxMjI0MC4uOWJhNWVjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9NYWtlZmlsZQpAQCAtMTIsNyArMTIsNyBAQAogb2JqLSQoQ09ORklHX0FESVMxNjEzMCkgKz0gYWRpczE2MTMwLm8KIAogYWRpczE2MjYwLXkgICAgICAgICAgICAgOj0gYWRpczE2MjYwX2NvcmUubwotYWRpczE2MjYwLSQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgKz0gYWRpczE2MjYwX3JpbmcubyBhZGlzMTYyNjBfdHJpZ2dlci5vCithZGlzMTYyNjAtJChDT05GSUdfSUlPX0JVRkZFUikgKz0gYWRpczE2MjYwX3JpbmcubyBhZGlzMTYyNjBfdHJpZ2dlci5vCiBvYmotJChDT05GSUdfQURJUzE2MjYwKSArPSBhZGlzMTYyNjAubwogCiBhZGlzMTYyNTEteSAgICAgICAgICAgICA6PSBhZGlzMTYyNTFfY29yZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MDYwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwNjBfY29yZS5jCmluZGV4IGFmYTUyZDEuLjM4Y2YzZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwNjBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwNjBfY29yZS5jCkBAIC0xMywxMiArMTMsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCi0jaW5jbHVkZSAiZ3lyby5oIgotI2luY2x1ZGUgIi4uL2FkYy9hZGMuaCIKIAogI2RlZmluZSBBRElTMTYwNjBfR1lSTwkJMHgyMCAvKiBNZWFzdXJlIEFuZ3VsYXIgUmF0ZSAoR3lybykgKi8KICNkZWZpbmUgQURJUzE2MDYwX1RFTVBfT1VUCTB4MTAgLyogTWVhc3VyZSBUZW1wZXJhdHVyZSAqLwpAQCAtNDIsMTEgKzQwLDkgQEAKIAogc3RhdGljIHN0cnVjdCBpaW9fZGV2ICphZGlzMTYwNjBfaWlvX2RldjsKIAotc3RhdGljIGludCBhZGlzMTYwNjBfc3BpX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJdTggdmFsKQorc3RhdGljIGludCBhZGlzMTYwNjBfc3BpX3dyaXRlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHU4IHZhbCkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgYWRpczE2MDYwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKIAltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOwpAQCAtNTcsMTEgKzUzLDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGFkaXMxNjA2MF9zcGlfcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXUxNiAqdmFsKQorc3RhdGljIGludCBhZGlzMTYwNjBfc3BpX3JlYWQoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgdTE2ICp2YWwpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGFkaXMxNjA2MF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCiAJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKQEAgLTgyLDYzICs3Niw3NCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGFkaXMxNjA2MF9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgYWRpczE2MDYwX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCSAgICAgIGludCAqdmFsLCBpbnQgKnZhbDIsCisJCQkgICAgICBsb25nIG1hc2spCiB7Ci0Jc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOwotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQl1MTYgdmFsID0gMDsKLQlzc2l6ZV90IHJldDsKKwl1MTYgdHZhbCA9IDA7CisJaW50IHJldDsKIAotCS8qIFRha2UgdGhlIGlpb19kZXYgc3RhdHVzIGxvY2sgKi8KLQltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIDA6CisJCS8qIFRha2UgdGhlIGlpb19kZXYgc3RhdHVzIGxvY2sgKi8KKwkJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJCXJldCA9IGFkaXMxNjA2MF9zcGlfd3JpdGUoaW5kaW9fZGV2LCBjaGFuLT5hZGRyZXNzKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldCA9IGFkaXMxNjA2MF9zcGlfcmVhZChpbmRpb19kZXYsICZ0dmFsKTsKKwkJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwkJKnZhbCA9IHR2YWw7CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwljYXNlICgxIDw8IElJT19DSEFOX0lORk9fT0ZGU0VUX1NFUEFSQVRFKToKKwkJKnZhbCA9IC03OworCQkqdmFsMiA9IDQ2MTExNzsKKwkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKToKKwkJKnZhbCA9IDA7CisJCSp2YWwyID0gMzQwMDA7CisJCXJldHVybiBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCX0KIAotCXJldCA9IGFkaXMxNjA2MF9zcGlfd3JpdGUoZGV2LCB0aGlzX2F0dHItPmFkZHJlc3MpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yX3JldDsKLQlyZXQgPSBhZGlzMTYwNjBfc3BpX3JlYWQoZGV2LCAmdmFsKTsKLWVycm9yX3JldDoKLQltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOwotCi0JaWYgKHJldCA9PSAwKQotCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKLQllbHNlCi0JCXJldHVybiByZXQ7CisJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBJSU9fREVWX0FUVFJfR1lST19aKGFkaXMxNjA2MF9yZWFkLCBBRElTMTYwNjBfR1lSTyk7Ci1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKHRlbXBfcmF3LCBTX0lSVUdPLCBhZGlzMTYwNjBfcmVhZCwgTlVMTCwKLQkJICAgICAgIEFESVMxNjA2MF9URU1QX09VVCk7Ci1zdGF0aWMgSUlPX0NPTlNUX0FUVFJfVEVNUF9TQ0FMRSgiMzQiKTsgLyogTWlsbGkgZGVncmVlcyBDICovCi1zdGF0aWMgSUlPX0NPTlNUX0FUVFJfVEVNUF9PRkZTRVQoIi03NDYxLjExNyIpOyAvKiBNaWxsaSBkZWdyZWVzIEMgKi8KLXN0YXRpYyBJSU9fREVWX0FUVFJfSU5fUkFXKDAsIGFkaXMxNjA2MF9yZWFkLCBBRElTMTYwNjBfQUlOMSk7Ci1zdGF0aWMgSUlPX0RFVl9BVFRSX0lOX1JBVygxLCBhZGlzMTYwNjBfcmVhZCwgQURJUzE2MDYwX0FJTjIpOwotc3RhdGljIElJT19DT05TVF9BVFRSKG5hbWUsICJhZGlzMTYwNjAiKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjA2MF9hdHRyaWJ1dGVzW10gPSB7Ci0JJmlpb19kZXZfYXR0cl9neXJvX3pfcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fY29uc3RfYXR0cl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19jb25zdF9hdHRyX3RlbXBfb2Zmc2V0LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9pbjBfcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9pbjFfcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19jb25zdF9hdHRyX25hbWUuZGV2X2F0dHIuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYwNjBfYXR0cmlidXRlX2dyb3VwID0gewotCS5hdHRycyA9IGFkaXMxNjA2MF9hdHRyaWJ1dGVzLAotfTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBhZGlzMTYwNjBfaW5mbyA9IHsKLQkuYXR0cnMgPSAmYWRpczE2MDYwX2F0dHJpYnV0ZV9ncm91cCwKKwkucmVhZF9yYXcgPSAmYWRpczE2MDYwX3JlYWRfcmF3LAogCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgYWRpczE2MDYwX2NoYW5uZWxzW10gPSB7CisJeworCQkudHlwZSA9IElJT19BTkdMX1ZFTCwKKwkJLm1vZGlmaWVkID0gMSwKKwkJLmNoYW5uZWwyID0gSUlPX01PRF9aLAorCQkuYWRkcmVzcyA9IEFESVMxNjA2MF9HWVJPLAorCX0sIHsKKwkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJLmluZGV4ZWQgPSAxLAorCQkuY2hhbm5lbCA9IDAsCisJCS5hZGRyZXNzID0gQURJUzE2MDYwX0FJTjEsCisJfSwgeworCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkuaW5kZXhlZCA9IDEsCisJCS5jaGFubmVsID0gMSwKKwkJLmFkZHJlc3MgPSBBRElTMTYwNjBfQUlOMiwKKwl9LCB7CisJCS50eXBlID0gSUlPX1RFTVAsCisJCS5pbmRleGVkID0gMSwKKwkJLmNoYW5uZWwgPSAwLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19PRkZTRVRfU0VQQVJBVEUpIHwKKwkJKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TRVBBUkFURSksCisJCS5hZGRyZXNzID0gQURJUzE2MDYwX1RFTVBfT1VULAorCX0KK307CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGFkaXMxNjA2MF9yX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7Ci0JaW50IHJldCwgcmVnZG9uZSA9IDA7CisJaW50IHJldDsKIAlzdHJ1Y3QgYWRpczE2MDYwX3N0YXRlICpzdDsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OwogCkBAIC0xNTQsMjMgKzE1OSwyMiBAQAogCXN0LT51c19yID0gc3BpOwogCW11dGV4X2luaXQoJnN0LT5idWZfbG9jayk7CiAKKwlpbmRpb19kZXYtPm5hbWUgPSBzcGktPmRldi5kcml2ZXItPm5hbWU7CiAJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OwogCWluZGlvX2Rldi0+aW5mbyA9ICZhZGlzMTYwNjBfaW5mbzsKIAlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGFkaXMxNjA2MF9jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoYWRpczE2MDYwX2NoYW5uZWxzKTsKIAogCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX2ZyZWVfZGV2OwotCXJlZ2RvbmUgPSAxOwogCiAJYWRpczE2MDYwX2lpb19kZXYgPSBpbmRpb19kZXY7CiAJcmV0dXJuIDA7CiAKIGVycm9yX2ZyZWVfZGV2OgotCWlmIChyZWdkb25lKQotCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKLQllbHNlCi0JCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogZXJyb3JfcmV0OgogCXJldHVybiByZXQ7CiB9CkBAIC0xNzksNiArMTgzLDcgQEAKIHN0YXRpYyBpbnQgYWRpczE2MDYwX3JfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKHNwaV9nZXRfZHJ2ZGF0YShzcGkpKTsKKwlpaW9fZnJlZV9kZXZpY2Uoc3BpX2dldF9kcnZkYXRhKHNwaSkpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MDgwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwODBfY29yZS5jCmluZGV4IGFkMmRiNGQuLjVkN2E5MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwODBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYwODBfY29yZS5jCkBAIC01LDcgKzUsNiBAQAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMiBvciBsYXRlci4KICAqLwotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC0xMywxMSArMTIsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi9zeXNmcy5oIgotI2luY2x1ZGUgImd5cm8uaCIKLSNpbmNsdWRlICIuLi9hZGMvYWRjLmgiCiAKICNkZWZpbmUgQURJUzE2MDgwX0RJTl9HWVJPICAgKDAgPDwgMTApIC8qIEd5cm9zY29wZSBvdXRwdXQgKi8KICNkZWZpbmUgQURJUzE2MDgwX0RJTl9URU1QICAgKDEgPDwgMTApIC8qIFRlbXBlcmF0dXJlIG91dHB1dCAqLwpAQCAtNDQsMTEgKzQyLDEwIEBACiAJdTggYnVmWzJdIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIH07CiAKLXN0YXRpYyBpbnQgYWRpczE2MDgwX3NwaV93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IGFkaXMxNjA4MF9zcGlfd3JpdGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKIAkJdTE2IHZhbCkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgYWRpczE2MDgwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKIAltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOwpAQCAtNjEsMTEgKzU4LDEwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBhZGlzMTYwODBfc3BpX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LAotCQl1MTYgKnZhbCkKK3N0YXRpYyBpbnQgYWRpczE2MDgwX3NwaV9yZWFkKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgICB1MTYgKnZhbCkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgYWRpczE2MDgwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKIAltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOwpAQCAtNzksNTYgKzc1LDY4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHNzaXplX3QgYWRpczE2MDgwX3JlYWQoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQorc3RhdGljIGludCBhZGlzMTYwODBfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCSAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICAgIGludCAqdmFsLAorCQkJICAgICBpbnQgKnZhbDIsCisJCQkgICAgIGxvbmcgbWFzaykKIHsKLQlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXUxNiB2YWwgPSAwOwotCXNzaXplX3QgcmV0OwotCisJaW50IHJldCA9IC1FSU5WQUw7CisJdTE2IHV0OwogCS8qIFRha2UgdGhlIGlpb19kZXYgc3RhdHVzIGxvY2sgKi8KKwogCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOwotCXJldCA9IGFkaXMxNjA4MF9zcGlfd3JpdGUoZGV2LAotCQkJCSAgdGhpc19hdHRyLT5hZGRyZXNzIHwgQURJUzE2MDgwX0RJTl9XUklURSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3JfcmV0OwotCXJldCA9ICBhZGlzMTYwODBfc3BpX3JlYWQoZGV2LCAmdmFsKTsKLWVycm9yX3JldDoKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIDA6CisJCXJldCA9IGFkaXMxNjA4MF9zcGlfd3JpdGUoaW5kaW9fZGV2LAorCQkJCQkgIGNoYW4tPmFkZHJlc3MgfAorCQkJCQkgIEFESVMxNjA4MF9ESU5fV1JJVEUpOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCQlyZXQgPSBhZGlzMTYwODBfc3BpX3JlYWQoaW5kaW9fZGV2LCAmdXQpOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCQkqdmFsID0gdXQ7CisJCXJldCA9IElJT19WQUxfSU5UOworCQlicmVhazsKKwl9CiAJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKIAotCWlmIChyZXQgPT0gMCkKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7Ci0JZWxzZQotCQlyZXR1cm4gcmV0OworCXJldHVybiByZXQ7CiB9Ci1zdGF0aWMgSUlPX0RFVl9BVFRSX0dZUk9fWihhZGlzMTYwODBfcmVhZCwgQURJUzE2MDgwX0RJTl9HWVJPKTsKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIodGVtcF9yYXcsIFNfSVJVR08sIGFkaXMxNjA4MF9yZWFkLCBOVUxMLAotCQkgICAgICAgQURJUzE2MDgwX0RJTl9URU1QKTsKLXN0YXRpYyBJSU9fREVWX0FUVFJfSU5fUkFXKDAsIGFkaXMxNjA4MF9yZWFkLCBBRElTMTYwODBfRElOX0FJTjEpOwotc3RhdGljIElJT19ERVZfQVRUUl9JTl9SQVcoMSwgYWRpczE2MDgwX3JlYWQsIEFESVMxNjA4MF9ESU5fQUlOMik7CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZGlzMTYwODBfYXR0cmlidXRlc1tdID0gewotCSZpaW9fZGV2X2F0dHJfZ3lyb196X3Jhdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfdGVtcF9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2luMF9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2luMV9yYXcuZGV2X2F0dHIuYXR0ciwKLQlOVUxMCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZGlzMTYwODBfYXR0cmlidXRlX2dyb3VwID0gewotCS5hdHRycyA9IGFkaXMxNjA4MF9hdHRyaWJ1dGVzLAorc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIGFkaXMxNjA4MF9jaGFubmVsc1tdID0geworCXsKKwkJLnR5cGUgPSBJSU9fQU5HTF9WRUwsCisJCS5tb2RpZmllZCA9IDEsCisJCS5jaGFubmVsMiA9IElJT19NT0RfWiwKKwkJLmFkZHJlc3MgPSBBRElTMTYwODBfRElOX0dZUk8sCisJfSwgeworCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkuaW5kZXhlZCA9IDEsCisJCS5jaGFubmVsID0gMCwKKwkJLmFkZHJlc3MgPSBBRElTMTYwODBfRElOX0FJTjEsCisJfSwgeworCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkuaW5kZXhlZCA9IDEsCisJCS5jaGFubmVsID0gMSwKKwkJLmFkZHJlc3MgPSBBRElTMTYwODBfRElOX0FJTjIsCisJfSwgeworCQkudHlwZSA9IElJT19URU1QLAorCQkuaW5kZXhlZCA9IDEsCisJCS5jaGFubmVsID0gMCwKKwkJLmFkZHJlc3MgPSBBRElTMTYwODBfRElOX1RFTVAsCisJfQogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBhZGlzMTYwODBfaW5mbyA9IHsKLQkuYXR0cnMgPSAmYWRpczE2MDgwX2F0dHJpYnV0ZV9ncm91cCwKKwkucmVhZF9yYXcgPSAmYWRpczE2MDgwX3JlYWRfcmF3LAogCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhZGlzMTYwODBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlpbnQgcmV0LCByZWdkb25lID0gMDsKKwlpbnQgcmV0OwogCXN0cnVjdCBhZGlzMTYwODBfc3RhdGUgKnN0OwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CiAKQEAgLTE0Nyw2ICsxNTUsOCBAQAogCW11dGV4X2luaXQoJnN0LT5idWZfbG9jayk7CiAKIAlpbmRpb19kZXYtPm5hbWUgPSBzcGktPmRldi5kcml2ZXItPm5hbWU7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGFkaXMxNjA4MF9jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoYWRpczE2MDgwX2NoYW5uZWxzKTsKIAlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CiAJaW5kaW9fZGV2LT5pbmZvID0gJmFkaXMxNjA4MF9pbmZvOwogCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKQEAgLTE1NCwxNSArMTY0LDEwIEBACiAJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfZnJlZV9kZXY7Ci0JcmVnZG9uZSA9IDE7Ci0KIAlyZXR1cm4gMDsKIAogZXJyb3JfZnJlZV9kZXY6Ci0JaWYgKHJlZ2RvbmUpCi0JCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwotCWVsc2UKLQkJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiBlcnJvcl9yZXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE3MSw2ICsxNzYsNyBAQAogc3RhdGljIGludCBhZGlzMTYwODBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKHNwaV9nZXRfZHJ2ZGF0YShzcGkpKTsKKwlpaW9fZnJlZV9kZXZpY2Uoc3BpX2dldF9kcnZkYXRhKHNwaSkpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MTMwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYxMzBfY29yZS5jCmluZGV4IGM4MGU5MDguLjc0OTI0MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYxMzBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYxMzBfY29yZS5jCkBAIC0xNCwxMSArMTQsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi9zeXNmcy5oIgotI2luY2x1ZGUgImd5cm8uaCIKLSNpbmNsdWRlICIuLi9hZGMvYWRjLmgiCiAKICNkZWZpbmUgQURJUzE2MTMwX0NPTiAgICAgICAgIDB4MAogI2RlZmluZSBBRElTMTYxMzBfQ09OX1JEICAgICAgKDEgPDwgNikKQEAgLTQxLDE0MCArNDAsNzcgQEAKIC8qKgogICogc3RydWN0IGFkaXMxNjEzMF9zdGF0ZSAtIGRldmljZSBpbnN0YW5jZSBzcGVjaWZpYyBkYXRhCiAgKiBAdXM6CQkJYWN0dWFsIHNwaV9kZXZpY2UgdG8gd3JpdGUgZGF0YQotICogQG1vZGU6CQkyNCBiaXRzICgxKSBvciAxNiBiaXRzICgwKQogICogQGJ1Zl9sb2NrOgkJbXV0ZXggdG8gcHJvdGVjdCB0eCBhbmQgcngKICAqIEBidWY6CQl1bmlmaWVkIHR4L3J4IGJ1ZmZlcgogICoqLwogc3RydWN0IGFkaXMxNjEzMF9zdGF0ZSB7CiAJc3RydWN0IHNwaV9kZXZpY2UJCSp1czsKLQl1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU7CiAJc3RydWN0IG11dGV4CQkJYnVmX2xvY2s7CiAJdTgJCQkJYnVmWzRdIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIH07CiAKLXN0YXRpYyBpbnQgYWRpczE2MTMwX3NwaV93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHU4IHJlZ19hZGRyLAotCQl1OCB2YWwpCitzdGF0aWMgaW50IGFkaXMxNjEzMF9zcGlfcmVhZChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCB1OCByZWdfYWRkciwgdTMyICp2YWwpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGFkaXMxNjEzMF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCi0JbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKLQlzdC0+YnVmWzBdID0gcmVnX2FkZHI7Ci0Jc3QtPmJ1ZlsxXSA9IHZhbDsKLQotCXJldCA9IHNwaV93cml0ZShzdC0+dXMsIHN0LT5idWYsIDIpOwotCW11dGV4X3VubG9jaygmc3QtPmJ1Zl9sb2NrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYWRpczE2MTMwX3NwaV9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwgdTggcmVnX2FkZHIsCi0JCXUzMiAqdmFsKQotewotCWludCByZXQ7Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhZGlzMTYxMzBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlciA9IHsKKwkJLnR4X2J1ZiA9IHN0LT5idWYsCisJCS5yeF9idWYgPSBzdC0+YnVmLAorCQkubGVuID0gNCwKKwl9OwogCiAJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKIAogCXN0LT5idWZbMF0gPSBBRElTMTYxMzBfQ09OX1JEIHwgcmVnX2FkZHI7Ci0JaWYgKHN0LT5tb2RlKQotCQlyZXQgPSBzcGlfcmVhZChzdC0+dXMsIHN0LT5idWYsIDQpOwotCWVsc2UKLQkJcmV0ID0gc3BpX3JlYWQoc3QtPnVzLCBzdC0+YnVmLCAzKTsKKwlzdC0+YnVmWzFdID0gc3QtPmJ1ZlsyXSA9IHN0LT5idWZbM10gPSAwOwogCi0JaWYgKHJldCA9PSAwKSB7Ci0JCWlmIChzdC0+bW9kZSkKLQkJCSp2YWwgPSAoc3QtPmJ1ZlsxXSA8PCAxNikgfAotCQkJCShzdC0+YnVmWzJdIDw8IDgpIHwKLQkJCQlzdC0+YnVmWzNdOwotCQllbHNlCi0JCQkqdmFsID0gKHN0LT5idWZbMV0gPDwgOCkgfCBzdC0+YnVmWzJdOwotCX0KKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKwlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCXJldCA9IHNwaV9yZWFkKHN0LT51cywgc3QtPmJ1ZiwgNCk7CiAKKwlpZiAocmV0ID09IDApCisJCSp2YWwgPSAoc3QtPmJ1ZlsxXSA8PCAxNikgfCAoc3QtPmJ1ZlsyXSA8PCA4KSB8IHN0LT5idWZbM107CiAJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHNzaXplX3QgYWRpczE2MTMwX3ZhbF9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgYWRpczE2MTMwX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCSAgICAgIGludCAqdmFsLCBpbnQgKnZhbDIsCisJCQkgICAgICBsb25nIG1hc2spCiB7Ci0Jc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGF0dHIpOwotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQl1MzIgdmFsOwotCXNzaXplX3QgcmV0OworCWludCByZXQ7CisJdTMyIHRlbXA7CiAKIAkvKiBUYWtlIHRoZSBpaW9fZGV2IHN0YXR1cyBsb2NrICovCiAJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7Ci0JcmV0ID0gIGFkaXMxNjEzMF9zcGlfcmVhZChkZXYsIHRoaXNfYXR0ci0+YWRkcmVzcywgJnZhbCk7CisJcmV0ID0gIGFkaXMxNjEzMF9zcGlfcmVhZChpbmRpb19kZXYsIGNoYW4tPmFkZHJlc3MsICZ0ZW1wKTsKIAltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOwotCi0JaWYgKHJldCA9PSAwKQotCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKLQllbHNlCisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKKwkqdmFsID0gdGVtcDsKKwlyZXR1cm4gSUlPX1ZBTF9JTlQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGFkaXMxNjEzMF9iaXRzbW9kZV9yZWFkKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFkaXMxNjEzMF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCi0JaWYgKHN0LT5tb2RlID09IDEpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgInMyNFxuIik7Ci0JZWxzZQotCQlyZXR1cm4gc3ByaW50ZihidWYsICJzMTZcbiIpOwotfQotCi1zdGF0aWMgc3NpemVfdCBhZGlzMTYxMzBfYml0c21vZGVfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgbGVuKQotewotCWludCByZXQ7Ci0JdTggdmFsOwotCi0JaWYgKHN5c2ZzX3N0cmVxKGJ1ZiwgInMxNiIpKQotCQl2YWwgPSAwOwotCWVsc2UgaWYgKHN5c2ZzX3N0cmVxKGJ1ZiwgInMyNCIpKQotCQl2YWwgPSAxOwotCWVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXQgPSBhZGlzMTYxMzBfc3BpX3dyaXRlKGRldiwgQURJUzE2MTMwX01PREUsIHZhbCk7Ci0KLQlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOwotfQotc3RhdGljIElJT19ERVZJQ0VfQVRUUih0ZW1wX3JhdywgU19JUlVHTywgYWRpczE2MTMwX3ZhbF9yZWFkLCBOVUxMLAotCQkgICAgICBBRElTMTYxMzBfVEVNUERBVEEpOwotCi1zdGF0aWMgSUlPX0RFVl9BVFRSX0dZUk9fWihhZGlzMTYxMzBfdmFsX3JlYWQsIEFESVMxNjEzMF9SQVRFREFUQSk7Ci0KLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIoZ3lyb196X3R5cGUsIFNfSVdVU1IgfCBTX0lSVUdPLCBhZGlzMTYxMzBfYml0c21vZGVfcmVhZCwKLQkJCWFkaXMxNjEzMF9iaXRzbW9kZV93cml0ZSwKLQkJCUFESVMxNjEzMF9NT0RFKTsKLQotc3RhdGljIElJT19DT05TVF9BVFRSKGd5cm9fel90eXBlX2F2YWlsYWJsZSwgInMxNiBzMjQiKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkaXMxNjEzMF9hdHRyaWJ1dGVzW10gPSB7Ci0JJmlpb19kZXZfYXR0cl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfZ3lyb196X3Jhdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfZ3lyb196X3R5cGUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2NvbnN0X2F0dHJfZ3lyb196X3R5cGVfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCi0JTlVMTAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWRpczE2MTMwX2F0dHJpYnV0ZV9ncm91cCA9IHsKLQkuYXR0cnMgPSBhZGlzMTYxMzBfYXR0cmlidXRlcywKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBhZGlzMTYxMzBfY2hhbm5lbHNbXSA9IHsKKwl7CisJCS50eXBlID0gSUlPX0FOR0xfVkVMLAorCQkubW9kaWZpZWQgPSAxLAorCQkuY2hhbm5lbDIgPSBJSU9fTU9EX1osCisJCS5hZGRyZXNzID0gQURJUzE2MTMwX1JBVEVEQVRBLAorCX0sIHsKKwkJLnR5cGUgPSBJSU9fVEVNUCwKKwkJLmluZGV4ZWQgPSAxLAorCQkuY2hhbm5lbCA9IDAsCisJCS5hZGRyZXNzID0gQURJUzE2MTMwX1RFTVBEQVRBLAorCX0KIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gYWRpczE2MTMwX2luZm8gPSB7Ci0JLmF0dHJzID0gJmFkaXMxNjEzMF9hdHRyaWJ1dGVfZ3JvdXAsCisJLnJlYWRfcmF3ID0gJmFkaXMxNjEzMF9yZWFkX3JhdywKIAkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAogfTsKIApAQCAtMTk2LDEwICsxMzIsMTEgQEAKIAlzdC0+dXMgPSBzcGk7CiAJbXV0ZXhfaW5pdCgmc3QtPmJ1Zl9sb2NrKTsKIAlpbmRpb19kZXYtPm5hbWUgPSBzcGktPmRldi5kcml2ZXItPm5hbWU7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGFkaXMxNjEzMF9jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoYWRpczE2MTMwX2NoYW5uZWxzKTsKIAlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmc3BpLT5kZXY7CiAJaW5kaW9fZGV2LT5pbmZvID0gJmFkaXMxNjEzMF9pbmZvOwogCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKLQlzdC0+bW9kZSA9IDE7CiAKIAlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CiAJaWYgKHJldCkKQEAgLTIxOCw2ICsxNTUsNyBAQAogc3RhdGljIGludCBhZGlzMTYxMzBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKHNwaV9nZXRfZHJ2ZGF0YShzcGkpKTsKKwlpaW9fZnJlZV9kZXZpY2Uoc3BpX2dldF9kcnZkYXRhKHNwaSkpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwLmgKaW5kZXggOTY5YjYyNC4uNGM0YjI1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjAuaApAQCAtMTEyLDcgKzExMiw3IEBACiAjZGVmaW5lIEFESVMxNjI2MF9TQ0FOX1RFTVAJMwogI2RlZmluZSBBRElTMTYyNjBfU0NBTl9BTkdMCTQKIAotI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKKyNpZmRlZiBDT05GSUdfSUlPX0JVRkZFUgogdm9pZCBhZGlzMTYyNjBfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiBpbnQgYWRpczE2MjYwX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiAKQEAgLTEyNCw3ICsxMjQsNyBAQAogaW50IGFkaXMxNjI2MF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIHZvaWQgYWRpczE2MjYwX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiAKLSNlbHNlIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKyNlbHNlIC8qIENPTkZJR19JSU9fQlVGRkVSICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTYyNjBfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKQEAgLTE1Miw1ICsxNTIsNSBAQAogewogfQogCi0jZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2VuZGlmIC8qIENPTkZJR19JSU9fQlVGRkVSICovCiAjZW5kaWYgLyogU1BJX0FESVMxNjI2MF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MF9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX2NvcmUuYwppbmRleCBmMmQ0M2NmLi5hYWEzOTY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX2NvcmUuYwpAQCAtOCw3ICs4LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC0xNywxMiArMTYsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi9zeXNmcy5oIgotI2luY2x1ZGUgIi4uL3JpbmdfZ2VuZXJpYy5oIgotI2luY2x1ZGUgIi4uL2FkYy9hZGMuaCIKLSNpbmNsdWRlICJneXJvLmgiCisjaW5jbHVkZSAiLi4vYnVmZmVyX2dlbmVyaWMuaCIKIAogI2luY2x1ZGUgImFkaXMxNjI2MC5oIgogCkBAIC0zOTEsNyArMzg5LDcgQEAKIH07CiAjZGVmaW5lIEFESVMxNjI2MF9HWVJPX0NIQU5ORUxfU0VUKGF4aXMsIG1vZCkJCQkJXAogCXN0cnVjdCBpaW9fY2hhbl9zcGVjIGFkaXMxNjI2MF9jaGFubmVsc18jI2F4aXNbXSA9IHsJCVwKLQkJSUlPX0NIQU4oSUlPX0dZUk8sIDEsIDAsIDAsIE5VTEwsIDAsIG1vZCwJCVwKKwkJSUlPX0NIQU4oSUlPX0FOR0xfVkVMLCAxLCAwLCAwLCBOVUxMLCAwLCBtb2QsCQlcCiAJCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQkJJQVNfU0VQQVJBVEUpIHwJXAogCQkJICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJTQ0FMRV9TRVBBUkFURSkgfAlcCiAJCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TRVBBUkFURSksCQlcCkBAIC00MDYsMTEgKzQwNCwxMSBAQAogCQkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpLAkJXAogCQkJIHRlbXAsIEFESVMxNjI2MF9TQ0FOX1RFTVAsCQkJXAogCQkJIElJT19TVCgndScsIDEyLCAxNiwgMCksIDApLAkJCVwKLQkJSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCAic3VwcGx5IiwgMCwgMCwJCVwKKwkJSUlPX0NIQU4oSUlPX1ZPTFRBR0UsIDAsIDEsIDAsICJzdXBwbHkiLCAwLCAwLAkJXAogCQkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpLAkJXAogCQkJIGluX3N1cHBseSwgQURJUzE2MjYwX1NDQU5fU1VQUExZLAkJXAogCQkJIElJT19TVCgndScsIDEyLCAxNiwgMCksIDApLAkJCVwKLQkJSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCBOVUxMLCAxLCAwLAkJCVwKKwkJSUlPX0NIQU4oSUlPX1ZPTFRBR0UsIDAsIDEsIDAsIE5VTEwsIDEsIDAsCQlcCiAJCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TRVBBUkFURSksCQlcCiAJCQkgaW5fYXV4LCBBRElTMTYyNjBfU0NBTl9BVVhfQURDLAkJXAogCQkJIElJT19TVCgndScsIDEyLCAxNiwgMCksIDApLAkJCVwKQEAgLTQ2OSwxNCArNDY3LDE0IEBACiAJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKToKIAljYXNlICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKToKIAkJc3dpdGNoIChjaGFuLT50eXBlKSB7Ci0JCWNhc2UgSUlPX0dZUk86CisJCWNhc2UgSUlPX0FOR0xfVkVMOgogCQkJKnZhbCA9IDA7CiAJCQlpZiAoc3BpX2dldF9kZXZpY2VfaWQoc3QtPnVzKS0+ZHJpdmVyX2RhdGEpCiAJCQkJKnZhbDIgPSAzMjA7CiAJCQllbHNlCiAJCQkJKnZhbDIgPSAxMjc4OwogCQkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTUlDUk87Ci0JCWNhc2UgSUlPX0lOOgorCQljYXNlIElJT19WT0xUQUdFOgogCQkJKnZhbCA9IDA7CiAJCQlpZiAoY2hhbi0+Y2hhbm5lbCA9PSAwKQogCQkJCSp2YWwyID0gMTgzMTU7CkBAIC00OTYsNyArNDk0LDcgQEAKIAkJcmV0dXJuIElJT19WQUxfSU5UOwogCWNhc2UgKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQkJJQVNfU0VQQVJBVEUpOgogCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKLQkJY2FzZSBJSU9fR1lSTzoKKwkJY2FzZSBJSU9fQU5HTF9WRUw6CiAJCQliaXRzID0gMTI7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTUxNiw3ICs1MTQsNyBAQAogCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CiAJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCU0NBTEVfU0VQQVJBVEUpOgogCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKLQkJY2FzZSBJSU9fR1lSTzoKKwkJY2FzZSBJSU9fQU5HTF9WRUw6CiAJCQliaXRzID0gMTI7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTU3OCw3ICs1NzYsNyBAQAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhZGlzMTYyNjBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlpbnQgcmV0LCByZWdkb25lID0gMDsKKwlpbnQgcmV0OwogCXN0cnVjdCBhZGlzMTYyNjBfcGxhdGZvcm1fZGF0YSAqcGQgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBhZGlzMTYyNjBfc3RhdGUgKnN0OwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CkBAIC02MjYsMTggKzYyNCwyMSBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CiAKLQlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOwotCXJlZ2RvbmUgPSAxOwotCXJldCA9IGlpb19yaW5nX2J1ZmZlcl9yZWdpc3Rlcl9leChpbmRpb19kZXYtPnJpbmcsIDAsCi0JCQkJCSAgaW5kaW9fZGV2LT5jaGFubmVscywKLQkJCQkJICBBUlJBWV9TSVpFKGFkaXMxNjI2MF9jaGFubmVsc194KSk7CisJcmV0ID0gaWlvX2J1ZmZlcl9yZWdpc3RlcihpbmRpb19kZXYsCisJCQkJICBpbmRpb19kZXYtPmNoYW5uZWxzLAorCQkJCSAgQVJSQVlfU0laRShhZGlzMTYyNjBfY2hhbm5lbHNfeCkpOwogCWlmIChyZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcmluZ1xuIik7CiAJCWdvdG8gZXJyb3JfdW5yZWdfcmluZ19mdW5jczsKIAl9Ci0KKwlpZiAoaW5kaW9fZGV2LT5idWZmZXIpIHsKKwkJLyogU2V0IGRlZmF1bHQgc2NhbiBtb2RlICovCisJCWlpb19zY2FuX21hc2tfc2V0KGluZGlvX2Rldi0+YnVmZmVyLCBBRElTMTYyNjBfU0NBTl9TVVBQTFkpOworCQlpaW9fc2Nhbl9tYXNrX3NldChpbmRpb19kZXYtPmJ1ZmZlciwgQURJUzE2MjYwX1NDQU5fR1lSTyk7CisJCWlpb19zY2FuX21hc2tfc2V0KGluZGlvX2Rldi0+YnVmZmVyLCBBRElTMTYyNjBfU0NBTl9BVVhfQURDKTsKKwkJaWlvX3NjYW5fbWFza19zZXQoaW5kaW9fZGV2LT5idWZmZXIsIEFESVMxNjI2MF9TQ0FOX1RFTVApOworCQlpaW9fc2Nhbl9tYXNrX3NldChpbmRpb19kZXYtPmJ1ZmZlciwgQURJUzE2MjYwX1NDQU5fQU5HTCk7CisJfQogCWlmIChzcGktPmlycSkgewogCQlyZXQgPSBhZGlzMTYyNjBfcHJvYmVfdHJpZ2dlcihpbmRpb19kZXYpOwogCQlpZiAocmV0KQpAQCAtNjQ4LDE5ICs2NDksMjAgQEAKIAlyZXQgPSBhZGlzMTYyNjBfaW5pdGlhbF9zZXR1cChpbmRpb19kZXYpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfcmVtb3ZlX3RyaWdnZXI7CisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmVtb3ZlX3RyaWdnZXI7CisKIAlyZXR1cm4gMDsKIAogZXJyb3JfcmVtb3ZlX3RyaWdnZXI6CiAJYWRpczE2MjYwX3JlbW92ZV90cmlnZ2VyKGluZGlvX2Rldik7CiBlcnJvcl91bmluaXRpYWxpemVfcmluZzoKLQlpaW9fcmluZ19idWZmZXJfdW5yZWdpc3RlcihpbmRpb19kZXYtPnJpbmcpOworCWlpb19idWZmZXJfdW5yZWdpc3RlcihpbmRpb19kZXYpOwogZXJyb3JfdW5yZWdfcmluZ19mdW5jczoKIAlhZGlzMTYyNjBfdW5jb25maWd1cmVfcmluZyhpbmRpb19kZXYpOwogZXJyb3JfZnJlZV9kZXY6Ci0JaWYgKHJlZ2RvbmUpCi0JCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwotCWVsc2UKLQkJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiBlcnJvcl9yZXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTY3MCw2ICs2NzIsOCBAQAogCWludCByZXQ7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOwogCisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisKIAlyZXQgPSBhZGlzMTYyNjBfc3RvcF9kZXZpY2UoaW5kaW9fZGV2KTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9yZXQ7CkBAIC02NzcsOSArNjgxLDkgQEAKIAlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwogCiAJYWRpczE2MjYwX3JlbW92ZV90cmlnZ2VyKGluZGlvX2Rldik7Ci0JaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2LT5yaW5nKTsKLQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIAlhZGlzMTYyNjBfdW5jb25maWd1cmVfcmluZyhpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogCiBlcnJfcmV0OgogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjBfcmluZy5jCmluZGV4IGE0ZGY4YjMuLjY3OWMxNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjBfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZGlzMTYyNjBfcmluZy5jCkBAIC0xLDIwICsxLDEyIEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgotI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCiAjaW5jbHVkZSAiLi4vcmluZ19zdy5oIgotI2luY2x1ZGUgIi4uL2FjY2VsL2FjY2VsLmgiCi0jaW5jbHVkZSAiLi4vdHJpZ2dlci5oIgorI2luY2x1ZGUgIi4uL3RyaWdnZXJfY29uc3VtZXIuaCIKICNpbmNsdWRlICJhZGlzMTYyNjAuaCIKIAogLyoqCkBAIC02OCw5ICs2MCw5IEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgYWRpczE2MjYwX3RyaWdnZXJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwKQogewogCXN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZiA9IHA7Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5pbmRpb19kZXY7CiAJc3RydWN0IGFkaXMxNjI2MF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBpbmRpb19kZXYtPnJpbmc7CisJc3RydWN0IGlpb19idWZmZXIgKnJpbmcgPSBpbmRpb19kZXYtPmJ1ZmZlcjsKIAlpbnQgaSA9IDA7CiAJczE2ICpkYXRhOwogCXNpemVfdCBkYXRhc2l6ZSA9IHJpbmctPmFjY2Vzcy0+Z2V0X2J5dGVzX3Blcl9kYXR1bShyaW5nKTsKQEAgLTEwMSwyNiArOTMsMjYgQEAKIHZvaWQgYWRpczE2MjYwX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKIAlpaW9fZGVhbGxvY19wb2xsZnVuYyhpbmRpb19kZXYtPnBvbGxmdW5jKTsKLQlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPnJpbmcpOworCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+YnVmZmVyKTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fcmluZ19zZXR1cF9vcHMgYWRpczE2MjYwX3Jpbmdfc2V0dXBfb3BzID0gewotCS5wcmVlbmFibGUgPSAmaWlvX3N3X3JpbmdfcHJlZW5hYmxlLAotCS5wb3N0ZW5hYmxlID0gJmlpb190cmlnZ2VyZWRfcmluZ19wb3N0ZW5hYmxlLAotCS5wcmVkaXNhYmxlID0gJmlpb190cmlnZ2VyZWRfcmluZ19wcmVkaXNhYmxlLAorc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fYnVmZmVyX3NldHVwX29wcyBhZGlzMTYyNjBfcmluZ19zZXR1cF9vcHMgPSB7CisJLnByZWVuYWJsZSA9ICZpaW9fc3dfYnVmZmVyX3ByZWVuYWJsZSwKKwkucG9zdGVuYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wb3N0ZW5hYmxlLAorCS5wcmVkaXNhYmxlID0gJmlpb190cmlnZ2VyZWRfYnVmZmVyX3ByZWRpc2FibGUsCiB9OwogCiBpbnQgYWRpczE2MjYwX2NvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJaW50IHJldCA9IDA7Ci0Jc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZzsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqcmluZzsKIAogCXJpbmcgPSBpaW9fc3dfcmJfYWxsb2NhdGUoaW5kaW9fZGV2KTsKIAlpZiAoIXJpbmcpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JaW5kaW9fZGV2LT5yaW5nID0gcmluZzsKKwlpbmRpb19kZXYtPmJ1ZmZlciA9IHJpbmc7CiAJLyogRWZmZWN0aXZlbHkgc2VsZWN0IHRoZSByaW5nIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiAqLwogCXJpbmctPmFjY2VzcyA9ICZyaW5nX3N3X2FjY2Vzc19mdW5jczsKIAlyaW5nLT5icGUgPSAyOwpAQCAtMTI4LDEzICsxMjAsNiBAQAogCXJpbmctPnNldHVwX29wcyA9ICZhZGlzMTYyNjBfcmluZ19zZXR1cF9vcHM7CiAJcmluZy0+b3duZXIgPSBUSElTX01PRFVMRTsKIAotCS8qIFNldCBkZWZhdWx0IHNjYW4gbW9kZSAqLwotCWlpb19zY2FuX21hc2tfc2V0KHJpbmcsIEFESVMxNjI2MF9TQ0FOX1NVUFBMWSk7Ci0JaWlvX3NjYW5fbWFza19zZXQocmluZywgQURJUzE2MjYwX1NDQU5fR1lSTyk7Ci0JaWlvX3NjYW5fbWFza19zZXQocmluZywgQURJUzE2MjYwX1NDQU5fQVVYX0FEQyk7Ci0JaWlvX3NjYW5fbWFza19zZXQocmluZywgQURJUzE2MjYwX1NDQU5fVEVNUCk7Ci0JaWlvX3NjYW5fbWFza19zZXQocmluZywgQURJUzE2MjYwX1NDQU5fQU5HTCk7Ci0KIAlpbmRpb19kZXYtPnBvbGxmdW5jID0gaWlvX2FsbG9jX3BvbGxmdW5jKCZpaW9fcG9sbGZ1bmNfc3RvcmVfdGltZSwKIAkJCQkJCSAmYWRpczE2MjYwX3RyaWdnZXJfaGFuZGxlciwKIAkJCQkJCSBJUlFGX09ORVNIT1QsCkBAIC0xNDYsMTAgKzEzMSwxMCBAQAogCQlnb3RvIGVycm9yX2lpb19zd19yYl9mcmVlOwogCX0KIAotCWluZGlvX2Rldi0+bW9kZXMgfD0gSU5ESU9fUklOR19UUklHR0VSRUQ7CisJaW5kaW9fZGV2LT5tb2RlcyB8PSBJTkRJT19CVUZGRVJfVFJJR0dFUkVEOwogCXJldHVybiAwOwogCiBlcnJvcl9paW9fc3dfcmJfZnJlZToKLQlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPnJpbmcpOworCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+YnVmZmVyKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkaXMxNjI2MF90cmlnZ2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX3RyaWdnZXIuYwppbmRleCAwMTA5NGQwLi4yZjJiMjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX3RyaWdnZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWRpczE2MjYwX3RyaWdnZXIuYwpAQCAtMSwxNCArMSw4IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKLSNpbmNsdWRlICIuLi9zeXNmcy5oIgogI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKICNpbmNsdWRlICJhZGlzMTYyNjAuaCIKIApAQCAtMjQsNiArMTgsMTEgQEAKIAlyZXR1cm4gYWRpczE2MjYwX3NldF9pcnEoaW5kaW9fZGV2LCBzdGF0ZSk7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX3RyaWdnZXJfb3BzIGFkaXMxNjI2MF90cmlnZ2VyX29wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuc2V0X3RyaWdnZXJfc3RhdGUgPSAmYWRpczE2MjYwX2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlLAorfTsKKwogaW50IGFkaXMxNjI2MF9wcm9iZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJaW50IHJldDsKQEAgLTQ2LDkgKzQ1LDggQEAKIAkJZ290byBlcnJvcl9mcmVlX3RyaWc7CiAKIAlzdC0+dHJpZy0+ZGV2LnBhcmVudCA9ICZzdC0+dXMtPmRldjsKLQlzdC0+dHJpZy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlzdC0+dHJpZy0+b3BzID0gJmFkaXMxNjI2MF90cmlnZ2VyX29wczsKIAlzdC0+dHJpZy0+cHJpdmF0ZV9kYXRhID0gaW5kaW9fZGV2OwotCXN0LT50cmlnLT5zZXRfdHJpZ2dlcl9zdGF0ZSA9ICZhZGlzMTYyNjBfZGF0YV9yZHlfdHJpZ2dlcl9zZXRfc3RhdGU7CiAJcmV0ID0gaWlvX3RyaWdnZXJfcmVnaXN0ZXIoc3QtPnRyaWcpOwogCiAJLyogc2VsZWN0IGRlZmF1bHQgdHJpZ2dlciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkeHJzNDUwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9hZHhyczQ1MF9jb3JlLmMKaW5kZXggNzUwMmEyNi4uM2MzZWY3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9neXJvL2FkeHJzNDUwX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vYWR4cnM0NTBfY29yZS5jCkBAIC04LDcgKzgsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KQEAgLTE3LDExICsxNiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCi0jaW5jbHVkZSAiZ3lyby5oIgotI2luY2x1ZGUgIi4uL2FkYy9hZGMuaCIKIAogI2luY2x1ZGUgImFkeHJzNDUwLmgiCiAKQEAgLTMyLDI2ICszMCwxMiBAQAogICogU2Vjb25kIHJlZ2lzdGVyJ3MgYWRkcmVzcyBpcyByZWdfYWRkcmVzcyArIDEuCiAgKiBAdmFsOiBzb21ld2hlcmUgdG8gcGFzcyBiYWNrIHRoZSB2YWx1ZSByZWFkCiAgKiovCi1zdGF0aWMgaW50IGFkeHJzNDUwX3NwaV9yZWFkX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXU4IHJlZ19hZGRyZXNzLAotCQl1MTYgKnZhbCkKK3N0YXRpYyBpbnQgYWR4cnM0NTBfc3BpX3JlYWRfcmVnXzE2KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkJICAgIHU4IHJlZ19hZGRyZXNzLAorCQkJCSAgICB1MTYgKnZhbCkKIHsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOwotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgYWR4cnM0NTBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlpbnQgcmV0OwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKLQkJewotCQkJLnR4X2J1ZiA9IHN0LT50eCwKLQkJCS5iaXRzX3Blcl93b3JkID0gOCwKLQkJCS5sZW4gPSA0LAotCQkJLmNzX2NoYW5nZSA9IDEsCi0JCX0sIHsKLQkJCS5yeF9idWYgPSBzdC0+cngsCi0JCQkuYml0c19wZXJfd29yZCA9IDgsCi0JCQkubGVuID0gNCwKLQkJfSwKLQl9OwogCiAJbXV0ZXhfbG9jaygmc3QtPmJ1Zl9sb2NrKTsKIAlzdC0+dHhbMF0gPSBBRFhSUzQ1MF9SRUFEX0RBVEEgfCAocmVnX2FkZHJlc3MgPj4gNyk7CkBAIC02MiwxMCArNDYsMTMgQEAKIAlpZiAoIShod2VpZ2h0MzIoYmUzMl90b19jcHUoKih1MzIgKilzdC0+dHgpKSAmIDEpKQogCQlzdC0+dHhbM10gIHw9IEFEWFJTNDUwX1A7CiAKLQlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOwotCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1swXSwgJm1zZyk7Ci0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzFdLCAmbXNnKTsKLQlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCXJldCA9IHNwaV93cml0ZShzdC0+dXMsIHN0LT50eCwgNCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZzdC0+dXMtPmRldiwgInByb2JsZW0gd2hpbGUgcmVhZGluZyAxNiBiaXQgcmVnaXN0ZXIgMHglMDJ4XG4iLAorCQkJcmVnX2FkZHJlc3MpOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJcmV0ID0gc3BpX3JlYWQoc3QtPnVzLCBzdC0+cngsIDQpOwogCWlmIChyZXQpIHsKIAkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoaWxlIHJlYWRpbmcgMTYgYml0IHJlZ2lzdGVyIDB4JTAyeFxuIiwKIAkJCQlyZWdfYWRkcmVzcyk7CkBAIC04NiwyMCArNzMsMTIgQEAKICAqIFNlY29uZCByZWdpc3RlcidzIGFkZHJlc3MgaXMgcmVnX2FkZHJlc3MgKyAxLgogICogQHZhbDogdmFsdWUgdG8gYmUgd3JpdHRlbi4KICAqKi8KLXN0YXRpYyBpbnQgYWR4cnM0NTBfc3BpX3dyaXRlX3JlZ18xNihzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXU4IHJlZ19hZGRyZXNzLAotCQl1MTYgdmFsKQorc3RhdGljIGludCBhZHhyczQ1MF9zcGlfd3JpdGVfcmVnXzE2KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkJICAgICB1OCByZWdfYWRkcmVzcywKKwkJCQkgICAgIHUxNiB2YWwpCiB7Ci0Jc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGFkeHJzNDUwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJaW50IHJldDsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzID0gewotCQkudHhfYnVmID0gc3QtPnR4LAotCQkucnhfYnVmID0gc3QtPnJ4LAotCQkuYml0c19wZXJfd29yZCA9IDgsCi0JCS5sZW4gPSA0LAotCX07CiAKIAltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOwogCXN0LT50eFswXSA9IEFEWFJTNDUwX1dSSVRFX0RBVEEgfCByZWdfYWRkcmVzcyA+PiA3OwpAQCAtMTA4LDE0ICs4NywxMiBAQAogCXN0LT50eFszXSA9IHZhbCA8PCAxOwogCiAJaWYgKCEoaHdlaWdodDMyKGJlMzJfdG9fY3B1KCoodTMyICopc3QtPnR4KSkgJiAxKSkKLQkJc3QtPnR4WzNdICB8PSBBRFhSUzQ1MF9QOworCQlzdC0+dHhbM10gfD0gQURYUlM0NTBfUDsKIAotCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7Ci0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzLCAmbXNnKTsKLQlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOworCXJldCA9IHNwaV93cml0ZShzdC0+dXMsIHN0LT50eCwgNCk7CiAJaWYgKHJldCkKIAkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJwcm9ibGVtIHdoaWxlIHdyaXRpbmcgMTYgYml0IHJlZ2lzdGVyIDB4JTAyeFxuIiwKLQkJCQlyZWdfYWRkcmVzcyk7CisJCQlyZWdfYWRkcmVzcyk7CiAJbXNsZWVwKDEpOyAvKiBlbmZvcmNlIHNlcXVlbnRpYWwgdHJhbnNmZXIgZGVsYXkgMC4xbXMgKi8KIAltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CiAJcmV0dXJuIHJldDsKQEAgLTEyNiwyNCArMTAzLDEwIEBACiAgKiBAZGV2OiBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIGNoaWxkIG9mIGFjdHVhbCBpaW9fZGV2CiAgKiBAdmFsOiBzb21ld2hlcmUgdG8gcGFzcyBiYWNrIHRoZSB2YWx1ZSByZWFkCiAgKiovCi1zdGF0aWMgaW50IGFkeHJzNDUwX3NwaV9zZW5zb3JfZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYsIHMxNiAqdmFsKQorc3RhdGljIGludCBhZHhyczQ1MF9zcGlfc2Vuc29yX2RhdGEoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgczE2ICp2YWwpCiB7Ci0Jc3RydWN0IHNwaV9tZXNzYWdlIG1zZzsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGFkeHJzNDUwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJaW50IHJldDsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHhmZXJzW10gPSB7Ci0JCXsKLQkJCS50eF9idWYgPSBzdC0+dHgsCi0JCQkuYml0c19wZXJfd29yZCA9IDgsCi0JCQkubGVuID0gNCwKLQkJCS5jc19jaGFuZ2UgPSAxLAotCQl9LCB7Ci0JCQkucnhfYnVmID0gc3QtPnJ4LAotCQkJLmJpdHNfcGVyX3dvcmQgPSA4LAotCQkJLmxlbiA9IDQsCi0JCX0sCi0JfTsKIAogCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CiAJc3QtPnR4WzBdID0gQURYUlM0NTBfU0VOU09SX0RBVEE7CkBAIC0xNTEsMTAgKzExNCwxMyBAQAogCXN0LT50eFsyXSA9IDA7CiAJc3QtPnR4WzNdID0gMDsKIAotCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7Ci0Jc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzBdLCAmbXNnKTsKLQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmeGZlcnNbMV0sICZtc2cpOwotCXJldCA9IHNwaV9zeW5jKHN0LT51cywgJm1zZyk7CisJcmV0ID0gc3BpX3dyaXRlKHN0LT51cywgc3QtPnR4LCA0KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnN0LT51cy0+ZGV2LCAiUHJvYmxlbSB3aGlsZSByZWFkaW5nIHNlbnNvciBkYXRhXG4iKTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCisJcmV0ID0gc3BpX3JlYWQoc3QtPnVzLCBzdC0+cngsIDQpOwogCWlmIChyZXQpIHsKIAkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJQcm9ibGVtIHdoaWxlIHJlYWRpbmcgc2Vuc29yIGRhdGFcbiIpOwogCQlnb3RvIGVycm9yX3JldDsKQEAgLTIwNiw3MyArMTcyLDEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHNzaXplX3QgYWR4cnM0NTBfcmVhZF90ZW1wKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlpbnQgcmV0OwotCXUxNiB0OwotCXJldCA9IGFkeHJzNDUwX3NwaV9yZWFkX3JlZ18xNihkZXYsCi0JCQlBRFhSUzQ1MF9URU1QMSwKLQkJCSZ0KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0ID4+IDcpOwotfQotCi1zdGF0aWMgc3NpemVfdCBhZHhyczQ1MF9yZWFkX3F1YWQoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQotewotCWludCByZXQ7Ci0JczE2IHQ7Ci0JcmV0ID0gYWR4cnM0NTBfc3BpX3JlYWRfcmVnXzE2KGRldiwKLQkJCUFEWFJTNDUwX1FVQUQxLAotCQkJJnQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHQpOwotfQotCi1zdGF0aWMgc3NpemVfdCBhZHhyczQ1MF93cml0ZV9kbmMoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgbGVuKQotewotCWludCByZXQ7Ci0JbG9uZyB2YWw7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG9sKGJ1ZiwgMTAsICZ2YWwpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfcmV0OwotCXJldCA9IGFkeHJzNDUwX3NwaV93cml0ZV9yZWdfMTYoZGV2LAotCQkJQURYUlM0NTBfRE5DMSwKLQkJCXZhbCAmIDB4M0ZGKTsKLWVycm9yX3JldDoKLQlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOwotfQotCi1zdGF0aWMgc3NpemVfdCBhZHhyczQ1MF9yZWFkX3NlbnNvcl9kYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNoYXIgKmJ1ZikKLXsKLQlpbnQgcmV0OwotCXMxNiB0OwotCi0JcmV0ID0gYWR4cnM0NTBfc3BpX3NlbnNvcl9kYXRhKGRldiwgJnQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdCk7Ci19Ci0KIC8qIFJlY29tbWVuZGVkIFN0YXJ0dXAgU2VxdWVuY2UgYnkgc3BlYyAqLwogc3RhdGljIGludCBhZHhyczQ1MF9pbml0aWFsX3NldHVwKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJdTMyIHQ7CiAJdTE2IGRhdGE7CiAJaW50IHJldDsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaW5kaW9fZGV2LT5kZXY7CiAJc3RydWN0IGFkeHJzNDUwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKIAltc2xlZXAoQURYUlM0NTBfU1RBUlRVUF9ERUxBWSoyKTsKQEAgLTMwNSwyMyArMjEwLDIzIEBACiAJCXJldHVybiAtRUlPOwogCiAJfQotCXJldCA9IGFkeHJzNDUwX3NwaV9yZWFkX3JlZ18xNihkZXYsIEFEWFJTNDUwX0ZBVUxUMSwgJmRhdGEpOworCXJldCA9IGFkeHJzNDUwX3NwaV9yZWFkX3JlZ18xNihpbmRpb19kZXYsIEFEWFJTNDUwX0ZBVUxUMSwgJmRhdGEpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJaWYgKGRhdGEgJiAweDBmZmYpIHsKIAkJZGV2X2Vycigmc3QtPnVzLT5kZXYsICJUaGUgZGV2aWNlIGlzIG5vdCBpbiBub3JtYWwgc3RhdHVzIVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlyZXQgPSBhZHhyczQ1MF9zcGlfcmVhZF9yZWdfMTYoZGV2LCBBRFhSUzQ1MF9QSUQxLCAmZGF0YSk7CisJcmV0ID0gYWR4cnM0NTBfc3BpX3JlYWRfcmVnXzE2KGluZGlvX2RldiwgQURYUlM0NTBfUElEMSwgJmRhdGEpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJZGV2X2luZm8oJnN0LT51cy0+ZGV2LCAiVGhlIFBhcnQgSUQgaXMgMHgleFxuIiwgZGF0YSk7CiAKLQlyZXQgPSBhZHhyczQ1MF9zcGlfcmVhZF9yZWdfMTYoZGV2LCBBRFhSUzQ1MF9TTkwsICZkYXRhKTsKKwlyZXQgPSBhZHhyczQ1MF9zcGlfcmVhZF9yZWdfMTYoaW5kaW9fZGV2LCBBRFhSUzQ1MF9TTkwsICZkYXRhKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCXQgPSBkYXRhOwotCXJldCA9IGFkeHJzNDUwX3NwaV9yZWFkX3JlZ18xNihkZXYsIEFEWFJTNDUwX1NOSCwgJmRhdGEpOworCXJldCA9IGFkeHJzNDUwX3NwaV9yZWFkX3JlZ18xNihpbmRpb19kZXYsIEFEWFJTNDUwX1NOSCwgJmRhdGEpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJdCB8PSBkYXRhIDw8IDE2OwpAQCAtMzMwLDM0ICsyMzUsOTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIElJT19ERVZfQVRUUl9HWVJPX1ooYWR4cnM0NTBfcmVhZF9zZW5zb3JfZGF0YSwgMCk7Ci1zdGF0aWMgSUlPX0RFVl9BVFRSX1RFTVBfUkFXKGFkeHJzNDUwX3JlYWRfdGVtcCk7Ci1zdGF0aWMgSUlPX0RFVl9BVFRSX0dZUk9fWl9RVUFEUkFUVVJFX0NPUlJFQ1RJT04oYWR4cnM0NTBfcmVhZF9xdWFkLCAwKTsKLXN0YXRpYyBJSU9fREVWX0FUVFJfR1lST19aX0NBTElCQklBUyhTX0lXVVNSLAotCQlOVUxMLCBhZHhyczQ1MF93cml0ZV9kbmMsIDApOwotc3RhdGljIElJT19DT05TVF9BVFRSKG5hbWUsICJhZHhyczQ1MCIpOworc3RhdGljIGludCBhZHhyczQ1MF93cml0ZV9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCSAgICAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgICAgaW50IHZhbCwKKwkJCSAgICAgIGludCB2YWwyLAorCQkJICAgICAgbG9uZyBtYXNrKQoreworCWludCByZXQ7CisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSk6CisJCXJldCA9IGFkeHJzNDUwX3NwaV93cml0ZV9yZWdfMTYoaW5kaW9fZGV2LAorCQkJCQkJQURYUlM0NTBfRE5DMSwKKwkJCQkJCXZhbCAmIDB4M0ZGKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZHhyczQ1MF9hdHRyaWJ1dGVzW10gPSB7Ci0JJmlpb19kZXZfYXR0cl9neXJvX3pfcmF3LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfZ3lyb196X3F1YWRyYXR1cmVfY29ycmVjdGlvbl9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX2d5cm9fel9jYWxpYmJpYXMuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2NvbnN0X2F0dHJfbmFtZS5kZXZfYXR0ci5hdHRyLAotCU5VTEwKLX07CitzdGF0aWMgaW50IGFkeHJzNDUwX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgICBpbnQgKnZhbCwKKwkJCSAgICAgaW50ICp2YWwyLAorCQkJICAgICBsb25nIG1hc2spCit7CisJaW50IHJldDsKKwlzMTYgdDsKKwl1MTYgdXQ7CisJc3dpdGNoIChtYXNrKSB7CisJY2FzZSAwOgorCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBJSU9fQU5HTF9WRUw6CisJCQlyZXQgPSBhZHhyczQ1MF9zcGlfc2Vuc29yX2RhdGEoaW5kaW9fZGV2LCAmdCk7CisJCQlpZiAocmV0KQorCQkJCWJyZWFrOworCQkJKnZhbCA9IHQ7CisJCQlyZXQgPSBJSU9fVkFMX0lOVDsKKwkJCWJyZWFrOworCQljYXNlIElJT19URU1QOgorCQkJcmV0ID0gYWR4cnM0NTBfc3BpX3JlYWRfcmVnXzE2KGluZGlvX2RldiwKKwkJCQkJCSAgICAgICBBRFhSUzQ1MF9URU1QMSwgJnV0KTsKKwkJCWlmIChyZXQpCisJCQkJYnJlYWs7CisJCQkqdmFsID0gdXQ7CisJCQlyZXQgPSBJSU9fVkFMX0lOVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgKDEgPDwgSUlPX0NIQU5fSU5GT19RVUFEUkFUVVJFX0NPUlJFQ1RJT05fUkFXX1NFUEFSQVRFKToKKwkJcmV0ID0gYWR4cnM0NTBfc3BpX3JlYWRfcmVnXzE2KGluZGlvX2RldiwgQURYUlM0NTBfUVVBRDEsICZ0KTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCQkqdmFsID0gdDsKKwkJcmV0ID0gSUlPX1ZBTF9JTlQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWR4cnM0NTBfYXR0cmlidXRlX2dyb3VwID0gewotCS5hdHRycyA9IGFkeHJzNDUwX2F0dHJpYnV0ZXMsCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIGFkeHJzNDUwX2NoYW5uZWxzW10gPSB7CisJeworCQkudHlwZSA9IElJT19BTkdMX1ZFTCwKKwkJLm1vZGlmaWVkID0gMSwKKwkJLmNoYW5uZWwyID0gSUlPX01PRF9aLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQkJJQVNfU0VQQVJBVEUpIHwKKwkJKDEgPDwgSUlPX0NIQU5fSU5GT19RVUFEUkFUVVJFX0NPUlJFQ1RJT05fUkFXX1NFUEFSQVRFKQorCX0sIHsKKwkJLnR5cGUgPSBJSU9fVEVNUCwKKwkJLmluZGV4ZWQgPSAxLAorCQkuY2hhbm5lbCA9IDAsCisJfQogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBhZHhyczQ1MF9pbmZvID0gewotCS5hdHRycyA9ICZhZHhyczQ1MF9hdHRyaWJ1dGVfZ3JvdXAsCiAJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKKwkucmVhZF9yYXcgPSAmYWR4cnM0NTBfcmVhZF9yYXcsCisJLndyaXRlX3JhdyA9ICZhZHhyczQ1MF93cml0ZV9yYXcsCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhZHhyczQ1MF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCWludCByZXQsIHJlZ2RvbmUgPSAwOworCWludCByZXQ7CiAJc3RydWN0IGFkeHJzNDUwX3N0YXRlICpzdDsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OwogCkBAIC0zNzYsMjQgKzM0MywyMyBAQAogCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKIAlpbmRpb19kZXYtPmluZm8gPSAmYWR4cnM0NTBfaW5mbzsKIAlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGFkeHJzNDUwX2NoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShhZHhyczQ1MF9jaGFubmVscyk7CisJaW5kaW9fZGV2LT5uYW1lID0gc3BpLT5kZXYuZHJpdmVyLT5uYW1lOwogCiAJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfZnJlZV9kZXY7Ci0JcmVnZG9uZSA9IDE7CiAKIAkvKiBHZXQgdGhlIGRldmljZSBpbnRvIGEgc2FuZSBpbml0aWFsIHN0YXRlICovCiAJcmV0ID0gYWR4cnM0NTBfaW5pdGlhbF9zZXR1cChpbmRpb19kZXYpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfaW5pdGlhbDsKIAlyZXR1cm4gMDsKLQogZXJyb3JfaW5pdGlhbDoKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIGVycm9yX2ZyZWVfZGV2OgotCWlmIChyZWdkb25lKQotCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKLQllbHNlCi0JCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogCiBlcnJvcl9yZXQ6CiAJcmV0dXJuIHJldDsKQEAgLTQwMiw2ICszNjgsNyBAQAogc3RhdGljIGludCBhZHhyczQ1MF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKIAlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3BpX2dldF9kcnZkYXRhKHNwaSkpOworCWlpb19mcmVlX2RldmljZShzcGlfZ2V0X2RydmRhdGEoc3BpKSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZ3lyby9neXJvLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vZ3lyby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTQ5NTYxMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2d5cm8vZ3lyby5oCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotCi0jaW5jbHVkZSAiLi4vc3lzZnMuaCIKLQotLyogR3lyb3Njb3BlIHR5cGVzIG9mIGF0dHJpYnV0ZSAqLwotCi0jZGVmaW5lIElJT19DT05TVF9BVFRSX0dZUk9fT0ZGU0VUKF9zdHJpbmcpCVwKLQlJSU9fQ09OU1RfQVRUUihneXJvX29mZnNldCwgX3N0cmluZykKLQotI2RlZmluZSBJSU9fREVWX0FUVFJfR1lST19PRkZTRVQoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQlcCi0JSUlPX0RFVklDRV9BVFRSKGd5cm9fb2Zmc2V0LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0dZUk9fWF9PRkZTRVQoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQlcCi0JSUlPX0RFVklDRV9BVFRSKGd5cm9feF9vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKLQotI2RlZmluZSBJSU9fREVWX0FUVFJfR1lST19ZX09GRlNFVChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCVwKLQlJSU9fREVWSUNFX0FUVFIoZ3lyb195X29mZnNldCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQotCi0jZGVmaW5lIElJT19ERVZfQVRUUl9HWVJPX1pfT0ZGU0VUKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJXAotCUlJT19ERVZJQ0VfQVRUUihneXJvX3pfb2Zmc2V0LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0NPTlNUX0FUVFJfR1lST19TQ0FMRShfc3RyaW5nKQkJXAotCUlJT19DT05TVF9BVFRSKGd5cm9fc2NhbGUsIF9zdHJpbmcpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0dZUk9fU0NBTEUoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJXAotCUlJT19ERVZJQ0VfQVRUUihneXJvX3NjYWxlLCBTX0lSVUdPLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKLQotI2RlZmluZSBJSU9fREVWX0FUVFJfR1lST19YX1NDQUxFKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJCVwKLQlJSU9fREVWSUNFX0FUVFIoZ3lyb194X3NjYWxlLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0dZUk9fWV9TQ0FMRShfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQlcCi0JSUlPX0RFVklDRV9BVFRSKGd5cm9feV9zY2FsZSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQotCi0jZGVmaW5lIElJT19ERVZfQVRUUl9HWVJPX1pfU0NBTEUoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJXAotCUlJT19ERVZJQ0VfQVRUUihneXJvX3pfc2NhbGUsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKLQotI2RlZmluZSBJSU9fREVWX0FUVFJfR1lST19DQUxJQkJJQVMoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJXAotCUlJT19ERVZJQ0VfQVRUUihneXJvX2NhbGliYmlhcywgU19JUlVHTywgX3Nob3csIF9zdG9yZSwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0dZUk9fWF9DQUxJQkJJQVMoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJXAotCUlJT19ERVZJQ0VfQVRUUihneXJvX3hfY2FsaWJiaWFzLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0dZUk9fWV9DQUxJQkJJQVMoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJXAotCUlJT19ERVZJQ0VfQVRUUihneXJvX3lfY2FsaWJiaWFzLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0dZUk9fWl9DQUxJQkJJQVMoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJXAotCUlJT19ERVZJQ0VfQVRUUihneXJvX3pfY2FsaWJiaWFzLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0dZUk9fQ0FMSUJTQ0FMRShfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQlcCi0JSUlPX0RFVklDRV9BVFRSKGd5cm9fY2FsaWJzY2FsZSwgU19JUlVHTywgX3Nob3csIF9zdG9yZSwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0dZUk9fWF9DQUxJQlNDQUxFKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJCVwKLQlJSU9fREVWSUNFX0FUVFIoZ3lyb194X2NhbGlic2NhbGUsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKLQotI2RlZmluZSBJSU9fREVWX0FUVFJfR1lST19ZX0NBTElCU0NBTEUoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJXAotCUlJT19ERVZJQ0VfQVRUUihneXJvX3lfY2FsaWJzY2FsZSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQotCi0jZGVmaW5lIElJT19ERVZfQVRUUl9HWVJPX1pfQ0FMSUJTQ0FMRShfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQlcCi0JSUlPX0RFVklDRV9BVFRSKGd5cm9fel9jYWxpYnNjYWxlLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0dZUk9fWl9RVUFEUkFUVVJFX0NPUlJFQ1RJT04oX3Nob3csIF9hZGRyKQkJXAotCUlJT19ERVZJQ0VfQVRUUihneXJvX3pfcXVhZHJhdHVyZV9jb3JyZWN0aW9uX3JhdywgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQotCi0jZGVmaW5lIElJT19ERVZfQVRUUl9HWVJPKF9zaG93LCBfYWRkcikJCQlcCi0JSUlPX0RFVklDRV9BVFRSKGd5cm9fcmF3LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0dZUk9fWChfc2hvdywgX2FkZHIpCQkJXAotCUlJT19ERVZJQ0VfQVRUUihneXJvX3hfcmF3LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0dZUk9fWShfc2hvdywgX2FkZHIpCQkJXAotCUlJT19ERVZJQ0VfQVRUUihneXJvX3lfcmF3LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0dZUk9fWihfc2hvdywgX2FkZHIpCQkJXAotCUlJT19ERVZJQ0VfQVRUUihneXJvX3pfcmF3LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0FOR0woX3Nob3csIF9hZGRyKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JSUlPX0RFVklDRV9BVFRSKGFuZ2xfcmF3LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX0FOR0xfWChfc2hvdywgX2FkZHIpCQkJCVwKLQlJSU9fREVWSUNFX0FUVFIoYW5nbF94X3JhdywgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQotCi0jZGVmaW5lIElJT19ERVZfQVRUUl9BTkdMX1koX3Nob3csIF9hZGRyKQkJCQlcCi0JSUlPX0RFVklDRV9BVFRSKGFuZ2xfeV9yYXcsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKLQotI2RlZmluZSBJSU9fREVWX0FUVFJfQU5HTF9aKF9zaG93LCBfYWRkcikJCQkJXAotCUlJT19ERVZJQ0VfQVRUUihhbmdsX3pfcmF3LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpby5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9paW8uaAppbmRleCA3YTZjZTRkLi5mM2Q4OGNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpby5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaWlvLmgKQEAgLTEsMyArMSw0IEBACisKIC8qIFRoZSBpbmR1c3RyaWFsIEkvTyBjb3JlCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDA4IEpvbmF0aGFuIENhbWVyb24KQEAgLTEyLDkgKzEzLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlICJzeXNmcy5oIgotI2luY2x1ZGUgImNocmRldi5oIgogCiAvKiBJSU8gVE9ETyBMSVNUICovCiAvKgpAQCAtMjIsMjAgKzIwLDE4IEBACiAgKiBDdXJyZW50bHkgYXNzdW1lcyBuYW5vIHNlY29uZHMuCiAgKi8KIAotLyogRXZlbnQgaW50ZXJmYWNlIGZsYWdzICovCi0jZGVmaW5lIElJT19CVVNZX0JJVF9QT1MgMQorZW51bSBpaW9fZGF0YV90eXBlIHsKKwlJSU9fUkFXLAorCUlJT19QUk9DRVNTRUQsCit9OwogCi0vKiBuYXVnaHR5IHRlbXBvcmFyeSBoYWNrIHRvIG1hdGNoIHRoZXNlIGFnYWluc3QgdGhlIGV2ZW50IHZlcnNpb24KLSAgIC0gbmVlZCB0byBmbGF0dGVybiB0aGVzZSB0b2dldGhlciAqLwogZW51bSBpaW9fY2hhbl90eXBlIHsKIAkvKiByZWFsIGNoYW5uZWwgdHlwZXMgKi8KLQlJSU9fSU4sCi0JSUlPX09VVCwKKwlJSU9fVk9MVEFHRSwKIAlJSU9fQ1VSUkVOVCwKIAlJSU9fUE9XRVIsCiAJSUlPX0FDQ0VMLAotCUlJT19JTl9ESUZGLAotCUlJT19HWVJPLAorCUlJT19BTkdMX1ZFTCwKIAlJSU9fTUFHTiwKIAlJSU9fTElHSFQsCiAJSUlPX0lOVEVOU0lUWSwKQEAgLTQ1LDIxICs0MSwyNSBAQAogCUlJT19ST1QsCiAJSUlPX0FOR0wsCiAJSUlPX1RJTUVTVEFNUCwKKwlJSU9fQ0FQQUNJVEFOQ0UsCiB9OwogCi0jZGVmaW5lIElJT19NT0RfWAkJCTAKLSNkZWZpbmUgSUlPX01PRF9MSUdIVF9CT1RICQkwCi0jZGVmaW5lIElJT19NT0RfWQkJCTEKLSNkZWZpbmUgSUlPX01PRF9MSUdIVF9JUgkJMQotI2RlZmluZSBJSU9fTU9EX1oJCQkyCi0jZGVmaW5lIElJT19NT0RfWF9BTkRfWQkJCTMKLSNkZWZpbmUgSUlPX01PRF9YX0FOWF9aCQkJNAotI2RlZmluZSBJSU9fTU9EX1lfQU5EX1oJCQk1Ci0jZGVmaW5lIElJT19NT0RfWF9BTkRfWV9BTkRfWgkJNgotI2RlZmluZSBJSU9fTU9EX1hfT1JfWQkJCTcKLSNkZWZpbmUgSUlPX01PRF9YX09SX1oJCQk4Ci0jZGVmaW5lIElJT19NT0RfWV9PUl9aCQkJOQotI2RlZmluZSBJSU9fTU9EX1hfT1JfWV9PUl9aCQkxMAorZW51bSBpaW9fbW9kaWZpZXIgeworCUlJT19OT19NT0QsCisJSUlPX01PRF9YLAorCUlJT19NT0RfWSwKKwlJSU9fTU9EX1osCisJSUlPX01PRF9YX0FORF9ZLAorCUlJT19NT0RfWF9BTlhfWiwKKwlJSU9fTU9EX1lfQU5EX1osCisJSUlPX01PRF9YX0FORF9ZX0FORF9aLAorCUlJT19NT0RfWF9PUl9ZLAorCUlJT19NT0RfWF9PUl9aLAorCUlJT19NT0RfWV9PUl9aLAorCUlJT19NT0RfWF9PUl9ZX09SX1osCisJSUlPX01PRF9MSUdIVF9CT1RILAorCUlJT19NT0RfTElHSFRfSVIsCit9OwogCiAvKiBDb3VsZCBhZGQgdGhlIHJhdyBhdHRyaWJ1dGVzIGFzIHdlbGwgLSBhbGxvd2luZyBidWZmZXIgb25seSBkZXZpY2VzICovCiBlbnVtIGlpb19jaGFuX2luZm9fZW51bSB7CkBAIC03NSw2ICs3NSwxNiBAQAogCUlJT19DSEFOX0lORk9fUEVBS19TRVBBUkFURSwKIAlJSU9fQ0hBTl9JTkZPX1BFQUtfU0NBTEVfU0hBUkVELAogCUlJT19DSEFOX0lORk9fUEVBS19TQ0FMRV9TRVBBUkFURSwKKwlJSU9fQ0hBTl9JTkZPX1FVQURSQVRVUkVfQ09SUkVDVElPTl9SQVdfU0hBUkVELAorCUlJT19DSEFOX0lORk9fUVVBRFJBVFVSRV9DT1JSRUNUSU9OX1JBV19TRVBBUkFURSwKKwlJSU9fQ0hBTl9JTkZPX0FWRVJBR0VfUkFXX1NIQVJFRCwKKwlJSU9fQ0hBTl9JTkZPX0FWRVJBR0VfUkFXX1NFUEFSQVRFLAorfTsKKworZW51bSBpaW9fZW5kaWFuIHsKKwlJSU9fQ1BVLAorCUlJT19CRSwKKwlJSU9fTEUsCiB9OwogCiAvKioKQEAgLTkyLDYgKzEwMiw3IEBACiAgKgkJCXN0b3JhZ2VfYml0czoJUmVhbGJpdHMgKyBwYWRkaW5nCiAgKgkJCXNoaWZ0OgkJU2hpZnQgcmlnaHQgYnkgdGhpcyBiZWZvcmUgbWFza2luZyBvdXQKICAqCQkJCQlyZWFsYml0cy4KKyAqCQkJZW5kaWFubmVzczoJbGl0dGxlIG9yIGJpZyBlbmRpYW4KICAqIEBpbmZvX21hc2s6CQlXaGF0IGluZm9ybWF0aW9uIGlzIHRvIGJlIGV4cG9ydGVkIGFib3V0IHRoaXMgY2hhbm5lbC4KICAqCQkJVGhpcyBpbmNsdWRlcyBjYWxpYmJpYXMsIHNjYWxlIGV0Yy4KICAqIEBldmVudF9tYXNrOglXaGF0IGV2ZW50cyBjYW4gdGhpcyBjaGFubmVsIHByb2R1Y2UuCkBAIC0xMDgsNiArMTE5LDcgQEAKICAqCQkJdGhlIHZhbHVlIGluIGNoYW5uZWwgd2lsbCBiZSBzdXBwcmVzc2VkIGZvciBhdHRyaWJ1dGUKICAqCQkJYnV0IG5vdCBmb3IgZXZlbnQgY29kZXMuIFR5cGljYWxseSBzZXQgaXQgdG8gMCB3aGVuCiAgKgkJCXRoZSBpbmRleCBpcyBmYWxzZS4KKyAqIEBkaWZmZXJlbnRpYWw6CUNoYW5uZWwgaXMgZGlmZmVyZW50aWFsLgogICovCiBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyB7CiAJZW51bSBpaW9fY2hhbl90eXBlCXR5cGU7CkBAIC0xMjAsMzMgKzEzMiwyNiBAQAogCQl1OAlyZWFsYml0czsKIAkJdTgJc3RvcmFnZWJpdHM7CiAJCXU4CXNoaWZ0OworCQllbnVtIGlpb19lbmRpYW4gZW5kaWFubmVzczsKIAl9IHNjYW5fdHlwZTsKLQljb25zdCBsb25nCQlpbmZvX21hc2s7Ci0JY29uc3QgbG9uZwkJZXZlbnRfbWFzazsKLQljb25zdCBjaGFyCQkqZXh0ZW5kX25hbWU7CisJbG9uZwkJCWluZm9fbWFzazsKKwlsb25nCQkJZXZlbnRfbWFzazsKKwljaGFyCQkJKmV4dGVuZF9uYW1lOwogCXVuc2lnbmVkCQlwcm9jZXNzZWRfdmFsOjE7CiAJdW5zaWduZWQJCW1vZGlmaWVkOjE7CiAJdW5zaWduZWQJCWluZGV4ZWQ6MTsKKwl1bnNpZ25lZAkJb3V0cHV0OjE7CisJdW5zaWduZWQJCWRpZmZlcmVudGlhbDoxOwogfTsKLS8qIE1lYW50IGZvciBpbnRlcm5hbCB1c2Ugb25seSAqLwotdm9pZCBfX2lpb19kZXZpY2VfYXR0cl9kZWluaXQoc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldl9hdHRyKTsKLWludCBfX2lpb19kZXZpY2VfYXR0cl9pbml0KHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZfYXR0ciwKLQkJCSAgIGNvbnN0IGNoYXIgKnBvc3RmaXgsCi0JCQkgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKLQkJCSAgIHNzaXplX3QgKCpyZWFkZnVuYykoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCSAgICAgICBjaGFyICpidWYpLAotCQkJICAgc3NpemVfdCAoKndyaXRlZnVuYykoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCQljb25zdCBjaGFyICpidWYsCi0JCQkJCQlzaXplX3QgbGVuKSwKLQkJCSAgIGJvb2wgZ2VuZXJpYyk7CisKICNkZWZpbmUgSUlPX1NUKHNpLCByYiwgc2IsIHNoKQkJCQkJCVwKIAl7IC5zaWduID0gc2ksIC5yZWFsYml0cyA9IHJiLCAuc3RvcmFnZWJpdHMgPSBzYiwgLnNoaWZ0ID0gc2ggfQogCi0jZGVmaW5lIElJT19DSEFOKF90eXBlLCBfbW9kLCBfaW5kZXhlZCwgX3Byb2MsIF9uYW1lLCBfY2hhbiwgX2NoYW4yLAlcCisvKiBNYWNybyBhc3N1bWVzIGlucHV0IGNoYW5uZWxzICovCisjZGVmaW5lIElJT19DSEFOKF90eXBlLCBfbW9kLCBfaW5kZXhlZCwgX3Byb2MsIF9uYW1lLCBfY2hhbiwgX2NoYW4yLCBcCiAJCSBfaW5mX21hc2ssIF9hZGRyZXNzLCBfc2ksIF9zdHlwZSwgX2V2ZW50X21hc2spCQlcCiAJeyAudHlwZSA9IF90eXBlLAkJCQkJCVwKKwkgIC5vdXRwdXQgPSAwLAkJCQkJCQlcCiAJICAubW9kaWZpZWQgPSBfbW9kLAkJCQkJCVwKIAkgIC5pbmRleGVkID0gX2luZGV4ZWQsCQkJCQkJXAogCSAgLnByb2Nlc3NlZF92YWwgPSBfcHJvYywJCQkJCVwKQEAgLTE2MywyMCArMTY4LDYgQEAKIAl7IC50eXBlID0gSUlPX1RJTUVTVEFNUCwgLmNoYW5uZWwgPSAtMSwJCQkJXAogCQkJLnNjYW5faW5kZXggPSBfc2ksIC5zY2FuX3R5cGUgPSBJSU9fU1QoJ3MnLCA2NCwgNjQsIDApIH0KIAotaW50IF9faWlvX2FkZF9jaGFuX2RldmF0dHIoY29uc3QgY2hhciAqcG9zdGZpeCwKLQkJCSAgIGNvbnN0IGNoYXIgKmdyb3VwLAotCQkJICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCi0JCQkgICBzc2l6ZV90ICgqZnVuYykoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkJICAgY2hhciAqYnVmKSwKLQkJCSAgIHNzaXplX3QgKCp3cml0ZWZ1bmMpKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQkJY29uc3QgY2hhciAqYnVmLAotCQkJCQkJc2l6ZV90IGxlbiksCi0JCQkgICBpbnQgbWFzaywKLQkJCSAgIGJvb2wgZ2VuZXJpYywKLQkJCSAgIHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgIHN0cnVjdCBsaXN0X2hlYWQgKmF0dHJfbGlzdCk7CiAvKioKICAqIGlpb19nZXRfdGltZV9ucygpIC0gdXRpbGl0eSBmdW5jdGlvbiB0byBnZXQgYSB0aW1lIHN0YW1wIGZvciBldmVudHMgZXRjCiAgKiovCkBAIC0xOTQsMTAgKzE4NSwxMSBAQAogCiAvKiBEZXZpY2Ugb3BlcmF0aW5nIG1vZGVzICovCiAjZGVmaW5lIElORElPX0RJUkVDVF9NT0RFCQkweDAxCi0jZGVmaW5lIElORElPX1JJTkdfVFJJR0dFUkVECQkweDAyCi0jZGVmaW5lIElORElPX1JJTkdfSEFSRFdBUkVfQlVGRkVSCTB4MDgKKyNkZWZpbmUgSU5ESU9fQlVGRkVSX1RSSUdHRVJFRAkJMHgwMgorI2RlZmluZSBJTkRJT19CVUZGRVJfSEFSRFdBUkUJCTB4MDgKIAotI2RlZmluZSBJTkRJT19BTExfUklOR19NT0RFUyAoSU5ESU9fUklOR19UUklHR0VSRUQgfCBJTkRJT19SSU5HX0hBUkRXQVJFX0JVRkZFUikKKyNkZWZpbmUgSU5ESU9fQUxMX0JVRkZFUl9NT0RFUwkJCQkJXAorCShJTkRJT19CVUZGRVJfVFJJR0dFUkVEIHwgSU5ESU9fQlVGRkVSX0hBUkRXQVJFKQogCiAvKiBWYXN0IG1ham9yaXR5IG9mIHRoaXMgaXMgc2V0IGJ5IHRoZSBpbmR1c3RyaWFsaW8gc3Vic3lzdGVtIG9uIGEKICAqIGNhbGwgdG8gaWlvX2RldmljZV9yZWdpc3Rlci4gKi8KQEAgLTIwNiwxMiArMTk4LDEyIEBACiAjZGVmaW5lIElJT19WQUxfSU5UX1BMVVNfTkFOTyAzCiAKIHN0cnVjdCBpaW9fdHJpZ2dlcjsgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RydWN0IGlpb19kZXY7CiAKIC8qKgogICogc3RydWN0IGlpb19pbmZvIC0gY29uc3RhbnQgaW5mb3JtYXRpb24gYWJvdXQgZGV2aWNlCiAgKiBAZHJpdmVyX21vZHVsZToJbW9kdWxlIHN0cnVjdHVyZSB1c2VkIHRvIGVuc3VyZSBjb3JyZWN0CiAgKgkJCW93bmVyc2hpcCBvZiBjaHJkZXZzIGV0YwotICogQG51bV9pbnRlcnJ1cHRfbGluZXM6bnVtYmVyIG9mIHBoeXNpY2FsIGludGVycnVwdCBsaW5lcyBmcm9tIGRldmljZQogICogQGV2ZW50X2F0dHJzOglldmVudCBjb250cm9sIGF0dHJpYnV0ZXMKICAqIEBhdHRyczoJCWdlbmVyYWwgcHVycG9zZSBkZXZpY2UgYXR0cmlidXRlcwogICogQHJlYWRfcmF3OgkJZnVuY3Rpb24gdG8gcmVxdWVzdCBhIHZhbHVlIGZyb20gdGhlIGRldmljZS4KQEAgLTIzNSw3ICsyMjcsNiBAQAogICoqLwogc3RydWN0IGlpb19pbmZvIHsKIAlzdHJ1Y3QgbW9kdWxlCQkJKmRyaXZlcl9tb2R1bGU7Ci0JaW50CQkJCW51bV9pbnRlcnJ1cHRfbGluZXM7CiAJc3RydWN0IGF0dHJpYnV0ZV9ncm91cAkJKmV2ZW50X2F0dHJzOwogCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAJKmF0dHJzOwogCkBAIC0yNTYsMTcgKzI0NywxNyBAQAogCQkJIGxvbmcgbWFzayk7CiAKIAlpbnQgKCpyZWFkX2V2ZW50X2NvbmZpZykoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKLQkJCQkgaW50IGV2ZW50X2NvZGUpOworCQkJCSB1NjQgZXZlbnRfY29kZSk7CiAKIAlpbnQgKCp3cml0ZV9ldmVudF9jb25maWcpKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCi0JCQkJICBpbnQgZXZlbnRfY29kZSwKKwkJCQkgIHU2NCBldmVudF9jb2RlLAogCQkJCSAgaW50IHN0YXRlKTsKIAogCWludCAoKnJlYWRfZXZlbnRfdmFsdWUpKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCi0JCQkJaW50IGV2ZW50X2NvZGUsCisJCQkJdTY0IGV2ZW50X2NvZGUsCiAJCQkJaW50ICp2YWwpOwogCWludCAoKndyaXRlX2V2ZW50X3ZhbHVlKShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAotCQkJCSBpbnQgZXZlbnRfY29kZSwKKwkJCQkgdTY0IGV2ZW50X2NvZGUsCiAJCQkJIGludCB2YWwpOwogCWludCAoKnZhbGlkYXRlX3RyaWdnZXIpKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCiAJCQkJc3RydWN0IGlpb190cmlnZ2VyICp0cmlnKTsKQEAgLTI3NiwxMTAgKzI2Nyw5MiBAQAogLyoqCiAgKiBzdHJ1Y3QgaWlvX2RldiAtIGluZHVzdHJpYWwgSS9PIGRldmljZQogICogQGlkOgkJCVtJTlRFUk5dIHVzZWQgdG8gaWRlbnRpZnkgZGV2aWNlIGludGVybmFsbHkKLSAqIEBkZXZfZGF0YToJCVtEUklWRVJdIGRldmljZSBzcGVjaWZpYyBkYXRhCiAgKiBAbW9kZXM6CQlbRFJJVkVSXSBvcGVyYXRpbmcgbW9kZXMgc3VwcG9ydGVkIGJ5IGRldmljZQogICogQGN1cnJlbnRtb2RlOglbRFJJVkVSXSBjdXJyZW50IG9wZXJhdGluZyBtb2RlCiAgKiBAZGV2OgkJW0RSSVZFUl0gZGV2aWNlIHN0cnVjdHVyZSwgc2hvdWxkIGJlIGFzc2lnbmVkIGEgcGFyZW50CiAgKgkJCWFuZCBvd25lcgotICogQGV2ZW50X2ludGVyZmFjZXM6CVtJTlRFUk5dIGV2ZW50IGNocmRldnMgYXNzb2NpYXRlZCB3aXRoIGludGVycnVwdCBsaW5lcwotICogQHJpbmc6CQlbRFJJVkVSXSBhbnkgcmluZyBidWZmZXIgcHJlc2VudAorICogQGV2ZW50X2ludGVyZmFjZToJW0lOVEVSTl0gZXZlbnQgY2hyZGV2cyBhc3NvY2lhdGVkIHdpdGggaW50ZXJydXB0IGxpbmVzCisgKiBAYnVmZmVyOgkJW0RSSVZFUl0gYW55IGJ1ZmZlciBwcmVzZW50CiAgKiBAbWxvY2s6CQlbSU5URVJOXSBsb2NrIHVzZWQgdG8gcHJldmVudCBzaW11bHRhbmVvdXMgZGV2aWNlIHN0YXRlCiAgKgkJCWNoYW5nZXMKICAqIEBhdmFpbGFibGVfc2Nhbl9tYXNrczogW0RSSVZFUl0gb3B0aW9uYWwgYXJyYXkgb2YgYWxsb3dlZCBiaXRtYXNrcwotICogQHRyaWc6CQlbSU5URVJOXSBjdXJyZW50IGRldmljZSB0cmlnZ2VyIChyaW5nIGJ1ZmZlciBtb2RlcykKKyAqIEBtYXNrbGVuZ3RoOgkJW0lOVEVSTl0gdGhlIGxlbmd0aCBvZiB0aGUgbWFzayBlc3RhYmxpc2hlZCBmcm9tCisgKgkJCWNoYW5uZWxzCisgKiBAdHJpZzoJCVtJTlRFUk5dIGN1cnJlbnQgZGV2aWNlIHRyaWdnZXIgKGJ1ZmZlciBtb2RlcykKICAqIEBwb2xsZnVuYzoJCVtEUklWRVJdIGZ1bmN0aW9uIHJ1biBvbiB0cmlnZ2VyIGJlaW5nIHJlY2VpdmVkCiAgKiBAY2hhbm5lbHM6CQlbRFJJVkVSXSBjaGFubmVsIHNwZWNpZmljYXRpb24gc3RydWN0dXJlIHRhYmxlCiAgKiBAbnVtX2NoYW5uZWxzOglbRFJJVkVSXSBudW1iZXIgb2YgY2hhbmVscyBzcGVjaWZpZWQgaW4gQGNoYW5uZWxzLgogICogQGNoYW5uZWxfYXR0cl9saXN0OglbSU5URVJOXSBrZWVwIHRyYWNrIG9mIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBjaGFubmVsCi0gKgkJCWF0dHJpYnV0ZXMuCisgKgkJCWF0dHJpYnV0ZXMKKyAqIEBjaGFuX2F0dHJfZ3JvdXA6CVtJTlRFUk5dIGdyb3VwIGZvciBhbGwgYXR0cnMgaW4gYmFzZSBkaXJlY3RvcnkKICAqIEBuYW1lOgkJW0RSSVZFUl0gbmFtZSBvZiB0aGUgZGV2aWNlLgorICogQGluZm86CQlbRFJJVkVSXSBjYWxsYmFja3MgYW5kIGNvbnN0YW50IGluZm8gZnJvbSBkcml2ZXIKKyAqIEBjaHJkZXY6CQlbSU5URVJOXSBhc3NvY2lhdGVkIGNoYXJhY3RlciBkZXZpY2UKKyAqIEBncm91cHM6CQlbSU5URVJOXSBhdHRyaWJ1dGUgZ3JvdXBzCisgKiBAZ3JvdXBjb3VudGVyOglbSU5URVJOXSBpbmRleCBvZiBuZXh0IGF0dHJpYnV0ZSBncm91cAogICoqLwogc3RydWN0IGlpb19kZXYgewogCWludAkJCQlpZDsKLQl2b2lkCQkJCSpkZXZfZGF0YTsKKwogCWludAkJCQltb2RlczsKIAlpbnQJCQkJY3VycmVudG1vZGU7CiAJc3RydWN0IGRldmljZQkJCWRldjsKIAotCXN0cnVjdCBpaW9fZXZlbnRfaW50ZXJmYWNlCSpldmVudF9pbnRlcmZhY2VzOworCXN0cnVjdCBpaW9fZXZlbnRfaW50ZXJmYWNlCSpldmVudF9pbnRlcmZhY2U7CiAKLQlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyCQkqcmluZzsKKwlzdHJ1Y3QgaWlvX2J1ZmZlcgkJKmJ1ZmZlcjsKIAlzdHJ1Y3QgbXV0ZXgJCQltbG9jazsKIAotCXUzMgkJCQkqYXZhaWxhYmxlX3NjYW5fbWFza3M7CisJdW5zaWduZWQgbG9uZwkJCSphdmFpbGFibGVfc2Nhbl9tYXNrczsKKwl1bnNpZ25lZAkJCW1hc2tsZW5ndGg7CiAJc3RydWN0IGlpb190cmlnZ2VyCQkqdHJpZzsKIAlzdHJ1Y3QgaWlvX3BvbGxfZnVuYwkJKnBvbGxmdW5jOwogCi0Jc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW5uZWxzOwotCWludCBudW1fY2hhbm5lbHM7CisJc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QJKmNoYW5uZWxzOworCWludAkJCQludW1fY2hhbm5lbHM7CiAKLQlzdHJ1Y3QgbGlzdF9oZWFkIGNoYW5uZWxfYXR0cl9saXN0OwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JY29uc3Qgc3RydWN0IGlpb19pbmZvICppbmZvOworCXN0cnVjdCBsaXN0X2hlYWQJCWNoYW5uZWxfYXR0cl9saXN0OworCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAJCWNoYW5fYXR0cl9ncm91cDsKKwljb25zdCBjaGFyCQkJKm5hbWU7CisJY29uc3Qgc3RydWN0IGlpb19pbmZvCQkqaW5mbzsKKwlzdHJ1Y3QgY2RldgkJCWNocmRldjsKKyNkZWZpbmUgSUlPX01BWF9HUk9VUFMgNgorCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAJKmdyb3Vwc1tJSU9fTUFYX0dST1VQUyArIDFdOworCWludAkJCQlncm91cGNvdW50ZXI7CiB9OwogCiAvKioKICAqIGlpb19kZXZpY2VfcmVnaXN0ZXIoKSAtIHJlZ2lzdGVyIGEgZGV2aWNlIHdpdGggdGhlIElJTyBzdWJzeXN0ZW0KLSAqIEBkZXZfaW5mbzoJCURldmljZSBzdHJ1Y3R1cmUgZmlsbGVkIGJ5IHRoZSBkZXZpY2UgZHJpdmVyCisgKiBAaW5kaW9fZGV2OgkJRGV2aWNlIHN0cnVjdHVyZSBmaWxsZWQgYnkgdGhlIGRldmljZSBkcml2ZXIKICAqKi8KLWludCBpaW9fZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyk7CitpbnQgaWlvX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIAogLyoqCiAgKiBpaW9fZGV2aWNlX3VucmVnaXN0ZXIoKSAtIHVucmVnaXN0ZXIgYSBkZXZpY2UgZnJvbSB0aGUgSUlPIHN1YnN5c3RlbQotICogQGRldl9pbmZvOgkJRGV2aWNlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGRldmljZS4KKyAqIEBpbmRpb19kZXY6CQlEZXZpY2Ugc3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgZGV2aWNlLgogICoqLwotdm9pZCBpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvKTsKK3ZvaWQgaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogCiAvKioKICAqIGlpb19wdXNoX2V2ZW50KCkgLSB0cnkgdG8gYWRkIGV2ZW50IHRvIHRoZSBsaXN0IGZvciB1c2Vyc3BhY2UgcmVhZGluZwotICogQGRldl9pbmZvOgkJSUlPIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBldl9saW5lOgkJV2hpY2ggZXZlbnQgbGluZSAoaGFyZHdhcmUgaW50ZXJydXB0KQorICogQGluZGlvX2RldjoJCUlJTyBkZXZpY2Ugc3RydWN0dXJlCiAgKiBAZXZfY29kZToJCVdoYXQgZXZlbnQKICAqIEB0aW1lc3RhbXA6CQlXaGVuIHRoZSBldmVudCBvY2N1cnJlZAogICoqLwotaW50IGlpb19wdXNoX2V2ZW50KHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbywKLQkJICBpbnQgZXZfbGluZSwKLQkJICBpbnQgZXZfY29kZSwKLQkJICBzNjQgdGltZXN0YW1wKTsKK2ludCBpaW9fcHVzaF9ldmVudChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCB1NjQgZXZfY29kZSwgczY0IHRpbWVzdGFtcCk7CiAKLS8qIFVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBiaXBvbGFyIGFuZCB1bmlwb2xhciBzY2FuIGVsZW1lbmVudHMuCi0gKiBXaGlsc3QgdGhpcyBtYXkgc2VlbSBvYnZpb3VzLCB3ZSBtYXkgd2VsbCB3YW50IHRvIGNoYW5nZSB0aGUgcmVwcmVzZW50YXRpb24KLSAqIGluIHRoZSBmdXR1cmUhKi8KLSNkZWZpbmUgSUlPX1NJR05FRChhKSAtKGEpCi0jZGVmaW5lIElJT19VTlNJR05FRChhKSAoYSkKLQotZXh0ZXJuIGRldl90IGlpb19kZXZ0OwogZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSBpaW9fYnVzX3R5cGU7CiAKIC8qKgogICogaWlvX3B1dF9kZXZpY2UoKSAtIHJlZmVyZW5jZSBjb3VudGVkIGRlYWxsb2NhdGlvbiBvZiBzdHJ1Y3QgZGV2aWNlCiAgKiBAZGV2OiB0aGUgaWlvX2RldmljZSBjb250YWluaW5nIHRoZSBkZXZpY2UKICAqKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpaW9fcHV0X2RldmljZShzdHJ1Y3QgaWlvX2RldiAqZGV2KQorc3RhdGljIGlubGluZSB2b2lkIGlpb19wdXRfZGV2aWNlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7Ci0JaWYgKGRldikKLQkJcHV0X2RldmljZSgmZGV2LT5kZXYpOworCWlmIChpbmRpb19kZXYpCisJCXB1dF9kZXZpY2UoJmluZGlvX2Rldi0+ZGV2KTsKIH07CiAKLS8qKgotICogdG9faWlvX2RldigpIC0gZ2V0IGlpb19kZXYgZm9yIHdoaWNoIHdlIGhhdmUgdGhlIHN0cnVjdCBkZXZpY2UKLSAqIEBkOiB0aGUgc3RydWN0IGRldmljZQotICoqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgaWlvX2RldiAqdG9faWlvX2RldihzdHJ1Y3QgZGV2aWNlICpkKQotewotCXJldHVybiBjb250YWluZXJfb2YoZCwgc3RydWN0IGlpb19kZXYsIGRldik7Ci19OwotCi0vKioKLSAqIGlpb19kZXZfZ2V0X2RldmRhdGEoKSAtIGhlbHBlciBmdW5jdGlvbiBnZXRzIGRldmljZSBzcGVjaWZpYyBkYXRhCi0gKiBAZDogdGhlIGlpb19kZXYgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZpY2UKLSAqKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCAqaWlvX2Rldl9nZXRfZGV2ZGF0YShzdHJ1Y3QgaWlvX2RldiAqZCkKLXsKLQlyZXR1cm4gZC0+ZGV2X2RhdGE7Ci19Ci0KLQogLyogQ2FuIHdlIG1ha2UgdGhpcyBzbWFsbGVyPyAqLwogI2RlZmluZSBJSU9fQUxJR04gTDFfQ0FDSEVfQllURVMKIC8qKgpAQCAtMzg4LDkgKzM2MSw5IEBACiAgKiovCiBzdHJ1Y3QgaWlvX2RldiAqaWlvX2FsbG9jYXRlX2RldmljZShpbnQgc2l6ZW9mX3ByaXYpOwogCi1zdGF0aWMgaW5saW5lIHZvaWQgKmlpb19wcml2KGNvbnN0IHN0cnVjdCBpaW9fZGV2ICpkZXYpCitzdGF0aWMgaW5saW5lIHZvaWQgKmlpb19wcml2KGNvbnN0IHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7Ci0JcmV0dXJuIChjaGFyICopZGV2ICsgQUxJR04oc2l6ZW9mKHN0cnVjdCBpaW9fZGV2KSwgSUlPX0FMSUdOKTsKKwlyZXR1cm4gKGNoYXIgKilpbmRpb19kZXYgKyBBTElHTihzaXplb2Yoc3RydWN0IGlpb19kZXYpLCBJSU9fQUxJR04pOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpaW9fZGV2ICppaW9fcHJpdl90b19kZXYodm9pZCAqcHJpdikKQEAgLTQwMywzNyArMzc2LDE2IEBACiAgKiBpaW9fZnJlZV9kZXZpY2UoKSAtIGZyZWUgYW4gaWlvX2RldiBmcm9tIGEgZHJpdmVyCiAgKiBAZGV2OiB0aGUgaWlvX2RldiBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZQogICoqLwotdm9pZCBpaW9fZnJlZV9kZXZpY2Uoc3RydWN0IGlpb19kZXYgKmRldik7Cit2b2lkIGlpb19mcmVlX2RldmljZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIAogLyoqCi0gKiBpaW9fcHV0KCkgLSBpbnRlcm5hbCBtb2R1bGUgcmVmZXJlbmNlIGNvdW50IHJlZHVjZQorICogaWlvX2J1ZmZlcl9lbmFibGVkKCkgLSBoZWxwZXIgZnVuY3Rpb24gdG8gdGVzdCBpZiB0aGUgYnVmZmVyIGlzIGVuYWJsZWQKKyAqIEBpbmRpb19kZXY6CQlJSU8gZGV2aWNlIGluZm8gc3RydWN0dXJlIGZvciBkZXZpY2UKICAqKi8KLXZvaWQgaWlvX3B1dCh2b2lkKTsKLQotLyoqCi0gKiBpaW9fZ2V0KCkgLSBpbnRlcm5hbCBtb2R1bGUgcmVmZXJlbmNlIGNvdW50IGluY3JlYXNlCi0gKiovCi12b2lkIGlpb19nZXQodm9pZCk7Ci0KLS8qKgotICogaWlvX2RldmljZV9nZXRfY2hyZGV2X21pbm9yKCkgLSBnZXQgYW4gdW51c2VkIG1pbm9yIG51bWJlcgotICoqLwotaW50IGlpb19kZXZpY2VfZ2V0X2NocmRldl9taW5vcih2b2lkKTsKLXZvaWQgaWlvX2RldmljZV9mcmVlX2NocmRldl9taW5vcihpbnQgdmFsKTsKLQotLyoqCi0gKiBpaW9fcmluZ19lbmFibGVkKCkgLSBoZWxwZXIgZnVuY3Rpb24gdG8gdGVzdCBpZiBhbnkgZm9ybSBvZiByaW5nIGlzIGVuYWJsZWQKLSAqIEBkZXZfaW5mbzoJCUlJTyBkZXZpY2UgaW5mbyBzdHJ1Y3R1cmUgZm9yIGRldmljZQotICoqLwotc3RhdGljIGlubGluZSBib29sIGlpb19yaW5nX2VuYWJsZWQoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvKQorc3RhdGljIGlubGluZSBib29sIGlpb19idWZmZXJfZW5hYmxlZChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewotCXJldHVybiBkZXZfaW5mby0+Y3VycmVudG1vZGUKLQkJJiAoSU5ESU9fUklOR19UUklHR0VSRUQKLQkJICAgfCBJTkRJT19SSU5HX0hBUkRXQVJFX0JVRkZFUik7CisJcmV0dXJuIGluZGlvX2Rldi0+Y3VycmVudG1vZGUKKwkJJiAoSU5ESU9fQlVGRkVSX1RSSUdHRVJFRCB8IElORElPX0JVRkZFUl9IQVJEV0FSRSk7CiB9OwogCi1zdHJ1Y3QgaWRhOwotCi1pbnQgaWlvX2dldF9uZXdfaWRhX3ZhbChzdHJ1Y3QgaWRhICp0aGlzX2lkYSk7Ci12b2lkIGlpb19mcmVlX2lkYV92YWwoc3RydWN0IGlkYSAqdGhpc19pZGEsIGludCBpZCk7CiAjZW5kaWYgLyogX0lORFVTVFJJQUxfSU9fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaWlvX2NvcmUuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaWlvX2NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjE1OWUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9paW9fY29yZS5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qIFRoZSBpbmR1c3RyaWFsIEkvTyBjb3JlIGZ1bmN0aW9uIGRlZnMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IEpvbmF0aGFuIENhbWVyb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoZXNlIGRlZmluaXRpb25zIGFyZSBtZWFudCBmb3IgdXNlIG9ubHkgd2l0aGluIHRoZSBJSU8gY29yZSwgbm90IGluZGl2aWR1YWwKKyAqIGRyaXZlcnMuCisgKi8KKworI2lmbmRlZiBfSUlPX0NPUkVfSF8KKyNkZWZpbmUgX0lJT19DT1JFX0hfCisKK2ludCBfX2lpb19hZGRfY2hhbl9kZXZhdHRyKGNvbnN0IGNoYXIgKnBvc3RmaXgsCisJCQkgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCSAgIHNzaXplX3QgKCpmdW5jKShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICBjaGFyICpidWYpLAorCQkJICAgc3NpemVfdCAoKndyaXRlZnVuYykoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCQljb25zdCBjaGFyICpidWYsCisJCQkJCQlzaXplX3QgbGVuKSwKKwkJCSAgIHU2NCBtYXNrLAorCQkJICAgYm9vbCBnZW5lcmljLAorCQkJICAgc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGxpc3RfaGVhZCAqYXR0cl9saXN0KTsKKworLyogRXZlbnQgaW50ZXJmYWNlIGZsYWdzICovCisjZGVmaW5lIElJT19CVVNZX0JJVF9QT1MgMQorCisjaWZkZWYgQ09ORklHX0lJT19CVUZGRVIKK3N0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdDsKKworaW50IGlpb19jaHJkZXZfYnVmZmVyX29wZW4oc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7Cit2b2lkIGlpb19jaHJkZXZfYnVmZmVyX3JlbGVhc2Uoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKK3Vuc2lnbmVkIGludCBpaW9fYnVmZmVyX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCk7Citzc2l6ZV90IGlpb19idWZmZXJfcmVhZF9maXJzdF9uX291dGVyKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgICAgIHNpemVfdCBuLCBsb2ZmX3QgKmZfcHMpOworCisKKyNkZWZpbmUgaWlvX2J1ZmZlcl9wb2xsX2FkZHIgKCZpaW9fYnVmZmVyX3BvbGwpCisjZGVmaW5lIGlpb19idWZmZXJfcmVhZF9maXJzdF9uX291dGVyX2FkZHIgKCZpaW9fYnVmZmVyX3JlYWRfZmlyc3Rfbl9vdXRlcikKKworI2Vsc2UKKworc3RhdGljIGlubGluZSBpbnQgaWlvX2NocmRldl9idWZmZXJfb3BlbihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaWlvX2NocmRldl9idWZmZXJfcmVsZWFzZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQore30KKworI2RlZmluZSBpaW9fYnVmZmVyX3BvbGxfYWRkciBOVUxMCisjZGVmaW5lIGlpb19idWZmZXJfcmVhZF9maXJzdF9uX291dGVyX2FkZHIgTlVMTAorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19jb3JlX3RyaWdnZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaWlvX2NvcmVfdHJpZ2dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyM2MyODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19jb3JlX3RyaWdnZXIuaApAQCAtMCwwICsxLDQ3IEBACisKKy8qIFRoZSBpbmR1c3RyaWFsIEkvTyBjb3JlLCB0cmlnZ2VyIGNvbnN1bWVyIGhhbmRsaW5nIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBKb25hdGhhbiBDYW1lcm9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZkZWYgQ09ORklHX0lJT19UUklHR0VSCisvKioKKyAqIGlpb19kZXZpY2VfcmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcigpIC0gc2V0IHVwIGFuIGlpb19kZXYgdG8gdXNlIHRyaWdnZXJzCisgKiBAaW5kaW9fZGV2OiBpaW9fZGV2IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlIHRoYXQgd2lsbCBjb25zdW1lIHRoZSB0cmlnZ2VyCisgKiovCisKK2ludCBpaW9fZGV2aWNlX3JlZ2lzdGVyX3RyaWdnZXJfY29uc3VtZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKKy8qKgorICogaWlvX2RldmljZV91bnJlZ2lzdGVyX3RyaWdnZXJfY29uc3VtZXIoKSAtIHJldmVyc2UgdGhlIHJlZ2lzdHJhdGlvbiBwcm9jZXNzCisgKiBAaW5kaW9fZGV2OiBpaW9fZGV2IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlIHRoYXQgY29uc3VtZWQgdGhlIHRyaWdnZXIKKyAqKi8KK3ZvaWQgaWlvX2RldmljZV91bnJlZ2lzdGVyX3RyaWdnZXJfY29uc3VtZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisKKyNlbHNlCisKKy8qKgorICogaWlvX2RldmljZV9yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKCkgLSBzZXQgdXAgYW4gaWlvX2RldiB0byB1c2UgdHJpZ2dlcnMKKyAqIEBpbmRpb19kZXY6IGlpb19kZXYgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZpY2UgdGhhdCB3aWxsIGNvbnN1bWUgdGhlIHRyaWdnZXIKKyAqKi8KK3N0YXRpYyBpbnQgaWlvX2RldmljZV9yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9OworCisvKioKKyAqIGlpb19kZXZpY2VfdW5yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKCkgLSByZXZlcnNlIHRoZSByZWdpc3RyYXRpb24gcHJvY2VzcworICogQGluZGlvX2RldjogaWlvX2RldiBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZSB0aGF0IGNvbnN1bWVkIHRoZSB0cmlnZ2VyCisgKiovCitzdGF0aWMgdm9pZCBpaW9fZGV2aWNlX3VucmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworfTsKKworI2VuZGlmIC8qIENPTkZJR19UUklHR0VSX0NPTlNVTUVSICovCisKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19kdW1teV9ldmdlbi5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9paW9fZHVtbXlfZXZnZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTY1N2QxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9paW9fZHVtbXlfZXZnZW4uYwpAQCAtMCwwICsxLDIxNyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgSm9uYXRoYW4gQ2FtZXJvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQ29tcGFuaW9uIG1vZHVsZSB0byB0aGUgaWlvIHNpbXBsZSBkdW1teSBleGFtcGxlIGRyaXZlci4KKyAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgaXMgdG8gZ2VuZXJhdGUgJ2Zha2UnIGV2ZW50IGludGVycnVwdHMgdGh1cworICogYWxsb3dpbmcgdGhhdCBkcml2ZXIncyBjb2RlIHRvIGJlIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHRoYXQgb2YKKyAqIGEgbm9ybWFsIGRyaXZlciB0YWxraW5nIHRvIGhhcmR3YXJlLiAgVGhlIGFwcHJvYWNoIHVzZWQgaGVyZQorICogaXMgbm90IGludGVuZGVkIHRvIGJlIGdlbmVyYWwgYW5kIGp1c3QgaGFwcGVucyB0byB3b3JrIGZvciB0aGlzCisgKiBwYXJ0aWN1bGFyIHVzZSBjYXNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorCisjaW5jbHVkZSAiaWlvX2R1bW15X2V2Z2VuLmgiCisjaW5jbHVkZSAiaWlvLmgiCisjaW5jbHVkZSAic3lzZnMuaCIKKworLyogRmlkZGx5IGJpdCBvZiBmYWtpbmcgYW5kIGlycSB3aXRob3V0IGhhcmR3YXJlICovCisjZGVmaW5lIElJT19FVkVOVEdFTl9OTyAxMAorLyoqCisgKiBzdHJ1Y3QgaWlvX2R1bW15X2V2Z2VuIC0gZXZnZW4gc3RhdGUKKyAqIEBjaGlwOiBpcnEgY2hpcCB3ZSBhcmUgZmFraW5nCisgKiBAYmFzZTogYmFzZSBvZiBpcnEgcmFuZ2UKKyAqIEBlbmFibGVkOiBtYXNrIG9mIHdoaWNoIGlycXMgYXJlIGVuYWJsZWQKKyAqIEBpbnVzZTogbWFzayBvZiB3aGljaCBpcnFzIGFjdHVhbGx5IGhhdmUgYW55b25lIGNvbm5lY3RlZAorICogQGxvY2s6IHByb3RlY3QgdGhlIGV2Z2VuIHN0YXRlCisgKi8KK3N0cnVjdCBpaW9fZHVtbXlfZXZlbnRnZW4geworCXN0cnVjdCBpcnFfY2hpcCBjaGlwOworCWludCBiYXNlOworCWJvb2wgZW5hYmxlZFtJSU9fRVZFTlRHRU5fTk9dOworCWJvb2wgaW51c2VbSUlPX0VWRU5UR0VOX05PXTsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKK307CisKKy8qIFdlIGNhbiBvbmx5IGV2ZXIgaGF2ZSBvbmUgaW5zdGFuY2Ugb2YgdGhpcyAnZGV2aWNlJyAqLworc3RhdGljIHN0cnVjdCBpaW9fZHVtbXlfZXZlbnRnZW4gKmlpb19ldmdlbjsKK3N0YXRpYyBjb25zdCBjaGFyICppaW9fZXZnZW5fbmFtZSA9ICJpaW9fZHVtbXlfZXZnZW4iOworCitzdGF0aWMgdm9pZCBpaW9fZHVtbXlfZXZlbnRfaXJxbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwKGQpOworCXN0cnVjdCBpaW9fZHVtbXlfZXZlbnRnZW4gKmV2Z2VuID0KKwkJY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBpaW9fZHVtbXlfZXZlbnRnZW4sIGNoaXApOworCisJZXZnZW4tPmVuYWJsZWRbZC0+aXJxIC0gZXZnZW4tPmJhc2VdID0gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIGlpb19kdW1teV9ldmVudF9pcnF1bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcChkKTsKKwlzdHJ1Y3QgaWlvX2R1bW15X2V2ZW50Z2VuICpldmdlbiA9CisJCWNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgaWlvX2R1bW15X2V2ZW50Z2VuLCBjaGlwKTsKKworCWV2Z2VuLT5lbmFibGVkW2QtPmlycSAtIGV2Z2VuLT5iYXNlXSA9IHRydWU7Cit9CisKK3N0YXRpYyBpbnQgaWlvX2R1bW15X2V2Z2VuX2NyZWF0ZSh2b2lkKQoreworCWludCByZXQsIGk7CisKKwlpaW9fZXZnZW4gPSBremFsbG9jKHNpemVvZigqaWlvX2V2Z2VuKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGlpb19ldmdlbiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlpb19ldmdlbi0+YmFzZSA9IGlycV9hbGxvY19kZXNjcygtMSwgMCwgSUlPX0VWRU5UR0VOX05PLCAwKTsKKwlpZiAoaWlvX2V2Z2VuLT5iYXNlIDwgMCkgeworCQlyZXQgPSBpaW9fZXZnZW4tPmJhc2U7CisJCWtmcmVlKGlpb19ldmdlbik7CisJCXJldHVybiByZXQ7CisJfQorCWlpb19ldmdlbi0+Y2hpcC5uYW1lID0gaWlvX2V2Z2VuX25hbWU7CisJaWlvX2V2Z2VuLT5jaGlwLmlycV9tYXNrID0gJmlpb19kdW1teV9ldmVudF9pcnFtYXNrOworCWlpb19ldmdlbi0+Y2hpcC5pcnFfdW5tYXNrID0gJmlpb19kdW1teV9ldmVudF9pcnF1bm1hc2s7CisJZm9yIChpID0gMDsgaSA8IElJT19FVkVOVEdFTl9OTzsgaSsrKSB7CisJCWlycV9zZXRfY2hpcChpaW9fZXZnZW4tPmJhc2UgKyBpLCAmaWlvX2V2Z2VuLT5jaGlwKTsKKwkJaXJxX3NldF9oYW5kbGVyKGlpb19ldmdlbi0+YmFzZSArIGksICZoYW5kbGVfc2ltcGxlX2lycSk7CisJCWlycV9tb2RpZnlfc3RhdHVzKGlpb19ldmdlbi0+YmFzZSArIGksCisJCQkJICBJUlFfTk9SRVFVRVNUIHwgSVJRX05PQVVUT0VOLAorCQkJCSAgSVJRX05PUFJPQkUpOworCX0KKwltdXRleF9pbml0KCZpaW9fZXZnZW4tPmxvY2spOworCXJldHVybiAwOworfQorCisvKioKKyAqIGlpb19kdW1teV9ldmdlbl9nZXRfaXJxKCkgLSBnZXQgYW4gZXZnZW4gcHJvdmlkZWQgaXJxIGZvciBhIGRldmljZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBnaXZlIGEgZnJlZSBhbGxvY2F0ZWQgaXJxIHRvIGEgY2xpZW50IGRldmljZS4KKyAqIFRoYXQgaXJxIGNhbiB0aGVuIGJlIGNhdXNlZCB0byAnZmlyZScgYnkgdXNpbmcgdGhlIGFzc29jaWF0ZWQgc3lzZnMgZmlsZS4KKyAqLworaW50IGlpb19kdW1teV9ldmdlbl9nZXRfaXJxKHZvaWQpCit7CisJaW50IGksIHJldCA9IDA7CisJbXV0ZXhfbG9jaygmaWlvX2V2Z2VuLT5sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgSUlPX0VWRU5UR0VOX05POyBpKyspCisJCWlmIChpaW9fZXZnZW4tPmludXNlW2ldID09IGZhbHNlKSB7CisJCQlyZXQgPSBpaW9fZXZnZW4tPmJhc2UgKyBpOworCQkJaWlvX2V2Z2VuLT5pbnVzZVtpXSA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCW11dGV4X3VubG9jaygmaWlvX2V2Z2VuLT5sb2NrKTsKKwlpZiAoaSA9PSBJSU9fRVZFTlRHRU5fTk8pCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpaW9fZHVtbXlfZXZnZW5fZ2V0X2lycSk7CisKKy8qKgorICogaWlvX2R1bW15X2V2Z2VuX3JlbGVhc2VfaXJxKCkgLSBnaXZlIHRoZSBpcnEgYmFjay4KKyAqIEBpcnE6IGlycSBiZWluZyByZXR1cm5lZCB0byB0aGUgcG9vbAorICoKKyAqIFVzZWQgYnkgY2xpZW50IGRyaXZlciBpbnN0YW5jZXMgdG8gZ2l2ZSB0aGUgaXJxcyBiYWNrIHdoZW4gdGhleSBkaXNjb25uZWN0CisgKi8KK2ludCBpaW9fZHVtbXlfZXZnZW5fcmVsZWFzZV9pcnEoaW50IGlycSkKK3sKKwltdXRleF9sb2NrKCZpaW9fZXZnZW4tPmxvY2spOworCWlpb19ldmdlbi0+aW51c2VbaXJxIC0gaWlvX2V2Z2VuLT5iYXNlXSA9IGZhbHNlOworCW11dGV4X3VubG9jaygmaWlvX2V2Z2VuLT5sb2NrKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWlvX2R1bW15X2V2Z2VuX3JlbGVhc2VfaXJxKTsKKworc3RhdGljIHZvaWQgaWlvX2R1bW15X2V2Z2VuX2ZyZWUodm9pZCkKK3sKKwlpcnFfZnJlZV9kZXNjcyhpaW9fZXZnZW4tPmJhc2UsIElJT19FVkVOVEdFTl9OTyk7CisJa2ZyZWUoaWlvX2V2Z2VuKTsKK30KKworc3RhdGljIHZvaWQgaWlvX2V2Z2VuX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlpb19kdW1teV9ldmdlbl9mcmVlKCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGlpb19ldmdlbl9wb2tlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgY29uc3QgY2hhciAqYnVmLAorCQkJICAgICAgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlpZiAoaWlvX2V2Z2VuLT5lbmFibGVkW3RoaXNfYXR0ci0+YWRkcmVzc10pCisJCWhhbmRsZV9uZXN0ZWRfaXJxKGlpb19ldmdlbi0+YmFzZSArIHRoaXNfYXR0ci0+YWRkcmVzcyk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHBva2VfZXYwLCBTX0lXVVNSLCBOVUxMLCAmaWlvX2V2Z2VuX3Bva2UsIDApOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihwb2tlX2V2MSwgU19JV1VTUiwgTlVMTCwgJmlpb19ldmdlbl9wb2tlLCAxKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIocG9rZV9ldjIsIFNfSVdVU1IsIE5VTEwsICZpaW9fZXZnZW5fcG9rZSwgMik7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHBva2VfZXYzLCBTX0lXVVNSLCBOVUxMLCAmaWlvX2V2Z2VuX3Bva2UsIDMpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihwb2tlX2V2NCwgU19JV1VTUiwgTlVMTCwgJmlpb19ldmdlbl9wb2tlLCA0KTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIocG9rZV9ldjUsIFNfSVdVU1IsIE5VTEwsICZpaW9fZXZnZW5fcG9rZSwgNSk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHBva2VfZXY2LCBTX0lXVVNSLCBOVUxMLCAmaWlvX2V2Z2VuX3Bva2UsIDYpOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihwb2tlX2V2NywgU19JV1VTUiwgTlVMTCwgJmlpb19ldmdlbl9wb2tlLCA3KTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIocG9rZV9ldjgsIFNfSVdVU1IsIE5VTEwsICZpaW9fZXZnZW5fcG9rZSwgOCk7CitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKHBva2VfZXY5LCBTX0lXVVNSLCBOVUxMLCAmaWlvX2V2Z2VuX3Bva2UsIDkpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaWlvX2V2Z2VuX2F0dHJzW10gPSB7CisJJmlpb19kZXZfYXR0cl9wb2tlX2V2MC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcG9rZV9ldjEuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Bva2VfZXYyLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9wb2tlX2V2My5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcG9rZV9ldjQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Bva2VfZXY1LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9wb2tlX2V2Ni5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfcG9rZV9ldjcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX3Bva2VfZXY4LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9wb2tlX2V2OS5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpaW9fZXZnZW5fZ3JvdXAgPSB7CisJLmF0dHJzID0gaWlvX2V2Z2VuX2F0dHJzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmlpb19ldmdlbl9ncm91cHNbXSA9IHsKKwkmaWlvX2V2Z2VuX2dyb3VwLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlIGlpb19ldmdlbl9kZXYgPSB7CisJLmJ1cyA9ICZpaW9fYnVzX3R5cGUsCisJLmdyb3VwcyA9IGlpb19ldmdlbl9ncm91cHMsCisJLnJlbGVhc2UgPSAmaWlvX2V2Z2VuX3JlbGVhc2UsCit9Oworc3RhdGljIF9faW5pdCBpbnQgaWlvX2R1bW15X2V2Z2VuX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gaWlvX2R1bW15X2V2Z2VuX2NyZWF0ZSgpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWRldmljZV9pbml0aWFsaXplKCZpaW9fZXZnZW5fZGV2KTsKKwlkZXZfc2V0X25hbWUoJmlpb19ldmdlbl9kZXYsICJpaW9fZXZnZW4iKTsKKwlyZXR1cm4gZGV2aWNlX2FkZCgmaWlvX2V2Z2VuX2Rldik7Cit9Cittb2R1bGVfaW5pdChpaW9fZHVtbXlfZXZnZW5faW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBpaW9fZHVtbXlfZXZnZW5fZXhpdCh2b2lkKQoreworCWRldmljZV91bnJlZ2lzdGVyKCZpaW9fZXZnZW5fZGV2KTsKK30KK21vZHVsZV9leGl0KGlpb19kdW1teV9ldmdlbl9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiSm9uYXRoYW4gQ2FtZXJvbiA8amljMjNAY2FtLmFjLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJSU8gZHVtbXkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19kdW1teV9ldmdlbi5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9paW9fZHVtbXlfZXZnZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODg0NWUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9paW9fZHVtbXlfZXZnZW4uaApAQCAtMCwwICsxLDIgQEAKK2ludCBpaW9fZHVtbXlfZXZnZW5fZ2V0X2lycSh2b2lkKTsKK2ludCBpaW9fZHVtbXlfZXZnZW5fcmVsZWFzZV9pcnEoaW50IGlycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19zaW1wbGVfZHVtbXkuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaWlvX3NpbXBsZV9kdW1teS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMGM5OTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19zaW1wbGVfZHVtbXkuYwpAQCAtMCwwICsxLDU0NSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgSm9uYXRoYW4gQ2FtZXJvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQSByZWZlcmVuY2UgaW5kdXN0cmlhbCBJL08gZHJpdmVyIHRvIGlsbHVzdHJhdGUgdGhlIGZ1bmN0aW9uYWxpdHkgYXZhaWxhYmxlLgorICoKKyAqIFRoZXJlIGFyZSBudW1lcm91cyByZWFsIGRyaXZlcnMgdG8gaWxsdXN0cmF0ZSB0aGUgZmluZXIgcG9pbnRzLgorICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBkcml2ZXIgaXMgdG8gcHJvdmlkZSBhIGRyaXZlciB3aXRoIGZhciBtb3JlIGNvbW1lbnRzCisgKiBhbmQgZXhwbGFuYXRvcnkgbm90ZXMgdGhhbiBhbnkgJ3JlYWwnIGRyaXZlciB3b3VsZCBoYXZlLgorICogQW55b25lIHN0YXJ0aW5nIG91dCB3cml0aW5nIGFuIElJTyBkcml2ZXIgc2hvdWxkIGZpcnN0IG1ha2Ugc3VyZSB0aGV5CisgKiB1bmRlcnN0YW5kIGFsbCBvZiB0aGlzIGRyaXZlciBleGNlcHQgdGhvc2UgYml0cyBzcGVjaWZpY2FsbHkgbWFya2VkCisgKiBhcyBiZWluZyBwcmVzZW50IHRvIGFsbG93IHVzIHRvICdmYWtlJyB0aGUgcHJlc2VuY2Ugb2YgaGFyZHdhcmUuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKworI2luY2x1ZGUgImlpby5oIgorI2luY2x1ZGUgInN5c2ZzLmgiCisjaW5jbHVkZSAiYnVmZmVyX2dlbmVyaWMuaCIKKyNpbmNsdWRlICJpaW9fc2ltcGxlX2R1bW15LmgiCisKKy8qCisgKiBBIGZldyBlbGVtZW50cyBuZWVkZWQgdG8gZmFrZSBhIGJ1cyBmb3IgdGhpcyBkcml2ZXIKKyAqIE5vdGUgaW5zdGFuY2VzIHBhcm1ldGVyIGNvbnRyb2xzIGhvdyBtYW55IG9mIHRoZXNlCisgKiBkdW1teSBkZXZpY2VzIGFyZSByZWdpc3RlcmVkLgorICovCitzdGF0aWMgdW5zaWduZWQgaW5zdGFuY2VzID0gMTsKK21vZHVsZV9wYXJhbShpbnN0YW5jZXMsIGludCwgMCk7CisKKy8qIFBvaW50ZXIgYXJyYXkgdXNlZCB0byBmYWtlIGJ1cyBlbGVtZW50cyAqLworc3RhdGljIHN0cnVjdCBpaW9fZGV2ICoqaWlvX2R1bW15X2RldnM7CisKKy8qIEZha2UgYSBuYW1lIGZvciB0aGUgcGFydCBudW1iZXIsIHVzdWFsbHkgb2J0YWluZWQgZnJvbSB0aGUgaWQgdGFibGUgKi8KK3N0YXRpYyBjb25zdCBjaGFyICppaW9fZHVtbXlfcGFydF9udW1iZXIgPSAiaWlvX2R1bW15X3BhcnRfbm8iOworCisvKioKKyAqIHN0cnVjdCBpaW9fZHVtbXlfYWNjZWxfY2FsaWJzY2FsZSAtIHJlYWx3b3JsZCB0byByZWdpc3RlciBtYXBwaW5nCisgKiBAdmFsOiBmaXJzdCB2YWx1ZSBpbiByZWFkX3JhdyAtIGhlcmUgaW50ZWdlciBwYXJ0LgorICogQHZhbDI6IHNlY29uZCB2YWx1ZSBpbiByZWFkX3JhdyBldGMgLSBoZXJlIG1pY3JvIHBhcnQuCisgKiBAcmVndmFsOiByZWdpc3RlciB2YWx1ZSAtIG1hZ2ljIGRldmljZSBzcGVjaWZpYyBudW1iZXJzLgorICovCitzdHJ1Y3QgaWlvX2R1bW15X2FjY2VsX2NhbGlic2NhbGUgeworCWludCB2YWw7CisJaW50IHZhbDI7CisJaW50IHJlZ3ZhbDsgLyogd2hhdCB3b3VsZCBiZSB3cml0dGVuIHRvIGhhcmR3YXJlICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19kdW1teV9hY2NlbF9jYWxpYnNjYWxlIGR1bW15X3NjYWxlc1tdID0geworCXsgMCwgMTAwLCAweDggfSwgLyogMC4wMDAxMDAgKi8KKwl7IDAsIDEzMywgMHg3IH0sIC8qIDAuMDAwMTMzICovCisJeyA3MzMsIDEzLCAweDkgfSwgLyogNzMzLjAwMDEzICovCit9OworCisvKgorICogaWlvX2R1bW15X2NoYW5uZWxzIC0gRGVzY3JpcHRpb24gb2YgYXZhaWxhYmxlIGNoYW5uZWxzCisgKgorICogVGhpcyBhcnJheSBvZiBzdHJ1Y3R1cmVzIHRlbGxzIHRoZSBJSU8gY29yZSBhYm91dCB3aGF0IHRoZSBkZXZpY2UKKyAqIGFjdHVhbGx5IHByb3ZpZGVzIGZvciBhIGdpdmVuIGNoYW5uZWwuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBpaW9fZHVtbXlfY2hhbm5lbHNbXSA9IHsKKwkvKiBpbmRleGVkIEFEQyBjaGFubmVsIGluX3ZvbHRhZ2UwX3JhdyBldGMgKi8KKwl7CisJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCS8qIENoYW5uZWwgaGFzIGEgbnVtZXJpYyBpbmRleCBvZiAwICovCisJCS5pbmRleGVkID0gMSwKKwkJLmNoYW5uZWwgPSAwLAorCQkvKiBXaGF0IG90aGVyIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZT8gKi8KKwkJLmluZm9fbWFzayA9CisJCS8qCisJCSAqIGluX3ZvbHRhZ2UwX29mZnNldAorCQkgKiBPZmZzZXQgZm9yIHVzZXJzcGFjZSB0byBhcHBseSBwcmlvciB0byBzY2FsZQorCQkgKiB3aGVuIGNvbnZlcnRpbmcgdG8gc3RhbmRhcmQgdW5pdHMgKG1pY3Jvdm9sdHMpCisJCSAqLworCQkoMSA8PCBJSU9fQ0hBTl9JTkZPX09GRlNFVF9TRVBBUkFURSkgfAorCQkvKgorCQkgKiBpbl92b2x0YWdlMF9zY2FsZQorCQkgKiBNdWx0aXBsZXIgZm9yIHVzZXJzcGFjZSB0byBhcHBseSBwb3N0IG9mZnNldAorCQkgKiB3aGVuIGNvbnZlcnRpbmcgdG8gc3RhbmRhcmQgdW5pdHMgKG1pY3Jvdm9sdHMpCisJCSAqLworCQkoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwKKwkJLyogVGhlIG9yZGVyaW5nIG9mIGVsZW1lbnRzIGluIHRoZSBidWZmZXIgdmlhIGFuIGVudW0gKi8KKwkJLnNjYW5faW5kZXggPSB2b2x0YWdlMCwKKwkJLnNjYW5fdHlwZSA9IHsgLyogRGVzY3JpcHRpb24gb2Ygc3RvcmFnZSBpbiBidWZmZXIgKi8KKwkJCS5zaWduID0gJ3UnLCAvKiB1bnNpZ25lZCAqLworCQkJLnJlYWxiaXRzID0gMTMsIC8qIDEzIGJpdHMgKi8KKwkJCS5zdG9yYWdlYml0cyA9IDE2LCAvKiAxNiBiaXRzIHVzZWQgZm9yIHN0b3JhZ2UgKi8KKwkJCS5zaGlmdCA9IDAsIC8qIHplcm8gc2hpZnQgKi8KKwkJfSwKKyNpZmRlZiBDT05GSUdfSUlPX1NJTVBMRV9EVU1NWV9FVkVOVFMKKwkJLyoKKwkJICogc2ltcGxlIGV2ZW50IC0gdHJpZ2dlcmVkIHdoZW4gdmFsdWUgcmlzZXMgYWJvdmUKKwkJICogYSB0aHJlc2hvbGQKKwkJICovCisJCS5ldmVudF9tYXNrID0gSUlPX0VWX0JJVChJSU9fRVZfVFlQRV9USFJFU0gsCisJCQkJCSBJSU9fRVZfRElSX1JJU0lORyksCisjZW5kaWYgLyogQ09ORklHX0lJT19TSU1QTEVfRFVNTVlfRVZFTlRTICovCisJfSwKKwkvKiBEaWZmZXJlbnRpYWwgQURDIGNoYW5uZWwgaW5fdm9sdGFnZTEtdm9sdGFnZTJfcmF3IGV0YyovCisJeworCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkuZGlmZmVyZW50aWFsID0gMSwKKwkJLyoKKwkJICogSW5kZXhpbmcgZm9yIGRpZmZlcmVudGlhbCBjaGFubmVscyB1c2VzIGNoYW5uZWwKKwkJICogZm9yIHRoZSBwb3NpdGl2ZSBwYXJ0LCBjaGFubmVsMiBmb3IgdGhlIG5lZ2F0aXZlLgorCQkgKi8KKwkJLmluZGV4ZWQgPSAxLAorCQkuY2hhbm5lbCA9IDEsCisJCS5jaGFubmVsMiA9IDIsCisJCS5pbmZvX21hc2sgPQorCQkvKgorCQkgKiBpbl92b2x0YWdlLXZvbHRhZ2Vfc2NhbGUKKwkJICogU2hhcmVkIHZlcnNpb24gb2Ygc2NhbGUgLSBzaGFyZWQgYnkgZGlmZmVyZW50aWFsCisJCSAqIGlucHV0IGNoYW5uZWxzIG9mIHR5cGUgSUlPX1ZPTFRBR0UuCisJCSAqLworCQkoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCisJCS5zY2FuX2luZGV4ID0gZGlmZnZvbHRhZ2UxbTIsCisJCS5zY2FuX3R5cGUgPSB7IC8qIERlc2NyaXB0aW9uIG9mIHN0b3JhZ2UgaW4gYnVmZmVyICovCisJCQkuc2lnbiA9ICdzJywgLyogc2lnbmVkICovCisJCQkucmVhbGJpdHMgPSAxMiwgLyogMTIgYml0cyAqLworCQkJLnN0b3JhZ2ViaXRzID0gMTYsIC8qIDE2IGJpdHMgdXNlZCBmb3Igc3RvcmFnZSAqLworCQkJLnNoaWZ0ID0gMCwgLyogemVybyBzaGlmdCAqLworCQl9LAorCX0sCisJLyogRGlmZmVyZW50aWFsIEFEQyBjaGFubmVsIGluX3ZvbHRhZ2UzLXZvbHRhZ2U0X3JhdyBldGMqLworCXsKKwkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJLmRpZmZlcmVudGlhbCA9IDEsCisJCS5pbmRleGVkID0gMSwKKwkJLmNoYW5uZWwgPSAzLAorCQkuY2hhbm5lbDIgPSA0LAorCQkuaW5mb19tYXNrID0KKwkJKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkuc2Nhbl9pbmRleCA9IGRpZmZ2b2x0YWdlM200LAorCQkuc2Nhbl90eXBlID0geworCQkJLnNpZ24gPSAncycsCisJCQkucmVhbGJpdHMgPSAxMSwKKwkJCS5zdG9yYWdlYml0cyA9IDE2LAorCQkJLnNoaWZ0ID0gMCwKKwkJfSwKKwl9LAorCS8qCisJICogJ21vZGlmaWVkJyAoaS5lLiBheGlzIHNwZWNpZmllZCkgYWNjZWxlcmF0aW9uIGNoYW5uZWwKKwkgKiBpbl9hY2NlbF96X3JhdworCSAqLworCXsKKwkJLnR5cGUgPSBJSU9fQUNDRUwsCisJCS5tb2RpZmllZCA9IDEsCisJCS8qIENoYW5uZWwgMiBpcyB1c2UgZm9yIG1vZGlmaWVycyAqLworCQkuY2hhbm5lbDIgPSBJSU9fTU9EX1gsCisJCS5pbmZvX21hc2sgPQorCQkvKgorCQkgKiBJbnRlcm5hbCBiaWFzIGNvcnJlY3Rpb24gdmFsdWUuIEFwcGxpZWQKKwkJICogYnkgdGhlIGhhcmR3YXJlIG9yIGRyaXZlciBwcmlvciB0byB1c2Vyc3BhY2UKKwkJICogc2VlaW5nIHRoZSByZWFkaW5ncy4gVHlwaWNhbGx5IHBhcnQgb2YgaGFyZHdhcmUKKwkJICogY2FsaWJyYXRpb24uCisJCSAqLworCQkoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSksCisJCS5zY2FuX2luZGV4ID0gYWNjZWx4LAorCQkuc2Nhbl90eXBlID0geyAvKiBEZXNjcmlwdGlvbiBvZiBzdG9yYWdlIGluIGJ1ZmZlciAqLworCQkJLnNpZ24gPSAncycsIC8qIHNpZ25lZCAqLworCQkJLnJlYWxiaXRzID0gMTYsIC8qIDEyIGJpdHMgKi8KKwkJCS5zdG9yYWdlYml0cyA9IDE2LCAvKiAxNiBiaXRzIHVzZWQgZm9yIHN0b3JhZ2UgKi8KKwkJCS5zaGlmdCA9IDAsIC8qIHplcm8gc2hpZnQgKi8KKwkJfSwKKwl9LAorCS8qCisJICogQ29udmVuaWVuY2UgbWFjcm8gZm9yIHRpbWVzdGFtcHMuIDQgaXMgdGhlIGluZGV4IGluCisJICogdGhlIGJ1ZmZlci4KKwkgKi8KKwlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCg0KSwKKwkvKiBEQUMgY2hhbm5lbCBvdXRfdm9sdGFnZTBfcmF3ICovCisJeworCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkub3V0cHV0ID0gMSwKKwkJLmluZGV4ZWQgPSAxLAorCQkuY2hhbm5lbCA9IDAsCisJfSwKK307CisKKy8qKgorICogaWlvX2R1bW15X3JlYWRfcmF3KCkgLSBkYXRhIHJlYWQgZnVuY3Rpb24uCisgKiBAaW5kaW9fZGV2Ogl0aGUgc3RydWN0IGlpb19kZXYgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV2aWNlIGluc3RhbmNlCisgKiBAY2hhbjoJdGhlIGNoYW5uZWwgd2hvc2UgZGF0YSBpcyB0byBiZSByZWFkCisgKiBAdmFsOglmaXJzdCBlbGVtZW50IG9mIHJldHVybmVkIHZhbHVlICh0eXBpY2FsbHkgSU5UKQorICogQHZhbDI6CXNlY29uZCBlbGVtZW50IG9mIHJldHVybmVkIHZhbHVlICh0eXBpY2FsbHkgTUlDUk8pCisgKiBAbWFzazoJd2hhdCB3ZSBhY3R1YWxseSB3YW50IHRvIHJlYWQuIDAgaXMgdGhlIGNoYW5uZWwsIGV2ZXJ5dGhpbmcgZWxzZQorICoJCWlzIGFzIHBlciB0aGUgaW5mb19tYXNrIGluIGlpb19jaGFuX3NwZWMuCisgKi8KK3N0YXRpYyBpbnQgaWlvX2R1bW15X3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICAgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCSAgICAgIGludCAqdmFsLAorCQkJICAgICAgaW50ICp2YWwyLAorCQkJICAgICAgbG9uZyBtYXNrKQoreworCXN0cnVjdCBpaW9fZHVtbXlfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIDA6IC8qIG1hZ2ljIHZhbHVlIC0gY2hhbm5lbCB2YWx1ZSByZWFkICovCisJCXN3aXRjaCAoY2hhbi0+dHlwZSkgeworCQljYXNlIElJT19WT0xUQUdFOgorCQkJaWYgKGNoYW4tPm91dHB1dCkgeworCQkJCS8qIFNldCBpbnRlZ2VyIHBhcnQgdG8gY2FjaGVkIHZhbHVlICovCisJCQkJKnZhbCA9IHN0LT5kYWNfdmFsOworCQkJCXJldCA9IElJT19WQUxfSU5UOworCQkJfSBlbHNlIGlmIChjaGFuLT5kaWZmZXJlbnRpYWwpIHsKKwkJCQlpZiAoY2hhbi0+Y2hhbm5lbCA9PSAxKQorCQkJCQkqdmFsID0gc3QtPmRpZmZlcmVudGlhbF9hZGNfdmFsWzBdOworCQkJCWVsc2UKKwkJCQkJKnZhbCA9IHN0LT5kaWZmZXJlbnRpYWxfYWRjX3ZhbFsxXTsKKwkJCQlyZXQgPSBJSU9fVkFMX0lOVDsKKwkJCX0gZWxzZSB7CisJCQkJKnZhbCA9IHN0LT5zaW5nbGVfZW5kZWRfYWRjX3ZhbDsKKwkJCQlyZXQgPSBJSU9fVkFMX0lOVDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElJT19BQ0NFTDoKKwkJCSp2YWwgPSBzdC0+YWNjZWxfdmFsOworCQkJcmV0ID0gSUlPX1ZBTF9JTlQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgKDEgPDwgSUlPX0NIQU5fSU5GT19PRkZTRVRfU0VQQVJBVEUpOgorCQkvKiBvbmx5IHNpbmdsZSBlbmRlZCBhZGMgLT4gNyAqLworCQkqdmFsID0gNzsKKwkJcmV0ID0gSUlPX1ZBTF9JTlQ7CisJCWJyZWFrOworCWNhc2UgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TRVBBUkFURSk6CisJCS8qIG9ubHkgc2luZ2xlIGVuZGVkIGFkYyAtPiAwLjAwMTMzMyAqLworCQkqdmFsID0gMDsKKwkJKnZhbDIgPSAxMzMzOworCQlyZXQgPSBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQlicmVhazsKKwljYXNlICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKToKKwkJLyogYWxsIGRpZmZlcmVudGlhbCBhZGMgY2hhbm5lbHMgLT4gMC4wMDAwMDEzNDQgKi8KKwkJKnZhbCA9IDA7CisJCSp2YWwyID0gMTM0NDsKKwkJcmV0ID0gSUlPX1ZBTF9JTlRfUExVU19OQU5POworCQlicmVhazsKKwljYXNlICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NFUEFSQVRFKToKKwkJLyogb25seSB0aGUgYWNjZWxlcmF0aW9uIGF4aXMgLSByZWFkIGZyb20gY2FjaGUgKi8KKwkJKnZhbCA9IHN0LT5hY2NlbF9jYWxpYmJpYXM7CisJCXJldCA9IElJT19WQUxfSU5UOworCQlicmVhazsKKwljYXNlICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJTQ0FMRV9TRVBBUkFURSk6CisJCSp2YWwgPSBzdC0+YWNjZWxfY2FsaWJzY2FsZS0+dmFsOworCQkqdmFsMiA9IHN0LT5hY2NlbF9jYWxpYnNjYWxlLT52YWwyOworCQlyZXQgPSBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBpaW9fZHVtbXlfd3JpdGVfcmF3KCkgLSBkYXRhIHdyaXRlIGZ1bmN0aW9uLgorICogQGluZGlvX2RldjoJdGhlIHN0cnVjdCBpaW9fZGV2IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRldmljZSBpbnN0YW5jZQorICogQGNoYW46CXRoZSBjaGFubmVsIHdob3NlIGRhdGEgaXMgdG8gYmUgcmVhZAorICogQHZhbDoJZmlyc3QgZWxlbWVudCBvZiByZXR1cm5lZCB2YWx1ZSAodHlwaWNhbGx5IElOVCkKKyAqIEB2YWwyOglzZWNvbmQgZWxlbWVudCBvZiByZXR1cm5lZCB2YWx1ZSAodHlwaWNhbGx5IE1JQ1JPKQorICogQG1hc2s6CXdoYXQgd2UgYWN0dWFsbHkgd2FudCB0byByZWFkLiAwIGlzIHRoZSBjaGFubmVsLCBldmVyeXRoaW5nIGVsc2UKKyAqCQlpcyBhcyBwZXIgdGhlIGluZm9fbWFzayBpbiBpaW9fY2hhbl9zcGVjLgorICoKKyAqIE5vdGUgdGhhdCBhbGwgcmF3IHdyaXRlcyBhcmUgYXNzdW1lZCBJSU9fVkFMX0lOVCBhbmQgaW5mbyBtYXNrIGVsZW1lbnRzCisgKiBhcmUgYXNzdW1lZCB0byBiZSBJSU9fSU5UX1BMVVNfTUlDUk8gdW5sZXNzIHRoZSBjYWxsYmFjayB3cml0ZV9yYXdfZ2V0X2ZtdAorICogaW4gc3RydWN0IGlpb19pbmZvIGlzIHByb3ZpZGVkIGJ5IHRoZSBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbnQgaWlvX2R1bW15X3dyaXRlX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgICAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgICAgIGludCB2YWwsCisJCQkgICAgICAgaW50IHZhbDIsCisJCQkgICAgICAgbG9uZyBtYXNrKQoreworCWludCBpOworCWludCByZXQgPSAwOworCXN0cnVjdCBpaW9fZHVtbXlfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgMDoKKwkJaWYgKGNoYW4tPm91dHB1dCA9PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogTG9ja2luZyBub3QgcmVxdWlyZWQgYXMgd3JpdGluZyBzaW5nbGUgdmFsdWUgKi8KKwkJbXV0ZXhfbG9jaygmc3QtPmxvY2spOworCQlzdC0+ZGFjX3ZhbCA9IHZhbDsKKwkJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisJCXJldHVybiAwOworCWNhc2UgKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQkJJQVNfU0VQQVJBVEUpOgorCQltdXRleF9sb2NrKCZzdC0+bG9jayk7CisJCS8qIENvbXBhcmUgYWdhaW5zdCB0YWJsZSAtIGhhcmQgbWF0Y2hpbmcgaGVyZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkdW1teV9zY2FsZXMpOyBpKyspCisJCQlpZiAodmFsID09IGR1bW15X3NjYWxlc1tpXS52YWwgJiYKKwkJCSAgICB2YWwyID09IGR1bW15X3NjYWxlc1tpXS52YWwyKQorCQkJCWJyZWFrOworCQlpZiAoaSA9PSBBUlJBWV9TSVpFKGR1bW15X3NjYWxlcykpCisJCQlyZXQgPSAtRUlOVkFMOworCQllbHNlCisJCQlzdC0+YWNjZWxfY2FsaWJzY2FsZSA9ICZkdW1teV9zY2FsZXNbaV07CisJCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCQlyZXR1cm4gcmV0OworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworLyoKKyAqIERldmljZSB0eXBlIHNwZWNpZmljIGluZm9ybWF0aW9uLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGlpb19kdW1teV9pbmZvID0geworCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCisJLnJlYWRfcmF3ID0gJmlpb19kdW1teV9yZWFkX3JhdywKKwkud3JpdGVfcmF3ID0gJmlpb19kdW1teV93cml0ZV9yYXcsCisjaWZkZWYgQ09ORklHX0lJT19TSU1QTEVfRFVNTVlfRVZFTlRTCisJLnJlYWRfZXZlbnRfY29uZmlnID0gJmlpb19zaW1wbGVfZHVtbXlfcmVhZF9ldmVudF9jb25maWcsCisJLndyaXRlX2V2ZW50X2NvbmZpZyA9ICZpaW9fc2ltcGxlX2R1bW15X3dyaXRlX2V2ZW50X2NvbmZpZywKKwkucmVhZF9ldmVudF92YWx1ZSA9ICZpaW9fc2ltcGxlX2R1bW15X3JlYWRfZXZlbnRfdmFsdWUsCisJLndyaXRlX2V2ZW50X3ZhbHVlID0gJmlpb19zaW1wbGVfZHVtbXlfd3JpdGVfZXZlbnRfdmFsdWUsCisjZW5kaWYgLyogQ09ORklHX0lJT19TSU1QTEVfRFVNTVlfRVZFTlRTICovCit9OworCisvKioKKyAqIGlpb19kdW1teV9pbml0X2RldmljZSgpIC0gZGV2aWNlIGluc3RhbmNlIHNwZWNpZmljIGluaXQKKyAqIEBpbmRpb19kZXY6IHRoZSBpaW8gZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqIE1vc3QgZHJpdmVycyBoYXZlIG9uZSBvZiB0aGVzZSB0byBzZXQgdXAgZGVmYXVsdCB2YWx1ZXMsCisgKiByZXNldCB0aGUgZGV2aWNlIHRvIGtub3duIHN0YXRlIGV0Yy4KKyAqLworc3RhdGljIGludCBpaW9fZHVtbXlfaW5pdF9kZXZpY2Uoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3QgaWlvX2R1bW15X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlzdC0+ZGFjX3ZhbCA9IDA7CisJc3QtPnNpbmdsZV9lbmRlZF9hZGNfdmFsID0gNzM7CisJc3QtPmRpZmZlcmVudGlhbF9hZGNfdmFsWzBdID0gMzM7CisJc3QtPmRpZmZlcmVudGlhbF9hZGNfdmFsWzFdID0gLTM0OworCXN0LT5hY2NlbF92YWwgPSAzNDsKKwlzdC0+YWNjZWxfY2FsaWJiaWFzID0gLTc7CisJc3QtPmFjY2VsX2NhbGlic2NhbGUgPSAmZHVtbXlfc2NhbGVzWzBdOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaWlvX2R1bW15X3Byb2JlKCkgLSBkZXZpY2UgaW5zdGFuY2UgcHJvYmUKKyAqIEBpbmRleDogYW4gaWQgbnVtYmVyIGZvciB0aGlzIGluc3RhbmNlLgorICoKKyAqIEFyZ3VtZW50cyBhcmUgYnVzIHR5cGUgc3BlY2lmaWMuCisgKiBJMkM6IGlpb19kdW1teV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorICogICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQorICogU1BJOiBpaW9fZHVtbXlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKKyAqLworc3RhdGljIGludCBfX2RldmluaXQgaWlvX2R1bW15X3Byb2JlKGludCBpbmRleCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CisJc3RydWN0IGlpb19kdW1teV9zdGF0ZSAqc3Q7CisKKwkvKgorCSAqIEFsbG9jYXRlIGFuIElJTyBkZXZpY2UuCisJICoKKwkgKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBhbGwgZ2VuZXJpYyBzdGF0ZQorCSAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UgaW5zdGFuY2UuCisJICogSXQgYWxzbyBoYXMgYSByZWdpb24gKGFjY2Vzc2VkIGJ5IGlpb19wcml2KCkKKwkgKiBmb3IgY2hpcCBzcGVjaWZpYyBzdGF0ZSBpbmZvcm1hdGlvbi4KKwkgKi8KKwlpbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKHNpemVvZigqc3QpKTsKKwlpZiAoaW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCisJc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCW11dGV4X2luaXQoJnN0LT5sb2NrKTsKKworCWlpb19kdW1teV9pbml0X2RldmljZShpbmRpb19kZXYpOworCS8qCisJICogV2l0aCBoYXJkd2FyZTogU2V0IHRoZSBwYXJlbnQgZGV2aWNlLgorCSAqIGluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwkgKiBpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CisJICovCisKKwkgLyoKKwkgKiBNYWtlIHRoZSBpaW9fZGV2IHN0cnVjdCBhdmFpbGFibGUgdG8gcmVtb3ZlIGZ1bmN0aW9uLgorCSAqIEJ1cyBlcXVpdmFsZW50cworCSAqIGkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGluZGlvX2Rldik7CisJICogc3BpX3NldF9kcnZkYXRhKHNwaSwgaW5kaW9fZGV2KTsKKwkgKi8KKwlpaW9fZHVtbXlfZGV2c1tpbmRleF0gPSBpbmRpb19kZXY7CisKKworCS8qCisJICogU2V0IHRoZSBkZXZpY2UgbmFtZS4KKwkgKgorCSAqIFRoaXMgaXMgdHlwaWNhbGx5IGEgcGFydCBudW1iZXIgYW5kIG9idGFpbmVkIGZyb20gdGhlIG1vZHVsZQorCSAqIGlkIHRhYmxlLgorCSAqIGUuZy4gZm9yIGkyYyBhbmQgc3BpOgorCSAqICAgIGluZGlvX2Rldi0+bmFtZSA9IGlkLT5uYW1lOworCSAqICAgIGluZGlvX2Rldi0+bmFtZSA9IHNwaV9nZXRfZGV2aWNlX2lkKHNwaSktPm5hbWU7CisJICovCisJaW5kaW9fZGV2LT5uYW1lID0gaWlvX2R1bW15X3BhcnRfbnVtYmVyOworCisJLyogUHJvdmlkZSBkZXNjcmlwdGlvbiBvZiBhdmFpbGFibGUgY2hhbm5lbHMgKi8KKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gaWlvX2R1bW15X2NoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShpaW9fZHVtbXlfY2hhbm5lbHMpOworCisJLyoKKwkgKiBQcm92aWRlIGRldmljZSB0eXBlIHNwZWNpZmljIGludGVyZmFjZSBmdW5jdGlvbnMgYW5kCisJICogY29uc3RhbnQgZGF0YS4KKwkgKi8KKwlpbmRpb19kZXYtPmluZm8gPSAmaWlvX2R1bW15X2luZm87CisKKwkvKiBTcGVjaWZ5IHRoYXQgZGV2aWNlIHByb3ZpZGVzIHN5c2ZzIHR5cGUgaW50ZXJmYWNlcyAqLworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGlpb19zaW1wbGVfZHVtbXlfZXZlbnRzX3JlZ2lzdGVyKGluZGlvX2Rldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3JfZnJlZV9kZXZpY2U7CisKKwkvKiBDb25maWd1cmUgYnVmZmVyZWQgY2FwdHVyZSBzdXBwb3J0LiAqLworCXJldCA9IGlpb19zaW1wbGVfZHVtbXlfY29uZmlndXJlX2J1ZmZlcihpbmRpb19kZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX3VucmVnaXN0ZXJfZXZlbnRzOworCisJLyoKKwkgKiBSZWdpc3RlciB0aGUgY2hhbm5lbHMgd2l0aCB0aGUgYnVmZmVyLCBidXQgYXZvaWQgdGhlIG91dHB1dAorCSAqIGNoYW5uZWwgYmVpbmcgcmVnaXN0ZXJlZCBieSByZWR1Y2luZyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGJ5IDEuCisJICovCisJcmV0ID0gaWlvX2J1ZmZlcl9yZWdpc3RlcihpbmRpb19kZXYsIGlpb19kdW1teV9jaGFubmVscywgNSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3JfdW5jb25maWd1cmVfYnVmZmVyOworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX3VucmVnaXN0ZXJfYnVmZmVyOworCisJcmV0dXJuIDA7CitlcnJvcl91bnJlZ2lzdGVyX2J1ZmZlcjoKKwlpaW9fYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKK2Vycm9yX3VuY29uZmlndXJlX2J1ZmZlcjoKKwlpaW9fc2ltcGxlX2R1bW15X3VuY29uZmlndXJlX2J1ZmZlcihpbmRpb19kZXYpOworZXJyb3JfdW5yZWdpc3Rlcl9ldmVudHM6CisJaWlvX3NpbXBsZV9kdW1teV9ldmVudHNfdW5yZWdpc3RlcihpbmRpb19kZXYpOworZXJyb3JfZnJlZV9kZXZpY2U6CisJLyogTm90ZSBmcmVlIGRldmljZSBzaG91bGQgb25seSBiZSBjYWxsZWQsIGJlZm9yZSByZWdpc3RyYXRpb24KKwkgKiBoYXMgc3VjY2VlZGVkLiAqLworCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaWlvX2R1bW15X3JlbW92ZSgpIC0gZGV2aWNlIGluc3RhbmNlIHJlbW92YWwgZnVuY3Rpb24KKyAqIEBpbmRleDogZGV2aWNlIGluZGV4LgorICoKKyAqIFBhcmFtZXRlcnMgZm9sbG93IHRob3NlIG9mIGlpb19kdW1teV9wcm9iZSBmb3IgYnVzZXMuCisgKi8KK3N0YXRpYyBpbnQgaWlvX2R1bW15X3JlbW92ZShpbnQgaW5kZXgpCit7CisJaW50IHJldDsKKwkvKgorCSAqIEdldCBhIHBvaW50ZXIgdG8gdGhlIGRldmljZSBpbnN0YW5jZSBpaW9fZGV2IHN0cnVjdHVyZQorCSAqIGZyb20gdGhlIGJ1cyBzdWJzeXN0ZW0uIEUuZy4KKwkgKiBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJICogc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOworCSAqLworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpaW9fZHVtbXlfZGV2c1tpbmRleF07CisKKworCS8qIFVucmVnaXN0ZXIgdGhlIGRldmljZSAqLworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCisJLyogRGV2aWNlIHNwZWNpZmljIGNvZGUgdG8gcG93ZXIgZG93biBldGMgKi8KKworCS8qIEJ1ZmZlcmVkIGNhcHR1cmUgcmVsYXRlZCBjbGVhbnVwICovCisJaWlvX2J1ZmZlcl91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaWlvX3NpbXBsZV9kdW1teV91bmNvbmZpZ3VyZV9idWZmZXIoaW5kaW9fZGV2KTsKKworCXJldCA9IGlpb19zaW1wbGVfZHVtbXlfZXZlbnRzX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JldDsKKworCS8qIEZyZWUgYWxsIHN0cnVjdHVyZXMgKi8KKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKKworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaWlvX2R1bW15X2luaXQoKSAtICBkZXZpY2UgZHJpdmVyIHJlZ2lzdHJhdGlvbgorICoKKyAqIFZhcmllcyBkZXBlbmRpbmcgb24gYnVzIHR5cGUgb2YgdGhlIGRldmljZS4gQXMgdGhlcmUgaXMgbm8gZGV2aWNlCisgKiBoZXJlLCBjYWxsIHByb2JlIGRpcmVjdGx5LiBGb3IgaW5mb3JtYXRpb24gb24gZGV2aWNlIHJlZ2lzdHJhdGlvbgorICogaTJjOgorICogRG9jdW1lbnRhdGlvbi9pMmMvd3JpdGluZy1jbGllbnRzCisgKiBzcGk6CisgKiBEb2N1bWVudGF0aW9uL3NwaS9zcGktc3VtbWFyeQorICovCitzdGF0aWMgX19pbml0IGludCBpaW9fZHVtbXlfaW5pdCh2b2lkKQoreworCWludCBpLCByZXQ7CisJaWYgKGluc3RhbmNlcyA+IDEwKSB7CisJCWluc3RhbmNlcyA9IDE7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBGYWtlIGEgYnVzICovCisJaWlvX2R1bW15X2RldnMgPSBremFsbG9jKHNpemVvZigqaWlvX2R1bW15X2RldnMpKmluc3RhbmNlcywgR0ZQX0tFUk5FTCk7CisJLyogSGVyZSB3ZSBoYXZlIG5vIGFjdHVhbCBkZXZpY2Ugc28gY2FsbCBwcm9iZSAqLworCWZvciAoaSA9IDA7IGkgPCBpbnN0YW5jZXM7IGkrKykgeworCQlyZXQgPSBpaW9fZHVtbXlfcHJvYmUoaSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChpaW9fZHVtbXlfaW5pdCk7CisKKy8qKgorICogaWlvX2R1bW15X2V4aXQoKSAtIGRldmljZSBkcml2ZXIgcmVtb3ZhbAorICoKKyAqIFZhcmllcyBkZXBlbmRpbmcgb24gYnVzIHR5cGUgb2YgdGhlIGRldmljZS4KKyAqIEFzIHRoZXJlIGlzIG5vIGRldmljZSBoZXJlLCBjYWxsIHJlbW92ZSBkaXJlY3RseS4KKyAqLworc3RhdGljIF9fZXhpdCB2b2lkIGlpb19kdW1teV9leGl0KHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGluc3RhbmNlczsgaSsrKQorCQlpaW9fZHVtbXlfcmVtb3ZlKGkpOworCWtmcmVlKGlpb19kdW1teV9kZXZzKTsKK30KK21vZHVsZV9leGl0KGlpb19kdW1teV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiSm9uYXRoYW4gQ2FtZXJvbiA8amljMjNAY2FtLmFjLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJSU8gZHVtbXkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19zaW1wbGVfZHVtbXkuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaWlvX3NpbXBsZV9kdW1teS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOTc1ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19zaW1wbGVfZHVtbXkuaApAQCAtMCwwICsxLDEwOCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgSm9uYXRoYW4gQ2FtZXJvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogSm9pbiB0b2dldGhlciB0aGUgdmFyaW91cyBmdW5jdGlvbmFsaXR5IG9mIGlpb19zaW1wbGVfZHVtbXkgZHJpdmVyCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCitzdHJ1Y3QgaWlvX2R1bW15X2FjY2VsX2NhbGlic2NhbGU7CisKKy8qKgorICogc3RydWN0IGlpb19kdW1teV9zdGF0ZSAtIGRldmljZSBpbnN0YW5jZSBzcGVjaWZpYyBzdGF0ZS4KKyAqIEBkYWNfdmFsOgkJCWNhY2hlIGZvciBkYWMgdmFsdWUKKyAqIEBzaW5nbGVfZW5kZWRfYWRjX3ZhbDoJY2FjaGUgZm9yIHNpbmdsZSBlbmRlZCBhZGMgdmFsdWUKKyAqIEBkaWZmZXJlbnRpYWxfYWRjX3ZhbDoJY2FjaGUgZm9yIGRpZmZlcmVudGlhbCBhZGMgdmFsdWUKKyAqIEBhY2NlbF92YWw6CQkJY2FjaGUgZm9yIGFjY2VsZXJhdGlvbiB2YWx1ZQorICogQGFjY2VsX2NhbGliYmlhczoJCWNhY2hlIGZvciBhY2NlbGVyYXRpb24gY2FsaWJiaWFzCisgKiBAYWNjZWxfY2FsaWJzY2FsZToJCWNhY2hlIGZvciBhY2NlbGVyYXRpb24gY2FsaWJzY2FsZQorICogQGxvY2s6CQkJbG9jayB0byBlbnN1cmUgc3RhdGUgaXMgY29uc2lzdGVudAorICogQGV2ZW50X2lycToJCQlpcnEgbnVtYmVyIGZvciBldmVudCBsaW5lIChmYWtlZCkKKyAqIEBldmVudF92YWw6CQkJY2FjaGUgZm9yIGV2ZW50IHRoZXNob2xkIHZhbHVlCisgKiBAZXZlbnRfZW46CQkJY2FjaGUgb2Ygd2hldGhlciBldmVudCBpcyBlbmFibGVkCisgKi8KK3N0cnVjdCBpaW9fZHVtbXlfc3RhdGUgeworCWludCBkYWNfdmFsOworCWludCBzaW5nbGVfZW5kZWRfYWRjX3ZhbDsKKwlpbnQgZGlmZmVyZW50aWFsX2FkY192YWxbMl07CisJaW50IGFjY2VsX3ZhbDsKKwlpbnQgYWNjZWxfY2FsaWJiaWFzOworCWNvbnN0IHN0cnVjdCBpaW9fZHVtbXlfYWNjZWxfY2FsaWJzY2FsZSAqYWNjZWxfY2FsaWJzY2FsZTsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKyNpZmRlZiBDT05GSUdfSUlPX1NJTVBMRV9EVU1NWV9FVkVOVFMKKwlpbnQgZXZlbnRfaXJxOworCWludCBldmVudF92YWw7CisJYm9vbCBldmVudF9lbjsKKyNlbmRpZiAvKiBDT05GSUdfSUlPX1NJTVBMRV9EVU1NWV9FVkVOVFMgKi8KK307CisKKyNpZmRlZiBDT05GSUdfSUlPX1NJTVBMRV9EVU1NWV9FVkVOVFMKKworc3RydWN0IGlpb19kZXY7CisKK2ludCBpaW9fc2ltcGxlX2R1bW15X3JlYWRfZXZlbnRfY29uZmlnKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkJICAgICAgIHU2NCBldmVudF9jb2RlKTsKKworaW50IGlpb19zaW1wbGVfZHVtbXlfd3JpdGVfZXZlbnRfY29uZmlnKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkJCXU2NCBldmVudF9jb2RlLAorCQkJCQlpbnQgc3RhdGUpOworCitpbnQgaWlvX3NpbXBsZV9kdW1teV9yZWFkX2V2ZW50X3ZhbHVlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkJICAgICAgdTY0IGV2ZW50X2NvZGUsCisJCQkJICAgICAgaW50ICp2YWwpOworCitpbnQgaWlvX3NpbXBsZV9kdW1teV93cml0ZV9ldmVudF92YWx1ZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJCSAgICAgICB1NjQgZXZlbnRfY29kZSwKKwkJCQkgICAgICAgaW50IHZhbCk7CisKK2ludCBpaW9fc2ltcGxlX2R1bW15X2V2ZW50c19yZWdpc3RlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK2ludCBpaW9fc2ltcGxlX2R1bW15X2V2ZW50c191bnJlZ2lzdGVyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOworCisjZWxzZSAvKiBTdHVicyBmb3Igd2hlbiBldmVudHMgYXJlIGRpc2FibGVkIGF0IGNvbXBpbGUgdGltZSAqLworCitzdGF0aWMgaW5saW5lIGludAoraWlvX3NpbXBsZV9kdW1teV9ldmVudHNfcmVnaXN0ZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlyZXR1cm4gMDsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50CitpaW9fc2ltcGxlX2R1bW15X2V2ZW50c191bnJlZ2lzdGVyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9OworCisjZW5kaWYgLyogQ09ORklHX0lJT19TSU1QTEVfRFVNTVlfRVZFTlRTKi8KKworLyoqCisgKiBlbnVtIGlpb19zaW1wbGVfZHVtbXlfc2Nhbl9lbGVtZW50cyAtIHNjYW4gaW5kZXggZW51bQorICogQHZvbHRhZ2UwOgkJdGhlIHNpbmdsZSBlbmRlZCB2b2x0YWdlIGNoYW5uZWwKKyAqIEBkaWZmdm9sdGFnZTFtMjoJZmlyc3QgZGlmZmVyZW50aWFsIGNoYW5uZWwKKyAqIEBkaWZmdm9sdGFnZTNtNDoJc2Vjb25kIGRpZmZlcmVuaWFsIGNoYW5uZWwKKyAqIEBhY2NlbHg6CQlhY2NlbGVyYXRpb24gY2hhbm5lbAorICoKKyAqIEVudW0gcHJvdmlkZXMgY29udmVuaWVudCBudW1iZXJpbmcgZm9yIHRoZSBzY2FuIGluZGV4LgorICovCitlbnVtIGlpb19zaW1wbGVfZHVtbXlfc2Nhbl9lbGVtZW50cyB7CisJdm9sdGFnZTAsCisJZGlmZnZvbHRhZ2UxbTIsCisJZGlmZnZvbHRhZ2UzbTQsCisJYWNjZWx4LAorfTsKKworI2lmZGVmIENPTkZJR19JSU9fU0lNUExFX0RVTU1ZX0JVRkZFUgoraW50IGlpb19zaW1wbGVfZHVtbXlfY29uZmlndXJlX2J1ZmZlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK3ZvaWQgaWlvX3NpbXBsZV9kdW1teV91bmNvbmZpZ3VyZV9idWZmZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgaWlvX3NpbXBsZV9kdW1teV9jb25maWd1cmVfYnVmZmVyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJcmV0dXJuIDA7Cit9Oworc3RhdGljIGlubGluZQordm9pZCBpaW9fc2ltcGxlX2R1bW15X3VuY29uZmlndXJlX2J1ZmZlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQore307CisjZW5kaWYgLyogQ09ORklHX0lJT19TSU1QTEVfRFVNTVlfQlVGRkVSICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19zaW1wbGVfZHVtbXlfYnVmZmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19zaW1wbGVfZHVtbXlfYnVmZmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiMzZkMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaWlvX3NpbXBsZV9kdW1teV9idWZmZXIuYwpAQCAtMCwwICsxLDIwNiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgSm9uYXRoYW4gQ2FtZXJvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogQnVmZmVyIGhhbmRsaW5nIGVsZW1lbnRzIG9mIGluZHVzdHJpYWwgSS9PIHJlZmVyZW5jZSBkcml2ZXIuCisgKiBVc2VzIHRoZSBrZmlmbyBidWZmZXIuCisgKgorICogVG8gdGVzdCB3aXRob3V0IGhhcmR3YXJlIHVzZSB0aGUgc3lzZnMgdHJpZ2dlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgorCisjaW5jbHVkZSAiaWlvLmgiCisjaW5jbHVkZSAidHJpZ2dlcl9jb25zdW1lci5oIgorI2luY2x1ZGUgImtmaWZvX2J1Zi5oIgorCisjaW5jbHVkZSAiaWlvX3NpbXBsZV9kdW1teS5oIgorCisvKiBTb21lIGZha2UgZGF0YSAqLworCitzdGF0aWMgY29uc3QgczE2IGZha2VkYXRhW10gPSB7CisJW3ZvbHRhZ2UwXSA9IDcsCisJW2RpZmZ2b2x0YWdlMW0yXSA9IC0zMywKKwlbZGlmZnZvbHRhZ2UzbTRdID0gLTIsCisJW2FjY2VseF0gPSAzNDQsCit9OworLyoqCisgKiBpaW9fc2ltcGxlX2R1bW15X3RyaWdnZXJfaCgpIC0gdGhlIHRyaWdnZXIgaGFuZGxlciBmdW5jdGlvbgorICogQGlycTogdGhlIGludGVycnVwdCBudW1iZXIKKyAqIEBwOiBwcml2YXRlIGRhdGEgLSBhbHdheXMgYSBwb2ludGVyIHRvIHRoZSBwb2xsIGZ1bmMuCisgKgorICogVGhpcyBpcyB0aGUgZ3V0cyBvZiBidWZmZXJlZCBjYXB0dXJlLiBPbiBhIHRyaWdnZXIgZXZlbnQgb2NjdXJpbmcsCisgKiBpZiB0aGUgcG9sbGZ1bmMgaXMgYXR0YWNoZWQgdGhlbiB0aGlzIGhhbmRsZXIgaXMgY2FsbGVkIGFzIGEgdGhyZWFkZWQKKyAqIGludGVycnVwdCAoYW5kIGhlbmNlIG1heSBzbGVlcCkuIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBncmFiYmluZyBkYXRhCisgKiBmcm9tIHRoZSBkZXZpY2UgYW5kIHB1c2hpbmcgaXQgaW50byB0aGUgYXNzb2NpYXRlZCBidWZmZXIuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBpaW9fc2ltcGxlX2R1bW15X3RyaWdnZXJfaChpbnQgaXJxLCB2b2lkICpwKQoreworCXN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZiA9IHA7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5pbmRpb19kZXY7CisJc3RydWN0IGlpb19idWZmZXIgKmJ1ZmZlciA9IGluZGlvX2Rldi0+YnVmZmVyOworCWludCBsZW4gPSAwOworCS8qCisJICogVGhlIGRhdGFzaXplIGlzIG9idGFpbmVkIGZyb20gdGhlIGJ1ZmZlci4gSXQgd2FzIHN0b3JlZCB3aGVuCisJICogdGhlIHByZWVuYWJsZSBzZXR1cCBmdW5jdGlvbiB3YXMgY2FsbGVkLgorCSAqLworCXNpemVfdCBkYXRhc2l6ZSA9IGJ1ZmZlci0+YWNjZXNzLT5nZXRfYnl0ZXNfcGVyX2RhdHVtKGJ1ZmZlcik7CisJdTE2ICpkYXRhID0ga21hbGxvYyhkYXRhc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoYnVmZmVyLT5zY2FuX2NvdW50KSB7CisJCS8qCisJCSAqIFRocmVlIGNvbW1vbiBvcHRpb25zIGhlcmU6CisJCSAqIGhhcmR3YXJlIHNjYW5zOiBjZXJ0YWluIGNvbWJpbmF0aW9ucyBvZiBjaGFubmVscyBtYWtlCisJCSAqICAgdXAgYSBmYXN0IHJlYWQuICBUaGUgY2FwdHVyZSB3aWxsIGNvbnNpc3Qgb2YgYWxsIG9mIHRoZW0uCisJCSAqICAgSGVuY2Ugd2UganVzdCBjYWxsIHRoZSBncmFiIGRhdGEgZnVuY3Rpb24gYW5kIGZpbGwgdGhlCisJCSAqICAgYnVmZmVyIHdpdGhvdXQgcHJvY2Vzc2luZy4KKwkJICogc29md2FyZSBzY2FuczogY2FuIGJlIGNvbnNpZGVyZWQgdG8gYmUgcmFuZG9tIGFjY2VzcworCQkgKiAgIHNvIGVmZmljaWVudCByZWFkaW5nIGlzIGp1c3QgYSBjYXNlIG9mIG1pbmltYWwgYnVzCisJCSAqICAgdHJhbnNhY3Rpb25zLgorCQkgKiBzb2Z0d2FyZSBjdWxsZWQgaGFyZHdhcmUgc2NhbnM6CisJCSAqICAgb2NjYXNpb25hbGx5IGEgZHJpdmVyIG1heSBwcm9jZXNzIHRoZSBuZWFyZXN0IGhhcmR3YXJlCisJCSAqICAgc2NhbiB0byBhdm9pZCBzdG9yaW5nIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBkZXNpcmVkLiBUaGlzCisJCSAqICAgaXMgdGhlIGZpZGxpZXN0IG9wdGlvbiBieSBmYXIuCisJCSAqIEhlcmUgbGV0cyBwcmV0ZW5kIHdlIGhhdmUgcmFuZG9tIGFjY2Vzcy4gQW5kIHRoZSB2YWx1ZXMgYXJlCisJCSAqIGluIHRoZSBjb25zdGFudCB0YWJsZSBmYWtlZGF0YS4KKwkJICovCisJCWludCBpLCBqOworCQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGJ1ZmZlci0+c2Nhbl9jb3VudDsgaSsrKSB7CisJCQlqID0gZmluZF9uZXh0X2JpdChidWZmZXItPnNjYW5fbWFzaywKKwkJCQkJICBpbmRpb19kZXYtPm1hc2tsZW5ndGgsIGogKyAxKTsKKwkJCS8qIHJhbmRvbSBhY2Nlc3MgcmVhZCBmb3JtIHRoZSAnZGV2aWNlJyAqLworCQkJZGF0YVtpXSA9IGZha2VkYXRhW2pdOworCQkJbGVuICs9IDI7CisJCX0KKwl9CisJLyogU3RvcmUgYSB0aW1lc3RhbXBlIGF0IGFuIDggYnl0ZSBib3VuZGFyeSAqLworCWlmIChidWZmZXItPnNjYW5fdGltZXN0YW1wKQorCQkqKHM2NCAqKSgoKHBoeXNfYWRkcl90KWRhdGEgKyBsZW4KKwkJCQkrIHNpemVvZihzNjQpIC0gMSkgJiB+KHNpemVvZihzNjQpIC0gMSkpCisJCQk9IGlpb19nZXRfdGltZV9ucygpOworCWJ1ZmZlci0+YWNjZXNzLT5zdG9yZV90byhidWZmZXIsICh1OCAqKWRhdGEsIHBmLT50aW1lc3RhbXApOworCisJa2ZyZWUoZGF0YSk7CisKKwkvKgorCSAqIFRlbGwgdGhlIGNvcmUgd2UgYXJlIGRvbmUgd2l0aCB0aGlzIHRyaWdnZXIgYW5kIHJlYWR5IGZvciB0aGUKKwkgKiBuZXh0IG9uZS4KKwkgKi8KKwlpaW9fdHJpZ2dlcl9ub3RpZnlfZG9uZShpbmRpb19kZXYtPnRyaWcpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19idWZmZXJfc2V0dXBfb3BzIGlpb19zaW1wbGVfZHVtbXlfYnVmZmVyX3NldHVwX29wcyA9IHsKKwkvKgorCSAqIGlpb19zd19idWZmZXJfcHJlZW5hYmxlOgorCSAqIEdlbmVyaWMgZnVuY3Rpb24gZm9yIGVxdWFsIHNpemVkIHJpbmcgZWxlbWVudHMgKyA2NCBiaXQgdGltZXN0YW1wCisJICogQXNzdW1lcyB0aGF0IGFueSBjb21iaW5hdGlvbiBvZiBjaGFubmVscyBjYW4gYmUgZW5hYmxlZC4KKwkgKiBUeXBpY2FsbHkgcmVwbGFjZWQgdG8gaW1wbGVtZW50IHJlc3RyaWN0aW9ucyBvbiB3aGF0IGNvbWJpbmF0aW9ucworCSAqIGNhbiBiZSBjYXB0dXJlZCAoaGFyZHdhcmUgc2NhbiBtb2RlcykuCisJICovCisJLnByZWVuYWJsZSA9ICZpaW9fc3dfYnVmZmVyX3ByZWVuYWJsZSwKKwkvKgorCSAqIGlpb190cmlnZ2VyZWRfYnVmZmVyX3Bvc3RlbmFibGU6CisJICogR2VuZXJpYyBmdW5jdGlvbiB0aGF0IHNpbXBseSBhdHRhY2hlcyB0aGUgcG9sbGZ1bmMgdG8gdGhlIHRyaWdnZXIuCisJICogUmVwbGFjZSB0aGlzIHRvIG1lc3Mgd2l0aCBoYXJkd2FyZSBzdGF0ZSBiZWZvcmUgd2UgYXR0YWNoIHRoZQorCSAqIHRyaWdnZXIuCisJICovCisJLnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZSwKKwkvKgorCSAqIGlpb190cmlnZ2VyZWRfYnVmZmVyX3ByZWRpc2FibGU6CisJICogR2VuZXJpYyBmdW5jdGlvbiB0aGF0IHNpbXBsZSBkZXRhY2hlcyB0aGUgcG9sbGZ1bmMgZnJvbSB0aGUgdHJpZ2dlci4KKwkgKiBSZXBsYWNlIHRoaXMgdG8gcHV0IGhhcmR3YXJlIHN0YXRlIGJhY2sgYWdhaW4gYWZ0ZXIgdGhlIHRyaWdnZXIgaXMKKwkgKiBkZXRhY2hlZCBidXQgYmVmb3JlIHVzZXJzcGFjZSBrbm93cyB3ZSBoYXZlIGRpc2FibGVkIHRoZSByaW5nLgorCSAqLworCS5wcmVkaXNhYmxlID0gJmlpb190cmlnZ2VyZWRfYnVmZmVyX3ByZWRpc2FibGUsCit9OworCitpbnQgaWlvX3NpbXBsZV9kdW1teV9jb25maWd1cmVfYnVmZmVyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyOworCisJLyogQWxsb2NhdGUgYSBidWZmZXIgdG8gdXNlIC0gaGVyZSBhIGtmaWZvICovCisJYnVmZmVyID0gaWlvX2tmaWZvX2FsbG9jYXRlKGluZGlvX2Rldik7CisJaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKworCWluZGlvX2Rldi0+YnVmZmVyID0gYnVmZmVyOworCS8qIFRlbGwgdGhlIGNvcmUgaG93IHRvIGFjY2VzcyB0aGUgYnVmZmVyICovCisJYnVmZmVyLT5hY2Nlc3MgPSAma2ZpZm9fYWNjZXNzX2Z1bmNzOworCisJLyogTnVtYmVyIG9mIGJ5dGVzIHBlciBlbGVtZW50ICovCisJYnVmZmVyLT5icGUgPSAyOworCS8qIEVuYWJsZSB0aW1lc3RhbXBzIGJ5IGRlZmF1bHQgKi8KKwlidWZmZXItPnNjYW5fdGltZXN0YW1wID0gdHJ1ZTsKKworCS8qCisJICogVGVsbCB0aGUgY29yZSB3aGF0IGRldmljZSB0eXBlIHNwZWNpZmljIGZ1bmN0aW9ucyBzaG91bGQKKwkgKiBiZSBydW4gb24gZWl0aGVyIHNpZGUgb2YgYnVmZmVyIGNhcHR1cmUgZW5hYmxlIC8gZGlzYWJsZS4KKwkgKi8KKwlidWZmZXItPnNldHVwX29wcyA9ICZpaW9fc2ltcGxlX2R1bW15X2J1ZmZlcl9zZXR1cF9vcHM7CisJYnVmZmVyLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJLyoKKwkgKiBDb25maWd1cmUgYSBwb2xsaW5nIGZ1bmN0aW9uLgorCSAqIFdoZW4gYSB0cmlnZ2VyIGV2ZW50IHdpdGggdGhpcyBwb2xsaW5nIGZ1bmN0aW9uIGNvbm5lY3RlZAorCSAqIG9jY3VycywgdGhpcyBmdW5jdGlvbiBpcyBydW4uIFR5cGljYWxseSB0aGlzIGdyYWJzIGRhdGEKKwkgKiBmcm9tIHRoZSBkZXZpY2UuCisJICoKKwkgKiBOVUxMIGZvciB0aGUgdG9wIGhhbGYuIFRoaXMgaXMgbm9ybWFsbHkgaW1wbGVtZW50ZWQgb25seSBpZiB3ZQorCSAqIGVpdGhlciB3YW50IHRvIHBpbmcgYSBjYXB0dXJlIG5vdyBwaW4gKG5vIHNsZWVwaW5nKSBvciBncmFiCisJICogYSB0aW1lc3RhbXAgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gYSBkYXRhIHJlYWR5IHRyaWdnZXIgZmlyaW5nLgorCSAqCisJICogSVJRRl9PTkVTSE9UIGVuc3VyZXMgaXJxcyBhcmUgbWFza2VkIHN1Y2ggdGhhdCBvbmx5IG9uZSBpbnN0YW5jZQorCSAqIG9mIHRoZSBoYW5kbGVyIGNhbiBydW4gYXQgYSB0aW1lLgorCSAqCisJICogImlpb19zaW1wbGVfZHVtbXlfY29uc3VtZXIlZCIgZm9ybWF0dGluZyBzdHJpbmcgZm9yIHRoZSBpcnEgJ25hbWUnCisJICogYXMgc2VlbiB1bmRlciAvcHJvYy9pbnRlcnJ1cHRzLiBSZW1haW5pbmcgcGFyYW1ldGVycyBhcyBwZXIgcHJpbnRrLgorCSAqLworCWluZGlvX2Rldi0+cG9sbGZ1bmMgPSBpaW9fYWxsb2NfcG9sbGZ1bmMoTlVMTCwKKwkJCQkJCSAmaWlvX3NpbXBsZV9kdW1teV90cmlnZ2VyX2gsCisJCQkJCQkgSVJRRl9PTkVTSE9ULAorCQkJCQkJIGluZGlvX2RldiwKKwkJCQkJCSAiaWlvX3NpbXBsZV9kdW1teV9jb25zdW1lciVkIiwKKwkJCQkJCSBpbmRpb19kZXYtPmlkKTsKKworCWlmIChpbmRpb19kZXYtPnBvbGxmdW5jID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX2J1ZmZlcjsKKwl9CisKKwkvKgorCSAqIE5vdGlmeSB0aGUgY29yZSB0aGF0IHRoaXMgZGV2aWNlIGlzIGNhcGFibGUgb2YgYnVmZmVyZWQgY2FwdHVyZQorCSAqIGRyaXZlbiBieSBhIHRyaWdnZXIuCisJICovCisJaW5kaW9fZGV2LT5tb2RlcyB8PSBJTkRJT19CVUZGRVJfVFJJR0dFUkVEOworCXJldHVybiAwOworCitlcnJvcl9mcmVlX2J1ZmZlcjoKKwlpaW9fa2ZpZm9fZnJlZShpbmRpb19kZXYtPmJ1ZmZlcik7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKKworfQorCisvKioKKyAqIGlpb19zaW1wbGVfZHVtbXlfdW5jb25maWd1cmVfYnVmZmVyKCkgLSByZWxlYXNlIGJ1ZmZlciByZXNvdXJjZXMKKyAqIEBpbmRvX2RldjogZGV2aWNlIGluc3RhbmNlIHN0YXRlCisgKi8KK3ZvaWQgaWlvX3NpbXBsZV9kdW1teV91bmNvbmZpZ3VyZV9idWZmZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpaW9fZGVhbGxvY19wb2xsZnVuYyhpbmRpb19kZXYtPnBvbGxmdW5jKTsKKwlpaW9fa2ZpZm9fZnJlZShpbmRpb19kZXYtPmJ1ZmZlcik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19zaW1wbGVfZHVtbXlfZXZlbnRzLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19zaW1wbGVfZHVtbXlfZXZlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwMGNmZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaWlvX3NpbXBsZV9kdW1teV9ldmVudHMuYwpAQCAtMCwwICsxLDE5MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgSm9uYXRoYW4gQ2FtZXJvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogRXZlbnQgaGFuZGxpbmcgZWxlbWVudHMgb2YgaW5kdXN0cmlhbCBJL08gcmVmZXJlbmNlIGRyaXZlci4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKworI2luY2x1ZGUgImlpby5oIgorI2luY2x1ZGUgInN5c2ZzLmgiCisjaW5jbHVkZSAiaWlvX3NpbXBsZV9kdW1teS5oIgorCisvKiBFdmdlbiAnZmFrZXMnIGludGVycnVwdCBldmVudHMgZm9yIHRoaXMgZXhhbXBsZSAqLworI2luY2x1ZGUgImlpb19kdW1teV9ldmdlbi5oIgorCisvKioKKyAqIGlpb19zaW1wbGVfZHVtbXlfcmVhZF9ldmVudF9jb25maWcoKSAtIGlzIGV2ZW50IGVuYWJsZWQ/CisgKiBAaW5kaW9fZGV2OiB0aGUgZGV2aWNlIGluc3RhbmNlIGRhdGEKKyAqIEBldmVudF9jb2RlOiBldmVudCBjb2RlIG9mIHRoZSBldmVudCBiZWluZyBxdWVyaWVkCisgKgorICogVGhpcyBmdW5jdGlvbiB3b3VsZCBub3JtYWxseSBxdWVyeSB0aGUgcmVsZXZhbnQgcmVnaXN0ZXJzIG9yIGEgY2FjaGUgdG8KKyAqIGRpc2NvdmVyIGlmIHRoZSBldmVudCBnZW5lcmF0aW9uIGlzIGVuYWJsZWQgb24gdGhlIGRldmljZS4KKyAqLworaW50IGlpb19zaW1wbGVfZHVtbXlfcmVhZF9ldmVudF9jb25maWcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkgICAgICAgdTY0IGV2ZW50X2NvZGUpCit7CisJc3RydWN0IGlpb19kdW1teV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJcmV0dXJuIHN0LT5ldmVudF9lbjsKK30KKworLyoqCisgKiBpaW9fc2ltcGxlX2R1bW15X3dyaXRlX2V2ZW50X2NvbmZpZygpIC0gc2V0IHdoZXRoZXIgZXZlbnQgaXMgZW5hYmxlZAorICogQGluZGlvX2RldjogdGhlIGRldmljZSBpbnN0YW5jZSBkYXRhCisgKiBAZXZlbnRfY29kZTogZXZlbnQgY29kZSBvZiBldmVudCBiZWluZyBlbmFibGVkL2Rpc2FibGVkCisgKiBAc3RhdGU6IHdoZXRoZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIGRldmljZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdvdWxkIG5vcm1hbGx5IHNldCB0aGUgcmVsZXZhbnQgcmVnaXN0ZXJzIG9uIHRoZSBkZXZpY2VzCisgKiBzbyB0aGF0IGl0IGdlbmVyYXRlcyB0aGUgc3BlY2lmaWVkIGV2ZW50LiBIZXJlIGl0IGp1c3Qgc2V0cyB1cCBhIGNhY2hlZAorICogdmFsdWUuCisgKi8KK2ludCBpaW9fc2ltcGxlX2R1bW15X3dyaXRlX2V2ZW50X2NvbmZpZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJCQl1NjQgZXZlbnRfY29kZSwKKwkJCQkJaW50IHN0YXRlKQoreworCXN0cnVjdCBpaW9fZHVtbXlfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCS8qCisJICogIERlbGliZXJhdGVseSBvdmVyIHRoZSB0b3AgY29kZSBzcGxpdHRpbmcgdG8gaWxsdXN0cmF0ZQorCSAqIGhvdyB0aGlzIGlzIGRvbmUgd2hlbiBtdWx0aXBsZSBldmVudHMgZXhpc3QuCisJICovCisJc3dpdGNoIChJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX0NIQU5fVFlQRShldmVudF9jb2RlKSkgeworCWNhc2UgSUlPX1ZPTFRBR0U6CisJCXN3aXRjaCAoSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9UWVBFKGV2ZW50X2NvZGUpKSB7CisJCWNhc2UgSUlPX0VWX1RZUEVfVEhSRVNIOgorCQkJaWYgKElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfRElSKGV2ZW50X2NvZGUpID09CisJCQkgICAgSUlPX0VWX0RJUl9SSVNJTkcpCisJCQkJc3QtPmV2ZW50X2VuID0gc3RhdGU7CisJCQllbHNlCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaWlvX3NpbXBsZV9kdW1teV9yZWFkX2V2ZW50X3ZhbHVlKCkgLSBnZXQgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGV2ZW50CisgKiBAaW5kaW9fZGV2OiBkZXZpY2UgaW5zdGFuY2Ugc3BlY2lmaWMgZGF0YQorICogQGV2ZW50X2NvZGU6IGV2ZW50IGNvZGUgZm9yIHRoZSBldmVudCB3aG9zZSB2YWx1ZSBpcyBiZWluZyBxdWVyaWVkCisgKiBAdmFsOiB2YWx1ZSBmb3IgdGhlIGV2ZW50IGNvZGUuCisgKgorICogTWFueSBkZXZpY2VzIHByb3ZpZGUgYSBsYXJnZSBzZXQgb2YgZXZlbnRzIG9mIHdoaWNoIG9ubHkgYSBzdWJzZXQgbWF5CisgKiBiZSBlbmFibGVkIGF0IGEgdGltZSwgd2l0aCB2YWx1ZSByZWdpc3RlcnMgd2hvc2UgbWVhbmluZyBjaGFuZ2VzIGRlcGVuZGluZworICogb24gdGhlIGV2ZW50IGVuYWJsZWQuIFRoaXMgb2Z0ZW4gbWVhbnMgdGhhdCB0aGUgZHJpdmVyIG11c3QgY2FjaGUgdGhlIHZhbHVlcworICogYXNzb2NpYXRlZCB3aXRoIGVhY2ggcG9zc2libGUgZXZlbnRzIHNvIHRoYXQgdGhlIHJpZ2h0IHZhbHVlIGlzIGluIHBsYWNlIHdoZW4KKyAqIHRoZSBlbmFibGVkIGV2ZW50IGlzIGNoYW5nZWQuCisgKi8KK2ludCBpaW9fc2ltcGxlX2R1bW15X3JlYWRfZXZlbnRfdmFsdWUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkgICAgICB1NjQgZXZlbnRfY29kZSwKKwkJCQkgICAgICBpbnQgKnZhbCkKK3sKKwlzdHJ1Y3QgaWlvX2R1bW15X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwkqdmFsID0gc3QtPmV2ZW50X3ZhbDsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlpb19zaW1wbGVfZHVtbXlfd3JpdGVfZXZlbnRfdmFsdWUoKSAtIHNldCB2YWx1ZSBhc3NvY2lhdGUgd2l0aCBldmVudAorICogQGluZGlvX2RldjogZGV2aWNlIGluc3RhbmNlIHNwZWNpZmljIGRhdGEKKyAqIEBldmVudF9jb2RlOiBldmVudCBjb2RlIGZvciB0aGUgZXZlbnQgd2hvc2UgdmFsdWUgaXMgYmVpbmcgc2V0CisgKiBAdmFsOiB0aGUgdmFsdWUgdG8gYmUgc2V0LgorICovCitpbnQgaWlvX3NpbXBsZV9kdW1teV93cml0ZV9ldmVudF92YWx1ZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJCSAgICAgICB1NjQgZXZlbnRfY29kZSwKKwkJCQkgICAgICAgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgaWlvX2R1bW15X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlzdC0+ZXZlbnRfdmFsID0gdmFsOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaWlvX3NpbXBsZV9kdW1teV9ldmVudF9oYW5kbGVyKCkgLSBpZGVudGlmeSBhbmQgcGFzcyBvbiBldmVudAorICogQGlycTogaXJxIG9mIGV2ZW50IGxpbmUKKyAqIEBwcml2YXRlOiBwb2ludGVyIHRvIGRldmljZSBpbnN0YW5jZSBzdGF0ZS4KKyAqCisgKiBUaGlzIGhhbmRsZXIgaXMgcmVzcG9uc2libGUgZm9yIHF1ZXJ5aW5nIHRoZSBkZXZpY2UgdG8gZmluZCBvdXQgd2hhdAorICogZXZlbnQgb2NjdXJlZCBhbmQgZm9yIHRoZW4gcHVzaGluZyB0aGF0IGV2ZW50IHRvd2FyZHMgdXNlcnNwYWNlLgorICogSGVyZSBvbmx5IG9uZSBldmVudCBvY2N1cnMgc28gd2UgcHVzaCB0aGF0IGRpcmVjdGx5IG9uIHdpdGggbG9jYWxseQorICogZ3JhYmJlZCB0aW1lc3RhbXAuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBpaW9fc2ltcGxlX2R1bW15X2V2ZW50X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcHJpdmF0ZTsKKwlpaW9fcHVzaF9ldmVudChpbmRpb19kZXYsCisJCSAgICAgICBJSU9fRVZFTlRfQ09ERShJSU9fVk9MVEFHRSwgMCwgMCwKKwkJCQkgICAgICBJSU9fRVZfRElSX1JJU0lORywKKwkJCQkgICAgICBJSU9fRVZfVFlQRV9USFJFU0gsIDAsIDAsIDApLAorCQkgICAgICAgaWlvX2dldF90aW1lX25zKCkpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBpaW9fc2ltcGxlX2R1bW15X2V2ZW50c19yZWdpc3RlcigpIC0gc2V0dXAgaW50ZXJydXB0IGhhbmRsaW5nIGZvciBldmVudHMKKyAqIEBpbmRpb19kZXY6IGRldmljZSBpbnN0YW5jZSBkYXRhCisgKgorICogVGhpcyBmdW5jdGlvbiByZXF1ZXN0cyB0aGUgdGhyZWFkZWQgaW50ZXJydXB0IHRvIGhhbmRsZSB0aGUgZXZlbnRzLgorICogTm9ybWFsbHkgdGhlIGlycSBpcyBhIGhhcmR3YXJlIGludGVycnVwdCBhbmQgdGhlIG51bWJlciBjb21lcworICogZnJvbSBib2FyZCBjb25maWd1cmF0aW9uIGZpbGVzLiAgSGVyZSB3ZSBnZXQgaXQgZnJvbSBhIGNvbXBhbmlvbgorICogbW9kdWxlIHRoYXQgZmFrZXMgdGhlIGludGVycnVwdCBmb3IgdXMuIE5vdGUgdGhhdCBtb2R1bGUgaW4KKyAqIG5vIHdheSBmb3JtcyBwYXJ0IG9mIHRoaXMgZXhhbXBsZS4gSnVzdCBhc3N1bWUgdGhhdCBldmVudHMgbWFnaWNhbGx5CisgKiBhcHBlYXIgdmlhIHRoZSBwcm92aWRlZCBpbnRlcnJ1cHQuCisgKi8KK2ludCBpaW9fc2ltcGxlX2R1bW15X2V2ZW50c19yZWdpc3RlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXN0cnVjdCBpaW9fZHVtbXlfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0OworCisJLyogRmlyZSB1cCBldmVudCBzb3VyY2UgLSBub3JtYWxseSBub3QgcHJlc2VudCAqLworCXN0LT5ldmVudF9pcnEgPSBpaW9fZHVtbXlfZXZnZW5fZ2V0X2lycSgpOworCWlmIChzdC0+ZXZlbnRfaXJxIDwgMCkgeworCQlyZXQgPSBzdC0+ZXZlbnRfaXJxOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoc3QtPmV2ZW50X2lycSwKKwkJCQkgICBOVUxMLAorCQkJCSAgICZpaW9fc2ltcGxlX2R1bW15X2V2ZW50X2hhbmRsZXIsCisJCQkJICAgSVJRRl9PTkVTSE9ULAorCQkJCSAgICJpaW9fc2ltcGxlX2V2ZW50IiwKKwkJCQkgICBpbmRpb19kZXYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX2ZyZWVfZXZnZW47CisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfZXZnZW46CisJaWlvX2R1bW15X2V2Z2VuX3JlbGVhc2VfaXJxKHN0LT5ldmVudF9pcnEpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaWlvX3NpbXBsZV9kdW1teV9ldmVudHNfdW5yZWdpc3RlcigpIC0gdGlkeSB1cCBpbnRlcnJ1cHQgaGFuZGxpbmcgb24gcmVtb3ZlCisgKiBAaW5kaW9fZGV2OiBkZXZpY2UgaW5zdGFuY2UgZGF0YQorICovCitpbnQgaWlvX3NpbXBsZV9kdW1teV9ldmVudHNfdW5yZWdpc3RlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXN0cnVjdCBpaW9fZHVtbXlfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCWZyZWVfaXJxKHN0LT5ldmVudF9pcnEsIGluZGlvX2Rldik7CisJLyogTm90IHBhcnQgb2Ygbm9ybWFsIGRyaXZlciAqLworCWlpb19kdW1teV9ldmdlbl9yZWxlYXNlX2lycShzdC0+ZXZlbnRfaXJxKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXBlZGFuY2UtYW5hbHl6ZXIvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW1wZWRhbmNlLWFuYWx5emVyL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQwZmY3NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW1wZWRhbmNlLWFuYWx5emVyL0tjb25maWcKQEAgLTAsMCArMSwxOCBAQAorIworIyBJbXBlZGFuY2UgQ29udmVydGVyLCBOZXR3b3JrIEFuYWx5emVyIGRyaXZlcnMKKyMKK21lbnUgIk5ldHdvcmsgQW5hbHl6ZXIsIEltcGVkYW5jZSBDb252ZXJ0ZXJzIgorCitjb25maWcgQUQ1OTMzCisJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFENTkzMywgQUQ1OTM0IGRyaXZlciIKKwlkZXBlbmRzIG9uIEkyQworCXNlbGVjdCBJSU9fQlVGRkVSCisJc2VsZWN0IElJT19TV19SSU5HCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIEltcGVkYW5jZSBDb252ZXJ0ZXIsCisJICBOZXR3b3JrIEFuYWx5emVyLCBBRDU5MzMvNCwgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB2aWEgc3lzZnMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGFkNTkzMy4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXBlZGFuY2UtYW5hbHl6ZXIvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltcGVkYW5jZS1hbmFseXplci9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjA0ZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXBlZGFuY2UtYW5hbHl6ZXIvTWFrZWZpbGUKQEAgLTAsMCArMSw1IEBACisjCisjIE1ha2VmaWxlIGZvciBJbXBlZGFuY2UgQ29udmVydGVyLCBOZXR3b3JrIEFuYWx5emVyIGRyaXZlcnMKKyMKKworb2JqLSQoQ09ORklHX0FENTkzMykgKz0gYWQ1OTMzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW1wZWRhbmNlLWFuYWx5emVyL2FkNTkzMy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXBlZGFuY2UtYW5hbHl6ZXIvYWQ1OTMzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4NmUwYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW1wZWRhbmNlLWFuYWx5emVyL2FkNTkzMy5jCkBAIC0wLDAgKzEsODE0IEBACisvKgorICogQUQ1OTMzIEFENTkzNCBJbXBlZGFuY2UgQ29udmVydGVyLCBOZXR3b3JrIEFuYWx5emVyCisgKgorICogQ29weXJpZ2h0IDIwMTEgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVkZSAiLi4vaWlvLmgiCisjaW5jbHVkZSAiLi4vc3lzZnMuaCIKKyNpbmNsdWRlICIuLi9idWZmZXJfZ2VuZXJpYy5oIgorI2luY2x1ZGUgIi4uL3Jpbmdfc3cuaCIKKworI2luY2x1ZGUgImFkNTkzMy5oIgorCisvKiBBRDU5MzMvQUQ1OTM0IFJlZ2lzdGVycyAqLworI2RlZmluZSBBRDU5MzNfUkVHX0NPTlRST0xfSEIJCTB4ODAJLyogUi9XLCAyIGJ5dGVzICovCisjZGVmaW5lIEFENTkzM19SRUdfQ09OVFJPTF9MQgkJMHg4MQkvKiBSL1csIDIgYnl0ZXMgKi8KKyNkZWZpbmUgQUQ1OTMzX1JFR19GUkVRX1NUQVJUCQkweDgyCS8qIFIvVywgMyBieXRlcyAqLworI2RlZmluZSBBRDU5MzNfUkVHX0ZSRVFfSU5DCQkweDg1CS8qIFIvVywgMyBieXRlcyAqLworI2RlZmluZSBBRDU5MzNfUkVHX0lOQ19OVU0JCTB4ODgJLyogUi9XLCAyIGJ5dGVzLCA5IGJpdCAqLworI2RlZmluZSBBRDU5MzNfUkVHX1NFVFRMSU5HX0NZQ0xFUwkweDhBCS8qIFIvVywgMiBieXRlcyAqLworI2RlZmluZSBBRDU5MzNfUkVHX1NUQVRVUwkJMHg4RgkvKiBSLCAxIGJ5dGUgKi8KKyNkZWZpbmUgQUQ1OTMzX1JFR19URU1QX0RBVEEJCTB4OTIJLyogUiwgMiBieXRlcyovCisjZGVmaW5lIEFENTkzM19SRUdfUkVBTF9EQVRBCQkweDk0CS8qIFIsIDIgYnl0ZXMqLworI2RlZmluZSBBRDU5MzNfUkVHX0lNQUdfREFUQQkJMHg5NgkvKiBSLCAyIGJ5dGVzKi8KKworLyogQUQ1OTMzX1JFR19DT05UUk9MX0hCIEJpdHMgKi8KKyNkZWZpbmUgQUQ1OTMzX0NUUkxfSU5JVF9TVEFSVF9GUkVRCSgweDEgPDwgNCkKKyNkZWZpbmUgQUQ1OTMzX0NUUkxfU1RBUlRfU1dFRVAJCSgweDIgPDwgNCkKKyNkZWZpbmUgQUQ1OTMzX0NUUkxfSU5DX0ZSRVEJCSgweDMgPDwgNCkKKyNkZWZpbmUgQUQ1OTMzX0NUUkxfUkVQRUFUX0ZSRVEJCSgweDQgPDwgNCkKKyNkZWZpbmUgQUQ1OTMzX0NUUkxfTUVBU1VSRV9URU1QCSgweDkgPDwgNCkKKyNkZWZpbmUgQUQ1OTMzX0NUUkxfUE9XRVJfRE9XTgkJKDB4QSA8PCA0KQorI2RlZmluZSBBRDU5MzNfQ1RSTF9TVEFOREJZCQkoMHhCIDw8IDQpCisKKyNkZWZpbmUgQUQ1OTMzX0NUUkxfUkFOR0VfMjAwMG1WcHAJKDB4MCA8PCAxKQorI2RlZmluZSBBRDU5MzNfQ1RSTF9SQU5HRV8yMDBtVnBwCSgweDEgPDwgMSkKKyNkZWZpbmUgQUQ1OTMzX0NUUkxfUkFOR0VfNDAwbVZwcAkoMHgyIDw8IDEpCisjZGVmaW5lIEFENTkzM19DVFJMX1JBTkdFXzEwMDBtVnBwCSgweDMgPDwgMSkKKyNkZWZpbmUgQUQ1OTMzX0NUUkxfUkFOR0UoeCkJCSgoeCkgPDwgMSkKKworI2RlZmluZSBBRDU5MzNfQ1RSTF9QR0FfR0FJTl8xCQkoMHgxIDw8IDApCisjZGVmaW5lIEFENTkzM19DVFJMX1BHQV9HQUlOXzUJCSgweDAgPDwgMCkKKworLyogQUQ1OTMzX1JFR19DT05UUk9MX0xCIEJpdHMgKi8KKyNkZWZpbmUgQUQ1OTMzX0NUUkxfUkVTRVQJCSgweDEgPDwgNCkKKyNkZWZpbmUgQUQ1OTMzX0NUUkxfSU5UX1NZU0NMSwkJKDB4MCA8PCAzKQorI2RlZmluZSBBRDU5MzNfQ1RSTF9FWFRfU1lTQ0xLCQkoMHgxIDw8IDMpCisKKy8qIEFENTkzM19SRUdfU1RBVFVTIEJpdHMgKi8KKyNkZWZpbmUgQUQ1OTMzX1NUQVRfVEVNUF9WQUxJRAkJKDB4MSA8PCAwKQorI2RlZmluZSBBRDU5MzNfU1RBVF9EQVRBX1ZBTElECQkoMHgxIDw8IDEpCisjZGVmaW5lIEFENTkzM19TVEFUX1NXRUVQX0RPTkUJCSgweDEgPDwgMikKKworLyogSTJDIEJsb2NrIENvbW1hbmRzICovCisjZGVmaW5lIEFENTkzM19JMkNfQkxPQ0tfV1JJVEUJCTB4QTAKKyNkZWZpbmUgQUQ1OTMzX0kyQ19CTE9DS19SRUFECQkweEExCisjZGVmaW5lIEFENTkzM19JMkNfQUREUl9QT0lOVEVSCQkweEIwCisKKy8qIERldmljZSBTcGVjcyAqLworI2RlZmluZSBBRDU5MzNfSU5UX09TQ19GUkVRX0h6CQkxNjc3NjAwMAorI2RlZmluZSBBRDU5MzNfTUFYX09VVFBVVF9GUkVRX0h6CTEwMDAwMAorI2RlZmluZSBBRDU5MzNfTUFYX1JFVFJJRVMJCTEwMAorCisjZGVmaW5lIEFENTkzM19PVVRfUkFOR0UJCTEKKyNkZWZpbmUgQUQ1OTMzX09VVF9SQU5HRV9BVkFJTAkJMgorI2RlZmluZSBBRDU5MzNfT1VUX1NFVFRMSU5HX0NZQ0xFUwkzCisjZGVmaW5lIEFENTkzM19JTl9QR0FfR0FJTgkJNAorI2RlZmluZSBBRDU5MzNfSU5fUEdBX0dBSU5fQVZBSUwJNQorI2RlZmluZSBBRDU5MzNfRlJFUV9QT0lOVFMJCTYKKworI2RlZmluZSBBRDU5MzNfUE9MTF9USU1FX21zCQkxMAorI2RlZmluZSBBRDU5MzNfSU5JVF9FWENJVEFUSU9OX1RJTUVfbXMJMTAwCisKK3N0cnVjdCBhZDU5MzNfc3RhdGUgeworCXN0cnVjdCBpMmNfY2xpZW50CQkqY2xpZW50OworCXN0cnVjdCByZWd1bGF0b3IJCSpyZWc7CisJc3RydWN0IGFkNTkzM19wbGF0Zm9ybV9kYXRhCSpwZGF0YTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCQl3b3JrOworCXVuc2lnbmVkIGxvbmcJCQltY2xrX2h6OworCXVuc2lnbmVkIGNoYXIJCQljdHJsX2hiOworCXVuc2lnbmVkIGNoYXIJCQljdHJsX2xiOworCXVuc2lnbmVkCQkJcmFuZ2VfYXZhaWxbNF07CisJdW5zaWduZWQgc2hvcnQJCQl2cmVmX212OworCXVuc2lnbmVkIHNob3J0CQkJc2V0dGxpbmdfY3ljbGVzOworCXVuc2lnbmVkIHNob3J0CQkJZnJlcV9wb2ludHM7CisJdW5zaWduZWQJCQlmcmVxX3N0YXJ0OworCXVuc2lnbmVkCQkJZnJlcV9pbmM7CisJdW5zaWduZWQJCQlzdGF0ZTsKKwl1bnNpZ25lZAkJCXBvbGxfdGltZV9qaWZmaWVzOworfTsKKworc3RhdGljIHN0cnVjdCBhZDU5MzNfcGxhdGZvcm1fZGF0YSBhZDU5MzNfZGVmYXVsdF9wZGF0YSAgPSB7CisJLnZyZWZfbXYgPSAzMzAwLAorfTsKKworc3RhdGljIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGFkNTkzM19jaGFubmVsc1tdID0geworCUlJT19DSEFOKElJT19URU1QLCAwLCAxLCAxLCBOVUxMLCAwLCAwLCAwLAorCQkgMCwgQUQ1OTMzX1JFR19URU1QX0RBVEEsIElJT19TVCgncycsIDE0LCAxNiwgMCksIDApLAorCS8qIFJpbmcgQ2hhbm5lbHMgKi8KKwlJSU9fQ0hBTihJSU9fVk9MVEFHRSwgMCwgMSwgMCwgInJlYWxfcmF3IiwgMCwgMCwKKwkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpLAorCQkgQUQ1OTMzX1JFR19SRUFMX0RBVEEsIDAsIElJT19TVCgncycsIDE2LCAxNiwgMCksIDApLAorCUlJT19DSEFOKElJT19WT0xUQUdFLCAwLCAxLCAwLCAiaW1hZ19yYXciLCAwLCAwLAorCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TRVBBUkFURSksCisJCSBBRDU5MzNfUkVHX0lNQUdfREFUQSwgMSwgSUlPX1NUKCdzJywgMTYsIDE2LCAwKSwgMCksCit9OworCitzdGF0aWMgaW50IGFkNTkzM19pMmNfd3JpdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgICAgIHU4IHJlZywgdTggbGVuLCB1OCAqZGF0YSkKK3sKKwlpbnQgcmV0OworCisJd2hpbGUgKGxlbi0tKSB7CisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcrKywgKmRhdGErKyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkkyQyB3cml0ZSBlcnJvclxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkNTkzM19pMmNfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJICAgICAgdTggcmVnLCB1OCBsZW4sIHU4ICpkYXRhKQoreworCWludCByZXQ7CisKKwl3aGlsZSAobGVuLS0pIHsKKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKyspOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJJMkMgcmVhZCBlcnJvclxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCSpkYXRhKysgPSByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkNTkzM19jbWQoc3RydWN0IGFkNTkzM19zdGF0ZSAqc3QsIHVuc2lnbmVkIGNoYXIgY21kKQoreworCXVuc2lnbmVkIGNoYXIgZGF0ID0gc3QtPmN0cmxfaGIgfCBjbWQ7CisKKwlyZXR1cm4gYWQ1OTMzX2kyY193cml0ZShzdC0+Y2xpZW50LAorCQkJQUQ1OTMzX1JFR19DT05UUk9MX0hCLCAxLCAmZGF0KTsKK30KKworc3RhdGljIGludCBhZDU5MzNfcmVzZXQoc3RydWN0IGFkNTkzM19zdGF0ZSAqc3QpCit7CisJdW5zaWduZWQgY2hhciBkYXQgPSBzdC0+Y3RybF9sYiB8IEFENTkzM19DVFJMX1JFU0VUOworCXJldHVybiBhZDU5MzNfaTJjX3dyaXRlKHN0LT5jbGllbnQsCisJCQlBRDU5MzNfUkVHX0NPTlRST0xfTEIsIDEsICZkYXQpOworfQorCitzdGF0aWMgaW50IGFkNTkzM193YWl0X2J1c3koc3RydWN0IGFkNTkzM19zdGF0ZSAqc3QsIHVuc2lnbmVkIGNoYXIgZXZlbnQpCit7CisJdW5zaWduZWQgY2hhciB2YWwsIHRpbWVvdXQgPSBBRDU5MzNfTUFYX1JFVFJJRVM7CisJaW50IHJldDsKKworCXdoaWxlICh0aW1lb3V0LS0pIHsKKwkJcmV0ID0gIGFkNTkzM19pMmNfcmVhZChzdC0+Y2xpZW50LCBBRDU5MzNfUkVHX1NUQVRVUywgMSwgJnZhbCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKHZhbCAmIGV2ZW50KQorCQkJcmV0dXJuIHZhbDsKKwkJY3B1X3JlbGF4KCk7CisJCW1kZWxheSgxKTsKKwl9CisKKwlyZXR1cm4gLUVBR0FJTjsKK30KKworc3RhdGljIGludCBhZDU5MzNfc2V0X2ZyZXEoc3RydWN0IGFkNTkzM19zdGF0ZSAqc3QsCisJCQkgICB1bnNpZ25lZCByZWcsIHVuc2lnbmVkIGxvbmcgZnJlcSkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgZnJlcXJlZzsKKwl1bmlvbiB7CisJCXUzMiBkMzI7CisJCXU4IGQ4WzRdOworCX0gZGF0OworCisJZnJlcXJlZyA9ICh1NjQpIGZyZXEgKiAodTY0KSAoMSA8PCAyNyk7CisJZG9fZGl2KGZyZXFyZWcsIHN0LT5tY2xrX2h6IC8gNCk7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgQUQ1OTMzX1JFR19GUkVRX1NUQVJUOgorCQlzdC0+ZnJlcV9zdGFydCA9IGZyZXE7CisJCWJyZWFrOworCWNhc2UgQUQ1OTMzX1JFR19GUkVRX0lOQzoKKwkJc3QtPmZyZXFfaW5jID0gZnJlcTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGF0LmQzMiA9IGNwdV90b19iZTMyKGZyZXFyZWcpOworCXJldHVybiBhZDU5MzNfaTJjX3dyaXRlKHN0LT5jbGllbnQsIHJlZywgMywgJmRhdC5kOFsxXSk7Cit9CisKK3N0YXRpYyBpbnQgYWQ1OTMzX3NldHVwKHN0cnVjdCBhZDU5MzNfc3RhdGUgKnN0KQoreworCXVuc2lnbmVkIHNob3J0IGRhdDsKKwlpbnQgcmV0OworCisJcmV0ID0gYWQ1OTMzX3Jlc2V0KHN0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGFkNTkzM19zZXRfZnJlcShzdCwgQUQ1OTMzX1JFR19GUkVRX1NUQVJULCAxMDAwMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhZDU5MzNfc2V0X2ZyZXEoc3QsIEFENTkzM19SRUdfRlJFUV9JTkMsIDIwMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzdC0+c2V0dGxpbmdfY3ljbGVzID0gMTA7CisJZGF0ID0gY3B1X3RvX2JlMTYoc3QtPnNldHRsaW5nX2N5Y2xlcyk7CisKKwlyZXQgPSBhZDU5MzNfaTJjX3dyaXRlKHN0LT5jbGllbnQsCisJCQlBRDU5MzNfUkVHX1NFVFRMSU5HX0NZQ0xFUywgMiwgKHU4ICopJmRhdCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzdC0+ZnJlcV9wb2ludHMgPSAxMDA7CisJZGF0ID0gY3B1X3RvX2JlMTYoc3QtPmZyZXFfcG9pbnRzKTsKKworCXJldHVybiBhZDU5MzNfaTJjX3dyaXRlKHN0LT5jbGllbnQsIEFENTkzM19SRUdfSU5DX05VTSwgMiwgKHU4ICopJmRhdCk7Cit9CisKK3N0YXRpYyB2b2lkIGFkNTkzM19jYWxjX291dF9yYW5nZXMoc3RydWN0IGFkNTkzM19zdGF0ZSAqc3QpCit7CisJaW50IGk7CisJdW5zaWduZWQgbm9ybWFsaXplZF8zdjNbNF0gPSB7MTk4MCwgMTk4LCAzODMsIDk3MH07CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQlzdC0+cmFuZ2VfYXZhaWxbaV0gPSBub3JtYWxpemVkXzN2M1tpXSAqIHN0LT52cmVmX212IC8gMzMwMDsKKworfQorCisvKgorICogaGFuZGxlczogQUQ1OTMzX1JFR19GUkVRX1NUQVJUIGFuZCBBRDU5MzNfUkVHX0ZSRVFfSU5DCisgKi8KKworc3RhdGljIHNzaXplX3QgYWQ1OTMzX3Nob3dfZnJlcXVlbmN5KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFkNTkzM19zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgbG9uZyBmcmVxcmVnOworCXVuaW9uIHsKKwkJdTMyIGQzMjsKKwkJdTggZDhbNF07CisJfSBkYXQ7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlyZXQgPSBhZDU5MzNfaTJjX3JlYWQoc3QtPmNsaWVudCwgdGhpc19hdHRyLT5hZGRyZXNzLCAzLCAmZGF0LmQ4WzFdKTsKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJZnJlcXJlZyA9IGJlMzJfdG9fY3B1KGRhdC5kMzIpICYgMHhGRkZGRkY7CisKKwlmcmVxcmVnID0gKHU2NCkgZnJlcXJlZyAqICh1NjQpIChzdC0+bWNsa19oeiAvIDQpOworCWRvX2RpdihmcmVxcmVnLCAxIDw8IDI3KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAoaW50KSBmcmVxcmVnKTsKK30KKworc3RhdGljIHNzaXplX3QgYWQ1OTMzX3N0b3JlX2ZyZXF1ZW5jeShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDU5MzNfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJbG9uZyB2YWw7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAodmFsID4gQUQ1OTMzX01BWF9PVVRQVVRfRlJFUV9IeikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlyZXQgPSBhZDU5MzNfc2V0X2ZyZXEoc3QsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihvdXRfdm9sdGFnZTBfZnJlcV9zdGFydCwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQlhZDU5MzNfc2hvd19mcmVxdWVuY3ksCisJCQlhZDU5MzNfc3RvcmVfZnJlcXVlbmN5LAorCQkJQUQ1OTMzX1JFR19GUkVRX1NUQVJUKTsKKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihvdXRfdm9sdGFnZTBfZnJlcV9pbmNyZW1lbnQsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJYWQ1OTMzX3Nob3dfZnJlcXVlbmN5LAorCQkJYWQ1OTMzX3N0b3JlX2ZyZXF1ZW5jeSwKKwkJCUFENTkzM19SRUdfRlJFUV9JTkMpOworCitzdGF0aWMgc3NpemVfdCBhZDU5MzNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQljaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDU5MzNfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJaW50IHJldCA9IDAsIGxlbiA9IDA7CisKKwltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKwlzd2l0Y2ggKHRoaXNfYXR0ci0+YWRkcmVzcykgeworCWNhc2UgQUQ1OTMzX09VVF9SQU5HRToKKwkJbGVuID0gc3ByaW50ZihidWYsICIlZFxuIiwKKwkJCSAgICAgIHN0LT5yYW5nZV9hdmFpbFsoc3QtPmN0cmxfaGIgPj4gMSkgJiAweDNdKTsKKwkJYnJlYWs7CisJY2FzZSBBRDU5MzNfT1VUX1JBTkdFX0FWQUlMOgorCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkICVkICVkICVkXG4iLCBzdC0+cmFuZ2VfYXZhaWxbMF0sCisJCQkgICAgICBzdC0+cmFuZ2VfYXZhaWxbM10sIHN0LT5yYW5nZV9hdmFpbFsyXSwKKwkJCSAgICAgIHN0LT5yYW5nZV9hdmFpbFsxXSk7CisJCWJyZWFrOworCWNhc2UgQUQ1OTMzX09VVF9TRVRUTElOR19DWUNMRVM6CisJCWxlbiA9IHNwcmludGYoYnVmLCAiJWRcbiIsIHN0LT5zZXR0bGluZ19jeWNsZXMpOworCQlicmVhazsKKwljYXNlIEFENTkzM19JTl9QR0FfR0FJTjoKKwkJbGVuID0gc3ByaW50ZihidWYsICIlc1xuIiwKKwkJCSAgICAgIChzdC0+Y3RybF9oYiAmIEFENTkzM19DVFJMX1BHQV9HQUlOXzEpID8KKwkJCSAgICAgICIxIiA6ICIwLjIiKTsKKwkJYnJlYWs7CisJY2FzZSBBRDU5MzNfSU5fUEdBX0dBSU5fQVZBSUw6CisJCWxlbiA9IHNwcmludGYoYnVmLCAiMSAwLjJcbiIpOworCQlicmVhazsKKwljYXNlIEFENTkzM19GUkVRX1BPSU5UUzoKKwkJbGVuID0gc3ByaW50ZihidWYsICIlZFxuIiwgc3QtPmZyZXFfcG9pbnRzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGFkNTkzM19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhZDU5MzNfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJbG9uZyB2YWw7CisJaW50IGksIHJldCA9IDA7CisJdW5zaWduZWQgc2hvcnQgZGF0OworCisJaWYgKHRoaXNfYXR0ci0+YWRkcmVzcyAhPSBBRDU5MzNfSU5fUEdBX0dBSU4pIHsKKwkJcmV0ID0gc3RyaWN0X3N0cnRvbChidWYsIDEwLCAmdmFsKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJc3dpdGNoICh0aGlzX2F0dHItPmFkZHJlc3MpIHsKKwljYXNlIEFENTkzM19PVVRfUkFOR0U6CisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCQlpZiAodmFsID09IHN0LT5yYW5nZV9hdmFpbFtpXSkgeworCQkJCXN0LT5jdHJsX2hiICY9IH5BRDU5MzNfQ1RSTF9SQU5HRSgweDMpOworCQkJCXN0LT5jdHJsX2hiIHw9IEFENTkzM19DVFJMX1JBTkdFKGkpOworCQkJCXJldCA9IGFkNTkzM19jbWQoc3QsIDApOworCQkJCWJyZWFrOworCQkJfQorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIEFENTkzM19JTl9QR0FfR0FJTjoKKwkJaWYgKHN5c2ZzX3N0cmVxKGJ1ZiwgIjEiKSkgeworCQkJc3QtPmN0cmxfaGIgfD0gQUQ1OTMzX0NUUkxfUEdBX0dBSU5fMTsKKwkJfSBlbHNlIGlmIChzeXNmc19zdHJlcShidWYsICIwLjIiKSkgeworCQkJc3QtPmN0cmxfaGIgJj0gfkFENTkzM19DVFJMX1BHQV9HQUlOXzE7CisJCX0gZWxzZSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gYWQ1OTMzX2NtZChzdCwgMCk7CisJCWJyZWFrOworCWNhc2UgQUQ1OTMzX09VVF9TRVRUTElOR19DWUNMRVM6CisJCXZhbCA9IGNsYW1wKHZhbCwgMEwsIDB4N0ZGTCk7CisJCXN0LT5zZXR0bGluZ19jeWNsZXMgPSB2YWw7CisKKwkJLyogMngsIDR4IGhhbmRsaW5nLCBzZWUgZGF0YXNoZWV0ICovCisJCWlmICh2YWwgPiA1MTEpCisJCQl2YWwgPSAodmFsID4+IDEpIHwgKDEgPDwgOSk7CisJCWVsc2UgaWYgKHZhbCA+IDEwMjIpCisJCQl2YWwgPSAodmFsID4+IDIpIHwgKDMgPDwgOSk7CisKKwkJZGF0ID0gY3B1X3RvX2JlMTYodmFsKTsKKwkJcmV0ID0gYWQ1OTMzX2kyY193cml0ZShzdC0+Y2xpZW50LAorCQkJCUFENTkzM19SRUdfU0VUVExJTkdfQ1lDTEVTLCAyLCAodTggKikmZGF0KTsKKwkJYnJlYWs7CisJY2FzZSBBRDU5MzNfRlJFUV9QT0lOVFM6CisJCXZhbCA9IGNsYW1wKHZhbCwgMEwsIDUxMUwpOworCQlzdC0+ZnJlcV9wb2ludHMgPSB2YWw7CisKKwkJZGF0ID0gY3B1X3RvX2JlMTYodmFsKTsKKwkJcmV0ID0gYWQ1OTMzX2kyY193cml0ZShzdC0+Y2xpZW50LCBBRDU5MzNfUkVHX0lOQ19OVU0sIDIsCisJCQkJICAgICAgICh1OCAqKSZkYXQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKK30KKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihvdXRfdm9sdGFnZTBfc2NhbGUsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJYWQ1OTMzX3Nob3csCisJCQlhZDU5MzNfc3RvcmUsCisJCQlBRDU5MzNfT1VUX1JBTkdFKTsKKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihvdXRfdm9sdGFnZTBfc2NhbGVfYXZhaWxhYmxlLCBTX0lSVUdPLAorCQkJYWQ1OTMzX3Nob3csCisJCQlOVUxMLAorCQkJQUQ1OTMzX09VVF9SQU5HRV9BVkFJTCk7CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW5fdm9sdGFnZTBfc2NhbGUsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJYWQ1OTMzX3Nob3csCisJCQlhZDU5MzNfc3RvcmUsCisJCQlBRDU5MzNfSU5fUEdBX0dBSU4pOworCitzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGluX3ZvbHRhZ2UwX3NjYWxlX2F2YWlsYWJsZSwgU19JUlVHTywKKwkJCWFkNTkzM19zaG93LAorCQkJTlVMTCwKKwkJCUFENTkzM19JTl9QR0FfR0FJTl9BVkFJTCk7CisKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIob3V0X3ZvbHRhZ2UwX2ZyZXFfcG9pbnRzLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCWFkNTkzM19zaG93LAorCQkJYWQ1OTMzX3N0b3JlLAorCQkJQUQ1OTMzX0ZSRVFfUE9JTlRTKTsKKworc3RhdGljIElJT19ERVZJQ0VfQVRUUihvdXRfdm9sdGFnZTBfc2V0dGxpbmdfY3ljbGVzLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCWFkNTkzM19zaG93LAorCQkJYWQ1OTMzX3N0b3JlLAorCQkJQUQ1OTMzX09VVF9TRVRUTElOR19DWUNMRVMpOworCisvKiBub3RlOgorICogaWRlYWxseSB3ZSB3b3VsZCBoYW5kbGUgdGhlIHNjYWxlIGF0dHJpYnV0ZXMgdmlhIHRoZSBpaW9faW5mbworICogKHJlYWR8d3JpdGUpX3JhdyBtZXRob2RzLCBob3dldmVyIHRoaXMgcGFydCBpcyBhIHVudHlwaWNhbCBzaW5jZSB3ZQorICogZG9uJ3QgY3JlYXRlIGRlZGljYXRlZCBzeXNmcyBjaGFubmVsIGF0dHJpYnV0ZXMgZm9yIG91dDAgYW5kIGluMC4KKyAqLworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkNTkzM19hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19kZXZfYXR0cl9vdXRfdm9sdGFnZTBfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dF92b2x0YWdlMF9zY2FsZV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dF92b2x0YWdlMF9mcmVxX3N0YXJ0LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9vdXRfdm9sdGFnZTBfZnJlcV9pbmNyZW1lbnQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX291dF92b2x0YWdlMF9mcmVxX3BvaW50cy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfb3V0X3ZvbHRhZ2UwX3NldHRsaW5nX2N5Y2xlcy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fdm9sdGFnZTBfc2NhbGUuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX3ZvbHRhZ2UwX3NjYWxlX2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkNTkzM19hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLmF0dHJzID0gYWQ1OTMzX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IGFkNTkzM19yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICBpbnQgKnZhbCwKKwkJCSAgIGludCAqdmFsMiwKKwkJCSAgIGxvbmcgbSkKK3sKKwlzdHJ1Y3QgYWQ1OTMzX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJdW5zaWduZWQgc2hvcnQgZGF0OworCWludCByZXQgPSAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJc3dpdGNoIChtKSB7CisJY2FzZSAwOgorCQlpZiAoaWlvX2J1ZmZlcl9lbmFibGVkKGluZGlvX2RldikpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXJldCA9IGFkNTkzM19jbWQoc3QsIEFENTkzM19DVFJMX01FQVNVUkVfVEVNUCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJCXJldCA9IGFkNTkzM193YWl0X2J1c3koc3QsIEFENTkzM19TVEFUX1RFTVBfVkFMSUQpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCisJCXJldCA9IGFkNTkzM19pMmNfcmVhZChzdC0+Y2xpZW50LAorCQkJCUFENTkzM19SRUdfVEVNUF9EQVRBLCAyLAorCQkJCSh1OCAqKSZkYXQpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCQltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCQlyZXQgPSBiZTE2X3RvX2NwdShkYXQpOworCQkvKiBUZW1wIGluIE1pbGxpIGRlZ3JlZXMgQ2Vsc2l1cyAqLworCQlpZiAocmV0IDwgODE5MikKKwkJCSp2YWwgPSByZXQgKiAxMDAwIC8gMzI7CisJCWVsc2UKKwkJCSp2YWwgPSAocmV0IC0gMTYzODQpICogMTAwMCAvIDMyOworCisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwl9CisKK291dDoKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gYWQ1OTMzX2luZm8gPSB7CisJLnJlYWRfcmF3ID0gJmFkNTkzM19yZWFkX3JhdywKKwkuYXR0cnMgPSAmYWQ1OTMzX2F0dHJpYnV0ZV9ncm91cCwKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBhZDU5MzNfcmluZ19wcmVlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3QgYWQ1OTMzX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisJc3RydWN0IGlpb19idWZmZXIgKnJpbmcgPSBpbmRpb19kZXYtPmJ1ZmZlcjsKKwlzaXplX3QgZF9zaXplOworCWludCByZXQ7CisKKwlpZiAoIXJpbmctPnNjYW5fY291bnQpCisJCXJldHVybiAtRUlOVkFMOworCisJZF9zaXplID0gcmluZy0+c2Nhbl9jb3VudCAqCisJCSBhZDU5MzNfY2hhbm5lbHNbMV0uc2Nhbl90eXBlLnN0b3JhZ2ViaXRzIC8gODsKKworCWlmIChpbmRpb19kZXYtPmJ1ZmZlci0+YWNjZXNzLT5zZXRfYnl0ZXNfcGVyX2RhdHVtKQorCQlpbmRpb19kZXYtPmJ1ZmZlci0+YWNjZXNzLT4KKwkJCXNldF9ieXRlc19wZXJfZGF0dW0oaW5kaW9fZGV2LT5idWZmZXIsIGRfc2l6ZSk7CisKKwlyZXQgPSBhZDU5MzNfcmVzZXQoc3QpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYWQ1OTMzX2NtZChzdCwgQUQ1OTMzX0NUUkxfU1RBTkRCWSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhZDU5MzNfY21kKHN0LCBBRDU5MzNfQ1RSTF9JTklUX1NUQVJUX0ZSRVEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJc3QtPnN0YXRlID0gQUQ1OTMzX0NUUkxfSU5JVF9TVEFSVF9GUkVROworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWQ1OTMzX3JpbmdfcG9zdGVuYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXN0cnVjdCBhZDU5MzNfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCS8qIEFENTkzM19DVFJMX0lOSVRfU1RBUlRfRlJFUToKKwkgKiBIaWdoIFEgY29tcGxleCBjaXJjdWl0cyByZXF1aXJlIGEgbG9uZyB0aW1lIHRvIHJlYWNoIHN0ZWFkeSBzdGF0ZS4KKwkgKiBUbyBmYWNpbGl0YXRlIHRoZSBtZWFzdXJlbWVudCBvZiBzdWNoIGltcGVkYW5jZXMsIHRoaXMgbW9kZSBhbGxvd3MKKwkgKiB0aGUgdXNlciBmdWxsIGNvbnRyb2wgb2YgdGhlIHNldHRsaW5nIHRpbWUgcmVxdWlyZW1lbnQgYmVmb3JlCisJICogZW50ZXJpbmcgc3RhcnQgZnJlcXVlbmN5IHN3ZWVwIG1vZGUgd2hlcmUgdGhlIGltcGVkYW5jZSBtZWFzdXJlbWVudAorCSAqIHRha2VzIHBsYWNlLiBJbiB0aGlzIG1vZGUgdGhlIGltcGVkYW5jZSBpcyBleGNpdGVkIHdpdGggdGhlCisJICogcHJvZ3JhbW1lZCBzdGFydCBmcmVxdWVuY3kgKGFkNTkzM19yaW5nX3ByZWVuYWJsZSksCisJICogYnV0IG5vIG1lYXN1cmVtZW50IHRha2VzIHBsYWNlLgorCSAqLworCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZzdC0+d29yaywKKwkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoQUQ1OTMzX0lOSVRfRVhDSVRBVElPTl9USU1FX21zKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWQ1OTMzX3JpbmdfcG9zdGRpc2FibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3QgYWQ1OTMzX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnN0LT53b3JrKTsKKwlyZXR1cm4gYWQ1OTMzX2NtZChzdCwgQUQ1OTMzX0NUUkxfUE9XRVJfRE9XTik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMgYWQ1OTMzX3Jpbmdfc2V0dXBfb3BzID0geworCS5wcmVlbmFibGUgPSAmYWQ1OTMzX3JpbmdfcHJlZW5hYmxlLAorCS5wb3N0ZW5hYmxlID0gJmFkNTkzM19yaW5nX3Bvc3RlbmFibGUsCisJLnBvc3RkaXNhYmxlID0gJmFkNTkzM19yaW5nX3Bvc3RkaXNhYmxlLAorfTsKKworc3RhdGljIGludCBhZDU5MzNfcmVnaXN0ZXJfcmluZ19mdW5jc19hbmRfaW5pdChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWluZGlvX2Rldi0+YnVmZmVyID0gaWlvX3N3X3JiX2FsbG9jYXRlKGluZGlvX2Rldik7CisJaWYgKCFpbmRpb19kZXYtPmJ1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBFZmZlY3RpdmVseSBzZWxlY3QgdGhlIHJpbmcgYnVmZmVyIGltcGxlbWVudGF0aW9uICovCisJaW5kaW9fZGV2LT5idWZmZXItPmFjY2VzcyA9ICZyaW5nX3N3X2FjY2Vzc19mdW5jczsKKworCS8qIFJpbmcgYnVmZmVyIGZ1bmN0aW9ucyAtIGhlcmUgdHJpZ2dlciBzZXR1cCByZWxhdGVkICovCisJaW5kaW9fZGV2LT5idWZmZXItPnNldHVwX29wcyA9ICZhZDU5MzNfcmluZ19zZXR1cF9vcHM7CisKKwlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX0JVRkZFUl9IQVJEV0FSRTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhZDU5MzNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFkNTkzM19zdGF0ZSAqc3QgPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IGFkNTkzM19zdGF0ZSwgd29yay53b3JrKTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKHN0LT5jbGllbnQpOworCXN0cnVjdCBpaW9fYnVmZmVyICpyaW5nID0gaW5kaW9fZGV2LT5idWZmZXI7CisJc2lnbmVkIHNob3J0IGJ1ZlsyXTsKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCWlmIChzdC0+c3RhdGUgPT0gQUQ1OTMzX0NUUkxfSU5JVF9TVEFSVF9GUkVRKSB7CisJCS8qIHN0YXJ0IHN3ZWVwICovCisJCWFkNTkzM19jbWQoc3QsIEFENTkzM19DVFJMX1NUQVJUX1NXRUVQKTsKKwkJc3QtPnN0YXRlID0gQUQ1OTMzX0NUUkxfU1RBUlRfU1dFRVA7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmc3QtPndvcmssIHN0LT5wb2xsX3RpbWVfamlmZmllcyk7CisJCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJCXJldHVybjsKKwl9CisKKwlhZDU5MzNfaTJjX3JlYWQoc3QtPmNsaWVudCwgQUQ1OTMzX1JFR19TVEFUVVMsIDEsICZzdGF0dXMpOworCisJaWYgKHN0YXR1cyAmIEFENTkzM19TVEFUX0RBVEFfVkFMSUQpIHsKKwkJYWQ1OTMzX2kyY19yZWFkKHN0LT5jbGllbnQsCisJCQkJdGVzdF9iaXQoMSwgcmluZy0+c2Nhbl9tYXNrKSA/CisJCQkJQUQ1OTMzX1JFR19SRUFMX0RBVEEgOiBBRDU5MzNfUkVHX0lNQUdfREFUQSwKKwkJCQlyaW5nLT5zY2FuX2NvdW50ICogMiwgKHU4ICopYnVmKTsKKworCQlpZiAocmluZy0+c2Nhbl9jb3VudCA9PSAyKSB7CisJCQlidWZbMF0gPSBiZTE2X3RvX2NwdShidWZbMF0pOworCQkJYnVmWzFdID0gYmUxNl90b19jcHUoYnVmWzFdKTsKKwkJfSBlbHNlIHsKKwkJCWJ1ZlswXSA9IGJlMTZfdG9fY3B1KGJ1ZlswXSk7CisJCX0KKwkJLyogc2F2ZSBkYXR1bSB0byB0aGUgcmluZyAqLworCQlyaW5nLT5hY2Nlc3MtPnN0b3JlX3RvKHJpbmcsICh1OCAqKWJ1ZiwgaWlvX2dldF90aW1lX25zKCkpOworCX0gZWxzZSB7CisJCS8qIG5vIGRhdGEgYXZhaWxhYmxlIC0gdHJ5IGFnYWluIGxhdGVyICovCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmc3QtPndvcmssIHN0LT5wb2xsX3RpbWVfamlmZmllcyk7CisJCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc3RhdHVzICYgQUQ1OTMzX1NUQVRfU1dFRVBfRE9ORSkgeworCQkvKiBsYXN0IHNhbXBsZSByZWNlaXZlZCAtIHBvd2VyIGRvd24gZG8gbm90aGluZyB1bnRpbAorCQkgKiB0aGUgcmluZyBlbmFibGUgaXMgdG9nZ2xlZCAqLworCQlhZDU5MzNfY21kKHN0LCBBRDU5MzNfQ1RSTF9QT1dFUl9ET1dOKTsKKwl9IGVsc2UgeworCQkvKiB3ZSBqdXN0IHJlY2VpdmVkIGEgdmFsaWQgZGF0dW0sIG1vdmUgb24gdG8gdGhlIG5leHQgKi8KKwkJYWQ1OTMzX2NtZChzdCwgQUQ1OTMzX0NUUkxfSU5DX0ZSRVEpOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnN0LT53b3JrLCBzdC0+cG9sbF90aW1lX2ppZmZpZXMpOworCX0KKworCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGFkNTkzM19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlpbnQgcmV0LCB2b2x0YWdlX3V2ID0gMDsKKwlzdHJ1Y3QgYWQ1OTMzX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgYWQ1OTMzX3N0YXRlICpzdDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZShzaXplb2YoKnN0KSk7CisJaWYgKGluZGlvX2RldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBpbmRpb19kZXYpOworCXN0LT5jbGllbnQgPSBjbGllbnQ7CisKKwlpZiAoIXBkYXRhKQorCQlzdC0+cGRhdGEgPSAmYWQ1OTMzX2RlZmF1bHRfcGRhdGE7CisJZWxzZQorCQlzdC0+cGRhdGEgPSBwZGF0YTsKKworCXN0LT5yZWcgPSByZWd1bGF0b3JfZ2V0KCZjbGllbnQtPmRldiwgInZjYyIpOworCWlmICghSVNfRVJSKHN0LT5yZWcpKSB7CisJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoc3QtPnJlZyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3B1dF9yZWc7CisJCXZvbHRhZ2VfdXYgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2Uoc3QtPnJlZyk7CisJfQorCisJaWYgKHZvbHRhZ2VfdXYpCisJCXN0LT52cmVmX212ID0gdm9sdGFnZV91diAvIDEwMDA7CisJZWxzZQorCQlzdC0+dnJlZl9tdiA9IHN0LT5wZGF0YS0+dnJlZl9tdjsKKworCWlmIChzdC0+cGRhdGEtPmV4dF9jbGtfSHopIHsKKwkJc3QtPm1jbGtfaHogPSBzdC0+cGRhdGEtPmV4dF9jbGtfSHo7CisJCXN0LT5jdHJsX2xiID0gQUQ1OTMzX0NUUkxfRVhUX1NZU0NMSzsKKwl9IGVsc2UgeworCQlzdC0+bWNsa19oeiA9IEFENTkzM19JTlRfT1NDX0ZSRVFfSHo7CisJCXN0LT5jdHJsX2xiID0gQUQ1OTMzX0NUUkxfSU5UX1NZU0NMSzsKKwl9CisKKwlhZDU5MzNfY2FsY19vdXRfcmFuZ2VzKHN0KTsKKwlJTklUX0RFTEFZRURfV09SSygmc3QtPndvcmssIGFkNTkzM193b3JrKTsKKwlzdC0+cG9sbF90aW1lX2ppZmZpZXMgPSBtc2Vjc190b19qaWZmaWVzKEFENTkzM19QT0xMX1RJTUVfbXMpOworCisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWluZGlvX2Rldi0+aW5mbyA9ICZhZDU5MzNfaW5mbzsKKwlpbmRpb19kZXYtPm5hbWUgPSBpZC0+bmFtZTsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGFkNTkzM19jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IDE7IC8qIG9ubHkgcmVnaXN0ZXIgdGVtcDBfaW5wdXQgKi8KKworCXJldCA9IGFkNTkzM19yZWdpc3Rlcl9yaW5nX2Z1bmNzX2FuZF9pbml0KGluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9kaXNhYmxlX3JlZzsKKworCS8qIHNraXAgdGVtcDBfaW5wdXQsIHJlZ2lzdGVyIGluMF8ocmVhbHxpbWFnKV9yYXcgKi8KKwlyZXQgPSBpaW9fYnVmZmVyX3JlZ2lzdGVyKGluZGlvX2RldiwgJmFkNTkzM19jaGFubmVsc1sxXSwgMik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl91bnJlZ19yaW5nOworCisJLyogZW5hYmxlIGJvdGggUkVBTCBhbmQgSU1BRyBjaGFubmVscyBieSBkZWZhdWx0ICovCisJaWlvX3NjYW5fbWFza19zZXQoaW5kaW9fZGV2LT5idWZmZXIsIDApOworCWlpb19zY2FuX21hc2tfc2V0KGluZGlvX2Rldi0+YnVmZmVyLCAxKTsKKworCXJldCA9IGFkNTkzM19zZXR1cChzdCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl91bmluaXRpYWxpemVfcmluZzsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOworCisJcmV0dXJuIDA7CisKK2Vycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOgorCWlpb19idWZmZXJfdW5yZWdpc3RlcihpbmRpb19kZXYpOworZXJyb3JfdW5yZWdfcmluZzoKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPmJ1ZmZlcik7CitlcnJvcl9kaXNhYmxlX3JlZzoKKwlpZiAoIUlTX0VSUihzdC0+cmVnKSkKKwkJcmVndWxhdG9yX2Rpc2FibGUoc3QtPnJlZyk7CitlcnJvcl9wdXRfcmVnOgorCWlmICghSVNfRVJSKHN0LT5yZWcpKQorCQlyZWd1bGF0b3JfcHV0KHN0LT5yZWcpOworCisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgX19kZXZleGl0IGludCBhZDU5MzNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBhZDU5MzNfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlpb19idWZmZXJfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+YnVmZmVyKTsKKwlpZiAoIUlTX0VSUihzdC0+cmVnKSkgeworCQlyZWd1bGF0b3JfZGlzYWJsZShzdC0+cmVnKTsKKwkJcmVndWxhdG9yX3B1dChzdC0+cmVnKTsKKwl9CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkNTkzM19pZFtdID0geworCXsgImFkNTkzMyIsIDAgfSwKKwl7ICJhZDU5MzQiLCAwIH0sCisJe30KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhZDU5MzNfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWQ1OTMzX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJhZDU5MzMiLAorCX0sCisJLnByb2JlID0gYWQ1OTMzX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDU5MzNfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBhZDU5MzNfaWQsCit9OworCitzdGF0aWMgX19pbml0IGludCBhZDU5MzNfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWQ1OTMzX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZDU5MzNfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZDU5MzNfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZhZDU5MzNfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkNTkzM19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWljaGFlbCBIZW5uZXJpY2ggPGhlbm5lcmljaEBibGFja2Zpbi51Y2xpbnV4Lm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQUQ1OTMzIEltcGVkYW5jZSBDb252LiBOZXR3b3JrIEFuYWx5emVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltcGVkYW5jZS1hbmFseXplci9hZDU5MzMuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW1wZWRhbmNlLWFuYWx5emVyL2FkNTkzMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNDBlNDIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltcGVkYW5jZS1hbmFseXplci9hZDU5MzMuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogQUQ1OTMzIEFENTkzNCBJbXBlZGFuY2UgQ29udmVydGVyLCBOZXR3b3JrIEFuYWx5emVyCisgKgorICogQ29weXJpZ2h0IDIwMTEgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwtMi4KKyAqLworCisjaWZuZGVmIElJT19BRENfQUQ1OTMzX0hfCisjZGVmaW5lIElJT19BRENfQUQ1OTMzX0hfCisKKy8qCisgKiBUT0RPOiBzdHJ1Y3QgYWQ1OTMzX3BsYXRmb3JtX2RhdGEgbmVlZHMgdG8gZ28gaW50byBpbmNsdWRlL2xpbnV4L2lpbworICovCisKKy8qKgorICogc3RydWN0IGFkNTkzM19wbGF0Zm9ybV9kYXRhIC0gcGxhdGZvcm0gc3BlY2lmaWMgZGF0YQorICogQGV4dF9jbGtfSHo6CQl0aGUgZXh0ZXJuYWwgY2xvY2sgZnJlcXVlbmN5IGluIEh6LCBpZiBub3Qgc2V0CisgKgkJCXRoZSBkcml2ZXIgdXNlcyB0aGUgaW50ZXJuYWwgY2xvY2sgKDE2Ljc3NiBNSHopCisgKiBAdnJlZl9tdjoJCXRoZSBleHRlcm5hbCByZWZlcmVuY2Ugdm9sdGFnZSBpbiBtaWxsaXZvbHQKKyAqLworCitzdHJ1Y3QgYWQ1OTMzX3BsYXRmb3JtX2RhdGEgeworCXVuc2lnbmVkIGxvbmcJCQlleHRfY2xrX0h6OworCXVuc2lnbmVkIHNob3J0CQkJdnJlZl9tdjsKK307CisKKyNlbmRpZiAvKiBJSU9fQURDX0FENTkzM19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L0tjb25maWcKaW5kZXggZTBlMDE0NC4uMmMyZjQ3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9LY29uZmlnCkBAIC0xLDE1ICsxLDE3IEBACiAjCiAjIElJTyBpbXUgZHJpdmVycyBjb25maWd1cmF0aW9uCiAjCi1jb21tZW50ICJJbmVydGlhbCBtZWFzdXJlbWVudCB1bml0cyIKK21lbnUgIkluZXJ0aWFsIG1lYXN1cmVtZW50IHVuaXRzIgogCiBjb25maWcgQURJUzE2NDAwCiAJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFESVMxNjQwMCBhbmQgc2ltaWxhciBJTVUgU1BJIGRyaXZlciIKIAlkZXBlbmRzIG9uIFNQSQotCXNlbGVjdCBJSU9fU1dfUklORyBpZiBJSU9fUklOR19CVUZGRVIKLQlzZWxlY3QgSUlPX1RSSUdHRVIgaWYgSUlPX1JJTkdfQlVGRkVSCisJc2VsZWN0IElJT19TV19SSU5HIGlmIElJT19CVUZGRVIKKwlzZWxlY3QgSUlPX1RSSUdHRVIgaWYgSUlPX0JVRkZFUgogCWhlbHAKLQkgIFNheSB5ZXMgaGVyZSB0byBidWlsZCBzdXBwb3J0IGZvciBBbmFsb2cgRGV2aWNlcyBhZGlzMTYzMDAsIGFkaXMxNjM1MCwKLQkgIGFkaXMxNjM1NCwgYWRpczE2MzU1LCBhZGlzMTYzNjAsIGFkaXMxNjM2MiwgYWRpczE2MzY0LCBhZGlzMTYzNjUsCi0JICBhZGlzMTY0MDAgYW5kIGFkaXMxNjQwNSB0cmlheGlhbCBpbmVydGlhbCBzZW5zb3JzIChhZGlzMTY0MDAgc2VyaWVzCi0JICBhbHNvIGhhdmUgbWFnbmV0b21ldGVycykuCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgYWRpczE2MzAwLCBhZGlzMTYzNDQsCisJICBhZGlzMTYzNTAsIGFkaXMxNjM1NCwgYWRpczE2MzU1LCBhZGlzMTYzNjAsIGFkaXMxNjM2MiwgYWRpczE2MzY0LAorCSAgYWRpczE2MzY1LCBhZGlzMTY0MDAgYW5kIGFkaXMxNjQwNSB0cmlheGlhbCBpbmVydGlhbCBzZW5zb3JzCisJICAoYWRpczE2NDAwIHNlcmllcyBhbHNvIGhhdmUgbWFnbmV0b21ldGVycykuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvTWFrZWZpbGUKaW5kZXggZDQ2YTY5MS4uMzQwMGExMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvTWFrZWZpbGUKQEAgLTMsNSArMyw1IEBACiAjCiAKIGFkaXMxNjQwMC15ICAgICAgICAgICAgIDo9IGFkaXMxNjQwMF9jb3JlLm8KLWFkaXMxNjQwMC0kKENPTkZJR19JSU9fUklOR19CVUZGRVIpICs9IGFkaXMxNjQwMF9yaW5nLm8gYWRpczE2NDAwX3RyaWdnZXIubworYWRpczE2NDAwLSQoQ09ORklHX0lJT19CVUZGRVIpICs9IGFkaXMxNjQwMF9yaW5nLm8gYWRpczE2NDAwX3RyaWdnZXIubwogb2JqLSQoQ09ORklHX0FESVMxNjQwMCkgKz0gYWRpczE2NDAwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2NDAwLmgKaW5kZXggMWY4ZjBjNi4uZjM1NDZlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2NDAwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2NDAwLmgKQEAgLTE4NCw3ICsxODQsNyBAQAogI2RlZmluZSBBRElTMTYzMDBfU0NBTl9JTkNMSV9YCTEyCiAjZGVmaW5lIEFESVMxNjMwMF9TQ0FOX0lOQ0xJX1kJMTMKIAotI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKKyNpZmRlZiBDT05GSUdfSUlPX0JVRkZFUgogdm9pZCBhZGlzMTY0MDBfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiBpbnQgYWRpczE2NDAwX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiAKQEAgLTE5Niw3ICsxOTYsNyBAQAogaW50IGFkaXMxNjQwMF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIHZvaWQgYWRpczE2NDAwX3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiAKLSNlbHNlIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKyNlbHNlIC8qIENPTkZJR19JSU9fQlVGRkVSICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhZGlzMTY0MDBfcmVtb3ZlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKQEAgLTIyNCw1ICsyMjQsNSBAQAogewogfQogCi0jZW5kaWYgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLworI2VuZGlmIC8qIENPTkZJR19JSU9fQlVGRkVSICovCiAjZW5kaWYgLyogU1BJX0FESVMxNjQwMF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2NDAwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMF9jb3JlLmMKaW5kZXggYTJjM2I2Ny4uZDA4MmEzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2NDAwX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDBfY29yZS5jCkBAIC0xNiw3ICsxNiw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpAQCAtMjUsMjEgKzI0LDE2IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vc3lzZnMuaCIKLSNpbmNsdWRlICIuLi9yaW5nX2dlbmVyaWMuaCIKLSNpbmNsdWRlICIuLi9hY2NlbC9hY2NlbC5oIgotI2luY2x1ZGUgIi4uL2FkYy9hZGMuaCIKLSNpbmNsdWRlICIuLi9neXJvL2d5cm8uaCIKLSNpbmNsdWRlICIuLi9tYWduZXRvbWV0ZXIvbWFnbmV0LmgiCi0KKyNpbmNsdWRlICIuLi9idWZmZXJfZ2VuZXJpYy5oIgogI2luY2x1ZGUgImFkaXMxNjQwMC5oIgogCi0jZGVmaW5lIERSSVZFUl9OQU1FCQkiYWRpczE2NDAwIgotCiBlbnVtIGFkaXMxNjQwMF9jaGlwX3ZhcmlhbnQgewogCUFESVMxNjMwMCwKKwlBRElTMTYzMzQsCiAJQURJUzE2MzUwLAogCUFESVMxNjM2MCwKIAlBRElTMTYzNjIsCkBAIC00OCwxOSArNDIsMTIgQEAKIAlBRElTMTY0MDAsCiB9OwogCi1zdGF0aWMgaW50IGFkaXMxNjQwMF9jaGVja19zdGF0dXMoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7Ci0KLS8qIEF0IHRoZSBtb21lbnQgdGhlIHNwaSBmcmFtZXdvcmsgZG9lc24ndCBhbGxvdyBnbG9iYWwgc2V0dGluZyBvZiBjc19jaGFuZ2UuCi0gKiBJdCdzIGluIHRoZSBsaWtlbHkgdG8gYmUgYWRkZWQgY29tbWVudCBhdCB0aGUgdG9wIG9mIHNwaS5oLgotICogVGhpcyBtZWFucyB0aGF0IHVzZSBjYW5ub3QgYmUgbWFkZSBvZiBzcGlfd3JpdGUgZXRjLgotICovCi0KIC8qKgogICogYWRpczE2NDAwX3NwaV93cml0ZV9yZWdfOCgpIC0gd3JpdGUgc2luZ2xlIGJ5dGUgdG8gYSByZWdpc3RlcgogICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBjaGlsZCBvZiBhY3R1YWwgZGV2aWNlIChpaW9fZGV2IG9yIGlpb190cmlnKQogICogQHJlZ19hZGRyZXNzOiB0aGUgYWRkcmVzcyBvZiB0aGUgcmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgogICogQHZhbDogdGhlIHZhbHVlIHRvIHdyaXRlCi0gKiovCisgKi8KIHN0YXRpYyBpbnQgYWRpczE2NDAwX3NwaV93cml0ZV9yZWdfOChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAogCQkJCSAgICAgdTggcmVnX2FkZHJlc3MsCiAJCQkJICAgICB1OCB2YWwpCkBAIC04NCw3ICs3MSwxMCBAQAogICogQHJlZ19hZGRyZXNzOiB0aGUgYWRkcmVzcyBvZiB0aGUgbG93ZXIgb2YgdGhlIHR3byByZWdpc3RlcnMuIFNlY29uZCByZWdpc3RlcgogICogICAgICAgICAgICAgICBpcyBhc3N1bWVkIHRvIGhhdmUgYWRkcmVzcyBvbmUgZ3JlYXRlci4KICAqIEB2YWw6IHZhbHVlIHRvIGJlIHdyaXR0ZW4KLSAqKi8KKyAqCisgKiBBdCB0aGUgbW9tZW50IHRoZSBzcGkgZnJhbWV3b3JrIGRvZXNuJ3QgYWxsb3cgZ2xvYmFsIHNldHRpbmcgb2YgY3NfY2hhbmdlLgorICogVGhpcyBtZWFucyB0aGF0IHVzZSBjYW5ub3QgYmUgbWFkZSBvZiBzcGlfd3JpdGUuCisgKi8KIHN0YXRpYyBpbnQgYWRpczE2NDAwX3NwaV93cml0ZV9yZWdfMTYoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKIAkJdTggbG93ZXJfcmVnX2FkZHJlc3MsCiAJCXUxNiB2YWx1ZSkKQEAgLTEyNiw2ICsxMTYsOSBAQAogICogQHJlZ19hZGRyZXNzOiB0aGUgYWRkcmVzcyBvZiB0aGUgbG93ZXIgb2YgdGhlIHR3byByZWdpc3RlcnMuIFNlY29uZCByZWdpc3RlcgogICogICAgICAgICAgICAgICBpcyBhc3N1bWVkIHRvIGhhdmUgYWRkcmVzcyBvbmUgZ3JlYXRlci4KICAqIEB2YWw6IHNvbWV3aGVyZSB0byBwYXNzIGJhY2sgdGhlIHZhbHVlIHJlYWQKKyAqCisgKiBBdCB0aGUgbW9tZW50IHRoZSBzcGkgZnJhbWV3b3JrIGRvZXNuJ3QgYWxsb3cgZ2xvYmFsIHNldHRpbmcgb2YgY3NfY2hhbmdlLgorICogVGhpcyBtZWFucyB0aGF0IHVzZSBjYW5ub3QgYmUgbWFkZSBvZiBzcGlfcmVhZC4KICAqKi8KIHN0YXRpYyBpbnQgYWRpczE2NDAwX3NwaV9yZWFkX3JlZ18xNihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAogCQl1OCBsb3dlcl9yZWdfYWRkcmVzcywKQEAgLTE1MCw4ICsxNDMsNiBAQAogCW11dGV4X2xvY2soJnN0LT5idWZfbG9jayk7CiAJc3QtPnR4WzBdID0gQURJUzE2NDAwX1JFQURfUkVHKGxvd2VyX3JlZ19hZGRyZXNzKTsKIAlzdC0+dHhbMV0gPSAwOwotCXN0LT50eFsyXSA9IDA7Ci0Jc3QtPnR4WzNdID0gMDsKIAogCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CiAJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXJzWzBdLCAmbXNnKTsKQEAgLTI0MCwyMyArMjMxLDI2IEBACiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCiB7Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWJvb2wgdmFsOworCWludCByZXQ7CiAKLQlpZiAobGVuIDwgMSkKLQkJcmV0dXJuIC0xOwotCXN3aXRjaCAoYnVmWzBdKSB7Ci0JY2FzZSAnMSc6Ci0JY2FzZSAneSc6Ci0JY2FzZSAnWSc6Ci0JCXJldHVybiBhZGlzMTY0MDBfcmVzZXQoaW5kaW9fZGV2KTsKKwlyZXQgPSBzdHJ0b2Jvb2woYnVmLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAodmFsKSB7CisJCXJldCA9IGFkaXMxNjQwMF9yZXNldChkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKIAl9Ci0JcmV0dXJuIC0xOworCisJcmV0dXJuIGxlbjsKIH0KIAogaW50IGFkaXMxNjQwMF9zZXRfaXJxKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIGJvb2wgZW5hYmxlKQogewogCWludCByZXQ7CiAJdTE2IG1zYzsKKwogCXJldCA9IGFkaXMxNjQwMF9zcGlfcmVhZF9yZWdfMTYoaW5kaW9fZGV2LCBBRElTMTY0MDBfTVNDX0NUUkwsICZtc2MpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfcmV0OwpAQCAtMjg5LDI0ICsyODMsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgYWRpczE2NDAwX3NlbGZfdGVzdChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQotewotCWludCByZXQ7Ci0JcmV0ID0gYWRpczE2NDAwX3NwaV93cml0ZV9yZWdfMTYoaW5kaW9fZGV2LAotCQkJQURJUzE2NDAwX01TQ19DVFJMLAotCQkJQURJUzE2NDAwX01TQ19DVFJMX01FTV9URVNUKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJmluZGlvX2Rldi0+ZGV2LCAicHJvYmxlbSBzdGFydGluZyBzZWxmIHRlc3QiKTsKLQkJZ290byBlcnJfcmV0OwotCX0KLQotCW1zbGVlcChBRElTMTY0MDBfTVRFU1RfREVMQVkpOwotCWFkaXMxNjQwMF9jaGVja19zdGF0dXMoaW5kaW9fZGV2KTsKLQotZXJyX3JldDoKLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgaW50IGFkaXMxNjQwMF9jaGVja19zdGF0dXMoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKIAl1MTYgc3RhdHVzOwpAQCAtMzU2LDExICszMzIsMjggQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IGFkaXMxNjQwMF9zZWxmX3Rlc3Qoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgcmV0OworCXJldCA9IGFkaXMxNjQwMF9zcGlfd3JpdGVfcmVnXzE2KGluZGlvX2RldiwKKwkJCUFESVMxNjQwMF9NU0NfQ1RSTCwKKwkJCUFESVMxNjQwMF9NU0NfQ1RSTF9NRU1fVEVTVCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZpbmRpb19kZXYtPmRldiwgInByb2JsZW0gc3RhcnRpbmcgc2VsZiB0ZXN0Iik7CisJCWdvdG8gZXJyX3JldDsKKwl9CisKKwltc2xlZXAoQURJUzE2NDAwX01URVNUX0RFTEFZKTsKKwlhZGlzMTY0MDBfY2hlY2tfc3RhdHVzKGluZGlvX2Rldik7CisKK2Vycl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBhZGlzMTY0MDBfaW5pdGlhbF9zZXR1cChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCWludCByZXQ7CiAJdTE2IHByb2RfaWQsIHNtcF9wcmQ7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJmluZGlvX2Rldi0+ZGV2OwogCXN0cnVjdCBhZGlzMTY0MDBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAogCS8qIHVzZSBsb3cgc3BpIHNwZWVkIGZvciBpbml0ICovCkBAIC0zNjgsMjkgKzM2MSwyNiBAQAogCXN0LT51cy0+bW9kZSA9IFNQSV9NT0RFXzM7CiAJc3BpX3NldHVwKHN0LT51cyk7CiAKLQkvKiBEaXNhYmxlIElSUSAqLwogCXJldCA9IGFkaXMxNjQwMF9zZXRfaXJxKGluZGlvX2RldiwgZmFsc2UpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycihkZXYsICJkaXNhYmxlIGlycSBmYWlsZWQiKTsKKwkJZGV2X2VycigmaW5kaW9fZGV2LT5kZXYsICJkaXNhYmxlIGlycSBmYWlsZWQiKTsKIAkJZ290byBlcnJfcmV0OwogCX0KIAotCS8qIERvIHNlbGYgdGVzdCAqLwogCXJldCA9IGFkaXMxNjQwMF9zZWxmX3Rlc3QoaW5kaW9fZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGV2LCAic2VsZiB0ZXN0IGZhaWx1cmUiKTsKKwkJZGV2X2VycigmaW5kaW9fZGV2LT5kZXYsICJzZWxmIHRlc3QgZmFpbHVyZSIpOwogCQlnb3RvIGVycl9yZXQ7CiAJfQogCi0JLyogUmVhZCBzdGF0dXMgcmVnaXN0ZXIgdG8gY2hlY2sgdGhlIHJlc3VsdCAqLwogCXJldCA9IGFkaXMxNjQwMF9jaGVja19zdGF0dXMoaW5kaW9fZGV2KTsKIAlpZiAocmV0KSB7CiAJCWFkaXMxNjQwMF9yZXNldChpbmRpb19kZXYpOwotCQlkZXZfZXJyKGRldiwgImRldmljZSBub3QgcGxheWluZyBiYWxsIC0+IHJlc2V0Iik7CisJCWRldl9lcnIoJmluZGlvX2Rldi0+ZGV2LCAiZGV2aWNlIG5vdCBwbGF5aW5nIGJhbGwgLT4gcmVzZXQiKTsKIAkJbXNsZWVwKEFESVMxNjQwMF9TVEFSVFVQX0RFTEFZKTsKIAkJcmV0ID0gYWRpczE2NDAwX2NoZWNrX3N0YXR1cyhpbmRpb19kZXYpOwogCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGRldiwgImdpdmluZyB1cCIpOworCQkJZGV2X2VycigmaW5kaW9fZGV2LT5kZXYsICJnaXZpbmcgdXAiKTsKIAkJCWdvdG8gZXJyX3JldDsKIAkJfQogCX0KQEAgLTQwMSwxMCArMzkxLDExIEBACiAJCQlnb3RvIGVycl9yZXQ7CiAKIAkJaWYgKChwcm9kX2lkICYgMHhGMDAwKSAhPSBzdC0+dmFyaWFudC0+cHJvZHVjdF9pZCkKLQkJCWRldl93YXJuKGRldiwgImluY29ycmVjdCBpZCIpOworCQkJZGV2X3dhcm4oJmluZGlvX2Rldi0+ZGV2LCAiaW5jb3JyZWN0IGlkIik7CiAKLQkJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRSAiOiBwcm9kX2lkIDB4JTA0eCBhdCBDUyVkIChpcnEgJWQpXG4iLAotCQkgICAgICAgcHJvZF9pZCwgc3QtPnVzLT5jaGlwX3NlbGVjdCwgc3QtPnVzLT5pcnEpOworCQlkZXZfaW5mbygmaW5kaW9fZGV2LT5kZXYsICIlczogcHJvZF9pZCAweCUwNHggYXQgQ1MlZCAoaXJxICVkKVxuIiwKKwkJICAgICAgIGluZGlvX2Rldi0+bmFtZSwgcHJvZF9pZCwKKwkJICAgICAgIHN0LT51cy0+Y2hpcF9zZWxlY3QsIHN0LT51cy0+aXJxKTsKIAl9CiAJLyogdXNlIGhpZ2ggc3BpIHNwZWVkIGlmIHBvc3NpYmxlICovCiAJcmV0ID0gYWRpczE2NDAwX3NwaV9yZWFkX3JlZ18xNihpbmRpb19kZXYsCkBAIC00MTQsMTUgKzQwNSwxMyBAQAogCQlzcGlfc2V0dXAoc3QtPnVzKTsKIAl9CiAKLQogZXJyX3JldDoKLQogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBJSU9fREVWX0FUVFJfU0FNUF9GUkVRKFNfSVdVU1IgfCBTX0lSVUdPLAotCQlhZGlzMTY0MDBfcmVhZF9mcmVxdWVuY3ksCi0JCWFkaXMxNjQwMF93cml0ZV9mcmVxdWVuY3kpOworCQkJICAgICAgYWRpczE2NDAwX3JlYWRfZnJlcXVlbmN5LAorCQkJICAgICAgYWRpczE2NDAwX3dyaXRlX2ZyZXF1ZW5jeSk7CiAKIHN0YXRpYyBJSU9fREVWSUNFX0FUVFIocmVzZXQsIFNfSVdVU1IsIE5VTEwsIGFkaXMxNjQwMF93cml0ZV9yZXNldCwgMCk7CiAKQEAgLTQ0NywyMyArNDM2LDIzIEBACiB9OwogCiBzdGF0aWMgdTggYWRpczE2NDAwX2FkZHJlc3Nlc1sxN11bMl0gPSB7Ci0JW2luX3N1cHBseV0gPSB7IEFESVMxNjQwMF9TVVBQTFlfT1VULCAwIH0sCisJW2luX3N1cHBseV0gPSB7IEFESVMxNjQwMF9TVVBQTFlfT1VUIH0sCiAJW2d5cm9feF0gPSB7IEFESVMxNjQwMF9YR1lST19PVVQsIEFESVMxNjQwMF9YR1lST19PRkYgfSwKIAlbZ3lyb195XSA9IHsgQURJUzE2NDAwX1lHWVJPX09VVCwgQURJUzE2NDAwX1lHWVJPX09GRiB9LAogCVtneXJvX3pdID0geyBBRElTMTY0MDBfWkdZUk9fT1VULCBBRElTMTY0MDBfWkdZUk9fT0ZGIH0sCiAJW2FjY2VsX3hdID0geyBBRElTMTY0MDBfWEFDQ0xfT1VULCBBRElTMTY0MDBfWEFDQ0xfT0ZGIH0sCiAJW2FjY2VsX3ldID0geyBBRElTMTY0MDBfWUFDQ0xfT1VULCBBRElTMTY0MDBfWUFDQ0xfT0ZGIH0sCiAJW2FjY2VsX3pdID0geyBBRElTMTY0MDBfWkFDQ0xfT1VULCBBRElTMTY0MDBfWkFDQ0xfT0ZGIH0sCi0JW21hZ25feF0gPSB7IEFESVMxNjQwMF9YTUFHTl9PVVQsIDAgfSwKLQlbbWFnbl95XSA9IHsgQURJUzE2NDAwX1lNQUdOX09VVCwgMCB9LAotCVttYWduX3pdID0geyBBRElTMTY0MDBfWk1BR05fT1VULCAwIH0sCi0JW3RlbXBdID0geyBBRElTMTY0MDBfVEVNUF9PVVQsIDAgfSwKKwlbbWFnbl94XSA9IHsgQURJUzE2NDAwX1hNQUdOX09VVCB9LAorCVttYWduX3ldID0geyBBRElTMTY0MDBfWU1BR05fT1VUIH0sCisJW21hZ25fel0gPSB7IEFESVMxNjQwMF9aTUFHTl9PVVQgfSwKKwlbdGVtcF0gPSB7IEFESVMxNjQwMF9URU1QX09VVCB9LAogCVt0ZW1wMF0gPSB7IEFESVMxNjM1MF9YVEVNUF9PVVQgfSwKIAlbdGVtcDFdID0geyBBRElTMTYzNTBfWVRFTVBfT1VUIH0sCiAJW3RlbXAyXSA9IHsgQURJUzE2MzUwX1pURU1QX09VVCB9LAotCVtpbjFdID0geyBBRElTMTY0MDBfQVVYX0FEQywgMCB9LAotCVtpbmNsaV94XSA9IHsgQURJUzE2MzAwX1BJVENIX09VVCwgMCB9LAotCVtpbmNsaV95XSA9IHsgQURJUzE2MzAwX1JPTExfT1VULCAwIH0KKwlbaW4xXSA9IHsgQURJUzE2NDAwX0FVWF9BREMgfSwKKwlbaW5jbGlfeF0gPSB7IEFESVMxNjMwMF9QSVRDSF9PVVQgfSwKKwlbaW5jbGlfeV0gPSB7IEFESVMxNjMwMF9ST0xMX09VVCB9CiB9OwogCiBzdGF0aWMgaW50IGFkaXMxNjQwMF93cml0ZV9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKQEAgLTQ3Myw2ICs0NjIsNyBAQAogCQkJICAgICAgIGxvbmcgbWFzaykKIHsKIAlpbnQgcmV0OworCiAJc3dpdGNoIChtYXNrKSB7CiAJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSk6CiAJCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOwpAQCAtNDkzLDkgKzQ4Myw4IEBACiAJCQkgICAgICBsb25nIG1hc2spCiB7CiAJc3RydWN0IGFkaXMxNjQwMF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCWludCByZXQ7CisJaW50IHJldCwgc2hpZnQ7CiAJczE2IHZhbDE2OwotCWludCBzaGlmdDsKIAogCXN3aXRjaCAobWFzaykgewogCWNhc2UgMDoKQEAgLTUxOCwxMSArNTA3LDExIEBACiAJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCk6CiAJY2FzZSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKToKIAkJc3dpdGNoIChjaGFuLT50eXBlKSB7Ci0JCWNhc2UgSUlPX0dZUk86CisJCWNhc2UgSUlPX0FOR0xfVkVMOgogCQkJKnZhbCA9IDA7CiAJCQkqdmFsMiA9IHN0LT52YXJpYW50LT5neXJvX3NjYWxlX21pY3JvOwogCQkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTUlDUk87Ci0JCWNhc2UgSUlPX0lOOgorCQljYXNlIElJT19WT0xUQUdFOgogCQkJKnZhbCA9IDA7CiAJCQlpZiAoY2hhbi0+Y2hhbm5lbCA9PSAwKQogCQkJCSp2YWwyID0gMjQxODsKQEAgLTU2NiwxMzUgKzU1NSwzNzEgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGFkaXMxNjQwMF9jaGFubmVsc1tdID0gewotCUlJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgInN1cHBseSIsIDAsIDAsCi0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwKLQkJIGluX3N1cHBseSwgQURJUzE2NDAwX1NDQU5fU1VQUExZLAotCQkgSUlPX1NUKCd1JywgMTQsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0dZUk8sIDEsIDAsIDAsIE5VTEwsIDAsIElJT19NT0RfWCwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NFUEFSQVRFKSB8Ci0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCSBneXJvX3gsIEFESVMxNjQwMF9TQ0FOX0dZUk9fWCwgSUlPX1NUKCdzJywgMTQsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0dZUk8sIDEsIDAsIDAsIE5VTEwsIDAsIElJT19NT0RfWSwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NFUEFSQVRFKSB8Ci0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCSBneXJvX3ksIEFESVMxNjQwMF9TQ0FOX0dZUk9fWSwgSUlPX1NUKCdzJywgMTQsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0dZUk8sIDEsIDAsIDAsIE5VTEwsIDAsIElJT19NT0RfWiwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NFUEFSQVRFKSB8Ci0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCSBneXJvX3osIEFESVMxNjQwMF9TQ0FOX0dZUk9fWiwgSUlPX1NUKCdzJywgMTQsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0FDQ0VMLCAxLCAwLCAwLCBOVUxMLCAwLCBJSU9fTU9EX1gsCi0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSkgfAotCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkgYWNjZWxfeCwgQURJUzE2NDAwX1NDQU5fQUNDX1gsIElJT19TVCgncycsIDE0LCAxNiwgMCksIDApLAotCUlJT19DSEFOKElJT19BQ0NFTCwgMSwgMCwgMCwgTlVMTCwgMCwgSUlPX01PRF9ZLAotCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQkJJQVNfU0VQQVJBVEUpIHwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJIGFjY2VsX3ksIEFESVMxNjQwMF9TQ0FOX0FDQ19ZLCBJSU9fU1QoJ3MnLCAxNCwgMTYsIDApLCAwKSwKLQlJSU9fQ0hBTihJSU9fQUNDRUwsIDEsIDAsIDAsIE5VTEwsIDAsIElJT19NT0RfWiwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NFUEFSQVRFKSB8Ci0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCSBhY2NlbF96LCBBRElTMTY0MDBfU0NBTl9BQ0NfWiwgSUlPX1NUKCdzJywgMTQsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX01BR04sIDEsIDAsIDAsIE5VTEwsIDAsIElJT19NT0RfWCwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJIG1hZ25feCwgQURJUzE2NDAwX1NDQU5fTUFHTl9YLCBJSU9fU1QoJ3MnLCAxNCwgMTYsIDApLCAwKSwKLQlJSU9fQ0hBTihJSU9fTUFHTiwgMSwgMCwgMCwgTlVMTCwgMCwgSUlPX01PRF9ZLAotCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkgbWFnbl95LCBBRElTMTY0MDBfU0NBTl9NQUdOX1ksIElJT19TVCgncycsIDE0LCAxNiwgMCksIDApLAotCUlJT19DSEFOKElJT19NQUdOLCAxLCAwLCAwLCBOVUxMLCAwLCBJSU9fTU9EX1osCi0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCSBtYWduX3osIEFESVMxNjQwMF9TQ0FOX01BR05fWiwgSUlPX1NUKCdzJywgMTQsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX1RFTVAsIDAsIDEsIDAsIE5VTEwsIDAsIDAsCi0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX09GRlNFVF9TRVBBUkFURSkgfAotCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TRVBBUkFURSksCi0JCSB0ZW1wLCBBRElTMTY0MDBfU0NBTl9URU1QLCBJSU9fU1QoJ3MnLCAxMiwgMTYsIDApLCAwKSwKLQlJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsIE5VTEwsIDEsIDAsCi0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwKLQkJIGluMSwgQURJUzE2NDAwX1NDQU5fQURDXzAsIElJT19TVCgncycsIDEyLCAxNiwgMCksIDApLAorCXsKKwkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJLmluZGV4ZWQgPSAxLAorCQkuY2hhbm5lbCA9IDAsCisJCS5leHRlbmRfbmFtZSA9ICJzdXBwbHkiLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TRVBBUkFURSksCisJCS5hZGRyZXNzID0gaW5fc3VwcGx5LAorCQkuc2Nhbl9pbmRleCA9IEFESVMxNjQwMF9TQ0FOX1NVUFBMWSwKKwkJLnNjYW5fdHlwZSA9IElJT19TVCgndScsIDE0LCAxNiwgMCkKKwl9LCB7CisJCS50eXBlID0gSUlPX0FOR0xfVkVMLAorCQkubW9kaWZpZWQgPSAxLAorCQkuY2hhbm5lbDIgPSBJSU9fTU9EX1gsCisJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSkgfAorCQkoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCisJCS5hZGRyZXNzID0gZ3lyb194LAorCQkuc2Nhbl9pbmRleCA9IEFESVMxNjQwMF9TQ0FOX0dZUk9fWCwKKwkJLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDE0LCAxNiwgMCkKKwl9LCB7CisJCS50eXBlID0gSUlPX0FOR0xfVkVMLAorCQkubW9kaWZpZWQgPSAxLAorCQkuY2hhbm5lbDIgPSBJSU9fTU9EX1ksCisJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSkgfAorCQkoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCisJCS5hZGRyZXNzID0gZ3lyb195LAorCQkuc2Nhbl9pbmRleCA9IEFESVMxNjQwMF9TQ0FOX0dZUk9fWSwKKwkJLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDE0LCAxNiwgMCksCisJfSwgeworCQkudHlwZSA9IElJT19BTkdMX1ZFTCwKKwkJLm1vZGlmaWVkID0gMSwKKwkJLmNoYW5uZWwyID0gSUlPX01PRF9aLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQkJJQVNfU0VQQVJBVEUpIHwKKwkJKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkuYWRkcmVzcyA9IGd5cm9feiwKKwkJLnNjYW5faW5kZXggPSBBRElTMTY0MDBfU0NBTl9HWVJPX1osCisJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3MnLCAxNCwgMTYsIDApLAorCX0sIHsKKwkJLnR5cGUgPSBJSU9fQUNDRUwsCisJCS5tb2RpZmllZCA9IDEsCisJCS5jaGFubmVsMiA9IElJT19NT0RfWCwKKwkJLmluZm9fbWFzayA9ICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NFUEFSQVRFKSB8CisJCSgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKKwkJLmFkZHJlc3MgPSBhY2NlbF94LAorCQkuc2Nhbl9pbmRleCA9IEFESVMxNjQwMF9TQ0FOX0FDQ19YLAorCQkuc2Nhbl90eXBlID0gSUlPX1NUKCdzJywgMTQsIDE2LCAwKSwKKwl9LCB7CisJCS50eXBlID0gSUlPX0FDQ0VMLAorCQkubW9kaWZpZWQgPSAxLAorCQkuY2hhbm5lbDIgPSBJSU9fTU9EX1ksCisJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSkgfAorCQkoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCisJCS5hZGRyZXNzID0gYWNjZWxfeSwKKwkJLnNjYW5faW5kZXggPSBBRElTMTY0MDBfU0NBTl9BQ0NfWSwKKwkJLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDE0LCAxNiwgMCksCisJfSwgeworCQkudHlwZSA9IElJT19BQ0NFTCwKKwkJLm1vZGlmaWVkID0gMSwKKwkJLmNoYW5uZWwyID0gSUlPX01PRF9aLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQkJJQVNfU0VQQVJBVEUpIHwKKwkJKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkuYWRkcmVzcyA9IGFjY2VsX3osCisJCS5zY2FuX2luZGV4ID0gQURJUzE2NDAwX1NDQU5fQUNDX1osCisJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3MnLCAxNCwgMTYsIDApLAorCX0sIHsKKwkJLnR5cGUgPSBJSU9fTUFHTiwKKwkJLm1vZGlmaWVkID0gMSwKKwkJLmNoYW5uZWwyID0gSUlPX01PRF9YLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkuYWRkcmVzcyA9IG1hZ25feCwKKwkJLnNjYW5faW5kZXggPSBBRElTMTY0MDBfU0NBTl9NQUdOX1gsCisJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3MnLCAxNCwgMTYsIDApLAorCX0sIHsKKwkJLnR5cGUgPSBJSU9fTUFHTiwKKwkJLm1vZGlmaWVkID0gMSwKKwkJLmNoYW5uZWwyID0gSUlPX01PRF9ZLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkuYWRkcmVzcyA9IG1hZ25feSwKKwkJLnNjYW5faW5kZXggPSBBRElTMTY0MDBfU0NBTl9NQUdOX1ksCisJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3MnLCAxNCwgMTYsIDApLAorCX0sIHsKKwkJLnR5cGUgPSBJSU9fTUFHTiwKKwkJLm1vZGlmaWVkID0gMSwKKwkJLmNoYW5uZWwyID0gSUlPX01PRF9aLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkuYWRkcmVzcyA9IG1hZ25feiwKKwkJLnNjYW5faW5kZXggPSBBRElTMTY0MDBfU0NBTl9NQUdOX1osCisJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3MnLCAxNCwgMTYsIDApLAorCX0sIHsKKwkJLnR5cGUgPSBJSU9fVEVNUCwKKwkJLmluZGV4ZWQgPSAxLAorCQkuY2hhbm5lbCA9IDAsCisJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX09GRlNFVF9TRVBBUkFURSkgfAorCQkoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwKKwkJLmFkZHJlc3MgPSB0ZW1wLAorCQkuc2Nhbl9pbmRleCA9IEFESVMxNjQwMF9TQ0FOX1RFTVAsCisJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3MnLCAxMiwgMTYsIDApLAorCX0sIHsKKwkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJLmluZGV4ZWQgPSAxLAorCQkuY2hhbm5lbCA9IDEsCisJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwKKwkJLmFkZHJlc3MgPSBpbjEsCisJCS5zY2FuX2luZGV4ID0gQURJUzE2NDAwX1NDQU5fQURDXzAsCisJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3MnLCAxMiwgMTYsIDApLAorCX0sCiAJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoMTIpCiB9OwogCiBzdGF0aWMgc3RydWN0IGlpb19jaGFuX3NwZWMgYWRpczE2MzUwX2NoYW5uZWxzW10gPSB7Ci0JSUlPX0NIQU4oSUlPX0lOLCAwLCAxLCAwLCAic3VwcGx5IiwgMCwgMCwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpLAotCQkgaW5fc3VwcGx5LCBBRElTMTY0MDBfU0NBTl9TVVBQTFksIElJT19TVCgndScsIDEyLCAxNiwgMCksIDApLAotCUlJT19DSEFOKElJT19HWVJPLCAxLCAwLCAwLCBOVUxMLCAwLCBJSU9fTU9EX1gsCi0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSkgfAotCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkgZ3lyb194LCBBRElTMTY0MDBfU0NBTl9HWVJPX1gsIElJT19TVCgncycsIDE0LCAxNiwgMCksIDApLAotCUlJT19DSEFOKElJT19HWVJPLCAxLCAwLCAwLCBOVUxMLCAwLCBJSU9fTU9EX1ksCi0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSkgfAotCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkgZ3lyb195LCBBRElTMTY0MDBfU0NBTl9HWVJPX1ksIElJT19TVCgncycsIDE0LCAxNiwgMCksIDApLAotCUlJT19DSEFOKElJT19HWVJPLCAxLCAwLCAwLCBOVUxMLCAwLCBJSU9fTU9EX1osCi0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSkgfAotCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkgZ3lyb196LCBBRElTMTY0MDBfU0NBTl9HWVJPX1osIElJT19TVCgncycsIDE0LCAxNiwgMCksIDApLAotCUlJT19DSEFOKElJT19BQ0NFTCwgMSwgMCwgMCwgTlVMTCwgMCwgSUlPX01PRF9YLAotCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQkJJQVNfU0VQQVJBVEUpIHwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJIGFjY2VsX3gsIEFESVMxNjQwMF9TQ0FOX0FDQ19YLCBJSU9fU1QoJ3MnLCAxNCwgMTYsIDApLCAwKSwKLQlJSU9fQ0hBTihJSU9fQUNDRUwsIDEsIDAsIDAsIE5VTEwsIDAsIElJT19NT0RfWSwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NFUEFSQVRFKSB8Ci0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCSBhY2NlbF95LCBBRElTMTY0MDBfU0NBTl9BQ0NfWSwgSUlPX1NUKCdzJywgMTQsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0FDQ0VMLCAxLCAwLCAwLCBOVUxMLCAwLCBJSU9fTU9EX1osCi0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSkgfAotCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkgYWNjZWxfeiwgQURJUzE2NDAwX1NDQU5fQUNDX1osIElJT19TVCgncycsIDE0LCAxNiwgMCksIDApLAotCUlJT19DSEFOKElJT19URU1QLCAwLCAxLCAwLCAieCIsIDAsIDAsCi0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX09GRlNFVF9TRVBBUkFURSkgfAotCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TRVBBUkFURSksCi0JCSB0ZW1wMCwgQURJUzE2MzUwX1NDQU5fVEVNUF9YLCBJSU9fU1QoJ3MnLCAxMiwgMTYsIDApLCAwKSwKLQlJSU9fQ0hBTihJSU9fVEVNUCwgMCwgMSwgMCwgInkiLCAxLCAwLAotCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19PRkZTRVRfU0VQQVJBVEUpIHwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpLAotCQkgdGVtcDEsIEFESVMxNjM1MF9TQ0FOX1RFTVBfWSwgSUlPX1NUKCdzJywgMTIsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX1RFTVAsIDAsIDEsIDAsICJ6IiwgMiwgMCwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fT0ZGU0VUX1NFUEFSQVRFKSB8Ci0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwKLQkJIHRlbXAyLCBBRElTMTYzNTBfU0NBTl9URU1QX1osIElJT19TVCgncycsIDEyLCAxNiwgMCksIDApLAotCUlJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgMSwgMCwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpLAotCQkgaW4xLCBBRElTMTYzNTBfU0NBTl9BRENfMCwgSUlPX1NUKCdzJywgMTIsIDE2LCAwKSwgMCksCisJeworCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkuaW5kZXhlZCA9IDEsCisJCS5jaGFubmVsID0gMCwKKwkJLmV4dGVuZF9uYW1lID0gInN1cHBseSIsCisJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwKKwkJLmFkZHJlc3MgPSBpbl9zdXBwbHksCisJCS5zY2FuX2luZGV4ID0gQURJUzE2NDAwX1NDQU5fU1VQUExZLAorCQkuc2Nhbl90eXBlID0gSUlPX1NUKCd1JywgMTIsIDE2LCAwKQorCX0sIHsKKwkJLnR5cGUgPSBJSU9fQU5HTF9WRUwsCisJCS5tb2RpZmllZCA9IDEsCisJCS5jaGFubmVsMiA9IElJT19NT0RfWCwKKwkJLmluZm9fbWFzayA9ICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NFUEFSQVRFKSB8CisJCSgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKKwkJLmFkZHJlc3MgPSBneXJvX3gsCisJCS5zY2FuX2luZGV4ID0gQURJUzE2NDAwX1NDQU5fR1lST19YLAorCQkuc2Nhbl90eXBlID0gSUlPX1NUKCdzJywgMTQsIDE2LCAwKQorCX0sIHsKKwkJLnR5cGUgPSBJSU9fQU5HTF9WRUwsCisJCS5tb2RpZmllZCA9IDEsCisJCS5jaGFubmVsMiA9IElJT19NT0RfWSwKKwkJLmluZm9fbWFzayA9ICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NFUEFSQVRFKSB8CisJCSgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKKwkJLmFkZHJlc3MgPSBneXJvX3ksCisJCS5zY2FuX2luZGV4ID0gQURJUzE2NDAwX1NDQU5fR1lST19ZLAorCQkuc2Nhbl90eXBlID0gSUlPX1NUKCdzJywgMTQsIDE2LCAwKSwKKwl9LCB7CisJCS50eXBlID0gSUlPX0FOR0xfVkVMLAorCQkubW9kaWZpZWQgPSAxLAorCQkuY2hhbm5lbDIgPSBJSU9fTU9EX1osCisJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSkgfAorCQkoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCisJCS5hZGRyZXNzID0gZ3lyb196LAorCQkuc2Nhbl9pbmRleCA9IEFESVMxNjQwMF9TQ0FOX0dZUk9fWiwKKwkJLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDE0LCAxNiwgMCksCisJfSwgeworCS50eXBlID0gSUlPX0FDQ0VMLAorCQkubW9kaWZpZWQgPSAxLAorCQkuY2hhbm5lbDIgPSBJSU9fTU9EX1gsCisJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSkgfAorCQkoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCisJCS5hZGRyZXNzID0gYWNjZWxfeCwKKwkJLnNjYW5faW5kZXggPSBBRElTMTY0MDBfU0NBTl9BQ0NfWCwKKwkJLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDE0LCAxNiwgMCksCisJfSwgeworCQkudHlwZSA9IElJT19BQ0NFTCwKKwkJLm1vZGlmaWVkID0gMSwKKwkJLmNoYW5uZWwyID0gSUlPX01PRF9ZLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQkJJQVNfU0VQQVJBVEUpIHwKKwkJKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkuYWRkcmVzcyA9IGFjY2VsX3ksCisJCS5zY2FuX2luZGV4ID0gQURJUzE2NDAwX1NDQU5fQUNDX1ksCisJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3MnLCAxNCwgMTYsIDApLAorCX0sIHsKKwkJLnR5cGUgPSBJSU9fQUNDRUwsCisJCS5tb2RpZmllZCA9IDEsCisJCS5jaGFubmVsMiA9IElJT19NT0RfWiwKKwkJLmluZm9fbWFzayA9ICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NFUEFSQVRFKSB8CisJCSgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKKwkJLmFkZHJlc3MgPSBhY2NlbF96LAorCQkuc2Nhbl9pbmRleCA9IEFESVMxNjQwMF9TQ0FOX0FDQ19aLAorCQkuc2Nhbl90eXBlID0gSUlPX1NUKCdzJywgMTQsIDE2LCAwKSwKKwl9LCB7CisJCS50eXBlID0gSUlPX1RFTVAsCisJCS5pbmRleGVkID0gMSwKKwkJLmNoYW5uZWwgPSAwLAorCQkuZXh0ZW5kX25hbWUgPSAieCIsCisJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX09GRlNFVF9TRVBBUkFURSkgfAorCQkoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwKKwkJLmFkZHJlc3MgPSB0ZW1wMCwKKwkJLnNjYW5faW5kZXggPSBBRElTMTYzNTBfU0NBTl9URU1QX1gsCisJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3MnLCAxMiwgMTYsIDApLAorCX0sIHsKKwkJLnR5cGUgPSBJSU9fVEVNUCwKKwkJLmluZGV4ZWQgPSAxLAorCQkuY2hhbm5lbCA9IDEsCisJCS5leHRlbmRfbmFtZSA9ICJ5IiwKKwkJLmluZm9fbWFzayA9ICgxIDw8IElJT19DSEFOX0lORk9fT0ZGU0VUX1NFUEFSQVRFKSB8CisJCSgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpLAorCQkuYWRkcmVzcyA9IHRlbXAxLAorCQkuc2Nhbl9pbmRleCA9IEFESVMxNjM1MF9TQ0FOX1RFTVBfWSwKKwkJLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDEyLCAxNiwgMCksCisJfSwgeworCQkudHlwZSA9IElJT19URU1QLAorCQkuaW5kZXhlZCA9IDEsCisJCS5jaGFubmVsID0gMiwKKwkJLmV4dGVuZF9uYW1lID0gInoiLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19PRkZTRVRfU0VQQVJBVEUpIHwKKwkJKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TRVBBUkFURSksCisJCS5hZGRyZXNzID0gdGVtcDIsCisJCS5zY2FuX2luZGV4ID0gQURJUzE2MzUwX1NDQU5fVEVNUF9aLAorCQkuc2Nhbl90eXBlID0gSUlPX1NUKCdzJywgMTIsIDE2LCAwKSwKKwl9LCB7CisJCS50eXBlID0gSUlPX1ZPTFRBR0UsCisJCS5pbmRleGVkID0gMSwKKwkJLmNoYW5uZWwgPSAxLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TRVBBUkFURSksCisJCS5hZGRyZXNzID0gaW4xLAorCQkuc2Nhbl9pbmRleCA9IEFESVMxNjM1MF9TQ0FOX0FEQ18wLAorCQkuc2Nhbl90eXBlID0gSUlPX1NUKCdzJywgMTIsIDE2LCAwKSwKKwl9LAogCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDExKQogfTsKIAogc3RhdGljIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGFkaXMxNjMwMF9jaGFubmVsc1tdID0gewotCUlJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgInN1cHBseSIsIDAsIDAsCi0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwKLQkJIGluX3N1cHBseSwgQURJUzE2NDAwX1NDQU5fU1VQUExZLCBJSU9fU1QoJ3UnLCAxMiwgMTYsIDApLCAwKSwKLQlJSU9fQ0hBTihJSU9fR1lSTywgMSwgMCwgMCwgTlVMTCwgMCwgSUlPX01PRF9YLAotCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQkJJQVNfU0VQQVJBVEUpIHwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJIGd5cm9feCwgQURJUzE2NDAwX1NDQU5fR1lST19YLCBJSU9fU1QoJ3MnLCAxNCwgMTYsIDApLCAwKSwKLQlJSU9fQ0hBTihJSU9fQUNDRUwsIDEsIDAsIDAsIE5VTEwsIDAsIElJT19NT0RfWCwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NFUEFSQVRFKSB8Ci0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCSBhY2NlbF94LCBBRElTMTY0MDBfU0NBTl9BQ0NfWCwgSUlPX1NUKCdzJywgMTQsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0FDQ0VMLCAxLCAwLCAwLCBOVUxMLCAwLCBJSU9fTU9EX1ksCi0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSkgfAotCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAotCQkgYWNjZWxfeSwgQURJUzE2NDAwX1NDQU5fQUNDX1ksIElJT19TVCgncycsIDE0LCAxNiwgMCksIDApLAotCUlJT19DSEFOKElJT19BQ0NFTCwgMSwgMCwgMCwgTlVMTCwgMCwgSUlPX01PRF9aLAotCQkgKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQkJJQVNfU0VQQVJBVEUpIHwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJIGFjY2VsX3osIEFESVMxNjQwMF9TQ0FOX0FDQ19aLCBJSU9fU1QoJ3MnLCAxNCwgMTYsIDApLCAwKSwKLQlJSU9fQ0hBTihJSU9fVEVNUCwgMCwgMSwgMCwgTlVMTCwgMCwgMCwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fT0ZGU0VUX1NFUEFSQVRFKSB8Ci0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwKLQkJIHRlbXAsIEFESVMxNjQwMF9TQ0FOX1RFTVAsIElJT19TVCgncycsIDEyLCAxNiwgMCksIDApLAotCUlJT19DSEFOKElJT19JTiwgMCwgMSwgMCwgTlVMTCwgMSwgMCwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpLAotCQkgaW4xLCBBRElTMTYzNTBfU0NBTl9BRENfMCwgSUlPX1NUKCdzJywgMTIsIDE2LCAwKSwgMCksCi0JSUlPX0NIQU4oSUlPX0lOQ0xJLCAxLCAwLCAwLCBOVUxMLCAwLCBJSU9fTU9EX1gsCi0JCSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCi0JCSBpbmNsaV94LCBBRElTMTYzMDBfU0NBTl9JTkNMSV9YLCBJSU9fU1QoJ3MnLCAxMywgMTYsIDApLCAwKSwKLQlJSU9fQ0hBTihJSU9fSU5DTEksIDEsIDAsIDAsIE5VTEwsIDAsIElJT19NT0RfWSwKLQkJICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKLQkJIGluY2xpX3ksIEFESVMxNjMwMF9TQ0FOX0lOQ0xJX1ksIElJT19TVCgncycsIDEzLCAxNiwgMCksIDApLAorCXsKKwkJLnR5cGUgPSBJSU9fVk9MVEFHRSwKKwkJLmluZGV4ZWQgPSAxLAorCQkuY2hhbm5lbCA9IDAsCisJCS5leHRlbmRfbmFtZSA9ICJzdXBwbHkiLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TRVBBUkFURSksCisJCS5hZGRyZXNzID0gaW5fc3VwcGx5LAorCQkuc2Nhbl9pbmRleCA9IEFESVMxNjQwMF9TQ0FOX1NVUFBMWSwKKwkJLnNjYW5fdHlwZSA9IElJT19TVCgndScsIDEyLCAxNiwgMCkKKwl9LCB7CisJCS50eXBlID0gSUlPX0FOR0xfVkVMLAorCQkubW9kaWZpZWQgPSAxLAorCQkuY2hhbm5lbDIgPSBJSU9fTU9EX1gsCisJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSkgfAorCQkoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCisJCS5hZGRyZXNzID0gZ3lyb194LAorCQkuc2Nhbl9pbmRleCA9IEFESVMxNjQwMF9TQ0FOX0dZUk9fWCwKKwkJLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDE0LCAxNiwgMCksCisJfSwgeworCQkudHlwZSA9IElJT19BQ0NFTCwKKwkJLm1vZGlmaWVkID0gMSwKKwkJLmNoYW5uZWwyID0gSUlPX01PRF9YLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQkJJQVNfU0VQQVJBVEUpIHwKKwkJKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkuYWRkcmVzcyA9IGFjY2VsX3gsCisJCS5zY2FuX2luZGV4ID0gQURJUzE2NDAwX1NDQU5fQUNDX1gsCisJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3MnLCAxNCwgMTYsIDApLAorCX0sIHsKKwkJLnR5cGUgPSBJSU9fQUNDRUwsCisJCS5tb2RpZmllZCA9IDEsCisJCS5jaGFubmVsMiA9IElJT19NT0RfWSwKKwkJLmluZm9fbWFzayA9ICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NFUEFSQVRFKSB8CisJCSgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKKwkJLmFkZHJlc3MgPSBhY2NlbF95LAorCQkuc2Nhbl9pbmRleCA9IEFESVMxNjQwMF9TQ0FOX0FDQ19ZLAorCQkuc2Nhbl90eXBlID0gSUlPX1NUKCdzJywgMTQsIDE2LCAwKSwKKwl9LCB7CisJCS50eXBlID0gSUlPX0FDQ0VMLAorCQkubW9kaWZpZWQgPSAxLAorCQkuY2hhbm5lbDIgPSBJSU9fTU9EX1osCisJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSkgfAorCQkoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCisJCS5hZGRyZXNzID0gYWNjZWxfeiwKKwkJLnNjYW5faW5kZXggPSBBRElTMTY0MDBfU0NBTl9BQ0NfWiwKKwkJLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDE0LCAxNiwgMCksCisJfSwgeworCQkudHlwZSA9IElJT19URU1QLAorCQkuaW5kZXhlZCA9IDEsCisJCS5jaGFubmVsID0gMCwKKwkJLmluZm9fbWFzayA9ICgxIDw8IElJT19DSEFOX0lORk9fT0ZGU0VUX1NFUEFSQVRFKSB8CisJCSgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpLAorCQkuYWRkcmVzcyA9IHRlbXAsCisJCS5zY2FuX2luZGV4ID0gQURJUzE2NDAwX1NDQU5fVEVNUCwKKwkJLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDEyLCAxNiwgMCksCisJfSwgeworCQkudHlwZSA9IElJT19WT0xUQUdFLAorCQkuaW5kZXhlZCA9IDEsCisJCS5jaGFubmVsID0gMSwKKwkJLmluZm9fbWFzayA9ICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpLAorCQkuYWRkcmVzcyA9IGluMSwKKwkJLnNjYW5faW5kZXggPSBBRElTMTYzNTBfU0NBTl9BRENfMCwKKwkJLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDEyLCAxNiwgMCksCisJfSwgeworCQkudHlwZSA9IElJT19JTkNMSSwKKwkJLm1vZGlmaWVkID0gMSwKKwkJLmNoYW5uZWwyID0gSUlPX01PRF9YLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkuYWRkcmVzcyA9IGluY2xpX3gsCisJCS5zY2FuX2luZGV4ID0gQURJUzE2MzAwX1NDQU5fSU5DTElfWCwKKwkJLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDEzLCAxNiwgMCksCisJfSwgeworCQkudHlwZSA9IElJT19JTkNMSSwKKwkJLm1vZGlmaWVkID0gMSwKKwkJLmNoYW5uZWwyID0gSUlPX01PRF9ZLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkuYWRkcmVzcyA9IGluY2xpX3ksCisJCS5zY2FuX2luZGV4ID0gQURJUzE2MzAwX1NDQU5fSU5DTElfWSwKKwkJLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDEzLCAxNiwgMCksCisJfSwKIAlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCgxNCkKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBhZGlzMTYzMzRfY2hhbm5lbHNbXSA9IHsKKwl7CisJCS50eXBlID0gSUlPX0FOR0xfVkVMLAorCQkubW9kaWZpZWQgPSAxLAorCQkuY2hhbm5lbDIgPSBJSU9fTU9EX1gsCisJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSkgfAorCQkoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCisJCS5hZGRyZXNzID0gZ3lyb194LAorCQkuc2Nhbl9pbmRleCA9IEFESVMxNjQwMF9TQ0FOX0dZUk9fWCwKKwkJLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDE0LCAxNiwgMCksCisJfSwgeworCQkudHlwZSA9IElJT19BTkdMX1ZFTCwKKwkJLm1vZGlmaWVkID0gMSwKKwkJLmNoYW5uZWwyID0gSUlPX01PRF9ZLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQkJJQVNfU0VQQVJBVEUpIHwKKwkJKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkuYWRkcmVzcyA9IGd5cm9feSwKKwkJLnNjYW5faW5kZXggPSBBRElTMTY0MDBfU0NBTl9HWVJPX1ksCisJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3MnLCAxNCwgMTYsIDApLAorCX0sIHsKKwkJLnR5cGUgPSBJSU9fQU5HTF9WRUwsCisJCS5tb2RpZmllZCA9IDEsCisJCS5jaGFubmVsMiA9IElJT19NT0RfWiwKKwkJLmluZm9fbWFzayA9ICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NFUEFSQVRFKSB8CisJCSgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKKwkJLmFkZHJlc3MgPSBneXJvX3osCisJCS5zY2FuX2luZGV4ID0gQURJUzE2NDAwX1NDQU5fR1lST19aLAorCQkuc2Nhbl90eXBlID0gSUlPX1NUKCdzJywgMTQsIDE2LCAwKSwKKwl9LCB7CisJCS50eXBlID0gSUlPX0FDQ0VMLAorCQkubW9kaWZpZWQgPSAxLAorCQkuY2hhbm5lbDIgPSBJSU9fTU9EX1gsCisJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCQklBU19TRVBBUkFURSkgfAorCQkoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NIQVJFRCksCisJCS5hZGRyZXNzID0gYWNjZWxfeCwKKwkJLnNjYW5faW5kZXggPSBBRElTMTY0MDBfU0NBTl9BQ0NfWCwKKwkJLnNjYW5fdHlwZSA9IElJT19TVCgncycsIDE0LCAxNiwgMCksCisJfSwgeworCQkudHlwZSA9IElJT19BQ0NFTCwKKwkJLm1vZGlmaWVkID0gMSwKKwkJLmNoYW5uZWwyID0gSUlPX01PRF9ZLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQkJJQVNfU0VQQVJBVEUpIHwKKwkJKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkuYWRkcmVzcyA9IGFjY2VsX3ksCisJCS5zY2FuX2luZGV4ID0gQURJUzE2NDAwX1NDQU5fQUNDX1ksCisJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3MnLCAxNCwgMTYsIDApLAorCX0sIHsKKwkJLnR5cGUgPSBJSU9fQUNDRUwsCisJCS5tb2RpZmllZCA9IDEsCisJCS5jaGFubmVsMiA9IElJT19NT0RfWiwKKwkJLmluZm9fbWFzayA9ICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJCSUFTX1NFUEFSQVRFKSB8CisJCSgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKSwKKwkJLmFkZHJlc3MgPSBhY2NlbF96LAorCQkuc2Nhbl9pbmRleCA9IEFESVMxNjQwMF9TQ0FOX0FDQ19aLAorCQkuc2Nhbl90eXBlID0gSUlPX1NUKCdzJywgMTQsIDE2LCAwKSwKKwl9LCB7CisJCS50eXBlID0gSUlPX1RFTVAsCisJCS5pbmRleGVkID0gMSwKKwkJLmNoYW5uZWwgPSAwLAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQkJJQVNfU0VQQVJBVEUpIHwKKwkJKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAorCQkuYWRkcmVzcyA9IGFjY2VsX3osCisJCS5zY2FuX2luZGV4ID0gQURJUzE2NDAwX1NDQU5fQUNDX1osCisJCS5zY2FuX3R5cGUgPSBJSU9fU1QoJ3MnLCAxNCwgMTYsIDApLAorCX0sCisJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoMTIpCit9OworCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRpczE2NDAwX2F0dHJpYnV0ZXNbXSA9IHsKIAkmaWlvX2Rldl9hdHRyX3NhbXBsaW5nX2ZyZXF1ZW5jeS5kZXZfYXR0ci5hdHRyLAogCSZpaW9fY29uc3RfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3lfYXZhaWxhYmxlLmRldl9hdHRyLmF0dHIsCkBAIC03MTksNiArOTQ0LDE2IEBACiAJCSgxIDw8IEFESVMxNjMwMF9TQ0FOX0lOQ0xJX1gpIHwgKDEgPDwgQURJUzE2MzAwX1NDQU5fSU5DTElfWSkgfAogCQkoMSA8PCAxNCksCiAJfSwKKwlbQURJUzE2MzM0XSA9IHsKKwkJLmNoYW5uZWxzID0gYWRpczE2MzM0X2NoYW5uZWxzLAorCQkubnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShhZGlzMTYzMzRfY2hhbm5lbHMpLAorCQkuZ3lyb19zY2FsZV9taWNybyA9IDg3MywKKwkJLmFjY2VsX3NjYWxlX21pY3JvID0gOTgxLAorCQkuZGVmYXVsdF9zY2FuX21hc2sgPSAoMSA8PCBBRElTMTY0MDBfU0NBTl9HWVJPX1gpIHwKKwkJKDEgPDwgQURJUzE2NDAwX1NDQU5fR1lST19ZKSB8ICgxIDw8IEFESVMxNjQwMF9TQ0FOX0dZUk9fWikgfAorCQkoMSA8PCBBRElTMTY0MDBfU0NBTl9BQ0NfWCkgfCAoMSA8PCBBRElTMTY0MDBfU0NBTl9BQ0NfWSkgfAorCQkoMSA8PCBBRElTMTY0MDBfU0NBTl9BQ0NfWiksCisJfSwKIAlbQURJUzE2MzUwXSA9IHsKIAkJLmNoYW5uZWxzID0gYWRpczE2MzUwX2NoYW5uZWxzLAogCQkubnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShhZGlzMTYzNTBfY2hhbm5lbHMpLApAQCAtNzgzLDcgKzEwMTgsNyBAQAogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhZGlzMTY0MDBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlpbnQgcmV0LCByZWdkb25lID0gMDsKKwlpbnQgcmV0OwogCXN0cnVjdCBhZGlzMTY0MDBfc3RhdGUgKnN0OwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKHNpemVvZigqc3QpKTsKIAlpZiAoaW5kaW9fZGV2ID09IE5VTEwpIHsKQEAgLTgxMCwyMCArMTA0NSwxNSBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CiAKLQlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcl91bnJlZ19yaW5nX2Z1bmNzOwotCXJlZ2RvbmUgPSAxOwotCi0JcmV0ID0gaWlvX3JpbmdfYnVmZmVyX3JlZ2lzdGVyX2V4KGluZGlvX2Rldi0+cmluZywgMCwKLQkJCQkJICBzdC0+dmFyaWFudC0+Y2hhbm5lbHMsCi0JCQkJCSAgc3QtPnZhcmlhbnQtPm51bV9jaGFubmVscyk7CisJcmV0ID0gaWlvX2J1ZmZlcl9yZWdpc3RlcihpbmRpb19kZXYsCisJCQkJICBzdC0+dmFyaWFudC0+Y2hhbm5lbHMsCisJCQkJICBzdC0+dmFyaWFudC0+bnVtX2NoYW5uZWxzKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnNwaS0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHJpbmdcbiIpOwogCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CiAJfQogCi0JaWYgKHNwaS0+aXJxICYmIGdwaW9faXNfdmFsaWQoaXJxX3RvX2dwaW8oc3BpLT5pcnEpKSA+IDApIHsKKwlpZiAoc3BpLT5pcnEpIHsKIAkJcmV0ID0gYWRpczE2NDAwX3Byb2JlX3RyaWdnZXIoaW5kaW9fZGV2KTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc7CkBAIC04MzMsMjAgKzEwNjMsMjEgQEAKIAlyZXQgPSBhZGlzMTY0MDBfaW5pdGlhbF9zZXR1cChpbmRpb19kZXYpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfcmVtb3ZlX3RyaWdnZXI7CisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmVtb3ZlX3RyaWdnZXI7CisKIAlyZXR1cm4gMDsKIAogZXJyb3JfcmVtb3ZlX3RyaWdnZXI6Ci0JaWYgKGluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19SSU5HX1RSSUdHRVJFRCkKKwlpZiAoaW5kaW9fZGV2LT5tb2RlcyAmIElORElPX0JVRkZFUl9UUklHR0VSRUQpCiAJCWFkaXMxNjQwMF9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOwogZXJyb3JfdW5pbml0aWFsaXplX3Jpbmc6Ci0JaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fYnVmZmVyX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIGVycm9yX3VucmVnX3JpbmdfZnVuY3M6CiAJYWRpczE2NDAwX3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKIGVycm9yX2ZyZWVfZGV2OgotCWlmIChyZWdkb25lKQotCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKLQllbHNlCi0JCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogZXJyb3JfcmV0OgogCXJldHVybiByZXQ7CiB9CkBAIC04NTcsMTQgKzEwODgsMTUgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSAgc3BpX2dldF9kcnZkYXRhKHNwaSk7CiAKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIAlyZXQgPSBhZGlzMTY0MDBfc3RvcF9kZXZpY2UoaW5kaW9fZGV2KTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9yZXQ7CiAKIAlhZGlzMTY0MDBfcmVtb3ZlX3RyaWdnZXIoaW5kaW9fZGV2KTsKLQlpaW9fcmluZ19idWZmZXJfdW5yZWdpc3RlcihpbmRpb19kZXYtPnJpbmcpOworCWlpb19idWZmZXJfdW5yZWdpc3RlcihpbmRpb19kZXYpOwogCWFkaXMxNjQwMF91bmNvbmZpZ3VyZV9yaW5nKGluZGlvX2Rldik7Ci0JaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiAKIAlyZXR1cm4gMDsKIApAQCAtODc0LDYgKzExMDYsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgYWRpczE2NDAwX2lkW10gPSB7CiAJeyJhZGlzMTYzMDAiLCBBRElTMTYzMDB9LAorCXsiYWRpczE2MzM0IiwgQURJUzE2MzM0fSwKIAl7ImFkaXMxNjM1MCIsIEFESVMxNjM1MH0sCiAJeyJhZGlzMTYzNTQiLCBBRElTMTYzNTB9LAogCXsiYWRpczE2MzU1IiwgQURJUzE2MzUwfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMF9yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDBfcmluZy5jCmluZGV4IDM2MTIzNzMuLmMzNjgyNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMF9yaW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2NDAwX3JpbmcuYwpAQCAtMSwyMSArMSwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKLSNpbmNsdWRlICIuLi9zeXNmcy5oIgogI2luY2x1ZGUgIi4uL3Jpbmdfc3cuaCIKLSNpbmNsdWRlICIuLi9hY2NlbC9hY2NlbC5oIgotI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKKyNpbmNsdWRlICIuLi90cmlnZ2VyX2NvbnN1bWVyLmgiCiAjaW5jbHVkZSAiYWRpczE2NDAwLmgiCiAKIC8qKgpAQCAtODcsMTMgKzc5LDEzIEBACiAJaW50IGksIGogPSAwLCByZXQ7CiAJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcnM7CiAKLQl4ZmVycyA9IGt6YWxsb2Moc2l6ZW9mKCp4ZmVycykqaW5kaW9fZGV2LT5yaW5nLT5zY2FuX2NvdW50ICsgMSwKKwl4ZmVycyA9IGt6YWxsb2Moc2l6ZW9mKCp4ZmVycykqaW5kaW9fZGV2LT5idWZmZXItPnNjYW5fY291bnQgKyAxLAogCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKHhmZXJzID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmVhZF9hbGxfdHhfYXJyYXkpOyBpKyspCi0JCWlmIChpbmRpb19kZXYtPnJpbmctPnNjYW5fbWFzayAmICgxIDw8IGkpKSB7CisJCWlmICh0ZXN0X2JpdChpLCBpbmRpb19kZXYtPmJ1ZmZlci0+c2Nhbl9tYXNrKSkgewogCQkJeGZlcnNbal0udHhfYnVmID0gJnJlYWRfYWxsX3R4X2FycmF5W2ldOwogCQkJeGZlcnNbal0uYml0c19wZXJfd29yZCA9IDE2OwogCQkJeGZlcnNbal0ubGVuID0gMjsKQEAgLTEwNCw3ICs5Niw3IEBACiAJeGZlcnNbal0ubGVuID0gMjsKIAogCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7Ci0JZm9yIChqID0gMDsgaiA8IGluZGlvX2Rldi0+cmluZy0+c2Nhbl9jb3VudCArIDE7IGorKykKKwlmb3IgKGogPSAwOyBqIDwgaW5kaW9fZGV2LT5idWZmZXItPnNjYW5fY291bnQgKyAxOyBqKyspCiAJCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyc1tqXSwgJm1zZyk7CiAKIAlyZXQgPSBzcGlfc3luYyhzdC0+dXMsICZtc2cpOwpAQCAtMTE5LDEzICsxMTEsMTQgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBhZGlzMTY0MDBfdHJpZ2dlcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnApCiB7CiAJc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmID0gcDsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPmluZGlvX2RldjsKIAlzdHJ1Y3QgYWRpczE2NDAwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0Jc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+cmluZzsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+YnVmZmVyOwogCWludCBpID0gMCwgaiwgcmV0ID0gMDsKIAlzMTYgKmRhdGE7CiAJc2l6ZV90IGRhdGFzaXplID0gcmluZy0+YWNjZXNzLT5nZXRfYnl0ZXNfcGVyX2RhdHVtKHJpbmcpOwotCXVuc2lnbmVkIGxvbmcgbWFzayA9IHJpbmctPnNjYW5fbWFzazsKKwkvKiBBc3VtcHRpb24gdGhhdCBsb25nIGlzIGVub3VnaCBmb3IgbWF4aW11bSBjaGFubmVscyAqLworCXVuc2lnbmVkIGxvbmcgbWFzayA9ICpyaW5nLT5zY2FuX21hc2s7CiAKIAlkYXRhID0ga21hbGxvYyhkYXRhc2l6ZSAsIEdGUF9LRVJORUwpOwogCWlmIChkYXRhID09IE5VTEwpIHsKQEAgLTE0NCw3ICsxMzcsNyBAQAogCQkJcmV0ID0gYWRpczE2NDAwX3NwaV9yZWFkX2J1cnN0KCZpbmRpb19kZXYtPmRldiwgc3QtPnJ4KTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCWdvdG8gZXJyOwotCQkJZm9yICg7IGkgPCBpbmRpb19kZXYtPnJpbmctPnNjYW5fY291bnQ7IGkrKykgeworCQkJZm9yICg7IGkgPCBpbmRpb19kZXYtPmJ1ZmZlci0+c2Nhbl9jb3VudDsgaSsrKSB7CiAJCQkJaiA9IF9fZmZzKG1hc2spOwogCQkJCW1hc2sgJj0gfigxIDw8IGopOwogCQkJCWRhdGFbaV0gPSBiZTE2X3RvX2NwdXAoCkBAIC0xNTUsNyArMTQ4LDcgQEAKIAkvKiBHdWFyYW50ZWVkIHRvIGJlIGFsaWduZWQgd2l0aCA4IGJ5dGUgYm91bmRhcnkgKi8KIAlpZiAocmluZy0+c2Nhbl90aW1lc3RhbXApCiAJCSooKHM2NCAqKShkYXRhICsgKChpICsgMykvNCkqNCkpID0gcGYtPnRpbWVzdGFtcDsKLQlyaW5nLT5hY2Nlc3MtPnN0b3JlX3RvKGluZGlvX2Rldi0+cmluZywgKHU4ICopIGRhdGEsIHBmLT50aW1lc3RhbXApOworCXJpbmctPmFjY2Vzcy0+c3RvcmVfdG8oaW5kaW9fZGV2LT5idWZmZXIsICh1OCAqKSBkYXRhLCBwZi0+dGltZXN0YW1wKTsKIAogCWlpb190cmlnZ2VyX25vdGlmeV9kb25lKGluZGlvX2Rldi0+dHJpZyk7CiAKQEAgLTE3MCwzNiArMTYzLDMyIEBACiB2b2lkIGFkaXMxNjQwMF91bmNvbmZpZ3VyZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiAJaWlvX2RlYWxsb2NfcG9sbGZ1bmMoaW5kaW9fZGV2LT5wb2xsZnVuYyk7Ci0JaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5yaW5nKTsKKwlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPmJ1ZmZlcik7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX3Jpbmdfc2V0dXBfb3BzIGFkaXMxNjQwMF9yaW5nX3NldHVwX29wcyA9IHsKLQkucHJlZW5hYmxlID0gJmlpb19zd19yaW5nX3ByZWVuYWJsZSwKLQkucG9zdGVuYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcG9zdGVuYWJsZSwKLQkucHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX3JpbmdfcHJlZGlzYWJsZSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMgYWRpczE2NDAwX3Jpbmdfc2V0dXBfb3BzID0geworCS5wcmVlbmFibGUgPSAmaWlvX3N3X2J1ZmZlcl9wcmVlbmFibGUsCisJLnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZSwKKwkucHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNhYmxlLAogfTsKIAogaW50IGFkaXMxNjQwMF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCWludCByZXQgPSAwOwotCXN0cnVjdCBhZGlzMTY0MDBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nOworCXN0cnVjdCBpaW9fYnVmZmVyICpyaW5nOwogCiAJcmluZyA9IGlpb19zd19yYl9hbGxvY2F0ZShpbmRpb19kZXYpOwogCWlmICghcmluZykgewogCQlyZXQgPSAtRU5PTUVNOwogCQlyZXR1cm4gcmV0OwogCX0KLQlpbmRpb19kZXYtPnJpbmcgPSByaW5nOworCWluZGlvX2Rldi0+YnVmZmVyID0gcmluZzsKIAkvKiBFZmZlY3RpdmVseSBzZWxlY3QgdGhlIHJpbmcgYnVmZmVyIGltcGxlbWVudGF0aW9uICovCiAJcmluZy0+YWNjZXNzID0gJnJpbmdfc3dfYWNjZXNzX2Z1bmNzOwogCXJpbmctPmJwZSA9IDI7CiAJcmluZy0+c2Nhbl90aW1lc3RhbXAgPSB0cnVlOwogCXJpbmctPnNldHVwX29wcyA9ICZhZGlzMTY0MDBfcmluZ19zZXR1cF9vcHM7CiAJcmluZy0+b3duZXIgPSBUSElTX01PRFVMRTsKLQkvKiBTZXQgZGVmYXVsdCBzY2FuIG1vZGUgKi8KLQlyaW5nLT5zY2FuX21hc2sgPSBzdC0+dmFyaWFudC0+ZGVmYXVsdF9zY2FuX21hc2s7Ci0JcmluZy0+c2Nhbl9jb3VudCA9IGh3ZWlnaHRfbG9uZyhzdC0+dmFyaWFudC0+ZGVmYXVsdF9zY2FuX21hc2spOwogCiAJaW5kaW9fZGV2LT5wb2xsZnVuYyA9IGlpb19hbGxvY19wb2xsZnVuYygmaWlvX3BvbGxmdW5jX3N0b3JlX3RpbWUsCiAJCQkJCQkgJmFkaXMxNjQwMF90cmlnZ2VyX2hhbmRsZXIsCkBAIC0yMTMsOSArMjAyLDkgQEAKIAkJZ290byBlcnJvcl9paW9fc3dfcmJfZnJlZTsKIAl9CiAKLQlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX1JJTkdfVFJJR0dFUkVEOworCWluZGlvX2Rldi0+bW9kZXMgfD0gSU5ESU9fQlVGRkVSX1RSSUdHRVJFRDsKIAlyZXR1cm4gMDsKIGVycm9yX2lpb19zd19yYl9mcmVlOgotCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7CisJaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5idWZmZXIpOwogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDBfdHJpZ2dlci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbXUvYWRpczE2NDAwX3RyaWdnZXIuYwppbmRleCBjNmVjNDFhLi5iZjk5MTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltdS9hZGlzMTY0MDBfdHJpZ2dlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW11L2FkaXMxNjQwMF90cmlnZ2VyLmMKQEAgLTEsMTQgKzEsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCi0jaW5jbHVkZSAiLi4vc3lzZnMuaCIKICNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCiAjaW5jbHVkZSAiYWRpczE2NDAwLmgiCiAKQEAgLTI0LDEzICsxOCwxOCBAQAogCXJldHVybiBhZGlzMTY0MDBfc2V0X2lycShpbmRpb19kZXYsIHN0YXRlKTsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fdHJpZ2dlcl9vcHMgYWRpczE2NDAwX3RyaWdnZXJfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5zZXRfdHJpZ2dlcl9zdGF0ZSA9ICZhZGlzMTY0MDBfZGF0YV9yZHlfdHJpZ2dlcl9zZXRfc3RhdGUsCit9OworCiBpbnQgYWRpczE2NDAwX3Byb2JlX3RyaWdnZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBhZGlzMTY0MDBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAogCXN0LT50cmlnID0gaWlvX2FsbG9jYXRlX3RyaWdnZXIoIiVzLWRldiVkIiwKLQkJCQkJc3BpX2dldF9kZXZpY2VfaWQoc3QtPnVzKS0+bmFtZSwKKwkJCQkJaW5kaW9fZGV2LT5uYW1lLAogCQkJCQlpbmRpb19kZXYtPmlkKTsKIAlpZiAoc3QtPnRyaWcgPT0gTlVMTCkgewogCQlyZXQgPSAtRU5PTUVNOwpAQCAtNDUsOSArNDQsOCBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfZnJlZV90cmlnOwogCXN0LT50cmlnLT5kZXYucGFyZW50ID0gJnN0LT51cy0+ZGV2OwotCXN0LT50cmlnLT5vd25lciA9IFRISVNfTU9EVUxFOwogCXN0LT50cmlnLT5wcml2YXRlX2RhdGEgPSBpbmRpb19kZXY7Ci0Jc3QtPnRyaWctPnNldF90cmlnZ2VyX3N0YXRlID0gJmFkaXMxNjQwMF9kYXRhX3JkeV90cmlnZ2VyX3NldF9zdGF0ZTsKKwlzdC0+dHJpZy0+b3BzID0gJmFkaXMxNjQwMF90cmlnZ2VyX29wczsKIAlyZXQgPSBpaW9fdHJpZ2dlcl9yZWdpc3RlcihzdC0+dHJpZyk7CiAKIAkvKiBzZWxlY3QgZGVmYXVsdCB0cmlnZ2VyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2luZHVzdHJpYWxpby1idWZmZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZDVkN2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2luZHVzdHJpYWxpby1idWZmZXIuYwpAQCAtMCwwICsxLDYzNSBAQAorLyogVGhlIGluZHVzdHJpYWwgSS9PIGNvcmUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSm9uYXRoYW4gQ2FtZXJvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogSGFuZGxpbmcgb2YgYnVmZmVyIGFsbG9jYXRpb24gLyByZXNpemluZy4KKyAqCisgKgorICogVGhpbmdzIHRvIGxvb2sgYXQgaGVyZS4KKyAqIC0gQmV0dGVyIG1lbW9yeSBhbGxvY2F0aW9uIHRlY2huaXF1ZXM/CisgKiAtIEFsdGVybmF0aXZlIGFjY2VzcyB0ZWNobmlxdWVzPworICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKworI2luY2x1ZGUgImlpby5oIgorI2luY2x1ZGUgImlpb19jb3JlLmgiCisjaW5jbHVkZSAic3lzZnMuaCIKKyNpbmNsdWRlICJidWZmZXJfZ2VuZXJpYy5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlpb19lbmRpYW5fcHJlZml4W10gPSB7CisJW0lJT19CRV0gPSAiYmUiLAorCVtJSU9fTEVdID0gImxlIiwKK307CisKKy8qKgorICogaWlvX2J1ZmZlcl9yZWFkX2ZpcnN0X25fb3V0ZXIoKSAtIGNocmRldiByZWFkIGZvciBidWZmZXIgYWNjZXNzCisgKgorICogVGhpcyBmdW5jdGlvbiByZWxpZXMgb24gYWxsIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbnMgaGF2aW5nIGFuCisgKiBpaW9fYnVmZmVyIGFzIHRoZWlyIGZpcnN0IGVsZW1lbnQuCisgKiovCitzc2l6ZV90IGlpb19idWZmZXJfcmVhZF9maXJzdF9uX291dGVyKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgICAgIHNpemVfdCBuLCBsb2ZmX3QgKmZfcHMpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqcmIgPSBpbmRpb19kZXYtPmJ1ZmZlcjsKKworCWlmICghcmItPmFjY2Vzcy0+cmVhZF9maXJzdF9uKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gcmItPmFjY2Vzcy0+cmVhZF9maXJzdF9uKHJiLCBuLCBidWYpOworfQorCisvKioKKyAqIGlpb19idWZmZXJfcG9sbCgpIC0gcG9sbCB0aGUgYnVmZmVyIHRvIGZpbmQgb3V0IGlmIGl0IGhhcyBkYXRhCisgKi8KK3Vuc2lnbmVkIGludCBpaW9fYnVmZmVyX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgICAgIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpaW9fYnVmZmVyICpyYiA9IGluZGlvX2Rldi0+YnVmZmVyOworCisJcG9sbF93YWl0KGZpbHAsICZyYi0+cG9sbHEsIHdhaXQpOworCWlmIChyYi0+c3R1ZmZ0b3JlYWQpCisJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworCS8qIG5lZWQgYSB3YXkgb2Yga25vd2luZyBpZiB0aGVyZSBtYXkgYmUgZW5vdWdoIGRhdGEuLi4gKi8KKwlyZXR1cm4gMDsKK30KKworaW50IGlpb19jaHJkZXZfYnVmZmVyX29wZW4oc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqcmIgPSBpbmRpb19kZXYtPmJ1ZmZlcjsKKwlpZiAoIXJiKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocmItPmFjY2Vzcy0+bWFya19pbl91c2UpCisJCXJiLT5hY2Nlc3MtPm1hcmtfaW5fdXNlKHJiKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpaW9fY2hyZGV2X2J1ZmZlcl9yZWxlYXNlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGlpb19idWZmZXIgKnJiID0gaW5kaW9fZGV2LT5idWZmZXI7CisKKwljbGVhcl9iaXQoSUlPX0JVU1lfQklUX1BPUywgJnJiLT5mbGFncyk7CisJaWYgKHJiLT5hY2Nlc3MtPnVubWFya19pbl91c2UpCisJCXJiLT5hY2Nlc3MtPnVubWFya19pbl91c2UocmIpOworfQorCit2b2lkIGlpb19idWZmZXJfaW5pdChzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyLCBzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWJ1ZmZlci0+aW5kaW9fZGV2ID0gaW5kaW9fZGV2OworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJ1ZmZlci0+cG9sbHEpOworfQorRVhQT1JUX1NZTUJPTChpaW9fYnVmZmVyX2luaXQpOworCitzdGF0aWMgc3NpemVfdCBpaW9fc2hvd19zY2FuX2luZGV4KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHRvX2lpb19kZXZfYXR0cihhdHRyKS0+Yy0+c2Nhbl9pbmRleCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGlpb19zaG93X2ZpeGVkX3R5cGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisJdTggdHlwZSA9IHRoaXNfYXR0ci0+Yy0+c2Nhbl90eXBlLmVuZGlhbm5lc3M7CisKKwlpZiAodHlwZSA9PSBJSU9fQ1BVKSB7CisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisJCXR5cGUgPSBJSU9fTEU7CisjZWxzZQorCQl0eXBlID0gSUlPX0JFOworI2VuZGlmCisJfQorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzOiVjJWQvJWQ+PiV1XG4iLAorCQkgICAgICAgaWlvX2VuZGlhbl9wcmVmaXhbdHlwZV0sCisJCSAgICAgICB0aGlzX2F0dHItPmMtPnNjYW5fdHlwZS5zaWduLAorCQkgICAgICAgdGhpc19hdHRyLT5jLT5zY2FuX3R5cGUucmVhbGJpdHMsCisJCSAgICAgICB0aGlzX2F0dHItPmMtPnNjYW5fdHlwZS5zdG9yYWdlYml0cywKKwkJICAgICAgIHRoaXNfYXR0ci0+Yy0+c2Nhbl90eXBlLnNoaWZ0KTsKK30KKworc3RhdGljIHNzaXplX3QgaWlvX3NjYW5fZWxfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY2hhciAqYnVmKQoreworCWludCByZXQ7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0ID0gaWlvX3NjYW5fbWFza19xdWVyeShpbmRpb19kZXYtPmJ1ZmZlciwKKwkJCQkgIHRvX2lpb19kZXZfYXR0cihhdHRyKS0+YWRkcmVzcyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJldCk7Cit9CisKK3N0YXRpYyBpbnQgaWlvX3NjYW5fbWFza19jbGVhcihzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyLCBpbnQgYml0KQoreworCWNsZWFyX2JpdChiaXQsIGJ1ZmZlci0+c2Nhbl9tYXNrKTsKKwlidWZmZXItPnNjYW5fY291bnQtLTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgaWlvX3NjYW5fZWxfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgY29uc3QgY2hhciAqYnVmLAorCQkJCSBzaXplX3QgbGVuKQoreworCWludCByZXQgPSAwOworCWJvb2wgc3RhdGU7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpaW9fYnVmZmVyICpidWZmZXIgPSBpbmRpb19kZXYtPmJ1ZmZlcjsKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CisKKwlzdGF0ZSA9ICEoYnVmWzBdID09ICcwJyk7CisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJaWYgKGluZGlvX2Rldi0+Y3VycmVudG1vZGUgPT0gSU5ESU9fQlVGRkVSX1RSSUdHRVJFRCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwlyZXQgPSBpaW9fc2Nhbl9tYXNrX3F1ZXJ5KGJ1ZmZlciwgdGhpc19hdHRyLT5hZGRyZXNzKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9yZXQ7CisJaWYgKCFzdGF0ZSAmJiByZXQpIHsKKwkJcmV0ID0gaWlvX3NjYW5fbWFza19jbGVhcihidWZmZXIsIHRoaXNfYXR0ci0+YWRkcmVzcyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yX3JldDsKKwl9IGVsc2UgaWYgKHN0YXRlICYmICFyZXQpIHsKKwkJcmV0ID0gaWlvX3NjYW5fbWFza19zZXQoYnVmZmVyLCB0aGlzX2F0dHItPmFkZHJlc3MpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJvcl9yZXQ7CisJfQorCitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47CisKK30KKworc3RhdGljIHNzaXplX3QgaWlvX3NjYW5fZWxfdHNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgaW5kaW9fZGV2LT5idWZmZXItPnNjYW5fdGltZXN0YW1wKTsKK30KKworc3RhdGljIHNzaXplX3QgaWlvX3NjYW5fZWxfdHNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgY29uc3QgY2hhciAqYnVmLAorCQkJCSAgICBzaXplX3QgbGVuKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlib29sIHN0YXRlOworCisJc3RhdGUgPSAhKGJ1ZlswXSA9PSAnMCcpOworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCWlmIChpbmRpb19kZXYtPmN1cnJlbnRtb2RlID09IElORElPX0JVRkZFUl9UUklHR0VSRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJaW5kaW9fZGV2LT5idWZmZXItPnNjYW5fdGltZXN0YW1wID0gc3RhdGU7CitlcnJvcl9yZXQ6CisJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKKworCXJldHVybiByZXQgPyByZXQgOiBsZW47Cit9CisKK3N0YXRpYyBpbnQgaWlvX2J1ZmZlcl9hZGRfY2hhbm5lbF9zeXNmcyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJCQljb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbikKK3sKKwlpbnQgcmV0LCBhdHRyY291bnQgPSAwOworCXN0cnVjdCBpaW9fYnVmZmVyICpidWZmZXIgPSBpbmRpb19kZXYtPmJ1ZmZlcjsKKworCXJldCA9IF9faWlvX2FkZF9jaGFuX2RldmF0dHIoImluZGV4IiwKKwkJCQkgICAgIGNoYW4sCisJCQkJICAgICAmaWlvX3Nob3dfc2Nhbl9pbmRleCwKKwkJCQkgICAgIE5VTEwsCisJCQkJICAgICAwLAorCQkJCSAgICAgMCwKKwkJCQkgICAgICZpbmRpb19kZXYtPmRldiwKKwkJCQkgICAgICZidWZmZXItPnNjYW5fZWxfZGV2X2F0dHJfbGlzdCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZXQ7CisJYXR0cmNvdW50Kys7CisJcmV0ID0gX19paW9fYWRkX2NoYW5fZGV2YXR0cigidHlwZSIsCisJCQkJICAgICBjaGFuLAorCQkJCSAgICAgJmlpb19zaG93X2ZpeGVkX3R5cGUsCisJCQkJICAgICBOVUxMLAorCQkJCSAgICAgMCwKKwkJCQkgICAgIDAsCisJCQkJICAgICAmaW5kaW9fZGV2LT5kZXYsCisJCQkJICAgICAmYnVmZmVyLT5zY2FuX2VsX2Rldl9hdHRyX2xpc3QpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfcmV0OworCWF0dHJjb3VudCsrOworCWlmIChjaGFuLT50eXBlICE9IElJT19USU1FU1RBTVApCisJCXJldCA9IF9faWlvX2FkZF9jaGFuX2RldmF0dHIoImVuIiwKKwkJCQkJICAgICBjaGFuLAorCQkJCQkgICAgICZpaW9fc2Nhbl9lbF9zaG93LAorCQkJCQkgICAgICZpaW9fc2Nhbl9lbF9zdG9yZSwKKwkJCQkJICAgICBjaGFuLT5zY2FuX2luZGV4LAorCQkJCQkgICAgIDAsCisJCQkJCSAgICAgJmluZGlvX2Rldi0+ZGV2LAorCQkJCQkgICAgICZidWZmZXItPnNjYW5fZWxfZGV2X2F0dHJfbGlzdCk7CisJZWxzZQorCQlyZXQgPSBfX2lpb19hZGRfY2hhbl9kZXZhdHRyKCJlbiIsCisJCQkJCSAgICAgY2hhbiwKKwkJCQkJICAgICAmaWlvX3NjYW5fZWxfdHNfc2hvdywKKwkJCQkJICAgICAmaWlvX3NjYW5fZWxfdHNfc3RvcmUsCisJCQkJCSAgICAgY2hhbi0+c2Nhbl9pbmRleCwKKwkJCQkJICAgICAwLAorCQkJCQkgICAgICZpbmRpb19kZXYtPmRldiwKKwkJCQkJICAgICAmYnVmZmVyLT5zY2FuX2VsX2Rldl9hdHRyX2xpc3QpOworCWF0dHJjb3VudCsrOworCXJldCA9IGF0dHJjb3VudDsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpaW9fYnVmZmVyX3JlbW92ZV9hbmRfZnJlZV9zY2FuX2Rldl9hdHRyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkJCQkgICAgIHN0cnVjdCBpaW9fZGV2X2F0dHIgKnApCit7CisJa2ZyZWUocC0+ZGV2X2F0dHIuYXR0ci5uYW1lKTsKKwlrZnJlZShwKTsKK30KKworc3RhdGljIHZvaWQgX19paW9fYnVmZmVyX2F0dHJfY2xlYW51cChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnAsICpuOworCXN0cnVjdCBpaW9fYnVmZmVyICpidWZmZXIgPSBpbmRpb19kZXYtPmJ1ZmZlcjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwLCBuLAorCQkJCSAmYnVmZmVyLT5zY2FuX2VsX2Rldl9hdHRyX2xpc3QsIGwpCisJCWlpb19idWZmZXJfcmVtb3ZlX2FuZF9mcmVlX3NjYW5fZGV2X2F0dHIoaW5kaW9fZGV2LCBwKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpaW9fc2Nhbl9lbGVtZW50c19ncm91cF9uYW1lID0gInNjYW5fZWxlbWVudHMiOworCitpbnQgaWlvX2J1ZmZlcl9yZWdpc3RlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgKmNoYW5uZWxzLAorCQkJaW50IG51bV9jaGFubmVscykKK3sKKwlzdHJ1Y3QgaWlvX2Rldl9hdHRyICpwOworCXN0cnVjdCBhdHRyaWJ1dGUgKiphdHRyOworCXN0cnVjdCBpaW9fYnVmZmVyICpidWZmZXIgPSBpbmRpb19kZXYtPmJ1ZmZlcjsKKwlpbnQgcmV0LCBpLCBhdHRybiwgYXR0cmNvdW50LCBhdHRyY291bnRfb3JpZyA9IDA7CisKKwlpZiAoYnVmZmVyLT5hdHRycykKKwkJaW5kaW9fZGV2LT5ncm91cHNbaW5kaW9fZGV2LT5ncm91cGNvdW50ZXIrK10gPSBidWZmZXItPmF0dHJzOworCisJaWYgKGJ1ZmZlci0+c2Nhbl9lbF9hdHRycyAhPSBOVUxMKSB7CisJCWF0dHIgPSBidWZmZXItPnNjYW5fZWxfYXR0cnMtPmF0dHJzOworCQl3aGlsZSAoKmF0dHIrKyAhPSBOVUxMKQorCQkJYXR0cmNvdW50X29yaWcrKzsKKwl9CisJYXR0cmNvdW50ID0gYXR0cmNvdW50X29yaWc7CisJSU5JVF9MSVNUX0hFQUQoJmJ1ZmZlci0+c2Nhbl9lbF9kZXZfYXR0cl9saXN0KTsKKwlpZiAoY2hhbm5lbHMpIHsKKwkJLyogbmV3IG1hZ2ljICovCisJCWZvciAoaSA9IDA7IGkgPCBudW1fY2hhbm5lbHM7IGkrKykgeworCQkJLyogRXN0YWJsaXNoIG5lY2Vzc2FyeSBtYXNrIGxlbmd0aCAqLworCQkJaWYgKGNoYW5uZWxzW2ldLnNjYW5faW5kZXggPgorCQkJICAgIChpbnQpaW5kaW9fZGV2LT5tYXNrbGVuZ3RoIC0gMSkKKwkJCQlpbmRpb19kZXYtPm1hc2tsZW5ndGgKKwkJCQkJPSBpbmRpb19kZXYtPmNoYW5uZWxzW2ldLnNjYW5faW5kZXggKyAxOworCisJCQlyZXQgPSBpaW9fYnVmZmVyX2FkZF9jaGFubmVsX3N5c2ZzKGluZGlvX2RldiwKKwkJCQkJCQkgJmNoYW5uZWxzW2ldKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gZXJyb3JfY2xlYW51cF9keW5hbWljOworCQkJYXR0cmNvdW50ICs9IHJldDsKKwkJfQorCQlpZiAoaW5kaW9fZGV2LT5tYXNrbGVuZ3RoICYmIGJ1ZmZlci0+c2Nhbl9tYXNrID09IE5VTEwpIHsKKwkJCWJ1ZmZlci0+c2Nhbl9tYXNrCisJCQkJPSBremFsbG9jKHNpemVvZigqYnVmZmVyLT5zY2FuX21hc2spKgorCQkJCQkgIEJJVFNfVE9fTE9OR1MoaW5kaW9fZGV2LT5tYXNrbGVuZ3RoKSwKKwkJCQkJICBHRlBfS0VSTkVMKTsKKwkJCWlmIChidWZmZXItPnNjYW5fbWFzayA9PSBOVUxMKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIGVycm9yX2NsZWFudXBfZHluYW1pYzsKKwkJCX0KKwkJfQorCX0KKworCWJ1ZmZlci0+c2Nhbl9lbF9ncm91cC5uYW1lID0gaWlvX3NjYW5fZWxlbWVudHNfZ3JvdXBfbmFtZTsKKworCWJ1ZmZlci0+c2Nhbl9lbF9ncm91cC5hdHRycworCQk9IGt6YWxsb2Moc2l6ZW9mKGJ1ZmZlci0+c2Nhbl9lbF9ncm91cC5hdHRyc1swXSkqCisJCQkgIChhdHRyY291bnQgKyAxKSwKKwkJCSAgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZmZlci0+c2Nhbl9lbF9ncm91cC5hdHRycyA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zY2FuX21hc2s7CisJfQorCWlmIChidWZmZXItPnNjYW5fZWxfYXR0cnMpCisJCW1lbWNweShidWZmZXItPnNjYW5fZWxfZ3JvdXAuYXR0cnMsIGJ1ZmZlci0+c2Nhbl9lbF9hdHRycywKKwkJICAgICAgIHNpemVvZihidWZmZXItPnNjYW5fZWxfZ3JvdXAuYXR0cnNbMF0pKmF0dHJjb3VudF9vcmlnKTsKKwlhdHRybiA9IGF0dHJjb3VudF9vcmlnOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmYnVmZmVyLT5zY2FuX2VsX2Rldl9hdHRyX2xpc3QsIGwpCisJCWJ1ZmZlci0+c2Nhbl9lbF9ncm91cC5hdHRyc1thdHRybisrXSA9ICZwLT5kZXZfYXR0ci5hdHRyOworCWluZGlvX2Rldi0+Z3JvdXBzW2luZGlvX2Rldi0+Z3JvdXBjb3VudGVyKytdID0gJmJ1ZmZlci0+c2Nhbl9lbF9ncm91cDsKKworCXJldHVybiAwOworCitlcnJvcl9mcmVlX3NjYW5fbWFzazoKKwlrZnJlZShidWZmZXItPnNjYW5fbWFzayk7CitlcnJvcl9jbGVhbnVwX2R5bmFtaWM6CisJX19paW9fYnVmZmVyX2F0dHJfY2xlYW51cChpbmRpb19kZXYpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woaWlvX2J1ZmZlcl9yZWdpc3Rlcik7CisKK3ZvaWQgaWlvX2J1ZmZlcl91bnJlZ2lzdGVyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJa2ZyZWUoaW5kaW9fZGV2LT5idWZmZXItPnNjYW5fbWFzayk7CisJa2ZyZWUoaW5kaW9fZGV2LT5idWZmZXItPnNjYW5fZWxfZ3JvdXAuYXR0cnMpOworCV9faWlvX2J1ZmZlcl9hdHRyX2NsZWFudXAoaW5kaW9fZGV2KTsKK30KK0VYUE9SVF9TWU1CT0woaWlvX2J1ZmZlcl91bnJlZ2lzdGVyKTsKKworc3NpemVfdCBpaW9fYnVmZmVyX3JlYWRfbGVuZ3RoKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpaW9fYnVmZmVyICpidWZmZXIgPSBpbmRpb19kZXYtPmJ1ZmZlcjsKKworCWlmIChidWZmZXItPmFjY2Vzcy0+Z2V0X2xlbmd0aCkKKwkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCisJCQkgICAgICAgYnVmZmVyLT5hY2Nlc3MtPmdldF9sZW5ndGgoYnVmZmVyKSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaWlvX2J1ZmZlcl9yZWFkX2xlbmd0aCk7CisKK3NzaXplX3QgaWlvX2J1ZmZlcl93cml0ZV9sZW5ndGgoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQlzaXplX3QgbGVuKQoreworCWludCByZXQ7CisJdWxvbmcgdmFsOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyID0gaW5kaW9fZGV2LT5idWZmZXI7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGJ1ZmZlci0+YWNjZXNzLT5nZXRfbGVuZ3RoKQorCQlpZiAodmFsID09IGJ1ZmZlci0+YWNjZXNzLT5nZXRfbGVuZ3RoKGJ1ZmZlcikpCisJCQlyZXR1cm4gbGVuOworCisJaWYgKGJ1ZmZlci0+YWNjZXNzLT5zZXRfbGVuZ3RoKSB7CisJCWJ1ZmZlci0+YWNjZXNzLT5zZXRfbGVuZ3RoKGJ1ZmZlciwgdmFsKTsKKwkJaWYgKGJ1ZmZlci0+YWNjZXNzLT5tYXJrX3BhcmFtX2NoYW5nZSkKKwkJCWJ1ZmZlci0+YWNjZXNzLT5tYXJrX3BhcmFtX2NoYW5nZShidWZmZXIpOworCX0KKworCXJldHVybiBsZW47Cit9CitFWFBPUlRfU1lNQk9MKGlpb19idWZmZXJfd3JpdGVfbGVuZ3RoKTsKKworc3NpemVfdCBpaW9fYnVmZmVyX3JlYWRfYnl0ZXNfcGVyX2RhdHVtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGlpb19idWZmZXIgKmJ1ZmZlciA9IGluZGlvX2Rldi0+YnVmZmVyOworCisJaWYgKGJ1ZmZlci0+YWNjZXNzLT5nZXRfYnl0ZXNfcGVyX2RhdHVtKQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKKwkJCSAgICAgICBidWZmZXItPmFjY2Vzcy0+Z2V0X2J5dGVzX3Blcl9kYXR1bShidWZmZXIpKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpaW9fYnVmZmVyX3JlYWRfYnl0ZXNfcGVyX2RhdHVtKTsKKworc3NpemVfdCBpaW9fYnVmZmVyX3N0b3JlX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLAorCQkJCXNpemVfdCBsZW4pCit7CisJaW50IHJldDsKKwlib29sIHJlcXVlc3RlZF9zdGF0ZSwgY3VycmVudF9zdGF0ZTsKKwlpbnQgcHJldmlvdXNfbW9kZTsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGlpb19idWZmZXIgKmJ1ZmZlciA9IGluZGlvX2Rldi0+YnVmZmVyOworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisJcHJldmlvdXNfbW9kZSA9IGluZGlvX2Rldi0+Y3VycmVudG1vZGU7CisJcmVxdWVzdGVkX3N0YXRlID0gIShidWZbMF0gPT0gJzAnKTsKKwljdXJyZW50X3N0YXRlID0gISEocHJldmlvdXNfbW9kZSAmIElORElPX0FMTF9CVUZGRVJfTU9ERVMpOworCWlmIChjdXJyZW50X3N0YXRlID09IHJlcXVlc3RlZF9zdGF0ZSkgeworCQlwcmludGsoS0VSTl9JTkZPICJpaW8tYnVmZmVyLCBjdXJyZW50IHN0YXRlIHJlcXVlc3RlZCBhZ2FpblxuIik7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKHJlcXVlc3RlZF9zdGF0ZSkgeworCQlpZiAoYnVmZmVyLT5zZXR1cF9vcHMtPnByZWVuYWJsZSkgeworCQkJcmV0ID0gYnVmZmVyLT5zZXR1cF9vcHMtPnByZWVuYWJsZShpbmRpb19kZXYpOworCQkJaWYgKHJldCkgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICAiQnVmZmVyIG5vdCBzdGFydGVkOiIKKwkJCQkgICAgICAgImJ1ZmZlciBwcmVlbmFibGUgZmFpbGVkXG4iKTsKKwkJCQlnb3RvIGVycm9yX3JldDsKKwkJCX0KKwkJfQorCQlpZiAoYnVmZmVyLT5hY2Nlc3MtPnJlcXVlc3RfdXBkYXRlKSB7CisJCQlyZXQgPSBidWZmZXItPmFjY2Vzcy0+cmVxdWVzdF91cGRhdGUoYnVmZmVyKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJICAgICAgICJCdWZmZXIgbm90IHN0YXJ0ZWQ6IgorCQkJCSAgICAgICAiYnVmZmVyIHBhcmFtZXRlciB1cGRhdGUgZmFpbGVkXG4iKTsKKwkJCQlnb3RvIGVycm9yX3JldDsKKwkJCX0KKwkJfQorCQlpZiAoYnVmZmVyLT5hY2Nlc3MtPm1hcmtfaW5fdXNlKQorCQkJYnVmZmVyLT5hY2Nlc3MtPm1hcmtfaW5fdXNlKGJ1ZmZlcik7CisJCS8qIERlZmluaXRlbHkgcG9zc2libGUgZm9yIGRldmljZXMgdG8gc3VwcG9ydCBib3RoIG9mIHRoZXNlLiovCisJCWlmIChpbmRpb19kZXYtPm1vZGVzICYgSU5ESU9fQlVGRkVSX1RSSUdHRVJFRCkgeworCQkJaWYgKCFpbmRpb19kZXYtPnRyaWcpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPCisJCQkJICAgICAgICJCdWZmZXIgbm90IHN0YXJ0ZWQ6IG5vIHRyaWdnZXJcbiIpOworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJaWYgKGJ1ZmZlci0+YWNjZXNzLT51bm1hcmtfaW5fdXNlKQorCQkJCQlidWZmZXItPmFjY2Vzcy0+dW5tYXJrX2luX3VzZShidWZmZXIpOworCQkJCWdvdG8gZXJyb3JfcmV0OworCQkJfQorCQkJaW5kaW9fZGV2LT5jdXJyZW50bW9kZSA9IElORElPX0JVRkZFUl9UUklHR0VSRUQ7CisJCX0gZWxzZSBpZiAoaW5kaW9fZGV2LT5tb2RlcyAmIElORElPX0JVRkZFUl9IQVJEV0FSRSkKKwkJCWluZGlvX2Rldi0+Y3VycmVudG1vZGUgPSBJTkRJT19CVUZGRVJfSEFSRFdBUkU7CisJCWVsc2UgeyAvKiBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZCAqLworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyb3JfcmV0OworCQl9CisKKwkJaWYgKGJ1ZmZlci0+c2V0dXBfb3BzLT5wb3N0ZW5hYmxlKSB7CisJCQlyZXQgPSBidWZmZXItPnNldHVwX29wcy0+cG9zdGVuYWJsZShpbmRpb19kZXYpOworCQkJaWYgKHJldCkgeworCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkgICAgICAgIkJ1ZmZlciBub3Qgc3RhcnRlZDoiCisJCQkJICAgICAgICJwb3N0ZW5hYmxlIGZhaWxlZFxuIik7CisJCQkJaWYgKGJ1ZmZlci0+YWNjZXNzLT51bm1hcmtfaW5fdXNlKQorCQkJCQlidWZmZXItPmFjY2Vzcy0+dW5tYXJrX2luX3VzZShidWZmZXIpOworCQkJCWluZGlvX2Rldi0+Y3VycmVudG1vZGUgPSBwcmV2aW91c19tb2RlOworCQkJCWlmIChidWZmZXItPnNldHVwX29wcy0+cG9zdGRpc2FibGUpCisJCQkJCWJ1ZmZlci0+c2V0dXBfb3BzLT4KKwkJCQkJCXBvc3RkaXNhYmxlKGluZGlvX2Rldik7CisJCQkJZ290byBlcnJvcl9yZXQ7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlpZiAoYnVmZmVyLT5zZXR1cF9vcHMtPnByZWRpc2FibGUpIHsKKwkJCXJldCA9IGJ1ZmZlci0+c2V0dXBfb3BzLT5wcmVkaXNhYmxlKGluZGlvX2Rldik7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyb3JfcmV0OworCQl9CisJCWlmIChidWZmZXItPmFjY2Vzcy0+dW5tYXJrX2luX3VzZSkKKwkJCWJ1ZmZlci0+YWNjZXNzLT51bm1hcmtfaW5fdXNlKGJ1ZmZlcik7CisJCWluZGlvX2Rldi0+Y3VycmVudG1vZGUgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwkJaWYgKGJ1ZmZlci0+c2V0dXBfb3BzLT5wb3N0ZGlzYWJsZSkgeworCQkJcmV0ID0gYnVmZmVyLT5zZXR1cF9vcHMtPnBvc3RkaXNhYmxlKGluZGlvX2Rldik7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyb3JfcmV0OworCQl9CisJfQorZG9uZToKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCXJldHVybiBsZW47CisKK2Vycm9yX3JldDoKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGlpb19idWZmZXJfc3RvcmVfZW5hYmxlKTsKKworc3NpemVfdCBpaW9fYnVmZmVyX3Nob3dfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgICBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAhIShpbmRpb19kZXYtPmN1cnJlbnRtb2RlCisJCQkJICAgICAgICYgSU5ESU9fQUxMX0JVRkZFUl9NT0RFUykpOworfQorRVhQT1JUX1NZTUJPTChpaW9fYnVmZmVyX3Nob3dfZW5hYmxlKTsKKworaW50IGlpb19zd19idWZmZXJfcHJlZW5hYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGlpb19idWZmZXIgKmJ1ZmZlciA9IGluZGlvX2Rldi0+YnVmZmVyOworCXNpemVfdCBzaXplOworCWRldl9kYmcoJmluZGlvX2Rldi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKwkvKiBDaGVjayBpZiB0aGVyZSBhcmUgYW55IHNjYW4gZWxlbWVudHMgZW5hYmxlZCwgaWYgbm90IGZhaWwqLworCWlmICghKGJ1ZmZlci0+c2Nhbl9jb3VudCB8fCBidWZmZXItPnNjYW5fdGltZXN0YW1wKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGJ1ZmZlci0+c2Nhbl90aW1lc3RhbXApCisJCWlmIChidWZmZXItPnNjYW5fY291bnQpCisJCQkvKiBUaW1lc3RhbXAgKGFsaWduZWQgdG8gczY0KSBhbmQgZGF0YSAqLworCQkJc2l6ZSA9ICgoKGJ1ZmZlci0+c2Nhbl9jb3VudCAqIGJ1ZmZlci0+YnBlKQorCQkJCQkrIHNpemVvZihzNjQpIC0gMSkKKwkJCQkmIH4oc2l6ZW9mKHM2NCkgLSAxKSkKKwkJCQkrIHNpemVvZihzNjQpOworCQllbHNlIC8qIFRpbWVzdGFtcCBvbmx5ICAqLworCQkJc2l6ZSA9IHNpemVvZihzNjQpOworCWVsc2UgLyogRGF0YSBvbmx5ICovCisJCXNpemUgPSBidWZmZXItPnNjYW5fY291bnQgKiBidWZmZXItPmJwZTsKKwlidWZmZXItPmFjY2Vzcy0+c2V0X2J5dGVzX3Blcl9kYXR1bShidWZmZXIsIHNpemUpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlpb19zd19idWZmZXJfcHJlZW5hYmxlKTsKKworCisvKiBub3RlIE5VTEwgdXNlZCBhcyBlcnJvciBpbmRpY2F0b3IgYXMgaXQgZG9lc24ndCBtYWtlIHNlbnNlLiAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgKmlpb19zY2FuX21hc2tfbWF0Y2godW5zaWduZWQgbG9uZyAqYXZfbWFza3MsCisJCQkJCSAgdW5zaWduZWQgaW50IG1hc2tsZW5ndGgsCisJCQkJCSAgdW5zaWduZWQgbG9uZyAqbWFzaykKK3sKKwlpZiAoYml0bWFwX2VtcHR5KG1hc2ssIG1hc2tsZW5ndGgpKQorCQlyZXR1cm4gTlVMTDsKKwl3aGlsZSAoKmF2X21hc2tzKSB7CisJCWlmIChiaXRtYXBfc3Vic2V0KG1hc2ssIGF2X21hc2tzLCBtYXNrbGVuZ3RoKSkKKwkJCXJldHVybiBhdl9tYXNrczsKKwkJYXZfbWFza3MgKz0gQklUU19UT19MT05HUyhtYXNrbGVuZ3RoKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogaWlvX3NjYW5fbWFza19zZXQoKSAtIHNldCBwYXJ0aWN1bGFyIGJpdCBpbiB0aGUgc2NhbiBtYXNrCisgKiBAYnVmZmVyOiB0aGUgYnVmZmVyIHdob3NlIHNjYW4gbWFzayB3ZSBhcmUgaW50ZXJlc3RlZCBpbgorICogQGJpdDogdGhlIGJpdCB0byBiZSBzZXQuCisgKiovCitpbnQgaWlvX3NjYW5fbWFza19zZXQoc3RydWN0IGlpb19idWZmZXIgKmJ1ZmZlciwgaW50IGJpdCkKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gYnVmZmVyLT5pbmRpb19kZXY7CisJdW5zaWduZWQgbG9uZyAqbWFzazsKKwl1bnNpZ25lZCBsb25nICp0cmlhbG1hc2s7CisKKwl0cmlhbG1hc2sgPSBrbWFsbG9jKHNpemVvZigqdHJpYWxtYXNrKSoKKwkJCSAgICBCSVRTX1RPX0xPTkdTKGluZGlvX2Rldi0+bWFza2xlbmd0aCksCisJCQkgICAgR0ZQX0tFUk5FTCk7CisKKwlpZiAodHJpYWxtYXNrID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWlmICghaW5kaW9fZGV2LT5tYXNrbGVuZ3RoKSB7CisJCVdBUk5fT04oInRyeWluZyB0byBzZXQgc2Nhbm1hc2sgcHJpb3IgdG8gcmVnaXN0ZXJpbmcgYnVmZmVyXG4iKTsKKwkJa2ZyZWUodHJpYWxtYXNrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWJpdG1hcF9jb3B5KHRyaWFsbWFzaywgYnVmZmVyLT5zY2FuX21hc2ssIGluZGlvX2Rldi0+bWFza2xlbmd0aCk7CisJc2V0X2JpdChiaXQsIHRyaWFsbWFzayk7CisKKwlpZiAoaW5kaW9fZGV2LT5hdmFpbGFibGVfc2Nhbl9tYXNrcykgeworCQltYXNrID0gaWlvX3NjYW5fbWFza19tYXRjaChpbmRpb19kZXYtPmF2YWlsYWJsZV9zY2FuX21hc2tzLAorCQkJCQkgICBpbmRpb19kZXYtPm1hc2tsZW5ndGgsCisJCQkJCSAgIHRyaWFsbWFzayk7CisJCWlmICghbWFzaykgeworCQkJa2ZyZWUodHJpYWxtYXNrKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCWJpdG1hcF9jb3B5KGJ1ZmZlci0+c2Nhbl9tYXNrLCB0cmlhbG1hc2ssIGluZGlvX2Rldi0+bWFza2xlbmd0aCk7CisJYnVmZmVyLT5zY2FuX2NvdW50Kys7CisKKwlrZnJlZSh0cmlhbG1hc2spOworCisJcmV0dXJuIDA7Cit9OworRVhQT1JUX1NZTUJPTF9HUEwoaWlvX3NjYW5fbWFza19zZXQpOworCitpbnQgaWlvX3NjYW5fbWFza19xdWVyeShzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyLCBpbnQgYml0KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBidWZmZXItPmluZGlvX2RldjsKKwlsb25nICptYXNrOworCisJaWYgKGJpdCA+IGluZGlvX2Rldi0+bWFza2xlbmd0aCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWJ1ZmZlci0+c2Nhbl9tYXNrKQorCQlyZXR1cm4gMDsKKwlpZiAoaW5kaW9fZGV2LT5hdmFpbGFibGVfc2Nhbl9tYXNrcykKKwkJbWFzayA9IGlpb19zY2FuX21hc2tfbWF0Y2goaW5kaW9fZGV2LT5hdmFpbGFibGVfc2Nhbl9tYXNrcywKKwkJCQkJICAgaW5kaW9fZGV2LT5tYXNrbGVuZ3RoLAorCQkJCQkgICBidWZmZXItPnNjYW5fbWFzayk7CisJZWxzZQorCQltYXNrID0gYnVmZmVyLT5zY2FuX21hc2s7CisJaWYgKCFtYXNrKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB0ZXN0X2JpdChiaXQsIG1hc2spOworfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGlpb19zY2FuX21hc2tfcXVlcnkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbmR1c3RyaWFsaW8tY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbmR1c3RyaWFsaW8tY29yZS5jCmluZGV4IDE5ODE5ZTcuLjMyNmU5NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW5kdXN0cmlhbGlvLWNvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2luZHVzdHJpYWxpby1jb3JlLmMKQEAgLTIxLDIxICsyMSwxNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Fub25faW5vZGVzLmg+CiAjaW5jbHVkZSAiaWlvLmgiCi0jaW5jbHVkZSAidHJpZ2dlcl9jb25zdW1lci5oIgorI2luY2x1ZGUgImlpb19jb3JlLmgiCisjaW5jbHVkZSAiaWlvX2NvcmVfdHJpZ2dlci5oIgorI2luY2x1ZGUgImNocmRldi5oIgorI2luY2x1ZGUgInN5c2ZzLmgiCiAKLSNkZWZpbmUgSUlPX0lEX1BSRUZJWCAiZGV2aWNlIgotI2RlZmluZSBJSU9fSURfRk9STUFUIElJT19JRF9QUkVGSVggIiVkIgotCi0vKiBJRFIgdG8gYXNzaWduIGVhY2ggcmVnaXN0ZXJlZCBkZXZpY2UgYSB1bmlxdWUgaWQqLworLyogSURBIHRvIGFzc2lnbiBlYWNoIHJlZ2lzdGVyZWQgZGV2aWNlIGEgdW5pcXVlIGlkKi8KIHN0YXRpYyBERUZJTkVfSURBKGlpb19pZGEpOwotLyogSURSIHRvIGFsbG9jYXRlIGNoYXJhY3RlciBkZXZpY2UgbWlub3IgbnVtYmVycyAqLwotc3RhdGljIERFRklORV9JREEoaWlvX2NocmRldl9pZGEpOwotLyogTG9jayB1c2VkIHRvIHByb3RlY3QgYm90aCBvZiB0aGUgYWJvdmUgKi8KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soaWlvX2lkYV9sb2NrKTsKIAotZGV2X3QgaWlvX2RldnQ7Ci1FWFBPUlRfU1lNQk9MKGlpb19kZXZ0KTsKK3N0YXRpYyBkZXZfdCBpaW9fZGV2dDsKIAogI2RlZmluZSBJSU9fREVWX01BWCAyNTYKIHN0cnVjdCBidXNfdHlwZSBpaW9fYnVzX3R5cGUgPSB7CkBAIC00MywxNCArMzksMjIgQEAKIH07CiBFWFBPUlRfU1lNQk9MKGlpb19idXNfdHlwZSk7CiAKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaWlvX2NoYW5fdHlwZV9uYW1lX3NwZWNfc2hhcmVkW10gPSB7Ci0JW0lJT19JTl0gPSAiaW4iLAotCVtJSU9fT1VUXSA9ICJvdXQiLAorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpaW9fZGF0YV90eXBlX25hbWVbXSA9IHsKKwlbSUlPX1JBV10gPSAicmF3IiwKKwlbSUlPX1BST0NFU1NFRF0gPSAiaW5wdXQiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpaW9fZGlyZWN0aW9uW10gPSB7CisJWzBdID0gImluIiwKKwlbMV0gPSAib3V0IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaWlvX2NoYW5fdHlwZV9uYW1lX3NwZWNbXSA9IHsKKwlbSUlPX1ZPTFRBR0VdID0gInZvbHRhZ2UiLAogCVtJSU9fQ1VSUkVOVF0gPSAiY3VycmVudCIsCiAJW0lJT19QT1dFUl0gPSAicG93ZXIiLAogCVtJSU9fQUNDRUxdID0gImFjY2VsIiwKLQlbSUlPX0lOX0RJRkZdID0gImluLWluIiwKLQlbSUlPX0dZUk9dID0gImd5cm8iLAorCVtJSU9fQU5HTF9WRUxdID0gImFuZ2x2ZWwiLAogCVtJSU9fTUFHTl0gPSAibWFnbiIsCiAJW0lJT19MSUdIVF0gPSAiaWxsdW1pbmFuY2UiLAogCVtJSU9fSU5URU5TSVRZXSA9ICJpbnRlbnNpdHkiLApAQCAtNjAsMjEgKzY0LDE1IEBACiAJW0lJT19ST1RdID0gInJvdCIsCiAJW0lJT19BTkdMXSA9ICJhbmdsIiwKIAlbSUlPX1RJTUVTVEFNUF0gPSAidGltZXN0YW1wIiwKKwlbSUlPX0NBUEFDSVRBTkNFXSA9ICJjYXBhY2l0YW5jZSIsCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlpb19jaGFuX3R5cGVfbmFtZV9zcGVjX2NvbXBsZXhbXSA9IHsKLQlbSUlPX0lOX0RJRkZdID0gImluJWQtaW4lZCIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlpb19tb2RpZmllcl9uYW1lc19saWdodFtdID0gewotCVtJSU9fTU9EX0xJR0hUX0JPVEhdID0gImJvdGgiLAotCVtJSU9fTU9EX0xJR0hUX0lSXSA9ICJpciIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlpb19tb2RpZmllcl9uYW1lc19heGlhbFtdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpaW9fbW9kaWZpZXJfbmFtZXNbXSA9IHsKIAlbSUlPX01PRF9YXSA9ICJ4IiwKIAlbSUlPX01PRF9ZXSA9ICJ5IiwKIAlbSUlPX01PRF9aXSA9ICJ6IiwKKwlbSUlPX01PRF9MSUdIVF9CT1RIXSA9ICJib3RoIiwKKwlbSUlPX01PRF9MSUdIVF9JUl0gPSAiaXIiLAogfTsKIAogLyogcmVsaWVzIG9uIHBhaXJzIG9mIHRoZXNlIHNoYXJlZCB0aGVuIHNlcGFyYXRlICovCkBAIC04NSwyMSArODMsNTEgQEAKIAlbSUlPX0NIQU5fSU5GT19DQUxJQkJJQVNfU0hBUkVELzJdID0gImNhbGliYmlhcyIsCiAJW0lJT19DSEFOX0lORk9fUEVBS19TSEFSRUQvMl0gPSAicGVha19yYXciLAogCVtJSU9fQ0hBTl9JTkZPX1BFQUtfU0NBTEVfU0hBUkVELzJdID0gInBlYWtfc2NhbGUiLAorCVtJSU9fQ0hBTl9JTkZPX1FVQURSQVRVUkVfQ09SUkVDVElPTl9SQVdfU0hBUkVELzJdCisJPSAicXVhZHJhdHVyZV9jb3JyZWN0aW9uX3JhdyIsCisJW0lJT19DSEFOX0lORk9fQVZFUkFHRV9SQVdfU0hBUkVELzJdID0gIm1lYW5fcmF3IiwKIH07CiAKLWludCBpaW9fcHVzaF9ldmVudChzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8sCi0JCSAgIGludCBldl9saW5lLAotCQkgICBpbnQgZXZfY29kZSwKLQkJICAgczY0IHRpbWVzdGFtcCkKKy8qKgorICogc3RydWN0IGlpb19kZXRlY3RlZF9ldmVudF9saXN0IC0gbGlzdCBlbGVtZW50IGZvciBldmVudHMgdGhhdCBoYXZlIG9jY3VycmVkCisgKiBAbGlzdDoJCWxpbmtlZCBsaXN0IGhlYWRlcgorICogQGV2OgkJCXRoZSBldmVudCBpdHNlbGYKKyAqLworc3RydWN0IGlpb19kZXRlY3RlZF9ldmVudF9saXN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlsaXN0OworCXN0cnVjdCBpaW9fZXZlbnRfZGF0YQkJZXY7Cit9OworCisvKioKKyAqIHN0cnVjdCBpaW9fZXZlbnRfaW50ZXJmYWNlIC0gY2hyZGV2IGludGVyZmFjZSBmb3IgYW4gZXZlbnQgbGluZQorICogQGRldjoJCWRldmljZSBhc3NvY2F0ZWQgd2l0aCBldmVudCBpbnRlcmZhY2UKKyAqIEB3YWl0OgkJd2FpdCBxdWV1ZSB0byBhbGxvdyBibG9ja2luZyByZWFkcyBvZiBldmVudHMKKyAqIEBldmVudF9saXN0X2xvY2s6CW11dGV4IHRvIHByb3RlY3QgdGhlIGxpc3Qgb2YgZGV0ZWN0ZWQgZXZlbnRzCisgKiBAZGV0X2V2ZW50czoJCWxpc3Qgb2YgZGV0ZWN0ZWQgZXZlbnRzCisgKiBAbWF4X2V2ZW50czoJCW1heGltdW0gbnVtYmVyIG9mIGV2ZW50cyBiZWZvcmUgbmV3IG9uZXMgYXJlIGRyb3BwZWQKKyAqIEBjdXJyZW50X2V2ZW50czoJbnVtYmVyIG9mIGV2ZW50cyBpbiBkZXRlY3RlZCBsaXN0CisgKiBAZmxhZ3M6CQlmaWxlIG9wZXJhdGlvbnMgcmVsYXRlZCBmbGFncyBpbmNsdWRpbmcgYnVzeSBmbGFnLgorICovCitzdHJ1Y3QgaWlvX2V2ZW50X2ludGVyZmFjZSB7CisJd2FpdF9xdWV1ZV9oZWFkX3QJCQl3YWl0OworCXN0cnVjdCBtdXRleAkJCQlldmVudF9saXN0X2xvY2s7CisJc3RydWN0IGxpc3RfaGVhZAkJCWRldF9ldmVudHM7CisJaW50CQkJCQltYXhfZXZlbnRzOworCWludAkJCQkJY3VycmVudF9ldmVudHM7CisJc3RydWN0IGxpc3RfaGVhZCBkZXZfYXR0cl9saXN0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGF0dHJpYnV0ZV9ncm91cAkJCWdyb3VwOworfTsKKworaW50IGlpb19wdXNoX2V2ZW50KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHU2NCBldl9jb2RlLCBzNjQgdGltZXN0YW1wKQogewotCXN0cnVjdCBpaW9fZXZlbnRfaW50ZXJmYWNlICpldl9pbnQKLQkJPSAmZGV2X2luZm8tPmV2ZW50X2ludGVyZmFjZXNbZXZfbGluZV07CisJc3RydWN0IGlpb19ldmVudF9pbnRlcmZhY2UgKmV2X2ludCA9IGluZGlvX2Rldi0+ZXZlbnRfaW50ZXJmYWNlOwogCXN0cnVjdCBpaW9fZGV0ZWN0ZWRfZXZlbnRfbGlzdCAqZXY7CiAJaW50IHJldCA9IDA7CiAKIAkvKiBEb2VzIGFueW9uZSBjYXJlPyAqLwogCW11dGV4X2xvY2soJmV2X2ludC0+ZXZlbnRfbGlzdF9sb2NrKTsKLQlpZiAodGVzdF9iaXQoSUlPX0JVU1lfQklUX1BPUywgJmV2X2ludC0+aGFuZGxlci5mbGFncykpIHsKKwlpZiAodGVzdF9iaXQoSUlPX0JVU1lfQklUX1BPUywgJmV2X2ludC0+ZmxhZ3MpKSB7CiAJCWlmIChldl9pbnQtPmN1cnJlbnRfZXZlbnRzID09IGV2X2ludC0+bWF4X2V2ZW50cykgewogCQkJbXV0ZXhfdW5sb2NrKCZldl9pbnQtPmV2ZW50X2xpc3RfbG9jayk7CiAJCQlyZXR1cm4gMDsKQEAgLTEyNSw3ICsxNTMsNiBAQAogfQogRVhQT1JUX1NZTUJPTChpaW9fcHVzaF9ldmVudCk7CiAKLQogLyogVGhpcyB0dXJucyB1cCBhbiBhd2Z1bCBsb3QgKi8KIHNzaXplX3QgaWlvX3JlYWRfY29uc3RfYXR0cihzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCkBAIC0xMzUsNyArMTYyLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woaWlvX3JlYWRfY29uc3RfYXR0cik7CiAKLQogc3RhdGljIHNzaXplX3QgaWlvX2V2ZW50X2NocmRldl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlcCwKIAkJCQkgICAgIGNoYXIgX191c2VyICpidWYsCiAJCQkJICAgICBzaXplX3QgY291bnQsCkBAIC0xODcsMTIgKzIxMywxMSBAQAogCiBzdGF0aWMgaW50IGlpb19ldmVudF9jaHJkZXZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZXApCiB7Ci0Jc3RydWN0IGlpb19oYW5kbGVyICpoYW5kID0gaWlvX2NkZXZfdG9faGFuZGxlcihpbm9kZS0+aV9jZGV2KTsKLQlzdHJ1Y3QgaWlvX2V2ZW50X2ludGVyZmFjZSAqZXZfaW50ID0gaGFuZC0+cHJpdmF0ZTsKKwlzdHJ1Y3QgaWlvX2V2ZW50X2ludGVyZmFjZSAqZXZfaW50ID0gZmlsZXAtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgaWlvX2RldGVjdGVkX2V2ZW50X2xpc3QgKmVsLCAqdDsKIAogCW11dGV4X2xvY2soJmV2X2ludC0+ZXZlbnRfbGlzdF9sb2NrKTsKLQljbGVhcl9iaXQoSUlPX0JVU1lfQklUX1BPUywgJmV2X2ludC0+aGFuZGxlci5mbGFncyk7CisJY2xlYXJfYml0KElJT19CVVNZX0JJVF9QT1MsICZldl9pbnQtPmZsYWdzKTsKIAkvKgogCSAqIEluIG9yZGVyIHRvIG1haW50YWluIGEgY2xlYW4gc3RhdGUgZm9yIHJlb3BlbmluZywKIAkgKiBjbGVhciBvdXQgYW55IGF3YWl0aW5nIGV2ZW50cy4gVGhlIG1hc2sgd2lsbCBwcmV2ZW50CkBAIC0yMDIsMjMgKzIyNyw3IEBACiAJCWxpc3RfZGVsKCZlbC0+bGlzdCk7CiAJCWtmcmVlKGVsKTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZldl9pbnQtPmV2ZW50X2xpc3RfbG9jayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpaW9fZXZlbnRfY2hyZGV2X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGVwKQotewotCXN0cnVjdCBpaW9faGFuZGxlciAqaGFuZCA9IGlpb19jZGV2X3RvX2hhbmRsZXIoaW5vZGUtPmlfY2Rldik7Ci0Jc3RydWN0IGlpb19ldmVudF9pbnRlcmZhY2UgKmV2X2ludCA9IGhhbmQtPnByaXZhdGU7Ci0KLQltdXRleF9sb2NrKCZldl9pbnQtPmV2ZW50X2xpc3RfbG9jayk7Ci0JaWYgKHRlc3RfYW5kX3NldF9iaXQoSUlPX0JVU1lfQklUX1BPUywgJmhhbmQtPmZsYWdzKSkgewotCQlmb3BzX3B1dChmaWxlcC0+Zl9vcCk7Ci0JCW11dGV4X3VubG9jaygmZXZfaW50LT5ldmVudF9saXN0X2xvY2spOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQlmaWxlcC0+cHJpdmF0ZV9kYXRhID0gaGFuZC0+cHJpdmF0ZTsKKwlldl9pbnQtPmN1cnJlbnRfZXZlbnRzID0gMDsKIAltdXRleF91bmxvY2soJmV2X2ludC0+ZXZlbnRfbGlzdF9sb2NrKTsKIAogCXJldHVybiAwOwpAQCAtMjI3LDEyNCArMjM2LDI1IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpaW9fZXZlbnRfY2hyZGV2X2ZpbGVvcHMgPSB7CiAJLnJlYWQgPSAgaWlvX2V2ZW50X2NocmRldl9yZWFkLAogCS5yZWxlYXNlID0gaWlvX2V2ZW50X2NocmRldl9yZWxlYXNlLAotCS5vcGVuID0gaWlvX2V2ZW50X2NocmRldl9vcGVuLAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5sbHNlZWsgPSBub29wX2xsc2VlaywKIH07CiAKLXN0YXRpYyB2b2lkIGlpb19ldmVudF9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGlpb19ldmVudF9nZXRmZChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewotCXN0cnVjdCBpaW9fZXZlbnRfaW50ZXJmYWNlICpldl9pbnQKLQkJPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgaWlvX2V2ZW50X2ludGVyZmFjZSwgZGV2KTsKLQljZGV2X2RlbCgmZXZfaW50LT5oYW5kbGVyLmNocmRldik7Ci0JaWlvX2RldmljZV9mcmVlX2NocmRldl9taW5vcihNSU5PUihkZXYtPmRldnQpKTsKLX07CisJaWYgKGluZGlvX2Rldi0+ZXZlbnRfaW50ZXJmYWNlID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOwogCi1zdGF0aWMgc3RydWN0IGRldmljZV90eXBlIGlpb19ldmVudF90eXBlID0gewotCS5yZWxlYXNlID0gaWlvX2V2ZW50X2Rldl9yZWxlYXNlLAotfTsKLQotaW50IGlpb19kZXZpY2VfZ2V0X2NocmRldl9taW5vcih2b2lkKQotewotCWludCByZXQsIHZhbDsKLQotaWRhX2FnYWluOgotCWlmICh1bmxpa2VseShpZGFfcHJlX2dldCgmaWlvX2NocmRldl9pZGEsIEdGUF9LRVJORUwpID09IDApKQotCQlyZXR1cm4gLUVOT01FTTsKLQlzcGluX2xvY2soJmlpb19pZGFfbG9jayk7Ci0JcmV0ID0gaWRhX2dldF9uZXcoJmlpb19jaHJkZXZfaWRhLCAmdmFsKTsKLQlzcGluX3VubG9jaygmaWlvX2lkYV9sb2NrKTsKLQlpZiAodW5saWtlbHkocmV0ID09IC1FQUdBSU4pKQotCQlnb3RvIGlkYV9hZ2FpbjsKLQllbHNlIGlmICh1bmxpa2VseShyZXQpKQotCQlyZXR1cm4gcmV0OwotCWlmICh2YWwgPiBJSU9fREVWX01BWCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcmV0dXJuIHZhbDsKLX0KLQotdm9pZCBpaW9fZGV2aWNlX2ZyZWVfY2hyZGV2X21pbm9yKGludCB2YWwpCi17Ci0Jc3Bpbl9sb2NrKCZpaW9faWRhX2xvY2spOwotCWlkYV9yZW1vdmUoJmlpb19jaHJkZXZfaWRhLCB2YWwpOwotCXNwaW5fdW5sb2NrKCZpaW9faWRhX2xvY2spOwotfQotCi1zdGF0aWMgaW50IGlpb19zZXR1cF9ldl9pbnQoc3RydWN0IGlpb19ldmVudF9pbnRlcmZhY2UgKmV2X2ludCwKLQkJCSAgICBjb25zdCBjaGFyICpkZXZfbmFtZSwKLQkJCSAgICBpbnQgaW5kZXgsCi0JCQkgICAgc3RydWN0IG1vZHVsZSAqb3duZXIsCi0JCQkgICAgc3RydWN0IGRldmljZSAqZGV2KQotewotCWludCByZXQsIG1pbm9yOwotCi0JZXZfaW50LT5kZXYuYnVzID0gJmlpb19idXNfdHlwZTsKLQlldl9pbnQtPmRldi5wYXJlbnQgPSBkZXY7Ci0JZXZfaW50LT5kZXYudHlwZSA9ICZpaW9fZXZlbnRfdHlwZTsKLQlkZXZpY2VfaW5pdGlhbGl6ZSgmZXZfaW50LT5kZXYpOwotCi0JbWlub3IgPSBpaW9fZGV2aWNlX2dldF9jaHJkZXZfbWlub3IoKTsKLQlpZiAobWlub3IgPCAwKSB7Ci0JCXJldCA9IG1pbm9yOwotCQlnb3RvIGVycm9yX2RldmljZV9wdXQ7CisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5ldmVudF9pbnRlcmZhY2UtPmV2ZW50X2xpc3RfbG9jayk7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoSUlPX0JVU1lfQklUX1BPUywKKwkJCSAgICAgJmluZGlvX2Rldi0+ZXZlbnRfaW50ZXJmYWNlLT5mbGFncykpIHsKKwkJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPmV2ZW50X2ludGVyZmFjZS0+ZXZlbnRfbGlzdF9sb2NrKTsKKwkJcmV0dXJuIC1FQlVTWTsKIAl9Ci0JZXZfaW50LT5kZXYuZGV2dCA9IE1LREVWKE1BSk9SKGlpb19kZXZ0KSwgbWlub3IpOwotCWRldl9zZXRfbmFtZSgmZXZfaW50LT5kZXYsICIlczpldmVudCVkIiwgZGV2X25hbWUsIGluZGV4KTsKLQotCXJldCA9IGRldmljZV9hZGQoJmV2X2ludC0+ZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX2ZyZWVfbWlub3I7Ci0KLQljZGV2X2luaXQoJmV2X2ludC0+aGFuZGxlci5jaHJkZXYsICZpaW9fZXZlbnRfY2hyZGV2X2ZpbGVvcHMpOwotCWV2X2ludC0+aGFuZGxlci5jaHJkZXYub3duZXIgPSBvd25lcjsKLQotCW11dGV4X2luaXQoJmV2X2ludC0+ZXZlbnRfbGlzdF9sb2NrKTsKLQkvKiBkaXNjdXNzaW9uIHBvaW50IC0gbWFrZSB0aGlzIHZhcmlhYmxlPyAqLwotCWV2X2ludC0+bWF4X2V2ZW50cyA9IDEwOwotCWV2X2ludC0+Y3VycmVudF9ldmVudHMgPSAwOwotCUlOSVRfTElTVF9IRUFEKCZldl9pbnQtPmRldF9ldmVudHMpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmV2X2ludC0+d2FpdCk7Ci0JZXZfaW50LT5oYW5kbGVyLnByaXZhdGUgPSBldl9pbnQ7Ci0JZXZfaW50LT5oYW5kbGVyLmZsYWdzID0gMDsKLQotCXJldCA9IGNkZXZfYWRkKCZldl9pbnQtPmhhbmRsZXIuY2hyZGV2LCBldl9pbnQtPmRldi5kZXZ0LCAxKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX3VucmVnX2RldmljZTsKLQotCXJldHVybiAwOwotCi1lcnJvcl91bnJlZ19kZXZpY2U6Ci0JZGV2aWNlX3VucmVnaXN0ZXIoJmV2X2ludC0+ZGV2KTsKLWVycm9yX2ZyZWVfbWlub3I6Ci0JaWlvX2RldmljZV9mcmVlX2NocmRldl9taW5vcihtaW5vcik7Ci1lcnJvcl9kZXZpY2VfcHV0OgotCXB1dF9kZXZpY2UoJmV2X2ludC0+ZGV2KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGlpb19mcmVlX2V2X2ludChzdHJ1Y3QgaWlvX2V2ZW50X2ludGVyZmFjZSAqZXZfaW50KQotewotCWRldmljZV91bnJlZ2lzdGVyKCZldl9pbnQtPmRldik7Ci0JcHV0X2RldmljZSgmZXZfaW50LT5kZXYpOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBpaW9fZGV2X2luaXQodm9pZCkKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmaWlvX2RldnQsIDAsIElJT19ERVZfTUFYLCAiaWlvIik7Ci0JaWYgKGVyciA8IDApCi0JCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBjaGFyIGRldiByZWdpb25cbiIsCi0JCSAgICAgICBfX0ZJTEVfXyk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaWlvX2Rldl9leGl0KHZvaWQpCi17Ci0JaWYgKGlpb19kZXZ0KQotCQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oaWlvX2RldnQsIElJT19ERVZfTUFYKTsKKwltdXRleF91bmxvY2soJmluZGlvX2Rldi0+ZXZlbnRfaW50ZXJmYWNlLT5ldmVudF9saXN0X2xvY2spOworCXJldHVybiBhbm9uX2lub2RlX2dldGZkKCJpaW86ZXZlbnQiLAorCQkJCSZpaW9fZXZlbnRfY2hyZGV2X2ZpbGVvcHMsCisJCQkJaW5kaW9fZGV2LT5ldmVudF9pbnRlcmZhY2UsIE9fUkRPTkxZKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgaWlvX2luaXQodm9pZCkKQEAgLTM2MCw5ICsyNzAsMTIgQEAKIAkJZ290byBlcnJvcl9ub3RoaW5nOwogCX0KIAotCXJldCA9IGlpb19kZXZfaW5pdCgpOwotCWlmIChyZXQgPCAwKQorCXJldCA9IGFsbG9jX2NocmRldl9yZWdpb24oJmlpb19kZXZ0LCAwLCBJSU9fREVWX01BWCwgImlpbyIpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBjaGFyIGRldiByZWdpb25cbiIsCisJCSAgICAgICBfX0ZJTEVfXyk7CiAJCWdvdG8gZXJyb3JfdW5yZWdpc3Rlcl9idXNfdHlwZTsKKwl9CiAKIAlyZXR1cm4gMDsKIApAQCAtMzc0LDcgKzI4Nyw4IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpaW9fZXhpdCh2b2lkKQogewotCWlpb19kZXZfZXhpdCgpOworCWlmIChpaW9fZGV2dCkKKwkJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGlpb19kZXZ0LCBJSU9fREVWX01BWCk7CiAJYnVzX3VucmVnaXN0ZXIoJmlpb19idXNfdHlwZSk7CiB9CiAKQEAgLTQ3Niw1NCArMzkwLDcgQEAKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgaW50IF9faWlvX2J1aWxkX3Bvc3RmaXgoc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCi0JCQkgICAgICAgYm9vbCBnZW5lcmljLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKnBvc3RmaXgsCi0JCQkgICAgICAgY2hhciAqKnJlc3VsdCkKLXsKLQljaGFyICphbGxfcG9zdDsKLQkvKiAzIG9wdGlvbnMgLSBnZW5lcmljLCBleHRlbmRfbmFtZSwgbW9kaWZpZWQgLSBpZiBnZW5lcmljLCBleHRlbmRfbmFtZQotCSogYW5kIG1vZGlmaWVkIGNhbm5vdCBhcHBseS4qLwotCi0JaWYgKGdlbmVyaWMgfHwgKCFjaGFuLT5tb2RpZmllZCAmJiAhY2hhbi0+ZXh0ZW5kX25hbWUpKSB7Ci0JCWFsbF9wb3N0ID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlcyIsIHBvc3RmaXgpOwotCX0gZWxzZSBpZiAoY2hhbi0+bW9kaWZpZWQpIHsKLQkJY29uc3QgY2hhciAqaW50ZXJtZWRpYXRlOwotCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKLQkJY2FzZSBJSU9fSU5URU5TSVRZOgotCQkJaW50ZXJtZWRpYXRlCi0JCQkJPSBpaW9fbW9kaWZpZXJfbmFtZXNfbGlnaHRbY2hhbi0+Y2hhbm5lbDJdOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUlPX0FDQ0VMOgotCQljYXNlIElJT19HWVJPOgotCQljYXNlIElJT19NQUdOOgotCQljYXNlIElJT19JTkNMSToKLQkJY2FzZSBJSU9fUk9UOgotCQljYXNlIElJT19BTkdMOgotCQkJaW50ZXJtZWRpYXRlCi0JCQkJPSBpaW9fbW9kaWZpZXJfbmFtZXNfYXhpYWxbY2hhbi0+Y2hhbm5lbDJdOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlpZiAoY2hhbi0+ZXh0ZW5kX25hbWUpCi0JCQlhbGxfcG9zdCA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXNfJXNfJXMiLAotCQkJCQkgICAgIGludGVybWVkaWF0ZSwKLQkJCQkJICAgICBjaGFuLT5leHRlbmRfbmFtZSwKLQkJCQkJICAgICBwb3N0Zml4KTsKLQkJZWxzZQotCQkJYWxsX3Bvc3QgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzXyVzIiwKLQkJCQkJICAgICBpbnRlcm1lZGlhdGUsCi0JCQkJCSAgICAgcG9zdGZpeCk7Ci0JfSBlbHNlCi0JCWFsbF9wb3N0ID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc18lcyIsIGNoYW4tPmV4dGVuZF9uYW1lLAotCQkJCSAgICAgcG9zdGZpeCk7Ci0JaWYgKGFsbF9wb3N0ID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCSpyZXN1bHQgPSBhbGxfcG9zdDsKLQlyZXR1cm4gMDsKLX0KLQorc3RhdGljCiBpbnQgX19paW9fZGV2aWNlX2F0dHJfaW5pdChzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2X2F0dHIsCiAJCQkgICBjb25zdCBjaGFyICpwb3N0Zml4LAogCQkJICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCkBAIC01MzksMjggKzQwNiw3NyBAQAogCWludCByZXQ7CiAJY2hhciAqbmFtZV9mb3JtYXQsICpmdWxsX3Bvc3RmaXg7CiAJc3lzZnNfYXR0cl9pbml0KCZkZXZfYXR0ci0+YXR0cik7Ci0JcmV0ID0gX19paW9fYnVpbGRfcG9zdGZpeChjaGFuLCBnZW5lcmljLCBwb3N0Zml4LCAmZnVsbF9wb3N0Zml4KTsKLQlpZiAocmV0KQorCisJLyogQnVpbGQgdXAgcG9zdGZpeCBvZiA8ZXh0ZW5kX25hbWU+Xzxtb2RpZmllcj5fcG9zdGZpeCAqLworCWlmIChjaGFuLT5tb2RpZmllZCkgeworCQlpZiAoY2hhbi0+ZXh0ZW5kX25hbWUpCisJCQlmdWxsX3Bvc3RmaXggPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzXyVzXyVzIiwKKwkJCQkJCSBpaW9fbW9kaWZpZXJfbmFtZXNbY2hhbgorCQkJCQkJCQkgICAgLT5jaGFubmVsMl0sCisJCQkJCQkgY2hhbi0+ZXh0ZW5kX25hbWUsCisJCQkJCQkgcG9zdGZpeCk7CisJCWVsc2UKKwkJCWZ1bGxfcG9zdGZpeCA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXNfJXMiLAorCQkJCQkJIGlpb19tb2RpZmllcl9uYW1lc1tjaGFuCisJCQkJCQkJCSAgICAtPmNoYW5uZWwyXSwKKwkJCQkJCSBwb3N0Zml4KTsKKwl9IGVsc2UgeworCQlpZiAoY2hhbi0+ZXh0ZW5kX25hbWUgPT0gTlVMTCkKKwkJCWZ1bGxfcG9zdGZpeCA9IGtzdHJkdXAocG9zdGZpeCwgR0ZQX0tFUk5FTCk7CisJCWVsc2UKKwkJCWZ1bGxfcG9zdGZpeCA9IGthc3ByaW50ZihHRlBfS0VSTkVMLAorCQkJCQkJICIlc18lcyIsCisJCQkJCQkgY2hhbi0+ZXh0ZW5kX25hbWUsCisJCQkJCQkgcG9zdGZpeCk7CisJfQorCWlmIChmdWxsX3Bvc3RmaXggPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycm9yX3JldDsKKwl9CiAKLQkvKiBTcGVjaWFsIGNhc2UgZm9yIHR5cGVzIHRoYXQgdXNlcyBib3RoIGNoYW5uZWwgbnVtYmVycyBpbiBuYW1pbmcgKi8KLQlpZiAoY2hhbi0+dHlwZSA9PSBJSU9fSU5fRElGRiAmJiAhZ2VuZXJpYykKLQkJbmFtZV9mb3JtYXQKLQkJCT0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc18lcyIsCi0JCQkJICAgIGlpb19jaGFuX3R5cGVfbmFtZV9zcGVjX2NvbXBsZXhbY2hhbi0+dHlwZV0sCi0JCQkJICAgIGZ1bGxfcG9zdGZpeCk7Ci0JZWxzZSBpZiAoZ2VuZXJpYyB8fCAhY2hhbi0+aW5kZXhlZCkKLQkJbmFtZV9mb3JtYXQKLQkJCT0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc18lcyIsCi0JCQkJICAgIGlpb19jaGFuX3R5cGVfbmFtZV9zcGVjX3NoYXJlZFtjaGFuLT50eXBlXSwKLQkJCQkgICAgZnVsbF9wb3N0Zml4KTsKLQllbHNlCi0JCW5hbWVfZm9ybWF0Ci0JCQk9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXMlZF8lcyIsCi0JCQkJICAgIGlpb19jaGFuX3R5cGVfbmFtZV9zcGVjX3NoYXJlZFtjaGFuLT50eXBlXSwKLQkJCQkgICAgY2hhbi0+Y2hhbm5lbCwKLQkJCQkgICAgZnVsbF9wb3N0Zml4KTsKLQorCWlmIChjaGFuLT5kaWZmZXJlbnRpYWwpIHsgLyogRGlmZmVyZW50aWFsICBjYW4gbm90IGhhdmUgbW9kaWZpZXIgKi8KKwkJaWYgKGdlbmVyaWMpCisJCQluYW1lX2Zvcm1hdAorCQkJCT0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc18lcy0lc18lcyIsCisJCQkJCSAgICBpaW9fZGlyZWN0aW9uW2NoYW4tPm91dHB1dF0sCisJCQkJCSAgICBpaW9fY2hhbl90eXBlX25hbWVfc3BlY1tjaGFuLT50eXBlXSwKKwkJCQkJICAgIGlpb19jaGFuX3R5cGVfbmFtZV9zcGVjW2NoYW4tPnR5cGVdLAorCQkJCQkgICAgZnVsbF9wb3N0Zml4KTsKKwkJZWxzZSBpZiAoY2hhbi0+aW5kZXhlZCkKKwkJCW5hbWVfZm9ybWF0CisJCQkJPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzXyVzJWQtJXMlZF8lcyIsCisJCQkJCSAgICBpaW9fZGlyZWN0aW9uW2NoYW4tPm91dHB1dF0sCisJCQkJCSAgICBpaW9fY2hhbl90eXBlX25hbWVfc3BlY1tjaGFuLT50eXBlXSwKKwkJCQkJICAgIGNoYW4tPmNoYW5uZWwsCisJCQkJCSAgICBpaW9fY2hhbl90eXBlX25hbWVfc3BlY1tjaGFuLT50eXBlXSwKKwkJCQkJICAgIGNoYW4tPmNoYW5uZWwyLAorCQkJCQkgICAgZnVsbF9wb3N0Zml4KTsKKwkJZWxzZSB7CisJCQlXQVJOX09OKCJEaWZmZXJlbnRpYWwgY2hhbm5lbHMgbXVzdCBiZSBpbmRleGVkXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGVycm9yX2ZyZWVfZnVsbF9wb3N0Zml4OworCQl9CisJfSBlbHNlIHsgLyogU2luZ2xlIGVuZGVkICovCisJCWlmIChnZW5lcmljKQorCQkJbmFtZV9mb3JtYXQKKwkJCQk9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXNfJXNfJXMiLAorCQkJCQkgICAgaWlvX2RpcmVjdGlvbltjaGFuLT5vdXRwdXRdLAorCQkJCQkgICAgaWlvX2NoYW5fdHlwZV9uYW1lX3NwZWNbY2hhbi0+dHlwZV0sCisJCQkJCSAgICBmdWxsX3Bvc3RmaXgpOworCQllbHNlIGlmIChjaGFuLT5pbmRleGVkKQorCQkJbmFtZV9mb3JtYXQKKwkJCQk9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXNfJXMlZF8lcyIsCisJCQkJCSAgICBpaW9fZGlyZWN0aW9uW2NoYW4tPm91dHB1dF0sCisJCQkJCSAgICBpaW9fY2hhbl90eXBlX25hbWVfc3BlY1tjaGFuLT50eXBlXSwKKwkJCQkJICAgIGNoYW4tPmNoYW5uZWwsCisJCQkJCSAgICBmdWxsX3Bvc3RmaXgpOworCQllbHNlCisJCQluYW1lX2Zvcm1hdAorCQkJCT0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc18lc18lcyIsCisJCQkJCSAgICBpaW9fZGlyZWN0aW9uW2NoYW4tPm91dHB1dF0sCisJCQkJCSAgICBpaW9fY2hhbl90eXBlX25hbWVfc3BlY1tjaGFuLT50eXBlXSwKKwkJCQkJICAgIGZ1bGxfcG9zdGZpeCk7CisJfQogCWlmIChuYW1lX2Zvcm1hdCA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfZnJlZV9mdWxsX3Bvc3RmaXg7CkBAIC01OTYsMTMgKzUxMiwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgX19paW9fZGV2aWNlX2F0dHJfZGVpbml0KHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZfYXR0cikKK3N0YXRpYyB2b2lkIF9faWlvX2RldmljZV9hdHRyX2RlaW5pdChzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2X2F0dHIpCiB7CiAJa2ZyZWUoZGV2X2F0dHItPmF0dHIubmFtZSk7CiB9CiAKIGludCBfX2lpb19hZGRfY2hhbl9kZXZhdHRyKGNvbnN0IGNoYXIgKnBvc3RmaXgsCi0JCQkgICBjb25zdCBjaGFyICpncm91cCwKIAkJCSAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAogCQkJICAgc3NpemVfdCAoKnJlYWRmdW5jKShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKQEAgLTYxMSw3ICs1MjYsNyBAQAogCQkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJCQljb25zdCBjaGFyICpidWYsCiAJCQkJCQlzaXplX3QgbGVuKSwKLQkJCSAgIGludCBtYXNrLAorCQkJICAgdTY0IG1hc2ssCiAJCQkgICBib29sIGdlbmVyaWMsCiAJCQkgICBzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICBzdHJ1Y3QgbGlzdF9oZWFkICphdHRyX2xpc3QpCkBAIC02NDAsMTIgKzU1NSw2IEBACiAJCQlyZXQgPSAtRUJVU1k7CiAJCQlnb3RvIGVycm9yX2RldmljZV9hdHRyX2RlaW5pdDsKIAkJfQotCi0JcmV0ID0gc3lzZnNfYWRkX2ZpbGVfdG9fZ3JvdXAoJmRldi0+a29iaiwKLQkJCQkgICAgICAmaWlvX2F0dHItPmRldl9hdHRyLmF0dHIsIGdyb3VwKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcl9kZXZpY2VfYXR0cl9kZWluaXQ7Ci0KIAlsaXN0X2FkZCgmaWlvX2F0dHItPmwsIGF0dHJfbGlzdCk7CiAKIAlyZXR1cm4gMDsKQEAgLTY1OCw1OSArNTY3LDUyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBpaW9fZGV2aWNlX2FkZF9jaGFubmVsX3N5c2ZzKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbywKK3N0YXRpYyBpbnQgaWlvX2RldmljZV9hZGRfY2hhbm5lbF9zeXNmcyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAogCQkJCQlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbikKIHsKLQlpbnQgcmV0LCBpOwotCisJaW50IHJldCwgaSwgYXR0cmNvdW50ID0gMDsKIAogCWlmIChjaGFuLT5jaGFubmVsIDwgMCkKIAkJcmV0dXJuIDA7Ci0JaWYgKGNoYW4tPnByb2Nlc3NlZF92YWwpCi0JCXJldCA9IF9faWlvX2FkZF9jaGFuX2RldmF0dHIoImlucHV0IiwgTlVMTCwgY2hhbiwKLQkJCQkJICAgICAmaWlvX3JlYWRfY2hhbm5lbF9pbmZvLAotCQkJCQkgICAgIE5VTEwsCi0JCQkJCSAgICAgMCwKLQkJCQkJICAgICAwLAotCQkJCQkgICAgICZkZXZfaW5mby0+ZGV2LAotCQkJCQkgICAgICZkZXZfaW5mby0+Y2hhbm5lbF9hdHRyX2xpc3QpOwotCWVsc2UKLQkJcmV0ID0gX19paW9fYWRkX2NoYW5fZGV2YXR0cigicmF3IiwgTlVMTCwgY2hhbiwKLQkJCQkJICAgICAmaWlvX3JlYWRfY2hhbm5lbF9pbmZvLAotCQkJCQkgICAgIChjaGFuLT50eXBlID09IElJT19PVVQgPwotCQkJCQkgICAgICZpaW9fd3JpdGVfY2hhbm5lbF9pbmZvIDogTlVMTCksCi0JCQkJCSAgICAgMCwKLQkJCQkJICAgICAwLAotCQkJCQkgICAgICZkZXZfaW5mby0+ZGV2LAotCQkJCQkgICAgICZkZXZfaW5mby0+Y2hhbm5lbF9hdHRyX2xpc3QpOworCisJcmV0ID0gX19paW9fYWRkX2NoYW5fZGV2YXR0cihpaW9fZGF0YV90eXBlX25hbWVbY2hhbi0+cHJvY2Vzc2VkX3ZhbF0sCisJCQkJICAgICBjaGFuLAorCQkJCSAgICAgJmlpb19yZWFkX2NoYW5uZWxfaW5mbywKKwkJCQkgICAgIChjaGFuLT5vdXRwdXQgPworCQkJCSAgICAgICZpaW9fd3JpdGVfY2hhbm5lbF9pbmZvIDogTlVMTCksCisJCQkJICAgICAwLAorCQkJCSAgICAgMCwKKwkJCQkgICAgICZpbmRpb19kZXYtPmRldiwKKwkJCQkgICAgICZpbmRpb19kZXYtPmNoYW5uZWxfYXR0cl9saXN0KTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX3JldDsKKwlhdHRyY291bnQrKzsKIAogCWZvcl9lYWNoX3NldF9iaXQoaSwgJmNoYW4tPmluZm9fbWFzaywgc2l6ZW9mKGxvbmcpKjgpIHsKIAkJcmV0ID0gX19paW9fYWRkX2NoYW5fZGV2YXR0cihpaW9fY2hhbl9pbmZvX3Bvc3RmaXhbaS8yXSwKLQkJCQkJICAgICBOVUxMLCBjaGFuLAorCQkJCQkgICAgIGNoYW4sCiAJCQkJCSAgICAgJmlpb19yZWFkX2NoYW5uZWxfaW5mbywKIAkJCQkJICAgICAmaWlvX3dyaXRlX2NoYW5uZWxfaW5mbywKIAkJCQkJICAgICAoMSA8PCBpKSwKIAkJCQkJICAgICAhKGklMiksCi0JCQkJCSAgICAgJmRldl9pbmZvLT5kZXYsCi0JCQkJCSAgICAgJmRldl9pbmZvLT5jaGFubmVsX2F0dHJfbGlzdCk7CisJCQkJCSAgICAgJmluZGlvX2Rldi0+ZGV2LAorCQkJCQkgICAgICZpbmRpb19kZXYtPmNoYW5uZWxfYXR0cl9saXN0KTsKIAkJaWYgKHJldCA9PSAtRUJVU1kgJiYgKGklMiA9PSAwKSkgewogCQkJcmV0ID0gMDsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBlcnJvcl9yZXQ7CisJCWF0dHJjb3VudCsrOwogCX0KKwlyZXQgPSBhdHRyY291bnQ7CiBlcnJvcl9yZXQ6CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgaWlvX2RldmljZV9yZW1vdmVfYW5kX2ZyZWVfcmVhZF9hdHRyKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbywKK3N0YXRpYyB2b2lkIGlpb19kZXZpY2VfcmVtb3ZlX2FuZF9mcmVlX3JlYWRfYXR0cihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAogCQkJCQkJIHN0cnVjdCBpaW9fZGV2X2F0dHIgKnApCiB7Ci0Jc3lzZnNfcmVtb3ZlX2ZpbGVfZnJvbV9ncm91cCgmZGV2X2luZm8tPmRldi5rb2JqLAotCQkJCSAgICAgJnAtPmRldl9hdHRyLmF0dHIsIE5VTEwpOwogCWtmcmVlKHAtPmRldl9hdHRyLmF0dHIubmFtZSk7CiAJa2ZyZWUocCk7CiB9CkBAIC03MjUsMTA3ICs2MjcsOTEgQEAKIAogc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIGlpb19zaG93X2Rldl9uYW1lLCBOVUxMKTsKIAotc3RhdGljIGludCBpaW9fZGV2aWNlX3JlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbykKK3N0YXRpYyBpbnQgaWlvX2RldmljZV9yZWdpc3Rlcl9zeXNmcyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewotCWludCBpLCByZXQgPSAwOworCWludCBpLCByZXQgPSAwLCBhdHRyY291bnQsIGF0dHJuLCBhdHRyY291bnRfb3JpZyA9IDA7CiAJc3RydWN0IGlpb19kZXZfYXR0ciAqcCwgKm47CisJc3RydWN0IGF0dHJpYnV0ZSAqKmF0dHI7CiAKLQlpZiAoZGV2X2luZm8tPmluZm8tPmF0dHJzKSB7Ci0JCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2X2luZm8tPmRldi5rb2JqLAotCQkJCQkgZGV2X2luZm8tPmluZm8tPmF0dHJzKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihkZXZfaW5mby0+ZGV2LnBhcmVudCwKLQkJCQkiRmFpbGVkIHRvIHJlZ2lzdGVyIHN5c2ZzIGhvb2tzXG4iKTsKLQkJCWdvdG8gZXJyb3JfcmV0OwotCQl9CisJLyogRmlyc3QgY291bnQgZWxlbWVudHMgaW4gYW55IGV4aXN0aW5nIGdyb3VwICovCisJaWYgKGluZGlvX2Rldi0+aW5mby0+YXR0cnMpIHsKKwkJYXR0ciA9IGluZGlvX2Rldi0+aW5mby0+YXR0cnMtPmF0dHJzOworCQl3aGlsZSAoKmF0dHIrKyAhPSBOVUxMKQorCQkJYXR0cmNvdW50X29yaWcrKzsKIAl9Ci0KKwlhdHRyY291bnQgPSBhdHRyY291bnRfb3JpZzsKIAkvKgogCSAqIE5ldyBjaGFubmVsIHJlZ2lzdHJhdGlvbiBtZXRob2QgLSByZWxpZXMgb24gdGhlIGZhY3QgYSBncm91cCBkb2VzCiAJICogIG5vdCBuZWVkIHRvIGJlIGluaXRpYWxpemVkIGlmIGl0IGlzIG5hbWUgaXMgTlVMTC4KIAkgKi8KLQlJTklUX0xJU1RfSEVBRCgmZGV2X2luZm8tPmNoYW5uZWxfYXR0cl9saXN0KTsKLQlpZiAoZGV2X2luZm8tPmNoYW5uZWxzKQotCQlmb3IgKGkgPSAwOyBpIDwgZGV2X2luZm8tPm51bV9jaGFubmVsczsgaSsrKSB7Ci0JCQlyZXQgPSBpaW9fZGV2aWNlX2FkZF9jaGFubmVsX3N5c2ZzKGRldl9pbmZvLAotCQkJCQkJCSAgICZkZXZfaW5mbworCUlOSVRfTElTVF9IRUFEKCZpbmRpb19kZXYtPmNoYW5uZWxfYXR0cl9saXN0KTsKKwlpZiAoaW5kaW9fZGV2LT5jaGFubmVscykKKwkJZm9yIChpID0gMDsgaSA8IGluZGlvX2Rldi0+bnVtX2NoYW5uZWxzOyBpKyspIHsKKwkJCXJldCA9IGlpb19kZXZpY2VfYWRkX2NoYW5uZWxfc3lzZnMoaW5kaW9fZGV2LAorCQkJCQkJCSAgICZpbmRpb19kZXYKIAkJCQkJCQkgICAtPmNoYW5uZWxzW2ldKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCWdvdG8gZXJyb3JfY2xlYXJfYXR0cnM7CisJCQlhdHRyY291bnQgKz0gcmV0OwogCQl9Ci0JaWYgKGRldl9pbmZvLT5uYW1lKSB7Ci0JCXJldCA9IHN5c2ZzX2FkZF9maWxlX3RvX2dyb3VwKCZkZXZfaW5mby0+ZGV2LmtvYmosCi0JCQkJCSAgICAgICZkZXZfYXR0cl9uYW1lLmF0dHIsCi0JCQkJCSAgICAgIE5VTEwpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnJvcl9jbGVhcl9hdHRyczsKKworCWlmIChpbmRpb19kZXYtPm5hbWUpCisJCWF0dHJjb3VudCsrOworCisJaW5kaW9fZGV2LT5jaGFuX2F0dHJfZ3JvdXAuYXR0cnMKKwkJPSBremFsbG9jKHNpemVvZihpbmRpb19kZXYtPmNoYW5fYXR0cl9ncm91cC5hdHRyc1swXSkqCisJCQkgIChhdHRyY291bnQgKyAxKSwKKwkJCSAgR0ZQX0tFUk5FTCk7CisJaWYgKGluZGlvX2Rldi0+Y2hhbl9hdHRyX2dyb3VwLmF0dHJzID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9jbGVhcl9hdHRyczsKIAl9CisJLyogQ29weSBhY3Jvc3Mgb3JpZ2luYWwgYXR0cmlidXRlcyAqLworCWlmIChpbmRpb19kZXYtPmluZm8tPmF0dHJzKQorCQltZW1jcHkoaW5kaW9fZGV2LT5jaGFuX2F0dHJfZ3JvdXAuYXR0cnMsCisJCSAgICAgICBpbmRpb19kZXYtPmluZm8tPmF0dHJzLT5hdHRycywKKwkJICAgICAgIHNpemVvZihpbmRpb19kZXYtPmNoYW5fYXR0cl9ncm91cC5hdHRyc1swXSkKKwkJICAgICAgICphdHRyY291bnRfb3JpZyk7CisJYXR0cm4gPSBhdHRyY291bnRfb3JpZzsKKwkvKiBBZGQgYWxsIGVsZW1lbnRzIGZyb20gdGhlIGxpc3QuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmaW5kaW9fZGV2LT5jaGFubmVsX2F0dHJfbGlzdCwgbCkKKwkJaW5kaW9fZGV2LT5jaGFuX2F0dHJfZ3JvdXAuYXR0cnNbYXR0cm4rK10gPSAmcC0+ZGV2X2F0dHIuYXR0cjsKKwlpZiAoaW5kaW9fZGV2LT5uYW1lKQorCQlpbmRpb19kZXYtPmNoYW5fYXR0cl9ncm91cC5hdHRyc1thdHRybisrXSA9ICZkZXZfYXR0cl9uYW1lLmF0dHI7CisKKwlpbmRpb19kZXYtPmdyb3Vwc1tpbmRpb19kZXYtPmdyb3VwY291bnRlcisrXSA9CisJCSZpbmRpb19kZXYtPmNoYW5fYXR0cl9ncm91cDsKKwogCXJldHVybiAwOwogCiBlcnJvcl9jbGVhcl9hdHRyczoKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocCwgbiwKLQkJCQkgJmRldl9pbmZvLT5jaGFubmVsX2F0dHJfbGlzdCwgbCkgeworCQkJCSAmaW5kaW9fZGV2LT5jaGFubmVsX2F0dHJfbGlzdCwgbCkgewogCQlsaXN0X2RlbCgmcC0+bCk7Ci0JCWlpb19kZXZpY2VfcmVtb3ZlX2FuZF9mcmVlX3JlYWRfYXR0cihkZXZfaW5mbywgcCk7CisJCWlpb19kZXZpY2VfcmVtb3ZlX2FuZF9mcmVlX3JlYWRfYXR0cihpbmRpb19kZXYsIHApOwogCX0KLQlpZiAoZGV2X2luZm8tPmluZm8tPmF0dHJzKQotCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldl9pbmZvLT5kZXYua29iaiwgZGV2X2luZm8tPmluZm8tPmF0dHJzKTsKLWVycm9yX3JldDoKLQlyZXR1cm4gcmV0OwogCisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgaWlvX2RldmljZV91bnJlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbykKK3N0YXRpYyB2b2lkIGlpb19kZXZpY2VfdW5yZWdpc3Rlcl9zeXNmcyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCiAJc3RydWN0IGlpb19kZXZfYXR0ciAqcCwgKm47Ci0JaWYgKGRldl9pbmZvLT5uYW1lKQotCQlzeXNmc19yZW1vdmVfZmlsZV9mcm9tX2dyb3VwKCZkZXZfaW5mby0+ZGV2LmtvYmosCi0JCQkJCSAgICAgJmRldl9hdHRyX25hbWUuYXR0ciwKLQkJCQkJICAgICBOVUxMKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocCwgbiwgJmRldl9pbmZvLT5jaGFubmVsX2F0dHJfbGlzdCwgbCkgeworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHAsIG4sICZpbmRpb19kZXYtPmNoYW5uZWxfYXR0cl9saXN0LCBsKSB7CiAJCWxpc3RfZGVsKCZwLT5sKTsKLQkJaWlvX2RldmljZV9yZW1vdmVfYW5kX2ZyZWVfcmVhZF9hdHRyKGRldl9pbmZvLCBwKTsKKwkJaWlvX2RldmljZV9yZW1vdmVfYW5kX2ZyZWVfcmVhZF9hdHRyKGluZGlvX2RldiwgcCk7CiAJfQotCi0JaWYgKGRldl9pbmZvLT5pbmZvLT5hdHRycykKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXZfaW5mby0+ZGV2LmtvYmosIGRldl9pbmZvLT5pbmZvLT5hdHRycyk7CisJa2ZyZWUoaW5kaW9fZGV2LT5jaGFuX2F0dHJfZ3JvdXAuYXR0cnMpOwogfQogCi0vKiBSZXR1cm4gYSBuZWdhdGl2ZSBlcnJubyBvbiBmYWlsdXJlICovCi1pbnQgaWlvX2dldF9uZXdfaWRhX3ZhbChzdHJ1Y3QgaWRhICp0aGlzX2lkYSkKLXsKLQlpbnQgcmV0OwotCWludCB2YWw7Ci0KLWlkYV9hZ2FpbjoKLQlpZiAodW5saWtlbHkoaWRhX3ByZV9nZXQodGhpc19pZGEsIEdGUF9LRVJORUwpID09IDApKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNwaW5fbG9jaygmaWlvX2lkYV9sb2NrKTsKLQlyZXQgPSBpZGFfZ2V0X25ldyh0aGlzX2lkYSwgJnZhbCk7Ci0Jc3Bpbl91bmxvY2soJmlpb19pZGFfbG9jayk7Ci0JaWYgKHVubGlrZWx5KHJldCA9PSAtRUFHQUlOKSkKLQkJZ290byBpZGFfYWdhaW47Ci0JZWxzZSBpZiAodW5saWtlbHkocmV0KSkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiB2YWw7Ci19Ci1FWFBPUlRfU1lNQk9MKGlpb19nZXRfbmV3X2lkYV92YWwpOwotCi12b2lkIGlpb19mcmVlX2lkYV92YWwoc3RydWN0IGlkYSAqdGhpc19pZGEsIGludCBpZCkKLXsKLQlzcGluX2xvY2soJmlpb19pZGFfbG9jayk7Ci0JaWRhX3JlbW92ZSh0aGlzX2lkYSwgaWQpOwotCXNwaW5fdW5sb2NrKCZpaW9faWRhX2xvY2spOwotfQotRVhQT1JUX1NZTUJPTChpaW9fZnJlZV9pZGFfdmFsKTsKLQogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpaW9fZXZfdHlwZV90ZXh0W10gPSB7CiAJW0lJT19FVl9UWVBFX1RIUkVTSF0gPSAidGhyZXNoIiwKIAlbSUlPX0VWX1RZUEVfTUFHXSA9ICJtYWciLAotCVtJSU9fRVZfVFlQRV9ST0NdID0gInJvYyIKKwlbSUlPX0VWX1RZUEVfUk9DXSA9ICJyb2MiLAorCVtJSU9fRVZfVFlQRV9USFJFU0hfQURBUFRJVkVdID0gInRocmVzaF9hZGFwdGl2ZSIsCisJW0lJT19FVl9UWVBFX01BR19BREFQVElWRV0gPSAibWFnX2FkYXB0aXZlIiwKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaWlvX2V2X2Rpcl90ZXh0W10gPSB7CkBAIC05MDcsMjMwICs3OTMsMjE0IEBACiAJcmV0dXJuIGxlbjsKIH0KIAotc3RhdGljIGludCBpaW9fZGV2aWNlX2FkZF9ldmVudF9zeXNmcyhzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8sCitzdGF0aWMgaW50IGlpb19kZXZpY2VfYWRkX2V2ZW50X3N5c2ZzKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCiAJCQkJICAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4pCiB7Ci0KLQlpbnQgcmV0ID0gMCwgaSwgbWFzazsKKwlpbnQgcmV0ID0gMCwgaSwgYXR0cmNvdW50ID0gMDsKKwl1NjQgbWFzayA9IDA7CiAJY2hhciAqcG9zdGZpeDsKIAlpZiAoIWNoYW4tPmV2ZW50X21hc2spCiAJCXJldHVybiAwOwogCiAJZm9yX2VhY2hfc2V0X2JpdChpLCAmY2hhbi0+ZXZlbnRfbWFzaywgc2l6ZW9mKGNoYW4tPmV2ZW50X21hc2spKjgpIHsKIAkJcG9zdGZpeCA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXNfJXNfZW4iLAotCQkJCSAgICBpaW9fZXZfdHlwZV90ZXh0W2kvSUlPX0VWX1RZUEVfTUFYXSwKLQkJCQkgICAgaWlvX2V2X2Rpcl90ZXh0W2klSUlPX0VWX1RZUEVfTUFYXSk7CisJCQkJICAgIGlpb19ldl90eXBlX3RleHRbaS9JSU9fRVZfRElSX01BWF0sCisJCQkJICAgIGlpb19ldl9kaXJfdGV4dFtpJUlJT19FVl9ESVJfTUFYXSk7CiAJCWlmIChwb3N0Zml4ID09IE5VTEwpIHsKIAkJCXJldCA9IC1FTk9NRU07CiAJCQlnb3RvIGVycm9yX3JldDsKIAkJfQotCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKLQkJCS8qIFN3aXRjaCB0aGlzIHRvIGEgdGFibGUgYXQgc29tZSBwb2ludCAqLwotCQljYXNlIElJT19JTjoKLQkJCW1hc2sgPSBJSU9fVU5NT0RfRVZFTlRfQ09ERShjaGFuLT50eXBlLCBjaGFuLT5jaGFubmVsLAotCQkJCQkJICAgIGkvSUlPX0VWX1RZUEVfTUFYLAotCQkJCQkJICAgIGklSUlPX0VWX1RZUEVfTUFYKTsKLQkJCWJyZWFrOwotCQljYXNlIElJT19BQ0NFTDoKKwkJaWYgKGNoYW4tPm1vZGlmaWVkKQogCQkJbWFzayA9IElJT19NT0RfRVZFTlRfQ09ERShjaGFuLT50eXBlLCAwLCBjaGFuLT5jaGFubmVsLAotCQkJCQkJICBpL0lJT19FVl9UWVBFX01BWCwKLQkJCQkJCSAgaSVJSU9fRVZfVFlQRV9NQVgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUlPX0lOX0RJRkY6Ci0JCQltYXNrID0gSUlPX01PRF9FVkVOVF9DT0RFKGNoYW4tPnR5cGUsIGNoYW4tPmNoYW5uZWwsCi0JCQkJCQkgIGNoYW4tPmNoYW5uZWwyLAotCQkJCQkJICBpL0lJT19FVl9UWVBFX01BWCwKLQkJCQkJCSAgaSVJSU9fRVZfVFlQRV9NQVgpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9JTkZPICJjdXJyZW50bHkgdW5oYW5kbGVkIHR5cGUgb2YgZXZlbnRcbiIpOwotCQl9CisJCQkJCQkgIGkvSUlPX0VWX0RJUl9NQVgsCisJCQkJCQkgIGklSUlPX0VWX0RJUl9NQVgpOworCQllbHNlIGlmIChjaGFuLT5kaWZmZXJlbnRpYWwpCisJCQltYXNrID0gSUlPX0VWRU5UX0NPREUoY2hhbi0+dHlwZSwKKwkJCQkJICAgICAgMCwgMCwKKwkJCQkJICAgICAgaSVJSU9fRVZfRElSX01BWCwKKwkJCQkJICAgICAgaS9JSU9fRVZfRElSX01BWCwKKwkJCQkJICAgICAgMCwKKwkJCQkJICAgICAgY2hhbi0+Y2hhbm5lbCwKKwkJCQkJICAgICAgY2hhbi0+Y2hhbm5lbDIpOworCQllbHNlCisJCQltYXNrID0gSUlPX1VOTU9EX0VWRU5UX0NPREUoY2hhbi0+dHlwZSwKKwkJCQkJCSAgICBjaGFuLT5jaGFubmVsLAorCQkJCQkJICAgIGkvSUlPX0VWX0RJUl9NQVgsCisJCQkJCQkgICAgaSVJSU9fRVZfRElSX01BWCk7CisKIAkJcmV0ID0gX19paW9fYWRkX2NoYW5fZGV2YXR0cihwb3N0Zml4LAotCQkJCQkgICAgIE5VTEwsCiAJCQkJCSAgICAgY2hhbiwKIAkJCQkJICAgICAmaWlvX2V2X3N0YXRlX3Nob3csCiAJCQkJCSAgICAgaWlvX2V2X3N0YXRlX3N0b3JlLAogCQkJCQkgICAgIG1hc2ssCi0JCQkJCSAgICAgLypIQUNLLiAtIGxpbWl0cyB1cyB0byBvbmUKLQkJCQkJICAgICAgIGV2ZW50IGludGVyZmFjZSAtIGZpeCBieQotCQkJCQkgICAgICAgZXh0ZW5kaW5nIHRoZSBiaXRtYXNrIC0gYnV0Ci0JCQkJCSAgICAgICBob3cgZmFyKi8KIAkJCQkJICAgICAwLAotCQkJCQkgICAgICZkZXZfaW5mby0+ZXZlbnRfaW50ZXJmYWNlc1swXS5kZXYsCi0JCQkJCSAgICAgJmRldl9pbmZvLT5ldmVudF9pbnRlcmZhY2VzWzBdLgorCQkJCQkgICAgICZpbmRpb19kZXYtPmRldiwKKwkJCQkJICAgICAmaW5kaW9fZGV2LT5ldmVudF9pbnRlcmZhY2UtPgogCQkJCQkgICAgIGRldl9hdHRyX2xpc3QpOwogCQlrZnJlZShwb3N0Zml4KTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyb3JfcmV0OwotCisJCWF0dHJjb3VudCsrOwogCQlwb3N0Zml4ID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlc18lc192YWx1ZSIsCi0JCQkJICAgIGlpb19ldl90eXBlX3RleHRbaS9JSU9fRVZfVFlQRV9NQVhdLAotCQkJCSAgICBpaW9fZXZfZGlyX3RleHRbaSVJSU9fRVZfVFlQRV9NQVhdKTsKKwkJCQkgICAgaWlvX2V2X3R5cGVfdGV4dFtpL0lJT19FVl9ESVJfTUFYXSwKKwkJCQkgICAgaWlvX2V2X2Rpcl90ZXh0W2klSUlPX0VWX0RJUl9NQVhdKTsKIAkJaWYgKHBvc3RmaXggPT0gTlVMTCkgewogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gZXJyb3JfcmV0OwogCQl9Ci0JCXJldCA9IF9faWlvX2FkZF9jaGFuX2RldmF0dHIocG9zdGZpeCwgTlVMTCwgY2hhbiwKKwkJcmV0ID0gX19paW9fYWRkX2NoYW5fZGV2YXR0cihwb3N0Zml4LCBjaGFuLAogCQkJCQkgICAgIGlpb19ldl92YWx1ZV9zaG93LAogCQkJCQkgICAgIGlpb19ldl92YWx1ZV9zdG9yZSwKIAkJCQkJICAgICBtYXNrLAogCQkJCQkgICAgIDAsCi0JCQkJCSAgICAgJmRldl9pbmZvLT5ldmVudF9pbnRlcmZhY2VzWzBdCi0JCQkJCSAgICAgLmRldiwKLQkJCQkJICAgICAmZGV2X2luZm8tPmV2ZW50X2ludGVyZmFjZXNbMF0KLQkJCQkJICAgICAuZGV2X2F0dHJfbGlzdCk7CisJCQkJCSAgICAgJmluZGlvX2Rldi0+ZGV2LAorCQkJCQkgICAgICZpbmRpb19kZXYtPmV2ZW50X2ludGVyZmFjZS0+CisJCQkJCSAgICAgZGV2X2F0dHJfbGlzdCk7CiAJCWtmcmVlKHBvc3RmaXgpOwogCQlpZiAocmV0KQogCQkJZ290byBlcnJvcl9yZXQ7Ci0KKwkJYXR0cmNvdW50Kys7CiAJfQotCisJcmV0ID0gYXR0cmNvdW50OwogZXJyb3JfcmV0OgogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2lpb19yZW1vdmVfYWxsX2V2ZW50X3N5c2ZzKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbywKLQkJCQkJCWNvbnN0IGNoYXIgKmdyb3VwbmFtZSwKLQkJCQkJCWludCBudW0pCitzdGF0aWMgaW5saW5lIHZvaWQgX19paW9fcmVtb3ZlX2V2ZW50X2NvbmZpZ19hdHRycyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnAsICpuOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwLCBuLAotCQkJCSAmZGV2X2luZm8tPmV2ZW50X2ludGVyZmFjZXNbbnVtXS4KKwkJCQkgJmluZGlvX2Rldi0+ZXZlbnRfaW50ZXJmYWNlLT4KIAkJCQkgZGV2X2F0dHJfbGlzdCwgbCkgewotCQlzeXNmc19yZW1vdmVfZmlsZV9mcm9tX2dyb3VwKCZkZXZfaW5mbwotCQkJCQkgICAgIC0+ZXZlbnRfaW50ZXJmYWNlc1tudW1dLmRldi5rb2JqLAotCQkJCQkgICAgICZwLT5kZXZfYXR0ci5hdHRyLAotCQkJCQkgICAgIGdyb3VwbmFtZSk7CiAJCWtmcmVlKHAtPmRldl9hdHRyLmF0dHIubmFtZSk7CiAJCWtmcmVlKHApOwogCX0KIH0KIAotc3RhdGljIGlubGluZSBpbnQgX19paW9fYWRkX2V2ZW50X2NvbmZpZ19hdHRycyhzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8sIGludCBpKQorc3RhdGljIGlubGluZSBpbnQgX19paW9fYWRkX2V2ZW50X2NvbmZpZ19hdHRycyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewotCWludCBqOwotCWludCByZXQ7Ci0JSU5JVF9MSVNUX0hFQUQoJmRldl9pbmZvLT5ldmVudF9pbnRlcmZhY2VzWzBdLmRldl9hdHRyX2xpc3QpOworCWludCBqLCByZXQsIGF0dHJjb3VudCA9IDA7CisKKwlJTklUX0xJU1RfSEVBRCgmaW5kaW9fZGV2LT5ldmVudF9pbnRlcmZhY2UtPmRldl9hdHRyX2xpc3QpOwogCS8qIER5bmljYWxseSBjcmVhdGVkIGZyb20gdGhlIGNoYW5uZWxzIGFycmF5ICovCi0JaWYgKGRldl9pbmZvLT5jaGFubmVscykgewotCQlmb3IgKGogPSAwOyBqIDwgZGV2X2luZm8tPm51bV9jaGFubmVsczsgaisrKSB7Ci0JCQlyZXQgPSBpaW9fZGV2aWNlX2FkZF9ldmVudF9zeXNmcyhkZXZfaW5mbywKLQkJCQkJCQkgJmRldl9pbmZvCi0JCQkJCQkJIC0+Y2hhbm5lbHNbal0pOwotCQkJaWYgKHJldCkKLQkJCQlnb3RvIGVycm9yX2NsZWFyX2F0dHJzOwotCQl9CisJZm9yIChqID0gMDsgaiA8IGluZGlvX2Rldi0+bnVtX2NoYW5uZWxzOyBqKyspIHsKKwkJcmV0ID0gaWlvX2RldmljZV9hZGRfZXZlbnRfc3lzZnMoaW5kaW9fZGV2LAorCQkJCQkJICZpbmRpb19kZXYtPmNoYW5uZWxzW2pdKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycm9yX2NsZWFyX2F0dHJzOworCQlhdHRyY291bnQgKz0gcmV0OwogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gYXR0cmNvdW50OwogCiBlcnJvcl9jbGVhcl9hdHRyczoKLQlfX2lpb19yZW1vdmVfYWxsX2V2ZW50X3N5c2ZzKGRldl9pbmZvLCBOVUxMLCBpKTsKKwlfX2lpb19yZW1vdmVfZXZlbnRfY29uZmlnX2F0dHJzKGluZGlvX2Rldik7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW5saW5lIGludCBfX2lpb19yZW1vdmVfZXZlbnRfY29uZmlnX2F0dHJzKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbywKLQkJCQkJCSAgaW50IGkpCitzdGF0aWMgYm9vbCBpaW9fY2hlY2tfZm9yX2R5bmFtaWNfZXZlbnRzKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7Ci0JX19paW9fcmVtb3ZlX2FsbF9ldmVudF9zeXNmcyhkZXZfaW5mbywgTlVMTCwgaSk7Ci0JcmV0dXJuIDA7CisJaW50IGo7CisKKwlmb3IgKGogPSAwOyBqIDwgaW5kaW9fZGV2LT5udW1fY2hhbm5lbHM7IGorKykKKwkJaWYgKGluZGlvX2Rldi0+Y2hhbm5lbHNbal0uZXZlbnRfbWFzayAhPSAwKQorCQkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgaW50IGlpb19kZXZpY2VfcmVnaXN0ZXJfZXZlbnRzZXQoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvKQorc3RhdGljIHZvaWQgaWlvX3NldHVwX2V2X2ludChzdHJ1Y3QgaWlvX2V2ZW50X2ludGVyZmFjZSAqZXZfaW50KQogewotCWludCByZXQgPSAwLCBpLCBqOworCW11dGV4X2luaXQoJmV2X2ludC0+ZXZlbnRfbGlzdF9sb2NrKTsKKwkvKiBkaXNjdXNzaW9uIHBvaW50IC0gbWFrZSB0aGlzIHZhcmlhYmxlPyAqLworCWV2X2ludC0+bWF4X2V2ZW50cyA9IDEwOworCWV2X2ludC0+Y3VycmVudF9ldmVudHMgPSAwOworCUlOSVRfTElTVF9IRUFEKCZldl9pbnQtPmRldF9ldmVudHMpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmV2X2ludC0+d2FpdCk7Cit9CiAKLQlpZiAoZGV2X2luZm8tPmluZm8tPm51bV9pbnRlcnJ1cHRfbGluZXMgPT0gMCkKK3N0YXRpYyBjb25zdCBjaGFyICppaW9fZXZlbnRfZ3JvdXBfbmFtZSA9ICJldmVudHMiOworc3RhdGljIGludCBpaW9fZGV2aWNlX3JlZ2lzdGVyX2V2ZW50c2V0KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGlpb19kZXZfYXR0ciAqcDsKKwlpbnQgcmV0ID0gMCwgYXR0cmNvdW50X29yaWcgPSAwLCBhdHRyY291bnQsIGF0dHJuOworCXN0cnVjdCBhdHRyaWJ1dGUgKiphdHRyOworCisJaWYgKCEoaW5kaW9fZGV2LT5pbmZvLT5ldmVudF9hdHRycyB8fAorCSAgICAgIGlpb19jaGVja19mb3JfZHluYW1pY19ldmVudHMoaW5kaW9fZGV2KSkpCiAJCXJldHVybiAwOwogCi0JZGV2X2luZm8tPmV2ZW50X2ludGVyZmFjZXMgPQotCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgaWlvX2V2ZW50X2ludGVyZmFjZSkKLQkJCSpkZXZfaW5mby0+aW5mby0+bnVtX2ludGVycnVwdF9saW5lcywKLQkJCUdGUF9LRVJORUwpOwotCWlmIChkZXZfaW5mby0+ZXZlbnRfaW50ZXJmYWNlcyA9PSBOVUxMKSB7CisJaW5kaW9fZGV2LT5ldmVudF9pbnRlcmZhY2UgPQorCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgaWlvX2V2ZW50X2ludGVyZmFjZSksIEdGUF9LRVJORUwpOworCWlmIChpbmRpb19kZXYtPmV2ZW50X2ludGVyZmFjZSA9PSBOVUxMKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfcmV0OwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBkZXZfaW5mby0+aW5mby0+bnVtX2ludGVycnVwdF9saW5lczsgaSsrKSB7Ci0JCXJldCA9IGlpb19zZXR1cF9ldl9pbnQoJmRldl9pbmZvLT5ldmVudF9pbnRlcmZhY2VzW2ldLAotCQkJCSAgICAgICBkZXZfbmFtZSgmZGV2X2luZm8tPmRldiksCi0JCQkJICAgICAgIGksCi0JCQkJICAgICAgIGRldl9pbmZvLT5pbmZvLT5kcml2ZXJfbW9kdWxlLAotCQkJCSAgICAgICAmZGV2X2luZm8tPmRldik7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoJmRldl9pbmZvLT5kZXYsCi0JCQkJIkNvdWxkIG5vdCBnZXQgY2hyZGV2IGludGVyZmFjZVxuIik7Ci0JCQlnb3RvIGVycm9yX2ZyZWVfc2V0dXBfZXZfaW50czsKLQkJfQotCi0JCWRldl9zZXRfZHJ2ZGF0YSgmZGV2X2luZm8tPmV2ZW50X2ludGVyZmFjZXNbaV0uZGV2LAotCQkJCSh2b2lkICopZGV2X2luZm8pOwotCi0JCWlmIChkZXZfaW5mby0+aW5mby0+ZXZlbnRfYXR0cnMgIT0gTlVMTCkKLQkJCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2X2luZm8KLQkJCQkJCSAtPmV2ZW50X2ludGVyZmFjZXNbaV0KLQkJCQkJCSAuZGV2LmtvYmosCi0JCQkJCQkgJmRldl9pbmZvLT5pbmZvCi0JCQkJCQkgLT5ldmVudF9hdHRyc1tpXSk7Ci0KLQkJaWYgKHJldCkgewotCQkJZGV2X2VycigmZGV2X2luZm8tPmRldiwKLQkJCQkiRmFpbGVkIHRvIHJlZ2lzdGVyIHN5c2ZzIGZvciBldmVudCBhdHRycyIpOwotCQkJZ290byBlcnJvcl9yZW1vdmVfc3lzZnNfaW50ZXJmYWNlczsKLQkJfQorCWlpb19zZXR1cF9ldl9pbnQoaW5kaW9fZGV2LT5ldmVudF9pbnRlcmZhY2UpOworCWlmIChpbmRpb19kZXYtPmluZm8tPmV2ZW50X2F0dHJzICE9IE5VTEwpIHsKKwkJYXR0ciA9IGluZGlvX2Rldi0+aW5mby0+ZXZlbnRfYXR0cnMtPmF0dHJzOworCQl3aGlsZSAoKmF0dHIrKyAhPSBOVUxMKQorCQkJYXR0cmNvdW50X29yaWcrKzsKKwl9CisJYXR0cmNvdW50ID0gYXR0cmNvdW50X29yaWc7CisJaWYgKGluZGlvX2Rldi0+Y2hhbm5lbHMpIHsKKwkJcmV0ID0gX19paW9fYWRkX2V2ZW50X2NvbmZpZ19hdHRycyhpbmRpb19kZXYpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyb3JfZnJlZV9zZXR1cF9ldmVudF9saW5lczsKKwkJYXR0cmNvdW50ICs9IHJldDsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgZGV2X2luZm8tPmluZm8tPm51bV9pbnRlcnJ1cHRfbGluZXM7IGkrKykgewotCQlyZXQgPSBfX2lpb19hZGRfZXZlbnRfY29uZmlnX2F0dHJzKGRldl9pbmZvLCBpKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyb3JfdW5yZWdpc3Rlcl9jb25maWdfYXR0cnM7CisJaW5kaW9fZGV2LT5ldmVudF9pbnRlcmZhY2UtPmdyb3VwLm5hbWUgPSBpaW9fZXZlbnRfZ3JvdXBfbmFtZTsKKwlpbmRpb19kZXYtPmV2ZW50X2ludGVyZmFjZS0+Z3JvdXAuYXR0cnMgPQorCQlremFsbG9jKHNpemVvZihpbmRpb19kZXYtPmV2ZW50X2ludGVyZmFjZS0+Z3JvdXAuYXR0cnNbMF0pCisJCQkqKGF0dHJjb3VudCArIDEpLAorCQkJR0ZQX0tFUk5FTCk7CisJaWYgKGluZGlvX2Rldi0+ZXZlbnRfaW50ZXJmYWNlLT5ncm91cC5hdHRycyA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zZXR1cF9ldmVudF9saW5lczsKIAl9CisJaWYgKGluZGlvX2Rldi0+aW5mby0+ZXZlbnRfYXR0cnMpCisJCW1lbWNweShpbmRpb19kZXYtPmV2ZW50X2ludGVyZmFjZS0+Z3JvdXAuYXR0cnMsCisJCSAgICAgICBpbmRpb19kZXYtPmluZm8tPmV2ZW50X2F0dHJzLT5hdHRycywKKwkJICAgICAgIHNpemVvZihpbmRpb19kZXYtPmV2ZW50X2ludGVyZmFjZS0+Z3JvdXAuYXR0cnNbMF0pCisJCSAgICAgICAqYXR0cmNvdW50X29yaWcpOworCWF0dHJuID0gYXR0cmNvdW50X29yaWc7CisJLyogQWRkIGFsbCBlbGVtZW50cyBmcm9tIHRoZSBsaXN0LiAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwKKwkJCSAgICAmaW5kaW9fZGV2LT5ldmVudF9pbnRlcmZhY2UtPmRldl9hdHRyX2xpc3QsCisJCQkgICAgbCkKKwkJaW5kaW9fZGV2LT5ldmVudF9pbnRlcmZhY2UtPmdyb3VwLmF0dHJzW2F0dHJuKytdID0KKwkJCSZwLT5kZXZfYXR0ci5hdHRyOworCWluZGlvX2Rldi0+Z3JvdXBzW2luZGlvX2Rldi0+Z3JvdXBjb3VudGVyKytdID0KKwkJJmluZGlvX2Rldi0+ZXZlbnRfaW50ZXJmYWNlLT5ncm91cDsKIAogCXJldHVybiAwOwogCi1lcnJvcl91bnJlZ2lzdGVyX2NvbmZpZ19hdHRyczoKLQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQotCQlfX2lpb19yZW1vdmVfZXZlbnRfY29uZmlnX2F0dHJzKGRldl9pbmZvLCBpKTsKLQlpID0gZGV2X2luZm8tPmluZm8tPm51bV9pbnRlcnJ1cHRfbGluZXMgLSAxOwotZXJyb3JfcmVtb3ZlX3N5c2ZzX2ludGVyZmFjZXM6Ci0JZm9yIChqID0gMDsgaiA8IGk7IGorKykKLQkJaWYgKGRldl9pbmZvLT5pbmZvLT5ldmVudF9hdHRycyAhPSBOVUxMKQotCQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXZfaW5mbwotCQkJCSAgIC0+ZXZlbnRfaW50ZXJmYWNlc1tqXS5kZXYua29iaiwKLQkJCQkgICAmZGV2X2luZm8tPmluZm8tPmV2ZW50X2F0dHJzW2pdKTsKLWVycm9yX2ZyZWVfc2V0dXBfZXZfaW50czoKLQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQotCQlpaW9fZnJlZV9ldl9pbnQoJmRldl9pbmZvLT5ldmVudF9pbnRlcmZhY2VzW2pdKTsKLQlrZnJlZShkZXZfaW5mby0+ZXZlbnRfaW50ZXJmYWNlcyk7CitlcnJvcl9mcmVlX3NldHVwX2V2ZW50X2xpbmVzOgorCV9faWlvX3JlbW92ZV9ldmVudF9jb25maWdfYXR0cnMoaW5kaW9fZGV2KTsKKwlrZnJlZShpbmRpb19kZXYtPmV2ZW50X2ludGVyZmFjZSk7CiBlcnJvcl9yZXQ6CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBpaW9fZGV2aWNlX3VucmVnaXN0ZXJfZXZlbnRzZXQoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvKQorc3RhdGljIHZvaWQgaWlvX2RldmljZV91bnJlZ2lzdGVyX2V2ZW50c2V0KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7Ci0JaW50IGk7Ci0KLQlpZiAoZGV2X2luZm8tPmluZm8tPm51bV9pbnRlcnJ1cHRfbGluZXMgPT0gMCkKKwlpZiAoaW5kaW9fZGV2LT5ldmVudF9pbnRlcmZhY2UgPT0gTlVMTCkKIAkJcmV0dXJuOwotCWZvciAoaSA9IDA7IGkgPCBkZXZfaW5mby0+aW5mby0+bnVtX2ludGVycnVwdF9saW5lczsgaSsrKSB7Ci0JCV9faWlvX3JlbW92ZV9ldmVudF9jb25maWdfYXR0cnMoZGV2X2luZm8sIGkpOwotCQlpZiAoZGV2X2luZm8tPmluZm8tPmV2ZW50X2F0dHJzICE9IE5VTEwpCi0JCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldl9pbmZvCi0JCQkJCSAgIC0+ZXZlbnRfaW50ZXJmYWNlc1tpXS5kZXYua29iaiwKLQkJCQkJICAgJmRldl9pbmZvLT5pbmZvLT5ldmVudF9hdHRyc1tpXSk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IGRldl9pbmZvLT5pbmZvLT5udW1faW50ZXJydXB0X2xpbmVzOyBpKyspCi0JCWlpb19mcmVlX2V2X2ludCgmZGV2X2luZm8tPmV2ZW50X2ludGVyZmFjZXNbaV0pOwotCWtmcmVlKGRldl9pbmZvLT5ldmVudF9pbnRlcmZhY2VzKTsKKwlfX2lpb19yZW1vdmVfZXZlbnRfY29uZmlnX2F0dHJzKGluZGlvX2Rldik7CisJa2ZyZWUoaW5kaW9fZGV2LT5ldmVudF9pbnRlcmZhY2UtPmdyb3VwLmF0dHJzKTsKKwlrZnJlZShpbmRpb19kZXYtPmV2ZW50X2ludGVyZmFjZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGlpb19kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7Ci0JaWlvX3B1dCgpOwotCWtmcmVlKHRvX2lpb19kZXYoZGV2aWNlKSk7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGNvbnRhaW5lcl9vZihkZXZpY2UsIHN0cnVjdCBpaW9fZGV2LCBkZXYpOworCWNkZXZfZGVsKCZpbmRpb19kZXYtPmNocmRldik7CisJaWYgKGluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19CVUZGRVJfVFJJR0dFUkVEKQorCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcihpbmRpb19kZXYpOworCWlpb19kZXZpY2VfdW5yZWdpc3Rlcl9ldmVudHNldChpbmRpb19kZXYpOworCWlpb19kZXZpY2VfdW5yZWdpc3Rlcl9zeXNmcyhpbmRpb19kZXYpOwogfQogCiBzdGF0aWMgc3RydWN0IGRldmljZV90eXBlIGlpb19kZXZfdHlwZSA9IHsKQEAgLTExNTQsMTIgKzEwMjQsMjEgQEAKIAlkZXYgPSBremFsbG9jKGFsbG9jX3NpemUsIEdGUF9LRVJORUwpOwogCiAJaWYgKGRldikgeworCQlkZXYtPmRldi5ncm91cHMgPSBkZXYtPmdyb3VwczsKIAkJZGV2LT5kZXYudHlwZSA9ICZpaW9fZGV2X3R5cGU7CiAJCWRldi0+ZGV2LmJ1cyA9ICZpaW9fYnVzX3R5cGU7CiAJCWRldmljZV9pbml0aWFsaXplKCZkZXYtPmRldik7CiAJCWRldl9zZXRfZHJ2ZGF0YSgmZGV2LT5kZXYsICh2b2lkICopZGV2KTsKIAkJbXV0ZXhfaW5pdCgmZGV2LT5tbG9jayk7Ci0JCWlpb19nZXQoKTsKKworCQlkZXYtPmlkID0gaWRhX3NpbXBsZV9nZXQoJmlpb19pZGEsIDAsIDAsIEdGUF9LRVJORUwpOworCQlpZiAoZGV2LT5pZCA8IDApIHsKKwkJCS8qIGNhbm5vdCB1c2UgYSBkZXZfZXJyIGFzIHRoZSBuYW1lIGlzbid0IGF2YWlsYWJsZSAqLworCQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gZ2V0IGlkXG4iKTsKKwkJCWtmcmVlKGRldik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlkZXZfc2V0X25hbWUoJmRldi0+ZGV2LCAiaWlvOmRldmljZSVkIiwgZGV2LT5pZCk7CiAJfQogCiAJcmV0dXJuIGRldjsKQEAgLTExNjgsNzUgKzEwNDcsMTExIEBACiAKIHZvaWQgaWlvX2ZyZWVfZGV2aWNlKHN0cnVjdCBpaW9fZGV2ICpkZXYpCiB7Ci0JaWYgKGRldikKLQkJaWlvX3B1dF9kZXZpY2UoZGV2KTsKKwlpZiAoZGV2KSB7CisJCWlkYV9zaW1wbGVfcmVtb3ZlKCZpaW9faWRhLCBkZXYtPmlkKTsKKwkJa2ZyZWUoZGV2KTsKKwl9CiB9CiBFWFBPUlRfU1lNQk9MKGlpb19mcmVlX2RldmljZSk7CiAKLWludCBpaW9fZGV2aWNlX3JlZ2lzdGVyKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbykKKy8qKgorICogaWlvX2NocmRldl9vcGVuKCkgLSBjaHJkZXYgZmlsZSBvcGVuIGZvciBidWZmZXIgYWNjZXNzIGFuZCBpb2N0bHMKKyAqKi8KK3N0YXRpYyBpbnQgaWlvX2NocmRldl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBjb250YWluZXJfb2YoaW5vZGUtPmlfY2RldiwKKwkJCQkJCXN0cnVjdCBpaW9fZGV2LCBjaHJkZXYpOworCWZpbHAtPnByaXZhdGVfZGF0YSA9IGluZGlvX2RldjsKKworCXJldHVybiBpaW9fY2hyZGV2X2J1ZmZlcl9vcGVuKGluZGlvX2Rldik7Cit9CisKKy8qKgorICogaWlvX2NocmRldl9yZWxlYXNlKCkgLSBjaHJkZXYgZmlsZSBjbG9zZSBidWZmZXIgYWNjZXNzIGFuZCBpb2N0bHMKKyAqKi8KK3N0YXRpYyBpbnQgaWlvX2NocmRldl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWlpb19jaHJkZXZfYnVmZmVyX3JlbGVhc2UoY29udGFpbmVyX29mKGlub2RlLT5pX2NkZXYsCisJCQkJCSAgICAgc3RydWN0IGlpb19kZXYsIGNocmRldikpOworCXJldHVybiAwOworfQorCisvKiBTb21ld2hhdCBvZiBhIGNyb3NzIGZpbGUgb3JnYW5pemF0aW9uIHZpb2xhdGlvbiAtIGlvY3RscyBoZXJlIGFyZSBhY3R1YWxseQorICogZXZlbnQgcmVsYXRlZCAqLworc3RhdGljIGxvbmcgaWlvX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWludCBfX3VzZXIgKmlwID0gKGludCBfX3VzZXIgKilhcmc7CisJaW50IGZkOworCisJaWYgKGNtZCA9PSBJSU9fR0VUX0VWRU5UX0ZEX0lPQ1RMKSB7CisJCWZkID0gaWlvX2V2ZW50X2dldGZkKGluZGlvX2Rldik7CisJCWlmIChjb3B5X3RvX3VzZXIoaXAsICZmZCwgc2l6ZW9mKGZkKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpaW9fYnVmZmVyX2ZpbGVvcHMgPSB7CisJLnJlYWQgPSBpaW9fYnVmZmVyX3JlYWRfZmlyc3Rfbl9vdXRlcl9hZGRyLAorCS5yZWxlYXNlID0gaWlvX2NocmRldl9yZWxlYXNlLAorCS5vcGVuID0gaWlvX2NocmRldl9vcGVuLAorCS5wb2xsID0gaWlvX2J1ZmZlcl9wb2xsX2FkZHIsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmxsc2VlayA9IG5vb3BfbGxzZWVrLAorCS51bmxvY2tlZF9pb2N0bCA9IGlpb19pb2N0bCwKKwkuY29tcGF0X2lvY3RsID0gaWlvX2lvY3RsLAorfTsKKworaW50IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKIAlpbnQgcmV0OwogCi0JZGV2X2luZm8tPmlkID0gaWlvX2dldF9uZXdfaWRhX3ZhbCgmaWlvX2lkYSk7Ci0JaWYgKGRldl9pbmZvLT5pZCA8IDApIHsKLQkJcmV0ID0gZGV2X2luZm8tPmlkOwotCQlkZXZfZXJyKCZkZXZfaW5mby0+ZGV2LCAiRmFpbGVkIHRvIGdldCBpZFxuIik7CisJLyogY29uZmlndXJlIGVsZW1lbnRzIGZvciB0aGUgY2hyZGV2ICovCisJaW5kaW9fZGV2LT5kZXYuZGV2dCA9IE1LREVWKE1BSk9SKGlpb19kZXZ0KSwgaW5kaW9fZGV2LT5pZCk7CisKKwlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyX3N5c2ZzKGluZGlvX2Rldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGluZGlvX2Rldi0+ZGV2LnBhcmVudCwKKwkJCSJGYWlsZWQgdG8gcmVnaXN0ZXIgc3lzZnMgaW50ZXJmYWNlc1xuIik7CiAJCWdvdG8gZXJyb3JfcmV0OwogCX0KLQlkZXZfc2V0X25hbWUoJmRldl9pbmZvLT5kZXYsICJkZXZpY2UlZCIsIGRldl9pbmZvLT5pZCk7Ci0KLQlyZXQgPSBkZXZpY2VfYWRkKCZkZXZfaW5mby0+ZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX2ZyZWVfaWRhOwotCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXJfc3lzZnMoZGV2X2luZm8pOworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXJfZXZlbnRzZXQoaW5kaW9fZGV2KTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZGV2X2luZm8tPmRldi5wYXJlbnQsCi0JCQkiRmFpbGVkIHRvIHJlZ2lzdGVyIHN5c2ZzIGludGVyZmFjZXNcbiIpOwotCQlnb3RvIGVycm9yX2RlbF9kZXZpY2U7Ci0JfQotCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXJfZXZlbnRzZXQoZGV2X2luZm8pOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkZXZfaW5mby0+ZGV2LnBhcmVudCwKKwkJZGV2X2VycihpbmRpb19kZXYtPmRldi5wYXJlbnQsCiAJCQkiRmFpbGVkIHRvIHJlZ2lzdGVyIGV2ZW50IHNldFxuIik7CiAJCWdvdG8gZXJyb3JfZnJlZV9zeXNmczsKIAl9Ci0JaWYgKGRldl9pbmZvLT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKQotCQlpaW9fZGV2aWNlX3JlZ2lzdGVyX3RyaWdnZXJfY29uc3VtZXIoZGV2X2luZm8pOworCWlmIChpbmRpb19kZXYtPm1vZGVzICYgSU5ESU9fQlVGRkVSX1RSSUdHRVJFRCkKKwkJaWlvX2RldmljZV9yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKGluZGlvX2Rldik7CiAKKwlyZXQgPSBkZXZpY2VfYWRkKCZpbmRpb19kZXYtPmRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3JfdW5yZWdfZXZlbnRzZXQ7CisJY2Rldl9pbml0KCZpbmRpb19kZXYtPmNocmRldiwgJmlpb19idWZmZXJfZmlsZW9wcyk7CisJaW5kaW9fZGV2LT5jaHJkZXYub3duZXIgPSBpbmRpb19kZXYtPmluZm8tPmRyaXZlcl9tb2R1bGU7CisJcmV0ID0gY2Rldl9hZGQoJmluZGlvX2Rldi0+Y2hyZGV2LCBpbmRpb19kZXYtPmRldi5kZXZ0LCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9kZWxfZGV2aWNlOwogCXJldHVybiAwOwogCi1lcnJvcl9mcmVlX3N5c2ZzOgotCWlpb19kZXZpY2VfdW5yZWdpc3Rlcl9zeXNmcyhkZXZfaW5mbyk7CiBlcnJvcl9kZWxfZGV2aWNlOgotCWRldmljZV9kZWwoJmRldl9pbmZvLT5kZXYpOwotZXJyb3JfZnJlZV9pZGE6Ci0JaWlvX2ZyZWVfaWRhX3ZhbCgmaWlvX2lkYSwgZGV2X2luZm8tPmlkKTsKKwlkZXZpY2VfZGVsKCZpbmRpb19kZXYtPmRldik7CitlcnJvcl91bnJlZ19ldmVudHNldDoKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXJfZXZlbnRzZXQoaW5kaW9fZGV2KTsKK2Vycm9yX2ZyZWVfc3lzZnM6CisJaWlvX2RldmljZV91bnJlZ2lzdGVyX3N5c2ZzKGluZGlvX2Rldik7CiBlcnJvcl9yZXQ6CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woaWlvX2RldmljZV9yZWdpc3Rlcik7CiAKLXZvaWQgaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbykKK3ZvaWQgaWlvX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7Ci0JaWYgKGRldl9pbmZvLT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKQotCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcihkZXZfaW5mbyk7Ci0JaWlvX2RldmljZV91bnJlZ2lzdGVyX2V2ZW50c2V0KGRldl9pbmZvKTsKLQlpaW9fZGV2aWNlX3VucmVnaXN0ZXJfc3lzZnMoZGV2X2luZm8pOwotCWlpb19mcmVlX2lkYV92YWwoJmlpb19pZGEsIGRldl9pbmZvLT5pZCk7Ci0JZGV2aWNlX3VucmVnaXN0ZXIoJmRldl9pbmZvLT5kZXYpOworCWRldmljZV91bnJlZ2lzdGVyKCZpbmRpb19kZXYtPmRldik7CiB9CiBFWFBPUlRfU1lNQk9MKGlpb19kZXZpY2VfdW5yZWdpc3Rlcik7Ci0KLXZvaWQgaWlvX3B1dCh2b2lkKQotewotCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwotfQotCi12b2lkIGlpb19nZXQodm9pZCkKLXsKLQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOwotfQotCiBzdWJzeXNfaW5pdGNhbGwoaWlvX2luaXQpOwogbW9kdWxlX2V4aXQoaWlvX2V4aXQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2luZHVzdHJpYWxpby1yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2luZHVzdHJpYWxpby1yaW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0M2ViODIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbmR1c3RyaWFsaW8tcmluZy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTk2ICswLDAgQEAKLS8qIFRoZSBpbmR1c3RyaWFsIEkvTyBjb3JlCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEpvbmF0aGFuIENhbWVyb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIEhhbmRsaW5nIG9mIHJpbmcgYWxsb2NhdGlvbiAvIHJlc2l6aW5nLgotICoKLSAqCi0gKiBUaGluZ3MgdG8gbG9vayBhdCBoZXJlLgotICogLSBCZXR0ZXIgbWVtb3J5IGFsbG9jYXRpb24gdGVjaG5pcXVlcz8KLSAqIC0gQWx0ZXJuYXRpdmUgYWNjZXNzIHRlY2huaXF1ZXM/Ci0gKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotCi0jaW5jbHVkZSAiaWlvLmgiCi0jaW5jbHVkZSAicmluZ19nZW5lcmljLmgiCi0KLS8qKgotICogaWlvX3Jpbmdfb3BlbigpIC0gY2hyZGV2IGZpbGUgb3BlbiBmb3IgcmluZyBidWZmZXIgYWNjZXNzCi0gKgotICogVGhpcyBmdW5jdGlvbiByZWxpZXMgb24gYWxsIHJpbmcgYnVmZmVyIGltcGxlbWVudGF0aW9ucyBoYXZpbmcgYW4KLSAqIGlpb19yaW5nX2J1ZmZlciBhcyB0aGVpciBmaXJzdCBlbGVtZW50LgotICoqLwotc3RhdGljIGludCBpaW9fcmluZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQotewotCXN0cnVjdCBpaW9faGFuZGxlciAqaGFuZAotCQk9IGNvbnRhaW5lcl9vZihpbm9kZS0+aV9jZGV2LCBzdHJ1Y3QgaWlvX2hhbmRsZXIsIGNocmRldik7Ci0Jc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmIgPSBoYW5kLT5wcml2YXRlOwotCi0JZmlscC0+cHJpdmF0ZV9kYXRhID0gaGFuZC0+cHJpdmF0ZTsKLQlpZiAocmItPmFjY2Vzcy0+bWFya19pbl91c2UpCi0JCXJiLT5hY2Nlc3MtPm1hcmtfaW5fdXNlKHJiKTsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGlpb19yaW5nX3JlbGVhc2UoKSAtIGNocmRldiBmaWxlIGNsb3NlIHJpbmcgYnVmZmVyIGFjY2VzcwotICoKLSAqIFRoaXMgZnVuY3Rpb24gcmVsaWVzIG9uIGFsbCByaW5nIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbnMgaGF2aW5nIGFuCi0gKiBpaW9fcmluZ19idWZmZXIgYXMgdGhlaXIgZmlyc3QgZWxlbWVudC4KLSAqKi8KLXN0YXRpYyBpbnQgaWlvX3JpbmdfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKLXsKLQlzdHJ1Y3QgY2RldiAqY2QgPSBpbm9kZS0+aV9jZGV2OwotCXN0cnVjdCBpaW9faGFuZGxlciAqaGFuZCA9IGlpb19jZGV2X3RvX2hhbmRsZXIoY2QpOwotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJiID0gaGFuZC0+cHJpdmF0ZTsKLQotCWNsZWFyX2JpdChJSU9fQlVTWV9CSVRfUE9TLCAmcmItPmFjY2Vzc19oYW5kbGVyLmZsYWdzKTsKLQlpZiAocmItPmFjY2Vzcy0+dW5tYXJrX2luX3VzZSkKLQkJcmItPmFjY2Vzcy0+dW5tYXJrX2luX3VzZShyYik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBpaW9fcmluZ19yZWFkX2ZpcnN0X25fb3V0ZXIoKSAtIGNocmRldiByZWFkIGZvciByaW5nIGJ1ZmZlciBhY2Nlc3MKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJlbGllcyBvbiBhbGwgcmluZyBidWZmZXIgaW1wbGVtZW50YXRpb25zIGhhdmluZyBhbgotICogaWlvX3JpbmcgX2J1ZmVyIGFzIHRoZWlyIGZpcnN0IGVsZW1lbnQuCi0gKiovCi1zdGF0aWMgc3NpemVfdCBpaW9fcmluZ19yZWFkX2ZpcnN0X25fb3V0ZXIoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsCi0JCQkJICBzaXplX3QgbiwgbG9mZl90ICpmX3BzKQotewotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJiID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCi0JaWYgKCFyYi0+YWNjZXNzLT5yZWFkX2ZpcnN0X24pCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiByYi0+YWNjZXNzLT5yZWFkX2ZpcnN0X24ocmIsIG4sIGJ1Zik7Ci19Ci0KLS8qKgotICogaWlvX3JpbmdfcG9sbCgpIC0gcG9sbCB0aGUgcmluZyB0byBmaW5kIG91dCBpZiBpdCBoYXMgZGF0YQotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGlpb19yaW5nX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsCi0JCQkJICBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCi17Ci0Jc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmIgPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0KLQlwb2xsX3dhaXQoZmlscCwgJnJiLT5wb2xscSwgd2FpdCk7Ci0JaWYgKHJiLT5zdHVmZnRvcmVhZCkKLQkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07Ci0JLyogbmVlZCBhIHdheSBvZiBrbm93aW5nIGlmIHRoZXJlIG1heSBiZSBlbm91Z2ggZGF0YS4uLiAqLwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpaW9fcmluZ19maWxlb3BzID0gewotCS5yZWFkID0gaWlvX3JpbmdfcmVhZF9maXJzdF9uX291dGVyLAotCS5yZWxlYXNlID0gaWlvX3JpbmdfcmVsZWFzZSwKLQkub3BlbiA9IGlpb19yaW5nX29wZW4sCi0JLnBvbGwgPSBpaW9fcmluZ19wb2xsLAotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5sbHNlZWsgPSBub29wX2xsc2VlaywKLX07Ci0KLXZvaWQgaWlvX3JpbmdfYWNjZXNzX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKmJ1ZgotCQk9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBpaW9fcmluZ19idWZmZXIsIGRldik7Ci0JY2Rldl9kZWwoJmJ1Zi0+YWNjZXNzX2hhbmRsZXIuY2hyZGV2KTsKLQlpaW9fZGV2aWNlX2ZyZWVfY2hyZGV2X21pbm9yKE1JTk9SKGRldi0+ZGV2dCkpOwotfQotRVhQT1JUX1NZTUJPTChpaW9fcmluZ19hY2Nlc3NfcmVsZWFzZSk7Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1fX2lpb19yZXF1ZXN0X3JpbmdfYnVmZmVyX2NocmRldihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpidWYsCi0JCQkJIHN0cnVjdCBtb2R1bGUgKm93bmVyLAotCQkJCSBpbnQgaWQpCi17Ci0JaW50IHJldDsKLQotCWJ1Zi0+YWNjZXNzX2hhbmRsZXIuZmxhZ3MgPSAwOwotCWJ1Zi0+ZGV2LmJ1cyA9ICZpaW9fYnVzX3R5cGU7Ci0JZGV2aWNlX2luaXRpYWxpemUoJmJ1Zi0+ZGV2KTsKLQotCXJldCA9IGlpb19kZXZpY2VfZ2V0X2NocmRldl9taW5vcigpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yX2RldmljZV9wdXQ7Ci0KLQlidWYtPmRldi5kZXZ0ID0gTUtERVYoTUFKT1IoaWlvX2RldnQpLCByZXQpOwotCWRldl9zZXRfbmFtZSgmYnVmLT5kZXYsICIlczpidWZmZXIlZCIsCi0JCSAgICAgZGV2X25hbWUoYnVmLT5kZXYucGFyZW50KSwKLQkJICAgICBpZCk7Ci0JcmV0ID0gZGV2aWNlX2FkZCgmYnVmLT5kZXYpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZmFpbGVkIHRvIGFkZCB0aGUgcmluZyBkZXZcbiIpOwotCQlnb3RvIGVycm9yX2RldmljZV9wdXQ7Ci0JfQotCWNkZXZfaW5pdCgmYnVmLT5hY2Nlc3NfaGFuZGxlci5jaHJkZXYsICZpaW9fcmluZ19maWxlb3BzKTsKLQlidWYtPmFjY2Vzc19oYW5kbGVyLmNocmRldi5vd25lciA9IG93bmVyOwotCXJldCA9IGNkZXZfYWRkKCZidWYtPmFjY2Vzc19oYW5kbGVyLmNocmRldiwgYnVmLT5kZXYuZGV2dCwgMSk7Ci0JaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBhbGxvY2F0ZSByaW5nIGNocmRldlxuIik7Ci0JCWdvdG8gZXJyb3JfZGV2aWNlX3VucmVnaXN0ZXI7Ci0JfQotCXJldHVybiAwOwotCi1lcnJvcl9kZXZpY2VfdW5yZWdpc3RlcjoKLQlkZXZpY2VfdW5yZWdpc3RlcigmYnVmLT5kZXYpOwotZXJyb3JfZGV2aWNlX3B1dDoKLQlwdXRfZGV2aWNlKCZidWYtPmRldik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2lpb19mcmVlX3JpbmdfYnVmZmVyX2NocmRldihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpidWYpCi17Ci0JZGV2aWNlX3VucmVnaXN0ZXIoJmJ1Zi0+ZGV2KTsKLX0KLQotdm9pZCBpaW9fcmluZ19idWZmZXJfaW5pdChzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nLAotCQkJICBzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8pCi17Ci0JcmluZy0+aW5kaW9fZGV2ID0gZGV2X2luZm87Ci0JcmluZy0+YWNjZXNzX2hhbmRsZXIucHJpdmF0ZSA9IHJpbmc7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmcmluZy0+cG9sbHEpOwotfQotRVhQT1JUX1NZTUJPTChpaW9fcmluZ19idWZmZXJfaW5pdCk7Ci0KLXN0YXRpYyBzc2l6ZV90IGlpb19zaG93X3NjYW5faW5kZXgoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgIGNoYXIgKmJ1ZikKLXsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdG9faWlvX2Rldl9hdHRyKGF0dHIpLT5jLT5zY2FuX2luZGV4KTsKLX0KLQotc3RhdGljIHNzaXplX3QgaWlvX3Nob3dfZml4ZWRfdHlwZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgY2hhciAqYnVmKQotewotCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlYyVkLyVkPj4ldVxuIiwKLQkJICAgICAgIHRoaXNfYXR0ci0+Yy0+c2Nhbl90eXBlLnNpZ24sCi0JCSAgICAgICB0aGlzX2F0dHItPmMtPnNjYW5fdHlwZS5yZWFsYml0cywKLQkJICAgICAgIHRoaXNfYXR0ci0+Yy0+c2Nhbl90eXBlLnN0b3JhZ2ViaXRzLAotCQkgICAgICAgdGhpc19hdHRyLT5jLT5zY2FuX3R5cGUuc2hpZnQpOwotfQotCi1zdGF0aWMgc3NpemVfdCBpaW9fc2Nhbl9lbF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQljaGFyICpidWYpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlyZXQgPSBpaW9fc2Nhbl9tYXNrX3F1ZXJ5KHJpbmcsIHRvX2lpb19kZXZfYXR0cihhdHRyKS0+YWRkcmVzcyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJldCk7Ci19Ci0KLXN0YXRpYyBpbnQgaWlvX3NjYW5fbWFza19jbGVhcihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nLCBpbnQgYml0KQotewotCWlmIChiaXQgPiBJSU9fTUFYX1NDQU5fTEVOR1RIKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyaW5nLT5zY2FuX21hc2sgJj0gfigxIDw8IGJpdCk7Ci0JcmluZy0+c2Nhbl9jb3VudC0tOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBpaW9fc2Nhbl9lbF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSBjb25zdCBjaGFyICpidWYsCi0JCQkJIHNpemVfdCBsZW4pCi17Ci0JaW50IHJldCA9IDA7Ci0JYm9vbCBzdGF0ZTsKLQlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHJpbmctPmluZGlvX2RldjsKLQlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7Ci0KLQlzdGF0ZSA9ICEoYnVmWzBdID09ICcwJyk7Ci0JbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7Ci0JaWYgKGluZGlvX2Rldi0+Y3VycmVudG1vZGUgPT0gSU5ESU9fUklOR19UUklHR0VSRUQpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGVycm9yX3JldDsKLQl9Ci0JcmV0ID0gaWlvX3NjYW5fbWFza19xdWVyeShyaW5nLCB0aGlzX2F0dHItPmFkZHJlc3MpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yX3JldDsKLQlpZiAoIXN0YXRlICYmIHJldCkgewotCQlyZXQgPSBpaW9fc2Nhbl9tYXNrX2NsZWFyKHJpbmcsIHRoaXNfYXR0ci0+YWRkcmVzcyk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycm9yX3JldDsKLQl9IGVsc2UgaWYgKHN0YXRlICYmICFyZXQpIHsKLQkJcmV0ID0gaWlvX3NjYW5fbWFza19zZXQocmluZywgdGhpc19hdHRyLT5hZGRyZXNzKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyb3JfcmV0OwotCX0KLQotZXJyb3JfcmV0OgotCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7Ci0KLQlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOwotCi19Ci0KLXN0YXRpYyBzc2l6ZV90IGlpb19zY2FuX2VsX3RzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJpbmctPnNjYW5fdGltZXN0YW1wKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaWlvX3NjYW5fZWxfdHNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgY29uc3QgY2hhciAqYnVmLAotCQkJCSAgICBzaXplX3QgbGVuKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcmluZy0+aW5kaW9fZGV2OwotCWJvb2wgc3RhdGU7Ci0Jc3RhdGUgPSAhKGJ1ZlswXSA9PSAnMCcpOwotCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOwotCWlmIChpbmRpb19kZXYtPmN1cnJlbnRtb2RlID09IElORElPX1JJTkdfVFJJR0dFUkVEKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBlcnJvcl9yZXQ7Ci0JfQotCXJpbmctPnNjYW5fdGltZXN0YW1wID0gc3RhdGU7Ci1lcnJvcl9yZXQ6Ci0JbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKLQotCXJldHVybiByZXQgPyByZXQgOiBsZW47Ci19Ci0KLXN0YXRpYyBpbnQgaWlvX3JpbmdfYWRkX2NoYW5uZWxfc3lzZnMoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZywKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbikKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gX19paW9fYWRkX2NoYW5fZGV2YXR0cigiaW5kZXgiLCAic2Nhbl9lbGVtZW50cyIsCi0JCQkJICAgICBjaGFuLAotCQkJCSAgICAgJmlpb19zaG93X3NjYW5faW5kZXgsCi0JCQkJICAgICBOVUxMLAotCQkJCSAgICAgMCwKLQkJCQkgICAgIDAsCi0JCQkJICAgICAmcmluZy0+ZGV2LAotCQkJCSAgICAgJnJpbmctPnNjYW5fZWxfZGV2X2F0dHJfbGlzdCk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcl9yZXQ7Ci0KLQlyZXQgPSBfX2lpb19hZGRfY2hhbl9kZXZhdHRyKCJ0eXBlIiwgInNjYW5fZWxlbWVudHMiLAotCQkJCSAgICAgY2hhbiwKLQkJCQkgICAgICZpaW9fc2hvd19maXhlZF90eXBlLAotCQkJCSAgICAgTlVMTCwKLQkJCQkgICAgIDAsCi0JCQkJICAgICAwLAotCQkJCSAgICAgJnJpbmctPmRldiwKLQkJCQkgICAgICZyaW5nLT5zY2FuX2VsX2Rldl9hdHRyX2xpc3QpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfcmV0OwotCi0JaWYgKGNoYW4tPnR5cGUgIT0gSUlPX1RJTUVTVEFNUCkKLQkJcmV0ID0gX19paW9fYWRkX2NoYW5fZGV2YXR0cigiZW4iLCAic2Nhbl9lbGVtZW50cyIsCi0JCQkJCSAgICAgY2hhbiwKLQkJCQkJICAgICAmaWlvX3NjYW5fZWxfc2hvdywKLQkJCQkJICAgICAmaWlvX3NjYW5fZWxfc3RvcmUsCi0JCQkJCSAgICAgY2hhbi0+c2Nhbl9pbmRleCwKLQkJCQkJICAgICAwLAotCQkJCQkgICAgICZyaW5nLT5kZXYsCi0JCQkJCSAgICAgJnJpbmctPnNjYW5fZWxfZGV2X2F0dHJfbGlzdCk7Ci0JZWxzZQotCQlyZXQgPSBfX2lpb19hZGRfY2hhbl9kZXZhdHRyKCJlbiIsICJzY2FuX2VsZW1lbnRzIiwKLQkJCQkJICAgICBjaGFuLAotCQkJCQkgICAgICZpaW9fc2Nhbl9lbF90c19zaG93LAotCQkJCQkgICAgICZpaW9fc2Nhbl9lbF90c19zdG9yZSwKLQkJCQkJICAgICBjaGFuLT5zY2FuX2luZGV4LAotCQkJCQkgICAgIDAsCi0JCQkJCSAgICAgJnJpbmctPmRldiwKLQkJCQkJICAgICAmcmluZy0+c2Nhbl9lbF9kZXZfYXR0cl9saXN0KTsKLWVycm9yX3JldDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBpaW9fcmluZ19yZW1vdmVfYW5kX2ZyZWVfc2Nhbl9kZXZfYXR0cihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nLAotCQkJCQkJICAgc3RydWN0IGlpb19kZXZfYXR0ciAqcCkKLXsKLQlzeXNmc19yZW1vdmVfZmlsZV9mcm9tX2dyb3VwKCZyaW5nLT5kZXYua29iaiwKLQkJCQkgICAgICZwLT5kZXZfYXR0ci5hdHRyLCAic2Nhbl9lbGVtZW50cyIpOwotCWtmcmVlKHAtPmRldl9hdHRyLmF0dHIubmFtZSk7Ci0Ja2ZyZWUocCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppaW9fc2Nhbl9lbF9kdW1teV9hdHRyc1tdID0gewotCU5VTEwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGlpb19zY2FuX2VsX2R1bW15X2dyb3VwID0gewotCS5uYW1lID0gInNjYW5fZWxlbWVudHMiLAotCS5hdHRycyA9IGlpb19zY2FuX2VsX2R1bW15X2F0dHJzCi19OwotCi1zdGF0aWMgdm9pZCBfX2lpb19yaW5nX2F0dHJfY2xlYW51cChzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQotewotCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnAsICpuOwotCWludCBhbnlkeW5hbWljID0gIWxpc3RfZW1wdHkoJnJpbmctPnNjYW5fZWxfZGV2X2F0dHJfbGlzdCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHAsIG4sCi0JCQkJICZyaW5nLT5zY2FuX2VsX2Rldl9hdHRyX2xpc3QsIGwpCi0JCWlpb19yaW5nX3JlbW92ZV9hbmRfZnJlZV9zY2FuX2Rldl9hdHRyKHJpbmcsIHApOwotCi0JaWYgKHJpbmctPnNjYW5fZWxfYXR0cnMpCi0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmcmluZy0+ZGV2LmtvYmosCi0JCQkJICAgcmluZy0+c2Nhbl9lbF9hdHRycyk7Ci0JZWxzZSBpZiAoYW55ZHluYW1pYykKLQkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZyaW5nLT5kZXYua29iaiwKLQkJCQkgICAmaWlvX3NjYW5fZWxfZHVtbXlfZ3JvdXApOwotfQotCi1pbnQgaWlvX3JpbmdfYnVmZmVyX3JlZ2lzdGVyX2V4KHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcsIGludCBpZCwKLQkJCQljb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbm5lbHMsCi0JCQkJaW50IG51bV9jaGFubmVscykKLXsKLQlpbnQgcmV0LCBpOwotCi0JcmV0ID0gX19paW9fcmVxdWVzdF9yaW5nX2J1ZmZlcl9jaHJkZXYocmluZywgcmluZy0+b3duZXIsIGlkKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX3JldDsKLQotCWlmIChyaW5nLT5zY2FuX2VsX2F0dHJzKSB7Ci0JCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcmluZy0+ZGV2LmtvYmosCi0JCQkJCSByaW5nLT5zY2FuX2VsX2F0dHJzKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycigmcmluZy0+ZGV2LAotCQkJCSJGYWlsZWQgdG8gYWRkIHN5c2ZzIHNjYW4gZWxlbWVudHNcbiIpOwotCQkJZ290byBlcnJvcl9mcmVlX3JpbmdfYnVmZmVyX2NocmRldjsKLQkJfQotCX0gZWxzZSBpZiAoY2hhbm5lbHMpIHsKLQkJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZyaW5nLT5kZXYua29iaiwKLQkJCQkJICZpaW9fc2Nhbl9lbF9kdW1teV9ncm91cCk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIGVycm9yX2ZyZWVfcmluZ19idWZmZXJfY2hyZGV2OwotCX0KLQotCUlOSVRfTElTVF9IRUFEKCZyaW5nLT5zY2FuX2VsX2Rldl9hdHRyX2xpc3QpOwotCWlmIChjaGFubmVscykgewotCQkvKiBuZXcgbWFnaWMgKi8KLQkJZm9yIChpID0gMDsgaSA8IG51bV9jaGFubmVsczsgaSsrKSB7Ci0JCQlyZXQgPSBpaW9fcmluZ19hZGRfY2hhbm5lbF9zeXNmcyhyaW5nLCAmY2hhbm5lbHNbaV0pOwotCQkJaWYgKHJldCA8IDApCi0JCQkJZ290byBlcnJvcl9jbGVhbnVwX2R5bmFtaWM7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLWVycm9yX2NsZWFudXBfZHluYW1pYzoKLQlfX2lpb19yaW5nX2F0dHJfY2xlYW51cChyaW5nKTsKLWVycm9yX2ZyZWVfcmluZ19idWZmZXJfY2hyZGV2OgotCV9faWlvX2ZyZWVfcmluZ19idWZmZXJfY2hyZGV2KHJpbmcpOwotZXJyb3JfcmV0OgotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGlpb19yaW5nX2J1ZmZlcl9yZWdpc3Rlcl9leCk7Ci0KLXZvaWQgaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKLXsKLQlfX2lpb19yaW5nX2F0dHJfY2xlYW51cChyaW5nKTsKLQlfX2lpb19mcmVlX3JpbmdfYnVmZmVyX2NocmRldihyaW5nKTsKLX0KLUVYUE9SVF9TWU1CT0woaWlvX3JpbmdfYnVmZmVyX3VucmVnaXN0ZXIpOwotCi1zc2l6ZV90IGlpb19yZWFkX3JpbmdfbGVuZ3RoKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlpZiAocmluZy0+YWNjZXNzLT5nZXRfbGVuZ3RoKQotCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwKLQkJCSAgICAgICByaW5nLT5hY2Nlc3MtPmdldF9sZW5ndGgocmluZykpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGlpb19yZWFkX3JpbmdfbGVuZ3RoKTsKLQotc3NpemVfdCBpaW9fd3JpdGVfcmluZ19sZW5ndGgoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCSAgICAgICBzaXplX3QgbGVuKQotewotCWludCByZXQ7Ci0JdWxvbmcgdmFsOwotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAocmluZy0+YWNjZXNzLT5nZXRfbGVuZ3RoKQotCQlpZiAodmFsID09IHJpbmctPmFjY2Vzcy0+Z2V0X2xlbmd0aChyaW5nKSkKLQkJCXJldHVybiBsZW47Ci0KLQlpZiAocmluZy0+YWNjZXNzLT5zZXRfbGVuZ3RoKSB7Ci0JCXJpbmctPmFjY2Vzcy0+c2V0X2xlbmd0aChyaW5nLCB2YWwpOwotCQlpZiAocmluZy0+YWNjZXNzLT5tYXJrX3BhcmFtX2NoYW5nZSkKLQkJCXJpbmctPmFjY2Vzcy0+bWFya19wYXJhbV9jaGFuZ2UocmluZyk7Ci0JfQotCi0JcmV0dXJuIGxlbjsKLX0KLUVYUE9SVF9TWU1CT0woaWlvX3dyaXRlX3JpbmdfbGVuZ3RoKTsKLQotc3NpemVfdCBpaW9fcmVhZF9yaW5nX2J5dGVzX3Blcl9kYXR1bShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JaWYgKHJpbmctPmFjY2Vzcy0+Z2V0X2J5dGVzX3Blcl9kYXR1bSkKLQkJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsCi0JCQkgICAgICAgcmluZy0+YWNjZXNzLT5nZXRfYnl0ZXNfcGVyX2RhdHVtKHJpbmcpKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpaW9fcmVhZF9yaW5nX2J5dGVzX3Blcl9kYXR1bSk7Ci0KLXNzaXplX3QgaWlvX3N0b3JlX3JpbmdfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgY29uc3QgY2hhciAqYnVmLAotCQkJICAgICAgc2l6ZV90IGxlbikKLXsKLQlpbnQgcmV0OwotCWJvb2wgcmVxdWVzdGVkX3N0YXRlLCBjdXJyZW50X3N0YXRlOwotCWludCBwcmV2aW91c19tb2RlOwotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8gPSByaW5nLT5pbmRpb19kZXY7Ci0KLQltdXRleF9sb2NrKCZkZXZfaW5mby0+bWxvY2spOwotCXByZXZpb3VzX21vZGUgPSBkZXZfaW5mby0+Y3VycmVudG1vZGU7Ci0JcmVxdWVzdGVkX3N0YXRlID0gIShidWZbMF0gPT0gJzAnKTsKLQljdXJyZW50X3N0YXRlID0gISEocHJldmlvdXNfbW9kZSAmIElORElPX0FMTF9SSU5HX01PREVTKTsKLQlpZiAoY3VycmVudF9zdGF0ZSA9PSByZXF1ZXN0ZWRfc3RhdGUpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaWlvLXJpbmcsIGN1cnJlbnQgc3RhdGUgcmVxdWVzdGVkIGFnYWluXG4iKTsKLQkJZ290byBkb25lOwotCX0KLQlpZiAocmVxdWVzdGVkX3N0YXRlKSB7Ci0JCWlmIChyaW5nLT5zZXR1cF9vcHMtPnByZWVuYWJsZSkgewotCQkJcmV0ID0gcmluZy0+c2V0dXBfb3BzLT5wcmVlbmFibGUoZGV2X2luZm8pOwotCQkJaWYgKHJldCkgewotCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCSAgICAgICAiQnVmZmVyIG5vdCBzdGFydGVkOiIKLQkJCQkgICAgICAgInJpbmcgcHJlZW5hYmxlIGZhaWxlZFxuIik7Ci0JCQkJZ290byBlcnJvcl9yZXQ7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJpbmctPmFjY2Vzcy0+cmVxdWVzdF91cGRhdGUpIHsKLQkJCXJldCA9IHJpbmctPmFjY2Vzcy0+cmVxdWVzdF91cGRhdGUocmluZyk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJCSAgICAgICAiQnVmZmVyIG5vdCBzdGFydGVkOiIKLQkJCQkgICAgICAgInJpbmcgcGFyYW1ldGVyIHVwZGF0ZSBmYWlsZWRcbiIpOwotCQkJCWdvdG8gZXJyb3JfcmV0OwotCQkJfQotCQl9Ci0JCWlmIChyaW5nLT5hY2Nlc3MtPm1hcmtfaW5fdXNlKQotCQkJcmluZy0+YWNjZXNzLT5tYXJrX2luX3VzZShyaW5nKTsKLQkJLyogRGVmaW5pdGVseSBwb3NzaWJsZSBmb3IgZGV2aWNlcyB0byBzdXBwb3J0IGJvdGggb2YgdGhlc2UuKi8KLQkJaWYgKGRldl9pbmZvLT5tb2RlcyAmIElORElPX1JJTkdfVFJJR0dFUkVEKSB7Ci0JCQlpZiAoIWRldl9pbmZvLT50cmlnKSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTwotCQkJCSAgICAgICAiQnVmZmVyIG5vdCBzdGFydGVkOiBubyB0cmlnZ2VyXG4iKTsKLQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCWlmIChyaW5nLT5hY2Nlc3MtPnVubWFya19pbl91c2UpCi0JCQkJCXJpbmctPmFjY2Vzcy0+dW5tYXJrX2luX3VzZShyaW5nKTsKLQkJCQlnb3RvIGVycm9yX3JldDsKLQkJCX0KLQkJCWRldl9pbmZvLT5jdXJyZW50bW9kZSA9IElORElPX1JJTkdfVFJJR0dFUkVEOwotCQl9IGVsc2UgaWYgKGRldl9pbmZvLT5tb2RlcyAmIElORElPX1JJTkdfSEFSRFdBUkVfQlVGRkVSKQotCQkJZGV2X2luZm8tPmN1cnJlbnRtb2RlID0gSU5ESU9fUklOR19IQVJEV0FSRV9CVUZGRVI7Ci0JCWVsc2UgeyAvKiBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZCAqLwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyb3JfcmV0OwotCQl9Ci0KLQkJaWYgKHJpbmctPnNldHVwX29wcy0+cG9zdGVuYWJsZSkgewotCQkJcmV0ID0gcmluZy0+c2V0dXBfb3BzLT5wb3N0ZW5hYmxlKGRldl9pbmZvKTsKLQkJCWlmIChyZXQpIHsKLQkJCQlwcmludGsoS0VSTl9JTkZPCi0JCQkJICAgICAgICJCdWZmZXIgbm90IHN0YXJ0ZWQ6IgotCQkJCSAgICAgICAicG9zdGVuYWJsZSBmYWlsZWRcbiIpOwotCQkJCWlmIChyaW5nLT5hY2Nlc3MtPnVubWFya19pbl91c2UpCi0JCQkJCXJpbmctPmFjY2Vzcy0+dW5tYXJrX2luX3VzZShyaW5nKTsKLQkJCQlkZXZfaW5mby0+Y3VycmVudG1vZGUgPSBwcmV2aW91c19tb2RlOwotCQkJCWlmIChyaW5nLT5zZXR1cF9vcHMtPnBvc3RkaXNhYmxlKQotCQkJCQlyaW5nLT5zZXR1cF9vcHMtPnBvc3RkaXNhYmxlKGRldl9pbmZvKTsKLQkJCQlnb3RvIGVycm9yX3JldDsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChyaW5nLT5zZXR1cF9vcHMtPnByZWRpc2FibGUpIHsKLQkJCXJldCA9IHJpbmctPnNldHVwX29wcy0+cHJlZGlzYWJsZShkZXZfaW5mbyk7Ci0JCQlpZiAocmV0KQotCQkJCWdvdG8gZXJyb3JfcmV0OwotCQl9Ci0JCWlmIChyaW5nLT5hY2Nlc3MtPnVubWFya19pbl91c2UpCi0JCQlyaW5nLT5hY2Nlc3MtPnVubWFya19pbl91c2UocmluZyk7Ci0JCWRldl9pbmZvLT5jdXJyZW50bW9kZSA9IElORElPX0RJUkVDVF9NT0RFOwotCQlpZiAocmluZy0+c2V0dXBfb3BzLT5wb3N0ZGlzYWJsZSkgewotCQkJcmV0ID0gcmluZy0+c2V0dXBfb3BzLT5wb3N0ZGlzYWJsZShkZXZfaW5mbyk7Ci0JCQlpZiAocmV0KQotCQkJCWdvdG8gZXJyb3JfcmV0OwotCQl9Ci0JfQotZG9uZToKLQltdXRleF91bmxvY2soJmRldl9pbmZvLT5tbG9jayk7Ci0JcmV0dXJuIGxlbjsKLQotZXJyb3JfcmV0OgotCW11dGV4X3VubG9jaygmZGV2X2luZm8tPm1sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChpaW9fc3RvcmVfcmluZ19lbmFibGUpOwotCi1zc2l6ZV90IGlpb19zaG93X3JpbmdfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsICEhKHJpbmctPmluZGlvX2Rldi0+Y3VycmVudG1vZGUKLQkJCQkgICAgICAgJiBJTkRJT19BTExfUklOR19NT0RFUykpOwotfQotRVhQT1JUX1NZTUJPTChpaW9fc2hvd19yaW5nX2VuYWJsZSk7Ci0KLWludCBpaW9fc3dfcmluZ19wcmVlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKLXsKLQlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nID0gaW5kaW9fZGV2LT5yaW5nOwotCXNpemVfdCBzaXplOwotCWRldl9kYmcoJmluZGlvX2Rldi0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKLQkvKiBDaGVjayBpZiB0aGVyZSBhcmUgYW55IHNjYW4gZWxlbWVudHMgZW5hYmxlZCwgaWYgbm90IGZhaWwqLwotCWlmICghKHJpbmctPnNjYW5fY291bnQgfHwgcmluZy0+c2Nhbl90aW1lc3RhbXApKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAocmluZy0+c2Nhbl90aW1lc3RhbXApCi0JCWlmIChyaW5nLT5zY2FuX2NvdW50KQotCQkJLyogVGltZXN0YW1wIChhbGlnbmVkIHRvIHM2NCkgYW5kIGRhdGEgKi8KLQkJCXNpemUgPSAoKChyaW5nLT5zY2FuX2NvdW50ICogcmluZy0+YnBlKQotCQkJCQkrIHNpemVvZihzNjQpIC0gMSkKLQkJCQkmIH4oc2l6ZW9mKHM2NCkgLSAxKSkKLQkJCQkrIHNpemVvZihzNjQpOwotCQllbHNlIC8qIFRpbWVzdGFtcCBvbmx5ICAqLwotCQkJc2l6ZSA9IHNpemVvZihzNjQpOwotCWVsc2UgLyogRGF0YSBvbmx5ICovCi0JCXNpemUgPSByaW5nLT5zY2FuX2NvdW50ICogcmluZy0+YnBlOwotCXJpbmctPmFjY2Vzcy0+c2V0X2J5dGVzX3Blcl9kYXR1bShyaW5nLCBzaXplKTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpaW9fc3dfcmluZ19wcmVlbmFibGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbmR1c3RyaWFsaW8tdHJpZ2dlci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9pbmR1c3RyaWFsaW8tdHJpZ2dlci5jCmluZGV4IDkwY2EyZGYuLjJjNjI2ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaW5kdXN0cmlhbGlvLXRyaWdnZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2luZHVzdHJpYWxpby10cmlnZ2VyLmMKQEAgLTgsNyArOCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpAQCAtMTgsNiArMTcsOCBAQAogCiAjaW5jbHVkZSAiaWlvLmgiCiAjaW5jbHVkZSAidHJpZ2dlci5oIgorI2luY2x1ZGUgImlpb19jb3JlLmgiCisjaW5jbHVkZSAiaWlvX2NvcmVfdHJpZ2dlci5oIgogI2luY2x1ZGUgInRyaWdnZXJfY29uc3VtZXIuaCIKIAogLyogUkZDIC0gUXVlc3Rpb24gb2YgYXBwcm9hY2gKQEAgLTMxLDggKzMyLDcgQEAKICAqIEFueSBvdGhlciBzdWdnZXN0aW9ucz8KICAqLwogCi1zdGF0aWMgREVGSU5FX0lEUihpaW9fdHJpZ2dlcl9pZHIpOwotc3RhdGljIERFRklORV9TUElOTE9DSyhpaW9fdHJpZ2dlcl9pZHJfbG9jayk7CitzdGF0aWMgREVGSU5FX0lEQShpaW9fdHJpZ2dlcl9pZGEpOwogCiAvKiBTaW5nbGUgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIHRyaWdnZXJzICovCiBzdGF0aWMgTElTVF9IRUFEKGlpb190cmlnZ2VyX2xpc3QpOwpAQCAtNzEsNDggKzcxLDE1IEBACiAJCQkJCSAgIE5VTEwpOwogfQogCi0KLS8qKgotICogaWlvX3RyaWdnZXJfcmVnaXN0ZXJfaWQoKSAtIGdldCBhIHVuaXF1ZSBpZCBmb3IgdGhpcyB0cmlnZ2VyCi0gKiBAdHJpZ19pbmZvOgl0aGUgdHJpZ2dlcgotICoqLwotc3RhdGljIGludCBpaW9fdHJpZ2dlcl9yZWdpc3Rlcl9pZChzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWdfaW5mbykKLXsKLQlpbnQgcmV0ID0gMDsKLQotaWRyX2FnYWluOgotCWlmICh1bmxpa2VseShpZHJfcHJlX2dldCgmaWlvX3RyaWdnZXJfaWRyLCBHRlBfS0VSTkVMKSA9PSAwKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzcGluX2xvY2soJmlpb190cmlnZ2VyX2lkcl9sb2NrKTsKLQlyZXQgPSBpZHJfZ2V0X25ldygmaWlvX3RyaWdnZXJfaWRyLCBOVUxMLCAmdHJpZ19pbmZvLT5pZCk7Ci0Jc3Bpbl91bmxvY2soJmlpb190cmlnZ2VyX2lkcl9sb2NrKTsKLQlpZiAodW5saWtlbHkocmV0ID09IC1FQUdBSU4pKQotCQlnb3RvIGlkcl9hZ2FpbjsKLQllbHNlIGlmIChsaWtlbHkoIXJldCkpCi0JCXRyaWdfaW5mby0+aWQgPSB0cmlnX2luZm8tPmlkICYgTUFYX0lEX01BU0s7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIGlpb190cmlnZ2VyX3VucmVnaXN0ZXJfaWQoKSAtIGZyZWUgdXAgdW5pcXVlIGlkIGZvciB1c2UgYnkgYW5vdGhlciB0cmlnZ2VyCi0gKiBAdHJpZ19pbmZvOiB0aGUgdHJpZ2dlcgotICoqLwotc3RhdGljIHZvaWQgaWlvX3RyaWdnZXJfdW5yZWdpc3Rlcl9pZChzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWdfaW5mbykKLXsKLQlzcGluX2xvY2soJmlpb190cmlnZ2VyX2lkcl9sb2NrKTsKLQlpZHJfcmVtb3ZlKCZpaW9fdHJpZ2dlcl9pZHIsIHRyaWdfaW5mby0+aWQpOwotCXNwaW5fdW5sb2NrKCZpaW9fdHJpZ2dlcl9pZHJfbG9jayk7Ci19Ci0KIGludCBpaW9fdHJpZ2dlcl9yZWdpc3RlcihzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWdfaW5mbykKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gaWlvX3RyaWdnZXJfcmVnaXN0ZXJfaWQodHJpZ19pbmZvKTsKLQlpZiAocmV0KQorCXRyaWdfaW5mby0+aWQgPSBpZGFfc2ltcGxlX2dldCgmaWlvX3RyaWdnZXJfaWRhLCAwLCAwLCBHRlBfS0VSTkVMKTsKKwlpZiAodHJpZ19pbmZvLT5pZCA8IDApIHsKKwkJcmV0ID0gdHJpZ19pbmZvLT5pZDsKIAkJZ290byBlcnJvcl9yZXQ7CisJfQogCS8qIFNldCB0aGUgbmFtZSB1c2VkIGZvciB0aGUgc3lzZnMgZGlyZWN0b3J5IGV0YyAqLwogCWRldl9zZXRfbmFtZSgmdHJpZ19pbmZvLT5kZXYsICJ0cmlnZ2VyJWxkIiwKIAkJICAgICAodW5zaWduZWQgbG9uZykgdHJpZ19pbmZvLT5pZCk7CkBAIC0xMzUsNyArMTAyLDcgQEAKIGVycm9yX2RldmljZV9kZWw6CiAJZGV2aWNlX2RlbCgmdHJpZ19pbmZvLT5kZXYpOwogZXJyb3JfdW5yZWdpc3Rlcl9pZDoKLQlpaW9fdHJpZ2dlcl91bnJlZ2lzdGVyX2lkKHRyaWdfaW5mbyk7CisJaWRhX3NpbXBsZV9yZW1vdmUoJmlpb190cmlnZ2VyX2lkYSwgdHJpZ19pbmZvLT5pZCk7CiBlcnJvcl9yZXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE0OCw3ICsxMTUsNyBAQAogCW11dGV4X3VubG9jaygmaWlvX3RyaWdnZXJfbGlzdF9sb2NrKTsKIAogCWlpb190cmlnZ2VyX3VucmVnaXN0ZXJfc3lzZnModHJpZ19pbmZvKTsKLQlpaW9fdHJpZ2dlcl91bnJlZ2lzdGVyX2lkKHRyaWdfaW5mbyk7CisJaWRhX3NpbXBsZV9yZW1vdmUoJmlpb190cmlnZ2VyX2lkYSwgdHJpZ19pbmZvLT5pZCk7CiAJLyogUG9zc2libGUgaXNzdWUgaW4gaGVyZSAqLwogCWRldmljZV91bnJlZ2lzdGVyKCZ0cmlnX2luZm8tPmRldik7CiB9CkBAIC0xNzMsMTMgKzE0MCwxMiBAQAogdm9pZCBpaW9fdHJpZ2dlcl9wb2xsKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywgczY0IHRpbWUpCiB7CiAJaW50IGk7Ci0JaWYgKCF0cmlnLT51c2VfY291bnQpIHsKKwlpZiAoIXRyaWctPnVzZV9jb3VudCkKIAkJZm9yIChpID0gMDsgaSA8IENPTkZJR19JSU9fQ09OU1VNRVJTX1BFUl9UUklHR0VSOyBpKyspCiAJCQlpZiAodHJpZy0+c3ViaXJxc1tpXS5lbmFibGVkKSB7CiAJCQkJdHJpZy0+dXNlX2NvdW50Kys7CiAJCQkJZ2VuZXJpY19oYW5kbGVfaXJxKHRyaWctPnN1YmlycV9iYXNlICsgaSk7CiAJCQl9Ci0JfQogfQogRVhQT1JUX1NZTUJPTChpaW9fdHJpZ2dlcl9wb2xsKTsKIApAQCAtMjA2LDggKzE3Miw4IEBACiB2b2lkIGlpb190cmlnZ2VyX25vdGlmeV9kb25lKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZykKIHsKIAl0cmlnLT51c2VfY291bnQtLTsKLQlpZiAodHJpZy0+dXNlX2NvdW50ID09IDAgJiYgdHJpZy0+dHJ5X3JlZW5hYmxlKQotCQlpZiAodHJpZy0+dHJ5X3JlZW5hYmxlKHRyaWcpKSB7CisJaWYgKHRyaWctPnVzZV9jb3VudCA9PSAwICYmIHRyaWctPm9wcyAmJiB0cmlnLT5vcHMtPnRyeV9yZWVuYWJsZSkKKwkJaWYgKHRyaWctPm9wcy0+dHJ5X3JlZW5hYmxlKHRyaWcpKSB7CiAJCQkvKiBNaXNzZWQgYW5kIGludGVycnVwdCBzbyBsYXVuY2ggbmV3IHBvbGwgbm93ICovCiAJCQlpaW9fdHJpZ2dlcl9wb2xsKHRyaWcsIDApOwogCQl9CkBAIC0yMTUsNiArMTgxLDI2IEBACiBFWFBPUlRfU1lNQk9MKGlpb190cmlnZ2VyX25vdGlmeV9kb25lKTsKIAogLyogVHJpZ2dlciBDb25zdW1lciByZWxhdGVkIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBpaW9fdHJpZ2dlcl9nZXRfaXJxKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZykKK3sKKwlpbnQgcmV0OworCW11dGV4X2xvY2soJnRyaWctPnBvb2xfbG9jayk7CisJcmV0ID0gYml0bWFwX2ZpbmRfZnJlZV9yZWdpb24odHJpZy0+cG9vbCwKKwkJCQkgICAgICBDT05GSUdfSUlPX0NPTlNVTUVSU19QRVJfVFJJR0dFUiwKKwkJCQkgICAgICBpbG9nMigxKSk7CisJbXV0ZXhfdW5sb2NrKCZ0cmlnLT5wb29sX2xvY2spOworCWlmIChyZXQgPj0gMCkKKwkJcmV0ICs9IHRyaWctPnN1YmlycV9iYXNlOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaWlvX3RyaWdnZXJfcHV0X2lycShzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcsIGludCBpcnEpCit7CisJbXV0ZXhfbG9jaygmdHJpZy0+cG9vbF9sb2NrKTsKKwljbGVhcl9iaXQoaXJxIC0gdHJpZy0+c3ViaXJxX2Jhc2UsIHRyaWctPnBvb2wpOworCW11dGV4X3VubG9jaygmdHJpZy0+cG9vbF9sb2NrKTsKK30KIAogLyogQ29tcGxleGl0eSBpbiBoZXJlLiAgV2l0aCBjZXJ0YWluIHRyaWdnZXJzIChkYXRhcmR5KSBhbiBhY2tub3dsZWRnZW1lbnQKICAqIG1heSBiZSBuZWVkZWQgaWYgdGhlIHBvbGxmdW5jcyBkbyBub3QgaW5jbHVkZSB0aGUgZGF0YSByZWFkIGZvciB0aGUKQEAgLTIyMyw0NCArMjA5LDQ1IEBACiAgKiB0aGUgcmVsZXZhbnQgZnVuY3Rpb24gaXMgaW4gdGhlcmUgbWF5IGJlIHRoZSBiZXN0IG9wdGlvbi4KICAqLwogLyogV29ydGggcHJvdGVjdGluZyBhZ2FpbnN0IGRvdWJsZSBhZGRpdGlvbnM/Ki8KLWludCBpaW9fdHJpZ2dlcl9hdHRhY2hfcG9sbF9mdW5jKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywKLQkJCQkgc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmKQorc3RhdGljIGludCBpaW9fdHJpZ2dlcl9hdHRhY2hfcG9sbF9mdW5jKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywKKwkJCQkJc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmKQogewogCWludCByZXQgPSAwOwogCWJvb2wgbm90aW51c2UKIAkJPSBiaXRtYXBfZW1wdHkodHJpZy0+cG9vbCwgQ09ORklHX0lJT19DT05TVU1FUlNfUEVSX1RSSUdHRVIpOwogCisJLyogUHJldmVudCB0aGUgbW9kdWxlIGJlaW5nIHJlbW92ZWQgd2hpbHN0IGF0dGFjaGVkIHRvIGEgdHJpZ2dlciAqLworCV9fbW9kdWxlX2dldChwZi0+aW5kaW9fZGV2LT5pbmZvLT5kcml2ZXJfbW9kdWxlKTsKIAlwZi0+aXJxID0gaWlvX3RyaWdnZXJfZ2V0X2lycSh0cmlnKTsKIAlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShwZi0+aXJxLCBwZi0+aCwgcGYtPnRocmVhZCwKIAkJCQkgICBwZi0+dHlwZSwgcGYtPm5hbWUsCiAJCQkJICAgcGYpOwotCWlmICh0cmlnLT5zZXRfdHJpZ2dlcl9zdGF0ZSAmJiBub3RpbnVzZSkKLQkJcmV0ID0gdHJpZy0+c2V0X3RyaWdnZXJfc3RhdGUodHJpZywgdHJ1ZSk7CisJaWYgKHRyaWctPm9wcyAmJiB0cmlnLT5vcHMtPnNldF90cmlnZ2VyX3N0YXRlICYmIG5vdGludXNlKQorCQlyZXQgPSB0cmlnLT5vcHMtPnNldF90cmlnZ2VyX3N0YXRlKHRyaWcsIHRydWUpOwogCiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0woaWlvX3RyaWdnZXJfYXR0YWNoX3BvbGxfZnVuYyk7CiAKLWludCBpaW9fdHJpZ2dlcl9kZXR0YWNoX3BvbGxfZnVuYyhzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcsCi0JCQkJICBzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqcGYpCitzdGF0aWMgaW50IGlpb190cmlnZ2VyX2RldHRhY2hfcG9sbF9mdW5jKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywKKwkJCQkJIHN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZikKIHsKIAlpbnQgcmV0ID0gMDsKIAlib29sIG5vX290aGVyX3VzZXJzCiAJCT0gKGJpdG1hcF93ZWlnaHQodHJpZy0+cG9vbCwKIAkJCQkgQ09ORklHX0lJT19DT05TVU1FUlNfUEVSX1RSSUdHRVIpCiAJCSAgID09IDEpOwotCWlmICh0cmlnLT5zZXRfdHJpZ2dlcl9zdGF0ZSAmJiBub19vdGhlcl91c2VycykgewotCQlyZXQgPSB0cmlnLT5zZXRfdHJpZ2dlcl9zdGF0ZSh0cmlnLCBmYWxzZSk7CisJaWYgKHRyaWctPm9wcyAmJiB0cmlnLT5vcHMtPnNldF90cmlnZ2VyX3N0YXRlICYmIG5vX290aGVyX3VzZXJzKSB7CisJCXJldCA9IHRyaWctPm9wcy0+c2V0X3RyaWdnZXJfc3RhdGUodHJpZywgZmFsc2UpOwogCQlpZiAocmV0KQogCQkJZ290byBlcnJvcl9yZXQ7CiAJfQogCWlpb190cmlnZ2VyX3B1dF9pcnEodHJpZywgcGYtPmlycSk7CiAJZnJlZV9pcnEocGYtPmlycSwgcGYpOworCW1vZHVsZV9wdXQocGYtPmluZGlvX2Rldi0+aW5mby0+ZHJpdmVyX21vZHVsZSk7CiAKIGVycm9yX3JldDoKIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTChpaW9fdHJpZ2dlcl9kZXR0YWNoX3BvbGxfZnVuYyk7CiAKIGlycXJldHVybl90IGlpb19wb2xsZnVuY19zdG9yZV90aW1lKGludCBpcnEsIHZvaWQgKnApCiB7CkBAIC0yNzQsNyArMjYxLDcgQEAKICppaW9fYWxsb2NfcG9sbGZ1bmMoaXJxcmV0dXJuX3QgKCpoKShpbnQgaXJxLCB2b2lkICpwKSwKIAkJICAgIGlycXJldHVybl90ICgqdGhyZWFkKShpbnQgaXJxLCB2b2lkICpwKSwKIAkJICAgIGludCB0eXBlLAotCQkgICAgdm9pZCAqcHJpdmF0ZSwKKwkJICAgIHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCiAJCSAgICBjb25zdCBjaGFyICpmbXQsCiAJCSAgICAuLi4pCiB7CkBAIC0yOTQsNyArMjgxLDcgQEAKIAlwZi0+aCA9IGg7CiAJcGYtPnRocmVhZCA9IHRocmVhZDsKIAlwZi0+dHlwZSA9IHR5cGU7Ci0JcGYtPnByaXZhdGVfZGF0YSA9IHByaXZhdGU7CisJcGYtPmluZGlvX2RldiA9IGluZGlvX2RldjsKIAogCXJldHVybiBwZjsKIH0KQEAgLTMxNywxMyArMzA0LDExIEBACiAJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJCQljaGFyICpidWYpCiB7Ci0Jc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaW50IGxlbiA9IDA7Ci0JaWYgKGRldl9pbmZvLT50cmlnKQotCQlsZW4gPSBzcHJpbnRmKGJ1ZiwKLQkJCSAgICAgICIlc1xuIiwKLQkJCSAgICAgIGRldl9pbmZvLT50cmlnLT5uYW1lKTsKLQlyZXR1cm4gbGVuOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChpbmRpb19kZXYtPnRyaWcpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBpbmRpb19kZXYtPnRyaWctPm5hbWUpOworCXJldHVybiAwOwogfQogCiAvKioKQEAgLTMzOCwzOCArMzIzLDM4IEBACiAJCQkJCSBjb25zdCBjaGFyICpidWYsCiAJCQkJCSBzaXplX3QgbGVuKQogewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBpaW9fdHJpZ2dlciAqb2xkdHJpZyA9IGRldl9pbmZvLT50cmlnOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaWlvX3RyaWdnZXIgKm9sZHRyaWcgPSBpbmRpb19kZXYtPnRyaWc7CiAJc3RydWN0IGlpb190cmlnZ2VyICp0cmlnOwogCWludCByZXQ7CiAKLQltdXRleF9sb2NrKCZkZXZfaW5mby0+bWxvY2spOwotCWlmIChkZXZfaW5mby0+Y3VycmVudG1vZGUgPT0gSU5ESU9fUklOR19UUklHR0VSRUQpIHsKLQkJbXV0ZXhfdW5sb2NrKCZkZXZfaW5mby0+bWxvY2spOworCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOworCWlmIChpbmRpb19kZXYtPmN1cnJlbnRtb2RlID09IElORElPX0JVRkZFUl9UUklHR0VSRUQpIHsKKwkJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZkZXZfaW5mby0+bWxvY2spOworCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CiAKIAl0cmlnID0gaWlvX3RyaWdnZXJfZmluZF9ieV9uYW1lKGJ1ZiwgbGVuKTsKIAotCWlmICh0cmlnICYmIGRldl9pbmZvLT5pbmZvLT52YWxpZGF0ZV90cmlnZ2VyKSB7Ci0JCXJldCA9IGRldl9pbmZvLT5pbmZvLT52YWxpZGF0ZV90cmlnZ2VyKGRldl9pbmZvLCB0cmlnKTsKKwlpZiAodHJpZyAmJiBpbmRpb19kZXYtPmluZm8tPnZhbGlkYXRlX3RyaWdnZXIpIHsKKwkJcmV0ID0gaW5kaW9fZGV2LT5pbmZvLT52YWxpZGF0ZV90cmlnZ2VyKGluZGlvX2RldiwgdHJpZyk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmICh0cmlnICYmIHRyaWctPnZhbGlkYXRlX2RldmljZSkgewotCQlyZXQgPSB0cmlnLT52YWxpZGF0ZV9kZXZpY2UodHJpZywgZGV2X2luZm8pOworCWlmICh0cmlnICYmIHRyaWctPm9wcyAmJiB0cmlnLT5vcHMtPnZhbGlkYXRlX2RldmljZSkgeworCQlyZXQgPSB0cmlnLT5vcHMtPnZhbGlkYXRlX2RldmljZSh0cmlnLCBpbmRpb19kZXYpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAl9CiAKLQlkZXZfaW5mby0+dHJpZyA9IHRyaWc7CisJaW5kaW9fZGV2LT50cmlnID0gdHJpZzsKIAotCWlmIChvbGR0cmlnICYmIGRldl9pbmZvLT50cmlnICE9IG9sZHRyaWcpCisJaWYgKG9sZHRyaWcgJiYgaW5kaW9fZGV2LT50cmlnICE9IG9sZHRyaWcpCiAJCWlpb19wdXRfdHJpZ2dlcihvbGR0cmlnKTsKLQlpZiAoZGV2X2luZm8tPnRyaWcpCi0JCWlpb19nZXRfdHJpZ2dlcihkZXZfaW5mby0+dHJpZyk7CisJaWYgKGluZGlvX2Rldi0+dHJpZykKKwkJaWlvX2dldF90cmlnZ2VyKGluZGlvX2Rldi0+dHJpZyk7CiAKIAlyZXR1cm4gbGVuOwogfQpAQCAtNDA5LDcgKzM5NCw2IEBACiAJfQogCWtmcmVlKHRyaWctPm5hbWUpOwogCWtmcmVlKHRyaWcpOwotCWlpb19wdXQoKTsKIH0KIAogc3RhdGljIHN0cnVjdCBkZXZpY2VfdHlwZSBpaW9fdHJpZ190eXBlID0gewpAQCAtNDc2LDcgKzQ2MCw3IEBACiAJCQkJCSAgSVJRX05PUkVRVUVTVCB8IElSUV9OT0FVVE9FTiwKIAkJCQkJICBJUlFfTk9QUk9CRSk7CiAJCX0KLQkJaWlvX2dldCgpOworCQlnZXRfZGV2aWNlKCZ0cmlnLT5kZXYpOwogCX0KIAlyZXR1cm4gdHJpZzsKIH0KQEAgLTQ4OSwzNyArNDczLDM1IEBACiB9CiBFWFBPUlRfU1lNQk9MKGlpb19mcmVlX3RyaWdnZXIpOwogCi1pbnQgaWlvX2RldmljZV9yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKHN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbykKK2ludCBpaW9fZGV2aWNlX3JlZ2lzdGVyX3RyaWdnZXJfY29uc3VtZXIoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKLQlpbnQgcmV0OwotCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2X2luZm8tPmRldi5rb2JqLAotCQkJCSAmaWlvX3RyaWdnZXJfY29uc3VtZXJfYXR0cl9ncm91cCk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woaWlvX2RldmljZV9yZWdpc3Rlcl90cmlnZ2VyX2NvbnN1bWVyKTsKKwlpbmRpb19kZXYtPmdyb3Vwc1tpbmRpb19kZXYtPmdyb3VwY291bnRlcisrXSA9CisJCSZpaW9fdHJpZ2dlcl9jb25zdW1lcl9hdHRyX2dyb3VwOwogCi1pbnQgaWlvX2RldmljZV91bnJlZ2lzdGVyX3RyaWdnZXJfY29uc3VtZXIoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvKQotewotCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2X2luZm8tPmRldi5rb2JqLAotCQkJICAgJmlpb190cmlnZ2VyX2NvbnN1bWVyX2F0dHJfZ3JvdXApOwogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTChpaW9fZGV2aWNlX3VucmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcik7CiAKLWludCBpaW9fdHJpZ2dlcmVkX3JpbmdfcG9zdGVuYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQordm9pZCBpaW9fZGV2aWNlX3VucmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCS8qIENsZWFuIHVwIGFuZCBhc3NvY2lhdGVkIGJ1dCBub3QgYXR0YWNoZWQgdHJpZ2dlcnMgcmVmZXJlbmNlcyAqLworCWlmIChpbmRpb19kZXYtPnRyaWcpCisJCWlpb19wdXRfdHJpZ2dlcihpbmRpb19kZXYtPnRyaWcpOworfQorCitpbnQgaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCXJldHVybiBpbmRpb19kZXYtPnRyaWcKIAkJPyBpaW9fdHJpZ2dlcl9hdHRhY2hfcG9sbF9mdW5jKGluZGlvX2Rldi0+dHJpZywKIAkJCQkJICAgICAgIGluZGlvX2Rldi0+cG9sbGZ1bmMpCiAJCTogMDsKIH0KLUVYUE9SVF9TWU1CT0woaWlvX3RyaWdnZXJlZF9yaW5nX3Bvc3RlbmFibGUpOworRVhQT1JUX1NZTUJPTChpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wb3N0ZW5hYmxlKTsKIAotaW50IGlpb190cmlnZ2VyZWRfcmluZ19wcmVkaXNhYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCitpbnQgaWlvX3RyaWdnZXJlZF9idWZmZXJfcHJlZGlzYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCXJldHVybiBpbmRpb19kZXYtPnRyaWcKIAkJPyBpaW9fdHJpZ2dlcl9kZXR0YWNoX3BvbGxfZnVuYyhpbmRpb19kZXYtPnRyaWcsCiAJCQkJCQlpbmRpb19kZXYtPnBvbGxmdW5jKQogCQk6IDA7CiB9Ci1FWFBPUlRfU1lNQk9MKGlpb190cmlnZ2VyZWRfcmluZ19wcmVkaXNhYmxlKTsKK0VYUE9SVF9TWU1CT0woaWlvX3RyaWdnZXJlZF9idWZmZXJfcHJlZGlzYWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2tmaWZvX2J1Zi5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9rZmlmb19idWYuYwppbmRleCA2MDAyMzY4Li5lOGMyMzRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2tmaWZvX2J1Zi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8va2ZpZm9fYnVmLmMKQEAgLTgsNyArOCwxNSBAQAogCiAjaW5jbHVkZSAia2ZpZm9fYnVmLmgiCiAKLSNkZWZpbmUgaWlvX3RvX2tmaWZvKHIpIGNvbnRhaW5lcl9vZihyLCBzdHJ1Y3QgaWlvX2tmaWZvLCByaW5nKQorc3RydWN0IGlpb19rZmlmbyB7CisJc3RydWN0IGlpb19idWZmZXIgYnVmZmVyOworCXN0cnVjdCBrZmlmbyBrZjsKKwlpbnQgdXNlX2NvdW50OworCWludCB1cGRhdGVfbmVlZGVkOworCXN0cnVjdCBtdXRleCB1c2VfbG9jazsKK307CisKKyNkZWZpbmUgaWlvX3RvX2tmaWZvKHIpIGNvbnRhaW5lcl9vZihyLCBzdHJ1Y3QgaWlvX2tmaWZvLCBidWZmZXIpCiAKIHN0YXRpYyBpbmxpbmUgaW50IF9faWlvX2FsbG9jYXRlX2tmaWZvKHN0cnVjdCBpaW9fa2ZpZm8gKmJ1ZiwKIAkJCQlpbnQgYnl0ZXNfcGVyX2RhdHVtLCBpbnQgbGVuZ3RoKQpAQCAtMTYsMTEgKzI0LDExIEBACiAJaWYgKChsZW5ndGggPT0gMCkgfHwgKGJ5dGVzX3Blcl9kYXR1bSA9PSAwKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlfX2lpb191cGRhdGVfcmluZ19idWZmZXIoJmJ1Zi0+cmluZywgYnl0ZXNfcGVyX2RhdHVtLCBsZW5ndGgpOworCV9faWlvX3VwZGF0ZV9idWZmZXIoJmJ1Zi0+YnVmZmVyLCBieXRlc19wZXJfZGF0dW0sIGxlbmd0aCk7CiAJcmV0dXJuIGtmaWZvX2FsbG9jKCZidWYtPmtmLCBieXRlc19wZXJfZGF0dW0qbGVuZ3RoLCBHRlBfS0VSTkVMKTsKIH0KIAotc3RhdGljIGludCBpaW9fcmVxdWVzdF91cGRhdGVfa2ZpZm8oc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcikKK3N0YXRpYyBpbnQgaWlvX3JlcXVlc3RfdXBkYXRlX2tmaWZvKHN0cnVjdCBpaW9fYnVmZmVyICpyKQogewogCWludCByZXQgPSAwOwogCXN0cnVjdCBpaW9fa2ZpZm8gKmJ1ZiA9IGlpb190b19rZmlmbyhyKTsKQEAgLTMzLDE0ICs0MSwxNCBAQAogCQlnb3RvIGVycm9yX3JldDsKIAl9CiAJa2ZpZm9fZnJlZSgmYnVmLT5rZik7Ci0JcmV0ID0gX19paW9fYWxsb2NhdGVfa2ZpZm8oYnVmLCBidWYtPnJpbmcuYnl0ZXNfcGVyX2RhdHVtLAotCQkJCWJ1Zi0+cmluZy5sZW5ndGgpOworCXJldCA9IF9faWlvX2FsbG9jYXRlX2tmaWZvKGJ1ZiwgYnVmLT5idWZmZXIuYnl0ZXNfcGVyX2RhdHVtLAorCQkJCSAgIGJ1Zi0+YnVmZmVyLmxlbmd0aCk7CiBlcnJvcl9yZXQ6CiAJbXV0ZXhfdW5sb2NrKCZidWYtPnVzZV9sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBpaW9fbWFya19rZmlmb19pbl91c2Uoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcikKK3N0YXRpYyB2b2lkIGlpb19tYXJrX2tmaWZvX2luX3VzZShzdHJ1Y3QgaWlvX2J1ZmZlciAqcikKIHsKIAlzdHJ1Y3QgaWlvX2tmaWZvICpidWYgPSBpaW9fdG9fa2ZpZm8ocik7CiAJbXV0ZXhfbG9jaygmYnVmLT51c2VfbG9jayk7CkBAIC00OCw3ICs1Niw3IEBACiAJbXV0ZXhfdW5sb2NrKCZidWYtPnVzZV9sb2NrKTsKIH0KIAotc3RhdGljIHZvaWQgaWlvX3VubWFya19rZmlmb19pbl91c2Uoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcikKK3N0YXRpYyB2b2lkIGlpb191bm1hcmtfa2ZpZm9faW5fdXNlKHN0cnVjdCBpaW9fYnVmZmVyICpyKQogewogCXN0cnVjdCBpaW9fa2ZpZm8gKmJ1ZiA9IGlpb190b19rZmlmbyhyKTsKIAltdXRleF9sb2NrKCZidWYtPnVzZV9sb2NrKTsKQEAgLTU2LDcgKzY0LDcgQEAKIAltdXRleF91bmxvY2soJmJ1Zi0+dXNlX2xvY2spOwogfQogCi1zdGF0aWMgaW50IGlpb19nZXRfbGVuZ3RoX2tmaWZvKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIpCitzdGF0aWMgaW50IGlpb19nZXRfbGVuZ3RoX2tmaWZvKHN0cnVjdCBpaW9fYnVmZmVyICpyKQogewogCXJldHVybiByLT5sZW5ndGg7CiB9CkBAIC02Niw5ICs3NCw5IEBACiAJbXV0ZXhfaW5pdCgma2YtPnVzZV9sb2NrKTsKIH0KIAotc3RhdGljIElJT19SSU5HX0VOQUJMRV9BVFRSOwotc3RhdGljIElJT19SSU5HX0JZVEVTX1BFUl9EQVRVTV9BVFRSOwotc3RhdGljIElJT19SSU5HX0xFTkdUSF9BVFRSOworc3RhdGljIElJT19CVUZGRVJfRU5BQkxFX0FUVFI7CitzdGF0aWMgSUlPX0JVRkZFUl9CWVRFU19QRVJfREFUVU1fQVRUUjsKK3N0YXRpYyBJSU9fQlVGRkVSX0xFTkdUSF9BVFRSOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaWlvX2tmaWZvX2F0dHJpYnV0ZXNbXSA9IHsKIAkmZGV2X2F0dHJfbGVuZ3RoLmF0dHIsCkBAIC03OSwyNyArODcsMTAgQEAKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaWlvX2tmaWZvX2F0dHJpYnV0ZV9ncm91cCA9IHsKIAkuYXR0cnMgPSBpaW9fa2ZpZm9fYXR0cmlidXRlcywKKwkubmFtZSA9ICJidWZmZXIiLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmlpb19rZmlmb19hdHRyaWJ1dGVfZ3JvdXBzW10gPSB7Ci0JJmlpb19rZmlmb19hdHRyaWJ1dGVfZ3JvdXAsCi0JTlVMTAotfTsKLQotc3RhdGljIHZvaWQgaWlvX2tmaWZvX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIgPSB0b19paW9fcmluZ19idWZmZXIoZGV2KTsKLQlzdHJ1Y3QgaWlvX2tmaWZvICprZiA9IGlpb190b19rZmlmbyhyKTsKLQlrZmlmb19mcmVlKCZrZi0+a2YpOwotCWtmcmVlKGtmKTsKLX0KLQotc3RhdGljIHN0cnVjdCBkZXZpY2VfdHlwZSBpaW9fa2ZpZm9fdHlwZSA9IHsKLQkucmVsZWFzZSA9IGlpb19rZmlmb19yZWxlYXNlLAotCS5ncm91cHMgPSBpaW9fa2ZpZm9fYXR0cmlidXRlX2dyb3VwcywKLX07Ci0KLXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKmlpb19rZmlmb19hbGxvY2F0ZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQorc3RydWN0IGlpb19idWZmZXIgKmlpb19rZmlmb19hbGxvY2F0ZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCXN0cnVjdCBpaW9fa2ZpZm8gKmtmOwogCkBAIC0xMDcsMjIgKzk4LDIwIEBACiAJaWYgKCFrZikKIAkJcmV0dXJuIE5VTEw7CiAJa2YtPnVwZGF0ZV9uZWVkZWQgPSB0cnVlOwotCWlpb19yaW5nX2J1ZmZlcl9pbml0KCZrZi0+cmluZywgaW5kaW9fZGV2KTsKKwlpaW9fYnVmZmVyX2luaXQoJmtmLT5idWZmZXIsIGluZGlvX2Rldik7CisJa2YtPmJ1ZmZlci5hdHRycyA9ICZpaW9fa2ZpZm9fYXR0cmlidXRlX2dyb3VwOwogCV9faWlvX2luaXRfa2ZpZm8oa2YpOwotCWtmLT5yaW5nLmRldi50eXBlID0gJmlpb19rZmlmb190eXBlOwotCWtmLT5yaW5nLmRldi5wYXJlbnQgPSAmaW5kaW9fZGV2LT5kZXY7Ci0JZGV2X3NldF9kcnZkYXRhKCZrZi0+cmluZy5kZXYsICh2b2lkICopJihrZi0+cmluZykpOwogCi0JcmV0dXJuICZrZi0+cmluZzsKKwlyZXR1cm4gJmtmLT5idWZmZXI7CiB9CiBFWFBPUlRfU1lNQk9MKGlpb19rZmlmb19hbGxvY2F0ZSk7CiAKLXN0YXRpYyBpbnQgaWlvX2dldF9ieXRlc19wZXJfZGF0dW1fa2ZpZm8oc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcikKK3N0YXRpYyBpbnQgaWlvX2dldF9ieXRlc19wZXJfZGF0dW1fa2ZpZm8oc3RydWN0IGlpb19idWZmZXIgKnIpCiB7CiAJcmV0dXJuIHItPmJ5dGVzX3Blcl9kYXR1bTsKIH0KIAotc3RhdGljIGludCBpaW9fc2V0X2J5dGVzX3Blcl9kYXR1bV9rZmlmbyhzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyLCBzaXplX3QgYnBkKQorc3RhdGljIGludCBpaW9fc2V0X2J5dGVzX3Blcl9kYXR1bV9rZmlmbyhzdHJ1Y3QgaWlvX2J1ZmZlciAqciwgc2l6ZV90IGJwZCkKIHsKIAlpZiAoci0+Ynl0ZXNfcGVyX2RhdHVtICE9IGJwZCkgewogCQlyLT5ieXRlc19wZXJfZGF0dW0gPSBicGQ7CkBAIC0xMzIsMTQgKzEyMSwxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGlpb19tYXJrX3VwZGF0ZV9uZWVkZWRfa2ZpZm8oc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcikKK3N0YXRpYyBpbnQgaWlvX21hcmtfdXBkYXRlX25lZWRlZF9rZmlmbyhzdHJ1Y3QgaWlvX2J1ZmZlciAqcikKIHsKIAlzdHJ1Y3QgaWlvX2tmaWZvICprZiA9IGlpb190b19rZmlmbyhyKTsKIAlrZi0+dXBkYXRlX25lZWRlZCA9IHRydWU7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaWlvX3NldF9sZW5ndGhfa2ZpZm8oc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqciwgaW50IGxlbmd0aCkKK3N0YXRpYyBpbnQgaWlvX3NldF9sZW5ndGhfa2ZpZm8oc3RydWN0IGlpb19idWZmZXIgKnIsIGludCBsZW5ndGgpCiB7CiAJaWYgKHItPmxlbmd0aCAhPSBsZW5ndGgpIHsKIAkJci0+bGVuZ3RoID0gbGVuZ3RoOwpAQCAtMTQ5LDE0ICsxMzgsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBpaW9fa2ZpZm9fZnJlZShzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyKQordm9pZCBpaW9fa2ZpZm9fZnJlZShzdHJ1Y3QgaWlvX2J1ZmZlciAqcikKIHsKLQlpZiAocikKLQkJaWlvX3B1dF9yaW5nX2J1ZmZlcihyKTsKKwlrZnJlZShpaW9fdG9fa2ZpZm8ocikpOwogfQogRVhQT1JUX1NZTUJPTChpaW9fa2ZpZm9fZnJlZSk7CiAKLXN0YXRpYyBpbnQgaWlvX3N0b3JlX3RvX2tmaWZvKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIsCitzdGF0aWMgaW50IGlpb19zdG9yZV90b19rZmlmbyhzdHJ1Y3QgaWlvX2J1ZmZlciAqciwKIAkJCSAgICAgIHU4ICpkYXRhLAogCQkJICAgICAgczY0IHRpbWVzdGFtcCkKIHsKQEAgLTE3NSw3ICsxNjMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGlpb19yZWFkX2ZpcnN0X25fa2ZpZm8oc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqciwKK3N0YXRpYyBpbnQgaWlvX3JlYWRfZmlyc3Rfbl9rZmlmbyhzdHJ1Y3QgaWlvX2J1ZmZlciAqciwKIAkJCSAgIHNpemVfdCBuLCBjaGFyIF9fdXNlciAqYnVmKQogewogCWludCByZXQsIGNvcGllZDsKQEAgLTE4Niw3ICsxNzQsNyBAQAogCXJldHVybiBjb3BpZWQ7CiB9CiAKLWNvbnN0IHN0cnVjdCBpaW9fcmluZ19hY2Nlc3NfZnVuY3Mga2ZpZm9fYWNjZXNzX2Z1bmNzID0geworY29uc3Qgc3RydWN0IGlpb19idWZmZXJfYWNjZXNzX2Z1bmNzIGtmaWZvX2FjY2Vzc19mdW5jcyA9IHsKIAkubWFya19pbl91c2UgPSAmaWlvX21hcmtfa2ZpZm9faW5fdXNlLAogCS51bm1hcmtfaW5fdXNlID0gJmlpb191bm1hcmtfa2ZpZm9faW5fdXNlLAogCS5zdG9yZV90byA9ICZpaW9fc3RvcmVfdG9fa2ZpZm8sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2tmaWZvX2J1Zi5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9rZmlmb19idWYuaAppbmRleCBhYWMzMDUzLi5hMTU1OThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2tmaWZvX2J1Zi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8va2ZpZm9fYnVmLmgKQEAgLTEsMTggKzEsMTAgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CiAjaW5jbHVkZSAiaWlvLmgiCi0jaW5jbHVkZSAicmluZ19nZW5lcmljLmgiCisjaW5jbHVkZSAiYnVmZmVyX2dlbmVyaWMuaCIKIAotc3RydWN0IGlpb19rZmlmbyB7Ci0Jc3RydWN0IGlpb19yaW5nX2J1ZmZlciByaW5nOwotCXN0cnVjdCBrZmlmbyBrZjsKLQlpbnQgdXNlX2NvdW50OwotCWludCB1cGRhdGVfbmVlZGVkOwotCXN0cnVjdCBtdXRleCB1c2VfbG9jazsKLX07CitleHRlcm4gY29uc3Qgc3RydWN0IGlpb19idWZmZXJfYWNjZXNzX2Z1bmNzIGtmaWZvX2FjY2Vzc19mdW5jczsKIAotZXh0ZXJuIGNvbnN0IHN0cnVjdCBpaW9fcmluZ19hY2Nlc3NfZnVuY3Mga2ZpZm9fYWNjZXNzX2Z1bmNzOwotCi1zdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICppaW9fa2ZpZm9fYWxsb2NhdGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7Ci12b2lkIGlpb19rZmlmb19mcmVlKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIpOworc3RydWN0IGlpb19idWZmZXIgKmlpb19rZmlmb19hbGxvY2F0ZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKK3ZvaWQgaWlvX2tmaWZvX2ZyZWUoc3RydWN0IGlpb19idWZmZXIgKnIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L0tjb25maWcKaW5kZXggMWFkMmQ1Ni4uZTdlOTE1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvS2NvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgTGlnaHQgc2Vuc29ycwogIwotY29tbWVudCAiTGlnaHQgc2Vuc29ycyIKK21lbnUgIkxpZ2h0IHNlbnNvcnMiCiAKIGNvbmZpZyBTRU5TT1JTX0lTTDI5MDE4CiAgICAgICAgIHRyaXN0YXRlICJJU0wgMjkwMTggbGlnaHQgYW5kIHByb3hpbWl0eSBzZW5zb3IiCkBAIC0zMCwzICszMCw1IEBACiAJaGVscAogCSBQcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgVEFPUyB0c2wyNTgwLCB0c2wyNTgxIGFuZCB0c2wyNTgzIGRldmljZXMuCiAJIEFjY2VzcyBBTFMgZGF0YSB2aWEgaWlvLCBzeXNmcy4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9pc2wyOTAxOC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9pc2wyOTAxOC5jCmluZGV4IDQyNmI2YWYuLjlkYzllNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvaXNsMjkwMTguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L2lzbDI5MDE4LmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlICIuLi9paW8uaCIKLQorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCiAjZGVmaW5lIENPTlZFUlNJT05fVElNRV9NUwkJMTAwCiAKICNkZWZpbmUgSVNMMjkwMThfUkVHX0FERF9DT01NQU5EMQkweDAwCkBAIC01MSw3ICs1MSwxMSBAQAogCiAjZGVmaW5lIElTTDI5MDE4X1JFR19BRERfREFUQV9MU0IJMHgwMgogI2RlZmluZSBJU0wyOTAxOF9SRUdfQUREX0RBVEFfTVNCCTB4MDMKLSNkZWZpbmUgSVNMMjkwMThfTUFYX1JFR1MJCUlTTDI5MDE4X1JFR19BRERfREFUQV9NU0IKKyNkZWZpbmUgSVNMMjkwMThfTUFYX1JFR1MJCShJU0wyOTAxOF9SRUdfQUREX0RBVEFfTVNCKzEpCisKKyNkZWZpbmUgSVNMMjkwMThfUkVHX1RFU1QJCTB4MDgKKyNkZWZpbmUgSVNMMjkwMThfVEVTVF9TSElGVAkJMAorI2RlZmluZSBJU0wyOTAxOF9URVNUX01BU0sJCSgweEZGIDw8IElTTDI5MDE4X1RFU1RfU0hJRlQpCiAKIHN0cnVjdCBpc2wyOTAxOF9jaGlwIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OwpAQCAtNjYsMjIgKzcwLDI3IEBACiBzdGF0aWMgaW50IGlzbDI5MDE4X3dyaXRlX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcmVnLAogCQkJdTggdmFsLCB1OCBtYXNrLCB1OCBzaGlmdCkKIHsKLQl1OCByZWd2YWw7Ci0JaW50IHJldCA9IDA7CisJdTggcmVndmFsID0gdmFsOworCWludCByZXQ7CiAJc3RydWN0IGlzbDI5MDE4X2NoaXAgKmNoaXAgPSBpaW9fcHJpdihpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CiAKLQlyZWd2YWwgPSBjaGlwLT5yZWdfY2FjaGVbcmVnXTsKLQlyZWd2YWwgJj0gfm1hc2s7Ci0JcmVndmFsIHw9IHZhbCA8PCBzaGlmdDsKKwkvKiBkb24ndCBjYWNoZSBvciBtYXNrIFJFR19URVNUICovCisJaWYgKHJlZyA8IElTTDI5MDE4X01BWF9SRUdTKSB7CisJCXJlZ3ZhbCA9IGNoaXAtPnJlZ19jYWNoZVtyZWddOworCQlyZWd2YWwgJj0gfm1hc2s7CisJCXJlZ3ZhbCB8PSB2YWwgPDwgc2hpZnQ7CisJfQogCiAJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIHJlZywgcmVndmFsKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiV3JpdGUgdG8gZGV2aWNlIGZhaWxzIHN0YXR1cyAleFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQkvKiBkb24ndCB1cGRhdGUgY2FjaGUgb24gZXJyICovCisJCWlmIChyZWcgPCBJU0wyOTAxOF9NQVhfUkVHUykKKwkJCWNoaXAtPnJlZ19jYWNoZVtyZWddID0gcmVndmFsOwogCX0KLQljaGlwLT5yZWdfY2FjaGVbcmVnXSA9IHJlZ3ZhbDsKIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgaXNsMjkwMThfc2V0X3JhbmdlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHVuc2lnbmVkIGxvbmcgcmFuZ2UsCkBAIC00MTEsNyArNDIwLDcgQEAKIAkJLnR5cGUgPSBJSU9fTElHSFQsCiAJCS5pbmRleGVkID0gMSwKIAkJLmNoYW5uZWwgPSAwLAotCQkucHJvY2Vzc2VkX3ZhbCA9IDEsCisJCS5wcm9jZXNzZWRfdmFsID0gSUlPX1BST0NFU1NFRCwKIAkJLmluZm9fbWFzayA9ICgxIDw8IElJT19DSEFOX0lORk9fQ0FMSUJTQ0FMRV9TRVBBUkFURSksCiAJfSwgewogCQkudHlwZSA9IElJT19JTlRFTlNJVFksCkBAIC00NTcsNiArNDY2LDQ4IEBACiAKIAltZW1zZXQoY2hpcC0+cmVnX2NhY2hlLCAwLCBzaXplb2YoY2hpcC0+cmVnX2NhY2hlKSk7CiAKKwkvKiBDb2RlIGFkZGVkIHBlciBJbnRlcnNpbCBBcHBsaWNhdGlvbiBOb3RlIDE1MzQ6CisJICogICAgIFdoZW4gVkREIHNpbmtzIHRvIGFwcHJveGltYXRlbHkgMS44ViBvciBiZWxvdywgc29tZSBvZgorCSAqIHRoZSBwYXJ0J3MgcmVnaXN0ZXJzIG1heSBjaGFuZ2UgdGhlaXIgc3RhdGUuIFdoZW4gVkRECisJICogcmVjb3ZlcnMgdG8gMi4yNVYgKG9yIGdyZWF0ZXIpLCB0aGUgcGFydCBtYXkgdGh1cyBiZSBpbiBhbgorCSAqIHVua25vd24gbW9kZSBvZiBvcGVyYXRpb24uIFRoZSB1c2VyIGNhbiByZXR1cm4gdGhlIHBhcnQgdG8KKwkgKiBhIGtub3duIG1vZGUgb2Ygb3BlcmF0aW9uIGVpdGhlciBieSAoYSkgc2V0dGluZyBWREQgPSAwViBmb3IKKwkgKiAxIHNlY29uZCBvciBtb3JlIGFuZCB0aGVuIHBvd2VyaW5nIGJhY2sgdXAgd2l0aCBhIHNsZXcgcmF0ZQorCSAqIG9mIDAuNVYvbXMgb3IgZ3JlYXRlciwgb3IgKGIpIHZpYSBJMkMgZGlzYWJsZSBhbGwgQUxTL1BST1gKKwkgKiBjb252ZXJzaW9ucywgY2xlYXIgdGhlIHRlc3QgcmVnaXN0ZXJzLCBhbmQgdGhlbiByZXdyaXRlIGFsbAorCSAqIHJlZ2lzdGVycyB0byB0aGUgZGVzaXJlZCB2YWx1ZXMuCisJICogLi4uCisJICogRk9SIElTTDI5MDExLCBJU0wyOTAxOCwgSVNMMjkwMjEsIElTTDI5MDIzCisJICogMS4gV3JpdGUgMHgwMCB0byByZWdpc3RlciAweDA4IChURVNUKQorCSAqIDIuIFdyaXRlIDB4MDAgdG8gcmVnaXN0ZXIgMHgwMCAoQ01EMSkKKwkgKiAzLiBSZXdyaXRlIGFsbCByZWdpc3RlcnMgdG8gdGhlIGRlc2lyZWQgdmFsdWVzCisJICoKKwkgKiBJU0wyOTAxOCBEYXRhIFNoZWV0IChGTjY2MTkuMSwgRmViIDExLCAyMDEwKSBlc3NlbnRpYWxseSBzYXlzCisJICogdGhlIHNhbWUgdGhpbmcgRVhDRVBUIHRoZSBkYXRhIHNoZWV0IGFza3MgZm9yIGEgMW1zIGRlbGF5IGFmdGVyCisJICogd3JpdGluZyB0aGUgQ01EMSByZWdpc3Rlci4KKwkgKi8KKwlzdGF0dXMgPSBpc2wyOTAxOF93cml0ZV9kYXRhKGNsaWVudCwgSVNMMjkwMThfUkVHX1RFU1QsIDAsCisJCQkJSVNMMjkwMThfVEVTVF9NQVNLLCBJU0wyOTAxOF9URVNUX1NISUZUKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBjbGVhciBpc2wyOTAxOCBURVNUIHJlZy4iCisJCQkJCSIoJWQpXG4iLCBzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIFNlZSBJbnRlcnNpbCBBTjE1MzQgY29tbWVudHMgYWJvdmUuCisJICogIk9wZXJhdGluZyBNb2RlIiAoQ09NTUFORDEpIHJlZ2lzdGVyIGlzIHJlcHJvZ3JhbW1lZCB3aGVuCisJICogZGF0YSBpcyByZWFkIGZyb20gdGhlIGRldmljZS4KKwkgKi8KKwlzdGF0dXMgPSBpc2wyOTAxOF93cml0ZV9kYXRhKGNsaWVudCwgSVNMMjkwMThfUkVHX0FERF9DT01NQU5EMSwgMCwKKwkJCQkweGZmLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBjbGVhciBpc2wyOTAxOCBDTUQxIHJlZy4iCisJCQkJCSIoJWQpXG4iLCBzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCW1zbGVlcCgxKTsJLyogcGVyIGRhdGEgc2hlZXQsIHBhZ2UgMTAgKi8KKwogCS8qIHNldCBkZWZhdWx0cyAqLwogCXN0YXR1cyA9IGlzbDI5MDE4X3NldF9yYW5nZShjbGllbnQsIGNoaXAtPnJhbmdlLCAmbmV3X3JhbmdlKTsKIAlpZiAoc3RhdHVzIDwgMCkgewpAQCAtNTMwLDYgKzU4MSw3IEBACiAKIAlkZXZfZGJnKCZjbGllbnQtPmRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyNTYzLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1NjMuYwppbmRleCBmMjUyNDNiLi43ZTk4NGJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1NjMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1NjMuYwpAQCAtMzEsMTMgKzMxLDEyIEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KLSNpbmNsdWRlIDxsaW51eC9od21vbi5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCiAjaW5jbHVkZSAidHNsMjU2My5oIgogCiAvKiBVc2UgdGhpcyBtYW55IGJpdHMgZm9yIGZyYWN0aW9uIHBhcnQuICovCkBAIC01MTksNyArNTE4LDggQEAKIAkJcmV0ID0gSUlPX1ZBTF9JTlQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yX3JldDsKIAl9CiAKIGVycm9yX3JldDoKQEAgLTUyNywyMSArNTI3LDMxIEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2RlZmluZSBJTkZPX01BU0sgKDEgPDwgSUlPX0NIQU5fSU5GT19DQUxJQlNDQUxFX1NFUEFSQVRFKQotI2RlZmluZSBFVkVOVF9NQVNLIChJSU9fRVZfQklUKElJT19FVl9UWVBFX1RIUkVTSCwgSUlPX0VWX0RJUl9SSVNJTkcpIHwgXAotCQkgICAgSUlPX0VWX0JJVChJSU9fRVZfVFlQRV9USFJFU0gsIElJT19FVl9ESVJfRkFMTElORykpCi0jZGVmaW5lIElJT19DSEFOXzI1NjModHlwZSwgbW9kLCBwcm9jLCBjaGFuLCBpbWFzaywgZW1hc2spIFwKLQlJSU9fQ0hBTih0eXBlLCBtb2QsIDEsIHByb2MsIE5VTEwsIGNoYW4sIDAsIGltYXNrLCAwLCAwLCB7fSwgZW1hc2spCi0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyB0c2wyNTYzX2NoYW5uZWxzW10gPSB7Ci0JSUlPX0NIQU5fMjU2MyhJSU9fTElHSFQsICAgICAwLCAxLCAwLCAwLCAwKSwKLQlJSU9fQ0hBTl8yNTYzKElJT19JTlRFTlNJVFksIDEsIDAsIDAsIElORk9fTUFTSywgRVZFTlRfTUFTSyksCi0JSUlPX0NIQU5fMjU2MyhJSU9fSU5URU5TSVRZLCAxLCAwLCAxLCBJTkZPX01BU0ssIDApLAorCXsKKwkJLnR5cGUgPSBJSU9fTElHSFQsCisJCS5pbmRleGVkID0gMSwKKwkJLmNoYW5uZWwgPSAwLAorCX0sIHsKKwkJLnR5cGUgPSBJSU9fSU5URU5TSVRZLAorCQkubW9kaWZpZWQgPSAxLAorCQkuY2hhbm5lbDIgPSBJSU9fTU9EX0xJR0hUX0JPVEgsCisJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCU0NBTEVfU0VQQVJBVEUpLAorCQkuZXZlbnRfbWFzayA9IChJSU9fRVZfQklUKElJT19FVl9UWVBFX1RIUkVTSCwKKwkJCQkJICBJSU9fRVZfRElSX1JJU0lORykgfAorCQkJICAgICAgIElJT19FVl9CSVQoSUlPX0VWX1RZUEVfVEhSRVNILAorCQkJCQkgIElJT19FVl9ESVJfRkFMTElORykpLAorCX0sIHsKKwkJLnR5cGUgPSBJSU9fSU5URU5TSVRZLAorCQkubW9kaWZpZWQgPSAxLAorCQkuY2hhbm5lbDIgPSBJSU9fTU9EX0xJR0hUX0JPVEgsCisJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX0NBTElCU0NBTEVfU0VQQVJBVEUpLAorCX0KIH07CiAKIHN0YXRpYyBpbnQgdHNsMjU2M19yZWFkX3RocmVzaChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAotCQkJCWludCBldmVudF9jb2RlLAotCQkJCWludCAqdmFsKQorCQkJICAgICAgIHU2NCBldmVudF9jb2RlLAorCQkJICAgICAgIGludCAqdmFsKQogewogCXN0cnVjdCB0c2wyNTYzX2NoaXAgKmNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCkBAIC01NTksOCArNTY5LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNzaXplX3QgdHNsMjU2M193cml0ZV90aHJlc2goc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKLQkJCQkgIGludCBldmVudF9jb2RlLAorc3RhdGljIGludCB0c2wyNTYzX3dyaXRlX3RocmVzaChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJCSAgdTY0IGV2ZW50X2NvZGUsCiAJCQkJICBpbnQgdmFsKQogewogCXN0cnVjdCB0c2wyNTYzX2NoaXAgKmNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtNTk1LDggKzYwNSw4IEBACiAJc3RydWN0IGlpb19kZXYgKmRldl9pbmZvID0gcHJpdmF0ZTsKIAlzdHJ1Y3QgdHNsMjU2M19jaGlwICpjaGlwID0gaWlvX3ByaXYoZGV2X2luZm8pOwogCi0JaWlvX3B1c2hfZXZlbnQoZGV2X2luZm8sIDAsCi0JCSAgICAgICBJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fRVZfQ0xBU1NfTElHSFQsCisJaWlvX3B1c2hfZXZlbnQoZGV2X2luZm8sCisJCSAgICAgICBJSU9fVU5NT0RfRVZFTlRfQ09ERShJSU9fTElHSFQsCiAJCQkJCSAgICAwLAogCQkJCQkgICAgSUlPX0VWX1RZUEVfVEhSRVNILAogCQkJCQkgICAgSUlPX0VWX0RJUl9FSVRIRVIpLApAQCAtNjA4LDggKzYxOCw4IEBACiB9CiAKIHN0YXRpYyBpbnQgdHNsMjU2M193cml0ZV9pbnRlcnJ1cHRfY29uZmlnKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCi0JCQkJCWludCBldmVudF9jb2RlLAotCQkJCQlpbnQgc3RhdGUpCisJCQkJCSAgdTY0IGV2ZW50X2NvZGUsCisJCQkJCSAgaW50IHN0YXRlKQogewogCXN0cnVjdCB0c2wyNTYzX2NoaXAgKmNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCWludCByZXQgPSAwOwpAQCAtNjUwLDcgKzY2MCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgdHNsMjU2M19yZWFkX2ludGVycnVwdF9jb25maWcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKLQkJCQkJICAgaW50IGV2ZW50X2NvZGUpCisJCQkJCSB1NjQgZXZlbnRfY29kZSkKIHsKIAlzdHJ1Y3QgdHNsMjU2M19jaGlwICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlpbnQgcmV0OwpAQCAtNjgwLDcgKzY5MCw2IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gdHNsMjU2M19pbmZvID0gewogCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCi0JLm51bV9pbnRlcnJ1cHRfbGluZXMgPSAxLAogCS5yZWFkX3JhdyA9ICZ0c2wyNTYzX3JlYWRfcmF3LAogCS53cml0ZV9yYXcgPSAmdHNsMjU2M193cml0ZV9yYXcsCiAJLnJlYWRfZXZlbnRfdmFsdWUgPSAmdHNsMjU2M19yZWFkX3RocmVzaCwKQEAgLTY5Nyw3ICs3MDYsNyBAQAogCXN0cnVjdCB0c2wyNTYzX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlpbnQgZXJyID0gMDsKIAlpbnQgcmV0OwotCXU4IGlkOworCXU4IGlkID0gMDsKIAogCWluZGlvX2RldiA9IGlpb19hbGxvY2F0ZV9kZXZpY2Uoc2l6ZW9mKCpjaGlwKSk7CiAJaWYgKCFpbmRpb19kZXYpCkBAIC03NDMsOSArNzUyLDYgQEAKIAkJaW5kaW9fZGV2LT5pbmZvID0gJnRzbDI1NjNfaW5mbzsKIAllbHNlCiAJCWluZGlvX2Rldi0+aW5mbyA9ICZ0c2wyNTYzX2luZm9fbm9faXJxOwotCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIGZhaWwxOwogCWlmIChjbGllbnQtPmlycSkgewogCQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShjbGllbnQtPmlycSwKIAkJCQkJICAgTlVMTCwKQEAgLTc2NCwxMiArNzcwLDE2IEBACiAJLyogVGhlIGludGVycnVwdCBjYW5ub3QgeWV0IGJlIGVuYWJsZWQgc28gdGhpcyBpcyBmaW5lIHdpdGhvdXQgbG9jayAqLwogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2hpcC0+cG93ZXJvZmZfd29yaywgNSAqIEhaKTsKIAorCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWwzOworCiAJcmV0dXJuIDA7CiBmYWlsMzoKIAlpZiAoY2xpZW50LT5pcnEpCiAJCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBpbmRpb19kZXYpOwogZmFpbDI6Ci0JaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiBmYWlsMToKIAlrZnJlZShjaGlwKTsKIAlyZXR1cm4gZXJyOwpAQCAtNzc5LDYgKzc4OSw4IEBACiB7CiAJc3RydWN0IHRzbDI1NjNfY2hpcCAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpaW9fcHJpdl90b19kZXYoY2hpcCk7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIAlpZiAoIWNoaXAtPmludF9lbmFibGVkKQogCQljYW5jZWxfZGVsYXllZF93b3JrKCZjaGlwLT5wb3dlcm9mZl93b3JrKTsKIAkvKiBFbnN1cmUgdGhhdCBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCAtIHRoZW4gZmx1c2ggYW55IGJvdHRvbSBoYWx2ZXMgKi8KQEAgLTc4OSw3ICs4MDEsOCBAQAogCXRzbDI1NjNfc2V0X3Bvd2VyKGNoaXAsIDApOwogCWlmIChjbGllbnQtPmlycSkKIAkJZnJlZV9pcnEoY2xpZW50LT5pcnEsIGluZGlvX2Rldik7Ci0JaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisKKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyNTgzLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1ODMuYwppbmRleCA1Njk0NjEwLi44MGY3N2NmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1ODMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1ODMuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgIi4uL2lpby5oIgogCiAjZGVmaW5lIFRTTDI1OFhfTUFYX0RFVklDRV9SRUdTCQkzMgpAQCAtNjgsNyArNjksNyBAQAogCVRTTDI1OFhfQ0hJUF9VTktOT1dOID0gMCwKIAlUU0wyNThYX0NISVBfV09SS0lORyA9IDEsCiAJVFNMMjU4WF9DSElQX1NVU1BFTkRFRCA9IDIKLX0gVFNMMjU4WF9DSElQX1dPUktJTkdfU1RBVFVTOworfTsKIAogLyogUGVyLWRldmljZSBkYXRhICovCiBzdHJ1Y3QgdGFvc19hbHNfaW5mbyB7CkBAIC04Nyw3ICs4OCw2IEBACiBzdHJ1Y3QgdHNsMjU4M19jaGlwIHsKIAlzdHJ1Y3QgbXV0ZXggYWxzX211dGV4OwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7Ci0Jc3RydWN0IGlpb19kZXYgKmlpb19kZXY7CiAJc3RydWN0IHRhb3NfYWxzX2luZm8gYWxzX2N1cl9pbmZvOwogCXN0cnVjdCB0YW9zX3NldHRpbmdzIHRhb3Nfc2V0dGluZ3M7CiAJaW50IGFsc190aW1lX3NjYWxlOwpAQCAtMTE0LDcgKzExNCw3IEBACiAvKiBUaGlzIHN0cnVjdHVyZSBpcyBpbnRlbnRpb25hbGx5IGxhcmdlIHRvIGFjY29tbW9kYXRlIHVwZGF0ZXMgdmlhIHN5c2ZzLiAqLwogLyogU2l6ZWQgdG8gMTEgPSBtYXggMTAgc2VnbWVudHMgKyAxIHRlcm1pbmF0aW9uIHNlZ21lbnQgKi8KIC8qIEFzc3VtcHRpb24gaXMgaXMgb25lIGFuZCBvbmx5IG9uZSB0eXBlIG9mIGdsYXNzIHVzZWQgICovCi1zdHJ1Y3QgdGFvc19sdXggdGFvc19kZXZpY2VfbHV4WzExXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgdGFvc19sdXggdGFvc19kZXZpY2VfbHV4WzExXSA9IHsKIAl7ICA5ODMwLCAgODUyMCwgMTU3MjkgfSwKIAl7IDEyNDUyLCAxMDgwNywgMjMzNDQgfSwKIAl7IDE0NzQ2LCAgNjM4MywgMTE3MDUgfSwKQEAgLTE1OSw4ICsxNTksNyBAQAogc3RhdGljIGludAogdGFvc19pMmNfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCByZWcsIHU4ICp2YWwsIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0JaW50IHJldDsKLQlpbnQgaTsKKwlpbnQgaSwgcmV0OwogCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAJCS8qIHNlbGVjdCByZWdpc3RlciB0byB3cml0ZSAqLwpAQCAtMTkxLDQ3ICsxOTAsNDcgQEAKICAqIHRoZSBhcnJheSBhcmUgdGhlbiB1c2VkIGFsb25nIHdpdGggdGhlIHRpbWUgc2NhbGUgZmFjdG9yIGFycmF5IHZhbHVlcywgdG8KICAqIGNhbGN1bGF0ZSB0aGUgbHV4LgogICovCi1zdGF0aWMgaW50IHRhb3NfZ2V0X2x1eChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCB0YW9zX2dldF9sdXgoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKIAl1MTYgY2gwLCBjaDE7IC8qIHNlcGFyYXRlZCBjaDAvY2gxIGRhdGEgZnJvbSBkZXZpY2UgKi8KIAl1MzIgbHV4OyAvKiByYXcgbHV4IGNhbGN1bGF0ZWQgZnJvbSBkZXZpY2UgZGF0YSAqLwogCXUzMiByYXRpbzsKIAl1OCBidWZbNV07CiAJc3RydWN0IHRhb3NfbHV4ICpwOwotCXN0cnVjdCB0c2wyNTgzX2NoaXAgKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgdHNsMjU4M19jaGlwICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlpbnQgaSwgcmV0OwogCXUzMiBjaDBsdXggPSAwOwogCXUzMiBjaDFsdXggPSAwOwogCiAJaWYgKG11dGV4X3RyeWxvY2soJmNoaXAtPmFsc19tdXRleCkgPT0gMCkgewotCQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJ0YW9zX2dldF9sdXggZGV2aWNlIGlzIGJ1c3lcbiIpOworCQlkZXZfaW5mbygmY2hpcC0+Y2xpZW50LT5kZXYsICJ0YW9zX2dldF9sdXggZGV2aWNlIGlzIGJ1c3lcbiIpOwogCQlyZXR1cm4gY2hpcC0+YWxzX2N1cl9pbmZvLmx1eDsgLyogYnVzeSwgc28gcmV0dXJuIExBU1QgVkFMVUUgKi8KIAl9CiAKIAlpZiAoY2hpcC0+dGFvc19jaGlwX3N0YXR1cyAhPSBUU0wyNThYX0NISVBfV09SS0lORykgewogCQkvKiBkZXZpY2UgaXMgbm90IGVuYWJsZWQgKi8KLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ0YW9zX2dldF9sdXggZGV2aWNlIGlzIG5vdCBlbmFibGVkXG4iKTsKKwkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsICJ0YW9zX2dldF9sdXggZGV2aWNlIGlzIG5vdCBlbmFibGVkXG4iKTsKIAkJcmV0ID0gLUVCVVNZIDsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAotCXJldCA9IHRhb3NfaTJjX3JlYWQoY2xpZW50LCAoVFNMMjU4WF9DTURfUkVHKSwgJmJ1ZlswXSwgMSk7CisJcmV0ID0gdGFvc19pMmNfcmVhZChjaGlwLT5jbGllbnQsIChUU0wyNThYX0NNRF9SRUcpLCAmYnVmWzBdLCAxKTsKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInRhb3NfZ2V0X2x1eCBmYWlsZWQgdG8gcmVhZCBDTURfUkVHXG4iKTsKKwkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsICJ0YW9zX2dldF9sdXggZmFpbGVkIHRvIHJlYWQgQ01EX1JFR1xuIik7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAJLyogaXMgZGF0YSBuZXcgJiB2YWxpZCAqLwogCWlmICghKGJ1ZlswXSAmIFRTTDI1OFhfU1RBX0FEQ19JTlRSKSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgInRhb3NfZ2V0X2x1eCBkYXRhIG5vdCB2YWxpZFxuIik7CisJCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LCAidGFvc19nZXRfbHV4IGRhdGEgbm90IHZhbGlkXG4iKTsKIAkJcmV0ID0gY2hpcC0+YWxzX2N1cl9pbmZvLmx1eDsgLyogcmV0dXJuIExBU1QgVkFMVUUgKi8KIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKIAkJaW50IHJlZyA9IFRTTDI1OFhfQ01EX1JFRyB8IChUU0wyNThYX0FMU19DSEFOMExPICsgaSk7Ci0JCXJldCA9IHRhb3NfaTJjX3JlYWQoY2xpZW50LCByZWcsICZidWZbaV0sIDEpOworCQlyZXQgPSB0YW9zX2kyY19yZWFkKGNoaXAtPmNsaWVudCwgcmVnLCAmYnVmW2ldLCAxKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAidGFvc19nZXRfbHV4IGZhaWxlZCB0byByZWFkIgorCQkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsICJ0YW9zX2dldF9sdXggZmFpbGVkIHRvIHJlYWQiCiAJCQkJIiByZWdpc3RlciAleFxuIiwgcmVnKTsKIAkJCWdvdG8gb3V0X3VubG9jazsKIAkJfQpAQCAtMjM5LDExICsyMzgsMTIgQEAKIAogCS8qIGNsZWFyIHN0YXR1cywgcmVhbGx5IGludGVycnVwdCBzdGF0dXMgKGludGVycnVwdHMgYXJlIG9mZiksIGJ1dAogCSAqIHdlIHVzZSB0aGUgYml0IGFueXdheSAtIGRvbid0IGZvcmdldCAweDgwIC0gdGhpcyBpcyBhIGNvbW1hbmQqLwotCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlKGNsaWVudCwKLQkoVFNMMjU4WF9DTURfUkVHIHwgVFNMMjU4WF9DTURfU1BMX0ZOIHwgVFNMMjU4WF9DTURfQUxTX0lOVF9DTFIpKTsKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZShjaGlwLT5jbGllbnQsCisJCQkJICAgKFRTTDI1OFhfQ01EX1JFRyB8IFRTTDI1OFhfQ01EX1NQTF9GTiB8CisJCQkJICAgIFRTTDI1OFhfQ01EX0FMU19JTlRfQ0xSKSk7CiAKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsCiAJCQkidGFvc19pMmNfd3JpdGVfY29tbWFuZCBmYWlsZWQgaW4gdGFvc19nZXRfbHV4LCBlcnIgPSAlZFxuIiwKIAkJCXJldCk7CiAJCWdvdG8gb3V0X3VubG9jazsgLyogaGF2ZSBubyBkYXRhLCBzbyByZXR1cm4gZmFpbHVyZSAqLwpAQCAtMjg1LDcgKzI4NSw3IEBACiAKIAkvKiBub3RlOiBsdXggaXMgMzEgYml0IG1heCBhdCB0aGlzIHBvaW50ICovCiAJaWYgKGNoMWx1eCA+IGNoMGx1eCkgewotCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIk5vIERhdGEgLSBSZXR1cm4gbGFzdCB2YWx1ZVxuIik7CisJCWRldl9kYmcoJmNoaXAtPmNsaWVudC0+ZGV2LCAiTm8gRGF0YSAtIFJldHVybiBsYXN0IHZhbHVlXG4iKTsKIAkJcmV0ID0gY2hpcC0+YWxzX2N1cl9pbmZvLmx1eCA9IDA7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CkBAIC0zMTksNTQgKzMxOSw1NiBAQAogICogdG8gZGVyaXZlIGFjdHVhbCBsdXgpLgogICogUmV0dXJuIHVwZGF0ZWQgZ2Fpbl90cmltIHZhbHVlLgogICovCi1pbnQgdGFvc19hbHNfY2FsaWJyYXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IHRhb3NfYWxzX2NhbGlicmF0ZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewotCXN0cnVjdCB0c2wyNTgzX2NoaXAgKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgdHNsMjU4M19jaGlwICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAl1OCByZWdfdmFsOwogCXVuc2lnbmVkIGludCBnYWluX3RyaW1fdmFsOwogCWludCByZXQ7CiAJaW50IGx1eF92YWw7CiAKLQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZShjbGllbnQsIChUU0wyNThYX0NNRF9SRUcgfCBUU0wyNThYX0NOVFJMKSk7CisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2hpcC0+Y2xpZW50LAorCQkJCSAgIChUU0wyNThYX0NNRF9SRUcgfCBUU0wyNThYX0NOVFJMKSk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LAogCQkJInRhb3NfYWxzX2NhbGlicmF0ZSBmYWlsZWQgdG8gcmVhY2ggdGhlIENOVFJMIHJlZ2lzdGVyLCByZXQ9JWRcbiIsCiAJCQlyZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJlZ192YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlKGNsaWVudCk7CisJcmVnX3ZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGUoY2hpcC0+Y2xpZW50KTsKIAlpZiAoKHJlZ192YWwgJiAoVFNMMjU4WF9DTlRMX0FEQ19FTkJMIHwgVFNMMjU4WF9DTlRMX1BXUl9PTikpCiAJCQkhPSAoVFNMMjU4WF9DTlRMX0FEQ19FTkJMIHwgVFNMMjU4WF9DTlRMX1BXUl9PTikpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LAogCQkJInRhb3NfYWxzX2NhbGlicmF0ZSBmYWlsZWQ6IGRldmljZSBub3QgcG93ZXJlZCBvbiB3aXRoIEFEQyBlbmFibGVkXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlKGNsaWVudCwgKFRTTDI1OFhfQ01EX1JFRyB8IFRTTDI1OFhfQ05UUkwpKTsKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZShjaGlwLT5jbGllbnQsCisJCQkJICAgKFRTTDI1OFhfQ01EX1JFRyB8IFRTTDI1OFhfQ05UUkwpKTsKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsCiAJCQkidGFvc19hbHNfY2FsaWJyYXRlIGZhaWxlZCB0byByZWFjaCB0aGUgU1RBVFVTIHJlZ2lzdGVyLCByZXQ9JWRcbiIsCiAJCQlyZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KLQlyZWdfdmFsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZShjbGllbnQpOworCXJlZ192YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlKGNoaXAtPmNsaWVudCk7CiAKIAlpZiAoKHJlZ192YWwgJiBUU0wyNThYX1NUQV9BRENfVkFMSUQpICE9IFRTTDI1OFhfU1RBX0FEQ19WQUxJRCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsCiAJCQkidGFvc19hbHNfY2FsaWJyYXRlIGZhaWxlZDogU1RBVFVTIC0gQURDIG5vdCB2YWxpZC5cbiIpOwogCQlyZXR1cm4gLUVOT0RBVEE7CiAJfQotCWx1eF92YWwgPSB0YW9zX2dldF9sdXgoY2xpZW50KTsKKwlsdXhfdmFsID0gdGFvc19nZXRfbHV4KGluZGlvX2Rldik7CiAJaWYgKGx1eF92YWwgPCAwKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAidGFvc19hbHNfY2FsaWJyYXRlIGZhaWxlZCB0byBnZXQgbHV4XG4iKTsKKwkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsICJ0YW9zX2Fsc19jYWxpYnJhdGUgZmFpbGVkIHRvIGdldCBsdXhcbiIpOwogCQlyZXR1cm4gbHV4X3ZhbDsKIAl9CiAJZ2Fpbl90cmltX3ZhbCA9ICh1bnNpZ25lZCBpbnQpICgoKGNoaXAtPnRhb3Nfc2V0dGluZ3MuYWxzX2NhbF90YXJnZXQpCiAJCQkqIGNoaXAtPnRhb3Nfc2V0dGluZ3MuYWxzX2dhaW5fdHJpbSkgLyBsdXhfdmFsKTsKIAogCWlmICgoZ2Fpbl90cmltX3ZhbCA8IDI1MCkgfHwgKGdhaW5fdHJpbV92YWwgPiA0MDAwKSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsCiAJCQkidGFvc19hbHNfY2FsaWJyYXRlIGZhaWxlZDogdHJpbV92YWwgb2YgJWQgaXMgb3V0IG9mIHJhbmdlXG4iLAogCQkJZ2Fpbl90cmltX3ZhbCk7CiAJCXJldHVybiAtRU5PREFUQTsKQEAgLTM4MCwyMSArMzgyLDIxIEBACiAgKiBUdXJuIHRoZSBkZXZpY2Ugb24uCiAgKiBDb25maWd1cmF0aW9uIG11c3QgYmUgc2V0IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCiAgKi8KLXN0YXRpYyBpbnQgdGFvc19jaGlwX29uKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgaW50IHRhb3NfY2hpcF9vbihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCWludCBpOwotCWludCByZXQgPSAwOworCWludCByZXQ7CiAJdTggKnVQOwogCXU4IHV0bXA7CiAJaW50IGFsc19jb3VudDsKIAlpbnQgYWxzX3RpbWU7Ci0Jc3RydWN0IHRzbDI1ODNfY2hpcCAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCB0c2wyNTgzX2NoaXAgKmNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCiAJLyogYW5kIG1ha2Ugc3VyZSB3ZSdyZSBub3QgYWxyZWFkeSBvbiAqLwogCWlmIChjaGlwLT50YW9zX2NoaXBfc3RhdHVzID09IFRTTDI1OFhfQ0hJUF9XT1JLSU5HKSB7CiAJCS8qIGlmIGZvcmNpbmcgYSByZWdpc3RlciB1cGRhdGUgLSB0dXJuIG9mZiwgdGhlbiBvbiAqLwotCQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJkZXZpY2UgaXMgYWxyZWFkeSBlbmFibGVkXG4iKTsKLQkJcmV0dXJuICAgLUVJTlZBTDsKKwkJZGV2X2luZm8oJmNoaXAtPmNsaWVudC0+ZGV2LCAiZGV2aWNlIGlzIGFscmVhZHkgZW5hYmxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIGRldGVybWluZSBhbHMgaW50ZWdyYXRpb24gcmVnc3RlciAqLwpAQCAtNDE2LDIwICs0MTgsMjEgQEAKIAkvKiBUU0wyNTh4IFNwZWNpZmljIHBvd2VyLW9uIC8gYWRjIGVuYWJsZSBzZXF1ZW5jZQogCSAqIFBvd2VyIG9uIHRoZSBkZXZpY2UgMXN0LiAqLwogCXV0bXAgPSBUU0wyNThYX0NOVExfUFdSX09OOwotCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LAotCQlUU0wyNThYX0NNRF9SRUcgfCBUU0wyNThYX0NOVFJMLCB1dG1wKTsKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwKKwkJCQkJVFNMMjU4WF9DTURfUkVHIHwgVFNMMjU4WF9DTlRSTCwgdXRtcCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ0YW9zX2NoaXBfb24gZmFpbGVkIG9uIENOVFJMIHJlZy5cbiIpOworCQlkZXZfZXJyKCZjaGlwLT5jbGllbnQtPmRldiwgInRhb3NfY2hpcF9vbiBmYWlsZWQgb24gQ05UUkwgcmVnLlxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKIAkvKiBVc2UgdGhlIGZvbGxvd2luZyBzaGFkb3cgY29weSBmb3Igb3VyIGRlbGF5IGJlZm9yZSBlbmFibGluZyBBREMuCiAJICogV3JpdGUgYWxsIHRoZSByZWdpc3RlcnMuICovCiAJZm9yIChpID0gMCwgdVAgPSBjaGlwLT50YW9zX2NvbmZpZzsgaSA8IFRTTDI1OFhfUkVHX01BWDsgaSsrKSB7Ci0JCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBUU0wyNThYX0NNRF9SRUcgKyBpLAorCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwKKwkJCQkJCVRTTDI1OFhfQ01EX1JFRyArIGksCiAJCQkJCQkqdVArKyk7CiAJCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LAogCQkJCSJ0YW9zX2NoaXBfb24gZmFpbGVkIG9uIHJlZyAlZC5cbiIsIGkpOwogCQkJcmV0dXJuIC0xOwogCQl9CkBAIC00MzksMTAgKzQ0MiwxMSBAQAogCS8qIE5PVyBlbmFibGUgdGhlIEFEQwogCSAqIGluaXRpYWxpemUgdGhlIGRlc2lyZWQgbW9kZSBvZiBvcGVyYXRpb24gKi8KIAl1dG1wID0gVFNMMjU4WF9DTlRMX1BXUl9PTiB8IFRTTDI1OFhfQ05UTF9BRENfRU5CTDsKLQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgVFNMMjU4WF9DTURfUkVHIHwgVFNMMjU4WF9DTlRSTCwKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwKKwkJCQkJVFNMMjU4WF9DTURfUkVHIHwgVFNMMjU4WF9DTlRSTCwKIAkJCQkJdXRtcCk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ0YW9zX2NoaXBfb24gZmFpbGVkIG9uIDJuZCBDVFJMIHJlZy5cbiIpOworCQlkZXZfZXJyKCZjaGlwLT5jbGllbnQtPmRldiwgInRhb3NfY2hpcF9vbiBmYWlsZWQgb24gMm5kIENUUkwgcmVnLlxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAJY2hpcC0+dGFvc19jaGlwX3N0YXR1cyA9IFRTTDI1OFhfQ0hJUF9XT1JLSU5HOwpAQCAtNDUwLDMzICs0NTQsMjYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHRhb3NfY2hpcF9vZmYoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgdGFvc19jaGlwX29mZihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewotCXN0cnVjdCB0c2wyNTgzX2NoaXAgKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgdHNsMjU4M19jaGlwICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlpbnQgcmV0OwogCiAJLyogdHVybiBkZXZpY2Ugb2ZmICovCiAJY2hpcC0+dGFvc19jaGlwX3N0YXR1cyA9IFRTTDI1OFhfQ0hJUF9TVVNQRU5ERUQ7Ci0JcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIFRTTDI1OFhfQ01EX1JFRyB8IFRTTDI1OFhfQ05UUkwsCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjaGlwLT5jbGllbnQsCisJCQkJCVRTTDI1OFhfQ01EX1JFRyB8IFRTTDI1OFhfQ05UUkwsCiAJCQkJCTB4MDApOwogCXJldHVybiByZXQ7CiB9CiAKIC8qIFN5c2ZzIEludGVyZmFjZSBGdW5jdGlvbnMgKi8KLXN0YXRpYyBzc2l6ZV90IHRhb3NfZGV2aWNlX2lkKHN0cnVjdCBkZXZpY2UgKmRldiwKLXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCB0c2wyNTgzX2NoaXAgKmNoaXAgPSBpbmRpb19kZXYtPmRldl9kYXRhOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGNoaXAtPmNsaWVudC0+bmFtZSk7Ci19CiAKIHN0YXRpYyBzc2l6ZV90IHRhb3NfcG93ZXJfc3RhdGVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IHRzbDI1ODNfY2hpcCAqY2hpcCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJc3RydWN0IHRzbDI1ODNfY2hpcCAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+dGFvc19jaGlwX3N0YXR1cyk7CiB9CkBAIC00ODUsMTYgKzQ4MiwxNSBAQAogCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCB0c2wyNTgzX2NoaXAgKmNoaXAgPSBpbmRpb19kZXYtPmRldl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgdmFsdWU7CiAKIAlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmdmFsdWUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICh2YWx1ZSA9PSAwKQotCQl0YW9zX2NoaXBfb2ZmKGNoaXAtPmNsaWVudCk7CisJCXRhb3NfY2hpcF9vZmYoaW5kaW9fZGV2KTsKIAllbHNlCi0JCXRhb3NfY2hpcF9vbihjaGlwLT5jbGllbnQpOworCQl0YW9zX2NoaXBfb24oaW5kaW9fZGV2KTsKIAogCXJldHVybiBsZW47CiB9CkBAIC01MDMsNyArNDk5LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgdHNsMjU4M19jaGlwICpjaGlwID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKwlzdHJ1Y3QgdHNsMjU4M19jaGlwICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAljaGFyIGdhaW5bNF0gPSB7MH07CiAKIAlzd2l0Y2ggKGNoaXAtPnRhb3Nfc2V0dGluZ3MuYWxzX2dhaW4pIHsKQEAgLTUyOCw3ICs1MjQsNyBAQAogCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCB0c2wyNTgzX2NoaXAgKmNoaXAgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCXN0cnVjdCB0c2wyNTgzX2NoaXAgKmNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCXVuc2lnbmVkIGxvbmcgdmFsdWU7CiAKIAlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmdmFsdWUpKQpAQCAtNTY1LDcgKzU2MSw3IEBACiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IHRzbDI1ODNfY2hpcCAqY2hpcCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJc3RydWN0IHRzbDI1ODNfY2hpcCAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY2hpcC0+dGFvc19zZXR0aW5ncy5hbHNfdGltZSk7CiB9CkBAIC01NzQsNyArNTcwLDcgQEAKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgdHNsMjU4M19jaGlwICpjaGlwID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKwlzdHJ1Y3QgdHNsMjU4M19jaGlwICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAl1bnNpZ25lZCBsb25nIHZhbHVlOwogCiAJaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnZhbHVlKSkKQEAgLTU4Niw3ICs1ODIsNyBAQAogCWlmICh2YWx1ZSAlIDUwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCSBjaGlwLT50YW9zX3NldHRpbmdzLmFsc190aW1lID0gdmFsdWU7CisJY2hpcC0+dGFvc19zZXR0aW5ncy5hbHNfdGltZSA9IHZhbHVlOwogCiAJcmV0dXJuIGxlbjsKIH0KQEAgLTYwMiw3ICs1OTgsNyBAQAogCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCB0c2wyNTgzX2NoaXAgKmNoaXAgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCXN0cnVjdCB0c2wyNTgzX2NoaXAgKmNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPnRhb3Nfc2V0dGluZ3MuYWxzX2dhaW5fdHJpbSk7CiB9CkBAIC02MTEsNyArNjA3LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgdHNsMjU4M19jaGlwICpjaGlwID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKKwlzdHJ1Y3QgdHNsMjU4M19jaGlwICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAl1bnNpZ25lZCBsb25nIHZhbHVlOwogCiAJaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnZhbHVlKSkKQEAgLTYyNyw3ICs2MjMsNyBAQAogCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCB0c2wyNTgzX2NoaXAgKmNoaXAgPSBpbmRpb19kZXYtPmRldl9kYXRhOworCXN0cnVjdCB0c2wyNTgzX2NoaXAgKmNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGNoaXAtPnRhb3Nfc2V0dGluZ3MuYWxzX2NhbF90YXJnZXQpOwogfQpAQCAtNjM2LDcgKzYzMiw3IEBACiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IHRzbDI1ODNfY2hpcCAqY2hpcCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CisJc3RydWN0IHRzbDI1ODNfY2hpcCAqY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJdW5zaWduZWQgbG9uZyB2YWx1ZTsKIAogCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDAsICZ2YWx1ZSkpCkBAIC02NTEsMjcgKzY0NywyNiBAQAogc3RhdGljIHNzaXplX3QgdGFvc19sdXhfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCWNoYXIgKmJ1ZikKIHsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IHRzbDI1ODNfY2hpcCAqY2hpcCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7Ci0JaW50IGx1eDsKKwlpbnQgcmV0OwogCi0JbHV4ID0gdGFvc19nZXRfbHV4KGNoaXAtPmNsaWVudCk7CisJcmV0ID0gdGFvc19nZXRfbHV4KGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBsdXgpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCByZXQpOwogfQogCiBzdGF0aWMgc3NpemVfdCB0YW9zX2RvX2NhbGlicmF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IHRzbDI1ODNfY2hpcCAqY2hpcCA9IGluZGlvX2Rldi0+ZGV2X2RhdGE7CiAJdW5zaWduZWQgbG9uZyB2YWx1ZTsKIAogCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDAsICZ2YWx1ZSkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKHZhbHVlID09IDEpCi0JCXRhb3NfYWxzX2NhbGlicmF0ZShjaGlwLT5jbGllbnQpOworCQl0YW9zX2Fsc19jYWxpYnJhdGUoaW5kaW9fZGV2KTsKIAogCXJldHVybiBsZW47CiB9CkBAIC03MDMsOCArNjk4LDggQEAKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgdHNsMjU4M19jaGlwICpjaGlwID0gaW5kaW9fZGV2LT5kZXZfZGF0YTsKLQlpbnQgdmFsdWVbQVJSQVlfU0laRSh0YW9zX2RldmljZV9sdXgpXTsKKwlzdHJ1Y3QgdHNsMjU4M19jaGlwICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgdmFsdWVbQVJSQVlfU0laRSh0YW9zX2RldmljZV9sdXgpKjMgKyAxXTsKIAlpbnQgbjsKIAogCWdldF9vcHRpb25zKGJ1ZiwgQVJSQVlfU0laRSh2YWx1ZSksIHZhbHVlKTsKQEAgLTcyNSwxOCArNzIwLDE3IEBACiAJfQogCiAJaWYgKGNoaXAtPnRhb3NfY2hpcF9zdGF0dXMgPT0gVFNMMjU4WF9DSElQX1dPUktJTkcpCi0JCXRhb3NfY2hpcF9vZmYoY2hpcC0+Y2xpZW50KTsKKwkJdGFvc19jaGlwX29mZihpbmRpb19kZXYpOwogCiAJLyogWmVybyBvdXQgdGhlIHRhYmxlICovCiAJbWVtc2V0KHRhb3NfZGV2aWNlX2x1eCwgMCwgc2l6ZW9mKHRhb3NfZGV2aWNlX2x1eCkpOwogCW1lbWNweSh0YW9zX2RldmljZV9sdXgsICZ2YWx1ZVsxXSwgKHZhbHVlWzBdICogNCkpOwogCi0JdGFvc19jaGlwX29uKGNoaXAtPmNsaWVudCk7CisJdGFvc19jaGlwX29uKGluZGlvX2Rldik7CiAKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgREVWSUNFX0FUVFIobmFtZSwgU19JUlVHTywgdGFvc19kZXZpY2VfaWQsIE5VTEwpOwogc3RhdGljIERFVklDRV9BVFRSKHBvd2VyX3N0YXRlLCBTX0lSVUdPIHwgU19JV1VTUiwKIAkJdGFvc19wb3dlcl9zdGF0ZV9zaG93LCB0YW9zX3Bvd2VyX3N0YXRlX3N0b3JlKTsKIApAQCAtNzYyLDcgKzc1Niw2IEBACiAJCXRhb3NfbHV4dGFibGVfc2hvdywgdGFvc19sdXh0YWJsZV9zdG9yZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpzeXNmc19hdHRyc19jdHJsW10gPSB7Ci0JJmRldl9hdHRyX25hbWUuYXR0ciwKIAkmZGV2X2F0dHJfcG93ZXJfc3RhdGUuYXR0ciwKIAkmZGV2X2F0dHJfaWxsdW1pbmFuY2UwX2NhbGlic2NhbGUuYXR0ciwJCQkvKiBHYWluICAqLwogCSZkZXZfYXR0cl9pbGx1bWluYW5jZTBfY2FsaWJzY2FsZV9hdmFpbGFibGUuYXR0ciwKQEAgLTc5OCw5ICs3OTEsMTAgQEAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHRhb3NfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudHAsCiAJCSAgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZHApCiB7Ci0JaW50IGksIHJldCA9IDA7CisJaW50IGksIHJldDsKIAl1bnNpZ25lZCBjaGFyIGJ1ZltUU0wyNThYX01BWF9ERVZJQ0VfUkVHU107Ci0Jc3RhdGljIHN0cnVjdCB0c2wyNTgzX2NoaXAgKmNoaXA7CisJc3RydWN0IHRzbDI1ODNfY2hpcCAqY2hpcDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnRwLT5hZGFwdGVyLAogCQlJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKSB7CkBAIC04MTAsMTIgKzgwNCwxNSBAQAogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCi0JY2hpcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0c2wyNTgzX2NoaXApLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNoaXApCi0JCXJldHVybiAtRU5PTUVNOwotCisJaW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZShzaXplb2YoKmNoaXApKTsKKwlpZiAoaW5kaW9fZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZGV2X2VycigmY2xpZW50cC0+ZGV2LCAiaWlvIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsMTsKKwl9CisJY2hpcCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJY2hpcC0+Y2xpZW50ID0gY2xpZW50cDsKLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50cCwgY2hpcCk7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudHAsIGluZGlvX2Rldik7CiAKIAltdXRleF9pbml0KCZjaGlwLT5hbHNfbXV0ZXgpOwogCWNoaXAtPnRhb3NfY2hpcF9zdGF0dXMgPSBUU0wyNThYX0NISVBfVU5LTk9XTjsKQEAgLTgyNywxNCArODI0LDE0IEBACiAJCWlmIChyZXQgPCAwKSB7CiAJCQlkZXZfZXJyKCZjbGllbnRwLT5kZXYsICJpMmNfc21idXNfd3JpdGVfYnl0ZXMoKSB0byBjbWQgIgogCQkJCSJyZWcgZmFpbGVkIGluIHRhb3NfcHJvYmUoKSwgZXJyID0gJWRcbiIsIHJldCk7Ci0JCQlnb3RvIGZhaWwxOworCQkJZ290byBmYWlsMjsKIAkJfQogCQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlKGNsaWVudHApOwogCQlpZiAocmV0IDwgMCkgewogCQkJZGV2X2VycigmY2xpZW50cC0+ZGV2LCAiaTJjX3NtYnVzX3JlYWRfYnl0ZSBmcm9tICIKIAkJCQkicmVnIGZhaWxlZCBpbiB0YW9zX3Byb2JlKCksIGVyciA9ICVkXG4iLCByZXQpOwogCi0JCQlnb3RvIGZhaWwxOworCQkJZ290byBmYWlsMjsKIAkJfQogCQlidWZbaV0gPSByZXQ7CiAJfQpAQCAtODQyLDU4ICs4MzksNTAgQEAKIAlpZiAoIXRhb3NfdHNsMjU4eF9kZXZpY2UoYnVmKSkgewogCQlkZXZfaW5mbygmY2xpZW50cC0+ZGV2LCAiaTJjIGRldmljZSBmb3VuZCBidXQgZG9lcyBub3QgbWF0Y2ggIgogCQkJImV4cGVjdGVkIGlkIGluIHRhb3NfcHJvYmUoKVxuIik7Ci0JCWdvdG8gZmFpbDE7CisJCWdvdG8gZmFpbDI7CiAJfQogCiAJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50cCwgKFRTTDI1OFhfQ01EX1JFRyB8IFRTTDI1OFhfQ05UUkwpKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZjbGllbnRwLT5kZXYsICJpMmNfc21idXNfd3JpdGVfYnl0ZSgpIHRvIGNtZCByZWcgIgogCQkJImZhaWxlZCBpbiB0YW9zX3Byb2JlKCksIGVyciA9ICVkXG4iLCByZXQpOwotCQlnb3RvIGZhaWwxOworCQlnb3RvIGZhaWwyOwogCX0KIAotCWNoaXAtPmlpb19kZXYgPSBpaW9fYWxsb2NhdGVfZGV2aWNlKDApOwotCWlmICghY2hpcC0+aWlvX2RldikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlkZXZfZXJyKCZjbGllbnRwLT5kZXYsICJpaW8gYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwotCQlnb3RvIGZhaWwxOwotCX0KLQotCWNoaXAtPmlpb19kZXYtPmluZm8gPSAmdHNsMjU4M19pbmZvOwotCWNoaXAtPmlpb19kZXYtPmRldi5wYXJlbnQgPSAmY2xpZW50cC0+ZGV2OwotCWNoaXAtPmlpb19kZXYtPmRldl9kYXRhID0gKHZvaWQgKikoY2hpcCk7Ci0JY2hpcC0+aWlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKLQlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGNoaXAtPmlpb19kZXYpOworCWluZGlvX2Rldi0+aW5mbyA9ICZ0c2wyNTgzX2luZm87CisJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudHAtPmRldjsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJaW5kaW9fZGV2LT5uYW1lID0gY2hpcC0+Y2xpZW50LT5uYW1lOworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJmNsaWVudHAtPmRldiwgImlpbyByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKLQkJZ290byBmYWlsMTsKKwkJZ290byBmYWlsMjsKIAl9CiAKIAkvKiBMb2FkIHVwIHRoZSBWMiBkZWZhdWx0cyAodGhlc2UgYXJlIGhhcmQgY29kZWQgZGVmYXVsdHMgZm9yIG5vdykgKi8KIAl0YW9zX2RlZmF1bHRzKGNoaXApOwogCiAJLyogTWFrZSBzdXJlIHRoZSBjaGlwIGlzIG9uICovCi0JdGFvc19jaGlwX29uKGNsaWVudHApOworCXRhb3NfY2hpcF9vbihpbmRpb19kZXYpOwogCiAJZGV2X2luZm8oJmNsaWVudHAtPmRldiwgIkxpZ2h0IHNlbnNvciBmb3VuZC5cbiIpOwotCiAJcmV0dXJuIDA7Ci0KIGZhaWwxOgotCWtmcmVlKGNoaXApOwotCisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CitmYWlsMjoKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHRhb3Nfc3VzcGVuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7Ci0Jc3RydWN0IHRzbDI1ODNfY2hpcCAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgdHNsMjU4M19jaGlwICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlpbnQgcmV0ID0gMDsKIAogCW11dGV4X2xvY2soJmNoaXAtPmFsc19tdXRleCk7CiAKIAlpZiAoY2hpcC0+dGFvc19jaGlwX3N0YXR1cyA9PSBUU0wyNThYX0NISVBfV09SS0lORykgewotCQlyZXQgPSB0YW9zX2NoaXBfb2ZmKGNsaWVudCk7CisJCXJldCA9IHRhb3NfY2hpcF9vZmYoaW5kaW9fZGV2KTsKIAkJY2hpcC0+dGFvc19jaGlwX3N0YXR1cyA9IFRTTDI1OFhfQ0hJUF9TVVNQRU5ERUQ7CiAJfQogCkBAIC05MDMsMTMgKzg5MiwxNCBAQAogCiBzdGF0aWMgaW50IHRhb3NfcmVzdW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7Ci0Jc3RydWN0IHRzbDI1ODNfY2hpcCAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgdHNsMjU4M19jaGlwICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlpbnQgcmV0ID0gMDsKIAogCW11dGV4X2xvY2soJmNoaXAtPmFsc19tdXRleCk7CiAKIAlpZiAoY2hpcC0+dGFvc19jaGlwX3N0YXR1cyA9PSBUU0wyNThYX0NISVBfU1VTUEVOREVEKQotCQlyZXQgPSB0YW9zX2NoaXBfb24oY2xpZW50KTsKKwkJcmV0ID0gdGFvc19jaGlwX29uKGluZGlvX2Rldik7CiAKIAltdXRleF91bmxvY2soJmNoaXAtPmFsc19tdXRleCk7CiAJcmV0dXJuIHJldDsKQEAgLTkxOCwxMSArOTA4LDkgQEAKIAogc3RhdGljIGludCBfX2RldmV4aXQgdGFvc19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKLQlzdHJ1Y3QgdHNsMjU4M19jaGlwICpjaGlwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaWlvX2RldmljZV91bnJlZ2lzdGVyKGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpKTsKKwlpaW9fZnJlZV9kZXZpY2UoaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCkpOwogCi0JaWlvX2RldmljZV91bnJlZ2lzdGVyKGNoaXAtPmlpb19kZXYpOwotCi0Ja2ZyZWUoY2hpcCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21hZ25ldG9tZXRlci9LY29uZmlnCmluZGV4IDgxYjU3OWQuLjcyMmM0ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tYWduZXRvbWV0ZXIvS2NvbmZpZwpAQCAtMSwxMSArMSwxMiBAQAogIwogIyBNYWduZXRvbWV0ZXIgc2Vuc29ycwogIwotY29tbWVudCAiTWFnbmV0b21ldGVyIHNlbnNvcnMiCittZW51ICJNYWduZXRvbWV0ZXIgc2Vuc29ycyIKIAogY29uZmlnIFNFTlNPUlNfQUs4OTc1CiAJdHJpc3RhdGUgIkFzYWhpIEthc2VpIEFLODk3NSAzLUF4aXMgTWFnbmV0b21ldGVyIgogCWRlcGVuZHMgb24gSTJDCisJZGVwZW5kcyBvbiBHRU5FUklDX0dQSU8KIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQXNhaGkgS2FzZWkgQUs4OTc1IDMtQXhpcwogCSAgTWFnbmV0b21ldGVyLgpAQCAtMjMsMyArMjQsNCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgaG1jNTg0MwogCitlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21hZ25ldG9tZXRlci9hazg5NzUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL2FrODk3NS5jCmluZGV4IDMzOTE5ZTguLjhiMDE3MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL2FrODk3NS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL2FrODk3NS5jCkBAIC0zMSw4ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCi0jaW5jbHVkZSAibWFnbmV0LmgiCi0KKyNpbmNsdWRlICIuLi9zeXNmcy5oIgogLyoKICAqIFJlZ2lzdGVyIGRlZmluaXRpb25zLCBhcyB3ZWxsIGFzIHZhcmlvdXMgc2hpZnRzIGFuZCBtYXNrcyB0byBnZXQgYXQgdGhlCiAgKiBpbmRpdmlkdWFsIGZpZWxkcyBvZiB0aGUgcmVnaXN0ZXJzLgpAQCAtOTMsMzggKzkyLDI4IEBACiAJc3RydWN0IG11dGV4CQlsb2NrOwogCXU4CQkJYXNhWzNdOwogCWxvbmcJCQlyYXdfdG9fZ2F1c3NbM107Ci0JdW5zaWduZWQgbG9uZwkJbW9kZTsKKwlib29sCQkJbW9kZTsKIAl1OAkJCXJlZ19jYWNoZVtBSzg5NzVfTUFYX1JFR1NdOwogCWludAkJCWVvY19ncGlvOwogCWludAkJCWVvY19pcnE7CiB9OwogCitzdGF0aWMgY29uc3QgaW50IGFrODk3NV9pbmRleF90b19yZWdbXSA9IHsKKwlBSzg5NzVfUkVHX0hYTCwgQUs4OTc1X1JFR19IWUwsIEFLODk3NV9SRUdfSFpMLAorfTsKKwogLyoKICAqIEhlbHBlciBmdW5jdGlvbiB0byB3cml0ZSB0byB0aGUgSTJDIGRldmljZSdzIHJlZ2lzdGVycy4KICAqLwogc3RhdGljIGludCBhazg5NzVfd3JpdGVfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJICAgICB1OCByZWcsIHU4IHZhbCwgdTggbWFzaywgdTggc2hpZnQpCiB7Ci0JdTggcmVndmFsOwotCXN0cnVjdCBpMmNfbXNnIG1zZzsKLQl1OCB3X2RhdGFbMl07Ci0JaW50IHJldCA9IDA7Ci0KIAlzdHJ1Y3QgYWs4OTc1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1OCByZWd2YWw7CisJaW50IHJldDsKIAotCXJlZ3ZhbCA9IGRhdGEtPnJlZ19jYWNoZVtyZWddOwotCXJlZ3ZhbCAmPSB+bWFzazsKLQlyZWd2YWwgfD0gdmFsIDw8IHNoaWZ0OwotCi0Jd19kYXRhWzBdID0gcmVnOwotCXdfZGF0YVsxXSA9IHJlZ3ZhbDsKLQotCW1zZy5hZGRyID0gY2xpZW50LT5hZGRyOwotCW1zZy5mbGFncyA9IDA7Ci0JbXNnLmxlbiA9IDI7Ci0JbXNnLmJ1ZiA9IHdfZGF0YTsKLQotCXJldCA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsICZtc2csIDEpOworCXJlZ3ZhbCA9IChkYXRhLT5yZWdfY2FjaGVbcmVnXSAmIH5tYXNrKSB8ICh2YWwgPDwgc2hpZnQpOworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHJlZ3ZhbCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJXcml0ZSB0byBkZXZpY2UgZmFpbHMgc3RhdHVzICV4XG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwpAQCAtMTQwLDIxICsxMjksMjAgQEAKIHN0YXRpYyBpbnQgYWs4OTc1X3JlYWRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJICAgIHU4IHJlZywgdTggbGVuZ3RoLCB1OCAqYnVmZmVyKQogewotCXN0cnVjdCBpMmNfbXNnIG1zZ1syXTsKLQl1OCB3X2RhdGFbMl07CiAJaW50IHJldDsKLQotCXdfZGF0YVswXSA9IHJlZzsKLQotCW1zZ1swXS5hZGRyID0gY2xpZW50LT5hZGRyOwotCW1zZ1swXS5mbGFncyA9IEkyQ19NX05PU1RBUlQ7CS8qIHNldCByZXBlYXRlZCBzdGFydCBhbmQgd3JpdGUgKi8KLQltc2dbMF0ubGVuID0gMTsKLQltc2dbMF0uYnVmID0gd19kYXRhOwotCi0JbXNnWzFdLmFkZHIgPSBjbGllbnQtPmFkZHI7Ci0JbXNnWzFdLmZsYWdzID0gSTJDX01fUkQ7Ci0JbXNnWzFdLmxlbiA9IGxlbmd0aDsKLQltc2dbMV0uYnVmID0gYnVmZmVyOworCXN0cnVjdCBpMmNfbXNnIG1zZ1syXSA9IHsKKwkJeworCQkJLmFkZHIgPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MgPSBJMkNfTV9OT1NUQVJULAorCQkJLmxlbiA9IDEsCisJCQkuYnVmID0gJnJlZywKKwkJfSwgeworCQkJLmFkZHIgPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJCS5sZW4gPSBsZW5ndGgsCisJCQkuYnVmID0gYnVmZmVyLAorCQl9CisJfTsKIAogCXJldCA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFkYXB0ZXIsIG1zZywgMik7CiAJaWYgKHJldCA8IDApIHsKQEAgLTIwNCw3NSArMTkyLDkgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQkvKiBQcmVjYWxjdWxhdGUgc2NhbGUgZmFjdG9yIGZvciBlYWNoIGF4aXMgYW5kCi0JICAgc3RvcmUgaW4gdGhlIGRldmljZSBkYXRhLiAqLwotCWRhdGEtPnJhd190b19nYXVzc1swXSA9ICgoZGF0YS0+YXNhWzBdICsgMTI4KSAqIDMwKSA+PiA4OwotCWRhdGEtPnJhd190b19nYXVzc1sxXSA9ICgoZGF0YS0+YXNhWzFdICsgMTI4KSAqIDMwKSA+PiA4OwotCWRhdGEtPnJhd190b19nYXVzc1syXSA9ICgoZGF0YS0+YXNhWzJdICsgMTI4KSAqIDMwKSA+PiA4OwotCi0JcmV0dXJuIDA7Ci19Ci0KIC8qCi0gKiBTaG93cyB0aGUgZGV2aWNlJ3MgbW9kZS4gIDAgPSBvZmYsIDEgPSBvbi4KLSAqLwotc3RhdGljIHNzaXplX3Qgc2hvd19tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCi0JCQkgY2hhciAqYnVmKQotewotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWs4OTc1X2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWx1XG4iLCBkYXRhLT5tb2RlKTsKLX0KLQotLyoKLSAqIFNldHMgdGhlIGRldmljZSdzIG1vZGUuICAwID0gb2ZmLCAxID0gb24uICBUaGUgZGV2aWNlJ3MgbW9kZSBtdXN0IGJlIG9uCi0gKiBmb3IgdGhlIG1hZ24gcmF3IGF0dHJpYnV0ZXMgdG8gYmUgYXZhaWxhYmxlLgotICovCi1zdGF0aWMgc3NpemVfdCBzdG9yZV9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCi0JCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWs4OTc1X2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7Ci0JdW5zaWduZWQgbG9uZyBvdmFsOwotCWludCByZXQ7Ci0KLQkvKiBDb252ZXJ0IG1vZGUgc3RyaW5nIGFuZCBkbyBzb21lIGJhc2ljIHNhbml0eSBjaGVja2luZyBvbiBpdC4KLQkgICBvbmx5IDAgb3IgMSBhcmUgdmFsaWQuICovCi0JaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZvdmFsKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAob3ZhbCA+IDEpIHsKLQkJZGV2X2VycihkZXYsICJtb2RlIHZhbHVlIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKLQotCS8qIFdyaXRlIHRoZSBtb2RlIHRvIHRoZSBkZXZpY2UuICovCi0JaWYgKGRhdGEtPm1vZGUgIT0gb3ZhbCkgewotCQlyZXQgPSBhazg5NzVfd3JpdGVfZGF0YShjbGllbnQsCi0JCQkJCUFLODk3NV9SRUdfQ05UTCwKLQkJCQkJKHU4KW92YWwsCi0JCQkJCUFLODk3NV9SRUdfQ05UTF9NT0RFX01BU0ssCi0JCQkJCUFLODk3NV9SRUdfQ05UTF9NT0RFX1NISUZUKTsKLQotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJFcnJvciBpbiBzZXR0aW5nIG1vZGVcbiIpOwotCQkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJZGF0YS0+bW9kZSA9IG92YWw7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotLyoKLSAqIEVtaXRzIHRoZSBzY2FsZSBmYWN0b3IgdG8gYnJpbmcgdGhlIHJhdyB2YWx1ZSBpbnRvIEdhdXNzIHVuaXRzLgorICogUHJlY2FsY3VsYXRlIHNjYWxlIGZhY3RvciAoaW4gR2F1c3MgdW5pdHMpIGZvciBlYWNoIGF4aXMgYW5kCisgKiBzdG9yZSBpbiB0aGUgZGV2aWNlIGRhdGEuCiAgKgogICogVGhpcyBzY2FsZSBmYWN0b3IgaXMgYXhpcy1kZXBlbmRlbnQsIGFuZCBpcyBkZXJpdmVkIGZyb20gMyBjYWxpYnJhdGlvbgogICogZmFjdG9ycyBBU0EoeCksIEFTQSh5KSwgYW5kIEFTQSh6KS4KQEAgLTMwNSwxNCArMjI3LDY1IEBACiAgKiBTaW5jZSBBU0EgZG9lc24ndCBjaGFuZ2UsIHdlIGNhY2hlIHRoZSByZXN1bHRhbnQgc2NhbGUgZmFjdG9yIGludG8gdGhlCiAgKiBkZXZpY2UgY29udGV4dCBpbiBhazg5NzVfc2V0dXAoKS4KICAqLwotc3RhdGljIHNzaXplX3Qgc2hvd19zY2FsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAotCQkJICBjaGFyICpidWYpCisJZGF0YS0+cmF3X3RvX2dhdXNzWzBdID0gKChkYXRhLT5hc2FbMF0gKyAxMjgpICogMzApID4+IDg7CisJZGF0YS0+cmF3X3RvX2dhdXNzWzFdID0gKChkYXRhLT5hc2FbMV0gKyAxMjgpICogMzApID4+IDg7CisJZGF0YS0+cmF3X3RvX2dhdXNzWzJdID0gKChkYXRhLT5hc2FbMl0gKyAxMjgpICogMzApID4+IDg7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNob3dzIHRoZSBkZXZpY2UncyBtb2RlLiAgMCA9IG9mZiwgMSA9IG9uLgorICovCitzdGF0aWMgc3NpemVfdCBzaG93X21vZGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCSBjaGFyICpidWYpCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBhazg5NzVfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0Jc3RydWN0IGlpb19kZXZfYXR0ciAqdGhpc19hdHRyID0gdG9faWlvX2Rldl9hdHRyKGRldmF0dHIpOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWxkXG4iLCBkYXRhLT5yYXdfdG9fZ2F1c3NbdGhpc19hdHRyLT5hZGRyZXNzXSk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGRhdGEtPm1vZGUpOworfQorCisvKgorICogU2V0cyB0aGUgZGV2aWNlJ3MgbW9kZS4gIDAgPSBvZmYsIDEgPSBvbi4gIFRoZSBkZXZpY2UncyBtb2RlIG11c3QgYmUgb24KKyAqIGZvciB0aGUgbWFnbiByYXcgYXR0cmlidXRlcyB0byBiZSBhdmFpbGFibGUuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHN0b3JlX21vZGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBhazg5NzVfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKKwlib29sIHZhbHVlOworCWludCByZXQ7CisKKwkvKiBDb252ZXJ0IG1vZGUgc3RyaW5nIGFuZCBkbyBzb21lIGJhc2ljIHNhbml0eSBjaGVja2luZyBvbiBpdC4KKwkgICBvbmx5IDAgb3IgMSBhcmUgdmFsaWQuICovCisJcmV0ID0gc3RydG9ib29sKGJ1ZiwgJnZhbHVlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCisJLyogV3JpdGUgdGhlIG1vZGUgdG8gdGhlIGRldmljZS4gKi8KKwlpZiAoZGF0YS0+bW9kZSAhPSB2YWx1ZSkgeworCQlyZXQgPSBhazg5NzVfd3JpdGVfZGF0YShjbGllbnQsCisJCQkJCUFLODk3NV9SRUdfQ05UTCwKKwkJCQkJKHU4KXZhbHVlLAorCQkJCQlBSzg5NzVfUkVHX0NOVExfTU9ERV9NQVNLLAorCQkJCQlBSzg5NzVfUkVHX0NOVExfTU9ERV9TSElGVCk7CisKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRXJyb3IgaW4gc2V0dGluZyBtb2RlXG4iKTsKKwkJCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWRhdGEtPm1vZGUgPSB2YWx1ZTsKKwl9CisKKwltdXRleF91bmxvY2soJmRhdGEtPmxvY2spOworCisJcmV0dXJuIGNvdW50OwogfQogCiBzdGF0aWMgaW50IHdhaXRfY29udmVyc2lvbl9jb21wbGV0ZV9ncGlvKHN0cnVjdCBhazg5NzVfZGF0YSAqZGF0YSkKQEAgLTM3MSwxMyArMzQ0LDEwIEBACiAvKgogICogRW1pdHMgdGhlIHJhdyBmbHV4IHZhbHVlIGZvciB0aGUgeCwgeSwgb3IgeiBheGlzLgogICovCi1zdGF0aWMgc3NpemVfdCBzaG93X3JhdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAotCQkJY2hhciAqYnVmKQorc3RhdGljIGludCBhazg5NzVfcmVhZF9heGlzKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIGludCBpbmRleCwgaW50ICp2YWwpCiB7Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBhazg5NzVfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGRhdGEtPmNsaWVudDsKLQlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoZGV2YXR0cik7CiAJdTE2IG1lYXNfcmVnOwogCXMxNiByYXc7CiAJdTggcmVhZF9zdGF0dXM7CkBAIC00MDMsNyArMzczLDcgQEAKIAl9CiAKIAkvKiBXYWl0IGZvciB0aGUgY29udmVyc2lvbiB0byBjb21wbGV0ZS4gKi8KLQlpZiAoZGF0YS0+ZW9jX2dwaW8pCisJaWYgKGdwaW9faXNfdmFsaWQoZGF0YS0+ZW9jX2dwaW8pKQogCQlyZXQgPSB3YWl0X2NvbnZlcnNpb25fY29tcGxldGVfZ3BpbyhkYXRhKTsKIAllbHNlCiAJCXJldCA9IHdhaXRfY29udmVyc2lvbl9jb21wbGV0ZV9wb2xsZWQoZGF0YSk7CkBAIC00MjksNyArMzk5LDggQEAKIAogCS8qIFJlYWQgdGhlIGZsdXggdmFsdWUgZnJvbSB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIKIAkgICAodGhlIHJlZ2lzdGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgaWlvIGRldmljZSBhdHRyaWJ1dGVzKS4gKi8KLQlyZXQgPSBhazg5NzVfcmVhZF9kYXRhKGNsaWVudCwgdGhpc19hdHRyLT5hZGRyZXNzLCAyLCAodTggKikmbWVhc19yZWcpOworCXJldCA9IGFrODk3NV9yZWFkX2RhdGEoY2xpZW50LCBhazg5NzVfaW5kZXhfdG9fcmVnW2luZGV4XSwKKwkJCSAgICAgICAyLCAodTggKikmbWVhc19yZWcpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiUmVhZCBheGlzIGRhdGEgZmFpbHNcbiIpOwogCQlnb3RvIGV4aXQ7CkBAIC00NDIsMzAgKzQxMyw0OCBAQAogCiAJLyogQ2xhbXAgdG8gdmFsaWQgcmFuZ2UuICovCiAJcmF3ID0gY2xhbXBfdChzMTYsIHJhdywgLTQwOTYsIDQwOTUpOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHJhdyk7CisJKnZhbCA9IHJhdzsKKwlyZXR1cm4gSUlPX1ZBTF9JTlQ7CiAKIGV4aXQ6CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IGFrODk3NV9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sCisJCQkgICBpbnQgKnZhbCwgaW50ICp2YWwyLAorCQkJICAgbG9uZyBtYXNrKQoreworCXN0cnVjdCBhazg5NzVfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIDA6CisJCXJldHVybiBhazg5NzVfcmVhZF9heGlzKGluZGlvX2RldiwgY2hhbi0+YWRkcmVzcywgdmFsKTsKKwljYXNlICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0VQQVJBVEUpOgorCQkqdmFsID0gZGF0YS0+cmF3X3RvX2dhdXNzW2NoYW4tPmFkZHJlc3NdOworCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCisjZGVmaW5lIEFLODk3NV9DSEFOTkVMKGF4aXMsIGluZGV4KQkJCQkJXAorCXsJCQkJCQkJCVwKKwkJLnR5cGUgPSBJSU9fTUFHTiwJCQkJCVwKKwkJLm1vZGlmaWVkID0gMSwJCQkJCQlcCisJCS5jaGFubmVsMiA9IElJT19NT0RfIyNheGlzLAkJCQlcCisJCS5pbmZvX21hc2sgPSAoMSA8PCBJSU9fQ0hBTl9JTkZPX1NDQUxFX1NFUEFSQVRFKSwJXAorCQkuYWRkcmVzcyA9IGluZGV4LAkJCQkJXAorCX0KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIGFrODk3NV9jaGFubmVsc1tdID0geworCUFLODk3NV9DSEFOTkVMKFgsIDApLCBBSzg5NzVfQ0hBTk5FTChZLCAxKSwgQUs4OTc1X0NIQU5ORUwoWiwgMiksCit9OworCiBzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG1vZGUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X21vZGUsIHN0b3JlX21vZGUsIDApOwotc3RhdGljIElJT19ERVZfQVRUUl9NQUdOX1hfU0NBTEUoU19JUlVHTywgc2hvd19zY2FsZSwgTlVMTCwgMCk7Ci1zdGF0aWMgSUlPX0RFVl9BVFRSX01BR05fWV9TQ0FMRShTX0lSVUdPLCBzaG93X3NjYWxlLCBOVUxMLCAxKTsKLXN0YXRpYyBJSU9fREVWX0FUVFJfTUFHTl9aX1NDQUxFKFNfSVJVR08sIHNob3dfc2NhbGUsIE5VTEwsIDIpOwotc3RhdGljIElJT19ERVZfQVRUUl9NQUdOX1goc2hvd19yYXcsIEFLODk3NV9SRUdfSFhMKTsKLXN0YXRpYyBJSU9fREVWX0FUVFJfTUFHTl9ZKHNob3dfcmF3LCBBSzg5NzVfUkVHX0hZTCk7Ci1zdGF0aWMgSUlPX0RFVl9BVFRSX01BR05fWihzaG93X3JhdywgQUs4OTc1X1JFR19IWkwpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWs4OTc1X2F0dHJbXSA9IHsKIAkmaWlvX2Rldl9hdHRyX21vZGUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX21hZ25feF9zY2FsZS5kZXZfYXR0ci5hdHRyLAotCSZpaW9fZGV2X2F0dHJfbWFnbl95X3NjYWxlLmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9tYWduX3pfc2NhbGUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX21hZ25feF9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX21hZ25feV9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX21hZ25fel9yYXcuZGV2X2F0dHIuYXR0ciwKIAlOVUxMCiB9OwogCkBAIC00NzUsNiArNDY0LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBhazg5NzVfaW5mbyA9IHsKIAkuYXR0cnMgPSAmYWs4OTc1X2F0dHJfZ3JvdXAsCisJLnJlYWRfcmF3ID0gJmFrODk3NV9yZWFkX3JhdywKIAkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAogfTsKIApAQCAtNDg3LDExICs0NzcsMTQgQEAKIAlpbnQgZXJyOwogCiAJLyogR3JhYiBhbmQgc2V0IHVwIHRoZSBzdXBwbGllZCBHUElPLiAqLwotCWVvY19ncGlvID0gaXJxX3RvX2dwaW8oY2xpZW50LT5pcnEpOworCWlmIChjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhID09IE5VTEwpCisJCWVvY19ncGlvID0gLTE7CisJZWxzZQorCQllb2NfZ3BpbyA9ICooaW50ICopKGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGEpOwogCiAJLyogV2UgbWF5IG5vdCBoYXZlIGEgR1BJTyBiYXNlZCBJUlEgdG8gc2NhbiwgdGhhdCBpcyBmaW5lLCB3ZSB3aWxsCiAJICAgcG9sbCBpZiBzbyAqLwotCWlmIChlb2NfZ3BpbyA+IDApIHsKKwlpZiAoZ3Bpb19pc192YWxpZChlb2NfZ3BpbykpIHsKIAkJZXJyID0gZ3Bpb19yZXF1ZXN0KGVvY19ncGlvLCAiYWtfODk3NSIpOwogCQlpZiAoZXJyIDwgMCkgewogCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCkBAIC01MDcsOCArNTAwLDcgQEAKIAkJCQkJCWVvY19ncGlvLCBlcnIpOwogCQkJZ290byBleGl0X2dwaW87CiAJCX0KLQl9IGVsc2UKLQkJZW9jX2dwaW8gPSAwOwkvKiBObyBHUElPIGF2YWlsYWJsZSAqLworCX0KIAogCS8qIFJlZ2lzdGVyIHdpdGggSUlPICovCiAJaW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZShzaXplb2YoKmRhdGEpKTsKQEAgLTUyMSw3ICs1MTMsNyBAQAogCWVyciA9IGFrODk3NV9zZXR1cChjbGllbnQpOwogCWlmIChlcnIgPCAwKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiQUs4OTc1IGluaXRpYWxpemF0aW9uIGZhaWxzXG4iKTsKLQkJZ290byBleGl0X2dwaW87CisJCWdvdG8gZXhpdF9mcmVlX2lpbzsKIAl9CiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBpbmRpb19kZXYpOwpAQCAtNTMwLDYgKzUyMiw4IEBACiAJZGF0YS0+ZW9jX2lycSA9IGNsaWVudC0+aXJxOwogCWRhdGEtPmVvY19ncGlvID0gZW9jX2dwaW87CiAJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OworCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBhazg5NzVfY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGFrODk3NV9jaGFubmVscyk7CiAJaW5kaW9fZGV2LT5pbmZvID0gJmFrODk3NV9pbmZvOwogCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKIApAQCAtNTQyLDcgKzUzNiw3IEBACiBleGl0X2ZyZWVfaWlvOgogCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogZXhpdF9ncGlvOgotCWlmIChlb2NfZ3BpbykKKwlpZiAoZ3Bpb19pc192YWxpZChlb2NfZ3BpbykpCiAJCWdwaW9fZnJlZShlb2NfZ3Bpbyk7CiBleGl0OgogCXJldHVybiBlcnI7CkBAIC01NTIsMTMgKzU0NiwxMyBAQAogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlzdHJ1Y3QgYWs4OTc1X2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCWludCBlb2NfZ3BpbyA9IGRhdGEtPmVvY19ncGlvOwogCiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiAKLQlpZiAoZW9jX2dwaW8pCi0JCWdwaW9fZnJlZShlb2NfZ3Bpbyk7CisJaWYgKGdwaW9faXNfdmFsaWQoZGF0YS0+ZW9jX2dwaW8pKQorCQlncGlvX2ZyZWUoZGF0YS0+ZW9jX2dwaW8pOworCisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL2htYzU4NDMuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL2htYzU4NDMuYwppbmRleCBiNDRjMjczYS4uZmM5ZWU5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9tYWduZXRvbWV0ZXIvaG1jNTg0My5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL2htYzU4NDMuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vc3lzZnMuaCIKLSNpbmNsdWRlICJtYWduZXQuaCIKIAogI2RlZmluZSBITUM1ODQzX0kyQ19BRERSRVNTCQkJMHgxRQogCkBAIC02Miw5ICs2MSw5IEBACiAvKgogICogRGV2aWNlIHN0YXR1cwogICovCi0jZGVmaW5lCURBVEFfUkVBRFkgIAkJCQkweDAxCi0jZGVmaW5lCURBVEFfT1VUUFVUX0xPQ0sgIAkJCTB4MDIKLSNkZWZpbmUJVk9MVEFHRV9SRUdVTEFUT1JfRU5BQkxFRCAgCQkweDA0CisjZGVmaW5lCURBVEFfUkVBRFkJCQkJMHgwMQorI2RlZmluZQlEQVRBX09VVFBVVF9MT0NLCQkJMHgwMgorI2RlZmluZQlWT0xUQUdFX1JFR1VMQVRPUl9FTkFCTEVECQkweDA0CiAKIC8qCiAgKiBNb2RlIHJlZ2lzdGVyIGNvbmZpZ3VyYXRpb24KQEAgLTg5LDIyICs4OCwxNiBAQAogLyoKICAqIERldmljZSBDb25maWd1dHJhdGlvbgogICovCi0jZGVmaW5lCUNPTkZfTk9STUFMICAJCQkJMHgwMAorI2RlZmluZQlDT05GX05PUk1BTAkJCQkweDAwCiAjZGVmaW5lCUNPTkZfUE9TSVRJVkVfQklBUwkJCTB4MDEKICNkZWZpbmUJQ09ORl9ORUdBVElWRV9CSUFTCQkJMHgwMgogI2RlZmluZQlDT05GX05PVF9VU0VECQkJCTB4MDMKICNkZWZpbmUJTUVBU19DT05GX01BU0sJCQkJMHgwMwogCi1zdGF0aWMgY29uc3QgY2hhciAqcmVndmFsX3RvX3NjYWxlW10gPSB7Ci0JIjAuMDAwMDAwNjE3MyIsCi0JIjAuMDAwMDAwNzY5MiIsCi0JIjAuMDAwMDAxMDMwOSIsCi0JIjAuMDAwMDAxMjgyMSIsCi0JIjAuMDAwMDAxODg2OCIsCi0JIjAuMDAwMDAyMTczOSIsCi0JIjAuMDAwMDAyNTY0MSIsCi0JIjAuMDAwMDAzNTcxNCIsCitzdGF0aWMgaW50IGhtYzU4NDNfcmVndmFsX3RvX25hbm9zY2FsZVtdID0geworCTYxNzMsIDc2OTIsIDEwMzA5LCAxMjgyMSwgMTg4NjgsIDIxNzM5LCAyNTY0MSwgMzU3MTQKIH07CisKIHN0YXRpYyBjb25zdCBpbnQgcmVndmFsX3RvX2lucHV0X2ZpZWxkX21nW10gPSB7CiAJNzAwLAogCTEwMDAsCkBAIC0xMTUsNyArMTA4LDcgQEAKIAk0NTAwLAogCTY1MDAKIH07Ci1zdGF0aWMgY29uc3QgY2hhciAqcmVndmFsX3RvX3NhbXBfZnJlcVtdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCByZWd2YWxfdG9fc2FtcF9mcmVxW10gPSB7CiAJIjAuNSIsCiAJIjEiLAogCSIyIiwKQEAgLTE1MCwzNyArMTQzLDI4IEBACiB9CiAKIC8qIFJldHVybiB0aGUgbWVhc3VyZW1lbnQgdmFsdWUgZnJvbSB0aGUgIHNwZWNpZmllZCBjaGFubmVsICovCi1zdGF0aWMgc3NpemVfdCBobWM1ODQzX3JlYWRfbWVhc3VyZW1lbnQoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQorc3RhdGljIGludCBobWM1ODQzX3JlYWRfbWVhc3VyZW1lbnQoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkgICAgaW50IGFkZHJlc3MsCisJCQkJICAgIGludCAqdmFsKQogewotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChpbmRpb19kZXYtPmRldi5wYXJlbnQpOwotCXMxNiBjb29yZGluYXRlX3ZhbDsKLQlzdHJ1Y3QgaWlvX2Rldl9hdHRyICp0aGlzX2F0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7CiAJc3RydWN0IGhtYzU4NDNfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJczMyIHJlc3VsdDsKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwotCiAJcmVzdWx0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgSE1DNTg0M19TVEFUVVNfUkVHKTsKIAl3aGlsZSAoIShyZXN1bHQgJiBEQVRBX1JFQURZKSkKIAkJcmVzdWx0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgSE1DNTg0M19TVEFUVVNfUkVHKTsKIAotCXJlc3VsdCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHRoaXNfYXR0ci0+YWRkcmVzcyk7CisJcmVzdWx0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgYWRkcmVzcyk7CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKIAlpZiAocmVzdWx0IDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQljb29yZGluYXRlX3ZhbAk9IChzMTYpc3dhYjE2KCh1MTYpcmVzdWx0KTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgY29vcmRpbmF0ZV92YWwpOworCSp2YWwJPSAoczE2KXN3YWIxNigodTE2KXJlc3VsdCk7CisJcmV0dXJuIElJT19WQUxfSU5UOwogfQotc3RhdGljIElJT19ERVZfQVRUUl9NQUdOX1goaG1jNTg0M19yZWFkX21lYXN1cmVtZW50LAotCQlITUM1ODQzX0RBVEFfT1VUX1hfTVNCX1JFRyk7Ci1zdGF0aWMgSUlPX0RFVl9BVFRSX01BR05fWShobWM1ODQzX3JlYWRfbWVhc3VyZW1lbnQsCi0JCUhNQzU4NDNfREFUQV9PVVRfWV9NU0JfUkVHKTsKLXN0YXRpYyBJSU9fREVWX0FUVFJfTUFHTl9aKGhtYzU4NDNfcmVhZF9tZWFzdXJlbWVudCwKLQkJSE1DNTg0M19EQVRBX09VVF9aX01TQl9SRUcpOworCiAKIC8qCiAgKiBGcm9tIHRoZSBkYXRhc2hlZXQKQEAgLTMzNiw3ICszMjAsNyBAQAogCXJlZ192YWwgPSAoZGF0YS0+bWVhc19jb25mKSB8ICAocmF0ZSA8PCBSQVRFX09GRlNFVCk7CiAJaWYgKHJhdGUgPj0gUkFURV9OT1RfVVNFRCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKLQkJCSJUaGlzIGRhdGEgb3V0cHV0IHJhdGUgaXMgbm90IHN1cHBvcnRlZCBcbiIpOworCQkJIlRoaXMgZGF0YSBvdXRwdXQgcmF0ZSBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgSE1DNTg0M19DT05GSUdfUkVHX0EsIHJlZ192YWwpOwpAQCAtNDYxLDM0ICs0NDUsNTIgQEAKIAlyZXR1cm4gY291bnQ7CiAKIH0KLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIobWFnbl9yYW5nZSwKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaW5fbWFnbl9yYW5nZSwKIAkJCVNfSVdVU1IgfCBTX0lSVUdPLAogCQkJc2hvd19yYW5nZSwKIAkJCXNldF9yYW5nZSwKIAkJCUhNQzU4NDNfQ09ORklHX1JFR19CKTsKIAotc3RhdGljIHNzaXplX3Qgc2hvd19zY2FsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCWNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgaG1jNTg0M19yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgIGludCAqdmFsLCBpbnQgKnZhbDIsCisJCQkgICAgbG9uZyBtYXNrKQogewotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgaG1jNTg0M19kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQlyZXR1cm4gc3RybGVuKHN0cmNweShidWYsIHJlZ3ZhbF90b19zY2FsZVtkYXRhLT5yYW5nZV0pKTsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgMDoKKwkJcmV0dXJuIGhtYzU4NDNfcmVhZF9tZWFzdXJlbWVudChpbmRpb19kZXYsCisJCQkJCQljaGFuLT5hZGRyZXNzLAorCQkJCQkJdmFsKTsKKwljYXNlICgxIDw8IElJT19DSEFOX0lORk9fU0NBTEVfU0hBUkVEKToKKwkJKnZhbCA9IDA7CisJCSp2YWwyID0gaG1jNTg0M19yZWd2YWxfdG9fbmFub3NjYWxlW2RhdGEtPnJhbmdlXTsKKwkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTkFOTzsKKwl9OworCXJldHVybiAtRUlOVkFMOwogfQotc3RhdGljIElJT19ERVZJQ0VfQVRUUihtYWduX3NjYWxlLAotCQkJU19JUlVHTywKLQkJCXNob3dfc2NhbGUsCi0JCQlOVUxMICwgMCk7CisKKyNkZWZpbmUgSE1DNTg0M19DSEFOTkVMKGF4aXMsIGFkZCkJCQkJCVwKKwl7CQkJCQkJCQlcCisJCS50eXBlID0gSUlPX01BR04sCQkJCQlcCisJCS5tb2RpZmllZCA9IDEsCQkJCQkJXAorCQkuY2hhbm5lbDIgPSBJSU9fTU9EXyMjYXhpcywJCQkJXAorCQkuaW5mb19tYXNrID0gKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAkJXAorCQkuYWRkcmVzcyA9IGFkZAkJCQkJCVwKKwl9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBobWM1ODQzX2NoYW5uZWxzW10gPSB7CisJSE1DNTg0M19DSEFOTkVMKFgsIEhNQzU4NDNfREFUQV9PVVRfWF9NU0JfUkVHKSwKKwlITUM1ODQzX0NIQU5ORUwoWSwgSE1DNTg0M19EQVRBX09VVF9ZX01TQl9SRUcpLAorCUhNQzU4NDNfQ0hBTk5FTChaLCBITUM1ODQzX0RBVEFfT1VUX1pfTVNCX1JFRyksCit9OwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaG1jNTg0M19hdHRyaWJ1dGVzW10gPSB7CiAJJmlpb19kZXZfYXR0cl9tZWFzX2NvbmYuZGV2X2F0dHIuYXR0ciwKIAkmaWlvX2Rldl9hdHRyX29wZXJhdGluZ19tb2RlLmRldl9hdHRyLmF0dHIsCiAJJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX21hZ25fcmFuZ2UuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX21hZ25fc2NhbGUuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX21hZ25feF9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX21hZ25feV9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX21hZ25fel9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2Rldl9hdHRyX2luX21hZ25fcmFuZ2UuZGV2X2F0dHIuYXR0ciwKIAkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAogCU5VTEwKIH07CkBAIC01MzAsNiArNTMyLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBobWM1ODQzX2luZm8gPSB7CiAJLmF0dHJzID0gJmhtYzU4NDNfZ3JvdXAsCisJLnJlYWRfcmF3ID0gJmhtYzU4NDNfcmVhZF9yYXcsCiAJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKIH07CiAKQEAgLTU1OCw2ICs1NjEsOSBAQAogCWhtYzU4NDNfaW5pdF9jbGllbnQoY2xpZW50KTsKIAogCWluZGlvX2Rldi0+aW5mbyA9ICZobWM1ODQzX2luZm87CisJaW5kaW9fZGV2LT5uYW1lID0gaWQtPm5hbWU7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGhtYzU4NDNfY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGhtYzU4NDNfY2hhbm5lbHMpOwogCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKIAlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CiAJZXJyID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwpAQCAtNTczLDkgKzU3OSwxMSBAQAogc3RhdGljIGludCBobWM1ODQzX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwogCSAvKiAgc2xlZXAgbW9kZSB0byBzYXZlIHBvd2VyICovCiAJaG1jNTg0M19jb25maWd1cmUoY2xpZW50LCBNT0RFX1NMRUVQKTsKLQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tYWduZXRvbWV0ZXIvbWFnbmV0LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21hZ25ldG9tZXRlci9tYWduZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI2MGViNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21hZ25ldG9tZXRlci9tYWduZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLQotI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCi0KLS8qIE1hZ25ldG9tZXRlciB0eXBlcyBvZiBhdHRyaWJ1dGUgKi8KLQotI2RlZmluZSBJSU9fREVWX0FUVFJfTUFHTl9YX09GRlNFVChfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCVwKLQlJSU9fREVWSUNFX0FUVFIobWFnbl94X29mZnNldCwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQotCi0jZGVmaW5lIElJT19ERVZfQVRUUl9NQUdOX1lfT0ZGU0VUKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJXAotCUlJT19ERVZJQ0VfQVRUUihtYWduX3lfb2Zmc2V0LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX01BR05fWl9PRkZTRVQoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQlcCi0JSUlPX0RFVklDRV9BVFRSKG1hZ25fel9vZmZzZXQsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKLQotI2RlZmluZSBJSU9fREVWX0FUVFJfTUFHTl9YX1NDQUxFKF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikJCVwKLQlJSU9fREVWSUNFX0FUVFIobWFnbl94X3NjYWxlLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX01BR05fWV9TQ0FMRShfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCQlcCi0JSUlPX0RFVklDRV9BVFRSKG1hZ25feV9zY2FsZSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQotCi0jZGVmaW5lIElJT19ERVZfQVRUUl9NQUdOX1pfU0NBTEUoX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyKQkJXAotCUlJT19ERVZJQ0VfQVRUUihtYWduX3pfc2NhbGUsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkcikKLQotI2RlZmluZSBJSU9fREVWX0FUVFJfTUFHTl9YKF9zaG93LCBfYWRkcikJCQkJXAotCUlJT19ERVZJQ0VfQVRUUihtYWduX3hfcmF3LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgX2FkZHIpCi0KLSNkZWZpbmUgSUlPX0RFVl9BVFRSX01BR05fWShfc2hvdywgX2FkZHIpCQkJCVwKLQlJSU9fREVWSUNFX0FUVFIobWFnbl95X3JhdywgU19JUlVHTywgX3Nob3csIE5VTEwsIF9hZGRyKQotCi0jZGVmaW5lIElJT19ERVZfQVRUUl9NQUdOX1ooX3Nob3csIF9hZGRyKQkJCQlcCi0JSUlPX0RFVklDRV9BVFRSKG1hZ25fel9yYXcsIFNfSVJVR08sIF9zaG93LCBOVUxMLCBfYWRkcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvS2NvbmZpZwppbmRleCAxMmUzNmU0Li5kMjkwZDI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9LY29uZmlnCkBAIC0xLDcgKzEsNyBAQAogIwogIyBJSU8gbWV0ZXIgZHJpdmVycyBjb25maWd1cmF0aW9uCiAjCi1jb21tZW50ICJBY3RpdmUgZW5lcmd5IG1ldGVyaW5nIElDIgorbWVudSAiQWN0aXZlIGVuZXJneSBtZXRlcmluZyBJQyIKIAogY29uZmlnIEFERTc3NTMKIAl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURFNzc1My82IFNpbmdsZS1QaGFzZSBNdWx0aWZ1bmN0aW9uIE1ldGVyaW5nIElDIERyaXZlciIKQEAgLTIwLDggKzIwLDggQEAKIGNvbmZpZyBBREU3NzU4CiAJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIEFERTc3NTggUG9seSBQaGFzZSBNdWx0aWZ1bmN0aW9uIEVuZXJneSBNZXRlcmluZyBJQyBEcml2ZXIiCiAJZGVwZW5kcyBvbiBTUEkKLQlzZWxlY3QgSUlPX1RSSUdHRVIgaWYgSUlPX1JJTkdfQlVGRkVSCi0Jc2VsZWN0IElJT19TV19SSU5HIGlmIElJT19SSU5HX0JVRkZFUgorCXNlbGVjdCBJSU9fVFJJR0dFUiBpZiBJSU9fQlVGRkVSCisJc2VsZWN0IElJT19TV19SSU5HIGlmIElJT19CVUZGRVIKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgQURFNzc1OCBQb2x5cGhhc2UKIAkgIE11bHRpZnVuY3Rpb24gRW5lcmd5IE1ldGVyaW5nIElDIHdpdGggUGVyIFBoYXNlIEluZm9ybWF0aW9uIERyaXZlci4KQEAgLTU5LDMgKzU5LDUgQEAKIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWRlNzg1NC1zcGkuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL01ha2VmaWxlCmluZGV4IDBjYzdkNTEuLmRlMzg2M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9NYWtlZmlsZQpAQCAtNiw3ICs2LDcgQEAKIG9iai0kKENPTkZJR19BREU3NzU0KSArPSBhZGU3NzU0Lm8KIAogYWRlNzc1OC15ICAgICAgICAgICAgIDo9IGFkZTc3NThfY29yZS5vCi1hZGU3NzU4LSQoQ09ORklHX0lJT19SSU5HX0JVRkZFUikgKz0gYWRlNzc1OF9yaW5nLm8gYWRlNzc1OF90cmlnZ2VyLm8KK2FkZTc3NTgtJChDT05GSUdfSUlPX0JVRkZFUikgKz0gYWRlNzc1OF9yaW5nLm8gYWRlNzc1OF90cmlnZ2VyLm8KIG9iai0kKENPTkZJR19BREU3NzU4KSArPSBhZGU3NzU4Lm8KIAogb2JqLSQoQ09ORklHX0FERTc3NTkpICs9IGFkZTc3NTkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzUzLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTMuYwppbmRleCA0ZDFiZDQyLi45NDBmZWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTMuYwpAQCAtOCw3ICs4LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC0xNyw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vc3lzZnMuaCIKQEAgLTQ1Myw4ICs0NTMsOCBAQAogfQogCiBzdGF0aWMgSUlPX0RFVl9BVFRSX1RFTVBfUkFXKGFkZTc3NTNfcmVhZF84Yml0KTsKLXN0YXRpYyBJSU9fQ09OU1RfQVRUUih0ZW1wX29mZnNldCwgIi0yNSBDIik7Ci1zdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9zY2FsZSwgIjAuNjcgQyIpOworc3RhdGljIElJT19DT05TVF9BVFRSKGluX3RlbXBfb2Zmc2V0LCAiLTI1IEMiKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihpbl90ZW1wX3NjYWxlLCAiMC42NyBDIik7CiAKIHN0YXRpYyBJSU9fREVWX0FUVFJfU0FNUF9GUkVRKFNfSVdVU1IgfCBTX0lSVUdPLAogCQlhZGU3NzUzX3JlYWRfZnJlcXVlbmN5LApAQCAtNDY1LDkgKzQ2NSw5IEBACiBzdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0FNUF9GUkVRX0FWQUlMKCIyNzkwMCAxNDAwMCA3MDAwIDM1MDAiKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkZTc3NTNfYXR0cmlidXRlc1tdID0gewotCSZpaW9fZGV2X2F0dHJfdGVtcF9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2NvbnN0X2F0dHJfdGVtcF9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2NvbnN0X2F0dHJfdGVtcF9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fdGVtcF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5fdGVtcF9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5fdGVtcF9zY2FsZS5kZXZfYXR0ci5hdHRyLAogCSZpaW9fZGV2X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5LmRldl9hdHRyLmF0dHIsCiAJJmlpb19jb25zdF9hdHRyX3NhbXBsaW5nX2ZyZXF1ZW5jeV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKIAkmaWlvX2Rldl9hdHRyX3Jlc2V0LmRldl9hdHRyLmF0dHIsCkBAIC01MTIsNyArNTEyLDcgQEAKIAogc3RhdGljIGludCBfX2RldmluaXQgYWRlNzc1M19wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCWludCByZXQsIHJlZ2RvbmUgPSAwOworCWludCByZXQ7CiAJc3RydWN0IGFkZTc3NTNfc3RhdGUgKnN0OwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CiAKQEAgLTUzNCwyMiArNTM0LDE5IEBACiAJaW5kaW9fZGV2LT5pbmZvID0gJmFkZTc3NTNfaW5mbzsKIAlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CiAKLQlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcl9mcmVlX2RldjsKLQlyZWdkb25lID0gMTsKLQogCS8qIEdldCB0aGUgZGV2aWNlIGludG8gYSBzYW5lIGluaXRpYWwgc3RhdGUgKi8KIAlyZXQgPSBhZGU3NzUzX2luaXRpYWxfc2V0dXAoaW5kaW9fZGV2KTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3JfZnJlZV9kZXY7CisKIAlyZXR1cm4gMDsKIAogZXJyb3JfZnJlZV9kZXY6Ci0JaWYgKHJlZ2RvbmUpCi0JCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwotCWVsc2UKLQkJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiAKIGVycm9yX3JldDoKIAlyZXR1cm4gcmV0OwpAQCAtNTYxLDEyICs1NTgsMTMgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKIAorCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCiAJcmV0ID0gYWRlNzc1M19zdG9wX2RldmljZSgmKGluZGlvX2Rldi0+ZGV2KSk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfcmV0OwogCi0JaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7Ci0KKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIGVycl9yZXQ6CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1NC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU0LmMKaW5kZXggZjRmODVmZC4uMzNmMGQzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU0LmMKQEAgLTgsNyArOCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpAQCAtMTcsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCkBAIC00NzIsOCArNDcyLDggQEAKIAlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOwogfQogc3RhdGljIElJT19ERVZfQVRUUl9URU1QX1JBVyhhZGU3NzU0X3JlYWRfOGJpdCk7Ci1zdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9vZmZzZXQsICIxMjkgQyIpOwotc3RhdGljIElJT19DT05TVF9BVFRSKHRlbXBfc2NhbGUsICI0IEMiKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihpbl90ZW1wX29mZnNldCwgIjEyOSBDIik7CitzdGF0aWMgSUlPX0NPTlNUX0FUVFIoaW5fdGVtcF9zY2FsZSwgIjQgQyIpOwogCiBzdGF0aWMgSUlPX0RFVl9BVFRSX1NBTVBfRlJFUShTX0lXVVNSIHwgU19JUlVHTywKIAkJYWRlNzc1NF9yZWFkX2ZyZXF1ZW5jeSwKQEAgLTQ4NCw5ICs0ODQsOSBAQAogc3RhdGljIElJT19DT05TVF9BVFRSX1NBTVBfRlJFUV9BVkFJTCgiMjYwMDAgMTMwMDAgNjUwMDAgMzMwMDAiKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmFkZTc3NTRfYXR0cmlidXRlc1tdID0gewotCSZpaW9fZGV2X2F0dHJfdGVtcF9yYXcuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2NvbnN0X2F0dHJfdGVtcF9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2NvbnN0X2F0dHJfdGVtcF9zY2FsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfaW5fdGVtcF9yYXcuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5fdGVtcF9vZmZzZXQuZGV2X2F0dHIuYXR0ciwKKwkmaWlvX2NvbnN0X2F0dHJfaW5fdGVtcF9zY2FsZS5kZXZfYXR0ci5hdHRyLAogCSZpaW9fZGV2X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5LmRldl9hdHRyLmF0dHIsCiAJJmlpb19jb25zdF9hdHRyX3NhbXBsaW5nX2ZyZXF1ZW5jeV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKIAkmaWlvX2Rldl9hdHRyX3Jlc2V0LmRldl9hdHRyLmF0dHIsCkBAIC01MzUsNyArNTM1LDcgQEAKIAogc3RhdGljIGludCBfX2RldmluaXQgYWRlNzc1NF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQogewotCWludCByZXQsIHJlZ2RvbmUgPSAwOworCWludCByZXQ7CiAJc3RydWN0IGFkZTc3NTRfc3RhdGUgKnN0OwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CiAKQEAgLTU1NywyMiArNTU3LDE4IEBACiAJaW5kaW9fZGV2LT5pbmZvID0gJmFkZTc3NTRfaW5mbzsKIAlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CiAKLQlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcl9mcmVlX2RldjsKLQlyZWdkb25lID0gMTsKLQogCS8qIEdldCB0aGUgZGV2aWNlIGludG8gYSBzYW5lIGluaXRpYWwgc3RhdGUgKi8KIAlyZXQgPSBhZGU3NzU0X2luaXRpYWxfc2V0dXAoaW5kaW9fZGV2KTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCiAJcmV0dXJuIDA7CiAKIGVycm9yX2ZyZWVfZGV2OgotCWlmIChyZWdkb25lKQotCQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKLQllbHNlCi0JCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogCiBlcnJvcl9yZXQ6CiAJcmV0dXJuIHJldDsKQEAgLTU4NCwxMSArNTgwLDEyIEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CiAKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIAlyZXQgPSBhZGU3NzU0X3N0b3BfZGV2aWNlKCYoaW5kaW9fZGV2LT5kZXYpKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9yZXQ7CiAKLQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIAogZXJyX3JldDoKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTguaAppbmRleCBmZDc0ZTE1Li5iZGQxYjA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTguaApAQCAtMTIyLDcgKzEyMiw3IEBACiAJdTgJCQkqdHg7CiAJdTgJCQkqcng7CiAJc3RydWN0IG11dGV4CQlidWZfbG9jazsKLQl1MzIJCQlhdmFpbGFibGVfc2Nhbl9tYXNrc1tBRDc3NThfTlVNX1dBVkVTUkNdOworCXVuc2lnbmVkIGxvbmcJCWF2YWlsYWJsZV9zY2FuX21hc2tzW0FENzc1OF9OVU1fV0FWRVNSQ107CiAJc3RydWN0IGlpb19jaGFuX3NwZWMJKmFkZTc3NThfcmluZ19jaGFubmVsczsKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXJpbmdfeGZlcls0XTsKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UJcmluZ19tc2c7CkBAIC0xMzQsNyArMTM0LDcgQEAKIAl1bnNpZ25lZCBjaGFyCQl0eF9idWZbOF07CiAKIH07Ci0jaWZkZWYgQ09ORklHX0lJT19SSU5HX0JVRkZFUgorI2lmZGVmIENPTkZJR19JSU9fQlVGRkVSCiAvKiBBdCB0aGUgbW9tZW50IHRyaWdnZXJzIGFyZSBvbmx5IHVzZWQgZm9yIHJpbmcgYnVmZmVyCiAgKiBmaWxsaW5nLiBUaGlzIG1heSBjaGFuZ2UhCiAgKi8KQEAgLTE1MCw4ICsxNTAsNyBAQAogaW50IGFkZTc3NThfY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CiB2b2lkIGFkZTc3NThfdW5jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKIAotaW50IGFkZTc3NThfaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwotdm9pZCBhZGU3NzU4X3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwordm9pZCBhZGU3NzU4X3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwogaW50IGFkZTc3NThfc2V0X2lycShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKTsKIAogaW50IGFkZTc3NThfc3BpX3dyaXRlX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTE1OSw3ICsxNTgsNyBAQAogaW50IGFkZTc3NThfc3BpX3JlYWRfcmVnXzgoc3RydWN0IGRldmljZSAqZGV2LAogCQl1OCByZWdfYWRkcmVzcywgdTggKnZhbCk7CiAKLSNlbHNlIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKyNlbHNlIC8qIENPTkZJR19JSU9fQlVGRkVSICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhZGU3NzU4X3JlbW92ZV90cmlnZ2VyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CkBAIC0xODAsOSArMTc5LDkgQEAKIHsKIAlyZXR1cm4gMDsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhZGU3NzU4X3VuaW5pdGlhbGl6ZV9yaW5nKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpCitzdGF0aWMgaW5saW5lIHZvaWQgYWRlNzc1OF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogfQotI2VuZGlmIC8qIENPTkZJR19JSU9fUklOR19CVUZGRVIgKi8KKyNlbmRpZiAvKiBDT05GSUdfSUlPX0JVRkZFUiAqLwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfY29yZS5jCmluZGV4IDI5OWI5NTQuLmM1ZGFmYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF9jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X2NvcmUuYwpAQCAtOCw3ICs4LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CkBAIC0xNywxMCArMTYsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKICNpbmNsdWRlICIuLi9zeXNmcy5oIgotI2luY2x1ZGUgIi4uL3JpbmdfZ2VuZXJpYy5oIgorI2luY2x1ZGUgIi4uL2J1ZmZlcl9nZW5lcmljLmgiCiAjaW5jbHVkZSAibWV0ZXIuaCIKICNpbmNsdWRlICJhZGU3NzU4LmgiCiAKQEAgLTU4Myw4ICs1ODMsOCBAQAogfQogCiBzdGF0aWMgSUlPX0RFVl9BVFRSX1RFTVBfUkFXKGFkZTc3NThfcmVhZF84Yml0KTsKLXN0YXRpYyBJSU9fQ09OU1RfQVRUUih0ZW1wX29mZnNldCwgIjEyOSBDIik7Ci1zdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9zY2FsZSwgIjQgQyIpOworc3RhdGljIElJT19DT05TVF9BVFRSKGluX3RlbXBfb2Zmc2V0LCAiMTI5IEMiKTsKK3N0YXRpYyBJSU9fQ09OU1RfQVRUUihpbl90ZW1wX3NjYWxlLCAiNCBDIik7CiAKIHN0YXRpYyBJSU9fREVWX0FUVFJfQVdBVFRIUihhZGU3NzU4X3JlYWRfMTZiaXQsCiAJCUFERTc3NThfQVdBVFRIUik7CkBAIC02MTQsOSArNjE0LDkgQEAKIHN0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQU1QX0ZSRVFfQVZBSUwoIjI2MDQwIDEzMDIwIDY1MTAgMzI1NSIpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRlNzc1OF9hdHRyaWJ1dGVzW10gPSB7Ci0JJmlpb19kZXZfYXR0cl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fY29uc3RfYXR0cl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAotCSZpaW9fY29uc3RfYXR0cl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCiAJJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwKIAkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAogCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKQEAgLTY2Miw3ICs2NjIsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGFkZTc3NThfY2hhbm5lbHNbXSA9IHsKLQlJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsICJyYXciLCAwLCAwLAorCUlJT19DSEFOKElJT19WT0xUQUdFLCAwLCAxLCAwLCAicmF3IiwgMCwgMCwKIAkJKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAogCQlBRDc3NThfV1QoQUQ3NzU4X1BIQVNFX0EsIEFENzc1OF9WT0xUQUdFKSwKIAkJMCwgSUlPX1NUKCdzJywgMjQsIDMyLCAwKSwgMCksCkBAIC02ODIsNyArNjgyLDcgQEAKIAkJKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAogCQlBRDc3NThfV1QoQUQ3NzU4X1BIQVNFX0EsIEFENzc1OF9SRUFDVF9QV1IpLAogCQk0LCBJSU9fU1QoJ3MnLCAyNCwgMzIsIDApLCAwKSwKLQlJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsICJyYXciLCAxLCAwLAorCUlJT19DSEFOKElJT19WT0xUQUdFLCAwLCAxLCAwLCAicmF3IiwgMSwgMCwKIAkJKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAogCQlBRDc3NThfV1QoQUQ3NzU4X1BIQVNFX0IsIEFENzc1OF9WT0xUQUdFKSwKIAkJNSwgSUlPX1NUKCdzJywgMjQsIDMyLCAwKSwgMCksCkBAIC03MDIsNyArNzAyLDcgQEAKIAkJKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAogCQlBRDc3NThfV1QoQUQ3NzU4X1BIQVNFX0IsIEFENzc1OF9SRUFDVF9QV1IpLAogCQk5LCBJSU9fU1QoJ3MnLCAyNCwgMzIsIDApLCAwKSwKLQlJSU9fQ0hBTihJSU9fSU4sIDAsIDEsIDAsICJyYXciLCAyLCAwLAorCUlJT19DSEFOKElJT19WT0xUQUdFLCAwLCAxLCAwLCAicmF3IiwgMiwgMCwKIAkJKDEgPDwgSUlPX0NIQU5fSU5GT19TQ0FMRV9TSEFSRUQpLAogCQlBRDc3NThfV1QoQUQ3NzU4X1BIQVNFX0MsIEFENzc1OF9WT0xUQUdFKSwKIAkJMTAsIElJT19TVCgncycsIDI0LCAzMiwgMCksIDApLApAQCAtNzMyLDcgKzczMiw3IEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGFkZTc3NThfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlpbnQgaSwgcmV0LCByZWdkb25lID0gMDsKKwlpbnQgaSwgcmV0OwogCXN0cnVjdCBhZGU3NzU4X3N0YXRlICpzdDsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZShzaXplb2YoKnN0KSk7CiAKQEAgLTc2Niw3ICs3NjYsNyBAQAogCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKIAogCWZvciAoaSA9IDA7IGkgPCBBRDc3NThfTlVNX1dBVkVTUkM7IGkrKykKLQkJc3QtPmF2YWlsYWJsZV9zY2FuX21hc2tzW2ldID0gMSA8PCBpOworCQlzZXRfYml0KGksICZzdC0+YXZhaWxhYmxlX3NjYW5fbWFza3NbaV0pOwogCiAJaW5kaW9fZGV2LT5hdmFpbGFibGVfc2Nhbl9tYXNrcyA9IHN0LT5hdmFpbGFibGVfc2Nhbl9tYXNrczsKIApAQCAtNzc0LDE0ICs3NzQsOSBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfZnJlZV90eDsKIAotCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7Ci0JcmVnZG9uZSA9IDE7Ci0KLQlyZXQgPSBpaW9fcmluZ19idWZmZXJfcmVnaXN0ZXJfZXgoaW5kaW9fZGV2LT5yaW5nLCAwLAotCQkJCQkgICZhZGU3NzU4X2NoYW5uZWxzWzBdLAotCQkJCQkgIEFSUkFZX1NJWkUoYWRlNzc1OF9jaGFubmVscykpOworCXJldCA9IGlpb19idWZmZXJfcmVnaXN0ZXIoaW5kaW9fZGV2LAorCQkJCSAgJmFkZTc3NThfY2hhbm5lbHNbMF0sCisJCQkJICBBUlJBWV9TSVpFKGFkZTc3NThfY2hhbm5lbHMpKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnNwaS0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHJpbmdcbiIpOwogCQlnb3RvIGVycm9yX3VucmVnX3JpbmdfZnVuY3M7CkBAIC03OTUsMTYgKzc5MCwyMCBAQAogCWlmIChzcGktPmlycSkgewogCQlyZXQgPSBhZGU3NzU4X3Byb2JlX3RyaWdnZXIoaW5kaW9fZGV2KTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gZXJyb3JfcmVtb3ZlX3RyaWdnZXI7CisJCQlnb3RvIGVycm9yX3VuaW5pdGlhbGl6ZV9yaW5nOwogCX0KIAorCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX3JlbW92ZV90cmlnZ2VyOworCiAJcmV0dXJuIDA7CiAKIGVycm9yX3JlbW92ZV90cmlnZ2VyOgotCWlmIChpbmRpb19kZXYtPm1vZGVzICYgSU5ESU9fUklOR19UUklHR0VSRUQpCisJaWYgKGluZGlvX2Rldi0+bW9kZXMgJiBJTkRJT19CVUZGRVJfVFJJR0dFUkVEKQogCQlhZGU3NzU4X3JlbW92ZV90cmlnZ2VyKGluZGlvX2Rldik7CiBlcnJvcl91bmluaXRpYWxpemVfcmluZzoKLQlhZGU3NzU4X3VuaW5pdGlhbGl6ZV9yaW5nKGluZGlvX2Rldi0+cmluZyk7CisJYWRlNzc1OF91bmluaXRpYWxpemVfcmluZyhpbmRpb19kZXYpOwogZXJyb3JfdW5yZWdfcmluZ19mdW5jczoKIAlhZGU3NzU4X3VuY29uZmlndXJlX3JpbmcoaW5kaW9fZGV2KTsKIGVycm9yX2ZyZWVfdHg6CkBAIC04MTIsMTAgKzgxMSw3IEBACiBlcnJvcl9mcmVlX3J4OgogCWtmcmVlKHN0LT5yeCk7CiBlcnJvcl9mcmVlX2RldjoKLQlpZiAocmVnZG9uZSkKLQkJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7Ci0JZWxzZQotCQlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIGVycm9yX3JldDoKIAlyZXR1cm4gcmV0OwogfQpAQCAtODI2LDE4ICs4MjIsMTkgQEAKIAlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCWludCByZXQ7CiAKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIAlyZXQgPSBhZGU3NzU4X3N0b3BfZGV2aWNlKCZpbmRpb19kZXYtPmRldik7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfcmV0OwogCiAJYWRlNzc1OF9yZW1vdmVfdHJpZ2dlcihpbmRpb19kZXYpOwotCWFkZTc3NThfdW5pbml0aWFsaXplX3JpbmcoaW5kaW9fZGV2LT5yaW5nKTsKKwlhZGU3NzU4X3VuaW5pdGlhbGl6ZV9yaW5nKGluZGlvX2Rldik7CiAJYWRlNzc1OF91bmNvbmZpZ3VyZV9yaW5nKGluZGlvX2Rldik7CiAJa2ZyZWUoc3QtPnR4KTsKIAlrZnJlZShzdC0+cngpOwotCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwogCi0JcmV0dXJuIDA7CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CisKIGVycl9yZXQ6CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF9yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfcmluZy5jCmluZGV4IGI4OWI3ZjguLjk5YWRlNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF9yaW5nLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3JpbmcuYwpAQCAtNiwyMyArNiwxNCBAQAogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yLgogICovCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKICNpbmNsdWRlICIuLi9paW8uaCIKLSNpbmNsdWRlICIuLi9zeXNmcy5oIgogI2luY2x1ZGUgIi4uL3Jpbmdfc3cuaCIKLSNpbmNsdWRlICIuLi9hY2NlbC9hY2NlbC5oIgotI2luY2x1ZGUgIi4uL3RyaWdnZXIuaCIKKyNpbmNsdWRlICIuLi90cmlnZ2VyX2NvbnN1bWVyLmgiCiAjaW5jbHVkZSAiYWRlNzc1OC5oIgogCiAvKioKQEAgLTY5LDggKzYwLDggQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBhZGU3NzU4X3RyaWdnZXJfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwKQogewogCXN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZiA9IHA7Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+cmluZzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGYtPmluZGlvX2RldjsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAqcmluZyA9IGluZGlvX2Rldi0+YnVmZmVyOwogCXN0cnVjdCBhZGU3NzU4X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJczY0IGRhdDY0WzJdOwogCXUzMiAqZGF0MzIgPSAodTMyICopZGF0NjQ7CkBAIC0xMDAsMTQgKzkxLDE0IEBACiBzdGF0aWMgaW50IGFkZTc3NThfcmluZ19wcmVlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKIAlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcgPSBpbmRpb19kZXYtPnJpbmc7CisJc3RydWN0IGlpb19idWZmZXIgKnJpbmcgPSBpbmRpb19kZXYtPmJ1ZmZlcjsKIAlzaXplX3QgZF9zaXplOwogCXVuc2lnbmVkIGNoYW5uZWw7CiAKIAlpZiAoIXJpbmctPnNjYW5fY291bnQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JY2hhbm5lbCA9IF9fZmZzKHJpbmctPnNjYW5fbWFzayk7CisJY2hhbm5lbCA9IGZpbmRfZmlyc3RfYml0KHJpbmctPnNjYW5fbWFzaywgaW5kaW9fZGV2LT5tYXNrbGVuZ3RoKTsKIAogCWRfc2l6ZSA9IHN0LT5hZGU3NzU4X3JpbmdfY2hhbm5lbHNbY2hhbm5lbF0uc2Nhbl90eXBlLnN0b3JhZ2ViaXRzIC8gODsKIApAQCAtMTE4LDkgKzEwOSw5IEBACiAJCQlkX3NpemUgKz0gc2l6ZW9mKHM2NCkgLSAoZF9zaXplICUgc2l6ZW9mKHM2NCkpOwogCX0KIAotCWlmIChpbmRpb19kZXYtPnJpbmctPmFjY2Vzcy0+c2V0X2J5dGVzX3Blcl9kYXR1bSkKLQkJaW5kaW9fZGV2LT5yaW5nLT5hY2Nlc3MtPnNldF9ieXRlc19wZXJfZGF0dW0oaW5kaW9fZGV2LT5yaW5nLAotCQkJCQkJCSAgICBkX3NpemUpOworCWlmIChpbmRpb19kZXYtPmJ1ZmZlci0+YWNjZXNzLT5zZXRfYnl0ZXNfcGVyX2RhdHVtKQorCQlpbmRpb19kZXYtPmJ1ZmZlci0+YWNjZXNzLT4KKwkJCXNldF9ieXRlc19wZXJfZGF0dW0oaW5kaW9fZGV2LT5idWZmZXIsIGRfc2l6ZSk7CiAKIAlhZGU3NzU4X3dyaXRlX3dhdmVmb3JtX3R5cGUoJmluZGlvX2Rldi0+ZGV2LAogCQlzdC0+YWRlNzc1OF9yaW5nX2NoYW5uZWxzW2NoYW5uZWxdLmFkZHJlc3MpOwpAQCAtMTI4LDIyICsxMTksMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fcmluZ19zZXR1cF9vcHMgYWRlNzc1OF9yaW5nX3NldHVwX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9zZXR1cF9vcHMgYWRlNzc1OF9yaW5nX3NldHVwX29wcyA9IHsKIAkucHJlZW5hYmxlID0gJmFkZTc3NThfcmluZ19wcmVlbmFibGUsCi0JLnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3Bvc3RlbmFibGUsCi0JLnByZWRpc2FibGUgPSAmaWlvX3RyaWdnZXJlZF9yaW5nX3ByZWRpc2FibGUsCisJLnBvc3RlbmFibGUgPSAmaWlvX3RyaWdnZXJlZF9idWZmZXJfcG9zdGVuYWJsZSwKKwkucHJlZGlzYWJsZSA9ICZpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wcmVkaXNhYmxlLAogfTsKIAogdm9pZCBhZGU3NzU4X3VuY29uZmlndXJlX3Jpbmcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKLQkvKiBlbnN1cmUgdGhhdCB0aGUgdHJpZ2dlciBoYXMgYmVlbiBkZXRhY2hlZCAqLwotCWlmIChpbmRpb19kZXYtPnRyaWcpIHsKLQkJaWlvX3B1dF90cmlnZ2VyKGluZGlvX2Rldi0+dHJpZyk7Ci0JCWlpb190cmlnZ2VyX2RldHRhY2hfcG9sbF9mdW5jKGluZGlvX2Rldi0+dHJpZywKLQkJCQkJICAgICAgaW5kaW9fZGV2LT5wb2xsZnVuYyk7Ci0JfQogCWlpb19kZWFsbG9jX3BvbGxmdW5jKGluZGlvX2Rldi0+cG9sbGZ1bmMpOwotCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+cmluZyk7CisJaWlvX3N3X3JiX2ZyZWUoaW5kaW9fZGV2LT5idWZmZXIpOwogfQogCiBpbnQgYWRlNzc1OF9jb25maWd1cmVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQpAQCAtMTUxLDE2ICsxMzYsMTYgQEAKIAlzdHJ1Y3QgYWRlNzc1OF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCWludCByZXQgPSAwOwogCi0JaW5kaW9fZGV2LT5yaW5nID0gaWlvX3N3X3JiX2FsbG9jYXRlKGluZGlvX2Rldik7Ci0JaWYgKCFpbmRpb19kZXYtPnJpbmcpIHsKKwlpbmRpb19kZXYtPmJ1ZmZlciA9IGlpb19zd19yYl9hbGxvY2F0ZShpbmRpb19kZXYpOworCWlmICghaW5kaW9fZGV2LT5idWZmZXIpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKIAkvKiBFZmZlY3RpdmVseSBzZWxlY3QgdGhlIHJpbmcgYnVmZmVyIGltcGxlbWVudGF0aW9uICovCi0JaW5kaW9fZGV2LT5yaW5nLT5hY2Nlc3MgPSAmcmluZ19zd19hY2Nlc3NfZnVuY3M7Ci0JaW5kaW9fZGV2LT5yaW5nLT5zZXR1cF9vcHMgPSAmYWRlNzc1OF9yaW5nX3NldHVwX29wczsKLQlpbmRpb19kZXYtPnJpbmctPm93bmVyID0gVEhJU19NT0RVTEU7CisJaW5kaW9fZGV2LT5idWZmZXItPmFjY2VzcyA9ICZyaW5nX3N3X2FjY2Vzc19mdW5jczsKKwlpbmRpb19kZXYtPmJ1ZmZlci0+c2V0dXBfb3BzID0gJmFkZTc3NThfcmluZ19zZXR1cF9vcHM7CisJaW5kaW9fZGV2LT5idWZmZXItPm93bmVyID0gVEhJU19NT0RVTEU7CiAKIAlpbmRpb19kZXYtPnBvbGxmdW5jID0gaWlvX2FsbG9jX3BvbGxmdW5jKCZpaW9fcG9sbGZ1bmNfc3RvcmVfdGltZSwKIAkJCQkJCSAmYWRlNzc1OF90cmlnZ2VyX2hhbmRsZXIsCkBAIC0xNzMsNyArMTU4LDcgQEAKIAkJZ290byBlcnJvcl9paW9fc3dfcmJfZnJlZTsKIAl9CiAKLQlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX1JJTkdfVFJJR0dFUkVEOworCWluZGlvX2Rldi0+bW9kZXMgfD0gSU5ESU9fQlVGRkVSX1RSSUdHRVJFRDsKIAogCXN0LT50eF9idWZbMF0gPSBBREU3NzU4X1JFQURfUkVHKEFERTc3NThfUlNUQVRVUyk7CiAJc3QtPnR4X2J1ZlsxXSA9IDA7CkBAIC0yMTEsMTEgKzE5NiwxMSBAQAogCXJldHVybiAwOwogCiBlcnJvcl9paW9fc3dfcmJfZnJlZToKLQlpaW9fc3dfcmJfZnJlZShpbmRpb19kZXYtPnJpbmcpOworCWlpb19zd19yYl9mcmVlKGluZGlvX2Rldi0+YnVmZmVyKTsKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIGFkZTc3NThfdW5pbml0aWFsaXplX3Jpbmcoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZykKK3ZvaWQgYWRlNzc1OF91bmluaXRpYWxpemVfcmluZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewotCWlpb19yaW5nX2J1ZmZlcl91bnJlZ2lzdGVyKHJpbmcpOworCWlpb19idWZmZXJfdW5yZWdpc3RlcihpbmRpb19kZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3RyaWdnZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF90cmlnZ2VyLmMKaW5kZXggYTVjMzI0OC4uMzkyZGZlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3RyaWdnZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfdHJpZ2dlci5jCkBAIC03LDE2ICs3LDEwIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCi0jaW5jbHVkZSAiLi4vc3lzZnMuaCIKICNpbmNsdWRlICIuLi90cmlnZ2VyLmgiCiAjaW5jbHVkZSAiYWRlNzc1OC5oIgogCkBAIC01Nyw2ICs1MSwxMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb190cmlnZ2VyX29wcyBhZGU3NzU4X3RyaWdnZXJfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5zZXRfdHJpZ2dlcl9zdGF0ZSA9ICZhZGU3NzU4X2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlLAorCS50cnlfcmVlbmFibGUgPSAmYWRlNzc1OF90cmlnX3RyeV9yZWVuLAorfTsKKwogaW50IGFkZTc3NThfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCXN0cnVjdCBhZGU3NzU4X3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CkBAIC03OSwxMCArNzksOCBAQAogCQlnb3RvIGVycm9yX2ZyZWVfdHJpZzsKIAogCXN0LT50cmlnLT5kZXYucGFyZW50ID0gJnN0LT51cy0+ZGV2OwotCXN0LT50cmlnLT5vd25lciA9IFRISVNfTU9EVUxFOworCXN0LT50cmlnLT5vcHMgPSAmYWRlNzc1OF90cmlnZ2VyX29wczsKIAlzdC0+dHJpZy0+cHJpdmF0ZV9kYXRhID0gaW5kaW9fZGV2OwotCXN0LT50cmlnLT5zZXRfdHJpZ2dlcl9zdGF0ZSA9ICZhZGU3NzU4X2RhdGFfcmR5X3RyaWdnZXJfc2V0X3N0YXRlOwotCXN0LT50cmlnLT50cnlfcmVlbmFibGUgPSAmYWRlNzc1OF90cmlnX3RyeV9yZWVuOwogCXJldCA9IGlpb190cmlnZ2VyX3JlZ2lzdGVyKHN0LT50cmlnKTsKIAogCS8qIHNlbGVjdCBkZWZhdWx0IHRyaWdnZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU5LmMKaW5kZXggYTUxYTY0Yy4uYjY5MWYxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU5LmMKQEAgLTgsNyArOCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpAQCAtMTcsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCkBAIC00MTIsOCArNDEyLDggQEAKIAlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOwogfQogc3RhdGljIElJT19ERVZfQVRUUl9URU1QX1JBVyhhZGU3NzU5X3JlYWRfOGJpdCk7Ci1zdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9vZmZzZXQsICI3MCBDIik7Ci1zdGF0aWMgSUlPX0NPTlNUX0FUVFIodGVtcF9zY2FsZSwgIjEgQyIpOworc3RhdGljIElJT19DT05TVF9BVFRSKGluX3RlbXBfb2Zmc2V0LCAiNzAgQyIpOworc3RhdGljIElJT19DT05TVF9BVFRSKGluX3RlbXBfc2NhbGUsICIxIEMiKTsKIAogc3RhdGljIElJT19ERVZfQVRUUl9TQU1QX0ZSRVEoU19JV1VTUiB8IFNfSVJVR08sCiAJCWFkZTc3NTlfcmVhZF9mcmVxdWVuY3ksCkBAIC00MjQsOSArNDI0LDkgQEAKIHN0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQU1QX0ZSRVFfQVZBSUwoIjI3OTAwIDE0MDAwIDcwMDAgMzUwMCIpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWRlNzc1OV9hdHRyaWJ1dGVzW10gPSB7Ci0JJmlpb19kZXZfYXR0cl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAotCSZpaW9fY29uc3RfYXR0cl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAotCSZpaW9fY29uc3RfYXR0cl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9pbl90ZW1wX3Jhdy5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbl90ZW1wX29mZnNldC5kZXZfYXR0ci5hdHRyLAorCSZpaW9fY29uc3RfYXR0cl9pbl90ZW1wX3NjYWxlLmRldl9hdHRyLmF0dHIsCiAJJmlpb19kZXZfYXR0cl9zYW1wbGluZ19mcmVxdWVuY3kuZGV2X2F0dHIuYXR0ciwKIAkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAogCSZpaW9fZGV2X2F0dHJfcmVzZXQuZGV2X2F0dHIuYXR0ciwKQEAgLTQ3OSwxOSArNDc5LDE3IEBACiAJaW5kaW9fZGV2LT5pbmZvID0gJmFkZTc3NTlfaW5mbzsKIAlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CiAKKwkvKiBHZXQgdGhlIGRldmljZSBpbnRvIGEgc2FuZSBpbml0aWFsIHN0YXRlICovCisJcmV0ID0gYWRlNzc1OV9pbml0aWFsX3NldHVwKGluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9mcmVlX2RldjsKKwogCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX2ZyZWVfZGV2OwogCi0JLyogR2V0IHRoZSBkZXZpY2UgaW50byBhIHNhbmUgaW5pdGlhbCBzdGF0ZSAqLwotCXJldCA9IGFkZTc3NTlfaW5pdGlhbF9zZXR1cChpbmRpb19kZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfdW5yZWdfZGV2OwogCXJldHVybiAwOwogCi0KLWVycm9yX3VucmVnX2RldjoKLQlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIGVycm9yX2ZyZWVfZGV2OgogCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogZXJyb3JfcmV0OgpAQCAtNTA0LDExICs1MDIsMTIgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKIAorCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwogCXJldCA9IGFkZTc3NTlfc3RvcF9kZXZpY2UoJihpbmRpb19kZXYtPmRldikpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyX3JldDsKIAotCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogCiBlcnJfcmV0OgogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc4NTQtaTJjLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc4NTQtaTJjLmMKaW5kZXggZGQ3MjM0My4uY2JjYTNmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LWkyYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC1pMmMuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgImFkZTc4NTQuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC1zcGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC1zcGkuYwppbmRleCBlMGQxMDg2Li5jZmEyM2JhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc4NTQtc3BpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LXNwaS5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgImFkZTc4NTQuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LmMKaW5kZXggYjgyNjU5Zi4uNDljMDFjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LmMKQEAgLTgsNyArOCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpAQCAtMTYsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCkBAIC01ODIsNyArNTgyLDcgQEAKIAlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIGVycm9yX2ZyZWVfZGV2OgogCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwotZXJyb3JfcmV0OgorCiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woYWRlNzg1NF9wcm9iZSk7CkBAIC01OTAsNiArNTkwLDcgQEAKIGludCBhZGU3ODU0X3JlbW92ZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL0tjb25maWcKaW5kZXggNmVjZDc5ZS4uNDlmNjllZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvS2NvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgUmVzb2x2ZXIvU3luY2hybyBkcml2ZXJzCiAjCi1jb21tZW50ICJSZXNvbHZlciB0byBkaWdpdGFsIGNvbnZlcnRlcnMiCittZW51ICJSZXNvbHZlciB0byBkaWdpdGFsIGNvbnZlcnRlcnMiCiAKIGNvbmZpZyBBRDJTOTAKIAl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgYWQyczkwIGRyaXZlciIKQEAgLTEwLDkgKzEwLDEwIEBACiAJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgc3BpIHJlc29sdmVyCiAJICB0byBkaWdpdGFsIGNvbnZlcnRlcnMsIGFkMnM5MCwgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB2aWEgc3lzZnMuCiAKLWNvbmZpZyBBRDJTMTIwWAotCXRyaXN0YXRlICJBbmFsb2cgRGV2aWNlcyBhZDJzMTIweCBkcml2ZXIiCitjb25maWcgQUQyUzEyMDAKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgYWQyczEyMDAvYWQyczEyMDUgZHJpdmVyIgogCWRlcGVuZHMgb24gU1BJCisJZGVwZW5kcyBvbiBHRU5FUklDX0dQSU8KIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgQW5hbG9nIERldmljZXMgc3BpIHJlc29sdmVyCiAJICB0byBkaWdpdGFsIGNvbnZlcnRlcnMsIGFkMnMxMjAwIGFuZCBhZDJzMTIwNSwgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcwpAQCAtMjEsNyArMjIsOSBAQAogY29uZmlnIEFEMlMxMjEwCiAJdHJpc3RhdGUgIkFuYWxvZyBEZXZpY2VzIGFkMnMxMjEwIGRyaXZlciIKIAlkZXBlbmRzIG9uIFNQSQorCWRlcGVuZHMgb24gR0VORVJJQ19HUElPCiAJaGVscAogCSAgU2F5IHllcyBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIEFuYWxvZyBEZXZpY2VzIHNwaSByZXNvbHZlcgogCSAgdG8gZGlnaXRhbCBjb252ZXJ0ZXJzLCBhZDJzMTIxMCwgcHJvdmlkZXMgZGlyZWN0IGFjY2VzcyB2aWEgc3lzZnMuCiAKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL01ha2VmaWxlCmluZGV4IDBiODRhODkuLjE0Mzc1ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9NYWtlZmlsZQpAQCAtMyw1ICszLDUgQEAKICMKIAogb2JqLSQoQ09ORklHX0FEMlM5MCkgKz0gYWQyczkwLm8KLW9iai0kKENPTkZJR19BRDJTMTIwWCkgKz0gYWQyczEyMHgubworb2JqLSQoQ09ORklHX0FEMlMxMjAwKSArPSBhZDJzMTIwMC5vCiBvYmotJChDT05GSUdfQUQyUzEyMTApICs9IGFkMnMxMjEwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvYWQyczEyMDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvYWQyczEyMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2FkNDZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIwMC5jCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogYWQyczEyMDAuYyBzaW1wbGUgc3VwcG9ydCBmb3IgdGhlIEFESSBSZXNvbHZlciB0byBEaWdpdGFsIENvbnZlcnRlcnM6CisgKiBBRDJTMTIwMC8xMjA1CisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTAgQW5hbG9nIERldmljZXMgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgIi4uL2lpby5oIgorI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCisKKyNkZWZpbmUgRFJWX05BTUUgImFkMnMxMjAwIgorCisvKiBpbnB1dCBwaW4gc2FtcGxlIGFuZCByZHZlbCBpcyBjb250cm9sbGVkIGJ5IGRyaXZlciAqLworI2RlZmluZSBBRDJTMTIwMF9QTgkyCisKKy8qIGlucHV0IGNsb2NrIG9uIHNlcmlhbCBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgQUQyUzEyMDBfSFoJODE5MjAwMAorLyogY2xvY2sgcGVyaW9kIGluIG5hbm8gc2Vjb25kICovCisjZGVmaW5lIEFEMlMxMjAwX1RTQ0xLCSgxMDAwMDAwMDAwL0FEMlMxMjAwX0haKQorCitzdHJ1Y3QgYWQyczEyMDBfc3RhdGUgeworCXN0cnVjdCBtdXRleCBsb2NrOworCXN0cnVjdCBzcGlfZGV2aWNlICpzZGV2OworCWludCBzYW1wbGU7CisJaW50IHJkdmVsOworCXU4IHJ4WzJdIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKK307CisKK3N0YXRpYyBpbnQgYWQyczEyMDBfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCSAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgaW50ICp2YWwsCisJCQkgICBpbnQgKnZhbDIsCisJCQkgICBsb25nIG0pCit7CisJaW50IHJldCA9IDA7CisJczE2IHZlbDsKKwlzdHJ1Y3QgYWQyczEyMDBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKKwlncGlvX3NldF92YWx1ZShzdC0+c2FtcGxlLCAwKTsKKwkvKiBkZWxheSAoNiAqIEFEMlMxMjAwX1RTQ0xLICsgMjApIG5hbm8gc2Vjb25kcyAqLworCXVkZWxheSgxKTsKKwlncGlvX3NldF92YWx1ZShzdC0+c2FtcGxlLCAxKTsKKwlncGlvX3NldF92YWx1ZShzdC0+cmR2ZWwsICEhKGNoYW4tPnR5cGUgPT0gSUlPX0FOR0wpKTsKKwlyZXQgPSBzcGlfcmVhZChzdC0+c2Rldiwgc3QtPnJ4LCAyKTsKKwlpZiAocmV0IDwgMCkgeworCQltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwljYXNlIElJT19BTkdMOgorCQkqdmFsID0gKCgodTE2KShzdC0+cnhbMF0pKSA8PCA0KSB8ICgoc3QtPnJ4WzFdICYgMHhGMCkgPj4gNCk7CisJCWJyZWFrOworCWNhc2UgSUlPX0FOR0xfVkVMOgorCQl2ZWwgPSAoKChzMTYpKHN0LT5yeFswXSkpIDw8IDQpIHwgKChzdC0+cnhbMV0gJiAweEYwKSA+PiA0KTsKKwkJdmVsID0gKHZlbCA8PCA0KSA+PiA0OworCQkqdmFsID0gdmVsOworCWRlZmF1bHQ6CisJCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogZGVsYXkgKDIgKiBBRDJTMTIwMF9UU0NMSyArIDIwKSBucyBmb3Igc2FtcGxlIHB1bHNlICovCisJdWRlbGF5KDEpOworCW11dGV4X3VubG9jaygmc3QtPmxvY2spOworCXJldHVybiBJSU9fVkFMX0lOVDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIGFkMnMxMjAwX2NoYW5uZWxzW10gPSB7CisJeworCQkudHlwZSA9IElJT19BTkdMLAorCQkuaW5kZXhlZCA9IDEsCisJCS5jaGFubmVsID0gMCwKKwl9LCB7CisJCS50eXBlID0gSUlPX0FOR0xfVkVMLAorCQkuaW5kZXhlZCA9IDEsCisJCS5jaGFubmVsID0gMCwKKwl9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkMnMxMjAwX2luZm8gPSB7CisJLnJlYWRfcmF3ID0gJmFkMnMxMjAwX3JlYWRfcmF3LAorCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDJzMTIwMF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBhZDJzMTIwMF9zdGF0ZSAqc3Q7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlpbnQgcG4sIHJldCA9IDA7CisJdW5zaWduZWQgc2hvcnQgKnBpbnMgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCisJZm9yIChwbiA9IDA7IHBuIDwgQUQyUzEyMDBfUE47IHBuKyspCisJCWlmIChncGlvX3JlcXVlc3Rfb25lKHBpbnNbcG5dLCBHUElPRl9ESVJfT1VULCBEUlZfTkFNRSkpIHsKKwkJCXByX2VycigiJXM6IHJlcXVlc3QgZ3BpbyBwaW4gJWQgZmFpbGVkXG4iLAorCQkJCQkJRFJWX05BTUUsIHBpbnNbcG5dKTsKKwkJCWdvdG8gZXJyb3JfcmV0OworCQl9CisJaW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZShzaXplb2YoKnN0KSk7CisJaWYgKGluZGlvX2RldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfcmV0OworCX0KKwlzcGlfc2V0X2RydmRhdGEoc3BpLCBpbmRpb19kZXYpOworCXN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwltdXRleF9pbml0KCZzdC0+bG9jayk7CisJc3QtPnNkZXYgPSBzcGk7CisJc3QtPnNhbXBsZSA9IHBpbnNbMF07CisJc3QtPnJkdmVsID0gcGluc1sxXTsKKworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKKwlpbmRpb19kZXYtPmluZm8gPSAmYWQyczEyMDBfaW5mbzsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGFkMnMxMjAwX2NoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShhZDJzMTIwMF9jaGFubmVscyk7CisJaW5kaW9fZGV2LT5uYW1lID0gc3BpX2dldF9kZXZpY2VfaWQoc3BpKS0+bmFtZTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yX2ZyZWVfZGV2OworCisJc3BpLT5tYXhfc3BlZWRfaHogPSBBRDJTMTIwMF9IWjsKKwlzcGktPm1vZGUgPSBTUElfTU9ERV8zOworCXNwaV9zZXR1cChzcGkpOworCisJcmV0dXJuIDA7CisKK2Vycm9yX2ZyZWVfZGV2OgorCWlpb19mcmVlX2RldmljZShpbmRpb19kZXYpOworZXJyb3JfcmV0OgorCWZvciAoLS1wbjsgcG4gPj0gMDsgcG4tLSkKKwkJZ3Bpb19mcmVlKHBpbnNbcG5dKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDJzMTIwMF9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoc3BpX2dldF9kcnZkYXRhKHNwaSkpOworCWlpb19mcmVlX2RldmljZShzcGlfZ2V0X2RydmRhdGEoc3BpKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGFkMnMxMjAwX2lkW10gPSB7CisJeyAiYWQyczEyMDAiIH0sCisJeyAiYWQyczEyMDUiIH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZDJzMTIwMF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBEUlZfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBhZDJzMTIwMF9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoYWQyczEyMDBfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBhZDJzMTIwMF9pZCwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IGFkMnMxMjAwX3NwaV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHNwaV9yZWdpc3Rlcl9kcml2ZXIoJmFkMnMxMjAwX2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChhZDJzMTIwMF9zcGlfaW5pdCk7CisKK3N0YXRpYyBfX2V4aXQgdm9pZCBhZDJzMTIwMF9zcGlfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigmYWQyczEyMDBfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGFkMnMxMjAwX3NwaV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiR3JhZmYgWWFuZyA8Z3JhZmYueWFuZ0BnbWFpbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFEMlMxMjAwLzEyMDUgUmVzb2x2ZXIgdG8gRGlnaXRhbCBTUEkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnMxMjB4LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnMxMjB4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZDRjNzIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIweC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qCi0gKiBhZDJzMTIweC5jIHNpbXBsZSBzdXBwb3J0IGZvciB0aGUgQURJIFJlc29sdmVyIHRvIERpZ2l0YWwgQ29udmVydGVyczogQUQyUzEyMDAvMTIwNQotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMC0yMDEwIEFuYWxvZyBEZXZpY2VzIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+Ci0KLSNpbmNsdWRlICIuLi9paW8uaCIKLSNpbmNsdWRlICIuLi9zeXNmcy5oIgotCi0jZGVmaW5lIERSVl9OQU1FICJhZDJzMTIweCIKLQotLyogaW5wdXQgcGluIHNhbXBsZSBhbmQgcmR2ZWwgaXMgY29udHJvbGxlZCBieSBkcml2ZXIgKi8KLSNkZWZpbmUgQUQyUzEyMFhfUE4JMgotCi0vKiBpbnB1dCBjbG9jayBvbiBzZXJpYWwgaW50ZXJmYWNlICovCi0jZGVmaW5lIEFEMlMxMjBYX0haCTgxOTIwMDAKLS8qIGNsb2NrIHBlcmlvZCBpbiBuYW5vIHNlY29uZCAqLwotI2RlZmluZSBBRDJTMTIwWF9UU0NMSwkoMTAwMDAwMDAwMC9BRDJTMTIwWF9IWikKLQotc3RydWN0IGFkMnMxMjB4X3N0YXRlIHsKLQlzdHJ1Y3QgbXV0ZXggbG9jazsKLQlzdHJ1Y3Qgc3BpX2RldmljZSAqc2RldjsKLQlpbnQgc2FtcGxlOwotCWludCByZHZlbDsKLQl1OCByeFsyXSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7Ci19OwotCi1zdGF0aWMgc3NpemVfdCBhZDJzMTIweF9zaG93X3ZhbChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCWludCByZXQgPSAwOwotCXNzaXplX3QgbGVuID0gMDsKLQl1MTYgcG9zOwotCXMxNiB2ZWw7Ci0JdTggc3RhdHVzOwotCXN0cnVjdCBhZDJzMTIweF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihkZXZfZ2V0X2RydmRhdGEoZGV2KSk7Ci0Jc3RydWN0IGlpb19kZXZfYXR0ciAqaWF0dHIgPSB0b19paW9fZGV2X2F0dHIoYXR0cik7Ci0KLQltdXRleF9sb2NrKCZzdC0+bG9jayk7Ci0KLQlncGlvX3NldF92YWx1ZShzdC0+c2FtcGxlLCAwKTsKLQkvKiBkZWxheSAoNiAqIEFEMlMxMjBYX1RTQ0xLICsgMjApIG5hbm8gc2Vjb25kcyAqLwotCXVkZWxheSgxKTsKLQlncGlvX3NldF92YWx1ZShzdC0+c2FtcGxlLCAxKTsKLQlncGlvX3NldF92YWx1ZShzdC0+cmR2ZWwsIGlhdHRyLT5hZGRyZXNzKTsKLQlyZXQgPSBzcGlfcmVhZChzdC0+c2Rldiwgc3QtPnJ4LCAyKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcl9yZXQ7Ci0Jc3RhdHVzID0gc3QtPnJ4WzFdOwotCWlmIChpYXR0ci0+YWRkcmVzcykKLQkJcG9zID0gKCgodTE2KShzdC0+cnhbMF0pKSA8PCA0KSB8ICgoc3QtPnJ4WzFdICYgMHhGMCkgPj4gNCk7Ci0JZWxzZSB7Ci0JCXZlbCA9IChzdC0+cnhbMF0gJiAweDgwKSA/IDB4ZjAwMCA6IDA7Ci0JCXZlbCB8PSAoKChzMTYpKHN0LT5yeFswXSkpIDw8IDQpIHwgKChzdC0+cnhbMV0gJiAweEYwKSA+PiA0KTsKLQl9Ci0JbGVuID0gc3ByaW50ZihidWYsICIlZCAlYyVjJWMlYyAiLCBpYXR0ci0+YWRkcmVzcyA/IHBvcyA6IHZlbCwKLQkJCQkoc3RhdHVzICYgMHg4KSA/ICdQJyA6ICdWJywKLQkJCQkoc3RhdHVzICYgMHg0KSA/ICdkJyA6ICdfJywKLQkJCQkoc3RhdHVzICYgMHgyKSA/ICdsJyA6ICdfJywKLQkJCQkoc3RhdHVzICYgMHgxKSA/ICcxJyA6ICcwJyk7Ci1lcnJvcl9yZXQ6Ci0JLyogZGVsYXkgKDIgKiBBRDJTMTIwWF9UU0NMSyArIDIwKSBucyBmb3Igc2FtcGxlIHB1bHNlICovCi0JdWRlbGF5KDEpOwotCW11dGV4X3VubG9jaygmc3QtPmxvY2spOwotCi0JcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKLX0KLQotc3RhdGljIElJT19ERVZJQ0VfQVRUUihwb3MsIFNfSVJVR08sIGFkMnMxMjB4X3Nob3dfdmFsLCBOVUxMLCAxKTsKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIodmVsLCBTX0lSVUdPLCBhZDJzMTIweF9zaG93X3ZhbCwgTlVMTCwgMCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICphZDJzMTIweF9hdHRyaWJ1dGVzW10gPSB7Ci0JJmlpb19kZXZfYXR0cl9wb3MuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX3ZlbC5kZXZfYXR0ci5hdHRyLAotCU5VTEwsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhZDJzMTIweF9hdHRyaWJ1dGVfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gYWQyczEyMHhfYXR0cmlidXRlcywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gYWQyczEyMHhfaW5mbyA9IHsKLQkuYXR0cnMgPSAmYWQyczEyMHhfYXR0cmlidXRlX2dyb3VwLAotCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBhZDJzMTIweF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBhZDJzMTIweF9zdGF0ZSAqc3Q7Ci0Jc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKLQlpbnQgcG4sIHJldCA9IDA7Ci0JdW5zaWduZWQgc2hvcnQgKnBpbnMgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOwotCi0JZm9yIChwbiA9IDA7IHBuIDwgQUQyUzEyMFhfUE47IHBuKyspCi0JCWlmIChncGlvX3JlcXVlc3Rfb25lKHBpbnNbcG5dLCBHUElPRl9ESVJfT1VULCBEUlZfTkFNRSkpIHsKLQkJCXByX2VycigiJXM6IHJlcXVlc3QgZ3BpbyBwaW4gJWQgZmFpbGVkXG4iLAotCQkJCQkJRFJWX05BTUUsIHBpbnNbcG5dKTsKLQkJCWdvdG8gZXJyb3JfcmV0OwotCQl9Ci0JaW5kaW9fZGV2ID0gaWlvX2FsbG9jYXRlX2RldmljZShzaXplb2YoKnN0KSk7Ci0JaWYgKGluZGlvX2RldiA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfcmV0OwotCX0KLQlzcGlfc2V0X2RydmRhdGEoc3BpLCBpbmRpb19kZXYpOwotCXN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQltdXRleF9pbml0KCZzdC0+bG9jayk7Ci0Jc3QtPnNkZXYgPSBzcGk7Ci0Jc3QtPnNhbXBsZSA9IHBpbnNbMF07Ci0Jc3QtPnJkdmVsID0gcGluc1sxXTsKLQotCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKLQlpbmRpb19kZXYtPmluZm8gPSAmYWQyczEyMHhfaW5mbzsKLQlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7Ci0KLQlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcl9mcmVlX2RldjsKLQotCXNwaS0+bWF4X3NwZWVkX2h6ID0gQUQyUzEyMFhfSFo7Ci0Jc3BpLT5tb2RlID0gU1BJX01PREVfMzsKLQlzcGlfc2V0dXAoc3BpKTsKLQotCXJldHVybiAwOwotCi1lcnJvcl9mcmVlX2RldjoKLQlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKLWVycm9yX3JldDoKLQlmb3IgKC0tcG47IHBuID49IDA7IHBuLS0pCi0JCWdwaW9fZnJlZShwaW5zW3BuXSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBfX2RldmV4aXQgYWQyczEyMHhfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0JaWlvX2RldmljZV91bnJlZ2lzdGVyKHNwaV9nZXRfZHJ2ZGF0YShzcGkpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgYWQyczEyMHhfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gRFJWX05BTUUsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAotCX0sCi0JLnByb2JlID0gYWQyczEyMHhfcHJvYmUsCi0JLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGFkMnMxMjB4X3JlbW92ZSksCi19OwotCi1zdGF0aWMgX19pbml0IGludCBhZDJzMTIweF9zcGlfaW5pdCh2b2lkKQotewotCXJldHVybiBzcGlfcmVnaXN0ZXJfZHJpdmVyKCZhZDJzMTIweF9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQoYWQyczEyMHhfc3BpX2luaXQpOwotCi1zdGF0aWMgX19leGl0IHZvaWQgYWQyczEyMHhfc3BpX2V4aXQodm9pZCkKLXsKLQlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkMnMxMjB4X2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChhZDJzMTIweF9zcGlfZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIkdyYWZmIFlhbmcgPGdyYWZmLnlhbmdAZ21haWwuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRDJTMTIwMC8xMjA1IFJlc29sdmVyIHRvIERpZ2l0YWwgU1BJIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIxMC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIxMC5jCmluZGV4IGVjYWY3YmIuLjY0MDFhNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvYWQyczEyMTAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnMxMjEwLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAjaW5jbHVkZSAiLi4vaWlvLmgiCiAjaW5jbHVkZSAiLi4vc3lzZnMuaCIKQEAgLTE5NCw0NyArMTk1LDYgQEAKIAlyZXR1cm4gYWQyczEyMTBfY29uZmlnX3dyaXRlKHN0LCAweDApOwogfQogCi0KLS8qIHJldHVybiB0aGUgT0xEIERBVEEgc2luY2UgbGFzdCBzcGkgYnVzIHdyaXRlICovCi1zdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zaG93X3JhdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlpb19wcml2KGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKLQlpbnQgcmV0ID0gMDsKLQotCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKLQlpZiAoc3QtPm9sZF9kYXRhKSB7Ci0JCXJldCA9IHNwcmludGYoYnVmLCAiMHgleFxuIiwgc3QtPnJ4WzBdKTsKLQkJc3QtPm9sZF9kYXRhID0gZmFsc2U7Ci0JfQotCW11dGV4X3VubG9jaygmc3QtPmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgYWQyczEyMTBfc3RvcmVfcmF3KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSAgY29uc3QgY2hhciAqYnVmLAotCQkJCSAgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoZGV2X2dldF9kcnZkYXRhKGRldikpOwotCXVuc2lnbmVkIGxvbmcgdWRhdGE7Ci0JdW5zaWduZWQgY2hhciBkYXRhOwotCWludCByZXQ7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDE2LCAmdWRhdGEpOwotCWlmIChyZXQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZGF0YSA9IHVkYXRhICYgMHhmZjsKLQltdXRleF9sb2NrKCZzdC0+bG9jayk7Ci0JcmV0ID0gYWQyczEyMTBfY29uZmlnX3dyaXRlKHN0LCBkYXRhKTsKLQltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKLQotCXJldHVybiByZXQgPCAwID8gcmV0IDogbGVuOwotfQotCiBzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zdG9yZV9zb2Z0cmVzZXQoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCQkJY29uc3QgY2hhciAqYnVmLApAQCAtNTEzLDc1ICs0NzMsNzIgQEAKIAlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IGxlbjsKIH0KIAotc3RhdGljIHNzaXplX3QgYWQyczEyMTBfc2hvd19wb3Moc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgY2hhciAqYnVmKQorc3RhdGljIGludCBhZDJzMTIxMF9yZWFkX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJICAgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCSAgICAgaW50ICp2YWwsCisJCQkgICAgIGludCAqdmFsMiwKKwkJCSAgICAgbG9uZyBtKQogeworCXN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWJvb2wgbmVnYXRpdmU7CiAJaW50IHJldCA9IDA7Ci0Jc3NpemVfdCBsZW4gPSAwOwogCXUxNiBwb3M7Ci0Jc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlpb19wcml2KGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKLQotCW11dGV4X2xvY2soJnN0LT5sb2NrKTsKLQlncGlvX3NldF92YWx1ZShzdC0+cGRhdGEtPnNhbXBsZSwgMCk7Ci0JLyogZGVsYXkgKDYgKiB0Y2sgKyAyMCkgbmFubyBzZWNvbmRzICovCi0JdWRlbGF5KDEpOwotCi0JYWQyczEyMTBfc2V0X21vZGUoTU9EX1BPUywgc3QpOwotCXJldCA9IHNwaV9yZWFkKHN0LT5zZGV2LCBzdC0+cngsIDIpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfcmV0OwotCXBvcyA9IGJlMTZfdG9fY3B1cCgodTE2ICopc3QtPnJ4KTsKLQlpZiAoc3QtPmh5c3RlcmVzaXMpCi0JCXBvcyA+Pj0gMTYgLSBzdC0+cmVzb2x1dGlvbjsKLQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwb3MpOwotZXJyb3JfcmV0OgotCWdwaW9fc2V0X3ZhbHVlKHN0LT5wZGF0YS0+c2FtcGxlLCAxKTsKLQkvKiBkZWxheSAoMiAqIHRjayArIDIwKSBuYW5vIHNlY29uZHMgKi8KLQl1ZGVsYXkoMSk7Ci0JbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7Ci0KLQlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IGxlbjsKLX0KLQotc3RhdGljIHNzaXplX3QgYWQyczEyMTBfc2hvd192ZWwoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgY2hhciAqYnVmKQotewotCXVuc2lnbmVkIHNob3J0IG5lZ2F0aXZlOwotCWludCByZXQgPSAwOwotCXNzaXplX3QgbGVuID0gMDsKIAlzMTYgdmVsOwotCXN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CiAKIAltdXRleF9sb2NrKCZzdC0+bG9jayk7CiAJZ3Bpb19zZXRfdmFsdWUoc3QtPnBkYXRhLT5zYW1wbGUsIDApOwogCS8qIGRlbGF5ICg2ICogdGNrICsgMjApIG5hbm8gc2Vjb25kcyAqLwogCXVkZWxheSgxKTsKIAotCWFkMnMxMjEwX3NldF9tb2RlKE1PRF9WRUwsIHN0KTsKLQlyZXQgPSBzcGlfcmVhZChzdC0+c2Rldiwgc3QtPnJ4LCAyKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX3JldDsKLQluZWdhdGl2ZSA9IHN0LT5yeFswXSAmIDB4ODA7Ci0JdmVsID0gYmUxNl90b19jcHVwKChzMTYgKilzdC0+cngpOwotCXZlbCA+Pj0gMTYgLSBzdC0+cmVzb2x1dGlvbjsKLQlpZiAodmVsICYgMHg4MDAwKSB7Ci0JCW5lZ2F0aXZlID0gKDB4ZmZmZiA+PiBzdC0+cmVzb2x1dGlvbikgPDwgc3QtPnJlc29sdXRpb247Ci0JCXZlbCB8PSBuZWdhdGl2ZTsKKwlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwljYXNlIElJT19BTkdMOgorCQlhZDJzMTIxMF9zZXRfbW9kZShNT0RfUE9TLCBzdCk7CisJCWJyZWFrOworCWNhc2UgSUlPX0FOR0xfVkVMOgorCQlhZDJzMTIxMF9zZXRfbW9kZShNT0RfVkVMLCBzdCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJICAgICAgIHJldCA9IC1FSU5WQUw7CisJICAgICAgIGJyZWFrOwogCX0KLQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2ZWwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX3JldDsKKwlyZXQgPSBzcGlfcmVhZChzdC0+c2Rldiwgc3QtPnJ4LCAyKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9yZXQ7CisKKwlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwljYXNlIElJT19BTkdMOgorCQlwb3MgPSBiZTE2X3RvX2NwdXAoKHUxNiAqKXN0LT5yeCk7CisJCWlmIChzdC0+aHlzdGVyZXNpcykKKwkJCXBvcyA+Pj0gMTYgLSBzdC0+cmVzb2x1dGlvbjsKKwkJKnZhbCA9IHBvczsKKwkJcmV0ID0gSUlPX1ZBTF9JTlQ7CisJCWJyZWFrOworCWNhc2UgSUlPX0FOR0xfVkVMOgorCQluZWdhdGl2ZSA9IHN0LT5yeFswXSAmIDB4ODA7CisJCXZlbCA9IGJlMTZfdG9fY3B1cCgoczE2ICopc3QtPnJ4KTsKKwkJdmVsID4+PSAxNiAtIHN0LT5yZXNvbHV0aW9uOworCQlpZiAodmVsICYgMHg4MDAwKSB7CisJCQluZWdhdGl2ZSA9ICgweGZmZmYgPj4gc3QtPnJlc29sdXRpb24pIDw8IHN0LT5yZXNvbHV0aW9uOworCQkJdmVsIHw9IG5lZ2F0aXZlOworCQl9CisJCSp2YWwgPSB2ZWw7CisJCXJldCA9IElJT19WQUxfSU5UOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiBlcnJvcl9yZXQ6CiAJZ3Bpb19zZXRfdmFsdWUoc3QtPnBkYXRhLT5zYW1wbGUsIDEpOwogCS8qIGRlbGF5ICgyICogdGNrICsgMjApIG5hbm8gc2Vjb25kcyAqLwogCXVkZWxheSgxKTsKIAltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKLQotCXJldHVybiByZXQgPCAwID8gcmV0IDogbGVuOworCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIocmF3X2lvLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJICAgICAgIGFkMnMxMjEwX3Nob3dfcmF3LCBhZDJzMTIxMF9zdG9yZV9yYXcsIDApOwogc3RhdGljIElJT19ERVZJQ0VfQVRUUihyZXNldCwgU19JV1VTUiwKIAkJICAgICAgIE5VTEwsIGFkMnMxMjEwX3N0b3JlX3NvZnRyZXNldCwgMCk7CiBzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGZjbGtpbiwgU19JUlVHTyB8IFNfSVdVU1IsCkBAIC01OTQsOCArNTUxLDcgQEAKIAkJICAgICAgIGFkMnMxMjEwX3Nob3dfcmVzb2x1dGlvbiwgYWQyczEyMTBfc3RvcmVfcmVzb2x1dGlvbiwgMCk7CiBzdGF0aWMgSUlPX0RFVklDRV9BVFRSKGZhdWx0LCBTX0lSVUdPIHwgU19JV1VTUiwKIAkJICAgICAgIGFkMnMxMjEwX3Nob3dfZmF1bHQsIGFkMnMxMjEwX2NsZWFyX2ZhdWx0LCAwKTsKLXN0YXRpYyBJSU9fREVWSUNFX0FUVFIocG9zLCBTX0lSVUdPLCBhZDJzMTIxMF9zaG93X3BvcywgTlVMTCwgMCk7Ci1zdGF0aWMgSUlPX0RFVklDRV9BVFRSKHZlbCwgU19JUlVHTywgIGFkMnMxMjEwX3Nob3dfdmVsLCBOVUxMLCAwKTsKKwogc3RhdGljIElJT19ERVZJQ0VfQVRUUihsb3NfdGhyZCwgU19JUlVHTyB8IFNfSVdVU1IsCiAJCSAgICAgICBhZDJzMTIxMF9zaG93X3JlZywgYWQyczEyMTBfc3RvcmVfcmVnLAogCQkgICAgICAgQUQyUzEyMTBfUkVHX0xPU19USFJEKTsKQEAgLTYxOCwxNiArNTc0LDI2IEBACiAJCSAgICAgICBhZDJzMTIxMF9zaG93X3JlZywgYWQyczEyMTBfc3RvcmVfcmVnLAogCQkgICAgICAgQUQyUzEyMTBfUkVHX0xPVF9MT1dfVEhSRCk7CiAKKworc3RhdGljIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGFkMnMxMjEwX2NoYW5uZWxzW10gPSB7CisJeworCQkudHlwZSA9IElJT19BTkdMLAorCQkuaW5kZXhlZCA9IDEsCisJCS5jaGFubmVsID0gMCwKKwl9LCB7CisJCS50eXBlID0gSUlPX0FOR0xfVkVMLAorCQkuaW5kZXhlZCA9IDEsCisJCS5jaGFubmVsID0gMCwKKwl9Cit9OworCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQyczEyMTBfYXR0cmlidXRlc1tdID0gewotCSZpaW9fZGV2X2F0dHJfcmF3X2lvLmRldl9hdHRyLmF0dHIsCiAJJmlpb19kZXZfYXR0cl9yZXNldC5kZXZfYXR0ci5hdHRyLAogCSZpaW9fZGV2X2F0dHJfZmNsa2luLmRldl9hdHRyLmF0dHIsCiAJJmlpb19kZXZfYXR0cl9mZXhjaXQuZGV2X2F0dHIuYXR0ciwKIAkmaWlvX2Rldl9hdHRyX2NvbnRyb2wuZGV2X2F0dHIuYXR0ciwKIAkmaWlvX2Rldl9hdHRyX2JpdHMuZGV2X2F0dHIuYXR0ciwKIAkmaWlvX2Rldl9hdHRyX2ZhdWx0LmRldl9hdHRyLmF0dHIsCi0JJmlpb19kZXZfYXR0cl9wb3MuZGV2X2F0dHIuYXR0ciwKLQkmaWlvX2Rldl9hdHRyX3ZlbC5kZXZfYXR0ci5hdHRyLAogCSZpaW9fZGV2X2F0dHJfbG9zX3RocmQuZGV2X2F0dHIuYXR0ciwKIAkmaWlvX2Rldl9hdHRyX2Rvc19vdnJfdGhyZC5kZXZfYXR0ci5hdHRyLAogCSZpaW9fZGV2X2F0dHJfZG9zX21pc190aHJkLmRldl9hdHRyLmF0dHIsCkBAIC02MzksNyArNjA1LDYgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFkMnMxMjEwX2F0dHJpYnV0ZV9ncm91cCA9IHsKLQkubmFtZSA9IERSVl9OQU1FLAogCS5hdHRycyA9IGFkMnMxMjEwX2F0dHJpYnV0ZXMsCiB9OwogCkBAIC02ODEsNTEgKzY0NiwzNyBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19pbmZvIGFkMnMxMjEwX2luZm8gPSB7CisJLnJlYWRfcmF3ID0gJmFkMnMxMjEwX3JlYWRfcmF3LAogCS5hdHRycyA9ICZhZDJzMTIxMF9hdHRyaWJ1dGVfZ3JvdXAsCiAJLmRyaXZlcl9tb2R1bGUgPSBUSElTX01PRFVMRSwKIH07CiAKIHN0YXRpYyBpbnQgYWQyczEyMTBfc2V0dXBfZ3Bpb3Moc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCkKIHsKLQlpbnQgcmV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBzdC0+cGRhdGEtPmdwaW9pbiA/IEdQSU9GX0RJUl9JTiA6IEdQSU9GX0RJUl9PVVQ7CisJc3RydWN0IGdwaW8gYWQyczEyMTBfZ3Bpb3NbXSA9IHsKKwkJeyBzdC0+cGRhdGEtPnNhbXBsZSwgR1BJT0ZfRElSX0lOLCAic2FtcGxlIiB9LAorCQl7IHN0LT5wZGF0YS0+YVswXSwgZmxhZ3MsICJhMCIgfSwKKwkJeyBzdC0+cGRhdGEtPmFbMV0sIGZsYWdzLCAiYTEiIH0sCisJCXsgc3QtPnBkYXRhLT5yZXNbMF0sIGZsYWdzLCAicmVzMCIgfSwKKwkJeyBzdC0+cGRhdGEtPnJlc1swXSwgZmxhZ3MsICJyZXMxIiB9LAorCX07CiAKLQlyZXQgPSBncGlvX3JlcXVlc3Rfb25lKHN0LT5wZGF0YS0+c2FtcGxlLCBHUElPRl9ESVJfSU4sICJzYW1wbGUiKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcl9yZXQ7Ci0JcmV0ID0gZ3Bpb19yZXF1ZXN0X29uZShzdC0+cGRhdGEtPmFbMF0sIGZsYWdzLCAiYTAiKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcl9mcmVlX3NhbXBsZTsKLQlyZXQgPSBncGlvX3JlcXVlc3Rfb25lKHN0LT5wZGF0YS0+YVsxXSwgZmxhZ3MsICJhMSIpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yX2ZyZWVfYTA7Ci0JcmV0ID0gZ3Bpb19yZXF1ZXN0X29uZShzdC0+cGRhdGEtPnJlc1sxXSwgZmxhZ3MsICJyZXMwIik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3JfZnJlZV9hMTsKLQlyZXQgPSBncGlvX3JlcXVlc3Rfb25lKHN0LT5wZGF0YS0+cmVzWzFdLCBmbGFncywgInJlczEiKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcl9mcmVlX3JlczA7Ci0KLQlyZXR1cm4gMDsKLWVycm9yX2ZyZWVfcmVzMDoKLQlncGlvX2ZyZWUoc3QtPnBkYXRhLT5yZXNbMF0pOwotZXJyb3JfZnJlZV9hMToKLQlncGlvX2ZyZWUoc3QtPnBkYXRhLT5hWzFdKTsKLWVycm9yX2ZyZWVfYTA6Ci0JZ3Bpb19mcmVlKHN0LT5wZGF0YS0+YVswXSk7Ci1lcnJvcl9mcmVlX3NhbXBsZToKLQlncGlvX2ZyZWUoc3QtPnBkYXRhLT5zYW1wbGUpOwotZXJyb3JfcmV0OgotCXJldHVybiByZXQ7CisJcmV0dXJuIGdwaW9fcmVxdWVzdF9hcnJheShhZDJzMTIxMF9ncGlvcywgQVJSQVlfU0laRShhZDJzMTIxMF9ncGlvcykpOwogfQogCiBzdGF0aWMgdm9pZCBhZDJzMTIxMF9mcmVlX2dwaW9zKHN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QpCiB7Ci0JZ3Bpb19mcmVlKHN0LT5wZGF0YS0+cmVzWzFdKTsKLQlncGlvX2ZyZWUoc3QtPnBkYXRhLT5yZXNbMF0pOwotCWdwaW9fZnJlZShzdC0+cGRhdGEtPmFbMV0pOwotCWdwaW9fZnJlZShzdC0+cGRhdGEtPmFbMF0pOwotCWdwaW9fZnJlZShzdC0+cGRhdGEtPnNhbXBsZSk7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IHN0LT5wZGF0YS0+Z3Bpb2luID8gR1BJT0ZfRElSX0lOIDogR1BJT0ZfRElSX09VVDsKKwlzdHJ1Y3QgZ3BpbyBhZDJzMTIxMF9ncGlvc1tdID0geworCQl7IHN0LT5wZGF0YS0+c2FtcGxlLCBHUElPRl9ESVJfSU4sICJzYW1wbGUiIH0sCisJCXsgc3QtPnBkYXRhLT5hWzBdLCBmbGFncywgImEwIiB9LAorCQl7IHN0LT5wZGF0YS0+YVsxXSwgZmxhZ3MsICJhMSIgfSwKKwkJeyBzdC0+cGRhdGEtPnJlc1swXSwgZmxhZ3MsICJyZXMwIiB9LAorCQl7IHN0LT5wZGF0YS0+cmVzWzBdLCBmbGFncywgInJlczEiIH0sCisJfTsKKworCWdwaW9fZnJlZV9hcnJheShhZDJzMTIxMF9ncGlvcywgQVJSQVlfU0laRShhZDJzMTIxMF9ncGlvcykpOwogfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDJzMTIxMF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQpAQCAtNzYwLDYgKzcxMSw5IEBACiAJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OwogCWluZGlvX2Rldi0+aW5mbyA9ICZhZDJzMTIxMF9pbmZvOwogCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gYWQyczEyMTBfY2hhbm5lbHM7CisJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKGFkMnMxMjEwX2NoYW5uZWxzKTsKKwlpbmRpb19kZXYtPm5hbWUgPSBzcGlfZ2V0X2RldmljZV9pZChzcGkpLT5uYW1lOwogCiAJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwogCWlmIChyZXQpCkBAIC03ODMsMTMgKzczNywxOSBAQAogc3RhdGljIGludCBfX2RldmV4aXQgYWQyczEyMTBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOwotCXN0cnVjdCBhZDJzMTIxMF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7Ci0JYWQyczEyMTBfZnJlZV9ncGlvcyhzdCk7CisJYWQyczEyMTBfZnJlZV9ncGlvcyhpaW9fcHJpdihpbmRpb19kZXYpKTsKKwlpaW9fZnJlZV9kZXZpY2UoaW5kaW9fZGV2KTsKIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgYWQyczEyMTBfaWRbXSA9IHsKKwl7ICJhZDJzMTIxMCIgfSwKKwl7fQorfTsKKwogc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGFkMnMxMjEwX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9IERSVl9OQU1FLApAQCAtNzk3LDYgKzc1Nyw3IEBACiAJfSwKIAkucHJvYmUgPSBhZDJzMTIxMF9wcm9iZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3AoYWQyczEyMTBfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBhZDJzMTIxMF9pZCwKIH07CiAKIHN0YXRpYyBfX2luaXQgaW50IGFkMnMxMjEwX3NwaV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnM5MC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzOTAuYwppbmRleCAxNjZlMjQxLi5hOTIwMGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnM5MC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvYWQyczkwLmMKQEAgLTE0LDU5ICsxNCw0OSBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgIi4uL2lpby5oIgogI2luY2x1ZGUgIi4uL3N5c2ZzLmgiCiAKLSNkZWZpbmUgRFJWX05BTUUgImFkMnM5MCIKLQogc3RydWN0IGFkMnM5MF9zdGF0ZSB7CiAJc3RydWN0IG11dGV4IGxvY2s7Ci0Jc3RydWN0IGlpb19kZXYgKmlkZXY7CiAJc3RydWN0IHNwaV9kZXZpY2UgKnNkZXY7CiAJdTggcnhbMl0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwogfTsKIAotc3RhdGljIHNzaXplX3QgYWQyczkwX3Nob3dfYW5ndWxhcihzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorc3RhdGljIGludCBhZDJzOTBfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCSAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJICAgaW50ICp2YWwsCisJCQkgICBpbnQgKnZhbDIsCisJCQkgICBsb25nIG0pCiB7CiAJaW50IHJldDsKLQlzc2l6ZV90IGxlbiA9IDA7Ci0JdTE2IHZhbDsKLQlzdHJ1Y3QgYWQyczkwX3N0YXRlICpzdCA9IGlpb19wcml2KGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKKwlzdHJ1Y3QgYWQyczkwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAKIAltdXRleF9sb2NrKCZzdC0+bG9jayk7CiAJcmV0ID0gc3BpX3JlYWQoc3QtPnNkZXYsIHN0LT5yeCwgMik7CiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9yZXQ7Ci0JdmFsID0gKCgodTE2KShzdC0+cnhbMF0pKSA8PCA0KSB8ICgoc3QtPnJ4WzFdICYgMHhGMCkgPj4gNCk7Ci0JbGVuID0gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKKwkqdmFsID0gKCgodTE2KShzdC0+cnhbMF0pKSA8PCA0KSB8ICgoc3QtPnJ4WzFdICYgMHhGMCkgPj4gNCk7CisKIGVycm9yX3JldDoKIAltdXRleF91bmxvY2soJnN0LT5sb2NrKTsKIAotCXJldHVybiByZXQgPyByZXQgOiBsZW47CisJcmV0dXJuIElJT19WQUxfSU5UOwogfQogCi0jZGVmaW5lIElJT19ERVZfQVRUUl9TSU1QTEVfUkVTT0xWRVIoX3Nob3cpIFwKLQlJSU9fREVWSUNFX0FUVFIoYW5ndWxhciwgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCi0KLXN0YXRpYyBJSU9fREVWX0FUVFJfU0lNUExFX1JFU09MVkVSKGFkMnM5MF9zaG93X2FuZ3VsYXIpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYWQyczkwX2F0dHJpYnV0ZXNbXSA9IHsKLQkmaWlvX2Rldl9hdHRyX2FuZ3VsYXIuZGV2X2F0dHIuYXR0ciwKLQlOVUxMLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYWQyczkwX2F0dHJpYnV0ZV9ncm91cCA9IHsKLQkubmFtZSA9IERSVl9OQU1FLAotCS5hdHRycyA9IGFkMnM5MF9hdHRyaWJ1dGVzLAotfTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBhZDJzOTBfaW5mbyA9IHsKLQkuYXR0cnMgPSAmYWQyczkwX2F0dHJpYnV0ZV9ncm91cCwKKwkucmVhZF9yYXcgPSAmYWQyczkwX3JlYWRfcmF3LAogCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgYWQyczkwX2NoYW4gPSB7CisJLnR5cGUgPSBJSU9fQU5HTCwKKwkuaW5kZXhlZCA9IDEsCisJLmNoYW5uZWwgPSAwLAorfTsKKwogc3RhdGljIGludCBfX2RldmluaXQgYWQyczkwX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKQEAgLTg2LDggKzc2LDExIEBACiAJaW5kaW9fZGV2LT5kZXYucGFyZW50ID0gJnNwaS0+ZGV2OwogCWluZGlvX2Rldi0+aW5mbyA9ICZhZDJzOTBfaW5mbzsKIAlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9ICZhZDJzOTBfY2hhbjsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IDE7CisJaW5kaW9fZGV2LT5uYW1lID0gc3BpX2dldF9kZXZpY2VfaWQoc3BpKS0+bmFtZTsKIAotCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoc3QtPmlkZXYpOworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX2ZyZWVfZGV2OwogCkBAIC05OSw3ICs5Miw3IEBACiAJcmV0dXJuIDA7CiAKIGVycm9yX2ZyZWVfZGV2OgotCWlpb19mcmVlX2RldmljZShzdC0+aWRldik7CisJaWlvX2ZyZWVfZGV2aWNlKGluZGlvX2Rldik7CiBlcnJvcl9yZXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTEwNywxNyArMTAwLDI0IEBACiBzdGF0aWMgaW50IF9fZGV2ZXhpdCBhZDJzOTBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKHNwaV9nZXRfZHJ2ZGF0YShzcGkpKTsKKwlpaW9fZnJlZV9kZXZpY2Uoc3BpX2dldF9kcnZkYXRhKHNwaSkpOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BpX2RldmljZV9pZCBhZDJzOTBfaWRbXSA9IHsKKwl7ICJhZDJzOTAiIH0sCisJe30KK307CisKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBhZDJzOTBfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gRFJWX05BTUUsCisJCS5uYW1lID0gImFkMnM5MCIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCX0sCiAJLnByb2JlID0gYWQyczkwX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChhZDJzOTBfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBhZDJzOTBfaWQsCiB9OwogCiBzdGF0aWMgX19pbml0IGludCBhZDJzOTBfc3BpX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vcmluZ19nZW5lcmljLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3JpbmdfZ2VuZXJpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjI2ZjcxLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vcmluZ19nZW5lcmljLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyogVGhlIGluZHVzdHJpYWwgSS9PIGNvcmUgLSBnZW5lcmljIHJpbmcgYnVmZmVyIGludGVyZmFjZXMuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEpvbmF0aGFuIENhbWVyb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpZm5kZWYgX0lJT19SSU5HX0dFTkVSSUNfSF8KLSNkZWZpbmUgX0lJT19SSU5HX0dFTkVSSUNfSF8KLSNpbmNsdWRlICJpaW8uaCIKLQotI2lmZGVmIENPTkZJR19JSU9fUklOR19CVUZGRVIKLQotc3RydWN0IGlpb19yaW5nX2J1ZmZlcjsKLQotLyoqCi0gKiBzdHJ1Y3QgaWlvX3JpbmdfYWNjZXNzX2Z1bmNzIC0gYWNjZXNzIGZ1bmN0aW9ucyBmb3IgcmluZyBidWZmZXJzLgotICogQG1hcmtfaW5fdXNlOglyZWZlcmVuY2UgY291bnRpbmcsIHR5cGljYWxseSB0byBwcmV2ZW50IG1vZHVsZSByZW1vdmFsCi0gKiBAdW5tYXJrX2luX3VzZToJcmVkdWNlIHJlZmVyZW5jZSBjb3VudCB3aGVuIG5vIGxvbmdlciB1c2luZyByaW5nIGJ1ZmZlcgotICogQHN0b3JlX3RvOgkJYWN0dWFsbHkgc3RvcmUgc3R1ZmYgdG8gdGhlIHJpbmcgYnVmZmVyCi0gKiBAcmVhZF9sYXN0OgkJZ2V0IHRoZSBsYXN0IGVsZW1lbnQgc3RvcmVkCi0gKiBAcmVhZF9maXJzdF9uOgl0cnkgdG8gZ2V0IGEgc3BlY2lmaWVkIG51bWJlciBvZiBlbGVtZW50cyAobXVzdCBleGlzdCkKLSAqIEBtYXJrX3BhcmFtX2NoYW5nZToJbm90aWZ5IHJpbmcgdGhhdCBzb21lIHJlbGV2YW50IHBhcmFtZXRlciBoYXMgY2hhbmdlZAotICoJCQlPZnRlbiB0aGlzIG1lYW5zIHRoZSB1bmRlcmx5aW5nIHN0b3JhZ2UgbWF5IG5lZWQgdG8KLSAqCQkJY2hhbmdlLgotICogQHJlcXVlc3RfdXBkYXRlOglpZiBhIHBhcmFtZXRlciBjaGFuZ2UgaGFzIGJlZW4gbWFya2VkLCB1cGRhdGUgdW5kZXJseWluZwotICoJCQlzdG9yYWdlLgotICogQGdldF9ieXRlc19wZXJfZGF0dW06Z2V0IGN1cnJlbnQgYnl0ZXMgcGVyIGRhdHVtCi0gKiBAc2V0X2J5dGVzX3Blcl9kYXR1bTpzZXQgbnVtYmVyIG9mIGJ5dGVzIHBlciBkYXR1bQotICogQGdldF9sZW5ndGg6CQlnZXQgbnVtYmVyIG9mIGRhdHVtcyBpbiByaW5nCi0gKiBAc2V0X2xlbmd0aDoJCXNldCBudW1iZXIgb2YgZGF0dW1zIGluIHJpbmcKLSAqIEBpc19lbmFibGVkOgkJcXVlcnkgaWYgcmluZyBpcyBjdXJyZW50bHkgYmVpbmcgdXNlZAotICogQGVuYWJsZToJCWVuYWJsZSB0aGUgcmluZwotICoKLSAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgc3RydWN0dXJlIGlzIHRvIG1ha2UgdGhlIHJpbmcgYnVmZmVyIGVsZW1lbnQKLSAqIG1vZHVsYXIgYXMgZXZlbnQgZm9yIGEgZ2l2ZW4gZHJpdmVyLCBkaWZmZXJlbnQgdXNlY2FzZXMgbWF5IHJlcXVpcmUKLSAqIGRpZmZlcmVudCByaW5nIGRlc2lnbnMgKHNwYWNlIGVmZmljaWVuY3kgdnMgc3BlZWQgZm9yIGV4YW1wbGUpLgotICoKLSAqIEl0IGlzIHdvcnRoIG5vdGluZyB0aGF0IGEgZ2l2ZW4gcmluZyBpbXBsZW1lbnRhdGlvbiBtYXkgb25seSBzdXBwb3J0IGEgc21hbGwKLSAqIHByb3BvcnRpb24gb2YgdGhlc2UgZnVuY3Rpb25zLiAgVGhlIGNvcmUgY29kZSAnc2hvdWxkJyBjb3BlIGZpbmUgd2l0aCBhbnkgb2YKLSAqIHRoZW0gbm90IGV4aXN0aW5nLgotICoqLwotc3RydWN0IGlpb19yaW5nX2FjY2Vzc19mdW5jcyB7Ci0Jdm9pZCAoKm1hcmtfaW5fdXNlKShzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKLQl2b2lkICgqdW5tYXJrX2luX3VzZSkoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7Ci0KLQlpbnQgKCpzdG9yZV90bykoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZywgdTggKmRhdGEsIHM2NCB0aW1lc3RhbXApOwotCWludCAoKnJlYWRfbGFzdCkoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZywgdTggKmRhdGEpOwotCWludCAoKnJlYWRfZmlyc3Rfbikoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZywKLQkJCSAgICBzaXplX3QgbiwKLQkJCSAgICBjaGFyIF9fdXNlciAqYnVmKTsKLQotCWludCAoKm1hcmtfcGFyYW1fY2hhbmdlKShzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKLQlpbnQgKCpyZXF1ZXN0X3VwZGF0ZSkoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7Ci0KLQlpbnQgKCpnZXRfYnl0ZXNfcGVyX2RhdHVtKShzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKLQlpbnQgKCpzZXRfYnl0ZXNfcGVyX2RhdHVtKShzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nLCBzaXplX3QgYnBkKTsKLQlpbnQgKCpnZXRfbGVuZ3RoKShzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKLQlpbnQgKCpzZXRfbGVuZ3RoKShzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nLCBpbnQgbGVuZ3RoKTsKLQotCWludCAoKmlzX2VuYWJsZWQpKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcpOwotCWludCAoKmVuYWJsZSkoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7Ci19OwotCi1zdHJ1Y3QgaWlvX3Jpbmdfc2V0dXBfb3BzIHsKLQlpbnQJCQkJKCpwcmVlbmFibGUpKHN0cnVjdCBpaW9fZGV2ICopOwotCWludAkJCQkoKnBvc3RlbmFibGUpKHN0cnVjdCBpaW9fZGV2ICopOwotCWludAkJCQkoKnByZWRpc2FibGUpKHN0cnVjdCBpaW9fZGV2ICopOwotCWludAkJCQkoKnBvc3RkaXNhYmxlKShzdHJ1Y3QgaWlvX2RldiAqKTsKLX07Ci0KLS8qKgotICogc3RydWN0IGlpb19yaW5nX2J1ZmZlciAtIGdlbmVyYWwgcmluZyBidWZmZXIgc3RydWN0dXJlCi0gKiBAZGV2OgkJcmluZyBidWZmZXIgZGV2aWNlIHN0cnVjdAotICogQGluZGlvX2RldjoJCWluZHVzdHJpYWwgSS9PIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBvd25lcjoJCW1vZHVsZSB0aGF0IG93bnMgdGhlIHJpbmcgYnVmZmVyIChmb3IgcmVmIGNvdW50aW5nKQotICogQGxlbmd0aDoJCVtERVZJQ0VdIG51bWJlciBvZiBkYXR1bXMgaW4gcmluZwotICogQGJ5dGVzX3Blcl9kYXR1bToJW0RFVklDRV0gc2l6ZSBvZiBpbmRpdmlkdWFsIGRhdHVtIGluY2x1ZGluZyB0aW1lc3RhbXAKLSAqIEBicGU6CQlbREVWSUNFXSBzaXplIG9mIGluZGl2aWR1YWwgY2hhbm5lbCB2YWx1ZQotICogQHNjYW5fZWxfYXR0cnM6CVtEUklWRVJdIGNvbnRyb2wgb2Ygc2NhbiBlbGVtZW50cyBpZiB0aGF0IHNjYW4gbW9kZQotICoJCQljb250cm9sIG1ldGhvZCBpcyB1c2VkCi0gKiBAc2Nhbl9jb3VudDoJW0lOVEVSTl0gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBzY2FuIG1vZGUKLSAqIEBzY2FuX21hc2s6CQlbSU5URVJOXSBiaXRtYXNrIHVzZWQgaW4gbWFza2luZyBzY2FuIG1vZGUgZWxlbWVudHMKLSAqIEBzY2FuX3RpbWVzdGFtcDoJW0lOVEVSTl0gZG9lcyB0aGUgc2NhbiBtb2RlIGluY2x1ZGUgYSB0aW1lc3RhbXAKLSAqIEBhY2Nlc3NfaGFuZGxlcjoJW0lOVEVSTl0gY2hyZGV2IGFjY2VzcyBoYW5kbGluZwotICogQGFjY2VzczoJCVtEUklWRVJdIHJpbmcgYWNjZXNzIGZ1bmN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlCi0gKgkJCWltcGxlbWVudGF0aW9uLgotICogQHByZWVuYWJsZToJCVtEUklWRVJdIGZ1bmN0aW9uIHRvIHJ1biBwcmlvciB0byBtYXJraW5nIHJpbmcgZW5hYmxlZAotICogQHBvc3RlbmFibGU6CQlbRFJJVkVSXSBmdW5jdGlvbiB0byBydW4gYWZ0ZXIgbWFya2luZyByaW5nIGVuYWJsZWQKLSAqIEBwcmVkaXNhYmxlOgkJW0RSSVZFUl0gZnVuY3Rpb24gdG8gcnVuIHByaW9yIHRvIG1hcmtpbmcgcmluZyBkaXNhYmxlZAotICogQHBvc3RkaXNhYmxlOglbRFJJVkVSXSBmdW5jdGlvbiB0byBydW4gYWZ0ZXIgbWFya2luZyByaW5nIGRpc2FibGVkCi0gKiovCi1zdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyIHsKLQlzdHJ1Y3QgZGV2aWNlCQkJCWRldjsKLQlzdHJ1Y3QgaWlvX2RldgkJCQkqaW5kaW9fZGV2OwotCXN0cnVjdCBtb2R1bGUJCQkJKm93bmVyOwotCWludAkJCQkJbGVuZ3RoOwotCWludAkJCQkJYnl0ZXNfcGVyX2RhdHVtOwotCWludAkJCQkJYnBlOwotCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAJCQkqc2Nhbl9lbF9hdHRyczsKLQlpbnQJCQkJCXNjYW5fY291bnQ7Ci0JdW5zaWduZWQgbG9uZwkJCQlzY2FuX21hc2s7Ci0JYm9vbAkJCQkJc2Nhbl90aW1lc3RhbXA7Ci0Jc3RydWN0IGlpb19oYW5kbGVyCQkJYWNjZXNzX2hhbmRsZXI7Ci0JY29uc3Qgc3RydWN0IGlpb19yaW5nX2FjY2Vzc19mdW5jcwkqYWNjZXNzOwotCWNvbnN0IHN0cnVjdCBpaW9fcmluZ19zZXR1cF9vcHMJCSpzZXR1cF9vcHM7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJCXNjYW5fZWxfZGV2X2F0dHJfbGlzdDsKLQotCXdhaXRfcXVldWVfaGVhZF90CQkJcG9sbHE7Ci0JYm9vbAkJCQkJc3R1ZmZ0b3JlYWQ7Ci19OwotCi0vKioKLSAqIGlpb19yaW5nX2J1ZmZlcl9pbml0KCkgLSBJbml0aWFsaXplIHRoZSBidWZmZXIgc3RydWN0dXJlCi0gKiBAcmluZzogYnVmZmVyIHRvIGJlIGluaXRpYWxpemVkCi0gKiBAZGV2X2luZm86IHRoZSBpaW8gZGV2aWNlIHRoZSBidWZmZXIgaXMgYXNzb2NhdGVkIHdpdGgKLSAqKi8KLXZvaWQgaWlvX3JpbmdfYnVmZmVyX2luaXQoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZywKLQkJCSAgc3RydWN0IGlpb19kZXYgKmRldl9pbmZvKTsKLQotLyoqCi0gKiBfX2lpb191cGRhdGVfcmluZ19idWZmZXIoKSAtIHVwZGF0ZSBjb21tb24gZWxlbWVudHMgb2YgcmluZyBidWZmZXJzCi0gKiBAcmluZzoJCXJpbmcgYnVmZmVyIHRoYXQgaXMgdGhlIGV2ZW50IHNvdXJjZQotICogQGJ5dGVzX3Blcl9kYXR1bToJc2l6ZSBvZiBpbmRpdmlkdWFsIGRhdHVtIGluY2x1ZGluZyB0aW1lc3RhbXAKLSAqIEBsZW5ndGg6CQludW1iZXIgb2YgZGF0dW1zIGluIHJpbmcKLSAqKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2lpb191cGRhdGVfcmluZ19idWZmZXIoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZywKLQkJCQkJICAgIGludCBieXRlc19wZXJfZGF0dW0sIGludCBsZW5ndGgpCi17Ci0JcmluZy0+Ynl0ZXNfcGVyX2RhdHVtID0gYnl0ZXNfcGVyX2RhdHVtOwotCXJpbmctPmxlbmd0aCA9IGxlbmd0aDsKLX0KLQotLyoKLSAqIFRoZXNlIGFyZSBtYWlubHkgcHJvdmlkZWQgdG8gYWxsb3cgZm9yIGEgY2hhbmdlIG9mIGltcGxlbWVudGF0aW9uIGlmIGEgZGV2aWNlCi0gKiBoYXMgYSBsYXJnZSBudW1iZXIgb2Ygc2NhbiBlbGVtZW50cwotICovCi0jZGVmaW5lIElJT19NQVhfU0NBTl9MRU5HVEggMzEKLQotLyogbm90ZSAwIHVzZWQgYXMgZXJyb3IgaW5kaWNhdG9yIGFzIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZS4gKi8KLXN0YXRpYyBpbmxpbmUgdTMyIGlpb19zY2FuX21hc2tfbWF0Y2godTMyICphdl9tYXNrcywgdTMyIG1hc2spCi17Ci0Jd2hpbGUgKCphdl9tYXNrcykgewotCQlpZiAoISh+KmF2X21hc2tzICYgbWFzaykpCi0JCQlyZXR1cm4gKmF2X21hc2tzOwotCQlhdl9tYXNrcysrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaWlvX3NjYW5fbWFza19xdWVyeShzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nLCBpbnQgYml0KQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IHJpbmctPmluZGlvX2RldjsKLQl1MzIgbWFzazsKLQotCWlmIChiaXQgPiBJSU9fTUFYX1NDQU5fTEVOR1RIKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghcmluZy0+c2Nhbl9tYXNrKQotCQlyZXR1cm4gMDsKLQotCWlmIChkZXZfaW5mby0+YXZhaWxhYmxlX3NjYW5fbWFza3MpCi0JCW1hc2sgPSBpaW9fc2Nhbl9tYXNrX21hdGNoKGRldl9pbmZvLT5hdmFpbGFibGVfc2Nhbl9tYXNrcywKLQkJCQkJcmluZy0+c2Nhbl9tYXNrKTsKLQllbHNlCi0JCW1hc2sgPSByaW5nLT5zY2FuX21hc2s7Ci0KLQlpZiAoIW1hc2spCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuICEhKG1hc2sgJiAoMSA8PCBiaXQpKTsKLX07Ci0KLS8qKgotICogaWlvX3NjYW5fbWFza19zZXQoKSAtIHNldCBwYXJ0aWN1bGFyIGJpdCBpbiB0aGUgc2NhbiBtYXNrCi0gKiBAcmluZzogdGhlIHJpbmcgYnVmZmVyIHdob3NlIHNjYW4gbWFzayB3ZSBhcmUgaW50ZXJlc3RlZCBpbgotICogQGJpdDogdGhlIGJpdCB0byBiZSBzZXQuCi0gKiovCi1zdGF0aWMgaW5saW5lIGludCBpaW9fc2Nhbl9tYXNrX3NldChzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nLCBpbnQgYml0KQotewotCXN0cnVjdCBpaW9fZGV2ICpkZXZfaW5mbyA9IHJpbmctPmluZGlvX2RldjsKLQl1MzIgbWFzazsKLQl1MzIgdHJpYWxtYXNrID0gcmluZy0+c2Nhbl9tYXNrIHwgKDEgPDwgYml0KTsKLQotCWlmIChiaXQgPiBJSU9fTUFYX1NDQU5fTEVOR1RIKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoZGV2X2luZm8tPmF2YWlsYWJsZV9zY2FuX21hc2tzKSB7Ci0JCW1hc2sgPSBpaW9fc2Nhbl9tYXNrX21hdGNoKGRldl9pbmZvLT5hdmFpbGFibGVfc2Nhbl9tYXNrcywKLQkJCQkJdHJpYWxtYXNrKTsKLQkJaWYgKCFtYXNrKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJpbmctPnNjYW5fbWFzayA9IHRyaWFsbWFzazsKLQlyaW5nLT5zY2FuX2NvdW50Kys7Ci0KLQlyZXR1cm4gMDsKLX07Ci0KLS8qKgotICogaWlvX3B1dF9yaW5nX2J1ZmZlcigpIC0gbm90aWZ5IGRvbmUgd2l0aCBidWZmZXIKLSAqIEByaW5nOiB0aGUgYnVmZmVyIHdlIGFyZSBkb25lIHdpdGguCi0gKiovCi1zdGF0aWMgaW5saW5lIHZvaWQgaWlvX3B1dF9yaW5nX2J1ZmZlcihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQotewotCXB1dF9kZXZpY2UoJnJpbmctPmRldik7Ci19OwotCi0jZGVmaW5lIHRvX2lpb19yaW5nX2J1ZmZlcihkKQkJCQlcCi0JY29udGFpbmVyX29mKGQsIHN0cnVjdCBpaW9fcmluZ19idWZmZXIsIGRldikKLQotLyoqCi0gKiBpaW9fcmluZ19idWZmZXJfcmVnaXN0ZXJfZXgoKSAtIHJlZ2lzdGVyIHRoZSBidWZmZXIgd2l0aCBJSU8gY29yZQotICogQHJpbmc6IHRoZSBidWZmZXIgdG8gYmUgcmVnaXN0ZXJlZAotICogQGlkOiB0aGUgaWQgb2YgdGhlIGJ1ZmZlciAodHlwaWNhbGx5IDApCi0gKiovCi1pbnQgaWlvX3JpbmdfYnVmZmVyX3JlZ2lzdGVyX2V4KHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnJpbmcsIGludCBpZCwKLQkJCQljb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbm5lbHMsCi0JCQkJaW50IG51bV9jaGFubmVscyk7Ci0KLXZvaWQgaWlvX3JpbmdfYWNjZXNzX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KTsKLQotLyoqCi0gKiBpaW9fcmluZ19idWZmZXJfdW5yZWdpc3RlcigpIC0gdW5yZWdpc3RlciB0aGUgYnVmZmVyIGZyb20gSUlPIGNvcmUKLSAqIEByaW5nOiB0aGUgYnVmZmVyIHRvIGJlIHVucmVnaXN0ZXJlZAotICoqLwotdm9pZCBpaW9fcmluZ19idWZmZXJfdW5yZWdpc3RlcihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKTsKLQotLyoqCi0gKiBpaW9fcmVhZF9yaW5nX2xlbmd0aCgpIC0gYXR0ciBmdW5jIHRvIGdldCBudW1iZXIgb2YgZGF0dW1zIGluIHRoZSBidWZmZXIKLSAqKi8KLXNzaXplX3QgaWlvX3JlYWRfcmluZ19sZW5ndGgoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgY2hhciAqYnVmKTsKLS8qKgotICogaWlvX3dyaXRlX3JpbmdfbGVuZ3RoKCkgLSBhdHRyIGZ1bmMgdG8gc2V0IG51bWJlciBvZiBkYXR1bXMgaW4gdGhlIGJ1ZmZlcgotICoqLwotc3NpemVfdCBpaW9fd3JpdGVfcmluZ19sZW5ndGgoc3RydWN0IGRldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgICBjb25zdCBjaGFyICpidWYsCi0JCQkgICAgICBzaXplX3QgbGVuKTsKLS8qKgotICogaWlvX3JlYWRfcmluZ19ieXRlc19wZXJfZGF0dW0oKSAtIGF0dHIgZm9yIG51bWJlciBvZiBieXRlcyBpbiB3aG9sZSBkYXR1bQotICoqLwotc3NpemVfdCBpaW9fcmVhZF9yaW5nX2J5dGVzX3Blcl9kYXR1bShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICBjaGFyICpidWYpOwotLyoqCi0gKiBpaW9fc3RvcmVfcmluZ19lbmFibGUoKSAtIGF0dHIgdG8gdHVybiB0aGUgYnVmZmVyIG9uCi0gKiovCi1zc2l6ZV90IGlpb19zdG9yZV9yaW5nX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKLQkJCSAgICAgIHNpemVfdCBsZW4pOwotLyoqCi0gKiBpaW9fc2hvd19yaW5nX2VuYWJsZSgpIC0gYXR0ciB0byBzZWUgaWYgdGhlIGJ1ZmZlciBpcyBvbgotICoqLwotc3NpemVfdCBpaW9fc2hvd19yaW5nX2VuYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgICBjaGFyICpidWYpOwotI2RlZmluZSBJSU9fUklOR19MRU5HVEhfQVRUUiBERVZJQ0VfQVRUUihsZW5ndGgsIFNfSVJVR08gfCBTX0lXVVNSLAlcCi0JCQkJCSBpaW9fcmVhZF9yaW5nX2xlbmd0aCwJCVwKLQkJCQkJIGlpb193cml0ZV9yaW5nX2xlbmd0aCkKLSNkZWZpbmUgSUlPX1JJTkdfQllURVNfUEVSX0RBVFVNX0FUVFIgREVWSUNFX0FUVFIoYnl0ZXNfcGVyX2RhdHVtLCBTX0lSVUdPIHwgU19JV1VTUiwJXAotCQkJCSAgICAgIGlpb19yZWFkX3JpbmdfYnl0ZXNfcGVyX2RhdHVtLCBOVUxMKQotI2RlZmluZSBJSU9fUklOR19FTkFCTEVfQVRUUiBERVZJQ0VfQVRUUihlbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLCBcCi0JCQkJCSBpaW9fc2hvd19yaW5nX2VuYWJsZSwJCVwKLQkJCQkJIGlpb19zdG9yZV9yaW5nX2VuYWJsZSkKLQotaW50IGlpb19zd19yaW5nX3ByZWVuYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKLQotI2Vsc2UgLyogQ09ORklHX0lJT19SSU5HX0JVRkZFUiAqLwotCi1zdGF0aWMgaW5saW5lIGludCBpaW9fcmluZ19idWZmZXJfcmVnaXN0ZXJfZXgoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZywKLQkJCQkJICAgICAgaW50IGlkLAotCQkJCQkgICAgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbm5lbHMsCi0JCQkJCSAgICAgIGludCBudW1fY2hhbm5lbHMpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpaW9fcmluZ19idWZmZXJfdW5yZWdpc3RlcihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyaW5nKQote307Ci0KLSNlbmRpZiAvKiBDT05GSUdfSUlPX1JJTkdfQlVGRkVSICovCi0KLSNlbmRpZiAvKiBfSUlPX1JJTkdfR0VORVJJQ19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9yaW5nX2h3LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3JpbmdfaHcuaAppbmRleCBiYjhjZmQyLi5jYWQ4YTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3JpbmdfaHcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3JpbmdfaHcuaApAQCAtMTQsOSArMTQsOSBAQAogICogQGJ1ZjoJZ2VuZXJpYyByaW5nIGJ1ZmZlciBlbGVtZW50cwogICogQHByaXZhdGU6CWRldmljZSBzcGVjaWZpYyBkYXRhCiAgKi8KLXN0cnVjdCBpaW9faHdfcmluZ19idWZmZXIgewotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgYnVmOworc3RydWN0IGlpb19od19idWZmZXIgeworCXN0cnVjdCBpaW9fYnVmZmVyIGJ1ZjsKIAl2b2lkICpwcml2YXRlOwogfTsKIAotI2RlZmluZSBpaW9fdG9faHdfcmluZ19idWYocikgY29udGFpbmVyX29mKHIsIHN0cnVjdCBpaW9faHdfcmluZ19idWZmZXIsIGJ1ZikKKyNkZWZpbmUgaWlvX3RvX2h3X2J1ZihyKSBjb250YWluZXJfb2Yociwgc3RydWN0IGlpb19od19idWZmZXIsIGJ1ZikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vcmluZ19zdy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yaW5nX3N3LmMKaW5kZXggZmViODRlMi4uNjZhMzRhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9yaW5nX3N3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yaW5nX3N3LmMKQEAgLTMwLDEwICszMCwxMCBAQAogICogQHVzZV9sb2NrOgkJbG9jayB0byBwcmV2ZW50IGNoYW5nZSBpbiBzaXplIHdoZW4gaW4gdXNlCiAgKgogICogTm90ZSB0aGF0IHRoZSBmaXJzdCBlbGVtZW50IG9mIGFsbCByaW5nIGJ1ZmZlcnMgbXVzdCBiZSBhCi0gKiBzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyLgorICogc3RydWN0IGlpb19idWZmZXIuCiAqKi8KIHN0cnVjdCBpaW9fc3dfcmluZ19idWZmZXIgewotCXN0cnVjdCBpaW9fcmluZ19idWZmZXIgIGJ1ZjsKKwlzdHJ1Y3QgaWlvX2J1ZmZlciAgYnVmOwogCXVuc2lnbmVkIGNoYXIJCSpkYXRhOwogCXVuc2lnbmVkIGNoYXIJCSpyZWFkX3A7CiAJdW5zaWduZWQgY2hhcgkJKndyaXRlX3A7CkBAIC01Miw3ICs1Miw3IEBACiB7CiAJaWYgKChsZW5ndGggPT0gMCkgfHwgKGJ5dGVzX3Blcl9kYXR1bSA9PSAwKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JX19paW9fdXBkYXRlX3JpbmdfYnVmZmVyKCZyaW5nLT5idWYsIGJ5dGVzX3Blcl9kYXR1bSwgbGVuZ3RoKTsKKwlfX2lpb191cGRhdGVfYnVmZmVyKCZyaW5nLT5idWYsIGJ5dGVzX3Blcl9kYXR1bSwgbGVuZ3RoKTsKIAlyaW5nLT5kYXRhID0ga21hbGxvYyhsZW5ndGgqcmluZy0+YnVmLmJ5dGVzX3Blcl9kYXR1bSwgR0ZQX0FUT01JQyk7CiAJcmluZy0+cmVhZF9wID0gTlVMTDsKIAlyaW5nLT53cml0ZV9wID0gTlVMTDsKQEAgLTcxLDcgKzcxLDcgQEAKIAlrZnJlZShyaW5nLT5kYXRhKTsKIH0KIAotc3RhdGljIHZvaWQgaWlvX21hcmtfc3dfcmJfaW5fdXNlKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIpCitzdGF0aWMgdm9pZCBpaW9fbWFya19zd19yYl9pbl91c2Uoc3RydWN0IGlpb19idWZmZXIgKnIpCiB7CiAJc3RydWN0IGlpb19zd19yaW5nX2J1ZmZlciAqcmluZyA9IGlpb190b19zd19yaW5nKHIpOwogCXNwaW5fbG9jaygmcmluZy0+dXNlX2xvY2spOwpAQCAtNzksNyArNzksNyBAQAogCXNwaW5fdW5sb2NrKCZyaW5nLT51c2VfbG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIGlpb191bm1hcmtfc3dfcmJfaW5fdXNlKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIpCitzdGF0aWMgdm9pZCBpaW9fdW5tYXJrX3N3X3JiX2luX3VzZShzdHJ1Y3QgaWlvX2J1ZmZlciAqcikKIHsKIAlzdHJ1Y3QgaWlvX3N3X3JpbmdfYnVmZmVyICpyaW5nID0gaWlvX3RvX3N3X3Jpbmcocik7CiAJc3Bpbl9sb2NrKCZyaW5nLT51c2VfbG9jayk7CkBAIC0xNjYsNyArMTY2LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGlpb19yZWFkX2ZpcnN0X25fc3dfcmIoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqciwKK3N0YXRpYyBpbnQgaWlvX3JlYWRfZmlyc3Rfbl9zd19yYihzdHJ1Y3QgaWlvX2J1ZmZlciAqciwKIAkJCQkgIHNpemVfdCBuLCBjaGFyIF9fdXNlciAqYnVmKQogewogCXN0cnVjdCBpaW9fc3dfcmluZ19idWZmZXIgKnJpbmcgPSBpaW9fdG9fc3dfcmluZyhyKTsKQEAgLTI5Nyw3ICsyOTcsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgaWlvX3N0b3JlX3RvX3N3X3JiKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIsCitzdGF0aWMgaW50IGlpb19zdG9yZV90b19zd19yYihzdHJ1Y3QgaWlvX2J1ZmZlciAqciwKIAkJCSAgICAgIHU4ICpkYXRhLAogCQkJICAgICAgczY0IHRpbWVzdGFtcCkKIHsKQEAgLTMyNywxMyArMzI3LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaWlvX3JlYWRfbGFzdF9mcm9tX3N3X3JiKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIsCitzdGF0aWMgaW50IGlpb19yZWFkX2xhc3RfZnJvbV9zd19yYihzdHJ1Y3QgaWlvX2J1ZmZlciAqciwKIAkJCSAgICAgdW5zaWduZWQgY2hhciAqZGF0YSkKIHsKIAlyZXR1cm4gaWlvX3JlYWRfbGFzdF9mcm9tX3N3X3JpbmcoaWlvX3RvX3N3X3JpbmcociksIGRhdGEpOwogfQogCi1zdGF0aWMgaW50IGlpb19yZXF1ZXN0X3VwZGF0ZV9zd19yYihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyKQorc3RhdGljIGludCBpaW9fcmVxdWVzdF91cGRhdGVfc3dfcmIoc3RydWN0IGlpb19idWZmZXIgKnIpCiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGlpb19zd19yaW5nX2J1ZmZlciAqcmluZyA9IGlpb190b19zd19yaW5nKHIpOwpAQCAtMzU0LDEzICszNTQsMTMgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGlpb19nZXRfYnl0ZXNfcGVyX2RhdHVtX3N3X3JiKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIpCitzdGF0aWMgaW50IGlpb19nZXRfYnl0ZXNfcGVyX2RhdHVtX3N3X3JiKHN0cnVjdCBpaW9fYnVmZmVyICpyKQogewogCXN0cnVjdCBpaW9fc3dfcmluZ19idWZmZXIgKnJpbmcgPSBpaW9fdG9fc3dfcmluZyhyKTsKIAlyZXR1cm4gcmluZy0+YnVmLmJ5dGVzX3Blcl9kYXR1bTsKIH0KIAotc3RhdGljIGludCBpaW9fc2V0X2J5dGVzX3Blcl9kYXR1bV9zd19yYihzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpyLCBzaXplX3QgYnBkKQorc3RhdGljIGludCBpaW9fc2V0X2J5dGVzX3Blcl9kYXR1bV9zd19yYihzdHJ1Y3QgaWlvX2J1ZmZlciAqciwgc2l6ZV90IGJwZCkKIHsKIAlpZiAoci0+Ynl0ZXNfcGVyX2RhdHVtICE9IGJwZCkgewogCQlyLT5ieXRlc19wZXJfZGF0dW0gPSBicGQ7CkBAIC0zNzAsMTIgKzM3MCwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGlpb19nZXRfbGVuZ3RoX3N3X3JiKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIpCitzdGF0aWMgaW50IGlpb19nZXRfbGVuZ3RoX3N3X3JiKHN0cnVjdCBpaW9fYnVmZmVyICpyKQogewogCXJldHVybiByLT5sZW5ndGg7CiB9CiAKLXN0YXRpYyBpbnQgaWlvX3NldF9sZW5ndGhfc3dfcmIoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqciwgaW50IGxlbmd0aCkKK3N0YXRpYyBpbnQgaWlvX3NldF9sZW5ndGhfc3dfcmIoc3RydWN0IGlpb19idWZmZXIgKnIsIGludCBsZW5ndGgpCiB7CiAJaWYgKHItPmxlbmd0aCAhPSBsZW5ndGgpIHsKIAkJci0+bGVuZ3RoID0gbGVuZ3RoOwpAQCAtMzg1LDIzICszODUsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpaW9fbWFya191cGRhdGVfbmVlZGVkX3N3X3JiKHN0cnVjdCBpaW9fcmluZ19idWZmZXIgKnIpCitzdGF0aWMgaW50IGlpb19tYXJrX3VwZGF0ZV9uZWVkZWRfc3dfcmIoc3RydWN0IGlpb19idWZmZXIgKnIpCiB7CiAJc3RydWN0IGlpb19zd19yaW5nX2J1ZmZlciAqcmluZyA9IGlpb190b19zd19yaW5nKHIpOwogCXJpbmctPnVwZGF0ZV9uZWVkZWQgPSB0cnVlOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBpaW9fc3dfcmJfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqciA9IHRvX2lpb19yaW5nX2J1ZmZlcihkZXYpOwotCWlpb19yaW5nX2FjY2Vzc19yZWxlYXNlKCZyLT5kZXYpOwotCWtmcmVlKGlpb190b19zd19yaW5nKHIpKTsKLX0KLQotc3RhdGljIElJT19SSU5HX0VOQUJMRV9BVFRSOwotc3RhdGljIElJT19SSU5HX0JZVEVTX1BFUl9EQVRVTV9BVFRSOwotc3RhdGljIElJT19SSU5HX0xFTkdUSF9BVFRSOworc3RhdGljIElJT19CVUZGRVJfRU5BQkxFX0FUVFI7CitzdGF0aWMgSUlPX0JVRkZFUl9CWVRFU19QRVJfREFUVU1fQVRUUjsKK3N0YXRpYyBJSU9fQlVGRkVSX0xFTkdUSF9BVFRSOwogCiAvKiBTdGFuZGFyZCBzZXQgb2YgcmluZyBidWZmZXIgYXR0cmlidXRlcyAqLwogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmlpb19yaW5nX2F0dHJpYnV0ZXNbXSA9IHsKQEAgLTQxMywyMSArNDA2LDEyIEBACiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGlpb19yaW5nX2F0dHJpYnV0ZV9ncm91cCA9IHsKIAkuYXR0cnMgPSBpaW9fcmluZ19hdHRyaWJ1dGVzLAorCS5uYW1lID0gImJ1ZmZlciIsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqaWlvX3JpbmdfYXR0cmlidXRlX2dyb3Vwc1tdID0gewotCSZpaW9fcmluZ19hdHRyaWJ1dGVfZ3JvdXAsCi0JTlVMTAotfTsKLQotc3RhdGljIHN0cnVjdCBkZXZpY2VfdHlwZSBpaW9fc3dfcmluZ190eXBlID0gewotCS5yZWxlYXNlID0gaWlvX3N3X3JiX3JlbGVhc2UsCi0JLmdyb3VwcyA9IGlpb19yaW5nX2F0dHJpYnV0ZV9ncm91cHMsCi19OwotCi1zdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICppaW9fc3dfcmJfYWxsb2NhdGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3N0cnVjdCBpaW9fYnVmZmVyICppaW9fc3dfcmJfYWxsb2NhdGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKLQlzdHJ1Y3QgaWlvX3JpbmdfYnVmZmVyICpidWY7CisJc3RydWN0IGlpb19idWZmZXIgKmJ1ZjsKIAlzdHJ1Y3QgaWlvX3N3X3JpbmdfYnVmZmVyICpyaW5nOwogCiAJcmluZyA9IGt6YWxsb2Moc2l6ZW9mICpyaW5nLCBHRlBfS0VSTkVMKTsKQEAgLTQzNSwyNCArNDE5LDIxIEBACiAJCXJldHVybiBOVUxMOwogCXJpbmctPnVwZGF0ZV9uZWVkZWQgPSB0cnVlOwogCWJ1ZiA9ICZyaW5nLT5idWY7Ci0JaWlvX3JpbmdfYnVmZmVyX2luaXQoYnVmLCBpbmRpb19kZXYpOworCWlpb19idWZmZXJfaW5pdChidWYsIGluZGlvX2Rldik7CiAJX19paW9faW5pdF9zd19yaW5nX2J1ZmZlcihyaW5nKTsKLQlidWYtPmRldi50eXBlID0gJmlpb19zd19yaW5nX3R5cGU7Ci0JYnVmLT5kZXYucGFyZW50ID0gJmluZGlvX2Rldi0+ZGV2OwotCWRldl9zZXRfZHJ2ZGF0YSgmYnVmLT5kZXYsICh2b2lkICopYnVmKTsKKwlidWYtPmF0dHJzID0gJmlpb19yaW5nX2F0dHJpYnV0ZV9ncm91cDsKIAogCXJldHVybiBidWY7CiB9CiBFWFBPUlRfU1lNQk9MKGlpb19zd19yYl9hbGxvY2F0ZSk7CiAKLXZvaWQgaWlvX3N3X3JiX2ZyZWUoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcikKK3ZvaWQgaWlvX3N3X3JiX2ZyZWUoc3RydWN0IGlpb19idWZmZXIgKnIpCiB7Ci0JaWYgKHIpCi0JCWlpb19wdXRfcmluZ19idWZmZXIocik7CisJa2ZyZWUoaWlvX3RvX3N3X3JpbmcocikpOwogfQogRVhQT1JUX1NZTUJPTChpaW9fc3dfcmJfZnJlZSk7CiAKLWNvbnN0IHN0cnVjdCBpaW9fcmluZ19hY2Nlc3NfZnVuY3MgcmluZ19zd19hY2Nlc3NfZnVuY3MgPSB7Citjb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9hY2Nlc3NfZnVuY3MgcmluZ19zd19hY2Nlc3NfZnVuY3MgPSB7CiAJLm1hcmtfaW5fdXNlID0gJmlpb19tYXJrX3N3X3JiX2luX3VzZSwKIAkudW5tYXJrX2luX3VzZSA9ICZpaW9fdW5tYXJrX3N3X3JiX2luX3VzZSwKIAkuc3RvcmVfdG8gPSAmaWlvX3N0b3JlX3RvX3N3X3JiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9yaW5nX3N3LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jpbmdfc3cuaAppbmRleCAxNTI3MTYzLi5hM2UxNTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jpbmdfc3cuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jpbmdfc3cuaApAQCAtMjMsMTMgKzIzLDEzIEBACiAKICNpZm5kZWYgX0lJT19SSU5HX1NXX0hfCiAjZGVmaW5lIF9JSU9fUklOR19TV19IXwotI2luY2x1ZGUgInJpbmdfZ2VuZXJpYy5oIgorI2luY2x1ZGUgImJ1ZmZlcl9nZW5lcmljLmgiCiAKIC8qKgogICogcmluZ19zd19hY2Nlc3NfZnVuY3MgLSBhY2Nlc3MgZnVuY3Rpb25zIGZvciBhIHNvZnR3YXJlIHJpbmcgYnVmZmVyCiAgKiovCi1leHRlcm4gY29uc3Qgc3RydWN0IGlpb19yaW5nX2FjY2Vzc19mdW5jcyByaW5nX3N3X2FjY2Vzc19mdW5jczsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaWlvX2J1ZmZlcl9hY2Nlc3NfZnVuY3MgcmluZ19zd19hY2Nlc3NfZnVuY3M7CiAKLXN0cnVjdCBpaW9fcmluZ19idWZmZXIgKmlpb19zd19yYl9hbGxvY2F0ZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKLXZvaWQgaWlvX3N3X3JiX2ZyZWUoc3RydWN0IGlpb19yaW5nX2J1ZmZlciAqcmluZyk7CitzdHJ1Y3QgaWlvX2J1ZmZlciAqaWlvX3N3X3JiX2FsbG9jYXRlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwordm9pZCBpaW9fc3dfcmJfZnJlZShzdHJ1Y3QgaWlvX2J1ZmZlciAqcmluZyk7CiAjZW5kaWYgLyogX0lJT19SSU5HX1NXX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3N5c2ZzLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3N5c2ZzLmgKaW5kZXggZGQ3OWI1OC4uODY4OTUyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9zeXNmcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vc3lzZnMuaApAQCAtMTIsMTkgKzEyLDE3IEBACiAjaWZuZGVmIF9JTkRVU1RSSUFMX0lPX1NZU0ZTX0hfCiAjZGVmaW5lIF9JTkRVU1RSSUFMX0lPX1NZU0ZTX0hfCiAKLSNpbmNsdWRlICJpaW8uaCIKK3N0cnVjdCBpaW9fY2hhbl9zcGVjOwogCiAvKioKICAqIHN0cnVjdCBpaW9fZGV2X2F0dHIgLSBpaW8gc3BlY2lmaWMgZGV2aWNlIGF0dHJpYnV0ZQogICogQGRldl9hdHRyOgl1bmRlcmx5aW5nIGRldmljZSBhdHRyaWJ1dGUKICAqIEBhZGRyZXNzOglhc3NvY2lhdGVkIHJlZ2lzdGVyIGFkZHJlc3MKLSAqIEB2YWwyOglzZWNvbmRhcnkgYXR0cmlidXRlIHZhbHVlCiAgKiBAbDoJCWxpc3QgaGVhZCBmb3IgbWFpbnRhaW5pbmcgbGlzdCBvZiBkeW5hbWljYWxseSBjcmVhdGVkIGF0dHJzLgogICovCiBzdHJ1Y3QgaWlvX2Rldl9hdHRyIHsKIAlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cjsKLQlpbnQgYWRkcmVzczsKLQlpbnQgdmFsMjsKKwl1NjQgYWRkcmVzczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGw7CiAJc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmM7CiB9OwpAQCAtNjQsMTAgKzYyLDYgQEAKIAlzdHJ1Y3QgaWlvX2Rldl9hdHRyIGlpb19kZXZfYXR0cl8jI192bmFtZQkJCVwKIAk9IElJT19BVFRSKF9uYW1lLCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgX2FkZHIpCiAKLSNkZWZpbmUgSUlPX0RFVklDRV9BVFRSXzIoX25hbWUsIF9tb2RlLCBfc2hvdywgX3N0b3JlLCBfYWRkciwgX3ZhbDIpCVwKLQlzdHJ1Y3QgaWlvX2Rldl9hdHRyIGlpb19kZXZfYXR0cl8jI19uYW1lCQkJXAotCT0gSUlPX0FUVFJfMihfbmFtZSwgX21vZGUsIF9zaG93LCBfc3RvcmUsIF9hZGRyLCBfdmFsMikKLQogI2RlZmluZSBJSU9fQ09OU1RfQVRUUihfbmFtZSwgX3N0cmluZykJCQkJCVwKIAlzdHJ1Y3QgaWlvX2NvbnN0X2F0dHIgaWlvX2NvbnN0X2F0dHJfIyNfbmFtZQkJCVwKIAk9IHsgLnN0cmluZyA9IF9zdHJpbmcsCQkJCQkJXApAQCAtNzcsMTcgKzcxLDggQEAKIAlzdHJ1Y3QgaWlvX2NvbnN0X2F0dHIgaWlvX2NvbnN0X2F0dHJfIyNfdm5hbWUJCQlcCiAJPSB7IC5zdHJpbmcgPSBfc3RyaW5nLAkJCQkJCVwKIAkgICAgLmRldl9hdHRyID0gX19BVFRSKF9uYW1lLCBTX0lSVUdPLCBpaW9fcmVhZF9jb25zdF9hdHRyLCBOVUxMKX0KKwogLyogR2VuZXJpYyBhdHRyaWJ1dGVzIG9mIG9uZXR5cGUgb3IgYW5vdGhlciAqLwotCi0vKioKLSAqIElJT19ERVZfQVRUUl9SRVYgLSByZXZpc2lvbiBudW1iZXIgZm9yIHRoZSBkZXZpY2UKLSAqIEBfc2hvdzogb3V0cHV0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZQotICoKLSAqIFZlcnkgbXVjaCBkZXZpY2UgZGVwZW5kZW50LgotICoqLwotI2RlZmluZSBJSU9fREVWX0FUVFJfUkVWKF9zaG93KQkJCVwKLQlJSU9fREVWSUNFX0FUVFIocmV2aXNpb24sIFNfSVJVR08sIF9zaG93LCBOVUxMLCAwKQotCiAvKioKICAqIElJT19ERVZfQVRUUl9SRVNFVDogcmVzZXRzIHRoZSBkZXZpY2UKICAqKi8KQEAgLTk1LDEzICs4MCw2IEBACiAJSUlPX0RFVklDRV9BVFRSKHJlc2V0LCBTX0lXVVNSLCBOVUxMLCBfc3RvcmUsIDApCiAKIC8qKgotICogSUlPX0NPTlNUX0FUVFJfTkFNRSAtIGNvbnN0YW50IGlkZW50aWZpZXIKLSAqIEBfc3RyaW5nOiB0aGUgbmFtZQotICoqLwotI2RlZmluZSBJSU9fQ09OU1RfQVRUUl9OQU1FKF9zdHJpbmcpCQkJCVwKLQlJSU9fQ09OU1RfQVRUUihuYW1lLCBfc3RyaW5nKQotCi0vKioKICAqIElJT19ERVZfQVRUUl9TQU1QX0ZSRVEgLSBzZXRzIGFueSBpbnRlcm5hbCBjbG9jayBmcmVxdWVuY3kKICAqIEBfbW9kZTogc3lzZnMgZmlsZSBtb2RlL3Blcm1pc3Npb25zCiAgKiBAX3Nob3c6IG91dHB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKQEAgLTExMSwxNSArODksMTEgQEAKIAlJSU9fREVWSUNFX0FUVFIoc2FtcGxpbmdfZnJlcXVlbmN5LCBfbW9kZSwgX3Nob3csIF9zdG9yZSwgMCkKIAogLyoqCi0gKiBJSU9fREVWX0FUVFJfQVZBSUxfU0FNUF9GUkVRIC0gbGlzdCBhdmFpbGFibGUgc2FtcGxpbmcgZnJlcXVlbmNpZXMKKyAqIElJT19ERVZfQVRUUl9TQU1QX0ZSRVFfQVZBSUwgLSBsaXN0IGF2YWlsYWJsZSBzYW1wbGluZyBmcmVxdWVuY2llcwogICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCiAgKgogICogTWF5IGJlIG1vZGUgZGVwZW5kZW50IG9uIHNvbWUgZGV2aWNlcwogICoqLwotLyogRGVwcmVjYXRlZCAqLwotI2RlZmluZSBJSU9fREVWX0FUVFJfQVZBSUxfU0FNUF9GUkVRKF9zaG93KQkJCQlcCi0JSUlPX0RFVklDRV9BVFRSKGF2YWlsYWJsZV9zYW1wbGluZ19mcmVxdWVuY3ksIFNfSVJVR08sIF9zaG93LCBOVUxMLCAwKQotCiAjZGVmaW5lIElJT19ERVZfQVRUUl9TQU1QX0ZSRVFfQVZBSUwoX3Nob3cpCQkJCVwKIAlJSU9fREVWSUNFX0FUVFIoc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZSwgU19JUlVHTywgX3Nob3csIE5VTEwsIDApCiAvKioKQEAgLTEzMSw5MiArMTA1LDU2IEBACiAjZGVmaW5lIElJT19DT05TVF9BVFRSX1NBTVBfRlJFUV9BVkFJTChfc3RyaW5nKQkJCVwKIAlJSU9fQ09OU1RfQVRUUihzYW1wbGluZ19mcmVxdWVuY3lfYXZhaWxhYmxlLCBfc3RyaW5nKQogCi0vKioKLSAqIElJT19ERVZfQVRUUl9TV19SSU5HX0VOQUJMRSAtIGVuYWJsZSBzb2Z0d2FyZSByaW5nIGJ1ZmZlcgotICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCi0gKiBAX3N0b3JlOiBpbnB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKLSAqCi0gKiBTdWNjZXNzIG1heSBiZSBkZXBlbmRlbnQgb24gYXR0YWNobWVudCBvZiB0cmlnZ2VyIHByZXZpb3VzbHkuCi0gKiovCi0jZGVmaW5lIElJT19ERVZfQVRUUl9TV19SSU5HX0VOQUJMRShfc2hvdywgX3N0b3JlKQkJCVwKLQlJSU9fREVWSUNFX0FUVFIoc3dfcmluZ19lbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLCBfc2hvdywgX3N0b3JlLCAwKQotCi0vKioKLSAqIElJT19ERVZfQVRUUl9IV19SSU5HX0VOQUJMRSAtIGVuYWJsZSBoYXJkd2FyZSByaW5nIGJ1ZmZlcgotICogQF9zaG93OiBvdXRwdXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlCi0gKiBAX3N0b3JlOiBpbnB1dCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUKLSAqCi0gKiBUaGlzIGlzIGEgZGlmZmVyZW50IGF0dHJpYnV0ZSBmcm9tIHRoZSBzb2Z0d2FyZSBvbmUgYXMgb25lIGNhbiBlbnZpc2lvbgotICogc2NoZW1lcyB3aGVyZSBhIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gbWF5IGJlIHVzZWQuCi0gKiovCi0jZGVmaW5lIElJT19ERVZfQVRUUl9IV19SSU5HX0VOQUJMRShfc2hvdywgX3N0b3JlKQkJCVwKLQlJSU9fREVWSUNFX0FUVFIoaHdfcmluZ19lbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLCBfc2hvdywgX3N0b3JlLCAwKQotCiAjZGVmaW5lIElJT19ERVZfQVRUUl9URU1QX1JBVyhfc2hvdykJCQlcCi0JSUlPX0RFVklDRV9BVFRSKHRlbXBfcmF3LCBTX0lSVUdPLCBfc2hvdywgTlVMTCwgMCkKKwlJSU9fREVWSUNFX0FUVFIoaW5fdGVtcF9yYXcsIFNfSVJVR08sIF9zaG93LCBOVUxMLCAwKQogCiAjZGVmaW5lIElJT19DT05TVF9BVFRSX1RFTVBfT0ZGU0VUKF9zdHJpbmcpCQlcCi0JSUlPX0NPTlNUX0FUVFIodGVtcF9vZmZzZXQsIF9zdHJpbmcpCisJSUlPX0NPTlNUX0FUVFIoaW5fdGVtcF9vZmZzZXQsIF9zdHJpbmcpCiAKICNkZWZpbmUgSUlPX0NPTlNUX0FUVFJfVEVNUF9TQ0FMRShfc3RyaW5nKQkJXAotCUlJT19DT05TVF9BVFRSKHRlbXBfc2NhbGUsIF9zdHJpbmcpCisJSUlPX0NPTlNUX0FUVFIoaW5fdGVtcF9zY2FsZSwgX3N0cmluZykKIAotLyogbXVzdCBtYXRjaCBvdXIgY2hhbm5lbCBkZWZzICovCi0jZGVmaW5lIElJT19FVl9DTEFTU19JTgkJCUlJT19JTgotI2RlZmluZSBJSU9fRVZfQ0xBU1NfSU5fRElGRgkJSUlPX0lOX0RJRkYKLSNkZWZpbmUgSUlPX0VWX0NMQVNTX0FDQ0VMCQlJSU9fQUNDRUwKLSNkZWZpbmUgSUlPX0VWX0NMQVNTX0dZUk8JCUlJT19HWVJPCi0jZGVmaW5lIElJT19FVl9DTEFTU19NQUdOCQlJSU9fTUFHTgotI2RlZmluZSBJSU9fRVZfQ0xBU1NfTElHSFQJCUlJT19MSUdIVAotI2RlZmluZSBJSU9fRVZfQ0xBU1NfUFJPWElNSVRZCQlJSU9fUFJPWElNSVRZCi0jZGVmaW5lIElJT19FVl9DTEFTU19URU1QCQlJSU9fVEVNUAorZW51bSBpaW9fZXZlbnRfdHlwZSB7CisJSUlPX0VWX1RZUEVfVEhSRVNILAorCUlJT19FVl9UWVBFX01BRywKKwlJSU9fRVZfVFlQRV9ST0MsCisJSUlPX0VWX1RZUEVfVEhSRVNIX0FEQVBUSVZFLAorCUlJT19FVl9UWVBFX01BR19BREFQVElWRSwKK307CiAKLSNkZWZpbmUgSUlPX0VWX01PRF9YCQkJSUlPX01PRF9YCi0jZGVmaW5lIElJT19FVl9NT0RfWQkJCUlJT19NT0RfWQotI2RlZmluZSBJSU9fRVZfTU9EX1oJCQlJSU9fTU9EX1oKLSNkZWZpbmUgSUlPX0VWX01PRF9YX0FORF9ZCQlJSU9fTU9EX1hfQU5EX1kKLSNkZWZpbmUgSUlPX0VWX01PRF9YX0FOWF9aCQlJSU9fTU9EX1hfQU5EX1oKLSNkZWZpbmUgSUlPX0VWX01PRF9ZX0FORF9aCQlJSU9fTU9EX1lfQU5EX1oKLSNkZWZpbmUgSUlPX0VWX01PRF9YX0FORF9ZX0FORF9aCUlJT19NT0RfWF9BTkRfWV9BTkRfWgotI2RlZmluZSBJSU9fRVZfTU9EX1hfT1JfWQkJSUlPX01PRF9YX09SX1kKLSNkZWZpbmUgSUlPX0VWX01PRF9YX09SX1oJCUlJT19NT0RfWF9PUl9aCi0jZGVmaW5lIElJT19FVl9NT0RfWV9PUl9aCQlJSU9fTU9EX1lfT1JfWgotI2RlZmluZSBJSU9fRVZfTU9EX1hfT1JfWV9PUl9aCQlJSU9fTU9EX1hfT1JfWV9PUl9aCitlbnVtIGlpb19ldmVudF9kaXJlY3Rpb24geworCUlJT19FVl9ESVJfRUlUSEVSLAorCUlJT19FVl9ESVJfUklTSU5HLAorCUlJT19FVl9ESVJfRkFMTElORywKK307CiAKLSNkZWZpbmUgSUlPX0VWX1RZUEVfVEhSRVNICQkwCi0jZGVmaW5lIElJT19FVl9UWVBFX01BRwkJCTEKLSNkZWZpbmUgSUlPX0VWX1RZUEVfUk9DCQkJMgorI2RlZmluZSBJSU9fRVZFTlRfQ09ERShjaGFuX3R5cGUsIGRpZmYsIG1vZGlmaWVyLCBkaXJlY3Rpb24sCQlcCisJCSAgICAgICB0eXBlLCBjaGFuLCBjaGFuMSwgY2hhbjIpCQkJXAorCSgoKHU2NCl0eXBlIDw8IDU2KSB8ICgodTY0KWRpZmYgPDwgNTUpIHwJCQlcCisJICgodTY0KWRpcmVjdGlvbiA8PCA0OCkgfCAoKHU2NCltb2RpZmllciA8PCA0MCkgfAkJXAorCSAoKHU2NCljaGFuX3R5cGUgPDwgMzIpIHwgKGNoYW4yIDw8IDE2KSB8IGNoYW4xIHwgY2hhbikKIAotI2RlZmluZSBJSU9fRVZfRElSX0VJVEhFUgkJMAotI2RlZmluZSBJSU9fRVZfRElSX1JJU0lORwkJMQotI2RlZmluZSBJSU9fRVZfRElSX0ZBTExJTkcJCTIKLQotI2RlZmluZSBJSU9fRVZfVFlQRV9NQVggOAorI2RlZmluZSBJSU9fRVZfRElSX01BWCA0CiAjZGVmaW5lIElJT19FVl9CSVQodHlwZSwgZGlyZWN0aW9uKQkJCVwKLQkoMSA8PCAodHlwZSpJSU9fRVZfVFlQRV9NQVggKyBkaXJlY3Rpb24pKQotCi0jZGVmaW5lIElJT19FVkVOVF9DT0RFKGNoYW5uZWxjbGFzcywgb3JpZW50X2JpdCwgbnVtYmVyLAkJXAotCQkgICAgICAgbW9kaWZpZXIsIHR5cGUsIGRpcmVjdGlvbikJCQlcCi0JKGNoYW5uZWxjbGFzcyB8IChvcmllbnRfYml0IDw8IDgpIHwgKChudW1iZXIpIDw8IDkpIHwJCVwKLQkgKChtb2RpZmllcikgPDwgMTMpIHwgKCh0eXBlKSA8PCAxNikgfCAoKGRpcmVjdGlvbikgPDwgMjQpKQorCSgxIDw8ICh0eXBlKklJT19FVl9ESVJfTUFYICsgZGlyZWN0aW9uKSkKIAogI2RlZmluZSBJSU9fTU9EX0VWRU5UX0NPREUoY2hhbm5lbGNsYXNzLCBudW1iZXIsIG1vZGlmaWVyLAkJXAogCQkJICAgdHlwZSwgZGlyZWN0aW9uKQkJCQlcCi0JSUlPX0VWRU5UX0NPREUoY2hhbm5lbGNsYXNzLCAxLCBudW1iZXIsIG1vZGlmaWVyLCB0eXBlLCBkaXJlY3Rpb24pCisJSUlPX0VWRU5UX0NPREUoY2hhbm5lbGNsYXNzLCAwLCBtb2RpZmllciwgZGlyZWN0aW9uLCB0eXBlLCBudW1iZXIsIDAsIDApCiAKICNkZWZpbmUgSUlPX1VOTU9EX0VWRU5UX0NPREUoY2hhbm5lbGNsYXNzLCBudW1iZXIsIHR5cGUsIGRpcmVjdGlvbikJXAotCUlJT19FVkVOVF9DT0RFKGNoYW5uZWxjbGFzcywgMCwgbnVtYmVyLCAwLCB0eXBlLCBkaXJlY3Rpb24pCisJSUlPX0VWRU5UX0NPREUoY2hhbm5lbGNsYXNzLCAwLCAwLCBkaXJlY3Rpb24sIHR5cGUsIG51bWJlciwgMCwgMCkKIAorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX1RZUEUobWFzaykgKChtYXNrID4+IDU2KSAmIDB4RkYpCiAKLSNkZWZpbmUgSUlPX0JVRkZFUl9FVkVOVF9DT0RFKGNvZGUpCQlcCi0JKElJT19FVl9DTEFTU19CVUZGRVIgfCAoY29kZSA8PCA4KSkKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9ESVIobWFzaykgKChtYXNrID4+IDQ4KSAmIDB4Q0YpCiAKLSNkZWZpbmUgSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9ESVIobWFzaykgKChtYXNrID4+IDI0KSAmIDB4ZikKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9DSEFOX1RZUEUobWFzaykgKChtYXNrID4+IDMyKSAmIDB4RkYpCiAKIC8qIEV2ZW50IGNvZGUgbnVtYmVyIGV4dHJhY3Rpb24gZGVwZW5kcyBvbiB3aGljaCB0eXBlIG9mIGV2ZW50IHdlIGhhdmUuCiAgKiBQZXJoYXBzIHJldmlldyB0aGlzIGZ1bmN0aW9uIGluIHRoZSBmdXR1cmUqLwotI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX05VTShtYXNrKSAoKG1hc2sgPj4gOSkgJiAweDBmKQorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX05VTShtYXNrKSAobWFzayAmIDB4RkZGRikKIAotI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX01PRElGSUVSKG1hc2spICgobWFzayA+PiAxMykgJiAweDcpCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfTU9ESUZJRVIobWFzaykgKChtYXNrID4+IDQwKSAmIDB4RkYpCiAKICNlbmRpZiAvKiBfSU5EVVNUUklBTF9JT19TWVNGU19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIuaAppbmRleCBlMGI1OGVkLi41OThmY2IzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIuaApAQCAtNyw2ICs3LDcgQEAKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2lmbmRlZiBfSUlPX1RSSUdHRVJfSF8KICNkZWZpbmUgX0lJT19UUklHR0VSX0hfCkBAIC0xNiw2ICsxNywyNyBAQAogfTsKIAogLyoqCisgKiBzdHJ1Y3QgaWlvX3RyaWdnZXJfb3BzIC0gb3BlcmF0aW9ucyBzdHJ1Y3R1cmUgZm9yIGFuIGlpb190cmlnZ2VyLgorICogQG93bmVyOgkJdXNlZCB0byBtb25pdG9yIHVzYWdlIGNvdW50IG9mIHRoZSB0cmlnZ2VyLgorICogQHNldF90cmlnZ2VyX3N0YXRlOglzd2l0Y2ggb24vb2ZmIHRoZSB0cmlnZ2VyIG9uIGRlbWFuZAorICogQHRyeV9yZWVuYWJsZToJZnVuY3Rpb24gdG8gcmVlbmFibGUgdGhlIHRyaWdnZXIgd2hlbiB0aGUKKyAqCQkJdXNlIGNvdW50IGlzIHplcm8gKG1heSBiZSBOVUxMKQorICogQHZhbGlkYXRlX2RldmljZToJZnVuY3Rpb24gdG8gdmFsaWRhdGUgdGhlIGRldmljZSB3aGVuIHRoZQorICoJCQljdXJyZW50IHRyaWdnZXIgZ2V0cyBjaGFuZ2VkLgorICoKKyAqIFRoaXMgaXMgdHlwaWNhbGx5IHN0YXRpYyBjb25zdCB3aXRoaW4gYSBkcml2ZXIgYW5kIHNoYXJlZCBieQorICogaW5zdGFuY2VzIG9mIGEgZ2l2ZW4gZGV2aWNlLgorICoqLworc3RydWN0IGlpb190cmlnZ2VyX29wcyB7CisJc3RydWN0IG1vZHVsZQkJCSpvd25lcjsKKwlpbnQgKCpzZXRfdHJpZ2dlcl9zdGF0ZSkoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnLCBib29sIHN0YXRlKTsKKwlpbnQgKCp0cnlfcmVlbmFibGUpKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZyk7CisJaW50ICgqdmFsaWRhdGVfZGV2aWNlKShzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcsCisJCQkgICAgICAgc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7Cit9OworCisKKy8qKgogICogc3RydWN0IGlpb190cmlnZ2VyIC0gaW5kdXN0cmlhbCBJL08gdHJpZ2dlciBkZXZpY2UKICAqCiAgKiBAaWQ6CQkJW0lOVEVSTl0gdW5pcXVlIGlkIG51bWJlcgpAQCAtMjYsMTEgKzQ4LDYgQEAKICAqIEBhbGxvY19saXN0OgkJW0RSSVZFUl0gdXNlZCBmb3IgZHJpdmVyIHNwZWNpZmljIHRyaWdnZXIgbGlzdAogICogQG93bmVyOgkJW0RSSVZFUl0gdXNlZCB0byBtb25pdG9yIHVzYWdlIGNvdW50IG9mIHRoZSB0cmlnZ2VyLgogICogQHVzZV9jb3VudDoJCXVzZSBjb3VudCBmb3IgdGhlIHRyaWdnZXIKLSAqIEBzZXRfdHJpZ2dlcl9zdGF0ZToJW0RSSVZFUl0gc3dpdGNoIG9uL29mZiB0aGUgdHJpZ2dlciBvbiBkZW1hbmQKLSAqIEB0cnlfcmVlbmFibGU6CWZ1bmN0aW9uIHRvIHJlZW5hYmxlIHRoZSB0cmlnZ2VyIHdoZW4gdGhlCi0gKgkJCXVzZSBjb3VudCBpcyB6ZXJvIChtYXkgYmUgTlVMTCkKLSAqIEB2YWxpZGF0ZV9kZXZpY2U6CWZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSBkZXZpY2Ugd2hlbiB0aGUKLSAqCQkJY3VycmVudCB0cmlnZ2VyIGdldHMgY2hhbmdlZC4KICAqIEBzdWJpcnFfY2hpcDoJW0lOVEVSTl0gYXNzb2NpYXRlICd2aXJ0dWFsJyBpcnEgY2hpcC4KICAqIEBzdWJpcnFfYmFzZToJW0lOVEVSTl0gYmFzZSBudW1iZXIgZm9yIGlycXMgcHJvdmlkZWQgYnkgdHJpZ2dlci4KICAqIEBzdWJpcnFzOgkJW0lOVEVSTl0gaW5mb3JtYXRpb24gYWJvdXQgdGhlICdjaGlsZCcgaXJxcy4KQEAgLTM4LDYgKzU1LDcgQEAKICAqIEBwb29sX2xvY2s6CQlbSU5URVJOXSBwcm90ZWN0aW9uIG9mIHRoZSBpcnEgcG9vbC4KICAqKi8KIHN0cnVjdCBpaW9fdHJpZ2dlciB7CisJY29uc3Qgc3RydWN0IGlpb190cmlnZ2VyX29wcwkqb3BzOwogCWludAkJCQlpZDsKIAljb25zdCBjaGFyCQkJKm5hbWU7CiAJc3RydWN0IGRldmljZQkJCWRldjsKQEAgLTQ4LDExICs2Niw2IEBACiAJc3RydWN0IG1vZHVsZQkJCSpvd25lcjsKIAlpbnQgdXNlX2NvdW50OwogCi0JaW50ICgqc2V0X3RyaWdnZXJfc3RhdGUpKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywgYm9vbCBzdGF0ZSk7Ci0JaW50ICgqdHJ5X3JlZW5hYmxlKShzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcpOwotCWludCAoKnZhbGlkYXRlX2RldmljZSkoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnLAotCQkJICAgICAgIHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpOwotCiAJc3RydWN0IGlycV9jaGlwCQkJc3ViaXJxX2NoaXA7CiAJaW50CQkJCXN1YmlycV9iYXNlOwogCkBAIC02MSwyOSArNzQsNiBAQAogCXN0cnVjdCBtdXRleAkJCXBvb2xfbG9jazsKIH07CiAKLS8qKgotICogc3RydWN0IGlpb19wb2xsX2Z1bmMgLSBwb2xsIGZ1bmN0aW9uIHBhaXIKLSAqCi0gKiBAcHJpdmF0ZV9kYXRhOgkJZGF0YSBzcGVjaWZpYyB0byBkZXZpY2UgKHBhc3NlZCBpbnRvIHBvbGwgZnVuYykKLSAqIEBoOgkJCQl0aGUgZnVuY3Rpb24gdGhhdCBpcyBhY3R1YWxseSBydW4gb24gdHJpZ2dlcgotICogQHRocmVhZDoJCQl0aHJlYWRlZCBpbnRlcnJ1cHQgcGFydAotICogQHR5cGU6CQkJdGhlIHR5cGUgb2YgaW50ZXJydXB0IChiYXNpY2FsbHkgaWYgb25lc2hvdCkKLSAqIEBuYW1lOgkJCW5hbWUgdXNlZCB0byBpZGVudGlmeSB0aGUgdHJpZ2dlciBjb25zdW1lci4KLSAqIEBpcnE6CQkJdGhlIGNvcnJlc3BvbmRpbmcgaXJxIGFzIGFsbG9jYXRlZCBmcm9tIHRoZQotICoJCQkJdHJpZ2dlciBwb29sCi0gKiBAdGltZXN0YW1wOgkJCXNvbWUgZGV2aWNlcyBuZWVkIGEgdGltZXN0YW1wIGdyYWJiZWQgYXMgc29vbgotICoJCQkJYXMgcG9zc2libGUgYWZ0ZXIgdGhlIHRyaWdnZXIgLSBoZW5jZSBoYW5kbGVyCi0gKgkJCQlwYXNzZXMgaXQgdmlhIGhlcmUuCi0gKiovCi1zdHJ1Y3QgaWlvX3BvbGxfZnVuYyB7Ci0Jdm9pZAkJCQkqcHJpdmF0ZV9kYXRhOwotCWlycXJldHVybl90ICgqaCkoaW50IGlycSwgdm9pZCAqcCk7Ci0JaXJxcmV0dXJuX3QgKCp0aHJlYWQpKGludCBpcnEsIHZvaWQgKnApOwotCWludCB0eXBlOwotCWNoYXIgKm5hbWU7Ci0JaW50IGlycTsKLQlzNjQgdGltZXN0YW1wOwotfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRvX2lpb190cmlnZ2VyKHN0cnVjdCBkZXZpY2UgKmQpCiB7CkBAIC05MiwxNCArODIsMTQgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGlpb19wdXRfdHJpZ2dlcihzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcpCiB7CisJbW9kdWxlX3B1dCh0cmlnLT5vcHMtPm93bmVyKTsKIAlwdXRfZGV2aWNlKCZ0cmlnLT5kZXYpOwotCW1vZHVsZV9wdXQodHJpZy0+b3duZXIpOwogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIGlpb19nZXRfdHJpZ2dlcihzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcpCiB7Ci0JX19tb2R1bGVfZ2V0KHRyaWctPm93bmVyKTsKIAlnZXRfZGV2aWNlKCZ0cmlnLT5kZXYpOworCV9fbW9kdWxlX2dldCh0cmlnLT5vcHMtPm93bmVyKTsKIH07CiAKIC8qKgpAQCAtMTE1LDIzICsxMDUsNiBAQAogdm9pZCBpaW9fdHJpZ2dlcl91bnJlZ2lzdGVyKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZ19pbmZvKTsKIAogLyoqCi0gKiBpaW9fdHJpZ2dlcl9hdHRhY2hfcG9sbF9mdW5jKCkgLSBhZGQgYSBmdW5jdGlvbiBwYWlyIHRvIGJlIHJ1biBvbiB0cmlnZ2VyCi0gKiBAdHJpZzoJdHJpZ2dlciB0byB3aGljaCB0aGUgZnVuY3Rpb24gcGFpciBhcmUgYmVpbmcgYWRkZWQKLSAqIEBwZjoJCXBvbGwgZnVuY3Rpb24gcGFpcgotICoqLwotaW50IGlpb190cmlnZ2VyX2F0dGFjaF9wb2xsX2Z1bmMoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnLAotCQkJCSBzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqcGYpOwotCi0vKioKLSAqIGlpb190cmlnZ2VyX2RldHRhY2hfcG9sbF9mdW5jKCkgLQlyZW1vdmUgZnVuY3Rpb24gcGFpciBmcm9tIHRob3NlIHRvIGJlCi0gKgkJCQkJcnVuIG9uIHRyaWdnZXIKLSAqIEB0cmlnOgl0cmlnZ2VyIGZyb20gd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGJlaW5nIHJlbW92ZWQKLSAqIEBwZjoJCXBvbGwgZnVuY3Rpb24gcGFpcgotICoqLwotaW50IGlpb190cmlnZ2VyX2RldHRhY2hfcG9sbF9mdW5jKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywKLQkJCQkgIHN0cnVjdCBpaW9fcG9sbF9mdW5jICpwZik7Ci0KLS8qKgogICogaWlvX3RyaWdnZXJfcG9sbCgpIC0gY2FsbGVkIG9uIGEgdHJpZ2dlciBvY2N1cnJpbmcKICAqIEB0cmlnOiB0cmlnZ2VyIHdoaWNoIG9jY3VycmVkCiAgKgpAQCAtMTM5LDQ4ICsxMTIsOSBAQAogICoqLwogdm9pZCBpaW9fdHJpZ2dlcl9wb2xsKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZywgczY0IHRpbWUpOwogdm9pZCBpaW9fdHJpZ2dlcl9wb2xsX2NoYWluZWQoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnLCBzNjQgdGltZSk7Ci12b2lkIGlpb190cmlnZ2VyX25vdGlmeV9kb25lKHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZyk7CiAKIGlycXJldHVybl90IGlpb190cmlnZ2VyX2dlbmVyaWNfZGF0YV9yZHlfcG9sbChpbnQgaXJxLCB2b2lkICpwcml2YXRlKTsKIAotc3RhdGljIGlubGluZSBpbnQgaWlvX3RyaWdnZXJfZ2V0X2lycShzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcpCi17Ci0JaW50IHJldDsKLQltdXRleF9sb2NrKCZ0cmlnLT5wb29sX2xvY2spOwotCXJldCA9IGJpdG1hcF9maW5kX2ZyZWVfcmVnaW9uKHRyaWctPnBvb2wsCi0JCQkJICAgICAgQ09ORklHX0lJT19DT05TVU1FUlNfUEVSX1RSSUdHRVIsCi0JCQkJICAgICAgaWxvZzIoMSkpOwotCW11dGV4X3VubG9jaygmdHJpZy0+cG9vbF9sb2NrKTsKLQlpZiAocmV0ID49IDApCi0JCXJldCArPSB0cmlnLT5zdWJpcnFfYmFzZTsKLQotCXJldHVybiByZXQ7Ci19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQgaWlvX3RyaWdnZXJfcHV0X2lycShzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcsIGludCBpcnEpCi17Ci0JbXV0ZXhfbG9jaygmdHJpZy0+cG9vbF9sb2NrKTsKLQljbGVhcl9iaXQoaXJxIC0gdHJpZy0+c3ViaXJxX2Jhc2UsIHRyaWctPnBvb2wpOwotCW11dGV4X3VubG9jaygmdHJpZy0+cG9vbF9sb2NrKTsKLX07Ci0KLXN0cnVjdCBpaW9fcG9sbF9mdW5jCi0qaWlvX2FsbG9jX3BvbGxmdW5jKGlycXJldHVybl90ICgqaCkoaW50IGlycSwgdm9pZCAqcCksCi0JCSAgICBpcnFyZXR1cm5fdCAoKnRocmVhZCkoaW50IGlycSwgdm9pZCAqcCksCi0JCSAgICBpbnQgdHlwZSwKLQkJICAgIHZvaWQgKnByaXZhdGUsCi0JCSAgICBjb25zdCBjaGFyICpmbXQsCi0JCSAgICAuLi4pOwotdm9pZCBpaW9fZGVhbGxvY19wb2xsZnVuYyhzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqcGYpOwotaXJxcmV0dXJuX3QgaWlvX3BvbGxmdW5jX3N0b3JlX3RpbWUoaW50IGlycSwgdm9pZCAqcCk7Ci0KLS8qCi0gKiBUd28gZnVuY3Rpb25zIGZvciBjb21tb24gY2FzZSB3aGVyZSBhbGwgdGhhdCBoYXBwZW5zIGlzIGEgcG9sbGZ1bmMKLSAqIGlzIGF0dGFjaGVkIGFuZCBkZXRhY2hlZCBmcm9tIGEgdHJpZ2dlcgotICovCi1pbnQgaWlvX3RyaWdnZXJlZF9yaW5nX3Bvc3RlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7Ci1pbnQgaWlvX3RyaWdnZXJlZF9yaW5nX3ByZWRpc2FibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7Ci0KIHN0cnVjdCBpaW9fdHJpZ2dlciAqaWlvX2FsbG9jYXRlX3RyaWdnZXIoY29uc3QgY2hhciAqZm10LCAuLi4pCiAJX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKIHZvaWQgaWlvX2ZyZWVfdHJpZ2dlcihzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyL2lpby10cmlnLWJmaW4tdGltZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci9paW8tdHJpZy1iZmluLXRpbWVyLmMKaW5kZXggNGYxNzI5NS4uMWNiYjI1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyL2lpby10cmlnLWJmaW4tdGltZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIvaWlvLXRyaWctYmZpbi10aW1lci5jCkBAIC0xNDMsNiArMTQzLDEwIEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX3RyaWdnZXJfb3BzIGlpb19iZmluX3Rtcl90cmlnZ2VyX29wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGlpb19iZmluX3Rtcl90cmlnZ2VyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGJmaW5fdG1yX3N0YXRlICpzdDsKQEAgLTE3NSw3ICsxNzksNyBAQAogCX0KIAogCXN0LT50cmlnLT5wcml2YXRlX2RhdGEgPSBzdDsKLQlzdC0+dHJpZy0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlzdC0+dHJpZy0+b3BzID0gJmlpb19iZmluX3Rtcl90cmlnZ2VyX29wczsKIAlzdC0+dHJpZy0+ZGV2Lmdyb3VwcyA9IGlpb19iZmluX3Rtcl90cmlnZ2VyX2F0dHJfZ3JvdXBzOwogCXJldCA9IGlpb190cmlnZ2VyX3JlZ2lzdGVyKHN0LT50cmlnKTsKIAlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyL2lpby10cmlnLWdwaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci9paW8tdHJpZy1ncGlvLmMKaW5kZXggZjFmYjc5NS4uZjJhNjU1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyL2lpby10cmlnLWdwaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIvaWlvLXRyaWctZ3Bpby5jCkBAIC00Nyw2ICs0NywxMCBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fdHJpZ2dlcl9vcHMgaWlvX2dwaW9fdHJpZ2dlcl9vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCiBzdGF0aWMgaW50IGlpb19ncGlvX3RyaWdnZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgaWlvX2dwaW9fdHJpZ2dlcl9pbmZvICp0cmlnX2luZm87CkBAIC04MSw3ICs4NSw3IEBACiAJCQl9CiAJCQl0cmlnLT5wcml2YXRlX2RhdGEgPSB0cmlnX2luZm87CiAJCQl0cmlnX2luZm8tPmlycSA9IGlycTsKLQkJCXRyaWctPm93bmVyID0gVEhJU19NT0RVTEU7CisJCQl0cmlnLT5vcHMgPSAmaWlvX2dwaW9fdHJpZ2dlcl9vcHM7CiAJCQlyZXQgPSByZXF1ZXN0X2lycShpcnEsIGlpb19ncGlvX3RyaWdnZXJfcG9sbCwKIAkJCQkJICBpcnFmbGFncywgdHJpZy0+bmFtZSwgdHJpZyk7CiAJCQlpZiAocmV0KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIvaWlvLXRyaWctcGVyaW9kaWMtcnRjLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIvaWlvLXRyaWctcGVyaW9kaWMtcnRjLmMKaW5kZXggMDFjZjdlMi4uZDM1ZDA4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyL2lpby10cmlnLXBlcmlvZGljLXJ0Yy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci9paW8tdHJpZy1wZXJpb2RpYy1ydGMuYwpAQCAtOTYsNiArOTYsMTEgQEAKIAlpaW9fdHJpZ2dlcl9wb2xsKHByaXZhdGVfZGF0YSwgMCk7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX3RyaWdnZXJfb3BzIGlpb19wcnRjX3RyaWdnZXJfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5zZXRfdHJpZ2dlcl9zdGF0ZSA9ICZpaW9fdHJpZ19wZXJpb2RpY19ydGNfc2V0X3N0YXRlLAorfTsKKwogc3RhdGljIGludCBpaW9fdHJpZ19wZXJpb2RpY19ydGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewogCWNoYXIgKipwZGF0YSA9IGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CkBAIC0xMjEsNyArMTI2LDcgQEAKIAkJfQogCQl0cmlnLT5wcml2YXRlX2RhdGEgPSB0cmlnX2luZm87CiAJCXRyaWctPm93bmVyID0gVEhJU19NT0RVTEU7Ci0JCXRyaWctPnNldF90cmlnZ2VyX3N0YXRlID0gJmlpb190cmlnX3BlcmlvZGljX3J0Y19zZXRfc3RhdGU7CisJCXRyaWctPm9wcyA9ICZpaW9fcHJ0Y190cmlnZ2VyX29wczsKIAkJLyogUlRDIGFjY2VzcyAqLwogCQl0cmlnX2luZm8tPnJ0YwogCQkJPSBydGNfY2xhc3Nfb3BlbihwZGF0YVtpXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIvaWlvLXRyaWctc3lzZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci9paW8tdHJpZy1zeXNmcy5jCmluZGV4IDQ3MjQ4Y2QuLjE3NGRjNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci9paW8tdHJpZy1zeXNmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci9paW8tdHJpZy1zeXNmcy5jCkBAIC03Nyw5ICs3NywxNiBAQAogCU5VTEwKIH07CiAKKworLyogTm90aGluZyB0byBhY3R1YWxseSBkbyB1cG9uIHJlbGVhc2UgKi8KK3N0YXRpYyB2b2lkIGlpb190cmlnZ2VyX3N5c2ZzX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworfQorCiBzdGF0aWMgc3RydWN0IGRldmljZSBpaW9fc3lzZnNfdHJpZ19kZXYgPSB7CiAJLmJ1cyA9ICZpaW9fYnVzX3R5cGUsCiAJLmdyb3VwcyA9IGlpb19zeXNmc190cmlnX2dyb3VwcywKKwkucmVsZWFzZSA9ICZpaW9fdHJpZ2dlcl9zeXNmc19yZWxlYXNlLAogfTsKIAogc3RhdGljIHNzaXplX3QgaWlvX3N5c2ZzX3RyaWdnZXJfcG9sbChzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC0xMDcsNiArMTE0LDEwIEBACiAJTlVMTAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fdHJpZ2dlcl9vcHMgaWlvX3N5c2ZzX3RyaWdnZXJfb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKwogc3RhdGljIGludCBpaW9fc3lzZnNfdHJpZ2dlcl9wcm9iZShpbnQgaWQpCiB7CiAJc3RydWN0IGlpb19zeXNmc190cmlnICp0OwpAQCAtMTM1LDcgKzE0Niw3IEBACiAJfQogCiAJdC0+dHJpZy0+ZGV2Lmdyb3VwcyA9IGlpb19zeXNmc190cmlnZ2VyX2F0dHJfZ3JvdXBzOwotCXQtPnRyaWctPm93bmVyID0gVEhJU19NT0RVTEU7CisJdC0+dHJpZy0+b3BzID0gJmlpb19zeXNmc190cmlnZ2VyX29wczsKIAl0LT50cmlnLT5kZXYucGFyZW50ID0gJmlpb19zeXNmc190cmlnX2RldjsKIAogCXJldCA9IGlpb190cmlnZ2VyX3JlZ2lzdGVyKHQtPnRyaWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyX2NvbnN1bWVyLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXJfY29uc3VtZXIuaAppbmRleCA5ZDUyZDk2Li42MGQ2NGIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXJfY29uc3VtZXIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXJfY29uc3VtZXIuaApAQCAtMSw0NyArMSw1MiBAQAotCi0vKiBUaGUgaW5kdXN0cmlhbCBJL08gY29yZSwgdHJpZ2dlciBjb25zdW1lciBoYW5kbGluZyBmdW5jdGlvbnMKKy8qIFRoZSBpbmR1c3RyaWFsIEkvTyBjb3JlLCB0cmlnZ2VyIGNvbnN1bWVyIGZ1bmN0aW9ucwogICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBKb25hdGhhbiBDYW1lcm9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMSBKb25hdGhhbiBDYW1lcm9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQogICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCi0jaWZkZWYgQ09ORklHX0lJT19UUklHR0VSCiAvKioKLSAqIGlpb19kZXZpY2VfcmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcigpIC0gc2V0IHVwIGFuIGlpb19kZXYgdG8gdXNlIHRyaWdnZXJzCi0gKiBAZGV2X2luZm86IGlpb19kZXYgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZpY2UgdGhhdCB3aWxsIGNvbnN1bWUgdGhlIHRyaWdnZXIKKyAqIHN0cnVjdCBpaW9fcG9sbF9mdW5jIC0gcG9sbCBmdW5jdGlvbiBwYWlyCisgKgorICogQGluZGlvX2RldjoJCQlkYXRhIHNwZWNpZmljIHRvIGRldmljZSAocGFzc2VkIGludG8gcG9sbCBmdW5jKQorICogQGg6CQkJCXRoZSBmdW5jdGlvbiB0aGF0IGlzIGFjdHVhbGx5IHJ1biBvbiB0cmlnZ2VyCisgKiBAdGhyZWFkOgkJCXRocmVhZGVkIGludGVycnVwdCBwYXJ0CisgKiBAdHlwZToJCQl0aGUgdHlwZSBvZiBpbnRlcnJ1cHQgKGJhc2ljYWxseSBpZiBvbmVzaG90KQorICogQG5hbWU6CQkJbmFtZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSB0cmlnZ2VyIGNvbnN1bWVyLgorICogQGlycToJCQl0aGUgY29ycmVzcG9uZGluZyBpcnEgYXMgYWxsb2NhdGVkIGZyb20gdGhlCisgKgkJCQl0cmlnZ2VyIHBvb2wKKyAqIEB0aW1lc3RhbXA6CQkJc29tZSBkZXZpY2VzIG5lZWQgYSB0aW1lc3RhbXAgZ3JhYmJlZCBhcyBzb29uCisgKgkJCQlhcyBwb3NzaWJsZSBhZnRlciB0aGUgdHJpZ2dlciAtIGhlbmNlIGhhbmRsZXIKKyAqCQkJCXBhc3NlcyBpdCB2aWEgaGVyZS4KICAqKi8KLWludCBpaW9fZGV2aWNlX3JlZ2lzdGVyX3RyaWdnZXJfY29uc3VtZXIoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvKTsKLQotLyoqCi0gKiBpaW9fZGV2aWNlX3VucmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcigpIC0gcmV2ZXJzZSB0aGUgcmVnaXN0cmF0aW9uIHByb2Nlc3MKLSAqIEBkZXZfaW5mbzogaWlvX2RldiBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZSB0aGF0IGNvbnN1bWVkIHRoZSB0cmlnZ2VyCi0gKiovCi1pbnQgaWlvX2RldmljZV91bnJlZ2lzdGVyX3RyaWdnZXJfY29uc3VtZXIoc3RydWN0IGlpb19kZXYgKmRldl9pbmZvKTsKLQotI2Vsc2UKLQotLyoqCi0gKiBpaW9fZGV2aWNlX3JlZ2lzdGVyX3RyaWdnZXJfY29uc3VtZXIoKSAtIHNldCB1cCBhbiBpaW9fZGV2IHRvIHVzZSB0cmlnZ2VycwotICogQGRldl9pbmZvOiBpaW9fZGV2IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlIHRoYXQgd2lsbCBjb25zdW1lIHRoZSB0cmlnZ2VyCi0gKiovCi1zdGF0aWMgaW50IGlpb19kZXZpY2VfcmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcihzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8pCi17Ci0JcmV0dXJuIDA7CitzdHJ1Y3QgaWlvX3BvbGxfZnVuYyB7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlpcnFyZXR1cm5fdCAoKmgpKGludCBpcnEsIHZvaWQgKnApOworCWlycXJldHVybl90ICgqdGhyZWFkKShpbnQgaXJxLCB2b2lkICpwKTsKKwlpbnQgdHlwZTsKKwljaGFyICpuYW1lOworCWludCBpcnE7CisJczY0IHRpbWVzdGFtcDsKIH07CiAKLS8qKgotICogaWlvX2RldmljZV91bnJlZ2lzdGVyX3RyaWdnZXJfY29uc3VtZXIoKSAtIHJldmVyc2UgdGhlIHJlZ2lzdHJhdGlvbiBwcm9jZXNzCi0gKiBAZGV2X2luZm86IGlpb19kZXYgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZXZpY2UgdGhhdCBjb25zdW1lZCB0aGUgdHJpZ2dlcgotICoqLwotc3RhdGljIGludCBpaW9fZGV2aWNlX3VucmVnaXN0ZXJfdHJpZ2dlcl9jb25zdW1lcihzdHJ1Y3QgaWlvX2RldiAqZGV2X2luZm8pCi17Ci0JcmV0dXJuIDA7Ci19OwogCi0jZW5kaWYgLyogQ09ORklHX1RSSUdHRVJfQ09OU1VNRVIgKi8KK3N0cnVjdCBpaW9fcG9sbF9mdW5jCisqaWlvX2FsbG9jX3BvbGxmdW5jKGlycXJldHVybl90ICgqaCkoaW50IGlycSwgdm9pZCAqcCksCisJCSAgICBpcnFyZXR1cm5fdCAoKnRocmVhZCkoaW50IGlycSwgdm9pZCAqcCksCisJCSAgICBpbnQgdHlwZSwKKwkJICAgIHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCSAgICBjb25zdCBjaGFyICpmbXQsCisJCSAgICAuLi4pOwordm9pZCBpaW9fZGVhbGxvY19wb2xsZnVuYyhzdHJ1Y3QgaWlvX3BvbGxfZnVuYyAqcGYpOworaXJxcmV0dXJuX3QgaWlvX3BvbGxmdW5jX3N0b3JlX3RpbWUoaW50IGlycSwgdm9pZCAqcCk7CiAKK3ZvaWQgaWlvX3RyaWdnZXJfbm90aWZ5X2RvbmUoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnKTsKIAotCisvKgorICogVHdvIGZ1bmN0aW9ucyBmb3IgY29tbW9uIGNhc2Ugd2hlcmUgYWxsIHRoYXQgaGFwcGVucyBpcyBhIHBvbGxmdW5jCisgKiBpcyBhdHRhY2hlZCBhbmQgZGV0YWNoZWQgZnJvbSBhIHRyaWdnZXIKKyAqLworaW50IGlpb190cmlnZ2VyZWRfYnVmZmVyX3Bvc3RlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldik7CitpbnQgaWlvX3RyaWdnZXJlZF9idWZmZXJfcHJlZGlzYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0LmMgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsX3NzdC5jCmluZGV4IGQ4OTI4NjEuLmMzMDNkODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3QuYwpAQCAtMzIxLDcgKzMyMSw3IEBACiAJCWlmIChyZXQpIHsKIAkJCXByX2VycigiY291bGRuJ3QgcmVnaXN0ZXIgTFBFIGRldmljZVxuIik7CiAJCQlnb3RvIGRvX2ZyZWVfbWlzYzsKLSAJCX0KKwkJfQogCX0gZWxzZSBpZiAoc3N0X2Rydl9jdHgtPnBjaV9pZCA9PSBTU1RfTUZMRF9QQ0lfSUQpIHsKIAkJdTMyIGNzcjsKIApAQCAtNTI0LDkgKzUyNCwxMSBAQAogCXJldHVybiAwOwogfQogCi0vKiBUaGUgcnVudGltZV9zdXNwZW5kL3Jlc3VtZSBpcyBwcmV0dHkgbXVjaCBzaW1pbGFyIHRvIHRoZSBsZWdhY3kgc3VzcGVuZC9yZXN1bWUgd2l0aCB0aGUgbm90ZWQgZXhjZXB0aW9uIGJlbG93OgotICogVGhlIFBDSSBjb3JlIHRha2VzIGNhcmUgb2YgdGFraW5nIHRoZSBzeXN0ZW0gdGhyb3VnaCBEM2hvdCBhbmQgcmVzdG9yaW5nIGl0IGJhY2sgdG8gRDAgYW5kIHNvIHRoZXJlIGlzCi0gKiBubyBuZWVkIHRvIGR1cGxpY2F0ZSB0aGF0IGhlcmUuCisvKiBUaGUgcnVudGltZV9zdXNwZW5kL3Jlc3VtZSBpcyBwcmV0dHkgbXVjaCBzaW1pbGFyIHRvIHRoZSBsZWdhY3kKKyAqIHN1c3BlbmQvcmVzdW1lIHdpdGggdGhlIG5vdGVkIGV4Y2VwdGlvbiBiZWxvdzoKKyAqIFRoZSBQQ0kgY29yZSB0YWtlcyBjYXJlIG9mIHRha2luZyB0aGUgc3lzdGVtIHRocm91Z2ggRDNob3QgYW5kCisgKiByZXN0b3JpbmcgaXQgYmFjayB0byBEMCBhbmQgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBkdXBsaWNhdGUKKyAqIHRoYXQgaGVyZS4KICAqLwogc3RhdGljIGludCBpbnRlbF9zc3RfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxfc3N0X2RzcC5jIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfZHNwLmMKaW5kZXggYTg5ZTFhZC4uNDI2ZDJiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfZHNwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbF9zc3RfZHNwLmMKQEAgLTEwNCw3ICsxMDQsNyBAQAogLyoqCiAgKiBzc3Rfc3RhcnRfbWVkZmllbGQgLSBTdGFydCB0aGUgU1NUIERTUCBwcm9jZXNzb3IKICAqCi0gKiBUaGlzIHN0YXJ0cyB0aGUgRFNQIGluIE1SU1QgcGxhdGZyb21zCisgKiBUaGlzIHN0YXJ0cyB0aGUgRFNQIGluIE1lZGZpZWxkIHBsYXRmcm9tcwogICovCiBzdGF0aWMgaW50IHNzdF9zdGFydF9tZWRmaWVsZCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZC5jIGIvZHJpdmVycy9zdGFnaW5nL2ludGVsX3NzdC9pbnRlbG1pZC5jCmluZGV4IDI1NjU2YWQuLjQ5MmI2NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pbnRlbF9zc3QvaW50ZWxtaWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaW50ZWxfc3N0L2ludGVsbWlkLmMKQEAgLTI3LDYgKzI3LDcgQEAKIAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc2NzaWdsdWUuYyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zY3NpZ2x1ZS5jCmluZGV4IDEzNWY3ZjIuLmUxZjM5MzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zY3NpZ2x1ZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zY3NpZ2x1ZS5jCkBAIC0xNDQsNyArMTQ0LDcgQEAKIAlzY3NpX2xvY2sodXNfdG9faG9zdCh1cykpOwogCWlmICh1cy0+c3JiICE9IHNyYikgewogCQlzY3NpX3VubG9jayh1c190b19ob3N0KHVzKSk7Ci0JCXByaW50ayAoIi0tIG5vdGhpbmcgdG8gYWJvcnRcbiIpOworCQlwcmludGsoIi0tIG5vdGhpbmcgdG8gYWJvcnRcbiIpOwogCQlyZXR1cm4gRkFJTEVEOwogCX0KIApAQCAtMjc5LDcgKzI3OSw4IEBACiAJCXBvcyArPSBzcHJpbnRmKHBvcywgIiAgICAgICBRdWlya3M6Iik7CiAKICNkZWZpbmUgVVNfRkxBRyhuYW1lLCB2YWx1ZSkgXAotCWlmICh1cy0+ZmZsYWdzICYgdmFsdWUpIHBvcyArPSBzcHJpbnRmKHBvcywgIiAiICNuYW1lKTsKKwlpZiAodXMtPmZmbGFncyAmIHZhbHVlKVwKKwkJcG9zICs9IHNwcmludGYocG9zLCAiICIgI25hbWUpOwogVVNfRE9fQUxMX0ZMQUdTCiAjdW5kZWYgVVNfRkxBRwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbC5oIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWwuaAppbmRleCBiNWE4ZmE3Li4yNGE2MzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsLmgKQEAgLTE3Nyw4ICsxNzcsNyBAQAogCVdPUkQgTWF4TG9nQmxvY2tzOwogfTsKIAotdHlwZWRlZiBzdHJ1Y3QgU1NGRENUWVBFX1QKLXsKK3R5cGVkZWYgc3RydWN0IFNTRkRDVFlQRV9UIHsKIAlCWVRFIE1vZGVsOwogCUJZVEUgQXR0cmlidXRlOwogCUJZVEUgTWF4Wm9uZXM7CkBAIC0xOTQsOCArMTkzLDcgQEAKIAlXT1JEIExvZ0Jsb2NrOwkvKiBMb2dpY2FsIEJsb2NrIE51bWJlciBvZiBab25lICovCiB9OwogCi10eXBlZGVmIHN0cnVjdCBBRERSRVNTX1QKLXsKK3R5cGVkZWYgc3RydWN0IEFERFJFU1NfVCB7CiAJQllURSBab25lOwkvKiBab25lIE51bWJlciAqLwogCUJZVEUgU2VjdG9yOwkvKiBTZWN0b3IoNTEyYnl0ZSkgTnVtYmVyIG9uIEJsb2NrICovCiAJV09SRCBQaHlCbG9jazsJLyogUGh5c2ljYWwgQmxvY2sgTnVtYmVyIG9uIFpvbmUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsc3ViLmMgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21pbHN1Yi5jCmluZGV4IGIzMTVkNWYuLmQ0ZGQ1ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbWlsc3ViLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3NtaWxzdWIuYwpAQCAtMiw0MiArMiwzNyBAQAogI2luY2x1ZGUgInVzYi5oIgogI2luY2x1ZGUgInNjc2lnbHVlLmgiCiAjaW5jbHVkZSAidHJhbnNwb3J0LmgiCi0vLyNpbmNsdWRlICJpbml0LmgiCiAKLS8vI2luY2x1ZGUgInN0ZGxpYi5oIgotLy8jaW5jbHVkZSAiRVVDUjZTSy5oIgogI2luY2x1ZGUgInNtY29tbW9uLmgiCiAjaW5jbHVkZSAic21pbC5oIgogCi12b2lkICAgX1NldF9EX1NzZmRjUmRDbWQgICAgIChCWVRFKTsKLXZvaWQgICBfU2V0X0RfU3NmZGNSZEFkZHIgICAgKEJZVEUpOwotdm9pZCAgIF9TZXRfRF9Tc2ZkY1JkQ2hpcCAgICAodm9pZCk7Ci12b2lkICAgX1NldF9EX1NzZmRjUmRTdGFuZGJ5ICh2b2lkKTsKLXZvaWQgICBfU3RhcnRfRF9Tc2ZkY1JkSHdFQ0MgKHZvaWQpOwotdm9pZCAgIF9TdG9wX0RfU3NmZGNSZEh3RUNDICAodm9pZCk7Ci12b2lkICAgX0xvYWRfRF9Tc2ZkY1JkSHdFQ0MgIChCWVRFKTsKLXZvaWQgICBfU2V0X0RfU3NmZGNXckNtZCAgICAgKEJZVEUpOwotdm9pZCAgIF9TZXRfRF9Tc2ZkY1dyQWRkciAgICAoQllURSk7Ci12b2lkICAgX1NldF9EX1NzZmRjV3JCbG9jayAgICh2b2lkKTsKLXZvaWQgICBfU2V0X0RfU3NmZGNXclN0YW5kYnkgKHZvaWQpOwotdm9pZCAgIF9TdGFydF9EX1NzZmRjV3JId0VDQyAodm9pZCk7Ci12b2lkICAgX0xvYWRfRF9Tc2ZkY1dySHdFQ0MgIChCWVRFKTsKLWludCAgICBfQ2hlY2tfRF9Tc2ZkY0J1c3kgICAgKFdPUkQpOwotaW50ICAgIF9DaGVja19EX1NzZmRjU3RhdHVzICAodm9pZCk7Ci12b2lkICAgX1Jlc2V0X0RfU3NmZGNFcnIgICAgICh2b2lkKTsKLXZvaWQgICBfUmVhZF9EX1NzZmRjQnVmICAgICAgKEJZVEUgKik7Ci12b2lkICAgX1dyaXRlX0RfU3NmZGNCdWYgICAgIChCWVRFICopOwotdm9pZCAgIF9SZWFkX0RfU3NmZGNCeXRlICAgICAoQllURSAqKTsKLXZvaWQgICBfUmVhZFJlZHRfRF9Tc2ZkY0J1ZiAgKEJZVEUgKik7Ci12b2lkICAgX1dyaXRlUmVkdF9EX1NzZmRjQnVmIChCWVRFICopOwotQllURSAgIF9DaGVja19EX0RldkNvZGUgICAgICAoQllURSk7Cit2b2lkICAgX1NldF9EX1NzZmRjUmRDbWQoQllURSk7Cit2b2lkICAgX1NldF9EX1NzZmRjUmRBZGRyKEJZVEUpOwordm9pZCAgIF9TZXRfRF9Tc2ZkY1JkQ2hpcCh2b2lkKTsKK3ZvaWQgICBfU2V0X0RfU3NmZGNSZFN0YW5kYnkodm9pZCk7Cit2b2lkICAgX1N0YXJ0X0RfU3NmZGNSZEh3RUNDKHZvaWQpOwordm9pZCAgIF9TdG9wX0RfU3NmZGNSZEh3RUNDKHZvaWQpOwordm9pZCAgIF9Mb2FkX0RfU3NmZGNSZEh3RUNDKEJZVEUpOwordm9pZCAgIF9TZXRfRF9Tc2ZkY1dyQ21kKEJZVEUpOwordm9pZCAgIF9TZXRfRF9Tc2ZkY1dyQWRkcihCWVRFKTsKK3ZvaWQgICBfU2V0X0RfU3NmZGNXckJsb2NrKHZvaWQpOwordm9pZCAgIF9TZXRfRF9Tc2ZkY1dyU3RhbmRieSh2b2lkKTsKK3ZvaWQgICBfU3RhcnRfRF9Tc2ZkY1dySHdFQ0Modm9pZCk7Cit2b2lkICAgX0xvYWRfRF9Tc2ZkY1dySHdFQ0MoQllURSk7CitpbnQgICAgX0NoZWNrX0RfU3NmZGNCdXN5KFdPUkQpOworaW50ICAgIF9DaGVja19EX1NzZmRjU3RhdHVzKHZvaWQpOwordm9pZCAgIF9SZXNldF9EX1NzZmRjRXJyKHZvaWQpOwordm9pZCAgIF9SZWFkX0RfU3NmZGNCdWYoQllURSAqKTsKK3ZvaWQgICBfV3JpdGVfRF9Tc2ZkY0J1ZihCWVRFICopOwordm9pZCAgIF9SZWFkX0RfU3NmZGNCeXRlKEJZVEUgKik7Cit2b2lkICAgX1JlYWRSZWR0X0RfU3NmZGNCdWYoQllURSAqKTsKK3ZvaWQgICBfV3JpdGVSZWR0X0RfU3NmZGNCdWYoQllURSAqKTsKK0JZVEUgICBfQ2hlY2tfRF9EZXZDb2RlKEJZVEUpOwogCi12b2lkICAgX1NldF9EX0VDQ2RhdGEgICAgICAgIChCWVRFLEJZVEUgKik7Ci12b2lkICAgX0NhbGNfRF9FQ0NkYXRhICAgICAgIChCWVRFICopOwordm9pZCAgIF9TZXRfRF9FQ0NkYXRhKEJZVEUsIEJZVEUgKik7Cit2b2lkICAgX0NhbGNfRF9FQ0NkYXRhKEJZVEUgKik7CiAKLS8vdm9pZCAgIFNNX1JlYWREYXRhV2l0aERNQSAgICAgIChQRkRPX0RFVklDRV9FWFRFTlNJT04sIEJZVEUgKiwgV09SRCk7Ci0vL3ZvaWQgICBTTV9Xcml0ZURhdGFXaXRoRE1BICAgICAoUEZET19ERVZJQ0VfRVhURU5TSU9OLCBCWVRFICosIFdPUkQpOwotLy8KKwogc3RydWN0IFNTRkRDVFlQRSAgICAgICAgICAgICAgICBTc2ZkYzsKIHN0cnVjdCBBRERSRVNTICAgICAgICAgICAgICAgICAgTWVkaWE7CiBzdHJ1Y3QgQ0lTX0FSRUEgICAgICAgICAgICAgICAgIENpc0FyZWE7CkBAIC00OSwyMjEgKzQ0LDE3OSBAQAogZXh0ZXJuIFdPUkQgIFJlYWRCbG9jazsKIGV4dGVybiBXT1JEICBXcml0ZUJsb2NrOwogCi0vL0tFVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgU01fRE1BRG9uZUV2ZW50OwotCi0jZGVmaW5lIEVWRU4gICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgLy8gRXZlbiBQYWdlIGZvciAyNTZieXRlL3BhZ2UKLSNkZWZpbmUgT0REICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAvLyBPZGQgUGFnZSBmb3IgMjU2Ynl0ZS9wYWdlCiAKIAotLy9TbWFydE1lZGlhIFJlZHVuZGFudCBidWZmZXIgZGF0YSBDb250cm9sIFN1YnJvdXRpbmUKLS8vLS0tLS0gQ2hlY2tfRF9EYXRhQmxhbmsoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBFVkVOICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgIC8qIEV2ZW4gUGFnZSBmb3IgMjU2Ynl0ZS9wYWdlICovCisjZGVmaW5lIE9ERCAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgLyogT2RkIFBhZ2UgZm9yIDI1NmJ5dGUvcGFnZSAqLworCisKKy8qIFNtYXJ0TWVkaWEgUmVkdW5kYW50IGJ1ZmZlciBkYXRhIENvbnRyb2wgU3Vicm91dGluZQorICotLS0tLSBDaGVja19EX0RhdGFCbGFuaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KIGludCBDaGVja19EX0RhdGFCbGFuayhCWVRFICpyZWR1bmRhbnQpCiB7CiAJY2hhciBpOwogCi0JZm9yKGk9MDsgaTxSRURUU0laRTsgaSsrKQotCQlpZiAoKnJlZHVuZGFudCsrIT0weEZGKQotCQkJcmV0dXJuKEVSUk9SKTsKKwlmb3IgKGkgPSAwOyBpIDwgUkVEVFNJWkU7IGkrKykKKwkJaWYgKCpyZWR1bmRhbnQrKyAhPSAweEZGKQorCQkJcmV0dXJuICBFUlJPUjsKIAotCXJldHVybihTTVNVQ0NFU1MpOworCXJldHVybiBTTVNVQ0NFU1M7CiB9CiAKLS8vLS0tLS0gQ2hlY2tfRF9GYWlsQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0gQ2hlY2tfRF9GYWlsQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogaW50IENoZWNrX0RfRmFpbEJsb2NrKEJZVEUgKnJlZHVuZGFudCkKIHsKLQlyZWR1bmRhbnQrPVJFRFRfQkxPQ0s7CisJcmVkdW5kYW50ICs9IFJFRFRfQkxPQ0s7CiAKLQlpZiAoKnJlZHVuZGFudD09MHhGRikKLQkJcmV0dXJuKFNNU1VDQ0VTUyk7CisJaWYgKCpyZWR1bmRhbnQgPT0gMHhGRikKKwkJcmV0dXJuIFNNU1VDQ0VTUzsKIAlpZiAoISpyZWR1bmRhbnQpCi0JCXJldHVybihFUlJPUik7Ci0JaWYgKGh3ZWlnaHQ4KCpyZWR1bmRhbnQpPDcpCi0JCXJldHVybihFUlJPUik7CisJCXJldHVybiBFUlJPUjsKKwlpZiAoaHdlaWdodDgoKnJlZHVuZGFudCkgPCA3KQorCQlyZXR1cm4gRVJST1I7CiAKLQlyZXR1cm4oU01TVUNDRVNTKTsKKwlyZXR1cm4gU01TVUNDRVNTOwogfQogCi0vLy0tLS0tIENoZWNrX0RfRGF0YVN0YXR1cygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tIENoZWNrX0RfRGF0YVN0YXR1cygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIGludCBDaGVja19EX0RhdGFTdGF0dXMoQllURSAqcmVkdW5kYW50KQogewotCXJlZHVuZGFudCs9UkVEVF9EQVRBOworCXJlZHVuZGFudCArPSBSRURUX0RBVEE7CiAKLQlpZiAoKnJlZHVuZGFudD09MHhGRikKLQkJcmV0dXJuKFNNU1VDQ0VTUyk7Ci0JaWYgKCEqcmVkdW5kYW50KQotCXsKKwlpZiAoKnJlZHVuZGFudCA9PSAweEZGKQorCQlyZXR1cm4gU01TVUNDRVNTOworCWlmICghKnJlZHVuZGFudCkgewogCQlFcnJYRENvZGUgPSBFUlJfRGF0YVN0YXR1czsKLQkJcmV0dXJuKEVSUk9SKTsKLQl9Ci0JZWxzZQorCQlyZXR1cm4gRVJST1I7CisJfSBlbHNlCiAJCUVyclhEQ29kZSA9IE5PX0VSUk9SOwogCi0JaWYgKGh3ZWlnaHQ4KCpyZWR1bmRhbnQpPDUpCi0JCXJldHVybihFUlJPUik7CisJaWYgKGh3ZWlnaHQ4KCpyZWR1bmRhbnQpIDwgNSkKKwkJcmV0dXJuIEVSUk9SOwogCi0JcmV0dXJuKFNNU1VDQ0VTUyk7CisJcmV0dXJuIFNNU1VDQ0VTUzsKIH0KIAotLy8tLS0tLSBMb2FkX0RfTG9nQmxvY2tBZGRyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLSBMb2FkX0RfTG9nQmxvY2tBZGRyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBpbnQgTG9hZF9EX0xvZ0Jsb2NrQWRkcihCWVRFICpyZWR1bmRhbnQpCiB7Ci0JV09SRCBhZGRyMSxhZGRyMjsKLQkvL1NTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwotCS8vQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CisJV09SRCBhZGRyMSwgYWRkcjI7CiAKLQlhZGRyMT0oV09SRCkqKHJlZHVuZGFudCtSRURUX0FERFIxSCkqMHgwMTAwKyhXT1JEKSoocmVkdW5kYW50K1JFRFRfQUREUjFMKTsKLQlhZGRyMj0oV09SRCkqKHJlZHVuZGFudCtSRURUX0FERFIySCkqMHgwMTAwKyhXT1JEKSoocmVkdW5kYW50K1JFRFRfQUREUjJMKTsKKwlhZGRyMSA9IChXT1JEKSoocmVkdW5kYW50ICsgUkVEVF9BRERSMUgpKjB4MDEwMCArIChXT1JEKSoocmVkdW5kYW50ICsgUkVEVF9BRERSMUwpOworCWFkZHIyID0gKFdPUkQpKihyZWR1bmRhbnQgKyBSRURUX0FERFIySCkqMHgwMTAwICsgKFdPUkQpKihyZWR1bmRhbnQgKyBSRURUX0FERFIyTCk7CiAKLQlpZiAoYWRkcjE9PWFkZHIyKQotCQlpZiAoKGFkZHIxICYweEYwMDApPT0weDEwMDApCi0JCXsgTWVkaWEuTG9nQmxvY2s9KGFkZHIxICYweDBGRkYpLzI7IHJldHVybihTTVNVQ0NFU1MpOyB9CisJaWYgKGFkZHIxID09IGFkZHIyKQorCQlpZiAoKGFkZHIxICYgMHhGMDAwKSA9PSAweDEwMDApIHsKKwkJCU1lZGlhLkxvZ0Jsb2NrID0gKGFkZHIxICYgMHgwRkZGKSAvIDI7CisJCQlyZXR1cm4gU01TVUNDRVNTOworCQl9CiAKLQlpZiAoaHdlaWdodDE2KChXT1JEKShhZGRyMV5hZGRyMikpIT0weDAxKSByZXR1cm4oRVJST1IpOworCWlmIChod2VpZ2h0MTYoKFdPUkQpKGFkZHIxXmFkZHIyKSkgIT0gMHgwMSkKKwkJcmV0dXJuIEVSUk9SOwogCi0JaWYgKChhZGRyMSAmMHhGMDAwKT09MHgxMDAwKQotCQlpZiAoIShod2VpZ2h0MTYoYWRkcjEpICYweDAxKSkKLQkJeyBNZWRpYS5Mb2dCbG9jaz0oYWRkcjEgJjB4MEZGRikvMjsgcmV0dXJuKFNNU1VDQ0VTUyk7IH0KKwlpZiAoKGFkZHIxICYgMHhGMDAwKSA9PSAweDEwMDApCisJCWlmICghKGh3ZWlnaHQxNihhZGRyMSkgJiAweDAxKSkgeworCQkJTWVkaWEuTG9nQmxvY2sgPSAoYWRkcjEgJiAweDBGRkYpIC8gMjsKKwkJCXJldHVybiBTTVNVQ0NFU1M7CisJCX0KIAotCWlmICgoYWRkcjIgJjB4RjAwMCk9PTB4MTAwMCkKLQkJaWYgKCEoaHdlaWdodDE2KGFkZHIyKSAmMHgwMSkpCi0JCXsgTWVkaWEuTG9nQmxvY2s9KGFkZHIyICYweDBGRkYpLzI7IHJldHVybihTTVNVQ0NFU1MpOyB9CisJaWYgKChhZGRyMiAmIDB4RjAwMCkgPT0gMHgxMDAwKQorCQlpZiAoIShod2VpZ2h0MTYoYWRkcjIpICYgMHgwMSkpIHsKKwkJCU1lZGlhLkxvZ0Jsb2NrID0gKGFkZHIyICYgMHgwRkZGKSAvIDI7CisJCQlyZXR1cm4gU01TVUNDRVNTOworCQl9CiAKLQlyZXR1cm4oRVJST1IpOworCXJldHVybiBFUlJPUjsKIH0KIAotLy8tLS0tLSBDbHJfRF9SZWR1bmRhbnREYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLSBDbHJfRF9SZWR1bmRhbnREYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiB2b2lkIENscl9EX1JlZHVuZGFudERhdGEoQllURSAqcmVkdW5kYW50KQogewogCWNoYXIgaTsKIAotCWZvcihpPTA7IGk8UkVEVFNJWkU7IGkrKykKLQkqKHJlZHVuZGFudCtpKT0weEZGOworCWZvciAoaSA9IDA7IGkgPCBSRURUU0laRTsgaSsrKQorCQkqKHJlZHVuZGFudCArIGkpID0gMHhGRjsKIH0KIAotLy8tLS0tLSBTZXRfRF9Mb2dCbG9ja0FkZHIoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLSBTZXRfRF9Mb2dCbG9ja0FkZHIoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiB2b2lkIFNldF9EX0xvZ0Jsb2NrQWRkcihCWVRFICpyZWR1bmRhbnQpCiB7CiAJV09SRCBhZGRyOwogCi0JKihyZWR1bmRhbnQrUkVEVF9CTE9DSyk9MHhGRjsKLQkqKHJlZHVuZGFudCtSRURUX0RBVEEpID0weEZGOwotCWFkZHI9TWVkaWEuTG9nQmxvY2sqMisweDEwMDA7CisJKihyZWR1bmRhbnQgKyBSRURUX0JMT0NLKSA9IDB4RkY7CisJKihyZWR1bmRhbnQgKyBSRURUX0RBVEEpID0gMHhGRjsKKwlhZGRyID0gTWVkaWEuTG9nQmxvY2sqMiArIDB4MTAwMDsKIAotCWlmICgoaHdlaWdodDE2KGFkZHIpJTIpKQorCWlmICgoaHdlaWdodDE2KGFkZHIpICUgMikpCiAJCWFkZHIrKzsKIAotCSoocmVkdW5kYW50K1JFRFRfQUREUjFIKT0qKHJlZHVuZGFudCtSRURUX0FERFIySCk9KEJZVEUpKGFkZHIvMHgwMTAwKTsKLQkqKHJlZHVuZGFudCtSRURUX0FERFIxTCk9KihyZWR1bmRhbnQrUkVEVF9BRERSMkwpPShCWVRFKWFkZHI7CisJKihyZWR1bmRhbnQgKyBSRURUX0FERFIxSCkgPSAqKHJlZHVuZGFudCArIFJFRFRfQUREUjJIKSA9IChCWVRFKShhZGRyIC8gMHgwMTAwKTsKKwkqKHJlZHVuZGFudCArIFJFRFRfQUREUjFMKSA9ICoocmVkdW5kYW50ICsgUkVEVF9BRERSMkwpID0gKEJZVEUpYWRkcjsKIH0KIAotLy8tLS0tLSBTZXRfRF9GYWlsQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKi0tLS0tIFNldF9EX0ZhaWxCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHZvaWQgU2V0X0RfRmFpbEJsb2NrKEJZVEUgKnJlZHVuZGFudCkKIHsKLSAgICBjaGFyIGk7Ci0KLSAgICBmb3IoaT0wOyBpPFJFRFRTSVpFOyBpKyspCi0gICAgICAgICpyZWR1bmRhbnQrKz0oQllURSkoKGk9PVJFRFRfQkxPQ0spPzB4RjA6MHhGRik7CisJY2hhciBpOworCWZvciAoaSA9IDA7IGkgPCBSRURUU0laRTsgaSsrKQorCQkqcmVkdW5kYW50KysgPSAoQllURSkoKGkgPT0gUkVEVF9CTE9DSykgPyAweEYwIDogMHhGRik7CiB9CiAKLS8vLS0tLS0gU2V0X0RfRGF0YVN0YXVzKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0gU2V0X0RfRGF0YVN0YXVzKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogdm9pZCBTZXRfRF9EYXRhU3RhdXMoQllURSAqcmVkdW5kYW50KQogewotICAgIHJlZHVuZGFudCs9UkVEVF9EQVRBOwotICAgICpyZWR1bmRhbnQ9MHgwMDsKKwlyZWR1bmRhbnQgKz0gUkVEVF9EQVRBOworCSpyZWR1bmRhbnQgPSAweDAwOwogfQogCi0vL1NtYXJ0TWVkaWEgRnVuY3Rpb24gQ29tbWFuZCBTdWJyb3V0aW5lCi0vLyA2MjUwIENNRCA2Ci0vLy0tLS0tIFNzZmRjX0RfUmVzZXQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIFNtYXJ0TWVkaWEgRnVuY3Rpb24gQ29tbWFuZCBTdWJyb3V0aW5lCisgKiA2MjUwIENNRCA2CisgKi8KKy8qIC0tLS0tIFNzZmRjX0RfUmVzZXQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHZvaWQgU3NmZGNfRF9SZXNldChzdHJ1Y3QgdXNfZGF0YSAqdXMpCiB7Ci0JLy9OVFNUQVRVUyAgICAgICAgbnRTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKLQkvL1BCVUxLX0NCVyAgICAgICBwQnVsa0NidyA9IGZkb0V4dC0+cEJ1bGtDYnc7Ci0JLy9CWVRFICAgICAgICAgICAgYnVmWzB4MjAwXTsKLQotCS8vcHJpbnRrKCJTc2ZkY19EX1Jlc2V0IC0tLSBCdXQgZG8gbm90aGluZyAhIVxuIik7CiAJcmV0dXJuOwotLyoJUnRsWmVyb01lbW9yeShwQnVsa0Nidywgc2l6ZW9mKHN0cnVjdCBfQlVMS19DQlcpKTsKLQlwQnVsa0Nidy0+ZENCV1NpZ25hdHVyZSAgICAgICAgICA9IENCV19TSUdOVFVSRTsKLQlwQnVsa0Nidy0+YkNCV0x1biAgICAgICAgICAgICAgICA9IENCV19MVU47Ci0JLy9wQnVsa0Nidy0+ZENCV0RhdGFUcmFuc2Zlckxlbmd0aCA9IDB4MjAwOwotCXBCdWxrQ2J3LT5ibUNCV0ZsYWdzICAgICAgICAgICAgID0gMHg4MDsKLQlwQnVsa0Nidy0+Q0JXQ2JbMF0gICAgICAgICAgICAgICA9IDB4RjI7Ci0JcEJ1bGtDYnctPkNCV0NiWzFdICAgICAgICAgICAgICAgPSAweDA3OwotCi0JbnRTdGF0dXMgPSBFTkVfU2VuZFNjc2lDbWQoZmRvRXh0LCBGRElSX1JFQUQsIE5VTEwpOwotCi0JaWYgKCFOVF9TVUNDRVNTKG50U3RhdHVzKSkKLQl7Ci0JCUVORV9QcmludCgiU3NmZGNfRF9SZXNldCBGYWlsICEhXG4iKTsKLQkJLy9yZXR1cm4gbnRTdGF0dXM7Ci0JfSovCiB9CiAKLS8vLS0tLS0gU3NmZGNfRF9SZWFkQ2lzU2VjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50IFNzZmRjX0RfUmVhZENpc1NlY3Qoc3RydWN0IHVzX2RhdGEgKnVzLCBCWVRFICpidWYsQllURSAqcmVkdW5kYW50KQorLyogLS0tLS0gU3NmZGNfRF9SZWFkQ2lzU2VjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworaW50IFNzZmRjX0RfUmVhZENpc1NlY3Qoc3RydWN0IHVzX2RhdGEgKnVzLCBCWVRFICpidWYsIEJZVEUgKnJlZHVuZGFudCkKIHsKLQlCWVRFIHpvbmUsc2VjdG9yOworCUJZVEUgem9uZSwgc2VjdG9yOwogCVdPUkQgYmxvY2s7Ci0JLy9TU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKLQkvL0FERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwogCi0Jem9uZT1NZWRpYS5ab25lOyBibG9jaz1NZWRpYS5QaHlCbG9jazsgc2VjdG9yPU1lZGlhLlNlY3RvcjsKLQlNZWRpYS5ab25lPTA7Ci0JTWVkaWEuUGh5QmxvY2s9Q2lzQXJlYS5QaHlCbG9jazsKLQlNZWRpYS5TZWN0b3I9Q2lzQXJlYS5TZWN0b3I7CisJem9uZSA9IE1lZGlhLlpvbmU7IGJsb2NrID0gTWVkaWEuUGh5QmxvY2s7IHNlY3RvciA9IE1lZGlhLlNlY3RvcjsKKwlNZWRpYS5ab25lID0gMDsKKwlNZWRpYS5QaHlCbG9jayA9IENpc0FyZWEuUGh5QmxvY2s7CisJTWVkaWEuU2VjdG9yID0gQ2lzQXJlYS5TZWN0b3I7CiAKLQlpZiAoU3NmZGNfRF9SZWFkU2VjdCh1cyxidWYscmVkdW5kYW50KSkKLQl7Ci0JCU1lZGlhLlpvbmU9em9uZTsgTWVkaWEuUGh5QmxvY2s9YmxvY2s7IE1lZGlhLlNlY3Rvcj1zZWN0b3I7Ci0JCXJldHVybihFUlJPUik7CisJaWYgKFNzZmRjX0RfUmVhZFNlY3QodXMsIGJ1ZiwgcmVkdW5kYW50KSkgeworCQlNZWRpYS5ab25lID0gem9uZTsgTWVkaWEuUGh5QmxvY2sgPSBibG9jazsgTWVkaWEuU2VjdG9yID0gc2VjdG9yOworCQlyZXR1cm4gRVJST1I7CiAJfQogCi0JTWVkaWEuWm9uZT16b25lOyBNZWRpYS5QaHlCbG9jaz1ibG9jazsgTWVkaWEuU2VjdG9yPXNlY3RvcjsKLQlyZXR1cm4oU01TVUNDRVNTKTsKKwlNZWRpYS5ab25lID0gem9uZTsgTWVkaWEuUGh5QmxvY2sgPSBibG9jazsgTWVkaWEuU2VjdG9yID0gc2VjdG9yOworCXJldHVybiBTTVNVQ0NFU1M7CiB9Ci0vKgotLy8vLy0tLS0tIFNzZmRjX0RfV3JpdGVSZWR0TW9kZSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vdm9pZCBTc2ZkY19EX1dyaXRlUmVkdE1vZGUodm9pZCkKLS8vewotLy8gICAgX1NldF9EX1NzZmRjUmRDbWQgICAgIChSU1RfQ0hJUCk7Ci0vLyAgICBfQ2hlY2tfRF9Tc2ZkY0J1c3kgICAgKEJVU1lfUkVTRVQpOwotLy8gICAgX1NldF9EX1NzZmRjUmRDbWQgICAgIChSRUFEX1JFRFQpOwotLy8gICAgX0NoZWNrX0RfU3NmZGNCdXN5ICAgIChCVVNZX1JFQUQpOwotLy8gICAgX1NldF9EX1NzZmRjUmRTdGFuZGJ5ICgpOwotLy99Ci0vLwotLy8vLy0tLS0tIFNzZmRjX0RfUmVhZElEKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vdm9pZCBTc2ZkY19EX1JlYWRJRChCWVRFICpidWYsIEJZVEUgUmVhZElEKQotLy97Ci0vLyAgICBfU2V0X0RfU3NmZGNSZENtZCAgICAgKFJlYWRJRCk7Ci0vLyAgICBfU2V0X0RfU3NmZGNSZENoaXAgICAgKCk7Ci0vLyAgICBfUmVhZF9EX1NzZmRjQnl0ZSAgICAgKGJ1ZisrKTsKLS8vICAgIF9SZWFkX0RfU3NmZGNCeXRlICAgICAoYnVmKyspOwotLy8gICAgX1JlYWRfRF9Tc2ZkY0J5dGUgICAgIChidWYrKyk7Ci0vLyAgICBfUmVhZF9EX1NzZmRjQnl0ZSAgICAgKGJ1Zik7Ci0vLyAgICBfU2V0X0RfU3NmZGNSZFN0YW5kYnkgKCk7Ci0vL30KLSovCi0vLyA2MjUwIENNRCAxCi0vLy0tLS0tIFNzZmRjX0RfUmVhZFNlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBTc2ZkY19EX1JlYWRTZWN0KHN0cnVjdCB1c19kYXRhICp1cywgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKKworLyogNjI1MCBDTUQgMSAqLworLyogLS0tLS0gU3NmZGNfRF9SZWFkU2VjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworaW50IFNzZmRjX0RfUmVhZFNlY3Qoc3RydWN0IHVzX2RhdGEgKnVzLCBCWVRFICpidWYsIEJZVEUgKnJlZHVuZGFudCkKIHsKIAlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CiAJaW50CXJlc3VsdDsKIAlXT1JECWFkZHI7CiAKIAlyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwotCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQotCXsKKwlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgewogCQlwcmludGsoIkxvYWQgU00gUlcgQ29kZSBGYWlsICEhXG4iKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKLQlhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7Ci0JYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7CisJYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgTWVkaWEuUGh5QmxvY2s7CisJYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycyArIE1lZGlhLlNlY3RvcjsKIAotCS8vIFJlYWQgc2VjdCBkYXRhCisJLyogUmVhZCBzZWN0IGRhdGEgKi8KIAltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwogCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKIAliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aAk9IDB4MjAwOwpAQCAtMjcxLDE0ICsyMjQsMTQgQEAKIAliY2ItPkNEQlswXQkJCT0gMHhGMTsKIAliY2ItPkNEQlsxXQkJCT0gMHgwMjsKIAliY2ItPkNEQls0XQkJCT0gKEJZVEUpYWRkcjsKLQliY2ItPkNEQlszXQkJCT0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKLQliY2ItPkNEQlsyXQkJCT0gTWVkaWEuWm9uZS8yOworCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoYWRkciAvIDB4MDEwMCk7CisJYmNiLT5DREJbMl0JCQk9IE1lZGlhLlpvbmUgLyAyOwogCiAJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIGJ1ZiwgMCk7CiAJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAKLQkvLyBSZWFkIHJlZHVuZGFudAorCS8qIFJlYWQgcmVkdW5kYW50ICovCiAJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKIAliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CiAJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGgJPSAweDEwOwpAQCAtMjg2LDggKzIzOSw4IEBACiAJYmNiLT5DREJbMF0JCQk9IDB4RjE7CiAJYmNiLT5DREJbMV0JCQk9IDB4MDM7CiAJYmNiLT5DREJbNF0JCQk9IChCWVRFKWFkZHI7Ci0JYmNiLT5DREJbM10JCQk9IChCWVRFKShhZGRyLzB4MDEwMCk7Ci0JYmNiLT5DREJbMl0JCQk9IE1lZGlhLlpvbmUvMjsKKwliY2ItPkNEQlszXQkJCT0gKEJZVEUpKGFkZHIgLyAweDAxMDApOworCWJjYi0+Q0RCWzJdCQkJPSBNZWRpYS5ab25lIC8gMjsKIAliY2ItPkNEQls4XQkJCT0gMDsKIAliY2ItPkNEQls5XQkJCT0gMTsKIApAQCAtMjk4LDI1ICsyNTEsMjMgQEAKIAlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7CiB9CiAKLS8vLS0tLS0gU3NmZGNfRF9SZWFkQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBTc2ZkY19EX1JlYWRCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgY291bnQsIEJZVEUgKmJ1ZixCWVRFICpyZWR1bmRhbnQpCisvKiAtLS0tLSBTc2ZkY19EX1JlYWRCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworaW50IFNzZmRjX0RfUmVhZEJsb2NrKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBjb3VudCwgQllURSAqYnVmLCBCWVRFICpyZWR1bmRhbnQpCiB7CiAJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwogCWludAlyZXN1bHQ7CiAJV09SRAlhZGRyOwogCi0JLy9wcmludGsoIlNzZmRjX0RfUmVhZEJsb2NrXG4iKTsKIAlyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwotCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQotCXsKKwlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgewogCQlwcmludGsoIkxvYWQgU00gUlcgQ29kZSBGYWlsICEhXG4iKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKLQlhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7Ci0JYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7CisJYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgTWVkaWEuUGh5QmxvY2s7CisJYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycyArIE1lZGlhLlNlY3RvcjsKIAotCS8vIFJlYWQgc2VjdCBkYXRhCisJLyogUmVhZCBzZWN0IGRhdGEgKi8KIAltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwogCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKIAliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aAk9IDB4MjAwKmNvdW50OwpAQCAtMzI0LDE0ICsyNzUsMTQgQEAKIAliY2ItPkNEQlswXQkJCT0gMHhGMTsKIAliY2ItPkNEQlsxXQkJCT0gMHgwMjsKIAliY2ItPkNEQls0XQkJCT0gKEJZVEUpYWRkcjsKLQliY2ItPkNEQlszXQkJCT0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKLQliY2ItPkNEQlsyXQkJCT0gTWVkaWEuWm9uZS8yOworCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoYWRkciAvIDB4MDEwMCk7CisJYmNiLT5DREJbMl0JCQk9IE1lZGlhLlpvbmUgLyAyOwogCiAJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIGJ1ZiwgMCk7CiAJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAKLQkvLyBSZWFkIHJlZHVuZGFudAorCS8qIFJlYWQgcmVkdW5kYW50ICovCiAJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKIAliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CiAJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGgJPSAweDEwOwpAQCAtMzM5LDggKzI5MCw4IEBACiAJYmNiLT5DREJbMF0JCQk9IDB4RjE7CiAJYmNiLT5DREJbMV0JCQk9IDB4MDM7CiAJYmNiLT5DREJbNF0JCQk9IChCWVRFKWFkZHI7Ci0JYmNiLT5DREJbM10JCQk9IChCWVRFKShhZGRyLzB4MDEwMCk7Ci0JYmNiLT5DREJbMl0JCQk9IE1lZGlhLlpvbmUvMjsKKwliY2ItPkNEQlszXQkJCT0gKEJZVEUpKGFkZHIgLyAweDAxMDApOworCWJjYi0+Q0RCWzJdCQkJPSBNZWRpYS5ab25lIC8gMjsKIAliY2ItPkNEQls4XQkJCT0gMDsKIAliY2ItPkNEQls5XQkJCT0gMTsKIApAQCAtMzUwLDE5MCArMzAxLDI3IEBACiAKIAlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7CiB9Ci0vKgotLy8vLy0tLS0tIFNzZmRjX0RfUmVhZFNlY3RfRE1BKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL2ludCBTc2ZkY19EX1JlYWRTZWN0X0RNQShQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBCWVRFICpidWYsQllURSAqcmVkdW5kYW50KQotLy97Ci0vLyAgICBXT1JEICAgIFNlY3RCeXRlQ291bnQsIGFkZHI7Ci0vLyAgICBEV09SRCAgIEJ1ZmZlcls0XTsKLS8vICAgIFdPUkQgICAgbGVuOwotLy8KLS8vICAgIGlmICghX0h3X0RfQ2hrQ2FyZEluKCkpCi0vLyAgICAgICByZXR1cm4oRVJST1IpOwotLy8gICAgYWRkcj0oV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKLS8vICAgIGFkZHI9YWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKLS8vICAgIC8vIGN5Y2xlIHN0YXJ0aW5nIGFkZHJlc3MKLS8vICAgIFNNX1NUQVJUQUREUl9MU0IgPSAweDAwOwotLy8gICAgU01fU1RBUlRBRERSX0lJU0IgPSAoQllURSlhZGRyOwotLy8gICAgU01fU1RBUlRBRERSX0lJSVNCID0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKLS8vICAgIFNNX1NUQVJUQUREUl9NU0IgPSBNZWRpYS5ab25lLzI7Ci0vLwotLy8gICAgLy9TZWN0b3IgYnl0ZSBjb3VudCA9IDB4MjAwKERNQSkKLS8vICAgIFNlY3RCeXRlQ291bnQgPSAweDIwZjsKLS8vICAgIFNNX0JZVEVDTlRfTE8gPSAoQllURSlTZWN0Qnl0ZUNvdW50OwotLy8gICAgU01fQ01EX0NUUkwzID0gKFNNX0NNRF9DVFJMMyAmIDB4RkMpIHwgKEJZVEUpKFNlY3RCeXRlQ291bnQvMHgwMTAwKTsKLS8vICAgIGlmICggKChmZG9FeHQtPkNoaXBJRD09UkVBREVSX0NCNzEyKSYmKGZkb0V4dC0+UmV2SUQ9PUNISVBfQSkpIHx8IGZkb0V4dC0+SXNIaWJlcm5hdGUgKQotLy8gICAgICAgU01fRklGT19DVFJMID0gKFNNX0FQQjA4X01BU0sgfCBTTV9ETUFFTl9NQVNLIHwgU01fRE1BX1VQU1RSRUFNX01BU0sgfCBTTV9GSUZPU0hMRFZMVV84X01BU0spOwotLy8gICAgZWxzZQotLy8gICAgICAgU01fRklGT19DVFJMID0gKFNNX0FQQjMyX01BU0sgfCBTTV9ETUFFTl9NQVNLIHwgU01fRE1BX1VQU1RSRUFNX01BU0sgfCBTTV9GSUZPU0hMRFZMVV84X01BU0spOwotLy8KLS8vICAgIF9Id19EX0VjY1JkUmVzZXQoKTsKLS8vICAgIF9Id19EX0VjY1JkU3RhcnQoKTsKLS8vCi0vLyAgICBTTV9DTURfQ1RSTDEgPSAoU01fQ01EX1JFQURfMSk7Ci0vLyAgICBTTV9DTURfQ1RSTDEgPSAoU01fQ01EX1JFQURfMSB8IFNNX0NNRF9TVEFSVF9CSVQpOwotLy8KLS8vICAgIFNlY3RCeXRlQ291bnQgPSAweDFmZjsKLS8vICAgIC8vU01fUmVhZERhdGFXaXRoRE1BKGZkb0V4dCwgYnVmLCBTZWN0Qnl0ZUNvdW50KTsKLS8vICAgIC8vX1JlYWRSZWR0X0RfU3NmZGNCdWYocmVkdW5kYW50KTsKLS8vICAgIGxlbiA9IDB4MTAwMCAtICgoV09SRCkoYnVmKSAmIDB4MEZGRik7Ci0vLyAgICBpZiAobGVuIDwgMHgyMDApCi0vLyAgICB7Ci0vLyAgICAgICBTTV9SZWFkRGF0YVdpdGhETUEoZmRvRXh0LCBidWYsIGxlbi0xKTsKLS8vICAgICAgIFNNX1JlYWREYXRhV2l0aERNQShmZG9FeHQsIGJ1ZitsZW4sIFNlY3RCeXRlQ291bnQtbGVuKTsKLS8vICAgICAgIC8vRU5FX1ByaW50KCJSZWFkIERNQSAhISEgYnVmMSA9ICVwLCBsZW4gPSAleCwgYnVmMiA9ICVwXG4iLCBidWYsIGxlbiwgYnVmK2xlbik7Ci0vLyAgICB9Ci0vLyAgICBlbHNlCi0vLyAgICAgIFNNX1JlYWREYXRhV2l0aERNQShmZG9FeHQsIGJ1ZiwgU2VjdEJ5dGVDb3VudCk7Ci0vLwotLy8gICAgaWYgKCAoKGZkb0V4dC0+Q2hpcElEPT1SRUFERVJfQ0I3MTIpJiYoZmRvRXh0LT5SZXZJRD09Q0hJUF9BKSkgfHwgZmRvRXh0LT5Jc0hpYmVybmF0ZSApCi0vLyAgICB7Ci0vLyAgICAgICBfUmVhZFJlZHRfRF9Tc2ZkY0J1ZihyZWR1bmRhbnQpOwotLy8gICAgfQotLy8gICAgZWxzZQotLy8gICAgewotLy8gICAgICAgQnVmZmVyWzBdID0gUkVBRF9QT1JUX0RXT1JEKFNNX1JFR19EQVRBKTsKLS8vICAgICAgIEJ1ZmZlclsxXSA9IFJFQURfUE9SVF9EV09SRChTTV9SRUdfREFUQSk7Ci0vLyAgICAgICBCdWZmZXJbMl0gPSBSRUFEX1BPUlRfRFdPUkQoU01fUkVHX0RBVEEpOwotLy8gICAgICAgQnVmZmVyWzNdID0gUkVBRF9QT1JUX0RXT1JEKFNNX1JFR19EQVRBKTsKLS8vICAgICAgIG1lbWNweShyZWR1bmRhbnQsIEJ1ZmZlciwgMHgxMCk7Ci0vLyAgICB9Ci0vLwotLy8gICAgd2hpbGUgKCBfSHdfRF9DaGtDYXJkSW4oKSApCi0vLyAgICB7Ci0vLyAgICAgICAgaWYoKFJFQURfUE9SVF9CWVRFKFNNX1JFR19JTlRfU1RBVFVTKSAmIDB4MTApKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgICAgV1JJVEVfUE9SVF9CWVRFKFNNX1JFR19JTlRfU1RBVFVTLCAweDEwKTsKLS8vICAgICAgICAgICAgYnJlYWs7Ci0vLyAgICAgICAgfQotLy8gICAgfQotLy8gICAgX0h3X0RfRWNjUmRTdG9wKCk7Ci0vLyAgICBfSHdfRF9TZXRSZFN0YW5kYnkoKTsKLS8vICAgIF9Mb2FkX0RfU3NmZGNSZEh3RUNDKEVWRU4pOwotLy8KLS8vICAgIF9DYWxjX0RfRUNDZGF0YShidWYpOwotLy8gICAgX1NldF9EX1NzZmRjUmRTdGFuZGJ5KCk7Ci0vLwotLy8gICAgaWYgKCFfSHdfRF9DaGtDYXJkSW4oKSkKLS8vICAgICAgIHJldHVybihFUlJPUik7Ci0vLyAgICByZXR1cm4oU01TVUNDRVNTKTsKLS8vfQotLy8KLS8vLy8tLS0tLSBTc2ZkY19EX1JlYWRTZWN0X1BJTygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9pbnQgU3NmZGNfRF9SZWFkU2VjdF9QSU8oUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKLS8vewotLy8gICAgX1NldF9EX1NzZmRjUmRDbWQoUkVBRCk7Ci0vLyAgICBfU2V0X0RfU3NmZGNSZEFkZHIoRVZFTik7Ci0vLwotLy8gICAgaWYgKF9DaGVja19EX1NzZmRjQnVzeShCVVNZX1JFQUQpKQotLy8gICAgeyBfUmVzZXRfRF9Tc2ZkY0VycigpOyByZXR1cm4oRVJST1IpOyB9Ci0vLwotLy8gICAgX1N0YXJ0X0RfU3NmZGNSZEh3RUNDKCk7Ci0vLyAgICBfUmVhZF9EX1NzZmRjQnVmKGJ1Zik7Ci0vLyAgICBfU3RvcF9EX1NzZmRjUmRId0VDQygpOwotLy8gICAgX1JlYWRSZWR0X0RfU3NmZGNCdWYocmVkdW5kYW50KTsKLS8vICAgIF9Mb2FkX0RfU3NmZGNSZEh3RUNDKEVWRU4pOwotLy8KLS8vICAgIGlmIChfQ2hlY2tfRF9Tc2ZkY0J1c3koQlVTWV9SRUFEKSkKLS8vICAgIHsgX1Jlc2V0X0RfU3NmZGNFcnIoKTsgcmV0dXJuKEVSUk9SKTsgfQotLy8KLS8vICAgIF9DYWxjX0RfRUNDZGF0YShidWYpOwotLy8gICAgX1NldF9EX1NzZmRjUmRTdGFuZGJ5KCk7Ci0vLyAgICByZXR1cm4oU01TVUNDRVNTKTsKLS8vfQogCi0vLyA2MjUwIENNRCAzCi0vLy0tLS0tIFNzZmRjX0RfV3JpdGVTZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBTc2ZkY19EX1dyaXRlU2VjdChQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBCWVRFICpidWYsQllURSAqcmVkdW5kYW50KQotewotICAgIFBCVUxLX0NCVyAgICAgICAgICAgICAgIHBCdWxrQ2J3ID0gZmRvRXh0LT5wQnVsa0NidzsKLSAgICBOVFNUQVRVUyAgICAgICAgICAgICAgICBudFN0YXR1czsKLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICBhZGRyOwogCi0gICAgLy9FTkVfUHJpbnQoIlNNSUxTVUIgLS0tIFNzZmRjX0RfV3JpdGVTZWN0XG4iKTsKLSAgICBFTkVfTG9hZEJpbkNvZGUoZmRvRXh0LCBTTV9SV19QQVRURVJOKTsKLQotICAgIGFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKLSAgICBhZGRyID0gYWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKLQotICAgIC8vIFdyaXRlIHNlY3QgZGF0YQotICAgIFJ0bFplcm9NZW1vcnkocEJ1bGtDYncsIHNpemVvZihzdHJ1Y3QgX0JVTEtfQ0JXKSk7Ci0gICAgcEJ1bGtDYnctPmRDQldTaWduYXR1cmUgICAgICAgICAgPSBDQldfU0lHTlRVUkU7Ci0gICAgcEJ1bGtDYnctPmJDQldMdW4gICAgICAgICAgICAgICAgPSBDQldfTFVOOwotICAgIHBCdWxrQ2J3LT5kQ0JXRGF0YVRyYW5zZmVyTGVuZ3RoID0gMHgyMDA7Ci0gICAgcEJ1bGtDYnctPmJtQ0JXRmxhZ3MgICAgICAgICAgICAgPSAweDAwOwotICAgIHBCdWxrQ2J3LT5DQldDYlswXSAgICAgICAgICAgICAgID0gMHhGMDsKLSAgICBwQnVsa0Nidy0+Q0JXQ2JbMV0gICAgICAgICAgICAgICA9IDB4MDQ7Ci0gICAgLy9wQnVsa0Nidy0+Q0JXQ2JbNF0gICAgICAgICAgICAgICA9IChCWVRFKWFkZHI7Ci0gICAgLy9wQnVsa0Nidy0+Q0JXQ2JbM10gICAgICAgICAgICAgICA9IChCWVRFKShhZGRyLzB4MDEwMCk7Ci0gICAgLy9wQnVsa0Nidy0+Q0JXQ2JbMl0gICAgICAgICAgICAgICA9IE1lZGlhLlpvbmUvMjsKLSAgICAvL3BCdWxrQ2J3LT5DQldDYls1XSAgICAgICAgICAgICAgID0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUgpOwotICAgIC8vcEJ1bGtDYnctPkNCV0NiWzZdICAgICAgICAgICAgICAgPSAqKHJlZHVuZGFudCtSRURUX0FERFIxTCk7Ci0gICAgcEJ1bGtDYnctPkNCV0NiWzddICAgICAgICAgICAgICAgPSAoQllURSlhZGRyOwotICAgIHBCdWxrQ2J3LT5DQldDYls2XSAgICAgICAgICAgICAgID0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKLSAgICBwQnVsa0Nidy0+Q0JXQ2JbNV0gICAgICAgICAgICAgICA9IE1lZGlhLlpvbmUvMjsKLSAgICBwQnVsa0Nidy0+Q0JXQ2JbOF0gICAgICAgICAgICAgICA9ICoocmVkdW5kYW50K1JFRFRfQUREUjFIKTsKLSAgICBwQnVsa0Nidy0+Q0JXQ2JbOV0gICAgICAgICAgICAgICA9ICoocmVkdW5kYW50K1JFRFRfQUREUjFMKTsKLQotICAgIG50U3RhdHVzID0gRU5FX1NlbmRTY3NpQ21kKGZkb0V4dCwgRkRJUl9XUklURSwgYnVmKTsKLQotICAgIGlmICghTlRfU1VDQ0VTUyhudFN0YXR1cykpCi0gICAgICAgcmV0dXJuKEVSUk9SKTsKLQotLy8gIC8vIEZvciBUZXN0Ci0vLyAgewotLy8gICAgIEJZVEUgICBiZlsweDIwMF0sIHJkZFsweDEwXTsKLS8vICAgICBVTE9ORyAgaTsKLS8vCi0vLyAgICAgUnRsWmVyb01lbW9yeShiZiwgMHgyMDApOwotLy8gICAgIFJ0bFplcm9NZW1vcnkocmRkLCAweDEwKTsKLS8vICAgICBudFN0YXR1cyA9IFNNX1JlYWRCbG9jayhmZG9FeHQsIGJmLCByZGQpOwotLy8gICAgIGZvciAoaT0wOyBpPDB4MjAwOyBpKyspCi0vLyAgICAgewotLy8gICAgICAgICBpZiAoYnVmW2ldICE9IGJmW2ldKQotLy8gICAgICAgICAgICBFTkVfUHJpbnQoImJ1ZlsleF0gPSAleCwgYmZbJXhdID0gJXhcbiIsIGJ1ZiwgYmYpOwotLy8gICAgIH0KLS8vICAgICBpZiAoIU5UX1NVQ0NFU1MobnRTdGF0dXMpKQotLy8gICAgICAgIEVORV9QcmludCgiRXJyb3JcbiIpOwotLy8gIH0KLQotICAgIHJldHVybihTTVNVQ0NFU1MpOwotfQotKi8KLS8vLS0tLS0gU3NmZGNfRF9Db3B5QmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50IFNzZmRjX0RfQ29weUJsb2NrKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBjb3VudCwgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKKy8qIC0tLS0tIFNzZmRjX0RfQ29weUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2ludCBTc2ZkY19EX0NvcHlCbG9jayhzdHJ1Y3QgdXNfZGF0YSAqdXMsIFdPUkQgY291bnQsIEJZVEUgKmJ1ZiwgQllURSAqcmVkdW5kYW50KQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlpbnQJcmVzdWx0OwotICAgIC8vUEJVTEtfQ0JXICAgICAgICAgICAgICAgcEJ1bGtDYncgPSBmZG9FeHQtPnBCdWxrQ2J3OwotICAgIC8vTlRTVEFUVVMgICAgICAgICAgICAgICAgbnRTdGF0dXM7CiAJV09SRAlSZWFkQWRkciwgV3JpdGVBZGRyOwogCi0JLy9wcmludGsoIlNzZmRjX0RfV3JpdGVTZWN0IC0tLSBaT05FID0gJXgsIFJlYWRCbG9jayA9ICV4LCBXcml0ZUJsb2NrID0gJXhcbiIsIE1lZGlhLlpvbmUsIFJlYWRCbG9jaywgV3JpdGVCbG9jayk7Ci0KIAlyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwotCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQotCXsKKwlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgewogCQlwcmludGsoIkxvYWQgU00gUlcgQ29kZSBGYWlsICEhXG4iKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKLQlSZWFkQWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK1JlYWRCbG9jazsKKwlSZWFkQWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgUmVhZEJsb2NrOwogCVJlYWRBZGRyID0gUmVhZEFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9yczsKLQlXcml0ZUFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytXcml0ZUJsb2NrOworCVdyaXRlQWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgV3JpdGVCbG9jazsKIAlXcml0ZUFkZHIgPSBXcml0ZUFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9yczsKIAotCS8vIFdyaXRlIHNlY3QgZGF0YQorCS8qIFdyaXRlIHNlY3QgZGF0YSAqLwogCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CiAJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwogCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoCT0gMHgyMDAqY291bnQ7CkBAIC01NDEsMTkgKzMyOSwxNyBAQAogCWJjYi0+Q0RCWzBdCQkJPSAweEYwOwogCWJjYi0+Q0RCWzFdCQkJPSAweDA4OwogCWJjYi0+Q0RCWzddCQkJPSAoQllURSlXcml0ZUFkZHI7Ci0JYmNiLT5DREJbNl0JCQk9IChCWVRFKShXcml0ZUFkZHIvMHgwMTAwKTsKLQliY2ItPkNEQls1XQkJCT0gTWVkaWEuWm9uZS8yOwotCWJjYi0+Q0RCWzhdCQkJPSAqKHJlZHVuZGFudCtSRURUX0FERFIxSCk7Ci0JYmNiLT5DREJbOV0JCQk9ICoocmVkdW5kYW50K1JFRFRfQUREUjFMKTsKKwliY2ItPkNEQls2XQkJCT0gKEJZVEUpKFdyaXRlQWRkciAvIDB4MDEwMCk7CisJYmNiLT5DREJbNV0JCQk9IE1lZGlhLlpvbmUgLyAyOworCWJjYi0+Q0RCWzhdCQkJPSAqKHJlZHVuZGFudCArIFJFRFRfQUREUjFIKTsKKwliY2ItPkNEQls5XQkJCT0gKihyZWR1bmRhbnQgKyBSRURUX0FERFIxTCk7CiAJYmNiLT5DREJbMTBdCQk9IE1lZGlhLlNlY3RvcjsKIAotCWlmIChSZWFkQmxvY2sgIT0gTk9fQVNTSUdOKQotCXsKKwlpZiAoUmVhZEJsb2NrICE9IE5PX0FTU0lHTikgewogCQliY2ItPkNEQls0XQkJPSAoQllURSlSZWFkQWRkcjsKLQkJYmNiLT5DREJbM10JCT0gKEJZVEUpKFJlYWRBZGRyLzB4MDEwMCk7Ci0JCWJjYi0+Q0RCWzJdCQk9IE1lZGlhLlpvbmUvMjsKLQl9Ci0JZWxzZQorCQliY2ItPkNEQlszXQkJPSAoQllURSkoUmVhZEFkZHIgLyAweDAxMDApOworCQliY2ItPkNEQlsyXQkJPSBNZWRpYS5ab25lIC8gMjsKKwl9IGVsc2UKIAkJYmNiLT5DREJbMTFdCT0gMTsKIAogCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9XUklURSwgYnVmLCAwKTsKQEAgLTU2MiwxOTYgKzM0OCwyNSBAQAogCiAJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwogfQotLyoKLS8vLS0tLS0gU3NmZGNfRF9Xcml0ZUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBTc2ZkY19EX1dyaXRlQmxvY2soUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgV09SRCBjb3VudCwgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKLXsKLSAgICBQQlVMS19DQlcgICAgICAgICAgICAgICBwQnVsa0NidyA9IGZkb0V4dC0+cEJ1bGtDYnc7Ci0gICAgTlRTVEFUVVMgICAgICAgICAgICAgICAgbnRTdGF0dXM7Ci0gICAgV09SRCAgICAgICAgICAgICAgICAgICAgYWRkcjsKIAotICAgIC8vRU5FX1ByaW50KCJTTUlMU1VCIC0tLSBTc2ZkY19EX1dyaXRlU2VjdFxuIik7Ci0gICAgRU5FX0xvYWRCaW5Db2RlKGZkb0V4dCwgU01fUldfUEFUVEVSTik7Ci0KLSAgICBhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7Ci0gICAgYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7Ci0KLSAgICAvLyBXcml0ZSBzZWN0IGRhdGEKLSAgICBSdGxaZXJvTWVtb3J5KHBCdWxrQ2J3LCBzaXplb2Yoc3RydWN0IF9CVUxLX0NCVykpOwotICAgIHBCdWxrQ2J3LT5kQ0JXU2lnbmF0dXJlICAgICAgICAgID0gQ0JXX1NJR05UVVJFOwotICAgIHBCdWxrQ2J3LT5iQ0JXTHVuICAgICAgICAgICAgICAgID0gQ0JXX0xVTjsKLSAgICBwQnVsa0Nidy0+ZENCV0RhdGFUcmFuc2Zlckxlbmd0aCA9IDB4MjAwKmNvdW50OwotICAgIHBCdWxrQ2J3LT5ibUNCV0ZsYWdzICAgICAgICAgICAgID0gMHgwMDsKLSAgICBwQnVsa0Nidy0+Q0JXQ2JbMF0gICAgICAgICAgICAgICA9IDB4RjA7Ci0gICAgcEJ1bGtDYnctPkNCV0NiWzFdICAgICAgICAgICAgICAgPSAweDA0OwotICAgIHBCdWxrQ2J3LT5DQldDYls3XSAgICAgICAgICAgICAgID0gKEJZVEUpYWRkcjsKLSAgICBwQnVsa0Nidy0+Q0JXQ2JbNl0gICAgICAgICAgICAgICA9IChCWVRFKShhZGRyLzB4MDEwMCk7Ci0gICAgcEJ1bGtDYnctPkNCV0NiWzVdICAgICAgICAgICAgICAgPSBNZWRpYS5ab25lLzI7Ci0gICAgcEJ1bGtDYnctPkNCV0NiWzhdICAgICAgICAgICAgICAgPSAqKHJlZHVuZGFudCtSRURUX0FERFIxSCk7Ci0gICAgcEJ1bGtDYnctPkNCV0NiWzldICAgICAgICAgICAgICAgPSAqKHJlZHVuZGFudCtSRURUX0FERFIxTCk7Ci0KLSAgICBudFN0YXR1cyA9IEVORV9TZW5kU2NzaUNtZChmZG9FeHQsIEZESVJfV1JJVEUsIGJ1Zik7Ci0KLSAgICBpZiAoIU5UX1NVQ0NFU1MobnRTdGF0dXMpKQotICAgICAgIHJldHVybihFUlJPUik7Ci0KLS8vICAvLyBGb3IgVGVzdAotLy8gIHsKLS8vICAgICBCWVRFICAgYmZbMHgyMDBdLCByZGRbMHgxMF07Ci0vLyAgICAgVUxPTkcgIGk7Ci0vLwotLy8gICAgIFJ0bFplcm9NZW1vcnkoYmYsIDB4MjAwKTsKLS8vICAgICBSdGxaZXJvTWVtb3J5KHJkZCwgMHgxMCk7Ci0vLyAgICAgbnRTdGF0dXMgPSBTTV9SZWFkQmxvY2soZmRvRXh0LCBiZiwgcmRkKTsKLS8vICAgICBmb3IgKGk9MDsgaTwweDIwMDsgaSsrKQotLy8gICAgIHsKLS8vICAgICAgICAgaWYgKGJ1ZltpXSAhPSBiZltpXSkKLS8vICAgICAgICAgICAgRU5FX1ByaW50KCJidWZbJXhdID0gJXgsIGJmWyV4XSA9ICV4XG4iLCBidWYsIGJmKTsKLS8vICAgICB9Ci0vLyAgICAgaWYgKCFOVF9TVUNDRVNTKG50U3RhdHVzKSkKLS8vICAgICAgICBFTkVfUHJpbnQoIkVycm9yXG4iKTsKLS8vICB9Ci0KLSAgICByZXR1cm4oU01TVUNDRVNTKTsKLX0KLS8vCi0vLy8vLS0tLS0gU3NmZGNfRF9Xcml0ZVNlY3RfRE1BKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vaW50IFNzZmRjX0RfV3JpdGVTZWN0X0RNQShQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBCWVRFICpidWYsQllURSAqcmVkdW5kYW50KQotLy97Ci0vLyAgICBXT1JEICAgIFNlY3RCeXRlQ291bnQsIGFkZHI7Ci0vLyAgICBEV09SRCAgIEJ1ZmZlcls0XTsKLS8vICAgIFdPUkQgICAgbGVuOwotLy8KLS8vICAgIGlmICghX0h3X0RfQ2hrQ2FyZEluKCkpCi0vLyAgICAgICByZXR1cm4oRVJST1IpOwotLy8gICAgYWRkcj0oV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKLS8vICAgIGFkZHI9YWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKLS8vICAgIC8vIGN5Y2xlIHN0YXJ0aW5nIGFkZHJlc3MKLS8vICAgIFNNX1NUQVJUQUREUl9MU0IgPSAweDAwOwotLy8gICAgU01fU1RBUlRBRERSX0lJU0IgPSAoQllURSlhZGRyOwotLy8gICAgU01fU1RBUlRBRERSX0lJSVNCID0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKLS8vICAgIFNNX1NUQVJUQUREUl9NU0IgPSBNZWRpYS5ab25lLzI7Ci0vLwotLy8gICAgLy9TZWN0b3IgYnl0ZSBjb3VudCAoRE1BKQotLy8gICAgU2VjdEJ5dGVDb3VudCA9IDB4MjBmOwotLy8gICAgU01fQllURUNOVF9MTyA9IChCWVRFKVNlY3RCeXRlQ291bnQ7Ci0vLyAgICBTTV9DTURfQ1RSTDMgPSAoU01fQ01EX0NUUkwzICYgMHhGQykgfCAweDIwIHwgKEJZVEUpKFNlY3RCeXRlQ291bnQvMHgwMTAwKTsKLS8vICAgIGlmICggKChmZG9FeHQtPkNoaXBJRD09UkVBREVSX0NCNzEyKSYmKGZkb0V4dC0+UmV2SUQ9PUNISVBfQSkpIHx8IGZkb0V4dC0+SXNIaWJlcm5hdGUgKQotLy8gICAgICAgU01fRklGT19DVFJMID0gKFNNX0FQQjA4X01BU0sgfCBTTV9ETUFFTl9NQVNLIHwgU01fRE1BX0RPV05TVFJFQU1fTUFTSyB8IFNNX0ZJRk9TSExEVkxVXzhfTUFTSyk7Ci0vLyAgICBlbHNlCi0vLyAgICAgICBTTV9GSUZPX0NUUkwgPSAoU01fQVBCMzJfTUFTSyB8IFNNX0RNQUVOX01BU0sgfCBTTV9ETUFfRE9XTlNUUkVBTV9NQVNLIHwgU01fRklGT1NITERWTFVfOF9NQVNLKTsKLS8vCi0vLyAgICBfSHdfRF9FY2NSZFJlc2V0KCk7Ci0vLyAgICBfSHdfRF9FY2NSZFN0YXJ0KCk7Ci0vLwotLy8gICAgU01fQ01EX0NUUkwxID0gU01fQ01EX1BBR1BSR01fVFJVRTsKLS8vICAgIFNNX0NNRF9DVFJMMSA9IChTTV9DTURfUEFHUFJHTV9UUlVFIHwgU01fQ01EX1NUQVJUX0JJVCk7Ci0vLwotLy8gICAgU2VjdEJ5dGVDb3VudCA9IDB4MWZmOwotLy8gICAgLy9TTV9Xcml0ZURhdGFXaXRoRE1BKGZkb0V4dCwgYnVmLCBTZWN0Qnl0ZUNvdW50KTsKLS8vICAgIC8vX1dyaXRlUmVkdF9EX1NzZmRjQnVmKHJlZHVuZGFudCk7Ci0vLyAgICBsZW4gPSAweDEwMDAgLSAoKFdPUkQpKGJ1ZikgJiAweDBGRkYpOwotLy8gICAgaWYgKGxlbiA8IDB4MjAwKQotLy8gICAgewotLy8gICAgICAgU01fV3JpdGVEYXRhV2l0aERNQShmZG9FeHQsIGJ1ZiwgbGVuLTEpOwotLy8gICAgICAgU01fV3JpdGVEYXRhV2l0aERNQShmZG9FeHQsIGJ1ZitsZW4sIFNlY3RCeXRlQ291bnQtbGVuKTsKLS8vICAgICAgIC8vRU5FX1ByaW50KCJSZWFkIERNQSAhISEgYnVmMSA9ICVwLCBsZW4gPSAleCwgYnVmMiA9ICVwXG4iLCBidWYsIGxlbiwgYnVmK2xlbik7Ci0vLyAgICB9Ci0vLyAgICBlbHNlCi0vLyAgICAgIFNNX1dyaXRlRGF0YVdpdGhETUEoZmRvRXh0LCBidWYsIFNlY3RCeXRlQ291bnQpOwotLy8KLS8vICAgIC8vVDEgPSAoVUxPTkdMT05HKWJ1ZiAmIDB4RkZGRkZGRkZGRkZGRjAwMDsKLS8vICAgIC8vVDIgPSAoKFVMT05HTE9ORylidWYgKyAweDFGRikgJiAweEZGRkZGRkZGRkZGRkYwMDA7Ci0vLyAgICAvL2lmIChUMSAhPSBUMikKLS8vICAgIC8vICAgRU5FX1ByaW50KCJTc2ZkY19EX1dyaXRlU2VjdF9ETUEgISEhIGJ1ZiA9ICVwLCBUMSA9ICVwLCBUMiA9ICVwXG4iLCBidWYsIFQxLCBUMik7Ci0vLyAgICAvL2lmIChUMi1UMSkKLS8vICAgIC8vewotLy8gICAgLy8gICBsMSA9IChXT1JEKShUMiAtIChVTE9OR0xPTkcpYnVmKTsKLS8vICAgIC8vICAgU01fV3JpdGVEYXRhV2l0aERNQShmZG9FeHQsIGJ1ZiwgbDEtMSk7Ci0vLyAgICAvLyAgIFNNX1dyaXRlRGF0YVdpdGhETUEoZmRvRXh0LCAoUEJZVEUpVDIsIFNlY3RCeXRlQ291bnQtbDEpOwotLy8gICAgLy99Ci0vLyAgICAvL2Vsc2UKLS8vICAgIC8vICBTTV9Xcml0ZURhdGFXaXRoRE1BKGZkb0V4dCwgYnVmLCBTZWN0Qnl0ZUNvdW50KTsKLS8vCi0vLyAgICBpZiAoICgoZmRvRXh0LT5DaGlwSUQ9PVJFQURFUl9DQjcxMikmJihmZG9FeHQtPlJldklEPT1DSElQX0EpKSB8fCBmZG9FeHQtPklzSGliZXJuYXRlICkKLS8vICAgIHsKLS8vICAgICAgIF9Xcml0ZVJlZHRfRF9Tc2ZkY0J1ZihyZWR1bmRhbnQpOwotLy8gICAgfQotLy8gICAgZWxzZQotLy8gICAgewotLy8gICAgICAgbWVtY3B5KEJ1ZmZlciwgcmVkdW5kYW50LCAweDEwKTsKLS8vICAgICAgIFdSSVRFX1BPUlRfRFdPUkQoU01fUkVHX0RBVEEsIEJ1ZmZlclswXSk7Ci0vLyAgICAgICBXUklURV9QT1JUX0RXT1JEKFNNX1JFR19EQVRBLCBCdWZmZXJbMV0pOwotLy8gICAgICAgV1JJVEVfUE9SVF9EV09SRChTTV9SRUdfREFUQSwgQnVmZmVyWzJdKTsKLS8vICAgICAgIFdSSVRFX1BPUlRfRFdPUkQoU01fUkVHX0RBVEEsIEJ1ZmZlclszXSk7Ci0vLyAgICB9Ci0vLwotLy8gICAgd2hpbGUgKCBfSHdfRF9DaGtDYXJkSW4oKSApCi0vLyAgICB7Ci0vLyAgICAgICBpZiAoKFJFQURfUE9SVF9CWVRFKFNNX1JFR19JTlRfU1RBVFVTKSAmIDB4MTApKQotLy8gICAgICAgewotLy8gICAgICAgICAgIFdSSVRFX1BPUlRfQllURShTTV9SRUdfSU5UX1NUQVRVUywgMHgxMCk7Ci0vLyAgICAgICAgICAgYnJlYWs7Ci0vLyAgICAgICB9Ci0vLyAgICB9Ci0vLyAgICBfSHdfRF9FY2NSZFN0b3AoKTsKLS8vICAgIF9Id19EX1NldFJkU3RhbmRieSgpOwotLy8KLS8vICAgIF9TZXRfRF9Tc2ZkY1dyU3RhbmRieSgpOwotLy8gICAgX1NldF9EX1NzZmRjUmRTdGFuZGJ5KCk7Ci0vLyAgICBpZiAoIV9Id19EX0Noa0NhcmRJbigpKQotLy8gICAgICAgcmV0dXJuKEVSUk9SKTsKLS8vCi0vLyAgICByZXR1cm4oU01TVUNDRVNTKTsKLS8vfQotLy8KLS8vLy8tLS0tLSBTc2ZkY19EX1dyaXRlU2VjdF9QSU8oKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9pbnQgU3NmZGNfRF9Xcml0ZVNlY3RfUElPKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIEJZVEUgKmJ1ZixCWVRFICpyZWR1bmRhbnQpCi0vL3sKLS8vICAgIF9DYWxjX0RfRUNDZGF0YShidWYpOwotLy8gICAgX1NldF9EX1NzZmRjV3JDbWQoV1JEQVRBKTsKLS8vICAgIF9TZXRfRF9Tc2ZkY1dyQWRkcihFVkVOKTsKLS8vICAgIF9TdGFydF9EX1NzZmRjV3JId0VDQygpOwotLy8KLS8vICAgIF9Xcml0ZV9EX1NzZmRjQnVmKGJ1Zik7Ci0vLwotLy8gICAgX0xvYWRfRF9Tc2ZkY1dySHdFQ0MoRVZFTik7Ci0vLyAgICBfU2V0X0RfRUNDZGF0YShFVkVOLHJlZHVuZGFudCk7Ci0vLwotLy8gICAgX1dyaXRlUmVkdF9EX1NzZmRjQnVmKHJlZHVuZGFudCk7Ci0vLwotLy8gICAgX1NldF9EX1NzZmRjV3JDbWQoV1JJVEUpOwotLy8KLS8vICAgIGlmIChfQ2hlY2tfRF9Tc2ZkY0J1c3koQlVTWV9QUk9HKSkKLS8vICAgIHsgX1Jlc2V0X0RfU3NmZGNFcnIoKTsgcmV0dXJuKEVSUk9SKTsgfQotLy8KLS8vICAgIF9TZXRfRF9Tc2ZkY1dyU3RhbmRieSgpOwotLy8gICAgX1NldF9EX1NzZmRjUmRTdGFuZGJ5KCk7Ci0vLyAgICByZXR1cm4oU01TVUNDRVNTKTsKLS8vfQotKi8KLS8vLS0tLS0gU3NmZGNfRF9Xcml0ZVNlY3RGb3JDb3B5KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0gU3NmZGNfRF9Xcml0ZVNlY3RGb3JDb3B5KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogaW50IFNzZmRjX0RfV3JpdGVTZWN0Rm9yQ29weShzdHJ1Y3QgdXNfZGF0YSAqdXMsIEJZVEUgKmJ1ZiwgQllURSAqcmVkdW5kYW50KQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlpbnQJcmVzdWx0OwotCS8vUEJVTEtfQ0JXICAgICAgICAgICAgICAgcEJ1bGtDYncgPSBmZG9FeHQtPnBCdWxrQ2J3OwotCS8vTlRTVEFUVVMgICAgICAgICAgICAgICAgbnRTdGF0dXM7Ci0JV09SRCAgICAgICAgICAgICAgICAgICAgYWRkcjsKKwlXT1JECWFkZHI7CiAKLQkvL3ByaW50aygiU01JTFNVQiAtLS0gU3NmZGNfRF9Xcml0ZVNlY3RGb3JDb3B5XG4iKTsKIAlyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwotCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQotCXsKKwlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgewogCQlwcmludGsoIkxvYWQgU00gUlcgQ29kZSBGYWlsICEhXG4iKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKIAotCWFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKLQlhZGRyID0gYWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKKwlhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MgKyBNZWRpYS5QaHlCbG9jazsKKwlhZGRyID0gYWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzICsgTWVkaWEuU2VjdG9yOwogCi0JLy8gV3JpdGUgc2VjdCBkYXRhCisJLyogV3JpdGUgc2VjdCBkYXRhICovCiAJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKIAliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CiAJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGgJPSAweDIwMDsKQEAgLTc1OSwxMCArMzc0LDEwIEBACiAJYmNiLT5DREJbMF0JCQk9IDB4RjA7CiAJYmNiLT5DREJbMV0JCQk9IDB4MDQ7CiAJYmNiLT5DREJbN10JCQk9IChCWVRFKWFkZHI7Ci0JYmNiLT5DREJbNl0JCQk9IChCWVRFKShhZGRyLzB4MDEwMCk7Ci0JYmNiLT5DREJbNV0JCQk9IE1lZGlhLlpvbmUvMjsKLQliY2ItPkNEQls4XQkJCT0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUgpOwotCWJjYi0+Q0RCWzldCQkJPSAqKHJlZHVuZGFudCtSRURUX0FERFIxTCk7CisJYmNiLT5DREJbNl0JCQk9IChCWVRFKShhZGRyIC8gMHgwMTAwKTsKKwliY2ItPkNEQls1XQkJCT0gTWVkaWEuWm9uZSAvIDI7CisJYmNiLT5DREJbOF0JCQk9ICoocmVkdW5kYW50ICsgUkVEVF9BRERSMUgpOworCWJjYi0+Q0RCWzldCQkJPSAqKHJlZHVuZGFudCArIFJFRFRfQUREUjFMKTsKIAogCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9XUklURSwgYnVmLCAwKTsKIAlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKQEAgLTc3MSw4ICszODYsOCBAQAogCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKIH0KIAotLy8gNjI1MCBDTUQgNQotLy8tLS0tLSBTc2ZkY19EX0VyYXNlQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiA2MjUwIENNRCA1ICovCisvKiAtLS0tLSBTc2ZkY19EX0VyYXNlQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBpbnQgU3NmZGNfRF9FcmFzZUJsb2NrKHN0cnVjdCB1c19kYXRhICp1cykKIHsKIAlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CkBAIC03ODAsMTQgKzM5NSwxMyBAQAogCVdPUkQJYWRkcjsKIAogCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgU01fUldfUEFUVEVSTik7Ci0JaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCi0JeworCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKSB7CiAJCXByaW50aygiTG9hZCBTTSBSVyBDb2RlIEZhaWwgISFcbiIpOwogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCX0KIAotCWFkZHI9KFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7Ci0JYWRkcj1hZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnM7CisJYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgTWVkaWEuUGh5QmxvY2s7CisJYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9yczsKIAogCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CiAJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwpAQCAtNzk2LDggKzQxMCw4IEBACiAJYmNiLT5DREJbMF0JCQk9IDB4RjI7CiAJYmNiLT5DREJbMV0JCQk9IDB4MDY7CiAJYmNiLT5DREJbN10JCQk9IChCWVRFKWFkZHI7Ci0JYmNiLT5DREJbNl0JCQk9IChCWVRFKShhZGRyLzB4MDEwMCk7Ci0JYmNiLT5DREJbNV0JCQk9IE1lZGlhLlpvbmUvMjsKKwliY2ItPkNEQls2XQkJCT0gKEJZVEUpKGFkZHIgLyAweDAxMDApOworCWJjYi0+Q0RCWzVdCQkJPSBNZWRpYS5ab25lIC8gMjsKIAogCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9SRUFELCBOVUxMLCAwKTsKIAlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKQEAgLTgwNiwyNCArNDIwLDIzIEBACiAJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwogfQogCi0vLyA2MjUwIENNRCAyCi0vLy0tLS0tIFNzZmRjX0RfUmVhZFJlZHREYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIDYyNTAgQ01EIDIgKi8KKy8qLS0tLS0gU3NmZGNfRF9SZWFkUmVkdERhdGEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogaW50IFNzZmRjX0RfUmVhZFJlZHREYXRhKHN0cnVjdCB1c19kYXRhICp1cywgQllURSAqcmVkdW5kYW50KQogewogCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKIAlpbnQJcmVzdWx0OwogCVdPUkQJYWRkcjsKLQlCWVRFICAqYnVmOworCUJZVEUJKmJ1ZjsKIAogCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgU01fUldfUEFUVEVSTik7Ci0JaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCi0JeworCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKSB7CiAJCXByaW50aygiTG9hZCBTTSBSVyBDb2RlIEZhaWwgISFcbiIpOwogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwogCX0KIAotCWFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKLQlhZGRyID0gYWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKKwlhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MgKyBNZWRpYS5QaHlCbG9jazsKKwlhZGRyID0gYWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzICsgTWVkaWEuU2VjdG9yOwogCiAJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKIAliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CkBAIC04MzIsMTMgKzQ0NSwxMiBAQAogCWJjYi0+Q0RCWzBdCQkJPSAweEYxOwogCWJjYi0+Q0RCWzFdCQkJPSAweDAzOwogCWJjYi0+Q0RCWzRdCQkJPSAoQllURSlhZGRyOwotCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoYWRkci8weDAxMDApOwotCWJjYi0+Q0RCWzJdCQkJPSBNZWRpYS5ab25lLzI7CisJYmNiLT5DREJbM10JCQk9IChCWVRFKShhZGRyIC8gMHgwMTAwKTsKKwliY2ItPkNEQlsyXQkJCT0gTWVkaWEuWm9uZSAvIDI7CiAJYmNiLT5DREJbOF0JCQk9IDA7CiAJYmNiLT5DREJbOV0JCQk9IDE7CiAKIAlidWYgPSBrbWFsbG9jKDB4MTAsIEdGUF9LRVJORUwpOwotCS8vcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIHJlZHVuZGFudCwgMCk7CiAJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIGJ1ZiwgMCk7CiAJbWVtY3B5KHJlZHVuZGFudCwgYnVmLCAweDEwKTsKIAlrZnJlZShidWYpOwpAQCAtODQ4LDI1ICs0NjAsMjIgQEAKIAlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7CiB9CiAKLS8vIDYyNTAgQ01EIDQKLS8vLS0tLS0gU3NmZGNfRF9Xcml0ZVJlZHREYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogNjI1MCBDTUQgNCAqLworLyogLS0tLS0gU3NmZGNfRF9Xcml0ZVJlZHREYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogaW50IFNzZmRjX0RfV3JpdGVSZWR0RGF0YShzdHJ1Y3QgdXNfZGF0YSAqdXMsIEJZVEUgKnJlZHVuZGFudCkKIHsKIAlzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CiAJaW50CXJlc3VsdDsKLQkvL1BCVUxLX0NCVyAgICAgICAgICAgICAgIHBCdWxrQ2J3ID0gZmRvRXh0LT5wQnVsa0NidzsKLQkvL05UU1RBVFVTICAgICAgICAgICAgICAgIG50U3RhdHVzOwogCVdPUkQgICAgICAgICAgICAgICAgICAgIGFkZHI7CiAKIAlyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwotCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQotCXsKKwlpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkgewogCQlwcmludGsoIkxvYWQgU00gUlcgQ29kZSBGYWlsICEhXG4iKTsKIAkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKIAl9CiAKLQlhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7Ci0JYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7CisJYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzICsgTWVkaWEuUGh5QmxvY2s7CisJYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycyArIE1lZGlhLlNlY3RvcjsKIAogCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CiAJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwpAQCAtODc1LDEwICs0ODQsMTAgQEAKIAliY2ItPkNEQlswXQkJCT0gMHhGMjsKIAliY2ItPkNEQlsxXQkJCT0gMHgwNTsKIAliY2ItPkNEQls3XQkJCT0gKEJZVEUpYWRkcjsKLQliY2ItPkNEQls2XQkJCT0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKLQliY2ItPkNEQls1XQkJCT0gTWVkaWEuWm9uZS8yOwotCWJjYi0+Q0RCWzhdCQkJPSAqKHJlZHVuZGFudCtSRURUX0FERFIxSCk7Ci0JYmNiLT5DREJbOV0JCQk9ICoocmVkdW5kYW50K1JFRFRfQUREUjFMKTsKKwliY2ItPkNEQls2XQkJCT0gKEJZVEUpKGFkZHIgLyAweDAxMDApOworCWJjYi0+Q0RCWzVdCQkJPSBNZWRpYS5ab25lIC8gMjsKKwliY2ItPkNEQls4XQkJCT0gKihyZWR1bmRhbnQgKyBSRURUX0FERFIxSCk7CisJYmNiLT5DREJbOV0JCQk9ICoocmVkdW5kYW50ICsgUkVEVF9BRERSMUwpOwogCiAJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIE5VTEwsIDApOwogCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQpAQCAtODg3LDYwOSArNDk2LDE2NyBAQAogCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKIH0KIAotLy8tLS0tLSBTc2ZkY19EX0NoZWNrU3RhdHVzKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLSBTc2ZkY19EX0NoZWNrU3RhdHVzKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBpbnQgU3NmZGNfRF9DaGVja1N0YXR1cyh2b2lkKQogewotICAgIC8vIERyaXZlciCko7C1Ci0gICAgcmV0dXJuKFNNU1VDQ0VTUyk7Ci0gICAgLy9fU2V0X0RfU3NmZGNSZENtZChSRFNUQVRVUyk7Ci0gICAgLy8KLSAgICAvL2lmIChfQ2hlY2tfRF9Tc2ZkY1N0YXR1cygpKQotICAgIC8veyBfU2V0X0RfU3NmZGNSZFN0YW5kYnkoKTsgcmV0dXJuKEVSUk9SKTsgfQotICAgIC8vCi0gICAgLy9fU2V0X0RfU3NmZGNSZFN0YW5kYnkoKTsKLSAgICAvL3JldHVybihTTVNVQ0NFU1MpOworCXJldHVybiBTTVNVQ0NFU1M7CiB9Ci0vKgotLy8vL05BTkQgTWVtb3J5IChTbWFydE1lZGlhKSBDb250cm9sIFN1YnJvdXRpbmUgZm9yIFJlYWQgRGF0YQotLy8vLy0tLS0tIF9TZXRfRF9Tc2ZkY1JkQ21kKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vdm9pZCBfU2V0X0RfU3NmZGNSZENtZChCWVRFIGNtZCkKLS8vewotLy8gICAgX0h3X0RfU2V0UmRDbWQoKTsKLS8vICAgIF9Id19EX091dERhdGEoY21kKTsKLS8vICAgIF9Id19EX1NldFJkRGF0YSgpOwotLy99Ci0vLwotLy8vLy0tLS0tIF9TZXRfRF9Tc2ZkY1JkQWRkcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vdm9pZCBfU2V0X0RfU3NmZGNSZEFkZHIoQllURSBhZGQpCi0vL3sKLS8vICAgIFdPUkQgYWRkcjsKLS8vICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwotLy8gICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7Ci0vLwotLy8gICAgYWRkcj0oV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKLS8vICAgIGFkZHI9YWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKLS8vCi0vLyAgICAvL2lmICgoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1NikgLy8gZm9yIDI1NmJ5dGUvcGFnZQotLy8gICAgLy8gICAgYWRkcj1hZGRyKjIrKFdPUkQpYWRkOwotLy8KLS8vICAgIF9Id19EX1NldFJkQWRkcigpOwotLy8gICAgX0h3X0RfT3V0RGF0YSgweDAwKTsKLS8vICAgIF9Id19EX091dERhdGEoKEJZVEUpYWRkcik7Ci0vLyAgICBfSHdfRF9PdXREYXRhKChCWVRFKShhZGRyLzB4MDEwMCkpOwotLy8KLS8vICAgIGlmICgoU3NmZGMuQXR0cmlidXRlICZNQURDKT09QUQ0Q1lDKQotLy8gICAgICAgIF9Id19EX091dERhdGEoKEJZVEUpKE1lZGlhLlpvbmUvMikpOyAvLyBQYXRjaAotLy8KLS8vICAgIF9Id19EX1NldFJkRGF0YSgpOwotLy99Ci0vLwotLy8vLy0tLS0tIF9TZXRfRF9Tc2ZkY1JkQ2hpcCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vdm9pZCBfU2V0X0RfU3NmZGNSZENoaXAodm9pZCkKLS8vewotLy8gICAgX0h3X0RfU2V0UmRBZGRyKCk7Ci0vLyAgICBfSHdfRF9PdXREYXRhKDB4MDApOwotLy8gICAgX0h3X0RfU2V0UmREYXRhKCk7Ci0vL30KLS8vCi0vLy8vLS0tLS0gX1NldF9EX1NzZmRjUmRTdGFuZGJ5KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy92b2lkIF9TZXRfRF9Tc2ZkY1JkU3RhbmRieSh2b2lkKQotLy97Ci0vLyAgICBfSHdfRF9TZXRSZFN0YW5kYnkoKTsKLS8vfQotLy8KLS8vLy8tLS0tLSBfU3RhcnRfRF9Tc2ZkY1JkSHdFQ0MoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL3ZvaWQgX1N0YXJ0X0RfU3NmZGNSZEh3RUNDKHZvaWQpCi0vL3sKLS8vI2lmZGVmIEhXX0VDQ19TVVBQT1JURUQKLS8vICAgIF9Id19EX0VjY1JkUmVzZXQoKTsKLS8vICAgIF9Id19EX0luRGF0YSgpOwotLy8gICAgX0h3X0RfRWNjUmRTdGFydCgpOwotLy8jZW5kaWYKLS8vfQotLy8KLS8vLy8tLS0tLSBfU3RvcF9EX1NzZmRjUmRId0VDQygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL3ZvaWQgX1N0b3BfRF9Tc2ZkY1JkSHdFQ0Modm9pZCkKLS8vewotLy8jaWZkZWYgSFdfRUNDX1NVUFBPUlRFRAotLy8gICAgX0h3X0RfRWNjUmRTdG9wKCk7Ci0vLyNlbmRpZgotLy99Ci0vLwotLy8vLy0tLS0tIF9Mb2FkX0RfU3NmZGNSZEh3RUNDKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vdm9pZCBfTG9hZF9EX1NzZmRjUmRId0VDQyhCWVRFIGFkZCkKLS8vewotLy8jaWZkZWYgSFdfRUNDX1NVUFBPUlRFRAotLy8gICAgX0h3X0RfRWNjUmRSZWFkKCk7Ci0vLyAgICAvL2lmICghKGFkZD09T0REICYmIChTc2ZkYy5BdHRyaWJ1dGUgJk1QUyk9PVBTMjU2KSkKLS8vICAgIHsKLS8vICAgICAgICBFY2NCdWZbMF09X0h3X0RfSW5EYXRhKCk7Ci0vLyAgICAgICAgRWNjQnVmWzFdPV9Id19EX0luRGF0YSgpOwotLy8gICAgICAgIEVjY0J1ZlsyXT1fSHdfRF9JbkRhdGEoKTsKLS8vICAgIH0KLS8vCi0vLyAgICAvL2lmICghKGFkZD09RVZFTiAmJiAoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1NikpCi0vLyAgICB7Ci0vLyAgICAgICAgRWNjQnVmWzNdPV9Id19EX0luRGF0YSgpOwotLy8gICAgICAgIEVjY0J1Zls0XT1fSHdfRF9JbkRhdGEoKTsKLS8vICAgICAgICBFY2NCdWZbNV09X0h3X0RfSW5EYXRhKCk7Ci0vLyAgICB9Ci0vLwotLy8gICAgX0h3X0RfRWNjUmRTdG9wKCk7Ci0vLyNlbmRpZgotLy99Ci0vLwotLy8vL05BTkQgTWVtb3J5IChTbWFydE1lZGlhKSBDb250cm9sIFN1YnJvdXRpbmUgZm9yIFdyaXRlIERhdGEKLS8vCi0vLy8vLS0tLS0gX1NldF9EX1NzZmRjV3JDbWQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy92b2lkIF9TZXRfRF9Tc2ZkY1dyQ21kKEJZVEUgY21kKQotLy97Ci0vLyAgICBfSHdfRF9TZXRXckNtZCgpOwotLy8gICAgX0h3X0RfT3V0RGF0YShjbWQpOwotLy8gICAgX0h3X0RfU2V0V3JEYXRhKCk7Ci0vL30KLS8vCi0vLy8vLS0tLS0gX1NldF9EX1NzZmRjV3JBZGRyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vdm9pZCBfU2V0X0RfU3NmZGNXckFkZHIoQllURSBhZGQpCi0vL3sKLS8vICAgIFdPUkQgYWRkcjsKLS8vICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwotLy8gICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7Ci0vLwotLy8gICAgYWRkcj0oV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKLS8vICAgIGFkZHI9YWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKLS8vCi0vLyAgICAvL2lmICgoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1NikgLy8gZm9yIDI1NmJ5dGUvcGFnZQotLy8gICAgLy8gICAgYWRkcj1hZGRyKjIrKFdPUkQpYWRkOwotLy8KLS8vICAgIF9Id19EX1NldFdyQWRkcigpOwotLy8gICAgX0h3X0RfT3V0RGF0YSgweDAwKTsKLS8vICAgIF9Id19EX091dERhdGEoKEJZVEUpYWRkcik7Ci0vLyAgICBfSHdfRF9PdXREYXRhKChCWVRFKShhZGRyLzB4MDEwMCkpOwotLy8KLS8vICAgIGlmICgoU3NmZGMuQXR0cmlidXRlICZNQURDKT09QUQ0Q1lDKQotLy8gICAgICAgIF9Id19EX091dERhdGEoKEJZVEUpKE1lZGlhLlpvbmUvMikpOyAvLyBQYXRjaAotLy8KLS8vICAgIF9Id19EX1NldFdyRGF0YSgpOwotLy99Ci0vLwotLy8vLy0tLS0tIF9TZXRfRF9Tc2ZkY1dyQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy92b2lkIF9TZXRfRF9Tc2ZkY1dyQmxvY2sodm9pZCkKLS8vewotLy8gICAgV09SRCBhZGRyOwotLy8gICAgU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7Ci0vLyAgICBBRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKLS8vCi0vLyAgICBhZGRyPShXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK01lZGlhLlBoeUJsb2NrOwotLy8gICAgYWRkcj1hZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnM7Ci0vLwotLy8gICAgLy9pZiAoKFNzZmRjLkF0dHJpYnV0ZSAmTVBTKT09UFMyNTYpIC8vIGZvciAyNTZieXRlL3BhZ2UKLS8vICAgIC8vICAgIGFkZHI9YWRkcioyOwotLy8KLS8vICAgIF9Id19EX1NldFdyQWRkcigpOwotLy8gICAgX0h3X0RfT3V0RGF0YSgoQllURSlhZGRyKTsKLS8vICAgIF9Id19EX091dERhdGEoKEJZVEUpKGFkZHIvMHgwMTAwKSk7Ci0vLwotLy8gICAgaWYgKChTc2ZkYy5BdHRyaWJ1dGUgJk1BREMpPT1BRDRDWUMpCi0vLyAgICAgICAgX0h3X0RfT3V0RGF0YSgoQllURSkoTWVkaWEuWm9uZS8yKSk7IC8vIFBhdGNoCi0vLwotLy8gICAgX0h3X0RfU2V0V3JEYXRhKCk7Ci0vL30KLS8vCi0vLy8vLS0tLS0gX1NldF9EX1NzZmRjV3JTdGFuZGJ5KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vdm9pZCBfU2V0X0RfU3NmZGNXclN0YW5kYnkodm9pZCkKLS8vewotLy8gICAgX0h3X0RfU2V0V3JTdGFuZGJ5KCk7Ci0vL30KLS8vCi0vLy8vLS0tLS0gX1N0YXJ0X0RfU3NmZGNXckh3RUNDKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vdm9pZCBfU3RhcnRfRF9Tc2ZkY1dySHdFQ0Modm9pZCkKLS8vewotLy8jaWZkZWYgSFdfRUNDX1NVUFBPUlRFRAotLy8gICAgX0h3X0RfRWNjV3JSZXNldCgpOwotLy8gICAgX0h3X0RfSW5EYXRhKCk7Ci0vLyAgICBfSHdfRF9FY2NXclN0YXJ0KCk7Ci0vLyNlbmRpZgotLy99Ci0vLwotLy8vLy0tLS0tIF9Mb2FkX0RfU3NmZGNXckh3RUNDKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vdm9pZCBfTG9hZF9EX1NzZmRjV3JId0VDQyhCWVRFIGFkZCkKLS8vewotLy8jaWZkZWYgSFdfRUNDX1NVUFBPUlRFRAotLy8gICAgX0h3X0RfRWNjV3JSZWFkKCk7Ci0vLyAgICAvL2lmICghKGFkZD09T0REICYmIChTc2ZkYy5BdHRyaWJ1dGUgJk1QUyk9PVBTMjU2KSkKLS8vICAgIHsKLS8vICAgICAgICBFY2NCdWZbMF09X0h3X0RfSW5EYXRhKCk7Ci0vLyAgICAgICAgRWNjQnVmWzFdPV9Id19EX0luRGF0YSgpOwotLy8gICAgICAgIEVjY0J1ZlsyXT1fSHdfRF9JbkRhdGEoKTsKLS8vICAgIH0KLS8vCi0vLyAgICAvL2lmICghKGFkZD09RVZFTiAmJiAoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1NikpCi0vLyAgICB7Ci0vLyAgICAgICAgRWNjQnVmWzNdPV9Id19EX0luRGF0YSgpOwotLy8gICAgICAgIEVjY0J1Zls0XT1fSHdfRF9JbkRhdGEoKTsKLS8vICAgICAgICBFY2NCdWZbNV09X0h3X0RfSW5EYXRhKCk7Ci0vLyAgICB9Ci0vLwotLy8gICAgX0h3X0RfRWNjV3JTdG9wKCk7Ci0vLyNlbmRpZgotLy99Ci0vLwotLy8vL05BTkQgTWVtb3J5IChTbWFydE1lZGlhKSBDb250cm9sIFN1YnJvdXRpbmUKLS8vLy8tLS0tLSBfQ2hlY2tfRF9Tc2ZkY0J1c3koKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL2ludCBfQ2hlY2tfRF9Tc2ZkY0J1c3koV09SRCB0aW1lKQotLy97Ci0vLyAgICBXT1JEICBjb3VudCA9IDA7Ci0vLwotLy8gICAgZG8gewotLy8gICAgICAgIGlmICghX0h3X0RfQ2hrQnVzeSgpKQotLy8gICAgICAgICAgICByZXR1cm4oU01TVUNDRVNTKTsKLS8vICAgICAgICBFRGVsYXkoMTAwKTsKLS8vICAgICAgICBjb3VudCsrOwotLy8gICAgfSB3aGlsZSAoY291bnQ8PXRpbWUpOwotLy8KLS8vICAgIHJldHVybihFUlJPUik7Ci0vL30KLS8vCi0vLy8vLS0tLS0gX0NoZWNrX0RfU3NmZGNTdGF0dXMoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9pbnQgX0NoZWNrX0RfU3NmZGNTdGF0dXModm9pZCkKLS8vewotLy8gICAgaWYgKF9Id19EX0luRGF0YSgpICYgV1JfRkFJTCkKLS8vICAgICAgICByZXR1cm4oRVJST1IpOwotLy8KLS8vICAgIHJldHVybihTTVNVQ0NFU1MpOwotLy99Ci0vLwotLy8vLyBGb3IgNzEyCi0vLy8vLS0tLS0gX1Jlc2V0X0RfU3NmZGNFcnIoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy92b2lkIF9SZXNldF9EX1NzZmRjRXJyKHZvaWQpCi0vL3sKLS8vICAgIFdPUkQgIGNvdW50ID0gMDsKLS8vCi0vLyAgICBfSHdfRF9TZXRSZENtZCgpOwotLy8gICAgX0h3X0RfT3V0RGF0YShSU1RfQ0hJUCk7Ci0vLyAgICBfSHdfRF9TZXRSZERhdGEoKTsKLS8vCi0vLyAgICBkbyB7Ci0vLyAgICAgICAgaWYgKCFfSHdfRF9DaGtCdXN5KCkpCi0vLyAgICAgICAgICAgIGJyZWFrOwotLy8gICAgICAgIEVEZWxheSgxMDApOwotLy8gICAgICAgIGNvdW50Kys7Ci0vLyAgICB9IHdoaWxlIChjb3VudDw9QlVTWV9SRVNFVCk7Ci0vLwotLy8gICAgX0h3X0RfU2V0UmRTdGFuZGJ5KCk7Ci0vL30KLS8vCi0vLy8vTkFORCBNZW1vcnkgKFNtYXJ0TWVkaWEpIEJ1ZmZlciBEYXRhIFhmZXIgU3Vicm91dGluZQotLy8vLy0tLS0tIFNNX1JlYWREYXRhV2l0aERNQSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL3ZvaWQgU01fUmVhZERhdGFXaXRoRE1BKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIEJZVEUgKmRhdGFidWYsIFdPUkQgU2VjdEJ5dGVDb3VudCkKLS8vewotLy8gICAgUEhZU0lDQUxfQUREUkVTUyAgICAgICAgQWRkcjsKLS8vICAgIExBUkdFX0lOVEVHRVIgICAgICAgICAgIHB0aW1lb3V0IDsKLS8vCi0vLyAgICBLZUNsZWFyRXZlbnQoJmZkb0V4dC0+U01fRE1BRG9uZUV2ZW50KTsKLS8vCi0vLyAgICBBZGRyID0gTW1HZXRQaHlzaWNhbEFkZHJlc3MoZGF0YWJ1Zik7Ci0vLwotLy8gICAgV1JJVEVfUE9SVF9EV09SRChTTV9ETUFfQUREUl9SRUcsIChEV09SRClBZGRyLkxvd1BhcnQpOwotLy8gICAgV1JJVEVfUE9SVF9CWVRFKFNNX0RNQV9EQVRBX0NUUkwsIDApOwotLy8gICAgV1JJVEVfUE9SVF9XT1JEKFNNX0RNQV9CWVRFX0NPVU5UX1JFRywgU2VjdEJ5dGVDb3VudCk7Ci0vLwotLy8gICAgd2hpbGUgKCBfSHdfRF9DaGtDYXJkSW4oKSApCi0vLyAgICB7Ci0vLyAgICAgICAgaWYgKChSRUFEX1BPUlRfQllURShTTV9SRUdfRklGT19TVEFUVVMpICYgMHg4MCkpCi0vLyAgICAgICAgICAgYnJlYWs7Ci0vLyAgICB9Ci0vLyAgICBpZiAoIV9Id19EX0Noa0NhcmRJbigpKSAgICAgIHJldHVybjsKLS8vICAgIFdSSVRFX1BPUlRfQllURShTTV9ETUFfREFUQV9DVFJMLCAweDAxKTsKLS8vCi0vLyAgICBwdGltZW91dC5RdWFkUGFydCA9IDIwMDAgKiAoLTEwMDAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyIHNlYwotLy8gICAgS2VXYWl0Rm9yU2luZ2xlT2JqZWN0KCZmZG9FeHQtPlNNX0RNQURvbmVFdmVudCwgRXhlY3V0aXZlLCBLZXJuZWxNb2RlLCBGQUxTRSwgJnB0aW1lb3V0KTsKLS8vICAgIF9Id19EX1NldERNQUludE1hc2soKTsKLS8vfQotLy8KLS8vLy8tLS0tLSBTTV9Xcml0ZURhdGFXaXRoRE1BKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vdm9pZCBTTV9Xcml0ZURhdGFXaXRoRE1BKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIEJZVEUgKmRhdGFidWYsIFdPUkQgU2VjdEJ5dGVDb3VudCkKLS8vewotLy8gICAgUEhZU0lDQUxfQUREUkVTUyAgICAgICAgQWRkcjsKLS8vICAgIExBUkdFX0lOVEVHRVIgICAgICAgICAgIHB0aW1lb3V0IDsKLS8vCi0vLyAgICBLZUNsZWFyRXZlbnQoJmZkb0V4dC0+U01fRE1BRG9uZUV2ZW50KTsKLS8vCi0vLyAgICBBZGRyID0gTW1HZXRQaHlzaWNhbEFkZHJlc3MoZGF0YWJ1Zik7Ci0vLwotLy8gICAgV1JJVEVfUE9SVF9EV09SRChTTV9ETUFfQUREUl9SRUcsIChEV09SRClBZGRyLkxvd1BhcnQpOwotLy8gICAgV1JJVEVfUE9SVF9CWVRFKFNNX0RNQV9EQVRBX0NUUkwsIDIpOwotLy8gICAgV1JJVEVfUE9SVF9XT1JEKFNNX0RNQV9CWVRFX0NPVU5UX1JFRywgU2VjdEJ5dGVDb3VudCk7Ci0vLwotLy8gICAgd2hpbGUgKCBfSHdfRF9DaGtDYXJkSW4oKSApCi0vLyAgICB7Ci0vLyAgICAgICBpZiAoKFJFQURfUE9SVF9CWVRFKFNNX1JFR19GSUZPX1NUQVRVUykgJiAweDQwKSkKLS8vICAgICAgICAgICBicmVhazsKLS8vICAgIH0KLS8vICAgIGlmICghX0h3X0RfQ2hrQ2FyZEluKCkpICAgICAgcmV0dXJuOwotLy8gICAgV1JJVEVfUE9SVF9CWVRFKFNNX0RNQV9EQVRBX0NUUkwsIDB4MDMpOwotLy8KLS8vICAgIHB0aW1lb3V0LlF1YWRQYXJ0ID0gMjAwMCAqICgtMTAwMDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIgc2VjCi0vLyAgICBLZVdhaXRGb3JTaW5nbGVPYmplY3QoJmZkb0V4dC0+U01fRE1BRG9uZUV2ZW50LCBFeGVjdXRpdmUsIEtlcm5lbE1vZGUsIEZBTFNFLCAmcHRpbWVvdXQpOwotLy8gICAgX0h3X0RfU2V0RE1BSW50TWFzaygpOwotLy99Ci0vLwotLy8vLy0tLS0tIF9SZWFkX0RfU3NmZGNCdWYoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy92b2lkIF9SZWFkX0RfU3NmZGNCdWYoQllURSAqZGF0YWJ1ZikKLS8vewotLy8gICAgaW50IGk7Ci0vLwotLy8gICAgLy9mb3IoaT0weDAwMDA7aTwoKChTc2ZkYy5BdHRyaWJ1dGUgJk1QUyk9PVBTMjU2KT8weDAxMDA6MHgwMjAwKTtpKyspCi0vLyAgICBmb3IoaT0wOyBpPDB4MjAwOyBpKyspCi0vLyAgICAgICAgKmRhdGFidWYrKyA9X0h3X0RfSW5EYXRhKCk7Ci0vL30KLS8vCi0vLy8vLS0tLS0gX1dyaXRlX0RfU3NmZGNCdWYoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy92b2lkIF9Xcml0ZV9EX1NzZmRjQnVmKEJZVEUgKmRhdGFidWYpCi0vL3sKLS8vICAgIGludCBpOwotLy8KLS8vICAgIC8vZm9yKGk9MHgwMDAwO2k8KCgoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1Nik/MHgwMTAwOjB4MDIwMCk7aSsrKQotLy8gICAgZm9yKGk9MDsgaTwweDIwMDsgaSsrKQotLy8gICAgICAgIF9Id19EX091dERhdGEoKmRhdGFidWYrKyk7Ci0vL30KLS8vCi0vLy8vLS0tLS0gX1JlYWRfRF9Tc2ZkY0J5dGUoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy92b2lkIF9SZWFkX0RfU3NmZGNCeXRlKEJZVEUgKmRhdGFidWYpCi0vL3sKLS8vICAgICpkYXRhYnVmPShCWVRFKV9Id19EX0luRGF0YSgpOwotLy99Ci0vLwotLy8vLy0tLS0tIF9SZWFkUmVkdF9EX1NzZmRjQnVmKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vdm9pZCBfUmVhZFJlZHRfRF9Tc2ZkY0J1ZihCWVRFICpyZWR1bmRhbnQpCi0vL3sKLS8vICAgIGNoYXIgaTsKLS8vCi0vLyAgICAvL2ZvcihpPTB4MDA7aTwoKChTc2ZkYy5BdHRyaWJ1dGUgJk1QUyk9PVBTMjU2KT8weDA4OjB4MTApO2krKykKLS8vICAgIGZvcihpPTA7IGk8MHgxMDsgaSsrKQotLy8gICAgICAgIHJlZHVuZGFudFtpXSA9X0h3X0RfSW5EYXRhKCk7Ci0vL30KLS8vCi0vLy8vLS0tLS0gX1dyaXRlUmVkdF9EX1NzZmRjQnVmKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vdm9pZCBfV3JpdGVSZWR0X0RfU3NmZGNCdWYoQllURSAqcmVkdW5kYW50KQotLy97Ci0vLyAgICBjaGFyIGk7Ci0vLwotLy8gICAgLy9mb3IoaT0weDAwO2k8KCgoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1Nik/MHgwODoweDEwKTtpKyspCi0vLyAgICBmb3IoaT0wOyBpPDB4MTA7IGkrKykKLS8vICAgICAgICBfSHdfRF9PdXREYXRhKCpyZWR1bmRhbnQrKyk7Ci0vL30KLSovCi0vL1NtYXJ0TWVkaWEgSUQgQ29kZSBDaGVjayAmIE1vZGUgU2V0IFN1YnJvdXRpbmUKLS8vLS0tLS0gU2V0X0RfU3NmZGNNb2RlbCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKworLyogU21hcnRNZWRpYSBJRCBDb2RlIENoZWNrICYgTW9kZSBTZXQgU3Vicm91dGluZQorICogLS0tLS0gU2V0X0RfU3NmZGNNb2RlbCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCiBpbnQgU2V0X0RfU3NmZGNNb2RlbChCWVRFIGRjb2RlKQogewotICAgIHN3aXRjaCAoX0NoZWNrX0RfRGV2Q29kZShkY29kZSkpIHsKLSAgICAgICAgY2FzZSBTU0ZEQzFNQjoKLSAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMU1COwotICAgICAgICAgICAgU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDNDWUMgfCBCUzE2IHwgUFMyNTY7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAxOwotICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gMjU2OwotICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gMjUwOwotICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gODsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNTRkRDMk1COgotICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMyTUI7Ci0gICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFEM0NZQyB8IEJTMTYgfCBQUzI1NjsKLSAgICAgICAgICAgIFNzZmRjLk1heFpvbmVzICAgICA9IDE7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSA1MTI7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSA1MDA7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhTZWN0b3JzICAgPSA4OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1NGREM0TUI6Ci0gICAgICAgICAgICBTc2ZkYy5Nb2RlbCAgICAgICAgPSBTU0ZEQzRNQjsKLSAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQzQ1lDIHwgQlMxNiB8IFBTNTEyOwotICAgICAgICAgICAgU3NmZGMuTWF4Wm9uZXMgICAgID0gMTsKLSAgICAgICAgICAgIFNzZmRjLk1heEJsb2NrcyAgICA9IDUxMjsKLSAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDUwMDsKLSAgICAgICAgICAgIFNzZmRjLk1heFNlY3RvcnMgICA9IDE2OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1NGREM4TUI6Ci0gICAgICAgICAgICBTc2ZkYy5Nb2RlbCAgICAgICAgPSBTU0ZEQzhNQjsKLSAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQzQ1lDIHwgQlMxNiB8IFBTNTEyOwotICAgICAgICAgICAgU3NmZGMuTWF4Wm9uZXMgICAgID0gMTsKLSAgICAgICAgICAgIFNzZmRjLk1heEJsb2NrcyAgICA9IDEwMjQ7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOwotICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMTY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTU0ZEQzE2TUI6Ci0gICAgICAgICAgICBTc2ZkYy5Nb2RlbCAgICAgICAgPSBTU0ZEQzE2TUI7Ci0gICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFEM0NZQyB8IEJTMzIgfCBQUzUxMjsKLSAgICAgICAgICAgIFNzZmRjLk1heFpvbmVzICAgICA9IDE7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OwotICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKLSAgICAgICAgICAgIFNzZmRjLk1heFNlY3RvcnMgICA9IDMyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1NGREMzMk1COgotICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMzMk1COwotICAgICAgICAgICAgU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDNDWUMgfCBCUzMyIHwgUFM1MTI7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAyOwotICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKLSAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDEwMDA7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhTZWN0b3JzICAgPSAzMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNTRkRDNjRNQjoKLSAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDNjRNQjsKLSAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQ0Q1lDIHwgQlMzMiB8IFBTNTEyOwotICAgICAgICAgICAgU3NmZGMuTWF4Wm9uZXMgICAgID0gNDsKLSAgICAgICAgICAgIFNzZmRjLk1heEJsb2NrcyAgICA9IDEwMjQ7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOwotICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTU0ZEQzEyOE1COgotICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMxMjhNQjsKLSAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQ0Q1lDIHwgQlMzMiB8IFBTNTEyOwotICAgICAgICAgICAgU3NmZGMuTWF4Wm9uZXMgICAgID0gODsKLSAgICAgICAgICAgIFNzZmRjLk1heEJsb2NrcyAgICA9IDEwMjQ7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOwotICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTU0ZEQzI1Nk1COgotICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMyNTZNQjsKLSAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQ0Q1lDIHwgQlMzMiB8IFBTNTEyOwotICAgICAgICAgICAgU3NmZGMuTWF4Wm9uZXMgICAgID0gMTY7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OwotICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKLSAgICAgICAgICAgIFNzZmRjLk1heFNlY3RvcnMgICA9IDMyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1NGREM1MTJNQjoKLSAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDNTEyTUI7Ci0gICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFENENZQyB8IEJTMzIgfCBQUzUxMjsKLSAgICAgICAgICAgIFNzZmRjLk1heFpvbmVzICAgICA9IDMyOwotICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKLSAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDEwMDA7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhTZWN0b3JzICAgPSAzMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNTRkRDMUdCOgotICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMxR0I7Ci0gICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFENENZQyB8IEJTMzIgfCBQUzUxMjsKLSAgICAgICAgICAgIFNzZmRjLk1heFpvbmVzICAgICA9IDY0OwotICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKLSAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDEwMDA7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhTZWN0b3JzICAgPSAzMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNTRkRDMkdCOgotICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMyR0I7Ci0gICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFENENZQyB8IEJTMzIgfCBQUzUxMjsKLSAgICAgICAgICAgIFNzZmRjLk1heFpvbmVzICAgICA9IDEyODsKLSAgICAgICAgICAgIFNzZmRjLk1heEJsb2NrcyAgICA9IDEwMjQ7Ci0gICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOwotICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFNzZmRjLk1vZGVsID0gTk9TU0ZEQzsKLSAgICAgICAgICAgIHJldHVybihFUlJPUik7Ci0gICAgfQorCXN3aXRjaCAoX0NoZWNrX0RfRGV2Q29kZShkY29kZSkpIHsKKwljYXNlIFNTRkRDMU1COgorCQlTc2ZkYy5Nb2RlbCAgICAgICAgPSBTU0ZEQzFNQjsKKwkJU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDNDWUMgfCBCUzE2IHwgUFMyNTY7CisJCVNzZmRjLk1heFpvbmVzICAgICA9IDE7CisJCVNzZmRjLk1heEJsb2NrcyAgICA9IDI1NjsKKwkJU3NmZGMuTWF4TG9nQmxvY2tzID0gMjUwOworCQlTc2ZkYy5NYXhTZWN0b3JzICAgPSA4OworCQlicmVhazsKKwljYXNlIFNTRkRDMk1COgorCQlTc2ZkYy5Nb2RlbCAgICAgICAgPSBTU0ZEQzJNQjsKKwkJU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDNDWUMgfCBCUzE2IHwgUFMyNTY7CisJCVNzZmRjLk1heFpvbmVzICAgICA9IDE7CisJCVNzZmRjLk1heEJsb2NrcyAgICA9IDUxMjsKKwkJU3NmZGMuTWF4TG9nQmxvY2tzID0gNTAwOworCQlTc2ZkYy5NYXhTZWN0b3JzICAgPSA4OworCQlicmVhazsKKwljYXNlIFNTRkRDNE1COgorCQlTc2ZkYy5Nb2RlbCAgICAgICAgPSBTU0ZEQzRNQjsKKwkJU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDNDWUMgfCBCUzE2IHwgUFM1MTI7CisJCVNzZmRjLk1heFpvbmVzICAgICA9IDE7CisJCVNzZmRjLk1heEJsb2NrcyAgICA9IDUxMjsKKwkJU3NmZGMuTWF4TG9nQmxvY2tzID0gNTAwOworCQlTc2ZkYy5NYXhTZWN0b3JzICAgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSBTU0ZEQzhNQjoKKwkJU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREM4TUI7CisJCVNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQzQ1lDIHwgQlMxNiB8IFBTNTEyOworCQlTc2ZkYy5NYXhab25lcyAgICAgPSAxOworCQlTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OworCQlTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOworCQlTc2ZkYy5NYXhTZWN0b3JzICAgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSBTU0ZEQzE2TUI6CisJCVNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMTZNQjsKKwkJU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDNDWUMgfCBCUzMyIHwgUFM1MTI7CisJCVNzZmRjLk1heFpvbmVzICAgICA9IDE7CisJCVNzZmRjLk1heEJsb2NrcyAgICA9IDEwMjQ7CisJCVNzZmRjLk1heExvZ0Jsb2NrcyA9IDEwMDA7CisJCVNzZmRjLk1heFNlY3RvcnMgICA9IDMyOworCQlicmVhazsKKwljYXNlIFNTRkRDMzJNQjoKKwkJU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMzMk1COworCQlTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFEM0NZQyB8IEJTMzIgfCBQUzUxMjsKKwkJU3NmZGMuTWF4Wm9uZXMgICAgID0gMjsKKwkJU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKKwkJU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKKwkJU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7CisJCWJyZWFrOworCWNhc2UgU1NGREM2NE1COgorCQlTc2ZkYy5Nb2RlbCAgICAgICAgPSBTU0ZEQzY0TUI7CisJCVNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQ0Q1lDIHwgQlMzMiB8IFBTNTEyOworCQlTc2ZkYy5NYXhab25lcyAgICAgPSA0OworCQlTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OworCQlTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOworCQlTc2ZkYy5NYXhTZWN0b3JzICAgPSAzMjsKKwkJYnJlYWs7CisJY2FzZSBTU0ZEQzEyOE1COgorCQlTc2ZkYy5Nb2RlbCAgICAgICAgPSBTU0ZEQzEyOE1COworCQlTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFENENZQyB8IEJTMzIgfCBQUzUxMjsKKwkJU3NmZGMuTWF4Wm9uZXMgICAgID0gODsKKwkJU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKKwkJU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKKwkJU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7CisJCWJyZWFrOworCWNhc2UgU1NGREMyNTZNQjoKKwkJU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMyNTZNQjsKKwkJU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDRDWUMgfCBCUzMyIHwgUFM1MTI7CisJCVNzZmRjLk1heFpvbmVzICAgICA9IDE2OworCQlTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OworCQlTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOworCQlTc2ZkYy5NYXhTZWN0b3JzICAgPSAzMjsKKwkJYnJlYWs7CisJY2FzZSBTU0ZEQzUxMk1COgorCQlTc2ZkYy5Nb2RlbCAgICAgICAgPSBTU0ZEQzUxMk1COworCQlTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFENENZQyB8IEJTMzIgfCBQUzUxMjsKKwkJU3NmZGMuTWF4Wm9uZXMgICAgID0gMzI7CisJCVNzZmRjLk1heEJsb2NrcyAgICA9IDEwMjQ7CisJCVNzZmRjLk1heExvZ0Jsb2NrcyA9IDEwMDA7CisJCVNzZmRjLk1heFNlY3RvcnMgICA9IDMyOworCQlicmVhazsKKwljYXNlIFNTRkRDMUdCOgorCQlTc2ZkYy5Nb2RlbCAgICAgICAgPSBTU0ZEQzFHQjsKKwkJU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDRDWUMgfCBCUzMyIHwgUFM1MTI7CisJCVNzZmRjLk1heFpvbmVzICAgICA9IDY0OworCQlTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OworCQlTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOworCQlTc2ZkYy5NYXhTZWN0b3JzICAgPSAzMjsKKwkJYnJlYWs7CisJY2FzZSBTU0ZEQzJHQjoKKwkJU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMyR0I7CisJCVNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQ0Q1lDIHwgQlMzMiB8IFBTNTEyOworCQlTc2ZkYy5NYXhab25lcyAgICAgPSAxMjg7CisJCVNzZmRjLk1heEJsb2NrcyAgICA9IDEwMjQ7CisJCVNzZmRjLk1heExvZ0Jsb2NrcyA9IDEwMDA7CisJCVNzZmRjLk1heFNlY3RvcnMgICA9IDMyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlTc2ZkYy5Nb2RlbCA9IE5PU1NGREM7CisJCXJldHVybiBFUlJPUjsKKwl9CiAKLSAgICByZXR1cm4oU01TVUNDRVNTKTsKKyAgICByZXR1cm4gU01TVUNDRVNTOwogfQogCi0vLy0tLS0tIF9DaGVja19EX0RldkNvZGUoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tIF9DaGVja19EX0RldkNvZGUoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIEJZVEUgX0NoZWNrX0RfRGV2Q29kZShCWVRFIGRjb2RlKQogewotICAgIHN3aXRjaChkY29kZSl7Ci0gICAgICAgIGNhc2UgMHg2RToKLSAgICAgICAgY2FzZSAweEU4OgotICAgICAgICBjYXNlIDB4RUM6IHJldHVybihTU0ZEQzFNQik7ICAgLy8gOE1iaXQgKDFNKSBOQU5ECi0gICAgICAgIGNhc2UgMHg2NDoKLSAgICAgICAgY2FzZSAweEVBOiByZXR1cm4oU1NGREMyTUIpOyAgIC8vIDE2TWJpdCAoMk0pIE5BTkQKLSAgICAgICAgY2FzZSAweDZCOgotICAgICAgICBjYXNlIDB4RTM6Ci0gICAgICAgIGNhc2UgMHhFNTogcmV0dXJuKFNTRkRDNE1CKTsgICAvLyAzMk1iaXQgKDRNKSBOQU5ECi0gICAgICAgIGNhc2UgMHhFNjogcmV0dXJuKFNTRkRDOE1CKTsgICAvLyA2NE1iaXQgKDhNKSBOQU5ECi0gICAgICAgIGNhc2UgMHg3MzogcmV0dXJuKFNTRkRDMTZNQik7ICAvLyAxMjhNYml0ICgxNk0pTkFORAotICAgICAgICBjYXNlIDB4NzU6IHJldHVybihTU0ZEQzMyTUIpOyAgLy8gMjU2TWJpdCAoMzJNKU5BTkQKLSAgICAgICAgY2FzZSAweDc2OiByZXR1cm4oU1NGREM2NE1CKTsgIC8vIDUxMk1iaXQgKDY0TSlOQU5ECi0gICAgICAgIGNhc2UgMHg3OTogcmV0dXJuKFNTRkRDMTI4TUIpOyAvLyAxR2JpdCgxMjhNKU5BTkQKLSAgICAgICAgY2FzZSAweDcxOiByZXR1cm4oU1NGREMyNTZNQik7Ci0gICAgICAgIGNhc2UgMHhEQzogcmV0dXJuKFNTRkRDNTEyTUIpOwotICAgICAgICBjYXNlIDB4RDM6IHJldHVybihTU0ZEQzFHQik7Ci0gICAgICAgIGNhc2UgMHhENTogcmV0dXJuKFNTRkRDMkdCKTsKLSAgICAgICAgZGVmYXVsdDogcmV0dXJuKE5PU1NGREMpOwotICAgIH0KKwlzd2l0Y2ggKGRjb2RlKSB7CisJY2FzZSAweDZFOgorCWNhc2UgMHhFODoKKwljYXNlIDB4RUM6IHJldHVybiBTU0ZEQzFNQjsgICAvKiA4TWJpdCAoMU0pIE5BTkQgKi8KKwljYXNlIDB4NjQ6CisJY2FzZSAweEVBOiByZXR1cm4gU1NGREMyTUI7ICAgLyogMTZNYml0ICgyTSkgTkFORCAqLworCWNhc2UgMHg2QjoKKwljYXNlIDB4RTM6CisJY2FzZSAweEU1OiByZXR1cm4gU1NGREM0TUI7ICAgLyogMzJNYml0ICg0TSkgTkFORCAqLworCWNhc2UgMHhFNjogcmV0dXJuIFNTRkRDOE1COyAgIC8qIDY0TWJpdCAoOE0pIE5BTkQgKi8KKwljYXNlIDB4NzM6IHJldHVybiBTU0ZEQzE2TUI7ICAvKiAxMjhNYml0ICgxNk0pTkFORCAqLworCWNhc2UgMHg3NTogcmV0dXJuIFNTRkRDMzJNQjsgIC8qIDI1Nk1iaXQgKDMyTSlOQU5EICovCisJY2FzZSAweDc2OiByZXR1cm4gU1NGREM2NE1COyAgLyogNTEyTWJpdCAoNjRNKU5BTkQgKi8KKwljYXNlIDB4Nzk6IHJldHVybiBTU0ZEQzEyOE1COyAvKiAxR2JpdCgxMjhNKU5BTkQgKi8KKwljYXNlIDB4NzE6IHJldHVybiBTU0ZEQzI1Nk1COworCWNhc2UgMHhEQzogcmV0dXJuIFNTRkRDNTEyTUI7CisJY2FzZSAweEQzOiByZXR1cm4gU1NGREMxR0I7CisJY2FzZSAweEQ1OiByZXR1cm4gU1NGREMyR0I7CisJZGVmYXVsdDogcmV0dXJuIE5PU1NGREM7CisJfQogfQotLyoKLS8vLy9TbWFydE1lZGlhIFBvd2VyIENvbnRyb2wgU3Vicm91dGluZQotLy8vLy0tLS0tIENudF9EX1Jlc2V0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy92b2lkIENudF9EX1Jlc2V0KHZvaWQpCi0vL3sKLS8vICAgIF9Id19EX0xlZE9mZigpOwotLy8gICAgX0h3X0RfU2V0UmRTdGFuZGJ5KCk7Ci0vLyAgICBfSHdfRF9WY2NPZmYoKTsKLS8vfQotLy8KLS8vLy8tLS0tLSBDbnRfRF9Qb3dlck9uKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9pbnQgQ250X0RfUG93ZXJPbih2b2lkKQotLy97Ci0vLyAgICAvLyBObyBzdXBwb3J0IDVWLgotLy8gICAgX0h3X0RfRW5hYmxlVmNjM1ZPbigpOyAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgU01fUkVHX0NUUkxfNSBSZWcuIHRvIDNWCi0vLyAgICBfSHdfRF9WY2NPbigpOwotLy8gICAgX0h3X0RfU2V0UmRTdGFuZGJ5KCk7Ci0vLyAgICBfV2FpdF9EX1RpbWVyKFRJTUVfUE9OKTsKLS8vCi0vLyAgICBpZiAoX0h3X0RfQ2hrUG93ZXIoKSkKLS8vICAgIHsKLS8vICAgICAgICBfSHdfRF9FbmFibGVPQigpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IFNNX1JFR19DVFJMXzUgUmVnLiB0byAweDgzCi0vLyAgICAgICAgcmV0dXJuKFNNU1VDQ0VTUyk7Ci0vLyAgICB9Ci0vLwotLy8gICAgX0h3X0RfU2V0VmNjT2ZmKCk7Ci0vLyAgICByZXR1cm4oRVJST1IpOwotLy99Ci0vLwotLy8vLy0tLS0tIENudF9EX1Bvd2VyT2ZmKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy92b2lkIENudF9EX1Bvd2VyT2ZmKHZvaWQpCi0vL3sKLS8vICAgIF9Id19EX1NldFJkU3RhbmRieSgpOwotLy8gICAgX0h3X0RfU2V0VmNjT2ZmKCk7Ci0vLyAgICBfSHdfRF9WY2NPZmYoKTsKLS8vfQotLy8KLS8vLy8tLS0tLSBDbnRfRF9MZWRPbigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vdm9pZCBDbnRfRF9MZWRPbih2b2lkKQotLy97Ci0vLyAgICBfSHdfRF9MZWRPbigpOwotLy99Ci0vLwotLy8vLy0tLS0tIENudF9EX0xlZE9mZigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vdm9pZCBDbnRfRF9MZWRPZmYodm9pZCkKLS8vewotLy8gICAgX0h3X0RfTGVkT2ZmKCk7Ci0vL30KLS8vCi0vLy8vLS0tLS0gQ2hlY2tfRF9DbnRQb3dlcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vaW50IENoZWNrX0RfQ250UG93ZXIodm9pZCkKLS8vewotLy8gICAgaWYgKF9Id19EX0Noa1Bvd2VyKCkpCi0vLyAgICAgICAgcmV0dXJuKFNNU1VDQ0VTUyk7IC8vIFBvd2VyIE9uCi0vLwotLy8gICAgcmV0dXJuKEVSUk9SKTsgICAgICAgLy8gUG93ZXIgT2ZmCi0vL30KLS8vCi0vLy8vLS0tLS0gQ2hlY2tfRF9DYXJkRXhpc3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL2ludCBDaGVja19EX0NhcmRFeGlzdCh2b2lkKQotLy97Ci0vLyAgICBjaGFyIGksaixrOwotLy8KLS8vICAgIGlmICghX0h3X0RfQ2hrU3RhdHVzKCkpIC8vIE5vdCBTdGF0dXMgQ2hhbmdlCi0vLyAgICAgICAgaWYgKF9Id19EX0Noa0NhcmRJbigpKQotLy8gICAgICAgICAgICByZXR1cm4oU01TVUNDRVNTKTsgLy8gQ2FyZCBleGlzdCBpbiBTbG90Ci0vLwotLy8gICAgZm9yKGk9MCxqPTAsaz0wOyBpPDE2OyBpKyspIHsKLS8vICAgICAgICBpZiAoX0h3X0RfQ2hrQ2FyZEluKCkpIC8vIFN0YXR1cyBDaGFuZ2UKLS8vICAgICAgICB7Ci0vLyAgICAgICAgICAgIGorKzsgaz0wOwotLy8gICAgICAgIH0KLS8vICAgICAgICBlbHNlCi0vLyAgICAgICAgewotLy8gICAgICAgICAgICBqPTA7IGsrKzsKLS8vICAgICAgICB9Ci0vLwotLy8gICAgICAgIGlmIChqPjMpCi0vLyAgICAgICAgICAgIHJldHVybihTTVNVQ0NFU1MpOyAvLyBDYXJkIGV4aXN0IGluIFNsb3QKLS8vICAgICAgICBpZiAoaz4zKQotLy8gICAgICAgICAgICByZXR1cm4oRVJST1IpOyAvLyBOTyBDYXJkIGV4aXN0IGluIFNsb3QKLS8vCi0vLyAgICAgICAgX1dhaXRfRF9UaW1lcihUSU1FX0NEQ0hLKTsKLS8vICAgIH0KLS8vCi0vLyAgICByZXR1cm4oRVJST1IpOwotLy99Ci0vLwotLy8vLy0tLS0tIENoZWNrX0RfQ2FyZFN0c0NoZygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vaW50IENoZWNrX0RfQ2FyZFN0c0NoZyh2b2lkKQotLy97Ci0vLyAgICBpZiAoX0h3X0RfQ2hrU3RhdHVzKCkpCi0vLyAgICAgICAgcmV0dXJuKEVSUk9SKTsgLy8gU3RhdHVzIENoYW5nZQotLy8KLS8vICAgIHJldHVybihTTVNVQ0NFU1MpOyAgIC8vIE5vdCBTdGF0dXMgQ2hhbmdlCi0vL30KLS8vCi0vLy8vLS0tLS0gQ2hlY2tfRF9Tc2ZkY1dQKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy9pbnQgQ2hlY2tfRF9Tc2ZkY1dQKHZvaWQpCi0vL3sgLy8gRVJST1I6IFdQLCBTTVNVQ0NFU1M6IE5vdCBXUAotLy8gICAgY2hhciBpOwotLy8KLS8vICAgIGZvcihpPTA7IGk8ODsgaSsrKSB7Ci0vLyAgICAgICAgaWYgKF9Id19EX0Noa1dQKCkpCi0vLyAgICAgICAgICAgIHJldHVybihFUlJPUik7Ci0vLyAgICAgICAgX1dhaXRfRF9UaW1lcihUSU1FX1dQQ0hLKTsKLS8vICAgIH0KLS8vCi0vLyAgICByZXR1cm4oU01TVUNDRVNTKTsKLS8vfQotLy8KLSovCi0vL1NtYXJ0TWVkaWEgRUNDIENvbnRyb2wgU3Vicm91dGluZQotLy8tLS0tLSBDaGVja19EX1JlYWRFcnJvcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisKKworLyogU21hcnRNZWRpYSBFQ0MgQ29udHJvbCBTdWJyb3V0aW5lCisgKiAtLS0tLSBDaGVja19EX1JlYWRFcnJvcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLwogaW50IENoZWNrX0RfUmVhZEVycm9yKEJZVEUgKnJlZHVuZGFudCkKIHsKIAlyZXR1cm4gU01TVUNDRVNTOwogfQogCi0vLy0tLS0tIENoZWNrX0RfQ29ycmVjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBDaGVja19EX0NvcnJlY3QoQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKKy8qIC0tLS0tIENoZWNrX0RfQ29ycmVjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2ludCBDaGVja19EX0NvcnJlY3QoQllURSAqYnVmLCBCWVRFICpyZWR1bmRhbnQpCiB7CiAJcmV0dXJuIFNNU1VDQ0VTUzsKIH0KIAotLy8tLS0tLSBDaGVja19EX0NJU2RhdGEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLSBDaGVja19EX0NJU2RhdGEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBpbnQgQ2hlY2tfRF9DSVNkYXRhKEJZVEUgKmJ1ZiwgQllURSAqcmVkdW5kYW50KQogewogCUJZVEUgY2lzW10gPSB7MHgwMSwgMHgwMywgMHhEOSwgMHgwMSwgMHhGRiwgMHgxOCwgMHgwMiwKQEAgLTE1MTYsODYgKzY4MywxMSBAQAogCXJldHVybiBFUlJPUjsKIH0KIAotLy8tLS0tLSBTZXRfRF9SaWdodEVDQygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tIFNldF9EX1JpZ2h0RUNDKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogdm9pZCBTZXRfRF9SaWdodEVDQyhCWVRFICpyZWR1bmRhbnQpCiB7Ci0gICAgLy8gRHJpdmVyIKSjsLUgRUNDIENoZWNrCisgICAgLyogRHJpdmVyIEVDQyBDaGVjayAqLwogICAgIHJldHVybjsKLSAgICAvL1N0cmluZ0NvcHkoKGNoYXIgKikocmVkdW5kYW50KzB4MEQpLChjaGFyICopRWNjQnVmLDMpOwotICAgIC8vU3RyaW5nQ29weSgoY2hhciAqKShyZWR1bmRhbnQrMHgwOCksKGNoYXIgKikoRWNjQnVmKzB4MDMpLDMpOwogfQotLyoKLS8vLy8tLS0tLSBfQ2FsY19EX0VDQ2RhdGEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL3ZvaWQgX0NhbGNfRF9FQ0NkYXRhKEJZVEUgKmJ1ZikKLS8vewotLy8jaWZkZWYgSFdfRUNDX1NVUFBPUlRFRAotLy8jZWxzZQotLy8gICAgX0NhbGN1bGF0ZV9EX1N3RUNDKGJ1ZixFY2NCdWYpOwotLy8gICAgYnVmKz0weDAxMDA7Ci0vLyAgICBfQ2FsY3VsYXRlX0RfU3dFQ0MoYnVmLEVjY0J1ZisweDAzKTsKLS8vI2VuZGlmCi0vL30KLS8vCi0vLy8vLS0tLS0gX1NldF9EX0VDQ2RhdGEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL3ZvaWQgX1NldF9EX0VDQ2RhdGEoQllURSBhZGQsQllURSAqcmVkdW5kYW50KQotLy97Ci0vLyAgICAvL2lmIChhZGQ9PUVWRU4gJiYgKFNzZmRjLkF0dHJpYnV0ZSAmTVBTKT09UFMyNTYpCi0vLyAgICAvLyAgICByZXR1cm47Ci0vLwotLy8gICAgLy8gZm9yIDI1NmJ5dGUvcGFnZQotLy8gICAgU3RyaW5nQ29weSgoY2hhciAqKShyZWR1bmRhbnQrMHgwRCksKGNoYXIgKilFY2NCdWYsMyk7Ci0vLyAgICBTdHJpbmdDb3B5KChjaGFyICopKHJlZHVuZGFudCsweDA4KSwoY2hhciAqKShFY2NCdWYrMHgwMyksMyk7Ci0vL30KLSovCiAKLS8qCi0vLy0tLS0tIFNNX1JlYWRCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50IFNNX1JlYWRCbG9jayhQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBCWVRFICpidWYsQllURSAqcmVkdW5kYW50KQotewotICAgIFBCVUxLX0NCVyAgICAgICAgICAgICAgIHBCdWxrQ2J3ID0gZmRvRXh0LT5wQnVsa0NidzsKLSAgICBOVFNUQVRVUyAgICAgICAgICAgICAgICBudFN0YXR1czsKLSAgICBXT1JEICAgICAgICAgICAgICAgICAgICBhZGRyOwogCi0gICAgRU5FX0xvYWRCaW5Db2RlKGZkb0V4dCwgU01fUldfUEFUVEVSTik7Ci0KLSAgICBhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7Ci0gICAgYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7Ci0KLSAgICAvLyBSZWFkIHNlY3QgZGF0YQotICAgIFJ0bFplcm9NZW1vcnkocEJ1bGtDYncsIHNpemVvZihzdHJ1Y3QgX0JVTEtfQ0JXKSk7Ci0gICAgcEJ1bGtDYnctPmRDQldTaWduYXR1cmUgICAgICAgICAgPSBDQldfU0lHTlRVUkU7Ci0gICAgcEJ1bGtDYnctPmJDQldMdW4gICAgICAgICAgICAgICAgPSBDQldfTFVOOwotICAgIHBCdWxrQ2J3LT5kQ0JXRGF0YVRyYW5zZmVyTGVuZ3RoID0gMHgyMDA7Ci0gICAgcEJ1bGtDYnctPmJtQ0JXRmxhZ3MgICAgICAgICAgICAgPSAweDgwOwotICAgIHBCdWxrQ2J3LT5DQldDYlswXSAgICAgICAgICAgICAgID0gMHhGMTsKLSAgICBwQnVsa0Nidy0+Q0JXQ2JbMV0gICAgICAgICAgICAgICA9IDB4MDI7Ci0gICAgcEJ1bGtDYnctPkNCV0NiWzRdICAgICAgICAgICAgICAgPSAoQllURSlhZGRyOwotICAgIHBCdWxrQ2J3LT5DQldDYlszXSAgICAgICAgICAgICAgID0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKLSAgICBwQnVsa0Nidy0+Q0JXQ2JbMl0gICAgICAgICAgICAgICA9IE1lZGlhLlpvbmUvMjsKLQotICAgIG50U3RhdHVzID0gRU5FX1NlbmRTY3NpQ21kKGZkb0V4dCwgRkRJUl9SRUFELCBidWYpOwotCi0gICAgaWYgKCFOVF9TVUNDRVNTKG50U3RhdHVzKSkKLSAgICAgICByZXR1cm4oRVJST1IpOwotCi0gICAgLy8gUmVhZCByZWR1bmRhbnQKLSAgICBSdGxaZXJvTWVtb3J5KHBCdWxrQ2J3LCBzaXplb2Yoc3RydWN0IF9CVUxLX0NCVykpOwotICAgIHBCdWxrQ2J3LT5kQ0JXU2lnbmF0dXJlICAgICAgICAgID0gQ0JXX1NJR05UVVJFOwotICAgIHBCdWxrQ2J3LT5iQ0JXTHVuICAgICAgICAgICAgICAgID0gQ0JXX0xVTjsKLSAgICBwQnVsa0Nidy0+ZENCV0RhdGFUcmFuc2Zlckxlbmd0aCA9IDB4MTA7Ci0gICAgcEJ1bGtDYnctPmJtQ0JXRmxhZ3MgICAgICAgICAgICAgPSAweDgwOwotICAgIHBCdWxrQ2J3LT5DQldDYlswXSAgICAgICAgICAgICAgID0gMHhGMTsKLSAgICBwQnVsa0Nidy0+Q0JXQ2JbMV0gICAgICAgICAgICAgICA9IDB4MDM7Ci0gICAgcEJ1bGtDYnctPkNCV0NiWzRdICAgICAgICAgICAgICAgPSAoQllURSlhZGRyOwotICAgIHBCdWxrQ2J3LT5DQldDYlszXSAgICAgICAgICAgICAgID0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKLSAgICBwQnVsa0Nidy0+Q0JXQ2JbMl0gICAgICAgICAgICAgICA9IE1lZGlhLlpvbmUvMjsKLSAgICBwQnVsa0Nidy0+Q0JXQ2JbNV0gICAgICAgICAgICAgICA9IDA7Ci0gICAgcEJ1bGtDYnctPkNCV0NiWzZdICAgICAgICAgICAgICAgPSAxOwotCi0gICAgbnRTdGF0dXMgPSBFTkVfU2VuZFNjc2lDbWQoZmRvRXh0LCBGRElSX1JFQUQsIHJlZHVuZGFudCk7Ci0KLSAgICBpZiAoIU5UX1NVQ0NFU1MobnRTdGF0dXMpKQotICAgICAgIHJldHVybihFUlJPUik7Ci0KLSAgICByZXR1cm4oU01TVUNDRVNTKTsKLX0qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2tldWNyL3Ntc2NzaS5jIGIvZHJpdmVycy9zdGFnaW5nL2tldWNyL3Ntc2NzaS5jCmluZGV4IGE2ZmE3N2YuLjU4YjU1NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9rZXVjci9zbXNjc2kuYworKysgYi9kcml2ZXJzL3N0YWdpbmcva2V1Y3Ivc21zY3NpLmMKQEAgLTksMzYgKzksNDYgQEAKICNpbmNsdWRlICJ1c2IuaCIKICNpbmNsdWRlICJzY3NpZ2x1ZS5oIgogI2luY2x1ZGUgInRyYW5zcG9ydC5oIgotLy8jaW5jbHVkZSAic21jb21tb24uaCIKICNpbmNsdWRlICJzbWlsLmgiCiAKLWludCBTTV9TQ1NJX1Rlc3RfVW5pdF9SZWFkeSAoc3RydWN0IHVzX2RhdGEgKnVzLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIpOwotaW50IFNNX1NDU0lfSW5xdWlyeSAgICAgICAgIChzdHJ1Y3QgdXNfZGF0YSAqdXMsIHN0cnVjdCBzY3NpX2NtbmQgKnNyYik7Ci1pbnQgU01fU0NTSV9Nb2RlX1NlbnNlICAgICAgKHN0cnVjdCB1c19kYXRhICp1cywgc3RydWN0IHNjc2lfY21uZCAqc3JiKTsKLWludCBTTV9TQ1NJX1N0YXJ0X1N0b3AgICAgICAoc3RydWN0IHVzX2RhdGEgKnVzLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIpOwotaW50IFNNX1NDU0lfUmVhZF9DYXBhY2l0eSAgIChzdHJ1Y3QgdXNfZGF0YSAqdXMsIHN0cnVjdCBzY3NpX2NtbmQgKnNyYik7Ci1pbnQgU01fU0NTSV9SZWFkICAgICAgICAgICAgKHN0cnVjdCB1c19kYXRhICp1cywgc3RydWN0IHNjc2lfY21uZCAqc3JiKTsKLWludCBTTV9TQ1NJX1dyaXRlICAgICAgICAgICAoc3RydWN0IHVzX2RhdGEgKnVzLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIpOworaW50IFNNX1NDU0lfVGVzdF9Vbml0X1JlYWR5KHN0cnVjdCB1c19kYXRhICp1cywgc3RydWN0IHNjc2lfY21uZCAqc3JiKTsKK2ludCBTTV9TQ1NJX0lucXVpcnkoc3RydWN0IHVzX2RhdGEgKnVzLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIpOworaW50IFNNX1NDU0lfTW9kZV9TZW5zZShzdHJ1Y3QgdXNfZGF0YSAqdXMsIHN0cnVjdCBzY3NpX2NtbmQgKnNyYik7CitpbnQgU01fU0NTSV9TdGFydF9TdG9wKHN0cnVjdCB1c19kYXRhICp1cywgc3RydWN0IHNjc2lfY21uZCAqc3JiKTsKK2ludCBTTV9TQ1NJX1JlYWRfQ2FwYWNpdHkoc3RydWN0IHVzX2RhdGEgKnVzLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIpOworaW50IFNNX1NDU0lfUmVhZChzdHJ1Y3QgdXNfZGF0YSAqdXMsIHN0cnVjdCBzY3NpX2NtbmQgKnNyYik7CitpbnQgU01fU0NTSV9Xcml0ZShzdHJ1Y3QgdXNfZGF0YSAqdXMsIHN0cnVjdCBzY3NpX2NtbmQgKnNyYik7CiAKIGV4dGVybiBQQllURSAgICAgICAgICAgICAgICBTTUhvc3RBZGRyOwogZXh0ZXJuIERXT1JEICAgICAgICAgICAgICAgIEVyclhEQ29kZTsKIAotLy8tLS0tLSBTTV9TQ1NJSXJwKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tIFNNX1NDU0lJcnAoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogaW50IFNNX1NDU0lJcnAoc3RydWN0IHVzX2RhdGEgKnVzLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIpCiB7CiAJaW50ICAgIHJlc3VsdDsKIAogCXVzLT5TcmJTdGF0dXMgPSBTU19TVUNDRVNTOwotCXN3aXRjaCAoc3JiLT5jbW5kWzBdKQotCXsKLQkJY2FzZSBURVNUX1VOSVRfUkVBRFkgOiAgcmVzdWx0ID0gU01fU0NTSV9UZXN0X1VuaXRfUmVhZHkgKHVzLCBzcmIpOyAgYnJlYWs7IC8vMHgwMAotCQljYXNlIElOUVVJUlkgICAgICAgICA6ICByZXN1bHQgPSBTTV9TQ1NJX0lucXVpcnkgICAgICAgICAodXMsIHNyYik7ICBicmVhazsgLy8weDEyCi0JCWNhc2UgTU9ERV9TRU5TRSAgICAgIDogIHJlc3VsdCA9IFNNX1NDU0lfTW9kZV9TZW5zZSAgICAgICh1cywgc3JiKTsgIGJyZWFrOyAvLzB4MUEKLQkJY2FzZSBSRUFEX0NBUEFDSVRZICAgOiAgcmVzdWx0ID0gU01fU0NTSV9SZWFkX0NhcGFjaXR5ICAgKHVzLCBzcmIpOyAgYnJlYWs7IC8vMHgyNQotCQljYXNlIFJFQURfMTAgICAgICAgICA6ICByZXN1bHQgPSBTTV9TQ1NJX1JlYWQgICAgICAgICAgICAodXMsIHNyYik7ICBicmVhazsgLy8weDI4Ci0JCWNhc2UgV1JJVEVfMTAgICAgICAgIDogIHJlc3VsdCA9IFNNX1NDU0lfV3JpdGUgICAgICAgICAgICh1cywgc3JiKTsgIGJyZWFrOyAvLzB4MkEKKwlzd2l0Y2ggKHNyYi0+Y21uZFswXSkgeworCWNhc2UgVEVTVF9VTklUX1JFQURZOgorCQlyZXN1bHQgPSBTTV9TQ1NJX1Rlc3RfVW5pdF9SZWFkeSh1cywgc3JiKTsKKwkJYnJlYWs7CQkvKiAweDAwICovCisJY2FzZSBJTlFVSVJZOgorCQlyZXN1bHQgPSBTTV9TQ1NJX0lucXVpcnkodXMsIHNyYik7CisJCWJyZWFrOwkJLyogMHgxMiAqLworCWNhc2UgTU9ERV9TRU5TRToKKwkJcmVzdWx0ID0gU01fU0NTSV9Nb2RlX1NlbnNlKHVzLCBzcmIpOworCQlicmVhazsJCS8qIDB4MUEgKi8KKwljYXNlIFJFQURfQ0FQQUNJVFk6CisJCXJlc3VsdCA9IFNNX1NDU0lfUmVhZF9DYXBhY2l0eSh1cywgc3JiKTsKKwkJYnJlYWs7CQkvKiAweDI1ICovCisJY2FzZSBSRUFEXzEwOgorCQlyZXN1bHQgPSBTTV9TQ1NJX1JlYWQodXMsIHNyYik7CisJCWJyZWFrOwkJLyogMHgyOCAqLworCWNhc2UgV1JJVEVfMTA6CisJCXJlc3VsdCA9IFNNX1NDU0lfV3JpdGUodXMsIHNyYik7CisJCWJyZWFrOwkJLyogMHgyQSAqLwogCi0JCWRlZmF1bHQ6CisJZGVmYXVsdDoKIAkJCXVzLT5TcmJTdGF0dXMgPSBTU19JTExFR0FMX1JFUVVFU1Q7CiAJCQlyZXN1bHQgPSBVU0JfU1RPUl9UUkFOU1BPUlRfRkFJTEVEOwogCQkJYnJlYWs7CkBAIC00NiwyNSArNTYsMjIgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi0vLy0tLS0tIFNNX1NDU0lfVGVzdF9Vbml0X1JlYWR5KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tIFNNX1NDU0lfVGVzdF9Vbml0X1JlYWR5KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIGludCBTTV9TQ1NJX1Rlc3RfVW5pdF9SZWFkeShzdHJ1Y3QgdXNfZGF0YSAqdXMsIHN0cnVjdCBzY3NpX2NtbmQgKnNyYikKIHsKLQkvL3ByaW50aygiU01fU0NTSV9UZXN0X1VuaXRfUmVhZHlcbiIpOwogCWlmICh1cy0+U01fU3RhdHVzLkluc2VydCAmJiB1cy0+U01fU3RhdHVzLlJlYWR5KQogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7Ci0JZWxzZQotCXsKKwllbHNlIHsKIAkJRU5FX1NNSW5pdCh1cyk7CiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfR09PRDsKIAl9Ci0JCQorCiAJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwogfQogCi0vLy0tLS0tIFNNX1NDU0lfSW5xdWlyeSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLSBTTV9TQ1NJX0lucXVpcnkoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogaW50IFNNX1NDU0lfSW5xdWlyeShzdHJ1Y3QgdXNfZGF0YSAqdXMsIHN0cnVjdCBzY3NpX2NtbmQgKnNyYikKIHsKLQkvL3ByaW50aygiU01fU0NTSV9JbnF1aXJ5XG4iKTsKIAlCWVRFIGRhdGFfcHRyWzM2XSA9IHsweDAwLCAweDgwLCAweDAyLCAweDAwLCAweDFGLCAweDAwLCAweDAwLCAweDAwLCAweDU1LCAweDUzLCAweDQyLCAweDMyLCAweDJFLCAweDMwLCAweDIwLCAweDIwLCAweDQzLCAweDYxLCAweDcyLCAweDY0LCAweDUyLCAweDY1LCAweDYxLCAweDY0LCAweDY1LCAweDcyLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDMwLCAweDMxLCAweDMwLCAweDMwfTsKIAogCXVzYl9zdG9yX3NldF94ZmVyX2J1Zih1cywgZGF0YV9wdHIsIDM2LCBzcmIsIFRPX1hGRVJfQlVGKTsKQEAgLTcyLDExICs3OSwxMSBAQAogfQogCiAKLS8vLS0tLS0gU01fU0NTSV9Nb2RlX1NlbnNlKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tIFNNX1NDU0lfTW9kZV9TZW5zZSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBpbnQgU01fU0NTSV9Nb2RlX1NlbnNlKHN0cnVjdCB1c19kYXRhICp1cywgc3RydWN0IHNjc2lfY21uZCAqc3JiKQogewotCUJZVEUJbWVkaWFOb1dQWzEyXSA9IHsweDBiLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDcxLDB4YzAsMHgwMCwweDAwLDB4MDIsMHgwMH07Ci0JQllURQltZWRpYVdQWzEyXSAgID0gezB4MGIsMHgwMCwweDgwLDB4MDgsMHgwMCwweDAwLDB4NzEsMHhjMCwweDAwLDB4MDAsMHgwMiwweDAwfTsKKwlCWVRFCW1lZGlhTm9XUFsxMl0gPSB7MHgwYiwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHg3MSwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMH07CisJQllURQltZWRpYVdQWzEyXSAgID0gezB4MGIsIDB4MDAsIDB4ODAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4NzEsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDB9OwogCiAJaWYgKHVzLT5TTV9TdGF0dXMuV3RQKQogCQl1c2Jfc3Rvcl9zZXRfeGZlcl9idWYodXMsIG1lZGlhV1AsIDEyLCBzcmIsIFRPX1hGRVJfQlVGKTsKQEAgLTg3LDcgKzk0LDcgQEAKIAlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7CiB9CiAKLS8vLS0tLS0gU01fU0NTSV9SZWFkX0NhcGFjaXR5KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8qIC0tLS0tIFNNX1NDU0lfUmVhZF9DYXBhY2l0eSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBpbnQgU01fU0NTSV9SZWFkX0NhcGFjaXR5KHN0cnVjdCB1c19kYXRhICp1cywgc3RydWN0IHNjc2lfY21uZCAqc3JiKQogewogCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwOwpAQCAtMTAwLDQ1ICsxMDcsMzcgQEAKIAogCWJsX2xlbiA9IDB4MjAwOwogCWJsX251bSA9IFNzZmRjLk1heExvZ0Jsb2NrcyAqIFNzZmRjLk1heFNlY3RvcnMgKiBTc2ZkYy5NYXhab25lcyAtIDE7Ci0JLy9wcmludGsoIk1heExvZ0Jsb2NrcyA9ICV4XG4iLCBTc2ZkYy5NYXhMb2dCbG9ja3MpOwotCS8vcHJpbnRrKCJNYXhTZWN0b3JzICAgPSAleFxuIiwgU3NmZGMuTWF4U2VjdG9ycyk7Ci0JLy9wcmludGsoIk1heFpvbmVzICAgICA9ICV4XG4iLCBTc2ZkYy5NYXhab25lcyk7Ci0JLy9wcmludGsoImJsX251bSAgICAgICA9ICV4XG4iLCBibF9udW0pOwogCiAJdXMtPmJsX251bSA9IGJsX251bTsKIAlwcmludGsoImJsX2xlbiA9ICV4XG4iLCBibF9sZW4pOwogCXByaW50aygiYmxfbnVtID0gJXhcbiIsIGJsX251bSk7CiAKLQkvL3NyYi0+cmVxdWVzdF9idWZmbGVuID0gODsKLQlidWZbMF0gPSAoYmxfbnVtPj4yNCkgJiAweGZmOwotCWJ1ZlsxXSA9IChibF9udW0+PjE2KSAmIDB4ZmY7Ci0JYnVmWzJdID0gKGJsX251bT4+IDgpICYgMHhmZjsKLQlidWZbM10gPSAoYmxfbnVtPj4gMCkgJiAweGZmOwotCWJ1Zls0XSA9IChibF9sZW4+PjI0KSAmIDB4ZmY7Ci0JYnVmWzVdID0gKGJsX2xlbj4+MTYpICYgMHhmZjsKLQlidWZbNl0gPSAoYmxfbGVuPj4gOCkgJiAweGZmOwotCWJ1Zls3XSA9IChibF9sZW4+PiAwKSAmIDB4ZmY7Ci0JCisJYnVmWzBdID0gKGJsX251bSA+PiAyNCkgJiAweGZmOworCWJ1ZlsxXSA9IChibF9udW0gPj4gMTYpICYgMHhmZjsKKwlidWZbMl0gPSAoYmxfbnVtID4+IDgpICYgMHhmZjsKKwlidWZbM10gPSAoYmxfbnVtID4+IDApICYgMHhmZjsKKwlidWZbNF0gPSAoYmxfbGVuID4+IDI0KSAmIDB4ZmY7CisJYnVmWzVdID0gKGJsX2xlbiA+PiAxNikgJiAweGZmOworCWJ1Zls2XSA9IChibF9sZW4gPj4gOCkgJiAweGZmOworCWJ1Zls3XSA9IChibF9sZW4gPj4gMCkgJiAweGZmOworCiAJdXNiX3N0b3JfYWNjZXNzX3hmZXJfYnVmKHVzLCBidWYsIDgsIHNyYiwgJnNnLCAmb2Zmc2V0LCBUT19YRkVSX0JVRik7Ci0JLy91c2Jfc3Rvcl9zZXRfeGZlcl9idWYodXMsIGJ1Ziwgc3JiLT5yZXF1ZXN0X2J1ZmZsZW4sIHNyYiwgVE9fWEZFUl9CVUYpOwogCiAJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwogfQogCi0vLy0tLS0tIFNNX1NDU0lfUmVhZCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvKiAtLS0tLSBTTV9TQ1NJX1JlYWQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogaW50IFNNX1NDU0lfUmVhZChzdHJ1Y3QgdXNfZGF0YSAqdXMsIHN0cnVjdCBzY3NpX2NtbmQgKnNyYikKIHsKLQkvL3N0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKLQlpbnQgcmVzdWx0PTA7CisJaW50IHJlc3VsdCA9IDA7CiAJUEJZVEUJQ2RiID0gc3JiLT5jbW5kOwotCURXT1JEIGJuICA9ICAoKENkYlsyXTw8MjQpICYgMHhmZjAwMDAwMCkgfCAoKENkYlszXTw8MTYpICYgMHgwMGZmMDAwMCkgfAotICAgICAgICAgICAgICAgICAgICgoQ2RiWzRdPDwgOCkgJiAweDAwMDBmZjAwKSB8ICgoQ2RiWzVdPDwgMCkgJiAweDAwMDAwMGZmKTsKLQlXT1JEICBibGVuID0gKChDZGJbN108PCA4KSAmIDB4ZmYwMCkgICAgIHwgKChDZGJbOF08PCAwKSAmIDB4MDBmZik7CisJRFdPUkQgYm4gID0gICgoQ2RiWzJdIDw8IDI0KSAmIDB4ZmYwMDAwMDApIHwgKChDZGJbM10gPDwgMTYpICYgMHgwMGZmMDAwMCkgfAorCQkoKENkYls0XSA8PCA4KSAmIDB4MDAwMGZmMDApIHwgKChDZGJbNV0gPDwgMCkgJiAweDAwMDAwMGZmKTsKKwlXT1JEICBibGVuID0gKChDZGJbN10gPDwgOCkgJiAweGZmMDApICAgICB8ICgoQ2RiWzhdIDw8IDApICYgMHgwMGZmKTsKIAlEV09SRAlibGVuQnl0ZSA9IGJsZW4gKiAweDIwMDsKIAl2b2lkCSpidWY7CiAKLQkvL3ByaW50aygiU0NTSU9QX1JFQUQgLS0tIGJuID0gJVgsIGJsZW4gPSAlWCwgc3JiLT51c2Vfc2cgPSAlWFxuIiwgYm4sIGJsZW4sIHNyYi0+dXNlX3NnKTsKLQkKKwogCWlmIChibiA+IHVzLT5ibF9udW0pCiAJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CiAKQEAgLTE1NywxOSArMTU2LDE3IEBACiAJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwogfQogCi0vLy0tLS0tIFNNX1NDU0lfV3JpdGUoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogLS0tLS0gU01fU0NTSV9Xcml0ZSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBpbnQgU01fU0NTSV9Xcml0ZShzdHJ1Y3QgdXNfZGF0YSAqdXMsIHN0cnVjdCBzY3NpX2NtbmQgKnNyYikKIHsKLQkvL3N0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKLQlpbnQgcmVzdWx0PTA7CisJaW50IHJlc3VsdCA9IDA7CiAJUEJZVEUJQ2RiID0gc3JiLT5jbW5kOwotCURXT1JEIGJuICA9ICAoKENkYlsyXTw8MjQpICYgMHhmZjAwMDAwMCkgfCAoKENkYlszXTw8MTYpICYgMHgwMGZmMDAwMCkgfAotICAgICAgICAgICAgICAgICAgICgoQ2RiWzRdPDwgOCkgJiAweDAwMDBmZjAwKSB8ICgoQ2RiWzVdPDwgMCkgJiAweDAwMDAwMGZmKTsKLQlXT1JEICBibGVuID0gKChDZGJbN108PCA4KSAmIDB4ZmYwMCkgICAgIHwgKChDZGJbOF08PCAwKSAmIDB4MDBmZik7CisJRFdPUkQgYm4gID0gICgoQ2RiWzJdIDw8IDI0KSAmIDB4ZmYwMDAwMDApIHwgKChDZGJbM10gPDwgMTYpICYgMHgwMGZmMDAwMCkgfAorCQkoKENkYls0XSA8PCA4KSAmIDB4MDAwMGZmMDApIHwgKChDZGJbNV0gPDwgMCkgJiAweDAwMDAwMGZmKTsKKwlXT1JEICBibGVuID0gKChDZGJbN10gPDwgOCkgJiAweGZmMDApICAgICB8ICgoQ2RiWzhdIDw8IDApICYgMHgwMGZmKTsKIAlEV09SRAlibGVuQnl0ZSA9IGJsZW4gKiAweDIwMDsKIAl2b2lkCSpidWY7CiAKLQkvL3ByaW50aygiU0NTSU9QX1dyaXRlIC0tLSBibiA9ICVYLCBibGVuID0gJVgsIHNyYi0+dXNlX3NnID0gJVhcbiIsIGJuLCBibGVuLCBzcmItPnVzZV9zZyk7CiAKIAlpZiAoYm4gPiB1cy0+YmxfbnVtKQogCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19pbW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX2ltb24uYwppbmRleCA0YTllNTYzLi5mNTMwOGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX2ltb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX2ltb24uYwpAQCAtNzI3LDYgKzcyNyw5IEBACiAJaW50IGk7CiAJdTE2IHZlbmRvciwgcHJvZHVjdDsKIAorCS8qIHByZXZlbnQgcmFjZXMgcHJvYmluZyBkZXZpY2VzIHcvbXVsdGlwbGUgaW50ZXJmYWNlcyAqLworCW11dGV4X2xvY2soJmRyaXZlcl9sb2NrKTsKKwogCWNvbnRleHQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW1vbl9jb250ZXh0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjb250ZXh0KSB7CiAJCWVycigiJXM6IGt6YWxsb2MgZmFpbGVkIGZvciBjb250ZXh0IiwgX19mdW5jX18pOwpAQCAtNzUzLDkgKzc1Niw2IEBACiAJZGV2X2RiZyhkZXYsICIlczogZm91bmQgaU1PTiBkZXZpY2UgKCUwNHg6JTA0eCwgaW50ZiVkKVxuIiwKIAkJX19mdW5jX18sIHZlbmRvciwgcHJvZHVjdCwgaWZudW0pOwogCi0JLyogcHJldmVudCByYWNlcyBwcm9iaW5nIGRldmljZXMgdy9tdWx0aXBsZSBpbnRlcmZhY2VzICovCi0JbXV0ZXhfbG9jaygmZHJpdmVyX2xvY2spOwotCiAJLyoKIAkgKiBTY2FuIHRoZSBlbmRwb2ludCBsaXN0IGFuZCBzZXQ6CiAJICoJZmlyc3QgaW5wdXQgZW5kcG9pbnQgPSBJUiBlbmRwb2ludApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19zYXNlbS5jIGIvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19zYXNlbS5jCmluZGV4IDcwODBjZGUuLmEyZDE4YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfc2FzZW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3Nhc2VtLmMKQEAgLTgxNCwyOSArODE0LDYgQEAKIAkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IFJlZ2lzdGVyZWQgU2FzZW0gZHJpdmVyIChtaW5vcjolZClcbiIsCiAJCQlfX2Z1bmNfXywgbGlyY19taW5vcik7CiAKLWFsbG9jX3N0YXR1c19zd2l0Y2g6Ci0KLQlzd2l0Y2ggKGFsbG9jX3N0YXR1cykgewotCi0JY2FzZSA3OgotCQlpZiAodmZkX2VwX2ZvdW5kKQotCQkJdXNiX2ZyZWVfdXJiKHR4X3VyYik7Ci0JY2FzZSA2OgotCQl1c2JfZnJlZV91cmIocnhfdXJiKTsKLQljYXNlIDU6Ci0JCWxpcmNfYnVmZmVyX2ZyZWUocmJ1Zik7Ci0JY2FzZSA0OgotCQlrZnJlZShyYnVmKTsKLQljYXNlIDM6Ci0JCWtmcmVlKGRyaXZlcik7Ci0JY2FzZSAyOgotCQlrZnJlZShjb250ZXh0KTsKLQkJY29udGV4dCA9IE5VTEw7Ci0JY2FzZSAxOgotCQlyZXR2YWwgPSAtRU5PTUVNOwotCQlnb3RvIHVubG9jazsKLQl9Ci0KIAkvKiBOZWVkZWQgd2hpbGUgdW5yZWdpc3RlcmluZyEgKi8KIAlkcml2ZXItPm1pbm9yID0gbGlyY19taW5vcjsKIApAQCAtODY3LDYgKzg0NCwyOSBAQAogCQkJX19mdW5jX18sIGRldi0+YnVzLT5idXNudW0sIGRldi0+ZGV2bnVtKTsKIHVubG9jazoKIAltdXRleF91bmxvY2soJmNvbnRleHQtPmN0eF9sb2NrKTsKKworYWxsb2Nfc3RhdHVzX3N3aXRjaDoKKwlzd2l0Y2ggKGFsbG9jX3N0YXR1cykgeworCisJY2FzZSA3OgorCQlpZiAodmZkX2VwX2ZvdW5kKQorCQkJdXNiX2ZyZWVfdXJiKHR4X3VyYik7CisJY2FzZSA2OgorCQl1c2JfZnJlZV91cmIocnhfdXJiKTsKKwljYXNlIDU6CisJCWxpcmNfYnVmZmVyX2ZyZWUocmJ1Zik7CisJY2FzZSA0OgorCQlrZnJlZShyYnVmKTsKKwljYXNlIDM6CisJCWtmcmVlKGRyaXZlcik7CisJY2FzZSAyOgorCQlrZnJlZShjb250ZXh0KTsKKwkJY29udGV4dCA9IE5VTEw7CisJY2FzZSAxOgorCQlpZiAocmV0dmFsID09IDApCisJCQlyZXR2YWwgPSAtRU5PTUVNOworCX0KKwogZXhpdDoKIAlyZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19zZXJpYWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfc2VyaWFsLmMKaW5kZXggODA1ZGY5MS4uOGEwNjBhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19zZXJpYWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3NlcmlhbC5jCkBAIC04NDEsNyArODQxLDcgQEAKIAlpbnQgaSwgbmxvdywgbmhpZ2gsIHJlc3VsdDsKIAogCXJlc3VsdCA9IHJlcXVlc3RfaXJxKGlycSwgaXJxX2hhbmRsZXIsCi0JCQkgICAgIElSUUZfRElTQUJMRUQgfCAoc2hhcmVfaXJxID8gSVJRRl9TSEFSRUQgOiAwKSwKKwkJCSAgICAgKHNoYXJlX2lycSA/IElSUUZfU0hBUkVEIDogMCksCiAJCQkgICAgIExJUkNfRFJJVkVSX05BTUUsICh2b2lkICopJmhhcmR3YXJlKTsKIAogCXN3aXRjaCAocmVzdWx0KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3Npci5jIGIvZHJpdmVycy9zdGFnaW5nL2xpcmMvbGlyY19zaXIuYwppbmRleCAwZDM4NjQ1Li42OTAzZDM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbGlyYy9saXJjX3Npci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9saXJjL2xpcmNfc2lyLmMKQEAgLTk2Nyw3ICs5NjcsNyBAQAogCQlyZXR1cm4gLUVCVVNZOwogCX0KICNlbmRpZgotCXJldHZhbCA9IHJlcXVlc3RfaXJxKGlycSwgc2lyX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwKKwlyZXR2YWwgPSByZXF1ZXN0X2lycShpcnEsIHNpcl9pbnRlcnJ1cHQsIDAsCiAJCQkgICAgIExJUkNfRFJJVkVSX05BTUUsIE5VTEwpOwogCWlmIChyZXR2YWwgPCAwKSB7CiAjICAgICAgICAgICAgICAgaWZuZGVmIExJUkNfT05fU0ExMTAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvbWVpL0tjb25maWcKaW5kZXggM2YzZjE3MC4uNDdkNzhhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21laS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWkvS2NvbmZpZwpAQCAtMSw2ICsxLDYgQEAKIGNvbmZpZyBJTlRFTF9NRUkKIAl0cmlzdGF0ZSAiSW50ZWwgTWFuYWdlbWVudCBFbmdpbmUgSW50ZXJmYWNlIChJbnRlbCBNRUkpIgotCWRlcGVuZHMgb24gWDg2ICYmIFBDSSAmJiBFWFBFUklNRU5UQUwKKwlkZXBlbmRzIG9uIFg4NiAmJiBQQ0kgJiYgRVhQRVJJTUVOVEFMICYmIFdBVENIRE9HX0NPUkUKIAloZWxwCiAJICBUaGUgSW50ZWwgTWFuYWdlbWVudCBFbmdpbmUgKEludGVsIE1FKSBwcm92aWRlcyBNYW5hZ2VhYmlsaXR5LAogCSAgU2VjdXJpdHkgYW5kIE1lZGlhIHNlcnZpY2VzIGZvciBzeXN0ZW0gY29udGFpbmluZyBJbnRlbCBjaGlwc2V0cy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWkvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9tZWkvVE9ETwppbmRleCAzYjZhNjY3Li43ZDlhMTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVpL1RPRE8KKysrIGIvZHJpdmVycy9zdGFnaW5nL21laS9UT0RPCkBAIC0xLDE0ICsxLDQgQEAKIFRPRE86Ci0JLSBDcmVhdGUgaW4ta2VybmVsIENsaWVudCBBUEkuIEV4YW1wbGVzIG9mIGluLWtlcm5lbCBjbGllbnRzIGFyZSB3YXRjaGRvZyBhbmQgQU1USEkuCi0JLSBNRSBXYXRjaGRvZyBEcml2ZXIgdG8gZXhwb3NlIHN0YW5kYXJkIExpbnV4IHdhdGNoZG9nIGludGVyZmFjZQotCS0gUmV3cml0ZSBBTVRISSB0byB1c2UgaW4ta2VybmVsIGNsaWVudCBpbnRlcmZhY2UKLQktIENsZWFudXAgaW5pdCBhbmQgcHJvYmUgZnVuY3Rpb25zCi0JLSBSZXZpZXcgQlVHL0JVR19PTiB1c2FnZQotCS0gQ2xlYW51cCBhbmQgcmVvcmdhbml6ZSBoZWFkZXIgZmlsZXMKLQktIFJld3JpdGUgY2xpZW50IGRhdGEgc3RydWN0dXJlCi0JLSBNYWtlIHN0YXRlIG1hY2hpbmUgbW9yZSByZWFkYWJsZQotCS0gQWRkIG1laS50eHQgd2l0aCBkcml2ZXIgZXhwbGFuYXRpb24gYW5kIGl0J3MgZHJpdmVyCi0JLSBGaXggS2NvbmZpZwogCS0gQ2xlYW51cCBhbmQgc3BsaXQgdGhlIHRpbWVyIGZ1bmN0aW9uCiBVcG9uIFVuc3RhZ2luZzoKIAktIG1vdmUgbWVpLmggdG8gaW5jbHVkZS9saW51eC9tZWkuaApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laS9pbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpL2luaXQuYwppbmRleCAwZmE4MjE2Li44YmYzNDc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVpL2luaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpL2luaXQuYwpAQCAtMTMzLDYgKzEzMyw3IEBACiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT53YWl0X3N0b3Bfd2QpOwogCWRldi0+bWVpX3N0YXRlID0gTUVJX0lOSVRJQUxJWklORzsKIAlkZXYtPmlhbXRoaWZfc3RhdGUgPSBNRUlfSUFNVEhJRl9JRExFOworCWRldi0+d2RfaW50ZXJmYWNlX3JlZyA9IGZhbHNlOwogCiAKIAltZWlfaW9fbGlzdF9pbml0KCZkZXYtPnJlYWRfbGlzdCk7CkBAIC00NjksOSArNDcwLDEyIEBACiAgKgogICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKICAqCi0gKiByZXR1cm5zIG5vbmUuCisgKiByZXR1cm5zOgorICogCTwgMCAtIEVycm9yLgorICogID0gMCAtIG5vIG1vcmUgY2xpZW50cy4KKyAqICA9IDEgLSBzdGlsbCBoYXZlIGNsaWVudHMgdG8gc2VuZCBwcm9wZXJ0aWVzIHJlcXVlc3QuCiAgKi8KLXZvaWQgbWVpX2hvc3RfY2xpZW50X3Byb3BlcnRpZXMoc3RydWN0IG1laV9kZXZpY2UgKmRldikKK2ludCBtZWlfaG9zdF9jbGllbnRfcHJvcGVydGllcyhzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBtZWlfbXNnX2hkciAqbWVpX2hlYWRlcjsKIAlzdHJ1Y3QgaGJtX3Byb3BzX3JlcXVlc3QgKmhvc3RfY2xpX3JlcTsKQEAgLTUwMywyNiArNTA3LDE1IEBACiAJCQlkZXYtPm1laV9zdGF0ZSA9IE1FSV9SRVNFVElORzsKIAkJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAid3JpdGUgc2VuZCBlbnVtZXJhdGlvbiByZXF1ZXN0IG1lc3NhZ2UgdG8gRlcgZmFpbC5cbiIpOwogCQkJbWVpX3Jlc2V0KGRldiwgMSk7Ci0JCQlyZXR1cm47CisJCQlyZXR1cm4gLUVJTzsKIAkJfQogCiAJCWRldi0+aW5pdF9jbGllbnRzX3RpbWVyID0gSU5JVF9DTElFTlRTX1RJTUVPVVQ7CiAJCWRldi0+bWVfY2xpZW50X2luZGV4ID0gYjsKLQkJcmV0dXJuOworCQlyZXR1cm4gMTsKIAl9CiAKLQotCS8qCi0JICogQ2xlYXIgTWFwIGZvciBpbmRpY2F0aW5nIG5vdyBNRSBjbGllbnRzCi0JICogd2l0aCBhc3NvY2lhdGVkIGhvc3QgY2xpZW50Ci0JICovCi0JYml0bWFwX3plcm8oZGV2LT5ob3N0X2NsaWVudHNfbWFwLCBNRUlfQ0xJRU5UU19NQVgpOwotCWRldi0+b3Blbl9oYW5kbGVfY291bnQgPSAwOwotCWJpdG1hcF9zZXQoZGV2LT5ob3N0X2NsaWVudHNfbWFwLCAwLCAzKTsKLQlkZXYtPm1laV9zdGF0ZSA9IE1FSV9FTkFCTEVEOwotCi0JbWVpX3dkX2hvc3RfaW5pdChkZXYpOwotCXJldHVybjsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpL2ludGVyZmFjZS5jIGIvZHJpdmVycy9zdGFnaW5nL21laS9pbnRlcmZhY2UuYwppbmRleCBjZmVjOTJkLi5hNjVkYWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVpL2ludGVyZmFjZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWkvaW50ZXJmYWNlLmMKQEAgLTMzMiw3ICszMzIsNyBAQAogCW1laV9oZHItPnJlc2VydmVkID0gMDsKIAogCW1laV9mbG93X2NvbnRyb2wgPSAoc3RydWN0IGhibV9mbG93X2NvbnRyb2wgKikgJmRldi0+d3JfbXNnX2J1ZlsxXTsKLQltZW1zZXQobWVpX2Zsb3dfY29udHJvbCwgMCwgc2l6ZW9mKG1laV9mbG93X2NvbnRyb2wpKTsKKwltZW1zZXQobWVpX2Zsb3dfY29udHJvbCwgMCwgc2l6ZW9mKCptZWlfZmxvd19jb250cm9sKSk7CiAJbWVpX2Zsb3dfY29udHJvbC0+aG9zdF9hZGRyID0gY2wtPmhvc3RfY2xpZW50X2lkOwogCW1laV9mbG93X2NvbnRyb2wtPm1lX2FkZHIgPSBjbC0+bWVfY2xpZW50X2lkOwogCW1laV9mbG93X2NvbnRyb2wtPmNtZC5jbWQgPSBNRUlfRkxPV19DT05UUk9MX0NNRDsKQEAgLTM5Niw3ICszOTYsNyBAQAogCiAJbWVpX2NsaV9kaXNjb25uZWN0ID0KIAkgICAgKHN0cnVjdCBoYm1fY2xpZW50X2Rpc2Nvbm5lY3RfcmVxdWVzdCAqKSAmZGV2LT53cl9tc2dfYnVmWzFdOwotCW1lbXNldChtZWlfY2xpX2Rpc2Nvbm5lY3QsIDAsIHNpemVvZihtZWlfY2xpX2Rpc2Nvbm5lY3QpKTsKKwltZW1zZXQobWVpX2NsaV9kaXNjb25uZWN0LCAwLCBzaXplb2YoKm1laV9jbGlfZGlzY29ubmVjdCkpOwogCW1laV9jbGlfZGlzY29ubmVjdC0+aG9zdF9hZGRyID0gY2wtPmhvc3RfY2xpZW50X2lkOwogCW1laV9jbGlfZGlzY29ubmVjdC0+bWVfYWRkciA9IGNsLT5tZV9jbGllbnRfaWQ7CiAJbWVpX2NsaV9kaXNjb25uZWN0LT5jbWQuY21kID0gQ0xJRU5UX0RJU0NPTk5FQ1RfUkVRX0NNRDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWkvaW50ZXJmYWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpL2ludGVyZmFjZS5oCmluZGV4IGQwYmY1Y2YuLjdiZDM4YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWkvaW50ZXJmYWNlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laS9pbnRlcmZhY2UuaApAQCAtMjMsNyArMjMsOSBAQAogI2luY2x1ZGUgIm1laV9kZXYuaCIKIAogCi0jZGVmaW5lIEFNVF9XRF9WQUxVRSAxMjAJLyogc2Vjb25kcyAqLworI2RlZmluZSBBTVRfV0RfREVGQVVMVF9USU1FT1VUIDEyMAkvKiBzZWNvbmRzICovCisjZGVmaW5lIEFNVF9XRF9NSU5fVElNRU9VVCAxMjAJLyogc2Vjb25kcyAqLworI2RlZmluZSBBTVRfV0RfTUFYX1RJTUVPVVQgNjU1MzUJLyogc2Vjb25kcyAqLwogCiAjZGVmaW5lIE1FSV9XQVRDSERPR19EQVRBX1NJWkUgICAgICAgICAxNgogI2RlZmluZSBNRUlfU1RBUlRfV0RfREFUQV9TSVpFICAgICAgICAgMjAKQEAgLTQ4LDggKzUwLDggQEAKIAogaW50IG1laV93ZF9zZW5kKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOwogaW50IG1laV93ZF9zdG9wKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIGJvb2wgcHJlc2VydmUpOwotdm9pZCBtZWlfd2RfaG9zdF9pbml0KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOwotdm9pZCBtZWlfd2Rfc3RhcnRfc2V0dXAoc3RydWN0IG1laV9kZXZpY2UgKmRldik7Citib29sIG1laV93ZF9ob3N0X2luaXQoc3RydWN0IG1laV9kZXZpY2UgKmRldik7Cit2b2lkIG1laV93ZF9zZXRfc3RhcnRfdGltZW91dChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCB1MTYgdGltZW91dCk7CiAKIGludCBtZWlfZmxvd19jdHJsX3JlZHVjZShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCBzdHJ1Y3QgbWVpX2NsICpjbCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWkvaW50ZXJydXB0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpL2ludGVycnVwdC5jCmluZGV4IDljYjE4NmIuLjg4MmQxMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWkvaW50ZXJydXB0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21laS9pbnRlcnJ1cHQuYwpAQCAtMzk2LDYgKzM5NiwxOCBAQAogCQlkZXYtPndkX2R1ZV9jb3VudGVyID0gKGRldi0+d2RfdGltZW91dCkgPyAxIDogMDsKIAogCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgInN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gV0QgY2xpZW50LlxuIik7CisKKwkJLyogUmVnaXN0ZXJpbmcgd2F0Y2hkb2cgaW50ZXJmYWNlIGRldmljZSBvbmNlIHdlIGdvdCBjb25uZWN0aW9uCisJCSAgIHRvIHRoZSBXRCBDbGllbnQKKwkJKi8KKwkJaWYgKHdhdGNoZG9nX3JlZ2lzdGVyX2RldmljZSgmYW10X3dkX2RldikpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAibWVpOiB1bmFibGUgdG8gcmVnaXN0ZXIgd2F0Y2hkb2cgZGV2aWNlLlxuIik7CisJCQlkZXYtPndkX2ludGVyZmFjZV9yZWcgPSBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAic3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyIHdhdGNoZG9nIGludGVyZmFjZS5cbiIpOworCQkJZGV2LT53ZF9pbnRlcmZhY2VfcmVnID0gdHJ1ZTsKKwkJfQorCiAJCW1laV9ob3N0X2luaXRfaWFtdGhpZihkZXYpOwogCQlyZXR1cm47CiAJfQpAQCAtNjQxLDYgKzY1Myw3IEBACiAJc3RydWN0IGhibV9ob3N0X2VudW1fcmVzcG9uc2UgKmVudW1fcmVzOwogCXN0cnVjdCBoYm1fY2xpZW50X2Rpc2Nvbm5lY3RfcmVxdWVzdCAqZGlzY29ubmVjdF9yZXE7CiAJc3RydWN0IGhibV9ob3N0X3N0b3BfcmVxdWVzdCAqaG9zdF9zdG9wX3JlcTsKKwlpbnQgcmVzOwogCiAJdW5zaWduZWQgY2hhciAqYnVmZmVyOwogCkBAIC03MzQsNyArNzQ3LDM4IEBACiAJCQkJCU1FSV9DTElFTlRfUFJPUEVSVElFU19NRVNTQUdFKSB7CiAJCQkJZGV2LT5tZV9jbGllbnRfaW5kZXgrKzsKIAkJCQlkZXYtPm1lX2NsaWVudF9wcmVzZW50YXRpb25fbnVtKys7Ci0JCQkJbWVpX2hvc3RfY2xpZW50X3Byb3BlcnRpZXMoZGV2KTsKKworCQkJCS8qKiBTZW5kIENsaWVudCBQcm9wZXRpZXMgcmVxdWVzdCAqKi8KKwkJCQlyZXMgPSBtZWlfaG9zdF9jbGllbnRfcHJvcGVydGllcyhkZXYpOworCQkJCWlmIChyZXMgPCAwKSB7CisJCQkJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAibWVpX2hvc3RfY2xpZW50X3Byb3BlcnRpZXMoKSBmYWlsZWQiKTsKKwkJCQkJcmV0dXJuOworCQkJCX0gZWxzZSBpZiAoIXJlcykgeworCQkJCQkvKgorCQkJCQkgKiBObyBtb3JlIGNsaWVudHMgdG8gc2VuZCB0by4KKwkJCQkJICogQ2xlYXIgTWFwIGZvciBpbmRpY2F0aW5nIG5vdyBNRSBjbGllbnRzCisJCQkJCSAqIHdpdGggYXNzb2NpYXRlZCBob3N0IGNsaWVudAorCQkJCQkgKi8KKwkJCQkJYml0bWFwX3plcm8oZGV2LT5ob3N0X2NsaWVudHNfbWFwLCBNRUlfQ0xJRU5UU19NQVgpOworCQkJCQlkZXYtPm9wZW5faGFuZGxlX2NvdW50ID0gMDsKKworCQkJCQkvKgorCQkJCQkgKiBSZXNlcnZpbmcgdGhlIGZpcnN0IHRocmVlIGNsaWVudCBJRHMKKwkJCQkJICogQ2xpZW50IElkIDAgLSBSZXNlcnZlZCBmb3IgTUVJIEJ1cyBNZXNzYWdlIGNvbW11bmljYXRpb25zCisJCQkJCSAqIENsaWVudCBJZCAxIC0gUmVzZXJ2ZWQgZm9yIFdhdGNoZG9nCisJCQkJCSAqIENsaWVudCBJRCAyIC0gUmVzZXJ2ZWQgZm9yIEFNVEhJCisJCQkJCSAqLworCQkJCQliaXRtYXBfc2V0KGRldi0+aG9zdF9jbGllbnRzX21hcCwgMCwgMyk7CisJCQkJCWRldi0+bWVpX3N0YXRlID0gTUVJX0VOQUJMRUQ7CisKKwkJCQkJLyogaWYgd2QgaW5pdGlhbGl6YXRpb24gZmFpbHMsIGluaXRpYWxpemF0aW9uIHRoZSBBTVRISSBjbGllbnQsCisJCQkJCSAqIG90aGVyd2lzZSB0aGUgQU1USEkgY2xpZW50IHdpbGwgYmUgaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhlIFdEIGNsaWVudCBjb25uZWN0IHJlc3BvbnNlCisJCQkJCSAqIHdpbGwgYmUgcmVjZWl2ZWQKKwkJCQkJICovCisJCQkJCWlmIChtZWlfd2RfaG9zdF9pbml0KGRldikpCisJCQkJCQltZWlfaG9zdF9pbml0X2lhbXRoaWYoZGV2KTsKKwkJCQl9CisKIAkJCX0gZWxzZSB7CiAJCQkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJyZXNldCBkdWUgdG8gcmVjZWl2ZWQgaG9zdCBjbGllbnQgcHJvcGVydGllcyByZXNwb25zZSBidXMgbWVzc2FnZSIpOwogCQkJCW1laV9yZXNldChkZXYsIDEpOwpAQCAtMTM4MSw3ICsxNDI1LDcgQEAKICAqCiAgKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aW1lciBpbnRlcnJ1cHQgd29yawogICovCi12b2lkIG1laV93ZF90aW1lcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit2b2lkIG1laV90aW1lcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCXN0cnVjdCBtZWlfY2wgKmNsX3BvcyA9IE5VTEw7CkBAIC0xMzkxLDcgKzE0MzUsNyBAQAogCXN0cnVjdCBtZWlfY2xfY2IgICpjYl9uZXh0ID0gTlVMTDsKIAogCXN0cnVjdCBtZWlfZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yod29yaywKLQkJCQkJc3RydWN0IG1laV9kZXZpY2UsIHdkX3dvcmsud29yayk7CisJCQkJCXN0cnVjdCBtZWlfZGV2aWNlLCB0aW1lcl93b3JrLndvcmspOwogCiAKIAltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKQEAgLTE0MTgsMzMgKzE0NjIsNiBAQAogCQl9CiAJfQogCi0JaWYgKGRldi0+d2RfY2wuc3RhdGUgIT0gTUVJX0ZJTEVfQ09OTkVDVEVEKQotCQlnb3RvIG91dDsKLQotCS8qIFdhdGNoZG9nICovCi0JaWYgKGRldi0+d2RfZHVlX2NvdW50ZXIgJiYgIWRldi0+d2RfYnlwYXNzKSB7Ci0JCWlmICgtLWRldi0+d2RfZHVlX2NvdW50ZXIgPT0gMCkgewotCQkJaWYgKGRldi0+bWVpX2hvc3RfYnVmZmVyX2lzX2VtcHR5ICYmCi0JCQkgICAgbWVpX2Zsb3dfY3RybF9jcmVkcyhkZXYsICZkZXYtPndkX2NsKSA+IDApIHsKLQkJCQlkZXYtPm1laV9ob3N0X2J1ZmZlcl9pc19lbXB0eSA9IGZhbHNlOwotCQkJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAic2VuZCB3YXRjaGRvZy5cbiIpOwotCi0JCQkJaWYgKG1laV93ZF9zZW5kKGRldikpCi0JCQkJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAid2Qgc2VuZCBmYWlsZWQuXG4iKTsKLQkJCQllbHNlCi0JCQkJCWlmIChtZWlfZmxvd19jdHJsX3JlZHVjZShkZXYsICZkZXYtPndkX2NsKSkKLQkJCQkJCWdvdG8gb3V0OwotCi0JCQkJaWYgKGRldi0+d2RfdGltZW91dCkKLQkJCQkJZGV2LT53ZF9kdWVfY291bnRlciA9IDI7Ci0JCQkJZWxzZQotCQkJCQlkZXYtPndkX2R1ZV9jb3VudGVyID0gMDsKLQotCQkJfSBlbHNlCi0JCQkJZGV2LT53ZF9wZW5kaW5nID0gdHJ1ZTsKLQotCQl9Ci0JfQogCWlmIChkZXYtPmlhbXRoaWZfc3RhbGxfdGltZXIpIHsKIAkJaWYgKC0tZGV2LT5pYW10aGlmX3N0YWxsX3RpbWVyID09IDApIHsKIAkJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAicmVzZXRpbmcgYmVjYXVzZSBvZiBoYW5nIHRvIGFtdGhpLlxuIik7CkBAIC0xNTEwLDcgKzE1MjcsNyBAQAogCQl9CiAJfQogb3V0OgotCSBzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRldi0+d2Rfd29yaywgMiAqIEhaKTsKKwkgc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkZXYtPnRpbWVyX3dvcmssIDIgKiBIWik7CiAJIG11dGV4X3VubG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CiB9CiAKQEAgLTE1NDAsNiArMTU1NywxMiBAQAogCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOwogCW1laV9pb19saXN0X2luaXQoJmNvbXBsZXRlX2xpc3QpOwogCWRldi0+aG9zdF9od19zdGF0ZSA9IG1laV9oY3NyX3JlYWQoZGV2KTsKKworCS8qIEFjayB0aGUgaW50ZXJydXB0IGhlcmUKKwkgKiBJbiBjYXNlIG9mIE1TSSB3ZSBkb24ndCBnbyB0aHJvdWhnIHRoZSBxdWljayBoYW5kbGVyICovCisJaWYgKHBjaV9kZXZfbXNpX2VuYWJsZWQoZGV2LT5wZGV2KSkKKwkJbWVpX3JlZ193cml0ZShkZXYsIEhfQ1NSLCBkZXYtPmhvc3RfaHdfc3RhdGUpOworCiAJZGV2LT5tZV9od19zdGF0ZSA9IG1laV9tZWNzcl9yZWFkKGRldik7CiAKIAkvKiBjaGVjayBpZiBNRSB3YW50cyBhIHJlc2V0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpL21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWkvbWFpbi5jCmluZGV4IGRlODgyNWYuLmViMDVjMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWkvbWFpbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWkvbWFpbi5jCkBAIC01OCw3ICs1OCw3IEBACiBzdGF0aWMgaW50IG1laV9tYWpvcjsKIC8qIFRoZSBkZXZpY2UgcG9pbnRlciAqLwogLyogQ3VycmVudGx5IHRoaXMgZHJpdmVyIHdvcmtzIGFzIGxvbmcgYXMgdGhlcmUgaXMgb25seSBhIHNpbmdsZSBBTVQgZGV2aWNlLiAqLwotc3RhdGljIHN0cnVjdCBwY2lfZGV2ICptZWlfZGV2aWNlOworc3RydWN0IHBjaV9kZXYgKm1laV9kZXZpY2U7CiAKIHN0YXRpYyBzdHJ1Y3QgY2xhc3MgKm1laV9jbGFzczsKIApAQCAtMTUxLDE3ICsxNTEsMjYgQEAKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmcmVlX2RldmljZTsKIAl9Ci0JLyogcmVxdWVzdCBhbmQgZW5hYmxlIGludGVycnVwdCAgICovCi0JZXJyID0gcmVxdWVzdF90aHJlYWRlZF9pcnEocGRldi0+aXJxLAorCXBjaV9lbmFibGVfbXNpKHBkZXYpOworCisJIC8qIHJlcXVlc3QgYW5kIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKwlpZiAocGNpX2Rldl9tc2lfZW5hYmxlZChwZGV2KSkKKwkJZXJyID0gcmVxdWVzdF90aHJlYWRlZF9pcnEocGRldi0+aXJxLAorCQkJTlVMTCwKKwkJCW1laV9pbnRlcnJ1cHRfdGhyZWFkX2hhbmRsZXIsCisJCQkwLCBtZWlfZHJpdmVyX25hbWUsIGRldik7CisJZWxzZQorCQllcnIgPSByZXF1ZXN0X3RocmVhZGVkX2lycShwZGV2LT5pcnEsCiAJCQltZWlfaW50ZXJydXB0X3F1aWNrX2hhbmRsZXIsCiAJCQltZWlfaW50ZXJydXB0X3RocmVhZF9oYW5kbGVyLAogCQkJSVJRRl9TSEFSRUQsIG1laV9kcml2ZXJfbmFtZSwgZGV2KTsKKwogCWlmIChlcnIpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJtZWk6IHJlcXVlc3RfdGhyZWFkZWRfaXJxIGZhaWx1cmUuIGlycSA9ICVkXG4iLAogCQkgICAgICAgcGRldi0+aXJxKTsKIAkJZ290byB1bm1hcF9tZW1vcnk7CiAJfQotCUlOSVRfREVMQVlFRF9XT1JLKCZkZXYtPndkX3dvcmssIG1laV93ZF90aW1lcik7CisJSU5JVF9ERUxBWUVEX1dPUksoJmRldi0+dGltZXJfd29yaywgbWVpX3RpbWVyKTsKIAlpZiAobWVpX2h3X2luaXQoZGV2KSkgewogCQlwcmludGsoS0VSTl9FUlIgIm1laTogSW5pdCBodyBmYWlsdXJlLlxuIik7CiAJCWVyciA9IC1FTk9ERVY7CkBAIC0xNjksNyArMTc4LDcgQEAKIAl9CiAJbWVpX2RldmljZSA9IHBkZXY7CiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGRldik7Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkZXYtPndkX3dvcmssIEhaKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRldi0+dGltZXJfd29yaywgSFopOwogCiAJbXV0ZXhfdW5sb2NrKCZtZWlfbXV0ZXgpOwogCkBAIC0xODMsNiArMTkyLDcgQEAKIAltZWlfZGlzYWJsZV9pbnRlcnJ1cHRzKGRldik7CiAJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAlmcmVlX2lycShwZGV2LT5pcnEsIGRldik7CisJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOwogdW5tYXBfbWVtb3J5OgogCXBjaV9pb3VubWFwKHBkZXYsIGRldi0+bWVtX2FkZHIpOwogZnJlZV9kZXZpY2U6CkBAIC0yMzEsNiArMjQxLDEwIEBACiAJCW1laV9kaXNjb25uZWN0X2hvc3RfY2xpZW50KGRldiwgJmRldi0+d2RfY2wpOwogCX0KIAorCS8qIFVucmVnaXN0ZXJpbmcgd2F0Y2hkb2cgZGV2aWNlICovCisJaWYgKGRldi0+d2RfaW50ZXJmYWNlX3JlZykKKwkJd2F0Y2hkb2dfdW5yZWdpc3Rlcl9kZXZpY2UoJmFtdF93ZF9kZXYpOworCiAJLyogcmVtb3ZlIGVudHJ5IGlmIGFscmVhZHkgaW4gbGlzdCAqLwogCWRldl9kYmcoJnBkZXYtPmRldiwgImxpc3QgZGVsIGlhbXRoaWYgYW5kIHdkIGZpbGUgbGlzdC5cbiIpOwogCW1laV9yZW1vdmVfY2xpZW50X2Zyb21fZmlsZV9saXN0KGRldiwgZGV2LT53ZF9jbC5ob3N0X2NsaWVudF9pZCk7CkBAIC0yNDcsNiArMjYxLDcgQEAKIAltZWlfZGlzYWJsZV9pbnRlcnJ1cHRzKGRldik7CiAKIAlmcmVlX2lycShwZGV2LT5pcnEsIGRldik7CisJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOwogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIAogCWlmIChkZXYtPm1lbV9hZGRyKQpAQCAtNDAyLDcgKzQxNyw3IEBACiAJZXJyID0gLUVOT01FTTsKIAljbCA9IG1laV9jbF9hbGxvY2F0ZShkZXYpOwogCWlmICghY2wpCi0JCWdvdG8gb3V0OworCQlnb3RvIG91dF91bmxvY2s7CiAKIAllcnIgPSAtRU5PREVWOwogCWlmIChkZXYtPm1laV9zdGF0ZSAhPSBNRUlfRU5BQkxFRCkgewpAQCAtMTA5Niw3ICsxMTExLDcgQEAKIAltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOwogCiAJZnJlZV9pcnEocGRldi0+aXJxLCBkZXYpOwotCisJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTExMTEsMTEgKzExMjYsMjAgQEAKIAlpZiAoIWRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQkvKiByZXF1ZXN0IGFuZCBlbmFibGUgaW50ZXJydXB0ICAgKi8KLQllcnIgPSByZXF1ZXN0X3RocmVhZGVkX2lycShwZGV2LT5pcnEsCisJcGNpX2VuYWJsZV9tc2kocGRldik7CisKKwkvKiByZXF1ZXN0IGFuZCBlbmFibGUgaW50ZXJydXB0ICovCisJaWYgKHBjaV9kZXZfbXNpX2VuYWJsZWQocGRldikpCisJCWVyciA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKHBkZXYtPmlycSwKKwkJCU5VTEwsCisJCQltZWlfaW50ZXJydXB0X3RocmVhZF9oYW5kbGVyLAorCQkJMCwgbWVpX2RyaXZlcl9uYW1lLCBkZXYpOworCWVsc2UKKwkJZXJyID0gcmVxdWVzdF90aHJlYWRlZF9pcnEocGRldi0+aXJxLAogCQkJbWVpX2ludGVycnVwdF9xdWlja19oYW5kbGVyLAogCQkJbWVpX2ludGVycnVwdF90aHJlYWRfaGFuZGxlciwKIAkJCUlSUUZfU0hBUkVELCBtZWlfZHJpdmVyX25hbWUsIGRldik7CisKIAlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAibWVpOiBSZXF1ZXN0X2lycSBmYWlsdXJlLiBpcnEgPSAlZFxuIiwKIAkJICAgICAgIHBkZXYtPmlycSk7CkBAIC0xMTI3LDEyICsxMTUxLDkgQEAKIAltZWlfcmVzZXQoZGV2LCAxKTsKIAltdXRleF91bmxvY2soJmRldi0+ZGV2aWNlX2xvY2spOwogCi0JLyogU3RhcnQgd2F0Y2hkb2cgaWYgc3RvcHBlZCBpbiBzdXNwZW5kICovCi0JaWYgKGRldi0+d2RfdGltZW91dCkgewotCQltZWlfd2Rfc3RhcnRfc2V0dXAoZGV2KTsKLQkJZGV2LT53ZF9kdWVfY291bnRlciA9IDE7Ci0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGV2LT53ZF93b3JrLCBIWik7Ci0JfQorCS8qIFN0YXJ0IHRpbWVyIGlmIHN0b3BwZWQgaW4gc3VzcGVuZCAqLworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZGV2LT50aW1lcl93b3JrLCBIWik7CisKIAlyZXR1cm4gZXJyOwogfQogc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKG1laV9wbV9vcHMsIG1laV9wY2lfc3VzcGVuZCwgbWVpX3BjaV9yZXN1bWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21laS9tZWlfZGV2LmggYi9kcml2ZXJzL3N0YWdpbmcvbWVpL21laV9kZXYuaAppbmRleCBkN2JjMTBjLi5hZjRiMWFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVpL21laV9kZXYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVpL21laV9kZXYuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBfTUVJX0RFVl9IXwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgogI2luY2x1ZGUgIm1laS5oIgogI2luY2x1ZGUgImh3LmgiCiAKQEAgLTM3LDYgKzM4LDE3IEBACiAjZGVmaW5lIE1FSV9XRF9TVEFURV9JTkRFUEVOREVOQ0VfTVNHX1NFTlQgICAgICAgKDEgPDwgMCkKIAogLyoKKyAqIE1FSSBQQ0kgRGV2aWNlIG9iamVjdAorICovCitleHRlcm4gc3RydWN0IHBjaV9kZXYgKm1laV9kZXZpY2U7CisKKy8qCisgKiBBTVQgV2F0Y2hkb2cgRGV2aWNlCisgKi8KKyNkZWZpbmUgSU5URUxfQU1UX1dBVENIRE9HX0lEICJJTlRDQU1UIgorZXh0ZXJuIHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgYW10X3dkX2RldjsKKworLyoKICAqIEFNVEhJIENsaWVudCBVVUlECiAgKi8KIGV4dGVybiBjb25zdCB1dWlkX2xlIG1laV9hbXRoaV9ndWlkOwpAQCAtMTk3LDcgKzIwOSw3IEBACiAJICogbG9jayBmb3IgdGhlIGRldmljZQogCSAqLwogCXN0cnVjdCBtdXRleCBkZXZpY2VfbG9jazsgLyogZGV2aWNlIGxvY2sgKi8KLQlzdHJ1Y3QgZGVsYXllZF93b3JrIHdkX3dvcms7CS8qIHdhdGNoIGRvZyBkZWxleWUgd29yayAqLworCXN0cnVjdCBkZWxheWVkX3dvcmsgdGltZXJfd29yazsJLyogTUVJIHRpbWVyIGRlbGF5ZWQgd29yayAodGltZW91dHMpICovCiAJYm9vbCByZWN2ZF9tc2c7CiAJLyoKIAkgKiBodyBzdGF0ZXMgb2YgaG9zdCBhbmQgZncoTUUpCkBAIC0yNTgsNiArMjcwLDggQEAKIAlib29sIGlhbXRoaWZfZmxvd19jb250cm9sX3BlbmRpbmc7CiAJYm9vbCBpYW10aGlmX2lvY3RsOwogCWJvb2wgaWFtdGhpZl9jYW5jZWxlZDsKKworCWJvb2wgd2RfaW50ZXJmYWNlX3JlZzsKIH07CiAKIApAQCAtMzE1LDE0ICszMjksMTQgQEAKICAqLwogdm9pZCBtZWlfaG9zdF9zdGFydF9tZXNzYWdlKHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpOwogdm9pZCBtZWlfaG9zdF9lbnVtX2NsaWVudHNfbWVzc2FnZShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2KTsKLXZvaWQgbWVpX2hvc3RfY2xpZW50X3Byb3BlcnRpZXMoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CitpbnQgbWVpX2hvc3RfY2xpZW50X3Byb3BlcnRpZXMoc3RydWN0IG1laV9kZXZpY2UgKmRldik7CiAKIC8qCiAgKiAgTUVJIGludGVycnVwdCBmdW5jdGlvbnMgcHJvdG90eXBlCiAgKi8KIGlycXJldHVybl90IG1laV9pbnRlcnJ1cHRfcXVpY2tfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogaXJxcmV0dXJuX3QgbWVpX2ludGVycnVwdF90aHJlYWRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwotdm9pZCBtZWlfd2RfdGltZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3ZvaWQgbWVpX3RpbWVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKIC8qCiAgKiAgTUVJIGlucHV0IG91dHB1dCBmdW5jdGlvbiBwcm90b3R5cGUKQEAgLTM1Niw3ICszNzAsNyBAQAogICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKICAqIEBvZmZzZXQ6IG9mZnNldCBmcm9tIHdoaWNoIHRvIHJlYWQgdGhlIGRhdGEKICAqCi0gKiByZXR1cm5zIHRoZSBieXRlIHJlYWQuCisgKiByZXR1cm5zIHJlZ2lzdGVyIHZhbHVlICh1MzIpCiAgKi8KIHN0YXRpYyBpbmxpbmUgdTMyIG1laV9yZWdfcmVhZChzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIG9mZnNldCkKIHsKQEAgLTM2OCw3ICszODIsNyBAQAogICoKICAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCiAgKiBAb2Zmc2V0OiBvZmZzZXQgZnJvbSB3aGljaCB0byB3cml0ZSB0aGUgZGF0YQotICogQHZhbHVlOiB0aGUgYnl0ZSB0byB3cml0ZQorICogQHZhbHVlOiByZWdpc3RlciB2YWx1ZSB0byB3cml0ZSAodTMyKQogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgbWVpX3JlZ193cml0ZShzdHJ1Y3QgbWVpX2RldmljZSAqZGV2LAogCQkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1MzIgdmFsdWUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVpL3dkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVpL3dkLmMKaW5kZXggNDJmMDRlZi4uZmZjYTdjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21laS93ZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWkvd2QuYwpAQCAtMTksMjIgKzE5LDEzIEBACiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgogCiAjaW5jbHVkZSAibWVpX2Rldi5oIgogI2luY2x1ZGUgImh3LmgiCiAjaW5jbHVkZSAiaW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAibWVpLmgiCiAKLS8qCi0gKiBNRUkgV2F0Y2hkb2cgTW9kdWxlIFBhcmFtZXRlcnMKLSAqLwotc3RhdGljIHUxNiB3YXRjaGRvZ190aW1lb3V0ID0gQU1UX1dEX1ZBTFVFOwotbW9kdWxlX3BhcmFtKHdhdGNoZG9nX3RpbWVvdXQsIHVzaG9ydCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHdhdGNoZG9nX3RpbWVvdXQsCi0JCSJJbnRlbChSKSBBTVQgV2F0Y2hkb2cgdGltZW91dCB2YWx1ZSBpbiBzZWNvbmRzLiAoZGVmYXVsdD0iCi0JCQkJCV9fTU9EVUxFX1NUUklORyhBTVRfV0RfVkFMVUUpCi0JCQkJCSIsIGRpc2FibGU9MCkiKTsKLQogc3RhdGljIGNvbnN0IHU4IG1laV9zdGFydF93ZF9wYXJhbXNbXSA9IHsgMHgwMiwgMHgxMiwgMHgxMywgMHgxMCB9Owogc3RhdGljIGNvbnN0IHU4IG1laV9zdG9wX3dkX3BhcmFtc1tdID0geyAweDAyLCAweDAyLCAweDE0LCAweDEwIH07CiAKQEAgLTUwLDEyICs0MSwxMiBAQAogCQkJCQkJMHgzMiwgMHhBQik7CiAKIAotdm9pZCBtZWlfd2Rfc3RhcnRfc2V0dXAoc3RydWN0IG1laV9kZXZpY2UgKmRldikKK3ZvaWQgbWVpX3dkX3NldF9zdGFydF90aW1lb3V0KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYsIHUxNiB0aW1lb3V0KQogewotCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiZGV2LT53ZF90aW1lb3V0PSVkLlxuIiwgZGV2LT53ZF90aW1lb3V0KTsKKwlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgInRpbWVvdXQ9JWQuXG4iLCB0aW1lb3V0KTsKIAltZW1jcHkoZGV2LT53ZF9kYXRhLCBtZWlfc3RhcnRfd2RfcGFyYW1zLCBNRUlfV0RfUEFSQU1TX1NJWkUpOwogCW1lbWNweShkZXYtPndkX2RhdGEgKyBNRUlfV0RfUEFSQU1TX1NJWkUsCi0JCSZkZXYtPndkX3RpbWVvdXQsIHNpemVvZih1MTYpKTsKKwkJCSZ0aW1lb3V0LCBzaXplb2YodTE2KSk7CiB9CiAKIC8qKgpAQCAtNjMsMzkgKzU0LDM5IEBACiAgKgogICogQGRldjogdGhlIGRldmljZSBzdHJ1Y3R1cmUKICAqLwotdm9pZCBtZWlfd2RfaG9zdF9pbml0KHN0cnVjdCBtZWlfZGV2aWNlICpkZXYpCitib29sIG1laV93ZF9ob3N0X2luaXQoc3RydWN0IG1laV9kZXZpY2UgKmRldikKIHsKKwlib29sIHJldCA9IGZhbHNlOworCiAJbWVpX2NsX2luaXQoJmRldi0+d2RfY2wsIGRldik7CiAKIAkvKiBsb29rIGZvciBXRCBjbGllbnQgYW5kIGNvbm5lY3QgdG8gaXQgKi8KIAlkZXYtPndkX2NsLnN0YXRlID0gTUVJX0ZJTEVfRElTQ09OTkVDVEVEOwotCWRldi0+d2RfdGltZW91dCA9IHdhdGNoZG9nX3RpbWVvdXQ7CisJZGV2LT53ZF90aW1lb3V0ID0gQU1UX1dEX0RFRkFVTFRfVElNRU9VVDsKIAotCWlmIChkZXYtPndkX3RpbWVvdXQgPiAwKSB7Ci0JCW1laV93ZF9zdGFydF9zZXR1cChkZXYpOwotCQkvKiBmaW5kIE1FIFdEIGNsaWVudCAqLwotCQltZWlfZmluZF9tZV9jbGllbnRfdXBkYXRlX2ZpbGV4dChkZXYsICZkZXYtPndkX2NsLAotCQkJCQkmbWVpX3dkX2d1aWQsIE1FSV9XRF9IT1NUX0NMSUVOVF9JRCk7CisJLyogZmluZCBNRSBXRCBjbGllbnQgKi8KKwltZWlfZmluZF9tZV9jbGllbnRfdXBkYXRlX2ZpbGV4dChkZXYsICZkZXYtPndkX2NsLAorCQkJCSZtZWlfd2RfZ3VpZCwgTUVJX1dEX0hPU1RfQ0xJRU5UX0lEKTsKIAotCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImNoZWNrIHdkX2NsXG4iKTsKLQkJaWYgKE1FSV9GSUxFX0NPTk5FQ1RJTkcgPT0gZGV2LT53ZF9jbC5zdGF0ZSkgewotCQkJaWYgKCFtZWlfY29ubmVjdChkZXYsICZkZXYtPndkX2NsKSkgewotCQkJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiRmFpbGVkIHRvIGNvbm5lY3QgdG8gV0QgY2xpZW50XG4iKTsKLQkJCQlkZXYtPndkX2NsLnN0YXRlID0gTUVJX0ZJTEVfRElTQ09OTkVDVEVEOwotCQkJCWRldi0+d2RfY2wuaG9zdF9jbGllbnRfaWQgPSAwOwotCQkJCW1laV9ob3N0X2luaXRfaWFtdGhpZihkZXYpIDsKLQkJCX0gZWxzZSB7Ci0JCQkJZGV2LT53ZF9jbC50aW1lcl9jb3VudCA9IENPTk5FQ1RfVElNRU9VVDsKLQkJCX0KKwlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgImNoZWNrIHdkX2NsXG4iKTsKKwlpZiAoTUVJX0ZJTEVfQ09OTkVDVElORyA9PSBkZXYtPndkX2NsLnN0YXRlKSB7CisJCWlmICghbWVpX2Nvbm5lY3QoZGV2LCAmZGV2LT53ZF9jbCkpIHsKKwkJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAiRmFpbGVkIHRvIGNvbm5lY3QgdG8gV0QgY2xpZW50XG4iKTsKKwkJCWRldi0+d2RfY2wuc3RhdGUgPSBNRUlfRklMRV9ESVNDT05ORUNURUQ7CisJCQlkZXYtPndkX2NsLmhvc3RfY2xpZW50X2lkID0gMDsKKwkJCXJldCA9IGZhbHNlOworCQkJZ290byBlbmQ7CiAJCX0gZWxzZSB7Ci0JCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgIkZhaWxlZCB0byBmaW5kIFdEIGNsaWVudFxuIik7Ci0JCQltZWlfaG9zdF9pbml0X2lhbXRoaWYoZGV2KSA7CisJCQlkZXYtPndkX2NsLnRpbWVyX2NvdW50ID0gQ09OTkVDVF9USU1FT1VUOwogCQl9CiAJfSBlbHNlIHsKLQkJZGV2LT53ZF9ieXBhc3MgPSB0cnVlOwotCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgIldEIHJlcXVlc3RlZCB0byBiZSBkaXNhYmxlZFxuIik7Ci0JCW1laV9ob3N0X2luaXRfaWFtdGhpZihkZXYpIDsKKwkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJGYWlsZWQgdG8gZmluZCBXRCBjbGllbnRcbiIpOworCQlyZXQgPSBmYWxzZTsKKwkJZ290byBlbmQ7CiAJfQorCitlbmQ6CisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC0xMjksMTIgKzEyMCwyMiBAQAogCXJldHVybiAtRUlPOwogfQogCisvKioKKyAqIG1laV93ZF9zdG9wIC0gc2VuZHMgd2F0Y2hkb2cgc3RvcCBtZXNzYWdlIHRvIGZ3LgorICoKKyAqIEBkZXY6IHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiBAcHJlc2VydmU6IGluZGljYXRlIGlmIHRvIGtlZXAgdGhlIHRpbWVvdXQgdmFsdWUKKyAqCisgKiByZXR1cm5zIDAgaWYgc3VjY2VzcywKKyAqCS1FSU8gd2hlbiBtZXNzYWdlIHNlbmQgZmFpbHMKKyAqCS1FSU5WQUwgd2hlbiBpbnZhbGlkIG1lc3NhZ2UgaXMgdG8gYmUgc2VudAorICovCiBpbnQgbWVpX3dkX3N0b3Aoc3RydWN0IG1laV9kZXZpY2UgKmRldiwgYm9vbCBwcmVzZXJ2ZSkKIHsKIAlpbnQgcmV0OwogCXUxNiB3ZF90aW1lb3V0ID0gZGV2LT53ZF90aW1lb3V0OwogCi0JY2FuY2VsX2RlbGF5ZWRfd29yaygmZGV2LT53ZF93b3JrKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZkZXYtPnRpbWVyX3dvcmspOwogCWlmIChkZXYtPndkX2NsLnN0YXRlICE9IE1FSV9GSUxFX0NPTk5FQ1RFRCB8fCAhZGV2LT53ZF90aW1lb3V0KQogCQlyZXR1cm4gMDsKIApAQCAtMTg2LDMgKzE4NywxNjggQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKgorICogbWVpX3dkX29wc19zdGFydCAtIHdkIHN0YXJ0IGNvbW1hbmQgZnJvbSB0aGUgd2F0Y2hkb2cgY29yZS4KKyAqCisgKiBAd2RfZGV2IC0gd2F0Y2hkb2cgZGV2aWNlIHN0cnVjdAorICoKKyAqIHJldHVybnMgMCBpZiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBjb2RlIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgbWVpX3dkX29wc19zdGFydChzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZF9kZXYpCit7CisJaW50IGVyciA9IC1FTk9ERVY7CisJc3RydWN0IG1laV9kZXZpY2UgKmRldjsKKworCWRldiA9IHBjaV9nZXRfZHJ2ZGF0YShtZWlfZGV2aWNlKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltdXRleF9sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKKworCWlmIChkZXYtPm1laV9zdGF0ZSAhPSBNRUlfRU5BQkxFRCkgeworCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgIm1laV9zdGF0ZSAhPSBNRUlfRU5BQkxFRCAgbWVpX3N0YXRlPSAlZFxuIiwKKwkJICAgIGRldi0+bWVpX3N0YXRlKTsKKwkJZ290byBlbmRfdW5sb2NrOworCX0KKworCWlmIChkZXYtPndkX2NsLnN0YXRlICE9IE1FSV9GSUxFX0NPTk5FQ1RFRCkJeworCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgIk1FSSBEcml2ZXIgaXMgbm90IGNvbm5lY3RlZCB0byBXYXRjaGRvZyBDbGllbnRcbiIpOworCQlnb3RvIGVuZF91bmxvY2s7CisJfQorCisJbWVpX3dkX3NldF9zdGFydF90aW1lb3V0KGRldiwgZGV2LT53ZF90aW1lb3V0KTsKKworCWVyciA9IDA7CitlbmRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIG1laV93ZF9vcHNfc3RvcCAtICB3ZCBzdG9wIGNvbW1hbmQgZnJvbSB0aGUgd2F0Y2hkb2cgY29yZS4KKyAqCisgKiBAd2RfZGV2IC0gd2F0Y2hkb2cgZGV2aWNlIHN0cnVjdAorICoKKyAqIHJldHVybnMgMCBpZiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJubyBjb2RlIGZvciBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgbWVpX3dkX29wc19zdG9wKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkX2RldikKK3sKKwlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2OworCWRldiA9IHBjaV9nZXRfZHJ2ZGF0YShtZWlfZGV2aWNlKTsKKworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCW1laV93ZF9zdG9wKGRldiwgZmFsc2UpOworCW11dGV4X3VubG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG1laV93ZF9vcHNfcGluZyAtIHdkIHBpbmcgY29tbWFuZCBmcm9tIHRoZSB3YXRjaGRvZyBjb3JlLgorICoKKyAqIEB3ZF9kZXYgLSB3YXRjaGRvZyBkZXZpY2Ugc3RydWN0CisgKgorICogcmV0dXJucyAwIGlmIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIGNvZGUgZm9yIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBtZWlfd2Rfb3BzX3Bpbmcoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RfZGV2KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBtZWlfZGV2aWNlICpkZXY7CisJZGV2ID0gcGNpX2dldF9kcnZkYXRhKG1laV9kZXZpY2UpOworCisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJbXV0ZXhfbG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CisKKwlpZiAoZGV2LT53ZF9jbC5zdGF0ZSAhPSBNRUlfRklMRV9DT05ORUNURUQpIHsKKwkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJ3ZCBpcyBub3QgY29ubmVjdGVkLlxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZW5kOworCX0KKworCS8qIENoZWNrIGlmIHdlIGNhbiBzZW5kIHRoZSBwaW5nIHRvIEhXKi8KKwlpZiAoZGV2LT5tZWlfaG9zdF9idWZmZXJfaXNfZW1wdHkgJiYKKwkJbWVpX2Zsb3dfY3RybF9jcmVkcyhkZXYsICZkZXYtPndkX2NsKSA+IDApIHsKKworCQlkZXYtPm1laV9ob3N0X2J1ZmZlcl9pc19lbXB0eSA9IGZhbHNlOworCQlkZXZfZGJnKCZkZXYtPnBkZXYtPmRldiwgInNlbmRpbmcgd2F0Y2hkb2cgcGluZ1xuIik7CisKKwkJaWYgKG1laV93ZF9zZW5kKGRldikpIHsKKwkJCWRldl9kYmcoJmRldi0+cGRldi0+ZGV2LCAid2Qgc2VuZCBmYWlsZWQuXG4iKTsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGVuZDsKKwkJfQorCisJCWlmIChtZWlfZmxvd19jdHJsX3JlZHVjZShkZXYsICZkZXYtPndkX2NsKSkgeworCQkJZGV2X2RiZygmZGV2LT5wZGV2LT5kZXYsICJtZWlfZmxvd19jdHJsX3JlZHVjZSgpIGZhaWxlZC5cbiIpOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gZW5kOworCQl9CisKKwl9IGVsc2UgeworCQlkZXYtPndkX3BlbmRpbmcgPSB0cnVlOworCX0KKworZW5kOgorCW11dGV4X3VubG9jaygmZGV2LT5kZXZpY2VfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIG1laV93ZF9vcHNfc2V0X3RpbWVvdXQgLSB3ZCBzZXQgdGltZW91dCBjb21tYW5kIGZyb20gdGhlIHdhdGNoZG9nIGNvcmUuCisgKgorICogQHdkX2RldiAtIHdhdGNoZG9nIGRldmljZSBzdHJ1Y3QKKyAqIEB0aW1lb3V0IC0gdGltZW91dCB2YWx1ZSB0byBzZXQKKyAqCisgKiByZXR1cm5zIDAgaWYgc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gY29kZSBmb3IgZmFpbHVyZQorICovCitzdGF0aWMgaW50IG1laV93ZF9vcHNfc2V0X3RpbWVvdXQoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RfZGV2LCB1bnNpZ25lZCBpbnQgdGltZW91dCkKK3sKKwlzdHJ1Y3QgbWVpX2RldmljZSAqZGV2OworCWRldiA9IHBjaV9nZXRfZHJ2ZGF0YShtZWlfZGV2aWNlKTsKKworCWlmICghZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIENoZWNrIFRpbWVvdXQgdmFsdWUgKi8KKwlpZiAodGltZW91dCA8IEFNVF9XRF9NSU5fVElNRU9VVCB8fCB0aW1lb3V0ID4gQU1UX1dEX01BWF9USU1FT1VUKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmRldi0+ZGV2aWNlX2xvY2spOworCisJZGV2LT53ZF90aW1lb3V0ID0gdGltZW91dDsKKwltZWlfd2Rfc2V0X3N0YXJ0X3RpbWVvdXQoZGV2LCBkZXYtPndkX3RpbWVvdXQpOworCisJbXV0ZXhfdW5sb2NrKCZkZXYtPmRldmljZV9sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKgorICogV2F0Y2hkb2cgRGV2aWNlIHN0cnVjdHMKKyAqLworY29uc3Qgc3RydWN0IHdhdGNoZG9nX29wcyB3ZF9vcHMgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkuc3RhcnQgPSBtZWlfd2Rfb3BzX3N0YXJ0LAorCQkuc3RvcCA9IG1laV93ZF9vcHNfc3RvcCwKKwkJLnBpbmcgPSBtZWlfd2Rfb3BzX3BpbmcsCisJCS5zZXRfdGltZW91dCA9IG1laV93ZF9vcHNfc2V0X3RpbWVvdXQsCit9OworY29uc3Qgc3RydWN0IHdhdGNoZG9nX2luZm8gd2RfaW5mbyA9IHsKKwkJLmlkZW50aXR5ID0gSU5URUxfQU1UX1dBVENIRE9HX0lELAorCQkub3B0aW9ucyA9IFdESU9GX0tFRVBBTElWRVBJTkcsCit9OworCitzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlIGFtdF93ZF9kZXYgPSB7CisJCS5pbmZvID0gJndkX2luZm8sCisJCS5vcHMgPSAmd2Rfb3BzLAorCQkudGltZW91dCA9IEFNVF9XRF9ERUZBVUxUX1RJTUVPVVQsCisJCS5taW5fdGltZW91dCA9IEFNVF9XRF9NSU5fVElNRU9VVCwKKwkJLm1heF90aW1lb3V0ID0gQU1UX1dEX01BWF9USU1FT1VULAorfTsKKworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbnZlYy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL252ZWMvS2NvbmZpZwppbmRleCA5ODdhZDQ4Li44NmE4YjhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbnZlYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9udmVjL0tjb25maWcKQEAgLTcsMjEgKzcsMjcgQEAKIAogY29uZmlnIEtFWUJPQVJEX05WRUMKIAlib29sICJLZXlib2FyZCBvbiBuVmlkaWEgY29tcGxpYW50IEVDIgotCWRlcGVuZHMgb24gTUZEX05WRUMKKwlkZXBlbmRzIG9uIE1GRF9OVkVDICYmIElOUFVUPXkKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBhIGtleWJvYXJkIGNvbm5lY3RlZCB0byAKIAkgIGEgblZpZGlhIGNvbXBsaWFudCBlbWJlZGRlZCBjb250cm9sbGVyLgogCiBjb25maWcgU0VSSU9fTlZFQ19QUzIKIAlib29sICJQUzIgb24gblZpZGlhIEVDIgotCWRlcGVuZHMgb24gTUZEX05WRUMKKwlkZXBlbmRzIG9uIE1GRF9OVkVDICYmIE1PVVNFX1BTMgogCWhlbHAKIAkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIGEgVG91Y2hwYWQgLyBNb3VzZSBjb25uZWN0ZWQKIAkgIHRvIGEgblZpZGlhIGNvbXBsaWFudCBlbWJlZGRlZCBjb250cm9sbGVyLgogCiBjb25maWcgTlZFQ19QT1dFUgogCWJvb2wgIk5WRUMgY2hhcmdlciBhbmQgYmF0dGVyeSIKLQlkZXBlbmRzIG9uIE1GRF9OVkVDCisJZGVwZW5kcyBvbiBNRkRfTlZFQyAmJiBQT1dFUl9TVVBQTFk9eQogCWhlbHAKIAkgIFNheSBZIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBiYXR0ZXJ5IGFuZCBjaGFyZ2VyIGludGVyZmFjZSBmb3IKIAkgIG5WaWRpYSBjb21wbGlhbnQgZW1iZWRkZWQgY29udHJvbGxlcnMuCisKK2NvbmZpZyBOVkVDX0xFRFMKKwlib29sICJOVkVDIGxlZHMiCisJZGVwZW5kcyBvbiBNRkRfTlZFQyAmJiBMRURTX0NMQVNTCisJaGVscAorCSAgU2F5IFkgdG8gZW5hYmxlIHllbGxvdyBzaWRlIGxlZHMgb24gQUMxMDAgb3Igb3RoZXIgblZpZGlhIHRlZ3JhIG52ZWMgbGVkcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL252ZWMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvbnZlYy9NYWtlZmlsZQppbmRleCA0YjVmY2VjMS4uYjg0NGQ2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL252ZWMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL252ZWMvTWFrZWZpbGUKQEAgLTIsMyArMiw0IEBACiBvYmotJChDT05GSUdfTUZEX05WRUMpCQkrPSBudmVjLm8KIG9iai0kKENPTkZJR19OVkVDX1BPV0VSKSAJKz0gbnZlY19wb3dlci5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfTlZFQykgCSs9IG52ZWNfa2JkLm8KK29iai0kKENPTkZJR19OVkVDX0xFRFMpIAkrPSBudmVjX2xlZHMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL252ZWMvVE9ETyBiL2RyaXZlcnMvc3RhZ2luZy9udmVjL1RPRE8KaW5kZXggNjQ5ZDZiNy4uZjk1MGFiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL252ZWMvVE9ETworKysgYi9kcml2ZXJzL3N0YWdpbmcvbnZlYy9UT0RPCkBAIC0xLDEwICsxLDEyIEBACiBUb0RvIGxpc3QgKGluY29tcGxldGUsIHVub3JkZXJlZCkKLQktIGNvbnZlcnQgbW91c2UsIGtleWJvYXJkLCBhbmQgcG93ZXIgdG8gcGxhdGZvcm0gZGV2aWNlcwotCS0gYWRkIGNvcHlyaWdodCAvIGRyaXZlciBhdXRob3IgLyBsaWNlbnNlCiAJLSBhZGQgY29tcGlsZSBhcyBtb2R1bGUgc3VwcG9ydAotCS0gbW92ZSBudmVjIGRldmljZXMgdG8gbWZkIGNlbGxzPwotCS0gYWRqdXN0IHRvIGtlcm5lbCBzdHlsZQogCS0gZml4IGNsayB1c2FnZQogCSAgc2hvdWxkIG5vdCBiZSB1c2luZyBjbGtfZ2V0X3N5cygpLCBidXQgY2xrX2dldCgmcGRldi0+ZGV2LCBjb25uKQogCSAgd2hlcmUgY29ubiBpcyBlaXRoZXIgTlVMTCBpZiB0aGUgZGV2aWNlIG9ubHkgaGFzIG9uZSBjbG9jaywgb3IKIAkgIHRoZSBkZXZpY2Ugc3BlY2lmaWMgbmFtZSBpZiBpdCBoYXMgbXVsdGlwbGUgY2xvY2tzLgorCS0gbW92ZSBoYWxmIG9mIHRoZSBudmVjIGluaXQgc3R1ZmYgdG8gaTJjLXRlZ3JhLmMKKwktIG1vdmUgZXZlbnQgaGFuZGxpbmcgdG8gbnZlY19ldmVudHMKKwktIGZpbmlzaCBzdXNwZW5kL3Jlc3VtZSBzdXBwb3J0CisJLSBtb2RpZml5IHRoZSBzeW5jX3dyaXRlIG1ldGhvZCB0byByZXR1cm4gdGhlIHJlY2VpdmVkCisJICBtZXNzYWdlIGluIGEgdmFyaWFibGUgKGFuZCByZXR1cm4gdGhlIGVycm9yIGNvZGUpLgorCS0gYWRkIHN1cHBvcnQgZm9yIG1vcmUgZGV2aWNlIGltcGxlbWVudGF0aW9ucwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlYy1rZXl0YWJsZS5oIGIvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlYy1rZXl0YWJsZS5oCmluZGV4IDZhMWM0ZjcuLjFkYzIyY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWMta2V5dGFibGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjLWtleXRhYmxlLmgKQEAgLTIyLDcgKzIyLDggQEAKICAqLwogCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgY29kZV90YWJfMTAydXNbXSA9IHsKLQlLRVlfR1JBVkUsCS8vIDB4MDAKKwkvKiAweDAwICovCisJS0VZX0dSQVZFLAogCUtFWV9FU0MsCiAJS0VZXzEsCiAJS0VZXzIsCkBAIC0zOCw3ICszOSw4IEBACiAJS0VZX0VRVUFMLAogCUtFWV9CQUNLU1BBQ0UsCiAJS0VZX1RBQiwKLQlLRVlfUSwJCS8vIDB4MTAKKwkvKiAweDEwICovCisJS0VZX1EsCiAJS0VZX1csCiAJS0VZX0UsCiAJS0VZX1IsCkBAIC01NCw3ICs1Niw4IEBACiAJS0VZX0xFRlRDVFJMLAogCUtFWV9BLAogCUtFWV9TLAotCUtFWV9ELAkJLy8gMHgyMAorCS8qIDB4MjAgKi8KKwlLRVlfRCwKIAlLRVlfRiwKIAlLRVlfRywKIAlLRVlfSCwKQEAgLTcwLDcgKzczLDggQEAKIAlLRVlfWCwKIAlLRVlfQywKIAlLRVlfViwKLQlLRVlfQiwJCS8vIDB4MzAKKwkvKiAweDMwICovCisJS0VZX0IsCiAJS0VZX04sCiAJS0VZX00sCiAJS0VZX0NPTU1BLApAQCAtODYsMTMgKzkwLDE1IEBACiAJS0VZX0YzLAogCUtFWV9GNCwKIAlLRVlfRjUsCi0JS0VZX0Y2LAkJLy8gMHg0MAorCS8qIDB4NDAgKi8KKwlLRVlfRjYsCiAJS0VZX0Y3LAogCUtFWV9GOCwKIAlLRVlfRjksCiAJS0VZX0YxMCwKIAlLRVlfRk4sCi0JMCwJCS8vVktfU0NST0xMCisJLyogVktfU0NST0xMICovCisJMCwKIAlLRVlfS1A3LAogCUtFWV9LUDgsCiAJS0VZX0tQOSwKQEAgLTEwMiw1MiArMTA4LDU3IEBACiAJS0VZX0tQNiwKIAlLRVlfS1BQTFVTLAogCUtFWV9LUDEsCi0JS0VZX0tQMiwJLy8gMHg1MAorCS8qIDB4NTAgKi8KKwlLRVlfS1AyLAogCUtFWV9LUDMsCiAJS0VZX0tQMCwKIAlLRVlfS1BET1QsCi0JS0VZX01FTlUsCQkvL1ZLX1NOQVBTSE9UCisJLyogVktfU05BUFNIT1QgKi8KKwlLRVlfTUVOVSwKIAlLRVlfUE9XRVIsCi0JS0VZXzEwMk5ELAkJLy9WS19PRU1fMTAyICAgaGVucnkrIDB4MkIgKDQzKSBCQUNLU0xBU0ggaGF2ZSBiZWVuIHVzZWQsY2hhbmdlIHRvIHVzZSAwWDU2ICg4NikKLQlLRVlfRjExLAkJLy9WS19GMTEKLQlLRVlfRjEyLAkJLy9WS19GMTIKLQkwLCAKLQkwLCAKLQkwLCAKLQkwLCAKLQkwLCAKLQkwLCAKLQkwLCAKLQkwLCAvLyA2MCAKKwkvKiBWS19PRU1fMTAyICovCisJS0VZXzEwMk5ELAorCUtFWV9GMTEsCisJS0VZX0YxMiwKIAkwLAogCTAsCi0JS0VZX1NFQVJDSCwgLy8gYWRkIHNlYXJjaCBrZXkgbWFwIAotCTAsCQkKIAkwLAogCTAsCi0JMCwJCi0JMCwJCQotCTAsIAotCTAsIAotCTAsIAotCTAsIAotCTAsIAotCTAsIAotCTAsIAotCTAsIC8vIDcwIAogCTAsCiAJMCwKLQlLRVlfS1A1LCAgLy83MyBmb3IgSlAga2V5Ym9hcmQgJ1wnIGtleSwgcmVwb3J0IDB4NGMKLQkwLAkJCisJMCwKKwkvKiAweDYwICovCiAJMCwKIAkwLAotCTAsCQotCTAsCQkKLQkwLCAKLQkwLCAKLSAgICAwLCAKLQkwLCAKLQlLRVlfS1A5LCAvLzdkICBmb3IgSlAga2V5Ym9hcmQgJ3wnIGtleSwgcmVwb3J0IDB4NDkKKwkwLAorCUtFWV9TRUFSQ0gsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJLyogMHg3MCAqLworCTAsCisJMCwKKwkwLAorCUtFWV9LUDUsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJMCwKKwkwLAorCTAsCisJS0VZX0tQOSwKIH07CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBleHRjb2RlX3RhYl91czEwMltdID0gewpAQCAtMTY3LDcgKzE3OCw3IEBACiAJMCwKIAkwLAogCTAsCi0JMCwJCS8vIDB4RTAgMHgxMAorCS8qIDB4MTAgKi8KIAkwLAogCTAsCiAJMCwKQEAgLTE3NiwxOCArMTg3LDI0IEBACiAJMCwKIAkwLAogCTAsCi0JMCwJCS8vVktfTUVESUFfTkVYVF9UUkFDSywKKwkwLAorCS8qIFZLX01FRElBX05FWFRfVFJBQ0sgKi8KIAkwLAogCTAsCi0JMCwJCS8vVktfUkVUVVJOLAotCUtFWV9SSUdIVENUUkwsCQkvL1ZLX1JDT05UUk9MLAorCTAsCisJLyogVktfUkVUVVJOICovCisJMCwKKwlLRVlfUklHSFRDVFJMLAogCTAsCiAJMCwKLQlLRVlfTVVURSwJLy8gMHhFMCAweDIwCi0JMCwJCS8vVktfTEFVTkNIX0FQUDEKLQkwLAkJLy9WS19NRURJQV9QTEFZX1BBVVNFCisJLyogMHgyMCAqLworCUtFWV9NVVRFLAorCS8qIFZLX0xBVU5DSF9BUFAxICovCiAJMCwKLQkwLAkJLy9WS19NRURJQV9TVE9QCisJLyogVktfTUVESUFfUExBWV9QQVVTRSAqLworCTAsCisJMCwKKwkvKiBWS19NRURJQV9TVE9QICovCiAJMCwKIAkwLAogCTAsCkBAIC0xOTksNDAgKzIxNiw1NSBAQAogCTAsCiAJMCwKIAkwLAotCUtFWV9WT0xVTUVVUCwJLy8gMHhFMCAweDMwCiAJMCwKLQkwLAkJLy9WS19CUk9XU0VSX0hPTUUKKwkvKiAweDMwICovCisJS0VZX1ZPTFVNRVVQLAorCTAsCisJLyogVktfQlJPV1NFUl9IT01FICovCiAJMCwKIAkwLAotCUtFWV9LUFNMQVNILAkvL1ZLX0RJVklERQogCTAsCi0JS0VZX1NZU1JRLAkJLy9WS19TTkFQU0hPVAotCUtFWV9SSUdIVEFMVCwJCS8vVktfUk1FTlUKLQkwLAkJLy9WS19PRU1fTlZfQkFDS0xJR0hUX1VQCi0JMCwJCS8vVktfT0VNX05WX0JBQ0tMSUdIVF9ETgotCTAsCQkvL1ZLX09FTV9OVl9CQUNLTElHSFRfQVVUT1RPR0dMRQotCTAsCQkvL1ZLX09FTV9OVl9QT1dFUl9JTkZPCi0JMCwJCS8vVktfT0VNX05WX1dJRklfVE9HR0xFCi0JMCwJCS8vVktfT0VNX05WX0RJU1BMQVlfU0VMRUNUCi0JMCwJCS8vVktfT0VNX05WX0FJUlBMQU5FX1RPR0dMRQotCTAsCQkvLzB4RTAgMHg0MAotCUtFWV9MRUZULAkJLy9WS19PRU1fTlZfUkVTRVJWRUQgICAgaGVucnkrIGZvciBKUCBrZXlib2FyZAotCTAsCQkvL1ZLX09FTV9OVl9SRVNFUlZFRAotCTAsCQkvL1ZLX09FTV9OVl9SRVNFUlZFRAotCTAsCQkvL1ZLX09FTV9OVl9SRVNFUlZFRAotCTAsCQkvL1ZLX09FTV9OVl9SRVNFUlZFRAorCS8qIFZLX0RJVklERSAqLworCUtFWV9LUFNMQVNILAorCTAsCisJLyogVktfU05BUFNIT1QgKi8KKwlLRVlfU1lTUlEsCisJLyogVktfUk1FTlUgKi8KKwlLRVlfUklHSFRBTFQsCisJLyogVktfT0VNX05WX0JBQ0tMSUdIVF9VUCAqLworCTAsCisJLyogVktfT0VNX05WX0JBQ0tMSUdIVF9ETiAqLworCTAsCisJLyogVktfT0VNX05WX0JBQ0tMSUdIVF9BVVRPVE9HR0xFICovCisJMCwKKwkvKiBWS19PRU1fTlZfUE9XRVJfSU5GTyAqLworCTAsCisJLyogVktfT0VNX05WX1dJRklfVE9HR0xFICovCisJMCwKKwkvKiBWS19PRU1fTlZfRElTUExBWV9TRUxFQ1QgKi8KKwkwLAorCS8qIFZLX09FTV9OVl9BSVJQTEFORV9UT0dHTEUgKi8KKwkwLAorCS8qIDB4NDAgKi8KKwkwLAorCUtFWV9MRUZULAorCTAsCisJMCwKKwkwLAorCTAsCiAJS0VZX0NBTkNFTCwKIAlLRVlfSE9NRSwKIAlLRVlfVVAsCi0JS0VZX1BBR0VVUCwJCS8vVktfUFJJT1IKKwlLRVlfUEFHRVVQLAogCTAsCiAJS0VZX0xFRlQsCiAJMCwKIAlLRVlfUklHSFQsCiAJMCwKIAlLRVlfRU5ELAotCUtFWV9ET1dOLAkvLyAweEUwIDB4NTAKLQlLRVlfUEFHRURPV04sCQkvL1ZLX05FWFQKKwkvKiAweDUwICovCisJS0VZX0RPV04sCisJS0VZX1BBR0VET1dOLAogCUtFWV9JTlNFUlQsCiAJS0VZX0RFTEVURSwKIAkwLApAQCAtMjQyLDI1ICsyNzQsMzQgQEAKIAkwLAogCTAsCiAJMCwKLQlLRVlfTEVGVE1FVEEsCS8vVktfTFdJTgotCTAsCQkvL1ZLX1JXSU4KLQlLRVlfRVNDLAkvL1ZLX0FQUFMKLQlLRVlfS1BNSU5VUywgLy9mb3IgcG93ZXIgYnV0dG9uIHdvcmthcm91bmQKLQkwLCAKKwlLRVlfTEVGVE1FVEEsCisJMCwKKwlLRVlfRVNDLAorCUtFWV9LUE1JTlVTLAogCTAsCiAJMCwKIAkwLAogCTAsCiAJMCwKLQkwLAkJLy9WS19CUk9XU0VSX1NFQVJDSAotCTAsCQkvL1ZLX0JST1dTRVJfRkFWT1JJVEVTCi0JMCwJCS8vVktfQlJPV1NFUl9SRUZSRVNICi0JMCwJCS8vVktfQlJPV1NFUl9TVE9QCi0JMCwJCS8vVktfQlJPV1NFUl9GT1JXQVJECi0JMCwJCS8vVktfQlJPV1NFUl9CQUNLCi0JMCwJCS8vVktfTEFVTkNIX0FQUDIKLQkwLAkJLy9WS19MQVVOQ0hfTUFJTAotCTAsCQkvL1ZLX0xBVU5DSF9NRURJQV9TRUxFQ1QKKwkwLAorCS8qIFZLX0JST1dTRVJfU0VBUkNIICovCisJMCwKKwkvKiBWS19CUk9XU0VSX0ZBVk9SSVRFUyAqLworCTAsCisJLyogVktfQlJPV1NFUl9SRUZSRVNIICovCisJMCwKKwkvKiBWS19CUk9XU0VSX1NUT1AgKi8KKwkwLAorCS8qIFZLX0JST1dTRVJfRk9SV0FSRCAqLworCTAsCisJLyogVktfQlJPV1NFUl9CQUNLICovCisJMCwKKwkvKiBWS19MQVVOQ0hfQVBQMiAqLworCTAsCisJLyogVktfTEFVTkNIX01BSUwgKi8KKwkwLAorCS8qIFZLX0xBVU5DSF9NRURJQV9TRUxFQ1QgKi8KKwkwLAogfTsKIAotc3RhdGljIHVuc2lnbmVkIHNob3J0KiBjb2RlX3RhYnNbXSA9IHtjb2RlX3RhYl8xMDJ1cywgZXh0Y29kZV90YWJfdXMxMDIgfTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCAqY29kZV90YWJzW10gPSB7IGNvZGVfdGFiXzEwMnVzLCBleHRjb2RlX3RhYl91czEwMiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlYy5jIGIvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlYy5jCmluZGV4IDcyMjU4ZTguLmUwNmI4NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjLmMKQEAgLTEsMjk0ICsxLDcwNiBAQAotLy8gI2RlZmluZSBERUJVRworLyoKKyAqIE5WRUM6IE5WSURJQSBjb21wbGlhbnQgZW1iZWRkZWQgY29udHJvbGxlciBpbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFDMTAwIEtlcm5lbCBUZWFtIDxhYzEwMEBsaXN0cy5sYXVjaHBhZC5uZXQ+CisgKgorICogQXV0aG9yczogIFBpZXJyZS1IdWd1ZXMgSHVzc29uIDxwaGh1c3NvbkBmcmVlLmZyPgorICogICAgICAgICAgIElseWEgUGV0cm92IDxpbHlhLm11cm9tZWNAZ21haWwuY29tPgorICogICAgICAgICAgIE1hcmMgRGlldHJpY2ggPG1hcnZpbjI0QGdteC5kZT4KKyAqICAgICAgICAgICBKdWxpYW4gQW5kcmVzIEtsb2RlIDxqYWtAamFrLWxpbnV4Lm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KIAotLyogVG9EbyBsaXN0IChpbmNvbXBsZXRlLCB1bm9yZGVyZCkKLQktIGNvbnZlcnQgbW91c2UsIGtleWJvYXJkLCBhbmQgcG93ZXIgdG8gcGxhdGZvcm0gZGV2aWNlcwotKi8KKy8qICNkZWZpbmUgREVCVUcgKi8KIAotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zZXJpby5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxtYWNoL2lvbWFwLmg+Ci0jaW5jbHVkZSA8bWFjaC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlIDxtYWNoL2Nsay5oPgorI2luY2x1ZGUgPG1hY2gvaW9tYXAuaD4KKwogI2luY2x1ZGUgIm52ZWMuaCIKIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgRUNfRElTQUJMRV9FVkVOVF9SRVBPUlRJTkdbXSA9CXsnXHgwNCcsJ1x4MDAnLCdceDAwJ307Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBFQ19FTkFCTEVfRVZFTlRfUkVQT1JUSU5HW10gPQl7J1x4MDQnLCdceDAwJywnXHgwMSd9Owotc3RhdGljIHVuc2lnbmVkIGNoYXIgRUNfR0VUX0ZJUk1XQVJFX1ZFUlNJT05bXSA9CXsnXHgwNycsJ1x4MTUnfTsKKyNkZWZpbmUgSTJDX0NORkcJCQkweDAwCisjZGVmaW5lIEkyQ19DTkZHX1BBQ0tFVF9NT0RFX0VOCQkoMTw8MTApCisjZGVmaW5lIEkyQ19DTkZHX05FV19NQVNURVJfU0ZNCQkoMTw8MTEpCisjZGVmaW5lIEkyQ19DTkZHX0RFQk9VTkNFX0NOVF9TSElGVAkxMgorCisjZGVmaW5lIEkyQ19TTF9DTkZHCQkweDIwCisjZGVmaW5lIEkyQ19TTF9ORVdMCQkoMTw8MikKKyNkZWZpbmUgSTJDX1NMX05BQ0sJCSgxPDwxKQorI2RlZmluZSBJMkNfU0xfUkVTUAkJKDE8PDApCisjZGVmaW5lIEkyQ19TTF9JUlEJCSgxPDwzKQorI2RlZmluZSBFTkRfVFJBTlMJCSgxPDw0KQorI2RlZmluZSBSQ1ZECQkJKDE8PDIpCisjZGVmaW5lIFJOVwkJCSgxPDwxKQorCisjZGVmaW5lIEkyQ19TTF9SQ1ZECQkweDI0CisjZGVmaW5lIEkyQ19TTF9TVEFUVVMJCTB4MjgKKyNkZWZpbmUgSTJDX1NMX0FERFIxCQkweDJjCisjZGVmaW5lIEkyQ19TTF9BRERSMgkJMHgzMAorI2RlZmluZSBJMkNfU0xfREVMQVlfQ09VTlQJMHgzYworCisvKioKKyAqIGVudW0gbnZlY19tc2dfY2F0ZWdvcnkgLSBNZXNzYWdlIGNhdGVnb3JpZXMgZm9yIG52ZWNfbXNnX2FsbG9jKCkKKyAqIEBOVkVDX01TR19SWDogVGhlIG1lc3NhZ2UgaXMgYW4gaW5jb21pbmcgbWVzc2FnZSAoZnJvbSBFQykKKyAqIEBOVkVDX01TR19UWDogVGhlIG1lc3NhZ2UgaXMgYW4gb3V0Z29pbmcgbWVzc2FnZSAodG8gRUMpCisgKi8KK2VudW0gbnZlY19tc2dfY2F0ZWdvcnkgIHsKKwlOVkVDX01TR19SWCwKKwlOVkVDX01TR19UWCwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIEVDX0RJU0FCTEVfRVZFTlRfUkVQT1JUSU5HWzNdID0gIlx4MDRceDAwXHgwMCI7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBFQ19FTkFCTEVfRVZFTlRfUkVQT1JUSU5HWzNdICA9ICJceDA0XHgwMFx4MDEiOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgRUNfR0VUX0ZJUk1XQVJFX1ZFUlNJT05bMl0gICAgPSAiXHgwN1x4MTUiOwogCiBzdGF0aWMgc3RydWN0IG52ZWNfY2hpcCAqbnZlY19wb3dlcl9oYW5kbGU7CiAKK3N0YXRpYyBzdHJ1Y3QgbWZkX2NlbGwgbnZlY19kZXZpY2VzW10gPSB7CisJeworCQkubmFtZSA9ICJudmVjLWtiZCIsCisJCS5pZCA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIm52ZWMtbW91c2UiLAorCQkuaWQgPSAxLAorCX0sCisJeworCQkubmFtZSA9ICJudmVjLXBvd2VyIiwKKwkJLmlkID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAibnZlYy1wb3dlciIsCisJCS5pZCA9IDIsCisJfSwKKwl7CisJCS5uYW1lID0gIm52ZWMtbGVkcyIsCisJCS5pZCA9IDEsCisJfSwKK307CisKKy8qKgorICogbnZlY19yZWdpc3Rlcl9ub3RpZmllciAtIFJlZ2lzdGVyIGEgbm90aWZpZXIgd2l0aCBudmVjCisgKiBAbnZlYzogQSAmc3RydWN0IG52ZWNfY2hpcAorICogQG5iOiBUaGUgbm90aWZpZXIgYmxvY2sgdG8gcmVnaXN0ZXIKKyAqCisgKiBSZWdpc3RlcnMgYSBub3RpZmllciB3aXRoIEBudmVjLiBUaGUgbm90aWZpZXIgd2lsbCBiZSBhZGRlZCB0byBhbiBhdG9taWMKKyAqIG5vdGlmaWVyIGNoYWluIHRoYXQgaXMgY2FsbGVkIGZvciBhbGwgcmVjZWl2ZWQgbWVzc2FnZXMgZXhjZXB0IHRob3NlIHRoYXQKKyAqIGNvcnJlc3BvbmQgdG8gYSByZXF1ZXN0IGluaXRpYXRlZCBieSBudmVjX3dyaXRlX3N5bmMoKS4KKyAqLwogaW50IG52ZWNfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG52ZWNfY2hpcCAqbnZlYywgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKLQkJCQl1bnNpZ25lZCBpbnQgZXZlbnRzKQorCQkJICAgdW5zaWduZWQgaW50IGV2ZW50cykKIHsKIAlyZXR1cm4gYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZudmVjLT5ub3RpZmllcl9saXN0LCBuYik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChudmVjX3JlZ2lzdGVyX25vdGlmaWVyKTsKIAotc3RhdGljIGludCBudmVjX3N0YXR1c19ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGV2ZW50X3R5cGUsCi0JCQkJdm9pZCAqZGF0YSkKKy8qKgorICogbnZlY19zdGF0dXNfbm90aWZpZXIgLSBUaGUgZmluYWwgbm90aWZpZXIKKyAqCisgKiBQcmludHMgYSBtZXNzYWdlIGFib3V0IGNvbnRyb2wgZXZlbnRzIG5vdCBoYW5kbGVkIGluIHRoZSBub3RpZmllcgorICogY2hhaW4uCisgKi8KK3N0YXRpYyBpbnQgbnZlY19zdGF0dXNfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQl1bnNpZ25lZCBsb25nIGV2ZW50X3R5cGUsIHZvaWQgKmRhdGEpCiB7CiAJdW5zaWduZWQgY2hhciAqbXNnID0gKHVuc2lnbmVkIGNoYXIgKilkYXRhOwotCWludCBpOwogCi0JaWYoZXZlbnRfdHlwZSAhPSBOVkVDX0NOVEwpCisJaWYgKGV2ZW50X3R5cGUgIT0gTlZFQ19DTlRMKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKLQlwcmludGsoInVuaGFuZGxlZCBtc2cgdHlwZSAlbGQsIHBheWxvYWQ6ICIsIGV2ZW50X3R5cGUpOwotCWZvciAoaSA9IDA7IGkgPCBtc2dbMV07IGkrKykKLQkJcHJpbnRrKCIlMHggIiwgbXNnW2krMl0pOwotCXByaW50aygiXG4iKTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJ1bmhhbmRsZWQgbXNnIHR5cGUgJWxkXG4iLCBldmVudF90eXBlKTsKKwlwcmludF9oZXhfZHVtcChLRVJOX1dBUk5JTkcsICJwYXlsb2FkOiAiLCBEVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwKKwkJbXNnLCBtc2dbMV0gKyAyLCB0cnVlKTsKIAogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKLXZvaWQgbnZlY193cml0ZV9hc3luYyhzdHJ1Y3QgbnZlY19jaGlwICpudmVjLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBzaG9ydCBzaXplKQorLyoqCisgKiBudmVjX21zZ19hbGxvYzoKKyAqIEBudmVjOiBBICZzdHJ1Y3QgbnZlY19jaGlwCisgKiBAY2F0ZWdvcnk6IFBvb2wgY2F0ZWdvcnksIHNlZSAmZW51bSBudmVjX21zZ19jYXRlZ29yeQorICoKKyAqIEFsbG9jYXRlIGEgc2luZ2xlICZzdHJ1Y3QgbnZlY19tc2cgb2JqZWN0IGZyb20gdGhlIG1lc3NhZ2UgcG9vbCBvZgorICogQG52ZWMuIFRoZSByZXN1bHQgc2hhbGwgYmUgcGFzc2VkIHRvIG52ZWNfbXNnX2ZyZWUoKSBpZiBubyBsb25nZXIKKyAqIHVzZWQuCisgKgorICogT3V0Z29pbmcgbWVzc2FnZXMgYXJlIHBsYWNlZCBpbiB0aGUgdXBwZXIgNzUlIG9mIHRoZSBwb29sLCBrZWVwaW5nIHRoZQorICogbG93ZXIgMjUlIGF2YWlsYWJsZSBmb3IgUlggYnVmZmVycyBvbmx5LiBUaGUgcmVhc29uIGlzIHRvIHByZXZlbnQgYQorICogc2l0dWF0aW9uIHdoZXJlIGFsbCBidWZmZXJzIGFyZSBmdWxsIGFuZCBhIG1lc3NhZ2UgaXMgdGh1cyBlbmRsZXNzbHkKKyAqIHJldHJpZWQgYmVjYXVzZSB0aGUgcmVzcG9uc2UgY291bGQgbmV2ZXIgYmUgcHJvY2Vzc2VkLgorICovCitzdGF0aWMgc3RydWN0IG52ZWNfbXNnICpudmVjX21zZ19hbGxvYyhzdHJ1Y3QgbnZlY19jaGlwICpudmVjLAorCQkJCSAgICAgICBlbnVtIG52ZWNfbXNnX2NhdGVnb3J5IGNhdGVnb3J5KQogewotCXN0cnVjdCBudmVjX21zZyAqbXNnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG52ZWNfbXNnKSwgR0ZQX05PV0FJVCk7CisJaW50IGkgPSAoY2F0ZWdvcnkgPT0gTlZFQ19NU0dfVFgpID8gKE5WRUNfUE9PTF9TSVpFIC8gNCkgOiAwOwogCi0JbXNnLT5kYXRhID0ga3phbGxvYyhzaXplLCBHRlBfTk9XQUlUKTsKKwlmb3IgKDsgaSA8IE5WRUNfUE9PTF9TSVpFOyBpKyspIHsKKwkJaWYgKGF0b21pY194Y2hnKCZudmVjLT5tc2dfcG9vbFtpXS51c2VkLCAxKSA9PSAwKSB7CisJCQlkZXZfdmRiZyhudmVjLT5kZXYsICJJTkZPOiBBbGxvY2F0ZSAlaVxuIiwgaSk7CisJCQlyZXR1cm4gJm52ZWMtPm1zZ19wb29sW2ldOworCQl9CisJfQorCisJZGV2X2VycihudmVjLT5kZXYsICJjb3VsZCBub3QgYWxsb2NhdGUgJXMgYnVmZmVyXG4iLAorCQkoY2F0ZWdvcnkgPT0gTlZFQ19NU0dfVFgpID8gIlRYIiA6ICJSWCIpOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogbnZlY19tc2dfZnJlZToKKyAqIEBudmVjOiBBICZzdHJ1Y3QgbnZlY19jaGlwCisgKiBAbXNnOiAgQSBtZXNzYWdlIChtdXN0IGJlIGFsbG9jYXRlZCBieSBudmVjX21zZ19hbGxvYygpIGFuZCBiZWxvbmcgdG8gQG52ZWMpCisgKgorICogRnJlZSB0aGUgZ2l2ZW4gbWVzc2FnZQorICovCitpbmxpbmUgdm9pZCBudmVjX21zZ19mcmVlKHN0cnVjdCBudmVjX2NoaXAgKm52ZWMsIHN0cnVjdCBudmVjX21zZyAqbXNnKQoreworCWlmIChtc2cgIT0gJm52ZWMtPnR4X3NjcmF0Y2gpCisJCWRldl92ZGJnKG52ZWMtPmRldiwgIklORk86IEZyZWUgJXRpXG4iLCBtc2cgLSBudmVjLT5tc2dfcG9vbCk7CisJYXRvbWljX3NldCgmbXNnLT51c2VkLCAwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG52ZWNfbXNnX2ZyZWUpOworCisvKioKKyAqIG52ZWNfbXNnX2lzX2V2ZW50IC0gUmV0dXJuICV0cnVlIGlmIEBtc2cgaXMgYW4gZXZlbnQKKyAqIEBtc2c6IEEgbWVzc2FnZQorICovCitzdGF0aWMgYm9vbCBudmVjX21zZ19pc19ldmVudChzdHJ1Y3QgbnZlY19tc2cgKm1zZykKK3sKKwlyZXR1cm4gbXNnLT5kYXRhWzBdID4+IDc7Cit9CisKKy8qKgorICogbnZlY19tc2dfc2l6ZSAtIEdldCB0aGUgc2l6ZSBvZiBhIG1lc3NhZ2UKKyAqIEBtc2c6IFRoZSBtZXNzYWdlIHRvIGdldCB0aGUgc2l6ZSBmb3IKKyAqCisgKiBUaGlzIG9ubHkgd29ya3MgZm9yIHJlY2VpdmVkIG1lc3NhZ2VzLCBub3QgZm9yIG91dGdvaW5nIG1lc3NhZ2VzLgorICovCitzdGF0aWMgc2l6ZV90IG52ZWNfbXNnX3NpemUoc3RydWN0IG52ZWNfbXNnICptc2cpCit7CisJYm9vbCBpc19ldmVudCA9IG52ZWNfbXNnX2lzX2V2ZW50KG1zZyk7CisJaW50IGV2ZW50X2xlbmd0aCA9IChtc2ctPmRhdGFbMF0gJiAweDYwKSA+PiA1OworCisJLyogZm9yIHZhcmlhYmxlIHNpemUsIHBheWxvYWQgc2l6ZSBpbiBieXRlIDEgKyBjb3VudCAoMSkgKyBjbWQgKDEpICovCisJaWYgKCFpc19ldmVudCB8fCBldmVudF9sZW5ndGggPT0gTlZFQ19WQVJfU0laRSkKKwkJcmV0dXJuIChtc2ctPnBvcyB8fCBtc2ctPnNpemUpID8gKG1zZy0+ZGF0YVsxXSArIDIpIDogMDsKKwllbHNlIGlmIChldmVudF9sZW5ndGggPT0gTlZFQ18yQllURVMpCisJCXJldHVybiAyOworCWVsc2UgaWYgKGV2ZW50X2xlbmd0aCA9PSBOVkVDXzNCWVRFUykKKwkJcmV0dXJuIDM7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworLyoqCisgKiBudmVjX2dwaW9fc2V0X3ZhbHVlIC0gU2V0IHRoZSBHUElPIHZhbHVlCisgKiBAbnZlYzogQSAmc3RydWN0IG52ZWNfY2hpcAorICogQHZhbHVlOiBUaGUgdmFsdWUgdG8gd3JpdGUgKDAgb3IgMSkKKyAqCisgKiBMaWtlIGdwaW9fc2V0X3ZhbHVlKCksIGJ1dCBnZW5lcmF0aW5nIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgorICovCitzdGF0aWMgdm9pZCBudmVjX2dwaW9fc2V0X3ZhbHVlKHN0cnVjdCBudmVjX2NoaXAgKm52ZWMsIGludCB2YWx1ZSkKK3sKKwlkZXZfZGJnKG52ZWMtPmRldiwgIkdQSU8gY2hhbmdlZCBmcm9tICV1IHRvICV1XG4iLAorCQlncGlvX2dldF92YWx1ZShudmVjLT5ncGlvKSwgdmFsdWUpOworCWdwaW9fc2V0X3ZhbHVlKG52ZWMtPmdwaW8sIHZhbHVlKTsKK30KKworLyoqCisgKiBudmVjX3dyaXRlX2FzeW5jIC0gQXN5bmNocm9ub3VzbHkgd3JpdGUgYSBtZXNzYWdlIHRvIE5WRUMKKyAqIEBudmVjOiBBbiBudmVjX2NoaXAgaW5zdGFuY2UKKyAqIEBkYXRhOiBUaGUgbWVzc2FnZSBkYXRhLCBzdGFydGluZyB3aXRoIHRoZSByZXF1ZXN0IHR5cGUKKyAqIEBzaXplOiBUaGUgc2l6ZSBvZiBAZGF0YQorICoKKyAqIFF1ZXVlIGEgc2luZ2xlIG1lc3NhZ2UgdG8gYmUgdHJhbnNmZXJyZWQgdG8gdGhlIGVtYmVkZGVkIGNvbnRyb2xsZXIKKyAqIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkuCisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4gSWYgYSBmYWlsdXJlCisgKiBvY2N1cmVkLCB0aGUgbnZlYyBkcml2ZXIgbWF5IHByaW50IGFuIGVycm9yLgorICovCitpbnQgbnZlY193cml0ZV9hc3luYyhzdHJ1Y3QgbnZlY19jaGlwICpudmVjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJc2hvcnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgbnZlY19tc2cgKm1zZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbXNnID0gbnZlY19tc2dfYWxsb2MobnZlYywgTlZFQ19NU0dfVFgpOworCisJaWYgKG1zZyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCW1zZy0+ZGF0YVswXSA9IHNpemU7CiAJbWVtY3B5KG1zZy0+ZGF0YSArIDEsIGRhdGEsIHNpemUpOwogCW1zZy0+c2l6ZSA9IHNpemUgKyAxOwotCW1zZy0+cG9zID0gMDsKLQlJTklUX0xJU1RfSEVBRCgmbXNnLT5ub2RlKTsKIAorCXNwaW5fbG9ja19pcnFzYXZlKCZudmVjLT50eF9sb2NrLCBmbGFncyk7CiAJbGlzdF9hZGRfdGFpbCgmbXNnLT5ub2RlLCAmbnZlYy0+dHhfZGF0YSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbnZlYy0+dHhfbG9jaywgZmxhZ3MpOwogCi0JZ3Bpb19zZXRfdmFsdWUobnZlYy0+Z3BpbywgMCk7CisJcXVldWVfd29yayhudmVjLT53cSwgJm52ZWMtPnR4X3dvcmspOworCisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKG52ZWNfd3JpdGVfYXN5bmMpOwogCisvKioKKyAqIG52ZWNfd3JpdGVfc3luYyAtIFdyaXRlIGEgbWVzc2FnZSB0byBudmVjIGFuZCByZWFkIHRoZSByZXNwb25zZQorICogQG52ZWM6IEFuICZzdHJ1Y3QgbnZlY19jaGlwCisgKiBAZGF0YTogVGhlIGRhdGEgdG8gd3JpdGUKKyAqIEBzaXplOiBUaGUgc2l6ZSBvZiBAZGF0YQorICoKKyAqIFRoaXMgaXMgc2ltaWxhciB0byBudmVjX3dyaXRlX2FzeW5jKCksIGJ1dCB3YWl0cyBmb3IgdGhlCisgKiByZXF1ZXN0IHRvIGJlIGFuc3dlcmVkIGJlZm9yZSByZXR1cm5pbmcuIFRoaXMgZnVuY3Rpb24KKyAqIHVzZXMgYSBtdXRleCBhbmQgY2FuIHRodXMgbm90IGJlIGNhbGxlZCBmcm9tIGUuZy4KKyAqIGludGVycnVwdCBoYW5kbGVycy4KKyAqCisgKiBSZXR1cm5zOiBBIHBvaW50ZXIgdG8gdGhlIHJlc3BvbnNlIG1lc3NhZ2Ugb24gc3VjY2VzcywKKyAqICVOVUxMIG9uIGZhaWx1cmUuIEZyZWUgd2l0aCBudmVjX21zZ19mcmVlKCkgb25jZSBubyBsb25nZXIKKyAqIHVzZWQuCisgKi8KK3N0cnVjdCBudmVjX21zZyAqbnZlY193cml0ZV9zeW5jKHN0cnVjdCBudmVjX2NoaXAgKm52ZWMsCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHNob3J0IHNpemUpCit7CisJc3RydWN0IG52ZWNfbXNnICptc2c7CisKKwltdXRleF9sb2NrKCZudmVjLT5zeW5jX3dyaXRlX211dGV4KTsKKworCW52ZWMtPnN5bmNfd3JpdGVfcGVuZGluZyA9IChkYXRhWzFdIDw8IDgpICsgZGF0YVswXTsKKworCWlmIChudmVjX3dyaXRlX2FzeW5jKG52ZWMsIGRhdGEsIHNpemUpIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlkZXZfZGJnKG52ZWMtPmRldiwgIm52ZWNfc3luY193cml0ZTogMHglMDR4XG4iLAorCQkJCQludmVjLT5zeW5jX3dyaXRlX3BlbmRpbmcpOworCWlmICghKHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmbnZlYy0+c3luY193cml0ZSwKKwkJCQltc2Vjc190b19qaWZmaWVzKDIwMDApKSkpIHsKKwkJZGV2X3dhcm4obnZlYy0+ZGV2LCAidGltZW91dCB3YWl0aW5nIGZvciBzeW5jIHdyaXRlIHRvIGNvbXBsZXRlXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZudmVjLT5zeW5jX3dyaXRlX211dGV4KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZGV2X2RiZyhudmVjLT5kZXYsICJudmVjX3N5bmNfd3JpdGU6IHBvbmchXG4iKTsKKworCW1zZyA9IG52ZWMtPmxhc3Rfc3luY19tc2c7CisKKwltdXRleF91bmxvY2soJm52ZWMtPnN5bmNfd3JpdGVfbXV0ZXgpOworCisJcmV0dXJuIG1zZzsKK30KK0VYUE9SVF9TWU1CT0wobnZlY193cml0ZV9zeW5jKTsKKworLyoqCisgKiBudmVjX3JlcXVlc3RfbWFzdGVyIC0gUHJvY2VzcyBvdXRnb2luZyBtZXNzYWdlcworICogQHdvcms6IEEgJnN0cnVjdCB3b3JrX3N0cnVjdCAodGhlIHR4X3dvcmtlciBtZW1iZXIgb2YgJnN0cnVjdCBudmVjX2NoaXApCisgKgorICogUHJvY2Vzc2VzIGFsbCBvdXRnb2luZyByZXF1ZXN0cyBieSBzZW5kaW5nIHRoZSByZXF1ZXN0IGFuZCBhd2FpdGluZyB0aGUKKyAqIHJlc3BvbnNlLCB0aGVuIGNvbnRpbnVpbmcgd2l0aCB0aGUgbmV4dCByZXF1ZXN0LiBPbmNlIGEgcmVxdWVzdCBoYXMgYQorICogbWF0Y2hpbmcgcmVzcG9uc2UsIGl0IHdpbGwgYmUgZnJlZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KKyAqLwogc3RhdGljIHZvaWQgbnZlY19yZXF1ZXN0X21hc3RlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IG52ZWNfY2hpcCAqbnZlYyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbnZlY19jaGlwLCB0eF93b3JrKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWxvbmcgZXJyOworCXN0cnVjdCBudmVjX21zZyAqbXNnOwogCi0JaWYoIWxpc3RfZW1wdHkoJm52ZWMtPnR4X2RhdGEpKSB7Ci0JCWdwaW9fc2V0X3ZhbHVlKG52ZWMtPmdwaW8sIDApOworCXNwaW5fbG9ja19pcnFzYXZlKCZudmVjLT50eF9sb2NrLCBmbGFncyk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZudmVjLT50eF9kYXRhKSkgeworCQltc2cgPSBsaXN0X2ZpcnN0X2VudHJ5KCZudmVjLT50eF9kYXRhLCBzdHJ1Y3QgbnZlY19tc2csIG5vZGUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZudmVjLT50eF9sb2NrLCBmbGFncyk7CisJCW52ZWNfZ3Bpb19zZXRfdmFsdWUobnZlYywgMCk7CisJCWVyciA9IHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KAorCQkJCSZudmVjLT5lY190cmFuc2ZlciwgbXNlY3NfdG9famlmZmllcyg1MDAwKSk7CisKKwkJaWYgKGVyciA9PSAwKSB7CisJCQlkZXZfd2FybihudmVjLT5kZXYsICJ0aW1lb3V0IHdhaXRpbmcgZm9yIGVjIHRyYW5zZmVyXG4iKTsKKwkJCW52ZWNfZ3Bpb19zZXRfdmFsdWUobnZlYywgMSk7CisJCQltc2ctPnBvcyA9IDA7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbnZlYy0+dHhfbG9jaywgZmxhZ3MpOworCisJCWlmIChlcnIgPiAwKSB7CisJCQlsaXN0X2RlbF9pbml0KCZtc2ctPm5vZGUpOworCQkJbnZlY19tc2dfZnJlZShudmVjLCBtc2cpOworCQl9CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm52ZWMtPnR4X2xvY2ssIGZsYWdzKTsKIH0KIAorLyoqCisgKiBwYXJzZV9tc2cgLSBQcmludCBzb21lIGluZm9ybWF0aW9uIGFuZCBjYWxsIHRoZSBub3RpZmllcnMgb24gYW4gUlggbWVzc2FnZQorICogQG52ZWM6IEEgJnN0cnVjdCBudmVjX2NoaXAKKyAqIEBtc2c6IEEgbWVzc2FnZSByZWNlaXZlZCBieSBAbnZlYworICoKKyAqIFBhYXJzZSBzb21lIHBpZWNlcyBvZiB0aGUgbWVzc2FnZSBhbmQgdGhlbiBjYWxsIHRoZSBjaGFpbiBvZiBub3RpZmllcnMKKyAqIHJlZ2lzdGVyZWQgdmlhIG52ZWNfcmVnaXN0ZXJfbm90aWZpZXIuCisgKi8KIHN0YXRpYyBpbnQgcGFyc2VfbXNnKHN0cnVjdCBudmVjX2NoaXAgKm52ZWMsIHN0cnVjdCBudmVjX21zZyAqbXNnKQogewotCWludCBpOwotCi0JaWYoKG1zZy0+ZGF0YVswXSAmIDE8PDcpID09IDAgJiYgbXNnLT5kYXRhWzNdKSB7Ci0JCWRldl9lcnIobnZlYy0+ZGV2LCAiZWMgcmVzcG9uZGVkICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsIG1zZy0+ZGF0YVswXSwKLQkJCW1zZy0+ZGF0YVsxXSwgbXNnLT5kYXRhWzJdLCBtc2ctPmRhdGFbM10pOworCWlmICgobXNnLT5kYXRhWzBdICYgMSA8PCA3KSA9PSAwICYmIG1zZy0+ZGF0YVszXSkgeworCQlkZXZfZXJyKG52ZWMtPmRldiwgImVjIHJlc3BvbmRlZCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCQkJbXNnLT5kYXRhWzBdLCBtc2ctPmRhdGFbMV0sIG1zZy0+ZGF0YVsyXSwgbXNnLT5kYXRhWzNdKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKChtc2ctPmRhdGFbMF0gPj4gNyApID09IDEgJiYgKG1zZy0+ZGF0YVswXSAmIDB4MGYpID09IDUpCi0JewotCQlkZXZfd2FybihudmVjLT5kZXYsICJlYyBzeXN0ZW0gZXZlbnQgIik7Ci0JCWZvciAoaT0wOyBpIDwgbXNnLT5kYXRhWzFdOyBpKyspCi0JCQlkZXZfd2FybihudmVjLT5kZXYsICIlMDJ4ICIsIG1zZy0+ZGF0YVsyK2ldKTsKLQkJZGV2X3dhcm4obnZlYy0+ZGV2LCAiXG4iKTsKLQl9CisJaWYgKChtc2ctPmRhdGFbMF0gPj4gNykgPT0gMSAmJiAobXNnLT5kYXRhWzBdICYgMHgwZikgPT0gNSkKKwkJcHJpbnRfaGV4X2R1bXAoS0VSTl9XQVJOSU5HLCAiZWMgc3lzdGVtIGV2ZW50ICIsCisJCQkJRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsIG1zZy0+ZGF0YSwKKwkJCQltc2ctPmRhdGFbMV0gKyAyLCB0cnVlKTsKIAotCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZudmVjLT5ub3RpZmllcl9saXN0LCBtc2ctPmRhdGFbMF0gJiAweDhmLCBtc2ctPmRhdGEpOworCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZudmVjLT5ub3RpZmllcl9saXN0LCBtc2ctPmRhdGFbMF0gJiAweDhmLAorCQkJCSAgIG1zZy0+ZGF0YSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBudmVjX21zZyAqbnZlY193cml0ZV9zeW5jKHN0cnVjdCBudmVjX2NoaXAgKm52ZWMsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHNob3J0IHNpemUpCi17Ci0JZG93bigmbnZlYy0+c3luY193cml0ZV9tdXRleCk7Ci0KLQludmVjLT5zeW5jX3dyaXRlX3BlbmRpbmcgPSAoZGF0YVsxXSA8PCA4KSArIGRhdGFbMF07Ci0JbnZlY193cml0ZV9hc3luYyhudmVjLCBkYXRhLCBzaXplKTsKLQotCWRldl9kYmcobnZlYy0+ZGV2LCAibnZlY19zeW5jX3dyaXRlOiAweCUwNHhcbiIsIG52ZWMtPnN5bmNfd3JpdGVfcGVuZGluZyk7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbigmbnZlYy0+c3luY193cml0ZSk7Ci0JZGV2X2RiZyhudmVjLT5kZXYsICJudmVjX3N5bmNfd3JpdGU6IHBvbmchXG4iKTsKLQotCXVwKCZudmVjLT5zeW5jX3dyaXRlX211dGV4KTsKLQotCXJldHVybiBudmVjLT5sYXN0X3N5bmNfbXNnOwotfQotCi0vKiBSWCB3b3JrZXIgKi8KKy8qKgorICogbnZlY19kaXNwYXRjaCAtIFByb2Nlc3MgbWVzc2FnZXMgcmVjZWl2ZWQgZnJvbSB0aGUgRUMKKyAqIEB3b3JrOiBBICZzdHJ1Y3Qgd29ya19zdHJ1Y3QgKHRoZSB0eF93b3JrZXIgbWVtYmVyIG9mICZzdHJ1Y3QgbnZlY19jaGlwKQorICoKKyAqIFByb2Nlc3MgbWVzc2FnZXMgcHJldmlvdXNseSByZWNlaXZlZCBmcm9tIHRoZSBFQyBhbmQgcHV0IGludG8gdGhlIFJYCisgKiBxdWV1ZSBvZiB0aGUgJnN0cnVjdCBudmVjX2NoaXAgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIEB3b3JrLgorICovCiBzdGF0aWMgdm9pZCBudmVjX2Rpc3BhdGNoKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgbnZlY19jaGlwICpudmVjID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBudmVjX2NoaXAsIHJ4X3dvcmspOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IG52ZWNfbXNnICptc2c7CiAKLQl3aGlsZSghbGlzdF9lbXB0eSgmbnZlYy0+cnhfZGF0YSkpCi0JeworCXNwaW5fbG9ja19pcnFzYXZlKCZudmVjLT5yeF9sb2NrLCBmbGFncyk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZudmVjLT5yeF9kYXRhKSkgewogCQltc2cgPSBsaXN0X2ZpcnN0X2VudHJ5KCZudmVjLT5yeF9kYXRhLCBzdHJ1Y3QgbnZlY19tc2csIG5vZGUpOwogCQlsaXN0X2RlbF9pbml0KCZtc2ctPm5vZGUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZudmVjLT5yeF9sb2NrLCBmbGFncyk7CiAKLQkJaWYobnZlYy0+c3luY193cml0ZV9wZW5kaW5nID09IChtc2ctPmRhdGFbMl0gPDwgOCkgKyBtc2ctPmRhdGFbMF0pCi0JCXsKKwkJaWYgKG52ZWMtPnN5bmNfd3JpdGVfcGVuZGluZyA9PQorCQkgICAgICAobXNnLT5kYXRhWzJdIDw8IDgpICsgbXNnLT5kYXRhWzBdKSB7CiAJCQlkZXZfZGJnKG52ZWMtPmRldiwgInN5bmMgd3JpdGUgY29tcGxldGVkIVxuIik7CiAJCQludmVjLT5zeW5jX3dyaXRlX3BlbmRpbmcgPSAwOwogCQkJbnZlYy0+bGFzdF9zeW5jX21zZyA9IG1zZzsKIAkJCWNvbXBsZXRlKCZudmVjLT5zeW5jX3dyaXRlKTsKIAkJfSBlbHNlIHsKIAkJCXBhcnNlX21zZyhudmVjLCBtc2cpOwotCQkJaWYoKCFtc2cpIHx8ICghbXNnLT5kYXRhKSkKLQkJCQlkZXZfd2FybihudmVjLT5kZXYsICJhdHRlbXB0IGFjY2VzcyB6ZXJvIHBvaW50ZXIiKTsKLQkJCWVsc2UgewotCQkJCWtmcmVlKG1zZy0+ZGF0YSk7Ci0JCQkJa2ZyZWUobXNnKTsKLQkJCX0KKwkJCW52ZWNfbXNnX2ZyZWUobnZlYywgbXNnKTsKIAkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmbnZlYy0+cnhfbG9jaywgZmxhZ3MpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZudmVjLT5yeF9sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogbnZlY190eF9jb21wbGV0ZWQgLSBDb21wbGV0ZSB0aGUgY3VycmVudCB0cmFuc2ZlcgorICogQG52ZWM6IEEgJnN0cnVjdCBudmVjX2NoaXAKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHdlIGhhdmUgcmVjZWl2ZWQgYW4gRU5EX1RSQU5TIG9uIGEgVFggdHJhbnNmZXIuCisgKi8KK3N0YXRpYyB2b2lkIG52ZWNfdHhfY29tcGxldGVkKHN0cnVjdCBudmVjX2NoaXAgKm52ZWMpCit7CisJLyogV2UgZ290IGFuIEVORF9UUkFOUywgbGV0J3Mgc2tpcCB0aGlzLCBtYXliZSB0aGVyZSdzIGFuIGV2ZW50ICovCisJaWYgKG52ZWMtPnR4LT5wb3MgIT0gbnZlYy0+dHgtPnNpemUpIHsKKwkJZGV2X2VycihudmVjLT5kZXYsICJwcmVtYXR1cmUgRU5EX1RSQU5TLCByZXNlbmRpbmdcbiIpOworCQludmVjLT50eC0+cG9zID0gMDsKKwkJbnZlY19ncGlvX3NldF92YWx1ZShudmVjLCAwKTsKKwl9IGVsc2UgeworCQludmVjLT5zdGF0ZSA9IDA7CiAJfQogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgaTJjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXYpCisvKioKKyAqIG52ZWNfcnhfY29tcGxldGVkIC0gQ29tcGxldGUgdGhlIGN1cnJlbnQgdHJhbnNmZXIKKyAqIEBudmVjOiBBICZzdHJ1Y3QgbnZlY19jaGlwCisgKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiB3ZSBoYXZlIHJlY2VpdmVkIGFuIEVORF9UUkFOUyBvbiBhIFJYIHRyYW5zZmVyLgorICovCitzdGF0aWMgdm9pZCBudmVjX3J4X2NvbXBsZXRlZChzdHJ1Y3QgbnZlY19jaGlwICpudmVjKQoreworCWlmIChudmVjLT5yeC0+cG9zICE9IG52ZWNfbXNnX3NpemUobnZlYy0+cngpKSB7CisJCWRldl9lcnIobnZlYy0+ZGV2LCAiUlggaW5jb21wbGV0ZTogRXhwZWN0ZWQgJXUgYnl0ZXMsIGdvdCAldVxuIiwKKwkJCSAgICh1aW50KSBudmVjX21zZ19zaXplKG52ZWMtPnJ4KSwKKwkJCSAgICh1aW50KSBudmVjLT5yeC0+cG9zKTsKKworCQludmVjX21zZ19mcmVlKG52ZWMsIG52ZWMtPnJ4KTsKKwkJbnZlYy0+c3RhdGUgPSAwOworCisJCS8qIEJhdHRlcnkgcXVpcmsgLSBPZnRlbiBpbmNvbXBsZXRlLCBhbmQgbGlrZXMgdG8gY3Jhc2ggKi8KKwkJaWYgKG52ZWMtPnJ4LT5kYXRhWzBdID09IE5WRUNfQkFUKQorCQkJY29tcGxldGUoJm52ZWMtPmVjX3RyYW5zZmVyKTsKKworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrKCZudmVjLT5yeF9sb2NrKTsKKworCS8qIGFkZCB0aGUgcmVjZWl2ZWQgZGF0YSB0byB0aGUgd29yayBsaXN0CisJICAgYW5kIG1vdmUgdGhlIHJpbmcgYnVmZmVyIHBvaW50ZXIgdG8gdGhlIG5leHQgZW50cnkgKi8KKwlsaXN0X2FkZF90YWlsKCZudmVjLT5yeC0+bm9kZSwgJm52ZWMtPnJ4X2RhdGEpOworCisJc3Bpbl91bmxvY2soJm52ZWMtPnJ4X2xvY2spOworCisJbnZlYy0+c3RhdGUgPSAwOworCisJaWYgKCFudmVjX21zZ19pc19ldmVudChudmVjLT5yeCkpCisJCWNvbXBsZXRlKCZudmVjLT5lY190cmFuc2Zlcik7CisKKwlxdWV1ZV93b3JrKG52ZWMtPndxLCAmbnZlYy0+cnhfd29yayk7Cit9CisKKy8qKgorICogbnZlY19pbnZhbGlkX2ZsYWdzIC0gU2VuZCBhbiBlcnJvciBtZXNzYWdlIGFib3V0IGludmFsaWQgZmxhZ3MgYW5kIGp1bXAKKyAqIEBudmVjOiBUaGUgbnZlYyBkZXZpY2UKKyAqIEBzdGF0dXM6IFRoZSBzdGF0dXMgZmxhZ3MKKyAqIEByZXNldDogV2hldGhlciB3ZSBzaGFsbCBqdW1wIHRvIHN0YXRlIDAuCisgKi8KK3N0YXRpYyB2b2lkIG52ZWNfaW52YWxpZF9mbGFncyhzdHJ1Y3QgbnZlY19jaGlwICpudmVjLCB1bnNpZ25lZCBpbnQgc3RhdHVzLAorCQkJICAgICAgIGJvb2wgcmVzZXQpCit7CisJZGV2X2VycihudmVjLT5kZXYsICJ1bmV4cGVjdGVkIHN0YXR1cyBmbGFncyAweCUwMnggZHVyaW5nIHN0YXRlICVpXG4iLAorCQlzdGF0dXMsIG52ZWMtPnN0YXRlKTsKKwlpZiAocmVzZXQpCisJCW52ZWMtPnN0YXRlID0gMDsKK30KKworLyoqCisgKiBudmVjX3R4X3NldCAtIFNldCB0aGUgbWVzc2FnZSB0byB0cmFuc2ZlciAobnZlYy0+dHgpCisgKiBAbnZlYzogQSAmc3RydWN0IG52ZWNfY2hpcAorICoKKyAqIEdldHMgdGhlIGZpcnN0IGVudHJ5IGZyb20gdGhlIHR4X2RhdGEgbGlzdCBvZiBAbnZlYyBhbmQgc2V0cyB0aGUKKyAqIHR4IG1lbWJlciB0byBpdC4gSWYgdGhlIHR4X2RhdGEgbGlzdCBpcyBlbXB0eSwgdGhpcyB1c2VzIHRoZQorICogdHhfc2NyYXRjaCBtZXNzYWdlIHRvIHNlbmQgYSBubyBvcGVyYXRpb24gbWVzc2FnZS4KKyAqLworc3RhdGljIHZvaWQgbnZlY190eF9zZXQoc3RydWN0IG52ZWNfY2hpcCAqbnZlYykKK3sKKwlzcGluX2xvY2soJm52ZWMtPnR4X2xvY2spOworCWlmIChsaXN0X2VtcHR5KCZudmVjLT50eF9kYXRhKSkgeworCQlkZXZfZXJyKG52ZWMtPmRldiwgImVtcHR5IHR4IC0gc2VuZGluZyBuby1vcFxuIik7CisJCW1lbWNweShudmVjLT50eF9zY3JhdGNoLmRhdGEsICJceDAyXHgwN1x4MDIiLCAzKTsKKwkJbnZlYy0+dHhfc2NyYXRjaC5zaXplID0gMzsKKwkJbnZlYy0+dHhfc2NyYXRjaC5wb3MgPSAwOworCQludmVjLT50eCA9ICZudmVjLT50eF9zY3JhdGNoOworCQlsaXN0X2FkZF90YWlsKCZudmVjLT50eC0+bm9kZSwgJm52ZWMtPnR4X2RhdGEpOworCX0gZWxzZSB7CisJCW52ZWMtPnR4ID0gbGlzdF9maXJzdF9lbnRyeSgmbnZlYy0+dHhfZGF0YSwgc3RydWN0IG52ZWNfbXNnLAorCQkJCQkgICAgbm9kZSk7CisJCW52ZWMtPnR4LT5wb3MgPSAwOworCX0KKwlzcGluX3VubG9jaygmbnZlYy0+dHhfbG9jayk7CisKKwlkZXZfZGJnKG52ZWMtPmRldiwgIlNlbmRpbmcgbWVzc2FnZSBvZiBsZW5ndGggJXUsIGNvbW1hbmQgMHgleFxuIiwKKwkJKHVpbnQpbnZlYy0+dHgtPnNpemUsIG52ZWMtPnR4LT5kYXRhWzFdKTsKK30KKworLyoqCisgKiBudmVjX2ludGVycnVwdCAtIEludGVycnVwdCBoYW5kbGVyCisgKiBAaXJxOiBUaGUgSVJRCisgKiBAZGV2OiBUaGUgbnZlYyBkZXZpY2UKKyAqCisgKiBJbnRlcnJ1cHQgaGFuZGxlciB0aGF0IGZpbGxzIG91ciBSWCBidWZmZXJzIGFuZCBlbXB0aWVzIG91ciBUWAorICogYnVmZmVycy4gVGhpcyB1c2VzIGEgZmluaXRlIHN0YXRlIG1hY2hpbmUgd2l0aCByaWRpY3Vsb3VzIGFtb3VudHMKKyAqIG9mIGVycm9yIGNoZWNraW5nLCBpbiBvcmRlciB0byBiZSBmYWlybHkgcmVsaWFibGUuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBudmVjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXYpCiB7CiAJdW5zaWduZWQgbG9uZyBzdGF0dXM7Ci0JdW5zaWduZWQgbG9uZyByZWNlaXZlZDsKLQl1bnNpZ25lZCBjaGFyIHRvX3NlbmQ7Ci0Jc3RydWN0IG52ZWNfbXNnICptc2c7Ci0Jc3RydWN0IG52ZWNfY2hpcCAqbnZlYyA9IChzdHJ1Y3QgbnZlY19jaGlwICopZGV2OwotCXVuc2lnbmVkIGNoYXIgKmkyY19yZWdzID0gbnZlYy0+aTJjX3JlZ3M7CisJdW5zaWduZWQgaW50IHJlY2VpdmVkID0gMDsKKwl1bnNpZ25lZCBjaGFyIHRvX3NlbmQgPSAweGZmOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgaXJxX21hc2sgPSBJMkNfU0xfSVJRIHwgRU5EX1RSQU5TIHwgUkNWRCB8IFJOVzsKKwlzdHJ1Y3QgbnZlY19jaGlwICpudmVjID0gZGV2OworCXVuc2lnbmVkIGludCBzdGF0ZSA9IG52ZWMtPnN0YXRlOwogCi0Jc3RhdHVzID0gcmVhZGwoaTJjX3JlZ3MgKyBJMkNfU0xfU1RBVFVTKTsKKwlzdGF0dXMgPSByZWFkbChudmVjLT5iYXNlICsgSTJDX1NMX1NUQVRVUyk7CiAKLQlpZighKHN0YXR1cyAmIEkyQ19TTF9JUlEpKQotCXsKLQkJZGV2X3dhcm4obnZlYy0+ZGV2LCAibnZlYyBTcHVyaW91cyBJUlFcbiIpOwotCQkvL1l1cCwgaGFuZGxlZC4gYWh1bS4KLQkJZ290byBoYW5kbGVkOwotCX0KLQlpZihzdGF0dXMgJiBFTkRfVFJBTlMgJiYgIShzdGF0dXMgJiBSQ1ZEKSkKLQl7Ci0JCS8vUmVlbmFibGUgSVJRIG9ubHkgd2hlbiBldmVuIGhhcyBiZWVuIHNlbnQKLQkJLy9wcmludGsoIldyaXRlIHNlcXVlbmNlIGVuZGVkICFcbiIpOwotICAgICAgICAgICAgICAgIC8vcGFyc2VfbXNnKG52ZWMpOwotCQludmVjLT5zdGF0ZSA9IE5WRUNfV0FJVDsKLQkJaWYobnZlYy0+cngtPnNpemUgPiAxKQotCQl7Ci0JCQlsaXN0X2FkZF90YWlsKCZudmVjLT5yeC0+bm9kZSwgJm52ZWMtPnJ4X2RhdGEpOwotCQkJc2NoZWR1bGVfd29yaygmbnZlYy0+cnhfd29yayk7Ci0JCX0gZWxzZSB7Ci0JCQlrZnJlZShudmVjLT5yeC0+ZGF0YSk7Ci0JCQlrZnJlZShudmVjLT5yeCk7Ci0JCX0KKwkvKiBGaWx0ZXIgb3V0IHNvbWUgZXJyb3JzICovCisJaWYgKChzdGF0dXMgJiBpcnFfbWFzaykgPT0gMCAmJiAoc3RhdHVzICYgfmlycV9tYXNrKSAhPSAwKSB7CisJCWRldl9lcnIobnZlYy0+ZGV2LCAidW5leHBlY3RlZCBpcnEgbWFzayAlbHhcbiIsIHN0YXR1cyk7CiAJCXJldHVybiBJUlFfSEFORExFRDsKLQl9IGVsc2UgaWYoc3RhdHVzICYgUk5XKQotCXsKLQkJLy8gV29yayBhcm91bmQgZm9yIEFQMjAgTmV3IFNsYXZlIEh3IEJ1Zy4gR2l2ZSAxdXMgZXh0cmEuCi0JCS8vIG52ZWMvc21idXMvbnZlY19pMmNfdHJhbnNwb3J0LmMgaW4gTlZgcyBjcmFwIGZvciByZWZlcmVuY2UKLQkJaWYoc3RhdHVzICYgUkNWRCkKLQkJCXVkZWxheSgzKTsKLQotCQlpZihzdGF0dXMgJiBSQ1ZEKQotCQl7Ci0JCQludmVjLT5zdGF0ZSA9IE5WRUNfV1JJVEU7Ci0JCQkvL01hc3RlciB3YW50cyBzb21ldGhpbmcgZnJvbSB1cy4gTmV3IGNvbW11bmljYXRpb24KLS8vCQkJZGV2X2RiZyhudmVjLT5kZXYsICJOZXcgcmVhZCBjb21tIVxuIik7Ci0JCX0gZWxzZSB7Ci0JCQkvL01hc3RlciB3YW50cyBzb21ldGhpbmcgZnJvbSB1cyBmcm9tIGEgY29tbXVuaWNhdGlvbiB3ZSd2ZSBhbHJlYWR5IHN0YXJ0ZWQKLS8vCQkJZGV2X2RiZyhudmVjLT5kZXYsICJSZWFkIGNvbW0gY29udCAhXG4iKTsKLQkJfQotCQkvL2lmKG1zZ19wb3M8bXNnX3NpemUpIHsKLQkJaWYobGlzdF9lbXB0eSgmbnZlYy0+dHhfZGF0YSkpCi0JCXsKLQkJCWRldl9lcnIobnZlYy0+ZGV2LCAibnZlYyBlbXB0eSB0eCAtIHNlbmRpbmcgbm8tb3BcbiIpOwotCQkJdG9fc2VuZCA9IDB4OGE7Ci0JCQludmVjX3dyaXRlX2FzeW5jKG52ZWMsICJceDA3XHgwMiIsIDIpOwotLy8JCQl0b19zZW5kID0gMHgwMTsKLQkJfSBlbHNlIHsKLQkJCW1zZyA9IGxpc3RfZmlyc3RfZW50cnkoJm52ZWMtPnR4X2RhdGEsIHN0cnVjdCBudmVjX21zZywgbm9kZSk7Ci0JCQlpZihtc2ctPnBvcyA8IG1zZy0+c2l6ZSkgewotCQkJCXRvX3NlbmQgPSBtc2ctPmRhdGFbbXNnLT5wb3NdOwotCQkJCW1zZy0+cG9zKys7Ci0JCQl9IGVsc2UgewotCQkJCWRldl9lcnIobnZlYy0+ZGV2LCAibnZlYyBjcmFwISAlZFxuIiwgbXNnLT5zaXplKTsKLQkJCQl0b19zZW5kID0gMHgwMTsKLQkJCX0KLQotCQkJaWYobXNnLT5wb3MgPj0gbXNnLT5zaXplKQotCQkJewotCQkJCWxpc3RfZGVsX2luaXQoJm1zZy0+bm9kZSk7Ci0JCQkJa2ZyZWUobXNnLT5kYXRhKTsKLQkJCQlrZnJlZShtc2cpOwotCQkJCXNjaGVkdWxlX3dvcmsoJm52ZWMtPnR4X3dvcmspOwotCQkJCW52ZWMtPnN0YXRlID0gTlZFQ19XQUlUOwotCQkJfQotCQl9Ci0JCXdyaXRlbCh0b19zZW5kLCBpMmNfcmVncyArIEkyQ19TTF9SQ1ZEKTsKLQotCQlncGlvX3NldF92YWx1ZShudmVjLT5ncGlvLCAxKTsKLQotCQlkZXZfZGJnKG52ZWMtPmRldiwgIm52ZWMgc2VudCAleFxuIiwgdG9fc2VuZCk7Ci0KLQkJZ290byBoYW5kbGVkOwotCX0gZWxzZSB7Ci0JCXJlY2VpdmVkID0gcmVhZGwoaTJjX3JlZ3MgKyBJMkNfU0xfUkNWRCk7Ci0JCS8vV29ya2Fyb3VuZD8KLQkJaWYoc3RhdHVzICYgUkNWRCkgewotCQkJd3JpdGVsKDAsIGkyY19yZWdzICsgSTJDX1NMX1JDVkQpOwotCQkJZ290byBoYW5kbGVkOwotCQl9Ci0KLQkJaWYgKG52ZWMtPnN0YXRlID09IE5WRUNfV0FJVCkKLQkJewotCQkJbnZlYy0+c3RhdGUgPSBOVkVDX1JFQUQ7Ci0JCQltc2cgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbnZlY19tc2cpLCBHRlBfTk9XQUlUKTsKLQkJCW1zZy0+ZGF0YSA9IGt6YWxsb2MoMzIsIEdGUF9OT1dBSVQpOwotCQkJSU5JVF9MSVNUX0hFQUQoJm1zZy0+bm9kZSk7Ci0JCQludmVjLT5yeCA9IG1zZzsKLQkJfSBlbHNlCi0JCQltc2cgPSBudmVjLT5yeDsKLQotCQlCVUdfT04obXNnLT5wb3MgPiAzMik7Ci0KLQkJbXNnLT5kYXRhW21zZy0+cG9zXSA9IHJlY2VpdmVkOwotCQltc2ctPnBvcysrOwotCQltc2ctPnNpemUgPSBtc2ctPnBvczsKLQkJZGV2X2RiZyhudmVjLT5kZXYsICJHb3QgJTAybHggZnJvbSBNYXN0ZXIgKHBvczogJWQpIVxuIiwgcmVjZWl2ZWQsIG1zZy0+cG9zKTsKIAl9Ci1oYW5kbGVkOgorCWlmICgoc3RhdHVzICYgSTJDX1NMX0lSUSkgPT0gMCkgeworCQlkZXZfZXJyKG52ZWMtPmRldiwgIlNwdXJpb3VzIElSUVxuIik7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwkvKiBUaGUgRUMgZGlkIG5vdCByZXF1ZXN0IGEgcmVhZCwgc28gaXQgc2VuZCB1cyBzb21ldGhpbmcsIHJlYWQgaXQgKi8KKwlpZiAoKHN0YXR1cyAmIFJOVykgPT0gMCkgeworCQlyZWNlaXZlZCA9IHJlYWRsKG52ZWMtPmJhc2UgKyBJMkNfU0xfUkNWRCk7CisJCWlmIChzdGF0dXMgJiBSQ1ZEKQorCQkJd3JpdGVsKDAsIG52ZWMtPmJhc2UgKyBJMkNfU0xfUkNWRCk7CisJfQorCisJaWYgKHN0YXR1cyA9PSAoSTJDX1NMX0lSUSB8IFJDVkQpKQorCQludmVjLT5zdGF0ZSA9IDA7CisKKwlzd2l0Y2ggKG52ZWMtPnN0YXRlKSB7CisJY2FzZSAwOgkJLyogVmVyaWZ5IHRoYXQgaXRzIGEgdHJhbnNmZXIgc3RhcnQsIHRoZSByZXN0IGxhdGVyICovCisJCWlmIChzdGF0dXMgIT0gKEkyQ19TTF9JUlEgfCBSQ1ZEKSkKKwkJCW52ZWNfaW52YWxpZF9mbGFncyhudmVjLCBzdGF0dXMsIGZhbHNlKTsKKwkJYnJlYWs7CisJY2FzZSAxOgkJLyogY29tbWFuZCBieXRlICovCisJCWlmIChzdGF0dXMgIT0gSTJDX1NMX0lSUSkgeworCQkJbnZlY19pbnZhbGlkX2ZsYWdzKG52ZWMsIHN0YXR1cywgdHJ1ZSk7CisJCX0gZWxzZSB7CisJCQludmVjLT5yeCA9IG52ZWNfbXNnX2FsbG9jKG52ZWMsIE5WRUNfTVNHX1JYKTsKKwkJCS8qIFNob3VsZCBub3QgaGFwcGVuIGluIGEgbm9ybWFsIHdvcmxkICovCisJCQlpZiAodW5saWtlbHkobnZlYy0+cnggPT0gTlVMTCkpIHsKKwkJCQludmVjLT5zdGF0ZSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQludmVjLT5yeC0+ZGF0YVswXSA9IHJlY2VpdmVkOworCQkJbnZlYy0+cngtPnBvcyA9IDE7CisJCQludmVjLT5zdGF0ZSA9IDI7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAyOgkJLyogZmlyc3QgYnl0ZSBhZnRlciBjb21tYW5kICovCisJCWlmIChzdGF0dXMgPT0gKEkyQ19TTF9JUlEgfCBSTlcgfCBSQ1ZEKSkgeworCQkJdWRlbGF5KDMzKTsKKwkJCWlmIChudmVjLT5yeC0+ZGF0YVswXSAhPSAweDAxKSB7CisJCQkJZGV2X2VycihudmVjLT5kZXYsCisJCQkJCSJSZWFkIHdpdGhvdXQgcHJpb3IgcmVhZCBjb21tYW5kXG4iKTsKKwkJCQludmVjLT5zdGF0ZSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQludmVjX21zZ19mcmVlKG52ZWMsIG52ZWMtPnJ4KTsKKwkJCW52ZWMtPnN0YXRlID0gMzsKKwkJCW52ZWNfdHhfc2V0KG52ZWMpOworCQkJQlVHX09OKG52ZWMtPnR4LT5zaXplIDwgMSk7CisJCQl0b19zZW5kID0gbnZlYy0+dHgtPmRhdGFbMF07CisJCQludmVjLT50eC0+cG9zID0gMTsKKwkJfSBlbHNlIGlmIChzdGF0dXMgPT0gKEkyQ19TTF9JUlEpKSB7CisJCQlCVUdfT04obnZlYy0+cnggPT0gTlVMTCk7CisJCQludmVjLT5yeC0+ZGF0YVsxXSA9IHJlY2VpdmVkOworCQkJbnZlYy0+cngtPnBvcyA9IDI7CisJCQludmVjLT5zdGF0ZSA9IDQ7CisJCX0gZWxzZSB7CisJCQludmVjX2ludmFsaWRfZmxhZ3MobnZlYywgc3RhdHVzLCB0cnVlKTsKKwkJfQorCQlicmVhazsKKwljYXNlIDM6CQkvKiBFQyBkb2VzIGEgYmxvY2sgcmVhZCwgd2UgdHJhbnNtaXQgZGF0YSAqLworCQlpZiAoc3RhdHVzICYgRU5EX1RSQU5TKSB7CisJCQludmVjX3R4X2NvbXBsZXRlZChudmVjKTsKKwkJfSBlbHNlIGlmICgoc3RhdHVzICYgUk5XKSA9PSAwIHx8IChzdGF0dXMgJiBSQ1ZEKSkgeworCQkJbnZlY19pbnZhbGlkX2ZsYWdzKG52ZWMsIHN0YXR1cywgdHJ1ZSk7CisJCX0gZWxzZSBpZiAobnZlYy0+dHggJiYgbnZlYy0+dHgtPnBvcyA8IG52ZWMtPnR4LT5zaXplKSB7CisJCQl0b19zZW5kID0gbnZlYy0+dHgtPmRhdGFbbnZlYy0+dHgtPnBvcysrXTsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIobnZlYy0+ZGV2LCAidHggYnVmZmVyIHVuZGVyZmxvdyBvbiAlcCAoJXUgPiAldSlcbiIsCisJCQkJbnZlYy0+dHgsCisJCQkJKHVpbnQpIChudmVjLT50eCA/IG52ZWMtPnR4LT5wb3MgOiAwKSwKKwkJCQkodWludCkgKG52ZWMtPnR4ID8gbnZlYy0+dHgtPnNpemUgOiAwKSk7CisJCQludmVjLT5zdGF0ZSA9IDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSA0OgkJLyogRUMgZG9lcyBzb21lIHdyaXRlLCB3ZSByZWFkIHRoZSBkYXRhICovCisJCWlmICgoc3RhdHVzICYgKEVORF9UUkFOUyB8IFJOVykpID09IEVORF9UUkFOUykKKwkJCW52ZWNfcnhfY29tcGxldGVkKG52ZWMpOworCQllbHNlIGlmIChzdGF0dXMgJiAoUk5XIHwgUkNWRCkpCisJCQludmVjX2ludmFsaWRfZmxhZ3MobnZlYywgc3RhdHVzLCB0cnVlKTsKKwkJZWxzZSBpZiAobnZlYy0+cnggJiYgbnZlYy0+cngtPnBvcyA8IE5WRUNfTVNHX1NJWkUpCisJCQludmVjLT5yeC0+ZGF0YVtudmVjLT5yeC0+cG9zKytdID0gcmVjZWl2ZWQ7CisJCWVsc2UKKwkJCWRldl9lcnIobnZlYy0+ZGV2LAorCQkJCSJSWCBidWZmZXIgb3ZlcmZsb3cgb24gJXA6ICIKKwkJCQkiVHJ5aW5nIHRvIHdyaXRlIGJ5dGUgJXUgb2YgJXVcbiIsCisJCQkJbnZlYy0+cngsIG52ZWMtPnJ4LT5wb3MsIE5WRUNfTVNHX1NJWkUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQludmVjLT5zdGF0ZSA9IDA7CisJfQorCisJLyogSWYgd2UgYXJlIHRvbGQgdGhhdCBhIG5ldyB0cmFuc2ZlciBzdGFydHMsIHZlcmlmeSBpdCAqLworCWlmICgoc3RhdHVzICYgKFJDVkQgfCBSTlcpKSA9PSBSQ1ZEKSB7CisJCWlmIChyZWNlaXZlZCAhPSBudmVjLT5pMmNfYWRkcikKKwkJCWRldl9lcnIobnZlYy0+ZGV2LAorCQkJInJlY2VpdmVkIGFkZHJlc3MgMHglMDJ4LCBleHBlY3RlZCAweCUwMnhcbiIsCisJCQlyZWNlaXZlZCwgbnZlYy0+aTJjX2FkZHIpOworCQludmVjLT5zdGF0ZSA9IDE7CisJfQorCisJLyogU2VuZCBkYXRhIGlmIHJlcXVlc3RlZCwgYnV0IG5vdCBvbiBlbmQgb2YgdHJhbnNtaXNzaW9uICovCisJaWYgKChzdGF0dXMgJiAoUk5XIHwgRU5EX1RSQU5TKSkgPT0gUk5XKQorCQl3cml0ZWwodG9fc2VuZCwgbnZlYy0+YmFzZSArIEkyQ19TTF9SQ1ZEKTsKKworCS8qIElmIHdlIGhhdmUgc2VuZCB0aGUgZmlyc3QgYnl0ZSAqLworCWlmIChzdGF0dXMgPT0gKEkyQ19TTF9JUlEgfCBSTlcgfCBSQ1ZEKSkKKwkJbnZlY19ncGlvX3NldF92YWx1ZShudmVjLCAxKTsKKworCWRldl9kYmcobnZlYy0+ZGV2LAorCQkiSGFuZGxlZDogJXMgMHglMDJ4LCAlcyAweCUwMnggaW4gc3RhdGUgJXUgWyVzJXMlc11cbiIsCisJCShzdGF0dXMgJiBSTlcpID09IDAgPyAicmVjZWl2ZWQiIDogIlI9IiwKKwkJcmVjZWl2ZWQsCisJCShzdGF0dXMgJiAoUk5XIHwgRU5EX1RSQU5TKSkgPyAic2VudCIgOiAiUz0iLAorCQl0b19zZW5kLAorCQlzdGF0ZSwKKwkJc3RhdHVzICYgRU5EX1RSQU5TID8gIiBFTkRfVFJBTlMiIDogIiIsCisJCXN0YXR1cyAmIFJDVkQgPyAiIFJDVkQiIDogIiIsCisJCXN0YXR1cyAmIFJOVyA/ICIgUk5XIiA6ICIiKTsKKworCisJLyoKKwkgKiBUT0RPOiBBIGNvcnJlY3QgZml4IG5lZWRzIHRvIGJlIGZvdW5kIGZvciB0aGlzLgorCSAqCisJICogV2UgZXhwZXJpZW5jZSBsZXNzIGluY29tcGxldGUgbWVzc2FnZXMgd2l0aCB0aGlzIGRlbGF5IHRoYW4gd2l0aG91dAorCSAqIGl0LCBidXQgd2UgZG9uJ3Qga25vdyB3aHkuIEhlbHAgaXMgYXBwcmVjaWF0ZWQuCisJICovCisJdWRlbGF5KDEwMCk7CisKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IG52ZWNfYWRkX3N1YmRldihzdHJ1Y3QgbnZlY19jaGlwICpudmVjLCBzdHJ1Y3QgbnZlY19zdWJkZXYgKnN1YmRldikKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwotCi0JcGRldiA9IHBsYXRmb3JtX2RldmljZV9hbGxvYyhzdWJkZXYtPm5hbWUsIHN1YmRldi0+aWQpOwotCXBkZXYtPmRldi5wYXJlbnQgPSBudmVjLT5kZXY7Ci0JcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBzdWJkZXYtPnBsYXRmb3JtX2RhdGE7Ci0KLQlyZXR1cm4gcGxhdGZvcm1fZGV2aWNlX2FkZChwZGV2KTsKLX0KLQotc3RhdGljIHZvaWQgdGVncmFfaW5pdF9pMmNfc2xhdmUoc3RydWN0IG52ZWNfcGxhdGZvcm1fZGF0YSAqcGRhdGEsIHVuc2lnbmVkIGNoYXIgKmkyY19yZWdzLAotCQkJCQlzdHJ1Y3QgY2xrICppMmNfY2xrKQorc3RhdGljIHZvaWQgdGVncmFfaW5pdF9pMmNfc2xhdmUoc3RydWN0IG52ZWNfY2hpcCAqbnZlYykKIHsKIAl1MzIgdmFsOwogCi0JY2xrX2VuYWJsZShpMmNfY2xrKTsKLQl0ZWdyYV9wZXJpcGhfcmVzZXRfYXNzZXJ0KGkyY19jbGspOworCWNsa19lbmFibGUobnZlYy0+aTJjX2Nsayk7CisKKwl0ZWdyYV9wZXJpcGhfcmVzZXRfYXNzZXJ0KG52ZWMtPmkyY19jbGspOwogCXVkZWxheSgyKTsKLQl0ZWdyYV9wZXJpcGhfcmVzZXRfZGVhc3NlcnQoaTJjX2Nsayk7CisJdGVncmFfcGVyaXBoX3Jlc2V0X2RlYXNzZXJ0KG52ZWMtPmkyY19jbGspOwogCi0Jd3JpdGVsKHBkYXRhLT5pMmNfYWRkcj4+MSwgaTJjX3JlZ3MgKyBJMkNfU0xfQUREUjEpOwotCXdyaXRlbCgwLCBpMmNfcmVncyArIEkyQ19TTF9BRERSMik7Ci0KLQl3cml0ZWwoMHgxRSwgaTJjX3JlZ3MgKyBJMkNfU0xfREVMQVlfQ09VTlQpOwogCXZhbCA9IEkyQ19DTkZHX05FV19NQVNURVJfU0ZNIHwgSTJDX0NORkdfUEFDS0VUX01PREVfRU4gfAotCQkoMHgyIDw8IEkyQ19DTkZHX0RFQk9VTkNFX0NOVF9TSElGVCk7Ci0Jd3JpdGVsKHZhbCwgaTJjX3JlZ3MgKyBJMkNfQ05GRyk7Ci0Jd3JpdGVsKEkyQ19TTF9ORVdMLCBpMmNfcmVncyArIEkyQ19TTF9DTkZHKTsKKwkgICAgKDB4MiA8PCBJMkNfQ05GR19ERUJPVU5DRV9DTlRfU0hJRlQpOworCXdyaXRlbCh2YWwsIG52ZWMtPmJhc2UgKyBJMkNfQ05GRyk7CiAKLQljbGtfZGlzYWJsZShpMmNfY2xrKTsKKwljbGtfc2V0X3JhdGUobnZlYy0+aTJjX2NsaywgOCAqIDgwMDAwKTsKKworCXdyaXRlbChJMkNfU0xfTkVXTCwgbnZlYy0+YmFzZSArIEkyQ19TTF9DTkZHKTsKKwl3cml0ZWwoMHgxRSwgbnZlYy0+YmFzZSArIEkyQ19TTF9ERUxBWV9DT1VOVCk7CisKKwl3cml0ZWwobnZlYy0+aTJjX2FkZHI+PjEsIG52ZWMtPmJhc2UgKyBJMkNfU0xfQUREUjEpOworCXdyaXRlbCgwLCBudmVjLT5iYXNlICsgSTJDX1NMX0FERFIyKTsKKworCWVuYWJsZV9pcnEobnZlYy0+aXJxKTsKKworCWNsa19kaXNhYmxlKG52ZWMtPmkyY19jbGspOworfQorCitzdGF0aWMgdm9pZCBudmVjX2Rpc2FibGVfaTJjX3NsYXZlKHN0cnVjdCBudmVjX2NoaXAgKm52ZWMpCit7CisJZGlzYWJsZV9pcnEobnZlYy0+aXJxKTsKKwl3cml0ZWwoSTJDX1NMX05FV0wgfCBJMkNfU0xfTkFDSywgbnZlYy0+YmFzZSArIEkyQ19TTF9DTkZHKTsKKwljbGtfZGlzYWJsZShudmVjLT5pMmNfY2xrKTsKIH0KIAogc3RhdGljIHZvaWQgbnZlY19wb3dlcl9vZmYodm9pZCkKQEAgLTI5OSw4NiArNzExLDk2IEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHRlZ3JhX252ZWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlpbnQgZXJyLCBpLCByZXQ7CisJaW50IGVyciwgcmV0OwogCXN0cnVjdCBjbGsgKmkyY19jbGs7CiAJc3RydWN0IG52ZWNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgbnZlY19jaGlwICpudmVjOwogCXN0cnVjdCBudmVjX21zZyAqbXNnOwotCXVuc2lnbmVkIGNoYXIgKmkyY19yZWdzOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCByZXNvdXJjZSAqaW9tZW07CisJdm9pZCBfX2lvbWVtICpiYXNlOwogCiAJbnZlYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBudmVjX2NoaXApLCBHRlBfS0VSTkVMKTsKLQlpZihudmVjID09IE5VTEwpIHsKKwlpZiAobnZlYyA9PSBOVUxMKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZXNlcnZlIG1lbW9yeVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBudmVjKTsKIAludmVjLT5kZXYgPSAmcGRldi0+ZGV2OwogCW52ZWMtPmdwaW8gPSBwZGF0YS0+Z3BpbzsKLQludmVjLT5pcnEgPSBwZGF0YS0+aXJxOworCW52ZWMtPmkyY19hZGRyID0gcGRhdGEtPmkyY19hZGRyOwogCi0vKgotCWkyY19jbGs9Y2xrX2dldF9zeXMoTlVMTCwgImkyYyIpOwotCWlmKElTX0VSUl9PUl9OVUxMKGkyY19jbGspKQotCQlwcmludGsoS0VSTl9FUlIiTm8gc3VjaCBjbG9jayB0ZWdyYS1pMmMuMlxuIik7Ci0JZWxzZQotCQljbGtfZW5hYmxlKGkyY19jbGspOwotKi8KLQlpMmNfcmVncyA9IGlvcmVtYXAocGRhdGEtPmJhc2UsIHBkYXRhLT5zaXplKTsKLQlpZighaTJjX3JlZ3MpIHsKLQkJZGV2X2VycihudmVjLT5kZXYsICJmYWlsZWQgdG8gaW9yZW1hcCByZWdpc3RlcnNcbiIpOwotCQlnb3RvIGZhaWxlZDsKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIG1lbSByZXNvdXJjZT9cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQludmVjLT5pMmNfcmVncyA9IGkyY19yZWdzOwotCi0JaTJjX2NsayA9IGNsa19nZXRfc3lzKHBkYXRhLT5jbG9jaywgTlVMTCk7Ci0JaWYoSVNfRVJSX09SX05VTEwoaTJjX2NsaykpIHsKLQkJZGV2X2VycihudmVjLT5kZXYsICJmYWlsZWQgdG8gZ2V0IGNsb2NrIHRlZ3JhLWkyYy4yXG4iKTsKLQkJZ290byBmYWlsZWQ7CisJaW9tZW0gPSByZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpLCBwZGV2LT5uYW1lKTsKKwlpZiAoIWlvbWVtKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkkyQyByZWdpb24gYWxyZWFkeSBjbGFpbWVkXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKLQl0ZWdyYV9pbml0X2kyY19zbGF2ZShwZGF0YSwgaTJjX3JlZ3MsIGkyY19jbGspOwotCi0JZXJyID0gcmVxdWVzdF9pcnEobnZlYy0+aXJxLCBpMmNfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELCAibnZlYyIsIG52ZWMpOwotCWlmKGVycikgewotCQlkZXZfZXJyKG52ZWMtPmRldiwgImNvdWxkbid0IHJlcXVlc3QgaXJxIik7Ci0JCWdvdG8gZmFpbGVkOworCWJhc2UgPSBpb3JlbWFwKGlvbWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShpb21lbSkpOworCWlmICghYmFzZSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBpb3JlbWFwIEkyQyByZWdpb25cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQljbGtfZW5hYmxlKGkyY19jbGspOwotCWNsa19zZXRfcmF0ZShpMmNfY2xrLCA4KjgwMDAwKTsKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIGlycSByZXNvdXJjZT9cbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9pb3VubWFwOworCX0KKworCWkyY19jbGsgPSBjbGtfZ2V0X3N5cygidGVncmEtaTJjLjIiLCBOVUxMKTsKKwlpZiAoSVNfRVJSKGkyY19jbGspKSB7CisJCWRldl9lcnIobnZlYy0+ZGV2LCAiZmFpbGVkIHRvIGdldCBjb250cm9sbGVyIGNsb2NrXG4iKTsKKwkJZ290byBlcnJfaW91bm1hcDsKKwl9CisKKwludmVjLT5iYXNlID0gYmFzZTsKKwludmVjLT5pcnEgPSByZXMtPnN0YXJ0OworCW52ZWMtPmkyY19jbGsgPSBpMmNfY2xrOworCW52ZWMtPnJ4ID0gJm52ZWMtPm1zZ19wb29sWzBdOwogCiAJLyogU2V0IHRoZSBncGlvIHRvIGxvdyB3aGVuIHdlJ3ZlIGdvdCBzb21ldGhpbmcgdG8gc2F5ICovCiAJZXJyID0gZ3Bpb19yZXF1ZXN0KG52ZWMtPmdwaW8sICJudmVjIGdwaW8iKTsKLQlpZihlcnIgPCAwKQorCWlmIChlcnIgPCAwKQogCQlkZXZfZXJyKG52ZWMtPmRldiwgImNvdWxkbid0IHJlcXVlc3QgZ3Bpb1xuIik7CiAKLQl0ZWdyYV9ncGlvX2VuYWJsZShudmVjLT5ncGlvKTsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQobnZlYy0+Z3BpbywgMSk7Ci0JZ3Bpb19zZXRfdmFsdWUobnZlYy0+Z3BpbywgMSk7Ci0KIAlBVE9NSUNfSU5JVF9OT1RJRklFUl9IRUFEKCZudmVjLT5ub3RpZmllcl9saXN0KTsKIAogCWluaXRfY29tcGxldGlvbigmbnZlYy0+c3luY193cml0ZSk7Ci0Jc2VtYV9pbml0KCZudmVjLT5zeW5jX3dyaXRlX211dGV4LCAxKTsKLQlJTklUX0xJU1RfSEVBRCgmbnZlYy0+dHhfZGF0YSk7CisJaW5pdF9jb21wbGV0aW9uKCZudmVjLT5lY190cmFuc2Zlcik7CisJbXV0ZXhfaW5pdCgmbnZlYy0+c3luY193cml0ZV9tdXRleCk7CisJc3Bpbl9sb2NrX2luaXQoJm52ZWMtPnR4X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZudmVjLT5yeF9sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmbnZlYy0+cnhfZGF0YSk7CisJSU5JVF9MSVNUX0hFQUQoJm52ZWMtPnR4X2RhdGEpOwogCUlOSVRfV09SSygmbnZlYy0+cnhfd29yaywgbnZlY19kaXNwYXRjaCk7CiAJSU5JVF9XT1JLKCZudmVjLT50eF93b3JrLCBudmVjX3JlcXVlc3RfbWFzdGVyKTsKKwludmVjLT53cSA9IGFsbG9jX3dvcmtxdWV1ZSgibnZlYyIsIFdRX05PTl9SRUVOVFJBTlQsIDIpOworCisJZXJyID0gcmVxdWVzdF9pcnEobnZlYy0+aXJxLCBudmVjX2ludGVycnVwdCwgMCwgIm52ZWMiLCBudmVjKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIobnZlYy0+ZGV2LCAiY291bGRuJ3QgcmVxdWVzdCBpcnFcbiIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJZGlzYWJsZV9pcnEobnZlYy0+aXJxKTsKKworCXRlZ3JhX2luaXRfaTJjX3NsYXZlKG52ZWMpOworCisJY2xrX2VuYWJsZShpMmNfY2xrKTsKKworCWdwaW9fZGlyZWN0aW9uX291dHB1dChudmVjLT5ncGlvLCAxKTsKKwlncGlvX3NldF92YWx1ZShudmVjLT5ncGlvLCAxKTsKIAogCS8qIGVuYWJsZSBldmVudCByZXBvcnRpbmcgKi8KIAludmVjX3dyaXRlX2FzeW5jKG52ZWMsIEVDX0VOQUJMRV9FVkVOVF9SRVBPUlRJTkcsCi0JCQkJc2l6ZW9mKEVDX0VOQUJMRV9FVkVOVF9SRVBPUlRJTkcpKTsKLQotCW52ZWNfa2JkX2luaXQobnZlYyk7Ci0jaWZkZWYgQ09ORklHX1NFUklPX05WRUNfUFMyCi0JbnZlY19wczIobnZlYyk7Ci0jZW5kaWYKLQotICAgICAgICAvKiBzZXR1cCBzdWJkZXZzICovCi0JZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fc3ViZGV2czsgaSsrKSB7Ci0JCXJldCA9IG52ZWNfYWRkX3N1YmRldihudmVjLCAmcGRhdGEtPnN1YmRldnNbaV0pOwotCX0KKwkJCSBzaXplb2YoRUNfRU5BQkxFX0VWRU5UX1JFUE9SVElORykpOwogCiAJbnZlYy0+bnZlY19zdGF0dXNfbm90aWZpZXIubm90aWZpZXJfY2FsbCA9IG52ZWNfc3RhdHVzX25vdGlmaWVyOwogCW52ZWNfcmVnaXN0ZXJfbm90aWZpZXIobnZlYywgJm52ZWMtPm52ZWNfc3RhdHVzX25vdGlmaWVyLCAwKTsKQEAgLTM5MCwxNCArODEyLDIwIEBACiAJbXNnID0gbnZlY193cml0ZV9zeW5jKG52ZWMsIEVDX0dFVF9GSVJNV0FSRV9WRVJTSU9OLAogCQlzaXplb2YoRUNfR0VUX0ZJUk1XQVJFX1ZFUlNJT04pKTsKIAotCWRldl93YXJuKG52ZWMtPmRldiwgImVjIGZpcm13YXJlIHZlcnNpb24gJTAyeC4lMDJ4LiUwMnggLyAlMDJ4XG4iLAorCWlmIChtc2cpIHsKKwkJZGV2X3dhcm4obnZlYy0+ZGV2LCAiZWMgZmlybXdhcmUgdmVyc2lvbiAlMDJ4LiUwMnguJTAyeCAvICUwMnhcbiIsCiAJCQltc2ctPmRhdGFbNF0sIG1zZy0+ZGF0YVs1XSwgbXNnLT5kYXRhWzZdLCBtc2ctPmRhdGFbN10pOwogCi0Ja2ZyZWUobXNnLT5kYXRhKTsKLQlrZnJlZShtc2cpOworCQludmVjX21zZ19mcmVlKG52ZWMsIG1zZyk7CisJfQorCisJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKG52ZWMtPmRldiwgLTEsIG52ZWNfZGV2aWNlcywKKwkJCSAgICAgIEFSUkFZX1NJWkUobnZlY19kZXZpY2VzKSwgYmFzZSwgMCk7CisJaWYgKHJldCkKKwkJZGV2X2VycihudmVjLT5kZXYsICJlcnJvciBhZGRpbmcgc3ViZGV2aWNlc1xuIik7CiAKIAkvKiB1bm11dGUgc3BlYWtlcnM/ICovCi0JbnZlY193cml0ZV9hc3luYyhudmVjLCAiXHgwZFx4MTBceDU5XHg5NCIsIDQpOworCW52ZWNfd3JpdGVfYXN5bmMobnZlYywgIlx4MGRceDEwXHg1OVx4OTUiLCA0KTsKIAogCS8qIGVuYWJsZSBsaWQgc3dpdGNoIGV2ZW50ICovCiAJbnZlY193cml0ZV9hc3luYyhudmVjLCAiXHgwMVx4MDFceDAxXHgwMFx4MDBceDAyXHgwMCIsIDcpOwpAQCAtNDA3LDYgKzgzNSw4IEBACiAKIAlyZXR1cm4gMDsKIAorZXJyX2lvdW5tYXA6CisJaW91bm1hcChiYXNlKTsKIGZhaWxlZDoKIAlrZnJlZShudmVjKTsKIAlyZXR1cm4gLUVOT01FTTsKQEAgLTQxNCw3ICs4NDQsMTYgQEAKIAogc3RhdGljIGludCBfX2RldmV4aXQgdGVncmFfbnZlY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQkvLyBUT0RPOiB1bnJlZ2lzdGVyCisJc3RydWN0IG52ZWNfY2hpcCAqbnZlYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJbnZlY193cml0ZV9hc3luYyhudmVjLCBFQ19ESVNBQkxFX0VWRU5UX1JFUE9SVElORywgMyk7CisJbWZkX3JlbW92ZV9kZXZpY2VzKG52ZWMtPmRldik7CisJZnJlZV9pcnEobnZlYy0+aXJxLCAmbnZlY19pbnRlcnJ1cHQpOworCWlvdW5tYXAobnZlYy0+YmFzZSk7CisJZ3Bpb19mcmVlKG52ZWMtPmdwaW8pOworCWRlc3Ryb3lfd29ya3F1ZXVlKG52ZWMtPndxKTsKKwlrZnJlZShudmVjKTsKKwogCXJldHVybiAwOwogfQogCkBAIC00MjMsMTkgKzg2MiwyNyBAQAogc3RhdGljIGludCB0ZWdyYV9udmVjX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQogewogCXN0cnVjdCBudmVjX2NoaXAgKm52ZWMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgbnZlY19tc2cgKm1zZzsKIAogCWRldl9kYmcobnZlYy0+ZGV2LCAic3VzcGVuZGluZ1xuIik7Ci0JbnZlY193cml0ZV9hc3luYyhudmVjLCBFQ19ESVNBQkxFX0VWRU5UX1JFUE9SVElORywgMyk7Ci0JbnZlY193cml0ZV9hc3luYyhudmVjLCAiXHgwNFx4MDIiLCAyKTsKKworCS8qIGtlZXAgdGhlc2Ugc3luYyBvciB5b3UnbGwgYnJlYWsgc3VzcGVuZCAqLworCW1zZyA9IG52ZWNfd3JpdGVfc3luYyhudmVjLCBFQ19ESVNBQkxFX0VWRU5UX1JFUE9SVElORywgMyk7CisJbnZlY19tc2dfZnJlZShudmVjLCBtc2cpOworCW1zZyA9IG52ZWNfd3JpdGVfc3luYyhudmVjLCAiXHgwNFx4MDIiLCAyKTsKKwludmVjX21zZ19mcmVlKG52ZWMsIG1zZyk7CisKKwludmVjX2Rpc2FibGVfaTJjX3NsYXZlKG52ZWMpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdGVncmFfbnZlY19yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikgewotCitzdGF0aWMgaW50IHRlZ3JhX252ZWNfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CiAJc3RydWN0IG52ZWNfY2hpcCAqbnZlYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJZGV2X2RiZyhudmVjLT5kZXYsICJyZXN1bWluZ1xuIik7CisJdGVncmFfaW5pdF9pMmNfc2xhdmUobnZlYyk7CiAJbnZlY193cml0ZV9hc3luYyhudmVjLCBFQ19FTkFCTEVfRVZFTlRfUkVQT1JUSU5HLCAzKTsKIAogCXJldHVybiAwOwpAQCAtNDQ2LDEzICs4OTMsMTIgQEAKICNkZWZpbmUgdGVncmFfbnZlY19yZXN1bWUgTlVMTAogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG52ZWNfZGV2aWNlX2RyaXZlciA9Ci17Ci0JLnByb2JlID0gdGVncmFfbnZlY19wcm9iZSwKLQkucmVtb3ZlID0gX19kZXZleGl0X3AodGVncmFfbnZlY19yZW1vdmUpLAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbnZlY19kZXZpY2VfZHJpdmVyID0geworCS5wcm9iZSAgID0gdGVncmFfbnZlY19wcm9iZSwKKwkucmVtb3ZlICA9IF9fZGV2ZXhpdF9wKHRlZ3JhX252ZWNfcmVtb3ZlKSwKIAkuc3VzcGVuZCA9IHRlZ3JhX252ZWNfc3VzcGVuZCwKLQkucmVzdW1lID0gdGVncmFfbnZlY19yZXN1bWUsCi0JLmRyaXZlciA9IHsKKwkucmVzdW1lICA9IHRlZ3JhX252ZWNfcmVzdW1lLAorCS5kcml2ZXIgID0gewogCQkubmFtZSA9ICJudmVjIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJfQpAQCAtNDY0LDQgKzkxMCw4IEBACiB9CiAKIG1vZHVsZV9pbml0KHRlZ3JhX252ZWNfaW5pdCk7CisKIE1PRFVMRV9BTElBUygicGxhdGZvcm06bnZlYyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOVklESUEgY29tcGxpYW50IGVtYmVkZGVkIGNvbnRyb2xsZXIgaW50ZXJmYWNlIik7CitNT0RVTEVfQVVUSE9SKCJNYXJjIERpZXRyaWNoIDxtYXJ2aW4yNEBnbXguZGU+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjLmggYi9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjLmgKaW5kZXggYTJkODJkYy4uYTRjMTdiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWMuaApAQCAtMSwxMTAgKzEsMjAzIEBACisvKgorICogTlZFQzogTlZJRElBIGNvbXBsaWFudCBlbWJlZGRlZCBjb250cm9sbGVyIGludGVyZmFjZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQUMxMDAgS2VybmVsIFRlYW0gPGFjMTAwQGxpc3RzLmxhdW5jaHBhZC5uZXQ+CisgKgorICogQXV0aG9yczogIFBpZXJyZS1IdWd1ZXMgSHVzc29uIDxwaGh1c3NvbkBmcmVlLmZyPgorICogICAgICAgICAgIElseWEgUGV0cm92IDxpbHlhLm11cm9tZWNAZ21haWwuY29tPgorICogICAgICAgICAgIE1hcmMgRGlldHJpY2ggPG1hcnZpbjI0QGdteC5kZT4KKyAqICAgICAgICAgICBKdWxpYW4gQW5kcmVzIEtsb2RlIDxqYWtAamFrLWxpbnV4Lm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKwogI2lmbmRlZiBfX0xJTlVYX01GRF9OVkVDCiAjZGVmaW5lIF9fTElOVVhfTUZEX05WRUMKIAotI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKLXR5cGVkZWYgZW51bSB7CisvKiBOVkVDX1BPT0xfU0laRSAtIFNpemUgb2YgdGhlIHBvb2wgaW4gJnN0cnVjdCBudmVjX21zZyAqLworI2RlZmluZSBOVkVDX1BPT0xfU0laRQk2NAorCisvKgorICogTlZFQ19NU0dfU0laRSAtIE1heGltdW0gc2l6ZSBvZiB0aGUgZGF0YSBmaWVsZCBvZiAmc3RydWN0IG52ZWNfbXNnLgorICoKKyAqIEEgbWVzc2FnZSBtdXN0IHN0b3JlIHVwIHRvIGEgU01CdXMgYmxvY2sgb3BlcmF0aW9uIHdoaWNoIGNvbnNpc3RzIG9mCisgKiBvbmUgY29tbWFuZCBieXRlLCBvbmUgY291bnQgYnl0ZSwgYW5kIHVwIHRvIDMyIHBheWxvYWQgYnl0ZXMgPSAzNAorICogYnl0ZS4KKyAqLworI2RlZmluZSBOVkVDX01TR19TSVpFCTM0CisKKy8qKgorICogZW51bSBudmVjX2V2ZW50X3NpemUgLSBUaGUgc2l6ZSBvZiBhbiBldmVudCBtZXNzYWdlCisgKiBATlZFQ18yQllURVM6IFRoZSBtZXNzYWdlIGhhcyBvbmUgY29tbWFuZCBieXRlIGFuZCBvbmUgZGF0YSBieXRlCisgKiBATlZFQ18zQllURVM6IFRoZSBtZXNzYWdlIGhhcyBvbmUgY29tbWFuZCBieXRlIGFuZCB0d28gZGF0YSBieXRlcworICogQE5WRUNfVkFSX1NJWkU6IFRoZSBtZXNzYWdlIGhhcyBvbmUgY29tbWFuZCBieXRlLCBvbmUgY291bnQgYnl0ZSwgYW5kIGFzCisgKiAgICAgICAgICAgICAgICAgdXAgdG8gYXMgbWFueSBieXRlcyBhcyB0aGUgbnVtYmVyIGluIHRoZSBjb3VudCBieXRlLiBUaGUKKyAqICAgICAgICAgICAgICAgICBtYXhpbXVtIGlzIDMyCisgKgorICogRXZlbnRzIGNhbiBiZSBmaXhlZCBvciB2YXJpYWJsZSBzaXplZC4gVGhpcyBpcyB1c2VsZXNzIG9uIG90aGVyIG1lc3NhZ2UKKyAqIHR5cGVzLCB3aGljaCBhcmUgYWx3YXlzIHZhcmlhYmxlIHNpemVkLgorICovCitlbnVtIG52ZWNfZXZlbnRfc2l6ZSB7CiAJTlZFQ18yQllURVMsCiAJTlZFQ18zQllURVMsCi0JTlZFQ19WQVJfU0laRQotfSBudmVjX3NpemU7CisJTlZFQ19WQVJfU0laRSwKK307CiAKLXR5cGVkZWYgZW51bSB7Ci0JTk9UX1JFQUxMWSwKLQlZRVMsCi0JTk9UX0FUX0FMTCwKLX0gaG93X2NhcmU7Ci0KLXR5cGVkZWYgZW51bSB7Ci0JTlZFQ19TWVM9MSwKKy8qKgorICogZW51bSBudmVjX21zZ190eXBlIC0gVGhlIHR5cGUgb2YgYSBtZXNzYWdlCisgKiBATlZFQ19TWVM6IEEgc3lzdGVtIHJlcXVlc3QvcmVzcG9uc2UKKyAqIEBOVkVDX0JBVDogQSBiYXR0ZXJ5IHJlcXVlc3QvcmVzcG9uc2UKKyAqIEBOVkVDX0tCRDogQSBrZXlib2FyZCByZXF1ZXN0L3Jlc3BvbnNlCisgKiBATlZFQ19QUzI6IEEgbW91c2UgcmVxdWVzdC9yZXNwb25zZQorICogQE5WRUNfQ05UTDogQSBFQyBjb250cm9sIHJlcXVlc3QvcmVzcG9uc2UKKyAqIEBOVkVDX0tCX0VWVDogQW4gZXZlbnQgZnJvbSB0aGUga2V5Ym9hcmQKKyAqIEBOVkVDX1BTMl9FVlQ6IEFuIGV2ZW50IGZyb20gdGhlIG1vdXNlCisgKgorICogRXZlbnRzIGNhbiBiZSBmaXhlZCBvciB2YXJpYWJsZSBzaXplZC4gVGhpcyBpcyB1c2VsZXNzIG9uIG90aGVyIG1lc3NhZ2UKKyAqIHR5cGVzLCB3aGljaCBhcmUgYWx3YXlzIHZhcmlhYmxlIHNpemVkLgorICovCitlbnVtIG52ZWNfbXNnX3R5cGUgeworCU5WRUNfU1lTID0gMSwKIAlOVkVDX0JBVCwKIAlOVkVDX0tCRCA9IDUsCiAJTlZFQ19QUzIsCiAJTlZFQ19DTlRMLAogCU5WRUNfS0JfRVZUID0gMHg4MCwKLQlOVkVDX1BTMl9FVlQKLX0gbnZlY19ldmVudDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgICAgICBOVkVDX1dBSVQsCi0gICAgICAgTlZFQ19SRUFELAotICAgICAgIE5WRUNfV1JJVEUKLX0gbnZlY19zdGF0ZTsKLQotc3RydWN0IG52ZWNfbXNnIHsKLQl1bnNpZ25lZCBjaGFyICpkYXRhOwotCXVuc2lnbmVkIHNob3J0IHNpemU7Ci0JdW5zaWduZWQgc2hvcnQgcG9zOwotCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwlOVkVDX1BTMl9FVlQsCiB9OwogCisvKioKKyAqIHN0cnVjdCBudmVjX21zZyAtIEEgYnVmZmVyIGZvciBhIHNpbmdsZSBtZXNzYWdlCisgKiBAbm9kZTogTWVzc2FnZXMgYXJlIHBhcnQgb2YgdmFyaW91cyBsaXN0cyBpbiBhICZzdHJ1Y3QgbnZlY19jaGlwCisgKiBAZGF0YTogVGhlIGRhdGEgb2YgdGhlIG1lc3NhZ2UKKyAqIEBzaXplOiBGb3IgVFggbWVzc2FnZXMsIHRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBpbiBAZGF0YQorICogQHBvczogIEZvciBSWCBtZXNzYWdlcywgdGhlIGN1cnJlbnQgcG9zaXRpb24gdG8gd3JpdGUgdG8uIEZvciBUWCBtZXNzYWdlcywKKyAqICAgICAgICB0aGUgcG9zaXRpb24gdG8gcmVhZCBmcm9tLgorICogQHVzZWQ6IFVzZWQgZm9yIHRoZSBtZXNzYWdlIHBvb2wgdG8gbWFyayBhIG1lc3NhZ2UgYXMgZnJlZS9hbGxvY2F0ZWQuCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBob2xkIG91dGdvaW5nIGFuZCBpbmNvbWluZyBtZXNzYWdlcy4gT3V0Z29pbmcKKyAqIG1lc3NhZ2VzIGhhdmUgYSBkaWZmZXJlbnQgZm9ybWF0IHRoYW4gaW5jb21pbmcgbWVzc2FnZXMsIGFuZCB0aGF0IGlzIG5vdAorICogZG9jdW1lbnRlZCB5ZXQuCisgKi8KK3N0cnVjdCBudmVjX21zZyB7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXVuc2lnbmVkIGNoYXIgZGF0YVtOVkVDX01TR19TSVpFXTsKKwl1bnNpZ25lZCBzaG9ydCBzaXplOworCXVuc2lnbmVkIHNob3J0IHBvczsKKwlhdG9taWNfdCB1c2VkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgbnZlY19zdWJkZXYgLSBBIHN1YmRldmljZSBvZiBudmVjLCBzdWNoIGFzIG52ZWNfa2JkCisgKiBAbmFtZTogVGhlIG5hbWUgb2YgdGhlIHN1YiBkZXZpY2UKKyAqIEBwbGF0Zm9ybV9kYXRhOiBQbGF0Zm9ybSBkYXRhCisgKiBAaWQ6IElkZW50aWZpZXIgb2YgdGhlIHN1YiBkZXZpY2UKKyAqLwogc3RydWN0IG52ZWNfc3ViZGV2IHsKIAljb25zdCBjaGFyICpuYW1lOwogCXZvaWQgKnBsYXRmb3JtX2RhdGE7CiAJaW50IGlkOwogfTsKIAorLyoqCisgKiBzdHJ1Y3QgbnZlY19wbGF0Zm9ybV9kYXRhIC0gcGxhdGZvcm0gZGF0YSBmb3IgYSB0ZWdyYSBzbGF2ZSBjb250cm9sbGVyCisgKiBAaTJjX2FkZHI6IG51bWJlciBvZiBpMmMgc2xhdmUgYWRhcHRlciB0aGUgZWMgaXMgY29ubmVjdGVkIHRvCisgKiBAZ3BpbzogZ3BpbyBudW1iZXIgZm9yIHRoZSBlYyByZXF1ZXN0IGxpbmUKKyAqCisgKiBQbGF0Zm9ybSBkYXRhLCB0byBiZSB1c2VkIGluIGJvYXJkIGRlZmluaXRpb25zLiBGb3IgYW4gZXhhbXBsZSwgdGFrZSBhCisgKiBsb29rIGF0IHRoZSBwYXowMCBib2FyZCBpbiBhcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLXBhejAwLmMKKyAqLwogc3RydWN0IG52ZWNfcGxhdGZvcm1fZGF0YSB7Ci0JaW50IG51bV9zdWJkZXZzOwogCWludCBpMmNfYWRkcjsKIAlpbnQgZ3BpbzsKLQlpbnQgaXJxOwotCWludCBiYXNlOwotCWludCBzaXplOwotCWNoYXIgY2xvY2tbMTZdOwotCXN0cnVjdCBudmVjX3N1YmRldiAqc3ViZGV2czsKIH07CiAKKy8qKgorICogc3RydWN0IG52ZWNfY2hpcCAtIEEgc2luZ2xlIGNvbm5lY3Rpb24gdG8gYW4gTlZJRElBIEVtYmVkZGVkIGNvbnRyb2xsZXIKKyAqIEBkZXY6IFRoZSBkZXZpY2UKKyAqIEBncGlvOiBUaGUgc2FtZSBhcyBmb3IgJnN0cnVjdCBudmVjX3BsYXRmb3JtX2RhdGEKKyAqIEBpcnE6IFRoZSBJUlEgb2YgdGhlIEkyQyBkZXZpY2UKKyAqIEBpMmNfYWRkcjogVGhlIGFkZHJlc3Mgb2YgdGhlIEkyQyBzbGF2ZQorICogQGJhc2U6IFRoZSBiYXNlIG9mIHRoZSBtZW1vcnkgbWFwcGVkIHJlZ2lvbiBvZiB0aGUgSTJDIGRldmljZQorICogQGNsazogVGhlIGNsb2NrIG9mIHRoZSBJMkMgZGV2aWNlCisgKiBAbm90aWZpZXJfbGlzdDogTm90aWZpZXJzIHRvIGJlIGNhbGxlZCBvbiByZWNlaXZlZCBtZXNzYWdlcywgc2VlCisgKiAgICAgICAgICAgICAgICAgbnZlY19yZWdpc3Rlcl9ub3RpZmllcigpCisgKiBAcnhfZGF0YTogUmVjZWl2ZWQgbWVzc2FnZXMgdGhhdCBoYXZlIHRvIGJlIHByb2Nlc3NlZAorICogQHR4X2RhdGE6IE1lc3NhZ2VzIHdhaXRpbmcgdG8gYmUgc2VudCB0byB0aGUgY29udHJvbGxlcgorICogQG52ZWNfc3RhdHVzX25vdGlmaWVyOiBJbnRlcm5hbCBub3RpZmllciAoc2VlIG52ZWNfc3RhdHVzX25vdGlmaWVyKCkpCisgKiBAcnhfd29yazogQSB3b3JrIHN0cnVjdHVyZSBmb3IgdGhlIFJYIHdvcmtlciBudmVjX2Rpc3BhdGNoKCkKKyAqIEB0eF93b3JrOiBBIHdvcmsgc3RydWN0dXJlIGZvciB0aGUgVFggd29ya2VyIG52ZWNfcmVxdWVzdF9tYXN0ZXIoKQorICogQHdxOiBUaGUgd29yayBxdWV1ZSBpbiB3aGljaCBAcnhfd29yayBhbmQgQHR4X3dvcmsgYXJlIGV4ZWN1dGVkCisgKiBAcng6IFRoZSBtZXNzYWdlIGN1cnJlbnRseSBiZWluZyByZXRyaWV2ZWQgb3IgJU5VTEwKKyAqIEBtc2dfcG9vbDogQSBwb29sIG9mIG1lc3NhZ2VzIGZvciBhbGxvY2F0aW9uCisgKiBAdHg6IFRoZSBtZXNzYWdlIGN1cnJlbnRseSBiZWluZyB0cmFuc2ZlcnJlZAorICogQHR4X3NjcmF0Y2g6IFVzZWQgZm9yIGJ1aWxkaW5nIHBzZXVkbyBtZXNzYWdlcworICogQGVjX3RyYW5zZmVyOiBBIGNvbXBsZXRpb24gdGhhdCB3aWxsIGJlIGNvbXBsZXRlZCBvbmNlIGEgbWVzc2FnZSBoYXMgYmVlbgorICogICAgICAgICAgICAgICByZWNlaXZlZCAoc2VlIG52ZWNfcnhfY29tcGxldGVkKCkpCisgKiBAdHhfbG9jazogU3BpbmxvY2sgZm9yIG1vZGlmaWNhdGlvbnMgb24gQHR4X2RhdGEKKyAqIEByeF9sb2NrOiBTcGlubG9jayBmb3IgbW9kaWZpY2F0aW9ucyBvbiBAcnhfZGF0YQorICogQHN5bmNfd3JpdGVfbXV0ZXg6IEEgbXV0ZXggZm9yIG52ZWNfd3JpdGVfc3luYygpCisgKiBAc3luY193cml0ZTogQSBjb21wbGV0aW9uIHRvIHNpZ25hbCB0aGF0IGEgc3luY2hyb25vdXMgbWVzc2FnZSBpcyBjb21wbGV0ZQorICogQHN5bmNfd3JpdGVfcGVuZGluZzogVGhlIGZpcnN0IHR3byBieXRlcyBvZiB0aGUgcmVxdWVzdCAodHlwZSBhbmQgc3VidHlwZSkKKyAqIEBsYXN0X3N5bmNfbXNnOiBUaGUgbGFzdCBzeW5jaHJvbm91cyBtZXNzYWdlLgorICogQHN0YXRlOiBTdGF0ZSBvZiBvdXIgZmluaXRlIHN0YXRlIG1hY2hpbmUgdXNlZCBpbiBudmVjX2ludGVycnVwdCgpCisgKi8KIHN0cnVjdCBudmVjX2NoaXAgewogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlpbnQgZ3BpbzsKIAlpbnQgaXJxOwotCXVuc2lnbmVkIGNoYXIgKmkyY19yZWdzOwotCW52ZWNfc3RhdGUgc3RhdGU7CisJaW50IGkyY19hZGRyOworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlzdHJ1Y3QgY2xrICppMmNfY2xrOwogCXN0cnVjdCBhdG9taWNfbm90aWZpZXJfaGVhZCBub3RpZmllcl9saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgcnhfZGF0YSwgdHhfZGF0YTsKIAlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbnZlY19zdGF0dXNfbm90aWZpZXI7CiAJc3RydWN0IHdvcmtfc3RydWN0IHJ4X3dvcmssIHR4X3dvcms7Ci0Jc3RydWN0IG52ZWNfbXNnICpyeCwgKnR4OworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cTsKKwlzdHJ1Y3QgbnZlY19tc2cgbXNnX3Bvb2xbTlZFQ19QT09MX1NJWkVdOworCXN0cnVjdCBudmVjX21zZyAqcng7CiAKLS8qIHN5bmMgd3JpdGUgc3R1ZmYgKi8KLQlzdHJ1Y3Qgc2VtYXBob3JlIHN5bmNfd3JpdGVfbXV0ZXg7CisJc3RydWN0IG52ZWNfbXNnICp0eDsKKwlzdHJ1Y3QgbnZlY19tc2cgdHhfc2NyYXRjaDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBlY190cmFuc2ZlcjsKKworCXNwaW5sb2NrX3QgdHhfbG9jaywgcnhfbG9jazsKKworCS8qIHN5bmMgd3JpdGUgc3R1ZmYgKi8KKwlzdHJ1Y3QgbXV0ZXggc3luY193cml0ZV9tdXRleDsKIAlzdHJ1Y3QgY29tcGxldGlvbiBzeW5jX3dyaXRlOwogCXUxNiBzeW5jX3dyaXRlX3BlbmRpbmc7CiAJc3RydWN0IG52ZWNfbXNnICpsYXN0X3N5bmNfbXNnOworCisJaW50IHN0YXRlOwogfTsKIAotZXh0ZXJuIHZvaWQgbnZlY193cml0ZV9hc3luYyhzdHJ1Y3QgbnZlY19jaGlwICpudmVjLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBzaG9ydCBzaXplKTsKK2V4dGVybiBpbnQgbnZlY193cml0ZV9hc3luYyhzdHJ1Y3QgbnZlY19jaGlwICpudmVjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJICAgICBzaG9ydCBzaXplKTsKKworZXh0ZXJuIHN0cnVjdCBudmVjX21zZyAqbnZlY193cml0ZV9zeW5jKHN0cnVjdCBudmVjX2NoaXAgKm52ZWMsCisJCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHNob3J0IHNpemUpOwogCiBleHRlcm4gaW50IG52ZWNfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG52ZWNfY2hpcCAqbnZlYywKLQkJIHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGludCBldmVudHMpOworCQkJCSAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkgIHVuc2lnbmVkIGludCBldmVudHMpOwogCiBleHRlcm4gaW50IG52ZWNfdW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGludCBldmVudHMpOworCQkJCSAgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgZXZlbnRzKTsKIAotY29uc3QgY2hhciAqbnZlY19zZW5kX21zZyh1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdF9zaXplLCBob3dfY2FyZSBjYXJlX3Jlc3AsIHZvaWQgKCpydF9oYW5kbGVyKSh1bnNpZ25lZCBjaGFyICpkYXRhKSk7Ci0KLWV4dGVybiBpbnQgbnZlY19wczIoc3RydWN0IG52ZWNfY2hpcCAqbnZlYyk7Ci1leHRlcm4gaW50IG52ZWNfa2JkX2luaXQoc3RydWN0IG52ZWNfY2hpcCAqbnZlYyk7Ci0KLSNkZWZpbmUgSTJDX0NORkcJCQkweDAwCi0jZGVmaW5lIEkyQ19DTkZHX1BBQ0tFVF9NT0RFX0VOCQkoMTw8MTApCi0jZGVmaW5lIEkyQ19DTkZHX05FV19NQVNURVJfU0ZNCQkoMTw8MTEpCi0jZGVmaW5lIEkyQ19DTkZHX0RFQk9VTkNFX0NOVF9TSElGVAkxMgotCi0jZGVmaW5lIEkyQ19TTF9DTkZHCQkweDIwCi0jZGVmaW5lIEkyQ19TTF9ORVdMCQkoMTw8MikKLSNkZWZpbmUgSTJDX1NMX05BQ0sJCSgxPDwxKQotI2RlZmluZSBJMkNfU0xfUkVTUAkJKDE8PDApCi0jZGVmaW5lIEkyQ19TTF9JUlEJCSgxPDwzKQotI2RlZmluZSBFTkRfVFJBTlMJCSgxPDw0KQotI2RlZmluZSBSQ1ZECQkJKDE8PDIpCi0jZGVmaW5lIFJOVwkJCSgxPDwxKQotCi0jZGVmaW5lIEkyQ19TTF9SQ1ZECQkweDI0Ci0jZGVmaW5lIEkyQ19TTF9TVEFUVVMJCTB4MjgKLSNkZWZpbmUgSTJDX1NMX0FERFIxCQkweDJjCi0jZGVmaW5lIEkyQ19TTF9BRERSMgkJMHgzMAotI2RlZmluZSBJMkNfU0xfREVMQVlfQ09VTlQJMHgzYworZXh0ZXJuIHZvaWQgbnZlY19tc2dfZnJlZShzdHJ1Y3QgbnZlY19jaGlwICpudmVjLCBzdHJ1Y3QgbnZlY19tc2cgKm1zZyk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlY19rYmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWNfa2JkLmMKaW5kZXggOWE5ODUwNy4uYTRjZTVhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlY19rYmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjX2tiZC5jCkBAIC0xLDQyICsxLDc2IEBACisvKgorICogbnZlY19rYmQ6IGtleWJvYXJkIGRyaXZlciBmb3IgYSBOVklESUEgY29tcGxpYW50IGVtYmVkZGVkIGNvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFDMTAwIEtlcm5lbCBUZWFtIDxhYzEwMEBsaXN0cy5sYXVuY2hwYWQubmV0PgorICoKKyAqIEF1dGhvcnM6ICBQaWVycmUtSHVndWVzIEh1c3NvbiA8cGhodXNzb25AZnJlZS5mcj4KKyAqICAgICAgICAgICBNYXJjIERpZXRyaWNoIDxtYXJ2aW4yNEBnbXguZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCiAjaW5jbHVkZSAibnZlYy1rZXl0YWJsZS5oIgogI2luY2x1ZGUgIm52ZWMuaCIKIAotI2RlZmluZSBBQ0tfS0JEX0VWRU5UIHsnXHgwNScsJ1x4ZWQnLCdceDAxJ30KKyNkZWZpbmUgQUNLX0tCRF9FVkVOVCB7J1x4MDUnLCAnXHhlZCcsICdceDAxJ30KIAorc3RhdGljIGNvbnN0IGNoYXIgbGVkX29uWzNdID0gIlx4MDVceGVkXHgwNyI7CitzdGF0aWMgY29uc3QgY2hhciBsZWRfb2ZmWzNdID0gIlx4MDVceGVkXHgwMCI7CiBzdGF0aWMgdW5zaWduZWQgY2hhciBrZXljb2Rlc1tBUlJBWV9TSVpFKGNvZGVfdGFiXzEwMnVzKQotCQkJKyBBUlJBWV9TSVpFKGV4dGNvZGVfdGFiX3VzMTAyKV07CisJCQkgICAgICArIEFSUkFZX1NJWkUoZXh0Y29kZV90YWJfdXMxMDIpXTsKIAogc3RydWN0IG52ZWNfa2V5cyB7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG5vdGlmaWVyOwogCXN0cnVjdCBudmVjX2NoaXAgKm52ZWM7CisJYm9vbCBjYXBzX2xvY2s7CiB9OwogCiBzdGF0aWMgc3RydWN0IG52ZWNfa2V5cyBrZXlzX2RldjsKIAorc3RhdGljIHZvaWQgbnZlY19rYmRfdG9nZ2xlX2xlZCh2b2lkKQoreworCWtleXNfZGV2LmNhcHNfbG9jayA9ICFrZXlzX2Rldi5jYXBzX2xvY2s7CisKKwlpZiAoa2V5c19kZXYuY2Fwc19sb2NrKQorCQludmVjX3dyaXRlX2FzeW5jKGtleXNfZGV2Lm52ZWMsIGxlZF9vbiwgc2l6ZW9mKGxlZF9vbikpOworCWVsc2UKKwkJbnZlY193cml0ZV9hc3luYyhrZXlzX2Rldi5udmVjLCBsZWRfb2ZmLCBzaXplb2YobGVkX29mZikpOworfQorCiBzdGF0aWMgaW50IG52ZWNfa2V5c19ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAotCQkJCXVuc2lnbmVkIGxvbmcgZXZlbnRfdHlwZSwgdm9pZCAqZGF0YSkKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZXZlbnRfdHlwZSwgdm9pZCAqZGF0YSkKIHsKIAlpbnQgY29kZSwgc3RhdGU7CiAJdW5zaWduZWQgY2hhciAqbXNnID0gKHVuc2lnbmVkIGNoYXIgKilkYXRhOwogCiAJaWYgKGV2ZW50X3R5cGUgPT0gTlZFQ19LQl9FVlQpIHsKLQkJbnZlY19zaXplIF9zaXplID0gKG1zZ1swXSAmICgzIDw8IDUpKSA+PiA1OworCQlpbnQgX3NpemUgPSAobXNnWzBdICYgKDMgPDwgNSkpID4+IDU7CiAKIC8qIHBvd2VyIG9uL29mZiBidXR0b24gKi8KLQkJaWYoX3NpemUgPT0gTlZFQ19WQVJfU0laRSkKKwkJaWYgKF9zaXplID09IE5WRUNfVkFSX1NJWkUpCiAJCQlyZXR1cm4gTk9USUZZX1NUT1A7CiAKLQkJaWYoX3NpemUgPT0gTlZFQ18zQllURVMpCisJCWlmIChfc2l6ZSA9PSBOVkVDXzNCWVRFUykKIAkJCW1zZysrOwogCiAJCWNvZGUgPSBtc2dbMV0gJiAweDdmOwogCQlzdGF0ZSA9IG1zZ1sxXSAmIDB4ODA7CiAKLQkJaW5wdXRfcmVwb3J0X2tleShrZXlzX2Rldi5pbnB1dCwgY29kZV90YWJzW19zaXplXVtjb2RlXSwgIXN0YXRlKTsKKwkJaWYgKGNvZGVfdGFic1tfc2l6ZV1bY29kZV0gPT0gS0VZX0NBUFNMT0NLICYmIHN0YXRlKQorCQkJbnZlY19rYmRfdG9nZ2xlX2xlZCgpOworCisJCWlucHV0X3JlcG9ydF9rZXkoa2V5c19kZXYuaW5wdXQsIGNvZGVfdGFic1tfc2l6ZV1bY29kZV0sCisJCQkJICFzdGF0ZSk7CiAJCWlucHV0X3N5bmMoa2V5c19kZXYuaW5wdXQpOwogCiAJCXJldHVybiBOT1RJRllfU1RPUDsKQEAgLTQ2LDE4ICs4MCwxOCBAQAogfQogCiBzdGF0aWMgaW50IG52ZWNfa2JkX2V2ZW50KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdW5zaWduZWQgaW50IHR5cGUsCi0JCQkJdW5zaWduZWQgaW50IGNvZGUsIGludCB2YWx1ZSkKKwkJCSAgdW5zaWduZWQgaW50IGNvZGUsIGludCB2YWx1ZSkKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZltdID0gQUNLX0tCRF9FVkVOVDsKIAlzdHJ1Y3QgbnZlY19jaGlwICpudmVjID0ga2V5c19kZXYubnZlYzsKIAotCWlmKHR5cGU9PUVWX1JFUCkKKwlpZiAodHlwZSA9PSBFVl9SRVApCiAJCXJldHVybiAwOwogCi0JaWYodHlwZSE9RVZfTEVEKQorCWlmICh0eXBlICE9IEVWX0xFRCkKIAkJcmV0dXJuIC0xOwogCi0JaWYoY29kZSE9TEVEX0NBUFNMKQorCWlmIChjb2RlICE9IExFRF9DQVBTTCkKIAkJcmV0dXJuIC0xOwogCiAJYnVmWzJdID0gISF2YWx1ZTsKQEAgLTY2LDIyICsxMDAsMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IF9faW5pdCBudmVjX2tiZF9pbml0KHN0cnVjdCBudmVjX2NoaXAgKm52ZWMpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBudmVjX2tiZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCBudmVjX2NoaXAgKm52ZWMgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CiAJaW50IGksIGosIGVycjsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2OwogCiAJaiA9IDA7CiAKLQlmb3IoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvZGVfdGFiXzEwMnVzKTsgKytpKQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvZGVfdGFiXzEwMnVzKTsgKytpKQogCQlrZXljb2Rlc1tqKytdID0gY29kZV90YWJfMTAydXNbaV07CiAKLQlmb3IoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGV4dGNvZGVfdGFiX3VzMTAyKTsgKytpKQotCQlrZXljb2Rlc1tqKytdPWV4dGNvZGVfdGFiX3VzMTAyW2ldOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGV4dGNvZGVfdGFiX3VzMTAyKTsgKytpKQorCQlrZXljb2Rlc1tqKytdID0gZXh0Y29kZV90YWJfdXMxMDJbaV07CiAKIAlpZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7Ci0JaWRldi0+bmFtZSA9ICJUZWdyYSBudmVjIGtleWJvYXJkIjsKLQlpZGV2LT5waHlzID0gImkyYzNfc2xhdmUvbnZlYyI7CisJaWRldi0+bmFtZSA9ICJudmVjIGtleWJvYXJkIjsKKwlpZGV2LT5waHlzID0gIm52ZWMiOwogCWlkZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX1JFUCkgfCBCSVRfTUFTSyhFVl9MRUQpOwogCWlkZXYtPmxlZGJpdFswXSA9IEJJVF9NQVNLKExFRF9DQVBTTCk7CiAJaWRldi0+ZXZlbnQgPSBudmVjX2tiZF9ldmVudDsKQEAgLTg5LDEyICsxMjQsMTIgQEAKIAlpZGV2LT5rZXljb2Rlc2l6ZSA9IHNpemVvZih1bnNpZ25lZCBjaGFyKTsKIAlpZGV2LT5rZXljb2RlbWF4ID0gQVJSQVlfU0laRShrZXljb2Rlcyk7CiAKLQlmb3IoIGkgPSAwOyBpIDwgQVJSQVlfU0laRShrZXljb2Rlcyk7ICsraSkKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShrZXljb2Rlcyk7ICsraSkKIAkJc2V0X2JpdChrZXljb2Rlc1tpXSwgaWRldi0+a2V5Yml0KTsKIAogCWNsZWFyX2JpdCgwLCBpZGV2LT5rZXliaXQpOwogCWVyciA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpZGV2KTsKLQlpZihlcnIpCisJaWYgKGVycikKIAkJZ290byBmYWlsOwogCiAJa2V5c19kZXYuaW5wdXQgPSBpZGV2OwpAQCAtMTE0LDkgKzE0OSwzMSBAQAogCW9yIHVudGlsIHdlIGhhdmUgYSBzeW5jIHdyaXRlICovCiAJbWRlbGF5KDEwMDApOwogCisJLyogRGlzYWJsZSBjYXBzIGxvY2sgTEVEICovCisJbnZlY193cml0ZV9hc3luYyhudmVjLCBsZWRfb2ZmLCBzaXplb2YobGVkX29mZikpOworCiAJcmV0dXJuIDA7CiAKIGZhaWw6CiAJaW5wdXRfZnJlZV9kZXZpY2UoaWRldik7CiAJcmV0dXJuIGVycjsKIH0KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbnZlY19rYmRfZHJpdmVyID0geworCS5wcm9iZSAgPSBudmVjX2tiZF9wcm9iZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJudmVjLWtiZCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBudmVjX2tiZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbnZlY19rYmRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobnZlY19rYmRfaW5pdCk7CisKK01PRFVMRV9BVVRIT1IoIk1hcmMgRGlldHJpY2ggPG1hcnZpbjI0QGdteC5kZT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTlZFQyBrZXlib2FyZCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWNfbGVkcy5jIGIvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlY19sZWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjYmNkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWNfbGVkcy5jCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogbnZlY19sZWRzOiBMRUQgZHJpdmVyIGZvciBhIE5WSURJQSBjb21wbGlhbnQgZW1iZWRkZWQgY29udHJvbGxlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQUMxMDAgS2VybmVsIFRlYW0gPGFjMTAwQGxpc3RzLmxhdW5jaHBhZC5uZXQ+CisgKgorICogQXV0aG9yczogIElseWEgUGV0cm92IDxpbHlhLm11cm9tZWNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlICJudmVjLmgiCisKKyNkZWZpbmUgdG9fbnZlY19sZWQobGVkX2NkZXYpIFwKKwljb250YWluZXJfb2YobGVkX2NkZXYsIHN0cnVjdCBudmVjX2xlZCwgY2RldikKKworI2RlZmluZSBOVkVDX0xFRF9SRVEgeydceDBkJywgJ1x4MTAnLCAnXHg0NScsICdceDEwJywgJ1x4MDAnfQorCisjZGVmaW5lIE5WRUNfTEVEX01BWCA4CisKK3N0cnVjdCBudmVjX2xlZCB7CisJc3RydWN0IGxlZF9jbGFzc2RldiBjZGV2OworCXN0cnVjdCBudmVjX2NoaXAgKm52ZWM7Cit9OworCitzdGF0aWMgdm9pZCBudmVjX2xlZF9icmlnaHRuZXNzX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKKwkJCQkgICAgZW51bSBsZWRfYnJpZ2h0bmVzcyB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbnZlY19sZWQgKmxlZCA9IHRvX252ZWNfbGVkKGxlZF9jZGV2KTsKKwl1bnNpZ25lZCBjaGFyIGJ1ZltdID0gTlZFQ19MRURfUkVROworCWJ1Zls0XSA9IHZhbHVlOworCisJbnZlY193cml0ZV9hc3luYyhsZWQtPm52ZWMsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCisJbGVkLT5jZGV2LmJyaWdodG5lc3MgPSB2YWx1ZTsKKworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBudmVjX2xlZF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBudmVjX2NoaXAgKm52ZWMgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IG52ZWNfbGVkICpsZWQ7CisJaW50IHJldCA9IDA7CisKKwlsZWQgPSBremFsbG9jKHNpemVvZigqbGVkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGxlZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxlZC0+Y2Rldi5tYXhfYnJpZ2h0bmVzcyA9IE5WRUNfTEVEX01BWDsKKworCWxlZC0+Y2Rldi5icmlnaHRuZXNzX3NldCA9IG52ZWNfbGVkX2JyaWdodG5lc3Nfc2V0OworCWxlZC0+Y2Rldi5uYW1lID0gIm52ZWMtbGVkIjsKKwlsZWQtPmNkZXYuZmxhZ3MgfD0gTEVEX0NPUkVfU1VTUEVORFJFU1VNRTsKKwlsZWQtPm52ZWMgPSBudmVjOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbGVkKTsKKworCXJldCA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmcGRldi0+ZGV2LCAmbGVkLT5jZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfbGVkOworCisJLyogdG8gZXhwb3NlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHVzZXJzcGFjZSAqLworCWxlZC0+Y2Rldi5icmlnaHRuZXNzID0gMDsKKworCXJldHVybiAwOworCitlcnJfbGVkOgorCWtmcmVlKGxlZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbnZlY19sZWRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG52ZWNfbGVkICpsZWQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZsZWQtPmNkZXYpOworCWtmcmVlKGxlZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG52ZWNfbGVkX2RyaXZlciA9IHsKKwkucHJvYmUgID0gbnZlY19sZWRfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKG52ZWNfbGVkX3JlbW92ZSksCisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgID0gIm52ZWMtbGVkcyIsCisJCSAgIC5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBudmVjX2xlZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbnZlY19sZWRfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobnZlY19sZWRfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBudmVjX2xlZF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm52ZWNfbGVkX2RyaXZlcik7Cit9CisKK21vZHVsZV9leGl0KG52ZWNfbGVkX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJJbHlhIFBldHJvdiA8aWx5YS5tdXJvbWVjQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVGVncmEgTlZFQyBMRUQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOm52ZWMtbGVkcyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlY19wb3dlci5jIGIvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlY19wb3dlci5jCmluZGV4IGRmMTY0YWQuLmRmYTk2NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWNfcG93ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjX3Bvd2VyLmMKQEAgLTEsMyArMSwxNyBAQAorLyoKKyAqIG52ZWNfcG93ZXI6IHBvd2VyIHN1cHBseSBkcml2ZXIgZm9yIGEgTlZJRElBIGNvbXBsaWFudCBlbWJlZGRlZCBjb250cm9sbGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBQzEwMCBLZXJuZWwgVGVhbSA8YWMxMDBAbGlzdHMubGF1bmNocGFkLm5ldD4KKyAqCisgKiBBdXRob3JzOiAgSWx5YSBQZXRyb3YgPGlseWEubXVyb21lY0BnbWFpbC5jb20+CisgKiAgICAgICAgICAgTWFyYyBEaWV0cmljaCA8bWFydmluMjRAZ214LmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CkBAIC01LDEwICsxOSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCiAjaW5jbHVkZSAibnZlYy5oIgogCi1zdHJ1Y3QgbnZlY19wb3dlcgoteworc3RydWN0IG52ZWNfcG93ZXIgewogCXN0cnVjdCBub3RpZmllcl9ibG9jayBub3RpZmllcjsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHBvbGxlcjsKIAlzdHJ1Y3QgbnZlY19jaGlwICpudmVjOwpAQCAtNTgsNyArNzIsOCBAQAogCXU4IGxlbmd0aDsKIAl1OCBzdWJfdHlwZTsKIAl1OCBzdGF0dXM7Ci0JdW5pb24geyAvKiBwYXlsb2FkICovCisJLyogcGF5bG9hZCAqLworCXVuaW9uIHsKIAkJY2hhciBwbGNbMzBdOwogCQl1MTYgcGx1OwogCQlzMTYgcGxzOwpAQCAtNjksMTggKzg0LDE3IEBACiBzdGF0aWMgc3RydWN0IHBvd2VyX3N1cHBseSBudmVjX3BzeTsKIAogc3RhdGljIGludCBudmVjX3Bvd2VyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCi0JCQkJIHVuc2lnbmVkIGxvbmcgZXZlbnRfdHlwZSwgdm9pZCAqZGF0YSkKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGV2ZW50X3R5cGUsIHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IG52ZWNfcG93ZXIgKnBvd2VyID0gY29udGFpbmVyX29mKG5iLCBzdHJ1Y3QgbnZlY19wb3dlciwgbm90aWZpZXIpOworCXN0cnVjdCBudmVjX3Bvd2VyICpwb3dlciA9CisJICAgIGNvbnRhaW5lcl9vZihuYiwgc3RydWN0IG52ZWNfcG93ZXIsIG5vdGlmaWVyKTsKIAlzdHJ1Y3QgYmF0X3Jlc3BvbnNlICpyZXMgPSAoc3RydWN0IGJhdF9yZXNwb25zZSAqKWRhdGE7CiAKIAlpZiAoZXZlbnRfdHlwZSAhPSBOVkVDX1NZUykKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCi0JaWYocmVzLT5zdWJfdHlwZSA9PSAwKQotCXsKLQkJaWYgKHBvd2VyLT5vbiAhPSByZXMtPnBsdSkKLQkJeworCWlmIChyZXMtPnN1Yl90eXBlID09IDApIHsKKwkJaWYgKHBvd2VyLT5vbiAhPSByZXMtPnBsdSkgewogCQkJcG93ZXItPm9uID0gcmVzLT5wbHU7CiAJCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmbnZlY19wc3kpOwogCQl9CkBAIC04OSw4ICsxMDMsNyBAQAogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKLXN0YXRpYyBjb25zdCBpbnQgYmF0X2luaXRbXSA9Ci17CitzdGF0aWMgY29uc3QgaW50IGJhdF9pbml0W10gPSB7CiAJTEFTVF9GVUxMX0NIQVJHRV9DQVBBQ0lUWSwgREVTSUdOX0NBUEFDSVRZLCBDUklUSUNBTF9DQVBBQ0lUWSwKIAlNQU5VRkFDVFVSRVIsIE1PREVMLCBUWVBFLAogfTsKQEAgLTEwMCwxMTYgKzExMywxMTUgQEAKIAlpbnQgaTsKIAljaGFyIGJ1ZltdID0geyAnXHgwMicsICdceDAwJyB9OwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYmF0X2luaXQpOyBpKyspCi0JeworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJhdF9pbml0KTsgaSsrKSB7CiAJCWJ1ZlsxXSA9IGJhdF9pbml0W2ldOwogCQludmVjX3dyaXRlX2FzeW5jKHBvd2VyLT5udmVjLCBidWYsIDIpOwogCX0KIH0KIAogc3RhdGljIGludCBudmVjX3Bvd2VyX2JhdF9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAotCQkJCSB1bnNpZ25lZCBsb25nIGV2ZW50X3R5cGUsIHZvaWQgKmRhdGEpCisJCQkJICAgdW5zaWduZWQgbG9uZyBldmVudF90eXBlLCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBudmVjX3Bvd2VyICpwb3dlciA9IGNvbnRhaW5lcl9vZihuYiwgc3RydWN0IG52ZWNfcG93ZXIsIG5vdGlmaWVyKTsKKwlzdHJ1Y3QgbnZlY19wb3dlciAqcG93ZXIgPQorCSAgICBjb250YWluZXJfb2YobmIsIHN0cnVjdCBudmVjX3Bvd2VyLCBub3RpZmllcik7CiAJc3RydWN0IGJhdF9yZXNwb25zZSAqcmVzID0gKHN0cnVjdCBiYXRfcmVzcG9uc2UgKilkYXRhOwogCWludCBzdGF0dXNfY2hhbmdlZCA9IDA7CiAKIAlpZiAoZXZlbnRfdHlwZSAhPSBOVkVDX0JBVCkKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCi0Jc3dpdGNoKHJlcy0+c3ViX3R5cGUpCi0JewotCQljYXNlIFNMT1RfU1RBVFVTOgotCQkJaWYgKHJlcy0+cGxjWzBdICYgMSkKLQkJCXsKLQkJCQlpZiAocG93ZXItPmJhdF9wcmVzZW50ID09IDApCi0JCQkJewotCQkJCQlzdGF0dXNfY2hhbmdlZCA9IDE7Ci0JCQkJCWdldF9iYXRfbWZnX2RhdGEocG93ZXIpOwotCQkJCX0KKwlzd2l0Y2ggKHJlcy0+c3ViX3R5cGUpIHsKKwljYXNlIFNMT1RfU1RBVFVTOgorCQlpZiAocmVzLT5wbGNbMF0gJiAxKSB7CisJCQlpZiAocG93ZXItPmJhdF9wcmVzZW50ID09IDApIHsKKwkJCQlzdGF0dXNfY2hhbmdlZCA9IDE7CisJCQkJZ2V0X2JhdF9tZmdfZGF0YShwb3dlcik7CisJCQl9CiAKLQkJCQlwb3dlci0+YmF0X3ByZXNlbnQgPSAxOworCQkJcG93ZXItPmJhdF9wcmVzZW50ID0gMTsKIAotCQkJCXN3aXRjaCAoKHJlcy0+cGxjWzBdID4+IDEpICYgMykKLQkJCQl7Ci0JCQkJCWNhc2UgMDoKLQkJCQkJCXBvd2VyLT5iYXRfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAxOgotCQkJCQkJcG93ZXItPmJhdF9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgMjoKLQkJCQkJCXBvd2VyLT5iYXRfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJcG93ZXItPmJhdF9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAocG93ZXItPmJhdF9wcmVzZW50ID09IDEpCi0JCQkJCXN0YXR1c19jaGFuZ2VkID0gMTsKLQotCQkJCXBvd2VyLT5iYXRfcHJlc2VudCA9IDA7CisJCQlzd2l0Y2ggKChyZXMtPnBsY1swXSA+PiAxKSAmIDMpIHsKKwkJCWNhc2UgMDoKKwkJCQlwb3dlci0+YmF0X3N0YXR1cyA9CisJCQkJICAgIFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCXBvd2VyLT5iYXRfc3RhdHVzID0KKwkJCQkgICAgUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlwb3dlci0+YmF0X3N0YXR1cyA9CisJCQkJICAgIFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgogCQkJCXBvd2VyLT5iYXRfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOwogCQkJfQotCQkJcG93ZXItPmJhdF9jYXAgPSByZXMtPnBsY1sxXTsKLQkJCWlmIChzdGF0dXNfY2hhbmdlZCkKLQkJCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmbnZlY19iYXRfcHN5KTsKLQkJCWJyZWFrOwotCQljYXNlIFZPTFRBR0U6Ci0JCQlwb3dlci0+YmF0X3ZvbHRhZ2Vfbm93ID0gcmVzLT5wbHUgKiAxMDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgVElNRV9SRU1BSU5JTkc6Ci0JCQlwb3dlci0+dGltZV9yZW1haW4gPSByZXMtPnBsdSAqIDM2MDA7Ci0JCQlicmVhazsKLQkJY2FzZSBDVVJSRU5UOgotCQkJcG93ZXItPmJhdF9jdXJyZW50X25vdyA9IHJlcy0+cGxzICogMTAwMDsKLQkJCWJyZWFrOwotCQljYXNlIEFWRVJBR0VfQ1VSUkVOVDoKLQkJCXBvd2VyLT5iYXRfY3VycmVudF9hdmcgPSByZXMtPnBscyAqIDEwMDA7Ci0JCQlicmVhazsKLQkJY2FzZSBDQVBBQ0lUWV9SRU1BSU5JTkc6Ci0JCQlwb3dlci0+Y2FwYWNpdHlfcmVtYWluID0gcmVzLT5wbHUgKiAxMDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgTEFTVF9GVUxMX0NIQVJHRV9DQVBBQ0lUWToKLQkJCXBvd2VyLT5jaGFyZ2VfbGFzdF9mdWxsID0gcmVzLT5wbHUgKiAxMDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgREVTSUdOX0NBUEFDSVRZOgotCQkJcG93ZXItPmNoYXJnZV9mdWxsX2Rlc2lnbiA9IHJlcy0+cGx1ICogMTAwMDsKLQkJCWJyZWFrOwotCQljYXNlIENSSVRJQ0FMX0NBUEFDSVRZOgotCQkJcG93ZXItPmNyaXRpY2FsX2NhcGFjaXR5ID0gcmVzLT5wbHUgKiAxMDAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgVEVNUEVSQVRVUkU6Ci0JCQlwb3dlci0+YmF0X3RlbXBlcmF0dXJlID0gcmVzLT5wbHUgLSAyNzMyOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUFOVUZBQ1RVUkVSOgotCQkJbWVtY3B5KHBvd2VyLT5iYXRfbWFudSwgJnJlcy0+cGxjLCByZXMtPmxlbmd0aC0yKTsKLQkJCXBvd2VyLT5iYXRfbW9kZWxbcmVzLT5sZW5ndGgtMl0gPSAnXDAnOwotCQkJYnJlYWs7Ci0JCWNhc2UgTU9ERUw6Ci0JCQltZW1jcHkocG93ZXItPmJhdF9tb2RlbCwgJnJlcy0+cGxjLCByZXMtPmxlbmd0aC0yKTsKLQkJCXBvd2VyLT5iYXRfbW9kZWxbcmVzLT5sZW5ndGgtMl0gPSAnXDAnOwotCQkJYnJlYWs7Ci0JCWNhc2UgVFlQRToKLQkJCW1lbWNweShwb3dlci0+YmF0X3R5cGUsICZyZXMtPnBsYywgcmVzLT5sZW5ndGgtMik7Ci0JCQlwb3dlci0+YmF0X3R5cGVbcmVzLT5sZW5ndGgtMl0gPSAnXDAnOwotCQkJLyogdGhpcyBkaWZmZXJzIGEgbGl0dGxlIGZyb20gdGhlIHNwZWMKLQkJCSAgIGZpbGwgaW4gbW9yZSBpZiB5b3UgZmluZCBzb21lICovCi0JCQlpZiAoIXN0cm5jbXAocG93ZXItPmJhdF90eXBlLCAiTGkiLCAzMCkpCi0JCQkJcG93ZXItPmJhdF90eXBlX2VudW0gPSBQT1dFUl9TVVBQTFlfVEVDSE5PTE9HWV9MSU9OOwotCQkJZWxzZQotCQkJCXBvd2VyLT5iYXRfdHlwZV9lbnVtID0gUE9XRVJfU1VQUExZX1RFQ0hOT0xPR1lfVU5LTk9XTjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIE5PVElGWV9TVE9QOworCQl9IGVsc2UgeworCQkJaWYgKHBvd2VyLT5iYXRfcHJlc2VudCA9PSAxKQorCQkJCXN0YXR1c19jaGFuZ2VkID0gMTsKKworCQkJcG93ZXItPmJhdF9wcmVzZW50ID0gMDsKKwkJCXBvd2VyLT5iYXRfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOworCQl9CisJCXBvd2VyLT5iYXRfY2FwID0gcmVzLT5wbGNbMV07CisJCWlmIChzdGF0dXNfY2hhbmdlZCkKKwkJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZudmVjX2JhdF9wc3kpOworCQlicmVhazsKKwljYXNlIFZPTFRBR0U6CisJCXBvd2VyLT5iYXRfdm9sdGFnZV9ub3cgPSByZXMtPnBsdSAqIDEwMDA7CisJCWJyZWFrOworCWNhc2UgVElNRV9SRU1BSU5JTkc6CisJCXBvd2VyLT50aW1lX3JlbWFpbiA9IHJlcy0+cGx1ICogMzYwMDsKKwkJYnJlYWs7CisJY2FzZSBDVVJSRU5UOgorCQlwb3dlci0+YmF0X2N1cnJlbnRfbm93ID0gcmVzLT5wbHMgKiAxMDAwOworCQlicmVhazsKKwljYXNlIEFWRVJBR0VfQ1VSUkVOVDoKKwkJcG93ZXItPmJhdF9jdXJyZW50X2F2ZyA9IHJlcy0+cGxzICogMTAwMDsKKwkJYnJlYWs7CisJY2FzZSBDQVBBQ0lUWV9SRU1BSU5JTkc6CisJCXBvd2VyLT5jYXBhY2l0eV9yZW1haW4gPSByZXMtPnBsdSAqIDEwMDA7CisJCWJyZWFrOworCWNhc2UgTEFTVF9GVUxMX0NIQVJHRV9DQVBBQ0lUWToKKwkJcG93ZXItPmNoYXJnZV9sYXN0X2Z1bGwgPSByZXMtPnBsdSAqIDEwMDA7CisJCWJyZWFrOworCWNhc2UgREVTSUdOX0NBUEFDSVRZOgorCQlwb3dlci0+Y2hhcmdlX2Z1bGxfZGVzaWduID0gcmVzLT5wbHUgKiAxMDAwOworCQlicmVhazsKKwljYXNlIENSSVRJQ0FMX0NBUEFDSVRZOgorCQlwb3dlci0+Y3JpdGljYWxfY2FwYWNpdHkgPSByZXMtPnBsdSAqIDEwMDA7CisJCWJyZWFrOworCWNhc2UgVEVNUEVSQVRVUkU6CisJCXBvd2VyLT5iYXRfdGVtcGVyYXR1cmUgPSByZXMtPnBsdSAtIDI3MzI7CisJCWJyZWFrOworCWNhc2UgTUFOVUZBQ1RVUkVSOgorCQltZW1jcHkocG93ZXItPmJhdF9tYW51LCAmcmVzLT5wbGMsIHJlcy0+bGVuZ3RoIC0gMik7CisJCXBvd2VyLT5iYXRfbW9kZWxbcmVzLT5sZW5ndGggLSAyXSA9ICdcMCc7CisJCWJyZWFrOworCWNhc2UgTU9ERUw6CisJCW1lbWNweShwb3dlci0+YmF0X21vZGVsLCAmcmVzLT5wbGMsIHJlcy0+bGVuZ3RoIC0gMik7CisJCXBvd2VyLT5iYXRfbW9kZWxbcmVzLT5sZW5ndGggLSAyXSA9ICdcMCc7CisJCWJyZWFrOworCWNhc2UgVFlQRToKKwkJbWVtY3B5KHBvd2VyLT5iYXRfdHlwZSwgJnJlcy0+cGxjLCByZXMtPmxlbmd0aCAtIDIpOworCQlwb3dlci0+YmF0X3R5cGVbcmVzLT5sZW5ndGggLSAyXSA9ICdcMCc7CisJCS8qIHRoaXMgZGlmZmVycyBhIGxpdHRsZSBmcm9tIHRoZSBzcGVjCisJCSAgIGZpbGwgaW4gbW9yZSBpZiB5b3UgZmluZCBzb21lICovCisJCWlmICghc3RybmNtcChwb3dlci0+YmF0X3R5cGUsICJMaSIsIDMwKSkKKwkJCXBvd2VyLT5iYXRfdHlwZV9lbnVtID0gUE9XRVJfU1VQUExZX1RFQ0hOT0xPR1lfTElPTjsKKwkJZWxzZQorCQkJcG93ZXItPmJhdF90eXBlX2VudW0gPSBQT1dFUl9TVVBQTFlfVEVDSE5PTE9HWV9VTktOT1dOOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTk9USUZZX1NUT1A7CiAJfQogCiAJcmV0dXJuIE5PVElGWV9TVE9QOwogfQogCiBzdGF0aWMgaW50IG52ZWNfcG93ZXJfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKLQkJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCi0JCQkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKKwkJCQkgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCisJCQkJICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKIAlzdHJ1Y3QgbnZlY19wb3dlciAqcG93ZXIgPSBkZXZfZ2V0X2RydmRhdGEocHN5LT5kZXYtPnBhcmVudCk7CiAJc3dpdGNoIChwc3ApIHsKQEAgLTIyMyw2MSArMjM1LDYwIEBACiB9CiAKIHN0YXRpYyBpbnQgbnZlY19iYXR0ZXJ5X2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCi0JCQkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAotCQkJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCisJCQkJICAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCisJCQkJICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewogCXN0cnVjdCBudmVjX3Bvd2VyICpwb3dlciA9IGRldl9nZXRfZHJ2ZGF0YShwc3ktPmRldi0+cGFyZW50KTsKIAotCXN3aXRjaChwc3ApCi0JewotCQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKLQkJCXZhbC0+aW50dmFsID0gcG93ZXItPmJhdF9zdGF0dXM7Ci0JCQlicmVhazsKLQkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWToKLQkJCXZhbC0+aW50dmFsID0gcG93ZXItPmJhdF9jYXA7Ci0JCQlicmVhazsKLQkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgotCQkJdmFsLT5pbnR2YWwgPSBwb3dlci0+YmF0X3ByZXNlbnQ7Ci0JCQlicmVhazsKLQkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKLQkJCXZhbC0+aW50dmFsID0gcG93ZXItPmJhdF92b2x0YWdlX25vdzsKLQkJCWJyZWFrOwotCQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XOgotCQkJdmFsLT5pbnR2YWwgPSBwb3dlci0+YmF0X2N1cnJlbnRfbm93OwotCQkJYnJlYWs7Ci0JCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9BVkc6Ci0JCQl2YWwtPmludHZhbCA9IHBvd2VyLT5iYXRfY3VycmVudF9hdmc7Ci0JCQlicmVhazsKLQkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9USU1FX1RPX0VNUFRZX05PVzoKLQkJCXZhbC0+aW50dmFsID0gcG93ZXItPnRpbWVfcmVtYWluOwotCQkJYnJlYWs7Ci0JCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTExfREVTSUdOOgotCQkJdmFsLT5pbnR2YWwgPSBwb3dlci0+Y2hhcmdlX2Z1bGxfZGVzaWduOwotCQkJYnJlYWs7Ci0JCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTEw6Ci0JCQl2YWwtPmludHZhbCA9IHBvd2VyLT5jaGFyZ2VfbGFzdF9mdWxsOwotCQkJYnJlYWs7Ci0JCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0VNUFRZOgotCQkJdmFsLT5pbnR2YWwgPSBwb3dlci0+Y3JpdGljYWxfY2FwYWNpdHk7Ci0JCQlicmVhazsKLQkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XOgotCQkJdmFsLT5pbnR2YWwgPSBwb3dlci0+Y2FwYWNpdHlfcmVtYWluOwotCQkJYnJlYWs7Ci0JCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUDoKLQkJCXZhbC0+aW50dmFsID0gcG93ZXItPmJhdF90ZW1wZXJhdHVyZTsKLQkJCWJyZWFrOwotCQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX01BTlVGQUNUVVJFUjoKLQkJCXZhbC0+c3RydmFsID0gcG93ZXItPmJhdF9tYW51OwotCQkJYnJlYWs7Ci0JCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRToKLQkJCXZhbC0+c3RydmFsID0gcG93ZXItPmJhdF9tb2RlbDsKLQkJCWJyZWFrOwotCQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1k6Ci0JCQl2YWwtPmludHZhbCA9IHBvd2VyLT5iYXRfdHlwZV9lbnVtOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQorCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CisJCXZhbC0+aW50dmFsID0gcG93ZXItPmJhdF9zdGF0dXM7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFk6CisJCXZhbC0+aW50dmFsID0gcG93ZXItPmJhdF9jYXA7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKKwkJdmFsLT5pbnR2YWwgPSBwb3dlci0+YmF0X3ByZXNlbnQ7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6CisJCXZhbC0+aW50dmFsID0gcG93ZXItPmJhdF92b2x0YWdlX25vdzsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVzoKKwkJdmFsLT5pbnR2YWwgPSBwb3dlci0+YmF0X2N1cnJlbnRfbm93OworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQVZHOgorCQl2YWwtPmludHZhbCA9IHBvd2VyLT5iYXRfY3VycmVudF9hdmc7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19FTVBUWV9OT1c6CisJCXZhbC0+aW50dmFsID0gcG93ZXItPnRpbWVfcmVtYWluOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMX0RFU0lHTjoKKwkJdmFsLT5pbnR2YWwgPSBwb3dlci0+Y2hhcmdlX2Z1bGxfZGVzaWduOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMOgorCQl2YWwtPmludHZhbCA9IHBvd2VyLT5jaGFyZ2VfbGFzdF9mdWxsOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9FTVBUWToKKwkJdmFsLT5pbnR2YWwgPSBwb3dlci0+Y3JpdGljYWxfY2FwYWNpdHk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVzoKKwkJdmFsLT5pbnR2YWwgPSBwb3dlci0+Y2FwYWNpdHlfcmVtYWluOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVA6CisJCXZhbC0+aW50dmFsID0gcG93ZXItPmJhdF90ZW1wZXJhdHVyZTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVI6CisJCXZhbC0+c3RydmFsID0gcG93ZXItPmJhdF9tYW51OworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX01PREVMX05BTUU6CisJCXZhbC0+c3RydmFsID0gcG93ZXItPmJhdF9tb2RlbDsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZOgorCQl2YWwtPmludHZhbCA9IHBvd2VyLT5iYXRfdHlwZV9lbnVtOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMxMCwxMSArMzIxLDExIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHBvd2VyX3N1cHBseSBudmVjX2JhdF9wc3kgPSB7Ci0JLm5hbWUJCT0gImJhdHRlcnkiLAotCS50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlksCi0JLnByb3BlcnRpZXMJPSBudmVjX2JhdHRlcnlfcHJvcHMsCi0JLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShudmVjX2JhdHRlcnlfcHJvcHMpLAotCS5nZXRfcHJvcGVydHkJPSBudmVjX2JhdHRlcnlfZ2V0X3Byb3BlcnR5LAorCS5uYW1lID0gImJhdHRlcnkiLAorCS50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkucHJvcGVydGllcyA9IG52ZWNfYmF0dGVyeV9wcm9wcywKKwkubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKG52ZWNfYmF0dGVyeV9wcm9wcyksCisJLmdldF9wcm9wZXJ0eSA9IG52ZWNfYmF0dGVyeV9nZXRfcHJvcGVydHksCiB9OwogCiBzdGF0aWMgc3RydWN0IHBvd2VyX3N1cHBseSBudmVjX3BzeSA9IHsKQEAgLTMyNyw5ICszMzgsOCBAQAogCS5nZXRfcHJvcGVydHkgPSBudmVjX3Bvd2VyX2dldF9wcm9wZXJ0eSwKIH07CiAKLXN0YXRpYyBpbnQgY291bnRlciA9IDA7Ci1zdGF0aWMgaW50IGNvbnN0IGJhdF9pdGVyW10gPQoteworc3RhdGljIGludCBjb3VudGVyOworc3RhdGljIGludCBjb25zdCBiYXRfaXRlcltdID0gewogCVNMT1RfU1RBVFVTLCBWT0xUQUdFLCBDVVJSRU5ULCBDQVBBQ0lUWV9SRU1BSU5JTkcsCiAjaWZkZWYgRUNfRlVMTF9ESUFHCiAJQVZFUkFHRV9DVVJSRU5ULCBURU1QRVJBVFVSRSwgVElNRV9SRU1BSU5JTkcsCkBAIC0zNDAsNyArMzUwLDcgQEAKIHsKIAljaGFyIGJ1ZltdID0geyAnXHgwMScsICdceDAwJyB9OwogCXN0cnVjdCBudmVjX3Bvd2VyICpwb3dlciA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbnZlY19wb3dlciwKLQkJIHBvbGxlci53b3JrKTsKKwkJCQkJCXBvbGxlci53b3JrKTsKIAogCWlmIChjb3VudGVyID49IEFSUkFZX1NJWkUoYmF0X2l0ZXIpKQogCQljb3VudGVyID0gMDsKQEAgLTM1MSwxOSArMzYxLDE4IEBACiAKIC8qIHNlbGVjdCBhIGJhdHRlcnkgcmVxdWVzdCBmdW5jdGlvbiB2aWEgcm91bmQgcm9iaW4KICAgIGRvaW5nIGl0IGFsbCBhdCBvbmNlIHNlZW1zIHRvIG92ZXJsb2FkIHRoZSBwb3dlciBzdXBwbHkgKi8KLQlidWZbMF0gPSAnXHgwMic7IC8qIGJhdHRlcnkgKi8KLSAgICAgICAgYnVmWzFdID0gYmF0X2l0ZXJbY291bnRlcisrXTsKKwlidWZbMF0gPSAnXHgwMic7CS8qIGJhdHRlcnkgKi8KKwlidWZbMV0gPSBiYXRfaXRlcltjb3VudGVyKytdOwogCW52ZWNfd3JpdGVfYXN5bmMocG93ZXItPm52ZWMsIGJ1ZiwgMik7CiAKLS8vCXByaW50aygiJTAyeCAlMDJ4XG4iLCBidWZbMF0sIGJ1ZlsxXSk7Ci0KIAlzY2hlZHVsZV9kZWxheWVkX3dvcmsodG9fZGVsYXllZF93b3JrKHdvcmspLCBtc2Vjc190b19qaWZmaWVzKDUwMDApKTsKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IG52ZWNfcG93ZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3k7Ci0Jc3RydWN0IG52ZWNfcG93ZXIgKnBvd2VyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG52ZWNfcG93ZXIpLCBHRlBfTk9XQUlUKTsKKwlzdHJ1Y3QgbnZlY19wb3dlciAqcG93ZXIgPQorCSAgICBremFsbG9jKHNpemVvZihzdHJ1Y3QgbnZlY19wb3dlciksIEdGUF9OT1dBSVQpOwogCXN0cnVjdCBudmVjX2NoaXAgKm52ZWMgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CiAKIAlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgcG93ZXIpOwpAQCAtMzgxLDcgKzM5MCw3IEBACiAJY2FzZSBCQVQ6CiAJCXBzeSA9ICZudmVjX2JhdF9wc3k7CiAKLSAgICAgICAgICAgICAgICBwb3dlci0+bm90aWZpZXIubm90aWZpZXJfY2FsbCA9IG52ZWNfcG93ZXJfYmF0X25vdGlmaWVyOworCQlwb3dlci0+bm90aWZpZXIubm90aWZpZXJfY2FsbCA9IG52ZWNfcG93ZXJfYmF0X25vdGlmaWVyOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlrZnJlZShwb3dlcik7CkBAIC0zOTgsMTQgKzQwNywxMyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBudmVjX3Bvd2VyX2RyaXZlciA9IHsKIAkucHJvYmUgPSBudmVjX3Bvd2VyX3Byb2JlLAotLy8JLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKG52ZWNfcG93ZXJfcmVtb3ZlKSwKIAkuZHJpdmVyID0gewotCQkubmFtZSA9ICJudmVjLXBvd2VyIiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JfQorCQkgICAubmFtZSA9ICJudmVjLXBvd2VyIiwKKwkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJCSAgIH0KIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IG52ZWNfcG93ZXJfaW5pdCh2b2lkKSAKK3N0YXRpYyBpbnQgX19pbml0IG52ZWNfcG93ZXJfaW5pdCh2b2lkKQogewogCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm52ZWNfcG93ZXJfZHJpdmVyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWNfcHMyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjX3BzMi5jCmluZGV4IDZiYjk0MzAuLjc0MmY1Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWNfcHMyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlY19wczIuYwpAQCAtMSwxNCArMSwzMyBAQAorLyoKKyAqIG52ZWNfcHMyOiBtb3VzZSBkcml2ZXIgZm9yIGEgTlZJRElBIGNvbXBsaWFudCBlbWJlZGRlZCBjb250cm9sbGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBQzEwMCBLZXJuZWwgVGVhbSA8YWMxMDBAbGlzdHMubGF1bmNocGFkLm5ldD4KKyAqCisgKiBBdXRob3JzOiAgUGllcnJlLUh1Z3VlcyBIdXNzb24gPHBoaHVzc29uQGZyZWUuZnI+CisgKiAgICAgICAgICAgSWx5YSBQZXRyb3YgPGlseWEubXVyb21lY0BnbWFpbC5jb20+CisgKiAgICAgICAgICAgTWFyYyBEaWV0cmljaCA8bWFydmluMjRAZ214LmRlPgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKwogI2luY2x1ZGUgIm52ZWMuaCIKIAotI2RlZmluZSBTVEFSVF9TVFJFQU1JTkcJeydceDA2JywnXHgwMycsJ1x4MDEnfQotI2RlZmluZSBTVE9QX1NUUkVBTUlORwl7J1x4MDYnLCdceDA0J30KLSNkZWZpbmUgU0VORF9DT01NQU5ECXsnXHgwNicsJ1x4MDEnLCdceGY0JywnXHgwMSd9CisjZGVmaW5lIFNUQVJUX1NUUkVBTUlORwl7J1x4MDYnLCAnXHgwMycsICdceDA0J30KKyNkZWZpbmUgU1RPUF9TVFJFQU1JTkcJeydceDA2JywgJ1x4MDQnfQorI2RlZmluZSBTRU5EX0NPTU1BTkQJeydceDA2JywgJ1x4MDEnLCAnXHhmNCcsICdceDAxJ30KIAotc3RydWN0IG52ZWNfcHMyCi17CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBNT1VTRV9SRVNFVFtdID0geydceDA2JywgJ1x4MDEnLCAnXHhmZicsICdceDAzJ307CisKK3N0cnVjdCBudmVjX3BzMiB7CiAJc3RydWN0IHNlcmlvICpzZXJfZGV2OwogCXN0cnVjdCBub3RpZmllcl9ibG9jayBub3RpZmllcjsKIAlzdHJ1Y3QgbnZlY19jaGlwICpudmVjOwpAQCAtMTksOCArMzgsNyBAQAogc3RhdGljIGludCBwczJfc3RhcnRzdHJlYW1pbmcoc3RydWN0IHNlcmlvICpzZXJfZGV2KQogewogCXVuc2lnbmVkIGNoYXIgYnVmW10gPSBTVEFSVF9TVFJFQU1JTkc7Ci0JbnZlY193cml0ZV9hc3luYyhwczJfZGV2Lm52ZWMsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCXJldHVybiAwOworCXJldHVybiBudmVjX3dyaXRlX2FzeW5jKHBzMl9kZXYubnZlYywgYnVmLCBzaXplb2YoYnVmKSk7CiB9CiAKIHN0YXRpYyB2b2lkIHBzMl9zdG9wc3RyZWFtaW5nKHN0cnVjdCBzZXJpbyAqc2VyX2RldikKQEAgLTI5LDEyICs0Nyw2IEBACiAJbnZlY193cml0ZV9hc3luYyhwczJfZGV2Lm52ZWMsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogfQogCi0vKiBpcyB0aGlzIHJlYWxseSBuZWVkZWQ/Ci1zdGF0aWMgdm9pZCBudmVjX3Jlc3BfaGFuZGxlcih1bnNpZ25lZCBjaGFyICpkYXRhKSB7Ci0Jc2VyaW9faW50ZXJydXB0KHNlcl9kZXYsIGRhdGFbNF0sIDApOwotfQotKi8KLQogc3RhdGljIGludCBwczJfc2VuZGNvbW1hbmQoc3RydWN0IHNlcmlvICpzZXJfZGV2LCB1bnNpZ25lZCBjaGFyIGNtZCkKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZltdID0gU0VORF9DT01NQU5EOwpAQCAtNDIsNTIgKzU0LDQ5IEBACiAJYnVmWzJdID0gY21kICYgMHhmZjsKIAogCWRldl9kYmcoJnNlcl9kZXYtPmRldiwgIlNlbmRpbmcgcHMyIGNtZCAlMDJ4XG4iLCBjbWQpOwotCW52ZWNfd3JpdGVfYXN5bmMocHMyX2Rldi5udmVjLCBidWYsIHNpemVvZihidWYpKTsKLQotCXJldHVybiAwOworCXJldHVybiBudmVjX3dyaXRlX2FzeW5jKHBzMl9kZXYubnZlYywgYnVmLCBzaXplb2YoYnVmKSk7CiB9CiAKIHN0YXRpYyBpbnQgbnZlY19wczJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKLQkJCQl1bnNpZ25lZCBsb25nIGV2ZW50X3R5cGUsIHZvaWQgKmRhdGEpCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgZXZlbnRfdHlwZSwgdm9pZCAqZGF0YSkKIHsKIAlpbnQgaTsKIAl1bnNpZ25lZCBjaGFyICptc2cgPSAodW5zaWduZWQgY2hhciAqKWRhdGE7CiAKIAlzd2l0Y2ggKGV2ZW50X3R5cGUpIHsKLQkJY2FzZSBOVkVDX1BTMl9FVlQ6Ci0JCQlzZXJpb19pbnRlcnJ1cHQocHMyX2Rldi5zZXJfZGV2LCBtc2dbMl0sIDApOwotCQkJcmV0dXJuIE5PVElGWV9TVE9QOworCWNhc2UgTlZFQ19QUzJfRVZUOgorCQlmb3IgKGkgPSAwOyBpIDwgbXNnWzFdOyBpKyspCisJCQlzZXJpb19pbnRlcnJ1cHQocHMyX2Rldi5zZXJfZGV2LCBtc2dbMiArIGldLCAwKTsKKwkJcmV0dXJuIE5PVElGWV9TVE9QOwogCi0JCWNhc2UgTlZFQ19QUzI6Ci0JCQlpZiAobXNnWzJdID09IDEpCi0JCQkJZm9yKGkgPSAwOyBpIDwgKG1zZ1sxXSAtIDIpOyBpKyspCi0JCQkJCXNlcmlvX2ludGVycnVwdChwczJfZGV2LnNlcl9kZXYsIG1zZ1tpKzRdLCAwKTsKLQkJCWVsc2UgaWYgKG1zZ1sxXSAhPSAyKSAvKiAhYWNrICovCi0JCQl7Ci0JCQkJcHJpbnRrKCJudmVjX3BzMjogdW5oYW5kbGVkIG1vdXNlIGV2ZW50ICIpOwotCQkJCWZvcihpID0gMDsgaSA8PSAobXNnWzFdKzEpOyBpKyspCi0JCQkJCXByaW50aygiJTAyeCAiLCBtc2dbaV0pOwotCQkJCXByaW50aygiLlxuIik7Ci0JCQl9CisJY2FzZSBOVkVDX1BTMjoKKwkJaWYgKG1zZ1syXSA9PSAxKQorCQkJZm9yIChpID0gMDsgaSA8IChtc2dbMV0gLSAyKTsgaSsrKQorCQkJCXNlcmlvX2ludGVycnVwdChwczJfZGV2LnNlcl9kZXYsIG1zZ1tpICsgNF0sIDApOworCQllbHNlIGlmIChtc2dbMV0gIT0gMikgewkvKiAhYWNrICovCisJCQlwcmludF9oZXhfZHVtcChLRVJOX1dBUk5JTkcsICJ1bmhhbmRsZWQgbW91c2UgZXZlbnQ6ICIsCisJCQkJRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsCisJCQkJbXNnLCBtc2dbMV0gKyAyLCB0cnVlKTsKKwkJfQogCi0JCQlyZXR1cm4gTk9USUZZX1NUT1A7CisJCXJldHVybiBOT1RJRllfU1RPUDsKIAl9CiAKIAlyZXR1cm4gTk9USUZZX0RPTkU7CiB9CiAKLQotaW50IF9faW5pdCBudmVjX3BzMihzdHJ1Y3QgbnZlY19jaGlwICpudmVjKQorc3RhdGljIGludCBfX2RldmluaXQgbnZlY19tb3VzZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCBudmVjX2NoaXAgKm52ZWMgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IHNlcmlvICpzZXJfZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNlcmlvKSwgR0ZQX0tFUk5FTCk7CiAKLQlzZXJfZGV2LT5pZC50eXBlPVNFUklPXzgwNDI7Ci0Jc2VyX2Rldi0+d3JpdGU9cHMyX3NlbmRjb21tYW5kOwotCXNlcl9kZXYtPm9wZW49cHMyX3N0YXJ0c3RyZWFtaW5nOwotCXNlcl9kZXYtPmNsb3NlPXBzMl9zdG9wc3RyZWFtaW5nOworCXNlcl9kZXYtPmlkLnR5cGUgPSBTRVJJT184MDQyOworCXNlcl9kZXYtPndyaXRlID0gcHMyX3NlbmRjb21tYW5kOworCXNlcl9kZXYtPm9wZW4gPSBwczJfc3RhcnRzdHJlYW1pbmc7CisJc2VyX2Rldi0+Y2xvc2UgPSBwczJfc3RvcHN0cmVhbWluZzsKIAotCXN0cmxjcHkoc2VyX2Rldi0+bmFtZSwgIk5WRUMgUFMyIiwgc2l6ZW9mKHNlcl9kZXYtPm5hbWUpKTsKLQlzdHJsY3B5KHNlcl9kZXYtPnBoeXMsICJOVkVDIEkyQyBzbGF2ZSIsIHNpemVvZihzZXJfZGV2LT5waHlzKSk7CisJc3RybGNweShzZXJfZGV2LT5uYW1lLCAibnZlYyBtb3VzZSIsIHNpemVvZihzZXJfZGV2LT5uYW1lKSk7CisJc3RybGNweShzZXJfZGV2LT5waHlzLCAibnZlYyIsIHNpemVvZihzZXJfZGV2LT5waHlzKSk7CiAKIAlwczJfZGV2LnNlcl9kZXYgPSBzZXJfZGV2OwogCXBzMl9kZXYubm90aWZpZXIubm90aWZpZXJfY2FsbCA9IG52ZWNfcHMyX25vdGlmaWVyOwpAQCAtOTcsNyArMTA2LDI2IEBACiAJc2VyaW9fcmVnaXN0ZXJfcG9ydChzZXJfZGV2KTsKIAogCS8qIG1vdXNlIHJlc2V0ICovCi0JbnZlY193cml0ZV9hc3luYyhudmVjLCAiXHgwNlx4MDFceGZmXHgwMyIsIDQpOworCW52ZWNfd3JpdGVfYXN5bmMobnZlYywgTU9VU0VfUkVTRVQsIDQpOwogCiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG52ZWNfbW91c2VfZHJpdmVyID0geworCS5wcm9iZSAgPSBudmVjX21vdXNlX3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm52ZWMtbW91c2UiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgbnZlY19tb3VzZV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbnZlY19tb3VzZV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChudmVjX21vdXNlX2luaXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIk5WRUMgbW91c2UgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJNYXJjIERpZXRyaWNoIDxtYXJ2aW4yNEBnbXguZGU+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL29scGNfZGNvbi5jIGIvZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9vbHBjX2Rjb24uYwppbmRleCA3NTBmZTUwLi5hZjI0ZGRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL29scGNfZGNvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vbHBjX2Rjb24vb2xwY19kY29uLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CkBAIC0zNiw5ICszNyw2IEBACiBzdGF0aWMgaW50IHJlc3VtZWxpbmUgPSA4OTg7CiBtb2R1bGVfcGFyYW0ocmVzdW1lbGluZSwgaW50LCAwNDQ0KTsKIAotc3RhdGljIGludCBub2luaXQ7Ci1tb2R1bGVfcGFyYW0obm9pbml0LCBpbnQsIDA0NDQpOwotCiAvKiBEZWZhdWx0IG9mZiBzaW5jZSBpdCBkb2Vzbid0IHdvcmsgb24gRENPTiBBU0lDIGluIEItdGVzdCBPTFBDIGJvYXJkICovCiBzdGF0aWMgaW50IHVzZWFhID0gMTsKIG1vZHVsZV9wYXJhbSh1c2VhYSwgaW50LCAwNDQ0KTsKQEAgLTY4LDExICs2NiwxMCBAQAogCiBzdGF0aWMgaW50IGRjb25faHdfaW5pdChzdHJ1Y3QgZGNvbl9wcml2ICpkY29uLCBpbnQgaXNfaW5pdCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGNvbi0+Y2xpZW50OwogCXVpbnQxNl90IHZlcjsKIAlpbnQgcmMgPSAwOwogCi0JdmVyID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgRENPTl9SRUdfSUQpOworCXZlciA9IGRjb25fcmVhZChkY29uLCBEQ09OX1JFR19JRCk7CiAJaWYgKCh2ZXIgPj4gOCkgIT0gMHhEQykgewogCQlwcmludGsoS0VSTl9FUlIgIm9scGMtZGNvbjogIERDT04gSUQgbm90IDB4REN4eDogMHglMDR4ICIKIAkJCQkiaW5zdGVhZC5cbiIsIHZlcik7CkBAIC05MCwzMCArODcsMTkgQEAKIAkJfQogCX0KIAotCWlmICh2ZXIgPCAweGRjMDIgJiYgIW5vaW5pdCkgewotCQkvKiBJbml0aWFsaXplIHRoZSBEQ09OIHJlZ2lzdGVycyAqLwotCi0JCS8qIFN0YXJ0IHdpdGggd29yay1hcm91bmRzIGZvciBEQ09OIEFTSUMgKi8KLQkJaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIDB4NGIsIDB4MDBjYyk7Ci0JCWkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCAweDRiLCAweDAwY2MpOwotCQlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgMHg0YiwgMHgwMGNjKTsKLQkJaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIDB4MGIsIDB4MDA3YSk7Ci0JCWkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCAweDM2LCAweDAyNWMpOwotCQlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgMHgzNywgMHgwMjVlKTsKLQotCQkvKiBJbml0aWFsaXNlIFNEUkFNICovCi0KLQkJaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIDB4M2IsIDB4MDAyYik7Ci0JCWkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCAweDQxLCAweDAxMDEpOwotCQlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgMHg0MiwgMHgwMTAxKTsKLQl9IGVsc2UgaWYgKCFub2luaXQpIHsKLQkJLyogU0RSQU0gc2V0dXAvaG9sZCB0aW1lICovCi0JCWkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCAweDNhLCAweGMwNDApOwotCQlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgMHg0MSwgMHgwMDAwKTsKLQkJaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIDB4NDEsIDB4MDEwMSk7Ci0JCWkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCAweDQyLCAweDAxMDEpOworCWlmICh2ZXIgPCAweGRjMDIpIHsKKwkJZGV2X2VycigmZGNvbi0+Y2xpZW50LT5kZXYsCisJCQkJIkRDT04gdjEgaXMgdW5zdXBwb3J0ZWQsIGdpdmluZyB1cC4uXG4iKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycjsKIAl9CiAKKwkvKiBTRFJBTSBzZXR1cC9ob2xkIHRpbWUgKi8KKwlkY29uX3dyaXRlKGRjb24sIDB4M2EsIDB4YzA0MCk7CisJZGNvbl93cml0ZShkY29uLCAweDQxLCAweDAwMDApOworCWRjb25fd3JpdGUoZGNvbiwgMHg0MSwgMHgwMTAxKTsKKwlkY29uX3dyaXRlKGRjb24sIDB4NDIsIDB4MDEwMSk7CisKIAkvKiBDb2xvdXIgc3dpenpsZSwgQUEsIG5vIHBhc3N0aHJvdWdoLCBiYWNrbGlnaHQgKi8KIAlpZiAoaXNfaW5pdCkgewogCQlkY29uLT5kaXNwX21vZGUgPSBNT0RFX1BBU1NUSFJVIHwgTU9ERV9CTF9FTkFCTEUgfApAQCAtMTIxLDExICsxMDcsMTEgQEAKIAkJaWYgKHVzZWFhKQogCQkJZGNvbi0+ZGlzcF9tb2RlIHw9IE1PREVfQ09MX0FBOwogCX0KLQlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgRENPTl9SRUdfTU9ERSwgZGNvbi0+ZGlzcF9tb2RlKTsKKwlkY29uX3dyaXRlKGRjb24sIERDT05fUkVHX01PREUsIGRjb24tPmRpc3BfbW9kZSk7CiAKIAogCS8qIFNldCB0aGUgc2NhbmxpbmUgdG8gaW50ZXJydXB0IG9uIGR1cmluZyByZXN1bWUgKi8KLQlpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgRENPTl9SRUdfU0NBTl9JTlQsIHJlc3VtZWxpbmUpOworCWRjb25fd3JpdGUoZGNvbiwgRENPTl9SRUdfU0NBTl9JTlQsIHJlc3VtZWxpbmUpOwogCiBlcnI6CiAJcmV0dXJuIHJjOwpAQCAtNzEyLDcgKzY5OCw2IEBACiAgZWlycToKIAlmcmVlX2lycShEQ09OX0lSUSwgZGNvbik7CiAgZWluaXQ6Ci0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CiAJa2ZyZWUoZGNvbik7CiAJcmV0dXJuIHJjOwogfQpAQCAtNzIxLDggKzcwNiw2IEBACiB7CiAJc3RydWN0IGRjb25fcHJpdiAqZGNvbiA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCi0JaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7Ci0KIAlmYl91bnJlZ2lzdGVyX2NsaWVudCgmZGNvbi0+ZmJldmVudF9uYik7CiAJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmRjb24tPnJlYm9vdF9uYik7CiAJYXRvbWljX25vdGlmaWVyX2NoYWluX3VucmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsICZkY29uX3BhbmljX25iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9wYW5lbC9wYW5lbC5jIGIvZHJpdmVycy9zdGFnaW5nL3BhbmVsL3BhbmVsLmMKaW5kZXggYjMwM2I3ZS4uNDY4M2Q1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3BhbmVsL3BhbmVsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3BhbmVsL3BhbmVsLmMKQEAgLTExNzksMTYgKzExNzksMTQgQEAKIAkJCWJyZWFrOwogCiAJCXdoaWxlICgqZXNjKSB7Ci0JCQljaGFyICplbmRwOwotCiAJCQlpZiAoKmVzYyA9PSAneCcpIHsKIAkJCQllc2MrKzsKLQkJCQlsY2RfYWRkcl94ID0gc2ltcGxlX3N0cnRvdWwoZXNjLCAmZW5kcCwgMTApOwotCQkJCWVzYyA9IGVuZHA7CisJCQkJaWYgKGtzdHJ0b3VsKGVzYywgMTAsICZsY2RfYWRkcl94KSA8IDApCisJCQkJCWJyZWFrOwogCQkJfSBlbHNlIGlmICgqZXNjID09ICd5JykgewogCQkJCWVzYysrOwotCQkJCWxjZF9hZGRyX3kgPSBzaW1wbGVfc3RydG91bChlc2MsICZlbmRwLCAxMCk7Ci0JCQkJZXNjID0gZW5kcDsKKwkJCQlpZiAoa3N0cnRvdWwoZXNjLCAxMCwgJmxjZF9hZGRyX3kpIDwgMCkKKwkJCQkJYnJlYWs7CiAJCQl9IGVsc2UKIAkJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BvaG1lbGZzL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvcG9obWVsZnMvS2NvbmZpZwppbmRleCA1ODE1OGI4Li44ZDUzYjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcG9obWVsZnMvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvcG9obWVsZnMvS2NvbmZpZwpAQCAtMTgsMTEgKzE4LDMgQEAKIAkgIFR1cm5zIG9uIGV4Y2Vzc2l2ZSBQT0hNRUxGUyBkZWJ1Z2dpbmcgZmFjaWxpdGllcy4KIAkgIFlvdSB1c3VhbGx5IGRvIG5vdCB3YW50IHRvIHNsb3cgdGhpbmdzIGRvd24gbm90aWNlYWJseSBhbmQgZ2V0IHJlYWxseQogCSAgbG90cyBvZiBrZXJuZWwgbWVzc2FnZXMgaW4gc3lzbG9nLgotCi1jb25maWcgUE9ITUVMRlNfQ1JZUFRPCi0JYm9vbCAiUE9ITUVMRlMgY3J5cHRvIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQT0hNRUxGUwotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGFsbG93cyB0byBlbmNyeXB0IGFuZC9vciBwcm90ZWN0IHdpdGggc3Ryb25nCi0JICBjcnlwdG9ncmFwaGljIGhhc2ggYWxsIGRhdGFmbG93IGJldHdlZW4gc2VydmVyIGFuZCBjbGllbnRzLgotCSAgRWFjaCBjb25maWcgZ3JvdXAgY2FuIGhhdmUgaXRzIG93biBrZXlzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BvaG1lbGZzL3RyYW5zLmMgYi9kcml2ZXJzL3N0YWdpbmcvcG9obWVsZnMvdHJhbnMuYwppbmRleCAzNmEyNTM1Li4wNmMxYTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcG9obWVsZnMvdHJhbnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcG9obWVsZnMvdHJhbnMuYwpAQCAtNTAsNyArNTAsNyBAQAogCWludCBlcnIgPSAwOwogCXVuc2lnbmVkIGludCBpLCBhdHRhY2hlZF9wYWdlcyA9IHQtPmF0dGFjaGVkX3BhZ2VzLCBjaTsKIAlzdHJ1Y3QgbXNnaGRyIG1zZzsKLQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzID0gKHQtPmVuZyk/dC0+ZW5nLT5wYWdlczp0LT5wYWdlczsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzID0gKHQtPmVuZykgPyB0LT5lbmctPnBhZ2VzIDogdC0+cGFnZXM7CiAJc3RydWN0IHBhZ2UgKnA7CiAJdW5zaWduZWQgaW50IHNpemU7CiAKQEAgLTYxLDcgKzYxLDcgQEAKIAltc2cubXNnX2ZsYWdzID0gTVNHX1dBSVRBTEwgfCBNU0dfTU9SRTsKIAogCWNpID0gMDsKLQlmb3IgKGk9MDsgaTx0LT5wYWdlX251bTsgKytpKSB7CisJZm9yIChpID0gMDsgaSA8IHQtPnBhZ2VfbnVtOyArK2kpIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwYWdlc1tjaV07CiAJCXN0cnVjdCBuZXRmc19jbWQgY21kOwogCQlzdHJ1Y3QgaW92ZWMgaW87CkBAIC0xNjksNyArMTY5LDcgQEAKIAl9CiAKIAlkcHJpbnRrKCIlczogc2VudCAlcyB0cmFuc2FjdGlvbjogdDogJXAsIGdlbjogJXUsIHNpemU6ICV6dSwgcGFnZV9udW06ICV1LlxuIiwKLQkJCV9fZnVuY19fLCAodC0+cGFnZV9udW0pPyJwYXJ0aWFsIjoiZnVsbCIsCisJCQlfX2Z1bmNfXywgKHQtPnBhZ2VfbnVtKSA/ICJwYXJ0aWFsIiA6ICJmdWxsIiwKIAkJCXQsIHQtPmdlbiwgdC0+aW92ZWMuaW92X2xlbiwgdC0+cGFnZV9udW0pOwogCiAJZXJyID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9xdWF0ZWNoX3VzYjIvcXVhdGVjaF91c2IyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcXVhdGVjaF91c2IyL3F1YXRlY2hfdXNiMi5jCmluZGV4IGNhMDk4Y2EuLjAyZmFmZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9xdWF0ZWNoX3VzYjIvcXVhdGVjaF91c2IyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3F1YXRlY2hfdXNiMi9xdWF0ZWNoX3VzYjIuYwpAQCAtOTE2LDkgKzkxNiwxMCBAQAogCQlkYmcoIiVzKCkgcG9ydCAlZCwgY21kID09IFRJT0NNSVdBSVQgZW50ZXIiLAogCQkJX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJCXByZXZfbXNyX3ZhbHVlID0gcG9ydF9leHRyYS0+c2hhZG93TVNSICAmIFFUMl9TRVJJQUxfTVNSX01BU0s7CisJCWJhcnJpZXIoKTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQl3aGlsZSAoMSkgewogCQkJYWRkX3dhaXRfcXVldWUoJnBvcnRfZXh0cmEtPndhaXQsICZ3YWl0KTsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJCQlzY2hlZHVsZSgpOwogCQkJZGJnKCIlcygpOiBwb3J0ICVkLCBjbWQgPT0gVElPQ01JV0FJVCBoZXJlXG4iLAogCQkJCV9fZnVuY19fLCBwb3J0LT5udW1iZXIpOwpAQCAtOTI2LDkgKzkyNywxMiBAQAogCQkJLyogc2VlIGlmIGEgc2lnbmFsIHdva2UgdXMgdXAgKi8KIAkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKIAkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJCW1zcl92YWx1ZSA9IHBvcnRfZXh0cmEtPnNoYWRvd01TUiAmIFFUMl9TRVJJQUxfTVNSX01BU0s7Ci0JCQlpZiAobXNyX3ZhbHVlID09IHByZXZfbXNyX3ZhbHVlKQorCQkJaWYgKG1zcl92YWx1ZSA9PSBwcmV2X21zcl92YWx1ZSkgeworCQkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAkJCQlyZXR1cm4gLUVJTzsgIC8qIG5vIGNoYW5nZSAtIGVycm9yICovCisJCQl9CiAJCQlpZiAoKGFyZyAmIFRJT0NNX1JORyAmJgogCQkJCSgocHJldl9tc3JfdmFsdWUgJiBRVDJfU0VSSUFMX01TUl9SSSkgPT0KIAkJCQkJKG1zcl92YWx1ZSAmIFFUMl9TRVJJQUxfTVNSX1JJKSkpIHx8CkBAIC05NDEsNiArOTQ1LDcgQEAKIAkJCQkoYXJnICYgVElPQ01fQ1RTICYmCiAJCQkJKChwcmV2X21zcl92YWx1ZSAmIFFUMl9TRVJJQUxfTVNSX0NUUykgPT0KIAkJCQkJKG1zcl92YWx1ZSAmIFFUMl9TRVJJQUxfTVNSX0NUUykpKSkgeworCQkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KIAkJfSAvKiBlbmQgaW5pZmluaXRlIHdoaWxlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9NYWtlZmlsZQppbmRleCAxMWE5MjI2Li43MmRiNTA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvTWFrZWZpbGUKQEAgLTEsNyArMSw3IEBACiAKLSNFWFRSQV9DRkxBR1MgKz0gLURDT05GSUdfSUVFRTgwMjExX05PV0VQPXkKLSNFWFRSQV9DRkxBR1MgKz0gLXN0ZD1nbnU4OQotI0VYVFJBX0NGTEFHUyArPSAtTzIKKyNjY2ZsYWdzLXkgKz0gLURDT05GSUdfSUVFRTgwMjExX05PV0VQPXkKKyNjY2ZsYWdzLXkgKz0gLXN0ZD1nbnU4OQorI2NjZmxhZ3MteSArPSAtTzIKICNDQyAgICAgICAgICAgID0gZ2NjCiAKIGNjZmxhZ3MteSA6PSAtRFNXX0FOVEUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExLmgKaW5kZXggZTc5YTdlMi4uNDBkZDcxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExLmgKQEAgLTEzMzksOCArMTMzOSw4IEBACiAKIGludCBpZWVlODAyMTFfd3hfc2V0X2dlbl9pZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmllLCBzaXplX3QgbGVuKTsKIC8qIGllZWU4MDIxMV9zb2Z0bWFjLmMgKi8KLWV4dGVybiBzaG9ydCBpZWVlODAyMTFfaXNfNTRnKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXQpOwotZXh0ZXJuIHNob3J0IGllZWU4MDIxMV9pc19zaG9ydHNsb3Qoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIG5ldCk7CitleHRlcm4gc2hvcnQgaWVlZTgwMjExX2lzXzU0Zyhjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCk7CitleHRlcm4gc2hvcnQgaWVlZTgwMjExX2lzX3Nob3J0c2xvdChjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCk7CiBleHRlcm4gaW50IGllZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMsIHUxNiB0eXBlLAogCQkJdTE2IHN0eXBlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCmluZGV4IDM4ZTY3ZjAuLjI2YmFjYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYwpAQCAtMzIsMTQgKzMyLDE0IEBACiAJezB4MDAsMHgwRiwweEFDLDB4MDV9LCAvL1dFUC0xMDQKIH07CiAKLXNob3J0IGllZWU4MDIxMV9pc181NGcoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIG5ldCkKK3Nob3J0IGllZWU4MDIxMV9pc181NGcoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQpCiB7Ci0JcmV0dXJuICgobmV0LnJhdGVzX2V4X2xlbiA+IDApIHx8IChuZXQucmF0ZXNfbGVuID4gNCkpOworCXJldHVybiAobmV0LT5yYXRlc19leF9sZW4gPiAwKSB8fCAobmV0LT5yYXRlc19sZW4gPiA0KTsKIH0KIAotc2hvcnQgaWVlZTgwMjExX2lzX3Nob3J0c2xvdChzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0KQorc2hvcnQgaWVlZTgwMjExX2lzX3Nob3J0c2xvdChjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCkKIHsKLQlyZXR1cm4gKG5ldC5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpOworCXJldHVybiBuZXQtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVDsKIH0KIAogLyogcmV0dXJucyB0aGUgdG90YWwgbGVuZ3RoIG5lZWRlZCBmb3IgcGxlYWNpbmcgdGhlIFJBVEUgTUZJRQpAQCAtNzg5LDcgKzc4OSw3IEBACiAJZWxzZQogCQlhdGltX2xlbiA9IDA7CiAKLQlpZihpZWVlODAyMTFfaXNfNTRnKGllZWUtPmN1cnJlbnRfbmV0d29yaykpCisJaWYoaWVlZTgwMjExX2lzXzU0ZygmaWVlZS0+Y3VycmVudF9uZXR3b3JrKSkKIAkJZXJwX2xlbiA9IDM7CiAJZWxzZQogCQllcnBfbGVuID0gMDsKQEAgLTEyNTgsNyArMTI1OCw3IEBACiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIGFzc29jaWF0ZV9jb21wbGV0ZV93cSk7CiAKIAlwcmludGsoS0VSTl9JTkZPICJBc3NvY2lhdGVkIHN1Y2Nlc3NmdWxseVxuIik7Ci0JaWYoaWVlZTgwMjExX2lzXzU0ZyhpZWVlLT5jdXJyZW50X25ldHdvcmspICYmCisJaWYoaWVlZTgwMjExX2lzXzU0ZygmaWVlZS0+Y3VycmVudF9uZXR3b3JrKSAmJgogCQkoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pKXsKIAogCQlpZWVlLT5yYXRlID0gNTQwOwpAQCAtMTM3OSw3ICsxMzc5LDcgQEAKIAkJCQlpZWVlLT5iZWlucmV0cnkgPSBmYWxzZTsKIAkJCQlxdWV1ZV93b3JrKGllZWUtPndxLCAmaWVlZS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSk7CiAJCQl9ZWxzZXsKLQkJCQlpZihpZWVlODAyMTFfaXNfNTRnKGllZWUtPmN1cnJlbnRfbmV0d29yaykgJiYKKwkJCQlpZihpZWVlODAyMTFfaXNfNTRnKCZpZWVlLT5jdXJyZW50X25ldHdvcmspICYmCiAJCQkJCQkoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pKXsKIAkJCQkJaWVlZS0+cmF0ZSA9IDU0MDsKIAkJCQkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBHIHJhdGVzXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNXoyLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4N3NlL3I4MTgwX3J0bDgyMjV6Mi5jCmluZGV4IDNmMDlmNzYuLmVlNWI4NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg3c2UvcjgxODBfcnRsODIyNXoyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODdzZS9yODE4MF9ydGw4MjI1ejIuYwpAQCAtNTk2LDcgKzU5Niw3IEBACiB7CiAJc3RydWN0IHI4MTgwX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCXNob3J0IGdzZXQgPSAocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEICYmCi0JCWllZWU4MDIxMV9pc181NGcocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmspKSB8fAorCQlpZWVlODAyMTFfaXNfNTRnKCZwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yaykpIHx8CiAJCXByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1I7CiAKIAlydGw4MjI1X1NldFRYUG93ZXJMZXZlbChkZXYsIGNoKTsKQEAgLTYxNSw3ICs2MTUsNyBAQAogCX0KIAogCWlmIChwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQgJiYKLQkgICAgaWVlZTgwMjExX2lzX3Nob3J0c2xvdChwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yaykpCisJICAgIGllZWU4MDIxMV9pc19zaG9ydHNsb3QoJnByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrKSkKIAkJd3JpdGVfbmljX2J5dGUoZGV2LCBTTE9ULCAweDkpOwogCWVsc2UKIAkJd3JpdGVfbmljX2J5dGUoZGV2LCBTTE9ULCAweDE0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9NYWtlZmlsZQppbmRleCA2ZTQxMDY3Li5hNjZhOWFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL01ha2VmaWxlCkBAIC0xLDM4ICsxLDQxIEBACi1OSUNfU0VMRUNUID0gUlRMODE5MkUKLQotY2NmbGFncy15IDo9IC1EUlRMODE5MkUKLWNjZmxhZ3MteSArPSAtc3RkPWdudTg5Ci1jY2ZsYWdzLXkgKz0gLU8yCi1jY2ZsYWdzLXkgKz0gLURUSE9NQVNfVFVSQk8KK2NjZmxhZ3MteSArPSAtRFVTRV9GV19TT1VSQ0VfSU1HX0ZJTEUKK2NjZmxhZ3MteSArPSAtRENPTkZJR19QTV9SVEwKK2NjZmxhZ3MteSArPSAtRENPTkZJR19QTQorY2NmbGFncy15ICs9IC1ESEFWRV9ORVRfREVWSUNFX09QUwogY2NmbGFncy15ICs9IC1ERU5BQkxFX0RPVDExRAogCi1jY2ZsYWdzLXkgKz0gLURFTkFCTEVfSVBTCi1jY2ZsYWdzLXkgKz0gLURFTkFCTEVfTFBTCi0KIHI4MTkyZV9wY2ktb2JqcyA6PQkJXAotCXI4MTkyRV9jb3JlLm8JCVwKLQlyODE4MF85M2N4Ni5vCQlcCi0JcjgxOTJFX3d4Lm8JCVwKLQlyODE5MF9ydGw4MjU2Lm8JCVwKLQlyODE5eEVfcGh5Lm8JCVwKLQlyODE5eEVfZmlybXdhcmUubwlcCi0JcjgxOXhFX2NtZHBrdC5vCQlcCi0JcjgxOTJFX2RtLm8JCVwKLQlyODE5Ml9wbS5vCQlcCi0JaWVlZTgwMjExL2llZWU4MDIxMV9yeC5vCQlcCi0JaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLm8JCVwKLQlpZWVlODAyMTEvaWVlZTgwMjExX3R4Lm8JCVwKLQlpZWVlODAyMTEvaWVlZTgwMjExX3d4Lm8JCVwKLQlpZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5vCQlcCi0JaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjX3d4Lm8JXAotCWllZWU4MDIxMS9ydGw4MTl4X0hUUHJvYy5vCQlcCi0JaWVlZTgwMjExL3J0bDgxOXhfVFNQcm9jLm8JCVwKLQlpZWVlODAyMTEvcnRsODE5eF9CQVByb2MubwkJXAotCWllZWU4MDIxMS9kb3QxMWQubwkJCVwKLQlpZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0Lm8JCVwKLQlpZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAubwlcCi0JaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLm8JXAotCWllZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfd2VwLm8KKwlydGxfY29yZS5vCQlcCisJcnRsX2VlcHJvbS5vCQlcCisJcnRsX3BzLm8JCVwKKwlydGxfd3gubwkJXAorCXJ0bF9jYW0ubwkJXAorCXJ0bF9kbS5vCQlcCisJcnRsX3BtLm8JCVwKKwlydGxfcGNpLm8JCVwKKwlydGxfZGVidWcubwkJXAorCXJ0bF9ldGh0b29sLm8JCVwKKwlyODE5MkVfZGV2Lm8JCVwKKwlyODE5MkVfcGh5Lm8JCVwKKwlyODE5MkVfZmlybXdhcmUubwlcCisJcjgxOTJFX2NtZHBrdC5vCQlcCisJcjgxOTJFX2h3aW1nLm8JCVwKKwlyODE5MFBfcnRsODI1Ni5vCVwKKwlydGxsaWJfcngubwkJXAorCXJ0bGxpYl9zb2Z0bWFjLm8JXAorCXJ0bGxpYl90eC5vCQlcCisJcnRsbGliX3d4Lm8JCVwKKwlydGxsaWJfbW9kdWxlLm8JCVwKKwlydGxsaWJfc29mdG1hY193eC5vCVwKKwlydGw4MTl4X0hUUHJvYy5vCVwKKwlydGw4MTl4X1RTUHJvYy5vCVwKKwlydGw4MTl4X0JBUHJvYy5vCVwKKwlkb3QxMWQubwkJXAorCXJ0bGxpYl9jcnlwdC5vCQlcCisJcnRsbGliX2NyeXB0X3RraXAubwlcCisJcnRsbGliX2NyeXB0X2NjbXAubwlcCisJcnRsbGliX2NyeXB0X3dlcC5vCiAKIG9iai0kKENPTkZJR19SVEw4MTkyRSkgKz0gcjgxOTJlX3BjaS5vCiAKK2NjZmxhZ3MteSArPSAtRF9fQ0hFQ0tfRU5ESUFOX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxZjE1OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9UT0RPCkBAIC0wLDAgKzEsMiBAQAorKiBtZXJnZSBpbnRvIGRyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bGxpYi9ydGw4MTkyZQorKiBjbGVhbiB1cCBmdW5jdGlvbiBuYW1pbmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9kb3QxMWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9kb3QxMWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTAzODFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2RvdDExZC5jCkBAIC0wLDAgKzEsMjE2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImRvdDExZC5oIgorCitzdHJ1Y3QgY2hhbm5lbF9saXN0IHsKKwl1OCAgICAgIENoYW5uZWxbMzJdOworCXU4ICAgICAgTGVuOworfTsKKworc3RhdGljIHN0cnVjdCBjaGFubmVsX2xpc3QgQ2hhbm5lbFBsYW5bXSA9IHsKKwl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LAorCSAgMTQ5LCAxNTMsIDE1NywgMTYxLCAxNjV9LCAyNH0sCisJe3sxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTF9LCAxMX0sCisJe3sxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwKKwkgIDYwLCA2NH0sIDIxfSwKKwl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzfSwgMTN9LAorCXt7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTN9LCAxM30sCisJe3sxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDM2LCA0MCwgNDQsIDQ4LCA1MiwKKwkgIDU2LCA2MCwgNjR9LCAyMn0sCisJe3sxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDM2LCA0MCwgNDQsIDQ4LCA1MiwKKwkgIDU2LCA2MCwgNjR9LCAyMn0sCisJe3sxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxM30sIDEzfSwKKwl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMzYsIDQwLCA0NCwgNDgsIDUyLAorCSAgNTYsIDYwLCA2NH0sIDIyfSwKKwl7ezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMzYsIDQwLCA0NCwgNDgsIDUyLAorCSA1NiwgNjAsIDY0fSwgMjJ9LAorCXt7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0fSwgMTR9LAorCXt7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTN9LCAxM30sCisJe3sxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMzYsIDQwLCA0NCwgNDgsIDUyLAorCSAgNTYsIDYwLCA2NH0sIDIxfQorfTsKKwordm9pZCBEb3QxMWRfSW5pdChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3QgcnRfZG90MTFkX2luZm8gKnBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGllZWUpOworCXBEb3QxMWRJbmZvLT5iRW5hYmxlZCA9IGZhbHNlOworCisJcERvdDExZEluZm8tPlN0YXRlID0gRE9UMTFEX1NUQVRFX05PTkU7CisJcERvdDExZEluZm8tPkNvdW50cnlJZUxlbiA9IDA7CisJbWVtc2V0KHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcCwgMCwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOworCW1lbXNldChwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0LCAweEZGLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CisJUkVTRVRfQ0lFX1dBVENIRE9HKGllZWUpOworCit9CisKK3ZvaWQgRG90MTFkX0NoYW5uZWxtYXAodTggY2hhbm5lbF9wbGFuLCBzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwlpbnQgaSwgbWF4X2NoYW4gPSAxNCwgbWluX2NoYW4gPSAxOworCisJaWVlZS0+Ykdsb2JhbERvbWFpbiA9IGZhbHNlOworCisJaWYgKENoYW5uZWxQbGFuW2NoYW5uZWxfcGxhbl0uTGVuICE9IDApIHsKKwkJbWVtc2V0KEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXAsIDAsCisJCSAgICAgICBzaXplb2YoR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCkpOworCQlmb3IgKGkgPSAwOyBpIDwgQ2hhbm5lbFBsYW5bY2hhbm5lbF9wbGFuXS5MZW47IGkrKykgeworCQkJaWYgKENoYW5uZWxQbGFuW2NoYW5uZWxfcGxhbl0uQ2hhbm5lbFtpXSA8IG1pbl9jaGFuIHx8CisJCQkgICAgQ2hhbm5lbFBsYW5bY2hhbm5lbF9wbGFuXS5DaGFubmVsW2ldID4gbWF4X2NoYW4pCisJCQkJYnJlYWs7CisJCQlHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwW0NoYW5uZWxQbGFuCisJCQkJCVtjaGFubmVsX3BsYW5dLkNoYW5uZWxbaV1dID0gMTsKKwkJfQorCX0KKworCXN3aXRjaCAoY2hhbm5lbF9wbGFuKSB7CisJY2FzZSBDT1VOVFJZX0NPREVfR0xPQkFMX0RPTUFJTjoKKwkJaWVlZS0+Ykdsb2JhbERvbWFpbiA9IHRydWU7CisJCWZvciAoaSA9IDEyOyBpIDw9IDE0OyBpKyspCisJCQlHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwW2ldID0gMjsKKwkJaWVlZS0+SWJzc1N0YXJ0Q2hubCA9IDEwOworCQlpZWVlLT5pYnNzX21heGpvaW5fY2hhbCA9IDExOworCQlicmVhazsKKworCWNhc2UgQ09VTlRSWV9DT0RFX1dPUkxEX1dJREVfMTM6CisJCWZvciAoaSA9IDEyOyBpIDw9IDEzOyBpKyspCisJCQlHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwW2ldID0gMjsKKwkJaWVlZS0+SWJzc1N0YXJ0Q2hubCA9IDEwOworCQlpZWVlLT5pYnNzX21heGpvaW5fY2hhbCA9IDExOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWllZWUtPklic3NTdGFydENobmwgPSAxOworCQlpZWVlLT5pYnNzX21heGpvaW5fY2hhbCA9IDE0OworCQlicmVhazsKKwl9Cit9CisKKwordm9pZCBEb3QxMWRfUmVzZXQoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IHJ0X2RvdDExZF9pbmZvICpwRG90MTFkSW5mbyA9IEdFVF9ET1QxMURfSU5GTyhpZWVlKTsKKwl1MzIgaTsKKworCW1lbXNldChwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXAsIDAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKKwltZW1zZXQocERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdCwgMHhGRiwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOworCWZvciAoaSA9IDE7IGkgPD0gMTE7IGkrKykKKwkJKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcClbaV0gPSAxOworCWZvciAoaSA9IDEyOyBpIDw9IDE0OyBpKyspCisJCShwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXApW2ldID0gMjsKKwlwRG90MTFkSW5mby0+U3RhdGUgPSBET1QxMURfU1RBVEVfTk9ORTsKKwlwRG90MTFkSW5mby0+Q291bnRyeUllTGVuID0gMDsKKwlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7Cit9CisKK3ZvaWQgRG90MTFkX1VwZGF0ZUNvdW50cnlJZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqZGV2LCB1OCAqcFRhZGRyLAorCQkJICAgIHUxNiBDb3V0cnlJZUxlbiwgdTggKnBDb3V0cnlJZSkKK3sKKwlzdHJ1Y3QgcnRfZG90MTFkX2luZm8gKnBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGRldik7CisJdTggaSwgaiwgTnVtVHJpcGxlcywgTWF4Q2hubE51bTsKKwlzdHJ1Y3QgY2hubF90eHBvd190cmlwbGUgKnBUcmlwbGU7CisKKwltZW1zZXQocERvdDExZEluZm8tPmNoYW5uZWxfbWFwLCAwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7CisJbWVtc2V0KHBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3QsIDB4RkYsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKKwlNYXhDaG5sTnVtID0gMDsKKwlOdW1UcmlwbGVzID0gKENvdXRyeUllTGVuIC0gMykgLyAzOworCXBUcmlwbGUgPSAoc3RydWN0IGNobmxfdHhwb3dfdHJpcGxlICopKHBDb3V0cnlJZSArIDMpOworCWZvciAoaSA9IDA7IGkgPCBOdW1UcmlwbGVzOyBpKyspIHsKKwkJaWYgKE1heENobmxOdW0gPj0gcFRyaXBsZS0+Rmlyc3RDaG5sKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJEb3QxMWRfVXBkYXRlQ291bnRyeUllKCk6IEludmFsaWQiCisJCQkgICAgICAgIiBjb3VudHJ5IElFLCBza2lwIGl0Li4uLi4uLi4xXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoTUFYX0NIQU5ORUxfTlVNQkVSIDwgKHBUcmlwbGUtPkZpcnN0Q2hubCArCisJCSAgICBwVHJpcGxlLT5OdW1DaG5scykpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIkRvdDExZF9VcGRhdGVDb3VudHJ5SWUoKTogSW52YWxpZCAiCisJCQkgICAgICAgImNvdW50cnkgSUUsIHNraXAgaXQuLi4uLi4uLjJcbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJZm9yIChqID0gMCA7IGogPCBwVHJpcGxlLT5OdW1DaG5sczsgaisrKSB7CisJCQlwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbcFRyaXBsZS0+Rmlyc3RDaG5sICsgal0gPSAxOworCQkJcERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdFtwVHJpcGxlLT5GaXJzdENobmwgKyBqXSA9CisJCQkJCQkgcFRyaXBsZS0+TWF4VHhQb3dlckluRGJtOworCQkJTWF4Q2hubE51bSA9IHBUcmlwbGUtPkZpcnN0Q2hubCArIGo7CisJCX0KKworCQlwVHJpcGxlID0gKHN0cnVjdCBjaG5sX3R4cG93X3RyaXBsZSAqKSgodTgqKXBUcmlwbGUgKyAzKTsKKwl9CisKKwlVUERBVEVfQ0lFX1NSQyhkZXYsIHBUYWRkcik7CisKKwlwRG90MTFkSW5mby0+Q291bnRyeUllTGVuID0gQ291dHJ5SWVMZW47CisJbWVtY3B5KHBEb3QxMWRJbmZvLT5Db3VudHJ5SWVCdWYsIHBDb3V0cnlJZSwgQ291dHJ5SWVMZW4pOworCXBEb3QxMWRJbmZvLT5TdGF0ZSA9IERPVDExRF9TVEFURV9MRUFSTkVEOworfQorCit1OCBET1QxMURfR2V0TWF4VHhQd3JJbkRibShzdHJ1Y3QgcnRsbGliX2RldmljZSAqZGV2LCB1OCBDaGFubmVsKQoreworCXN0cnVjdCBydF9kb3QxMWRfaW5mbyAqcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oZGV2KTsKKwl1OCBNYXhUeFB3ckluRGJtID0gMjU1OworCisJaWYgKE1BWF9DSEFOTkVMX05VTUJFUiA8IENoYW5uZWwpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRE9UMTFEX0dldE1heFR4UHdySW5EYm0oKTogSW52YWxpZCAiCisJCSAgICAgICAiQ2hhbm5lbFxuIik7CisJCXJldHVybiBNYXhUeFB3ckluRGJtOworCX0KKwlpZiAocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW0NoYW5uZWxdKQorCQlNYXhUeFB3ckluRGJtID0gcERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdFtDaGFubmVsXTsKKworCXJldHVybiBNYXhUeFB3ckluRGJtOworfQorCit2b2lkIERPVDExRF9TY2FuQ29tcGxldGUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRfZG90MTFkX2luZm8gKnBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGRldik7CisKKwlzd2l0Y2ggKHBEb3QxMWRJbmZvLT5TdGF0ZSkgeworCWNhc2UgRE9UMTFEX1NUQVRFX0xFQVJORUQ6CisJCXBEb3QxMWRJbmZvLT5TdGF0ZSA9IERPVDExRF9TVEFURV9ET05FOworCQlicmVhazsKKwljYXNlIERPVDExRF9TVEFURV9ET05FOgorCQlEb3QxMWRfUmVzZXQoZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBET1QxMURfU1RBVEVfTk9ORToKKwkJYnJlYWs7CisJfQorfQorCitpbnQgVG9MZWdhbENoYW5uZWwoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmRldiwgdTggY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgcnRfZG90MTFkX2luZm8gKnBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGRldik7CisJdTggZGVmYXVsdF9jaG4gPSAwOworCXUzMiBpOworCisJZm9yIChpID0gMTsgaSA8PSBNQVhfQ0hBTk5FTF9OVU1CRVI7IGkrKykgeworCQlpZiAocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW2ldID4gMCkgeworCQkJZGVmYXVsdF9jaG4gPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoTUFYX0NIQU5ORUxfTlVNQkVSIDwgY2hhbm5lbCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzKCk6IEludmFsaWQgQ2hhbm5lbFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gZGVmYXVsdF9jaG47CisJfQorCisJaWYgKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtjaGFubmVsXSA+IDApCisJCXJldHVybiBjaGFubmVsOworCisJcmV0dXJuIGRlZmF1bHRfY2huOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2RvdDExZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2RvdDExZC5oCmluZGV4IDhlNjQ0NjEuLjAzMmY3MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9kb3QxMWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvZG90MTFkLmgKQEAgLTEsMjQgKzEsNDIgQEAKLSNpZm5kZWYgSU5DX0RPVDExRF9ICi0jZGVmaW5lIElOQ19ET1QxMURfSAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX19JTkNfRE9UMTFEX0gKKyNkZWZpbmUgX19JTkNfRE9UMTFEX0gKIAotI2lmZGVmIEVOQUJMRV9ET1QxMUQKLSNpbmNsdWRlICJpZWVlODAyMTEuaCIKKyNpbmNsdWRlICJydGxsaWIuaCIKIAotc3RydWN0IF9DSE5MX1RYUE9XRVJfVFJJUExFIHsKKworCitzdHJ1Y3QgY2hubF90eHBvd190cmlwbGUgewogCXU4IEZpcnN0Q2hubDsKIAl1OCAgTnVtQ2hubHM7CiAJdTggIE1heFR4UG93ZXJJbkRibTsKIH07CiAKLWVudW0gX0RPVDExRF9TVEFURSB7CitlbnVtIGRvdDExZF9zdGF0ZSB7CiAJRE9UMTFEX1NUQVRFX05PTkUgPSAwLAogCURPVDExRF9TVEFURV9MRUFSTkVELAogCURPVDExRF9TVEFURV9ET05FLAogfTsKIAogLyoqCi0gKiBzdHJ1Y3QgX1JUX0RPVDExRF9JTkZPCi0gKiBAQ291bnRyeUllTGVuOiB2YWx1ZSBncmVhdGVyIHRoYW4gMCBpZiBAQ291bnRyeUllQnVmIGNvbnRhaW5zCisgKiBzdHJ1Y3QgcnRfZG90MTFkX2luZm8gKiBAQ291bnRyeUllTGVuOiB2YWx1ZSBncmVhdGVyIHRoYW4gMCBpZiBAQ291bnRyeUllQnVmIGNvbnRhaW5zCiAgKgkJICB2YWxpZCBjb3VudHJ5IGluZm9ybWF0aW9uIGVsZW1lbnQuCiAgKiBAY2hhbmVsbF9tYXA6IGhvbGRzIGNoYW5uZWwgdmFsdWVzCiAgKgkJMCAtIGludmFsaWQsCkBAIC0yNywxOCArNDUsMTkgQEAKICAqIEBDb3VudHJ5SWVTcmNBZGRyIC0gU291cmNlIEFQIG9mIHRoZSBjb3VudHJ5IElFCiAgKi8KIAotc3RydWN0IF9SVF9ET1QxMURfSU5GTyB7CitzdHJ1Y3QgcnRfZG90MTFkX2luZm8geworCiAJYm9vbCBiRW5hYmxlZDsKIAogCXUxNiBDb3VudHJ5SWVMZW47Ci0JdTggQ291bnRyeUllQnVmW01BWF9JRV9MRU5dOwotCXU4IENvdW50cnlJZVNyY0FkZHJbNl07Ci0JdTggQ291bnRyeUllV2F0Y2hkb2c7CisJdTggIENvdW50cnlJZUJ1ZltNQVhfSUVfTEVOXTsKKwl1OCAgQ291bnRyeUllU3JjQWRkcls2XTsKKwl1OCAgQ291bnRyeUllV2F0Y2hkb2c7CiAKLQl1OCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07Ci0JdTggTWF4VHhQd3JEYm1MaXN0W01BWF9DSEFOTkVMX05VTUJFUisxXTsKKwl1OCAgY2hhbm5lbF9tYXBbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOworCXU4ICBNYXhUeFB3ckRibUxpc3RbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOwogCi0JRE9UMTFEX1NUQVRFIFN0YXRlOworCWVudW0gZG90MTFkX3N0YXRlIFN0YXRlOwogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIGNwTWFjQWRkcih1bnNpZ25lZCBjaGFyICpkZXMsIHVuc2lnbmVkIGNoYXIgKnNyYykKQEAgLTQ2LDQ5ICs2NSw0MSBAQAogCW1lbWNweShkZXMsIHNyYywgNik7CiB9CiAKLSNkZWZpbmUgR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpICgoUFJUX0RPVDExRF9JTkZPKSBcCi0JCQkoKF9fcEllZWVEZXYpLT5wRG90MTFkSW5mbykpCisjZGVmaW5lIEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KQkJCVwKKwkgKChzdHJ1Y3QgcnRfZG90MTFkX2luZm8gKikoKF9fcEllZWVEZXYpLT5wRG90MTFkSW5mbykpCiAKLSNkZWZpbmUgSVNfRE9UMTFEX0VOQUJMRShfX3BJZWVlRGV2KSAoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5iRW5hYmxlZCkKLSNkZWZpbmUgSVNfQ09VTlRSWV9JRV9WQUxJRChfX3BJZWVlRGV2KSBcCi0JCQkoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVMZW4gPiAwKQorI2RlZmluZSBJU19ET1QxMURfRU5BQkxFKF9fcEllZWVEZXYpCQkJXAorCSAoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5iRW5hYmxlZCkKKyNkZWZpbmUgSVNfQ09VTlRSWV9JRV9WQUxJRChfX3BJZWVlRGV2KQkJCVwKKwkoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVMZW4gPiAwKQogCi0jZGVmaW5lIElTX0VRVUFMX0NJRV9TUkMoX19wSWVlZURldiwgX19wVGEpIFwKLQkJZXFNYWNBZGRyKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllU3JjQWRkciwgX19wVGEpCi0KLSNkZWZpbmUgVVBEQVRFX0NJRV9TUkMoX19wSWVlZURldiwgX19wVGEpIFwKLQkJY3BNYWNBZGRyKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllU3JjQWRkciwgX19wVGEpCisjZGVmaW5lIElTX0VRVUFMX0NJRV9TUkMoX19wSWVlZURldiwgX19wVGEpCQlcCisJIGVxTWFjQWRkcihHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZVNyY0FkZHIsIF9fcFRhKQorI2RlZmluZSBVUERBVEVfQ0lFX1NSQyhfX3BJZWVlRGV2LCBfX3BUYSkJCVwKKwljcE1hY0FkZHIoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVTcmNBZGRyLCBfX3BUYSkKIAogI2RlZmluZSBJU19DT1VOVFJZX0lFX0NIQU5HRUQoX19wSWVlZURldiwgX19JZSkgXAotCSgoKF9fSWUpLkxlbmd0aCA9PSAwIHx8IChfX0llKS5MZW5ndGggIT0gXAotCUdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllTGVuKSA/IEZBTFNFIDogXAotCSghbWVtY21wKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllQnVmLCBcCisJKCgoX19JZSkuTGVuZ3RoID09IDAgfHwgKF9fSWUpLkxlbmd0aCAhPQlcCisJR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVMZW4pID8JXAorCWZhbHNlIDogKCFtZW1jbXAoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVCdWYsCVwKIAkoX19JZSkuT2N0ZXQsIChfX0llKS5MZW5ndGgpKSkKIAogI2RlZmluZSBDSUVfV0FUQ0hET0dfVEggMQotI2RlZmluZSBHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpIChHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPiBcCi0JCQkJCQkJQ291bnRyeUllV2F0Y2hkb2cpCisjZGVmaW5lIEdFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikJCQkJXAorCSAoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVXYXRjaGRvZykKICNkZWZpbmUgUkVTRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpIEdFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikgPSAwCiAjZGVmaW5lIFVQREFURV9DSUVfV0FUQ0hET0coX19wSWVlZURldikgKCsrR0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSkKIAotI2RlZmluZSBJU19ET1QxMURfU1RBVEVfRE9ORShfX3BJZWVlRGV2KSBcCi0JCShHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPlN0YXRlID09IERPVDExRF9TVEFURV9ET05FKQorI2RlZmluZSBJU19ET1QxMURfU1RBVEVfRE9ORShfX3BJZWVlRGV2KQkJCVwKKwkoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5TdGF0ZSA9PSBET1QxMURfU1RBVEVfRE9ORSkKIAordm9pZCBEb3QxMWRfSW5pdChzdHJ1Y3QgcnRsbGliX2RldmljZSAqZGV2KTsKK3ZvaWQgRG90MTFkX0NoYW5uZWxtYXAodTggY2hhbm5lbF9wbGFuLCBzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSk7Cit2b2lkIERvdDExZF9SZXNldChzdHJ1Y3QgcnRsbGliX2RldmljZSAqZGV2KTsKK3ZvaWQgRG90MTFkX1VwZGF0ZUNvdW50cnlJZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqZGV2LCB1OCAqcFRhZGRyLAorCQkJICAgIHUxNiBDb3V0cnlJZUxlbiwgdTggKnBDb3V0cnlJZSk7Cit1OCBET1QxMURfR2V0TWF4VHhQd3JJbkRibShzdHJ1Y3QgcnRsbGliX2RldmljZSAqZGV2LCB1OCBDaGFubmVsKTsKK3ZvaWQgRE9UMTFEX1NjYW5Db21wbGV0ZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqZGV2KTsKK2ludCBUb0xlZ2FsQ2hhbm5lbChzdHJ1Y3QgcnRsbGliX2RldmljZSAqZGV2LCB1OCBjaGFubmVsKTsKIAotdm9pZCBEb3QxMWRfSW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2KTsKLQotdm9pZCBEb3QxMWRfUmVzZXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldik7Ci0KLXZvaWQgRG90MTFkX1VwZGF0ZUNvdW50cnlJZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LCB1OCAqcFRhZGRyLAotCQl1MTYgQ291dHJ5SWVMZW4sIHU4ICpwQ291dHJ5SWUpOwotCi11OCBET1QxMURfR2V0TWF4VHhQd3JJbkRibShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LCB1OCBjaGFubmVsKTsKLQotdm9pZCBET1QxMURfU2NhbkNvbXBsZXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYpOwotCi1pbnQgSXNMZWdhbENoYW5uZWwoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwgdTggY2hhbm5lbCk7Ci0KLWludCBUb0xlZ2FsQ2hhbm5lbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LCB1OCBjaGFubmVsKTsKLQotI2VuZGlmIC8qIEVOQUJMRV9ET1QxMUQgKi8KLSNlbmRpZiAvKiBJTkNfRE9UMTFEX0ggKi8KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9kb3QxMWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvZG90MTFkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZTQ2NDguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9kb3QxMWQuYworKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0jaWZkZWYgRU5BQkxFX0RPVDExRAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8JRmlsZToKLS8vCQlEb3QxMWQuYwotLy8KLS8vCURlc2NyaXB0aW9uOgotLy8JCUltcGxlbWVudCA4MDIuMTFkLgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2luY2x1ZGUgImRvdDExZC5oIgotCi12b2lkCi1Eb3QxMWRfSW5pdChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLQlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oaWVlZSk7Ci0KLQlwRG90MTFkSW5mby0+YkVuYWJsZWQgPSAwOwotCi0JcERvdDExZEluZm8tPlN0YXRlID0gRE9UMTFEX1NUQVRFX05PTkU7Ci0JcERvdDExZEluZm8tPkNvdW50cnlJZUxlbiA9IDA7Ci0JbWVtc2V0KHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcCwgMCwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOwotCW1lbXNldChwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0LCAweEZGLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7Ci0JUkVTRVRfQ0lFX1dBVENIRE9HKGllZWUpOwotCi0JcHJpbnRrKCJEb3QxMWRfSW5pdCgpXG4iKTsKLX0KLQotLy8KLS8vCURlc2NyaXB0aW9uOgotLy8JCVJlc2V0IHRvIHRoZSBzdGF0ZSBhcyB3ZSBhcmUganVzdCBlbnRlcmluZyBhIHJlZ3VsYXRvcnkgZG9tYWluLgotLy8KLXZvaWQKLURvdDExZF9SZXNldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLQl1MzIgaTsKLQlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oaWVlZSk7Ci0jaWYgMAotCWlmKCFwRG90MTFkSW5mby0+YkVuYWJsZWQpCi0JCXJldHVybjsKLSNlbmRpZgotCS8vIENsZWFyIG9sZCBjaGFubmVsIG1hcAotCW1lbXNldChwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXAsIDAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKLQltZW1zZXQocERvdDExZEluZm8tPk1heFR4UHdyRGJtTGlzdCwgMHhGRiwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOwotCS8vIFNldCBuZXcgY2hhbm5lbCBtYXAKLQlmb3IgKGk9MTsgaTw9MTE7IGkrKykgewotCQkocERvdDExZEluZm8tPmNoYW5uZWxfbWFwKVtpXSA9IDE7Ci0JfQotCWZvciAoaT0xMjsgaTw9MTQ7IGkrKykgewotCQkocERvdDExZEluZm8tPmNoYW5uZWxfbWFwKVtpXSA9IDI7Ci0JfQotCi0JcERvdDExZEluZm8tPlN0YXRlID0gRE9UMTFEX1NUQVRFX05PTkU7Ci0JcERvdDExZEluZm8tPkNvdW50cnlJZUxlbiA9IDA7Ci0JUkVTRVRfQ0lFX1dBVENIRE9HKGllZWUpOwotfQotCi0vLwotLy8JRGVzY3JpcHRpb246Ci0vLwkJVXBkYXRlIGNvdW50cnkgSUUgZnJvbSBCZWFjb24gb3IgUHJvYmUgUmVzb3Buc2UKLS8vCQlhbmQgY29uZmlndXJlIFBIWSBmb3Igb3BlcmF0aW9uIGluIHRoZSByZWd1bGF0b3J5IGRvbWFpbi4KLS8vCi0vLwlUT0RPOgotLy8JCUNvbmZpZ3VyZSBUeCBwb3dlci4KLS8vCi0vLwlBc3N1bXB0aW9uOgotLy8JCTEuIElTX0RPVDExRF9FTkFCTEUoKSBpcyBUUlVFLgotLy8JCTIuIElucHV0IElFIGlzIGFuIHZhbGlkIG9uZS4KLS8vCi12b2lkCi1Eb3QxMWRfVXBkYXRlQ291bnRyeUllKAotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYsCi0JdTggKgkJcFRhZGRyLAotCXUxNglDb3V0cnlJZUxlbiwKLQl1OCAqIHBDb3V0cnlJZQotCSkKLXsKLQlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oZGV2KTsKLQl1OCBpLCBqLCBOdW1UcmlwbGVzLCBNYXhDaG5sTnVtOwotCVBDSE5MX1RYUE9XRVJfVFJJUExFIHBUcmlwbGU7Ci0KLQltZW1zZXQocERvdDExZEluZm8tPmNoYW5uZWxfbWFwLCAwLCBNQVhfQ0hBTk5FTF9OVU1CRVIrMSk7Ci0JbWVtc2V0KHBEb3QxMWRJbmZvLT5NYXhUeFB3ckRibUxpc3QsIDB4RkYsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKLQlNYXhDaG5sTnVtID0gMDsKLQlOdW1UcmlwbGVzID0gKENvdXRyeUllTGVuIC0gMykgLyAzOyAvLyBza2lwIDMtYnl0ZSBjb3VudHJ5IHN0cmluZy4KLQlwVHJpcGxlID0gKFBDSE5MX1RYUE9XRVJfVFJJUExFKShwQ291dHJ5SWUgKyAzKTsKLQlmb3IoaSA9IDA7IGkgPCBOdW1UcmlwbGVzOyBpKyspCi0JewotCQlpZihNYXhDaG5sTnVtID49IHBUcmlwbGUtPkZpcnN0Q2hubCkKLQkJeyAvLyBJdCBpcyBub3QgaW4gYSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgb3JkZXIsIHNvIHN0b3AgcHJvY2Vzc2luZy4KLQkJCXByaW50aygiRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgpOiBJbnZhbGlkIGNvdW50cnkgSUUsIHNraXAgaXQuLi4uLi4uLjFcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmKE1BWF9DSEFOTkVMX05VTUJFUiA8IChwVHJpcGxlLT5GaXJzdENobmwgKyBwVHJpcGxlLT5OdW1DaG5scykpCi0JCXsgLy8gSXQgaXMgbm90IGEgdmFsaWQgc2V0IG9mIGNoYW5uZWwgaWQsIHNvIHN0b3AgcHJvY2Vzc2luZy4KLQkJCXByaW50aygiRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgpOiBJbnZhbGlkIGNvdW50cnkgSUUsIHNraXAgaXQuLi4uLi4uLjJcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yKGogPSAwIDsgaiA8IHBUcmlwbGUtPk51bUNobmxzOyBqKyspCi0JCXsKLQkJCXBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtwVHJpcGxlLT5GaXJzdENobmwgKyBqXSA9IDE7Ci0JCQlwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0W3BUcmlwbGUtPkZpcnN0Q2hubCArIGpdID0gcFRyaXBsZS0+TWF4VHhQb3dlckluRGJtOwotCQkJTWF4Q2hubE51bSA9IHBUcmlwbGUtPkZpcnN0Q2hubCArIGo7Ci0JCX0KLQotCQlwVHJpcGxlID0gKFBDSE5MX1RYUE9XRVJfVFJJUExFKSgodTgqKXBUcmlwbGUgKyAzKTsKLQl9Ci0jaWYgMQotCXByaW50aygiQ2hhbm5lbCBMaXN0OiIpOwotCWZvcihpPTE7IGk8PSBNQVhfQ0hBTk5FTF9OVU1CRVI7IGkrKykKLQkJaWYocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW2ldID4gMCkKLQkJCXByaW50aygiICVkIiwgaSk7Ci0JcHJpbnRrKCJcbiIpOwotI2VuZGlmCi0KLQlVUERBVEVfQ0lFX1NSQyhkZXYsIHBUYWRkcik7Ci0KLQlwRG90MTFkSW5mby0+Q291bnRyeUllTGVuID0gQ291dHJ5SWVMZW47Ci0JbWVtY3B5KHBEb3QxMWRJbmZvLT5Db3VudHJ5SWVCdWYsIHBDb3V0cnlJZSxDb3V0cnlJZUxlbik7Ci0JcERvdDExZEluZm8tPlN0YXRlID0gRE9UMTFEX1NUQVRFX0xFQVJORUQ7Ci19Ci0KLQotdTgKLURPVDExRF9HZXRNYXhUeFB3ckluRGJtKAotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYsCi0JdTggQ2hhbm5lbAotCSkKLXsKLQlQUlRfRE9UMTFEX0lORk8gcERvdDExZEluZm8gPSBHRVRfRE9UMTFEX0lORk8oZGV2KTsKLQl1OCBNYXhUeFB3ckluRGJtID0gMjU1OwotCi0JaWYoTUFYX0NIQU5ORUxfTlVNQkVSIDwgQ2hhbm5lbCkKLQl7Ci0JCXByaW50aygiRE9UMTFEX0dldE1heFR4UHdySW5EYm0oKTogSW52YWxpZCBDaGFubmVsXG4iKTsKLQkJcmV0dXJuIE1heFR4UHdySW5EYm07Ci0JfQotCWlmKHBEb3QxMWRJbmZvLT5jaGFubmVsX21hcFtDaGFubmVsXSkKLQl7Ci0JCU1heFR4UHdySW5EYm0gPSBwRG90MTFkSW5mby0+TWF4VHhQd3JEYm1MaXN0W0NoYW5uZWxdOwotCX0KLQotCXJldHVybiBNYXhUeFB3ckluRGJtOwotfQotCi0KLXZvaWQKLURPVDExRF9TY2FuQ29tcGxldGUoCi0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYKLQkpCi17Ci0JUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGRldik7Ci0KLQlzd2l0Y2gocERvdDExZEluZm8tPlN0YXRlKQotCXsKLQljYXNlIERPVDExRF9TVEFURV9MRUFSTkVEOgotCQlwRG90MTFkSW5mby0+U3RhdGUgPSBET1QxMURfU1RBVEVfRE9ORTsKLQkJYnJlYWs7Ci0KLQljYXNlIERPVDExRF9TVEFURV9ET05FOgotCQlpZiggR0VUX0NJRV9XQVRDSERPRyhkZXYpID09IDAgKQotCQl7IC8vIFJlc2V0IGNvdW50cnkgSUUgaWYgcHJldmlvdXMgb25lIGlzIGdvbmUuCi0JCQlEb3QxMWRfUmVzZXQoZGV2KTsKLQkJfQotCQlicmVhazsKLQljYXNlIERPVDExRF9TVEFURV9OT05FOgotCQlicmVhazsKLQl9Ci19Ci0KLWludCBJc0xlZ2FsQ2hhbm5lbCgKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldiwKLQl1OCBjaGFubmVsCi0pCi17Ci0JUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGRldik7Ci0KLQlpZihNQVhfQ0hBTk5FTF9OVU1CRVIgPCBjaGFubmVsKQotCXsKLQkJcHJpbnRrKCJJc0xlZ2FsQ2hhbm5lbCgpOiBJbnZhbGlkIENoYW5uZWxcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYocERvdDExZEluZm8tPmNoYW5uZWxfbWFwW2NoYW5uZWxdID4gMCkKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBUb0xlZ2FsQ2hhbm5lbCgKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldiwKLQl1OCBjaGFubmVsCi0pCi17Ci0JUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGRldik7Ci0JdTggZGVmYXVsdF9jaG4gPSAwOwotCXUzMiBpID0gMDsKLQotCWZvciAoaT0xOyBpPD0gTUFYX0NIQU5ORUxfTlVNQkVSOyBpKyspCi0JewotCQlpZihwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbaV0gPiAwKQotCQl7Ci0JCQlkZWZhdWx0X2NobiA9IGk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmKE1BWF9DSEFOTkVMX05VTUJFUiA8IGNoYW5uZWwpCi0JewotCQlwcmludGsoIklzTGVnYWxDaGFubmVsKCk6IEludmFsaWQgQ2hhbm5lbFxuIik7Ci0JCXJldHVybiBkZWZhdWx0X2NobjsKLQl9Ci0KLQlpZihwRG90MTFkSW5mby0+Y2hhbm5lbF9tYXBbY2hhbm5lbF0gPiAwKQotCQlyZXR1cm4gY2hhbm5lbDsKLQotCXJldHVybiBkZWZhdWx0X2NobjsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9kb3QxMWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvZG90MTFkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YjdhNGIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9kb3QxMWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0jaWZuZGVmIF9fSU5DX0RPVDExRF9ICi0jZGVmaW5lIF9fSU5DX0RPVDExRF9ICi0KLSNpZmRlZiBFTkFCTEVfRE9UMTFECi0jaW5jbHVkZSAiaWVlZTgwMjExLmgiCi0KLS8vI2RlZmluZSBFTkFCTEVfRE9UMTFECi0KLS8vI2RlZmluZSBET1QxMURfTUFYX0NITkxfTlVNIDgzCi0KLXR5cGVkZWYgc3RydWN0IF9DSE5MX1RYUE9XRVJfVFJJUExFIHsKLQl1OCBGaXJzdENobmw7Ci0JdTggIE51bUNobmxzOwotCXU4ICBNYXhUeFBvd2VySW5EYm07Ci19Q0hOTF9UWFBPV0VSX1RSSVBMRSwgKlBDSE5MX1RYUE9XRVJfVFJJUExFOwotCi10eXBlZGVmIGVudW0gX0RPVDExRF9TVEFURSB7Ci0JRE9UMTFEX1NUQVRFX05PTkUgPSAwLAotCURPVDExRF9TVEFURV9MRUFSTkVELAotCURPVDExRF9TVEFURV9ET05FLAotfURPVDExRF9TVEFURTsKLQotdHlwZWRlZiBzdHJ1Y3QgX1JUX0RPVDExRF9JTkZPIHsKLQkvL0RFQ0xBUkVfUlRfT0JKRUNUKFJUX0RPVDExRF9JTkZPKTsKLQotCWJvb2wgYkVuYWJsZWQ7IC8vIGRvdDExTXVsdGlEb21haW5DYXBhYmlsaXR5RW5hYmxlZAotCi0JdTE2IENvdW50cnlJZUxlbjsgLy8gPiAwIGlmIENvdW50cnlJZUJ1ZltdIGNvbnRhaW5zIHZhbGlkIGNvdW50cnkgaW5mb3JtYXRpb24gZWxlbWVudC4KLQl1OCAgQ291bnRyeUllQnVmW01BWF9JRV9MRU5dOwotCXU4ICBDb3VudHJ5SWVTcmNBZGRyWzZdOyAvLyBTb3VyY2UgQVAgb2YgdGhlIGNvdW50cnkgSUUuCi0JdTggIENvdW50cnlJZVdhdGNoZG9nOwotCi0JdTggIGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsgIC8vISEhVmFsdWUgMDogSW52YWxpZCwgMTogVmFsaWQgKGFjdGl2ZSBzY2FuKSwgMjogVmFsaWQgKHBhc3NpdmUgc2NhbikKLQkvL3U4ICBDaG5sTGlzdExlbjsgLy8gI0J5dGVzIHZhbGlkIGluIENobmxMaXN0W10uCi0JLy91OCAgQ2hubExpc3RbRE9UMTFEX01BWF9DSE5MX05VTV07Ci0JdTggIE1heFR4UHdyRGJtTGlzdFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07Ci0KLQlET1QxMURfU1RBVEUgU3RhdGU7Ci19UlRfRE9UMTFEX0lORk8sICpQUlRfRE9UMTFEX0lORk87Ci0jZGVmaW5lIGVxTWFjQWRkcihhLGIpCQkoICgoYSlbMF09PShiKVswXSAmJiAoYSlbMV09PShiKVsxXSAmJiAoYSlbMl09PShiKVsyXSAmJiAoYSlbM109PShiKVszXSAmJiAoYSlbNF09PShiKVs0XSAmJiAoYSlbNV09PShiKVs1XSkgPyAxOjAgKQotI2RlZmluZSBjcE1hY0FkZHIoZGVzLHNyYykJICAgICAgKChkZXMpWzBdPShzcmMpWzBdLChkZXMpWzFdPShzcmMpWzFdLChkZXMpWzJdPShzcmMpWzJdLChkZXMpWzNdPShzcmMpWzNdLChkZXMpWzRdPShzcmMpWzRdLChkZXMpWzVdPShzcmMpWzVdKQotI2RlZmluZSBHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldikgKChQUlRfRE9UMTFEX0lORk8pKChfX3BJZWVlRGV2KS0+cERvdDExZEluZm8pKQotCi0jZGVmaW5lIElTX0RPVDExRF9FTkFCTEUoX19wSWVlZURldikgR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5iRW5hYmxlZAotI2RlZmluZSBJU19DT1VOVFJZX0lFX1ZBTElEKF9fcEllZWVEZXYpIChHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZUxlbiA+IDApCi0KLSNkZWZpbmUgSVNfRVFVQUxfQ0lFX1NSQyhfX3BJZWVlRGV2LCBfX3BUYSkgZXFNYWNBZGRyKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllU3JjQWRkciwgX19wVGEpCi0jZGVmaW5lIFVQREFURV9DSUVfU1JDKF9fcEllZWVEZXYsIF9fcFRhKSBjcE1hY0FkZHIoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVTcmNBZGRyLCBfX3BUYSkKLQotI2RlZmluZSBJU19DT1VOVFJZX0lFX0NIQU5HRUQoX19wSWVlZURldiwgX19JZSkgXAotCSgoKF9fSWUpLkxlbmd0aCA9PSAwIHx8IChfX0llKS5MZW5ndGggIT0gR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVMZW4pID8gXAotCUZBTFNFIDogXAotCSghbWVtY21wKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllQnVmLCAoX19JZSkuT2N0ZXQsIChfX0llKS5MZW5ndGgpKSkKLQotI2RlZmluZSBDSUVfV0FUQ0hET0dfVEggMQotI2RlZmluZSBHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpIEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllV2F0Y2hkb2cKLSNkZWZpbmUgUkVTRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpIEdFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikgPSAwCi0jZGVmaW5lIFVQREFURV9DSUVfV0FUQ0hET0coX19wSWVlZURldikgKytHRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpCi0KLSNkZWZpbmUgSVNfRE9UMTFEX1NUQVRFX0RPTkUoX19wSWVlZURldikgKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+U3RhdGUgPT0gRE9UMTFEX1NUQVRFX0RPTkUpCi0KLQotdm9pZAotRG90MTFkX0luaXQoCi0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldgotCSk7Ci0KLXZvaWQKLURvdDExZF9SZXNldCgKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2Ci0JKTsKLQotdm9pZAotRG90MTFkX1VwZGF0ZUNvdW50cnlJZSgKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqZGV2LAotCXU4ICoJCXBUYWRkciwKLQl1MTYJQ291dHJ5SWVMZW4sCi0JdTggKiBwQ291dHJ5SWUKLQkpOwotCi11OAotRE9UMTFEX0dldE1heFR4UHdySW5EYm0oCi0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmRldiwKLQl1OCBDaGFubmVsCi0JKTsKLQotdm9pZAotRE9UMTFEX1NjYW5Db21wbGV0ZSgKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldgotCSk7Ci0KLWludCBJc0xlZ2FsQ2hhbm5lbCgKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqIGRldiwKLQl1OCBjaGFubmVsCi0pOwotCi1pbnQgVG9MZWdhbENoYW5uZWwoCi0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKiBkZXYsCi0JdTggY2hhbm5lbAotKTsKLSNlbmRpZiAvL0VOQUJMRV9ET1QxMUQKLSNlbmRpZiAvLyAjaWZuZGVmIF9fSU5DX0RPVDExRF9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ3OTYzZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYzNiArMCwwIEBACi0vKgotICogTWVyZ2VkIHdpdGggbWFpbmxpbmUgaWVlZTgwMjExLmggaW4gQXVnIDIwMDQuICBPcmlnaW5hbCBpZWVlODAyXzExCi0gKiByZW1haW5zIGNvcHlyaWdodCBieSB0aGUgb3JpZ2luYWwgYXV0aG9ycwotICoKLSAqIFBvcnRpb25zIG9mIHRoZSBtZXJnZWQgY29kZSBhcmUgYmFzZWQgb24gSG9zdCBBUCAoc29mdHdhcmUgd2lyZWxlc3MKLSAqIExBTiBhY2Nlc3MgcG9pbnQpIGRyaXZlciBmb3IgSW50ZXJzaWwgUHJpc20yLzIuNS8zLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyLCBTU0ggQ29tbXVuaWNhdGlvbnMgU2VjdXJpdHkgQ29ycCBhbmQgSm91bmkgTWFsaW5lbgotICogPGprbWFsaW5lQGNjLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+Ci0gKgotICogQWRhcHRpb24gdG8gYSBnZW5lcmljIElFRUUgODAyLjExIHN0YWNrIGJ5IEphbWVzIEtldHJlbm9zCi0gKiA8amtldHJlbm9AbGludXguaW50ZWwuY29tPgotICogQ29weXJpZ2h0IChjKSAyMDA0LCBJbnRlbCBDb3Jwb3JhdGlvbgotICoKLSAqIE1vZGlmaWVkIGZvciBSZWFsdGVrJ3Mgd2ktZmkgY2FyZHMgYnkgQW5kcmVhIE1lcmVsbG8KLSAqIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgotICogbW9yZSBkZXRhaWxzLgotICovCi0jaWZuZGVmIElFRUU4MDIxMV9ICi0jZGVmaW5lIElFRUU4MDIxMV9ICi0jaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4gLyogRVRIX0FMRU4gKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4gICAvKiBBUlJBWV9TSVpFICovCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KLQotI2luY2x1ZGUgInJ0bDgxOXhfSFQuaCIKLSNpbmNsdWRlICJydGw4MTl4X0JBLmgiCi0jaW5jbHVkZSAicnRsODE5eF9UUy5oIgotCi0jaWZuZGVmIElXX01PREVfTU9OSVRPUgotI2RlZmluZSBJV19NT0RFX01PTklUT1IgNgotI2VuZGlmCi0KLSNpZm5kZWYgSVdFVkNVU1RPTQotI2RlZmluZSBJV0VWQ1VTVE9NIDB4OGMwMgotI2VuZGlmCi0KLSNpZm5kZWYgY29udGFpbmVyX29mCi0vKioKLSAqIGNvbnRhaW5lcl9vZiAtIGNhc3QgYSBtZW1iZXIgb2YgYSBzdHJ1Y3R1cmUgb3V0IHRvIHRoZSBjb250YWluaW5nIHN0cnVjdHVyZQotICoKLSAqIEBwdHI6ICAgICAgICB0aGUgcG9pbnRlciB0byB0aGUgbWVtYmVyLgotICogQHR5cGU6ICAgICAgIHRoZSB0eXBlIG9mIHRoZSBjb250YWluZXIgc3RydWN0IHRoaXMgaXMgZW1iZWRkZWQgaW4uCi0gKiBAbWVtYmVyOiAgICAgdGhlIG5hbWUgb2YgdGhlIG1lbWJlciB3aXRoaW4gdGhlIHN0cnVjdC4KLSAqCi0gKi8KLSNkZWZpbmUgY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKSAoeyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNvbnN0IHR5cGVvZiggKCh0eXBlICopMCktPm1lbWJlciApICpfX21wdHIgPSAocHRyKTsgICAgXAotICAgICAgICAodHlwZSAqKSggKGNoYXIgKilfX21wdHIgLSBvZmZzZXRvZih0eXBlLG1lbWJlcikgKTt9KQotI2VuZGlmCi0KLSNkZWZpbmUgS0VZX1RZUEVfTkEJCTB4MAotI2RlZmluZSBLRVlfVFlQRV9XRVA0MCAJCTB4MQotI2RlZmluZSBLRVlfVFlQRV9US0lQCQkweDIKLSNkZWZpbmUgS0VZX1RZUEVfQ0NNUAkJMHg0Ci0jZGVmaW5lIEtFWV9UWVBFX1dFUDEwNAkJMHg1Ci0KLS8qIGFkZGVkIGZvciBydGw4MTl4IHR4IHByb2NlZHVyZSAqLwotI2RlZmluZSBNQVhfUVVFVUVfU0laRQkJMHgxMAotCi0vLwotLy8gODE5MCBxdWV1ZSBtYXBwaW5nCi0vLwotI2RlZmluZSBCS19RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEJFX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgVklfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBWT19RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIEhDQ0FfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgVFhDTURfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQotI2RlZmluZSBNR05UX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIEhJR0hfUVVFVUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKLSNkZWZpbmUgQkVBQ09OX1FVRVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgOAotCi0jZGVmaW5lIExPV19RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFX1FVRVVFCi0jZGVmaW5lIE5PUk1BTF9RVUVVRSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1HTlRfUVVFVUUKLQotLy9hZGRlZCBieSBhbXkgZm9yIHBzCi0jZGVmaW5lIFNXUkZfVElNRU9VVAkJCQk1MAotCi0vL2FkZGVkIGJ5IGFteSBmb3IgTEVBUCByZWxhdGVkCi0jZGVmaW5lIElFX0NJU0NPX0ZMQUdfUE9TSVRJT04JCTB4MDgJLy8gRmxhZyBieXRlOiBieXRlIDgsIG51bWJlcmVkIGZyb20gMC4KLSNkZWZpbmUgU1VQUE9SVF9DS0lQX01JQwkJCTB4MDgJLy8gYml0MwotI2RlZmluZSBTVVBQT1JUX0NLSVBfUEsJCQkweDEwCS8vIGJpdDQKLS8qIGRlZmluZWQgZm9yIHNrYiBjYiBmaWVsZCAqLwotLyogQXQgbW9zdCAyOCBieXRlICovCi10eXBlZGVmIHN0cnVjdCBjYl9kZXNjIHsKLSAgICAgICAgLyogVHggRGVzYyBSZWxhdGVkIGZsYWdzICg4LTkpICovCi0JdTggYkxhc3RJbmlQa3Q6MTsKLQl1OCBiQ21kT3JJbml0OjE7Ci0gICAgICAgIHU4IGJGaXJzdFNlZzoxOwotICAgICAgICB1OCBiTGFzdFNlZzoxOwotICAgICAgICB1OCBiRW5jcnlwdDoxOwotICAgICAgICB1OCBiVHhEaXNhYmxlUmF0ZUZhbGxCYWNrOjE7Ci0gICAgICAgIHU4IGJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZToxOwotICAgICAgICB1OCBiSHdTZWM6MTsgLy9pbmRpY2F0ZSB3aGV0aGVyIHVzZSBIdyBzZWN1cml0eS4gV0IKLQotICAgICAgICB1OCByZXNlcnZlZDE7Ci0KLSAgICAgICAgLyogVHggRmlybXdhcmUgUmVsYWdlZCBmbGFncyAoMTAtMTEpKi8KLSAgICAgICAgdTggYkNUU0VuYWJsZToxOwotICAgICAgICB1OCBiUlRTRW5hYmxlOjE7Ci0gICAgICAgIHU4IGJVc2VTaG9ydEdJOjE7Ci0gICAgICAgIHU4IGJVc2VTaG9ydFByZWFtYmxlOjE7Ci0gICAgICAgIHU4IGJUeEVuYWJsZUZ3Q2FsY0R1cjoxOwotICAgICAgICB1OCBiQU1QRFVFbmFibGU6MTsKLSAgICAgICAgdTggYlJUU1NUQkM6MTsKLSAgICAgICAgdTggUlRTU0M6MTsKLQotICAgICAgICB1OCBiUlRTQlc6MTsKLSAgICAgICAgdTggYlBhY2tldEJXOjE7Ci0JdTggYlJUU1VzZVNob3J0UHJlYW1ibGU6MTsKLQl1OCBiUlRTVXNlU2hvcnRHSToxOwotCXU4IGJNdWx0aWNhc3Q6MTsKLQl1OCBiQnJvYWRjYXN0OjE7Ci0gICAgICAgIC8vdTggcmVzZXJ2ZWQyOjI7Ci0gICAgICAgIHU4IGRydl9hZ2dfZW5hYmxlOjE7Ci0gICAgICAgIHU4IHJlc2VydmVkMjoxOwotCi0gICAgICAgIC8qIFR4IERlc2MgcmVsYXRlZCBlbGVtZW50KDEyLTE5KSAqLwotICAgICAgICB1OCByYXRhX2luZGV4OwotICAgICAgICB1OCBxdWV1ZV9pbmRleDsKLSAgICAgICAgLy91OCByZXNlcnZlZDM7Ci0gICAgICAgIC8vdTggcmVzZXJ2ZWQ0OwotICAgICAgICB1MTYgdHhidWZfc2l6ZTsKLSAgICAgICAgLy91OCByZXNlcnZlZDU7Ci0JdTggUkFUUkluZGV4OwotICAgICAgICB1OCByZXNlcnZlZDY7Ci0gICAgICAgIHU4IHJlc2VydmVkNzsKLSAgICAgICAgdTggcmVzZXJ2ZWQ4OwotCi0gICAgICAgIC8qIFR4IGZpcm13YXJlIHJlbGF0ZWQgZWxlbWVudCgyMC0yNykgKi8KLSAgICAgICAgdTggZGF0YV9yYXRlOwotICAgICAgICB1OCBydHNfcmF0ZTsKLSAgICAgICAgdTggYW1wZHVfZmFjdG9yOwotICAgICAgICB1OCBhbXBkdV9kZW5zaXR5OwotICAgICAgICAvL3U4IHJlc2VydmVkOTsKLSAgICAgICAgLy91OCByZXNlcnZlZDEwOwotICAgICAgICAvL3U4IHJlc2VydmVkMTE7Ci0gICAgICAgIHU4IERydkFnZ3JOdW07Ci0JdTE2IHBrdF9zaXplOwotICAgICAgICB1OCByZXNlcnZlZDEyOwotCi0JdTggYmRoY3A7Ci19Y2JfZGVzYywgKnBjYl9kZXNjOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBNR05fMU0gICAgICAgICAgICAgICAgICAweDAyCi0jZGVmaW5lIE1HTl8yTSAgICAgICAgICAgICAgICAgIDB4MDQKLSNkZWZpbmUgTUdOXzVfNU0gICAgICAgICAgICAgICAgMHgwYgotI2RlZmluZSBNR05fMTFNICAgICAgICAgICAgICAgICAweDE2Ci0KLSNkZWZpbmUgTUdOXzZNICAgICAgICAgICAgICAgICAgMHgwYwotI2RlZmluZSBNR05fOU0gICAgICAgICAgICAgICAgICAweDEyCi0jZGVmaW5lIE1HTl8xMk0gICAgICAgICAgICAgICAgIDB4MTgKLSNkZWZpbmUgTUdOXzE4TSAgICAgICAgICAgICAgICAgMHgyNAotI2RlZmluZSBNR05fMjRNICAgICAgICAgICAgICAgICAweDMwCi0jZGVmaW5lIE1HTl8zNk0gICAgICAgICAgICAgICAgIDB4NDgKLSNkZWZpbmUgTUdOXzQ4TSAgICAgICAgICAgICAgICAgMHg2MAotI2RlZmluZSBNR05fNTRNICAgICAgICAgICAgICAgICAweDZjCi0KLSNkZWZpbmUgTUdOX01DUzAgICAgICAgICAgICAgICAgMHg4MAotI2RlZmluZSBNR05fTUNTMSAgICAgICAgICAgICAgICAweDgxCi0jZGVmaW5lIE1HTl9NQ1MyICAgICAgICAgICAgICAgIDB4ODIKLSNkZWZpbmUgTUdOX01DUzMgICAgICAgICAgICAgICAgMHg4MwotI2RlZmluZSBNR05fTUNTNCAgICAgICAgICAgICAgICAweDg0Ci0jZGVmaW5lIE1HTl9NQ1M1ICAgICAgICAgICAgICAgIDB4ODUKLSNkZWZpbmUgTUdOX01DUzYgICAgICAgICAgICAgICAgMHg4NgotI2RlZmluZSBNR05fTUNTNyAgICAgICAgICAgICAgICAweDg3Ci0jZGVmaW5lIE1HTl9NQ1M4ICAgICAgICAgICAgICAgIDB4ODgKLSNkZWZpbmUgTUdOX01DUzkgICAgICAgICAgICAgICAgMHg4OQotI2RlZmluZSBNR05fTUNTMTAgICAgICAgICAgICAgICAweDhhCi0jZGVmaW5lIE1HTl9NQ1MxMSAgICAgICAgICAgICAgIDB4OGIKLSNkZWZpbmUgTUdOX01DUzEyICAgICAgICAgICAgICAgMHg4YwotI2RlZmluZSBNR05fTUNTMTMgICAgICAgICAgICAgICAweDhkCi0jZGVmaW5lIE1HTl9NQ1MxNCAgICAgICAgICAgICAgIDB4OGUKLSNkZWZpbmUgTUdOX01DUzE1ICAgICAgICAgICAgICAgMHg4ZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCQk4MDIuMTEgTWFuYWdlbWVudCBmcmFtZSBSZWFzb24gQ29kZSBmaWVsZAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1lbnVtCV9SZWFzb25Db2RlewotCXVuc3BlY19yZWFzb24JPSAweDEsCi0JYXV0aF9ub3RfdmFsaWQJPSAweDIsCi0JZGVhdXRoX2x2X3NzCT0gMHgzLAotCWluYWN0aXZpdHkJCT0gMHg0LAotCWFwX292ZXJsb2FkIAk9IDB4NSwKLQljbGFzczJfZXJyCQk9IDB4NiwKLQljbGFzczNfZXJyCQk9IDB4NywKLQlkaXNhc19sdl9zcyAJPSAweDgsCi0JYXNvY19ub3RfYXV0aAk9IDB4OSwKLQotCS8vLS0tLU1JQ19DSEVDSwotCW1pY19mYWlsdXJlIAk9IDB4ZSwKLQkvLy0tLS1FTkQgTUlDX0NIRUNLCi0KLQkvLyBSZWFzb24gY29kZSBkZWZpbmVkIGluIDgwMi4xMWkgRDEwLjAgcC4yOC4KLQlpbnZhbGlkX0lFCQk9IDB4MGQsCi0JZm91cl93YXlfdG1vdXQJPSAweDBmLAotCXR3b193YXlfdG1vdXQJPSAweDEwLAotCUlFX2Rpc21hdGNoIAk9IDB4MTEsCi0JaW52YWxpZF9HY2lwaGVyID0gMHgxMiwKLQlpbnZhbGlkX1BjaXBoZXIgPSAweDEzLAotCWludmFsaWRfQUtNUAk9IDB4MTQsCi0JdW5zdXBfUlNOSUV2ZXIgPSAweDE1LAotCWludmFsaWRfUlNOSUUJPSAweDE2LAotCWF1dGhfODAyXzF4X2ZhaWw9IDB4MTcsCi0JY2lwZXJfcmVqZWN0CQk9IDB4MTgsCi0KLQkvLyBSZWFzb24gY29kZSBkZWZpbmVkIGluIDcuMy4xLjcsIDgwMi4xZSBEMTMuMCwgcC40Mi4gQWRkZWQgYnkgQW5uaWUsIDIwMDUtMTEtMTUuCi0JUW9TX3Vuc3BlYwkJPSAweDIwLCAvLyAzMgotCVFBUF9iYW5kd2lkdGgJPSAweDIxLCAvLyAzMwotCXBvb3JfY29uZGl0aW9uCT0gMHgyMiwgLy8gMzQKLQlub19mYWNpbGl0eSAJPSAweDIzLCAvLyAzNQotCQkJCQkJCS8vIFdoZXJlIGlzIDM2Pz8/Ci0JcmVxX2RlY2xpbmVkCT0gMHgyNSwgLy8gMzcKLQlpbnZhbGlkX3BhcmFtCT0gMHgyNiwgLy8gMzgKLQlyZXFfbm90X2hvbm9yZWQ9IDB4MjcsCS8vIDM5Ci0JVFNfbm90X2NyZWF0ZWQJPSAweDJGLCAvLyA0NwotCURMX25vdF9hbGxvd2VkCT0gMHgzMCwgLy8gNDgKLQlkZXN0X25vdF9leGlzdAk9IDB4MzEsIC8vIDQ5Ci0JZGVzdF9ub3RfUVNUQQk9IDB4MzIsIC8vIDUwCi19OwotCi0KLQotI2RlZmluZSBhU2lmc1RpbWUJICgoKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0gSUVFRV9BKXx8KHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0gSUVFRV9OXzI0Ryl8fChwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5tb2RlID09IElFRUVfTl81RykpPyAxNiA6IDEwKQotCi0jZGVmaW5lIE1HTVRfUVVFVUVfTlVNIDUKLQotI2RlZmluZSBJRUVFX0NNRF9TRVRfV1BBX1BBUkFNCQkJMQotI2RlZmluZQlJRUVFX0NNRF9TRVRfV1BBX0lFCQkJMgotI2RlZmluZSBJRUVFX0NNRF9TRVRfRU5DUllQVElPTgkJCTMKLSNkZWZpbmUgSUVFRV9DTURfTUxNRQkJCQk0Ci0KLSNkZWZpbmUgSUVFRV9QQVJBTV9XUEFfRU5BQkxFRAkJCTEKLSNkZWZpbmUgSUVFRV9QQVJBTV9US0lQX0NPVU5URVJNRUFTVVJFUwkJMgotI2RlZmluZSBJRUVFX1BBUkFNX0RST1BfVU5FTkNSWVBURUQJCTMKLSNkZWZpbmUgSUVFRV9QQVJBTV9QUklWQUNZX0lOVk9LRUQJCTQKLSNkZWZpbmUgSUVFRV9QQVJBTV9BVVRIX0FMR1MJCQk1Ci0jZGVmaW5lIElFRUVfUEFSQU1fSUVFRV84MDJfMVgJCQk2Ci0vL0l0IHNob3VsZCBjb25zaXN0ZW50IHdpdGggdGhlIGRyaXZlcl9YWFguYwotLy8gICBEYXZpZCwgMjAwNi45LjI2Ci0jZGVmaW5lIElFRUVfUEFSQU1fV1BBWF9TRUxFQ1QJCQk3Ci0vL0FkZGVkIGZvciBub3RpZnkgdGhlIGVuY3J5cHRpb24gdHlwZSBzZWxlY3Rpb24KLS8vICAgRGF2aWQsIDIwMDYuOS4yNgotI2RlZmluZSBJRUVFX1BST1RPX1dQQQkJCQkxCi0jZGVmaW5lIElFRUVfUFJPVE9fUlNOCQkJCTIKLS8vQWRkZWQgZm9yIG5vdGlmeSB0aGUgZW5jcnlwdGlvbiB0eXBlIHNlbGVjdGlvbgotLy8gICBEYXZpZCwgMjAwNi45LjI2Ci0jZGVmaW5lIElFRUVfV1BBWF9VU0VHUk9VUAkJCTAKLSNkZWZpbmUgSUVFRV9XUEFYX1dFUDQwCQkJCTEKLSNkZWZpbmUgSUVFRV9XUEFYX1RLSVAJCQkJMgotI2RlZmluZSBJRUVFX1dQQVhfV1JBUCAgIAkJCTMKLSNkZWZpbmUgSUVFRV9XUEFYX0NDTVAJCQkJNAotI2RlZmluZSBJRUVFX1dQQVhfV0VQMTA0CQkJNQotCi0jZGVmaW5lIElFRUVfS0VZX01HTVRfSUVFRTgwMjFYCQkJMQotI2RlZmluZSBJRUVFX0tFWV9NR01UX1BTSwkJCTIKLQotI2RlZmluZSBJRUVFX01MTUVfU1RBX0RFQVVUSAkJCTEKLSNkZWZpbmUgSUVFRV9NTE1FX1NUQV9ESVNBU1NPQwkJCTIKLQotCi0jZGVmaW5lIElFRUVfQ1JZUFRfRVJSX1VOS05PV05fQUxHCQkyCi0jZGVmaW5lIElFRUVfQ1JZUFRfRVJSX1VOS05PV05fQUREUgkJMwotI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9DUllQVF9JTklUX0ZBSUxFRAk0Ci0jZGVmaW5lIElFRUVfQ1JZUFRfRVJSX0tFWV9TRVRfRkFJTEVECQk1Ci0jZGVmaW5lIElFRUVfQ1JZUFRfRVJSX1RYX0tFWV9TRVRfRkFJTEVECTYKLSNkZWZpbmUgSUVFRV9DUllQVF9FUlJfQ0FSRF9DT05GX0ZBSUxFRAkJNwotCi0KLSNkZWZpbmUJSUVFRV9DUllQVF9BTEdfTkFNRV9MRU4JCQkxNgotCi0jZGVmaW5lIE1BWF9JRV9MRU4gIDB4ZmYKLQotLy8gYWRkZWQgZm9yIGtlcm5lbCBjb25mbGljdAotI2RlZmluZSBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMgCWllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllc19yc2wKLSNkZWZpbmUgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyIAlpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXJfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdCAJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0X3JzbAotI2RlZmluZSBpZWVlODAyMTFfcmVnaXN0ZXJfY3J5cHRvX29wcyAgCWllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzX3JzbAotI2RlZmluZSBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzIGllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHNfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyAJaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzX3JzbAotCi0jZGVmaW5lIGllZWU4MDIxMV9jY21wX251bGwJCWllZWU4MDIxMV9jY21wX251bGxfcnNsCi0KLSNkZWZpbmUgaWVlZTgwMjExX3RraXBfbnVsbAkJaWVlZTgwMjExX3RraXBfbnVsbF9yc2wKLQotI2RlZmluZSBpZWVlODAyMTFfd2VwX251bGwJCWllZWU4MDIxMV93ZXBfbnVsbF9yc2wKLQotI2RlZmluZSBmcmVlX2llZWU4MDIxMSAgICAgICAgICAJZnJlZV9pZWVlODAyMTFfcnNsCi0jZGVmaW5lIGFsbG9jX2llZWU4MDIxMSAgICAgICAgCQlhbGxvY19pZWVlODAyMTFfcnNsCi0KLSNkZWZpbmUgaWVlZTgwMjExX3J4IAkJCWllZWU4MDIxMV9yeF9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3J4X21ndAkJaWVlZTgwMjExX3J4X21ndF9yc2wKLQotI2RlZmluZSBpZWVlODAyMTFfZ2V0X2JlYWNvbgkJaWVlZTgwMjExX2dldF9iZWFjb25fcnNsCi0jZGVmaW5lIGllZWU4MDIxMV9ydGxfd2FrZV9xdWV1ZQkJaWVlZTgwMjExX3J0bF93YWtlX3F1ZXVlX3JzbAotI2RlZmluZSBpZWVlODAyMTFfcnRsX3N0b3BfcXVldWUJCWllZWU4MDIxMV9ydGxfc3RvcF9xdWV1ZV9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3Jlc2V0X3F1ZXVlCQlpZWVlODAyMTFfcmVzZXRfcXVldWVfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wJaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbF9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2wgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2xfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV9pc19zaG9ydHNsb3QJCWllZWU4MDIxMV9pc19zaG9ydHNsb3RfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV9pc181NGcJCWllZWU4MDIxMV9pc181NGdfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bAlpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGxfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV9wc190eF9hY2sJCWllZWU4MDIxMV9wc190eF9hY2tfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV9zb2Z0bWFjX3htaXQJCWllZWU4MDIxMV9zb2Z0bWFjX3htaXRfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucwlpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnNfcnNsCi0jZGVmaW5lIG5vdGlmeV93eF9hc3NvY19ldmVudAkJbm90aWZ5X3d4X2Fzc29jX2V2ZW50X3JzbAotI2RlZmluZSBTZW5kRGlzYXNzb2NpYXRpb24JCVNlbmREaXNhc3NvY2lhdGlvbl9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZQkJaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZV9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucwlpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zX3JzbAotI2RlZmluZSBpZWVlODAyMTFfc3RvcF9zY2FuCQlpZWVlODAyMTFfc3RvcF9zY2FuX3JzbAotI2RlZmluZSBpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0cwlpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0c19yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9zeW5jcm8JaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9zeW5jcm9fcnNsCi0jZGVmaW5lIGllZWU4MDIxMV9zdGFydF9zY2FuX3N5bmNybwlpZWVlODAyMTFfc3RhcnRfc2Nhbl9zeW5jcm9fcnNsCi0KLSNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9lc3NpZAkJaWVlZTgwMjExX3d4X2dldF9lc3NpZF9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9lc3NpZAkJaWVlZTgwMjExX3d4X3NldF9lc3NpZF9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9yYXRlCQlpZWVlODAyMTFfd3hfc2V0X3JhdGVfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfcmF0ZQkJaWVlZTgwMjExX3d4X2dldF9yYXRlX3JzbAotI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3dhcAkJaWVlZTgwMjExX3d4X3NldF93YXBfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfd2FwCQlpZWVlODAyMTFfd3hfZ2V0X3dhcF9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9tb2RlCQlpZWVlODAyMTFfd3hfc2V0X21vZGVfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfbW9kZQkJaWVlZTgwMjExX3d4X2dldF9tb2RlX3JzbAotI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3NjYW4JCWllZWU4MDIxMV93eF9zZXRfc2Nhbl9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9mcmVxCQlpZWVlODAyMTFfd3hfZ2V0X2ZyZXFfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZnJlcQkJaWVlZTgwMjExX3d4X3NldF9mcmVxX3JzbAotI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X3Jhd3R4CQlpZWVlODAyMTFfd3hfc2V0X3Jhd3R4X3JzbAotI2RlZmluZSBpZWVlODAyMTFfd3hfZ2V0X25hbWUJCWllZWU4MDIxMV93eF9nZXRfbmFtZV9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9wb3dlcgkJaWVlZTgwMjExX3d4X3NldF9wb3dlcl9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9wb3dlcgkJaWVlZTgwMjExX3d4X2dldF9wb3dlcl9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXMJaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfcnRzCQlpZWVlODAyMTFfd3hfc2V0X3J0c19yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9ydHMJCWllZWU4MDIxMV93eF9nZXRfcnRzX3JzbAotCi0jZGVmaW5lIGllZWU4MDIxMV90eGJfZnJlZQkJaWVlZTgwMjExX3R4Yl9mcmVlX3JzbAotCi0jZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZ2VuX2llCQlpZWVlODAyMTFfd3hfc2V0X2dlbl9pZV9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9zY2FuCQlpZWVlODAyMTFfd3hfZ2V0X3NjYW5fcnNsCi0jZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZW5jb2RlCQlpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3d4X2dldF9lbmNvZGUJCWllZWU4MDIxMV93eF9nZXRfZW5jb2RlX3JzbAotI2RlZmluZSBpZWVlODAyMTFfd3hfc2V0X21sbWUJCWllZWU4MDIxMV93eF9zZXRfbWxtZV9yc2wKLSNkZWZpbmUgaWVlZTgwMjExX3d4X3NldF9hdXRoCQlpZWVlODAyMTFfd3hfc2V0X2F1dGhfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV93eF9zZXRfZW5jb2RlX2V4dAlpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9leHRfcnNsCi0jZGVmaW5lIGllZWU4MDIxMV93eF9nZXRfZW5jb2RlX2V4dAlpZWVlODAyMTFfd3hfZ2V0X2VuY29kZV9leHRfcnNsCi0KLQotdHlwZWRlZiBzdHJ1Y3QgaWVlZV9wYXJhbSB7Ci0JdTMyIGNtZDsKLQl1OCBzdGFfYWRkcltFVEhfQUxFTl07Ci0gICAgICAgIHVuaW9uIHsKLQkJc3RydWN0IHsKLQkJCXU4IG5hbWU7Ci0JCQl1MzIgdmFsdWU7Ci0JCX0gd3BhX3BhcmFtOwotCQlzdHJ1Y3QgewotCQkJdTMyIGxlbjsKLQkJCXU4IHJlc2VydmVkWzMyXTsKLQkJCXU4IGRhdGFbMF07Ci0JCX0gd3BhX2llOwotCSAgICAgICAgc3RydWN0ewotCQkJaW50IGNvbW1hbmQ7Ci0gICAgCQkJaW50IHJlYXNvbl9jb2RlOwotCQl9IG1sbWU7Ci0JCXN0cnVjdCB7Ci0JCQl1OCBhbGdbSUVFRV9DUllQVF9BTEdfTkFNRV9MRU5dOwotCQkJdTggc2V0X3R4OwotCQkJdTMyIGVycjsKLQkJCXU4IGlkeDsKLQkJCXU4IHNlcVs4XTsgLyogc2VxdWVuY2UgY291bnRlciAoc2V0OiBSWCwgZ2V0OiBUWCkgKi8KLQkJCXUxNiBrZXlfbGVuOwotCQkJdTgga2V5WzBdOwotCQl9IGNyeXB0OwotCX0gdTsKLX1pZWVlX3BhcmFtOwotCi0KLS8vIGxpbnV4IHVuZGVyIDIuNi45IHJlbGVhc2UgbWF5IG5vdCBzdXBwb3J0IGl0LCBzbyBtb2RpZnkgaXQgZm9yIGNvbW1vbiB1c2UKLSNkZWZpbmUgTVNFQ1ModCkgbXNlY3NfdG9famlmZmllcyh0KQotI2RlZmluZSBtc2xlZXBfaW50ZXJydXB0aWJsZV9yc2wgIG1zbGVlcF9pbnRlcnJ1cHRpYmxlCi0KLSNkZWZpbmUgSUVFRTgwMjExX0RBVEFfTEVOCQkyMzA0Ci0vKiBNYXhpbXVtIHNpemUgZm9yIHRoZSBNQS1VTklUREFUQSBwcmltaXRpdmUsIDgwMi4xMSBzdGFuZGFyZCBzZWN0aW9uCi0gICA2LjIuMS4xLjIuCi0KLSAgIFRoZSBmaWd1cmUgaW4gc2VjdGlvbiA3LjEuMiBzdWdnZXN0cyBhIGJvZHkgc2l6ZSBvZiB1cCB0byAyMzEyCi0gICBieXRlcyBpcyBhbGxvd2VkLCB3aGljaCBpcyBhIGJpdCBjb25mdXNpbmcsIEkgc3VzcGVjdCB0aGlzCi0gICByZXByZXNlbnRzIHRoZSAyMzA0IGJ5dGVzIG9mIHJlYWwgZGF0YSwgcGx1cyBhIHBvc3NpYmxlIDggYnl0ZXMgb2YKLSAgIFdFUCBJViBhbmQgSUNWLiAodGhpcyBpbnRlcnByZXRhdGlvbiBzdWdnZXN0ZWQgYnkgUmFtaXJvIEJhcnJlaXJvKSAqLwotI2RlZmluZSBJRUVFODAyMTFfMUFERFJfTEVOIDEwCi0jZGVmaW5lIElFRUU4MDIxMV8yQUREUl9MRU4gMTYKLSNkZWZpbmUgSUVFRTgwMjExXzNBRERSX0xFTiAyNAotI2RlZmluZSBJRUVFODAyMTFfNEFERFJfTEVOIDMwCi0jZGVmaW5lIElFRUU4MDIxMV9GQ1NfTEVOICAgIDQKLSNkZWZpbmUgSUVFRTgwMjExX0hMRU4gICAgICAgICAgICAgICAgICAoSUVFRTgwMjExXzRBRERSX0xFTikKLSNkZWZpbmUgSUVFRTgwMjExX0ZSQU1FX0xFTiAgICAgICAgICAgICAoSUVFRTgwMjExX0RBVEFfTEVOICsgSUVFRTgwMjExX0hMRU4pCi0jZGVmaW5lIElFRUU4MDIxMV9NR01UX0hEUl9MRU4gMjQKLSNkZWZpbmUgSUVFRTgwMjExX0RBVEFfSERSM19MRU4gMjQKLSNkZWZpbmUgSUVFRTgwMjExX0RBVEFfSERSNF9MRU4gMzAKLQotI2RlZmluZSBNSU5fRlJBR19USFJFU0hPTEQgICAgIDI1NlUKLSNkZWZpbmUgTUFYX0ZSQUdfVEhSRVNIT0xEICAgICAyMzQ2VQotCi0KLS8qIEZyYW1lIGNvbnRyb2wgZmllbGQgY29uc3RhbnRzICovCi0jZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1ZFUlMJCTB4MDAwMwotI2RlZmluZSBJRUVFODAyMTFfRkNUTF9GVFlQRQkJMHgwMDBjCi0jZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1NUWVBFCQkweDAwZjAKLSNkZWZpbmUgSUVFRTgwMjExX0ZDVExfRlJBTUVUWVBFCTB4MDBmYwotI2RlZmluZSBJRUVFODAyMTFfRkNUTF9UT0RTCQkweDAxMDAKLSNkZWZpbmUgSUVFRTgwMjExX0ZDVExfRlJPTURTCQkweDAyMDAKLSNkZWZpbmUgSUVFRTgwMjExX0ZDVExfRFNUT0RTCQkweDAzMDAgLy9hZGRlZCBieSBkYXZpZAotI2RlZmluZSBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MJMHgwNDAwCi0jZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1JFVFJZCQkweDA4MDAKLSNkZWZpbmUgSUVFRTgwMjExX0ZDVExfUE0JCTB4MTAwMAotI2RlZmluZSBJRUVFODAyMTFfRkNUTF9NT1JFREFUQQkJMHgyMDAwCi0jZGVmaW5lIElFRUU4MDIxMV9GQ1RMX1dFUAkJMHg0MDAwCi0jZGVmaW5lIElFRUU4MDIxMV9GQ1RMX09SREVSCQkweDgwMDAKLQotI2RlZmluZSBJRUVFODAyMTFfRlRZUEVfTUdNVAkJMHgwMDAwCi0jZGVmaW5lIElFRUU4MDIxMV9GVFlQRV9DVEwJCTB4MDAwNAotI2RlZmluZSBJRUVFODAyMTFfRlRZUEVfREFUQQkJMHgwMDA4Ci0KLS8qIG1hbmFnZW1lbnQgKi8KLSNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFUQkweDAwMDAKLSNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1AgCTB4MDAxMAotI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVEJMHgwMDIwCi0jZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFU1AJMHgwMDMwCi0jZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVEJMHgwMDQwCi0jZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQCTB4MDA1MAotI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OCQkweDAwODAKLSNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0FUSU0JCTB4MDA5MAotI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfRElTQVNTT0MJMHgwMEEwCi0jZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BVVRICQkweDAwQjAKLSNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RFQVVUSAkJMHgwMEMwCi0jZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9NQU5BR0VfQUNUCTB4MDBEMAotCi0vKiBjb250cm9sICovCi0jZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9QU1BPTEwJCTB4MDBBMAotI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUlRTCQkweDAwQjAKLSNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0NUUwkJMHgwMEMwCi0jZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9BQ0sJCTB4MDBEMAotI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZFTkQJCTB4MDBFMAotI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZFTkRBQ0sJMHgwMEYwCi0jZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9CTE9DS0FDSyAgIDB4MDA5NAotCi0vKiBkYXRhICovCi0jZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBCQkweDAwMDAKLSNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0sJMHgwMDEwCi0jZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGUE9MTAkweDAwMjAKLSNkZWZpbmUgSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0tQT0xMCTB4MDAzMAotI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfTlVMTEZVTkMJMHgwMDQwCi0jZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRkFDSwkJMHgwMDUwCi0jZGVmaW5lIElFRUU4MDIxMV9TVFlQRV9DRlBPTEwJCTB4MDA2MAotI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfQ0ZBQ0tQT0xMCTB4MDA3MAotI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEEJMHgwMDgwIC8vYWRkZWQgZm9yIFdNTSAyMDA2LzgvMgotI2RlZmluZSBJRUVFODAyMTFfU1RZUEVfUU9TX05VTEwJMHgwMEMwCi0KLSNkZWZpbmUgSUVFRTgwMjExX1NDVExfRlJBRwkJMHgwMDBGCi0jZGVmaW5lIElFRUU4MDIxMV9TQ1RMX1NFUQkJMHhGRkYwCi0KLS8qIFFPUyBjb250cm9sICovCi0jZGVmaW5lIElFRUU4MDIxMV9RQ1RMX1RJRCAgICAgICAgICAgICAgMHgwMDBGCi0KLSNkZWZpbmUJRkNfUU9TX0JJVAkJCQkJQklUNwotI2RlZmluZSBJc0RhdGFGcmFtZShwZHUpCQkJKCAoKHBkdVswXSAmIDB4MEMpPT0weDA4KSA/IHRydWUgOiBmYWxzZSApCi0jZGVmaW5lCUlzTGVnYWN5RGF0YUZyYW1lKHBkdSkJKElzRGF0YUZyYW1lKHBkdSkgJiYgKCEocGR1WzBdJkZDX1FPU19CSVQpKSApCi0vL2FkZGVkIGJ5IHdiLiBJcyB0aGlzIHJpZ2h0PwotI2RlZmluZSBJc1FvU0RhdGFGcmFtZShwZnJhbWUpICAoKCoodTE2KilwZnJhbWUmKElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQXxJRUVFODAyMTFfRlRZUEVfREFUQSkpID09IChJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEF8SUVFRTgwMjExX0ZUWVBFX0RBVEEpKQotI2RlZmluZSBGcmFtZV9PcmRlcihwZnJhbWUpICAgICAoKih1MTYqKXBmcmFtZSZJRUVFODAyMTFfRkNUTF9PUkRFUikKLSNkZWZpbmUgU05fTEVTUyhhLCBiKQkJKCgoYS1iKSYweDgwMCkhPTApCi0jZGVmaW5lIFNOX0VRVUFMKGEsIGIpCShhID09IGIpCi0jZGVmaW5lIE1BWF9ERVZfQUREUl9TSVpFIDgKLXR5cGVkZWYgZW51bSBfQUNUX0NBVEVHT1JZewotICAgICAgICBBQ1RfQ0FUX1FPUyA9IDEsCi0gICAgICAgIEFDVF9DQVRfRExTID0gMiwKLSAgICAgICAgQUNUX0NBVF9CQSAgPSAzLAotICAgICAgICBBQ1RfQ0FUX0hUICA9IDcsCi0gICAgICAgIEFDVF9DQVRfV01NID0gMTcsCi19IEFDVF9DQVRFR09SWSwgKlBBQ1RfQ0FURUdPUlk7Ci0KLXR5cGVkZWYgZW51bSBfVFNfQUNUSU9OewotICAgICAgICBBQ1RfQUREVFNSRVEgPSAwLAotICAgICAgICBBQ1RfQUREVFNSU1AgPSAxLAotICAgICAgICBBQ1RfREVMVFMgICAgPSAyLAotICAgICAgICBBQ1RfU0NIRURVTEUgPSAzLAotfSBUU19BQ1RJT04sICpQVFNfQUNUSU9OOwotCi10eXBlZGVmIGVudW0gX0JBX0FDVElPTnsKLSAgICAgICAgQUNUX0FEREJBUkVRID0gMCwKLSAgICAgICAgQUNUX0FEREJBUlNQID0gMSwKLSAgICAgICAgQUNUX0RFTEJBICAgID0gMiwKLX0gQkFfQUNUSU9OLCAqUEJBX0FDVElPTjsKLQotdHlwZWRlZiBlbnVtIF9Jbml0aWFsR2Fpbk9wVHlwZXsKLQlJR19CYWNrdXA9MCwKLQlJR19SZXN0b3JlLAotCUlHX01heAotfUluaXRpYWxHYWluT3BUeXBlOwotCi0vKiBkZWJ1ZyBtYWNyb3MgKi8KLSNkZWZpbmUgQ09ORklHX0lFRUU4MDIxMV9ERUJVRwotI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKLWV4dGVybiB1MzIgaWVlZTgwMjExX2RlYnVnX2xldmVsOwotI2RlZmluZSBJRUVFODAyMTFfREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgXAotZG8geyBpZiAoaWVlZTgwMjExX2RlYnVnX2xldmVsICYgKGxldmVsKSkgXAotICBwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExOiAiIGZtdCwgIyMgYXJncyk7IH0gd2hpbGUgKDApCi0vL3diIGFkZGVkIHRvIGRlYnVnIG91dCBkYXRhIGJ1ZgotLy9pZiB5b3Ugd2FudCBwcmludCBEQVRBIGJ1ZmZlciByZWxhdGVkIEJBLCBwbGVhc2Ugc2V0IGllZWU4MDIxMV9kZWJ1Z19sZXZlbCB0byBEQVRBfEJBCi0jZGVmaW5lIElFRUU4MDIxMV9ERUJVR19EQVRBKGxldmVsLCBkYXRhLCBkYXRhbGVuKQlcCi0JZG97IGlmICgoaWVlZTgwMjExX2RlYnVnX2xldmVsICYgKGxldmVsKSkgPT0gKGxldmVsKSkJXAotCQl7IAlcCi0JCQlpbnQgaTsJCQkJCVwKLQkJCXU4KiBwZGF0YSA9ICh1OCopIGRhdGE7CQkJXAotCQkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMTogJXMoKVxuIiwgX19GVU5DVElPTl9fKTsJXAotCQkJZm9yKGk9MDsgaTwoaW50KShkYXRhbGVuKTsgaSsrKQkJCVwKLQkJCXsJCQkJCQlcCi0JCQkJcHJpbnRrKCIlMnggIiwgcGRhdGFbaV0pOwkJXAotCQkJCWlmICgoaSsxKSUxNiA9PSAwKSBwcmludGsoIlxuIik7CVwKLQkJCX0JCQkJXAotCQkJcHJpbnRrKCJcbiIpOwkJCVwKLQkJfQkJCQkJXAotCX0gd2hpbGUgKDApCi0jZWxzZQotI2RlZmluZSBJRUVFODAyMTFfREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgZG8ge30gd2hpbGUgKDApCi0jZGVmaW5lIElFRUU4MDIxMV9ERUJVR19EQVRBKGxldmVsLCBkYXRhLCBkYXRhbGVuKSBkbyB7fSB3aGlsZSgwKQotI2VuZGlmCS8qIENPTkZJR19JRUVFODAyMTFfREVCVUcgKi8KLQotLyogZGVidWcgbWFjcm9zIG5vdCBkZXBlbmRlbnQgb24gQ09ORklHX0lFRUU4MDIxMV9ERUJVRyAqLwotCi0vKgotICogVG8gdXNlIHRoZSBkZWJ1ZyBzeXN0ZW07Ci0gKgotICogSWYgeW91IGFyZSBkZWZpbmluZyBhIG5ldyBkZWJ1ZyBjbGFzc2lmaWNhdGlvbiwgc2ltcGx5IGFkZCBpdCB0byB0aGUgI2RlZmluZQotICogbGlzdCBoZXJlIGluIHRoZSBmb3JtIG9mOgotICoKLSAqICNkZWZpbmUgSUVFRTgwMjExX0RMX3h4eHggVkFMVUUKLSAqCi0gKiBzaGlmdGluZyB2YWx1ZSB0byB0aGUgbGVmdCBvbmUgYml0IGZyb20gdGhlIHByZXZpb3VzIGVudHJ5LiAgeHh4eCBzaG91bGQgYmUKLSAqIHRoZSBuYW1lIG9mIHRoZSBjbGFzc2lmaWNhdGlvbiAoZm9yIGV4YW1wbGUsIFdFUCkKLSAqCi0gKiBZb3UgdGhlbiBuZWVkIHRvIGVpdGhlciBhZGQgYSBJRUVFODAyMTFfeHh4eF9ERUJVRygpIG1hY3JvIGRlZmluaXRpb24gZm9yIHlvdXIKLSAqIGNsYXNzaWZpY2F0aW9uLCBvciB1c2UgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF94eHh4LCAuLi4pIHdoZW5ldmVyIHlvdSB3YW50Ci0gKiB0byBzZW5kIG91dHB1dCB0byB0aGF0IGNsYXNzaWZpY2F0aW9uLgotICoKLSAqIFRvIGFkZCB5b3VyIGRlYnVnIGxldmVsIHRvIHRoZSBsaXN0IG9mIGxldmVscyBzZWVuIHdoZW4geW91IHBlcmZvcm0KLSAqCi0gKiAlIGNhdCAvcHJvYy9uZXQvaXB3L2RlYnVnX2xldmVsCi0gKgotICogeW91IHNpbXBseSBuZWVkIHRvIGFkZCB5b3VyIGVudHJ5IHRvIHRoZSBpcHdfZGVidWdfbGV2ZWxzIGFycmF5LgotICoKLSAqIElmIHlvdSBkbyBub3Qgc2VlIGRlYnVnX2xldmVsIGluIC9wcm9jL25ldC9pcHcgdGhlbiB5b3UgZG8gbm90IGhhdmUKLSAqIENPTkZJR19JRUVFODAyMTFfREVCVUcgZGVmaW5lZCBpbiB5b3VyIGtlcm5lbCBjb25maWd1cmF0aW9uCi0gKgotICovCi0KLSNkZWZpbmUgSUVFRTgwMjExX0RMX0lORk8gICAgICAgICAgKDE8PDApCi0jZGVmaW5lIElFRUU4MDIxMV9ETF9XWCAgICAgICAgICAgICgxPDwxKQotI2RlZmluZSBJRUVFODAyMTFfRExfU0NBTiAgICAgICAgICAoMTw8MikKLSNkZWZpbmUgSUVFRTgwMjExX0RMX1NUQVRFICAgICAgICAgKDE8PDMpCi0jZGVmaW5lIElFRUU4MDIxMV9ETF9NR01UICAgICAgICAgICgxPDw0KQotI2RlZmluZSBJRUVFODAyMTFfRExfRlJBRyAgICAgICAgICAoMTw8NSkKLSNkZWZpbmUgSUVFRTgwMjExX0RMX0VBUCAgICAgICAgICAgKDE8PDYpCi0jZGVmaW5lIElFRUU4MDIxMV9ETF9EUk9QICAgICAgICAgICgxPDw3KQotCi0jZGVmaW5lIElFRUU4MDIxMV9ETF9UWCAgICAgICAgICAgICgxPDw4KQotI2RlZmluZSBJRUVFODAyMTFfRExfUlggICAgICAgICAgICAoMTw8OSkKLQotI2RlZmluZSBJRUVFODAyMTFfRExfSFQJCSAgICgxPDwxMCkgIC8vSFQKLSNkZWZpbmUgSUVFRTgwMjExX0RMX0JBCQkgICAoMTw8MTEpICAvL2JhCi0jZGVmaW5lIElFRUU4MDIxMV9ETF9UUwkJICAgKDE8PDEyKSAgLy9UUwotI2RlZmluZSBJRUVFODAyMTFfRExfUU9TICAgICAgICAgICAoMTw8MTMpCi0jZGVmaW5lIElFRUU4MDIxMV9ETF9SRU9SREVSCSAgICgxPDwxNCkKLSNkZWZpbmUgSUVFRTgwMjExX0RMX0lPVAkgICAoMTw8MTUpCi0jZGVmaW5lIElFRUU4MDIxMV9ETF9JUFMJICAgKDE8PDE2KQotI2RlZmluZSBJRUVFODAyMTFfRExfVFJBQ0UJICAgKDE8PDI5KSAgLy90cmFjZSBmdW5jdGlvbiwgbmVlZCB0byB1c2VyIG5ldF9yYXRlbGltaXQoKSB0b2dldGhlciBpbiBvcmRlciBub3QgdG8gcHJpbnQgdG9vIG11Y2ggdG8gdGhlIHNjcmVlbgotI2RlZmluZSBJRUVFODAyMTFfRExfREFUQQkgICAoMTw8MzApICAgLy91c2UgdGhpcyBmbGFnIHRvIGNvbnRyb2wgd2hldGhlciBwcmludCBkYXRhIGJ1ZiBvdXQuCi0jZGVmaW5lIElFRUU4MDIxMV9ETF9FUlIJICAgKDE8PDMxKSAgIC8vYWx3YXlzIG9wZW4KLSNkZWZpbmUgSUVFRTgwMjExX0VSUk9SKGYsIGEuLi4pIHByaW50ayhLRVJOX0VSUiAiaWVlZTgwMjExOiAiIGYsICMjIGEpCi0jZGVmaW5lIElFRUU4MDIxMV9XQVJOSU5HKGYsIGEuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgImllZWU4MDIxMTogIiBmLCAjIyBhKQotI2RlZmluZSBJRUVFODAyMTFfREVCVUdfSU5GTyhmLCBhLi4uKSAgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSU5GTywgZiwgIyMgYSkKLQotI2RlZmluZSBJRUVFODAyMTFfREVCVUdfV1goZiwgYS4uLikgICAgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfV1gsIGYsICMjIGEpCi0jZGVmaW5lIElFRUU4MDIxMV9ERUJVR19TQ0FOKGYsIGEuLi4pICAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9TQ0FOLCBmLCAjIyBhKQotI2RlZmluZSBJRUVFODAyMTFfREVCVUdfU1RBVEUoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfU1RBVEUsIGYsICMjIGEpCi0jZGVmaW5lIElFRUU4MDIxMV9ERUJVR19NR01UKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX01HTVQsIGYsICMjIGEpCi0jZGVmaW5lIElFRUU4MDIxMV9ERUJVR19GUkFHKGYsIGEuLi4pICBJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0ZSQUcsIGYsICMjIGEpCi0jZGVmaW5lIElFRUU4MDIxMV9ERUJVR19FQVAoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRUFQLCBmLCAjIyBhKQotI2RlZmluZSBJRUVFODAyMTFfREVCVUdfRFJPUChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9EUk9QLCBmLCAjIyBhKQotI2RlZmluZSBJRUVFODAyMTFfREVCVUdfVFgoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfVFgsIGYsICMjIGEpCi0jZGVmaW5lIElFRUU4MDIxMV9ERUJVR19SWChmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SWCwgZiwgIyMgYSkKLSNkZWZpbmUgSUVFRTgwMjExX0RFQlVHX1FPUyhmLCBhLi4uKSAgSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9RT1MsIGYsICMjIGEpCi0KLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCi0vKiBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMS0yMi4gKi8KLSNkZWZpbmUgTUFYX1NUUl9MRU4gICAgIDY0Ci0vKiBJIHdhbnQgdG8gc2VlIEFTQ0lJIDMzIHRvIDEyNiBvbmx5LiBPdGhlcndpc2UsIEkgcHJpbnQgJz8nLiBBbm5pZSwgMjAwNS0xMS0yMi4qLwotI2RlZmluZSBQUklOVEFCTEUoX2NoKSAgKF9jaD4nIScgJiYgX2NoPCd+JykKLSNkZWZpbmUgSUVFRTgwMjExX1BSSU5UX1NUUihfQ29tcCwgX1RpdGxlU3RyaW5nLCBfUHRyLCBfTGVuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAotICAgICAgICAgICAgICAgICAgICAgICAgaWYoKF9Db21wKSAmIGxldmVsKSAgIAkJCQkJCQlcCi0gICAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICBidWZmZXJbTUFYX1NUUl9MRU5dOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSAoX0xlbjxNQVhfU1RSX0xFTik/IF9MZW4gOiAoTUFYX1NUUl9MRU4tMSkgOyAgCVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGJ1ZmZlciwgMCwgTUFYX1NUUl9MRU4pOyAgICAgICAgICAgICAgICAgICAgICAJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlciwgKHU4ICopX1B0ciwgbGVuZ3RoICk7ICAgICAgICAgICAgCQlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciggX19pPTA7IF9faTxNQVhfU1RSX0xFTjsgX19pKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFQUklOVEFCTEUoYnVmZmVyW19faV0pICkgICBidWZmZXJbX19pXSA9ICc/JzsgICAgIAlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltsZW5ndGhdID0gJ1wwJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygiUnRsODE5eDogIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoX1RpdGxlU3RyaW5nKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCI6ICVkLCA8JXM+XG4iLCBfTGVuLCBidWZmZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0jZWxzZQotI2RlZmluZSBJRUVFODAyMTFfUFJJTlRfU1RSKF9Db21wLCBfVGl0bGVTdHJpbmcsIF9QdHIsIF9MZW4pICBkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+IC8qIEFSUEhSRF9FVEhFUiAqLwotCi0jaWZuZGVmIFdJUkVMRVNTX1NQWQotI2RlZmluZSBXSVJFTEVTU19TUFkJCS8vIGVuYWJsZSBpd3NweSBzdXBwb3J0Ci0jZW5kaWYKLSNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgkvLyBuZXcgZHJpdmVyIEFQSQotCi0jaWZuZGVmIEVUSF9QX1BBRQotI2RlZmluZSBFVEhfUF9QQUUgMHg4ODhFIC8qIFBvcnQgQWNjZXNzIEVudGl0eSAoSUVFRSA4MDIuMVgpICovCi0jZW5kaWYgLyogRVRIX1BfUEFFICovCi0KLSNkZWZpbmUgRVRIX1BfUFJFQVVUSCAweDg4QzcgLyogSUVFRSA4MDIuMTFpIHByZS1hdXRoZW50aWNhdGlvbiAqLwotCi0jaWZuZGVmIEVUSF9QXzgwMjExX1JBVwotI2RlZmluZSBFVEhfUF84MDIxMV9SQVcgKEVUSF9QX0VDT05FVCArIDEpCi0jZW5kaWYKLQotLyogSUVFRSA4MDIuMTEgZGVmaW5lcyAqLwotCi0jZGVmaW5lIFA4MDIxMV9PVUlfTEVOIDMKLQotc3RydWN0IGllZWU4MDIxMV9zbmFwX2hkciB7Ci0KLSAgICAgICAgdTggICAgZHNhcDsgICAvKiBhbHdheXMgMHhBQSAqLwotICAgICAgICB1OCAgICBzc2FwOyAgIC8qIGFsd2F5cyAweEFBICovCi0gICAgICAgIHU4ICAgIGN0cmw7ICAgLyogYWx3YXlzIDB4MDMgKi8KLSAgICAgICAgdTggICAgb3VpW1A4MDIxMV9PVUlfTEVOXTsgICAgLyogb3JnYW5pemF0aW9uYWwgdW5pdmVyc2FsIGlkICovCi0KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0jZGVmaW5lIFNOQVBfU0laRSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9zbmFwX2hkcikKLQotI2RlZmluZSBXTEFOX0ZDX0dFVF9WRVJTKGZjKSAoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX1ZFUlMpCi0jZGVmaW5lIFdMQU5fRkNfR0VUX1RZUEUoZmMpICgoZmMpICYgSUVFRTgwMjExX0ZDVExfRlRZUEUpCi0jZGVmaW5lIFdMQU5fRkNfR0VUX1NUWVBFKGZjKSAoKGZjKSAmIElFRUU4MDIxMV9GQ1RMX1NUWVBFKQotI2RlZmluZSBXTEFOX0ZDX01PUkVfREFUQShmYykgKChmYykgJiBJRUVFODAyMTFfRkNUTF9NT1JFREFUQSkKLQotCi0jZGVmaW5lIFdMQU5fRkNfR0VUX0ZSQU1FVFlQRShmYykgKChmYykgJiBJRUVFODAyMTFfRkNUTF9GUkFNRVRZUEUpCi0jZGVmaW5lIFdMQU5fR0VUX1NFUV9GUkFHKHNlcSkgKChzZXEpICYgSUVFRTgwMjExX1NDVExfRlJBRykKLSNkZWZpbmUgV0xBTl9HRVRfU0VRX1NFUShzZXEpICAoKChzZXEpICYgSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0KQotCi0vKiBBdXRoZW50aWNhdGlvbiBhbGdvcml0aG1zICovCi0jZGVmaW5lIFdMQU5fQVVUSF9PUEVOIDAKLSNkZWZpbmUgV0xBTl9BVVRIX1NIQVJFRF9LRVkgMQotI2RlZmluZSBXTEFOX0FVVEhfTEVBUCAyCi0KLSNkZWZpbmUgV0xBTl9BVVRIX0NIQUxMRU5HRV9MRU4gMTI4Ci0KLSNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0JTUyAoMTw8MCkKLSNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0lCU1MgKDE8PDEpCi0jZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9DRl9QT0xMQUJMRSAoMTw8MikKLSNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX0NGX1BPTExfUkVRVUVTVCAoMTw8MykKLSNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kgKDE8PDQpCi0jZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSAoMTw8NSkKLSNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1BCQ0MgKDE8PDYpCi0jZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9DSEFOTkVMX0FHSUxJVFkgKDE8PDcpCi0jZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9TUEVDVFJVTV9NR01UICgxPDw4KQotI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfUU9TICgxPDw5KQotI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVCAoMTw8MTApCi0jZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9EU1NTX09GRE0gKDE8PDEzKQotCi0vKiA4MDIuMTFnIEVSUCBpbmZvcm1hdGlvbiBlbGVtZW50ICovCi0jZGVmaW5lIFdMQU5fRVJQX05PTl9FUlBfUFJFU0VOVCAoMTw8MCkKLSNkZWZpbmUgV0xBTl9FUlBfVVNFX1BST1RFQ1RJT04gKDE8PDEpCi0jZGVmaW5lIFdMQU5fRVJQX0JBUktFUl9QUkVBTUJMRSAoMTw8MikKLQotLyogU3RhdHVzIGNvZGVzICovCi1lbnVtIGllZWU4MDIxMV9zdGF0dXNjb2RlIHsKLSAgICAgICAgV0xBTl9TVEFUVVNfU1VDQ0VTUyA9IDAsCi0gICAgICAgIFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkUgPSAxLAotICAgICAgICBXTEFOX1NUQVRVU19DQVBTX1VOU1VQUE9SVEVEID0gMTAsCi0gICAgICAgIFdMQU5fU1RBVFVTX1JFQVNTT0NfTk9fQVNTT0MgPSAxMSwKLSAgICAgICAgV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX1VOU1BFQyA9IDEyLAotICAgICAgICBXTEFOX1NUQVRVU19OT1RfU1VQUE9SVEVEX0FVVEhfQUxHID0gMTMsCi0gICAgICAgIFdMQU5fU1RBVFVTX1VOS05PV05fQVVUSF9UUkFOU0FDVElPTiA9IDE0LAotICAgICAgICBXTEFOX1NUQVRVU19DSEFMTEVOR0VfRkFJTCA9IDE1LAotICAgICAgICBXTEFOX1NUQVRVU19BVVRIX1RJTUVPVVQgPSAxNiwKLSAgICAgICAgV0xBTl9TVEFUVVNfQVBfVU5BQkxFX1RPX0hBTkRMRV9ORVdfU1RBID0gMTcsCi0gICAgICAgIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9SQVRFUyA9IDE4LAotICAgICAgICAvKiA4MDIuMTFiICovCi0gICAgICAgIFdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT1NIT1JUUFJFQU1CTEUgPSAxOSwKLSAgICAgICAgV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PUEJDQyA9IDIwLAotICAgICAgICBXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9BR0lMSVRZID0gMjEsCi0gICAgICAgIC8qIDgwMi4xMWggKi8KLSAgICAgICAgV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PU1BFQ1RSVU0gPSAyMiwKLSAgICAgICAgV0xBTl9TVEFUVVNfQVNTT0NfUkVKRUNURURfQkFEX1BPV0VSID0gMjMsCi0gICAgICAgIFdMQU5fU1RBVFVTX0FTU09DX1JFSkVDVEVEX0JBRF9TVVBQX0NIQU4gPSAyNCwKLSAgICAgICAgLyogODAyLjExZyAqLwotICAgICAgICBXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9TSE9SVFRJTUUgPSAyNSwKLSAgICAgICAgV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PRFNTU09GRE0gPSAyNiwKLSAgICAgICAgLyogODAyLjExaSAqLwotICAgICAgICBXTEFOX1NUQVRVU19JTlZBTElEX0lFID0gNDAsCi0gICAgICAgIFdMQU5fU1RBVFVTX0lOVkFMSURfR1JPVVBfQ0lQSEVSID0gNDEsCi0gICAgICAgIFdMQU5fU1RBVFVTX0lOVkFMSURfUEFJUldJU0VfQ0lQSEVSID0gNDIsCi0gICAgICAgIFdMQU5fU1RBVFVTX0lOVkFMSURfQUtNUCA9IDQzLAotICAgICAgICBXTEFOX1NUQVRVU19VTlNVUFBfUlNOX1ZFUlNJT04gPSA0NCwKLSAgICAgICAgV0xBTl9TVEFUVVNfSU5WQUxJRF9SU05fSUVfQ0FQID0gNDUsCi0gICAgICAgIFdMQU5fU1RBVFVTX0NJUEhFUl9TVUlURV9SRUpFQ1RFRCA9IDQ2LAotfTsKLQotLyogUmVhc29uIGNvZGVzICovCi1lbnVtIGllZWU4MDIxMV9yZWFzb25jb2RlIHsKLSAgICAgICAgV0xBTl9SRUFTT05fVU5TUEVDSUZJRUQgPSAxLAotICAgICAgICBXTEFOX1JFQVNPTl9QUkVWX0FVVEhfTk9UX1ZBTElEID0gMiwKLSAgICAgICAgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcgPSAzLAotICAgICAgICBXTEFOX1JFQVNPTl9ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWSA9IDQsCi0gICAgICAgIFdMQU5fUkVBU09OX0RJU0FTU09DX0FQX0JVU1kgPSA1LAotICAgICAgICBXTEFOX1JFQVNPTl9DTEFTUzJfRlJBTUVfRlJPTV9OT05BVVRIX1NUQSA9IDYsCi0gICAgICAgIFdMQU5fUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09DX1NUQSA9IDcsCi0gICAgICAgIFdMQU5fUkVBU09OX0RJU0FTU09DX1NUQV9IQVNfTEVGVCA9IDgsCi0gICAgICAgIFdMQU5fUkVBU09OX1NUQV9SRVFfQVNTT0NfV0lUSE9VVF9BVVRIID0gOSwKLSAgICAgICAgLyogODAyLjExaCAqLwotICAgICAgICBXTEFOX1JFQVNPTl9ESVNBU1NPQ19CQURfUE9XRVIgPSAxMCwKLSAgICAgICAgV0xBTl9SRUFTT05fRElTQVNTT0NfQkFEX1NVUFBfQ0hBTiA9IDExLAotICAgICAgICAvKiA4MDIuMTFpICovCi0gICAgICAgIFdMQU5fUkVBU09OX0lOVkFMSURfSUUgPSAxMywKLSAgICAgICAgV0xBTl9SRUFTT05fTUlDX0ZBSUxVUkUgPSAxNCwKLSAgICAgICAgV0xBTl9SRUFTT05fNFdBWV9IQU5EU0hBS0VfVElNRU9VVCA9IDE1LAotICAgICAgICBXTEFOX1JFQVNPTl9HUk9VUF9LRVlfSEFORFNIQUtFX1RJTUVPVVQgPSAxNiwKLSAgICAgICAgV0xBTl9SRUFTT05fSUVfRElGRkVSRU5UID0gMTcsCi0gICAgICAgIFdMQU5fUkVBU09OX0lOVkFMSURfR1JPVVBfQ0lQSEVSID0gMTgsCi0gICAgICAgIFdMQU5fUkVBU09OX0lOVkFMSURfUEFJUldJU0VfQ0lQSEVSID0gMTksCi0gICAgICAgIFdMQU5fUkVBU09OX0lOVkFMSURfQUtNUCA9IDIwLAotICAgICAgICBXTEFOX1JFQVNPTl9VTlNVUFBfUlNOX1ZFUlNJT04gPSAyMSwKLSAgICAgICAgV0xBTl9SRUFTT05fSU5WQUxJRF9SU05fSUVfQ0FQID0gMjIsCi0gICAgICAgIFdMQU5fUkVBU09OX0lFRUU4MDIxWF9GQUlMRUQgPSAyMywKLSAgICAgICAgV0xBTl9SRUFTT05fQ0lQSEVSX1NVSVRFX1JFSkVDVEVEID0gMjQsCi19OwotCi0jZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19TSUdOQUwgKDE8PDApCi0jZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19SU1NJICgxPDwxKQotI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfTk9JU0UgKDE8PDIpCi0jZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19SQVRFICgxPDwzKQotI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfV0VNQVNLIDB4NwotCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTiAgICAoMTw8MCkKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTiAgICgxPDwxKQotCi0jZGVmaW5lIElFRUU4MDIxMV8yNEdIWl9CQU5EICAgICAoMTw8MCkKLSNkZWZpbmUgSUVFRTgwMjExXzUyR0haX0JBTkQgICAgICgxPDwxKQotCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV9MRU4gIAkJNAotI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1CCQkgICAgICAgIDB4MDIKLSNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFXzJNQgkJICAgICAgICAweDA0Ci0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUIJCSAgICAgICAgMHgwQgotI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQgkJICAgICAgICAweDE2Ci0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfTEVOIAkJOAotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQgkJICAgICAgICAweDBDCi0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1CCQkgICAgICAgIDB4MTIKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xMk1CCQkweDE4Ci0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQgkJMHgyNAotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUIJCTB4MzAKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8zNk1CCQkweDQ4Ci0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQgkJMHg2MAotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUIJCTB4NkMKLSNkZWZpbmUgSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSwkJMHg4MAotCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xTUJfTUFTSwkJKDE8PDApCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSwkJKDE8PDEpCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV81TUJfTUFTSwkJKDE8PDIpCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfUkFURV8xMU1CX01BU0sJCSgxPDwzKQotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzZNQl9NQVNLCQkoMTw8NCkKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV85TUJfTUFTSwkJKDE8PDUpCi0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQl9NQVNLCQkoMTw8NikKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV8xOE1CX01BU0sJCSgxPDw3KQotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSwkJKDE8PDgpCi0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLCQkoMTw8OSkKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV80OE1CX01BU0sJCSgxPDwxMCkKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fUkFURV81NE1CX01BU0sJCSgxPDwxMSkKLQotI2RlZmluZSBJRUVFODAyMTFfQ0NLX1JBVEVTX01BU0sJICAgICAgICAweDAwMDAwMDBGCi0jZGVmaW5lIElFRUU4MDIxMV9DQ0tfQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX0NDS19SQVRFXzFNQl9NQVNLIHwgXAotCUlFRUU4MDIxMV9DQ0tfUkFURV8yTUJfTUFTSykKLSNkZWZpbmUgSUVFRTgwMjExX0NDS19ERUZBVUxUX1JBVEVTX01BU0sJKElFRUU4MDIxMV9DQ0tfQkFTSUNfUkFURVNfTUFTSyB8IFwKLSAgICAgICAgSUVFRTgwMjExX0NDS19SQVRFXzVNQl9NQVNLIHwgXAotICAgICAgICBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQl9NQVNLKQotCi0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1JBVEVTX01BU0sJCTB4MDAwMDBGRjAKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fQkFTSUNfUkFURVNfTUFTSwkoSUVFRTgwMjExX09GRE1fUkFURV82TUJfTUFTSyB8IFwKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUJfTUFTSyB8IFwKLQlJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUJfTUFTSykKLSNkZWZpbmUgSUVFRTgwMjExX09GRE1fREVGQVVMVF9SQVRFU19NQVNLCShJRUVFODAyMTFfT0ZETV9CQVNJQ19SQVRFU19NQVNLIHwgXAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfOU1CX01BU0sgIHwgXAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfMThNQl9NQVNLIHwgXAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQl9NQVNLIHwgXAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQl9NQVNLIHwgXAotCUlFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQl9NQVNLKQotI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9SQVRFU19NQVNLIChJRUVFODAyMTFfT0ZETV9ERUZBVUxUX1JBVEVTX01BU0sgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9DQ0tfREVGQVVMVF9SQVRFU19NQVNLKQotCi0jZGVmaW5lIElFRUU4MDIxMV9OVU1fT0ZETV9SQVRFUwkgICAgOAotI2RlZmluZSBJRUVFODAyMTFfTlVNX0NDS19SQVRFUwkgICAgICAgICAgICA0Ci0jZGVmaW5lIElFRUU4MDIxMV9PRkRNX1NISUZUX01BU0tfQSAgICAgICAgIDQKLQotCi0vKiB0aGlzIGlzIHN0b2xlbiBhbmQgbW9kaWZpZWQgZnJvbSB0aGUgbWFkd2lmaSBkcml2ZXIqLwotI2RlZmluZSBJRUVFODAyMTFfRkMwX1RZUEVfTUFTSwkJMHgwYwotI2RlZmluZSBJRUVFODAyMTFfRkMwX1RZUEVfREFUQQkJMHgwOAotI2RlZmluZSBJRUVFODAyMTFfRkMwX1NVQlRZUEVfTUFTSwkweEIwCi0jZGVmaW5lIElFRUU4MDIxMV9GQzBfU1VCVFlQRV9RT1MJMHg4MAotCi0jZGVmaW5lIElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykgXAotCSgoKGZjKSAmIChJRUVFODAyMTFfRkMwX1RZUEVfTUFTSyB8IElFRUU4MDIxMV9GQzBfU1VCVFlQRV9NQVNLKSkgPT0gXAotCSAoSUVFRTgwMjExX0ZDMF9UWVBFX0RBVEEgfCBJRUVFODAyMTFfRkMwX1NVQlRZUEVfUU9TKSkKLQotLyogdGhpcyBpcyBzdG9sZW4gZnJvbSBpcHcyMjAwIGRyaXZlciAqLwotI2RlZmluZSBJRUVFX0lCU1NfTUFDX0hBU0hfU0laRSAzMQotc3RydWN0IGllZWVfaWJzc19zZXEgewotCXU4IG1hY1tFVEhfQUxFTl07Ci0JdTE2IHNlcV9udW1bMTddOwotCXUxNiBmcmFnX251bVsxN107Ci0JdW5zaWduZWQgbG9uZyBwYWNrZXRfdGltZVsxN107Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotfTsKLQotLyogTk9URTogVGhpcyBkYXRhIGlzIGZvciBzdGF0aXN0aWNhbCBwdXJwb3Nlczsgbm90IGFsbCBoYXJkd2FyZSBwcm92aWRlcyB0aGlzCi0gKiAgICAgICBpbmZvcm1hdGlvbiBmb3IgZnJhbWVzIHJlY2VpdmVkLiAgTm90IHNldHRpbmcgdGhlc2Ugd2lsbCBub3QgY2F1c2UKLSAqICAgICAgIGFueSBhZHZlcnNlIGFmZmVjdHMuICovCi1zdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzIHsKLQl1MzIgbWFjX3RpbWVbMl07Ci0JczggcnNzaTsKLQl1OCBzaWduYWw7Ci0JdTggbm9pc2U7Ci0JdTE2IHJhdGU7IC8qIGluIDEwMCBrYnBzICovCi0JdTggcmVjZWl2ZWRfY2hhbm5lbDsKLQl1OCBjb250cm9sOwotCXU4IG1hc2s7Ci0JdTggZnJlcTsKLQl1MTYgbGVuOwotCXU2NCB0c2Y7Ci0JdTMyIGJlYWNvbl90aW1lOwotCXU4IG5pY190eXBlOwotCXUxNiAgICAgICBMZW5ndGg7Ci0JdTggICAgICAgIFNpZ25hbFF1YWxpdHk7IC8vIGluIDAtMTAwIGluZGV4LgotCXMzMiAgICAgICBSZWN2U2lnbmFsUG93ZXI7IC8vIFJlYWwgcG93ZXIgaW4gZEJtIGZvciB0aGlzIHBhY2tldCwgbm8gYmVhdXRpZmljYXRpb24gYW5kIGFnZ3JlZ2F0aW9uLgotCXM4ICAgICAgICBSeFBvd2VyOyAvLyBpbiBkQm0gVHJhbnNsYXRlIGZyb20gUFdkQgotCXU4ICAgICAgICBTaWduYWxTdHJlbmd0aDsgLy8gaW4gMC0xMDAgaW5kZXguCi0JdTE2ICAgICAgIGJId0Vycm9yOjE7Ci0JdTE2ICAgICAgIGJDUkM6MTsKLQl1MTYgICAgICAgYklDVjoxOwotCXUxNiAgICAgICBiU2hvcnRQcmVhbWJsZToxOwotCXUxNiAgICAgICBBbnRlbm5hOjE7ICAgICAgLy9mb3IgcnRsODE4NQotCXUxNiAgICAgICBEZWNyeXB0ZWQ6MTsgICAgLy9mb3IgcnRsODE4NSwgcnRsODE4NwotCXUxNiAgICAgICBXYWtldXA6MTsgICAgICAgLy9mb3IgcnRsODE4NQotCXUxNiAgICAgICBSZXNlcnZlZDA6MTsgICAgLy9mb3IgcnRsODE4NQotCXU4ICAgICAgICBBR0M7Ci0JdTMyICAgICAgIFRpbWVTdGFtcExvdzsKLQl1MzIgICAgICAgVGltZVN0YW1wSGlnaDsKLQlib29sICAgICAgYlNoaWZ0OwotCWJvb2wgICAgICBiSXNRb3NEYXRhOyAgICAgICAgICAgICAvLyBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMi0yMi4KLQl1OCAgICAgICAgVXNlclByaW9yaXR5OwotCi0JLy8xISEhISEhISEhISEhISEhISEhISEhISEhISEhCi0JLy8xQXR0ZW50aW9uIFBsZWFzZSEhITwxMW4gb3IgODE5MCBzcGVjaWZpYyBjb2RlIHNob3VsZCBiZSBwdXQgYmVsb3cgdGhpcyBsaW5lPgotCS8vMSEhISEhISEhISEhISEhISEhISEhISEhISEhIQotCi0JdTggICAgICAgIFJ4RHJ2SW5mb1NpemU7Ci0JdTggICAgICAgIFJ4QnVmU2hpZnQ7Ci0JYm9vbCAgICAgIGJJc0FNUERVOwotCWJvb2wgICAgICBiRmlyc3RNUERVOwotCWJvb2wgICAgICBiQ29udGFpbkhUQzsKLQl1MzIgICAgICAgUnhQV0RCQWxsOwotCXU4ICAgICAgICBSeE1JTU9TaWduYWxTdHJlbmd0aFs0XTsgICAgICAgIC8vIGluIDB+MTAwIGluZGV4Ci0JczggICAgICAgIFJ4TUlNT1NpZ25hbFF1YWxpdHlbMl07Ci0JYm9vbCAgICAgIGJQYWNrZXRNYXRjaEJTU0lEOwotCWJvb2wgICAgICBiSXNDQ0s7Ci0JYm9vbCAgICAgIGJQYWNrZXRUb1NlbGY7Ci0JdTgqICAgICAgIHZpcnR1YWxfYWRkcmVzczsKLQlib29sCQkgIGJQYWNrZXRCZWFjb247CS8vY29zYSBhZGQgZm9yIHJzc2kKLQlib29sCQkgIGJUb1NlbGZCQTsJCS8vY29zYSBhZGQgZm9yIHJzc2kKLQljaGFyIAkgIGNja19hZGNfcHdkYls0XTsJLy9jb3NhIGFkZCBmb3IgcnggcGF0aCBzZWxlY3Rpb24KLX07Ci0KLS8qIElFRUUgODAyLjExIHJlcXVpcmVzIHRoYXQgU1RBIHN1cHBvcnRzIGNvbmN1cnJlbnQgcmVjZXB0aW9uIG9mIGF0IGxlYXN0Ci0gKiB0aHJlZSBmcmFnbWVudGVkIGZyYW1lcy4gVGhpcyBkZWZpbmUgY2FuIGJlIGluY3JlYXNlZCB0byBzdXBwb3J0IG1vcmUKLSAqIGNvbmN1cnJlbnQgZnJhbWVzLCBidXQgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgZWFjaCBlbnRyeSBjYW4gY29uc3VtZSBhYm91dAotICogMiBrQiBvZiBSQU0gYW5kIGluY3JlYXNpbmcgY2FjaGUgc2l6ZSB3aWxsIHNsb3cgZG93biBmcmFtZSByZWFzc2VtYmx5LiAqLwotI2RlZmluZSBJRUVFODAyMTFfRlJBR19DQUNIRV9MRU4gNAotCi1zdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgewotCXVuc2lnbmVkIGxvbmcgZmlyc3RfZnJhZ190aW1lOwotCXVuc2lnbmVkIGludCBzZXE7Ci0JdW5zaWduZWQgaW50IGxhc3RfZnJhZzsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXU4IHNyY19hZGRyW0VUSF9BTEVOXTsKLQl1OCBkc3RfYWRkcltFVEhfQUxFTl07Ci19OwotCi1zdHJ1Y3QgaWVlZTgwMjExX3N0YXRzIHsKLQl1bnNpZ25lZCBpbnQgdHhfdW5pY2FzdF9mcmFtZXM7Ci0JdW5zaWduZWQgaW50IHR4X211bHRpY2FzdF9mcmFtZXM7Ci0JdW5zaWduZWQgaW50IHR4X2ZyYWdtZW50czsKLQl1bnNpZ25lZCBpbnQgdHhfdW5pY2FzdF9vY3RldHM7Ci0JdW5zaWduZWQgaW50IHR4X211bHRpY2FzdF9vY3RldHM7Ci0JdW5zaWduZWQgaW50IHR4X2RlZmVycmVkX3RyYW5zbWlzc2lvbnM7Ci0JdW5zaWduZWQgaW50IHR4X3NpbmdsZV9yZXRyeV9mcmFtZXM7Ci0JdW5zaWduZWQgaW50IHR4X211bHRpcGxlX3JldHJ5X2ZyYW1lczsKLQl1bnNpZ25lZCBpbnQgdHhfcmV0cnlfbGltaXRfZXhjZWVkZWQ7Ci0JdW5zaWduZWQgaW50IHR4X2Rpc2NhcmRzOwotCXVuc2lnbmVkIGludCByeF91bmljYXN0X2ZyYW1lczsKLQl1bnNpZ25lZCBpbnQgcnhfbXVsdGljYXN0X2ZyYW1lczsKLQl1bnNpZ25lZCBpbnQgcnhfZnJhZ21lbnRzOwotCXVuc2lnbmVkIGludCByeF91bmljYXN0X29jdGV0czsKLQl1bnNpZ25lZCBpbnQgcnhfbXVsdGljYXN0X29jdGV0czsKLQl1bnNpZ25lZCBpbnQgcnhfZmNzX2Vycm9yczsKLQl1bnNpZ25lZCBpbnQgcnhfZGlzY2FyZHNfbm9fYnVmZmVyOwotCXVuc2lnbmVkIGludCB0eF9kaXNjYXJkc193cm9uZ19zYTsKLQl1bnNpZ25lZCBpbnQgcnhfZGlzY2FyZHNfdW5kZWNyeXB0YWJsZTsKLQl1bnNpZ25lZCBpbnQgcnhfbWVzc2FnZV9pbl9tc2dfZnJhZ21lbnRzOwotCXVuc2lnbmVkIGludCByeF9tZXNzYWdlX2luX2JhZF9tc2dfZnJhZ21lbnRzOwotfTsKLQotc3RydWN0IGllZWU4MDIxMV9kZXZpY2U7Ci0KLSNpbmNsdWRlICJpZWVlODAyMTFfY3J5cHQuaCIKLQotI2RlZmluZSBTRUNfS0VZXzEgICAgICAgICAoMTw8MCkKLSNkZWZpbmUgU0VDX0tFWV8yICAgICAgICAgKDE8PDEpCi0jZGVmaW5lIFNFQ19LRVlfMyAgICAgICAgICgxPDwyKQotI2RlZmluZSBTRUNfS0VZXzQgICAgICAgICAoMTw8MykKLSNkZWZpbmUgU0VDX0FDVElWRV9LRVkgICAgKDE8PDQpCi0jZGVmaW5lIFNFQ19BVVRIX01PREUgICAgICgxPDw1KQotI2RlZmluZSBTRUNfVU5JQ0FTVF9HUk9VUCAoMTw8NikKLSNkZWZpbmUgU0VDX0xFVkVMICAgICAgICAgKDE8PDcpCi0jZGVmaW5lIFNFQ19FTkFCTEVEICAgICAgICgxPDw4KQotI2RlZmluZSBTRUNfRU5DUllQVCAgICAgICAoMTw8OSkKLQotI2RlZmluZSBTRUNfTEVWRUxfMCAgICAgIDAgLyogTm9uZSAqLwotI2RlZmluZSBTRUNfTEVWRUxfMSAgICAgIDEgLyogV0VQIDQwIGFuZCAxMDQgYml0ICovCi0jZGVmaW5lIFNFQ19MRVZFTF8yICAgICAgMiAvKiBMZXZlbCAxICsgVEtJUCAqLwotI2RlZmluZSBTRUNfTEVWRUxfMl9DS0lQIDMgLyogTGV2ZWwgMSArIENLSVAgKi8KLSNkZWZpbmUgU0VDX0xFVkVMXzMgICAgICA0IC8qIExldmVsIDIgKyBDQ01QICovCi0KLSNkZWZpbmUgU0VDX0FMR19OT05FICAgICAgICAgICAgMAotI2RlZmluZSBTRUNfQUxHX1dFUCAgICAgICAgICAgICAxCi0jZGVmaW5lIFNFQ19BTEdfVEtJUCAgICAgICAgICAgIDIKLSNkZWZpbmUgU0VDX0FMR19DQ01QICAgICAgICAgICAgNAotCi0jZGVmaW5lIFdFUF9LRVlTIAkJNAotI2RlZmluZSBXRVBfS0VZX0xFTgkJMTMKLSNkZWZpbmUgU0NNX0tFWV9MRU4gICAgICAgICAgICAgMzIKLSNkZWZpbmUgU0NNX1RFTVBPUkFMX0tFWV9MRU5HVEggMTYKLQotc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSB7Ci0JdTE2IGFjdGl2ZV9rZXk6MiwKLSAgICAgICAgICAgIGVuYWJsZWQ6MSwKLQkgICAgYXV0aF9tb2RlOjIsCi0gICAgICAgICAgICBhdXRoX2FsZ286NCwKLSAgICAgICAgICAgIHVuaWNhc3RfdXNlc19ncm91cDoxLAotCSAgICBlbmNyeXB0OjE7Ci0JdTgga2V5X3NpemVzW1dFUF9LRVlTXTsKLQl1OCBrZXlzW1dFUF9LRVlTXVtTQ01fS0VZX0xFTl07Ci0JdTggbGV2ZWw7Ci0JdTE2IGZsYWdzOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLQotLyoKLSA4MDIuMTEgZGF0YSBmcmFtZSBmcm9tIEFQCi0gICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLUJ5dGVzIHwgIDIgICB8ICAyICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgMiAgIHwgMC4uMjMxMiB8ICAgNCAgfAotICAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18Ci1EZXNjLiB8IGN0cmwgfCBkdXJhIHwgIERBL1JBICB8ICAgVEEgICAgfCAgICBTQSAgIHwgU2VxdSB8ICBmcmFtZSAgfCAgZmNzIHwKLSAgICAgIHwgICAgICB8IHRpb24gfCAoQlNTSUQpIHwgICAgICAgICB8ICAgICAgICAgfCBlbmNlIHwgIGRhdGEgICB8ICAgICAgfAotICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCi1Ub3RhbDogMjgtMjM0MCBieXRlcwotKi8KLQotLyogTWFuYWdlbWVudCBGcmFtZSBJbmZvcm1hdGlvbiBFbGVtZW50IFR5cGVzICovCi1lbnVtIGllZWU4MDIxMV9tZmllIHsKLSAgICAgICAgTUZJRV9UWVBFX1NTSUQgPSAwLAotICAgICAgICBNRklFX1RZUEVfUkFURVMgPSAxLAotICAgICAgICBNRklFX1RZUEVfRkhfU0VUID0gMiwKLSAgICAgICAgTUZJRV9UWVBFX0RTX1NFVCA9IDMsCi0gICAgICAgIE1GSUVfVFlQRV9DRl9TRVQgPSA0LAotICAgICAgICBNRklFX1RZUEVfVElNID0gNSwKLSAgICAgICAgTUZJRV9UWVBFX0lCU1NfU0VUID0gNiwKLSAgICAgICAgTUZJRV9UWVBFX0NPVU5UUlkgPSA3LAotICAgICAgICBNRklFX1RZUEVfSE9QX1BBUkFNUyA9IDgsCi0gICAgICAgIE1GSUVfVFlQRV9IT1BfVEFCTEUgPSA5LAotICAgICAgICBNRklFX1RZUEVfUkVRVUVTVCA9IDEwLAotICAgICAgICBNRklFX1RZUEVfQ0hBTExFTkdFID0gMTYsCi0gICAgICAgIE1GSUVfVFlQRV9QT1dFUl9DT05TVFJBSU5UID0gMzIsCi0gICAgICAgIE1GSUVfVFlQRV9QT1dFUl9DQVBBQklMSVRZID0gMzMsCi0gICAgICAgIE1GSUVfVFlQRV9UUENfUkVRVUVTVCA9IDM0LAotICAgICAgICBNRklFX1RZUEVfVFBDX1JFUE9SVCA9IDM1LAotICAgICAgICBNRklFX1RZUEVfU1VQUF9DSEFOTkVMUyA9IDM2LAotICAgICAgICBNRklFX1RZUEVfQ1NBID0gMzcsCi0gICAgICAgIE1GSUVfVFlQRV9NRUFTVVJFX1JFUVVFU1QgPSAzOCwKLSAgICAgICAgTUZJRV9UWVBFX01FQVNVUkVfUkVQT1JUID0gMzksCi0gICAgICAgIE1GSUVfVFlQRV9RVUlFVCA9IDQwLAotICAgICAgICBNRklFX1RZUEVfSUJTU19ERlMgPSA0MSwKLSAgICAgICAgTUZJRV9UWVBFX0VSUCA9IDQyLAotICAgICAgICBNRklFX1RZUEVfUlNOID0gNDgsCi0gICAgICAgIE1GSUVfVFlQRV9SQVRFU19FWCA9IDUwLAotICAgICAgICBNRklFX1RZUEVfSFRfQ0FQPSA0NSwKLQkgTUZJRV9UWVBFX0hUX0lORk89IDYxLAotCSBNRklFX1RZUEVfQUlST05FVD0xMzMsCi0gICAgICAgIE1GSUVfVFlQRV9HRU5FUklDID0gMjIxLAotICAgICAgICBNRklFX1RZUEVfUU9TX1BBUkFNRVRFUiA9IDIyMiwKLX07Ci0KLS8qIE1pbmltYWwgaGVhZGVyOyBjYW4gYmUgdXNlZCBmb3IgcGFzc2luZyA4MDIuMTEgZnJhbWVzIHdpdGggc3VmZmljaWVudAotICogaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiB1bmRlcmx5aW5nIGRhdGEgdHlwZSBpcyBhY3R1YWxseQotICogc3RvcmVkIGluIHRoZSBkYXRhLiAqLwotIHN0cnVjdCBpZWVlODAyMTFfcHNwb2xsX2hkciB7Ci0gICAgICAgIF9fbGUxNiBmcmFtZV9jdGw7Ci0gICAgICAgIF9fbGUxNiBhaWQ7Ci0JdTggYnNzaWRbRVRIX0FMRU5dOwotICAgICAgICB1OCB0YVtFVEhfQUxFTl07Ci0gICAgICAgIC8vdTggcGF5bG9hZFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaWVlZTgwMjExX2hkciB7Ci0gICAgICAgIF9fbGUxNiBmcmFtZV9jdGw7Ci0gICAgICAgIF9fbGUxNiBkdXJhdGlvbl9pZDsKLSAgICAgICAgdTggcGF5bG9hZFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaWVlZTgwMjExX2hkcl8xYWRkciB7Ci0gICAgICAgIF9fbGUxNiBmcmFtZV9jdGw7Ci0gICAgICAgIF9fbGUxNiBkdXJhdGlvbl9pZDsKLSAgICAgICAgdTggYWRkcjFbRVRIX0FMRU5dOwotICAgICAgICB1OCBwYXlsb2FkWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBpZWVlODAyMTFfaGRyXzJhZGRyIHsKLSAgICAgICAgX19sZTE2IGZyYW1lX2N0bDsKLSAgICAgICAgX19sZTE2IGR1cmF0aW9uX2lkOwotICAgICAgICB1OCBhZGRyMVtFVEhfQUxFTl07Ci0gICAgICAgIHU4IGFkZHIyW0VUSF9BTEVOXTsKLSAgICAgICAgdTggcGF5bG9hZFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciB7Ci0JX19sZTE2IGZyYW1lX2N0bDsKLQlfX2xlMTYgZHVyYXRpb25faWQ7Ci0JdTggYWRkcjFbRVRIX0FMRU5dOwotCXU4IGFkZHIyW0VUSF9BTEVOXTsKLQl1OCBhZGRyM1tFVEhfQUxFTl07Ci0JX19sZTE2IHNlcV9jdGw7Ci0gICAgICAgIHU4IHBheWxvYWRbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgewotCV9fbGUxNiBmcmFtZV9jdGw7Ci0JX19sZTE2IGR1cmF0aW9uX2lkOwotCXU4IGFkZHIxW0VUSF9BTEVOXTsKLQl1OCBhZGRyMltFVEhfQUxFTl07Ci0JdTggYWRkcjNbRVRIX0FMRU5dOwotCV9fbGUxNiBzZXFfY3RsOwotCXU4IGFkZHI0W0VUSF9BTEVOXTsKLSAgICAgICAgdTggcGF5bG9hZFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcnFvcyB7Ci0JX19sZTE2IGZyYW1lX2N0bDsKLQlfX2xlMTYgZHVyYXRpb25faWQ7Ci0JdTggYWRkcjFbRVRIX0FMRU5dOwotCXU4IGFkZHIyW0VUSF9BTEVOXTsKLQl1OCBhZGRyM1tFVEhfQUxFTl07Ci0JX19sZTE2IHNlcV9jdGw7Ci0gICAgICAgIHU4IHBheWxvYWRbMF07Ci0JX19sZTE2IHFvc19jdGw7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHJxb3MgewotCV9fbGUxNiBmcmFtZV9jdGw7Ci0JX19sZTE2IGR1cmF0aW9uX2lkOwotCXU4IGFkZHIxW0VUSF9BTEVOXTsKLQl1OCBhZGRyMltFVEhfQUxFTl07Ci0JdTggYWRkcjNbRVRIX0FMRU5dOwotCV9fbGUxNiBzZXFfY3RsOwotCXU4IGFkZHI0W0VUSF9BTEVOXTsKLSAgICAgICAgdTggcGF5bG9hZFswXTsKLQlfX2xlMTYgcW9zX2N0bDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCB7Ci0JdTggaWQ7Ci0JdTggbGVuOwotCXU4IGRhdGFbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOwotCV9fbGUxNiBhbGdvcml0aG07Ci0JX19sZTE2IHRyYW5zYWN0aW9uOwotCV9fbGUxNiBzdGF0dXM7Ci0JLypjaGFsbGVuZ2UqLwotCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jIHsKLSAgICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOwotICAgICAgICBfX2xlMTYgcmVhc29uOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCB7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOwotCS8qIFNTSUQsIHN1cHBvcnRlZCByYXRlcyAqLwotICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSB7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOwotCXUzMiB0aW1lX3N0YW1wWzJdOwotCV9fbGUxNiBiZWFjb25faW50ZXJ2YWw7Ci0JX19sZTE2IGNhcGFiaWxpdHk7Ci0gICAgICAgIC8qIFNTSUQsIHN1cHBvcnRlZCByYXRlcywgRkggcGFyYW1zLCBEUyBwYXJhbXMsCi0gICAgICAgICAqIENGIHBhcmFtcywgSUJTUyBwYXJhbXMsIFRJTSAoaWYgYmVhY29uKSwgUlNOICovCi0gICAgICAgIHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBBbGlhcyBiZWFjb24gZm9yIHByb2JlX3Jlc3BvbnNlICovCi0jZGVmaW5lIGllZWU4MDIxMV9iZWFjb24gaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlCi0KLXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSB7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOwotCV9fbGUxNiBjYXBhYmlsaXR5OwotCV9fbGUxNiBsaXN0ZW5faW50ZXJ2YWw7Ci0JLyogU1NJRCwgc3VwcG9ydGVkIHJhdGVzLCBSU04gKi8KLSAgICAgICAgc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBpZWVlODAyMTFfcmVhc3NvY19yZXF1ZXN0X2ZyYW1lIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7Ci0JX19sZTE2IGNhcGFiaWxpdHk7Ci0JX19sZTE2IGxpc3Rlbl9pbnRlcnZhbDsKLQl1OCBjdXJyZW50X2FwW0VUSF9BTEVOXTsKLQkvKiBTU0lELCBzdXBwb3J0ZWQgcmF0ZXMsIFJTTiAqLwotICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSB7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOwotCV9fbGUxNiBjYXBhYmlsaXR5OwotCV9fbGUxNiBzdGF0dXM7Ci0JX19sZTE2IGFpZDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07IC8qIHN1cHBvcnRlZCByYXRlcyAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBpZWVlODAyMTFfdHhiIHsKLQl1OCBucl9mcmFnczsKLQl1OCBlbmNyeXB0ZWQ7Ci0JdTggcXVldWVfaW5kZXg7Ci0JdTggcnRzX2luY2x1ZGVkOwotCXUxNiByZXNlcnZlZDsKLQlfX2xlMTYgZnJhZ19zaXplOwotCV9fbGUxNiBwYXlsb2FkX3NpemU7Ci0Jc3RydWN0IHNrX2J1ZmYgKmZyYWdtZW50c1swXTsKLX07Ci0KLSNkZWZpbmUgTUFYX1RYX0FHR19DT1VOVAkJICAxNgotc3RydWN0IGllZWU4MDIxMV9kcnZfYWdnX3R4YiB7Ci0JdTggbnJfZHJ2X2FnZ19mcmFtZXM7Ci0Jc3RydWN0IHNrX2J1ZmYgKnR4X2FnZ19mcmFtZXNbTUFYX1RYX0FHR19DT1VOVF07Ci19X19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSNkZWZpbmUgTUFYX1NVQkZSQU1FX0NPVU5UIAkJICA2NAotc3RydWN0IGllZWU4MDIxMV9yeGIgewotCXU4IG5yX3N1YmZyYW1lczsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc3ViZnJhbWVzW01BWF9TVUJGUkFNRV9DT1VOVF07Ci0JdTggZHN0W0VUSF9BTEVOXTsKLQl1OCBzcmNbRVRIX0FMRU5dOwotfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi10eXBlZGVmIHVuaW9uIF9mcmFtZXFvcyB7Ci0JdTE2IHNob3J0ZGF0YTsKLQl1OCAgY2hhcmRhdGFbMl07Ci0Jc3RydWN0IHsKLQkJdTE2IHRpZDo0OwotCQl1MTYgZW9zcDoxOwotCQl1MTYgYWNrX3BvbGljeToyOwotCQl1MTYgcmVzZXJ2ZWQ6MTsKLQkJdTE2IHR4b3A6ODsKLQl9ZmllbGQ7Ci19ZnJhbWVxb3MsKnBmcmFtZXFvczsKLQotLyogU1dFRVAgVEFCTEUgRU5UUklFUyBOVU1CRVIqLwotI2RlZmluZSBNQVhfU1dFRVBfVEFCX0VOVFJJRVMJCSAgNDIKLSNkZWZpbmUgTUFYX1NXRUVQX1RBQl9FTlRSSUVTX1BFUl9QQUNLRVQgIDcKLS8qIE1BWF9SQVRFU19MRU5HVEggbmVlZHMgdG8gYmUgMTIuICBUaGUgc3BlYyBzYXlzIDgsIGFuZCBtYW55IEFQcwotICogb25seSB1c2UgOCwgYW5kIHRoZW4gdXNlIGV4dGVuZGVkIHJhdGVzIGZvciB0aGUgcmVtYWluaW5nIHN1cHBvcnRlZAotICogcmF0ZXMuICBPdGhlciBBUHMsIGhvd2V2ZXIsIHN0aWNrIGFsbCBvZiB0aGVpciBzdXBwb3J0ZWQgcmF0ZXMgb24gdGhlCi0gKiBtYWluIHJhdGVzIGluZm9ybWF0aW9uIGVsZW1lbnQuLi4gKi8KLSNkZWZpbmUgTUFYX1JBVEVTX0xFTkdUSCAgICAgICAgICAgICAgICAgICgodTgpMTIpCi0jZGVmaW5lIE1BWF9SQVRFU19FWF9MRU5HVEggICAgICAgICAgICAgICAoKHU4KTE2KQotI2RlZmluZSBNQVhfTkVUV09SS19DT1VOVCAgICAgICAgICAgICAgICAgIDEyOAotCi0jZGVmaW5lIE1BWF9DSEFOTkVMX05VTUJFUiAgICAgICAgICAgICAgICAgMTYxCi0jZGVmaW5lIElFRUU4MDIxMV9TT0ZUTUFDX1NDQU5fVElNRQkgICAxMDAKLS8vKEhaIC8gMikKLSNkZWZpbmUgSUVFRTgwMjExX1NPRlRNQUNfQVNTT0NfUkVUUllfVElNRSAoSFogKiAyKQotCi0jZGVmaW5lIENSQ19MRU5HVEggICAgICAgICAgICAgICAgIDRVCi0KLSNkZWZpbmUgTUFYX1dQQV9JRV9MRU4gNjQKLQotI2RlZmluZSBORVRXT1JLX0VNUFRZX0VTU0lEICgxPDwwKQotI2RlZmluZSBORVRXT1JLX0hBU19PRkRNICAgICgxPDwxKQotI2RlZmluZSBORVRXT1JLX0hBU19DQ0sgICAgICgxPDwyKQotCi0vKiBRb1Mgc3RydWN0dXJlICovCi0jZGVmaW5lIE5FVFdPUktfSEFTX1FPU19QQVJBTUVURVJTICAgICAgKDE8PDMpCi0jZGVmaW5lIE5FVFdPUktfSEFTX1FPU19JTkZPUk1BVElPTiAgICAgKDE8PDQpCi0jZGVmaW5lIE5FVFdPUktfSEFTX1FPU19NQVNLICAgICAgICAgICAgKE5FVFdPUktfSEFTX1FPU19QQVJBTUVURVJTIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRXT1JLX0hBU19RT1NfSU5GT1JNQVRJT04pCi0vKiA4MDIuMTFoICovCi0jZGVmaW5lIE5FVFdPUktfSEFTX1BPV0VSX0NPTlNUUkFJTlQgICAgKDE8PDUpCi0jZGVmaW5lIE5FVFdPUktfSEFTX0NTQSAgICAgICAgICAgICAgICAgKDE8PDYpCi0jZGVmaW5lIE5FVFdPUktfSEFTX1FVSUVUICAgICAgICAgICAgICAgKDE8PDcpCi0jZGVmaW5lIE5FVFdPUktfSEFTX0lCU1NfREZTICAgICAgICAgICAgKDE8PDgpCi0jZGVmaW5lIE5FVFdPUktfSEFTX1RQQ19SRVBPUlQgICAgICAgICAgKDE8PDkpCi0KLSNkZWZpbmUgTkVUV09SS19IQVNfRVJQX1ZBTFVFICAgICAgICAgICAoMTw8MTApCi0KLSNkZWZpbmUgUU9TX1FVRVVFX05VTSAgICAgICAgICAgICAgICAgICA0Ci0jZGVmaW5lIFFPU19PVUlfTEVOICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBRT1NfT1VJX1RZUEUgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgUU9TX0VMRU1FTlRfSUQgICAgICAgICAgICAgICAgICAyMjEKLSNkZWZpbmUgUU9TX09VSV9JTkZPX1NVQl9UWVBFICAgICAgICAgICAwCi0jZGVmaW5lIFFPU19PVUlfUEFSQU1fU1VCX1RZUEUgICAgICAgICAgMQotI2RlZmluZSBRT1NfVkVSU0lPTl8xICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgUU9TX0FJRlNOX01JTl9WQUxVRSAgICAgICAgICAgICAyCi0KLXN0cnVjdCBpZWVlODAyMTFfcW9zX2luZm9ybWF0aW9uX2VsZW1lbnQgewotICAgICAgICB1OCBlbGVtZW50SUQ7Ci0gICAgICAgIHU4IGxlbmd0aDsKLSAgICAgICAgdTggcXVpW1FPU19PVUlfTEVOXTsKLSAgICAgICAgdTggcXVpX3R5cGU7Ci0gICAgICAgIHU4IHF1aV9zdWJ0eXBlOwotICAgICAgICB1OCB2ZXJzaW9uOwotICAgICAgICB1OCBhY19pbmZvOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCBpZWVlODAyMTFfcW9zX2FjX3BhcmFtZXRlciB7Ci0gICAgICAgIHU4IGFjaV9haWZzbjsKLSAgICAgICAgdTggZWN3X21pbl9tYXg7Ci0gICAgICAgIF9fbGUxNiB0eF9vcF9saW1pdDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJfaW5mbyB7Ci0gICAgICAgIHN0cnVjdCBpZWVlODAyMTFfcW9zX2luZm9ybWF0aW9uX2VsZW1lbnQgaW5mb19lbGVtZW50OwotICAgICAgICB1OCByZXNlcnZlZDsKLSAgICAgICAgc3RydWN0IGllZWU4MDIxMV9xb3NfYWNfcGFyYW1ldGVyIGFjX3BhcmFtc19yZWNvcmRbUU9TX1FVRVVFX05VTV07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGllZWU4MDIxMV9xb3NfcGFyYW1ldGVycyB7Ci0gICAgICAgIF9fbGUxNiBjd19taW5bUU9TX1FVRVVFX05VTV07Ci0gICAgICAgIF9fbGUxNiBjd19tYXhbUU9TX1FVRVVFX05VTV07Ci0gICAgICAgIHU4IGFpZnNbUU9TX1FVRVVFX05VTV07Ci0gICAgICAgIHU4IGZsYWdbUU9TX1FVRVVFX05VTV07Ci0gICAgICAgIF9fbGUxNiB0eF9vcF9saW1pdFtRT1NfUVVFVUVfTlVNXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaWVlZTgwMjExX3Fvc19kYXRhIHsKLSAgICAgICAgc3RydWN0IGllZWU4MDIxMV9xb3NfcGFyYW1ldGVycyBwYXJhbWV0ZXJzOwotICAgICAgICBpbnQgYWN0aXZlOwotICAgICAgICBpbnQgc3VwcG9ydGVkOwotICAgICAgICB1OCBwYXJhbV9jb3VudDsKLSAgICAgICAgdTggb2xkX3BhcmFtX2NvdW50OwotfTsKLQotc3RydWN0IGllZWU4MDIxMV90aW1fcGFyYW1ldGVycyB7Ci0gICAgICAgIHU4IHRpbV9jb3VudDsKLSAgICAgICAgdTggdGltX3BlcmlvZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vLyNlbHNlCi1zdHJ1Y3QgaWVlZTgwMjExX3dtbV9hY19wYXJhbSB7Ci0JdTggYWNfYWNpX2FjbV9haWZzbjsKLQl1OCBhY19lY3dtaW5fZWN3bWF4OwotCXUxNiBhY190eG9wX2xpbWl0OwotfTsKLQotc3RydWN0IGllZWU4MDIxMV93bW1fdHNfaW5mbyB7Ci0JdTggYWNfZGlyX3RpZDsKLQl1OCBhY191cF9wc2I7Ci0JdTggcmVzZXJ2ZWQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RydWN0IGllZWU4MDIxMV93bW1fdHNwZWNfZWxlbSB7Ci0Jc3RydWN0IGllZWU4MDIxMV93bW1fdHNfaW5mbyB0c19pbmZvOwotCXUxNiBub3JtX21zZHVfc2l6ZTsKLQl1MTYgbWF4X21zZHVfc2l6ZTsKLQl1MzIgbWluX3NlcnZfaW50ZXI7Ci0JdTMyIG1heF9zZXJ2X2ludGVyOwotCXUzMiBpbmFjdF9pbnRlcjsKLQl1MzIgc3VzcGVuX2ludGVyOwotCXUzMiBzZXJ2X3N0YXJ0X3RpbWU7Ci0JdTMyIG1pbl9kYXRhX3JhdGU7Ci0JdTMyIG1lYW5fZGF0YV9yYXRlOwotCXUzMiBwZWFrX2RhdGFfcmF0ZTsKLQl1MzIgbWF4X2J1cnN0X3NpemU7Ci0JdTMyIGRlbGF5X2JvdW5kOwotCXUzMiBtaW5fcGh5X3JhdGU7Ci0JdTE2IHN1cnBfYmFuZF9hbGxvdzsKLQl1MTYgbWVkaXVtX3RpbWU7Ci19X19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLWVudW0gZWFwX3R5cGUgewotCUVBUF9QQUNLRVQgPSAwLAotCUVBUE9MX1NUQVJULAotCUVBUE9MX0xPR09GRiwKLQlFQVBPTF9LRVksCi0JRUFQT0xfRU5DQVBfQVNGX0FMRVJUCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqZWFwX3R5cGVzW10gPSB7Ci0JW0VBUF9QQUNLRVRdCQk9ICJFQVAtUGFja2V0IiwKLQlbRUFQT0xfU1RBUlRdCQk9ICJFQVBPTC1TdGFydCIsCi0JW0VBUE9MX0xPR09GRl0JCT0gIkVBUE9MLUxvZ29mZiIsCi0JW0VBUE9MX0tFWV0JCT0gIkVBUE9MLUtleSIsCi0JW0VBUE9MX0VOQ0FQX0FTRl9BTEVSVF0JPSAiRUFQT0wtRW5jYXAtQVNGLUFsZXJ0IgotfTsKLQotc3RhdGljIGlubGluZSBjb25zdCBjaGFyICplYXBfZ2V0X3R5cGUoaW50IHR5cGUpCi17Ci0JcmV0dXJuICgodTMyKXR5cGUgPj0gQVJSQVlfU0laRShlYXBfdHlwZXMpKSA/ICJVbmtub3duIiA6IGVhcF90eXBlc1t0eXBlXTsKLX0KLS8vYWRkZWQgYnkgYW15IGZvciByZW9yZGVyCi1zdGF0aWMgaW5saW5lIHU4IEZyYW1lX1FvU1RJRCh1OCogYnVmKQotewotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpoZHI7Ci0JdTE2IGZjOwotCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKWJ1ZjsKLQlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKLQlyZXR1cm4gKHU4KSgoZnJhbWVxb3MqKShidWYgKyAoKChmYyAmIElFRUU4MDIxMV9GQ1RMX1RPRFMpJiYoZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKT8gMzAgOiAyNCkpKS0+ZmllbGQudGlkOwotfQotCi0vL2FkZGVkIGJ5IGFteSBmb3IgcmVvcmRlcgotCi1zdHJ1Y3QgZWFwb2wgewotCXU4IHNuYXBbNl07Ci0JdTE2IGV0aGVydHlwZTsKLQl1OCB2ZXJzaW9uOwotCXU4IHR5cGU7Ci0JdTE2IGxlbmd0aDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaWVlZTgwMjExX3NvZnRtYWNfc3RhdHN7Ci0JdW5zaWduZWQgaW50IHJ4X2Fzc19vazsKLQl1bnNpZ25lZCBpbnQgcnhfYXNzX2VycjsKLQl1bnNpZ25lZCBpbnQgcnhfcHJvYmVfcnE7Ci0JdW5zaWduZWQgaW50IHR4X3Byb2JlX3JzOwotCXVuc2lnbmVkIGludCB0eF9iZWFjb25zOwotCXVuc2lnbmVkIGludCByeF9hdXRoX3JxOwotCXVuc2lnbmVkIGludCByeF9hdXRoX3JzX29rOwotCXVuc2lnbmVkIGludCByeF9hdXRoX3JzX2VycjsKLQl1bnNpZ25lZCBpbnQgdHhfYXV0aF9ycTsKLQl1bnNpZ25lZCBpbnQgbm9fYXV0aF9yczsKLQl1bnNpZ25lZCBpbnQgbm9fYXNzX3JzOwotCXVuc2lnbmVkIGludCB0eF9hc3NfcnE7Ci0JdW5zaWduZWQgaW50IHJ4X2Fzc19ycTsKLQl1bnNpZ25lZCBpbnQgdHhfcHJvYmVfcnE7Ci0JdW5zaWduZWQgaW50IHJlYXNzb2M7Ci0JdW5zaWduZWQgaW50IHN3dHhzdG9wOwotCXVuc2lnbmVkIGludCBzd3R4YXdha2U7Ci0JdW5zaWduZWQgY2hhciBDdXJyZW50U2hvd1R4YXRlOwotCXVuc2lnbmVkIGNoYXIgbGFzdF9wYWNrZXRfcmF0ZTsKLQl1bnNpZ25lZCBpbnQgdHhyZXRyeWNvdW50OwotfTsKLQotI2RlZmluZSBCRUFDT05fUFJPQkVfU1NJRF9JRF9QT1NJVElPTiAxMgotCi1zdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgewotCXU4IGlkOwotCXU4IGxlbjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKgotICogVGhlc2UgYXJlIHRoZSBkYXRhIHR5cGVzIHRoYXQgY2FuIG1ha2UgdXAgbWFuYWdlbWVudCBwYWNrZXRzCi0gKgotCXUxNiBhdXRoX2FsZ29yaXRobTsKLQl1MTYgYXV0aF9zZXF1ZW5jZTsKLQl1MTYgYmVhY29uX2ludGVydmFsOwotCXUxNiBjYXBhYmlsaXR5OwotCXU4IGN1cnJlbnRfYXBbRVRIX0FMRU5dOwotCXUxNiBsaXN0ZW5faW50ZXJ2YWw7Ci0Jc3RydWN0IHsKLQkJdTE2IGFzc29jaWF0aW9uX2lkOjE0LCByZXNlcnZlZDoyOwotCX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCXUzMiB0aW1lX3N0YW1wWzJdOwotCXUxNiByZWFzb247Ci0JdTE2IHN0YXR1czsKLSovCi0KLSNkZWZpbmUgSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQgIlBlbmd1aW4iCi0jZGVmaW5lIElFRUU4MDIxMV9ERUZBVUxUX0JBU0lDX1JBVEUgMiAvLzFNYnBzCi0KLWVudW0ge1dNTV9hbGxfZnJhbWUsIFdNTV90d29fZnJhbWUsIFdNTV9mb3VyX2ZyYW1lLCBXTU1fc2l4X2ZyYW1lfTsKLSNkZWZpbmUgTUFYX1NQX0xlbiAgKFdNTV9hbGxfZnJhbWUgPDwgNCkKLSNkZWZpbmUgSUVFRTgwMjExX1FPU19USUQgMHgwZgotI2RlZmluZSBRT1NfQ1RMX05PVENPTlRBSU5fQUNLICgweDAxIDw8IDUpCi0KLSNkZWZpbmUgSUVFRTgwMjExX0RUSU1fTUJDQVNUIDQKLSNkZWZpbmUgSUVFRTgwMjExX0RUSU1fVUNBU1QgMgotI2RlZmluZSBJRUVFODAyMTFfRFRJTV9WQUxJRCAxCi0jZGVmaW5lIElFRUU4MDIxMV9EVElNX0lOVkFMSUQgMAotCi0jZGVmaW5lIElFRUU4MDIxMV9QU19ESVNBQkxFRCAwCi0jZGVmaW5lIElFRUU4MDIxMV9QU19VTklDQVNUIElFRUU4MDIxMV9EVElNX1VDQVNUCi0jZGVmaW5lIElFRUU4MDIxMV9QU19NQkNBU1QgSUVFRTgwMjExX0RUSU1fTUJDQVNUCi0KLS8vYWRkZWQgYnkgRGF2aWQgZm9yIFFvUyAyMDA2LzYvMzAKLS8vI2RlZmluZSBXTU1fSGFuZ184MTg3Ci0jaWZkZWYgV01NX0hhbmdfODE4NwotI3VuZGVmIFdNTV9IYW5nXzgxODcKLSNlbmRpZgotCi0jZGVmaW5lIFdNRV9BQ19CSyAgIDB4MDAKLSNkZWZpbmUgV01FX0FDX0JFICAgMHgwMQotI2RlZmluZSBXTUVfQUNfVkkgICAweDAyCi0jZGVmaW5lIFdNRV9BQ19WTyAgIDB4MDMKLSNkZWZpbmUgV01FX0FDSV9NQVNLIDB4MDMKLSNkZWZpbmUgV01FX0FJRlNOX01BU0sgMHgwMwotI2RlZmluZSBXTUVfQUNfUFJBTV9MRU4gMTYKLQotI2RlZmluZSBNQVhfUkVDRUlWRV9CVUZGRVJfU0laRSA5MTAwCi0KLS8vVVAgTWFwcGluZyB0byBBQywgdXNpbmcgaW4gTWdudFF1ZXJ5X1NlcXVlbmNlTnVtYmVyKCkgYW5kIG1heWJlIGZvciBEU0NQCi0jZGVmaW5lIFVQMkFDKHVwKSAoCQkgICBcCi0JKCh1cCkgPCAxKSA/IFdNRV9BQ19CRSA6IFwKLQkoKHVwKSA8IDMpID8gV01FX0FDX0JLIDogXAotCSgodXApIDwgNCkgPyBXTUVfQUNfQkUgOiBcCi0JKCh1cCkgPCA2KSA/IFdNRV9BQ19WSSA6IFwKLQlXTUVfQUNfVk8pCi0KLS8vQUMgTWFwcGluZyB0byBVUCwgdXNpbmcgaW4gVHggcGFydCBmb3Igc2VsZWN0aW5nIHRoZSBjb3JyZXNwb25kaW5nIFRYIHF1ZXVlCi0jZGVmaW5lIEFDMlVQKF9hYykJKCAgICAgICBcCi0JKChfYWMpID09IFdNRV9BQ19WTykgPyA2IDogXAotCSgoX2FjKSA9PSBXTUVfQUNfVkkpID8gNSA6IFwKLQkoKF9hYykgPT0gV01FX0FDX0JLKSA/IDEgOiBcCi0JMCkKLQotI2RlZmluZQlFVEhFUl9BRERSX0xFTgkJNgkvKiBsZW5ndGggb2YgYW4gRXRoZXJuZXQgYWRkcmVzcyAqLwotI2RlZmluZSBFVEhFUk5FVF9IRUFERVJfU0laRSAgICAxNCAgICAgIC8qIGxlbmd0aCBvZiB0d28gRXRoZXJuZXQgYWRkcmVzcyBwbHVzIGV0aGVyIHR5cGUqLwotCi1zdHJ1Y3QJZXRoZXJfaGVhZGVyIHsKLQl1OCBldGhlcl9kaG9zdFtFVEhFUl9BRERSX0xFTl07Ci0JdTggZXRoZXJfc2hvc3RbRVRIRVJfQUREUl9MRU5dOwotCXUxNiBldGhlcl90eXBlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotI2lmbmRlZiBFVEhFUlRZUEVfUEFFCi0jZGVmaW5lCUVUSEVSVFlQRV9QQUUJMHg4ODhlCQkvKiBFQVBPTCBQQUUvODAyLjF4ICovCi0jZW5kaWYKLSNpZm5kZWYgRVRIRVJUWVBFX0lQCi0jZGVmaW5lCUVUSEVSVFlQRV9JUAkweDA4MDAJCS8qIElQIHByb3RvY29sICovCi0jZW5kaWYKLQotdHlwZWRlZiBzdHJ1Y3QgX2Jzc19odHsKLQotCWJvb2wJCQkJc3VwcG9ydF9odDsKLQotCS8vIEhUIHJlbGF0ZWQgZWxlbWVudHMKLQl1OAkJCQkJaHRfY2FwX2J1ZlszMl07Ci0JdTE2CQkJCQlodF9jYXBfbGVuOwotCXU4CQkJCQlodF9pbmZvX2J1ZlszMl07Ci0JdTE2CQkJCQlodF9pbmZvX2xlbjsKLQotCUhUX1NQRUNfVkVSCQkJaHRfc3BlY192ZXI7Ci0KLQlib29sCQkJCWFnZ3JlZ2F0aW9uOwotCWJvb2wJCQkJbG9uZ19zbG90X3RpbWU7Ci19YnNzX2h0LCAqcGJzc19odDsKLQotdHlwZWRlZiBlbnVtIF9lcnBfdHsKLQlFUlBfTm9uRVJQcHJlc2VudAk9IDB4MDEsCi0JRVJQX1VzZVByb3RlY3Rpb24JPSAweDAyLAotCUVSUF9CYXJrZXJQcmVhbWJsZU1vZGUgPSAweDA0LAotfSBlcnBfdDsKLQotCi1zdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgewotCS8qIFRoZXNlIGVudHJpZXMgYXJlIHVzZWQgdG8gaWRlbnRpZnkgYSB1bmlxdWUgbmV0d29yayAqLwotCXU4IGJzc2lkW0VUSF9BTEVOXTsKLQl1OCBjaGFubmVsOwotCS8qIEVuc3VyZSBudWxsLXRlcm1pbmF0ZWQgZm9yIGFueSBkZWJ1ZyBtc2dzICovCi0JdTggc3NpZFtJV19FU1NJRF9NQVhfU0laRSArIDFdOwotCXU4IHNzaWRfbGVuOwotICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3Fvc19kYXRhIHFvc19kYXRhOwotCi0JLy9hZGRlZCBieSBhbXkgZm9yIExFQVAKLQlib29sCWJXaXRoQWlyb25ldElFOwotCWJvb2wJYkNraXBTdXBwb3J0ZWQ7Ci0JYm9vbAliQ2N4Um1FbmFibGU7Ci0JdTE2IAlDY3hSbVN0YXRlWzJdOwotCS8vIENDWHY0IFM1OSwgTUJTU0lELgotCWJvb2wJYk1Cc3NpZFZhbGlkOwotCXU4CU1Cc3NpZE1hc2s7Ci0JdTgJTUJzc2lkWzZdOwotCS8vIENDWCAyIFMzOCwgV0xBTiBEZXZpY2UgVmVyc2lvbiBOdW1iZXIgZWxlbWVudC4gQW5uaWUsIDIwMDYtMDgtMjAuCi0JYm9vbAliV2l0aENjeFZlck51bTsKLQl1OAlCc3NDY3hWZXJOdW1iZXI7Ci0JLyogVGhlc2UgYXJlIG5ldHdvcmsgc3RhdGlzdGljcyAqLwotCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgc3RhdHM7Ci0JdTE2IGNhcGFiaWxpdHk7Ci0JdTggIHJhdGVzW01BWF9SQVRFU19MRU5HVEhdOwotCXU4ICByYXRlc19sZW47Ci0JdTggIHJhdGVzX2V4W01BWF9SQVRFU19FWF9MRU5HVEhdOwotCXU4ICByYXRlc19leF9sZW47Ci0JdW5zaWduZWQgbG9uZyBsYXN0X3NjYW5uZWQ7Ci0JdTggIG1vZGU7Ci0JdTMyIGZsYWdzOwotCXUzMiBsYXN0X2Fzc29jaWF0ZTsKLQl1MzIgdGltZV9zdGFtcFsyXTsKLQl1MTYgYmVhY29uX2ludGVydmFsOwotCXUxNiBsaXN0ZW5faW50ZXJ2YWw7Ci0JdTE2IGF0aW1fd2luZG93OwotCXU4ICBlcnBfdmFsdWU7Ci0JdTggIHdwYV9pZVtNQVhfV1BBX0lFX0xFTl07Ci0Jc2l6ZV90IHdwYV9pZV9sZW47Ci0JdTggIHJzbl9pZVtNQVhfV1BBX0lFX0xFTl07Ci0Jc2l6ZV90IHJzbl9pZV9sZW47Ci0KLSAgICAgICAgc3RydWN0IGllZWU4MDIxMV90aW1fcGFyYW1ldGVycyB0aW07Ci0JdTggIGR0aW1fcGVyaW9kOwotCXU4ICBkdGltX2RhdGE7Ci0JdTMyIGxhc3RfZHRpbV9zdGFfdGltZVsyXTsKLQotICAgICAgICAvL2FwcGVkZWQgZm9yIFFvUwotICAgICAgICB1OCB3bW1faW5mbzsKLSAgICAgICAgc3RydWN0IGllZWU4MDIxMV93bW1fYWNfcGFyYW0gd21tX3BhcmFtWzRdOwotICAgICAgICB1OCBRb1NfRW5hYmxlOwotI2lmZGVmIFRIT01BU19UVVJCTwotCXU4IFR1cmJvX0VuYWJsZTsvL2VuYWJsZSB0dXJibyBtb2RlLCBhZGRlZCBieSB0aG9tYXMKLSNlbmRpZgotI2lmZGVmIEVOQUJMRV9ET1QxMUQKLQl1MTYgQ291bnRyeUllTGVuOwotCXU4IENvdW50cnlJZUJ1ZltNQVhfSUVfTEVOXTsKLSNlbmRpZgotICAgICAgICAvLyBIVCBSZWxhdGVkLCBieSBhbXksIDIwMDguMDQuMjkKLQlCU1NfSFQJYnNzaHQ7Ci0JLy8gQWRkIHRvIGhhbmRsZSBicm9hZGNvbSBBUCBtYW5hZ2VtZW50IGZyYW1lIENDSyByYXRlLgotCWJvb2wgYnJvYWRjb21fY2FwX2V4aXN0OwotCWJvb2wgcmFsaW5rX2NhcF9leGlzdDsKLQlib29sIGF0aGVyb3NfY2FwX2V4aXN0OwotCWJvb2wgY2lzY29fY2FwX2V4aXN0OwotCWJvb2wgbWFydmVsbF9jYXBfZXhpc3Q7Ci0JYm9vbCB1bmtub3duX2NhcF9leGlzdDsKLS8vCXU4CWJlcnBfaW5mbzsKLQlib29sCWJlcnBfaW5mb192YWxpZDsKLQlib29sIGJ1c2Vwcm90ZWN0aW9uOwotCS8vcHV0IGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZS4KLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci19OwotCi1lbnVtIGllZWU4MDIxMV9zdGF0ZSB7Ci0KLQkvKiB0aGUgY2FyZCBpcyBub3QgbGlua2VkIGF0IGFsbCAqLwotCUlFRUU4MDIxMV9OT0xJTksgPSAwLAotCi0JLyogSUVFRTgwMjExX0FTU09DSUFUSU5HKiBhcmUgZm9yIEJTUyBjbGllbnQgbW9kZQotCSAqIHRoZSBkcml2ZXIgc2hhbGwgbm90IHBlcmZvcm0gUlggZmlsdGVyaW5nIHVubGVzcwotCSAqIHRoZSBzdGF0ZSBpcyBMSU5LRUQuCi0JICogVGhlIGRyaXZlciBzaGFsbCBqdXN0IGNoZWNrIGZvciB0aGUgc3RhdGUgTElOS0VEIGFuZAotCSAqIGRlZmF1bHRzIHRvIE5PTElOSyBmb3IgQUxMIHRoZSBvdGhlciBzdGF0ZXMgKGluY2x1ZGluZwotCSAqIExJTktFRF9TQ0FOTklORykKLQkgKi8KLQotCS8qIHRoZSBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgd2lsbCBzdGFydCAod3Egc2NoZWR1bGluZykqLwotCUlFRUU4MDIxMV9BU1NPQ0lBVElORywKLQlJRUVFODAyMTFfQVNTT0NJQVRJTkdfUkVUUlksCi0KLQkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIGlzIHNlbmRpbmcgQVVUSCByZXF1ZXN0Ki8KLQlJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcsCi0KLQkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIGhhcyBzdWNjZXNzZnVsbHkgYXV0aGVudGNhdGVkCi0JICogYW5kIGlzIHNlbmRpbmcgYXNzb2NpYXRpb24gcmVxdWVzdAotCSAqLwotCUlFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVEVELAotCi0JLyogdGhlIGxpbmsgaXMgb2suIHRoZSBjYXJkIGFzc29jaWF0ZWQgdG8gYSBCU1Mgb3IgbGlua2VkCi0JICogdG8gYSBpYnNzIGNlbGwgb3IgYWN0aW5nIGFzIGFuIEFQIGFuZCBjcmVhdGluZyB0aGUgYnNzCi0JICovCi0JSUVFRTgwMjExX0xJTktFRCwKLQotCS8qIHNhbWUgYXMgTElOS0VELCBidXQgdGhlIGRyaXZlciBzaGFsbCBhcHBseSBSWCBmaWx0ZXIKLQkgKiBydWxlcyBhcyB3ZSBhcmUgaW4gTk9fTElOSyBtb2RlLiBBcyB0aGUgY2FyZCBpcyBzdGlsbAotCSAqIGxvZ2ljYWxseSBsaW5rZWQsIGJ1dCBpdCBpcyBkb2luZyBhIHN5bmNybyBzaXRlIHN1cnZleQotCSAqIHRoZW4gaXQgd2lsbCBiZSBiYWNrIHRvIExJTktFRCBzdGF0ZS4KLQkgKi8KLQlJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HLAotCi19OwotCi0jZGVmaW5lIERFRkFVTFRfTUFYX1NDQU5fQUdFICgxNSAqIEhaKQotI2RlZmluZSBERUZBVUxUX0ZUUyAyMzQ2Ci0KLSNkZWZpbmUgQ0ZHX0lFRUU4MDIxMV9SRVNFUlZFX0ZDUyAoMTw8MCkKLSNkZWZpbmUgQ0ZHX0lFRUU4MDIxMV9DT01QVVRFX0ZDUyAoMTw8MSkKLSNkZWZpbmUgQ0ZHX0lFRUU4MDIxMV9SVFMgKDE8PDIpCi0KLSNkZWZpbmUgSUVFRTgwMjExXzI0R0haX01JTl9DSEFOTkVMIDEKLSNkZWZpbmUgSUVFRTgwMjExXzI0R0haX01BWF9DSEFOTkVMIDE0Ci0jZGVmaW5lIElFRUU4MDIxMV8yNEdIWl9DSEFOTkVMUyAoSUVFRTgwMjExXzI0R0haX01BWF9DSEFOTkVMIC0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV8yNEdIWl9NSU5fQ0hBTk5FTCArIDEpCi0KLSNkZWZpbmUgSUVFRTgwMjExXzUyR0haX01JTl9DSEFOTkVMIDM0Ci0jZGVmaW5lIElFRUU4MDIxMV81MkdIWl9NQVhfQ0hBTk5FTCAxNjUKLSNkZWZpbmUgSUVFRTgwMjExXzUyR0haX0NIQU5ORUxTIChJRUVFODAyMTFfNTJHSFpfTUFYX0NIQU5ORUwgLSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVFRTgwMjExXzUyR0haX01JTl9DSEFOTkVMICsgMSkKLQotdHlwZWRlZiBzdHJ1Y3QgdHhfcGVuZGluZ190ewotCWludCBmcmFnOwotCXN0cnVjdCBpZWVlODAyMTFfdHhiICp0eGI7Ci19dHhfcGVuZGluZ190OwotCi10eXBlZGVmIHN0cnVjdCBfYmFuZHdpZHRoX2F1dG9zd2l0Y2gKLXsKLQlsb25nIHRocmVzaG9sZF8yME1oenRvNDBNaHo7Ci0JbG9uZwl0aHJlc2hvbGRfNDBNaHp0bzIwTWh6OwotCWJvb2wgYmZvcmNlZF90eDIwTWh6OwotCWJvb2wgYmF1dG9zd2l0Y2hfZW5hYmxlOwotfWJhbmR3aWR0aF9hdXRvc3dpdGNoLCpwYmFuZHdpZHRoX2F1dG9zd2l0Y2g7Ci0KLQotLy9hZGRlZCBieSBhbXkgZm9yIG9yZGVyCi0KLSNkZWZpbmUgUkVPUkRFUl9XSU5fU0laRQkxMjgKLSNkZWZpbmUgUkVPUkRFUl9FTlRSWV9OVU0JMTI4Ci10eXBlZGVmIHN0cnVjdCBfUlhfUkVPUkRFUl9FTlRSWQotewotCXN0cnVjdCBsaXN0X2hlYWQJTGlzdDsKLQl1MTYJCQlTZXFOdW07Ci0Jc3RydWN0IGllZWU4MDIxMV9yeGIqIHByeGI7Ci19IFJYX1JFT1JERVJfRU5UUlksICpQUlhfUkVPUkRFUl9FTlRSWTsKLS8vYWRkZWQgYnkgYW15IGZvciBvcmRlcgotdHlwZWRlZiBlbnVtIF9Gc3luY19TdGF0ZXsKLQlEZWZhdWx0X0ZzeW5jLAotCUhXX0ZzeW5jLAotCVNXX0ZzeW5jCi19RnN5bmNfU3RhdGU7Ci0KLXR5cGVkZWYgc3RydWN0IF9JYnNzUGFybXN7Ci0JdTE2ICAgYXRpbVdpbjsKLX1JYnNzUGFybXMsICpQSWJzc1Bhcm1zOwotI2RlZmluZSBNQVhfTlVNX1JBVEVTCTI2NCAvLyBNYXggbnVtIG9mIHN1cHBvcnQgcmF0ZXMgZWxlbWVudDogOCwgIE1heCBudW0gb2YgZXh0LiBzdXBwb3J0IHJhdGU6IDI1NS4gMDYxMTIyLCBieSByY25qa28uCi0KLSNpZmRlZiBFTkFCTEVfRE9UMTFECi10eXBlZGVmIGVudW0KLXsKLQlDT1VOVFJZX0NPREVfRkNDID0gMCwKLQlDT1VOVFJZX0NPREVfSUMgPSAxLAotCUNPVU5UUllfQ09ERV9FVFNJID0gMiwKLQlDT1VOVFJZX0NPREVfU1BBSU4gPSAzLAotCUNPVU5UUllfQ09ERV9GUkFOQ0UgPSA0LAotCUNPVU5UUllfQ09ERV9NS0sgPSA1LAotCUNPVU5UUllfQ09ERV9NS0sxID0gNiwKLQlDT1VOVFJZX0NPREVfSVNSQUVMID0gNywKLQlDT1VOVFJZX0NPREVfVEVMRUMsCi0JQ09VTlRSWV9DT0RFX01JQywKLQlDT1VOVFJZX0NPREVfR0xPQkFMX0RPTUFJTgotfWNvdW50cnlfY29kZV90eXBlX3Q7Ci0jZW5kaWYKLQotI2RlZmluZSBSVF9NQVhfTERfU0xPVF9OVU0JMTAKLXR5cGVkZWYgc3RydWN0IF9SVF9MSU5LX0RFVEVDVF9UewotCi0JdTMyCQkJCU51bVJlY3ZCY25JblBlcmlvZDsKLQl1MzIJCQkJTnVtUmVjdkRhdGFJblBlcmlvZDsKLQotCXUzMgkJCQlSeEJjbk51bVtSVF9NQVhfTERfU0xPVF9OVU1dOwkvLyBudW1iZXIgb2YgUnggYmVhY29uIC8gQ2hlY2tGb3JIYW5nX3BlcmlvZCAgdG8gZGV0ZXJtaW5lIGxpbmsgc3RhdHVzCi0JdTMyCQkJCVJ4RGF0YU51bVtSVF9NQVhfTERfU0xPVF9OVU1dOwkvLyBudW1iZXIgb2YgUnggZGF0YSAvIENoZWNrRm9ySGFuZ19wZXJpb2QgIHRvIGRldGVybWluZSBsaW5rIHN0YXR1cwotCXUxNgkJCQlTbG90TnVtOwkvLyBudW1iZXIgb2YgQ2hlY2tGb3JIYW5nIHBlcmlvZCB0byBkZXRlcm1pbmUgbGluayBzdGF0dXMKLQl1MTYJCQkJU2xvdEluZGV4OwotCi0JdTMyCQkJCU51bVR4T2tJblBlcmlvZDsKLQl1MzIJCQkJTnVtUnhPa0luUGVyaW9kOwotCXUzMgkJCQlOdW1SeFVuaWNhc3RPa0luUGVyaW9kOwotCWJvb2wJCQkJYkJ1c3lUcmFmZmljOwotfVJUX0xJTktfREVURUNUX1QsICpQUlRfTElOS19ERVRFQ1RfVDsKLQotLy9hZGRlZCBieSBhbXkgMDkwMzMwCi10eXBlZGVmIGVudW0gX0hXX1ZBUklBQkxFU3sKLQlIV19WQVJfRVRIRVJfQUREUiwKLQlIV19WQVJfTVVMVElDQVNUX1JFRywKLQlIV19WQVJfQkFTSUNfUkFURSwKLQlIV19WQVJfQlNTSUQsCi0JSFdfVkFSX01FRElBX1NUQVRVUywKLQlIV19WQVJfU0VDVVJJVFlfQ09ORiwKLQlIV19WQVJfQkVBQ09OX0lOVEVSVkFMLAotCUhXX1ZBUl9BVElNX1dJTkRPVywKLQlIV19WQVJfTElTVEVOX0lOVEVSVkFMLAotCUhXX1ZBUl9DU19DT1VOVEVSLAotCUhXX1ZBUl9ERUZBVUxUS0VZMCwKLQlIV19WQVJfREVGQVVMVEtFWTEsCi0JSFdfVkFSX0RFRkFVTFRLRVkyLAotCUhXX1ZBUl9ERUZBVUxUS0VZMywKLQlIV19WQVJfU0lGUywKLQlIV19WQVJfRElGUywKLQlIV19WQVJfRUlGUywKLQlIV19WQVJfU0xPVF9USU1FLAotCUhXX1ZBUl9BQ0tfUFJFQU1CTEUsCi0JSFdfVkFSX0NXX0NPTkZJRywKLQlIV19WQVJfQ1dfVkFMVUVTLAotCUhXX1ZBUl9SQVRFX0ZBTExCQUNLX0NPTlRST0wsCi0JSFdfVkFSX0NPTlRFTlRJT05fV0lORE9XLAotCUhXX1ZBUl9SRVRSWV9DT1VOVCwKLQlIV19WQVJfVFJfU1dJVENILAotCUhXX1ZBUl9DT01NQU5ELAkJCS8vIEZvciBDb21tYW5kIFJlZ2lzdGVyLCBBbm5pZSwgMjAwNi0wNC0wNy4KLQlIV19WQVJfV1BBX0NPTkZJRywJCS8vMjAwNC8wOC8yMywga2N3dSwgZm9yIDgxODcgU2VjdXJpdHkgY29uZmlnCi0JSFdfVkFSX0FNUERVX01JTl9TUEFDRSwJLy8gVGhlIHNwYWNpbmcgYmV0d2VlbiBzdWItZnJhbWUuIFJvZ2VyLCAyMDA4LjA3LjA0LgotCUhXX1ZBUl9TSE9SVEdJX0RFTlNJVFksCS8vIFRoZSBkZW5zaXR5IGZvciBzaG9ydEdJLiBSb2dlciwgMjAwOC4wNy4wNC4KLQlIV19WQVJfQU1QRFVfRkFDVE9SLAotCUhXX1ZBUl9NQ1NfUkFURV9BVkFJTEFCTEUsCi0JSFdfVkFSX0FDX1BBUkFNLAkJCS8vIEZvciBBQyBQYXJhbWV0ZXJzLCAyMDA1LjEyLjAxLCBieSByY25qa28uCi0JSFdfVkFSX0FDTV9DVFJMLAkJCS8vIEZvciBBQ00gQ29udHJvbCwgQW5uaWUsIDIwMDUtMTItMTMuCi0JSFdfVkFSX0RJU19SZXFfUXNpemUsCQkvLyBGb3IgRElTX1JlZ19Rc2l6ZSwgSm9zZXBoCi0JSFdfVkFSX0NDWF9DSE5MX0xPQUQsCQkvLyBGb3IgQ0NYIDIgY2hhbm5lbCBsb2FkIHJlcXVlc3QsIDIwMDYuMDUuMDQuCi0JSFdfVkFSX0NDWF9OT0lTRV9ISVNUT0dSQU0sCS8vIEZvciBDQ1ggMiBub2lzZSBoaXN0b2dyYW0gcmVxdWVzdCwgMjAwNi4wNS4wNC4KLQlIV19WQVJfQ0NYX0NMTV9OSE0sCQkJLy8gRm9yIENDWCAyIHBhcmFsbGVsIGNoYW5uZWwgbG9hZCByZXF1ZXN0IGFuZCBub2lzZSBoaXN0b2dyYW0gcmVxdWVzdCwgMjAwNi4wNS4xMi4KLQlIV19WQVJfVHhPUExpbWl0LAkJCQkvLyBGb3IgdHVyYm8gbW9kZSByZWxhdGVkIHNldHRpbmdzLCBhZGRlZCBieSBSb2dlciwgMjAwNi4xMi4wNwotCUhXX1ZBUl9UVVJCT19NT0RFLAkJCS8vIEZvciB0dXJibyBtb2RlIHJlbGF0ZWQgc2V0dGluZ3MsIGFkZGVkIGJ5IFJvZ2VyLCAyMDA2LjEyLjE1LgotCUhXX1ZBUl9SRl9TVEFURSwgCQkJLy8gRm9yIGNoYW5nZSBvciBxdWVyeSBSRiBwb3dlciBzdGF0ZSwgMDYxMjE0LCByY25qa28uCi0JSFdfVkFSX1JGX09GRl9CWV9IVywJCS8vIEZvciBVSSB0byBxdWVyeSBpZiBleHRlcm5hbCBIVyBzaWduYWwgZGlzYWJsZSBSRiwgMDYxMjI5LCByY25qa28uCi0JSFdfVkFSX0JVU19TUEVFRCwgCQkvLyBJbiB1bml0IG9mIGJwcy4gMjAwNi4wNy4wMywgYnkgcmNuamtvLgotICAgICAgICBIV19WQVJfU0VUX0RFVl9QT1dFUiwJLy8gU2V0IHRvIGxvdyBwb3dlciwgYWRkZWQgYnkgTGFuSHNpbiwgMjAwNy4KLQotCS8vMSEhISEhISEhISEhISEhISEhISEhISEhISEhIQotCS8vMUF0dGVudGlvbiBQbGVhc2UhISE8MTFuIG9yIDgxOTAgc3BlY2lmaWMgY29kZSBzaG91bGQgYmUgcHV0IGJlbG93IHRoaXMgbGluZT4KLQkvLzEhISEhISEhISEhISEhISEhISEhISEhISEhISEKLQlIV19WQVJfUkNSLAkJCQkvL2ZvciBSQ1IsIERhdmlkIDIwMDYsMDUsMTEKLQlIV19WQVJfUkFUUl8wLAotCUhXX1ZBUl9SUlNSLAotCUhXX1ZBUl9DUFVfUlNULAotCUhXX1ZBUl9DSEVDS19CU1NJRCwKLSAgICAgICAgSFdfVkFSX0xCS19NT0RFLAkJCS8vIFNldCBsb29rYmFjayBtb2RlLCAyMDA4LjA2LjExLiBhZGRlZCBieSBSb2dlci4KLQkvLyBTZXQgSFcgcmVsYXRlZCBzZXR0aW5nIGZvciAxMU4gQUVTIGJ1Zy4KLQlIV19WQVJfQUVTXzExTl9GSVgsCi0JLy8gU2V0IFVzYiBSeCBBZ2dyZWdhdGlvbgotCUhXX1ZBUl9VU0JfUlhfQUdHUiwKLQlIV19WQVJfVVNFUl9DT05UUk9MX1RVUkJPX01PREUsCi0JSFdfVkFSX1JFVFJZX0xJTUlULAotI2lmbmRlZiBfUlRMODE5Ml9FWFRfUEFUQ0hfCi0JSFdfVkFSX0lOSVRfVFhfUkFURSwgIC8vR2V0IEN1cnJlbnQgVHggcmF0ZSByZWdpc3Rlci4gMjAwOC4xMi4xMC4gQWRkZWQgYnkgdHlubGkKLSNlbmRpZgotCUhXX1ZBUl9UWF9SQVRFX1JFRywgIC8vR2V0IEN1cnJlbnQgVHggcmF0ZSByZWdpc3Rlci4gMjAwOC4xMi4xMC4gQWRkZWQgYnkgdHlubGkKLQlIV19WQVJfRUZVU0VfVVNBR0UsIC8vR2V0IGN1cnJlbnQgRUZVU0UgdXRpbGl6YXRpb24uIDIwMDguMTIuMTkuIEFkZGVkIGJ5IFJvZ2VyLgotCUhXX1ZBUl9FRlVTRV9CWVRFUywKLQlIV19WQVJfQVVUT0xPQURfU1RBVFVTLCAvL0dldCBjdXJyZW50IGF1dG9sb2FkIHN0YXR1cywgMDogYXV0b2xvYWQgc3VjY2VzcywgMTogYXV0b2xvYWQgZmFpbC4gMjAwOC4xMi4xOS4gQWRkZWQgYnkgUm9nZXIuCi0JSFdfVkFSX1JGXzJSX0RJU0FCTEUsIC8vIDJSIGRpc2FibGUKLQlIV19WQVJfU0VUX1JQV00sCi0JSFdfVkFSX0gyQ19GV19QV1JNT0RFLCAvLyBGb3Igc2V0dGluZyBGVyByZWxhdGVkIEgyQyBjbWQgc3RydWN0dXJlLiBieSB0eW5saS4gMjAwOS4yLjE4Ci0JSFdfVkFSX0gyQ19GV19KT0lOQlNTUlBULCAvLyBGb3Igc2V0dGluZyBGVyByZWxhdGVkIEgyQyBjbWQgc3RydWN0dXJlLiBieSB0eW5saS4gMjAwOS4yLjE4Ci0JSFdfVkFSXzFYMV9SRUNWX0NPTUJJTkUsCS8vIEZvciAxVDJSIGJ1dCBvbmx5IDFTUywgQWRkIGJ5IGhwZmFuIDIwMDkuMDQuMTYgaHBmYW4KLQlIV19WQVJfU1RPUF9TRU5EX0JFQUNPTiwKLQlIV19WQVJfVFNGX1RJTUVSLAkJCS8vIFJlYWQgZnJvbSBUU0YgcmVnaXN0ZXIgdG8gZ2V0IHRoZSBjdXJyZW50IFRTRiB0aW1lciwgYnkgQnJ1Y2UsIDIwMDktMDctMjIuCi0JSFdfVkFSX0lPX0NNRCwKLQlIV19WQVJfSEFORExFX0ZXX0MySCwJCS8vQWRkZWQgYnkgdHlubGkuIEZvciBoYW5kbGluZyBGVyBDMkggY29tbWFuZC4gMjAwOS4xMC4wNy4KLQlIV19WQVJfRExfRldfUlNWRF9QQUdFLCAJCS8vQWRkZWQgYnkgdHlubGkuIERvd25sb2FkIHRoZSBwYWNrZXRzIHRoYXQgRlcgd2lsbCB1c2UgdG8gUlNWRCBwYWdlLiAyMDA5LjEwLjE0LgotCUhXX1ZBUl9BSUQsCQkJCS8vQWRkZWQgYnkgdHlubGkuCi0JSFdfVkFSX0hXX1NFUV9FTkFCTEUsCQkvL0FkZGVkIGJ5IHR5bmxpLiAyMDA5LjEwLjIwLgotCUhXX1ZBUl9VUERBVEVfVFNGLAkJCS8vQWRkZWQgYnkgdHlubGkuIDIwMDkuMTAuMjIuIEZvciBIdyBjb3VudCBUQlRUIHRpbWUuCi0JSFdfVkFSX0JDTl9WQUxJRCwJCQkJLy9BZGRlZCBieSB0eW5saS4KLQlIV19WQVJfRldMUFNfUkZfT04JCQkvL0FkZGVkIGJ5IHR5bmxpLiAyMDA5LjExLjA5LiBGb3IgY2hlY2tpbmcgaWYgRncgZmluaXNocyBSRiBvbiBzZXF1ZW5jZS4KLX1IV19WQVJJQUJMRVM7Ci0KLSNkZWZpbmUgUlRfQ0hFQ0tfRk9SX0hBTkdfUEVSSU9EIDIKLQotc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0gICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjOwotCi0JYm9vbAluZWVkX3N3X2VuYzsKLSNpZmRlZiBFTkFCTEVfTFBTCi0JYm9vbCBiQXdha2VQa3RTZW50OwotCXU4ICBMUFNEZWxheUNudDsKLQlib29sIGJJc0FnZ3JlZ2F0ZUZyYW1lOwotCWJvb2wgcG9sbGluZzsKLQl2b2lkICgqTGVpc3VyZVBTTGVhdmUpKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLSNlbmRpZgotCi0jaWZkZWYgRU5BQkxFX0lQUwotCWJvb2wgcHJvdG9fc3RvcHBwaW5nOwotCWJvb2wgd3hfc2V0X2VuYzsKLQlzdHJ1Y3Qgc2VtYXBob3JlIGlwc19zZW07Ci0Jc3RydWN0IHdvcmtfc3RydWN0IGlwc19sZWF2ZV93cTsKLSAgICAgICAgdm9pZCAoKmllZWU4MDIxMV9pcHNfbGVhdmVfd3EpIChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci0gICAgICAgIHZvaWQgKCppZWVlODAyMTFfaXBzX2xlYXZlKShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci0jZW5kaWYKLQl2b2lkICgqU2V0SHdSZWdIYW5kbGVyKShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggdmFyaWFibGUsIHU4ICp2YWwpOwotCXU4ICAgKCpydGxsaWJfYXBfc2VjX3R5cGUpKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLQotCS8vaHcgc2VjdXJpdHkgcmVsYXRlZAotCXU4IGh3c2VjX2FjdGl2ZTsgIC8vaHcgc2VjdXJpdHkgYWN0aXZlLgotCWJvb2wgaXNfc2lsZW50X3Jlc2V0OwotCWJvb2wgaXNfcm9hbWluZzsKLQlib29sIGllZWVfdXA7Ci0JYm9vbCBiU3VwcG9ydFJlbW90ZVdha2VVcDsKLQlib29sIGFjdHNjYW5uaW5nOwotCWJvb2wgYmVpbnJldHJ5OwotCWJvb2wgaXNfc2V0X2tleTsKLQkvLzExbiBzcGVjIHJlbGF0ZWQgSSB3b25kZXIgaWYgVGhlc2UgaW5mbyBzdHJ1Y3R1cmUgbmVlZCB0byBiZSBtb3ZlZCBvdXQgb2YgaWVlZTgwMjExX2RldmljZQotCi0JLy8xMW4gSFQgYmVsb3cKLQlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm87Ci0Jc3BpbmxvY2tfdCBid19zcGlubG9jazsKLQotCXNwaW5sb2NrX3QgcmVvcmRlcl9zcGlubG9jazsKLQkvLyBmb3IgSFQgb3BlcmF0aW9uIHJhdGUgc2V0LiAgd2UgdXNlIHRoaXMgb25lIGZvciBIVCBkYXRhIHJhdGUgdG8gc2VwYXJhdGUgZGlmZmVyZW50IGRlc2NyaXB0b3JzCi0JLy90aGUgd2F5IGZpbGwgdGhpcyBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgSUUKLQl1OAlSZWdkb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0WzE2XTsJCS8vdXNlIFJBVFIgZm9ybWF0Ci0JdTgJZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldFsxNl07CQkvL3VzZSBSQVRSIGZvcm1hdAotCXU4CVJlZ0hUU3VwcFJhdGVTZXRbMTZdOwotCXU4CQkJCUhUQ3VycmVudE9wZXJhUmF0ZTsKLQl1OAkJCQlIVEhpZ2hlc3RPcGVyYVJhdGU7Ci0JLy93YiBhZGRlZCBmb3IgcmF0ZSBvcGVyYXRpb24gbW9kZSB0byBmaXJtd2FyZQotCXU4CWJUeERpc2FibGVSYXRlRmFsbEJhY2s7Ci0JdTggCWJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZTsKLQlhdG9taWNfdAlhdG1fY2hubG9wOwotCWF0b21pY190CWF0bV9zd2J3OwotCi0JLy8gODAyLjExZSBhbmQgV01NIFRyYWZmaWMgU3RyZWFtIEluZm8gKFRYKQotCXN0cnVjdCBsaXN0X2hlYWQJCVR4X1RTX0FkbWl0X0xpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJVHhfVFNfUGVuZGluZ19MaXN0OwotCXN0cnVjdCBsaXN0X2hlYWQJCVR4X1RTX1VudXNlZF9MaXN0OwotCVRYX1RTX1JFQ09SRAkJVHhUc1JlY29yZFtUT1RBTF9UU19OVU1dOwotCS8vIDgwMi4xMWUgYW5kIFdNTSBUcmFmZmljIFN0cmVhbSBJbmZvIChSWCkKLQlzdHJ1Y3QgbGlzdF9oZWFkCQlSeF9UU19BZG1pdF9MaXN0OwotCXN0cnVjdCBsaXN0X2hlYWQJCVJ4X1RTX1BlbmRpbmdfTGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQlSeF9UU19VbnVzZWRfTGlzdDsKLQlSWF9UU19SRUNPUkQJCVJ4VHNSZWNvcmRbVE9UQUxfVFNfTlVNXTsKLQlSWF9SRU9SREVSX0VOVFJZCVJ4UmVvcmRlckVudHJ5WzEyOF07Ci0Jc3RydWN0IGxpc3RfaGVhZAkJUnhSZW9yZGVyX1VudXNlZF9MaXN0OwotCXU4CQkJCUZvcmNlZFByaW9yaXR5OwkJLy8gRm9yY2UgcGVyLXBhY2tldCBwcmlvcml0eSAxfjcuIChkZWZhdWx0OiAwLCBub3QgdG8gZm9yY2UgaXQuKQotCi0KLQkvKiBCb29ra2VlcGluZyBzdHJ1Y3R1cmVzICovCi0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgc3RhdHM7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdGF0cyBpZWVlX3N0YXRzOwotCXN0cnVjdCBpZWVlODAyMTFfc29mdG1hY19zdGF0cyBzb2Z0bWFjX3N0YXRzOwotCi0JLyogUHJvYmUgLyBCZWFjb24gbWFuYWdlbWVudCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgbmV0d29ya19mcmVlX2xpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCBuZXR3b3JrX2xpc3Q7Ci0Jc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrczsKLQlpbnQgc2NhbnM7Ci0JaW50IHNjYW5fYWdlOwotCi0JaW50IGl3X21vZGU7IC8qIG9wZXJhdGluZyBtb2RlIChJV19NT0RFXyopICovCi0Jc3RydWN0IGl3X3NweV9kYXRhIHNweV9kYXRhOwotCi0Jc3BpbmxvY2tfdCBsb2NrOwotCXNwaW5sb2NrX3Qgd3BheF9zdWl0bGlzdF9sb2NrOwotCi0JaW50IHR4X2hlYWRyb29tOyAvKiBTZXQgdG8gc2l6ZSBvZiBhbnkgYWRkaXRpb25hbCByb29tIG5lZWRlZCBhdCBmcm9udAotCQkJICAqIG9mIGFsbG9jYXRlZCBUeCBTS0JzICovCi0JdTMyIGNvbmZpZzsKLQotCS8qIFdFUCBhbmQgb3RoZXIgZW5jcnlwdGlvbiByZWxhdGVkIHNldHRpbmdzIGF0IHRoZSBkZXZpY2UgbGV2ZWwgKi8KLQlpbnQgb3Blbl93ZXA7IC8qIFNldCB0byAxIHRvIGFsbG93IHVuZW5jcnlwdGVkIGZyYW1lcyAqLwotCWludCBhdXRoX21vZGU7Ci0JaW50IHJlc2V0X29uX2tleWNoYW5nZTsgLyogU2V0IHRvIDEgaWYgdGhlIEhXIG5lZWRzIHRvIGJlIHJlc2V0IG9uCi0JCQkJICogV0VQIGtleSBjaGFuZ2VzICovCi0KLQkvKiBJZiB0aGUgaG9zdCBwZXJmb3JtcyB7ZW4sZGV9Y3J5cHRpb24sIHRoZW4gc2V0IHRvIDEgKi8KLQlpbnQgaG9zdF9lbmNyeXB0OwotCWludCBob3N0X2VuY3J5cHRfbXNkdTsKLQlpbnQgaG9zdF9kZWNyeXB0OwotICAgICAgICAvKiBob3N0IHBlcmZvcm1zIG11bHRpY2FzdCBkZWNyeXB0aW9uICovCi0gICAgICAgIGludCBob3N0X21jX2RlY3J5cHQ7Ci0KLSAgICAgICAgLyogaG9zdCBzaG91bGQgc3RyaXAgSVYgYW5kIElDViBmcm9tIHByb3RlY3RlZCBmcmFtZXMgKi8KLSAgICAgICAgLyogbWVhbmluZ2Z1bCBvbmx5IHdoZW4gaGFyZHdhcmUgZGVjcnlwdGlvbiBpcyBiZWluZyB1c2VkICovCi0gICAgICAgIGludCBob3N0X3N0cmlwX2l2X2ljdjsKLQotICAgICAgICBpbnQgaG9zdF9vcGVuX2ZyYWc7Ci0gICAgICAgIGludCBob3N0X2J1aWxkX2l2OwotCWludCBpZWVlODAyXzF4OyAvKiBpcyBJRUVFIDgwMi4xWCB1c2VkICovCi0KLQkvKiBXUEEgZGF0YSAqLwotCWJvb2wgYkhhbGZXaXJlbGVzc04yNEdNb2RlOwotCWludCB3cGFfZW5hYmxlZDsKLQlpbnQgZHJvcF91bmVuY3J5cHRlZDsKLQlpbnQgdGtpcF9jb3VudGVybWVhc3VyZXM7Ci0JaW50IHByaXZhY3lfaW52b2tlZDsKLQlzaXplX3Qgd3BhX2llX2xlbjsKLQl1OCAqd3BhX2llOwotCXU4IGFwX21hY19hZGRyWzZdOwotCXUxNiBwYWlyd2lzZV9rZXlfdHlwZTsKLQl1MTYgZ3JvdXBfa2V5X3R5cGU7Ci0Jc3RydWN0IGxpc3RfaGVhZCBjcnlwdF9kZWluaXRfbGlzdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0W1dFUF9LRVlTXTsKLQlpbnQgdHhfa2V5aWR4OyAvKiBkZWZhdWx0IFRYIGtleSBpbmRleCAoY3J5cHRbdHhfa2V5aWR4XSkgKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdCBjcnlwdF9kZWluaXRfdGltZXI7Ci0gICAgICAgIGludCBjcnlwdF9xdWllc2NlZDsKLQotCWludCBiY3J4X3N0YV9rZXk7IC8qIHVzZSBpbmRpdmlkdWFsIGtleXMgdG8gb3ZlcnJpZGUgZGVmYXVsdCBrZXlzIGV2ZW4KLQkJCSAgICogd2l0aCBSWCBvZiBicm9hZC9tdWx0aWNhc3QgZnJhbWVzICovCi0KLQkvKiBGcmFnbWVudGF0aW9uIHN0cnVjdHVyZXMgKi8KLQkvLyBlYWNoIHN0cmVhbWluZyBjb250YWluIGEgZW50cnkKLQlzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgZnJhZ19jYWNoZVsxN11bSUVFRTgwMjExX0ZSQUdfQ0FDSEVfTEVOXTsKLQl1bnNpZ25lZCBpbnQgZnJhZ19uZXh0X2lkeFsxN107Ci0JdTE2IGZ0czsgLyogRnJhZ21lbnRhdGlvbiBUaHJlc2hvbGQgKi8KLSNkZWZpbmUgREVGQVVMVF9SVFNfVEhSRVNIT0xEIDIzNDZVCi0jZGVmaW5lIE1JTl9SVFNfVEhSRVNIT0xEIDEKLSNkZWZpbmUgTUFYX1JUU19USFJFU0hPTEQgMjM0NlUKLSAgICAgICAgdTE2IHJ0czsgLyogUlRTIHRocmVzaG9sZCAqLwotCi0gICAgICAgIC8qIEFzc29jaWF0aW9uIGluZm8gKi8KLSAgICAgICAgdTggYnNzaWRbRVRIX0FMRU5dOwotCi0JLyogVGhpcyBzdG9yZXMgaW5mb3MgZm9yIHRoZSBjdXJyZW50IG5ldHdvcmsuCi0JICogRWl0aGVyIHRoZSBuZXR3b3JrIHdlIGFyZSBhc3NvY2lhdGVkIGluIElORlJBU1RSVUNUVVJFCi0JICogb3IgdGhlIG5ldHdvcmsgdGhhdCB3ZSBhcmUgY3JlYXRpbmcgaW4gTUFTVEVSIG1vZGUuCi0JICogYWQtaG9jIGlzIGEgbWl4dHVyZSA7LSkuCi0JICogTm90ZSB0aGF0IGluIGluZnJhc3RydWN0dXJlIG1vZGUsIGV2ZW4gd2hlbiBub3QgYXNzb2NpYXRlZCwKLQkgKiBmaWVsZHMgYnNzaWQgYW5kIGVzc2lkIG1heSBiZSB2YWxpZCAoaWYgd3BhX3NldCBhbmQgZXNzaWRfc2V0Ci0JICogYXJlIHRydWUpIGFzIHRoeSBjYXJyeSB0aGUgdmFsdWUgc2V0IGJ5IHRoZSB1c2VyIHZpYSBpd2NvbmZpZwotCSAqLwotCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBjdXJyZW50X25ldHdvcms7Ci0KLQllbnVtIGllZWU4MDIxMV9zdGF0ZSBzdGF0ZTsKLQotCWludCBzaG9ydF9zbG90OwotCWludCByZWdfbW9kZTsKLQlpbnQgbW9kZTsgICAgICAgLyogQSwgQiwgRyAqLwotCWludCBtb2R1bGF0aW9uOyAvKiBDQ0ssIE9GRE0gKi8KLQlpbnQgZnJlcV9iYW5kOyAgLyogMi40R2h6LCA1LjJHaHosIE1peGVkICovCi0JaW50IGFiZ190cnVlOyAgIC8qIEFCRyBmbGFnICAgICAgICAgICAgICAqLwotCi0JLyogdXNlZCBmb3IgZm9yY2luZyB0aGUgaWJzcyB3b3JrcXVldWUgdG8gdGVybWluYXRlCi0JICogd2l0aG91dCB3YWl0IGZvciB0aGUgc3luY3JvIHNjYW4gdG8gdGVybWluYXRlCi0JICovCi0Jc2hvcnQgc3luY19zY2FuX2h1cnJ5dXA7Ci0KLSAgICAgICAgaW50IHBlcmZlY3RfcnNzaTsKLSAgICAgICAgaW50IHdvcnN0X3Jzc2k7Ci0KLSAgICAgICAgdTE2IHByZXZfc2VxX2N0bDsgICAgICAgLyogdXNlZCB0byBkcm9wIGR1cGxpY2F0ZSBmcmFtZXMgKi8KLQotCS8qIG1hcCBvZiBhbGxvd2VkIGNoYW5uZWxzLiAwIGlzIGR1bW15ICovCi0JLy8gRklYTUU6IHJlbWVtYmVyIHRvIGRlZmF1bHQgdG8gYSBiYXNpYyBjaGFubmVsIHBsYW4gZGVwZW5kaW5nIG9mIHRoZSBQSFkgdHlwZQotI2lmZGVmIEVOQUJMRV9ET1QxMUQKLQl2b2lkKiBwRG90MTFkSW5mbzsKLQlib29sIGJHbG9iYWxEb21haW47Ci0jZWxzZQotCWludCBjaGFubmVsX21hcFtNQVhfQ0hBTk5FTF9OVU1CRVIrMV07Ci0jZW5kaWYKLQlpbnQgcmF0ZTsgICAgICAgLyogY3VycmVudCByYXRlICovCi0JaW50IGJhc2ljX3JhdGU7Ci0JLy9GSVhNRTogcGxlYWNlIGNhbGxiYWNrLCBzZWUgaWYgcmVkdW5kYW50IHdpdGggc29mdG1hY19mZWF0dXJlcwotCXNob3J0IGFjdGl2ZV9zY2FuOwotCi0JLyogdGhpcyBjb250YWlucyBmbGFncyBmb3Igc2VsZWN0aXZlbHkgZW5hYmxlIHNvZnRtYWMgc3VwcG9ydCAqLwotCXUxNiBzb2Z0bWFjX2ZlYXR1cmVzOwotCi0JLyogaWYgdGhlIHNlcXVlbmNlIGNvbnRyb2wgZmllbGQgaXMgbm90IGZpbGxlZCBieSBIVyAqLwotCXUxNiBzZXFfY3RybFs1XTsKLQotCS8qIGFzc29jaWF0aW9uIHByb2NlZHVyZSB0cmFuc2FjdGlvbiBzZXF1ZW5jZSBudW1iZXIgKi8KLQl1MTYgYXNzb2NpYXRlX3NlcTsKLQotCS8qIEFJRCBmb3IgUlRYZWQgYXNzb2NpYXRpb24gcmVzcG9uc2VzICovCi0JdTE2IGFzc29jX2lkOwotCi0JLyogcG93ZXIgc2F2ZSBtb2RlIHJlbGF0ZWQqLwotCXU4IGFja190eF90b19pZWVlOwotCXNob3J0IHBzOwotCXNob3J0IHN0YV9zbGVlcDsKLQlpbnQgcHNfdGltZW91dDsKLQlpbnQgcHNfcGVyaW9kOwotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBwc190YXNrOwotCXUzMiBwc190aDsKLQl1MzIgcHNfdGw7Ci0KLQlzaG9ydCByYXdfdHg7Ci0JLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgaXMgc2V0ICovCi0Jc2hvcnQgcXVldWVfc3RvcDsKLQlzaG9ydCBzY2FubmluZzsKLQlzaG9ydCBwcm90b19zdGFydGVkOwotCi0Jc3RydWN0IHNlbWFwaG9yZSB3eF9zZW07Ci0Jc3RydWN0IHNlbWFwaG9yZSBzY2FuX3NlbTsKLQotCXNwaW5sb2NrX3QgbWdtdF90eF9sb2NrOwotCXNwaW5sb2NrX3QgYmVhY29uX2xvY2s7Ci0KLQlzaG9ydCBiZWFjb25fdHhpbmc7Ci0KLQlzaG9ydCB3YXBfc2V0OwotCXNob3J0IHNzaWRfc2V0OwotCi0JdTggIHdwYXhfdHlwZV9zZXQ7ICAgIC8ve2FkZGVkIGJ5IERhdmlkLCAyMDA2LjkuMjh9Ci0JdTMyIHdwYXhfdHlwZV9ub3RpZnk7IC8ve2FkZGVkIGJ5IERhdmlkLCAyMDA2LjkuMjZ9Ci0KLQkvKiBRb1MgcmVsYXRlZCBmbGFnICovCi0JY2hhciBpbml0X3dtbXBhcmFtX2ZsYWc7Ci0JLyogc2V0IG9uIGluaXRpYWxpemF0aW9uICovCi0JdTggIHFvc19zdXBwb3J0OwotCi0JLyogZm9yIGRpc2NhcmRpbmcgZHVwbGljYXRlZCBwYWNrZXRzIGluIElCU1MgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGlic3NfbWFjX2hhc2hbSUVFRV9JQlNTX01BQ19IQVNIX1NJWkVdOwotCi0JLyogZm9yIGRpc2NhcmRpbmcgZHVwbGljYXRlZCBwYWNrZXRzIGluIEJTUyAqLwotCXUxNiBsYXN0X3J4c2VxX251bVsxN107IC8qIHJ4IHNlcSBwcmV2aW91cyBwZXItdGlkICovCi0JdTE2IGxhc3RfcnhmcmFnX251bVsxN107LyogdHggZnJhZyBwcmV2aW91cyBwZXItdGlkICovCi0JdW5zaWduZWQgbG9uZyBsYXN0X3BhY2tldF90aW1lWzE3XTsKLQotCS8qIGZvciBQUyBtb2RlICovCi0JdW5zaWduZWQgbG9uZyBsYXN0X3J4X3BzX3RpbWU7Ci0JdTggTFBTQXdha2VJbnR2bDsKLQl1OCBSZWdNYXhMUFNBd2FrZUludHZsOwotCi0JLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFIGlzIHNldCAqLwotCXN0cnVjdCBza19idWZmICptZ210X3F1ZXVlX3JpbmdbTUdNVF9RVUVVRV9OVU1dOwotCWludCBtZ210X3F1ZXVlX2hlYWQ7Ci0JaW50IG1nbXRfcXVldWVfdGFpbDsKLSNkZWZpbmUgSUVFRTgwMjExX1FVRVVFX0xJTUlUIDEyOAotCXU4IEFzb2NSZXRyeUNvdW50OwotCXVuc2lnbmVkIGludCBod19oZWFkZXI7Ci0Jc3RydWN0IHNrX2J1ZmZfaGVhZCBza2Jfd2FpdFFbTUFYX1FVRVVFX1NJWkVdOwotCXN0cnVjdCBza19idWZmX2hlYWQgIHNrYl9hZ2dRW01BWF9RVUVVRV9TSVpFXTsKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICBza2JfZHJ2X2FnZ1FbTUFYX1FVRVVFX1NJWkVdOwotCXUzMglzdGFfZWRjYV9wYXJhbVs0XTsKLQlib29sIGFnZ3JlZ2F0aW9uOwotCS8vIEVuYWJsZS9EaXNhYmxlIFJ4IGltbWVkaWF0ZSBCQSBjYXBhYmlsaXR5LgotCWJvb2wgZW5hYmxlX3J4X2ltbV9CQTsKLQlib29sIGJpYnNzY29vcmRpbmF0b3I7Ci0KLQkvLytieSBhbXkgZm9yIERNICwwODA1MTUKLQkvL0R5bmFtaWMgVHggcG93ZXIgZm9yIG5lYXIvZmFyIHJhbmdlIGVuYWJsZS9EaXNhYmxlICAsIGJ5IGFteSAsIDIwMDgtMDUtMTUKLQlib29sCWJkeW5hbWljX3R4cG93ZXJfZW5hYmxlOwotCi0JYm9vbCBiQ1RTVG9TZWxmRW5hYmxlOwotCXU4IAlDVFNUb1NlbGZUSDsKLQotCXUzMiAJZnN5bmNfdGltZV9pbnRlcnZhbDsKLQl1MzIJZnN5bmNfcmF0ZV9iaXRtYXA7Ci0JdTgJZnN5bmNfcnNzaV90aHJlc2hvbGQ7Ci0JYm9vbAliZnN5bmNfZW5hYmxlOwotCi0JdTgJZnN5bmNfbXVsdGlwbGVfdGltZWludGVydmFsOwkJLy8gRnN5bmNNdWx0aXBsZVRpbWVJbnRlcnZhbCAqIEZzeW5jVGltZUludGVydmFsCi0JdTMyCWZzeW5jX2ZpcnN0ZGlmZl9yYXRldGhyZXNob2xkOwkJLy8gbG93IHRocmVzaG9sZAotCXUzMglmc3luY19zZWNvbmRkaWZmX3JhdGV0aHJlc2hvbGQ7CSAvLyBkZWNyZWFzZSB0aHJlc2hvbGQKLQlGc3luY19TdGF0ZQkJCWZzeW5jX3N0YXRlOwotCWJvb2wJCWJpc19hbnlfbm9uYmVwa3RzOwotCS8vMjBNaHogNDBNaHogQXV0b1N3aXRjaCBUaHJlc2hvbGQKLQliYW5kd2lkdGhfYXV0b3N3aXRjaCBiYW5kd2lkdGhfYXV0b19zd2l0Y2g7Ci0JLy9mb3IgdHhwb3dlciB0cmFja2luZwotCWJvb2wgRndSV1JGOwotCi0JLy9hZGRlZCBieSBhbXkgZm9yIEFQIHJvYW1pbmcKLQlSVF9MSU5LX0RFVEVDVF9UCUxpbmtEZXRlY3RJbmZvOwotCi0JLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgaXMgc2V0ICovCi0Jc3RydWN0ICB0eF9wZW5kaW5nX3QgdHhfcGVuZGluZzsKLQotCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSBpcyBzZXQgKi8KLQlzdHJ1Y3QgdGltZXJfbGlzdCBhc3NvY2lhdGVfdGltZXI7Ci0KLQkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19CRUFDT05TIGlzIHNldCAqLwotCXN0cnVjdCB0aW1lcl9saXN0IGJlYWNvbl90aW1lcjsKLSAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IGFzc29jaWF0ZV9jb21wbGV0ZV93cTsKLSAgICAgICAgc3RydWN0IHdvcmtfc3RydWN0IGFzc29jaWF0ZV9wcm9jZWR1cmVfd3E7Ci0gICAgICAgIHN0cnVjdCBkZWxheWVkX3dvcmsgc29mdG1hY19zY2FuX3dxOwotICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIGFzc29jaWF0ZV9yZXRyeV93cTsKLQkgc3RydWN0IGRlbGF5ZWRfd29yayBzdGFydF9pYnNzX3dxOwotCSBzdHJ1Y3QgZGVsYXllZF93b3JrIGh3X3dha2V1cF93cTsKLQotICAgICAgICBzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd3hfc3luY19zY2FuX3dxOwotICAgICAgICBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7Ci0KLQkvKiBDYWxsYmFjayBmdW5jdGlvbnMgKi8KLQl2b2lkICgqc2V0X3NlY3VyaXR5KShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSAqc2VjKTsKLQotCS8qIFVzZWQgdG8gVFggZGF0YSBmcmFtZSBieSB1c2luZyB0eGIgc3RydWN0cy4KLQkgKiB0aGlzIGlzIG5vdCB1c2VkIGlmIGluIHRoZSBzb2Z0bWFjX2ZlYXR1cmVzCi0JICogaXMgc2V0IHRoZSBmbGFnIElFRUVfU09GVE1BQ19UWF9RVUVVRQotCSAqLwotCWludCAoKmhhcmRfc3RhcnRfeG1pdCkoc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YiwKLQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci0KLQlpbnQgKCpyZXNldF9wb3J0KShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci0gICAgICAgIGludCAoKmlzX3F1ZXVlX2Z1bGwpIChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IHByaSk7Ci0KLSAgICAgICAgaW50ICgqaGFuZGxlX21hbmFnZW1lbnQpIChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKiBuZXR3b3JrLCB1MTYgdHlwZSk7Ci0gICAgICAgIGludCAoKmlzX3Fvc19hY3RpdmUpIChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci0KLQkvKiBTb2Z0bWFjLWdlbmVyYXRlZCBmcmFtZXMgKG1hbWFnZW1lbnQpIGFyZSBUWGVkIHZpYSB0aGlzCi0JICogY2FsbGJhY2sgaWYgdGhlIGZsYWcgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSBpcwotCSAqIG5vdCBzZXQuIEFzIHNvbWUgY2FyZHMgbWF5IGhhdmUgZGlmZmVyZW50IEhXIHF1ZXVlcyB0aGF0Ci0JICogb25lIG1pZ2h0IHdhbnQgdG8gdXNlIGZvciBkYXRhIGFuZCBtYW5hZ2VtZW50IGZyYW1lcwotCSAqIHRoZSBvcHRpb24gdG8gaGF2ZSB0d28gY2FsbGJhY2tzIG1pZ2h0IGJlIHVzZWZ1bC4KLQkgKiBUaGlzIGZ1bmN0aW9uIGNhbid0IHNsZWVwLgotCSAqLwotCWludCAoKnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTEpOwotCi0JLyogdXNlZCBpbnN0ZWFkIG9mIGhhcmRfc3RhcnRfeG1pdCAobm90IHNvZnRtYWNfaGFyZF9zdGFydF94bWl0KQotCSAqIGlmIHRoZSBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgZmVhdHVyZSBpcyB1c2VkIHRvIFRYIGRhdGEKLQkgKiBmcmFtZXMuIEkgdGhlIG9wdGlvbiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFIGlzIGFsc28gc2V0Ci0JICogdGhlbiBhbHNvIG1hbmFnZW1lbnQgZnJhbWVzIGFyZSBzZW50IHZpYSB0aGlzIGNhbGxiYWNrLgotCSAqIFRoaXMgZnVuY3Rpb24gY2FuJ3Qgc2xlZXAuCi0JICovCi0Jdm9pZCAoKnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU4MDIxMSwgaW50IHJhdGUpOwotCi0JLyogc3RvcHMgdGhlIEhXIHF1ZXVlIGZvciBEQVRBIGZyYW1lcy4gVXNlZnVsIHRvIGF2b2lkCi0JICogd2FzdGUgdGltZSB0byBUWCBkYXRhIGZyYW1lIHdoZW4gd2UgYXJlIHJlYXNzb2NpYXRpbmcKLQkgKiBUaGlzIGZ1bmN0aW9uIGNhbiBzbGVlcC4KLQkgKi8KLQl2b2lkICgqZGF0YV9oYXJkX3N0b3ApKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTEpOwotCi0JLyogT0sgdGhpcyBpcyBjb21wbGVtZW50YXIgdG8gZGF0YV9wb2xsX2hhcmRfc3RvcCAqLwotCXZvaWQgKCpkYXRhX2hhcmRfcmVzdW1lKShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTgwMjExKTsKLQotCS8qIGFzayB0byB0aGUgZHJpdmVyIHRvIHJldHVuZSB0aGUgcmFkaW8gLgotCSAqIFRoaXMgZnVuY3Rpb24gY2FuIHNsZWVwLiB0aGUgZHJpdmVyIHNob3VsZCBlbnN1cmUKLQkgKiB0aGUgcmFkaW8gaGFzIGJlZW4gc3dpdGhjZWQgYmVmb3JlIHJldHVybi4KLQkgKi8KLQl2b2lkICgqc2V0X2NoYW4pKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTEsIHNob3J0IGNoKTsKLQotCS8qIFRoZXNlIGFyZSBub3QgdXNlZCBpZiB0aGUgaWVlZSBzdGFjayB0YWtlcyBjYXJlIG9mCi0JICogc2Nhbm5pbmcgKElFRUVfU09GVE1BQ19TQ0FOIGZlYXR1cmUgc2V0KS4KLQkgKiBJbiB0aGlzIGNhc2Ugb25seSB0aGUgc2V0X2NoYW4gaXMgdXNlZC4KLQkgKgotCSAqIFRoZSBzeW5jcm8gdmVyc2lvbiBpcyBzaW1pbGFyIHRvIHRoZSBzdGFydF9zY2FuIGJ1dAotCSAqIGRvZXMgbm90IHJldHVybiB1bnRpbCBhbGwgY2hhbm5lbHMgaGFzIGJlZW4gc2Nhbm5lZC4KLQkgKiB0aGlzIGlzIGNhbGxlZCBpbiB1c2VyIGNvbnRleHQgYW5kIHNob3VsZCBzbGVlcCwKLQkgKiBpdCBpcyBjYWxsZWQgaW4gYSB3b3JrX3F1ZXVlIHdoZW4gc3dpdGhjaW5nIHRvIGFkLWhvYyBtb2RlCi0JICogb3IgaW4gYmVoYWxmIG9mIGl3bGlzdCBzY2FuIHdoZW4gdGhlIGNhcmQgaXMgYXNzb2NpYXRlZAotCSAqIGFuZCByb290IHVzZXIgYXNrIGZvciBhIHNjYW4uCi0JICogdGhlIGZ1bmN0aW9uIHN0b3Bfc2NhbiBzaG91bGQgc3RvcCBib3RoIHRoZSBzeW5jcm8gYW5kCi0JICogYmFja2dyb3VuZCBzY2FubmluZyBhbmQgY2FuIHNsZWVwLgotCSAqIFRoZSBmdW5jdGlvbiBzdGFydF9zY2FuIHNob3VsZCBpbml0aWF0ZSB0aGUgYmFja2dyb3VuZAotCSAqIHNjYW5uaW5nIGFuZCBjYW4ndCBzbGVlcC4KLQkgKi8KLQl2b2lkICgqc2Nhbl9zeW5jcm8pKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTEpOwotCXZvaWQgKCpzdGFydF9zY2FuKShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTgwMjExKTsKLQl2b2lkICgqc3RvcF9zY2FuKShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTgwMjExKTsKLQotCS8qIGluZGljYXRlIHRoZSBkcml2ZXIgdGhhdCB0aGUgbGluayBzdGF0ZSBpcyBjaGFuZ2VkCi0JICogZm9yIGV4YW1wbGUgaXQgbWF5IGluZGljYXRlIHRoZSBjYXJkIGlzIGFzc29jaWF0ZWQgbm93LgotCSAqIERyaXZlciBtaWdodCBiZSBpbnRlcmVzdGVkIGluIHRoaXMgdG8gYXBwbHkgUlggZmlsdGVyCi0JICogcnVsZXMgb3Igc2ltcGx5IGxpZ2h0IHRoZSBMSU5LIGxlZAotCSAqLwotCXZvaWQgKCpsaW5rX2NoYW5nZSkoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU4MDIxMSk7Ci0KLQkvKiB0aGVzZSB0d28gZnVuY3Rpb24gaW5kaWNhdGVzIHRvIHRoZSBIVyB3aGVuIHRvIHN0YXJ0Ci0JICogYW5kIHN0b3AgdG8gc2VuZCBiZWFjb25zLiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUKLQkgKiBJRUVFX1NPRlRNQUNfQkVBQ09OUyBpcyBub3Qgc2V0LiBGb3Igbm93IHRoZQotCSAqIHN0b3Bfc2VuZF9iYWNvbnMgaXMgTk9UIGd1YXJhbnRlZWQgdG8gYmUgY2FsbGVkIG9ubHkKLQkgKiBhZnRlciBzdGFydF9zZW5kX2JlYWNvbnMuCi0JICovCi0Jdm9pZCAoKnN0YXJ0X3NlbmRfYmVhY29ucykgKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYpOwotCXZvaWQgKCpzdG9wX3NlbmRfYmVhY29ucykgKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICpkZXYpOwotCi0JLyogcG93ZXIgc2F2ZSBtb2RlIHJlbGF0ZWQgKi8KLQl2b2lkICgqc3RhX3dha2VfdXApIChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTgwMjExKTsKLQl2b2lkICgqZW50ZXJfc2xlZXBfc3RhdGUpIChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTgwMjExLCB1MzIgdGgsIHUzMiB0bCk7Ci0Jc2hvcnQgKCpwc19pc19xdWV1ZV9lbXB0eSkgKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTEpOwotICAgICAgICBpbnQgKCpoYW5kbGVfYmVhY29uKSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU4MDIxMSwgc3RydWN0IGllZWU4MDIxMV9iZWFjb24gKmJlYWNvbiwgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrKTsKLSAgICAgICAgaW50ICgqaGFuZGxlX2Fzc29jX3Jlc3BvbnNlKSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU4MDIxMSwgc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqcmVzcCwgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrKTsKLQotCS8qIGNoZWNrIHdoZXRoZXIgVHggaHcgcmVzb3VjZSBhdmFpbGFibGUgKi8KLQlzaG9ydCAoKmNoZWNrX25pY19lbm91Z2hfZGVzYykoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU4MDIxMSwgaW50IHF1ZXVlX2luZGV4KTsKLQkvL2FkZGVkIGJ5IHdiIGZvciBIVCByZWxhdGVkCi0Jdm9pZCAoKlNldEJXTW9kZUhhbmRsZXIpKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTEsIEhUX0NIQU5ORUxfV0lEVEggQmFuZHdpZHRoLCBIVF9FWFRDSE5MX09GRlNFVCBPZmZzZXQpOwotCWJvb2wgKCpHZXRObW9kZVN1cHBvcnRCeVNlY0NmZykoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU4MDIxMSk7Ci0Jdm9pZCAoKlNldFdpcmVsZXNzTW9kZSkoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU4MDIxMSwgdTggd2lyZWxlc3NfbW9kZSk7Ci0JYm9vbCAoKkdldEhhbGZObW9kZVN1cHBvcnRCeUFQc0hhbmRsZXIpKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTEpOwotCXZvaWQgKCpJbml0aWFsR2FpbkhhbmRsZXIpKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTEsIHU4IE9wZXJhdGlvbik7Ci0KLQkvKiBUaGlzIG11c3QgYmUgdGhlIGxhc3QgaXRlbSBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgZGF0YQotCSAqIGFsbG9jYXRlZCBiZXlvbmQgdGhpcyBzdHJ1Y3R1cmUgYnkgYWxsb2NfaWVlZTgwMjExICovCi0JdTggcHJpdlswXTsKLX07Ci0KLSNkZWZpbmUJUlRfUkZfT0ZGX0xFVkxfQVNQTQkJCUJJVDAJLy8gUENJIEFTUE0KLSNkZWZpbmUJUlRfUkZfT0ZGX0xFVkxfQ0xLX1JFUQkJQklUMQkvLyBQQ0kgY2xvY2sgcmVxdWVzdAotI2RlZmluZQlSVF9SRl9PRkZfTEVWTF9QQ0lfRDMJCQlCSVQyCS8vIFBDSSBEMyBtb2RlCi0jZGVmaW5lCVJUX1JGX09GRl9MRVZMX0hBTFRfTklDCQlCSVQzCS8vIE5JQyBoYWx0LCByZS1pbml0aWFsaXplIGh3IHBhcmFtZXRlcnMKLSNkZWZpbmUJUlRfUkZfT0ZGX0xFVkxfRlJFRV9GVwkJQklUNAkvLyBGVyBmcmVlLCByZS1kb3dubG9hZCB0aGUgRlcKLSNkZWZpbmUJUlRfUkZfT0ZGX0xFVkxfRldfMzJLCQlCSVQ1CS8vIEZXIGluIDMyawotI2RlZmluZQlSVF9SRl9QU19MRVZFTF9BTFdBWVNfQVNQTQlCSVQ2CS8vIEFsd2F5cyBlbmFibGUgQVNQTSBhbmQgQ2xvY2sgUmVxIGluIGluaXRpYWxpemF0aW9uLgotI2RlZmluZQlSVF9SRl9MUFNfRElTQUxCRV8yUgkJCUJJVDMwCS8vIFdoZW4gTFBTIGlzIG9uLCBkaXNhYmxlIDJSIGlmIG5vIHBhY2tldCBpcyByZWNlaXZlZCBvciB0cmFuc21pdHRkLgotI2RlZmluZQlSVF9SRl9MUFNfTEVWRUxfQVNQTQkJCUJJVDMxCS8vIExQUyB3aXRoIEFTUE0KLSNkZWZpbmUJUlRfSU5fUFNfTEVWRUwocFBTQywgX1BTX0ZMQUcpCSgocFBTQy0+Q3VyUHNMZXZlbCAmIF9QU19GTEFHKSA/IHRydWUgOiBmYWxzZSkKLSNkZWZpbmUJUlRfQ0xFQVJfUFNfTEVWRUwocFBTQywgX1BTX0ZMQUcpCShwUFNDLT5DdXJQc0xldmVsICY9ICh+KF9QU19GTEFHKSkpCi0jZGVmaW5lCVJUX1NFVF9QU19MRVZFTChwUFNDLCBfUFNfRkxBRykJKHBQU0MtPkN1clBzTGV2ZWwgfD0gX1BTX0ZMQUcpCi0KLSNkZWZpbmUgSUVFRV9BICAgICAgICAgICAgKDE8PDApCi0jZGVmaW5lIElFRUVfQiAgICAgICAgICAgICgxPDwxKQotI2RlZmluZSBJRUVFX0cgICAgICAgICAgICAoMTw8MikKLSNkZWZpbmUgSUVFRV9OXzI0RyAJCSAgKDE8PDQpCi0jZGVmaW5lCUlFRUVfTl81RwkJICAoMTw8NSkKLSNkZWZpbmUgSUVFRV9NT0RFX01BU0sgICAgKElFRUVfQXxJRUVFX0J8SUVFRV9HKQotCi0vKiBHZW5lcmF0ZSBhIDgwMi4xMSBoZWFkZXIgKi8KLQotLyogVXNlcyB0aGUgY2hhbm5lbCBjaGFuZ2UgY2FsbGJhY2sgZGlyZWN0bHkKLSAqIGluc3RlYWQgb2YgW3N0YXJ0L3N0b3BdIHNjYW4gY2FsbGJhY2tzCi0gKi8KLSNkZWZpbmUgSUVFRV9TT0ZUTUFDX1NDQU4gKDE8PDIpCi0KLS8qIFBlcmZvcm0gYXV0aGVudGljYXRpb24gYW5kIGFzc29jaWF0aW9uIGhhbmRzaGFrZSAqLwotI2RlZmluZSBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFICgxPDwzKQotCi0vKiBHZW5lcmF0ZSBwcm9iZSByZXF1ZXN0cyAqLwotI2RlZmluZSBJRUVFX1NPRlRNQUNfUFJPQkVSUSAoMTw8NCkKLQotLyogR2VuZXJhdGUgcmVzcG9uZXMgdG8gcHJvYmUgcmVxdWVzdHMgKi8KLSNkZWZpbmUgSUVFRV9TT0ZUTUFDX1BST0JFUlMgKDE8PDUpCi0KLS8qIFRoZSBpZWVlODAyLjExIHN0YWNrIHdpbGwgbWFuYWdlcyB0aGUgbmV0aWYgcXVldWUKLSAqIHdha2Uvc3RvcCBmb3IgdGhlIGRyaXZlciwgdGFraW5nIGNhcmUgb2YgODAyLjExCi0gKiBmcmFnbWVudGF0aW9uLiBTZWUgc29mdG1hYy5jIGZvciBkZXRhaWxzLiAqLwotI2RlZmluZSBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgKDE8PDcpCi0KLS8qIFVzZXMgb25seSB0aGUgc29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdAotICogZXZlbiBmb3IgVFggbWFuYWdlbWVudCBmcmFtZXMuCi0gKi8KLSNkZWZpbmUgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSAoMTw8OCkKLQotLyogR2VuZXJhdGUgYmVhY29ucy4gIFRoZSBzdGFjayB3aWxsIGVucXVldWUgYmVhY29ucwotICogdG8gdGhlIGNhcmQKLSAqLwotI2RlZmluZSBJRUVFX1NPRlRNQUNfQkVBQ09OUyAoMTw8NikKLQotc3RhdGljIGlubGluZSB2b2lkICppZWVlODAyMTFfcHJpdihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXJldHVybiAoKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICopbmV0ZGV2X3ByaXYoZGV2KSktPnByaXY7Ci19Ci0KLWV4dGVybiBpbmxpbmUgaW50IGllZWU4MDIxMV9pc19lbXB0eV9lc3NpZChjb25zdCBjaGFyICplc3NpZCwgaW50IGVzc2lkX2xlbikKLXsKLQkvKiBTaW5nbGUgd2hpdGUgc3BhY2UgaXMgZm9yIExpbmtzeXMgQVBzICovCi0JaWYgKGVzc2lkX2xlbiA9PSAxICYmIGVzc2lkWzBdID09ICcgJykKLQkJcmV0dXJuIDE7Ci0KLQkvKiBPdGhlcndpc2UsIGlmIHRoZSBlbnRpcmUgZXNzaWQgaXMgMCwgd2UgYXNzdW1lIGl0IGlzIGhpZGRlbiAqLwotCXdoaWxlIChlc3NpZF9sZW4pIHsKLQkJZXNzaWRfbGVuLS07Ci0JCWlmIChlc3NpZFtlc3NpZF9sZW5dICE9ICdcMCcpCi0JCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gMTsKLX0KLQotZXh0ZXJuIGlubGluZSBpbnQgaWVlZTgwMjExX2lzX3ZhbGlkX21vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCBtb2RlKQotewotCS8qCi0JICogSXQgaXMgcG9zc2libGUgZm9yIGJvdGggYWNjZXNzIHBvaW50cyBhbmQgb3VyIGRldmljZSB0byBzdXBwb3J0Ci0JICogY29tYmluYXRpb25zIG9mIG1vZGVzLCBzbyBhcyBsb25nIGFzIHRoZXJlIGlzIG9uZSB2YWxpZCBjb21iaW5hdGlvbgotCSAqIG9mIGFwL2RldmljZSBzdXBwb3J0ZWQgbW9kZXMsIHRoZW4gcmV0dXJuIHN1Y2Nlc3MKLQkgKgotCSAqLwotCWlmICgobW9kZSAmIElFRUVfQSkgJiYKLQkgICAgKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKSAmJgotCSAgICAoaWVlZS0+ZnJlcV9iYW5kICYgSUVFRTgwMjExXzUyR0haX0JBTkQpKQotCQlyZXR1cm4gMTsKLQotCWlmICgobW9kZSAmIElFRUVfRykgJiYKLQkgICAgKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKSAmJgotCSAgICAoaWVlZS0+ZnJlcV9iYW5kICYgSUVFRTgwMjExXzI0R0haX0JBTkQpKQotCQlyZXR1cm4gMTsKLQotCWlmICgobW9kZSAmIElFRUVfQikgJiYKLQkgICAgKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04pICYmCi0JICAgIChpZWVlLT5mcmVxX2JhbmQgJiBJRUVFODAyMTFfMjRHSFpfQkFORCkpCi0JCXJldHVybiAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWV4dGVybiBpbmxpbmUgaW50IGllZWU4MDIxMV9nZXRfaGRybGVuKHUxNiBmYykKLXsKLQlpbnQgaGRybGVuID0gSUVFRTgwMjExXzNBRERSX0xFTjsKLQotCXN3aXRjaCAoV0xBTl9GQ19HRVRfVFlQRShmYykpIHsKLQljYXNlIElFRUU4MDIxMV9GVFlQRV9EQVRBOgotCQlpZiAoKGZjICYgSUVFRTgwMjExX0ZDVExfRlJPTURTKSAmJiAoZmMgJiBJRUVFODAyMTFfRkNUTF9UT0RTKSkKLQkJCWhkcmxlbiA9IElFRUU4MDIxMV80QUREUl9MRU47IC8qIEFkZHI0ICovCi0JCWlmKElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpCi0JCQloZHJsZW4gKz0gMjsgLyogUU9TIGN0cmwqLwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9GVFlQRV9DVEw6Ci0JCXN3aXRjaCAoV0xBTl9GQ19HRVRfU1RZUEUoZmMpKSB7Ci0JCWNhc2UgSUVFRTgwMjExX1NUWVBFX0NUUzoKLQkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQUNLOgotCQkJaGRybGVuID0gSUVFRTgwMjExXzFBRERSX0xFTjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJaGRybGVuID0gSUVFRTgwMjExXzJBRERSX0xFTjsKLQkJCWJyZWFrOwotCQl9Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBoZHJsZW47Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTggKmllZWU4MDIxMV9nZXRfcGF5bG9hZChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyKQotewotICAgICAgICBzd2l0Y2ggKGllZWU4MDIxMV9nZXRfaGRybGVuKGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKSkpIHsKLSAgICAgICAgY2FzZSBJRUVFODAyMTFfMUFERFJfTEVOOgotICAgICAgICAgICAgICAgIHJldHVybiAoKHN0cnVjdCBpZWVlODAyMTFfaGRyXzFhZGRyICopaGRyKS0+cGF5bG9hZDsKLSAgICAgICAgY2FzZSBJRUVFODAyMTFfMkFERFJfTEVOOgotICAgICAgICAgICAgICAgIHJldHVybiAoKHN0cnVjdCBpZWVlODAyMTFfaGRyXzJhZGRyICopaGRyKS0+cGF5bG9hZDsKLSAgICAgICAgY2FzZSBJRUVFODAyMTFfM0FERFJfTEVOOgotICAgICAgICAgICAgICAgIHJldHVybiAoKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopaGRyKS0+cGF5bG9hZDsKLSAgICAgICAgY2FzZSBJRUVFODAyMTFfNEFERFJfTEVOOgotICAgICAgICAgICAgICAgIHJldHVybiAoKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopaGRyKS0+cGF5bG9hZDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaWVlZTgwMjExX2lzX29mZG1fcmF0ZSh1OCByYXRlKQotewotICAgICAgICBzd2l0Y2ggKHJhdGUgJiB+SUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSykgewotICAgICAgICBjYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COgotICAgICAgICBjYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfOU1COgotICAgICAgICBjYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQjoKLSAgICAgICAgY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUI6Ci0gICAgICAgIGNhc2UgSUVFRTgwMjExX09GRE1fUkFURV8yNE1COgotICAgICAgICBjYXNlIElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQjoKLSAgICAgICAgY2FzZSBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI6Ci0gICAgICAgIGNhc2UgSUVFRTgwMjExX09GRE1fUkFURV81NE1COgotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfaXNfY2NrX3JhdGUodTggcmF0ZSkKLXsKLSAgICAgICAgc3dpdGNoIChyYXRlICYgfklFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spIHsKLSAgICAgICAgY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1COgotICAgICAgICBjYXNlIElFRUU4MDIxMV9DQ0tfUkFURV8yTUI6Ci0gICAgICAgIGNhc2UgSUVFRTgwMjExX0NDS19SQVRFXzVNQjoKLSAgICAgICAgY2FzZSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQjoKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLX0KLQotCi0vKiBpZWVlODAyMTEuYyAqLwotdm9pZCBmcmVlX2llZWU4MDIxMShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0cnVjdCBuZXRfZGV2aWNlICphbGxvY19pZWVlODAyMTEoaW50IHNpemVvZl9wcml2KTsKLQotaW50IGllZWU4MDIxMV9zZXRfZW5jcnlwdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci0KLS8qIGllZWU4MDIxMV90eC5jICovCi0KLWludCBpZWVlODAyMTFfZW5jcnlwdF9mcmFnbWVudCgKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZywKLQlpbnQgaGRyX2xlbik7Ci0KLWludCBpZWVlODAyMTFfcnRsX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci12b2lkIGllZWU4MDIxMV90eGJfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqKTsKLQotCi0vKiBpZWVlODAyMTFfcnguYyAqLwotaW50IGllZWU4MDIxMV9ydGxfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cyk7Ci12b2lkIGllZWU4MDIxMV9yeF9tZ3Qoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZWFkZXIsCi0JCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKTsKLQotLyogaWVlZTgwMjExX3d4LmMgKi8KLWludCBpZWVlODAyMTFfd3hfZ2V0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSk7Ci1pbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpOwotaW50IGllZWU4MDIxMV93eF9nZXRfZW5jb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KTsKLWludCBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZV9leHQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhKiB3cnF1LCBjaGFyICpleHRyYSk7Ci1pbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGVfZXh0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSogd3JxdSwgY2hhciAqZXh0cmEpOwotaW50IGllZWU4MDIxMV93eF9zZXRfYXV0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZGF0YSwgY2hhciAqZXh0cmEpOwotaW50IGllZWU4MDIxMV93eF9zZXRfbWxtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKLWludCBpZWVlODAyMTFfd3hfc2V0X2dlbl9pZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmllLCBzaXplX3QgbGVuKTsKLQotLyogaWVlZTgwMjExX3NvZnRtYWMuYyAqLwotc2hvcnQgaWVlZTgwMjExX2lzXzU0ZyhzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0KTsKLXNob3J0IGllZWU4MDIxMV9pc19zaG9ydHNsb3Qoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIG5ldCk7Ci1pbnQgaWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cywgdTE2IHR5cGUsCi0JCQl1MTYgc3R5cGUpOwotdm9pZCBpZWVlODAyMTFfc29mdG1hY19uZXdfbmV0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCk7Ci0KLXZvaWQgU2VuZERpc2Fzc29jaWF0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCogYXNTdGEsIHU4IGFzUnNuKTsKLXZvaWQgaWVlZTgwMjExX3NvZnRtYWNfeG1pdChzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci0KLXZvaWQgaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLXZvaWQgbm90aWZ5X3d4X2Fzc29jX2V2ZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLXZvaWQgaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwotdm9pZCBpZWVlODAyMTFfc3RhcnRfYnNzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLXZvaWQgaWVlZTgwMjExX3N0YXJ0X21hc3Rlcl9ic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwotdm9pZCBpZWVlODAyMTFfc3RhcnRfaWJzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci12b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2luaXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwotdm9pZCBpZWVlODAyMTFfc29mdG1hY19mcmVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLXZvaWQgaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci12b2lkIGllZWU4MDIxMV9kaXNhc3NvY2lhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwotdm9pZCBpZWVlODAyMTFfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLXZvaWQgaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLXZvaWQgaWVlZTgwMjExX2NoZWNrX2FsbF9uZXRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLXZvaWQgaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLXZvaWQgaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsdTggc2h1dGRvd24pOwotdm9pZCBpZWVlODAyMTFfc29mdG1hY19zdGFydF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci12b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsdTggc2h1dGRvd24pOwotdm9pZCBpZWVlODAyMTFfcmVzZXRfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwotdm9pZCBpZWVlODAyMTFfcnRsX3dha2VfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwotdm9pZCBpZWVlODAyMTFfcnRsX3N0b3BfcXVldWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwotc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9nZXRfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLXZvaWQgaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci12b2lkIGllZWU4MDIxMV9zdG9wX3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci1pbnQgaWVlZTgwMjExX3dwYV9zdXBwbGljYW50X2lvY3RsKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcG9pbnQgKnApOwotdm9pZCBub3RpZnlfd3hfYXNzb2NfZXZlbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwotdm9pZCBpZWVlODAyMTFfcHNfdHhfYWNrKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBzdWNjZXNzKTsKLQotdm9pZCBzb2Z0bWFjX21nbXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci0KLS8qIGllZWU4MDIxMV9jcnlwdF9jY21wJnRraXAmd2VwLmMgKi8KLXZvaWQgaWVlZTgwMjExX3RraXBfbnVsbCh2b2lkKTsKLXZvaWQgaWVlZTgwMjExX3dlcF9udWxsKHZvaWQpOwotdm9pZCBpZWVlODAyMTFfY2NtcF9udWxsKHZvaWQpOwotCi0vKiBpZWVlODAyMTFfc29mdG1hY193eC5jICovCi0KLWludCBpZWVlODAyMTFfd3hfZ2V0X3dhcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dCk7Ci0KLWludCBpZWVlODAyMTFfd3hfc2V0X3dhcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJIHVuaW9uIGl3cmVxX2RhdGEgKmF3cnEsCi0JCQkgY2hhciAqZXh0cmEpOwotCi1pbnQgaWVlZTgwMjExX3d4X2dldF9lc3NpZChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSx1bmlvbiBpd3JlcV9kYXRhICp3cnF1LGNoYXIgKmIpOwotCi1pbnQgaWVlZTgwMjExX3d4X3NldF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7Ci0KLWludCBpZWVlODAyMTFfd3hfZ2V0X3JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKLQotaW50IGllZWU4MDIxMV93eF9zZXRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKLQkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7Ci0KLWludCBpZWVlODAyMTFfd3hfc2V0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCi0JCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOwotCi1pbnQgaWVlZTgwMjExX3d4X3NldF9lc3NpZChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCi0JCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7Ci0KLWludCBpZWVlODAyMTFfd3hfZ2V0X21vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCi0JCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOwotCi1pbnQgaWVlZTgwMjExX3d4X3NldF9mcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAotCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKLQotaW50IGllZWU4MDIxMV93eF9nZXRfZnJlcShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKLQkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7Ci0KLXZvaWQgaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotCi1pbnQgaWVlZTgwMjExX3d4X3NldF9yYXd0eChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKLQotaW50IGllZWU4MDIxMV93eF9nZXRfbmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOwotCi1pbnQgaWVlZTgwMjExX3d4X3NldF9wb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOwotCi1pbnQgaWVlZTgwMjExX3d4X2dldF9wb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOwotCi1pbnQgaWVlZTgwMjExX3d4X3NldF9ydHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKLQotaW50IGllZWU4MDIxMV93eF9nZXRfcnRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7Ci0vL0hUCi0jZGVmaW5lIE1BWF9SRUNFSVZFX0JVRkZFUl9TSVpFIDkxMDAKLXZvaWQgSFREZWJ1Z0hUQ2FwYWJpbGl0eSh1OCAqQ2FwSUUsIHU4ICpUaXRsZVN0cmluZyApOwotdm9pZCBIVERlYnVnSFRJbmZvKHU4ICpJbmZvSUUsIHU4ICpUaXRsZVN0cmluZyk7Ci0KLXZvaWQgSFRTZXRDb25uZWN0QndNb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBIVF9DSEFOTkVMX1dJRFRIIEJhbmR3aWR0aCwgSFRfRVhUQ0hOTF9PRkZTRVQgT2Zmc2V0KTsKLXZvaWQgSFRVcGRhdGVEZWZhdWx0U2V0dGluZyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci12b2lkIEhUQ29uc3RydWN0Q2FwYWJpbGl0eUVsZW1lbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpwb3NIVENhcCwgdTggKmxlbiwgdTggaXNFbmNyeXB0KTsKLXZvaWQgSFRDb25zdHJ1Y3RJbmZvRWxlbWVudChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKnBvc0hUSW5mbywgdTggKmxlbiwgdTggaXNFbmNyeXB0KTsKLXZvaWQgSFRDb25zdHJ1Y3RSVDJSVEFnZ0VsZW1lbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpwb3NSVDJSVEFnZywgdTggKmxlbik7Ci12b2lkIEhUT25Bc3NvY1JzcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci12b2lkIEhUSW5pdGlhbGl6ZUhUSW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSk7Ci12b2lkIEhUSW5pdGlhbGl6ZUJzc0Rlc2MoUEJTU19IVCBwQnNzSFQpOwotdm9pZCBIVFJlc2V0U2VsZkFuZFNhdmVQZWVyU2V0dGluZyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpwTmV0d29yayk7Ci12b2lkIEhUVXBkYXRlU2VsZkFuZFBlZXJTZXR0aW5nKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnBOZXR3b3JrKTsKLXU4IEhUR2V0SGlnaGVzdE1DU1JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpwTUNTUmF0ZVNldCwgdTggKnBNQ1NGaWx0ZXIpOwotZXh0ZXJuIHU4IE1DU19GSUxURVJfQUxMW107Ci1leHRlcm4gdTE2IE1DU19EQVRBX1JBVEVbMl1bMl1bNzddIDsKLQotdTggSFRDQ2hlY2soc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpwRnJhbWUpOwotdm9pZCBIVFJlc2V0SU9UU2V0dGluZyhQUlRfSElHSF9USFJPVUdIUFVUIHBIVEluZm8pOwotYm9vbCBJc0hUSGFsZk5tb2RlQVBzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLXUxNiBIVEhhbGZNY3NUb0RhdGFSYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCBuTWNzUmF0ZSk7Ci11MTYgSFRNY3NUb0RhdGFSYXRlKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggbk1jc1JhdGUpOwotdTE2ICBUeENvdW50VG9EYXRhUmF0ZSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4IG5EYXRhUmF0ZSk7Ci1pbnQgaWVlZTgwMjExX3J4X0FEREJBUmVxKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1pbnQgaWVlZTgwMjExX3J4X0FEREJBUnNwKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1pbnQgaWVlZTgwMjExX3J4X0RFTEJBKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLXZvaWQgVHNJbml0QWRkQkEoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBQVFhfVFNfUkVDT1JEIHBUUywgdTggUG9saWN5LCB1OCBiT3ZlcndyaXRlUGVuZGluZyk7Ci12b2lkIFRzSW5pdERlbEJBKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgUFRTX0NPTU1PTl9JTkZPIHBUc0NvbW1vbkluZm8sIFRSX1NFTEVDVCBUeFJ4U2VsZWN0KTsKLXZvaWQgQmFTZXR1cFRpbWVPdXQodW5zaWduZWQgbG9uZyBkYXRhKTsKLXZvaWQgVHhCYUluYWN0VGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpOwotdm9pZCBSeEJhSW5hY3RUaW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci12b2lkIFJlc2V0QmFFbnRyeSggUEJBX1JFQ09SRCBwQkEpOwotLy9mdW5jdGlvbiBpbiBUUy5jCi1ib29sIEdldFRzKAotICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogICAgICAgIGllZWUsCi0gICAgICAgIFBUU19DT01NT05fSU5GTyAgICAgICAgICAgICAgICAgKnBwVFMsCi0gICAgICAgIHU4KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkciwKLSAgICAgICAgdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSUQsCi0gICAgICAgIFRSX1NFTEVDVCAgICAgICAgICAgICAgICAgICAgICAgVHhSeFNlbGVjdCwgIC8vUng6MSwgVHg6MAotICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBZGROZXdUcwotICAgICAgICApOwotdm9pZCBUU0luaXRpYWxpemUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwotdm9pZCBUc1N0YXJ0QWRkQmFQcm9jZXNzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBQVFhfVFNfUkVDT1JEIHBUeFRTKTsKLXZvaWQgUmVtb3ZlUGVlclRTKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqQWRkcik7Ci12b2lkIFJlbW92ZUFsbFRTKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLXZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9zeW5jcm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwotCi1leHRlcm4gY29uc3QgbG9uZyBpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llc1tdOwotCi1leHRlcm4gaW5saW5lIHZvaWQgaWVlZTgwMjExX2luY3JlbWVudF9zY2FucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLQlpZWVlLT5zY2FucysrOwotfQotCi1leHRlcm4gaW5saW5lIGludCBpZWVlODAyMTFfZ2V0X3NjYW5zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCXJldHVybiBpZWVlLT5zY2FuczsKLX0KLQotc3RhdGljIGlubGluZSBjb25zdCBjaGFyICplc2NhcGVfZXNzaWQoY29uc3QgY2hhciAqZXNzaWQsIHU4IGVzc2lkX2xlbikgewotCXN0YXRpYyBjaGFyIGVzY2FwZWRbSVdfRVNTSURfTUFYX1NJWkUgKiAyICsgMV07Ci0JY29uc3QgY2hhciAqcyA9IGVzc2lkOwotCWNoYXIgKmQgPSBlc2NhcGVkOwotCi0JaWYgKGllZWU4MDIxMV9pc19lbXB0eV9lc3NpZChlc3NpZCwgZXNzaWRfbGVuKSkgewotCQltZW1jcHkoZXNjYXBlZCwgIjxoaWRkZW4+Iiwgc2l6ZW9mKCI8aGlkZGVuPiIpKTsKLQkJcmV0dXJuIGVzY2FwZWQ7Ci0JfQotCi0JZXNzaWRfbGVuID0gbWluKGVzc2lkX2xlbiwgKHU4KUlXX0VTU0lEX01BWF9TSVpFKTsKLQl3aGlsZSAoZXNzaWRfbGVuLS0pIHsKLQkJaWYgKCpzID09ICdcMCcpIHsKLQkJCSpkKysgPSAnXFwnOwotCQkJKmQrKyA9ICcwJzsKLQkJCXMrKzsKLQkJfSBlbHNlIHsKLQkJCSpkKysgPSAqcysrOwotCQl9Ci0JfQotCSpkID0gJ1wwJzsKLQlyZXR1cm4gZXNjYXBlZDsKLX0KLQotLyogRm9yIHRoZSBmdW5jdGlvbiBpcyBtb3JlIHJlbGF0ZWQgdG8gaGFyZHdhcmUgc2V0dGluZywgaXQncyBiZXR0ZXIgdG8gdXNlIHRoZQotICogaWVlZSBoYW5kbGVyIHRvIHJlZmVyIHRvIGl0LgotICovCi1pbnQgaWVlZTgwMjExX2RhdGFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWludCBpZWVlODAyMTFfcGFyc2VfaW5mb19wYXJhbShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKmluZm9fZWxlbWVudCwKLQkJdTE2IGxlbmd0aCwKLQkJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrLAotCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cyk7Ci0KLXZvaWQgaWVlZTgwMjExX2luZGljYXRlX3BhY2tldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpZWVlODAyMTFfcnhiKiogcHJ4YkluZGljYXRlQXJyYXksdTggIGluZGV4KTsKLXZvaWQgaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IHB3cik7Ci12b2lkIGllZWU4MDIxMV9zdGFfcHNfc2VuZF9wc3BvbGxfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpOwotI2RlZmluZSBSVF9BU09DX1JFVFJZX0xJTUlUCTUKLSNlbmRpZiAvKiBJRUVFODAyMTFfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhNjVmZi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9tb2R1bGUuYworKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gIENvcHlyaWdodChjKSAyMDA0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi0gIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgYmFzZWQgb24gdGhlIFdFUCBlbmFibGVtZW50IGNvZGUgcHJvdmlkZWQgYnkgdGhlCi0gIEhvc3QgQVAgcHJvamVjdCBob3N0YXAtZHJpdmVycyB2MC4xLjMKLSAgQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCi0gIDxqa21hbGluZUBjYy5odXQuZmk+Ci0gIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+Ci0KLSAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gIG1vcmUgZGV0YWlscy4KLQotICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLQotICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAgZmlsZSBjYWxsZWQgTElDRU5TRS4KLQotICBDb250YWN0IEluZm9ybWF0aW9uOgotICBKYW1lcyBQLiBLZXRyZW5vcyA8aXB3MjEwMC1hZG1pbkBsaW51eC5pbnRlbC5jb20+Ci0gIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KLSNpbmNsdWRlIDxsaW51eC9pbjYuaD4KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC90Y3AuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPG5ldC9hcnAuaD4KLQotI2luY2x1ZGUgImllZWU4MDIxMS5oIgotCi1NT0RVTEVfREVTQ1JJUFRJT04oIjgwMi4xMSBkYXRhL21hbmFnZW1lbnQvY29udHJvbCBzdGFjayIpOwotTU9EVUxFX0FVVEhPUigiQ29weXJpZ2h0IChDKSAyMDA0IEludGVsIENvcnBvcmF0aW9uIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLSNkZWZpbmUgRFJWX05BTUUgImllZWU4MDIxMSIKLQotc3RhdGljIGlubGluZSBpbnQgaWVlZTgwMjExX25ldHdvcmtzX2FsbG9jYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCWlmIChpZWVlLT5uZXR3b3JrcykKLQkJcmV0dXJuIDA7Ci0KLQlpZWVlLT5uZXR3b3JrcyA9IGtjYWxsb2MoCi0JCU1BWF9ORVRXT1JLX0NPVU5ULCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKSwKLQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpZWVlLT5uZXR3b3JrcykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIGJlYWNvbnNcbiIsCi0JCQlpZWVlLT5kZXYtPm5hbWUpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9uZXR3b3Jrc19mcmVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCWlmICghaWVlZS0+bmV0d29ya3MpCi0JCXJldHVybjsKLQlrZnJlZShpZWVlLT5uZXR3b3Jrcyk7Ci0JaWVlZS0+bmV0d29ya3MgPSBOVUxMOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX25ldHdvcmtzX2luaXRpYWxpemUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCi17Ci0JaW50IGk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmaWVlZS0+bmV0d29ya19mcmVlX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5uZXR3b3JrX2xpc3QpOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfTkVUV09SS19DT1VOVDsgaSsrKQotCQlsaXN0X2FkZF90YWlsKCZpZWVlLT5uZXR3b3Jrc1tpXS5saXN0LCAmaWVlZS0+bmV0d29ya19mcmVlX2xpc3QpOwotfQotCi0KLXN0cnVjdCBuZXRfZGV2aWNlICphbGxvY19pZWVlODAyMTEoaW50IHNpemVvZl9wcml2KQotewotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JaW50IGksIGVycjsKLQotCUlFRUU4MDIxMV9ERUJVR19JTkZPKCJJbml0aWFsaXppbmcuLi5cbiIpOwotCi0JZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKSArIHNpemVvZl9wcml2KTsKLQlpZiAoIWRldikgewotCQlJRUVFODAyMTFfRVJST1IoIlVuYWJsZSB0byBuZXR3b3JrIGRldmljZS5cbiIpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQlpZWVlID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCW1lbXNldChpZWVlLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UpICsgc2l6ZW9mX3ByaXYpOwotCWllZWUtPmRldiA9IGRldjsKLQotCWVyciA9IGllZWU4MDIxMV9uZXR3b3Jrc19hbGxvY2F0ZShpZWVlKTsKLQlpZiAoZXJyKSB7Ci0JCUlFRUU4MDIxMV9FUlJPUigiVW5hYmxlIHRvIGFsbG9jYXRlIGJlYWNvbiBzdG9yYWdlOiAlZFxuIiwKLQkJCQllcnIpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0JaWVlZTgwMjExX25ldHdvcmtzX2luaXRpYWxpemUoaWVlZSk7Ci0KLQotCS8qIERlZmF1bHQgZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQgaXMgbWF4aW11bSBwYXlsb2FkIHNpemUgKi8KLQlpZWVlLT5mdHMgPSBERUZBVUxUX0ZUUzsKLQlpZWVlLT5zY2FuX2FnZSA9IERFRkFVTFRfTUFYX1NDQU5fQUdFOwotCWllZWUtPm9wZW5fd2VwID0gMTsKLQotCS8qIERlZmF1bHQgdG8gZW5hYmxpbmcgZnVsbCBvcGVuIFdFUCB3aXRoIGhvc3QgYmFzZWQgZW5jcnlwdC9kZWNyeXB0ICovCi0JaWVlZS0+aG9zdF9lbmNyeXB0ID0gMTsKLQlpZWVlLT5ob3N0X2RlY3J5cHQgPSAxOwotCWllZWUtPmllZWU4MDJfMXggPSAxOyAvKiBEZWZhdWx0IHRvIHN1cHBvcnRpbmcgODAyLjF4ICovCi0KLQlJTklUX0xJU1RfSEVBRCgmaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3QpOwotCWluaXRfdGltZXIoJmllZWUtPmNyeXB0X2RlaW5pdF90aW1lcik7Ci0JaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylpZWVlOwotCWllZWUtPmNyeXB0X2RlaW5pdF90aW1lci5mdW5jdGlvbiA9IGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlcjsKLQotCXNwaW5fbG9ja19pbml0KCZpZWVlLT5sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmaWVlZS0+d3BheF9zdWl0bGlzdF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmaWVlZS0+Yndfc3BpbmxvY2spOwotCXNwaW5fbG9ja19pbml0KCZpZWVlLT5yZW9yZGVyX3NwaW5sb2NrKTsKLQotCS8qIGFkZGVkIGJ5IFdCICovCi0JYXRvbWljX3NldCgmKGllZWUtPmF0bV9jaG5sb3ApLCAwKTsKLQlhdG9taWNfc2V0KCYoaWVlZS0+YXRtX3N3YncpLCAwKTsKLQotCWllZWUtPndwYXhfdHlwZV9zZXQgPSAwOwotIAlpZWVlLT53cGFfZW5hYmxlZCA9IDA7Ci0gCWllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzID0gMDsKLSAJaWVlZS0+ZHJvcF91bmVuY3J5cHRlZCA9IDA7Ci0gCWllZWUtPnByaXZhY3lfaW52b2tlZCA9IDA7Ci0gCWllZWUtPmllZWU4MDJfMXggPSAxOwotCWllZWUtPnJhd190eCA9IDA7Ci0JLyogaWVlZS0+aHdzZWNfc3VwcG9ydCA9IDE7IGRlZmF1bHQgc3VwcG9ydCBodyBzZWN1cml0eTogdXNlIG1vZHVsZV9wYXJhbSBpbnN0ZWFkICovCi0JaWVlZS0+aHdzZWNfYWN0aXZlID0gMDsgLyogZGlzYWJsZSBod3NlYywgc3dpdGNoIGl0IG9uIHdoZW4gbmVjZXNzYXJ5ICovCi0KLQlpZWVlODAyMTFfc29mdG1hY19pbml0KGllZWUpOwotCi0JaWVlZS0+cEhUSW5mbyA9IGt6YWxsb2Moc2l6ZW9mKFJUX0hJR0hfVEhST1VHSFBVVCksIEdGUF9LRVJORUwpOwotCWlmIChpZWVlLT5wSFRJbmZvID09IE5VTEwpCi0JewotCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImNhbid0IGFsbG9jIG1lbW9yeSBmb3IgSFRJbmZvXG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCUhUVXBkYXRlRGVmYXVsdFNldHRpbmcoaWVlZSk7Ci0JSFRJbml0aWFsaXplSFRJbmZvKGllZWUpOyAvKiBtYXkgbW92ZSB0byBvdGhlciBwbGFjZSAqLwotCVRTSW5pdGlhbGl6ZShpZWVlKTsKLQlmb3IgKGkgPSAwOyBpIDwgSUVFRV9JQlNTX01BQ19IQVNIX1NJWkU7IGkrKykKLQkJSU5JVF9MSVNUX0hFQUQoJmllZWUtPmlic3NfbWFjX2hhc2hbaV0pOwotCi0JZm9yIChpID0gMDsgaSA8IDE3OyBpKyspIHsKLQkJaWVlZS0+bGFzdF9yeHNlcV9udW1baV0gPSAtMTsKLQkJaWVlZS0+bGFzdF9yeGZyYWdfbnVtW2ldID0gLTE7Ci0JCWllZWUtPmxhc3RfcGFja2V0X3RpbWVbaV0gPSAwOwotCX0KLQotCS8qIEZ1bmN0aW9ucyB0byBsb2FkIGNyeXB0IG1vZHVsZSBhdXRvbWF0aWNhbGx5ICovCi0JaWVlZTgwMjExX3RraXBfbnVsbCgpOwotCWllZWU4MDIxMV93ZXBfbnVsbCgpOwotCWllZWU4MDIxMV9jY21wX251bGwoKTsKLQotCXJldHVybiBkZXY7Ci0KLWZhaWxlZDoKLQlpZiAoZGV2KQotCQlmcmVlX25ldGRldihkZXYpOwotCXJldHVybiBOVUxMOwotfQotCi0KLXZvaWQgZnJlZV9pZWVlODAyMTEoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IGk7Ci0Ja2ZyZWUoaWVlZS0+cEhUSW5mbyk7Ci0JaWVlZS0+cEhUSW5mbyA9IE5VTEw7Ci0JUmVtb3ZlQWxsVFMoaWVlZSk7Ci0JaWVlZTgwMjExX3NvZnRtYWNfZnJlZShpZWVlKTsKLQlkZWxfdGltZXJfc3luYygmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKTsKLQlpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMoaWVlZSwgMSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVM7IGkrKykgewotCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0ID0gaWVlZS0+Y3J5cHRbaV07Ci0JCWlmIChjcnlwdCkgewotCQkJaWYgKGNyeXB0LT5vcHMpCi0JCQkJY3J5cHQtPm9wcy0+ZGVpbml0KGNyeXB0LT5wcml2KTsKLQkJCWtmcmVlKGNyeXB0KTsKLQkJCWllZWUtPmNyeXB0W2ldID0gTlVMTDsKLQkJfQotCX0KLQotCWllZWU4MDIxMV9uZXR3b3Jrc19mcmVlKGllZWUpOwotCWZyZWVfbmV0ZGV2KGRldik7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCi0KLXUzMiBpZWVlODAyMTFfZGVidWdfbGV2ZWwgPSAwOwotc3RhdGljIGludCBkZWJ1ZyA9Ci0JLyogSUVFRTgwMjExX0RMX0lORk8JfCAqLwotCS8qIElFRUU4MDIxMV9ETF9XWAl8ICovCi0JLyogSUVFRTgwMjExX0RMX1NDQU4JfCAqLwotCS8qIElFRUU4MDIxMV9ETF9TVEFURQl8ICovCi0JLyogSUVFRTgwMjExX0RMX01HTVQJfCAqLwotCS8qIElFRUU4MDIxMV9ETF9GUkFHCXwgKi8KLQkvKiBJRUVFODAyMTFfRExfRUFQCXwgKi8KLQkvKiBJRUVFODAyMTFfRExfRFJPUAl8ICovCi0JLyogSUVFRTgwMjExX0RMX1RYCXwgKi8KLQkvKiBJRUVFODAyMTFfRExfUlgJfCAqLwotCS8qIElFRUU4MDIxMV9ETF9RT1MgICAgIHwgKi8KLQkvKiBJRUVFODAyMTFfRExfSFQgCXwgKi8KLQkvKiBJRUVFODAyMTFfRExfVFMJfCAqLwotCS8qIElFRUU4MDIxMV9ETF9CQSAJfCAqLwotCS8qIElFRUU4MDIxMV9ETF9SRU9SREVSIHwgKi8KLQkvKiBJRUVFODAyMTFfRExfVFJBQ0UgICB8ICovCi0JLyogSUVFRTgwMjExX0RMX0RBVEEJfCAqLwotCUlFRUU4MDIxMV9ETF9FUlIJLyogYWx3YXlzIG9wZW4gdGhpcyBmbGFnIHRvIHNob3cgZXJyb3Igb3V0ICovCi0JOwotc3RydWN0IHByb2NfZGlyX2VudHJ5ICppZWVlODAyMTFfcHJvYyA9IE5VTEw7Ci0KLXN0YXRpYyBpbnQgc2hvd19kZWJ1Z19sZXZlbChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKLQkJCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIHNucHJpbnRmKHBhZ2UsIGNvdW50LCAiMHglMDhYXG4iLCBpZWVlODAyMTFfZGVidWdfbGV2ZWwpOwotfQotCi1zdGF0aWMgaW50IHN0b3JlX2RlYnVnX2xldmVsKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsCi0JCQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQotewotCWNoYXIgYnVmW10gPSAiMHgwMDAwMDAwMCI7Ci0JdW5zaWduZWQgbG9uZyBsZW4gPSBtaW4oc2l6ZW9mKGJ1ZikgLSAxLCAodTMyKWNvdW50KTsKLQljaGFyICpwID0gKGNoYXIgKilidWY7Ci0JdW5zaWduZWQgbG9uZyB2YWw7Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIGxlbikpCi0JCXJldHVybiBjb3VudDsKLQlidWZbbGVuXSA9IDA7Ci0JaWYgKHBbMV0gPT0gJ3gnIHx8IHBbMV0gPT0gJ1gnIHx8IHBbMF0gPT0gJ3gnIHx8IHBbMF0gPT0gJ1gnKSB7Ci0JCXArKzsKLQkJaWYgKHBbMF0gPT0gJ3gnIHx8IHBbMF0gPT0gJ1gnKQotCQkJcCsrOwotCQl2YWwgPSBzaW1wbGVfc3RydG91bChwLCAmcCwgMTYpOwotCX0gZWxzZQotCQl2YWwgPSBzaW1wbGVfc3RydG91bChwLCAmcCwgMTApOwotCWlmIChwID09IGJ1ZikKLQkJcHJpbnRrKEtFUk5fSU5GTyBEUlZfTkFNRQotCQkJIjogJXMgaXMgbm90IGluIGhleCBvciBkZWNpbWFsIGZvcm0uXG4iLCBidWYpOwotCWVsc2UKLQkJaWVlZTgwMjExX2RlYnVnX2xldmVsID0gdmFsOwotCi0JcmV0dXJuIHN0cm5sZW4oYnVmLCBjb3VudCk7Ci19Ci0KLWV4dGVybiBpbnQgaWVlZTgwMjExX2NyeXB0b19pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2NyeXB0b19kZWluaXQodm9pZCk7Ci1leHRlcm4gaW50IGllZWU4MDIxMV9jcnlwdG9fdGtpcF9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2NyeXB0b190a2lwX2V4aXQodm9pZCk7Ci1leHRlcm4gaW50IGllZWU4MDIxMV9jcnlwdG9fY2NtcF9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgaWVlZTgwMjExX2NyeXB0b19jY21wX2V4aXQodm9pZCk7Ci1leHRlcm4gaW50IGllZWU4MDIxMV9jcnlwdG9fd2VwX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBpZWVlODAyMTFfY3J5cHRvX3dlcF9leGl0KHZvaWQpOwotCi1pbnQgX19pbml0IGllZWU4MDIxMV9ydGxfaW5pdCh2b2lkKQotewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZTsKLQlpbnQgcmV0dmFsOwotCi0JcmV0dmFsID0gaWVlZTgwMjExX2NyeXB0b19pbml0KCk7Ci0JaWYgKHJldHZhbCkKLQkJcmV0dXJuIHJldHZhbDsKLQlyZXR2YWwgPSBpZWVlODAyMTFfY3J5cHRvX3RraXBfaW5pdCgpOwotCWlmIChyZXR2YWwpIHsKLQkJaWVlZTgwMjExX2NyeXB0b19kZWluaXQoKTsKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0JcmV0dmFsID0gaWVlZTgwMjExX2NyeXB0b19jY21wX2luaXQoKTsKLQlpZiAocmV0dmFsKSB7Ci0JCWllZWU4MDIxMV9jcnlwdG9fdGtpcF9leGl0KCk7Ci0JCWllZWU4MDIxMV9jcnlwdG9fZGVpbml0KCk7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCXJldHZhbCA9IGllZWU4MDIxMV9jcnlwdG9fd2VwX2luaXQoKTsKLQlpZiAocmV0dmFsKSB7Ci0JCWllZWU4MDIxMV9jcnlwdG9fY2NtcF9leGl0KCk7Ci0JCWllZWU4MDIxMV9jcnlwdG9fdGtpcF9leGl0KCk7Ci0JCWllZWU4MDIxMV9jcnlwdG9fZGVpbml0KCk7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCi0JaWVlZTgwMjExX2RlYnVnX2xldmVsID0gZGVidWc7Ci0JaWVlZTgwMjExX3Byb2MgPSBwcm9jX21rZGlyKERSVl9OQU1FLCBpbml0X25ldC5wcm9jX25ldCk7Ci0JaWYgKGllZWU4MDIxMV9wcm9jID09IE5VTEwpIHsKLQkJSUVFRTgwMjExX0VSUk9SKCJVbmFibGUgdG8gY3JlYXRlICIgRFJWX05BTUUKLQkJCQkiIHByb2MgZGlyZWN0b3J5XG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCWUgPSBjcmVhdGVfcHJvY19lbnRyeSgiZGVidWdfbGV2ZWwiLCBTX0lGUkVHIHwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCQlpZWVlODAyMTFfcHJvYyk7Ci0JaWYgKCFlKSB7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KERSVl9OQU1FLCBpbml0X25ldC5wcm9jX25ldCk7Ci0JCWllZWU4MDIxMV9wcm9jID0gTlVMTDsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCWUtPnJlYWRfcHJvYyA9IHNob3dfZGVidWdfbGV2ZWw7Ci0JZS0+d3JpdGVfcHJvYyA9IHN0b3JlX2RlYnVnX2xldmVsOwotCWUtPmRhdGEgPSBOVUxMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgX19leGl0IGllZWU4MDIxMV9ydGxfZXhpdCh2b2lkKQotewotCWlmIChpZWVlODAyMTFfcHJvYykgewotCQlyZW1vdmVfcHJvY19lbnRyeSgiZGVidWdfbGV2ZWwiLCBpZWVlODAyMTFfcHJvYyk7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KERSVl9OQU1FLCBpbml0X25ldC5wcm9jX25ldCk7Ci0JCWllZWU4MDIxMV9wcm9jID0gTlVMTDsKLQl9Ci0JaWVlZTgwMjExX2NyeXB0b193ZXBfZXhpdCgpOwotCWllZWU4MDIxMV9jcnlwdG9fY2NtcF9leGl0KCk7Ci0JaWVlZTgwMjExX2NyeXB0b190a2lwX2V4aXQoKTsKLQlpZWVlODAyMTFfY3J5cHRvX2RlaW5pdCgpOwotfQotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLW1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNDQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyBvdXRwdXQgbWFzayIpOwotCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyMDg2ZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY3NiArMCwwIEBACi0vKgotICogT3JpZ2luYWwgY29kZSBiYXNlZCBIb3N0IEFQIChzb2Z0d2FyZSB3aXJlbGVzcyBMQU4gYWNjZXNzIHBvaW50KSBkcml2ZXIKLSAqIGZvciBJbnRlcnNpbCBQcmlzbTIvMi41LzMgLSBob3N0YXAubyBtb2R1bGUsIGNvbW1vbiByb3V0aW5lcwotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyLCBTU0ggQ29tbXVuaWNhdGlvbnMgU2VjdXJpdHkgQ29ycCBhbmQgSm91bmkgTWFsaW5lbgotICogPGprbWFsaW5lQGNjLmh1dC5maT4KLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBKb3VuaSBNYWxpbmVuIDxqa21hbGluZUBjYy5odXQuZmk+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIEludGVsIENvcnBvcmF0aW9uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gU2VlIFJFQURNRSBhbmQgQ09QWUlORyBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICBGZXcgbW9kaWZpY2F0aW9ucyBmb3IgUmVhbHRlaydzIFdpLUZpIGRyaXZlcnMgYnkKLSAgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PgotCi0gIEEgc3BlY2lhbCB0aGFua3MgZ29lcyB0byBSZWFsdGVrIGZvciB0aGVpciBzdXBwb3J0ICEKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0jaW5jbHVkZSA8bGludXgvaW42Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxsaW51eC9pcC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdGNwLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgotCi0jaW5jbHVkZSAiaWVlZTgwMjExLmgiCi0jaWZkZWYgRU5BQkxFX0RPVDExRAotI2luY2x1ZGUgImRvdDExZC5oIgotI2VuZGlmCi1zdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX21vbml0b3Jfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCQkJCXN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnJ4X3N0YXRzKQotewotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKilza2ItPmRhdGE7Ci0JdTE2IGZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOwotCi0Jc2tiLT5kZXYgPSBpZWVlLT5kZXY7Ci0gICAgICAgIHNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7Ci0KLQlza2JfcHVsbChza2IsIGllZWU4MDIxMV9nZXRfaGRybGVuKGZjKSk7Ci0Jc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7Ci0Jc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMTFfUkFXKTsKLQltZW1zZXQoc2tiLT5jYiwgMCwgc2l6ZW9mKHNrYi0+Y2IpKTsKLQluZXRpZl9yeChza2IpOwotfQotCi0KLS8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSAqLwotc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfZnJhZ19lbnRyeSAqCi1pZWVlODAyMTFfZnJhZ19jYWNoZV9maW5kKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1bnNpZ25lZCBpbnQgc2VxLAotCQkJICB1bnNpZ25lZCBpbnQgZnJhZywgdTggdGlkLHU4ICpzcmMsIHU4ICpkc3QpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9mcmFnX2VudHJ5ICplbnRyeTsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfRlJBR19DQUNIRV9MRU47IGkrKykgewotCQllbnRyeSA9ICZpZWVlLT5mcmFnX2NhY2hlW3RpZF1baV07Ci0JCWlmIChlbnRyeS0+c2tiICE9IE5VTEwgJiYKLQkJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgZW50cnktPmZpcnN0X2ZyYWdfdGltZSArIDIgKiBIWikpIHsKLQkJCUlFRUU4MDIxMV9ERUJVR19GUkFHKAotCQkJCSJleHBpcmluZyBmcmFnbWVudCBjYWNoZSBlbnRyeSAiCi0JCQkJInNlcT0ldSBsYXN0X2ZyYWc9JXVcbiIsCi0JCQkJZW50cnktPnNlcSwgZW50cnktPmxhc3RfZnJhZyk7Ci0JCQlkZXZfa2ZyZWVfc2tiX2FueShlbnRyeS0+c2tiKTsKLQkJCWVudHJ5LT5za2IgPSBOVUxMOwotCQl9Ci0KLQkJaWYgKGVudHJ5LT5za2IgIT0gTlVMTCAmJiBlbnRyeS0+c2VxID09IHNlcSAmJgotCQkgICAgKGVudHJ5LT5sYXN0X2ZyYWcgKyAxID09IGZyYWcgfHwgZnJhZyA9PSAtMSkgJiYKLQkJICAgIG1lbWNtcChlbnRyeS0+c3JjX2FkZHIsIHNyYywgRVRIX0FMRU4pID09IDAgJiYKLQkJICAgIG1lbWNtcChlbnRyeS0+ZHN0X2FkZHIsIGRzdCwgRVRIX0FMRU4pID09IDApCi0JCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSAqLwotc3RhdGljIHN0cnVjdCBza19idWZmICoKLWllZWU4MDIxMV9mcmFnX2NhY2hlX2dldChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGRyKQotewotCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwotCXUxNiBmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKLQl1MTYgc2MgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdGwpOwotCXVuc2lnbmVkIGludCBmcmFnID0gV0xBTl9HRVRfU0VRX0ZSQUcoc2MpOwotCXVuc2lnbmVkIGludCBzZXEgPSBXTEFOX0dFVF9TRVFfU0VRKHNjKTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgKmVudHJ5OwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRycW9zICpoZHJfM2FkZHJxb3M7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHJxb3MgKmhkcl80YWRkcnFvczsKLQl1OCB0aWQ7Ci0KLQlpZiAoKChmYyAmIElFRUU4MDIxMV9GQ1RMX0RTVE9EUykgPT0gSUVFRTgwMjExX0ZDVExfRFNUT0RTKSYmSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkgewotCSAgaGRyXzRhZGRycW9zID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRycW9zICopaGRyOwotCSAgdGlkID0gbGUxNl90b19jcHUoaGRyXzRhZGRycW9zLT5xb3NfY3RsKSAmIElFRUU4MDIxMV9RQ1RMX1RJRDsKLQkgIHRpZCA9IFVQMkFDKHRpZCk7Ci0JICB0aWQgKys7Ci0JfSBlbHNlIGlmIChJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKSB7Ci0JICBoZHJfM2FkZHJxb3MgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJxb3MgKiloZHI7Ci0JICB0aWQgPSBsZTE2X3RvX2NwdShoZHJfM2FkZHJxb3MtPnFvc19jdGwpICYgSUVFRTgwMjExX1FDVExfVElEOwotCSAgdGlkID0gVVAyQUModGlkKTsKLQkgIHRpZCArKzsKLQl9IGVsc2UgewotCSAgdGlkID0gMDsKLQl9Ci0KLQlpZiAoZnJhZyA9PSAwKSB7Ci0JCS8qIFJlc2VydmUgZW5vdWdoIHNwYWNlIHRvIGZpdCBtYXhpbXVtIGZyYW1lIGxlbmd0aCAqLwotCQlza2IgPSBkZXZfYWxsb2Nfc2tiKGllZWUtPmRldi0+bXR1ICsKLQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyKSArCi0JCQkJICAgIDggLyogTExDICovICsKLQkJCQkgICAgMiAvKiBhbGlnbm1lbnQgKi8gKwotCQkJCSAgICA4IC8qIFdFUCAqLyArCi0JCQkJICAgIEVUSF9BTEVOIC8qIFdEUyAqLyArCi0JCQkJICAgIChJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpPzI6MCkgLyogUU9TIENvbnRyb2wgKi8pOwotCQlpZiAoc2tiID09IE5VTEwpCi0JCQlyZXR1cm4gTlVMTDsKLQotCQllbnRyeSA9ICZpZWVlLT5mcmFnX2NhY2hlW3RpZF1baWVlZS0+ZnJhZ19uZXh0X2lkeFt0aWRdXTsKLQkJaWVlZS0+ZnJhZ19uZXh0X2lkeFt0aWRdKys7Ci0JCWlmIChpZWVlLT5mcmFnX25leHRfaWR4W3RpZF0gPj0gSUVFRTgwMjExX0ZSQUdfQ0FDSEVfTEVOKQotCQkJaWVlZS0+ZnJhZ19uZXh0X2lkeFt0aWRdID0gMDsKLQotCQlpZiAoZW50cnktPnNrYiAhPSBOVUxMKQotCQkJZGV2X2tmcmVlX3NrYl9hbnkoZW50cnktPnNrYik7Ci0KLQkJZW50cnktPmZpcnN0X2ZyYWdfdGltZSA9IGppZmZpZXM7Ci0JCWVudHJ5LT5zZXEgPSBzZXE7Ci0JCWVudHJ5LT5sYXN0X2ZyYWcgPSBmcmFnOwotCQllbnRyeS0+c2tiID0gc2tiOwotCQltZW1jcHkoZW50cnktPnNyY19hZGRyLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7Ci0JCW1lbWNweShlbnRyeS0+ZHN0X2FkZHIsIGhkci0+YWRkcjEsIEVUSF9BTEVOKTsKLQl9IGVsc2UgewotCQkvKiByZWNlaXZlZCBhIGZyYWdtZW50IG9mIGEgZnJhbWUgZm9yIHdoaWNoIHRoZSBoZWFkIGZyYWdtZW50Ci0JCSAqIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZWNlaXZlZCAqLwotCQllbnRyeSA9IGllZWU4MDIxMV9mcmFnX2NhY2hlX2ZpbmQoaWVlZSwgc2VxLCBmcmFnLCB0aWQsaGRyLT5hZGRyMiwKLQkJCQkJCSAgaGRyLT5hZGRyMSk7Ci0JCWlmIChlbnRyeSAhPSBOVUxMKSB7Ci0JCQllbnRyeS0+bGFzdF9mcmFnID0gZnJhZzsKLQkJCXNrYiA9IGVudHJ5LT5za2I7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gc2tiOwotfQotCi0KLS8qIENhbGxlZCBvbmx5IGFzIGEgdGFza2xldCAoc29mdHdhcmUgSVJRKSAqLwotc3RhdGljIGludCBpZWVlODAyMTFfZnJhZ19jYWNoZV9pbnZhbGlkYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotCQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGRyKQotewotCXUxNiBmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKLQl1MTYgc2MgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdGwpOwotCXVuc2lnbmVkIGludCBzZXEgPSBXTEFOX0dFVF9TRVFfU0VRKHNjKTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdfZW50cnkgKmVudHJ5OwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRycW9zICpoZHJfM2FkZHJxb3M7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHJxb3MgKmhkcl80YWRkcnFvczsKLQl1OCB0aWQ7Ci0KLQlpZigoKGZjICYgSUVFRTgwMjExX0ZDVExfRFNUT0RTKSA9PSBJRUVFODAyMTFfRkNUTF9EU1RPRFMpJiZJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKSB7Ci0JICBoZHJfNGFkZHJxb3MgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHJxb3MgKiloZHI7Ci0JICB0aWQgPSBsZTE2X3RvX2NwdShoZHJfNGFkZHJxb3MtPnFvc19jdGwpICYgSUVFRTgwMjExX1FDVExfVElEOwotCSAgdGlkID0gVVAyQUModGlkKTsKLQkgIHRpZCArKzsKLQl9IGVsc2UgaWYgKElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpIHsKLQkgIGhkcl8zYWRkcnFvcyA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcnFvcyAqKWhkcjsKLQkgIHRpZCA9IGxlMTZfdG9fY3B1KGhkcl8zYWRkcnFvcy0+cW9zX2N0bCkgJiBJRUVFODAyMTFfUUNUTF9USUQ7Ci0JICB0aWQgPSBVUDJBQyh0aWQpOwotCSAgdGlkICsrOwotCX0gZWxzZSB7Ci0JICB0aWQgPSAwOwotCX0KLQotCWVudHJ5ID0gaWVlZTgwMjExX2ZyYWdfY2FjaGVfZmluZChpZWVlLCBzZXEsIC0xLCB0aWQsaGRyLT5hZGRyMiwKLQkJCQkJICBoZHItPmFkZHIxKTsKLQotCWlmIChlbnRyeSA9PSBOVUxMKSB7Ci0JCUlFRUU4MDIxMV9ERUJVR19GUkFHKAotCQkJImNvdWxkIG5vdCBpbnZhbGlkYXRlIGZyYWdtZW50IGNhY2hlICIKLQkJCSJlbnRyeSAoc2VxPSV1KVxuIiwgc2VxKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWVudHJ5LT5za2IgPSBOVUxMOwotCXJldHVybiAwOwotfQotCi0KLQotLyogaWVlZTgwMjExX3J4X2ZyYW1lX21ndG10Ci0gKgotICogUmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIG1hbmFnZW1lbnQgY29udHJvbCBmcmFtZXMKLSAqCi0gKiBDYWxsZWQgYnkgaWVlZTgwMjExX3J4ICovCi1zdGF0aWMgaW5saW5lIGludAotaWVlZTgwMjExX3J4X2ZyYW1lX21nbXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cywgdTE2IHR5cGUsCi0JCQl1MTYgc3R5cGUpCi17Ci0JLyogT24gdGhlIHN0cnVjdCBzdGF0cyBkZWZpbml0aW9uIHRoZXJlIGlzIHdyaXR0ZW4gdGhhdAotCSAqIHRoaXMgaXMgbm90IG1hbmRhdG9yeS4uLi4gYnV0IHNlZW1zIHRoYXQgdGhlIHByb2JlCi0JICogcmVzcG9uc2UgcGFyc2VyIHVzZXMgaXQKLQkgKi8KLSAgICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKiBoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKilza2ItPmRhdGE7Ci0KLQlyeF9zdGF0cy0+bGVuID0gc2tiLT5sZW47Ci0JaWVlZTgwMjExX3J4X21ndChpZWVlLChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKXNrYi0+ZGF0YSxyeF9zdGF0cyk7Ci0gICAgICAgIGlmICgobWVtY21wKGhkci0+YWRkcjEsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSkpLy91c2UgQUREUjEgdG8gcGVyZm9ybSBhZGRyZXNzIG1hdGNoaW5nIGZvciBNYW5hZ2VtZW50IGZyYW1lcwotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0JaWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWMoaWVlZSwgc2tiLCByeF9zdGF0cywgdHlwZSwgc3R5cGUpOwotCi0JZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQotCXJldHVybiAwOwotCi0JI2lmZGVmIE5PVF9ZRVQKLQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgewotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1hc3RlciBtb2RlIG5vdCB5ZXQgc3VwcHBvcnRlZC5cbiIsCi0JCSAgICAgICBpZWVlLT5kZXYtPm5hbWUpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoaWVlZS0+aG9zdGFwZCAmJiB0eXBlID09IElFRUU4MDIxMV9UWVBFX01HTVQpIHsKLQkJaWYgKHN0eXBlID09IFdMQU5fRkNfU1RZUEVfQkVBQ09OICYmCi0JCSAgICBpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7Ci0JCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKLQkJCS8qIFByb2Nlc3MgYmVhY29uIGZyYW1lcyBhbHNvIGluIGtlcm5lbCBkcml2ZXIgdG8KLQkJCSAqIHVwZGF0ZSBTVEEoQVApIHRhYmxlIHN0YXRpc3RpY3MgKi8KLQkJCXNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKLQkJCWlmIChza2IyKQotCQkJCWhvc3RhcF9yeChza2IyLT5kZXYsIHNrYjIsIHJ4X3N0YXRzKTsKLQkJfQotCi0JCS8qIHNlbmQgbWFuYWdlbWVudCBmcmFtZXMgdG8gdGhlIHVzZXIgc3BhY2UgZGFlbW9uIGZvcgotCQkgKiBwcm9jZXNzaW5nICovCi0JCWllZWUtPmFwZGV2c3RhdHMucnhfcGFja2V0cysrOwotCQlpZWVlLT5hcGRldnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwotCQlwcmlzbTJfcnhfODAyMTEoaWVlZS0+YXBkZXYsIHNrYiwgcnhfc3RhdHMsIFBSSVNNMl9SWF9NR01UKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JICAgIGlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7Ci0JCWlmICh0eXBlICE9IFdMQU5fRkNfVFlQRV9NR01UICYmIHR5cGUgIT0gV0xBTl9GQ19UWVBFX0NUUkwpIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogdW5rbm93biBtYW5hZ2VtZW50IGZyYW1lICIKLQkJCSAgICAgICAiKHR5cGU9MHglMDJ4LCBzdHlwZT0weCUwMngpIGRyb3BwZWRcbiIsCi0JCQkgICAgICAgc2tiLT5kZXYtPm5hbWUsIHR5cGUsIHN0eXBlKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCWhvc3RhcF9yeChza2ItPmRldiwgc2tiLCByeF9zdGF0cyk7Ci0JCXJldHVybiAwOwotCX0KLQotCXByaW50ayhLRVJOX0RFQlVHICIlczogaG9zdGFwX3J4X2ZyYW1lX21nbXQ6IG1hbmFnZW1lbnQgZnJhbWUgIgotCSAgICAgICAicmVjZWl2ZWQgaW4gbm9uLUhvc3QgQVAgbW9kZVxuIiwgc2tiLT5kZXYtPm5hbWUpOwotCXJldHVybiAtMTsKLQkjZW5kaWYKLX0KLQotCi0KLS8qIFNlZSBJRUVFIDgwMi4xSCBmb3IgTExDL1NOQVAgZW5jYXBzdWxhdGlvbi9kZWNhcHN1bGF0aW9uICovCi0vKiBFdGhlcm5ldC1JSSBzbmFwIGhlYWRlciAoUkZDMTA0MiBmb3IgbW9zdCBFdGhlclR5cGVzKSAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgcmZjMTA0Ml9oZWFkZXJbXSA9Ci17IDB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAgfTsKLS8qIEJyaWRnZS1UdW5uZWwgaGVhZGVyIChmb3IgRXRoZXJUeXBlcyBFVEhfUF9BQVJQIGFuZCBFVEhfUF9JUFgpICovCi1zdGF0aWMgdW5zaWduZWQgY2hhciBicmlkZ2VfdHVubmVsX2hlYWRlcltdID0KLXsgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHhmOCB9OwotLyogTm8gZW5jYXBzdWxhdGlvbiBoZWFkZXIgaWYgRXRoZXJUeXBlIDwgMHg2MDAgKD1sZW5ndGgpICovCi0KLS8qIENhbGxlZCBieSBpZWVlODAyMTFfcnhfZnJhbWVfZGVjcnlwdCAqLwotc3RhdGljIGludCBpZWVlODAyMTFfaXNfZWFwb2xfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsIHNpemVfdCBoZHJsZW4pCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKLQl1MTYgZmMsIGV0aGVydHlwZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGRyOwotCXU4ICpwb3M7Ci0KLQlpZiAoc2tiLT5sZW4gPCAyNCkKLQkJcmV0dXJuIDA7Ci0KLSAgICAgICAgaWYgKGllZWUtPmh3c2VjX2FjdGl2ZSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIGNiX2Rlc2MgKnRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiLT5jYisgTUFYX0RFVl9BRERSX1NJWkUpOwotICAgICAgICAgICAgICAgIHRjYl9kZXNjLT5iSHdTZWMgPSAxOwotCi0gICAgICAgICAgICAgICAgaWYoaWVlZS0+bmVlZF9zd19lbmMpCi0gICAgICAgICAgICAgICAgICAgICAgICB0Y2JfZGVzYy0+Ykh3U2VjID0gMDsKLSAgICAgICAgfQotCi0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKLQlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKLQotCS8qIGNoZWNrIHRoYXQgdGhlIGZyYW1lIGlzIHVuaWNhc3QgZnJhbWUgdG8gdXMgKi8KLQlpZiAoKGZjICYgKElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKSA9PQotCSAgICBJRUVFODAyMTFfRkNUTF9UT0RTICYmCi0JICAgIG1lbWNtcChoZHItPmFkZHIxLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikgPT0gMCAmJgotCSAgICBtZW1jbXAoaGRyLT5hZGRyMywgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pID09IDApIHsKLQkJLyogVG9EUyBmcmFtZSB3aXRoIG93biBhZGRyIEJTU0lEIGFuZCBEQSAqLwotCX0gZWxzZSBpZiAoKGZjICYgKElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKSA9PQotCQkgICBJRUVFODAyMTFfRkNUTF9GUk9NRFMgJiYKLQkJICAgbWVtY21wKGhkci0+YWRkcjEsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSA9PSAwKSB7Ci0JCS8qIEZyb21EUyBmcmFtZSB3aXRoIG93biBhZGRyIGFzIERBICovCi0JfSBlbHNlCi0JCXJldHVybiAwOwotCi0JaWYgKHNrYi0+bGVuIDwgMjQgKyA4KQotCQlyZXR1cm4gMDsKLQotCS8qIGNoZWNrIGZvciBwb3J0IGFjY2VzcyBlbnRpdHkgRXRoZXJuZXQgdHlwZSAqLwotCXBvcyA9IHNrYi0+ZGF0YSArIGhkcmxlbjsKLQlldGhlcnR5cGUgPSAocG9zWzZdIDw8IDgpIHwgcG9zWzddOwotCWlmIChldGhlcnR5cGUgPT0gRVRIX1BfUEFFKQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOwotfQotCi0vKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSksIGJ5IGllZWU4MDIxMV9yeCAqLwotc3RhdGljIGlubGluZSBpbnQKLWllZWU4MDIxMV9yeF9mcmFtZV9kZWNyeXB0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdCkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGRyOwotCWludCByZXMsIGhkcmxlbjsKLQotCWlmIChjcnlwdCA9PSBOVUxMIHx8IGNyeXB0LT5vcHMtPmRlY3J5cHRfbXBkdSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQotCWlmIChpZWVlLT5od3NlY19hY3RpdmUpCi0JewotCQljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IrIE1BWF9ERVZfQUREUl9TSVpFKTsKLQkJdGNiX2Rlc2MtPmJId1NlYyA9IDE7Ci0JfQotCi0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKLQloZHJsZW4gPSBpZWVlODAyMTFfZ2V0X2hkcmxlbihsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpOwotCi0jaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9DUllQVF9US0lQCi0JaWYgKGllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzICYmCi0JICAgIHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCAiVEtJUCIpID09IDApIHsKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUS0lQIGNvdW50ZXJtZWFzdXJlczogZHJvcHBlZCAiCi0JCQkgICAgICAgInJlY2VpdmVkIHBhY2tldCBmcm9tICVwTVxuIiwKLQkJCSAgICAgICBpZWVlLT5kZXYtPm5hbWUsIGhkci0+YWRkcjIpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0jZW5kaWYKLQotCWF0b21pY19pbmMoJmNyeXB0LT5yZWZjbnQpOwotCXJlcyA9IGNyeXB0LT5vcHMtPmRlY3J5cHRfbXBkdShza2IsIGhkcmxlbiwgY3J5cHQtPnByaXYpOwotCWF0b21pY19kZWMoJmNyeXB0LT5yZWZjbnQpOwotCWlmIChyZXMgPCAwKSB7Ci0JCUlFRUU4MDIxMV9ERUJVR19EUk9QKAotCQkJImRlY3J5cHRpb24gZmFpbGVkIChTQT0lcE0iCi0JCQkiKSByZXM9JWRcbiIsIGhkci0+YWRkcjIsIHJlcyk7Ci0JCWlmIChyZXMgPT0gLTIpCi0JCQlJRUVFODAyMTFfREVCVUdfRFJPUCgiRGVjcnlwdGlvbiBmYWlsZWQgSUNWICIKLQkJCQkJICAgICAibWlzbWF0Y2ggKGtleSAlZClcbiIsCi0JCQkJCSAgICAgc2tiLT5kYXRhW2hkcmxlbiArIDNdID4+IDYpOwotCQlpZWVlLT5pZWVlX3N0YXRzLnJ4X2Rpc2NhcmRzX3VuZGVjcnlwdGFibGUrKzsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiByZXM7Ci19Ci0KLQotLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpLCBieSBpZWVlODAyMTFfcnggKi8KLXN0YXRpYyBpbmxpbmUgaW50Ci1pZWVlODAyMTFfcnhfZnJhbWVfZGVjcnlwdF9tc2R1KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICBpbnQga2V5aWR4LCBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0KQotewotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHI7Ci0JaW50IHJlcywgaGRybGVuOwotCi0JaWYgKGNyeXB0ID09IE5VTEwgfHwgY3J5cHQtPm9wcy0+ZGVjcnlwdF9tc2R1ID09IE5VTEwpCi0JCXJldHVybiAwOwotCWlmIChpZWVlLT5od3NlY19hY3RpdmUpCi0JewotCQljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IrIE1BWF9ERVZfQUREUl9TSVpFKTsKLQkJdGNiX2Rlc2MtPmJId1NlYyA9IDE7Ci0KLSAgICAgICAgICAgICAgICBpZihpZWVlLT5uZWVkX3N3X2VuYykKLSAgICAgICAgICAgICAgICAgICAgICAgIHRjYl9kZXNjLT5iSHdTZWMgPSAwOwotCi0JfQotCi0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKLQloZHJsZW4gPSBpZWVlODAyMTFfZ2V0X2hkcmxlbihsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpOwotCi0JYXRvbWljX2luYygmY3J5cHQtPnJlZmNudCk7Ci0JcmVzID0gY3J5cHQtPm9wcy0+ZGVjcnlwdF9tc2R1KHNrYiwga2V5aWR4LCBoZHJsZW4sIGNyeXB0LT5wcml2KTsKLQlhdG9taWNfZGVjKCZjcnlwdC0+cmVmY250KTsKLQlpZiAocmVzIDwgMCkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1TRFUgZGVjcnlwdGlvbi9NSUMgdmVyaWZpY2F0aW9uIGZhaWxlZCIKLQkJICAgICAgICIgKFNBPSVwTSBrZXlpZHg9JWQpXG4iLAotCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lLCBoZHItPmFkZHIyLCBrZXlpZHgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyogdGhpcyBmdW5jdGlvbiBpcyBzdG9sZW4gZnJvbSBpcHcyMjAwIGRyaXZlciovCi0jZGVmaW5lIElFRUVfUEFDS0VUX1JFVFJZX1RJTUUgKDUqSFopCi1zdGF0aWMgaW50IGlzX2R1cGxpY2F0ZV9wYWNrZXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhlYWRlcikKLXsKLQl1MTYgZmMgPSBsZTE2X3RvX2NwdShoZWFkZXItPmZyYW1lX2N0bCk7Ci0JdTE2IHNjID0gbGUxNl90b19jcHUoaGVhZGVyLT5zZXFfY3RsKTsKLQl1MTYgc2VxID0gV0xBTl9HRVRfU0VRX1NFUShzYyk7Ci0JdTE2IGZyYWcgPSBXTEFOX0dFVF9TRVFfRlJBRyhzYyk7Ci0JdTE2ICpsYXN0X3NlcSwgKmxhc3RfZnJhZzsKLQl1bnNpZ25lZCBsb25nICpsYXN0X3RpbWU7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJxb3MgKmhkcl8zYWRkcnFvczsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkcnFvcyAqaGRyXzRhZGRycW9zOwotCXU4IHRpZDsKLQotCi0JLy9UTzJEUyBhbmQgUW9TCi0JaWYoKChmYyAmIElFRUU4MDIxMV9GQ1RMX0RTVE9EUykgPT0gSUVFRTgwMjExX0ZDVExfRFNUT0RTKSYmSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkgewotCSAgaGRyXzRhZGRycW9zID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRycW9zICopaGVhZGVyOwotCSAgdGlkID0gbGUxNl90b19jcHUoaGRyXzRhZGRycW9zLT5xb3NfY3RsKSAmIElFRUU4MDIxMV9RQ1RMX1RJRDsKLQkgIHRpZCA9IFVQMkFDKHRpZCk7Ci0JICB0aWQgKys7Ci0JfSBlbHNlIGlmKElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpIHsgLy9Rb1MKLQkgIGhkcl8zYWRkcnFvcyA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcnFvcyopaGVhZGVyOwotCSAgdGlkID0gbGUxNl90b19jcHUoaGRyXzNhZGRycW9zLT5xb3NfY3RsKSAmIElFRUU4MDIxMV9RQ1RMX1RJRDsKLQkgIHRpZCA9IFVQMkFDKHRpZCk7Ci0JICB0aWQgKys7Ci0JfSBlbHNlIHsgLy8gbm8gUW9TCi0JICB0aWQgPSAwOwotCX0KLQotCXN3aXRjaCAoaWVlZS0+aXdfbW9kZSkgewotCWNhc2UgSVdfTU9ERV9BREhPQzoKLQl7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKnA7Ci0JCXN0cnVjdCBpZWVlX2lic3Nfc2VxICplbnRyeSA9IE5VTEw7Ci0JCXU4ICptYWMgPSBoZWFkZXItPmFkZHIyOwotCQlpbnQgaW5kZXggPSBtYWNbNV0gJSBJRUVFX0lCU1NfTUFDX0hBU0hfU0laRTsKLQotCQlsaXN0X2Zvcl9lYWNoKHAsICZpZWVlLT5pYnNzX21hY19oYXNoW2luZGV4XSkgewotCQkJZW50cnkgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBpZWVlX2lic3Nfc2VxLCBsaXN0KTsKLQkJCWlmICghbWVtY21wKGVudHJ5LT5tYWMsIG1hYywgRVRIX0FMRU4pKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHAgPT0gJmllZWUtPmlic3NfbWFjX2hhc2hbaW5kZXhdKSB7Ci0JCQllbnRyeSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpZWVlX2lic3Nfc2VxKSwgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoIWVudHJ5KSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2Fubm90IG1hbGxvYyBuZXcgbWFjIGVudHJ5XG4iKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCW1lbWNweShlbnRyeS0+bWFjLCBtYWMsIEVUSF9BTEVOKTsKLQkJCWVudHJ5LT5zZXFfbnVtW3RpZF0gPSBzZXE7Ci0JCQllbnRyeS0+ZnJhZ19udW1bdGlkXSA9IGZyYWc7Ci0JCQllbnRyeS0+cGFja2V0X3RpbWVbdGlkXSA9IGppZmZpZXM7Ci0JCQlsaXN0X2FkZCgmZW50cnktPmxpc3QsICZpZWVlLT5pYnNzX21hY19oYXNoW2luZGV4XSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlsYXN0X3NlcSA9ICZlbnRyeS0+c2VxX251bVt0aWRdOwotCQlsYXN0X2ZyYWcgPSAmZW50cnktPmZyYWdfbnVtW3RpZF07Ci0JCWxhc3RfdGltZSA9ICZlbnRyeS0+cGFja2V0X3RpbWVbdGlkXTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBJV19NT0RFX0lORlJBOgotCQlsYXN0X3NlcSA9ICZpZWVlLT5sYXN0X3J4c2VxX251bVt0aWRdOwotCQlsYXN0X2ZyYWcgPSAmaWVlZS0+bGFzdF9yeGZyYWdfbnVtW3RpZF07Ci0JCWxhc3RfdGltZSA9ICZpZWVlLT5sYXN0X3BhY2tldF90aW1lW3RpZF07Ci0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKCgqbGFzdF9zZXEgPT0gc2VxKSAmJgotCSAgICB0aW1lX2FmdGVyKCpsYXN0X3RpbWUgKyBJRUVFX1BBQ0tFVF9SRVRSWV9USU1FLCBqaWZmaWVzKSkgewotCQlpZiAoKmxhc3RfZnJhZyA9PSBmcmFnKXsKLQkJCWdvdG8gZHJvcDsKLQotCQl9Ci0JCWlmICgqbGFzdF9mcmFnICsgMSAhPSBmcmFnKQotCQkJLyogb3V0LW9mLW9yZGVyIGZyYWdtZW50ICovCi0JCQlnb3RvIGRyb3A7Ci0JfSBlbHNlCi0JCSpsYXN0X3NlcSA9IHNlcTsKLQotCSpsYXN0X2ZyYWcgPSBmcmFnOwotCSpsYXN0X3RpbWUgPSBqaWZmaWVzOwotCXJldHVybiAwOwotCi1kcm9wOgotCXJldHVybiAxOwotfQotYm9vbAotQWRkUmVvcmRlckVudHJ5KAotCVBSWF9UU19SRUNPUkQJCQlwVFMsCi0JUFJYX1JFT1JERVJfRU5UUlkJCXBSZW9yZGVyRW50cnkKLQkpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcExpc3QgPSAmcFRTLT5SeFBlbmRpbmdQa3RMaXN0OwotCi0Jd2hpbGUocExpc3QtPm5leHQgIT0gJnBUUy0+UnhQZW5kaW5nUGt0TGlzdCkKLQl7Ci0JCWlmKCBTTl9MRVNTKHBSZW9yZGVyRW50cnktPlNlcU51bSwgKChQUlhfUkVPUkRFUl9FTlRSWSlsaXN0X2VudHJ5KHBMaXN0LT5uZXh0LFJYX1JFT1JERVJfRU5UUlksTGlzdCkpLT5TZXFOdW0pICkKLQkJewotCQkJcExpc3QgPSBwTGlzdC0+bmV4dDsKLQkJfQotCQllbHNlIGlmKCBTTl9FUVVBTChwUmVvcmRlckVudHJ5LT5TZXFOdW0sICgoUFJYX1JFT1JERVJfRU5UUlkpbGlzdF9lbnRyeShwTGlzdC0+bmV4dCxSWF9SRU9SREVSX0VOVFJZLExpc3QpKS0+U2VxTnVtKSApCi0JCXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcFJlb3JkZXJFbnRyeS0+TGlzdC5uZXh0ID0gcExpc3QtPm5leHQ7Ci0JcFJlb3JkZXJFbnRyeS0+TGlzdC5uZXh0LT5wcmV2ID0gJnBSZW9yZGVyRW50cnktPkxpc3Q7Ci0JcFJlb3JkZXJFbnRyeS0+TGlzdC5wcmV2ID0gcExpc3Q7Ci0JcExpc3QtPm5leHQgPSAmcFJlb3JkZXJFbnRyeS0+TGlzdDsKLQotCXJldHVybiB0cnVlOwotfQotCi12b2lkIGllZWU4MDIxMV9pbmRpY2F0ZV9wYWNrZXRzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX3J4YioqIHByeGJJbmRpY2F0ZUFycmF5LHU4ICBpbmRleCkKLXsKLQl1OCBpID0gMCAsIGo9MDsKLQl1MTYgZXRoZXJ0eXBlOwotCi0JZm9yKGogPSAwOyBqPGluZGV4OyBqKyspCi0JewotLy9hZGRlZCBieSBhbXkgZm9yIHJlb3JkZXIKLQkJc3RydWN0IGllZWU4MDIxMV9yeGIqIHByeGIgPSBwcnhiSW5kaWNhdGVBcnJheVtqXTsKLQkJZm9yKGkgPSAwOyBpPHByeGItPm5yX3N1YmZyYW1lczsgaSsrKSB7Ci0JCQlzdHJ1Y3Qgc2tfYnVmZiAqc3ViX3NrYiA9IHByeGItPnN1YmZyYW1lc1tpXTsKLQotCQkvKiBjb252ZXJ0IGhkciArIHBvc3NpYmxlIExMQyBoZWFkZXJzIGludG8gRXRoZXJuZXQgaGVhZGVyICovCi0JCQlldGhlcnR5cGUgPSAoc3ViX3NrYi0+ZGF0YVs2XSA8PCA4KSB8IHN1Yl9za2ItPmRhdGFbN107Ci0JCQlpZiAoc3ViX3NrYi0+bGVuID49IDggJiYKLQkJCQkoKG1lbWNtcChzdWJfc2tiLT5kYXRhLCByZmMxMDQyX2hlYWRlciwgU05BUF9TSVpFKSA9PSAwICYmCi0JCQkJICBldGhlcnR5cGUgIT0gRVRIX1BfQUFSUCAmJiBldGhlcnR5cGUgIT0gRVRIX1BfSVBYKSB8fAotCQkJCSBtZW1jbXAoc3ViX3NrYi0+ZGF0YSwgYnJpZGdlX3R1bm5lbF9oZWFkZXIsIFNOQVBfU0laRSkgPT0gMCkpIHsKLQkJCS8qIHJlbW92ZSBSRkMxMDQyIG9yIEJyaWRnZS1UdW5uZWwgZW5jYXBzdWxhdGlvbiBhbmQKLQkJCSAqIHJlcGxhY2UgRXRoZXJUeXBlICovCi0JCQkJc2tiX3B1bGwoc3ViX3NrYiwgU05BUF9TSVpFKTsKLQkJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgRVRIX0FMRU4pLCBwcnhiLT5zcmMsIEVUSF9BTEVOKTsKLQkJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgRVRIX0FMRU4pLCBwcnhiLT5kc3QsIEVUSF9BTEVOKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdTE2IGxlbjsKLQkJCS8qIExlYXZlIEV0aGVybmV0IGhlYWRlciBwYXJ0IG9mIGhkciBhbmQgZnVsbCBwYXlsb2FkICovCi0JCQkJbGVuID0gaHRvbnMoc3ViX3NrYi0+bGVuKTsKLQkJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgMiksICZsZW4sIDIpOwotCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIHByeGItPnNyYywgRVRIX0FMRU4pOwotCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIHByeGItPmRzdCwgRVRIX0FMRU4pOwotCQkJfQotCi0JCS8qIEluZGljYXQgdGhlIHBhY2tldHMgdG8gdXBwZXIgbGF5ZXIgKi8KLQkJCWlmIChzdWJfc2tiKSB7Ci0JCQkJc3ViX3NrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhzdWJfc2tiLCBpZWVlLT5kZXYpOwotCQkJCW1lbXNldChzdWJfc2tiLT5jYiwgMCwgc2l6ZW9mKHN1Yl9za2ItPmNiKSk7Ci0JCQkJc3ViX3NrYi0+ZGV2ID0gaWVlZS0+ZGV2OwotCQkJCXN1Yl9za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7IC8qIDgwMi4xMSBjcmMgbm90IHN1ZmZpY2llbnQgKi8KLQkJCQlpZWVlLT5sYXN0X3J4X3BzX3RpbWUgPSBqaWZmaWVzOwotCQkJCW5ldGlmX3J4KHN1Yl9za2IpOwotCQkJfQotCQl9Ci0JCWtmcmVlKHByeGIpOwotCQlwcnhiID0gTlVMTDsKLQl9Ci19Ci0KLQotdm9pZCBSeFJlb3JkZXJJbmRpY2F0ZVBhY2tldCggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCXN0cnVjdCBpZWVlODAyMTFfcnhiKiBwcnhiLAotCQlQUlhfVFNfUkVDT1JECQlwVFMsCi0JCXUxNgkJCVNlcU51bSkKLXsKLQlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOwotCVBSWF9SRU9SREVSX0VOVFJZIAlwUmVvcmRlckVudHJ5ID0gTlVMTDsKLQlzdHJ1Y3QgaWVlZTgwMjExX3J4YiogcHJ4YkluZGljYXRlQXJyYXlbUkVPUkRFUl9XSU5fU0laRV07Ci0JdTgJCQlXaW5TaXplID0gcEhUSW5mby0+UnhSZW9yZGVyV2luU2l6ZTsKLQl1MTYJCQlXaW5FbmQgPSAocFRTLT5SeEluZGljYXRlU2VxICsgV2luU2l6ZSAtMSklNDA5NjsKLQl1OAkJCWluZGV4ID0gMDsKLQlib29sCQkJYk1hdGNoV2luU3RhcnQgPSBmYWxzZSwgYlBrdEluQnVmID0gZmFsc2U7Ci0JSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCIlcygpOiBTZXEgaXMgJWQscFRTLT5SeEluZGljYXRlU2VxIGlzICVkLCBXaW5TaXplIGlzICVkXG4iLF9fRlVOQ1RJT05fXyxTZXFOdW0scFRTLT5SeEluZGljYXRlU2VxLFdpblNpemUpOwotCi0JLyogUnggUmVvcmRlciBpbml0aWFsaXplIGNvbmRpdGlvbi4qLwotCWlmKHBUUy0+UnhJbmRpY2F0ZVNlcSA9PSAweGZmZmYpIHsKLQkJcFRTLT5SeEluZGljYXRlU2VxID0gU2VxTnVtOwotCX0KLQotCS8qIERyb3Agb3V0IHRoZSBwYWNrZXQgd2hpY2ggU2VxTnVtIGlzIHNtYWxsZXIgdGhhbiBXaW5TdGFydCAqLwotCWlmKFNOX0xFU1MoU2VxTnVtLCBwVFMtPlJ4SW5kaWNhdGVTZXEpKSB7Ci0JCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwiUGFja2V0IERyb3AhIEluZGljYXRlU2VxOiAlZCwgTmV3U2VxOiAlZFxuIiwKLQkJCQkgcFRTLT5SeEluZGljYXRlU2VxLCBTZXFOdW0pOwotCQlwSFRJbmZvLT5SeFJlb3JkZXJEcm9wQ291bnRlcisrOwotCQl7Ci0JCQlpbnQgaTsKLQkJCWZvcihpID0wOyBpIDwgcHJ4Yi0+bnJfc3ViZnJhbWVzOyBpKyspIHsKLQkJCQlkZXZfa2ZyZWVfc2tiKHByeGItPnN1YmZyYW1lc1tpXSk7Ci0JCQl9Ci0JCQlrZnJlZShwcnhiKTsKLQkJCXByeGIgPSBOVUxMOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqIFNsaWRpbmcgd2luZG93IG1hbmlwdWxhdGlvbi4gQ29uZGl0aW9ucyBpbmNsdWRlczoKLQkgKiAxLiBJbmNvbWluZyBTZXFOdW0gaXMgZXF1YWwgdG8gV2luU3RhcnQgPT5XaW5kb3cgc2hpZnQgMQotCSAqIDIuIEluY29taW5nIFNlcU51bSBpcyBsYXJnZXIgdGhhbiB0aGUgV2luRW5kID0+IFdpbmRvdyBzaGlmdCBOCi0JICovCi0JaWYoU05fRVFVQUwoU2VxTnVtLCBwVFMtPlJ4SW5kaWNhdGVTZXEpKSB7Ci0JCXBUUy0+UnhJbmRpY2F0ZVNlcSA9IChwVFMtPlJ4SW5kaWNhdGVTZXEgKyAxKSAlIDQwOTY7Ci0JCWJNYXRjaFdpblN0YXJ0ID0gdHJ1ZTsKLQl9IGVsc2UgaWYoU05fTEVTUyhXaW5FbmQsIFNlcU51bSkpIHsKLQkJaWYoU2VxTnVtID49IChXaW5TaXplIC0gMSkpIHsKLQkJCXBUUy0+UnhJbmRpY2F0ZVNlcSA9IFNlcU51bSArIDEgLVdpblNpemU7Ci0JCX0gZWxzZSB7Ci0JCQlwVFMtPlJ4SW5kaWNhdGVTZXEgPSA0MDk1IC0gKFdpblNpemUgLSAoU2VxTnVtICsxKSkgKyAxOwotCQl9Ci0JCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwgIldpbmRvdyBTaGlmdCEgSW5kaWNhdGVTZXE6ICVkLCBOZXdTZXE6ICVkXG4iLHBUUy0+UnhJbmRpY2F0ZVNlcSwgU2VxTnVtKTsKLQl9Ci0KLQkvKgotCSAqIEluZGljYXRpb24gcHJvY2Vzcy4KLQkgKiBBZnRlciBQYWNrZXQgZHJvcHBpbmcgYW5kIFNsaWRpbmcgV2luZG93IHNoaWZ0aW5nIGFzIGFib3ZlLCB3ZSBjYW4gbm93IGp1c3QgaW5kaWNhdGUgdGhlIHBhY2tldHMKLQkgKiB3aXRoIHRoZSBTZXFOdW0gc21hbGxlciB0aGFuIGxhdGVzdCBXaW5TdGFydCBhbmQgYnVmZmVyIG90aGVyIHBhY2tldHMuCi0JICovCi0JLyogRm9yIFJ4IFJlb3JkZXIgY29uZGl0aW9uOgotCSAqIDEuIEFsbCBwYWNrZXRzIHdpdGggU2VxTnVtIHNtYWxsZXIgdGhhbiBXaW5TdGFydCA9PiBJbmRpY2F0ZQotCSAqIDIuIEFsbCBwYWNrZXRzIHdpdGggU2VxTnVtIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIFdpblN0YXJ0ID0+IEJ1ZmZlciBpdC4KLQkgKi8KLQlpZihiTWF0Y2hXaW5TdGFydCkgewotCQkvKiBDdXJyZW50IHBhY2tldCBpcyBnb2luZyB0byBiZSBpbmRpY2F0ZWQuKi8KLQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCAiUGFja2V0cyBpbmRpY2F0aW9uISEgSW5kaWNhdGVTZXE6ICVkLCBOZXdTZXE6ICVkXG4iLFwKLQkJCQlwVFMtPlJ4SW5kaWNhdGVTZXEsIFNlcU51bSk7Ci0JCXByeGJJbmRpY2F0ZUFycmF5WzBdID0gcHJ4YjsKLQkJaW5kZXggPSAxOwotCX0gZWxzZSB7Ci0JCS8qIEN1cnJlbnQgcGFja2V0IGlzIGdvaW5nIHRvIGJlIGluc2VydGVkIGludG8gcGVuZGluZyBsaXN0LiovCi0JCWlmKCFsaXN0X2VtcHR5KCZpZWVlLT5SeFJlb3JkZXJfVW51c2VkX0xpc3QpKSB7Ci0JCQlwUmVvcmRlckVudHJ5ID0gKFBSWF9SRU9SREVSX0VOVFJZKWxpc3RfZW50cnkoaWVlZS0+UnhSZW9yZGVyX1VudXNlZF9MaXN0Lm5leHQsUlhfUkVPUkRFUl9FTlRSWSxMaXN0KTsKLQkJCWxpc3RfZGVsX2luaXQoJnBSZW9yZGVyRW50cnktPkxpc3QpOwotCi0JCQkvKiBNYWtlIGEgcmVvcmRlciBlbnRyeSBhbmQgaW5zZXJ0IGludG8gYSB0aGUgcGFja2V0IGxpc3QuKi8KLQkJCXBSZW9yZGVyRW50cnktPlNlcU51bSA9IFNlcU51bTsKLQkJCXBSZW9yZGVyRW50cnktPnByeGIgPSBwcnhiOwotCi0JCQlpZighQWRkUmVvcmRlckVudHJ5KHBUUywgcFJlb3JkZXJFbnRyeSkpIHsKLQkJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1JFT1JERVIsICIlcygpOiBEdXBsaWNhdGUgcGFja2V0IGlzIGRyb3BwZWQhISBJbmRpY2F0ZVNlcTogJWQsIE5ld1NlcTogJWRcbiIsCi0JCQkJCV9fRlVOQ1RJT05fXywgcFRTLT5SeEluZGljYXRlU2VxLCBTZXFOdW0pOwotCQkJCWxpc3RfYWRkX3RhaWwoJnBSZW9yZGVyRW50cnktPkxpc3QsJmllZWUtPlJ4UmVvcmRlcl9VbnVzZWRfTGlzdCk7Ci0JCQkJewotCQkJCQlpbnQgaTsKLQkJCQkJZm9yKGkgPTA7IGkgPCBwcnhiLT5ucl9zdWJmcmFtZXM7IGkrKykgewotCQkJCQkJZGV2X2tmcmVlX3NrYihwcnhiLT5zdWJmcmFtZXNbaV0pOwotCQkJCQl9Ci0JCQkJCWtmcmVlKHByeGIpOwotCQkJCQlwcnhiID0gTlVMTDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwKLQkJCQkJICJQa3QgaW5zZXJ0IGludG8gYnVmZmVyISEgSW5kaWNhdGVTZXE6ICVkLCBOZXdTZXE6ICVkXG4iLHBUUy0+UnhJbmRpY2F0ZVNlcSwgU2VxTnVtKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8qCi0JCQkgKiBQYWNrZXRzIGFyZSBkcm9wcGVkIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggcmVvcmRlciBlbnRyaWVzLgotCQkJICogVGhpcyBwYXJ0IHNoYWxsIGJlIG1vZGlmaWVkISEgV2UgY2FuIGp1c3QgaW5kaWNhdGUgYWxsIHRoZQotCQkJICogcGFja2V0cyBpbiBidWZmZXIgYW5kIGdldCByZW9yZGVyIGVudHJpZXMuCi0JCQkgKi8KLQkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiUnhSZW9yZGVySW5kaWNhdGVQYWNrZXQoKTogVGhlcmUgaXMgbm8gcmVvcmRlciBlbnRyeSEhIFBhY2tldCBpcyBkcm9wcGVkISFcbiIpOwotCQkJewotCQkJCWludCBpOwotCQkJCWZvcihpID0wOyBpIDwgcHJ4Yi0+bnJfc3ViZnJhbWVzOyBpKyspIHsKLQkJCQkJZGV2X2tmcmVlX3NrYihwcnhiLT5zdWJmcmFtZXNbaV0pOwotCQkJCX0KLQkJCQlrZnJlZShwcnhiKTsKLQkJCQlwcnhiID0gTlVMTDsKLQkJCX0KLQkJfQotCX0KLQotCS8qIENoZWNrIGlmIHRoZXJlIGlzIGFueSBwYWNrZXQgbmVlZCBpbmRpY2F0ZS4qLwotCXdoaWxlKCFsaXN0X2VtcHR5KCZwVFMtPlJ4UGVuZGluZ1BrdExpc3QpKSB7Ci0JCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwiJXMoKTogc3RhcnQgUlJFT1JERVIgaW5kaWNhdGVcbiIsX19GVU5DVElPTl9fKTsKLSNpZiAxCi0JCXBSZW9yZGVyRW50cnkgPSAoUFJYX1JFT1JERVJfRU5UUlkpbGlzdF9lbnRyeShwVFMtPlJ4UGVuZGluZ1BrdExpc3QucHJldixSWF9SRU9SREVSX0VOVFJZLExpc3QpOwotCQlpZiggU05fTEVTUyhwUmVvcmRlckVudHJ5LT5TZXFOdW0sIHBUUy0+UnhJbmRpY2F0ZVNlcSkgfHwKLQkJCQlTTl9FUVVBTChwUmVvcmRlckVudHJ5LT5TZXFOdW0sIHBUUy0+UnhJbmRpY2F0ZVNlcSkpCi0JCXsKLQkJCS8qIFRoaXMgcHJvdGVjdCBidWZmZXIgZnJvbSBvdmVyZmxvdy4gKi8KLQkJCWlmKGluZGV4ID49IFJFT1JERVJfV0lOX1NJWkUpIHsKLQkJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIlJ4UmVvcmRlckluZGljYXRlUGFja2V0KCk6IEJ1ZmZlciBvdmVyZmxvdyEhIFxuIik7Ci0JCQkJYlBrdEluQnVmID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJbGlzdF9kZWxfaW5pdCgmcFJlb3JkZXJFbnRyeS0+TGlzdCk7Ci0KLQkJCWlmKFNOX0VRVUFMKHBSZW9yZGVyRW50cnktPlNlcU51bSwgcFRTLT5SeEluZGljYXRlU2VxKSkKLQkJCQlwVFMtPlJ4SW5kaWNhdGVTZXEgPSAocFRTLT5SeEluZGljYXRlU2VxICsgMSkgJSA0MDk2OwotCi0JCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1JFT1JERVIsIlBhY2tldHMgaW5kaWNhdGlvbiEhIEluZGljYXRlU2VxOiAlZCwgTmV3U2VxOiAlZFxuIixwVFMtPlJ4SW5kaWNhdGVTZXEsIFNlcU51bSk7Ci0JCQlwcnhiSW5kaWNhdGVBcnJheVtpbmRleF0gPSBwUmVvcmRlckVudHJ5LT5wcnhiOwotCQkJaW5kZXgrKzsKLQotCQkJbGlzdF9hZGRfdGFpbCgmcFJlb3JkZXJFbnRyeS0+TGlzdCwmaWVlZS0+UnhSZW9yZGVyX1VudXNlZF9MaXN0KTsKLQkJfSBlbHNlIHsKLQkJCWJQa3RJbkJ1ZiA9IHRydWU7Ci0JCQlicmVhazsKLQkJfQotI2VuZGlmCi0JfQotCi0JLyogSGFuZGxpbmcgcGVuZGluZyB0aW1lci4gU2V0IHRoaXMgdGltZXIgdG8gcHJldmVudCBmcm9tIGxvbmcgdGltZSBSeCBidWZmZXJpbmcuKi8KLQlpZihpbmRleD4wKSB7Ci0JCS8vIENhbmNlbCBwcmV2aW91cyBwZW5kaW5nIHRpbWVyLgotCQlpZiAodGltZXJfcGVuZGluZygmcFRTLT5SeFBrdFBlbmRpbmdUaW1lcikpCi0JCQlkZWxfdGltZXJfc3luYygmcFRTLT5SeFBrdFBlbmRpbmdUaW1lcik7Ci0JCXBUUy0+UnhUaW1lb3V0SW5kaWNhdGVTZXEgPSAweGZmZmY7Ci0KLQkJLy8gSW5kaWNhdGUgcGFja2V0cwotCQlpZihpbmRleD5SRU9SREVSX1dJTl9TSVpFKXsKLQkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiUnhSZW9yZGVySW5kaWNhdGVQYWNrZXQoKTogUnggUmVvcmVyIGJ1ZmZlciBmdWxsISEgXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZWVlODAyMTFfaW5kaWNhdGVfcGFja2V0cyhpZWVlLCBwcnhiSW5kaWNhdGVBcnJheSwgaW5kZXgpOwotCQliUGt0SW5CdWYgPSBmYWxzZTsKLQl9Ci0KLQlpZihiUGt0SW5CdWYgJiYgcFRTLT5SeFRpbWVvdXRJbmRpY2F0ZVNlcT09MHhmZmZmKSB7Ci0JCS8vIFNldCBuZXcgcGVuZGluZyB0aW1lci4KLQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCIlcygpOiBTRVQgcnggdGltZW91dCB0aW1lclxuIiwgX19GVU5DVElPTl9fKTsKLQkJcFRTLT5SeFRpbWVvdXRJbmRpY2F0ZVNlcSA9IHBUUy0+UnhJbmRpY2F0ZVNlcTsKLQotCQltb2RfdGltZXIoJnBUUy0+UnhQa3RQZW5kaW5nVGltZXIsICBqaWZmaWVzICsgTVNFQ1MocEhUSW5mby0+UnhSZW9yZGVyUGVuZGluZ1RpbWUpKTsKLQl9Ci19Ci0KLXU4IHBhcnNlX3N1YmZyYW1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cywKLQkJICBzdHJ1Y3QgaWVlZTgwMjExX3J4YiAqcnhiLHU4KiBzcmMsdTgqIGRzdCkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciogKXNrYi0+ZGF0YTsKLQl1MTYJCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOwotCi0JdTE2CQlMTENPZmZzZXQ9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcik7Ci0JdTE2CQlDaGtMZW5ndGg7Ci0JYm9vbAkJYklzQWdncmVnYXRlRnJhbWUgPSBmYWxzZTsKLQl1MTYJCW5TdWJmcmFtZV9MZW5ndGg7Ci0JdTgJCW5QYWRkaW5nX0xlbmd0aCA9IDA7Ci0JdTE2CQlTZXFOdW09MDsKLQotCXN0cnVjdCBza19idWZmICpzdWJfc2tiOwotCXU4ICAgICAgICAgICAgICpkYXRhX3B0cjsKLQkvKiBqdXN0IGZvciBkZWJ1ZyBwdXJwb3NlICovCi0JU2VxTnVtID0gV0xBTl9HRVRfU0VRX1NFUShsZTE2X3RvX2NwdShoZHItPnNlcV9jdGwpKTsKLQotCWlmKChJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKSYmXAotCQkJKCgoZnJhbWVxb3MgKikoc2tiLT5kYXRhICsgSUVFRTgwMjExXzNBRERSX0xFTikpLT5maWVsZC5yZXNlcnZlZCkpIHsKLQkJYklzQWdncmVnYXRlRnJhbWUgPSB0cnVlOwotCX0KLQotCWlmKElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpIHsKLQkJTExDT2Zmc2V0ICs9IDI7Ci0JfQotCi0JaWYocnhfc3RhdHMtPmJDb250YWluSFRDKSB7Ci0JCUxMQ09mZnNldCArPSBzSFRDTG5nOwotCX0KLQkvLyBOdWxsIHBhY2tldCwgZG9uJ3QgaW5kaWNhdGUgaXQgdG8gdXBwZXIgbGF5ZXIKLQlDaGtMZW5ndGggPSBMTENPZmZzZXQ7LyogKyAoRnJhbWVfV0VQKGZyYW1lKSE9MCA/QWRhcHRlci0+TWdudEluZm8uU2VjdXJpdHlJbmZvLkVuY3J5cHRpb25IZWFkT3ZlcmhlYWQ6MCk7Ki8KLQotCWlmKCBza2ItPmxlbiA8PSBDaGtMZW5ndGggKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXNrYl9wdWxsKHNrYiwgTExDT2Zmc2V0KTsKLQlpZWVlLT5iSXNBZ2dyZWdhdGVGcmFtZSA9IGJJc0FnZ3JlZ2F0ZUZyYW1lOy8vYWRkZWQgYnkgYW15IGZvciBMZWlzdXJlIFBTCi0KLQlpZighYklzQWdncmVnYXRlRnJhbWUpIHsKLQkJcnhiLT5ucl9zdWJmcmFtZXMgPSAxOwotI2lmZGVmIEpPSE5fTk9DUFkKLQkJcnhiLT5zdWJmcmFtZXNbMF0gPSBza2I7Ci0jZWxzZQotCQlyeGItPnN1YmZyYW1lc1swXSA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7Ci0jZW5kaWYKLQotCQltZW1jcHkocnhiLT5zcmMsc3JjLEVUSF9BTEVOKTsKLQkJbWVtY3B5KHJ4Yi0+ZHN0LGRzdCxFVEhfQUxFTik7Ci0JCS8vSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX1JYLHNrYi0+ZGF0YSxza2ItPmxlbik7Ci0JCXJldHVybiAxOwotCX0gZWxzZSB7Ci0JCXJ4Yi0+bnJfc3ViZnJhbWVzID0gMDsKLQkJbWVtY3B5KHJ4Yi0+c3JjLHNyYyxFVEhfQUxFTik7Ci0JCW1lbWNweShyeGItPmRzdCxkc3QsRVRIX0FMRU4pOwotCQl3aGlsZShza2ItPmxlbiA+IEVUSEVSTkVUX0hFQURFUl9TSVpFKSB7Ci0JCQkvKiBPZmZzZXQgMTIgZGVub3RlIDIgbWFjIGFkZHJlc3MgKi8KLQkJCW5TdWJmcmFtZV9MZW5ndGggPSAqKCh1MTYqKShza2ItPmRhdGEgKyAxMikpOwotCQkJLy89PW09PT5jaGFuZ2UgdGhlIGxlbmd0aCBvcmRlcgotCQkJblN1YmZyYW1lX0xlbmd0aCA9IChuU3ViZnJhbWVfTGVuZ3RoPj44KSArIChuU3ViZnJhbWVfTGVuZ3RoPDw4KTsKLQotCQkJaWYoc2tiLT5sZW48KEVUSEVSTkVUX0hFQURFUl9TSVpFICsgblN1YmZyYW1lX0xlbmd0aCkpIHsKLQkJCQlwcmludGsoIiVzOiBBLU1TRFUgcGFyc2UgZXJyb3IhISBwUmZkLT5uVG90YWxTdWJmcmFtZSA6ICVkXG4iLFwKLQkJCQkJCV9fRlVOQ1RJT05fXyxyeGItPm5yX3N1YmZyYW1lcyk7Ci0JCQkJcHJpbnRrKCIlczogQS1NU0RVIHBhcnNlIGVycm9yISEgU3ViZnJhbWUgTGVuZ3RoOiAlZFxuIixfX0ZVTkNUSU9OX18sIG5TdWJmcmFtZV9MZW5ndGgpOwotCQkJCXByaW50aygiblJlbWFpbl9MZW5ndGggaXMgJWQgYW5kIG5TdWJmcmFtZV9MZW5ndGggaXMgOiAlZFxuIixza2ItPmxlbixuU3ViZnJhbWVfTGVuZ3RoKTsKLQkJCQlwcmludGsoIlRoZSBQYWNrZXQgU2VxTnVtIGlzICVkXG4iLFNlcU51bSk7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0KLQkJCS8qIG1vdmUgdGhlIGRhdGEgcG9pbnQgdG8gZGF0YSBjb250ZW50ICovCi0JCQlza2JfcHVsbChza2IsIEVUSEVSTkVUX0hFQURFUl9TSVpFKTsKLQotI2lmZGVmIEpPSE5fTk9DUFkKLQkJCXN1Yl9za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKLQkJCXN1Yl9za2ItPmxlbiA9IG5TdWJmcmFtZV9MZW5ndGg7Ci0JCQlzdWJfc2tiLT50YWlsID0gc3ViX3NrYi0+ZGF0YSArIG5TdWJmcmFtZV9MZW5ndGg7Ci0jZWxzZQotCQkJLyogQWxsb2NhdGUgbmV3IHNrYiBmb3IgcmVsZWFzaW5nIHRvIHVwcGVyIGxheWVyICovCi0JCQlzdWJfc2tiID0gZGV2X2FsbG9jX3NrYihuU3ViZnJhbWVfTGVuZ3RoICsgMTIpOwotCQkJc2tiX3Jlc2VydmUoc3ViX3NrYiwgMTIpOwotCQkJZGF0YV9wdHIgPSAodTggKilza2JfcHV0KHN1Yl9za2IsIG5TdWJmcmFtZV9MZW5ndGgpOwotCQkJbWVtY3B5KGRhdGFfcHRyLHNrYi0+ZGF0YSxuU3ViZnJhbWVfTGVuZ3RoKTsKLSNlbmRpZgotCQkJcnhiLT5zdWJmcmFtZXNbcnhiLT5ucl9zdWJmcmFtZXMrK10gPSBzdWJfc2tiOwotCQkJaWYocnhiLT5ucl9zdWJmcmFtZXMgPj0gTUFYX1NVQkZSQU1FX0NPVU5UKSB7Ci0JCQkJSUVFRTgwMjExX0RFQlVHX1JYKCJQYXJzZVN1YmZyYW1lKCk6IFRvbyBtYW55IFN1YmZyYW1lcyEgUGFja2V0cyBkcm9wcGVkIVxuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlza2JfcHVsbChza2IsblN1YmZyYW1lX0xlbmd0aCk7Ci0KLQkJCWlmKHNrYi0+bGVuICE9IDApIHsKLQkJCQluUGFkZGluZ19MZW5ndGggPSA0IC0gKChuU3ViZnJhbWVfTGVuZ3RoICsgRVRIRVJORVRfSEVBREVSX1NJWkUpICUgNCk7Ci0JCQkJaWYoblBhZGRpbmdfTGVuZ3RoID09IDQpIHsKLQkJCQkJblBhZGRpbmdfTGVuZ3RoID0gMDsKLQkJCQl9Ci0KLQkJCQlpZihza2ItPmxlbiA8IG5QYWRkaW5nX0xlbmd0aCkgewotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0KLQkJCQlza2JfcHVsbChza2IsblBhZGRpbmdfTGVuZ3RoKTsKLQkJCX0KLQkJfQotI2lmZGVmIEpPSE5fTk9DUFkKLQkJZGV2X2tmcmVlX3NrYihza2IpOwotI2VuZGlmCi0JCXJldHVybiByeGItPm5yX3N1YmZyYW1lczsKLQl9Ci19Ci0KLS8qIEFsbCByZWNlaXZlZCBmcmFtZXMgYXJlIHNlbnQgdG8gdGhpcyBmdW5jdGlvbi4gQHNrYiBjb250YWlucyB0aGUgZnJhbWUgaW4KLSAqIElFRUUgODAyLjExIGZvcm1hdCwgaS5lLiwgaW4gdGhlIGZvcm1hdCBpdCB3YXMgc2VudCBvdmVyIGFpci4KLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpLiAqLwotaW50IGllZWU4MDIxMV9ydGxfcngoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCi0JCSBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cykKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHI7Ci0KLQlzaXplX3QgaGRybGVuOwotCXUxNiBmYywgdHlwZSwgc3R5cGUsIHNjOwotCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0czsKLQl1bnNpZ25lZCBpbnQgZnJhZzsKLQl1OCAqcGF5bG9hZDsKLQl1MTYgZXRoZXJ0eXBlOwotCS8vYWRkZWQgYnkgYW15IGZvciByZW9yZGVyCi0JdTgJVElEID0gMDsKLQl1MTYJU2VxTnVtID0gMDsKLQlQUlhfVFNfUkVDT1JEIHBUUyA9IE5VTEw7Ci0JYm9vbCB1bmljYXN0X3BhY2tldCA9IGZhbHNlOwotCS8vYWRkZWQgYnkgYW15IGZvciByZW9yZGVyCi0jaWZkZWYgTk9UX1lFVAotCXN0cnVjdCBuZXRfZGV2aWNlICp3ZHMgPSBOVUxMOwotCXN0cnVjdCBza19idWZmICpza2IyID0gTlVMTDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqd2RzID0gTlVMTDsKLQlpbnQgZnJhbWVfYXV0aG9yaXplZCA9IDA7Ci0JaW50IGZyb21fYXNzb2NfYXAgPSAwOwotCXZvaWQgKnN0YSA9IE5VTEw7Ci0jZW5kaWYKLQl1OCBkc3RbRVRIX0FMRU5dOwotCXU4IHNyY1tFVEhfQUxFTl07Ci0JdTggYnNzaWRbRVRIX0FMRU5dOwotCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqY3J5cHQgPSBOVUxMOwotCWludCBrZXlpZHggPSAwOwotCi0JaW50IGk7Ci0Jc3RydWN0IGllZWU4MDIxMV9yeGIqIHJ4YiA9IE5VTEw7Ci0JLy8gY2hlYXQgdGhlIHRoZSBoZHIgdHlwZQotCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKXNrYi0+ZGF0YTsKLQlzdGF0cyA9ICZpZWVlLT5zdGF0czsKLQotCWlmIChza2ItPmxlbiA8IDEwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBTS0IgbGVuZ3RoIDwgMTBcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUpOwotCQlnb3RvIHJ4X2Ryb3BwZWQ7Ci0JfQotCi0JZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7Ci0JdHlwZSA9IFdMQU5fRkNfR0VUX1RZUEUoZmMpOwotCXN0eXBlID0gV0xBTl9GQ19HRVRfU1RZUEUoZmMpOwotCXNjID0gbGUxNl90b19jcHUoaGRyLT5zZXFfY3RsKTsKLQotCWZyYWcgPSBXTEFOX0dFVF9TRVFfRlJBRyhzYyk7Ci0JaGRybGVuID0gaWVlZTgwMjExX2dldF9oZHJsZW4oZmMpOwotCi0JaWYoSFRDQ2hlY2soaWVlZSwgc2tiLT5kYXRhKSkKLQl7Ci0JCWlmKG5ldF9yYXRlbGltaXQoKSkKLQkJcHJpbnRrKCJmaW5kIEhUQ0NvbnRyb2xcbiIpOwotCQloZHJsZW4gKz0gNDsKLQkJcnhfc3RhdHMtPmJDb250YWluSFRDID0gMTsKLQl9Ci0KLSNpZmRlZiBOT1RfWUVUCi0jaWYgV0lSRUxFU1NfRVhUID4gMTUKLQkvKiBQdXQgdGhpcyBjb2RlIGhlcmUgc28gdGhhdCB3ZSBhdm9pZCBkdXBsaWNhdGluZyBpdCBpbiBhbGwKLQkgKiBSeCBwYXRocy4gLSBKZWFuIElJICovCi0jaWZkZWYgSVdfV0lSRUxFU1NfU1BZCQkvKiBkZWZpbmVkIGluIGl3X2hhbmRsZXIuaCAqLwotCS8qIElmIHNweSBtb25pdG9yaW5nIG9uICovCi0JaWYgKGlmYWNlLT5zcHlfZGF0YS5zcHlfbnVtYmVyID4gMCkgewotCQlzdHJ1Y3QgaXdfcXVhbGl0eSB3c3RhdHM7Ci0JCXdzdGF0cy5sZXZlbCA9IHJ4X3N0YXRzLT5yc3NpOwotCQl3c3RhdHMubm9pc2UgPSByeF9zdGF0cy0+bm9pc2U7Ci0JCXdzdGF0cy51cGRhdGVkID0gNjsJLyogTm8gcXVhbCB2YWx1ZSAqLwotCQkvKiBVcGRhdGUgc3B5IHJlY29yZHMgKi8KLQkJd2lyZWxlc3Nfc3B5X3VwZGF0ZShkZXYsIGhkci0+YWRkcjIsICZ3c3RhdHMpOwotCX0KLSNlbmRpZiAvKiBJV19XSVJFTEVTU19TUFkgKi8KLSNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxNSAqLwotCWhvc3RhcF91cGRhdGVfcnhfc3RhdHMobG9jYWwtPmFwLCBoZHIsIHJ4X3N0YXRzKTsKLSNlbmRpZgotCi0jaWYgV0lSRUxFU1NfRVhUID4gMTUKLQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpIHsKLQkJaWVlZTgwMjExX21vbml0b3JfcngoaWVlZSwgc2tiLCByeF9zdGF0cyk7Ci0JCXN0YXRzLT5yeF9wYWNrZXRzKys7Ci0JCXN0YXRzLT5yeF9ieXRlcyArPSBza2ItPmxlbjsKLQkJcmV0dXJuIDE7Ci0JfQotI2VuZGlmCi0JaWYgKGllZWUtPmhvc3RfZGVjcnlwdCkgewotCQlpbnQgaWR4ID0gMDsKLQkJaWYgKHNrYi0+bGVuID49IGhkcmxlbiArIDMpCi0JCQlpZHggPSBza2ItPmRhdGFbaGRybGVuICsgM10gPj4gNjsKLQkJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZHhdOwotI2lmZGVmIE5PVF9ZRVQKLQkJc3RhID0gTlVMTDsKLQotCQkvKiBVc2Ugc3RhdGlvbiBzcGVjaWZpYyBrZXkgdG8gb3ZlcnJpZGUgZGVmYXVsdCBrZXlzIGlmIHRoZQotCQkgKiByZWNlaXZlciBhZGRyZXNzIGlzIGEgdW5pY2FzdCBhZGRyZXNzICgiaW5kaXZpZHVhbCBSQSIpLiBJZgotCQkgKiBiY3J4X3N0YV9rZXkgcGFyYW1ldGVyIGlzIHNldCwgc3RhdGlvbiBzcGVjaWZpYyBrZXkgaXMgdXNlZAotCQkgKiBldmVuIHdpdGggYnJvYWQvbXVsdGljYXN0IHRhcmdldHMgKHRoaXMgaXMgYWdhaW5zdCBJRUVFCi0JCSAqIDgwMi4xMSwgYnV0IG1ha2VzIGl0IGVhc2llciB0byB1c2UgZGlmZmVyZW50IGtleXMgd2l0aAotCQkgKiBzdGF0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IFdFUCBrZXkgbWFwcGluZykuICovCi0KLQkJaWYgKCEoaGRyLT5hZGRyMVswXSAmIDB4MDEpIHx8IGxvY2FsLT5iY3J4X3N0YV9rZXkpCi0JCQkodm9pZCkgaG9zdGFwX2hhbmRsZV9zdGFfY3J5cHRvKGxvY2FsLCBoZHIsICZjcnlwdCwKLQkJCQkJCQkmc3RhKTsKLSNlbmRpZgotCi0JCS8qIGFsbG93IE5VTEwgZGVjcnlwdCB0byBpbmRpY2F0ZSBhbiBzdGF0aW9uIHNwZWNpZmljIG92ZXJyaWRlCi0JCSAqIGZvciBkZWZhdWx0IGVuY3J5cHRpb24gKi8KLQkJaWYgKGNyeXB0ICYmIChjcnlwdC0+b3BzID09IE5VTEwgfHwKLQkJCSAgICAgIGNyeXB0LT5vcHMtPmRlY3J5cHRfbXBkdSA9PSBOVUxMKSkKLQkJCWNyeXB0ID0gTlVMTDsKLQotCQlpZiAoIWNyeXB0ICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1dFUCkpIHsKLQkJCS8qIFRoaXMgc2VlbXMgdG8gYmUgdHJpZ2dlcmVkIGJ5IHNvbWUgKG11bHRpY2FzdD8pCi0JCQkgKiBmcmFtZXMgZnJvbSBvdGhlciB0aGFuIGN1cnJlbnQgQlNTLCBzbyBqdXN0IGRyb3AgdGhlCi0JCQkgKiBmcmFtZXMgc2lsZW50bHkgaW5zdGVhZCBvZiBmaWxsaW5nIHN5c3RlbSBsb2cgd2l0aAotCQkJICogdGhlc2UgcmVwb3J0cy4gKi8KLQkJCUlFRUU4MDIxMV9ERUJVR19EUk9QKCJEZWNyeXB0aW9uIGZhaWxlZCAobm90IHNldCkiCi0JCQkJCSAgICAgIiAoU0E9JXBNKVxuIiwKLQkJCQkJICAgICBoZHItPmFkZHIyKTsKLQkJCWllZWUtPmllZWVfc3RhdHMucnhfZGlzY2FyZHNfdW5kZWNyeXB0YWJsZSsrOwotCQkJZ290byByeF9kcm9wcGVkOwotCQl9Ci0JfQotCi0JaWYgKHNrYi0+bGVuIDwgSUVFRTgwMjExX0RBVEFfSERSM19MRU4pCi0JCWdvdG8gcnhfZHJvcHBlZDsKLQotCS8vIGlmIFFvUyBlbmFibGVkLCBzaG91bGQgY2hlY2sgdGhlIHNlcXVlbmNlIGZvciBlYWNoIG9mIHRoZSBBQwotCWlmKCAoaWVlZS0+cEhUSW5mby0+YkN1clJ4UmVvcmRlckVuYWJsZSA9PSBmYWxzZSkgfHwgIWllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmV8fCAhSXNEYXRhRnJhbWUoc2tiLT5kYXRhKSB8fCBJc0xlZ2FjeURhdGFGcmFtZShza2ItPmRhdGEpKXsKLQkJaWYgKGlzX2R1cGxpY2F0ZV9wYWNrZXQoaWVlZSwgaGRyKSkKLQkJZ290byByeF9kcm9wcGVkOwotCi0JfQotCWVsc2UKLQl7Ci0JCVBSWF9UU19SRUNPUkQgcFJ4VFMgPSBOVUxMOwotCi0JCWlmKEdldFRzKAotCQkJCWllZWUsCi0JCQkJKFBUU19DT01NT05fSU5GTyopICZwUnhUUywKLQkJCQloZHItPmFkZHIyLAotCQkJCSh1OClGcmFtZV9Rb1NUSUQoKHU4Kikoc2tiLT5kYXRhKSksCi0JCQkJUlhfRElSLAotCQkJCXRydWUpKQotCQl7Ci0KLQkJCWlmKCAJKGZjICYgKDE8PDExKSkgICYmCi0JCQkJCShmcmFnID09IHBSeFRTLT5SeExhc3RGcmFnTnVtKSAmJgotCQkJCQkoV0xBTl9HRVRfU0VRX1NFUShzYykgPT0gcFJ4VFMtPlJ4TGFzdFNlcU51bSkJKQotCQkJewotCQkJCWdvdG8gcnhfZHJvcHBlZDsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwUnhUUy0+UnhMYXN0RnJhZ051bSA9IGZyYWc7Ci0JCQkJcFJ4VFMtPlJ4TGFzdFNlcU51bSA9IFdMQU5fR0VUX1NFUV9TRVEoc2MpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICIlcygpOiBObyBUUyEhIFNraXAgdGhlIGNoZWNrISFcbiIsX19GVU5DVElPTl9fKTsKLQkJCWdvdG8gcnhfZHJvcHBlZDsKLQkJfQotCX0KLQotCWlmICh0eXBlID09IElFRUU4MDIxMV9GVFlQRV9NR01UKSB7Ci0KLQkJaWYgKGllZWU4MDIxMV9yeF9mcmFtZV9tZ210KGllZWUsIHNrYiwgcnhfc3RhdHMsIHR5cGUsIHN0eXBlKSkKLQkJCWdvdG8gcnhfZHJvcHBlZDsKLQkJZWxzZQotCQkJZ290byByeF9leGl0OwotCX0KLQotCS8qIERhdGEgZnJhbWUgLSBleHRyYWN0IHNyYy9kc3QgYWRkcmVzc2VzICovCi0Jc3dpdGNoIChmYyAmIChJRUVFODAyMTFfRkNUTF9GUk9NRFMgfCBJRUVFODAyMTFfRkNUTF9UT0RTKSkgewotCWNhc2UgSUVFRTgwMjExX0ZDVExfRlJPTURTOgotCQltZW1jcHkoZHN0LCBoZHItPmFkZHIxLCBFVEhfQUxFTik7Ci0JCW1lbWNweShzcmMsIGhkci0+YWRkcjMsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KGJzc2lkLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0ZDVExfVE9EUzoKLQkJbWVtY3B5KGRzdCwgaGRyLT5hZGRyMywgRVRIX0FMRU4pOwotCQltZW1jcHkoc3JjLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7Ci0JCW1lbWNweShic3NpZCwgaGRyLT5hZGRyMSwgRVRIX0FMRU4pOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9GQ1RMX0ZST01EUyB8IElFRUU4MDIxMV9GQ1RMX1RPRFM6Ci0JCWlmIChza2ItPmxlbiA8IElFRUU4MDIxMV9EQVRBX0hEUjRfTEVOKQotCQkJZ290byByeF9kcm9wcGVkOwotCQltZW1jcHkoZHN0LCBoZHItPmFkZHIzLCBFVEhfQUxFTik7Ci0JCW1lbWNweShzcmMsIGhkci0+YWRkcjQsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KGJzc2lkLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKLQkJYnJlYWs7Ci0JY2FzZSAwOgotCQltZW1jcHkoZHN0LCBoZHItPmFkZHIxLCBFVEhfQUxFTik7Ci0JCW1lbWNweShzcmMsIGhkci0+YWRkcjIsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KGJzc2lkLCBoZHItPmFkZHIzLCBFVEhfQUxFTik7Ci0JCWJyZWFrOwotCX0KLQotI2lmZGVmIE5PVF9ZRVQKLQlpZiAoaG9zdGFwX3J4X2ZyYW1lX3dkcyhpZWVlLCBoZHIsIGZjLCAmd2RzKSkKLQkJZ290byByeF9kcm9wcGVkOwotCWlmICh3ZHMpIHsKLQkJc2tiLT5kZXYgPSBkZXYgPSB3ZHM7Ci0JCXN0YXRzID0gaG9zdGFwX2dldF9zdGF0cyhkZXYpOwotCX0KLQotCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSICYmICF3ZHMgJiYKLQkgICAgKGZjICYgKElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKSA9PSBJRUVFODAyMTFfRkNUTF9GUk9NRFMgJiYKLQkgICAgaWVlZS0+c3RhZGV2ICYmCi0JICAgIG1lbWNtcChoZHItPmFkZHIyLCBpZWVlLT5hc3NvY19hcF9hZGRyLCBFVEhfQUxFTikgPT0gMCkgewotCQkvKiBGcmFtZSBmcm9tIEJTU0lEIG9mIHRoZSBBUCBmb3Igd2hpY2ggd2UgYXJlIGEgY2xpZW50ICovCi0JCXNrYi0+ZGV2ID0gZGV2ID0gaWVlZS0+c3RhZGV2OwotCQlzdGF0cyA9IGhvc3RhcF9nZXRfc3RhdHMoZGV2KTsKLQkJZnJvbV9hc3NvY19hcCA9IDE7Ci0JfQotI2VuZGlmCi0KLQlkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwotCi0jaWZkZWYgTk9UX1lFVAotCWlmICgoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUiB8fAotCSAgICAgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX1JFUEVBVCkgJiYKLQkgICAgIWZyb21fYXNzb2NfYXApIHsKLQkJc3dpdGNoIChob3N0YXBfaGFuZGxlX3N0YV9yeChpZWVlLCBkZXYsIHNrYiwgcnhfc3RhdHMsCi0JCQkJCSAgICAgd2RzICE9IE5VTEwpKSB7Ci0JCWNhc2UgQVBfUlhfQ09OVElOVUVfTk9UX0FVVEhPUklaRUQ6Ci0JCQlmcmFtZV9hdXRob3JpemVkID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIEFQX1JYX0NPTlRJTlVFOgotCQkJZnJhbWVfYXV0aG9yaXplZCA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSBBUF9SWF9EUk9QOgotCQkJZ290byByeF9kcm9wcGVkOwotCQljYXNlIEFQX1JYX0VYSVQ6Ci0JCQlnb3RvIHJ4X2V4aXQ7Ci0JCX0KLQl9Ci0jZW5kaWYKLQkvKiBOdWxsZnVuYyBmcmFtZXMgbWF5IGhhdmUgUFMtYml0IHNldCwgc28gdGhleSBtdXN0IGJlIHBhc3NlZCB0bwotCSAqIGhvc3RhcF9oYW5kbGVfc3RhX3J4KCkgYmVmb3JlIGJlaW5nIGRyb3BwZWQgaGVyZS4gKi8KLQlpZiAoc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX0RBVEEgJiYKLQkgICAgc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZBQ0sgJiYKLQkgICAgc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX0RBVEFfQ0ZQT0xMICYmCi0JICAgIHN0eXBlICE9IElFRUU4MDIxMV9TVFlQRV9EQVRBX0NGQUNLUE9MTCYmCi0JICAgIHN0eXBlICE9IElFRUU4MDIxMV9TVFlQRV9RT1NfREFUQS8vYWRkIGJ5IERhdmlkLDIwMDYuOC40Ci0JICAgICkgewotCQlpZiAoc3R5cGUgIT0gSUVFRTgwMjExX1NUWVBFX05VTExGVU5DKQotCQkJSUVFRTgwMjExX0RFQlVHX0RST1AoCi0JCQkJIlJYOiBkcm9wcGVkIGRhdGEgZnJhbWUgIgotCQkJCSJ3aXRoIG5vIGRhdGEgKHR5cGU9MHglMDJ4LCAiCi0JCQkJInN1YnR5cGU9MHglMDJ4LCBsZW49JWQpXG4iLAotCQkJCXR5cGUsIHN0eXBlLCBza2ItPmxlbik7Ci0JCWdvdG8gcnhfZHJvcHBlZDsKLQl9Ci0gICAgICAgIGlmIChtZW1jbXAoYnNzaWQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pKQotICAgICAgICAgICAgICAgIGdvdG8gcnhfZHJvcHBlZDsKLQotI2lmZGVmIEVOQUJMRV9MUFMKLQlpZiAoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgICYmIChpZWVlLT5zdGFfc2xlZXAgPT0gMSkKLQkJJiYgKGllZWUtPnBvbGxpbmcpKSB7Ci0JCWlmIChXTEFOX0ZDX01PUkVfREFUQShmYykpIHsKLQkJCS8qIG1vcmUgZGF0YSBiaXQgaXMgc2V0LCBsZXQncyByZXF1ZXN0IGEgbmV3IGZyYW1lIGZyb20gdGhlIEFQICovCi0JCQlpZWVlODAyMTFfc3RhX3BzX3NlbmRfcHNwb2xsX2ZyYW1lKGllZWUpOwotCQl9IGVsc2UgewotCQkJaWVlZS0+cG9sbGluZyA9ICBmYWxzZTsKLQkJfQotCX0KLSNlbmRpZgotCi0JaWVlZS0+bmVlZF9zd19lbmMgPSAwOwotCi0gICAgICAgIGlmKCghcnhfc3RhdHMtPkRlY3J5cHRlZCkpewotICAgICAgICAgICAgICAgIGllZWUtPm5lZWRfc3dfZW5jID0gMTsKLSAgICAgICAgfQotCi0JLyogc2tiOiBoZHIgKyAocG9zc2libHkgZnJhZ21lbnRlZCwgcG9zc2libHkgZW5jcnlwdGVkKSBwYXlsb2FkICovCi0KLQlpZiAoaWVlZS0+aG9zdF9kZWNyeXB0ICYmIChmYyAmIElFRUU4MDIxMV9GQ1RMX1dFUCkgJiYKLQkgICAgKGtleWlkeCA9IGllZWU4MDIxMV9yeF9mcmFtZV9kZWNyeXB0KGllZWUsIHNrYiwgY3J5cHQpKSA8IDApCi0JewotCQlwcmludGsoImRlY3J5cHQgZnJhbWUgZXJyb3JcbiIpOwotCQlnb3RvIHJ4X2Ryb3BwZWQ7Ci0JfQotCi0KLQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKikgc2tiLT5kYXRhOwotCi0JLyogc2tiOiBoZHIgKyAocG9zc2libHkgZnJhZ21lbnRlZCkgcGxhaW50ZXh0IHBheWxvYWQgKi8KLQkvLyBQUjogRklYTUU6IGhvc3RhcCBoYXMgYWRkaXRpb25hbCBjb25kaXRpb25zIGluIHRoZSAiaWYiIGJlbG93OgotCS8vIGllZWUtPmhvc3RfZGVjcnlwdCAmJiAoZmMgJiBJRUVFODAyMTFfRkNUTF9XRVApICYmCi0JaWYgKChmcmFnICE9IDAgfHwgKGZjICYgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKSkpIHsKLQkJaW50IGZsZW47Ci0JCXN0cnVjdCBza19idWZmICpmcmFnX3NrYiA9IGllZWU4MDIxMV9mcmFnX2NhY2hlX2dldChpZWVlLCBoZHIpOwotCQlJRUVFODAyMTFfREVCVUdfRlJBRygiUnggRnJhZ21lbnQgcmVjZWl2ZWQgKCV1KVxuIiwgZnJhZyk7Ci0KLQkJaWYgKCFmcmFnX3NrYikgewotCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SWCB8IElFRUU4MDIxMV9ETF9GUkFHLAotCQkJCQkiUnggY2Fubm90IGdldCBza2IgZnJvbSBmcmFnbWVudCAiCi0JCQkJCSJjYWNoZSAobW9yZWZyYWc9JWQgc2VxPSV1IGZyYWc9JXUpXG4iLAotCQkJCQkoZmMgJiBJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpICE9IDAsCi0JCQkJCVdMQU5fR0VUX1NFUV9TRVEoc2MpLCBmcmFnKTsKLQkJCWdvdG8gcnhfZHJvcHBlZDsKLQkJfQotCQlmbGVuID0gc2tiLT5sZW47Ci0JCWlmIChmcmFnICE9IDApCi0JCQlmbGVuIC09IGhkcmxlbjsKLQotCQlpZiAoZnJhZ19za2ItPnRhaWwgKyBmbGVuID4gZnJhZ19za2ItPmVuZCkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGhvc3QgZGVjcnlwdGVkIGFuZCAiCi0JCQkgICAgICAgInJlYXNzZW1ibGVkIGZyYW1lIGRpZCBub3QgZml0IHNrYlxuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUpOwotCQkJaWVlZTgwMjExX2ZyYWdfY2FjaGVfaW52YWxpZGF0ZShpZWVlLCBoZHIpOwotCQkJZ290byByeF9kcm9wcGVkOwotCQl9Ci0KLQkJaWYgKGZyYWcgPT0gMCkgewotCQkJLyogY29weSBmaXJzdCBmcmFnbWVudCAoaW5jbHVkaW5nIGZ1bGwgaGVhZGVycykgaW50bwotCQkJICogYmVnaW5uaW5nIG9mIHRoZSBmcmFnbWVudCBjYWNoZSBza2IgKi8KLQkJCW1lbWNweShza2JfcHV0KGZyYWdfc2tiLCBmbGVuKSwgc2tiLT5kYXRhLCBmbGVuKTsKLQkJfSBlbHNlIHsKLQkJCS8qIGFwcGVuZCBmcmFtZSBwYXlsb2FkIHRvIHRoZSBlbmQgb2YgdGhlIGZyYWdtZW50Ci0JCQkgKiBjYWNoZSBza2IgKi8KLQkJCW1lbWNweShza2JfcHV0KGZyYWdfc2tiLCBmbGVuKSwgc2tiLT5kYXRhICsgaGRybGVuLAotCQkJICAgICAgIGZsZW4pOwotCQl9Ci0JCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCXNrYiA9IE5VTEw7Ci0KLQkJaWYgKGZjICYgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKSB7Ci0JCQkvKiBtb3JlIGZyYWdtZW50cyBleHBlY3RlZCAtIGxlYXZlIHRoZSBza2IgaW4gZnJhZ21lbnQKLQkJCSAqIGNhY2hlIGZvciBub3c7IGl0IHdpbGwgYmUgZGVsaXZlcmVkIHRvIHVwcGVyIGxheWVycwotCQkJICogYWZ0ZXIgYWxsIGZyYWdtZW50cyBoYXZlIGJlZW4gcmVjZWl2ZWQgKi8KLQkJCWdvdG8gcnhfZXhpdDsKLQkJfQotCi0JCS8qIHRoaXMgd2FzIHRoZSBsYXN0IGZyYWdtZW50IGFuZCB0aGUgZnJhbWUgd2lsbCBiZQotCQkgKiBkZWxpdmVyZWQsIHNvIHJlbW92ZSBza2IgZnJvbSBmcmFnbWVudCBjYWNoZSAqLwotCQlza2IgPSBmcmFnX3NrYjsKLQkJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKLQkJaWVlZTgwMjExX2ZyYWdfY2FjaGVfaW52YWxpZGF0ZShpZWVlLCBoZHIpOwotCX0KLQotCS8qIHNrYjogaGRyICsgKHBvc3NpYmxlIHJlYXNzZW1ibGVkKSBmdWxsIE1TRFUgcGF5bG9hZDsgcG9zc2libHkgc3RpbGwKLQkgKiBlbmNyeXB0ZWQvYXV0aGVudGljYXRlZCAqLwotCWlmIChpZWVlLT5ob3N0X2RlY3J5cHQgJiYgKGZjICYgSUVFRTgwMjExX0ZDVExfV0VQKSAmJgotCSAgICBpZWVlODAyMTFfcnhfZnJhbWVfZGVjcnlwdF9tc2R1KGllZWUsIHNrYiwga2V5aWR4LCBjcnlwdCkpCi0JewotCQlwcmludGsoIj09PmRlY3J5cHQgbXNkdSBlcnJvclxuIik7Ci0JCWdvdG8gcnhfZHJvcHBlZDsKLQl9Ci0KLQkvL2FkZGVkIGJ5IGFteSBmb3IgQVAgcm9hbWluZwotCWllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZEYXRhSW5QZXJpb2QrKzsKLQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SeE9rSW5QZXJpb2QrKzsKLQotCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKSBza2ItPmRhdGE7Ci0JaWYoKCFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSkgJiYgKCFpc19icm9hZGNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSkpCi0JCXVuaWNhc3RfcGFja2V0ID0gdHJ1ZTsKLQotCWlmIChjcnlwdCAmJiAhKGZjICYgSUVFRTgwMjExX0ZDVExfV0VQKSAmJiAhaWVlZS0+b3Blbl93ZXApIHsKLQkJaWYgKC8qaWVlZS0+aWVlZTgwMl8xeCAmJiovCi0JCSAgICBpZWVlODAyMTFfaXNfZWFwb2xfZnJhbWUoaWVlZSwgc2tiLCBoZHJsZW4pKSB7Ci0KLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCi0JCQkvKiBwYXNzIHVuZW5jcnlwdGVkIEVBUE9MIGZyYW1lcyBldmVuIGlmIGVuY3J5cHRpb24gaXMKLQkJCSAqIGNvbmZpZ3VyZWQgKi8KLQkJCXN0cnVjdCBlYXBvbCAqZWFwID0gKHN0cnVjdCBlYXBvbCAqKShza2ItPmRhdGEgKwotCQkJCTI0KTsKLQkJCUlFRUU4MDIxMV9ERUJVR19FQVAoIlJYOiBJRUVFIDgwMi4xWCBFQVBPTCBmcmFtZTogJXNcbiIsCi0JCQkJCQllYXBfZ2V0X3R5cGUoZWFwLT50eXBlKSk7Ci0jZW5kaWYKLQkJfSBlbHNlIHsKLQkJCUlFRUU4MDIxMV9ERUJVR19EUk9QKAotCQkJCSJlbmNyeXB0aW9uIGNvbmZpZ3VyZWQsIGJ1dCBSWCAiCi0JCQkJImZyYW1lIG5vdCBlbmNyeXB0ZWQgKFNBPSVwTSlcbiIsCi0JCQkJaGRyLT5hZGRyMik7Ci0JCQlnb3RvIHJ4X2Ryb3BwZWQ7Ci0JCX0KLQl9Ci0KLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCi0JaWYgKGNyeXB0ICYmICEoZmMgJiBJRUVFODAyMTFfRkNUTF9XRVApICYmCi0JICAgIGllZWU4MDIxMV9pc19lYXBvbF9mcmFtZShpZWVlLCBza2IsIGhkcmxlbikpIHsKLQkJCXN0cnVjdCBlYXBvbCAqZWFwID0gKHN0cnVjdCBlYXBvbCAqKShza2ItPmRhdGEgKwotCQkJCTI0KTsKLQkJCUlFRUU4MDIxMV9ERUJVR19FQVAoIlJYOiBJRUVFIDgwMi4xWCBFQVBPTCBmcmFtZTogJXNcbiIsCi0JCQkJCQllYXBfZ2V0X3R5cGUoZWFwLT50eXBlKSk7Ci0JfQotI2VuZGlmCi0KLQlpZiAoY3J5cHQgJiYgIShmYyAmIElFRUU4MDIxMV9GQ1RMX1dFUCkgJiYgIWllZWUtPm9wZW5fd2VwICYmCi0JICAgICFpZWVlODAyMTFfaXNfZWFwb2xfZnJhbWUoaWVlZSwgc2tiLCBoZHJsZW4pKSB7Ci0JCUlFRUU4MDIxMV9ERUJVR19EUk9QKAotCQkJImRyb3BwZWQgdW5lbmNyeXB0ZWQgUlggZGF0YSAiCi0JCQkiZnJhbWUgZnJvbSAlcE0iCi0JCQkiIChkcm9wX3VuZW5jcnlwdGVkPTEpXG4iLAotCQkJaGRyLT5hZGRyMik7Ci0JCWdvdG8gcnhfZHJvcHBlZDsKLQl9Ci0vL2FkZGVkIGJ5IGFteSBmb3IgcmVvcmRlcgotCWlmKGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUgJiYgSXNRb1NEYXRhRnJhbWUoc2tiLT5kYXRhKQotCQkmJiAhaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkgJiYgIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpKQotCXsKLQkJVElEID0gRnJhbWVfUW9TVElEKHNrYi0+ZGF0YSk7Ci0JCVNlcU51bSA9IFdMQU5fR0VUX1NFUV9TRVEoc2MpOwotCQlHZXRUcyhpZWVlLChQVFNfQ09NTU9OX0lORk8qKSAmcFRTLGhkci0+YWRkcjIsVElELFJYX0RJUix0cnVlKTsKLQkJaWYoVElEICE9MCAmJiBUSUQgIT0zKQotCQl7Ci0JCQlpZWVlLT5iaXNfYW55X25vbmJlcGt0cyA9IHRydWU7Ci0JCX0KLQl9Ci0KLS8vYWRkZWQgYnkgYW15IGZvciByZW9yZGVyCi0JLyogc2tiOiBoZHIgKyAocG9zc2libGUgcmVhc3NlbWJsZWQpIGZ1bGwgcGxhaW50ZXh0IHBheWxvYWQgKi8KLQlwYXlsb2FkID0gc2tiLT5kYXRhICsgaGRybGVuOwotCi0JcnhiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yeGIpLCBHRlBfQVRPTUlDKTsKLQlpZihyeGIgPT0gTlVMTCkKLQl7Ci0JCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCIlcygpOiBrbWFsbG9jIHJ4YiBlcnJvclxuIixfX0ZVTkNUSU9OX18pOwotCQlnb3RvIHJ4X2Ryb3BwZWQ7Ci0JfQotCS8qIHRvIHBhcnNlIGFtc2R1IHBhY2tldHMgKi8KLQkvKiBxb3MgZGF0YSBwYWNrZXRzICYgcmVzZXJ2ZWQgYml0IGlzIDEgKi8KLQlpZihwYXJzZV9zdWJmcmFtZShpZWVlLCBza2Iscnhfc3RhdHMscnhiLHNyYyxkc3QpID09IDApIHsKLQkJLyogb25seSB0byBmcmVlIHJ4YiwgYW5kIG5vdCBzdWJtaXQgdGhlIHBhY2tldHMgdG8gdXBwZXIgbGF5ZXIgKi8KLQkJZm9yKGkgPTA7IGkgPCByeGItPm5yX3N1YmZyYW1lczsgaSsrKSB7Ci0JCQlkZXZfa2ZyZWVfc2tiKHJ4Yi0+c3ViZnJhbWVzW2ldKTsKLQkJfQotCQlrZnJlZShyeGIpOwotCQlyeGIgPSBOVUxMOwotCQlnb3RvIHJ4X2Ryb3BwZWQ7Ci0JfQotCi0jaWZkZWYgRU5BQkxFX0xQUwotCQlpZih1bmljYXN0X3BhY2tldCkKLQkJewotCQkJaWYgKHR5cGUgPT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEpCi0JCQl7Ci0KLQkJCQlpZihpZWVlLT5iSXNBZ2dyZWdhdGVGcmFtZSkKLQkJCQkJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUnhVbmljYXN0T2tJblBlcmlvZCs9cnhiLT5ucl9zdWJmcmFtZXM7Ci0JCQkJZWxzZQotCQkJCQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SeFVuaWNhc3RPa0luUGVyaW9kKys7Ci0KLQkJCQkvLyAyMDA5LjAzLjAzIExlYXZlIERDIG1vZGUgaW1tZWRpYXRlbHkgd2hlbiBkZXRlY3QgaGlnaCB0cmFmZmljCi0JCQkJaWYoKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpIC8qJiYgIU1nbnRJbml0QWRhcHRlckluUHJvZ3Jlc3MocE1nbnRJbmZvKSovKQotCQkJCXsKLQkJCQkJaWYoCSgoaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUnhVbmljYXN0T2tJblBlcmlvZCAraWVlZS0+TGlua0RldGVjdEluZm8uTnVtVHhPa0luUGVyaW9kKSA+IDggKSB8fAotCQkJCQkJKGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJ4VW5pY2FzdE9rSW5QZXJpb2QgPiAyKSApCi0JCQkJCXsKLQkJCQkJCWlmKGllZWUtPkxlaXN1cmVQU0xlYXZlKQotCQkJCQkJCWllZWUtPkxlaXN1cmVQU0xlYXZlKGllZWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0jZW5kaWYKLQotCWllZWUtPmxhc3RfcnhfcHNfdGltZSA9IGppZmZpZXM7Ci0vL2FkZGVkIGJ5IGFteSBmb3IgcmVvcmRlcgotCWlmKGllZWUtPnBIVEluZm8tPmJDdXJSeFJlb3JkZXJFbmFibGUgPT0gZmFsc2UgfHxwVFMgPT0gTlVMTCl7Ci0vL2FkZGVkIGJ5IGFteSBmb3IgcmVvcmRlcgotCQlmb3IoaSA9IDA7IGk8cnhiLT5ucl9zdWJmcmFtZXM7IGkrKykgewotCQkJc3RydWN0IHNrX2J1ZmYgKnN1Yl9za2IgPSByeGItPnN1YmZyYW1lc1tpXTsKLQotCQkJaWYgKHN1Yl9za2IpIHsKLQkJCQkvKiBjb252ZXJ0IGhkciArIHBvc3NpYmxlIExMQyBoZWFkZXJzIGludG8gRXRoZXJuZXQgaGVhZGVyICovCi0JCQkJZXRoZXJ0eXBlID0gKHN1Yl9za2ItPmRhdGFbNl0gPDwgOCkgfCBzdWJfc2tiLT5kYXRhWzddOwotCQkJCWlmIChzdWJfc2tiLT5sZW4gPj0gOCAmJgotCQkJCQkJKChtZW1jbXAoc3ViX3NrYi0+ZGF0YSwgcmZjMTA0Ml9oZWFkZXIsIFNOQVBfU0laRSkgPT0gMCAmJgotCQkJCQkJICBldGhlcnR5cGUgIT0gRVRIX1BfQUFSUCAmJiBldGhlcnR5cGUgIT0gRVRIX1BfSVBYKSB8fAotCQkJCQkJIG1lbWNtcChzdWJfc2tiLT5kYXRhLCBicmlkZ2VfdHVubmVsX2hlYWRlciwgU05BUF9TSVpFKSA9PSAwKSkgewotCQkJCQkvKiByZW1vdmUgUkZDMTA0MiBvciBCcmlkZ2UtVHVubmVsIGVuY2Fwc3VsYXRpb24gYW5kCi0JCQkJCSAqIHJlcGxhY2UgRXRoZXJUeXBlICovCi0JCQkJCXNrYl9wdWxsKHN1Yl9za2IsIFNOQVBfU0laRSk7Ci0JCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIHNyYywgRVRIX0FMRU4pOwotCQkJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgRVRIX0FMRU4pLCBkc3QsIEVUSF9BTEVOKTsKLQkJCQl9IGVsc2UgewotCQkJCQl1MTYgbGVuOwotCQkJCQkvKiBMZWF2ZSBFdGhlcm5ldCBoZWFkZXIgcGFydCBvZiBoZHIgYW5kIGZ1bGwgcGF5bG9hZCAqLwotCQkJCQlsZW4gPSBodG9ucyhzdWJfc2tiLT5sZW4pOwotCQkJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgMiksICZsZW4sIDIpOwotCQkJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgRVRIX0FMRU4pLCBzcmMsIEVUSF9BTEVOKTsKLQkJCQkJbWVtY3B5KHNrYl9wdXNoKHN1Yl9za2IsIEVUSF9BTEVOKSwgZHN0LCBFVEhfQUxFTik7Ci0JCQkJfQotCi0JCQkJc3RhdHMtPnJ4X3BhY2tldHMrKzsKLQkJCQlzdGF0cy0+cnhfYnl0ZXMgKz0gc3ViX3NrYi0+bGVuOwotCQkJCWlmKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRzdCkpIHsKLQkJCQkJc3RhdHMtPm11bHRpY2FzdCsrOwotCQkJCX0KLQotCQkJCS8qIEluZGljYXQgdGhlIHBhY2tldHMgdG8gdXBwZXIgbGF5ZXIgKi8KLQkJCQlzdWJfc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHN1Yl9za2IsIGRldik7Ci0JCQkJbWVtc2V0KHN1Yl9za2ItPmNiLCAwLCBzaXplb2Yoc3ViX3NrYi0+Y2IpKTsKLQkJCQlzdWJfc2tiLT5kZXYgPSBkZXY7Ci0JCQkJc3ViX3NrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsgLyogODAyLjExIGNyYyBub3Qgc3VmZmljaWVudCAqLwotCQkJCW5ldGlmX3J4KHN1Yl9za2IpOwotCQkJfQotCQl9Ci0JCWtmcmVlKHJ4Yik7Ci0JCXJ4YiA9IE5VTEw7Ci0KLQl9Ci0JZWxzZQotCXsKLQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCIlcygpOiBSRU9SREVSIEVOQUJMRSBBTkQgUFRTIG5vdCBOVUxMLCBhbmQgd2Ugd2lsbCBlbnRlciBSeFJlb3JkZXJJbmRpY2F0ZVBhY2tldCgpXG4iLF9fRlVOQ1RJT05fXyk7Ci0JCVJ4UmVvcmRlckluZGljYXRlUGFja2V0KGllZWUsIHJ4YiwgcFRTLCBTZXFOdW0pOwotCX0KLSNpZm5kZWYgSk9ITl9OT0NQWQotCWRldl9rZnJlZV9za2Ioc2tiKTsKLSNlbmRpZgotCi0gcnhfZXhpdDoKLSNpZmRlZiBOT1RfWUVUCi0JaWYgKHN0YSkKLQkJaG9zdGFwX2hhbmRsZV9zdGFfcmVsZWFzZShzdGEpOwotI2VuZGlmCi0JcmV0dXJuIDE7Ci0KLSByeF9kcm9wcGVkOgotCWtmcmVlKHJ4Yik7Ci0JcnhiID0gTlVMTDsKLQlzdGF0cy0+cnhfZHJvcHBlZCsrOwotCi0JLyogUmV0dXJuaW5nIDAgaW5kaWNhdGVzIHRvIGNhbGxlciB0aGF0IHdlIGhhdmUgbm90IGhhbmRsZWQgdGhlIFNLQi0tCi0JICogc28gaXQgaXMgc3RpbGwgYWxsb2NhdGVkIGFuZCBjYW4gYmUgdXNlZCBhZ2FpbiBieSB1bmRlcmx5aW5nCi0JICogaGFyZHdhcmUgYXMgYSBETUEgdGFyZ2V0ICovCi0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgTUdNVF9GUkFNRV9GSVhFRF9QQVJUX0xFTkdUSCAgICAgICAgICAgIDB4MjQKLQotc3RhdGljIHU4IHFvc19vdWlbUU9TX09VSV9MRU5dID0geyAweDAwLCAweDUwLCAweEYyIH07Ci0KLS8qCi0qIE1ha2UgdGhlIHN0cnVjdHVyZSB3ZSByZWFkIGZyb20gdGhlIGJlYWNvbiBwYWNrZXQgdG8gaGF2ZQotKiB0aGUgcmlnaHQgdmFsdWVzCi0qLwotc3RhdGljIGludCBpZWVlODAyMTFfdmVyaWZ5X3Fvc19pbmZvKHN0cnVjdCBpZWVlODAyMTFfcW9zX2luZm9ybWF0aW9uX2VsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5mb19lbGVtZW50LCBpbnQgc3ViX3R5cGUpCi17Ci0KLSAgICAgICAgaWYgKGluZm9fZWxlbWVudC0+cXVpX3N1YnR5cGUgIT0gc3ViX3R5cGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAobWVtY21wKGluZm9fZWxlbWVudC0+cXVpLCBxb3Nfb3VpLCBRT1NfT1VJX0xFTikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAoaW5mb19lbGVtZW50LT5xdWlfdHlwZSAhPSBRT1NfT1VJX1RZUEUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAoaW5mb19lbGVtZW50LT52ZXJzaW9uICE9IFFPU19WRVJTSU9OXzEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgIHJldHVybiAwOwotfQotCi0KLS8qCi0gKiBQYXJzZSBhIFFvUyBwYXJhbWV0ZXIgZWxlbWVudAotICovCi1zdGF0aWMgaW50IGllZWU4MDIxMV9yZWFkX3Fvc19wYXJhbV9lbGVtZW50KHN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcl9pbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICplbGVtZW50X3BhcmFtLCBzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5mb19lbGVtZW50KQotewotICAgICAgICBpbnQgcmV0ID0gMDsKLSAgICAgICAgdTE2IHNpemUgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NfcGFyYW1ldGVyX2luZm8pIC0gMjsKLQotICAgICAgICBpZiAoKGluZm9fZWxlbWVudCA9PSBOVUxMKSB8fCAoZWxlbWVudF9wYXJhbSA9PSBOVUxMKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgaWYgKGluZm9fZWxlbWVudC0+aWQgPT0gUU9TX0VMRU1FTlRfSUQgJiYgaW5mb19lbGVtZW50LT5sZW4gPT0gc2l6ZSkgewotICAgICAgICAgICAgICAgIG1lbWNweShlbGVtZW50X3BhcmFtLT5pbmZvX2VsZW1lbnQucXVpLCBpbmZvX2VsZW1lbnQtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKLSAgICAgICAgICAgICAgICBlbGVtZW50X3BhcmFtLT5pbmZvX2VsZW1lbnQuZWxlbWVudElEID0gaW5mb19lbGVtZW50LT5pZDsKLSAgICAgICAgICAgICAgICBlbGVtZW50X3BhcmFtLT5pbmZvX2VsZW1lbnQubGVuZ3RoID0gaW5mb19lbGVtZW50LT5sZW47Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHJldCA9IC0xOwotICAgICAgICBpZiAocmV0ID09IDApCi0gICAgICAgICAgICAgICAgcmV0ID0gaWVlZTgwMjExX3ZlcmlmeV9xb3NfaW5mbygmZWxlbWVudF9wYXJhbS0+aW5mb19lbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUU9TX09VSV9QQVJBTV9TVUJfVFlQRSk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBQYXJzZSBhIFFvUyBpbmZvcm1hdGlvbiBlbGVtZW50Ci0gKi8KLXN0YXRpYyBpbnQgaWVlZTgwMjExX3JlYWRfcW9zX2luZm9fZWxlbWVudChzdHJ1Y3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZWVlODAyMTFfcW9zX2luZm9ybWF0aW9uX2VsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZWxlbWVudF9pbmZvLCBzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbmZvX2VsZW1lbnQpCi17Ci0gICAgICAgIGludCByZXQgPSAwOwotICAgICAgICB1MTYgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc19pbmZvcm1hdGlvbl9lbGVtZW50KSAtIDI7Ci0KLSAgICAgICAgaWYgKGVsZW1lbnRfaW5mbyA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKGluZm9fZWxlbWVudCA9PSBOVUxMKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICBpZiAoKGluZm9fZWxlbWVudC0+aWQgPT0gUU9TX0VMRU1FTlRfSUQpICYmIChpbmZvX2VsZW1lbnQtPmxlbiA9PSBzaXplKSkgewotICAgICAgICAgICAgICAgIG1lbWNweShlbGVtZW50X2luZm8tPnF1aSwgaW5mb19lbGVtZW50LT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICBpbmZvX2VsZW1lbnQtPmxlbik7Ci0gICAgICAgICAgICAgICAgZWxlbWVudF9pbmZvLT5lbGVtZW50SUQgPSBpbmZvX2VsZW1lbnQtPmlkOwotICAgICAgICAgICAgICAgIGVsZW1lbnRfaW5mby0+bGVuZ3RoID0gaW5mb19lbGVtZW50LT5sZW47Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHJldCA9IC0xOwotCi0gICAgICAgIGlmIChyZXQgPT0gMCkKLSAgICAgICAgICAgICAgICByZXQgPSBpZWVlODAyMTFfdmVyaWZ5X3Fvc19pbmZvKGVsZW1lbnRfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFPU19PVUlfSU5GT19TVUJfVFlQRSk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci19Ci0KLQotLyoKLSAqIFdyaXRlIFFvUyBwYXJhbWV0ZXJzIGZyb20gdGhlIGFjIHBhcmFtZXRlcnMuCi0gKi8KLXN0YXRpYyBpbnQgaWVlZTgwMjExX3Fvc19jb252ZXJ0X2FjX3RvX3BhcmFtZXRlcnMoc3RydWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWU4MDIxMV9xb3NfcGFyYW1ldGVyX2luZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhcmFtX2VsbSwgc3RydWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWU4MDIxMV9xb3NfcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcW9zX3BhcmFtKQotewotICAgICAgICBpbnQgcmMgPSAwOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgc3RydWN0IGllZWU4MDIxMV9xb3NfYWNfcGFyYW1ldGVyICphY19wYXJhbXM7Ci0JdTggYWNpOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBRT1NfUVVFVUVfTlVNOyBpKyspIHsKLSAgICAgICAgICAgICAgICBhY19wYXJhbXMgPSAmKHBhcmFtX2VsbS0+YWNfcGFyYW1zX3JlY29yZFtpXSk7Ci0KLQkJYWNpID0gKGFjX3BhcmFtcy0+YWNpX2FpZnNuICYgMHg2MCkgPj4gNTsKLQotCQlpZihhY2kgPj0gUU9TX1FVRVVFX05VTSkKLQkJCWNvbnRpbnVlOwotICAgICAgICAgICAgICAgIHFvc19wYXJhbS0+YWlmc1thY2ldID0gKGFjX3BhcmFtcy0+YWNpX2FpZnNuKSAmIDB4MGY7Ci0KLQkJLyogV01NIHNwZWMgUC4xMTogVGhlIG1pbmltdW0gdmFsdWUgZm9yIEFJRlNOIHNoYWxsIGJlIDIgKi8KLSAgICAgICAgICAgICAgICBxb3NfcGFyYW0tPmFpZnNbYWNpXSA9IChxb3NfcGFyYW0tPmFpZnNbYWNpXSA8IDIpID8gMjpxb3NfcGFyYW0tPmFpZnNbYWNpXTsKLQotICAgICAgICAgICAgICAgIHFvc19wYXJhbS0+Y3dfbWluW2FjaV0gPSBhY19wYXJhbXMtPmVjd19taW5fbWF4ICYgMHgwRjsKLQotICAgICAgICAgICAgICAgIHFvc19wYXJhbS0+Y3dfbWF4W2FjaV0gPSAoYWNfcGFyYW1zLT5lY3dfbWluX21heCAmIDB4RjApID4+IDQ7Ci0KLSAgICAgICAgICAgICAgICBxb3NfcGFyYW0tPmZsYWdbYWNpXSA9Ci0gICAgICAgICAgICAgICAgICAgIChhY19wYXJhbXMtPmFjaV9haWZzbiAmIDB4MTApID8gMHgwMSA6IDB4MDA7Ci0gICAgICAgICAgICAgICAgcW9zX3BhcmFtLT50eF9vcF9saW1pdFthY2ldID0gbGUxNl90b19jcHUoYWNfcGFyYW1zLT50eF9vcF9saW1pdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJjOwotfQotCi0vKgotICogd2UgaGF2ZSBhIGdlbmVyaWMgZGF0YSBlbGVtZW50IHdoaWNoIGl0IG1heSBjb250YWluIFFvUyBpbmZvcm1hdGlvbiBvcgotICogcGFyYW1ldGVycyBlbGVtZW50LiBjaGVjayB0aGUgaW5mb3JtYXRpb24gZWxlbWVudCBsZW5ndGggdG8gZGVjaWRlCi0gKiB3aGljaCB0eXBlIHRvIHJlYWQKLSAqLwotc3RhdGljIGludCBpZWVlODAyMTFfcGFyc2VfcW9zX2luZm9fcGFyYW1fSUUoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICppbmZvX2VsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmspCi17Ci0gICAgICAgIGludCByYyA9IDA7Ci0gICAgICAgIHN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMgKnFvc19wYXJhbSA9IE5VTEw7Ci0gICAgICAgIHN0cnVjdCBpZWVlODAyMTFfcW9zX2luZm9ybWF0aW9uX2VsZW1lbnQgcW9zX2luZm9fZWxlbWVudDsKLQotICAgICAgICByYyA9IGllZWU4MDIxMV9yZWFkX3Fvc19pbmZvX2VsZW1lbnQoJnFvc19pbmZvX2VsZW1lbnQsIGluZm9fZWxlbWVudCk7Ci0KLSAgICAgICAgaWYgKHJjID09IDApIHsKLSAgICAgICAgICAgICAgICBuZXR3b3JrLT5xb3NfZGF0YS5wYXJhbV9jb3VudCA9IHFvc19pbmZvX2VsZW1lbnQuYWNfaW5mbyAmIDB4MEY7Ci0gICAgICAgICAgICAgICAgbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19IQVNfUU9TX0lORk9STUFUSU9OOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcl9pbmZvIHBhcmFtX2VsZW1lbnQ7Ci0KLSAgICAgICAgICAgICAgICByYyA9IGllZWU4MDIxMV9yZWFkX3Fvc19wYXJhbV9lbGVtZW50KCZwYXJhbV9lbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19lbGVtZW50KTsKLSAgICAgICAgICAgICAgICBpZiAocmMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcW9zX3BhcmFtID0gJihuZXR3b3JrLT5xb3NfZGF0YS5wYXJhbWV0ZXJzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGllZWU4MDIxMV9xb3NfY29udmVydF9hY190b19wYXJhbWV0ZXJzKCZwYXJhbV9lbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW9zX3BhcmFtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmstPmZsYWdzIHw9IE5FVFdPUktfSEFTX1FPU19QQVJBTUVURVJTOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yay0+cW9zX2RhdGEucGFyYW1fY291bnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX2VsZW1lbnQuaW5mb19lbGVtZW50LmFjX2luZm8gJiAweDBGOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgSUVFRTgwMjExX0RFQlVHX1FPUygiUW9TIGlzIHN1cHBvcnRlZFxuIik7Ci0gICAgICAgICAgICAgICAgbmV0d29yay0+cW9zX2RhdGEuc3VwcG9ydGVkID0gMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmM7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCi0jZGVmaW5lIE1GSUVfU1RSSU5HKHgpIGNhc2UgTUZJRV9UWVBFXyAjI3g6IHJldHVybiAjeAotCi1zdGF0aWMgY29uc3QgY2hhciAqZ2V0X2luZm9fZWxlbWVudF9zdHJpbmcodTE2IGlkKQotewotICAgICAgICBzd2l0Y2ggKGlkKSB7Ci0gICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoU1NJRCk7Ci0gICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoUkFURVMpOwotICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKEZIX1NFVCk7Ci0gICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoRFNfU0VUKTsKLSAgICAgICAgICAgICAgICBNRklFX1NUUklORyhDRl9TRVQpOwotICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKFRJTSk7Ci0gICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoSUJTU19TRVQpOwotICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKENPVU5UUlkpOwotICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKEhPUF9QQVJBTVMpOwotICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKEhPUF9UQUJMRSk7Ci0gICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoUkVRVUVTVCk7Ci0gICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoQ0hBTExFTkdFKTsKLSAgICAgICAgICAgICAgICBNRklFX1NUUklORyhQT1dFUl9DT05TVFJBSU5UKTsKLSAgICAgICAgICAgICAgICBNRklFX1NUUklORyhQT1dFUl9DQVBBQklMSVRZKTsKLSAgICAgICAgICAgICAgICBNRklFX1NUUklORyhUUENfUkVRVUVTVCk7Ci0gICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoVFBDX1JFUE9SVCk7Ci0gICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoU1VQUF9DSEFOTkVMUyk7Ci0gICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoQ1NBKTsKLSAgICAgICAgICAgICAgICBNRklFX1NUUklORyhNRUFTVVJFX1JFUVVFU1QpOwotICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKE1FQVNVUkVfUkVQT1JUKTsKLSAgICAgICAgICAgICAgICBNRklFX1NUUklORyhRVUlFVCk7Ci0gICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoSUJTU19ERlMpOwotICAgICAgICAgICAgICAgLy8gTUZJRV9TVFJJTkcoRVJQX0lORk8pOwotICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKFJTTik7Ci0gICAgICAgICAgICAgICAgTUZJRV9TVFJJTkcoUkFURVNfRVgpOwotICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKEdFTkVSSUMpOwotICAgICAgICAgICAgICAgIE1GSUVfU1RSSU5HKFFPU19QQVJBTUVURVIpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAiVU5LTk9XTiI7Ci0gICAgICAgIH0KLX0KLSNlbmRpZgotCi0jaWZkZWYgRU5BQkxFX0RPVDExRAotc3RhdGljIGlubGluZSB2b2lkIGllZWU4MDIxMV9leHRyYWN0X2NvdW50cnlfaWUoCi0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0Jc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKmluZm9fZWxlbWVudCwKLQlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmssCi0JdTggKiBhZGRyMgotKQotewotCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCi0JewotCQlpZihpbmZvX2VsZW1lbnQtPmxlbiE9IDApCi0JCXsKLQkJCW1lbWNweShuZXR3b3JrLT5Db3VudHJ5SWVCdWYsIGluZm9fZWxlbWVudC0+ZGF0YSwgaW5mb19lbGVtZW50LT5sZW4pOwotCQkJbmV0d29yay0+Q291bnRyeUllTGVuID0gaW5mb19lbGVtZW50LT5sZW47Ci0KLQkJCWlmKCFJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQotCQkJewotCQkJCURvdDExZF9VcGRhdGVDb3VudHJ5SWUoaWVlZSwgYWRkcjIsIGluZm9fZWxlbWVudC0+bGVuLCBpbmZvX2VsZW1lbnQtPmRhdGEpOwotCQkJfQotCQl9Ci0KLQkJLy8KLQkJLy8gMDcwMzA1LCByY25qa286IEkgdXBkYXRlIGNvdW50cnkgSUUgd2F0Y2ggZG9nIGhlcmUgYmVjYXVzZQotCQkvLyBzb21lIEFQIChlLmcuIENpc2NvIDEyNDIpIGRvbid0IGluY2x1ZGUgY291bnRyeSBJRSBpbiB0aGVpcgotCQkvLyBwcm9iZSByZXNwb25zZSBmcmFtZS4KLQkJLy8KLQkJaWYoSVNfRVFVQUxfQ0lFX1NSQyhpZWVlLCBhZGRyMikgKQotCQl7Ci0JCQlVUERBVEVfQ0lFX1dBVENIRE9HKGllZWUpOwotCQl9Ci0JfQotCi19Ci0jZW5kaWYKLQotaW50IGllZWU4MDIxMV9wYXJzZV9pbmZvX3BhcmFtKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotCQlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqaW5mb19lbGVtZW50LAotCQl1MTYgbGVuZ3RoLAotCQlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmssCi0JCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKQotewotCXU4IGk7Ci0Jc2hvcnQgb2Zmc2V0OwotICAgICAgICB1MTYJdG1wX2h0Y2FwX2xlbj0wOwotCXUxNgl0bXBfaHRpbmZvX2xlbj0wOwotCXUxNiBodF9yZWFsdGVrX2FnZ19sZW49MDsKLQl1OCAgaHRfcmVhbHRla19hZ2dfYnVmW01BWF9JRV9MRU5dOwotI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKLQljaGFyIHJhdGVzX3N0cls2NF07Ci0JY2hhciAqcDsKLSNlbmRpZgotCi0Jd2hpbGUgKGxlbmd0aCA+PSBzaXplb2YoKmluZm9fZWxlbWVudCkpIHsKLQkJaWYgKHNpemVvZigqaW5mb19lbGVtZW50KSArIGluZm9fZWxlbWVudC0+bGVuID4gbGVuZ3RoKSB7Ci0JCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiSW5mbyBlbGVtOiBwYXJzZSBmYWlsZWQ6ICIKLQkJCQkJICAgICAiaW5mb19lbGVtZW50LT5sZW4gKyAyID4gbGVmdCA6ICIKLQkJCQkJICAgICAiaW5mb19lbGVtZW50LT5sZW4rMj0lemQgbGVmdD0lZCwgaWQ9JWQuXG4iLAotCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuICsKLQkJCQkJICAgICBzaXplb2YoKmluZm9fZWxlbWVudCksCi0JCQkJCSAgICAgbGVuZ3RoLCBpbmZvX2VsZW1lbnQtPmlkKTsKLQkJCS8qIFdlIHN0b3AgcHJvY2Vzc2luZyBidXQgZG9uJ3QgcmV0dXJuIGFuIGVycm9yIGhlcmUKLQkJCSAqIGJlY2F1c2Ugc29tZSBtaXNiZWhhdmlvdXIgQVBzIGJyZWFrIHRoaXMgcnVsZS4gaWUuCi0JCQkgKiBPcmlub2NvIEFQMTAwMC4gKi8KLQkJCWJyZWFrOwotCQl9Ci0KLQkJc3dpdGNoIChpbmZvX2VsZW1lbnQtPmlkKSB7Ci0JCWNhc2UgTUZJRV9UWVBFX1NTSUQ6Ci0JCQlpZiAoaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKGluZm9fZWxlbWVudC0+ZGF0YSwKLQkJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pKSB7Ci0JCQkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19FTVBUWV9FU1NJRDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJbmV0d29yay0+c3NpZF9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sCi0JCQkJCQkodTgpIElXX0VTU0lEX01BWF9TSVpFKTsKLQkJCW1lbWNweShuZXR3b3JrLT5zc2lkLCBpbmZvX2VsZW1lbnQtPmRhdGEsIG5ldHdvcmstPnNzaWRfbGVuKTsKLQkJCWlmIChuZXR3b3JrLT5zc2lkX2xlbiA8IElXX0VTU0lEX01BWF9TSVpFKQotCQkJCW1lbXNldChuZXR3b3JrLT5zc2lkICsgbmV0d29yay0+c3NpZF9sZW4sIDAsCi0JCQkJICAgICAgIElXX0VTU0lEX01BWF9TSVpFIC0gbmV0d29yay0+c3NpZF9sZW4pOwotCi0JCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiTUZJRV9UWVBFX1NTSUQ6ICclcycgbGVuPSVkLlxuIiwKLQkJCQkJICAgICBuZXR3b3JrLT5zc2lkLCBuZXR3b3JrLT5zc2lkX2xlbik7Ci0JCQlicmVhazsKLQotCQljYXNlIE1GSUVfVFlQRV9SQVRFUzoKLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCi0JCQlwID0gcmF0ZXNfc3RyOwotI2VuZGlmCi0JCQluZXR3b3JrLT5yYXRlc19sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sCi0JCQkJCQkgTUFYX1JBVEVTX0xFTkdUSCk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbmV0d29yay0+cmF0ZXNfbGVuOyBpKyspIHsKLQkJCQluZXR3b3JrLT5yYXRlc1tpXSA9IGluZm9fZWxlbWVudC0+ZGF0YVtpXTsKLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCi0JCQkJcCArPSBzbnByaW50ZihwLCBzaXplb2YocmF0ZXNfc3RyKSAtCi0JCQkJCSAgICAgIChwIC0gcmF0ZXNfc3RyKSwgIiUwMlggIiwKLQkJCQkJICAgICAgbmV0d29yay0+cmF0ZXNbaV0pOwotI2VuZGlmCi0JCQkJaWYgKGllZWU4MDIxMV9pc19vZmRtX3JhdGUKLQkJCQkgICAgKGluZm9fZWxlbWVudC0+ZGF0YVtpXSkpIHsKLQkJCQkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19IQVNfT0ZETTsKLQkJCQkJaWYgKGluZm9fZWxlbWVudC0+ZGF0YVtpXSAmCi0JCQkJCSAgICBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLKQotCQkJCQkJbmV0d29yay0+ZmxhZ3MgJj0KLQkJCQkJCSAgICB+TkVUV09SS19IQVNfQ0NLOwotCQkJCX0KLQkJCX0KLQotCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9SQVRFUzogJyVzJyAoJWQpXG4iLAotCQkJCQkgICAgIHJhdGVzX3N0ciwgbmV0d29yay0+cmF0ZXNfbGVuKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTUZJRV9UWVBFX1JBVEVTX0VYOgotI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKLQkJCXAgPSByYXRlc19zdHI7Ci0jZW5kaWYKLQkJCW5ldHdvcmstPnJhdGVzX2V4X2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiwKLQkJCQkJCSAgICBNQVhfUkFURVNfRVhfTEVOR1RIKTsKLQkJCWZvciAoaSA9IDA7IGkgPCBuZXR3b3JrLT5yYXRlc19leF9sZW47IGkrKykgewotCQkJCW5ldHdvcmstPnJhdGVzX2V4W2ldID0gaW5mb19lbGVtZW50LT5kYXRhW2ldOwotI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKLQkJCQlwICs9IHNucHJpbnRmKHAsIHNpemVvZihyYXRlc19zdHIpIC0KLQkJCQkJICAgICAgKHAgLSByYXRlc19zdHIpLCAiJTAyWCAiLAotCQkJCQkgICAgICBuZXR3b3JrLT5yYXRlc1tpXSk7Ci0jZW5kaWYKLQkJCQlpZiAoaWVlZTgwMjExX2lzX29mZG1fcmF0ZQotCQkJCSAgICAoaW5mb19lbGVtZW50LT5kYXRhW2ldKSkgewotCQkJCQluZXR3b3JrLT5mbGFncyB8PSBORVRXT1JLX0hBU19PRkRNOwotCQkJCQlpZiAoaW5mb19lbGVtZW50LT5kYXRhW2ldICYKLQkJCQkJICAgIElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0spCi0JCQkJCQluZXR3b3JrLT5mbGFncyAmPQotCQkJCQkJICAgIH5ORVRXT1JLX0hBU19DQ0s7Ci0JCQkJfQotCQkJfQotCi0JCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiTUZJRV9UWVBFX1JBVEVTX0VYOiAnJXMnICglZClcbiIsCi0JCQkJCSAgICAgcmF0ZXNfc3RyLCBuZXR3b3JrLT5yYXRlc19leF9sZW4pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNRklFX1RZUEVfRFNfU0VUOgotCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9EU19TRVQ6ICVkXG4iLAotCQkJCQkgICAgIGluZm9fZWxlbWVudC0+ZGF0YVswXSk7Ci0JCQluZXR3b3JrLT5jaGFubmVsID0gaW5mb19lbGVtZW50LT5kYXRhWzBdOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNRklFX1RZUEVfRkhfU0VUOgotCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9GSF9TRVQ6IGlnbm9yZWRcbiIpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNRklFX1RZUEVfQ0ZfU0VUOgotCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9DRl9TRVQ6IGlnbm9yZWRcbiIpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNRklFX1RZUEVfVElNOgotCQkJaWYoaW5mb19lbGVtZW50LT5sZW4gPCA0KQotCQkJCWJyZWFrOwotCi0JCQluZXR3b3JrLT50aW0udGltX2NvdW50ID0gaW5mb19lbGVtZW50LT5kYXRhWzBdOwotCQkJbmV0d29yay0+dGltLnRpbV9wZXJpb2QgPSBpbmZvX2VsZW1lbnQtPmRhdGFbMV07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmstPmR0aW1fcGVyaW9kID0gaW5mb19lbGVtZW50LT5kYXRhWzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0JCQkvL3dlIHVzZSBqaWZmaWVzIGZvciBsZWdhY3kgUG93ZXIgc2F2ZQotCQkJbmV0d29yay0+bGFzdF9kdGltX3N0YV90aW1lWzBdID0gamlmZmllczsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmstPmxhc3RfZHRpbV9zdGFfdGltZVsxXSA9IHN0YXRzLT5tYWNfdGltZVsxXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yay0+ZHRpbV9kYXRhID0gSUVFRTgwMjExX0RUSU1fVkFMSUQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGluZm9fZWxlbWVudC0+ZGF0YVswXSAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5mb19lbGVtZW50LT5kYXRhWzJdICYgMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yay0+ZHRpbV9kYXRhIHw9IElFRUU4MDIxMV9EVElNX01CQ0FTVDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKGluZm9fZWxlbWVudC0+ZGF0YVsyXSA+PiAxKSoyOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihpZWVlLT5hc3NvY19pZCA8IDgqb2Zmc2V0IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWUtPmFzc29jX2lkID4gOCoob2Zmc2V0ICsgaW5mb19lbGVtZW50LT5sZW4gLTMpKQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAoaWVlZS0+YXNzb2NfaWQgLyA4KSAtIG9mZnNldDsvLyArICgoYWlkICUgOCk/IDAgOiAxKSA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKGluZm9fZWxlbWVudC0+ZGF0YVszK29mZnNldF0gJiAoMTw8KGllZWUtPmFzc29jX2lkJTgpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yay0+ZHRpbV9kYXRhIHw9IElFRUU4MDIxMV9EVElNX1VDQVNUOwotCi0JCQlicmVhazsKLQotCQljYXNlIE1GSUVfVFlQRV9FUlA6Ci0JCQluZXR3b3JrLT5lcnBfdmFsdWUgPSBpbmZvX2VsZW1lbnQtPmRhdGFbMF07Ci0JCQluZXR3b3JrLT5mbGFncyB8PSBORVRXT1JLX0hBU19FUlBfVkFMVUU7Ci0JCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiTUZJRV9UWVBFX0VSUF9TRVQ6ICVkXG4iLAotCQkJCQkgICAgIG5ldHdvcmstPmVycF92YWx1ZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBNRklFX1RZUEVfSUJTU19TRVQ6Ci0JCQluZXR3b3JrLT5hdGltX3dpbmRvdyA9IGluZm9fZWxlbWVudC0+ZGF0YVswXTsKLQkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJNRklFX1RZUEVfSUJTU19TRVQ6ICVkXG4iLAotCQkJCQkgICAgIG5ldHdvcmstPmF0aW1fd2luZG93KTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTUZJRV9UWVBFX0NIQUxMRU5HRToKLQkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJNRklFX1RZUEVfQ0hBTExFTkdFOiBpZ25vcmVkXG4iKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgTUZJRV9UWVBFX0dFTkVSSUM6Ci0JCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiTUZJRV9UWVBFX0dFTkVSSUM6ICVkIGJ5dGVzXG4iLAotCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKLQkJCWlmICghaWVlZTgwMjExX3BhcnNlX3Fvc19pbmZvX3BhcmFtX0lFKGluZm9fZWxlbWVudCwKLQkJCQkJCQkgICAgICAgbmV0d29yaykpCi0JCQkJYnJlYWs7Ci0KLQkJCWlmIChpbmZvX2VsZW1lbnQtPmxlbiA+PSA0ICYmCi0JCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKLQkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHg1MCAmJgotCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweGYyICYmCi0JCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDEpIHsKLQkJCQluZXR3b3JrLT53cGFfaWVfbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuICsgMiwKLQkJCQkJCQkgIE1BWF9XUEFfSUVfTEVOKTsKLQkJCQltZW1jcHkobmV0d29yay0+d3BhX2llLCBpbmZvX2VsZW1lbnQsCi0JCQkJICAgICAgIG5ldHdvcmstPndwYV9pZV9sZW4pOwotCQkJCWJyZWFrOwotCQkJfQotCi0jaWZkZWYgVEhPTUFTX1RVUkJPCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mb19lbGVtZW50LT5sZW4gPT0gNyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4ZTAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHg0YyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDAxICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19lbGVtZW50LT5kYXRhWzRdID09IDB4MDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yay0+VHVyYm9fRW5hYmxlID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgICAgICAgICAvL2ZvciBIVGNhcCBhbmQgSFRpbmZvIHBhcmFtZXRlcnMKLQkJCWlmKHRtcF9odGNhcF9sZW4gPT0gMCl7Ci0JCQkJaWYoaW5mb19lbGVtZW50LT5sZW4gPj0gNCAmJgotCQkJCSAgIGluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCi0JCQkJICAgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4OTAgJiYKLQkJCQkgICBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHg0YyAmJgotCQkJCSAgIGluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDAzMyl7Ci0KLQkJCQkJCXRtcF9odGNhcF9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sKHU4KU1BWF9JRV9MRU4pOwotCQkJCSAgIAkJaWYodG1wX2h0Y2FwX2xlbiAhPSAwKXsKLQkJCQkgICAJCQluZXR3b3JrLT5ic3NodC5iZEhUU3BlY1ZlciA9IEhUX1NQRUNfVkVSX0VXQzsKLQkJCQkJCQluZXR3b3JrLT5ic3NodC5iZEhUQ2FwTGVuID0gdG1wX2h0Y2FwX2xlbiA+IHNpemVvZihuZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmKT9cCi0JCQkJCQkJCXNpemVvZihuZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmKTp0bXBfaHRjYXBfbGVuOwotCQkJCQkJCW1lbWNweShuZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmLGluZm9fZWxlbWVudC0+ZGF0YSxuZXR3b3JrLT5ic3NodC5iZEhUQ2FwTGVuKTsKLQkJCQkgICAJCX0KLQkJCQl9Ci0JCQkJaWYodG1wX2h0Y2FwX2xlbiAhPSAwKQotCQkJCQluZXR3b3JrLT5ic3NodC5iZFN1cHBvcnRIVCA9IHRydWU7Ci0JCQkJZWxzZQotCQkJCQluZXR3b3JrLT5ic3NodC5iZFN1cHBvcnRIVCA9IGZhbHNlOwotCQkJfQotCi0KLQkJCWlmKHRtcF9odGluZm9fbGVuID09IDApewotCQkJCWlmKGluZm9fZWxlbWVudC0+bGVuID49IDQgJiYKLQkJCQkJaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKLQkJCQkgICAJaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4OTAgJiYKLQkJCQkgICAJaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4NGMgJiYKLQkJCQkgICAJaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDM0KXsKLQotCQkJCQkJdG1wX2h0aW5mb19sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sKHU4KU1BWF9JRV9MRU4pOwotCQkJCQkJaWYodG1wX2h0aW5mb19sZW4gIT0gMCl7Ci0JCQkJCQkJbmV0d29yay0+YnNzaHQuYmRIVFNwZWNWZXIgPSBIVF9TUEVDX1ZFUl9FV0M7Ci0JCQkJCQkJaWYodG1wX2h0aW5mb19sZW4pewotCQkJCQkJCQluZXR3b3JrLT5ic3NodC5iZEhUSW5mb0xlbiA9IHRtcF9odGluZm9fbGVuID4gc2l6ZW9mKG5ldHdvcmstPmJzc2h0LmJkSFRJbmZvQnVmKT9cCi0JCQkJCQkJCQlzaXplb2YobmV0d29yay0+YnNzaHQuYmRIVEluZm9CdWYpOnRtcF9odGluZm9fbGVuOwotCQkJCQkJCQltZW1jcHkobmV0d29yay0+YnNzaHQuYmRIVEluZm9CdWYsaW5mb19lbGVtZW50LT5kYXRhLG5ldHdvcmstPmJzc2h0LmJkSFRJbmZvTGVuKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCX0KLQotCQkJCX0KLQkJCX0KLQotCQkJaWYoaWVlZS0+YWdncmVnYXRpb24pewotCQkJCWlmKG5ldHdvcmstPmJzc2h0LmJkU3VwcG9ydEhUKXsKLQkJCQkJaWYoaW5mb19lbGVtZW50LT5sZW4gPj0gNCAmJgotCQkJCQkJaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKLQkJCQkJCWluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweGUwICYmCi0JCQkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHg0YyAmJgotCQkJCQkJaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDIpewotCi0JCQkJCQlodF9yZWFsdGVrX2FnZ19sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sKHU4KU1BWF9JRV9MRU4pOwotCQkJCQkJbWVtY3B5KGh0X3JlYWx0ZWtfYWdnX2J1ZixpbmZvX2VsZW1lbnQtPmRhdGEsaW5mb19lbGVtZW50LT5sZW4pOwotCi0JCQkJCX0KLQkJCQkJaWYoaHRfcmVhbHRla19hZ2dfbGVuID49IDUpewotCQkJCQkJbmV0d29yay0+YnNzaHQuYmRSVDJSVEFnZ3JlZ2F0aW9uID0gdHJ1ZTsKLQotCQkJCQkJaWYoKGh0X3JlYWx0ZWtfYWdnX2J1Zls0XSA9PSAxKSAmJiAoaHRfcmVhbHRla19hZ2dfYnVmWzVdICYgMHgwMikpCi0JCQkJCQluZXR3b3JrLT5ic3NodC5iZFJUMlJUTG9uZ1Nsb3RUaW1lID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCi0JCQkJaWYoKGluZm9fZWxlbWVudC0+bGVuID49IDMgJiYKLQkJCQkJIGluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCi0JCQkJCSBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHgwNSAmJgotCQkJCQkgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4YjUpIHx8Ci0JCQkJCSAoaW5mb19lbGVtZW50LT5sZW4gPj0gMyAmJgotCQkJCQkgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKLQkJCQkJIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDBhICYmCi0JCQkJCSBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHhmNykgfHwKLQkJCQkJIChpbmZvX2VsZW1lbnQtPmxlbiA+PSAzICYmCi0JCQkJCSBpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgotCQkJCQkgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4MTAgJiYKLQkJCQkJIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDE4KSl7Ci0KLQkJCQkJCW5ldHdvcmstPmJyb2FkY29tX2NhcF9leGlzdCA9IHRydWU7Ci0KLQkJCQl9Ci0KLQkJCWlmKGluZm9fZWxlbWVudC0+bGVuID49IDMgJiYKLQkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgotCQkJCWluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDBjICYmCi0JCQkJaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4NDMpCi0JCQl7Ci0JCQkJbmV0d29yay0+cmFsaW5rX2NhcF9leGlzdCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJbmV0d29yay0+cmFsaW5rX2NhcF9leGlzdCA9IGZhbHNlOwotCQkJLy9hZGRlZCBieSBhbXkgZm9yIGF0aGVyb3MgQVAKLQkJCWlmKChpbmZvX2VsZW1lbnQtPmxlbiA+PSAzICYmCi0JCQkJaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKLQkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHgwMyAmJgotCQkJCWluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDdmKSB8fAotCQkJCShpbmZvX2VsZW1lbnQtPmxlbiA+PSAzICYmCi0JCQkJaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKLQkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHgxMyAmJgotCQkJCWluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDc0KSkKLQkJCXsKLQkJCQluZXR3b3JrLT5hdGhlcm9zX2NhcF9leGlzdCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJbmV0d29yay0+YXRoZXJvc19jYXBfZXhpc3QgPSBmYWxzZTsKLQotCQkJaWYgKChpbmZvX2VsZW1lbnQtPmxlbiA+PSAzICYmCi0JCQkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgotCQkJCQkJaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4NTAgJiYKLQkJCQkJCWluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDQzKSApCi0JCQl7Ci0JCQkJbmV0d29yay0+bWFydmVsbF9jYXBfZXhpc3QgPSB0cnVlOwotCQkJfQotCi0KLQkJCWlmKGluZm9fZWxlbWVudC0+bGVuID49IDMgJiYKLQkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgotCQkJCWluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDQwICYmCi0JCQkJaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4OTYpCi0JCQl7Ci0JCQkJbmV0d29yay0+Y2lzY29fY2FwX2V4aXN0ID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UKLQkJCQluZXR3b3JrLT5jaXNjb19jYXBfZXhpc3QgPSBmYWxzZTsKLQkJCS8vYWRkZWQgYnkgYW15IGZvciBMRUFQIG9mIGNpc2NvCi0JCQlpZihpbmZvX2VsZW1lbnQtPmxlbiA+IDQgJiYKLQkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgotCQkJCWluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDQwICYmCi0JCQkJaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4OTYgJiYKLQkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbM10gPT0gMHgwMSkKLQkJCXsKLQkJCQlpZihpbmZvX2VsZW1lbnQtPmxlbiA9PSA2KQotCQkJCXsKLQkJCQkJbWVtY3B5KG5ldHdvcmstPkNjeFJtU3RhdGUsICZpbmZvX2VsZW1lbnRbNF0sIDIpOwotCQkJCQlpZihuZXR3b3JrLT5DY3hSbVN0YXRlWzBdICE9IDApCi0JCQkJCXsKLQkJCQkJCW5ldHdvcmstPmJDY3hSbUVuYWJsZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJbmV0d29yay0+YkNjeFJtRW5hYmxlID0gZmFsc2U7Ci0JCQkJCS8vCi0JCQkJCS8vIENDWHY0IFRhYmxlIDU5LTEgTUJTU0lEIE1hc2tzLgotCQkJCQkvLwotCQkJCQluZXR3b3JrLT5NQnNzaWRNYXNrID0gbmV0d29yay0+Q2N4Um1TdGF0ZVsxXSAmIDB4MDc7Ci0JCQkJCWlmKG5ldHdvcmstPk1Cc3NpZE1hc2sgIT0gMCkKLQkJCQkJewotCQkJCQkJbmV0d29yay0+Yk1Cc3NpZFZhbGlkID0gdHJ1ZTsKLQkJCQkJCW5ldHdvcmstPk1Cc3NpZE1hc2sgPSAweGZmIDw8IChuZXR3b3JrLT5NQnNzaWRNYXNrKTsKLQkJCQkJCWNwTWFjQWRkcihuZXR3b3JrLT5NQnNzaWQsIG5ldHdvcmstPmJzc2lkKTsKLQkJCQkJCW5ldHdvcmstPk1Cc3NpZFs1XSAmPSBuZXR3b3JrLT5NQnNzaWRNYXNrOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJbmV0d29yay0+Yk1Cc3NpZFZhbGlkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJbmV0d29yay0+YkNjeFJtRW5hYmxlID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYoaW5mb19lbGVtZW50LT5sZW4gPiA0ICAmJgotCQkJCWluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCi0JCQkJaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4NDAgJiYKLQkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHg5NiAmJgotCQkJCWluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDAzKQotCQkJewotCQkJCWlmKGluZm9fZWxlbWVudC0+bGVuID09IDUpCi0JCQkJewotCQkJCQluZXR3b3JrLT5iV2l0aENjeFZlck51bSA9IHRydWU7Ci0JCQkJCW5ldHdvcmstPkJzc0NjeFZlck51bWJlciA9IGluZm9fZWxlbWVudC0+ZGF0YVs0XTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJbmV0d29yay0+YldpdGhDY3hWZXJOdW0gPSBmYWxzZTsKLQkJCQkJbmV0d29yay0+QnNzQ2N4VmVyTnVtYmVyID0gMDsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIE1GSUVfVFlQRV9SU046Ci0JCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiTUZJRV9UWVBFX1JTTjogJWQgYnl0ZXNcbiIsCi0JCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pOwotCQkJbmV0d29yay0+cnNuX2llX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiArIDIsCi0JCQkJCQkgIE1BWF9XUEFfSUVfTEVOKTsKLQkJCW1lbWNweShuZXR3b3JrLT5yc25faWUsIGluZm9fZWxlbWVudCwKLQkJCSAgICAgICBuZXR3b3JrLT5yc25faWVfbGVuKTsKLQkJCWJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvL0hUIHJlbGF0ZWQgZWxlbWVudC4KLQkJY2FzZSBNRklFX1RZUEVfSFRfQ0FQOgotCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9IVF9DQVA6ICVkIGJ5dGVzXG4iLAotCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKLQkJCXRtcF9odGNhcF9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sKHU4KU1BWF9JRV9MRU4pOwotCQkJaWYodG1wX2h0Y2FwX2xlbiAhPSAwKXsKLQkJCQluZXR3b3JrLT5ic3NodC5iZEhUU3BlY1ZlciA9IEhUX1NQRUNfVkVSX0VXQzsKLQkJCQluZXR3b3JrLT5ic3NodC5iZEhUQ2FwTGVuID0gdG1wX2h0Y2FwX2xlbiA+IHNpemVvZihuZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmKT9cCi0JCQkJCXNpemVvZihuZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmKTp0bXBfaHRjYXBfbGVuOwotCQkJCW1lbWNweShuZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmLGluZm9fZWxlbWVudC0+ZGF0YSxuZXR3b3JrLT5ic3NodC5iZEhUQ2FwTGVuKTsKLQotCQkJCS8vSWYgcGVlciBpcyBIVCwgYnV0IG5vdCBXTU0sIGNhbGwgUW9zU2V0TGVnYWN5V01NUGFyYW1XaXRoSFQoKQotCQkJCS8vIHdpbmRvd3MgZHJpdmVyIHdpbGwgdXBkYXRlIFdNTSBwYXJhbWV0ZXJzIGVhY2ggYmVhY29uIHJlY2VpdmVkIG9uY2UgY29ubmVjdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExpbnV4IGRyaXZlciBpcyBhIGJpdCBkaWZmZXJlbnQuCi0JCQkJbmV0d29yay0+YnNzaHQuYmRTdXBwb3J0SFQgPSB0cnVlOwotCQkJfQotCQkJZWxzZQotCQkJCW5ldHdvcmstPmJzc2h0LmJkU3VwcG9ydEhUID0gZmFsc2U7Ci0JCQlicmVhazsKLQotCi0JCWNhc2UgTUZJRV9UWVBFX0hUX0lORk86Ci0JCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0hUX0lORk86ICVkIGJ5dGVzXG4iLAotCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKLQkJCXRtcF9odGluZm9fbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuLCh1OClNQVhfSUVfTEVOKTsKLQkJCWlmKHRtcF9odGluZm9fbGVuKXsKLQkJCQluZXR3b3JrLT5ic3NodC5iZEhUU3BlY1ZlciA9IEhUX1NQRUNfVkVSX0lFRUU7Ci0JCQkJbmV0d29yay0+YnNzaHQuYmRIVEluZm9MZW4gPSB0bXBfaHRpbmZvX2xlbiA+IHNpemVvZihuZXR3b3JrLT5ic3NodC5iZEhUSW5mb0J1Zik/XAotCQkJCQlzaXplb2YobmV0d29yay0+YnNzaHQuYmRIVEluZm9CdWYpOnRtcF9odGluZm9fbGVuOwotCQkJCW1lbWNweShuZXR3b3JrLT5ic3NodC5iZEhUSW5mb0J1ZixpbmZvX2VsZW1lbnQtPmRhdGEsbmV0d29yay0+YnNzaHQuYmRIVEluZm9MZW4pOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBNRklFX1RZUEVfQUlST05FVDoKLQkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJNRklFX1RZUEVfQUlST05FVDogJWQgYnl0ZXNcbiIsCi0JCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pOwotCQkJaWYoaW5mb19lbGVtZW50LT5sZW4gPklFX0NJU0NPX0ZMQUdfUE9TSVRJT04pCi0JCQl7Ci0JCQkJbmV0d29yay0+YldpdGhBaXJvbmV0SUUgPSB0cnVlOwotCi0JCQkJLy8gQ0NYIDEgc3BlYyB2MS4xMywgQTAxLjEgQ0tJUCBOZWdvdGlhdGlvbiAocGFnZTIzKToKLQkJCQkvLyAiQSBDaXNjbyBhY2Nlc3MgcG9pbnQgYWR2ZXJ0aXNlcyBzdXBwb3J0IGZvciBDS0lQIGluIGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UgcGFja2V0cywKLQkJCQkvLyAgYnkgYWRkaW5nIGFuIEFpcm9uZXQgZWxlbWVudCBhbmQgc2V0dGluZyBvbmUgb3IgYm90aCBvZiB0aGUgQ0tJUCBuZWdvdGlhdGlvbiBiaXRzLiIKLQkJCQlpZigJKGluZm9fZWxlbWVudC0+ZGF0YVtJRV9DSVNDT19GTEFHX1BPU0lUSU9OXSZTVVBQT1JUX0NLSVBfTUlDKQl8fAotCQkJCQkoaW5mb19lbGVtZW50LT5kYXRhW0lFX0NJU0NPX0ZMQUdfUE9TSVRJT05dJlNVUFBPUlRfQ0tJUF9QSykJKQotCQkJCXsKLQkJIAkJCW5ldHdvcmstPmJDa2lwU3VwcG9ydGVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJbmV0d29yay0+YkNraXBTdXBwb3J0ZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJbmV0d29yay0+YldpdGhBaXJvbmV0SUUgPSBmYWxzZTsKLQkJIAkJbmV0d29yay0+YkNraXBTdXBwb3J0ZWQgPSBmYWxzZTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIE1GSUVfVFlQRV9RT1NfUEFSQU1FVEVSOgotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgICAgIlFvUyBFcnJvciBuZWVkIHRvIHBhcnNlIFFPU19QQVJBTUVURVIgSUVcbiIpOwotCQkJYnJlYWs7Ci0KLSNpZmRlZiBFTkFCTEVfRE9UMTFECi0JCWNhc2UgTUZJRV9UWVBFX0NPVU5UUlk6Ci0JCQlJRUVFODAyMTFfREVCVUdfU0NBTigiTUZJRV9UWVBFX0NPVU5UUlk6ICVkIGJ5dGVzXG4iLAotCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKLQkJCWllZWU4MDIxMV9leHRyYWN0X2NvdW50cnlfaWUoaWVlZSwgaW5mb19lbGVtZW50LCBuZXR3b3JrLCBuZXR3b3JrLT5ic3NpZCk7Ly9hZGRyMiBpcyBzYW1lIGFzIGFkZHIzIHdoZW4gZnJvbSBhbiBBUAotCQkJYnJlYWs7Ci0jZW5kaWYKLQotCQlkZWZhdWx0OgotCQkJSUVFRTgwMjExX0RFQlVHX01HTVQKLQkJCSAgICAoIlVuc3VwcG9ydGVkIGluZm8gZWxlbWVudDogJXMgKCVkKVxuIiwKLQkJCSAgICAgZ2V0X2luZm9fZWxlbWVudF9zdHJpbmcoaW5mb19lbGVtZW50LT5pZCksCi0JCQkgICAgIGluZm9fZWxlbWVudC0+aWQpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlsZW5ndGggLT0gc2l6ZW9mKCppbmZvX2VsZW1lbnQpICsgaW5mb19lbGVtZW50LT5sZW47Ci0JCWluZm9fZWxlbWVudCA9Ci0JCSAgICAoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKikmaW5mb19lbGVtZW50LT4KLQkJICAgIGRhdGFbaW5mb19lbGVtZW50LT5sZW5dOwotCX0KLQotCWlmKCFuZXR3b3JrLT5hdGhlcm9zX2NhcF9leGlzdCAmJiAhbmV0d29yay0+YnJvYWRjb21fY2FwX2V4aXN0ICYmCi0JCSFuZXR3b3JrLT5jaXNjb19jYXBfZXhpc3QgJiYgIW5ldHdvcmstPnJhbGlua19jYXBfZXhpc3QgJiYgIW5ldHdvcmstPmJzc2h0LmJkUlQyUlRBZ2dyZWdhdGlvbiAmJgotCQkhbmV0d29yay0+bWFydmVsbF9jYXBfZXhpc3QpCi0JewotCQluZXR3b3JrLT51bmtub3duX2NhcF9leGlzdCA9IHRydWU7Ci0JfQotCWVsc2UKLQl7Ci0JCW5ldHdvcmstPnVua25vd25fY2FwX2V4aXN0ID0gZmFsc2U7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHU4IGllZWU4MDIxMV9TaWduYWxTdHJlbmd0aFRyYW5zbGF0ZSgKLQl1OCAgQ3VyclNTCi0JKQotewotCXU4IFJldFNTOwotCi0JLy8gU3RlcCAxLiBTY2FsZSBtYXBwaW5nLgotCWlmKEN1cnJTUyA+PSA3MSAmJiBDdXJyU1MgPD0gMTAwKQotCXsKLQkJUmV0U1MgPSA5MCArICgoQ3VyclNTIC0gNzApIC8gMyk7Ci0JfQotCWVsc2UgaWYoQ3VyclNTID49IDQxICYmIEN1cnJTUyA8PSA3MCkKLQl7Ci0JCVJldFNTID0gNzggKyAoKEN1cnJTUyAtIDQwKSAvIDMpOwotCX0KLQllbHNlIGlmKEN1cnJTUyA+PSAzMSAmJiBDdXJyU1MgPD0gNDApCi0JewotCQlSZXRTUyA9IDY2ICsgKEN1cnJTUyAtIDMwKTsKLQl9Ci0JZWxzZSBpZihDdXJyU1MgPj0gMjEgJiYgQ3VyclNTIDw9IDMwKQotCXsKLQkJUmV0U1MgPSA1NCArIChDdXJyU1MgLSAyMCk7Ci0JfQotCWVsc2UgaWYoQ3VyclNTID49IDUgJiYgQ3VyclNTIDw9IDIwKQotCXsKLQkJUmV0U1MgPSA0MiArICgoKEN1cnJTUyAtIDUpICogMikgLyAzKTsKLQl9Ci0JZWxzZSBpZihDdXJyU1MgPT0gNCkKLQl7Ci0JCVJldFNTID0gMzY7Ci0JfQotCWVsc2UgaWYoQ3VyclNTID09IDMpCi0JewotCQlSZXRTUyA9IDI3OwotCX0KLQllbHNlIGlmKEN1cnJTUyA9PSAyKQotCXsKLQkJUmV0U1MgPSAxODsKLQl9Ci0JZWxzZSBpZihDdXJyU1MgPT0gMSkKLQl7Ci0JCVJldFNTID0gOTsKLQl9Ci0JZWxzZQotCXsKLQkJUmV0U1MgPSBDdXJyU1M7Ci0JfQotCi0JcmV0dXJuIFJldFNTOwotfQotCi1sb25nIGllZWU4MDIxMV90cmFuc2xhdGVfdG9kYm0odTggc2lnbmFsX3N0cmVuZ3RoX2luZGV4CSkvLyAwLTEwMCBpbmRleC4KLXsKLQlsb25nCXNpZ25hbF9wb3dlcjsgLy8gaW4gZEJtLgotCi0JLy8gVHJhbnNsYXRlIHRvIGRCbSAoeD0wLjV5LTk1KS4KLQlzaWduYWxfcG93ZXIgPSAobG9uZykoKHNpZ25hbF9zdHJlbmd0aF9pbmRleCArIDEpID4+IDEpOwotCXNpZ25hbF9wb3dlciAtPSA5NTsKLQotCXJldHVybiBzaWduYWxfcG93ZXI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGllZWU4MDIxMV9uZXR3b3JrX2luaXQoCi0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0Jc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqYmVhY29uLAotCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaywKLQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cykKLXsKLSAgICAgICAgbmV0d29yay0+cW9zX2RhdGEuYWN0aXZlID0gMDsKLSAgICAgICAgbmV0d29yay0+cW9zX2RhdGEuc3VwcG9ydGVkID0gMDsKLSAgICAgICAgbmV0d29yay0+cW9zX2RhdGEucGFyYW1fY291bnQgPSAwOwotICAgICAgICBuZXR3b3JrLT5xb3NfZGF0YS5vbGRfcGFyYW1fY291bnQgPSAwOwotCi0JLyogUHVsbCBvdXQgZml4ZWQgZmllbGQgZGF0YSAqLwotCW1lbWNweShuZXR3b3JrLT5ic3NpZCwgYmVhY29uLT5oZWFkZXIuYWRkcjMsIEVUSF9BTEVOKTsKLQluZXR3b3JrLT5jYXBhYmlsaXR5ID0gbGUxNl90b19jcHUoYmVhY29uLT5jYXBhYmlsaXR5KTsKLQluZXR3b3JrLT5sYXN0X3NjYW5uZWQgPSBqaWZmaWVzOwotCW5ldHdvcmstPnRpbWVfc3RhbXBbMF0gPSBsZTMyX3RvX2NwdShiZWFjb24tPnRpbWVfc3RhbXBbMF0pOwotCW5ldHdvcmstPnRpbWVfc3RhbXBbMV0gPSBsZTMyX3RvX2NwdShiZWFjb24tPnRpbWVfc3RhbXBbMV0pOwotCW5ldHdvcmstPmJlYWNvbl9pbnRlcnZhbCA9IGxlMzJfdG9fY3B1KGJlYWNvbi0+YmVhY29uX2ludGVydmFsKTsKLQkvKiBXaGVyZSB0byBwdWxsIHRoaXM/IGJlYWNvbi0+bGlzdGVuX2ludGVydmFsOyovCi0JbmV0d29yay0+bGlzdGVuX2ludGVydmFsID0gMHgwQTsKLQluZXR3b3JrLT5yYXRlc19sZW4gPSBuZXR3b3JrLT5yYXRlc19leF9sZW4gPSAwOwotCW5ldHdvcmstPmxhc3RfYXNzb2NpYXRlID0gMDsKLQluZXR3b3JrLT5zc2lkX2xlbiA9IDA7Ci0JbmV0d29yay0+ZmxhZ3MgPSAwOwotCW5ldHdvcmstPmF0aW1fd2luZG93ID0gMDsKLQluZXR3b3JrLT5lcnBfdmFsdWUgPSAobmV0d29yay0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSA/Ci0gICAgICAgICAgICAweDMgOiAweDA7Ci0JbmV0d29yay0+YmVycF9pbmZvX3ZhbGlkID0gZmFsc2U7Ci0gICAgICAgIG5ldHdvcmstPmJyb2FkY29tX2NhcF9leGlzdCA9IGZhbHNlOwotCW5ldHdvcmstPnJhbGlua19jYXBfZXhpc3QgPSBmYWxzZTsKLQluZXR3b3JrLT5hdGhlcm9zX2NhcF9leGlzdCA9IGZhbHNlOwotCW5ldHdvcmstPm1hcnZlbGxfY2FwX2V4aXN0ID0gZmFsc2U7Ci0JbmV0d29yay0+Y2lzY29fY2FwX2V4aXN0ID0gZmFsc2U7Ci0JbmV0d29yay0+dW5rbm93bl9jYXBfZXhpc3QgPSBmYWxzZTsKLSNpZmRlZiBUSE9NQVNfVFVSQk8KLQluZXR3b3JrLT5UdXJib19FbmFibGUgPSAwOwotI2VuZGlmCi0jaWZkZWYgRU5BQkxFX0RPVDExRAotCW5ldHdvcmstPkNvdW50cnlJZUxlbiA9IDA7Ci0JbWVtc2V0KG5ldHdvcmstPkNvdW50cnlJZUJ1ZiwgMCwgTUFYX0lFX0xFTik7Ci0jZW5kaWYKLS8vSW5pdGlhbGl6ZSBIVCBwYXJhbWV0ZXJzCi0JSFRJbml0aWFsaXplQnNzRGVzYygmbmV0d29yay0+YnNzaHQpOwotCWlmIChzdGF0cy0+ZnJlcSA9PSBJRUVFODAyMTFfNTJHSFpfQkFORCkgewotCQkvKiBmb3IgQSBiYW5kIChObyBEUyBpbmZvKSAqLwotCQluZXR3b3JrLT5jaGFubmVsID0gc3RhdHMtPnJlY2VpdmVkX2NoYW5uZWw7Ci0JfSBlbHNlCi0JCW5ldHdvcmstPmZsYWdzIHw9IE5FVFdPUktfSEFTX0NDSzsKLQotIAluZXR3b3JrLT53cGFfaWVfbGVuID0gMDsKLSAJbmV0d29yay0+cnNuX2llX2xlbiA9IDA7Ci0KLSAgICAgICAgaWYgKGllZWU4MDIxMV9wYXJzZV9pbmZvX3BhcmFtCi0gICAgICAgICAgICAoaWVlZSxiZWFjb24tPmluZm9fZWxlbWVudCwgc3RhdHMtPmxlbiAtIHNpemVvZigqYmVhY29uKSwgbmV0d29yaywgc3RhdHMpKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotCi0JbmV0d29yay0+bW9kZSA9IDA7Ci0JaWYgKHN0YXRzLT5mcmVxID09IElFRUU4MDIxMV81MkdIWl9CQU5EKQotCQluZXR3b3JrLT5tb2RlID0gSUVFRV9BOwotCWVsc2UgewotCQlpZiAobmV0d29yay0+ZmxhZ3MgJiBORVRXT1JLX0hBU19PRkRNKQotCQkJbmV0d29yay0+bW9kZSB8PSBJRUVFX0c7Ci0JCWlmIChuZXR3b3JrLT5mbGFncyAmIE5FVFdPUktfSEFTX0NDSykKLQkJCW5ldHdvcmstPm1vZGUgfD0gSUVFRV9COwotCX0KLQotCWlmIChuZXR3b3JrLT5tb2RlID09IDApIHsKLQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIkZpbHRlcmVkIG91dCAnJXMgKCVwTSknICIKLQkJCQkgICAgICJuZXR3b3JrLlxuIiwKLQkJCQkgICAgIGVzY2FwZV9lc3NpZChuZXR3b3JrLT5zc2lkLAotCQkJCQkJICBuZXR3b3JrLT5zc2lkX2xlbiksCi0JCQkJICAgICBuZXR3b3JrLT5ic3NpZCk7Ci0JCXJldHVybiAxOwotCX0KLQotCWlmKG5ldHdvcmstPmJzc2h0LmJkU3VwcG9ydEhUKXsKLQkJaWYobmV0d29yay0+bW9kZSA9PSBJRUVFX0EpCi0JCQluZXR3b3JrLT5tb2RlID0gSUVFRV9OXzVHOwotCQllbHNlIGlmKG5ldHdvcmstPm1vZGUgJiAoSUVFRV9HIHwgSUVFRV9CKSkKLQkJCW5ldHdvcmstPm1vZGUgPSBJRUVFX05fMjRHOwotCX0KLQlpZiAoaWVlZTgwMjExX2lzX2VtcHR5X2Vzc2lkKG5ldHdvcmstPnNzaWQsIG5ldHdvcmstPnNzaWRfbGVuKSkKLQkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19FTVBUWV9FU1NJRDsKLQotCXN0YXRzLT5zaWduYWwgPSAzMCArIChzdGF0cy0+U2lnbmFsU3RyZW5ndGggKiA3MCkgLyAxMDA7Ci0Jc3RhdHMtPm5vaXNlID0gaWVlZTgwMjExX3RyYW5zbGF0ZV90b2RibSgodTgpKDEwMC1zdGF0cy0+c2lnbmFsKSkgLTI1OwotCi0JbWVtY3B5KCZuZXR3b3JrLT5zdGF0cywgc3RhdHMsIHNpemVvZihuZXR3b3JrLT5zdGF0cykpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGlzX3NhbWVfbmV0d29yayhzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnNyYywKLQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqZHN0LCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSkKLXsKLQkvKiBBIG5ldHdvcmsgaXMgb25seSBhIGR1cGxpY2F0ZSBpZiB0aGUgY2hhbm5lbCwgQlNTSUQsIEVTU0lECi0JICogYW5kIHRoZSBjYXBhYmlsaXR5IGZpZWxkIChpbiBwYXJ0aWN1bGFyIElCU1MgYW5kIEJTUykgYWxsIG1hdGNoLgotCSAqIFdlIHRyZWF0IGFsbCA8aGlkZGVuPiB3aXRoIHRoZSBzYW1lIEJTU0lEIGFuZCBjaGFubmVsCi0JICogYXMgb25lIG5ldHdvcmsgKi8KLQlyZXR1cm4gKCgoc3JjLT5zc2lkX2xlbiA9PSBkc3QtPnNzaWRfbGVuKSB8fCAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSkgJiYKLQkJKHNyYy0+Y2hhbm5lbCA9PSBkc3QtPmNoYW5uZWwpICYmCi0JCSFtZW1jbXAoc3JjLT5ic3NpZCwgZHN0LT5ic3NpZCwgRVRIX0FMRU4pICYmCi0JCSghbWVtY21wKHNyYy0+c3NpZCwgZHN0LT5zc2lkLCBzcmMtPnNzaWRfbGVuKSB8fCAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSkgJiYKLQkJKChzcmMtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykgPT0KLQkJKGRzdC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkgJiYKLQkJKChzcmMtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfQlNTKSA9PQotCQkoZHN0LT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0JTUykpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9uZXR3b3JrKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqZHN0LAotCQkJCSAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpzcmMpCi17Ci0JaW50IHFvc19hY3RpdmU7Ci0JdTggb2xkX3BhcmFtOwotCi0JbWVtY3B5KCZkc3QtPnN0YXRzLCAmc3JjLT5zdGF0cywgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMpKTsKLQlkc3QtPmNhcGFiaWxpdHkgPSBzcmMtPmNhcGFiaWxpdHk7Ci0JbWVtY3B5KGRzdC0+cmF0ZXMsIHNyYy0+cmF0ZXMsIHNyYy0+cmF0ZXNfbGVuKTsKLQlkc3QtPnJhdGVzX2xlbiA9IHNyYy0+cmF0ZXNfbGVuOwotCW1lbWNweShkc3QtPnJhdGVzX2V4LCBzcmMtPnJhdGVzX2V4LCBzcmMtPnJhdGVzX2V4X2xlbik7Ci0JZHN0LT5yYXRlc19leF9sZW4gPSBzcmMtPnJhdGVzX2V4X2xlbjsKLQlpZihzcmMtPnNzaWRfbGVuID4gMCkKLQl7Ci0JCW1lbXNldChkc3QtPnNzaWQsIDAsIGRzdC0+c3NpZF9sZW4pOwotCQlkc3QtPnNzaWRfbGVuID0gc3JjLT5zc2lkX2xlbjsKLQkJbWVtY3B5KGRzdC0+c3NpZCwgc3JjLT5zc2lkLCBzcmMtPnNzaWRfbGVuKTsKLQl9Ci0JZHN0LT5tb2RlID0gc3JjLT5tb2RlOwotCWRzdC0+ZmxhZ3MgPSBzcmMtPmZsYWdzOwotCWRzdC0+dGltZV9zdGFtcFswXSA9IHNyYy0+dGltZV9zdGFtcFswXTsKLQlkc3QtPnRpbWVfc3RhbXBbMV0gPSBzcmMtPnRpbWVfc3RhbXBbMV07Ci0JaWYgKHNyYy0+ZmxhZ3MgJiBORVRXT1JLX0hBU19FUlBfVkFMVUUpCi0JewotCQlkc3QtPmVycF92YWx1ZSA9IHNyYy0+ZXJwX3ZhbHVlOwotCQlkc3QtPmJlcnBfaW5mb192YWxpZCA9IHNyYy0+YmVycF9pbmZvX3ZhbGlkID0gdHJ1ZTsKLQl9Ci0JZHN0LT5iZWFjb25faW50ZXJ2YWwgPSBzcmMtPmJlYWNvbl9pbnRlcnZhbDsKLQlkc3QtPmxpc3Rlbl9pbnRlcnZhbCA9IHNyYy0+bGlzdGVuX2ludGVydmFsOwotCWRzdC0+YXRpbV93aW5kb3cgPSBzcmMtPmF0aW1fd2luZG93OwotCWRzdC0+ZHRpbV9wZXJpb2QgPSBzcmMtPmR0aW1fcGVyaW9kOwotCWRzdC0+ZHRpbV9kYXRhID0gc3JjLT5kdGltX2RhdGE7Ci0JZHN0LT5sYXN0X2R0aW1fc3RhX3RpbWVbMF0gPSBzcmMtPmxhc3RfZHRpbV9zdGFfdGltZVswXTsKLQlkc3QtPmxhc3RfZHRpbV9zdGFfdGltZVsxXSA9IHNyYy0+bGFzdF9kdGltX3N0YV90aW1lWzFdOwotCW1lbWNweSgmZHN0LT50aW0sICZzcmMtPnRpbSwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfdGltX3BhcmFtZXRlcnMpKTsKLQotICAgICAgICBkc3QtPmJzc2h0LmJkU3VwcG9ydEhUID0gc3JjLT5ic3NodC5iZFN1cHBvcnRIVDsKLQlkc3QtPmJzc2h0LmJkUlQyUlRBZ2dyZWdhdGlvbiA9IHNyYy0+YnNzaHQuYmRSVDJSVEFnZ3JlZ2F0aW9uOwotCWRzdC0+YnNzaHQuYmRIVENhcExlbj0gc3JjLT5ic3NodC5iZEhUQ2FwTGVuOwotCW1lbWNweShkc3QtPmJzc2h0LmJkSFRDYXBCdWYsc3JjLT5ic3NodC5iZEhUQ2FwQnVmLHNyYy0+YnNzaHQuYmRIVENhcExlbik7Ci0JZHN0LT5ic3NodC5iZEhUSW5mb0xlbj0gc3JjLT5ic3NodC5iZEhUSW5mb0xlbjsKLQltZW1jcHkoZHN0LT5ic3NodC5iZEhUSW5mb0J1ZixzcmMtPmJzc2h0LmJkSFRJbmZvQnVmLHNyYy0+YnNzaHQuYmRIVEluZm9MZW4pOwotCWRzdC0+YnNzaHQuYmRIVFNwZWNWZXIgPSBzcmMtPmJzc2h0LmJkSFRTcGVjVmVyOwotCWRzdC0+YnNzaHQuYmRSVDJSVExvbmdTbG90VGltZSA9IHNyYy0+YnNzaHQuYmRSVDJSVExvbmdTbG90VGltZTsKLQlkc3QtPmJyb2FkY29tX2NhcF9leGlzdCA9IHNyYy0+YnJvYWRjb21fY2FwX2V4aXN0OwotCWRzdC0+cmFsaW5rX2NhcF9leGlzdCA9IHNyYy0+cmFsaW5rX2NhcF9leGlzdDsKLQlkc3QtPmF0aGVyb3NfY2FwX2V4aXN0ID0gc3JjLT5hdGhlcm9zX2NhcF9leGlzdDsKLQlkc3QtPm1hcnZlbGxfY2FwX2V4aXN0ID0gc3JjLT5tYXJ2ZWxsX2NhcF9leGlzdDsKLQlkc3QtPmNpc2NvX2NhcF9leGlzdCA9IHNyYy0+Y2lzY29fY2FwX2V4aXN0OwotCWRzdC0+dW5rbm93bl9jYXBfZXhpc3QgPSBzcmMtPnVua25vd25fY2FwX2V4aXN0OwotCW1lbWNweShkc3QtPndwYV9pZSwgc3JjLT53cGFfaWUsIHNyYy0+d3BhX2llX2xlbik7Ci0JZHN0LT53cGFfaWVfbGVuID0gc3JjLT53cGFfaWVfbGVuOwotCW1lbWNweShkc3QtPnJzbl9pZSwgc3JjLT5yc25faWUsIHNyYy0+cnNuX2llX2xlbik7Ci0JZHN0LT5yc25faWVfbGVuID0gc3JjLT5yc25faWVfbGVuOwotCi0JZHN0LT5sYXN0X3NjYW5uZWQgPSBqaWZmaWVzOwotCS8qIHFvcyByZWxhdGVkIHBhcmFtZXRlcnMgKi8KLQlxb3NfYWN0aXZlID0gZHN0LT5xb3NfZGF0YS5hY3RpdmU7Ci0Jb2xkX3BhcmFtID0gZHN0LT5xb3NfZGF0YS5wYXJhbV9jb3VudDsKLQlpZihkc3QtPmZsYWdzICYgTkVUV09SS19IQVNfUU9TX01BU0spewotICAgICAgICAvL25vdCB1cGRhdGUgUU9TIHBhcmFtdGVyIGluIGJlYWNvbiwgYXMgbW9zdCBBUCB3aWxsIHNldCBhbGwgdGhlc2UgcGFyYW1ldGVyIHRvIDAuLy9XQgotCX0KLQllbHNlIHsKLQkJZHN0LT5xb3NfZGF0YS5zdXBwb3J0ZWQgPSBzcmMtPnFvc19kYXRhLnN1cHBvcnRlZDsKLQkJZHN0LT5xb3NfZGF0YS5wYXJhbV9jb3VudCA9IHNyYy0+cW9zX2RhdGEucGFyYW1fY291bnQ7Ci0JfQotCi0JaWYoZHN0LT5xb3NfZGF0YS5zdXBwb3J0ZWQgPT0gMSkgewotCQlkc3QtPlFvU19FbmFibGUgPSAxOwotCQlpZihkc3QtPnNzaWRfbGVuKQotCQkJSUVFRTgwMjExX0RFQlVHX1FPUwotCQkJCSgiUW9TIHRoZSBuZXR3b3JrICVzIGlzIFFvUyBzdXBwb3J0ZWRcbiIsCi0JCQkJZHN0LT5zc2lkKTsKLQkJZWxzZQotCQkJSUVFRTgwMjExX0RFQlVHX1FPUwotCQkJCSgiUW9TIHRoZSBuZXR3b3JrIGlzIFFvUyBzdXBwb3J0ZWRcbiIpOwotCX0KLQlkc3QtPnFvc19kYXRhLmFjdGl2ZSA9IHFvc19hY3RpdmU7Ci0JZHN0LT5xb3NfZGF0YS5vbGRfcGFyYW1fY291bnQgPSBvbGRfcGFyYW07Ci0KLQkvKiBkc3QtPmxhc3RfYXNzb2NpYXRlIGlzIG5vdCBvdmVyd3JpdHRlbiAqLwotCWRzdC0+d21tX2luZm8gPSBzcmMtPndtbV9pbmZvOyAvL3N1cmUgdG8gZXhpc3QgaW4gYmVhY29uIG9yIHByb2JlIHJlc3BvbnNlIGZyYW1lLgotCWlmKHNyYy0+d21tX3BhcmFtWzBdLmFjX2FjaV9hY21fYWlmc258fCBcCi0JICAgc3JjLT53bW1fcGFyYW1bMV0uYWNfYWNpX2FjbV9haWZzbnx8IFwKLQkgICBzcmMtPndtbV9wYXJhbVsyXS5hY19hY2lfYWNtX2FpZnNufHwgXAotCSAgIHNyYy0+d21tX3BhcmFtWzNdLmFjX2FjaV9hY21fYWlmc24pIHsKLQkgIG1lbWNweShkc3QtPndtbV9wYXJhbSwgc3JjLT53bW1fcGFyYW0sIFdNRV9BQ19QUkFNX0xFTik7Ci0JfQotI2lmZGVmIFRIT01BU19UVVJCTwotCWRzdC0+VHVyYm9fRW5hYmxlID0gc3JjLT5UdXJib19FbmFibGU7Ci0jZW5kaWYKLQotI2lmZGVmIEVOQUJMRV9ET1QxMUQKLQlkc3QtPkNvdW50cnlJZUxlbiA9IHNyYy0+Q291bnRyeUllTGVuOwotCW1lbWNweShkc3QtPkNvdW50cnlJZUJ1Ziwgc3JjLT5Db3VudHJ5SWVCdWYsIHNyYy0+Q291bnRyeUllTGVuKTsKLSNlbmRpZgotCi0JLy9hZGRlZCBieSBhbXkgZm9yIExFQVAKLQlkc3QtPmJXaXRoQWlyb25ldElFID0gc3JjLT5iV2l0aEFpcm9uZXRJRTsKLQlkc3QtPmJDa2lwU3VwcG9ydGVkID0gc3JjLT5iQ2tpcFN1cHBvcnRlZDsKLQltZW1jcHkoZHN0LT5DY3hSbVN0YXRlLHNyYy0+Q2N4Um1TdGF0ZSwyKTsKLQlkc3QtPmJDY3hSbUVuYWJsZSA9IHNyYy0+YkNjeFJtRW5hYmxlOwotCWRzdC0+TUJzc2lkTWFzayA9IHNyYy0+TUJzc2lkTWFzazsKLQlkc3QtPmJNQnNzaWRWYWxpZCA9IHNyYy0+Yk1Cc3NpZFZhbGlkOwotCW1lbWNweShkc3QtPk1Cc3NpZCxzcmMtPk1Cc3NpZCw2KTsKLQlkc3QtPmJXaXRoQ2N4VmVyTnVtID0gc3JjLT5iV2l0aENjeFZlck51bTsKLQlkc3QtPkJzc0NjeFZlck51bWJlciA9IHNyYy0+QnNzQ2N4VmVyTnVtYmVyOwotCi19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGlzX2JlYWNvbihfX2xlMTYgZmMpCi17Ci0JcmV0dXJuIChXTEFOX0ZDX0dFVF9TVFlQRShsZTE2X3RvX2NwdShmYykpID09IElFRUU4MDIxMV9TVFlQRV9CRUFDT04pOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UoCi0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0Jc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSAqYmVhY29uLAotCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKQotewotCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXR3b3JrOwotCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqdGFyZ2V0OwotCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqb2xkZXN0ID0gTlVMTDsKLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0RFQlVHCi0Jc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgKmluZm9fZWxlbWVudCA9ICZiZWFjb24tPmluZm9fZWxlbWVudFswXTsKLSNlbmRpZgotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc2hvcnQgcmVuZXc7Ci0KLQltZW1zZXQoJm5ldHdvcmssIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspKTsKLQlJRUVFODAyMTFfREVCVUdfU0NBTigKLQkJIiclcycgKCVwTSk6ICVjJWMlYyVjICVjJWMlYyVjLSVjJWMlYyVjICVjJWMlYyVjXG4iLAotCQllc2NhcGVfZXNzaWQoaW5mb19lbGVtZW50LT5kYXRhLCBpbmZvX2VsZW1lbnQtPmxlbiksCi0JCWJlYWNvbi0+aGVhZGVyLmFkZHIzLAotCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4ZikpID8gJzEnIDogJzAnLAotCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4ZSkpID8gJzEnIDogJzAnLAotCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4ZCkpID8gJzEnIDogJzAnLAotCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4YykpID8gJzEnIDogJzAnLAotCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4YikpID8gJzEnIDogJzAnLAotCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4YSkpID8gJzEnIDogJzAnLAotCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4OSkpID8gJzEnIDogJzAnLAotCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4OCkpID8gJzEnIDogJzAnLAotCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4NykpID8gJzEnIDogJzAnLAotCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4NikpID8gJzEnIDogJzAnLAotCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4NSkpID8gJzEnIDogJzAnLAotCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4NCkpID8gJzEnIDogJzAnLAotCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4MykpID8gJzEnIDogJzAnLAotCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4MikpID8gJzEnIDogJzAnLAotCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4MSkpID8gJzEnIDogJzAnLAotCQkoYmVhY29uLT5jYXBhYmlsaXR5ICYgKDE8PDB4MCkpID8gJzEnIDogJzAnKTsKLQotCWlmIChpZWVlODAyMTFfbmV0d29ya19pbml0KGllZWUsIGJlYWNvbiwgJm5ldHdvcmssIHN0YXRzKSkgewotCQlJRUVFODAyMTFfREVCVUdfU0NBTigiRHJvcHBlZCAnJXMnICglcE0pIHZpYSAlcy5cbiIsCi0JCQkJICAgICBlc2NhcGVfZXNzaWQoaW5mb19lbGVtZW50LT5kYXRhLAotCQkJCQkJICBpbmZvX2VsZW1lbnQtPmxlbiksCi0JCQkJICAgICBiZWFjb24tPmhlYWRlci5hZGRyMywKLQkJCQkgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGJlYWNvbi0+aGVhZGVyLmZyYW1lX2N0bCkgPT0KLQkJCQkgICAgIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQID8KLQkJCQkgICAgICJQUk9CRSBSRVNQT05TRSIgOiAiQkVBQ09OIik7Ci0JCXJldHVybjsKLQl9Ci0KLSNpZmRlZiBFTkFCTEVfRE9UMTFECi0JLy8gRm9yIEFzdXMgRWVlUGMgcmVxdWVzdCwKLQkvLyAoMSkgaWYgd2lyZWxlc3MgYWRhcHRlciByZWNlaXZlIGdldCBhbnkgODAyLjExZCBjb3VudHJ5IGNvZGUgaW4gQVAgYmVhY29uLAotCS8vCSAgIHdpcmVsZXNzIGFkYXB0ZXIgc2hvdWxkIGZvbGxvdyB0aGUgY291bnRyeSBjb2RlLgotCS8vICgyKSAgSWYgdGhlcmUgaXMgbm8gYW55IGNvdW50cnkgY29kZSBpbiBiZWFjb24sCi0JLy8gICAgICAgdGhlbiB3aXJlbGVzcyBhZGFwdGVyIHNob3VsZCBkbyBhY3RpdmUgc2NhbiBmcm9tIGNoMX4xMSBhbmQKLQkvLyAgICAgICBwYXNzaXZlIHNjYW4gZnJvbSBjaDEyfjE0Ci0KLQlpZiggIUlzTGVnYWxDaGFubmVsKGllZWUsIG5ldHdvcmsuY2hhbm5lbCkgKQotCQlyZXR1cm47Ci0JaWYoaWVlZS0+Ykdsb2JhbERvbWFpbikKLQl7Ci0JCWlmIChXTEFOX0ZDX0dFVF9TVFlQRShiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpID09IElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQKQotCQl7Ci0JCQkvLyBDYXNlIDE6IENvdW50cnkgY29kZQotCQkJaWYoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSApCi0JCQl7Ci0JCQkJaWYoICFJc0xlZ2FsQ2hhbm5lbChpZWVlLCBuZXR3b3JrLmNoYW5uZWwpICkKLQkJCQl7Ci0JCQkJCXByaW50aygiR2V0U2NhbkluZm8oKTogRm9yIENvdW50cnkgY29kZSwgZmlsdGVyIHByb2JlIHJlc3BvbnNlIGF0IGNoYW5uZWwoJWQpLlxuIiwgbmV0d29yay5jaGFubmVsKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCS8vIENhc2UgMjogTm8gYW55IGNvdW50cnkgY29kZS4KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBGaWx0ZXIgb3ZlciBjaGFubmVsIGNoMTJ+MTQKLQkJCQlpZihuZXR3b3JrLmNoYW5uZWwgPiAxMSkKLQkJCQl7Ci0JCQkJCXByaW50aygiR2V0U2NhbkluZm8oKTogRm9yIEdsb2JhbCBEb21haW4sIGZpbHRlciBwcm9iZSByZXNwb25zZSBhdCBjaGFubmVsKCVkKS5cbiIsIG5ldHdvcmsuY2hhbm5lbCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLyBDYXNlIDE6IENvdW50cnkgY29kZQotCQkJaWYoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSApCi0JCQl7Ci0JCQkJaWYoICFJc0xlZ2FsQ2hhbm5lbChpZWVlLCBuZXR3b3JrLmNoYW5uZWwpICkKLQkJCQl7Ci0JCQkJCXByaW50aygiR2V0U2NhbkluZm8oKTogRm9yIENvdW50cnkgY29kZSwgZmlsdGVyIGJlYWNvbiBhdCBjaGFubmVsKCVkKS5cbiIsbmV0d29yay5jaGFubmVsKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCS8vIENhc2UgMjogTm8gYW55IGNvdW50cnkgY29kZS4KLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBGaWx0ZXIgb3ZlciBjaGFubmVsIGNoMTJ+MTQKLQkJCQlpZihuZXR3b3JrLmNoYW5uZWwgPiAxNCkKLQkJCQl7Ci0JCQkJCXByaW50aygiR2V0U2NhbkluZm8oKTogRm9yIEdsb2JhbCBEb21haW4sIGZpbHRlciBiZWFjb24gYXQgY2hhbm5lbCglZCkuXG4iLG5ldHdvcmsuY2hhbm5lbCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCS8qIFRoZSBuZXR3b3JrIHBhcnNlZCBjb3JyZWN0bHkgLS0gc28gbm93IHdlIHNjYW4gb3VyIGtub3duIG5ldHdvcmtzCi0JICogdG8gc2VlIGlmIHdlIGNhbiBmaW5kIGl0IGluIG91ciBsaXN0LgotCSAqCi0JICogTk9URTogIFRoaXMgc2VhcmNoIGlzIGRlZmluaXRlbHkgbm90IG9wdGltaXplZC4gIE9uY2UgaXRzIGRvaW5nCi0JICogICAgICAgIHRoZSAicmlnaHQgdGhpbmciIHdlJ2xsIG9wdGltaXplIGl0IGZvciBlZmZpY2llbmN5IGlmCi0JICogICAgICAgIG5lY2Vzc2FyeSAqLwotCi0JLyogU2VhcmNoIGZvciB0aGlzIGVudHJ5IGluIHRoZSBsaXN0IGFuZCB1cGRhdGUgaXQgaWYgaXQgaXMKLQkgKiBhbHJlYWR5IHRoZXJlLiAqLwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKLQotCWlmKGlzX3NhbWVfbmV0d29yaygmaWVlZS0+Y3VycmVudF9uZXR3b3JrLCAmbmV0d29yaywgaWVlZSkpIHsKLQkJdXBkYXRlX25ldHdvcmsoJmllZWUtPmN1cnJlbnRfbmV0d29yaywgJm5ldHdvcmspOwotCQlpZigoaWVlZS0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0gSUVFRV9OXzI0RyB8fCBpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX0cpCi0JCSYmIGllZWUtPmN1cnJlbnRfbmV0d29yay5iZXJwX2luZm9fdmFsaWQpewotCQlpZihpZWVlLT5jdXJyZW50X25ldHdvcmsuZXJwX3ZhbHVlJiBFUlBfVXNlUHJvdGVjdGlvbikKLQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5idXNlcHJvdGVjdGlvbiA9IHRydWU7Ci0JCWVsc2UKLQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5idXNlcHJvdGVjdGlvbiA9IGZhbHNlOwotCQl9Ci0JCWlmKGlzX2JlYWNvbihiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpKQotCQl7Ci0JCQlpZihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQotCQkJCWllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZCY25JblBlcmlvZCsrOwotCQl9Ci0JCWVsc2UgLy9oaWRkZW4gQVAKLQkJCW5ldHdvcmsuZmxhZ3MgPSAofk5FVFdPUktfRU1QVFlfRVNTSUQgJiBuZXR3b3JrLmZsYWdzKXwoTkVUV09SS19FTVBUWV9FU1NJRCAmIGllZWUtPmN1cnJlbnRfbmV0d29yay5mbGFncyk7Ci0JfQotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0YXJnZXQsICZpZWVlLT5uZXR3b3JrX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGlzX3NhbWVfbmV0d29yayh0YXJnZXQsICZuZXR3b3JrLCBpZWVlKSkKLQkJCWJyZWFrOwotCQlpZiAoKG9sZGVzdCA9PSBOVUxMKSB8fAotCQkgICAgKHRhcmdldC0+bGFzdF9zY2FubmVkIDwgb2xkZXN0LT5sYXN0X3NjYW5uZWQpKQotCQkJb2xkZXN0ID0gdGFyZ2V0OwotCX0KLQotCS8qIElmIHdlIGRpZG4ndCBmaW5kIGEgbWF0Y2gsIHRoZW4gZ2V0IGEgbmV3IG5ldHdvcmsgc2xvdCB0byBpbml0aWFsaXplCi0JICogd2l0aCB0aGlzIGJlYWNvbidzIGluZm9ybWF0aW9uICovCi0JaWYgKCZ0YXJnZXQtPmxpc3QgPT0gJmllZWUtPm5ldHdvcmtfbGlzdCkgewotCQlpZiAobGlzdF9lbXB0eSgmaWVlZS0+bmV0d29ya19mcmVlX2xpc3QpKSB7Ci0JCQkvKiBJZiB0aGVyZSBhcmUgbm8gbW9yZSBzbG90cywgZXhwaXJlIHRoZSBvbGRlc3QgKi8KLQkJCWxpc3RfZGVsKCZvbGRlc3QtPmxpc3QpOwotCQkJdGFyZ2V0ID0gb2xkZXN0OwotCQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIkV4cGlyZWQgJyVzJyAoJXBNKSBmcm9tICIKLQkJCQkJICAgICAibmV0d29yayBsaXN0LlxuIiwKLQkJCQkJICAgICBlc2NhcGVfZXNzaWQodGFyZ2V0LT5zc2lkLAotCQkJCQkJCSAgdGFyZ2V0LT5zc2lkX2xlbiksCi0JCQkJCSAgICAgdGFyZ2V0LT5ic3NpZCk7Ci0JCX0gZWxzZSB7Ci0JCQkvKiBPdGhlcndpc2UganVzdCBwdWxsIGZyb20gdGhlIGZyZWUgbGlzdCAqLwotCQkJdGFyZ2V0ID0gbGlzdF9lbnRyeShpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdC5uZXh0LAotCQkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrLCBsaXN0KTsKLQkJCWxpc3RfZGVsKGllZWUtPm5ldHdvcmtfZnJlZV9saXN0Lm5leHQpOwotCQl9Ci0KLQotI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKLQkJSUVFRTgwMjExX0RFQlVHX1NDQU4oIkFkZGluZyAnJXMnICglcE0pIHZpYSAlcy5cbiIsCi0JCQkJICAgICBlc2NhcGVfZXNzaWQobmV0d29yay5zc2lkLAotCQkJCQkJICBuZXR3b3JrLnNzaWRfbGVuKSwKLQkJCQkgICAgIG5ldHdvcmsuYnNzaWQsCi0JCQkJICAgICBXTEFOX0ZDX0dFVF9TVFlQRShiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpID09Ci0JCQkJICAgICBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCA/Ci0JCQkJICAgICAiUFJPQkUgUkVTUE9OU0UiIDogIkJFQUNPTiIpOwotI2VuZGlmCi0JCW1lbWNweSh0YXJnZXQsICZuZXR3b3JrLCBzaXplb2YoKnRhcmdldCkpOwotCQlsaXN0X2FkZF90YWlsKCZ0YXJnZXQtPmxpc3QsICZpZWVlLT5uZXR3b3JrX2xpc3QpOwotCX0gZWxzZSB7Ci0JCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJVcGRhdGluZyAnJXMnICglcE0pIHZpYSAlcy5cbiIsCi0JCQkJICAgICBlc2NhcGVfZXNzaWQodGFyZ2V0LT5zc2lkLAotCQkJCQkJICB0YXJnZXQtPnNzaWRfbGVuKSwKLQkJCQkgICAgIHRhcmdldC0+YnNzaWQsCi0JCQkJICAgICBXTEFOX0ZDX0dFVF9TVFlQRShiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpID09Ci0JCQkJICAgICBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCA/Ci0JCQkJICAgICAiUFJPQkUgUkVTUE9OU0UiIDogIkJFQUNPTiIpOwotCi0JCS8qIHdlIGhhdmUgYW4gZW50cnkgYW5kIHdlIGFyZSBnb2luZyB0byB1cGRhdGUgaXQuIEJ1dCB0aGlzIGVudHJ5IG1heQotCQkgKiBiZSBhbHJlYWR5IGV4cGlyZWQuIEluIHRoaXMgY2FzZSB3ZSBkbyB0aGUgc2FtZSBhcyB3ZSBmb3VuZCBhIG5ldwotCQkgKiBuZXQgYW5kIGNhbGwgdGhlIG5ld19uZXQgaGFuZGxlcgotCQkgKi8KLQkJcmVuZXcgPSAhdGltZV9hZnRlcih0YXJnZXQtPmxhc3Rfc2Nhbm5lZCArIGllZWUtPnNjYW5fYWdlLCBqaWZmaWVzKTsKLQkJLy9ZSixhZGQsMDgwODE5LGZvciBoaWRkZW4gYXAKLQkJaWYoaXNfYmVhY29uKGJlYWNvbi0+aGVhZGVyLmZyYW1lX2N0bCkgPT0gMCkKLQkJCW5ldHdvcmsuZmxhZ3MgPSAofk5FVFdPUktfRU1QVFlfRVNTSUQgJiBuZXR3b3JrLmZsYWdzKXwoTkVUV09SS19FTVBUWV9FU1NJRCAmIHRhcmdldC0+ZmxhZ3MpOwotCQlpZigoKG5ldHdvcmsuZmxhZ3MgJiBORVRXT1JLX0VNUFRZX0VTU0lEKSA9PSBORVRXT1JLX0VNUFRZX0VTU0lEKSBcCi0JCSAgICAmJiAoKChuZXR3b3JrLnNzaWRfbGVuID4gMCkgJiYgKHN0cm5jbXAodGFyZ2V0LT5zc2lkLCBuZXR3b3JrLnNzaWQsIG5ldHdvcmsuc3NpZF9sZW4pKSlcCi0JCSAgICB8fCgoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IG5ldHdvcmsuc3NpZF9sZW4pJiYoc3RybmNtcChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgbmV0d29yay5zc2lkLCBuZXR3b3JrLnNzaWRfbGVuKSA9PSAwKSYmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspKSkpCi0JCQlyZW5ldyA9IDE7Ci0JCS8vWUosYWRkLDA4MDgxOSxmb3IgaGlkZGVuIGFwLGVuZAotCi0JCXVwZGF0ZV9uZXR3b3JrKHRhcmdldCwgJm5ldHdvcmspOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKLQlpZiAoaXNfYmVhY29uKGJlYWNvbi0+aGVhZGVyLmZyYW1lX2N0bCkmJmlzX3NhbWVfbmV0d29yaygmaWVlZS0+Y3VycmVudF9uZXR3b3JrLCAmbmV0d29yaywgaWVlZSkmJlwKLQkJKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpKSB7Ci0JCWlmKGllZWUtPmhhbmRsZV9iZWFjb24gIT0gTlVMTCkgewotCQkJaWVlZS0+aGFuZGxlX2JlYWNvbihpZWVlLCBiZWFjb24sICZpZWVlLT5jdXJyZW50X25ldHdvcmspOwotCQl9Ci0JfQotfQotCi12b2lkIGllZWU4MDIxMV9yeF9tZ3Qoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZWFkZXIsCi0JCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKnN0YXRzKQotewotCWlmKFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSAhPSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCAmJgotCQlXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkgIT0gSUVFRTgwMjExX1NUWVBFX0JFQUNPTikKLQkJaWVlZS0+bGFzdF9yeF9wc190aW1lID0gamlmZmllczsKLQotCXN3aXRjaCAoV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpKSB7Ci0KLQljYXNlIElFRUU4MDIxMV9TVFlQRV9CRUFDT046Ci0JCUlFRUU4MDIxMV9ERUJVR19NR01UKCJyZWNlaXZlZCBCRUFDT04gKCVkKVxuIiwKLQkJCQkgICAgIFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSk7Ci0JCUlFRUU4MDIxMV9ERUJVR19TQ0FOKCJCZWFjb25cbiIpOwotCQlpZWVlODAyMTFfcHJvY2Vzc19wcm9iZV9yZXNwb25zZSgKLQkJCWllZWUsIChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICopaGVhZGVyLCBzdGF0cyk7Ci0KLQkJaWYoaWVlZS0+c3RhX3NsZWVwIHx8IChpZWVlLT5wcyAhPSBJRUVFODAyMTFfUFNfRElTQUJMRUQgJiYKLQkJCQkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBICYmCi0JCQkJCWllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpKQotCQl7Ci0JCQl0YXNrbGV0X3NjaGVkdWxlKCZpZWVlLT5wc190YXNrKTsKLQkJfQotCi0JCWJyZWFrOwotCi0JY2FzZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUDoKLQkJSUVFRTgwMjExX0RFQlVHX01HTVQoInJlY2VpdmVkIFBST0JFIFJFU1BPTlNFICglZClcbiIsCi0JCQkJICAgICBXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkpOwotCQlJRUVFODAyMTFfREVCVUdfU0NBTigiUHJvYmUgcmVzcG9uc2VcbiIpOwotCQlpZWVlODAyMTFfcHJvY2Vzc19wcm9iZV9yZXNwb25zZSgKLQkJCWllZWUsIChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICopaGVhZGVyLCBzdGF0cyk7Ci0JCWJyZWFrOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGU5YTA5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYworKysgL2Rldi9udWxsCkBAIC0xLDMyNzggKzAsMCBAQAotLyogSUVFRSA4MDIuMTEgU29mdE1BQyBsYXllcgotICogQ29weXJpZ2h0IChjKSAyMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KLSAqCi0gKiBNb3N0bHkgZXh0cmFjdGVkIGZyb20gdGhlIHJ0bDgxODAtc2EyNDAwIGRyaXZlciBmb3IgdGhlCi0gKiBpbi1rZXJuZWwgZ2VuZXJpYyBpZWVlODAyLjExIHN0YWNrLgotICoKLSAqIEZldyBsaW5lcyBtaWdodCBiZSBzdG9sZW4gZnJvbSBvdGhlciBwYXJ0IG9mIHRoZSBpZWVlODAyMTEKLSAqIHN0YWNrLiBDb3B5cmlnaHQgd2hvIG93biBpdCdzIGNvcHlyaWdodAotICoKLSAqIFdQQSBjb2RlIHN0b2xlbiBmcm9tIHRoZSBpcHcyMjAwIGRyaXZlci4KLSAqIENvcHlyaWdodCB3aG8gb3duIGl0J3MgY29weXJpZ2h0LgotICoKLSAqIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0KLSNpbmNsdWRlICJpZWVlODAyMTEuaCIKLQotI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaWZkZWYgRU5BQkxFX0RPVDExRAotI2luY2x1ZGUgImRvdDExZC5oIgotI2VuZGlmCi0KLXU4IHJzbl9hdXRoZW5fY2lwaGVyX3N1aXRlWzE2XVs0XSA9IHsKLQl7MHgwMCwweDBGLDB4QUMsMHgwMH0sIC8vVXNlIGdyb3VwIGtleSwgLy9SZXNlcnZlZAotCXsweDAwLDB4MEYsMHhBQywweDAxfSwgLy9XRVAtNDAgICAgICAgICAvL1JTTkEgZGVmYXVsdAotCXsweDAwLDB4MEYsMHhBQywweDAyfSwgLy9US0lQICAgICAgICAgICAvL05PTkUJCS8ve3VzZWQganVzdCBhcyBkZWZhdWx0fQotCXsweDAwLDB4MEYsMHhBQywweDAzfSwgLy9XUkFQLWhpc3RvcmljYWwKLQl7MHgwMCwweDBGLDB4QUMsMHgwNH0sIC8vQ0NNUAotCXsweDAwLDB4MEYsMHhBQywweDA1fSwgLy9XRVAtMTA0Ci19OwotCi1zaG9ydCBpZWVlODAyMTFfaXNfNTRnKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXQpCi17Ci0JcmV0dXJuICgobmV0LnJhdGVzX2V4X2xlbiA+IDApIHx8IChuZXQucmF0ZXNfbGVuID4gNCkpOwotfQotCi1zaG9ydCBpZWVlODAyMTFfaXNfc2hvcnRzbG90KHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXQpCi17Ci0JcmV0dXJuIChuZXQuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKTsKLX0KLQotLyogcmV0dXJucyB0aGUgdG90YWwgbGVuZ3RoIG5lZWRlZCBmb3IgcGxlYWNpbmcgdGhlIFJBVEUgTUZJRQotICogdGFnIGFuZCB0aGUgRVhURU5ERUQgUkFURSBNRklFIHRhZyBpZiBuZWVkZWQuCi0gKiBJdCBlbmNsdWRlcyB0d28gYnl0ZXMgcGVyIHRhZyBmb3IgdGhlIHRhZyBpdHNlbGYgYW5kIGl0cyBsZW4KLSAqLwotdW5zaWduZWQgaW50IGllZWU4MDIxMV9NRklFX3JhdGVfbGVuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCXVuc2lnbmVkIGludCByYXRlX2xlbiA9IDA7Ci0KLQlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9DQ0tfTU9EVUxBVElPTikKLQkJcmF0ZV9sZW4gPSBJRUVFODAyMTFfQ0NLX1JBVEVfTEVOICsgMjsKLQotCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikKLQotCQlyYXRlX2xlbiArPSBJRUVFODAyMTFfT0ZETV9SQVRFX0xFTiArIDI7Ci0KLQlyZXR1cm4gcmF0ZV9sZW47Ci19Ci0KLS8qIHBsZWFjZSB0aGUgTUZJRSByYXRlLCB0YWcgdG8gdGhlIG1lbW9yeSAoZG91YmxlKSBwb2luZWQuCi0gKiBUaGVuIGl0IHVwZGF0ZXMgdGhlIHBvaW50ZXIgc28gdGhhdAotICogaXQgcG9pbnRzIGFmdGVyIHRoZSBuZXcgTUZJRSB0YWcgYWRkZWQuCi0gKi8KLXZvaWQgaWVlZTgwMjExX01GSUVfQnJhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApCi17Ci0JdTggKnRhZyA9ICp0YWdfcDsKLQotCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKXsKLQkJKnRhZysrID0gTUZJRV9UWVBFX1JBVEVTOwotCQkqdGFnKysgPSA0OwotCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzFNQjsKLQkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8yTUI7Ci0JCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfNU1COwotCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzExTUI7Ci0JfQotCi0JLyogV2UgbWF5IGFkZCBhbiBvcHRpb24gZm9yIGN1c3RvbSByYXRlcyB0aGF0IHNwZWNpZmljIEhXIG1pZ2h0IHN1cHBvcnQgKi8KLQkqdGFnX3AgPSB0YWc7Ci19Ci0KLXZvaWQgaWVlZTgwMjExX01GSUVfR3JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApCi17Ci0JdTggKnRhZyA9ICp0YWdfcDsKLQotCQlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pewotCi0JCSp0YWcrKyA9IE1GSUVfVFlQRV9SQVRFU19FWDsKLQkJKnRhZysrID0gODsKLQkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COwotCQkqdGFnKysgPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV85TUI7Ci0JCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI7Ci0JCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUI7Ci0JCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI7Ci0JCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI7Ci0JCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI7Ci0JCSp0YWcrKyA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzU0TUI7Ci0KLQl9Ci0KLQkvKiBXZSBtYXkgYWRkIGFuIG9wdGlvbiBmb3IgY3VzdG9tIHJhdGVzIHRoYXQgc3BlY2lmaWMgSFcgbWlnaHQgc3VwcG9ydCAqLwotCSp0YWdfcCA9IHRhZzsKLX0KLQotCi12b2lkIGllZWU4MDIxMV9XTU1fSW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkgewotCXU4ICp0YWcgPSAqdGFnX3A7Ci0KLQkqdGFnKysgPSBNRklFX1RZUEVfR0VORVJJQzsgLy8wCi0JKnRhZysrID0gNzsKLQkqdGFnKysgPSAweDAwOwotCSp0YWcrKyA9IDB4NTA7Ci0JKnRhZysrID0gMHhmMjsKLQkqdGFnKysgPSAweDAyOy8vNQotCSp0YWcrKyA9IDB4MDA7Ci0JKnRhZysrID0gMHgwMTsKLSNpZmRlZiBTVVBQT1JUX1VTUEQKLQlpZihpZWVlLT5jdXJyZW50X25ldHdvcmsud21tX2luZm8gJiAweDgwKSB7Ci0JCSp0YWcrKyA9IDB4MGZ8TUFYX1NQX0xlbjsKLQl9IGVsc2UgewotCQkqdGFnKysgPSBNQVhfU1BfTGVuOwotCX0KLSNlbHNlCi0JKnRhZysrID0gTUFYX1NQX0xlbjsKLSNlbmRpZgotCSp0YWdfcCA9IHRhZzsKLX0KLQotI2lmZGVmIFRIT01BU19UVVJCTwotdm9pZCBpZWVlODAyMTFfVFVSQk9fSW5mbyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkgewotCXU4ICp0YWcgPSAqdGFnX3A7Ci0KLSAgICAgICAgKnRhZysrID0gTUZJRV9UWVBFX0dFTkVSSUM7IC8vMAotICAgICAgICAqdGFnKysgPSA3OwotICAgICAgICAqdGFnKysgPSAweDAwOwotICAgICAgICAqdGFnKysgPSAweGUwOwotICAgICAgICAqdGFnKysgPSAweDRjOwotICAgICAgICAqdGFnKysgPSAweDAxOy8vNQotICAgICAgICAqdGFnKysgPSAweDAyOwotICAgICAgICAqdGFnKysgPSAweDExOwotCSp0YWcrKyA9IDB4MDA7Ci0KLQkqdGFnX3AgPSB0YWc7Ci0JcHJpbnRrKEtFUk5fQUxFUlQgIlRoaXMgaXMgZW5hYmxlIHR1cmJvIG1vZGUgSUUgcHJvY2Vzc1xuIik7Ci19Ci0jZW5kaWYKLQotdm9pZCBlbnF1ZXVlX21nbXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JaW50IG5oOwotCW5oID0gKGllZWUtPm1nbXRfcXVldWVfaGVhZCArMSkgJSBNR01UX1FVRVVFX05VTTsKLQotLyoKLSAqIGlmIHRoZSBxdWV1ZSBpcyBmdWxsIGJ1dCB3ZSBoYXZlIG5ld2VyIGZyYW1lcyB0aGVuCi0gKiBqdXN0IG92ZXJ3cml0ZXMgdGhlIG9sZGVzdC4KLSAqCi0gKiBpZiAobmggPT0gaWVlZS0+bWdtdF9xdWV1ZV90YWlsKQotICoJCXJldHVybiAtMTsKLSAqLwotCWllZWUtPm1nbXRfcXVldWVfaGVhZCA9IG5oOwotCWllZWUtPm1nbXRfcXVldWVfcmluZ1tuaF0gPSBza2I7Ci19Ci0KLXN0cnVjdCBza19idWZmICpkZXF1ZXVlX21nbXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnJldDsKLQotCWlmKGllZWUtPm1nbXRfcXVldWVfdGFpbCA9PSBpZWVlLT5tZ210X3F1ZXVlX2hlYWQpCi0JCXJldHVybiBOVUxMOwotCi0JcmV0ID0gaWVlZS0+bWdtdF9xdWV1ZV9yaW5nW2llZWUtPm1nbXRfcXVldWVfdGFpbF07Ci0KLQlpZWVlLT5tZ210X3F1ZXVlX3RhaWwgPQotCQkoaWVlZS0+bWdtdF9xdWV1ZV90YWlsKzEpICUgTUdNVF9RVUVVRV9OVU07Ci0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIGluaXRfbWdtdF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLQlpZWVlLT5tZ210X3F1ZXVlX3RhaWwgPSBpZWVlLT5tZ210X3F1ZXVlX2hlYWQgPSAwOwotfQotCi11OCBNZ250UXVlcnlfTWdudEZyYW1lVHhSYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCVBSVF9ISUdIX1RIUk9VR0hQVVQgICAgICBwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKLQl1OCByYXRlOwotCi0JLy8gMjAwOC8wMS8yNSBNSCBGb3IgYnJvYWRjb20sIE1HTlQgZnJhbWUgc2V0IGFzIE9GRE0gNk0uCi0JaWYocEhUSW5mby0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9NR05UX1VTRV9DQ0tfNk0pCi0JCXJhdGUgPSAweDBjOwotCWVsc2UKLQkJcmF0ZSA9IGllZWUtPmJhc2ljX3JhdGUgJiAweDdmOwotCi0JaWYocmF0ZSA9PSAwKXsKLQkJLy8gMjAwNS4wMS4yNiwgYnkgcmNuamtvLgotCQlpZihpZWVlLT5tb2RlID09IElFRUVfQXx8Ci0JCSAgIGllZWUtPm1vZGU9PSBJRUVFX05fNUd8fAotCQkgICAoaWVlZS0+bW9kZT09IElFRUVfTl8yNEcmJiFwSFRJbmZvLT5iQ3VyU3VwcENDSykpCi0JCQlyYXRlID0gMHgwYzsKLQkJZWxzZQotCQkJcmF0ZSA9IDB4MDI7Ci0JfQotCi0JcmV0dXJuIHJhdGU7Ci19Ci0KLQotdm9pZCBpZWVlODAyMTFfc3RhX3dha2V1cChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc2hvcnQgbmwpOwotCi1pbmxpbmUgdm9pZCBzb2Z0bWFjX21nbXRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXNob3J0IHNpbmdsZSA9IGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqaGVhZGVyPQotCQkoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICopIHNrYi0+ZGF0YTsKLQotCWNiX2Rlc2MgKnRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiLT5jYiArIDgpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBjYWxsZWQgd2l0aCAybmQgcGFyYW0gMCwgbm8gbWdtdCBsb2NrIHJlcXVpcmVkICovCi0JaWVlZTgwMjExX3N0YV93YWtldXAoaWVlZSwwKTsKLQotCXRjYl9kZXNjLT5xdWV1ZV9pbmRleCA9IE1HTlRfUVVFVUU7Ci0JdGNiX2Rlc2MtPmRhdGFfcmF0ZSA9IE1nbnRRdWVyeV9NZ250RnJhbWVUeFJhdGUoaWVlZSk7Ci0gICAgICAgIHRjYl9kZXNjLT5SQVRSSW5kZXggPSA3OwotICAgICAgICB0Y2JfZGVzYy0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjayA9IDE7Ci0gICAgICAgIHRjYl9kZXNjLT5iVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGUgPSAxOwotCi0JaWYoc2luZ2xlKXsKLQkJaWYoaWVlZS0+cXVldWVfc3RvcCl7Ci0JCQllbnF1ZXVlX21nbXQoaWVlZSxza2IpOwotCQl9ZWxzZXsKLQkJCWhlYWRlci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdPDw0KTsKLQotCQkJaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQotCQkJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKLQkJCWVsc2UKLQkJCQlpZWVlLT5zZXFfY3RybFswXSsrOwotCi0JCQkvKiBhdm9pZCB3YXRjaGRvZyB0cmlnZ2VycyAqLwotCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdChza2IsIGllZWUsIGllZWUtPmJhc2ljX3JhdGUpOwotCQl9Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwotCX1lbHNlewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7Ci0JCXNwaW5fbG9jaygmaWVlZS0+bWdtdF90eF9sb2NrKTsKLQotCQloZWFkZXItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXSA8PCA0KTsKLQotCQlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCi0JCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7Ci0JCWVsc2UKLQkJCWllZWUtPnNlcV9jdHJsWzBdKys7Ci0KLQkJLyogY2hlY2sgd2V0aGVyIHRoZSBtYW5hZ2VkIHBhY2tldCBxdWV1ZWQgZ3JlYXRlciB0aGFuIDUgKi8KLQkJaWYoIWllZWUtPmNoZWNrX25pY19lbm91Z2hfZGVzYyhpZWVlLCB0Y2JfZGVzYy0+cXVldWVfaW5kZXgpfHwKLQkJCQkoc2tiX3F1ZXVlX2xlbigmaWVlZS0+c2tiX3dhaXRRW3RjYl9kZXNjLT5xdWV1ZV9pbmRleF0pICE9IDApfHwKLQkJCQkoaWVlZS0+cXVldWVfc3RvcCkgKSB7Ci0JCQkvKiBpbnNlcnQgdGhlIHNrYiBwYWNrZXQgdG8gdGhlIG1hbmFnZW1lbnQgcXVldWUgKi8KLQkJCS8qIGFzIGZvciB0aGUgY29tcGxldGlvbiBmdW5jdGlvbiwgaXQgZG9lcyBub3QgbmVlZAotCQkJICogdG8gY2hlY2sgaXQgYW55IG1vcmUuCi0JCQkgKiAqLwotCQkJc2tiX3F1ZXVlX3RhaWwoJmllZWUtPnNrYl93YWl0UVt0Y2JfZGVzYy0+cXVldWVfaW5kZXhdLCBza2IpOwotCQl9IGVsc2UgewotCQkJaWVlZS0+c29mdG1hY19oYXJkX3N0YXJ0X3htaXQoc2tiLCBpZWVlKTsKLQkJfQotCQlzcGluX3VubG9jaygmaWVlZS0+bWdtdF90eF9sb2NrKTsKLQl9Ci19Ci0KLWlubGluZSB2b2lkIHNvZnRtYWNfcHNfbWdtdF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCi0Jc2hvcnQgc2luZ2xlID0gaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUU7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICpoZWFkZXIgPQotCQkoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICopIHNrYi0+ZGF0YTsKLSAgICAgICAgY2JfZGVzYyAqdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiICsgOCk7Ci0KLQl0Y2JfZGVzYy0+cXVldWVfaW5kZXggPSBNR05UX1FVRVVFOwotCXRjYl9kZXNjLT5kYXRhX3JhdGUgPSBNZ250UXVlcnlfTWdudEZyYW1lVHhSYXRlKGllZWUpOwotCXRjYl9kZXNjLT5SQVRSSW5kZXggPSA3OwotCXRjYl9kZXNjLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrID0gMTsKLQl0Y2JfZGVzYy0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlID0gMTsKLQlpZihzaW5nbGUpewotCi0JCWhlYWRlci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdIDw8IDQpOwotCi0JCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKLQkJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKLQkJZWxzZQotCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKLQotCQkvKiBhdm9pZCB3YXRjaGRvZyB0cmlnZ2VycyAqLwotCQlpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KHNrYiwgaWVlZSwgaWVlZS0+YmFzaWNfcmF0ZSk7Ci0KLQl9ZWxzZXsKLQotCQloZWFkZXItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXSA8PCA0KTsKLQotCQlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCi0JCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7Ci0JCWVsc2UKLQkJCWllZWUtPnNlcV9jdHJsWzBdKys7Ci0KLQkJaWVlZS0+c29mdG1hY19oYXJkX3N0YXJ0X3htaXQoc2tiLCBpZWVlKTsKLQotCX0KLX0KLQotaW5saW5lIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfcHJvYmVfcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCXVuc2lnbmVkIGludCBsZW4scmF0ZV9sZW47Ci0JdTggKnRhZzsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCAqcmVxOwotCi0JbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuOwotCi0JcmF0ZV9sZW4gPSBpZWVlODAyMTFfTUZJRV9yYXRlX2xlbihpZWVlKTsKLQotCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCkgKwotCQkJICAgIDIgKyBsZW4gKyByYXRlX2xlbiArIGllZWUtPnR4X2hlYWRyb29tKTsKLQlpZiAoIXNrYikKLQkJcmV0dXJuIE5VTEw7Ci0KLQlza2JfcmVzZXJ2ZShza2IsIGllZWUtPnR4X2hlYWRyb29tKTsKLQotCXJlcSA9IChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3JlcXVlc3QgKikgc2tiX3B1dChza2Isc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCkpOwotCXJlcS0+aGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVEpOwotCXJlcS0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMDsgLy9GSVhNRTogaXMgdGhpcyBPSyA/Ci0KLQltZW1zZXQocmVxLT5oZWFkZXIuYWRkcjEsIDB4ZmYsIEVUSF9BTEVOKTsKLQltZW1jcHkocmVxLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQltZW1zZXQocmVxLT5oZWFkZXIuYWRkcjMsIDB4ZmYsIEVUSF9BTEVOKTsKLQotCXRhZyA9ICh1OCAqKSBza2JfcHV0KHNrYixsZW4rMityYXRlX2xlbik7Ci0KLQkqdGFnKysgPSBNRklFX1RZUEVfU1NJRDsKLQkqdGFnKysgPSBsZW47Ci0JbWVtY3B5KHRhZywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIGxlbik7Ci0JdGFnICs9IGxlbjsKLQotCWllZWU4MDIxMV9NRklFX0JyYXRlKGllZWUsJnRhZyk7Ci0JaWVlZTgwMjExX01GSUVfR3JhdGUoaWVlZSwmdGFnKTsKLQlyZXR1cm4gc2tiOwotfQotCi1zdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb25fKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKTsKLXZvaWQgaWVlZTgwMjExX3NlbmRfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0JaWYoIWllZWUtPmllZWVfdXApCi0JCXJldHVybjsKLQotCXNrYiA9IGllZWU4MDIxMV9nZXRfYmVhY29uXyhpZWVlKTsKLQotCWlmIChza2IpewotCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOwotCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X2JlYWNvbnMrKzsKLQl9Ci0KLQlpZihpZWVlLT5iZWFjb25fdHhpbmcgJiYgaWVlZS0+aWVlZV91cCl7Ci0JCW1vZF90aW1lcigmaWVlZS0+YmVhY29uX3RpbWVyLGppZmZpZXMrKE1TRUNTKGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwtNSkpKTsKLQl9Ci19Ci0KLQotdm9pZCBpZWVlODAyMTFfc2VuZF9iZWFjb25fY2IodW5zaWduZWQgbG9uZyBfaWVlZSkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9Ci0JCShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqKSBfaWVlZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLCBmbGFncyk7Ci0JaWVlZTgwMjExX3NlbmRfYmVhY29uKGllZWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLCBmbGFncyk7Ci19Ci0KLQotdm9pZCBpZWVlODAyMTFfc2VuZF9wcm9iZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCi0Jc2tiID0gaWVlZTgwMjExX3Byb2JlX3JlcShpZWVlKTsKLQlpZiAoc2tiKXsKLQkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKLQkJaWVlZS0+c29mdG1hY19zdGF0cy50eF9wcm9iZV9ycSsrOwotCX0KLX0KLQotdm9pZCBpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0cyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLQlpZiAoaWVlZS0+YWN0aXZlX3NjYW4gJiYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfUFJPQkVSUSkpewotCQlpZWVlODAyMTFfc2VuZF9wcm9iZShpZWVlKTsKLQkJaWVlZTgwMjExX3NlbmRfcHJvYmUoaWVlZSk7Ci0JfQotfQotCi0vKiB0aGlzIHBlcmZvcm1zIHN5bmNybyBzY2FuIGJsb2NraW5nIHRoZSBjYWxsZXIgdW50aWwgYWxsIGNoYW5uZWxzCi0gKiBpbiB0aGUgYWxsb3dlZCBjaGFubmVsIG1hcCBoYXMgYmVlbiBjaGVja2VkLgotICovCi12b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fc3luY3JvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCXNob3J0IGNoID0gMDsKLSNpZmRlZiBFTkFCTEVfRE9UMTFECi0JdTggY2hhbm5lbF9tYXBbTUFYX0NIQU5ORUxfTlVNQkVSKzFdOwotCW1lbWNweShjaGFubmVsX21hcCwgR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCwgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOwotI2VuZGlmCi0JZG93bigmaWVlZS0+c2Nhbl9zZW0pOwotCi0Jd2hpbGUoMSkKLQl7Ci0KLQkJZG97Ci0JCQljaCsrOwotCQkJaWYgKGNoID4gTUFYX0NIQU5ORUxfTlVNQkVSKQotCQkJCWdvdG8gb3V0OyAvKiBzY2FuIGNvbXBsZXRlZCAqLwotI2lmZGVmIEVOQUJMRV9ET1QxMUQKLQkJfXdoaWxlKCFjaGFubmVsX21hcFtjaF0pOwotI2Vsc2UKLQkJfXdoaWxlKCFpZWVlLT5jaGFubmVsX21hcFtjaF0pOwotI2VuZGlmCi0KLQkJLyogdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGluIHR3byBzaXR1YXRpb25zCi0JCSAqIDEtIFdlIGhhdmUgc3dpdGNoZWQgdG8gYWQtaG9jIG1vZGUgYW5kIHdlIGFyZQotCQkgKiAgICBwZXJmb3JtaW5nIGEgY29tcGxldGUgc3luY3JvIHNjYW4gYmVmb3JlIGNvbmNsdWRlCi0JCSAqICAgIHRoZXJlIGFyZSBubyBpbnRlcmVzdGluZyBjZWxsIGFuZCB0byBjcmVhdGUgYQotCQkgKiAgICBuZXcgb25lLiBJbiB0aGlzIGNhc2UgdGhlIGxpbmsgc3RhdGUgaXMKLQkJICogICAgSUVFRTgwMjExX05PTElOSyB1bnRpbCB3ZSBmb3VuZCBhbiBpbnRlcmVzdGluZyBjZWxsLgotCQkgKiAgICBJZiBzbyB0aGUgaWVlZTgwMjFfbmV3X25ldCwgY2FsbGVkIGJ5IHRoZSBSWCBwYXRoCi0JCSAqICAgIHdpbGwgc2V0IHRoZSBzdGF0ZSB0byBJRUVFODAyMTFfTElOS0VELCBzbyB3ZSBzdG9wCi0JCSAqICAgIHNjYW5uaW5nCi0JCSAqIDItIFdlIGFyZSBsaW5rZWQgYW5kIHRoZSByb290IHVzZXMgcnVuIGl3bGlzdCBzY2FuLgotCQkgKiAgICBTbyB3ZSBzd2l0Y2ggdG8gSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORyB0byByZW1lbWJlcgotCQkgKiAgICB0aGF0IHdlIGFyZSBzdGlsbCBsb2dpY2FsbHkgbGlua2VkIChub3QgaW50ZXJlc3RlZCBpbgotCQkgKiAgICBuZXcgbmV0d29yayBldmVudHMsIGRlc3BpdGUgZm9yIHVwZGF0aW5nIHRoZSBuZXQgbGlzdCwKLQkJICogICAgYnV0IHdlIGFyZSB0ZW1wb3Jhcmx5ICd1bmxpbmtlZCcgYXMgdGhlIGRyaXZlciBzaGFsbAotCQkgKiAgICBub3QgZmlsdGVyIFJYIGZyYW1lcyBhbmQgdGhlIGNoYW5uZWwgaXMgY2hhbmdpbmcuCi0JCSAqIFNvIHRoZSBvbmx5IHNpdHVhdGlvbiBpbiB3aXRjaCBhcmUgaW50ZXJlc3RlZCBpcyB0byBjaGVjawotCQkgKiBpZiB0aGUgc3RhdGUgYmVjb21lIExJTktFRCBiZWNhdXNlIG9mIHRoZSAjMSBzaXR1YXRpb24KLQkJICovCi0KLQkJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpCi0JCQlnb3RvIG91dDsKLQkJaWVlZS0+c2V0X2NoYW4oaWVlZSwgY2gpOwotI2lmZGVmIEVOQUJMRV9ET1QxMUQKLQkJaWYoY2hhbm5lbF9tYXBbY2hdID09IDEpCi0jZW5kaWYKLQkJaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMoaWVlZSk7Ci0KLQkJLyogdGhpcyBwcmV2ZW50IGV4Y2Vzc2l2ZSB0aW1lIHdhaXQgd2hlbiB3ZQotCQkgKiBuZWVkIHRvIHdhaXQgZm9yIGEgc3luY3JvIHNjYW4gdG8gZW5kLi4KLQkJICovCi0JCWlmKGllZWUtPnN0YXRlIDwgSUVFRTgwMjExX0xJTktFRCkKLQkJCTsKLQkJZWxzZQotCQlpZiAoaWVlZS0+c3luY19zY2FuX2h1cnJ5dXApCi0JCQlnb3RvIG91dDsKLQotCi0JCW1zbGVlcF9pbnRlcnJ1cHRpYmxlX3JzbChJRUVFODAyMTFfU09GVE1BQ19TQ0FOX1RJTUUpOwotCi0JfQotb3V0OgotCWlmKGllZWUtPnN0YXRlIDwgSUVFRTgwMjExX0xJTktFRCl7Ci0JCWllZWUtPmFjdHNjYW5uaW5nID0gZmFsc2U7Ci0JCXVwKCZpZWVlLT5zY2FuX3NlbSk7Ci0JfQotCWVsc2V7Ci0JaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOwotI2lmZGVmIEVOQUJMRV9ET1QxMUQKLQlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpKQotCQlET1QxMURfU2NhbkNvbXBsZXRlKGllZWUpOwotI2VuZGlmCi0JdXAoJmllZWUtPnNjYW5fc2VtKTsKLX0KLX0KLQotCi12b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKLSAgICAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBzb2Z0bWFjX3NjYW5fd3EpOwotCXN0YXRpYyBzaG9ydCB3YXRjaGRvZyA9IDA7Ci0JdTggbGFzdF9jaGFubmVsID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWw7Ci0jaWZkZWYgRU5BQkxFX0RPVDExRAotCXU4IGNoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsKLQltZW1jcHkoY2hhbm5lbF9tYXAsIEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXAsIE1BWF9DSEFOTkVMX05VTUJFUisxKTsKLSNlbmRpZgotCWlmKCFpZWVlLT5pZWVlX3VwKQotCQlyZXR1cm47Ci0JZG93bigmaWVlZS0+c2Nhbl9zZW0pOwotCWRvewotCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9Ci0JCQkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgKyAxKSAlIE1BWF9DSEFOTkVMX05VTUJFUjsKLQkJaWYgKHdhdGNoZG9nKysgPiBNQVhfQ0hBTk5FTF9OVU1CRVIpIHsKLQkJCS8qIGlmIGN1cnJlbnQgY2hhbm5lbCBpcyBub3QgaW4gY2hhbm5lbCBtYXAsIHNldCB0byBkZWZhdWx0IGNoYW5uZWwuICovCi0jaWZkZWYgRU5BQkxFX0RPVDExRAotCQkJaWYgKCFjaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0pIHsKLSNlbHNlCi0JCQlpZiAoIWllZWUtPmNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSkgewotI2VuZGlmCi0JCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSA2OwotCQkJCWdvdG8gb3V0OyAvKiBubyBnb29kIGNoYW5zICovCi0JCQl9Ci0JCX0KLSNpZmRlZiBFTkFCTEVfRE9UMTFECi0gICAgICAgIH13aGlsZSghY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKTsKLSNlbHNlCi0JfXdoaWxlKCFpZWVlLT5jaGFubmVsX21hcFtpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbF0pOwotI2VuZGlmCi0JaWYgKGllZWUtPnNjYW5uaW5nID09IDAgKQotCQlnb3RvIG91dDsKLQlpZWVlLT5zZXRfY2hhbihpZWVlLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7Ci0jaWZkZWYgRU5BQkxFX0RPVDExRAotCWlmKGNoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSA9PSAxKQotI2VuZGlmCi0JaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxdWVzdHMoaWVlZSk7Ci0KLQotCXF1ZXVlX2RlbGF5ZWRfd29yayhpZWVlLT53cSwgJmllZWUtPnNvZnRtYWNfc2Nhbl93cSwgSUVFRTgwMjExX1NPRlRNQUNfU0NBTl9USU1FKTsKLQotCXVwKCZpZWVlLT5zY2FuX3NlbSk7Ci0JcmV0dXJuOwotb3V0OgotI2lmZGVmIEVOQUJMRV9ET1QxMUQKLQlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpKQotCQlET1QxMURfU2NhbkNvbXBsZXRlKGllZWUpOwotI2VuZGlmCi0JaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSBsYXN0X2NoYW5uZWw7Ci0gICAgICAgIGllZWUtPmFjdHNjYW5uaW5nID0gZmFsc2U7Ci0Jd2F0Y2hkb2cgPSAwOwotCWllZWUtPnNjYW5uaW5nID0gMDsKLQl1cCgmaWVlZS0+c2Nhbl9zZW0pOwotfQotCi12b2lkIGllZWU4MDIxMV9iZWFjb25zX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKLQotCWllZWUtPmJlYWNvbl90eGluZyA9IDE7Ci0JaWVlZTgwMjExX3NlbmRfYmVhY29uKGllZWUpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOwotfQotCi12b2lkIGllZWU4MDIxMV9iZWFjb25zX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5iZWFjb25fbG9jayxmbGFncyk7Ci0KLQlpZWVlLT5iZWFjb25fdHhpbmcgPSAwOwotIAlkZWxfdGltZXJfc3luYygmaWVlZS0+YmVhY29uX3RpbWVyKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLGZsYWdzKTsKLQotfQotCi0KLXZvaWQgaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCWlmKGllZWUtPnN0b3Bfc2VuZF9iZWFjb25zKQotCQlpZWVlLT5zdG9wX3NlbmRfYmVhY29ucyhpZWVlKTsKLQlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19CRUFDT05TKQotCQlpZWVlODAyMTFfYmVhY29uc19zdG9wKGllZWUpOwotfQotCi0KLXZvaWQgaWVlZTgwMjExX3N0YXJ0X3NlbmRfYmVhY29ucyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLQlpZihpZWVlLT5zdGFydF9zZW5kX2JlYWNvbnMpCi0JCWllZWUtPnN0YXJ0X3NlbmRfYmVhY29ucyhpZWVlKTsKLQlpZihpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0JFQUNPTlMpCi0JCWllZWU4MDIxMV9iZWFjb25zX3N0YXJ0KGllZWUpOwotfQotCi0KLXZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKLQotCWlmIChpZWVlLT5zY2FubmluZyA9PSAxKXsKLQkJaWVlZS0+c2Nhbm5pbmcgPSAwOwotCi0JCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPnNvZnRtYWNfc2Nhbl93cSk7Ci0JfQotCi0JdXAoJmllZWUtPnNjYW5fc2VtKTsKLX0KLQotdm9pZCBpZWVlODAyMTFfc3RvcF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NDQU4pCi0JCWllZWU4MDIxMV9zb2Z0bWFjX3N0b3Bfc2NhbihpZWVlKTsKLQllbHNlCi0JCWllZWUtPnN0b3Bfc2NhbihpZWVlKTsKLX0KLQotLyogY2FsbGVkIHdpdGggaWVlZS0+bG9jayBoZWxkICovCi12b2lkIGllZWU4MDIxMV9ydGxfc3RhcnRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLSNpZmRlZiBFTkFCTEVfSVBTCi0JaWYoaWVlZS0+aWVlZTgwMjExX2lwc19sZWF2ZV93cSAhPSBOVUxMKQotCQlpZWVlLT5pZWVlODAyMTFfaXBzX2xlYXZlX3dxKGllZWUpOwotI2VuZGlmCi0KLSNpZmRlZiBFTkFCTEVfRE9UMTFECi0JaWYoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSApCi0JewotCQlpZihJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQotCQl7Ci0JCQlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7Ci0JCX0KLQl9Ci0jZW5kaWYKLQlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TQ0FOKXsKLQkJaWYgKGllZWUtPnNjYW5uaW5nID09IDApewotCQkJaWVlZS0+c2Nhbm5pbmcgPSAxOwotCQkJcXVldWVfZGVsYXllZF93b3JrKGllZWUtPndxLCAmaWVlZS0+c29mdG1hY19zY2FuX3dxLCAwKTsKLQkJfQotCX1lbHNlCi0JCWllZWUtPnN0YXJ0X3NjYW4oaWVlZSk7Ci0KLX0KLQotLyogY2FsbGVkIHdpdGggd3hfc2VtIGhlbGQgKi8KLXZvaWQgaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotI2lmZGVmIEVOQUJMRV9ET1QxMUQKLQlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpICkKLQl7Ci0JCWlmKElTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpCi0JCXsKLQkJCVJFU0VUX0NJRV9XQVRDSERPRyhpZWVlKTsKLQkJfQotCX0KLSNlbmRpZgotCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMDsKLQlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TQ0FOKQotCQlpZWVlODAyMTFfc29mdG1hY19zY2FuX3N5bmNybyhpZWVlKTsKLQllbHNlCi0JCWllZWUtPnNjYW5fc3luY3JvKGllZWUpOwotCi19Ci0KLWlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uX3JlcShzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKmJlYWNvbiwKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IGNoYWxsZW5nZWxlbikKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKmF1dGg7Ci0JaW50IGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKSArIGNoYWxsZW5nZWxlbiArIGllZWUtPnR4X2hlYWRyb29tOwotCi0KLQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbik7Ci0JaWYgKCFza2IpIHJldHVybiBOVUxMOwotCi0Jc2tiX3Jlc2VydmUoc2tiLCBpZWVlLT50eF9oZWFkcm9vbSk7Ci0JYXV0aCA9IChzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICopCi0JCXNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbikpOwotCi0JYXV0aC0+aGVhZGVyLmZyYW1lX2N0bCA9IElFRUU4MDIxMV9TVFlQRV9BVVRIOwotCWlmIChjaGFsbGVuZ2VsZW4pIGF1dGgtPmhlYWRlci5mcmFtZV9jdGwgfD0gSUVFRTgwMjExX0ZDVExfV0VQOwotCi0JYXV0aC0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMHgwMTNhOyAvL0ZJWE1FCi0KLQltZW1jcHkoYXV0aC0+aGVhZGVyLmFkZHIxLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7Ci0JbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjMsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsKLQotCWlmKGllZWUtPmF1dGhfbW9kZSA9PSAwKQotCQlhdXRoLT5hbGdvcml0aG0gPSBXTEFOX0FVVEhfT1BFTjsKLQllbHNlIGlmKGllZWUtPmF1dGhfbW9kZSA9PSAxKQotCQlhdXRoLT5hbGdvcml0aG0gPSBXTEFOX0FVVEhfU0hBUkVEX0tFWTsKLQllbHNlIGlmKGllZWUtPmF1dGhfbW9kZSA9PSAyKQotCQlhdXRoLT5hbGdvcml0aG0gPSBXTEFOX0FVVEhfT1BFTjsvLzB4ODA7Ci0JcHJpbnRrKCI9PT09PT09PT09PT09PT09PT4lcygpOmF1dGgtPmFsZ29yaXRobSBpcyAlZFxuIixfX0ZVTkNUSU9OX18sYXV0aC0+YWxnb3JpdGhtKTsKLQlhdXRoLT50cmFuc2FjdGlvbiA9IGNwdV90b19sZTE2KGllZWUtPmFzc29jaWF0ZV9zZXEpOwotCWllZWUtPmFzc29jaWF0ZV9zZXErKzsKLQotCWF1dGgtPnN0YXR1cyA9IGNwdV90b19sZTE2KFdMQU5fU1RBVFVTX1NVQ0NFU1MpOwotCi0JcmV0dXJuIHNrYjsKLQotfQotCi0KLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX3Byb2JlX3Jlc3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpkZXN0KQotewotCXU4ICp0YWc7Ci0JaW50IGJlYWNvbl9zaXplOwotCXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKmJlYWNvbl9idWY7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7Ci0JaW50IGVuY3J5cHQ7Ci0JaW50IGF0aW1fbGVuLGVycF9sZW47Ci0Jc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdDsKLQotCWNoYXIgKnNzaWQgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZDsKLQlpbnQgc3NpZF9sZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW47Ci0JaW50IHJhdGVfbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2xlbisyOwotCWludCByYXRlX2V4X2xlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leF9sZW47Ci0JaW50IHdwYV9pZV9sZW4gPSBpZWVlLT53cGFfaWVfbGVuOwotCXU4IGVycGluZm9fY29udGVudCA9IDA7Ci0KLQl1OCogdG1wX2h0X2NhcF9idWY7Ci0JdTggdG1wX2h0X2NhcF9sZW49MDsKLQl1OCogdG1wX2h0X2luZm9fYnVmOwotCXU4IHRtcF9odF9pbmZvX2xlbj0wOwotCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IGllZWUtPnBIVEluZm87Ci0JdTgqIHRtcF9nZW5lcmljX2llX2J1Zj1OVUxMOwotCXU4IHRtcF9nZW5lcmljX2llX2xlbj0wOwotCi0JaWYocmF0ZV9leF9sZW4gPiAwKSByYXRlX2V4X2xlbis9MjsKLQotCWlmKGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpCi0JCWF0aW1fbGVuID0gNDsKLQllbHNlCi0JCWF0aW1fbGVuID0gMDsKLQotCWlmKGllZWU4MDIxMV9pc181NGcoaWVlZS0+Y3VycmVudF9uZXR3b3JrKSkKLQkJZXJwX2xlbiA9IDM7Ci0JZWxzZQotCQllcnBfbGVuID0gMDsKLQotCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKLQotCi0JZW5jcnlwdCA9IGllZWUtPmhvc3RfZW5jcnlwdCAmJiBjcnlwdCAmJiBjcnlwdC0+b3BzICYmCi0JCSgoMCA9PSBzdHJjbXAoY3J5cHQtPm9wcy0+bmFtZSwgIldFUCIpIHx8IHdwYV9pZV9sZW4pKTsKLQkvL0hUIHJhbGF0ZWQgZWxlbWVudAotCi0JdG1wX2h0X2NhcF9idWYgPSh1OCopICYoaWVlZS0+cEhUSW5mby0+U2VsZkhUQ2FwKTsKLQl0bXBfaHRfY2FwX2xlbiA9IHNpemVvZihpZWVlLT5wSFRJbmZvLT5TZWxmSFRDYXApOwotCXRtcF9odF9pbmZvX2J1ZiA9KHU4KikgJihpZWVlLT5wSFRJbmZvLT5TZWxmSFRJbmZvKTsKLQl0bXBfaHRfaW5mb19sZW4gPSBzaXplb2YoaWVlZS0+cEhUSW5mby0+U2VsZkhUSW5mbyk7Ci0JSFRDb25zdHJ1Y3RDYXBhYmlsaXR5RWxlbWVudChpZWVlLCB0bXBfaHRfY2FwX2J1ZiwgJnRtcF9odF9jYXBfbGVuLGVuY3J5cHQpOwotCUhUQ29uc3RydWN0SW5mb0VsZW1lbnQoaWVlZSx0bXBfaHRfaW5mb19idWYsJnRtcF9odF9pbmZvX2xlbiwgZW5jcnlwdCk7Ci0KLQotICAgICAgICBpZihwSFRJbmZvLT5iUmVnUlQyUlRBZ2dyZWdhdGlvbikKLSAgICAgICAgewotICAgICAgICAJdG1wX2dlbmVyaWNfaWVfYnVmID0gaWVlZS0+cEhUSW5mby0+c3pSVDJSVEFnZ0J1ZmZlcjsKLQkJdG1wX2dlbmVyaWNfaWVfbGVuID0gc2l6ZW9mKGllZWUtPnBIVEluZm8tPnN6UlQyUlRBZ2dCdWZmZXIpOwotCQlIVENvbnN0cnVjdFJUMlJUQWdnRWxlbWVudChpZWVlLCB0bXBfZ2VuZXJpY19pZV9idWYsICZ0bXBfZ2VuZXJpY19pZV9sZW4pOwotICAgICAgICB9Ci0KLQliZWFjb25fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlKSsyKwotCQlzc2lkX2xlbgotCQkrMyAvL2NoYW5uZWwKLQkJK3JhdGVfbGVuCi0JCStyYXRlX2V4X2xlbgotCQkrYXRpbV9sZW4KLQkJK2VycF9sZW4KLSAgICAgICAgICAgICAgICArd3BhX2llX2xlbgotCQkraWVlZS0+dHhfaGVhZHJvb207Ci0Jc2tiID0gZGV2X2FsbG9jX3NrYihiZWFjb25fc2l6ZSk7Ci0JaWYgKCFza2IpCi0JCXJldHVybiBOVUxMOwotCXNrYl9yZXNlcnZlKHNrYiwgaWVlZS0+dHhfaGVhZHJvb20pOwotCWJlYWNvbl9idWYgPSAoc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSopIHNrYl9wdXQoc2tiLCAoYmVhY29uX3NpemUgLSBpZWVlLT50eF9oZWFkcm9vbSkpOwotCW1lbWNweSAoYmVhY29uX2J1Zi0+aGVhZGVyLmFkZHIxLCBkZXN0LEVUSF9BTEVOKTsKLQltZW1jcHkgKGJlYWNvbl9idWYtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweSAoYmVhY29uX2J1Zi0+aGVhZGVyLmFkZHIzLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKLQotCWJlYWNvbl9idWYtPmhlYWRlci5kdXJhdGlvbl9pZCA9IDA7IC8vRklYTUUKLQliZWFjb25fYnVmLT5iZWFjb25faW50ZXJ2YWwgPQotCQljcHVfdG9fbGUxNihpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsKTsKLQliZWFjb25fYnVmLT5jYXBhYmlsaXR5ID0KLQkJY3B1X3RvX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUyk7Ci0JYmVhY29uX2J1Zi0+Y2FwYWJpbGl0eSB8PQotCQljcHVfdG9fbGUxNihpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSk7IC8vYWRkIHNob3J0IHByZWFtYmxlIGhlcmUKLQotCWlmKGllZWUtPnNob3J0X3Nsb3QgJiYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpKQotCQliZWFjb25fYnVmLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKTsKLQotCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKLQlpZiAoZW5jcnlwdCkKLQkJYmVhY29uX2J1Zi0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSk7Ci0KLQotCWJlYWNvbl9idWYtPmhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCk7Ci0JYmVhY29uX2J1Zi0+aW5mb19lbGVtZW50WzBdLmlkID0gTUZJRV9UWVBFX1NTSUQ7Ci0JYmVhY29uX2J1Zi0+aW5mb19lbGVtZW50WzBdLmxlbiA9IHNzaWRfbGVuOwotCi0JdGFnID0gKHU4KikgYmVhY29uX2J1Zi0+aW5mb19lbGVtZW50WzBdLmRhdGE7Ci0KLQltZW1jcHkodGFnLCBzc2lkLCBzc2lkX2xlbik7Ci0KLQl0YWcgKz0gc3NpZF9sZW47Ci0KLQkqKHRhZysrKSA9IE1GSUVfVFlQRV9SQVRFUzsKLQkqKHRhZysrKSA9IHJhdGVfbGVuLTI7Ci0JbWVtY3B5KHRhZyxpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXMscmF0ZV9sZW4tMik7Ci0JdGFnKz1yYXRlX2xlbi0yOwotCi0JKih0YWcrKykgPSBNRklFX1RZUEVfRFNfU0VUOwotCSoodGFnKyspID0gMTsKLQkqKHRhZysrKSA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsOwotCi0JaWYoYXRpbV9sZW4pewotCXUxNiB2YWwxNjsKLQkJKih0YWcrKykgPSBNRklFX1RZUEVfSUJTU19TRVQ7Ci0JCSoodGFnKyspID0gMjsKLQkJIHZhbDE2ID0gY3B1X3RvX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmF0aW1fd2luZG93KTsKLQkJbWVtY3B5KCh1OCAqKXRhZywgKHU4ICopJnZhbDE2LCAyKTsKLQkJdGFnKz0yOwotCX0KLQotCWlmKGVycF9sZW4pewotCQkqKHRhZysrKSA9IE1GSUVfVFlQRV9FUlA7Ci0JCSoodGFnKyspID0gMTsKLQkJKih0YWcrKykgPSBlcnBpbmZvX2NvbnRlbnQ7Ci0JfQotCWlmKHJhdGVfZXhfbGVuKXsKLQkJKih0YWcrKykgPSBNRklFX1RZUEVfUkFURVNfRVg7Ci0JCSoodGFnKyspID0gcmF0ZV9leF9sZW4tMjsKLQkJbWVtY3B5KHRhZyxpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXgscmF0ZV9leF9sZW4tMik7Ci0JCXRhZys9cmF0ZV9leF9sZW4tMjsKLQl9Ci0KLQlpZiAod3BhX2llX2xlbikKLQl7Ci0JCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCi0JCXsvL2FzIFdpbmRvd3Mgd2lsbCBzZXQgcGFpcndpc2Uga2V5IHNhbWUgYXMgdGhlIGdyb3VwIGtleSB3aGljaCBpcyBub3QgYWxsb3dlZCBpbiBMaW51eCwgc28gc2V0IHRoaXMgZm9yIElPVCBpc3N1ZS4gV0IgMjAwOC4wNy4wNwotCQkJbWVtY3B5KCZpZWVlLT53cGFfaWVbMTRdLCAmaWVlZS0+d3BhX2llWzhdLCA0KTsKLQkJfQotCQltZW1jcHkodGFnLCBpZWVlLT53cGFfaWUsIGllZWUtPndwYV9pZV9sZW4pOwotCQl0YWcgKz0gd3BhX2llX2xlbjsKLQl9Ci0KLQlyZXR1cm4gc2tiOwotfQotCi0KLXN0cnVjdCBza19idWZmKiBpZWVlODAyMTFfYXNzb2NfcmVzcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmRlc3QpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1OCogdGFnOwotCi0Jc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICphc3NvYzsKLQlzaG9ydCBlbmNyeXB0OwotCi0JdW5zaWduZWQgaW50IHJhdGVfbGVuID0gaWVlZTgwMjExX01GSUVfcmF0ZV9sZW4oaWVlZSk7Ci0JaW50IGxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKSArIHJhdGVfbGVuICsgaWVlZS0+dHhfaGVhZHJvb207Ci0KLQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbik7Ci0KLQlpZiAoIXNrYikKLQkJcmV0dXJuIE5VTEw7Ci0KLQlza2JfcmVzZXJ2ZShza2IsIGllZWUtPnR4X2hlYWRyb29tKTsKLQotCWFzc29jID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKikKLQkJc2tiX3B1dChza2Isc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUpKTsKLQotCWFzc29jLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1ApOwotCW1lbWNweShhc3NvYy0+aGVhZGVyLmFkZHIxLCBkZXN0LEVUSF9BTEVOKTsKLQltZW1jcHkoYXNzb2MtPmhlYWRlci5hZGRyMywgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweShhc3NvYy0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JYXNzb2MtPmNhcGFiaWxpdHkgPSBjcHVfdG9fbGUxNihpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSID8KLQkJV0xBTl9DQVBBQklMSVRZX0JTUyA6IFdMQU5fQ0FQQUJJTElUWV9JQlNTKTsKLQotCi0JaWYoaWVlZS0+c2hvcnRfc2xvdCkKLQkJYXNzb2MtPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpOwotCi0JaWYgKGllZWUtPmhvc3RfZW5jcnlwdCkKLQkJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZWVlLT50eF9rZXlpZHhdOwotCWVsc2UgY3J5cHQgPSBOVUxMOwotCi0JZW5jcnlwdCA9ICggY3J5cHQgJiYgY3J5cHQtPm9wcyk7Ci0KLQlpZiAoZW5jcnlwdCkKLQkJYXNzb2MtPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpOwotCi0JYXNzb2MtPnN0YXR1cyA9IDA7Ci0JYXNzb2MtPmFpZCA9IGNwdV90b19sZTE2KGllZWUtPmFzc29jX2lkKTsKLQlpZiAoaWVlZS0+YXNzb2NfaWQgPT0gMHgyMDA3KSBpZWVlLT5hc3NvY19pZD0wOwotCWVsc2UgaWVlZS0+YXNzb2NfaWQrKzsKLQotCXRhZyA9ICh1OCopIHNrYl9wdXQoc2tiLCByYXRlX2xlbik7Ci0KLQlpZWVlODAyMTFfTUZJRV9CcmF0ZShpZWVlLCAmdGFnKTsKLQlpZWVlODAyMTFfTUZJRV9HcmF0ZShpZWVlLCAmdGFnKTsKLQotCXJldHVybiBza2I7Ci19Ci0KLXN0cnVjdCBza19idWZmKiBpZWVlODAyMTFfYXV0aF9yZXNwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLGludCBzdGF0dXMsIHU4ICpkZXN0KQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqYXV0aDsKLQlpbnQgbGVuID0gaWVlZS0+dHhfaGVhZHJvb20gKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbikrMTsKLQotCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKLQotCWlmICghc2tiKQotCQlyZXR1cm4gTlVMTDsKLQotCXNrYi0+bGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pOwotCi0JYXV0aCA9IChzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uICopc2tiLT5kYXRhOwotCi0JYXV0aC0+c3RhdHVzID0gY3B1X3RvX2xlMTYoc3RhdHVzKTsKLQlhdXRoLT50cmFuc2FjdGlvbiA9IGNwdV90b19sZTE2KDIpOwotCWF1dGgtPmFsZ29yaXRobSA9IGNwdV90b19sZTE2KFdMQU5fQVVUSF9PUEVOKTsKLQotCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjMsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQltZW1jcHkoYXV0aC0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMSwgZGVzdCwgRVRIX0FMRU4pOwotCWF1dGgtPmhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQVVUSCk7Ci0JcmV0dXJuIHNrYjsKLQotCi19Ci0KLXN0cnVjdCBza19idWZmKiBpZWVlODAyMTFfbnVsbF9mdW5jKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLHNob3J0IHB3cikKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKiBoZHI7Ci0KLQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpOwotCi0JaWYgKCFza2IpCi0JCXJldHVybiBOVUxMOwotCi0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKilza2JfcHV0KHNrYixzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKTsKLQotCW1lbWNweShoZHItPmFkZHIxLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKLQltZW1jcHkoaGRyLT5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweShoZHItPmFkZHIzLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKLQotCWhkci0+ZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX0RBVEEgfAotCQlJRUVFODAyMTFfU1RZUEVfTlVMTEZVTkMgfCBJRUVFODAyMTFfRkNUTF9UT0RTIHwKLQkJKHB3ciA/IElFRUU4MDIxMV9GQ1RMX1BNOjApKTsKLQotCXJldHVybiBza2I7Ci0KLQotfQotCi1zdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX3BzcG9sbF9mdW5jKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IGllZWU4MDIxMV9wc3BvbGxfaGRyKiBoZHI7Ci0KLSNpZmRlZiBVU0JfVVNFX0FMSUdOTUVOVAotICAgICAgICB1MzIgVG1wYWRkcj0wOwotICAgICAgICBpbnQgYWxpZ25tZW50PTA7Ci0gICAgICAgIHNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcHNwb2xsX2hkcikgKyBpZWVlLT50eF9oZWFkcm9vbSArIFVTQl81MTJCX0FMSUdOTUVOVF9TSVpFKTsKLSNlbHNlCi0Jc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wc3BvbGxfaGRyKStpZWVlLT50eF9oZWFkcm9vbSk7Ci0jZW5kaWYKLQlpZiAoIXNrYikKLQkJcmV0dXJuIE5VTEw7Ci0KLSNpZmRlZiBVU0JfVVNFX0FMSUdOTUVOVAotICAgICAgICBUbXBhZGRyID0gKHUzMilza2ItPmRhdGE7Ci0gICAgICAgIGFsaWdubWVudCA9IFRtcGFkZHIgJiAweDFmZjsKLSAgICAgICAgc2tiX3Jlc2VydmUoc2tiLChVU0JfNTEyQl9BTElHTk1FTlRfU0laRSAtIGFsaWdubWVudCkpOwotI2VuZGlmCi0Jc2tiX3Jlc2VydmUoc2tiLCBpZWVlLT50eF9oZWFkcm9vbSk7Ci0KLQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9wc3BvbGxfaGRyKilza2JfcHV0KHNrYixzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9wc3BvbGxfaGRyKSk7Ci0KLQltZW1jcHkoaGRyLT5ic3NpZCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7Ci0JbWVtY3B5KGhkci0+dGEsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQotCWhkci0+YWlkID0gY3B1X3RvX2xlMTYoaWVlZS0+YXNzb2NfaWQgfCAweGMwMDApOwotCWhkci0+ZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX0NUTCB8SUVFRTgwMjExX1NUWVBFX1BTUE9MTCB8IElFRUU4MDIxMV9GQ1RMX1BNKTsKLQotCXJldHVybiBza2I7Ci0KLX0KLQotCi12b2lkIGllZWU4MDIxMV9yZXNwX3RvX2Fzc29jX3JxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCogZGVzdCkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gaWVlZTgwMjExX2Fzc29jX3Jlc3AoaWVlZSwgZGVzdCk7Ci0KLQlpZiAoYnVmKQotCQlzb2Z0bWFjX21nbXRfeG1pdChidWYsIGllZWUpOwotfQotCi0KLXZvaWQgaWVlZTgwMjExX3Jlc3BfdG9fYXV0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IHMsIHU4KiBkZXN0KQotewotCXN0cnVjdCBza19idWZmICpidWYgPSBpZWVlODAyMTFfYXV0aF9yZXNwKGllZWUsIHMsIGRlc3QpOwotCi0JaWYgKGJ1ZikKLQkJc29mdG1hY19tZ210X3htaXQoYnVmLCBpZWVlKTsKLX0KLQotCi12b2lkIGllZWU4MDIxMV9yZXNwX3RvX3Byb2JlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCAqZGVzdCkKLXsKLQotCi0Jc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGllZWU4MDIxMV9wcm9iZV9yZXNwKGllZWUsIGRlc3QpOwotCWlmIChidWYpCi0JCXNvZnRtYWNfbWdtdF94bWl0KGJ1ZiwgaWVlZSk7Ci19Ci0KLQotaW5saW5lIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfYXNzb2NpYXRpb25fcmVxKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uLHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lICpoZHI7Ci0JdTggKnRhZzsKLQl1OCogaHRfY2FwX2J1ZiA9IE5VTEw7Ci0JdTggaHRfY2FwX2xlbj0wOwotCXU4KiByZWFsdGVrX2llX2J1Zj1OVUxMOwotCXU4IHJlYWx0ZWtfaWVfbGVuPTA7Ci0JaW50IHdwYV9pZV9sZW49IGllZWUtPndwYV9pZV9sZW47Ci0JdW5zaWduZWQgaW50IGNraXBfaWVfbGVuPTA7Ci0JdW5zaWduZWQgaW50IGNjeHJtX2llX2xlbj0wOwotCXVuc2lnbmVkIGludCBjeHZlcm51bV9pZV9sZW49MDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEqIGNyeXB0OwotCWludCBlbmNyeXB0OwotCi0JdW5zaWduZWQgaW50IHJhdGVfbGVuID0gaWVlZTgwMjExX01GSUVfcmF0ZV9sZW4oaWVlZSk7Ci0JdW5zaWduZWQgaW50IHdtbV9pbmZvX2xlbiA9IGJlYWNvbi0+cW9zX2RhdGEuc3VwcG9ydGVkPzk6MDsKLSNpZmRlZiBUSE9NQVNfVFVSQk8KLQl1bnNpZ25lZCBpbnQgdHVyYm9faW5mb19sZW4gPSBiZWFjb24tPlR1cmJvX0VuYWJsZT85OjA7Ci0jZW5kaWYKLQotCWludCBsZW4gPSAwOwotCi0JY3J5cHQgPSBpZWVlLT5jcnlwdFtpZWVlLT50eF9rZXlpZHhdOwotCWVuY3J5cHQgPSBpZWVlLT5ob3N0X2VuY3J5cHQgJiYgY3J5cHQgJiYgY3J5cHQtPm9wcyAmJiAoKDAgPT0gc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsIldFUCIpIHx8IHdwYV9pZV9sZW4pKTsKLQotCS8vSW5jbHVkZSBIaWdoIFRocm91cHV0IGNhcGFiaWxpdHkgJiYgUmVhbHRlayBwcm9wcmlldGFyeQotCWlmKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0JiZpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQpCi0JewotCQlodF9jYXBfYnVmID0gKHU4KikmKGllZWUtPnBIVEluZm8tPlNlbGZIVENhcCk7Ci0JCWh0X2NhcF9sZW4gPSBzaXplb2YoaWVlZS0+cEhUSW5mby0+U2VsZkhUQ2FwKTsKLQkJSFRDb25zdHJ1Y3RDYXBhYmlsaXR5RWxlbWVudChpZWVlLCBodF9jYXBfYnVmLCAmaHRfY2FwX2xlbiwgZW5jcnlwdCk7Ci0JCWlmKGllZWUtPnBIVEluZm8tPmJDdXJyZW50UlQyUlRBZ2dyZWdhdGlvbikKLQkJewotCQkJcmVhbHRla19pZV9idWYgPSBpZWVlLT5wSFRJbmZvLT5zelJUMlJUQWdnQnVmZmVyOwotCQkJcmVhbHRla19pZV9sZW4gPSBzaXplb2YoIGllZWUtPnBIVEluZm8tPnN6UlQyUlRBZ2dCdWZmZXIpOwotCQkJSFRDb25zdHJ1Y3RSVDJSVEFnZ0VsZW1lbnQoaWVlZSwgcmVhbHRla19pZV9idWYsICZyZWFsdGVrX2llX2xlbik7Ci0KLQkJfQotCX0KLQlpZihpZWVlLT5xb3Nfc3VwcG9ydCl7Ci0JCXdtbV9pbmZvX2xlbiA9IGJlYWNvbi0+cW9zX2RhdGEuc3VwcG9ydGVkPzk6MDsKLQl9Ci0KLQotCWlmKGJlYWNvbi0+YkNraXBTdXBwb3J0ZWQpCi0JewotCQlja2lwX2llX2xlbiA9IDMwKzI7Ci0JfQotCWlmKGJlYWNvbi0+YkNjeFJtRW5hYmxlKQotCXsKLQkJY2N4cm1faWVfbGVuID0gNisyOwotCX0KLQlpZiggYmVhY29uLT5Cc3NDY3hWZXJOdW1iZXIgPj0gMiApCi0JewotCQljeHZlcm51bV9pZV9sZW4gPSA1KzI7Ci0JfQotI2lmZGVmIFRIT01BU19UVVJCTwotCWxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUpKyAyCi0JCSsgYmVhY29uLT5zc2lkX2xlbi8vZXNzaWQgdGFnZ2VkIHZhbAotCQkrIHJhdGVfbGVuLy9yYXRlcyB0YWdnZWQgdmFsCi0JCSsgd3BhX2llX2xlbgotCQkrIHdtbV9pbmZvX2xlbgotCQkrIHR1cmJvX2luZm9fbGVuCi0gICAgICAgICAgICAgICAgKyBodF9jYXBfbGVuCi0JCSsgcmVhbHRla19pZV9sZW4KLQkJKyBja2lwX2llX2xlbgotCQkrIGNjeHJtX2llX2xlbgotCQkrIGN4dmVybnVtX2llX2xlbgotCQkrIGllZWUtPnR4X2hlYWRyb29tOwotI2Vsc2UKLQlsZW4gPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lKSsgMgotCQkrIGJlYWNvbi0+c3NpZF9sZW4vL2Vzc2lkIHRhZ2dlZCB2YWwKLQkJKyByYXRlX2xlbi8vcmF0ZXMgdGFnZ2VkIHZhbAotCQkrIHdwYV9pZV9sZW4KLQkJKyB3bW1faW5mb19sZW4KLSAgICAgICAgICAgICAgICArIGh0X2NhcF9sZW4KLQkJKyByZWFsdGVrX2llX2xlbgotCQkrIGNraXBfaWVfbGVuCi0JCSsgY2N4cm1faWVfbGVuCi0JCSsgY3h2ZXJudW1faWVfbGVuCi0JCSsgaWVlZS0+dHhfaGVhZHJvb207Ci0jZW5kaWYKLQotCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKLQotCWlmICghc2tiKQotCQlyZXR1cm4gTlVMTDsKLQotCXNrYl9yZXNlcnZlKHNrYiwgaWVlZS0+dHhfaGVhZHJvb20pOwotCi0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSAqKQotCQlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVxdWVzdF9mcmFtZSkrMik7Ci0KLQotCWhkci0+aGVhZGVyLmZyYW1lX2N0bCA9IElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVE7Ci0JaGRyLT5oZWFkZXIuZHVyYXRpb25faWQ9IDM3OyAvL0ZJWE1FCi0JbWVtY3B5KGhkci0+aGVhZGVyLmFkZHIxLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7Ci0JbWVtY3B5KGhkci0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KGhkci0+aGVhZGVyLmFkZHIzLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7Ci0KLQltZW1jcHkoaWVlZS0+YXBfbWFjX2FkZHIsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsvL2ZvciBIVyBzZWN1cml0eSwgSm9obgotCi0JaGRyLT5jYXBhYmlsaXR5ID0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX0JTUyk7Ci0JaWYgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZICkKLQkJaGRyLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKTsKLQotCWlmIChiZWFjb24tPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpCi0JCWhkci0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpOyAvL2FkZCBzaG9ydF9wcmVhbWJsZSBoZXJlCi0KLQlpZihpZWVlLT5zaG9ydF9zbG90KQotCQloZHItPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpOwotIAlpZiAod21tX2luZm9fbGVuKSAvL1FPUwotCWhkci0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfUU9TKTsKLQotCWhkci0+bGlzdGVuX2ludGVydmFsID0gMHhhOyAvL0ZJWE1FCi0KLQloZHItPmluZm9fZWxlbWVudFswXS5pZCA9IE1GSUVfVFlQRV9TU0lEOwotCi0JaGRyLT5pbmZvX2VsZW1lbnRbMF0ubGVuID0gYmVhY29uLT5zc2lkX2xlbjsKLQl0YWcgPSBza2JfcHV0KHNrYiwgYmVhY29uLT5zc2lkX2xlbik7Ci0JbWVtY3B5KHRhZywgYmVhY29uLT5zc2lkLCBiZWFjb24tPnNzaWRfbGVuKTsKLQotCXRhZyA9IHNrYl9wdXQoc2tiLCByYXRlX2xlbik7Ci0KLQlpZWVlODAyMTFfTUZJRV9CcmF0ZShpZWVlLCAmdGFnKTsKLQlpZWVlODAyMTFfTUZJRV9HcmF0ZShpZWVlLCAmdGFnKTsKLQkvLyBGb3IgQ0NYIDEgUzEzLCBDS0lQLiBBZGRlZCBieSBBbm5pZSwgMjAwNi0wOC0xNC4KLQlpZiggYmVhY29uLT5iQ2tpcFN1cHBvcnRlZCApCi0JewotCQlzdGF0aWMgdTgJQWlyb25ldEllT3VpW10gPSB7MHgwMCwgMHgwMSwgMHg2Nn07IC8vICI0NTAwLWNsaWVudCIKLQkJdTgJQ2N4QWlyb25ldEJ1ZlszMF07Ci0JCU9DVEVUX1NUUklORwlvc0NjeEFpcm9uZXRJRTsKLQotCQltZW1zZXQoQ2N4QWlyb25ldEJ1ZiwgMCwzMCk7Ci0JCW9zQ2N4QWlyb25ldElFLk9jdGV0ID0gQ2N4QWlyb25ldEJ1ZjsKLQkJb3NDY3hBaXJvbmV0SUUuTGVuZ3RoID0gc2l6ZW9mKENjeEFpcm9uZXRCdWYpOwotCQkvLwotCQkvLyBSZWYuIENDWCB0ZXN0IHBsYW4gdjMuNjEsIDMuMi4zLjEgc3RlcCAxMy4KLQkJLy8gV2Ugd2FudCB0byBtYWtlIHRoZSBkZXZpY2UgdHlwZSBhcyAiNDUwMC1jbGllbnQiLiAwNjA5MjYsIGJ5IENDVy4KLQkJLy8KLQkJbWVtY3B5KG9zQ2N4QWlyb25ldElFLk9jdGV0LCBBaXJvbmV0SWVPdWksIHNpemVvZihBaXJvbmV0SWVPdWkpKTsKLQotCQkvLyBDQ1gxIHNwZWMgVjEuMTMsIEEwMS4xIENLSVAgTmVnb3RpYXRpb24gKHBhZ2UyMyk6Ci0JCS8vICJUaGUgQ0tJUCBuZWdvdGlhdGlvbiBpcyBzdGFydGVkIHdpdGggdGhlIGFzc29jaWF0ZSByZXF1ZXN0IGZyb20gdGhlIGNsaWVudCB0byB0aGUgYWNjZXNzIHBvaW50LAotCQkvLyAgY29udGFpbmluZyBhbiBBaXJvbmV0IGVsZW1lbnQgd2l0aCBib3RoIHRoZSBNSUMgYW5kIEtQIGJpdHMgc2V0LiIKLQkJb3NDY3hBaXJvbmV0SUUuT2N0ZXRbSUVfQ0lTQ09fRkxBR19QT1NJVElPTl0gfD0gIChTVVBQT1JUX0NLSVBfUEt8U1VQUE9SVF9DS0lQX01JQykgOwotCQl0YWcgPSBza2JfcHV0KHNrYiwgY2tpcF9pZV9sZW4pOwotCQkqdGFnKysgPSBNRklFX1RZUEVfQUlST05FVDsKLQkJKnRhZysrID0gb3NDY3hBaXJvbmV0SUUuTGVuZ3RoOwotCQltZW1jcHkodGFnLG9zQ2N4QWlyb25ldElFLk9jdGV0LG9zQ2N4QWlyb25ldElFLkxlbmd0aCk7Ci0JCXRhZyArPSBvc0NjeEFpcm9uZXRJRS5MZW5ndGg7Ci0JfQotCi0JaWYoYmVhY29uLT5iQ2N4Um1FbmFibGUpCi0JewotCQlzdGF0aWMgdTggQ2N4Um1DYXBCdWZbXSA9IHsweDAwLCAweDQwLCAweDk2LCAweDAxLCAweDAxLCAweDAwfTsKLQkJT0NURVRfU1RSSU5HIG9zQ2N4Um1DYXA7Ci0KLQkJb3NDY3hSbUNhcC5PY3RldCA9IENjeFJtQ2FwQnVmOwotCQlvc0NjeFJtQ2FwLkxlbmd0aCA9IHNpemVvZihDY3hSbUNhcEJ1Zik7Ci0JCXRhZyA9IHNrYl9wdXQoc2tiLGNjeHJtX2llX2xlbik7Ci0JCSp0YWcrKyA9IE1GSUVfVFlQRV9HRU5FUklDOwotCQkqdGFnKysgPSBvc0NjeFJtQ2FwLkxlbmd0aDsKLQkJbWVtY3B5KHRhZyxvc0NjeFJtQ2FwLk9jdGV0LG9zQ2N4Um1DYXAuTGVuZ3RoKTsKLQkJdGFnICs9IG9zQ2N4Um1DYXAuTGVuZ3RoOwotCX0KLQotCWlmKCBiZWFjb24tPkJzc0NjeFZlck51bWJlciA+PSAyICkKLQl7Ci0JCXU4CQkJQ2N4VmVyTnVtQnVmW10gPSB7MHgwMCwgMHg0MCwgMHg5NiwgMHgwMywgMHgwMH07Ci0JCU9DVEVUX1NUUklORwlvc0NjeFZlck51bTsKLQkJQ2N4VmVyTnVtQnVmWzRdID0gYmVhY29uLT5Cc3NDY3hWZXJOdW1iZXI7Ci0JCW9zQ2N4VmVyTnVtLk9jdGV0ID0gQ2N4VmVyTnVtQnVmOwotCQlvc0NjeFZlck51bS5MZW5ndGggPSBzaXplb2YoQ2N4VmVyTnVtQnVmKTsKLQkJdGFnID0gc2tiX3B1dChza2IsY3h2ZXJudW1faWVfbGVuKTsKLQkJKnRhZysrID0gTUZJRV9UWVBFX0dFTkVSSUM7Ci0JCSp0YWcrKyA9IG9zQ2N4VmVyTnVtLkxlbmd0aDsKLQkJbWVtY3B5KHRhZyxvc0NjeFZlck51bS5PY3RldCxvc0NjeFZlck51bS5MZW5ndGgpOwotCQl0YWcgKz0gb3NDY3hWZXJOdW0uTGVuZ3RoOwotCX0KLSAgICAgICAgLy9IVCBjYXAgZWxlbWVudAotCWlmKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0JiZpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQpewotCQlpZihpZWVlLT5wSFRJbmZvLT5lUGVlckhUU3BlY1ZlciAhPSBIVF9TUEVDX1ZFUl9FV0MpCi0JCXsKLQkJCXRhZyA9IHNrYl9wdXQoc2tiLCBodF9jYXBfbGVuKTsKLQkJCSp0YWcrKyA9IE1GSUVfVFlQRV9IVF9DQVA7Ci0JCQkqdGFnKysgPSBodF9jYXBfbGVuIC0gMjsKLQkJCW1lbWNweSh0YWcsIGh0X2NhcF9idWYsaHRfY2FwX2xlbiAtMik7Ci0JCQl0YWcgKz0gaHRfY2FwX2xlbiAtMjsKLQkJfQotCX0KLQotCi0JLy9jaG9vc2Ugd2hhdCB3cGFfc3VwcGxpY2FudCBnaXZlcyB0byBhc3NvY2lhdGUuCi0JdGFnID0gc2tiX3B1dChza2IsIHdwYV9pZV9sZW4pOwotCWlmICh3cGFfaWVfbGVuKXsKLQkJbWVtY3B5KHRhZywgaWVlZS0+d3BhX2llLCBpZWVlLT53cGFfaWVfbGVuKTsKLQl9Ci0KLQl0YWcgPSBza2JfcHV0KHNrYix3bW1faW5mb19sZW4pOwotCWlmKHdtbV9pbmZvX2xlbikgewotCSAgaWVlZTgwMjExX1dNTV9JbmZvKGllZWUsICZ0YWcpOwotCX0KLSNpZmRlZiBUSE9NQVNfVFVSQk8KLQl0YWcgPSBza2JfcHV0KHNrYix0dXJib19pbmZvX2xlbik7Ci0gICAgICAgIGlmKHR1cmJvX2luZm9fbGVuKSB7Ci0gICAgICAgICAgICAgICAgaWVlZTgwMjExX1RVUkJPX0luZm8oaWVlZSwgJnRhZyk7Ci0gICAgICAgIH0KLSNlbmRpZgotCi0JaWYoaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQmJmllZWUtPnBIVEluZm8tPmJFbmFibGVIVCl7Ci0JCWlmKGllZWUtPnBIVEluZm8tPmVQZWVySFRTcGVjVmVyID09IEhUX1NQRUNfVkVSX0VXQykKLQkJewotCQkJdGFnID0gc2tiX3B1dChza2IsIGh0X2NhcF9sZW4pOwotCQkJKnRhZysrID0gTUZJRV9UWVBFX0dFTkVSSUM7Ci0JCQkqdGFnKysgPSBodF9jYXBfbGVuIC0gMjsKLQkJCW1lbWNweSh0YWcsIGh0X2NhcF9idWYsaHRfY2FwX2xlbiAtIDIpOwotCQkJdGFnICs9IGh0X2NhcF9sZW4gLTI7Ci0JCX0KLQotCQlpZihpZWVlLT5wSFRJbmZvLT5iQ3VycmVudFJUMlJUQWdncmVnYXRpb24pewotCQkJdGFnID0gc2tiX3B1dChza2IsIHJlYWx0ZWtfaWVfbGVuKTsKLQkJCSp0YWcrKyA9IE1GSUVfVFlQRV9HRU5FUklDOwotCQkJKnRhZysrID0gcmVhbHRla19pZV9sZW4gLSAyOwotCQkJbWVtY3B5KHRhZywgcmVhbHRla19pZV9idWYscmVhbHRla19pZV9sZW4gLTIgKTsKLQkJfQotCX0KLQlyZXR1cm4gc2tiOwotfQotCi12b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCi17Ci0KLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7Ci0KLQlpZWVlLT5hc3NvY2lhdGVfc2VxKys7Ci0KLQkvKiBkb24ndCBzY2FuLCBhbmQgYXZvaWQgdG8gaGF2ZSB0aGUgUlggcGF0aCBwb3NzaWJpbHkKLQkgKiB0cnkgYWdhaW4gdG8gYXNzb2NpYXRlLiBFdmVuIGRvIG5vdCByZWFjdCB0byBBVVRIIG9yCi0JICogQVNTT0MgcmVzcG9uc2UuIEp1c3Qgd2FpdCBmb3IgdGhlIHJldHJ5IHdxIHRvIGJlIHNjaGVkdWxlZC4KLQkgKiBIZXJlIHdlIHdpbGwgY2hlY2sgaWYgdGhlcmUgYXJlIGdvb2QgbmV0cyB0byBhc3NvY2lhdGUKLQkgKiB3aXRoLCBzbyB3ZSByZXRyeSBvciBqdXN0IGdldCBiYWNrIHRvIE5PX0xJTksgYW5kIHNjYW5uaW5nCi0JICovCi0JaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVElORyl7Ci0JCUlFRUU4MDIxMV9ERUJVR19NR01UKCJBdXRoZW50aWNhdGlvbiBmYWlsZWRcbiIpOwotCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLm5vX2F1dGhfcnMrKzsKLQl9ZWxzZXsKLQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIkFzc29jaWF0aW9uIGZhaWxlZFxuIik7Ci0JCWllZWUtPnNvZnRtYWNfc3RhdHMubm9fYXNzX3JzKys7Ci0JfQotCi0JaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfUkVUUlk7Ci0KLQlxdWV1ZV9kZWxheWVkX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIElFRUU4MDIxMV9TT0ZUTUFDX0FTU09DX1JFVFJZX1RJTUUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKLX0KLQotdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0X2NiKHVuc2lnbmVkIGxvbmcgZGV2KQotewotCWllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnQoKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICopIGRldik7Ci19Ci0KLQotdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCi0JSUVFRTgwMjExX0RFQlVHX01HTVQoIlN0b3BwaW5nIHNjYW5cbiIpOwotCi0JaWVlZS0+c29mdG1hY19zdGF0cy50eF9hdXRoX3JxKys7Ci0Jc2tiPWllZWU4MDIxMV9hdXRoZW50aWNhdGlvbl9yZXEoYmVhY29uLCBpZWVlLCAwKTsKLQotCWlmICghc2tiKQotCQlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KGllZWUpOwotCWVsc2V7Ci0JCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HIDsKLQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIlNlbmRpbmcgYXV0aGVudGljYXRpb24gcmVxdWVzdFxuIik7Ci0JCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7Ci0JCS8vQlVHT04gd2hlbiB5b3UgdHJ5IHRvIGFkZF90aW1lciB0d2ljZSwgdXNpbmcgbW9kX3RpbWVyIG1heSBiZSBiZXR0ZXIsIGpvaG4wNzA5Ci0JCWlmKCF0aW1lcl9wZW5kaW5nKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpKXsKLQkJCWllZWUtPmFzc29jaWF0ZV90aW1lci5leHBpcmVzID0gamlmZmllcyArIChIWiAvIDIpOwotCQkJYWRkX3RpbWVyKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOwotCQl9Ci0JfQotfQotCi12b2lkIGllZWU4MDIxMV9ydGxfYXV0aF9jaGFsbGVuZ2Uoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICpjaGFsbGVuZ2UsIGludCBjaGxlbikKLXsKLQl1OCAqYzsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKLQotCWllZWUtPmFzc29jaWF0ZV9zZXErKzsKLQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X2F1dGhfcnErKzsKLQotCXNrYiA9IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbl9yZXEoYmVhY29uLCBpZWVlLCBjaGxlbisyKTsKLQlpZiAoIXNrYikKLQkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKLQllbHNlewotCQljID0gc2tiX3B1dChza2IsIGNobGVuKzIpOwotCQkqKGMrKykgPSBNRklFX1RZUEVfQ0hBTExFTkdFOwotCQkqKGMrKykgPSBjaGxlbjsKLQkJbWVtY3B5KGMsIGNoYWxsZW5nZSwgY2hsZW4pOwotCi0JCUlFRUU4MDIxMV9ERUJVR19NR01UKCJTZW5kaW5nIGF1dGhlbnRpY2F0aW9uIGNoYWxsZW5nZSByZXNwb25zZVxuIik7Ci0KLQkJaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoaWVlZSwgc2tiLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICkpOwotCi0JCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7Ci0JCW1vZF90aW1lcigmaWVlZS0+YXNzb2NpYXRlX3RpbWVyLCBqaWZmaWVzICsgKEhaLzIpKTsKLQl9Ci0Ja2ZyZWUoY2hhbGxlbmdlKTsKLX0KLQotdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCXN0cnVjdCBza19idWZmKiBza2I7Ci0Jc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24gPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOwotCi0JZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7Ci0KLQlJRUVFODAyMTFfREVCVUdfTUdNVCgiU2VuZGluZyBhc3NvY2lhdGlvbiByZXF1ZXN0XG4iKTsKLQotCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfYXNzX3JxKys7Ci0Jc2tiPWllZWU4MDIxMV9hc3NvY2lhdGlvbl9yZXEoYmVhY29uLCBpZWVlKTsKLQlpZiAoIXNrYikKLQkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKLQllbHNlewotCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOwotCQltb2RfdGltZXIoJmllZWUtPmFzc29jaWF0ZV90aW1lciwgamlmZmllcyArIChIWi8yKSk7Ci0JfQotfQotdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLSAgICAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIGFzc29jaWF0ZV9jb21wbGV0ZV93cSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiQXNzb2NpYXRlZCBzdWNjZXNzZnVsbHlcbiIpOwotCWllZWUtPmlzX3JvYW1pbmcgPSBmYWxzZTsKLQlpZihpZWVlODAyMTFfaXNfNTRnKGllZWUtPmN1cnJlbnRfbmV0d29yaykgJiYKLQkJKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKSl7Ci0KLQkJaWVlZS0+cmF0ZSA9IDEwODsKLQkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBHIHJhdGVzOiVkXG4iLCBpZWVlLT5yYXRlKTsKLQl9ZWxzZXsKLQkJaWVlZS0+cmF0ZSA9IDIyOwotCQlwcmludGsoS0VSTl9JTkZPIlVzaW5nIEIgcmF0ZXM6JWRcbiIsIGllZWUtPnJhdGUpOwotCX0KLQlpZiAoaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQmJmllZWUtPnBIVEluZm8tPmJFbmFibGVIVCkKLQl7Ci0JCXByaW50aygiU3VjY2Vzc2Z1bGx5IGFzc29jaWF0ZWQsIGh0IGVuYWJsZWRcbiIpOwotCQlIVE9uQXNzb2NSc3AoaWVlZSk7Ci0JfQotCWVsc2UKLQl7Ci0JCXByaW50aygiU3VjY2Vzc2Z1bGx5IGFzc29jaWF0ZWQsIGh0IG5vdCBlbmFibGVkKCVkLCAlZClcbiIsIGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0LCBpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQpOwotCQltZW1zZXQoaWVlZS0+ZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCwgMCwgMTYpOwotCX0KLQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5TbG90TnVtID0gMiAqICgxICsgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbC81MDApOwotCS8vIFRvIHByZXZlbnQgdGhlIGltbWVkaWF0ZWx5IGNhbGxpbmcgd2F0Y2hfZG9nIGFmdGVyIGFzc29jaWF0aW9uLgotCWlmKGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZCY25JblBlcmlvZD09MHx8aWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkRhdGFJblBlcmlvZD09MCApCi0JewotCQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2QmNuSW5QZXJpb2QgPSAxOwotCQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2RGF0YUluUGVyaW9kPSAxOwotCX0KLQlpZWVlLT5saW5rX2NoYW5nZShpZWVlKTsKLQlpZihpZWVlLT5pc19zaWxlbnRfcmVzZXQgPT0gMCl7Ci0JCXByaW50aygiPT09PT09PT09PT09Pm5vcm1hbCBhc3NvY2lhdGVcbiIpOwotCW5vdGlmeV93eF9hc3NvY19ldmVudChpZWVlKTsKLQl9Ci0JZWxzZSBpZihpZWVlLT5pc19zaWxlbnRfcmVzZXQgPT0gMSkKLQl7Ci0JCXByaW50aygiPT09PT09PT09PT09PT09PT09PnNpbGVudCByZXNldCBhc3NvY2lhdGVcbiIpOwotCQlpZWVlLT5pc19zaWxlbnRfcmVzZXQgPSAwOwotCX0KLQotCWlmIChpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKQotCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUpOwotCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKLX0KLQotdm9pZCBpZWVlODAyMTFfYXNzb2NpYXRlX2NvbXBsZXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOwotCi0JaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEOwotCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5hc3NvY2lhdGVfY29tcGxldGVfd3EpOwotfQotCi12b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLSAgICAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIGFzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOwotCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKLSNpZmRlZiBFTkFCTEVfSVBTCi0JaWYoaWVlZS0+aWVlZTgwMjExX2lwc19sZWF2ZSAhPSBOVUxMKQotCQlpZWVlLT5pZWVlODAyMTFfaXBzX2xlYXZlKGllZWUpOwotI2VuZGlmCi0KLQlkb3duKCZpZWVlLT53eF9zZW0pOwotCi0JaWYgKGllZWUtPmRhdGFfaGFyZF9zdG9wKQotCQlpZWVlLT5kYXRhX2hhcmRfc3RvcChpZWVlKTsKLQotCWllZWU4MDIxMV9zdG9wX3NjYW4oaWVlZSk7Ci0JcHJpbnRrKCI9PT0+JXMoKSwgY2hhbjolZFxuIiwgX19GVU5DVElPTl9fLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7Ci0JSFRTZXRDb25uZWN0QndNb2RlKGllZWUsIEhUX0NIQU5ORUxfV0lEVEhfMjAsIEhUX0VYVENITkxfT0ZGU0VUX05PX0VYVCk7Ci0KLQlpZWVlLT5hc3NvY2lhdGVfc2VxID0gMTsKLQlpZWVlODAyMTFfYXNzb2NpYXRlX3N0ZXAxKGllZWUpOwotCi0JdXAoJmllZWUtPnd4X3NlbSk7Ci19Ci0KLWlubGluZSB2b2lkIGllZWU4MDIxMV9zb2Z0bWFjX25ld19uZXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0KQotewotCXU4IHRtcF9zc2lkW0lXX0VTU0lEX01BWF9TSVpFKzFdOwotCWludCB0bXBfc3NpZF9sZW4gPSAwOwotCi0Jc2hvcnQgYXBzZXQsc3NpZHNldCxzc2lkYnJvYWQsYXBtYXRjaCxzc2lkbWF0Y2g7Ci0KLQkvKiB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBuZXcgbmV3IG9ubHkgaWYgd2UgYXJlIG5vdCBhc3NvY2lhdGVkCi0JICogYW5kIHdlIGFyZSBub3QgYXNzb2NpYXRpbmcgLyBhdXRoZW50aWNhdGluZwotCSAqLwotCWlmIChpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTk9MSU5LKQotCQlyZXR1cm47Ci0KLQlpZiAoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgJiYgIShuZXQtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfQlNTKSkKLQkJcmV0dXJuOwotCi0JaWYgKChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpICYmICEobmV0LT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpKQotCQlyZXR1cm47Ci0KLQotCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEgfHwgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKXsKLQkJLyogaWYgdGhlIHVzZXIgc3BlY2lmaWVkIHRoZSBBUCBNQUMsIHdlIG5lZWQgYWxzbyB0aGUgZXNzaWQKLQkJICogVGhpcyBjb3VsZCBiZSBvYnRhaW5lZCBieSBiZWFjb25zIG9yLCBpZiB0aGUgbmV0d29yayBkb2VzIG5vdAotCQkgKiBicm9hZGNhc3QgaXQsIGl0IGNhbiBiZSBwdXQgbWFudWFsbHkuCi0JCSAqLwotCQlhcHNldCA9IGllZWUtPndhcF9zZXQ7Ci0JCXNzaWRzZXQgPSBpZWVlLT5zc2lkX3NldDsKLQkJc3NpZGJyb2FkID0gICEobmV0LT5zc2lkX2xlbiA9PSAwIHx8IG5ldC0+c3NpZFswXT09ICdcMCcpOwotCQlhcG1hdGNoID0gKG1lbWNtcChpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIG5ldC0+YnNzaWQsIEVUSF9BTEVOKT09MCk7Ci0JCXNzaWRtYXRjaCA9IChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPT0gbmV0LT5zc2lkX2xlbikmJlwKLQkJCQkoIXN0cm5jbXAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIG5ldC0+c3NpZCwgbmV0LT5zc2lkX2xlbikpOwotCi0KLQkJaWYgKAkvKiBpZiB0aGUgdXNlciBzZXQgdGhlIEFQIGNoZWNrIGlmIG1hdGNoLgotCQkgICAgICAgICAqIGlmIHRoZSBuZXR3b3JrIGRvZXMgbm90IGJyb2FkY2FzdCBlc3NpZCB3ZSBjaGVjayB0aGUgdXNlciBzdXBwbHllZCBBTlkgZXNzaWQKLQkJCSAqIGlmIHRoZSBuZXR3b3JrIGRvZXMgYnJvYWRjYXN0IGFuZCB0aGUgdXNlciBkb2VzIG5vdCBzZXQgZXNzaWQgaXQgaXMgT0sKLQkJCSAqIGlmIHRoZSBuZXR3b3JrIGRvZXMgYnJvYWRjYXN0IGFuZCB0aGUgdXNlciBkaWQgc2V0IGVzc2lkIGNoZWNoIGlmIGVzc2lkIG1hdGNoCi0JCQkgKi8KLQkJCSggYXBzZXQgJiYgYXBtYXRjaCAmJgotCQkJCSgoc3NpZHNldCAmJiBzc2lkYnJvYWQgJiYgc3NpZG1hdGNoKSB8fCAoc3NpZGJyb2FkICYmICFzc2lkc2V0KSB8fCAoIXNzaWRicm9hZCAmJiBzc2lkc2V0KSkgKSB8fAotCQkJLyogaWYgdGhlIGFwIGlzIG5vdCBzZXQsIGNoZWNrIHRoYXQgdGhlIHVzZXIgc2V0IHRoZSBic3NpZAotCQkJICogYW5kIHRoZSBuZXR3b3JrIGRvZXMgYnJhZGNhc3QgYW5kIHRoYXQgdGhvc2UgdHdvIGJzc2lkIG1hdGNoZXMKLQkJCSAqLwotCQkJKCFhcHNldCAmJiBzc2lkc2V0ICYmIHNzaWRicm9hZCAmJiBzc2lkbWF0Y2gpCi0JCQkpewotCQkJCS8qIGlmIHRoZSBlc3NpZCBpcyBoaWRkZW4gcmVwbGFjZSBpdCB3aXRoIHRoZQotCQkJCSogZXNzaWQgcHJvdmlkZWQgYnkgdGhlIHVzZXIuCi0JCQkJKi8KLQkJCQlpZiAoIXNzaWRicm9hZCl7Ci0JCQkJCXN0cm5jcHkodG1wX3NzaWQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBJV19FU1NJRF9NQVhfU0laRSk7Ci0JCQkJCXRtcF9zc2lkX2xlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbjsKLQkJCQl9Ci0JCQkJbWVtY3B5KCZpZWVlLT5jdXJyZW50X25ldHdvcmssIG5ldCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaykpOwotCi0JCQkJaWYgKCFzc2lkYnJvYWQpewotCQkJCQlzdHJuY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCB0bXBfc3NpZCwgSVdfRVNTSURfTUFYX1NJWkUpOwotCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPSB0bXBfc3NpZF9sZW47Ci0JCQkJfQotCQkJCXByaW50ayhLRVJOX0lORk8iTGlua2luZyB3aXRoICVzLGNoYW5uZWw6JWQsIHFvczolZCwgbXlIVDolZCwgbmV0d29ya0hUOiVkXG4iLGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsLCBpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuc3VwcG9ydGVkLCBpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NodC5iZFN1cHBvcnRIVCk7Ci0KLQkJCQlIVFJlc2V0SU9UU2V0dGluZyhpZWVlLT5wSFRJbmZvKTsKLQkJCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKXsKLQkJCQkJLyogSm9pbiB0aGUgbmV0d29yayBmb3IgdGhlIGZpcnN0IHRpbWUgKi8KLQkJCQkJaWVlZS0+QXNvY1JldHJ5Q291bnQgPSAwOwotCQkJCQkvL2ZvciBIVCBieSBhbXkgMDgwNTE0Ci0JCQkJCWlmKChpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuc3VwcG9ydGVkID09IDEpICYmCi0JCQkJCSAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NodC5iZFN1cHBvcnRIVCkKLS8qV0IsIDIwMDguMDkuMDk6YkN1cnJlbnRIVFN1cHBvcnQgYW5kIGJFbmFibGVIVCB0d28gZmxhZ3MgYXJlIGdvaW5nIHRvIHB1dCB0b2dldGhlciB0byBjaGVjayB3aGV0aGVyIHdlIGFyZSBpbiBIVCBub3csIHNvIG5lZWRuJ3QgdG8gY2hlY2sgYkVuYWJsZUhUIGZsYWdzIGhlcmUuIFRoYXQncyBpcyB0byBzYXkgd2Ugd2lsbCBzZXQgdG8gSFQgc3VwcG9ydCB3aGVuZXZlciBqb2luZWQgQVAgaGFzIHRoZSBhYmlsaXR5IHRvIHN1cHBvcnQgSFQuIEFuZCB3aGV0aGVyIHdlIGFyZSBpbiBIVCBvciBub3QsIHBsZWFzZSBjaGVjayBiQ3VycmVudEhUU3VwcG9ydCYmYkVuYWJsZUhUIG5vdyBwbGVhc2UuKi8KLQkJCQkJewotCQkJCQkJSFRSZXNldFNlbGZBbmRTYXZlUGVlclNldHRpbmcoaWVlZSwgJihpZWVlLT5jdXJyZW50X25ldHdvcmspKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCWllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID0gZmFsc2U7Ci0JCQkJCX0KLQotCQkJCQlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElORzsKLQkJCQkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOwotCQkJCX1lbHNlewotCQkJCQlpZihpZWVlODAyMTFfaXNfNTRnKGllZWUtPmN1cnJlbnRfbmV0d29yaykgJiYKLQkJCQkJCShpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikpewotCQkJCQkJaWVlZS0+cmF0ZSA9IDEwODsKLQkJCQkJCWllZWUtPlNldFdpcmVsZXNzTW9kZShpZWVlLCBJRUVFX0cpOwotCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBHIHJhdGVzXG4iKTsKLQkJCQkJfWVsc2V7Ci0JCQkJCQlpZWVlLT5yYXRlID0gMjI7Ci0JCQkJCQlpZWVlLT5TZXRXaXJlbGVzc01vZGUoaWVlZSwgSUVFRV9CKTsKLQkJCQkJCXByaW50ayhLRVJOX0lORk8iVXNpbmcgQiByYXRlc1xuIik7Ci0JCQkJCX0KLQkJCQkJbWVtc2V0KGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIDAsIDE2KTsKLQkJCQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEOwotCQkJCX0KLQotCQl9Ci0JfQotCi19Ci0KLXZvaWQgaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKnRhcmdldDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhcmdldCwgJmllZWUtPm5ldHdvcmtfbGlzdCwgbGlzdCkgewotCi0JCS8qIGlmIHRoZSBzdGF0ZSBiZWNvbWUgZGlmZmVyZW50IHRoYXQgTk9MSU5LIG1lYW5zCi0JCSAqIHdlIGhhZCBmb3VuZCB3aGF0IHdlIGFyZSBzZWFyY2hpbmcgZm9yCi0JCSAqLwotCi0JCWlmIChpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTk9MSU5LKQotCQkJYnJlYWs7Ci0KLQkJaWYgKGllZWUtPnNjYW5fYWdlID09IDAgfHwgdGltZV9hZnRlcih0YXJnZXQtPmxhc3Rfc2Nhbm5lZCArIGllZWUtPnNjYW5fYWdlLCBqaWZmaWVzKSkKLQkJaWVlZTgwMjExX3NvZnRtYWNfbmV3X25ldChpZWVlLCB0YXJnZXQpOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKLQotfQotCi0KLXN0YXRpYyBpbmxpbmUgdTE2IGF1dGhfcGFyc2Uoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTgqKiBjaGFsbGVuZ2UsIGludCAqY2hsZW4pCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqYTsKLQl1OCAqdDsKLQlpZiAoc2tiLT5sZW4gPCAgKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKS1zaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQpKSl7Ci0JCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlc3A6ICVkXG4iLHNrYi0+bGVuKTsKLQkJcmV0dXJuIDB4Y2FmZTsKLQl9Ci0JKmNoYWxsZW5nZSA9IE5VTEw7Ci0JYSA9IChzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKikgc2tiLT5kYXRhOwotCWlmKHNrYi0+bGVuID4gKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKSArMykpewotCQl0ID0gc2tiLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pOwotCi0JCWlmKCoodCsrKSA9PSBNRklFX1RZUEVfQ0hBTExFTkdFKXsKLQkJCSpjaGxlbiA9ICoodCsrKTsKLQkJCSpjaGFsbGVuZ2UgPSBrbWVtZHVwKHQsICpjaGxlbiwgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoISpjaGFsbGVuZ2UpCi0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gY3B1X3RvX2xlMTYoYS0+c3RhdHVzKTsKLQotfQotCi0KLWludCBhdXRoX3JxX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsdTgqIGRlc3QpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqYTsKLQotCWlmIChza2ItPmxlbiA8ICAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pLXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCkpKXsKLQkJSUVFRTgwMjExX0RFQlVHX01HTVQoImludmFsaWQgbGVuIGluIGF1dGggcmVxdWVzdDogJWRcbiIsc2tiLT5sZW4pOwotCQlyZXR1cm4gLTE7Ci0JfQotCWEgPSAoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiopIHNrYi0+ZGF0YTsKLQotCW1lbWNweShkZXN0LGEtPmhlYWRlci5hZGRyMiwgRVRIX0FMRU4pOwotCi0JaWYgKGxlMTZfdG9fY3B1KGEtPmFsZ29yaXRobSkgIT0gV0xBTl9BVVRIX09QRU4pCi0JCXJldHVybiAgV0xBTl9TVEFUVVNfTk9UX1NVUFBPUlRFRF9BVVRIX0FMRzsKLQotCXJldHVybiBXTEFOX1NUQVRVU19TVUNDRVNTOwotfQotCi1zdGF0aWMgc2hvcnQgcHJvYmVfcnFfcGFyc2Uoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsIHU4ICpzcmMpCi17Ci0JdTggKnRhZzsKLQl1OCAqc2tiZW5kOwotCXU4ICpzc2lkPU5VTEw7Ci0JdTggc3NpZGxlbiA9IDA7Ci0KLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgICpoZWFkZXIgPQotCQkoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICAqKSBza2ItPmRhdGE7Ci0KLQlpZiAoc2tiLT5sZW4gPCBzaXplb2YgKHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICApKQotCQlyZXR1cm4gLTE7IC8qIGNvcnJ1cHRlZCAqLwotCi0JbWVtY3B5KHNyYyxoZWFkZXItPmFkZHIyLCBFVEhfQUxFTik7Ci0KLQlza2JlbmQgPSAodTgqKXNrYi0+ZGF0YSArIHNrYi0+bGVuOwotCi0JdGFnID0gc2tiLT5kYXRhICsgc2l6ZW9mIChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKTsKLQotCXdoaWxlICh0YWcrMSA8IHNrYmVuZCl7Ci0JCWlmICgqdGFnID09IDApewotCQkJc3NpZCA9IHRhZysyOwotCQkJc3NpZGxlbiA9ICoodGFnKzEpOwotCQkJYnJlYWs7Ci0JCX0KLQkJdGFnKys7IC8qIHBvaW50IHRvIHRoZSBsZW4gZmllbGQgKi8KLQkJdGFnID0gdGFnICsgKih0YWcpOyAvKiBwb2ludCB0byB0aGUgbGFzdCBkYXRhIGJ5dGUgb2YgdGhlIHRhZyAqLwotCQl0YWcrKzsgLyogcG9pbnQgdG8gdGhlIG5leHQgdGFnICovCi0JfQotCi0JaWYgKHNzaWRsZW4gPT0gMCkgcmV0dXJuIDE7Ci0KLQlpZiAoIXNzaWQpIHJldHVybiAxOyAvKiBzc2lkIG5vdCBmb3VuZCBpbiB0YWdnZWQgcGFyYW0gKi8KLQlyZXR1cm4gKCFzdHJuY21wKHNzaWQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBzc2lkbGVuKSk7Ci0KLX0KLQotaW50IGFzc29jX3JxX3BhcnNlKHN0cnVjdCBza19idWZmICpza2IsdTgqIGRlc3QpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXF1ZXN0X2ZyYW1lICphOwotCi0JaWYgKHNrYi0+bGVuIDwgKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUpIC0KLQkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50KSkpIHsKLQotCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiaW52YWxpZCBsZW4gaW4gYXV0aCByZXF1ZXN0OiVkIFxuIiwgc2tiLT5sZW4pOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JYSA9IChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3JlcXVlc3RfZnJhbWUqKSBza2ItPmRhdGE7Ci0KLQltZW1jcHkoZGVzdCxhLT5oZWFkZXIuYWRkcjIsRVRIX0FMRU4pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTE2IGFzc29jX3BhcnNlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgKmFpZCkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICpyZXNwb25zZV9oZWFkOwotCXUxNiBzdGF0dXNfY29kZTsKLQotCWlmIChza2ItPmxlbiA8ICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSkpewotCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiaW52YWxpZCBsZW4gaW4gYXV0aCByZXNwOiAlZFxuIiwgc2tiLT5sZW4pOwotCQlyZXR1cm4gMHhjYWZlOwotCX0KLQotCXJlc3BvbnNlX2hlYWQgPSAoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSopIHNrYi0+ZGF0YTsKLQkqYWlkID0gbGUxNl90b19jcHUocmVzcG9uc2VfaGVhZC0+YWlkKSAmIDB4M2ZmZjsKLQotCXN0YXR1c19jb2RlID0gbGUxNl90b19jcHUocmVzcG9uc2VfaGVhZC0+c3RhdHVzKTsKLQlpZigoc3RhdHVzX2NvZGU9PVdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9SQVRFUyB8fCBcCi0JICAgc3RhdHVzX2NvZGU9PVdMQU5fU1RBVFVTX0NBUFNfVU5TVVBQT1JURUQpJiYKLQkgICAoKGllZWUtPm1vZGUgPT0gSUVFRV9HKSAmJgotCSAgICAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0gSUVFRV9OXzI0RykgJiYKLSAgICAgICAgICAgIChpZWVlLT5Bc29jUmV0cnlDb3VudCsrIDwgKFJUX0FTT0NfUkVUUllfTElNSVQtMSkpKSkgewotICAgICAgICAgICAgICAgICBpZWVlLT5wSFRJbmZvLT5JT1RBY3Rpb24gfD0gSFRfSU9UX0FDVF9QVVJFX05fTU9ERTsKLQl9ZWxzZSB7Ci0JCSBpZWVlLT5Bc29jUmV0cnlDb3VudCA9IDA7Ci0JfQotCi0JcmV0dXJuIGxlMTZfdG9fY3B1KHJlc3BvbnNlX2hlYWQtPnN0YXR1cyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotaWVlZTgwMjExX3J4X3Byb2JlX3JxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXU4IGRlc3RbRVRIX0FMRU5dOwotCi0JaWVlZS0+c29mdG1hY19zdGF0cy5yeF9wcm9iZV9ycSsrOwotCWlmIChwcm9iZV9ycV9wYXJzZShpZWVlLCBza2IsIGRlc3QpKXsKLQkJaWVlZS0+c29mdG1hY19zdGF0cy50eF9wcm9iZV9ycysrOwotCQlpZWVlODAyMTFfcmVzcF90b19wcm9iZShpZWVlLCBkZXN0KTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotaWVlZTgwMjExX3J4X2F1dGhfcnEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JdTggZGVzdFtFVEhfQUxFTl07Ci0JaW50IHN0YXR1czsKLQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2F1dGhfcnErKzsKLQotCXN0YXR1cyA9IGF1dGhfcnFfcGFyc2Uoc2tiLCBkZXN0KTsKLQlpZiAoc3RhdHVzICE9IC0xKSB7Ci0JCWllZWU4MDIxMV9yZXNwX3RvX2F1dGgoaWVlZSwgc3RhdHVzLCBkZXN0KTsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotaWVlZTgwMjExX3J4X2Fzc29jX3JxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXU4IGRlc3RbRVRIX0FMRU5dOwotCi0JaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hc3NfcnErKzsKLQlpZiAoYXNzb2NfcnFfcGFyc2Uoc2tiLGRlc3QpICE9IC0xKXsKLQkJaWVlZTgwMjExX3Jlc3BfdG9fYXNzb2NfcnEoaWVlZSwgZGVzdCk7Ci0JfQotCi0JcHJpbnRrKEtFUk5fSU5GTyJOZXcgY2xpZW50IGFzc29jaWF0ZWQ6ICVwTVxuIiwgZGVzdCk7Ci19Ci0KLQotCi12b2lkIGllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBwd3IpCi17Ci0KLQlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gaWVlZTgwMjExX251bGxfZnVuYyhpZWVlLCBwd3IpOwotCi0JaWYgKGJ1ZikKLQkJc29mdG1hY19wc19tZ210X3htaXQoYnVmLCBpZWVlKTsKLQotfQotCi12b2lkIGllZWU4MDIxMV9zdGFfcHNfc2VuZF9wc3BvbGxfZnJhbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCi17Ci0KLQlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gaWVlZTgwMjExX3BzcG9sbF9mdW5jKGllZWUpOwotCi0JaWYgKGJ1ZikKLQkJc29mdG1hY19wc19tZ210X3htaXQoYnVmLCBpZWVlKTsKLQotfQotCi1zaG9ydCBpZWVlODAyMTFfc3RhX3BzX3NsZWVwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1MzIgKnRpbWVfaCwgdTMyICp0aW1lX2wpCi17Ci0JaW50IHRpbWVvdXQgPSBpZWVlLT5wc190aW1lb3V0OwotCXU4IGR0aW07Ci0KLQlpZihpZWVlLT5MUFNEZWxheUNudCkKLQl7Ci0JCWllZWUtPkxQU0RlbGF5Q250IC0tOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlkdGltID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmR0aW1fZGF0YTsKLQlpZighKGR0aW0gJiBJRUVFODAyMTFfRFRJTV9WQUxJRCkpCi0JCXJldHVybiAwOwotCXRpbWVvdXQgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsOyAvL3Nob3VsZCB3ZSB1c2UgcHNfdGltZW91dCB2YWx1ZSBvciBiZWFjb25faW50ZXJ2YWwKLQlpZWVlLT5jdXJyZW50X25ldHdvcmsuZHRpbV9kYXRhID0gSUVFRTgwMjExX0RUSU1fSU5WQUxJRDsKLQkvKiB0aGVyZSdzIG5vIG5lZWQgdG8gbm9maXR5IEFQIHRoYXQgSSBmaW5kIHlvdSBidWZmZXJlZCB3aXRoIGJyb2FkY2FzdCBwYWNrZXQgKi8KLQlpZihkdGltICYgKElFRUU4MDIxMV9EVElNX1VDQVNUICYgaWVlZS0+cHMpKQotCQlyZXR1cm4gMjsKLQotCWlmKCF0aW1lX2FmdGVyKGppZmZpZXMsIGllZWUtPmRldi0+dHJhbnNfc3RhcnQgKyBNU0VDUyh0aW1lb3V0KSkpewotCQlyZXR1cm4gMDsKLQl9Ci0JaWYoIXRpbWVfYWZ0ZXIoamlmZmllcywgaWVlZS0+bGFzdF9yeF9wc190aW1lICsgTVNFQ1ModGltZW91dCkpKXsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmKChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSApICYmCi0JCShpZWVlLT5tZ210X3F1ZXVlX3RhaWwgIT0gaWVlZS0+bWdtdF9xdWV1ZV9oZWFkKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZih0aW1lX2wpewotCQlpZihpZWVlLT5iQXdha2VQa3RTZW50ID09IHRydWUpIHsKLQkJCWllZWUtPkxQU0F3YWtlSW50dmwgPSAxOy8vdHggd2FrZSBvbmUgYmVhY29uCi0JCX0gZWxzZSB7Ci0JCQl1OAkJTWF4UGVyaW9kID0gMTsKLQotCQkJaWYoaWVlZS0+TFBTQXdha2VJbnR2bCA9PSAwKQotCQkJCWllZWUtPkxQU0F3YWtlSW50dmwgPSAxOwotCQkJaWYoaWVlZS0+UmVnTWF4TFBTQXdha2VJbnR2bCA9PSAwKSAvLyBEZWZhdWx0ICgweDAgLSBlRmFzdFBzLCAweEZGIC1EVElNLCAweE5OIC0gMHhOTiAqIEJlYWNvbkludHZsKQotCQkJCU1heFBlcmlvZCA9IDE7IC8vIDEgQmVhY29uIGludGVydmFsCi0JCQllbHNlIGlmKGllZWUtPlJlZ01heExQU0F3YWtlSW50dmwgPT0gMHhGRikgLy8gRFRJTQotCQkJCU1heFBlcmlvZCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX3BlcmlvZDsKLQkJCWVsc2UKLQkJCQlNYXhQZXJpb2QgPSBpZWVlLT5SZWdNYXhMUFNBd2FrZUludHZsOwotCQkJaWVlZS0+TFBTQXdha2VJbnR2bCA9IChpZWVlLT5MUFNBd2FrZUludHZsID49IE1heFBlcmlvZCkgPyBNYXhQZXJpb2QgOiAoaWVlZS0+TFBTQXdha2VJbnR2bCArIDEpOwotCQl9Ci0JCXsKLQkJCXU4IExQU0F3YWtlSW50dmxfdG1wID0gMDsKLQkJCXU4IHBlcmlvZCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX3BlcmlvZDsKLQkJCXU4IGNvdW50ID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnRpbS50aW1fY291bnQ7Ci0JCQlpZihjb3VudCA9PSAwICkgewotCQkJCWlmKGllZWUtPkxQU0F3YWtlSW50dmwgPiBwZXJpb2QpCi0JCQkJCUxQU0F3YWtlSW50dmxfdG1wID0gcGVyaW9kICsgKGllZWUtPkxQU0F3YWtlSW50dmwgLSBwZXJpb2QpIC0oKGllZWUtPkxQU0F3YWtlSW50dmwtcGVyaW9kKSVwZXJpb2QpOwotCQkJCWVsc2UKLQkJCQkJTFBTQXdha2VJbnR2bF90bXAgPSBpZWVlLT5MUFNBd2FrZUludHZsOwotCi0JCQl9IGVsc2UgewotCQkJCWlmKGllZWUtPkxQU0F3YWtlSW50dmwgPiBpZWVlLT5jdXJyZW50X25ldHdvcmsudGltLnRpbV9jb3VudCkKLQkJCQkJTFBTQXdha2VJbnR2bF90bXAgPSBjb3VudCArIChpZWVlLT5MUFNBd2FrZUludHZsIC0gY291bnQpIC0oKGllZWUtPkxQU0F3YWtlSW50dmwtY291bnQpJXBlcmlvZCk7Ci0JCQkJZWxzZQotCQkJCQlMUFNBd2FrZUludHZsX3RtcCA9IGllZWUtPkxQU0F3YWtlSW50dmw7Ci0JCQl9Ci0KLQkJKnRpbWVfbCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5sYXN0X2R0aW1fc3RhX3RpbWVbMF0KLQkJCSsgTVNFQ1MoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCAqIExQU0F3YWtlSW50dmxfdG1wKTsKLQl9Ci0JfQotCi0JaWYodGltZV9oKXsKLQkJKnRpbWVfaCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5sYXN0X2R0aW1fc3RhX3RpbWVbMV07Ci0JCWlmKHRpbWVfbCAmJiAqdGltZV9sIDwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmxhc3RfZHRpbV9zdGFfdGltZVswXSkKLQkJCSp0aW1lX2ggKz0gMTsKLQl9Ci0KLQlyZXR1cm4gMTsKLQotCi19Ci0KLWlubGluZSB2b2lkIGllZWU4MDIxMV9zdGFfcHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCi17Ci0KLQl1MzIgdGgsdGw7Ci0Jc2hvcnQgc2xlZXA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7Ci0KLQlpZigoaWVlZS0+cHMgPT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEIHx8Ci0JCWllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSB8fAotCQlpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKSl7Ci0KLQkvLwkjd2FybmluZyBDSEVDS19MT0NLX0hFUkUKLQkJcHJpbnRrKCI9PT09PT4lcygpOiBubyBuZWVkIHRvIHBzLHdha2UgdXAhISBpZWVlLT5wcyBpcyAlZCxpZWVlLT5pd19tb2RlIGlzICVkLGllZWUtPnN0YXRlIGlzICVkXG4iLAotCQkJX19GVU5DVElPTl9fLGllZWUtPnBzLGllZWUtPml3X21vZGUsaWVlZS0+c3RhdGUpOwotCQlzcGluX2xvY2soJmllZWUtPm1nbXRfdHhfbG9jayk7Ci0KLQkJaWVlZTgwMjExX3N0YV93YWtldXAoaWVlZSwgMSk7Ci0KLQkJc3Bpbl91bmxvY2soJmllZWUtPm1nbXRfdHhfbG9jayk7Ci0JfQotCi0Jc2xlZXAgPSBpZWVlODAyMTFfc3RhX3BzX3NsZWVwKGllZWUsJnRoLCAmdGwpOwotCS8qIDIgd2FrZSwgMSBzbGVlcCwgMCBkbyBub3RoaW5nICovCi0JaWYoc2xlZXAgPT0gMCkvL2l0IGlzIG5vdCB0aW1lIG91dCBvciBkdGltIGlzIG5vdCB2YWxpZAotCXsKLQkJZ290byBvdXQ7Ci0JfQotCWlmKHNsZWVwID09IDEpewotCQlpZihpZWVlLT5zdGFfc2xlZXAgPT0gMSl7Ci0JCQlpZWVlLT5lbnRlcl9zbGVlcF9zdGF0ZShpZWVlLCB0aCwgdGwpOwotCQl9Ci0KLQkJZWxzZSBpZihpZWVlLT5zdGFfc2xlZXAgPT0gMCl7Ci0JCQlzcGluX2xvY2soJmllZWUtPm1nbXRfdHhfbG9jayk7Ci0KLQkJCWlmIChpZWVlLT5wc19pc19xdWV1ZV9lbXB0eShpZWVlKSkgewotCQkJCWllZWUtPnN0YV9zbGVlcCA9IDI7Ci0JCQkJaWVlZS0+YWNrX3R4X3RvX2llZWUgPSAxOwotCQkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsMSk7Ci0JCQkJaWVlZS0+cHNfdGggPSB0aDsKLQkJCQlpZWVlLT5wc190bCA9IHRsOwotCQkJfQotCQkJc3Bpbl91bmxvY2soJmllZWUtPm1nbXRfdHhfbG9jayk7Ci0KLQkJfQotCi0JCWllZWUtPmJBd2FrZVBrdFNlbnQgPSBmYWxzZTsvL2FmdGVyIG51bGwgdG8gcG93ZXIgc2F2ZSB3ZSBzZXQgaXQgdG8gZmFsc2UuIG5vdCBsaXN0ZW4gZXZlcnkgYmVhY29uLgotCi0JfWVsc2UgaWYoc2xlZXAgPT0gMil7Ci0JCXNwaW5fbG9jaygmaWVlZS0+bWdtdF90eF9sb2NrKTsKLQotCQlpZWVlODAyMTFfc3RhX3dha2V1cChpZWVlLDEpOwotCi0JCXNwaW5fdW5sb2NrKCZpZWVlLT5tZ210X3R4X2xvY2spOwotCX0KLQotb3V0OgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKLQotfQotCi12b2lkIGllZWU4MDIxMV9zdGFfd2FrZXVwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBubCkKLXsKLQlpZihpZWVlLT5zdGFfc2xlZXAgPT0gMCl7Ci0JCWlmKG5sKXsKLQkJCWlmKGllZWUtPnBIVEluZm8tPklPVEFjdGlvbiAmIEhUX0lPVF9BQ1RfTlVMTF9EQVRBX1BPV0VSX1NBVklORykKLQkJCXsKLQkJCQlpZWVlLT5hY2tfdHhfdG9faWVlZSA9IDE7Ci0JCQkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwgMCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWVlZS0+YWNrX3R4X3RvX2llZWUgPSAxOwotCQkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9wc3BvbGxfZnJhbWUoaWVlZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCi0JfQotCi0JaWYoaWVlZS0+c3RhX3NsZWVwID09IDEpCi0JCWllZWUtPnN0YV93YWtlX3VwKGllZWUpOwotCWlmKG5sKXsKLQotCQkJaWYoaWVlZS0+cEhUSW5mby0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9OVUxMX0RBVEFfUE9XRVJfU0FWSU5HKQotCQkJewotCQkJCWllZWUtPmFja190eF90b19pZWVlID0gMTsKLQkJCQlpZWVlODAyMTFfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShpZWVlLCAwKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZWVlLT5hY2tfdHhfdG9faWVlZSA9IDE7Ci0JCQlpZWVlLT5wb2xsaW5nID0gdHJ1ZTsKLQkJCQkvL2llZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIDApOwotCQkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9wc3BvbGxfZnJhbWUoaWVlZSk7Ci0JCQl9Ci0KLQl9IGVsc2UgewotCQlpZWVlLT5zdGFfc2xlZXAgPSAwOwotCQlpZWVlLT5wb2xsaW5nID0gZmFsc2U7Ci0JfQotfQotCi12b2lkIGllZWU4MDIxMV9wc190eF9hY2soc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHNob3J0IHN1Y2Nlc3MpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7Ci0KLQlpZihpZWVlLT5zdGFfc2xlZXAgPT0gMil7Ci0JCS8qIE51bGwgZnJhbWUgd2l0aCBQUyBiaXQgc2V0ICovCi0JCWlmKHN1Y2Nlc3MpewotCQkJaWVlZS0+c3RhX3NsZWVwID0gMTsKLQkJCWllZWUtPmVudGVyX3NsZWVwX3N0YXRlKGllZWUsIGllZWUtPnBzX3RoLCBpZWVlLT5wc190bCk7Ci0JCX0KLQl9IGVsc2Ugey8qIDIxMTEyMDA1IC0gdHggYWdhaW4gbnVsbCB3aXRob3V0IFBTIGJpdCBpZiBsb3N0ICovCi0KLQkJaWYoKGllZWUtPnN0YV9zbGVlcCA9PSAwKSAmJiAhc3VjY2Vzcyl7Ci0JCQlzcGluX2xvY2soJmllZWUtPm1nbXRfdHhfbG9jayk7Ci0JCQkvL2llZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIDApOwotCQkJaWYoaWVlZS0+cEhUSW5mby0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9OVUxMX0RBVEFfUE9XRVJfU0FWSU5HKQotCQkJewotCQkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIDApOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9wc3BvbGxfZnJhbWUoaWVlZSk7Ci0JCQl9Ci0JCQlzcGluX3VubG9jaygmaWVlZS0+bWdtdF90eF9sb2NrKTsKLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7Ci19Ci0KLXZvaWQgaWVlZTgwMjExX3Byb2Nlc3NfYWN0aW9uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3Qgc2tfYnVmZiogc2tiKQotewotCXN0cnVjdCBpZWVlODAyMTFfaGRyKiBoZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIqKXNrYi0+ZGF0YTsKLQl1OCogYWN0ID0gaWVlZTgwMjExX2dldF9wYXlsb2FkKGhlYWRlcik7Ci0JdTggdG1wID0gMDsKLQotCWlmIChhY3QgPT0gTlVMTCkKLQl7Ci0JCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiZXJyb3IgdG8gZ2V0IHBheWxvYWQgb2YgYWN0aW9uIGZyYW1lXG4iKTsKLQkJcmV0dXJuOwotCX0KLQl0bXAgPSAqYWN0OwotCWFjdCArKzsKLQlzd2l0Y2ggKHRtcCkKLQl7Ci0JCWNhc2UgQUNUX0NBVF9CQToKLQkJCWlmICgqYWN0ID09IEFDVF9BRERCQVJFUSkKLQkJCWllZWU4MDIxMV9yeF9BRERCQVJlcShpZWVlLCBza2IpOwotCQkJZWxzZSBpZiAoKmFjdCA9PSBBQ1RfQUREQkFSU1ApCi0JCQlpZWVlODAyMTFfcnhfQUREQkFSc3AoaWVlZSwgc2tiKTsKLQkJCWVsc2UgaWYgKCphY3QgPT0gQUNUX0RFTEJBKQotCQkJaWVlZTgwMjExX3J4X0RFTEJBKGllZWUsIHNrYik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm47Ci0KLX0KLWlubGluZSBpbnQKLWllZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMsIHUxNiB0eXBlLAotCQkJdTE2IHN0eXBlKQotewotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpoZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKikgc2tiLT5kYXRhOwotCXUxNiBlcnJjb2RlOwotCXU4KiBjaGFsbGVuZ2U7Ci0JaW50IGNobGVuPTA7Ci0JaW50IGFpZDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICphc3NvY19yZXNwOwotCWJvb2wgYlN1cHBvcnRObW9kZSA9IHRydWUsIGJIYWxmU3VwcG9ydE5tb2RlID0gZmFsc2U7IC8vZGVmYXVsdCBzdXBwb3J0IE4gbW9kZSwgZGlzYWJsZSBoYWxmTm1vZGUKLQotCWlmKCFpZWVlLT5wcm90b19zdGFydGVkKQotCQlyZXR1cm4gMDsKLQotCXN3aXRjaCAoV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpKSB7Ci0KLQkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVTUDoKLQkJY2FzZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQOgotCi0JCQlJRUVFODAyMTFfREVCVUdfTUdNVCgicmVjZWl2ZWQgW1JFXUFTU09DSUFUSU9OIFJFU1BPTlNFICglZClcbiIsCi0JCQkJCVdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSk7Ci0JCQlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKSAmJgotCQkJCWllZWUtPnN0YXRlID09IElFRUU4MDIxMV9BU1NPQ0lBVElOR19BVVRIRU5USUNBVEVEICYmCi0JCQkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKXsKLQkJCQlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0d29ya19yZXNwOwotCQkJCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yayA9ICZuZXR3b3JrX3Jlc3A7Ci0KLQkJCQlpZiAoMCA9PSAoZXJyY29kZT1hc3NvY19wYXJzZShpZWVlLHNrYiwgJmFpZCkpKXsKLQkJCQkJaWVlZS0+c3RhdGU9SUVFRTgwMjExX0xJTktFRDsKLQkJCQkJaWVlZS0+YXNzb2NfaWQgPSBhaWQ7Ci0JCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXNzX29rKys7Ci0JCQkJCS8qIHN0YXRpb24gc3VwcG9ydCBxb3MgKi8KLQkJCQkJLyogTGV0IHRoZSByZWdpc3RlciBzZXR0aW5nIGRlZmF1bHRseSB3aXRoIExlZ2FjeSBzdGF0aW9uICovCi0JCQkJCWlmKGllZWUtPnFvc19zdXBwb3J0KSB7Ci0JCQkJCQlhc3NvY19yZXNwID0gKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUqKXNrYi0+ZGF0YTsKLQkJCQkJCW1lbXNldChuZXR3b3JrLCAwLCBzaXplb2YoKm5ldHdvcmspKTsKLQkJCQkJCWlmIChpZWVlODAyMTFfcGFyc2VfaW5mb19wYXJhbShpZWVlLGFzc29jX3Jlc3AtPmluZm9fZWxlbWVudCxcCi0JCQkJCQkJCQlyeF9zdGF0cy0+bGVuIC0gc2l6ZW9mKCphc3NvY19yZXNwKSxcCi0JCQkJCQkJCQluZXR3b3JrLHJ4X3N0YXRzKSl7Ci0JCQkJCQkJcmV0dXJuIDE7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7CS8vZmlsbGluZyB0aGUgUGVlckhUQ2FwLiAvL21heWJlIG5vdCBuZWNlc3NhcnkgYXMgd2UgY2FuIGdldCBpdHMgaW5mbyBmcm9tIGN1cnJlbnRfbmV0d29yay4KLQkJCQkJCQltZW1jcHkoaWVlZS0+cEhUSW5mby0+UGVlckhUQ2FwQnVmLCBuZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmLCBuZXR3b3JrLT5ic3NodC5iZEhUQ2FwTGVuKTsKLQkJCQkJCQltZW1jcHkoaWVlZS0+cEhUSW5mby0+UGVlckhUSW5mb0J1ZiwgbmV0d29yay0+YnNzaHQuYmRIVEluZm9CdWYsIG5ldHdvcmstPmJzc2h0LmJkSFRJbmZvTGVuKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChpZWVlLT5oYW5kbGVfYXNzb2NfcmVzcG9uc2UgIT0gTlVMTCkKLQkJCQkJCQlpZWVlLT5oYW5kbGVfYXNzb2NfcmVzcG9uc2UoaWVlZSwgKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUqKWhlYWRlciwgbmV0d29yayk7Ci0JCQkJCX0KLQkJCQkJaWVlZTgwMjExX2Fzc29jaWF0ZV9jb21wbGV0ZShpZWVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvKiBhaWQgY291bGQgbm90IGJlZW4gYWxsb2NhdGVkICovCi0JCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXNzX2VycisrOwotCQkJCQlwcmludGsoCi0JCQkJCQkiQXNzb2NpYXRpb24gcmVzcG9uc2Ugc3RhdHVzIGNvZGUgMHgleFxuIiwKLQkJCQkJCWVycmNvZGUpOwotCQkJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgKLQkJCQkJCSJBc3NvY2lhdGlvbiByZXNwb25zZSBzdGF0dXMgY29kZSAweCV4XG4iLAotCQkJCQkJZXJyY29kZSk7Ci0JCQkJCWlmKGllZWUtPkFzb2NSZXRyeUNvdW50IDwgUlRfQVNPQ19SRVRSWV9MSU1JVCkgewotCQkJCQkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFUToKLQkJY2FzZSBJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVE6Ci0KLQkJCWlmICgoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpICYmCi0JCQkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikKLQotCQkJCWllZWU4MDIxMV9yeF9hc3NvY19ycShpZWVlLCBza2IpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJRUVFODAyMTFfU1RZUEVfQVVUSDoKLQotCQkJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKXsKLQkJCQlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HICYmCi0JCQkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKXsKLQotCQkJCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIlJlY2VpdmVkIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlIik7Ci0KLQkJCQkJCWlmICgwID09IChlcnJjb2RlPWF1dGhfcGFyc2Uoc2tiLCAmY2hhbGxlbmdlLCAmY2hsZW4pKSl7Ci0JCQkJCQkJaWYoaWVlZS0+b3Blbl93ZXAgfHwgIWNoYWxsZW5nZSl7Ci0JCQkJCQkJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FURUQ7Ci0JCQkJCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXV0aF9yc19vaysrOwotCQkJCQkJCQlpZighKGllZWUtPnBIVEluZm8tPklPVEFjdGlvbiZIVF9JT1RfQUNUX1BVUkVfTl9NT0RFKSkKLQkJCQkJCQkJewotCQkJCQkJCQkJaWYgKCFpZWVlLT5HZXRObW9kZVN1cHBvcnRCeVNlY0NmZyhpZWVlKSkKLQkJCQkJCQkJCXsKLQkJCQkJCQkJCQkvLyBXRVAgb3IgVEtJUCBlbmNyeXB0aW9uCi0JCQkJCQkJCQkJaWYoSXNIVEhhbGZObW9kZUFQcyhpZWVlKSkKLQkJCQkJCQkJCQl7Ci0JCQkJCQkJCQkJCWJTdXBwb3J0Tm1vZGUgPSB0cnVlOwotCQkJCQkJCQkJCQliSGFsZlN1cHBvcnRObW9kZSA9IHRydWU7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWVsc2UKLQkJCQkJCQkJCQl7Ci0JCQkJCQkJCQkJCWJTdXBwb3J0Tm1vZGUgPSBmYWxzZTsKLQkJCQkJCQkJCQkJYkhhbGZTdXBwb3J0Tm1vZGUgPSBmYWxzZTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQlwcmludGsoIj09PT09PT09PT0+dG8gbGluayB3aXRoIEFQIHVzaW5nIFNFQyglZCwgJWQpXG4iLCBiU3VwcG9ydE5tb2RlLCBiSGFsZlN1cHBvcnRObW9kZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJLyogRHVtbXkgd2lybGVzcyBtb2RlIHNldHRpbmcgdG8gYXZvaWQgZW5jcnlwdGlvbiBpc3N1ZSAqLwotCQkJCQkJCQlpZihiU3VwcG9ydE5tb2RlKSB7Ci0JCQkJCQkJCQkvL04gbW9kZSBzZXR0aW5nCi0JCQkJCQkJCQlpZWVlLT5TZXRXaXJlbGVzc01vZGUoaWVlZSwKLQkJCQkJCQkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLm1vZGUpOwotCQkJCQkJCQl9ZWxzZXsKLQkJCQkJCQkJCS8vYi9nIG1vZGUgc2V0dGluZwotCQkJCQkJCQkJLypUT0RPKi8KLQkJCQkJCQkJCWllZWUtPlNldFdpcmVsZXNzTW9kZShpZWVlLCBJRUVFX0cpOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5tb2RlID09IElFRUVfTl8yNEcgJiYgYkhhbGZTdXBwb3J0Tm1vZGUgPT0gdHJ1ZSkKLQkJCQkJCQkJewotCQkJCQkJCQkJcHJpbnRrKCI9PT09PT09PT09PT09PT0+ZW50ZXJuIGhhbGYgTiBtb2RlXG4iKTsKLQkJCQkJCQkJCWllZWUtPmJIYWxmV2lyZWxlc3NOMjRHTW9kZSA9IHRydWU7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZQotCQkJCQkJCQkJaWVlZS0+YkhhbGZXaXJlbGVzc04yNEdNb2RlID0gZmFsc2U7Ci0KLQkJCQkJCQkJaWVlZTgwMjExX2Fzc29jaWF0ZV9zdGVwMihpZWVlKTsKLQkJCQkJCQl9ZWxzZXsKLQkJCQkJCQkJaWVlZTgwMjExX3J0bF9hdXRoX2NoYWxsZW5nZShpZWVlLCBjaGFsbGVuZ2UsIGNobGVuKTsKLQkJCQkJCQl9Ci0JCQkJCQl9ZWxzZXsKLQkJCQkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2F1dGhfcnNfZXJyKys7Ci0JCQkJCQkJSUVFRTgwMjExX0RFQlVHX01HTVQoIkF1dGhlbnRpY2F0aW9uIHJlc3Bvc2Ugc3RhdHVzIGNvZGUgMHgleCIsZXJyY29kZSk7Ci0KLQkJCQkJCQlwcmludGsoIkF1dGhlbnRpY2F0aW9uIHJlc3Bvc2Ugc3RhdHVzIGNvZGUgMHgleCIsZXJyY29kZSk7Ci0JCQkJCQkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKLQkJCQkJCX0KLQotCQkJCQl9ZWxzZSBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUil7Ci0JCQkJCQlpZWVlODAyMTFfcnhfYXV0aF9ycShpZWVlLCBza2IpOwotCQkJCQl9Ci0JCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVROgotCi0JCQlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfUFJPQkVSUykgJiYKLQkJCQkoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyB8fAotCQkJCWllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpICYmCi0JCQkJaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkpewotCQkJCWllZWU4MDIxMV9yeF9wcm9iZV9ycShpZWVlLCBza2IpOwotCQkJfQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJRUVFODAyMTFfU1RZUEVfRElTQVNTT0M6Ci0JCWNhc2UgSUVFRTgwMjExX1NUWVBFX0RFQVVUSDoKLQkJCS8qIEZJWE1FIGZvciBub3cgcmVwZWF0IGFsbCB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlCi0JCQkqIGJvdGggZm9yIGRpc2Fzc29jaWF0aW9uIGFuZCBkZWF1dGhlbnRpY2F0aW9uCi0JCQkqLwotCQkJaWYgKChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkgJiYKLQkJCQlpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEICYmCi0JCQkJaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKXsKLQotCQkJCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0FTU09DSUFUSU5HOwotCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucmVhc3NvYysrOwotCQkJCWllZWUtPmlzX3JvYW1pbmcgPSB0cnVlOwotCQkJCWllZWU4MDIxMV9kaXNhc3NvY2lhdGUoaWVlZSk7Ci0JCQkJUmVtb3ZlUGVlclRTKGllZWUsIGhlYWRlci0+YWRkcjIpOwotCQkJCXF1ZXVlX3dvcmsoaWVlZS0+d3EsICZpZWVlLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKTsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIElFRUU4MDIxMV9TVFlQRV9NQU5BR0VfQUNUOgotCQkJaWVlZTgwMjExX3Byb2Nlc3NfYWN0aW9uKGllZWUsc2tiKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC0xOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGZvbGxvd2luZyBhcmUgZm9yIGEgc2ltcGxlciBUWCBxdWV1ZSBtYW5hZ2VtZW50LgotICogSW5zdGVhZCBvZiB1c2luZyBuZXRpZl9bc3RvcC93YWtlXV9xdWV1ZSB0aGUgZHJpdmVyCi0gKiB3aWxsIHVzZXMgdGhlc2UgdHdvIGZ1bmN0aW9uIChwbHVzIGEgcmVzZXQgb25lKSwgdGhhdAotICogd2lsbCBpbnRlcm5hbGx5IHVzZXMgdGhlIGtlcm5lbCBuZXRpZl8qIGFuZCB0YWtlcwotICogY2FyZSBvZiB0aGUgaWVlZTgwMi4xMSBmcmFnbWVudGF0aW9uLgotICogU28gdGhlIGRyaXZlciByZWNlaXZlcyBhIGZyYWdtZW50IHBlciB0aW1lIGFuZCBtaWdodAotICogY2FsbCB0aGUgc3RvcCBmdW5jdGlvbiB3aGVuIGl0IHdhbnQgd2l0aG91dCB0YWtlIGNhcmUKLSAqIHRvIGhhdmUgZW5vdWdoIHJvb20gdG8gVFggYW4gZW50aXJlIHBhY2tldC4KLSAqIFRoaXMgbWlnaHQgYmUgdXNlZnVsIGlmIGVhY2ggZnJhZ21lbnQgbmVlZCBpdCdzIG93bgotICogZGVzY3JpcHRvciwgdGh1cyBqdXN0IGtlZXAgYSB0b3RhbCBmcmVlIG1lbW9yeSA+IHRoYW4KLSAqIHRoZSBtYXggZnJhZ21lbnRhdGlvbiB0aHJlc2hvbGQgaXMgbm90IGVub3VnaC4uIElmIHRoZQotICogaWVlZTgwMi4xMSBzdGFjayBwYXNzZWQgYSBUWEIgc3RydWN0IHRoZW4geW91IG5lZWRlZAotICogdG8ga2VlcCBOIGZyZWUgZGVzY3JpcHRvcnMgd2hlcmUKLSAqIE4gPSBNQVhfUEFDS0VUX1NJWkUgLyBNSU5fRlJBR19UUkVTSE9MRAotICogSW4gdGhpcyB3YXkgeW91IG5lZWQganVzdCBvbmUgYW5kIHRoZSA4MDIuMTEgc3RhY2sKLSAqIHdpbGwgdGFrZSBjYXJlIG9mIGJ1ZmZlcmluZyBmcmFnbWVudHMgYW5kIHBhc3MgdGhlbSB0bwotICogdG8gdGhlIGRyaXZlciBsYXRlciwgd2hlbiBpdCB3YWtlcyB0aGUgcXVldWUuCi0gKi8KLXZvaWQgaWVlZTgwMjExX3NvZnRtYWNfeG1pdChzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLQotCXVuc2lnbmVkIGludCBxdWV1ZV9pbmRleCA9IHR4Yi0+cXVldWVfaW5kZXg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgIGk7Ci0JY2JfZGVzYyAqdGNiX2Rlc2MgPSBOVUxMOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOwotCi0JLyogY2FsbGVkIHdpdGggMm5kIHBhcm0gMCwgbm8gdHggbWdtdCBsb2NrIHJlcXVpcmVkICovCi0JaWVlZTgwMjExX3N0YV93YWtldXAoaWVlZSwwKTsKLQotCS8qIHVwZGF0ZSB0aGUgdHggc3RhdHVzICovCi0JdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKSh0eGItPmZyYWdtZW50c1swXS0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7Ci0JaWYodGNiX2Rlc2MtPmJNdWx0aWNhc3QpIHsKLQkJaWVlZS0+c3RhdHMubXVsdGljYXN0Kys7Ci0JfQotCi0JLyogaWYgeG1pdCBhdmFpbGFibGUsIGp1c3QgeG1pdCBpdCBpbW1lZGlhdGVseSwgZWxzZSBqdXN0IGluc2VydCBpdCB0byB0aGUgd2FpdCBxdWV1ZSAqLwotCWZvcihpID0gMDsgaSA8IHR4Yi0+bnJfZnJhZ3M7IGkrKykgewotI2lmZGVmIFVTQl9UWF9EUklWRVJfQUdHUkVHQVRJT05fRU5BQkxFCi0JCWlmICgoc2tiX3F1ZXVlX2xlbigmaWVlZS0+c2tiX2Rydl9hZ2dRW3F1ZXVlX2luZGV4XSkgIT0gMCkgfHwKLSNlbHNlCi0JCWlmICgoc2tiX3F1ZXVlX2xlbigmaWVlZS0+c2tiX3dhaXRRW3F1ZXVlX2luZGV4XSkgIT0gMCkgfHwKLSNlbmRpZgotCQkoIWllZWUtPmNoZWNrX25pY19lbm91Z2hfZGVzYyhpZWVlLCBxdWV1ZV9pbmRleCkpfHwKLQkJICAgICAoaWVlZS0+cXVldWVfc3RvcCkpIHsKLQkJCS8qIGluc2VydCB0aGUgc2tiIHBhY2tldCB0byB0aGUgd2FpdCBxdWV1ZSAqLwotCQkJLyogYXMgZm9yIHRoZSBjb21wbGV0aW9uIGZ1bmN0aW9uLCBpdCBkb2VzIG5vdCBuZWVkCi0JCQkgKiB0byBjaGVjayBpdCBhbnkgbW9yZS4KLQkJCSAqICovCi0jaWZkZWYgVVNCX1RYX0RSSVZFUl9BR0dSRUdBVElPTl9FTkFCTEUKLQkJCXNrYl9xdWV1ZV90YWlsKCZpZWVlLT5za2JfZHJ2X2FnZ1FbcXVldWVfaW5kZXhdLCB0eGItPmZyYWdtZW50c1tpXSk7Ci0jZWxzZQotCQkJc2tiX3F1ZXVlX3RhaWwoJmllZWUtPnNrYl93YWl0UVtxdWV1ZV9pbmRleF0sIHR4Yi0+ZnJhZ21lbnRzW2ldKTsKLSNlbmRpZgotCQl9ZWxzZXsKLQkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoCi0JCQkJCXR4Yi0+ZnJhZ21lbnRzW2ldLAotCQkJCQlpZWVlLCBpZWVlLT5yYXRlKTsKLQkJfQotCX0KLQotCWllZWU4MDIxMV90eGJfZnJlZSh0eGIpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jayxmbGFncyk7Ci0KLX0KLQotLyogY2FsbGVkIHdpdGggaWVlZS0+bG9jayBhY3F1aXJlZCAqLwotdm9pZCBpZWVlODAyMTFfcmVzdW1lX3R4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCWludCBpOwotCWZvcihpID0gaWVlZS0+dHhfcGVuZGluZy5mcmFnOyBpIDwgaWVlZS0+dHhfcGVuZGluZy50eGItPm5yX2ZyYWdzOyBpKyspIHsKLQotCQlpZiAoaWVlZS0+cXVldWVfc3RvcCl7Ci0JCQlpZWVlLT50eF9wZW5kaW5nLmZyYWcgPSBpOwotCQkJcmV0dXJuOwotCQl9ZWxzZXsKLQotCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCgKLQkJCQlpZWVlLT50eF9wZW5kaW5nLnR4Yi0+ZnJhZ21lbnRzW2ldLAotCQkJCWllZWUsIGllZWUtPnJhdGUpOwotCQkJaWVlZS0+c3RhdHMudHhfcGFja2V0cysrOwotCQl9Ci0JfQotCi0KLQlpZWVlODAyMTFfdHhiX2ZyZWUoaWVlZS0+dHhfcGVuZGluZy50eGIpOwotCWllZWUtPnR4X3BlbmRpbmcudHhiID0gTlVMTDsKLX0KLQotCi12b2lkIGllZWU4MDIxMV9yZXNldF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOwotCWluaXRfbWdtdF9xdWV1ZShpZWVlKTsKLQlpZiAoaWVlZS0+dHhfcGVuZGluZy50eGIpewotCQlpZWVlODAyMTFfdHhiX2ZyZWUoaWVlZS0+dHhfcGVuZGluZy50eGIpOwotCQlpZWVlLT50eF9wZW5kaW5nLnR4YiA9IE5VTEw7Ci0JfQotCWllZWUtPnF1ZXVlX3N0b3AgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssZmxhZ3MpOwotCi19Ci0KLXZvaWQgaWVlZTgwMjExX3J0bF93YWtlX3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCi0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICAqaGVhZGVyOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssZmxhZ3MpOwotCWlmICghIGllZWUtPnF1ZXVlX3N0b3ApIGdvdG8gZXhpdDsKLQotCWllZWUtPnF1ZXVlX3N0b3AgPSAwOwotCi0JaWYoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUpewotCQl3aGlsZSAoIWllZWUtPnF1ZXVlX3N0b3AgJiYgKHNrYiA9IGRlcXVldWVfbWdtdChpZWVlKSkpewotCi0JCQloZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICopIHNrYi0+ZGF0YTsKLQotCQkJaGVhZGVyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF0gPDwgNCk7Ci0KLQkJCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKLQkJCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7Ci0JCQllbHNlCi0JCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKLQotCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdChza2IsIGllZWUsIGllZWUtPmJhc2ljX3JhdGUpOwotCQl9Ci0JfQotCWlmICghaWVlZS0+cXVldWVfc3RvcCAmJiBpZWVlLT50eF9wZW5kaW5nLnR4YikKLQkJaWVlZTgwMjExX3Jlc3VtZV90eChpZWVlKTsKLQotCWlmICghaWVlZS0+cXVldWVfc3RvcCAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKGllZWUtPmRldikpewotCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnN3dHhhd2FrZSsrOwotCQluZXRpZl93YWtlX3F1ZXVlKGllZWUtPmRldik7Ci0JfQotCi1leGl0IDoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLGZsYWdzKTsKLX0KLQotCi12b2lkIGllZWU4MDIxMV9ydGxfc3RvcF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLQlpZiAoISBuZXRpZl9xdWV1ZV9zdG9wcGVkKGllZWUtPmRldikpewotCQluZXRpZl9zdG9wX3F1ZXVlKGllZWUtPmRldik7Ci0JCWllZWUtPnNvZnRtYWNfc3RhdHMuc3d0eHN0b3ArKzsKLQl9Ci0JaWVlZS0+cXVldWVfc3RvcCA9IDE7Ci19Ci0KLQotaW5saW5lIHZvaWQgaWVlZTgwMjExX3JhbmRvbWl6ZV9jZWxsKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCi0JZ2V0X3JhbmRvbV9ieXRlcyhpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKLQotCS8qIGFuIElCU1MgY2VsbCBhZGRyZXNzIG11c3QgaGF2ZSB0aGUgdHdvIGxlc3Mgc2lnbmlmaWNhbnQKLQkgKiBiaXRzIG9mIHRoZSBmaXJzdCBieXRlID0gMgotCSAqLwotCWllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZFswXSAmPSB+MHgwMTsKLQlpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWRbMF0gfD0gMHgwMjsKLX0KLQotLyogY2FsbGVkIGluIHVzZXIgY29udGV4dCBvbmx5ICovCi12b2lkIGllZWU4MDIxMV9zdGFydF9tYXN0ZXJfYnNzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCWllZWUtPmFzc29jX2lkID0gMTsKLQotCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPT0gMCl7Ci0JCXN0cm5jcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsCi0JCQlJRUVFODAyMTFfREVGQVVMVF9UWF9FU1NJRCwKLQkJCUlXX0VTU0lEX01BWF9TSVpFKTsKLQotCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPSBzdHJsZW4oSUVFRTgwMjExX0RFRkFVTFRfVFhfRVNTSUQpOwotCQlpZWVlLT5zc2lkX3NldCA9IDE7Ci0JfQotCi0JbWVtY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCi0JaWVlZS0+c2V0X2NoYW4oaWVlZSwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOwotCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0xJTktFRDsKLQlpZWVlLT5saW5rX2NoYW5nZShpZWVlKTsKLQlub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7Ci0KLQlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKLQkJaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZShpZWVlKTsKLQotCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKLX0KLQotdm9pZCBpZWVlODAyMTFfc3RhcnRfbW9uaXRvcl9tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCWlmKGllZWUtPnJhd190eCl7Ci0KLQkJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCi0JCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUpOwotCi0JCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKLQl9Ci19Ci12b2lkIGllZWU4MDIxMV9zdGFydF9pYnNzX3dxKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQotICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKLSAgICAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBzdGFydF9pYnNzX3dxKTsKLQkvKiBpd2NvbmZpZyBtb2RlIGFkLWhvYyB3aWxsIHNjaGVkdWxlIHRoaXMgYW5kIHJldHVybgotCSAqIG9uIHRoZSBvdGhlciBoYW5kIHRoaXMgd2lsbCBibG9jayBmdXJ0aGVyIGl3Y29uZmlnIFNFVAotCSAqIG9wZXJhdGlvbnMgYmVjYXVzZSBvZiB0aGUgd3hfc2VtIGhvbGQuCi0JICogQW55d2F5IHNvbWUgbW9zdCBzZXQgb3BlcmF0aW9ucyBzZXQgYSBmbGFnIHRvIHNwZWVkLXVwCi0JICogKGFib3J0KSB0aGlzIHdxICh3aGVuIHN5bmNybyBzY2FubmluZykgYmVmb3JlIHNsZWVwaW5nCi0JICogb24gdGhlIHNlbWFwaG9yZQotCSAqLwotCWlmKCFpZWVlLT5wcm90b19zdGFydGVkKXsKLQkJcHJpbnRrKCI9PT09PT09PT09b2ggZHJpdmVyIGRvd24gcmV0dXJuXG4iKTsKLQkJcmV0dXJuOwotCX0KLQlkb3duKCZpZWVlLT53eF9zZW0pOwotCi0JaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9PSAwKXsKLQkJc3RyY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLElFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lEKTsKLQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID0gc3RybGVuKElFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lEKTsKLQkJaWVlZS0+c3NpZF9zZXQgPSAxOwotCX0KLQotCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX05PTElOSzsKLQkvKiBjaGVjayBpZiB3ZSBoYXZlIHRoaXMgY2VsbCBpbiBvdXIgbmV0d29yayBsaXN0ICovCi0JaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMoaWVlZSk7Ci0KLQotI2lmZGVmIEVOQUJMRV9ET1QxMUQgLy9pZiBjcmVhdGluZyBhbiBhZC1ob2MsIHNldCBpdHMgY2hhbm5lbCB0byAxMCB0ZW1wb3JhcmlseS0tdGhpcyBpcyB0aGUgcmVxdWlyZW1lbnQgZm9yIEFTVVMsIG5vdCAxMUQsIHNvIGRpc2FibGUgMTFkLgotCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKQotCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9IDY7Ci0jZW5kaWYKLQkvKiBpZiBub3QgdGhlbiB0aGUgc3RhdGUgaXMgbm90IGxpbmtlZC4gTWF5YmUgdGhlIHVzZXIgc3dpdGhjZWQgdG8KLQkgKiBhZC1ob2MgbW9kZSBqdXN0IGFmdGVyIGJlaW5nIGluIG1vbml0b3IgbW9kZSwgb3IganVzdCBhZnRlcgotCSAqIGJlaW5nIHZlcnkgZmV3IHRpbWUgaW4gbWFuYWdlZCBtb2RlIChzbyB0aGUgY2FyZCBoYXZlIGhhZCBubwotCSAqIHRpbWUgdG8gc2NhbiBhbGwgdGhlIGNoYW5zLi4pIG9yIHdlIGhhdmUganVzdCBydW4gdXAgdGhlIGlmYWNlCi0JICogYWZ0ZXIgc2V0dGluZyBhZC1ob2MgbW9kZS4gU28gd2UgaGF2ZSB0byBnaXZlIGFub3RoZXIgdHJ5Li4KLQkgKiBIZXJlLCBpbiBpYnNzIG1vZGUsIHNob3VsZCBiZSBzYWZlIHRvIGRvIHRoaXMgd2l0aG91dCBleHRyYSBjYXJlCi0JICogKGluIGJzcyBtb2RlIHdlIGhhZCB0byBtYWtlIHN1cmUgbm8tb25lIHRyeWVkIHRvIGFzc29jaWF0ZSB3aGVuCi0JICogd2UgaGFkIGp1c3QgY2hlY2tlZCB0aGUgaWVlZS0+c3RhdGUgYW5kIHdlIHdhcyBnb2luZyB0byBzdGFydCB0aGUKLQkgKiBzY2FuKSBiZWFjYXVzZSBpbiBpYnNzIG1vZGUgdGhlIGllZWU4MDIxMV9uZXdfbmV0IGZ1bmN0aW9uLCB3aGVuCi0JICogZmluZHMgYSBnb29kIG5ldCwganVzdCBzZXQgdGhlIGllZWUtPnN0YXRlIHRvIElFRUU4MDIxMV9MSU5LRUQsCi0JICogc28sIGF0IHdvcnN0LCB3ZSB3YXN0ZSBhIGJpdCBvZiB0aW1lIHRvIGluaXRpYXRlIGFuIHVubmVlZGVkIHN5bmNybwotCSAqIHNjYW4sIHRoYXQgd2lsbCBzdG9wIGF0IHRoZSBmaXJzdCByb3VuZCBiZWNhdXNlIGl0IHNlZXMgdGhlIHN0YXRlCi0JICogYXNzb2NpYXRlZC4KLQkgKi8KLQlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykKLQkJaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKGllZWUpOwotCi0JLyogdGhlIG5ldHdvcmsgZGVmaW5pdGl2ZWx5IGlzIG5vdCBoZXJlLi4gY3JlYXRlIGEgbmV3IGNlbGwgKi8KLQlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSyl7Ci0JCXByaW50aygiY3JlYXRpbmcgbmV3IElCU1MgY2VsbFxuIik7Ci0JCWlmKCFpZWVlLT53YXBfc2V0KQotCQkJaWVlZTgwMjExX3JhbmRvbWl6ZV9jZWxsKGllZWUpOwotCi0JCWlmKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04pewotCi0JCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfbGVuID0gNDsKLQotCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzWzBdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8xTUI7Ci0JCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNbMV0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX0NDS19SQVRFXzJNQjsKLQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc1syXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfQ0NLX1JBVEVfNU1COwotCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzWzNdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8xMU1COwotCi0JCX1lbHNlCi0JCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfbGVuID0gMDsKLQotCQlpZihpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTil7Ci0JCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhfbGVuID0gODsKLQotCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzBdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COwotCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzFdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfOU1COwotCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzJdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfMTJNQjsKLQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFszXSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzE4TUI7Ci0JCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbNF0gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV8yNE1COwotCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzVdID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9PRkRNX1JBVEVfMzZNQjsKLQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFs2XSA9IElFRUU4MDIxMV9CQVNJQ19SQVRFX01BU0sgfCBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI7Ci0JCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbN10gPSBJRUVFODAyMTFfQkFTSUNfUkFURV9NQVNLIHwgSUVFRTgwMjExX09GRE1fUkFURV81NE1COwotCi0JCQlpZWVlLT5yYXRlID0gMTA4OwotCQl9ZWxzZXsKLQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leF9sZW4gPSAwOwotCQkJaWVlZS0+cmF0ZSA9IDIyOwotCQl9Ci0KLQkJLy8gQnkgZGVmYXVsdCwgV01NIGZ1bmN0aW9uIHdpbGwgYmUgZGlzYWJsZWQgaW4gSUJTUyBtb2RlCi0JCWllZWUtPmN1cnJlbnRfbmV0d29yay5Rb1NfRW5hYmxlID0gMDsKLQkJaWVlZS0+U2V0V2lyZWxlc3NNb2RlKGllZWUsIElFRUVfRyk7Ci0JCWllZWUtPmN1cnJlbnRfbmV0d29yay5hdGltX3dpbmRvdyA9IDA7Ci0JCWllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ID0gV0xBTl9DQVBBQklMSVRZX0lCU1M7Ci0JCWlmKGllZWUtPnNob3J0X3Nsb3QpCi0JCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSB8PSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVDsKLQotCX0KLQotCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0xJTktFRDsKLQotCWllZWUtPnNldF9jaGFuKGllZWUsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKLQlpZWVlLT5saW5rX2NoYW5nZShpZWVlKTsKLQotCW5vdGlmeV93eF9hc3NvY19ldmVudChpZWVlKTsKLQotCWllZWU4MDIxMV9zdGFydF9zZW5kX2JlYWNvbnMoaWVlZSk7Ci0KLQlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKLQkJaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZShpZWVlKTsKLQluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7Ci0KLQl1cCgmaWVlZS0+d3hfc2VtKTsKLX0KLQotaW5saW5lIHZvaWQgaWVlZTgwMjExX3N0YXJ0X2lic3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCi17Ci0JcXVldWVfZGVsYXllZF93b3JrKGllZWUtPndxLCAmaWVlZS0+c3RhcnRfaWJzc193cSwgMTUwKTsKLX0KLQotLyogdGhpcyBpcyBjYWxsZWQgb25seSBpbiB1c2VyIGNvbnRleHQsIHdpdGggd3hfc2VtIGhlbGQgKi8KLXZvaWQgaWVlZTgwMjExX3N0YXJ0X2JzcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotI2lmZGVmIEVOQUJMRV9ET1QxMUQKLQkvLwotCS8vIFJlZjogODAyLjExZCAxMS4xLjMuMwotCS8vIFNUQSBzaGFsbCBub3Qgc3RhcnQgYSBCU1MgdW5sZXNzIHByb3Blcmx5IGZvcm1lZCBCZWFjb24gZnJhbWUgaW5jbHVkaW5nIGEgQ291bnRyeSBJRS4KLQkvLwotCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgJiYgIUlTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpCi0JewotCQlpZighIGllZWUtPmJHbG9iYWxEb21haW4pCi0JCXsKLQkJCXJldHVybjsKLQkJfQotCX0KLSNlbmRpZgotCS8qIGNoZWNrIGlmIHdlIGhhdmUgYWxyZWFkeSBmb3VuZCB0aGUgbmV0IHdlCi0JICogYXJlIGludGVyZXN0ZWQgaW4gKGlmIGFueSkuCi0JICogaWYgbm90ICh3ZSBhcmUgZGlzYXNzb2NpYXRlZCBhbmQgd2UgYXJlIG5vdAotCSAqIGluIGFzc29jaWF0aW5nIC8gYXV0aGVudGljYXRpbmcgcGhhc2UpIHN0YXJ0IHRoZSBiYWNrZ3JvdW5kIHNjYW5uaW5nLgotCSAqLwotCWllZWU4MDIxMV9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKGllZWUpOwotCi0JLyogZW5zdXJlIG5vLW9uZSBzdGFydCBhbiBhc3NvY2lhdGluZyBwcm9jZXNzICh0aHVzIHNldHRpbmcKLQkgKiB0aGUgaWVlZS0+c3RhdGUgdG8gaWVlZTgwMjExX0FTU09DSUFUSU5HKSB3aGlsZSB3ZQotCSAqIGhhdmUganVzdCBjaGVrZWQgaXQgYW5kIHdlIGFyZSBnb2luZyB0byBlbmFibGUgc2Nhbi4KLQkgKiBUaGUgaWVlZTgwMjExX25ld19uZXQgZnVuY3Rpb24gaXMgYWx3YXlzIGNhbGxlZCB3aXRoCi0JICogbG9jayBoZWxkIChmcm9tIGJvdGggaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMgYW5kCi0JICogdGhlIHJ4IHBhdGgpLCBzbyB3ZSBjYW5ub3QgYmUgaW4gdGhlIG1pZGRsZSBvZiBzdWNoIGZ1bmN0aW9uCi0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKXsKLSNpZmRlZiBFTkFCTEVfSVBTCi0JCWlmKGllZWUtPmllZWU4MDIxMV9pcHNfbGVhdmVfd3EgIT0gTlVMTCkKLQkJCWllZWUtPmllZWU4MDIxMV9pcHNfbGVhdmVfd3EoaWVlZSk7Ci0jZW5kaWYKLQkJaWVlZS0+YWN0c2Nhbm5pbmcgPSB0cnVlOwotCQlpZWVlODAyMTFfcnRsX3N0YXJ0X3NjYW4oaWVlZSk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKLX0KLQotLyogY2FsbGVkIG9ubHkgaW4gdXNlcnNwYWNlIGNvbnRleHQgKi8KLXZvaWQgaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLQotCi0JbmV0aWZfY2Fycmllcl9vZmYoaWVlZS0+ZGV2KTsKLQlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19UWF9RVUVVRSkKLQkJCWllZWU4MDIxMV9yZXNldF9xdWV1ZShpZWVlKTsKLQotCWlmIChpZWVlLT5kYXRhX2hhcmRfc3RvcCkKLQkJaWVlZS0+ZGF0YV9oYXJkX3N0b3AoaWVlZSk7Ci0jaWZkZWYgRU5BQkxFX0RPVDExRAotCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCi0JCURvdDExZF9SZXNldChpZWVlKTsKLSNlbmRpZgotCWllZWUtPmlzX3NldF9rZXkgPSBmYWxzZTsKLQlpZWVlLT5saW5rX2NoYW5nZShpZWVlKTsKLQlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCB8fAotCSAgICBpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfQVNTT0NJQVRJTkcpIHsKLQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTk9MSU5LOwotCQlub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7Ci0JfQotCi0JaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTk9MSU5LOwotCi19Ci12b2lkIGllZWU4MDIxMV9hc3NvY2lhdGVfcmV0cnlfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKLSAgICAgICAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBhc3NvY2lhdGVfcmV0cnlfd3EpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlkb3duKCZpZWVlLT53eF9zZW0pOwotCWlmKCFpZWVlLT5wcm90b19zdGFydGVkKQotCQlnb3RvIGV4aXQ7Ci0KLQlpZihpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfUkVUUlkpCi0JCWdvdG8gZXhpdDsKLQotCS8qIHVudGlsIHdlIGRvIG5vdCBzZXQgdGhlIHN0YXRlIHRvIElFRUU4MDIxMV9OT0xJTksKLQkqIHRoZXJlIGFyZSBubyBwb3NzaWJpbGl0eSB0byBoYXZlIHNvbWVvbmUgZWxzZSB0cnlpbmcKLQkqIHRvIHN0YXJ0IGFuIGFzc29jaWF0aW9uIHByb2NkdXJlICh3ZSBnZXQgaGVyZSB3aXRoCi0JKiBpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElORykuCi0JKiBXaGVuIHdlIHNldCB0aGUgc3RhdGUgdG8gSUVFRTgwMjExX05PTElOSyBpdCBpcyBwb3NzaWJsZQotCSogdGhhdCB0aGUgUlggcGF0aCBydW4gYW4gYXR0ZW1wdCB0byBhc3NvY2lhdGUsIGJ1dAotCSogYm90aCBpZWVlODAyMTFfc29mdG1hY19jaGVja19hbGxfbmV0cyBhbmQgdGhlCi0JKiBSWCBwYXRoIHdvcmtzIHdpdGggaWVlZS0+bG9jayBoZWxkIHNvIHRoZXJlIGFyZSBubwotCSogcHJvYmxlbXMuIElmIHdlIGFyZSBzdGlsbCBkaXNhc3NvY2lhdGVkIHRoZW4gc3RhcnQgYSBzY2FuLgotCSogdGhlIGxvY2sgaGVyZSBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIG5vIG9uZSB0cnkgdG8gc3RhcnQKLQkqIGFuIGFzc29jaWF0aW9uIHByb2NlZHVyZSB3aGVuIHdlIGhhdmUganVzdCBjaGVja2VkIHRoZQotCSogc3RhdGUgYW5kIHdlIGFyZSBnb2luZyB0byBzdGFydCB0aGUgc2Nhbi4KLQkqLwotCWllZWUtPmJlaW5yZXRyeSA9IHRydWU7Ci0JaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTk9MSU5LOwotCi0JaWVlZTgwMjExX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMoaWVlZSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwotCi0JaWYoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSykKLQl7Ci0JCWllZWUtPmlzX3JvYW1pbmc9IGZhbHNlOwotCQlpZWVlLT5hY3RzY2FubmluZyA9IHRydWU7Ci0JCWllZWU4MDIxMV9ydGxfc3RhcnRfc2NhbihpZWVlKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwotCi0JaWVlZS0+YmVpbnJldHJ5ID0gZmFsc2U7Ci1leGl0OgotCXVwKCZpZWVlLT53eF9zZW0pOwotfQotCi1zdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2dldF9iZWFjb25fKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCXU4IGJyb2FkY2FzdF9hZGRyW10gPSB7MHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmZ9OwotCi0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICpiOwotCi0Jc2tiID0gaWVlZTgwMjExX3Byb2JlX3Jlc3AoaWVlZSwgYnJvYWRjYXN0X2FkZHIpOwotCi0JaWYgKCFza2IpCi0JCXJldHVybiBOVUxMOwotCi0JYiA9IChzdHJ1Y3QgaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlICopIHNrYi0+ZGF0YTsKLQliLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0JFQUNPTik7Ci0KLQlyZXR1cm4gc2tiOwotCi19Ci0KLXN0cnVjdCBza19idWZmICppZWVlODAyMTFfZ2V0X2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKmI7Ci0KLQlza2IgPSBpZWVlODAyMTFfZ2V0X2JlYWNvbl8oaWVlZSk7Ci0JaWYoIXNrYikKLQkJcmV0dXJuIE5VTEw7Ci0KLQliID0gKHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVzcG9uc2UgKikgc2tiLT5kYXRhOwotCWItPmhlYWRlci5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF0gPDwgNCk7Ci0KLQlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCi0JCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKLQllbHNlCi0JCWllZWUtPnNlcV9jdHJsWzBdKys7Ci0KLQlyZXR1cm4gc2tiOwotfQotCi12b2lkIGllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4IHNodXRkb3duKQotewotCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKLQlkb3duKCZpZWVlLT53eF9zZW0pOwotCWllZWU4MDIxMV9zdG9wX3Byb3RvY29sKGllZWUsIHNodXRkb3duKTsKLQl1cCgmaWVlZS0+d3hfc2VtKTsKLX0KLQotCi12b2lkIGllZWU4MDIxMV9zdG9wX3Byb3RvY29sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1OCBzaHV0ZG93bikKLXsKLQlpZiAoIWllZWUtPnByb3RvX3N0YXJ0ZWQpCi0JCXJldHVybjsKLQotCWlmKHNodXRkb3duKQotCQlpZWVlLT5wcm90b19zdGFydGVkID0gMDsKLQlpZWVlLT5wcm90b19zdG9wcHBpbmcgPSAxOwotCi0JaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKGllZWUpOwotCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPmFzc29jaWF0ZV9yZXRyeV93cSk7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+c3RhcnRfaWJzc193cSk7Ci0JaWVlZTgwMjExX3N0b3Bfc2NhbihpZWVlKTsKLQotCWllZWU4MDIxMV9kaXNhc3NvY2lhdGUoaWVlZSk7Ci0JUmVtb3ZlQWxsVFMoaWVlZSk7IC8vYWRkZWQgYXMgd2UgZGlzY29ubmVjdCBmcm9tIHRoZSBwcmV2aW91cyBCU1MsIFJlbW92ZSBhbGwgVFMKLQotCWllZWUtPnByb3RvX3N0b3BwcGluZyA9IDA7Ci19Ci0KLXZvaWQgaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2woc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCi17Ci0JaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOwotCWRvd24oJmllZWUtPnd4X3NlbSk7Ci0JaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKGllZWUpOwotCXVwKCZpZWVlLT53eF9zZW0pOwotfQotCi12b2lkIGllZWU4MDIxMV9zdGFydF9wcm90b2NvbChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLQlzaG9ydCBjaCA9IDA7Ci0gCWludCBpID0gMDsKLQlpZiAoaWVlZS0+cHJvdG9fc3RhcnRlZCkKLQkJcmV0dXJuOwotCi0JaWVlZS0+cHJvdG9fc3RhcnRlZCA9IDE7Ci0KLQlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPT0gMCl7Ci0JCWRvewotCQkJY2grKzsKLQkJCWlmIChjaCA+IE1BWF9DSEFOTkVMX05VTUJFUikKLQkJCQlyZXR1cm47IC8qIG5vIGNoYW5uZWwgZm91bmQgKi8KLSNpZmRlZiBFTkFCTEVfRE9UMTFECi0JCX13aGlsZSghR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcFtjaF0pOwotI2Vsc2UKLQkJfXdoaWxlKCFpZWVlLT5jaGFubmVsX21hcFtjaF0pOwotI2VuZGlmCi0JCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gY2g7Ci0JfQotCi0JaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgPT0gMCkKLQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCA9IDEwMDsKLQotICAgICAgIAlmb3IoaSA9IDA7IGkgPCAxNzsgaSsrKSB7Ci0JICBpZWVlLT5sYXN0X3J4c2VxX251bVtpXSA9IC0xOwotCSAgaWVlZS0+bGFzdF9yeGZyYWdfbnVtW2ldID0gLTE7Ci0JICBpZWVlLT5sYXN0X3BhY2tldF90aW1lW2ldID0gMDsKLQl9Ci0KLQlpZWVlLT5pbml0X3dtbXBhcmFtX2ZsYWcgPSAwOy8vcmVpbml0aWFsaXplIEFDX3h4X1BBUkFNIHJlZ2lzdGVycy4KLQotCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX05PTElOSzsKLQotCi0JLyogaWYgdGhlIHVzZXIgc2V0IHRoZSBNQUMgb2YgdGhlIGFkLWhvYyBjZWxsIGFuZCB0aGVuCi0JICogc3dpdGNoIHRvIG1hbmFnZWQgbW9kZSwgc2hhbGwgd2UgIG1ha2Ugc3VyZSB0aGF0IGFzc29jaWF0aW9uCi0JICogYXR0ZW1wdHMgZG9lcyBub3QgZmFpbCBqdXN0IGJlY2F1c2UgdGhlIHVzZXIgcHJvdmlkZSB0aGUgZXNzaWQKLQkgKiBhbmQgdGhlIG5pYyBpcyBzdGlsbCBjaGVja2luZyBmb3IgdGhlIEFQIE1BQyA/PwotCSAqLwotCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpCi0JCWllZWU4MDIxMV9zdGFydF9ic3MoaWVlZSk7Ci0KLQllbHNlIGlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCi0JCWllZWU4MDIxMV9zdGFydF9pYnNzKGllZWUpOwotCi0JZWxzZSBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikKLQkJaWVlZTgwMjExX3N0YXJ0X21hc3Rlcl9ic3MoaWVlZSk7Ci0KLQllbHNlIGlmKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQotCQlpZWVlODAyMTFfc3RhcnRfbW9uaXRvcl9tb2RlKGllZWUpOwotfQotCi0KLSNkZWZpbmUgRFJWX05BTUUgICJJZWVlODAyMTEiCi12b2lkIGllZWU4MDIxMV9zb2Z0bWFjX2luaXQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCi17Ci0JaW50IGk7Ci0JbWVtc2V0KCZpZWVlLT5jdXJyZW50X25ldHdvcmssIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspKTsKLQotCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX05PTElOSzsKLQlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDA7Ci0JZm9yKGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0JICBpZWVlLT5zZXFfY3RybFtpXSA9IDA7Ci0JfQotI2lmZGVmIEVOQUJMRV9ET1QxMUQKLQlpZWVlLT5wRG90MTFkSW5mbyA9IGt6YWxsb2Moc2l6ZW9mKFJUX0RPVDExRF9JTkZPKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFpZWVlLT5wRG90MTFkSW5mbykKLQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJjYW4ndCBhbGxvYyBtZW1vcnkgZm9yIERPVDExRFxuIik7Ci0jZW5kaWYKLQkvL2FkZGVkIGZvciAgQVAgcm9hbWluZwotCWllZWUtPkxpbmtEZXRlY3RJbmZvLlNsb3ROdW0gPSAyOwotCWllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZCY25JblBlcmlvZD0wOwotICAgICAgICBpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2RGF0YUluUGVyaW9kPTA7Ci0KLQlpZWVlLT5hc3NvY19pZCA9IDA7Ci0JaWVlZS0+cXVldWVfc3RvcCA9IDA7Ci0JaWVlZS0+c2Nhbm5pbmcgPSAwOwotCWllZWUtPnNvZnRtYWNfZmVhdHVyZXMgPSAwOyAvL3NvIElFRUUyMTAwLWxpa2UgZHJpdmVyIGFyZSBoYXBweQotCWllZWUtPndhcF9zZXQgPSAwOwotCWllZWUtPnNzaWRfc2V0ID0gMDsKLQlpZWVlLT5wcm90b19zdGFydGVkID0gMDsKLQlpZWVlLT5iYXNpY19yYXRlID0gSUVFRTgwMjExX0RFRkFVTFRfQkFTSUNfUkFURTsKLQlpZWVlLT5yYXRlID0gMjI7Ci0JaWVlZS0+cHMgPSBJRUVFODAyMTFfUFNfRElTQUJMRUQ7Ci0JaWVlZS0+c3RhX3NsZWVwID0gMDsKLQlpZWVlLT5SZWdkb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0WzBdPSAweGZmOy8vc3VwcG9ydCBNQ1MgMH43Ci0JaWVlZS0+UmVnZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldFsxXT0gMHhmZjsvL3N1cHBvcnQgTUNTIDh+MTUKLQlpZWVlLT5SZWdkb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0WzRdPSAweDAxOwotCS8vYWRkZWQgYnkgYW15Ci0JaWVlZS0+YWN0c2Nhbm5pbmcgPSBmYWxzZTsKLQlpZWVlLT5iZWlucmV0cnkgPSBmYWxzZTsKLQlpZWVlLT5pc19zZXRfa2V5ID0gZmFsc2U7Ci0JaW5pdF9tZ210X3F1ZXVlKGllZWUpOwotCi0JaWVlZS0+c3RhX2VkY2FfcGFyYW1bMF0gPSAweDAwMDBBNDAzOwotCWllZWUtPnN0YV9lZGNhX3BhcmFtWzFdID0gMHgwMDAwQTQyNzsKLQlpZWVlLT5zdGFfZWRjYV9wYXJhbVsyXSA9IDB4MDA1RTQzNDI7Ci0JaWVlZS0+c3RhX2VkY2FfcGFyYW1bM10gPSAweDAwMkYzMjYyOwotCWllZWUtPmFnZ3JlZ2F0aW9uID0gdHJ1ZTsKLQlpZWVlLT5lbmFibGVfcnhfaW1tX0JBID0gMTsKLQlpZWVlLT50eF9wZW5kaW5nLnR4YiA9IE5VTEw7Ci0KLQlpbml0X3RpbWVyKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOwotCWllZWUtPmFzc29jaWF0ZV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaWVlZTsKLQlpZWVlLT5hc3NvY2lhdGVfdGltZXIuZnVuY3Rpb24gPSBpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0X2NiOwotCi0JaW5pdF90aW1lcigmaWVlZS0+YmVhY29uX3RpbWVyKTsKLQlpZWVlLT5iZWFjb25fdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBpZWVlOwotCWllZWUtPmJlYWNvbl90aW1lci5mdW5jdGlvbiA9IGllZWU4MDIxMV9zZW5kX2JlYWNvbl9jYjsKLQotCWllZWUtPndxID0gY3JlYXRlX3dvcmtxdWV1ZShEUlZfTkFNRSk7Ci0KLSAgICAgICAgSU5JVF9ERUxBWUVEX1dPUksoJmllZWUtPnN0YXJ0X2lic3Nfd3EsaWVlZTgwMjExX3N0YXJ0X2lic3Nfd3EpOwotICAgICAgICBJTklUX1dPUksoJmllZWUtPmFzc29jaWF0ZV9jb21wbGV0ZV93cSwgaWVlZTgwMjExX2Fzc29jaWF0ZV9jb21wbGV0ZV93cSk7Ci0gICAgICAgIElOSVRfV09SSygmaWVlZS0+YXNzb2NpYXRlX3Byb2NlZHVyZV93cSwgaWVlZTgwMjExX2Fzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOwotICAgICAgICBJTklUX0RFTEFZRURfV09SSygmaWVlZS0+c29mdG1hY19zY2FuX3dxLGllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fd3EpOwotICAgICAgICBJTklUX0RFTEFZRURfV09SSygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxLCBpZWVlODAyMTFfYXNzb2NpYXRlX3JldHJ5X3dxKTsKLSAgICAgICAgSU5JVF9XT1JLKCZpZWVlLT53eF9zeW5jX3NjYW5fd3EsaWVlZTgwMjExX3d4X3N5bmNfc2Nhbl93cSk7Ci0KLQlzZW1hX2luaXQoJmllZWUtPnd4X3NlbSwgMSk7Ci0Jc2VtYV9pbml0KCZpZWVlLT5zY2FuX3NlbSwgMSk7Ci0jaWZkZWYgRU5BQkxFX0lQUwotCXNlbWFfaW5pdCgmaWVlZS0+aXBzX3NlbSwxKTsKLSNlbmRpZgotCXNwaW5fbG9ja19pbml0KCZpZWVlLT5tZ210X3R4X2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZpZWVlLT5iZWFjb25fbG9jayk7Ci0KLQl0YXNrbGV0X2luaXQoJmllZWUtPnBzX3Rhc2ssCi0JICAgICAodm9pZCgqKSh1bnNpZ25lZCBsb25nKSkgaWVlZTgwMjExX3N0YV9wcywKLQkgICAgICh1bnNpZ25lZCBsb25nKWllZWUpOwotCi19Ci0KLXZvaWQgaWVlZTgwMjExX3NvZnRtYWNfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLQlkb3duKCZpZWVlLT53eF9zZW0pOwotI2lmZGVmIEVOQUJMRV9ET1QxMUQKLQlrZnJlZShpZWVlLT5wRG90MTFkSW5mbyk7Ci0JaWVlZS0+cERvdDExZEluZm8gPSBOVUxMOwotI2VuZGlmCi0JZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7Ci0KLQljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EpOwotCWRlc3Ryb3lfd29ya3F1ZXVlKGllZWUtPndxKTsKLQotCXVwKCZpZWVlLT53eF9zZW0pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFN0YXJ0IG9mIFdQQSBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogdGhpcyBpcyBzdG9sZW4gZnJvbSB0aGUgaXB3MjIwMCBkcml2ZXIgICAgICAgICAgICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotc3RhdGljIGludCBpZWVlODAyMTFfd3BhX2VuYWJsZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgaW50IHZhbHVlKQotewotCS8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gd3BhX3N1cHBsaWNhbnQgbG9hZHMgYW5kIGNsb3NlcyB0aGUgZHJpdmVyCi0JICogaW50ZXJmYWNlLiAqLwotCXByaW50aygiJXMgV1BBXG4iLHZhbHVlID8gImVuYWJsaW5nIiA6ICJkaXNhYmxpbmciKTsKLQlpZWVlLT53cGFfZW5hYmxlZCA9IHZhbHVlOwotCXJldHVybiAwOwotfQotCi0KLXZvaWQgaWVlZTgwMjExX3dwYV9hc3NvY19mcmFtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgY2hhciAqd3BhX2llLCBpbnQgd3BhX2llX2xlbikKLXsKLQkvKiBtYWtlIHN1cmUgV1BBIGlzIGVuYWJsZWQgKi8KLQlpZWVlODAyMTFfd3BhX2VuYWJsZShpZWVlLCAxKTsKLQotCWllZWU4MDIxMV9kaXNhc3NvY2lhdGUoaWVlZSk7Ci19Ci0KLQotc3RhdGljIGludCBpZWVlODAyMTFfd3BhX21sbWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCBjb21tYW5kLCBpbnQgcmVhc29uKQotewotCi0JaW50IHJldCA9IDA7Ci0KLQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQljYXNlIElFRUVfTUxNRV9TVEFfREVBVVRIOgotCQkvLyBzaWxlbnRseSBpZ25vcmUKLQkJYnJlYWs7Ci0KLQljYXNlIElFRUVfTUxNRV9TVEFfRElTQVNTT0M6Ci0JCWllZWU4MDIxMV9kaXNhc3NvY2lhdGUoaWVlZSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcHJpbnRrKCJVbmtub3duIE1MTUUgcmVxdWVzdDogJWRcbiIsIGNvbW1hbmQpOwotCQlyZXQgPSAtRU9QTk9UU1VQUDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9zZXRfd3BhX2llKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotCQkJICAgICAgc3RydWN0IGllZWVfcGFyYW0gKnBhcmFtLCBpbnQgcGxlbikKLXsKLQl1OCAqYnVmOwotCi0JaWYgKHBhcmFtLT51LndwYV9pZS5sZW4gPiBNQVhfV1BBX0lFX0xFTiB8fAotCSAgICAocGFyYW0tPnUud3BhX2llLmxlbiAmJiBwYXJhbS0+dS53cGFfaWUuZGF0YSA9PSBOVUxMKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAocGFyYW0tPnUud3BhX2llLmxlbikgewotCQlidWYgPSBrbWVtZHVwKHBhcmFtLT51LndwYV9pZS5kYXRhLCBwYXJhbS0+dS53cGFfaWUubGVuLAotCQkJICAgICAgR0ZQX0tFUk5FTCk7Ci0JCWlmIChidWYgPT0gTlVMTCkKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCWtmcmVlKGllZWUtPndwYV9pZSk7Ci0JCWllZWUtPndwYV9pZSA9IGJ1ZjsKLQkJaWVlZS0+d3BhX2llX2xlbiA9IHBhcmFtLT51LndwYV9pZS5sZW47Ci0JfSBlbHNlIHsKLQkJa2ZyZWUoaWVlZS0+d3BhX2llKTsKLQkJaWVlZS0+d3BhX2llID0gTlVMTDsKLQkJaWVlZS0+d3BhX2llX2xlbiA9IDA7Ci0JfQotCi0JaWVlZTgwMjExX3dwYV9hc3NvY19mcmFtZShpZWVlLCBpZWVlLT53cGFfaWUsIGllZWUtPndwYV9pZV9sZW4pOwotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIEFVVEhfQUxHX09QRU5fU1lTVEVNCQkJMHgxCi0jZGVmaW5lIEFVVEhfQUxHX1NIQVJFRF9LRVkJCQkweDIKLQotc3RhdGljIGludCBpZWVlODAyMTFfd3BhX3NldF9hdXRoX2FsZ3Moc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIGludCB2YWx1ZSkKLXsKLQotCXN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjID0gewotCQkuZmxhZ3MgPSBTRUNfQVVUSF9NT0RFLAotCX07Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAodmFsdWUgJiBBVVRIX0FMR19TSEFSRURfS0VZKSB7Ci0JCXNlYy5hdXRoX21vZGUgPSBXTEFOX0FVVEhfU0hBUkVEX0tFWTsKLQkJaWVlZS0+b3Blbl93ZXAgPSAwOwotCQlpZWVlLT5hdXRoX21vZGUgPSAxOwotCX0gZWxzZSBpZiAodmFsdWUgJiBBVVRIX0FMR19PUEVOX1NZU1RFTSl7Ci0JCXNlYy5hdXRoX21vZGUgPSBXTEFOX0FVVEhfT1BFTjsKLQkJaWVlZS0+b3Blbl93ZXAgPSAxOwotCQlpZWVlLT5hdXRoX21vZGUgPSAwOwotCX0KLQllbHNlIGlmICh2YWx1ZSAmIElXX0FVVEhfQUxHX0xFQVApewotCQlzZWMuYXV0aF9tb2RlID0gV0xBTl9BVVRIX0xFQVA7Ci0JCWllZWUtPm9wZW5fd2VwID0gMTsKLQkJaWVlZS0+YXV0aF9tb2RlID0gMjsKLQl9Ci0KLQotCWlmIChpZWVlLT5zZXRfc2VjdXJpdHkpCi0JCWllZWUtPnNldF9zZWN1cml0eShpZWVlLCAmc2VjKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgaWVlZTgwMjExX3dwYV9zZXRfcGFyYW0oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4IG5hbWUsIHUzMiB2YWx1ZSkKLXsKLQlpbnQgcmV0PTA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXN3aXRjaCAobmFtZSkgewotCWNhc2UgSUVFRV9QQVJBTV9XUEFfRU5BQkxFRDoKLQkJcmV0ID0gaWVlZTgwMjExX3dwYV9lbmFibGUoaWVlZSwgdmFsdWUpOwotCQlicmVhazsKLQotCWNhc2UgSUVFRV9QQVJBTV9US0lQX0NPVU5URVJNRUFTVVJFUzoKLQkJaWVlZS0+dGtpcF9jb3VudGVybWVhc3VyZXM9dmFsdWU7Ci0JCWJyZWFrOwotCi0JY2FzZSBJRUVFX1BBUkFNX0RST1BfVU5FTkNSWVBURUQ6IHsKLQkJLyogSEFDSzoKLQkJICoKLQkJICogd3BhX3N1cHBsaWNhbnQgY2FsbHMgc2V0X3dwYV9lbmFibGVkIHdoZW4gdGhlIGRyaXZlcgotCQkgKiBpcyBsb2FkZWQgYW5kIHVubG9hZGVkLCByZWdhcmRsZXNzIG9mIGlmIFdQQSBpcyBiZWluZwotCQkgKiB1c2VkLiAgTm8gb3RoZXIgY2FsbHMgYXJlIG1hZGUgd2hpY2ggY2FuIGJlIHVzZWQgdG8KLQkJICogZGV0ZXJtaW5lIGlmIGVuY3J5cHRpb24gd2lsbCBiZSB1c2VkIG9yIG5vdCBwcmlvciB0bwotCQkgKiBhc3NvY2lhdGlvbiBiZWluZyBleHBlY3RlZC4gIElmIGVuY3J5cHRpb24gaXMgbm90IGJlaW5nCi0JCSAqIHVzZWQsIGRyb3BfdW5lbmNyeXB0ZWQgaXMgc2V0IHRvIGZhbHNlLCBlbHNlIHRydWUgLS0gd2UKLQkJICogY2FuIHVzZSB0aGlzIHRvIGRldGVybWluZSBpZiB0aGUgQ0FQX1BSSVZBQ1lfT04gYml0IHNob3VsZAotCQkgKiBiZSBzZXQuCi0JCSAqLwotCQlzdHJ1Y3QgaWVlZTgwMjExX3NlY3VyaXR5IHNlYyA9IHsKLQkJCS5mbGFncyA9IFNFQ19FTkFCTEVELAotCQkJLmVuYWJsZWQgPSB2YWx1ZSwKLQkJfTsKLSAJCWllZWUtPmRyb3BfdW5lbmNyeXB0ZWQgPSB2YWx1ZTsKLQkJLyogV2Ugb25seSBjaGFuZ2UgU0VDX0xFVkVMIGZvciBvcGVuIG1vZGUuIE90aGVycwotCQkgKiBhcmUgc2V0IGJ5IGlwd193cGFfc2V0X2VuY3J5cHRpb24uCi0JCSAqLwotCQlpZiAoIXZhbHVlKSB7Ci0JCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOwotCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzA7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOwotCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzE7Ci0JCX0KLQkJaWYgKGllZWUtPnNldF9zZWN1cml0eSkKLQkJCWllZWUtPnNldF9zZWN1cml0eShpZWVlLCAmc2VjKTsKLQkJYnJlYWs7Ci0JfQotCi0JY2FzZSBJRUVFX1BBUkFNX1BSSVZBQ1lfSU5WT0tFRDoKLQkJaWVlZS0+cHJpdmFjeV9pbnZva2VkPXZhbHVlOwotCQlicmVhazsKLQotCWNhc2UgSUVFRV9QQVJBTV9BVVRIX0FMR1M6Ci0JCXJldCA9IGllZWU4MDIxMV93cGFfc2V0X2F1dGhfYWxncyhpZWVlLCB2YWx1ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJRUVFX1BBUkFNX0lFRUVfODAyXzFYOgotCQlpZWVlLT5pZWVlODAyXzF4PXZhbHVlOwotCQlicmVhazsKLQljYXNlIElFRUVfUEFSQU1fV1BBWF9TRUxFQ1Q6Ci0JCS8vIGFkZGVkIGZvciBXUEEyIG1peGVkIG1vZGUKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPndwYXhfc3VpdGxpc3RfbG9jayxmbGFncyk7Ci0JCWllZWUtPndwYXhfdHlwZV9zZXQgPSAxOwotCQlpZWVlLT53cGF4X3R5cGVfbm90aWZ5ID0gdmFsdWU7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPndwYXhfc3VpdGxpc3RfbG9jayxmbGFncyk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcHJpbnRrKCJVbmtub3duIFdQQSBwYXJhbTogJWRcbiIsbmFtZSk7Ci0JCXJldCA9IC1FT1BOT1RTVVBQOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIGltcGxlbWVudGF0aW9uIGJvcnJvd2VkIGZyb20gaG9zdGFwIGRyaXZlciAqLwotCi1zdGF0aWMgaW50IGllZWU4MDIxMV93cGFfc2V0X2VuY3J5cHRpb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCQkJICBzdHJ1Y3QgaWVlZV9wYXJhbSAqcGFyYW0sIGludCBwYXJhbV9sZW4pCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wczsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdDsKLQotCXN0cnVjdCBpZWVlODAyMTFfc2VjdXJpdHkgc2VjID0gewotCQkuZmxhZ3MgPSAwLAotCX07Ci0KLQlwYXJhbS0+dS5jcnlwdC5lcnIgPSAwOwotCXBhcmFtLT51LmNyeXB0LmFsZ1tJRUVFX0NSWVBUX0FMR19OQU1FX0xFTiAtIDFdID0gJ1wwJzsKLQotCWlmIChwYXJhbV9sZW4gIT0KLQkgICAgKGludCkgKChjaGFyICopIHBhcmFtLT51LmNyeXB0LmtleSAtIChjaGFyICopIHBhcmFtKSArCi0JICAgIHBhcmFtLT51LmNyeXB0LmtleV9sZW4pIHsKLQkJcHJpbnRrKCJMZW4gbWlzbWF0Y2ggJWQsICVkXG4iLCBwYXJhbV9sZW4sCi0JCQkgICAgICAgcGFyYW0tPnUuY3J5cHQua2V5X2xlbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAocGFyYW0tPnN0YV9hZGRyWzBdID09IDB4ZmYgJiYgcGFyYW0tPnN0YV9hZGRyWzFdID09IDB4ZmYgJiYKLQkgICAgcGFyYW0tPnN0YV9hZGRyWzJdID09IDB4ZmYgJiYgcGFyYW0tPnN0YV9hZGRyWzNdID09IDB4ZmYgJiYKLQkgICAgcGFyYW0tPnN0YV9hZGRyWzRdID09IDB4ZmYgJiYgcGFyYW0tPnN0YV9hZGRyWzVdID09IDB4ZmYpIHsKLQkJaWYgKHBhcmFtLT51LmNyeXB0LmlkeCA+PSBXRVBfS0VZUykKLQkJCXJldHVybiAtRUlOVkFMOwotCQljcnlwdCA9ICZpZWVlLT5jcnlwdFtwYXJhbS0+dS5jcnlwdC5pZHhdOwotCX0gZWxzZSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAibm9uZSIpID09IDApIHsKLQkJaWYgKGNyeXB0KSB7Ci0JCQlzZWMuZW5hYmxlZCA9IDA7Ci0JCQkvLyBGSVhNRSBGSVhNRQotCQkJLy9zZWMuZW5jcnlwdCA9IDA7Ci0JCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMDsKLQkJCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRCB8IFNFQ19MRVZFTDsKLQkJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7Ci0JCX0KLQkJZ290byBkb25lOwotCX0KLQlzZWMuZW5hYmxlZCA9IDE7Ci0vLyBGSVhNRSBGSVhNRQotLy8Jc2VjLmVuY3J5cHQgPSAxOwotCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRDsKLQotCS8qIElQVyBIVyBjYW5ub3QgYnVpbGQgVEtJUCBNSUMsIGhvc3QgZGVjcnlwdGlvbiBzdGlsbCBuZWVkZWQuICovCi0JaWYgKCEoaWVlZS0+aG9zdF9lbmNyeXB0IHx8IGllZWUtPmhvc3RfZGVjcnlwdCkgJiYKLQkgICAgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIlRLSVAiKSkKLQkJZ290byBza2lwX2hvc3RfY3J5cHQ7Ci0KLQlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMocGFyYW0tPnUuY3J5cHQuYWxnKTsKLQlpZiAob3BzID09IE5VTEwgJiYgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIldFUCIpID09IDApCi0JCW9wcyA9IGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhwYXJhbS0+dS5jcnlwdC5hbGcpOwotCQkvKiBzZXQgV0VQNDAgZmlyc3QsIGl0IHdpbGwgYmUgbW9kaWZpZWQgYWNjb3JkaW5nIHRvIFdFUDEwNCBvcgotCQkgKiBXRVA0MCBhdCBvdGhlciBwbGFjZSAqLwotCWVsc2UgaWYgKG9wcyA9PSBOVUxMICYmIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJUS0lQIikgPT0gMCkKLQkJb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKHBhcmFtLT51LmNyeXB0LmFsZyk7Ci0JZWxzZSBpZiAob3BzID09IE5VTEwgJiYgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIkNDTVAiKSA9PSAwKQotCQlvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMocGFyYW0tPnUuY3J5cHQuYWxnKTsKLQlpZiAob3BzID09IE5VTEwpIHsKLQkJcHJpbnRrKCJ1bmtub3duIGNyeXB0byBhbGcgJyVzJ1xuIiwgcGFyYW0tPnUuY3J5cHQuYWxnKTsKLQkJcGFyYW0tPnUuY3J5cHQuZXJyID0gSUVFRV9DUllQVF9FUlJfVU5LTk9XTl9BTEc7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoKmNyeXB0ID09IE5VTEwgfHwgKCpjcnlwdCktPm9wcyAhPSBvcHMpIHsKLQkJc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpuZXdfY3J5cHQ7Ci0KLQkJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGllZWUsIGNyeXB0KTsKLQotCQluZXdfY3J5cHQgPSBrbWFsbG9jKHNpemVvZigqbmV3X2NyeXB0KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChuZXdfY3J5cHQgPT0gTlVMTCkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQltZW1zZXQobmV3X2NyeXB0LCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKSk7Ci0JCW5ld19jcnlwdC0+b3BzID0gb3BzOwotCQlpZiAobmV3X2NyeXB0LT5vcHMpCi0JCQluZXdfY3J5cHQtPnByaXYgPQotCQkJCW5ld19jcnlwdC0+b3BzLT5pbml0KHBhcmFtLT51LmNyeXB0LmlkeCk7Ci0KLQkJaWYgKG5ld19jcnlwdC0+cHJpdiA9PSBOVUxMKSB7Ci0JCQlrZnJlZShuZXdfY3J5cHQpOwotCQkJcGFyYW0tPnUuY3J5cHQuZXJyID0gSUVFRV9DUllQVF9FUlJfQ1JZUFRfSU5JVF9GQUlMRUQ7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJKmNyeXB0ID0gbmV3X2NyeXB0OwotCX0KLQotCWlmIChwYXJhbS0+dS5jcnlwdC5rZXlfbGVuID4gMCAmJiAoKmNyeXB0KS0+b3BzLT5zZXRfa2V5ICYmCi0JICAgICgqY3J5cHQpLT5vcHMtPnNldF9rZXkocGFyYW0tPnUuY3J5cHQua2V5LAotCQkJCSAgIHBhcmFtLT51LmNyeXB0LmtleV9sZW4sIHBhcmFtLT51LmNyeXB0LnNlcSwKLQkJCQkgICAoKmNyeXB0KS0+cHJpdikgPCAwKSB7Ci0JCXByaW50aygia2V5IHNldHRpbmcgZmFpbGVkXG4iKTsKLQkJcGFyYW0tPnUuY3J5cHQuZXJyID0gSUVFRV9DUllQVF9FUlJfS0VZX1NFVF9GQUlMRUQ7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLSBza2lwX2hvc3RfY3J5cHQ6Ci0JaWYgKHBhcmFtLT51LmNyeXB0LnNldF90eCkgewotCQlpZWVlLT50eF9rZXlpZHggPSBwYXJhbS0+dS5jcnlwdC5pZHg7Ci0JCXNlYy5hY3RpdmVfa2V5ID0gcGFyYW0tPnUuY3J5cHQuaWR4OwotCQlzZWMuZmxhZ3MgfD0gU0VDX0FDVElWRV9LRVk7Ci0JfSBlbHNlCi0JCXNlYy5mbGFncyAmPSB+U0VDX0FDVElWRV9LRVk7Ci0KLQlpZiAocGFyYW0tPnUuY3J5cHQuYWxnICE9IE5VTEwpIHsKLQkJbWVtY3B5KHNlYy5rZXlzW3BhcmFtLT51LmNyeXB0LmlkeF0sCi0JCSAgICAgICBwYXJhbS0+dS5jcnlwdC5rZXksCi0JCSAgICAgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuKTsKLQkJc2VjLmtleV9zaXplc1twYXJhbS0+dS5jcnlwdC5pZHhdID0gcGFyYW0tPnUuY3J5cHQua2V5X2xlbjsKLQkJc2VjLmZsYWdzIHw9ICgxIDw8IHBhcmFtLT51LmNyeXB0LmlkeCk7Ci0KLQkJaWYgKHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJXRVAiKSA9PSAwKSB7Ci0JCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOwotCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzE7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIlRLSVAiKSA9PSAwKSB7Ci0JCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOwotCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzI7Ci0JCX0gZWxzZSBpZiAoc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIkNDTVAiKSA9PSAwKSB7Ci0JCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOwotCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzM7Ci0JCX0KLQl9Ci0gZG9uZToKLQlpZiAoaWVlZS0+c2V0X3NlY3VyaXR5KQotCQlpZWVlLT5zZXRfc2VjdXJpdHkoaWVlZSwgJnNlYyk7Ci0KLQkvKiBEbyBub3QgcmVzZXQgcG9ydCBpZiBjYXJkIGlzIGluIE1hbmFnZWQgbW9kZSBzaW5jZSByZXNldHRpbmcgd2lsbAotCSAqIGdlbmVyYXRlIG5ldyBJRUVFIDgwMi4xMSBhdXRoZW50aWNhdGlvbiB3aGljaCBtYXkgZW5kIHVwIGluIGxvb3BpbmcKLQkgKiB3aXRoIElFRUUgODAyLjFYLiAgSWYgeW91ciBoYXJkd2FyZSByZXF1aXJlcyBhIHJlc2V0IGFmdGVyIFdFUAotCSAqIGNvbmZpZ3VyYXRpb24gKGZvciBleGFtcGxlLi4uIFByaXNtMiksIGltcGxlbWVudCB0aGUgcmVzZXRfcG9ydCBpbgotCSAqIHRoZSBjYWxsYmFja3Mgc3RydWN0dXJlcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIDgwMi4xMSBzdGFjay4gKi8KLQlpZiAoaWVlZS0+cmVzZXRfb25fa2V5Y2hhbmdlICYmCi0JICAgIGllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSAmJgotCSAgICBpZWVlLT5yZXNldF9wb3J0ICYmCi0JICAgIGllZWUtPnJlc2V0X3BvcnQoaWVlZSkpIHsKLQkJcHJpbnRrKCJyZXNldF9wb3J0IGZhaWxlZFxuIik7Ci0JCXBhcmFtLT51LmNyeXB0LmVyciA9IElFRUVfQ1JZUFRfRVJSX0NBUkRfQ09ORl9GQUlMRUQ7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLWlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZV9za2IoCi0JCQkJCQkJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpiZWFjb24sCi0JCQkJCQkJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCQkJCQkJdTgJYXNSc24pCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jICpkaXNhc3M7Ci0KLQlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2Rpc2Fzc29jKSk7Ci0JaWYgKCFza2IpCi0JCXJldHVybiBOVUxMOwotCi0JZGlzYXNzID0gKHN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2MgKikgc2tiX3B1dChza2Isc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfZGlzYXNzb2MpKTsKLQlkaXNhc3MtPmhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfRElTQVNTT0MpOwotCWRpc2Fzcy0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMDsKLQotCW1lbWNweShkaXNhc3MtPmhlYWRlci5hZGRyMSwgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOwotCW1lbWNweShkaXNhc3MtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweShkaXNhc3MtPmhlYWRlci5hZGRyMywgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOwotCi0JZGlzYXNzLT5yZWFzb24gPSBhc1JzbjsKLQlyZXR1cm4gc2tiOwotfQotCi0KLXZvaWQKLVNlbmREaXNhc3NvY2lhdGlvbigKLQkJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCXU4KiAJCQkJCWFzU3RhLAotCQl1OAkJCQkJCWFzUnNuCi0pCi17Ci0JCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKLQkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQkJc2tiID0gaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZV9za2IoYmVhY29uLGllZWUsYXNSc24pOwotCQlpZiAoc2tiKXsKLQkJCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOwotCQkJCS8vZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsvL2VkaXQgYnkgdGhvbWFzCi0JCX0KLX0KLQotaW50IGllZWU4MDIxMV93cGFfc3VwcGxpY2FudF9pb2N0bChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3BvaW50ICpwKQotewotCXN0cnVjdCBpZWVlX3BhcmFtICpwYXJhbTsKLQlpbnQgcmV0PTA7Ci0KLQlkb3duKCZpZWVlLT53eF9zZW0pOwotCS8vSUVFRV9ERUJVR19JTkZPKCJ3cGFfc3VwcGxpY2FudDogbGVuPSVkXG4iLCBwLT5sZW5ndGgpOwotCi0JaWYgKHAtPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaWVlZV9wYXJhbSkgfHwgIXAtPnBvaW50ZXIpewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlwYXJhbSA9IGttYWxsb2MocC0+bGVuZ3RoLCBHRlBfS0VSTkVMKTsKLQlpZiAocGFyYW0gPT0gTlVMTCl7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQlpZiAoY29weV9mcm9tX3VzZXIocGFyYW0sIHAtPnBvaW50ZXIsIHAtPmxlbmd0aCkpIHsKLQkJa2ZyZWUocGFyYW0pOwotCQlyZXQgPSAtRUZBVUxUOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlzd2l0Y2ggKHBhcmFtLT5jbWQpIHsKLQotCWNhc2UgSUVFRV9DTURfU0VUX1dQQV9QQVJBTToKLQkJcmV0ID0gaWVlZTgwMjExX3dwYV9zZXRfcGFyYW0oaWVlZSwgcGFyYW0tPnUud3BhX3BhcmFtLm5hbWUsCi0JCQkJCXBhcmFtLT51LndwYV9wYXJhbS52YWx1ZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJRUVFX0NNRF9TRVRfV1BBX0lFOgotCQlyZXQgPSBpZWVlODAyMTFfd3BhX3NldF93cGFfaWUoaWVlZSwgcGFyYW0sIHAtPmxlbmd0aCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJRUVFX0NNRF9TRVRfRU5DUllQVElPTjoKLQkJcmV0ID0gaWVlZTgwMjExX3dwYV9zZXRfZW5jcnlwdGlvbihpZWVlLCBwYXJhbSwgcC0+bGVuZ3RoKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElFRUVfQ01EX01MTUU6Ci0JCXJldCA9IGllZWU4MDIxMV93cGFfbWxtZShpZWVlLCBwYXJhbS0+dS5tbG1lLmNvbW1hbmQsCi0JCQkJICAgcGFyYW0tPnUubWxtZS5yZWFzb25fY29kZSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcHJpbnRrKCJVbmtub3duIFdQQSBzdXBwbGljYW50IHJlcXVlc3Q6ICVkXG4iLHBhcmFtLT5jbWQpOwotCQlyZXQgPSAtRU9QTk9UU1VQUDsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHJldCA9PSAwICYmIGNvcHlfdG9fdXNlcihwLT5wb2ludGVyLCBwYXJhbSwgcC0+bGVuZ3RoKSkKLQkJcmV0ID0gLUVGQVVMVDsKLQotCWtmcmVlKHBhcmFtKTsKLW91dDoKLQl1cCgmaWVlZS0+d3hfc2VtKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgbm90aWZ5X3d4X2Fzc29jX2V2ZW50KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQotewotCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKLQl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQotCQltZW1jcHkod3JxdS5hcF9hZGRyLnNhX2RhdGEsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOwotCWVsc2UKLQkJbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7Ci0Jd2lyZWxlc3Nfc2VuZF9ldmVudChpZWVlLT5kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hY193eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hY193eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGEwNjhlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWNfd3guYworKysgL2Rldi9udWxsCkBAIC0xLDYwMCArMCwwIEBACi0vKiBJRUVFIDgwMi4xMSBTb2Z0TUFDIGxheWVyCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PgotICoKLSAqIE1vc3RseSBleHRyYWN0ZWQgZnJvbSB0aGUgcnRsODE4MC1zYTI0MDAgZHJpdmVyIGZvciB0aGUKLSAqIGluLWtlcm5lbCBnZW5lcmljIGllZWU4MDIuMTEgc3RhY2suCi0gKgotICogU29tZSBwaWVjZXMgb2YgY29kZSBtaWdodCBiZSBzdG9sZW4gZnJvbSBpcHcyMTAwIGRyaXZlcgotICogY29weXJpZ2h0IG9mIHdobyBvd24gaXQncyBjb3B5cmlnaHQgOy0pCi0gKgotICogUFMgd3ggaGFuZGxlciBtb3N0bHkgc3RvbGVuIGZyb20gaG9zdGFwLCBjb3B5cmlnaHQgd2hvCi0gKiBvd24gaXQncyBjb3B5cmlnaHQgOy0pCi0gKgotICogcmVsZWFzZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLQotI2luY2x1ZGUgImllZWU4MDIxMS5oIgotI2lmZGVmIEVOQUJMRV9ET1QxMUQKLSNpbmNsdWRlICJkb3QxMWQuaCIKLSNlbmRpZgotLyogRklYTUU6IGFkZCBBIGZyZXFzICovCi0KLWNvbnN0IGxvbmcgaWVlZTgwMjExX3dsYW5fZnJlcXVlbmNpZXNbXSA9IHsKLQkyNDEyLCAyNDE3LCAyNDIyLCAyNDI3LAotCTI0MzIsIDI0MzcsIDI0NDIsIDI0NDcsCi0JMjQ1MiwgMjQ1NywgMjQ2MiwgMjQ2NywKLQkyNDcyLCAyNDg0Ci19OwotCi0KLWludCBpZWVlODAyMTFfd3hfc2V0X2ZyZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCi0JCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgaXdfZnJlcSAqZndycSA9ICYgd3JxdS0+ZnJlcTsKLQotCWRvd24oJmllZWUtPnd4X3NlbSk7Ci0KLQlpZihpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpewotCQlyZXQgPSAtRU9QTk9UU1VQUDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogaWYgc2V0dGluZyBieSBmcmVxIGNvbnZlcnQgdG8gY2hhbm5lbCAqLwotCWlmIChmd3JxLT5lID09IDEpIHsKLQkJaWYgKChmd3JxLT5tID49IChpbnQpIDIuNDEyZTggJiYKLQkJICAgICBmd3JxLT5tIDw9IChpbnQpIDIuNDg3ZTgpKSB7Ci0JCQlpbnQgZiA9IGZ3cnEtPm0gLyAxMDAwMDA7Ci0JCQlpbnQgYyA9IDA7Ci0KLQkJCXdoaWxlICgoYyA8IDE0KSAmJiAoZiAhPSBpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llc1tjXSkpCi0JCQkJYysrOwotCi0JCQkvKiBoYWNrIHRvIGZhbGwgdGhyb3VnaCAqLwotCQkJZndycS0+ZSA9IDA7Ci0JCQlmd3JxLT5tID0gYyArIDE7Ci0JCX0KLQl9Ci0KLQlpZiAoZndycS0+ZSA+IDAgfHwgZndycS0+bSA+IDE0IHx8IGZ3cnEtPm0gPCAxICl7Ci0JCXJldCA9IC1FT1BOT1RTVVBQOwotCQlnb3RvIG91dDsKLQotCX1lbHNlIHsgLyogU2V0IHRoZSBjaGFubmVsICovCi0KLSNpZmRlZiBFTkFCTEVfRE9UMTFECi0JCWlmICghKEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXApW2Z3cnEtPm1dKSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KLSNlbmRpZgotCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9IGZ3cnEtPm07Ci0JCWllZWUtPnNldF9jaGFuKGllZWUsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKLQotCQlpZihpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MgfHwgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikKLQkJCWlmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpewotCi0JCQlpZWVlODAyMTFfc3RvcF9zZW5kX2JlYWNvbnMoaWVlZSk7Ci0JCQlpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKGllZWUpOwotCQkJfQotCX0KLQotCXJldCA9IDA7Ci1vdXQ6Ci0JdXAoJmllZWUtPnd4X3NlbSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1pbnQgaWVlZTgwMjExX3d4X2dldF9mcmVxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAotCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQotewotCXN0cnVjdCBpd19mcmVxICpmd3JxID0gJiB3cnF1LT5mcmVxOwotCi0JaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID09IDApCi0JCXJldHVybiAtMTsKLQkvL05NIDAuNy4wIHdpbGwgbm90IGFjY2VwdCBjaGFubmVsIGFueSBtb3JlLgotCWZ3cnEtPm0gPSBpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llc1tpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbC0xXSAqIDEwMDAwMDsKLQlmd3JxLT5lID0gMTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgaWVlZTgwMjExX3d4X2dldF93YXAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXdycXUtPmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCi0JaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBXZSB3YW50IGF2b2lkIHRvIGdpdmUgdG8gdGhlIHVzZXIgaW5jb25zaXN0ZW50IGluZm9zKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKGllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQgJiYKLQkJaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORyAmJgotCQlpZWVlLT53YXBfc2V0ID09IDApCi0KLQkJbWVtc2V0KHdycXUtPmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOwotCWVsc2UKLQkJbWVtY3B5KHdycXUtPmFwX2FkZHIuc2FfZGF0YSwKLQkJICAgICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotaW50IGllZWU4MDIxMV93eF9zZXRfd2FwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgdW5pb24gaXdyZXFfZGF0YSAqYXdycSwKLQkJCSBjaGFyICpleHRyYSkKLXsKLQotCWludCByZXQgPSAwOwotCXU4IHplcm9bXSA9IHswLDAsMCwwLDAsMH07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNob3J0IGlmdXAgPSBpZWVlLT5wcm90b19zdGFydGVkOy8vZGV2LT5mbGFncyAmIElGRl9VUDsKLQlzdHJ1Y3Qgc29ja2FkZHIgKnRlbXAgPSAoc3RydWN0IHNvY2thZGRyICopYXdycTsKLQotCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKLQotCWRvd24oJmllZWUtPnd4X3NlbSk7Ci0JLyogdXNlIGlmY29uZmlnIGh3IGV0aGVyICovCi0JaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpewotCQlyZXQgPSAtMTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKHRlbXAtPnNhX2ZhbWlseSAhPSBBUlBIUkRfRVRIRVIpewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoaWZ1cCkKLQkJaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woaWVlZSx0cnVlKTsKLQotCS8qIGp1c3QgdG8gYXZvaWQgdG8gZ2l2ZSBpbmNvbnNpc3RlbnQgaW5mb3MgaW4gdGhlCi0JICogZ2V0IHd4IG1ldGhvZC4gbm90IHJlYWxseSBuZWVkZWQgb3RoZXJ3aXNlCi0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKLQotCW1lbWNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIHRlbXAtPnNhX2RhdGEsIEVUSF9BTEVOKTsKLQlpZWVlLT53YXBfc2V0ID0gbWVtY21wKHRlbXAtPnNhX2RhdGEsIHplcm8sRVRIX0FMRU4pIT0wOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKGlmdXApCi0JCWllZWU4MDIxMV9zdGFydF9wcm90b2NvbChpZWVlKTsKLW91dDoKLQl1cCgmaWVlZS0+d3hfc2VtKTsKLQlyZXR1cm4gcmV0OwotfQotCi0gaW50IGllZWU4MDIxMV93eF9nZXRfZXNzaWQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsdW5pb24gaXdyZXFfZGF0YSAqd3JxdSxjaGFyICpiKQotewotCWludCBsZW4scmV0ID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBXZSB3YW50IGF2b2lkIHRvIGdpdmUgdG8gdGhlIHVzZXIgaW5jb25zaXN0ZW50IGluZm9zKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkWzBdID09ICdcMCcgfHwKLQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IDApewotCQlyZXQgPSAtMTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGllZWUtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQgJiYKLQkJaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRF9TQ0FOTklORyAmJgotCQlpZWVlLT5zc2lkX3NldCA9PSAwKXsKLQkJcmV0ID0gLTE7Ci0JCWdvdG8gb3V0OwotCX0KLQlsZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW47Ci0Jd3JxdS0+ZXNzaWQubGVuZ3RoID0gbGVuOwotCXN0cm5jcHkoYixpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCxsZW4pOwotCXdycXUtPmVzc2lkLmZsYWdzID0gMTsKLQotb3V0OgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiByZXQ7Ci0KLX0KLQotaW50IGllZWU4MDIxMV93eF9zZXRfcmF0ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0KLQl1MzIgdGFyZ2V0X3JhdGUgPSB3cnF1LT5iaXRyYXRlLnZhbHVlOwotCi0JaWVlZS0+cmF0ZSA9IHRhcmdldF9yYXRlLzEwMDAwMDsKLQkvL0ZJWE1FOiB3ZSBtaWdodCB3YW50IHRvIGxpbWl0IHJhdGUgYWxzbyBpbiBtYW5hZ2VtZW50IHByb3RvY29scy4KLQlyZXR1cm4gMDsKLX0KLQotCi0KLWludCBpZWVlODAyMTFfd3hfZ2V0X3JhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCXUzMiB0bXBfcmF0ZTsKLQl0bXBfcmF0ZSA9IFR4Q291bnRUb0RhdGFSYXRlKGllZWUsIGllZWUtPnNvZnRtYWNfc3RhdHMuQ3VycmVudFNob3dUeGF0ZSk7Ci0KLQl3cnF1LT5iaXRyYXRlLnZhbHVlID0gdG1wX3JhdGUgKiA1MDAwMDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1pbnQgaWVlZTgwMjExX3d4X3NldF9ydHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCWlmICh3cnF1LT5ydHMuZGlzYWJsZWQgfHwgIXdycXUtPnJ0cy5maXhlZCkKLQkJaWVlZS0+cnRzID0gREVGQVVMVF9SVFNfVEhSRVNIT0xEOwotCWVsc2UKLQl7Ci0JCWlmICh3cnF1LT5ydHMudmFsdWUgPCBNSU5fUlRTX1RIUkVTSE9MRCB8fAotCQkJCXdycXUtPnJ0cy52YWx1ZSA+IE1BWF9SVFNfVEhSRVNIT0xEKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWllZWUtPnJ0cyA9IHdycXUtPnJ0cy52YWx1ZTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBpZWVlODAyMTFfd3hfZ2V0X3J0cyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0Jd3JxdS0+cnRzLnZhbHVlID0gaWVlZS0+cnRzOwotCXdycXUtPnJ0cy5maXhlZCA9IDA7CS8qIG5vIGF1dG8gc2VsZWN0ICovCi0Jd3JxdS0+cnRzLmRpc2FibGVkID0gKHdycXUtPnJ0cy52YWx1ZSA9PSBERUZBVUxUX1JUU19USFJFU0hPTEQpOwotCXJldHVybiAwOwotfQotaW50IGllZWU4MDIxMV93eF9zZXRfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKLQkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKLXsKLQotCWllZWUtPnN5bmNfc2Nhbl9odXJyeXVwID0gMTsKLQotCWRvd24oJmllZWUtPnd4X3NlbSk7Ci0KLQlpZiAod3JxdS0+bW9kZSA9PSBpZWVlLT5pd19tb2RlKQotCQlnb3RvIG91dDsKLQotCWlmICh3cnF1LT5tb2RlID09IElXX01PREVfTU9OSVRPUil7Ci0KLQkJaWVlZS0+ZGV2LT50eXBlID0gQVJQSFJEX0lFRUU4MDIxMTsKLQl9ZWxzZXsKLQkJaWVlZS0+ZGV2LT50eXBlID0gQVJQSFJEX0VUSEVSOwotCX0KLQotCWlmICghaWVlZS0+cHJvdG9fc3RhcnRlZCl7Ci0JCWllZWUtPml3X21vZGUgPSB3cnF1LT5tb2RlOwotCX1lbHNlewotCQlpZWVlODAyMTFfc3RvcF9wcm90b2NvbChpZWVlLHRydWUpOwotCQlpZWVlLT5pd19tb2RlID0gd3JxdS0+bW9kZTsKLQkJaWVlZTgwMjExX3N0YXJ0X3Byb3RvY29sKGllZWUpOwotCX0KLQotb3V0OgotCXVwKCZpZWVlLT53eF9zZW0pOwotCXJldHVybiAwOwotfQotCi12b2lkIGllZWU4MDIxMV93eF9zeW5jX3NjYW5fd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgd3hfc3luY19zY2FuX3dxKTsKLQlzaG9ydCBjaGFuOwotCUhUX0VYVENITkxfT0ZGU0VUIGNoYW5fb2Zmc2V0PTA7Ci0JSFRfQ0hBTk5FTF9XSURUSCBiYW5kd2lkdGg9MDsKLQlpbnQgYjQwTSA9IDA7Ci0Jc3RhdGljIGludCBjb3VudCA9IDA7Ci0JY2hhbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsOwotCi0jaWZkZWYgRU5BQkxFX0xQUwotCWlmIChpZWVlLT5MZWlzdXJlUFNMZWF2ZSkgewotCQlpZWVlLT5MZWlzdXJlUFNMZWF2ZShpZWVlKTsKLQl9Ci0KLQkvKiBub3RpZnkgQVAgdG8gYmUgaW4gUFMgbW9kZSAqLwotCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIDEpOwotCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIDEpOwotI2VuZGlmCi0KLQlpZiAoaWVlZS0+ZGF0YV9oYXJkX3N0b3ApCi0JCWllZWUtPmRhdGFfaGFyZF9zdG9wKGllZWUpOwotCi0JaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKGllZWUpOwotCi0JaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HOwotCWllZWUtPmxpbmtfY2hhbmdlKGllZWUpOwotCWllZWUtPkluaXRpYWxHYWluSGFuZGxlcihpZWVlLCBJR19CYWNrdXApOwotCWlmIChpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCAmJiBpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQgJiYgaWVlZS0+cEhUSW5mby0+YkN1ckJXNDBNSHopIHsKLQkJYjQwTSA9IDE7Ci0JCWNoYW5fb2Zmc2V0ID0gaWVlZS0+cEhUSW5mby0+Q3VyU1RBRXh0Q2hubE9mZnNldDsKLQkJYmFuZHdpZHRoID0gKEhUX0NIQU5ORUxfV0lEVEgpaWVlZS0+cEhUSW5mby0+YkN1ckJXNDBNSHo7Ci0JCXByaW50aygiU2NhbiBpbiA0ME0sIGZvcmNlIHRvIDIwTSBmaXJzdDolZCwgJWRcbiIsIGNoYW5fb2Zmc2V0LCBiYW5kd2lkdGgpOwotCQlpZWVlLT5TZXRCV01vZGVIYW5kbGVyKGllZWUsIEhUX0NIQU5ORUxfV0lEVEhfMjAsIEhUX0VYVENITkxfT0ZGU0VUX05PX0VYVCk7Ci0JCX0KLQlpZWVlODAyMTFfc3RhcnRfc2Nhbl9zeW5jcm8oaWVlZSk7Ci0JaWYgKGI0ME0pIHsKLQkJcHJpbnRrKCJTY2FuIGluIDIwTSwgYmFjayB0byA0ME1cbiIpOwotCQlpZiAoY2hhbl9vZmZzZXQgPT0gSFRfRVhUQ0hOTF9PRkZTRVRfVVBQRVIpCi0JCQlpZWVlLT5zZXRfY2hhbihpZWVlLCBjaGFuICsgMik7Ci0JCWVsc2UgaWYgKGNoYW5fb2Zmc2V0ID09IEhUX0VYVENITkxfT0ZGU0VUX0xPV0VSKQotCQkJaWVlZS0+c2V0X2NoYW4oaWVlZSwgY2hhbiAtIDIpOwotCQllbHNlCi0JCQlpZWVlLT5zZXRfY2hhbihpZWVlLCBjaGFuKTsKLQkJaWVlZS0+U2V0QldNb2RlSGFuZGxlcihpZWVlLCBiYW5kd2lkdGgsIGNoYW5fb2Zmc2V0KTsKLQl9IGVsc2UgewotCQlpZWVlLT5zZXRfY2hhbihpZWVlLCBjaGFuKTsKLQl9Ci0KLQlpZWVlLT5Jbml0aWFsR2FpbkhhbmRsZXIoaWVlZSwgSUdfUmVzdG9yZSk7Ci0JaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfTElOS0VEOwotCWllZWUtPmxpbmtfY2hhbmdlKGllZWUpOwotCi0jaWZkZWYgRU5BQkxFX0xQUwotCS8qIE5vdGlmeSBBUCB0aGF0IEkgd2FrZSB1cCBhZ2FpbiAqLwotCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIDApOwotI2VuZGlmCi0KLQkvLyBUbyBwcmV2ZW50IHRoZSBpbW1lZGlhdGVseSBjYWxsaW5nIHdhdGNoX2RvZyBhZnRlciBzY2FuLgotCWlmKGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZCY25JblBlcmlvZD09MHx8aWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkRhdGFJblBlcmlvZD09MCApCi0JewotCQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2QmNuSW5QZXJpb2QgPSAxOwotCQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2RGF0YUluUGVyaW9kPSAxOwotCX0KLQlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKLQkJaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZShpZWVlKTsKLQotCWlmKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyB8fCBpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKQotCQlpZWVlODAyMTFfc3RhcnRfc2VuZF9iZWFjb25zKGllZWUpOwotCi0JY291bnQgPSAwOwotCXVwKCZpZWVlLT53eF9zZW0pOwotCi19Ci0KLWludCBpZWVlODAyMTFfd3hfc2V0X3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCi0JCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlkb3duKCZpZWVlLT53eF9zZW0pOwotCi0JaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SIHx8ICEoaWVlZS0+cHJvdG9fc3RhcnRlZCkpewotCQlyZXQgPSAtMTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKCBpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKXsKLQkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPnd4X3N5bmNfc2Nhbl93cSk7Ci0JCS8qIGludGVudGlvbmFsbHkgZm9yZ2V0IHRvIHVwIHNlbSAqLwotCQlyZXR1cm4gMDsKLQl9Ci0KLW91dDoKLQl1cCgmaWVlZS0+d3hfc2VtKTsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgaWVlZTgwMjExX3d4X3NldF9lc3NpZChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCi0JCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQotCWludCByZXQ9MCxsZW47Ci0Jc2hvcnQgcHJvdG9fc3RhcnRlZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAxOwotCWRvd24oJmllZWUtPnd4X3NlbSk7Ci0KLQlwcm90b19zdGFydGVkID0gaWVlZS0+cHJvdG9fc3RhcnRlZDsKLQotCWlmICh3cnF1LT5lc3NpZC5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSl7Ci0JCXJldD0gLUUyQklHOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpewotCQlyZXQ9IC0xOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZihwcm90b19zdGFydGVkKXsKLQkJaWVlZTgwMjExX3N0b3BfcHJvdG9jb2woaWVlZSx0cnVlKTsKLQl9Ci0KLQotCS8qIHRoaXMgaXMganVzdCB0byBiZSBzdXJlIHRoYXQgdGhlIEdFVCB3eCBjYWxsYmFjawotCSAqIGhhcyBjb25zaXN0ZW4gaW5mb3MuIG5vdCBuZWVkZWQgb3RoZXJ3aXNlCi0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKLQotCWlmICh3cnF1LT5lc3NpZC5mbGFncyAmJiB3cnF1LT5lc3NpZC5sZW5ndGgpIHsKLQkJLy9maXJzdCBmbHVzaCBjdXJyZW50IG5ldHdvcmsuc3NpZAotCQlsZW4gPSAoKHdycXUtPmVzc2lkLmxlbmd0aC0xKSA8IElXX0VTU0lEX01BWF9TSVpFKSA/ICh3cnF1LT5lc3NpZC5sZW5ndGgtMSkgOiBJV19FU1NJRF9NQVhfU0laRTsKLQkJc3RybmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgZXh0cmEsIGxlbisxKTsKLQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID0gbGVuKzE7Ci0JCWllZWUtPnNzaWRfc2V0ID0gMTsKLQl9Ci0JZWxzZXsKLQkJaWVlZS0+c3NpZF9zZXQgPSAwOwotCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZFswXSA9ICdcMCc7Ci0JCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IDA7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKLQotCWlmIChwcm90b19zdGFydGVkKQotCQlpZWVlODAyMTFfc3RhcnRfcHJvdG9jb2woaWVlZSk7Ci1vdXQ6Ci0JdXAoJmllZWUtPnd4X3NlbSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotIGludCBpZWVlODAyMTFfd3hfZ2V0X21vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCi0JCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCi17Ci0KLQl3cnF1LT5tb2RlID0gaWVlZS0+aXdfbW9kZTsKLQlyZXR1cm4gMDsKLX0KLQotIGludCBpZWVlODAyMTFfd3hfc2V0X3Jhd3R4KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0KLQlpbnQgKnBhcm1zID0gKGludCAqKWV4dHJhOwotCWludCBlbmFibGUgPSAocGFybXNbMF0gPiAwKTsKLQlzaG9ydCBwcmV2ID0gaWVlZS0+cmF3X3R4OwotCi0JZG93bigmaWVlZS0+d3hfc2VtKTsKLQotCWlmKGVuYWJsZSkKLQkJaWVlZS0+cmF3X3R4ID0gMTsKLQllbHNlCi0JCWllZWUtPnJhd190eCA9IDA7Ci0KLQlwcmludGsoS0VSTl9JTkZPInJhdyBUWCBpcyAlc1xuIiwKLQkgICAgICBpZWVlLT5yYXdfdHggPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKLQotCWlmKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQotCXsKLQkJaWYocHJldiA9PSAwICYmIGllZWUtPnJhd190eCl7Ci0JCQlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKLQkJCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUpOwotCi0JCQluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7Ci0JCX0KLQotCQlpZihwcmV2ICYmIGllZWUtPnJhd190eCA9PSAxKQotCQkJbmV0aWZfY2Fycmllcl9vZmYoaWVlZS0+ZGV2KTsKLQl9Ci0KLQl1cCgmaWVlZS0+d3hfc2VtKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgaWVlZTgwMjExX3d4X2dldF9uYW1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQlzdHJjcHkod3JxdS0+bmFtZSwgIjgwMi4xMSIpOwotCWlmKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04pCi0JCXN0cmNhdCh3cnF1LT5uYW1lLCAiYiIpOwotCWlmKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKQotCQlzdHJjYXQod3JxdS0+bmFtZSwgImciKTsKLQlpZiAoaWVlZS0+bW9kZSAmIChJRUVFX05fMjRHIHwgSUVFRV9OXzVHKSkKLQkJc3RyY2F0KHdycXUtPm5hbWUsICJuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotLyogdGhpcyBpcyBtb3N0bHkgc3RvbGVuIGZyb20gaG9zdGFwICovCi1pbnQgaWVlZTgwMjExX3d4X3NldF9wb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZigKLQkJKCFpZWVlLT5zdGFfd2FrZV91cCkgfHwKLQkJKCFpZWVlLT5lbnRlcl9zbGVlcF9zdGF0ZSkgfHwKLQkJKCFpZWVlLT5wc19pc19xdWV1ZV9lbXB0eSkpewotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQlkb3duKCZpZWVlLT53eF9zZW0pOwotCi0JaWYgKHdycXUtPnBvd2VyLmRpc2FibGVkKXsKLQkJaWVlZS0+cHMgPSBJRUVFODAyMTFfUFNfRElTQUJMRUQ7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0JaWYgKHdycXUtPnBvd2VyLmZsYWdzICYgSVdfUE9XRVJfVElNRU9VVCkgewotCQlpZWVlLT5wc190aW1lb3V0ID0gd3JxdS0+cG93ZXIudmFsdWUgLyAxMDAwOwotCX0KLQotCWlmICh3cnF1LT5wb3dlci5mbGFncyAmIElXX1BPV0VSX1BFUklPRCkgewotCQlpZWVlLT5wc19wZXJpb2QgPSB3cnF1LT5wb3dlci52YWx1ZSAvIDEwMDA7Ci0JfQotCXN3aXRjaCAod3JxdS0+cG93ZXIuZmxhZ3MgJiBJV19QT1dFUl9NT0RFKSB7Ci0JY2FzZSBJV19QT1dFUl9VTklDQVNUX1I6Ci0JCWllZWUtPnBzID0gSUVFRTgwMjExX1BTX1VOSUNBU1Q7Ci0JCWJyZWFrOwotCWNhc2UgSVdfUE9XRVJfTVVMVElDQVNUX1I6Ci0JCWllZWUtPnBzID0gSUVFRTgwMjExX1BTX01CQ0FTVDsKLQkJYnJlYWs7Ci0JY2FzZSBJV19QT1dFUl9BTExfUjoKLQkJaWVlZS0+cHMgPSBJRUVFODAyMTFfUFNfVU5JQ0FTVCB8IElFRUU4MDIxMV9QU19NQkNBU1Q7Ci0JCWJyZWFrOwotCi0JY2FzZSBJV19QT1dFUl9PTjoKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGV4aXQ7Ci0KLQl9Ci1leGl0OgotCXVwKCZpZWVlLT53eF9zZW0pOwotCXJldHVybiByZXQ7Ci0KLX0KLQotLyogdGhpcyBpcyBzdG9sZW4gZnJvbSBob3N0YXAgKi8KLWludCBpZWVlODAyMTFfd3hfZ2V0X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQlpbnQgcmV0ID0wOwotCi0JZG93bigmaWVlZS0+d3hfc2VtKTsKLQotCWlmKGllZWUtPnBzID09IElFRUU4MDIxMV9QU19ESVNBQkxFRCl7Ci0JCXdycXUtPnBvd2VyLmRpc2FibGVkID0gMTsKLQkJZ290byBleGl0OwotCX0KLQotCXdycXUtPnBvd2VyLmRpc2FibGVkID0gMDsKLQotCWlmICgod3JxdS0+cG93ZXIuZmxhZ3MgJiBJV19QT1dFUl9UWVBFKSA9PSBJV19QT1dFUl9USU1FT1VUKSB7Ci0JCXdycXUtPnBvd2VyLmZsYWdzID0gSVdfUE9XRVJfVElNRU9VVDsKLQkJd3JxdS0+cG93ZXIudmFsdWUgPSBpZWVlLT5wc190aW1lb3V0ICogMTAwMDsKLQl9IGVsc2UgewotCQl3cnF1LT5wb3dlci5mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKLQkJd3JxdS0+cG93ZXIudmFsdWUgPSBpZWVlLT5wc19wZXJpb2QgKiAxMDAwOwotCX0KLQotICAgICAgIGlmICgoaWVlZS0+cHMgJiAoSUVFRTgwMjExX1BTX01CQ0FTVCB8IElFRUU4MDIxMV9QU19VTklDQVNUKSkgPT0gKElFRUU4MDIxMV9QU19NQkNBU1QgfCBJRUVFODAyMTFfUFNfVU5JQ0FTVCkpCi0JICAgCXdycXUtPnBvd2VyLmZsYWdzIHw9IElXX1BPV0VSX0FMTF9SOwotCWVsc2UgaWYgKGllZWUtPnBzICYgSUVFRTgwMjExX1BTX01CQ0FTVCkKLQkJd3JxdS0+cG93ZXIuZmxhZ3MgfD0gSVdfUE9XRVJfTVVMVElDQVNUX1I7Ci0JZWxzZQotCQl3cnF1LT5wb3dlci5mbGFncyB8PSBJV19QT1dFUl9VTklDQVNUX1I7Ci0KLWV4aXQ6Ci0JdXAoJmllZWUtPnd4X3NlbSk7Ci0JcmV0dXJuIHJldDsKLQotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI0ZGQ0OC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotICBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gIG1vcmUgZGV0YWlscy4KLQotICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQotICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KLQotICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAgZmlsZSBjYWxsZWQgTElDRU5TRS4KLQotICBDb250YWN0IEluZm9ybWF0aW9uOgotICBKYW1lcyBQLiBLZXRyZW5vcyA8aXB3MjEwMC1hZG1pbkBsaW51eC5pbnRlbC5jb20+Ci0gIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgRmV3IG1vZGlmaWNhdGlvbnMgZm9yIFJlYWx0ZWsncyBXaS1GaSBkcml2ZXJzIGJ5Ci0gIEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KLQotICBBIHNwZWNpYWwgdGhhbmtzIGdvZXMgdG8gUmVhbHRlayBmb3IgdGhlaXIgc3VwcG9ydCAhCi0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KLSNpbmNsdWRlIDxsaW51eC9pbjYuaD4KLSNpbmNsdWRlIDxsaW51eC9pbi5oPgotI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC90Y3AuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KLQotI2luY2x1ZGUgImllZWU4MDIxMS5oIgotCi0KLS8qCi0KLQotODAyLjExIERhdGEgRnJhbWUKLQotCi04MDIuMTEgZnJhbWVfY29udG9ybCBmb3IgZGF0YSBmcmFtZXMgLSAyIGJ5dGVzCi0gICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLWJpdHMgfCAwICB8ICAxICB8ICAyICB8ICAzICB8ICA0ICB8ICA1ICB8ICA2ICB8ICA3ICB8ICA4ICB8ICA5ICB8ICBhICB8ICBiICB8ICBjICB8ICBkICB8ICBlICAgfAotICAgICB8LS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLS18Ci12YWwgIHwgMCAgfCAgMCAgfCAgMCAgfCAgMSAgfCAgeCAgfCAgMCAgfCAgMCAgfCAgMCAgfCAgMSAgfCAgMCAgfCAgeCAgfCAgeCAgfCAgeCAgfCAgeCAgfCAgeCAgIHwKLSAgICAgfC0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS0tfAotZGVzYyB8IF4tdmVyLV4gIHwgIF50eXBlLV4gIHwgIF4tLS0tLXN1YnR5cGUtLS0tLV4gIHwgdG8gIHxmcm9tIHxtb3JlIHxyZXRyeXwgcHdyIHxtb3JlIHx3ZXAgICB8Ci0gICAgIHwgICAgICAgICAgfCAgICAgICAgICAgfCB4PTAgZGF0YSx4PTEgZGF0YSthY2sgfCBEUyAgfCBEUyAgfGZyYWcgfCAgICAgfCBtZ20gfGRhdGEgfCAgICAgIHwKLSAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJwotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLTgwMi4xMSBEYXRhIEZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICwtLS0tLS0tLS0gJ2N0cmwnIGV4cGFuZHMgdG8gPi0tLS0tLS0tLS0tJwotICAgICAgICAgIHwKLSAgICAgICwtLSctLS0sLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLUJ5dGVzIHwgIDIgICB8ICAyICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgMiAgIHwgMC4uMjMxMiB8ICAgNCAgfAotICAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18Ci1EZXNjLiB8IGN0cmwgfCBkdXJhIHwgIERBL1JBICB8ICAgVEEgICAgfCAgICBTQSAgIHwgU2VxdSB8ICBGcmFtZSAgfCAgZmNzIHwKLSAgICAgIHwgICAgICB8IHRpb24gfCAoQlNTSUQpIHwgICAgICAgICB8ICAgICAgICAgfCBlbmNlIHwgIGRhdGEgICB8ICAgICAgfAotICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgIHwtLS0tLS0nCi1Ub3RhbDogMjggbm9uLWRhdGEgYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgLS0tLS4tLS0tJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgLi0gJ0ZyYW1lIGRhdGEnIGV4cGFuZHMgdG8gPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKLSAgICAgICB8Ci0gICAgICAgVgotICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLUJ5dGVzIHwgIDEgICB8ICAxICAgfCAgICAxICAgIHwgICAgMyAgICAgfCAgMiAgIHwgIDAtMjMwNCB8Ci0gICAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfAotRGVzYy4gfCBTTkFQIHwgU05BUCB8IENvbnRyb2wgfEV0aCBUdW5uZWx8IFR5cGUgfCBJUCAgICAgIHwKLSAgICAgIHwgRFNBUCB8IFNTQVAgfCAgICAgICAgIHwgICAgICAgICAgfCAgICAgIHwgUGFja2V0ICB8Ci0gICAgICB8IDB4QUEgfCAweEFBIHwweDAzIChVSSl8MHgwMC0wMC1GOHwgICAgICB8ICAgICAgICAgfAotICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgIHwKLVRvdGFsOiA4IG5vbi1kYXRhIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgIGAtLS0tLi0tLS0nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAuLSAnSVAgUGFja2V0JyBleHBhbmRzLCBpZiBXRVAgZW5hYmxlZCwgdG8gPC0tJwotICAgICAgIHwKLSAgICAgICBWCi0gICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi1CeXRlcyB8ICA0ICB8ICAgMC0yMjk2ICB8ICA0ICB8Ci0gICAgICB8LS0tLS18LS0tLS0tLS0tLS18LS0tLS18Ci1EZXNjLiB8IElWICB8IEVuY3J5cHRlZCB8IElDViB8Ci0gICAgICB8ICAgICB8IElQIFBhY2tldCB8ICAgICB8Ci0gICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCi1Ub3RhbDogOCBub24tZGF0YSBieXRlcwotCi0KLTgwMi4zIEV0aGVybmV0IERhdGEgRnJhbWUKLQotICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotQnl0ZXMgfCAgIDYgICB8ICAgNiAgIHwgIDIgICB8ICBWYXJpYWJsZSB8ICAgNCAgfAotICAgICAgfC0tLS0tLS18LS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tfAotRGVzYy4gfCBEZXN0LiB8IFNvdXJjZXwgVHlwZSB8IElQIFBhY2tldCB8ICBmY3MgfAotICAgICAgfCAgTUFDICB8ICBNQUMgIHwgICAgICB8ICAgICAgICAgICB8ICAgICAgfAotICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJwotVG90YWw6IDE4IG5vbi1kYXRhIGJ5dGVzCi0KLUluIHRoZSBldmVudCB0aGF0IGZyYWdtZW50YXRpb24gaXMgcmVxdWlyZWQsIHRoZSBpbmNvbWluZyBwYXlsb2FkIGlzIHNwbGl0IGludG8KLU4gcGFydHMgb2Ygc2l6ZSBpZWVlLT5mdHMuICBUaGUgZmlyc3QgZnJhZ21lbnQgY29udGFpbnMgdGhlIFNOQVAgaGVhZGVyIGFuZCB0aGUKLXJlbWFpbmluZyBwYWNrZXRzIGFyZSBqdXN0IGRhdGEuCi0KLUlmIGVuY3J5cHRpb24gaXMgZW5hYmxlZCwgZWFjaCBmcmFnbWVudCBwYXlsb2FkIHNpemUgaXMgcmVkdWNlZCBieSBlbm91Z2ggc3BhY2UKLXRvIGFkZCB0aGUgcHJlZml4IGFuZCBwb3N0Zml4IChJViBhbmQgSUNWIHRvdGFsbGluZyA4IGJ5dGVzIGluIHRoZSBjYXNlIG9mIFdFUCkKLVNvIGlmIHlvdSBoYXZlIDE1MDAgYnl0ZXMgb2YgcGF5bG9hZCB3aXRoIGllZWUtPmZ0cyBzZXQgdG8gNTAwIHdpdGhvdXQKLWVuY3J5cHRpb24gaXQgd2lsbCB0YWtlIDMgZnJhbWVzLiAgV2l0aCBXRVAgaXQgd2lsbCB0YWtlIDQgZnJhbWVzIGFzIHRoZQotcGF5bG9hZCBvZiBlYWNoIGZyYW1lIGlzIHJlZHVjZWQgdG8gNDkyIGJ5dGVzLgotCi0qIFNLQiB2aXN1YWxpemF0aW9uCi0qCi0qICAsLSBza2ItPmRhdGEKLSogfAotKiB8ICAgIEVUSEVSTkVUIEhFQURFUiAgICAgICAgLC08LS0gUEFZTE9BRAotKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgMTQgYnl0ZXMgZnJvbSBza2ItPmRhdGEKLSogfCAgMiBieXRlcyBmb3IgVHlwZSAtLT4gLFQuIHwgICAgIChzaXplb2YgZXRoaGRyKQotKiB8ICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotKiB8LC1EZXN0Li0tLiAsLS1TcmMuLS0tLiB8IHwgfAotKiB8ICA2IGJ5dGVzfCB8IDYgYnl0ZXMgfCB8IHwgfAotKiB2ICAgICAgICAgfCB8ICAgICAgICAgfCB8IHwgfAotKiAwICAgICAgICAgfCB2ICAgICAgIDEgfCB2IHwgdiAgICAgICAgICAgMgotKiAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUKLSogICAgIF4gICAgIHwgXiAgICAgICAgIHwgXiB8Ci0qICAgICB8ICAgICB8IHwgICAgICAgICB8IHwgfAotKiAgICAgfCAgICAgfCB8ICAgICAgICAgfCBgVCcgPC0tLS0gMiBieXRlcyBmb3IgVHlwZQotKiAgICAgfCAgICAgfCB8ICAgICAgICAgfAotKiAgICAgfCAgICAgfCAnLS0tU05BUC0tJyA8LS0tLS0tLS0gNiBieXRlcyBmb3IgU05BUAotKiAgICAgfCAgICAgfAotKiAgICAgYC1JVi0tJyA8LS0tLS0tLS0tLS0tLS0tLS0tLS0gNCBieXRlcyBmb3IgSVYgKFdFUCkKLSoKLSogICAgICBTTkFQIEhFQURFUgotKgotKi8KLQotc3RhdGljIHU4IFA4MDJfMUhfT1VJW1A4MDIxMV9PVUlfTEVOXSA9IHsgMHgwMCwgMHgwMCwgMHhmOCB9Owotc3RhdGljIHU4IFJGQzEwNDJfT1VJW1A4MDIxMV9PVUlfTEVOXSA9IHsgMHgwMCwgMHgwMCwgMHgwMCB9OwotCi1zdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfcHV0X3NuYXAodTggKmRhdGEsIHUxNiBoX3Byb3RvKQotewotCXN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIgKnNuYXA7Ci0JdTggKm91aTsKLQotCXNuYXAgPSAoc3RydWN0IGllZWU4MDIxMV9zbmFwX2hkciAqKWRhdGE7Ci0Jc25hcC0+ZHNhcCA9IDB4YWE7Ci0Jc25hcC0+c3NhcCA9IDB4YWE7Ci0Jc25hcC0+Y3RybCA9IDB4MDM7Ci0KLQlpZiAoaF9wcm90byA9PSAweDgxMzcgfHwgaF9wcm90byA9PSAweDgwZjMpCi0JCW91aSA9IFA4MDJfMUhfT1VJOwotCWVsc2UKLQkJb3VpID0gUkZDMTA0Ml9PVUk7Ci0Jc25hcC0+b3VpWzBdID0gb3VpWzBdOwotCXNuYXAtPm91aVsxXSA9IG91aVsxXTsKLQlzbmFwLT5vdWlbMl0gPSBvdWlbMl07Ci0KLQkqKHUxNiAqKShkYXRhICsgU05BUF9TSVpFKSA9IGh0b25zKGhfcHJvdG8pOwotCi0JcmV0dXJuIFNOQVBfU0laRSArIHNpemVvZih1MTYpOwotfQotCi1pbnQgaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoCi0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0Jc3RydWN0IHNrX2J1ZmYgKmZyYWcsCi0JaW50IGhkcl9sZW4pCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhKiBjcnlwdCA9IGllZWUtPmNyeXB0W2llZWUtPnR4X2tleWlkeF07Ci0JaW50IHJlczsKLQotCWlmICghKGNyeXB0ICYmIGNyeXB0LT5vcHMpKQotCXsKLQkJcHJpbnRrKCI9PT09PT09PT0+JXMoKSwgY3J5cHQgaXMgbnVsbFxuIiwgX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIC0xOwotCX0KLSNpZmRlZiBDT05GSUdfSUVFRTgwMjExX0NSWVBUX1RLSVAKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyOwotCi0JaWYgKGllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzICYmCi0JICAgIGNyeXB0ICYmIGNyeXB0LT5vcHMgJiYgc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJUS0lQIikgPT0gMCkgewotCQloZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgZnJhZy0+ZGF0YTsKLQkJaWYgKG5ldF9yYXRlbGltaXQoKSkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBUS0lQIGNvdW50ZXJtZWFzdXJlczogZHJvcHBlZCAiCi0JCQkgICAgICAgIlRYIHBhY2tldCB0byAlcE1cbiIsCi0JCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lLCBoZWFkZXItPmFkZHIxKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotI2VuZGlmCi0JLyogVG8gZW5jcnlwdCwgZnJhbWUgZm9ybWF0IGlzOgotCSAqIElWICg0IGJ5dGVzKSwgY2xlYXIgcGF5bG9hZCAoaW5jbHVkaW5nIFNOQVApLCBJQ1YgKDQgYnl0ZXMpICovCi0KLQkvLyBQUjogRklYTUU6IENvcGllZCBmcm9tIGhvc3RhcC4gQ2hlY2sgZnJhZ21lbnRhdGlvbi9NU0RVL01QRFUgZW5jcnlwdGlvbi4KLQkvKiBIb3N0LWJhc2VkIElFRUUgODAyLjExIGZyYWdtZW50YXRpb24gZm9yIFRYIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLCBzbwotCSAqIGNhbGwgYm90aCBNU0RVIGFuZCBNUERVIGVuY3J5cHRpb24gZnVuY3Rpb25zIGZyb20gaGVyZS4gKi8KLQlhdG9taWNfaW5jKCZjcnlwdC0+cmVmY250KTsKLQlyZXMgPSAwOwotCWlmIChjcnlwdC0+b3BzLT5lbmNyeXB0X21zZHUpCi0JCXJlcyA9IGNyeXB0LT5vcHMtPmVuY3J5cHRfbXNkdShmcmFnLCBoZHJfbGVuLCBjcnlwdC0+cHJpdik7Ci0JaWYgKHJlcyA9PSAwICYmIGNyeXB0LT5vcHMtPmVuY3J5cHRfbXBkdSkKLQkJcmVzID0gY3J5cHQtPm9wcy0+ZW5jcnlwdF9tcGR1KGZyYWcsIGhkcl9sZW4sIGNyeXB0LT5wcml2KTsKLQotCWF0b21pY19kZWMoJmNyeXB0LT5yZWZjbnQpOwotCWlmIChyZXMgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBFbmNyeXB0aW9uIGZhaWxlZDogbGVuPSVkLlxuIiwKLQkJICAgICAgIGllZWUtPmRldi0+bmFtZSwgZnJhZy0+bGVuKTsKLQkJaWVlZS0+aWVlZV9zdGF0cy50eF9kaXNjYXJkcysrOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQotdm9pZCBpZWVlODAyMTFfdHhiX2ZyZWUoc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YikgewotCWlmICh1bmxpa2VseSghdHhiKSkKLQkJcmV0dXJuOwotCWtmcmVlKHR4Yik7Ci19Ci0KLXN0cnVjdCBpZWVlODAyMTFfdHhiICppZWVlODAyMTFfYWxsb2NfdHhiKGludCBucl9mcmFncywgaW50IHR4Yl9zaXplLAotCQkJCQkgIGludCBnZnBfbWFzaykKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4YiAqdHhiOwotCWludCBpOwotCXR4YiA9IGttYWxsb2MoCi0JCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3R4YikgKyAoc2l6ZW9mKHU4KikgKiBucl9mcmFncyksCi0JCWdmcF9tYXNrKTsKLQlpZiAoIXR4YikKLQkJcmV0dXJuIE5VTEw7Ci0KLQltZW1zZXQodHhiLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV90eGIpKTsKLQl0eGItPm5yX2ZyYWdzID0gbnJfZnJhZ3M7Ci0JdHhiLT5mcmFnX3NpemUgPSB0eGJfc2l6ZTsKLQotCWZvciAoaSA9IDA7IGkgPCBucl9mcmFnczsgaSsrKSB7Ci0JCXR4Yi0+ZnJhZ21lbnRzW2ldID0gZGV2X2FsbG9jX3NrYih0eGJfc2l6ZSk7Ci0JCWlmICh1bmxpa2VseSghdHhiLT5mcmFnbWVudHNbaV0pKSB7Ci0JCQlpLS07Ci0JCQlicmVhazsKLQkJfQotCQltZW1zZXQodHhiLT5mcmFnbWVudHNbaV0tPmNiLCAwLCBzaXplb2YodHhiLT5mcmFnbWVudHNbaV0tPmNiKSk7Ci0JfQotCWlmICh1bmxpa2VseShpICE9IG5yX2ZyYWdzKSkgewotCQl3aGlsZSAoaSA+PSAwKQotCQkJZGV2X2tmcmVlX3NrYl9hbnkodHhiLT5mcmFnbWVudHNbaS0tXSk7Ci0JCWtmcmVlKHR4Yik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlyZXR1cm4gdHhiOwotfQotCi0vLyBDbGFzc2lmeSB0aGUgdG8tYmUgc2VuZCBkYXRhIHBhY2tldAotLy8gTmVlZCB0byBhY3F1aXJlIHRoZSBzZW50IHF1ZXVlIGluZGV4Lgotc3RhdGljIGludAotaWVlZTgwMjExX2NsYXNzaWZ5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaykKLXsKLQlzdHJ1Y3QgZXRoaGRyICpldGg7Ci0Jc3RydWN0IGlwaGRyICppcDsKLQlldGggPSAoc3RydWN0IGV0aGhkciAqKXNrYi0+ZGF0YTsKLQlpZiAoZXRoLT5oX3Byb3RvICE9IGh0b25zKEVUSF9QX0lQKSkKLQkJcmV0dXJuIDA7Ci0KLQlpcCA9IGlwX2hkcihza2IpOwotCXN3aXRjaCAoaXAtPnRvcyAmIDB4ZmMpIHsKLQkJY2FzZSAweDIwOgotCQkJcmV0dXJuIDI7Ci0JCWNhc2UgMHg0MDoKLQkJCXJldHVybiAxOwotCQljYXNlIDB4NjA6Ci0JCQlyZXR1cm4gMzsKLQkJY2FzZSAweDgwOgotCQkJcmV0dXJuIDQ7Ci0JCWNhc2UgMHhhMDoKLQkJCXJldHVybiA1OwotCQljYXNlIDB4YzA6Ci0JCQlyZXR1cm4gNjsKLQkJY2FzZSAweGUwOgotCQkJcmV0dXJuIDc7Ci0JCWRlZmF1bHQ6Ci0JCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLSNkZWZpbmUgU05fTEVTUyhhLCBiKQkJKCgoYS1iKSYweDgwMCkhPTApCi12b2lkIGllZWU4MDIxMV90eF9xdWVyeV9hZ2dfY2FwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3Qgc2tfYnVmZiogc2tiLCBjYl9kZXNjKiB0Y2JfZGVzYykKLXsKLQlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOwotCVBUWF9UU19SRUNPUkQJCQlwVHhUcyA9IE5VTEw7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfMWFkZHIqIGhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8xYWRkciopc2tiLT5kYXRhOwotCi0JaWYgKCFwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydHx8IXBIVEluZm8tPmJFbmFibGVIVCkKLQkJcmV0dXJuOwotCWlmICghSXNRb1NEYXRhRnJhbWUoc2tiLT5kYXRhKSkKLQkJcmV0dXJuOwotCi0JaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpIHx8IGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpKQotCQlyZXR1cm47Ci0JLy9jaGVjayBwYWNrZXQgYW5kIG1vZGUgbGF0ZXIKLSNpZmRlZiBUT19ET19MSVNUCi0JaWYocFRjYi0+UGFja2V0TGVuZ3RoID49IDQwOTYpCi0JCXJldHVybjsKLQkvLyBGb3IgUlRMODE5WCwgaWYgcGFpcndpc2VrZXkgPSB3ZXAvdGtpcCwgd2UgZG9uJ3QgYWdncnJlZ2F0aW9uLgotCWlmKCFBZGFwdGVyLT5IYWxGdW5jLkdldE5tb2RlU3VwcG9ydEJ5U2VjQ2ZnSGFuZGxlcihBZGFwdGVyKSkKLQkJcmV0dXJuOwotI2VuZGlmCi0KLSAgICAgICAgaWYodGNiX2Rlc2MtPmJkaGNwKS8vIHx8IGllZWUtPkNudEFmdGVyTGluazwyKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLQotI2lmIDEKLQlpZiAoIWllZWUtPkdldE5tb2RlU3VwcG9ydEJ5U2VjQ2ZnKGllZWUpKQotCXsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZgotCWlmKHBIVEluZm8tPmJDdXJyZW50QU1QRFVFbmFibGUpCi0JewotCQlpZiAoIUdldFRzKGllZWUsIChQVFNfQ09NTU9OX0lORk8qKSgmcFR4VHMpLCBoZHItPmFkZHIxLCBza2ItPnByaW9yaXR5LCBUWF9ESVIsIHRydWUpKQotCQl7Ci0JCQlwcmludGsoIj09PT5jYW4ndCBnZXQgVFNcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChwVHhUcy0+VHhBZG1pdHRlZEJBUmVjb3JkLmJWYWxpZCA9PSBmYWxzZSkKLQkJewotCQkJLy9hcyBzb21lIEFQIHdpbGwgcmVmdXNlIG91ciBhY3Rpb24gZnJhbWUgdW50aWwga2V5IGhhbmRzaGFrZSBoYXMgYmVlbiBmaW5pc2hlZC4gV0IKLQkJCWlmIChpZWVlLT53cGFfaWVfbGVuICYmIChpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9PSBLRVlfVFlQRV9OQSkpCi0JCQk7Ci0JCQllbHNlCi0JCQlUc1N0YXJ0QWRkQmFQcm9jZXNzKGllZWUsIHBUeFRzKTsKLQkJCWdvdG8gRk9SQ0VEX0FHR19TRVRUSU5HOwotCQl9Ci0JCWVsc2UgaWYgKHBUeFRzLT5iVXNpbmdCYSA9PSBmYWxzZSkKLQkJewotCQkJaWYgKFNOX0xFU1MocFR4VHMtPlR4QWRtaXR0ZWRCQVJlY29yZC5CYVN0YXJ0U2VxQ3RybC5maWVsZC5TZXFOdW0sIChwVHhUcy0+VHhDdXJTZXErMSklNDA5NikpCi0JCQkJcFR4VHMtPmJVc2luZ0JhID0gdHJ1ZTsKLQkJCWVsc2UKLQkJCQlnb3RvIEZPUkNFRF9BR0dfU0VUVElORzsKLQkJfQotCi0JCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpCi0JCXsKLQkJCXRjYl9kZXNjLT5iQU1QRFVFbmFibGUgPSB0cnVlOwotCQkJdGNiX2Rlc2MtPmFtcGR1X2ZhY3RvciA9IHBIVEluZm8tPkN1cnJlbnRBTVBEVUZhY3RvcjsKLQkJCXRjYl9kZXNjLT5hbXBkdV9kZW5zaXR5ID0gcEhUSW5mby0+Q3VycmVudE1QRFVEZW5zaXR5OwotCQl9Ci0JfQotRk9SQ0VEX0FHR19TRVRUSU5HOgotCXN3aXRjaChwSFRJbmZvLT5Gb3JjZWRBTVBEVU1vZGUgKQotCXsKLQkJY2FzZSBIVF9BR0dfQVVUTzoKLQkJCWJyZWFrOwotCi0JCWNhc2UgSFRfQUdHX0ZPUkNFX0VOQUJMRToKLQkJCXRjYl9kZXNjLT5iQU1QRFVFbmFibGUgPSB0cnVlOwotCQkJdGNiX2Rlc2MtPmFtcGR1X2RlbnNpdHkgPSBwSFRJbmZvLT5Gb3JjZWRNUERVRGVuc2l0eTsKLQkJCXRjYl9kZXNjLT5hbXBkdV9mYWN0b3IgPSBwSFRJbmZvLT5Gb3JjZWRBTVBEVUZhY3RvcjsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSFRfQUdHX0ZPUkNFX0RJU0FCTEU6Ci0JCQl0Y2JfZGVzYy0+YkFNUERVRW5hYmxlID0gZmFsc2U7Ci0JCQl0Y2JfZGVzYy0+YW1wZHVfZGVuc2l0eSA9IDA7Ci0JCQl0Y2JfZGVzYy0+YW1wZHVfZmFjdG9yID0gMDsKLQkJCWJyZWFrOwotCi0JfQotCQlyZXR1cm47Ci19Ci0KLWV4dGVybiB2b2lkIGllZWU4MDIxMV9xdXJleV9TaG9ydFByZWFtYmxlTW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgY2JfZGVzYyogdGNiX2Rlc2MpCi17Ci0JdGNiX2Rlc2MtPmJVc2VTaG9ydFByZWFtYmxlID0gZmFsc2U7Ci0JaWYgKHRjYl9kZXNjLT5kYXRhX3JhdGUgPT0gMikKLQl7Ly8vLyAxTSBjYW4gb25seSB1c2UgTG9uZyBQcmVhbWJsZS4gMTFCIHNwZWMKLQkJcmV0dXJuOwotCX0KLQllbHNlIGlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSkKLQl7Ci0JCXRjYl9kZXNjLT5iVXNlU2hvcnRQcmVhbWJsZSA9IHRydWU7Ci0JfQotCXJldHVybjsKLX0KLWV4dGVybgl2b2lkCi1pZWVlODAyMTFfcXVlcnlfSFRDYXBTaG9ydEdJKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBjYl9kZXNjICp0Y2JfZGVzYykKLXsKLQlQUlRfSElHSF9USFJPVUdIUFVUCQlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKLQotCXRjYl9kZXNjLT5iVXNlU2hvcnRHSSAJCT0gZmFsc2U7Ci0KLQlpZighcEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnR8fCFwSFRJbmZvLT5iRW5hYmxlSFQpCi0JCXJldHVybjsKLQotCWlmKHBIVEluZm8tPmJGb3JjZWRTaG9ydEdJKQotCXsKLQkJdGNiX2Rlc2MtPmJVc2VTaG9ydEdJID0gdHJ1ZTsKLQkJcmV0dXJuOwotCX0KLQotCWlmKChwSFRJbmZvLT5iQ3VyQlc0ME1Iej09dHJ1ZSkgJiYgcEhUSW5mby0+YkN1clNob3J0R0k0ME1IeikKLQkJdGNiX2Rlc2MtPmJVc2VTaG9ydEdJID0gdHJ1ZTsKLQllbHNlIGlmKChwSFRJbmZvLT5iQ3VyQlc0ME1Iej09ZmFsc2UpICYmIHBIVEluZm8tPmJDdXJTaG9ydEdJMjBNSHopCi0JCXRjYl9kZXNjLT5iVXNlU2hvcnRHSSA9IHRydWU7Ci19Ci0KLXZvaWQgaWVlZTgwMjExX3F1ZXJ5X0JhbmR3aWR0aE1vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIGNiX2Rlc2MgKnRjYl9kZXNjKQotewotCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IGllZWUtPnBIVEluZm87Ci0KLQl0Y2JfZGVzYy0+YlBhY2tldEJXID0gZmFsc2U7Ci0KLQlpZighcEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnR8fCFwSFRJbmZvLT5iRW5hYmxlSFQpCi0JCXJldHVybjsKLQotCWlmKHRjYl9kZXNjLT5iTXVsdGljYXN0IHx8IHRjYl9kZXNjLT5iQnJvYWRjYXN0KQotCQlyZXR1cm47Ci0KLQlpZigodGNiX2Rlc2MtPmRhdGFfcmF0ZSAmIDB4ODApPT0wKSAvLyBJZiB1c2luZyBsZWdhY3kgcmF0ZSwgaXQgc2hhbGwgdXNlIDIwTUh6IGNoYW5uZWwuCi0JCXJldHVybjsKLQkvL0JhbmRXaWR0aEF1dG9Td2l0Y2ggaXMgZm9yIGF1dG8gc3dpdGNoIHRvIDIwIG9yIDQwIGluIGxvbmcgZGlzdGFuY2UKLQlpZihwSFRJbmZvLT5iQ3VyQlc0ME1IeiAmJiBwSFRJbmZvLT5iQ3VyVHhCVzQwTUh6ICYmICFpZWVlLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2guYmZvcmNlZF90eDIwTWh6KQotCQl0Y2JfZGVzYy0+YlBhY2tldEJXID0gdHJ1ZTsKLQlyZXR1cm47Ci19Ci0KLXZvaWQgaWVlZTgwMjExX3F1ZXJ5X3Byb3RlY3Rpb25tb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBjYl9kZXNjKiB0Y2JfZGVzYywgc3RydWN0IHNrX2J1ZmYqIHNrYikKLXsKLQkvLyBDb21tb24gU2V0dGluZ3MKLQl0Y2JfZGVzYy0+YlJUU1NUQkMJCQk9IGZhbHNlOwotCXRjYl9kZXNjLT5iUlRTVXNlU2hvcnRHSQkJPSBmYWxzZTsgLy8gU2luY2UgcHJvdGVjdGlvbiBmcmFtZXMgYXJlIGFsd2F5cyBzZW50IGJ5IGxlZ2FjeSByYXRlLCBTaG9ydEdJIHdpbGwgbmV2ZXIgYmUgdXNlZC4KLQl0Y2JfZGVzYy0+YkNUU0VuYWJsZQkJCT0gZmFsc2U7IC8vIE1vc3Qgb2YgcHJvdGVjdGlvbiB1c2luZyBSVFMvQ1RTCi0JdGNiX2Rlc2MtPlJUU1NDCQkJCT0gMDsJCS8vIDIwTUh6OiBEb24ndCBjYXJlOyAgNDBNSHo6IER1cGxpY2F0ZS4KLQl0Y2JfZGVzYy0+YlJUU0JXCQkJPSBmYWxzZTsgLy8gUlRTIGZyYW1lIGJhbmR3aWR0aCBpcyBhbHdheXMgMjBNSHoKLQotCWlmKHRjYl9kZXNjLT5iQnJvYWRjYXN0IHx8IHRjYl9kZXNjLT5iTXVsdGljYXN0KS8vb25seSB1bmljYXN0IGZyYW1lIHdpbGwgdXNlIHJ0cy9jdHMKLQkJcmV0dXJuOwotCi0JaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKHNrYi0+ZGF0YSsxNikpICAvL2NoZWNrIGFkZHIzIGFzIGluZnJhc3RydWN0dXJlIGFkZDMgaXMgREEuCi0JCXJldHVybjsKLQotCWlmIChpZWVlLT5tb2RlIDwgSUVFRV9OXzI0RykgLy9iLCBnIG1vZGUKLQl7Ci0JCQkvLyAoMSkgUlRTX1RocmVzaG9sZCBpcyBjb21wYXJlZCB0byB0aGUgTVBEVSwgbm90IE1TRFUuCi0JCQkvLyAoMikgSWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgZnJhZyBpbiAgdGhpcyBNU0RVLCBvbmx5IHRoZSBmaXJzdCBmcmFnIHVzZXMgcHJvdGVjdGlvbiBmcmFtZS4KLQkJCS8vCQlPdGhlciBmcmFnbWVudHMgYXJlIHByb3RlY3RlZCBieSBwcmV2aW91cyBmcmFnbWVudC4KLQkJCS8vCQlTbyB3ZSBvbmx5IG5lZWQgdG8gY2hlY2sgdGhlIGxlbmd0aCBvZiBmaXJzdCBmcmFnbWVudC4KLQkJaWYgKHNrYi0+bGVuID4gaWVlZS0+cnRzKQotCQl7Ci0JCQl0Y2JfZGVzYy0+YlJUU0VuYWJsZSA9IHRydWU7Ci0JCQl0Y2JfZGVzYy0+cnRzX3JhdGUgPSBNR05fMjRNOwotCQl9Ci0JCWVsc2UgaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5idXNlcHJvdGVjdGlvbikKLQkJewotCQkJLy8gVXNlIENUUy10by1TRUxGIGluIHByb3RlY3Rpb24gbW9kZS4KLQkJCXRjYl9kZXNjLT5iUlRTRW5hYmxlID0gdHJ1ZTsKLQkJCXRjYl9kZXNjLT5iQ1RTRW5hYmxlID0gdHJ1ZTsKLQkJCXRjYl9kZXNjLT5ydHNfcmF0ZSA9IE1HTl8yNE07Ci0JCX0KLQkJLy9vdGhlcndpc2UgcmV0dXJuOwotCQlyZXR1cm47Ci0JfQotCWVsc2UKLQl7Ly8gMTFuIEhpZ2ggdGhyb3VnaHB1dCBjYXNlLgotCQlQUlRfSElHSF9USFJPVUdIUFVUIHBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOwotCQl3aGlsZSAodHJ1ZSkKLQkJewotCQkJLy9jaGVjayBFUlAgcHJvdGVjdGlvbgotCQkJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5idXNlcHJvdGVjdGlvbikKLQkJCXsvLyBDVFMtdG8tU0VMRgotCQkJCXRjYl9kZXNjLT5iUlRTRW5hYmxlID0gdHJ1ZTsKLQkJCQl0Y2JfZGVzYy0+YkNUU0VuYWJsZSA9IHRydWU7Ci0JCQkJdGNiX2Rlc2MtPnJ0c19yYXRlID0gTUdOXzI0TTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCS8vY2hlY2sgSFQgb3AgbW9kZQotCQkJaWYocEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgICYmIHBIVEluZm8tPmJFbmFibGVIVCkKLQkJCXsKLQkJCQl1OCBIVE9wTW9kZSA9IHBIVEluZm8tPkN1cnJlbnRPcE1vZGU7Ci0JCQkJaWYoKHBIVEluZm8tPmJDdXJCVzQwTUh6ICYmIChIVE9wTW9kZSA9PSAyIHx8IEhUT3BNb2RlID09IDMpKSB8fAotCQkJCQkJCSghcEhUSW5mby0+YkN1ckJXNDBNSHogJiYgSFRPcE1vZGUgPT0gMykgKQotCQkJCXsKLQkJCQkJdGNiX2Rlc2MtPnJ0c19yYXRlID0gTUdOXzI0TTsgLy8gUmF0ZSBpcyAyNE1icHMuCi0JCQkJCXRjYl9kZXNjLT5iUlRTRW5hYmxlID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJLy9jaGVjayBydHMKLQkJCWlmIChza2ItPmxlbiA+IGllZWUtPnJ0cykKLQkJCXsKLQkJCQl0Y2JfZGVzYy0+cnRzX3JhdGUgPSBNR05fMjRNOyAvLyBSYXRlIGlzIDI0TWJwcy4KLQkJCQl0Y2JfZGVzYy0+YlJUU0VuYWJsZSA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvL3RvIGRvIGxpc3Q6IGNoZWNrIE1JTU8gcG93ZXIgc2F2ZSBjb25kaXRpb24uCi0JCQkvL2NoZWNrIEFNUERVIGFnZ3JlZ2F0aW9uIGZvciBUWE9QCi0JCQlpZih0Y2JfZGVzYy0+YkFNUERVRW5hYmxlKQotCQkJewotCQkJCXRjYl9kZXNjLT5ydHNfcmF0ZSA9IE1HTl8yNE07IC8vIFJhdGUgaXMgMjRNYnBzLgotCQkJCS8vIEFjY29yZGluZyB0byA4MTkwIGRlc2lnbiwgZmlybXdhcmUgc2VuZHMgQ0YtRW5kIG9ubHkgaWYgUlRTL0NUUyBpcyBlbmFibGVkLiBIb3dldmVyLCBpdCBkZWdyYWRzCi0JCQkJLy8gdGhyb3VnaHB1dCBhcm91bmQgMTBNLCBzbyB3ZSBkaXNhYmxlIG9mIHRoaXMgbWVjaGFuaXNtLiAyMDA3LjA4LjAzIGJ5IEVtaWx5Ci0JCQkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCS8vY2hlY2sgSU9UIGFjdGlvbgotCQkJaWYocEhUSW5mby0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9GT1JDRURfQ1RTMlNFTEYpCi0JCQl7Ci0JCQkJdGNiX2Rlc2MtPmJDVFNFbmFibGUJPSB0cnVlOwotCQkJCXRjYl9kZXNjLT5ydHNfcmF0ZSAgPSAJTUdOXzI0TTsKLQkJCQl0Y2JfZGVzYy0+YlJUU0VuYWJsZSA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkvLyBUb3RhbGx5IG5vIHByb3RlY3Rpb24gY2FzZSEhCi0JCQlnb3RvIE5PX1BST1RFQ1RJT047Ci0JCX0KLQkJfQotCS8vIEZvciB0ZXN0ICwgQ1RTIHJlcGxhY2Ugd2l0aCBSVFMKLQlpZiggMCApCi0JewotCQl0Y2JfZGVzYy0+YkNUU0VuYWJsZQk9IHRydWU7Ci0JCXRjYl9kZXNjLT5ydHNfcmF0ZSA9IE1HTl8yNE07Ci0JCXRjYl9kZXNjLT5iUlRTRW5hYmxlIAk9IHRydWU7Ci0JfQotCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSkKLQkJdGNiX2Rlc2MtPmJVc2VTaG9ydFByZWFtYmxlID0gdHJ1ZTsKLQlpZiAoaWVlZS0+bW9kZSA9PSBJV19NT0RFX01BU1RFUikKLQkJCWdvdG8gTk9fUFJPVEVDVElPTjsKLQlyZXR1cm47Ci1OT19QUk9URUNUSU9OOgotCXRjYl9kZXNjLT5iUlRTRW5hYmxlCT0gZmFsc2U7Ci0JdGNiX2Rlc2MtPmJDVFNFbmFibGUJPSBmYWxzZTsKLQl0Y2JfZGVzYy0+cnRzX3JhdGUJCT0gMDsKLQl0Y2JfZGVzYy0+UlRTU0MJCT0gMDsKLQl0Y2JfZGVzYy0+YlJUU0JXCQk9IGZhbHNlOwotfQotCi0KLXZvaWQgaWVlZTgwMjExX3R4cmF0ZV9zZWxlY3Rtb2RlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBjYl9kZXNjKiB0Y2JfZGVzYykKLXsKLSNpZmRlZiBUT19ET19MSVNUCi0JaWYoIUlzRGF0YUZyYW1lKHBGcmFtZSkpCi0JewotCQlwVGNiLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrID0gVFJVRTsKLQkJcFRjYi0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlID0gVFJVRTsKLQkJcFRjYi0+UkFUUkluZGV4ID0gNzsKLQkJcmV0dXJuOwotCX0KLQotCWlmKHBNZ250SW5mby0+Rm9yY2VkRGF0YVJhdGUhPSAwKQotCXsKLQkJcFRjYi0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjayA9IFRSVUU7Ci0JCXBUY2ItPmJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZSA9IFRSVUU7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYKLQlpZihpZWVlLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrKQotCQl0Y2JfZGVzYy0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjayA9IHRydWU7Ci0KLQlpZihpZWVlLT5iVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGUpCi0JCXRjYl9kZXNjLT5iVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGUgPSB0cnVlOwotCWlmKCF0Y2JfZGVzYy0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjayB8fCAhdGNiX2Rlc2MtPmJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZSkKLQl7Ci0JCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEgfHwgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQotCQkJdGNiX2Rlc2MtPlJBVFJJbmRleCA9IDA7Ci0JfQotfQotCi12b2lkIGllZWU4MDIxMV9xdWVyeV9zZXFudW0oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqaWVlZSwgc3RydWN0IHNrX2J1ZmYqIHNrYiwgdTgqIGRzdCkKLXsKLQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZHN0KSB8fCBpc19icm9hZGNhc3RfZXRoZXJfYWRkcihkc3QpKQotCQlyZXR1cm47Ci0JaWYgKElzUW9TRGF0YUZyYW1lKHNrYi0+ZGF0YSkpIC8vd2UgZGVhbCBxb3MgZGF0YSBvbmx5Ci0JewotCQlQVFhfVFNfUkVDT1JEIHBUUyA9IE5VTEw7Ci0JCWlmICghR2V0VHMoaWVlZSwgKFBUU19DT01NT05fSU5GTyopKCZwVFMpLCBkc3QsIHNrYi0+cHJpb3JpdHksIFRYX0RJUiwgdHJ1ZSkpCi0JCXsKLQkJCXJldHVybjsKLQkJfQotCQlwVFMtPlR4Q3VyU2VxID0gKHBUUy0+VHhDdXJTZXErMSklNDA5NjsKLQl9Ci19Ci0KLWludCBpZWVlODAyMTFfcnRsX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IGllZWU4MDIxMV90eGIgKnR4YiA9IE5VTEw7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJxb3MgKmZyYWdfaGRyOwotCWludCBpLCBieXRlc19wZXJfZnJhZywgbnJfZnJhZ3MsIGJ5dGVzX2xhc3RfZnJhZywgZnJhZ19zaXplOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmllZWUtPnN0YXRzOwotCWludCBldGhlcl90eXBlID0gMCwgZW5jcnlwdDsKLQlpbnQgYnl0ZXMsIGZjLCBxb3NfY3RsID0gMCwgaGRyX2xlbjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2ZyYWc7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHJxb3MgaGVhZGVyID0geyAvKiBFbnN1cmUgemVybyBpbml0aWFsaXplZCAqLwotCQkuZHVyYXRpb25faWQgPSAwLAotCQkuc2VxX2N0bCA9IDAsCi0JCS5xb3NfY3RsID0gMAotCX07Ci0JdTggZGVzdFtFVEhfQUxFTl0sIHNyY1tFVEhfQUxFTl07Ci0JaW50IHFvc19hY3RpdmVkID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZTsKLQotCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSogY3J5cHQ7Ci0JYm9vbCAgICBiZGhjcCA9ZmFsc2U7Ci0KLQljYl9kZXNjICp0Y2JfZGVzYzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBJZiB0aGVyZSBpcyBubyBkcml2ZXIgaGFuZGxlciB0byB0YWtlIHRoZSBUWEIsIGRvbnQnIGJvdGhlcgotCSAqIGNyZWF0aW5nIGl0Li4uICovCi0JaWYgKCghaWVlZS0+aGFyZF9zdGFydF94bWl0ICYmICEoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19UWF9RVUVVRSkpfHwKLQkgICAoKCFpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0ICYmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFKSkpKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBObyB4bWl0IGhhbmRsZXIuXG4iLAotCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lKTsKLQkJZ290byBzdWNjZXNzOwotCX0KLQotCi0JaWYobGlrZWx5KGllZWUtPnJhd190eCA9PSAwKSl7Ci0JCWlmICh1bmxpa2VseShza2ItPmxlbiA8IFNOQVBfU0laRSArIHNpemVvZih1MTYpKSkgewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNrYiB0b28gc21hbGwgKCVkKS5cbiIsCi0JCQlpZWVlLT5kZXYtPm5hbWUsIHNrYi0+bGVuKTsKLQkJCWdvdG8gc3VjY2VzczsKLQkJfQotCi0JCW1lbXNldChza2ItPmNiLCAwLCBzaXplb2Yoc2tiLT5jYikpOwotCQlldGhlcl90eXBlID0gbnRvaHMoKChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhKS0+aF9wcm90byk7Ci0KLQkJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZWVlLT50eF9rZXlpZHhdOwotCi0JCWVuY3J5cHQgPSAhKGV0aGVyX3R5cGUgPT0gRVRIX1BfUEFFICYmIGllZWUtPmllZWU4MDJfMXgpICYmCi0JCQlpZWVlLT5ob3N0X2VuY3J5cHQgJiYgY3J5cHQgJiYgY3J5cHQtPm9wczsKLQotCQlpZiAoIWVuY3J5cHQgJiYgaWVlZS0+aWVlZTgwMl8xeCAmJgotCQlpZWVlLT5kcm9wX3VuZW5jcnlwdGVkICYmIGV0aGVyX3R5cGUgIT0gRVRIX1BfUEFFKSB7Ci0JCQlzdGF0cy0+dHhfZHJvcHBlZCsrOwotCQkJZ290byBzdWNjZXNzOwotCQl9Ci0JI2lmZGVmIENPTkZJR19JRUVFODAyMTFfREVCVUcKLQkJaWYgKGNyeXB0ICYmICFlbmNyeXB0ICYmIGV0aGVyX3R5cGUgPT0gRVRIX1BfUEFFKSB7Ci0JCQlzdHJ1Y3QgZWFwb2wgKmVhcCA9IChzdHJ1Y3QgZWFwb2wgKikoc2tiLT5kYXRhICsKLQkJCQlzaXplb2Yoc3RydWN0IGV0aGhkcikgLSBTTkFQX1NJWkUgLSBzaXplb2YodTE2KSk7Ci0JCQlJRUVFODAyMTFfREVCVUdfRUFQKCJUWDogSUVFRSA4MDIuMTEgRUFQT0wgZnJhbWU6ICVzXG4iLAotCQkJCWVhcF9nZXRfdHlwZShlYXAtPnR5cGUpKTsKLQkJfQotCSNlbmRpZgotCi0JCS8vIFRoZSBmb2xsb3dpbmcgaXMgZm9yIERIQ1AgYW5kIEFSUCBwYWNrZXQsIHdlIHVzZSBjY2sxTSB0byB0eCB0aGVzZSBwYWNrZXRzIGFuZCBsZXQgTFBTIGF3YWtlIHNvbWUgdGltZQotCQkvLyB0byBwcmV2ZW50IERIQ1AgcHJvdG9jb2wgZmFpbAotCQlpZiAoc2tiLT5sZW4gPiAyODIpey8vTUlOSU1VTV9ESENQX1BBQ0tFVF9TSVpFKSB7Ci0JCQlpZiAoRVRIX1BfSVAgPT0gZXRoZXJfdHlwZSkgey8vIElQIGhlYWRlcgotCQkJCWNvbnN0IHN0cnVjdCBpcGhkciAqaXAgPSAoc3RydWN0IGlwaGRyICopKCh1OCAqKXNrYi0+ZGF0YSsxNCk7Ci0JCQkJaWYgKElQUFJPVE9fVURQID09IGlwLT5wcm90b2NvbCkgey8vRklYTUUgd2luZG93cyBpcyAxMSBidXQgaGVyZSBVRFAgaW4gbGludXgga2VybmVsIGlzIDE3LgotCQkJCQlzdHJ1Y3QgdWRwaGRyICp1ZHAgPSAoc3RydWN0IHVkcGhkciAqKSgodTggKilpcCArIChpcC0+aWhsIDw8IDIpKTsKLQkJCQkJaWYoKCgoKHU4ICopdWRwKVsxXSA9PSA2OCkgJiYgKCgodTggKil1ZHApWzNdID09IDY3KSkgfHwKLQkJCQkJCQkoKCgodTggKil1ZHApWzFdID09IDY3KSAmJiAoKCh1OCAqKXVkcClbM10gPT0gNjgpKSkgewotCQkJCQkJLy8gNjggOiBVRFAgQk9PVFAgY2xpZW50Ci0JCQkJCQkvLyA2NyA6IFVEUCBCT09UUCBzZXJ2ZXIKLQkJCQkJCXByaW50aygiREhDUCBwa3Qgc3JjIHBvcnQ6JWQsIGRlc3QgcG9ydDolZCEhXG4iLCAoKHU4ICopdWRwKVsxXSwoKHU4ICopdWRwKVszXSk7Ci0KLQkJCQkJCWJkaGNwID0gdHJ1ZTsKLSNpZmRlZiBfUlRMODE5Ml9FWFRfUEFUQ0hfCi0JCQkJCQlpZWVlLT5MUFNEZWxheUNudCA9IDEwMDsvL3BQU0MtPkxQU0F3YWtlSW50dmwqMjsgLy9BTVksMDkwNzAxCi0jZWxzZQotCQkJCQkJaWVlZS0+TFBTRGVsYXlDbnQgPSAxMDA7Ly9wUFNDLT5MUFNBd2FrZUludHZsKjI7Ci0jZW5kaWYKLQkJCQkJfQotCQkJCX0KLQkJCQl9ZWxzZSBpZihFVEhfUF9BUlAgPT0gZXRoZXJfdHlwZSl7Ly8gSVAgQVJQIHBhY2tldAotCQkJCQlwcmludGsoIj09PT09PT09PT09PT09PT09PkRIQ1AgUHJvdG9jb2wgc3RhcnQgdHggQVJQIHBrdCEhXG4iKTsKLQkJCQkJYmRoY3AgPSB0cnVlOwotCQkJCQlpZWVlLT5MUFNEZWxheUNudCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay50aW0udGltX2NvdW50OwotCi0JCQkJfQotCQkJfQotCi0JCS8qIFNhdmUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgKi8KLQkJbWVtY3B5KCZkZXN0LCBza2ItPmRhdGEsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KCZzcmMsIHNrYi0+ZGF0YStFVEhfQUxFTiwgRVRIX0FMRU4pOwotCi0gICAgICAgICAgICAgICAgLyogQWR2YW5jZSB0aGUgU0tCIHRvIHRoZSBzdGFydCBvZiB0aGUgcGF5bG9hZCAqLwotICAgICAgICAgICAgICAgIHNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKLQotICAgICAgICAgICAgICAgIC8qIERldGVybWluZSB0b3RhbCBhbW91bnQgb2Ygc3RvcmFnZSByZXF1aXJlZCBmb3IgVFhCIHBhY2tldHMgKi8KLSAgICAgICAgICAgICAgICBieXRlcyA9IHNrYi0+bGVuICsgU05BUF9TSVpFICsgc2l6ZW9mKHUxNik7Ci0KLQkJaWYgKGVuY3J5cHQpCi0JCQlmYyA9IElFRUU4MDIxMV9GVFlQRV9EQVRBIHwgSUVFRTgwMjExX0ZDVExfV0VQOwotCQllbHNlCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZjID0gSUVFRTgwMjExX0ZUWVBFX0RBVEE7Ci0KLQkJaWYocW9zX2FjdGl2ZWQpCi0JCQlmYyB8PSBJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEE7Ci0JCWVsc2UKLQkJCWZjIHw9IElFRUU4MDIxMV9TVFlQRV9EQVRBOwotCi0JCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpIHsKLQkJCWZjIHw9IElFRUU4MDIxMV9GQ1RMX1RPRFM7Ci0JCQkvKiBUbyBEUzogQWRkcjEgPSBCU1NJRCwgQWRkcjIgPSBTQSwKLQkJCUFkZHIzID0gREEgKi8KLQkJCW1lbWNweSgmaGVhZGVyLmFkZHIxLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKLQkJCW1lbWNweSgmaGVhZGVyLmFkZHIyLCAmc3JjLCBFVEhfQUxFTik7Ci0JCQltZW1jcHkoJmhlYWRlci5hZGRyMywgJmRlc3QsIEVUSF9BTEVOKTsKLQkJfSBlbHNlIGlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKLQkJCS8qIG5vdCBGcm9tL1RvIERTOiBBZGRyMSA9IERBLCBBZGRyMiA9IFNBLAotCQkJQWRkcjMgPSBCU1NJRCAqLwotCQkJbWVtY3B5KCZoZWFkZXIuYWRkcjEsIGRlc3QsIEVUSF9BTEVOKTsKLQkJCW1lbWNweSgmaGVhZGVyLmFkZHIyLCBzcmMsIEVUSF9BTEVOKTsKLQkJCW1lbWNweSgmaGVhZGVyLmFkZHIzLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKLQkJfQotCi0gICAgICAgICAgICAgICAgaGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KGZjKTsKLQotCQkvKiBEZXRlcm1pbmUgZnJhZ21lbnRhdGlvbiBzaXplIGJhc2VkIG9uIGRlc3RpbmF0aW9uIChtdWx0aWNhc3QKLQkJKiBhbmQgYnJvYWRjYXN0IGFyZSBub3QgZnJhZ21lbnRlZCkgKi8KLQkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhlYWRlci5hZGRyMSkgfHwKLQkJaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaGVhZGVyLmFkZHIxKSkgewotCQkJZnJhZ19zaXplID0gTUFYX0ZSQUdfVEhSRVNIT0xEOwotCQkJcW9zX2N0bCB8PSBRT1NfQ1RMX05PVENPTlRBSU5fQUNLOwotCQl9Ci0JCWVsc2UgewotCQkJZnJhZ19zaXplID0gaWVlZS0+ZnRzOy8vZGVmYXVsdDozOTIKLQkJCXFvc19jdGwgPSAwOwotCQl9Ci0KLQkJaWYocW9zX2FjdGl2ZWQpCi0JCXsKLQkJCWhkcl9sZW4gPSBJRUVFODAyMTFfM0FERFJfTEVOICsgMjsKLQotCQkJc2tiLT5wcmlvcml0eSA9IGllZWU4MDIxMV9jbGFzc2lmeShza2IsICZpZWVlLT5jdXJyZW50X25ldHdvcmspOwotCQkJcW9zX2N0bCB8PSBza2ItPnByaW9yaXR5OyAvL3NldCBpbiB0aGUgaWVlZTgwMjExX2NsYXNzaWZ5Ci0JCQloZWFkZXIucW9zX2N0bCA9IGNwdV90b19sZTE2KHFvc19jdGwgJiBJRUVFODAyMTFfUU9TX1RJRCk7Ci0JCX0gZWxzZSB7Ci0JCQloZHJfbGVuID0gSUVFRTgwMjExXzNBRERSX0xFTjsKLQkJfQotCQkvKiBEZXRlcm1pbmUgYW1vdW50IG9mIHBheWxvYWQgcGVyIGZyYWdtZW50LiAgUmVnYXJkbGVzcyBvZiBpZgotCQkqIHRoaXMgc3RhY2sgaXMgcHJvdmlkaW5nIHRoZSBmdWxsIDgwMi4xMSBoZWFkZXIsIG9uZSB3aWxsCi0JCSogZXZlbnR1YWxseSBiZSBhZmZpeGVkIHRvIHRoaXMgZnJhZ21lbnQgLS0gc28gd2UgbXVzdCBhY2NvdW50IGZvcgotCQkqIGl0IHdoZW4gZGV0ZXJtaW5pbmcgdGhlIGFtb3VudCBvZiBwYXlsb2FkIHNwYWNlLiAqLwotCQlieXRlc19wZXJfZnJhZyA9IGZyYWdfc2l6ZSAtIGhkcl9sZW47Ci0JCWlmIChpZWVlLT5jb25maWcgJgotCQkoQ0ZHX0lFRUU4MDIxMV9DT01QVVRFX0ZDUyB8IENGR19JRUVFODAyMTFfUkVTRVJWRV9GQ1MpKQotCQkJYnl0ZXNfcGVyX2ZyYWcgLT0gSUVFRTgwMjExX0ZDU19MRU47Ci0KLQkJLyogRWFjaCBmcmFnbWVudCBtYXkgbmVlZCB0byBoYXZlIHJvb20gZm9yIGVuY3J5cHRpb24gcHJlL3Bvc3RmaXggKi8KLQkJaWYgKGVuY3J5cHQpCi0JCQlieXRlc19wZXJfZnJhZyAtPSBjcnlwdC0+b3BzLT5leHRyYV9wcmVmaXhfbGVuICsKLQkJCQljcnlwdC0+b3BzLT5leHRyYV9wb3N0Zml4X2xlbjsKLQotCQkvKiBOdW1iZXIgb2YgZnJhZ21lbnRzIGlzIHRoZSB0b3RhbCBieXRlc19wZXJfZnJhZyAvCi0JCSogcGF5bG9hZF9wZXJfZnJhZ21lbnQgKi8KLQkJbnJfZnJhZ3MgPSBieXRlcyAvIGJ5dGVzX3Blcl9mcmFnOwotCQlieXRlc19sYXN0X2ZyYWcgPSBieXRlcyAlIGJ5dGVzX3Blcl9mcmFnOwotCQlpZiAoYnl0ZXNfbGFzdF9mcmFnKQotCQkJbnJfZnJhZ3MrKzsKLQkJZWxzZQotCQkJYnl0ZXNfbGFzdF9mcmFnID0gYnl0ZXNfcGVyX2ZyYWc7Ci0KLQkJLyogV2hlbiB3ZSBhbGxvY2F0ZSB0aGUgVFhCIHdlIGFsbG9jYXRlIGVub3VnaCBzcGFjZSBmb3IgdGhlIHJlc2VydmUKLQkJKiBhbmQgZnVsbCBmcmFnbWVudCBieXRlcyAoYnl0ZXNfcGVyX2ZyYWcgZG9lc24ndCBpbmNsdWRlIHByZWZpeCwKLQkJKiBwb3N0Zml4LCBoZWFkZXIsIEZDUywgZXRjLikgKi8KLQkJdHhiID0gaWVlZTgwMjExX2FsbG9jX3R4Yihucl9mcmFncywgZnJhZ19zaXplICsgaWVlZS0+dHhfaGVhZHJvb20sIEdGUF9BVE9NSUMpOwotCQlpZiAodW5saWtlbHkoIXR4YikpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgVFhCXG4iLAotCQkJaWVlZS0+ZGV2LT5uYW1lKTsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0JCXR4Yi0+ZW5jcnlwdGVkID0gZW5jcnlwdDsKLQkJdHhiLT5wYXlsb2FkX3NpemUgPSBieXRlczsKLQotCQlpZihxb3NfYWN0aXZlZCkKLQkJewotCQkJdHhiLT5xdWV1ZV9pbmRleCA9IFVQMkFDKHNrYi0+cHJpb3JpdHkpOwotCQl9IGVsc2UgewotCQkJdHhiLT5xdWV1ZV9pbmRleCA9IFdNRV9BQ19CSzsKLQkJfQotCi0KLQotCQlmb3IgKGkgPSAwOyBpIDwgbnJfZnJhZ3M7IGkrKykgewotCQkJc2tiX2ZyYWcgPSB0eGItPmZyYWdtZW50c1tpXTsKLQkJCXRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiX2ZyYWctPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOwotCQkJaWYocW9zX2FjdGl2ZWQpewotCQkJCXNrYl9mcmFnLT5wcmlvcml0eSA9IHNrYi0+cHJpb3JpdHk7Ly9VUDJBQyhza2ItPnByaW9yaXR5KTsKLQkJCQl0Y2JfZGVzYy0+cXVldWVfaW5kZXggPSAgVVAyQUMoc2tiLT5wcmlvcml0eSk7Ci0JCQl9IGVsc2UgewotCQkJCXNrYl9mcmFnLT5wcmlvcml0eSA9IFdNRV9BQ19CSzsKLQkJCQl0Y2JfZGVzYy0+cXVldWVfaW5kZXggPSBXTUVfQUNfQks7Ci0JCQl9Ci0JCQlza2JfcmVzZXJ2ZShza2JfZnJhZywgaWVlZS0+dHhfaGVhZHJvb20pOwotCi0JCQlpZiAoZW5jcnlwdCl7Ci0JCQkJaWYgKGllZWUtPmh3c2VjX2FjdGl2ZSkKLQkJCQkJdGNiX2Rlc2MtPmJId1NlYyA9IDE7Ci0JCQkJZWxzZQotCQkJCQl0Y2JfZGVzYy0+Ykh3U2VjID0gMDsKLQkJCQlza2JfcmVzZXJ2ZShza2JfZnJhZywgY3J5cHQtPm9wcy0+ZXh0cmFfcHJlZml4X2xlbik7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJdGNiX2Rlc2MtPmJId1NlYyA9IDA7Ci0JCQl9Ci0JCQlmcmFnX2hkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcnFvcyAqKXNrYl9wdXQoc2tiX2ZyYWcsIGhkcl9sZW4pOwotCQkJbWVtY3B5KGZyYWdfaGRyLCAmaGVhZGVyLCBoZHJfbGVuKTsKLQotCQkJLyogSWYgdGhpcyBpcyBub3QgdGhlIGxhc3QgZnJhZ21lbnQsIHRoZW4gYWRkIHRoZSBNT1JFRlJBR1MKLQkJCSogYml0IHRvIHRoZSBmcmFtZSBjb250cm9sICovCi0JCQlpZiAoaSAhPSBucl9mcmFncyAtIDEpIHsKLQkJCQlmcmFnX2hkci0+ZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoCi0JCQkJCWZjIHwgSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKTsKLQkJCQlieXRlcyA9IGJ5dGVzX3Blcl9mcmFnOwotCi0JCQl9IGVsc2UgewotCQkJCS8qIFRoZSBsYXN0IGZyYWdtZW50IHRha2VzIHRoZSByZW1haW5pbmcgbGVuZ3RoICovCi0JCQkJYnl0ZXMgPSBieXRlc19sYXN0X2ZyYWc7Ci0JCQl9Ci0KLQkJCWlmKHFvc19hY3RpdmVkKQotCQkJewotCQkJCS8vIGFkZCAxIG9ubHkgaW5kaWNhdGUgdG8gY29ycmVzcG9uZGluZyBzZXEgbnVtYmVyIGNvbnRyb2wgMjAwNi83LzEyCi0JCQkJZnJhZ19oZHItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFtVUDJBQyhza2ItPnByaW9yaXR5KSsxXTw8NCB8IGkpOwotCQkJfSBlbHNlIHsKLQkJCQlmcmFnX2hkci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdPDw0IHwgaSk7Ci0JCQl9Ci0KLQkJCS8qIFB1dCBhIFNOQVAgaGVhZGVyIG9uIHRoZSBmaXJzdCBmcmFnbWVudCAqLwotCQkJaWYgKGkgPT0gMCkgewotCQkJCWllZWU4MDIxMV9wdXRfc25hcCgKLQkJCQkJc2tiX3B1dChza2JfZnJhZywgU05BUF9TSVpFICsgc2l6ZW9mKHUxNikpLAotCQkJCQlldGhlcl90eXBlKTsKLQkJCQlieXRlcyAtPSBTTkFQX1NJWkUgKyBzaXplb2YodTE2KTsKLQkJCX0KLQotCQkJbWVtY3B5KHNrYl9wdXQoc2tiX2ZyYWcsIGJ5dGVzKSwgc2tiLT5kYXRhLCBieXRlcyk7Ci0KLQkJCS8qIEFkdmFuY2UgdGhlIFNLQi4uLiAqLwotCQkJc2tiX3B1bGwoc2tiLCBieXRlcyk7Ci0KLQkJCS8qIEVuY3J5cHRpb24gcm91dGluZSB3aWxsIG1vdmUgdGhlIGhlYWRlciBmb3J3YXJkIGluIG9yZGVyCi0JCQkqIHRvIGluc2VydCB0aGUgSVYgYmV0d2VlbiB0aGUgaGVhZGVyIGFuZCB0aGUgcGF5bG9hZCAqLwotCQkJaWYgKGVuY3J5cHQpCi0JCQkJaWVlZTgwMjExX2VuY3J5cHRfZnJhZ21lbnQoaWVlZSwgc2tiX2ZyYWcsIGhkcl9sZW4pOwotCQkJaWYgKGllZWUtPmNvbmZpZyAmCi0JCQkoQ0ZHX0lFRUU4MDIxMV9DT01QVVRFX0ZDUyB8IENGR19JRUVFODAyMTFfUkVTRVJWRV9GQ1MpKQotCQkJCXNrYl9wdXQoc2tiX2ZyYWcsIDQpOwotCQl9Ci0KLQkJaWYocW9zX2FjdGl2ZWQpCi0JCXsKLQkJICBpZiAoaWVlZS0+c2VxX2N0cmxbVVAyQUMoc2tiLT5wcmlvcml0eSkgKyAxXSA9PSAweEZGRikKLQkJCWllZWUtPnNlcV9jdHJsW1VQMkFDKHNrYi0+cHJpb3JpdHkpICsgMV0gPSAwOwotCQkgIGVsc2UKLQkJCWllZWUtPnNlcV9jdHJsW1VQMkFDKHNrYi0+cHJpb3JpdHkpICsgMV0rKzsKLQkJfSBlbHNlIHsKLSAgCQkgIGlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKLQkJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKLQkJICBlbHNlCi0JCQlpZWVlLT5zZXFfY3RybFswXSsrOwotCQl9Ci0JfWVsc2V7Ci0JCWlmICh1bmxpa2VseShza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc2tiIHRvbyBzbWFsbCAoJWQpLlxuIiwKLQkJCWllZWUtPmRldi0+bmFtZSwgc2tiLT5sZW4pOwotCQkJZ290byBzdWNjZXNzOwotCQl9Ci0KLQkJdHhiID0gaWVlZTgwMjExX2FsbG9jX3R4YigxLCBza2ItPmxlbiwgR0ZQX0FUT01JQyk7Ci0JCWlmKCF0eGIpewotCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBUWEJcbiIsCi0JCQlpZWVlLT5kZXYtPm5hbWUpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCQl0eGItPmVuY3J5cHRlZCA9IDA7Ci0JCXR4Yi0+cGF5bG9hZF9zaXplID0gc2tiLT5sZW47Ci0JCW1lbWNweShza2JfcHV0KHR4Yi0+ZnJhZ21lbnRzWzBdLHNrYi0+bGVuKSwgc2tiLT5kYXRhLCBza2ItPmxlbik7Ci0JfQotCi0gc3VjY2VzczoKLS8vV0IgYWRkIHRvIGZpbGwgZGF0YSB0Y2JfZGVzYyBoZXJlLiBvbmx5IGZpcnN0IGZyYWdtZW50IGlzIGNvbnNpZGVyZWQsIG5lZWQgdG8gY2hhbmdlLCBhbmQgeW91IG1heSByZW1vdmUgdG8gb3RoZXIgcGxhY2UuCi0JaWYgKHR4YikKLQl7Ci0JCWNiX2Rlc2MgKnRjYl9kZXNjID0gKGNiX2Rlc2MgKikodHhiLT5mcmFnbWVudHNbMF0tPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOwotCQl0Y2JfZGVzYy0+YlR4RW5hYmxlRndDYWxjRHVyID0gMTsKLQkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhlYWRlci5hZGRyMSkpCi0JCQl0Y2JfZGVzYy0+Yk11bHRpY2FzdCA9IDE7Ci0JCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihoZWFkZXIuYWRkcjEpKQotCQkJdGNiX2Rlc2MtPmJCcm9hZGNhc3QgPSAxOwotCQlpZWVlODAyMTFfdHhyYXRlX3NlbGVjdG1vZGUoaWVlZSwgdGNiX2Rlc2MpOwotCQlpZiAoIHRjYl9kZXNjLT5iTXVsdGljYXN0IHx8ICB0Y2JfZGVzYy0+YkJyb2FkY2FzdCkKLQkJCXRjYl9kZXNjLT5kYXRhX3JhdGUgPSBpZWVlLT5iYXNpY19yYXRlOwotCQllbHNlCi0JCQl0Y2JfZGVzYy0+ZGF0YV9yYXRlID0gQ1VSUkVOVF9SQVRFKGllZWUtPm1vZGUsIGllZWUtPnJhdGUsIGllZWUtPkhUQ3VycmVudE9wZXJhUmF0ZSk7Ci0KLQkJaWYoYmRoY3AgPT0gdHJ1ZSl7Ci0JCQkJdGNiX2Rlc2MtPmRhdGFfcmF0ZSA9IE1HTl8xTTsKLQkJCQl0Y2JfZGVzYy0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjayA9IDE7Ci0KLQkJCXRjYl9kZXNjLT5SQVRSSW5kZXggPSA3OwotCQkJdGNiX2Rlc2MtPmJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZSA9IDE7Ci0JCQl0Y2JfZGVzYy0+YmRoY3AgPSAxOwotCQl9Ci0KLQotCQlpZWVlODAyMTFfcXVyZXlfU2hvcnRQcmVhbWJsZU1vZGUoaWVlZSwgdGNiX2Rlc2MpOwotCQlpZWVlODAyMTFfdHhfcXVlcnlfYWdnX2NhcChpZWVlLCB0eGItPmZyYWdtZW50c1swXSwgdGNiX2Rlc2MpOwotCQlpZWVlODAyMTFfcXVlcnlfSFRDYXBTaG9ydEdJKGllZWUsIHRjYl9kZXNjKTsKLQkJaWVlZTgwMjExX3F1ZXJ5X0JhbmR3aWR0aE1vZGUoaWVlZSwgdGNiX2Rlc2MpOwotCQlpZWVlODAyMTFfcXVlcnlfcHJvdGVjdGlvbm1vZGUoaWVlZSwgdGNiX2Rlc2MsIHR4Yi0+ZnJhZ21lbnRzWzBdKTsKLQkJaWVlZTgwMjExX3F1ZXJ5X3NlcW51bShpZWVlLCB0eGItPmZyYWdtZW50c1swXSwgaGVhZGVyLmFkZHIxKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwotCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JaWYgKHR4YikgewotCQlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19UWF9RVUVVRSl7Ci0JCQlpZWVlODAyMTFfc29mdG1hY194bWl0KHR4YiwgaWVlZSk7Ci0JCX1lbHNlewotCQkJaWYgKCgqaWVlZS0+aGFyZF9zdGFydF94bWl0KSh0eGIsIGllZWUpID09IDApIHsKLQkJCQlzdGF0cy0+dHhfcGFja2V0cysrOwotCQkJCXN0YXRzLT50eF9ieXRlcyArPSB0eGItPnBheWxvYWRfc2l6ZTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KLQkJCWllZWU4MDIxMV90eGJfZnJlZSh0eGIpOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLSBmYWlsZWQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwotCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQlzdGF0cy0+dHhfZXJyb3JzKys7Ci0JcmV0dXJuIDE7Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX3d4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MzBkOWIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfd3guYworKysgL2Rldi9udWxsCkBAIC0xLDg3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgQ29weXJpZ2h0KGMpIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0KLSAgUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBiYXNlZCBvbiB0aGUgV0VQIGVuYWJsZW1lbnQgY29kZSBwcm92aWRlZCBieSB0aGUKLSAgSG9zdCBBUCBwcm9qZWN0IGhvc3RhcC1kcml2ZXJzIHYwLjEuMwotICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KLSAgPGprbWFsaW5lQGNjLmh1dC5maT4KLSAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KLQotICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAgbW9yZSBkZXRhaWxzLgotCi0gIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5Ci0gIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotCi0gIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICBmaWxlIGNhbGxlZCBMSUNFTlNFLgotCi0gIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gIEphbWVzIFAuIEtldHJlbm9zIDxpcHcyMTAwLWFkbWluQGxpbnV4LmludGVsLmNvbT4KLSAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8bGludXgva21vZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQotI2luY2x1ZGUgImllZWU4MDIxMS5oIgotCi1zdHJ1Y3QgbW9kZXNfdW5pdCB7Ci0JY2hhciAqbW9kZV9zdHJpbmc7Ci0JaW50IG1vZGVfc2l6ZTsKLX07Ci1zdHJ1Y3QgbW9kZXNfdW5pdCBpZWVlODAyMTFfbW9kZXNbXSA9IHsKLQl7ImEiLDF9LAotCXsiYiIsMX0sCi0JeyJnIiwxfSwKLQl7Ij8iLDF9LAotCXsiTi0yNEciLDV9LAotCXsiTi01RyIsNH0sCi19OwotCi0jZGVmaW5lIGl3ZV9zdHJlYW1fYWRkX2V2ZW50X3JzbCBpd2Vfc3RyZWFtX2FkZF9ldmVudAotCi0jZGVmaW5lIE1BWF9DVVNUT01fTEVOIDY0Ci1zdGF0aWMgaW5saW5lIGNoYXIgKnJ0bDgxOXhfdHJhbnNsYXRlX3NjYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0gCQkJCQkgICBjaGFyICpzdGFydCwgY2hhciAqc3RvcCwKLQkJCQkJICAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8pCi17Ci0JY2hhciBjdXN0b21bTUFYX0NVU1RPTV9MRU5dOwotCWNoYXIgcHJvdG9fbmFtZVtJRk5BTVNJWl07Ci0JY2hhciAqcG5hbWUgPSBwcm90b19uYW1lOwotCWNoYXIgKnA7Ci0Jc3RydWN0IGl3X2V2ZW50IGl3ZTsKLQlpbnQgaSwgajsKLQl1MTYgbWF4X3JhdGUsIHJhdGU7Ci0Jc3RhdGljIHU4CUVXQzExTkhUQ2FwW10gPSB7MHgwMCwgMHg5MCwgMHg0YywgMHgzM307Ci0KLQkvKiBGaXJzdCBlbnRyeSAqTVVTVCogYmUgdGhlIEFQIE1BQyBhZGRyZXNzICovCi0JaXdlLmNtZCA9IFNJT0NHSVdBUDsKLQlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCBuZXR3b3JrLT5ic3NpZCwgRVRIX0FMRU4pOwotCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnRfcnNsKGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9BRERSX0xFTik7Ci0JLyogUmVtYWluaW5nIGVudHJpZXMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIG9yZGVyIHdlIHByb3ZpZGUgdGhlbSAqLwotCi0JLyogQWRkIHRoZSBFU1NJRCAqLwotCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7Ci0JaXdlLnUuZGF0YS5mbGFncyA9IDE7Ci0vLwlpZiAobmV0d29yay0+ZmxhZ3MgJiBORVRXT1JLX0VNUFRZX0VTU0lEKSB7Ci0JaWYgKG5ldHdvcmstPnNzaWRfbGVuID09IDApIHsKLQkJaXdlLnUuZGF0YS5sZW5ndGggPSBzaXplb2YoIjxoaWRkZW4+Iik7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgIjxoaWRkZW4+Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0JCWl3ZS51LmRhdGEubGVuZ3RoID0gbWluKG5ldHdvcmstPnNzaWRfbGVuLCAodTgpMzIpOwotICAgICAgICAgICAgICAgIHN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIG5ldHdvcmstPnNzaWQpOwotICAgICAgICB9Ci0JLyogQWRkIHRoZSBwcm90b2NvbCBuYW1lICovCi0JaXdlLmNtZCA9IFNJT0NHSVdOQU1FOwotCWZvcihpPTA7IGk8QVJSQVlfU0laRShpZWVlODAyMTFfbW9kZXMpOyBpKyspIHsKLQkJaWYobmV0d29yay0+bW9kZSYoMTw8aSkpIHsKLQkJCXNwcmludGYocG5hbWUsaWVlZTgwMjExX21vZGVzW2ldLm1vZGVfc3RyaW5nLGllZWU4MDIxMV9tb2Rlc1tpXS5tb2RlX3NpemUpOwotCQkJcG5hbWUgKz1pZWVlODAyMTFfbW9kZXNbaV0ubW9kZV9zaXplOwotCQl9Ci0JfQotCSpwbmFtZSA9ICdcMCc7Ci0Jc25wcmludGYoaXdlLnUubmFtZSwgSUZOQU1TSVosICJJRUVFODAyLjExJXMiLCBwcm90b19uYW1lKTsKLSAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudF9yc2woaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX0NIQVJfTEVOKTsKLSAgICAgICAgLyogQWRkIG1vZGUgKi8KLSAgICAgICAgaXdlLmNtZCA9IFNJT0NHSVdNT0RFOwotICAgICAgICBpZiAobmV0d29yay0+Y2FwYWJpbGl0eSAmCi0JICAgIChXTEFOX0NBUEFCSUxJVFlfQlNTIHwgV0xBTl9DQVBBQklMSVRZX0lCU1MpKSB7Ci0JCWlmIChuZXR3b3JrLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0JTUykKLQkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX01BU1RFUjsKLQkJZWxzZQotCQkJaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudF9yc2woaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX1VJTlRfTEVOKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFkZCBmcmVxdWVuY3kvY2hhbm5lbCAqLwotCWl3ZS5jbWQgPSBTSU9DR0lXRlJFUTsKLS8qCWl3ZS51LmZyZXEubSA9IGllZWU4MDIxMV9mcmVxdWVuY3kobmV0d29yay0+Y2hhbm5lbCwgbmV0d29yay0+bW9kZSk7Ci0JaXdlLnUuZnJlcS5lID0gMzsgKi8KLQlpd2UudS5mcmVxLm0gPSBuZXR3b3JrLT5jaGFubmVsOwotCWl3ZS51LmZyZXEuZSA9IDA7Ci0JaXdlLnUuZnJlcS5pID0gMDsKLSAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudF9yc2woaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIElXX0VWX0ZSRVFfTEVOKTsKLQkvKiBBZGQgZW5jcnlwdGlvbiBjYXBhYmlsaXR5ICovCi0JaXdlLmNtZCA9IFNJT0NHSVdFTkNPREU7Ci0JaWYgKG5ldHdvcmstPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkKLQkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOwotCWVsc2UKLQkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKLQlpd2UudS5kYXRhLmxlbmd0aCA9IDA7Ci0gICAgICAgIHN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIG5ldHdvcmstPnNzaWQpOwotCS8qIEFkZCBiYXNpYyBhbmQgZXh0ZW5kZWQgcmF0ZXMgKi8KLQltYXhfcmF0ZSA9IDA7Ci0JcCA9IGN1c3RvbTsKLQlwICs9IHNucHJpbnRmKHAsIE1BWF9DVVNUT01fTEVOIC0gKHAgLSBjdXN0b20pLCAiIFJhdGVzIChNYi9zKTogIik7Ci0JZm9yIChpID0gMCwgaiA9IDA7IGkgPCBuZXR3b3JrLT5yYXRlc19sZW47ICkgewotCQlpZiAoaiA8IG5ldHdvcmstPnJhdGVzX2V4X2xlbiAmJgotCQkgICAgKChuZXR3b3JrLT5yYXRlc19leFtqXSAmIDB4N0YpIDwKLQkJICAgICAobmV0d29yay0+cmF0ZXNbaV0gJiAweDdGKSkpCi0JCQlyYXRlID0gbmV0d29yay0+cmF0ZXNfZXhbaisrXSAmIDB4N0Y7Ci0JCWVsc2UKLQkJCXJhdGUgPSBuZXR3b3JrLT5yYXRlc1tpKytdICYgMHg3RjsKLQkJaWYgKHJhdGUgPiBtYXhfcmF0ZSkKLQkJCW1heF9yYXRlID0gcmF0ZTsKLQkJcCArPSBzbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiAtIChwIC0gY3VzdG9tKSwKLQkJCSAgICAgICIlZCVzICIsIHJhdGUgPj4gMSwgKHJhdGUgJiAxKSA/ICIuNSIgOiAiIik7Ci0JfQotCWZvciAoOyBqIDwgbmV0d29yay0+cmF0ZXNfZXhfbGVuOyBqKyspIHsKLQkJcmF0ZSA9IG5ldHdvcmstPnJhdGVzX2V4W2pdICYgMHg3RjsKLQkJcCArPSBzbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiAtIChwIC0gY3VzdG9tKSwKLQkJCSAgICAgICIlZCVzICIsIHJhdGUgPj4gMSwgKHJhdGUgJiAxKSA/ICIuNSIgOiAiIik7Ci0JCWlmIChyYXRlID4gbWF4X3JhdGUpCi0JCQltYXhfcmF0ZSA9IHJhdGU7Ci0JfQotCi0JaWYgKG5ldHdvcmstPm1vZGUgPj0gSUVFRV9OXzI0RykvL2FkZCBOIHJhdGUgaGVyZTsKLQl7Ci0JCVBIVF9DQVBBQklMSVRZX0VMRSBodF9jYXAgPSBOVUxMOwotCQlib29sIGlzNDBNID0gZmFsc2UsIGlzU2hvcnRHSSA9IGZhbHNlOwotCQl1OCBtYXhfbWNzID0gMDsKLQkJaWYgKCFtZW1jbXAobmV0d29yay0+YnNzaHQuYmRIVENhcEJ1ZiwgRVdDMTFOSFRDYXAsIDQpKQotCQkJaHRfY2FwID0gKFBIVF9DQVBBQklMSVRZX0VMRSkmbmV0d29yay0+YnNzaHQuYmRIVENhcEJ1Zls0XTsKLQkJZWxzZQotCQkJaHRfY2FwID0gKFBIVF9DQVBBQklMSVRZX0VMRSkmbmV0d29yay0+YnNzaHQuYmRIVENhcEJ1ZlswXTsKLQkJaXM0ME0gPSAoaHRfY2FwLT5DaGxXaWR0aCk/MTowOwotCQlpc1Nob3J0R0kgPSAoaHRfY2FwLT5DaGxXaWR0aCk/Ci0JCQkJCQkoKGh0X2NhcC0+U2hvcnRHSTQwTWh6KT8xOjApOgotCQkJCQkJKChodF9jYXAtPlNob3J0R0kyME1oeik/MTowKTsKLQotCQltYXhfbWNzID0gSFRHZXRIaWdoZXN0TUNTUmF0ZShpZWVlLCBodF9jYXAtPk1DUywgTUNTX0ZJTFRFUl9BTEwpOwotCQlyYXRlID0gTUNTX0RBVEFfUkFURVtpczQwTV1baXNTaG9ydEdJXVttYXhfbWNzJjB4N2ZdOwotCQlpZiAocmF0ZSA+IG1heF9yYXRlKQotCQkJbWF4X3JhdGUgPSByYXRlOwotCX0KLQlpd2UuY21kID0gU0lPQ0dJV1JBVEU7Ci0JaXdlLnUuYml0cmF0ZS5maXhlZCA9IGl3ZS51LmJpdHJhdGUuZGlzYWJsZWQgPSAwOwotCWl3ZS51LmJpdHJhdGUudmFsdWUgPSBtYXhfcmF0ZSAqIDUwMDAwMDsKLSAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudF9yc2woaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsCi0JCQkJICAgICBJV19FVl9QQVJBTV9MRU4pOwotCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOwotCWl3ZS51LmRhdGEubGVuZ3RoID0gcCAtIGN1c3RvbTsKLQlpZiAoaXdlLnUuZGF0YS5sZW5ndGgpCi0gICAgICAgIHN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIGN1c3RvbSk7Ci0JLyogQWRkIHF1YWxpdHkgc3RhdGlzdGljcyAqLwotCS8qIFRPRE86IEZpeCB0aGVzZSB2YWx1ZXMuLi4gKi8KLQlpd2UuY21kID0gSVdFVlFVQUw7Ci0JaXdlLnUucXVhbC5xdWFsID0gbmV0d29yay0+c3RhdHMuc2lnbmFsOwotCWl3ZS51LnF1YWwubGV2ZWwgPSBuZXR3b3JrLT5zdGF0cy5yc3NpOwotCWl3ZS51LnF1YWwubm9pc2UgPSBuZXR3b3JrLT5zdGF0cy5ub2lzZTsKLQlpd2UudS5xdWFsLnVwZGF0ZWQgPSBuZXR3b3JrLT5zdGF0cy5tYXNrICYgSUVFRTgwMjExX1NUQVRNQVNLX1dFTUFTSzsKLQlpZiAoIShuZXR3b3JrLT5zdGF0cy5tYXNrICYgSUVFRTgwMjExX1NUQVRNQVNLX1JTU0kpKQotCQlpd2UudS5xdWFsLnVwZGF0ZWQgfD0gSVdfUVVBTF9MRVZFTF9JTlZBTElEOwotCWlmICghKG5ldHdvcmstPnN0YXRzLm1hc2sgJiBJRUVFODAyMTFfU1RBVE1BU0tfTk9JU0UpKQotCQlpd2UudS5xdWFsLnVwZGF0ZWQgfD0gSVdfUVVBTF9OT0lTRV9JTlZBTElEOwotCWlmICghKG5ldHdvcmstPnN0YXRzLm1hc2sgJiBJRUVFODAyMTFfU1RBVE1BU0tfU0lHTkFMKSkKLQkJaXdlLnUucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfUVVBTF9JTlZBTElEOwotCWl3ZS51LnF1YWwudXBkYXRlZCA9IDc7Ci0gICAgICAgIHN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnRfcnNsKGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBJV19FVl9RVUFMX0xFTik7Ci0JaXdlLmNtZCA9IElXRVZDVVNUT007Ci0JcCA9IGN1c3RvbTsKLQotCWl3ZS51LmRhdGEubGVuZ3RoID0gcCAtIGN1c3RvbTsKLQlpZiAoaXdlLnUuZGF0YS5sZW5ndGgpCi0gICAgICAgICAgICBzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBjdXN0b20pOwotI2lmIChXSVJFTEVTU19FWFQgPCAxOCkKLQlpZiAoaWVlZS0+d3BhX2VuYWJsZWQgJiYgbmV0d29yay0+d3BhX2llX2xlbil7Ci0JCWNoYXIgYnVmW01BWF9XUEFfSUVfTEVOICogMiArIDMwXTsKLQkJdTggKnAgPSBidWY7Ci0JCXAgKz0gc3ByaW50ZihwLCAid3BhX2llPSIpOwotCQlmb3IgKGkgPSAwOyBpIDwgbmV0d29yay0+d3BhX2llX2xlbjsgaSsrKSB7Ci0JCQlwICs9IHNwcmludGYocCwgIiUwMngiLCBuZXR3b3JrLT53cGFfaWVbaV0pOwotCQl9Ci0KLQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKLQkJaXdlLmNtZCA9IElXRVZDVVNUT007Ci0JCWl3ZS51LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1Zik7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgYnVmKTsKLSAgICAgICAgfQotCi0JaWYgKGllZWUtPndwYV9lbmFibGVkICYmIG5ldHdvcmstPnJzbl9pZV9sZW4pewotCQljaGFyIGJ1ZltNQVhfV1BBX0lFX0xFTiAqIDIgKyAzMF07Ci0KLQkJdTggKnAgPSBidWY7Ci0JCXAgKz0gc3ByaW50ZihwLCAicnNuX2llPSIpOwotCQlmb3IgKGkgPSAwOyBpIDwgbmV0d29yay0+cnNuX2llX2xlbjsgaSsrKSB7Ci0JCQlwICs9IHNwcmludGYocCwgIiUwMngiLCBuZXR3b3JrLT5yc25faWVbaV0pOwotCQl9Ci0KLQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKLQkJaXdlLmNtZCA9IElXRVZDVVNUT007Ci0JCWl3ZS51LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1Zik7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgYnVmKTsKLSAgICAgICAgfQotI2Vsc2UKLQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwotCWlmIChuZXR3b3JrLT53cGFfaWVfbGVuKQotCXsKLQkJY2hhciBidWZbTUFYX1dQQV9JRV9MRU5dOwotCQltZW1jcHkoYnVmLCBuZXR3b3JrLT53cGFfaWUsIG5ldHdvcmstPndwYV9pZV9sZW4pOwotCQlpd2UuY21kID0gSVdFVkdFTklFOwotCQlpd2UudS5kYXRhLmxlbmd0aCA9IG5ldHdvcmstPndwYV9pZV9sZW47Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgYnVmKTsKLSAgICAgICAgfQotCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7Ci0JaWYgKG5ldHdvcmstPnJzbl9pZV9sZW4pCi0JewotCQljaGFyIGJ1ZltNQVhfV1BBX0lFX0xFTl07Ci0JCW1lbWNweShidWYsIG5ldHdvcmstPnJzbl9pZSwgbmV0d29yay0+cnNuX2llX2xlbik7Ci0JCWl3ZS5jbWQgPSBJV0VWR0VOSUU7Ci0JCWl3ZS51LmRhdGEubGVuZ3RoID0gbmV0d29yay0+cnNuX2llX2xlbjsKLSAgICAgICAgICAgICAgICBzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBidWYpOwotICAgICAgICB9Ci0jZW5kaWYKLQotCi0JLyogQWRkIEVYVFJBOiBBZ2UgdG8gZGlzcGxheSBzZWNvbmRzIHNpbmNlIGxhc3QgYmVhY29uL3Byb2JlIHJlc3BvbnNlCi0JICogZm9yIGdpdmVuIG5ldHdvcmsuICovCi0JaXdlLmNtZCA9IElXRVZDVVNUT007Ci0JcCA9IGN1c3RvbTsKLQlwICs9IHNucHJpbnRmKHAsIE1BWF9DVVNUT01fTEVOIC0gKHAgLSBjdXN0b20pLAotCQkgICAgICAiIExhc3QgYmVhY29uOiAlbHVtcyBhZ28iLCAoamlmZmllcyAtIG5ldHdvcmstPmxhc3Rfc2Nhbm5lZCkgLyAoSFogLyAxMDApKTsKLQlpd2UudS5kYXRhLmxlbmd0aCA9IHAgLSBjdXN0b207Ci0JaWYgKGl3ZS51LmRhdGEubGVuZ3RoKQotICAgICAgICAgICAgc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgY3VzdG9tKTsKLQotCXJldHVybiBzdGFydDsKLX0KLQotaW50IGllZWU4MDIxMV93eF9nZXRfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQljaGFyICpldiA9IGV4dHJhOwotLy8JY2hhciAqc3RvcCA9IGV2ICsgSVdfU0NBTl9NQVhfREFUQTsKLQljaGFyICpzdG9wID0gZXYgKyB3cnF1LT5kYXRhLmxlbmd0aDsvL0lXX1NDQU5fTUFYX0RBVEE7Ci0JLy9jaGFyICpzdG9wID0gZXYgKyBJV19TQ0FOX01BWF9EQVRBOwotCWludCBpID0gMDsKLQlpbnQgZXJyID0gMDsKLQlJRUVFODAyMTFfREVCVUdfV1goIkdldHRpbmcgc2NhblxuIik7Ci0JZG93bigmaWVlZS0+d3hfc2VtKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShuZXR3b3JrLCAmaWVlZS0+bmV0d29ya19saXN0LCBsaXN0KSB7Ci0JCWkrKzsKLQkJaWYoKHN0b3AtZXYpPDIwMCkKLQkJewotCQkJZXJyID0gLUUyQklHOwotCQkJYnJlYWs7Ci0JCQkJCQkJCQkJCQl9Ci0JCWlmIChpZWVlLT5zY2FuX2FnZSA9PSAwIHx8Ci0JCSAgICB0aW1lX2FmdGVyKG5ldHdvcmstPmxhc3Rfc2Nhbm5lZCArIGllZWUtPnNjYW5fYWdlLCBqaWZmaWVzKSkKLQkJCWV2ID0gcnRsODE5eF90cmFuc2xhdGVfc2NhbihpZWVlLCBldiwgc3RvcCwgbmV0d29yaywgaW5mbyk7Ci0JCWVsc2UKLQkJCUlFRUU4MDIxMV9ERUJVR19TQ0FOKAotCQkJCSJOb3Qgc2hvd2luZyBuZXR3b3JrICclcyAoIgotCQkJCSIlcE0pJyBkdWUgdG8gYWdlICglbHVtcykuXG4iLAotCQkJCWVzY2FwZV9lc3NpZChuZXR3b3JrLT5zc2lkLAotCQkJCQkgICAgIG5ldHdvcmstPnNzaWRfbGVuKSwKLQkJCQluZXR3b3JrLT5ic3NpZCwKLQkJCQkoamlmZmllcyAtIG5ldHdvcmstPmxhc3Rfc2Nhbm5lZCkgLyAoSFogLyAxMDApKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7Ci0JdXAoJmllZWUtPnd4X3NlbSk7Ci0Jd3JxdS0+ZGF0YS5sZW5ndGggPSBldiAtICBleHRyYTsKLQl3cnF1LT5kYXRhLmZsYWdzID0gMDsKLQotCUlFRUU4MDIxMV9ERUJVR19XWCgiZXhpdDogJWQgbmV0d29ya3MgcmV0dXJuZWQuXG4iLCBpKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLWludCBpZWVlODAyMTFfd3hfc2V0X2VuY29kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLQkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleWJ1ZikKLXsKLQlzdHJ1Y3QgaXdfcG9pbnQgKmVycSA9ICYod3JxdS0+ZW5jb2RpbmcpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7Ci0Jc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSBzZWMgPSB7Ci0JCS5mbGFncyA9IDAKLQl9OwotCWludCBpLCBrZXksIGtleV9wcm92aWRlZCwgbGVuOwotCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqKmNyeXB0OwotCi0JSUVFRTgwMjExX0RFQlVHX1dYKCJTRVRfRU5DT0RFXG4iKTsKLQotCWtleSA9IGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVg7Ci0JaWYgKGtleSkgewotCQlpZiAoa2V5ID4gV0VQX0tFWVMpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJa2V5LS07Ci0JCWtleV9wcm92aWRlZCA9IDE7Ci0JfSBlbHNlIHsKLQkJa2V5X3Byb3ZpZGVkID0gMDsKLQkJa2V5ID0gaWVlZS0+dHhfa2V5aWR4OwotCX0KLQotCUlFRUU4MDIxMV9ERUJVR19XWCgiS2V5OiAlZCBbJXNdXG4iLCBrZXksIGtleV9wcm92aWRlZCA/Ci0JCQkgICAicHJvdmlkZWQiIDogImRlZmF1bHQiKTsKLQljcnlwdCA9ICZpZWVlLT5jcnlwdFtrZXldOwotCi0JaWYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKLQkJaWYgKGtleV9wcm92aWRlZCAmJiAqY3J5cHQpIHsKLQkJCUlFRUU4MDIxMV9ERUJVR19XWCgiRGlzYWJsaW5nIGVuY3J5cHRpb24gb24ga2V5ICVkLlxuIiwKLQkJCQkJICAga2V5KTsKLQkJCWllZWU4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7Ci0JCX0gZWxzZQotCQkJSUVFRTgwMjExX0RFQlVHX1dYKCJEaXNhYmxpbmcgZW5jcnlwdGlvbi5cbiIpOwotCi0JCS8qIENoZWNrIGFsbCB0aGUga2V5cyB0byBzZWUgaWYgYW55IGFyZSBzdGlsbCBjb25maWd1cmVkLAotCQkgKiBhbmQgaWYgbm8ga2V5IGluZGV4IHdhcyBwcm92aWRlZCwgZGUtaW5pdCB0aGVtIGFsbCAqLwotCQlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVM7IGkrKykgewotCQkJaWYgKGllZWUtPmNyeXB0W2ldICE9IE5VTEwpIHsKLQkJCQlpZiAoa2V5X3Byb3ZpZGVkKQotCQkJCQlicmVhazsKLQkJCQlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoCi0JCQkJCWllZWUsICZpZWVlLT5jcnlwdFtpXSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaSA9PSBXRVBfS0VZUykgewotCQkJc2VjLmVuYWJsZWQgPSAwOwotCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzA7Ci0JCQlzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQgfCBTRUNfTEVWRUw7Ci0JCX0KLQotCQlnb3RvIGRvbmU7Ci0JfQotCi0KLQotCXNlYy5lbmFibGVkID0gMTsKLQlzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQ7Ci0KLQlpZiAoKmNyeXB0ICE9IE5VTEwgJiYgKCpjcnlwdCktPm9wcyAhPSBOVUxMICYmCi0JICAgIHN0cmNtcCgoKmNyeXB0KS0+b3BzLT5uYW1lLCAiV0VQIikgIT0gMCkgewotCQkvKiBjaGFuZ2luZyB0byB1c2UgV0VQOyBkZWluaXQgcHJldmlvdXNseSB1c2VkIGFsZ29yaXRobQotCQkgKiBvbiB0aGlzIGtleSAqLwotCQlpZWVlODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwgY3J5cHQpOwotCX0KLQotCWlmICgqY3J5cHQgPT0gTlVMTCkgewotCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKm5ld19jcnlwdDsKLQotCQkvKiB0YWtlIFdFUCBpbnRvIHVzZSAqLwotCQluZXdfY3J5cHQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEpLAotCQkJCSAgICBHRlBfS0VSTkVMKTsKLQkJaWYgKG5ld19jcnlwdCA9PSBOVUxMKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCW5ld19jcnlwdC0+b3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKCJXRVAiKTsKLQkJaWYgKCFuZXdfY3J5cHQtPm9wcykKLQkJCW5ld19jcnlwdC0+b3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKCJXRVAiKTsKLQkJaWYgKG5ld19jcnlwdC0+b3BzKQotCQkJbmV3X2NyeXB0LT5wcml2ID0gbmV3X2NyeXB0LT5vcHMtPmluaXQoa2V5KTsKLQotCQlpZiAoIW5ld19jcnlwdC0+b3BzIHx8ICFuZXdfY3J5cHQtPnByaXYpIHsKLQkJCWtmcmVlKG5ld19jcnlwdCk7Ci0JCQluZXdfY3J5cHQgPSBOVUxMOwotCi0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogY291bGQgbm90IGluaXRpYWxpemUgV0VQOiAiCi0JCQkgICAgICAgImxvYWQgbW9kdWxlIGllZWU4MDIxMV9jcnlwdF93ZXBcbiIsCi0JCQkgICAgICAgZGV2LT5uYW1lKTsKLQkJCXJldHVybiAtRU9QTk9UU1VQUDsKLQkJfQotCQkqY3J5cHQgPSBuZXdfY3J5cHQ7Ci0JfQotCi0JLyogSWYgYSBuZXcga2V5IHdhcyBwcm92aWRlZCwgc2V0IGl0IHVwICovCi0JaWYgKGVycS0+bGVuZ3RoID4gMCkgewotCQlsZW4gPSBlcnEtPmxlbmd0aCA8PSA1ID8gNSA6IDEzOwotCQltZW1jcHkoc2VjLmtleXNba2V5XSwga2V5YnVmLCBlcnEtPmxlbmd0aCk7Ci0JCWlmIChsZW4gPiBlcnEtPmxlbmd0aCkKLQkJCW1lbXNldChzZWMua2V5c1trZXldICsgZXJxLT5sZW5ndGgsIDAsCi0JCQkgICAgICAgbGVuIC0gZXJxLT5sZW5ndGgpOwotCQlJRUVFODAyMTFfREVCVUdfV1goIlNldHRpbmcga2V5ICVkIHRvICclcycgKCVkOiVkIGJ5dGVzKVxuIiwKLQkJCQkgICBrZXksIGVzY2FwZV9lc3NpZChzZWMua2V5c1trZXldLCBsZW4pLAotCQkJCSAgIGVycS0+bGVuZ3RoLCBsZW4pOwotCQlzZWMua2V5X3NpemVzW2tleV0gPSBsZW47Ci0gCQkoKmNyeXB0KS0+b3BzLT5zZXRfa2V5KHNlYy5rZXlzW2tleV0sIGxlbiwgTlVMTCwKLQkJCQkgICAgICAgKCpjcnlwdCktPnByaXYpOwotCQlzZWMuZmxhZ3MgfD0gKDEgPDwga2V5KTsKLQkJLyogVGhpcyBlbnN1cmVzIGEga2V5IHdpbGwgYmUgYWN0aXZhdGVkIGlmIG5vIGtleSBpcwotCQkgKiBleHBsaWNpdGVseSBzZXQgKi8KLQkJaWYgKGtleSA9PSBzZWMuYWN0aXZlX2tleSkKLQkJCXNlYy5mbGFncyB8PSBTRUNfQUNUSVZFX0tFWTsKLQkJaWVlZS0+dHhfa2V5aWR4ID0ga2V5OwotCi0JfSBlbHNlIHsKLQkJbGVuID0gKCpjcnlwdCktPm9wcy0+Z2V0X2tleShzZWMua2V5c1trZXldLCBXRVBfS0VZX0xFTiwKLQkJCQkJICAgICBOVUxMLCAoKmNyeXB0KS0+cHJpdik7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJLyogU2V0IGEgZGVmYXVsdCBrZXkgb2YgYWxsIDAgKi8KLQkJCXByaW50aygiU2V0dGluZyBrZXkgJWQgdG8gYWxsIHplcm8uXG4iLAotCQkJCQkgICBrZXkpOwotCi0JCQlJRUVFODAyMTFfREVCVUdfV1goIlNldHRpbmcga2V5ICVkIHRvIGFsbCB6ZXJvLlxuIiwKLQkJCQkJICAga2V5KTsKLQkJCW1lbXNldChzZWMua2V5c1trZXldLCAwLCAxMyk7Ci0JCQkoKmNyeXB0KS0+b3BzLT5zZXRfa2V5KHNlYy5rZXlzW2tleV0sIDEzLCBOVUxMLAotCQkJCQkgICAgICAgKCpjcnlwdCktPnByaXYpOwotCQkJc2VjLmtleV9zaXplc1trZXldID0gMTM7Ci0JCQlzZWMuZmxhZ3MgfD0gKDEgPDwga2V5KTsKLQkJfQotCi0JCS8qIE5vIGtleSBkYXRhIC0ganVzdCBzZXQgdGhlIGRlZmF1bHQgVFgga2V5IGluZGV4ICovCi0JCWlmIChrZXlfcHJvdmlkZWQpIHsKLQkJCUlFRUU4MDIxMV9ERUJVR19XWCgKLQkJCQkiU2V0dGluZyBrZXkgJWQgdG8gZGVmYXVsdCBUeCBrZXkuXG4iLCBrZXkpOwotCQkJaWVlZS0+dHhfa2V5aWR4ID0ga2V5OwotCQkJc2VjLmFjdGl2ZV9rZXkgPSBrZXk7Ci0JCQlzZWMuZmxhZ3MgfD0gU0VDX0FDVElWRV9LRVk7Ci0JCX0KLQl9Ci0KLSBkb25lOgotCWllZWUtPm9wZW5fd2VwID0gIShlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpOwotCWllZWUtPmF1dGhfbW9kZSA9IGllZWUtPm9wZW5fd2VwID8gV0xBTl9BVVRIX09QRU4gOiBXTEFOX0FVVEhfU0hBUkVEX0tFWTsKLQlzZWMuYXV0aF9tb2RlID0gaWVlZS0+b3Blbl93ZXAgPyBXTEFOX0FVVEhfT1BFTiA6IFdMQU5fQVVUSF9TSEFSRURfS0VZOwotCXNlYy5mbGFncyB8PSBTRUNfQVVUSF9NT0RFOwotCUlFRUU4MDIxMV9ERUJVR19XWCgiQXV0aDogJXNcbiIsIHNlYy5hdXRoX21vZGUgPT0gV0xBTl9BVVRIX09QRU4gPwotCQkJICAgIk9QRU4iIDogIlNIQVJFRCBLRVkiKTsKLQotCS8qIEZvciBub3cgd2UganVzdCBzdXBwb3J0IFdFUCwgc28gb25seSBzZXQgdGhhdCBzZWN1cml0eSBsZXZlbC4uLgotCSAqIFRPRE86IFdoZW4gV1BBIGlzIGFkZGVkIHRoaXMgaXMgb25lIHBsYWNlIHRoYXQgbmVlZHMgdG8gY2hhbmdlICovCi0Jc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKLQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMTsgLyogNDAgYW5kIDEwNCBiaXQgV0VQICovCi0KLQlpZiAoaWVlZS0+c2V0X3NlY3VyaXR5KQotCQlpZWVlLT5zZXRfc2VjdXJpdHkoaWVlZSwgJnNlYyk7Ci0KLQkvKiBEbyBub3QgcmVzZXQgcG9ydCBpZiBjYXJkIGlzIGluIE1hbmFnZWQgbW9kZSBzaW5jZSByZXNldHRpbmcgd2lsbAotCSAqIGdlbmVyYXRlIG5ldyBJRUVFIDgwMi4xMSBhdXRoZW50aWNhdGlvbiB3aGljaCBtYXkgZW5kIHVwIGluIGxvb3BpbmcKLQkgKiB3aXRoIElFRUUgODAyLjFYLiAgSWYgeW91ciBoYXJkd2FyZSByZXF1aXJlcyBhIHJlc2V0IGFmdGVyIFdFUAotCSAqIGNvbmZpZ3VyYXRpb24gKGZvciBleGFtcGxlLi4uIFByaXNtMiksIGltcGxlbWVudCB0aGUgcmVzZXRfcG9ydCBpbgotCSAqIHRoZSBjYWxsYmFja3Mgc3RydWN0dXJlcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIDgwMi4xMSBzdGFjay4gKi8KLQlpZiAoaWVlZS0+cmVzZXRfb25fa2V5Y2hhbmdlICYmCi0JICAgIGllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSAmJgotCSAgICBpZWVlLT5yZXNldF9wb3J0ICYmIGllZWUtPnJlc2V0X3BvcnQoaWVlZSkpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiByZXNldF9wb3J0IGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAwOwotfQotCi1pbnQgaWVlZTgwMjExX3d4X2dldF9lbmNvZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCQkgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXlidWYpCi17Ci0Jc3RydWN0IGl3X3BvaW50ICplcnEgPSAmKHdycXUtPmVuY29kaW5nKTsKLQlpbnQgbGVuLCBrZXk7Ci0Jc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICpjcnlwdDsKLQotCUlFRUU4MDIxMV9ERUJVR19XWCgiR0VUX0VOQ09ERVxuIik7Ci0KLQlpZihpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKLQkJcmV0dXJuIC0xOwotCi0Ja2V5ID0gZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKLQlpZiAoa2V5KSB7Ci0JCWlmIChrZXkgPiBXRVBfS0VZUykKLQkJCXJldHVybiAtRUlOVkFMOwotCQlrZXktLTsKLQl9IGVsc2UKLQkJa2V5ID0gaWVlZS0+dHhfa2V5aWR4OwotCi0JY3J5cHQgPSBpZWVlLT5jcnlwdFtrZXldOwotCWVycS0+ZmxhZ3MgPSBrZXkgKyAxOwotCi0JaWYgKGNyeXB0ID09IE5VTEwgfHwgY3J5cHQtPm9wcyA9PSBOVUxMKSB7Ci0JCWVycS0+bGVuZ3RoID0gMDsKLQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7Ci0JCXJldHVybiAwOwotCX0KLSNpZiAwCi0JaWYgKHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCAiV0VQIikgIT0gMCkgewotCQkvKiBvbmx5IFdFUCBpcyBzdXBwb3J0ZWQgd2l0aCB3aXJlbGVzcyBleHRlbnNpb25zLCBzbyBqdXN0Ci0JCSAqIHJlcG9ydCB0aGF0IGVuY3J5cHRpb24gaXMgdXNlZCAqLwotCQllcnEtPmxlbmd0aCA9IDA7Ci0JCWVycS0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7Ci0JCXJldHVybiAwOwotCX0KLSNlbmRpZgotCWxlbiA9IGNyeXB0LT5vcHMtPmdldF9rZXkoa2V5YnVmLCBTQ01fS0VZX0xFTiwgTlVMTCwgY3J5cHQtPnByaXYpOwotCWVycS0+bGVuZ3RoID0gKGxlbiA+PSAwID8gbGVuIDogMCk7Ci0KLQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOwotCi0JaWYgKGllZWUtPm9wZW5fd2VwKQotCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOwotCWVsc2UKLQkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsKLQotCXJldHVybiAwOwotfQotI2lmIChXSVJFTEVTU19FWFQgPj0gMTgpCi1pbnQgaWVlZTgwMjExX3d4X3NldF9lbmNvZGVfZXh0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKLSAgICAgICAgc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKLSAgICAgICAgc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWV4dHJhOwotICAgICAgICBpbnQgaSwgaWR4OwotICAgICAgICBpbnQgZ3JvdXBfa2V5ID0gMDsKLSAgICAgICAgY29uc3QgY2hhciAqYWxnOwotICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wczsKLSAgICAgICAgc3RydWN0IGllZWU4MDIxMV9jcnlwdF9kYXRhICoqY3J5cHQ7Ci0KLSAgICAgICAgc3RydWN0IGllZWU4MDIxMV9zZWN1cml0eSBzZWMgPSB7Ci0gICAgICAgICAgICAgICAgLmZsYWdzID0gMCwKLSAgICAgICAgfTsKLSAgICAgICAgaWR4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOwotICAgICAgICBpZiAoaWR4KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlkeCA8IDEgfHwgaWR4ID4gV0VQX0tFWVMpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICBpZHgtLTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgaWR4ID0gaWVlZS0+dHhfa2V5aWR4OwotCi0gICAgICAgIGlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKSB7Ci0KLSAgICAgICAgICAgICAgICBjcnlwdCA9ICZpZWVlLT5jcnlwdFtpZHhdOwotCi0gICAgICAgICAgICAgICAgZ3JvdXBfa2V5ID0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBzb21lIENpc2NvIEFQcyB1c2UgaWR4PjAgZm9yIHVuaWNhc3QgaW4gZHluYW1pYyBXRVAgKi8KLSAgICAgICAgICAgICAgICBpZiAoaWR4ICE9IDAgJiYgZXh0LT5hbGcgIT0gSVdfRU5DT0RFX0FMR19XRVApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKQotCi0gICAgICAgICAgICAgICAgICAgICAgICBjcnlwdCA9ICZpZWVlLT5jcnlwdFtpZHhdOwotCi0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLQotICAgICAgICBzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQ7Ly8gfCBTRUNfRU5DUllQVDsKLSAgICAgICAgaWYgKChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHx8Ci0gICAgICAgICAgICBleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX05PTkUpIHsKLSAgICAgICAgICAgICAgICBpZiAoKmNyeXB0KQotICAgICAgICAgICAgICAgICAgICAgICAgaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGllZWUsIGNyeXB0KTsKLQotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBXRVBfS0VZUzsgaSsrKQotCi0JCQlpZiAoaWVlZS0+Y3J5cHRbaV0gIT0gTlVMTCkKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGlmIChpID09IFdFUF9LRVlTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWMuZW5hYmxlZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgLy8gIHNlYy5lbmNyeXB0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlYy5sZXZlbCA9IFNFQ19MRVZFTF8wOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ290byBkb25lOwotICAgICAgICB9Ci0KLQlzZWMuZW5hYmxlZCA9IDE7Ci0gICAgLy8gICAgc2VjLmVuY3J5cHQgPSAxOwotI2lmIDAKLSAgICAgICAgaWYgKGdyb3VwX2tleSA/ICFpZWVlLT5ob3N0X21jX2RlY3J5cHQgOgotICAgICAgICAgICAgIShpZWVlLT5ob3N0X2VuY3J5cHQgfHwgaWVlZS0+aG9zdF9kZWNyeXB0IHx8Ci0gICAgICAgICAgICAgIGllZWUtPmhvc3RfZW5jcnlwdF9tc2R1KSkKLSAgICAgICAgICAgICAgICBnb3RvIHNraXBfaG9zdF9jcnlwdDsKLSNlbmRpZgotICAgICAgICBzd2l0Y2ggKGV4dC0+YWxnKSB7Ci0gICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19XRVA6Ci0gICAgICAgICAgICAgICAgYWxnID0gIldFUCI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSVdfRU5DT0RFX0FMR19US0lQOgotICAgICAgICAgICAgICAgIGFsZyA9ICJUS0lQIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJV19FTkNPREVfQUxHX0NDTVA6Ci0gICAgICAgICAgICAgICAgYWxnID0gIkNDTVAiOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIElFRUU4MDIxMV9ERUJVR19XWCgiJXM6IHVua25vd24gY3J5cHRvIGFsZyAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBleHQtPmFsZyk7Ci0gICAgICAgICAgICAgICAgcmV0ID0gLUVJTlZBTDsKLSAgICAgICAgICAgICAgICBnb3RvIGRvbmU7Ci0gICAgICAgIH0KLQlwcmludGsoImFsZyBuYW1lOiVzXG4iLGFsZyk7Ci0KLQkgb3BzID0gaWVlZTgwMjExX2dldF9jcnlwdG9fb3BzKGFsZyk7Ci0gICAgICAgIGlmIChvcHMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBvcHMgPSBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoYWxnKTsKLSAgICAgICAgaWYgKG9wcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgSUVFRTgwMjExX0RFQlVHX1dYKCIlczogdW5rbm93biBjcnlwdG8gYWxnICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIGV4dC0+YWxnKTsKLQkJcHJpbnRrKCI9PT09PT09PT51bmtub3duIGNyeXB0byBhbGcgJWRcbiIsIGV4dC0+YWxnKTsKLSAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgqY3J5cHQgPT0gTlVMTCB8fCAoKmNyeXB0KS0+b3BzICE9IG9wcykgewotICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSAqbmV3X2NyeXB0OwotCi0gICAgICAgICAgICAgICAgaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGllZWUsIGNyeXB0KTsKLQotI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDYsMTMpKQotICAgICAgICAgICAgICAgIG5ld19jcnlwdCA9IGt6YWxsb2Moc2l6ZW9mKCpuZXdfY3J5cHQpLCBHRlBfS0VSTkVMKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgbmV3X2NyeXB0ID0ga21hbGxvYyhzaXplb2YoKm5ld19jcnlwdCksIEdGUF9LRVJORUwpOwotCQltZW1zZXQobmV3X2NyeXB0LDAsc2l6ZW9mKCpuZXdfY3J5cHQpKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIGlmIChuZXdfY3J5cHQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVOT01FTTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmV3X2NyeXB0LT5vcHMgPSBvcHM7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld19jcnlwdC0+b3BzKQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2NyeXB0LT5wcml2ID0gbmV3X2NyeXB0LT5vcHMtPmluaXQoaWR4KTsKLSAgICAgICAgICAgICAgICBpZiAobmV3X2NyeXB0LT5wcml2ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKG5ld19jcnlwdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqY3J5cHQgPSBuZXdfY3J5cHQ7Ci0KLSAJfQotCi0gICAgICAgIGlmIChleHQtPmtleV9sZW4gPiAwICYmICgqY3J5cHQpLT5vcHMtPnNldF9rZXkgJiYKLSAgICAgICAgICAgICgqY3J5cHQpLT5vcHMtPnNldF9rZXkoZXh0LT5rZXksIGV4dC0+a2V5X2xlbiwgZXh0LT5yeF9zZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqY3J5cHQpLT5wcml2KSA8IDApIHsKLSAgICAgICAgICAgICAgICBJRUVFODAyMTFfREVCVUdfV1goIiVzOiBrZXkgc2V0dGluZyBmYWlsZWRcbiIsIGRldi0+bmFtZSk7Ci0JCXByaW50aygia2V5IHNldHRpbmcgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgICAgICByZXQgPSAtRUlOVkFMOwotICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKLSAgICAgICAgfQotI2lmIDEKLSAgICAgICAgaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKSB7Ci0gICAgICAgICAgICAgICAgaWVlZS0+dHhfa2V5aWR4ID0gaWR4OwotICAgICAgICAgICAgICAgIHNlYy5hY3RpdmVfa2V5ID0gaWR4OwotICAgICAgICAgICAgICAgIHNlYy5mbGFncyB8PSBTRUNfQUNUSVZFX0tFWTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHQtPmFsZyAhPSBJV19FTkNPREVfQUxHX05PTkUpIHsKLSAgICAgICAgICAgICAgICAvL21lbWNweShzZWMua2V5c1tpZHhdLCBleHQtPmtleSwgZXh0LT5rZXlfbGVuKTsKLSAgICAgICAgICAgICAgICBzZWMua2V5X3NpemVzW2lkeF0gPSBleHQtPmtleV9sZW47Ci0gICAgICAgICAgICAgICAgc2VjLmZsYWdzIHw9ICgxIDw8IGlkeCk7Ci0gICAgICAgICAgICAgICAgaWYgKGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfV0VQKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgLy8gIHNlYy5lbmNvZGVfYWxnW2lkeF0gPSBTRUNfQUxHX1dFUDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlYy5mbGFncyB8PSBTRUNfTEVWRUw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfVEtJUCkgewotICAgICAgICAgICAgICAgICAgICAgIC8vICBzZWMuZW5jb2RlX2FsZ1tpZHhdID0gU0VDX0FMR19US0lQOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlYy5sZXZlbCA9IFNFQ19MRVZFTF8yOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19DQ01QKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIC8vIHNlYy5lbmNvZGVfYWxnW2lkeF0gPSBTRUNfQUxHX0NDTVA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VjLmxldmVsID0gU0VDX0xFVkVMXzM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIERvbid0IHNldCBzZWMgbGV2ZWwgZm9yIGdyb3VwIGtleXMuICovCi0gICAgICAgICAgICAgICAgaWYgKGdyb3VwX2tleSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlYy5mbGFncyAmPSB+U0VDX0xFVkVMOwotICAgICAgICB9Ci0jZW5kaWYKLWRvbmU6Ci0gICAgICAgIGlmIChpZWVlLT5zZXRfc2VjdXJpdHkpCi0JCWllZWUtPnNldF9zZWN1cml0eShpZWVlLCAmc2VjKTsKLQotCSBpZiAoaWVlZS0+cmVzZXRfb25fa2V5Y2hhbmdlICYmCi0gICAgICAgICAgICBpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgJiYKLSAgICAgICAgICAgIGllZWUtPnJlc2V0X3BvcnQgJiYgaWVlZS0+cmVzZXRfcG9ydChpZWVlKSkgewotICAgICAgICAgICAgICAgIElFRUU4MDIxMV9ERUJVR19XWCgiJXM6IHJlc2V0X3BvcnQgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOwotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZV9leHQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCi0JCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOwotCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilleHRyYTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmNyeXB0OwotCWludCBpZHgsIG1heF9rZXlfbGVuOwotCi0JbWF4X2tleV9sZW4gPSBlbmNvZGluZy0+bGVuZ3RoIC0gc2l6ZW9mKCpleHQpOwotCWlmIChtYXhfa2V5X2xlbiA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWR4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOwotCWlmIChpZHgpIHsKLQkJaWYgKGlkeCA8IDEgfHwgaWR4ID4gV0VQX0tFWVMpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJaWR4LS07Ci0JfSBlbHNlCi0JCWlkeCA9IGllZWUtPnR4X2tleWlkeDsKLQotCWlmICghKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVkpICYmCi0JICAgIGV4dC0+YWxnICE9IElXX0VOQ09ERV9BTEdfV0VQKQotCQlpZiAoaWR4ICE9IDAgfHwgaWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljcnlwdCA9IGllZWUtPmNyeXB0W2lkeF07Ci0JZW5jb2RpbmctPmZsYWdzID0gaWR4ICsgMTsKLQltZW1zZXQoZXh0LCAwLCBzaXplb2YoKmV4dCkpOwotCi0JaWYgKGNyeXB0ID09IE5VTEwgfHwgY3J5cHQtPm9wcyA9PSBOVUxMICkgewotCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfTk9ORTsKLQkJZXh0LT5rZXlfbGVuID0gMDsKLQkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKLQl9IGVsc2UgewotCQlpZiAoc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJXRVAiKSA9PSAwICkKLQkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19XRVA7Ci0JCWVsc2UgaWYgKHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCAiVEtJUCIpKQotCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1RLSVA7Ci0JCWVsc2UgaWYgKHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCAiQ0NNUCIpKQotCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX0NDTVA7Ci0JCWVsc2UKLQkJCXJldHVybiAtRUlOVkFMOwotCQlleHQtPmtleV9sZW4gPSBjcnlwdC0+b3BzLT5nZXRfa2V5KGV4dC0+a2V5LCBTQ01fS0VZX0xFTiwgTlVMTCwgY3J5cHQtPnByaXYpOwotCQllbmNvZGluZy0+ZmxhZ3MgfD0gSVdfRU5DT0RFX0VOQUJMRUQ7Ci0JCWlmIChleHQtPmtleV9sZW4gJiYKLQkJICAgIChleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX1RLSVAgfHwKLQkJICAgICBleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX0NDTVApKQotCQkJZXh0LT5leHRfZmxhZ3MgfD0gSVdfRU5DT0RFX0VYVF9UWF9TRVFfVkFMSUQ7Ci0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGllZWU4MDIxMV93eF9zZXRfbWxtZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBpd19tbG1lICptbG1lID0gKHN0cnVjdCBpd19tbG1lICopIGV4dHJhOwotCXN3aXRjaCAobWxtZS0+Y21kKSB7Ci0gICAgICAgIGNhc2UgSVdfTUxNRV9ERUFVVEg6Ci0JY2FzZSBJV19NTE1FX0RJU0FTU09DOgotCQlpZWVlODAyMTFfZGlzYXNzb2NpYXRlKGllZWUpOwotCQlicmVhazsKLQkgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7Ci0gICAgICAgIH0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGllZWU4MDIxMV93eF9zZXRfYXV0aChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZGF0YSwgY2hhciAqZXh0cmEpCi17Ci0Jc3dpdGNoIChkYXRhLT5mbGFncyAmIElXX0FVVEhfSU5ERVgpIHsKLSAgICAgICAgY2FzZSBJV19BVVRIX1dQQV9WRVJTSU9OOgotCSAgICAgLypuZWVkIHRvIHN1cHBvcnQgd3BhMiBoZXJlKi8KLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgSVdfQVVUSF9DSVBIRVJfUEFJUldJU0U6Ci0gICAgICAgIGNhc2UgSVdfQVVUSF9DSVBIRVJfR1JPVVA6Ci0gICAgICAgIGNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKLSAgICAgICAgICAgICAgICAvKgotICogICAgICAgICAgICAgICAgICAqIEhvc3QgQVAgZHJpdmVyIGRvZXMgbm90IHVzZSB0aGVzZSBwYXJhbWV0ZXJzIGFuZCBhbGxvd3MKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdwYV9zdXBwbGljYW50IHRvIGNvbnRyb2wgdGhlbSBpbnRlcm5hbGx5LgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJV19BVVRIX1RLSVBfQ09VTlRFUk1FQVNVUkVTOgotICAgICAgICAgICAgICAgIGllZWUtPnRraXBfY291bnRlcm1lYXN1cmVzID0gZGF0YS0+dmFsdWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSVdfQVVUSF9EUk9QX1VORU5DUllQVEVEOgotICAgICAgICAgICAgICAgIGllZWUtPmRyb3BfdW5lbmNyeXB0ZWQgPSBkYXRhLT52YWx1ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIElXX0FVVEhfODAyMTFfQVVUSF9BTEc6Ci0JCWlmKGRhdGEtPnZhbHVlICYgSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSl7Ci0JCQlpZWVlLT5vcGVuX3dlcCA9IDA7Ci0JCQlpZWVlLT5hdXRoX21vZGUgPSAxOwotCQl9Ci0JCWVsc2UgaWYoZGF0YS0+dmFsdWUgJiBJV19BVVRIX0FMR19PUEVOX1NZU1RFTSl7Ci0JCQlpZWVlLT5vcGVuX3dlcCA9IDE7Ci0JCQlpZWVlLT5hdXRoX21vZGUgPSAwOwotCQl9Ci0JCWVsc2UgaWYoZGF0YS0+dmFsdWUgJiBJV19BVVRIX0FMR19MRUFQKXsKLQkJCWllZWUtPm9wZW5fd2VwID0gMTsKLQkJCWllZWUtPmF1dGhfbW9kZSA9IDI7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWJyZWFrOwotCi0jaWYgMQotCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKLQkJaWVlZS0+d3BhX2VuYWJsZWQgPSAoZGF0YS0+dmFsdWUpPzE6MDsKLQkJYnJlYWs7Ci0KLSNlbmRpZgotCWNhc2UgSVdfQVVUSF9SWF9VTkVOQ1JZUFRFRF9FQVBPTDoKLSAgICAgICAgICAgICAgICBpZWVlLT5pZWVlODAyXzF4ID0gZGF0YS0+dmFsdWU7Ci0JCWJyZWFrOwotCWNhc2UgSVdfQVVUSF9QUklWQUNZX0lOVk9LRUQ6Ci0JCWllZWUtPnByaXZhY3lfaW52b2tlZCA9IGRhdGEtPnZhbHVlOwotCQlicmVhazsKLQlkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLSNpZiAxCi1pbnQgaWVlZTgwMjExX3d4X3NldF9nZW5faWUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4ICppZSwgc2l6ZV90IGxlbikKLXsKLQl1OCAqYnVmOwotCi0JaWYgKGxlbj5NQVhfV1BBX0lFX0xFTiB8fCAobGVuICYmIGllID09IE5VTEwpKQotCXsKLQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQotCWlmIChsZW4pCi0JewotCQlpZiAobGVuICE9IGllWzFdKzIpCi0JCXsKLQkJCXByaW50aygibGVuOiV6dSwgaWU6JWRcbiIsIGxlbiwgaWVbMV0pOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJYnVmID0ga21lbWR1cChpZSwgbGVuLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGJ1ZiA9PSBOVUxMKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCWtmcmVlKGllZWUtPndwYV9pZSk7Ci0JCWllZWUtPndwYV9pZSA9IGJ1ZjsKLQkJaWVlZS0+d3BhX2llX2xlbiA9IGxlbjsKLQl9Ci0JZWxzZXsKLQkJa2ZyZWUoaWVlZS0+d3BhX2llKTsKLQkJaWVlZS0+d3BhX2llID0gTlVMTDsKLQkJaWVlZS0+d3BhX2llX2xlbiA9IDA7Ci0JfQotCXJldHVybiAwOwotCi19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvcnRsODE5eF9CQS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9ydGw4MTl4X0JBLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZGM4YmY5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvcnRsODE5eF9CQS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotI2lmbmRlZiBfQkFUWVBFX0hfCi0jZGVmaW5lIF9CQVRZUEVfSF8KLQotI2RlZmluZSAJVE9UQUxfVFhCQV9OVU0JMTYKLSNkZWZpbmUJVE9UQUxfUlhCQV9OVU0JMTYKLQotI2RlZmluZQlCQV9TRVRVUF9USU1FT1VUCTIwMAotI2RlZmluZQlCQV9JTkFDVF9USU1FT1VUCTYwMDAwCi0KLSNkZWZpbmUJQkFfUE9MSUNZX0RFTEFZRUQJCTAKLSNkZWZpbmUJQkFfUE9MSUNZX0lNTUVESUFURQkxCi0KLSNkZWZpbmUJQUREQkFfU1RBVFVTX1NVQ0NFU1MJCQkwCi0jZGVmaW5lCUFEREJBX1NUQVRVU19SRUZVU0VECQkzNwotI2RlZmluZQlBRERCQV9TVEFUVVNfSU5WQUxJRF9QQVJBTQkzOAotCi0jZGVmaW5lCURFTEJBX1JFQVNPTl9RU1RBX0xFQVZJTkcJMzYKLSNkZWZpbmUJREVMQkFfUkVBU09OX0VORF9CQQkJCTM3Ci0jZGVmaW5lCURFTEJBX1JFQVNPTl9VTktOT1dOX0JBCTM4Ci0jZGVmaW5lCURFTEJBX1JFQVNPTl9USU1FT1VUCQkJMzkKLS8qICB3aGV0aGVyIG5lZWQgZGVmaW5lIEJBIEFjdGlvbiBmcmFtZXMgaGVyZT8KLXN0cnVjdCBpZWVlODAyMTFfQUREQkFfUmVxewotCXN0cnVjdCBpZWVlODAyMTFfaGVhZGVyX2RhdGEgaGVhZGVyOwotCXU4CWNhdGVnb3J5OwotCXU4Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLSovCi0vL0lzIHRoaXMgbmVlZD9JIHB1dCBoZXJlIGp1c3QgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZGVmaW5lIHN0cnVjdHVyZSBCQV9SRUNPUkQgLy9XQgotdHlwZWRlZiB1bmlvbiBfU0VRVUVOQ0VfQ09OVFJPTHsKLQl1MTYgU2hvcnREYXRhOwotCXN0cnVjdAotCXsKLQkJdTE2CUZyYWdOdW06NDsKLQkJdTE2CVNlcU51bToxMjsKLQl9ZmllbGQ7Ci19U0VRVUVOQ0VfQ09OVFJPTCwgKlBTRVFVRU5DRV9DT05UUk9MOwotCi10eXBlZGVmIHVuaW9uIF9CQV9QQVJBTV9TRVQgewotCXU4IGNoYXJEYXRhWzJdOwotCXUxNiBzaG9ydERhdGE7Ci0Jc3RydWN0IHsKLQkJdTE2IEFNU0RVX1N1cHBvcnQ6MTsKLQkJdTE2IEJBUG9saWN5OjE7Ci0JCXUxNiBUSUQ6NDsKLQkJdTE2IEJ1ZmZlclNpemU6MTA7Ci0JfSBmaWVsZDsKLX0gQkFfUEFSQU1fU0VULCAqUEJBX1BBUkFNX1NFVDsKLQotdHlwZWRlZiB1bmlvbiBfREVMQkFfUEFSQU1fU0VUIHsKLQl1OCBjaGFyRGF0YVsyXTsKLQl1MTYgc2hvcnREYXRhOwotCXN0cnVjdCB7Ci0JCXUxNiBSZXNlcnZlZDoxMTsKLQkJdTE2IEluaXRpYXRvcjoxOwotCQl1MTYgVElEOjQ7Ci0JfSBmaWVsZDsKLX0gREVMQkFfUEFSQU1fU0VULCAqUERFTEJBX1BBUkFNX1NFVDsKLQotdHlwZWRlZiBzdHJ1Y3QgX0JBX1JFQ09SRCB7Ci0Jc3RydWN0IHRpbWVyX2xpc3QJCVRpbWVyOwotCXU4CQkJCWJWYWxpZDsKLQl1OAkJCQlEaWFsb2dUb2tlbjsKLQlCQV9QQVJBTV9TRVQJCUJhUGFyYW1TZXQ7Ci0JdTE2CQkJCUJhVGltZW91dFZhbHVlOwotCVNFUVVFTkNFX0NPTlRST0wJQmFTdGFydFNlcUN0cmw7Ci19IEJBX1JFQ09SRCwgKlBCQV9SRUNPUkQ7Ci0KLSNlbmRpZiAvL2VuZCBfQkFUWVBFX0hfCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvcnRsODE5eF9CQVByb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvcnRsODE5eF9CQVByb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY5MGNiYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL3J0bDgxOXhfQkFQcm9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NzYgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBjcmVhdGVkIHRvIHByb2Nlc3MgQkEgQWN0aW9uIEZyYW1lLiBBY2NvcmRpbmcgdG8gODAyLjExIHNwZWMsCi0gKiB0aGVyZSBhcmUgMyBCQSBhY3Rpb24gdHlwZXMgYXQgYWxsLiBBbmQgYXMgQkEgaXMgcmVsYXRlZCB0byBUUywgdGhpcyBwYXJ0Ci0gKiBuZWVkIHNvbWUgc3RydXR1cmUgZGVmaW5lZCBpbiBRT1Mgc2lkZSBjb2RlLiBBbHNvIFRYIFJYIGlzIGdvaW5nIHRvIGJlCi0gKiByZXN0dXJjdHVyZWQsIHNvIGhvdyB0byBzZW5kIEFEREJBUkVRIEFEREJBUlNQIGFuZCBERUxCQSBwYWNrZXQgaXMgc3RpbGwKLSAqIG9uIGNvbnNpZGVyYXRpb24uIFRlbXBvcmFyaWx5IHVzZSBNQU5BR0UgUVVFVUUgaW5zdGVhZCBvZiBOb3JtYWwgUXVldWUuCi0gKi8KLSNpbmNsdWRlICJpZWVlODAyMTEuaCIKLSNpbmNsdWRlICJydGw4MTl4X0JBLmgiCi0KLS8qCi0gKiBBY3RpdmF0ZSBCQSBlbnRyeS4gQW5kIGlmIFRpbWUgaXMgbm96ZXJvLCBzdGFydCB0aW1lci4KLSAqLwotdm9pZCBBY3RpdmF0ZUJBRW50cnkoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIFBCQV9SRUNPUkQgcEJBLCB1MTYgVGltZSkKLXsKLQlwQkEtPmJWYWxpZCA9IHRydWU7Ci0JaWYoVGltZSAhPSAwKQotCQltb2RfdGltZXIoJnBCQS0+VGltZXIsIGppZmZpZXMgKyBNU0VDUyhUaW1lKSk7Ci19Ci0KLS8qCi0gKiBkZWFjdGl2YXRlIEJBIGVudHJ5LCBpbmNsdWRpbmcgaXRzIHRpbWVyLgotICovCi12b2lkIERlQWN0aXZhdGVCQUVudHJ5KCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgUEJBX1JFQ09SRCBwQkEpCi17Ci0JcEJBLT5iVmFsaWQgPSBmYWxzZTsKLQlkZWxfdGltZXJfc3luYygmcEJBLT5UaW1lcik7Ci19Ci0KLS8qCi0gKiBkZWFjdGl2ZXRlIEJBIGVudHJ5IGluIFR4IFRzLCBhbmQgc2VuZCBERUxCQS4KLSAqLwotdTggVHhUc0RlbGV0ZUJBKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgUFRYX1RTX1JFQ09SRAlwVHhUcykKLXsKLQlQQkFfUkVDT1JECQlwQWRtaXR0ZWRCYSA9ICZwVHhUcy0+VHhBZG1pdHRlZEJBUmVjb3JkOyAgLy9UaGVzZSB0d28gQkEgZW50cmllcyBtdXN0IGV4aXN0IGluIFRTIHN0cnVjdHVyZQotCVBCQV9SRUNPUkQJCXBQZW5kaW5nQmEgPSAmcFR4VHMtPlR4UGVuZGluZ0JBUmVjb3JkOwotCXU4CQkJYlNlbmRERUxCQSA9IGZhbHNlOwotCi0JLy8gRGVsZXRlIHBlbmRpbmcgQkEKLQlpZihwUGVuZGluZ0JhLT5iVmFsaWQpCi0JewotCQlEZUFjdGl2YXRlQkFFbnRyeShpZWVlLCBwUGVuZGluZ0JhKTsKLQkJYlNlbmRERUxCQSA9IHRydWU7Ci0JfQotCi0JLy8gRGVsZXRlIGFkbWl0dGVkIEJBCi0JaWYocEFkbWl0dGVkQmEtPmJWYWxpZCkKLQl7Ci0JCURlQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBBZG1pdHRlZEJhKTsKLQkJYlNlbmRERUxCQSA9IHRydWU7Ci0JfQotCi0JcmV0dXJuIGJTZW5kREVMQkE7Ci19Ci0KLS8qCi0gKiBkZWFjdGl2ZXRlIEJBIGVudHJ5IGluIFR4IFRzLCBhbmQgc2VuZCBERUxCQS4KLSAqLwotdTggUnhUc0RlbGV0ZUJBKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgUFJYX1RTX1JFQ09SRAlwUnhUcykKLXsKLQlQQkFfUkVDT1JECQlwQmEgPSAmcFJ4VHMtPlJ4QWRtaXR0ZWRCQVJlY29yZDsKLQl1OAkJCWJTZW5kREVMQkEgPSBmYWxzZTsKLQotCWlmKHBCYS0+YlZhbGlkKQotCXsKLQkJRGVBY3RpdmF0ZUJBRW50cnkoaWVlZSwgcEJhKTsKLQkJYlNlbmRERUxCQSA9IHRydWU7Ci0JfQotCi0JcmV0dXJuIGJTZW5kREVMQkE7Ci19Ci0KLS8qCi0gKiByZXNldCBCQSBlbnRyeQotICovCi12b2lkIFJlc2V0QmFFbnRyeSggUEJBX1JFQ09SRCBwQkEpCi17Ci0JcEJBLT5iVmFsaWQJCQk9IGZhbHNlOwotCXBCQS0+QmFQYXJhbVNldC5zaG9ydERhdGEJPSAwOwotCXBCQS0+QmFUaW1lb3V0VmFsdWUJCT0gMDsKLQlwQkEtPkRpYWxvZ1Rva2VuCQk9IDA7Ci0JcEJBLT5CYVN0YXJ0U2VxQ3RybC5TaG9ydERhdGEJPSAwOwotfQotCi0vKgotICogY29uc3RydWN0IEFEREJBUkVRIGFuZCBBRERCQVJTUCBmcmFtZSBoZXJlIHRvZ2V0aGVyLgotICogcmV0dXJuIGNvbnN0cnVjdGVkIHNrYiB0byB4bWl0Ci0gKi8KLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiogaWVlZTgwMjExX0FEREJBKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogRHN0LCBQQkFfUkVDT1JEIHBCQSwgdTE2IFN0YXR1c0NvZGUsIHU4IHR5cGUpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7Ci0JIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKiBCQVJlcSA9IE5VTEw7Ci0JdTgqIHRhZyA9IE5VTEw7Ci0JdTE2IHRtcCA9IDA7Ci0JdTE2IGxlbiA9IGllZWUtPnR4X2hlYWRyb29tICsgOTsKLQkvL2NhdGVnb3J5KDEpICsgYWN0aW9uIGZpZWxkKDEpICsgRGlhbG9nIFRva2VuKDEpICsgQkEgUGFyYW1ldGVyIFNldCgyKSArICBCQSBUaW1lb3V0IFZhbHVlKDIpICsgIEJBIFN0YXJ0IFNlcUN0cmwoMikob3IgU3RhdHVzQ29kZSgyKSkKLQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1RSQUNFIHwgSUVFRTgwMjExX0RMX0JBLCAiPT09PT09PT0+JXMoKSwgZnJhbWUoJWQpIHNlbnRkIHRvOiVwTSwgaWVlZS0+ZGV2OiVwXG4iLCBfX0ZVTkNUSU9OX18sIHR5cGUsIERzdCwgaWVlZS0+ZGV2KTsKLQlpZiAocEJBID09IE5VTEx8fGllZWUgPT0gTlVMTCkKLQl7Ci0JCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAicEJBKCVwKSBpcyBOVUxMIG9yIGllZWUoJXApIGlzIE5VTExcbiIsIHBCQSwgaWVlZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbiArIHNpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKTsgLy9uZWVkIHRvIGFkZCBzb21ldGhpbmcgb3RoZXJzPyBGSVhNRQotCWlmIChza2IgPT0gTlVMTCkKLQl7Ci0JCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiY2FuJ3QgYWxsb2Mgc2tiIGZvciBBRERCQV9SRVFcbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQltZW1zZXQoc2tiLT5kYXRhLCAwLCBzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7ICAJLy9JIHdvbmRlciB3aGV0aGVyIGl0J3MgbmVjZXNzYXJ5LiBBcHBhcmVudGx5IGtlcm5lbCB3aWxsIG5vdCBkbyBpdCB3aGVuIGFsbG9jIGEgc2tiLgotCXNrYl9yZXNlcnZlKHNrYiwgaWVlZS0+dHhfaGVhZHJvb20pOwotCi0JQkFSZXEgPSAoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICopIHNrYl9wdXQoc2tiLHNpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKTsKLQotCW1lbWNweShCQVJlcS0+YWRkcjEsIERzdCwgRVRIX0FMRU4pOwotCW1lbWNweShCQVJlcS0+YWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQotCW1lbWNweShCQVJlcS0+YWRkcjMsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOwotCi0JQkFSZXEtPmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9NQU5BR0VfQUNUKTsgLy9hY3Rpb24gZnJhbWUKLQotCS8vdGFnICs9IHNpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOyAvL21vdmUgdG8gYWN0aW9uIGZpZWxkCi0JdGFnID0gKHU4Kilza2JfcHV0KHNrYiwgOSk7Ci0JKnRhZyArKz0gQUNUX0NBVF9CQTsKLQkqdGFnICsrPSB0eXBlOwotCS8vIERpYWxvZyBUb2tlbgotCSp0YWcgKys9IHBCQS0+RGlhbG9nVG9rZW47Ci0KLQlpZiAoQUNUX0FEREJBUlNQID09IHR5cGUpCi0JewotCQkvLyBTdGF0dXMgQ29kZQotCQlwcmludGsoIj09PT09PnRvIHNlbmQgQUREQkFSU1BcbiIpOwotCQl0bXAgPSBjcHVfdG9fbGUxNihTdGF0dXNDb2RlKTsKLQkJbWVtY3B5KHRhZywgKHU4KikmdG1wLCAyKTsKLQkJdGFnICs9IDI7Ci0JfQotCS8vIEJBIFBhcmFtZXRlciBTZXQKLQl0bXAgPSBjcHVfdG9fbGUxNihwQkEtPkJhUGFyYW1TZXQuc2hvcnREYXRhKTsKLQltZW1jcHkodGFnLCAodTgqKSZ0bXAsIDIpOwotCXRhZyArPSAyOwotCS8vIEJBIFRpbWVvdXQgVmFsdWUKLQl0bXAgPSBjcHVfdG9fbGUxNihwQkEtPkJhVGltZW91dFZhbHVlKTsKLQltZW1jcHkodGFnLCAodTgqKSZ0bXAsIDIpOwotCXRhZyArPSAyOwotCi0JaWYgKEFDVF9BRERCQVJFUSA9PSB0eXBlKQotCXsKLQkvLyBCQSBTdGFydCBTZXFDdHJsCi0JCW1lbWNweSh0YWcsKHU4KikmKHBCQS0+QmFTdGFydFNlcUN0cmwpLCAyKTsKLQkJdGFnICs9IDI7Ci0JfQotCi0JSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEF8SUVFRTgwMjExX0RMX0JBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQlyZXR1cm4gc2tiOwotCS8vcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBjb25zdHJ1Y3QgREVMQkEgZnJhbWUKLSAqLwotc3RhdGljIHN0cnVjdCBza19idWZmKiBpZWVlODAyMTFfREVMQkEoCi0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsCi0JdTgqCQkgICAgICAgICBkc3QsCi0JUEJBX1JFQ09SRAkJIHBCQSwKLQlUUl9TRUxFQ1QJCSBUeFJ4U2VsZWN0LAotCXUxNgkJCSBSZWFzb25Db2RlCi0JKQotewotCURFTEJBX1BBUkFNX1NFVAlEZWxiYVBhcmFtU2V0OwotCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwotCSBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciogRGVsYmEgPSBOVUxMOwotCXU4KiB0YWcgPSBOVUxMOwotCXUxNiB0bXAgPSAwOwotCS8vbGVuID0gaGVhZCBsZW4gKyBERUxCQSBQYXJhbWV0ZXIgU2V0KDIpICsgUmVhc29uIENvZGUoMikKLQl1MTYgbGVuID0gNiArIGllZWUtPnR4X2hlYWRyb29tOwotCi0JaWYgKG5ldF9yYXRlbGltaXQoKSkKLQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1RSQUNFIHwgSUVFRTgwMjExX0RMX0JBLCAiPT09PT09PT0+JXMoKSwgUmVhc29uQ29kZSglZCkgc2VudGQgdG86JXBNXG4iLCBfX0ZVTkNUSU9OX18sIFJlYXNvbkNvZGUsIGRzdCk7Ci0KLQltZW1zZXQoJkRlbGJhUGFyYW1TZXQsIDAsIDIpOwotCi0JRGVsYmFQYXJhbVNldC5maWVsZC5Jbml0aWF0b3IJPSAoVHhSeFNlbGVjdD09VFhfRElSKT8xOjA7Ci0JRGVsYmFQYXJhbVNldC5maWVsZC5USUQJPSBwQkEtPkJhUGFyYW1TZXQuZmllbGQuVElEOwotCi0Jc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyBzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7IC8vbmVlZCB0byBhZGQgc29tZXRoaW5nIG90aGVycz8gRklYTUUKLQlpZiAoc2tiID09IE5VTEwpCi0JewotCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImNhbid0IGFsbG9jIHNrYiBmb3IgQUREQkFfUkVRXG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotLy8JbWVtc2V0KHNrYi0+ZGF0YSwgMCwgbGVuK3NpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpKTsKLQlza2JfcmVzZXJ2ZShza2IsIGllZWUtPnR4X2hlYWRyb29tKTsKLQotCURlbGJhID0gKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKSBza2JfcHV0KHNrYixzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSk7Ci0KLQltZW1jcHkoRGVsYmEtPmFkZHIxLCBkc3QsIEVUSF9BTEVOKTsKLQltZW1jcHkoRGVsYmEtPmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KERlbGJhLT5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7Ci0JRGVsYmEtPmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9NQU5BR0VfQUNUKTsgLy9hY3Rpb24gZnJhbWUKLQotCXRhZyA9ICh1OCopc2tiX3B1dChza2IsIDYpOwotCi0JKnRhZyArKz0gQUNUX0NBVF9CQTsKLQkqdGFnICsrPSBBQ1RfREVMQkE7Ci0KLQkvLyBERUxCQSBQYXJhbWV0ZXIgU2V0Ci0JdG1wID0gY3B1X3RvX2xlMTYoRGVsYmFQYXJhbVNldC5zaG9ydERhdGEpOwotCW1lbWNweSh0YWcsICh1OCopJnRtcCwgMik7Ci0JdGFnICs9IDI7Ci0JLy8gUmVhc29uIENvZGUKLQl0bXAgPSBjcHVfdG9fbGUxNihSZWFzb25Db2RlKTsKLQltZW1jcHkodGFnLCAodTgqKSZ0bXAsIDIpOwotCXRhZyArPSAyOwotCi0JSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEF8SUVFRTgwMjExX0RMX0JBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfVFJBQ0UgfCBJRUVFODAyMTFfRExfQkEsICI8PT09PT0lcygpXG4iLCBfX0ZVTkNUSU9OX18pOwotCXJldHVybiBza2I7Ci19Ci0KLS8qCi0gKiBzZW5kIEFEREJBUmVxIGZyYW1lIG91dAotICogSWYgYW55IHBvc3NpYmxlLCBwbGVhc2UgaGlkZSBwQkEgaW4gaWVlZS4KLSAqIEFuZCB0ZW1wb3JhcmlseSB1c2UgTWFuYWdlIFF1ZXVlIGFzIHNvZnRtYWNfbWdtdF94bWl0KCkgdXN1YWxseSBkb2VzCi0gKi8KLXZvaWQgaWVlZTgwMjExX3NlbmRfQUREQkFSZXEoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4Kglkc3QsIFBCQV9SRUNPUkQJcEJBKQotewotCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwotCXNrYiA9IGllZWU4MDIxMV9BRERCQShpZWVlLCBkc3QsIHBCQSwgMCwgQUNUX0FEREJBUkVRKTsgLy9jb25zdHJ1Y3QgQUNUX0FEREJBUkVRIGZyYW1lcyBzbyBzZXQgc3RhdHVzY29kZSB6ZXJvLgotCi0JaWYgKHNrYikKLQl7Ci0JCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7Ci0JCS8vYWRkIHN0YXRpc3RpYyBuZWVkZWQgaGVyZS4KLQkJLy9hbmQgc2tiIHdpbGwgYmUgZnJlZWQgaW4gc29mdG1hY19tZ210X3htaXQoKSwgc28gb21pdCBhbGwgZGV2X2tmcmVlX3NrYl9hbnkoKSBvdXRzaWRlIHNvZnRtYWNfbWdtdF94bWl0KCkKLQkJLy9XQgotCX0KLQllbHNlCi0JewotCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImFsbG9jIHNrYiBlcnJvciBpbiBmdW5jdGlvbiAlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwotCX0KLX0KLQotLyoKLSAqIHNlbmQgQUREQkFSU1AgZnJhbWUgb3V0Ci0gKiAgSWYgYW55IHBvc3NpYmxlLCBwbGVhc2UgaGlkZSBwQkEgaW4gaWVlZS4KLSAqIEFuZCB0ZW1wb3JhcmlseSB1c2UgTWFuYWdlIFF1ZXVlIGFzIHNvZnRtYWNfbWdtdF94bWl0KCkgdXN1YWxseSBkb2VzCi0gKi8KLXZvaWQgaWVlZTgwMjExX3NlbmRfQUREQkFSc3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4KiBkc3QsIFBCQV9SRUNPUkQgcEJBLCB1MTYgU3RhdHVzQ29kZSkKLXsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKLQlza2IgPSBpZWVlODAyMTFfQUREQkEoaWVlZSwgZHN0LCBwQkEsIFN0YXR1c0NvZGUsIEFDVF9BRERCQVJTUCk7IC8vY29uc3RydWN0IEFDVF9BRERCQVJTUCBmcmFtZXMKLQlpZiAoc2tiKQotCXsKLQkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKLQkJLy9zYW1lIGFib3ZlCi0JfQotCWVsc2UKLQl7Ci0JCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiYWxsb2Mgc2tiIGVycm9yIGluIGZ1bmN0aW9uICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JfQotfQotCi0vKgotICogc2VuZCBBRERCQVJTUCBmcmFtZSBvdXQKLSAqIElmIGFueSBwb3NzaWJsZSwgcGxlYXNlIGhpZGUgcEJBIGluIGllZWUuCi0gKiBBbmQgdGVtcG9yYXJpbHkgdXNlIE1hbmFnZSBRdWV1ZSBhcyBzb2Z0bWFjX21nbXRfeG1pdCgpIHVzdWFsbHkgZG9lcwotICovCi12b2lkIGllZWU4MDIxMV9zZW5kX0RFTEJBKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogZHN0LCBQQkFfUkVDT1JEIHBCQSwgVFJfU0VMRUNUIFR4UnhTZWxlY3QsIHUxNiBSZWFzb25Db2RlKQotewotCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwotCXNrYiA9IGllZWU4MDIxMV9ERUxCQShpZWVlLCBkc3QsIHBCQSwgVHhSeFNlbGVjdCwgUmVhc29uQ29kZSk7IC8vY29uc3RydWN0IEFDVF9BRERCQVJTUCBmcmFtZXMKLQlpZiAoc2tiKQotCXsKLQkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKLQkJLy9zYW1lIGFib3ZlCi0JfQotCWVsc2UKLQl7Ci0JCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiYWxsb2Mgc2tiIGVycm9yIGluIGZ1bmN0aW9uICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JfQotCXJldHVybiA7Ci19Ci0KLWludCBpZWVlODAyMTFfcnhfQUREQkFSZXEoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCSBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciogcmVxID0gTlVMTDsKLQl1MTYgcmMgPSAwOwotCXU4ICogZHN0ID0gTlVMTCwgKnBEaWFsb2dUb2tlbiA9IE5VTEwsICp0YWcgPSBOVUxMOwotCVBCQV9SRUNPUkQgcEJBID0gTlVMTDsKLQlQQkFfUEFSQU1fU0VUCXBCYVBhcmFtU2V0ID0gTlVMTDsKLQl1MTYqIHBCYVRpbWVvdXRWYWwgPSBOVUxMOwotCVBTRVFVRU5DRV9DT05UUk9MIHBCYVN0YXJ0U2VxQ3RybCA9IE5VTEw7Ci0JUFJYX1RTX1JFQ09SRAlwVFMgPSBOVUxMOwotCi0JaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyA5KQotCXsKLQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICIgSW52YWxpZCBza2IgbGVuIGluIEJBUkVRKCVkIC8gJXp1KVxuIiwgc2tiLT5sZW4sIAkoc2l6ZW9mKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKyA5KSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlJRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfREFUQXxJRUVFODAyMTFfRExfQkEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCi0JcmVxID0gKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciopIHNrYi0+ZGF0YTsKLQl0YWcgPSAodTgqKXJlcTsKLQlkc3QgPSAodTgqKSgmcmVxLT5hZGRyMlswXSk7Ci0JdGFnICs9IHNpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwotCXBEaWFsb2dUb2tlbiA9IHRhZyArIDI7ICAvL2NhdGVnb3J5K2FjdGlvbgotCXBCYVBhcmFtU2V0ID0gKFBCQV9QQVJBTV9TRVQpKHRhZyArIDMpOyAgIC8vK0RpYWxvZ1Rva2VuCi0JcEJhVGltZW91dFZhbCA9ICh1MTYqKSh0YWcgKyA1KTsKLQlwQmFTdGFydFNlcUN0cmwgPSAoUFNFUVVFTkNFX0NPTlRST0wpKHJlcSArIDcpOwotCi0JcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT5yeCBBRERCQVJFUSBmcm9tIDolcE1cbiIsIGRzdCk7Ci0vL3NvbWUgb3RoZXIgY2FwYWJpbGl0eSBpcyBub3QgcmVhZHkgbm93LgotCWlmKAkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSA9PSAwKSB8fAotCQkoaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPT0gZmFsc2UpKSAvL3x8Ci0JLy8JKGllZWUtPnBTdGFRb3MtPmJFbmFibGVSeEltbUJBID09IGZhbHNlKQkpCi0JewotCQlyYyA9IEFEREJBX1NUQVRVU19SRUZVU0VEOwotCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIkZhaWxlZCB0byByZXBseSBvbiBBRERCQV9SRVEgYXMgc29tZSBjYXBhYmlsaXR5IGlzIG5vdCByZWFkeSglZCwgJWQpXG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlLCBpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCk7Ci0JCWdvdG8gT25BRERCQVJlcV9GYWlsOwotCX0KLQkvLyBTZWFyY2ggZm9yIHJlbGF0ZWQgdHJhZmZpYyBzdHJlYW0uCi0JLy8gSWYgdGhlcmUgaXMgbm8gbWF0Y2hlZCBUUywgcmVqZWN0IHRoZSBBRERCQSByZXF1ZXN0LgotCWlmKAkhR2V0VHMoCi0JCQlpZWVlLAotCQkJKFBUU19DT01NT05fSU5GTyopKCZwVFMpLAotCQkJZHN0LAotCQkJKHU4KShwQmFQYXJhbVNldC0+ZmllbGQuVElEKSwKLQkJCVJYX0RJUiwKLQkJCXRydWUpCSkKLQl7Ci0JCXJjID0gQUREQkFfU1RBVFVTX1JFRlVTRUQ7Ci0JCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiY2FuJ3QgZ2V0IFRTIGluICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCWdvdG8gT25BRERCQVJlcV9GYWlsOwotCX0KLQlwQkEgPSAmcFRTLT5SeEFkbWl0dGVkQkFSZWNvcmQ7Ci0JLy8gVG8gRGV0ZXJtaW5lIHRoZSBBRERCQSBSZXEgY29udGVudAotCS8vIFdlIGNhbiBkbyBtdWNoIG1vcmUgY2hlY2sgaGVyZSwgaW5jbHVkaW5nIEJ1ZmZlclNpemUsIEFNU0RVX1N1cHBvcnQsIFBvbGljeSwgU3RhcnRTZXFDdHJsLi4uCi0JLy8gSSB3YW50IHRvIGNoZWNrIFN0YXJ0U2VxQ3RybCB0byBtYWtlIHN1cmUgd2hlbiB3ZSBzdGFydCBhZ2dyZWdhdGlvbiEhIQotCS8vCi0JaWYocEJhUGFyYW1TZXQtPmZpZWxkLkJBUG9saWN5ID09IEJBX1BPTElDWV9ERUxBWUVEKQotCXsKLQkJcmMgPSBBRERCQV9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKLQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJCQSBQb2xpY3kgaXMgbm90IGNvcnJlY3QgaW4gJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKLQkJZ290byBPbkFEREJBUmVxX0ZhaWw7Ci0JfQotCQkvLyBBZG1pdCB0aGUgQUREQkEgUmVxdWVzdAotCS8vCi0JRGVBY3RpdmF0ZUJBRW50cnkoaWVlZSwgcEJBKTsKLQlwQkEtPkRpYWxvZ1Rva2VuID0gKnBEaWFsb2dUb2tlbjsKLQlwQkEtPkJhUGFyYW1TZXQgPSAqcEJhUGFyYW1TZXQ7Ci0JcEJBLT5CYVRpbWVvdXRWYWx1ZSA9ICpwQmFUaW1lb3V0VmFsOwotCXBCQS0+QmFTdGFydFNlcUN0cmwgPSAqcEJhU3RhcnRTZXFDdHJsOwotCS8vZm9yIGhhbGYgTiBtb2RlIHdlIG9ubHkgYWdncmVnYXRlIDEgZnJhbWUKLQlpZiAoaWVlZS0+R2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzSGFuZGxlcihpZWVlKSkKLQlwQkEtPkJhUGFyYW1TZXQuZmllbGQuQnVmZmVyU2l6ZSA9IDE7Ci0JZWxzZQotCXBCQS0+QmFQYXJhbVNldC5maWVsZC5CdWZmZXJTaXplID0gMzI7Ci0JQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBCQSwgcEJBLT5CYVRpbWVvdXRWYWx1ZSk7Ci0JaWVlZTgwMjExX3NlbmRfQUREQkFSc3AoaWVlZSwgZHN0LCBwQkEsIEFEREJBX1NUQVRVU19TVUNDRVNTKTsKLQotCS8vIEVuZCBvZiBwcm9jZWR1cmUuCi0JcmV0dXJuIDA7Ci0KLU9uQUREQkFSZXFfRmFpbDoKLQl7Ci0JCUJBX1JFQ09SRAlCQTsKLQkJQkEuQmFQYXJhbVNldCA9ICpwQmFQYXJhbVNldDsKLQkJQkEuQmFUaW1lb3V0VmFsdWUgPSAqcEJhVGltZW91dFZhbDsKLQkJQkEuRGlhbG9nVG9rZW4gPSAqcERpYWxvZ1Rva2VuOwotCQlCQS5CYVBhcmFtU2V0LmZpZWxkLkJBUG9saWN5ID0gQkFfUE9MSUNZX0lNTUVESUFURTsKLQkJaWVlZTgwMjExX3NlbmRfQUREQkFSc3AoaWVlZSwgZHN0LCAmQkEsIHJjKTsKLQkJcmV0dXJuIDA7IC8vd2Ugc2VuZCBSU1Agb3V0LgotCX0KLQotfQotCi1pbnQgaWVlZTgwMjExX3J4X0FEREJBUnNwKCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQkgc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIqIHJzcCA9IE5VTEw7Ci0JUEJBX1JFQ09SRAkJcFBlbmRpbmdCQSwgcEFkbWl0dGVkQkE7Ci0JUFRYX1RTX1JFQ09SRAkJcFRTID0gTlVMTDsKLQl1OCogZHN0ID0gTlVMTCwgKnBEaWFsb2dUb2tlbiA9IE5VTEwsICp0YWcgPSBOVUxMOwotCXUxNiogcFN0YXR1c0NvZGUgPSBOVUxMLCAqcEJhVGltZW91dFZhbCA9IE5VTEw7Ci0JUEJBX1BBUkFNX1NFVAkJcEJhUGFyYW1TZXQgPSBOVUxMOwotCXUxNgkJCVJlYXNvbkNvZGU7Ci0KLQlpZiAoc2tiLT5sZW4gPCBzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSArIDkpCi0JewotCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIiBJbnZhbGlkIHNrYiBsZW4gaW4gQkFSU1AoJWQgLyAlenUpXG4iLCBza2ItPmxlbiwgCShzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKSArIDkpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlyc3AgPSAoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKilza2ItPmRhdGE7Ci0JdGFnID0gKHU4Kilyc3A7Ci0JZHN0ID0gKHU4KikoJnJzcC0+YWRkcjJbMF0pOwotCXRhZyArPSBzaXplb2YoIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyKTsKLQlwRGlhbG9nVG9rZW4gPSB0YWcgKyAyOwotCXBTdGF0dXNDb2RlID0gKHUxNiopKHRhZyArIDMpOwotCXBCYVBhcmFtU2V0ID0gKFBCQV9QQVJBTV9TRVQpKHRhZyArIDUpOwotCXBCYVRpbWVvdXRWYWwgPSAodTE2KikodGFnICsgNyk7Ci0KLQkvLyBDaGVjayB0aGUgY2FwYWJpbGl0eQotCS8vIFNpbmNlIHdlIGNhbiBhbHdheXMgcmVjZWl2ZSBBLU1QRFUsIHdlIGp1c3QgY2hlY2sgaWYgaXQgaXMgdW5kZXIgSFQgbW9kZS4KLQlpZiggICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUgPT0gMCAgfHwKLQkJaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPT0gZmFsc2UgfHwKLQkJaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRBTVBEVUVuYWJsZSA9PSBmYWxzZSApCi0JewotCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgInJlamVjdCB0byBBRERCQV9SU1AgYXMgc29tZSBjYXBhYmlsaXR5IGlzIG5vdCByZWFkeSglZCwgJWQsICVkKVxuIixpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlLCBpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCwgaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRBTVBEVUVuYWJsZSk7Ci0JCVJlYXNvbkNvZGUgPSBERUxCQV9SRUFTT05fVU5LTk9XTl9CQTsKLQkJZ290byBPbkFEREJBUnNwX1JlamVjdDsKLQl9Ci0KLQotCS8vCi0JLy8gU2VhcmNoIGZvciByZWxhdGVkIFRTLgotCS8vIElmIHRoZXJlIGlzIG5vIFRTIGZvdW5kLCB3ZSB3aWwgcmVqZWN0IEFEREJBIFJzcCBieSBzZW5kaW5nIERFTEJBIGZyYW1lLgotCS8vCi0JaWYgKCFHZXRUcygKLQkJCWllZWUsCi0JCQkoUFRTX0NPTU1PTl9JTkZPKikoJnBUUyksCi0JCQlkc3QsCi0JCQkodTgpKHBCYVBhcmFtU2V0LT5maWVsZC5USUQpLAotCQkJVFhfRElSLAotCQkJZmFsc2UpCSkKLQl7Ci0JCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiY2FuJ3QgZ2V0IFRTIGluICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCVJlYXNvbkNvZGUgPSBERUxCQV9SRUFTT05fVU5LTk9XTl9CQTsKLQkJZ290byBPbkFEREJBUnNwX1JlamVjdDsKLQl9Ci0KLQlwVFMtPmJBZGRCYVJlcUluUHJvZ3Jlc3MgPSBmYWxzZTsKLQlwUGVuZGluZ0JBID0gJnBUUy0+VHhQZW5kaW5nQkFSZWNvcmQ7Ci0JcEFkbWl0dGVkQkEgPSAmcFRTLT5UeEFkbWl0dGVkQkFSZWNvcmQ7Ci0KLQotCS8vCi0JLy8gQ2hlY2sgaWYgcmVsYXRlZCBCQSBpcyB3YWl0aW5nIGZvciBzZXR1cC4KLQkvLyBJZiBub3QsIHJlamVjdCBieSBzZW5kaW5nIERFTEJBIGZyYW1lLgotCS8vCi0JaWYoKHBBZG1pdHRlZEJBLT5iVmFsaWQ9PXRydWUpKQotCXsKLQkJLy8gU2luY2UgQkEgaXMgYWxyZWFkeSBzZXR1cCwgd2UgaWdub3JlIGFsbCBvdGhlciBBRERCQSBSZXNwb25zZS4KLQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9CQSwgIk9uQUREQkFSc3AoKTogUmVjdiBBRERCQSBSc3AuIERyb3AgYmVjYXVzZSBhbHJlYWR5IGFkbWl0IGl0ISBcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWVsc2UgaWYoKHBQZW5kaW5nQkEtPmJWYWxpZCA9PSBmYWxzZSkgfHwoKnBEaWFsb2dUb2tlbiAhPSBwUGVuZGluZ0JBLT5EaWFsb2dUb2tlbikpCi0JewotCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgICJPbkFEREJBUnNwKCk6IFJlY3YgQUREQkEgUnNwLiBCQSBpbnZhbGlkLCBERUxCQSEgXG4iKTsKLQkJUmVhc29uQ29kZSA9IERFTEJBX1JFQVNPTl9VTktOT1dOX0JBOwotCQlnb3RvIE9uQUREQkFSc3BfUmVqZWN0OwotCX0KLQllbHNlCi0JewotCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0JBLCAiT25BRERCQVJzcCgpOiBSZWN2IEFEREJBIFJzcC4gQkEgaXMgYWRtaXR0ZWQhIFN0YXR1cyBjb2RlOiVYXG4iLCAqcFN0YXR1c0NvZGUpOwotCQlEZUFjdGl2YXRlQkFFbnRyeShpZWVlLCBwUGVuZGluZ0JBKTsKLQl9Ci0KLQotCWlmKCpwU3RhdHVzQ29kZSA9PSBBRERCQV9TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCS8vCi0JCS8vIERldGVybWluZSBBRERCQSBSc3AgY29udGVudCBoZXJlLgotCQkvLyBXZSBjYW4gY29tcGFyZSB0aGUgdmFsdWUgb2YgQkEgcGFyYW1ldGVyIHNldCB0aGF0IFBlZXIgcmV0dXJuZWQgYW5kIFNlbGYgc2VudC4KLQkJLy8gSWYgaXQgaXMgT0ssIHRoZW4gYWRtaXR0ZWQuIE9yIHdlIGNhbiBzZW5kIERFTEJBIHRvIGNhbmNlbCBCQSBtZWNoYW5pc20uCi0JCS8vCi0JCWlmKHBCYVBhcmFtU2V0LT5maWVsZC5CQVBvbGljeSA9PSBCQV9QT0xJQ1lfREVMQVlFRCkKLQkJewotCQkJLy8gU2luY2UgdGhpcyBpcyBhIGtpbmQgb2YgQUREQkEgZmFpbGVkLCB3ZSBkZWxheSBuZXh0IEFEREJBIHByb2Nlc3MuCi0JCQlwVFMtPmJBZGRCYVJlcURlbGF5ZWQgPSB0cnVlOwotCQkJRGVBY3RpdmF0ZUJBRW50cnkoaWVlZSwgcEFkbWl0dGVkQkEpOwotCQkJUmVhc29uQ29kZSA9IERFTEJBX1JFQVNPTl9FTkRfQkE7Ci0JCQlnb3RvIE9uQUREQkFSc3BfUmVqZWN0OwotCQl9Ci0KLQotCQkvLwotCQkvLyBBZG1pdHRlZCBjb25kaXRpb24KLQkJLy8KLQkJcEFkbWl0dGVkQkEtPkRpYWxvZ1Rva2VuID0gKnBEaWFsb2dUb2tlbjsKLQkJcEFkbWl0dGVkQkEtPkJhVGltZW91dFZhbHVlID0gKnBCYVRpbWVvdXRWYWw7Ci0JCXBBZG1pdHRlZEJBLT5CYVN0YXJ0U2VxQ3RybCA9IHBQZW5kaW5nQkEtPkJhU3RhcnRTZXFDdHJsOwotCQlwQWRtaXR0ZWRCQS0+QmFQYXJhbVNldCA9ICpwQmFQYXJhbVNldDsKLQkJRGVBY3RpdmF0ZUJBRW50cnkoaWVlZSwgcEFkbWl0dGVkQkEpOwotCQlBY3RpdmF0ZUJBRW50cnkoaWVlZSwgcEFkbWl0dGVkQkEsICpwQmFUaW1lb3V0VmFsKTsKLQl9Ci0JZWxzZQotCXsKLQkJLy8gRGVsYXkgbmV4dCBBRERCQSBwcm9jZXNzLgotCQlwVFMtPmJBZGRCYVJlcURlbGF5ZWQgPSB0cnVlOwotCX0KLQotCS8vIEVuZCBvZiBwcm9jZWR1cmUKLQlyZXR1cm4gMDsKLQotT25BRERCQVJzcF9SZWplY3Q6Ci0JewotCQlCQV9SRUNPUkQJQkE7Ci0JCUJBLkJhUGFyYW1TZXQgPSAqcEJhUGFyYW1TZXQ7Ci0JCWllZWU4MDIxMV9zZW5kX0RFTEJBKGllZWUsIGRzdCwgJkJBLCBUWF9ESVIsIFJlYXNvbkNvZGUpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLX0KLQotaW50IGllZWU4MDIxMV9yeF9ERUxCQShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSxzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCSBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciogZGVsYmEgPSBOVUxMOwotCVBERUxCQV9QQVJBTV9TRVQJcERlbEJhUGFyYW1TZXQgPSBOVUxMOwotCXUxNioJCQlwUmVhc29uQ29kZSA9IE5VTEw7Ci0JdTgqCQkJZHN0ID0gTlVMTDsKLQotCWlmIChza2ItPmxlbiA8IHNpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpICsgNikKLQl7Ci0JCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiIEludmFsaWQgc2tiIGxlbiBpbiBERUxCQSglZCAvICV6dSlcbiIsIHNrYi0+bGVuLCAJKHNpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpICsgNikpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSA9PSAwIHx8Ci0JCWllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID09IGZhbHNlICkKLQl7Ci0JCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAicmVjZWl2ZWQgREVMQkEgd2hpbGUgUU9TIG9yIEhUIGlzIG5vdCBzdXBwb3J0ZWQoJWQsICVkKVxuIixpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlLCBpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlJRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfREFUQXxJRUVFODAyMTFfRExfQkEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCWRlbGJhID0gKCBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciopc2tiLT5kYXRhOwotCWRzdCA9ICh1OCopKCZkZWxiYS0+YWRkcjJbMF0pOwotCWRlbGJhICs9IHNpemVvZiggc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIpOwotCXBEZWxCYVBhcmFtU2V0ID0gKFBERUxCQV9QQVJBTV9TRVQpKGRlbGJhKzIpOwotCXBSZWFzb25Db2RlID0gKHUxNiopKGRlbGJhKzQpOwotCi0JaWYocERlbEJhUGFyYW1TZXQtPmZpZWxkLkluaXRpYXRvciA9PSAxKQotCXsKLQkJUFJYX1RTX1JFQ09SRCAJcFJ4VHM7Ci0KLQkJaWYoICFHZXRUcygKLQkJCQlpZWVlLAotCQkJCShQVFNfQ09NTU9OX0lORk8qKSZwUnhUcywKLQkJCQlkc3QsCi0JCQkJKHU4KXBEZWxCYVBhcmFtU2V0LT5maWVsZC5USUQsCi0JCQkJUlhfRElSLAotCQkJCWZhbHNlKQkpCi0JCXsKLQkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAgImNhbid0IGdldCBUUyBmb3IgUlhUUyBpbiAlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJUnhUc0RlbGV0ZUJBKGllZWUsIHBSeFRzKTsKLQl9Ci0JZWxzZQotCXsKLQkJUFRYX1RTX1JFQ09SRAlwVHhUczsKLQotCQlpZighR2V0VHMoCi0JCQlpZWVlLAotCQkJKFBUU19DT01NT05fSU5GTyopJnBUeFRzLAotCQkJZHN0LAotCQkJKHU4KXBEZWxCYVBhcmFtU2V0LT5maWVsZC5USUQsCi0JCQlUWF9ESVIsCi0JCQlmYWxzZSkJKQotCQl7Ci0JCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgICJjYW4ndCBnZXQgVFMgZm9yIFRYVFMgaW4gJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCXBUeFRzLT5iVXNpbmdCYSA9IGZhbHNlOwotCQlwVHhUcy0+YkFkZEJhUmVxSW5Qcm9ncmVzcyA9IGZhbHNlOwotCQlwVHhUcy0+YkFkZEJhUmVxRGVsYXllZCA9IGZhbHNlOwotCQlkZWxfdGltZXJfc3luYygmcFR4VHMtPlRzQWRkQmFUaW1lcik7Ci0JCS8vUGxhdGZvcm1DYW5jZWxUaW1lcihBZGFwdGVyLCAmcFR4VHMtPlRzQWRkQmFUaW1lcik7Ci0JCVR4VHNEZWxldGVCQShpZWVlLCBwVHhUcyk7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKiBBRERCQSBpbml0aWF0ZS4gVGhpcyBjYW4gb25seSBiZSBjYWxsZWQgYnkgVFggc2lkZS4gKi8KLXZvaWQKLVRzSW5pdEFkZEJBKAotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLAotCVBUWF9UU19SRUNPUkQJcFRTLAotCXU4CQlQb2xpY3ksCi0JdTgJCWJPdmVyd3JpdGVQZW5kaW5nCi0JKQotewotCVBCQV9SRUNPUkQJCQlwQkEgPSAmcFRTLT5UeFBlbmRpbmdCQVJlY29yZDsKLQotCWlmKHBCQS0+YlZhbGlkPT10cnVlICYmIGJPdmVyd3JpdGVQZW5kaW5nPT1mYWxzZSkKLQkJcmV0dXJuOwotCi0JLy8gU2V0IHBhcmFtZXRlcnMgdG8gIlBlbmRpbmciIHZhcmlhYmxlIHNldAotCURlQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBCQSk7Ci0KLQlwQkEtPkRpYWxvZ1Rva2VuKys7CQkJCQkJLy8gRGlhbG9nVG9rZW46IE9ubHkga2VlcCB0aGUgbGF0ZXN0IGRpYWxvZyB0b2tlbgotCXBCQS0+QmFQYXJhbVNldC5maWVsZC5BTVNEVV9TdXBwb3J0ID0gMDsJLy8gRG8gbm90IHN1cHBvcnQgQS1NU0RVIHdpdGggQS1NUERVIG5vdyEhCi0JcEJBLT5CYVBhcmFtU2V0LmZpZWxkLkJBUG9saWN5ID0gUG9saWN5OwkvLyBQb2xpY3k6IERlbGF5ZWQgb3IgSW1tZWRpYXRlCi0JcEJBLT5CYVBhcmFtU2V0LmZpZWxkLlRJRCA9IHBUUy0+VHNDb21tb25JbmZvLlRTcGVjLmYuVFNJbmZvLmZpZWxkLnVjVFNJRDsJLy8gVElECi0JLy8gQnVmZmVyU2l6ZTogVGhpcyBuZWVkIHRvIGJlIHNldCBhY2NvcmRpbmcgdG8gQS1NUERVIHZlY3RvcgotCXBCQS0+QmFQYXJhbVNldC5maWVsZC5CdWZmZXJTaXplID0gMzI7CQkvLyBCdWZmZXJTaXplOiBUaGlzIG5lZWQgdG8gYmUgc2V0IGFjY29yZGluZyB0byBBLU1QRFUgdmVjdG9yCi0JcEJBLT5CYVRpbWVvdXRWYWx1ZSA9IDA7CQkJCQkvLyBUaW1lb3V0IHZhbHVlOiBTZXQgMCB0byBkaXNhYmxlIFRpbWVyCi0JcEJBLT5CYVN0YXJ0U2VxQ3RybC5maWVsZC5TZXFOdW0gPSAocFRTLT5UeEN1clNlcSArIDMpICUgNDA5NjsgCS8vIEJsb2NrIEFjayB3aWxsIHN0YXJ0IGFmdGVyIDMgcGFja2V0cyBsYXRlci4KLQotCUFjdGl2YXRlQkFFbnRyeShpZWVlLCBwQkEsIEJBX1NFVFVQX1RJTUVPVVQpOwotCi0JaWVlZTgwMjExX3NlbmRfQUREQkFSZXEoaWVlZSwgcFRTLT5Uc0NvbW1vbkluZm8uQWRkciwgcEJBKTsKLX0KLQotdm9pZAotVHNJbml0RGVsQkEoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBQVFNfQ09NTU9OX0lORk8gcFRzQ29tbW9uSW5mbywgVFJfU0VMRUNUIFR4UnhTZWxlY3QpCi17Ci0KLQlpZihUeFJ4U2VsZWN0ID09IFRYX0RJUikKLQl7Ci0JCVBUWF9UU19SRUNPUkQJcFR4VHMgPSAoUFRYX1RTX1JFQ09SRClwVHNDb21tb25JbmZvOwotCi0JCWlmKFR4VHNEZWxldGVCQShpZWVlLCBwVHhUcykpCi0JCQlpZWVlODAyMTFfc2VuZF9ERUxCQSgKLQkJCQlpZWVlLAotCQkJCXBUc0NvbW1vbkluZm8tPkFkZHIsCi0JCQkJKHBUeFRzLT5UeEFkbWl0dGVkQkFSZWNvcmQuYlZhbGlkKT8oJnBUeFRzLT5UeEFkbWl0dGVkQkFSZWNvcmQpOigmcFR4VHMtPlR4UGVuZGluZ0JBUmVjb3JkKSwKLQkJCQlUeFJ4U2VsZWN0LAotCQkJCURFTEJBX1JFQVNPTl9FTkRfQkEpOwotCX0KLQllbHNlIGlmKFR4UnhTZWxlY3QgPT0gUlhfRElSKQotCXsKLQkJUFJYX1RTX1JFQ09SRAlwUnhUcyA9IChQUlhfVFNfUkVDT1JEKXBUc0NvbW1vbkluZm87Ci0JCWlmKFJ4VHNEZWxldGVCQShpZWVlLCBwUnhUcykpCi0JCQlpZWVlODAyMTFfc2VuZF9ERUxCQSgKLQkJCQlpZWVlLAotCQkJCXBUc0NvbW1vbkluZm8tPkFkZHIsCi0JCQkJJnBSeFRzLT5SeEFkbWl0dGVkQkFSZWNvcmQsCi0JCQkJVHhSeFNlbGVjdCwKLQkJCQlERUxCQV9SRUFTT05fRU5EX0JBCSk7Ci0JfQotfQotCi0vKgotICogIEJBIHNldHVwIHRpbWVyCi0gKiAgYWN0dXJhbGx5IHdlIHNlbmQgVFhfVFNfUkVDT1JEIG9yIFJYX1RTX1JFQ09SRCB0byB0aGVzZSB0aW1lcgotICovCi12b2lkIEJhU2V0dXBUaW1lT3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlQVFhfVFNfUkVDT1JECXBUeFRzID0gKFBUWF9UU19SRUNPUkQpZGF0YTsKLQotCXBUeFRzLT5iQWRkQmFSZXFJblByb2dyZXNzID0gZmFsc2U7Ci0JcFR4VHMtPmJBZGRCYVJlcURlbGF5ZWQgPSB0cnVlOwotCXBUeFRzLT5UeFBlbmRpbmdCQVJlY29yZC5iVmFsaWQgPSBmYWxzZTsKLX0KLQotdm9pZCBUeEJhSW5hY3RUaW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlQVFhfVFNfUkVDT1JECXBUeFRzID0gKFBUWF9UU19SRUNPUkQpZGF0YTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihwVHhUcywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIFR4VHNSZWNvcmRbcFR4VHMtPm51bV0pOwotCVR4VHNEZWxldGVCQShpZWVlLCBwVHhUcyk7Ci0JaWVlZTgwMjExX3NlbmRfREVMQkEoCi0JCWllZWUsCi0JCXBUeFRzLT5Uc0NvbW1vbkluZm8uQWRkciwKLQkJJnBUeFRzLT5UeEFkbWl0dGVkQkFSZWNvcmQsCi0JCVRYX0RJUiwKLQkJREVMQkFfUkVBU09OX1RJTUVPVVQpOwotfQotCi12b2lkIFJ4QmFJbmFjdFRpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCVBSWF9UU19SRUNPUkQJcFJ4VHMgPSAoUFJYX1RTX1JFQ09SRClkYXRhOwotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHBSeFRzLCBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSwgUnhUc1JlY29yZFtwUnhUcy0+bnVtXSk7Ci0KLQlSeFRzRGVsZXRlQkEoaWVlZSwgcFJ4VHMpOwotCWllZWU4MDIxMV9zZW5kX0RFTEJBKAotCQlpZWVlLAotCQlwUnhUcy0+VHNDb21tb25JbmZvLkFkZHIsCi0JCSZwUnhUcy0+UnhBZG1pdHRlZEJBUmVjb3JkLAotCQlSWF9ESVIsCi0JCURFTEJBX1JFQVNPTl9USU1FT1VUKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9ydGw4MTl4X0hULmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL3J0bDgxOXhfSFQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZhMTIwYy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL3J0bDgxOXhfSFQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4MyArMCwwIEBACi0jaWZuZGVmIF9SVEw4MTlYVV9IVFRZUEVfSF8KLSNkZWZpbmUgX1JUTDgxOVhVX0hUVFlQRV9IXwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVGhlIEhUIENhcGFiaWxpdHkgZWxlbWVudCBpcyBwcmVzZW50IGluIGJlYWNvbnMsIGFzc29jaWF0aW9uIHJlcXVlc3QsCi0vLwlyZWFzc29jaWF0aW9uIHJlcXVlc3QgYW5kIHByb2JlIHJlc3BvbnNlIGZyYW1lcwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8KLS8vIE9wZXJhdGlvbiBtb2RlIHZhbHVlCi0vLwotI2RlZmluZSBIVF9PUE1PREVfTk9fUFJPVEVDVAkJMAotI2RlZmluZSBIVF9PUE1PREVfT1BUSU9OQUwJCTEKLSNkZWZpbmUgSFRfT1BNT0RFXzQwTUhaX1BST1RFQ1QJMgotI2RlZmluZSBIVF9PUE1PREVfTUlYRUQJCQkzCi0KLS8vCi0vLyBNSU1PIFBvd2VyIFNhdmUgU2V0aW5ncwotLy8KLSNkZWZpbmUgTUlNT19QU19TVEFUSUMJCQkJMAotI2RlZmluZSBNSU1PX1BTX0RZTkFNSUMJCQkxCi0jZGVmaW5lIE1JTU9fUFNfTk9MSU1JVAkJCTMKLQotCi0vLwotLy8JVGhlcmUgc2hvdWxkIGJlIDEyOCBiaXRzIHRvIGNvdmVyIGFsbCBvZiB0aGUgTUNTIHJhdGVzLiBIb3dldmVyLCBzaW5jZQotLy8JODE5MCBkb2VzIG5vdCBzdXBwb3J0IHRvbyBtdWNoIHJhdGVzLCBvbmUgaW50ZWdlciBpcyBxdWl0ZSBlbm91Z2guCi0vLwotCi0jZGVmaW5lIHNIVENMbmcJNAotCi0KLSNkZWZpbmUgSFRfU1VQUE9SVEVEX01DU18xU1NfQklUTUFQCQkJCQkweDAwMDAwMGZmCi0jZGVmaW5lIEhUX1NVUFBPUlRFRF9NQ1NfMlNTX0JJVE1BUAkJCQkJMHgwMDAwZmYwMAotI2RlZmluZSBIVF9TVVBQT1JURURfTUNTXzFTU18yU1NfQklUTUFQCQkJSFRfTUNTXzFTU19CSVRNQVB8SFRfTUNTXzFTU18yU1NfQklUTUFQCi0KLQotdHlwZWRlZiBlbnVtIF9IVF9NQ1NfUkFURXsKLQlIVF9NQ1MwICAgPSAweDAwMDAwMDAxLAotCUhUX01DUzEgICA9IDB4MDAwMDAwMDIsCi0JSFRfTUNTMiAgID0gMHgwMDAwMDAwNCwKLQlIVF9NQ1MzICAgPSAweDAwMDAwMDA4LAotCUhUX01DUzQgICA9IDB4MDAwMDAwMTAsCi0JSFRfTUNTNSAgID0gMHgwMDAwMDAyMCwKLQlIVF9NQ1M2ICAgPSAweDAwMDAwMDQwLAotCUhUX01DUzcgICA9IDB4MDAwMDAwODAsCi0JSFRfTUNTOCAgID0gMHgwMDAwMDEwMCwKLQlIVF9NQ1M5ICAgPSAweDAwMDAwMjAwLAotCUhUX01DUzEwID0gMHgwMDAwMDQwMCwKLQlIVF9NQ1MxMSA9IDB4MDAwMDA4MDAsCi0JSFRfTUNTMTIgPSAweDAwMDAxMDAwLAotCUhUX01DUzEzID0gMHgwMDAwMjAwMCwKLQlIVF9NQ1MxNCA9IDB4MDAwMDQwMDAsCi0JSFRfTUNTMTUgPSAweDAwMDA4MDAwLAotCS8vIERvIG5vdCBkZWZpbmUgTUNTMzIgaGVyZSBhbHRob3VnaCA4MTkwIHN1cHBvcnQgTUNTMzIKLX1IVF9NQ1NfUkFURSwqUEhUX01DU19SQVRFOwotCi0vLwotLy8gUmVwcmVzZW50IENoYW5uZWwgV2lkdGggaW4gSFQgQ2FwYWJpbGl0aWVzCi0vLwotdHlwZWRlZiBlbnVtIF9IVF9DSEFOTkVMX1dJRFRIewotCUhUX0NIQU5ORUxfV0lEVEhfMjAgPSAwLAotCUhUX0NIQU5ORUxfV0lEVEhfMjBfNDAgPSAxLAotfUhUX0NIQU5ORUxfV0lEVEgsICpQSFRfQ0hBTk5FTF9XSURUSDsKLQotLy8KLS8vIFJlcHJlc2VudCBFeHRlbnNpb24gQ2hhbm5lbCBPZmZzZXQgaW4gSFQgQ2FwYWJpbGl0aWVzCi0vLyBUaGlzIGlzIGF2YWlsYWJsZSBvbmx5IGluIDQwTWh6IG1vZGUuCi0vLwotdHlwZWRlZiBlbnVtIF9IVF9FWFRDSE5MX09GRlNFVHsKLQlIVF9FWFRDSE5MX09GRlNFVF9OT19FWFQgPSAwLAotCUhUX0VYVENITkxfT0ZGU0VUX1VQUEVSID0gMSwKLQlIVF9FWFRDSE5MX09GRlNFVF9OT19ERUYgPSAyLAotCUhUX0VYVENITkxfT0ZGU0VUX0xPV0VSID0gMywKLX1IVF9FWFRDSE5MX09GRlNFVCwgKlBIVF9FWFRDSE5MX09GRlNFVDsKLQotdHlwZWRlZiBlbnVtIF9DSE5MT1B7Ci0JQ0hOTE9QX05PTkUgPSAwLCAvLyBObyBBY3Rpb24gbm93Ci0JQ0hOTE9QX1NDQU4gPSAxLCAvLyBTY2FuIGluIHByb2dyZXNzCi0JQ0hOTE9QX1NXQlcgPSAyLCAvLyBCYW5kd2lkdGggc3dpdGNoaW5nIGluIHByb2dyZXNzCi0JQ0hOTE9QX1NXQ0hOTCA9IDMsIC8vIFNvZnR3YXJlIENoYW5uZWwgc3dpdGNoaW5nIGluIHByb2dyZXNzCi19IENITkxPUCwgKlBDSE5MT1A7Ci0KLS8vIERldGVybWluZSBpZiB0aGUgQ2hhbm5lbCBPcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MKLSNkZWZpbmUgQ0hITE9QX0lOX1BST0dSRVNTKF9wSFRJbmZvKQlcCi0JCSgoX3BIVEluZm8pLT5DaG5sT3AgPiBDSE5MT1BfTk9ORSkgPyBUUlVFIDogRkFMU0UKLQotLyoKLXR5cGVkZWYJdW5pb24gX0hUX0NBUEFCSUxJVFl7Ci0JdTE2CVNob3J0RGF0YTsKLQl1OAlDaGFyRGF0YVsyXTsKLQlzdHJ1Y3QKLQl7Ci0JCXUxNglBZHZDb2Rpbmc6MTsKLQkJdTE2CUNobFdpZHRoOjE7Ci0JCXUxNglNaW1vUHdyU2F2ZToyOwotCQl1MTYJR3JlZW5GaWVsZDoxOwotCQl1MTYJU2hvcnRHSTIwTWh6OjE7Ci0JCXUxNglTaG9ydEdJNDBNaHo6MTsKLQkJdTE2CVNUQkM6MTsKLQkJdTE2CUJlYW1Gb3JtOjE7Ci0JCXUxNglEZWxheUJBOjE7Ci0JCXUxNglNYXhBTVNEVVNpemU6MTsKLQkJdTE2CURzc0NDazoxOwotCQl1MTYJUFNNUDoxOwotCQl1MTYJUnN2ZDozOwotCX1GaWVsZDsKLX1IVF9DQVBBQklMSVRZLCAqUEhUX0NBUEFCSUxJVFk7Ci0KLXR5cGVkZWYJdW5pb24gX0hUX0NBUEFCSUxJVFlfTUFDUEFSQXsKLQl1OAlTaG9ydERhdGE7Ci0JdTgJQ2hhckRhdGFbMV07Ci0Jc3RydWN0Ci0JewotCQl1OAlNYXhSeEFNUERVOjI7Ci0JCXU4CU1QRFVEZW5zaXR5OjI7Ci0JCXU4CVJzdmQ6NDsKLQl9RmllbGQ7Ci19SFRfQ0FQQUJJTElUWV9NQUNQQVJBLCAqUEhUX0NBUEFCSUxJVFlfTUFDUEFSQTsKLSovCi0KLXR5cGVkZWYgZW51bSBfSFRfQUNUSU9OewotCUFDVF9SRUNPTU1BTkRfV0lEVEgJCT0gMCwKLQlBQ1RfTUlNT19QV1JfU0FWRSAJCT0gMSwKLQlBQ1RfUFNNUAkJCQkJPSAyLAotCUFDVF9TRVRfUENPX1BIQVNFCQk9IDMsCi0JQUNUX01JTU9fQ0hMX01FQVNVUkUJPSA0LAotCUFDVF9SRUNJUFJPQ0lUWV9DT1JSRUNUCT0gNSwKLQlBQ1RfTUlNT19DU0lfTUFUUklDUwkJPSA2LAotCUFDVF9NSU1PX05PQ09NUFJfU1RFRVIJPSA3LAotCUFDVF9NSU1PX0NPTVBSX1NURUVSCQk9IDgsCi0JQUNUX0FOVEVOTkFfU0VMRUNUCQk9IDksCi19IEhUX0FDVElPTiwgKlBIVF9BQ1RJT047Ci0KLQotLyogMjAwNy8wNi8wNyBNSCBEZWZpbmUgc3ViLWNhcnJpZXIgbW9kZSBmb3IgNDBNSFouICovCi10eXBlZGVmIGVudW0gX0hUX0JhbmR3aWR0aF80ME1IWl9TdWJfQ2FycmllcnsKLQlTQ19NT0RFX0RVUExJQ0FURSA9IDAsCi0JU0NfTU9ERV9MT1dFUiA9IDEsCi0JU0NfTU9ERV9VUFBFUiA9IDIsCi0JU0NfTU9ERV9GVUxMNDBNSFogPSAzLAotfUhUX0JXNDBfU0NfRTsKLQotdHlwZWRlZglzdHJ1Y3QgX0hUX0NBUEFCSUxJVFlfRUxFewotCi0JLy9IVCBjYXBhYmlsaXR5IGluZm8KLQl1OAlBZHZDb2Rpbmc6MTsKLQl1OAlDaGxXaWR0aDoxOwotCXU4CU1pbW9Qd3JTYXZlOjI7Ci0JdTgJR3JlZW5GaWVsZDoxOwotCXU4CVNob3J0R0kyME1oejoxOwotCXU4CVNob3J0R0k0ME1oejoxOwotCXU4CVR4U1RCQzoxOwotCXU4CVJ4U1RCQzoyOwotCXU4CURlbGF5QkE6MTsKLQl1OAlNYXhBTVNEVVNpemU6MTsKLQl1OAlEc3NDQ2s6MTsKLQl1OAlQU01QOjE7Ci0JdTgJUnN2ZDE6MTsKLQl1OAlMU2lnVHhvcFByb3RlY3Q6MTsKLQotCS8vTUFDIEhUIHBhcmFtZXRlcnMgaW5mbwotCXU4CU1heFJ4QU1QRFVGYWN0b3I6MjsKLQl1OAlNUERVRGVuc2l0eTozOwotCXU4CVJzdmQyOjM7Ci0KLQkvL1N1cHBvcnRlZCBNQ1Mgc2V0Ci0JdTgJTUNTWzE2XTsKLQotCi0JLy9FeHRlbmRlZCBIVCBDYXBhYmlsaXR5IEluZm8KLQl1MTYJRXh0SFRDYXBJbmZvOwotCi0JLy9UWEJGIENhcGFiaWxpdGllcwotCXU4CVR4QkZDYXBbNF07Ci0KLQkvL0FudGVubmEgU2VsZWN0aW9uIENhcGFiaWxpdGllcwotCXU4CUFTQ2FwOwotCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBIVF9DQVBBQklMSVRZX0VMRSwgKlBIVF9DQVBBQklMSVRZX0VMRTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFRoZSBIVCBJbmZvcm1hdGlvbiBlbGVtZW50IGlzIHByZXNlbnQgaW4gYmVhY29ucwotLy8gT25seSBBUCBpcyByZXF1aXJlZCB0byBpbmNsdWRlIHRoaXMgZWxlbWVudAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdHlwZWRlZiBzdHJ1Y3QgX0hUX0lORk9STUFUSU9OX0VMRXsKLQl1OAlDb250cm9sQ2hsOwotCi0JdTgJRXh0Q2hsT2Zmc2V0OjI7Ci0JdTgJUmVjb21tZW1kZWRUeFdpZHRoOjE7Ci0JdTgJUklGUzoxOwotCXU4CVBTTVBBY2Nlc3NPbmx5OjE7Ci0JdTgJU3J2SW50R3JhbnVsYXJpdHk6MzsKLQotCXU4CU9wdE1vZGU6MjsKLQl1OAlOb25HRkRldlByZXNlbnQ6MTsKLQl1OAlSZXZkMTo1OwotCXU4CVJldmQyOjg7Ci0KLQl1OAlSc3ZkMzo2OwotCXU4CUR1YWxCZWFjb246MTsKLQl1OAlEdWFsQ1RTUHJvdGVjdDoxOwotCi0JdTgJU2Vjb25kYXJ5QmVhY29uOjE7Ci0JdTgJTFNpZ1R4b3BQcm90ZWN0RnVsbDoxOwotCXU4CVBjb0FjdGl2ZToxOwotCXU4CVBjb1BoYXNlOjE7Ci0JdTgJUnN2ZDQ6NDsKLQotCXU4CUJhc2ljTVNDWzE2XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIEhUX0lORk9STUFUSU9OX0VMRSwgKlBIVF9JTkZPUk1BVElPTl9FTEU7Ci0KLS8vCi0vLyBNSU1PIFBvd2VyIFNhdmUgY29udHJvbCBmaWVsZC4KLS8vIFRoaXMgaXMgYXBwZWFyIGluIE1JTU8gUG93ZXIgU2F2ZSBBY3Rpb24gRnJhbWUKLS8vCi10eXBlZGVmIHN0cnVjdCBfTUlNT1BTX0NUUkx7Ci0JdTgJTWltb1BzRW5hYmxlOjE7Ci0JdTgJTWltb1BzTW9kZToxOwotCXU4CVJlc2VydmVkOjY7Ci19IE1JTU9QU19DVFJMLCAqUE1JTU9QU19DVFJMOwotCi10eXBlZGVmIGVudW0gX0hUX1NQRUNfVkVSewotCUhUX1NQRUNfVkVSX0lFRUUgPSAwLAotCUhUX1NQRUNfVkVSX0VXQyA9IDEsCi19SFRfU1BFQ19WRVIsICpQSFRfU1BFQ19WRVI7Ci0KLXR5cGVkZWYgZW51bSBfSFRfQUdHUkVfTU9ERV9FewotCUhUX0FHR19BVVRPID0gMCwKLQlIVF9BR0dfRk9SQ0VfRU5BQkxFID0gMSwKLQlIVF9BR0dfRk9SQ0VfRElTQUJMRSA9IDIsCi19SFRfQUdHUkVfTU9ERV9FLCAqUEhUX0FHR1JFX01PREVfRTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICBUaGUgRGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBrZWVwIEhUIHJlbGF0ZWQgdmFyaWFibGVzIHdoZW4gY2FyZCBpcwotLy8gIGNvbmZpZ3VyZWQgYXMgbm9uLUFQIFNUQSBtb2RlLiAgKipOb3RlKiogIEN1cnJlbnRfeHh4IHNob3VsZCBiZSBzZXQKLS8vCXRvIGRlZmF1bHQgdmFsdWUgaW4gSFRJbml0aWFsaXplSFRJbmZvKCkKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXR5cGVkZWYgc3RydWN0IF9SVF9ISUdIX1RIUk9VR0hQVVR7Ci0JdTgJCQkJYkVuYWJsZUhUOwotCXU4CQkJCWJDdXJyZW50SFRTdXBwb3J0OwotCi0JdTgJCQkJYlJlZ0JXNDBNSHo7CQkJCS8vIFR4IDQwTUh6IGNoYW5uZWwgY2FwYWJsaXR5Ci0JdTgJCQkJYkN1ckJXNDBNSHo7CQkJCS8vIFR4IDQwTUh6IGNoYW5uZWwgY2FwYWJpbGl0eQotCi0JdTgJCQkJYlJlZ1Nob3J0R0k0ME1IejsJCQkvLyBUeCBTaG9ydCBHSSBmb3IgNDBNaHoKLQl1OAkJCQliQ3VyU2hvcnRHSTQwTUh6OwkJCS8vIFR4IFNob3J0IEdJIGZvciA0ME1IegotCi0JdTgJCQkJYlJlZ1Nob3J0R0kyME1IejsJCQkvLyBUeCBTaG9ydCBHSSBmb3IgMjBNSHoKLQl1OAkJCQliQ3VyU2hvcnRHSTIwTUh6OwkJCS8vIFR4IFNob3J0IEdJIGZvciAyME1IegotCi0JdTgJCQkJYlJlZ1N1cHBDQ0s7CQkJCS8vIFR4IENDSyByYXRlIGNhcGFiaWxpdHkKLQl1OAkJCQliQ3VyU3VwcENDSzsJCQkJLy8gVHggQ0NLIHJhdGUgY2FwYWJpbGl0eQotCi0JLy8gODAyLjExbiBzcGVjIHZlcnNpb24gZm9yICJwZWVyIgotCUhUX1NQRUNfVkVSCQkJZVBlZXJIVFNwZWNWZXI7Ci0KLQotCS8vIEhUIHJlbGF0ZWQgaW5mb3JtYXRpb24gZm9yICJTZWxmIgotCUhUX0NBUEFCSUxJVFlfRUxFCVNlbGZIVENhcDsJCS8vIFRoaXMgaXMgSFQgY2FwIGVsZW1lbnQgc2VudCB0byBwZWVyIFNUQSwgd2hpY2ggYWxzbyBpbmRpY2F0ZSBIVCBSeCBjYXBhYmlsaXRpZXMuCi0JSFRfSU5GT1JNQVRJT05fRUxFCVNlbGZIVEluZm87CQkvLyBUaGlzIGlzIEhUIGluZm8gZWxlbWVudCBzZW50IHRvIHBlZXIgU1RBLCB3aGljaCBhbHNvIGluZGljYXRlIEhUIFJ4IGNhcGFiaWxpdGllcy4KLQotCS8vIEhUIHJlbGF0ZWQgaW5mb3JtYXRpb24gZm9yICJQZWVyIgotCXU4CQkJCVBlZXJIVENhcEJ1ZlszMl07Ci0JdTgJCQkJUGVlckhUSW5mb0J1ZlszMl07Ci0KLQotCS8vIEEtTVNEVSByZWxhdGVkCi0JdTgJCQkJYkFNU0RVX1N1cHBvcnQ7CQkJLy8gVGhpcyBpbmRpY2F0ZXMgVHggQS1NU0RVIGNhcGFiaWxpdHkKLQl1MTYJCQkJbkFNU0RVX01heFNpemU7CQkJLy8gVGhpcyBpbmRpY2F0ZXMgVHggQS1NU0RVIGNhcGFiaWxpdHkKLQl1OAkJCQliQ3VycmVudF9BTVNEVV9TdXBwb3J0OwkvLyBUaGlzIGluZGljYXRlcyBUeCBBLU1TRFUgY2FwYWJpbGl0eQotCXUxNgkJCQluQ3VycmVudF9BTVNEVV9NYXhTaXplOwkvLyBUaGlzIGluZGljYXRlcyBUeCBBLU1TRFUgY2FwYWJpbGl0eQotCi0KLQkvLyBBTVBEVSAgcmVsYXRlZCA8MjAwNi4wOC4xMCBFbWlseT4KLQl1OAkJCQliQU1QRFVFbmFibGU7CQkJCS8vIFRoaXMgaW5kaWNhdGUgVHggQS1NUERVIGNhcGFiaWxpdHkKLQl1OAkJCQliQ3VycmVudEFNUERVRW5hYmxlOwkJLy8gVGhpcyBpbmRpY2F0ZSBUeCBBLU1QRFUgY2FwYWJpbGl0eQotCXU4CQkJCUFNUERVX0ZhY3RvcjsJCQkJLy8gVGhpcyBpbmRpY2F0ZSBUeCBBLU1QRFUgY2FwYWJpbGl0eQotCXU4CQkJCUN1cnJlbnRBTVBEVUZhY3RvcjsJCS8vIFRoaXMgaW5kaWNhdGUgVHggQS1NUERVIGNhcGFiaWxpdHkKLQl1OAkJCQlNUERVX0RlbnNpdHk7CQkJCS8vIFRoaXMgaW5kaWNhdGUgVHggQS1NUERVIGNhcGFiaWxpdHkKLQl1OAkJCQlDdXJyZW50TVBEVURlbnNpdHk7CQkJLy8gVGhpcyBpbmRpY2F0ZSBUeCBBLU1QRFUgY2FwYWJpbGl0eQotCi0JLy8gRm9yY2VkIEEtTVBEVSBlbmFibGUKLQlIVF9BR0dSRV9NT0RFX0UJRm9yY2VkQU1QRFVNb2RlOwotCXU4CQkJCUZvcmNlZEFNUERVRmFjdG9yOwotCXU4CQkJCUZvcmNlZE1QRFVEZW5zaXR5OwotCi0JLy8gRm9yY2VkIEEtTVNEVSBlbmFibGUKLQlIVF9BR0dSRV9NT0RFX0UJRm9yY2VkQU1TRFVNb2RlOwotCXUxNgkJCQlGb3JjZWRBTVNEVU1heFNpemU7Ci0KLQl1OAkJCQliRm9yY2VkU2hvcnRHSTsKLQotCXU4CQkJCUN1cnJlbnRPcE1vZGU7Ci0KLQkvLyBNSU1PIFBTIHJlbGF0ZWQKLQl1OAkJCQlTZWxmTWltb1BzOwotCXU4CQkJCVBlZXJNaW1vUHM7Ci0KLQkvLyA0ME1IeiBDaGFubmVsIE9mZnNldCBzZXR0aW5ncy4KLQlIVF9FWFRDSE5MX09GRlNFVAlDdXJTVEFFeHRDaG5sT2Zmc2V0OwotCXU4CQkJCWJDdXJUeEJXNDBNSHo7CS8vIElmIHdlIHVzZSA0MCBNSHogdG8gVHgKLQl1OAkJCQlQZWVyQmFuZHdpZHRoOwotCi0JLy8gRm9yIEJhbmR3aWR0aCBTd2l0Y2hpbmcKLQl1OAkJCQliU3dCd0luUHJvZ3Jlc3M7Ci0JQ0hOTE9QCQkJCUNobmxPcDsgLy8gc29mdHdhcmUgc3dpdGNoaW5nIGNoYW5uZWwgaW4gcHJvZ3Jlc3MuIEJ5IEJydWNlLCAyMDA4LTAyLTE1LgotCXU4CQkJCVN3QndTdGVwOwotCS8vc3RydWN0IHRpbWVyX2xpc3QJCVN3QndUaW1lcjsgIC8vbW92ZWQgdG8gaWVlZTgwMjExX2RldmljZS4gYXMgdGltZXJfbGlzdCBuZWVkIGluY2x1ZGUgc29tZSBoZWFkZXIgZmlsZSBoZXJlLgotCi0JLy8gRm9yIFJlYWx0ZWsgcHJvcHJpZXRhcnkgQS1NUERVIGZhY3RvciBmb3IgYWdncmVnYXRpb24KLQl1OAkJCQliUmVnUlQyUlRBZ2dyZWdhdGlvbjsKLQl1OAkJCQliQ3VycmVudFJUMlJUQWdncmVnYXRpb247Ci0JdTgJCQkJYkN1cnJlbnRSVDJSVExvbmdTbG90VGltZTsKLQl1OAkJCQlzelJUMlJUQWdnQnVmZmVyWzEwXTsKLQotCS8vIFJ4IFJlb3JkZXIgY29udHJvbAotCXU4CQkJCWJSZWdSeFJlb3JkZXJFbmFibGU7Ci0JdTgJCQkJYkN1clJ4UmVvcmRlckVuYWJsZTsKLQl1OAkJCQlSeFJlb3JkZXJXaW5TaXplOwotCXU4CQkJCVJ4UmVvcmRlclBlbmRpbmdUaW1lOwotCXUxNgkJCQlSeFJlb3JkZXJEcm9wQ291bnRlcjsKLQotI2lmZGVmIFVTQl9UWF9EUklWRVJfQUdHUkVHQVRJT05fRU5BQkxFCi0JdTgJCQkJVXNiVHhBZ2dyTnVtOwotI2VuZGlmCi0jaWZkZWYgVVNCX1JYX0FHR1JFR0FUSU9OX1NVUFBPUlQKLQl1OAkJCQlVc2JSeEZ3QWdnckVuOwotCXU4CQkJCVVzYlJ4RndBZ2dyUGFnZU51bTsKLQl1OAkJCQlVc2JSeEZ3QWdnclBhY2tldE51bTsKLQl1OAkJCQlVc2JSeEZ3QWdnclRpbWVvdXQ7Ci0jZW5kaWYKLQotCS8vIEFkZCBmb3IgQnJvYWRjb20oTGlua3N5cykgSU9ULiBKb3NlcGgKLQl1OAkJCQliSXNQZWVyQmNtOwotCi0JLy8gRm9yIElPVCBpc3N1ZS4KLQl1OAkJCQlJT1RQZWVyOwotCXUzMgkJCQlJT1RBY3Rpb247Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBSVF9ISUdIX1RIUk9VR0hQVVQsICpQUlRfSElHSF9USFJPVUdIUFVUOwotCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBUaGUgRGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBrZWVwIEhUIHJlbGF0ZWQgdmFyaWFibGUgZm9yICJlYWNoIFN0YSIKLS8vIHdoZW4gY2FyZCBpcyBjb25maWd1cmVkIGFzICJBUCBtb2RlIgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdHlwZWRlZiBzdHJ1Y3QgX1JUX0hUSU5GT19TVEFfRU5UUll7Ci0JdTgJCQliRW5hYmxlSFQ7Ci0KLQl1OAkJCWJTdXBwb3J0Q2NrOwotCi0JdTE2CQkJQU1TRFVfTWF4U2l6ZTsKLQotCXU4CQkJQU1QRFVfRmFjdG9yOwotCXU4CQkJTVBEVV9EZW5zaXR5OwotCi0JdTgJCQlIVEhpZ2hlc3RPcGVyYVJhdGU7Ci0KLQl1OAkJCWJCdzQwTUh6OwotCi0JdTgJCQlNaW1vUHM7Ci0KLQl1OAkJCU1jc1JhdGVTZXRbMTZdOwotCi0KLX1SVF9IVElORk9fU1RBX0VOVFJZLCAqUFJUX0hUSU5GT19TVEFfRU5UUlk7Ci0KLQotCi0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFRoZSBEYXRhIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGtlZXAgSFQgcmVsYXRlZCB2YXJpYWJsZSBmb3IgImVhY2ggQVAiCi0vLyB3aGVuIGNhcmQgaXMgY29uZmlndXJlZCBhcyAiU1RBIG1vZGUiCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10eXBlZGVmIHN0cnVjdCBfQlNTX0hUewotCi0JdTgJCQkJYmRTdXBwb3J0SFQ7Ci0KLQkvLyBIVCByZWxhdGVkIGVsZW1lbnRzCi0JdTgJCQkJCWJkSFRDYXBCdWZbMzJdOwotCXUxNgkJCQkJYmRIVENhcExlbjsKLQl1OAkJCQkJYmRIVEluZm9CdWZbMzJdOwotCXUxNgkJCQkJYmRIVEluZm9MZW47Ci0KLQlIVF9TUEVDX1ZFUgkJCQliZEhUU3BlY1ZlcjsKLQkvL0hUX0NBUEFCSUxJVFlfRUxFCQkJYmRIVENhcEVsZTsKLQkvL0hUX0lORk9STUFUSU9OX0VMRQkJYmRIVEluZm9FbGU7Ci0KLQl1OAkJCQkJYmRSVDJSVEFnZ3JlZ2F0aW9uOwotCXU4CQkJCQliZFJUMlJUTG9uZ1Nsb3RUaW1lOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgQlNTX0hULCAqUEJTU19IVDsKLQotdHlwZWRlZiBzdHJ1Y3QgX01JTU9fUlNTSXsKLQl1MzIJRW5hYmxlQW50ZW5uYTsKLQl1MzIJQW50ZW5uYUE7Ci0JdTMyIAlBbnRlbm5hQjsKLQl1MzIgCUFudGVubmFDOwotCXUzMiAJQW50ZW5uYUQ7Ci0JdTMyCUF2ZXJhZ2U7Ci19TUlNT19SU1NJLCAqUE1JTU9fUlNTSTsKLQotdHlwZWRlZiBzdHJ1Y3QgX01JTU9fRVZNewotCXUzMglFVk0xOwotCXUzMiAgICBFVk0yOwotfU1JTU9fRVZNLCAqUE1JTU9fRVZNOwotCi10eXBlZGVmIHN0cnVjdCBfRkFMU0VfQUxBUk1fU1RBVElTVElDU3sKLQl1MzIJQ250X1Bhcml0eV9GYWlsOwotCXUzMiAgICBDbnRfUmF0ZV9JbGxlZ2FsOwotCXUzMglDbnRfQ3JjOF9mYWlsOwotCXUzMglDbnRfYWxsOwotfUZBTFNFX0FMQVJNX1NUQVRJU1RJQ1MsICpQRkFMU0VfQUxBUk1fU1RBVElTVElDUzsKLQotCi1leHRlcm4gdTggTUNTX0ZJTFRFUl9BTExbMTZdOwotZXh0ZXJuIHU4IE1DU19GSUxURVJfMVNTWzE2XTsKLQotLyogMjAwNy8wNy8xMSBNSCBNb2RpZnkgdGhlIG1hY3JvLiBCZWNhdXMgU1RBIG1heSBsaW5rIHdpdGggYSBOLUFQLiBJZiB3ZSBzZXQKLSAgIFNUQSBpbiBBL0IvRyBtb2RlIGFuZCBBUCBpcyBzdGlsbCBpbiBOIG1vZGUuIFRoZSBtYWNybyB3aWxsIGJlIHdyb25nLiBXZSBoYXZlCi0gICB0byBhZGQgYSBtYWNybyB0byBqdWRnZSB3aXJlbGVzcyBtb2RlLiAqLwotI2RlZmluZSBQSUNLX1JBVEUoX25MZWdhY3lSYXRlLCBfbk1jc1JhdGUpCVwKLQkJKF9uTWNzUmF0ZT09MCk/KF9uTGVnYWN5UmF0ZSYweDdmKTooX25NY3NSYXRlKQotLyogMjAwNy8wNy8xMiBNSCBXZSBvbmx5IGRlZmluZSBsZWdhY3kgYW5kIEhUIHdpcmVsZXNzIG1vZGUgbm93LiAqLwotI2RlZmluZQlMRUdBQ1lfV0lSRUxFU1NfTU9ERQlJRUVFX01PREVfTUFTSwotCi0jZGVmaW5lIENVUlJFTlRfUkFURShXaXJlbGVzc01vZGUsIExlZ2FjeVJhdGUsIEhUUmF0ZSkJXAotCQkJCQkoKFdpcmVsZXNzTW9kZSAmIChMRUdBQ1lfV0lSRUxFU1NfTU9ERSkpIT0wKT9cCi0JCQkJCQkoTGVnYWN5UmF0ZSk6XAotCQkJCQkJKFBJQ0tfUkFURShMZWdhY3lSYXRlLCBIVFJhdGUpKQotCi0KLQotLy8gTUNTIEJ3IDQwIHsxfjcsIDEyfjE1LDMyfQotI2RlZmluZQlSQVRFX0FEUFRfMVNTX01BU0sgCQkweEZGCi0jZGVmaW5lCVJBVEVfQURQVF8yU1NfTUFTSwkgICAJMHhGMCAvL1NraXAgTUNTOH4xMSBiZWNhdXNlIG1jczcgPiBtY3M2LCA5LCAxMCwgMTEuIDIwMDcuMDEuMTYgYnkgRW1pbHkKLSNkZWZpbmUJUkFURV9BRFBUX01DUzMyX01BU0sJCTB4MDEKLQotI2RlZmluZSAJSVNfMTFOX01DU19SQVRFKHJhdGUpCQkocmF0ZSYweDgwKQotCi10eXBlZGVmIGVudW0gX0hUX0FHR1JFX1NJWkV7Ci0JSFRfQUdHX1NJWkVfOEsgPSAwLAotCUhUX0FHR19TSVpFXzE2SyA9IDEsCi0JSFRfQUdHX1NJWkVfMzJLID0gMiwKLQlIVF9BR0dfU0laRV82NEsgPSAzLAotfUhUX0FHR1JFX1NJWkVfRSwgKlBIVF9BR0dSRV9TSVpFX0U7Ci0KLS8qIEluZGljYXRlIGRpZmZlcmVudCBBUCB2ZW5kb3IgZm9yIElPVCBpc3N1ZSAqLwotdHlwZWRlZiBlbnVtIF9IVF9JT1RfUEVFUgotewotCUhUX0lPVF9QRUVSX1VOS05PV04gPSAwLAotCUhUX0lPVF9QRUVSX1JFQUxURUsgPSAxLAotCUhUX0lPVF9QRUVSX0JST0FEQ09NID0gMiwKLQlIVF9JT1RfUEVFUl9SQUxJTksgPSAzLAotCUhUX0lPVF9QRUVSX0FUSEVST1MgPSA0LAotCUhUX0lPVF9QRUVSX0NJU0NPPSA1LAotICAgICAgICBIVF9JT1RfUEVFUl9NQVJWRUxMPTYsCi0JSFRfSU9UX1BFRVJfTUFYID0gNwotfUhUX0lPVF9QRUVSX0UsICpQSFRJT1RfUEVFUl9FOwotCi0vLwotLy8gSU9UIEFjdGlvbiBmb3IgZGlmZmVyZW50IEFQCi0vLwotdHlwZWRlZiBlbnVtIF9IVF9JT1RfQUNUSU9OewotCUhUX0lPVF9BQ1RfVFhfVVNFX0FNU0RVXzRLID0gMHgwMDAwMDAwMSwKLQlIVF9JT1RfQUNUX1RYX1VTRV9BTVNEVV84SyA9IDB4MDAwMDAwMDIsCi0JSFRfSU9UX0FDVF9ESVNBQkxFX01DUzE0ID0gMHgwMDAwMDAwNCwKLQlIVF9JT1RfQUNUX0RJU0FCTEVfTUNTMTUgPSAweDAwMDAwMDA4LAotCUhUX0lPVF9BQ1RfRElTQUJMRV9BTExfMlNTID0gMHgwMDAwMDAxMCwKLQlIVF9JT1RfQUNUX0RJU0FCTEVfRURDQV9UVVJCTyA9IDB4MDAwMDAwMjAsCi0JSFRfSU9UX0FDVF9NR05UX1VTRV9DQ0tfNk0gPSAweDAwMDAwMDQwLAotCUhUX0lPVF9BQ1RfQ0REX0ZTWU5DID0gMHgwMDAwMDA4MCwKLQlIVF9JT1RfQUNUX1BVUkVfTl9NT0RFID0gMHgwMDAwMDEwMCwKLQlIVF9JT1RfQUNUX0ZPUkNFRF9DVFMyU0VMRiA9IDB4MDAwMDAyMDAsCi0JSFRfSU9UX0FDVF9OVUxMX0RBVEFfUE9XRVJfU0FWSU5HID0gMHgwMDgwMDAwMCwKLX1IVF9JT1RfQUNUSU9OX0UsICpQSFRfSU9UX0FDVElPTl9FOwotCi0jZW5kaWYgLy9fUlRMODE5WFVfSFRUWVBFX0hfCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvcnRsODE5eF9IVFByb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvcnRsODE5eF9IVFByb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdhOWRhMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL3J0bDgxOXhfSFRQcm9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMyICswLDAgQEAKLQotLy9BcyB0aGlzIGZ1bmN0aW9uIGlzIG1haW5seSBwb3J0ZWQgZnJvbSBXaW5kb3dzIGRyaXZlciwgc28gbGVhdmUgdGhlIG5hbWUgbGl0dGxlIGNoYW5nZWQuIElmIGFueSBjb25mdXNpb24gY2F1c2VkLCB0ZWxsIG1lLiBDcmVhdGVkIGJ5IFdCLiAyMDA4LjA1LjA4Ci0jaW5jbHVkZSAiaWVlZTgwMjExLmgiCi0jaW5jbHVkZSAicnRsODE5eF9IVC5oIgotdTggTUNTX0ZJTFRFUl9BTExbMTZdID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OwotCi11OCBNQ1NfRklMVEVSXzFTU1sxNl0gPSB7MHhmZiwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0KLXUxNiBNQ1NfREFUQV9SQVRFWzJdWzJdWzc3XSA9Ci0Jewl7CXsxMywgMjYsIDM5LCA1MiwgNzgsIDEwNCwgMTE3LCAxMzAsIDI2LCA1MiwgNzggLDEwNCwgMTU2LCAyMDgsIDIzNCwgMjYwLAotCQkJMzksIDc4LCAxMTcsIDIzNCwgMzEyLCAzNTEsIDM5MCwgNTIsIDEwNCwgMTU2LCAyMDgsIDMxMiwgNDE2LCA0NjgsIDUyMCwKLQkJCTAsIDc4LCAxMDQsIDEzMCwgMTE3LCAxNTYsIDE5NSwgMTA0LCAxMzAsIDEzMCwgMTU2LCAxODIsIDE4MiwgMjA4LCAxNTYsIDE5NSwKLQkJCTE5NSwgMjM0LCAyNzMsIDI3MywgMzEyLCAxMzAsIDE1NiwgMTgxLCAxNTYsIDE4MSwgMjA4LCAyMzQsIDIwOCwgMjM0LCAyNjAsIDI2MCwKLQkJCTI4NiwgMTk1LCAyMzQsIDI3MywgMjM0LCAyNzMsIDMxMiwgMzUxLCAzMTIsIDM1MSwgMzkwLCAzOTAsIDQyOX0sCQkJLy8gTG9uZyBHSSwgMjBNSHoKLQkJCXsxNCwgMjksIDQzLCA1OCwgODcsIDExNiwgMTMwLCAxNDQsIDI5LCA1OCwgODcsIDExNiwgMTczLCAyMzEsIDI2MCwgMjg5LAotCQkJNDMsIDg3LCAxMzAsIDE3MywgMjYwLCAzNDcsIDM5MCwgNDMzLCA1OCwgMTE2LCAxNzMsIDIzMSwgMzQ3LCA0NjIsIDUyMCwgNTc4LAotCQkJMCwgODcsIDExNiwgMTQ0LCAxMzAsIDE3MywgMjE3LCAxMTYsIDE0NCwgMTQ0LCAxNzMsIDIwMiwgMjAyLCAyMzEsIDE3MywgMjE3LAotCQkJMjE3LCAyNjAsIDMwMywgMzAzLCAzNDcsIDE0NCwgMTczLCAyMDIsIDE3MywgMjAyLCAyMzEsIDI2MCwgMjMxLCAyNjAsIDI4OSwgMjg5LAotCQkJMzE4LCAyMTcsIDI2MCwgMzAzLCAyNjAsIDMwMywgMzQ3LCAzOTAsIDM0NywgMzkwLCA0MzMsIDQzMywgNDc3fQl9LAkJLy8gU2hvcnQgR0ksIDIwTUh6Ci0JCXsJezI3LCA1NCwgODEsIDEwOCwgMTYyLCAyMTYsIDI0MywgMjcwLCA1NCwgMTA4LCAxNjIsIDIxNiwgMzI0LCA0MzIsIDQ4NiwgNTQwLAotCQkJODEsIDE2MiwgMjQzLCAzMjQsIDQ4NiwgNjQ4LCA3MjksIDgxMCwgMTA4LCAyMTYsIDMyNCwgNDMyLCA2NDgsIDg2NCwgOTcyLCAxMDgwLAotCQkJMTIsIDE2MiwgMjE2LCAyNzAsIDI0MywgMzI0LCA0MDUsIDIxNiwgMjcwLCAyNzAsIDMyNCwgMzc4LCAzNzgsIDQzMiwgMzI0LCA0MDUsCi0JCQk0MDUsIDQ4NiwgNTY3LCA1NjcsIDY0OCwgMjcwLCAzMjQsIDM3OCwgMzI0LCAzNzgsIDQzMiwgNDg2LCA0MzIsIDQ4NiwgNTQwLCA1NDAsCi0JCQk1OTQsIDQwNSwgNDg2LCA1NjcsIDQ4NiwgNTY3LCA2NDgsIDcyOSwgNjQ4LCA3MjksIDgxMCwgODEwLCA4OTF9LCAJLy8gTG9uZyBHSSwgNDBNSHoKLQkJCXszMCwgNjAsIDkwLCAxMjAsIDE4MCwgMjQwLCAyNzAsIDMwMCwgNjAsIDEyMCwgMTgwLCAyNDAsIDM2MCwgNDgwLCA1NDAsIDYwMCwKLQkJCTkwLCAxODAsIDI3MCwgMzYwLCA1NDAsIDcyMCwgODEwLCA5MDAsIDEyMCwgMjQwLCAzNjAsIDQ4MCwgNzIwLCA5NjAsIDEwODAsIDEyMDAsCi0JCQkxMywgMTgwLCAyNDAsIDMwMCwgMjcwLCAzNjAsIDQ1MCwgMjQwLCAzMDAsIDMwMCwgMzYwLCA0MjAsIDQyMCwgNDgwLCAzNjAsIDQ1MCwKLQkJCTQ1MCwgNTQwLCA2MzAsIDYzMCwgNzIwLCAzMDAsIDM2MCwgNDIwLCAzNjAsIDQyMCwgNDgwLCA1NDAsIDQ4MCwgNTQwLCA2MDAsIDYwMCwKLQkJCTY2MCwgNDUwLCA1NDAsIDYzMCwgNTQwLCA2MzAsIDcyMCwgODEwLCA3MjAsIDgxMCwgOTAwLCA5MDAsIDk5MH0JfQkvLyBTaG9ydCBHSSwgNDBNSHoKLQl9OwotCi1zdGF0aWMgY29uc3QgdTggVU5LTk9XTl9CT1JBRENPTVszXSA9IHsweDAwLCAweDE0LCAweGJmfTsKLXN0YXRpYyBjb25zdCB1OCBMSU5LU1lTV1JUMzMwX0xJTktTWVNXUlQzMDBfQlJPQURDT01bM10gPSB7MHgwMCwgMHgxYSwgMHg3MH07Ci1zdGF0aWMgY29uc3QgdTggTElOS1NZU1dSVDM1MF9MSU5LU1lTV1JUMTUwX0JST0FEQ09NWzNdID0gezB4MDAsIDB4MWQsIDB4N2V9OwotLy9zdGF0aWMgdTggTkVUR0VBUjgzNEJ2Ml9CUk9BRENPTVszXSA9IHsweDAwLCAweDFiLCAweDJmfTsKLXN0YXRpYyBjb25zdCB1OCBCRUxLSU5GNUQ4MjMzVjFfUkFMSU5LWzNdID0gezB4MDAsIDB4MTcsIDB4M2Z9Owotc3RhdGljIGNvbnN0IHU4IEJFTEtJTkY1RDgyMzM0VjNfUkFMSU5LWzNdID0gezB4MDAsIDB4MWMsIDB4ZGZ9Owotc3RhdGljIGNvbnN0IHU4IFBDSV9SQUxJTktbM10gPSB7MHgwMCwgMHg5MCwgMHhjY307Ci1zdGF0aWMgY29uc3QgdTggRURJTUFYX1JBTElOS1szXSA9IHsweDAwLCAweDBlLCAweDJlfTsKLXN0YXRpYyBjb25zdCB1OCBBSVJMSU5LX1JBTElOS1szXSA9IHsweDAwLCAweDE4LCAweDAyfTsKLXN0YXRpYyBjb25zdCB1OCBETElOS19BVEhFUk9TWzNdID0gezB4MDAsIDB4MWMsIDB4ZjB9Owotc3RhdGljIGNvbnN0IHU4IENJU0NPX0JST0FEQ09NWzNdID0gezB4MDAsIDB4MTcsIDB4OTR9Owotc3RhdGljIGNvbnN0IHU4IExJTktTWVNfTUFSVkVMTF80NDAwTlszXSA9IHsweDAwLCAweDE0LCAweGE0fTsKLQotLy8gMjAwOC8wNC8wMSBNSCBGb3IgQ2lzY28gRyBtb2RlIFJYIFRQIFdlIG5lZWQgdG8gY2hhbmdlIEZXIGR1cmF0aW9uLiBTaG91bGQgd2UgcHV0IHRoZQotLy8gY29kZSBpbiBvdGhlciBwbGFjZT8/Ci0vL3N0YXRpYyB1OCBXSUZJX0NJU0NPX0dfQVBbM10gPSB7MHgwMCwgMHg0MCwgMHg5Nn07Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZSBkZWZhdWx0IHNldHRpbmdzIGluIHBIVEluZm8gc3RydWN0dXJlCi0gKiAgIGlucHV0OiAgUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvCi0gKiAgb3V0cHV0OiAgbm9uZQotICogIHJldHVybjogIG5vbmUKLSAqICBub3RpY2U6ICBUaGVzZSB2YWx1ZSBuZWVkIGJlIG1vZGlmaWVkIGlmIGFueSBjaGFuZ2VzLgotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEhUVXBkYXRlRGVmYXVsdFNldHRpbmcoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpCi17Ci0JUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKLQotCS8vIFNob3J0R0kgc3VwcG9ydAotCXBIVEluZm8tPmJSZWdTaG9ydEdJMjBNSHo9IDE7Ci0JcEhUSW5mby0+YlJlZ1Nob3J0R0k0ME1Iej0gMTsKLQotCS8vIDQwTUh6IGNoYW5uZWwgc3VwcG9ydAotCXBIVEluZm8tPmJSZWdCVzQwTUh6ID0gMTsKLQotCS8vIENDSyByYXRlIHN1cHBvcnQgaW4gNDBNSHogY2hhbm5lbAotCWlmKHBIVEluZm8tPmJSZWdCVzQwTUh6KQotCQlwSFRJbmZvLT5iUmVnU3VwcENDSyA9IDE7Ci0JZWxzZQotCQlwSFRJbmZvLT5iUmVnU3VwcENDSyA9IHRydWU7Ci0KLQkvLyBBTVNEVSByZWxhdGVkCi0JcEhUSW5mby0+bkFNU0RVX01heFNpemUgPSA3OTM1VUw7Ci0JcEhUSW5mby0+YkFNU0RVX1N1cHBvcnQgPSAwOwotCi0JLy8gQU1QRFUgcmVsYXRlZAotCXBIVEluZm8tPmJBTVBEVUVuYWJsZSA9IDE7Ci0JcEhUSW5mby0+QU1QRFVfRmFjdG9yID0gMjsgLy8vLyAwOiAybjEzKDhLKSwgMToybjE0KDE2SyksIDI6Mm4xNSgzMkspLCAzOjJuMTYoNjRrKQotCXBIVEluZm8tPk1QRFVfRGVuc2l0eSA9IDA7Ly8gMDogTm8gcmVzdHJpY3Rpb24sIDE6IDEvOHVzZWMsIDI6IDEvNHVzZWMsIDM6IDEvMnVzZWMsIDQ6IDF1c2VjLCA1OiAydXNlYywgNjogNHVzZWMsIDc6OHVzZWMKLQotCS8vIE1JTU8gUG93ZXIgU2F2ZQotCXBIVEluZm8tPlNlbGZNaW1vUHMgPSAzOy8vIDA6IFN0YXRpYyBNaW1vIFBzLCAxOiBEeW5hbWljIE1pbW8gUHMsIDM6IE5vIExpbWl0YXRpb24sIDI6IFJlc2VydmVkKFNldCB0byAzIGF1dG9tYXRpY2FsbHkuKQotCWlmKHBIVEluZm8tPlNlbGZNaW1vUHMgPT0gMikKLQkJcEhUSW5mby0+U2VsZk1pbW9QcyA9IDM7Ci0JLy8gODE5MCBvbmx5LiBBc3NpZ24gcmF0ZSBvcGVyYXRpb24gbW9kZSB0byBmaXJtd2FyZQotCWllZWUtPmJUeERpc2FibGVSYXRlRmFsbEJhY2sgPSAwOwotCWllZWUtPmJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZSA9IDA7Ci0KLSNpZmRlZiAJVE9fRE9fTElTVAotCS8vIDgxOTAgb25seS4gQXNzaWduIGR1cmF0aW9uIG9wZXJhdGlvbiBtb2RlIHRvIGZpcm13YXJlCi0JcE1nbnRJbmZvLT5iVHhFbmFibGVGd0NhbGNEdXIgPSAoQk9PTEVBTilwTmRpc0NvbW1vbi0+YlJlZ1R4RW5hYmxlRndDYWxjRHVyOwotI2VuZGlmCi0JLy8gODE5MCBvbmx5LCBSZWFsdGVrIHByb3ByaWV0YXJ5IGFnZ3JlZ2F0aW9uIG1vZGUKLQkvLyBTZXQgTVBEVURlbnNpdHk9MiwgICAxOiBTZXQgTVBEVURlbnNpdHk9MigzMmspICBmb3IgUmVhbHRlayBBUCBhbmQgc2V0IE1QRFVEZW5zaXR5PTAoOGspIGZvciBvdGhlcnMKLQlwSFRJbmZvLT5iUmVnUlQyUlRBZ2dyZWdhdGlvbiA9IDE7Ly8wOiBTZXQgTVBEVURlbnNpdHk9MiwgICAxOiBTZXQgTVBEVURlbnNpdHk9MigzMmspICBmb3IgUmVhbHRlayBBUCBhbmQgc2V0IE1QRFVEZW5zaXR5PTAoOGspIGZvciBvdGhlcnMKLQotCS8vIEZvciBSeCBSZW9yZGVyIENvbnRyb2wKLQlwSFRJbmZvLT5iUmVnUnhSZW9yZGVyRW5hYmxlID0gMTsKLQlwSFRJbmZvLT5SeFJlb3JkZXJXaW5TaXplID0gNjQ7Ci0JcEhUSW5mby0+UnhSZW9yZGVyUGVuZGluZ1RpbWUgPSAzMDsKLQotI2lmZGVmIFVTQl9UWF9EUklWRVJfQUdHUkVHQVRJT05fRU5BQkxFCi0JcEhUSW5mby0+VXNiVHhBZ2dyTnVtID0gNDsKLSNlbmRpZgotI2lmZGVmIFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCi0JcEhUSW5mby0+VXNiUnhGd0FnZ3JFbiA9IDE7Ci0JcEhUSW5mby0+VXNiUnhGd0FnZ3JQYWdlTnVtID0gMjQ7Ci0JcEhUSW5mby0+VXNiUnhGd0FnZ3JQYWNrZXROdW0gPSA4OwotCXBIVEluZm8tPlVzYlJ4RndBZ2dyVGltZW91dCA9IDE2OyAvLy8vdXNiIHJ4IEZXIGFnZ3JlZ2F0aW9uIHRpbWVvdXQgdGhyZXNob2xkLkl0J3MgaW4gdW5pdHMgb2YgNjR1cwotI2VuZGlmCi0KLQotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBwcmludCBvdXQgZWFjaCBmaWVsZCBvbiBIVCBjYXBhYmlsaXR5IElFIG1haW5seSBmcm9tIChCZWFjb24vUHJvYmVSc3AvQXNzb2NSZXEpCi0gKiAgIGlucHV0OiAgdTgqCUNhcElFICAgICAgIC8vQ2FwYWJpbGl0eSBJRSB0byBiZSBwcmludGVkIG91dAotICogICAJICAgICB1OCogCVRpdGxlU3RyaW5nIC8vbWFpbmx5IHByaW50IG91dCBjYWxsZXIgZnVuY3Rpb24KLSAqICBvdXRwdXQ6ICBub25lCi0gKiAgcmV0dXJuOiAgbm9uZQotICogIG5vdGljZTogIERyaXZlciBzaG91bGQgbm90IHByaW50IG91dCB0aGlzIG1lc3NhZ2UgYnkgZGVmYXVsdC4KLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBIVERlYnVnSFRDYXBhYmlsaXR5KHU4KiBDYXBJRSwgdTgqIFRpdGxlU3RyaW5nICkKLXsKLQotCXN0YXRpYyB1OAlFV0MxMU5IVENhcFtdID0gezB4MDAsIDB4OTAsIDB4NGMsIDB4MzN9OwkvLyBGb3IgMTFuIEVXQyBkZWZpbml0aW9uLCAyMDA3LjA3LjE3LCBieSBFbWlseQotCVBIVF9DQVBBQklMSVRZX0VMRSAJCXBDYXBFTEU7Ci0KLQlpZighbWVtY21wKENhcElFLCBFV0MxMU5IVENhcCwgc2l6ZW9mKEVXQzExTkhUQ2FwKSkpCi0JewotCQkvL0VXQyBJRQotCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiRVdDIElFIGluICVzKClcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JCXBDYXBFTEUgPSAoUEhUX0NBUEFCSUxJVFlfRUxFKSgmQ2FwSUVbNF0pOwotCX1lbHNlCi0JCXBDYXBFTEUgPSAoUEhUX0NBUEFCSUxJVFlfRUxFKSgmQ2FwSUVbMF0pOwotCi0JSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIjxMb2cgSFQgQ2FwYWJpbGl0eT4uIENhbGxlZCBieSAlc1xuIiwgVGl0bGVTdHJpbmcgKTsKLQotCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRTdXBwb3J0ZWQgQ2hhbm5lbCBXaWR0aCA9ICVzXG4iLCAocENhcEVMRS0+Q2hsV2lkdGgpPyIyME1IeiI6ICIyMC80ME1IeiIpOwotCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRTdXBwb3J0IFNob3J0IEdJIGZvciAyME0gPSAlc1xuIiwgKHBDYXBFTEUtPlNob3J0R0kyME1oeik/IllFUyI6ICJOTyIpOwotCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRTdXBwb3J0IFNob3J0IEdJIGZvciA0ME0gPSAlc1xuIiwgKHBDYXBFTEUtPlNob3J0R0k0ME1oeik/IllFUyI6ICJOTyIpOwotCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRTdXBwb3J0IFRYIFNUQkMgPSAlc1xuIiwgKHBDYXBFTEUtPlR4U1RCQyk/IllFUyI6ICJOTyIpOwotCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRNYXggQU1TRFUgU2l6ZSA9ICVzXG4iLCAocENhcEVMRS0+TWF4QU1TRFVTaXplKT8iMzgzOSI6ICI3OTM1Iik7Ci0JSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgICJcdFN1cHBvcnQgQ0NLIGluIDIwLzQwIG1vZGUgPSAlc1xuIiwgKHBDYXBFTEUtPkRzc0NDayk/IllFUyI6ICJOTyIpOwotCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRNYXggQU1QRFUgRmFjdG9yID0gJWRcbiIsIHBDYXBFTEUtPk1heFJ4QU1QRFVGYWN0b3IpOwotCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRNUERVIERlbnNpdHkgPSAlZFxuIiwgcENhcEVMRS0+TVBEVURlbnNpdHkpOwotCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICAiXHRNQ1MgUmF0ZSBTZXQgPSBbJXhdWyV4XVsleF1bJXhdWyV4XVxuIiwgcENhcEVMRS0+TUNTWzBdLFwKLQkJCQlwQ2FwRUxFLT5NQ1NbMV0sIHBDYXBFTEUtPk1DU1syXSwgcENhcEVMRS0+TUNTWzNdLCBwQ2FwRUxFLT5NQ1NbNF0pOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBwcmludCBvdXQgZWFjaCBmaWVsZCBvbiBIVCBJbmZvcm1hdGlvbiBJRSBtYWlubHkgZnJvbSAoQmVhY29uL1Byb2JlUnNwKQotICogICBpbnB1dDogIHU4KglJbmZvSUUgICAgICAgLy9DYXBhYmlsaXR5IElFIHRvIGJlIHByaW50ZWQgb3V0Ci0gKiAgIAkgICAgIHU4KiAJVGl0bGVTdHJpbmcgLy9tYWlubHkgcHJpbnQgb3V0IGNhbGxlciBmdW5jdGlvbgotICogIG91dHB1dDogIG5vbmUKLSAqICByZXR1cm46ICBub25lCi0gKiAgbm90aWNlOiAgRHJpdmVyIHNob3VsZCBub3QgcHJpbnQgb3V0IHRoaXMgbWVzc2FnZSBieSBkZWZhdWx0LgotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEhURGVidWdIVEluZm8odTgqCUluZm9JRSwgdTgqIFRpdGxlU3RyaW5nKQotewotCi0Jc3RhdGljIHU4CUVXQzExTkhUSW5mb1tdID0gezB4MDAsIDB4OTAsIDB4NGMsIDB4MzR9OwkvLyBGb3IgMTFuIEVXQyBkZWZpbml0aW9uLCAyMDA3LjA3LjE3LCBieSBFbWlseQotCVBIVF9JTkZPUk1BVElPTl9FTEUJCXBIVEluZm9FbGU7Ci0KLQlpZighbWVtY21wKEluZm9JRSwgRVdDMTFOSFRJbmZvLCBzaXplb2YoRVdDMTFOSFRJbmZvKSkpCi0JewotCQkvLyBOb3QgRVdDIElFCi0JCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJFV0MgSUUgaW4gJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKLQkJcEhUSW5mb0VsZSA9IChQSFRfSU5GT1JNQVRJT05fRUxFKSgmSW5mb0lFWzRdKTsKLQl9ZWxzZQotCQlwSFRJbmZvRWxlID0gKFBIVF9JTkZPUk1BVElPTl9FTEUpKCZJbmZvSUVbMF0pOwotCi0KLQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiPExvZyBIVCBJbmZvcm1hdGlvbiBFbGVtZW50Pi4gQ2FsbGVkIGJ5ICVzXG4iLCBUaXRsZVN0cmluZyk7Ci0KLQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiXHRQcmltYXJ5IGNoYW5uZWwgPSAlZFxuIiwgcEhUSW5mb0VsZS0+Q29udHJvbENobCk7Ci0JSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIlx0U2Vub25kYXJ5IGNoYW5uZWwgPSIpOwotCXN3aXRjaChwSFRJbmZvRWxlLT5FeHRDaGxPZmZzZXQpCi0JewotCQljYXNlIDA6Ci0JCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiTm90IFByZXNlbnRcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJVcHBlciBjaGFubmVsXG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiUmVzZXJ2ZWQuIEVvb3JvISEhXG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiTG93ZXIgQ2hhbm5lbFxuIik7Ci0JCQlicmVhazsKLQl9Ci0JSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIlx0UmVjb21tZW5kZWQgY2hhbm5lbCB3aWR0aCA9ICVzXG4iLCAocEhUSW5mb0VsZS0+UmVjb21tZW1kZWRUeFdpZHRoKT8iMjBNaHoiOiAiNDBNaHoiKTsKLQotCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJcdE9wZXJhdGlvbiBtb2RlIGZvciBwcm90ZWN0aW9uID0gIik7Ci0Jc3dpdGNoKHBIVEluZm9FbGUtPk9wdE1vZGUpCi0JewotCQljYXNlIDA6Ci0JCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiTm8gUHJvdGVjdGlvblxuIik7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIkhUIG5vbi1tZW1iZXIgcHJvdGVjdGlvbiBtb2RlXG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0hULCAiU3VnZ2VzdCB0byBvcGVuIHByb3RlY3Rpb25cbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJIVCBtaXhlZCBtb2RlXG4iKTsKLQkJCWJyZWFrOwotCX0KLQotCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJcdEJhc2ljIE1DUyBSYXRlIFNldCA9IFsleF1bJXhdWyV4XVsleF1bJXhdXG4iLCBwSFRJbmZvRWxlLT5CYXNpY01TQ1swXSxcCi0JCQkJcEhUSW5mb0VsZS0+QmFzaWNNU0NbMV0sIHBIVEluZm9FbGUtPkJhc2ljTVNDWzJdLCBwSFRJbmZvRWxlLT5CYXNpY01TQ1szXSwgcEhUSW5mb0VsZS0+QmFzaWNNU0NbNF0pOwotfQotCi0vKgotKglSZXR1cm46ICAgICAJdHJ1ZSBpZiBzdGF0aW9uIGluIGhhbGYgbiBtb2RlIGFuZCBBUCBzdXBwb3J0cyA0MCBidwotKi8KLWJvb2wgSXNIVEhhbGZObW9kZTQwQmFuZHdpZHRoKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKQotewotCWJvb2wJCQlyZXRWYWx1ZSA9IGZhbHNlOwotCVBSVF9ISUdIX1RIUk9VR0hQVVQJIHBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOwotCi0JaWYocEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPT0gZmFsc2UgKQkvLyB3aXJlbGVzcyBpcyBuIG1vZGUKLQkJcmV0VmFsdWUgPSBmYWxzZTsKLQllbHNlIGlmKHBIVEluZm8tPmJSZWdCVzQwTUh6ID09IGZhbHNlKQkvLyBzdGF0aW9uIHN1cHBvcnRzIDQwIGJ3Ci0JCXJldFZhbHVlID0gZmFsc2U7Ci0JZWxzZSBpZiAoIWllZWUtPkdldEhhbGZObW9kZVN1cHBvcnRCeUFQc0hhbmRsZXIoaWVlZSkpCS8vIHN0YXRpb24gaW4gaGFsZiBuIG1vZGUKLQkJcmV0VmFsdWUgPSBmYWxzZTsKLQllbHNlIGlmKCgoUEhUX0NBUEFCSUxJVFlfRUxFKShwSFRJbmZvLT5QZWVySFRDYXBCdWYpKS0+Q2hsV2lkdGgpIC8vIGFwIHN1cHBvcnQgNDAgYncKLQkJcmV0VmFsdWUgPSB0cnVlOwotCWVsc2UKLQkJcmV0VmFsdWUgPSBmYWxzZTsKLQotCXJldHVybiByZXRWYWx1ZTsKLX0KLQotYm9vbCBJc0hUSGFsZk5tb2RlU0dJKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBib29sIGlzNDBNSHopCi17Ci0JYm9vbAkJCXJldFZhbHVlID0gZmFsc2U7Ci0JUFJUX0hJR0hfVEhST1VHSFBVVAkgcEhUSW5mbyA9IGllZWUtPnBIVEluZm87Ci0KLQlpZihwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9PSBmYWxzZSApCS8vIHdpcmVsZXNzIGlzIG4gbW9kZQotCQlyZXRWYWx1ZSA9IGZhbHNlOwotCWVsc2UgaWYgKCFpZWVlLT5HZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHNIYW5kbGVyKGllZWUpKQkvLyBzdGF0aW9uIGluIGhhbGYgbiBtb2RlCi0JCXJldFZhbHVlID0gZmFsc2U7Ci0JZWxzZSBpZihpczQwTUh6KSAvLyBhcCBzdXBwb3J0IDQwIGJ3Ci0JewotCQlpZigoKFBIVF9DQVBBQklMSVRZX0VMRSkocEhUSW5mby0+UGVlckhUQ2FwQnVmKSktPlNob3J0R0k0ME1oeikgLy8gYXAgc3VwcG9ydCA0MCBidyBzaG9ydCBHSQotCQkJcmV0VmFsdWUgPSB0cnVlOwotCQllbHNlCi0JCQlyZXRWYWx1ZSA9IGZhbHNlOwotCX0KLQllbHNlCi0JewotCQlpZigoKFBIVF9DQVBBQklMSVRZX0VMRSkocEhUSW5mby0+UGVlckhUQ2FwQnVmKSktPlNob3J0R0kyME1oeikgLy8gYXAgc3VwcG9ydCA0MCBidyBzaG9ydCBHSQotCQkJcmV0VmFsdWUgPSB0cnVlOwotCQllbHNlCi0JCQlyZXRWYWx1ZSA9IGZhbHNlOwotCX0KLQotCXJldHVybiByZXRWYWx1ZTsKLX0KLQotdTE2IEhUSGFsZk1jc1RvRGF0YVJhdGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIAl1OAluTWNzUmF0ZSkKLXsKLQotCXU4CWlzNDBNSHo7Ci0JdTgJaXNTaG9ydEdJOwotCi0JaXM0ME1IeiAgPSAgKElzSFRIYWxmTm1vZGU0MEJhbmR3aWR0aChpZWVlKSk/MTowOwotCWlzU2hvcnRHSSA9IChJc0hUSGFsZk5tb2RlU0dJKGllZWUsIGlzNDBNSHopKT8gMTowOwotCi0JcmV0dXJuIE1DU19EQVRBX1JBVEVbaXM0ME1Iel1baXNTaG9ydEdJXVsobk1jc1JhdGUmMHg3ZildOwotfQotCi0KLXUxNiBIVE1jc1RvRGF0YVJhdGUoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCBuTWNzUmF0ZSkKLXsKLQlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOwotCi0JdTgJaXM0ME1IeiA9IChwSFRJbmZvLT5iQ3VyQlc0ME1Ieik/MTowOwotCXU4CWlzU2hvcnRHSSA9IChwSFRJbmZvLT5iQ3VyQlc0ME1Ieik/Ci0JCQkJCQkoKHBIVEluZm8tPmJDdXJTaG9ydEdJNDBNSHopPzE6MCk6Ci0JCQkJCQkoKHBIVEluZm8tPmJDdXJTaG9ydEdJMjBNSHopPzE6MCk7Ci0JcmV0dXJuIE1DU19EQVRBX1JBVEVbaXM0ME1Iel1baXNTaG9ydEdJXVsobk1jc1JhdGUmMHg3ZildOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgY3VycmVudCBkYXRhcmF0ZS4KLSAqICAgaW5wdXQ6ICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogCWllZWUKLSAqICAgCSAgICAgdTggCQkJbkRhdGFSYXRlCi0gKiAgb3V0cHV0OiAgbm9uZQotICogIHJldHVybjogIHR4IHJhdGUKLSAqICBub3RpY2U6ICBxdWl0ZSB1bnN1cmUgYWJvdXQgaG93IHRvIHVzZSB0aGlzIGZ1bmN0aW9uIC8vd2IKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTE2ICBUeENvdW50VG9EYXRhUmF0ZSggc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4IG5EYXRhUmF0ZSkKLXsKLQkvL1BSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IGllZWUtPnBIVEluZm87Ci0JdTE2CQlDQ0tPRkRNUmF0ZVsxMl0gPSB7MHgwMiAsIDB4MDQgLCAweDBiICwgMHgxNiAsIDB4MGMgLCAweDEyICwgMHgxOCAsIDB4MjQgLCAweDMwICwgMHg0OCAsIDB4NjAgLCAweDZjfTsKLQl1OAlpczQwTUh6ID0gMDsKLQl1OAlpc1Nob3J0R0kgPSAwOwotCi0JaWYobkRhdGFSYXRlIDwgMTIpCi0JewotCQlyZXR1cm4gQ0NLT0ZETVJhdGVbbkRhdGFSYXRlXTsKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKG5EYXRhUmF0ZSA+PSAweDEwICYmIG5EYXRhUmF0ZSA8PSAweDFmKS8vaWYobkRhdGFSYXRlID4gMTEgJiYgbkRhdGFSYXRlIDwgMjggKQotCQl7Ci0JCQlpczQwTUh6ID0gMDsKLQkJCWlzU2hvcnRHSSA9IDA7Ci0KLQkJICAgICAgLy8gbkRhdGFSYXRlID0gbkRhdGFSYXRlIC0gMTI7Ci0JCX0KLQkJZWxzZSBpZihuRGF0YVJhdGUgPj0weDIwICAmJiBuRGF0YVJhdGUgPD0gMHgyZiApIC8vKDI3LCA0NCkKLQkJewotCQkJaXM0ME1IeiA9IDE7Ci0JCQlpc1Nob3J0R0kgPSAwOwotCi0JCQkvL25EYXRhUmF0ZSA9IG5EYXRhUmF0ZSAtIDI4OwotCQl9Ci0JCWVsc2UgaWYobkRhdGFSYXRlID49IDB4MzAgICYmIG5EYXRhUmF0ZSA8PSAweDNmICkgIC8vKDQzLCA2MCkKLQkJewotCQkJaXM0ME1IeiA9IDA7Ci0JCQlpc1Nob3J0R0kgPSAxOwotCi0JCQkvL25EYXRhUmF0ZSA9IG5EYXRhUmF0ZSAtIDQ0OwotCQl9Ci0JCWVsc2UgaWYobkRhdGFSYXRlID49IDB4NDAgICYmIG5EYXRhUmF0ZSA8PSAweDRmICkgLy8oNTksIDc2KQotCQl7Ci0JCQlpczQwTUh6ID0gMTsKLQkJCWlzU2hvcnRHSSA9IDE7Ci0KLQkJCS8vbkRhdGFSYXRlID0gbkRhdGFSYXRlIC0gNjA7Ci0JCX0KLQkJcmV0dXJuIE1DU19EQVRBX1JBVEVbaXM0ME1Iel1baXNTaG9ydEdJXVtuRGF0YVJhdGUmMHhmXTsKLQl9Ci19Ci0KLQotCi1ib29sIElzSFRIYWxmTm1vZGVBUHMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpCi17Ci0JYm9vbAkJCXJldFZhbHVlID0gZmFsc2U7Ci0Jc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrKiBuZXQgPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOwotI2lmIDAKLQlpZihpZWVlLT5iSGFsZk5Nb2RlID09IGZhbHNlKQotCQlyZXRWYWx1ZSA9IGZhbHNlOwotCWVsc2UKLSNlbmRpZgotCWlmKChtZW1jbXAobmV0LT5ic3NpZCwgQkVMS0lORjVEODIzM1YxX1JBTElOSywgMyk9PTApIHx8Ci0JICAgCSAgICAgKG1lbWNtcChuZXQtPmJzc2lkLCBCRUxLSU5GNUQ4MjMzNFYzX1JBTElOSywgMyk9PTApIHx8Ci0JCSAgICAgKG1lbWNtcChuZXQtPmJzc2lkLCBQQ0lfUkFMSU5LLCAzKT09MCkgfHwKLQkJICAgICAobWVtY21wKG5ldC0+YnNzaWQsIEVESU1BWF9SQUxJTkssIDMpPT0wKSB8fAotCQkgICAgIChtZW1jbXAobmV0LT5ic3NpZCwgQUlSTElOS19SQUxJTkssIDMpPT0wKSB8fAotCQkgICAgIChuZXQtPnJhbGlua19jYXBfZXhpc3QpKQotCQlyZXRWYWx1ZSA9IHRydWU7Ci0JZWxzZSBpZigobWVtY21wKG5ldC0+YnNzaWQsIFVOS05PV05fQk9SQURDT00sIDMpPT0wKSB8fAotICAgIAkJICAgIChtZW1jbXAobmV0LT5ic3NpZCwgTElOS1NZU1dSVDMzMF9MSU5LU1lTV1JUMzAwX0JST0FEQ09NLCAzKT09MCl8fAotICAgIAkJICAgIChtZW1jbXAobmV0LT5ic3NpZCwgTElOS1NZU1dSVDM1MF9MSU5LU1lTV1JUMTUwX0JST0FEQ09NLCAzKT09MCl8fAotICAgIAkJICAgIC8vKG1lbWNtcChuZXQtPmJzc2lkLCBORVRHRUFSODM0QnYyX0JST0FEQ09NLCAzKT09MCkgfHwKLSAgICAJCSAgICAobmV0LT5icm9hZGNvbV9jYXBfZXhpc3QpKQotICAgIAkJICByZXRWYWx1ZSA9IHRydWU7Ci0JZWxzZSBpZihuZXQtPmJzc2h0LmJkUlQyUlRBZ2dyZWdhdGlvbikKLQkJcmV0VmFsdWUgPSB0cnVlOwotCWVsc2UKLQkJcmV0VmFsdWUgPSBmYWxzZTsKLQotCXJldHVybiByZXRWYWx1ZTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHBlZXIgSU9ULgotICogICBpbnB1dDogIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiAJaWVlZQotICogIG91dHB1dDogIG5vbmUKLSAqICByZXR1cm46Ci0gKiAgbm90aWNlOgotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEhUSU9UUGVlckRldGVybWluZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSkKLXsKLQlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOwotCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayogbmV0ID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKLQlpZihuZXQtPmJzc2h0LmJkUlQyUlRBZ2dyZWdhdGlvbikKLQkJcEhUSW5mby0+SU9UUGVlciA9IEhUX0lPVF9QRUVSX1JFQUxURUs7Ci0JZWxzZSBpZihuZXQtPmJyb2FkY29tX2NhcF9leGlzdCl7Ci0JCXBIVEluZm8tPklPVFBlZXIgPSBIVF9JT1RfUEVFUl9CUk9BRENPTTsKLQl9Ci0JZWxzZSBpZigobWVtY21wKG5ldC0+YnNzaWQsIFVOS05PV05fQk9SQURDT00sIDMpPT0wKSB8fAotCQkJKG1lbWNtcChuZXQtPmJzc2lkLCBMSU5LU1lTV1JUMzMwX0xJTktTWVNXUlQzMDBfQlJPQURDT00sIDMpPT0wKXx8Ci0JCQkobWVtY21wKG5ldC0+YnNzaWQsIExJTktTWVNXUlQzNTBfTElOS1NZU1dSVDE1MF9CUk9BRENPTSwgMyk9PTApKXsvL3x8Ci0JCQkvLyhtZW1jbXAobmV0LT5ic3NpZCwgTkVUR0VBUjgzNEJ2Ml9CUk9BRENPTSwgMyk9PTApICl7Ci0JCXBIVEluZm8tPklPVFBlZXIgPSBIVF9JT1RfUEVFUl9CUk9BRENPTTsKLQl9Ci0JZWxzZSBpZigobWVtY21wKG5ldC0+YnNzaWQsIEJFTEtJTkY1RDgyMzNWMV9SQUxJTkssIDMpPT0wKSB8fAotCQkJKG1lbWNtcChuZXQtPmJzc2lkLCBCRUxLSU5GNUQ4MjMzNFYzX1JBTElOSywgMyk9PTApIHx8Ci0JCQkobWVtY21wKG5ldC0+YnNzaWQsIFBDSV9SQUxJTkssIDMpPT0wKSB8fAotCQkJKG1lbWNtcChuZXQtPmJzc2lkLCBFRElNQVhfUkFMSU5LLCAzKT09MCkgfHwKLQkJCShtZW1jbXAobmV0LT5ic3NpZCwgQUlSTElOS19SQUxJTkssIDMpPT0wKSB8fAotCQkJIG5ldC0+cmFsaW5rX2NhcF9leGlzdCkKLQkJcEhUSW5mby0+SU9UUGVlciA9IEhUX0lPVF9QRUVSX1JBTElOSzsKLQllbHNlIGlmKChuZXQtPmF0aGVyb3NfY2FwX2V4aXN0ICl8fCAobWVtY21wKG5ldC0+YnNzaWQsIERMSU5LX0FUSEVST1MsIDMpID09IDApKQotCQlwSFRJbmZvLT5JT1RQZWVyID0gSFRfSU9UX1BFRVJfQVRIRVJPUzsKLQllbHNlIGlmKG1lbWNtcChuZXQtPmJzc2lkLCBDSVNDT19CUk9BRENPTSwgMyk9PTApCi0JCXBIVEluZm8tPklPVFBlZXIgPSBIVF9JT1RfUEVFUl9DSVNDTzsKLSAgICAgICAgZWxzZSBpZiAoKG1lbWNtcChuZXQtPmJzc2lkLCBMSU5LU1lTX01BUlZFTExfNDQwME4sIDMpID09IDApIHx8Ci0JCQluZXQtPm1hcnZlbGxfY2FwX2V4aXN0KXsKLQkJcEhUSW5mby0+SU9UUGVlciA9IEhUX0lPVF9QRUVSX01BUlZFTEw7Ci0JfQotCWVsc2UKLQkJcEhUSW5mby0+SU9UUGVlciA9IEhUX0lPVF9QRUVSX1VOS05PV047Ci0KLQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0lPVCwgIkpvc2VwaCBkZWJ1ZyEhIElPVFBFRVI6ICV4XG4iLCBwSFRJbmZvLT5JT1RQZWVyKTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICpmdW5jdGlvbjogIENoZWNrIHdoZXRoZXIgZHJpdmVyIHNob3VsZCBkZWNsYXJlIHJlY2VpdmVkIHJhdGUgdXAgdG8gTUNTMTMgb25seSBzaW5jZSBzb21lIGNoaXBzZXQgaXMgbm90IGdvb2QKLSAqCSAgICAgYXQgcmVjZWl2aW5nIE1DUzE0fjE1IGZyYW1lIGZyb20gc29tZSBBUC4KLSAqICAgaW5wdXQ6ICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogCWllZWUKLSAqICAgCSAgICAgdTggKgkJCVBlZXJNYWNBZGRyCi0gKiAgb3V0cHV0OiAgbm9uZQotICogIHJldHVybjogIHJldHVybiAxIGlmIGRyaXZlciBzaG91bGQgZGVjbGFyZSBNQ1MxMyBvbmx5KG90aGVyd2lzZSByZXR1cm4gMCkKLSAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IEhUSU9UQWN0SXNEaXNhYmxlTUNTMTQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4KiBQZWVyTWFjQWRkcikKLXsKLQl1OCByZXQgPSAwOwotI2lmIDAKLQkvLyBBcHBseSBmb3IgODE5dSBvbmx5Ci0jaWYgKEhBTF9DT0RFX0JBU0U9PVJUTDgxOTIgJiYgREVWX0JVU19UWVBFPT1VU0JfSU5URVJGQUNFKQotCWlmKChtZW1jbXAoUGVlck1hY0FkZHIsIFVOS05PV05fQk9SQURDT00sIDMpPT0wKSB8fAotICAgIAkJKG1lbWNtcChQZWVyTWFjQWRkciwgTElOS1NZU1dSVDMzMF9MSU5LU1lTV1JUMzAwX0JST0FEQ09NLCAzKT09MCkKLQkgICAgKQotCXsKLQkJcmV0ID0gMTsKLQl9Ci0KLQotCWlmKHBIVEluZm8tPmJDdXJyZW50UlQyUlRBZ2dyZWdhdGlvbikKLQl7Ci0JCS8vIFRoZSBwYXJhbWV0ZXIgb2YgcEhUSW5mby0+YkN1cnJlbnRSVDJSVEFnZ3JlZ2F0aW9uIG11c3QgYmUgZGVjaWRlZCBwcmV2aW91c2x5Ci0JCXJldCA9IDE7Ci0JfQotI2VuZGlmCi0jZW5kaWYKLQlyZXR1cm4gcmV0OwotIH0KLQotdTggSFRJT1RBY3RJc0ZvcmNlZENUUzJTZWxmKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmspCi17Ci0gICAgICAgIHU4ICAgICAgcmV0VmFsdWUgPSAwOwotICAgICAgICAvL2lmKG5ldHdvcmstPm1hcnZlbGxfY2FwX2V4aXN0KQotICAgICAgICBpZihpZWVlLT5wSFRJbmZvLT5JT1RQZWVyID09IEhUX0lPVF9QRUVSX01BUlZFTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXRWYWx1ZSA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmV0VmFsdWU7Ci19Ci0KLQotLyoqCi0qIEZ1bmN0aW9uOglIVElPVEFjdElzRGlzYWJsZU1DUzE1Ci0qCi0qIE92ZXJ2aWV3OglDaGVjayB3aGV0aGVyIGRyaXZlciBzaG91bGQgZGVjbGFyZSBjYXBhYmlsaXR5IG9mIHJlY2VpdmluZyBNQ1MxNQotKgotKiBJbnB1dDoKLSoJCQlQQURBUFRFUgkJQWRhcHRlciwKLSoKLSogT3V0cHV0OgkJTm9uZQotKiBSZXR1cm46ICAgICAJdHJ1ZSBpZiBkcml2ZXIgc2hvdWxkIGRpc2FibGUgTUNTMTUKLSogMjAwOC4wNC4xNQlFbWlseQotKi8KLWJvb2wgSFRJT1RBY3RJc0Rpc2FibGVNQ1MxNShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSkKLXsKLQlib29sIHJldFZhbHVlID0gZmFsc2U7Ci0KLSNpZmRlZiBUT0RPCi0JLy8gQXBwbHkgZm9yIDgxOXUgb25seQotI2lmIChIQUxfQ09ERV9CQVNFPT1SVEw4MTkyKQotCi0jaWYgKERFVl9CVVNfVFlQRSA9PSBVU0JfSU5URVJGQUNFKQotCS8vIEFsd2F5IGRpc2FibGUgTUNTMTUgYnkgSmVycnkgQ2hhbmcncyByZXF1ZXN0LmJ5IEVtaWx5LCAyMDA4LjA0LjE1Ci0JcmV0VmFsdWUgPSB0cnVlOwotI2VsaWYgKERFVl9CVVNfVFlQRSA9PSBQQ0lfSU5URVJGQUNFKQotCS8vIEVuYWJsZSBNQ1MxNSBpZiB0aGUgcGVlciBpcyBDaXNjbyBBUC4gYnkgRW1pbHksIDIwMDguMDUuMTIKLS8vCWlmKHBCc3NEZXNjLT5iQ2lzY29DYXBFeGlzdCkKLS8vCQlyZXRWYWx1ZSA9IGZhbHNlOwotLy8JZWxzZQotCQlyZXRWYWx1ZSA9IGZhbHNlOwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCS8vIEplcnJ5IENoYW5nIHN1Z2dlc3QgdGhhdCA4MTkwIDF4MiBkb2VzIG5vdCBuZWVkIHRvIGRpc2FibGUgTUNTMTUKLQotCXJldHVybiByZXRWYWx1ZTsKLX0KLQotLyoqCi0qIEZ1bmN0aW9uOglIVElPVEFjdElzRGlzYWJsZU1DU1R3b1NwYXRpYWxTdHJlYW0KLSoKLSogT3ZlcnZpZXc6CUNoZWNrIHdoZXRoZXIgZHJpdmVyIHNob3VsZCBkZWNsYXJlIGNhcGFiaWxpdHkgb2YgcmVjZWl2aW5nIEFsbCAyIHNzIHBhY2tldHMKLSoKLSogSW5wdXQ6Ci0qCQkJUEFEQVBURVIJCUFkYXB0ZXIsCi0qCi0qIE91dHB1dDoJCU5vbmUKLSogUmV0dXJuOiAgICAgCXRydWUgaWYgZHJpdmVyIHNob3VsZCBkaXNhYmxlIGFsbCB0d28gc3BhdGlhbCBzdHJlYW0gcGFja2V0Ci0qIDIwMDguMDQuMjEJRW1pbHkKLSovCi1ib29sIEhUSU9UQWN0SXNEaXNhYmxlTUNTVHdvU3BhdGlhbFN0cmVhbShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgdTggKlBlZXJNYWNBZGRyKQotewotCWJvb2wgcmV0VmFsdWUgPSBmYWxzZTsKLQotI2lmZGVmIFRPRE8KLQkvLyBBcHBseSBmb3IgODE5dSBvbmx5Ci0vLyNpZiAoSEFMX0NPREVfQkFTRT09UlRMODE5MikKLQotCS8vVGhpcyBydWxlIG9ubHkgYXBwbHkgdG8gQmVsa2luKFJhbGluaykgQVAKLQlpZihJU19VTkRFUl8xMU5fQUVTX01PREUoQWRhcHRlcikpCi0JewotCQlpZigoUGxhdGZvcm1Db21wYXJlTWVtb3J5KFBlZXJNYWNBZGRyLCBCRUxLSU5GNUQ4MjMzVjFfUkFMSU5LLCAzKT09MCkgfHwKLQkJCQkoUGxhdGZvcm1Db21wYXJlTWVtb3J5KFBlZXJNYWNBZGRyLCBQQ0lfUkFMSU5LLCAzKT09MCkgfHwKLQkJCQkoUGxhdGZvcm1Db21wYXJlTWVtb3J5KFBlZXJNYWNBZGRyLCBFRElNQVhfUkFMSU5LLCAzKT09MCkpCi0JCXsKLQkJCS8vU2V0IFRydWUgdG8gZGlzYWJsZSB0aGlzIGZ1bmN0aW9uLiBEaXNhYmxlIGJ5IGRlZmF1bHQsIEVtaWx5LCAyMDA4LjA0LjIzCi0JCQlyZXRWYWx1ZSA9IGZhbHNlOwotCQl9Ci0JfQotCi0vLyNlbmRpZgotI2VuZGlmCi0JcmV0dXJuIHJldFZhbHVlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqZnVuY3Rpb246ICBDaGVjayB3aGV0aGVyIGRyaXZlciBzaG91bGQgZGlzYWJsZSBFRENBIHR1cmJvIG1vZGUKLSAqICAgaW5wdXQ6ICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogCWllZWUKLSAqICAgCSAgICAgdTgqIAkJCVBlZXJNYWNBZGRyCi0gKiAgb3V0cHV0OiAgbm9uZQotICogIHJldHVybjogIHJldHVybiAxIGlmIGRyaXZlciBzaG91bGQgZGlzYWJsZSBFRENBIHR1cmJvIG1vZGUob3RoZXJ3aXNlIHJldHVybiAwKQotICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggSFRJT1RBY3RJc0Rpc2FibGVFRENBVHVyYm8oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIAlpZWVlLCB1OCogUGVlck1hY0FkZHIpCi17Ci0JdTgJcmV0VmFsdWUgPSBmYWxzZTsJLy8gZGVmYXVsdCBlbmFibGUgRURDQSBUdXJibyBtb2RlLgotCS8vIFNldCBzcGVjaWZpYyBFRENBIHBhcmFtZXRlciBmb3IgZGlmZmVyZW50IEFQIGluIERNIGhhbmRsZXIuCi0KLQlyZXR1cm4gcmV0VmFsdWU7Ci0jaWYgMAotCWlmKChtZW1jbXAoUGVlck1hY0FkZHIsIFVOS05PV05fQk9SQURDT00sIDMpPT0wKXx8Ci0JCShtZW1jbXAoUGVlck1hY0FkZHIsIExJTktTWVNXUlQzMzBfTElOS1NZU1dSVDMwMF9CUk9BRENPTSwgMyk9PTApfHwKLQkJKG1lbWNtcChQZWVyTWFjQWRkciwgTElOS1NZU1dSVDM1MF9MSU5LU1lTV1JUMTUwX0JST0FEQ09NLCAzKT09MCl8fAotCQkobWVtY21wKFBlZXJNYWNBZGRyLCBORVRHRUFSODM0QnYyX0JST0FEQ09NLCAzKT09MCkpCi0KLQl7Ci0JCXJldFZhbHVlID0gMTsJLy9MaW5rc3lzIGRpc2FibGUgRURDQSB0dXJibyBtb2RlCi0JfQotCi0JcmV0dXJuIHJldFZhbHVlOwotI2VuZGlmCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICpmdW5jdGlvbjogIENoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byB1c2UgT0ZETSB0byBzbmVkIE1HTlQgZnJhbWUgZm9yIGJyb2FkY29tIEFQCi0gKiAgIGlucHV0OiAgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXR3b3JrICAgLy9jdXJyZW50IG5ldHdvcmsgd2UgbGl2ZQotICogIG91dHB1dDogIG5vbmUKLSAqICByZXR1cm46ICByZXR1cm4gMSBpZiB0cnVlCi0gICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBIVElPVEFjdElzTWdudFVzZUNDSzZNKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaykKLXsKLQl1OAlyZXRWYWx1ZSA9IDA7Ci0KLQkvLyAyMDA4LzAxLzI1IE1IIEp1ZGVnIGlmIHdlIG5lZWQgdG8gdXNlIE9GRE0gdG8gc25lZCBNR05UIGZyYW1lIGZvciBicm9hZGNvbSBBUC4KLQkvLyAyMDA4LzAxLzI4IE1IIFdlIG11c3QgcHJldmVudCB0aGF0IHdlIHNlbGVjdCBudWxsIGJzc2lkIHRvIGxpbmsuCi0KLQlpZihuZXR3b3JrLT5icm9hZGNvbV9jYXBfZXhpc3QpCi0JewotCQlyZXRWYWx1ZSA9IDE7Ci0JfQotCi0JcmV0dXJuIHJldFZhbHVlOwotfQotCi11OCBIVElPVEFjdElzQ0NERnN5bmModTgqIFBlZXJNYWNBZGRyKQotewotCXU4CXJldFZhbHVlID0gMDsKLQlpZigJKG1lbWNtcChQZWVyTWFjQWRkciwgVU5LTk9XTl9CT1JBRENPTSwgMyk9PTApIHx8Ci0JICAgIAkobWVtY21wKFBlZXJNYWNBZGRyLCBMSU5LU1lTV1JUMzMwX0xJTktTWVNXUlQzMDBfQlJPQURDT00sIDMpPT0wKSB8fAotCSAgICAJKG1lbWNtcChQZWVyTWFjQWRkciwgTElOS1NZU1dSVDM1MF9MSU5LU1lTV1JUMTUwX0JST0FEQ09NLCAzKSA9PTApKQotCXsKLQkJcmV0VmFsdWUgPSAxOwotCX0KLQotCXJldHVybiByZXRWYWx1ZTsKLX0KLQotLy8KLS8vICBTZW5kIG51bGwgZGF0YSBmb3IgdG8gdGVsbCBBUCB0aGF0IHdlIGFyZSBhd2FrZS4KLS8vCi1ib29sCi1IVElPVEFjdElzTnVsbERhdGFQb3dlclNhdmluZyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSxzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmspCi17Ci0JYm9vbAlyZXRWYWx1ZSA9IGZhbHNlOwotCi0JUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKLQl7Ci0JCWlmKHBIVEluZm8tPklPVFBlZXIgPT0gSFRfSU9UX1BFRVJfQlJPQURDT00pIC8vIHx8KHBCc3NEZXNjLT5WZW5kZXIgPT0gSFRfSU9UX1BFRVJfQVRIRVJPUyAmJiBwQnNzRGVzYy0+U3ViVHlwZU9mVmVuZGVyID09IEhUX0lPVF9QRUVSX0FUSEVST1NfRElSNjM1KSkKLQkJCXJldHVybiB0cnVlOwotCi0JfQotCXJldHVybiByZXRWYWx1ZTsKLX0KLQotdm9pZCBIVFJlc2V0SU9UU2V0dGluZygKLQlQUlRfSElHSF9USFJPVUdIUFVUCQlwSFRJbmZvCi0pCi17Ci0JcEhUSW5mby0+SU9UQWN0aW9uID0gMDsKLQlwSFRJbmZvLT5JT1RQZWVyID0gSFRfSU9UX1BFRVJfVU5LTk9XTjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqZnVuY3Rpb246ICBDb25zdHJ1Y3QgQ2FwYWJsaWxpdHkgRWxlbWVudCBpbiBCZWFjb24uLi4gaWYgSFRFbmFibGUgaXMgdHVybmVkIG9uCi0gKiAgIGlucHV0OiAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIAlpZWVlCi0gKiAgIAkgICAgIHU4KiAJCQlwb3NIVENhcCAvL3BvaW50ZXIgdG8gc3RvcmUgQ2FwYWJpbGl0eSBFbGUKLSAqICAgCSAgICAgdTgqCQkJbGVuIC8vc3RvcmUgbGVuZ3RoIG9mIENFCi0gKiAgIAkgICAgIHU4CQkJCUlzRW5jcnlwdCAvL3doZXRoZXIgZW5jcnlwdCwgbmVlZGVkIGZ1cnRoZXIKLSAqICBvdXRwdXQ6ICBub25lCi0gKiAgcmV0dXJuOiAgbm9uZQotICogIG5vdGljZTogIHBvc0hUQ2FwIGNhbid0IGJlIG51bGwgYW5kIHNob3VsZCBiZSBpbml0aWFsaXplZCBiZWZvcmUuCi0gICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEhUQ29uc3RydWN0Q2FwYWJpbGl0eUVsZW1lbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4KiBwb3NIVENhcCwgdTgqIGxlbiwgdTggSXNFbmNyeXB0KQotewotCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUID0gaWVlZS0+cEhUSW5mbzsKLQlQSFRfQ0FQQUJJTElUWV9FTEUgCXBDYXBFTEUgPSBOVUxMOwotCS8vdTggYklzRGVjbGFyZU1DUzEzOwotCi0JaWYgKChwb3NIVENhcCA9PSBOVUxMKSB8fCAocEhUID09IE5VTEwpKQotCXsKLQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICJwb3NIVENhcCBvciBwSFRJbmZvIGNhbid0IGJlIG51bGwgaW4gSFRDb25zdHJ1Y3RDYXBhYmlsaXR5RWxlbWVudCgpXG4iKTsKLQkJcmV0dXJuOwotCX0KLQltZW1zZXQocG9zSFRDYXAsIDAsICpsZW4pOwotCWlmKHBIVC0+ZVBlZXJIVFNwZWNWZXIgPT0gSFRfU1BFQ19WRVJfRVdDKQotCXsKLQkJdTgJRVdDMTFOSFRDYXBbXSA9IHsweDAwLCAweDkwLCAweDRjLCAweDMzfTsJLy8gRm9yIDExbiBFV0MgZGVmaW5pdGlvbiwgMjAwNy4wNy4xNywgYnkgRW1pbHkKLQkJbWVtY3B5KHBvc0hUQ2FwLCBFV0MxMU5IVENhcCwgc2l6ZW9mKEVXQzExTkhUQ2FwKSk7Ci0JCXBDYXBFTEUgPSAoUEhUX0NBUEFCSUxJVFlfRUxFKSYocG9zSFRDYXBbNF0pOwotCX1lbHNlCi0JewotCQlwQ2FwRUxFID0gKFBIVF9DQVBBQklMSVRZX0VMRSlwb3NIVENhcDsKLQl9Ci0KLQotCS8vSFQgY2FwYWJpbGl0eSBpbmZvCi0JcENhcEVMRS0+QWR2Q29kaW5nIAkJPSAwOyAvLyBUaGlzIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBub3chIQotCWlmIChpZWVlLT5HZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHNIYW5kbGVyKGllZWUpKQotCXsKLQkJcENhcEVMRS0+Q2hsV2lkdGggPSAwOwotCX0KLQllbHNlCi0JewotCQlwQ2FwRUxFLT5DaGxXaWR0aCA9IChwSFQtPmJSZWdCVzQwTUh6PzE6MCk7Ci0JfQotCi0vLwlwQ2FwRUxFLT5DaGxXaWR0aCAJCT0gKHBIVC0+YlJlZ0JXNDBNSHo/MTowKTsKLQlwQ2FwRUxFLT5NaW1vUHdyU2F2ZSAJCT0gcEhULT5TZWxmTWltb1BzOwotCXBDYXBFTEUtPkdyZWVuRmllbGQJCT0gMDsgLy8gVGhpcyBmZWF0dXJlIGlzIG5vdCBzdXBwb3J0ZWQgbm93ISEKLQlwQ2FwRUxFLT5TaG9ydEdJMjBNaHoJCT0gMTsgLy8gV2UgY2FuIHJlY2VpdmUgU2hvcnQgR0khIQotCXBDYXBFTEUtPlNob3J0R0k0ME1oegkJPSAxOyAvLyBXZSBjYW4gcmVjZWl2ZSBTaG9ydCBHSSEhCi0JLy9EYmdQcmludCgiVFggSFQgY2FwL2luZm8gZWxlIEJXPSVkIFNHMjA9JWQgU0c0MD0lZFxuXHIiLAotCQkvL3BDYXBFTEUtPkNobFdpZHRoLCBwQ2FwRUxFLT5TaG9ydEdJMjBNaHosIHBDYXBFTEUtPlNob3J0R0k0ME1oeik7Ci0JcENhcEVMRS0+VHhTVEJDIAkJPSAxOwotCXBDYXBFTEUtPlJ4U1RCQyAJCT0gMDsKLQlwQ2FwRUxFLT5EZWxheUJBCQk9IDA7CS8vIERvIG5vdCBzdXBwb3J0IG5vdyEhCi0JcENhcEVMRS0+TWF4QU1TRFVTaXplCT0gKE1BWF9SRUNFSVZFX0JVRkZFUl9TSVpFPj03OTM1KT8xOjA7Ci0JcENhcEVMRS0+RHNzQ0NrIAkJPSAoKHBIVC0+YlJlZ0JXNDBNSHopPyhwSFQtPmJSZWdTdXBwQ0NLPzE6MCk6MCk7Ci0JcENhcEVMRS0+UFNNUAkJCT0gMDsgLy8gRG8gbm90IHN1cHBvcnQgbm93ISEKLQlwQ2FwRUxFLT5MU2lnVHhvcFByb3RlY3QJPSAwOyAvLyBEbyBub3Qgc3VwcG9ydCBub3chIQotCi0KLQkvL01BQyBIVCBwYXJhbWV0ZXJzIGluZm8KLSAgICAgICAgLy8gVE9ETzogTmVkZCB0byB0YWtlIGNhcmUgb2YgdGhpcyBwYXJ0Ci0JSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIlRYIEhUIGNhcC9pbmZvIGVsZSBCVz0lZCBNYXhBTVNEVVNpemU6JWQgRHNzQ0NrOiVkXG4iLCBwQ2FwRUxFLT5DaGxXaWR0aCwgcENhcEVMRS0+TWF4QU1TRFVTaXplLCBwQ2FwRUxFLT5Ec3NDQ2spOwotCi0JaWYoIElzRW5jcnlwdCkKLQl7Ci0JCXBDYXBFTEUtPk1QRFVEZW5zaXR5IAk9IDc7IC8vIDh1cwotCQlwQ2FwRUxFLT5NYXhSeEFNUERVRmFjdG9yIAk9IDI7IC8vIDIgaXMgZm9yIDMyIEsgYW5kIDMgaXMgNjRLCi0JfQotCWVsc2UKLQl7Ci0JCXBDYXBFTEUtPk1heFJ4QU1QRFVGYWN0b3IgCT0gMzsgLy8gMiBpcyBmb3IgMzIgSyBhbmQgMyBpcyA2NEsKLQkJcENhcEVMRS0+TVBEVURlbnNpdHkgCT0gMDsgLy8gbm8gZGVuc2l0eQotCX0KLQotCS8vU3VwcG9ydGVkIE1DUyBzZXQKLQltZW1jcHkocENhcEVMRS0+TUNTLCBpZWVlLT5SZWdkb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0LCAxNik7Ci0JaWYocEhULT5JT1RBY3Rpb24gJiBIVF9JT1RfQUNUX0RJU0FCTEVfTUNTMTUpCi0JCXBDYXBFTEUtPk1DU1sxXSAmPSAweDdmOwotCi0JaWYocEhULT5JT1RBY3Rpb24gJiBIVF9JT1RfQUNUX0RJU0FCTEVfTUNTMTQpCi0JCXBDYXBFTEUtPk1DU1sxXSAmPSAweGJmOwotCi0JaWYocEhULT5JT1RBY3Rpb24gJiBIVF9JT1RfQUNUX0RJU0FCTEVfQUxMXzJTUykKLQkJcENhcEVMRS0+TUNTWzFdICY9IDB4MDA7Ci0KLQkvLyAyMDA4LjA2LjEyCi0JLy8gRm9yIFJUTDgxOVgsIGlmIHBhaXJ3aXNla2V5ID0gd2VwL3RraXAsIGFwIGlzIHJhbGluaywgd2Ugc3VwcG9ydCBvbmx5IE1DUzB+Ny4KLQlpZiAoaWVlZS0+R2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzSGFuZGxlcihpZWVlKSkKLQl7Ci0JCWludCBpOwotCQlmb3IoaSA9IDE7IGk8IDE2OyBpKyspCi0JCQlwQ2FwRUxFLT5NQ1NbaV0gPSAwOwotCX0KLQotCS8vRXh0ZW5kZWQgSFQgQ2FwYWJpbGl0eSBJbmZvCi0JbWVtc2V0KCZwQ2FwRUxFLT5FeHRIVENhcEluZm8sIDAsIDIpOwotCi0KLQkvL1RYQkYgQ2FwYWJpbGl0aWVzCi0JbWVtc2V0KHBDYXBFTEUtPlR4QkZDYXAsIDAsIDQpOwotCi0JLy9BbnRlbm5hIFNlbGVjdGlvbiBDYXBhYmlsaXRpZXMKLQlwQ2FwRUxFLT5BU0NhcCA9IDA7Ci0vL2FkZCAyIHRvIGdpdmUgc3BhY2UgZm9yIGVsZW1lbnQgSUQgYW5kIGxlbiB3aGVuIGNvbnN0cnVjdCBmcmFtZXMKLQlpZihwSFQtPmVQZWVySFRTcGVjVmVyID09IEhUX1NQRUNfVkVSX0VXQykKLQkJKmxlbiA9IDMwICsgMjsKLQllbHNlCi0JCSpsZW4gPSAyNiArIDI7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqZnVuY3Rpb246ICBDb25zdHJ1Y3QgIEluZm9ybWF0aW9uIEVsZW1lbnQgaW4gQmVhY29uLi4uIGlmIEhURW5hYmxlIGlzIHR1cm5lZCBvbgotICogICBpbnB1dDogIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiAJaWVlZQotICogICAJICAgICB1OCogCQkJcG9zSFRDYXAgLy9wb2ludGVyIHRvIHN0b3JlIEluZm9ybWF0aW9uIEVsZQotICogICAJICAgICB1OCoJCQlsZW4gICAvL3N0b3JlIGxlbiBvZgotICogICAJICAgICB1OAkJCQlJc0VuY3J5cHQgLy93aGV0aGVyIGVuY3J5cHQsIG5lZWRlZCBmdXJ0aGVyCi0gKiAgb3V0cHV0OiAgbm9uZQotICogIHJldHVybjogIG5vbmUKLSAqICBub3RpY2U6ICBwb3NIVENhcCBjYW4ndCBiZSBudWxsIGFuZCBiZSBpbml0aWFsaXplZCBiZWZvcmUuIG9ubHkgQVAgYW5kIElCU1Mgc3RhIHNob3VsZCBkbyB0aGlzCi0gICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIEhUQ29uc3RydWN0SW5mb0VsZW1lbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4KiBwb3NIVEluZm8sIHU4KiBsZW4sIHU4IElzRW5jcnlwdCkKLXsKLQlQUlRfSElHSF9USFJPVUdIUFVUCXBIVCA9IGllZWUtPnBIVEluZm87Ci0JUEhUX0lORk9STUFUSU9OX0VMRQkJcEhUSW5mb0VsZSA9IChQSFRfSU5GT1JNQVRJT05fRUxFKXBvc0hUSW5mbzsKLQlpZiAoKHBvc0hUSW5mbyA9PSBOVUxMKSB8fCAocEhUSW5mb0VsZSA9PSBOVUxMKSkKLQl7Ci0JCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAicG9zSFRJbmZvIG9yIHBIVEluZm9FbGUgY2FuJ3QgYmUgbnVsbCBpbiBIVENvbnN0cnVjdEluZm9FbGVtZW50KClcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JbWVtc2V0KHBvc0hUSW5mbywgMCwgKmxlbik7Ci0JaWYgKCAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB8fCAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikpIC8vYXAgbW9kZSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZAotCXsKLQkJcEhUSW5mb0VsZS0+Q29udHJvbENobCAJCQk9IGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsOwotCQlwSFRJbmZvRWxlLT5FeHRDaGxPZmZzZXQgCQkJPSAoKHBIVC0+YlJlZ0JXNDBNSHogPT0gZmFsc2UpP0hUX0VYVENITkxfT0ZGU0VUX05PX0VYVDoKLQkJCQkJCQkJCQkJKGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsPD02KT8KLQkJCQkJCQkJCQkJCUhUX0VYVENITkxfT0ZGU0VUX1VQUEVSOkhUX0VYVENITkxfT0ZGU0VUX0xPV0VSKTsKLQkJcEhUSW5mb0VsZS0+UmVjb21tZW1kZWRUeFdpZHRoCT0gcEhULT5iUmVnQlc0ME1IejsKLQkJcEhUSW5mb0VsZS0+UklGUyAJCQkJCT0gMDsKLQkJcEhUSW5mb0VsZS0+UFNNUEFjY2Vzc09ubHkJCT0gMDsKLQkJcEhUSW5mb0VsZS0+U3J2SW50R3JhbnVsYXJpdHkJCT0gMDsKLQkJcEhUSW5mb0VsZS0+T3B0TW9kZQkJCQk9IHBIVC0+Q3VycmVudE9wTW9kZTsKLQkJcEhUSW5mb0VsZS0+Tm9uR0ZEZXZQcmVzZW50CQk9IDA7Ci0JCXBIVEluZm9FbGUtPkR1YWxCZWFjb24JCQk9IDA7Ci0JCXBIVEluZm9FbGUtPlNlY29uZGFyeUJlYWNvbgkJPSAwOwotCQlwSFRJbmZvRWxlLT5MU2lnVHhvcFByb3RlY3RGdWxsCQk9IDA7Ci0JCXBIVEluZm9FbGUtPlBjb0FjdGl2ZQkJCQk9IDA7Ci0JCXBIVEluZm9FbGUtPlBjb1BoYXNlCQkJCT0gMDsKLQotCQltZW1zZXQocEhUSW5mb0VsZS0+QmFzaWNNU0MsIDAsIDE2KTsKLQotCi0JCSpsZW4gPSAyMiArIDI7IC8vc2FtZSBhYm92ZQotCi0JfQotCWVsc2UKLQl7Ci0JCS8vU1RBIHNob3VsZCBub3QgZ2VuZXJhdGUgSGlnaCBUaHJvdWdocHV0IEluZm9ybWF0aW9uIEVsZW1lbnQKLQkJKmxlbiA9IDA7Ci0JfQotfQotCi0vKgotICAqICBBY2NvcmRpbmcgdG8gZXhwZXJpbWVudCwgUmVhbHRlayBBUCB0byBTVEEgKGJhc2VkIG9uIHJ0bDgxOTApIG1heSBhY2hpZXZlIGJlc3QgcGVyZm9ybWFuY2UKLSAgKiAgaWYgYm90aCBTVEEgYW5kIEFQIHNldCBsaW1pdGF0aW9uIG9mIGFnZ3JlZ2F0aW9uIHNpemUgdG8gMzJLLCB0aGF0IGlzLCBzZXQgQU1QRFUgZGVuc2l0eSB0byAyCi0gICogIChSZWY6IElFRUUgMTFuIHNwZWNpZmljYXRpb24pLiBIb3dldmVyLCBpZiBSZWFsdGVrIFNUQSBhc3NvY2lhdGVzIHRvIG90aGVyIEFQLCBTVEEgc2hvdWxkIHNldAotICAqICBsaW1pdGF0aW9uIG9mIGFnZ3JlZ2F0aW9uIHNpemUgdG8gOEssIG90aGVyd2lzZSwgcGVyZm9ybWFuY2Ugb2YgdHJhZmZpYyBzdHJlYW0gZnJvbSBTVEEgdG8gQVAKLSAgKiAgd2lsbCBiZSBtdWNoIGxlc3MgdGhhbiB0aGUgdHJhZmZpYyBzdHJlYW0gZnJvbSBBUCB0byBTVEEgaWYgYm90aCBvZiB0aGUgc3RyZWFtIHJ1bnMgY29uY3VycmVudGx5Ci0gICogIGF0IHRoZSBzYW1lIHRpbWUuCi0gICoKLSAgKiAgRnJhbWUgRm9ybWF0Ci0gICogIEVsZW1lbnQgSUQJCUxlbmd0aAkJT1VJCQkJVHlwZTEJCVJlc2VydmVkCi0gICogIDEgYnl0ZQkJCTEgYnl0ZQkJMyBieXRlcwkJMSBieXRlCQkxIGJ5dGUKLSAgKgotICAqICBPVUkgCQk9IDB4MDAsIDB4ZTAsIDB4NGMsCi0gICogIFR5cGUgCT0gMHgwMgotICAqICBSZXNlcnZlZCAJPSAweDAwCi0gICoKLSAgKiAgMjAwNy44LjIxIGJ5IEVtaWx5Ci0qLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKmZ1bmN0aW9uOiAgQ29uc3RydWN0ICBJbmZvcm1hdGlvbiBFbGVtZW50IGluIEJlYWNvbi4uLiBpbiBSVDJSVCBjb25kaXRpb24KLSAqICAgaW5wdXQ6ICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogCWllZWUKLSAqICAgCSAgICAgdTgqIAkJCXBvc1JUMlJUQWdnIC8vcG9pbnRlciB0byBzdG9yZSBJbmZvcm1hdGlvbiBFbGUKLSAqICAgCSAgICAgdTgqCQkJbGVuICAgLy9zdG9yZSBsZW4KLSAqICBvdXRwdXQ6ICBub25lCi0gKiAgcmV0dXJuOiAgbm9uZQotICogIG5vdGljZToKLSAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgSFRDb25zdHJ1Y3RSVDJSVEFnZ0VsZW1lbnQoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIHU4KiBwb3NSVDJSVEFnZywgdTgqIGxlbikKLXsKLQlpZiAocG9zUlQyUlRBZ2cgPT0gTlVMTCkgewotCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgInBvc1JUMlJUQWdnIGNhbid0IGJlIG51bGwgaW4gSFRDb25zdHJ1Y3RSVDJSVEFnZ0VsZW1lbnQoKVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JbWVtc2V0KHBvc1JUMlJUQWdnLCAwLCAqbGVuKTsKLQkqcG9zUlQyUlRBZ2crKyA9IDB4MDA7Ci0JKnBvc1JUMlJUQWdnKysgPSAweGUwOwotCSpwb3NSVDJSVEFnZysrID0gMHg0YzsKLQkqcG9zUlQyUlRBZ2crKyA9IDB4MDI7Ci0JKnBvc1JUMlJUQWdnKysgPSAweDAxOwotCSpwb3NSVDJSVEFnZyA9IDB4MTA7Ly8qcG9zUlQyUlRBZ2cgPSAweDAyOwotCi0JaWYoaWVlZS0+YlN1cHBvcnRSZW1vdGVXYWtlVXApIHsKLQkJKnBvc1JUMlJUQWdnIHw9IDB4MDg7Ly9SVF9IVF9DQVBfVVNFX1dPVzsKLQl9Ci0KLQkqbGVuID0gNiArIDI7Ci0JcmV0dXJuOwotI2lmZGVmIFRPRE8KLSNpZihIQUxfQ09ERV9CQVNFID09IFJUTDgxOTIgJiYgREVWX0JVU19UWVBFID09IFVTQl9JTlRFUkZBQ0UpCi0JLyoKLQkvL0VtaWx5LiBJZiBpdCBpcyByZXF1aXJlZCB0byBBc2sgUmVhbHRlayBBUCB0byBzZW5kIEFNUERVIGR1cmluZyBBRVMgbW9kZSwgZW5hYmxlIHRoaXMKLQkgICBzZWN0aW9uIG9mIGNvZGUuCi0JaWYoSVNfVU5ERVJfMTFOX0FFU19NT0RFKEFkYXB0ZXIpKQotCXsKLQkJcG9zUlQyUlRBZ2ctPk9jdGV0WzVdIHw9UlRfSFRfQ0FQX1VTRV9BTVBEVTsKLQl9ZWxzZQotCXsKLQkJcG9zUlQyUlRBZ2ctPk9jdGV0WzVdICY9IDB4ZmI7Ci0JfQotCSovCi0KLSNlbHNlCi0JLy8gRG8gTm90aGluZwotI2VuZGlmCi0KLQlwb3NSVDJSVEFnZy0+TGVuZ3RoID0gNjsKLSNlbmRpZgotCi0KLQotCi19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKmZ1bmN0aW9uOiAgUGljayB0aGUgcmlnaHQgUmF0ZSBBZGFwdGl2ZSB0YWJsZSB0byB1c2UKLSAqICAgaW5wdXQ6ICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogCWllZWUKLSAqICAgCSAgICAgdTgqIAkJCXBPcGVyYXRlTUNTIC8vQSBwb2ludGVyIHRvIE1DUyByYXRlIGJpdG1hcAotICogIHJldHVybjogIGFsd2F5cyB3ZSByZXR1cm4gdHJ1ZQotICogIG5vdGljZToKLSAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IEhUX1BpY2tNQ1NSYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcE9wZXJhdGVNQ1MpCi17Ci0JdTgJCQkJCWk7Ci0JaWYgKHBPcGVyYXRlTUNTID09IE5VTEwpCi0JewotCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgInBPcGVyYXRlTUNTIGNhbid0IGJlIG51bGwgaW4gSFRfUGlja01DU1JhdGUoKVxuIik7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlzd2l0Y2goaWVlZS0+bW9kZSkKLQl7Ci0JY2FzZSBJRUVFX0E6Ci0JY2FzZSBJRUVFX0I6Ci0JY2FzZSBJRUVFX0c6Ci0JCQkvL2xlZ2FjeSByYXRlIHJvdXRpbmUgaGFuZGxlZCBhdCBzZWxlY3RlZHJhdGUKLQotCQkJLy9ubyBNQ1MgcmF0ZQotCQkJZm9yKGk9MDtpPD0xNTtpKyspewotCQkJCXBPcGVyYXRlTUNTW2ldID0gMDsKLQkJCX0KLQkJCWJyZWFrOwotCi0JY2FzZSBJRUVFX05fMjRHOgkvL2Fzc3VtZSBDQ0sgcmF0ZSBvawotCWNhc2UgSUVFRV9OXzVHOgotCQkJLy8gTGVnYWN5IHBhcnQgd2Ugb25seSB1c2UgNiwgNS41LDIsMSBmb3IgTl8yNEcgYW5kIDYgZm9yIE5fNUcuCi0JCQkvLyBMZWdhY3kgcGFydCBzaGFsbCBiZSBoYW5kbGVkIGF0IFNlbGVjdFJhdGVTZXQoKS4KLQotCQkJLy9IVCBwYXJ0Ci0JCQkvLyBUT0RPOiBtYXkgYmUgZGlmZmVyZW50IGlmIHdlIGhhdmUgZGlmZmVyZW50IG51bWJlciBvZiBhbnRlbm5hCi0JCQlwT3BlcmF0ZU1DU1swXSAmPVJBVEVfQURQVF8xU1NfTUFTSzsJLy9zdXBwb3J0IE1DUyAwfjcKLQkJCXBPcGVyYXRlTUNTWzFdICY9UkFURV9BRFBUXzJTU19NQVNLOwotCQkJcE9wZXJhdGVNQ1NbM10gJj1SQVRFX0FEUFRfTUNTMzJfTUFTSzsKLQkJCWJyZWFrOwotCi0JLy9zaG91bGQgbmV2ZXIgcmVhY2ggaGVyZQotCWRlZmF1bHQ6Ci0KLQkJCWJyZWFrOwotCi0JfQotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLS8qCi0qCURlc2NyaXB0aW9uOgotKgkJVGhpcyBmdW5jdGlvbiB3aWxsIGdldCB0aGUgaGlnaGVzdCBzcGVlZCByYXRlIGluIGlucHV0IE1DUyBzZXQuCi0qCi0qCS9wYXJhbSAJQWRhcHRlcgkJCVBpb250ZXIgdG8gQWRhcHRlciBlbnRpdHkKLSoJCQlwTUNTUmF0ZVNldAkJUG9pbnRlciB0byBNQ1MgcmF0ZSBiaXRtYXAKLSoJCQlwTUNTRmlsdGVyCQlQb2ludGVyIHRvIE1DUyByYXRlIGZpbHRlcgotKgotKgkvcmV0dXJuCUhpZ2hlc3QgTUNTIHJhdGUgaW5jbHVkZWQgaW4gcE1DU1JhdGVTZXQgYW5kIGZpbHRlcmVkIGJ5IHBNQ1NGaWx0ZXIuCi0qCi0qLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiB3aWxsIGdldCB0aGUgaGlnaGVzdCBzcGVlZCByYXRlIGluIGlucHV0IE1DUyBzZXQuCi0gKiAgIGlucHV0OiAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIAlpZWVlCi0gKiAgIAkgICAgIHU4KiAJCQlwTUNTUmF0ZVNldCAvL1BvaW50ZXIgdG8gTUNTIHJhdGUgYml0bWFwCi0gKiAgIAkgICAgIHU4KgkJCXBNQ1NGaWx0ZXIgLy9Qb2ludGVyIHRvIE1DUyByYXRlIGZpbHRlcgotICogIHJldHVybjogIEhpZ2hlc3QgTUNTIHJhdGUgaW5jbHVkZWQgaW4gcE1DU1JhdGVTZXQgYW5kIGZpbHRlcmVkIGJ5IHBNQ1NGaWx0ZXIKLSAqICBub3RpY2U6Ci0gICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11OCBIVEdldEhpZ2hlc3RNQ1NSYXRlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcE1DU1JhdGVTZXQsIHU4KiBwTUNTRmlsdGVyKQotewotCXU4CQlpLCBqOwotCXU4CQliaXRNYXA7Ci0JdTgJCW1jc1JhdGUgPSAwOwotCXU4CQlhdmFpbGFibGVNY3NSYXRlWzE2XTsKLQlpZiAocE1DU1JhdGVTZXQgPT0gTlVMTCB8fCBwTUNTRmlsdGVyID09IE5VTEwpCi0JewotCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgInBNQ1NSYXRlU2V0IG9yIHBNQ1NGaWx0ZXIgY2FuJ3QgYmUgbnVsbCBpbiBIVEdldEhpZ2hlc3RNQ1NSYXRlKClcbiIpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCWZvcihpPTA7IGk8MTY7IGkrKykKLQkJYXZhaWxhYmxlTWNzUmF0ZVtpXSA9IHBNQ1NSYXRlU2V0W2ldICYgcE1DU0ZpbHRlcltpXTsKLQotCWZvcihpID0gMDsgaSA8IDE2OyBpKyspCi0JewotCQlpZihhdmFpbGFibGVNY3NSYXRlW2ldICE9IDApCi0JCQlicmVhazsKLQl9Ci0JaWYoaSA9PSAxNikKLQkJcmV0dXJuIGZhbHNlOwotCi0JZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykKLQl7Ci0JCWlmKGF2YWlsYWJsZU1jc1JhdGVbaV0gIT0gMCkKLQkJewotCQkJYml0TWFwID0gYXZhaWxhYmxlTWNzUmF0ZVtpXTsKLQkJCWZvcihqID0gMDsgaiA8IDg7IGorKykKLQkJCXsKLQkJCQlpZigoYml0TWFwJTIpICE9IDApCi0JCQkJewotCQkJCQlpZihIVE1jc1RvRGF0YVJhdGUoaWVlZSwgKDgqaStqKSkgPiBIVE1jc1RvRGF0YVJhdGUoaWVlZSwgbWNzUmF0ZSkpCi0JCQkJCQltY3NSYXRlID0gKDgqaStqKTsKLQkJCQl9Ci0JCQkJYml0TWFwID0gYml0TWFwPj4xOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAobWNzUmF0ZXwweDgwKTsKLX0KLQotCi0KLS8qCi0qKgotKioxLkZpbHRlciBvdXIgb3BlcmF0aW9uIHJhdGUgc2V0IHdpdGggQVAncyByYXRlIHNldAotKioyLnNoYWxsIHJlZmVyZW5jZSBjaGFubmVsIGJhbmR3aWR0aCwgU1RCQywgQW50ZW5uYSBudW1iZXIKLSoqMy5nZW5lcmF0ZSByYXRlIGFkYXRpdmUgdGFibGUgZm9yIGZpcm13YXJlCi0qKkRhdmlkIDIwMDYwOTA2Ci0qKgotKiogXHBIVFN1cHBvcnRlZENhcDogdGhlIGNvbm5lY3RlZCBTVEEncyBzdXBwb3J0ZWQgcmF0ZSBDYXBhYmlsaXR5IGVsZW1lbnQKLSovCi11OCBIVEZpbHRlck1DU1JhdGUoIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogcFN1cHBvcnRNQ1MsIHU4KiBwT3BlcmF0ZU1DUykKLXsKLQotCXU4IGk9MDsKLQotCS8vIGZpbHRlciBvdXQgb3BlcmF0aW9uYWwgcmF0ZSBzZXQgbm90IHN1cHBvcnRlZCBieSBBUCwgdGhlIGxlbnRoIG9mIGl0IGlzIDE2Ci0JZm9yKGk9MDtpPD0xNTtpKyspewotCQlwT3BlcmF0ZU1DU1tpXSA9IGllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXRbaV0mcFN1cHBvcnRNQ1NbaV07Ci0JfQotCi0KLQkvLyBUT0RPOiBhZGp1c3Qgb3VyIG9wZXJhdGlvbmFsIHJhdGUgc2V0ICBhY2NvcmRpbmcgdG8gb3VyIGNoYW5uZWwgYmFuZHdpZHRoLCBTVEJDIGFuZCBBbnRlbm5hIG51bWJlcgotCi0JLy8gVE9ETzogZmlsbCBzdWdnZXN0ZWQgcmF0ZSBhZGFwdGl2ZSByYXRlIGluZGV4IGFuZCBnaXZlIGZpcm13YXJlIGluZm8gdXNpbmcgVHggY29tbWFuZCBwYWNrZXQKLQkvLyB3ZSBhbHNvIHNoYWxsIHN1Z2dlc3RlZCB0aGUgZmlyc3Qgc3RhcnQgcmF0ZSBzZXQgYWNjb3JkaW5nIHRvIG91ciBzaW5nYWwgc3RyZW5ndGgKLQlIVF9QaWNrTUNTUmF0ZShpZWVlLCBwT3BlcmF0ZU1DUyk7Ci0KLQkvLyBGb3IgUlRMODE5WCwgaWYgcGFpcndpc2VrZXkgPSB3ZXAvdGtpcCwgd2Ugc3VwcG9ydCBvbmx5IE1DUzB+Ny4KLQlpZiAoaWVlZS0+R2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzSGFuZGxlcihpZWVlKSkKLQkJcE9wZXJhdGVNQ1NbMV0gPSAwOwotCi0JLy8KLQkvLyBGb3IgUlRMODE5WCwgd2Ugc3VwcG9ydCBvbmx5IE1DUzB+MTUuCi0JLy8gQW5kIGFsc28sIHdlIGRvIG5vdCBrbm93IGhvdyB0byB1c2UgTUNTMzIgbm93LgotCS8vCi0JZm9yKGk9MjsgaTw9MTU7IGkrKykKLQkJcE9wZXJhdGVNQ1NbaV0gPSAwOwotCi0JcmV0dXJuIHRydWU7Ci19Ci12b2lkIEhUU2V0Q29ubmVjdEJ3TW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSwgSFRfQ0hBTk5FTF9XSURUSAlCYW5kd2lkdGgsIEhUX0VYVENITkxfT0ZGU0VUCU9mZnNldCk7Ci12b2lkIEhUT25Bc3NvY1JzcChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLQlQUlRfSElHSF9USFJPVUdIUFVUCXBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOwotCVBIVF9DQVBBQklMSVRZX0VMRQkJcFBlZXJIVENhcCA9IE5VTEw7Ci0JUEhUX0lORk9STUFUSU9OX0VMRQkJcFBlZXJIVEluZm8gPSBOVUxMOwotCXUxNgluTWF4QU1TRFVTaXplID0gMDsKLQl1OCoJcE1jc0ZpbHRlciA9IE5VTEw7Ci0KLQlzdGF0aWMgdTgJCQkJRVdDMTFOSFRDYXBbXSA9IHsweDAwLCAweDkwLCAweDRjLCAweDMzfTsJCS8vIEZvciAxMW4gRVdDIGRlZmluaXRpb24sIDIwMDcuMDcuMTcsIGJ5IEVtaWx5Ci0Jc3RhdGljIHU4CQkJCUVXQzExTkhUSW5mb1tdID0gezB4MDAsIDB4OTAsIDB4NGMsIDB4MzR9OwkvLyBGb3IgMTFuIEVXQyBkZWZpbml0aW9uLCAyMDA3LjA3LjE3LCBieSBFbWlseQotCi0JaWYoIHBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID09IGZhbHNlICkKLQl7Ci0JCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiPD09PSBIVE9uQXNzb2NSc3AoKTogSFRfRElTQUJMRVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIj09PT4gSFRPbkFzc29jUnNwX3dxKCk6IEhUX0VOQUJMRVxuIik7Ci0vLwlJRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfREFUQSwgcEhUSW5mby0+UGVlckhUQ2FwQnVmLCBzaXplb2YoSFRfQ0FQQUJJTElUWV9FTEUpKTsKLS8vCUlFRUU4MDIxMV9ERUJVR19EQVRBKElFRUU4MDIxMV9ETF9EQVRBLCBwSFRJbmZvLT5QZWVySFRJbmZvQnVmLCBzaXplb2YoSFRfSU5GT1JNQVRJT05fRUxFKSk7Ci0KLS8vCUhURGVidWdIVENhcGFiaWxpdHkocEhUSW5mby0+UGVlckhUQ2FwQnVmLCJIVE9uQXNzb2NSc3Bfd3EiKTsKLS8vCUhURGVidWdIVEluZm8ocEhUSW5mby0+UGVlckhUSW5mb0J1ZiwiSFRPbkFzc29jUnNwX3dxIik7Ci0JLy8KLQlpZighbWVtY21wKHBIVEluZm8tPlBlZXJIVENhcEJ1ZixFV0MxMU5IVENhcCwgc2l6ZW9mKEVXQzExTkhUQ2FwKSkpCi0JCXBQZWVySFRDYXAgPSAoUEhUX0NBUEFCSUxJVFlfRUxFKSgmcEhUSW5mby0+UGVlckhUQ2FwQnVmWzRdKTsKLQllbHNlCi0JCXBQZWVySFRDYXAgPSAoUEhUX0NBUEFCSUxJVFlfRUxFKShwSFRJbmZvLT5QZWVySFRDYXBCdWYpOwotCi0JaWYoIW1lbWNtcChwSFRJbmZvLT5QZWVySFRJbmZvQnVmLCBFV0MxMU5IVEluZm8sIHNpemVvZihFV0MxMU5IVEluZm8pKSkKLQkJcFBlZXJIVEluZm8gPSAoUEhUX0lORk9STUFUSU9OX0VMRSkoJnBIVEluZm8tPlBlZXJIVEluZm9CdWZbNF0pOwotCWVsc2UKLQkJcFBlZXJIVEluZm8gPSAoUEhUX0lORk9STUFUSU9OX0VMRSkocEhUSW5mby0+UGVlckhUSW5mb0J1Zik7Ci0KLQotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8gQ29uZmlndXJhdGlvbnM6Ci0JLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQlJRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfREFUQXxJRUVFODAyMTFfRExfSFQsIHBQZWVySFRDYXAsIHNpemVvZihIVF9DQVBBQklMSVRZX0VMRSkpOwotLy8JSUVFRTgwMjExX0RFQlVHX0RBVEEoSUVFRTgwMjExX0RMX0RBVEF8SUVFRTgwMjExX0RMX0hULCBwUGVlckhUSW5mbywgc2l6ZW9mKEhUX0lORk9STUFUSU9OX0VMRSkpOwotCS8vIENvbmZpZyBTdXBwb3J0ZWQgQ2hhbm5lbCBXaWR0aCBzZXR0aW5nCi0JLy8KLQlIVFNldENvbm5lY3RCd01vZGUoaWVlZSwgKEhUX0NIQU5ORUxfV0lEVEgpKHBQZWVySFRDYXAtPkNobFdpZHRoKSwgKEhUX0VYVENITkxfT0ZGU0VUKShwUGVlckhUSW5mby0+RXh0Q2hsT2Zmc2V0KSk7Ci0KLS8vCWlmKHBIVEluZm8tPmJDdXJCVzQwTUh6ID09IHRydWUpCi0JCXBIVEluZm8tPmJDdXJUeEJXNDBNSHogPSAoKHBQZWVySFRJbmZvLT5SZWNvbW1lbWRlZFR4V2lkdGggPT0gMSk/dHJ1ZTpmYWxzZSk7Ci0KLQkvLwotCS8vIFVwZGF0ZSBzaG9ydCBHSS8gbG9uZyBHSSBzZXR0aW5nCi0JLy8KLQkvLyBUT0RPOgotCXBIVEluZm8tPmJDdXJTaG9ydEdJMjBNSHo9Ci0JCSgocEhUSW5mby0+YlJlZ1Nob3J0R0kyME1Ieik/KChwUGVlckhUQ2FwLT5TaG9ydEdJMjBNaHo9PTEpP3RydWU6ZmFsc2UpOmZhbHNlKTsKLQlwSFRJbmZvLT5iQ3VyU2hvcnRHSTQwTUh6PQotCQkoKHBIVEluZm8tPmJSZWdTaG9ydEdJNDBNSHopPygocFBlZXJIVENhcC0+U2hvcnRHSTQwTWh6PT0xKT90cnVlOmZhbHNlKTpmYWxzZSk7Ci0KLQkvLwotCS8vIENvbmZpZyBUWCBTVEJDIHNldHRpbmcKLQkvLwotCS8vIFRPRE86Ci0KLQkvLwotCS8vIENvbmZpZyBEU1NTL0NDSyAgbW9kZSBpbiA0ME1IeiBtb2RlCi0JLy8KLQkvLyBUT0RPOgotCXBIVEluZm8tPmJDdXJTdXBwQ0NLID0KLQkJKChwSFRJbmZvLT5iUmVnU3VwcENDSyk/KChwUGVlckhUQ2FwLT5Ec3NDQ2s9PTEpP3RydWU6ZmFsc2UpOmZhbHNlKTsKLQotCi0JLy8KLQkvLyBDb25maWcgYW5kIGNvbmZpZ3VyZSBBLU1TRFUgc2V0dGluZwotCS8vCi0JcEhUSW5mby0+YkN1cnJlbnRfQU1TRFVfU3VwcG9ydCA9IHBIVEluZm8tPmJBTVNEVV9TdXBwb3J0OwotICAgICAgICBpZiAoaWVlZS0+cnRsbGliX2FwX3NlY190eXBlICYmCi0gICAgICAgICAgIChpZWVlLT5ydGxsaWJfYXBfc2VjX3R5cGUoaWVlZSkmKFNFQ19BTEdfV0VQfFNFQ19BTEdfVEtJUCkpKXsKLSAgICAgICAgICAgICAgICBpZiggKHBIVEluZm8tPklPVFBlZXI9PSBIVF9JT1RfUEVFUl9BVEhFUk9TKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEhUSW5mby0+SU9UUGVlciA9PSBIVF9JT1RfUEVFUl9VTktOT1dOKSApCi0gICAgICAgICAgICAgICAgICAgICAgICBwSFRJbmZvLT5iQ3VycmVudEFNUERVRW5hYmxlID0gZmFsc2U7Ci0gICAgICAgIH0KLQotCi0Jbk1heEFNU0RVU2l6ZSA9IChwUGVlckhUQ2FwLT5NYXhBTVNEVVNpemU9PTApPzM4Mzk6NzkzNTsKLQotCWlmKHBIVEluZm8tPm5BTVNEVV9NYXhTaXplID4gbk1heEFNU0RVU2l6ZSApCi0JCXBIVEluZm8tPm5DdXJyZW50X0FNU0RVX01heFNpemUgPSBuTWF4QU1TRFVTaXplOwotCWVsc2UKLQkJcEhUSW5mby0+bkN1cnJlbnRfQU1TRFVfTWF4U2l6ZSA9IHBIVEluZm8tPm5BTVNEVV9NYXhTaXplOwotCi0KLQkvLwotCS8vIENvbmZpZyBBLU1QRFUgc2V0dGluZwotCS8vCi0JcEhUSW5mby0+YkN1cnJlbnRBTVBEVUVuYWJsZSA9IHBIVEluZm8tPmJBTVBEVUVuYWJsZTsKLQotCS8vIDwxPiBEZWNpZGUgQU1QRFUgRmFjdG9yCi0KLQkvLyBCeSBFbWlseQotCWlmKCFwSFRJbmZvLT5iUmVnUlQyUlRBZ2dyZWdhdGlvbikKLQl7Ci0JCS8vIERlY2lkZSBBTVBEVSBGYWN0b3IgYWNjb3JkaW5nIHRvIHByb3RvY29sIGhhbmRzaGFrZQotCQlpZihwSFRJbmZvLT5BTVBEVV9GYWN0b3IgPiBwUGVlckhUQ2FwLT5NYXhSeEFNUERVRmFjdG9yKQotCQkJcEhUSW5mby0+Q3VycmVudEFNUERVRmFjdG9yID0gcFBlZXJIVENhcC0+TWF4UnhBTVBEVUZhY3RvcjsKLQkJZWxzZQotCQkJcEhUSW5mby0+Q3VycmVudEFNUERVRmFjdG9yID0gcEhUSW5mby0+QU1QRFVfRmFjdG9yOwotCi0JfWVsc2UKLQl7Ci0JCS8vIFNldCBNUERVIGRlbnNpdHkgdG8gMiB0byBSZWFsdGVrIEFQLCBhbmQgc2V0IGl0IHRvIDAgZm9yIG90aGVycwotCQkvLyBSZXBsYWNlIE1QRFUgZmFjdG9yIGRlY2xhcmVkIGluIG9yaWdpbmFsIGFzc29jaWF0aW9uIHJlc3BvbnNlIGZyYW1lIGZvcm1hdC4gMjAwNy4wOC4yMCBieSBFbWlseQotI2lmIDAKLQkJb3NUbXA9IFBhY2tldEdldEVsZW1lbnQoIGFzb2NwZHUsIEVJRF9WZW5kb3IsIE9VSV9TVUJfUkVBTFRFS19BR0csIE9VSV9TVUJUWVBFX0RPTlRfQ0FSRSk7Ci0JCWlmKG9zVG1wLkxlbmd0aCA+PSA1KQkvLzAwOmUwOjRjOjAyOjAwCi0jZW5kaWYKLQkJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NodC5iZFJUMlJUQWdncmVnYXRpb24pCi0JCXsKLQkJCWlmKCBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSAhPSBLRVlfVFlQRV9OQSkKLQkJCQkvLyBSZWFsdGVrIG1heSBzZXQgMzJrIGluIHNlY3VyaXR5IG1vZGUgYW5kIDY0ayBmb3Igb3RoZXJzCi0JCQkJcEhUSW5mby0+Q3VycmVudEFNUERVRmFjdG9yID0gcFBlZXJIVENhcC0+TWF4UnhBTVBEVUZhY3RvcjsKLQkJCWVsc2UKLQkJCQlwSFRJbmZvLT5DdXJyZW50QU1QRFVGYWN0b3IgPSBIVF9BR0dfU0laRV82NEs7Ci0JCX1lbHNlCi0JCXsKLQkJCWlmKHBQZWVySFRDYXAtPk1heFJ4QU1QRFVGYWN0b3IgPCBIVF9BR0dfU0laRV8zMkspCi0JCQkJcEhUSW5mby0+Q3VycmVudEFNUERVRmFjdG9yID0gcFBlZXJIVENhcC0+TWF4UnhBTVBEVUZhY3RvcjsKLQkJCWVsc2UKLQkJCQlwSFRJbmZvLT5DdXJyZW50QU1QRFVGYWN0b3IgPSBIVF9BR0dfU0laRV8zMks7Ci0JCX0KLQl9Ci0KLQkvLyA8Mj4gU2V0IEFNUERVIE1pbmltdW0gTVBEVSBTdGFydCBTcGFjaW5nCi0JLy8gODAyLjExbiAzLjAgc2VjdGlvbiA5LjdkLjMKLSNpZiAxCi0JaWYocEhUSW5mby0+TVBEVV9EZW5zaXR5ID4gcFBlZXJIVENhcC0+TVBEVURlbnNpdHkpCi0JCXBIVEluZm8tPkN1cnJlbnRNUERVRGVuc2l0eSA9IHBIVEluZm8tPk1QRFVfRGVuc2l0eTsKLQllbHNlCi0JCXBIVEluZm8tPkN1cnJlbnRNUERVRGVuc2l0eSA9IHBQZWVySFRDYXAtPk1QRFVEZW5zaXR5OwotCWlmKGllZWUtPnBhaXJ3aXNlX2tleV90eXBlICE9IEtFWV9UWVBFX05BICkKLQkJcEhUSW5mby0+Q3VycmVudE1QRFVEZW5zaXR5IAk9IDc7IC8vIDh1cwotI2Vsc2UKLQlpZihwSFRJbmZvLT5NUERVX0RlbnNpdHkgPiBwUGVlckhUQ2FwLT5NUERVRGVuc2l0eSkKLQkJcEhUSW5mby0+Q3VycmVudE1QRFVEZW5zaXR5ID0gcEhUSW5mby0+TVBEVV9EZW5zaXR5OwotCWVsc2UKLQkJcEhUSW5mby0+Q3VycmVudE1QRFVEZW5zaXR5ID0gcFBlZXJIVENhcC0+TVBEVURlbnNpdHk7Ci0jZW5kaWYKLQkvLyBGb3JjZSBUWCBBTVNEVQotCi0JLy8gTGFuaHNpbjogbWFyayBmb3IgdG1wIHRvIGF2b2lkIGRlYXV0aCBieSBhcCBmcm9tICBzMwotCS8vaWYobWVtY21wKHBNZ250SW5mby0+QnNzaWQsIE5FVEdFQVI4MzRCdjJfQlJPQURDT00sIDMpPT0wKQotCWlmKDApCi0JCXsKLQotCQkJcEhUSW5mby0+YkN1cnJlbnRBTVBEVUVuYWJsZSA9IGZhbHNlOwotCQkJcEhUSW5mby0+Rm9yY2VkQU1TRFVNb2RlID0gSFRfQUdHX0ZPUkNFX0VOQUJMRTsKLQkJCXBIVEluZm8tPkZvcmNlZEFNU0RVTWF4U2l6ZSA9IDc5MzU7Ci0KLQkJcEhUSW5mby0+SU9UQWN0aW9uIHw9ICBIVF9JT1RfQUNUX1RYX1VTRV9BTVNEVV84SzsKLQl9Ci0KLQkvLyBSeCBSZW9yZGVyIFNldHRpbmcKLQlwSFRJbmZvLT5iQ3VyUnhSZW9yZGVyRW5hYmxlID0gcEhUSW5mby0+YlJlZ1J4UmVvcmRlckVuYWJsZTsKLQotCS8vCi0JLy8gRmlsdGVyIG91dCB1bnN1cHBvcnRlZCBIVCByYXRlIGZvciB0aGlzIEFQCi0JLy8gVXBkYXRlIFJBVFIgdGFibGUKLQkvLyBUaGlzIGlzIG9ubHkgZm9yIDgxOTAgLDgxOTIgb3IgbGF0ZXIgcHJvZHVjdCB3aGljaCB1c2luZyBmaXJtd2FyZSB0byBoYW5kbGUgcmF0ZSBhZGFwdGl2ZSBtZWNoYW5pc20uCi0JLy8KLQotCS8vIEhhbmRsZSBSYWxpbmsgQVAgYmFkIE1DUyByYXRlIHNldCBjb25kaXRpb24uIEpvc2VwaC4KLQkvLyBUaGlzIGZpeCB0aGUgYnVnIG9mIFJhbGluayBBUC4gVGhpcyBtYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCWlmKHBQZWVySFRDYXAtPk1DU1swXSA9PSAwKQotCQlwUGVlckhUQ2FwLT5NQ1NbMF0gPSAweGZmOwotCi0JSFRGaWx0ZXJNQ1NSYXRlKGllZWUsIHBQZWVySFRDYXAtPk1DUywgaWVlZS0+ZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCk7Ci0KLQkvLwotCS8vIENvbmZpZyBNSU1PIFBvd2VyIFNhdmUgc2V0dGluZwotCS8vCi0JcEhUSW5mby0+UGVlck1pbW9QcyA9IHBQZWVySFRDYXAtPk1pbW9Qd3JTYXZlOwotCWlmKHBIVEluZm8tPlBlZXJNaW1vUHMgPT0gTUlNT19QU19TVEFUSUMpCi0JCXBNY3NGaWx0ZXIgPSBNQ1NfRklMVEVSXzFTUzsKLQllbHNlCi0JCXBNY3NGaWx0ZXIgPSBNQ1NfRklMVEVSX0FMTDsKLQkvL1dCIGFkZCBmb3IgTUNTOCBidWcKLS8vCXBNY3NGaWx0ZXIgPSBNQ1NfRklMVEVSXzFTUzsKLQlpZWVlLT5IVEhpZ2hlc3RPcGVyYVJhdGUgPSBIVEdldEhpZ2hlc3RNQ1NSYXRlKGllZWUsIGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIHBNY3NGaWx0ZXIpOwotCWllZWUtPkhUQ3VycmVudE9wZXJhUmF0ZSA9IGllZWUtPkhUSGlnaGVzdE9wZXJhUmF0ZTsKLQotCS8vCi0JLy8gQ29uZmlnIGN1cnJlbnQgb3BlcmF0aW9uIG1vZGUuCi0JLy8KLQlwSFRJbmZvLT5DdXJyZW50T3BNb2RlID0gcFBlZXJIVEluZm8tPk9wdE1vZGU7Ci0KLQotCi19Ci0KLXZvaWQgSFRTZXRDb25uZWN0QndNb2RlQ2FsbGJhY2soc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpOwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKmZ1bmN0aW9uOiAgaW5pdGlhbGl6ZSBIVCBpbmZvKHN0cnVjdCBQUlRfSElHSF9USFJPVUdIUFVUKQotICogICBpbnB1dDogIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiAJaWVlZQotICogIG91dHB1dDogIG5vbmUKLSAqICByZXR1cm46ICBub25lCi0gKiAgbm90aWNlOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuICogICgxKSBNUEluaXRpYWxpemF0aW9uIFBoYXNlICogICgyKSBSZWNlaXZpbmcgb2YgRGVhdXRoZW50aWNhdGlvbiBmcm9tIEFQCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8vIFRPRE86IFNob3VsZCB0aGlzIGZ1bmNpdG9uIGJlIGNhbGxlZCB3aGVuIHJlY2VpdmluZyBvZiBEaXNhc3NvY2lhdGlvbj8KLXZvaWQgSFRJbml0aWFsaXplSFRJbmZvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKQotewotCVBSVF9ISUdIX1RIUk9VR0hQVVQgcEhUSW5mbyA9IGllZWUtPnBIVEluZm87Ci0KLQkvLwotCS8vIFRoZXNlIHBhcmFtZXRlcnMgd2lsbCBiZSByZXNldCB3aGVuIHJlY2VpdmluZyBkZWF1dGhlbnRpY2F0aW9uIHBhY2tldAotCS8vCi0JSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIj09PT09PT09PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JcEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPSBmYWxzZTsKLQotCS8vIDQwTUh6IGNoYW5uZWwgc3VwcG9ydAotCXBIVEluZm8tPmJDdXJCVzQwTUh6ID0gZmFsc2U7Ci0JcEhUSW5mby0+YkN1clR4Qlc0ME1IeiA9IGZhbHNlOwotCi0JLy8gU2hvcnQgR0kgc3VwcG9ydAotCXBIVEluZm8tPmJDdXJTaG9ydEdJMjBNSHogPSBmYWxzZTsKLQlwSFRJbmZvLT5iQ3VyU2hvcnRHSTQwTUh6ID0gZmFsc2U7Ci0JcEhUSW5mby0+YkZvcmNlZFNob3J0R0kgPSBmYWxzZTsKLQotCS8vIENDSyByYXRlIHN1cHBvcnQKLQkvLyBUaGlzIGZsYWcgaXMgc2V0IHRvIHRydWUgdG8gc3VwcG9ydCBDQ0sgcmF0ZSBieSBkZWZhdWx0LgotCS8vIEl0IHdpbGwgYmUgYWZmZWN0ZWQgYnkgInBIVEluZm8tPmJSZWdTdXBwQ0NLIiBhbmQgQVAgY2FwYWJpbGl0aWVzIG9ubHkgd2hlbiBhc3NvY2lhdGUgdG8KLQkvLyAxMU4gQlNTLgotCXBIVEluZm8tPmJDdXJTdXBwQ0NLID0gdHJ1ZTsKLQotCS8vIEFNU0RVIHJlbGF0ZWQKLQlwSFRJbmZvLT5iQ3VycmVudF9BTVNEVV9TdXBwb3J0ID0gZmFsc2U7Ci0JcEhUSW5mby0+bkN1cnJlbnRfQU1TRFVfTWF4U2l6ZSA9IHBIVEluZm8tPm5BTVNEVV9NYXhTaXplOwotCi0JLy8gQU1QVUQgcmVsYXRlZAotCXBIVEluZm8tPkN1cnJlbnRNUERVRGVuc2l0eSA9IHBIVEluZm8tPk1QRFVfRGVuc2l0eTsKLQlwSFRJbmZvLT5DdXJyZW50QU1QRFVGYWN0b3IgPSBwSFRJbmZvLT5BTVBEVV9GYWN0b3I7Ci0KLQotCi0JLy8gSW5pdGlhbGl6ZSBhbGwgb2YgdGhlIHBhcmFtZXRlcnMgcmVsYXRlZCB0byAxMW4KLQltZW1zZXQoKHZvaWQqKSgmKHBIVEluZm8tPlNlbGZIVENhcCkpLCAwLCBzaXplb2YocEhUSW5mby0+U2VsZkhUQ2FwKSk7Ci0JbWVtc2V0KCh2b2lkKikoJihwSFRJbmZvLT5TZWxmSFRJbmZvKSksIDAsIHNpemVvZihwSFRJbmZvLT5TZWxmSFRJbmZvKSk7Ci0JbWVtc2V0KCh2b2lkKikoJihwSFRJbmZvLT5QZWVySFRDYXBCdWYpKSwgMCwgc2l6ZW9mKHBIVEluZm8tPlBlZXJIVENhcEJ1ZikpOwotCW1lbXNldCgodm9pZCopKCYocEhUSW5mby0+UGVlckhUSW5mb0J1ZikpLCAwLCBzaXplb2YocEhUSW5mby0+UGVlckhUSW5mb0J1ZikpOwotCi0JcEhUSW5mby0+YlN3QndJblByb2dyZXNzID0gZmFsc2U7Ci0JcEhUSW5mby0+Q2hubE9wID0gQ0hOTE9QX05PTkU7Ci0KLQkvLyBTZXQgZGVmYXVsdCBJRUVFIHNwZWMgZm9yIERyYWZ0IE4KLQlwSFRJbmZvLT5lUGVlckhUU3BlY1ZlciA9IEhUX1NQRUNfVkVSX0lFRUU7Ci0KLQkvLyBSZWFsdGVrIHByb3ByaWV0YXJ5IGFnZ3JlZ2F0aW9uIG1vZGUKLQlwSFRJbmZvLT5iQ3VycmVudFJUMlJUQWdncmVnYXRpb24gPSBmYWxzZTsKLQlwSFRJbmZvLT5iQ3VycmVudFJUMlJUTG9uZ1Nsb3RUaW1lID0gZmFsc2U7Ci0JcEhUSW5mby0+SU9UUGVlciA9IDA7Ci0JcEhUSW5mby0+SU9UQWN0aW9uID0gMDsKLQotCS8vTUNTIHJhdGUgaW5pdGlhbGl6ZWQgaGVyZQotCXsKLQkJdTgqIFJlZ0hUU3VwcFJhdGVTZXRzID0gJihpZWVlLT5SZWdIVFN1cHBSYXRlU2V0WzBdKTsKLQkJUmVnSFRTdXBwUmF0ZVNldHNbMF0gPSAweEZGOwkvL3N1cHBvcnQgTUNTIDB+NwotCQlSZWdIVFN1cHBSYXRlU2V0c1sxXSA9IDB4RkY7CS8vc3VwcG9ydCBNQ1MgOH4xNQotCQlSZWdIVFN1cHBSYXRlU2V0c1s0XSA9IDB4MDE7CS8vc3VwcG9ydCBNQ1MgMzIKLQl9Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqZnVuY3Rpb246ICBpbml0aWFsaXplIEJzcyBIVCBzdHJ1Y3R1cmUoc3RydWN0IFBCU1NfSFQpCi0gKiAgIGlucHV0OiAgUEJTU19IVCBwQnNzSFQgLy90byBiZSBpbml0aWFsaXplZAotICogIG91dHB1dDogIG5vbmUKLSAqICByZXR1cm46ICBub25lCi0gKiAgbm90aWNlOiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGluaXRpYWxpemUgbmV0d29yayBzdHJ1Y3R1cmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBIVEluaXRpYWxpemVCc3NEZXNjKFBCU1NfSFQgcEJzc0hUKQotewotCi0JcEJzc0hULT5iZFN1cHBvcnRIVCA9IGZhbHNlOwotCW1lbXNldChwQnNzSFQtPmJkSFRDYXBCdWYsIDAsIHNpemVvZihwQnNzSFQtPmJkSFRDYXBCdWYpKTsKLQlwQnNzSFQtPmJkSFRDYXBMZW4gPSAwOwotCW1lbXNldChwQnNzSFQtPmJkSFRJbmZvQnVmLCAwLCBzaXplb2YocEJzc0hULT5iZEhUSW5mb0J1ZikpOwotCXBCc3NIVC0+YmRIVEluZm9MZW4gPSAwOwotCi0JcEJzc0hULT5iZEhUU3BlY1Zlcj0gSFRfU1BFQ19WRVJfSUVFRTsKLQotCXBCc3NIVC0+YmRSVDJSVEFnZ3JlZ2F0aW9uID0gZmFsc2U7Ci0JcEJzc0hULT5iZFJUMlJUTG9uZ1Nsb3RUaW1lID0gZmFsc2U7Ci19Ci0jaWYgMAotLy9iZWxvdyBmdW5jdGlvbiBoYXMgbWVyZ2VkIGludG8gaWVlZTgwMjExX25ldHdvcmtfaW5pdCgpIGluIGllZWU4MDIxMV9yeC5jCi12b2lkCi1IVFBhcnNpbmdIVENhcEVsZW1lbnQoCi0JSU4JUEFEQVBURVIJCUFkYXB0ZXIsCi0JSU4JT0NURVRfU1RSSU5HCUhUQ2FwSUUsCi0JT1VUCVBSVF9XTEFOX0JTUwlwQnNzRGVzYwotKQotewotCVBNR05UX0lORk8gICAgICAJCQlwTWdudEluZm8gPSAmQWRhcHRlci0+TWdudEluZm87Ci0KLQlpZiggSFRDYXBJRS5MZW5ndGggPiBzaXplb2YocEJzc0Rlc2MtPkJzc0hULmJkSFRDYXBCdWYpICkKLQl7Ci0JCVJUX1RSQUNFKCBDT01QX0hULCBEQkdfTE9VRCwgKCJIVFBhcnNpbmdIVENhcEVsZW1lbnQoKTogSFQgQ2FwYWJpbGl0eSBFbGVtZW50IGxlbmd0aCBpcyB0b28gbG9uZyFcbiIpICk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyBUT0RPOiBDaGVjayB0aGUgY29ycmVjdG5lc3Mgb2YgSFQgQ2FwCi0JLy9QcmludCBlYWNoIGZpZWxkIGluIGRldGFpbC4gRHJpdmVyIHNob3VsZCBub3QgcHJpbnQgb3V0IHRoaXMgbWVzc2FnZSBieSBkZWZhdWx0Ci0JaWYoIXBNZ250SW5mby0+bUFjdGluZ0FzQXAgJiYgIXBNZ250SW5mby0+bUFzc29jKQotCQlIVERlYnVnSFRDYXBhYmlsaXR5KERCR19UUkFDRSwgQWRhcHRlciwgJkhUQ2FwSUUsIChwdTgpIkhUUGFyc2luZ0hUQ2FwRWxlbWVudCgpIik7Ci0KLQlIVENhcElFLkxlbmd0aCA9IEhUQ2FwSUUuTGVuZ3RoID4gc2l6ZW9mKHBCc3NEZXNjLT5Cc3NIVC5iZEhUQ2FwQnVmKT9cCi0JCXNpemVvZihwQnNzRGVzYy0+QnNzSFQuYmRIVENhcEJ1Zik6SFRDYXBJRS5MZW5ndGg7CS8vcHJldmVudCBmcm9tIG92ZXJmbG93Ci0KLQlDb3B5TWVtKHBCc3NEZXNjLT5Cc3NIVC5iZEhUQ2FwQnVmLCBIVENhcElFLk9jdGV0LCBIVENhcElFLkxlbmd0aCk7Ci0JcEJzc0Rlc2MtPkJzc0hULmJkSFRDYXBMZW4gPSBIVENhcElFLkxlbmd0aDsKLQotfQotCi0KLXZvaWQKLUhUUGFyc2luZ0hUSW5mb0VsZW1lbnQoCi0JUEFEQVBURVIJCUFkYXB0ZXIsCi0JT0NURVRfU1RSSU5HCUhUSW5mb0lFLAotCVBSVF9XTEFOX0JTUwlwQnNzRGVzYwotKQotewotCVBNR05UX0lORk8gICAgICAJCQlwTWdudEluZm8gPSAmQWRhcHRlci0+TWdudEluZm87Ci0KLQlpZiggSFRJbmZvSUUuTGVuZ3RoID4gc2l6ZW9mKHBCc3NEZXNjLT5Cc3NIVC5iZEhUSW5mb0J1ZikpCi0JewotCQlSVF9UUkFDRSggQ09NUF9IVCwgREJHX0xPVUQsICgiSFRQYXJzaW5nSFRJbmZvRWxlbWVudCgpOiBIVCBJbmZvcm1hdGlvbiBFbGVtZW50IGxlbmd0aCBpcyB0b28gbG9uZyFcbiIpICk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyBUT0RPOiBDaGVjayB0aGUgY29ycmVjdG5lc3Mgb2YgSFQgSW5mbwotCS8vUHJpbnQgZWFjaCBmaWVsZCBpbiBkZXRhaWwuIERyaXZlciBzaG91bGQgbm90IHByaW50IG91dCB0aGlzIG1lc3NhZ2UgYnkgZGVmYXVsdAotCWlmKCFwTWdudEluZm8tPm1BY3RpbmdBc0FwICYmICFwTWdudEluZm8tPm1Bc3NvYykKLQkJSFREZWJ1Z0hUSW5mbyhEQkdfVFJBQ0UsIEFkYXB0ZXIsICZIVEluZm9JRSwgKHB1OCkiSFRQYXJzaW5nSFRJbmZvRWxlbWVudCgpIik7Ci0KLQlIVEluZm9JRS5MZW5ndGggPSBIVEluZm9JRS5MZW5ndGggPiBzaXplb2YocEJzc0Rlc2MtPkJzc0hULmJkSFRJbmZvQnVmKT9cCi0JCXNpemVvZihwQnNzRGVzYy0+QnNzSFQuYmRIVEluZm9CdWYpOkhUSW5mb0lFLkxlbmd0aDsJLy9wcmV2ZW50IGZyb20gb3ZlcmZsb3cKLQotCUNvcHlNZW0oIHBCc3NEZXNjLT5Cc3NIVC5iZEhUSW5mb0J1ZiwgSFRJbmZvSUUuT2N0ZXQsIEhUSW5mb0lFLkxlbmd0aCk7Ci0JcEJzc0Rlc2MtPkJzc0hULmJkSFRJbmZvTGVuID0gSFRJbmZvSUUuTGVuZ3RoOwotfQotCi0vKgotICAqIEdldCBIVCByZWxhdGVkIGluZm9ybWF0aW9uIGZyb20gYmVhY29uIGFuZCBzYXZlIGl0IGluIEJzc0Rlc2MKLSAgKgotICAqICgxKSBQYXJzZSBIVENhcCwgYW5kIEhUSW5mbywgYW5kIHJlY29yZCB3aGV0aGVyIGl0IGlzIDExbiBBUAotICAqICgyKSBJZiBwZWVyIGlzIEhULCBidXQgbm90IFdNTSwgY2FsbCBRb3NTZXRMZWdhY3lXTU1QYXJhbVdpdGhIVCgpCi0gICogKDMpIENoZWNrIHdoZXRoZXIgcGVlciBpcyBSZWFsdGVrIEFQIChmb3IgUmVhbHRlayBwcm9wcmlldGFyeSBhZ2dyZWdhdGlvbiBtb2RlKS4KLSAgKiBJbnB1dDoKLSAgKiAJCVBBREFQVEVSCUFkYXB0ZXIKLSAgKgotICAqIE91dHB1dDoKLSAgKgkJUFJUX1RDQgkJQnNzRGVzYwotICAqCi0qLwotdm9pZCBIVEdldFZhbHVlRnJvbUJlYWNvbk9yUHJvYmVSc3AoCi0JUEFEQVBURVIJCQlBZGFwdGVyLAotCVBPQ1RFVF9TVFJJTkcJCXBTUkNtbXBkdSwKLQlQUlRfV0xBTl9CU1MJCWJzc0Rlc2MKLSkKLXsKLQlQTUdOVF9JTkZPICAgICAgCQkJcE1nbnRJbmZvID0gJkFkYXB0ZXItPk1nbnRJbmZvOwotCVBSVF9ISUdIX1RIUk9VR0hQVVQJCXBIVEluZm8gPSBHRVRfSFRfSU5GTyhwTWdudEluZm8pOwotCU9DVEVUX1NUUklORwkJCQlIVENhcElFLCBIVEluZm9JRSwgSFRSZWFsdGVrQWdnLCBtbXBkdTsKLQlPQ1RFVF9TVFJJTkcJCQkJQnJvYWRjb21FbGVtZW50LCBDaXNjb0VsZW1lbnQ7Ci0KLQltbXBkdS5PY3RldCA9IHBTUkNtbXBkdS0+T2N0ZXQ7Ci0JbW1wZHUuTGVuZ3RoID0gcFNSQ21tcGR1LT5MZW5ndGg7Ci0KLQkvLzJOb3RlOgotCS8vICAgTWFyayBmb3IgSU9UIHRlc3RpbmcgdXNpbmcgIExpbmtzeXMgV1JUMzUwTiwgVGhpcyBBUCBkb2VzIG5vdCBjb250YWluIFdNTSBJRSAgd2hlbgotCS8vICAgaXQgaXMgY29uZmlndXJlZCBhdCBwdXJlLU4gbW9kZS4KLQkvLwlpZihic3NEZXNjLT5Cc3NRb3MuYmRRb1NNb2RlICYgUU9TX1dNTSkKLQkvLwotCi0JSFRJbml0aWFsaXplQnNzRGVzYyAoJmJzc0Rlc2MtPkJzc0hUKTsKLQotCS8vMjwxPiBQYXJzZSBIVENhcCwgYW5kIEhUSW5mbwotCS8vIEdldCBIVCBDYXBhYmlsaXR5IElFOiAoMSkgR2V0IElFRUUgRHJhZnQgTiBJRSBvciAoMikgR2V0IEVXQyBJRQotCUhUQ2FwSUUgPSBQYWNrZXRHZXRFbGVtZW50KG1tcGR1LCBFSURfSFRDYXBhYmlsaXR5LCBPVUlfU1VCX0RPTlRfQ0FSRSwgT1VJX1NVQlRZUEVfRE9OVF9DQVJFKTsKLQlpZihIVENhcElFLkxlbmd0aCA9PSAwKQotCXsKLQkJSFRDYXBJRSA9IFBhY2tldEdldEVsZW1lbnQobW1wZHUsIEVJRF9WZW5kb3IsIE9VSV9TVUJfMTFOX0VXQ19IVF9DQVAsIE9VSV9TVUJUWVBFX0RPTlRfQ0FSRSk7Ci0JCWlmKEhUQ2FwSUUuTGVuZ3RoICE9IDApCi0JCQlic3NEZXNjLT5Cc3NIVC5iZEhUU3BlY1Zlcj0gSFRfU1BFQ19WRVJfRVdDOwotCX0KLQlpZihIVENhcElFLkxlbmd0aCAhPSAwKQotCQlIVFBhcnNpbmdIVENhcEVsZW1lbnQoQWRhcHRlciwgSFRDYXBJRSwgYnNzRGVzYyk7Ci0KLQkvLyBHZXQgSFQgSW5mb3JtYXRpb24gSUU6ICgxKSBHZXQgSUVFRSBEcmFmdCBOIElFIG9yICgyKSBHZXQgRVdDIElFCi0JSFRJbmZvSUUgPSBQYWNrZXRHZXRFbGVtZW50KG1tcGR1LCBFSURfSFRJbmZvLCBPVUlfU1VCX0RPTlRfQ0FSRSwgT1VJX1NVQlRZUEVfRE9OVF9DQVJFKTsKLQlpZihIVEluZm9JRS5MZW5ndGggPT0gMCkKLQl7Ci0JCUhUSW5mb0lFID0gUGFja2V0R2V0RWxlbWVudChtbXBkdSwgRUlEX1ZlbmRvciwgT1VJX1NVQl8xMU5fRVdDX0hUX0lORk8sIE9VSV9TVUJUWVBFX0RPTlRfQ0FSRSk7Ci0JCWlmKEhUSW5mb0lFLkxlbmd0aCAhPSAwKQotCQkJCWJzc0Rlc2MtPkJzc0hULmJkSFRTcGVjVmVyICA9IEhUX1NQRUNfVkVSX0VXQzsKLQl9Ci0JaWYoSFRJbmZvSUUuTGVuZ3RoICE9IDApCi0JCUhUUGFyc2luZ0hUSW5mb0VsZW1lbnQoQWRhcHRlciwgSFRJbmZvSUUsIGJzc0Rlc2MpOwotCi0JLy8yPDI+SWYgcGVlciBpcyBIVCwgYnV0IG5vdCBXTU0sIGNhbGwgUW9zU2V0TGVnYWN5V01NUGFyYW1XaXRoSFQoKQotCWlmKEhUQ2FwSUUuTGVuZ3RoICE9IDApCi0JewotCQlic3NEZXNjLT5Cc3NIVC5iZFN1cHBvcnRIVCA9IHRydWU7Ci0JCWlmKGJzc0Rlc2MtPkJzc1Fvcy5iZFFvU01vZGUgPT0gUU9TX0RJU0FCTEUpCi0JCQlRb3NTZXRMZWdhY3lXTU1QYXJhbVdpdGhIVChBZGFwdGVyLCBic3NEZXNjKTsKLQl9Ci0JZWxzZQotCXsKLQkJYnNzRGVzYy0+QnNzSFQuYmRTdXBwb3J0SFQgPSBmYWxzZTsKLQl9Ci0KLQkvLzI8Mz5DaGVjayB3aGV0aGVyIHRoZSBwZWVyIGlzIFJlYWx0ZWsgQVAvU1RBCi0JaWYocEhUSW5mby0+YlJlZ1JUMlJUQWdncmVnYXRpb24pCi0JewotCQlpZihic3NEZXNjLT5Cc3NIVC5iZFN1cHBvcnRIVCkKLQkJewotCQkJSFRSZWFsdGVrQWdnID0gUGFja2V0R2V0RWxlbWVudChtbXBkdSwgRUlEX1ZlbmRvciwgT1VJX1NVQl9SRUFMVEVLX0FHRywgT1VJX1NVQlRZUEVfRE9OVF9DQVJFKTsKLQkJCWlmKEhUUmVhbHRla0FnZy5MZW5ndGggPj01ICkKLQkJCXsKLQkJCQlic3NEZXNjLT5Cc3NIVC5iZFJUMlJUQWdncmVnYXRpb24gPSB0cnVlOwotCi0JCQkJaWYoKEhUUmVhbHRla0FnZy5PY3RldFs0XT09MSkgJiYgKEhUUmVhbHRla0FnZy5PY3RldFs1XSAmIDB4MDIpKQotCQkJCQlic3NEZXNjLT5Cc3NIVC5iZFJUMlJUTG9uZ1Nsb3RUaW1lID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQotCS8vCi0JLy8gMjAwOC8wMS8yNSBNSCBHZXQgQnJvYWRjb20gQVAgSUUgZm9yIG1hbmFtZ2VudCBmcmFtZSBDQ0sgcmF0ZSBwcm9ibGVtLgotCS8vIEFQIGNhbiBub3QgcmVjZWl2ZSBDQ0sgbWFuYWdlbXRuIGZyb20gZnJvbSA5MkUuCi0JLy8KLQotCS8vIEluaXRpYWxpemUgZXZlcnkgbmV3IGJzcyBicm9hZGNvbSBjYXAgZXhpc3QgYXMgZmFsc2UuLgotCWJzc0Rlc2MtPmJCcm9hZGNvbUNhcEV4aXN0PSBmYWxzZTsKLQotCWlmKEhUQ2FwSUUuTGVuZ3RoICE9IDAgfHwgSFRJbmZvSUUuTGVuZ3RoICE9IDApCi0JewotCQl1NEJ5dGUJTGVuZ3RoID0gMDsKLQotCQlGaWxsT2N0ZXRTdHJpbmcoQnJvYWRjb21FbGVtZW50LCBOVUxMLCAwKTsKLQotCQlCcm9hZGNvbUVsZW1lbnQgPSBQYWNrZXRHZXRFbGVtZW50KCBtbXBkdSwgRUlEX1ZlbmRvciwgT1VJX1NVQl9CUk9BRENPTV9JRV8xLCBPVUlfU1VCVFlQRV9ET05UX0NBUkUpOwotCQlMZW5ndGggKz0gQnJvYWRjb21FbGVtZW50Lkxlbmd0aDsKLQkJQnJvYWRjb21FbGVtZW50ID0gUGFja2V0R2V0RWxlbWVudCggbW1wZHUsIEVJRF9WZW5kb3IsIE9VSV9TVUJfQlJPQURDT01fSUVfMiwgT1VJX1NVQlRZUEVfRE9OVF9DQVJFKTsKLQkJTGVuZ3RoICs9IEJyb2FkY29tRWxlbWVudC5MZW5ndGg7Ci0JCUJyb2FkY29tRWxlbWVudCA9IFBhY2tldEdldEVsZW1lbnQoIG1tcGR1LCBFSURfVmVuZG9yLCBPVUlfU1VCX0JST0FEQ09NX0lFXzMsIE9VSV9TVUJUWVBFX0RPTlRfQ0FSRSk7Ci0JCUxlbmd0aCArPSBCcm9hZGNvbUVsZW1lbnQuTGVuZ3RoOwotCi0JCWlmKExlbmd0aCA+IDApCi0JCQlic3NEZXNjLT5iQnJvYWRjb21DYXBFeGlzdCA9IHRydWU7Ci0JfQotCi0KLQkvLyBGb3IgQ2lzY28gSU9UIGlzc3VlCi0JQ2lzY29FbGVtZW50ID0gUGFja2V0R2V0RWxlbWVudCggbW1wZHUsIEVJRF9WZW5kb3IsIE9VSV9TVUJfQ0lTQ09fSUUsIE9VSV9TVUJUWVBFX0RPTlRfQ0FSRSk7Ci0JaWYoQ2lzY29FbGVtZW50Lkxlbmd0aCAhPSAwKXsgLy8gMzogMHgwMCwgMHg0MCwgMHg5NiAuLi4uCi0JCWJzc0Rlc2MtPmJDaXNjb0NhcEV4aXN0ID0gdHJ1ZTsKLQl9ZWxzZXsKLQkJYnNzRGVzYy0+YkNpc2NvQ2FwRXhpc3QgPSBmYWxzZTsKLQl9Ci19Ci0KLQotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqZnVuY3Rpb246ICBpbml0aWFsaXplIEJzcyBIVCBzdHJ1Y3R1cmUoc3RydWN0IFBCU1NfSFQpCi0gKiAgIGlucHV0OiAgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgCSppZWVlCi0gKiAgIAkgICAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAJKnBOZXR3b3JrIC8vdXN1YWxseSBjdXJyZW50IG5ldHdvcmsgd2UgYXJlIGxpdmUgaW4KLSAqICBvdXRwdXQ6ICBub25lCi0gKiAgcmV0dXJuOiAgbm9uZQotICogIG5vdGljZTogVGhpcyBmdW5jdGlvbiBzaG91bGQgT05MWSBiZSBjYWxsZWQgYmVmb3JlIGFzc29jaWF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgSFRSZXNldFNlbGZBbmRTYXZlUGVlclNldHRpbmcoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIAlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKiBwTmV0d29yaykKLXsKLQlQUlRfSElHSF9USFJPVUdIUFVUCQlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKLS8vCXUxNgkJCQkJCW5NYXhBTVNEVVNpemU7Ci0vLwlQSFRfQ0FQQUJJTElUWV9FTEUJCXBQZWVySFRDYXAgPSAoUEhUX0NBUEFCSUxJVFlfRUxFKXBOZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmOwotLy8JUEhUX0lORk9STUFUSU9OX0VMRQkJcFBlZXJIVEluZm8gPSAoUEhUX0lORk9STUFUSU9OX0VMRSlwTmV0d29yay0+YnNzaHQuYmRIVEluZm9CdWY7Ci0vLwl1OCoJcE1jc0ZpbHRlcjsKLQl1OAliSU9UQWN0aW9uID0gMDsKLQotCS8vCi0JLy8gIFNhdmUgUGVlciBTZXR0aW5nIGJlZm9yZSBBc3NvY2lhdGlvbgotCS8vCi0JSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIj09PT09PT09PT09PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JLyp1bm1hcmsgYkVuYWJsZUhUIGZsYWcgaGVyZSBpcyB0aGUgc2FtZSByZWFzb24gd2h5IHVubWFya2VkIGluIGZ1bmN0aW9uIGllZWU4MDIxMV9zb2Z0bWFjX25ld19uZXQuIFdCIDIwMDguMDkuMTAqLwotLy8JaWYoIHBIVEluZm8tPmJFbmFibGVIVCAmJiAgcE5ldHdvcmstPmJzc2h0LmJkU3VwcG9ydEhUKQotCWlmIChwTmV0d29yay0+YnNzaHQuYmRTdXBwb3J0SFQpCi0JewotCQlwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9IHRydWU7Ci0JCXBIVEluZm8tPmVQZWVySFRTcGVjVmVyID0gcE5ldHdvcmstPmJzc2h0LmJkSFRTcGVjVmVyOwotCi0JCS8vIFNhdmUgSFRDYXAgYW5kIEhUSW5mbyBpbmZvcm1hdGlvbiBFbGVtZW50Ci0JCWlmKHBOZXR3b3JrLT5ic3NodC5iZEhUQ2FwTGVuID4gMCAmJiAJcE5ldHdvcmstPmJzc2h0LmJkSFRDYXBMZW4gPD0gc2l6ZW9mKHBIVEluZm8tPlBlZXJIVENhcEJ1ZikpCi0JCQltZW1jcHkocEhUSW5mby0+UGVlckhUQ2FwQnVmLCBwTmV0d29yay0+YnNzaHQuYmRIVENhcEJ1ZiwgcE5ldHdvcmstPmJzc2h0LmJkSFRDYXBMZW4pOwotCi0JCWlmKHBOZXR3b3JrLT5ic3NodC5iZEhUSW5mb0xlbiA+IDAgJiYgcE5ldHdvcmstPmJzc2h0LmJkSFRJbmZvTGVuIDw9IHNpemVvZihwSFRJbmZvLT5QZWVySFRJbmZvQnVmKSkKLQkJCW1lbWNweShwSFRJbmZvLT5QZWVySFRJbmZvQnVmLCBwTmV0d29yay0+YnNzaHQuYmRIVEluZm9CdWYsIHBOZXR3b3JrLT5ic3NodC5iZEhUSW5mb0xlbik7Ci0KLQkJLy8gQ2hlY2sgd2hldGhlciBSVCB0byBSVCBhZ2dyZWdhdGlvbiBtb2RlIGlzIGVuYWJsZWQKLQkJaWYocEhUSW5mby0+YlJlZ1JUMlJUQWdncmVnYXRpb24pCi0JCXsKLQkJCXBIVEluZm8tPmJDdXJyZW50UlQyUlRBZ2dyZWdhdGlvbiA9IHBOZXR3b3JrLT5ic3NodC5iZFJUMlJUQWdncmVnYXRpb247Ci0JCQlwSFRJbmZvLT5iQ3VycmVudFJUMlJUTG9uZ1Nsb3RUaW1lID0gcE5ldHdvcmstPmJzc2h0LmJkUlQyUlRMb25nU2xvdFRpbWU7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwSFRJbmZvLT5iQ3VycmVudFJUMlJUQWdncmVnYXRpb24gPSBmYWxzZTsKLQkJCXBIVEluZm8tPmJDdXJyZW50UlQyUlRMb25nU2xvdFRpbWUgPSBmYWxzZTsKLQkJfQotCi0JCS8vIERldGVybWluZSB0aGUgSU9UIFBlZXIgVmVuZG9yLgotCQlIVElPVFBlZXJEZXRlcm1pbmUoaWVlZSk7Ci0KLQkJLy8gRGVjaWRlIElPVCBBY3Rpb24KLQkJLy8gTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHBhcmFtZXRlciBvZiBwSFRJbmZvLT5iQ3VycmVudFJUMlJUQWdncmVnYXRpb24gaXMgZGVjaWRlZAotCQlwSFRJbmZvLT5JT1RBY3Rpb24gPSAwOwotCQliSU9UQWN0aW9uID0gSFRJT1RBY3RJc0Rpc2FibGVNQ1MxNChpZWVlLCBwTmV0d29yay0+YnNzaWQpOwotCQlpZihiSU9UQWN0aW9uKQotCQkJcEhUSW5mby0+SU9UQWN0aW9uIHw9IEhUX0lPVF9BQ1RfRElTQUJMRV9NQ1MxNDsKLQkJYklPVEFjdGlvbiA9IEhUSU9UQWN0SXNGb3JjZWRDVFMyU2VsZihpZWVlLCBwTmV0d29yayk7Ci0JCWlmKGJJT1RBY3Rpb24pCi0JCQlwSFRJbmZvLT5JT1RBY3Rpb24gfD0gSFRfSU9UX0FDVF9GT1JDRURfQ1RTMlNFTEY7Ci0KLQkJYklPVEFjdGlvbiA9IEhUSU9UQWN0SXNEaXNhYmxlTUNTMTUoaWVlZSk7Ci0JCWlmKGJJT1RBY3Rpb24pCi0JCQlwSFRJbmZvLT5JT1RBY3Rpb24gfD0gSFRfSU9UX0FDVF9ESVNBQkxFX01DUzE1OwotCi0JCWJJT1RBY3Rpb24gPSBIVElPVEFjdElzRGlzYWJsZU1DU1R3b1NwYXRpYWxTdHJlYW0oaWVlZSwgcE5ldHdvcmstPmJzc2lkKTsKLQkJaWYoYklPVEFjdGlvbikKLQkJCXBIVEluZm8tPklPVEFjdGlvbiB8PSBIVF9JT1RfQUNUX0RJU0FCTEVfQUxMXzJTUzsKLQotCi0JCWJJT1RBY3Rpb24gPSBIVElPVEFjdElzRGlzYWJsZUVEQ0FUdXJibyhpZWVlLCBwTmV0d29yay0+YnNzaWQpOwotCQlpZihiSU9UQWN0aW9uKQotCQkJcEhUSW5mby0+SU9UQWN0aW9uIHw9IEhUX0lPVF9BQ1RfRElTQUJMRV9FRENBX1RVUkJPOwotCi0JCWJJT1RBY3Rpb24gPSBIVElPVEFjdElzTWdudFVzZUNDSzZNKHBOZXR3b3JrKTsKLQkJaWYoYklPVEFjdGlvbikKLQkJCXBIVEluZm8tPklPVEFjdGlvbiB8PSBIVF9JT1RfQUNUX01HTlRfVVNFX0NDS182TTsKLQotCQliSU9UQWN0aW9uID0gSFRJT1RBY3RJc0NDREZzeW5jKHBOZXR3b3JrLT5ic3NpZCk7Ci0JCWlmKGJJT1RBY3Rpb24pCi0JCQlwSFRJbmZvLT5JT1RBY3Rpb24gfD0gSFRfSU9UX0FDVF9DRERfRlNZTkM7Ci0KLQkJYklPVEFjdGlvbiA9IEhUSU9UQWN0SXNOdWxsRGF0YVBvd2VyU2F2aW5nKGllZWUsIHBOZXR3b3JrKTsKLQkJaWYoYklPVEFjdGlvbikKLQkJCXBIVEluZm8tPklPVEFjdGlvbiB8PSBIVF9JT1RfQUNUX05VTExfREFUQV9QT1dFUl9TQVZJTkc7Ci0KLQl9Ci0JZWxzZQotCXsKLQkJcEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPSBmYWxzZTsKLQkJcEhUSW5mby0+YkN1cnJlbnRSVDJSVEFnZ3JlZ2F0aW9uID0gZmFsc2U7Ci0JCXBIVEluZm8tPmJDdXJyZW50UlQyUlRMb25nU2xvdFRpbWUgPSBmYWxzZTsKLQotCQlwSFRJbmZvLT5JT1RBY3Rpb24gPSAwOwotCX0KLQotfQotCi12b2lkIEhUVXBkYXRlU2VsZkFuZFBlZXJTZXR0aW5nKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCAJc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICogcE5ldHdvcmspCi17Ci0JUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKLS8vCVBIVF9DQVBBQklMSVRZX0VMRQkJcFBlZXJIVENhcCA9IChQSFRfQ0FQQUJJTElUWV9FTEUpcE5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWY7Ci0JUEhUX0lORk9STUFUSU9OX0VMRQkJcFBlZXJIVEluZm8gPSAoUEhUX0lORk9STUFUSU9OX0VMRSlwTmV0d29yay0+YnNzaHQuYmRIVEluZm9CdWY7Ci0KLQlpZihwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCkKLQl7Ci0JCS8vCi0JCS8vIENvbmZpZyBjdXJyZW50IG9wZXJhdGlvbiBtb2RlLgotCQkvLwotCQlpZihwTmV0d29yay0+YnNzaHQuYmRIVEluZm9MZW4gIT0gMCkKLQkJCXBIVEluZm8tPkN1cnJlbnRPcE1vZGUgPSBwUGVlckhUSW5mby0+T3B0TW9kZTsKLQotCQkvLwotCQkvLyA8VE9ETzogQ29uZmlnIGFjY29yZGluZyB0byBPQlNTIG5vbi1IVCBTVEEgcHJlc2VudCEhPgotCQkvLwotCX0KLX0KLQotdm9pZCBIVFVzZURlZmF1bHRTZXR0aW5nKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlKQotewotCVBSVF9ISUdIX1RIUk9VR0hQVVQgcEhUSW5mbyA9IGllZWUtPnBIVEluZm87Ci0vLwl1OAlyZWdCd09wTW9kZTsKLQotCWlmKHBIVEluZm8tPmJFbmFibGVIVCkKLQl7Ci0JCXBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID0gdHJ1ZTsKLQotCQlwSFRJbmZvLT5iQ3VyU3VwcENDSyA9IHBIVEluZm8tPmJSZWdTdXBwQ0NLOwotCi0JCXBIVEluZm8tPmJDdXJCVzQwTUh6ID0gcEhUSW5mby0+YlJlZ0JXNDBNSHo7Ci0KLQkJcEhUSW5mby0+YkN1clNob3J0R0kyME1Iej0gcEhUSW5mby0+YlJlZ1Nob3J0R0kyME1IejsKLQotCQlwSFRJbmZvLT5iQ3VyU2hvcnRHSTQwTUh6PSBwSFRJbmZvLT5iUmVnU2hvcnRHSTQwTUh6OwotCi0JCXBIVEluZm8tPmJDdXJyZW50X0FNU0RVX1N1cHBvcnQgPSBwSFRJbmZvLT5iQU1TRFVfU3VwcG9ydDsKLQotCQlwSFRJbmZvLT5uQ3VycmVudF9BTVNEVV9NYXhTaXplID0gcEhUSW5mby0+bkFNU0RVX01heFNpemU7Ci0KLQkJcEhUSW5mby0+YkN1cnJlbnRBTVBEVUVuYWJsZSA9IHBIVEluZm8tPmJBTVBEVUVuYWJsZTsKLQotCQlwSFRJbmZvLT5DdXJyZW50QU1QRFVGYWN0b3IgPSBwSFRJbmZvLT5BTVBEVV9GYWN0b3I7Ci0KLQkJcEhUSW5mby0+Q3VycmVudE1QRFVEZW5zaXR5ID0gcEhUSW5mby0+Q3VycmVudE1QRFVEZW5zaXR5OwotCi0JCS8vIFNldCBCV09wTW9kZSByZWdpc3RlcgotCi0JCS8vdXBkYXRlIFJBVFIgaW5kZXgwCi0JCUhURmlsdGVyTUNTUmF0ZShpZWVlLCBpZWVlLT5SZWdkb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0LCBpZWVlLT5kb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0KTsKLQkvL2Z1bmN0aW9uIGJlbG93IGlzIG5vdCBpbXBsZW1lbnRlZCBhdCBhbGwuIFdCCi0jaWZkZWYgVE9ETwotCQlBZGFwdGVyLT5IYWxGdW5jLkluaXRIYWxSQVRSVGFibGVIYW5kbGVyKCBBZGFwdGVyLCAmcE1nbnRJbmZvLT5kb3QxMU9wZXJhdGlvbmFsUmF0ZVNldCwgcE1nbnRJbmZvLT5kb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0KTsKLSNlbmRpZgotCQlpZWVlLT5IVEhpZ2hlc3RPcGVyYVJhdGUgPSBIVEdldEhpZ2hlc3RNQ1NSYXRlKGllZWUsIGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIE1DU19GSUxURVJfQUxMKTsKLQkJaWVlZS0+SFRDdXJyZW50T3BlcmFSYXRlID0gaWVlZS0+SFRIaWdoZXN0T3BlcmFSYXRlOwotCi0JfQotCWVsc2UKLQl7Ci0JCXBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID0gZmFsc2U7Ci0JfQotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKmZ1bmN0aW9uOiAgY2hlY2sgd2hldGhlciBIVCBjb250cm9sIGZpZWxkIGV4aXN0cwotICogICBpbnB1dDogIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlIAkqaWVlZQotICogICAJICAgICB1OCoJCQlwRnJhbWUgLy9jb21pbmcgc2tiLT5kYXRhCi0gKiAgb3V0cHV0OiAgbm9uZQotICogIHJldHVybjogIHJldHVybiB0cnVlIGlmIEhUIGNvbnRyb2wgZmllbGQgZXhpc3RzKGZhbHNlIG90aGVyd2lzZSkKLSAqICBub3RpY2U6Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IEhUQ0NoZWNrKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCoJcEZyYW1lKQotewotCWlmKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0KQotCXsKLQkJaWYoIChJc1FvU0RhdGFGcmFtZShwRnJhbWUpICYmIEZyYW1lX09yZGVyKHBGcmFtZSkpID09IDEpCi0JCXsKLQkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfSFQsICJIVCBDT05UUk9MIEZJTEVEIEVYSVNUISFcbiIpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vLwotLy8gVGhpcyBmdW5jdGlvbiBzZXQgYmFuZHdpZHRoIG1vZGUgaW4gcHJvdG9jb2wgbGF5ZXIuCi0vLwotdm9pZCBIVFNldENvbm5lY3RCd01vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUsIEhUX0NIQU5ORUxfV0lEVEgJQmFuZHdpZHRoLCBIVF9FWFRDSE5MX09GRlNFVAlPZmZzZXQpCi17Ci0JUFJUX0hJR0hfVEhST1VHSFBVVCBwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKLS8vCXUzMiBmbGFncyA9IDA7Ci0KLQlpZihwSFRJbmZvLT5iUmVnQlc0ME1IeiA9PSBmYWxzZSkKLQkJcmV0dXJuOwotCi0KLQotCS8vIFRvIHJlZHVjZSBkdW1teSBvcGVyYXRpb24KLS8vCWlmKChwSFRJbmZvLT5iQ3VyQlc0ME1Iej09ZmFsc2UgJiYgQmFuZHdpZHRoPT1IVF9DSEFOTkVMX1dJRFRIXzIwKSB8fAotLy8JICAgKHBIVEluZm8tPmJDdXJCVzQwTUh6PT10cnVlICYmIEJhbmR3aWR0aD09SFRfQ0hBTk5FTF9XSURUSF8yMF80MCAmJiBPZmZzZXQ9PXBIVEluZm8tPkN1clNUQUV4dENobmxPZmZzZXQpKQotLy8JCXJldHVybjsKLQotLy8Jc3Bpbl9sb2NrX2lycXNhdmUoJihpZWVlLT5id19zcGlubG9jayksIGZsYWdzKTsKLQlpZihwSFRJbmZvLT5iU3dCd0luUHJvZ3Jlc3MpIHsKLS8vCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaWVlZS0+Yndfc3BpbmxvY2spLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0JLy9pZiBpbiBoYWxmIE4gbW9kZSwgc2V0IHRvIDIwTSBiYW5kd2lkdGggcGxlYXNlIDA5LjA4LjIwMDggV0IuCi0JaWYgKEJhbmR3aWR0aD09SFRfQ0hBTk5FTF9XSURUSF8yMF80MCAmJiAoIWllZWUtPkdldEhhbGZObW9kZVN1cHBvcnRCeUFQc0hhbmRsZXIoaWVlZSkpKQotCSB7Ci0JIAkJLy8gSGFuZGxlIElsbGVnYWwgZXh0ZW5zaW9uIGNoYW5uZWwgb2Zmc2V0ISEKLQkJaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWw8MiAmJiBPZmZzZXQ9PUhUX0VYVENITkxfT0ZGU0VUX0xPV0VSKQotCQkJT2Zmc2V0ID0gSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUOwotCQlpZihPZmZzZXQ9PUhUX0VYVENITkxfT0ZGU0VUX1VQUEVSIHx8IE9mZnNldD09SFRfRVhUQ0hOTF9PRkZTRVRfTE9XRVIpIHsKLQkJCXBIVEluZm8tPmJDdXJCVzQwTUh6ID0gdHJ1ZTsKLQkJCXBIVEluZm8tPkN1clNUQUV4dENobmxPZmZzZXQgPSBPZmZzZXQ7Ci0JCX0gZWxzZSB7Ci0JCQlwSFRJbmZvLT5iQ3VyQlc0ME1IeiA9IGZhbHNlOwotCQkJcEhUSW5mby0+Q3VyU1RBRXh0Q2hubE9mZnNldCA9IEhUX0VYVENITkxfT0ZGU0VUX05PX0VYVDsKLQkJfQotCX0gZWxzZSB7Ci0JCXBIVEluZm8tPmJDdXJCVzQwTUh6ID0gZmFsc2U7Ci0JCXBIVEluZm8tPkN1clNUQUV4dENobmxPZmZzZXQgPSBIVF9FWFRDSE5MX09GRlNFVF9OT19FWFQ7Ci0JfQotCi0JcEhUSW5mby0+YlN3QndJblByb2dyZXNzID0gdHJ1ZTsKLQotCS8vIFRPRE86IDIwMDcuNy4xMyBieSBFbWlseSBXYWl0IDIwMDBtcyAgaW4gb3JkZXIgdG8gZ3VhcmFudGVlIHRoYXQgc3dpdGNoaW5nCi0JLy8gICBiYW5kd2lkdGggaXMgZXhlY3V0ZWQgYWZ0ZXIgc2NhbiBpcyBmaW5pc2hlZC4gSXQgaXMgYSB0ZW1wb3JhbCBzb2x1dGlvbgotCS8vICAgYmVjYXVzZSBzb2Z0d2FyZSBzaG91bGQgZ2FucmFudGVlIHRoZSBsYXN0IG9wZXJhdGlvbiBvZiBzd2l0Y2hpbmcgYmFuZHdpZHRoCi0JLy8gICBpcyBleGVjdXRlZCBwcm9wZXJsbHkuCi0JSFRTZXRDb25uZWN0QndNb2RlQ2FsbGJhY2soaWVlZSk7Ci0KLS8vCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihpZWVlLT5id19zcGlubG9jayksIGZsYWdzKTsKLX0KLQotdm9pZCBIVFNldENvbm5lY3RCd01vZGVDYWxsYmFjayhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSkKLXsKLQlQUlRfSElHSF9USFJPVUdIUFVUIHBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOwotCi0JSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIj09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JaWYocEhUSW5mby0+YkN1ckJXNDBNSHopCi0JewotCQlpZihwSFRJbmZvLT5DdXJTVEFFeHRDaG5sT2Zmc2V0PT1IVF9FWFRDSE5MX09GRlNFVF9VUFBFUikKLQkJCWllZWUtPnNldF9jaGFuKGllZWUsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKzIpOwotCQllbHNlIGlmKHBIVEluZm8tPkN1clNUQUV4dENobmxPZmZzZXQ9PUhUX0VYVENITkxfT0ZGU0VUX0xPV0VSKQotCQkJaWVlZS0+c2V0X2NoYW4oaWVlZSwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwtMik7Ci0JCWVsc2UKLQkJCWllZWUtPnNldF9jaGFuKGllZWUsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKLQotCQlpZWVlLT5TZXRCV01vZGVIYW5kbGVyKGllZWUsIEhUX0NIQU5ORUxfV0lEVEhfMjBfNDAsIHBIVEluZm8tPkN1clNUQUV4dENobmxPZmZzZXQpOwotCX0gZWxzZSB7Ci0JCWllZWUtPnNldF9jaGFuKGllZWUsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKLQkJaWVlZS0+U2V0QldNb2RlSGFuZGxlcihpZWVlLCBIVF9DSEFOTkVMX1dJRFRIXzIwLCBIVF9FWFRDSE5MX09GRlNFVF9OT19FWFQpOwotCX0KLQotCXBIVEluZm8tPmJTd0J3SW5Qcm9ncmVzcyA9IGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9ydGw4MTl4X1Fvcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9ydGw4MTl4X1Fvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDU2NWVjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvcnRsODE5eF9Rb3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4MiArMCwwIEBACi0jaWZuZGVmIF9fSU5DX1FPU19UWVBFX0gKLSNkZWZpbmUgX19JTkNfUU9TX1RZUEVfSAotCi0jZGVmaW5lIEJJVDAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgQklUMSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBCSVQyICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEJJVDMgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKLSNkZWZpbmUgQklUNCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBCSVQ1ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEJJVDYgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKLSNkZWZpbmUgQklUNyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBCSVQ4ICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIEJJVDkgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgQklUMTAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAotI2RlZmluZSBCSVQxMSAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCi0jZGVmaW5lIEJJVDEyICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgQklUMTMgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAotI2RlZmluZSBCSVQxNCAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCi0jZGVmaW5lIEJJVDE1ICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKLSNkZWZpbmUgQklUMTYgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAotI2RlZmluZSBCSVQxNyAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIEJJVDE4ICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKLSNkZWZpbmUgQklUMTkgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAotI2RlZmluZSBCSVQyMCAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCi0jZGVmaW5lIEJJVDIxICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKLSNkZWZpbmUgQklUMjIgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMAotI2RlZmluZSBCSVQyMyAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwCi0jZGVmaW5lIEJJVDI0ICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKLSNkZWZpbmUgQklUMjUgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAotI2RlZmluZSBCSVQyNiAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCi0jZGVmaW5lIEJJVDI3ICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKLSNkZWZpbmUgQklUMjggICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAotI2RlZmluZSBCSVQyOSAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCi0jZGVmaW5lIEJJVDMwICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgQklUMzEgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAotCi0jZGVmaW5lCU1BWF9XTU1FTEVfTEVOR1RICTY0Ci0KLS8vCi0vLyBRb1MgbW9kZS4KLS8vIGVudW0gMCwgMSwgMiwgNDogc2luY2Ugd2UgY2FuIHVzZSB0aGUgT1IofCkgb3BlcmF0aW9uLgotLy8KLS8vIFFPU19NT0RFIGlzIHJlZGVmaW5lZCBmb3IgZW51bSBjYW4ndCBiZSArKywgfCB1bmRlciBDKysgY29tcGlsZXIsIDIwMDYuMDUuMTcsIGJ5IHJjbmprby4KLS8vdHlwZWRlZgllbnVtIF9RT1NfTU9ERXsKLS8vCVFPU19ESVNBQkxFCQk9IDAsCi0vLwlRT1NfV01NCQkJPSAxLAotLy8JUU9TX0VEQ0EJCQk9IDIsCi0vLwlRT1NfSENDQQkJCT0gNCwKLS8vfVFPU19NT0RFLCpQUU9TX01PREU7Ci0vLwotdHlwZWRlZiB1MzIgUU9TX01PREUsICpQUU9TX01PREU7Ci0jZGVmaW5lIFFPU19ESVNBQkxFCQkwCi0jZGVmaW5lIFFPU19XTU0JCQkxCi0jZGVmaW5lIFFPU19XTU1TQQkJMgotI2RlZmluZSBRT1NfRURDQQkJNAotI2RlZmluZSBRT1NfSENDQQkJOAotI2RlZmluZSBRT1NfV01NX1VBUFNECQkxNiAgIC8vV01NIFBvd2VyIFNhdmUsIDIwMDYtMDYtMTQgSXNhaWFoCi0KLSNkZWZpbmUgQUNfUEFSQU1fU0laRQk0Ci0jZGVmaW5lIFdNTV9QQVJBTV9FTEVfQk9EWV9MRU4JMTgKLQotLy8KLS8vIFFvUyBBQ0sgUG9saWN5IEZpZWxkIFZhbHVlcwotLy8gUmVmOiBXTU0gc3BlYyAyLjEuNjogUW9TIENvbnRyb2wgRmllbGQsIHAuMTAuCi0vLwotdHlwZWRlZgllbnVtIF9BQ0tfUE9MSUNZewotCWVBY2tQbGMwX0FDSwkJPSAweDAwLAotCWVBY2tQbGMxX05vQUNLCQk9IDB4MDEsCi19QUNLX1BPTElDWSwqUEFDS19QT0xJQ1k7Ci0KLSNkZWZpbmUgV01NX1BBUkFNX0VMRU1FTlRfU0laRQkoOCsoNCpBQ19QQVJBTV9TSVpFKSkKLQotLy8KLS8vIFFvUyBDb250cm9sIEZpZWxkCi0vLyBSZWY6Ci0vLwkxLiBXTU0gc3BlYyAyLjEuNjogUW9TIENvbnRyb2wgRmllbGQsIHAuOS4KLS8vCTIuIDgwMi4xMWUvRDEzLjAgNy4xLjMuNSwgcC4yNi4KLS8vCi10eXBlZGVmCXVuaW9uIF9RT1NfQ1RSTF9GSUVMRHsKLQl1OAljaGFyRGF0YVsyXTsKLQl1MTYJc2hvcnREYXRhOwotCi0JLy8gV01NIHNwZWMKLQlzdHJ1Y3QKLQl7Ci0JCXU4CQlVUDozOwotCQl1OAkJdXNSc3ZkMToxOwotCQl1OAkJRU9TUDoxOwotCQl1OAkJQWNrUG9saWN5OjI7Ci0JCXU4CQl1c1JzdmQyOjE7Ci0JCXU4CQl1Y1JzdmRCeXRlOwotCX1XTU07Ci0KLQkvLyA4MDIuMTFlOiBRb1MgZGF0YSB0eXBlIGZyYW1lIHNlbnQgYnkgbm9uLUFQIFFTVEFzLgotCXN0cnVjdAotCXsKLQkJdTgJCVRJRDo0OwotCQl1OAkJYklzUXNpemU6MTsvLyAwOiBCSVRbODoxNV0gaXMgVFhPUCBEdXJhdGlvbiBSZXF1ZXN0ZWQsIDE6IEJJVFs4OjE1XSBpcyBRdWV1ZSBTaXplLgotCQl1OAkJQWNrUG9saWN5OjI7Ci0JCXU4CQl1c1JzdmQ6MTsKLQkJdTgJCVR4b3BPclFzaXplOwkvLyAoQklUND0wKVRYT1AgRHVyYXRpb24gUmVxdWVzdGVkIG9yIChCSVQ0PTEpUXVldWUgU2l6ZS4KLQl9QnlTdGE7Ci0KLQkvLyA4MDIuMTFlOiBRb1MgZGF0YSwgUW9TIE51bGwsIGFuZCBRb1MgRGF0YStDRi1BY2sgZnJhbWVzIHNlbnQgYnkgSEMuCi0Jc3RydWN0Ci0JewotCQl1OAkJVElEOjQ7Ci0JCXU4CQlFT1NQOjE7Ci0JCXU4CQlBY2tQb2xpY3k6MjsKLQkJdTgJCXVzUnN2ZDoxOwotCQl1OAkJUFNCdWZTdGF0ZTsJCS8vIFFBUCBQUyBCdWZmZXIgU3RhdGUuCi0JfUJ5SGNfRGF0YTsKLQotCS8vIDgwMi4xMWU6IFFvUyAoKykgQ0YtUG9sbCBmcmFtZXMgc2VudCBieSBIQy4KLQlzdHJ1Y3QKLQl7Ci0JCXU4CQlUSUQ6NDsKLQkJdTgJCUVPU1A6MTsKLQkJdTgJCUFja1BvbGljeToyOwotCQl1OAkJdXNSc3ZkOjE7Ci0JCXU4CQlUeG9wTGltaXQ7CQkvLyBUWE9QIExpbWl0LgotCX1CeUhjX0NGUDsKLQotfVFPU19DVFJMX0ZJRUxELCAqUFFPU19DVFJMX0ZJRUxEOwotCi0KLS8vCi0vLyBRb1MgSW5mbyBGaWVsZAotLy8gUmVmOgotLy8JMS4gV01NIHNwZWMgMi4yLjE6IFdNRSBJbmZvcm1hdGlvbiBFbGVtZW50LCBwLjExLgotLy8JMi4gODE4NSBRb1MgY29kZTogUU9TX0lORk8gW2RlZi4gaW4gUW9TX21wLmhdCi0vLwotdHlwZWRlZgl1bmlvbiBfUU9TX0lORk9fRklFTER7Ci0JdTgJY2hhckRhdGE7Ci0KLQlzdHJ1Y3QKLQl7Ci0JCXU4CQl1Y1BhcmFtZXRlclNldENvdW50OjQ7Ci0JCXU4CQl1Y1Jlc2VydmVkOjQ7Ci0JfVdNTTsKLQotCXN0cnVjdAotCXsKLQkJLy9SZWYgV01NX1NwZWNpZmljYXRpb25fMS0xLnBkZiwgMjAwNi0wNi0xMyBJc2FpYWgKLQkJdTgJCXVjQUNfVk9fVUFQU0Q6MTsKLQkJdTgJCXVjQUNfVklfVUFQU0Q6MTsKLQkJdTgJCXVjQUNfQkVfVUFQU0Q6MTsKLQkJdTgJCXVjQUNfQktfVUFQU0Q6MTsKLQkJdTgJCXVjUmVzZXJ2ZWQxOjE7Ci0JCXU4CQl1Y01heFNQTGVuOjI7Ci0JCXU4CQl1Y1Jlc2VydmVkMjoxOwotCi0JfUJ5V21tUHNTdGE7Ci0KLQlzdHJ1Y3QKLQl7Ci0JCS8vUmVmIFdNTV9TcGVjaWZpY2F0aW9uXzEtMS5wZGYsIDIwMDYtMDYtMTMgSXNhaWFoCi0JCXU4CQl1Y1BhcmFtZXRlclNldENvdW50OjQ7Ci0JCXU4CQl1Y1Jlc2VydmVkOjM7Ci0JCXU4CQl1Y0FwVWFwc2Q6MTsKLQl9QnlXbW1Qc0FwOwotCi0Jc3RydWN0Ci0JewotCQl1OAkJdWNBQzNfVUFQU0Q6MTsKLQkJdTgJCXVjQUMyX1VBUFNEOjE7Ci0JCXU4CQl1Y0FDMV9VQVBTRDoxOwotCQl1OAkJdWNBQzBfVUFQU0Q6MTsKLQkJdTgJCXVjUUFjazoxOwotCQl1OAkJdWNNYXhTUExlbjoyOwotCQl1OAkJdWNNb3JlRGF0YUFjazoxOwotCX0gQnkxMWVTdGE7Ci0KLQlzdHJ1Y3QKLQl7Ci0JCXU4CQl1Y1BhcmFtZXRlclNldENvdW50OjQ7Ci0JCXU4CQl1Y1FBY2s6MTsKLQkJdTgJCXVjUXVldWVSZXE6MTsKLQkJdTgJCXVjVFhPUFJlcToxOwotCQl1OAkJdWNSZXNlcnZlZDoxOwotCX0gQnkxMWVBcDsKLQotCXN0cnVjdAotCXsKLQkJdTgJCXVjUmVzZXJ2ZWQxOjQ7Ci0JCXU4CQl1Y1FBY2s6MTsKLQkJdTgJCXVjUmVzZXJ2ZWQyOjI7Ci0JCXU4CQl1Y01vcmVEYXRhQWNrOjE7Ci0JfSBCeVdtbXNhU3RhOwotCi0Jc3RydWN0Ci0JewotCQl1OAkJdWNSZXNlcnZlZDE6NDsKLQkJdTgJCXVjUUFjazoxOwotCQl1OAkJdWNRdWV1ZVJlcToxOwotCQl1OAkJdWNUWE9QUmVxOjE7Ci0JCXU4CQl1Y1Jlc2VydmVkMjoxOwotCX0gQnlXbW1zYUFwOwotCi0Jc3RydWN0Ci0JewotCQl1OAkJdWNBQzNfVUFQU0Q6MTsKLQkJdTgJCXVjQUMyX1VBUFNEOjE7Ci0JCXU4CQl1Y0FDMV9VQVBTRDoxOwotCQl1OAkJdWNBQzBfVUFQU0Q6MTsKLQkJdTgJCXVjUUFjazoxOwotCQl1OAkJdWNNYXhTUExlbjoyOwotCQl1OAkJdWNNb3JlRGF0YUFjazoxOwotCX0gQnlBbGxTdGE7Ci0KLQlzdHJ1Y3QKLQl7Ci0JCXU4CQl1Y1BhcmFtZXRlclNldENvdW50OjQ7Ci0JCXU4CQl1Y1FBY2s6MTsKLQkJdTgJCXVjUXVldWVSZXE6MTsKLQkJdTgJCXVjVFhPUFJlcToxOwotCQl1OAkJdWNBcFVhcHNkOjE7Ci0JfSBCeUFsbEFwOwotCi19UU9TX0lORk9fRklFTEQsICpQUU9TX0lORk9fRklFTEQ7Ci0KLS8vCi0vLyBBQ0kgdG8gQUMgY29kaW5nLgotLy8gUmVmOiBXTU0gc3BlYyAyLjIuMjogV01FIFBhcmFtZXRlciBFbGVtZW50LCBwLjEzLgotLy8KLS8vIEFDX0NPRElORyBpcyByZWRlZmluZWQgZm9yIGVudW0gY2FuJ3QgYmUgKyssIHwgdW5kZXIgQysrIGNvbXBpbGVyLCAyMDA2LjA1LjE3LCBieSByY25qa28uCi0vL3R5cGVkZWYJZW51bSBfQUNfQ09ESU5HewotLy8JQUMwX0JFCT0gMCwJCS8vIEFDSTogMHgwMAkvLyBCZXN0IEVmZm9ydAotLy8JQUMxX0JLCT0gMSwJCS8vIEFDSTogMHgwMQkvLyBCYWNrZ3JvdW5kCi0vLwlBQzJfVkkJPSAyLAkJLy8gQUNJOiAweDEwCS8vIFZpZGVvCi0vLwlBQzNfVk8JPSAzLAkJLy8gQUNJOiAweDExCS8vIFZvaWNlCi0vLwlBQ19NQVggPSA0LAkJLy8gTWF4OiBkZWZpbmUgdG90YWwgbnVtYmVyOyBTaG91bGQgbm90IHRvIGJlIHVzZWQgYXMgYSByZWFsIGVudW0uCi0vL31BQ19DT0RJTkcsKlBBQ19DT0RJTkc7Ci0vLwotdHlwZWRlZiB1MzIgQUNfQ09ESU5HOwotI2RlZmluZSBBQzBfQkUJMAkJLy8gQUNJOiAweDAwCS8vIEJlc3QgRWZmb3J0Ci0jZGVmaW5lIEFDMV9CSwkxCQkvLyBBQ0k6IDB4MDEJLy8gQmFja2dyb3VuZAotI2RlZmluZSBBQzJfVkkJMgkJLy8gQUNJOiAweDEwCS8vIFZpZGVvCi0jZGVmaW5lIEFDM19WTwkzCQkvLyBBQ0k6IDB4MTEJLy8gVm9pY2UKLSNkZWZpbmUgQUNfTUFYCTQJCS8vIE1heDogZGVmaW5lIHRvdGFsIG51bWJlcjsgU2hvdWxkIG5vdCB0byBiZSB1c2VkIGFzIGEgcmVhbCBlbnVtLgotCi0vLwotLy8gQUNJL0FJRlNOIEZpZWxkLgotLy8gUmVmOiBXTU0gc3BlYyAyLjIuMjogV01FIFBhcmFtZXRlciBFbGVtZW50LCBwLjEyLgotLy8KLXR5cGVkZWYJdW5pb24gX0FDSV9BSUZTTnsKLQl1OAljaGFyRGF0YTsKLQotCXN0cnVjdAotCXsKLQkJdTgJQUlGU046NDsKLQkJdTgJQUNNOjE7Ci0JCXU4CUFDSToyOwotCQl1OAlSZXNlcnZlZDoxOwotCX1mOwkvLyBGaWVsZAotfUFDSV9BSUZTTiwgKlBBQ0lfQUlGU047Ci0KLS8vCi0vLyBFQ1dtaW4vRUNXbWF4IGZpZWxkLgotLy8gUmVmOiBXTU0gc3BlYyAyLjIuMjogV01FIFBhcmFtZXRlciBFbGVtZW50LCBwLjEzLgotLy8KLXR5cGVkZWYJdW5pb24gX0VDV3sKLQl1OAljaGFyRGF0YTsKLQlzdHJ1Y3QKLQl7Ci0JCXU4CUVDV21pbjo0OwotCQl1OAlFQ1dtYXg6NDsKLQl9ZjsJLy8gRmllbGQKLX1FQ1csICpQRUNXOwotCi0vLwotLy8gQUMgUGFyYW1ldGVycyBSZWNvcmQgRm9ybWF0LgotLy8gUmVmOiBXTU0gc3BlYyAyLjIuMjogV01FIFBhcmFtZXRlciBFbGVtZW50LCBwLjEyLgotLy8KLXR5cGVkZWYJdW5pb24gX0FDX1BBUkFNewotCXUzMglsb25nRGF0YTsKLQl1OAljaGFyRGF0YVs0XTsKLQotCXN0cnVjdAotCXsKLQkJQUNJX0FJRlNOCUFjaUFpZnNuOwotCQlFQ1cJCUVjdzsKLQkJdTE2CQlUWE9QTGltaXQ7Ci0JfWY7CS8vIEZpZWxkCi19QUNfUEFSQU0sICpQQUNfUEFSQU07Ci0KLQotCi0vLwotLy8gUW9TIGVsZW1lbnQgc3VidHlwZQotLy8KLXR5cGVkZWYJZW51bSBfUU9TX0VMRV9TVUJUWVBFewotCVFPU0VMRV9UWVBFX0lORk8JPSAweDAwLAkJLy8gMHgwMDogSW5mb3JtYXRpb24gZWxlbWVudAotCVFPU0VMRV9UWVBFX1BBUkFNCT0gMHgwMSwJCS8vIDB4MDE6IHBhcmFtZXRlciBlbGVtZW50Ci19UU9TX0VMRV9TVUJUWVBFLCpQUU9TX0VMRV9TVUJUWVBFOwotCi0KLS8vCi0vLyBEaXJlY3Rpb24gRmllbGQgVmFsdWVzLgotLy8gUmVmOiBXTU0gc3BlYyAyLjIuMTE6IFdNRSBUU1BFQyBFbGVtZW50LCBwLjE4LgotLy8KLXR5cGVkZWYJZW51bSBfRElSRUNUSU9OX1ZBTFVFewotCURJUl9VUAkJCT0gMCwJCS8vIDB4MDAJLy8gVXBMaW5rCi0JRElSX0RPV04JCT0gMSwJCS8vIDB4MDEJLy8gRG93bkxpbmsKLQlESVJfRElSRUNUCQk9IDIsCQkvLyAweDEwCS8vIERpcmVjdExpbmsKLQlESVJfQklfRElSCQk9IDMsCQkvLyAweDExCS8vIEJpLURpcmVjdGlvbgotfURJUkVDVElPTl9WQUxVRSwqUERJUkVDVElPTl9WQUxVRTsKLQotCi0vLwotLy8gVFMgSW5mbyBmaWVsZCBpbiBXTU0gVFNQRUMgRWxlbWVudC4KLS8vIFJlZjoKLS8vCTEuIFdNTSBzcGVjIDIuMi4xMTogV01FIFRTUEVDIEVsZW1lbnQsIHAuMTguCi0vLwkyLiA4MTg1IFFvUyBjb2RlOiBRT1NfVFNJTkZPIFtkZWYuIGluIFFvU19tcC5oXQotLy8KLXR5cGVkZWYgdW5pb24gX1FPU19UU0lORk97Ci0JdTgJCWNoYXJEYXRhWzNdOwotCXN0cnVjdCB7Ci0JCXU4CQl1Y1RyYWZmaWNUeXBlOjE7CQkJLy9XTU0gaXMgcmVzZXJ2ZWQKLQkJdTgJCXVjVFNJRDo0OwotCQl1OAkJdWNEaXJlY3Rpb246MjsKLQkJdTgJCXVjQWNjZXNzUG9saWN5OjI7CS8vV01NOiBiaXQ4PTAsIGJpdDc9MQotCQl1OAkJdWNBZ2dyZWdhdGlvbjoxOwkJLy9XTU0gaXMgcmVzZXJ2ZWQKLQkJdTgJCXVjUFNCOjE7CQkJCS8vV01NU0EgaXMgQVBTRAotCQl1OAkJdWNVUDozOwotCQl1OAkJdWNUU0luZm9BY2tQb2xpY3k6MjsJCS8vV01NIGlzIHJlc2VydmVkCi0JCXU4CQl1Y1NjaGVkdWxlOjE7CQkJLy9XTU0gaXMgcmVzZXJ2ZWQKLQkJdTgJCXVjUmVzZXJ2ZWQ6NzsKLQl9ZmllbGQ7Ci19UU9TX1RTSU5GTywgKlBRT1NfVFNJTkZPOwotCi0vLwotLy8gV01NIFRTUEVDIEJvZHkuCi0vLyBSZWY6IFdNTSBzcGVjIDIuMi4xMTogV01FIFRTUEVDIEVsZW1lbnQsIHAuMTYuCi0vLwotdHlwZWRlZiB1bmlvbiBfVFNQRUNfQk9EWXsKLQl1OAkJY2hhckRhdGFbNTVdOwotCi0Jc3RydWN0Ci0JewotCQlRT1NfVFNJTkZPCVRTSW5mbzsJLy91OAlUU0luZm9bM107Ci0JCXUxNglOb21pbmFsTVNEVXNpemU7Ci0JCXUxNglNYXhNU0RVc2l6ZTsKLQkJdTMyCU1pblNlcnZpY2VJdHY7Ci0JCXUzMglNYXhTZXJ2aWNlSXR2OwotCQl1MzIJSW5hY3Rpdml0eUl0djsKLQkJdTMyCVN1c3Blbkl0djsKLQkJdTMyCVNlcnZpY2VTdGFydFRpbWU7Ci0JCXUzMglNaW5EYXRhUmF0ZTsKLQkJdTMyCU1lYW5EYXRhUmF0ZTsKLQkJdTMyCVBlYWtEYXRhUmF0ZTsKLQkJdTMyCU1heEJ1cnN0U2l6ZTsKLQkJdTMyCURlbGF5Qm91bmQ7Ci0JCXUzMglNaW5QaHlSYXRlOwotCQl1MTYJU3VycGx1c0JhbmR3aWR0aEFsbG93YW5jZTsKLQkJdTE2CU1lZGl1bVRpbWU7Ci0JfSBmOwkvLyBGaWVsZAotfVRTUEVDX0JPRFksICpQVFNQRUNfQk9EWTsKLQotCi0vLwotLy8gV01NIFRTUEVDIEVsZW1lbnQuCi0vLyBSZWY6IFdNTSBzcGVjIDIuMi4xMTogV01FIFRTUEVDIEVsZW1lbnQsIHAuMTYuCi0vLwotdHlwZWRlZiBzdHJ1Y3QgX1dNTV9UU1BFQ3sKLQl1OAkJSUQ7Ci0JdTgJCUxlbmd0aDsKLQl1OAkJT1VJWzNdOwotCXU4CQlPVUlfVHlwZTsKLQl1OAkJT1VJX1N1YlR5cGU7Ci0JdTgJCVZlcnNpb247Ci0JVFNQRUNfQk9EWQlCb2R5OwotfSBXTU1fVFNQRUMsICpQV01NX1RTUEVDOwotCi0vLwotLy8gQUNNIGltcGxlbWVudGF0aW9uIG1ldGhvZC4KLS8vIEFubmllLCAyMDA1LTEyLTEzLgotLy8KLXR5cGVkZWYJZW51bSBfQUNNX01FVEhPRHsKLQllQWNtV2F5MF9Td0FuZEh3CQk9IDAsCQkvLyBCeSBTVyBhbmQgSFcuCi0JZUFjbVdheTFfSFcJCQk9IDEsCQkvLyBCeSBIVy4KLQllQWNtV2F5Ml9TVwkJCT0gMiwJCS8vIEJ5IFNXLgotfUFDTV9NRVRIT0QsKlBBQ01fTUVUSE9EOwotCi0KLXR5cGVkZWYgc3RydWN0IF9BQ017Ci0vLwl1OAkJUmVnRW5hYmxlQUNNOwotCXU2NAkJVXNlZFRpbWU7Ci0JdTY0CQlNZWRpdW1UaW1lOwotCXU4CQlId0FjbUN0bDsJLy8gVFJVRTogVXNlZFRpbWUgZXhjZWVkID0+IERvIE5PVCBVU0UgdGhpcyBBQy4gSXQgd2xsIGJlIHdyaXR0ZW4gdG8gQUNNX0NPTlRST0woMHhCRiBCSVQgMC8xLzIgaW4gODE4NUIpLgotfUFDTSwgKlBBQ007Ci0KLXR5cGVkZWYJdTgJCUFDX1VBUFNELCAqUEFDX1VBUFNEOwotCi0jZGVmaW5lCUdFVF9WT19VQVBTRChfYXBzZCkgKChfYXBzZCkgJiBCSVQwKQotI2RlZmluZQlTRVRfVk9fVUFQU0QoX2Fwc2QpICgoX2Fwc2QpIHw9IEJJVDApCi0KLSNkZWZpbmUJR0VUX1ZJX1VBUFNEKF9hcHNkKSAoKF9hcHNkKSAmIEJJVDEpCi0jZGVmaW5lCVNFVF9WSV9VQVBTRChfYXBzZCkgKChfYXBzZCkgfD0gQklUMSkKLQotI2RlZmluZQlHRVRfQktfVUFQU0QoX2Fwc2QpICgoX2Fwc2QpICYgQklUMikKLSNkZWZpbmUJU0VUX0JLX1VBUFNEKF9hcHNkKSAoKF9hcHNkKSB8PSBCSVQyKQotCi0jZGVmaW5lCUdFVF9CRV9VQVBTRChfYXBzZCkgKChfYXBzZCkgJiBCSVQzKQotI2RlZmluZQlTRVRfQkVfVUFQU0QoX2Fwc2QpICgoX2Fwc2QpIHw9IEJJVDMpCi0KLQotLy90eXBlZGVmIHN0cnVjdCBfVENMQVNTewotLy8gVE9ETwotLy99IFRDTEFTUywgKlBUQ0xBU1M7Ci10eXBlZGVmIHVuaW9uIF9RT1NfVENMQVN7Ci0KLQlzdHJ1Y3QgX1RZUEVfR0VORVJBTHsKLQkJdTgJCVByaW9yaXR5OwotCQl1OCAJCUNsYXNzaWZpZXJUeXBlOwotCQl1OCAJCU1hc2s7Ci0JfSBUWVBFX0dFTkVSQUw7Ci0KLQlzdHJ1Y3QgX1RZUEUwX0VUSHsKLQkJdTgJCVByaW9yaXR5OwotCQl1OCAJCUNsYXNzaWZpZXJUeXBlOwotCQl1OCAJCU1hc2s7Ci0JCXU4CQlTcmNBZGRyWzZdOwotCQl1OAkJRHN0QWRkcls2XTsKLQkJdTE2CQlUeXBlOwotCX0gVFlQRTBfRVRIOwotCi0Jc3RydWN0IF9UWVBFMV9JUFY0ewotCQl1OAkJUHJpb3JpdHk7Ci0JCXU4IAkJQ2xhc3NpZmllclR5cGU7Ci0JCXU4IAkJTWFzazsKLQkJdTggCQlWZXJzaW9uOwotCQl1OAkJU3JjSVBbNF07Ci0JCXU4CQlEc3RJUFs0XTsKLQkJdTE2CQlTcmNQb3J0OwotCQl1MTYJCURzdFBvcnQ7Ci0JCXU4CQlEU0NQOwotCQl1OAkJUHJvdG9jb2w7Ci0JCXU4CQlSZXNlcnZlZDsKLQl9IFRZUEUxX0lQVjQ7Ci0KLQlzdHJ1Y3QgX1RZUEUxX0lQVjZ7Ci0JCXU4CQlQcmlvcml0eTsKLQkJdTggCQlDbGFzc2lmaWVyVHlwZTsKLQkJdTggCQlNYXNrOwotCQl1OCAJCVZlcnNpb247Ci0JCXU4CQlTcmNJUFsxNl07Ci0JCXU4CQlEc3RJUFsxNl07Ci0JCXUxNgkJU3JjUG9ydDsKLQkJdTE2CQlEc3RQb3J0OwotCQl1OAkJRmxvd0xhYmVsWzNdOwotCX0gVFlQRTFfSVBWNjsKLQotCXN0cnVjdCBfVFlQRTJfODAyMVF7Ci0JCXU4CQlQcmlvcml0eTsKLQkJdTggCQlDbGFzc2lmaWVyVHlwZTsKLQkJdTggCQlNYXNrOwotCQl1MTYJCVRhZ1R5cGU7Ci0JfSBUWVBFMl84MDIxUTsKLX0gUU9TX1RDTEFTLCAqUFFPU19UQ0xBUzsKLQotLy90eXBlZGVmIHN0cnVjdCBfV01NX1RTVFJFQU17Ci0vLwotLy8tIFRTUEVDCi0vLy0gQUMgKHdoaWNoIHRvIG1hcHBpbmcpCi0vL30gV01NX1RTVFJFQU0sICpQV01NX1RTVFJFQU07Ci10eXBlZGVmIHN0cnVjdCBfUU9TX1RTVFJFQU17Ci0JdTgJCQlBQzsKLQlXTU1fVFNQRUMJCVRTcGVjOwotCVFPU19UQ0xBUwkJVENsYXNzOwotfSBRT1NfVFNUUkVBTSwgKlBRT1NfVFNUUkVBTTsKLQotLy90eXBlZGVmIHN0cnVjdCBfVV9BUFNEewotLy8tIFRyaWdnZXJFbmFibGUgWzRdCi0vLy0gTWF4U1BMZW5ndGgKLS8vLSBIaWdoZXN0QWNCdWZmZXJlZAotLy99IFVfQVBTRCwgKlBVX0FQU0Q7Ci0KLS8vam9zZXBoIFRPRE86Ci0vLwlVQVBTRCBmdW5jdGlvbiBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgMiBkYXRhIHN0cnVjdHVyZQotLy8JIlFvcyBjb250cm9sIGZpZWxkIiBhbmQgIlFvcyBpbmZvIGZpZWxkIgotLy90eXBlZGVmIHN0cnVjdCBfUU9TX1VBUFNEewotLy8JdTgJCQliVHJpZ2dlckVuYWJsZVs0XTsKLS8vCXU4IAkJCU1heFNQTGVuZ3RoOwotLy8JdTgJCQlIaWdoZXN0QnVmQUM7Ci0vL30gUU9TX1VBUFNELCAqUFFPU19BUFNEOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICAgICAgODAyLjExIE1hbmFnZW1lbnQgZnJhbWUgU3RhdHVzIENvZGUgZmllbGQKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdHlwZWRlZiBzdHJ1Y3QgX09DVEVUX1NUUklOR3sKLSAgICAgICAgdTggICAgICAgIAkqT2N0ZXQ7Ci0gICAgICAgIHUxNiAgICAgICAgICAgICBMZW5ndGg7Ci19T0NURVRfU1RSSU5HLCAqUE9DVEVUX1NUUklORzsKLQotLy8KLS8vIFNUQSBRb1MgZGF0YS4KLS8vIFJlZjogRE9UMTFfUU9TIGluIDgxODUgY29kZS4gW2RlZi4gaW4gUW9TX21wLmhdCi0vLwotdHlwZWRlZiBzdHJ1Y3QgX1NUQV9RT1N7Ci0JLy9ERUNMQVJFX1JUX09CSkVDVChTVEFfUU9TKTsKLQl1OAkJCQlXTU1JRUJ1ZltNQVhfV01NRUxFX0xFTkdUSF07Ci0JdTgqCQkJCVdNTUlFOwotCi0JLy8gUGFydCAxLiBTZWxmIFFvUyBNb2RlLgotCVFPU19NT0RFCQkJUW9zQ2FwYWJpbGl0eTsgLy9Rb1MgQ2FwYWJpbGl0eSwgMjAwNi0wNi0xNCBJc2FpYWgKLQlRT1NfTU9ERQkJCUN1cnJlbnRRb3NNb2RlOwotCi0JLy8gRm9yIFdNTSBQb3dlciBTYXZlIE1vZGUgOgotCS8vIEFDcyBhcmUgdHJpZ2dlci9kZWxpdmVyeSBlbmFibGVkIG9yIGxlZ2FjeSBwb3dlciBzYXZlIGVuYWJsZWQuIDIwMDYtMDYtMTMgSXNhaWFoCi0JQUNfVUFQU0QJCQliNGFjX1VhcHNkOyAgLy9Wb1VhcHNkKGJpdDApLCBWaVVhcHNkKGJpdDEpLCAgQmtVYXBzZChiaXQyKSwgQmVVYXBzZChiaXQzKSwKLQlBQ19VQVBTRAkJCUN1cnI0YWNVYXBzZDsKLQl1OAkJCQliSW5TZXJ2aWNlUGVyaW9kOwotCXU4CQkJCU1heFNQTGVuZ3RoOwotCWludCAJCQkJTnVtQmNuQmVmb3JlVHJpZ2dlcjsKLQotCS8vIFBhcnQgMi4gRURDQSBQYXJhbWV0ZXIgKHBlckFDKQotCXU4ICoJCQkJcFdNTUluZm9FbGU7Ci0JdTgJCQkJV01NUGFyYW1FbGVbV01NX1BBUkFNX0VMRU1FTlRfU0laRV07Ci0JdTgJCQkJV01NUEVMZW5ndGg7Ci0KLQkvLyA8QnJ1Y2VfTm90ZT4KLQkvLzIgVG9EbzogcmVtb3ZlIHRoZSBRb3MgSW5mbyBGaWVsZCBhbmQgcmVwbGFjZSBpdCBieSB0aGUgYWJvdmUgV01NIEluZm8gZWxlbWVudC4KLQkvLyBCeSBCcnVjZSwgMjAwOC0wMS0zMC4KLQkvLyBQYXJ0IDIuIEVEQ0EgUGFyYW1ldGVyIChwZXJBQykKLQlRT1NfSU5GT19GSUVMRAkJCVFvc0luZm9GaWVsZF9TVEE7IAkvLyBNYWludGFpbmVkIGJ5IFNUQQotCVFPU19JTkZPX0ZJRUxECQkJUW9zSW5mb0ZpZWxkX0FQOwkvLyBSZXRyaWV2ZWQgZnJvbSBBUAotCi0JQUNfUEFSQU0JCQlDdXJBY1BhcmFtZXRlcnNbNF07Ci0KLQkvLyBQYXJ0IDMuIEFDTQotCUFDTQkJCQlhY21bNF07Ci0JQUNNX01FVEhPRAkJCUFjbU1ldGhvZDsKLQotCS8vIFBhcnQgNC4gUGVyIFRJRCAoUGFydCA1OiBUQ0xBU1Mgd2lsbCBiZSBkZXNjcmliZWQgYnkgVFN0cmVhbSkKLQlRT1NfVFNUUkVBTQkJCVRTdHJlYW1bMTZdOwotCVdNTV9UU1BFQwkJCVRTcGVjOwotCi0JdTMyCQkJCVFCc3NXaXJlbGVzc01vZGU7Ci0KLQkvLyBObyBBY2sgU2V0dGluZwotCXU4CQkJCWJOb0FjazsKLQotCS8vIEVuYWJsZS9EaXNhYmxlIFJ4IGltbWVkaWF0ZSBCQSBjYXBhYmlsaXR5LgotCXU4CQkJCWJFbmFibGVSeEltbUJBOwotCi19U1RBX1FPUywgKlBTVEFfUU9TOwotCi0vLwotLy8gQlNTIFFPUyBkYXRhLgotLy8gUmVmOiBCc3NEc2NyIGluIDgxODUgY29kZS4gW2RlZi4gaW4gQnNzRHNjci5oXQotLy8KLXR5cGVkZWYgc3RydWN0IF9CU1NfUU9TewotCVFPU19NT0RFCQliZFFvU01vZGU7Ci0KLQl1OAkJCWJkV01NSUVCdWZbTUFYX1dNTUVMRV9MRU5HVEhdOwotCXU4KgkJYmRXTU1JRTsKLQotCVFPU19FTEVfU1VCVFlQRQkJRWxlU3ViVHlwZTsKLQotCXU4ICoJCQlwV01NSW5mb0VsZTsKLQl1OCAqCQkJcFdNTVBhcmFtRWxlOwotCi0JUU9TX0lORk9fRklFTEQJCVFvc0luZm9GaWVsZDsKLQlBQ19QQVJBTQkJQWNQYXJhbWV0ZXJbNF07Ci19QlNTX1FPUywgKlBCU1NfUU9TOwotCi0KLS8vCi0vLyBSZWY6IHNRb1NDdGxMbmcgYW5kIFFvU0N0bCBkZWZpbml0aW9uIGluIDgxODUgUW9TIGNvZGUuCi0vLyNkZWZpbmUgUW9TQ3RsICAgKCgJKEFkYXB0ZXItPmJSZWdRb1MpICYmIChBZGFwdGVyLT5kb3QxMVFvUy5Rb1NNb2RlICYoUU9TX0VEQ0F8UU9TX0hDQ0EpKQkgICkgID9zUW9TQ3RsTG5nOjApCi0vLwotI2RlZmluZSBzUW9TQ3RsTG5nCQkJMgotI2RlZmluZQlRT1NfQ1RSTF9MRU4oX1Fvc01vZGUpCQkoKF9Rb3NNb2RlID4gUU9TX0RJU0FCTEUpPyBzUW9TQ3RsTG5nIDogMCkKLQotCi0vL0FkZGVkIGJ5IGpvc2VwaAotLy9VUCBNYXBwaW5nIHRvIEFDLCB1c2luZyBpbiBNZ250UXVlcnlfU2VxdWVuY2VOdW1iZXIoKSBhbmQgbWF5YmUgZm9yIERTQ1AKLS8vI2RlZmluZSBVUDJBQyh1cCkJCQkoKHVwPDMpPygodXA9PTApPzE6MCk6KHVwPj4xKSkKLSNkZWZpbmUgSXNBQ1ZhbGlkKGFjKQkJCSgoYWM8PTcgKT90cnVlOmZhbHNlICkKLQotI2VuZGlmIC8vICNpZm5kZWYgX19JTkNfUU9TX1RZUEVfSApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9ydGw4MTl4X1RTLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL3J0bDgxOXhfVFMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdlMjZmZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL3J0bDgxOXhfVFMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLSNpZm5kZWYgX1RTVFlQRV9IXwotI2RlZmluZSBfVFNUWVBFX0hfCi0jaW5jbHVkZSAicnRsODE5eF9Rb3MuaCIKLSNkZWZpbmUgVFNfU0VUVVBfVElNRU9VVAk2MCAgLy8gSW4gbWlsbGlzZWNvbmQKLSNkZWZpbmUgVFNfSU5BQ1RfVElNRU9VVAk2MAotI2RlZmluZSBUU19BRERCQV9ERUxBWQkJNjAKLQotI2RlZmluZSBUT1RBTF9UU19OVU0JCTE2Ci0jZGVmaW5lIFRDTEFTX05VTQkJNAotCi0vLyBUaGlzIGRlZmluZSB0aGUgVHgvUnggZGlyZWN0aW9ucwotdHlwZWRlZiBlbnVtIF9UUl9TRUxFQ1QgewotCVRYX0RJUiA9IDAsCi0JUlhfRElSID0gMSwKLX0gVFJfU0VMRUNULCAqUFRSX1NFTEVDVDsKLQotdHlwZWRlZiBzdHJ1Y3QgX1RTX0NPTU1PTl9JTkZPewotCXN0cnVjdCBsaXN0X2hlYWQJCUxpc3Q7Ci0Jc3RydWN0IHRpbWVyX2xpc3QJCVNldHVwVGltZXI7Ci0Jc3RydWN0IHRpbWVyX2xpc3QJCUluYWN0VGltZXI7Ci0JdTgJCQkJQWRkcls2XTsKLQlUU1BFQ19CT0RZCQkJVFNwZWM7Ci0JUU9TX1RDTEFTCQkJVENsYXNzW1RDTEFTX05VTV07Ci0JdTgJCQkJVENsYXNQcm9jOwotCXU4CQkJCVRDbGFzTnVtOwotfSBUU19DT01NT05fSU5GTywgKlBUU19DT01NT05fSU5GTzsKLQotdHlwZWRlZiBzdHJ1Y3QgX1RYX1RTX1JFQ09SRHsKLQlUU19DT01NT05fSU5GTwkJVHNDb21tb25JbmZvOwotCXUxNgkJCQlUeEN1clNlcTsKLQlCQV9SRUNPUkQJCQlUeFBlbmRpbmdCQVJlY29yZDsgIAkvLyBGb3IgQkEgT3JpZ2luYXRvcgotCUJBX1JFQ09SRAkJCVR4QWRtaXR0ZWRCQVJlY29yZDsJLy8gRm9yIEJBIE9yaWdpbmF0b3IKLS8vCVFPU19ETF9SRUNPUkQJCURMUmVjb3JkOwotCXU4CQkJCWJBZGRCYVJlcUluUHJvZ3Jlc3M7Ci0JdTgJCQkJYkFkZEJhUmVxRGVsYXllZDsKLQl1OAkJCQliVXNpbmdCYTsKLQlzdHJ1Y3QgdGltZXJfbGlzdAkJVHNBZGRCYVRpbWVyOwotCXU4CQkJCW51bTsKLX0gVFhfVFNfUkVDT1JELCAqUFRYX1RTX1JFQ09SRDsKLQotdHlwZWRlZiBzdHJ1Y3QgX1JYX1RTX1JFQ09SRCB7Ci0JVFNfQ09NTU9OX0lORk8JCVRzQ29tbW9uSW5mbzsKLQl1MTYJCQkJUnhJbmRpY2F0ZVNlcTsKLQl1MTYJCQkJUnhUaW1lb3V0SW5kaWNhdGVTZXE7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJUnhQZW5kaW5nUGt0TGlzdDsKLQlzdHJ1Y3QgdGltZXJfbGlzdAkJUnhQa3RQZW5kaW5nVGltZXI7Ci0JQkFfUkVDT1JECQkJUnhBZG1pdHRlZEJBUmVjb3JkOwkgLy8gRm9yIEJBIFJlY2lwaWVudAotCXUxNgkJCQlSeExhc3RTZXFOdW07Ci0JdTgJCQkJUnhMYXN0RnJhZ051bTsKLQl1OAkJCQludW07Ci0vLwlRT1NfRExfUkVDT1JECQlETFJlY29yZDsKLX0gUlhfVFNfUkVDT1JELCAqUFJYX1RTX1JFQ09SRDsKLQotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9ydGw4MTl4X1RTUHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9ydGw4MTl4X1RTUHJvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDY4NzJkLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvcnRsODE5eF9UU1Byb2MuYworKysgL2Rldi9udWxsCkBAIC0xLDYyNyArMCwwIEBACi0jaW5jbHVkZSAiaWVlZTgwMjExLmgiCi0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSAicnRsODE5eF9UUy5oIgotCi12b2lkIFRzU2V0dXBUaW1lT3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQkvLyBOb3QgaW1wbGVtZW50IHlldAotCS8vIFRoaXMgaXMgdXNlZCBmb3IgV01NU0EgYW5kIEFDTSAsIHRoYXQgd291bGQgc2VuZCBBRERUU1JlcSBmcmFtZS4KLX0KLQotdm9pZCBUc0luYWN0VGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JLy8gTm90IGltcGxlbWVudCB5ZXQKLQkvLyBUaGlzIGlzIHVzZWQgZm9yIFdNTVNBIGFuZCBBQ00uCi0JLy8gVGhpcyBmdW5jdGlvbiB3b3VsZCBiZSBjYWxsIHdoZW4gVFMgaXMgbm8gVHgvUnggZm9yIHNvbWUgcGVyaW9kIG9mIHRpbWUuCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICpmdW5jdGlvbjogIEkgc3RpbGwgbm90IHVuZGVyc3RhbmQgdGhpcyBmdW5jdGlvbiwgc28gd2FpdCBmb3IgZnVydGhlciBpbXBsZW1lbnRhdGlvbgotICogICBpbnB1dDogIHVuc2lnbmVkIGxvbmcJIGRhdGEJCS8vYWN0dXJhbGx5IHdlIHNlbmQgVFhfVFNfUkVDT1JEIG9yIFJYX1RTX1JFQ09SRCB0byB0aGVzZSB0aW1lcgotICogIHJldHVybjogIE5VTEwKLSAqICBub3RpY2U6Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgUnhQa3RQZW5kaW5nVGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JUFJYX1RTX1JFQ09SRAlwUnhUcyA9IChQUlhfVFNfUkVDT1JEKWRhdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YocFJ4VHMsIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBSeFRzUmVjb3JkW3BSeFRzLT5udW1dKTsKLQotCVBSWF9SRU9SREVSX0VOVFJZIAlwUmVvcmRlckVudHJ5ID0gTlVMTDsKLQotCS8vdTMyIGZsYWdzID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQlzdHJ1Y3QgaWVlZTgwMjExX3J4YiAqc3RhdHNfSW5kaWNhdGVBcnJheVtSRU9SREVSX1dJTl9TSVpFXTsKLQl1OCBpbmRleCA9IDA7Ci0JYm9vbCBiUGt0SW5CdWYgPSBmYWxzZTsKLQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJihpZWVlLT5yZW9yZGVyX3NwaW5sb2NrKSwgZmxhZ3MpOwotCS8vUGxhdGZvcm1BY3F1aXJlU3BpbkxvY2soQWRhcHRlciwgUlRfUlhfU1BJTkxPQ0spOwotCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwiPT09PT09PT09PT09PT09PT09PiVzKClcbiIsX19GVU5DVElPTl9fKTsKLQlpZihwUnhUcy0+UnhUaW1lb3V0SW5kaWNhdGVTZXEgIT0gMHhmZmZmKQotCXsKLQkJLy8gSW5kaWNhdGUgdGhlIHBlbmRpbmcgcGFja2V0cyBzZXF1ZW50aWFsbHkgYWNjb3JkaW5nIHRvIFNlcU51bSB1bnRpbCBtZWV0IHRoZSBnYXAuCi0JCXdoaWxlKCFsaXN0X2VtcHR5KCZwUnhUcy0+UnhQZW5kaW5nUGt0TGlzdCkpCi0JCXsKLQkJCXBSZW9yZGVyRW50cnkgPSAoUFJYX1JFT1JERVJfRU5UUlkpbGlzdF9lbnRyeShwUnhUcy0+UnhQZW5kaW5nUGt0TGlzdC5wcmV2LFJYX1JFT1JERVJfRU5UUlksTGlzdCk7Ci0JCQlpZihpbmRleCA9PSAwKQotCQkJCXBSeFRzLT5SeEluZGljYXRlU2VxID0gcFJlb3JkZXJFbnRyeS0+U2VxTnVtOwotCi0JCQlpZiggU05fTEVTUyhwUmVvcmRlckVudHJ5LT5TZXFOdW0sIHBSeFRzLT5SeEluZGljYXRlU2VxKSB8fAotCQkJCVNOX0VRVUFMKHBSZW9yZGVyRW50cnktPlNlcU51bSwgcFJ4VHMtPlJ4SW5kaWNhdGVTZXEpCSkKLQkJCXsKLQkJCQlsaXN0X2RlbF9pbml0KCZwUmVvcmRlckVudHJ5LT5MaXN0KTsKLQotCQkJCWlmKFNOX0VRVUFMKHBSZW9yZGVyRW50cnktPlNlcU51bSwgcFJ4VHMtPlJ4SW5kaWNhdGVTZXEpKQotCQkJCQlwUnhUcy0+UnhJbmRpY2F0ZVNlcSA9IChwUnhUcy0+UnhJbmRpY2F0ZVNlcSArIDEpICUgNDA5NjsKLQotCQkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUkVPUkRFUiwiUnhQa3RQZW5kaW5nVGltZW91dCgpOiBJbmRpY2F0ZVNlcTogJWRcbiIsIHBSZW9yZGVyRW50cnktPlNlcU51bSk7Ci0JCQkJc3RhdHNfSW5kaWNhdGVBcnJheVtpbmRleF0gPSBwUmVvcmRlckVudHJ5LT5wcnhiOwotCQkJCWluZGV4Kys7Ci0KLQkJCQlsaXN0X2FkZF90YWlsKCZwUmVvcmRlckVudHJ5LT5MaXN0LCAmaWVlZS0+UnhSZW9yZGVyX1VudXNlZF9MaXN0KTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQliUGt0SW5CdWYgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JaWYoaW5kZXg+MCkKLQl7Ci0JCS8vIFNldCBSeFRpbWVvdXRJbmRpY2F0ZVNlcSB0byAweGZmZmYgdG8gaW5kaWNhdGUgbm8gcGVuZGluZyBwYWNrZXRzIGluIGJ1ZmZlciBub3cuCi0JCXBSeFRzLT5SeFRpbWVvdXRJbmRpY2F0ZVNlcSA9IDB4ZmZmZjsKLQotCQkvLyBJbmRpY2F0ZSBwYWNrZXRzCi0JCWlmKGluZGV4ID4gUkVPUkRFUl9XSU5fU0laRSl7Ci0JCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgIlJ4UmVvcmRlckluZGljYXRlUGFja2V0KCk6IFJ4IFJlb3JlciBidWZmZXIgZnVsbCEhIFxuIik7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaWVlZS0+cmVvcmRlcl9zcGlubG9jayksIGZsYWdzKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZWVlODAyMTFfaW5kaWNhdGVfcGFja2V0cyhpZWVlLCBzdGF0c19JbmRpY2F0ZUFycmF5LCBpbmRleCk7Ci0JfQotCi0JaWYoYlBrdEluQnVmICYmIChwUnhUcy0+UnhUaW1lb3V0SW5kaWNhdGVTZXE9PTB4ZmZmZikpCi0JewotCQlwUnhUcy0+UnhUaW1lb3V0SW5kaWNhdGVTZXEgPSBwUnhUcy0+UnhJbmRpY2F0ZVNlcTsKLQkJbW9kX3RpbWVyKCZwUnhUcy0+UnhQa3RQZW5kaW5nVGltZXIsIGppZmZpZXMgKyBNU0VDUyhpZWVlLT5wSFRJbmZvLT5SeFJlb3JkZXJQZW5kaW5nVGltZSkpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaWVlZS0+cmVvcmRlcl9zcGlubG9jayksIGZsYWdzKTsKLQkvL1BsYXRmb3JtUmVsZWFzZVNwaW5Mb2NrKEFkYXB0ZXIsIFJUX1JYX1NQSU5MT0NLKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKmZ1bmN0aW9uOiAgQWRkIEJBIHRpbWVyIGZ1bmN0aW9uCi0gKiAgIGlucHV0OiAgdW5zaWduZWQgbG9uZwkgZGF0YQkJLy9hY3R1cmFsbHkgd2Ugc2VuZCBUWF9UU19SRUNPUkQgb3IgUlhfVFNfUkVDT1JEIHRvIHRoZXNlIHRpbWVyCi0gKiAgcmV0dXJuOiAgTlVMTAotICogIG5vdGljZToKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBUc0FkZEJhUHJvY2Vzcyh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JUFRYX1RTX1JFQ09SRAlwVHhUcyA9IChQVFhfVFNfUkVDT1JEKWRhdGE7Ci0JdTggbnVtID0gcFR4VHMtPm51bTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihwVHhUcywgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsIFR4VHNSZWNvcmRbbnVtXSk7Ci0KLQlUc0luaXRBZGRCQShpZWVlLCBwVHhUcywgQkFfUE9MSUNZX0lNTUVESUFURSwgZmFsc2UpOwotCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfQkEsICJUc0FkZEJhUHJvY2VzcygpOiBBRERCQSBSZXEgaXMgc3RhcnRlZCEhIFxuIik7Ci19Ci0KLQotdm9pZCBSZXNldFRzQ29tbW9uSW5mbyhQVFNfQ09NTU9OX0lORk8JcFRzQ29tbW9uSW5mbykKLXsKLQltZW1zZXQocFRzQ29tbW9uSW5mby0+QWRkciwgMCwgNik7Ci0JbWVtc2V0KCZwVHNDb21tb25JbmZvLT5UU3BlYywgMCwgc2l6ZW9mKFRTUEVDX0JPRFkpKTsKLQltZW1zZXQoJnBUc0NvbW1vbkluZm8tPlRDbGFzcywgMCwgc2l6ZW9mKFFPU19UQ0xBUykqVENMQVNfTlVNKTsKLQlwVHNDb21tb25JbmZvLT5UQ2xhc1Byb2MgPSAwOwotCXBUc0NvbW1vbkluZm8tPlRDbGFzTnVtID0gMDsKLX0KLQotdm9pZCBSZXNldFR4VHNFbnRyeShQVFhfVFNfUkVDT1JEIHBUUykKLXsKLQlSZXNldFRzQ29tbW9uSW5mbygmcFRTLT5Uc0NvbW1vbkluZm8pOwotCXBUUy0+VHhDdXJTZXEgPSAwOwotCXBUUy0+YkFkZEJhUmVxSW5Qcm9ncmVzcyA9IGZhbHNlOwotCXBUUy0+YkFkZEJhUmVxRGVsYXllZCA9IGZhbHNlOwotCXBUUy0+YlVzaW5nQmEgPSBmYWxzZTsKLQlSZXNldEJhRW50cnkoJnBUUy0+VHhBZG1pdHRlZEJBUmVjb3JkKTsgLy9Gb3IgQkEgT3JpZ2luYXRvcgotCVJlc2V0QmFFbnRyeSgmcFRTLT5UeFBlbmRpbmdCQVJlY29yZCk7Ci19Ci0KLXZvaWQgUmVzZXRSeFRzRW50cnkoUFJYX1RTX1JFQ09SRCBwVFMpCi17Ci0JUmVzZXRUc0NvbW1vbkluZm8oJnBUUy0+VHNDb21tb25JbmZvKTsKLQlwVFMtPlJ4SW5kaWNhdGVTZXEgPSAweGZmZmY7IC8vIFRoaXMgaW5kaWNhdGUgdGhlIFJ4SW5kaWNhdGVTZXEgaXMgbm90IHVzZWQgbm93ISEKLQlwVFMtPlJ4VGltZW91dEluZGljYXRlU2VxID0gMHhmZmZmOyAvLyBUaGlzIGluZGljYXRlIHRoZSBSeFRpbWVvdXRJbmRpY2F0ZVNlcSBpcyBub3QgdXNlZCBub3chIQotCVJlc2V0QmFFbnRyeSgmcFRTLT5SeEFkbWl0dGVkQkFSZWNvcmQpOwkgIC8vIEZvciBCQSBSZWNpcGllbnQKLX0KLQotdm9pZCBUU0luaXRpYWxpemUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCi17Ci0JUFRYX1RTX1JFQ09SRAkJcFR4VFMgID0gaWVlZS0+VHhUc1JlY29yZDsKLQlQUlhfVFNfUkVDT1JECQlwUnhUUyAgPSBpZWVlLT5SeFRzUmVjb3JkOwotCVBSWF9SRU9SREVSX0VOVFJZCXBSeFJlb3JkZXJFbnRyeSA9IGllZWUtPlJ4UmVvcmRlckVudHJ5OwotCXU4CQkJCWNvdW50ID0gMDsKLQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1RTLCAiPT09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOwotCS8vIEluaXRpYWxpemUgVHggVFMgcmVsYXRlZCBpbmZvLgotCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5UeF9UU19BZG1pdF9MaXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmaWVlZS0+VHhfVFNfUGVuZGluZ19MaXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmaWVlZS0+VHhfVFNfVW51c2VkX0xpc3QpOwotCi0JZm9yKGNvdW50ID0gMDsgY291bnQgPCBUT1RBTF9UU19OVU07IGNvdW50KyspCi0JewotCQkvLwotCQlwVHhUUy0+bnVtID0gY291bnQ7Ci0JCS8vIFRoZSB0aW1lcnMgZm9yIHRoZSBvcGVyYXRpb24gb2YgVHJhZmZpYyBTdHJlYW0gYW5kIEJsb2NrIEFjay4KLQkJLy8gRExTIHJlbGF0ZWQgdGltZXIgd2lsbCBiZSBhZGQgaGVyZSBpbiB0aGUgZnV0dXJlISEKLQkJaW5pdF90aW1lcigmcFR4VFMtPlRzQ29tbW9uSW5mby5TZXR1cFRpbWVyKTsKLQkJcFR4VFMtPlRzQ29tbW9uSW5mby5TZXR1cFRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVHhUUzsKLQkJcFR4VFMtPlRzQ29tbW9uSW5mby5TZXR1cFRpbWVyLmZ1bmN0aW9uID0gVHNTZXR1cFRpbWVPdXQ7Ci0KLQkJaW5pdF90aW1lcigmcFR4VFMtPlRzQ29tbW9uSW5mby5JbmFjdFRpbWVyKTsKLQkJcFR4VFMtPlRzQ29tbW9uSW5mby5JbmFjdFRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVHhUUzsKLQkJcFR4VFMtPlRzQ29tbW9uSW5mby5JbmFjdFRpbWVyLmZ1bmN0aW9uID0gVHNJbmFjdFRpbWVvdXQ7Ci0KLQkJaW5pdF90aW1lcigmcFR4VFMtPlRzQWRkQmFUaW1lcik7Ci0JCXBUeFRTLT5Uc0FkZEJhVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBUeFRTOwotCQlwVHhUUy0+VHNBZGRCYVRpbWVyLmZ1bmN0aW9uID0gVHNBZGRCYVByb2Nlc3M7Ci0KLQkJaW5pdF90aW1lcigmcFR4VFMtPlR4UGVuZGluZ0JBUmVjb3JkLlRpbWVyKTsKLQkJcFR4VFMtPlR4UGVuZGluZ0JBUmVjb3JkLlRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVHhUUzsKLQkJcFR4VFMtPlR4UGVuZGluZ0JBUmVjb3JkLlRpbWVyLmZ1bmN0aW9uID0gQmFTZXR1cFRpbWVPdXQ7Ci0KLQkJaW5pdF90aW1lcigmcFR4VFMtPlR4QWRtaXR0ZWRCQVJlY29yZC5UaW1lcik7Ci0JCXBUeFRTLT5UeEFkbWl0dGVkQkFSZWNvcmQuVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBUeFRTOwotCQlwVHhUUy0+VHhBZG1pdHRlZEJBUmVjb3JkLlRpbWVyLmZ1bmN0aW9uID0gVHhCYUluYWN0VGltZW91dDsKLQotCQlSZXNldFR4VHNFbnRyeShwVHhUUyk7Ci0JCWxpc3RfYWRkX3RhaWwoJnBUeFRTLT5Uc0NvbW1vbkluZm8uTGlzdCwgJmllZWUtPlR4X1RTX1VudXNlZF9MaXN0KTsKLQkJcFR4VFMrKzsKLQl9Ci0KLQkvLyBJbml0aWFsaXplIFJ4IFRTIHJlbGF0ZWQgaW5mby4KLQlJTklUX0xJU1RfSEVBRCgmaWVlZS0+UnhfVFNfQWRtaXRfTGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmllZWUtPlJ4X1RTX1BlbmRpbmdfTGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmllZWUtPlJ4X1RTX1VudXNlZF9MaXN0KTsKLQlmb3IoY291bnQgPSAwOyBjb3VudCA8IFRPVEFMX1RTX05VTTsgY291bnQrKykKLQl7Ci0JCXBSeFRTLT5udW0gPSBjb3VudDsKLQkJSU5JVF9MSVNUX0hFQUQoJnBSeFRTLT5SeFBlbmRpbmdQa3RMaXN0KTsKLQotCQlpbml0X3RpbWVyKCZwUnhUUy0+VHNDb21tb25JbmZvLlNldHVwVGltZXIpOwotCQlwUnhUUy0+VHNDb21tb25JbmZvLlNldHVwVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBSeFRTOwotCQlwUnhUUy0+VHNDb21tb25JbmZvLlNldHVwVGltZXIuZnVuY3Rpb24gPSBUc1NldHVwVGltZU91dDsKLQotCQlpbml0X3RpbWVyKCZwUnhUUy0+VHNDb21tb25JbmZvLkluYWN0VGltZXIpOwotCQlwUnhUUy0+VHNDb21tb25JbmZvLkluYWN0VGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBSeFRTOwotCQlwUnhUUy0+VHNDb21tb25JbmZvLkluYWN0VGltZXIuZnVuY3Rpb24gPSBUc0luYWN0VGltZW91dDsKLQotCQlpbml0X3RpbWVyKCZwUnhUUy0+UnhBZG1pdHRlZEJBUmVjb3JkLlRpbWVyKTsKLQkJcFJ4VFMtPlJ4QWRtaXR0ZWRCQVJlY29yZC5UaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFJ4VFM7Ci0JCXBSeFRTLT5SeEFkbWl0dGVkQkFSZWNvcmQuVGltZXIuZnVuY3Rpb24gPSBSeEJhSW5hY3RUaW1lb3V0OwotCi0JCWluaXRfdGltZXIoJnBSeFRTLT5SeFBrdFBlbmRpbmdUaW1lcik7Ci0JCXBSeFRTLT5SeFBrdFBlbmRpbmdUaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFJ4VFM7Ci0JCXBSeFRTLT5SeFBrdFBlbmRpbmdUaW1lci5mdW5jdGlvbiA9IFJ4UGt0UGVuZGluZ1RpbWVvdXQ7Ci0KLQkJUmVzZXRSeFRzRW50cnkocFJ4VFMpOwotCQlsaXN0X2FkZF90YWlsKCZwUnhUUy0+VHNDb21tb25JbmZvLkxpc3QsICZpZWVlLT5SeF9UU19VbnVzZWRfTGlzdCk7Ci0JCXBSeFRTKys7Ci0JfQotCS8vIEluaXRpYWxpemUgdW51c2VkIFJ4IFJlb3JkZXIgTGlzdC4KLQlJTklUX0xJU1RfSEVBRCgmaWVlZS0+UnhSZW9yZGVyX1VudXNlZF9MaXN0KTsKLS8vI2lmZGVmIFRPX0RPX0xJU1QKLQlmb3IoY291bnQgPSAwOyBjb3VudCA8IFJFT1JERVJfRU5UUllfTlVNOyBjb3VudCsrKQotCXsKLQkJbGlzdF9hZGRfdGFpbCggJnBSeFJlb3JkZXJFbnRyeS0+TGlzdCwmaWVlZS0+UnhSZW9yZGVyX1VudXNlZF9MaXN0KTsKLQkJaWYoY291bnQgPT0gKFJFT1JERVJfRU5UUllfTlVNLTEpKQotCQkJYnJlYWs7Ci0JCXBSeFJlb3JkZXJFbnRyeSA9ICZpZWVlLT5SeFJlb3JkZXJFbnRyeVtjb3VudCsxXTsKLQl9Ci0vLyNlbmRpZgotCi19Ci0KLXZvaWQgQWRtaXRUUyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgUFRTX0NPTU1PTl9JTkZPIHBUc0NvbW1vbkluZm8sIHUzMiBJbmFjdFRpbWUpCi17Ci0JZGVsX3RpbWVyX3N5bmMoJnBUc0NvbW1vbkluZm8tPlNldHVwVGltZXIpOwotCWRlbF90aW1lcl9zeW5jKCZwVHNDb21tb25JbmZvLT5JbmFjdFRpbWVyKTsKLQotCWlmKEluYWN0VGltZSE9MCkKLQkJbW9kX3RpbWVyKCZwVHNDb21tb25JbmZvLT5JbmFjdFRpbWVyLCBqaWZmaWVzICsgTVNFQ1MoSW5hY3RUaW1lKSk7Ci19Ci0KLQotUFRTX0NPTU1PTl9JTkZPIFNlYXJjaEFkbWl0VFJTdHJlYW0oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHU4KglBZGRyLCB1OCBUSUQsIFRSX1NFTEVDVAlUeFJ4U2VsZWN0KQotewotCS8vRElSRUNUSU9OX1ZBTFVFIAlkaXI7Ci0JdTggCWRpcjsKLQlib29sCQkJCXNlYXJjaF9kaXJbNF0gPSB7MCwgMCwgMCwgMH07Ci0Jc3RydWN0IGxpc3RfaGVhZCoJCXBzZWFyY2hfbGlzdDsgLy9GSVhNRQotCVBUU19DT01NT05fSU5GTwlwUmV0ID0gTlVMTDsKLQlpZihpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSAvL2FwIG1vZGUKLQl7Ci0JCWlmKFR4UnhTZWxlY3QgPT0gVFhfRElSKQotCQl7Ci0JCQlzZWFyY2hfZGlyW0RJUl9ET1dOXSA9IHRydWU7Ci0JCQlzZWFyY2hfZGlyW0RJUl9CSV9ESVJdPSB0cnVlOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJc2VhcmNoX2RpcltESVJfVVBdIAk9IHRydWU7Ci0JCQlzZWFyY2hfZGlyW0RJUl9CSV9ESVJdPSB0cnVlOwotCQl9Ci0JfQotCWVsc2UgaWYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQotCXsKLQkJaWYoVHhSeFNlbGVjdCA9PSBUWF9ESVIpCi0JCQlzZWFyY2hfZGlyW0RJUl9VUF0gCT0gdHJ1ZTsKLQkJZWxzZQotCQkJc2VhcmNoX2RpcltESVJfRE9XTl0gPSB0cnVlOwotCX0KLQllbHNlCi0JewotCQlpZihUeFJ4U2VsZWN0ID09IFRYX0RJUikKLQkJewotCQkJc2VhcmNoX2RpcltESVJfVVBdIAk9IHRydWU7Ci0JCQlzZWFyY2hfZGlyW0RJUl9CSV9ESVJdPSB0cnVlOwotCQkJc2VhcmNoX2RpcltESVJfRElSRUNUXT0gdHJ1ZTsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXNlYXJjaF9kaXJbRElSX0RPV05dID0gdHJ1ZTsKLQkJCXNlYXJjaF9kaXJbRElSX0JJX0RJUl09IHRydWU7Ci0JCQlzZWFyY2hfZGlyW0RJUl9ESVJFQ1RdPSB0cnVlOwotCQl9Ci0JfQotCi0JaWYoVHhSeFNlbGVjdCA9PSBUWF9ESVIpCi0JCXBzZWFyY2hfbGlzdCA9ICZpZWVlLT5UeF9UU19BZG1pdF9MaXN0OwotCWVsc2UKLQkJcHNlYXJjaF9saXN0ID0gJmllZWUtPlJ4X1RTX0FkbWl0X0xpc3Q7Ci0KLQkvL2ZvcihkaXIgPSBESVJfVVA7IGRpciA8PSBESVJfQklfRElSOyBkaXIrKykKLQlmb3IoZGlyID0gMDsgZGlyIDw9IERJUl9CSV9ESVI7IGRpcisrKQotCXsKLQkJaWYoc2VhcmNoX2RpcltkaXJdID09ZmFsc2UgKQotCQkJY29udGludWU7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkocFJldCwgcHNlYXJjaF9saXN0LCBMaXN0KXsKLQkvLwkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9UUywgIkFERDolcE0sIFRJRDolZCwgZGlyOiVkXG4iLCBwUmV0LT5BZGRyLCBwUmV0LT5UU3BlYy5mLlRTSW5mby5maWVsZC51Y1RTSUQsIHBSZXQtPlRTcGVjLmYuVFNJbmZvLmZpZWxkLnVjRGlyZWN0aW9uKTsKLQkJCWlmIChtZW1jbXAocFJldC0+QWRkciwgQWRkciwgNikgPT0gMCkKLQkJCQlpZiAocFJldC0+VFNwZWMuZi5UU0luZm8uZmllbGQudWNUU0lEID09IFRJRCkKLQkJCQkJaWYocFJldC0+VFNwZWMuZi5UU0luZm8uZmllbGQudWNEaXJlY3Rpb24gPT0gZGlyKQotCQkJCQl7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCi0JCX0KLQkJaWYoJnBSZXQtPkxpc3QgICE9IHBzZWFyY2hfbGlzdCkKLQkJCWJyZWFrOwotCX0KLQotCWlmKCZwUmV0LT5MaXN0ICAhPSBwc2VhcmNoX2xpc3QpewotCQlyZXR1cm4gcFJldCA7Ci0JfQotCWVsc2UKLQkJcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgTWFrZVRTRW50cnkoCi0JCVBUU19DT01NT05fSU5GTwlwVHNDb21tb25JbmZvLAotCQl1OCoJCUFkZHIsCi0JCVBUU1BFQ19CT0RZCXBUU1BFQywKLQkJUFFPU19UQ0xBUwlwVENMQVMsCi0JCXU4CQlUQ0xBU19OdW0sCi0JCXU4CQlUQ0xBU19Qcm9jCi0JKQotewotCXU4CWNvdW50OwotCi0JaWYocFRzQ29tbW9uSW5mbyA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQltZW1jcHkocFRzQ29tbW9uSW5mby0+QWRkciwgQWRkciwgNik7Ci0KLQlpZihwVFNQRUMgIT0gTlVMTCkKLQkJbWVtY3B5KCh1OCopKCYocFRzQ29tbW9uSW5mby0+VFNwZWMpKSwgKHU4KilwVFNQRUMsIHNpemVvZihUU1BFQ19CT0RZKSk7Ci0KLQlmb3IoY291bnQgPSAwOyBjb3VudCA8IFRDTEFTX051bTsgY291bnQrKykKLQkJbWVtY3B5KCh1OCopKCYocFRzQ29tbW9uSW5mby0+VENsYXNzW2NvdW50XSkpLCAodTgqKXBUQ0xBUywgc2l6ZW9mKFFPU19UQ0xBUykpOwotCi0JcFRzQ29tbW9uSW5mby0+VENsYXNQcm9jID0gVENMQVNfUHJvYzsKLQlwVHNDb21tb25JbmZvLT5UQ2xhc051bSA9IFRDTEFTX051bTsKLX0KLQotCi1ib29sIEdldFRzKAotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKglpZWVlLAotCVBUU19DT01NT05fSU5GTwkJCSpwcFRTLAotCXU4KgkJCQlBZGRyLAotCXU4CQkJCVRJRCwKLQlUUl9TRUxFQ1QJCQlUeFJ4U2VsZWN0LCAgLy9SeDoxLCBUeDowCi0JYm9vbAkJCQliQWRkTmV3VHMKLQkpCi17Ci0JdTgJVVAgPSAwOwotCS8vCi0JLy8gV2UgZG8gbm90IGJ1aWxkIGFueSBUUyBmb3IgQnJvYWRjYXN0IG9yIE11bHRpY2FzdCBzdHJlYW0uCi0JLy8gU28gcmVqZWN0IHRoZXNlIGtpbmRzIG9mIHNlYXJjaCBoZXJlLgotCS8vCi0JaWYoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoQWRkcikgfHwgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoQWRkcikpCi0JewotCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImdldCBUUyBmb3IgQnJvYWRjYXN0IG9yIE11bHRpY2FzdFxuIik7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnN1cHBvcnRlZCA9PSAwKQotCQlVUCA9IDA7Ci0JZWxzZQotCXsKLQkJLy8gSW4gV01NIGNhc2U6IHdlIHVzZSA0IFRJRCBvbmx5Ci0JCWlmICghSXNBQ1ZhbGlkKFRJRCkpCi0JCXsKLQkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiIGluICVzKCksIFRJRCglZCkgaXMgbm90IHZhbGlkXG4iLCBfX0ZVTkNUSU9OX18sIFRJRCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlzd2l0Y2goVElEKQotCQl7Ci0JCWNhc2UgMDoKLQkJY2FzZSAzOgotCQkJVVAgPSAwOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAxOgotCQljYXNlIDI6Ci0JCQlVUCA9IDI7Ci0JCQlicmVhazsKLQotCQljYXNlIDQ6Ci0JCWNhc2UgNToKLQkJCVVQID0gNTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgNjoKLQkJY2FzZSA3OgotCQkJVVAgPSA3OwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkqcHBUUyA9IFNlYXJjaEFkbWl0VFJTdHJlYW0oCi0JCQlpZWVlLAotCQkJQWRkciwKLQkJCVVQLAotCQkJVHhSeFNlbGVjdCk7Ci0JaWYoKnBwVFMgIT0gTlVMTCkKLQl7Ci0JCXJldHVybiB0cnVlOwotCX0KLQllbHNlCi0JewotCQlpZihiQWRkTmV3VHMgPT0gZmFsc2UpCi0JCXsKLQkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfVFMsICJhZGQgbmV3IFRTIGZhaWxlZCh0aWQ6JWQpXG4iLCBVUCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvLwotCQkJLy8gQ3JlYXRlIGEgbmV3IFRyYWZmaWMgc3RyZWFtIGZvciBjdXJyZW50IFR4L1J4Ci0JCQkvLyBUaGlzIGlzIGZvciBFRENBIGFuZCBXTU0gdG8gYWRkIGEgbmV3IFRTLgotCQkJLy8gRm9yIEhDQ0Egb3IgV01NU0EsIFRTIGNhbm5vdCBiZSBhZGRtaXQgd2l0aG91dCBuZWdvdGlhdGlvbi4KLQkJCS8vCi0JCQlUU1BFQ19CT0RZCVRTcGVjOwotCQkJUFFPU19UU0lORk8JCXBUU0luZm8gPSAmVFNwZWMuZi5UU0luZm87Ci0JCQlzdHJ1Y3QgbGlzdF9oZWFkKglwVW51c2VkTGlzdCA9Ci0JCQkJCQkJCShUeFJ4U2VsZWN0ID09IFRYX0RJUik/Ci0JCQkJCQkJCSgmaWVlZS0+VHhfVFNfVW51c2VkX0xpc3QpOgotCQkJCQkJCQkoJmllZWUtPlJ4X1RTX1VudXNlZF9MaXN0KTsKLQotCQkJc3RydWN0IGxpc3RfaGVhZCoJcEFkZG1pdExpc3QgPQotCQkJCQkJCQkoVHhSeFNlbGVjdCA9PSBUWF9ESVIpPwotCQkJCQkJCQkoJmllZWUtPlR4X1RTX0FkbWl0X0xpc3QpOgotCQkJCQkJCQkoJmllZWUtPlJ4X1RTX0FkbWl0X0xpc3QpOwotCi0JCQlESVJFQ1RJT05fVkFMVUUJCURpciA9CQkoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUik/Ci0JCQkJCQkJCSgoVHhSeFNlbGVjdD09VFhfRElSKT9ESVJfRE9XTjpESVJfVVApOgotCQkJCQkJCQkoKFR4UnhTZWxlY3Q9PVRYX0RJUik/RElSX1VQOkRJUl9ET1dOKTsKLQkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfVFMsICJ0byBhZGQgVHNcbiIpOwotCQkJaWYoIWxpc3RfZW1wdHkocFVudXNlZExpc3QpKQotCQkJewotCQkJCSgqcHBUUykgPSBsaXN0X2VudHJ5KHBVbnVzZWRMaXN0LT5uZXh0LCBUU19DT01NT05fSU5GTywgTGlzdCk7Ci0JCQkJbGlzdF9kZWxfaW5pdCgmKCpwcFRTKS0+TGlzdCk7Ci0JCQkJaWYoVHhSeFNlbGVjdD09VFhfRElSKQotCQkJCXsKLQkJCQkJUFRYX1RTX1JFQ09SRCB0bXAgPSBjb250YWluZXJfb2YoKnBwVFMsIFRYX1RTX1JFQ09SRCwgVHNDb21tb25JbmZvKTsKLQkJCQkJUmVzZXRUeFRzRW50cnkodG1wKTsKLQkJCQl9Ci0JCQkJZWxzZXsKLQkJCQkJUFJYX1RTX1JFQ09SRCB0bXAgPSBjb250YWluZXJfb2YoKnBwVFMsIFJYX1RTX1JFQ09SRCwgVHNDb21tb25JbmZvKTsKLQkJCQkJUmVzZXRSeFRzRW50cnkodG1wKTsKLQkJCQl9Ci0KLQkJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1RTLCAidG8gaW5pdCBjdXJyZW50IFRTLCBVUDolZCwgRGlyOiVkLCBhZGRyOiVwTVxuIiwgVVAsIERpciwgQWRkcik7Ci0JCQkJLy8gUHJlcGFyZSBUUyBJbmZvIHJlbGVhdGVkIGZpZWxkCi0JCQkJcFRTSW5mby0+ZmllbGQudWNUcmFmZmljVHlwZSA9IDA7CQkJLy8gVHJhZmZpYyB0eXBlOiBXTU0gaXMgcmVzZXJ2ZWQgaW4gdGhpcyBmaWVsZAotCQkJCXBUU0luZm8tPmZpZWxkLnVjVFNJRCA9IFVQOwkJCS8vIFRTSUQKLQkJCQlwVFNJbmZvLT5maWVsZC51Y0RpcmVjdGlvbiA9IERpcjsJCQkvLyBEaXJlY3Rpb246IGlmIHRoZXJlIGlzIERpcmVjdExpbmssIHRoaXMgbmVlZCBhZGRpdGlvbmFsIGNvbnNpZGVyYXRpb24uCi0JCQkJcFRTSW5mby0+ZmllbGQudWNBY2Nlc3NQb2xpY3kgPSAxOwkJLy8gQWNjZXNzIHBvbGljeQotCQkJCXBUU0luZm8tPmZpZWxkLnVjQWdncmVnYXRpb24gPSAwOyAJCS8vIEFnZ3JlZ2F0aW9uCi0JCQkJcFRTSW5mby0+ZmllbGQudWNQU0IgPSAwOyAJCQkJLy8gQWdncmVnYXRpb24KLQkJCQlwVFNJbmZvLT5maWVsZC51Y1VQID0gVVA7CQkJCS8vIFVzZXIgcHJpb3JpdHkKLQkJCQlwVFNJbmZvLT5maWVsZC51Y1RTSW5mb0Fja1BvbGljeSA9IDA7CQkvLyBBY2sgcG9saWN5Ci0JCQkJcFRTSW5mby0+ZmllbGQudWNTY2hlZHVsZSA9IDA7CQkJLy8gU2NoZWR1bGUKLQotCQkJCU1ha2VUU0VudHJ5KCpwcFRTLCBBZGRyLCAmVFNwZWMsIE5VTEwsIDAsIDApOwotCQkJCUFkbWl0VFMoaWVlZSwgKnBwVFMsIDApOwotCQkJCWxpc3RfYWRkX3RhaWwoJigoKnBwVFMpLT5MaXN0KSwgcEFkZG1pdExpc3QpOwotCQkJCS8vIGlmIHRoZXJlIGlzIERpcmVjdExpbmssIHdlIG5lZWQgdG8gZG8gYWRkaXRpb25hbCBvcGVyYXRpb24gaGVyZSEhCi0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX0VSUiwgImluIGZ1bmN0aW9uICVzKCkgVGhlcmUgaXMgbm90IGVub3VnaCBUUyByZWNvcmQgdG8gYmUgdXNlZCEhIiwgX19GVU5DVElPTl9fKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgUmVtb3ZlVHNFbnRyeSgKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSoJaWVlZSwKLQlQVFNfQ09NTU9OX0lORk8JCQlwVHMsCi0JVFJfU0VMRUNUCQkJVHhSeFNlbGVjdAotCSkKLXsKLQkvL3UzMiBmbGFncyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7Ci0JZGVsX3RpbWVyX3N5bmMoJnBUcy0+U2V0dXBUaW1lcik7Ci0JZGVsX3RpbWVyX3N5bmMoJnBUcy0+SW5hY3RUaW1lcik7Ci0JVHNJbml0RGVsQkEoaWVlZSwgcFRzLCBUeFJ4U2VsZWN0KTsKLQotCWlmKFR4UnhTZWxlY3QgPT0gUlhfRElSKQotCXsKLS8vI2lmZGVmIFRPX0RPX0xJU1QKLQkJUFJYX1JFT1JERVJfRU5UUlkJcFJ4UmVvcmRlckVudHJ5OwotCQlQUlhfVFNfUkVDT1JEIAkJcFJ4VFMgPSAoUFJYX1RTX1JFQ09SRClwVHM7Ci0JCWlmKHRpbWVyX3BlbmRpbmcoJnBSeFRTLT5SeFBrdFBlbmRpbmdUaW1lcikpCi0JCQlkZWxfdGltZXJfc3luYygmcFJ4VFMtPlJ4UGt0UGVuZGluZ1RpbWVyKTsKLQotICAgICAgICAgICAgICAgIHdoaWxlKCFsaXN0X2VtcHR5KCZwUnhUUy0+UnhQZW5kaW5nUGt0TGlzdCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vICAgICAgUGxhdGZvcm1BY3F1aXJlU3BpbkxvY2soQWRhcHRlciwgUlRfUlhfU1BJTkxPQ0spOwotICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJihpZWVlLT5yZW9yZGVyX3NwaW5sb2NrKSwgZmxhZ3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9wUnhSZW9yZGVyRW50cnkgPSBsaXN0X2VudHJ5KCZwUnhUUy0+UnhQZW5kaW5nUGt0TGlzdC5wcmV2LFJYX1JFT1JERVJfRU5UUlksTGlzdCk7Ci0JCQlwUnhSZW9yZGVyRW50cnkgPSAoUFJYX1JFT1JERVJfRU5UUlkpbGlzdF9lbnRyeShwUnhUUy0+UnhQZW5kaW5nUGt0TGlzdC5wcmV2LFJYX1JFT1JERVJfRU5UUlksTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsaXN0X2RlbF9pbml0KCZwUnhSZW9yZGVyRW50cnktPkxpc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhiICogcHJ4YiA9IHBSeFJlb3JkZXJFbnRyeS0+cHJ4YjsKLQkJCQlpZiAodW5saWtlbHkoIXByeGIpKQotCQkJCXsKLQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGllZWUtPnJlb3JkZXJfc3BpbmxvY2spLCBmbGFncyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpID0wOyBpIDwgcHJ4Yi0+bnJfc3ViZnJhbWVzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiKHByeGItPnN1YmZyYW1lc1tpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2ZyZWUocHJ4Yik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByeGIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9hZGRfdGFpbCgmcFJ4UmVvcmRlckVudHJ5LT5MaXN0LCZpZWVlLT5SeFJlb3JkZXJfVW51c2VkX0xpc3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9QbGF0Zm9ybVJlbGVhc2VTcGluTG9jayhBZGFwdGVyLCBSVF9SWF9TUElOTE9DSyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaWVlZS0+cmVvcmRlcl9zcGlubG9jayksIGZsYWdzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLS8vI2VuZGlmCi0JfQotCWVsc2UKLQl7Ci0JCVBUWF9UU19SRUNPUkQgcFR4VFMgPSAoUFRYX1RTX1JFQ09SRClwVHM7Ci0JCWRlbF90aW1lcl9zeW5jKCZwVHhUUy0+VHNBZGRCYVRpbWVyKTsKLQl9Ci19Ci0KLXZvaWQgUmVtb3ZlUGVlclRTKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCB1OCogQWRkcikKLXsKLQlQVFNfQ09NTU9OX0lORk8JcFRTLCBwVG1wVFM7Ci0KLQlwcmludGsoIj09PT09PT09PT09PlJlbW92ZVBlZXJUUywlcE1cbiIsIEFkZHIpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwVFMsIHBUbXBUUywgJmllZWUtPlR4X1RTX1BlbmRpbmdfTGlzdCwgTGlzdCkKLQl7Ci0JCWlmIChtZW1jbXAocFRTLT5BZGRyLCBBZGRyLCA2KSA9PSAwKQotCQl7Ci0JCQlSZW1vdmVUc0VudHJ5KGllZWUsIHBUUywgVFhfRElSKTsKLQkJCWxpc3RfZGVsX2luaXQoJnBUUy0+TGlzdCk7Ci0JCQlsaXN0X2FkZF90YWlsKCZwVFMtPkxpc3QsICZpZWVlLT5UeF9UU19VbnVzZWRfTGlzdCk7Ci0JCX0KLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocFRTLCBwVG1wVFMsICZpZWVlLT5UeF9UU19BZG1pdF9MaXN0LCBMaXN0KQotCXsKLQkJaWYgKG1lbWNtcChwVFMtPkFkZHIsIEFkZHIsIDYpID09IDApCi0JCXsKLQkJCXByaW50aygiPT09PT5yZW1vdmUgVHhfVFNfYWRtaW5fbGlzdFxuIik7Ci0JCQlSZW1vdmVUc0VudHJ5KGllZWUsIHBUUywgVFhfRElSKTsKLQkJCWxpc3RfZGVsX2luaXQoJnBUUy0+TGlzdCk7Ci0JCQlsaXN0X2FkZF90YWlsKCZwVFMtPkxpc3QsICZpZWVlLT5UeF9UU19VbnVzZWRfTGlzdCk7Ci0JCX0KLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocFRTLCBwVG1wVFMsICZpZWVlLT5SeF9UU19QZW5kaW5nX0xpc3QsIExpc3QpCi0JewotCQlpZiAobWVtY21wKHBUUy0+QWRkciwgQWRkciwgNikgPT0gMCkKLQkJewotCQkJUmVtb3ZlVHNFbnRyeShpZWVlLCBwVFMsIFJYX0RJUik7Ci0JCQlsaXN0X2RlbF9pbml0KCZwVFMtPkxpc3QpOwotCQkJbGlzdF9hZGRfdGFpbCgmcFRTLT5MaXN0LCAmaWVlZS0+UnhfVFNfVW51c2VkX0xpc3QpOwotCQl9Ci0JfQotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBUUywgcFRtcFRTLCAmaWVlZS0+UnhfVFNfQWRtaXRfTGlzdCwgTGlzdCkKLQl7Ci0JCWlmIChtZW1jbXAocFRTLT5BZGRyLCBBZGRyLCA2KSA9PSAwKQotCQl7Ci0JCQlSZW1vdmVUc0VudHJ5KGllZWUsIHBUUywgUlhfRElSKTsKLQkJCWxpc3RfZGVsX2luaXQoJnBUUy0+TGlzdCk7Ci0JCQlsaXN0X2FkZF90YWlsKCZwVFMtPkxpc3QsICZpZWVlLT5SeF9UU19VbnVzZWRfTGlzdCk7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgUmVtb3ZlQWxsVFMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpCi17Ci0JUFRTX0NPTU1PTl9JTkZPIHBUUywgcFRtcFRTOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBUUywgcFRtcFRTLCAmaWVlZS0+VHhfVFNfUGVuZGluZ19MaXN0LCBMaXN0KQotCXsKLQkJUmVtb3ZlVHNFbnRyeShpZWVlLCBwVFMsIFRYX0RJUik7Ci0JCWxpc3RfZGVsX2luaXQoJnBUUy0+TGlzdCk7Ci0JCWxpc3RfYWRkX3RhaWwoJnBUUy0+TGlzdCwgJmllZWUtPlR4X1RTX1VudXNlZF9MaXN0KTsKLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocFRTLCBwVG1wVFMsICZpZWVlLT5UeF9UU19BZG1pdF9MaXN0LCBMaXN0KQotCXsKLQkJUmVtb3ZlVHNFbnRyeShpZWVlLCBwVFMsIFRYX0RJUik7Ci0JCWxpc3RfZGVsX2luaXQoJnBUUy0+TGlzdCk7Ci0JCWxpc3RfYWRkX3RhaWwoJnBUUy0+TGlzdCwgJmllZWUtPlR4X1RTX1VudXNlZF9MaXN0KTsKLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocFRTLCBwVG1wVFMsICZpZWVlLT5SeF9UU19QZW5kaW5nX0xpc3QsIExpc3QpCi0JewotCQlSZW1vdmVUc0VudHJ5KGllZWUsIHBUUywgUlhfRElSKTsKLQkJbGlzdF9kZWxfaW5pdCgmcFRTLT5MaXN0KTsKLQkJbGlzdF9hZGRfdGFpbCgmcFRTLT5MaXN0LCAmaWVlZS0+UnhfVFNfVW51c2VkX0xpc3QpOwotCX0KLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwVFMsIHBUbXBUUywgJmllZWUtPlJ4X1RTX0FkbWl0X0xpc3QsIExpc3QpCi0JewotCQlSZW1vdmVUc0VudHJ5KGllZWUsIHBUUywgUlhfRElSKTsKLQkJbGlzdF9kZWxfaW5pdCgmcFRTLT5MaXN0KTsKLQkJbGlzdF9hZGRfdGFpbCgmcFRTLT5MaXN0LCAmaWVlZS0+UnhfVFNfVW51c2VkX0xpc3QpOwotCX0KLX0KLQotdm9pZCBUc1N0YXJ0QWRkQmFQcm9jZXNzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlLCBQVFhfVFNfUkVDT1JECXBUeFRTKQotewotCWlmKHBUeFRTLT5iQWRkQmFSZXFJblByb2dyZXNzID09IGZhbHNlKQotCXsKLQkJcFR4VFMtPmJBZGRCYVJlcUluUHJvZ3Jlc3MgPSB0cnVlOwotCQlpZihwVHhUUy0+YkFkZEJhUmVxRGVsYXllZCkKLQkJewotCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9CQSwgIlRzU3RhcnRBZGRCYVByb2Nlc3MoKTogRGVsYXllZCBTdGFydCBBRERCQSBhZnRlciA2MCBzZWMhIVxuIik7Ci0JCQltb2RfdGltZXIoJnBUeFRTLT5Uc0FkZEJhVGltZXIsIGppZmZpZXMgKyBNU0VDUyhUU19BRERCQV9ERUxBWSkpOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9CQSwiVHNTdGFydEFkZEJhUHJvY2VzcygpOiBJbW1lZGlhdGVseSBTdGFydCBBRERCQSBub3chIVxuIik7Ci0JCQltb2RfdGltZXIoJnBUeFRTLT5Uc0FkZEJhVGltZXIsIGppZmZpZXMrMTApOyAvL3NldCAxMCB0aWNrcwotCQl9Ci0JfQotCWVsc2UKLQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9FUlIsICIlcygpPT0+QkEgdGltZXIgaXMgYWxyZWFkeSBhZGRlZFxuIiwgX19GVU5DVElPTl9fKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9saWNlbnNlIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2xpY2Vuc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlYTlmYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9saWNlbnNlCkBAIC0wLDAgKzEsMzM5IEBACisKKyJUaGlzIHNvZnR3YXJlIHByb2dyYW0gaXMgbGljZW5zZWQgc3ViamVjdCB0byB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyhHUEwpLiBWZXJzaW9uIDIsIEp1bmUgMTk5MSwgYXZhaWxhYmxlIGF0Cis8aHR0cDoKKworR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKworVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworQ29weXJpZ2h0IChDKSAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EKKworRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoaXMgbGljZW5zZQorZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworUHJlYW1ibGUKKworVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91ciBmcmVlZG9tIHRvCitzaGFyZSBhbmQgY2hhbmdlIGl0LiBCeSBjb250cmFzdCwgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGludGVuZGVkCit0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvIHNoYXJlIGFuZCBjaGFuZ2UgZnJlZSBzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlCit0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFwcGxpZXMKK3RvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbidzIHNvZnR3YXJlIGFuZCB0byBhbnkgb3RoZXIgcHJvZ3JhbQord2hvc2UgYXV0aG9ycyBjb21taXQgdG8gdXNpbmcgaXQuIChTb21lIG90aGVyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorc29mdHdhcmUgaXMgY292ZXJlZCBieSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnN0ZWFkLikgWW91CitjYW4gYXBwbHkgaXQgdG8geW91ciBwcm9ncmFtcywgdG9vLgorCitXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90IHByaWNlLiBPdXIKK0dlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUgZnJlZWRvbQordG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IgdGhpcyBzZXJ2aWNlIGlmIHlvdQord2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdCBpZiB5b3Ugd2FudCBpdCwgdGhhdCB5b3UKK2NhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQgaW4gbmV3IGZyZWUgcHJvZ3JhbXM7IGFuZCB0aGF0Cit5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBtYWtlIHJlc3RyaWN0aW9ucyB0aGF0IGZvcmJpZCBhbnlvbmUgdG8KK2RlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLiBUaGVzZQorcmVzdHJpY3Rpb25zIHRyYW5zbGF0ZSB0byBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgZm9yIHlvdSBpZiB5b3UgZGlzdHJpYnV0ZQorY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYgeW91IG1vZGlmeSBpdC4KKworRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlciBncmF0aXMgb3IKK2ZvciBhIGZlZSwgeW91IG11c3QgZ2l2ZSB0aGUgcmVjaXBpZW50cyBhbGwgdGhlIHJpZ2h0cyB0aGF0IHlvdSBoYXZlLiBZb3UKK211c3QgbWFrZSBzdXJlIHRoYXQgdGhleSwgdG9vLCByZWNlaXZlIG9yIGNhbiBnZXQgdGhlIHNvdXJjZSBjb2RlLiBBbmQgeW91CittdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLgorCitXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kICgyKQorb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LCBkaXN0cmlidXRlCithbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworQWxzbywgZm9yIGVhY2ggYXV0aG9yJ3MgcHJvdGVjdGlvbiBhbmQgb3Vycywgd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4gdGhhdAorZXZlcnlvbmUgdW5kZXJzdGFuZHMgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlIHNvZnR3YXJlLiBJZgordGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZSB3YW50IGl0cworcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28gdGhhdCBhbnkKK3Byb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsIGF1dGhvcnMnCityZXB1dGF0aW9ucy4KKworRmluYWxseSwgYW55IGZyZWUgcHJvZ3JhbSBpcyB0aHJlYXRlbmVkIGNvbnN0YW50bHkgYnkgc29mdHdhcmUgcGF0ZW50cy4gV2UKK3dpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZSBwcm9ncmFtIHdpbGwKK2luZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZSBwcm9ncmFtCitwcm9wcmlldGFyeS4gVG8gcHJldmVudCB0aGlzLCB3ZSBoYXZlIG1hZGUgaXQgY2xlYXIgdGhhdCBhbnkgcGF0ZW50IG11c3QgYmUKK2xpY2Vuc2VkIGZvciBldmVyeW9uZSdzIGZyZWUgdXNlIG9yIG5vdCBsaWNlbnNlZCBhdCBhbGwuCisKK1RoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbgorZm9sbG93LgorCitURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQ09QWUlORywgRElTVFJJQlVUSU9OIEFORCBNT0RJRklDQVRJT04KKworMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucyBhIG5vdGljZQorICAgcGxhY2VkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVyIHNheWluZyBpdCBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlCisgICB0ZXJtcyBvZiB0aGlzIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuIFRoZSAiUHJvZ3JhbSIsIGJlbG93LCByZWZlcnMgdG8gYW55CisgICBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iIG1lYW5zIGVpdGhlciB0aGUKKyAgIFByb2dyYW0gb3IgYW55IGRlcml2YXRpdmUgd29yayB1bmRlciBjb3B5cmlnaHQgbGF3OiB0aGF0IGlzIHRvIHNheSwgYQorICAgd29yayBjb250YWluaW5nIHRoZSBQcm9ncmFtIG9yIGEgcG9ydGlvbiBvZiBpdCwgZWl0aGVyIHZlcmJhdGltIG9yIHdpdGgKKyAgIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyIGxhbmd1YWdlLiAoSGVyZWluYWZ0ZXIsCisgICB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4gdGhlIHRlcm0gIm1vZGlmaWNhdGlvbiIuKQorICAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuCisKKyAgIEFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90CisgICBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZTsgdGhleSBhcmUgb3V0c2lkZSBpdHMgc2NvcGUuIFRoZSBhY3Qgb2YgcnVubmluZworICAgdGhlIFByb2dyYW0gaXMgbm90IHJlc3RyaWN0ZWQsIGFuZCB0aGUgb3V0cHV0IGZyb20gdGhlIFByb2dyYW0gaXMgY292ZXJlZAorICAgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0gKGluZGVwZW5kZW50CisgICBvZiBoYXZpbmcgYmVlbiBtYWRlIGJ5IHJ1bm5pbmcgdGhlIFByb2dyYW0pLiBXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzCisgICBvbiB3aGF0IHRoZSBQcm9ncmFtIGRvZXMuCisKKzEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncyBzb3VyY2UgY29kZQorICAgYXMgeW91IHJlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91IGNvbnNwaWN1b3VzbHkgYW5kCisgICBhcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2UgYW5kCisgICBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0byB0aGlzCisgICBMaWNlbnNlIGFuZCB0byB0aGUgYWJzZW5jZSBvZiBhbnkgd2FycmFudHk7IGFuZCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzCisgICBvZiB0aGUgUHJvZ3JhbSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggdGhlIFByb2dyYW0uCisKKyAgIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZCB5b3UKKyAgIG1heSBhdCB5b3VyIG9wdGlvbiBvZmZlciB3YXJyYW50eSBwcm90ZWN0aW9uIGluIGV4Y2hhbmdlIGZvciBhIGZlZS4KKworMi4gWW91IG1heSBtb2RpZnkgeW91ciBjb3B5IG9yIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbiBvZiBpdCwKKyAgIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZCBkaXN0cmlidXRlIHN1Y2gKKyAgIG1vZGlmaWNhdGlvbnMgb3Igd29yayB1bmRlciB0aGUgdGVybXMgb2YgU2VjdGlvbiAxIGFib3ZlLCBwcm92aWRlZCB0aGF0CisgICB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAqIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nCisgICAgICAgIHRoYXQgeW91IGNoYW5nZWQgdGhlIGZpbGVzIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLgorCisgICAqIGIpIFlvdSBtdXN0IGNhdXNlIGFueSB3b3JrIHRoYXQgeW91IGRpc3RyaWJ1dGUgb3IgcHVibGlzaCwgdGhhdCBpbgorICAgICAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkgcGFydAorICAgICAgICB0aGVyZW9mLCB0byBiZSBsaWNlbnNlZCBhcyBhIHdob2xlIGF0IG5vIGNoYXJnZSB0byBhbGwgdGhpcmQgcGFydGllcworICAgICAgICB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLgorCisgICAqIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkgd2hlbgorICAgICAgICBydW4sIHlvdSBtdXN0IGNhdXNlIGl0LCB3aGVuIHN0YXJ0ZWQgcnVubmluZyBmb3Igc3VjaCBpbnRlcmFjdGl2ZQorICAgICAgICB1c2UgaW4gdGhlIG1vc3Qgb3JkaW5hcnkgd2F5LCB0byBwcmludCBvciBkaXNwbGF5IGFuIGFubm91bmNlbWVudAorICAgICAgICBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYSBub3RpY2UgdGhhdCB0aGVyZSBpcworICAgICAgICBubyB3YXJyYW50eSAob3IgZWxzZSwgc2F5aW5nIHRoYXQgeW91IHByb3ZpZGUgYSB3YXJyYW50eSkgYW5kIHRoYXQKKyAgICAgICAgdXNlcnMgbWF5IHJlZGlzdHJpYnV0ZSB0aGUgcHJvZ3JhbSB1bmRlciB0aGVzZSBjb25kaXRpb25zLCBhbmQKKyAgICAgICAgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAoRXhjZXB0aW9uOiBpZgorICAgICAgICB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0IGRvZXMgbm90IG5vcm1hbGx5IHByaW50IHN1Y2gKKyAgICAgICAgYW4gYW5ub3VuY2VtZW50LCB5b3VyIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0gaXMgbm90IHJlcXVpcmVkIHRvCisgICAgICAgIHByaW50IGFuIGFubm91bmNlbWVudC4pCisKKyAgIFRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiBJZiBpZGVudGlmaWFibGUKKyAgIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwgYW5kIGNhbiBiZQorICAgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbiB0aGVtc2VsdmVzLCB0aGVuCisgICB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZSBzZWN0aW9ucyB3aGVuIHlvdQorICAgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiBCdXQgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGUgc2FtZQorICAgc2VjdGlvbnMgYXMgcGFydCBvZiBhIHdob2xlIHdoaWNoIGlzIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSwgdGhlCisgICBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwgd2hvc2UKKyAgIHBlcm1pc3Npb25zIGZvciBvdGhlciBsaWNlbnNlZXMgZXh0ZW5kIHRvIHRoZSBlbnRpcmUgd2hvbGUsIGFuZCB0aHVzIHRvCisgICBlYWNoIGFuZCBldmVyeSBwYXJ0IHJlZ2FyZGxlc3Mgb2Ygd2hvIHdyb3RlIGl0LgorCisgICBUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKKyAgIHlvdXIgcmlnaHRzIHRvIHdvcmsgd3JpdHRlbiBlbnRpcmVseSBieSB5b3U7IHJhdGhlciwgdGhlIGludGVudCBpcyB0bworICAgZXhlcmNpc2UgdGhlIHJpZ2h0IHRvIGNvbnRyb2wgdGhlIGRpc3RyaWJ1dGlvbiBvZiBkZXJpdmF0aXZlIG9yCisgICBjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCisgICBJbiBhZGRpdGlvbiwgbWVyZSBhZ2dyZWdhdGlvbiBvZiBhbm90aGVyIHdvcmsgbm90IGJhc2VkIG9uIHRoZSBQcm9ncmFtCisgICB3aXRoIHRoZSBQcm9ncmFtIChvciB3aXRoIGEgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSkgb24gYSB2b2x1bWUgb2YgYQorICAgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyIHRoZQorICAgc2NvcGUgb2YgdGhpcyBMaWNlbnNlLgorCiszLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwgdW5kZXIKKyAgIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucworICAgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAqIGEpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBjb21wbGV0ZSBjb3JyZXNwb25kaW5nIG1hY2hpbmUtcmVhZGFibGUgc291cmNlCisgICAgICAgIGNvZGUsIHdoaWNoIG11c3QgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIKKyAgICAgICAgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAqIGIpIEFjY29tcGFueSBpdCB3aXRoIGEgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlIHllYXJzLAorICAgICAgICB0byBnaXZlIGFueSB0aGlyZCBwYXJ0eSwgZm9yIGEgY2hhcmdlIG5vIG1vcmUgdGhhbiB5b3VyIGNvc3Qgb2YKKyAgICAgICAgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUgbWFjaGluZS0KKyAgICAgICAgcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUgZGlzdHJpYnV0ZWQKKyAgICAgICAgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkKKyAgICAgICAgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAqIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyIHRvCisgICAgICAgIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gKFRoaXMgYWx0ZXJuYXRpdmUgaXMgYWxsb3dlZAorICAgICAgICBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UgcmVjZWl2ZWQgdGhlCisgICAgICAgIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaCBhbiBvZmZlciwgaW4KKyAgICAgICAgYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworICAgVGhlIHNvdXJjZSBjb2RlIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrIGZvcgorICAgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuIEZvciBhbiBleGVjdXRhYmxlIHdvcmssIGNvbXBsZXRlIHNvdXJjZSBjb2RlCisgICBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKKyAgIGFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHBsdXMgdGhlIHNjcmlwdHMgdXNlZCB0byBjb250cm9sCisgICBjb21waWxhdGlvbiBhbmQgaW5zdGFsbGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlLiBIb3dldmVyLCBhcyBhIHNwZWNpYWwKKyAgIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcworICAgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0pIHdpdGggdGhlIG1ham9yCisgICBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uIHdoaWNoCisgICB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzIHRoZQorICAgZXhlY3V0YWJsZS4KKworICAgSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZyBhY2Nlc3MKKyAgIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weQorICAgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc291cmNlCisgICBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QgY29tcGVsbGVkIHRvIGNvcHkgdGhlIHNvdXJjZQorICAgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisKKzQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBleGNlcHQgYXMKKyAgIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuIEFueSBhdHRlbXB0IG90aGVyd2lzZSB0byBjb3B5LAorICAgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMgdm9pZCwgYW5kIHdpbGwKKyAgIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZS4gSG93ZXZlciwgcGFydGllcworICAgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzLCBvciByaWdodHMsIGZyb20geW91IHVuZGVyIHRoaXMgTGljZW5zZSB3aWxsIG5vdAorICAgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbiBmdWxsCisgICBjb21wbGlhbmNlLgorCis1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3Qgc2lnbmVkCisgICBpdC4gSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IgZGlzdHJpYnV0ZQorICAgdGhlIFByb2dyYW0gb3IgaXRzIGRlcml2YXRpdmUgd29ya3MuIFRoZXNlIGFjdGlvbnMgYXJlIHByb2hpYml0ZWQgYnkgbGF3CisgICBpZiB5b3UgZG8gbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuIFRoZXJlZm9yZSwgYnkgbW9kaWZ5aW5nIG9yCisgICBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSwgeW91CisgICBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQgYWxsIGl0cyB0ZXJtcyBhbmQKKyAgIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcgdGhlIFByb2dyYW0gb3Igd29ya3MKKyAgIGJhc2VkIG9uIGl0LgorCis2LiBFYWNoIHRpbWUgeW91IHJlZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYW55IHdvcmsgYmFzZWQgb24gdGhlCisgICBQcm9ncmFtKSwgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5IHJlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZQorICAgb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bworICAgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlciByZXN0cmljdGlvbnMKKyAgIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLiBZb3UgYXJlIG5vdAorICAgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8gdGhpcyBMaWNlbnNlLgorCis3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CisgICBpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorICAgY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorICAgb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorICAgZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gSWYgeW91IGNhbm5vdCBkaXN0cmlidXRlCisgICBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBMaWNlbnNlIGFuZAorICAgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdSBtYXkgbm90CisgICBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGF0IGFsbC4gRm9yIGV4YW1wbGUsIGlmIGEgcGF0ZW50IGxpY2Vuc2Ugd291bGQKKyAgIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5IGFsbCB0aG9zZSB3aG8KKyAgIHJlY2VpdmUgY29waWVzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgdGhyb3VnaCB5b3UsIHRoZW4gdGhlIG9ubHkgd2F5IHlvdQorICAgY291bGQgc2F0aXNmeSBib3RoIGl0IGFuZCB0aGlzIExpY2Vuc2Ugd291bGQgYmUgdG8gcmVmcmFpbiBlbnRpcmVseSBmcm9tCisgICBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKKyAgIElmIGFueSBwb3J0aW9uIG9mIHRoaXMgc2VjdGlvbiBpcyBoZWxkIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhbnkKKyAgIHBhcnRpY3VsYXIgY2lyY3Vtc3RhbmNlLCB0aGUgYmFsYW5jZSBvZiB0aGUgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBhcHBseQorICAgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIgY2lyY3Vtc3RhbmNlcy4KKworICAgSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorICAgcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKKyAgIHN1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKKyAgIGludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcyBpbXBsZW1lbnRlZAorICAgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiBNYW55IHBlb3BsZSBoYXZlIG1hZGUgZ2VuZXJvdXMgY29udHJpYnV0aW9ucworICAgdG8gdGhlIHdpZGUgcmFuZ2Ugb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgdGhyb3VnaCB0aGF0IHN5c3RlbSBpbgorICAgcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0IHN5c3RlbTsgaXQgaXMgdXAgdG8gdGhlCisgICBhdXRob3IvZG9ub3IgdG8gZGVjaWRlIGlmIGhlIG9yIHNoZSBpcyB3aWxsaW5nIHRvIGRpc3RyaWJ1dGUgc29mdHdhcmUKKyAgIHRocm91Z2ggYW55IG90aGVyIHN5c3RlbSBhbmQgYSBsaWNlbnNlZSBjYW5ub3QgaW1wb3NlIHRoYXQgY2hvaWNlLgorCisgICBUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8gYmUKKyAgIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHJlc3Qgb2YgdGhpcyBMaWNlbnNlLgorCis4LiBJZiB0aGUgZGlzdHJpYnV0aW9uIGFuZC9vciB1c2Ugb2YgdGhlIFByb2dyYW0gaXMgcmVzdHJpY3RlZCBpbiBjZXJ0YWluCisgICBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlIG9yaWdpbmFsCisgICBjb3B5cmlnaHQgaG9sZGVyIHdobyBwbGFjZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBMaWNlbnNlIG1heSBhZGQgYW4KKyAgIGV4cGxpY2l0IGdlb2dyYXBoaWNhbCBkaXN0cmlidXRpb24gbGltaXRhdGlvbiBleGNsdWRpbmcgdGhvc2UgY291bnRyaWVzLAorICAgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzIG5vdCB0aHVzCisgICBleGNsdWRlZC4gSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzIHRoZSBsaW1pdGF0aW9uIGFzIGlmCisgICB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YKKyAgIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsIGJlCisgICBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KKyAgIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCisgICBFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gSWYgdGhlIFByb2dyYW0KKyAgIHNwZWNpZmllcyBhIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgTGljZW5zZSB3aGljaCBhcHBsaWVzIHRvIGl0IGFuZCAiYW55CisgICBsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZAorICAgY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCB2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24KKyAgIG51bWJlciBvZiB0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisxMC4gSWYgeW91IHdpc2ggdG8gaW5jb3Jwb3JhdGUgcGFydHMgb2YgdGhlIFByb2dyYW0gaW50byBvdGhlciBmcmVlIHByb2dyYW1zCisgICAgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvciB0byBhc2sKKyAgICBmb3IgcGVybWlzc2lvbi4gRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgd2Ugc29tZXRpbWVzIG1ha2UKKyAgICBleGNlcHRpb25zIGZvciB0aGlzLiBPdXIgZGVjaXNpb24gd2lsbCBiZSBndWlkZWQgYnkgdGhlIHR3byBnb2FscyBvZgorICAgIHByZXNlcnZpbmcgdGhlIGZyZWUgc3RhdHVzIG9mIGFsbCBkZXJpdmF0aXZlcyBvZiBvdXIgZnJlZSBzb2Z0d2FyZSBhbmQKKyAgICBvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworICAgTk8gV0FSUkFOVFkKKworMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCisgICAgRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWSBBUFBMSUNBQkxFIExBVy4gRVhDRVBUIFdIRU4KKyAgICBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTCisgICAgUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVJVEhFUgorICAgIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAgICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFRIRQorICAgIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTSBJUyBXSVRICisgICAgWU9VLiBTSE9VTEQgVEhFIFBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GIEFMTAorICAgIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCisgICAgV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNQVkgTU9ESUZZIEFORC9PUgorICAgIFJFRElTVFJJQlVURSBUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SCisgICAgREFNQUdFUywgSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwKKyAgICBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTQorICAgIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YgREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVECisgICAgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRgorICAgIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgUFJPR1JBTVMpLCBFVkVOIElGIFNVQ0ggSE9MREVSIE9SCisgICAgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCitFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKK0lmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQgZnJlZQorc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCitUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gSXQgaXMgc2FmZXN0IHRvCithdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5IGNvbnZleSB0aGUKK2V4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdCB0aGUgImNvcHlyaWdodCIKK2xpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKK29uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhbiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4KK0NvcHlyaWdodCAoQykgeXl5eSAgbmFtZSBvZiBhdXRob3IKKworVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKK3VuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCithbnkgbGF0ZXIgdmVyc2lvbi4KKworVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCitBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKK21vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAordGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CitUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMgd2hlbgoraXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKK0dub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciBuYW1lIG9mIGF1dGhvciBHbm9tb3Zpc2lvbiBjb21lcword2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlICdzaG93IHcnLiAgVGhpcyBpcyBmcmVlCitzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOwordHlwZSAnc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyAnc2hvdyB3JyBhbmQgJ3Nob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gT2YgY291cnNlLCB0aGUgY29tbWFuZHMgeW91IHVzZSBtYXkgYmUKK2NhbGxlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiAnc2hvdyB3JyBhbmQgJ3Nob3cgYyc7IHRoZXkgY291bGQgZXZlbiBiZQorbW91c2UtY2xpY2tzIG9yIG1lbnUgaXRlbXMtLXdoYXRldmVyIHN1aXRzIHlvdXIgcHJvZ3JhbS4KKworWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKK3NjaG9vbCwgaWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmCituZWNlc3NhcnkuIEhlcmUgaXMgYSBzYW1wbGU7IGFsdGVyIHRoZSBuYW1lczoKKworWW95b2R5bmUsIEluYy4sIGhlcmVieSBkaXNjbGFpbXMgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGUgcHJvZ3JhbQorJ0dub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKK3NpZ25hdHVyZSBvZiBUeSBDb29uLCAxIEFwcmlsIDE5ODkKK1R5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91IG1heQorY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGggdGhlCitsaWJyYXJ5LiBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKK0xpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxODBfOTNjeDYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE4MF85M2N4Ni5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWQ0ZjU2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE4MF85M2N4Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qCi0gICBUaGlzIGZpbGVzIGNvbnRhaW5zIGNhcmQgZWVwcm9tICg5M2M0NiBvciA5M2M1NikgcHJvZ3JhbW1pbmcgcm91dGluZXMsCi0gICBtZW1vcnkgaXMgYWRkcmVzc2VkIGJ5IDE2IGJpdHMgd29yZHMuCi0KLSAgIFRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyLgotICAgQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+Ci0gICBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQotCi0gICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZQotICAgb2ZmaWNpYWwgcmVhbHRlayBkcml2ZXIuCi0KLSAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24KLSAgIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbi4KLQotICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyLgotCi0gICBXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHRob3NlIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIKLSAgIHByb2plY3QgQXV0aG9ycy4KLSovCi0KLSNpbmNsdWRlICJyODE4MF85M2N4Ni5oIgotCi1zdGF0aWMgdm9pZCBlcHJvbV9jcyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgc2hvcnQgYml0KQotewotCWlmIChiaXQpCi0JCXdyaXRlX25pY19ieXRlKHByaXYsIEVQUk9NX0NNRCwKLQkJCSAgICAgICAoMTw8RVBST01fQ1NfU0hJRlQpIHwKLQkJCSAgICAgICByZWFkX25pY19ieXRlKHByaXYsIEVQUk9NX0NNRCkpOyAvL2VuYWJsZSBFUFJPTQotCWVsc2UKLQkJd3JpdGVfbmljX2J5dGUocHJpdiwgRVBST01fQ01ELCByZWFkX25pY19ieXRlKHByaXYsIEVQUk9NX0NNRCkKLQkJCSAgICAgICAmfigxPDxFUFJPTV9DU19TSElGVCkpOyAvL2Rpc2FibGUgRVBST00KLQotCXVkZWxheShFUFJPTV9ERUxBWSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgZXByb21fY2tfY3ljbGUoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0Jd3JpdGVfbmljX2J5dGUocHJpdiwgRVBST01fQ01ELAotCQkgICAgICAgKDE8PEVQUk9NX0NLX1NISUZUKSB8IHJlYWRfbmljX2J5dGUocHJpdiwgRVBST01fQ01EKSk7Ci0JdWRlbGF5KEVQUk9NX0RFTEFZKTsKLQl3cml0ZV9uaWNfYnl0ZShwcml2LCBFUFJPTV9DTUQsCi0JCSAgICAgICByZWFkX25pY19ieXRlKHByaXYsIEVQUk9NX0NNRCkgJiB+KDE8PEVQUk9NX0NLX1NISUZUKSk7Ci0JdWRlbGF5KEVQUk9NX0RFTEFZKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBlcHJvbV93KHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCBzaG9ydCBiaXQpCi17Ci0JaWYgKGJpdCkKLQkJd3JpdGVfbmljX2J5dGUocHJpdiwgRVBST01fQ01ELCAoMTw8RVBST01fV19TSElGVCkgfAotCQkJICAgICAgIHJlYWRfbmljX2J5dGUocHJpdiwgRVBST01fQ01EKSk7Ci0JZWxzZQotCQl3cml0ZV9uaWNfYnl0ZShwcml2LCBFUFJPTV9DTUQsIHJlYWRfbmljX2J5dGUocHJpdiwgRVBST01fQ01EKQotCQkJICAgICAgICZ+KDE8PEVQUk9NX1dfU0hJRlQpKTsKLQotCXVkZWxheShFUFJPTV9ERUxBWSk7Ci19Ci0KLQotc3RhdGljIHNob3J0IGVwcm9tX3Ioc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0Jc2hvcnQgYml0OwotCi0JYml0ID0gKHJlYWRfbmljX2J5dGUocHJpdiwgRVBST01fQ01EKSAmICgxPDxFUFJPTV9SX1NISUZUKSk7Ci0JdWRlbGF5KEVQUk9NX0RFTEFZKTsKLQotCWlmIChiaXQpCi0JCXJldHVybiAxOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyB2b2lkIGVwcm9tX3NlbmRfYml0c19zdHJpbmcoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHNob3J0IGJbXSwgaW50IGxlbikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQllcHJvbV93KHByaXYsIGJbaV0pOwotCQllcHJvbV9ja19jeWNsZShwcml2KTsKLQl9Ci19Ci0KLQotdTMyIGVwcm9tX3JlYWQoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHUzMiBhZGRyKQotewotCXNob3J0IHJlYWRfY21kW10gPSB7MSwgMSwgMH07Ci0Jc2hvcnQgYWRkcl9zdHJbOF07Ci0JaW50IGk7Ci0JaW50IGFkZHJfbGVuOwotCXUzMiByZXQ7Ci0KLQlyZXQgPSAwOwotICAgICAgICAvL2VuYWJsZSBFUFJPTSBwcm9ncmFtbWluZwotCXdyaXRlX25pY19ieXRlKHByaXYsIEVQUk9NX0NNRCwKLQkJICAgICAgIChFUFJPTV9DTURfUFJPR1JBTTw8RVBST01fQ01EX09QRVJBVElOR19NT0RFX1NISUZUKSk7Ci0JdWRlbGF5KEVQUk9NX0RFTEFZKTsKLQotCWlmIChwcml2LT5lcHJvbXR5cGUgPT0gRVBST01fOTNjNTYpIHsKLQkJYWRkcl9zdHJbN10gPSBhZGRyICYgMTsKLQkJYWRkcl9zdHJbNl0gPSBhZGRyICYgKDE8PDEpOwotCQlhZGRyX3N0cls1XSA9IGFkZHIgJiAoMTw8Mik7Ci0JCWFkZHJfc3RyWzRdID0gYWRkciAmICgxPDwzKTsKLQkJYWRkcl9zdHJbM10gPSBhZGRyICYgKDE8PDQpOwotCQlhZGRyX3N0clsyXSA9IGFkZHIgJiAoMTw8NSk7Ci0JCWFkZHJfc3RyWzFdID0gYWRkciAmICgxPDw2KTsKLQkJYWRkcl9zdHJbMF0gPSBhZGRyICYgKDE8PDcpOwotCQlhZGRyX2xlbiA9IDg7Ci0JfSBlbHNlIHsKLQkJYWRkcl9zdHJbNV0gPSBhZGRyICYgMTsKLQkJYWRkcl9zdHJbNF0gPSBhZGRyICYgKDE8PDEpOwotCQlhZGRyX3N0clszXSA9IGFkZHIgJiAoMTw8Mik7Ci0JCWFkZHJfc3RyWzJdID0gYWRkciAmICgxPDwzKTsKLQkJYWRkcl9zdHJbMV0gPSBhZGRyICYgKDE8PDQpOwotCQlhZGRyX3N0clswXSA9IGFkZHIgJiAoMTw8NSk7Ci0JCWFkZHJfbGVuID0gNjsKLQl9Ci0JZXByb21fY3MocHJpdiwgMSk7Ci0JZXByb21fY2tfY3ljbGUocHJpdik7Ci0JZXByb21fc2VuZF9iaXRzX3N0cmluZyhwcml2LCByZWFkX2NtZCwgMyk7Ci0JZXByb21fc2VuZF9iaXRzX3N0cmluZyhwcml2LCBhZGRyX3N0ciwgYWRkcl9sZW4pOwotCi0JLy9rZWVwIGNoaXAgcGluIEQgdG8gbG93IHN0YXRlIHdoaWxlIHJlYWRpbmcuCi0JLy9JJ20gdW5zdXJlIGlmIGl0IGlzIG5lY2Vzc2FyeSwgYnV0IGFueXdheSBzaG91bGRuJ3QgaHVydAotCWVwcm9tX3cocHJpdiwgMCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQkvL2VlcHJvbSBuZWVkcyBhIGNsayBjeWNsZSBiZXR3ZWVuIHdyaXRpbmcgb3Bjb2RlJmFkcgotCQkvL2FuZCByZWFkaW5nIGRhdGEuIChlZXByb20gb3V0cyBhIGR1bW15IDApCi0JCWVwcm9tX2NrX2N5Y2xlKHByaXYpOwotCQlyZXQgfD0gKGVwcm9tX3IocHJpdik8PCgxNS1pKSk7Ci0JfQotCi0JZXByb21fY3MocHJpdiwgMCk7Ci0JZXByb21fY2tfY3ljbGUocHJpdik7Ci0KLQkvL2Rpc2FibGUgRVBST00gcHJvZ3JhbW1pbmcKLQl3cml0ZV9uaWNfYnl0ZShwcml2LCBFUFJPTV9DTUQsCi0JCSAgICAgICAoRVBST01fQ01EX05PUk1BTDw8RVBST01fQ01EX09QRVJBVElOR19NT0RFX1NISUZUKSk7Ci0JcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE4MF85M2N4Ni5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTgwXzkzY3g2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZDIwNTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTgwXzkzY3g2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKiByODE4MF85M2N4Ni5oIC0gOTNjNDYgb3IgOTNjNTYgZWVwcm9tIGNhcmQgcHJvZ3JhbW1pbmcgcm91dGluZXMKLSAqCi0gKiBUaGlzIGlzIHBhcnQgb2YgcnRsODE4NyBPcGVuU291cmNlIGRyaXZlcgotICogQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0LTIwMDUgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KLSAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCi0gKiBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0IG9mIHRoZSBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgotICoKLSAqIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24gZnJvbQotICogUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbi4KLSAqCi0gKiBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIKLSAqCi0gKiBXZSB3YW50IHRvIHRoYW5rIHRoZSBhdXRob3JzIG9mIHRoZSBhYm92ZSBtZW50aW9uZWQgcHJvamVjdHMgYW5kIHRvCi0gKiB0aGUgYXV0aG9ycyBvZiB0aGUgTmRpc3dyYXBwZXIgcHJvamVjdC4KLSAqLwotCi0jaW5jbHVkZSAicjgxOTJFLmgiCi0jaW5jbHVkZSAicjgxOTJFX2h3LmgiCi0KLSNkZWZpbmUgRVBST01fREVMQVkgMTAKLQotI2RlZmluZSBFUFJPTV9BTkFQQVJBTV9BRERSTFdPUkQgMHhkCi0jZGVmaW5lIEVQUk9NX0FOQVBBUkFNX0FERFJIV09SRCAweGUKLQotI2RlZmluZSBFUFJPTV9SRkNISVBJRCAweDYKLSNkZWZpbmUgRVBST01fVFhQV19CQVNFIDB4MDUKLSNkZWZpbmUgRVBST01fUkZDSElQSURfUlRMODIyNVUgNQotI2RlZmluZSBFUFJPTV9SRl9QQVJBTSAweDQKLSNkZWZpbmUgRVBST01fQ09ORklHMiAweGMKLQotI2RlZmluZSBFUFJPTV9WRVJTSU9OIDB4MUUKLSNkZWZpbmUgTUFDX0FEUiAweDcKLQotI2RlZmluZSBDSVMgMHgxOAotCi0jZGVmaW5lIEVQUk9NX1RYUFcwIDB4MTYKLSNkZWZpbmUgRVBST01fVFhQVzIgMHgxYgotI2RlZmluZSBFUFJPTV9UWFBXMSAweDNkCi0KLS8qIFJlYWRzIGEgMTYgYml0cyB3b3JkLiAqLwotdTMyIGVwcm9tX3JlYWQoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHUzMiBhZGRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MFBfZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTBQX2RlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YmI3MWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTBQX2RlZi5oCkBAIC0wLDAgKzEsNDEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNpZm5kZWYgUjgxOTBQX0RFRl9ICisjZGVmaW5lIFI4MTkwUF9ERUZfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZQkJTUFYX1NJTEVOVF9SRVNFVF9SWF9TTE9UX05VTQkxMAorCisjZGVmaW5lIFJYX01QRFVfUVVFVUUJCQkJMAorI2RlZmluZSBSWF9DTURfUVVFVUUJCQkJMQorCisKK2VudW0gcnRsODE5eF9sb29wYmFjayB7CisJUlRMODE5WF9OT19MT09QQkFDSyA9IDAsCisJUlRMODE5WF9NQUNfTE9PUEJBQ0sgPSAxLAorCVJUTDgxOVhfRE1BX0xPT1BCQUNLID0gMiwKKwlSVEw4MTlYX0NDS19MT09QQkFDSyA9IDMsCit9OworCisKKyNkZWZpbmUgUkVTRVRfREVMQVlfODE4NQkJCTIwCisKKyNkZWZpbmUgUlRfSUJTU19JTlRfTUFTS1MgKElNUl9CY25JbnQgfCBJTVJfQmNuSW50IHwgSU1SX1RCRE9LIHwgSU1SX1RCREVSKQorCisjZGVmaW5lIERFU0M5MF9SQVRFMU0JCQkJMHgwMAorI2RlZmluZSBERVNDOTBfUkFURTJNCQkJCTB4MDEKKyNkZWZpbmUgREVTQzkwX1JBVEU1XzVNCQkJCTB4MDIKKyNkZWZpbmUgREVTQzkwX1JBVEUxMU0JCQkJMHgwMworI2RlZmluZSBERVNDOTBfUkFURTZNCQkJCTB4MDQKKyNkZWZpbmUgREVTQzkwX1JBVEU5TQkJCQkweDA1CisjZGVmaW5lIERFU0M5MF9SQVRFMTJNCQkJCTB4MDYKKyNkZWZpbmUgREVTQzkwX1JBVEUxOE0JCQkJMHgwNworI2RlZmluZSBERVNDOTBfUkFURTI0TQkJCQkweDA4CisjZGVmaW5lIERFU0M5MF9SQVRFMzZNCQkJCTB4MDkKKyNkZWZpbmUgREVTQzkwX1JBVEU0OE0JCQkJMHgwYQorI2RlZmluZSBERVNDOTBfUkFURTU0TQkJCQkweDBiCisjZGVmaW5lIERFU0M5MF9SQVRFTUNTMAkJCQkweDAwCisjZGVmaW5lIERFU0M5MF9SQVRFTUNTMQkJCQkweDAxCisjZGVmaW5lIERFU0M5MF9SQVRFTUNTMgkJCQkweDAyCisjZGVmaW5lIERFU0M5MF9SQVRFTUNTMwkJCQkweDAzCisjZGVmaW5lIERFU0M5MF9SQVRFTUNTNAkJCQkweDA0CisjZGVmaW5lIERFU0M5MF9SQVRFTUNTNQkJCQkweDA1CisjZGVmaW5lIERFU0M5MF9SQVRFTUNTNgkJCQkweDA2CisjZGVmaW5lIERFU0M5MF9SQVRFTUNTNwkJCQkweDA3CisjZGVmaW5lIERFU0M5MF9SQVRFTUNTOAkJCQkweDA4CisjZGVmaW5lIERFU0M5MF9SQVRFTUNTOQkJCQkweDA5CisjZGVmaW5lIERFU0M5MF9SQVRFTUNTMTAJCQkweDBhCisjZGVmaW5lIERFU0M5MF9SQVRFTUNTMTEJCQkweDBiCisjZGVmaW5lIERFU0M5MF9SQVRFTUNTMTIJCQkweDBjCisjZGVmaW5lIERFU0M5MF9SQVRFTUNTMTMJCQkweDBkCisjZGVmaW5lIERFU0M5MF9SQVRFTUNTMTQJCQkweDBlCisjZGVmaW5lIERFU0M5MF9SQVRFTUNTMTUJCQkweDBmCisjZGVmaW5lIERFU0M5MF9SQVRFTUNTMzIJCQkweDIwCisKKyNkZWZpbmUgU0hPUlRfU0xPVF9USU1FCQkJCTkKKyNkZWZpbmUgTk9OX1NIT1JUX1NMT1RfVElNRQkJMjAKKworCisjZGVmaW5lCU1BWF9MSU5FU19IV0NPTkZJR19UWFQJCQkxMDAwCisjZGVmaW5lIE1BWF9CWVRFU19MSU5FX0hXQ09ORklHX1RYVAkJMTI4CisKKyNkZWZpbmUgU1dfVEhSRUVfV0lSRQkJCTAKKyNkZWZpbmUgSFdfVEhSRUVfV0lSRQkJCTIKKworI2RlZmluZSBCVF9ERU1PX0JPQVJECQkJMAorI2RlZmluZSBCVF9RQV9CT0FSRAkJCQkxCisjZGVmaW5lIEJUX0ZQR0EJCQkJCTIKKworI2RlZmluZQlSWF9TTU9PVEgJCQkJMjAKKworI2RlZmluZSBRU0xUX0JLCQkJCQkweDEKKyNkZWZpbmUgUVNMVF9CRQkJCQkJMHgwCisjZGVmaW5lIFFTTFRfVkkJCQkJCTB4NAorI2RlZmluZSBRU0xUX1ZPCQkJCQkweDYKKyNkZWZpbmUJUVNMVF9CRUFDT04JCQkweDEwCisjZGVmaW5lCVFTTFRfSElHSAkJCQkweDExCisjZGVmaW5lCVFTTFRfTUdOVAkJCQkweDEyCisjZGVmaW5lCVFTTFRfQ01ECQkJCTB4MTMKKworI2RlZmluZSBOVU1fT0ZfRklSTVdBUkVfUVVFVUUJCQkJMTAKKyNkZWZpbmUgTlVNX09GX1BBR0VTX0lOX0ZXCQkJCQkweDEwMAorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CSwkJMHgwMDcKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQkUJCTB4MGFhCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1ZJCQkweDAyNAorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9WTwkJMHgwMDcKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfSENDQQkJMAorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9DTUQJCTB4MgorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9NR05UCQkweDEwCisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0hJR0gJCTAKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQkNOCQkweDQKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfUFVCCQkweGQKKworI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CS19EVE0JMHgwMjYKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQkVfRFRNCTB4MDQ4CisjZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1ZJX0RUTQkweDA0OAorI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9WT19EVE0JMHgwMjYKKyNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfUFVCX0RUTQkweDAwCisKKyNkZWZpbmUgQVBQTElFRF9SRVNFUlZFRF9RVUVVRV9JTl9GVwkJMHg4MDAwMDAwMAorI2RlZmluZSBSU1ZEX0ZXX1FVRVVFX1BBR0VfQktfU0hJRlQJCTB4MDAKKyNkZWZpbmUgUlNWRF9GV19RVUVVRV9QQUdFX0JFX1NISUZUCQkweDA4CisjZGVmaW5lIFJTVkRfRldfUVVFVUVfUEFHRV9WSV9TSElGVAkJMHgxMAorI2RlZmluZSBSU1ZEX0ZXX1FVRVVFX1BBR0VfVk9fU0hJRlQJCTB4MTgKKyNkZWZpbmUgUlNWRF9GV19RVUVVRV9QQUdFX01HTlRfU0hJRlQJMHgxMAorI2RlZmluZSBSU1ZEX0ZXX1FVRVVFX1BBR0VfQkNOX1NISUZUCQkweDAwCisjZGVmaW5lIFJTVkRfRldfUVVFVUVfUEFHRV9QVUJfU0hJRlQJCTB4MDgKKworI2RlZmluZSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFCTAKKyNkZWZpbmUgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSCQkxCisjZGVmaW5lIEhBTF9QUklNRV9DSE5MX09GRlNFVF9VUFBFUgkJMgorCisKK2VudW0gdmVyc2lvbl84MTkwX2xvb3BiYWNrIHsKKwlWRVJTSU9OXzgxOTBfQkQgPSAweDMsCisJVkVSU0lPTl84MTkwX0JFCit9OworCisjZGVmaW5lIElDX1ZlcnNpb25DdXRfQwkweDIKKyNkZWZpbmUgSUNfVmVyc2lvbkN1dF9ECTB4MworI2RlZmluZSBJQ19WZXJzaW9uQ3V0X0UJMHg0CisKK2VudW0gcmZfb3B0eXBlIHsKKwlSRl9PUF9CeV9TV18zd2lyZSA9IDAsCisJUkZfT1BfQnlfRlcsCisJUkZfT1BfTUFYCit9OworCisKK2VudW0gcG93ZXJfc2F2ZV9tb2RlIHsKKwlQT1dFUl9TQVZFX01PREVfQUNUSVZFLAorCVBPV0VSX1NBVkVfTU9ERV9TQVZFLAorfTsKKworZW51bSBpbnRlcmZhY2Vfc2VsZWN0XzgxOTBwY2kgeworCUlOVEZfU0VMMV9NSU5JQ0FSRAkJPSAwLAorCUlOVEZfU0VMMF9QQ0lFCQkJPSAxLAorCUlOVEZfU0VMMl9SU1YJCQk9IDIsCisJSU5URl9TRUwzX1JTVgkJCT0gMywKK307CisKK3N0cnVjdCBiYl9yZWdfZGVmaW5pdGlvbiB7CisJdTMyIHJmaW50ZnM7CisJdTMyIHJmaW50Zmk7CisJdTMyIHJmaW50Zm87CisJdTMyIHJmaW50ZmU7CisJdTMyIHJmM3dpcmVPZmZzZXQ7CisJdTMyIHJmTFNTSV9TZWxlY3Q7CisJdTMyIHJmVHhHYWluU3RhZ2U7CisJdTMyIHJmSFNTSVBhcmExOworCXUzMiByZkhTU0lQYXJhMjsKKwl1MzIgcmZTd2l0Y2hDb250cm9sOworCXUzMiByZkFHQ0NvbnRyb2wxOworCXUzMiByZkFHQ0NvbnRyb2wyOworCXUzMiByZlJ4SVFJbWJhbGFuY2U7CisJdTMyIHJmUnhBRkU7CisJdTMyIHJmVHhJUUltYmFsYW5jZTsKKwl1MzIgcmZUeEFGRTsKKwl1MzIgcmZMU1NJUmVhZEJhY2s7CisJdTMyIHJmTFNTSVJlYWRCYWNrUGk7Cit9OworCitzdHJ1Y3QgdHhfZndpbmZvIHsKKwl1OAkJCVR4UmF0ZTo3OworCXU4CQkJQ3RzRW5hYmxlOjE7CisJdTgJCQlSdHNSYXRlOjc7CisJdTgJCQlSdHNFbmFibGU6MTsKKwl1OAkJCVR4SFQ6MTsKKwl1OAkJCVNob3J0OjE7CisJdTgJCQlUeEJhbmR3aWR0aDoxOworCXU4CQkJVHhTdWJDYXJyaWVyOjI7CisJdTgJCQlTVEJDOjI7CisJdTgJCQlBbGxvd0FnZ3JlZ2F0aW9uOjE7CisJdTgJCQlSdHNIVDoxOworCXU4CQkJUnRzU2hvcnQ6MTsKKwl1OAkJCVJ0c0JhbmR3aWR0aDoxOworCXU4CQkJUnRzU3ViY2FycmllcjoyOworCXU4CQkJUnRzU1RCQzoyOworCXU4CQkJRW5hYmxlQ1BVRHVyOjE7CisKKwl1MzIJCQlSeE1GOjI7CisJdTMyCQkJUnhBTUQ6MzsKKwl1MzIJCQlSZXNlcnZlZDE6MzsKKwl1MzIJCQlUeEFHQ09mZnNldDo0OworCXUzMgkJCVR4QUdDU2lnbjoxOworCXUzMgkJCVR4X0lORk9fUlNWRDo2OworCXUzMgkJCVBhY2tldElEOjEzOworfTsKKworc3RydWN0IHR4X2Z3aW5mb184MTkwcGNpIHsKKwl1OAkJCVR4UmF0ZTo3OworCXU4CQkJQ3RzRW5hYmxlOjE7CisJdTgJCQlSdHNSYXRlOjc7CisJdTgJCQlSdHNFbmFibGU6MTsKKwl1OAkJCVR4SFQ6MTsKKwl1OAkJCVNob3J0OjE7CisJdTgJCQlUeEJhbmR3aWR0aDoxOworCXU4CQkJVHhTdWJDYXJyaWVyOjI7CisJdTgJCQlTVEJDOjI7CisJdTgJCQlBbGxvd0FnZ3JlZ2F0aW9uOjE7CisJdTgJCQlSdHNIVDoxOworCXU4CQkJUnRzU2hvcnQ6MTsKKwl1OAkJCVJ0c0JhbmR3aWR0aDoxOworCXU4CQkJUnRzU3ViY2FycmllcjoyOworCXU4CQkJUnRzU1RCQzoyOworCXU4CQkJRW5hYmxlQ1BVRHVyOjE7CisKKwl1MzIJCQlSeE1GOjI7CisJdTMyCQkJUnhBTUQ6MzsKKwl1MzIJCQlUeFBlclBrdEluZm9GZWVkYmFjazoxOworCXUzMgkJCVJlc2VydmVkMToyOworCXUzMgkJCVR4QUdDT2Zmc2V0OjQ7CisJdTMyCQkJVHhBR0NTaWduOjE7CisJdTMyCQkJUkFXX1RYRDoxOworCXUzMgkJCVJldHJ5X0xpbWl0OjQ7CisJdTMyCQkJUmVzZXJ2ZWQyOjE7CisJdTMyCQkJUGFja2V0SUQ6MTM7CisKKworfTsKKworCisjZGVmaW5lIFRYX0RFU0NfU0laRQkJCTMyCisKKyNkZWZpbmUgVFhfREVTQ19DTURfU0laRQkzMgorCisKKyNkZWZpbmUgVFhfU1RBVFVTX0RFU0NfU0laRQkzMgorCisjZGVmaW5lIFRYX0ZXSU5GT19TSVpFCTgKKworCisjZGVmaW5lIFJYX0RFU0NfU0laRQkxNgorCisjZGVmaW5lIFJYX1NUQVRVU19ERVNDX1NJWkUJMTYKKworI2RlZmluZSBSWF9EUklWRVJfSU5GT19TSVpFCTgKKworc3RydWN0IGxvZ19pbnRfODE5MCB7CisJdTMyCW5JTVJfQ09NRE9LOworCXUzMgluSU1SX01HTlRET0s7CisJdTMyCW5JTVJfSElHSDsKKwl1MzIJbklNUl9WT0RPSzsKKwl1MzIJbklNUl9WSURPSzsKKwl1MzIJbklNUl9CRURPSzsKKwl1MzIJbklNUl9CS0RPSzsKKwl1MzIJbklNUl9ST0s7CisJdTMyCW5JTVJfUkNPSzsKKwl1MzIJbklNUl9UQkRPSzsKKwl1MzIJbklNUl9CRE9LOworCXUzMgluSU1SX1JYRk9WVzsKK307CisKK3N0cnVjdCBwaHlfb2ZkbV9yeF9zdGF0dXNfcnhzY19zZ2llbl9leGludGZmbGFnIHsKKwl1OAkJCXJlc2VydmVkOjQ7CisJdTgJCQlyeHNjOjI7CisJdTgJCQlzZ2lfZW46MTsKKwl1OAkJCWV4X2ludGZfZmxhZzoxOworfTsKKworc3RydWN0IHBoeV9zdHNfb2ZkbV84MTl4cGNpIHsKKwl1OAl0cnN3X2dhaW5fWFs0XTsKKwl1OAlwd2RiX2FsbDsKKwl1OAljZm9zaG9fWFs0XTsKKwl1OAljZm90YWlsX1hbNF07CisJdTgJcnhldm1fWFsyXTsKKwl1OAlyeHNucl9YWzRdOworCXU4CXBkc25yX1hbMl07CisJdTgJY3NpX2N1cnJlbnRfWFsyXTsKKwl1OAljc2lfdGFyZ2V0X1hbMl07CisJdTgJc2lnZXZtOworCXU4CW1heF9leF9wd3I7CisJdTgJc2dpX2VuOworCXU4CXJ4c2Nfc2dpZW5fZXhmbGc7Cit9OworCitzdHJ1Y3QgcGh5X3N0c19jY2tfODE5eHBjaSB7CisJdTgJYWRjX3B3ZGJfWFs0XTsKKwl1OAlzcV9ycHQ7CisJdTgJY2NrX2FnY19ycHQ7Cit9OworCisKKyNkZWZpbmUJCVBIWV9SU1NJX1NMSURfV0lOX01BWAkJCQkxMDAKKyNkZWZpbmUJCVBIWV9CZWFjb25fUlNTSV9TTElEX1dJTl9NQVgJCTEwCisKK3N0cnVjdCB0eF9kZXNjIHsKKwl1MTYJUGt0U2l6ZTsKKwl1OAlPZmZzZXQ7CisJdTgJUmVzZXJ2ZWQxOjM7CisJdTgJQ21kSW5pdDoxOworCXU4CUxhc3RTZWc6MTsKKwl1OAlGaXJzdFNlZzoxOworCXU4CUxJTklQOjE7CisJdTgJT1dOOjE7CisKKwl1OAlUeEZXSW5mb1NpemU7CisJdTgJUkFUaWQ6MzsKKwl1OAlESVNGQjoxOworCXU4CVVTRVJBVEU6MTsKKwl1OAlNT1JFRlJBRzoxOworCXU4CU5vRW5jOjE7CisJdTgJUElGUzoxOworCXU4CVF1ZXVlU2VsZWN0OjU7CisJdTgJTm9BQ006MTsKKwl1OAlSZXN2OjI7CisJdTgJU2VjQ0FNSUQ6NTsKKwl1OAlTZWNEZXNjQXNzaWduOjE7CisJdTgJU2VjVHlwZToyOworCisJdTE2CVR4QnVmZmVyU2l6ZTsKKwl1OAlQa3RJZDo3OworCXU4CVJlc3YxOjE7CisJdTgJUmVzZXJ2ZWQyOworCisJdTMyCVR4QnVmZkFkZHI7CisKKwl1MzIJTmV4dERlc2NBZGRyZXNzOworCisJdTMyCVJlc2VydmVkNTsKKwl1MzIJUmVzZXJ2ZWQ2OworCXUzMglSZXNlcnZlZDc7Cit9OworCisKK3N0cnVjdCB0eF9kZXNjX2NtZCB7CisJdTE2CVBrdFNpemU7CisJdTgJUmVzZXJ2ZWQxOworCXU4CUNtZFR5cGU6MzsKKwl1OAlDbWRJbml0OjE7CisJdTgJTGFzdFNlZzoxOworCXU4CUZpcnN0U2VnOjE7CisJdTgJTElOSVA6MTsKKwl1OAlPV046MTsKKworCXUxNglFbGVtZW50UmVwb3J0OworCXUxNglSZXNlcnZlZDI7CisKKwl1MTYJVHhCdWZmZXJTaXplOworCXUxNglSZXNlcnZlZDM7CisKKwl1MzIJVHhCdWZmQWRkcjsKKwl1MzIJTmV4dERlc2NBZGRyZXNzOworCXUzMglSZXNlcnZlZDQ7CisJdTMyCVJlc2VydmVkNTsKKwl1MzIJUmVzZXJ2ZWQ2OworfTsKKworc3RydWN0IHJ4X2Rlc2MgeworCXUxNgkJCUxlbmd0aDoxNDsKKwl1MTYJCQlDUkMzMjoxOworCXUxNgkJCUlDVjoxOworCXU4CQkJUnhEcnZJbmZvU2l6ZTsKKwl1OAkJCVNoaWZ0OjI7CisJdTgJCQlQSFlTdGF0dXM6MTsKKwl1OAkJCVNXRGVjOjE7CisJdTgJCQlMYXN0U2VnOjE7CisJdTgJCQlGaXJzdFNlZzoxOworCXU4CQkJRU9SOjE7CisJdTgJCQlPV046MTsKKworCXUzMgkJCVJlc2VydmVkMjsKKworCXUzMgkJCVJlc2VydmVkMzsKKworCXUzMglCdWZmZXJBZGRyZXNzOworCit9OworCisKK3N0cnVjdCByeF9md2luZm8geworCXUxNgkJCVJlc2VydmVkMToxMjsKKwl1MTYJCQlQYXJ0QWdncjoxOworCXUxNgkJCUZpcnN0QUdHUjoxOworCXUxNgkJCVJlc2VydmVkMjoyOworCisJdTgJCQlSeFJhdGU6NzsKKwl1OAkJCVJ4SFQ6MTsKKworCXU4CQkJQlc6MTsKKwl1OAkJCVNQTENQOjE7CisJdTgJCQlSZXNlcnZlZDM6MjsKKwl1OAkJCVBBTToxOworCXU4CQkJTWNhc3Q6MTsKKwl1OAkJCUJjYXN0OjE7CisJdTgJCQlSZXNlcnZlZDQ6MTsKKworCXUzMgkJCVRTRkw7CisKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkwUF9ydGw4MjU2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTBQX3J0bDgyNTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGE1NmM4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkwUF9ydGw4MjU2LmMKQEAgLTAsMCArMSwzMDYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJydGxfY29yZS5oIgorI2luY2x1ZGUgInI4MTkyRV9waHlyZWcuaCIKKyNpbmNsdWRlICJyODE5MkVfcGh5LmgiCisjaW5jbHVkZSAicjgxOTBQX3J0bDgyNTYuaCIKKwordm9pZCBQSFlfU2V0UkY4MjU2QmFuZHdpZHRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgZW51bSBodF9jaGFubmVsX3dpZHRoIEJhbmR3aWR0aCkKK3sKKwl1OAllUkZQYXRoOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCWZvciAoZVJGUGF0aCA9IDA7IGVSRlBhdGggPCBwcml2LT5OdW1Ub3RhbFJGUGF0aDsgZVJGUGF0aCsrKSB7CisJCWlmICghcnRsODE5Ml9waHlfQ2hlY2tJc0xlZ2FsUkZQYXRoKGRldiwgZVJGUGF0aCkpCisJCQkJY29udGludWU7CisKKwkJc3dpdGNoIChCYW5kd2lkdGgpIHsKKwkJY2FzZSBIVF9DSEFOTkVMX1dJRFRIXzIwOgorCQkJaWYgKHByaXYtPmNhcmRfODE5Ml92ZXJzaW9uID09IFZFUlNJT05fODE5MF9CRCB8fAorCQkJICAgIHByaXYtPmNhcmRfODE5Ml92ZXJzaW9uID09IFZFUlNJT05fODE5MF9CRSkgeworCQkJCXJ0bDgxOTJfcGh5X1NldFJGUmVnKGRldiwKKwkJCQkJCShlbnVtIHJmOTBfcmFkaW9fcGF0aCllUkZQYXRoLAorCQkJCQkJMHgwYiwgYk1hc2sxMkJpdHMsIDB4MTAwKTsKKwkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsCisJCQkJCQkoZW51bSByZjkwX3JhZGlvX3BhdGgpZVJGUGF0aCwKKwkJCQkJCTB4MmMsIGJNYXNrMTJCaXRzLCAweDNkNyk7CisJCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LAorCQkJCQkJKGVudW0gcmY5MF9yYWRpb19wYXRoKWVSRlBhdGgsCisJCQkJCQkweDBlLCBiTWFzazEyQml0cywgMHgwMjEpOworCisJCQl9IGVsc2UgeworCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiUEhZX1NldFJGODI1NkJhbmR3aWR0aCgpOiAiCisJCQkJCSAidW5rbm93biBoYXJkd2FyZSB2ZXJzaW9uXG4iKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMF80MDoKKwkJCWlmIChwcml2LT5jYXJkXzgxOTJfdmVyc2lvbiA9PSBWRVJTSU9OXzgxOTBfQkQgfHwKKwkJCSAgICBwcml2LT5jYXJkXzgxOTJfdmVyc2lvbiA9PSBWRVJTSU9OXzgxOTBfQkUpIHsKKwkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsCisJCQkJCQkgKGVudW0gcmY5MF9yYWRpb19wYXRoKWVSRlBhdGgsCisJCQkJCQkgMHgwYiwgYk1hc2sxMkJpdHMsIDB4MzAwKTsKKwkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsCisJCQkJCQkgKGVudW0gcmY5MF9yYWRpb19wYXRoKWVSRlBhdGgsCisJCQkJCQkgMHgyYywgYk1hc2sxMkJpdHMsIDB4M2ZmKTsKKwkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsCisJCQkJCQkgKGVudW0gcmY5MF9yYWRpb19wYXRoKWVSRlBhdGgsCisJCQkJCQkgMHgwZSwgYk1hc2sxMkJpdHMsIDB4MGUxKTsKKworCQkJfSBlbHNlIHsKKwkJCQlSVF9UUkFDRShDT01QX0VSUiwgIlBIWV9TZXRSRjgyNTZCYW5kd2lkdGgoKTogIgorCQkJCQkgInVua25vd24gaGFyZHdhcmUgdmVyc2lvblxuIik7CisJCQl9CisKKworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlSVF9UUkFDRShDT01QX0VSUiwgIlBIWV9TZXRSRjgyNTZCYW5kd2lkdGgoKTogdW5rbm93biAiCisJCQkJICJCYW5kd2lkdGg6ICUjWFxuIiwgQmFuZHdpZHRoKTsKKwkJCWJyZWFrOworCisJCX0KKwl9CisJcmV0dXJuOworfQorCitib29sIFBIWV9SRjgyNTZfQ29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCWJvb2wgcnRTdGF0dXMgPSB0cnVlOworCXByaXYtPk51bVRvdGFsUkZQYXRoID0gUlRMODE5WF9UT1RBTF9SRl9QQVRIOworCXJ0U3RhdHVzID0gcGh5X1JGODI1Nl9Db25maWdfUGFyYUZpbGUoZGV2KTsKKworCXJldHVybiBydFN0YXR1czsKK30KKworYm9vbCBwaHlfUkY4MjU2X0NvbmZpZ19QYXJhRmlsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXUzMgl1NFJlZ1ZhbHVlID0gMDsKKwl1OAllUkZQYXRoOworCWJvb2wgcnRTdGF0dXMgPSB0cnVlOworCXN0cnVjdCBiYl9yZWdfZGVmaW5pdGlvbiAqcFBoeVJlZzsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJdTMyCVJlZ09mZlNldFRvQmVDaGVjayA9IDB4MzsKKwl1MzIJUmVnVmFsdWVUb0JlQ2hlY2sgPSAweDdmMTsKKwl1MzIJUkYzX0ZpbmFsX1ZhbHVlID0gMDsKKwl1OAlDb25zdFJldHJ5VGltZXMgPSA1LCBSZXRyeVRpbWVzID0gNTsKKwl1OCByZXQgPSAwOworCisJZm9yIChlUkZQYXRoID0gKGVudW0gcmY5MF9yYWRpb19wYXRoKVJGOTBfUEFUSF9BOworCSAgICAgZVJGUGF0aCA8IHByaXYtPk51bVRvdGFsUkZQYXRoOyBlUkZQYXRoKyspIHsKKwkJaWYgKCFydGw4MTkyX3BoeV9DaGVja0lzTGVnYWxSRlBhdGgoZGV2LCBlUkZQYXRoKSkKKwkJCQljb250aW51ZTsKKworCQlwUGh5UmVnID0gJnByaXYtPlBIWVJlZ0RlZltlUkZQYXRoXTsKKworCisJCXN3aXRjaCAoZVJGUGF0aCkgeworCQljYXNlIFJGOTBfUEFUSF9BOgorCQljYXNlIFJGOTBfUEFUSF9DOgorCQkJdTRSZWdWYWx1ZSA9IHJ0bDgxOTJfUXVlcnlCQlJlZyhkZXYsIHBQaHlSZWctPnJmaW50ZnMsCisJCQkJCQkJYlJGU0lfUkZFTlYpOworCQkJYnJlYWs7CisJCWNhc2UgUkY5MF9QQVRIX0I6CisJCWNhc2UgUkY5MF9QQVRIX0Q6CisJCQl1NFJlZ1ZhbHVlID0gcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgcFBoeVJlZy0+cmZpbnRmcywKKwkJCQkJCQliUkZTSV9SRkVOVjw8MTYpOworCQkJYnJlYWs7CisJCX0KKworCQlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmZpbnRmZSwgYlJGU0lfUkZFTlY8PDE2LCAweDEpOworCisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBwUGh5UmVnLT5yZmludGZvLCBiUkZTSV9SRkVOViwgMHgxKTsKKworCQlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmZIU1NJUGFyYTIsCisJCQkJIGIzV2lyZUFkZHJlc3NMZW5ndGgsIDB4MCk7CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBwUGh5UmVnLT5yZkhTU0lQYXJhMiwKKwkJCQkgYjNXaXJlRGF0YUxlbmd0aCwgMHgwKTsKKworCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIChlbnVtIHJmOTBfcmFkaW9fcGF0aCkgZVJGUGF0aCwgMHgwLAorCQkJCSAgICAgYk1hc2sxMkJpdHMsIDB4YmYpOworCisJCXJ0U3RhdHVzID0gcnRsODE5Ml9waHlfY2hlY2tCQkFuZFJGKGRldiwgSFc5MF9CTE9DS19SRiwKKwkJCQkJCShlbnVtIHJmOTBfcmFkaW9fcGF0aCllUkZQYXRoKTsKKwkJaWYgKHJ0U3RhdHVzICE9IHRydWUpIHsKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCAiUEhZX1JGODI1Nl9Db25maWcoKTpDaGVjayAiCisJCQkJICJSYWRpb1slZF0gRmFpbCEhXG4iLCBlUkZQYXRoKTsKKwkJCWdvdG8gcGh5X1JGODI1Nl9Db25maWdfUGFyYUZpbGVfRmFpbDsKKwkJfQorCisJCVJldHJ5VGltZXMgPSBDb25zdFJldHJ5VGltZXM7CisJCVJGM19GaW5hbF9WYWx1ZSA9IDA7CisJCXN3aXRjaCAoZVJGUGF0aCkgeworCQljYXNlIFJGOTBfUEFUSF9BOgorCQkJd2hpbGUgKFJGM19GaW5hbF9WYWx1ZSAhPSBSZWdWYWx1ZVRvQmVDaGVjayAmJgorCQkJICAgICAgIFJldHJ5VGltZXMgIT0gMCkgeworCQkJCXJldCA9IHJ0bDgxOTJfcGh5X0NvbmZpZ1JGV2l0aEhlYWRlckZpbGUoZGV2LAorCQkJCQkJKGVudW0gcmY5MF9yYWRpb19wYXRoKWVSRlBhdGgpOworCQkJCVJGM19GaW5hbF9WYWx1ZSA9IHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoZGV2LAorCQkJCQkJIChlbnVtIHJmOTBfcmFkaW9fcGF0aCllUkZQYXRoLAorCQkJCQkJIFJlZ09mZlNldFRvQmVDaGVjaywKKwkJCQkJCSBiTWFzazEyQml0cyk7CisJCQkJUlRfVFJBQ0UoQ09NUF9SRiwgIlJGICVkICVkIHJlZ2lzdGVyIGZpbmFsICIKKwkJCQkJICJ2YWx1ZTogJXhcbiIsIGVSRlBhdGgsCisJCQkJCSBSZWdPZmZTZXRUb0JlQ2hlY2ssIFJGM19GaW5hbF9WYWx1ZSk7CisJCQkJUmV0cnlUaW1lcy0tOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUkY5MF9QQVRIX0I6CisJCQl3aGlsZSAoUkYzX0ZpbmFsX1ZhbHVlICE9IFJlZ1ZhbHVlVG9CZUNoZWNrICYmCisJCQkgICAgICAgUmV0cnlUaW1lcyAhPSAwKSB7CisJCQkJcmV0ID0gcnRsODE5Ml9waHlfQ29uZmlnUkZXaXRoSGVhZGVyRmlsZShkZXYsCisJCQkJCQkoZW51bSByZjkwX3JhZGlvX3BhdGgpZVJGUGF0aCk7CisJCQkJUkYzX0ZpbmFsX1ZhbHVlID0gcnRsODE5Ml9waHlfUXVlcnlSRlJlZyhkZXYsCisJCQkJCQkgKGVudW0gcmY5MF9yYWRpb19wYXRoKWVSRlBhdGgsCisJCQkJCQkgUmVnT2ZmU2V0VG9CZUNoZWNrLAorCQkJCQkJIGJNYXNrMTJCaXRzKTsKKwkJCQlSVF9UUkFDRShDT01QX1JGLCAiUkYgJWQgJWQgcmVnaXN0ZXIgZmluYWwgIgorCQkJCQkgInZhbHVlOiAleFxuIiwgZVJGUGF0aCwKKwkJCQkJICBSZWdPZmZTZXRUb0JlQ2hlY2ssIFJGM19GaW5hbF9WYWx1ZSk7CisJCQkJUmV0cnlUaW1lcy0tOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUkY5MF9QQVRIX0M6CisJCQl3aGlsZSAoUkYzX0ZpbmFsX1ZhbHVlICE9IFJlZ1ZhbHVlVG9CZUNoZWNrICYmCisJCQkgICAgICAgUmV0cnlUaW1lcyAhPSAwKSB7CisJCQkJcmV0ID0gcnRsODE5Ml9waHlfQ29uZmlnUkZXaXRoSGVhZGVyRmlsZShkZXYsCisJCQkJCQkoZW51bSByZjkwX3JhZGlvX3BhdGgpZVJGUGF0aCk7CisJCQkJUkYzX0ZpbmFsX1ZhbHVlID0gcnRsODE5Ml9waHlfUXVlcnlSRlJlZyhkZXYsCisJCQkJCQkoZW51bSByZjkwX3JhZGlvX3BhdGgpZVJGUGF0aCwKKwkJCQkJCVJlZ09mZlNldFRvQmVDaGVjaywKKwkJCQkJCWJNYXNrMTJCaXRzKTsKKwkJCQlSVF9UUkFDRShDT01QX1JGLCAiUkYgJWQgJWQgcmVnaXN0ZXIgZmluYWwgIgorCQkJCQkgInZhbHVlOiAleFxuIiwgZVJGUGF0aCwKKwkJCQkJIFJlZ09mZlNldFRvQmVDaGVjaywgUkYzX0ZpbmFsX1ZhbHVlKTsKKwkJCQlSZXRyeVRpbWVzLS07CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBSRjkwX1BBVEhfRDoKKwkJCXdoaWxlIChSRjNfRmluYWxfVmFsdWUgIT0gUmVnVmFsdWVUb0JlQ2hlY2sgJiYKKwkJCSAgICAgICBSZXRyeVRpbWVzICE9IDApIHsKKwkJCQlyZXQgPSBydGw4MTkyX3BoeV9Db25maWdSRldpdGhIZWFkZXJGaWxlKGRldiwKKwkJCQkJICAgICAgIChlbnVtIHJmOTBfcmFkaW9fcGF0aCllUkZQYXRoKTsKKwkJCQlSRjNfRmluYWxfVmFsdWUgPSBydGw4MTkyX3BoeV9RdWVyeVJGUmVnKGRldiwKKwkJCQkJICAgICAgIChlbnVtIHJmOTBfcmFkaW9fcGF0aCllUkZQYXRoLAorCQkJCQkgICAgICAgUmVnT2ZmU2V0VG9CZUNoZWNrLCBiTWFzazEyQml0cyk7CisJCQkJUlRfVFJBQ0UoQ09NUF9SRiwgIlJGICVkICVkIHJlZ2lzdGVyIGZpbmFsICIKKwkJCQkJICJ2YWx1ZTogJXhcbiIsIGVSRlBhdGgsCisJCQkJCSAgUmVnT2ZmU2V0VG9CZUNoZWNrLCBSRjNfRmluYWxfVmFsdWUpOworCQkJCVJldHJ5VGltZXMtLTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoIChlUkZQYXRoKSB7CisJCWNhc2UgUkY5MF9QQVRIX0E6CisJCWNhc2UgUkY5MF9QQVRIX0M6CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmZpbnRmcywgYlJGU0lfUkZFTlYsCisJCQkJCSB1NFJlZ1ZhbHVlKTsKKwkJCWJyZWFrOworCQljYXNlIFJGOTBfUEFUSF9COgorCQljYXNlIFJGOTBfUEFUSF9EOgorCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmaW50ZnMsIGJSRlNJX1JGRU5WPDwxNiwKKwkJCQkJIHU0UmVnVmFsdWUpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocmV0KSB7CisJCQlSVF9UUkFDRShDT01QX0VSUiwgInBoeV9SRjgyNTZfQ29uZmlnX1BhcmFGaWxlKCk6IgorCQkJCSAiUmFkaW9bJWRdIEZhaWwhISIsIGVSRlBhdGgpOworCQkJZ290byBwaHlfUkY4MjU2X0NvbmZpZ19QYXJhRmlsZV9GYWlsOworCQl9CisKKwl9CisKKwlSVF9UUkFDRShDT01QX1BIWSwgIlBIWSBJbml0aWFsaXphdGlvbiBTdWNjZXNzXG4iKSA7CisJcmV0dXJuIHRydWU7CisKK3BoeV9SRjgyNTZfQ29uZmlnX1BhcmFGaWxlX0ZhaWw6CisJUlRfVFJBQ0UoQ09NUF9FUlIsICJQSFkgSW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKSA7CisJcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFBIWV9TZXRSRjgyNTZDQ0tUeFBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4CXBvd2VybGV2ZWwpCit7CisJdTMyCVR4QUdDID0gMDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisKKwlUeEFHQyA9IHBvd2VybGV2ZWw7CisJaWYgKHByaXYtPmJEeW5hbWljVHhMb3dQb3dlciA9PSB0cnVlKSB7CisJCWlmIChwcml2LT5DdXN0b21lcklEID09IFJUX0NJRF84MTl4X05ldGNvcmUpCisJCQlUeEFHQyA9IDB4MjI7CisJCWVsc2UKKwkJCVR4QUdDICs9IHByaXYtPkNja1B3RW5sOworCX0KKwlpZiAoVHhBR0MgPiAweDI0KQorCQlUeEFHQyA9IDB4MjQ7CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJUeEFHQ19DQ0tfTWNzMzIsIGJUeEFHQ1JhdGVDQ0ssIFR4QUdDKTsKK30KKworCit2b2lkIFBIWV9TZXRSRjgyNTZPRkRNVHhQb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBwb3dlcmxldmVsKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwl1MzIgd3JpdGVWYWwsIHBvd2VyQmFzZTAsIHBvd2VyQmFzZTEsIHdyaXRlVmFsX3RtcDsKKwl1OCBpbmRleCA9IDA7CisJdTE2IFJlZ09mZnNldFs2XSA9IHsweGUwMCwgMHhlMDQsIDB4ZTEwLCAweGUxNCwgMHhlMTgsIDB4ZTFjfTsKKwl1OCBieXRlMCwgYnl0ZTEsIGJ5dGUyLCBieXRlMzsKKworCXBvd2VyQmFzZTAgPSBwb3dlcmxldmVsICsgcHJpdi0+TGVnYWN5SFRUeFBvd2VyRGlmZjsKKwlwb3dlckJhc2UwID0gKHBvd2VyQmFzZTAgPDwgMjQpIHwgKHBvd2VyQmFzZTAgPDwgMTYpIHwKKwkJICAgICAocG93ZXJCYXNlMCA8PCA4KSB8IHBvd2VyQmFzZTA7CisJcG93ZXJCYXNlMSA9IHBvd2VybGV2ZWw7CisJcG93ZXJCYXNlMSA9IChwb3dlckJhc2UxIDw8IDI0KSB8IChwb3dlckJhc2UxIDw8IDE2KSB8CisJCSAgICAgKHBvd2VyQmFzZTEgPDwgOCkgfCBwb3dlckJhc2UxOworCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgNjsgaW5kZXgrKykgeworCQl3cml0ZVZhbCA9ICh1MzIpKHByaXYtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W2luZGV4XSArCisJCQkgICAoKGluZGV4IDwgMikgPyBwb3dlckJhc2UwIDogcG93ZXJCYXNlMSkpOworCQlieXRlMCA9ICh1OCkod3JpdGVWYWwgJiAweDdmKTsKKwkJYnl0ZTEgPSAodTgpKCh3cml0ZVZhbCAmIDB4N2YwMCk+PjgpOworCQlieXRlMiA9ICh1OCkoKHdyaXRlVmFsICYgMHg3ZjAwMDApPj4xNik7CisJCWJ5dGUzID0gKHU4KSgod3JpdGVWYWwgJiAweDdmMDAwMDAwKT4+MjQpOworCQlpZiAoYnl0ZTAgPiAweDI0KQorCQkJYnl0ZTAgPSAweDI0OworCQlpZiAoYnl0ZTEgPiAweDI0KQorCQkJYnl0ZTEgPSAweDI0OworCQlpZiAoYnl0ZTIgPiAweDI0KQorCQkJYnl0ZTIgPSAweDI0OworCQlpZiAoYnl0ZTMgPiAweDI0KQorCQkJYnl0ZTMgPSAweDI0OworCisJCWlmIChpbmRleCA9PSAzKSB7CisJCQl3cml0ZVZhbF90bXAgPSAoYnl0ZTMgPDwgMjQpIHwgKGJ5dGUyIDw8IDE2KSB8CisJCQkJICAgICAgIChieXRlMSA8PCA4KSB8IGJ5dGUwOworCQkJcHJpdi0+UHdyX1RyYWNrID0gd3JpdGVWYWxfdG1wOworCQl9CisKKwkJaWYgKHByaXYtPmJEeW5hbWljVHhIaWdoUG93ZXIgPT0gdHJ1ZSkKKwkJCXdyaXRlVmFsID0gMHgwMzAzMDMwMzsKKwkJZWxzZQorCQkJd3JpdGVWYWwgPSAoYnl0ZTMgPDwgMjQpIHwgKGJ5dGUyIDw8IDE2KSB8CisJCQkJICAgKGJ5dGUxIDw8IDgpIHwgYnl0ZTA7CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBSZWdPZmZzZXRbaW5kZXhdLCAweDdmN2Y3ZjdmLCB3cml0ZVZhbCk7CisJfQorCisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkwUF9ydGw4MjU2LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTBQX3J0bDgyNTYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGU4MzFkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkwUF9ydGw4MjU2LmgKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBSVEw4MjI1SAorI2RlZmluZSBSVEw4MjI1SAorCisjZGVmaW5lIFJUTDgxOVhfVE9UQUxfUkZfUEFUSCAyCitleHRlcm4gdm9pZCBQSFlfU2V0UkY4MjU2QmFuZHdpZHRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgZW51bSBodF9jaGFubmVsX3dpZHRoIEJhbmR3aWR0aCk7CitleHRlcm4gYm9vbCBQSFlfUkY4MjU2X0NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBib29sIHBoeV9SRjgyNTZfQ29uZmlnX1BhcmFGaWxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgUEhZX1NldFJGODI1NkNDS1R4UG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTgJcG93ZXJsZXZlbCk7CitleHRlcm4gdm9pZCBQSFlfU2V0UkY4MjU2T0ZETVR4UG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggcG93ZXJsZXZlbCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkwX3J0bDgyNTYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MF9ydGw4MjU2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NjQ2MmMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkwX3J0bDgyNTYuYworKysgL2Rldi9udWxsCkBAIC0xLDY3NyArMCwwIEBACi0vKgotICBUaGlzIGlzIHBhcnQgb2YgdGhlIHJ0bDgxOTIgZHJpdmVyCi0gIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgKFNlZSBmaWxlIENPUFlJTkcgZm9yIGRldGFpbHMpLgotCi0gIFRoaXMgZmlsZXMgY29udGFpbnMgcHJvZ3JhbW1pbmcgY29kZSBmb3IgdGhlIHJ0bDgyNTYKLSAgcmFkaW8gZnJvbnRlbmQuCi0KLSAgKk1hbnkqIHRoYW5rcyB0byBSZWFsdGVrIENvcnAuIGZvciB0aGVpciBncmVhdCBzdXBwb3J0IQotCi0qLwotCi0jaW5jbHVkZSAicjgxOTJFLmgiCi0jaW5jbHVkZSAicjgxOTJFX2h3LmgiCi0jaW5jbHVkZSAicjgxOXhFX3BoeXJlZy5oIgotI2luY2x1ZGUgInI4MTl4RV9waHkuaCIKLSNpbmNsdWRlICJyODE5MF9ydGw4MjU2LmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIE92ZXJ2aWV3OiAgIAlzZXQgUkYgYmFuZCB3aWR0aCAoMjBNIG9yIDQwTSkKLSAqIElucHV0OiAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSoJZGV2Ci0gKiAJCVdJUkVMRVNTX0JBTkRXSURUSF9FCUJhbmR3aWR0aAkvLzIwTSBvciA0ME0KLSAqIE91dHB1dDogICAgICBOT05FCi0gKiBSZXR1cm46ICAgICAgTk9ORQotICogTm90ZToJODIyNiBzdXBwb3J0IGJvdGggMjBNICBhbmQgNDAgTUh6Ci0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIFBIWV9TZXRSRjgyNTZCYW5kd2lkdGgoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIEhUX0NIQU5ORUxfV0lEVEggQmFuZHdpZHRoKQkvLzIwTSBvciA0ME0KLXsKLQl1OAllUkZQYXRoOwotCi0JLy9mb3IoZVJGUGF0aCA9IFJGOTBfUEFUSF9BOyBlUkZQYXRoIDxwSGFsRGF0YS0+TnVtVG90YWxSRlBhdGg7IGVSRlBhdGgrKykKLQlmb3IoZVJGUGF0aCA9IDA7IGVSRlBhdGggPHByaXYtPk51bVRvdGFsUkZQYXRoOyBlUkZQYXRoKyspCi0JewotCQlpZiAoIXJ0bDgxOTJfcGh5X0NoZWNrSXNMZWdhbFJGUGF0aChwcml2LCBlUkZQYXRoKSkKLQkJCQljb250aW51ZTsKLQotCQlzd2l0Y2goQmFuZHdpZHRoKQotCQl7Ci0JCQljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjA6Ci0JCQkJaWYocHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24gPT0gVkVSU0lPTl84MTkwX0JEIHx8IHByaXYtPmNhcmRfODE5Ml92ZXJzaW9uID09IFZFUlNJT05fODE5MF9CRSkvLyA4MjU2IEQtY3V0LCBFLWN1dCwgeGlvbmc6IGNvbnNpZGVyIGl0IGxhdGVyIQotCQkJCXsKLQkJCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcocHJpdiwgKFJGOTBfUkFESU9fUEFUSF9FKWVSRlBhdGgsIDB4MGIsIGJNYXNrMTJCaXRzLCAweDEwMCk7IC8vcGh5IHBhcmE6MWJhCi0JCQkJCXJ0bDgxOTJfcGh5X1NldFJGUmVnKHByaXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCAweDJjLCBiTWFzazEyQml0cywgMHgzZDcpOwotCQkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhwcml2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgMHgwZSwgYk1hc2sxMkJpdHMsIDB4MDIxKTsKLQotCQkJCQkvL2Nvc2EgYWRkIGZvciBzZDMncyByZXF1ZXN0IDAxLzIzLzIwMDgKLQkJCQkJLy9ydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCAweDE0LCBiTWFzazEyQml0cywgMHg1YWIpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlSVF9UUkFDRShDT01QX0VSUiwgIlBIWV9TZXRSRjgyNTZCYW5kd2lkdGgoKTogdW5rbm93biBoYXJkd2FyZSB2ZXJzaW9uXG4iKTsKLQkJCQl9Ci0KLQkJCQlicmVhazsKLQkJCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMF80MDoKLQkJCQlpZihwcml2LT5jYXJkXzgxOTJfdmVyc2lvbiA9PSBWRVJTSU9OXzgxOTBfQkQgfHxwcml2LT5jYXJkXzgxOTJfdmVyc2lvbiA9PSBWRVJTSU9OXzgxOTBfQkUpLy8gODI1NiBELWN1dCwgRS1jdXQsIHhpb25nOiBjb25zaWRlciBpdCBsYXRlciEKLQkJCQl7Ci0JCQkJCXJ0bDgxOTJfcGh5X1NldFJGUmVnKHByaXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCAweDBiLCBiTWFzazEyQml0cywgMHgzMDApOyAvL3BoeSBwYXJhOjNiYQotCQkJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhwcml2LCAoUkY5MF9SQURJT19QQVRIX0UpZVJGUGF0aCwgMHgyYywgYk1hc2sxMkJpdHMsIDB4M2ZmKTsKLQkJCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcocHJpdiwgKFJGOTBfUkFESU9fUEFUSF9FKWVSRlBhdGgsIDB4MGUsIGJNYXNrMTJCaXRzLCAweDBlMSk7Ci0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJQSFlfU2V0UkY4MjU2QmFuZHdpZHRoKCk6IHVua25vd24gaGFyZHdhcmUgdmVyc2lvblxuIik7Ci0JCQkJfQotCi0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJQSFlfU2V0UkY4MjU2QmFuZHdpZHRoKCk6IHVua25vd24gQmFuZHdpZHRoOiAlI1hcbiIsQmFuZHdpZHRoICk7Ci0JCQkJYnJlYWs7Ci0KLQkJfQotCX0KLX0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIE92ZXJ2aWV3OiAgICBJbnRlcmZhY2UgdG8gY29uZmlnIDgyNTYKLSAqIElucHV0OiAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSoJZGV2Ci0gKiBPdXRwdXQ6ICAgICAgTk9ORQotICogUmV0dXJuOiAgICAgIE5PTkUKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLVJUX1NUQVRVUyBQSFlfUkY4MjU2X0NvbmZpZyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQkvLyBJbml0aWFsaXplIGdlbmVyYWwgZ2xvYmFsIHZhbHVlCi0JLy8KLQlSVF9TVEFUVVMgcnRTdGF0dXMgPSBSVF9TVEFUVVNfU1VDQ0VTUzsKLQkvLyBUT0RPOiBFeHRlbmQgUkZfUEFUSF9DIGFuZCBSRl9QQVRIX0QgaW4gdGhlIGZ1dHVyZQotCXByaXYtPk51bVRvdGFsUkZQYXRoID0gUlRMODE5WF9UT1RBTF9SRl9QQVRIOwotCS8vIENvbmZpZyBCQiBhbmQgUkYKLQlydFN0YXR1cyA9IHBoeV9SRjgyNTZfQ29uZmlnX1BhcmFGaWxlKHByaXYpOwotCi0JcmV0dXJuIHJ0U3RhdHVzOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBPdmVydmlldzogICAgSW50ZXJmYWNlIHRvIGNvbmZpZyA4MjU2Ci0gKiBJbnB1dDogICAgICAgc3RydWN0IG5ldF9kZXZpY2UqCWRldgotICogT3V0cHV0OiAgICAgIE5PTkUKLSAqIFJldHVybjogICAgICBOT05FCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1SVF9TVEFUVVMgcGh5X1JGODI1Nl9Db25maWdfUGFyYUZpbGUoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0JdTMyIAl1NFJlZ1ZhbHVlID0gMDsKLQl1OCAJZVJGUGF0aDsKLQlSVF9TVEFUVVMJCQkJcnRTdGF0dXMgPSBSVF9TVEFUVVNfU1VDQ0VTUzsKLQlCQl9SRUdJU1RFUl9ERUZJTklUSU9OX1QJKnBQaHlSZWc7Ci0JdTMyCVJlZ09mZlNldFRvQmVDaGVjayA9IDB4MzsKLQl1MzIgCVJlZ1ZhbHVlVG9CZUNoZWNrID0gMHg3ZjE7Ci0JdTMyCVJGM19GaW5hbF9WYWx1ZSA9IDA7Ci0JdTgJQ29uc3RSZXRyeVRpbWVzID0gNSwgUmV0cnlUaW1lcyA9IDU7Ci0JdTggcmV0ID0gMDsKLQotCS8vMy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLzMvLyA8Mj4gSW5pdGlhbGl6ZSBSRgotCS8vMy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlmb3IoZVJGUGF0aCA9IChSRjkwX1JBRElPX1BBVEhfRSlSRjkwX1BBVEhfQTsgZVJGUGF0aCA8cHJpdi0+TnVtVG90YWxSRlBhdGg7IGVSRlBhdGgrKykKLQl7Ci0JCWlmICghcnRsODE5Ml9waHlfQ2hlY2tJc0xlZ2FsUkZQYXRoKHByaXYsIGVSRlBhdGgpKQotCQkJCWNvbnRpbnVlOwotCi0JCXBQaHlSZWcgPSAmcHJpdi0+UEhZUmVnRGVmW2VSRlBhdGhdOwotCi0JCS8qLS0tLVN0b3JlIG9yaWdpbmFsIFJGRU5WIGNvbnRyb2wgdHlwZS0tLS0qLwotCQlzd2l0Y2goZVJGUGF0aCkKLQkJewotCQljYXNlIFJGOTBfUEFUSF9BOgotCQljYXNlIFJGOTBfUEFUSF9DOgotCQkJdTRSZWdWYWx1ZSA9IHJ0bDgxOTJfUXVlcnlCQlJlZyhwcml2LCBwUGh5UmVnLT5yZmludGZzLCBiUkZTSV9SRkVOVik7Ci0JCQlicmVhazsKLQkJY2FzZSBSRjkwX1BBVEhfQiA6Ci0JCWNhc2UgUkY5MF9QQVRIX0Q6Ci0JCQl1NFJlZ1ZhbHVlID0gcnRsODE5Ml9RdWVyeUJCUmVnKHByaXYsIHBQaHlSZWctPnJmaW50ZnMsIGJSRlNJX1JGRU5WPDwxNik7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qLS0tLVNldCBSRl9FTlYgZW5hYmxlLS0tLSovCi0JCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgcFBoeVJlZy0+cmZpbnRmZSwgYlJGU0lfUkZFTlY8PDE2LCAweDEpOwotCi0JCS8qLS0tLVNldCBSRl9FTlYgb3V0cHV0IGhpZ2gtLS0tKi8KLQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCBwUGh5UmVnLT5yZmludGZvLCBiUkZTSV9SRkVOViwgMHgxKTsKLQotCQkvKiBTZXQgYml0IG51bWJlciBvZiBBZGRyZXNzIGFuZCBEYXRhIGZvciBSRiByZWdpc3RlciAqLwotCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHBQaHlSZWctPnJmSFNTSVBhcmEyLCBiM1dpcmVBZGRyZXNzTGVuZ3RoLCAweDApOyAJLy8gU2V0IDAgdG8gNCBiaXRzIGZvciBaLXNlcmlhbCBhbmQgc2V0IDEgdG8gNiBiaXRzIGZvciA4MjU4Ci0JCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgcFBoeVJlZy0+cmZIU1NJUGFyYTIsIGIzV2lyZURhdGFMZW5ndGgsIDB4MCk7CS8vIFNldCAwIHRvIDEyIGJpdHMgZm9yIFotc2VyaWFsIGFuZCA4MjU4LCBhbmQgc2V0IDEgdG8gMTQgYml0cyBmb3IgPz8/Ci0KLQkJcnRsODE5Ml9waHlfU2V0UkZSZWcocHJpdiwgKFJGOTBfUkFESU9fUEFUSF9FKSBlUkZQYXRoLCAweDAsIGJNYXNrMTJCaXRzLCAweGJmKTsKLQotCQkvKi0tLS1DaGVjayBSRiBibG9jayAoZm9yIEZQR0EgcGxhdGZvcm0gb25seSktLS0tKi8KLQkJLy8gVE9ETzogdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgcmVtb3ZlZCBvbiBBU0lDICwgRW1pbHkgMjAwNy4yLjIKLQkJcnRTdGF0dXMgPSBydGw4MTkyX3BoeV9jaGVja0JCQW5kUkYocHJpdiwgSFc5MF9CTE9DS19SRiwgKFJGOTBfUkFESU9fUEFUSF9FKWVSRlBhdGgpOwotCQlpZihydFN0YXR1cyE9IFJUX1NUQVRVU19TVUNDRVNTKQotCQl7Ci0JCQlSVF9UUkFDRShDT01QX0VSUiwgIlBIWV9SRjgyNTZfQ29uZmlnKCk6Q2hlY2sgUmFkaW9bJWRdIEZhaWwhIVxuIiwgZVJGUGF0aCk7Ci0JCQlnb3RvIHBoeV9SRjgyNTZfQ29uZmlnX1BhcmFGaWxlX0ZhaWw7Ci0JCX0KLQotCQlSZXRyeVRpbWVzID0gQ29uc3RSZXRyeVRpbWVzOwotCQlSRjNfRmluYWxfVmFsdWUgPSAwOwotCQkvKi0tLS1Jbml0aWFsaXplIFJGIGZvbSBjb25uZmlndXJhdGlvbiBmaWxlLS0tLSovCi0JCXN3aXRjaChlUkZQYXRoKQotCQl7Ci0JCWNhc2UgUkY5MF9QQVRIX0E6Ci0JCQl3aGlsZShSRjNfRmluYWxfVmFsdWUhPVJlZ1ZhbHVlVG9CZUNoZWNrICYmIFJldHJ5VGltZXMhPTApCi0JCQl7Ci0JCQkJcmV0ID0gcnRsODE5Ml9waHlfQ29uZmlnUkZXaXRoSGVhZGVyRmlsZShwcml2LChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoKTsKLQkJCQlSRjNfRmluYWxfVmFsdWUgPSBydGw4MTkyX3BoeV9RdWVyeVJGUmVnKHByaXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCBSZWdPZmZTZXRUb0JlQ2hlY2ssIGJNYXNrMTJCaXRzKTsKLQkJCQlSVF9UUkFDRShDT01QX1JGLCAiUkYgJWQgJWQgcmVnaXN0ZXIgZmluYWwgdmFsdWU6ICV4XG4iLCBlUkZQYXRoLCBSZWdPZmZTZXRUb0JlQ2hlY2ssIFJGM19GaW5hbF9WYWx1ZSk7Ci0JCQkJUmV0cnlUaW1lcy0tOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUkY5MF9QQVRIX0I6Ci0JCQl3aGlsZShSRjNfRmluYWxfVmFsdWUhPVJlZ1ZhbHVlVG9CZUNoZWNrICYmIFJldHJ5VGltZXMhPTApCi0JCQl7Ci0JCQkJcmV0ID0gcnRsODE5Ml9waHlfQ29uZmlnUkZXaXRoSGVhZGVyRmlsZShwcml2LChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoKTsKLQkJCQlSRjNfRmluYWxfVmFsdWUgPSBydGw4MTkyX3BoeV9RdWVyeVJGUmVnKHByaXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCBSZWdPZmZTZXRUb0JlQ2hlY2ssIGJNYXNrMTJCaXRzKTsKLQkJCQlSVF9UUkFDRShDT01QX1JGLCAiUkYgJWQgJWQgcmVnaXN0ZXIgZmluYWwgdmFsdWU6ICV4XG4iLCBlUkZQYXRoLCBSZWdPZmZTZXRUb0JlQ2hlY2ssIFJGM19GaW5hbF9WYWx1ZSk7Ci0JCQkJUmV0cnlUaW1lcy0tOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUkY5MF9QQVRIX0M6Ci0JCQl3aGlsZShSRjNfRmluYWxfVmFsdWUhPVJlZ1ZhbHVlVG9CZUNoZWNrICYmIFJldHJ5VGltZXMhPTApCi0JCQl7Ci0JCQkJcmV0ID0gcnRsODE5Ml9waHlfQ29uZmlnUkZXaXRoSGVhZGVyRmlsZShwcml2LChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoKTsKLQkJCQlSRjNfRmluYWxfVmFsdWUgPSBydGw4MTkyX3BoeV9RdWVyeVJGUmVnKHByaXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCBSZWdPZmZTZXRUb0JlQ2hlY2ssIGJNYXNrMTJCaXRzKTsKLQkJCQlSVF9UUkFDRShDT01QX1JGLCAiUkYgJWQgJWQgcmVnaXN0ZXIgZmluYWwgdmFsdWU6ICV4XG4iLCBlUkZQYXRoLCBSZWdPZmZTZXRUb0JlQ2hlY2ssIFJGM19GaW5hbF9WYWx1ZSk7Ci0JCQkJUmV0cnlUaW1lcy0tOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUkY5MF9QQVRIX0Q6Ci0JCQl3aGlsZShSRjNfRmluYWxfVmFsdWUhPVJlZ1ZhbHVlVG9CZUNoZWNrICYmIFJldHJ5VGltZXMhPTApCi0JCQl7Ci0JCQkJcmV0ID0gcnRsODE5Ml9waHlfQ29uZmlnUkZXaXRoSGVhZGVyRmlsZShwcml2LChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoKTsKLQkJCQlSRjNfRmluYWxfVmFsdWUgPSBydGw4MTkyX3BoeV9RdWVyeVJGUmVnKHByaXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCBSZWdPZmZTZXRUb0JlQ2hlY2ssIGJNYXNrMTJCaXRzKTsKLQkJCQlSVF9UUkFDRShDT01QX1JGLCAiUkYgJWQgJWQgcmVnaXN0ZXIgZmluYWwgdmFsdWU6ICV4XG4iLCBlUkZQYXRoLCBSZWdPZmZTZXRUb0JlQ2hlY2ssIFJGM19GaW5hbF9WYWx1ZSk7Ci0JCQkJUmV0cnlUaW1lcy0tOwotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKi0tLS1SZXN0b3JlIFJGRU5WIGNvbnRyb2wgdHlwZS0tLS0qLzsKLQkJc3dpdGNoKGVSRlBhdGgpCi0JCXsKLQkJY2FzZSBSRjkwX1BBVEhfQToKLQkJY2FzZSBSRjkwX1BBVEhfQzoKLQkJCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgcFBoeVJlZy0+cmZpbnRmcywgYlJGU0lfUkZFTlYsIHU0UmVnVmFsdWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgUkY5MF9QQVRIX0IgOgotCQljYXNlIFJGOTBfUEFUSF9EOgotCQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCBwUGh5UmVnLT5yZmludGZzLCBiUkZTSV9SRkVOVjw8MTYsIHU0UmVnVmFsdWUpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZihyZXQpewotCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJwaHlfUkY4MjU2X0NvbmZpZ19QYXJhRmlsZSgpOlJhZGlvWyVkXSBGYWlsISEiLCBlUkZQYXRoKTsKLQkJCWdvdG8gcGh5X1JGODI1Nl9Db25maWdfUGFyYUZpbGVfRmFpbDsKLQkJfQotCi0JfQotCi0JUlRfVFJBQ0UoQ09NUF9QSFksICJQSFkgSW5pdGlhbGl6YXRpb24gU3VjY2Vzc1xuIikgOwotCXJldHVybiBSVF9TVEFUVVNfU1VDQ0VTUzsKLQotcGh5X1JGODI1Nl9Db25maWdfUGFyYUZpbGVfRmFpbDoKLQlSVF9UUkFDRShDT01QX0VSUiwgIlBIWSBJbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpIDsKLQlyZXR1cm4gUlRfU1RBVFVTX0ZBSUxVUkU7Ci19Ci0KLQotdm9pZCBQSFlfU2V0UkY4MjU2Q0NLVHhQb3dlcihzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgdTggcG93ZXJsZXZlbCkKLXsKLQl1MzIJVHhBR0M9MDsKLQotCVR4QUdDID0gcG93ZXJsZXZlbDsKLQlpZihwcml2LT5iRHluYW1pY1R4TG93UG93ZXIgPT0gdHJ1ZSkvL2Nvc2EgMDQyODIwMDggZm9yIGNjayBsb25nIHJhbmdlCi0JewotCQlpZihwcml2LT5DdXN0b21lcklEID09IFJUX0NJRF84MTl4X05ldGNvcmUpCi0JCVR4QUdDID0gMHgyMjsKLQllbHNlCi0JCVR4QUdDICs9IHByaXYtPkNja1B3RW5sOwotCX0KLQlpZihUeEFHQyA+IDB4MjQpCi0JCVR4QUdDID0gMHgyNDsKLQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJUeEFHQ19DQ0tfTWNzMzIsIGJUeEFHQ1JhdGVDQ0ssIFR4QUdDKTsKLX0KLQotCi12b2lkIFBIWV9TZXRSRjgyNTZPRkRNVHhQb3dlcihzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgdTggcG93ZXJsZXZlbCkKLXsKLQotCXUzMiB3cml0ZVZhbCwgcG93ZXJCYXNlMCwgcG93ZXJCYXNlMSwgd3JpdGVWYWxfdG1wOwotCXU4IGluZGV4ID0gMDsKLQl1MTYgUmVnT2Zmc2V0WzZdID0gezB4ZTAwLCAweGUwNCwgMHhlMTAsIDB4ZTE0LCAweGUxOCwgMHhlMWN9OwotCXU4IGJ5dGUwLCBieXRlMSwgYnl0ZTIsIGJ5dGUzOwotCi0JcG93ZXJCYXNlMCA9IHBvd2VybGV2ZWwgKyBwcml2LT5MZWdhY3lIVFR4UG93ZXJEaWZmOwkvL09GRE0gcmF0ZXMKLQlwb3dlckJhc2UwID0gKHBvd2VyQmFzZTA8PDI0KSB8IChwb3dlckJhc2UwPDwxNikgfChwb3dlckJhc2UwPDw4KSB8cG93ZXJCYXNlMDsKLQlwb3dlckJhc2UxID0gcG93ZXJsZXZlbDsJCQkJCQkJLy9NQ1MgcmF0ZXMKLQlwb3dlckJhc2UxID0gKHBvd2VyQmFzZTE8PDI0KSB8IChwb3dlckJhc2UxPDwxNikgfChwb3dlckJhc2UxPDw4KSB8cG93ZXJCYXNlMTsKLQotCWZvcihpbmRleD0wOyBpbmRleDw2OyBpbmRleCsrKQotCXsKLQkJd3JpdGVWYWwgPSBwcml2LT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtpbmRleF0gKyAoKGluZGV4PDIpP3Bvd2VyQmFzZTA6cG93ZXJCYXNlMSk7Ci0JCWJ5dGUwID0gKHU4KSh3cml0ZVZhbCAmIDB4N2YpOwotCQlieXRlMSA9ICh1OCkoKHdyaXRlVmFsICYgMHg3ZjAwKT4+OCk7Ci0JCWJ5dGUyID0gKHU4KSgod3JpdGVWYWwgJiAweDdmMDAwMCk+PjE2KTsKLQkJYnl0ZTMgPSAodTgpKCh3cml0ZVZhbCAmIDB4N2YwMDAwMDApPj4yNCk7Ci0JCWlmKGJ5dGUwID4gMHgyNCkJLy8gTWF4IHBvd2VyIGluZGV4ID0gMHgyNAotCQkJYnl0ZTAgPSAweDI0OwotCQlpZihieXRlMSA+IDB4MjQpCi0JCQlieXRlMSA9IDB4MjQ7Ci0JCWlmKGJ5dGUyID4gMHgyNCkKLQkJCWJ5dGUyID0gMHgyNDsKLQkJaWYoYnl0ZTMgPiAweDI0KQotCQkJYnl0ZTMgPSAweDI0OwotCi0JCWlmKGluZGV4ID09IDMpCi0JCXsKLQkJCXdyaXRlVmFsX3RtcCA9IChieXRlMzw8MjQpIHwgKGJ5dGUyPDwxNikgfChieXRlMTw8OCkgfGJ5dGUwOwotCQkJcHJpdi0+UHdyX1RyYWNrID0gd3JpdGVWYWxfdG1wOwotCQl9Ci0KLQkJaWYocHJpdi0+YkR5bmFtaWNUeEhpZ2hQb3dlciA9PSB0cnVlKSAgICAgLy9BZGQgYnkgSmFja2VuIDIwMDgvMDMvMDYgIC8vd2hlbiBETSBpbXBsZW1lbnQsIGFkZCB0aGlzCi0JCXsKLQkJCXdyaXRlVmFsID0gMHgwMzAzMDMwMzsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXdyaXRlVmFsID0gKGJ5dGUzPDwyNCkgfCAoYnl0ZTI8PDE2KSB8KGJ5dGUxPDw4KSB8Ynl0ZTA7Ci0JCX0KLQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCBSZWdPZmZzZXRbaW5kZXhdLCAweDdmN2Y3ZjdmLCB3cml0ZVZhbCk7Ci0JfQotfQotCi0jZGVmaW5lIE1BWF9ET1pFX1dBSVRJTkdfVElNRVNfOXggNjQKLXN0YXRpYyB2b2lkIHI4MTkyZV9kcmFpbl90eF9xdWV1ZXMoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0JdTggaSwgUXVldWVJRDsKLQotCWZvciAoUXVldWVJRCA9IDAsIGkgPSAwOyBRdWV1ZUlEIDwgTUFYX1RYX1FVRVVFOyApCi0JewotCQlzdHJ1Y3QgcnRsODE5Ml90eF9yaW5nICpyaW5nID0gJnByaXYtPnR4X3JpbmdbUXVldWVJRF07Ci0KLQkJaWYoc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpID09IDApCi0JCXsKLQkJCVF1ZXVlSUQrKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJdWRlbGF5KDEwKTsKLQkJaSsrOwotCi0JCWlmIChpID49IE1BWF9ET1pFX1dBSVRJTkdfVElNRVNfOXgpCi0JCXsKLQkJCVJUX1RSQUNFKENPTVBfUE9XRVIsICJyODE5MmVfZHJhaW5fdHhfcXVldWVzKCkgdGltZW91dCBxdWV1ZSAlZFxuIiwgUXVldWVJRCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotc3RhdGljIGJvb2wgU2V0UkZQb3dlclN0YXRlODE5MChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwKLQkJCQlSVF9SRl9QT1dFUl9TVEFURSBlUkZQb3dlclN0YXRlKQotewotCVBSVF9QT1dFUl9TQVZFX0NPTlRST0wgcFBTQyA9ICZwcml2LT5Qb3dlclNhdmVDb250cm9sOwotCWJvb2wgYlJlc3VsdCA9IHRydWU7Ci0KLQlpZiAoZVJGUG93ZXJTdGF0ZSA9PSBwcml2LT5lUkZQb3dlclN0YXRlICYmCi0JICAgIHByaXYtPmJId1JmT2ZmQWN0aW9uID09IDApIHsKLQkJYlJlc3VsdCA9IGZhbHNlOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlzd2l0Y2goIGVSRlBvd2VyU3RhdGUgKQotCXsKLQljYXNlIGVSZk9uOgotCi0JCS8vIHR1cm4gb24gUkYKLQkJaWYgKChwcml2LT5lUkZQb3dlclN0YXRlID09IGVSZk9mZikgJiYKLQkJICAgIFJUX0lOX1BTX0xFVkVMKHBQU0MsIFJUX1JGX09GRl9MRVZMX0hBTFRfTklDKSkKLQkJewotCQkJLyoKLQkJCSAqIFRoZSBjdXJyZW50IFJGIHN0YXRlIGlzIE9GRiBhbmQgdGhlIFJGIE9GRiBsZXZlbAotCQkJICogaXMgaGFsdGluZyB0aGUgTklDLCByZS1pbml0aWFsaXplIHRoZSBOSUMuCi0JCQkgKi8KLQkJCWlmICghTmljSUZFbmFibGVOSUMocHJpdikpIHsKLQkJCQlSVF9UUkFDRShDT01QX0VSUiwgIiVzKCk6IE5pY0lGRW5hYmxlTklDIGZhaWxlZFxuIixfX0ZVTkNUSU9OX18pOwotCQkJCWJSZXN1bHQgPSBmYWxzZTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQotCQkJUlRfQ0xFQVJfUFNfTEVWRUwocFBTQywgUlRfUkZfT0ZGX0xFVkxfSEFMVF9OSUMpOwotCQl9IGVsc2UgewotCQkJd3JpdGVfbmljX2J5dGUocHJpdiwgQU5BUEFSLCAweDM3KTsvLzE2ME1IegotCQkJbWRlbGF5KDEpOwotCQkJLy9lbmFibGUgY2xvY2sgODAvODggTUh6Ci0JCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIxLCAweDQsIDB4MSk7IC8vIDB4ODgwWzJdCi0JCQlwcml2LT5iSHdSZk9mZkFjdGlvbiA9IDA7Ci0KLQkJCS8vUkYtQSwgUkYtQgotCQkJLy9lbmFibGUgUkYtQ2hpcCBBL0IKLQkJCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UsIEJJVDQsIDB4MSk7CQkvLyAweDg2MFs0XQotCQkJLy9hbmFsb2cgdG8gZGlnaXRhbCBvbgotCQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyNCwgMHgzMDAsIDB4Myk7Ly8gMHg4OGNbOTo4XQotCQkJLy9kaWdpdGFsIHRvIGFuYWxvZyBvbgotCQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMSwgMHgxOCwgMHgzKTsgLy8gMHg4ODBbNDozXQotCQkJLy9yeCBhbnRlbm5hIG9uCi0JCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJPRkRNMF9UUnhQYXRoRW5hYmxlLCAweDMsIDB4Myk7Ly8gMHhjMDRbMTowXQotCQkJLy9yeCBhbnRlbm5hIG9uCi0JCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJPRkRNMV9UUnhQYXRoRW5hYmxlLCAweDMsIDB4Myk7Ly8gMHhkMDRbMTowXQotCQkJLy9hbmFsb2cgdG8gZGlnaXRhbCBwYXJ0MiBvbgotCQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMSwgMHg2MCwgMHgzKTsgCS8vIDB4ODgwWzY6NV0KLQotCQl9Ci0KLQkJYnJlYWs7Ci0KLQkvLwotCS8vIEluIGN1cnJlbnQgc29sdXRpb24sIFJGU2xlZXA9UkZPZmYgaW4gb3JkZXIgdG8gc2F2ZSBwb3dlciB1bmRlciA4MDIuMTEgcG93ZXIgc2F2ZS4KLQkvLyBCeSBCcnVjZSwgMjAwOC0wMS0xNi4KLQkvLwotCWNhc2UgZVJmU2xlZXA6Ci0KLQkJLy8gSFcgc2V0dGluZyBoYWQgYmVlbiBjb25maWd1cmVkIHdpdGggZGVlcGVyIG1vZGUuCi0JCWlmKHByaXYtPmVSRlBvd2VyU3RhdGUgPT0gZVJmT2ZmKQotCQkJYnJlYWs7Ci0KLQkJcjgxOTJlX2RyYWluX3R4X3F1ZXVlcyhwcml2KTsKLQotCQlQSFlfU2V0UnRsODE5MmVSZk9mZihwcml2KTsKLQotCQlicmVhazsKLQotCWNhc2UgZVJmT2ZmOgotCi0JCS8vCi0JCS8vIERpc2Nvbm5lY3Qgd2l0aCBBbnkgQVAgb3IgU1RBLgotCQkvLwotCQlyODE5MmVfZHJhaW5fdHhfcXVldWVzKHByaXYpOwotCi0KLQkJaWYgKHBQU0MtPlJlZ1JmUHNMZXZlbCAmIFJUX1JGX09GRl9MRVZMX0hBTFRfTklDICYmICFSVF9JTl9QU19MRVZFTChwUFNDLCBSVF9SRl9PRkZfTEVWTF9IQUxUX05JQykpCi0JCXsKLQkJCS8qIERpc2FibGUgYWxsIGNvbXBvbmVudHMuICovCi0JCQlOaWNJRkRpc2FibGVOSUMocHJpdik7Ci0JCQlSVF9TRVRfUFNfTEVWRUwocFBTQywgUlRfUkZfT0ZGX0xFVkxfSEFMVF9OSUMpOwotCQl9Ci0JCWVsc2UgaWYgKCEocFBTQy0+UmVnUmZQc0xldmVsICYgUlRfUkZfT0ZGX0xFVkxfSEFMVF9OSUMpKQotCQl7Ci0JCQkvKiBOb3JtYWwgY2FzZSAtIElQUyBzaG91bGQgZ28gdG8gdGhpcy4gKi8KLQkJCVBIWV9TZXRSdGw4MTkyZVJmT2ZmKHByaXYpOwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYlJlc3VsdCA9IGZhbHNlOwotCQlSVF9UUkFDRShDT01QX0VSUiwgIlNldFJGUG93ZXJTdGF0ZTgxOTAoKTogdW5rbm93IHN0YXRlIHRvIHNldDogMHglWCEhIVxuIiwgZVJGUG93ZXJTdGF0ZSk7Ci0JCWJyZWFrOwotCX0KLQotCWlmKGJSZXN1bHQpCi0JewotCQkvLyBVcGRhdGUgY3VycmVudCBSRiBzdGF0ZSB2YXJpYWJsZS4KLQkJcHJpdi0+ZVJGUG93ZXJTdGF0ZSA9IGVSRlBvd2VyU3RhdGU7Ci0JfQotCi1vdXQ6Ci0JcmV0dXJuIGJSZXN1bHQ7Ci19Ci0KLQotCi0KLQotc3RhdGljIHZvaWQgTWdudERpc2Nvbm5lY3RJQlNTKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCXU4CQkJaTsKLQlib29sCWJGaWx0ZXJPdXROb25Bc3NvY2lhdGVkQlNTSUQgPSBmYWxzZTsKLQotCXByaXYtPmllZWU4MDIxMS0+c3RhdGUgPSBJRUVFODAyMTFfTk9MSU5LOwotCi0JZm9yKGk9MDtpPDY7aSsrKSAgcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYnNzaWRbaV09IDB4NTU7Ci0JcHJpdi0+T3BNb2RlID0gUlRfT1BfTU9ERV9OT19MSU5LOwotCXdyaXRlX25pY193b3JkKHByaXYsIEJTU0lEUiwgKCh1MTYqKXByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkKVswXSk7Ci0Jd3JpdGVfbmljX2R3b3JkKHByaXYsIEJTU0lEUisyLCAoKHUzMiopKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkKzIpKVswXSk7Ci0JewotCQkJUlRfT1BfTU9ERQlPcE1vZGUgPSBwcml2LT5PcE1vZGU7Ci0JCQl1OAlidE1zciA9IHJlYWRfbmljX2J5dGUocHJpdiwgTVNSKTsKLQotCQkJYnRNc3IgJj0gMHhmYzsKLQotCQkJc3dpdGNoKE9wTW9kZSkKLQkJCXsKLQkJCWNhc2UgUlRfT1BfTU9ERV9JTkZSQVNUUlVDVFVSRToKLQkJCQlidE1zciB8PSBNU1JfTElOS19NQU5BR0VEOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFJUX09QX01PREVfSUJTUzoKLQkJCQlidE1zciB8PSBNU1JfTElOS19BREhPQzsKLQkJCQkvLyBsZWQgbGluayBzZXQgc2VwYXJhdGUKLQkJCQlicmVhazsKLQotCQkJY2FzZSBSVF9PUF9NT0RFX0FQOgotCQkJCWJ0TXNyIHw9IE1TUl9MSU5LX01BU1RFUjsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQlidE1zciB8PSBNU1JfTElOS19OT05FOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQl3cml0ZV9uaWNfYnl0ZShwcml2LCBNU1IsIGJ0TXNyKTsKLQl9Ci0JaWVlZTgwMjExX3N0b3Bfc2VuZF9iZWFjb25zKHByaXYtPmllZWU4MDIxMSk7Ci0KLQkvLyBJZiBkaXNjb25uZWN0LCBjbGVhciBSQ1IgQ0JTU0lEIGJpdAotCWJGaWx0ZXJPdXROb25Bc3NvY2lhdGVkQlNTSUQgPSBmYWxzZTsKLQl7Ci0JCQl1MzIgUmVnUkNSLCBUeXBlOwotCQkJVHlwZSA9IGJGaWx0ZXJPdXROb25Bc3NvY2lhdGVkQlNTSUQ7Ci0JCQlSZWdSQ1IgPSByZWFkX25pY19kd29yZChwcml2LCBSQ1IpOwotCQkJcHJpdi0+UmVjZWl2ZUNvbmZpZyA9IFJlZ1JDUjsKLQkJCWlmIChUeXBlID09IHRydWUpCi0JCQkJUmVnUkNSIHw9IChSQ1JfQ0JTU0lEKTsKLQkJCWVsc2UgaWYgKFR5cGUgPT0gZmFsc2UpCi0JCQkJUmVnUkNSICY9ICh+UkNSX0NCU1NJRCk7Ci0KLQkJCXsKLQkJCQl3cml0ZV9uaWNfZHdvcmQocHJpdiwgUkNSLCBSZWdSQ1IpOwotCQkJCXByaXYtPlJlY2VpdmVDb25maWcgPSBSZWdSQ1I7Ci0JCQl9Ci0KLQkJfQotCW5vdGlmeV93eF9hc3NvY19ldmVudChwcml2LT5pZWVlODAyMTEpOwotCi19Ci0KLXN0YXRpYyB2b2lkIE1sbWVEaXNhc3NvY2lhdGVSZXF1ZXN0KHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCB1OCAqYXNTdGEsCi0JCQkJICAgIHU4IGFzUnNuKQotewotCXU4IGk7Ci0KLQlSZW1vdmVQZWVyVFMocHJpdi0+aWVlZTgwMjExLCBhc1N0YSk7Ci0KLQlTZW5kRGlzYXNzb2NpYXRpb24oIHByaXYtPmllZWU4MDIxMSwgYXNTdGEsIGFzUnNuICk7Ci0KLQlpZihtZW1jcHkocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsYXNTdGEsNikgPT0gTlVMTCkKLQl7Ci0JCS8vU2h1Q2hlbiBUT0RPOiBjaGFuZ2UgbWVkaWEgc3RhdHVzLgotCQkvL1NodUNoZW4gVE9ETzogV2hhdCB0byBkbyB3aGVuIGRpc2Fzc29jaWF0ZS4KLQkJcHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9IElFRUU4MDIxMV9OT0xJTks7Ci0JCWZvcihpPTA7aTw2O2krKykgIHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkW2ldID0gMHgyMjsKLQkJcHJpdi0+T3BNb2RlID0gUlRfT1BfTU9ERV9OT19MSU5LOwotCQl7Ci0JCQlSVF9PUF9NT0RFCU9wTW9kZSA9IHByaXYtPk9wTW9kZTsKLQkJCXU4IGJ0TXNyID0gcmVhZF9uaWNfYnl0ZShwcml2LCBNU1IpOwotCi0JCQlidE1zciAmPSAweGZjOwotCi0JCQlzd2l0Y2goT3BNb2RlKQotCQkJewotCQkJY2FzZSBSVF9PUF9NT0RFX0lORlJBU1RSVUNUVVJFOgotCQkJCWJ0TXNyIHw9IE1TUl9MSU5LX01BTkFHRUQ7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgUlRfT1BfTU9ERV9JQlNTOgotCQkJCWJ0TXNyIHw9IE1TUl9MSU5LX0FESE9DOwotCQkJCS8vIGxlZCBsaW5rIHNldCBzZXBhcmF0ZQotCQkJCWJyZWFrOwotCi0JCQljYXNlIFJUX09QX01PREVfQVA6Ci0JCQkJYnRNc3IgfD0gTVNSX0xJTktfTUFTVEVSOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCWJ0TXNyIHw9IE1TUl9MSU5LX05PTkU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXdyaXRlX25pY19ieXRlKHByaXYsIE1TUiwgYnRNc3IpOwotCQl9Ci0JCWllZWU4MDIxMV9kaXNhc3NvY2lhdGUocHJpdi0+aWVlZTgwMjExKTsKLQotCQl3cml0ZV9uaWNfd29yZChwcml2LCBCU1NJRFIsICgodTE2Kilwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5ic3NpZClbMF0pOwotCQl3cml0ZV9uaWNfZHdvcmQocHJpdiwgQlNTSURSKzIsICgodTMyKikocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYnNzaWQrMikpWzBdKTsKLQotCX0KLQotfQotCi0KLXN0YXRpYyB2b2lkIE1nbnREaXNjb25uZWN0QVAoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHU4IGFzUnNuKQotewotCWJvb2wgYkZpbHRlck91dE5vbkFzc29jaWF0ZWRCU1NJRCA9IGZhbHNlOwotCXUzMiBSZWdSQ1IsIFR5cGU7Ci0KLQkvKiBJZiBkaXNjb25uZWN0LCBjbGVhciBSQ1IgQ0JTU0lEIGJpdCAqLwotCWJGaWx0ZXJPdXROb25Bc3NvY2lhdGVkQlNTSUQgPSBmYWxzZTsKLQotCVR5cGUgPSBiRmlsdGVyT3V0Tm9uQXNzb2NpYXRlZEJTU0lEOwotCVJlZ1JDUiA9IHJlYWRfbmljX2R3b3JkKHByaXYsIFJDUik7Ci0JcHJpdi0+UmVjZWl2ZUNvbmZpZyA9IFJlZ1JDUjsKLQotCWlmIChUeXBlID09IHRydWUpCi0JCVJlZ1JDUiB8PSAoUkNSX0NCU1NJRCk7Ci0JZWxzZSBpZiAoVHlwZSA9PSBmYWxzZSkKLQkJUmVnUkNSICY9ICh+UkNSX0NCU1NJRCk7Ci0KLQl3cml0ZV9uaWNfZHdvcmQocHJpdiwgUkNSLCBSZWdSQ1IpOwotCXByaXYtPlJlY2VpdmVDb25maWcgPSBSZWdSQ1I7Ci0KLQlNbG1lRGlzYXNzb2NpYXRlUmVxdWVzdChwcml2LCBwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgYXNSc24pOwotCi0JcHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9IElFRUU4MDIxMV9OT0xJTks7Ci19Ci0KLQotc3RhdGljIGJvb2wgTWdudERpc2Nvbm5lY3Qoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHU4IGFzUnNuKQotewotCS8vIEluIGFkaG9jIG1vZGUsIHVwZGF0ZSBiZWFjb24gZnJhbWUuCi0JaWYoIHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCApCi0JewotCQlpZiggcHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfQURIT0MgKQotCQl7Ci0JCQlNZ250RGlzY29ubmVjdElCU1MocHJpdik7Ci0JCX0KLQkJaWYoIHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBICkKLQkJewotCQkJLy8gV2UgY2xlYXIga2V5IGhlcmUgaW5zdGVhZCBvZiBNZ250RGlzY29ubmVjdEFQKCkgYmVjYXVzZSB0aGF0Ci0JCQkvLyBNZ250QWN0U2V0XzgwMl8xMV9ESVNBU1NPQ0lBVEUoKSBpcyBhbiBpbnRlcmZhY2UgY2FsbGVkIGJ5IE9TLAotCQkJLy8gZS5nLiBPSURfODAyXzExX0RJU0FTU09DSUFURSBpbiBXaW5kb3dzIHdoaWxlIGFzIE1nbnREaXNjb25uZWN0QVAoKSBpcwotCQkJLy8gdXNlZCB0byBoYW5kbGUgZGlzYXNzb2NpYXRpb24gcmVsYXRlZCB0aGluZ3MgdG8gQVAsIGUuZy4gc2VuZCBEaXNhc3NvYwotCQkJLy8gZnJhbWUgdG8gQVAuICAyMDA1LjAxLjI3LCBieSByY25qa28uCi0JCQlNZ250RGlzY29ubmVjdEFQKHByaXYsIGFzUnNuKTsKLQkJfQotCX0KLQotCXJldHVybiB0cnVlOwotfQotCi0vLwotLy8JRGVzY3JpcHRpb246Ci0vLwkJQ2hhbmcgUkYgUG93ZXIgU3RhdGUuCi0vLwkJTm90ZSB0aGF0LCBvbmx5IE1nbnRBY3RTZXRfUkZfU3RhdGUoKSBpcyBhbGxvd2VkIHRvIHNldCBIV19WQVJfUkZfU1RBVEUuCi0vLwotLy8JQXNzdW1wdGlvbjoKLS8vCQlQQVNTSVZFIExFVkVMLgotLy8KLWJvb2wgTWdudEFjdFNldF9SRl9TdGF0ZShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgUlRfUkZfUE9XRVJfU1RBVEUgU3RhdGVUb1NldCwKLQkJCSBSVF9SRl9DSEFOR0VfU09VUkNFIENoYW5nZVNvdXJjZSkKLXsKLQlib29sIAkJCWJBY3Rpb25BbGxvd2VkID0gZmFsc2U7Ci0JYm9vbCAJCQliQ29ubmVjdEJ5U1NJRCA9IGZhbHNlOwotCVJUX1JGX1BPV0VSX1NUQVRFCXJ0U3RhdGU7Ci0KLQlSVF9UUkFDRShDT01QX1BPV0VSLCAiPT09Pk1nbnRBY3RTZXRfUkZfU3RhdGUoKTogU3RhdGVUb1NldCglZClcbiIsU3RhdGVUb1NldCk7Ci0KLQlzcGluX2xvY2soJnByaXYtPnJmX3BzX2xvY2spOwotCi0JcnRTdGF0ZSA9IHByaXYtPmVSRlBvd2VyU3RhdGU7Ci0KLQlzd2l0Y2goU3RhdGVUb1NldCkKLQl7Ci0JY2FzZSBlUmZPbjoKLQkJcHJpdi0+UmZPZmZSZWFzb24gJj0gKH5DaGFuZ2VTb3VyY2UpOwotCi0JCWlmICghcHJpdi0+UmZPZmZSZWFzb24pCi0JCXsKLQkJCXByaXYtPlJmT2ZmUmVhc29uID0gMDsKLQkJCWJBY3Rpb25BbGxvd2VkID0gdHJ1ZTsKLQotCi0JCQlpZihydFN0YXRlID09IGVSZk9mZiAmJiBDaGFuZ2VTb3VyY2UgPj1SRl9DSEFOR0VfQllfSFcgKQotCQkJewotCQkJCWJDb25uZWN0QnlTU0lEID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCQlSVF9UUkFDRShDT01QX1BPV0VSLCAiTWdudEFjdFNldF9SRl9TdGF0ZSAtIGVSZm9uIHJlamVjdCBwTWdudEluZm8tPlJmT2ZmUmVhc29uPSAweCV4LCBDaGFuZ2VTb3VyY2U9MHglWFxuIiwgcHJpdi0+UmZPZmZSZWFzb24sIENoYW5nZVNvdXJjZSk7Ci0KLQkJYnJlYWs7Ci0KLQljYXNlIGVSZk9mZjoKLQotCQlpZiAocHJpdi0+UmZPZmZSZWFzb24gPiBSRl9DSEFOR0VfQllfSVBTKQotCQl7Ci0JCQkvLyBEaXNjb25uZWN0IHRvIGN1cnJlbnQgQlNTIHdoZW4gcmFkaW8gb2ZmLiBBc2tlZCBieSBRdWFuVGEuCi0JCQlNZ250RGlzY29ubmVjdChwcml2LCBkaXNhc19sdl9zcyk7Ci0JCX0KLQotCQlwcml2LT5SZk9mZlJlYXNvbiB8PSBDaGFuZ2VTb3VyY2U7Ci0JCWJBY3Rpb25BbGxvd2VkID0gdHJ1ZTsKLQkJYnJlYWs7Ci0KLQljYXNlIGVSZlNsZWVwOgotCQlwcml2LT5SZk9mZlJlYXNvbiB8PSBDaGFuZ2VTb3VyY2U7Ci0JCWJBY3Rpb25BbGxvd2VkID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKGJBY3Rpb25BbGxvd2VkKQotCXsKLQkJUlRfVFJBQ0UoQ09NUF9QT1dFUiwgIk1nbnRBY3RTZXRfUkZfU3RhdGUoKTogQWN0aW9uIGlzIGFsbG93ZWQuLi4uIFN0YXRlVG9TZXQoJWQpLCBSZk9mZlJlYXNvbiglI1gpXG4iLCBTdGF0ZVRvU2V0LCBwcml2LT5SZk9mZlJlYXNvbik7Ci0JCS8vIENvbmZpZyBIVyB0byB0aGUgc3BlY2lmaWVkIG1vZGUuCi0JCVNldFJGUG93ZXJTdGF0ZTgxOTAocHJpdiwgU3RhdGVUb1NldCk7Ci0JfQotCWVsc2UKLQl7Ci0JCVJUX1RSQUNFKENPTVBfUE9XRVIsICJNZ250QWN0U2V0X1JGX1N0YXRlKCk6IEFjdGlvbiBpcyByZWplY3RlZC4uLi4gU3RhdGVUb1NldCglZCksIENoYW5nZVNvdXJjZSglI1gpLCBSZk9mZlJlYXNvbiglI1gpXG4iLCBTdGF0ZVRvU2V0LCBDaGFuZ2VTb3VyY2UsIHByaXYtPlJmT2ZmUmVhc29uKTsKLQl9Ci0KLQkvLyBSZWxlYXNlIFJGIHNwaW5sb2NrCi0Jc3Bpbl91bmxvY2soJnByaXYtPnJmX3BzX2xvY2spOwotCi0JUlRfVFJBQ0UoQ09NUF9QT1dFUiwgIjw9PT1NZ250QWN0U2V0X1JGX1N0YXRlKClcbiIpOwotCXJldHVybiBiQWN0aW9uQWxsb3dlZDsKLX0KLQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTBfcnRsODI1Ni5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkwX3J0bDgyNTYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThmOTI5MC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTBfcnRsODI1Ni5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyogcjgxOTBfcnRsODI1Ni5oIC0gcnRsODI1NiByYWRpbyBmcm9udGVuZAotICoKLSAqIFRoaXMgaXMgcGFydCBvZiB0aGUgcnRsODE4MC1zYTI0MDAgZHJpdmVyCi0gKiByZWxlYXNlZCB1bmRlciB0aGUgR1BMIChTZWUgZmlsZSBDT1BZSU5HIGZvciBkZXRhaWxzKS4KLSAqIENvcHlyaWdodCAoYykgMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+Ci0gKgotICogTWFueSB0aGFua3MgdG8gUmVhbHRlayBDb3JwLiBmb3IgdGhlaXIgZ3JlYXQgc3VwcG9ydCEKLSAqLwotCi0jaWZuZGVmIFJUTDgyMjVfSAotI2RlZmluZSBSVEw4MjI1X0gKLQotI2RlZmluZSBSVEw4MTlYX1RPVEFMX1JGX1BBVEggMiAvKiBmb3IgODE5MkUgKi8KLQotdm9pZCBQSFlfU2V0UkY4MjU2QmFuZHdpZHRoKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LAotCQkJCSAgIEhUX0NIQU5ORUxfV0lEVEggQmFuZHdpZHRoKTsKLQotUlRfU1RBVFVTIFBIWV9SRjgyNTZfQ29uZmlnKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKLQotUlRfU1RBVFVTIHBoeV9SRjgyNTZfQ29uZmlnX1BhcmFGaWxlKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKLQotdm9pZCBQSFlfU2V0UkY4MjU2Q0NLVHhQb3dlcihzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgdTggcG93ZXJsZXZlbCk7Ci12b2lkIFBIWV9TZXRSRjgyNTZPRkRNVHhQb3dlcihzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgdTggcG93ZXJsZXZlbCk7Ci0KLWJvb2wgTWdudEFjdFNldF9SRl9TdGF0ZShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwKLQkJCSBSVF9SRl9QT1dFUl9TVEFURSBTdGF0ZVRvU2V0LAotCQkJIFJUX1JGX0NIQU5HRV9TT1VSQ0UgQ2hhbmdlU291cmNlKTsKLQotI2VuZGlmIC8qIFJUTDgyMjVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzdmNjZiLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkUuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNDggKzAsMCBAQAotLyoKLSAgIFRoaXMgaXMgcGFydCBvZiBydGw4MTg3IE9wZW5Tb3VyY2UgZHJpdmVyLgotICAgQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0LTIwMDUgIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KLSAgIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCi0KLSAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlCi0gICBvZmZpY2lhbCByZWFsdGVrIGRyaXZlcgotCi0gICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxOTIgZHJpdmVyIHNrZWxldG9uCi0gICBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24KLQotICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyCi0KLSAgIFdlIHdhbnQgdG8gdGFua3MgdGhlIEF1dGhvcnMgb2YgdGhvc2UgcHJvamVjdHMgYW5kIHRoZSBOZGlzd3JhcHBlcgotICAgcHJvamVjdCBBdXRob3JzLgotKi8KLQotI2lmbmRlZiBSODE5eFVfSAotI2RlZmluZSBSODE5eFVfSAotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgkvL2ZvciBydG5sX2xvY2soKQotI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CS8vIE5lY2Vzc2FyeSBiZWNhdXNlIHdlIHVzZSB0aGUgcHJvYyBmcwotI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgImllZWU4MDIxMS9ydGw4MTl4X0hULmgiCi0jaW5jbHVkZSAiaWVlZTgwMjExL2llZWU4MDIxMS5oIgotCi0KLQotCi0jZGVmaW5lIFJUTDgxOXhFX01PRFVMRV9OQU1FICJydGw4MTl4RSIKLQotI2RlZmluZSBGQUxTRSAwCi0jZGVmaW5lIFRSVUUgMQotI2RlZmluZSBNQVhfS0VZX0xFTiAgICAgNjEKLSNkZWZpbmUgS0VZX0JVRl9TSVpFICAgIDUKLQotI2RlZmluZSBCSVQwICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBCSVQxICAgICAgICAgICAgMHgwMDAwMDAwMgotI2RlZmluZSBCSVQyICAgICAgICAgICAgMHgwMDAwMDAwNAotI2RlZmluZSBCSVQzICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBCSVQ0ICAgICAgICAgICAgMHgwMDAwMDAxMAotI2RlZmluZSBCSVQ1ICAgICAgICAgICAgMHgwMDAwMDAyMAotI2RlZmluZSBCSVQ2ICAgICAgICAgICAgMHgwMDAwMDA0MAotI2RlZmluZSBCSVQ3ICAgICAgICAgICAgMHgwMDAwMDA4MAotI2RlZmluZSBCSVQ4ICAgICAgICAgICAgMHgwMDAwMDEwMAotI2RlZmluZSBCSVQ5ICAgICAgICAgICAgMHgwMDAwMDIwMAotI2RlZmluZSBCSVQxMCAgICAgICAgICAgMHgwMDAwMDQwMAotI2RlZmluZSBCSVQxMSAgICAgICAgICAgMHgwMDAwMDgwMAotI2RlZmluZSBCSVQxMiAgICAgICAgICAgMHgwMDAwMTAwMAotI2RlZmluZSBCSVQxMyAgICAgICAgICAgMHgwMDAwMjAwMAotI2RlZmluZSBCSVQxNCAgICAgICAgICAgMHgwMDAwNDAwMAotI2RlZmluZSBCSVQxNSAgICAgICAgICAgMHgwMDAwODAwMAotI2RlZmluZSBCSVQxNiAgICAgICAgICAgMHgwMDAxMDAwMAotI2RlZmluZSBCSVQxNyAgICAgICAgICAgMHgwMDAyMDAwMAotI2RlZmluZSBCSVQxOCAgICAgICAgICAgMHgwMDA0MDAwMAotI2RlZmluZSBCSVQxOSAgICAgICAgICAgMHgwMDA4MDAwMAotI2RlZmluZSBCSVQyMCAgICAgICAgICAgMHgwMDEwMDAwMAotI2RlZmluZSBCSVQyMSAgICAgICAgICAgMHgwMDIwMDAwMAotI2RlZmluZSBCSVQyMiAgICAgICAgICAgMHgwMDQwMDAwMAotI2RlZmluZSBCSVQyMyAgICAgICAgICAgMHgwMDgwMDAwMAotI2RlZmluZSBCSVQyNCAgICAgICAgICAgMHgwMTAwMDAwMAotI2RlZmluZSBCSVQyNSAgICAgICAgICAgMHgwMjAwMDAwMAotI2RlZmluZSBCSVQyNiAgICAgICAgICAgMHgwNDAwMDAwMAotI2RlZmluZSBCSVQyNyAgICAgICAgICAgMHgwODAwMDAwMAotI2RlZmluZSBCSVQyOCAgICAgICAgICAgMHgxMDAwMDAwMAotI2RlZmluZSBCSVQyOSAgICAgICAgICAgMHgyMDAwMDAwMAotI2RlZmluZSBCSVQzMCAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBCSVQzMSAgICAgICAgICAgMHg4MDAwMDAwMAotLy8gUnggc21vb3RoIGZhY3RvcgotI2RlZmluZQlSeF9TbW9vdGhfRmFjdG9yCQkyMAotLyogMjAwNy8wNi8wNCBNSCBEZWZpbmUgc2xpZGluZyB3aW5kb3cgZm9yIFJTU0kgaGlzdG9yeS4gKi8KLSNkZWZpbmUJCVBIWV9SU1NJX1NMSURfV0lOX01BWAkJCQkxMDAKLSNkZWZpbmUJCVBIWV9CZWFjb25fUlNTSV9TTElEX1dJTl9NQVgJCTEwCi0KLSNkZWZpbmUgSUNfVmVyc2lvbkN1dF9ECTB4MwotI2RlZmluZSBJQ19WZXJzaW9uQ3V0X0UJMHg0Ci0KLSNpZiAwIC8vd2UgbmVlZCB0byB1c2UgUlRfVFJBQ0UgaW5zdGVhZCBETUVTRyBhcyBSVF9UUkFDRSB3aWxsIGNsZWFybHkgc2hvdyBkZWJ1ZyBsZXZlbCB3Yi4KLSNkZWZpbmUgRE1FU0coeCxhLi4uKSBwcmludGsoS0VSTl9JTkZPIFJUTDgxOXhFX01PRFVMRV9OQU1FICI6ICIgeCAiXG4iLCAjIyBhKQotI2Vsc2UKLSNkZWZpbmUgRE1FU0coeCxhLi4uKQotZXh0ZXJuIHUzMiBydF9nbG9iYWxfZGVidWdfY29tcG9uZW50OwotI2RlZmluZSBSVF9UUkFDRShjb21wb25lbnQsIHgsIGFyZ3MuLi4pIFwKLWRvIHsgaWYocnRfZ2xvYmFsX2RlYnVnX2NvbXBvbmVudCAmIGNvbXBvbmVudCkgXAotCXByaW50ayhLRVJOX0RFQlVHIFJUTDgxOXhFX01PRFVMRV9OQU1FICI6IiB4ICwgXAotCSAgICAgICAjI2FyZ3MpO1wKLX13aGlsZSgwKTsKLQotI2RlZmluZSBDT01QX1RSQUNFCQkJCUJJVDAJCS8vIEZvciBmdW5jdGlvbiBjYWxsIHRyYWNpbmcuCi0jZGVmaW5lIENPTVBfREJHCQkJCUJJVDEJCS8vIE9ubHkgZm9yIHRlbXBvcmFyeSBkZWJ1ZyBtZXNzYWdlLgotI2RlZmluZSBDT01QX0lOSVQJCQkJQklUMgkJLy8gZHVyaW5nIGRyaXZlciBpbml0aWFsaXphdGlvbiAvIGhhbHQgLyByZXNldC4KLQotCi0jZGVmaW5lIENPTVBfUkVDVgkJCQlCSVQzCQkvLyBSZXZlaXZlIHBhcnQgZGF0YSBwYXRoLgotI2RlZmluZSBDT01QX1NFTkQJCQkJQklUNAkJLy8gU2VuZCBwYXJ0IHBhdGguCi0jZGVmaW5lIENPTVBfSU8JCQkJCUJJVDUJCS8vIEkvTyBSZWxhdGVkLiBBZGRlZCBieSBBbm5pZSwgMjAwNi0wMy0wMi4KLSNkZWZpbmUgQ09NUF9QT1dFUgkJCQlCSVQ2CQkvLyA4MDIuMTEgUG93ZXIgU2F2ZSBtb2RlIG9yIFN5c3RlbS9EZXZpY2UgUG93ZXIgc3RhdGUgcmVsYXRlZC4KLSNkZWZpbmUgQ09NUF9FUFJPTQkJCQlCSVQ3CQkvLyA4MDIuMTEgbGluayByZWxhdGVkOiBqb2luL3N0YXJ0IEJTUywgbGVhdmUgQlNTLgotI2RlZmluZSBDT01QX1NXQlcJCQkJQklUOAkvLyBGb3IgYmFuZHdpZHRoIHN3aXRjaC4KLSNkZWZpbmUgQ09NUF9TRUMJCQkJQklUOS8vIEZvciBTZWN1cml0eS4KLQotCi0jZGVmaW5lIENPTVBfVFVSQk8JCQkJQklUMTAJLy8gRm9yIFR1cmJvIE1vZGUgcmVsYXRlZC4gQnkgQW5uaWUsIDIwMDUtMTAtMjEuCi0jZGVmaW5lIENPTVBfUU9TCQkJCUJJVDExCS8vIEZvciBRb1MuCi0KLSNkZWZpbmUgQ09NUF9SQVRFCQkJCUJJVDEyCS8vIEZvciBSYXRlIEFkYXB0aXZlIG1lY2hhbmlzbSwgMjAwNi4wNy4wMiwgYnkgcmNuamtvLiAjZGVmaW5lIENPTVBfRVZFTlRTCQkJCTB4MDAwMDAwODAJLy8gRXZlbnQgaGFuZGxpbmcKLSNkZWZpbmUgQ09NUF9SWERFU0MJCQkgICAgICAgIEJJVDEzCS8vIFNob3cgUnggZGVzYyBpbmZvcm1hdGlvbiBmb3IgU0QzIGRlYnVnLiBBZGRlZCBieSBBbm5pZSwgMjAwNi0wNy0xNS4KLSNkZWZpbmUgQ09NUF9QSFkJCQkJQklUMTQKLSNkZWZpbmUgQ09NUF9ESUcJCQkJQklUMTUJLy8gRm9yIERJRywgMjAwNi4wOS4yNSwgYnkgcmNuamtvLgotI2RlZmluZSBDT01QX1RYQUdDCQkJCUJJVDE2CS8vIEZvciBUeCBwb3dlciwgMDYwOTI4LCBieSByY25qa28uCi0jZGVmaW5lIENPTVBfSEFMRE0JCQkJQklUMTcJLy8gRm9yIEhXIER5bmFtaWMgTWVjaGFuaXNtLCAwNjEwMTAsIGJ5IHJjbmprby4KLSNkZWZpbmUgQ09NUF9QT1dFUl9UUkFDS0lORwkgICAgICAgICAgICAgICAgQklUMTgJLy9GT1IgODE5MCBUWCBQT1dFUiBUUkFDS0lORwotI2RlZmluZSBDT01QX0VWRU5UUwkJCSAgICAgICAgQklUMTkJLy8gRXZlbnQgaGFuZGxpbmcKLQotI2RlZmluZSBDT01QX1JGCQkJCQlCSVQyMAkvLyBGb3IgUkYuCi0KLS8qIDExbiBvciA4MTkwIHNwZWNpZmljIGNvZGUgc2hvdWxkIGJlIHB1dCBiZWxvdyB0aGlzIGxpbmUgKi8KLQotCi0jZGVmaW5lIENPTVBfRklSTVdBUkUJCQkgICAgICAgIEJJVDIxCS8vZm9yIGZpcm13YXJlIGRvd25sb2FkaW5nCi0jZGVmaW5lIENPTVBfSFQJCQkJCUJJVDIyCS8vIEZvciA4MDIuMTFuIEhUIHJlbGF0ZWQgaW5mb3JtYXRpb24uIGJ5IEVtaWx5IDIwMDYtOC0xMQotCi0jZGVmaW5lIENPTVBfUkVTRVQJCQkJQklUMjMKLSNkZWZpbmUgQ09NUF9DTURQS1QJCQkgICAgICAgIEJJVDI0Ci0jZGVmaW5lIENPTVBfU0NBTgkJCQlCSVQyNQotI2RlZmluZSBDT01QX0lQUwkJCQlCSVQyNgotI2RlZmluZSBDT01QX0RPV04JCQkJQklUMjcgIC8vIGZvciBybSBkcml2ZXIgbW9kdWxlCi0jZGVmaW5lIENPTVBfSU5UUiAJCQkJQklUMjggIC8vIGZvciBpbnRlcnJ1cHQKLSNkZWZpbmUgQ09NUF9FUlIJCQkJQklUMzEgIC8vIGZvciBlcnJvciBvdXQsIGFsd2F5cyBvbgotI2VuZGlmCi0KLQotLy8KLS8vIFF1ZXVlIFNlbGVjdCBWYWx1ZSBpbiBUeERlc2MKLS8vCi0jZGVmaW5lIFFTTFRfQksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKLSNkZWZpbmUgUVNMVF9CRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAotI2RlZmluZSBRU0xUX1ZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0Ci0jZGVmaW5lIFFTTFRfVk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYKLSNkZWZpbmUgUVNMVF9CRUFDT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKLSNkZWZpbmUgUVNMVF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTEKLSNkZWZpbmUgUVNMVF9NR05UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIKLSNkZWZpbmUgUVNMVF9DTUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTMKLQotI2RlZmluZSBERVNDOTBfUkFURTFNICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAotI2RlZmluZSBERVNDOTBfUkFURTJNICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBERVNDOTBfUkFURTVfNU0gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgotI2RlZmluZSBERVNDOTBfUkFURTExTSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMwotI2RlZmluZSBERVNDOTBfUkFURTZNICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNAotI2RlZmluZSBERVNDOTBfUkFURTlNICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNQotI2RlZmluZSBERVNDOTBfUkFURTEyTSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNgotI2RlZmluZSBERVNDOTBfUkFURTE4TSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNwotI2RlZmluZSBERVNDOTBfUkFURTI0TSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOAotI2RlZmluZSBERVNDOTBfUkFURTM2TSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOQotI2RlZmluZSBERVNDOTBfUkFURTQ4TSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYQotI2RlZmluZSBERVNDOTBfUkFURTU0TSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwYgotI2RlZmluZSBERVNDOTBfUkFURU1DUzAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMAotI2RlZmluZSBERVNDOTBfUkFURU1DUzEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBERVNDOTBfUkFURU1DUzIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgotI2RlZmluZSBERVNDOTBfUkFURU1DUzMgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMwotI2RlZmluZSBERVNDOTBfUkFURU1DUzQgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNAotI2RlZmluZSBERVNDOTBfUkFURU1DUzUgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNQotI2RlZmluZSBERVNDOTBfUkFURU1DUzYgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNgotI2RlZmluZSBERVNDOTBfUkFURU1DUzcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNwotI2RlZmluZSBERVNDOTBfUkFURU1DUzggICAgICAgICAgICAgICAgICAgICAgICAgMHgwOAotI2RlZmluZSBERVNDOTBfUkFURU1DUzkgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOQotI2RlZmluZSBERVNDOTBfUkFURU1DUzEwICAgICAgICAgICAgICAgICAgICAgICAgMHgwYQotI2RlZmluZSBERVNDOTBfUkFURU1DUzExICAgICAgICAgICAgICAgICAgICAgICAgMHgwYgotI2RlZmluZSBERVNDOTBfUkFURU1DUzEyICAgICAgICAgICAgICAgICAgICAgICAgMHgwYwotI2RlZmluZSBERVNDOTBfUkFURU1DUzEzICAgICAgICAgICAgICAgICAgICAgICAgMHgwZAotI2RlZmluZSBERVNDOTBfUkFURU1DUzE0ICAgICAgICAgICAgICAgICAgICAgICAgMHgwZQotI2RlZmluZSBERVNDOTBfUkFURU1DUzE1ICAgICAgICAgICAgICAgICAgICAgICAgMHgwZgotI2RlZmluZSBERVNDOTBfUkFURU1DUzMyICAgICAgICAgICAgICAgICAgICAgICAgMHgyMAotCi0jZGVmaW5lIFJUTDgxOVhfREVGQVVMVF9SRl9UWVBFIFJGXzFUMlIKLSNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfTGVnYWN5SFRUeFBvd2VyRGlmZgkweDQKLSNkZWZpbmUgSUVFRTgwMjExX1dBVENIX0RPR19USU1FICAgIDIwMDAKLQotdHlwZWRlZiB1MzIgUlRfUkZfQ0hBTkdFX1NPVVJDRTsKLSNkZWZpbmUgUkZfQ0hBTkdFX0JZX1NXIEJJVDMxCi0jZGVmaW5lIFJGX0NIQU5HRV9CWV9IVyBCSVQzMAotI2RlZmluZSBSRl9DSEFOR0VfQllfUFMgQklUMjkKLSNkZWZpbmUgUkZfQ0hBTkdFX0JZX0lQUyBCSVQyOAotI2RlZmluZSBSRl9DSEFOR0VfQllfSU5JVAkwCS8vIERvIG5vdCBjaGFuZ2UgdGhlIFJGT2ZmIHJlYXNvbi4gRGVmaW5lZCBieSBCcnVjZSwgMjAwOC0wMS0xNy4KLQotLy8gUkYgc3RhdGUuCi10eXBlZGVmCWVudW0gX1JUX1JGX1BPV0VSX1NUQVRFIHsKLQllUmZPbiwKLQllUmZTbGVlcCwKLQllUmZPZmYKLX0gUlRfUkZfUE9XRVJfU1RBVEU7Ci0KLXR5cGVkZWYgZW51bSBfUlRfSk9JTl9BQ1RJT04gewotCVJUX0pPSU5fSU5GUkEgPSAxLAotCVJUX0pPSU5fSUJTUyAgPSAyLAotCVJUX1NUQVJUX0lCU1MgPSAzLAotCVJUX05PX0FDVElPTiAgPSA0LAotfSBSVF9KT0lOX0FDVElPTjsKLQotdHlwZWRlZiBlbnVtIF9JUFNfQ0FMTEJBQ0tfRlVOQ0lPTiB7Ci0JSVBTX0NBTExCQUNLX05PTkUgPSAwLAotCUlQU19DQUxMQkFDS19NR05UX0xJTktfUkVRVUVTVCA9IDEsCi0JSVBTX0NBTExCQUNLX0pPSU5fUkVRVUVTVCA9IDIsCi19IElQU19DQUxMQkFDS19GVU5DSU9OOwotCi10eXBlZGVmIHN0cnVjdCBfUlRfUE9XRVJfU0FWRV9DT05UUk9MIHsKLQkvKiBJbmFjdGl2ZSBQb3dlciBTYXZlKElQUykgOiBEaXNhYmxlIFJGIHdoZW4gZGlzY29ubmVjdGVkICovCi0JYm9vbAkJCWJJbmFjdGl2ZVBzOwotCWJvb2wJCQliSVBTTW9kZUJhY2t1cDsKLQlib29sCQkJYlN3UmZQcm9jZXNzaW5nOwotCVJUX1JGX1BPV0VSX1NUQVRFCWVJbmFjdGl2ZVBvd2VyU3RhdGU7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IAlJbmFjdGl2ZVBzV29ya0l0ZW07Ci0Jc3RydWN0IHRpbWVyX2xpc3QJSW5hY3RpdmVQc1RpbWVyOwotCi0JLyogUmV0dXJuIHBvaW50IGZvciBqb2luIGFjdGlvbiAqLwotCUlQU19DQUxMQkFDS19GVU5DSU9OCVJldHVyblBvaW50OwotCi0JLyogUmVjb3JlZCBQYXJhbWV0ZXJzIGZvciByZXNjaGVkdWxlZCBKb2luUmVxdWVzdCAqLwotCWJvb2wJCQliVG1wQnNzRGVzYzsKLQlSVF9KT0lOX0FDVElPTgkJdG1wSm9pbkFjdGlvbjsKLQlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgdG1wQnNzRGVzYzsKLQotCS8qIFJlY29yZWQgUGFyYW1ldGVycyBmb3IgcmVzY2hlZHVsZWQgTWdudExpbmtSZXF1ZXN0ICovCi0JYm9vbAkJCWJUbXBTY2FuT25seTsKLQlib29sCQkJYlRtcEFjdGl2ZVNjYW47Ci0JYm9vbAkJCWJUbXBGaWx0ZXJIaWRkZW5BUDsKLQlib29sCQkJYlRtcFVwZGF0ZVBhcm1zOwotCXU4CQkJdG1wU3NpZEJ1ZlszM107Ci0JT0NURVRfU1RSSU5HCQl0bXBTc2lkMlNjYW47Ci0JYm9vbAkJCWJUbXBTc2lkMlNjYW47Ci0JdTgJCQl0bXBOZXR3b3JrVHlwZTsKLQl1OAkJCXRtcENoYW5uZWxOdW1iZXI7Ci0JdTE2CQkJdG1wQmNuUGVyaW9kOwotCXU4CQkJdG1wRHRpbVBlcmlvZDsKLQl1MTYJCQl0bXBtQ2FwOwotCU9DVEVUX1NUUklORwkJdG1wU3VwcFJhdGVTZXQ7Ci0JdTgJCQl0bXBTdXBwUmF0ZUJ1ZltNQVhfTlVNX1JBVEVTXTsKLQlib29sCQkJYlRtcFN1cHBSYXRlOwotCUlic3NQYXJtcwkJdG1wSWJwbTsKLQlib29sCQkJYlRtcElicG07Ci0KLQkvKgotCSAqIExlaXN1cmUgUG93ZXIgU2F2ZToKLQkgKiBEaXNhYmxlIFJGIGlmIGNvbm5lY3RlZCBidXQgdHJhZmZpYyBpcyBub3QgYnVzeQotCSAqLwotCWJvb2wJCQliTGVpc3VyZVBzOwotCXUzMgkJCVBvd2VyUHJvZmlsZTsKLQl1OAkJCUxwc0lkbGVDb3VudDsKLQotCXUzMgkJCUN1clBzTGV2ZWw7Ci0JdTMyCQkJUmVnUmZQc0xldmVsOwotCi0JYm9vbAkJCWJGd0N0cmxMUFM7Ci0JdTgJCQlGV0N0cmxQU01vZGU7Ci0KLQlib29sCQkJTGlua1JlcUluSVBTUkZPZmZQZ3M7Ci0JYm9vbAkJCUJ1ZkNvbm5lY3RpbmZvQmVmb3JlOwotfSBSVF9QT1dFUl9TQVZFX0NPTlRST0wsICpQUlRfUE9XRVJfU0FWRV9DT05UUk9MOwotCi0vKiBGb3IgcnRsODE5eCAqLwotdHlwZWRlZiBzdHJ1Y3QgX3R4X2Rlc2NfODE5eF9wY2kgewotICAgICAgICAvL0RXT1JEIDAKLSAgICAgICAgdTE2CVBrdFNpemU7Ci0gICAgICAgIHU4CU9mZnNldDsKLSAgICAgICAgdTgJUmVzZXJ2ZWQxOjM7Ci0gICAgICAgIHU4CUNtZEluaXQ6MTsKLSAgICAgICAgdTgJTGFzdFNlZzoxOwotICAgICAgICB1OAlGaXJzdFNlZzoxOwotICAgICAgICB1OAlMSU5JUDoxOwotICAgICAgICB1OAlPV046MTsKLQotICAgICAgICAvL0RXT1JEIDEKLSAgICAgICAgdTgJVHhGV0luZm9TaXplOwotICAgICAgICB1OAlSQVRpZDozOwotICAgICAgICB1OAlESVNGQjoxOwotICAgICAgICB1OAlVU0VSQVRFOjE7Ci0gICAgICAgIHU4CU1PUkVGUkFHOjE7Ci0gICAgICAgIHU4CU5vRW5jOjE7Ci0gICAgICAgIHU4CVBJRlM6MTsKLSAgICAgICAgdTgJUXVldWVTZWxlY3Q6NTsKLSAgICAgICAgdTgJTm9BQ006MTsKLSAgICAgICAgdTgJUmVzdjoyOwotICAgICAgICB1OAlTZWNDQU1JRDo1OwotICAgICAgICB1OAlTZWNEZXNjQXNzaWduOjE7Ci0gICAgICAgIHU4CVNlY1R5cGU6MjsKLQotICAgICAgICAvL0RXT1JEIDIKLSAgICAgICAgdTE2CVR4QnVmZmVyU2l6ZTsKLSAgICAgICAgdTgJUGt0SWQ6NzsKLSAgICAgICAgdTgJUmVzdjE6MTsKLSAgICAgICAgdTgJUmVzZXJ2ZWQyOwotCi0gICAgICAgIC8vRFdPUkQgMwotCXUzMiAJVHhCdWZmQWRkcjsKLQotCS8vRFdPUkQgNAotCXUzMglOZXh0RGVzY0FkZHJlc3M7Ci0KLQkvL0RXT1JEIDUsNiw3Ci0gICAgICAgIHUzMglSZXNlcnZlZDU7Ci0gICAgICAgIHUzMglSZXNlcnZlZDY7Ci0gICAgICAgIHUzMglSZXNlcnZlZDc7Ci19dHhfZGVzY184MTl4X3BjaSwgKnB0eF9kZXNjXzgxOXhfcGNpOwotCi0KLXR5cGVkZWYgc3RydWN0IF90eF9kZXNjX2NtZF84MTl4X3BjaSB7Ci0gICAgICAgIC8vRFdPUkQgMAotCXUxNglQa3RTaXplOwotCXU4CVJlc2VydmVkMTsKLQl1OAlDbWRUeXBlOjM7Ci0JdTgJQ21kSW5pdDoxOwotCXU4CUxhc3RTZWc6MTsKLQl1OAlGaXJzdFNlZzoxOwotCXU4CUxJTklQOjE7Ci0JdTgJT1dOOjE7Ci0KLSAgICAgICAgLy9ET1dSRCAxCi0JdTE2CUVsZW1lbnRSZXBvcnQ7Ci0JdTE2CVJlc2VydmVkMjsKLQotICAgICAgICAvL0RPV1JEIDIKLQl1MTYgCVR4QnVmZmVyU2l6ZTsKLQl1MTYJUmVzZXJ2ZWQzOwotCi0gICAgICAgLy9EV09SRCAzLDQsNQotCXUzMglUeEJ1ZmZlckFkZHI7Ci0JdTMyCU5leHREZXNjQWRkcmVzczsKLQl1MzIJUmVzZXJ2ZWQ0OwotCXUzMglSZXNlcnZlZDU7Ci0JdTMyCVJlc2VydmVkNjsKLX10eF9kZXNjX2NtZF84MTl4X3BjaSwgKnB0eF9kZXNjX2NtZF84MTl4X3BjaTsKLQotCi10eXBlZGVmIHN0cnVjdCBfdHhfZndpbmZvXzgxOXhfcGNpIHsKLSAgICAgICAgLy9ET1dSRCAwCi0gICAgICAgIHU4CQlUeFJhdGU6NzsKLSAgICAgICAgdTgJCUN0c0VuYWJsZToxOwotICAgICAgICB1OAkJUnRzUmF0ZTo3OwotICAgICAgICB1OAkJUnRzRW5hYmxlOjE7Ci0gICAgICAgIHU4CQlUeEhUOjE7Ci0gICAgICAgIHU4CQlTaG9ydDoxOyAgICAgICAgICAgICAgICAvL1Nob3J0IFBMQ1AgZm9yIENDSywgb3Igc2hvcnQgR0kgZm9yIDExbiBNQ1MKLSAgICAgICAgdTgJCVR4QmFuZHdpZHRoOjE7ICAgICAgICAgIC8vIFRoaXMgaXMgdXNlZCBmb3IgSFQgTUNTIHJhdGUgb25seS4KLSAgICAgICAgdTgJCVR4U3ViQ2FycmllcjoyOyAgICAgICAgIC8vIFRoaXMgaXMgdXNlZCBmb3IgbGVnYWN5IE9GRE0gcmF0ZSBvbmx5LgotICAgICAgICB1OAkJU1RCQzoyOwotICAgICAgICB1OAkJQWxsb3dBZ2dyZWdhdGlvbjoxOwotICAgICAgICB1OAkJUnRzSFQ6MTsgICAgICAgICAgICAgICAgLy9JbnRlcnByZSBSdHNSYXRlIGZpZWxkIGFzIGhpZ2ggdGhyb3VnaHB1dCBkYXRhIHJhdGUKLSAgICAgICAgdTgJCVJ0c1Nob3J0OjE7ICAgICAgICAgICAgIC8vU2hvcnQgUExDUCBmb3IgQ0NLLCBvciBzaG9ydCBHSSBmb3IgMTFuIE1DUwotICAgICAgICB1OAkJUnRzQmFuZHdpZHRoOjE7ICAgICAgICAgLy8gVGhpcyBpcyB1c2VkIGZvciBIVCBNQ1MgcmF0ZSBvbmx5LgotICAgICAgICB1OAkJUnRzU3ViY2FycmllcjoyOyAgICAgICAgLy8gVGhpcyBpcyB1c2VkIGZvciBsZWdhY3kgT0ZETSByYXRlIG9ubHkuCi0gICAgICAgIHU4CQlSdHNTVEJDOjI7Ci0gICAgICAgIHU4CQlFbmFibGVDUFVEdXI6MTsgICAgICAgICAvL0VuYWJsZSBmaXJtd2FyZSB0byByZWNhbGN1bGF0ZSBhbmQgYXNzaWduIHBhY2tldCBkdXJhdGlvbgotCi0gICAgICAgIC8vRFdPUkQgMQotICAgICAgICB1OAkJUnhNRjoyOwotICAgICAgICB1OAkJUnhBTUQ6MzsKLSAgICAgICAgdTgJCVJlc2VydmVkMTozOwotICAgICAgICB1OAkJUmVzZXJ2ZWQyOwotICAgICAgICB1OAkJUmVzZXJ2ZWQzOwotICAgICAgICB1OAkJUmVzZXJ2ZWQ0OwotCi0gICAgICAgIC8vdTMyICAgICAgICAgICAgICAgIFJlc2VydmVkOwotfXR4X2Z3aW5mb184MTl4X3BjaSwgKnB0eF9md2luZm9fODE5eF9wY2k7Ci0KLXR5cGVkZWYgc3RydWN0IF9yeF9kZXNjXzgxOXhfcGNpewotCS8vRE9XUkQgMAotCXUxNgkJCUxlbmd0aDoxNDsKLQl1MTYJCQlDUkMzMjoxOwotCXUxNgkJCUlDVjoxOwotCXU4CQkJUnhEcnZJbmZvU2l6ZTsKLQl1OAkJCVNoaWZ0OjI7Ci0JdTgJCQlQSFlTdGF0dXM6MTsKLQl1OAkJCVNXRGVjOjE7Ci0JdTgJCQkJCUxhc3RTZWc6MTsKLQl1OAkJCQkJRmlyc3RTZWc6MTsKLQl1OAkJCQkJRU9SOjE7Ci0JdTgJCQkJCU9XTjoxOwotCi0JLy9EV09SRCAxCi0JdTMyCQkJUmVzZXJ2ZWQyOwotCi0JLy9EV09SRCAyCi0JdTMyCQkJUmVzZXJ2ZWQzOwotCi0JLy9EV09SRCAzCi0JdTMyCUJ1ZmZlckFkZHJlc3M7Ci0KLX1yeF9kZXNjXzgxOXhfcGNpLCAqcHJ4X2Rlc2NfODE5eF9wY2k7Ci0KLXR5cGVkZWYgc3RydWN0IF9yeF9md2luZm9fODE5eF9wY2l7Ci0JLy9EV09SRCAwCi0JdTE2CQkJUmVzZXJ2ZWQxOjEyOwotCXUxNgkJCVBhcnRBZ2dyOjE7Ci0JdTE2CQkJRmlyc3RBR0dSOjE7Ci0JdTE2CQkJUmVzZXJ2ZWQyOjI7Ci0KLQl1OAkJCVJ4UmF0ZTo3OwotCXU4CQkJUnhIVDoxOwotCi0JdTgJCQlCVzoxOwotCXU4CQkJU1BMQ1A6MTsKLQl1OAkJCVJlc2VydmVkMzoyOwotCXU4CQkJUEFNOjE7Ci0JdTgJCQlNY2FzdDoxOwotCXU4CQkJQmNhc3Q6MTsKLQl1OAkJCVJlc2VydmVkNDoxOwotCi0JLy9EV09SRCAxCi0JdTMyCQkJVFNGTDsKLQotfXJ4X2Z3aW5mb184MTl4X3BjaSwgKnByeF9md2luZm9fODE5eF9wY2k7Ci0KLSNkZWZpbmUgTUFYX0RFVl9BRERSX1NJWkUJCTggIC8qIHN1cHBvcnQgdGlsbCA2NCBiaXQgYnVzIHdpZHRoIE9TICovCi0jZGVmaW5lIE1BWF9GSVJNV0FSRV9JTkZPUk1BVElPTl9TSVpFICAgMzIgLyoyMDA2LzA0LzMwIGJ5IEVtaWx5IGZvclJUTDgxOTAqLwotI2RlZmluZSBNQVhfODAyXzExX0hFQURFUl9MRU5HVEggICAgICAgICg0MCArIE1BWF9GSVJNV0FSRV9JTkZPUk1BVElPTl9TSVpFKQotI2RlZmluZSBFTkNSWVBUSU9OX01BWF9PVkVSSEVBRAkJMTI4Ci0jZGVmaW5lIE1BWF9GUkFHTUVOVF9DT1VOVAkJOAotI2RlZmluZSBNQVhfVFJBTlNNSVRfQlVGRkVSX1NJWkUgIAkoMTYwMCsoTUFYXzgwMl8xMV9IRUFERVJfTEVOR1RIK0VOQ1JZUFRJT05fTUFYX09WRVJIRUFEKSpNQVhfRlJBR01FTlRfQ09VTlQpCi0KLSNkZWZpbmUgc2NyY2xuZwkJCQkJNAkJLy8gb2N0ZXRzIGZvciBjcmMzMiAoRkNTLCBJQ1YpCi0vKiA4MTkwIExvb3BiYWNrIE1vZGUgZGVmaW5pdGlvbiAqLwotdHlwZWRlZiBlbnVtIF9ydGw4MTl4X2xvb3BiYWNrewotCVJUTDgxOVhfTk9fTE9PUEJBQ0sgPSAwLAotCVJUTDgxOVhfTUFDX0xPT1BCQUNLID0gMSwKLQlSVEw4MTlYX0RNQV9MT09QQkFDSyA9IDIsCi0JUlRMODE5WF9DQ0tfTE9PUEJBQ0sgPSAzLAotfXJ0bDgxOXhfbG9vcGJhY2tfZTsKLQotLyogZHVlIHRvIHJ0bDgxOTIgZmlybXdhcmUgKi8KLXR5cGVkZWYgZW51bSBfZGVzY19wYWNrZXRfdHlwZV9lewotCURFU0NfUEFDS0VUX1RZUEVfSU5JVCA9IDAsCi0JREVTQ19QQUNLRVRfVFlQRV9OT1JNQUwgPSAxLAotfWRlc2NfcGFja2V0X3R5cGVfZTsKLQotdHlwZWRlZiBlbnVtIF9maXJtd2FyZV9zdGF0dXN7Ci0JRldfU1RBVFVTXzBfSU5JVCA9IDAsCi0JRldfU1RBVFVTXzFfTU9WRV9CT09UX0NPREUgPSAxLAotCUZXX1NUQVRVU18yX01PVkVfTUFJTl9DT0RFID0gMiwKLQlGV19TVEFUVVNfM19UVVJOT05fQ1BVID0gMywKLQlGV19TVEFUVVNfNF9NT1ZFX0RBVEFfQ09ERSA9IDQsCi0JRldfU1RBVFVTXzVfUkVBRFkgPSA1LAotfWZpcm13YXJlX3N0YXR1c19lOwotCi10eXBlZGVmIHN0cnVjdCBfcnRfZmlybXdhcmV7Ci0JZmlybXdhcmVfc3RhdHVzX2UgZmlybXdhcmVfc3RhdHVzOwotCXUxNgkJICBjbWRwYWNrZXRfZnJhZ190aHJlc29sZDsKLSNkZWZpbmUgUlRMODE5MF9NQVhfRklSTVdBUkVfQ09ERV9TSVpFCTY0MDAwCS8vNjRrCi0jZGVmaW5lIE1BWF9GV19JTklUX1NURVAJCTMKLQl1OAkJICBmaXJtd2FyZV9idWZbTUFYX0ZXX0lOSVRfU1RFUF1bUlRMODE5MF9NQVhfRklSTVdBUkVfQ09ERV9TSVpFXTsKLQl1MTYJCSAgZmlybXdhcmVfYnVmX3NpemVbTUFYX0ZXX0lOSVRfU1RFUF07Ci19cnRfZmlybXdhcmUsICpwcnRfZmlybXdhcmU7Ci0KLSNkZWZpbmUgTUFYX1JFQ0VJVkVfQlVGRkVSX1NJWkUJOTEwMAkvLyBBZGQgdGhpcyB0byA5MTAwIGJ5dGVzIHRvIHJlY2VpdmUgQS1NU0RVIGZyb20gUlQtQVAKLQotLyogRmlybXdhcmUgUXVldWUgTGF5b3V0ICovCi0jZGVmaW5lIE5VTV9PRl9GSVJNV0FSRV9RVUVVRQkJMTAKLSNkZWZpbmUgTlVNX09GX1BBR0VTX0lOX0ZXCQkweDEwMAotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CRQkweDBhYQotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CSwkweDAwNwotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9WSQkweDAyNAotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9WTwkweDAwNwotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9IQ0NBCTAKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQ01ECTB4MgotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9NR05UCTB4MTAKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfSElHSAkwCi0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JDTgkweDQKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfUFVCCTB4ZAotI2RlZmluZSBBUFBMSUVEX1JFU0VSVkVEX1FVRVVFX0lOX0ZXCTB4ODAwMDAwMDAKLSNkZWZpbmUgUlNWRF9GV19RVUVVRV9QQUdFX0JLX1NISUZUCTB4MDAKLSNkZWZpbmUgUlNWRF9GV19RVUVVRV9QQUdFX0JFX1NISUZUCTB4MDgKLSNkZWZpbmUgUlNWRF9GV19RVUVVRV9QQUdFX1ZJX1NISUZUCTB4MTAKLSNkZWZpbmUgUlNWRF9GV19RVUVVRV9QQUdFX1ZPX1NISUZUCTB4MTgKLSNkZWZpbmUgUlNWRF9GV19RVUVVRV9QQUdFX01HTlRfU0hJRlQJMHgxMAotI2RlZmluZSBSU1ZEX0ZXX1FVRVVFX1BBR0VfQ01EX1NISUZUCTB4MDgKLSNkZWZpbmUgUlNWRF9GV19RVUVVRV9QQUdFX0JDTl9TSElGVAkweDAwCi0jZGVmaW5lIFJTVkRfRldfUVVFVUVfUEFHRV9QVUJfU0hJRlQJMHgwOAotCi0jZGVmaW5lIERDQU0gICAgICAgICAgICAgICAgICAgIDB4QUMgICAgICAgICAgICAgICAgICAgIC8vIERlYnVnIENBTSBJbnRlcmZhY2UKLSNkZWZpbmUgQUVTTVNLX0ZDICAgICAgICAgICAgICAgMHhCMiAgICAvLyBBRVMgTWFzayByZWdpc3RlciBmb3IgZnJhbWUgY29udHJvbCAoMHhCMn4weEIzKS4gQWRkZWQgYnkgQW5uaWUsIDIwMDYtMDMtMDYuCi0KLQotI2RlZmluZSBDQU1fQ09OVEVOVF9DT1VOVCAgICAgICA4Ci0jZGVmaW5lIENGR19WQUxJRCAgICAgICAgICAgICAgIEJJVDE1Ci0jZGVmaW5lIEVQUk9NXzkzYzQ2IDAKLSNkZWZpbmUgRVBST01fOTNjNTYgMQotCi0jZGVmaW5lIERFRkFVTFRfRlJBR19USFJFU0hPTEQgMjM0MlUKLSNkZWZpbmUgTUlOX0ZSQUdfVEhSRVNIT0xEICAgICAyNTZVCi0jZGVmaW5lIERFRkFVTFRfQkVBQ09OSU5URVJWQUwgMHg2NFUKLQotI2RlZmluZSBERUZBVUxUX1JFVFJZX1JUUyA3Ci0jZGVmaW5lIERFRkFVTFRfUkVUUllfREFUQSA3Ci0KLSNkZWZpbmUJCVBIWV9SU1NJX1NMSURfV0lOX01BWAkJCQkxMDAKLQotCi10eXBlZGVmIGVudW0gX1dJUkVMRVNTX01PREUgewotCVdJUkVMRVNTX01PREVfVU5LTk9XTiA9IDB4MDAsCi0JV0lSRUxFU1NfTU9ERV9BID0gMHgwMSwKLQlXSVJFTEVTU19NT0RFX0IgPSAweDAyLAotCVdJUkVMRVNTX01PREVfRyA9IDB4MDQsCi0JV0lSRUxFU1NfTU9ERV9BVVRPID0gMHgwOCwKLQlXSVJFTEVTU19NT0RFX05fMjRHID0gMHgxMCwKLQlXSVJFTEVTU19NT0RFX05fNUcgPSAweDIwCi19IFdJUkVMRVNTX01PREU7Ci0KLSNkZWZpbmUgUlRMX0lPQ1RMX1dQQV9TVVBQTElDQU5UCQlTSU9DSVdGSVJTVFBSSVYrMzAKLQotdHlwZWRlZiBzdHJ1Y3QgYnVmZmVyCi17Ci0Jc3RydWN0IGJ1ZmZlciAqbmV4dDsKLQl1MzIgKmJ1ZjsKLQlkbWFfYWRkcl90IGRtYTsKLQotfSBidWZmZXI7Ci0KLXR5cGVkZWYgc3RydWN0IF9ydF85eF90eF9yYXRlX2hpc3RvcnkgewotCXUzMiAgICAgICAgICAgICBjY2tbNF07Ci0JdTMyICAgICAgICAgICAgIG9mZG1bOF07Ci0JLy8gSFRfTUNTWzBdW106IEJXPTAgU0c9MAotCS8vIEhUX01DU1sxXVtdOiBCVz0xIFNHPTAKLQkvLyBIVF9NQ1NbMl1bXTogQlc9MCBTRz0xCi0JLy8gSFRfTUNTWzNdW106IEJXPTEgU0c9MQotCXUzMiAgICAgICAgICAgICBodF9tY3NbNF1bMTZdOwotfXJ0X3R4X3JhaGlzX3QsICpwcnRfdHhfcmFoaXNfdDsKLQotdHlwZWRlZglzdHJ1Y3QgX1JUX1NNT09USF9EQVRBXzRSRiB7Ci0JY2hhcgllbGVtZW50c1s0XVsxMDBdOy8vYXJyYXkgdG8gc3RvcmUgdmFsdWVzCi0JdTMyCWluZGV4OwkJCS8vaW5kZXggdG8gY3VycmVudCBhcnJheSB0byBzdG9yZQotCXUzMglUb3RhbE51bTsJCS8vbnVtIG9mIHZhbGlkIGVsZW1lbnRzCi0JdTMyCVRvdGFsVmFsWzRdOwkJLy9zdW0gb2YgdmFsaWQgZWxlbWVudHMKLX1SVF9TTU9PVEhfREFUQV80UkYsICpQUlRfU01PT1RIX0RBVEFfNFJGOwotCi10eXBlZGVmIGVudW0gX3RhZ19UeENtZF9Db25maWdfSW5kZXh7Ci0JVFhDTURfVFhSQV9ISVNUT1JZX0NUUkwJCQkJPSAweEZGOTAwMDAwLAotCVRYQ01EX1JFU0VUX1RYX1BLVF9CVUZGCQkJCT0gMHhGRjkwMDAwMSwKLQlUWENNRF9SRVNFVF9SWF9QS1RfQlVGRgkJCQk9IDB4RkY5MDAwMDIsCi0JVFhDTURfU0VUX1RYX0RVUkFUSU9OCQkJCT0gMHhGRjkwMDAwMywKLQlUWENNRF9TRVRfUlhfUlNTSQkJCQkJCT0gMHhGRjkwMDAwNCwKLQlUWENNRF9TRVRfVFhfUFdSX1RSQUNLSU5HCQkJPSAweEZGOTAwMDA1LAotCVRYQ01EX1hYWFhfQ1RSTCwKLX1EQ01EX1RYQ01EX09QOwotCi10eXBlZGVmIHN0cnVjdCBTdGF0cwotewotCXVuc2lnbmVkIGxvbmcgcnhyZHU7Ci0JdW5zaWduZWQgbG9uZyByeG9rOwotCXVuc2lnbmVkIGxvbmcgcmVjZWl2ZWRfcmF0ZV9oaXN0b2dyYW1bNF1bMzJdOwkvLzA6IFRvdGFsLCAxOk9LLCAyOkNSQywgMzpJQ1YKLQl1bnNpZ25lZCBsb25nIHJ4b3ZlcmZsb3c7Ci0JdW5zaWduZWQgbG9uZyByeGludDsKLQl1bnNpZ25lZCBsb25nIHR4b3ZlcmZsb3c7Ci0JdW5zaWduZWQgbG9uZyB0eGJlb2tpbnQ7Ci0JdW5zaWduZWQgbG9uZyB0eGJrb2tpbnQ7Ci0JdW5zaWduZWQgbG9uZyB0eHZpb2tpbnQ7Ci0JdW5zaWduZWQgbG9uZyB0eHZvb2tpbnQ7Ci0JdW5zaWduZWQgbG9uZyB0eGJlYWNvbm9raW50OwotCXVuc2lnbmVkIGxvbmcgdHhiZWFjb25lcnI7Ci0JdW5zaWduZWQgbG9uZyB0eG1hbmFnZW9raW50OwotCXVuc2lnbmVkIGxvbmcgdHhjbWRwa3Rva2ludDsKLQl1bnNpZ25lZCBsb25nIHR4ZmVlZGJhY2s7Ci0JdW5zaWduZWQgbG9uZyB0eGZlZWRiYWNrb2s7Ci0JdW5zaWduZWQgbG9uZyB0eG9rdG90YWw7Ci0JdW5zaWduZWQgbG9uZyB0eGJ5dGVzdW5pY2FzdDsKLQl1bnNpZ25lZCBsb25nIHJ4Ynl0ZXN1bmljYXN0OwotCi0JdW5zaWduZWQgbG9uZyBzbGlkZV9zaWduYWxfc3RyZW5ndGhbMTAwXTsKLQl1bnNpZ25lZCBsb25nIHNsaWRlX2V2bVsxMDBdOwotCXVuc2lnbmVkIGxvbmcJc2xpZGVfcnNzaV90b3RhbDsJLy8gRm9yIHJlY29yZGluZyBzbGlkaW5nIHdpbmRvdydzIFJTU0kgdmFsdWUKLQl1bnNpZ25lZCBsb25nIHNsaWRlX2V2bV90b3RhbDsJLy8gRm9yIHJlY29yZGluZyBzbGlkaW5nIHdpbmRvdydzIEVWTSB2YWx1ZQotCWxvbmcgc2lnbmFsX3N0cmVuZ3RoOyAvLyBUcmFuc2Zvcm1lZCwgaW4gZGJtLiBCZWF1dGlmaWVkIHNpZ25hbCBzdHJlbmd0aCBmb3IgVUksIG5vdCBjb3JyZWN0LgotCXU4IHJ4X3Jzc2lfcGVyY2VudGFnZVs0XTsKLQl1OCByeF9ldm1fcGVyY2VudGFnZVsyXTsKLQl1MzIgU2xpZGVfQmVhY29uX3B3ZGJbMTAwXTsKLQl1MzIgU2xpZGVfQmVhY29uX1RvdGFsOwotCVJUX1NNT09USF9EQVRBXzRSRgkJY2NrX2FkY19wd2RiOwotfSBTdGF0czsKLQotCi0vLyBCYW5kd2lkdGggT2Zmc2V0Ci0jZGVmaW5lIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUJCTAKLSNkZWZpbmUgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSCQkJMQotI2RlZmluZSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVIJCQkyCi0KLXR5cGVkZWYgc3RydWN0IAlDaG5sQWNjZXNzU2V0dGluZyB7Ci0JdTE2IFNJRlNfVGltZXI7Ci0JdTE2IERJRlNfVGltZXI7Ci0JdTE2IFNsb3RUaW1lVGltZXI7Ci0JdTE2IEVJRlNfVGltZXI7Ci0JdTE2IENXbWluSW5kZXg7Ci0JdTE2IENXbWF4SW5kZXg7Ci19KlBDSEFOTkVMX0FDQ0VTU19TRVRUSU5HLENIQU5ORUxfQUNDRVNTX1NFVFRJTkc7Ci0KLXR5cGVkZWYgc3RydWN0IF9CQl9SRUdJU1RFUl9ERUZJTklUSU9OewotCXUzMiByZmludGZzOyAJCQkvLyBzZXQgc29mdHdhcmUgY29udHJvbDogLy8JCTB4ODcwfjB4ODc3WzggYnl0ZXNdCi0JdTMyIHJmaW50Zmk7IAkJCS8vIHJlYWRiYWNrIGRhdGE6IC8vCQkweDhlMH4weDhlN1s4IGJ5dGVzXQotCXUzMiByZmludGZvOyAJCQkvLyBvdXRwdXQgZGF0YTogLy8JCTB4ODYwfjB4ODZmIFsxNiBieXRlc10KLQl1MzIgcmZpbnRmZTsgCQkJLy8gb3V0cHV0IGVuYWJsZTogLy8JCTB4ODYwfjB4ODZmIFsxNiBieXRlc10KLQl1MzIgcmYzd2lyZU9mZnNldDsgCQkvLyBMU1NJIGRhdGE6IC8vCQkweDg0MH4weDg0ZiBbMTYgYnl0ZXNdCi0JdTMyIHJmTFNTSV9TZWxlY3Q7IAkJLy8gQkIgQmFuZCBTZWxlY3Q6IC8vCQkweDg3OH4weDg3ZiBbOCBieXRlc10KLQl1MzIgcmZUeEdhaW5TdGFnZTsJCS8vIFR4IGdhaW4gc3RhZ2U6IC8vCQkweDgwY34weDgwZiBbNCBieXRlc10KLQl1MzIgcmZIU1NJUGFyYTE7IAkJLy8gd2lyZSBwYXJhbWV0ZXIgY29udHJvbDEgOiAvLwkJMHg4MjB+MHg4MjMsMHg4Mjh+MHg4MmIsIDB4ODMwfjB4ODMzLCAweDgzOH4weDgzYiBbMTYgYnl0ZXNdCi0JdTMyIHJmSFNTSVBhcmEyOyAJCS8vIHdpcmUgcGFyYW1ldGVyIGNvbnRyb2wyIDogLy8JCTB4ODI0fjB4ODI3LDB4ODJjfjB4ODJmLCAweDgzNH4weDgzNywgMHg4M2N+MHg4M2YgWzE2IGJ5dGVzXQotCXUzMiByZlN3aXRjaENvbnRyb2w7IAkvL1R4IFJ4IGFudGVubmEgY29udHJvbCA6IC8vCQkweDg1OH4weDg1ZiBbMTYgYnl0ZXNdCi0JdTMyIHJmQUdDQ29udHJvbDE7IAkvL0FHQyBwYXJhbWV0ZXIgY29udHJvbDEgOiAvLwkJMHhjNTB+MHhjNTMsMHhjNTh+MHhjNWIsIDB4YzYwfjB4YzYzLCAweGM2OH4weGM2YiBbMTYgYnl0ZXNdCi0JdTMyIHJmQUdDQ29udHJvbDI7IAkvL0FHQyBwYXJhbWV0ZXIgY29udHJvbDIgOiAvLwkJMHhjNTR+MHhjNTcsMHhjNWN+MHhjNWYsIDB4YzY0fjB4YzY3LCAweGM2Y34weGM2ZiBbMTYgYnl0ZXNdCi0JdTMyIHJmUnhJUUltYmFsYW5jZTsgCS8vT0ZETSBSeCBJUSBpbWJhbGFuY2UgbWF0cml4IDogLy8JCTB4YzE0fjB4YzE3LDB4YzFjfjB4YzFmLCAweGMyNH4weGMyNywgMHhjMmN+MHhjMmYgWzE2IGJ5dGVzXQotCXUzMiByZlJ4QUZFOyAgCQkJLy9SeCBJUSBEQyBvZnNldCBhbmQgUnggZGlnaXRhbCBmaWx0ZXIsIFJ4IERDIG5vdGNoIGZpbHRlciA6IC8vCQkweGMxMH4weGMxMywweGMxOH4weGMxYiwgMHhjMjB+MHhjMjMsIDB4YzI4fjB4YzJiIFsxNiBieXRlc10KLQl1MzIgcmZUeElRSW1iYWxhbmNlOyAJLy9PRkRNIFR4IElRIGltYmFsYW5jZSBtYXRyaXggLy8JCTB4YzgwfjB4YzgzLDB4Yzg4fjB4YzhiLCAweGM5MH4weGM5MywgMHhjOTh+MHhjOWIgWzE2IGJ5dGVzXQotCXUzMiByZlR4QUZFOyAJCQkvL1R4IElRIERDIE9mZnNldCBhbmQgVHggREZJUiB0eXBlIC8vCQkweGM4NH4weGM4NywweGM4Y34weGM4ZiwgMHhjOTR+MHhjOTcsIDB4YzljfjB4YzlmIFsxNiBieXRlc10KLQl1MzIgcmZMU1NJUmVhZEJhY2s7IAkvL0xTU0kgUkYgcmVhZGJhY2sgZGF0YSAvLwkJMHg4YTB+MHg4YWYgWzE2IGJ5dGVzXQotfUJCX1JFR0lTVEVSX0RFRklOSVRJT05fVCwgKlBCQl9SRUdJU1RFUl9ERUZJTklUSU9OX1Q7Ci0KLXR5cGVkZWYgc3RydWN0IF9yYXRlX2FkYXB0aXZlCi17Ci0JdTgJCQkJcmF0ZV9hZGFwdGl2ZV9kaXNhYmxlZDsKLQl1OAkJCQlyYXRyX3N0YXRlOwotCXUxNgkJCQlyZXNlcnZlOwotCi0JdTMyCQkJCWhpZ2hfcnNzaV90aHJlc2hfZm9yX3JhOwotCXUzMgkJCQloaWdoMmxvd19yc3NpX3RocmVzaF9mb3JfcmE7Ci0JdTgJCQkJbG93MmhpZ2hfcnNzaV90aHJlc2hfZm9yX3JhNDBNOwotCXUzMgkJCQlsb3dfcnNzaV90aHJlc2hfZm9yX3JhNDBNOwotCXU4CQkJCWxvdzJoaWdoX3Jzc2lfdGhyZXNoX2Zvcl9yYTIwTTsKLQl1MzIJCQkJbG93X3Jzc2lfdGhyZXNoX2Zvcl9yYTIwTTsKLQl1MzIJCQkJdXBwZXJfcnNzaV90aHJlc2hvbGRfcmF0cjsKLQl1MzIJCQkJbWlkZGxlX3Jzc2lfdGhyZXNob2xkX3JhdHI7Ci0JdTMyCQkJCWxvd19yc3NpX3RocmVzaG9sZF9yYXRyOwotCXUzMgkJCQlsb3dfcnNzaV90aHJlc2hvbGRfcmF0cl80ME07Ci0JdTMyCQkJCWxvd19yc3NpX3RocmVzaG9sZF9yYXRyXzIwTTsKLQl1OAkJCQlwaW5nX3Jzc2lfZW5hYmxlOwkvL2Nvc2EgYWRkIGZvciB0ZXN0Ci0JdTMyCQkJCXBpbmdfcnNzaV9yYXRyOwkvL2Nvc2EgYWRkIGZvciB0ZXN0Ci0JdTMyCQkJCXBpbmdfcnNzaV90aHJlc2hfZm9yX3JhOy8vY29zYSBhZGQgZm9yIHRlc3QKLQl1MzIJCQkJbGFzdF9yYXRyOwotCi19IHJhdGVfYWRhcHRpdmUsICpwcmF0ZV9hZGFwdGl2ZTsKLSNkZWZpbmUgVHhCQkdhaW5UYWJsZUxlbmd0aCAzNwotI2RlZmluZQlDQ0tUeEJCR2FpblRhYmxlTGVuZ3RoIDIzCi10eXBlZGVmIHN0cnVjdCBfdHhiYmdhaW5fc3RydWN0Ci17Ci0JbG9uZwl0eGJiX2lxX2FtcGxpZnlnYWluOwotCXUzMgl0eGJiZ2Fpbl92YWx1ZTsKLX0gdHhiYmdhaW5fc3RydWN0LCAqcHR4YmJnYWluX3N0cnVjdDsKLQotdHlwZWRlZiBzdHJ1Y3QgX2Nja3R4YmJnYWluX3N0cnVjdAotewotCS8vVGhlIFZhbHVlIGlzIGZyb20gYTIyIHRvIGEyOSBvbmUgQnl0ZSBvbmUgdGltZSBpcyBtdWNoIFNhZmVyCi0JdTgJY2NrdHhiYl92YWx1ZWFycmF5WzhdOwotfSBjY2t0eGJiZ2Fpbl9zdHJ1Y3QsKnBjY2t0eGJiZ2Fpbl9zdHJ1Y3Q7Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgX2luaXRfZ2FpbgotewotCXU4CQkJCXhhYWdjY29yZTE7Ci0JdTgJCQkJeGJhZ2Njb3JlMTsKLQl1OAkJCQl4Y2FnY2NvcmUxOwotCXU4CQkJCXhkYWdjY29yZTE7Ci0JdTgJCQkJY2NhOwotCi19IGluaXRfZ2FpbiwgKnBpbml0X2dhaW47Ci0KLS8qIDIwMDcvMTEvMDIgTUggRGVmaW5lIFJGIG1vZGUgdGVtcG9yYXJpbHkgZm9yIHRlc3QuICovCi10eXBlZGVmIGVudW0gdGFnX1JmX09wZXJhdGV0aW9uX1N0YXRlCi17Ci0gICAgUkZfU1RFUF9JTklUID0gMCwKLSAgICBSRl9TVEVQX05PUk1BTCwKLSAgICBSRl9TVEVQX01BWAotfVJGX1NURVBfRTsKLQotdHlwZWRlZiBlbnVtIF9SVF9TVEFUVVN7Ci0JUlRfU1RBVFVTX1NVQ0NFU1MsCi0JUlRfU1RBVFVTX0ZBSUxVUkUsCi0JUlRfU1RBVFVTX1BFTkRJTkcsCi0JUlRfU1RBVFVTX1JFU09VUkNFCi19UlRfU1RBVFVTLCpQUlRfU1RBVFVTOwotCi10eXBlZGVmIGVudW0gX1JUX0NVU1RPTUVSX0lECi17Ci0JUlRfQ0lEX0RFRkFVTFQgPSAwLAotCVJUX0NJRF84MTg3X0FMUEhBMCA9IDEsCi0JUlRfQ0lEXzgxODdfU0VSQ09NTV9QUyA9IDIsCi0JUlRfQ0lEXzgxODdfSFdfTEVEID0gMywKLQlSVF9DSURfODE4N19ORVRHRUFSID0gNCwKLQlSVF9DSURfV0hRTCA9IDUsCi0JUlRfQ0lEXzgxOXhfQ0FNRU8gID0gNiwKLQlSVF9DSURfODE5eF9SVU5UT1AgPSA3LAotCVJUX0NJRF84MTl4X1NlbmFvID0gOCwKLQlSVF9DSURfVE9TSElCQSA9IDksCS8vIE1lcmdlIGJ5IEphY2tlbiwgMjAwOC8wMS8zMS4KLQlSVF9DSURfODE5eF9OZXRjb3JlID0gMTAsCi0JUlRfQ0lEX05ldHRyb25peCA9IDExLAotCVJUX0NJRF9ETElOSyA9IDEyLAotCVJUX0NJRF9QUk9ORVQgPSAxMywKLQlSVF9DSURfQ09SRUdBID0gMTQsCi19UlRfQ1VTVE9NRVJfSUQsICpQUlRfQ1VTVE9NRVJfSUQ7Ci0KLS8qIExFRCBjdXN0b21pemF0aW9uLiAqLwotCi10eXBlZGVmCWVudW0gX0xFRF9TVFJBVEVHWV84MTkwewotCVNXX0xFRF9NT0RFMCwgLy8gU1cgY29udHJvbCAxIExFRCB2aWEgR1BJTzAuIEl0IGlzIGRlZmF1bHQgb3B0aW9uLgotCVNXX0xFRF9NT0RFMSwgLy8gU1cgY29udHJvbCBmb3IgUENJIEV4cHJlc3MKLQlTV19MRURfTU9ERTIsIC8vIFNXIGNvbnRyb2wgZm9yIENhbWVvLgotCVNXX0xFRF9NT0RFMywgLy8gU1cgY29udG9ybCBmb3IgUnVuVG9wLgotCVNXX0xFRF9NT0RFNCwgLy8gU1cgY29udHJvbCBmb3IgTmV0Y29yZQotCVNXX0xFRF9NT0RFNSwgLy9hZGRlZCBieSB2aXZpLCBmb3IgbGVkIG5ldyBtb2RlLCBETElOSwotCVNXX0xFRF9NT0RFNiwgLy9hZGRlZCBieSB2aXZpLCBmb3IgbGVkIG5ldyBtb2RlLCBQUk9ORVQKLQlIV19MRUQsIC8vIEhXIGNvbnRyb2wgMiBMRURzLCBMRUQwIGFuZCBMRUQxICh0aGVyZSBhcmUgNCBkaWZmZXJlbnQgY29udHJvbCBtb2RlcykKLX1MRURfU1RSQVRFR1lfODE5MCwgKlBMRURfU1RSQVRFR1lfODE5MDsKLQotI2RlZmluZSBDSEFOTkVMX1BMQU5fTEVOCQkJCTEwCi0KLSNkZWZpbmUgc0NyY0xuZyAJCTQKLQotdHlwZWRlZiBzdHJ1Y3QgX1RYX0ZXSU5GT19TVFJVQ1VUUkV7Ci0JLy9ET1dSRCAwCi0JdTgJCQlUeFJhdGU6NzsKLQl1OAkJCUN0c0VuYWJsZToxOwotCXU4CQkJUnRzUmF0ZTo3OwotCXU4CQkJUnRzRW5hYmxlOjE7Ci0JdTgJCQlUeEhUOjE7Ci0JdTgJCQlTaG9ydDoxOwotCXU4CQkJVHhCYW5kd2lkdGg6MTsKLQl1OAkJCVR4U3ViQ2FycmllcjoyOwotCXU4CQkJU1RCQzoyOwotCXU4CQkJQWxsb3dBZ2dyZWdhdGlvbjoxOwotCXU4CQkJUnRzSFQ6MTsKLQl1OAkJCVJ0c1Nob3J0OjE7Ci0JdTgJCQlSdHNCYW5kd2lkdGg6MTsKLQl1OAkJCVJ0c1N1YmNhcnJpZXI6MjsKLQl1OAkJCVJ0c1NUQkM6MjsKLQl1OAkJCUVuYWJsZUNQVUR1cjoxOwotCi0JLy9EV09SRCAxCi0JdTMyCQkJUnhNRjoyOwotCXUzMgkJCVJ4QU1EOjM7Ci0JdTMyCQkJUmVzZXJ2ZWQxOjM7Ci0JdTMyCQkJVHhBR0NPZmZzZXQ6NDsKLQl1MzIJCQlUeEFHQ1NpZ246MTsKLQl1MzIJCQlUeF9JTkZPX1JTVkQ6NjsKLQl1MzIJCQlQYWNrZXRJRDoxMzsKLX1UWF9GV0lORk9fVDsKLQotCi10eXBlZGVmIHN0cnVjdCBfVFhfRldJTkZPXzgxOTBQQ0l7Ci0JLy9ET1dSRCAwCi0JdTgJCQlUeFJhdGU6NzsKLQl1OAkJCUN0c0VuYWJsZToxOwotCXU4CQkJUnRzUmF0ZTo3OwotCXU4CQkJUnRzRW5hYmxlOjE7Ci0JdTgJCQlUeEhUOjE7Ci0JdTgJCQlTaG9ydDoxOwkJCQkJCS8vU2hvcnQgUExDUCBmb3IgQ0NLLCBvciBzaG9ydCBHSSBmb3IgMTFuIE1DUwotCXU4CQkJVHhCYW5kd2lkdGg6MTsJCQkJLy8gVGhpcyBpcyB1c2VkIGZvciBIVCBNQ1MgcmF0ZSBvbmx5LgotCXU4CQkJVHhTdWJDYXJyaWVyOjI7IAkJCS8vIFRoaXMgaXMgdXNlZCBmb3IgbGVnYWN5IE9GRE0gcmF0ZSBvbmx5LgotCXU4CQkJU1RCQzoyOwotCXU4CQkJQWxsb3dBZ2dyZWdhdGlvbjoxOwotCXU4CQkJUnRzSFQ6MTsJCQkJCQkvL0ludGVycHJlIFJ0c1JhdGUgZmllbGQgYXMgaGlnaCB0aHJvdWdocHV0IGRhdGEgcmF0ZQotCXU4CQkJUnRzU2hvcnQ6MTsgCQkJCS8vU2hvcnQgUExDUCBmb3IgQ0NLLCBvciBzaG9ydCBHSSBmb3IgMTFuIE1DUwotCXU4CQkJUnRzQmFuZHdpZHRoOjE7IAkJCS8vIFRoaXMgaXMgdXNlZCBmb3IgSFQgTUNTIHJhdGUgb25seS4KLQl1OAkJCVJ0c1N1YmNhcnJpZXI6MjsJCQkJLy8gVGhpcyBpcyB1c2VkIGZvciBsZWdhY3kgT0ZETSByYXRlIG9ubHkuCi0JdTgJCQlSdHNTVEJDOjI7Ci0JdTgJCQlFbmFibGVDUFVEdXI6MTsgCQkJLy9FbmFibGUgZmlybXdhcmUgdG8gcmVjYWxjdWxhdGUgYW5kIGFzc2lnbiBwYWNrZXQgZHVyYXRpb24KLQotCS8vRFdPUkQgMQotCXUzMgkJCVJ4TUY6MjsKLQl1MzIJCQlSeEFNRDozOwotCXUzMgkJCVR4UGVyUGt0SW5mb0ZlZWRiYWNrOjE7IAkvLyAxOiBpbmRpY2F0ZSB0aGF0IHRoZSB0cmFuc2ltaXNzaW9uIGluZm8gb2YgdGhpcyBwYWNrZXQgc2hvdWxkIGJlIGdhdGhlcmVkIGJ5IEZpcm13YXJlIGFuZCByZXR1cmVkIGJ5IFJ4IENtZC4KLQl1MzIJCQlSZXNlcnZlZDE6MjsKLQl1MzIJCQlUeEFHQ09mZnNldDo0OwkJLy8gT25seSA5MCBzdXBwb3J0Ci0JdTMyCQkJVHhBR0NTaWduOjE7CQkvLyBPbmx5IDkwIHN1cHBvcnQKLQl1MzIJCQlSQVdfVFhEOjE7CQkJLy8gTUFDIHdpbGwgc2VuZCBkYXRhIGluIHR4cGt0YnVmZmVyIHdpdGhvdXQgYW55IHByb2Nlc3Npbmcsc3VjaCBhcyBDUkMgY2hlY2sKLQl1MzIJCQlSZXRyeV9MaW1pdDo0OwkJLy8gQ0NYIFN1cHBvcnQgcmVsYXRpdmUgcmV0cnkgbGltaXQgRlcgcGFnZSBvbmx5IHN1cHBvcnQgNCBiaXRzIG5vdy4KLQl1MzIJCQlSZXNlcnZlZDI6MTsKLQl1MzIJCQlQYWNrZXRJRDoxMzsKLQotCS8vIERXIDIKLQotfVRYX0ZXSU5GT184MTkwUENJLCAqUFRYX0ZXSU5GT184MTkwUENJOwotCi10eXBlZGVmIHN0cnVjdCBfcGh5X29mZG1fcnhfc3RhdHVzX3JlcG9ydF84MTl4cGNpCi17Ci0JdTgJdHJzd19nYWluX1hbNF07Ci0JdTgJcHdkYl9hbGw7Ci0JdTgJY2Zvc2hvX1hbNF07Ci0JdTgJY2ZvdGFpbF9YWzRdOwotCXU4CXJ4ZXZtX1hbMl07Ci0JdTgJcnhzbnJfWFs0XTsKLQl1OAlwZHNucl9YWzJdOwotCXU4CWNzaV9jdXJyZW50X1hbMl07Ci0JdTgJY3NpX3RhcmdldF9YWzJdOwotCXU4CXNpZ2V2bTsKLQl1OAltYXhfZXhfcHdyOwotCXU4CXNnaV9lbjsKLQl1OAlyeHNjX3NnaWVuX2V4ZmxnOwotfXBoeV9zdHNfb2ZkbV84MTl4cGNpX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IF9waHlfY2NrX3J4X3N0YXR1c19yZXBvcnRfODE5eHBjaQotewotCS8qIEZvciBDQ0sgcmF0ZSBkZXNjcmlwdG9yLiBUaGlzIGlzIGEgdW5zaWduZWQgODoxIHZhcmlhYmxlLiBMU0IgYml0IHByZXNlbmQKLQkgICAwLjUuIEFuZCBNU0IgNyBidHMgcHJlc2VuZCBhIHNpZ25lZCB2YWx1ZS4gUmFuZ2UgZnJvbSAtNjR+KzYzLjUuICovCi0JdTgJYWRjX3B3ZGJfWFs0XTsKLQl1OAlzcV9ycHQ7Ci0JdTgJY2NrX2FnY19ycHQ7Ci19cGh5X3N0c19jY2tfODE5eHBjaV90OwotCi10eXBlZGVmIHN0cnVjdCBfcGh5X29mZG1fcnhfc3RhdHVzX3J4c2Nfc2dpZW5fZXhpbnRmZmxhZ3sKLQl1OAkJCXJlc2VydmVkOjQ7Ci0JdTgJCQlyeHNjOjI7Ci0JdTgJCQlzZ2lfZW46MTsKLQl1OAkJCWV4X2ludGZfZmxhZzoxOwotfXBoeV9vZmRtX3J4X3N0YXR1c19yeHNjX3NnaWVuX2V4aW50ZmZsYWc7Ci0KLXR5cGVkZWYgZW51bSBfUlRfT1BfTU9ERXsKLQlSVF9PUF9NT0RFX0FQLAotCVJUX09QX01PREVfSU5GUkFTVFJVQ1RVUkUsCi0JUlRfT1BfTU9ERV9JQlNTLAotCVJUX09QX01PREVfTk9fTElOSywKLX1SVF9PUF9NT0RFLCAqUFJUX09QX01PREU7Ci0KLQotLyogMjAwNy8xMS8wMiBNSCBEZWZpbmUgUkYgbW9kZSB0ZW1wb3JhcmlseSBmb3IgdGVzdC4gKi8KLXR5cGVkZWYgZW51bSB0YWdfUmZfT3BUeXBlCi17Ci0gICAgUkZfT1BfQnlfU1dfM3dpcmUgPSAwLAotICAgIFJGX09QX0J5X0ZXLAotICAgIFJGX09QX01BWAotfVJGX09wVHlwZV9FOwotCi10eXBlZGVmIGVudW0gX1JFU0VUX1RZUEUgewotCVJFU0VUX1RZUEVfTk9SRVNFVCA9IDB4MDAsCi0JUkVTRVRfVFlQRV9OT1JNQUwgPSAweDAxLAotCVJFU0VUX1RZUEVfU0lMRU5UID0gMHgwMgotfSBSRVNFVF9UWVBFOwotCi10eXBlZGVmIHN0cnVjdCBfdHhfcmluZ3sKLQl1MzIgKiBkZXNjOwotCXU4IG5TdHVja0NvdW50OwotCXN0cnVjdCBfdHhfcmluZyAqIG5leHQ7Ci19X19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHR4X3JpbmcsICogcHR4X3Jpbmc7Ci0KLXN0cnVjdCBydGw4MTkyX3R4X3JpbmcgewotICAgIHR4X2Rlc2NfODE5eF9wY2kgKmRlc2M7Ci0gICAgZG1hX2FkZHJfdCBkbWE7Ci0gICAgdW5zaWduZWQgaW50IGlkeDsKLSAgICB1bnNpZ25lZCBpbnQgZW50cmllczsKLSAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHF1ZXVlOwotfTsKLQotI2RlZmluZSBOSUNfU0VORF9IQU5HX1RIUkVTSE9MRF9OT1JNQUwJCTQKLSNkZWZpbmUgTklDX1NFTkRfSEFOR19USFJFU0hPTERfUE9XRVJTQVZFIAk4Ci0jZGVmaW5lIE1BWF9UWF9RVUVVRQkJCQk5CS8vIEJLLCBCRSwgVkksIFZPLCBIQ0NBLCBNQU5BR0VNRU5ULCBDT01NQU5ELCBISUdILCBCRUFDT04uCi0KLSNkZWZpbmUgTUFYX1JYX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0Ci0jZGVmaW5lIE1BWF9UWF9RVUVVRV9DT1VOVCAgICAgICAgICAgICAgICAgICAgICA5Ci0KLXR5cGVkZWYgc3RydWN0IHI4MTkyX3ByaXYKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKLQl1OCAqbWVtX3N0YXJ0OwotCi0JLyogbWFpbnRhaW4gaW5mbyBmcm9tIGVlcHJvbSAqLwotCXNob3J0IGVwcm9tdHlwZTsKLQl1MTYgZWVwcm9tX3ZpZDsKLQl1MTYgZWVwcm9tX2RpZDsKLQl1OCAgZWVwcm9tX0N1c3RvbWVySUQ7Ci0JdTE2ICBlZXByb21fQ2hhbm5lbFBsYW47Ci0JUlRfQ1VTVE9NRVJfSUQgQ3VzdG9tZXJJRDsKLQl1OAlJQ19DdXQ7Ci0JaW50IGlycTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTgwMjExOwotI2lmZGVmIEVOQUJMRV9MUFMKLQlib29sIHBzX2ZvcmNlOwotCWJvb2wgZm9yY2VfbHBzOwotCWJvb2wgYmRpc2FibGVfbmljOwotI2VuZGlmCi0JYm9vbCBiZWluZ19pbml0X2FkYXB0ZXI7Ci0JdTggUmZfTW9kZTsKLQl1OCBjYXJkXzgxOTJfdmVyc2lvbjsgLyogaWYgVENSIHJlcG9ydHMgY2FyZCBWIEIvQyB0aGlzIGRpc2NyaW1pbmF0ZXMgKi8KLQlzcGlubG9ja190IGlycV90aF9sb2NrOwotCXNwaW5sb2NrX3QgcmZfcHNfbG9jazsKLSAgICAgICAgc3RydWN0IG11dGV4IG11dGV4OwotCi0Jc2hvcnQgY2hhbjsKLQlzaG9ydCBzZW5zOwotCS8qIFJYIHN0dWZmICovCi0gICAgICAgIHJ4X2Rlc2NfODE5eF9wY2kgKnJ4X3Jpbmc7Ci0gICAgICAgIGRtYV9hZGRyX3QgcnhfcmluZ19kbWE7Ci0gICAgICAgIHVuc2lnbmVkIGludCByeF9pZHg7Ci0gICAgICAgIHN0cnVjdCBza19idWZmICpyeF9idWZbTUFYX1JYX0NPVU5UXTsKLQlpbnQgcnhyaW5nY291bnQ7Ci0JdTE2IHJ4YnVmZmVyc2l6ZTsKLQotCS8qIFRYIHN0dWZmICovCi0gICAgICAgIHN0cnVjdCBydGw4MTkyX3R4X3JpbmcgdHhfcmluZ1tNQVhfVFhfUVVFVUVfQ09VTlRdOwotCWludCB0eHJpbmdjb3VudDsKLQotCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBpcnFfcnhfdGFza2xldDsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgaXJxX3R4X3Rhc2tsZXQ7Ci0gICAgICAgIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCBpcnFfcHJlcGFyZV9iZWFjb25fdGFza2xldDsKLQotCXNob3J0IHVwOwotCXNob3J0IGNyY21vbjsgLy9pZiAxIGFsbG93IGJhZCBjcmMgZnJhbWUgcmVjZXB0aW9uIGluIG1vbml0b3IgbW9kZQotCXN0cnVjdCBzZW1hcGhvcmUgd3hfc2VtOwotCXN0cnVjdCBzZW1hcGhvcmUgcmZfc2VtOyAvL3VzZWQgdG8gbG9jayByZiB3cml0ZSBvcGVyYXRpb24gYWRkZWQgYnkgd2IsIG1vZGlmaWVkIGJ5IGRhdmlkCi0JdTggcmZfdHlwZTsgLyogMCBtZWFucyAxVDJSLCAxIG1lYW5zIDJUNFIgKi8KLQotCXNob3J0ICgqcmZfc2V0X3NlbnMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IHNlbnMpOwotCXU4ICgqcmZfc2V0X2NoYW4pKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTEsIHU4IGNoKTsKLQlzaG9ydCBwcm9taXNjOwotCS8qIHN0YXRzICovCi0Jc3RydWN0IFN0YXRzIHN0YXRzOwotCXN0cnVjdCBpd19zdGF0aXN0aWNzIHdzdGF0czsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRpcl9kZXY7Ci0Jc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyBwcmV2aW91c19zdGF0czsKLQotCS8qIFJYIHN0dWZmICovCi0Jc3RydWN0IHNrX2J1ZmZfaGVhZCBza2JfcXVldWU7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHFvc19hY3RpdmF0ZTsKLQotCS8vMiBUeCBSZWxhdGVkIHZhcmlhYmxlcwotCXUxNglTaG9ydFJldHJ5TGltaXQ7Ci0JdTE2CUxvbmdSZXRyeUxpbWl0OwotCi0JdTMyICAgICBMYXN0UnhEZXNjVFNGSGlnaDsKLQl1MzIgICAgIExhc3RSeERlc2NUU0ZMb3c7Ci0KLQotCS8vMiBSeCBSZWxhdGVkIHZhcmlhYmxlcwotCXUzMglSZWNlaXZlQ29uZmlnOwotCi0JdTggcmV0cnlfZGF0YTsKLQl1OCByZXRyeV9ydHM7Ci0KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmVzZXRfd3E7Ci0JdTgJcnhfY2hrX2NudDsKLQotLy9mb3IgcnRsODE5eFBjaQotCS8vIERhdGEgUmF0ZSBDb25maWcuIEFkZGVkIGJ5IEFubmllLCAyMDA2LTA0LTEzLgotCXUxNgliYXNpY19yYXRlOwotCXU4CXNob3J0X3ByZWFtYmxlOwotCXU4IAlzbG90X3RpbWU7Ci0JdTE2IFNpZnNUaW1lOwotLyogV2lyZWxlc3NNb2RlKi8KLQl1OCBSZWdXaXJlbGVzc01vZGU7Ci0vKkZpcm13YXJlKi8KLQlwcnRfZmlybXdhcmUJCXBGaXJtd2FyZTsKLQlydGw4MTl4X2xvb3BiYWNrX2UJTG9vcGJhY2tNb2RlOwotCWJvb2wgQXV0b2xvYWRGYWlsRmxhZzsKLQl1MTYgRUVQUk9NQW50UHdEaWZmOwkJLy8gQW50ZW5uYSBnYWluIG9mZnNldCBmcm9tIEIvQy9EIHRvIEEKLQl1OCBFRVBST01UaGVybWFsTWV0ZXI7Ci0JdTggRUVQUk9NQ3J5c3RhbENhcDsKLQl1OCBFRVBST01UeFBvd2VyTGV2ZWxDQ0tbMTRdOy8vIENDSyBjaGFubmVsIDF+MTQKLQkvLyBUaGUgZm9sbG93aW5nIGRlZmluaXRpb24gaXMgZm9yIGVlcHJvbSA5M2M1NgotCXU4IEVFUFJPTVJmQUNDS0NobmwxVHhQd0xldmVsWzNdOwkvL1JGLUEgQ0NLIFR4IFBvd2VyIExldmVsIGF0IGNoYW5uZWwgNwotCXU4IEVFUFJPTVJmQU9mZG1DaG5sVHhQd0xldmVsWzNdOy8vUkYtQSBDQ0sgVHggUG93ZXIgTGV2ZWwgYXQgWzBdLFsxXSxbMl0gPSBjaGFubmVsIDEsNywxMwotCXU4IEVFUFJPTVJmQ0NDS0NobmwxVHhQd0xldmVsWzNdOwkvL1JGLUMgQ0NLIFR4IFBvd2VyIExldmVsIGF0IGNoYW5uZWwgNwotCXU4IEVFUFJPTVJmQ09mZG1DaG5sVHhQd0xldmVsWzNdOy8vUkYtQyBDQ0sgVHggUG93ZXIgTGV2ZWwgYXQgWzBdLFsxXSxbMl0gPSBjaGFubmVsIDEsNywxMwotCXU4IEVFUFJPTVR4UG93ZXJMZXZlbE9GRE0yNEdbMTRdOyAvLyBPRkRNIDIuNEcgY2hhbm5lbCAxfjE0Ci0JdTggRUVQUk9NTGVnYWN5SFRUeFBvd2VyRGlmZjsJLy8gTGVnYWN5IHRvIEhUIHJhdGUgcG93ZXIgZGlmZgotCWJvb2wgYlRYUG93ZXJEYXRhUmVhZEZyb21FRVBPUk07Ci0vKmNoYW5uZWwgcGxhbiovCi0JdTE2IFJlZ0NoYW5uZWxQbGFuOyAvLyBDaGFubmVsIFBsYW4gc3BlY2lmZWQgYnkgdXNlciwgMTU6IGZvbGxvd2luZyBzZXR0aW5nIG9mIEVFUFJPTSwgMC0xNDogZGVmYXVsdCBjaGFubmVsIHBsYW4gaW5kZXggc3BlY2lmaWVkIGJ5IHVzZXIuCi0JdTE2IENoYW5uZWxQbGFuOwotLypQUyByZWxhdGVkKi8KLQkvLyBSZiBvZmYgYWN0aW9uIGZvciBwb3dlciBzYXZlCi0JdTgJYkh3UmZPZmZBY3Rpb247CS8vMDpObyBhY3Rpb24sIDE6QnkgR1BJTywgMjpCeSBEaXNhYmxlCi0vKlBIWSByZWxhdGVkKi8KLQlCQl9SRUdJU1RFUl9ERUZJTklUSU9OX1QJUEhZUmVnRGVmWzRdOwkvL1JhZGlvIEEvQi9DL0QKLQkvLyBSZWFkL3dyaXRlIGFyZSBhbGxvdyBmb3IgZm9sbG93aW5nIGhhcmR3YXJlIGluZm9ybWF0aW9uIHZhcmlhYmxlcwotCXUzMglNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFs2XTsKLQl1MzIJQ0NLVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXQ7Ci0JdTgJVHhQb3dlckxldmVsQ0NLWzE0XTsJCQkvLyBDQ0sgY2hhbm5lbCAxfjE0Ci0JdTgJVHhQb3dlckxldmVsQ0NLX0FbMTRdOwkJCS8vIFJGLUEsIENDSyBjaGFubmVsIDF+MTQKLQl1OCAJVHhQb3dlckxldmVsQ0NLX0NbMTRdOwotCXU4CVR4UG93ZXJMZXZlbE9GRE0yNEdbMTRdOwkJLy8gT0ZETSAyLjRHIGNoYW5uZWwgMX4xNAotCXU4CVR4UG93ZXJMZXZlbE9GRE01R1sxNF07CQkJLy8gT0ZETSA1RwotCXU4CVR4UG93ZXJMZXZlbE9GRE0yNEdfQVsxNF07CS8vIFJGLUEsIE9GRE0gMi40RyBjaGFubmVsIDF+MTQKLQl1OAlUeFBvd2VyTGV2ZWxPRkRNMjRHX0NbMTRdOwkvLyBSRi1DLCBPRkRNIDIuNEcgY2hhbm5lbCAxfjE0Ci0JdTgJTGVnYWN5SFRUeFBvd2VyRGlmZjsJCQkvLyBMZWdhY3kgdG8gSFQgcmF0ZSBwb3dlciBkaWZmCi0JdTgJQW50ZW5uYVR4UHdEaWZmWzNdOwkJCQkvLyBBbnRlbm5hIGdhaW4gb2Zmc2V0LCBpbmRleCAwIGZvciBCLCAxIGZvciBDLCBhbmQgMiBmb3IgRAotCXU4CUNyeXN0YWxDYXA7CQkJCQkJLy8gQ3J5c3RhbENhcC4KLQl1OAlUaGVybWFsTWV0ZXJbMl07CQkJCS8vIFRoZXJtYWxNZXRlciwgaW5kZXggMCBmb3IgUkZJQzAsIGFuZCAxIGZvciBSRklDMQotCS8vMDUvMjcvMjAwOCBjY2sgcG93ZXIgZW5sYXJnZQotCXU4CUNja1B3RW5sOwotCXUxNglUU1NJXzEzZEJtOwotCXUzMiAJUHdyX1RyYWNrOwotCXU4CQkJCUNDS1ByZXNlbnRBdHRlbnR1YXRpb25fMjBNZGVmYXVsdDsKLQl1OAkJCQlDQ0tQcmVzZW50QXR0ZW50dWF0aW9uXzQwTWRlZmF1bHQ7Ci0JY2hhcgkJCQlDQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2U7Ci0JY2hhcgkJCQlDQ0tQcmVzZW50QXR0ZW50dWF0aW9uOwotCS8vIFVzZSB0byBjYWxjdWxhdGUgUFdCRC4KLQlSVF9SRl9QT1dFUl9TVEFURQkJZVJGUG93ZXJTdGF0ZTsKLQlSVF9SRl9DSEFOR0VfU09VUkNFCVJmT2ZmUmVhc29uOwotCVJUX1BPV0VSX1NBVkVfQ09OVFJPTAlQb3dlclNhdmVDb250cm9sOwotCXU4CWJDY2tIaWdoUG93ZXI7Ci0JbG9uZwl1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiOwotCWxvbmcJdW5kZWNvcmF0ZWRfc21vb3RoZWRfY2NrX2FkY19wd2RiWzRdOwotCS8vZm9yIHNldCBjaGFubmVsCi0JdTgJU3dDaG5sSW5Qcm9ncmVzczsKLQl1OCAJU3dDaG5sU3RhZ2U7Ci0JdTgJU3dDaG5sU3RlcDsKLQl1OAlTZXRCV01vZGVJblByb2dyZXNzOwotCUhUX0NIQU5ORUxfV0lEVEgJCUN1cnJlbnRDaGFubmVsQlc7Ci0KLQkvLyA4MTkwIDQwTUh6IG1vZGUKLQkvLwotCXU4CW5DdXI0ME1oelByaW1lU0M7CS8vIENvbnRyb2wgY2hhbm5lbCBzdWItY2FycmllcgotCS8vIEpvc2VwaCB0ZXN0IGZvciBzaG9ydGVuIFJGIGNvbmZpZ3VyYXRpb24gdGltZS4KLQkvLyBXZSBzYXZlIFJGIHJlZzAgaW4gdGhpcyB2YXJpYWJsZSB0byByZWR1Y2UgUkYgcmVhZGluZy4KLQkvLwotCXUzMgkJCQkJUmZSZWcwVmFsdWVbNF07Ci0JdTggCQkJCQlOdW1Ub3RhbFJGUGF0aDsKLQlib29sIAkJCQlicmZwYXRoX3J4ZW5hYmxlWzRdOwotLy8rYnkgYW15IDA4MDUwNwotCXN0cnVjdCB0aW1lcl9saXN0IHdhdGNoX2RvZ190aW1lcjsKLQl1OCB3YXRjaGRvZ19sYXN0X3RpbWU7Ci0JdTggd2F0Y2hkb2dfY2hlY2tfcmVzZXRfY250OwotCi0vLytieSBhbXkgMDgwNTE1IGZvciBkeW5hbWljIG1lY2hlbmlzbQotCS8vQWRkIGJ5IGFteSBUeCBQb3dlciBDb250cm9sIGZvciBOZWFyL0ZhciBSYW5nZSAyMDA4LzA1LzE1Ci0JYm9vbAliRHluYW1pY1R4SGlnaFBvd2VyOyAgLy8gVHggaGlnaCBwb3dlciBzdGF0ZQotCWJvb2wJYkR5bmFtaWNUeExvd1Bvd2VyOyAgLy8gVHggbG93IHBvd2VyIHN0YXRlCi0JYm9vbAliTGFzdERUUEZsYWdfSGlnaDsKLQlib29sCWJMYXN0RFRQRmxhZ19Mb3c7Ci0KLQkvKiBPRkRNIFJTU0kuIEZvciBoaWdoIHBvd2VyIG9yIG5vdCAqLwotCXU4CXBoeV9jaGVja19yZWc4MjQ7Ci0JdTMyCXBoeV9yZWc4MjRfYml0OTsKLQotCS8vQWRkIGJ5IGFteSBmb3IgUmF0ZSBBZGFwdGl2ZQotCXJhdGVfYWRhcHRpdmUgcmF0ZV9hZGFwdGl2ZTsKLQkvL0FkZCBieSBhbXkgZm9yIFRYIHBvd2VyIHRyYWNraW5nCi0JLy8yMDA4LzA1LzE1ICBNYXJzIE9QRU4vQ0xPU0UgVFggUE9XRVIgVFJBQ0tJTkcKLQljb25zdCB0eGJiZ2Fpbl9zdHJ1Y3QgKiB0eGJiZ2Fpbl90YWJsZTsKLQl1OAkJCSAgIHR4cG93ZXJfY291bnQ7Ly9Gb3IgNiBzZWMgZG8gdHJhY2tpbmcgYWdhaW4KLQlib29sCQkJICAgYnR4cG93ZXJfdHJhY2tpbmdJbml0OwotCXU4CQkJICAgT0ZETV9pbmRleDsKLQl1OAkJCSAgIENDS19pbmRleDsKLQl1OAkJCSAgIFJlY29yZF9DQ0tfMjBNaW5kZXg7Ci0JdTgJCQkgICBSZWNvcmRfQ0NLXzQwTWluZGV4OwotCS8vMjAwNy8wOS8xMCBNYXJzIEFkZCBDQ0sgVFggUG93ZXIgVHJhY2tpbmcKLQljb25zdCBjY2t0eGJiZ2Fpbl9zdHJ1Y3QgKmNja190eGJiZ2Fpbl90YWJsZTsKLQljb25zdCBjY2t0eGJiZ2Fpbl9zdHJ1Y3QgKmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlOwotCXU4IHJmYV90eHBvd2VydHJhY2tpbmdpbmRleDsKLQl1OCByZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbDsKLQl1OCByZmFfdHhwb3dlcnRyYWNraW5nX2RlZmF1bHQ7Ci0JdTggcmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4OwotCXU4IHJmY190eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsOwotCXU4IHJmY190eHBvd2VydHJhY2tpbmdfZGVmYXVsdDsKLQlib29sIGJ0eHBvd2VyX3RyYWNraW5nOwotCWJvb2wgYmNja19pbl9jaDE0OwotCi0JLy9Gb3IgQmFja3VwIEluaXRpYWwgR2FpbgotCWluaXRfZ2FpbiBpbml0Z2Fpbl9iYWNrdXA7Ci0JdTggCQlEZWZhdWx0SW5pdGlhbEdhaW5bNF07Ci0JLy8gRm9yIEVEQ0EgVHVyYm8gbW9kZSwgQWRkZWQgYnkgYW15IDA4MDUxNS4KLQlib29sCQliaXNfYW55X25vbmJlcGt0czsKLQlib29sCQliY3VycmVudF90dXJib19FRENBOwotCi0JYm9vbAkJYmlzX2N1cl9yZGxzdGF0ZTsKLQlzdHJ1Y3QgdGltZXJfbGlzdCBmc3luY190aW1lcjsKLQl1MzIgCXJhdGVfcmVjb3JkOwotCXUzMiAJcmF0ZUNvdW50RGlmZlJlY29yZDsKLQl1MzIJQ29udGl1bmVEaWZmQ291bnQ7Ci0JYm9vbCBic3dpdGNoX2ZzeW5jOwotCi0JdTgJZnJhbWVzeW5jOwotCXUzMiAJZnJhbWVzeW5jQzM0OwotCXU4ICAgCWZyYW1lc3luY01vbml0b3I7Ci0KLQkvL2J5IGFteSBmb3IgZ3BpbwotCWJvb2wgYkh3UmFkaW9PZmY7Ci0JLy9ieSBhbXkgZm9yIHBzCi0JUlRfT1BfTU9ERSBPcE1vZGU7Ci0JLy9ieSBhbXkgZm9yIHJlc2V0X2NvdW50Ci0JdTMyIHJlc2V0X2NvdW50OwotCi0JLy9ieSBhbXkgZm9yIHNpbGVudCByZXNldAotCVJFU0VUX1RZUEUJUmVzZXRQcm9ncmVzczsKLQlib29sCQliRm9yY2VkU2lsZW50UmVzZXQ7Ci0JYm9vbAkJYkRpc2FibGVOb3JtYWxSZXNldENoZWNrOwotCXUxNgkJVHhDb3VudGVyOwotCXUxNgkJUnhDb3VudGVyOwotCWludAkJSXJwUGVuZGluZ0NvdW50OwotCWJvb2wJCWJSZXNldEluUHJvZ3Jlc3M7Ci0JYm9vbAkJZm9yY2VfcmVzZXQ7Ci0JdTgJCUluaXRpYWxHYWluT3BlcmF0ZVR5cGU7Ci0KLQkvL2RlZmluZSB3b3JrIGl0ZW0gYnkgYW15IDA4MDUyNgotCXN0cnVjdCBkZWxheWVkX3dvcmsgdXBkYXRlX2JlYWNvbl93cTsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIHdhdGNoX2RvZ193cTsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIHR4cG93ZXJfdHJhY2tpbmdfd3E7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayByZnBhdGhfY2hlY2tfd3E7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBncGlvX2NoYW5nZV9yZl93cTsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGluaXRpYWxnYWluX29wZXJhdGVfd3E7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnByaXZfd3E7Ci19cjgxOTJfcHJpdjsKLQotYm9vbCBpbml0X2Zpcm13YXJlKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKLXUzMiByZWFkX2NhbShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgdTggYWRkcik7Ci12b2lkIHdyaXRlX2NhbShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgdTggYWRkciwgdTMyIGRhdGEpOwotdTggcmVhZF9uaWNfYnl0ZShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgaW50IHgpOwotdTMyIHJlYWRfbmljX2R3b3JkKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCBpbnQgeCk7Ci11MTYgcmVhZF9uaWNfd29yZChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgaW50IHgpIDsKLXZvaWQgd3JpdGVfbmljX2J5dGUoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIGludCB4LHU4IHkpOwotdm9pZCB3cml0ZV9uaWNfd29yZChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgaW50IHgsdTE2IHkpOwotdm9pZCB3cml0ZV9uaWNfZHdvcmQoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIGludCB4LHUzMiB5KTsKLQotaW50IHJ0bDgxOTJfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWludCBydGw4MTkyX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotdm9pZCBydGw4MTkyX2NvbW1pdChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7Ci12b2lkIHdyaXRlX3BoeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBhZHIsIHU4IGRhdGEpOwotdm9pZCBDYW1SZXNldEFsbEVudHJ5KHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKLXZvaWQgRW5hYmxlSFdTZWN1cml0eUNvbmZpZzgxOTIoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOwotdm9pZCBzZXRLZXkoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHU4IEVudHJ5Tm8sIHU4IEtleUluZGV4LCB1MTYgS2V5VHlwZSwKLQkgICAgY29uc3QgdTggKk1hY0FkZHIsIHU4IERlZmF1bHRLZXksIHUzMiAqS2V5Q29udGVudCk7Ci12b2lkIGZpcm13YXJlX2luaXRfcGFyYW0oc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOwotUlRfU1RBVFVTIGNtcGtfbWVzc2FnZV9oYW5kbGVfdHgoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHU4ICpjb2RldmlydHVhbGFkZHJlc3MsIHUzMiBwYWNrZXR0eXBlLCB1MzIgYnVmZmVyX2xlbik7Ci0KLSNpZmRlZiBFTkFCTEVfSVBTCi12b2lkIElQU0VudGVyKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKLXZvaWQgSVBTTGVhdmUoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOwotdm9pZCBJUFNMZWF2ZV93cShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotdm9pZCBpZWVlODAyMTFfaXBzX2xlYXZlX3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTEpOwotdm9pZCBpZWVlODAyMTFfaXBzX2xlYXZlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTEpOwotI2VuZGlmCi0jaWZkZWYgRU5BQkxFX0xQUwotdm9pZCBMZWlzdXJlUFNFbnRlcihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTgwMjExKTsKLXZvaWQgTGVpc3VyZVBTTGVhdmUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU4MDIxMSk7Ci0jZW5kaWYKLQotYm9vbCBOaWNJRkVuYWJsZU5JQyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7Ci1ib29sIE5pY0lGRGlzYWJsZU5JQyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7Ci0KLXZvaWQgUEhZX1NldFJ0bDgxOTJlUmZPZmYoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2NtZHBrdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9jbWRwa3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGQwNDRlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9jbWRwa3QuYwpAQCAtMCwwICsxLDQxOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInJ0bF9jb3JlLmgiCisjaW5jbHVkZSAicjgxOTJFX2h3LmgiCisjaW5jbHVkZSAicjgxOTJFX2NtZHBrdC5oIgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgTG9jYWwgQ29uc3RhbnQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRGVidWcgY29uc3RhbnQqLworI2RlZmluZQkJQ01QS19ERUJPVU5DRV9DTlQJCQkxCisjZGVmaW5lCQlDTVBLX1BSSU5UKEFkZHJlc3MpXAore1wKKwl1bnNpZ25lZCBjaGFyCWk7XAorCXUzMgl0ZW1wWzEwXTtcCisJXAorCW1lbWNweSh0ZW1wLCBBZGRyZXNzLCA0MCk7XAorCWZvciAoaSA9IDA7IGkgPCA0MDsgaSArPSA0KVwKKwkJcHJpbnRrKEtFUk5fSU5GTyAiXHJcbiAlMDh4IiwgdGVtcFtpXSk7XAorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBmdW5jdGlvbnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworYm9vbCBjbXBrX21lc3NhZ2VfaGFuZGxlX3R4KAorCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJdTgJKmNvZGVfdmlydHVhbF9hZGRyZXNzLAorCXUzMglwYWNrZXR0eXBlLAorCXUzMglidWZmZXJfbGVuKQoreworCisJYm9vbAkJCQlydF9zdGF0dXMgPSB0cnVlOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwl1MTYJCQkJZnJhZ190aHJlc2hvbGQ7CisJdTE2CQkJCWZyYWdfbGVuZ3RoID0gMCwgZnJhZ19vZmZzZXQgPSAwOworCXN0cnVjdCBydF9maXJtd2FyZSAqcGZpcm13YXJlID0gcHJpdi0+cEZpcm13YXJlOworCXN0cnVjdCBza19idWZmCQkqc2tiOworCXVuc2lnbmVkIGNoYXIJCSpzZWdfcHRyOworCXN0cnVjdCBjYl9kZXNjICp0Y2JfZGVzYzsKKwl1OAkJCQliTGFzdEluaVBrdDsKKworCXN0cnVjdCB0eF9md2luZm9fODE5MHBjaSAqcFR4RndJbmZvID0gTlVMTDsKKworCVJUX1RSQUNFKENPTVBfQ01EUEtULCAiJXMoKSxidWZmZXJfbGVuIGlzICVkXG4iLCBfX2Z1bmNfXywgYnVmZmVyX2xlbik7CisJZmlybXdhcmVfaW5pdF9wYXJhbShkZXYpOworCWZyYWdfdGhyZXNob2xkID0gcGZpcm13YXJlLT5jbWRwYWNrZXRfZnJhZ190aHJlc29sZDsKKworCWRvIHsKKwkJaWYgKChidWZmZXJfbGVuIC0gZnJhZ19vZmZzZXQpID4gZnJhZ190aHJlc2hvbGQpIHsKKwkJCWZyYWdfbGVuZ3RoID0gZnJhZ190aHJlc2hvbGQgOworCQkJYkxhc3RJbmlQa3QgPSAwOworCisJCX0gZWxzZSB7CisJCQlmcmFnX2xlbmd0aCA9ICh1MTYpKGJ1ZmZlcl9sZW4gLSBmcmFnX29mZnNldCk7CisJCQliTGFzdEluaVBrdCA9IDE7CisJCX0KKworCQlza2IgID0gZGV2X2FsbG9jX3NrYihmcmFnX2xlbmd0aCArCisJCQkJICAgICBwcml2LT5ydGxsaWItPnR4X2hlYWRyb29tICsgNCk7CisKKwkJaWYgKHNrYiA9PSBOVUxMKSB7CisJCQlydF9zdGF0dXMgPSBmYWxzZTsKKwkJCWdvdG8gRmFpbGVkOworCQl9CisKKwkJbWVtY3B5KCh1bnNpZ25lZCBjaGFyICopKHNrYi0+Y2IpLCAmZGV2LCBzaXplb2YoZGV2KSk7CisJCXRjYl9kZXNjID0gKHN0cnVjdCBjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJCXRjYl9kZXNjLT5xdWV1ZV9pbmRleCA9IFRYQ01EX1FVRVVFOworCQl0Y2JfZGVzYy0+YkNtZE9ySW5pdCA9IERFU0NfUEFDS0VUX1RZUEVfTk9STUFMOworCQl0Y2JfZGVzYy0+Ykxhc3RJbmlQa3QgPSBiTGFzdEluaVBrdDsKKwkJdGNiX2Rlc2MtPnBrdF9zaXplID0gZnJhZ19sZW5ndGg7CisKKwkJc2VnX3B0ciA9IHNrYl9wdXQoc2tiLCBwcml2LT5ydGxsaWItPnR4X2hlYWRyb29tKTsKKwkJcFR4RndJbmZvID0gKHN0cnVjdCB0eF9md2luZm9fODE5MHBjaSAqKXNlZ19wdHI7CisJCW1lbXNldChwVHhGd0luZm8sIDAsIHNpemVvZihzdHJ1Y3QgdHhfZndpbmZvXzgxOTBwY2kpKTsKKwkJbWVtc2V0KHBUeEZ3SW5mbywgMHgxMiwgOCk7CisKKwkJc2VnX3B0ciA9IHNrYl9wdXQoc2tiLCBmcmFnX2xlbmd0aCk7CisJCW1lbWNweShzZWdfcHRyLCBjb2RlX3ZpcnR1YWxfYWRkcmVzcywgKHUzMilmcmFnX2xlbmd0aCk7CisKKwkJcHJpdi0+cnRsbGliLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdChza2IsIGRldik7CisKKwkJY29kZV92aXJ0dWFsX2FkZHJlc3MgKz0gZnJhZ19sZW5ndGg7CisJCWZyYWdfb2Zmc2V0ICs9IGZyYWdfbGVuZ3RoOworCisJfSB3aGlsZSAoZnJhZ19vZmZzZXQgPCBidWZmZXJfbGVuKTsKKworCXdyaXRlX25pY19ieXRlKGRldiwgVFBQb2xsLCBUUFBvbGxfQ1EpOworRmFpbGVkOgorCXJldHVybiBydF9zdGF0dXM7Cit9CS8qIENNUEtfTWVzc2FnZV9IYW5kbGVfVHggKi8KKworc3RhdGljCXZvaWQKK2NtcGtfY291bnRfdHhzdGF0aXN0aWMoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgY21wa190eGZiICpwc3R4X2ZiKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKyNpZmRlZiBFTkFCTEVfUFMKKwllbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIHJ0U3RhdGU7CisKKwlwQWRhcHRlci0+SGFsRnVuYy5HZXRId1JlZ0hhbmRsZXIocEFkYXB0ZXIsIEhXX1ZBUl9SRl9TVEFURSwKKwkJCQkJICAocHUxQnl0ZSkoJnJ0U3RhdGUpKTsKKworCWlmIChydFN0YXRlID09IGVSZk9mZikKKwkJcmV0dXJuOworI2VuZGlmCisKKwlpZiAocHN0eF9mYi0+dG9rKSB7CisJCXByaXYtPnN0YXRzLnR4ZmVlZGJhY2tvaysrOworCQlwcml2LT5zdGF0cy50eG9rdG90YWwrKzsKKwkJcHJpdi0+c3RhdHMudHhva2J5dGVzdG90YWwgKz0gcHN0eF9mYi0+cGt0X2xlbmd0aDsKKwkJcHJpdi0+c3RhdHMudHhva2lucGVyaW9kKys7CisKKwkJaWYgKHBzdHhfZmItPnBrdF90eXBlID09IFBBQ0tFVF9NVUxUSUNBU1QpIHsKKwkJCXByaXYtPnN0YXRzLnR4bXVsdGljYXN0Kys7CisJCQlwcml2LT5zdGF0cy50eGJ5dGVzbXVsdGljYXN0ICs9IHBzdHhfZmItPnBrdF9sZW5ndGg7CisJCX0gZWxzZSBpZiAocHN0eF9mYi0+cGt0X3R5cGUgPT0gUEFDS0VUX0JST0FEQ0FTVCkgeworCQkJcHJpdi0+c3RhdHMudHhicm9hZGNhc3QrKzsKKwkJCXByaXYtPnN0YXRzLnR4Ynl0ZXNicm9hZGNhc3QgKz0gcHN0eF9mYi0+cGt0X2xlbmd0aDsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPnN0YXRzLnR4dW5pY2FzdCsrOworCQkJcHJpdi0+c3RhdHMudHhieXRlc3VuaWNhc3QgKz0gcHN0eF9mYi0+cGt0X2xlbmd0aDsKKwkJfQorCX0gZWxzZSB7CisJCXByaXYtPnN0YXRzLnR4ZmVlZGJhY2tmYWlsKys7CisJCXByaXYtPnN0YXRzLnR4ZXJydG90YWwrKzsKKwkJcHJpdi0+c3RhdHMudHhlcnJieXRlc3RvdGFsICs9IHBzdHhfZmItPnBrdF9sZW5ndGg7CisKKwkJaWYgKHBzdHhfZmItPnBrdF90eXBlID09IFBBQ0tFVF9NVUxUSUNBU1QpCisJCQlwcml2LT5zdGF0cy50eGVycm11bHRpY2FzdCsrOworCQllbHNlIGlmIChwc3R4X2ZiLT5wa3RfdHlwZSA9PSBQQUNLRVRfQlJPQURDQVNUKQorCQkJcHJpdi0+c3RhdHMudHhlcnJicm9hZGNhc3QrKzsKKwkJZWxzZQorCQkJcHJpdi0+c3RhdHMudHhlcnJ1bmljYXN0Kys7CisJfQorCisJcHJpdi0+c3RhdHMudHhyZXRyeWNvdW50ICs9IHBzdHhfZmItPnJldHJ5X2NudDsKKwlwcml2LT5zdGF0cy50eGZlZWRiYWNrcmV0cnkgKz0gcHN0eF9mYi0+cmV0cnlfY250OworCit9CS8qIGNtcGtfQ291bnRUeFN0YXRpc3RpYyAqLworCisKKworc3RhdGljIHZvaWQgY21wa19oYW5kbGVfdHhfZmVlZGJhY2soc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKnBtc2cpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXN0cnVjdCBjbXBrX3R4ZmIgcnhfdHhfZmI7CS8qICovCisKKwlwcml2LT5zdGF0cy50eGZlZWRiYWNrKys7CisKKworCW1lbWNweSgodTggKikmcnhfdHhfZmIsIHBtc2csIHNpemVvZihzdHJ1Y3QgY21wa190eGZiKSk7CisJY21wa19jb3VudF90eHN0YXRpc3RpYyhkZXYsICZyeF90eF9mYik7CisKK30JLyogY21wa19IYW5kbGVfVHhfRmVlZGJhY2sgKi8KKworc3RhdGljIHZvaWQgY21kcGt0X2JlYWNvbnRpbWVyaW50ZXJydXB0XzgxOXh1c2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJdTE2IHR4X3JhdGU7CisKKwlpZiAoKHByaXYtPnJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0gSUVFRV9BKSAgfHwKKwkgICAgKHByaXYtPnJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0gSUVFRV9OXzVHKSB8fAorCSAgICAoKHByaXYtPnJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0gSUVFRV9OXzI0RykgICYmCisJICAgICghcHJpdi0+cnRsbGliLT5wSFRJbmZvLT5iQ3VyU3VwcENDSykpKSB7CisJCXR4X3JhdGUgPSA2MDsKKwkJRE1FU0coInNlbmQgYmVhY29uIGZyYW1lICB0eCByYXRlIGlzIDZNYnBtXG4iKTsKKwl9IGVsc2UgeworCQl0eF9yYXRlID0gMTA7CisJCURNRVNHKCJzZW5kIGJlYWNvbiBmcmFtZSAgdHggcmF0ZSBpcyAxTWJwbVxuIik7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIGNtcGtfaGFuZGxlX2ludGVycnVwdF9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKnBtc2cpCit7CisJc3RydWN0IGNtcGtfaW50cl9zdGEgcnhfaW50cl9zdGF0dXM7CS8qICovCisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJRE1FU0coIi0tLT4gY21wa19IYW5kbGVfSW50ZXJydXB0X1N0YXR1cygpXG4iKTsKKworCisJcnhfaW50cl9zdGF0dXMubGVuZ3RoID0gcG1zZ1sxXTsKKwlpZiAocnhfaW50cl9zdGF0dXMubGVuZ3RoICE9IChzaXplb2Yoc3RydWN0IGNtcGtfaW50cl9zdGEpIC0gMikpIHsKKwkJRE1FU0coImNtcGtfSGFuZGxlX0ludGVycnVwdF9TdGF0dXM6IHdyb25nIGxlbmd0aCFcbiIpOworCQlyZXR1cm47CisJfQorCisKKwlpZiAocHJpdi0+cnRsbGliLT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKKwkJcnhfaW50cl9zdGF0dXMuaW50ZXJydXB0X3N0YXR1cyA9ICooKHUzMiAqKShwbXNnICsgNCkpOworCisJCURNRVNHKCJpbnRlcnJ1cHQgc3RhdHVzID0gMHgleFxuIiwKKwkJICAgICAgcnhfaW50cl9zdGF0dXMuaW50ZXJydXB0X3N0YXR1cyk7CisKKwkJaWYgKHJ4X2ludHJfc3RhdHVzLmludGVycnVwdF9zdGF0dXMgJiBJU1JfVHhCY25PaykgeworCQkJcHJpdi0+cnRsbGliLT5iaWJzc2Nvb3JkaW5hdG9yID0gdHJ1ZTsKKwkJCXByaXYtPnN0YXRzLnR4YmVhY29ub2tpbnQrKzsKKwkJfSBlbHNlIGlmIChyeF9pbnRyX3N0YXR1cy5pbnRlcnJ1cHRfc3RhdHVzICYgSVNSX1R4QmNuRXJyKSB7CisJCQlwcml2LT5ydGxsaWItPmJpYnNzY29vcmRpbmF0b3IgPSBmYWxzZTsKKwkJCXByaXYtPnN0YXRzLnR4YmVhY29uZXJyKys7CisJCX0KKworCQlpZiAocnhfaW50cl9zdGF0dXMuaW50ZXJydXB0X3N0YXR1cyAmIElTUl9CY25UaW1lckludHIpCisJCQljbWRwa3RfYmVhY29udGltZXJpbnRlcnJ1cHRfODE5eHVzYihkZXYpOworCX0KKworCURNRVNHKCI8LS0tLSBjbXBrX2hhbmRsZV9pbnRlcnJ1cHRfc3RhdHVzKClcbiIpOworCit9CS8qIGNtcGtfaGFuZGxlX2ludGVycnVwdF9zdGF0dXMgKi8KKworCitzdGF0aWMJdm9pZCBjbXBrX2hhbmRsZV9xdWVyeV9jb25maWdfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKnBtc2cpCit7CisJY21wa19xdWVyeV9jZmdfdAlyeF9xdWVyeV9jZmc7CS8qICovCisKKworCXJ4X3F1ZXJ5X2NmZy5jZmdfYWN0aW9uID0gKHBtc2dbNF0gJiAweDgwMDAwMDAwKT4+MzE7CisJcnhfcXVlcnlfY2ZnLmNmZ190eXBlID0gKHBtc2dbNF0gJiAweDYwKSA+PiA1OworCXJ4X3F1ZXJ5X2NmZy5jZmdfc2l6ZSA9IChwbXNnWzRdICYgMHgxOCkgPj4gMzsKKwlyeF9xdWVyeV9jZmcuY2ZnX3BhZ2UgPSAocG1zZ1s2XSAmIDB4MEYpID4+IDA7CisJcnhfcXVlcnlfY2ZnLmNmZ19vZmZzZXQJID0gcG1zZ1s3XTsKKwlyeF9xdWVyeV9jZmcudmFsdWUgPSAocG1zZ1s4XSA8PCAyNCkgfCAocG1zZ1s5XSA8PCAxNikgfAorCQkJICAgICAocG1zZ1sxMF0gPDwgOCkgfCAocG1zZ1sxMV0gPDwgMCk7CisJcnhfcXVlcnlfY2ZnLm1hc2sgPSAocG1zZ1sxMl0gPDwgMjQpIHwgKHBtc2dbMTNdIDw8IDE2KSB8CisJCQkgICAgKHBtc2dbMTRdIDw8IDgpIHwgKHBtc2dbMTVdIDw8IDApOworCit9CS8qIGNtcGtfSGFuZGxlX1F1ZXJ5X0NvbmZpZ19SeCAqLworCisKK3N0YXRpYyB2b2lkIGNtcGtfY291bnRfdHhfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBjbXBrX3R4X3N0YXR1cyAqcHN0eF9zdGF0dXMpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisjaWZkZWYgRU5BQkxFX1BTCisKKwllbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIHJ0c3RhdGU7CisKKwlwQWRhcHRlci0+SGFsRnVuYy5HZXRId1JlZ0hhbmRsZXIocEFkYXB0ZXIsIEhXX1ZBUl9SRl9TVEFURSwKKwkJCQkJICAocHUxQnl0ZSkoJnJ0U3RhdGUpKTsKKworCWlmIChydFN0YXRlID09IGVSZk9mZikKKwkJcmV0dXJuOworI2VuZGlmCisKKwlwcml2LT5zdGF0cy50eGZlZWRiYWNrb2sJKz0gcHN0eF9zdGF0dXMtPnR4b2s7CisJcHJpdi0+c3RhdHMudHhva3RvdGFsCQkrPSBwc3R4X3N0YXR1cy0+dHhvazsKKworCXByaXYtPnN0YXRzLnR4ZmVlZGJhY2tmYWlsCSs9IHBzdHhfc3RhdHVzLT50eGZhaWw7CisJcHJpdi0+c3RhdHMudHhlcnJ0b3RhbAkJKz0gcHN0eF9zdGF0dXMtPnR4ZmFpbDsKKworCXByaXYtPnN0YXRzLnR4cmV0cnljb3VudAkJKz0gcHN0eF9zdGF0dXMtPnR4cmV0cnk7CisJcHJpdi0+c3RhdHMudHhmZWVkYmFja3JldHJ5CSs9IHBzdHhfc3RhdHVzLT50eHJldHJ5OworCisKKwlwcml2LT5zdGF0cy50eG11bHRpY2FzdAkrPSBwc3R4X3N0YXR1cy0+dHhtY29rOworCXByaXYtPnN0YXRzLnR4YnJvYWRjYXN0CSs9IHBzdHhfc3RhdHVzLT50eGJjb2s7CisJcHJpdi0+c3RhdHMudHh1bmljYXN0CQkrPSBwc3R4X3N0YXR1cy0+dHh1Y29rOworCisJcHJpdi0+c3RhdHMudHhlcnJtdWx0aWNhc3QJKz0gcHN0eF9zdGF0dXMtPnR4bWNmYWlsOworCXByaXYtPnN0YXRzLnR4ZXJyYnJvYWRjYXN0CSs9IHBzdHhfc3RhdHVzLT50eGJjZmFpbDsKKwlwcml2LT5zdGF0cy50eGVycnVuaWNhc3QJKz0gcHN0eF9zdGF0dXMtPnR4dWNmYWlsOworCisJcHJpdi0+c3RhdHMudHhieXRlc211bHRpY2FzdAkrPSBwc3R4X3N0YXR1cy0+dHhtY2xlbmd0aDsKKwlwcml2LT5zdGF0cy50eGJ5dGVzYnJvYWRjYXN0CSs9IHBzdHhfc3RhdHVzLT50eGJjbGVuZ3RoOworCXByaXYtPnN0YXRzLnR4Ynl0ZXN1bmljYXN0CQkrPSBwc3R4X3N0YXR1cy0+dHh1Y2xlbmd0aDsKKworCXByaXYtPnN0YXRzLmxhc3RfcGFja2V0X3JhdGUJCT0gcHN0eF9zdGF0dXMtPnJhdGU7Cit9CS8qIGNtcGtfQ291bnRUeFN0YXR1cyAqLworCisKKworc3RhdGljCXZvaWQgY21wa19oYW5kbGVfdHhfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpwbXNnKQoreworCXN0cnVjdCBjbXBrX3R4X3N0YXR1cyByeF90eF9zdHM7CS8qICovCisKKwltZW1jcHkoKHZvaWQgKikmcnhfdHhfc3RzLCAodm9pZCAqKXBtc2csIHNpemVvZihzdHJ1Y3QgY21wa190eF9zdGF0dXMpKTsKKwljbXBrX2NvdW50X3R4X3N0YXR1cyhkZXYsICZyeF90eF9zdHMpOworfQorCitzdGF0aWMJdm9pZCBjbXBrX2hhbmRsZV90eF9yYXRlX2hpc3Rvcnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKnBtc2cpCit7CisJc3RydWN0IGNtcGtfdHhfcmFoaXMgKnB0eHJhdGU7CisJdTggaSwgajsKKwl1MTYJCQkJbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBjbXBrX3R4X3JhaGlzKTsKKwl1MzIgKnB0ZW1wOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCisjaWZkZWYgRU5BQkxFX1BTCisJcEFkYXB0ZXItPkhhbEZ1bmMuR2V0SHdSZWdIYW5kbGVyKHBBZGFwdGVyLCBIV19WQVJfUkZfU1RBVEUsCisJCQkJCSAocHUxQnl0ZSkoJnJ0U3RhdGUpKTsKKworCWlmIChydFN0YXRlID09IGVSZk9mZikKKwkJcmV0dXJuOworI2VuZGlmCisKKwlwdGVtcCA9ICh1MzIgKilwbXNnOworCisJZm9yIChpID0gMDsgaSA8IChsZW5ndGggLyA0KTsgaSsrKSB7CisJCXUxNgkgdGVtcDEsIHRlbXAyOworCisJCXRlbXAxID0gcHRlbXBbaV0gJiAweDAwMDBGRkZGOworCQl0ZW1wMiA9IHB0ZW1wW2ldID4+IDE2OworCQlwdGVtcFtpXSA9ICh0ZW1wMSA8PCAxNikgfCB0ZW1wMjsKKwl9CisKKwlwdHhyYXRlID0gKHN0cnVjdCBjbXBrX3R4X3JhaGlzICopcG1zZzsKKworCWlmIChwdHhyYXRlID09IE5VTEwpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWlmIChpIDwgNCkKKwkJCXByaXYtPnN0YXRzLnR4cmF0ZS5jY2tbaV0gKz0gcHR4cmF0ZS0+Y2NrW2ldOworCisJCWlmIChpIDwgOCkKKwkJCXByaXYtPnN0YXRzLnR4cmF0ZS5vZmRtW2ldICs9IHB0eHJhdGUtPm9mZG1baV07CisKKwkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKwkJCXByaXYtPnN0YXRzLnR4cmF0ZS5odF9tY3Nbal1baV0gKz0KKwkJCQkJCQkgcHR4cmF0ZS0+aHRfbWNzW2pdW2ldOworCX0KKworfQorCisKK3UzMiBjbXBrX21lc3NhZ2VfaGFuZGxlX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpwc3RhdHMpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCWludAkJCXRvdGFsX2xlbmd0aDsKKwl1OAkJCWNtZF9sZW5ndGgsIGV4ZV9jbnQgPSAwOworCXU4CQkJZWxlbWVudF9pZDsKKwl1OAkJCSpwY21kX2J1ZmY7CisKKwlSVF9UUkFDRShDT01QX0NNRFBLVCwgIi0tLS0+Y21wa19tZXNzYWdlX2hhbmRsZV9yeCgpXG4iKTsKKworCWlmIChwc3RhdHMgPT0gTlVMTCkgeworCQkvKiBQcmludCBlcnJvciBtZXNzYWdlLiAqLworCQkvKlJUX1RSQUNFKENPTVBfU0VORCwgRGVidWdMZXZlbCwKKwkJCQkoIlxuXHJbQ01QS10tLT5FcnIgcXVldWUgaWQgb3IgcG9pbnRlciIpKTsqLworCQlyZXR1cm4gMDsKKwl9CisKKwl0b3RhbF9sZW5ndGggPSBwc3RhdHMtPkxlbmd0aDsKKworCXBjbWRfYnVmZiA9IHBzdGF0cy0+dmlydHVhbF9hZGRyZXNzOworCisJZWxlbWVudF9pZCA9IHBjbWRfYnVmZlswXTsKKworCXdoaWxlICh0b3RhbF9sZW5ndGggPiAwIHx8IGV4ZV9jbnQrKyA+IDEwMCkgeworCQllbGVtZW50X2lkID0gcGNtZF9idWZmWzBdOworCisJCXN3aXRjaCAoZWxlbWVudF9pZCkgeworCQljYXNlIFJYX1RYX0ZFRURCQUNLOgorCQkJUlRfVFJBQ0UoQ09NUF9DTURQS1QsICItLS0tPmNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKToiCisJCQkJICJSWF9UWF9GRUVEQkFDS1xuIik7CisJCQljbXBrX2hhbmRsZV90eF9mZWVkYmFjayhkZXYsIHBjbWRfYnVmZik7CisJCQljbWRfbGVuZ3RoID0gQ01QS19SWF9UWF9GQl9TSVpFOworCQkJYnJlYWs7CisJCWNhc2UgUlhfSU5URVJSVVBUX1NUQVRVUzoKKwkJCVJUX1RSQUNFKENPTVBfQ01EUEtULCAiLS0tLT5jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KCk6IgorCQkJCSAiUlhfSU5URVJSVVBUX1NUQVRVU1xuIik7CisJCQljbXBrX2hhbmRsZV9pbnRlcnJ1cHRfc3RhdHVzKGRldiwgcGNtZF9idWZmKTsKKwkJCWNtZF9sZW5ndGggPSBzaXplb2Yoc3RydWN0IGNtcGtfaW50cl9zdGEpOworCQkJYnJlYWs7CisJCWNhc2UgQk9USF9RVUVSWV9DT05GSUc6CisJCQlSVF9UUkFDRShDT01QX0NNRFBLVCwgIi0tLS0+Y21wa19tZXNzYWdlX2hhbmRsZV9yeCgpOiIKKwkJCQkgIkJPVEhfUVVFUllfQ09ORklHXG4iKTsKKwkJCWNtcGtfaGFuZGxlX3F1ZXJ5X2NvbmZpZ19yeChkZXYsIHBjbWRfYnVmZik7CisJCQljbWRfbGVuZ3RoID0gQ01QS19CT1RIX1FVRVJZX0NPTkZJR19TSVpFOworCQkJYnJlYWs7CisJCWNhc2UgUlhfVFhfU1RBVFVTOgorCQkJUlRfVFJBQ0UoQ09NUF9DTURQS1QsICItLS0tPmNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKToiCisJCQkJICJSWF9UWF9TVEFUVVNcbiIpOworCQkJY21wa19oYW5kbGVfdHhfc3RhdHVzKGRldiwgcGNtZF9idWZmKTsKKwkJCWNtZF9sZW5ndGggPSBDTVBLX1JYX1RYX1NUU19TSVpFOworCQkJYnJlYWs7CisJCWNhc2UgUlhfVFhfUEVSX1BLVF9GRUVEQkFDSzoKKwkJCVJUX1RSQUNFKENPTVBfQ01EUEtULCAiLS0tLT5jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KCk6IgorCQkJCSAiUlhfVFhfUEVSX1BLVF9GRUVEQkFDS1xuIik7CisJCQljbWRfbGVuZ3RoID0gQ01QS19SWF9UWF9GQl9TSVpFOworCQkJYnJlYWs7CisJCWNhc2UgUlhfVFhfUkFURV9ISVNUT1JZOgorCQkJUlRfVFJBQ0UoQ09NUF9DTURQS1QsICItLS0tPmNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKToiCisJCQkJICJSWF9UWF9ISVNUT1JZXG4iKTsKKwkJCWNtcGtfaGFuZGxlX3R4X3JhdGVfaGlzdG9yeShkZXYsIHBjbWRfYnVmZik7CisJCQljbWRfbGVuZ3RoID0gQ01QS19UWF9SQUhJU19TSVpFOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisKKwkJCVJUX1RSQUNFKENPTVBfQ01EUEtULCAiLS0tLT5jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KCk6IgorCQkJCSAidW5rbm93IENNRCBFbGVtZW50XG4iKTsKKwkJCXJldHVybiAxOworCQl9CisKKwkJcHJpdi0+c3RhdHMucnhjbWRwa3RbZWxlbWVudF9pZF0rKzsKKworCQl0b3RhbF9sZW5ndGggLT0gY21kX2xlbmd0aDsKKwkJcGNtZF9idWZmICAgICs9IGNtZF9sZW5ndGg7CisJfQorCXJldHVybgkxOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9jbWRwa3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfY21kcGt0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMyMTllMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfY21kcGt0LmgKQEAgLTAsMCArMSwxNTkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIFI4MTlYVVNCX0NNRFBLVF9ICisjZGVmaW5lIFI4MTlYVVNCX0NNRFBLVF9ICisjZGVmaW5lCUNNUEtfUlhfVFhfRkJfU0laRQkJc2l6ZW9mKHN0cnVjdCBjbXBrX3R4ZmIpCisjZGVmaW5lIENNUEtfVFhfU0VUX0NPTkZJR19TSVpFCQlzaXplb2Yoc3RydWN0IGNtcGtfc2V0X2NmZykKKyNkZWZpbmUgQ01QS19CT1RIX1FVRVJZX0NPTkZJR19TSVpFCXNpemVvZihzdHJ1Y3QgY21wa19zZXRfY2ZnKQorI2RlZmluZSBDTVBLX1JYX1RYX1NUU19TSVpFCQlzaXplb2Yoc3RydWN0IGNtcGtfdHhfc3RhdHVzKQorI2RlZmluZSBDTVBLX1JYX0RCR19NU0dfU0laRQkJc2l6ZW9mKHN0cnVjdCBjbXBrX3J4X2RiZ2luZm8pCisjZGVmaW5lCUNNUEtfVFhfUkFISVNfU0laRQkJc2l6ZW9mKHN0cnVjdCBjbXBrX3R4X3JhaGlzKQorCisjZGVmaW5lIElTUl9UeEJjbk9rCQkJQklUMjcKKyNkZWZpbmUgSVNSX1R4QmNuRXJyCQkJQklUMjYKKyNkZWZpbmUgSVNSX0JjblRpbWVySW50cgkJQklUMTMKKworCitzdHJ1Y3QgY21wa190eGZiIHsKKwl1OAllbGVtZW50X2lkOworCXU4CWxlbmd0aDsKKwl1OAlUSUQ6NDsJCQkJLyogKi8KKwl1OAlmYWlsX3JlYXNvbjozOwkJLyogKi8KKwl1OAl0b2s6MTsKKwl1OAlyZXNlcnZlMTo0OwkJCS8qICovCisJdTgJcGt0X3R5cGU6MjsJCS8qICovCisJdTgJYmFuZHdpZHRoOjE7CQkvKiAqLworCXU4CXFvc19wa3Q6MTsJCQkvKiAqLworCisJdTgJcmVzZXJ2ZTI7CQkJLyogKi8KKwl1OAlyZXRyeV9jbnQ7CQkJLyogKi8KKwl1MTYJcGt0X2lkOwkJCQkvKiAqLworCisJdTE2CXNlcV9udW07CQkJLyogKi8KKwl1OAlzX3JhdGU7CisJdTgJZl9yYXRlOworCisJdTgJc19ydHNfcmF0ZTsJCQkvKiAqLworCXU4CWZfcnRzX3JhdGU7CQkJLyogKi8KKwl1MTYJcGt0X2xlbmd0aDsJCQkvKiAqLworCisJdTE2CXJlc2VydmUzOwkJCS8qICovCisJdTE2CWR1cmF0aW9uOwkJCS8qICovCit9OworCitzdHJ1Y3QgY21wa19pbnRyX3N0YSB7CisJdTgJZWxlbWVudF9pZDsKKwl1OAlsZW5ndGg7CisJdTE2CXJlc2VydmU7CisJdTMyCWludGVycnVwdF9zdGF0dXM7Cit9OworCisKK3N0cnVjdCBjbXBrX3NldF9jZmcgeworCXU4CWVsZW1lbnRfaWQ7CisJdTgJbGVuZ3RoOworCXUxNglyZXNlcnZlMTsKKwl1OAljZmdfcmVzZXJ2ZTE6MzsKKwl1OAljZmdfc2l6ZToyOworCXU4CWNmZ190eXBlOjI7CisJdTgJY2ZnX2FjdGlvbjoxOworCXU4CWNmZ19yZXNlcnZlMjsKKwl1OAljZmdfcGFnZTo0OworCXU4CWNmZ19yZXNlcnZlMzo0OworCXU4CWNmZ19vZmZzZXQ7CisJdTMyCXZhbHVlOworCXUzMgltYXNrOworfTsKKworI2RlZmluZQkJY21wa19xdWVyeV9jZmdfdAlzdHJ1Y3QgY21wa19zZXRfY2ZnCisKK3N0cnVjdCBjbXBrX3R4X3N0YXR1cyB7CisJdTE2CXJlc2VydmUxOworCXU4CWxlbmd0aDsKKwl1OAllbGVtZW50X2lkOworCisJdTE2CXR4ZmFpbDsKKwl1MTYJdHhvazsKKworCXUxNgl0eG1jb2s7CisJdTE2CXR4cmV0cnk7CisKKwl1MTYgIHR4dWNvazsKKwl1MTYJdHhiY29rOworCisJdTE2CXR4YmNmYWlsOworCXUxNgl0eG1jZmFpbDsKKworCXUxNglyZXNlcnZlMjsKKwl1MTYJdHh1Y2ZhaWw7CisKKwl1MzIJdHhtY2xlbmd0aDsKKwl1MzIJdHhiY2xlbmd0aDsKKwl1MzIJdHh1Y2xlbmd0aDsKKworCXUxNglyZXNlcnZlM18yMzsKKwl1OAlyZXNlcnZlM18xOworCXU4CXJhdGU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgY21wa19yeF9kYmdpbmZvIHsKKwl1MTYJcmVzZXJ2ZTE7CisJdTgJbGVuZ3RoOworCXU4CWVsZW1lbnRfaWQ7CisKKworfTsKKworc3RydWN0IGNtcGtfdHhfcmFoaXMgeworCXU4CWVsZW1lbnRfaWQ7CisJdTgJbGVuZ3RoOworCXUxNglyZXNlcnZlZDE7CisKKwl1MTYJY2NrWzRdOworCisJdTE2CW9mZG1bOF07CisKKworCisKKworCXUxNglodF9tY3NbNF1bMTZdOworCit9IF9fcGFja2VkOworCitlbnVtIGNtcGtfZWxlbWVudCB7CisJUlhfVFhfRkVFREJBQ0sgPSAwLAorCVJYX0lOVEVSUlVQVF9TVEFUVVMJCT0gMSwKKwlUWF9TRVRfQ09ORklHCQkJPSAyLAorCUJPVEhfUVVFUllfQ09ORklHCQk9IDMsCisJUlhfVFhfU1RBVFVTCQkJPSA0LAorCVJYX0RCR0lORk9fRkVFREJBQ0sJCT0gNSwKKwlSWF9UWF9QRVJfUEtUX0ZFRURCQUNLCQk9IDYsCisJUlhfVFhfUkFURV9ISVNUT1JZCQk9IDcsCisJUlhfQ01EX0VMRV9NQVgKK307CisKK2V4dGVybiAgdTMyIGNtcGtfbWVzc2FnZV9oYW5kbGVfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpwc3RhdHMpOworZXh0ZXJuIGJvb2wgY21wa19tZXNzYWdlX2hhbmRsZV90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgIHU4ICpjb2RldmlydHVhbGFkZHJlc3MsIHUzMiBwYWNrZXR0eXBlLAorCQkJCSAgIHUzMiBidWZmZXJfbGVuKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9jb3JlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MThmZWQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9jb3JlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogTGludXggZGV2aWNlIGRyaXZlciBmb3IgUlRMODE5MkUKLSAqCi0gKiBCYXNlZCBvbiB0aGUgcjgxODAgZHJpdmVyLCB3aGljaCBpczoKLSAqIENvcHlyaWdodCAyMDA0LTIwMDUgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PiwgZXQgYWwuCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqIEplcnJ5IGNodWFuZyA8d2xhbmZhZUByZWFsdGVrLmNvbT4KLSAqLwotCi0KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgInI4MTkyRV9ody5oIgotI2luY2x1ZGUgInI4MTkyRS5oIgotI2luY2x1ZGUgInI4MTkwX3J0bDgyNTYuaCIgLyogUlRMODIyNSBSYWRpbyBmcm9udGVuZCAqLwotI2luY2x1ZGUgInI4MTgwXzkzY3g2LmgiICAgLyogQ2FyZCBFRVBST00gKi8KLSNpbmNsdWRlICJyODE5MkVfd3guaCIKLSNpbmNsdWRlICJyODE5eEVfcGh5LmgiIC8vYWRkZWQgYnkgV0IgNC4zMC4yMDA4Ci0jaW5jbHVkZSAicjgxOXhFX3BoeXJlZy5oIgotI2luY2x1ZGUgInI4MTl4RV9jbWRwa3QuaCIKLSNpbmNsdWRlICJyODE5MkVfZG0uaCIKLQotI2lmZGVmIENPTkZJR19QTQotI2luY2x1ZGUgInI4MTkyX3BtLmgiCi0jZW5kaWYKLQotI2lmZGVmIEVOQUJMRV9ET1QxMUQKLSNpbmNsdWRlICJpZWVlODAyMTEvZG90MTFkLmgiCi0jZW5kaWYKLQotLy9zZXQgaGVyZSB0byBvcGVuIHlvdXIgdHJhY2UgY29kZS4gLy9XQgotdTMyIHJ0X2dsb2JhbF9kZWJ1Z19jb21wb25lbnQgPSBDT01QX0VSUiA7IC8vYWx3YXlzIG9wZW4gZXJyIGZsYWdzIG9uCi0KLXN0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShydGw4MTkyX3BjaV9pZF90YmwpID0gewotCS8qIFJlYWx0ZWsgKi8KLQl7IFBDSV9ERVZJQ0UoMHgxMGVjLCAweDgxOTIpIH0sCi0KLQkvKiBDb3JlZ2EgKi8KLQl7IFBDSV9ERVZJQ0UoMHgwN2FhLCAweDAwNDQpIH0sCi0JeyBQQ0lfREVWSUNFKDB4MDdhYSwgMHgwMDQ3KSB9LAotCXt9Ci19OwotCi1zdGF0aWMgY2hhciBpZm5hbWVbSUZOQU1TSVpdID0gIndsYW4lZCI7Ci1zdGF0aWMgaW50IGh3d2VwID0gMTsgLy9kZWZhdWx0IHVzZSBody4gc2V0IDAgdG8gdXNlIHNvZnR3YXJlIHNlY3VyaXR5Ci1zdGF0aWMgaW50IGNoYW5uZWxzID0gMHgzZmZmOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfVkVSU0lPTigiViAxLjEiKTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBydGw4MTkyX3BjaV9pZF90YmwpOwotLy9NT0RVTEVfQVVUSE9SKCJBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkxpbnV4IGRyaXZlciBmb3IgUmVhbHRlayBSVEw4MTl4IFdpRmkgY2FyZHMiKTsKLQotCi1tb2R1bGVfcGFyYW1fc3RyaW5nKGlmbmFtZSwgaWZuYW1lLCBzaXplb2YoaWZuYW1lKSwgU19JUlVHT3xTX0lXVVNSKTsKLW1vZHVsZV9wYXJhbShod3dlcCxpbnQsIFNfSVJVR098U19JV1VTUik7Ci1tb2R1bGVfcGFyYW0oY2hhbm5lbHMsaW50LCBTX0lSVUdPfFNfSVdVU1IpOwotCi1NT0RVTEVfUEFSTV9ERVNDKGlmbmFtZSwiIE5ldCBpbnRlcmZhY2UgbmFtZSwgd2xhbiVkPWRlZmF1bHQiKTsKLU1PRFVMRV9QQVJNX0RFU0MoaHd3ZXAsIiBUcnkgdG8gdXNlIGhhcmR3YXJlIFdFUCBzdXBwb3J0LiBTdGlsbCBicm9rZW4gYW5kIG5vdCBhdmFpbGFibGUgb24gYWxsIGNhcmRzIik7Ci1NT0RVTEVfUEFSTV9ERVNDKGNoYW5uZWxzLCIgQ2hhbm5lbCBiaXRtYXNrIGZvciBzcGVjaWZpYyBsb2NhbGVzLiBOWUkiKTsKLQotc3RhdGljIGludCBfX2RldmluaXQgcnRsODE5Ml9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKTsKLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBydGw4MTkyX3BjaV9kaXNjb25uZWN0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKLQotc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHJ0bDgxOTJfcGNpX2RyaXZlciA9IHsKLQkubmFtZQkJPSBSVEw4MTl4RV9NT0RVTEVfTkFNRSwJICAgICAgICAgIC8qIERyaXZlciBuYW1lICAgKi8KLQkuaWRfdGFibGUJPSBydGw4MTkyX3BjaV9pZF90YmwsCSAgICAgICAgICAvKiBQQ0lfSUQgdGFibGUgICovCi0JLnByb2JlCQk9IHJ0bDgxOTJfcGNpX3Byb2JlLAkgICAgICAgICAgLyogcHJvYmUgZm4gICAgICAqLwotCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocnRsODE5Ml9wY2lfZGlzY29ubmVjdCksCSAgLyogcmVtb3ZlIGZuICAgICAqLwotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kCT0gcnRsODE5MkVfc3VzcGVuZCwJICAgICAgICAgIC8qIFBNIHN1c3BlbmQgZm4gKi8KLQkucmVzdW1lCQk9IHJ0bDgxOTJFX3Jlc3VtZSwgICAgICAgICAgICAgICAgIC8qIFBNIHJlc3VtZSBmbiAgKi8KLSNlbHNlCi0JLnN1c3BlbmQJPSBOVUxMLAkJCSAgICAgICAgICAvKiBQTSBzdXNwZW5kIGZuICovCi0JLnJlc3VtZQkJPSBOVUxMLAkJCSAgICAgICAgICAvKiBQTSByZXN1bWUgZm4gICovCi0jZW5kaWYKLX07Ci0KLXN0YXRpYyB2b2lkIHJ0bDgxOTJfc3RhcnRfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTEpOwotc3RhdGljIHZvaWQgcnRsODE5Ml9zdG9wX2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTgwMjExKTsKLXN0YXRpYyB2b2lkIHJ0bDgxOXhfd2F0Y2hkb2dfd3FjYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotc3RhdGljIHZvaWQgcnRsODE5Ml9pcnFfcnhfdGFza2xldCh1bnNpZ25lZCBsb25nIGFyZyk7Ci1zdGF0aWMgdm9pZCBydGw4MTkyX2lycV90eF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgYXJnKTsKLXN0YXRpYyB2b2lkIHJ0bDgxOTJfcHJlcGFyZV9iZWFjb24odW5zaWduZWQgbG9uZyBhcmcpOwotc3RhdGljIGlycXJldHVybl90IHJ0bDgxOTJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKnBhcmFtKTsKLXN0YXRpYyB2b2lkIHJ0bDgxOXhFX3R4X2NtZChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1zdGF0aWMgdm9pZCBydGw4MTkyX3VwZGF0ZV9yYXRyX3RhYmxlKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKLXN0YXRpYyB2b2lkIHJ0bDgxOTJfcmVzdGFydChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotc3RhdGljIHZvaWQgd2F0Y2hfZG9nX3RpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci1zdGF0aWMgaW50IF9ydGw4MTkyX3VwKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKLXN0YXRpYyB2b2lkIHJ0bDgxOTJfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IHI4MTkyX3ByaXYqIHByaXYpOwotc3RhdGljIHNob3J0IHJ0bDgxOTJfdHgoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHN0cnVjdCBza19idWZmKiBza2IpOwotCi0jaWZkZWYgRU5BQkxFX0RPVDExRAotCi10eXBlZGVmIHN0cnVjdCBfQ0hBTk5FTF9MSVNUCi17Ci0JdTgJQ2hhbm5lbFszMl07Ci0JdTgJTGVuOwotfUNIQU5ORUxfTElTVCwgKlBDSEFOTkVMX0xJU1Q7Ci0KLXN0YXRpYyBjb25zdCBDSEFOTkVMX0xJU1QgQ2hhbm5lbFBsYW5bXSA9IHsKLQl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0LDE0OSwxNTMsMTU3LDE2MSwxNjV9LDI0fSwgIAkJLy9GQ0MKLQl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExfSwxMX0sICAgICAgICAgICAgICAgICAgICAJCQkJLy9JQwotCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMzYsNDAsNDQsNDgsNTIsNTYsNjAsNjR9LDIxfSwgIAkvL0VUU0kKLQl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzfSwxM30sICAgIC8vU3BhaW4uIENoYW5nZSB0byBFVFNJLgotCXt7MSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTN9LDEzfSwgIAkvL0ZyYW5jZS4gQ2hhbmdlIHRvIEVUU0kuCi0Je3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sMjJ9LAkvL01LSwkJCQkJLy9NS0sKLQl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMn0sLy9NS0sxCi0Je3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxM30sMTN9LAkvL0lzcmFlbC4KLQl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0fSwyMn0sCQkJLy8gRm9yIDExYSAsIFRFTEVDCi0Je3sxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NH0sIDIyfSwgICAgLy9NSUMKLQl7ezEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0fSwxNH0JCQkJCS8vRm9yIEdsb2JhbCBEb21haW4uIDEtMTE6YWN0aXZlIHNjYW4sIDEyLTE0IHBhc3NpdmUgc2Nhbi4gLy8rWUosIDA4MDYyNgotfTsKLQotc3RhdGljIHZvaWQgcnRsODE5eF9zZXRfY2hhbm5lbF9tYXAodTggY2hhbm5lbF9wbGFuLCBzdHJ1Y3QgcjgxOTJfcHJpdiogcHJpdikKLXsKLQlpbnQgaSwgbWF4X2NoYW49LTEsIG1pbl9jaGFuPS0xOwotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlID0gcHJpdi0+aWVlZTgwMjExOwotCXN3aXRjaCAoY2hhbm5lbF9wbGFuKQotCXsKLQkJY2FzZSBDT1VOVFJZX0NPREVfRkNDOgotCQljYXNlIENPVU5UUllfQ09ERV9JQzoKLQkJY2FzZSBDT1VOVFJZX0NPREVfRVRTSToKLQkJY2FzZSBDT1VOVFJZX0NPREVfU1BBSU46Ci0JCWNhc2UgQ09VTlRSWV9DT0RFX0ZSQU5DRToKLQkJY2FzZSBDT1VOVFJZX0NPREVfTUtLOgotCQljYXNlIENPVU5UUllfQ09ERV9NS0sxOgotCQljYXNlIENPVU5UUllfQ09ERV9JU1JBRUw6Ci0JCWNhc2UgQ09VTlRSWV9DT0RFX1RFTEVDOgotCQljYXNlIENPVU5UUllfQ09ERV9NSUM6Ci0JCXsKLQkJCURvdDExZF9Jbml0KGllZWUpOwotCQkJaWVlZS0+Ykdsb2JhbERvbWFpbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9hY3R1cmFsbHkgODIyNSAmIDgyNTYgcmYgY2hpcCBvbmx5IHN1cHBvcnQgQixHLDI0TiBtb2RlCi0JCQltaW5fY2hhbiA9IDE7Ci0JCQltYXhfY2hhbiA9IDE0OwotCi0JCQlpZiAoQ2hhbm5lbFBsYW5bY2hhbm5lbF9wbGFuXS5MZW4gIT0gMCl7Ci0JCQkJLy8gQ2xlYXIgb2xkIGNoYW5uZWwgbWFwCi0JCQkJbWVtc2V0KEdFVF9ET1QxMURfSU5GTyhpZWVlKS0+Y2hhbm5lbF9tYXAsIDAsIHNpemVvZihHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwKSk7Ci0JCQkJLy8gU2V0IG5ldyBjaGFubmVsIG1hcAotCQkJCWZvciAoaT0wO2k8Q2hhbm5lbFBsYW5bY2hhbm5lbF9wbGFuXS5MZW47aSsrKQotCQkJCXsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDaGFubmVsUGxhbltjaGFubmVsX3BsYW5dLkNoYW5uZWxbaV0gPCBtaW5fY2hhbiB8fCBDaGFubmVsUGxhbltjaGFubmVsX3BsYW5dLkNoYW5uZWxbaV0gPiBtYXhfY2hhbikKLQkJCQkJICAgIGJyZWFrOwotCQkJCQlHRVRfRE9UMTFEX0lORk8oaWVlZSktPmNoYW5uZWxfbWFwW0NoYW5uZWxQbGFuW2NoYW5uZWxfcGxhbl0uQ2hhbm5lbFtpXV0gPSAxOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0JCWNhc2UgQ09VTlRSWV9DT0RFX0dMT0JBTF9ET01BSU46Ci0JCXsKLQkJCUdFVF9ET1QxMURfSU5GTyhpZWVlKS0+YkVuYWJsZWQgPSAwOyAvL3RoaXMgZmxhZyBlbmFibGVkIHRvIGZvbGxvdyAxMWQgY291bnRyeSBJRSBzZXR0aW5nLCBvdGhlcndpc2UsIGl0IHNoYWxsIGZvbGxvdyBnbG9iYWwgZG9tYWluIHNldHRpbmcKLQkJCURvdDExZF9SZXNldChpZWVlKTsKLQkJCWllZWUtPmJHbG9iYWxEb21haW4gPSB0cnVlOwotCQkJYnJlYWs7Ci0JCX0KLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCX0KLX0KLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIGJvb2wgcnhfaGFsX2lzX2Nja19yYXRlKHByeF9md2luZm9fODE5eF9wY2kgcGRydmluZm8pCi17Ci0JcmV0dXJuIChwZHJ2aW5mby0+UnhSYXRlID09IERFU0M5MF9SQVRFMU0gfHwKLQkJcGRydmluZm8tPlJ4UmF0ZSA9PSBERVNDOTBfUkFURTJNIHx8Ci0JCXBkcnZpbmZvLT5SeFJhdGUgPT0gREVTQzkwX1JBVEU1XzVNIHx8Ci0JCXBkcnZpbmZvLT5SeFJhdGUgPT0gREVTQzkwX1JBVEUxMU0pICYmCi0JCSFwZHJ2aW5mby0+UnhIVDsKLX0KLQotdm9pZCBDYW1SZXNldEFsbEVudHJ5KHN0cnVjdCByODE5Ml9wcml2KiBwcml2KQotewotCXdyaXRlX25pY19kd29yZChwcml2LCBSV0NBTSwgQklUMzF8QklUMzApOwotfQotCi12b2lkIHdyaXRlX2NhbShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgdTggYWRkciwgdTMyIGRhdGEpCi17Ci0gICAgICAgIHdyaXRlX25pY19kd29yZChwcml2LCBXQ0FNSSwgZGF0YSk7Ci0gICAgICAgIHdyaXRlX25pY19kd29yZChwcml2LCBSV0NBTSwgQklUMzF8QklUMTZ8KGFkZHImMHhmZikgKTsKLX0KLQotdTMyIHJlYWRfY2FtKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCB1OCBhZGRyKQotewotICAgICAgICB3cml0ZV9uaWNfZHdvcmQocHJpdiwgUldDQU0sIDB4ODAwMDAwMDB8KGFkZHImMHhmZikgKTsKLSAgICAgICAgcmV0dXJuIHJlYWRfbmljX2R3b3JkKHByaXYsIDB4YTgpOwotfQotCi11OCByZWFkX25pY19ieXRlKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCBpbnQgeCkKLXsKLSAgICAgICAgcmV0dXJuIDB4ZmYgJiByZWFkYihwcml2LT5tZW1fc3RhcnQgKyB4KTsKLX0KLQotdTMyIHJlYWRfbmljX2R3b3JkKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCBpbnQgeCkKLXsKLSAgICAgICAgcmV0dXJuIHJlYWRsKHByaXYtPm1lbV9zdGFydCArIHgpOwotfQotCi11MTYgcmVhZF9uaWNfd29yZChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgaW50IHgpCi17Ci0gICAgICAgIHJldHVybiByZWFkdyhwcml2LT5tZW1fc3RhcnQgKyB4KTsKLX0KLQotdm9pZCB3cml0ZV9uaWNfYnl0ZShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgaW50IHgsdTggeSkKLXsKLSAgICAgICAgd3JpdGViKHksIHByaXYtPm1lbV9zdGFydCArIHgpOwotCXVkZWxheSgyMCk7Ci19Ci0KLXZvaWQgd3JpdGVfbmljX2R3b3JkKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCBpbnQgeCx1MzIgeSkKLXsKLSAgICAgICAgd3JpdGVsKHksIHByaXYtPm1lbV9zdGFydCArIHgpOwotCXVkZWxheSgyMCk7Ci19Ci0KLXZvaWQgd3JpdGVfbmljX3dvcmQoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIGludCB4LHUxNiB5KQotewotICAgICAgICB3cml0ZXcoeSwgcHJpdi0+bWVtX3N0YXJ0ICsgeCk7Ci0JdWRlbGF5KDIwKTsKLX0KLQotdTggcnRsODE5MmVfYXBfc2VjX3R5cGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCi17Ci0Jc3RhdGljIGNvbnN0IHU4IGNjbXBfaWVbNF0gPSB7MHgwMCwweDUwLDB4ZjIsMHgwNH07Ci0Jc3RhdGljIGNvbnN0IHU4IGNjbXBfcnNuX2llWzRdID0gezB4MDAsIDB4MGYsIDB4YWMsIDB4MDR9OwotCWludCB3cGFfaWVfbGVuPSBpZWVlLT53cGFfaWVfbGVuOwotCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSogY3J5cHQ7Ci0JaW50IGVuY3J5cHQ7Ci0KLQljcnlwdCA9IGllZWUtPmNyeXB0W2llZWUtPnR4X2tleWlkeF07Ci0KLQllbmNyeXB0ID0gKGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpIHx8Ci0JCSAgKGllZWUtPmhvc3RfZW5jcnlwdCAmJiBjcnlwdCAmJiBjcnlwdC0+b3BzICYmCi0JCSAgICgwID09IHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCJXRVAiKSkpOwotCi0JLyogc2ltcGx5IGp1ZGdlICAqLwotCWlmKGVuY3J5cHQgJiYgKHdwYV9pZV9sZW4gPT0gMCkpIHsKLQkJLy8gd2VwIGVuY3J5cHRpb24sIG5vIE4gbW9kZSBzZXR0aW5nICovCi0JCXJldHVybiBTRUNfQUxHX1dFUDsKLQl9IGVsc2UgaWYoKHdwYV9pZV9sZW4gIT0gMCkpIHsKLQkJLy8gcGFyc2UgcGFpcndpc2Uga2V5IHR5cGUgKi8KLQkJaWYgKCgoaWVlZS0+d3BhX2llWzBdID09IDB4ZGQpICYmICghbWVtY21wKCYoaWVlZS0+d3BhX2llWzE0XSksY2NtcF9pZSw0KSkpIHx8Ci0JCQkJKChpZWVlLT53cGFfaWVbMF0gPT0gMHgzMCkgJiYgKCFtZW1jbXAoJmllZWUtPndwYV9pZVsxMF0sY2NtcF9yc25faWUsIDQpKSkpCi0JCQlyZXR1cm4gU0VDX0FMR19DQ01QOwotCQllbHNlCi0JCQlyZXR1cm4gU0VDX0FMR19US0lQOwotCX0gZWxzZSB7Ci0JCXJldHVybiBTRUNfQUxHX05PTkU7Ci0JfQotfQotCi12b2lkIHJ0bDgxOTJlX1NldEh3UmVnKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTEsIHU4IHZhcmlhYmxlLCB1OCAqdmFsKQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoaWVlZTgwMjExLT5kZXYpOwotCi0Jc3dpdGNoKHZhcmlhYmxlKQotCXsKLQotCQljYXNlIEhXX1ZBUl9CU1NJRDoKLQkJCXdyaXRlX25pY19kd29yZChwcml2LCBCU1NJRFIsICgodTMyKikodmFsKSlbMF0pOwotCQkJd3JpdGVfbmljX3dvcmQocHJpdiwgQlNTSURSKzIsICgodTE2KikodmFsKzIpKVswXSk7Ci0JCWJyZWFrOwotCi0JCWNhc2UgSFdfVkFSX01FRElBX1NUQVRVUzoKLQkJewotCQkJUlRfT1BfTU9ERQlPcE1vZGUgPSAqKChSVF9PUF9NT0RFICopKHZhbCkpOwotCQkJdTgJCWJ0TXNyID0gcmVhZF9uaWNfYnl0ZShwcml2LCBNU1IpOwotCi0JCQlidE1zciAmPSAweGZjOwotCi0JCQlzd2l0Y2goT3BNb2RlKQotCQkJewotCQkJY2FzZSBSVF9PUF9NT0RFX0lORlJBU1RSVUNUVVJFOgotCQkJCWJ0TXNyIHw9IE1TUl9JTkZSQTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBSVF9PUF9NT0RFX0lCU1M6Ci0JCQkJYnRNc3IgfD0gTVNSX0FESE9DOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFJUX09QX01PREVfQVA6Ci0JCQkJYnRNc3IgfD0gTVNSX0FQOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0OgotCQkJCWJ0TXNyIHw9IE1TUl9OT0xJTks7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXdyaXRlX25pY19ieXRlKHByaXYsIE1TUiwgYnRNc3IpOwotCQl9Ci0JCWJyZWFrOwotCi0JCWNhc2UgSFdfVkFSX0NIRUNLX0JTU0lEOgotCQl7Ci0JCQl1MzIJUmVnUkNSLCBUeXBlOwotCi0JCQlUeXBlID0gKCh1OCopKHZhbCkpWzBdOwotCQkJUmVnUkNSID0gcmVhZF9uaWNfZHdvcmQocHJpdiwgUkNSKTsKLQkJCXByaXYtPlJlY2VpdmVDb25maWcgPSBSZWdSQ1I7Ci0KLQkJCWlmIChUeXBlID09IHRydWUpCi0JCQkJUmVnUkNSIHw9IChSQ1JfQ0JTU0lEKTsKLQkJCWVsc2UgaWYgKFR5cGUgPT0gZmFsc2UpCi0JCQkJUmVnUkNSICY9ICh+UkNSX0NCU1NJRCk7Ci0KLQkJCXdyaXRlX25pY19kd29yZChwcml2LCBSQ1IsUmVnUkNSKTsKLQkJCXByaXYtPlJlY2VpdmVDb25maWcgPSBSZWdSQ1I7Ci0KLQkJfQotCQlicmVhazsKLQotCQljYXNlIEhXX1ZBUl9TTE9UX1RJTUU6Ci0JCXsKLQkJCXByaXYtPnNsb3RfdGltZSA9IHZhbFswXTsKLQkJCXdyaXRlX25pY19ieXRlKHByaXYsIFNMT1RfVElNRSwgdmFsWzBdKTsKLQotCQl9Ci0JCWJyZWFrOwotCi0JCWNhc2UgSFdfVkFSX0FDS19QUkVBTUJMRToKLQkJewotCQkJdTMyIHJlZ1RtcCA9IDA7Ci0JCQlwcml2LT5zaG9ydF9wcmVhbWJsZSA9IChib29sKSgqKHU4Kil2YWwgKTsKLQkJCXJlZ1RtcCA9IHByaXYtPmJhc2ljX3JhdGU7Ci0JCQlpZiAocHJpdi0+c2hvcnRfcHJlYW1ibGUpCi0JCQkJcmVnVG1wIHw9IEJSU1JfQWNrU2hvcnRQbWI7Ci0JCQl3cml0ZV9uaWNfZHdvcmQocHJpdiwgUlJTUiwgcmVnVG1wKTsKLQkJfQotCQlicmVhazsKLQotCQljYXNlIEhXX1ZBUl9DUFVfUlNUOgotCQkJd3JpdGVfbmljX2R3b3JkKHByaXYsIENQVV9HRU4sICgodTMyKikodmFsKSlbMF0pOwotCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLX0KLQotc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcnRsODE5Ml9wcm9jID0gTlVMTDsKLQotc3RhdGljIGludCBwcm9jX2dldF9zdGF0c19hcChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGRhdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBwcml2LT5pZWVlODAyMTE7Ci0Jc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICp0YXJnZXQ7Ci0JaW50IGxlbiA9IDA7Ci0KLSAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeSh0YXJnZXQsICZpZWVlLT5uZXR3b3JrX2xpc3QsIGxpc3QpIHsKLQotCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCi0gICAgICAgICAgICAgICAgIiVzICIsIHRhcmdldC0+c3NpZCk7Ci0KLQkJaWYodGFyZ2V0LT53cGFfaWVfbGVuPjAgfHwgdGFyZ2V0LT5yc25faWVfbGVuPjApewotCSAgICAgICAgICAgICAgICBsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCi0gICAgICAgIAkgICAgICAgICJXUEFcbiIpOwotCQl9Ci0JCWVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAibm9uX1dQQVxuIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBpbnQgcHJvY19nZXRfcmVnaXN0ZXJzKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKLQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCi0JCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gZGF0YTsKLQlpbnQgbGVuID0gMDsKLQlpbnQgaSxuOwotCWludCBtYXg9MHhmZjsKLQotCS8qIFRoaXMgZHVtcCB0aGUgY3VycmVudCByZWdpc3RlciBwYWdlICovCi0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyNwYWdlIDAjIyMjIyMjIyMjIyMjIyMjIyNcbiAiKTsKLQotCWZvcihuPTA7bjw9bWF4OykKLQl7Ci0JCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKLQkJCSJcbkQ6ICAlMnggPiAiLG4pOwotCi0JCWZvcihpPTA7aTwxNiAmJiBuPD1tYXg7aSsrLG4rKykKLQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAotCQkJIiUyeCAiLHJlYWRfbmljX2J5dGUocHJpdixuKSk7Ci0JfQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwiXG4iKTsKLQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAiXG4jIyMjIyMjIyMjIyMjIyMjIyMjI3BhZ2UgMSMjIyMjIyMjIyMjIyMjIyMjI1xuICIpOwotICAgICAgICBmb3Iobj0wO248PW1heDspCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAiXG5EOiAgJTJ4ID4gIixuKTsKLQotICAgICAgICAgICAgICAgIGZvcihpPTA7aTwxNiAmJiBuPD1tYXg7aSsrLG4rKykKLSAgICAgICAgICAgICAgICBsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAiJTJ4ICIscmVhZF9uaWNfYnl0ZShwcml2LDB4MTAwfG4pKTsKLSAgICAgICAgfQotCi0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyNwYWdlIDMjIyMjIyMjIyMjIyMjIyMjIyNcbiAiKTsKLSAgICAgICAgZm9yKG49MDtuPD1tYXg7KQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIlxuRDogICUyeCA+ICIsbik7Ci0KLSAgICAgICAgICAgICAgICBmb3IoaT0wO2k8MTYgJiYgbjw9bWF4O2krKyxuKyspCi0gICAgICAgICAgICAgICAgbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIiUyeCAiLHJlYWRfbmljX2J5dGUocHJpdiwweDMwMHxuKSk7Ci0gICAgICAgIH0KLQotCSplb2YgPSAxOwotCXJldHVybiBsZW47Ci0KLX0KLQotc3RhdGljIGludCBwcm9jX2dldF9zdGF0c190eChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCi0JCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAotCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGRhdGE7Ci0KLQlpbnQgbGVuID0gMDsKLQotCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKLQkJIlRYIFZJIHByaW9yaXR5IG9rIGludDogJWx1XG4iCi0JCSJUWCBWTyBwcmlvcml0eSBvayBpbnQ6ICVsdVxuIgotCQkiVFggQkUgcHJpb3JpdHkgb2sgaW50OiAlbHVcbiIKLQkJIlRYIEJLIHByaW9yaXR5IG9rIGludDogJWx1XG4iCi0JCSJUWCBNQU5BR0UgcHJpb3JpdHkgb2sgaW50OiAlbHVcbiIKLQkJIlRYIEJFQUNPTiBwcmlvcml0eSBvayBpbnQ6ICVsdVxuIgotCQkiVFggQkVBQ09OIHByaW9yaXR5IGVycm9yIGludDogJWx1XG4iCi0JCSJUWCBDTURQS1QgcHJpb3JpdHkgb2sgaW50OiAlbHVcbiIKLQkJIlRYIHF1ZXVlIHN0b3BwZWQ/OiAlZFxuIgotCQkiVFggZmlmbyBvdmVyZmxvdzogJWx1XG4iCi0JCSJUWCB0b3RhbCBkYXRhIHBhY2tldHMgJWx1XG4iCi0JCSJUWCB0b3RhbCBkYXRhIGJ5dGVzIDolbHVcbiIsCi0JCXByaXYtPnN0YXRzLnR4dmlva2ludCwKLQkJcHJpdi0+c3RhdHMudHh2b29raW50LAotCQlwcml2LT5zdGF0cy50eGJlb2tpbnQsCi0JCXByaXYtPnN0YXRzLnR4Ymtva2ludCwKLQkJcHJpdi0+c3RhdHMudHhtYW5hZ2Vva2ludCwKLQkJcHJpdi0+c3RhdHMudHhiZWFjb25va2ludCwKLQkJcHJpdi0+c3RhdHMudHhiZWFjb25lcnIsCi0JCXByaXYtPnN0YXRzLnR4Y21kcGt0b2tpbnQsCi0JCW5ldGlmX3F1ZXVlX3N0b3BwZWQocHJpdi0+aWVlZTgwMjExLT5kZXYpLAotCQlwcml2LT5zdGF0cy50eG92ZXJmbG93LAotCQlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X3BhY2tldHMsCi0JCXByaXYtPmllZWU4MDIxMS0+c3RhdHMudHhfYnl0ZXMpOwotCi0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLQotCi0KLXN0YXRpYyBpbnQgcHJvY19nZXRfc3RhdHNfcngoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAotCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKLQkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBkYXRhOwotCWludCBsZW4gPSAwOwotCi0JbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAotCQkiUlggcGFja2V0czogJWx1XG4iCi0JCSJSWCBkZXNjIGVycjogJWx1XG4iCi0JCSJSWCByeCBvdmVyZmxvdyBlcnJvcjogJWx1XG4iLAotCQlwcml2LT5zdGF0cy5yeGludCwKLQkJcHJpdi0+c3RhdHMucnhyZHUsCi0JCXByaXYtPnN0YXRzLnJ4b3ZlcmZsb3cpOwotCi0JKmVvZiA9IDE7Ci0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIHZvaWQgcnRsODE5Ml9wcm9jX21vZHVsZV9pbml0KHZvaWQpCi17Ci0JUlRfVFJBQ0UoQ09NUF9JTklULCAiSW5pdGlhbGl6aW5nIHByb2MgZmlsZXN5c3RlbVxuIik7Ci0JcnRsODE5Ml9wcm9jID0gcHJvY19ta2RpcihSVEw4MTl4RV9NT0RVTEVfTkFNRSwgaW5pdF9uZXQucHJvY19uZXQpOwotfQotCi0KLXN0YXRpYyB2b2lkIHJ0bDgxOTJfcHJvY19tb2R1bGVfcmVtb3ZlKHZvaWQpCi17Ci0JcmVtb3ZlX3Byb2NfZW50cnkoUlRMODE5eEVfTU9EVUxFX05BTUUsIGluaXRfbmV0LnByb2NfbmV0KTsKLX0KLQotCi1zdGF0aWMgdm9pZCBydGw4MTkyX3Byb2NfcmVtb3ZlX29uZShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+aWVlZTgwMjExLT5kZXY7Ci0KLQlwcmludGsoImRldiBuYW1lPT09PT09PT4gJXNcbiIsZGV2LT5uYW1lKTsKLQotCWlmIChwcml2LT5kaXJfZGV2KSB7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJzdGF0cy10eCIsIHByaXYtPmRpcl9kZXYpOwotCQlyZW1vdmVfcHJvY19lbnRyeSgic3RhdHMtcngiLCBwcml2LT5kaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoInN0YXRzLWFwIiwgcHJpdi0+ZGlyX2Rldik7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJyZWdpc3RlcnMiLCBwcml2LT5kaXJfZGV2KTsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoIndsYW4wIiwgcnRsODE5Ml9wcm9jKTsKLQkJcHJpdi0+ZGlyX2RldiA9IE5VTEw7Ci0JfQotfQotCi0KLXN0YXRpYyB2b2lkIHJ0bDgxOTJfcHJvY19pbml0X29uZShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+aWVlZTgwMjExLT5kZXY7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICplOwotCi0JcHJpdi0+ZGlyX2RldiA9IHByb2NfbWtkaXIoZGV2LT5uYW1lLCBydGw4MTkyX3Byb2MpOwotCWlmICghcHJpdi0+ZGlyX2RldikgewotCQlSVF9UUkFDRShDT01QX0VSUiwgIlVuYWJsZSB0byBpbml0aWFsaXplIC9wcm9jL25ldC9ydGw4MTkyLyVzXG4iLAotCQkgICAgICBkZXYtPm5hbWUpOwotCQlyZXR1cm47Ci0JfQotCWUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJzdGF0cy1yeCIsIFNfSUZSRUcgfCBTX0lSVUdPLAotCQkJCSAgIHByaXYtPmRpcl9kZXYsIHByb2NfZ2V0X3N0YXRzX3J4LCBwcml2KTsKLQotCWlmICghZSkgewotCQlSVF9UUkFDRShDT01QX0VSUiwiVW5hYmxlIHRvIGluaXRpYWxpemUgIgotCQkgICAgICAiL3Byb2MvbmV0L3J0bDgxOTIvJXMvc3RhdHMtcnhcbiIsCi0JCSAgICAgIGRldi0+bmFtZSk7Ci0JfQotCi0KLQllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic3RhdHMtdHgiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBwcml2LT5kaXJfZGV2LCBwcm9jX2dldF9zdGF0c190eCwgcHJpdik7Ci0KLQlpZiAoIWUpIHsKLQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCi0JCSAgICAgICIvcHJvYy9uZXQvcnRsODE5Mi8lcy9zdGF0cy10eFxuIiwKLQkJICAgICAgZGV2LT5uYW1lKTsKLQl9Ci0KLQllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic3RhdHMtYXAiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkgICBwcml2LT5kaXJfZGV2LCBwcm9jX2dldF9zdGF0c19hcCwgcHJpdik7Ci0KLQlpZiAoIWUpIHsKLQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCi0JCSAgICAgICIvcHJvYy9uZXQvcnRsODE5Mi8lcy9zdGF0cy1hcFxuIiwKLQkJICAgICAgZGV2LT5uYW1lKTsKLQl9Ci0KLQllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgicmVnaXN0ZXJzIiwgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJICAgcHJpdi0+ZGlyX2RldiwgcHJvY19nZXRfcmVnaXN0ZXJzLCBwcml2KTsKLQlpZiAoIWUpIHsKLQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCi0JCSAgICAgICIvcHJvYy9uZXQvcnRsODE5Mi8lcy9yZWdpc3RlcnNcbiIsCi0JCSAgICAgIGRldi0+bmFtZSk7Ci0JfQotfQotCi1zdGF0aWMgc2hvcnQgY2hlY2tfbmljX2Vub3VnaF9kZXNjKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBpbnQgcHJpbykKLXsKLSAgICBzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGllZWUtPmRldik7Ci0gICAgc3RydWN0IHJ0bDgxOTJfdHhfcmluZyAqcmluZyA9ICZwcml2LT50eF9yaW5nW3ByaW9dOwotCi0gICAgLyogZm9yIG5vdyB3ZSByZXNlcnZlIHR3byBmcmVlIGRlc2NyaXB0b3IgYXMgYSBzYWZldHkgYm91bmRhcnkKLSAgICAgKiBiZXR3ZWVuIHRoZSB0YWlsIGFuZCB0aGUgaGVhZAotICAgICAqLwotICAgIHJldHVybiAocmluZy0+ZW50cmllcyAtIHNrYl9xdWV1ZV9sZW4oJnJpbmctPnF1ZXVlKSA+PSAyKTsKLX0KLQotc3RhdGljIHZvaWQgdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQotCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJlc2V0X3dxKTsKLQlwcmludGsoIlRYVElNRU9VVCIpOwotfQotCi1zdGF0aWMgdm9pZCBydGw4MTkyX2lycV9lbmFibGUoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0JdTMyIG1hc2s7Ci0KLQltYXNrID0gSU1SX1JPSyB8IElNUl9WT0RPSyB8IElNUl9WSURPSyB8IElNUl9CRURPSyB8IElNUl9CS0RPSyB8Ci0JICAgICAgIElNUl9IQ0NBRE9LIHwgSU1SX01HTlRET0sgfCBJTVJfQ09NRE9LIHwgSU1SX0hJR0hET0sgfAotCSAgICAgICBJTVJfQkRPSyB8IElNUl9SWENNRE9LIHwgSU1SX1RJTUVPVVQwIHwgSU1SX1JEVSB8IElNUl9SWEZPVlcgfAotCSAgICAgICBJTVJfVFhGT1ZXIHwgSU1SX0JjbkludCB8IElNUl9UQkRPSyB8IElNUl9UQkRFUjsKLQotCXdyaXRlX25pY19kd29yZChwcml2LCBJTlRBX01BU0ssIG1hc2spOwotfQotCi1zdGF0aWMgdm9pZCBydGw4MTkyX2lycV9kaXNhYmxlKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCXdyaXRlX25pY19kd29yZChwcml2LCBJTlRBX01BU0ssIDApOwotCXN5bmNocm9uaXplX2lycShwcml2LT5pcnEpOwotfQotCi1zdGF0aWMgdm9pZCBydGw4MTkyX3VwZGF0ZV9tc3Ioc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0JdTggbXNyOwotCi0JbXNyICA9IHJlYWRfbmljX2J5dGUocHJpdiwgTVNSKTsKLQltc3IgJj0gfiBNU1JfTElOS19NQVNLOwotCi0JLyogZG8gbm90IGNoYW5nZSBpbiBsaW5rX3N0YXRlICE9IFdMQU5fTElOS19BU1NPQ0lBVEVELgotCSAqIG1zciBtdXN0IGJlIHVwZGF0ZWQgaWYgdGhlIHN0YXRlIGlzIEFTU09DSUFUSU5HLgotCSAqIHRoaXMgaXMgaW50ZW50aW9uYWwgYW5kIG1ha2Ugc2Vuc2UgZm9yIGFkLWhvYyBhbmQKLQkgKiBtYXN0ZXIgKHNlZSB0aGUgY3JlYXRlIEJTUy9JQlNTIGZ1bmMpCi0JICovCi0JaWYgKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCl7Ci0KLQkJaWYgKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKQotCQkJbXNyIHw9IChNU1JfTElOS19NQU5BR0VEPDxNU1JfTElOS19TSElGVCk7Ci0JCWVsc2UgaWYgKHByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQotCQkJbXNyIHw9IChNU1JfTElOS19BREhPQzw8TVNSX0xJTktfU0hJRlQpOwotCQllbHNlIGlmIChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpCi0JCQltc3IgfD0gKE1TUl9MSU5LX01BU1RFUjw8TVNSX0xJTktfU0hJRlQpOwotCi0JfWVsc2UKLQkJbXNyIHw9IChNU1JfTElOS19OT05FPDxNU1JfTElOS19TSElGVCk7Ci0KLQl3cml0ZV9uaWNfYnl0ZShwcml2LCBNU1IsIG1zcik7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ0bDgxOTJfc2V0X2NoYW4oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU4MDIxMSwgc2hvcnQgY2gpCi17Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihpZWVlODAyMTEtPmRldik7Ci0KLQlwcml2LT5jaGFuID0gY2g7Ci0KLQkvKiBuZWVkIHRvIGltcGxlbWVudCByZiBzZXQgY2hhbm5lbCBoZXJlIFdCICovCi0KLQlpZiAocHJpdi0+cmZfc2V0X2NoYW4pCi0JCXByaXYtPnJmX3NldF9jaGFuKGllZWU4MDIxMSwgcHJpdi0+Y2hhbik7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ0bDgxOTJfcnhfZW5hYmxlKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCXdyaXRlX25pY19kd29yZChwcml2LCBSRFFEQSwgcHJpdi0+cnhfcmluZ19kbWEpOwotfQotCi0vKiB0aGUgVFhfREVTQ19CQVNFIHNldHRpbmcgaXMgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgcXVldWUgaW5kZXgKLSAqICBCS19RVUVVRSAgICAgICA9PT0+ICAgICAgICAgICAgICAgICAgICAgICAgMAotICogIEJFX1FVRVVFICAgICAgID09PT4gICAgICAgICAgICAgICAgICAgICAgICAxCi0gKiAgVklfUVVFVUUgICAgICAgPT09PiAgICAgICAgICAgICAgICAgICAgICAgIDIKLSAqICBWT19RVUVVRSAgICAgICA9PT0+ICAgICAgICAgICAgICAgICAgICAgICAgMwotICogIEhDQ0FfUVVFVUUgICAgID09PT4gICAgICAgICAgICAgICAgICAgICAgICA0Ci0gKiAgVFhDTURfUVVFVUUgICAgPT09PiAgICAgICAgICAgICAgICAgICAgICAgIDUKLSAqICBNR05UX1FVRVVFICAgICA9PT0+ICAgICAgICAgICAgICAgICAgICAgICAgNgotICogIEhJR0hfUVVFVUUgICAgID09PT4gICAgICAgICAgICAgICAgICAgICAgICA3Ci0gKiAgQkVBQ09OX1FVRVVFICAgPT09PiAgICAgICAgICAgICAgICAgICAgICAgIDgKLSAqICAqLwotc3RhdGljIGNvbnN0IHUzMiBUWF9ERVNDX0JBU0VbXSA9IHtCS1FEQSwgQkVRREEsIFZJUURBLCBWT1FEQSwgSENDQVFEQSwgQ1FEQSwgTVFEQSwgSFFEQSwgQlFEQX07Ci1zdGF0aWMgdm9pZCBydGw4MTkyX3R4X2VuYWJsZShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQl1MzIgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfVFhfUVVFVUVfQ09VTlQ7IGkrKykKLQkJd3JpdGVfbmljX2R3b3JkKHByaXYsIFRYX0RFU0NfQkFTRVtpXSwgcHJpdi0+dHhfcmluZ1tpXS5kbWEpOwotCi0JaWVlZTgwMjExX3Jlc2V0X3F1ZXVlKHByaXYtPmllZWU4MDIxMSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgcnRsODE5Ml9mcmVlX3J4X3Jpbmcoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+cnhyaW5nY291bnQ7IGkrKykgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJpdi0+cnhfYnVmW2ldOwotCQlpZiAoIXNrYikKLQkJCWNvbnRpbnVlOwotCi0JCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwKLQkJCQkgKigoZG1hX2FkZHJfdCAqKXNrYi0+Y2IpLAotCQkJCSBwcml2LT5yeGJ1ZmZlcnNpemUsIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCWtmcmVlX3NrYihza2IpOwotCX0KLQotCXBjaV9mcmVlX2NvbnNpc3RlbnQocHJpdi0+cGRldiwgc2l6ZW9mKCpwcml2LT5yeF9yaW5nKSAqIHByaXYtPnJ4cmluZ2NvdW50LAotCQkJICAgIHByaXYtPnJ4X3JpbmcsIHByaXYtPnJ4X3JpbmdfZG1hKTsKLQlwcml2LT5yeF9yaW5nID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgcnRsODE5Ml9mcmVlX3R4X3Jpbmcoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHVuc2lnbmVkIGludCBwcmlvKQotewotCXN0cnVjdCBydGw4MTkyX3R4X3JpbmcgKnJpbmcgPSAmcHJpdi0+dHhfcmluZ1twcmlvXTsKLQotCXdoaWxlIChza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSkpIHsKLQkJdHhfZGVzY184MTl4X3BjaSAqZW50cnkgPSAmcmluZy0+ZGVzY1tyaW5nLT5pZHhdOwotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gX19za2JfZGVxdWV1ZSgmcmluZy0+cXVldWUpOwotCi0JCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwgbGUzMl90b19jcHUoZW50cnktPlR4QnVmZkFkZHIpLAotCQkJCSBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlyaW5nLT5pZHggPSAocmluZy0+aWR4ICsgMSkgJSByaW5nLT5lbnRyaWVzOwotCX0KLQotCXBjaV9mcmVlX2NvbnNpc3RlbnQocHJpdi0+cGRldiwgc2l6ZW9mKCpyaW5nLT5kZXNjKSpyaW5nLT5lbnRyaWVzLAotCQkJICAgIHJpbmctPmRlc2MsIHJpbmctPmRtYSk7Ci0JcmluZy0+ZGVzYyA9IE5VTEw7Ci19Ci0KLXZvaWQgUEhZX1NldFJ0bDgxOTJlUmZPZmYoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0JLy9kaXNhYmxlIFJGLUNoaXAgQS9CCi0JcnRsODE5Ml9zZXRCQnJlZyhwcml2LCByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRSwgQklUNCwgMHgwKTsKLQkvL2FuYWxvZyB0byBkaWdpdGFsIG9mZiwgZm9yIHBvd2VyIHNhdmUKLQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXI0LCAweDMwMCwgMHgwKTsKLQkvL2RpZ2l0YWwgdG8gYW5hbG9nIG9mZiwgZm9yIHBvd2VyIHNhdmUKLQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIxLCAweDE4LCAweDApOwotCS8vcnggYW50ZW5uYSBvZmYKLQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJPRkRNMF9UUnhQYXRoRW5hYmxlLCAweGYsIDB4MCk7Ci0JLy9yeCBhbnRlbm5hIG9mZgotCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgck9GRE0xX1RSeFBhdGhFbmFibGUsIDB4ZiwgMHgwKTsKLQkvL2FuYWxvZyB0byBkaWdpdGFsIHBhcnQyIG9mZiwgZm9yIHBvd2VyIHNhdmUKLQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIxLCAweDYwLCAweDApOwotCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjEsIDB4NCwgMHgwKTsKLQkvLyBBbmFsb2cgcGFyYW1ldGVyISFDaGFuZ2UgYmlhcyBhbmQgTGJ1cyBjb250cm9sLgotCXdyaXRlX25pY19ieXRlKHByaXYsIEFOQVBBUl9GT1JfODE5MlBjaUUsIDB4MDcpOwotfQotCi1zdGF0aWMgdm9pZCBydGw4MTkyX2hhbHRfYWRhcHRlcihzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgYm9vbCByZXNldCkKLXsKLQlpbnQgaTsKLQl1OCBPcE1vZGU7Ci0JdTMyIHVsUmVnUmVhZDsKLQotCU9wTW9kZSA9IFJUX09QX01PREVfTk9fTElOSzsKLQlwcml2LT5pZWVlODAyMTEtPlNldEh3UmVnSGFuZGxlcihwcml2LT5pZWVlODAyMTEsIEhXX1ZBUl9NRURJQV9TVEFUVVMsICZPcE1vZGUpOwotCi0JaWYgKCFwcml2LT5pZWVlODAyMTEtPmJTdXBwb3J0UmVtb3RlV2FrZVVwKSB7Ci0JCS8qCi0JCSAqIGRpc2FibGUgdHgvcnguIEluIDgxODUgd2Ugd3JpdGUgMHgxMCAoUmVzZXQgYml0KSwKLQkJICogYnV0IGhlcmUgd2UgbWFrZSByZWZlcmVuY2UgdG8gV01BQyBhbmQgd2lydGUgMHgwCi0JCSAqLwotCQl3cml0ZV9uaWNfYnl0ZShwcml2LCBDTURSLCAwKTsKLQl9Ci0KLQltZGVsYXkoMjApOwotCi0JaWYgKCFyZXNldCkgewotCQltZGVsYXkoMTUwKTsKLQotCQlwcml2LT5iSHdSZk9mZkFjdGlvbiA9IDI7Ci0KLQkJLyoKLQkJICogQ2FsbCBNZ250QWN0U2V0X1JGX1N0YXRlIGluc3RlYWQgdG8KLQkJICogcHJldmVudCBSRiBjb25maWcgcmFjZSBjb25kaXRpb24uCi0JCSAqLwotCQlpZiAoIXByaXYtPmllZWU4MDIxMS0+YlN1cHBvcnRSZW1vdGVXYWtlVXApIHsKLQkJCVBIWV9TZXRSdGw4MTkyZVJmT2ZmKHByaXYpOwotCQkJdWxSZWdSZWFkID0gcmVhZF9uaWNfZHdvcmQocHJpdiwgQ1BVX0dFTik7Ci0JCQl1bFJlZ1JlYWQgfD0gQ1BVX0dFTl9TWVNURU1fUkVTRVQ7Ci0JCQl3cml0ZV9uaWNfZHdvcmQocHJpdixDUFVfR0VOLCB1bFJlZ1JlYWQpOwotCQl9IGVsc2UgewotCQkJLyogZm9yIFdPTCAqLwotCQkJd3JpdGVfbmljX2R3b3JkKHByaXYsIFdGQ1JDMCwgMHhmZmZmZmZmZik7Ci0JCQl3cml0ZV9uaWNfZHdvcmQocHJpdiwgV0ZDUkMxLCAweGZmZmZmZmZmKTsKLQkJCXdyaXRlX25pY19kd29yZChwcml2LCBXRkNSQzIsIDB4ZmZmZmZmZmYpOwotCi0JCQkvKiBXcml0ZSBQTVIgcmVnaXN0ZXIgKi8KLQkJCXdyaXRlX25pY19ieXRlKHByaXYsIFBNUiwgMHg1KTsKLQkJCS8qIERpc2FibGUgdHgsIGVuYW5ibGUgcnggKi8KLQkJCXdyaXRlX25pY19ieXRlKHByaXYsIE1hY0Jsa0N0cmwsIDB4YSk7Ci0JCX0KLQl9Ci0KLQlmb3IoaSA9IDA7IGkgPCBNQVhfUVVFVUVfU0laRTsgaSsrKSB7Ci0JCXNrYl9xdWV1ZV9wdXJnZSgmcHJpdi0+aWVlZTgwMjExLT5za2Jfd2FpdFEgW2ldKTsKLQl9Ci0JZm9yKGkgPSAwOyBpIDwgTUFYX1FVRVVFX1NJWkU7IGkrKykgewotCQlza2JfcXVldWVfcHVyZ2UoJnByaXYtPmllZWU4MDIxMS0+c2tiX2FnZ1EgW2ldKTsKLQl9Ci0KLQlza2JfcXVldWVfcHVyZ2UoJnByaXYtPnNrYl9xdWV1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ0bDgxOTJfZGF0YV9oYXJkX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU4MDIxMSkKLXsKLX0KLQotc3RhdGljIHZvaWQgcnRsODE5Ml9kYXRhX2hhcmRfcmVzdW1lKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTEpCi17Ci19Ci0KLS8qCi0gKiB0aGlzIGZ1bmN0aW9uIFRYIGRhdGEgZnJhbWVzIHdoZW4gdGhlIGllZWU4MDIxMSBzdGFjayByZXF1aXJlcyB0aGlzLgotICogSXQgY2hlY2tzIGFsc28gaWYgd2UgbmVlZCB0byBzdG9wIHRoZSBpZWVlIHR4IHF1ZXVlLCBldmVudHVhbGx5IGRvIGl0Ci0gKi8KLXN0YXRpYyB2b2lkIHJ0bDgxOTJfaGFyZF9kYXRhX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTgwMjExLCBpbnQgcmF0ZSkKLXsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGllZWU4MDIxMS0+ZGV2KTsKLQlpbnQgcmV0OwotCWNiX2Rlc2MgKnRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKLQl1OCBxdWV1ZV9pbmRleCA9IHRjYl9kZXNjLT5xdWV1ZV9pbmRleDsKLQotCS8qIHNoYWxsIG5vdCBiZSByZWZlcnJlZCBieSBjb21tYW5kIHBhY2tldCAqLwotCUJVR19PTihxdWV1ZV9pbmRleCA9PSBUWENNRF9RVUVVRSk7Ci0KLQlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgfHwgKCFwcml2LT51cCkpCi0JewotCQlrZnJlZV9za2Ioc2tiKTsKLQkJcmV0dXJuOwotCX0KLQotCXNrYl9wdXNoKHNrYiwgcHJpdi0+aWVlZTgwMjExLT50eF9oZWFkcm9vbSk7Ci0JcmV0ID0gcnRsODE5Ml90eChwcml2LCBza2IpOwotCWlmIChyZXQgIT0gMCkgewotCQlrZnJlZV9za2Ioc2tiKTsKLQl9Ci0KLQlpZiAocXVldWVfaW5kZXggIT0gTUdOVF9RVUVVRSkgewotCQlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X2J5dGVzICs9IChza2ItPmxlbiAtIHByaXYtPmllZWU4MDIxMS0+dHhfaGVhZHJvb20pOwotCQlwcml2LT5pZWVlODAyMTEtPnN0YXRzLnR4X3BhY2tldHMrKzsKLQl9Ci19Ci0KLS8qCi0gKiBUaGlzIGlzIGEgcm91Z2ggYXR0ZW1wdCB0byBUWCBhIGZyYW1lCi0gKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgaWVlZSA4MDIxMSBzdGFjayB0byBUWCBtYW5hZ2VtZW50IGZyYW1lcy4KLSAqIElmIHRoZSByaW5nIGlzIGZ1bGwgcGFja2V0IGFyZSBkcm9wcGVkIChmb3IgZGF0YSBmcmFtZSB0aGUgcXVldWUKLSAqIGlzIHN0b3BwZWQgYmVmb3JlIHRoaXMgY2FuIGhhcHBlbikuCi0gKi8KLXN0YXRpYyBpbnQgcnRsODE5Ml9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU4MDIxMSkKLXsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGllZWU4MDIxMS0+ZGV2KTsKLQlpbnQgcmV0OwotICAgICAgICBjYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7Ci0gICAgICAgIHU4IHF1ZXVlX2luZGV4ID0gdGNiX2Rlc2MtPnF1ZXVlX2luZGV4OwotCi0gICAgICAgIGlmIChxdWV1ZV9pbmRleCAhPSBUWENNRF9RVUVVRSkgewotCQlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgfHwgKCFwcml2LT51cCkpCi0JCXsKLQkJCWtmcmVlX3NrYihza2IpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLSAgICAgICAgfQotCi0JaWYgKHF1ZXVlX2luZGV4ID09IFRYQ01EX1FVRVVFKSB7Ci0JCXJ0bDgxOXhFX3R4X2NtZChwcml2LCBza2IpOwotCQlyZXQgPSAwOwotCQlyZXR1cm4gcmV0OwotCX0gZWxzZSB7Ci0JCXRjYl9kZXNjLT5SQVRSSW5kZXggPSA3OwotCQl0Y2JfZGVzYy0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjayA9IDE7Ci0JCXRjYl9kZXNjLT5iVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGUgPSAxOwotCQl0Y2JfZGVzYy0+YlR4RW5hYmxlRndDYWxjRHVyID0gMTsKLQkJc2tiX3B1c2goc2tiLCBpZWVlODAyMTEtPnR4X2hlYWRyb29tKTsKLQkJcmV0ID0gcnRsODE5Ml90eChwcml2LCBza2IpOwotCQlpZiAocmV0ICE9IDApIHsKLQkJCWtmcmVlX3NrYihza2IpOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgdm9pZCBydGw4MTkyX3R4X2lzcihzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgaW50IHByaW8pCi17Ci0Jc3RydWN0IHJ0bDgxOTJfdHhfcmluZyAqcmluZyA9ICZwcml2LT50eF9yaW5nW3ByaW9dOwotCi0Jd2hpbGUgKHNrYl9xdWV1ZV9sZW4oJnJpbmctPnF1ZXVlKSkgewotCQl0eF9kZXNjXzgxOXhfcGNpICplbnRyeSA9ICZyaW5nLT5kZXNjW3JpbmctPmlkeF07Ci0JCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQkJLyoKLQkJICogYmVhY29uIHBhY2tldCB3aWxsIG9ubHkgdXNlIHRoZSBmaXJzdCBkZXNjcmlwdG9yIGRlZmF1bHRseSwKLQkJICogYW5kIHRoZSBPV04gbWF5IG5vdCBiZSBjbGVhcmVkIGJ5IHRoZSBoYXJkd2FyZQotCQkgKi8KLQkJaWYgKHByaW8gIT0gQkVBQ09OX1FVRVVFKSB7Ci0JCQlpZiAoZW50cnktPk9XTikKLQkJCQlyZXR1cm47Ci0JCQlyaW5nLT5pZHggPSAocmluZy0+aWR4ICsgMSkgJSByaW5nLT5lbnRyaWVzOwotCQl9Ci0KLQkJc2tiID0gX19za2JfZGVxdWV1ZSgmcmluZy0+cXVldWUpOwotCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsIGxlMzJfdG9fY3B1KGVudHJ5LT5UeEJ1ZmZBZGRyKSwKLQkJCQkgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOwotCi0JCWtmcmVlX3NrYihza2IpOwotCX0KLQotCWlmIChwcmlvICE9IEJFQUNPTl9RVUVVRSkgewotCQkvKiB0cnkgdG8gZGVhbCB3aXRoIHRoZSBwZW5kaW5nIHBhY2tldHMgICovCi0JCXRhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmlycV90eF90YXNrbGV0KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHJ0bDgxOTJfc3RvcF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU4MDIxMSkKLXsKLX0KLQotc3RhdGljIHZvaWQgcnRsODE5Ml9jb25maWdfcmF0ZShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgdTE2KiByYXRlX2NvbmZpZykKLXsKLQkgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQ7Ci0JIHU4IGk9MCwgYmFzaWNfcmF0ZSA9IDA7Ci0JIG5ldCA9ICYgcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcms7Ci0KLQkgZm9yIChpPTA7IGk8bmV0LT5yYXRlc19sZW47IGkrKykKLQkgewotCQkgYmFzaWNfcmF0ZSA9IG5ldC0+cmF0ZXNbaV0mMHg3ZjsKLQkJIHN3aXRjaChiYXNpY19yYXRlKQotCQkgewotCQkJIGNhc2UgTUdOXzFNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl8xTTsJYnJlYWs7Ci0JCQkgY2FzZSBNR05fMk06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzJNOwlicmVhazsKLQkJCSBjYXNlIE1HTl81XzVNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl81XzVNOwlicmVhazsKLQkJCSBjYXNlIE1HTl8xMU06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzExTTsJYnJlYWs7Ci0JCQkgY2FzZSBNR05fNk06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzZNOwlicmVhazsKLQkJCSBjYXNlIE1HTl85TToJKnJhdGVfY29uZmlnIHw9IFJSU1JfOU07CWJyZWFrOwotCQkJIGNhc2UgTUdOXzEyTToJKnJhdGVfY29uZmlnIHw9IFJSU1JfMTJNOwlicmVhazsKLQkJCSBjYXNlIE1HTl8xOE06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzE4TTsJYnJlYWs7Ci0JCQkgY2FzZSBNR05fMjRNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl8yNE07CWJyZWFrOwotCQkJIGNhc2UgTUdOXzM2TToJKnJhdGVfY29uZmlnIHw9IFJSU1JfMzZNOwlicmVhazsKLQkJCSBjYXNlIE1HTl80OE06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzQ4TTsJYnJlYWs7Ci0JCQkgY2FzZSBNR05fNTRNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl81NE07CWJyZWFrOwotCQkgfQotCSB9Ci0JIGZvciAoaT0wOyBpPG5ldC0+cmF0ZXNfZXhfbGVuOyBpKyspCi0JIHsKLQkJIGJhc2ljX3JhdGUgPSBuZXQtPnJhdGVzX2V4W2ldJjB4N2Y7Ci0JCSBzd2l0Y2goYmFzaWNfcmF0ZSkKLQkJIHsKLQkJCSBjYXNlIE1HTl8xTToJKnJhdGVfY29uZmlnIHw9IFJSU1JfMU07CWJyZWFrOwotCQkJIGNhc2UgTUdOXzJNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl8yTTsJYnJlYWs7Ci0JCQkgY2FzZSBNR05fNV81TToJKnJhdGVfY29uZmlnIHw9IFJSU1JfNV81TTsJYnJlYWs7Ci0JCQkgY2FzZSBNR05fMTFNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl8xMU07CWJyZWFrOwotCQkJIGNhc2UgTUdOXzZNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl82TTsJYnJlYWs7Ci0JCQkgY2FzZSBNR05fOU06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzlNOwlicmVhazsKLQkJCSBjYXNlIE1HTl8xMk06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzEyTTsJYnJlYWs7Ci0JCQkgY2FzZSBNR05fMThNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl8xOE07CWJyZWFrOwotCQkJIGNhc2UgTUdOXzI0TToJKnJhdGVfY29uZmlnIHw9IFJSU1JfMjRNOwlicmVhazsKLQkJCSBjYXNlIE1HTl8zNk06CSpyYXRlX2NvbmZpZyB8PSBSUlNSXzM2TTsJYnJlYWs7Ci0JCQkgY2FzZSBNR05fNDhNOgkqcmF0ZV9jb25maWcgfD0gUlJTUl80OE07CWJyZWFrOwotCQkJIGNhc2UgTUdOXzU0TToJKnJhdGVfY29uZmlnIHw9IFJSU1JfNTRNOwlicmVhazsKLQkJIH0KLQkgfQotfQotCi0KLSNkZWZpbmUgU0hPUlRfU0xPVF9USU1FIDkKLSNkZWZpbmUgTk9OX1NIT1JUX1NMT1RfVElNRSAyMAotCi1zdGF0aWMgdm9pZCBydGw4MTkyX3VwZGF0ZV9jYXAoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHUxNiBjYXApCi17Ci0JdTMyIHRtcCA9IDA7Ci0Jc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQgPSAmcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcms7Ci0KLQlwcml2LT5zaG9ydF9wcmVhbWJsZSA9IGNhcCAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRTsKLQl0bXAgPSBwcml2LT5iYXNpY19yYXRlOwotCWlmIChwcml2LT5zaG9ydF9wcmVhbWJsZSkKLQkJdG1wIHw9IEJSU1JfQWNrU2hvcnRQbWI7Ci0Jd3JpdGVfbmljX2R3b3JkKHByaXYsIFJSU1IsIHRtcCk7Ci0KLQlpZiAobmV0LT5tb2RlICYgKElFRUVfR3xJRUVFX05fMjRHKSkKLQl7Ci0JCXU4IHNsb3RfdGltZSA9IDA7Ci0JCWlmICgoY2FwICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1QpJiYoIXByaXYtPmllZWU4MDIxMS0+cEhUSW5mby0+YkN1cnJlbnRSVDJSVExvbmdTbG90VGltZSkpCi0JCXsvL3Nob3J0IHNsb3QgdGltZQotCQkJc2xvdF90aW1lID0gU0hPUlRfU0xPVF9USU1FOwotCQl9Ci0JCWVsc2UgLy9sb25nIHNsb3QgdGltZQotCQkJc2xvdF90aW1lID0gTk9OX1NIT1JUX1NMT1RfVElNRTsKLQkJcHJpdi0+c2xvdF90aW1lID0gc2xvdF90aW1lOwotCQl3cml0ZV9uaWNfYnl0ZShwcml2LCBTTE9UX1RJTUUsIHNsb3RfdGltZSk7Ci0JfQotCi19Ci0KLXN0YXRpYyB2b2lkIHJ0bDgxOTJfbmV0X3VwZGF0ZShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldDsKLQl1MTYgQmNuVGltZUNmZyA9IDAsIEJjbkNXID0gNiwgQmNuSUZTID0gMHhmOwotCXUxNiByYXRlX2NvbmZpZyA9IDA7Ci0JbmV0ID0gJnByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrOwotCi0JLyogdXBkYXRlIEJhc2ljIHJhdGU6IFJSLCBCUlNSICovCi0JcnRsODE5Ml9jb25maWdfcmF0ZShwcml2LCAmcmF0ZV9jb25maWcpOwotCi0JLyoKLQkgKiBTZWxlY3QgUlJTUiAoaW4gTGVnYWN5LU9GRE0gYW5kIENDSykKLQkgKiBGb3IgODE5MCwgd2Ugc2VsZWN0IG9ubHkgMjRNLCAxMk0sIDZNLCAxMU0sIDUuNU0sCi0JICogMk0sIGFuZCAxTSBmcm9tIHRoZSBCYXNpYyByYXRlLgotCSAqIFdlIGRvIG5vdCB1c2Ugb3RoZXIgcmF0ZXMuCi0JICovCi0JcHJpdi0+YmFzaWNfcmF0ZSA9IHJhdGVfY29uZmlnICY9IDB4MTVmOwotCi0JLyogQlNTSUQgKi8KLQl3cml0ZV9uaWNfZHdvcmQocHJpdiwgQlNTSURSLCAoKHUzMiAqKW5ldC0+YnNzaWQpWzBdKTsKLQl3cml0ZV9uaWNfd29yZChwcml2LCBCU1NJRFIrNCwgKCh1MTYgKiluZXQtPmJzc2lkKVsyXSk7Ci0KLQlpZiAocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCi0JewotCQl3cml0ZV9uaWNfd29yZChwcml2LCBBVElNV05ELCAyKTsKLQkJd3JpdGVfbmljX3dvcmQocHJpdiwgQkNOX0RNQVRJTUUsIDI1Nik7Ci0JCXdyaXRlX25pY193b3JkKHByaXYsIEJDTl9JTlRFUlZBTCwgbmV0LT5iZWFjb25faW50ZXJ2YWwpOwotCQkvKgotCQkgKiBCSVQxNSBvZiBCQ05fRFJWX0VBUkxZX0lOVCB3aWxsIGluZGljYXRlCi0JCSAqIHdoZXRoZXIgc29mdHdhcmUgYmVhY29uIG9yIGh3IGJlYWNvbiBpcyBhcHBsaWVkLgotCQkgKi8KLQkJd3JpdGVfbmljX3dvcmQocHJpdiwgQkNOX0RSVl9FQVJMWV9JTlQsIDEwKTsKLQkJd3JpdGVfbmljX2J5dGUocHJpdiwgQkNOX0VSUl9USFJFU0gsIDEwMCk7Ci0KLQkJQmNuVGltZUNmZyB8PSAoQmNuQ1c8PEJDTl9UQ0ZHX0NXX1NISUZUKTsKLQkJLyogVE9ETzogQmNuSUZTIG1heSByZXF1aXJlZCB0byBiZSBjaGFuZ2VkIG9uIEFTSUMgKi8KLQkJQmNuVGltZUNmZyB8PSBCY25JRlM8PEJDTl9UQ0ZHX0lGUzsKLQkJd3JpdGVfbmljX3dvcmQocHJpdiwgQkNOX1RDRkcsIEJjblRpbWVDZmcpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgcnRsODE5eEVfdHhfY21kKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotICAgIHN0cnVjdCBydGw4MTkyX3R4X3JpbmcgKnJpbmc7Ci0gICAgdHhfZGVzY184MTl4X3BjaSAqZW50cnk7Ci0gICAgdW5zaWduZWQgaW50IGlkeDsKLSAgICBkbWFfYWRkcl90IG1hcHBpbmc7Ci0gICAgY2JfZGVzYyAqdGNiX2Rlc2M7Ci0gICAgdW5zaWduZWQgbG9uZyBmbGFnczsKLQotICAgIHJpbmcgPSAmcHJpdi0+dHhfcmluZ1tUWENNRF9RVUVVRV07Ci0gICAgbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOwotCi0gICAgc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmlycV90aF9sb2NrLGZsYWdzKTsKLSAgICBpZHggPSAocmluZy0+aWR4ICsgc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpKSAlIHJpbmctPmVudHJpZXM7Ci0gICAgZW50cnkgPSAmcmluZy0+ZGVzY1tpZHhdOwotCi0gICAgdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOwotICAgIG1lbXNldChlbnRyeSwwLDEyKTsKLSAgICBlbnRyeS0+TElOSVAgPSB0Y2JfZGVzYy0+Ykxhc3RJbmlQa3Q7Ci0gICAgZW50cnktPkZpcnN0U2VnID0gMTsvL2ZpcnN0IHNlZ21lbnQKLSAgICBlbnRyeS0+TGFzdFNlZyA9IDE7IC8vbGFzdCBzZWdtZW50Ci0gICAgaWYodGNiX2Rlc2MtPmJDbWRPckluaXQgPT0gREVTQ19QQUNLRVRfVFlQRV9JTklUKSB7Ci0gICAgICAgIGVudHJ5LT5DbWRJbml0ID0gREVTQ19QQUNLRVRfVFlQRV9JTklUOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVudHJ5LT5DbWRJbml0ID0gREVTQ19QQUNLRVRfVFlQRV9OT1JNQUw7Ci0gICAgICAgIGVudHJ5LT5PZmZzZXQgPSBzaXplb2YoVFhfRldJTkZPXzgxOTBQQ0kpICsgODsKLSAgICAgICAgZW50cnktPlBrdFNpemUgPSAodTE2KSh0Y2JfZGVzYy0+cGt0X3NpemUgKyBlbnRyeS0+T2Zmc2V0KTsKLSAgICAgICAgZW50cnktPlF1ZXVlU2VsZWN0ID0gUVNMVF9DTUQ7Ci0gICAgICAgIGVudHJ5LT5UeEZXSW5mb1NpemUgPSAweDA4OwotICAgICAgICBlbnRyeS0+UkFUaWQgPSAodTgpREVTQ19QQUNLRVRfVFlQRV9JTklUOwotICAgIH0KLSAgICBlbnRyeS0+VHhCdWZmZXJTaXplID0gc2tiLT5sZW47Ci0gICAgZW50cnktPlR4QnVmZkFkZHIgPSBjcHVfdG9fbGUzMihtYXBwaW5nKTsKLSAgICBlbnRyeS0+T1dOID0gMTsKLQotICAgIF9fc2tiX3F1ZXVlX3RhaWwoJnJpbmctPnF1ZXVlLCBza2IpOwotICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycV90aF9sb2NrLGZsYWdzKTsKLQotICAgIHdyaXRlX25pY19ieXRlKHByaXYsIFRQUG9sbCwgVFBQb2xsX0NRKTsKLQotICAgIHJldHVybjsKLX0KLQotLyoKLSAqIE1hcHBpbmcgU29mdHdhcmUvSGFyZHdhcmUgZGVzY3JpcHRvciBxdWV1ZSBpZCB0byAiUXVldWUgU2VsZWN0IEZpZWxkIgotICogaW4gVHhGd0luZm8gZGF0YSBzdHJ1Y3R1cmUKLSAqLwotc3RhdGljIHU4IE1hcEh3UXVldWVUb0Zpcm13YXJlUXVldWUodTggUXVldWVJRCkKLXsKLQl1OCBRdWV1ZVNlbGVjdCA9IDA7Ci0KLQlzd2l0Y2ggKFF1ZXVlSUQpIHsKLQljYXNlIEJFX1FVRVVFOgotCQlRdWV1ZVNlbGVjdCA9IFFTTFRfQkU7Ci0JCWJyZWFrOwotCi0JY2FzZSBCS19RVUVVRToKLQkJUXVldWVTZWxlY3QgPSBRU0xUX0JLOwotCQlicmVhazsKLQotCWNhc2UgVk9fUVVFVUU6Ci0JCVF1ZXVlU2VsZWN0ID0gUVNMVF9WTzsKLQkJYnJlYWs7Ci0KLQljYXNlIFZJX1FVRVVFOgotCQlRdWV1ZVNlbGVjdCA9IFFTTFRfVkk7Ci0JCWJyZWFrOwotCi0JY2FzZSBNR05UX1FVRVVFOgotCQlRdWV1ZVNlbGVjdCA9IFFTTFRfTUdOVDsKLQkJYnJlYWs7Ci0KLQljYXNlIEJFQUNPTl9RVUVVRToKLQkJUXVldWVTZWxlY3QgPSBRU0xUX0JFQUNPTjsKLQkJYnJlYWs7Ci0KLQljYXNlIFRYQ01EX1FVRVVFOgotCQlRdWV1ZVNlbGVjdCA9IFFTTFRfQ01EOwotCQlicmVhazsKLQotCWNhc2UgSElHSF9RVUVVRToKLQlkZWZhdWx0OgotCQlSVF9UUkFDRShDT01QX0VSUiwgIkltcG9zc2libGUgUXVldWUgU2VsZWN0aW9uOiAlZFxuIiwgUXVldWVJRCk7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gUXVldWVTZWxlY3Q7Ci19Ci0KLXN0YXRpYyB1OCBNUmF0ZVRvSHdSYXRlODE5MFBjaSh1OCByYXRlKQotewotCXU4ICByZXQgPSBERVNDOTBfUkFURTFNOwotCi0Jc3dpdGNoKHJhdGUpIHsKLQkJY2FzZSBNR05fMU06CXJldCA9IERFU0M5MF9SQVRFMU07CQlicmVhazsKLQkJY2FzZSBNR05fMk06CXJldCA9IERFU0M5MF9SQVRFMk07CQlicmVhazsKLQkJY2FzZSBNR05fNV81TToJcmV0ID0gREVTQzkwX1JBVEU1XzVNOwlicmVhazsKLQkJY2FzZSBNR05fMTFNOglyZXQgPSBERVNDOTBfUkFURTExTTsJYnJlYWs7Ci0JCWNhc2UgTUdOXzZNOglyZXQgPSBERVNDOTBfUkFURTZNOwkJYnJlYWs7Ci0JCWNhc2UgTUdOXzlNOglyZXQgPSBERVNDOTBfUkFURTlNOwkJYnJlYWs7Ci0JCWNhc2UgTUdOXzEyTToJcmV0ID0gREVTQzkwX1JBVEUxMk07CWJyZWFrOwotCQljYXNlIE1HTl8xOE06CXJldCA9IERFU0M5MF9SQVRFMThNOwlicmVhazsKLQkJY2FzZSBNR05fMjRNOglyZXQgPSBERVNDOTBfUkFURTI0TTsJYnJlYWs7Ci0JCWNhc2UgTUdOXzM2TToJcmV0ID0gREVTQzkwX1JBVEUzNk07CWJyZWFrOwotCQljYXNlIE1HTl80OE06CXJldCA9IERFU0M5MF9SQVRFNDhNOwlicmVhazsKLQkJY2FzZSBNR05fNTRNOglyZXQgPSBERVNDOTBfUkFURTU0TTsJYnJlYWs7Ci0KLQkJLy8gSFQgcmF0ZSBzaW5jZSBoZXJlCi0JCWNhc2UgTUdOX01DUzA6CXJldCA9IERFU0M5MF9SQVRFTUNTMDsJYnJlYWs7Ci0JCWNhc2UgTUdOX01DUzE6CXJldCA9IERFU0M5MF9SQVRFTUNTMTsJYnJlYWs7Ci0JCWNhc2UgTUdOX01DUzI6CXJldCA9IERFU0M5MF9SQVRFTUNTMjsJYnJlYWs7Ci0JCWNhc2UgTUdOX01DUzM6CXJldCA9IERFU0M5MF9SQVRFTUNTMzsJYnJlYWs7Ci0JCWNhc2UgTUdOX01DUzQ6CXJldCA9IERFU0M5MF9SQVRFTUNTNDsJYnJlYWs7Ci0JCWNhc2UgTUdOX01DUzU6CXJldCA9IERFU0M5MF9SQVRFTUNTNTsJYnJlYWs7Ci0JCWNhc2UgTUdOX01DUzY6CXJldCA9IERFU0M5MF9SQVRFTUNTNjsJYnJlYWs7Ci0JCWNhc2UgTUdOX01DUzc6CXJldCA9IERFU0M5MF9SQVRFTUNTNzsJYnJlYWs7Ci0JCWNhc2UgTUdOX01DUzg6CXJldCA9IERFU0M5MF9SQVRFTUNTODsJYnJlYWs7Ci0JCWNhc2UgTUdOX01DUzk6CXJldCA9IERFU0M5MF9SQVRFTUNTOTsJYnJlYWs7Ci0JCWNhc2UgTUdOX01DUzEwOglyZXQgPSBERVNDOTBfUkFURU1DUzEwOwlicmVhazsKLQkJY2FzZSBNR05fTUNTMTE6CXJldCA9IERFU0M5MF9SQVRFTUNTMTE7CWJyZWFrOwotCQljYXNlIE1HTl9NQ1MxMjoJcmV0ID0gREVTQzkwX1JBVEVNQ1MxMjsJYnJlYWs7Ci0JCWNhc2UgTUdOX01DUzEzOglyZXQgPSBERVNDOTBfUkFURU1DUzEzOwlicmVhazsKLQkJY2FzZSBNR05fTUNTMTQ6CXJldCA9IERFU0M5MF9SQVRFTUNTMTQ7CWJyZWFrOwotCQljYXNlIE1HTl9NQ1MxNToJcmV0ID0gREVTQzkwX1JBVEVNQ1MxNTsJYnJlYWs7Ci0JCWNhc2UgKDB4ODB8MHgyMCk6IHJldCA9IERFU0M5MF9SQVRFTUNTMzI7IGJyZWFrOwotCi0JCWRlZmF1bHQ6ICAgICAgIGJyZWFrOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyB1OCBRdWVyeUlzU2hvcnQodTggVHhIVCwgdTggVHhSYXRlLCBjYl9kZXNjICp0Y2JfZGVzYykKLXsKLQl1OCAgIHRtcF9TaG9ydDsKLQotCXRtcF9TaG9ydCA9IChUeEhUPT0xKT8oKHRjYl9kZXNjLT5iVXNlU2hvcnRHSSk/MTowKTooKHRjYl9kZXNjLT5iVXNlU2hvcnRQcmVhbWJsZSk/MTowKTsKLQotCWlmKFR4SFQ9PTEgJiYgVHhSYXRlICE9IERFU0M5MF9SQVRFTUNTMTUpCi0JCXRtcF9TaG9ydCA9IDA7Ci0KLQlyZXR1cm4gdG1wX1Nob3J0OwotfQotCi0vKgotICogVGhlIHR4IHByb2NlZHVyZSBpcyBqdXN0IGFzIGZvbGxvd2luZywKLSAqIHNrYi0+Y2Igd2lsbCBjb250YWluIGFsbCB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uLAotICogcHJpb3JpdHksIG1vcmVmcmFnLCByYXRlLCAmZGV2LgotICovCi1zdGF0aWMgc2hvcnQgcnRsODE5Ml90eChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgc3RydWN0IHNrX2J1ZmYqIHNrYikKLXsKLQlzdHJ1Y3QgcnRsODE5Ml90eF9yaW5nICpyaW5nOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JY2JfZGVzYyAqdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOwotCXR4X2Rlc2NfODE5eF9wY2kgKnBkZXNjID0gTlVMTDsKLQlUWF9GV0lORk9fODE5MFBDSSAqcFR4RndJbmZvID0gTlVMTDsKLQlkbWFfYWRkcl90IG1hcHBpbmc7Ci0JYm9vbCBtdWx0aV9hZGRyID0gZmFsc2UsIGJyb2FkX2FkZHIgPSBmYWxzZSwgdW5pX2FkZHIgPSBmYWxzZTsKLQl1OCAqcGRhX2FkZHIgPSBOVUxMOwotCWludCBpZHg7Ci0KLQlpZiAocHJpdi0+YmRpc2FibGVfbmljKSB7Ci0JCVJUX1RSQUNFKENPTVBfRVJSLCAiTmljIGlzIGRpc2FibGVkISBDYW4ndCB0eCBwYWNrZXQgbGVuPSVkIHFpZHg9JWQhISFcbiIsCi0JCQkgc2tiLT5sZW4sIHRjYl9kZXNjLT5xdWV1ZV9pbmRleCk7Ci0JCXJldHVybiBza2ItPmxlbjsKLQl9Ci0KLSNpZmRlZiBFTkFCTEVfTFBTCi0JcHJpdi0+aWVlZTgwMjExLT5iQXdha2VQa3RTZW50ID0gdHJ1ZTsKLSNlbmRpZgotCi0JbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOwotCi0JLyogY29sbGVjdCB0aGUgdHggcGFja2V0cyBzdGF0aXRjcyAqLwotCXBkYV9hZGRyID0gKCh1OCAqKXNrYi0+ZGF0YSkgKyBzaXplb2YoVFhfRldJTkZPXzgxOTBQQ0kpOwotCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwZGFfYWRkcikpCi0JCW11bHRpX2FkZHIgPSB0cnVlOwotCWVsc2UgaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKHBkYV9hZGRyKSkKLQkJYnJvYWRfYWRkciA9IHRydWU7Ci0JZWxzZQotCQl1bmlfYWRkciA9IHRydWU7Ci0KLQlpZiAodW5pX2FkZHIpCi0JCXByaXYtPnN0YXRzLnR4Ynl0ZXN1bmljYXN0ICs9ICh1OCkoc2tiLT5sZW4pIC0gc2l6ZW9mKFRYX0ZXSU5GT184MTkwUENJKTsKLQotCS8qIGZpbGwgdHggZmlybXdhcmUgKi8KLQlwVHhGd0luZm8gPSAoUFRYX0ZXSU5GT184MTkwUENJKXNrYi0+ZGF0YTsKLQltZW1zZXQocFR4RndJbmZvLCAwLCBzaXplb2YoVFhfRldJTkZPXzgxOTBQQ0kpKTsKLQlwVHhGd0luZm8tPlR4SFQgPSAodGNiX2Rlc2MtPmRhdGFfcmF0ZSYweDgwKSA/IDEgOiAwOwotCXBUeEZ3SW5mby0+VHhSYXRlID0gTVJhdGVUb0h3UmF0ZTgxOTBQY2koKHU4KXRjYl9kZXNjLT5kYXRhX3JhdGUpOwotCXBUeEZ3SW5mby0+RW5hYmxlQ1BVRHVyID0gdGNiX2Rlc2MtPmJUeEVuYWJsZUZ3Q2FsY0R1cjsKLQlwVHhGd0luZm8tPlNob3J0ID0gUXVlcnlJc1Nob3J0KHBUeEZ3SW5mby0+VHhIVCwgcFR4RndJbmZvLT5UeFJhdGUsIHRjYl9kZXNjKTsKLQotCS8qIEFnZ3JlZ2F0aW9uIHJlbGF0ZWQgKi8KLQlpZiAodGNiX2Rlc2MtPmJBTVBEVUVuYWJsZSkgewotCQlwVHhGd0luZm8tPkFsbG93QWdncmVnYXRpb24gPSAxOwotCQlwVHhGd0luZm8tPlJ4TUYgPSB0Y2JfZGVzYy0+YW1wZHVfZmFjdG9yOwotCQlwVHhGd0luZm8tPlJ4QU1EID0gdGNiX2Rlc2MtPmFtcGR1X2RlbnNpdHk7Ci0JfSBlbHNlIHsKLQkJcFR4RndJbmZvLT5BbGxvd0FnZ3JlZ2F0aW9uID0gMDsKLQkJcFR4RndJbmZvLT5SeE1GID0gMDsKLQkJcFR4RndJbmZvLT5SeEFNRCA9IDA7Ci0JfQotCi0JLyogUHJvdGVjdGlvbiBtb2RlIHJlbGF0ZWQgKi8KLQlwVHhGd0luZm8tPlJ0c0VuYWJsZSA9ICh0Y2JfZGVzYy0+YlJUU0VuYWJsZSkgPyAxIDogMDsKLQlwVHhGd0luZm8tPkN0c0VuYWJsZSA9ICh0Y2JfZGVzYy0+YkNUU0VuYWJsZSkgPyAxIDogMDsKLQlwVHhGd0luZm8tPlJ0c1NUQkMgPSAodGNiX2Rlc2MtPmJSVFNTVEJDKSA/IDEgOiAwOwotCXBUeEZ3SW5mby0+UnRzSFQgPSAodGNiX2Rlc2MtPnJ0c19yYXRlJjB4ODApID8gMSA6IDA7Ci0JcFR4RndJbmZvLT5SdHNSYXRlID0gTVJhdGVUb0h3UmF0ZTgxOTBQY2koKHU4KXRjYl9kZXNjLT5ydHNfcmF0ZSk7Ci0JcFR4RndJbmZvLT5SdHNCYW5kd2lkdGggPSAwOwotCXBUeEZ3SW5mby0+UnRzU3ViY2FycmllciA9IHRjYl9kZXNjLT5SVFNTQzsKLQlwVHhGd0luZm8tPlJ0c1Nob3J0ID0gKHBUeEZ3SW5mby0+UnRzSFQgPT0gMCkgPyAodGNiX2Rlc2MtPmJSVFNVc2VTaG9ydFByZWFtYmxlID8gMSA6IDApIDogKHRjYl9kZXNjLT5iUlRTVXNlU2hvcnRHST8gMSA6IDApOwotCi0JLyogU2V0IEJhbmR3aWR0aCBhbmQgc3ViLWNoYW5uZWwgc2V0dGluZ3MuICovCi0JaWYgKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMF80MCkgewotCQlpZiAodGNiX2Rlc2MtPmJQYWNrZXRCVykgewotCQkJcFR4RndJbmZvLT5UeEJhbmR3aWR0aCA9IDE7Ci0JCQkvKiB1c2UgZHVwbGljYXRlZCBtb2RlICovCi0JCQlwVHhGd0luZm8tPlR4U3ViQ2FycmllciA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlwVHhGd0luZm8tPlR4QmFuZHdpZHRoID0gMDsKLQkJCXBUeEZ3SW5mby0+VHhTdWJDYXJyaWVyID0gcHJpdi0+bkN1cjQwTWh6UHJpbWVTQzsKLQkJfQotCX0gZWxzZSB7Ci0JCXBUeEZ3SW5mby0+VHhCYW5kd2lkdGggPSAwOwotCQlwVHhGd0luZm8tPlR4U3ViQ2FycmllciA9IDA7Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmlycV90aF9sb2NrLCBmbGFncyk7Ci0JcmluZyA9ICZwcml2LT50eF9yaW5nW3RjYl9kZXNjLT5xdWV1ZV9pbmRleF07Ci0JaWYgKHRjYl9kZXNjLT5xdWV1ZV9pbmRleCAhPSBCRUFDT05fUVVFVUUpCi0JCWlkeCA9IChyaW5nLT5pZHggKyBza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSkpICUgcmluZy0+ZW50cmllczsKLQllbHNlCi0JCWlkeCA9IDA7Ci0KLQlwZGVzYyA9ICZyaW5nLT5kZXNjW2lkeF07Ci0JaWYgKChwZGVzYy0+T1dOID09IDEpICYmICh0Y2JfZGVzYy0+cXVldWVfaW5kZXggIT0gQkVBQ09OX1FVRVVFKSkgewotCQlSVF9UUkFDRShDT01QX0VSUiwgIk5vIG1vcmUgVFggZGVzY0AlZCwgcmluZy0+aWR4ID0gJWQsaWR4ID0gJWQsJXhcbiIsCi0JCQkgdGNiX2Rlc2MtPnF1ZXVlX2luZGV4LCByaW5nLT5pZHgsIGlkeCwgc2tiLT5sZW4pOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFfdGhfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gc2tiLT5sZW47Ci0JfQotCi0JLyogZmlsbCB0eCBkZXNjcmlwdG9yICovCi0JbWVtc2V0KHBkZXNjLCAwLCAxMik7Ci0KLQkvKkRXT1JEIDAqLwotCXBkZXNjLT5MSU5JUCA9IDA7Ci0JcGRlc2MtPkNtZEluaXQgPSAxOwotCXBkZXNjLT5PZmZzZXQgPSBzaXplb2YoVFhfRldJTkZPXzgxOTBQQ0kpICsgODsgLyogV2UgbXVzdCBhZGQgOCEhICovCi0JcGRlc2MtPlBrdFNpemUgPSAodTE2KXNrYi0+bGVuLXNpemVvZihUWF9GV0lORk9fODE5MFBDSSk7Ci0KLQkvKkRXT1JEIDEqLwotCXBkZXNjLT5TZWNDQU1JRCA9IDA7Ci0JcGRlc2MtPlJBVGlkID0gdGNiX2Rlc2MtPlJBVFJJbmRleDsKLQotCXBkZXNjLT5Ob0VuYyA9IDE7Ci0JcGRlc2MtPlNlY1R5cGUgPSAweDA7Ci0JaWYgKHRjYl9kZXNjLT5iSHdTZWMpIHsKLQkJc3dpdGNoIChwcml2LT5pZWVlODAyMTEtPnBhaXJ3aXNlX2tleV90eXBlKSB7Ci0JCWNhc2UgS0VZX1RZUEVfV0VQNDA6Ci0JCWNhc2UgS0VZX1RZUEVfV0VQMTA0OgotCQkJcGRlc2MtPlNlY1R5cGUgPSAweDE7Ci0JCQlwZGVzYy0+Tm9FbmMgPSAwOwotCQkJYnJlYWs7Ci0JCWNhc2UgS0VZX1RZUEVfVEtJUDoKLQkJCXBkZXNjLT5TZWNUeXBlID0gMHgyOwotCQkJcGRlc2MtPk5vRW5jID0gMDsKLQkJCWJyZWFrOwotCQljYXNlIEtFWV9UWVBFX0NDTVA6Ci0JCQlwZGVzYy0+U2VjVHlwZSA9IDB4MzsKLQkJCXBkZXNjLT5Ob0VuYyA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSBLRVlfVFlQRV9OQToKLQkJCXBkZXNjLT5TZWNUeXBlID0gMHgwOwotCQkJcGRlc2MtPk5vRW5jID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyogU2V0IFBhY2tldCBJRCAqLwotCXBkZXNjLT5Qa3RJZCA9IDB4MDsKLQotCXBkZXNjLT5RdWV1ZVNlbGVjdCA9IE1hcEh3UXVldWVUb0Zpcm13YXJlUXVldWUodGNiX2Rlc2MtPnF1ZXVlX2luZGV4KTsKLQlwZGVzYy0+VHhGV0luZm9TaXplID0gc2l6ZW9mKFRYX0ZXSU5GT184MTkwUENJKTsKLQotCXBkZXNjLT5ESVNGQiA9IHRjYl9kZXNjLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrOwotCXBkZXNjLT5VU0VSQVRFID0gdGNiX2Rlc2MtPmJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZTsKLQotCXBkZXNjLT5GaXJzdFNlZyA9IDE7Ci0JcGRlc2MtPkxhc3RTZWcgPSAxOwotCXBkZXNjLT5UeEJ1ZmZlclNpemUgPSBza2ItPmxlbjsKLQotCXBkZXNjLT5UeEJ1ZmZBZGRyID0gY3B1X3RvX2xlMzIobWFwcGluZyk7Ci0JX19za2JfcXVldWVfdGFpbCgmcmluZy0+cXVldWUsIHNrYik7Ci0JcGRlc2MtPk9XTiA9IDE7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxX3RoX2xvY2ssIGZsYWdzKTsKLQlwcml2LT5pZWVlODAyMTEtPmRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOwotCXdyaXRlX25pY193b3JkKHByaXYsIFRQUG9sbCwgMHgwMTw8dGNiX2Rlc2MtPnF1ZXVlX2luZGV4KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNob3J0IHJ0bDgxOTJfYWxsb2NfcnhfZGVzY19yaW5nKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotICAgIHJ4X2Rlc2NfODE5eF9wY2kgKmVudHJ5ID0gTlVMTDsKLSAgICBpbnQgaTsKLQotICAgIHByaXYtPnJ4X3JpbmcgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwcml2LT5wZGV2LAotICAgICAgICAgICAgc2l6ZW9mKCpwcml2LT5yeF9yaW5nKSAqIHByaXYtPnJ4cmluZ2NvdW50LCAmcHJpdi0+cnhfcmluZ19kbWEpOwotCi0gICAgaWYgKCFwcml2LT5yeF9yaW5nIHx8ICh1bnNpZ25lZCBsb25nKXByaXYtPnJ4X3JpbmcgJiAweEZGKSB7Ci0gICAgICAgIFJUX1RSQUNFKENPTVBfRVJSLCJDYW5ub3QgYWxsb2NhdGUgUlggcmluZ1xuIik7Ci0gICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgIH0KLQotICAgIG1lbXNldChwcml2LT5yeF9yaW5nLCAwLCBzaXplb2YoKnByaXYtPnJ4X3JpbmcpICogcHJpdi0+cnhyaW5nY291bnQpOwotICAgIHByaXYtPnJ4X2lkeCA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcHJpdi0+cnhyaW5nY291bnQ7IGkrKykgewotICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYihwcml2LT5yeGJ1ZmZlcnNpemUpOwotICAgICAgICBkbWFfYWRkcl90ICptYXBwaW5nOwotICAgICAgICBlbnRyeSA9ICZwcml2LT5yeF9yaW5nW2ldOwotICAgICAgICBpZiAoIXNrYikKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBwcml2LT5yeF9idWZbaV0gPSBza2I7Ci0gICAgICAgIG1hcHBpbmcgPSAoZG1hX2FkZHJfdCAqKXNrYi0+Y2I7Ci0gICAgICAgICptYXBwaW5nID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGRldiwgc2tiX3RhaWxfcG9pbnRlcihza2IpLAotICAgICAgICAgICAgICAgIHByaXYtPnJ4YnVmZmVyc2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQotICAgICAgICBlbnRyeS0+QnVmZmVyQWRkcmVzcyA9IGNwdV90b19sZTMyKCptYXBwaW5nKTsKLQotICAgICAgICBlbnRyeS0+TGVuZ3RoID0gcHJpdi0+cnhidWZmZXJzaXplOwotICAgICAgICBlbnRyeS0+T1dOID0gMTsKLSAgICB9Ci0KLSAgICBlbnRyeS0+RU9SID0gMTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBydGw4MTkyX2FsbG9jX3R4X2Rlc2NfcmluZyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwKLSAgICAgICAgdW5zaWduZWQgaW50IHByaW8sIHVuc2lnbmVkIGludCBlbnRyaWVzKQotewotICAgIHR4X2Rlc2NfODE5eF9wY2kgKnJpbmc7Ci0gICAgZG1hX2FkZHJfdCBkbWE7Ci0gICAgaW50IGk7Ci0KLSAgICByaW5nID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocHJpdi0+cGRldiwgc2l6ZW9mKCpyaW5nKSAqIGVudHJpZXMsICZkbWEpOwotICAgIGlmICghcmluZyB8fCAodW5zaWduZWQgbG9uZylyaW5nICYgMHhGRikgewotICAgICAgICBSVF9UUkFDRShDT01QX0VSUiwgIkNhbm5vdCBhbGxvY2F0ZSBUWCByaW5nIChwcmlvID0gJWQpXG4iLCBwcmlvKTsKLSAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgfQotCi0gICAgbWVtc2V0KHJpbmcsIDAsIHNpemVvZigqcmluZykqZW50cmllcyk7Ci0gICAgcHJpdi0+dHhfcmluZ1twcmlvXS5kZXNjID0gcmluZzsKLSAgICBwcml2LT50eF9yaW5nW3ByaW9dLmRtYSA9IGRtYTsKLSAgICBwcml2LT50eF9yaW5nW3ByaW9dLmlkeCA9IDA7Ci0gICAgcHJpdi0+dHhfcmluZ1twcmlvXS5lbnRyaWVzID0gZW50cmllczsKLSAgICBza2JfcXVldWVfaGVhZF9pbml0KCZwcml2LT50eF9yaW5nW3ByaW9dLnF1ZXVlKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspCi0gICAgICAgIHJpbmdbaV0uTmV4dERlc2NBZGRyZXNzID0KLSAgICAgICAgICAgIGNwdV90b19sZTMyKCh1MzIpZG1hICsgKChpICsgMSkgJSBlbnRyaWVzKSAqIHNpemVvZigqcmluZykpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzaG9ydCBydGw4MTkyX3BjaV9pbml0ZGVzY3Jpbmcoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0JdTMyIHJldDsKLQlpbnQgaTsKLQotCXJldCA9IHJ0bDgxOTJfYWxsb2NfcnhfZGVzY19yaW5nKHByaXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBnZW5lcmFsIHByb2Nlc3MgZm9yIG90aGVyIHF1ZXVlICovCi0JZm9yIChpID0gMDsgaSA8IE1BWF9UWF9RVUVVRV9DT1VOVDsgaSsrKSB7Ci0JCXJldCA9IHJ0bDgxOTJfYWxsb2NfdHhfZGVzY19yaW5nKHByaXYsIGksIHByaXYtPnR4cmluZ2NvdW50KTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyX2ZyZWVfcmluZ3M7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycl9mcmVlX3JpbmdzOgotCXJ0bDgxOTJfZnJlZV9yeF9yaW5nKHByaXYpOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfVFhfUVVFVUVfQ09VTlQ7IGkrKykKLQkJaWYgKHByaXYtPnR4X3JpbmdbaV0uZGVzYykKLQkJCXJ0bDgxOTJfZnJlZV90eF9yaW5nKHByaXYsIGkpOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBydGw4MTkyX3BjaV9yZXNldGRlc2NyaW5nKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotICAgIGludCBpOwotCi0gICAgLyogZm9yY2UgdGhlIHJ4X2lkeCB0byB0aGUgZmlyc3Qgb25lICovCi0gICAgaWYocHJpdi0+cnhfcmluZykgewotICAgICAgICByeF9kZXNjXzgxOXhfcGNpICplbnRyeSA9IE5VTEw7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcml2LT5yeHJpbmdjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBlbnRyeSA9ICZwcml2LT5yeF9yaW5nW2ldOwotICAgICAgICAgICAgZW50cnktPk9XTiA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdi0+cnhfaWR4ID0gMDsKLSAgICB9Ci0KLSAgICAvKiBhZnRlciByZXNldCwgcmVsZWFzZSBwcmV2aW91cyBwZW5kaW5nIHBhY2tldCwgYW5kIGZvcmNlIHRoZQotICAgICAqIHR4IGlkeCB0byB0aGUgZmlyc3Qgb25lICovCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9UWF9RVUVVRV9DT1VOVDsgaSsrKSB7Ci0gICAgICAgIGlmIChwcml2LT50eF9yaW5nW2ldLmRlc2MpIHsKLSAgICAgICAgICAgIHN0cnVjdCBydGw4MTkyX3R4X3JpbmcgKnJpbmcgPSAmcHJpdi0+dHhfcmluZ1tpXTsKLQotICAgICAgICAgICAgd2hpbGUgKHNrYl9xdWV1ZV9sZW4oJnJpbmctPnF1ZXVlKSkgewotICAgICAgICAgICAgICAgIHR4X2Rlc2NfODE5eF9wY2kgKmVudHJ5ID0gJnJpbmctPmRlc2NbcmluZy0+aWR4XTsKLSAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gX19za2JfZGVxdWV1ZSgmcmluZy0+cXVldWUpOwotCi0gICAgICAgICAgICAgICAgcGNpX3VubWFwX3NpbmdsZShwcml2LT5wZGV2LCBsZTMyX3RvX2NwdShlbnRyeS0+VHhCdWZmQWRkciksCi0gICAgICAgICAgICAgICAgICAgICAgICBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7Ci0gICAgICAgICAgICAgICAga2ZyZWVfc2tiKHNrYik7Ci0gICAgICAgICAgICAgICAgcmluZy0+aWR4ID0gKHJpbmctPmlkeCArIDEpICUgcmluZy0+ZW50cmllczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJpbmctPmlkeCA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHJ0bDgxOTJfbGlua19jaGFuZ2Uoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCi17Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihpZWVlLT5kZXYpOwotCi0JaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpCi0JewotCQlydGw4MTkyX25ldF91cGRhdGUocHJpdik7Ci0JCXJ0bDgxOTJfdXBkYXRlX3JhdHJfdGFibGUocHJpdik7Ci0KLQkJLy9hZGQgdGhpcyBhcyBpbiBwdXJlIE4gbW9kZSwgd2VwIGVuY3J5cHRpb24gd2lsbCB1c2Ugc29mdHdhcmUgd2F5LCBidXQgdGhlcmUgaXMgbm8gY2hhbmNlIHRvIHNldCB0aGlzIGFzIHdlcCB3aWxsIG5vdCBzZXQgZ3JvdXAga2V5IGluIHdleHQuIFdCLjIwMDguMDcuMDgKLQkJaWYgKChLRVlfVFlQRV9XRVA0MCA9PSBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSkgfHwgKEtFWV9UWVBFX1dFUDEwNCA9PSBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSkpCi0JCUVuYWJsZUhXU2VjdXJpdHlDb25maWc4MTkyKHByaXYpOwotCX0KLQllbHNlCi0JewotCQl3cml0ZV9uaWNfYnl0ZShwcml2LCAweDE3MywgMCk7Ci0JfQotCi0JcnRsODE5Ml91cGRhdGVfbXNyKHByaXYpOwotCi0JLy8gMjAwNy8xMC8xNiBNSCBNQUMgV2lsbCB1cGRhdGUgVFNGIGFjY29yZGluZyB0byBhbGwgcmVjZWl2ZWQgYmVhY29uLCBzbyB3ZSBoYXZlCi0JLy8JLy8gVG8gc2V0IENCU1NJRCBiaXQgd2hlbiBsaW5rIHdpdGggYW55IEFQIG9yIFNUQS4KLQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBIHx8IGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKLQl7Ci0JCXUzMiByZWcgPSAwOwotCQlyZWcgPSByZWFkX25pY19kd29yZChwcml2LCBSQ1IpOwotCQlpZiAocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQotCQkJcHJpdi0+UmVjZWl2ZUNvbmZpZyA9IHJlZyB8PSBSQ1JfQ0JTU0lEOwotCQllbHNlCi0JCQlwcml2LT5SZWNlaXZlQ29uZmlnID0gcmVnICY9IH5SQ1JfQ0JTU0lEOwotCQl3cml0ZV9uaWNfZHdvcmQocHJpdiwgUkNSLCByZWcpOwotCX0KLX0KLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9xb3NfcGFyYW1ldGVycyBkZWZfcW9zX3BhcmFtZXRlcnMgPSB7Ci0gICAgICAgIHszLDMsMywzfSwvKiBjd19taW4gKi8KLSAgICAgICAgezcsNyw3LDd9LC8qIGN3X21heCAqLwotICAgICAgICB7MiwyLDIsMn0sLyogYWlmcyAqLwotICAgICAgICB7MCwwLDAsMH0sLyogZmxhZ3MgKi8KLSAgICAgICAgezAsMCwwLDB9IC8qIHR4X29wX2xpbWl0ICovCi19OwotCi1zdGF0aWMgdm9pZCBydGw4MTkyX3VwZGF0ZV9iZWFjb24oc3RydWN0IHdvcmtfc3RydWN0ICogd29yaykKLXsKLSAgICAgICAgc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHI4MTkyX3ByaXYsIHVwZGF0ZV9iZWFjb25fd3Eud29yayk7Ci0gCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlID0gcHJpdi0+aWVlZTgwMjExOwotCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayogbmV0ID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKLQotCWlmIChpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCkKLQkJSFRVcGRhdGVTZWxmQW5kUGVlclNldHRpbmcoaWVlZSwgbmV0KTsKLQlpZWVlLT5wSFRJbmZvLT5iQ3VycmVudFJUMlJUTG9uZ1Nsb3RUaW1lID0gbmV0LT5ic3NodC5iZFJUMlJUTG9uZ1Nsb3RUaW1lOwotCXJ0bDgxOTJfdXBkYXRlX2NhcChwcml2LCBuZXQtPmNhcGFiaWxpdHkpOwotfQotCi0vKgotKiBiYWNrZ3JvdW5kIHN1cHBvcnQgdG8gcnVuIFFvUyBhY3RpdmF0ZSBmdW5jdGlvbmFsaXR5Ci0qLwotc3RhdGljIGNvbnN0IGludCBXRENBUEFSQV9BRERbXSA9IHtFRENBUEFSQV9CRSxFRENBUEFSQV9CSyxFRENBUEFSQV9WSSxFRENBUEFSQV9WT307Ci1zdGF0aWMgdm9pZCBydGw4MTkyX3Fvc19hY3RpdmF0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKiB3b3JrKQotewotICAgICAgICBzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcjgxOTJfcHJpdiwgcW9zX2FjdGl2YXRlKTsKLSAgICAgICAgc3RydWN0IGllZWU4MDIxMV9xb3NfcGFyYW1ldGVycyAqcW9zX3BhcmFtZXRlcnMgPSAmcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEucGFyYW1ldGVyczsKLSAgICAgICAgdTggbW9kZSA9IHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLm1vZGU7Ci0JdTggIHUxYkFJRlM7Ci0JdTMyIHU0YkFjUGFyYW07Ci0gICAgICAgIGludCBpOwotCi0gICAgICAgIG11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLSAgICAgICAgaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKQotCQlnb3RvIHN1Y2Nlc3M7Ci0JUlRfVFJBQ0UoQ09NUF9RT1MsInFvcyBhY3RpdmUgcHJvY2VzcyB3aXRoIGFzc29jaWF0ZSByZXNwb25zZSByZWNlaXZlZFxuIik7Ci0JLyogSXQgYmV0dGVyIHNldCBzbG90IHRpbWUgYXQgZmlyc3QgKi8KLQkvKiBGb3Igd2UganVzdCBzdXBwb3J0IGIvZyBtb2RlIGF0IHByZXNlbnQsIGxldCB0aGUgc2xvdCB0aW1lIGF0IDkvMjAgc2VsZWN0aW9uICovCi0JLyogdXBkYXRlIHRoZSBhYyBwYXJhbWV0ZXIgdG8gcmVsYXRlZCByZWdpc3RlcnMgKi8KLQlmb3IoaSA9IDA7IGkgPCAgUU9TX1FVRVVFX05VTTsgaSsrKSB7Ci0JCS8vTW9kZSBHL0E6IHNsb3RUaW1lVGltZXIgPSA5OyBNb2RlIEI6IDIwCi0JCXUxYkFJRlMgPSBxb3NfcGFyYW1ldGVycy0+YWlmc1tpXSAqICgobW9kZSYoSUVFRV9HfElFRUVfTl8yNEcpKSA/OToyMCkgKyBhU2lmc1RpbWU7Ci0JCXU0YkFjUGFyYW0gPSAoKCgodTMyKShxb3NfcGFyYW1ldGVycy0+dHhfb3BfbGltaXRbaV0pKTw8IEFDX1BBUkFNX1RYT1BfTElNSVRfT0ZGU0VUKXwKLQkJCQkoKCh1MzIpKHFvc19wYXJhbWV0ZXJzLT5jd19tYXhbaV0pKTw8IEFDX1BBUkFNX0VDV19NQVhfT0ZGU0VUKXwKLQkJCQkoKCh1MzIpKHFvc19wYXJhbWV0ZXJzLT5jd19taW5baV0pKTw8IEFDX1BBUkFNX0VDV19NSU5fT0ZGU0VUKXwKLQkJCQkoKHUzMil1MWJBSUZTIDw8IEFDX1BBUkFNX0FJRlNfT0ZGU0VUKSk7Ci0JCXdyaXRlX25pY19kd29yZChwcml2LCBXRENBUEFSQV9BRERbaV0sIHU0YkFjUGFyYW0pOwotCX0KLQotc3VjY2VzczoKLSAgICAgICAgbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci19Ci0KLXN0YXRpYyBpbnQgcnRsODE5Ml9xb3NfaGFuZGxlX3Byb2JlX3Jlc3BvbnNlKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LAotCQlpbnQgYWN0aXZlX25ldHdvcmssCi0JCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaykKLXsKLQlpbnQgcmV0ID0gMDsKLQl1MzIgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJzKTsKLQotCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgIT1JRUVFODAyMTFfTElOS0VEKQotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICAgICAgaWYgKChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLQotCWlmIChuZXR3b3JrLT5mbGFncyAmIE5FVFdPUktfSEFTX1FPU19NQVNLKSB7Ci0JCWlmIChhY3RpdmVfbmV0d29yayAmJgotCQkJCShuZXR3b3JrLT5mbGFncyAmIE5FVFdPUktfSEFTX1FPU19QQVJBTUVURVJTKSkKLQkJCW5ldHdvcmstPnFvc19kYXRhLmFjdGl2ZSA9IG5ldHdvcmstPnFvc19kYXRhLnN1cHBvcnRlZDsKLQotCQlpZiAoKG5ldHdvcmstPnFvc19kYXRhLmFjdGl2ZSA9PSAxKSAmJiAoYWN0aXZlX25ldHdvcmsgPT0gMSkgJiYKLQkJCQkobmV0d29yay0+ZmxhZ3MgJiBORVRXT1JLX0hBU19RT1NfUEFSQU1FVEVSUykgJiYKLQkJCQkobmV0d29yay0+cW9zX2RhdGEub2xkX3BhcmFtX2NvdW50ICE9Ci0JCQkJIG5ldHdvcmstPnFvc19kYXRhLnBhcmFtX2NvdW50KSkgewotCQkJbmV0d29yay0+cW9zX2RhdGEub2xkX3BhcmFtX2NvdW50ID0KLQkJCQluZXR3b3JrLT5xb3NfZGF0YS5wYXJhbV9jb3VudDsKLQkJCXF1ZXVlX3dvcmsocHJpdi0+cHJpdl93cSwgJnByaXYtPnFvc19hY3RpdmF0ZSk7Ci0JCQlSVF9UUkFDRSAoQ09NUF9RT1MsICJRb1MgcGFyYW1ldGVycyBjaGFuZ2UgY2FsbCAiCi0JCQkJCSJxb3NfYWN0aXZhdGVcbiIpOwotCQl9Ci0JfSBlbHNlIHsKLQkJbWVtY3B5KCZwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5wYXJhbWV0ZXJzLAotCQkgICAgICAgJmRlZl9xb3NfcGFyYW1ldGVycywgc2l6ZSk7Ci0KLQkJaWYgKChuZXR3b3JrLT5xb3NfZGF0YS5hY3RpdmUgPT0gMSkgJiYgKGFjdGl2ZV9uZXR3b3JrID09IDEpKSB7Ci0JCQlxdWV1ZV93b3JrKHByaXYtPnByaXZfd3EsICZwcml2LT5xb3NfYWN0aXZhdGUpOwotCQkJUlRfVFJBQ0UoQ09NUF9RT1MsICJRb1Mgd2FzIGRpc2FibGVkIGNhbGwgcW9zX2FjdGl2YXRlXG4iKTsKLQkJfQotCQluZXR3b3JrLT5xb3NfZGF0YS5hY3RpdmUgPSAwOwotCQluZXR3b3JrLT5xb3NfZGF0YS5zdXBwb3J0ZWQgPSAwOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBoYW5kbGUgbWFuYWdlIGZyYW1lIGZyYW1lIGJlYWNvbiBhbmQgcHJvYmUgcmVzcG9uc2UgKi8KLXN0YXRpYyBpbnQgcnRsODE5Ml9oYW5kbGVfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMV9iZWFjb24gKiBiZWFjb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKiBuZXR3b3JrKQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoaWVlZS0+ZGV2KTsKLQotCXJ0bDgxOTJfcW9zX2hhbmRsZV9wcm9iZV9yZXNwb25zZShwcml2LDEsbmV0d29yayk7Ci0KLQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+cHJpdl93cSwgJnByaXYtPnVwZGF0ZV9iZWFjb25fd3EsIDApOwotCXJldHVybiAwOwotCi19Ci0KLS8qCi0gKiBoYW5kbGluZyB0aGUgYmVhY29uaW5nIHJlc3BvbnNlcy4gaWYgd2UgZ2V0IGRpZmZlcmVudCBRb1Mgc2V0dGluZwotICogb2ZmIHRoZSBuZXR3b3JrIGZyb20gdGhlIGFzc29jaWF0ZWQgc2V0dGluZywgYWRqdXN0IHRoZSBRb1Mgc2V0dGluZwotICovCi1zdGF0aWMgaW50IHJ0bDgxOTJfcW9zX2Fzc29jaWF0aW9uX3Jlc3Aoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldHdvcmspCi17Ci0JaW50IHJldCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc19wYXJhbWV0ZXJzKTsKLQlpbnQgc2V0X3Fvc19wYXJhbSA9IDA7Ci0KLQlpZiAoKHByaXYgPT0gTlVMTCkgfHwgKG5ldHdvcmsgPT0gTlVMTCkpCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSkpCi0JCXJldHVybiByZXQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aWVlZTgwMjExLT5sb2NrLCBmbGFncyk7Ci0JaWYgKG5ldHdvcmstPmZsYWdzICYgTkVUV09SS19IQVNfUU9TX1BBUkFNRVRFUlMpIHsKLQkJbWVtY3B5KCZwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5wYXJhbWV0ZXJzLAotCQkJICZuZXR3b3JrLT5xb3NfZGF0YS5wYXJhbWV0ZXJzLAotCQkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMpKTsKLQkJcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlID0gMTsKLQkJc2V0X3Fvc19wYXJhbSA9IDE7Ci0JCS8qIHVwZGF0ZSBxb3MgcGFyYW1ldGVyIGZvciBjdXJyZW50IG5ldHdvcmsgKi8KLQkJcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEub2xkX3BhcmFtX2NvdW50ID0KLQkJCXByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnBhcmFtX2NvdW50OwotCQlwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5wYXJhbV9jb3VudCA9Ci0JCQluZXR3b3JrLT5xb3NfZGF0YS5wYXJhbV9jb3VudDsKLQotCX0gZWxzZSB7Ci0JCW1lbWNweSgmcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEucGFyYW1ldGVycywKLQkJICAgICAgICZkZWZfcW9zX3BhcmFtZXRlcnMsIHNpemUpOwotCQlwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUgPSAwOwotCQlwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5zdXBwb3J0ZWQgPSAwOwotCQlzZXRfcW9zX3BhcmFtID0gMTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pZWVlODAyMTEtPmxvY2ssIGZsYWdzKTsKLQotCVJUX1RSQUNFKENPTVBfUU9TLCAiJXM6IG5ldHdvcmstPmZsYWdzID0gJWQsJWRcbiIsIF9fRlVOQ1RJT05fXywKLQkJbmV0d29yay0+ZmxhZ3MsIHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSk7Ci0JaWYgKHNldF9xb3NfcGFyYW0gPT0gMSkKLQkJcXVldWVfd29yayhwcml2LT5wcml2X3dxLCAmcHJpdi0+cW9zX2FjdGl2YXRlKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIGludCBydGw4MTkyX2hhbmRsZV9hc3NvY19yZXNwb25zZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICpyZXNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0d29yaykKLXsKLSAgICAgICAgc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihpZWVlLT5kZXYpOwotICAgICAgICBydGw4MTkyX3Fvc19hc3NvY2lhdGlvbl9yZXNwKHByaXYsIG5ldHdvcmspOwotICAgICAgICByZXR1cm4gMDsKLX0KLQotCi0vKiB1cGRhdGVSQVRSVGFiZWwgZm9yIE1DUyBvbmx5LiBCYXNpYyByYXRlIGlzIG5vdCBpbXBsZW1lbnRlZC4gKi8KLXN0YXRpYyB2b2lkIHJ0bDgxOTJfdXBkYXRlX3JhdHJfdGFibGUoc3RydWN0IHI4MTkyX3ByaXYqIHByaXYpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUgPSBwcml2LT5pZWVlODAyMTE7Ci0JdTgqIHBNY3NSYXRlID0gaWVlZS0+ZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldDsKLQl1MzIgcmF0cl92YWx1ZSA9IDA7Ci0JdTggcmF0ZV9pbmRleCA9IDA7Ci0KLQlydGw4MTkyX2NvbmZpZ19yYXRlKHByaXYsICh1MTYqKSgmcmF0cl92YWx1ZSkpOwotCXJhdHJfdmFsdWUgfD0gKCoodTE2KikocE1jc1JhdGUpKSA8PCAxMjsKLQotCXN3aXRjaCAoaWVlZS0+bW9kZSkKLQl7Ci0JCWNhc2UgSUVFRV9BOgotCQkJcmF0cl92YWx1ZSAmPSAweDAwMDAwRkYwOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUVFRV9COgotCQkJcmF0cl92YWx1ZSAmPSAweDAwMDAwMDBGOwotCQkJYnJlYWs7Ci0JCWNhc2UgSUVFRV9HOgotCQkJcmF0cl92YWx1ZSAmPSAweDAwMDAwRkY3OwotCQkJYnJlYWs7Ci0JCWNhc2UgSUVFRV9OXzI0RzoKLQkJY2FzZSBJRUVFX05fNUc6Ci0JCQlpZiAoaWVlZS0+cEhUSW5mby0+UGVlck1pbW9QcyA9PSAwKSAvL01JTU9fUFNfU1RBVElDCi0JCQkJcmF0cl92YWx1ZSAmPSAweDAwMDdGMDA3OwotCQkJZWxzZXsKLQkJCQlpZiAocHJpdi0+cmZfdHlwZSA9PSBSRl8xVDJSKQotCQkJCQlyYXRyX3ZhbHVlICY9IDB4MDAwRkYwMDc7Ci0JCQkJZWxzZQotCQkJCQlyYXRyX3ZhbHVlICY9IDB4MEY4MUYwMDc7Ci0JCQl9Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCX0KLQlyYXRyX3ZhbHVlICY9IDB4MEZGRkZGRkY7Ci0JaWYoaWVlZS0+cEhUSW5mby0+YkN1clR4Qlc0ME1IeiAmJiBpZWVlLT5wSFRJbmZvLT5iQ3VyU2hvcnRHSTQwTUh6KXsKLQkJcmF0cl92YWx1ZSB8PSAweDgwMDAwMDAwOwotCX1lbHNlIGlmKCFpZWVlLT5wSFRJbmZvLT5iQ3VyVHhCVzQwTUh6ICYmIGllZWUtPnBIVEluZm8tPmJDdXJTaG9ydEdJMjBNSHopewotCQlyYXRyX3ZhbHVlIHw9IDB4ODAwMDAwMDA7Ci0JfQotCXdyaXRlX25pY19kd29yZChwcml2LCBSQVRSMCtyYXRlX2luZGV4KjQsIHJhdHJfdmFsdWUpOwotCXdyaXRlX25pY19ieXRlKHByaXYsIFVGV1AsIDEpOwotfQotCi1zdGF0aWMgYm9vbCBHZXRObW9kZVN1cHBvcnRCeVNlY0NmZzgxOTBQY2koc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCi17Ci0JcmV0dXJuICEoaWVlZS0+cnRsbGliX2FwX3NlY190eXBlICYmCi0JCSAoaWVlZS0+cnRsbGliX2FwX3NlY190eXBlKGllZWUpJihTRUNfQUxHX1dFUHxTRUNfQUxHX1RLSVApKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ0bDgxOTJfcmVmcmVzaF9zdXBwb3J0cmF0ZShzdHJ1Y3QgcjgxOTJfcHJpdiogcHJpdikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKLQkvL3dlIGRvbm90IGNvbnNpZGVyIHNldCBzdXBwb3J0IHJhdGUgZm9yIEFCRyBtb2RlLCBvbmx5IEhUIE1DUyByYXRlIGlzIHNldCBoZXJlLgotCWlmIChpZWVlLT5tb2RlID09IFdJUkVMRVNTX01PREVfTl8yNEcgfHwgaWVlZS0+bW9kZSA9PSBXSVJFTEVTU19NT0RFX05fNUcpCi0JewotCQltZW1jcHkoaWVlZS0+UmVnZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCwgaWVlZS0+UmVnSFRTdXBwUmF0ZVNldCwgMTYpOwotCX0KLQllbHNlCi0JCW1lbXNldChpZWVlLT5SZWdkb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0LCAwLCAxNik7Ci19Ci0KLXN0YXRpYyB1OCBydGw4MTkyX2dldFN1cHBvcnRlZFdpcmVsZWVNb2RlKHZvaWQpCi17Ci0JcmV0dXJuIChXSVJFTEVTU19NT0RFX05fMjRHfFdJUkVMRVNTX01PREVfR3xXSVJFTEVTU19NT0RFX0IpOwotfQotCi1zdGF0aWMgdm9pZCBydGw4MTkyX1NldFdpcmVsZXNzTW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggd2lyZWxlc3NfbW9kZSkKLXsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGllZWUtPmRldik7Ci0JdTggYlN1cHBvcnRNb2RlID0gcnRsODE5Ml9nZXRTdXBwb3J0ZWRXaXJlbGVlTW9kZSgpOwotCi0JaWYgKCh3aXJlbGVzc19tb2RlID09IFdJUkVMRVNTX01PREVfQVVUTykgfHwgKCh3aXJlbGVzc19tb2RlJmJTdXBwb3J0TW9kZSk9PTApKQotCXsKLQkJaWYoYlN1cHBvcnRNb2RlICYgV0lSRUxFU1NfTU9ERV9OXzI0RykKLQkJewotCQkJd2lyZWxlc3NfbW9kZSA9IFdJUkVMRVNTX01PREVfTl8yNEc7Ci0JCX0KLQkJZWxzZSBpZihiU3VwcG9ydE1vZGUgJiBXSVJFTEVTU19NT0RFX05fNUcpCi0JCXsKLQkJCXdpcmVsZXNzX21vZGUgPSBXSVJFTEVTU19NT0RFX05fNUc7Ci0JCX0KLQkJZWxzZSBpZigoYlN1cHBvcnRNb2RlICYgV0lSRUxFU1NfTU9ERV9BKSkKLQkJewotCQkJd2lyZWxlc3NfbW9kZSA9IFdJUkVMRVNTX01PREVfQTsKLQkJfQotCQllbHNlIGlmKChiU3VwcG9ydE1vZGUgJiBXSVJFTEVTU19NT0RFX0cpKQotCQl7Ci0JCQl3aXJlbGVzc19tb2RlID0gV0lSRUxFU1NfTU9ERV9HOwotCQl9Ci0JCWVsc2UgaWYoKGJTdXBwb3J0TW9kZSAmIFdJUkVMRVNTX01PREVfQikpCi0JCXsKLQkJCXdpcmVsZXNzX21vZGUgPSBXSVJFTEVTU19NT0RFX0I7Ci0JCX0KLQkJZWxzZXsKLQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiJXMoKSwgTm8gdmFsaWQgd2lyZWxlc3MgbW9kZSBzdXBwb3J0ZWQsIFN1cHBvcnRlZFdpcmVsZXNzTW9kZSgleCkhISFcbiIsIF9fRlVOQ1RJT05fXyxiU3VwcG9ydE1vZGUpOwotCQkJd2lyZWxlc3NfbW9kZSA9IFdJUkVMRVNTX01PREVfQjsKLQkJfQotCX0KLQlwcml2LT5pZWVlODAyMTEtPm1vZGUgPSB3aXJlbGVzc19tb2RlOwotCi0JaWYgKCh3aXJlbGVzc19tb2RlID09IFdJUkVMRVNTX01PREVfTl8yNEcpIHx8ICAod2lyZWxlc3NfbW9kZSA9PSBXSVJFTEVTU19NT0RFX05fNUcpKQotCQlwcml2LT5pZWVlODAyMTEtPnBIVEluZm8tPmJFbmFibGVIVCA9IDE7Ci0JZWxzZQotCQlwcml2LT5pZWVlODAyMTEtPnBIVEluZm8tPmJFbmFibGVIVCA9IDA7Ci0JUlRfVFJBQ0UoQ09NUF9JTklULCAiQ3VycmVudCBXaXJlbGVzcyBNb2RlIGlzICV4XG4iLCB3aXJlbGVzc19tb2RlKTsKLQlydGw4MTkyX3JlZnJlc2hfc3VwcG9ydHJhdGUocHJpdik7Ci19Ci0KLXN0YXRpYyBib29sIEdldEhhbGZObW9kZVN1cHBvcnRCeUFQczgxOXhQY2koc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUpCi17Ci0JcmV0dXJuIGllZWUtPmJIYWxmV2lyZWxlc3NOMjRHTW9kZTsKLX0KLQotc3RhdGljIHNob3J0IHJ0bDgxOTJfaXNfdHhfcXVldWVfZW1wdHkoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUpCi17Ci0JaW50IGk9MDsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGllZWUtPmRldik7Ci0KLQlmb3IgKGk9MDsgaTw9TUdOVF9RVUVVRTsgaSsrKQotCXsKLQkJaWYgKChpPT0gVFhDTURfUVVFVUUpIHx8IChpID09IEhDQ0FfUVVFVUUpICkKLQkJCWNvbnRpbnVlOwotCQlpZiAoc2tiX3F1ZXVlX2xlbigmKCZwcml2LT50eF9yaW5nW2ldKS0+cXVldWUpID4gMCl7Ci0JCQlwcmludGsoIj09PT50eCBxdWV1ZSBpcyBub3QgZW1wdHk6JWQsICVkXG4iLCBpLCBza2JfcXVldWVfbGVuKCYoJnByaXYtPnR4X3JpbmdbaV0pLT5xdWV1ZSkpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ0bDgxOTJfaHdfc2xlZXBfZG93bihzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQlNZ250QWN0U2V0X1JGX1N0YXRlKHByaXYsIGVSZlNsZWVwLCBSRl9DSEFOR0VfQllfUFMpOwotfQotCi1zdGF0aWMgdm9pZCBydGw4MTkyX2h3X3dha2V1cChzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKLXsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGllZWUtPmRldik7Ci0JTWdudEFjdFNldF9SRl9TdGF0ZShwcml2LCBlUmZPbiwgUkZfQ0hBTkdFX0JZX1BTKTsKLX0KLQotc3RhdGljIHZvaWQgcnRsODE5Ml9od193YWtldXBfd3EgKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLHN0cnVjdCBkZWxheWVkX3dvcmssd29yayk7Ci0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YoZHdvcmssc3RydWN0IGllZWU4MDIxMV9kZXZpY2UsaHdfd2FrZXVwX3dxKTsKLQotCXJ0bDgxOTJfaHdfd2FrZXVwKGllZWUpOwotfQotCi0jZGVmaW5lIE1JTl9TTEVFUF9USU1FIDUwCi0jZGVmaW5lIE1BWF9TTEVFUF9USU1FIDEwMDAwCi1zdGF0aWMgdm9pZCBydGw4MTkyX2h3X3RvX3NsZWVwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCB1MzIgdGgsIHUzMiB0bCkKLXsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGllZWUtPmRldik7Ci0JdTMyIHRtcDsKLQl1MzIgcmIgPSBqaWZmaWVzOwotCi0JLy8gV3JpdGluZyBIVyByZWdpc3RlciB3aXRoIDAgZXF1YWxzIHRvIGRpc2FibGUKLQkvLyB0aGUgdGltZXIsIHRoYXQgaXMgbm90IHJlYWxseSB3aGF0IHdlIHdhbnQKLQkvLwotCXRsIC09IE1TRUNTKDgrMTYrNyk7Ci0KLQkvLyBJZiB0aGUgaW50ZXJ2YWwgaW4gd2l0Y2ggd2UgYXJlIHJlcXVlc3RlZCB0byBzbGVlcCBpcyB0b28KLQkvLyBzaG9ydCB0aGVuIGdpdmUgdXAgYW5kIHJlbWFpbiBhd2FrZQotCS8vIHdoZW4gd2Ugc2xlZXAgYWZ0ZXIgc2VuZCBudWxsIGZyYW1lLCB0aGUgdGltZXIgd2lsbCBiZSB0b28gc2hvcnQgdG8gc2xlZXAuCi0JLy8KLQlpZigoKHRsPj1yYikmJiAodGwtcmIpIDw9IE1TRUNTKE1JTl9TTEVFUF9USU1FKSkKLQkJCXx8KChyYj50bCkmJiAocmItdGwpIDwgTVNFQ1MoTUlOX1NMRUVQX1RJTUUpKSkgewotCQlwcmludGsoInRvbyBzaG9ydCB0byBzbGVlcDo6JXgsICV4LCAlbHhcbiIsdGwsIHJiLCAgTVNFQ1MoTUlOX1NMRUVQX1RJTUUpKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmKCgodGwgPiByYikgJiYgKCh0bC1yYikgPiBNU0VDUyhNQVhfU0xFRVBfVElNRSkpKXx8Ci0JCQkoKHRsIDwgcmIpICYmICh0bD5NU0VDUyg2OSkpICYmICgocmItdGwpID4gTVNFQ1MoTUFYX1NMRUVQX1RJTUUpKSl8fAotCQkJKCh0bDxyYikmJih0bDxNU0VDUyg2OSkpJiYoKHRsKzB4ZmZmZmZmZmYtcmIpPk1TRUNTKE1BWF9TTEVFUF9USU1FKSkpKSB7Ci0JCXByaW50aygiPT09PT09PT0+dG9vIGxvbmcgdG8gc2xlZXA6JXgsICV4LCAlbHhcbiIsIHRsLCByYiwgIE1TRUNTKE1BWF9TTEVFUF9USU1FKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQl0bXAgPSAodGw+cmIpPyh0bC1yYik6KHJiLXRsKTsKLQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+aWVlZTgwMjExLT53cSwKLQkJCSAgICZwcml2LT5pZWVlODAyMTEtPmh3X3dha2V1cF93cSx0bXApOwotCi0gICAgICAgIHJ0bDgxOTJfaHdfc2xlZXBfZG93bihwcml2KTsKLX0KLQotc3RhdGljIHZvaWQgcnRsODE5Ml9pbml0X3ByaXZfdmFyaWFibGUoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0JdTggaTsKLQlQUlRfUE9XRVJfU0FWRV9DT05UUk9MIHBQU0MgPSAmcHJpdi0+UG93ZXJTYXZlQ29udHJvbDsKLQotCS8vIERlZmF1bHQgSGFsdCB0aGUgTklDIGlmIFJGIGlzIE9GRi4KLQlwUFNDLT5SZWdSZlBzTGV2ZWwgfD0gUlRfUkZfT0ZGX0xFVkxfSEFMVF9OSUM7Ci0JcFBTQy0+UmVnUmZQc0xldmVsIHw9IFJUX1JGX09GRl9MRVZMX0NMS19SRVE7Ci0JcFBTQy0+UmVnUmZQc0xldmVsIHw9IFJUX1JGX09GRl9MRVZMX0FTUE07Ci0JcFBTQy0+UmVnUmZQc0xldmVsIHw9IFJUX1JGX0xQU19MRVZFTF9BU1BNOwotCXBQU0MtPmJMZWlzdXJlUHMgPSB0cnVlOwotCXByaXYtPmllZWU4MDIxMS0+UmVnTWF4TFBTQXdha2VJbnR2bCA9IDU7Ci0JcHJpdi0+Ykh3UmFkaW9PZmYgPSBmYWxzZTsKLQotCXByaXYtPmJlaW5nX2luaXRfYWRhcHRlciA9IGZhbHNlOwotCXByaXYtPnR4cmluZ2NvdW50ID0gNjQ7Ly8zMjsKLQlwcml2LT5yeGJ1ZmZlcnNpemUgPSA5MTAwOy8vMjA0ODsvLzEwMjQ7Ci0JcHJpdi0+cnhyaW5nY291bnQgPSBNQVhfUlhfQ09VTlQ7Ly82NDsKLQlwcml2LT5jaGFuID0gMTsgLy9zZXQgdG8gY2hhbm5lbCAxCi0JcHJpdi0+UmVnV2lyZWxlc3NNb2RlID0gV0lSRUxFU1NfTU9ERV9BVVRPOwotCXByaXYtPlJlZ0NoYW5uZWxQbGFuID0gMHhmOwotCXByaXYtPmllZWU4MDIxMS0+bW9kZSA9IFdJUkVMRVNTX01PREVfQVVUTzsgLy9TRVQgQVVUTwotCXByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9IElXX01PREVfSU5GUkE7Ci0JcHJpdi0+aWVlZTgwMjExLT5pZWVlX3VwPTA7Ci0JcHJpdi0+cmV0cnlfcnRzID0gREVGQVVMVF9SRVRSWV9SVFM7Ci0JcHJpdi0+cmV0cnlfZGF0YSA9IERFRkFVTFRfUkVUUllfREFUQTsKLQlwcml2LT5pZWVlODAyMTEtPnJ0cyA9IERFRkFVTFRfUlRTX1RIUkVTSE9MRDsKLQlwcml2LT5pZWVlODAyMTEtPnJhdGUgPSAxMTA7IC8vMTEgbWJwcwotCXByaXYtPmllZWU4MDIxMS0+c2hvcnRfc2xvdCA9IDE7Ci0JcHJpdi0+cHJvbWlzYyA9IChwcml2LT5pZWVlODAyMTEtPmRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgPyAxOjA7Ci0JcHJpdi0+YmNja19pbl9jaDE0ID0gZmFsc2U7Ci0JcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA9IDA7Ci0JcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4ID0gMDsKLQlwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXggPSAwOwotCXByaXYtPkNja1B3RW5sID0gNjsKLQkvL2FkZGVkIGJ5IGFteSBmb3Igc2lsZW50IHJlc2V0Ci0JcHJpdi0+UmVzZXRQcm9ncmVzcyA9IFJFU0VUX1RZUEVfTk9SRVNFVDsKLQlwcml2LT5iRm9yY2VkU2lsZW50UmVzZXQgPSAwOwotCXByaXYtPmJEaXNhYmxlTm9ybWFsUmVzZXRDaGVjayA9IGZhbHNlOwotCXByaXYtPmZvcmNlX3Jlc2V0ID0gZmFsc2U7Ci0JLy9hZGRlZCBieSBhbXkgZm9yIHBvd2VyIHNhdmUKLQlwcml2LT5SZk9mZlJlYXNvbiA9IDA7Ci0JcHJpdi0+Ykh3UmZPZmZBY3Rpb24gPSAwOwotCXByaXYtPlBvd2VyU2F2ZUNvbnRyb2wuYkluYWN0aXZlUHMgPSB0cnVlOwotCXByaXYtPlBvd2VyU2F2ZUNvbnRyb2wuYklQU01vZGVCYWNrdXAgPSBmYWxzZTsKLQotCXByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCA9IERFRkFVTFRfQkVBQ09OSU5URVJWQUw7Ci0JcHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID0gSVdfTU9ERV9JTkZSQTsKLQlwcml2LT5pZWVlODAyMTEtPnNvZnRtYWNfZmVhdHVyZXMgID0gSUVFRV9TT0ZUTUFDX1NDQU4gfAotCQlJRUVFX1NPRlRNQUNfQVNTT0NJQVRFIHwgSUVFRV9TT0ZUTUFDX1BST0JFUlEgfAotCQlJRUVFX1NPRlRNQUNfUFJPQkVSUyB8IElFRUVfU09GVE1BQ19UWF9RVUVVRTsvKiB8Ci0JCUlFRUVfU09GVE1BQ19CRUFDT05TOyovLy9hZGRlZCBieSBhbXkgMDgwNjA0IC8vfCAgLy9JRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFOwotCi0JcHJpdi0+aWVlZTgwMjExLT5hY3RpdmVfc2NhbiA9IDE7Ci0JcHJpdi0+aWVlZTgwMjExLT5tb2R1bGF0aW9uID0gSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OIHwgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTjsKLQlwcml2LT5pZWVlODAyMTEtPmhvc3RfZW5jcnlwdCA9IDE7Ci0JcHJpdi0+aWVlZTgwMjExLT5ob3N0X2RlY3J5cHQgPSAxOwotCXByaXYtPmllZWU4MDIxMS0+c3RhcnRfc2VuZF9iZWFjb25zID0gcnRsODE5Ml9zdGFydF9iZWFjb247Ci0JcHJpdi0+aWVlZTgwMjExLT5zdG9wX3NlbmRfYmVhY29ucyA9IHJ0bDgxOTJfc3RvcF9iZWFjb247Ci0JcHJpdi0+aWVlZTgwMjExLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdCA9IHJ0bDgxOTJfaGFyZF9zdGFydF94bWl0OwotCXByaXYtPmllZWU4MDIxMS0+c2V0X2NoYW4gPSBydGw4MTkyX3NldF9jaGFuOwotCXByaXYtPmllZWU4MDIxMS0+bGlua19jaGFuZ2UgPSBydGw4MTkyX2xpbmtfY2hhbmdlOwotCXByaXYtPmllZWU4MDIxMS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCA9IHJ0bDgxOTJfaGFyZF9kYXRhX3htaXQ7Ci0JcHJpdi0+aWVlZTgwMjExLT5kYXRhX2hhcmRfc3RvcCA9IHJ0bDgxOTJfZGF0YV9oYXJkX3N0b3A7Ci0JcHJpdi0+aWVlZTgwMjExLT5kYXRhX2hhcmRfcmVzdW1lID0gcnRsODE5Ml9kYXRhX2hhcmRfcmVzdW1lOwotCXByaXYtPmllZWU4MDIxMS0+aW5pdF93bW1wYXJhbV9mbGFnID0gMDsKLQlwcml2LT5pZWVlODAyMTEtPmZ0cyA9IERFRkFVTFRfRlJBR19USFJFU0hPTEQ7Ci0JcHJpdi0+aWVlZTgwMjExLT5jaGVja19uaWNfZW5vdWdoX2Rlc2MgPSBjaGVja19uaWNfZW5vdWdoX2Rlc2M7Ci0JcHJpdi0+aWVlZTgwMjExLT50eF9oZWFkcm9vbSA9IHNpemVvZihUWF9GV0lORk9fODE5MFBDSSk7Ci0JcHJpdi0+aWVlZTgwMjExLT5xb3Nfc3VwcG9ydCA9IDE7Ci0JcHJpdi0+aWVlZTgwMjExLT5TZXRCV01vZGVIYW5kbGVyID0gcnRsODE5Ml9TZXRCV01vZGU7Ci0JcHJpdi0+aWVlZTgwMjExLT5oYW5kbGVfYXNzb2NfcmVzcG9uc2UgPSBydGw4MTkyX2hhbmRsZV9hc3NvY19yZXNwb25zZTsKLQlwcml2LT5pZWVlODAyMTEtPmhhbmRsZV9iZWFjb24gPSBydGw4MTkyX2hhbmRsZV9iZWFjb247Ci0KLQlwcml2LT5pZWVlODAyMTEtPnN0YV93YWtlX3VwID0gcnRsODE5Ml9od193YWtldXA7Ci0JcHJpdi0+aWVlZTgwMjExLT5lbnRlcl9zbGVlcF9zdGF0ZSA9IHJ0bDgxOTJfaHdfdG9fc2xlZXA7Ci0JcHJpdi0+aWVlZTgwMjExLT5wc19pc19xdWV1ZV9lbXB0eSA9IHJ0bDgxOTJfaXNfdHhfcXVldWVfZW1wdHk7Ci0JcHJpdi0+aWVlZTgwMjExLT5HZXRObW9kZVN1cHBvcnRCeVNlY0NmZyA9IEdldE5tb2RlU3VwcG9ydEJ5U2VjQ2ZnODE5MFBjaTsKLQlwcml2LT5pZWVlODAyMTEtPlNldFdpcmVsZXNzTW9kZSA9IHJ0bDgxOTJfU2V0V2lyZWxlc3NNb2RlOwotCXByaXYtPmllZWU4MDIxMS0+R2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzSGFuZGxlciA9IEdldEhhbGZObW9kZVN1cHBvcnRCeUFQczgxOXhQY2k7Ci0KLQlwcml2LT5pZWVlODAyMTEtPkluaXRpYWxHYWluSGFuZGxlciA9IEluaXRpYWxHYWluODE5eFBjaTsKLQotI2lmZGVmIEVOQUJMRV9JUFMKLQlwcml2LT5pZWVlODAyMTEtPmllZWU4MDIxMV9pcHNfbGVhdmVfd3EgPSBpZWVlODAyMTFfaXBzX2xlYXZlX3dxOwotCXByaXYtPmllZWU4MDIxMS0+aWVlZTgwMjExX2lwc19sZWF2ZSA9IGllZWU4MDIxMV9pcHNfbGVhdmU7Ci0jZW5kaWYKLSNpZmRlZiBFTkFCTEVfTFBTCi0gICAgICAgIHByaXYtPmllZWU4MDIxMS0+TGVpc3VyZVBTTGVhdmUgICAgICAgICAgICA9IExlaXN1cmVQU0xlYXZlOwotI2VuZGlmCi0KLQlwcml2LT5pZWVlODAyMTEtPlNldEh3UmVnSGFuZGxlciA9IHJ0bDgxOTJlX1NldEh3UmVnOwotCXByaXYtPmllZWU4MDIxMS0+cnRsbGliX2FwX3NlY190eXBlID0gcnRsODE5MmVfYXBfc2VjX3R5cGU7Ci0KLQlwcml2LT5TaG9ydFJldHJ5TGltaXQgPSAweDMwOwotCXByaXYtPkxvbmdSZXRyeUxpbWl0ID0gMHgzMDsKLQotCXByaXYtPlJlY2VpdmVDb25maWcgPSBSQ1JfQUREMwl8Ci0JCVJDUl9BTUYgfCBSQ1JfQURGIHwJCS8vYWNjZXB0IG1hbmFnZW1lbnQvZGF0YQotCQlSQ1JfQUlDViB8CQkJLy9hY2NlcHQgY29udHJvbCBmcmFtZSBmb3IgU1cgQVAgbmVlZHMgUFMtcG9sbCwgMjAwNS4wNy4wNywgYnkgcmNuamtvLgotCQlSQ1JfQUIgfCBSQ1JfQU0gfCBSQ1JfQVBNIHwJLy9hY2NlcHQgQkMvTUMvVUMKLQkJUkNSX0FBUCB8ICgodTMyKTc8PFJDUl9NWERNQV9PRkZTRVQpIHwKLQkJKCh1MzIpNyA8PCBSQ1JfRklGT19PRkZTRVQpIHwgUkNSX09OTFlFUkxQS1Q7Ci0KLQlwcml2LT5wRmlybXdhcmUgPSB2emFsbG9jKHNpemVvZihydF9maXJtd2FyZSkpOwotCi0JLyogcnggcmVsYXRlZCBxdWV1ZSAqLwotCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnByaXYtPnNrYl9xdWV1ZSk7Ci0KLQkvKiBUeCByZWxhdGVkIHF1ZXVlICovCi0JZm9yKGkgPSAwOyBpIDwgTUFYX1FVRVVFX1NJWkU7IGkrKykgewotCQlza2JfcXVldWVfaGVhZF9pbml0KCZwcml2LT5pZWVlODAyMTEtPnNrYl93YWl0USBbaV0pOwotCX0KLQlmb3IoaSA9IDA7IGkgPCBNQVhfUVVFVUVfU0laRTsgaSsrKSB7Ci0JCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnByaXYtPmllZWU4MDIxMS0+c2tiX2FnZ1EgW2ldKTsKLQl9Ci0JcHJpdi0+cmZfc2V0X2NoYW4gPSBydGw4MTkyX3BoeV9Td0Nobmw7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ0bDgxOTJfaW5pdF9wcml2X2xvY2soc3RydWN0IHI4MTkyX3ByaXYqIHByaXYpCi17Ci0Jc3Bpbl9sb2NrX2luaXQoJnByaXYtPmlycV90aF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmcHJpdi0+cmZfcHNfbG9jayk7Ci0Jc2VtYV9pbml0KCZwcml2LT53eF9zZW0sMSk7Ci0Jc2VtYV9pbml0KCZwcml2LT5yZl9zZW0sMSk7Ci0JbXV0ZXhfaW5pdCgmcHJpdi0+bXV0ZXgpOwotfQotCi0vKiBpbml0IHRhc2tsZXQgYW5kIHdhaXRfcXVldWUgaGVyZSAqLwotI2RlZmluZSBEUlZfTkFNRSAid2xhbjAiCi1zdGF0aWMgdm9pZCBydGw4MTkyX2luaXRfcHJpdl90YXNrKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCXByaXYtPnByaXZfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKERSVl9OQU1FKTsKLQotI2lmZGVmIEVOQUJMRV9JUFMKLQlJTklUX1dPUksoJnByaXYtPmllZWU4MDIxMS0+aXBzX2xlYXZlX3dxLCBJUFNMZWF2ZV93cSk7Ci0jZW5kaWYKLQotCUlOSVRfV09SSygmcHJpdi0+cmVzZXRfd3EsICBydGw4MTkyX3Jlc3RhcnQpOwotCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT53YXRjaF9kb2dfd3EsIHJ0bDgxOXhfd2F0Y2hkb2dfd3FjYWxsYmFjayk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPnR4cG93ZXJfdHJhY2tpbmdfd3EsICBkbV90eHBvd2VyX3RyYWNraW5nY2FsbGJhY2spOwotCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5yZnBhdGhfY2hlY2tfd3EsICBkbV9yZl9wYXRoY2hlY2tfd29ya2l0ZW1jYWxsYmFjayk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPnVwZGF0ZV9iZWFjb25fd3EsIHJ0bDgxOTJfdXBkYXRlX2JlYWNvbik7Ci0JSU5JVF9XT1JLKCZwcml2LT5xb3NfYWN0aXZhdGUsIHJ0bDgxOTJfcW9zX2FjdGl2YXRlKTsKLQlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+aWVlZTgwMjExLT5od193YWtldXBfd3EsIHJ0bDgxOTJfaHdfd2FrZXVwX3dxKTsKLQotCXRhc2tsZXRfaW5pdCgmcHJpdi0+aXJxX3J4X3Rhc2tsZXQsIHJ0bDgxOTJfaXJxX3J4X3Rhc2tsZXQsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpIHByaXYpOwotCXRhc2tsZXRfaW5pdCgmcHJpdi0+aXJxX3R4X3Rhc2tsZXQsIHJ0bDgxOTJfaXJxX3R4X3Rhc2tsZXQsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpIHByaXYpOwotICAgICAgICB0YXNrbGV0X2luaXQoJnByaXYtPmlycV9wcmVwYXJlX2JlYWNvbl90YXNrbGV0LCBydGw4MTkyX3ByZXBhcmVfYmVhY29uLAotCQkgICAgICh1bnNpZ25lZCBsb25nKSBwcml2KTsKLX0KLQotc3RhdGljIHZvaWQgcnRsODE5Ml9nZXRfZWVwcm9tX3NpemUoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0JdTE2IGN1ckNSID0gMDsKLQlSVF9UUkFDRShDT01QX0lOSVQsICI9PT09PT09PT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOwotCWN1ckNSID0gcmVhZF9uaWNfZHdvcmQocHJpdiwgRVBST01fQ01EKTsKLQlSVF9UUkFDRShDT01QX0lOSVQsICJyZWFkIGZyb20gUmVnIENtZDkzNDZDUigleCk6JXhcbiIsIEVQUk9NX0NNRCwgY3VyQ1IpOwotCS8vd2hldGhlciBuZWVkIEkgY29uc2lkZXIgQklUNT8KLQlwcml2LT5lcHJvbXR5cGUgPSAoY3VyQ1IgJiBFUFJPTV9DTURfOTM1NlNFTCkgPyBFUFJPTV85M2M1NiA6IEVQUk9NXzkzYzQ2OwotCVJUX1RSQUNFKENPTVBfSU5JVCwgIjw9PT09PT09PT09PSVzKCksIGVwcm9tdHlwZTolZFxuIiwgX19GVU5DVElPTl9fLCBwcml2LT5lcHJvbXR5cGUpOwotfQotCi0vKgotICogQWRhcHRlci0+RUVQUk9NQWRkcmVzc1NpemUgc2hvdWxkIGJlIHNldCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBjYWxsLgotICogIEVFUFJPTSBhZGRyZXNzIHNpemUgY2FuIGJlIGdvdCB0aHJvdWdoIEdldEVFUFJPTVNpemU4MTg1KCkKLSAqLwotc3RhdGljIHZvaWQgcnRsODE5Ml9yZWFkX2VlcHJvbV9pbmZvKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5pZWVlODAyMTEtPmRldjsKLQl1OAkJCXRlbXB2YWw7Ci0JdTgJCQlJQ1ZlcjgxOTIsIElDVmVyODI1NjsKLQl1MTYJCQlpLHVzVmFsdWUsIElDX1ZlcnNpb247Ci0JdTE2CQkJRUVQUk9NSWQ7Ci0JdTggYk1hY19UbXBfQWRkcls2XSA9IHsweDAwLCAweGUwLCAweDRjLCAweDAwLCAweDAwLCAweDAxfTsKLQlSVF9UUkFDRShDT01QX0lOSVQsICI9PT09PiBydGw4MTkyX3JlYWRfZWVwcm9tX2luZm9cbiIpOwotCi0KLQkvLyBUT0RPOiBJIGRvbid0IGtub3cgaWYgd2UgbmVlZCB0byBhcHBseSBFRiBmdW5jdGlvbiB0byBFRVBST00gcmVhZCBmdW5jdGlvbgotCi0JLy8yIFJlYWQgRUVQUk9NIElEIHRvIG1ha2Ugc3VyZSBhdXRvbG9hZCBpcyBzdWNjZXNzCi0JRUVQUk9NSWQgPSBlcHJvbV9yZWFkKHByaXYsIDApOwotCWlmKCBFRVBST01JZCAhPSBSVEw4MTkwX0VFUFJPTV9JRCApCi0JewotCQlSVF9UUkFDRShDT01QX0VSUiwgIkVFUFJPTSBJRCBpcyBpbnZhbGlkOiV4LCAleFxuIiwgRUVQUk9NSWQsIFJUTDgxOTBfRUVQUk9NX0lEKTsKLQkJcHJpdi0+QXV0b2xvYWRGYWlsRmxhZz10cnVlOwotCX0KLQllbHNlCi0JewotCQlwcml2LT5BdXRvbG9hZEZhaWxGbGFnPWZhbHNlOwotCX0KLQotCS8vCi0JLy8gQXNzaWduIENoaXAgVmVyc2lvbiBJRAotCS8vCi0JLy8gUmVhZCBJQyBWZXJzaW9uICYmIENoYW5uZWwgUGxhbgotCWlmKCFwcml2LT5BdXRvbG9hZEZhaWxGbGFnKQotCXsKLQkJLy8gVklELCBQSUQKLQkJcHJpdi0+ZWVwcm9tX3ZpZCA9IGVwcm9tX3JlYWQocHJpdiwgKEVFUFJPTV9WSUQgPj4gMSkpOwotCQlwcml2LT5lZXByb21fZGlkID0gZXByb21fcmVhZChwcml2LCAoRUVQUk9NX0RJRCA+PiAxKSk7Ci0KLQkJdXNWYWx1ZSA9IGVwcm9tX3JlYWQocHJpdiwgKHUxNikoRUVQUk9NX0N1c3RvbWVyX0lEPj4xKSkgPj4gOCA7Ci0JCXByaXYtPmVlcHJvbV9DdXN0b21lcklEID0gKHU4KSggdXNWYWx1ZSAmIDB4ZmYpOwotCQl1c1ZhbHVlID0gZXByb21fcmVhZChwcml2LCAoRUVQUk9NX0lDVmVyc2lvbl9DaGFubmVsUGxhbj4+MSkpOwotCQlwcml2LT5lZXByb21fQ2hhbm5lbFBsYW4gPSB1c1ZhbHVlJjB4ZmY7Ci0JCUlDX1ZlcnNpb24gPSAoKHVzVmFsdWUmMHhmZjAwKT4+OCk7Ci0KLQkJSUNWZXI4MTkyID0gKElDX1ZlcnNpb24mMHhmKTsJCS8vYml0MH4zOyAxOkEgY3V0LCAyOkIgY3V0LCAzOkMgY3V0Li4uCi0JCUlDVmVyODI1NiA9ICgoSUNfVmVyc2lvbiYweGYwKT4+NCk7Ly9iaXQ0fjYsIGJpdDcgcmVzZXJ2ZWQgZm9yIG90aGVyIFJGIGNoaXA7IDE6QSBjdXQsIDI6QiBjdXQsIDM6QyBjdXQuLi4KLQkJUlRfVFJBQ0UoQ09NUF9JTklULCAiSUNWZXI4MTkyID0gMHgleFxuIiwgSUNWZXI4MTkyKTsKLQkJUlRfVFJBQ0UoQ09NUF9JTklULCAiSUNWZXI4MjU2ID0gMHgleFxuIiwgSUNWZXI4MjU2KTsKLQkJaWYoSUNWZXI4MTkyID09IDB4MikJLy9CLWN1dAotCQl7Ci0JCQlpZihJQ1ZlcjgyNTYgPT0gMHg1KSAvL0UtY3V0Ci0JCQkJcHJpdi0+Y2FyZF84MTkyX3ZlcnNpb249IFZFUlNJT05fODE5MF9CRTsKLQkJfQotCi0JCXN3aXRjaChwcml2LT5jYXJkXzgxOTJfdmVyc2lvbikKLQkJewotCQkJY2FzZSBWRVJTSU9OXzgxOTBfQkQ6Ci0JCQljYXNlIFZFUlNJT05fODE5MF9CRToKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24gPSBWRVJTSU9OXzgxOTBfQkQ7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJUlRfVFJBQ0UoQ09NUF9JTklULCAiXG5JQyBWZXJzaW9uID0gMHgleFxuIiwgcHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24pOwotCX0KLQllbHNlCi0JewotCQlwcml2LT5jYXJkXzgxOTJfdmVyc2lvbiA9IFZFUlNJT05fODE5MF9CRDsKLQkJcHJpdi0+ZWVwcm9tX3ZpZCA9IDA7Ci0JCXByaXYtPmVlcHJvbV9kaWQgPSAwOwotCQlwcml2LT5lZXByb21fQ3VzdG9tZXJJRCA9IDA7Ci0JCXByaXYtPmVlcHJvbV9DaGFubmVsUGxhbiA9IDA7Ci0JCVJUX1RSQUNFKENPTVBfSU5JVCwgIklDIFZlcnNpb24gPSAweCV4XG4iLCAweGZmKTsKLQl9Ci0KLQlSVF9UUkFDRShDT01QX0lOSVQsICJFRVBST00gVklEID0gMHglNHhcbiIsIHByaXYtPmVlcHJvbV92aWQpOwotCVJUX1RSQUNFKENPTVBfSU5JVCwgIkVFUFJPTSBESUQgPSAweCU0eFxuIiwgcHJpdi0+ZWVwcm9tX2RpZCk7Ci0JUlRfVFJBQ0UoQ09NUF9JTklULCJFRVBST00gQ3VzdG9tZXIgSUQ6IDB4JTJ4XG4iLCBwcml2LT5lZXByb21fQ3VzdG9tZXJJRCk7Ci0KLQkvLzIgUmVhZCBQZXJtYW5lbnQgTUFDIGFkZHJlc3MKLQlpZighcHJpdi0+QXV0b2xvYWRGYWlsRmxhZykKLQl7Ci0JCWZvcihpID0gMDsgaSA8IDY7IGkgKz0gMikKLQkJewotCQkJdXNWYWx1ZSA9IGVwcm9tX3JlYWQocHJpdiwgKHUxNikgKChFRVBST01fTk9ERV9BRERSRVNTX0JZVEVfMCtpKT4+MSkpOwotCQkJKih1MTYqKSgmZGV2LT5kZXZfYWRkcltpXSkgPSB1c1ZhbHVlOwotCQl9Ci0JfSBlbHNlIHsKLQkJLy8gd2hlbiBhdXRvIGxvYWQgZmFpbGVkLCAgdGhlIGxhc3QgYWRkcmVzcyBieXRlIHNldCB0byBiZSBhIHJhbmRvbSBvbmUuCi0JCS8vIGFkZGVkIGJ5IGRhdmlkIHdvby4yMDA3LzExLzcKLQkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGJNYWNfVG1wX0FkZHIsIDYpOwotCX0KLQotCVJUX1RSQUNFKENPTVBfSU5JVCwgIlBlcm1hbmVudCBBZGRyZXNzID0gJXBNXG4iLCBkZXYtPmRldl9hZGRyKTsKLQotCQkvLzIgVFggUG93ZXIgQ2hlY2sgRUVQUk9NIEZhaWwgb3Igbm90Ci0JaWYocHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24gPiBWRVJTSU9OXzgxOTBfQkQpIHsKLQkJcHJpdi0+YlRYUG93ZXJEYXRhUmVhZEZyb21FRVBPUk0gPSB0cnVlOwotCX0gZWxzZSB7Ci0JCXByaXYtPmJUWFBvd2VyRGF0YVJlYWRGcm9tRUVQT1JNID0gZmFsc2U7Ci0JfQotCi0JLy8gMjAwNy8xMS8xNSBNSCA4MTkwUENJIERlZmF1bHQ9MlQ0UiwgODE5MlBDSUUgZGVmYXVsdD0xVDJSCi0JcHJpdi0+cmZfdHlwZSA9IFJUTDgxOVhfREVGQVVMVF9SRl9UWVBFOwotCi0JaWYocHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24gPiBWRVJTSU9OXzgxOTBfQkQpCi0JewotCQkvLyBSZWFkIFJGLWluZGljYXRpb24gYW5kIFR4IFBvd2VyIGdhaW4gaW5kZXggZGlmZiBvZiBsZWdhY3kgdG8gSFQgT0ZETSByYXRlLgotCQlpZighcHJpdi0+QXV0b2xvYWRGYWlsRmxhZykKLQkJewotCQkJdGVtcHZhbCA9IChlcHJvbV9yZWFkKHByaXYsIChFRVBST01fUkZJbmRfUG93ZXJEaWZmPj4xKSkpICYgMHhmZjsKLQkJCXByaXYtPkVFUFJPTUxlZ2FjeUhUVHhQb3dlckRpZmYgPSB0ZW1wdmFsICYgMHhmOwkvLyBiaXRbMzowXQotCi0JCQlpZiAodGVtcHZhbCYweDgwKQkvL1JGLWluZGljYXRpb24sIGJpdFs3XQotCQkJCXByaXYtPnJmX3R5cGUgPSBSRl8xVDJSOwotCQkJZWxzZQotCQkJCXByaXYtPnJmX3R5cGUgPSBSRl8yVDRSOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcHJpdi0+RUVQUk9NTGVnYWN5SFRUeFBvd2VyRGlmZiA9IEVFUFJPTV9EZWZhdWx0X0xlZ2FjeUhUVHhQb3dlckRpZmY7Ci0JCX0KLQkJUlRfVFJBQ0UoQ09NUF9JTklULCAiRUVQUk9NTGVnYWN5SFRUeFBvd2VyRGlmZiA9ICVkXG4iLAotCQkJcHJpdi0+RUVQUk9NTGVnYWN5SFRUeFBvd2VyRGlmZik7Ci0KLQkJLy8gUmVhZCBUaGVybWFsTWV0ZXIgZnJvbSBFRVBST00KLQkJaWYoIXByaXYtPkF1dG9sb2FkRmFpbEZsYWcpCi0JCXsKLQkJCXByaXYtPkVFUFJPTVRoZXJtYWxNZXRlciA9ICh1OCkoKChlcHJvbV9yZWFkKHByaXYsIChFRVBST01fVGhlcm1hbE1ldGVyPj4xKSkpICYgMHhmZjAwKT4+OCk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwcml2LT5FRVBST01UaGVybWFsTWV0ZXIgPSBFRVBST01fRGVmYXVsdF9UaGVybWFsTWV0ZXI7Ci0JCX0KLQkJUlRfVFJBQ0UoQ09NUF9JTklULCAiVGhlcm1hbE1ldGVyID0gJWRcbiIsIHByaXYtPkVFUFJPTVRoZXJtYWxNZXRlcik7Ci0JCS8vdml2aSwgZm9yIHR4IHBvd2VyIHRyYWNrCi0JCXByaXYtPlRTU0lfMTNkQm0gPSBwcml2LT5FRVBST01UaGVybWFsTWV0ZXIgKjEwMDsKLQotCQlpZihwcml2LT5lcHJvbXR5cGUgPT0gRVBST01fOTNjNDYpCi0JCXsKLQkJLy8gUmVhZCBhbnRlbm5hIHR4IHBvd2VyIG9mZnNldCBvZiBCL0MvRCB0byBBIGFuZCBDcnlzdGFsQ2FwIGZyb20gRUVQUk9NCi0JCWlmKCFwcml2LT5BdXRvbG9hZEZhaWxGbGFnKQotCQl7Ci0JCQkJdXNWYWx1ZSA9IGVwcm9tX3JlYWQocHJpdiwgKEVFUFJPTV9UeFB3RGlmZl9DcnlzdGFsQ2FwPj4xKSk7Ci0JCQkJcHJpdi0+RUVQUk9NQW50UHdEaWZmID0gKHVzVmFsdWUmMHgwZmZmKTsKLQkJCQlwcml2LT5FRVBST01DcnlzdGFsQ2FwID0gKHU4KSgodXNWYWx1ZSYweGYwMDApPj4xMik7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkJcHJpdi0+RUVQUk9NQW50UHdEaWZmID0gRUVQUk9NX0RlZmF1bHRfQW50VHhQb3dlckRpZmY7Ci0JCQkJcHJpdi0+RUVQUk9NQ3J5c3RhbENhcCA9IEVFUFJPTV9EZWZhdWx0X1R4UHdEaWZmX0NyeXN0YWxDYXA7Ci0JCX0KLQkJCVJUX1RSQUNFKENPTVBfSU5JVCwgIkVFUFJPTUFudFB3RGlmZiA9ICVkXG4iLCBwcml2LT5FRVBST01BbnRQd0RpZmYpOwotCQkJUlRfVFJBQ0UoQ09NUF9JTklULCAiRUVQUk9NQ3J5c3RhbENhcCA9ICVkXG4iLCBwcml2LT5FRVBST01DcnlzdGFsQ2FwKTsKLQotCQkvLwotCQkvLyBHZXQgcGVyLWNoYW5uZWwgVHggUG93ZXIgTGV2ZWwKLQkJLy8KLQkJZm9yKGk9MDsgaTwxNDsgaSs9MikKLQkJewotCQkJaWYoIXByaXYtPkF1dG9sb2FkRmFpbEZsYWcpCi0JCQl7Ci0JCQkJdXNWYWx1ZSA9IGVwcm9tX3JlYWQocHJpdiwgKHUxNikgKChFRVBST01fVHhQd0luZGV4X0NDSytpKT4+MSkgKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQl1c1ZhbHVlID0gRUVQUk9NX0RlZmF1bHRfVHhQb3dlcjsKLQkJCX0KLQkJCSooKHUxNiopKCZwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxDQ0tbaV0pKSA9IHVzVmFsdWU7Ci0JCQlSVF9UUkFDRShDT01QX0lOSVQsIkNDSyBUeCBQb3dlciBMZXZlbCwgSW5kZXggJWQgPSAweCUwMnhcbiIsIGksIHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbENDS1tpXSk7Ci0JCQlSVF9UUkFDRShDT01QX0lOSVQsICJDQ0sgVHggUG93ZXIgTGV2ZWwsIEluZGV4ICVkID0gMHglMDJ4XG4iLCBpKzEsIHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbENDS1tpKzFdKTsKLQkJfQotCQlmb3IoaT0wOyBpPDE0OyBpKz0yKQotCQl7Ci0JCQlpZighcHJpdi0+QXV0b2xvYWRGYWlsRmxhZykKLQkJCXsKLQkJCQl1c1ZhbHVlID0gZXByb21fcmVhZChwcml2LCAodTE2KSAoKEVFUFJPTV9UeFB3SW5kZXhfT0ZETV8yNEcraSk+PjEpICk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJdXNWYWx1ZSA9IEVFUFJPTV9EZWZhdWx0X1R4UG93ZXI7Ci0JCQl9Ci0JCQkqKCh1MTYqKSgmcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsT0ZETTI0R1tpXSkpID0gdXNWYWx1ZTsKLQkJCVJUX1RSQUNFKENPTVBfSU5JVCwgIk9GRE0gMi40RyBUeCBQb3dlciBMZXZlbCwgSW5kZXggJWQgPSAweCUwMnhcbiIsIGksIHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbE9GRE0yNEdbaV0pOwotCQkJUlRfVFJBQ0UoQ09NUF9JTklULCAiT0ZETSAyLjRHIFR4IFBvd2VyIExldmVsLCBJbmRleCAlZCA9IDB4JTAyeFxuIiwgaSsxLCBwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxPRkRNMjRHW2krMV0pOwotCQl9Ci0JCX0KLQotCQkvLwotCQkvLyBVcGRhdGUgSEFMIHZhcmlhYmxlcy4KLQkJLy8KLQkJaWYocHJpdi0+ZXByb210eXBlID09IEVQUk9NXzkzYzQ2KQotCQl7Ci0JCQlmb3IoaT0wOyBpPDE0OyBpKyspCi0JCQl7Ci0JCQkJcHJpdi0+VHhQb3dlckxldmVsQ0NLW2ldID0gcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsQ0NLW2ldOwotCQkJCXByaXYtPlR4UG93ZXJMZXZlbE9GRE0yNEdbaV0gPSBwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxPRkRNMjRHW2ldOwotCQkJfQotCQkJcHJpdi0+TGVnYWN5SFRUeFBvd2VyRGlmZiA9IHByaXYtPkVFUFJPTUxlZ2FjeUhUVHhQb3dlckRpZmY7Ci0JCS8vIEFudGVubmEgQiBnYWluIG9mZnNldCB0byBhbnRlbm5hIEEsIGJpdDB+MwotCQkJcHJpdi0+QW50ZW5uYVR4UHdEaWZmWzBdID0gKHByaXYtPkVFUFJPTUFudFB3RGlmZiAmIDB4Zik7Ci0JCS8vIEFudGVubmEgQyBnYWluIG9mZnNldCB0byBhbnRlbm5hIEEsIGJpdDR+NwotCQkJcHJpdi0+QW50ZW5uYVR4UHdEaWZmWzFdID0gKChwcml2LT5FRVBST01BbnRQd0RpZmYgJiAweGYwKT4+NCk7Ci0JCS8vIEFudGVubmEgRCBnYWluIG9mZnNldCB0byBhbnRlbm5hIEEsIGJpdDh+MTEKLQkJCXByaXYtPkFudGVubmFUeFB3RGlmZlsyXSA9ICgocHJpdi0+RUVQUk9NQW50UHdEaWZmICYgMHhmMDApPj44KTsKLQkJLy8gQ3J5c3RhbENhcCwgYml0MTJ+MTUKLQkJCXByaXYtPkNyeXN0YWxDYXAgPSBwcml2LT5FRVBST01DcnlzdGFsQ2FwOwotCQkvLyBUaGVybWFsTWV0ZXIsIGJpdDB+MyBmb3IgUkZJQzEsIGJpdDR+NyBmb3IgUkZJQzIKLQkJCXByaXYtPlRoZXJtYWxNZXRlclswXSA9IChwcml2LT5FRVBST01UaGVybWFsTWV0ZXIgJiAweGYpOwotCQkJcHJpdi0+VGhlcm1hbE1ldGVyWzFdID0gKChwcml2LT5FRVBST01UaGVybWFsTWV0ZXIgJiAweGYwKT4+NCk7Ci0JCX0KLQkJZWxzZSBpZihwcml2LT5lcHJvbXR5cGUgPT0gRVBST01fOTNjNTYpCi0JCXsKLQkJCWZvcihpPTA7IGk8MzsgaSsrKQkvLyBjaGFubmVsIDF+MyB1c2UgdGhlIHNhbWUgVHggUG93ZXIgTGV2ZWwuCi0JCQl7Ci0JCQkJcHJpdi0+VHhQb3dlckxldmVsQ0NLX0FbaV0gID0gcHJpdi0+RUVQUk9NUmZBQ0NLQ2hubDFUeFB3TGV2ZWxbMF07Ci0JCQkJcHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R19BW2ldID0gcHJpdi0+RUVQUk9NUmZBT2ZkbUNobmxUeFB3TGV2ZWxbMF07Ci0JCQkJcHJpdi0+VHhQb3dlckxldmVsQ0NLX0NbaV0gPSAgcHJpdi0+RUVQUk9NUmZDQ0NLQ2hubDFUeFB3TGV2ZWxbMF07Ci0JCQkJcHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R19DW2ldID0gcHJpdi0+RUVQUk9NUmZDT2ZkbUNobmxUeFB3TGV2ZWxbMF07Ci0JCQl9Ci0JCQlmb3IoaT0zOyBpPDk7IGkrKykJLy8gY2hhbm5lbCA0fjkgdXNlIHRoZSBzYW1lIFR4IFBvd2VyIExldmVsCi0JCQl7Ci0JCQkJcHJpdi0+VHhQb3dlckxldmVsQ0NLX0FbaV0gID0gcHJpdi0+RUVQUk9NUmZBQ0NLQ2hubDFUeFB3TGV2ZWxbMV07Ci0JCQkJcHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R19BW2ldID0gcHJpdi0+RUVQUk9NUmZBT2ZkbUNobmxUeFB3TGV2ZWxbMV07Ci0JCQkJcHJpdi0+VHhQb3dlckxldmVsQ0NLX0NbaV0gPSAgcHJpdi0+RUVQUk9NUmZDQ0NLQ2hubDFUeFB3TGV2ZWxbMV07Ci0JCQkJcHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R19DW2ldID0gcHJpdi0+RUVQUk9NUmZDT2ZkbUNobmxUeFB3TGV2ZWxbMV07Ci0JCQl9Ci0JCQlmb3IoaT05OyBpPDE0OyBpKyspCS8vIGNoYW5uZWwgMTB+MTQgdXNlIHRoZSBzYW1lIFR4IFBvd2VyIExldmVsCi0JCQl7Ci0JCQkJcHJpdi0+VHhQb3dlckxldmVsQ0NLX0FbaV0gID0gcHJpdi0+RUVQUk9NUmZBQ0NLQ2hubDFUeFB3TGV2ZWxbMl07Ci0JCQkJcHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R19BW2ldID0gcHJpdi0+RUVQUk9NUmZBT2ZkbUNobmxUeFB3TGV2ZWxbMl07Ci0JCQkJcHJpdi0+VHhQb3dlckxldmVsQ0NLX0NbaV0gPSAgcHJpdi0+RUVQUk9NUmZDQ0NLQ2hubDFUeFB3TGV2ZWxbMl07Ci0JCQkJcHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R19DW2ldID0gcHJpdi0+RUVQUk9NUmZDT2ZkbUNobmxUeFB3TGV2ZWxbMl07Ci0JCQl9Ci0JCQlmb3IoaT0wOyBpPDE0OyBpKyspCi0JCQkJUlRfVFJBQ0UoQ09NUF9JTklULCAicHJpdi0+VHhQb3dlckxldmVsQ0NLX0FbJWRdID0gMHgleFxuIiwgaSwgcHJpdi0+VHhQb3dlckxldmVsQ0NLX0FbaV0pOwotCQkJZm9yKGk9MDsgaTwxNDsgaSsrKQotCQkJCVJUX1RSQUNFKENPTVBfSU5JVCwicHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R19BWyVkXSA9IDB4JXhcbiIsIGksIHByaXYtPlR4UG93ZXJMZXZlbE9GRE0yNEdfQVtpXSk7Ci0JCQlmb3IoaT0wOyBpPDE0OyBpKyspCi0JCQkJUlRfVFJBQ0UoQ09NUF9JTklULCAicHJpdi0+VHhQb3dlckxldmVsQ0NLX0NbJWRdID0gMHgleFxuIiwgaSwgcHJpdi0+VHhQb3dlckxldmVsQ0NLX0NbaV0pOwotCQkJZm9yKGk9MDsgaTwxNDsgaSsrKQotCQkJCVJUX1RSQUNFKENPTVBfSU5JVCwgInByaXYtPlR4UG93ZXJMZXZlbE9GRE0yNEdfQ1slZF0gPSAweCV4XG4iLCBpLCBwcml2LT5UeFBvd2VyTGV2ZWxPRkRNMjRHX0NbaV0pOwotCQkJcHJpdi0+TGVnYWN5SFRUeFBvd2VyRGlmZiA9IHByaXYtPkVFUFJPTUxlZ2FjeUhUVHhQb3dlckRpZmY7Ci0JCQlwcml2LT5BbnRlbm5hVHhQd0RpZmZbMF0gPSAwOwotCQkJcHJpdi0+QW50ZW5uYVR4UHdEaWZmWzFdID0gMDsKLQkJCXByaXYtPkFudGVubmFUeFB3RGlmZlsyXSA9IDA7Ci0JCQlwcml2LT5DcnlzdGFsQ2FwID0gcHJpdi0+RUVQUk9NQ3J5c3RhbENhcDsKLQkJCS8vIFRoZXJtYWxNZXRlciwgYml0MH4zIGZvciBSRklDMSwgYml0NH43IGZvciBSRklDMgotCQkJcHJpdi0+VGhlcm1hbE1ldGVyWzBdID0gKHByaXYtPkVFUFJPTVRoZXJtYWxNZXRlciAmIDB4Zik7Ci0JCQlwcml2LT5UaGVybWFsTWV0ZXJbMV0gPSAoKHByaXYtPkVFUFJPTVRoZXJtYWxNZXRlciAmIDB4ZjApPj40KTsKLQkJfQotCX0KLQotCWlmKHByaXYtPnJmX3R5cGUgPT0gUkZfMVQyUikKLQl7Ci0JCVJUX1RSQUNFKENPTVBfSU5JVCwgIjFUMlIgY29uZmlnXG4iKTsKLQl9Ci0JZWxzZSBpZiAocHJpdi0+cmZfdHlwZSA9PSBSRl8yVDRSKQotCXsKLQkJUlRfVFJBQ0UoQ09NUF9JTklULCAiMlQ0UiBjb25maWdcbiIpOwotCX0KLQotCS8vIDIwMDgvMDEvMTYgTUggV2UgY2FuIG9ubHkga25vdyBSRiB0eXBlIGluIHRoZSBmdW5jdGlvbi4gU28gd2UgaGF2ZSB0byBpbml0Ci0JLy8gRElHIFJBVFIgdGFibGUgYWdhaW4uCi0JaW5pdF9yYXRlX2FkYXB0aXZlKHByaXYpOwotCi0JLy8xIE1ha2UgYSBjb3B5IGZvciBmb2xsb3dpbmcgdmFyaWFibGVzIGFuZCB3ZSBjYW4gY2hhbmdlIHRoZW0gaWYgd2Ugd2FudAotCi0JaWYocHJpdi0+UmVnQ2hhbm5lbFBsYW4gPT0gMHhmKQotCXsKLQkJcHJpdi0+Q2hhbm5lbFBsYW4gPSBwcml2LT5lZXByb21fQ2hhbm5lbFBsYW47Ci0JfQotCWVsc2UKLQl7Ci0JCXByaXYtPkNoYW5uZWxQbGFuID0gcHJpdi0+UmVnQ2hhbm5lbFBsYW47Ci0JfQotCi0JLy8KLQkvLyAgVXNlZCBQSUQgYW5kIERJRCB0byBTZXQgQ3VzdG9tZXJJRAotCS8vCi0JaWYoIHByaXYtPmVlcHJvbV92aWQgPT0gMHgxMTg2ICYmICBwcml2LT5lZXByb21fZGlkID09IDB4MzMwNCApCi0JewotCQlwcml2LT5DdXN0b21lcklEID0gIFJUX0NJRF9ETElOSzsKLQl9Ci0KLQlzd2l0Y2gocHJpdi0+ZWVwcm9tX0N1c3RvbWVySUQpCi0JewotCQljYXNlIEVFUFJPTV9DSURfREVGQVVMVDoKLQkJCXByaXYtPkN1c3RvbWVySUQgPSBSVF9DSURfREVGQVVMVDsKLQkJCWJyZWFrOwotCQljYXNlIEVFUFJPTV9DSURfQ0FNRU86Ci0JCQlwcml2LT5DdXN0b21lcklEID0gUlRfQ0lEXzgxOXhfQ0FNRU87Ci0JCQlicmVhazsKLQkJY2FzZSAgRUVQUk9NX0NJRF9SVU5UT1A6Ci0JCQlwcml2LT5DdXN0b21lcklEID0gUlRfQ0lEXzgxOXhfUlVOVE9QOwotCQkJYnJlYWs7Ci0JCWNhc2UgRUVQUk9NX0NJRF9OZXRDb3JlOgotCQkJcHJpdi0+Q3VzdG9tZXJJRCA9IFJUX0NJRF84MTl4X05ldGNvcmU7Ci0JCQlicmVhazsKLQkJY2FzZSBFRVBST01fQ0lEX1RPU0hJQkE6ICAgICAgICAvLyBNZXJnZSBieSBKYWNrZW4sIDIwMDgvMDEvMzEKLQkJCXByaXYtPkN1c3RvbWVySUQgPSBSVF9DSURfVE9TSElCQTsKLQkJCWlmKHByaXYtPmVlcHJvbV9DaGFubmVsUGxhbiYweDgwKQotCQkJCXByaXYtPkNoYW5uZWxQbGFuID0gcHJpdi0+ZWVwcm9tX0NoYW5uZWxQbGFuJjB4N2Y7Ci0JCQllbHNlCi0JCQkJcHJpdi0+Q2hhbm5lbFBsYW4gPSAweDA7Ci0JCQlSVF9UUkFDRShDT01QX0lOSVQsICJUb3NoaWJhIENoYW5uZWxQbGFuID0gMHgleFxuIiwKLQkJCQlwcml2LT5DaGFubmVsUGxhbik7Ci0JCQlicmVhazsKLQkJY2FzZSBFRVBST01fQ0lEX05ldHRyb25peDoKLQkJCXByaXYtPkN1c3RvbWVySUQgPSBSVF9DSURfTmV0dHJvbml4OwotCQkJYnJlYWs7Ci0JCWNhc2UgRUVQUk9NX0NJRF9Qcm9uZXQ6Ci0JCQlwcml2LT5DdXN0b21lcklEID0gUlRfQ0lEX1BST05FVDsKLQkJCWJyZWFrOwotCQljYXNlIEVFUFJPTV9DSURfRExJTks6Ci0JCQlwcml2LT5DdXN0b21lcklEID0gUlRfQ0lEX0RMSU5LOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBFRVBST01fQ0lEX1dIUUw6Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCS8vIHZhbHVlIGZyb20gUmVnQ3VzdG9tZXJJRAotCQkJYnJlYWs7Ci0JfQotCi0JLy9Bdm9pZCB0aGUgY2hhbm5lbCBwbGFuIGFycmF5IG92ZXJmbG93LCBieSBCcnVjZSwgMjAwNy0wOC0yNy4KLQlpZihwcml2LT5DaGFubmVsUGxhbiA+IENIQU5ORUxfUExBTl9MRU4gLSAxKQotCQlwcml2LT5DaGFubmVsUGxhbiA9IDA7IC8vRkNDCi0KLQlpZiggcHJpdi0+ZWVwcm9tX3ZpZCA9PSAweDExODYgJiYgIHByaXYtPmVlcHJvbV9kaWQgPT0gMHgzMzA0KQotCQlwcml2LT5pZWVlODAyMTEtPmJTdXBwb3J0UmVtb3RlV2FrZVVwID0gdHJ1ZTsKLQllbHNlCi0JCXByaXYtPmllZWU4MDIxMS0+YlN1cHBvcnRSZW1vdGVXYWtlVXAgPSBmYWxzZTsKLQotCi0JUlRfVFJBQ0UoQ09NUF9JTklULCAiUmVnQ2hhbm5lbFBsYW4oJWQpXG4iLCBwcml2LT5SZWdDaGFubmVsUGxhbik7Ci0JUlRfVFJBQ0UoQ09NUF9JTklULCAiQ2hhbm5lbFBsYW4gPSAlZFxuIiwgcHJpdi0+Q2hhbm5lbFBsYW4pOwotCVJUX1RSQUNFKENPTVBfVFJBQ0UsICI8PT09PSBSZWFkQWRhcHRlckluZm9cbiIpOwotfQotCi0KLXN0YXRpYyBzaG9ydCBydGw4MTkyX2dldF9jaGFubmVsX21hcChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLSNpZmRlZiBFTkFCTEVfRE9UMTFECi0JaWYocHJpdi0+Q2hhbm5lbFBsYW4+IENPVU5UUllfQ09ERV9HTE9CQUxfRE9NQUlOKXsKLQkJcHJpbnRrKCJydGw4MTgwX2luaXQ6RXJyb3IgY2hhbm5lbCBwbGFuISBTZXQgdG8gZGVmYXVsdC5cbiIpOwotCQlwcml2LT5DaGFubmVsUGxhbj0gMDsKLQl9Ci0JUlRfVFJBQ0UoQ09NUF9JTklULCAiQ2hhbm5lbCBwbGFuIGlzICVkXG4iLHByaXYtPkNoYW5uZWxQbGFuKTsKLQotCXJ0bDgxOXhfc2V0X2NoYW5uZWxfbWFwKHByaXYtPkNoYW5uZWxQbGFuLCBwcml2KTsKLSNlbHNlCi0JaW50IGNoLGk7Ci0JLy9TZXQgRGVmYXVsdCBDaGFubmVsIFBsYW4KLQlpZighY2hhbm5lbHMpewotCQlETUVTRygiTm8gY2hhbm5lbHMsIGFib3J0aW5nIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JY2g9Y2hhbm5lbHM7Ci0JcHJpdi0+Q2hhbm5lbFBsYW49IDA7Ly9oaWthcnUKLQkgLy8gc2V0IGNoYW5uZWxzIDEuLjE0IGFsbG93ZWQgaW4gZ2l2ZW4gbG9jYWxlCi0JZm9yIChpPTE7IGk8PTE0OyBpKyspIHsKLQkJKHByaXYtPmllZWU4MDIxMS0+Y2hhbm5lbF9tYXApW2ldID0gKHU4KShjaCAmIDB4MDEpOwotCQljaCA+Pj0gMTsKLQl9Ci0jZW5kaWYKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNob3J0IHJ0bDgxOTJfaW5pdChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+aWVlZTgwMjExLT5kZXY7Ci0KLQltZW1zZXQoJihwcml2LT5zdGF0cyksMCxzaXplb2Yoc3RydWN0IFN0YXRzKSk7Ci0JcnRsODE5Ml9pbml0X3ByaXZfdmFyaWFibGUocHJpdik7Ci0JcnRsODE5Ml9pbml0X3ByaXZfbG9jayhwcml2KTsKLQlydGw4MTkyX2luaXRfcHJpdl90YXNrKHByaXYpOwotCXJ0bDgxOTJfZ2V0X2VlcHJvbV9zaXplKHByaXYpOwotCXJ0bDgxOTJfcmVhZF9lZXByb21faW5mbyhwcml2KTsKLQlydGw4MTkyX2dldF9jaGFubmVsX21hcChwcml2KTsKLQlpbml0X2hhbF9kbShwcml2KTsKLQlpbml0X3RpbWVyKCZwcml2LT53YXRjaF9kb2dfdGltZXIpOwotCXByaXYtPndhdGNoX2RvZ190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcHJpdjsKLQlwcml2LT53YXRjaF9kb2dfdGltZXIuZnVuY3Rpb24gPSB3YXRjaF9kb2dfdGltZXJfY2FsbGJhY2s7Ci0gICAgICAgIGlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgcnRsODE5Ml9pbnRlcnJ1cHQsIElSUUZfU0hBUkVELCBkZXYtPm5hbWUsIHByaXYpKSB7Ci0JCXByaW50aygiRXJyb3IgYWxsb2NhdGluZyBJUlEgJWQiLGRldi0+aXJxKTsKLQkJcmV0dXJuIC0xOwotCX1lbHNlewotCQlwcml2LT5pcnE9ZGV2LT5pcnE7Ci0JCXByaW50aygiSVJRICVkIixkZXYtPmlycSk7Ci0JfQotCWlmIChydGw4MTkyX3BjaV9pbml0ZGVzY3JpbmcocHJpdikgIT0gMCl7Ci0JCXByaW50aygiRW5kb3BvaW50cyBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogQWN0dWFsbHkgb25seSBzZXQgUlJTUiwgUkFUUiBhbmQgQldfT1BNT0RFIHJlZ2lzdGVycwotICogIG5vdCB0byBkbyBhbGwgdGhlIGh3IGNvbmZpZyBhcyBpdHMgbmFtZSBzYXlzCi0gKiBUaGlzIHBhcnQgbmVlZCB0byBtb2RpZmllZCBhY2NvcmRpbmcgdG8gdGhlIHJhdGUgc2V0IHdlIGZpbHRlcmVkCi0gKi8KLXN0YXRpYyB2b2lkIHJ0bDgxOTJfaHdjb25maWcoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0JdTMyIHJlZ1JBVFIgPSAwLCByZWdSUlNSID0gMDsKLQl1OCByZWdCd09wTW9kZSA9IDAsIHJlZ1RtcCA9IDA7Ci0KLS8vIFNldCBSUlNSLCBSQVRSLCBhbmQgQldfT1BNT0RFIHJlZ2lzdGVycwotCS8vCi0Jc3dpdGNoIChwcml2LT5pZWVlODAyMTEtPm1vZGUpCi0JewotCWNhc2UgV0lSRUxFU1NfTU9ERV9COgotCQlyZWdCd09wTW9kZSA9IEJXX09QTU9ERV8yME1IWjsKLQkJcmVnUkFUUiA9IFJBVEVfQUxMX0NDSzsKLQkJcmVnUlJTUiA9IFJBVEVfQUxMX0NDSzsKLQkJYnJlYWs7Ci0JY2FzZSBXSVJFTEVTU19NT0RFX0E6Ci0JCXJlZ0J3T3BNb2RlID0gQldfT1BNT0RFXzVHIHxCV19PUE1PREVfMjBNSFo7Ci0JCXJlZ1JBVFIgPSBSQVRFX0FMTF9PRkRNX0FHOwotCQlyZWdSUlNSID0gUkFURV9BTExfT0ZETV9BRzsKLQkJYnJlYWs7Ci0JY2FzZSBXSVJFTEVTU19NT0RFX0c6Ci0JCXJlZ0J3T3BNb2RlID0gQldfT1BNT0RFXzIwTUhaOwotCQlyZWdSQVRSID0gUkFURV9BTExfQ0NLIHwgUkFURV9BTExfT0ZETV9BRzsKLQkJcmVnUlJTUiA9IFJBVEVfQUxMX0NDSyB8IFJBVEVfQUxMX09GRE1fQUc7Ci0JCWJyZWFrOwotCWNhc2UgV0lSRUxFU1NfTU9ERV9BVVRPOgotCWNhc2UgV0lSRUxFU1NfTU9ERV9OXzI0RzoKLQkJLy8gSXQgc3VwcG9ydCBDQ0sgcmF0ZSBieSBkZWZhdWx0LgotCQkvLyBDQ0sgcmF0ZSB3aWxsIGJlIGZpbHRlcmVkIG91dCBvbmx5IHdoZW4gYXNzb2NpYXRlZCBBUCBkb2VzIG5vdCBzdXBwb3J0IGl0LgotCQlyZWdCd09wTW9kZSA9IEJXX09QTU9ERV8yME1IWjsKLQkJCXJlZ1JBVFIgPSBSQVRFX0FMTF9DQ0sgfCBSQVRFX0FMTF9PRkRNX0FHIHwgUkFURV9BTExfT0ZETV8xU1MgfCBSQVRFX0FMTF9PRkRNXzJTUzsKLQkJCXJlZ1JSU1IgPSBSQVRFX0FMTF9DQ0sgfCBSQVRFX0FMTF9PRkRNX0FHOwotCQlicmVhazsKLQljYXNlIFdJUkVMRVNTX01PREVfTl81RzoKLQkJcmVnQndPcE1vZGUgPSBCV19PUE1PREVfNUc7Ci0JCXJlZ1JBVFIgPSBSQVRFX0FMTF9PRkRNX0FHIHwgUkFURV9BTExfT0ZETV8xU1MgfCBSQVRFX0FMTF9PRkRNXzJTUzsKLQkJcmVnUlJTUiA9IFJBVEVfQUxMX09GRE1fQUc7Ci0JCWJyZWFrOwotCX0KLQotCXdyaXRlX25pY19ieXRlKHByaXYsIEJXX09QTU9ERSwgcmVnQndPcE1vZGUpOwotCXsKLQkJdTMyIHJhdHJfdmFsdWUgPSAwOwotCQlyYXRyX3ZhbHVlID0gcmVnUkFUUjsKLQkJaWYgKHByaXYtPnJmX3R5cGUgPT0gUkZfMVQyUikKLQkJewotCQkJcmF0cl92YWx1ZSAmPSB+KFJBVEVfQUxMX09GRE1fMlNTKTsKLQkJfQotCQl3cml0ZV9uaWNfZHdvcmQocHJpdiwgUkFUUjAsIHJhdHJfdmFsdWUpOwotCQl3cml0ZV9uaWNfYnl0ZShwcml2LCBVRldQLCAxKTsKLQl9Ci0JcmVnVG1wID0gcmVhZF9uaWNfYnl0ZShwcml2LCAweDMxMyk7Ci0JcmVnUlJTUiA9ICgocmVnVG1wKSA8PCAyNCkgfCAocmVnUlJTUiAmIDB4MDBmZmZmZmYpOwotCXdyaXRlX25pY19kd29yZChwcml2LCBSUlNSLCByZWdSUlNSKTsKLQotCS8vCi0JLy8gU2V0IFJldHJ5IExpbWl0IGhlcmUKLQkvLwotCXdyaXRlX25pY193b3JkKHByaXYsIFJFVFJZX0xJTUlULAotCQkJcHJpdi0+U2hvcnRSZXRyeUxpbWl0IDw8IFJFVFJZX0xJTUlUX1NIT1JUX1NISUZUIHwKLQkJCXByaXYtPkxvbmdSZXRyeUxpbWl0IDw8IFJFVFJZX0xJTUlUX0xPTkdfU0hJRlQpOwotCS8vIFNldCBDb250ZW50aW9uIFdpbmRvdyBoZXJlCi0KLQkvLyBTZXQgVHggQUdDCi0KLQkvLyBTZXQgVHggQW50ZW5uYSBpbmNsdWRpbmcgRmVlZGJhY2sgY29udHJvbAotCi0JLy8gU2V0IEF1dG8gUmF0ZSBmYWxsYmFjayBjb250cm9sCi0KLQotfQotCi0KLXN0YXRpYyBSVF9TVEFUVVMgcnRsODE5Ml9hZGFwdGVyX3N0YXJ0KHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5pZWVlODAyMTEtPmRldjsKLQl1MzIgdWxSZWdSZWFkOwotCVJUX1NUQVRVUyBydFN0YXR1cyA9IFJUX1NUQVRVU19TVUNDRVNTOwotCXU4IHRtcHZhbHVlOwotCXU4IElDVmVyc2lvbixTd2l0Y2hpbmdSZWd1bGF0b3JPdXRwdXQ7Ci0JYm9vbCBiZmlybXdhcmVvayA9IHRydWU7Ci0JdTMyCXRtcFJlZ0EsIHRtcFJlZ0MsIFRlbXBDQ2s7Ci0JaW50CWkgPTA7Ci0KLQlSVF9UUkFDRShDT01QX0lOSVQsICI9PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7Ci0JcHJpdi0+YmVpbmdfaW5pdF9hZGFwdGVyID0gdHJ1ZTsKLSAgICAgICAgcnRsODE5Ml9wY2lfcmVzZXRkZXNjcmluZyhwcml2KTsKLQkvLyAyMDA3LzExLzAyIE1IIEJlZm9yZSBpbml0YWxpemluZyBSRi4gV2UgY2FuIG5vdCB1c2UgRlcgdG8gZG8gUkYtUi9XLgotCXByaXYtPlJmX01vZGUgPSBSRl9PUF9CeV9TV18zd2lyZTsKLQotICAgICAgICAvL2RQTEwgb24KLSAgICAgICAgaWYocHJpdi0+UmVzZXRQcm9ncmVzcyA9PSBSRVNFVF9UWVBFX05PUkVTRVQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlX25pY19ieXRlKHByaXYsIEFOQVBBUiwgMHgzNyk7Ci0gICAgICAgICAgICAvLyBBY2NvcmRpZ24gdG8gZGVzaWduZXIncyBleHBsYWluLCBMQlVTIGFjdGl2ZSB3aWxsIG5ldmVyID4gMTBtcy4gV2UgZGVsYXkgMTBtcwotICAgICAgICAgICAgLy8gSm9zZXBoIGluY3JlYWUgdGhlIHRpbWUgdG8gcHJldmVudCBmaXJtd2FyZSBkb3dubG9hZCBmYWlsCi0gICAgICAgICAgICBtZGVsYXkoNTAwKTsKLSAgICAgICAgfQotCi0JLy9QbGF0Zm9ybVNsZWVwVXMoMTAwMDApOwotCS8vIEZvciBhbnkga2luZCBvZiBJbml0aWFsaXplQWRhcHRlciBwcm9jZXNzLCB3ZSBzaGFsbCB1c2Ugc3lzdGVtIG5vdyEhCi0JcHJpdi0+cEZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPSBGV19TVEFUVVNfMF9JTklUOwotCi0JLy8KLQkvLzMgLy9Db25maWcgQ1BVUmVzZXQgUmVnaXN0ZXIKLQkvLzMvLwotCS8vMyBGaXJtd2FyZSBSZXNldCBPciBOb3QKLQl1bFJlZ1JlYWQgPSByZWFkX25pY19kd29yZChwcml2LCBDUFVfR0VOKTsKLQlpZihwcml2LT5wRmlybXdhcmUtPmZpcm13YXJlX3N0YXR1cyA9PSBGV19TVEFUVVNfMF9JTklUKQotCXsJLy9jYWxsZWQgZnJvbSBNUEluaXRpYWxpemVkLiBkbyBub3RoaW5nCi0JCXVsUmVnUmVhZCB8PSBDUFVfR0VOX1NZU1RFTV9SRVNFVDsKLQl9ZWxzZSBpZihwcml2LT5wRmlybXdhcmUtPmZpcm13YXJlX3N0YXR1cyA9PSBGV19TVEFUVVNfNV9SRUFEWSkKLQkJdWxSZWdSZWFkIHw9IENQVV9HRU5fRklSTVdBUkVfUkVTRVQ7CS8vIENhbGxlZCBmcm9tIE1QUmVzZXQKLQllbHNlCi0JCVJUX1RSQUNFKENPTVBfRVJSLCAiRVJST1IgaW4gJXMoKTogdW5kZWZpbmVkIGZpcm13YXJlIHN0YXRlKCVkKVxuIiwgX19GVU5DVElPTl9fLCAgIHByaXYtPnBGaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzKTsKLQotCXdyaXRlX25pY19kd29yZChwcml2LCBDUFVfR0VOLCB1bFJlZ1JlYWQpOwotCi0JLy8zLy8KLQkvLzMgLy9GaXggdGhlIGlzc3VlIG9mIEUtY3V0IGhpZ2ggdGVtcGVyYXR1cmUgaXNzdWUKLQkvLzMvLwotCS8vIFRPRE86IEUgY3V0IG9ubHkKLQlJQ1ZlcnNpb24gPSByZWFkX25pY19ieXRlKHByaXYsIElDX1ZFUlJTSU9OKTsKLQlpZihJQ1ZlcnNpb24gPj0gMHg0KSAvL0UtY3V0IG9ubHkKLQl7Ci0JCS8vIEhXIFNEIHN1Z2dlc3QgdGhhdCB3ZSBzaG91bGQgbm90IHdpcnRlIHRoaXMgcmVnaXN0ZXIgdG9vIG9mdGVuLCBzbyBkcml2ZXIKLQkJLy8gc2hvdWxkIHJlYWRiYWNrIHRoaXMgcmVnaXN0ZXIuIFRoaXMgcmVnaXN0ZXIgd2lsbCBiZSBtb2RpZmllZCBvbmx5IHdoZW4KLQkJLy8gcG93ZXIgb24gcmVzZXQKLQkJU3dpdGNoaW5nUmVndWxhdG9yT3V0cHV0ID0gcmVhZF9uaWNfYnl0ZShwcml2LCBTV1JFR1VMQVRPUik7Ci0JCWlmKFN3aXRjaGluZ1JlZ3VsYXRvck91dHB1dCAgIT0gMHhiOCkKLQkJewotCQkJd3JpdGVfbmljX2J5dGUocHJpdiwgU1dSRUdVTEFUT1IsIDB4YTgpOwotCQkJbWRlbGF5KDEpOwotCQkJd3JpdGVfbmljX2J5dGUocHJpdiwgU1dSRUdVTEFUT1IsIDB4YjgpOwotCQl9Ci0JfQotCi0JLy8zLy8KLQkvLzMvLyBJbml0aWFsaXplIEJCIGJlZm9yZSBNQUMKLQkvLzMvLwotCVJUX1RSQUNFKENPTVBfSU5JVCwgIkJCIENvbmZpZyBTdGFydCFcbiIpOwotCXJ0U3RhdHVzID0gcnRsODE5Ml9CQkNvbmZpZyhwcml2KTsKLQlpZihydFN0YXR1cyAhPSBSVF9TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCVJUX1RSQUNFKENPTVBfRVJSLCAiQkIgQ29uZmlnIGZhaWxlZFxuIik7Ci0JCXJldHVybiBydFN0YXR1czsKLQl9Ci0JUlRfVFJBQ0UoQ09NUF9JTklULCJCQiBDb25maWcgRmluaXNoZWQhXG4iKTsKLQotCS8vMy8vU2V0IExvb3BiYWNrIG1vZGUgb3IgTm9ybWFsIG1vZGUKLQkvLzMvLwotCS8vMjAwNi4xMi4xMyBieSBlbWlseS4gTm90ZSFXZSBzaG91bGQgbm90IG1lcmdlIHRoZXNlIHR3byBDUFVfR0VOIHJlZ2lzdGVyIHdyaXRpbmdzCi0JLy8JYmVjYXVzZSBzZXR0aW5nIG9mIFN5c3RlbV9SZXNldCBiaXQgcmVzZXQgTUFDIHRvIGRlZmF1bHQgdHJhbnNtaXNzaW9uIG1vZGUuCi0JCS8vTG9vcGJhY2sgbW9kZSBvciBub3QKLQlwcml2LT5Mb29wYmFja01vZGUgPSBSVEw4MTlYX05PX0xPT1BCQUNLOwotCWlmKHByaXYtPlJlc2V0UHJvZ3Jlc3MgPT0gUkVTRVRfVFlQRV9OT1JFU0VUKQotCXsKLQl1bFJlZ1JlYWQgPSByZWFkX25pY19kd29yZChwcml2LCBDUFVfR0VOKTsKLQlpZihwcml2LT5Mb29wYmFja01vZGUgPT0gUlRMODE5WF9OT19MT09QQkFDSykKLQl7Ci0JCXVsUmVnUmVhZCA9ICgodWxSZWdSZWFkICYgQ1BVX0dFTl9OT19MT09QQkFDS19NU0spIHwgQ1BVX0dFTl9OT19MT09QQkFDS19TRVQpOwotCX0KLQllbHNlIGlmIChwcml2LT5Mb29wYmFja01vZGUgPT0gUlRMODE5WF9NQUNfTE9PUEJBQ0sgKQotCXsKLQkJdWxSZWdSZWFkIHw9IENQVV9DQ0tfTE9PUEJBQ0s7Ci0JfQotCWVsc2UKLQl7Ci0JCVJUX1RSQUNFKENPTVBfRVJSLCJTZXJpb3VzIGVycm9yOiB3cm9uZyBsb29wYmFjayBtb2RlIHNldHRpbmdcbiIpOwotCX0KLQotCS8vMjAwOC4wNi4wMywgZm9yIFdPTAotCS8vdWxSZWdSZWFkICY9ICh+KENQVV9HRU5fR1BJT19VQVJUKSk7Ci0Jd3JpdGVfbmljX2R3b3JkKHByaXYsIENQVV9HRU4sIHVsUmVnUmVhZCk7Ci0KLQkvLyAyMDA2LjExLjI5LiBBZnRlciByZXNldCBjcHUsIHdlIHNob2x1ZCB3YWl0IGZvciBhIHNlY29uZCwgb3RoZXJ3aXNlLCBpdCBtYXkgZmFpbCB0byB3cml0ZSByZWdpc3RlcnMuIEVtaWx5Ci0JdWRlbGF5KDUwMCk7Ci0JfQotCS8vM1NldCBIYXJkd2FyZShEbyBub3RoaW5nIG5vdykKLQlydGw4MTkyX2h3Y29uZmlnKHByaXYpOwotCS8vMj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkvLyBDb21tb24gU2V0dGluZyBmb3IgYWxsIG9mIHRoZSBGUEdBIHBsYXRmb3JtLiAocGFydCAxKQotCS8vMj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkvLyBJZiB0aGVyZSBpcyBjaGFuZ2VzLCBwbGVhc2UgbWFrZSBzdXJlIGl0IGFwcGxpZXMgdG8gYWxsIG9mIHRoZSBGUEdBIHZlcnNpb24KLQkvLzMgVHVybiBvbiBUeC9SeAotCXdyaXRlX25pY19ieXRlKHByaXYsIENNRFIsIENSX1JFfENSX1RFKTsKLQotCS8vMlNldCBUeCBkbWEgYnVyc3QKLQl3cml0ZV9uaWNfYnl0ZShwcml2LCBQQ0lGLCAoKE1YRE1BMl9Ob0xpbWl0PDxNWERNQTJfUlhfU0hJRlQpIHwKLQkJCQkgICAoTVhETUEyX05vTGltaXQ8PE1YRE1BMl9UWF9TSElGVCkgKSk7Ci0KLQkvL3NldCBJRFIwIGhlcmUKLQl3cml0ZV9uaWNfZHdvcmQocHJpdiwgTUFDMCwgKCh1MzIqKWRldi0+ZGV2X2FkZHIpWzBdKTsKLQl3cml0ZV9uaWNfd29yZChwcml2LCBNQUM0LCAoKHUxNiopKGRldi0+ZGV2X2FkZHIgKyA0KSlbMF0pOwotCS8vc2V0IFJDUgotCXdyaXRlX25pY19kd29yZChwcml2LCBSQ1IsIHByaXYtPlJlY2VpdmVDb25maWcpOwotCi0JLy8zIEluaXRpYWxpemUgTnVtYmVyIG9mIFJlc2VydmVkIFBhZ2VzIGluIEZpcm13YXJlIFF1ZXVlCi0JCXdyaXRlX25pY19kd29yZChwcml2LCBSUVBOMSwgIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JLIDw8IFJTVkRfRldfUVVFVUVfUEFHRV9CS19TSElGVCB8Ci0JCQkJCU5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JFIDw8IFJTVkRfRldfUVVFVUVfUEFHRV9CRV9TSElGVCB8Ci0JCQkJCU5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1ZJIDw8IFJTVkRfRldfUVVFVUVfUEFHRV9WSV9TSElGVCB8Ci0JCQkJCU5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1ZPIDw8UlNWRF9GV19RVUVVRV9QQUdFX1ZPX1NISUZUKTsKLQkJd3JpdGVfbmljX2R3b3JkKHByaXYsIFJRUE4yLCBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9NR05UIDw8IFJTVkRfRldfUVVFVUVfUEFHRV9NR05UX1NISUZUKTsKLQkJd3JpdGVfbmljX2R3b3JkKHByaXYsIFJRUE4zLCBBUFBMSUVEX1JFU0VSVkVEX1FVRVVFX0lOX0ZXfAotCQkJCQlOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CQ048PFJTVkRfRldfUVVFVUVfUEFHRV9CQ05fU0hJRlR8Ci0JCQkJCU5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1BVQjw8UlNWRF9GV19RVUVVRV9QQUdFX1BVQl9TSElGVCk7Ci0KLQlydGw4MTkyX3R4X2VuYWJsZShwcml2KTsKLQlydGw4MTkyX3J4X2VuYWJsZShwcml2KTsKLQkvLzNTZXQgUmVzcG9uc2UgUmF0ZSBTZXR0aW5nIFJlZ2lzdGVyCi0JLy8gQ0NLIHJhdGUgaXMgc3VwcG9ydGVkIGJ5IGRlZmF1bHQuCi0JLy8gQ0NLIHJhdGUgd2lsbCBiZSBmaWx0ZXJlZCBvdXQgb25seSB3aGVuIGFzc29jaWF0ZWQgQVAgZG9lcyBub3Qgc3VwcG9ydCBpdC4KLQl1bFJlZ1JlYWQgPSAoMHhGRkYwMDAwMCAmIHJlYWRfbmljX2R3b3JkKHByaXYsIFJSU1IpKSAgfCBSQVRFX0FMTF9PRkRNX0FHIHwgUkFURV9BTExfQ0NLOwotCXdyaXRlX25pY19kd29yZChwcml2LCBSUlNSLCB1bFJlZ1JlYWQpOwotCXdyaXRlX25pY19kd29yZChwcml2LCBSQVRSMCs0KjcsIChSQVRFX0FMTF9PRkRNX0FHIHwgUkFURV9BTExfQ0NLKSk7Ci0KLQkvLzJTZXQgQWNrVGltZW91dAotCS8vIFRPRE86IChpdCB2YWx1ZSBpcyBvbmx5IGZvciBGUEdBIHZlcnNpb24pLiBuZWVkIHRvIGJlIGNoYW5nZWQhITIwMDYuMTIuMTgsIGJ5IEVtaWx5Ci0Jd3JpdGVfbmljX2J5dGUocHJpdiwgQUNLX1RJTUVPVVQsIDB4MzApOwotCi0JaWYocHJpdi0+UmVzZXRQcm9ncmVzcyA9PSBSRVNFVF9UWVBFX05PUkVTRVQpCi0JcnRsODE5Ml9TZXRXaXJlbGVzc01vZGUocHJpdi0+aWVlZTgwMjExLCBwcml2LT5pZWVlODAyMTEtPm1vZGUpOwotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLyBTZXQgdXAgc2VjdXJpdHkgcmVsYXRlZC4gMDcwMTA2LCBieSByY25qa286Ci0JLy8gMS4gQ2xlYXIgYWxsIEgvVyBrZXlzLgotCS8vIDIuIEVuYWJsZSBIL1cgZW5jcnlwdGlvbi9kZWNyeXB0aW9uLgotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQlDYW1SZXNldEFsbEVudHJ5KHByaXYpOwotCXsKLQkJdTggU0VDUl92YWx1ZSA9IDB4MDsKLQkJU0VDUl92YWx1ZSB8PSBTQ1JfVHhFbmNFbmFibGU7Ci0JCVNFQ1JfdmFsdWUgfD0gU0NSX1J4RGVjRW5hYmxlOwotCQlTRUNSX3ZhbHVlIHw9IFNDUl9Ob1NLTUM7Ci0JCXdyaXRlX25pY19ieXRlKHByaXYsIFNFQ1IsIFNFQ1JfdmFsdWUpOwotCX0KLQkvLzNCZWFjb24gcmVsYXRlZAotCXdyaXRlX25pY193b3JkKHByaXYsIEFUSU1XTkQsIDIpOwotCXdyaXRlX25pY193b3JkKHByaXYsIEJDTl9JTlRFUlZBTCwgMTAwKTsKLQlmb3IgKGk9MDsgaTxRT1NfUVVFVUVfTlVNOyBpKyspCi0JCXdyaXRlX25pY19kd29yZChwcml2LCBXRENBUEFSQV9BRERbaV0sIDB4MDA1ZTQzMzIpOwotCS8vCi0JLy8gU3dpdGNoaW5nIHJlZ3VsYXRvciBjb250cm9sbGVyOiBUaGlzIGlzIHNldCB0ZW1wb3JhcmlseS4KLQkvLyBJdCdzIG5vdCBzdXJlIGlmIHRoaXMgY2FuIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLQkvLyBQSiBhZHZpc2VkIHRvIGxlYXZlIGl0IGJ5IGRlZmF1bHQuCi0JLy8KLQl3cml0ZV9uaWNfYnl0ZShwcml2LCAweGJlLCAweGMwKTsKLQotCS8vMj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkvLyBTZXQgUEhZIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBkZWZpbmVkIGluIE1BQyByZWdpc3RlciBiYW5rCi0JLy8yPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCXJ0bDgxOTJfcGh5X2NvbmZpZ21hYyhwcml2KTsKLQotCWlmIChwcml2LT5jYXJkXzgxOTJfdmVyc2lvbiA+ICh1OCkgVkVSU0lPTl84MTkwX0JEKSB7Ci0JCXJ0bDgxOTJfcGh5X2dldFR4UG93ZXIocHJpdik7Ci0JCXJ0bDgxOTJfcGh5X3NldFR4UG93ZXIocHJpdiwgcHJpdi0+Y2hhbik7Ci0JfQotCi0JLy9pZiBEIG9yIEMgY3V0Ci0JCXRtcHZhbHVlID0gcmVhZF9uaWNfYnl0ZShwcml2LCBJQ19WRVJSU0lPTik7Ci0JCXByaXYtPklDX0N1dCA9IHRtcHZhbHVlOwotCQlSVF9UUkFDRShDT01QX0lOSVQsICJwcml2LT5JQ19DdXQgPSAweCV4XG4iLCBwcml2LT5JQ19DdXQpOwotCQlpZihwcml2LT5JQ19DdXQgPj0gSUNfVmVyc2lvbkN1dF9EKQotCQl7Ci0JCQkvL3BIYWxEYXRhLT5iRGN1dCA9IFRSVUU7Ci0JCQlpZihwcml2LT5JQ19DdXQgPT0gSUNfVmVyc2lvbkN1dF9EKQotCQkJCVJUX1RSQUNFKENPTVBfSU5JVCwgIkQtY3V0XG4iKTsKLQkJCWlmKHByaXYtPklDX0N1dCA9PSBJQ19WZXJzaW9uQ3V0X0UpCi0JCQl7Ci0JCQkJUlRfVFJBQ0UoQ09NUF9JTklULCAiRS1jdXRcbiIpOwotCQkJCS8vIEhXIFNEIHN1Z2dlc3QgdGhhdCB3ZSBzaG91bGQgbm90IHdpcnRlIHRoaXMgcmVnaXN0ZXIgdG9vIG9mdGVuLCBzbyBkcml2ZXIKLQkJCQkvLyBzaG91bGQgcmVhZGJhY2sgdGhpcyByZWdpc3Rlci4gVGhpcyByZWdpc3RlciB3aWxsIGJlIG1vZGlmaWVkIG9ubHkgd2hlbgotCQkJCS8vIHBvd2VyIG9uIHJlc2V0Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQkvL3BIYWxEYXRhLT5iRGN1dCA9IEZBTFNFOwotCQkJUlRfVFJBQ0UoQ09NUF9JTklULCAiQmVmb3JlIEMtY3V0XG4iKTsKLQkJfQotCi0JLy9GaXJtd2FyZSBkb3dubG9hZAotCVJUX1RSQUNFKENPTVBfSU5JVCwgIkxvYWQgRmlybXdhcmUhXG4iKTsKLQliZmlybXdhcmVvayA9IGluaXRfZmlybXdhcmUocHJpdik7Ci0JaWYoYmZpcm13YXJlb2sgIT0gdHJ1ZSkgewotCQlydFN0YXR1cyA9IFJUX1NUQVRVU19GQUlMVVJFOwotCQlyZXR1cm4gcnRTdGF0dXM7Ci0JfQotCVJUX1RSQUNFKENPTVBfSU5JVCwgIkxvYWQgRmlybXdhcmUgZmluaXNoZWQhXG4iKTsKLQotCS8vUkYgY29uZmlnCi0JaWYocHJpdi0+UmVzZXRQcm9ncmVzcyA9PSBSRVNFVF9UWVBFX05PUkVTRVQpCi0JewotCVJUX1RSQUNFKENPTVBfSU5JVCwgIlJGIENvbmZpZyBTdGFydGVkIVxuIik7Ci0JcnRTdGF0dXMgPSBydGw4MTkyX3BoeV9SRkNvbmZpZyhwcml2KTsKLQlpZihydFN0YXR1cyAhPSBSVF9TVEFUVVNfU1VDQ0VTUykKLQl7Ci0JCVJUX1RSQUNFKENPTVBfRVJSLCAiUkYgQ29uZmlnIGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gcnRTdGF0dXM7Ci0JfQotCVJUX1RSQUNFKENPTVBfSU5JVCwgIlJGIENvbmZpZyBGaW5pc2hlZCFcbiIpOwotCX0KLQlydGw4MTkyX3BoeV91cGRhdGVJbml0R2Fpbihwcml2KTsKLQotCS8qLS0tLSBTZXQgQ0NLIGFuZCBPRkRNIEJsb2NrICJPTiItLS0tKi8KLQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJGUEdBMF9SRk1PRCwgYkNDS0VuLCAweDEpOwotCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgckZQR0EwX1JGTU9ELCBiT0ZETUVuLCAweDEpOwotCi0JLy9FbmFibGUgTGVkCi0Jd3JpdGVfbmljX2J5dGUocHJpdiwgMHg4NywgMHgwKTsKLQotCS8vMj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQkvLyBSRiBQb3dlciBTYXZlCi0JLy8yPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotI2lmZGVmIEVOQUJMRV9JUFMKLQotewotCWlmKHByaXYtPlJmT2ZmUmVhc29uID4gUkZfQ0hBTkdFX0JZX1BTKQotCXsgLy8gSC9XIG9yIFMvVyBSRiBPRkYgYmVmb3JlIHNsZWVwLgotCQlSVF9UUkFDRSgoQ09NUF9JTklUfENPTVBfUkZ8Q09NUF9QT1dFUiksICIlcygpOiBUdXJuIG9mZiBSRiBmb3IgUmZPZmZSZWFzb24oJWQpXG4iLCBfX0ZVTkNUSU9OX18scHJpdi0+UmZPZmZSZWFzb24pOwotCQlNZ250QWN0U2V0X1JGX1N0YXRlKHByaXYsIGVSZk9mZiwgcHJpdi0+UmZPZmZSZWFzb24pOwotCX0KLQllbHNlIGlmKHByaXYtPlJmT2ZmUmVhc29uID49IFJGX0NIQU5HRV9CWV9JUFMpCi0JeyAvLyBIL1cgb3IgUy9XIFJGIE9GRiBiZWZvcmUgc2xlZXAuCi0JCVJUX1RSQUNFKChDT01QX0lOSVR8Q09NUF9SRnxDT01QX1BPV0VSKSwgIiVzKCk6IFR1cm4gb2ZmIFJGIGZvciBSZk9mZlJlYXNvbiglZClcbiIsICBfX0ZVTkNUSU9OX18sIHByaXYtPlJmT2ZmUmVhc29uKTsKLQkJTWdudEFjdFNldF9SRl9TdGF0ZShwcml2LCBlUmZPZmYsIHByaXYtPlJmT2ZmUmVhc29uKTsKLQl9Ci0JZWxzZQotCXsKLQkJUlRfVFJBQ0UoKENPTVBfSU5JVHxDT01QX1JGfENPTVBfUE9XRVIpLCAiJXMoKTogUkYtT04gXG4iLF9fRlVOQ1RJT05fXyk7Ci0JCXByaXYtPmVSRlBvd2VyU3RhdGUgPSBlUmZPbjsKLQkJcHJpdi0+UmZPZmZSZWFzb24gPSAwOwotCX0KLX0KLSNlbmRpZgotCS8vIFdlIGNhbiBmb3JjZSBmaXJtd2FyZSB0byBkbyBSRi1SL1cKLQlpZihwcml2LT5pZWVlODAyMTEtPkZ3UldSRikKLQkJcHJpdi0+UmZfTW9kZSA9IFJGX09QX0J5X0ZXOwotCWVsc2UKLQkJcHJpdi0+UmZfTW9kZSA9IFJGX09QX0J5X1NXXzN3aXJlOwotCi0JaWYocHJpdi0+UmVzZXRQcm9ncmVzcyA9PSBSRVNFVF9UWVBFX05PUkVTRVQpCi0JewotCQlkbV9pbml0aWFsaXplX3R4cG93ZXJfdHJhY2tpbmcocHJpdik7Ci0KLQkJaWYocHJpdi0+SUNfQ3V0ID49IElDX1ZlcnNpb25DdXRfRCkKLQkJewotCQkJdG1wUmVnQSA9IHJ0bDgxOTJfUXVlcnlCQlJlZyhwcml2LCByT0ZETTBfWEFUeElRSW1iYWxhbmNlLCBiTWFza0RXb3JkKTsKLQkJCXRtcFJlZ0MgPSBydGw4MTkyX1F1ZXJ5QkJSZWcocHJpdiwgck9GRE0wX1hDVHhJUUltYmFsYW5jZSwgYk1hc2tEV29yZCk7Ci0JCQlmb3IoaSA9IDA7IGk8VHhCQkdhaW5UYWJsZUxlbmd0aDsgaSsrKQotCQkJewotCQkJCWlmKHRtcFJlZ0EgPT0gcHJpdi0+dHhiYmdhaW5fdGFibGVbaV0udHhiYmdhaW5fdmFsdWUpCi0JCQkJewotCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXg9ICh1OClpOwotCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbD0gKHU4KWk7Ci0JCQkJCXByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdfZGVmYXVsdCA9IHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCVRlbXBDQ2sgPSBydGw4MTkyX1F1ZXJ5QkJSZWcocHJpdiwgckNDSzBfVHhGaWx0ZXIxLCBiTWFza0J5dGUyKTsKLQotCQlmb3IoaT0wIDsgaTxDQ0tUeEJCR2FpblRhYmxlTGVuZ3RoIDsgaSsrKQotCQl7Ci0JCQlpZihUZW1wQ0NrID09IHByaXYtPmNja190eGJiZ2Fpbl90YWJsZVtpXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0pCi0JCQl7Ci0JCQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl8yME1kZWZhdWx0ID0odTgpIGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl80ME1kZWZhdWx0ID0gMDsKLQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlID0gMDsKLQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA9IHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fMjBNZGVmYXVsdDsKLQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfaW5pdGlhbCA9ICVkXG4iLCBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXgpOwotCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsX19pbml0aWFsID0gJWRcbiIsIHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsKTsKLQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2VfaW5pdGlhbCA9ICVkXG4iLCBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UpOwotCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25faW5pdGlhbCA9ICVkXG4iLCBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKTsKLQkJCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nID0gRkFMU0U7Ly9URU1QTFkgRElTQUJMRQotCQl9Ci0JfQotCi0JcnRsODE5Ml9pcnFfZW5hYmxlKHByaXYpOwotCXByaXYtPmJlaW5nX2luaXRfYWRhcHRlciA9IGZhbHNlOwotCXJldHVybiBydFN0YXR1czsKLQotfQotCi1zdGF0aWMgdm9pZCBydGw4MTkyX3ByZXBhcmVfYmVhY29uKHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2KikgYXJnOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JY2JfZGVzYyAqdGNiX2Rlc2M7Ci0KLQlza2IgPSBpZWVlODAyMTFfZ2V0X2JlYWNvbihwcml2LT5pZWVlODAyMTEpOwotCXRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiLT5jYiArIDgpOwotCS8qIHByZXBhcmUgbWlzYyBpbmZvIGZvciB0aGUgYmVhY29uIHhtaXQgKi8KLQl0Y2JfZGVzYy0+cXVldWVfaW5kZXggPSBCRUFDT05fUVVFVUU7Ci0JLyogSUJTUyBkb2VzIG5vdCBzdXBwb3J0IEhUIHlldCwgdXNlIDFNIGRlZmF1bHRseSAqLwotCXRjYl9kZXNjLT5kYXRhX3JhdGUgPSAyOwotCXRjYl9kZXNjLT5SQVRSSW5kZXggPSA3OwotCXRjYl9kZXNjLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrID0gMTsKLQl0Y2JfZGVzYy0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlID0gMTsKLQotCXNrYl9wdXNoKHNrYiwgcHJpdi0+aWVlZTgwMjExLT50eF9oZWFkcm9vbSk7Ci0JaWYoc2tiKXsKLQkJcnRsODE5Ml90eChwcml2LCBza2IpOwotCX0KLX0KLQotCi0vKgotICogY29uZmlndXJlIHJlZ2lzdGVycyBmb3IgYmVhY29uIHR4IGFuZCBlbmFibGVzIGl0IHZpYQotICogcnRsODE5Ml9iZWFjb25fdHhfZW5hYmxlKCkuIHJ0bDgxOTJfYmVhY29uX3R4X2Rpc2FibGUoKSBtaWdodAotICogYmUgdXNlZCB0byBzdG9wIGJlYWNvbiB0cmFuc21pc3Npb24KLSAqLwotc3RhdGljIHZvaWQgcnRsODE5Ml9zdGFydF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU4MDIxMSkKLXsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGllZWU4MDIxMS0+ZGV2KTsKLQlzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgKm5ldCA9ICZwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yazsKLQl1MTYgQmNuVGltZUNmZyA9IDA7Ci0gICAgICAgIHUxNiBCY25DVyA9IDY7Ci0gICAgICAgIHUxNiBCY25JRlMgPSAweGY7Ci0KLQlETUVTRygiRW5hYmxpbmcgYmVhY29uIFRYIik7Ci0JcnRsODE5Ml9pcnFfZGlzYWJsZShwcml2KTsKLQkvL3J0bDgxOTJfYmVhY29uX3R4X2VuYWJsZShkZXYpOwotCi0JLyogQVRJTSB3aW5kb3cgKi8KLQl3cml0ZV9uaWNfd29yZChwcml2LCBBVElNV05ELCAyKTsKLQotCS8qIEJlYWNvbiBpbnRlcnZhbCAoaW4gdW5pdCBvZiBUVSkgKi8KLQl3cml0ZV9uaWNfd29yZChwcml2LCBCQ05fSU5URVJWQUwsIG5ldC0+YmVhY29uX2ludGVydmFsKTsKLQotCS8qCi0JICogRHJ2RXJseUludCAoaW4gdW5pdCBvZiBUVSkuCi0JICogKFRpbWUgdG8gc2VuZCBpbnRlcnJ1cHQgdG8gbm90aWZ5IGRyaXZlciB0byBjCi0JICogaGFuZ2UgYmVhY29uIGNvbnRlbnQpCi0JICogKi8KLQl3cml0ZV9uaWNfd29yZChwcml2LCBCQ05fRFJWX0VBUkxZX0lOVCwgMTApOwotCi0JLyoKLQkgKiBCY25ETUFUSU0oaW4gdW5pdCBvZiB1cykuCi0JICogSW5kaWNhdGVzIHRoZSB0aW1lIGJlZm9yZSBUQlRUIHRvIHBlcmZvcm0gYmVhY29uIHF1ZXVlIERNQQotCSAqICovCi0Jd3JpdGVfbmljX3dvcmQocHJpdiwgQkNOX0RNQVRJTUUsIDI1Nik7Ci0KLQkvKgotCSAqIEZvcmNlIGJlYWNvbiBmcmFtZSB0cmFuc21pc3Npb24gZXZlbiBhZnRlciByZWNlaXZpbmcKLQkgKiBiZWFjb24gZnJhbWUgZnJvbSBvdGhlciBhZCBob2MgU1RBCi0JICogKi8KLQl3cml0ZV9uaWNfYnl0ZShwcml2LCBCQ05fRVJSX1RIUkVTSCwgMTAwKTsKLQotCS8qIFNldCBDVyBhbmQgSUZTICovCi0JQmNuVGltZUNmZyB8PSBCY25DVzw8QkNOX1RDRkdfQ1dfU0hJRlQ7Ci0JQmNuVGltZUNmZyB8PSBCY25JRlM8PEJDTl9UQ0ZHX0lGUzsKLQl3cml0ZV9uaWNfd29yZChwcml2LCBCQ05fVENGRywgQmNuVGltZUNmZyk7Ci0KLQotCS8qIGVuYWJsZSB0aGUgaW50ZXJydXB0IGZvciBhZC1ob2MgcHJvY2VzcyAqLwotCXJ0bDgxOTJfaXJxX2VuYWJsZShwcml2KTsKLX0KLQotc3RhdGljIGJvb2wgSGFsUnhDaGVja1N0dWNrODE5MFBjaShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQl1MTYgUmVnUnhDb3VudGVyID0gcmVhZF9uaWNfd29yZChwcml2LCAweDEzMCk7Ci0JYm9vbAkJCQliU3R1Y2sgPSBGQUxTRTsKLQotCVJUX1RSQUNFKENPTVBfUkVTRVQsIiVzKCk6IFJlZ1J4Q291bnRlciBpcyAlZCxSeENvdW50ZXIgaXMgJWRcbiIsX19GVU5DVElPTl9fLFJlZ1J4Q291bnRlcixwcml2LT5SeENvdW50ZXIpOwotCS8vIElmIHJzc2kgaXMgc21hbGwsIHdlIHNob3VsZCBjaGVjayByeCBmb3IgbG9uZyB0aW1lIGJlY2F1c2Ugb2YgYmFkIHJ4LgotCS8vIG9yIG1heWJlIGl0IHdpbGwgY29udGludW91cyBzaWxlbnQgcmVzZXQgZXZlcnkgMiBzZWNvbmRzLgotCXByaXYtPnJ4X2Noa19jbnQrKzsKLQlpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IChSYXRlQWRhcHRpdmVUSF9IaWdoKzUpKQotCXsKLQkJcHJpdi0+cnhfY2hrX2NudCA9IDA7CS8qIGhpZ2ggcnNzaSwgY2hlY2sgcnggc3R1Y2sgcmlnaHQgbm93LiAqLwotCX0KLQllbHNlIGlmKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPCAoUmF0ZUFkYXB0aXZlVEhfSGlnaCs1KSAmJgotCQkoKHByaXYtPkN1cnJlbnRDaGFubmVsQlchPUhUX0NIQU5ORUxfV0lEVEhfMjAmJnByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGI+PVJhdGVBZGFwdGl2ZVRIX0xvd180ME0pIHx8Ci0JCShwcml2LT5DdXJyZW50Q2hhbm5lbEJXPT1IVF9DSEFOTkVMX1dJRFRIXzIwJiZwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiPj1SYXRlQWRhcHRpdmVUSF9Mb3dfMjBNKSkgKQotCi0JewotCQlpZihwcml2LT5yeF9jaGtfY250IDwgMikKLQkJewotCQkJcmV0dXJuIGJTdHVjazsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXByaXYtPnJ4X2Noa19jbnQgPSAwOwotCQl9Ci0JfQotCWVsc2UgaWYoKChwcml2LT5DdXJyZW50Q2hhbm5lbEJXIT1IVF9DSEFOTkVMX1dJRFRIXzIwJiZwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiPFJhdGVBZGFwdGl2ZVRIX0xvd180ME0pIHx8Ci0JCShwcml2LT5DdXJyZW50Q2hhbm5lbEJXPT1IVF9DSEFOTkVMX1dJRFRIXzIwJiZwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiPFJhdGVBZGFwdGl2ZVRIX0xvd18yME0pKSAmJgotCQlwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IFZlcnlMb3dSU1NJKQotCXsKLQkJaWYocHJpdi0+cnhfY2hrX2NudCA8IDQpCi0JCXsKLQkJCXJldHVybiBiU3R1Y2s7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlwcml2LT5yeF9jaGtfY250ID0gMDsKLQkJfQotCX0KLQllbHNlCi0JewotCQlpZihwcml2LT5yeF9jaGtfY250IDwgOCkKLQkJewotCQkJcmV0dXJuIGJTdHVjazsKLQkJfQotCQllbHNlCi0JCXsKLQkJCXByaXYtPnJ4X2Noa19jbnQgPSAwOwotCQl9Ci0JfQotCWlmKHByaXYtPlJ4Q291bnRlcj09UmVnUnhDb3VudGVyKQotCQliU3R1Y2sgPSBUUlVFOwotCi0JcHJpdi0+UnhDb3VudGVyID0gUmVnUnhDb3VudGVyOwotCi0JcmV0dXJuIGJTdHVjazsKLX0KLQotc3RhdGljIFJFU0VUX1RZUEUgUnhDaGVja1N0dWNrKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCi0JaWYoSGFsUnhDaGVja1N0dWNrODE5MFBjaShwcml2KSkKLQl7Ci0JCVJUX1RSQUNFKENPTVBfUkVTRVQsICJSeFN0dWNrIENvbmRpdGlvblxuIik7Ci0JCXJldHVybiBSRVNFVF9UWVBFX1NJTEVOVDsKLQl9Ci0KLQlyZXR1cm4gUkVTRVRfVFlQRV9OT1JFU0VUOwotfQotCi1zdGF0aWMgUkVTRVRfVFlQRSBydGw4MTl4X2NoZWNrX3Jlc2V0KHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCVJFU0VUX1RZUEUgUnhSZXNldFR5cGUgPSBSRVNFVF9UWVBFX05PUkVTRVQ7Ci0JUlRfUkZfUE9XRVJfU1RBVEUgcmZTdGF0ZTsKLQotCXJmU3RhdGUgPSBwcml2LT5lUkZQb3dlclN0YXRlOwotCi0JaWYgKHJmU3RhdGUgIT0gZVJmT2ZmICYmIChwcml2LT5pZWVlODAyMTEtPml3X21vZGUgIT0gSVdfTU9ERV9BREhPQykpIHsKLQkJLyoKLQkJICogSWYgZHJpdmVyIGlzIGluIHRoZSBzdGF0dXMgb2YgZmlybXdhcmUgZG93bmxvYWQgZmFpbHVyZSwKLQkJICogZHJpdmVyIHNraXBzIFJGIGluaXRpYWxpemF0aW9uIGFuZCBSRiBpcyBpbiB0dXJuZWQgb2ZmIHN0YXRlLgotCQkgKiBEcml2ZXIgc2hvdWxkIGNoZWNrIHdoZXRoZXIgUnggc3R1Y2sgYW5kIGRvIHNpbGVudCByZXNldC4gQW5kCi0JCSAqIGlmIGRyaXZlciBpcyBpbiBmaXJtd2FyZSBkb3dubG9hZCBmYWlsdXJlIHN0YXR1cywgZHJpdmVyCi0JCSAqIHNob3VsZCBpbml0aWFsaXplIFJGIGluIHRoZSBmb2xsb3dpbmcgc2lsZW50IHJlc2V0IHByb2NlZHVyZQotCQkgKgotCQkgKiBEcml2ZXIgc2hvdWxkIG5vdCBjaGVjayBSWCBzdHVjayBpbiBJQlNTIG1vZGUgYmVjYXVzZSBpdCBpcwotCQkgKiByZXF1aXJlZCB0byBzZXQgQ2hlY2sgQlNTSUQgaW4gb3JkZXIgdG8gc2VuZCBiZWFjb24sIGhvd2V2ZXIsCi0JCSAqIGlmIGNoZWNrIEJTU0lEIGlzIHNldCwgU1RBIGNhbm5vdCBoZWFyIGFueSBwYWNrZXQgYSBhbGwuCi0JCSAqLwotCQlSeFJlc2V0VHlwZSA9IFJ4Q2hlY2tTdHVjayhwcml2KTsKLQl9Ci0KLQlSVF9UUkFDRShDT01QX1JFU0VULCAiJXMoKTogIFJ4UmVzZXRUeXBlIGlzICVkXG4iLCBfX0ZVTkNUSU9OX18sIFJ4UmVzZXRUeXBlKTsKLQotCXJldHVybiBSeFJlc2V0VHlwZTsKLX0KLQotI2lmZGVmIEVOQUJMRV9JUFMKLXN0YXRpYyB2b2lkIEluYWN0aXZlUHNXb3JrSXRlbUNhbGxiYWNrKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCVBSVF9QT1dFUl9TQVZFX0NPTlRST0wgcFBTQyA9ICZwcml2LT5Qb3dlclNhdmVDb250cm9sOwotCi0JUlRfVFJBQ0UoQ09NUF9QT1dFUiwgIkluYWN0aXZlUHNXb3JrSXRlbUNhbGxiYWNrKCkgLS0tLS0tLS0tPlxuIik7Ci0JLy8KLQkvLyBUaGlzIGZsYWcgImJTd1JmUHJvY2Vzc2luZyIsIGluZGljYXRlcyB0aGUgc3RhdHVzIG9mIElQUyBwcm9jZWR1cmUsIHNob3VsZCBiZSBzZXQgaWYgdGhlIElQUyB3b3JraXRlbQotCS8vIGlzIHJlYWxseSBzY2hlZHVsZWQuCi0JLy8gVGhlIG9sZCBjb2RlLCBzZXRzIHRoaXMgZmxhZyBiZWZvcmUgc2NoZWR1bGluZyB0aGUgSVBTIHdvcmtpdGVtIGFuZCBob3dldmVyLCBhdCB0aGUgc2FtZSB0aW1lIHRoZQotCS8vIHByZXZpb3VzIElQUyB3b3JraXRlbSBkaWQgbm90IGVuZCB5ZXQsIGZhaWxzIHRvIHNjaGVkdWxlIHRoZSBjdXJyZW50IHdvcmtpdGVtLiBUaHVzLCBiU3dSZlByb2Nlc3NpbmcKLQkvLyBibG9ja3MgdGhlIElQUyBwcm9jZWR1cmUgb2Ygc3dpdGNoaW5nIFJGLgotCS8vIEJ5IEJydWNlLCAyMDA3LTEyLTI1LgotCS8vCi0JcFBTQy0+YlN3UmZQcm9jZXNzaW5nID0gVFJVRTsKLQotCVJUX1RSQUNFKENPTVBfUkYsICJJbmFjdGl2ZVBzV29ya0l0ZW1DYWxsYmFjaygpOiBTZXQgUkYgdG8gJXMuXG4iLAotCQkJcFBTQy0+ZUluYWN0aXZlUG93ZXJTdGF0ZSA9PSBlUmZPZmY/Ik9GRiI6Ik9OIik7Ci0KLQotCU1nbnRBY3RTZXRfUkZfU3RhdGUocHJpdiwgcFBTQy0+ZUluYWN0aXZlUG93ZXJTdGF0ZSwgUkZfQ0hBTkdFX0JZX0lQUyk7Ci0KLQkvLwotCS8vIFRvIHNvbHZlIENBTSB2YWx1ZXMgbWlzcyBpbiBSRiBPRkYsIHJld3JpdGUgQ0FNIHZhbHVlcyBhZnRlciBSRiBPTi4gQnkgQnJ1Y2UsIDIwMDctMDktMjAuCi0JLy8KLQlwUFNDLT5iU3dSZlByb2Nlc3NpbmcgPSBGQUxTRTsKLQlSVF9UUkFDRShDT01QX1BPV0VSLCAiSW5hY3RpdmVQc1dvcmtJdGVtQ2FsbGJhY2soKSA8LS0tLS0tLS0tXG4iKTsKLX0KLQotI2lmZGVmIEVOQUJMRV9MUFMKLS8qIENoYW5nZSBjdXJyZW50IGFuZCBkZWZhdWx0IHByZWFtYmxlIG1vZGUuICovCi1ib29sIE1nbnRBY3RTZXRfODAyXzExX1Bvd2VyU2F2ZU1vZGUoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHU4IHJ0UHNNb2RlKQotewotCi0JLy8gQ3VycmVudGx5LCB3ZSBkbyBub3QgY2hhbmdlIHBvd2VyIHNhdmUgbW9kZSBvbiBJQlNTIG1vZGUuCi0JaWYocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCi0JewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8KLQkvLyA8UkpfTk9URT4gSWYgd2UgbWFrZSBIVyB0byBmaWxsIHVwIHRoZSBQd3JNZ3QgYml0IGZvciB1cywKLQkvLyBzb21lIEFQIHdpbGwgbm90IHJlc3BvbnNlIHRvIG91ciBtZ250IGZyYW1lcyB3aXRoIFB3ck1ndCBiaXQgc2V0LAotCS8vIGUuZy4gY2Fubm90IGFzc29jaWF0ZSB0aGUgQVAuCi0JLy8gU28gSSBjb21tZW50ZWQgb3V0IGl0LiAyMDA1LjAyLjE2LCBieSByY25qa28uCi0JLy8KLS8vCS8vIENoYW5nZSBkZXZpY2UncyBwb3dlciBzYXZlIG1vZGUuCi0vLwlBZGFwdGVyLT5IYWxGdW5jLlNldFBTTW9kZUhhbmRsZXIoIEFkYXB0ZXIsIHJ0UHNNb2RlICk7Ci0KLQkvLyBVcGRhdGUgcG93ZXIgc2F2ZSBtb2RlIGNvbmZpZ3VyZWQuCi0JLy9SVF9UUkFDRShDT01QX0xQUywiJXMoKTogc2V0IGllZWUtPnBzID0gJXhcbiIsX19GVU5DVElPTl9fLHJ0UHNNb2RlKTsKLQlpZighcHJpdi0+cHNfZm9yY2UpIHsKLQkJcHJpdi0+aWVlZTgwMjExLT5wcyA9IHJ0UHNNb2RlOwotCX0KLQotCS8vIEF3YWtlIGltbWVkaWF0ZWx5Ci0JaWYocHJpdi0+aWVlZTgwMjExLT5zdGFfc2xlZXAgIT0gMCAmJiBydFBzTW9kZSA9PSBJRUVFODAyMTFfUFNfRElTQUJMRUQpCi0JewotCQkvLyBOb3RpZnkgdGhlIEFQIHdlIGF3a2UuCi0JCXJ0bDgxOTJfaHdfd2FrZXVwKHByaXYtPmllZWU4MDIxMSk7Ci0JCXByaXYtPmllZWU4MDIxMS0+c3RhX3NsZWVwID0gMDsKLQotICAgICAgICAgICAgICAgIHNwaW5fbG9jaygmcHJpdi0+aWVlZTgwMjExLT5tZ210X3R4X2xvY2spOwotCQlwcmludGsoIkxQUyBsZWF2ZTogbm90aWZ5IEFQIHdlIGFyZSBhd2FrZWQgKysrKysrKysrKyBTZW5kTnVsbEZ1bmN0aW9uRGF0YVxuIik7Ci0JCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKHByaXYtPmllZWU4MDIxMSwgMCk7Ci0gICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soJnByaXYtPmllZWU4MDIxMS0+bWdtdF90eF9sb2NrKTsKLQl9Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotLyogRW50ZXIgdGhlIGxlaXN1cmUgcG93ZXIgc2F2ZSBtb2RlLiAqLwotdm9pZCBMZWlzdXJlUFNFbnRlcihzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTgwMjExKQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoaWVlZTgwMjExLT5kZXYpOwotCVBSVF9QT1dFUl9TQVZFX0NPTlRST0wgcFBTQyA9ICZwcml2LT5Qb3dlclNhdmVDb250cm9sOwotCi0JaWYoISgocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpICYmCi0JCShwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpKSB8fAotCQkocHJpdi0+aWVlZTgwMjExLT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHx8Ci0JCShwcml2LT5pZWVlODAyMTEtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpKQotCQlyZXR1cm47Ci0KLQlpZiAocFBTQy0+YkxlaXN1cmVQcykKLQl7Ci0JCS8vIElkbGUgZm9yIGEgd2hpbGUgaWYgd2UgY29ubmVjdCB0byBBUCBhIHdoaWxlIGFnby4KLQkJaWYocFBTQy0+THBzSWRsZUNvdW50ID49IFJUX0NIRUNLX0ZPUl9IQU5HX1BFUklPRCkgLy8gIDQgU2VjCi0JCXsKLQotCQkJaWYocHJpdi0+aWVlZTgwMjExLT5wcyA9PSBJRUVFODAyMTFfUFNfRElTQUJMRUQpCi0JCQl7Ci0JCQkJTWdudEFjdFNldF84MDJfMTFfUG93ZXJTYXZlTW9kZShwcml2LCBJRUVFODAyMTFfUFNfTUJDQVNUfElFRUU4MDIxMV9QU19VTklDQVNUKTsKLQotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXBQU0MtPkxwc0lkbGVDb3VudCsrOwotCX0KLX0KLQotCi0vKiBMZWF2ZSBsZWlzdXJlIHBvd2VyIHNhdmUgbW9kZS4gKi8KLXZvaWQgTGVpc3VyZVBTTGVhdmUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU4MDIxMSkKLXsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGllZWU4MDIxMS0+ZGV2KTsKLQlQUlRfUE9XRVJfU0FWRV9DT05UUk9MIHBQU0MgPSAmcHJpdi0+UG93ZXJTYXZlQ29udHJvbDsKLQotCWlmIChwUFNDLT5iTGVpc3VyZVBzKQotCXsKLQkJaWYocHJpdi0+aWVlZTgwMjExLT5wcyAhPSBJRUVFODAyMTFfUFNfRElTQUJMRUQpCi0JCXsKLQkJCS8vIG1vdmUgdG8gbHBzX3dha2Vjb21wbGV0ZSgpCi0JCQlNZ250QWN0U2V0XzgwMl8xMV9Qb3dlclNhdmVNb2RlKHByaXYsIElFRUU4MDIxMV9QU19ESVNBQkxFRCk7Ci0KLQkJfQotCX0KLX0KLSNlbmRpZgotCi0KLS8qIEVudGVyIHRoZSBpbmFjdGl2ZSBwb3dlciBzYXZlIG1vZGUuIFJGIHdpbGwgYmUgb2ZmICovCi12b2lkIElQU0VudGVyKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCVBSVF9QT1dFUl9TQVZFX0NPTlRST0wgcFBTQyA9ICZwcml2LT5Qb3dlclNhdmVDb250cm9sOwotCVJUX1JGX1BPV0VSX1NUQVRFIAkJCXJ0U3RhdGU7Ci0KLQlpZiAocFBTQy0+YkluYWN0aXZlUHMpCi0JewotCQlydFN0YXRlID0gcHJpdi0+ZVJGUG93ZXJTdGF0ZTsKLQkJLy8KLQkJLy8gQWRkZWQgYnkgQnJ1Y2UsIDIwMDctMTItMjUuCi0JCS8vIERvIG5vdCBlbnRlciBJUFMgaW4gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCQkvLyAoMSkgUkYgaXMgYWxyZWFkeSBPRkYgb3IgU2xlZXAKLQkJLy8gKDIpIGJTd1JmUHJvY2Vzc2luZyAoaW5kaWNhdGVzIHRoZSBJUFMgaXMgc3RpbGwgdW5kZXIgZ29pbmcpCi0JCS8vICgzKSBDb25uZWN0dGVkIChvbmx5IGRpc2Nvbm5lY3RlZCBjYW4gdHJpZ2dlciBJUFMpCi0JCS8vICg0KSBJQlNTIChzZW5kIEJlYWNvbikKLQkJLy8gKDUpIEFQIG1vZGUgKHNlbmQgQmVhY29uKQotCQkvLwotCQlpZiAocnRTdGF0ZSA9PSBlUmZPbiAmJiAhcFBTQy0+YlN3UmZQcm9jZXNzaW5nCi0JCQkmJiAocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKSApCi0JCXsKLQkJCVJUX1RSQUNFKENPTVBfUkYsIklQU0VudGVyKCk6IFR1cm4gb2ZmIFJGLlxuIik7Ci0JCQlwUFNDLT5lSW5hY3RpdmVQb3dlclN0YXRlID0gZVJmT2ZmOwotLy8JCQlxdWV1ZV93b3JrKHByaXYtPnByaXZfd3EsJihwUFNDLT5JbmFjdGl2ZVBzV29ya0l0ZW0pKTsKLQkJCUluYWN0aXZlUHNXb3JrSXRlbUNhbGxiYWNrKHByaXYpOwotCQl9Ci0JfQotfQotCi0vLwotLy8JRGVzY3JpcHRpb246Ci0vLwkJTGVhdmUgdGhlIGluYWN0aXZlIHBvd2VyIHNhdmUgbW9kZSwgUkYgd2lsbCBiZSBvbi4KLS8vCTIwMDcuMDguMTcsIGJ5IHNoaWVuIGNoYW5nLgotLy8KLXZvaWQgSVBTTGVhdmUoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0JUFJUX1BPV0VSX1NBVkVfQ09OVFJPTCBwUFNDID0gJnByaXYtPlBvd2VyU2F2ZUNvbnRyb2w7Ci0JUlRfUkZfUE9XRVJfU1RBVEUgCXJ0U3RhdGU7Ci0KLQlpZiAocFBTQy0+YkluYWN0aXZlUHMpCi0JewotCQlydFN0YXRlID0gcHJpdi0+ZVJGUG93ZXJTdGF0ZTsKLQkJaWYgKHJ0U3RhdGUgIT0gZVJmT24gJiYgIXBQU0MtPmJTd1JmUHJvY2Vzc2luZyAmJiBwcml2LT5SZk9mZlJlYXNvbiA8PSBSRl9DSEFOR0VfQllfSVBTKQotCQl7Ci0JCQlSVF9UUkFDRShDT01QX1BPV0VSLCAiSVBTTGVhdmUoKTogVHVybiBvbiBSRi5cbiIpOwotCQkJcFBTQy0+ZUluYWN0aXZlUG93ZXJTdGF0ZSA9IGVSZk9uOwotCQkJSW5hY3RpdmVQc1dvcmtJdGVtQ2FsbGJhY2socHJpdik7Ci0JCX0KLQl9Ci19Ci0KLXZvaWQgSVBTTGVhdmVfd3Eoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBpcHNfbGVhdmVfd3EpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7Ci0KLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKWllZWU4MDIxMV9wcml2KGRldik7Ci0JZG93bigmcHJpdi0+aWVlZTgwMjExLT5pcHNfc2VtKTsKLQlJUFNMZWF2ZShwcml2KTsKLQl1cCgmcHJpdi0+aWVlZTgwMjExLT5pcHNfc2VtKTsKLX0KLQotdm9pZCBpZWVlODAyMTFfaXBzX2xlYXZlX3dxKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTEpCi17Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihpZWVlODAyMTEtPmRldik7Ci0JUlRfUkZfUE9XRVJfU1RBVEUJcnRTdGF0ZTsKLQlydFN0YXRlID0gcHJpdi0+ZVJGUG93ZXJTdGF0ZTsKLQotCWlmIChwcml2LT5Qb3dlclNhdmVDb250cm9sLmJJbmFjdGl2ZVBzKXsKLQkJaWYocnRTdGF0ZSA9PSBlUmZPZmYpewotCQkJaWYocHJpdi0+UmZPZmZSZWFzb24gPiBSRl9DSEFOR0VfQllfSVBTKQotCQkJewotCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiJXMoKTogUkYgaXMgT0ZGLlxuIixfX0ZVTkNUSU9OX18pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2V7Ci0JCQkJcHJpbnRrKCI9PT09PT09PT0+JXMoKTogSVBTTGVhdmVcbiIsX19GVU5DVElPTl9fKTsKLQkJCQlxdWV1ZV93b3JrKHByaXYtPmllZWU4MDIxMS0+d3EsJnByaXYtPmllZWU4MDIxMS0+aXBzX2xlYXZlX3dxKTsKLQkJCX0KLQkJfQotCX0KLX0KLS8vYWRkZWQgYnkgYW15IDA5MDMzMSBlbmQKLXZvaWQgaWVlZTgwMjExX2lwc19sZWF2ZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZTgwMjExKQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoaWVlZTgwMjExLT5kZXYpOwotCWRvd24oJmllZWU4MDIxMS0+aXBzX3NlbSk7Ci0JSVBTTGVhdmUocHJpdik7Ci0JdXAoJmllZWU4MDIxMS0+aXBzX3NlbSk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgcnRsODE5eF91cGRhdGVfcnhjb3VudHMoCi0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsCi0JdTMyKiBUb3RhbFJ4QmNuTnVtLAotCXUzMiogVG90YWxSeERhdGFOdW0KLSkKLXsKLQl1MTYgCQkJU2xvdEluZGV4OwotCXU4CQkJaTsKLQotCSpUb3RhbFJ4QmNuTnVtID0gMDsKLQkqVG90YWxSeERhdGFOdW0gPSAwOwotCi0JU2xvdEluZGV4ID0gKHByaXYtPmllZWU4MDIxMS0+TGlua0RldGVjdEluZm8uU2xvdEluZGV4KyspJShwcml2LT5pZWVlODAyMTEtPkxpbmtEZXRlY3RJbmZvLlNsb3ROdW0pOwotCXByaXYtPmllZWU4MDIxMS0+TGlua0RldGVjdEluZm8uUnhCY25OdW1bU2xvdEluZGV4XSA9IHByaXYtPmllZWU4MDIxMS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkJjbkluUGVyaW9kOwotCXByaXYtPmllZWU4MDIxMS0+TGlua0RldGVjdEluZm8uUnhEYXRhTnVtW1Nsb3RJbmRleF0gPSBwcml2LT5pZWVlODAyMTEtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZEYXRhSW5QZXJpb2Q7Ci0JZm9yKCBpPTA7IGk8cHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5TbG90TnVtOyBpKysgKXsKLQkJKlRvdGFsUnhCY25OdW0gKz0gcHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5SeEJjbk51bVtpXTsKLQkJKlRvdGFsUnhEYXRhTnVtICs9IHByaXYtPmllZWU4MDIxMS0+TGlua0RldGVjdEluZm8uUnhEYXRhTnVtW2ldOwotCX0KLX0KLQotCi1zdGF0aWMgdm9pZCBydGw4MTl4X3dhdGNoZG9nX3dxY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssc3RydWN0IGRlbGF5ZWRfd29yayx3b3JrKTsKLSAgICAgICBzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihkd29yayxzdHJ1Y3QgcjgxOTJfcHJpdix3YXRjaF9kb2dfd3EpOwotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlID0gcHJpdi0+aWVlZTgwMjExOwotCVJFU0VUX1RZUEUJUmVzZXRUeXBlID0gUkVTRVRfVFlQRV9OT1JFU0VUOwotCWJvb2wgYkJ1c3lUcmFmZmljID0gZmFsc2U7Ci0JYm9vbCBiRW50ZXJQUyA9IGZhbHNlOwotCi0JaWYgKCghcHJpdi0+dXApIHx8IHByaXYtPmJId1JhZGlvT2ZmKQotCQlyZXR1cm47Ci0KLQlpZighcHJpdi0+dXApCi0JCXJldHVybjsKLQloYWxfZG1fd2F0Y2hkb2cocHJpdik7Ci0jaWZkZWYgRU5BQkxFX0lQUwotCWlmKGllZWUtPmFjdHNjYW5uaW5nID09IGZhbHNlKXsKLQkJaWYoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgJiYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspICYmCi0JCSAgICAocHJpdi0+ZVJGUG93ZXJTdGF0ZSA9PSBlUmZPbikgJiYgIWllZWUtPmlzX3NldF9rZXkgJiYKLQkJICAgICghaWVlZS0+cHJvdG9fc3RvcHBwaW5nKSAmJiAhaWVlZS0+d3hfc2V0X2VuYyl7Ci0JCQlpZiAocHJpdi0+UG93ZXJTYXZlQ29udHJvbC5SZXR1cm5Qb2ludCA9PSBJUFNfQ0FMTEJBQ0tfTk9ORSl7Ci0JCQkJSVBTRW50ZXIocHJpdik7Ci0JCQl9Ci0JCX0KLQl9Ci0jZW5kaWYKLQl7Ly90byBnZXQgYnVzeSB0cmFmZmljIGNvbmRpdGlvbgotCQlpZihpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQotCQl7Ci0JCQlpZigJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUnhPa0luUGVyaW9kPiAxMDAgfHwKLQkJCQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1UeE9rSW5QZXJpb2Q+IDEwMCApIHsKLQkJCQliQnVzeVRyYWZmaWMgPSB0cnVlOwotCQkJfQotCi0jaWZkZWYgRU5BQkxFX0xQUwotCQkJLy9hZGRlZCBieSBhbXkgZm9yIExlaXN1cmUgUFMKLQkJCWlmKAkoKGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJ4VW5pY2FzdE9rSW5QZXJpb2QgKyBpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1UeE9rSW5QZXJpb2QpID4gOCApIHx8Ci0JCQkJKGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJ4VW5pY2FzdE9rSW5QZXJpb2QgPiAyKSApCi0JCQl7Ci0JCQkJYkVudGVyUFM9IGZhbHNlOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWJFbnRlclBTPSB0cnVlOwotCQkJfQotCi0JCQkvLyBMZWlzdXJlUFMgb25seSB3b3JrIGluIGluZnJhIG1vZGUuCi0JCQlpZihiRW50ZXJQUykKLQkJCXsKLQkJCQlMZWlzdXJlUFNFbnRlcihwcml2LT5pZWVlODAyMTEpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCUxlaXN1cmVQU0xlYXZlKHByaXYtPmllZWU4MDIxMSk7Ci0JCQl9Ci0jZW5kaWYKLQotCQl9Ci0JCWVsc2UKLQkJewotI2lmZGVmIEVOQUJMRV9MUFMKLQkJCUxlaXN1cmVQU0xlYXZlKHByaXYtPmllZWU4MDIxMSk7Ci0jZW5kaWYKLQkJfQotCi0JICAgICAgICBpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SeE9rSW5QZXJpb2QgPSAwOwotCSAgICAgICAgaWVlZS0+TGlua0RldGVjdEluZm8uTnVtVHhPa0luUGVyaW9kID0gMDsKLQkJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUnhVbmljYXN0T2tJblBlcmlvZCA9IDA7Ci0JCWllZWUtPkxpbmtEZXRlY3RJbmZvLmJCdXN5VHJhZmZpYyA9IGJCdXN5VHJhZmZpYzsKLQl9Ci0KLQotCS8vYWRkZWQgYnkgYW15IGZvciBBUCByb2FtaW5nCi0JCWlmKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQgJiYgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKQotCQl7Ci0JCQl1MzIJVG90YWxSeEJjbk51bSA9IDA7Ci0JCQl1MzIJVG90YWxSeERhdGFOdW0gPSAwOwotCi0JCQlydGw4MTl4X3VwZGF0ZV9yeGNvdW50cyhwcml2LCAmVG90YWxSeEJjbk51bSwgJlRvdGFsUnhEYXRhTnVtKTsKLQkJCWlmKChUb3RhbFJ4QmNuTnVtK1RvdGFsUnhEYXRhTnVtKSA9PSAwKQotCQkJewotCQkJCWlmIChwcml2LT5lUkZQb3dlclN0YXRlID09IGVSZk9mZikKLQkJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsIj09PT09PT09PiVzKClcbiIsX19GVU5DVElPTl9fKTsKLQkJCQlwcmludGsoIj09PT4lcygpOiBBUCBpcyBwb3dlciBvZmYsY29ubmVjdCBhbm90aGVyIG9uZVxuIixfX0ZVTkNUSU9OX18pOwotCQkJCS8vCQlEb3QxMWRfUmVzZXQoZGV2KTsKLQkJCQlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElORzsKLQkJCQlub3RpZnlfd3hfYXNzb2NfZXZlbnQocHJpdi0+aWVlZTgwMjExKTsKLQkJCQlSZW1vdmVQZWVyVFMocHJpdi0+aWVlZTgwMjExLHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkKTsKLQkJCQlpZWVlLT5pc19yb2FtaW5nID0gdHJ1ZTsKLQkJCQlpZWVlLT5pc19zZXRfa2V5ID0gZmFsc2U7Ci0JCQkJaWVlZS0+bGlua19jaGFuZ2UoaWVlZSk7Ci0JCQkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOwotCQkJfQotCQl9Ci0JICAgICAgaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkJjbkluUGVyaW9kPTA7Ci0gICAgICAgICAgICAgIGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZEYXRhSW5QZXJpb2Q9MDsKLQotCS8vY2hlY2sgaWYgcmVzZXQgdGhlIGRyaXZlcgotCWlmIChwcml2LT53YXRjaGRvZ19jaGVja19yZXNldF9jbnQrKyA+PSAzICYmICFpZWVlLT5pc19yb2FtaW5nICYmIAotCSAgICBwcml2LT53YXRjaGRvZ19sYXN0X3RpbWUgIT0gMSkKLQl7Ci0JCVJlc2V0VHlwZSA9IHJ0bDgxOXhfY2hlY2tfcmVzZXQocHJpdik7Ci0JCXByaXYtPndhdGNoZG9nX2NoZWNrX3Jlc2V0X2NudCA9IDM7Ci0JfQotCWlmKCFwcml2LT5iRGlzYWJsZU5vcm1hbFJlc2V0Q2hlY2sgJiYgUmVzZXRUeXBlID09IFJFU0VUX1RZUEVfTk9STUFMKQotCXsKLQkJcHJpdi0+UmVzZXRQcm9ncmVzcyA9IFJFU0VUX1RZUEVfTk9STUFMOwotCQlSVF9UUkFDRShDT01QX1JFU0VULCIlcygpOiBOT01BTCBSRVNFVFxuIixfX0ZVTkNUSU9OX18pOwotCQlyZXR1cm47Ci0JfQotCS8qIGRpc2FibGUgc2lsZW50IHJlc2V0IHRlbXBseSAyMDA4LjkuMTEqLwotCi0JaWYoICgocHJpdi0+Zm9yY2VfcmVzZXQpIHx8ICghcHJpdi0+YkRpc2FibGVOb3JtYWxSZXNldENoZWNrICYmIFJlc2V0VHlwZT09UkVTRVRfVFlQRV9TSUxFTlQpKSkgLy8gVGhpcyBpcyBjb250cm9sIGJ5IE9JRCBzZXQgaW4gUG9tZWxvCi0JewotCQlwcml2LT53YXRjaGRvZ19sYXN0X3RpbWUgPSAxOwotCX0KLQllbHNlCi0JCXByaXYtPndhdGNoZG9nX2xhc3RfdGltZSA9IDA7Ci0KLQlwcml2LT5mb3JjZV9yZXNldCA9IGZhbHNlOwotCXByaXYtPmJGb3JjZWRTaWxlbnRSZXNldCA9IGZhbHNlOwotCXByaXYtPmJSZXNldEluUHJvZ3Jlc3MgPSBmYWxzZTsKLQlSVF9UUkFDRShDT01QX1RSQUNFLCAiIDw9PVJ0VXNiQ2hlY2tGb3JIYW5nV29ya0l0ZW1DYWxsYmFjaygpXG4iKTsKLQotfQotCi12b2lkIHdhdGNoX2RvZ190aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKikgZGF0YTsKLQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+cHJpdl93cSwmcHJpdi0+d2F0Y2hfZG9nX3dxLDApOwotCW1vZF90aW1lcigmcHJpdi0+d2F0Y2hfZG9nX3RpbWVyLCBqaWZmaWVzICsgTVNFQ1MoSUVFRTgwMjExX1dBVENIX0RPR19USU1FKSk7Ci0KLX0KLQotc3RhdGljIGludCBfcnRsODE5Ml91cChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQlSVF9TVEFUVVMgaW5pdF9zdGF0dXMgPSBSVF9TVEFUVVNfU1VDQ0VTUzsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+aWVlZTgwMjExLT5kZXY7Ci0KLQlwcml2LT51cD0xOwotCXByaXYtPmllZWU4MDIxMS0+aWVlZV91cD0xOwotCXByaXYtPmJkaXNhYmxlX25pYyA9IGZhbHNlOyAgLy9ZSixhZGQsMDkxMTExCi0JUlRfVFJBQ0UoQ09NUF9JTklULCAiQnJpbmdpbmcgdXAgaWZhY2VcbiIpOwotCi0JaW5pdF9zdGF0dXMgPSBydGw4MTkyX2FkYXB0ZXJfc3RhcnQocHJpdik7Ci0JaWYoaW5pdF9zdGF0dXMgIT0gUlRfU1RBVFVTX1NVQ0NFU1MpCi0JewotCQlSVF9UUkFDRShDT01QX0VSUiwiRVJSISEhICVzKCk6IGluaXRpYWxpemF0aW9uIGlzIGZhaWxlZCFcbiIsX19GVU5DVElPTl9fKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlSVF9UUkFDRShDT01QX0lOSVQsICJzdGFydCBhZGFwdGVyIGZpbmlzaGVkXG4iKTsKLQotCWlmIChwcml2LT5lUkZQb3dlclN0YXRlICE9IGVSZk9uKQotCQlNZ250QWN0U2V0X1JGX1N0YXRlKHByaXYsIGVSZk9uLCBwcml2LT5SZk9mZlJlYXNvbik7Ci0KLQlpZihwcml2LT5pZWVlODAyMTEtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQpCi0JaWVlZTgwMjExX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2wocHJpdi0+aWVlZTgwMjExKTsKLQlpZWVlODAyMTFfcmVzZXRfcXVldWUocHJpdi0+aWVlZTgwMjExKTsKLQl3YXRjaF9kb2dfdGltZXJfY2FsbGJhY2soKHVuc2lnbmVkIGxvbmcpIHByaXYpOwotCWlmKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpCi0JCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7Ci0JZWxzZQotCQluZXRpZl93YWtlX3F1ZXVlKGRldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IHJ0bDgxOTJfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQlpbnQgcmV0OwotCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKLQlyZXQgPSBydGw4MTkyX3VwKGRldik7Ci0JdXAoJnByaXYtPnd4X3NlbSk7Ci0JcmV0dXJuIHJldDsKLQotfQotCi0KLWludCBydGw4MTkyX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCi0JaWYgKHByaXYtPnVwID09IDEpIHJldHVybiAtMTsKLQotCXJldHVybiBfcnRsODE5Ml91cChwcml2KTsKLX0KLQotCi1zdGF0aWMgaW50IHJ0bDgxOTJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0JaW50IHJldDsKLQotCWRvd24oJnByaXYtPnd4X3NlbSk7Ci0KLQlyZXQgPSBydGw4MTkyX2Rvd24oZGV2KTsKLQotCXVwKCZwcml2LT53eF9zZW0pOwotCi0JcmV0dXJuIHJldDsKLQotfQotCi1pbnQgcnRsODE5Ml9kb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCi0JaWYgKHByaXYtPnVwID09IDApIHJldHVybiAtMTsKLQotI2lmZGVmIEVOQUJMRV9MUFMKLQkvL0xaTSBmb3IgUFMtUG9sbCBBSUQgaXNzdWUuIDA5MDQyOQotCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKLQkJTGVpc3VyZVBTTGVhdmUocHJpdi0+aWVlZTgwMjExKTsKLSNlbmRpZgotCi0JcHJpdi0+dXA9MDsKLQlwcml2LT5pZWVlODAyMTEtPmllZWVfdXAgPSAwOwotCVJUX1RSQUNFKENPTVBfRE9XTiwgIj09PT09PT09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKLS8qIEZJWE1FICovCi0JaWYgKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpCi0JCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQotCXJ0bDgxOTJfaXJxX2Rpc2FibGUocHJpdik7Ci0JcnRsODE5Ml9jYW5jZWxfZGVmZXJyZWRfd29yayhwcml2KTsKLQlkZWluaXRfaGFsX2RtKHByaXYpOwotCWRlbF90aW1lcl9zeW5jKCZwcml2LT53YXRjaF9kb2dfdGltZXIpOwotCi0JaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbChwcml2LT5pZWVlODAyMTEsdHJ1ZSk7Ci0KLQlydGw4MTkyX2hhbHRfYWRhcHRlcihwcml2LCBmYWxzZSk7Ci0JbWVtc2V0KCZwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yaywgMCAsIG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yaywgbGlzdCkpOwotCi0JUlRfVFJBQ0UoQ09NUF9ET1dOLCAiPD09PT09PT09PT0lcygpXG4iLCBfX0ZVTkNUSU9OX18pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotdm9pZCBydGw4MTkyX2NvbW1pdChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQlpZiAocHJpdi0+dXAgPT0gMCkgcmV0dXJuIDsKLQotCi0JaWVlZTgwMjExX3NvZnRtYWNfc3RvcF9wcm90b2NvbChwcml2LT5pZWVlODAyMTEsdHJ1ZSk7Ci0KLQlydGw4MTkyX2lycV9kaXNhYmxlKHByaXYpOwotCXJ0bDgxOTJfaGFsdF9hZGFwdGVyKHByaXYsIHRydWUpOwotCV9ydGw4MTkyX3VwKHByaXYpOwotfQotCi1zdGF0aWMgdm9pZCBydGw4MTkyX3Jlc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotICAgICAgICBzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcjgxOTJfcHJpdiwgcmVzZXRfd3EpOwotCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKLQotCXJ0bDgxOTJfY29tbWl0KHByaXYpOwotCi0JdXAoJnByaXYtPnd4X3NlbSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHI4MTkyX3NldF9tdWx0aWNhc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0KLQlwcml2LT5wcm9taXNjID0gKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgPyAxIDogMDsKLX0KLQotCi1zdGF0aWMgaW50IHI4MTkyX3NldF9tYWNfYWRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKm1hYykKLXsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0Jc3RydWN0IHNvY2thZGRyICphZGRyID0gbWFjOwotCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKLQotCW1lbWNweShkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBFVEhfQUxFTik7Ci0KLQlzY2hlZHVsZV93b3JrKCZwcml2LT5yZXNldF93cSk7Ci0JdXAoJnByaXYtPnd4X3NlbSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcjgxOTJlX3NldF9od19rZXkoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlX3BhcmFtICppcHcpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBwcml2LT5pZWVlODAyMTE7Ci0JdTggYnJvYWRjYXN0X2FkZHJbNl0gPSB7MHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmZ9OwotCXUzMiBrZXlbNF07Ci0KLQlpZiAoaXB3LT51LmNyeXB0LnNldF90eCkgewotCQlpZiAoc3RyY21wKGlwdy0+dS5jcnlwdC5hbGcsICJDQ01QIikgPT0gMCkKLQkJCWllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfQ0NNUDsKLQkJZWxzZSBpZiAoc3RyY21wKGlwdy0+dS5jcnlwdC5hbGcsICJUS0lQIikgPT0gMCkKLQkJCWllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfVEtJUDsKLQkJZWxzZSBpZiAoc3RyY21wKGlwdy0+dS5jcnlwdC5hbGcsICJXRVAiKSA9PSAwKSB7Ci0JCQlpZiAoaXB3LT51LmNyeXB0LmtleV9sZW4gPT0gMTMpCi0JCQkJaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPSBLRVlfVFlQRV9XRVAxMDQ7Ci0JCQllbHNlIGlmIChpcHctPnUuY3J5cHQua2V5X2xlbiA9PSA1KQotCQkJCWllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfV0VQNDA7Ci0JCX0gZWxzZQotCQkJaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPSBLRVlfVFlQRV9OQTsKLQotCQlpZiAoaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUpIHsKLQkJCW1lbWNweShrZXksIGlwdy0+dS5jcnlwdC5rZXksIDE2KTsKLQkJCUVuYWJsZUhXU2VjdXJpdHlDb25maWc4MTkyKHByaXYpOwotCQkJLyoKLQkJCSAqIFdlIGZpbGwgYm90aCBpbmRleCBlbnRyeSBhbmQgNHRoIGVudHJ5IGZvciBwYWlyd2lzZQotCQkJICoga2V5IGFzIGluIElQVyBpbnRlcmZhY2UsIGFkaG9jIHdpbGwgb25seSBnZXQgaGVyZSwKLQkJCSAqIHNvIHdlIG5lZWQgaW5kZXggZW50cnkgZm9yIGl0cyBkZWZhdWx0IGtleSBzZXJjaGluZyEKLQkJCSAqLwotCQkJc2V0S2V5KHByaXYsIDQsIGlwdy0+dS5jcnlwdC5pZHgsCi0JCQkgICAgICAgaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUsCi0JCQkgICAgICAgKHU4KilpZWVlLT5hcF9tYWNfYWRkciwgMCwga2V5KTsKLQotCQkJLyogTEVBUCBXRVAgd2lsbCBuZXZlciBzZXQgdGhpcy4gKi8KLQkJCWlmIChpZWVlLT5hdXRoX21vZGUgIT0gMikKLQkJCQlzZXRLZXkocHJpdiwgaXB3LT51LmNyeXB0LmlkeCwgaXB3LT51LmNyeXB0LmlkeCwKLQkJCQkgICAgICAgaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUsCi0JCQkJICAgICAgICh1OCopaWVlZS0+YXBfbWFjX2FkZHIsIDAsIGtleSk7Ci0JCX0KLQkJaWYgKChpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9PSBLRVlfVFlQRV9DQ01QKSAmJgotCQkgICAgaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQpIHsKLQkJCXdyaXRlX25pY19ieXRlKHByaXYsIDB4MTczLCAxKTsgLyogZml4IGFlcyBidWcgKi8KLQkJfQotCX0gZWxzZSB7Ci0JCW1lbWNweShrZXksIGlwdy0+dS5jcnlwdC5rZXksIDE2KTsKLQkJaWYgKHN0cmNtcChpcHctPnUuY3J5cHQuYWxnLCAiQ0NNUCIpID09IDApCi0JCQlpZWVlLT5ncm91cF9rZXlfdHlwZT0gS0VZX1RZUEVfQ0NNUDsKLQkJZWxzZSBpZiAoc3RyY21wKGlwdy0+dS5jcnlwdC5hbGcsICJUS0lQIikgPT0gMCkKLQkJCWllZWUtPmdyb3VwX2tleV90eXBlID0gS0VZX1RZUEVfVEtJUDsKLQkJZWxzZSBpZiAoc3RyY21wKGlwdy0+dS5jcnlwdC5hbGcsICJXRVAiKSA9PSAwKSB7Ci0JCQlpZiAoaXB3LT51LmNyeXB0LmtleV9sZW4gPT0gMTMpCi0JCQkJaWVlZS0+Z3JvdXBfa2V5X3R5cGUgPSBLRVlfVFlQRV9XRVAxMDQ7Ci0JCQllbHNlIGlmIChpcHctPnUuY3J5cHQua2V5X2xlbiA9PSA1KQotCQkJCWllZWUtPmdyb3VwX2tleV90eXBlID0gS0VZX1RZUEVfV0VQNDA7Ci0JCX0gZWxzZQotCQkJaWVlZS0+Z3JvdXBfa2V5X3R5cGUgPSBLRVlfVFlQRV9OQTsKLQotCQlpZiAoaWVlZS0+Z3JvdXBfa2V5X3R5cGUpIHsKLQkJCXNldEtleShwcml2LCBpcHctPnUuY3J5cHQuaWR4LCBpcHctPnUuY3J5cHQuaWR4LAotCQkJICAgICAgIGllZWUtPmdyb3VwX2tleV90eXBlLCBicm9hZGNhc3RfYWRkciwgMCwga2V5KTsKLQkJfQotCX0KLX0KLQotLyogYmFzZWQgb24gaXB3MjIwMCBkcml2ZXIgKi8KLXN0YXRpYyBpbnQgcnRsODE5Ml9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKLQlzdHJ1Y3QgaXdyZXEgKndycSA9IChzdHJ1Y3QgaXdyZXEgKilycTsKLQlpbnQgcmV0PS0xOwotCXN0cnVjdCBpd19wb2ludCAqcCA9ICZ3cnEtPnUuZGF0YTsKLQlzdHJ1Y3QgaWVlZV9wYXJhbSAqaXB3ID0gTlVMTDsvLyhzdHJ1Y3QgaWVlZV9wYXJhbSAqKXdycS0+dS5kYXRhLnBvaW50ZXI7Ci0KLQlkb3duKCZwcml2LT53eF9zZW0pOwotCi0KLSAgICAgaWYgKHAtPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaWVlZV9wYXJhbSkgfHwgIXAtPnBvaW50ZXIpewotICAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7Ci0gICAgICAgICAgICAgZ290byBvdXQ7Ci0gICAgIH0KLQotICAgICBpcHcgPSBrbWFsbG9jKHAtPmxlbmd0aCwgR0ZQX0tFUk5FTCk7Ci0gICAgIGlmIChpcHcgPT0gTlVMTCl7Ci0gICAgICAgICAgICAgcmV0ID0gLUVOT01FTTsKLSAgICAgICAgICAgICBnb3RvIG91dDsKLSAgICAgfQotICAgICBpZiAoY29weV9mcm9tX3VzZXIoaXB3LCBwLT5wb2ludGVyLCBwLT5sZW5ndGgpKSB7Ci0gICAgICAgICAgICBrZnJlZShpcHcpOwotICAgICAgICAgICAgcmV0ID0gLUVGQVVMVDsKLSAgICAgICAgICAgIGdvdG8gb3V0OwotICAgICB9Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgUlRMX0lPQ1RMX1dQQV9TVVBQTElDQU5UOgotCQkvKiBwYXJzZSBoZXJlIGZvciBIVyBzZWN1cml0eSAqLwotCQlpZiAoaXB3LT5jbWQgPT0gSUVFRV9DTURfU0VUX0VOQ1JZUFRJT04pCi0JCQlyODE5MmVfc2V0X2h3X2tleShwcml2LCBpcHcpOwotCQlyZXQgPSBpZWVlODAyMTFfd3BhX3N1cHBsaWNhbnRfaW9jdGwocHJpdi0+aWVlZTgwMjExLCAmd3JxLT51LmRhdGEpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FT1BOT1RTVVBQOwotCQlicmVhazsKLQl9Ci0KLQlrZnJlZShpcHcpOwotb3V0OgotCXVwKCZwcml2LT53eF9zZW0pOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHU4IEh3UmF0ZVRvTVJhdGU5MChib29sIGJJc0hULCB1OCByYXRlKQotewotCXU4ICByZXRfcmF0ZSA9IDB4MDI7Ci0KLQlpZighYklzSFQpIHsKLQkJc3dpdGNoKHJhdGUpIHsKLQkJCWNhc2UgREVTQzkwX1JBVEUxTTogICByZXRfcmF0ZSA9IE1HTl8xTTsgICAgICAgICBicmVhazsKLQkJCWNhc2UgREVTQzkwX1JBVEUyTTogICByZXRfcmF0ZSA9IE1HTl8yTTsgICAgICAgICBicmVhazsKLQkJCWNhc2UgREVTQzkwX1JBVEU1XzVNOiByZXRfcmF0ZSA9IE1HTl81XzVNOyAgICAgICBicmVhazsKLQkJCWNhc2UgREVTQzkwX1JBVEUxMU06ICByZXRfcmF0ZSA9IE1HTl8xMU07ICAgICAgICBicmVhazsKLQkJCWNhc2UgREVTQzkwX1JBVEU2TTogICByZXRfcmF0ZSA9IE1HTl82TTsgICAgICAgICBicmVhazsKLQkJCWNhc2UgREVTQzkwX1JBVEU5TTogICByZXRfcmF0ZSA9IE1HTl85TTsgICAgICAgICBicmVhazsKLQkJCWNhc2UgREVTQzkwX1JBVEUxMk06ICByZXRfcmF0ZSA9IE1HTl8xMk07ICAgICAgICBicmVhazsKLQkJCWNhc2UgREVTQzkwX1JBVEUxOE06ICByZXRfcmF0ZSA9IE1HTl8xOE07ICAgICAgICBicmVhazsKLQkJCWNhc2UgREVTQzkwX1JBVEUyNE06ICByZXRfcmF0ZSA9IE1HTl8yNE07ICAgICAgICBicmVhazsKLQkJCWNhc2UgREVTQzkwX1JBVEUzNk06ICByZXRfcmF0ZSA9IE1HTl8zNk07ICAgICAgICBicmVhazsKLQkJCWNhc2UgREVTQzkwX1JBVEU0OE06ICByZXRfcmF0ZSA9IE1HTl80OE07ICAgICAgICBicmVhazsKLQkJCWNhc2UgREVTQzkwX1JBVEU1NE06ICByZXRfcmF0ZSA9IE1HTl81NE07ICAgICAgICBicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQkJICAgICAgUlRfVFJBQ0UoQ09NUF9SRUNWLCAiSHdSYXRlVG9NUmF0ZTkwKCk6IE5vbiBzdXBwb3J0ZWQgUmF0ZSBbJXhdLCBiSXNIVCA9ICVkISEhXG4iLCByYXRlLCBiSXNIVCk7Ci0JCQkJCSAgICAgIGJyZWFrOwotCQl9Ci0KLQl9IGVsc2UgewotCQlzd2l0Y2gocmF0ZSkgewotCQkJY2FzZSBERVNDOTBfUkFURU1DUzA6ICAgcmV0X3JhdGUgPSBNR05fTUNTMDsgICAgYnJlYWs7Ci0JCQljYXNlIERFU0M5MF9SQVRFTUNTMTogICByZXRfcmF0ZSA9IE1HTl9NQ1MxOyAgICBicmVhazsKLQkJCWNhc2UgREVTQzkwX1JBVEVNQ1MyOiAgIHJldF9yYXRlID0gTUdOX01DUzI7ICAgIGJyZWFrOwotCQkJY2FzZSBERVNDOTBfUkFURU1DUzM6ICAgcmV0X3JhdGUgPSBNR05fTUNTMzsgICAgYnJlYWs7Ci0JCQljYXNlIERFU0M5MF9SQVRFTUNTNDogICByZXRfcmF0ZSA9IE1HTl9NQ1M0OyAgICBicmVhazsKLQkJCWNhc2UgREVTQzkwX1JBVEVNQ1M1OiAgIHJldF9yYXRlID0gTUdOX01DUzU7ICAgIGJyZWFrOwotCQkJY2FzZSBERVNDOTBfUkFURU1DUzY6ICAgcmV0X3JhdGUgPSBNR05fTUNTNjsgICAgYnJlYWs7Ci0JCQljYXNlIERFU0M5MF9SQVRFTUNTNzogICByZXRfcmF0ZSA9IE1HTl9NQ1M3OyAgICBicmVhazsKLQkJCWNhc2UgREVTQzkwX1JBVEVNQ1M4OiAgIHJldF9yYXRlID0gTUdOX01DUzg7ICAgIGJyZWFrOwotCQkJY2FzZSBERVNDOTBfUkFURU1DUzk6ICAgcmV0X3JhdGUgPSBNR05fTUNTOTsgICAgYnJlYWs7Ci0JCQljYXNlIERFU0M5MF9SQVRFTUNTMTA6ICByZXRfcmF0ZSA9IE1HTl9NQ1MxMDsgICBicmVhazsKLQkJCWNhc2UgREVTQzkwX1JBVEVNQ1MxMTogIHJldF9yYXRlID0gTUdOX01DUzExOyAgIGJyZWFrOwotCQkJY2FzZSBERVNDOTBfUkFURU1DUzEyOiAgcmV0X3JhdGUgPSBNR05fTUNTMTI7ICAgYnJlYWs7Ci0JCQljYXNlIERFU0M5MF9SQVRFTUNTMTM6ICByZXRfcmF0ZSA9IE1HTl9NQ1MxMzsgICBicmVhazsKLQkJCWNhc2UgREVTQzkwX1JBVEVNQ1MxNDogIHJldF9yYXRlID0gTUdOX01DUzE0OyAgIGJyZWFrOwotCQkJY2FzZSBERVNDOTBfUkFURU1DUzE1OiAgcmV0X3JhdGUgPSBNR05fTUNTMTU7ICAgYnJlYWs7Ci0JCQljYXNlIERFU0M5MF9SQVRFTUNTMzI6ICByZXRfcmF0ZSA9ICgweDgwfDB4MjApOyBicmVhazsKLQotCQkJZGVmYXVsdDoKLQkJCQkJCVJUX1RSQUNFKENPTVBfUkVDViwgIkh3UmF0ZVRvTVJhdGU5MCgpOiBOb24gc3VwcG9ydGVkIFJhdGUgWyV4XSwgYklzSFQgPSAlZCEhIVxuIixyYXRlLCBiSXNIVCk7Ci0JCQkJCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiByZXRfcmF0ZTsKLX0KLQotLyogUmVjb3JkIHRoZSBUU0YgdGltZSBzdGFtcCB3aGVuIHJlY2VpdmluZyBhIHBhY2tldCAqLwotc3RhdGljIHZvaWQgVXBkYXRlUnhQa3RUaW1lU3RhbXA4MTkwKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpzdGF0cykKLXsKLQotCWlmKHN0YXRzLT5iSXNBTVBEVSAmJiAhc3RhdHMtPmJGaXJzdE1QRFUpIHsKLQkJc3RhdHMtPm1hY190aW1lWzBdID0gcHJpdi0+TGFzdFJ4RGVzY1RTRkxvdzsKLQkJc3RhdHMtPm1hY190aW1lWzFdID0gcHJpdi0+TGFzdFJ4RGVzY1RTRkhpZ2g7Ci0JfSBlbHNlIHsKLQkJcHJpdi0+TGFzdFJ4RGVzY1RTRkxvdyA9IHN0YXRzLT5tYWNfdGltZVswXTsKLQkJcHJpdi0+TGFzdFJ4RGVzY1RTRkhpZ2ggPSBzdGF0cy0+bWFjX3RpbWVbMV07Ci0JfQotfQotCi1zdGF0aWMgbG9uZyBydGw4MTl4X3RyYW5zbGF0ZV90b2RibSh1OCBzaWduYWxfc3RyZW5ndGhfaW5kZXgpLy8gMC0xMDAgaW5kZXguCi17Ci0JbG9uZwlzaWduYWxfcG93ZXI7IC8vIGluIGRCbS4KLQotCS8vIFRyYW5zbGF0ZSB0byBkQm0gKHg9MC41eS05NSkuCi0Jc2lnbmFsX3Bvd2VyID0gKGxvbmcpKChzaWduYWxfc3RyZW5ndGhfaW5kZXggKyAxKSA+PiAxKTsKLQlzaWduYWxfcG93ZXIgLT0gOTU7Ci0KLQlyZXR1cm4gc2lnbmFsX3Bvd2VyOwotfQotCi0vKiAyMDA4LzAxLzIyIE1IIFdlIGNhbiBub3QgZGVsY2FyZSBSU1NJL0VWTSB0b3RhbCB2YWx1ZSBvZiBzbGlkaW5nIHdpbmRvdyB0bwotCWJlIGEgbG9jYWwgc3RhdGljLiBPdGhlcndpc2UsIGl0IG1heSBpbmNyZWFzZSB3aGVuIHdlIHJldHVybiBmcm9tIFMzL1M0LiBUaGUKLQl2YWx1ZSB3aWxsIGJlIGtlcHQgaW4gbWVtb3J5IG9yIGRpc2suIFdlIG11c3QgZGVsY2FyZSB0aGUgdmFsdWUgaW4gYWRhcHRlcgotCWFuZCBpdCB3aWxsIGJlIHJlaW5pdGlhbGl6ZWQgd2hlbiByZXR1cm4gZnJvbSBTMy9TNC4gKi8KLXN0YXRpYyB2b2lkIHJ0bDgxOTJfcHJvY2Vzc19waHlpbmZvKHN0cnVjdCByODE5Ml9wcml2ICogcHJpdiwgdTgqIGJ1ZmZlcixzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICogcHByZXZpb3VzX3N0YXRzLCBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICogcGN1cnJlbnRfc3RhdHMpCi17Ci0JYm9vbCBiY2hlY2sgPSBmYWxzZTsKLQl1OAlyZnBhdGg7Ci0JdTMyIG5zcGF0aWFsX3N0cmVhbSwgdG1wX3ZhbDsKLQlzdGF0aWMgdTMyIHNsaWRlX3Jzc2lfaW5kZXg9MCwgc2xpZGVfcnNzaV9zdGF0aXN0aWNzPTA7Ci0Jc3RhdGljIHUzMiBzbGlkZV9ldm1faW5kZXg9MCwgc2xpZGVfZXZtX3N0YXRpc3RpY3M9MDsKLQlzdGF0aWMgdTMyIGxhc3RfcnNzaT0wLCBsYXN0X2V2bT0wOwotCS8vY29zYSBhZGQgZm9yIGJlYWNvbiByc3NpIHNtb290aGluZwotCXN0YXRpYyB1MzIgc2xpZGVfYmVhY29uX2FkY19wd2RiX2luZGV4PTAsIHNsaWRlX2JlYWNvbl9hZGNfcHdkYl9zdGF0aXN0aWNzPTA7Ci0Jc3RhdGljIHUzMiBsYXN0X2JlYWNvbl9hZGNfcHdkYj0wOwotCi0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmhkcjsKLQl1MTYgc2MgOwotCXVuc2lnbmVkIGludCBmcmFnLHNlcTsKLQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKilidWZmZXI7Ci0Jc2MgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdGwpOwotCWZyYWcgPSBXTEFOX0dFVF9TRVFfRlJBRyhzYyk7Ci0Jc2VxID0gV0xBTl9HRVRfU0VRX1NFUShzYyk7Ci0KLQkvLwotCS8vIENoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIHRha2UgdGhlIHByZXZpb3VzIHBhY2tldCBpbnRvIGFjY291bnRpbmcKLQkvLwotCWlmKCFwcHJldmlvdXNfc3RhdHMtPmJJc0FNUERVKQotCXsKLQkJLy8gaWYgcHJldmlvdXMgcGFja2V0IGlzIG5vdCBhZ2dyZWdhdGVkIHBhY2tldAotCQliY2hlY2sgPSB0cnVlOwotCX0KLQotCWlmKHNsaWRlX3Jzc2lfc3RhdGlzdGljcysrID49IFBIWV9SU1NJX1NMSURfV0lOX01BWCkKLQl7Ci0JCXNsaWRlX3Jzc2lfc3RhdGlzdGljcyA9IFBIWV9SU1NJX1NMSURfV0lOX01BWDsKLQkJbGFzdF9yc3NpID0gcHJpdi0+c3RhdHMuc2xpZGVfc2lnbmFsX3N0cmVuZ3RoW3NsaWRlX3Jzc2lfaW5kZXhdOwotCQlwcml2LT5zdGF0cy5zbGlkZV9yc3NpX3RvdGFsIC09IGxhc3RfcnNzaTsKLQl9Ci0JcHJpdi0+c3RhdHMuc2xpZGVfcnNzaV90b3RhbCArPSBwcHJldmlvdXNfc3RhdHMtPlNpZ25hbFN0cmVuZ3RoOwotCi0JcHJpdi0+c3RhdHMuc2xpZGVfc2lnbmFsX3N0cmVuZ3RoW3NsaWRlX3Jzc2lfaW5kZXgrK10gPSBwcHJldmlvdXNfc3RhdHMtPlNpZ25hbFN0cmVuZ3RoOwotCWlmKHNsaWRlX3Jzc2lfaW5kZXggPj0gUEhZX1JTU0lfU0xJRF9XSU5fTUFYKQotCQlzbGlkZV9yc3NpX2luZGV4ID0gMDsKLQotCS8vIDwxPiBTaG93ZWQgb24gVUkgZm9yIHVzZXIsIGluIGRibQotCXRtcF92YWwgPSBwcml2LT5zdGF0cy5zbGlkZV9yc3NpX3RvdGFsL3NsaWRlX3Jzc2lfc3RhdGlzdGljczsKLQlwcml2LT5zdGF0cy5zaWduYWxfc3RyZW5ndGggPSBydGw4MTl4X3RyYW5zbGF0ZV90b2RibSgodTgpdG1wX3ZhbCk7Ci0JcGN1cnJlbnRfc3RhdHMtPnJzc2kgPSBwcml2LT5zdGF0cy5zaWduYWxfc3RyZW5ndGg7Ci0JLy8KLQkvLyBJZiB0aGUgcHJldmlvdXMgcGFja2V0IGRvZXMgbm90IG1hdGNoIHRoZSBjcml0ZXJpYSwgbmVnbGVjdCBpdAotCS8vCi0JaWYoIXBwcmV2aW91c19zdGF0cy0+YlBhY2tldE1hdGNoQlNTSUQpCi0JewotCQlpZighcHByZXZpb3VzX3N0YXRzLT5iVG9TZWxmQkEpCi0JCQlyZXR1cm47Ci0JfQotCi0JaWYoIWJjaGVjaykKLQkJcmV0dXJuOwotCi0JLy8gPDI+IFNob3dlZCBvbiBVSSBmb3IgZW5naW5lZXJpbmcKLQkvLyBoYXJkd2FyZSBkb2VzIG5vdCBwcm92aWRlIHJzc2kgaW5mb3JtYXRpb24gZm9yIGVhY2ggcmYgcGF0aCBpbiBDQ0sKLQlpZighcHByZXZpb3VzX3N0YXRzLT5iSXNDQ0sgJiYgcHByZXZpb3VzX3N0YXRzLT5iUGFja2V0VG9TZWxmKQotCXsKLQkJZm9yIChyZnBhdGggPSBSRjkwX1BBVEhfQTsgcmZwYXRoIDwgUkY5MF9QQVRIX0M7IHJmcGF0aCsrKQotCQl7Ci0JCQlpZiAoIXJ0bDgxOTJfcGh5X0NoZWNrSXNMZWdhbFJGUGF0aChwcml2LCByZnBhdGgpKQotCQkJCWNvbnRpbnVlOwotCQkJUlRfVFJBQ0UoQ09NUF9EQkcsICJwUHJldmlvdXNzdGF0cy0+UnhNSU1PU2lnbmFsU3RyZW5ndGhbcmZwYXRoXSA9ICVkXG4iLCBwcHJldmlvdXNfc3RhdHMtPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW3JmcGF0aF0pOwotCQkJLy9GaXhlZCBieSBKYWNrZW4gMjAwOC0wMy0yMAotCQkJaWYocHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0gPT0gMCkKLQkJCXsKLQkJCQlwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZwYXRoXSA9IHBwcmV2aW91c19zdGF0cy0+UnhNSU1PU2lnbmFsU3RyZW5ndGhbcmZwYXRoXTsKLQkJCX0KLQkJCWlmKHBwcmV2aW91c19zdGF0cy0+UnhNSU1PU2lnbmFsU3RyZW5ndGhbcmZwYXRoXSAgPiBwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZwYXRoXSkKLQkJCXsKLQkJCQlwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZwYXRoXSA9Ci0JCQkJCSggKHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdKihSeF9TbW9vdGhfRmFjdG9yLTEpKSArCi0JCQkJCShwcHJldmlvdXNfc3RhdHMtPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW3JmcGF0aF0pKSAvKFJ4X1Ntb290aF9GYWN0b3IpOwotCQkJCXByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdID0gcHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0gICsgMTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZwYXRoXSA9Ci0JCQkJCSggKHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdKihSeF9TbW9vdGhfRmFjdG9yLTEpKSArCi0JCQkJCShwcHJldmlvdXNfc3RhdHMtPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW3JmcGF0aF0pKSAvKFJ4X1Ntb290aF9GYWN0b3IpOwotCQkJfQotCQkJUlRfVFJBQ0UoQ09NUF9EQkcsICJwcml2LT5SeFN0YXRzLlJ4UlNTSVBlcmNlbnRhZ2VbcmZQYXRoXSA9ICVkIFxuIiAsIHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdKTsKLQkJfQotCX0KLQotCi0JLy8KLQkvLyBDaGVjayBQV0RCLgotCS8vCi0JLy9jb3NhIGFkZCBmb3IgYmVhY29uIHJzc2kgc21vb3RoaW5nIGJ5IGF2ZXJhZ2UuCi0JaWYocHByZXZpb3VzX3N0YXRzLT5iUGFja2V0QmVhY29uKQotCXsKLQkJLyogcmVjb3JkIHRoZSBiZWFjb24gcHdkYiB0byB0aGUgc2xpZGluZyB3aW5kb3cuICovCi0JCWlmKHNsaWRlX2JlYWNvbl9hZGNfcHdkYl9zdGF0aXN0aWNzKysgPj0gUEhZX0JlYWNvbl9SU1NJX1NMSURfV0lOX01BWCkKLQkJewotCQkJc2xpZGVfYmVhY29uX2FkY19wd2RiX3N0YXRpc3RpY3MgPSBQSFlfQmVhY29uX1JTU0lfU0xJRF9XSU5fTUFYOwotCQkJbGFzdF9iZWFjb25fYWRjX3B3ZGIgPSBwcml2LT5zdGF0cy5TbGlkZV9CZWFjb25fcHdkYltzbGlkZV9iZWFjb25fYWRjX3B3ZGJfaW5kZXhdOwotCQkJcHJpdi0+c3RhdHMuU2xpZGVfQmVhY29uX1RvdGFsIC09IGxhc3RfYmVhY29uX2FkY19wd2RiOwotCQkJLy8Jc2xpZGVfYmVhY29uX2FkY19wd2RiX2luZGV4LCBsYXN0X2JlYWNvbl9hZGNfcHdkYiwgQWRhcHRlci0+UnhTdGF0cy5TbGlkZV9CZWFjb25fVG90YWwpOwotCQl9Ci0JCXByaXYtPnN0YXRzLlNsaWRlX0JlYWNvbl9Ub3RhbCArPSBwcHJldmlvdXNfc3RhdHMtPlJ4UFdEQkFsbDsKLQkJcHJpdi0+c3RhdHMuU2xpZGVfQmVhY29uX3B3ZGJbc2xpZGVfYmVhY29uX2FkY19wd2RiX2luZGV4XSA9IHBwcmV2aW91c19zdGF0cy0+UnhQV0RCQWxsOwotCQlzbGlkZV9iZWFjb25fYWRjX3B3ZGJfaW5kZXgrKzsKLQkJaWYoc2xpZGVfYmVhY29uX2FkY19wd2RiX2luZGV4ID49IFBIWV9CZWFjb25fUlNTSV9TTElEX1dJTl9NQVgpCi0JCQlzbGlkZV9iZWFjb25fYWRjX3B3ZGJfaW5kZXggPSAwOwotCQlwcHJldmlvdXNfc3RhdHMtPlJ4UFdEQkFsbCA9IHByaXYtPnN0YXRzLlNsaWRlX0JlYWNvbl9Ub3RhbC9zbGlkZV9iZWFjb25fYWRjX3B3ZGJfc3RhdGlzdGljczsKLQkJaWYocHByZXZpb3VzX3N0YXRzLT5SeFBXREJBbGwgPj0gMykKLQkJCXBwcmV2aW91c19zdGF0cy0+UnhQV0RCQWxsIC09IDM7Ci0JfQotCi0JUlRfVFJBQ0UoQ09NUF9SWERFU0MsICJTbW9vdGggJXMgUFdEQiA9ICVkXG4iLAotCQkJCXBwcmV2aW91c19zdGF0cy0+YklzQ0NLPyAiQ0NLIjogIk9GRE0iLAotCQkJCXBwcmV2aW91c19zdGF0cy0+UnhQV0RCQWxsKTsKLQotCWlmKHBwcmV2aW91c19zdGF0cy0+YlBhY2tldFRvU2VsZiB8fCBwcHJldmlvdXNfc3RhdHMtPmJQYWNrZXRCZWFjb24gfHwgcHByZXZpb3VzX3N0YXRzLT5iVG9TZWxmQkEpCi0JewotCQlpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDwgMCkJLy8gaW5pdGlhbGl6ZQotCQl7Ci0JCQlwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0gcHByZXZpb3VzX3N0YXRzLT5SeFBXREJBbGw7Ci0JCX0KLQotCQlpZihwcHJldmlvdXNfc3RhdHMtPlJ4UFdEQkFsbCA+ICh1MzIpcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYikKLQkJewotCQkJcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA9Ci0JCQkJCSggKChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiKSooUnhfU21vb3RoX0ZhY3Rvci0xKSkgKwotCQkJCQkocHByZXZpb3VzX3N0YXRzLT5SeFBXREJBbGwpKSAvKFJ4X1Ntb290aF9GYWN0b3IpOwotCQkJcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA9IHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgKyAxOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA9Ci0JCQkJCSggKChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiKSooUnhfU21vb3RoX0ZhY3Rvci0xKSkgKwotCQkJCQkocHByZXZpb3VzX3N0YXRzLT5SeFBXREJBbGwpKSAvKFJ4X1Ntb290aF9GYWN0b3IpOwotCQl9Ci0JfQotCi0JLy8KLQkvLyBDaGVjayBFVk0KLQkvLwotCS8qIHJlY29yZCB0aGUgZ2VuZXJhbCBFVk0gdG8gdGhlIHNsaWRpbmcgd2luZG93LiAqLwotCWlmKHBwcmV2aW91c19zdGF0cy0+U2lnbmFsUXVhbGl0eSA9PSAwKQotCXsKLQl9Ci0JZWxzZQotCXsKLQkJaWYocHByZXZpb3VzX3N0YXRzLT5iUGFja2V0VG9TZWxmIHx8IHBwcmV2aW91c19zdGF0cy0+YlBhY2tldEJlYWNvbiB8fCBwcHJldmlvdXNfc3RhdHMtPmJUb1NlbGZCQSl7Ci0JCQlpZihzbGlkZV9ldm1fc3RhdGlzdGljcysrID49IFBIWV9SU1NJX1NMSURfV0lOX01BWCl7Ci0JCQkJc2xpZGVfZXZtX3N0YXRpc3RpY3MgPSBQSFlfUlNTSV9TTElEX1dJTl9NQVg7Ci0JCQkJbGFzdF9ldm0gPSBwcml2LT5zdGF0cy5zbGlkZV9ldm1bc2xpZGVfZXZtX2luZGV4XTsKLQkJCQlwcml2LT5zdGF0cy5zbGlkZV9ldm1fdG90YWwgLT0gbGFzdF9ldm07Ci0JCQl9Ci0KLQkJCXByaXYtPnN0YXRzLnNsaWRlX2V2bV90b3RhbCArPSBwcHJldmlvdXNfc3RhdHMtPlNpZ25hbFF1YWxpdHk7Ci0KLQkJCXByaXYtPnN0YXRzLnNsaWRlX2V2bVtzbGlkZV9ldm1faW5kZXgrK10gPSBwcHJldmlvdXNfc3RhdHMtPlNpZ25hbFF1YWxpdHk7Ci0JCQlpZihzbGlkZV9ldm1faW5kZXggPj0gUEhZX1JTU0lfU0xJRF9XSU5fTUFYKQotCQkJCXNsaWRlX2V2bV9pbmRleCA9IDA7Ci0KLQkJCS8vIDwxPiBTaG93ZWQgb24gVUkgZm9yIHVzZXIsIGluIHBlcmNlbnRhZ2UuCi0JCQl0bXBfdmFsID0gcHJpdi0+c3RhdHMuc2xpZGVfZXZtX3RvdGFsL3NsaWRlX2V2bV9zdGF0aXN0aWNzOwotCQkJLy9jb3NhIGFkZCAxMC8xMS8yMDA3LCBTaG93ZWQgb24gVUkgZm9yIHVzZXIgaW4gV2luZG93cyBWaXN0YSwgZm9yIExpbmsgcXVhbGl0eS4KLQkJfQotCi0JCS8vIDwyPiBTaG93ZWQgb24gVUkgZm9yIGVuZ2luZWVyaW5nCi0JCWlmKHBwcmV2aW91c19zdGF0cy0+YlBhY2tldFRvU2VsZiB8fCBwcHJldmlvdXNfc3RhdHMtPmJQYWNrZXRCZWFjb24gfHwgcHByZXZpb3VzX3N0YXRzLT5iVG9TZWxmQkEpCi0JCXsKLQkJCWZvcihuc3BhdGlhbF9zdHJlYW0gPSAwOyBuc3BhdGlhbF9zdHJlYW08MiA7IG5zcGF0aWFsX3N0cmVhbSsrKSAvLyAyIHNwYXRpYWwgc3RyZWFtCi0JCQl7Ci0JCQkJaWYocHByZXZpb3VzX3N0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5W25zcGF0aWFsX3N0cmVhbV0gIT0gLTEpCi0JCQkJewotCQkJCQlpZihwcml2LT5zdGF0cy5yeF9ldm1fcGVyY2VudGFnZVtuc3BhdGlhbF9zdHJlYW1dID09IDApCS8vIGluaXRpYWxpemUKLQkJCQkJewotCQkJCQkJcHJpdi0+c3RhdHMucnhfZXZtX3BlcmNlbnRhZ2VbbnNwYXRpYWxfc3RyZWFtXSA9IHBwcmV2aW91c19zdGF0cy0+UnhNSU1PU2lnbmFsUXVhbGl0eVtuc3BhdGlhbF9zdHJlYW1dOwotCQkJCQl9Ci0JCQkJCXByaXYtPnN0YXRzLnJ4X2V2bV9wZXJjZW50YWdlW25zcGF0aWFsX3N0cmVhbV0gPQotCQkJCQkJKCAocHJpdi0+c3RhdHMucnhfZXZtX3BlcmNlbnRhZ2VbbnNwYXRpYWxfc3RyZWFtXSogKFJ4X1Ntb290aF9GYWN0b3ItMSkpICsKLQkJCQkJCShwcHJldmlvdXNfc3RhdHMtPlJ4TUlNT1NpZ25hbFF1YWxpdHlbbnNwYXRpYWxfc3RyZWFtXSogMSkpIC8gKFJ4X1Ntb290aF9GYWN0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQotCi1zdGF0aWMgdTggcnRsODE5eF9xdWVyeV9yeHB3cnBlcmNlbnRhZ2UoCi0JY2hhcgkJYW50cG93ZXIKLQkpCi17Ci0JaWYgKChhbnRwb3dlciA8PSAtMTAwKSB8fCAoYW50cG93ZXIgPj0gMjApKQotCXsKLQkJcmV0dXJuCTA7Ci0JfQotCWVsc2UgaWYgKGFudHBvd2VyID49IDApCi0JewotCQlyZXR1cm4JMTAwOwotCX0KLQllbHNlCi0JewotCQlyZXR1cm4JKDEwMCthbnRwb3dlcik7Ci0JfQotCi19Ci0KLXN0YXRpYyB1OAotcnRsODE5eF9ldm1fZGJ0b3BlcmNlbnRhZ2UoCi0JY2hhciB2YWx1ZQotCSkKLXsKLQljaGFyIHJldF92YWw7Ci0KLQlyZXRfdmFsID0gdmFsdWU7Ci0KLQlpZihyZXRfdmFsID49IDApCi0JCXJldF92YWwgPSAwOwotCWlmKHJldF92YWwgPD0gLTMzKQotCQlyZXRfdmFsID0gLTMzOwotCXJldF92YWwgPSAwIC0gcmV0X3ZhbDsKLQlyZXRfdmFsKj0zOwotCWlmKHJldF92YWwgPT0gOTkpCi0JCXJldF92YWwgPSAxMDA7Ci0JcmV0dXJuIHJldF92YWw7Ci19Ci0KLS8qIFdlIHdhbnQgZ29vZC1sb29raW5nIGZvciBzaWduYWwgc3RyZW5ndGgvcXVhbGl0eSAqLwotc3RhdGljIGxvbmcgcnRsODE5eF9zaWduYWxfc2NhbGVfbWFwcGluZyhsb25nIGN1cnJzaWcpCi17Ci0JbG9uZyByZXRzaWc7Ci0KLQkvLyBTdGVwIDEuIFNjYWxlIG1hcHBpbmcuCi0JaWYoY3VycnNpZyA+PSA2MSAmJiBjdXJyc2lnIDw9IDEwMCkKLQl7Ci0JCXJldHNpZyA9IDkwICsgKChjdXJyc2lnIC0gNjApIC8gNCk7Ci0JfQotCWVsc2UgaWYoY3VycnNpZyA+PSA0MSAmJiBjdXJyc2lnIDw9IDYwKQotCXsKLQkJcmV0c2lnID0gNzggKyAoKGN1cnJzaWcgLSA0MCkgLyAyKTsKLQl9Ci0JZWxzZSBpZihjdXJyc2lnID49IDMxICYmIGN1cnJzaWcgPD0gNDApCi0JewotCQlyZXRzaWcgPSA2NiArIChjdXJyc2lnIC0gMzApOwotCX0KLQllbHNlIGlmKGN1cnJzaWcgPj0gMjEgJiYgY3VycnNpZyA8PSAzMCkKLQl7Ci0JCXJldHNpZyA9IDU0ICsgKGN1cnJzaWcgLSAyMCk7Ci0JfQotCWVsc2UgaWYoY3VycnNpZyA+PSA1ICYmIGN1cnJzaWcgPD0gMjApCi0JewotCQlyZXRzaWcgPSA0MiArICgoKGN1cnJzaWcgLSA1KSAqIDIpIC8gMyk7Ci0JfQotCWVsc2UgaWYoY3VycnNpZyA9PSA0KQotCXsKLQkJcmV0c2lnID0gMzY7Ci0JfQotCWVsc2UgaWYoY3VycnNpZyA9PSAzKQotCXsKLQkJcmV0c2lnID0gMjc7Ci0JfQotCWVsc2UgaWYoY3VycnNpZyA9PSAyKQotCXsKLQkJcmV0c2lnID0gMTg7Ci0JfQotCWVsc2UgaWYoY3VycnNpZyA9PSAxKQotCXsKLQkJcmV0c2lnID0gOTsKLQl9Ci0JZWxzZQotCXsKLQkJcmV0c2lnID0gY3VycnNpZzsKLQl9Ci0KLQlyZXR1cm4gcmV0c2lnOwotfQotCi1zdGF0aWMgdm9pZCBydGw4MTkyX3F1ZXJ5X3J4cGh5c3RhdHVzKAotCXN0cnVjdCByODE5Ml9wcml2ICogcHJpdiwKLQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICogcHN0YXRzLAotCXByeF9kZXNjXzgxOXhfcGNpICBwZGVzYywKLQlwcnhfZndpbmZvXzgxOXhfcGNpICAgcGRydmluZm8sCi0Jc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqIHByZWNvcmRfc3RhdHMsCi0JYm9vbCBicGFja2V0X21hdGNoX2Jzc2lkLAotCWJvb2wgYnBhY2tldF90b3NlbGYsCi0JYm9vbCBiUGFja2V0QmVhY29uLAotCWJvb2wgYlRvU2VsZkJBCi0JKQotewotCS8vUFJUX1JGRF9TVEFUVVMJCXBSdFJmZFN0YXR1cyA9ICYocFJmZC0+U3RhdHVzKTsKLQlwaHlfc3RzX29mZG1fODE5eHBjaV90KiBwb2ZkbV9idWY7Ci0JcGh5X3N0c19jY2tfODE5eHBjaV90CSoJcGNja19idWY7Ci0JcGh5X29mZG1fcnhfc3RhdHVzX3J4c2Nfc2dpZW5fZXhpbnRmZmxhZyogcHJ4c2M7Ci0JdTgJCQkJKnByeHBrdDsKLQl1OAkJCQlpLG1heF9zcGF0aWFsX3N0cmVhbSwgdG1wX3J4c25yLCB0bXBfcnhldm0sIHJ4c2Nfc2dpZW5fZXhmbGc7Ci0JY2hhcgkJCQlyeF9wd3JbNF0sIHJ4X3B3cl9hbGw9MDsKLQkvL2xvbmcJCQkJcnhfYXZnX3B3ciA9IDA7Ci0JY2hhcgkJCQlyeF9zbnJYLCByeF9ldm1YOwotCXU4CQkJCWV2bSwgcHdkYl9hbGw7Ci0JdTMyIAkJCVJTU0ksIHRvdGFsX3Jzc2k9MDsvLywgdG90YWxfZXZtPTA7Ci0vLwlsb25nCQkJCXNpZ25hbF9zdHJlbmd0aF9pbmRleCA9IDA7Ci0JdTgJCQkJaXNfY2NrX3JhdGU9MDsKLQl1OAkJCQlyZl9yeF9udW0gPSAwOwotCi0JaXNfY2NrX3JhdGUgPSByeF9oYWxfaXNfY2NrX3JhdGUocGRydmluZm8pOwotCi0JLy8gUmVjb3JkIGl0IGZvciBuZXh0IHBhY2tldCBwcm9jZXNzaW5nCi0JbWVtc2V0KHByZWNvcmRfc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzKSk7Ci0JcHN0YXRzLT5iUGFja2V0TWF0Y2hCU1NJRCA9IHByZWNvcmRfc3RhdHMtPmJQYWNrZXRNYXRjaEJTU0lEID0gYnBhY2tldF9tYXRjaF9ic3NpZDsKLQlwc3RhdHMtPmJQYWNrZXRUb1NlbGYgPSBwcmVjb3JkX3N0YXRzLT5iUGFja2V0VG9TZWxmID0gYnBhY2tldF90b3NlbGY7Ci0JcHN0YXRzLT5iSXNDQ0sgPSBwcmVjb3JkX3N0YXRzLT5iSXNDQ0sgPSBpc19jY2tfcmF0ZTsvL1JYX0hBTF9JU19DQ0tfUkFURShwRHJ2SW5mbyk7Ci0JcHN0YXRzLT5iUGFja2V0QmVhY29uID0gcHJlY29yZF9zdGF0cy0+YlBhY2tldEJlYWNvbiA9IGJQYWNrZXRCZWFjb247Ci0JcHN0YXRzLT5iVG9TZWxmQkEgPSBwcmVjb3JkX3N0YXRzLT5iVG9TZWxmQkEgPSBiVG9TZWxmQkE7Ci0JLyoyMDA3LjA4LjMwIHJlcXVlc3RlZCBieSBTRDMgSmVycnkgKi8KLQlpZiAocHJpdi0+cGh5X2NoZWNrX3JlZzgyNCA9PSAwKQotCXsKLQkJcHJpdi0+cGh5X3JlZzgyNF9iaXQ5ID0gcnRsODE5Ml9RdWVyeUJCUmVnKHByaXYsIHJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMiwgMHgyMDApOwotCQlwcml2LT5waHlfY2hlY2tfcmVnODI0ID0gMTsKLQl9Ci0KLQotCXByeHBrdCA9ICh1OCopcGRydmluZm87Ci0KLQkvKiBNb3ZlIHBvaW50ZXIgdG8gdGhlIDE2dGggYnl0ZXMuIFBoeSBzdGF0dXMgc3RhcnQgYWRkcmVzcy4gKi8KLQlwcnhwa3QgKz0gc2l6ZW9mKHJ4X2Z3aW5mb184MTl4X3BjaSk7Ci0KLQkvKiBJbml0aWFsIHRoZSBjY2sgYW5kIG9mZG0gYnVmZmVyIHBvaW50ZXIgKi8KLQlwY2NrX2J1ZiA9IChwaHlfc3RzX2Nja184MTl4cGNpX3QgKilwcnhwa3Q7Ci0JcG9mZG1fYnVmID0gKHBoeV9zdHNfb2ZkbV84MTl4cGNpX3QgKilwcnhwa3Q7Ci0KLQlwc3RhdHMtPlJ4TUlNT1NpZ25hbFF1YWxpdHlbMF0gPSAtMTsKLQlwc3RhdHMtPlJ4TUlNT1NpZ25hbFF1YWxpdHlbMV0gPSAtMTsKLQlwcmVjb3JkX3N0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5WzBdID0gLTE7Ci0JcHJlY29yZF9zdGF0cy0+UnhNSU1PU2lnbmFsUXVhbGl0eVsxXSA9IC0xOwotCi0JaWYoaXNfY2NrX3JhdGUpCi0JewotCQkvLwotCQkvLyAoMSlIYXJkd2FyZSBkb2VzIG5vdCBwcm92aWRlIFJTU0kgZm9yIENDSwotCQkvLwotCi0JCS8vCi0JCS8vICgyKVBXREIsIEF2ZXJhZ2UgUFdEQiBjYWNsdWF0ZWQgYnkgaGFyZHdhcmUgKGZvciByYXRlIGFkYXB0aXZlKQotCQkvLwotCQl1OCByZXBvcnQ7Ly8sIGNja19hZ2NfcnB0OwotCi0JCWlmICghcHJpdi0+cGh5X3JlZzgyNF9iaXQ5KQotCQl7Ci0JCQlyZXBvcnQgPSBwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJiAweGMwOwotCQkJcmVwb3J0ID0gcmVwb3J0Pj42OwotCQkJc3dpdGNoKHJlcG9ydCkKLQkJCXsKLQkJCQkvL0ZpeGVkIGJ5IEphY2tlbiBmcm9tIEJyeWFudCAyMDA4LTAzLTIwCi0JCQkJLy9PcmlnaW5hbCB2YWx1ZSBpcyAtMzggLCAtMjYgLCAtMTQgLCAtMgotCQkJCS8vRml4ZWQgdmFsdWUgaXMgLTM1ICwgLTIzICwgLTExICwgNgotCQkJCWNhc2UgMHgzOgotCQkJCQlyeF9wd3JfYWxsID0gLTM1IC0gKHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmIDB4M2UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDB4MjoKLQkJCQkJcnhfcHdyX2FsbCA9IC0yMyAtIChwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJiAweDNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAweDE6Ci0JCQkJCXJ4X3B3cl9hbGwgPSAtMTEgLSAocGNja19idWYtPmNja19hZ2NfcnB0ICYgMHgzZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMHgwOgotCQkJCQlyeF9wd3JfYWxsID0gOCAtIChwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJiAweDNlKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlyZXBvcnQgPSBwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJiAweDYwOwotCQkJcmVwb3J0ID0gcmVwb3J0Pj41OwotCQkJc3dpdGNoKHJlcG9ydCkKLQkJCXsKLQkJCQljYXNlIDB4MzoKLQkJCQkJcnhfcHdyX2FsbCA9IC0zNSAtICgocGNja19idWYtPmNja19hZ2NfcnB0ICYgMHgxZik8PDEpIDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAweDI6Ci0JCQkJCXJ4X3B3cl9hbGwgPSAtMjMgLSAoKHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmIDB4MWYpPDwxKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAweDE6Ci0JCQkJCXJ4X3B3cl9hbGwgPSAtMTEgLSAoKHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmIDB4MWYpPDwxKSA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMHgwOgotCQkJCQlyeF9wd3JfYWxsID0gLTggLSAoKHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmIDB4MWYpPDwxKSA7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcHdkYl9hbGwgPSBydGw4MTl4X3F1ZXJ5X3J4cHdycGVyY2VudGFnZShyeF9wd3JfYWxsKTsKLQkJcHN0YXRzLT5SeFBXREJBbGwgPSBwcmVjb3JkX3N0YXRzLT5SeFBXREJBbGwgPSBwd2RiX2FsbDsKLQkJcHN0YXRzLT5SZWN2U2lnbmFsUG93ZXIgPSByeF9wd3JfYWxsOwotCi0JCS8vCi0JCS8vICgzKSBHZXQgU2lnbmFsIFF1YWxpdHkgKEVWTSkKLQkJLy8KLQkJaWYoYnBhY2tldF9tYXRjaF9ic3NpZCkKLQkJewotCQkJdTgJc3E7Ci0KLQkJCWlmKHBzdGF0cy0+UnhQV0RCQWxsID4gNDApCi0JCQl7Ci0JCQkJc3EgPSAxMDA7Ci0JCQl9ZWxzZQotCQkJewotCQkJCXNxID0gcGNja19idWYtPnNxX3JwdDsKLQotCQkJCWlmKHBjY2tfYnVmLT5zcV9ycHQgPiA2NCkKLQkJCQkJc3EgPSAwOwotCQkJCWVsc2UgaWYgKHBjY2tfYnVmLT5zcV9ycHQgPCAyMCkKLQkJCQkJc3EgPSAxMDA7Ci0JCQkJZWxzZQotCQkJCQlzcSA9ICgoNjQtc3EpICogMTAwKSAvIDQ0OwotCQkJfQotCQkJcHN0YXRzLT5TaWduYWxRdWFsaXR5ID0gcHJlY29yZF9zdGF0cy0+U2lnbmFsUXVhbGl0eSA9IHNxOwotCQkJcHN0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5WzBdID0gcHJlY29yZF9zdGF0cy0+UnhNSU1PU2lnbmFsUXVhbGl0eVswXSA9IHNxOwotCQkJcHN0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5WzFdID0gcHJlY29yZF9zdGF0cy0+UnhNSU1PU2lnbmFsUXVhbGl0eVsxXSA9IC0xOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCS8vCi0JCS8vICgxKUdldCBSU1NJIGZvciBIVCByYXRlCi0JCS8vCi0JCWZvcihpPVJGOTBfUEFUSF9BOyBpPFJGOTBfUEFUSF9NQVg7IGkrKykKLQkJewotCQkJLy8gMjAwOC8wMS8zMCBNSCB3ZSB3aWxsIGp1ZGdlIFJGIFJYIHBhdGggbm93LgotCQkJaWYgKHByaXYtPmJyZnBhdGhfcnhlbmFibGVbaV0pCi0JCQkJcmZfcnhfbnVtKys7Ci0JCQkvL2Vsc2UKLQkJCQkvL2NvbnRpbnVlOwotCi0JCQkvL0ZpeGVkIGJ5IEphY2tlbiBmcm9tIEJyeWFudCAyMDA4LTAzLTIwCi0JCQkvL09yaWdpbmFsIHZhbHVlIGlzIDEwNgotCQkJcnhfcHdyW2ldID0gKChwb2ZkbV9idWYtPnRyc3dfZ2Fpbl9YW2ldJjB4M0YpKjIpIC0gMTEwOwotCi0JCQkvL0dldCBSeCBzbnIgdmFsdWUgaW4gREIKLQkJCXRtcF9yeHNuciA9IHBvZmRtX2J1Zi0+cnhzbnJfWFtpXTsKLQkJCXJ4X3NuclggPSAoY2hhcikodG1wX3J4c25yKTsKLQkJCXJ4X3NuclggLz0gMjsKLQotCQkJLyogVHJhbnNsYXRlIERCTSB0byBwZXJjZW50YWdlLiAqLwotCQkJUlNTSSA9IHJ0bDgxOXhfcXVlcnlfcnhwd3JwZXJjZW50YWdlKHJ4X3B3cltpXSk7Ci0JCQlpZiAocHJpdi0+YnJmcGF0aF9yeGVuYWJsZVtpXSkKLQkJCQl0b3RhbF9yc3NpICs9IFJTU0k7Ci0KLQkJCS8qIFJlY29yZCBTaWduYWwgU3RyZW5ndGggZm9yIG5leHQgcGFja2V0ICovCi0JCQlpZihicGFja2V0X21hdGNoX2Jzc2lkKQotCQkJewotCQkJCXBzdGF0cy0+UnhNSU1PU2lnbmFsU3RyZW5ndGhbaV0gPSh1OCkgUlNTSTsKLQkJCQlwcmVjb3JkX3N0YXRzLT5SeE1JTU9TaWduYWxTdHJlbmd0aFtpXSA9KHU4KSBSU1NJOwotCQkJfQotCQl9Ci0KLQotCQkvLwotCQkvLyAoMilQV0RCLCBBdmVyYWdlIFBXREIgY2FjbHVhdGVkIGJ5IGhhcmR3YXJlIChmb3IgcmF0ZSBhZGFwdGl2ZSkKLQkJLy8KLQkJLy9GaXhlZCBieSBKYWNrZW4gZnJvbSBCcnlhbnQgMjAwOC0wMy0yMAotCQkvL09yaWdpbmFsIHZhbHVlIGlzIDEwNgotCQlyeF9wd3JfYWxsID0gKCgocG9mZG1fYnVmLT5wd2RiX2FsbCApID4+IDEgKSYgMHg3ZikgLTEwNjsKLQkJcHdkYl9hbGwgPSBydGw4MTl4X3F1ZXJ5X3J4cHdycGVyY2VudGFnZShyeF9wd3JfYWxsKTsKLQotCQlwc3RhdHMtPlJ4UFdEQkFsbCA9IHByZWNvcmRfc3RhdHMtPlJ4UFdEQkFsbCA9IHB3ZGJfYWxsOwotCQlwc3RhdHMtPlJ4UG93ZXIgPSBwcmVjb3JkX3N0YXRzLT5SeFBvd2VyID0JcnhfcHdyX2FsbDsKLQkJcHN0YXRzLT5SZWN2U2lnbmFsUG93ZXIgPSByeF9wd3JfYWxsOwotCQkvLwotCQkvLyAoMylFVk0gb2YgSFQgcmF0ZQotCQkvLwotCQlpZihwZHJ2aW5mby0+UnhIVCAmJiBwZHJ2aW5mby0+UnhSYXRlPj1ERVNDOTBfUkFURU1DUzggJiYKLQkJCXBkcnZpbmZvLT5SeFJhdGU8PURFU0M5MF9SQVRFTUNTMTUpCi0JCQltYXhfc3BhdGlhbF9zdHJlYW0gPSAyOyAvL2JvdGggc3BhdGlhbCBzdHJlYW0gbWFrZSBzZW5zZQotCQllbHNlCi0JCQltYXhfc3BhdGlhbF9zdHJlYW0gPSAxOyAvL29ubHkgc3BhdGlhbCBzdHJlYW0gMSBtYWtlcyBzZW5zZQotCi0JCWZvcihpPTA7IGk8bWF4X3NwYXRpYWxfc3RyZWFtOyBpKyspCi0JCXsKLQkJCXRtcF9yeGV2bSA9IHBvZmRtX2J1Zi0+cnhldm1fWFtpXTsKLQkJCXJ4X2V2bVggPSAoY2hhcikodG1wX3J4ZXZtKTsKLQotCQkJLy8gRG8gbm90IHVzZSBzaGlmdCBvcGVyYXRpb24gbGlrZSAicnhfZXZtWCA+Pj0gMSIgYmVjYXVzZSB0aGUgY29tcGlsb3Igb2YgZnJlZSBidWlsZCBlbnZpcm9ubWVudAotCQkJLy8gZmlsbCBtb3N0IHNpZ25pZmljYW50IGJpdCB0byAiemVybyIgd2hlbiBkb2luZyBzaGlmdGluZyBvcGVyYXRpb24gd2hpY2ggbWF5IGNoYW5nZSBhIG5lZ2F0aXZlCi0JCQkvLyB2YWx1ZSB0byBwb3NpdGl2ZSBvbmUsIHRoZW4gdGhlIGRibSB2YWx1ZSAod2hpY2ggaXMgc3VwcG9zZWQgdG8gYmUgbmVnYXRpdmUpICBpcyBub3QgY29ycmVjdCBhbnltb3JlLgotCQkJcnhfZXZtWCAvPSAyOwkvL2RibQotCi0JCQlldm0gPSBydGw4MTl4X2V2bV9kYnRvcGVyY2VudGFnZShyeF9ldm1YKTsKLQkJCWlmKGJwYWNrZXRfbWF0Y2hfYnNzaWQpCi0JCQl7Ci0JCQkJaWYoaT09MCkgLy8gRmlsbCB2YWx1ZSBpbiBSRkQsIEdldCB0aGUgZmlyc3Qgc3BhdGlhbCBzdHJlYW0gb25seQotCQkJCQlwc3RhdHMtPlNpZ25hbFF1YWxpdHkgPSBwcmVjb3JkX3N0YXRzLT5TaWduYWxRdWFsaXR5ID0gKHU4KShldm0gJiAweGZmKTsKLQkJCQlwc3RhdHMtPlJ4TUlNT1NpZ25hbFF1YWxpdHlbaV0gPSBwcmVjb3JkX3N0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5W2ldID0gKHU4KShldm0gJiAweGZmKTsKLQkJCX0KLQkJfQotCi0KLQkJLyogcmVjb3JkIHJ4IHN0YXRpc3RpY3MgZm9yIGRlYnVnICovCi0JCXJ4c2Nfc2dpZW5fZXhmbGcgPSBwb2ZkbV9idWYtPnJ4c2Nfc2dpZW5fZXhmbGc7Ci0JCXByeHNjID0gKHBoeV9vZmRtX3J4X3N0YXR1c19yeHNjX3NnaWVuX2V4aW50ZmZsYWcgKikmcnhzY19zZ2llbl9leGZsZzsKLQl9Ci0KLQkvL1VJIEJTUyBMaXN0IHNpZ25hbCBzdHJlbmd0aChpbiBwZXJjZW50YWdlKSwgbWFrZSBpdCBnb29kIGxvb2tpbmcsIGZyb20gMH4xMDAuCi0JLy9JdCBpcyBhc3NpZ25lZCB0byB0aGUgQlNTIExpc3QgaW4gR2V0VmFsdWVGcm9tQmVhY29uT3JQcm9iZVJzcCgpLgotCWlmKGlzX2Nja19yYXRlKQotCXsKLQkJcHN0YXRzLT5TaWduYWxTdHJlbmd0aCA9IHByZWNvcmRfc3RhdHMtPlNpZ25hbFN0cmVuZ3RoID0gKHU4KShydGw4MTl4X3NpZ25hbF9zY2FsZV9tYXBwaW5nKChsb25nKXB3ZGJfYWxsKSk7Ly9QV0RCX0FMTDsKLQotCX0KLQllbHNlCi0JewotCQkvL3BSZmQtPlN0YXR1cy5TaWduYWxTdHJlbmd0aCA9IHBSZWNvcmRSZmQtPlN0YXR1cy5TaWduYWxTdHJlbmd0aCA9ICh1MUJ5dGUpKFNpZ25hbFNjYWxlTWFwcGluZyh0b3RhbF9yc3NpLz1SRjkwX1BBVEhfTUFYKSk7Ly8odTFCeXRlKSh0b3RhbF9yc3NpLz1SRjkwX1BBVEhfTUFYKTsKLQkJLy8gV2UgY2FuIGp1ZGdlIFJYIHBhdGggbnVtYmVyIG5vdy4KLQkJaWYgKHJmX3J4X251bSAhPSAwKQotCQkJcHN0YXRzLT5TaWduYWxTdHJlbmd0aCA9IHByZWNvcmRfc3RhdHMtPlNpZ25hbFN0cmVuZ3RoID0gKHU4KShydGw4MTl4X3NpZ25hbF9zY2FsZV9tYXBwaW5nKChsb25nKSh0b3RhbF9yc3NpLz1yZl9yeF9udW0pKSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotcnRsODE5Ml9yZWNvcmRfcnhkZXNjX2ZvcmxhdGVydXNlKAotCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKiBwc3JjX3N0YXRzLAotCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgKiBwdGFyZ2V0X3N0YXRzCi0pCi17Ci0JcHRhcmdldF9zdGF0cy0+YklzQU1QRFUgPSBwc3JjX3N0YXRzLT5iSXNBTVBEVTsKLQlwdGFyZ2V0X3N0YXRzLT5iRmlyc3RNUERVID0gcHNyY19zdGF0cy0+YkZpcnN0TVBEVTsKLX0KLQotCi0KLXN0YXRpYyB2b2lkIFRyYW5zbGF0ZVJ4U2lnbmFsU3R1ZmY4MTl4cGNpKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LAotICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICogcHN0YXRzLAotICAgICAgICBwcnhfZGVzY184MTl4X3BjaSBwZGVzYywKLSAgICAgICAgcHJ4X2Z3aW5mb184MTl4X3BjaSBwZHJ2aW5mbykKLXsKLSAgICAvLyBUT0RPOiBXZSBtdXN0IG9ubHkgY2hlY2sgcGFja2V0IGZvciBjdXJyZW50IE1BQyBhZGRyZXNzLiBOb3QgZmluaXNoCi0gICAgYm9vbCBicGFja2V0X21hdGNoX2Jzc2lkLCBicGFja2V0X3Rvc2VsZjsKLSAgICBib29sIGJQYWNrZXRCZWFjb249ZmFsc2UsIGJUb1NlbGZCQT1mYWxzZTsKLSAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqaGRyOwotICAgIHUxNiBmYyx0eXBlOwotCi0gICAgLy8gR2V0IFNpZ25hbCBRdWFsaXR5IGZvciBvbmx5IFJYIGRhdGEgcXVldWUgKGJ1dCBub3QgY29tbWFuZCBxdWV1ZSkKLQotICAgIHU4KiB0bXBfYnVmOwotICAgIHU4CSpwcmFkZHI7Ci0KLSAgICAvKiBHZXQgTUFDIGZyYW1lIHN0YXJ0IGFkZHJlc3MuICovCi0gICAgdG1wX2J1ZiA9IHNrYi0+ZGF0YTsKLQotICAgIGhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKXRtcF9idWY7Ci0gICAgZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7Ci0gICAgdHlwZSA9IFdMQU5fRkNfR0VUX1RZUEUoZmMpOwotICAgIHByYWRkciA9IGhkci0+YWRkcjE7Ci0KLSAgICAvKiBDaGVjayBpZiB0aGUgcmVjZWl2ZWQgcGFja2V0IGlzIGFjY2VwdGFiZS4gKi8KLSAgICBicGFja2V0X21hdGNoX2Jzc2lkID0gKChJRUVFODAyMTFfRlRZUEVfQ1RMICE9IHR5cGUpICYmCi0gICAgICAgICAgICAoIWNvbXBhcmVfZXRoZXJfYWRkcihwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwJKGZjICYgSUVFRTgwMjExX0ZDVExfVE9EUyk/IGhkci0+YWRkcjEgOiAoZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMgKT8gaGRyLT5hZGRyMiA6IGhkci0+YWRkcjMpKQotICAgICAgICAgICAgJiYgKCFwc3RhdHMtPmJId0Vycm9yKSAmJiAoIXBzdGF0cy0+YkNSQykmJiAoIXBzdGF0cy0+YklDVikpOwotICAgIGJwYWNrZXRfdG9zZWxmID0gIGJwYWNrZXRfbWF0Y2hfYnNzaWQgJiAoIWNvbXBhcmVfZXRoZXJfYWRkcihwcmFkZHIsIHByaXYtPmllZWU4MDIxMS0+ZGV2LT5kZXZfYWRkcikpOwotCi0gICAgaWYoV0xBTl9GQ19HRVRfRlJBTUVUWVBFKGZjKT09IElFRUU4MDIxMV9TVFlQRV9CRUFDT04pCi0gICAgewotICAgICAgICBiUGFja2V0QmVhY29uID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYoV0xBTl9GQ19HRVRfRlJBTUVUWVBFKGZjKSA9PSBJRUVFODAyMTFfU1RZUEVfQkxPQ0tBQ0spCi0gICAgewotICAgICAgICBpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihwcmFkZHIsIHByaXYtPmllZWU4MDIxMS0+ZGV2LT5kZXZfYWRkcikpCi0gICAgICAgICAgICBiVG9TZWxmQkEgPSB0cnVlOwotICAgIH0KLQotICAgIC8vCi0gICAgLy8gUHJvY2VzcyBQSFkgaW5mb3JtYXRpb24gZm9yIHByZXZpb3VzIHBhY2tldCAoUlNTSS9QV0RCL0VWTSkKLSAgICAvLwotICAgIC8vIEJlY2F1c2UgcGh5IGluZm9ybWF0aW9uIGlzIGNvbnRhaW5lZCBpbiB0aGUgbGFzdCBwYWNrZXQgb2YgQU1QRFUgb25seSwgc28gZHJpdmVyCi0gICAgLy8gc2hvdWxkIHByb2Nlc3MgcGh5IGluZm9ybWF0aW9uIG9mIHByZXZpb3VzIHBhY2tldAotICAgIHJ0bDgxOTJfcHJvY2Vzc19waHlpbmZvKHByaXYsIHRtcF9idWYsICZwcml2LT5wcmV2aW91c19zdGF0cywgcHN0YXRzKTsKLSAgICBydGw4MTkyX3F1ZXJ5X3J4cGh5c3RhdHVzKHByaXYsIHBzdGF0cywgcGRlc2MsIHBkcnZpbmZvLCAmcHJpdi0+cHJldmlvdXNfc3RhdHMsIGJwYWNrZXRfbWF0Y2hfYnNzaWQsCi0gICAgICAgICAgICBicGFja2V0X3Rvc2VsZiAsYlBhY2tldEJlYWNvbiwgYlRvU2VsZkJBKTsKLSAgICBydGw4MTkyX3JlY29yZF9yeGRlc2NfZm9ybGF0ZXJ1c2UocHN0YXRzLCAmcHJpdi0+cHJldmlvdXNfc3RhdHMpOwotCi19Ci0KLQotc3RhdGljIHZvaWQgcnRsODE5Ml90eF9yZXN1bWUoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBwcml2LT5pZWVlODAyMTE7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlpbnQgaTsKLQotCWZvciAoaSA9IEJLX1FVRVVFOyBpIDwgVFhDTURfUVVFVUU7IGkrKykgewotCQl3aGlsZSAoKCFza2JfcXVldWVfZW1wdHkoJmllZWUtPnNrYl93YWl0UVtpXSkpICYmCi0JCSAgICAgICAocHJpdi0+aWVlZTgwMjExLT5jaGVja19uaWNfZW5vdWdoX2Rlc2MoaWVlZSwgaSkgPiAwKSkgewotCQkJLyogMS4gZGVxdWV1ZSB0aGUgcGFja2V0IGZyb20gdGhlIHdhaXQgcXVldWUgKi8KLQkJCXNrYiA9IHNrYl9kZXF1ZXVlKCZpZWVlLT5za2Jfd2FpdFFbaV0pOwotCQkJLyogMi4gdHggdGhlIHBhY2tldCBkaXJlY3RseSAqLwotCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdChza2IsIGllZWUsIDApOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBydGw4MTkyX2lycV90eF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2KikgYXJnOwotCXN0cnVjdCBydGw4MTkyX3R4X3JpbmcgKm1nbnRfcmluZyA9ICZwcml2LT50eF9yaW5nW01HTlRfUVVFVUVdOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBjaGVjayBpZiB3ZSBuZWVkIHRvIHJlcG9ydCB0aGF0IHRoZSBtYW5hZ2VtZW50IHF1ZXVlIGlzIGRyYWluZWQgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aXJxX3RoX2xvY2ssIGZsYWdzKTsKLQotCWlmICghc2tiX3F1ZXVlX2xlbigmbWdudF9yaW5nLT5xdWV1ZSkgJiYKLQkgICAgcHJpdi0+aWVlZTgwMjExLT5hY2tfdHhfdG9faWVlZSAmJgotCSAgICBydGw4MTkyX2lzX3R4X3F1ZXVlX2VtcHR5KHByaXYtPmllZWU4MDIxMSkpIHsKLQkJcHJpdi0+aWVlZTgwMjExLT5hY2tfdHhfdG9faWVlZSA9IDA7Ci0JCWllZWU4MDIxMV9wc190eF9hY2socHJpdi0+aWVlZTgwMjExLCAxKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFfdGhfbG9jaywgZmxhZ3MpOwotCi0JcnRsODE5Ml90eF9yZXN1bWUocHJpdik7Ci19Ci0KLS8qIFJlY29yZCB0aGUgcmVjZWl2ZWQgZGF0YSByYXRlICovCi1zdGF0aWMgdm9pZCBVcGRhdGVSZWNlaXZlZFJhdGVIaXN0b2dyYW1TdGF0aXN0aWNzODE5MCgKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwKLQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzKiBwc3RhdHMKLQkpCi17Ci0JdTMyIHJjdlR5cGU9MTsgICAvLzA6IFRvdGFsLCAxOk9LLCAyOkNSQywgMzpJQ1YKLQl1MzIgcmF0ZUluZGV4OwotCXUzMiBwcmVhbWJsZV9ndWFyZGludGVydmFsOyAgLy8xOiBzaG9ydCBwcmVhbWJsZS9HSSwgMDogbG9uZyBwcmVhbWJsZS9HSQotCi0JaWYocHN0YXRzLT5iQ1JDKQotCQlyY3ZUeXBlID0gMjsKLQllbHNlIGlmKHBzdGF0cy0+YklDVikKLQkJcmN2VHlwZSA9IDM7Ci0KLQlpZihwc3RhdHMtPmJTaG9ydFByZWFtYmxlKQotCQlwcmVhbWJsZV9ndWFyZGludGVydmFsID0gMTsvLyBzaG9ydAotCWVsc2UKLQkJcHJlYW1ibGVfZ3VhcmRpbnRlcnZhbCA9IDA7Ly8gbG9uZwotCi0Jc3dpdGNoKHBzdGF0cy0+cmF0ZSkKLQl7Ci0JCS8vCi0JCS8vIENDSyByYXRlCi0JCS8vCi0JCWNhc2UgTUdOXzFNOiAgICByYXRlSW5kZXggPSAwOyAgYnJlYWs7Ci0JICAgIAljYXNlIE1HTl8yTTogICAgcmF0ZUluZGV4ID0gMTsgIGJyZWFrOwotCSAgICAJY2FzZSBNR05fNV81TTogIHJhdGVJbmRleCA9IDI7ICBicmVhazsKLQkgICAgCWNhc2UgTUdOXzExTTogICByYXRlSW5kZXggPSAzOyAgYnJlYWs7Ci0JCS8vCi0JCS8vIExlZ2FjeSBPRkRNIHJhdGUKLQkJLy8KLQkgICAgCWNhc2UgTUdOXzZNOiAgICByYXRlSW5kZXggPSA0OyAgYnJlYWs7Ci0JICAgIAljYXNlIE1HTl85TTogICAgcmF0ZUluZGV4ID0gNTsgIGJyZWFrOwotCSAgICAJY2FzZSBNR05fMTJNOiAgIHJhdGVJbmRleCA9IDY7ICBicmVhazsKLQkgICAgCWNhc2UgTUdOXzE4TTogICByYXRlSW5kZXggPSA3OyAgYnJlYWs7Ci0JICAgIAljYXNlIE1HTl8yNE06ICAgcmF0ZUluZGV4ID0gODsgIGJyZWFrOwotCSAgICAJY2FzZSBNR05fMzZNOiAgIHJhdGVJbmRleCA9IDk7ICBicmVhazsKLQkgICAgCWNhc2UgTUdOXzQ4TTogICByYXRlSW5kZXggPSAxMDsgYnJlYWs7Ci0JICAgIAljYXNlIE1HTl81NE06ICAgcmF0ZUluZGV4ID0gMTE7IGJyZWFrOwotCQkvLwotCQkvLyAxMW4gSGlnaCB0aHJvdWdocHV0IHJhdGUKLQkJLy8KLQkgICAgCWNhc2UgTUdOX01DUzA6ICByYXRlSW5kZXggPSAxMjsgYnJlYWs7Ci0JICAgIAljYXNlIE1HTl9NQ1MxOiAgcmF0ZUluZGV4ID0gMTM7IGJyZWFrOwotCSAgICAJY2FzZSBNR05fTUNTMjogIHJhdGVJbmRleCA9IDE0OyBicmVhazsKLQkgICAgCWNhc2UgTUdOX01DUzM6ICByYXRlSW5kZXggPSAxNTsgYnJlYWs7Ci0JICAgIAljYXNlIE1HTl9NQ1M0OiAgcmF0ZUluZGV4ID0gMTY7IGJyZWFrOwotCSAgICAJY2FzZSBNR05fTUNTNTogIHJhdGVJbmRleCA9IDE3OyBicmVhazsKLQkgICAgCWNhc2UgTUdOX01DUzY6ICByYXRlSW5kZXggPSAxODsgYnJlYWs7Ci0JICAgIAljYXNlIE1HTl9NQ1M3OiAgcmF0ZUluZGV4ID0gMTk7IGJyZWFrOwotCSAgICAJY2FzZSBNR05fTUNTODogIHJhdGVJbmRleCA9IDIwOyBicmVhazsKLQkgICAgCWNhc2UgTUdOX01DUzk6ICByYXRlSW5kZXggPSAyMTsgYnJlYWs7Ci0JICAgIAljYXNlIE1HTl9NQ1MxMDogcmF0ZUluZGV4ID0gMjI7IGJyZWFrOwotCSAgICAJY2FzZSBNR05fTUNTMTE6IHJhdGVJbmRleCA9IDIzOyBicmVhazsKLQkgICAgCWNhc2UgTUdOX01DUzEyOiByYXRlSW5kZXggPSAyNDsgYnJlYWs7Ci0JICAgIAljYXNlIE1HTl9NQ1MxMzogcmF0ZUluZGV4ID0gMjU7IGJyZWFrOwotCSAgICAJY2FzZSBNR05fTUNTMTQ6IHJhdGVJbmRleCA9IDI2OyBicmVhazsKLQkgICAgCWNhc2UgTUdOX01DUzE1OiByYXRlSW5kZXggPSAyNzsgYnJlYWs7Ci0JCWRlZmF1bHQ6ICAgICAgICByYXRlSW5kZXggPSAyODsgYnJlYWs7Ci0JfQotCXByaXYtPnN0YXRzLnJlY2VpdmVkX3JhdGVfaGlzdG9ncmFtWzBdW3JhdGVJbmRleF0rKzsgLy90b3RhbAotCXByaXYtPnN0YXRzLnJlY2VpdmVkX3JhdGVfaGlzdG9ncmFtW3JjdlR5cGVdW3JhdGVJbmRleF0rKzsKLX0KLQotc3RhdGljIHZvaWQgcnRsODE5Ml9yeChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLSAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8xYWRkciAqaWVlZTgwMjExX2hkciA9IE5VTEw7Ci0gICAgYm9vbCB1bmljYXN0X3BhY2tldCA9IGZhbHNlOwotICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgc3RhdHMgPSB7Ci0gICAgICAgIC5zaWduYWwgPSAwLAotICAgICAgICAubm9pc2UgPSAtOTgsCi0gICAgICAgIC5yYXRlID0gMCwKLSAgICAgICAgLmZyZXEgPSBJRUVFODAyMTFfMjRHSFpfQkFORCwKLSAgICB9OwotICAgIHVuc2lnbmVkIGludCBjb3VudCA9IHByaXYtPnJ4cmluZ2NvdW50OwotICAgIHByeF9md2luZm9fODE5eF9wY2kgcERydkluZm8gPSBOVUxMOwotICAgIHN0cnVjdCBza19idWZmICpuZXdfc2tiOwotCi0gICAgd2hpbGUgKGNvdW50LS0pIHsKLSAgICAgICAgcnhfZGVzY184MTl4X3BjaSAqcGRlc2MgPSAmcHJpdi0+cnhfcmluZ1twcml2LT5yeF9pZHhdOy8vcnggZGVzY3JpcHRvcgotICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJpdi0+cnhfYnVmW3ByaXYtPnJ4X2lkeF07Ly9yeCBwa3QKLQotICAgICAgICBpZiAocGRlc2MtPk9XTikKLSAgICAgICAgICAgIC8qIHdhaXQgZGF0YSB0byBiZSBmaWxsZWQgYnkgaGFyZHdhcmUgKi8KLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgc3RhdHMuYklDViA9IHBkZXNjLT5JQ1Y7Ci0gICAgICAgICAgICBzdGF0cy5iQ1JDID0gcGRlc2MtPkNSQzMyOwotICAgICAgICAgICAgc3RhdHMuYkh3RXJyb3IgPSBwZGVzYy0+Q1JDMzIgfCBwZGVzYy0+SUNWOwotCi0gICAgICAgICAgICBzdGF0cy5MZW5ndGggPSBwZGVzYy0+TGVuZ3RoOwotICAgICAgICAgICAgaWYoc3RhdHMuTGVuZ3RoIDwgMjQpCi0gICAgICAgICAgICAgICAgc3RhdHMuYkh3RXJyb3IgfD0gMTsKLQotICAgICAgICAgICAgaWYoc3RhdHMuYkh3RXJyb3IpIHsKLSAgICAgICAgICAgICAgICBzdGF0cy5iU2hpZnQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBnb3RvIGRvbmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcERydkluZm8gPSBOVUxMOwotICAgICAgICAgICAgICAgIG5ld19za2IgPSBkZXZfYWxsb2Nfc2tiKHByaXYtPnJ4YnVmZmVyc2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodW5saWtlbHkoIW5ld19za2IpKQotICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7Ci0KLSAgICAgICAgICAgICAgICBzdGF0cy5SeERydkluZm9TaXplID0gcGRlc2MtPlJ4RHJ2SW5mb1NpemU7Ci0gICAgICAgICAgICAgICAgc3RhdHMuUnhCdWZTaGlmdCA9ICgocGRlc2MtPlNoaWZ0KSYweDAzKTsKLSAgICAgICAgICAgICAgICBzdGF0cy5EZWNyeXB0ZWQgPSAhcGRlc2MtPlNXRGVjOwotCi0gICAgICAgICAgICAgICAgcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHByaXYtPnBkZXYsCi0gICAgICAgICAgICAgICAgICAgICAqKChkbWFfYWRkcl90ICopc2tiLT5jYiksCi0gICAgICAgICAgICAgICAgICAgICBwcml2LT5yeGJ1ZmZlcnNpemUsCi0gICAgICAgICAgICAgICAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotICAgICAgICAgICAgICAgIHNrYl9wdXQoc2tiLCBwZGVzYy0+TGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBwRHJ2SW5mbyA9IChyeF9md2luZm9fODE5eF9wY2kgKikoc2tiLT5kYXRhICsgc3RhdHMuUnhCdWZTaGlmdCk7Ci0gICAgICAgICAgICAgICAgc2tiX3Jlc2VydmUoc2tiLCBzdGF0cy5SeERydkluZm9TaXplICsgc3RhdHMuUnhCdWZTaGlmdCk7Ci0KLSAgICAgICAgICAgICAgICBzdGF0cy5yYXRlID0gSHdSYXRlVG9NUmF0ZTkwKChib29sKXBEcnZJbmZvLT5SeEhULCAodTgpcERydkluZm8tPlJ4UmF0ZSk7Ci0gICAgICAgICAgICAgICAgc3RhdHMuYlNob3J0UHJlYW1ibGUgPSBwRHJ2SW5mby0+U1BMQ1A7Ci0KLSAgICAgICAgICAgICAgICAvKiBpdCBpcyBkZWJ1ZyBvbmx5LiBJdCBzaG91bGQgYmUgZGlzYWJsZWQgaW4gcmVsZWFzZWQgZHJpdmVyLgotICAgICAgICAgICAgICAgICAqIDIwMDcuMS4xMSBieSBFbWlseQotICAgICAgICAgICAgICAgICAqICovCi0gICAgICAgICAgICAgICAgVXBkYXRlUmVjZWl2ZWRSYXRlSGlzdG9ncmFtU3RhdGlzdGljczgxOTAocHJpdiwgJnN0YXRzKTsKLQotICAgICAgICAgICAgICAgIHN0YXRzLmJJc0FNUERVID0gKHBEcnZJbmZvLT5QYXJ0QWdncj09MSk7Ci0gICAgICAgICAgICAgICAgc3RhdHMuYkZpcnN0TVBEVSA9IChwRHJ2SW5mby0+UGFydEFnZ3I9PTEpICYmIChwRHJ2SW5mby0+Rmlyc3RBR0dSPT0xKTsKLQotICAgICAgICAgICAgICAgIHN0YXRzLlRpbWVTdGFtcExvdyA9IHBEcnZJbmZvLT5UU0ZMOwotICAgICAgICAgICAgICAgIHN0YXRzLlRpbWVTdGFtcEhpZ2ggPSByZWFkX25pY19kd29yZChwcml2LCBUU0ZSKzQpOwotCi0gICAgICAgICAgICAgICAgVXBkYXRlUnhQa3RUaW1lU3RhbXA4MTkwKHByaXYsICZzdGF0cyk7Ci0KLSAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgIC8vIEdldCBUb3RhbCBvZmZzZXQgb2YgTVBEVSBGcmFtZSBCb2R5Ci0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICBpZigoc3RhdHMuUnhCdWZTaGlmdCArIHN0YXRzLlJ4RHJ2SW5mb1NpemUpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgc3RhdHMuYlNoaWZ0ID0gMTsKLQotICAgICAgICAgICAgICAgIC8qID8/Pz8gKi8KLSAgICAgICAgICAgICAgICBUcmFuc2xhdGVSeFNpZ25hbFN0dWZmODE5eHBjaShwcml2LCBza2IsICZzdGF0cywgcGRlc2MsIHBEcnZJbmZvKTsKLQotICAgICAgICAgICAgICAgIC8qIFJ4IEEtTVBEVSAqLwotICAgICAgICAgICAgICAgIGlmKHBEcnZJbmZvLT5GaXJzdEFHR1I9PTEgfHwgcERydkluZm8tPlBhcnRBZ2dyID09IDEpCi0gICAgICAgICAgICAgICAgICAgIFJUX1RSQUNFKENPTVBfUlhERVNDLCAicERydkluZm8tPkZpcnN0QUdHUiA9ICVkLCBwRHJ2SW5mby0+UGFydEFnZ3IgPSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRHJ2SW5mby0+Rmlyc3RBR0dSLCBwRHJ2SW5mby0+UGFydEFnZ3IpOwotCQkgICBza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gNC8qc0NyY0xuZyovKTsKLSAgICAgICAgICAgICAgICAvKiByeCBwYWNrZXRzIHN0YXRpc3RpY3MgKi8KLSAgICAgICAgICAgICAgICBpZWVlODAyMTFfaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzFhZGRyICopc2tiLT5kYXRhOwotICAgICAgICAgICAgICAgIHVuaWNhc3RfcGFja2V0ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICBpZihpc19icm9hZGNhc3RfZXRoZXJfYWRkcihpZWVlODAyMTFfaGRyLT5hZGRyMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy9UT0RPCi0gICAgICAgICAgICAgICAgfWVsc2UgaWYoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaWVlZTgwMjExX2hkci0+YWRkcjEpKXsKLSAgICAgICAgICAgICAgICAgICAgLy9UT0RPCi0gICAgICAgICAgICAgICAgfWVsc2UgewotICAgICAgICAgICAgICAgICAgICAvKiB1bmljYXN0IHBhY2tldCAqLwotICAgICAgICAgICAgICAgICAgICB1bmljYXN0X3BhY2tldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoIWllZWU4MDIxMV9ydGxfcngocHJpdi0+aWVlZTgwMjExLCBza2IsICZzdGF0cykpewotICAgICAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaXYtPnN0YXRzLnJ4b2srKzsKLSAgICAgICAgICAgICAgICAgICAgaWYodW5pY2FzdF9wYWNrZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPnN0YXRzLnJ4Ynl0ZXN1bmljYXN0ICs9IHNrYi0+bGVuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0JCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwgKigoZG1hX2FkZHJfdCAqKSBza2ItPmNiKSwKLQkJCXByaXYtPnJ4YnVmZmVyc2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQotICAgICAgICAgICAgICAgIHNrYiA9IG5ld19za2I7Ci0gICAgICAgICAgICAgICAgcHJpdi0+cnhfYnVmW3ByaXYtPnJ4X2lkeF0gPSBza2I7Ci0gICAgICAgICAgICAgICAgKigoZG1hX2FkZHJfdCAqKSBza2ItPmNiKSA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwgcHJpdi0+cnhidWZmZXJzaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCi1kb25lOgotICAgICAgICBwZGVzYy0+QnVmZmVyQWRkcmVzcyA9IGNwdV90b19sZTMyKCooKGRtYV9hZGRyX3QgKilza2ItPmNiKSk7Ci0gICAgICAgIHBkZXNjLT5PV04gPSAxOwotICAgICAgICBwZGVzYy0+TGVuZ3RoID0gcHJpdi0+cnhidWZmZXJzaXplOwotICAgICAgICBpZiAocHJpdi0+cnhfaWR4ID09IHByaXYtPnJ4cmluZ2NvdW50LTEpCi0gICAgICAgICAgICBwZGVzYy0+RU9SID0gMTsKLSAgICAgICAgcHJpdi0+cnhfaWR4ID0gKHByaXYtPnJ4X2lkeCArIDEpICUgcHJpdi0+cnhyaW5nY291bnQ7Ci0gICAgfQotCi19Ci0KLXN0YXRpYyB2b2lkIHJ0bDgxOTJfaXJxX3J4X3Rhc2tsZXQodW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYqKSBhcmc7Ci0JcnRsODE5Ml9yeChwcml2KTsKLQkvKiB1bm1hc2sgUkRVICovCi0gICAgICAgd3JpdGVfbmljX2R3b3JkKHByaXYsIElOVEFfTUFTSywgcmVhZF9uaWNfZHdvcmQocHJpdiwgSU5UQV9NQVNLKSB8IElNUl9SRFUpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHJ0bDgxOTJfbmV0ZGV2X29wcyA9IHsKLQkubmRvX29wZW4gPQkJCXJ0bDgxOTJfb3BlbiwKLQkubmRvX3N0b3AgPQkJCXJ0bDgxOTJfY2xvc2UsCi0JLm5kb190eF90aW1lb3V0ID0JCXR4X3RpbWVvdXQsCi0JLm5kb19kb19pb2N0bCA9CQkJcnRsODE5Ml9pb2N0bCwKLQkubmRvX3NldF9yeF9tb2RlID0JCXI4MTkyX3NldF9tdWx0aWNhc3QsCi0JLm5kb19zZXRfbWFjX2FkZHJlc3MgPQkJcjgxOTJfc2V0X21hY19hZHIsCi0JLm5kb19zdGFydF94bWl0ID0gCQlpZWVlODAyMTFfcnRsX3htaXQsCi19OwotCi1zdGF0aWMgaW50IF9fZGV2aW5pdCBydGw4MTkyX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCSBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXY9IE5VTEw7Ci0JdTggdW5pdCA9IDA7Ci0JaW50IHJldCA9IC1FTk9ERVY7Ci0JdW5zaWduZWQgbG9uZyBwbWVtX3N0YXJ0LCBwbWVtX2xlbiwgcG1lbV9mbGFnczsKLQl1OCByZXZpc2lvbmlkOwotCi0JUlRfVFJBQ0UoQ09NUF9JTklULCJDb25maWd1cmluZyBjaGlwIHJlc291cmNlc1xuIik7Ci0KLQlpZiggcGNpX2VuYWJsZV9kZXZpY2UgKHBkZXYpICl7Ci0JCVJUX1RSQUNFKENPTVBfRVJSLCJGYWlsZWQgdG8gZW5hYmxlIFBDSSBkZXZpY2UiKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcGNpX3NldF9tYXN0ZXIocGRldik7Ci0JLy9wY2lfc2V0X3dtaShwZGV2KTsKLQlwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIDB4ZmZmZmZmMDBVTEwpOwotCXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LDB4ZmZmZmZmMDBVTEwpOwotCWRldiA9IGFsbG9jX2llZWU4MDIxMShzaXplb2Yoc3RydWN0IHI4MTkyX3ByaXYpKTsKLQlpZiAoIWRldikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWxfZnJlZTsKLQl9Ci0KLQlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2KTsKLQlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOwotCXByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCXByaXYtPmllZWU4MDIxMSA9IG5ldGRldl9wcml2KGRldik7Ci0JcHJpdi0+cGRldj1wZGV2OwotCWlmKChwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yID09IFBDSV9WRU5ET1JfSURfRExJTkspJiYocGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSAweDMzMDQpKXsKLQkJcHJpdi0+aWVlZTgwMjExLT5iU3VwcG9ydFJlbW90ZVdha2VVcCA9IDE7Ci0JfSBlbHNlCi0JewotCQlwcml2LT5pZWVlODAyMTEtPmJTdXBwb3J0UmVtb3RlV2FrZVVwID0gMDsKLQl9Ci0KLQlwbWVtX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOwotCXBtZW1fbGVuID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKTsKLQlwbWVtX2ZsYWdzID0gcGNpX3Jlc291cmNlX2ZsYWdzIChwZGV2LCAxKTsKLQotCWlmICghKHBtZW1fZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkpIHsKLQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJyZWdpb24gIzEgbm90IGEgTU1JTyByZXNvdXJjZSwgYWJvcnRpbmdcbiIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCi0JLy9ETUVTRygiTWVtb3J5IG1hcHBlZCBzcGFjZSBAIDB4JTA4bHggIiwgcG1lbV9zdGFydCk7Ci0JaWYoICEgcmVxdWVzdF9tZW1fcmVnaW9uKHBtZW1fc3RhcnQsIHBtZW1fbGVuLCBSVEw4MTl4RV9NT0RVTEVfTkFNRSkpIHsKLQkJUlRfVFJBQ0UoQ09NUF9FUlIsInJlcXVlc3RfbWVtX3JlZ2lvbiBmYWlsZWQhXG4iKTsKLQkJZ290byBmYWlsOwotCX0KLQotCXByaXYtPm1lbV9zdGFydCA9IGlvcmVtYXBfbm9jYWNoZShwbWVtX3N0YXJ0LCBwbWVtX2xlbik7Ci0JaWYgKCFwcml2LT5tZW1fc3RhcnQpIHsKLQkJUlRfVFJBQ0UoQ09NUF9FUlIsImlvcmVtYXAgZmFpbGVkIVxuIik7Ci0JCWdvdG8gZmFpbDE7Ci0JfQotCi0JZGV2LT5tZW1fc3RhcnQgPSAodW5zaWduZWQgbG9uZykgcHJpdi0+bWVtX3N0YXJ0OwotCWRldi0+bWVtX2VuZCA9ICh1bnNpZ25lZCBsb25nKSAocHJpdi0+bWVtX3N0YXJ0ICsKLQkJCQkJcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSk7Ci0KLSAgICAgICAgLyogV2UgZGlzYWJsZSB0aGUgUkVUUllfVElNRU9VVCByZWdpc3RlciAoMHg0MSkgdG8ga2VlcAotICAgICAgICAgKiBQQ0kgVHggcmV0cmllcyBmcm9tIGludGVyZmVyaW5nIHdpdGggQzMgQ1BVIHN0YXRlICovCi0gICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg0MSwgMHgwMCk7Ci0KLQotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4MDgsICZyZXZpc2lvbmlkKTsKLQkvKiBJZiB0aGUgcmV2aXNpb25pZCBpcyAweDEwLCB0aGUgZGV2aWNlIHVzZXMgcnRsODE5MnNlLiAqLwotCWlmIChwZGV2LT5kZXZpY2UgPT0gMHg4MTkyICYmIHJldmlzaW9uaWQgPT0gMHgxMCkKLQkJZ290byBmYWlsMTsKLQotCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4MDUsICZ1bml0KTsKLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHgwNSwgdW5pdCAmICh+MHgwNCkpOwotCi0JZGV2LT5pcnEgPSBwZGV2LT5pcnE7Ci0JcHJpdi0+aXJxID0gMDsKLQotCWRldi0+bmV0ZGV2X29wcyA9ICZydGw4MTkyX25ldGRldl9vcHM7Ci0KLQlkZXYtPndpcmVsZXNzX2hhbmRsZXJzID0gJnI4MTkyX3d4X2hhbmRsZXJzX2RlZjsKLQlkZXYtPnR5cGU9QVJQSFJEX0VUSEVSOwotCi0JZGV2LT53YXRjaGRvZ190aW1lbyA9IEhaKjM7Ci0KLQlpZiAoZGV2X2FsbG9jX25hbWUoZGV2LCBpZm5hbWUpIDwgMCl7Ci0gICAgICAgICAgICAgICAgUlRfVFJBQ0UoQ09NUF9JTklULCAiT29wczogZGV2bmFtZSBhbHJlYWR5IHRha2VuISBUcnlpbmcgd2xhbiUlZC4uLlxuIik7Ci0JCXN0cmNweShpZm5hbWUsICJ3bGFuJWQiKTsKLQkJZGV2X2FsbG9jX25hbWUoZGV2LCBpZm5hbWUpOwotICAgICAgICB9Ci0KLQlSVF9UUkFDRShDT01QX0lOSVQsICJEcml2ZXIgcHJvYmUgY29tcGxldGVkMVxuIik7Ci0JaWYgKHJ0bDgxOTJfaW5pdChwcml2KSE9MCkgewotCQlSVF9UUkFDRShDT01QX0VSUiwgIkluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlyZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQlSVF9UUkFDRShDT01QX0lOSVQsICJkZXYgbmFtZT09PT09PT0+ICVzXG4iLGRldi0+bmFtZSk7Ci0JcnRsODE5Ml9wcm9jX2luaXRfb25lKHByaXYpOwotCi0KLQlSVF9UUkFDRShDT01QX0lOSVQsICJEcml2ZXIgcHJvYmUgY29tcGxldGVkXG4iKTsKLQlyZXR1cm4gMDsKLQotZmFpbDE6Ci0KLQlpZiAocHJpdi0+bWVtX3N0YXJ0KSB7Ci0JCWlvdW5tYXAocHJpdi0+bWVtX3N0YXJ0KTsKLQkJcmVsZWFzZV9tZW1fcmVnaW9uKCBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSksCi0JCQkJICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkgKTsKLQl9Ci0KLWZhaWw6Ci0JaWYoZGV2KXsKLQotCQlpZiAocHJpdi0+aXJxKSB7Ci0JCQlmcmVlX2lycShwcml2LT5pcnEsIHByaXYpOwotCQkJcHJpdi0+aXJxID0gMDsKLQkJfQotCQlmcmVlX2llZWU4MDIxMShkZXYpOwotCX0KLQotZmFpbF9mcmVlOgotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQotCURNRVNHKCJ3bGFuIGRyaXZlciBsb2FkIGZhaWxlZFxuIik7Ci0JcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCXJldHVybiByZXQ7Ci0KLX0KLQotLyogZGV0YWNoIGFsbCB0aGUgd29yayBhbmQgdGltZXIgc3RydWN0dXJlIGRlY2xhcmVkIG9yIGluaXRpdGlhbGl6ZWQKLSAqIGluIHI4MTkyX2luaXQgZnVuY3Rpb24uCi0gKiAqLwotc3RhdGljIHZvaWQgcnRsODE5Ml9jYW5jZWxfZGVmZXJyZWRfd29yayhzdHJ1Y3QgcjgxOTJfcHJpdiogcHJpdikKLXsKLQkvKiBjYWxsIGNhbmNlbF93b3JrX3N5bmMgaW5zdGVhZCBvZiBjYW5jZWxfZGVsYXllZF93b3JrIGlmIGFuZCBvbmx5IGlmIExpbnV4X3ZlcnNpb25fY29kZQotICAgICAgICAgKiBpcyAgb3IgaXMgbmV3ZXIgdGhhbiAyLjYuMjAgYW5kIHdvcmsgc3RydWN0dXJlIGlzIGRlZmluZWQgdG8gYmUgc3RydWN0IHdvcmtfc3RydWN0LgotICAgICAgICAgKiBPdGhlcndpc2UgY2FsbCBjYW5jZWxfZGVsYXllZF93b3JrIGlzIGVub3VnaC4KLSAgICAgICAgICogRklYTUUgKDIuNi4yMCBzaG91bGQgMi42LjIyLCB3b3JrX3N0cnVjdCBzaG91bGQgbm90IGNhbmNlbCkKLSAgICAgICAgICogKi8KLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT53YXRjaF9kb2dfd3EpOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPnVwZGF0ZV9iZWFjb25fd3EpOwotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmllZWU4MDIxMS0+aHdfd2FrZXVwX3dxKTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5ncGlvX2NoYW5nZV9yZl93cSk7Ci0JY2FuY2VsX3dvcmtfc3luYygmcHJpdi0+cmVzZXRfd3EpOwotCWNhbmNlbF93b3JrX3N5bmMoJnByaXYtPnFvc19hY3RpdmF0ZSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgX19kZXZleGl0IHJ0bDgxOTJfcGNpX2Rpc2Nvbm5lY3Qoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA7Ci0JdTMyIGk7Ci0KLQlpZiAoZGV2KSB7Ci0KLQkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQotCQlwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQotCQlydGw4MTkyX3Byb2NfcmVtb3ZlX29uZShwcml2KTsKLQotCQlydGw4MTkyX2Rvd24oZGV2KTsKLQkJaWYgKHByaXYtPnBGaXJtd2FyZSkKLQkJewotCQkJdmZyZWUocHJpdi0+cEZpcm13YXJlKTsKLQkJCXByaXYtPnBGaXJtd2FyZSA9IE5VTEw7Ci0JCX0KLQkJZGVzdHJveV93b3JrcXVldWUocHJpdi0+cHJpdl93cSk7Ci0KLQkJLyogZnJlZSB0eC9yeCByaW5ncyAqLwotCQlydGw4MTkyX2ZyZWVfcnhfcmluZyhwcml2KTsKLQkJZm9yIChpID0gMDsgaSA8IE1BWF9UWF9RVUVVRV9DT1VOVDsgaSsrKQotCQkJcnRsODE5Ml9mcmVlX3R4X3JpbmcocHJpdiwgaSk7Ci0KLQkJaWYgKHByaXYtPmlycSkgewotCQkJcHJpbnRrKCJGcmVlaW5nIGlycSAlZFxuIiwgcHJpdi0+aXJxKTsKLQkJCWZyZWVfaXJxKHByaXYtPmlycSwgcHJpdik7Ci0JCQlwcml2LT5pcnEgPSAwOwotCQl9Ci0KLQkJaWYgKHByaXYtPm1lbV9zdGFydCkgewotCQkJaW91bm1hcChwcml2LT5tZW1fc3RhcnQpOwotCQkJcmVsZWFzZV9tZW1fcmVnaW9uKCBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSksCi0JCQkJCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpICk7Ci0JCX0KLQotCQlmcmVlX2llZWU4MDIxMShkZXYpOwotCX0KLQotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQlSVF9UUkFDRShDT01QX0RPV04sICJ3bGFuIGRyaXZlciByZW1vdmVkXG4iKTsKLX0KLQotZXh0ZXJuIGludCBpZWVlODAyMTFfcnRsX2luaXQodm9pZCk7Ci1leHRlcm4gdm9pZCBpZWVlODAyMTFfcnRsX2V4aXQodm9pZCk7Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJ0bDgxOTJfcGNpX21vZHVsZV9pbml0KHZvaWQpCi17Ci0JaW50IHJldHZhbDsKLQotCXJldHZhbCA9IGllZWU4MDIxMV9ydGxfaW5pdCgpOwotCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJcbkxpbnV4IGtlcm5lbCBkcml2ZXIgZm9yIFJUTDgxOTIgYmFzZWQgV0xBTiBjYXJkc1xuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiQ29weXJpZ2h0IChjKSAyMDA3LTIwMDgsIFJlYWxzaWwgV2xhblxuIik7Ci0JUlRfVFJBQ0UoQ09NUF9JTklULCAiSW5pdGlhbGl6aW5nIG1vZHVsZVxuIik7Ci0JcnRsODE5Ml9wcm9jX21vZHVsZV9pbml0KCk7Ci0gICAgICBpZigwIT1wY2lfcmVnaXN0ZXJfZHJpdmVyKCZydGw4MTkyX3BjaV9kcml2ZXIpKQotCXsKLQkJRE1FU0coIk5vIGRldmljZSBmb3VuZCIpOwotCQkvKnBjaV91bnJlZ2lzdGVyX2RyaXZlciAoJnJ0bDgxOTJfcGNpX2RyaXZlcik7Ki8KLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCBydGw4MTkyX3BjaV9tb2R1bGVfZXhpdCh2b2lkKQotewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcnRsODE5Ml9wY2lfZHJpdmVyKTsKLQotCVJUX1RSQUNFKENPTVBfRE9XTiwgIkV4aXRpbmdcbiIpOwotCXJ0bDgxOTJfcHJvY19tb2R1bGVfcmVtb3ZlKCk7Ci0JaWVlZTgwMjExX3J0bF9leGl0KCk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBydGw4MTkyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpwYXJhbSkKLXsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHBhcmFtOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5pZWVlODAyMTEtPmRldjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiBpbnRhOwotCWlycXJldHVybl90IHJldCA9IElSUV9IQU5ETEVEOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmlycV90aF9sb2NrLCBmbGFncyk7Ci0KLQkvKiBJU1I6IDRieXRlcyAqLwotCi0JaW50YSA9IHJlYWRfbmljX2R3b3JkKHByaXYsIElTUik7IC8qICYgcHJpdi0+SW50ck1hc2s7ICovCi0Jd3JpdGVfbmljX2R3b3JkKHByaXYsIElTUiwgaW50YSk7IC8qIHJlc2V0IGludCBzaXR1YXRpb24gKi8KLQotCWlmICghaW50YSkgewotCQkvKgotCQkgKiBtb3N0IHByb2JhYmx5IHdlIGNhbiBzYWZlbHkgcmV0dXJuIElSUV9OT05FLAotCQkgKiBidXQgZm9yIG5vdyBpcyBiZXR0ZXIgdG8gYXZvaWQgcHJvYmxlbXMKLQkJICovCi0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KLQlpZiAoaW50YSA9PSAweGZmZmYpIHsKLQkJLyogSFcgZGlzYXBwYXJlZCAqLwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0JaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCi0JCWdvdG8gb3V0X3VubG9jazsKLQotCWlmIChpbnRhICYgSU1SX1RCRE9LKSB7Ci0JCVJUX1RSQUNFKENPTVBfSU5UUiwgImJlYWNvbiBvayBpbnRlcnJ1cHQhXG4iKTsKLQkJcnRsODE5Ml90eF9pc3IocHJpdiwgQkVBQ09OX1FVRVVFKTsKLQkJcHJpdi0+c3RhdHMudHhiZWFjb25va2ludCsrOwotCX0KLQotCWlmIChpbnRhICYgSU1SX1RCREVSKSB7Ci0JCVJUX1RSQUNFKENPTVBfSU5UUiwgImJlYWNvbiBvayBpbnRlcnJ1cHQhXG4iKTsKLQkJcnRsODE5Ml90eF9pc3IocHJpdiwgQkVBQ09OX1FVRVVFKTsKLQkJcHJpdi0+c3RhdHMudHhiZWFjb25lcnIrKzsKLQl9Ci0KLQlpZiAoaW50YSAmIElNUl9NR05URE9LICkgewotCQlSVF9UUkFDRShDT01QX0lOVFIsICJNYW5hZ2Ugb2sgaW50ZXJydXB0IVxuIik7Ci0JCXByaXYtPnN0YXRzLnR4bWFuYWdlb2tpbnQrKzsKLQkJcnRsODE5Ml90eF9pc3IocHJpdiwgTUdOVF9RVUVVRSk7Ci0JfQotCi0JaWYgKGludGEgJiBJTVJfQ09NRE9LKQotCXsKLQkJcHJpdi0+c3RhdHMudHhjbWRwa3Rva2ludCsrOwotCQlydGw4MTkyX3R4X2lzcihwcml2LCBUWENNRF9RVUVVRSk7Ci0JfQotCi0JaWYgKGludGEgJiBJTVJfUk9LKSB7Ci0JCXByaXYtPnN0YXRzLnJ4aW50Kys7Ci0JCXRhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmlycV9yeF90YXNrbGV0KTsKLQl9Ci0KLQlpZiAoaW50YSAmIElNUl9CY25JbnQpIHsKLQkJUlRfVFJBQ0UoQ09NUF9JTlRSLCAicHJlcGFyZSBiZWFjb24gZm9yIGludGVycnVwdCFcbiIpOwotCQl0YXNrbGV0X3NjaGVkdWxlKCZwcml2LT5pcnFfcHJlcGFyZV9iZWFjb25fdGFza2xldCk7Ci0JfQotCi0JaWYgKGludGEgJiBJTVJfUkRVKSB7Ci0JCVJUX1RSQUNFKENPTVBfSU5UUiwgInJ4IGRlc2NyaXB0b3IgdW5hdmFpbGFibGUhXG4iKTsKLQkJcHJpdi0+c3RhdHMucnhyZHUrKzsKLQkJLyogcmVzZXQgaW50IHNpdHVhdGlvbiAqLwotCQl3cml0ZV9uaWNfZHdvcmQocHJpdiwgSU5UQV9NQVNLLCByZWFkX25pY19kd29yZChwcml2LCBJTlRBX01BU0spICYgfklNUl9SRFUpOwotCQl0YXNrbGV0X3NjaGVkdWxlKCZwcml2LT5pcnFfcnhfdGFza2xldCk7Ci0JfQotCi0JaWYgKGludGEgJiBJTVJfUlhGT1ZXKSB7Ci0JCVJUX1RSQUNFKENPTVBfSU5UUiwgInJ4IG92ZXJmbG93ICFcbiIpOwotCQlwcml2LT5zdGF0cy5yeG92ZXJmbG93Kys7Ci0JCXRhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmlycV9yeF90YXNrbGV0KTsKLQl9Ci0KLQlpZiAoaW50YSAmIElNUl9UWEZPVlcpCi0JCXByaXYtPnN0YXRzLnR4b3ZlcmZsb3crKzsKLQotCWlmIChpbnRhICYgSU1SX0JLRE9LKSB7Ci0JCVJUX1RSQUNFKENPTVBfSU5UUiwgIkJLIFR4IE9LIGludGVycnVwdCFcbiIpOwotCQlwcml2LT5zdGF0cy50eGJrb2tpbnQrKzsKLQkJcHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5OdW1UeE9rSW5QZXJpb2QrKzsKLQkJcnRsODE5Ml90eF9pc3IocHJpdiwgQktfUVVFVUUpOwotCX0KLQotCWlmIChpbnRhICYgSU1SX0JFRE9LKSB7Ci0JCVJUX1RSQUNFKENPTVBfSU5UUiwgIkJFIFRYIE9LIGludGVycnVwdCFcbiIpOwotCQlwcml2LT5zdGF0cy50eGJlb2tpbnQrKzsKLQkJcHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5OdW1UeE9rSW5QZXJpb2QrKzsKLQkJcnRsODE5Ml90eF9pc3IocHJpdiwgQkVfUVVFVUUpOwotCX0KLQotCWlmIChpbnRhICYgSU1SX1ZJRE9LKSB7Ci0JCVJUX1RSQUNFKENPTVBfSU5UUiwgIlZJIFRYIE9LIGludGVycnVwdCFcbiIpOwotCQlwcml2LT5zdGF0cy50eHZpb2tpbnQrKzsKLQkJcHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5OdW1UeE9rSW5QZXJpb2QrKzsKLQkJcnRsODE5Ml90eF9pc3IocHJpdiwgVklfUVVFVUUpOwotCX0KLQotCWlmIChpbnRhICYgSU1SX1ZPRE9LKSB7Ci0JCXByaXYtPnN0YXRzLnR4dm9va2ludCsrOwotCQlwcml2LT5pZWVlODAyMTEtPkxpbmtEZXRlY3RJbmZvLk51bVR4T2tJblBlcmlvZCsrOwotCQlydGw4MTkyX3R4X2lzcihwcml2LCBWT19RVUVVRSk7Ci0JfQotCi1vdXRfdW5sb2NrOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycV90aF9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIEVuYWJsZUhXU2VjdXJpdHlDb25maWc4MTkyKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotICAgICAgICB1OCBTRUNSX3ZhbHVlID0gMHgwOwotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlID0gcHJpdi0+aWVlZTgwMjExOwotCi0JU0VDUl92YWx1ZSA9IFNDUl9UeEVuY0VuYWJsZSB8IFNDUl9SeERlY0VuYWJsZTsKLQotCWlmICgoKEtFWV9UWVBFX1dFUDQwID09IGllZWUtPnBhaXJ3aXNlX2tleV90eXBlKSB8fCAoS0VZX1RZUEVfV0VQMTA0ID09IGllZWUtPnBhaXJ3aXNlX2tleV90eXBlKSkgJiYgKHByaXYtPmllZWU4MDIxMS0+YXV0aF9tb2RlICE9IDIpKQotCXsKLQkJU0VDUl92YWx1ZSB8PSBTQ1JfUnhVc2VESzsKLQkJU0VDUl92YWx1ZSB8PSBTQ1JfVHhVc2VESzsKLQl9Ci0JZWxzZSBpZiAoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgJiYgKGllZWUtPnBhaXJ3aXNlX2tleV90eXBlICYgKEtFWV9UWVBFX0NDTVAgfCBLRVlfVFlQRV9US0lQKSkpCi0JewotCQlTRUNSX3ZhbHVlIHw9IFNDUl9SeFVzZURLOwotCQlTRUNSX3ZhbHVlIHw9IFNDUl9UeFVzZURLOwotCX0KLQotICAgICAgICAvL2FkZCBIV1NlYyBhY3RpdmUgZW5hYmxlIGhlcmUuCi0vL2RlZmF1bHQgdXNpbmcgaHdzZWMuIHdoZW4gcGVlciBBUCBpcyBpbiBOIG1vZGUgb25seSBhbmQgcGFpcndpc2Vfa2V5X3R5cGUgaXMgbm9uZV9hZXMod2hpY2ggSFRfSU9UX0FDVF9QVVJFX05fTU9ERSBpbmRpY2F0ZXMgaXQpLCB1c2Ugc29mdHdhcmUgc2VjdXJpdHkuIHdoZW4gcGVlciBBUCBpcyBpbiBiLGcsbiBtb2RlIG1peGVkIGFuZCBwYWlyd2lzZV9rZXlfdHlwZSBpcyBub25lX2FlcywgdXNlIGcgbW9kZSBodyBzZWN1cml0eS4gV0Igb24gMjAwOC43LjQKLQlpZWVlLT5od3NlY19hY3RpdmUgPSAxOwotCi0JaWYgKChpZWVlLT5wSFRJbmZvLT5JT1RBY3Rpb24mSFRfSU9UX0FDVF9QVVJFX05fTU9ERSkgfHwgIWh3d2VwKS8vIWllZWUtPmh3c2VjX3N1cHBvcnQpIC8vYWRkIGh3c2VjX3N1cHBvcnQgZmxhZyB0byB0b3RvbCBjb250cm9sIGh3X3NlYyBvbi9vZmYKLQl7Ci0JCWllZWUtPmh3c2VjX2FjdGl2ZSA9IDA7Ci0JCVNFQ1JfdmFsdWUgJj0gflNDUl9SeERlY0VuYWJsZTsKLQl9Ci0KLQlSVF9UUkFDRShDT01QX1NFQywiJXM6LCBod3NlYzolZCwgcGFpcndpc2Vfa2V5OiVkLCBTRUNSX3ZhbHVlOiV4XG4iLCBfX0ZVTkNUSU9OX18sCi0JCQlpZWVlLT5od3NlY19hY3RpdmUsIGllZWUtPnBhaXJ3aXNlX2tleV90eXBlLCBTRUNSX3ZhbHVlKTsKLQl7Ci0gICAgICAgICAgICAgICAgd3JpdGVfbmljX2J5dGUocHJpdiwgU0VDUiwgIFNFQ1JfdmFsdWUpOy8vU0VDUl92YWx1ZSB8ICBTQ1JfVXNlREsgKTsKLSAgICAgICAgfQotCi19Ci0jZGVmaW5lIFRPVEFMX0NBTV9FTlRSWSAzMgotLy8jZGVmaW5lIENBTV9DT05URU5UX0NPVU5UIDgKLXZvaWQgc2V0S2V5KHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCB1OCBFbnRyeU5vLCB1OCBLZXlJbmRleCwgdTE2IEtleVR5cGUsCi0JICAgIGNvbnN0IHU4ICpNYWNBZGRyLCB1OCBEZWZhdWx0S2V5LCB1MzIgKktleUNvbnRlbnQpCi17Ci0JdTMyIFRhcmdldENvbW1hbmQgPSAwOwotCXUzMiBUYXJnZXRDb250ZW50ID0gMDsKLQl1MTYgdXNDb25maWcgPSAwOwotCXU4IGk7Ci0jaWZkZWYgRU5BQkxFX0lQUwotCVJUX1JGX1BPV0VSX1NUQVRFCXJ0U3RhdGU7Ci0KLQlydFN0YXRlID0gcHJpdi0+ZVJGUG93ZXJTdGF0ZTsKLQlpZiAocHJpdi0+UG93ZXJTYXZlQ29udHJvbC5iSW5hY3RpdmVQcyl7Ci0JCWlmKHJ0U3RhdGUgPT0gZVJmT2ZmKXsKLQkJCWlmKHByaXYtPlJmT2ZmUmVhc29uID4gUkZfQ0hBTkdFX0JZX0lQUykKLQkJCXsKLQkJCQlSVF9UUkFDRShDT01QX0VSUiwgIiVzKCk6IFJGIGlzIE9GRi5cbiIsX19GVU5DVElPTl9fKTsKLQkJCQkvL3VwKCZwcml2LT53eF9zZW0pOwotCQkJCXJldHVybiA7Ci0JCQl9Ci0JCQllbHNlewotCQkJCWRvd24oJnByaXYtPmllZWU4MDIxMS0+aXBzX3NlbSk7Ci0JCQkJSVBTTGVhdmUocHJpdik7Ci0JCQkJdXAoJnByaXYtPmllZWU4MDIxMS0+aXBzX3NlbSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJpdi0+aWVlZTgwMjExLT5pc19zZXRfa2V5ID0gdHJ1ZTsKLSNlbmRpZgotCWlmIChFbnRyeU5vID49IFRPVEFMX0NBTV9FTlRSWSkKLQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJjYW0gZW50cnkgZXhjZWVkcyBpbiBzZXRLZXkoKVxuIik7Ci0KLQlSVF9UUkFDRShDT01QX1NFQywgIj09PT0+dG8gc2V0S2V5KCksIHByaXY6JXAsIEVudHJ5Tm86JWQsIEtleUluZGV4OiVkLCBLZXlUeXBlOiVkLCBNYWNBZGRyJXBNXG4iLCBwcml2LCBFbnRyeU5vLCBLZXlJbmRleCwgS2V5VHlwZSwgTWFjQWRkcik7Ci0KLQlpZiAoRGVmYXVsdEtleSkKLQkJdXNDb25maWcgfD0gQklUMTUgfCAoS2V5VHlwZTw8Mik7Ci0JZWxzZQotCQl1c0NvbmZpZyB8PSBCSVQxNSB8IChLZXlUeXBlPDwyKSB8IEtleUluZGV4OwotLy8JdXNDb25maWcgfD0gQklUMTUgfCAoS2V5VHlwZTw8MikgfCAoRGVmYXVsdEtleTw8NSkgfCBLZXlJbmRleDsKLQotCi0JZm9yKGk9MCA7IGk8Q0FNX0NPTlRFTlRfQ09VTlQ7IGkrKyl7Ci0JCVRhcmdldENvbW1hbmQgID0gaStDQU1fQ09OVEVOVF9DT1VOVCpFbnRyeU5vOwotCQlUYXJnZXRDb21tYW5kIHw9IEJJVDMxfEJJVDE2OwotCi0JCWlmKGk9PTApey8vTUFDfENvbmZpZwotCQkJVGFyZ2V0Q29udGVudCA9ICh1MzIpKCooTWFjQWRkciswKSkgPDwgMTZ8Ci0JCQkJCSh1MzIpKCooTWFjQWRkcisxKSkgPDwgMjR8Ci0JCQkJCSh1MzIpdXNDb25maWc7Ci0KLQkJCXdyaXRlX25pY19kd29yZChwcml2LCBXQ0FNSSwgVGFyZ2V0Q29udGVudCk7Ci0JCQl3cml0ZV9uaWNfZHdvcmQocHJpdiwgUldDQU0sIFRhcmdldENvbW1hbmQpOwotCQl9Ci0JCWVsc2UgaWYoaT09MSl7Ly9NQUMKLSAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldENvbnRlbnQgPSAodTMyKSgqKE1hY0FkZHIrMikpIAkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1MzIpKCooTWFjQWRkciszKSkgPDwgIDh8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMikoKihNYWNBZGRyKzQpKSA8PCAxNnwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodTMyKSgqKE1hY0FkZHIrNSkpIDw8IDI0OwotCQkJd3JpdGVfbmljX2R3b3JkKHByaXYsIFdDQU1JLCBUYXJnZXRDb250ZW50KTsKLQkJCXdyaXRlX25pY19kd29yZChwcml2LCBSV0NBTSwgVGFyZ2V0Q29tbWFuZCk7Ci0JCX0KLQkJZWxzZSB7CS8vS2V5IE1hdGVyaWFsCi0JCQlpZihLZXlDb250ZW50ICE9IE5VTEwpCi0JCQl7Ci0JCQl3cml0ZV9uaWNfZHdvcmQocHJpdiwgV0NBTUksICh1MzIpKCooS2V5Q29udGVudCtpLTIpKSApOwotCQkJd3JpdGVfbmljX2R3b3JkKHByaXYsIFJXQ0FNLCBUYXJnZXRDb21tYW5kKTsKLQkJfQotCX0KLQl9Ci0JUlRfVFJBQ0UoQ09NUF9TRUMsIj09PT09PT09PT5hZnRlciBzZXQga2V5LCB1c2NvbmZpZzoleFxuIiwgdXNDb25maWcpOwotfQotCi1ib29sIE5pY0lGRW5hYmxlTklDKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCVJUX1NUQVRVUyBpbml0X3N0YXR1cyA9IFJUX1NUQVRVU19TVUNDRVNTOwotCVBSVF9QT1dFUl9TQVZFX0NPTlRST0wgcFBTQyA9ICZwcml2LT5Qb3dlclNhdmVDb250cm9sOwotCi0JLy9ZSixhZGQsMDkxMTA5Ci0JaWYgKHByaXYtPnVwID09IDApewotCQlSVF9UUkFDRShDT01QX0VSUiwgIkVSUiEhISAlcygpOiBEcml2ZXIgaXMgYWxyZWFkeSBkb3duIVxuIixfX0ZVTkNUSU9OX18pOwotCQlwcml2LT5iZGlzYWJsZV9uaWMgPSBmYWxzZTsgIC8vWUosYWRkLDA5MTExMQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8vIDwxPiBSZXNldCBtZW1vcnk6IGRlc2NyaXB0b3IsIGJ1ZmZlciwuLgotCS8vTmljSUZSZXNldE1lbW9yeShBZGFwdGVyKTsKLQotCS8vIDwyPiBFbmFibGUgQWRhcHRlcgotCS8vcHJpdi0+YmZpcnN0X2luaXQgPSB0cnVlOwotCWluaXRfc3RhdHVzID0gcnRsODE5Ml9hZGFwdGVyX3N0YXJ0KHByaXYpOwotCWlmIChpbml0X3N0YXR1cyAhPSBSVF9TVEFUVVNfU1VDQ0VTUykgewotCQlSVF9UUkFDRShDT01QX0VSUiwiRVJSISEhICVzKCk6IGluaXRpYWxpemF0aW9uIGlzIGZhaWxlZCFcbiIsX19GVU5DVElPTl9fKTsKLQkJcHJpdi0+YmRpc2FibGVfbmljID0gZmFsc2U7ICAvL1lKLGFkZCwwOTExMTEKLQkJcmV0dXJuIC0xOwotCX0KLQlSVF9DTEVBUl9QU19MRVZFTChwUFNDLCBSVF9SRl9PRkZfTEVWTF9IQUxUX05JQyk7Ci0JLy9wcml2LT5iZmlyc3RfaW5pdCA9IGZhbHNlOwotCi0JLy8gPDM+IEVuYWJsZSBJbnRlcnJ1cHQKLQlydGw4MTkyX2lycV9lbmFibGUocHJpdik7Ci0JcHJpdi0+YmRpc2FibGVfbmljID0gZmFsc2U7Ci0KLQlyZXR1cm4gKGluaXRfc3RhdHVzID09IFJUX1NUQVRVU19TVUNDRVNTKTsKLX0KLQotYm9vbCBOaWNJRkRpc2FibGVOSUMoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0JYm9vbAlzdGF0dXMgPSB0cnVlOwotCXU4IHRtcF9zdGF0ZSA9IDA7Ci0JLy8gPDE+IERpc2FibGUgSW50ZXJydXB0Ci0KLQlwcml2LT5iZGlzYWJsZV9uaWMgPSB0cnVlOwkvL1lKLG1vdmUsMDkxMTA5Ci0JdG1wX3N0YXRlID0gcHJpdi0+aWVlZTgwMjExLT5zdGF0ZTsKLQotCWllZWU4MDIxMV9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wocHJpdi0+aWVlZTgwMjExLCBmYWxzZSk7Ci0KLQlwcml2LT5pZWVlODAyMTEtPnN0YXRlID0gdG1wX3N0YXRlOwotCXJ0bDgxOTJfY2FuY2VsX2RlZmVycmVkX3dvcmsocHJpdik7Ci0JcnRsODE5Ml9pcnFfZGlzYWJsZShwcml2KTsKLQkvLyA8Mj4gU3RvcCBhbGwgdGltZXIKLQotCS8vIDwzPiBEaXNhYmxlIEFkYXB0ZXIKLQlydGw4MTkyX2hhbHRfYWRhcHRlcihwcml2LCBmYWxzZSk7Ci0vLwlwcml2LT5iZGlzYWJsZV9uaWMgPSB0cnVlOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotbW9kdWxlX2luaXQocnRsODE5Ml9wY2lfbW9kdWxlX2luaXQpOwotbW9kdWxlX2V4aXQocnRsODE5Ml9wY2lfbW9kdWxlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9kZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA4YWFiNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfZGV2LmMKQEAgLTAsMCArMSwyMzk1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBCYXNlZCBvbiB0aGUgcjgxODAgZHJpdmVyLCB3aGljaCBpczoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDUgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PiwgZXQgYWwuCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAicnRsX2NvcmUuaCIKKyNpbmNsdWRlICJyODE5MkVfcGh5LmgiCisjaW5jbHVkZSAicjgxOTJFX3BoeXJlZy5oIgorI2luY2x1ZGUgInI4MTkwUF9ydGw4MjU2LmgiCisjaW5jbHVkZSAicjgxOTJFX2NtZHBrdC5oIgorI2luY2x1ZGUgInJ0bF9kbS5oIgorI2luY2x1ZGUgInJ0bF93eC5oIgorCitleHRlcm4gaW50IFdEQ0FQQVJBX0FERFtdOworCit2b2lkIHJ0bDgxOTJlX3N0YXJ0X2JlYWNvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopcnRsbGliX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKm5ldCA9ICZwcml2LT5ydGxsaWItPmN1cnJlbnRfbmV0d29yazsKKwl1MTYgQmNuVGltZUNmZyA9IDA7CisJdTE2IEJjbkNXID0gNjsKKwl1MTYgQmNuSUZTID0gMHhmOworCisJRE1FU0coIkVuYWJsaW5nIGJlYWNvbiBUWCIpOworCXJ0bDgxOTJfaXJxX2Rpc2FibGUoZGV2KTsKKworCXdyaXRlX25pY193b3JkKGRldiwgQVRJTVdORCwgMik7CisKKwl3cml0ZV9uaWNfd29yZChkZXYsIEJDTl9JTlRFUlZBTCwgbmV0LT5iZWFjb25faW50ZXJ2YWwpOworCXdyaXRlX25pY193b3JkKGRldiwgQkNOX0RSVl9FQVJMWV9JTlQsIDEwKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIEJDTl9ETUFUSU1FLCAyNTYpOworCisJd3JpdGVfbmljX2J5dGUoZGV2LCBCQ05fRVJSX1RIUkVTSCwgMTAwKTsKKworCUJjblRpbWVDZmcgfD0gQmNuQ1c8PEJDTl9UQ0ZHX0NXX1NISUZUOworCUJjblRpbWVDZmcgfD0gQmNuSUZTPDxCQ05fVENGR19JRlM7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBCQ05fVENGRywgQmNuVGltZUNmZyk7CisJcnRsODE5Ml9pcnFfZW5hYmxlKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxOTJlX3VwZGF0ZV9tc3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJdTggbXNyOworCWVudW0gbGVkX2N0bF9tb2RlIExlZEFjdGlvbiA9IExFRF9DVExfTk9fTElOSzsKKwltc3IgID0gcmVhZF9uaWNfYnl0ZShkZXYsIE1TUik7CisJbXNyICY9IH5NU1JfTElOS19NQVNLOworCisJc3dpdGNoIChwcml2LT5ydGxsaWItPml3X21vZGUpIHsKKwljYXNlIElXX01PREVfSU5GUkE6CisJCWlmIChwcml2LT5ydGxsaWItPnN0YXRlID09IFJUTExJQl9MSU5LRUQpCisJCQltc3IgfD0gKE1TUl9MSU5LX01BTkFHRUQgPDwgTVNSX0xJTktfU0hJRlQpOworCQllbHNlCisJCQltc3IgfD0gKE1TUl9MSU5LX05PTkUgPDwgTVNSX0xJTktfU0hJRlQpOworCQlMZWRBY3Rpb24gPSBMRURfQ1RMX0xJTks7CisJCWJyZWFrOworCWNhc2UgSVdfTU9ERV9BREhPQzoKKwkJaWYgKHByaXYtPnJ0bGxpYi0+c3RhdGUgPT0gUlRMTElCX0xJTktFRCkKKwkJCW1zciB8PSAoTVNSX0xJTktfQURIT0MgPDwgTVNSX0xJTktfU0hJRlQpOworCQllbHNlCisJCQltc3IgfD0gKE1TUl9MSU5LX05PTkUgPDwgTVNSX0xJTktfU0hJRlQpOworCQlicmVhazsKKwljYXNlIElXX01PREVfTUFTVEVSOgorCQlpZiAocHJpdi0+cnRsbGliLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEKQorCQkJbXNyIHw9IChNU1JfTElOS19NQVNURVIgPDwgTVNSX0xJTktfU0hJRlQpOworCQllbHNlCisJCQltc3IgfD0gKE1TUl9MSU5LX05PTkUgPDwgTVNSX0xJTktfU0hJRlQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIE1TUiwgbXNyKTsKKwlpZiAocHJpdi0+cnRsbGliLT5MZWRDb250cm9sSGFuZGxlcikKKwkJcHJpdi0+cnRsbGliLT5MZWRDb250cm9sSGFuZGxlcihkZXYsIExlZEFjdGlvbik7Cit9CisKK3ZvaWQgcnRsODE5MmVfU2V0SHdSZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggdmFyaWFibGUsIHU4ICp2YWwpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJc3dpdGNoICh2YXJpYWJsZSkgeworCWNhc2UgSFdfVkFSX0JTU0lEOgorCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBCU1NJRFIsICgodTMyICopKHZhbCkpWzBdKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBCU1NJRFIrMiwgKCh1MTYgKikodmFsKzIpKVswXSk7CisJCWJyZWFrOworCisJY2FzZSBIV19WQVJfTUVESUFfU1RBVFVTOgorCXsKKwkJZW51bSBydF9vcF9tb2RlIE9wTW9kZSA9ICooKGVudW0gcnRfb3BfbW9kZSAqKSh2YWwpKTsKKwkJZW51bSBsZWRfY3RsX21vZGUgTGVkQWN0aW9uID0gTEVEX0NUTF9OT19MSU5LOworCQl1OAkJYnRNc3IgPSByZWFkX25pY19ieXRlKGRldiwgTVNSKTsKKworCQlidE1zciAmPSAweGZjOworCisJCXN3aXRjaCAoT3BNb2RlKSB7CisJCWNhc2UgUlRfT1BfTU9ERV9JTkZSQVNUUlVDVFVSRToKKwkJCWJ0TXNyIHw9IE1TUl9JTkZSQTsKKwkJCUxlZEFjdGlvbiA9IExFRF9DVExfTElOSzsKKwkJCWJyZWFrOworCisJCWNhc2UgUlRfT1BfTU9ERV9JQlNTOgorCQkJYnRNc3IgfD0gTVNSX0FESE9DOworCQkJYnJlYWs7CisKKwkJY2FzZSBSVF9PUF9NT0RFX0FQOgorCQkJYnRNc3IgfD0gTVNSX0FQOworCQkJTGVkQWN0aW9uID0gTEVEX0NUTF9MSU5LOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJ0TXNyIHw9IE1TUl9OT0xJTks7CisJCQlicmVhazsKKwkJfQorCisJCXdyaXRlX25pY19ieXRlKGRldiwgTVNSLCBidE1zcik7CisKKwl9CisJYnJlYWs7CisKKwljYXNlIEhXX1ZBUl9DRUNIS19CU1NJRDoKKwl7CisJCXUzMglSZWdSQ1IsIFR5cGU7CisKKwkJVHlwZSA9ICgodTggKikodmFsKSlbMF07CisJCVJlZ1JDUiA9IHJlYWRfbmljX2R3b3JkKGRldiwgUkNSKTsKKwkJcHJpdi0+UmVjZWl2ZUNvbmZpZyA9IFJlZ1JDUjsKKworCQlpZiAoVHlwZSA9PSB0cnVlKQorCQkJUmVnUkNSIHw9IChSQ1JfQ0JTU0lEKTsKKwkJZWxzZSBpZiAoVHlwZSA9PSBmYWxzZSkKKwkJCVJlZ1JDUiAmPSAoflJDUl9DQlNTSUQpOworCisJCXdyaXRlX25pY19kd29yZChkZXYsIFJDUiwgUmVnUkNSKTsKKwkJcHJpdi0+UmVjZWl2ZUNvbmZpZyA9IFJlZ1JDUjsKKworCX0KKwlicmVhazsKKworCWNhc2UgSFdfVkFSX1NMT1RfVElNRToKKworCQlwcml2LT5zbG90X3RpbWUgPSB2YWxbMF07CisJCXdyaXRlX25pY19ieXRlKGRldiwgU0xPVF9USU1FLCB2YWxbMF0pOworCisJCWJyZWFrOworCisJY2FzZSBIV19WQVJfQUNLX1BSRUFNQkxFOgorCXsKKwkJdTMyIHJlZ1RtcDsKKwkJcHJpdi0+c2hvcnRfcHJlYW1ibGUgPSAoYm9vbCkoKih1OCAqKXZhbCk7CisJCXJlZ1RtcCA9IHByaXYtPmJhc2ljX3JhdGU7CisJCWlmIChwcml2LT5zaG9ydF9wcmVhbWJsZSkKKwkJCXJlZ1RtcCB8PSBCUlNSX0Fja1Nob3J0UG1iOworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSUlNSLCByZWdUbXApOworCQlicmVhazsKKwl9CisKKwljYXNlIEhXX1ZBUl9DUFVfUlNUOgorCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBDUFVfR0VOLCAoKHUzMiAqKSh2YWwpKVswXSk7CisJCWJyZWFrOworCisJY2FzZSBIV19WQVJfQUNfUEFSQU06CisJeworCQl1OAlwQWNQYXJhbSA9ICooKHU4ICopdmFsKTsKKwkJdTMyCWVBQ0kgPSBwQWNQYXJhbTsKKwkJdTgJCXUxYkFJRlM7CisJCXUzMgkJdTRiQWNQYXJhbTsKKwkJdTggbW9kZSA9IHByaXYtPnJ0bGxpYi0+bW9kZTsKKwkJc3RydWN0IHJ0bGxpYl9xb3NfcGFyYW1ldGVycyAqcW9zX3BhcmFtZXRlcnMgPQorCQkJICZwcml2LT5ydGxsaWItPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5wYXJhbWV0ZXJzOworCisJCXUxYkFJRlMgPSBxb3NfcGFyYW1ldGVycy0+YWlmc1twQWNQYXJhbV0gKgorCQkJICAoKG1vZGUmKElFRUVfR3xJRUVFX05fMjRHKSkgPyA5IDogMjApICsgYVNpZnNUaW1lOworCisJCWRtX2luaXRfZWRjYV90dXJibyhkZXYpOworCisJCXU0YkFjUGFyYW0gPSAoKCgodTMyKShxb3NfcGFyYW1ldGVycy0+dHhfb3BfbGltaXRbcEFjUGFyYW1dKSkgPDwKKwkJCSAgICAgQUNfUEFSQU1fVFhPUF9MSU1JVF9PRkZTRVQpIHwKKwkJCSAgICAgKCgodTMyKShxb3NfcGFyYW1ldGVycy0+Y3dfbWF4W3BBY1BhcmFtXSkpIDw8CisJCQkgICAgIEFDX1BBUkFNX0VDV19NQVhfT0ZGU0VUKSB8CisJCQkgICAgICgoKHUzMikocW9zX3BhcmFtZXRlcnMtPmN3X21pbltwQWNQYXJhbV0pKSA8PAorCQkJICAgICBBQ19QQVJBTV9FQ1dfTUlOX09GRlNFVCkgfAorCQkJICAgICAoKCh1MzIpdTFiQUlGUykgPDwgQUNfUEFSQU1fQUlGU19PRkZTRVQpKTsKKworCQlSVF9UUkFDRShDT01QX0RCRywgIiVzKCk6SFdfVkFSX0FDX1BBUkFNIGVBQ0k6JXg6JXhcbiIsCisJCQkgX19mdW5jX18sIGVBQ0ksIHU0YkFjUGFyYW0pOworCQlzd2l0Y2ggKGVBQ0kpIHsKKwkJY2FzZSBBQzFfQks6CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBFRENBUEFSQV9CSywgdTRiQWNQYXJhbSk7CisJCQlicmVhazsKKworCQljYXNlIEFDMF9CRToKKwkJCXdyaXRlX25pY19kd29yZChkZXYsIEVEQ0FQQVJBX0JFLCB1NGJBY1BhcmFtKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQUMyX1ZJOgorCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgRURDQVBBUkFfVkksIHU0YkFjUGFyYW0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQzNfVk86CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBFRENBUEFSQV9WTywgdTRiQWNQYXJhbSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fSU5GTyAiU2V0SHdSZWc4MTg1KCk6IGludmFsaWQgQUNJOiAlZCAhXG4iLAorCQkJICAgICAgIGVBQ0kpOworCQkJYnJlYWs7CisJCX0KKwkJcHJpdi0+cnRsbGliLT5TZXRId1JlZ0hhbmRsZXIoZGV2LCBIV19WQVJfQUNNX0NUUkwsCisJCQkJCSAgICAgICh1OCAqKSgmcEFjUGFyYW0pKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBIV19WQVJfQUNNX0NUUkw6CisJeworCQlzdHJ1Y3QgcnRsbGliX3Fvc19wYXJhbWV0ZXJzICpxb3NfcGFyYW1ldGVycyA9CisJCQkgJnByaXYtPnJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnBhcmFtZXRlcnM7CisJCXU4IHBBY1BhcmFtID0gKigodTggKil2YWwpOworCQl1MzIgZUFDSSA9IHBBY1BhcmFtOworCQl1bmlvbiBhY2lfYWlmc24gKnBBY2lBaWZzbiA9ICh1bmlvbiBhY2lfYWlmc24gKikgJgorCQkJCQkgICAgICAocW9zX3BhcmFtZXRlcnMtPmFpZnNbMF0pOworCQl1OCBhY20gPSBwQWNpQWlmc24tPmYuYWNtOworCQl1OCBBY21DdHJsID0gcmVhZF9uaWNfYnl0ZShkZXYsIEFjbUh3Q3RybCk7CisKKwkJUlRfVFJBQ0UoQ09NUF9EQkcsICI9PT09PT09PT09PT4lcygpOkhXX1ZBUl9BQ01fQ1RSTDoleFxuIiwKKwkJCSBfX2Z1bmNfXywgZUFDSSk7CisJCUFjbUN0cmwgPSBBY21DdHJsIHwgKChwcml2LT5BY21NZXRob2QgPT0gMikgPyAweDAgOiAweDEpOworCisJCWlmIChhY20pIHsKKwkJCXN3aXRjaCAoZUFDSSkgeworCQkJY2FzZSBBQzBfQkU6CisJCQkJQWNtQ3RybCB8PSBBY21Id19CZXFFbjsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBQzJfVkk6CisJCQkJQWNtQ3RybCB8PSBBY21Id19WaXFFbjsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBQzNfVk86CisJCQkJQWNtQ3RybCB8PSBBY21Id19Wb3FFbjsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlSVF9UUkFDRShDT01QX1FPUywgIlNldEh3UmVnODE4NSgpOiBbSFdfVkFSXyIKKwkJCQkJICJBQ01fQ1RSTF0gYWNtIHNldCBmYWlsZWQ6IGVBQ0kgaXMgIgorCQkJCQkgIiVkXG4iLCBlQUNJKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoZUFDSSkgeworCQkJY2FzZSBBQzBfQkU6CisJCQkJQWNtQ3RybCAmPSAofkFjbUh3X0JlcUVuKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBQzJfVkk6CisJCQkJQWNtQ3RybCAmPSAofkFjbUh3X1ZpcUVuKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBQzNfVk86CisJCQkJQWNtQ3RybCAmPSAofkFjbUh3X0JlcUVuKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCVJUX1RSQUNFKENPTVBfUU9TLCAiU2V0SHdSZWc4MTkwcGNpKCk6IFtIV19WQVJfQUNNX0NUUkxdIFdyaXRlIgorCQkJICIgMHglWFxuIiwgQWNtQ3RybCk7CisJCXdyaXRlX25pY19ieXRlKGRldiwgQWNtSHdDdHJsLCBBY21DdHJsKTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBIV19WQVJfU0lGUzoKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBTSUZTLCB2YWxbMF0pOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFNJRlMrMSwgdmFsWzBdKTsKKwkJYnJlYWs7CisKKwljYXNlIEhXX1ZBUl9SRl9USU1JTkc6CisJeworCQl1OCBSZl9UaW1pbmcgPSAqKCh1OCAqKXZhbCk7CisJCXdyaXRlX25pY19ieXRlKGRldiwgckZQR0EwX1JGVGltaW5nMSwgUmZfVGltaW5nKTsKKwkJYnJlYWs7CisJfQorCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfcmVhZF9lZXByb21faW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCXU4IHRlbXB2YWw7CisJdTggSUNWZXI4MTkyLCBJQ1ZlcjgyNTY7CisJdTE2IGksIHVzVmFsdWUsIElDX1ZlcnNpb247CisJdTE2IEVFUFJPTUlkOworCXU4IGJNYWNfVG1wX0FkZHJbNl0gPSB7MHgwMCwgMHhlMCwgMHg0YywgMHgwMCwgMHgwMCwgMHgwMX07CisJUlRfVFJBQ0UoQ09NUF9JTklULCAiPT09PT4gcnRsODE5Ml9yZWFkX2VlcHJvbV9pbmZvXG4iKTsKKworCUVFUFJPTUlkID0gZXByb21fcmVhZChkZXYsIDApOworCWlmIChFRVBST01JZCAhPSBSVEw4MTkwX0VFUFJPTV9JRCkgeworCQlSVF9UUkFDRShDT01QX0VSUiwgIkVFUFJPTSBJRCBpcyBpbnZhbGlkOiV4LCAleFxuIiwKKwkJCSBFRVBST01JZCwgUlRMODE5MF9FRVBST01fSUQpOworCQlwcml2LT5BdXRvbG9hZEZhaWxGbGFnID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlwcml2LT5BdXRvbG9hZEZhaWxGbGFnID0gZmFsc2U7CisJfQorCisJaWYgKCFwcml2LT5BdXRvbG9hZEZhaWxGbGFnKSB7CisJCXByaXYtPmVlcHJvbV92aWQgPSBlcHJvbV9yZWFkKGRldiwgKEVFUFJPTV9WSUQgPj4gMSkpOworCQlwcml2LT5lZXByb21fZGlkID0gZXByb21fcmVhZChkZXYsIChFRVBST01fRElEID4+IDEpKTsKKworCQl1c1ZhbHVlID0gZXByb21fcmVhZChkZXYsICh1MTYpKEVFUFJPTV9DdXN0b21lcl9JRD4+MSkpID4+IDg7CisJCXByaXYtPmVlcHJvbV9DdXN0b21lcklEID0gKHU4KSh1c1ZhbHVlICYgMHhmZik7CisJCXVzVmFsdWUgPSBlcHJvbV9yZWFkKGRldiwgKEVFUFJPTV9JQ1ZlcnNpb25fQ2hhbm5lbFBsYW4+PjEpKTsKKwkJcHJpdi0+ZWVwcm9tX0NoYW5uZWxQbGFuID0gdXNWYWx1ZSYweGZmOworCQlJQ19WZXJzaW9uID0gKCh1c1ZhbHVlJjB4ZmYwMCk+PjgpOworCisJCUlDVmVyODE5MiA9IChJQ19WZXJzaW9uJjB4Zik7CisJCUlDVmVyODI1NiA9ICgoSUNfVmVyc2lvbiYweGYwKT4+NCk7CisJCVJUX1RSQUNFKENPTVBfSU5JVCwgIlxuSUNWZXI4MTkyID0gMHgleFxuIiwgSUNWZXI4MTkyKTsKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCAiXG5JQ1ZlcjgyNTYgPSAweCV4XG4iLCBJQ1ZlcjgyNTYpOworCQlpZiAoSUNWZXI4MTkyID09IDB4MikgeworCQkJaWYgKElDVmVyODI1NiA9PSAweDUpCisJCQkJcHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24gPSBWRVJTSU9OXzgxOTBfQkU7CisJCX0KKwkJc3dpdGNoIChwcml2LT5jYXJkXzgxOTJfdmVyc2lvbikgeworCQljYXNlIFZFUlNJT05fODE5MF9CRDoKKwkJY2FzZSBWRVJTSU9OXzgxOTBfQkU6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaXYtPmNhcmRfODE5Ml92ZXJzaW9uID0gVkVSU0lPTl84MTkwX0JEOworCQkJYnJlYWs7CisJCX0KKwkJUlRfVFJBQ0UoQ09NUF9JTklULCAiXG5JQyBWZXJzaW9uID0gMHgleFxuIiwKKwkJCSAgcHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24pOworCX0gZWxzZSB7CisJCXByaXYtPmNhcmRfODE5Ml92ZXJzaW9uID0gVkVSU0lPTl84MTkwX0JEOworCQlwcml2LT5lZXByb21fdmlkID0gMDsKKwkJcHJpdi0+ZWVwcm9tX2RpZCA9IDA7CisJCXByaXYtPmVlcHJvbV9DdXN0b21lcklEID0gMDsKKwkJcHJpdi0+ZWVwcm9tX0NoYW5uZWxQbGFuID0gMDsKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCAiXG5JQyBWZXJzaW9uID0gMHgleFxuIiwgMHhmZik7CisJfQorCisJUlRfVFJBQ0UoQ09NUF9JTklULCAiRUVQUk9NIFZJRCA9IDB4JTR4XG4iLCBwcml2LT5lZXByb21fdmlkKTsKKwlSVF9UUkFDRShDT01QX0lOSVQsICJFRVBST00gRElEID0gMHglNHhcbiIsIHByaXYtPmVlcHJvbV9kaWQpOworCVJUX1RSQUNFKENPTVBfSU5JVCwgIkVFUFJPTSBDdXN0b21lciBJRDogMHglMnhcbiIsCisJCSBwcml2LT5lZXByb21fQ3VzdG9tZXJJRCk7CisKKwlpZiAoIXByaXYtPkF1dG9sb2FkRmFpbEZsYWcpIHsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkgKz0gMikgeworCQkJdXNWYWx1ZSA9IGVwcm9tX3JlYWQoZGV2LAorCQkJCSAodTE2KSgoRUVQUk9NX05PREVfQUREUkVTU19CWVRFXzAgKyBpKSA+PiAxKSk7CisJCQkqKHUxNiAqKSgmZGV2LT5kZXZfYWRkcltpXSkgPSB1c1ZhbHVlOworCQl9CisJfSBlbHNlIHsKKwkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGJNYWNfVG1wX0FkZHIsIDYpOworCX0KKworCVJUX1RSQUNFKENPTVBfSU5JVCwgIlBlcm1hbmVudCBBZGRyZXNzID0gJXBNXG4iLAorCQkgZGV2LT5kZXZfYWRkcik7CisKKwlpZiAocHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24gPiBWRVJTSU9OXzgxOTBfQkQpCisJCXByaXYtPmJUWFBvd2VyRGF0YVJlYWRGcm9tRUVQT1JNID0gdHJ1ZTsKKwllbHNlCisJCXByaXYtPmJUWFBvd2VyRGF0YVJlYWRGcm9tRUVQT1JNID0gZmFsc2U7CisKKwlwcml2LT5yZl90eXBlID0gUlRMODE5WF9ERUZBVUxUX1JGX1RZUEU7CisKKwlpZiAocHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24gPiBWRVJTSU9OXzgxOTBfQkQpIHsKKwkJaWYgKCFwcml2LT5BdXRvbG9hZEZhaWxGbGFnKSB7CisJCQl0ZW1wdmFsID0gKGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX1JGSW5kX1Bvd2VyRGlmZiA+PgorCQkJCQkgICAgICAxKSkpICYgMHhmZjsKKwkJCXByaXYtPkVFUFJPTUxlZ2FjeUhUVHhQb3dlckRpZmYgPSB0ZW1wdmFsICYgMHhmOworCisJCQlpZiAodGVtcHZhbCYweDgwKQorCQkJCXByaXYtPnJmX3R5cGUgPSBSRl8xVDJSOworCQkJZWxzZQorCQkJCXByaXYtPnJmX3R5cGUgPSBSRl8yVDRSOworCQl9IGVsc2UgeworCQkJcHJpdi0+RUVQUk9NTGVnYWN5SFRUeFBvd2VyRGlmZiA9IDB4MDQ7CisJCX0KKwkJUlRfVFJBQ0UoQ09NUF9JTklULCAiRUVQUk9NTGVnYWN5SFRUeFBvd2VyRGlmZiA9ICVkXG4iLAorCQkJcHJpdi0+RUVQUk9NTGVnYWN5SFRUeFBvd2VyRGlmZik7CisKKwkJaWYgKCFwcml2LT5BdXRvbG9hZEZhaWxGbGFnKQorCQkJcHJpdi0+RUVQUk9NVGhlcm1hbE1ldGVyID0gKHU4KSgoKGVwcm9tX3JlYWQoZGV2LAorCQkJCQkJICAgKEVFUFJPTV9UaGVybWFsTWV0ZXI+PjEpKSkgJgorCQkJCQkJICAgMHhmZjAwKT4+OCk7CisJCWVsc2UKKwkJCXByaXYtPkVFUFJPTVRoZXJtYWxNZXRlciA9IEVFUFJPTV9EZWZhdWx0X1RoZXJtYWxNZXRlcjsKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCAiVGhlcm1hbE1ldGVyID0gJWRcbiIsCisJCQkgcHJpdi0+RUVQUk9NVGhlcm1hbE1ldGVyKTsKKwkJcHJpdi0+VFNTSV8xM2RCbSA9IHByaXYtPkVFUFJPTVRoZXJtYWxNZXRlciAqIDEwMDsKKworCQlpZiAocHJpdi0+ZXByb210eXBlID09IEVFUFJPTV85M0M0NikgeworCQkJaWYgKCFwcml2LT5BdXRvbG9hZEZhaWxGbGFnKSB7CisJCQkJdXNWYWx1ZSA9IGVwcm9tX3JlYWQoZGV2LAorCQkJCQkgIChFRVBST01fVHhQd0RpZmZfQ3J5c3RhbENhcCA+PiAxKSk7CisJCQkJcHJpdi0+RUVQUk9NQW50UHdEaWZmID0gKHVzVmFsdWUmMHgwZmZmKTsKKwkJCQlwcml2LT5FRVBST01DcnlzdGFsQ2FwID0gKHU4KSgodXNWYWx1ZSAmIDB4ZjAwMCkKKwkJCQkJCQkgPj4gMTIpOworCQkJfSBlbHNlIHsKKwkJCQlwcml2LT5FRVBST01BbnRQd0RpZmYgPQorCQkJCQkgRUVQUk9NX0RlZmF1bHRfQW50VHhQb3dlckRpZmY7CisJCQkJcHJpdi0+RUVQUk9NQ3J5c3RhbENhcCA9CisJCQkJCSBFRVBST01fRGVmYXVsdF9UeFB3RGlmZl9DcnlzdGFsQ2FwOworCQkJfQorCQkJUlRfVFJBQ0UoQ09NUF9JTklULCAiRUVQUk9NQW50UHdEaWZmID0gJWRcbiIsCisJCQkJIHByaXYtPkVFUFJPTUFudFB3RGlmZik7CisJCQlSVF9UUkFDRShDT01QX0lOSVQsICJFRVBST01DcnlzdGFsQ2FwID0gJWRcbiIsCisJCQkJIHByaXYtPkVFUFJPTUNyeXN0YWxDYXApOworCisJCQlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkgKz0gMikgeworCQkJCWlmICghcHJpdi0+QXV0b2xvYWRGYWlsRmxhZykKKwkJCQkJdXNWYWx1ZSA9IGVwcm9tX3JlYWQoZGV2LAorCQkJCQkJICAodTE2KSgoRUVQUk9NX1R4UHdJbmRleF9DQ0sgKworCQkJCQkJICBpKSA+PiAxKSk7CisJCQkJZWxzZQorCQkJCQl1c1ZhbHVlID0gRUVQUk9NX0RlZmF1bHRfVHhQb3dlcjsKKwkJCQkqKCh1MTYgKikoJnByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbENDS1tpXSkpID0KKwkJCQkJCQkJIHVzVmFsdWU7CisJCQkJUlRfVFJBQ0UoQ09NUF9JTklULCAiQ0NLIFR4IFBvd2VyIExldmVsLCBJbmRleCIKKwkJCQkJICIgJWQgPSAweCUwMnhcbiIsIGksCisJCQkJCSBwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxDQ0tbaV0pOworCQkJCVJUX1RSQUNFKENPTVBfSU5JVCwgIkNDSyBUeCBQb3dlciBMZXZlbCwgSW5kZXgiCisJCQkJCSAiICVkID0gMHglMDJ4XG4iLCBpKzEsCisJCQkJCSBwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxDQ0tbaSsxXSk7CisJCQl9CisJCQlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkgKz0gMikgeworCQkJCWlmICghcHJpdi0+QXV0b2xvYWRGYWlsRmxhZykKKwkJCQkJdXNWYWx1ZSA9IGVwcm9tX3JlYWQoZGV2LAorCQkJCQkJKHUxNikoKEVFUFJPTV9UeFB3SW5kZXhfT0ZETV8yNEcKKwkJCQkJCSsgaSkgPj4gMSkpOworCQkJCWVsc2UKKwkJCQkJdXNWYWx1ZSA9IEVFUFJPTV9EZWZhdWx0X1R4UG93ZXI7CisJCQkJKigodTE2ICopKCZwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxPRkRNMjRHW2ldKSkKKwkJCQkJCQkgPSB1c1ZhbHVlOworCQkJCVJUX1RSQUNFKENPTVBfSU5JVCwgIk9GRE0gMi40RyBUeCBQb3dlciBMZXZlbCwiCisJCQkJCSAiIEluZGV4ICVkID0gMHglMDJ4XG4iLCBpLAorCQkJCQkgcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsT0ZETTI0R1tpXSk7CisJCQkJUlRfVFJBQ0UoQ09NUF9JTklULCAiT0ZETSAyLjRHIFR4IFBvd2VyIExldmVsLCIKKwkJCQkJICIgSW5kZXggJWQgPSAweCUwMnhcbiIsIGkgKyAxLAorCQkJCQkgcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsT0ZETTI0R1tpKzFdKTsKKwkJCX0KKwkJfQorCQlpZiAocHJpdi0+ZXByb210eXBlID09IEVFUFJPTV85M0M0NikgeworCQkJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspIHsKKwkJCQlwcml2LT5UeFBvd2VyTGV2ZWxDQ0tbaV0gPQorCQkJCQkgcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsQ0NLW2ldOworCQkJCXByaXYtPlR4UG93ZXJMZXZlbE9GRE0yNEdbaV0gPQorCQkJCQkgcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsT0ZETTI0R1tpXTsKKwkJCX0KKwkJCXByaXYtPkxlZ2FjeUhUVHhQb3dlckRpZmYgPQorCQkJCQkgcHJpdi0+RUVQUk9NTGVnYWN5SFRUeFBvd2VyRGlmZjsKKwkJCXByaXYtPkFudGVubmFUeFB3RGlmZlswXSA9IChwcml2LT5FRVBST01BbnRQd0RpZmYgJgorCQkJCQkJICAgIDB4Zik7CisJCQlwcml2LT5BbnRlbm5hVHhQd0RpZmZbMV0gPSAoKHByaXYtPkVFUFJPTUFudFB3RGlmZiAmCisJCQkJCQkgICAgMHhmMCk+PjQpOworCQkJcHJpdi0+QW50ZW5uYVR4UHdEaWZmWzJdID0gKChwcml2LT5FRVBST01BbnRQd0RpZmYgJgorCQkJCQkJICAgIDB4ZjAwKT4+OCk7CisJCQlwcml2LT5DcnlzdGFsQ2FwID0gcHJpdi0+RUVQUk9NQ3J5c3RhbENhcDsKKwkJCXByaXYtPlRoZXJtYWxNZXRlclswXSA9IChwcml2LT5FRVBST01UaGVybWFsTWV0ZXIgJgorCQkJCQkJIDB4Zik7CisJCQlwcml2LT5UaGVybWFsTWV0ZXJbMV0gPSAoKHByaXYtPkVFUFJPTVRoZXJtYWxNZXRlciAmCisJCQkJCQkgMHhmMCk+PjQpOworCQl9IGVsc2UgaWYgKHByaXYtPmVwcm9tdHlwZSA9PSBFRVBST01fOTNDNTYpIHsKKworCQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQkJCXByaXYtPlR4UG93ZXJMZXZlbENDS19BW2ldID0KKwkJCQkJIHByaXYtPkVFUFJPTVJmQUNDS0NobmwxVHhQd0xldmVsWzBdOworCQkJCXByaXYtPlR4UG93ZXJMZXZlbE9GRE0yNEdfQVtpXSA9CisJCQkJCSBwcml2LT5FRVBST01SZkFPZmRtQ2hubFR4UHdMZXZlbFswXTsKKwkJCQlwcml2LT5UeFBvd2VyTGV2ZWxDQ0tfQ1tpXSA9CisJCQkJCSBwcml2LT5FRVBST01SZkNDQ0tDaG5sMVR4UHdMZXZlbFswXTsKKwkJCQlwcml2LT5UeFBvd2VyTGV2ZWxPRkRNMjRHX0NbaV0gPQorCQkJCQkgcHJpdi0+RUVQUk9NUmZDT2ZkbUNobmxUeFB3TGV2ZWxbMF07CisJCQl9CisJCQlmb3IgKGkgPSAzOyBpIDwgOTsgaSsrKSB7CisJCQkJcHJpdi0+VHhQb3dlckxldmVsQ0NLX0FbaV0gID0KKwkJCQkJIHByaXYtPkVFUFJPTVJmQUNDS0NobmwxVHhQd0xldmVsWzFdOworCQkJCXByaXYtPlR4UG93ZXJMZXZlbE9GRE0yNEdfQVtpXSA9CisJCQkJCSBwcml2LT5FRVBST01SZkFPZmRtQ2hubFR4UHdMZXZlbFsxXTsKKwkJCQlwcml2LT5UeFBvd2VyTGV2ZWxDQ0tfQ1tpXSA9CisJCQkJCSBwcml2LT5FRVBST01SZkNDQ0tDaG5sMVR4UHdMZXZlbFsxXTsKKwkJCQlwcml2LT5UeFBvd2VyTGV2ZWxPRkRNMjRHX0NbaV0gPQorCQkJCQkgcHJpdi0+RUVQUk9NUmZDT2ZkbUNobmxUeFB3TGV2ZWxbMV07CisJCQl9CisJCQlmb3IgKGkgPSA5OyBpIDwgMTQ7IGkrKykgeworCQkJCXByaXYtPlR4UG93ZXJMZXZlbENDS19BW2ldICA9CisJCQkJCSBwcml2LT5FRVBST01SZkFDQ0tDaG5sMVR4UHdMZXZlbFsyXTsKKwkJCQlwcml2LT5UeFBvd2VyTGV2ZWxPRkRNMjRHX0FbaV0gPQorCQkJCQkgcHJpdi0+RUVQUk9NUmZBT2ZkbUNobmxUeFB3TGV2ZWxbMl07CisJCQkJcHJpdi0+VHhQb3dlckxldmVsQ0NLX0NbaV0gPQorCQkJCQkgcHJpdi0+RUVQUk9NUmZDQ0NLQ2hubDFUeFB3TGV2ZWxbMl07CisJCQkJcHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R19DW2ldID0KKwkJCQkJIHByaXYtPkVFUFJPTVJmQ09mZG1DaG5sVHhQd0xldmVsWzJdOworCQkJfQorCQkJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspCisJCQkJUlRfVFJBQ0UoQ09NUF9JTklULCAicHJpdi0+VHhQb3dlckxldmVsQ0NLX0EiCisJCQkJCSAiWyVkXSA9IDB4JXhcbiIsIGksCisJCQkJCSBwcml2LT5UeFBvd2VyTGV2ZWxDQ0tfQVtpXSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkrKykKKwkJCQlSVF9UUkFDRShDT01QX0lOSVQsICJwcml2LT5UeFBvd2VyTGV2ZWxPRkRNIgorCQkJCQkgIjI0R19BWyVkXSA9IDB4JXhcbiIsIGksCisJCQkJCSBwcml2LT5UeFBvd2VyTGV2ZWxPRkRNMjRHX0FbaV0pOworCQkJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspCisJCQkJUlRfVFJBQ0UoQ09NUF9JTklULCAicHJpdi0+VHhQb3dlckxldmVsQ0NLX0MiCisJCQkJCSAiWyVkXSA9IDB4JXhcbiIsIGksCisJCQkJCSBwcml2LT5UeFBvd2VyTGV2ZWxDQ0tfQ1tpXSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkrKykKKwkJCQlSVF9UUkFDRShDT01QX0lOSVQsICJwcml2LT5UeFBvd2VyTGV2ZWxPRkRNIgorCQkJCQkgIjI0R19DWyVkXSA9IDB4JXhcbiIsIGksCisJCQkJCSBwcml2LT5UeFBvd2VyTGV2ZWxPRkRNMjRHX0NbaV0pOworCQkJcHJpdi0+TGVnYWN5SFRUeFBvd2VyRGlmZiA9CisJCQkJIHByaXYtPkVFUFJPTUxlZ2FjeUhUVHhQb3dlckRpZmY7CisJCQlwcml2LT5BbnRlbm5hVHhQd0RpZmZbMF0gPSAwOworCQkJcHJpdi0+QW50ZW5uYVR4UHdEaWZmWzFdID0gMDsKKwkJCXByaXYtPkFudGVubmFUeFB3RGlmZlsyXSA9IDA7CisJCQlwcml2LT5DcnlzdGFsQ2FwID0gcHJpdi0+RUVQUk9NQ3J5c3RhbENhcDsKKwkJCXByaXYtPlRoZXJtYWxNZXRlclswXSA9IChwcml2LT5FRVBST01UaGVybWFsTWV0ZXIgJgorCQkJCQkJIDB4Zik7CisJCQlwcml2LT5UaGVybWFsTWV0ZXJbMV0gPSAoKHByaXYtPkVFUFJPTVRoZXJtYWxNZXRlciAmCisJCQkJCQkgMHhmMCk+PjQpOworCQl9CisJfQorCisJaWYgKHByaXYtPnJmX3R5cGUgPT0gUkZfMVQyUikgeworCQkvKiBubyBtYXR0ZXIgd2hhdCBjaGVja3BhdGNoIHNheXMsIHRoZSBicmFjZXMgYXJlIG5lZWRlZCAqLworCQlSVF9UUkFDRShDT01QX0lOSVQsICJcbjFUMlIgY29uZmlnXG4iKTsKKwl9IGVsc2UgaWYgKHByaXYtPnJmX3R5cGUgPT0gUkZfMlQ0UikgeworCQlSVF9UUkFDRShDT01QX0lOSVQsICJcbjJUNFIgY29uZmlnXG4iKTsKKwl9CisKKwlpbml0X3JhdGVfYWRhcHRpdmUoZGV2KTsKKworCXByaXYtPnJmX2NoaXAgPSBSRl84MjU2OworCisJaWYgKHByaXYtPlJlZ0NoYW5uZWxQbGFuID09IDB4ZikKKwkJcHJpdi0+Q2hhbm5lbFBsYW4gPSBwcml2LT5lZXByb21fQ2hhbm5lbFBsYW47CisJZWxzZQorCQlwcml2LT5DaGFubmVsUGxhbiA9IHByaXYtPlJlZ0NoYW5uZWxQbGFuOworCisJaWYgKHByaXYtPmVlcHJvbV92aWQgPT0gMHgxMTg2ICYmICBwcml2LT5lZXByb21fZGlkID09IDB4MzMwNCkKKwkJcHJpdi0+Q3VzdG9tZXJJRCA9ICBSVF9DSURfRExJTks7CisKKwlzd2l0Y2ggKHByaXYtPmVlcHJvbV9DdXN0b21lcklEKSB7CisJY2FzZSBFRVBST01fQ0lEX0RFRkFVTFQ6CisJCXByaXYtPkN1c3RvbWVySUQgPSBSVF9DSURfREVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSBFRVBST01fQ0lEX0NBTUVPOgorCQlwcml2LT5DdXN0b21lcklEID0gUlRfQ0lEXzgxOXhfQ0FNRU87CisJCWJyZWFrOworCWNhc2UgIEVFUFJPTV9DSURfUlVOVE9QOgorCQlwcml2LT5DdXN0b21lcklEID0gUlRfQ0lEXzgxOXhfUlVOVE9QOworCQlicmVhazsKKwljYXNlIEVFUFJPTV9DSURfTmV0Q29yZToKKwkJcHJpdi0+Q3VzdG9tZXJJRCA9IFJUX0NJRF84MTl4X05ldGNvcmU7CisJCWJyZWFrOworCWNhc2UgRUVQUk9NX0NJRF9UT1NISUJBOgorCQlwcml2LT5DdXN0b21lcklEID0gUlRfQ0lEX1RPU0hJQkE7CisJCWlmIChwcml2LT5lZXByb21fQ2hhbm5lbFBsYW4mMHg4MCkKKwkJCXByaXYtPkNoYW5uZWxQbGFuID0gcHJpdi0+ZWVwcm9tX0NoYW5uZWxQbGFuJjB4N2Y7CisJCWVsc2UKKwkJCXByaXYtPkNoYW5uZWxQbGFuID0gMHgwOworCQlSVF9UUkFDRShDT01QX0lOSVQsICJUb3NoaWJhIENoYW5uZWxQbGFuID0gMHgleFxuIiwKKwkJCXByaXYtPkNoYW5uZWxQbGFuKTsKKwkJYnJlYWs7CisJY2FzZSBFRVBST01fQ0lEX05ldHRyb25peDoKKwkJcHJpdi0+U2NhbkRlbGF5ID0gMTAwOworCQlwcml2LT5DdXN0b21lcklEID0gUlRfQ0lEX05ldHRyb25peDsKKwkJYnJlYWs7CisJY2FzZSBFRVBST01fQ0lEX1Byb25ldDoKKwkJcHJpdi0+Q3VzdG9tZXJJRCA9IFJUX0NJRF9QUk9ORVQ7CisJCWJyZWFrOworCWNhc2UgRUVQUk9NX0NJRF9ETElOSzoKKwkJcHJpdi0+Q3VzdG9tZXJJRCA9IFJUX0NJRF9ETElOSzsKKwkJYnJlYWs7CisKKwljYXNlIEVFUFJPTV9DSURfV0hRTDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKHByaXYtPkNoYW5uZWxQbGFuID4gQ0hBTk5FTF9QTEFOX0xFTiAtIDEpCisJCXByaXYtPkNoYW5uZWxQbGFuID0gMDsKKwlwcml2LT5DaGFubmVsUGxhbiA9IENPVU5UUllfQ09ERV9XT1JMRF9XSURFXzEzOworCisJaWYgKHByaXYtPmVlcHJvbV92aWQgPT0gMHgxMTg2ICYmICBwcml2LT5lZXByb21fZGlkID09IDB4MzMwNCkKKwkJcHJpdi0+cnRsbGliLT5iU3VwcG9ydFJlbW90ZVdha2VVcCA9IHRydWU7CisJZWxzZQorCQlwcml2LT5ydGxsaWItPmJTdXBwb3J0UmVtb3RlV2FrZVVwID0gZmFsc2U7CisKKwlSVF9UUkFDRShDT01QX0lOSVQsICJSZWdDaGFubmVsUGxhbiglZClcbiIsIHByaXYtPlJlZ0NoYW5uZWxQbGFuKTsKKwlSVF9UUkFDRShDT01QX0lOSVQsICJDaGFubmVsUGxhbiA9ICVkXG4iLCBwcml2LT5DaGFubmVsUGxhbik7CisJUlRfVFJBQ0UoQ09NUF9UUkFDRSwgIjw9PT09IFJlYWRBZGFwdGVySW5mb1xuIik7Cit9CisKK3ZvaWQgcnRsODE5Ml9nZXRfZWVwcm9tX3NpemUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1MTYgY3VyQ1I7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJUlRfVFJBQ0UoQ09NUF9JTklULCAiPT09PT09PT09PT0+JXMoKVxuIiwgX19mdW5jX18pOworCWN1ckNSID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBFUFJPTV9DTUQpOworCVJUX1RSQUNFKENPTVBfSU5JVCwgInJlYWQgZnJvbSBSZWcgQ21kOTM0NkNSKCV4KToleFxuIiwgRVBST01fQ01ELAorCQkgY3VyQ1IpOworCXByaXYtPmVwcm9tdHlwZSA9IChjdXJDUiAmIEVQUk9NX0NNRF85MzU2U0VMKSA/IEVFUFJPTV85M0M1NiA6CisJCQkgIEVFUFJPTV85M0M0NjsKKwlSVF9UUkFDRShDT01QX0lOSVQsICI8PT09PT09PT09PT0lcygpLCBlcHJvbXR5cGU6JWRcbiIsIF9fZnVuY19fLAorCQkgcHJpdi0+ZXByb210eXBlKTsKKwlydGw4MTkyX3JlYWRfZWVwcm9tX2luZm8oZGV2KTsKK30KKworc3RhdGljIHZvaWQgcnRsODE5Ml9od2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXUzMiByZWdSQVRSID0gMCwgcmVnUlJTUiA9IDA7CisJdTggcmVnQndPcE1vZGUgPSAwLCByZWdUbXAgPSAwOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCXN3aXRjaCAocHJpdi0+cnRsbGliLT5tb2RlKSB7CisJY2FzZSBXSVJFTEVTU19NT0RFX0I6CisJCXJlZ0J3T3BNb2RlID0gQldfT1BNT0RFXzIwTUhaOworCQlyZWdSQVRSID0gUkFURV9BTExfQ0NLOworCQlyZWdSUlNSID0gUkFURV9BTExfQ0NLOworCQlicmVhazsKKwljYXNlIFdJUkVMRVNTX01PREVfQToKKwkJcmVnQndPcE1vZGUgPSBCV19PUE1PREVfNUcgfCBCV19PUE1PREVfMjBNSFo7CisJCXJlZ1JBVFIgPSBSQVRFX0FMTF9PRkRNX0FHOworCQlyZWdSUlNSID0gUkFURV9BTExfT0ZETV9BRzsKKwkJYnJlYWs7CisJY2FzZSBXSVJFTEVTU19NT0RFX0c6CisJCXJlZ0J3T3BNb2RlID0gQldfT1BNT0RFXzIwTUhaOworCQlyZWdSQVRSID0gUkFURV9BTExfQ0NLIHwgUkFURV9BTExfT0ZETV9BRzsKKwkJcmVnUlJTUiA9IFJBVEVfQUxMX0NDSyB8IFJBVEVfQUxMX09GRE1fQUc7CisJCWJyZWFrOworCWNhc2UgV0lSRUxFU1NfTU9ERV9BVVRPOgorCWNhc2UgV0lSRUxFU1NfTU9ERV9OXzI0RzoKKwkJcmVnQndPcE1vZGUgPSBCV19PUE1PREVfMjBNSFo7CisJCQlyZWdSQVRSID0gUkFURV9BTExfQ0NLIHwgUkFURV9BTExfT0ZETV9BRyB8CisJCQkJICBSQVRFX0FMTF9PRkRNXzFTUyB8IFJBVEVfQUxMX09GRE1fMlNTOworCQkJcmVnUlJTUiA9IFJBVEVfQUxMX0NDSyB8IFJBVEVfQUxMX09GRE1fQUc7CisJCWJyZWFrOworCWNhc2UgV0lSRUxFU1NfTU9ERV9OXzVHOgorCQlyZWdCd09wTW9kZSA9IEJXX09QTU9ERV81RzsKKwkJcmVnUkFUUiA9IFJBVEVfQUxMX09GRE1fQUcgfCBSQVRFX0FMTF9PRkRNXzFTUyB8CisJCQkgIFJBVEVfQUxMX09GRE1fMlNTOworCQlyZWdSUlNSID0gUkFURV9BTExfT0ZETV9BRzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVnQndPcE1vZGUgPSBCV19PUE1PREVfMjBNSFo7CisJCXJlZ1JBVFIgPSBSQVRFX0FMTF9DQ0sgfCBSQVRFX0FMTF9PRkRNX0FHOworCQlyZWdSUlNSID0gUkFURV9BTExfQ0NLIHwgUkFURV9BTExfT0ZETV9BRzsKKwkJYnJlYWs7CisJfQorCisJd3JpdGVfbmljX2J5dGUoZGV2LCBCV19PUE1PREUsIHJlZ0J3T3BNb2RlKTsKKwl7CisJCXUzMiByYXRyX3ZhbHVlID0gMDsKKwkJcmF0cl92YWx1ZSA9IHJlZ1JBVFI7CisJCWlmIChwcml2LT5yZl90eXBlID09IFJGXzFUMlIpCisJCQlyYXRyX3ZhbHVlICY9IH4oUkFURV9BTExfT0ZETV8yU1MpOworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSQVRSMCwgcmF0cl92YWx1ZSk7CisJCXdyaXRlX25pY19ieXRlKGRldiwgVUZXUCwgMSk7CisJfQorCXJlZ1RtcCA9IHJlYWRfbmljX2J5dGUoZGV2LCAweDMxMyk7CisJcmVnUlJTUiA9ICgocmVnVG1wKSA8PCAyNCkgfCAocmVnUlJTUiAmIDB4MDBmZmZmZmYpOworCXdyaXRlX25pY19kd29yZChkZXYsIFJSU1IsIHJlZ1JSU1IpOworCisJd3JpdGVfbmljX3dvcmQoZGV2LCBSRVRSWV9MSU1JVCwKKwkJCXByaXYtPlNob3J0UmV0cnlMaW1pdCA8PCBSRVRSWV9MSU1JVF9TSE9SVF9TSElGVCB8CisJCQlwcml2LT5Mb25nUmV0cnlMaW1pdCA8PCBSRVRSWV9MSU1JVF9MT05HX1NISUZUKTsKK30KKworYm9vbCBydGw4MTkyX2FkYXB0ZXJfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJdTMyIHVsUmVnUmVhZDsKKwlib29sIHJ0U3RhdHVzID0gdHJ1ZTsKKwl1OCB0bXB2YWx1ZTsKKwl1OCBJQ1ZlcnNpb24sIFN3aXRjaGluZ1JlZ3VsYXRvck91dHB1dDsKKwlib29sIGJmaXJtd2FyZW9rID0gdHJ1ZTsKKwl1MzIgdG1wUmVnQSwgdG1wUmVnQywgVGVtcENDazsKKwlpbnQgaSA9IDA7CisJdTMyIHJldHJ5X3RpbWVzID0gMDsKKworCVJUX1RSQUNFKENPTVBfSU5JVCwgIj09PT0+JXMoKVxuIiwgX19mdW5jX18pOworCXByaXYtPmJlaW5nX2luaXRfYWRhcHRlciA9IHRydWU7CisKK3N0YXJ0OgorCXJ0bDgxOTJfcGNpX3Jlc2V0ZGVzY3JpbmcoZGV2KTsKKwlwcml2LT5SZl9Nb2RlID0gUkZfT1BfQnlfU1dfM3dpcmU7CisJaWYgKHByaXYtPlJlc2V0UHJvZ3Jlc3MgPT0gUkVTRVRfVFlQRV9OT1JFU0VUKSB7CisJCXdyaXRlX25pY19ieXRlKGRldiwgQU5BUEFSLCAweDM3KTsKKwkJbWRlbGF5KDUwMCk7CisJfQorCXByaXYtPnBGaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzID0gRldfU1RBVFVTXzBfSU5JVDsKKworCWlmIChwcml2LT5SZWdSZk9mZiA9PSB0cnVlKQorCQlwcml2LT5ydGxsaWItPmVSRlBvd2VyU3RhdGUgPSBlUmZPZmY7CisKKwl1bFJlZ1JlYWQgPSByZWFkX25pY19kd29yZChkZXYsIENQVV9HRU4pOworCWlmIChwcml2LT5wRmlybXdhcmUtPmZpcm13YXJlX3N0YXR1cyA9PSBGV19TVEFUVVNfMF9JTklUKQorCQl1bFJlZ1JlYWQgfD0gQ1BVX0dFTl9TWVNURU1fUkVTRVQ7CisJZWxzZSBpZiAocHJpdi0+cEZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPT0gRldfU1RBVFVTXzVfUkVBRFkpCisJCXVsUmVnUmVhZCB8PSBDUFVfR0VOX0ZJUk1XQVJFX1JFU0VUOworCWVsc2UKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJFUlJPUiBpbiAlcygpOiB1bmRlZmluZWQgZmlybXdhcmUgc3RhdGUoJWQpIgorCQkJICJcbiIsIF9fZnVuY19fLCAgIHByaXYtPnBGaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzKTsKKworCXdyaXRlX25pY19kd29yZChkZXYsIENQVV9HRU4sIHVsUmVnUmVhZCk7CisKKwlJQ1ZlcnNpb24gPSByZWFkX25pY19ieXRlKGRldiwgSUNfVkVSUlNJT04pOworCWlmIChJQ1ZlcnNpb24gPj0gMHg0KSB7CisJCVN3aXRjaGluZ1JlZ3VsYXRvck91dHB1dCA9IHJlYWRfbmljX2J5dGUoZGV2LCBTV1JFR1VMQVRPUik7CisJCWlmIChTd2l0Y2hpbmdSZWd1bGF0b3JPdXRwdXQgICE9IDB4YjgpIHsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgU1dSRUdVTEFUT1IsIDB4YTgpOworCQkJbWRlbGF5KDEpOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBTV1JFR1VMQVRPUiwgMHhiOCk7CisJCX0KKwl9CisJUlRfVFJBQ0UoQ09NUF9JTklULCAiQkIgQ29uZmlnIFN0YXJ0IVxuIik7CisJcnRTdGF0dXMgPSBydGw4MTkyX0JCQ29uZmlnKGRldik7CisJaWYgKHJ0U3RhdHVzICE9IHRydWUpIHsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJCQiBDb25maWcgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJ0U3RhdHVzOworCX0KKwlSVF9UUkFDRShDT01QX0lOSVQsICJCQiBDb25maWcgRmluaXNoZWQhXG4iKTsKKworCXByaXYtPkxvb3BiYWNrTW9kZSA9IFJUTDgxOVhfTk9fTE9PUEJBQ0s7CisJaWYgKHByaXYtPlJlc2V0UHJvZ3Jlc3MgPT0gUkVTRVRfVFlQRV9OT1JFU0VUKSB7CisJCXVsUmVnUmVhZCA9IHJlYWRfbmljX2R3b3JkKGRldiwgQ1BVX0dFTik7CisJCWlmIChwcml2LT5Mb29wYmFja01vZGUgPT0gUlRMODE5WF9OT19MT09QQkFDSykKKwkJCXVsUmVnUmVhZCA9ICgodWxSZWdSZWFkICYgQ1BVX0dFTl9OT19MT09QQkFDS19NU0spIHwKKwkJCQkgICAgIENQVV9HRU5fTk9fTE9PUEJBQ0tfU0VUKTsKKwkJZWxzZSBpZiAocHJpdi0+TG9vcGJhY2tNb2RlID09IFJUTDgxOVhfTUFDX0xPT1BCQUNLKQorCQkJdWxSZWdSZWFkIHw9IENQVV9DQ0tfTE9PUEJBQ0s7CisJCWVsc2UKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCAiU2VyaW91cyBlcnJvcjogd3JvbmcgbG9vcGJhY2siCisJCQkJICIgbW9kZSBzZXR0aW5nXG4iKTsKKworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBDUFVfR0VOLCB1bFJlZ1JlYWQpOworCisJCXVkZWxheSg1MDApOworCX0KKwlydGw4MTkyX2h3Y29uZmlnKGRldik7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBDTURSLCBDUl9SRSB8IENSX1RFKTsKKworCXdyaXRlX25pY19ieXRlKGRldiwgUENJRiwgKChNWERNQTJfTm9MaW1pdDw8TVhETUEyX1JYX1NISUZUKSB8CisJCSAgICAgICAoTVhETUEyX05vTGltaXQ8PE1YRE1BMl9UWF9TSElGVCkpKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBNQUMwLCAoKHUzMiAqKWRldi0+ZGV2X2FkZHIpWzBdKTsKKwl3cml0ZV9uaWNfd29yZChkZXYsIE1BQzQsICgodTE2ICopKGRldi0+ZGV2X2FkZHIgKyA0KSlbMF0pOworCXdyaXRlX25pY19kd29yZChkZXYsIFJDUiwgcHJpdi0+UmVjZWl2ZUNvbmZpZyk7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSUVBOMSwgIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JLIDw8CisJCQlSU1ZEX0ZXX1FVRVVFX1BBR0VfQktfU0hJRlQgfAorCQkJTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQkUgPDwKKwkJCVJTVkRfRldfUVVFVUVfUEFHRV9CRV9TSElGVCB8CisJCQlOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9WSSA8PAorCQkJUlNWRF9GV19RVUVVRV9QQUdFX1ZJX1NISUZUIHwKKwkJCU5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1ZPIDw8CisJCQlSU1ZEX0ZXX1FVRVVFX1BBR0VfVk9fU0hJRlQpOworCXdyaXRlX25pY19kd29yZChkZXYsIFJRUE4yLCBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9NR05UIDw8CisJCQlSU1ZEX0ZXX1FVRVVFX1BBR0VfTUdOVF9TSElGVCk7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgUlFQTjMsIEFQUExJRURfUkVTRVJWRURfUVVFVUVfSU5fRlcgfAorCQkJTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQkNOIDw8CisJCQlSU1ZEX0ZXX1FVRVVFX1BBR0VfQkNOX1NISUZUfAorCQkJTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfUFVCIDw8CisJCQlSU1ZEX0ZXX1FVRVVFX1BBR0VfUFVCX1NISUZUKTsKKworCXJ0bDgxOTJfdHhfZW5hYmxlKGRldik7CisJcnRsODE5Ml9yeF9lbmFibGUoZGV2KTsKKwl1bFJlZ1JlYWQgPSAoMHhGRkYwMDAwMCAmIHJlYWRfbmljX2R3b3JkKGRldiwgUlJTUikpICB8CisJCSAgICAgUkFURV9BTExfT0ZETV9BRyB8IFJBVEVfQUxMX0NDSzsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSUlNSLCB1bFJlZ1JlYWQpOworCXdyaXRlX25pY19kd29yZChkZXYsIFJBVFIwKzQqNywgKFJBVEVfQUxMX09GRE1fQUcgfCBSQVRFX0FMTF9DQ0spKTsKKworCXdyaXRlX25pY19ieXRlKGRldiwgQUNLX1RJTUVPVVQsIDB4MzApOworCisJaWYgKHByaXYtPlJlc2V0UHJvZ3Jlc3MgPT0gUkVTRVRfVFlQRV9OT1JFU0VUKQorCQlydGw4MTkyX1NldFdpcmVsZXNzTW9kZShkZXYsIHByaXYtPnJ0bGxpYi0+bW9kZSk7CisJQ2FtUmVzZXRBbGxFbnRyeShkZXYpOworCXsKKwkJdTggU0VDUl92YWx1ZSA9IDB4MDsKKwkJU0VDUl92YWx1ZSB8PSBTQ1JfVHhFbmNFbmFibGU7CisJCVNFQ1JfdmFsdWUgfD0gU0NSX1J4RGVjRW5hYmxlOworCQlTRUNSX3ZhbHVlIHw9IFNDUl9Ob1NLTUM7CisJCXdyaXRlX25pY19ieXRlKGRldiwgU0VDUiwgU0VDUl92YWx1ZSk7CisJfQorCXdyaXRlX25pY193b3JkKGRldiwgQVRJTVdORCwgMik7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBCQ05fSU5URVJWQUwsIDEwMCk7CisJeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IFFPU19RVUVVRV9OVU07IGkrKykKKwkJCXdyaXRlX25pY19kd29yZChkZXYsIFdEQ0FQQVJBX0FERFtpXSwgMHgwMDVlNDMzMik7CisJfQorCXdyaXRlX25pY19ieXRlKGRldiwgMHhiZSwgMHhjMCk7CisKKwlydGw4MTkyX3BoeV9jb25maWdtYWMoZGV2KTsKKworCWlmIChwcml2LT5jYXJkXzgxOTJfdmVyc2lvbiA+ICh1OCkgVkVSU0lPTl84MTkwX0JEKSB7CisJCXJ0bDgxOTJfcGh5X2dldFR4UG93ZXIoZGV2KTsKKwkJcnRsODE5Ml9waHlfc2V0VHhQb3dlcihkZXYsIHByaXYtPmNoYW4pOworCX0KKworCXRtcHZhbHVlID0gcmVhZF9uaWNfYnl0ZShkZXYsIElDX1ZFUlJTSU9OKTsKKwlwcml2LT5JQ19DdXQgPSB0bXB2YWx1ZTsKKwlSVF9UUkFDRShDT01QX0lOSVQsICJwcml2LT5JQ19DdXQ9IDB4JXhcbiIsIHByaXYtPklDX0N1dCk7CisJaWYgKHByaXYtPklDX0N1dCA+PSBJQ19WZXJzaW9uQ3V0X0QpIHsKKwkJaWYgKHByaXYtPklDX0N1dCA9PSBJQ19WZXJzaW9uQ3V0X0QpIHsKKwkJCS8qIG5vIG1hdHRlciB3aGF0IGNoZWNrcGF0Y2ggc2F5cywgYnJhY2VzIGFyZSBuZWVkZWQgKi8KKwkJCVJUX1RSQUNFKENPTVBfSU5JVCwgIkQtY3V0XG4iKTsKKwkJfSBlbHNlIGlmIChwcml2LT5JQ19DdXQgPT0gSUNfVmVyc2lvbkN1dF9FKSB7CisJCQlSVF9UUkFDRShDT01QX0lOSVQsICJFLWN1dFxuIik7CisJCX0KKwl9IGVsc2UgeworCQlSVF9UUkFDRShDT01QX0lOSVQsICJCZWZvcmUgQy1jdXRcbiIpOworCX0KKworCVJUX1RSQUNFKENPTVBfSU5JVCwgIkxvYWQgRmlybXdhcmUhXG4iKTsKKwliZmlybXdhcmVvayA9IGluaXRfZmlybXdhcmUoZGV2KTsKKwlpZiAoIWJmaXJtd2FyZW9rKSB7CisJCWlmIChyZXRyeV90aW1lcyA8IDEwKSB7CisJCQlyZXRyeV90aW1lcysrOworCQkJZ290byBzdGFydDsKKwkJfSBlbHNlIHsKKwkJCXJ0U3RhdHVzID0gZmFsc2U7CisJCQlnb3RvIGVuZDsKKwkJfQorCX0KKwlSVF9UUkFDRShDT01QX0lOSVQsICJMb2FkIEZpcm13YXJlIGZpbmlzaGVkIVxuIik7CisJaWYgKHByaXYtPlJlc2V0UHJvZ3Jlc3MgPT0gUkVTRVRfVFlQRV9OT1JFU0VUKSB7CisJCVJUX1RSQUNFKENPTVBfSU5JVCwgIlJGIENvbmZpZyBTdGFydGVkIVxuIik7CisJCXJ0U3RhdHVzID0gcnRsODE5Ml9waHlfUkZDb25maWcoZGV2KTsKKwkJaWYgKHJ0U3RhdHVzICE9IHRydWUpIHsKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCAiUkYgQ29uZmlnIGZhaWxlZFxuIik7CisJCQlyZXR1cm4gcnRTdGF0dXM7CisJCX0KKwkJUlRfVFJBQ0UoQ09NUF9JTklULCAiUkYgQ29uZmlnIEZpbmlzaGVkIVxuIik7CisJfQorCXJ0bDgxOTJfcGh5X3VwZGF0ZUluaXRHYWluKGRldik7CisKKwlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX1JGTU9ELCBiQ0NLRW4sIDB4MSk7CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9SRk1PRCwgYk9GRE1FbiwgMHgxKTsKKworCXdyaXRlX25pY19ieXRlKGRldiwgMHg4NywgMHgwKTsKKworCWlmIChwcml2LT5SZWdSZk9mZiA9PSB0cnVlKSB7CisJCVJUX1RSQUNFKChDT01QX0lOSVQgfCBDT01QX1JGIHwgQ09NUF9QT1dFUiksCisJCQkgICIlcygpOiBUdXJuIG9mZiBSRiBmb3IgUmVnUmZPZmYgLS0tLS0tLS0tLVxuIiwKKwkJCSAgX19mdW5jX18pOworCQlNZ250QWN0U2V0X1JGX1N0YXRlKGRldiwgZVJmT2ZmLCBSRl9DSEFOR0VfQllfU1csIHRydWUpOworCX0gZWxzZSBpZiAocHJpdi0+cnRsbGliLT5SZk9mZlJlYXNvbiA+IFJGX0NIQU5HRV9CWV9QUykgeworCQlSVF9UUkFDRSgoQ09NUF9JTklUfENPTVBfUkZ8Q09NUF9QT1dFUiksICIlcygpOiBUdXJuIG9mZiBSRiBmb3IiCisJCQkgIiBSZk9mZlJlYXNvbiglZCkgLS0tLS0tLS0tLVxuIiwgX19mdW5jX18sCisJCQkgcHJpdi0+cnRsbGliLT5SZk9mZlJlYXNvbik7CisJCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2LCBlUmZPZmYsIHByaXYtPnJ0bGxpYi0+UmZPZmZSZWFzb24sCisJCQkJICAgIHRydWUpOworCX0gZWxzZSBpZiAocHJpdi0+cnRsbGliLT5SZk9mZlJlYXNvbiA+PSBSRl9DSEFOR0VfQllfSVBTKSB7CisJCVJUX1RSQUNFKChDT01QX0lOSVR8Q09NUF9SRnxDT01QX1BPV0VSKSwgIiVzKCk6IFR1cm4gb2ZmIFJGIGZvciIKKwkJCSAiIFJmT2ZmUmVhc29uKCVkKSAtLS0tLS0tLS0tXG4iLCBfX2Z1bmNfXywKKwkJCSBwcml2LT5ydGxsaWItPlJmT2ZmUmVhc29uKTsKKwkJTWdudEFjdFNldF9SRl9TdGF0ZShkZXYsIGVSZk9mZiwgcHJpdi0+cnRsbGliLT5SZk9mZlJlYXNvbiwKKwkJCQkgICAgdHJ1ZSk7CisJfSBlbHNlIHsKKwkJUlRfVFJBQ0UoKENPTVBfSU5JVHxDT01QX1JGfENPTVBfUE9XRVIpLCAiJXMoKTogUkYtT05cbiIsCisJCQkgIF9fZnVuY19fKTsKKwkJcHJpdi0+cnRsbGliLT5lUkZQb3dlclN0YXRlID0gZVJmT247CisJCXByaXYtPnJ0bGxpYi0+UmZPZmZSZWFzb24gPSAwOworCX0KKworCWlmIChwcml2LT5ydGxsaWItPkZ3UldSRikKKwkJcHJpdi0+UmZfTW9kZSA9IFJGX09QX0J5X0ZXOworCWVsc2UKKwkJcHJpdi0+UmZfTW9kZSA9IFJGX09QX0J5X1NXXzN3aXJlOworCisJaWYgKHByaXYtPlJlc2V0UHJvZ3Jlc3MgPT0gUkVTRVRfVFlQRV9OT1JFU0VUKSB7CisJCWRtX2luaXRpYWxpemVfdHhwb3dlcl90cmFja2luZyhkZXYpOworCisJCWlmIChwcml2LT5JQ19DdXQgPj0gSUNfVmVyc2lvbkN1dF9EKSB7CisJCQl0bXBSZWdBID0gcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwKKwkJCQkgIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIGJNYXNrRFdvcmQpOworCQkJdG1wUmVnQyA9IHJ0bDgxOTJfUXVlcnlCQlJlZyhkZXYsCisJCQkJICByT0ZETTBfWENUeElRSW1iYWxhbmNlLCBiTWFza0RXb3JkKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBUeEJCR2FpblRhYmxlTGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAodG1wUmVnQSA9PQorCQkJCSAgICBwcml2LT50eGJiZ2Fpbl90YWJsZVtpXS50eGJiZ2Fpbl92YWx1ZSkgeworCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXggPSAodTgpaTsKKwkJCQkJcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwgPQorCQkJCQkJICh1OClpOworCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5nX2RlZmF1bHQgPQorCQkJCQkJIHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlUZW1wQ0NrID0gcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwKKwkJCQkgIHJDQ0swX1R4RmlsdGVyMSwgYk1hc2tCeXRlMik7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBDQ0tUeEJCR2FpblRhYmxlTGVuZ3RoOyBpKyspIHsKKwkJCQlpZiAoVGVtcENDayA9PSBwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbaV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdKSB7CisJCQkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fMjBNZGVmYXVsdCA9ICh1OClpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uXzQwTWRlZmF1bHQgPSAwOworCQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlID0gMDsKKwkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPQorCQkJCSAgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl8yME1kZWZhdWx0OworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInByaXYtPnJmYV90eHBvd2VyIgorCQkJCSAidHJhY2tpbmdpbmRleF9pbml0aWFsID0gJWRcbiIsCisJCQkJIHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCk7CisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+cmZhX3R4cG93ZXIiCisJCQkJICJ0cmFja2luZ2luZGV4X3JlYWxfX2luaXRpYWwgPSAlZFxuIiwKKwkJCQkgcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwpOworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInByaXYtPkNDS1ByZXNlbnQiCisJCQkJICJBdHRlbnR1YXRpb25fZGlmZmVyZW5jZV9pbml0aWFsID0gJWRcbiIsCisJCQkJICBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UpOworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInByaXYtPkNDS1ByZXNlbnQiCisJCQkJICJBdHRlbnR1YXRpb25faW5pdGlhbCA9ICVkXG4iLAorCQkJCSBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKTsKKwkJCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nID0gZmFsc2U7CisJCX0KKwl9CisJcnRsODE5Ml9pcnFfZW5hYmxlKGRldik7CitlbmQ6CisJcHJpdi0+YmVpbmdfaW5pdF9hZGFwdGVyID0gZmFsc2U7CisJcmV0dXJuIHJ0U3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBydGw4MTkyX25ldF91cGRhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKm5ldDsKKwl1MTYgQmNuVGltZUNmZyA9IDAsIEJjbkNXID0gNiwgQmNuSUZTID0gMHhmOworCXUxNiByYXRlX2NvbmZpZyA9IDA7CisKKwluZXQgPSAmcHJpdi0+cnRsbGliLT5jdXJyZW50X25ldHdvcms7CisJcnRsODE5Ml9jb25maWdfcmF0ZShkZXYsICZyYXRlX2NvbmZpZyk7CisJcHJpdi0+ZG90MTFDdXJyZW50UHJlYW1ibGVNb2RlID0gUFJFQU1CTEVfQVVUTzsKKwkgcHJpdi0+YmFzaWNfcmF0ZSA9IHJhdGVfY29uZmlnICY9IDB4MTVmOworCXdyaXRlX25pY19kd29yZChkZXYsIEJTU0lEUiwgKCh1MzIgKiluZXQtPmJzc2lkKVswXSk7CisJd3JpdGVfbmljX3dvcmQoZGV2LCBCU1NJRFIrNCwgKCh1MTYgKiluZXQtPmJzc2lkKVsyXSk7CisKKwlpZiAocHJpdi0+cnRsbGliLT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBBVElNV05ELCAyKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBCQ05fRE1BVElNRSwgMjU2KTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBCQ05fSU5URVJWQUwsIG5ldC0+YmVhY29uX2ludGVydmFsKTsKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBCQ05fRFJWX0VBUkxZX0lOVCwgMTApOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEJDTl9FUlJfVEhSRVNILCAxMDApOworCisJCUJjblRpbWVDZmcgfD0gKEJjbkNXPDxCQ05fVENGR19DV19TSElGVCk7CisJCUJjblRpbWVDZmcgfD0gQmNuSUZTPDxCQ05fVENGR19JRlM7CisKKwkJd3JpdGVfbmljX3dvcmQoZGV2LCBCQ05fVENGRywgQmNuVGltZUNmZyk7CisJfQorfQorCit2b2lkIHJ0bDgxOTJfbGlua19jaGFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUgPSBwcml2LT5ydGxsaWI7CisKKwlpZiAoIXByaXYtPnVwKQorCQlyZXR1cm47CisKKwlpZiAoaWVlZS0+c3RhdGUgPT0gUlRMTElCX0xJTktFRCkgeworCQlydGw4MTkyX25ldF91cGRhdGUoZGV2KTsKKwkJcHJpdi0+b3BzLT51cGRhdGVfcmF0cl90YWJsZShkZXYpOworCQlpZiAoKEtFWV9UWVBFX1dFUDQwID09IGllZWUtPnBhaXJ3aXNlX2tleV90eXBlKSB8fAorCQkgICAgKEtFWV9UWVBFX1dFUDEwNCA9PSBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSkpCisJCQlFbmFibGVIV1NlY3VyaXR5Q29uZmlnODE5MihkZXYpOworCX0gZWxzZSB7CisJCXdyaXRlX25pY19ieXRlKGRldiwgMHgxNzMsIDApOworCX0KKwlydGw4MTkyZV91cGRhdGVfbXNyKGRldik7CisKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBIHx8IGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgeworCQl1MzIgcmVnID0gMDsKKwkJcmVnID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBSQ1IpOworCQlpZiAocHJpdi0+cnRsbGliLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEKSB7CisJCQlpZiAoaWVlZS0+SW50ZWxQcm9taXNjdW91c01vZGVJbmZvLmJQcm9taXNjdW91c09uKQorCQkJCTsKKwkJCWVsc2UKKwkJCQlwcml2LT5SZWNlaXZlQ29uZmlnID0gcmVnIHw9IFJDUl9DQlNTSUQ7CisJCX0gZWxzZQorCQkJcHJpdi0+UmVjZWl2ZUNvbmZpZyA9IHJlZyAmPSB+UkNSX0NCU1NJRDsKKworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSQ1IsIHJlZyk7CisJfQorfQorCit2b2lkIHJ0bDgxOTJfQWxsb3dBbGxEZXN0QWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgYm9vbCBiQWxsb3dBbGxEQSwgYm9vbCBXcml0ZUludG9SZWcpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJaWYgKGJBbGxvd0FsbERBKQorCQlwcml2LT5SZWNlaXZlQ29uZmlnIHw9IFJDUl9BQVA7CisJZWxzZQorCQlwcml2LT5SZWNlaXZlQ29uZmlnICY9IH5SQ1JfQUFQOworCisJaWYgKFdyaXRlSW50b1JlZykKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgUkNSLCBwcml2LT5SZWNlaXZlQ29uZmlnKTsKK30KKworc3RhdGljIHU4IE1SYXRlVG9Id1JhdGU4MTkwUGNpKHU4IHJhdGUpCit7CisJdTggIHJldCA9IERFU0M5MF9SQVRFMU07CisKKwlzd2l0Y2ggKHJhdGUpIHsKKwljYXNlIE1HTl8xTToKKwkJcmV0ID0gREVTQzkwX1JBVEUxTTsKKwkJYnJlYWs7CisJY2FzZSBNR05fMk06CisJCXJldCA9IERFU0M5MF9SQVRFMk07CisJCWJyZWFrOworCWNhc2UgTUdOXzVfNU06CisJCXJldCA9IERFU0M5MF9SQVRFNV81TTsKKwkJYnJlYWs7CisJY2FzZSBNR05fMTFNOgorCQlyZXQgPSBERVNDOTBfUkFURTExTTsKKwkJYnJlYWs7CisJY2FzZSBNR05fNk06CisJCXJldCA9IERFU0M5MF9SQVRFNk07CisJCWJyZWFrOworCWNhc2UgTUdOXzlNOgorCQlyZXQgPSBERVNDOTBfUkFURTlNOworCQlicmVhazsKKwljYXNlIE1HTl8xMk06CisJCXJldCA9IERFU0M5MF9SQVRFMTJNOworCQlicmVhazsKKwljYXNlIE1HTl8xOE06CisJCXJldCA9IERFU0M5MF9SQVRFMThNOworCQlicmVhazsKKwljYXNlIE1HTl8yNE06CisJCXJldCA9IERFU0M5MF9SQVRFMjRNOworCQlicmVhazsKKwljYXNlIE1HTl8zNk06CisJCXJldCA9IERFU0M5MF9SQVRFMzZNOworCQlicmVhazsKKwljYXNlIE1HTl80OE06CisJCXJldCA9IERFU0M5MF9SQVRFNDhNOworCQlicmVhazsKKwljYXNlIE1HTl81NE06CisJCXJldCA9IERFU0M5MF9SQVRFNTRNOworCQlicmVhazsKKwljYXNlIE1HTl9NQ1MwOgorCQlyZXQgPSBERVNDOTBfUkFURU1DUzA7CisJCWJyZWFrOworCWNhc2UgTUdOX01DUzE6CisJCXJldCA9IERFU0M5MF9SQVRFTUNTMTsKKwkJYnJlYWs7CisJY2FzZSBNR05fTUNTMjoKKwkJcmV0ID0gREVTQzkwX1JBVEVNQ1MyOworCQlicmVhazsKKwljYXNlIE1HTl9NQ1MzOgorCQlyZXQgPSBERVNDOTBfUkFURU1DUzM7CisJCWJyZWFrOworCWNhc2UgTUdOX01DUzQ6CisJCXJldCA9IERFU0M5MF9SQVRFTUNTNDsKKwkJYnJlYWs7CisJY2FzZSBNR05fTUNTNToKKwkJcmV0ID0gREVTQzkwX1JBVEVNQ1M1OworCQlicmVhazsKKwljYXNlIE1HTl9NQ1M2OgorCQlyZXQgPSBERVNDOTBfUkFURU1DUzY7CisJCWJyZWFrOworCWNhc2UgTUdOX01DUzc6CisJCXJldCA9IERFU0M5MF9SQVRFTUNTNzsKKwkJYnJlYWs7CisJY2FzZSBNR05fTUNTODoKKwkJcmV0ID0gREVTQzkwX1JBVEVNQ1M4OworCQlicmVhazsKKwljYXNlIE1HTl9NQ1M5OgorCQlyZXQgPSBERVNDOTBfUkFURU1DUzk7CisJCWJyZWFrOworCWNhc2UgTUdOX01DUzEwOgorCQlyZXQgPSBERVNDOTBfUkFURU1DUzEwOworCQlicmVhazsKKwljYXNlIE1HTl9NQ1MxMToKKwkJcmV0ID0gREVTQzkwX1JBVEVNQ1MxMTsKKwkJYnJlYWs7CisJY2FzZSBNR05fTUNTMTI6CisJCXJldCA9IERFU0M5MF9SQVRFTUNTMTI7CisJCWJyZWFrOworCWNhc2UgTUdOX01DUzEzOgorCQlyZXQgPSBERVNDOTBfUkFURU1DUzEzOworCQlicmVhazsKKwljYXNlIE1HTl9NQ1MxNDoKKwkJcmV0ID0gREVTQzkwX1JBVEVNQ1MxNDsKKwkJYnJlYWs7CisJY2FzZSBNR05fTUNTMTU6CisJCXJldCA9IERFU0M5MF9SQVRFTUNTMTU7CisJCWJyZWFrOworCWNhc2UgKDB4ODB8MHgyMCk6CisJCXJldCA9IERFU0M5MF9SQVRFTUNTMzI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTggcnRsODE5Ml9NYXBId1F1ZXVlVG9GaXJtd2FyZVF1ZXVlKHU4IFF1ZXVlSUQsIHU4IHByaW9yaXR5KQoreworCXU4IFF1ZXVlU2VsZWN0ID0gMHgwOworCisJc3dpdGNoIChRdWV1ZUlEKSB7CisJY2FzZSBCRV9RVUVVRToKKwkJUXVldWVTZWxlY3QgPSBRU0xUX0JFOworCQlicmVhazsKKworCWNhc2UgQktfUVVFVUU6CisJCVF1ZXVlU2VsZWN0ID0gUVNMVF9CSzsKKwkJYnJlYWs7CisKKwljYXNlIFZPX1FVRVVFOgorCQlRdWV1ZVNlbGVjdCA9IFFTTFRfVk87CisJCWJyZWFrOworCisJY2FzZSBWSV9RVUVVRToKKwkJUXVldWVTZWxlY3QgPSBRU0xUX1ZJOworCQlicmVhazsKKwljYXNlIE1HTlRfUVVFVUU6CisJCVF1ZXVlU2VsZWN0ID0gUVNMVF9NR05UOworCQlicmVhazsKKwljYXNlIEJFQUNPTl9RVUVVRToKKwkJUXVldWVTZWxlY3QgPSBRU0xUX0JFQUNPTjsKKwkJYnJlYWs7CisJY2FzZSBUWENNRF9RVUVVRToKKwkJUXVldWVTZWxlY3QgPSBRU0xUX0NNRDsKKwkJYnJlYWs7CisJY2FzZSBISUdIX1FVRVVFOgorCQlRdWV1ZVNlbGVjdCA9IFFTTFRfSElHSDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJUcmFuc21pdFRDQigpOiBJbXBvc3NpYmxlIFF1ZXVlIFNlbGVjdGlvbjoiCisJCQkgIiAlZFxuIiwgUXVldWVJRCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gUXVldWVTZWxlY3Q7Cit9CisKK3ZvaWQgIHJ0bDgxOTJfdHhfZmlsbF9kZXNjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB0eF9kZXNjICpwZGVzYywKKwkJCSAgIHN0cnVjdCBjYl9kZXNjICpjYl9kZXNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlkbWFfYWRkcl90IG1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLAorCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCXN0cnVjdCB0eF9md2luZm9fODE5MHBjaSAqcFR4RndJbmZvID0gTlVMTDsKKwlwVHhGd0luZm8gPSAoc3RydWN0IHR4X2Z3aW5mb184MTkwcGNpICopc2tiLT5kYXRhOworCW1lbXNldChwVHhGd0luZm8sIDAsIHNpemVvZihzdHJ1Y3QgdHhfZndpbmZvXzgxOTBwY2kpKTsKKwlwVHhGd0luZm8tPlR4SFQgPSAoY2JfZGVzYy0+ZGF0YV9yYXRlICYgMHg4MCkgPyAxIDogMDsKKwlwVHhGd0luZm8tPlR4UmF0ZSA9IE1SYXRlVG9Id1JhdGU4MTkwUGNpKCh1OCljYl9kZXNjLT5kYXRhX3JhdGUpOworCXBUeEZ3SW5mby0+RW5hYmxlQ1BVRHVyID0gY2JfZGVzYy0+YlR4RW5hYmxlRndDYWxjRHVyOworCXBUeEZ3SW5mby0+U2hvcnQgPSBydGw4MTkyX1F1ZXJ5SXNTaG9ydChwVHhGd0luZm8tPlR4SFQsCisJCQkJCQlwVHhGd0luZm8tPlR4UmF0ZSwKKwkJCQkJCWNiX2Rlc2MpOworCisJaWYgKGNiX2Rlc2MtPmJBTVBEVUVuYWJsZSkgeworCQlwVHhGd0luZm8tPkFsbG93QWdncmVnYXRpb24gPSAxOworCQlwVHhGd0luZm8tPlJ4TUYgPSBjYl9kZXNjLT5hbXBkdV9mYWN0b3I7CisJCXBUeEZ3SW5mby0+UnhBTUQgPSBjYl9kZXNjLT5hbXBkdV9kZW5zaXR5OworCX0gZWxzZSB7CisJCXBUeEZ3SW5mby0+QWxsb3dBZ2dyZWdhdGlvbiA9IDA7CisJCXBUeEZ3SW5mby0+UnhNRiA9IDA7CisJCXBUeEZ3SW5mby0+UnhBTUQgPSAwOworCX0KKworCXBUeEZ3SW5mby0+UnRzRW5hYmxlID0JKGNiX2Rlc2MtPmJSVFNFbmFibGUpID8gMSA6IDA7CisJcFR4RndJbmZvLT5DdHNFbmFibGUgPSAoY2JfZGVzYy0+YkNUU0VuYWJsZSkgPyAxIDogMDsKKwlwVHhGd0luZm8tPlJ0c1NUQkMgPSAoY2JfZGVzYy0+YlJUU1NUQkMpID8gMSA6IDA7CisJcFR4RndJbmZvLT5SdHNIVCA9IChjYl9kZXNjLT5ydHNfcmF0ZSYweDgwKSA/IDEgOiAwOworCXBUeEZ3SW5mby0+UnRzUmF0ZSA9IE1SYXRlVG9Id1JhdGU4MTkwUGNpKCh1OCljYl9kZXNjLT5ydHNfcmF0ZSk7CisJcFR4RndJbmZvLT5SdHNCYW5kd2lkdGggPSAwOworCXBUeEZ3SW5mby0+UnRzU3ViY2FycmllciA9IGNiX2Rlc2MtPlJUU1NDOworCXBUeEZ3SW5mby0+UnRzU2hvcnQgPSAocFR4RndJbmZvLT5SdHNIVCA9PSAwKSA/CisJCQkgIChjYl9kZXNjLT5iUlRTVXNlU2hvcnRQcmVhbWJsZSA/IDEgOiAwKSA6CisJCQkgIChjYl9kZXNjLT5iUlRTVXNlU2hvcnRHSSA/IDEgOiAwKTsKKwlpZiAocHJpdi0+Q3VycmVudENoYW5uZWxCVyA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwXzQwKSB7CisJCWlmIChjYl9kZXNjLT5iUGFja2V0QlcpIHsKKwkJCXBUeEZ3SW5mby0+VHhCYW5kd2lkdGggPSAxOworCQkJcFR4RndJbmZvLT5UeFN1YkNhcnJpZXIgPSAwOworCQl9IGVsc2UgeworCQkJcFR4RndJbmZvLT5UeEJhbmR3aWR0aCA9IDA7CisJCQlwVHhGd0luZm8tPlR4U3ViQ2FycmllciA9IHByaXYtPm5DdXI0ME1oelByaW1lU0M7CisJCX0KKwl9IGVsc2UgeworCQlwVHhGd0luZm8tPlR4QmFuZHdpZHRoID0gMDsKKwkJcFR4RndJbmZvLT5UeFN1YkNhcnJpZXIgPSAwOworCX0KKworCW1lbXNldCgodTggKilwZGVzYywgMCwgMTIpOworCXBkZXNjLT5MSU5JUCA9IDA7CisJcGRlc2MtPkNtZEluaXQgPSAxOworCXBkZXNjLT5PZmZzZXQgPSBzaXplb2Yoc3RydWN0IHR4X2Z3aW5mb184MTkwcGNpKSArIDg7CisJcGRlc2MtPlBrdFNpemUgPSAodTE2KXNrYi0+bGVuLXNpemVvZihzdHJ1Y3QgdHhfZndpbmZvXzgxOTBwY2kpOworCisJcGRlc2MtPlNlY0NBTUlEID0gMDsKKwlwZGVzYy0+UkFUaWQgPSBjYl9kZXNjLT5SQVRSSW5kZXg7CisKKworCXBkZXNjLT5Ob0VuYyA9IDE7CisJcGRlc2MtPlNlY1R5cGUgPSAweDA7CisJaWYgKGNiX2Rlc2MtPmJId1NlYykgeworCQlzdGF0aWMgdTggdG1wOworCQlpZiAoIXRtcCkgeworCQkJUlRfVFJBQ0UoQ09NUF9EQkcsICI9PT49PT09PT09PT09PT09PT09aHcgc2VjXG4iKTsKKwkJCXRtcCA9IDE7CisJCX0KKwkJc3dpdGNoIChwcml2LT5ydGxsaWItPnBhaXJ3aXNlX2tleV90eXBlKSB7CisJCWNhc2UgS0VZX1RZUEVfV0VQNDA6CisJCWNhc2UgS0VZX1RZUEVfV0VQMTA0OgorCQkJcGRlc2MtPlNlY1R5cGUgPSAweDE7CisJCQlwZGVzYy0+Tm9FbmMgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgS0VZX1RZUEVfVEtJUDoKKwkJCXBkZXNjLT5TZWNUeXBlID0gMHgyOworCQkJcGRlc2MtPk5vRW5jID0gMDsKKwkJCWJyZWFrOworCQljYXNlIEtFWV9UWVBFX0NDTVA6CisJCQlwZGVzYy0+U2VjVHlwZSA9IDB4MzsKKwkJCXBkZXNjLT5Ob0VuYyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBLRVlfVFlQRV9OQToKKwkJCXBkZXNjLT5TZWNUeXBlID0gMHgwOworCQkJcGRlc2MtPk5vRW5jID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcGRlc2MtPlBrdElkID0gMHgwOworCisJcGRlc2MtPlF1ZXVlU2VsZWN0ID0gcnRsODE5Ml9NYXBId1F1ZXVlVG9GaXJtd2FyZVF1ZXVlKAorCQkJCQkJY2JfZGVzYy0+cXVldWVfaW5kZXgsCisJCQkJCQljYl9kZXNjLT5wcmlvcml0eSk7CisJcGRlc2MtPlR4RldJbmZvU2l6ZSA9IHNpemVvZihzdHJ1Y3QgdHhfZndpbmZvXzgxOTBwY2kpOworCisJcGRlc2MtPkRJU0ZCID0gY2JfZGVzYy0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjazsKKwlwZGVzYy0+VVNFUkFURSA9IGNiX2Rlc2MtPmJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZTsKKworCXBkZXNjLT5GaXJzdFNlZyA9IDE7CisJcGRlc2MtPkxhc3RTZWcgPSAxOworCXBkZXNjLT5UeEJ1ZmZlclNpemUgPSBza2ItPmxlbjsKKworCXBkZXNjLT5UeEJ1ZmZBZGRyID0gY3B1X3RvX2xlMzIobWFwcGluZyk7Cit9CisKK3ZvaWQgIHJ0bDgxOTJfdHhfZmlsbF9jbWRfZGVzYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCB0eF9kZXNjX2NtZCAqZW50cnksCisJCQkgICAgICAgc3RydWN0IGNiX2Rlc2MgKmNiX2Rlc2MsIHN0cnVjdCBza19idWZmKiBza2IpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCWRtYV9hZGRyX3QgbWFwcGluZyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sCisJCQkgUENJX0RNQV9UT0RFVklDRSk7CisKKwltZW1zZXQoZW50cnksIDAsIDEyKTsKKwllbnRyeS0+TElOSVAgPSBjYl9kZXNjLT5iTGFzdEluaVBrdDsKKwllbnRyeS0+Rmlyc3RTZWcgPSAxOworCWVudHJ5LT5MYXN0U2VnID0gMTsKKwlpZiAoY2JfZGVzYy0+YkNtZE9ySW5pdCA9PSBERVNDX1BBQ0tFVF9UWVBFX0lOSVQpIHsKKwkJZW50cnktPkNtZEluaXQgPSBERVNDX1BBQ0tFVF9UWVBFX0lOSVQ7CisJfSBlbHNlIHsKKwkJc3RydWN0IHR4X2Rlc2MgKiBlbnRyeV90bXAgPSAoc3RydWN0IHR4X2Rlc2MgKillbnRyeTsKKwkJZW50cnlfdG1wLT5DbWRJbml0ID0gREVTQ19QQUNLRVRfVFlQRV9OT1JNQUw7CisJCWVudHJ5X3RtcC0+T2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCB0eF9md2luZm9fODE5MHBjaSkgKyA4OworCQllbnRyeV90bXAtPlBrdFNpemUgPSAodTE2KShjYl9kZXNjLT5wa3Rfc2l6ZSArCisJCQkJICAgICAgZW50cnlfdG1wLT5PZmZzZXQpOworCQllbnRyeV90bXAtPlF1ZXVlU2VsZWN0ID0gUVNMVF9DTUQ7CisJCWVudHJ5X3RtcC0+VHhGV0luZm9TaXplID0gMHgwODsKKwkJZW50cnlfdG1wLT5SQVRpZCA9ICh1OClERVNDX1BBQ0tFVF9UWVBFX0lOSVQ7CisJfQorCWVudHJ5LT5UeEJ1ZmZlclNpemUgPSBza2ItPmxlbjsKKwllbnRyeS0+VHhCdWZmQWRkciA9IGNwdV90b19sZTMyKG1hcHBpbmcpOworCWVudHJ5LT5PV04gPSAxOworfQorCitzdGF0aWMgdTggSHdSYXRlVG9NUmF0ZTkwKGJvb2wgYklzSFQsIHU4IHJhdGUpCit7CisJdTggIHJldF9yYXRlID0gMHgwMjsKKworCWlmICghYklzSFQpIHsKKwkJc3dpdGNoIChyYXRlKSB7CisJCWNhc2UgREVTQzkwX1JBVEUxTToKKwkJCXJldF9yYXRlID0gTUdOXzFNOworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkwX1JBVEUyTToKKwkJCXJldF9yYXRlID0gTUdOXzJNOworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkwX1JBVEU1XzVNOgorCQkJcmV0X3JhdGUgPSBNR05fNV81TTsKKwkJCWJyZWFrOworCQljYXNlIERFU0M5MF9SQVRFMTFNOgorCQkJcmV0X3JhdGUgPSBNR05fMTFNOworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkwX1JBVEU2TToKKwkJCXJldF9yYXRlID0gTUdOXzZNOworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkwX1JBVEU5TToKKwkJCXJldF9yYXRlID0gTUdOXzlNOworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkwX1JBVEUxMk06CisJCQlyZXRfcmF0ZSA9IE1HTl8xMk07CisJCQlicmVhazsKKwkJY2FzZSBERVNDOTBfUkFURTE4TToKKwkJCXJldF9yYXRlID0gTUdOXzE4TTsKKwkJCWJyZWFrOworCQljYXNlIERFU0M5MF9SQVRFMjRNOgorCQkJcmV0X3JhdGUgPSBNR05fMjRNOworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkwX1JBVEUzNk06CisJCQlyZXRfcmF0ZSA9IE1HTl8zNk07CisJCQlicmVhazsKKwkJY2FzZSBERVNDOTBfUkFURTQ4TToKKwkJCXJldF9yYXRlID0gTUdOXzQ4TTsKKwkJCWJyZWFrOworCQljYXNlIERFU0M5MF9SQVRFNTRNOgorCQkJcmV0X3JhdGUgPSBNR05fNTRNOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVJUX1RSQUNFKENPTVBfUkVDViwgIkh3UmF0ZVRvTVJhdGU5MCgpOiBOb24gc3VwcG9ydGVkIgorCQkJCSAiUmF0ZSBbJXhdLCBiSXNIVCA9ICVkISEhXG4iLCByYXRlLCBiSXNIVCk7CisJCQkJCQkgIGJyZWFrOworCQl9CisKKwl9IGVsc2UgeworCQlzd2l0Y2ggKHJhdGUpIHsKKwkJY2FzZSBERVNDOTBfUkFURU1DUzA6CisJCQlyZXRfcmF0ZSA9IE1HTl9NQ1MwOworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkwX1JBVEVNQ1MxOgorCQkJcmV0X3JhdGUgPSBNR05fTUNTMTsKKwkJCWJyZWFrOworCQljYXNlIERFU0M5MF9SQVRFTUNTMjoKKwkJCXJldF9yYXRlID0gTUdOX01DUzI7CisJCQlicmVhazsKKwkJY2FzZSBERVNDOTBfUkFURU1DUzM6CisJCQlyZXRfcmF0ZSA9IE1HTl9NQ1MzOworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkwX1JBVEVNQ1M0OgorCQkJcmV0X3JhdGUgPSBNR05fTUNTNDsKKwkJCWJyZWFrOworCQljYXNlIERFU0M5MF9SQVRFTUNTNToKKwkJCXJldF9yYXRlID0gTUdOX01DUzU7CisJCQlicmVhazsKKwkJY2FzZSBERVNDOTBfUkFURU1DUzY6CisJCQlyZXRfcmF0ZSA9IE1HTl9NQ1M2OworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkwX1JBVEVNQ1M3OgorCQkJcmV0X3JhdGUgPSBNR05fTUNTNzsKKwkJCWJyZWFrOworCQljYXNlIERFU0M5MF9SQVRFTUNTODoKKwkJCXJldF9yYXRlID0gTUdOX01DUzg7CisJCQlicmVhazsKKwkJY2FzZSBERVNDOTBfUkFURU1DUzk6CisJCQlyZXRfcmF0ZSA9IE1HTl9NQ1M5OworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkwX1JBVEVNQ1MxMDoKKwkJCXJldF9yYXRlID0gTUdOX01DUzEwOworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkwX1JBVEVNQ1MxMToKKwkJCXJldF9yYXRlID0gTUdOX01DUzExOworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkwX1JBVEVNQ1MxMjoKKwkJCXJldF9yYXRlID0gTUdOX01DUzEyOworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkwX1JBVEVNQ1MxMzoKKwkJCXJldF9yYXRlID0gTUdOX01DUzEzOworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkwX1JBVEVNQ1MxNDoKKwkJCXJldF9yYXRlID0gTUdOX01DUzE0OworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkwX1JBVEVNQ1MxNToKKwkJCXJldF9yYXRlID0gTUdOX01DUzE1OworCQkJYnJlYWs7CisJCWNhc2UgREVTQzkwX1JBVEVNQ1MzMjoKKwkJCXJldF9yYXRlID0gKDB4ODB8MHgyMCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUlRfVFJBQ0UoQ09NUF9SRUNWLCAiSHdSYXRlVG9NUmF0ZTkwKCk6IE5vbiBzdXBwb3J0ZWQgIgorCQkJCSAiUmF0ZSBbJXhdLCBiSXNIVCA9ICVkISEhXG4iLCByYXRlLCBiSXNIVCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXRfcmF0ZTsKK30KKworc3RhdGljIGxvbmcgcnRsODE5Ml9zaWduYWxfc2NhbGVfbWFwcGluZyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgbG9uZyBjdXJyc2lnKQoreworCWxvbmcgcmV0c2lnOworCisJaWYgKGN1cnJzaWcgPj0gNjEgJiYgY3VycnNpZyA8PSAxMDApCisJCXJldHNpZyA9IDkwICsgKChjdXJyc2lnIC0gNjApIC8gNCk7CisJZWxzZSBpZiAoY3VycnNpZyA+PSA0MSAmJiBjdXJyc2lnIDw9IDYwKQorCQlyZXRzaWcgPSA3OCArICgoY3VycnNpZyAtIDQwKSAvIDIpOworCWVsc2UgaWYgKGN1cnJzaWcgPj0gMzEgJiYgY3VycnNpZyA8PSA0MCkKKwkJcmV0c2lnID0gNjYgKyAoY3VycnNpZyAtIDMwKTsKKwllbHNlIGlmIChjdXJyc2lnID49IDIxICYmIGN1cnJzaWcgPD0gMzApCisJCXJldHNpZyA9IDU0ICsgKGN1cnJzaWcgLSAyMCk7CisJZWxzZSBpZiAoY3VycnNpZyA+PSA1ICYmIGN1cnJzaWcgPD0gMjApCisJCXJldHNpZyA9IDQyICsgKCgoY3VycnNpZyAtIDUpICogMikgLyAzKTsKKwllbHNlIGlmIChjdXJyc2lnID09IDQpCisJCXJldHNpZyA9IDM2OworCWVsc2UgaWYgKGN1cnJzaWcgPT0gMykKKwkJcmV0c2lnID0gMjc7CisJZWxzZSBpZiAoY3VycnNpZyA9PSAyKQorCQlyZXRzaWcgPSAxODsKKwllbHNlIGlmIChjdXJyc2lnID09IDEpCisJCXJldHNpZyA9IDk7CisJZWxzZQorCQlyZXRzaWcgPSBjdXJyc2lnOworCisJcmV0dXJuIHJldHNpZzsKK30KKworCisjZGVmaW5lCSByeF9oYWxfaXNfY2NrX3JhdGUoX3BkcnZpbmZvKVwKKwkJCSgoX3BkcnZpbmZvLT5SeFJhdGUgPT0gREVTQzkwX1JBVEUxTSB8fFwKKwkJCV9wZHJ2aW5mby0+UnhSYXRlID09IERFU0M5MF9SQVRFMk0gfHxcCisJCQlfcGRydmluZm8tPlJ4UmF0ZSA9PSBERVNDOTBfUkFURTVfNU0gfHxcCisJCQlfcGRydmluZm8tPlJ4UmF0ZSA9PSBERVNDOTBfUkFURTExTSkgJiZcCisJCQkhX3BkcnZpbmZvLT5SeEhUKQorCitzdGF0aWMgdm9pZCBydGw4MTkyX3F1ZXJ5X3J4cGh5c3RhdHVzKAorCXN0cnVjdCByODE5Ml9wcml2ICpwcml2LAorCXN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKnBzdGF0cywKKwlzdHJ1Y3QgcnhfZGVzYyAgKnBkZXNjLAorCXN0cnVjdCByeF9md2luZm8gICAqcGRydmluZm8sCisJc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqcHJlY29yZF9zdGF0cywKKwlib29sIGJwYWNrZXRfbWF0Y2hfYnNzaWQsCisJYm9vbCBicGFja2V0X3Rvc2VsZiwKKwlib29sIGJQYWNrZXRCZWFjb24sCisJYm9vbCBiVG9TZWxmQkEKKwkpCit7CisJc3RydWN0IHBoeV9zdHNfb2ZkbV84MTl4cGNpICpwb2ZkbV9idWY7CisJc3RydWN0IHBoeV9zdHNfY2NrXzgxOXhwY2kgKnBjY2tfYnVmOworCXN0cnVjdCBwaHlfb2ZkbV9yeF9zdGF0dXNfcnhzY19zZ2llbl9leGludGZmbGFnICpwcnhzYzsKKwl1OCAqcHJ4cGt0OworCXU4IGksIG1heF9zcGF0aWFsX3N0cmVhbSwgdG1wX3J4c25yLCB0bXBfcnhldm0sIHJ4c2Nfc2dpZW5fZXhmbGc7CisJY2hhciByeF9wd3JbNF0sIHJ4X3B3cl9hbGwgPSAwOworCWNoYXIgcnhfc25yWCwgcnhfZXZtWDsKKwl1OCBldm0sIHB3ZGJfYWxsOworCXUzMiBSU1NJLCB0b3RhbF9yc3NpID0gMDsKKwl1OCBpc19jY2tfcmF0ZSA9IDA7CisJdTggcmZfcnhfbnVtID0gMDsKKwlzdGF0aWMJdTggY2hlY2tfcmVnODI0OworCXN0YXRpYwl1MzIgcmVnODI0X2JpdDk7CisKKwlwcml2LT5zdGF0cy5udW1xcnlfcGh5c3RhdHVzKys7CisKKwlpc19jY2tfcmF0ZSA9IHJ4X2hhbF9pc19jY2tfcmF0ZShwZHJ2aW5mbyk7CisJbWVtc2V0KHByZWNvcmRfc3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzKSk7CisJcHN0YXRzLT5iUGFja2V0TWF0Y2hCU1NJRCA9IHByZWNvcmRfc3RhdHMtPmJQYWNrZXRNYXRjaEJTU0lEID0KKwkJCQkgICAgYnBhY2tldF9tYXRjaF9ic3NpZDsKKwlwc3RhdHMtPmJQYWNrZXRUb1NlbGYgPSBwcmVjb3JkX3N0YXRzLT5iUGFja2V0VG9TZWxmID0gYnBhY2tldF90b3NlbGY7CisJcHN0YXRzLT5iSXNDQ0sgPSBwcmVjb3JkX3N0YXRzLT5iSXNDQ0sgPSBpc19jY2tfcmF0ZTsKKwlwc3RhdHMtPmJQYWNrZXRCZWFjb24gPSBwcmVjb3JkX3N0YXRzLT5iUGFja2V0QmVhY29uID0gYlBhY2tldEJlYWNvbjsKKwlwc3RhdHMtPmJUb1NlbGZCQSA9IHByZWNvcmRfc3RhdHMtPmJUb1NlbGZCQSA9IGJUb1NlbGZCQTsKKwlpZiAoY2hlY2tfcmVnODI0ID09IDApIHsKKwkJcmVnODI0X2JpdDkgPSBydGw4MTkyX1F1ZXJ5QkJSZWcocHJpdi0+cnRsbGliLT5kZXYsCisJCQkgICAgICByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjIsIDB4MjAwKTsKKwkJY2hlY2tfcmVnODI0ID0gMTsKKwl9CisKKworCXByeHBrdCA9ICh1OCAqKXBkcnZpbmZvOworCisJcHJ4cGt0ICs9IHNpemVvZihzdHJ1Y3QgcnhfZndpbmZvKTsKKworCXBjY2tfYnVmID0gKHN0cnVjdCBwaHlfc3RzX2Nja184MTl4cGNpICopcHJ4cGt0OworCXBvZmRtX2J1ZiA9IChzdHJ1Y3QgcGh5X3N0c19vZmRtXzgxOXhwY2kgKilwcnhwa3Q7CisKKwlwc3RhdHMtPlJ4TUlNT1NpZ25hbFF1YWxpdHlbMF0gPSAtMTsKKwlwc3RhdHMtPlJ4TUlNT1NpZ25hbFF1YWxpdHlbMV0gPSAtMTsKKwlwcmVjb3JkX3N0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5WzBdID0gLTE7CisJcHJlY29yZF9zdGF0cy0+UnhNSU1PU2lnbmFsUXVhbGl0eVsxXSA9IC0xOworCisJaWYgKGlzX2Nja19yYXRlKSB7CisJCXU4IHJlcG9ydDsKKworCQlwcml2LT5zdGF0cy5udW1xcnlfcGh5c3RhdHVzQ0NLKys7CisJCWlmICghcmVnODI0X2JpdDkpIHsKKwkJCXJlcG9ydCA9IHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmIDB4YzA7CisJCQlyZXBvcnQgPSByZXBvcnQ+PjY7CisJCQlzd2l0Y2ggKHJlcG9ydCkgeworCQkJY2FzZSAweDM6CisJCQkJcnhfcHdyX2FsbCA9IC0zNSAtIChwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJgorCQkJCQkgICAgIDB4M2UpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDI6CisJCQkJcnhfcHdyX2FsbCA9IC0yMyAtIChwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJgorCQkJCQkgICAgIDB4M2UpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDE6CisJCQkJcnhfcHdyX2FsbCA9IC0xMSAtIChwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJgorCQkJCQkgICAgIDB4M2UpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDA6CisJCQkJcnhfcHdyX2FsbCA9IDggLSAocGNja19idWYtPmNja19hZ2NfcnB0ICYgMHgzZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXBvcnQgPSBwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJiAweDYwOworCQkJcmVwb3J0ID0gcmVwb3J0Pj41OworCQkJc3dpdGNoIChyZXBvcnQpIHsKKwkJCWNhc2UgMHgzOgorCQkJCXJ4X3B3cl9hbGwgPSAtMzUgLQorCQkJCQkoKHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmCisJCQkJCTB4MWYpIDw8IDEpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDI6CisJCQkJcnhfcHdyX2FsbCA9IC0yMyAtCisJCQkJCSgocGNja19idWYtPmNja19hZ2NfcnB0ICYKKwkJCQkJIDB4MWYpIDw8IDEpOworCQkJCWJyZWFrOworCQkJY2FzZSAweDE6CisJCQkJcnhfcHdyX2FsbCA9IC0xMSAtCisJCQkJCSAoKHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmCisJCQkJCSAweDFmKSA8PCAxKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwOgorCQkJCXJ4X3B3cl9hbGwgPSAtOCAtCisJCQkJCSAoKHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmCisJCQkJCSAweDFmKSA8PCAxKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXB3ZGJfYWxsID0gcnRsODE5eF9xdWVyeV9yeHB3cnBlcmNlbnRhZ2UocnhfcHdyX2FsbCk7CisJCXBzdGF0cy0+UnhQV0RCQWxsID0gcHJlY29yZF9zdGF0cy0+UnhQV0RCQWxsID0gcHdkYl9hbGw7CisJCXBzdGF0cy0+UmVjdlNpZ25hbFBvd2VyID0gcnhfcHdyX2FsbDsKKworCQlpZiAoYnBhY2tldF9tYXRjaF9ic3NpZCkgeworCQkJdTgJc3E7CisKKwkJCWlmIChwc3RhdHMtPlJ4UFdEQkFsbCA+IDQwKSB7CisJCQkJc3EgPSAxMDA7CisJCQl9IGVsc2UgeworCQkJCXNxID0gcGNja19idWYtPnNxX3JwdDsKKworCQkJCWlmIChwY2NrX2J1Zi0+c3FfcnB0ID4gNjQpCisJCQkJCXNxID0gMDsKKwkJCQllbHNlIGlmIChwY2NrX2J1Zi0+c3FfcnB0IDwgMjApCisJCQkJCXNxID0gMTAwOworCQkJCWVsc2UKKwkJCQkJc3EgPSAoKDY0LXNxKSAqIDEwMCkgLyA0NDsKKwkJCX0KKwkJCXBzdGF0cy0+U2lnbmFsUXVhbGl0eSA9IHNxOworCQkJcHJlY29yZF9zdGF0cy0+U2lnbmFsUXVhbGl0eSA9IHNxOworCQkJcHN0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5WzBdID0gc3E7CisJCQlwcmVjb3JkX3N0YXRzLT5SeE1JTU9TaWduYWxRdWFsaXR5WzBdID0gc3E7CisJCQlwc3RhdHMtPlJ4TUlNT1NpZ25hbFF1YWxpdHlbMV0gPSAtMTsKKwkJCXByZWNvcmRfc3RhdHMtPlJ4TUlNT1NpZ25hbFF1YWxpdHlbMV0gPSAtMTsKKwkJfQorCX0gZWxzZSB7CisJCXByaXYtPnN0YXRzLm51bXFyeV9waHlzdGF0dXNIVCsrOworCQlmb3IgKGkgPSBSRjkwX1BBVEhfQTsgaSA8IFJGOTBfUEFUSF9NQVg7IGkrKykgeworCQkJaWYgKHByaXYtPmJyZnBhdGhfcnhlbmFibGVbaV0pCisJCQkJcmZfcnhfbnVtKys7CisKKwkJCXJ4X3B3cltpXSA9ICgocG9mZG1fYnVmLT50cnN3X2dhaW5fWFtpXSAmIDB4M0YpICoKKwkJCQkgICAgIDIpIC0gMTEwOworCisJCQl0bXBfcnhzbnIgPSBwb2ZkbV9idWYtPnJ4c25yX1hbaV07CisJCQlyeF9zbnJYID0gKGNoYXIpKHRtcF9yeHNucik7CisJCQlyeF9zbnJYIC89IDI7CisJCQlwcml2LT5zdGF0cy5yeFNOUmRCW2ldID0gKGxvbmcpcnhfc25yWDsKKworCQkJUlNTSSA9IHJ0bDgxOXhfcXVlcnlfcnhwd3JwZXJjZW50YWdlKHJ4X3B3cltpXSk7CisJCQlpZiAocHJpdi0+YnJmcGF0aF9yeGVuYWJsZVtpXSkKKwkJCQl0b3RhbF9yc3NpICs9IFJTU0k7CisKKwkJCWlmIChicGFja2V0X21hdGNoX2Jzc2lkKSB7CisJCQkJcHN0YXRzLT5SeE1JTU9TaWduYWxTdHJlbmd0aFtpXSA9ICh1OCkgUlNTSTsKKwkJCQlwcmVjb3JkX3N0YXRzLT5SeE1JTU9TaWduYWxTdHJlbmd0aFtpXSA9CisJCQkJCQkJCSh1OCkgUlNTSTsKKwkJCX0KKwkJfQorCisKKwkJcnhfcHdyX2FsbCA9ICgoKHBvZmRtX2J1Zi0+cHdkYl9hbGwpID4+IDEpICYgMHg3ZikgLSAxMDY7CisJCXB3ZGJfYWxsID0gcnRsODE5eF9xdWVyeV9yeHB3cnBlcmNlbnRhZ2UocnhfcHdyX2FsbCk7CisKKwkJcHN0YXRzLT5SeFBXREJBbGwgPSBwcmVjb3JkX3N0YXRzLT5SeFBXREJBbGwgPSBwd2RiX2FsbDsKKwkJcHN0YXRzLT5SeFBvd2VyID0gcHJlY29yZF9zdGF0cy0+UnhQb3dlciA9CXJ4X3B3cl9hbGw7CisJCXBzdGF0cy0+UmVjdlNpZ25hbFBvd2VyID0gcnhfcHdyX2FsbDsKKwkJaWYgKHBkcnZpbmZvLT5SeEhUICYmIHBkcnZpbmZvLT5SeFJhdGUgPj0gREVTQzkwX1JBVEVNQ1M4ICYmCisJCSAgICBwZHJ2aW5mby0+UnhSYXRlIDw9IERFU0M5MF9SQVRFTUNTMTUpCisJCQltYXhfc3BhdGlhbF9zdHJlYW0gPSAyOworCQllbHNlCisJCQltYXhfc3BhdGlhbF9zdHJlYW0gPSAxOworCisJCWZvciAoaSA9IDA7IGkgPCBtYXhfc3BhdGlhbF9zdHJlYW07IGkrKykgeworCQkJdG1wX3J4ZXZtID0gcG9mZG1fYnVmLT5yeGV2bV9YW2ldOworCQkJcnhfZXZtWCA9IChjaGFyKSh0bXBfcnhldm0pOworCisJCQlyeF9ldm1YIC89IDI7CisKKwkJCWV2bSA9IHJ0bDgxOXhfZXZtX2RidG9wZXJjZW50YWdlKHJ4X2V2bVgpOworCQkJaWYgKGJwYWNrZXRfbWF0Y2hfYnNzaWQpIHsKKwkJCQlpZiAoaSA9PSAwKSB7CisJCQkJCXBzdGF0cy0+U2lnbmFsUXVhbGl0eSA9ICh1OCkoZXZtICYKKwkJCQkJCQkJIDB4ZmYpOworCQkJCQlwcmVjb3JkX3N0YXRzLT5TaWduYWxRdWFsaXR5ID0gKHU4KShldm0KKwkJCQkJCQkJCSYgMHhmZik7CisJCQkJfQorCQkJCXBzdGF0cy0+UnhNSU1PU2lnbmFsUXVhbGl0eVtpXSA9ICh1OCkoZXZtICYKKwkJCQkJCQkJIDB4ZmYpOworCQkJCXByZWNvcmRfc3RhdHMtPlJ4TUlNT1NpZ25hbFF1YWxpdHlbaV0gPSAodTgpKGV2bQorCQkJCQkJCQkJJiAweGZmKTsKKwkJCX0KKwkJfQorCisKKwkJcnhzY19zZ2llbl9leGZsZyA9IHBvZmRtX2J1Zi0+cnhzY19zZ2llbl9leGZsZzsKKwkJcHJ4c2MgPSAoc3RydWN0IHBoeV9vZmRtX3J4X3N0YXR1c19yeHNjX3NnaWVuX2V4aW50ZmZsYWcgKikKKwkJCSZyeHNjX3NnaWVuX2V4ZmxnOworCQlpZiAocGRydmluZm8tPkJXKQorCQkJcHJpdi0+c3RhdHMucmVjZWl2ZWRfYnd0eXBlWzErcHJ4c2MtPnJ4c2NdKys7CisJCWVsc2UKKwkJCXByaXYtPnN0YXRzLnJlY2VpdmVkX2J3dHlwZVswXSsrOworCX0KKworCWlmIChpc19jY2tfcmF0ZSkgeworCQlwc3RhdHMtPlNpZ25hbFN0cmVuZ3RoID0gcHJlY29yZF9zdGF0cy0+U2lnbmFsU3RyZW5ndGggPQorCQkJCQkgKHU4KShydGw4MTkyX3NpZ25hbF9zY2FsZV9tYXBwaW5nKHByaXYsCisJCQkJCSAobG9uZylwd2RiX2FsbCkpOworCisJfSBlbHNlIHsKKwkJaWYgKHJmX3J4X251bSAhPSAwKQorCQkJcHN0YXRzLT5TaWduYWxTdHJlbmd0aCA9IHByZWNvcmRfc3RhdHMtPlNpZ25hbFN0cmVuZ3RoID0KKwkJCQkJICh1OCkocnRsODE5Ml9zaWduYWxfc2NhbGVfbWFwcGluZyhwcml2LAorCQkJCQkgKGxvbmcpKHRvdGFsX3Jzc2kgLz0gcmZfcnhfbnVtKSkpOworCX0KK30KKworc3RhdGljIHZvaWQgcnRsODE5Ml9wcm9jZXNzX3BoeWluZm8oc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHU4ICpidWZmZXIsCisJCQkJICAgIHN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKnByZXZfc3QsCisJCQkJICAgIHN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKmN1cnJfc3QpCit7CisJYm9vbCBiY2hlY2sgPSBmYWxzZTsKKwl1OAlyZnBhdGg7CisJdTMyIGlqLCB0bXBfdmFsOworCXN0YXRpYyB1MzIgc2xpZGVfcnNzaV9pbmRleCwgc2xpZGVfcnNzaV9zdGF0aXN0aWNzOworCXN0YXRpYyB1MzIgc2xpZGVfZXZtX2luZGV4LCBzbGlkZV9ldm1fc3RhdGlzdGljczsKKwlzdGF0aWMgdTMyIGxhc3RfcnNzaSwgbGFzdF9ldm07CisJc3RhdGljIHUzMiBzbGlkZV9iZWFjb25fYWRjX3B3ZGJfaW5kZXg7CisJc3RhdGljIHUzMiBzbGlkZV9iZWFjb25fYWRjX3B3ZGJfc3RhdGlzdGljczsKKwlzdGF0aWMgdTMyIGxhc3RfYmVhY29uX2FkY19wd2RiOworCXN0cnVjdCBydGxsaWJfaGRyXzNhZGRyICpoZHI7CisJdTE2IHNjOworCXVuc2lnbmVkIGludCBmcmFnLCBzZXE7CisKKwloZHIgPSAoc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgKilidWZmZXI7CisJc2MgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdGwpOworCWZyYWcgPSBXTEFOX0dFVF9TRVFfRlJBRyhzYyk7CisJc2VxID0gV0xBTl9HRVRfU0VRX1NFUShzYyk7CisJY3Vycl9zdC0+U2VxX051bSA9IHNlcTsKKwlpZiAoIXByZXZfc3QtPmJJc0FNUERVKQorCQliY2hlY2sgPSB0cnVlOworCisJaWYgKHNsaWRlX3Jzc2lfc3RhdGlzdGljcysrID49IFBIWV9SU1NJX1NMSURfV0lOX01BWCkgeworCQlzbGlkZV9yc3NpX3N0YXRpc3RpY3MgPSBQSFlfUlNTSV9TTElEX1dJTl9NQVg7CisJCWxhc3RfcnNzaSA9IHByaXYtPnN0YXRzLnNsaWRlX3NpZ25hbF9zdHJlbmd0aFtzbGlkZV9yc3NpX2luZGV4XTsKKwkJcHJpdi0+c3RhdHMuc2xpZGVfcnNzaV90b3RhbCAtPSBsYXN0X3Jzc2k7CisJfQorCXByaXYtPnN0YXRzLnNsaWRlX3Jzc2lfdG90YWwgKz0gcHJldl9zdC0+U2lnbmFsU3RyZW5ndGg7CisKKwlwcml2LT5zdGF0cy5zbGlkZV9zaWduYWxfc3RyZW5ndGhbc2xpZGVfcnNzaV9pbmRleCsrXSA9CisJCQkJCSBwcmV2X3N0LT5TaWduYWxTdHJlbmd0aDsKKwlpZiAoc2xpZGVfcnNzaV9pbmRleCA+PSBQSFlfUlNTSV9TTElEX1dJTl9NQVgpCisJCXNsaWRlX3Jzc2lfaW5kZXggPSAwOworCisJdG1wX3ZhbCA9IHByaXYtPnN0YXRzLnNsaWRlX3Jzc2lfdG90YWwvc2xpZGVfcnNzaV9zdGF0aXN0aWNzOworCXByaXYtPnN0YXRzLnNpZ25hbF9zdHJlbmd0aCA9IHJ0bDgxOXhfdHJhbnNsYXRlX3RvZGJtKHByaXYsCisJCQkJICAgICAgKHU4KXRtcF92YWwpOworCWN1cnJfc3QtPnJzc2kgPSBwcml2LT5zdGF0cy5zaWduYWxfc3RyZW5ndGg7CisJaWYgKCFwcmV2X3N0LT5iUGFja2V0TWF0Y2hCU1NJRCkgeworCQlpZiAoIXByZXZfc3QtPmJUb1NlbGZCQSkKKwkJCXJldHVybjsKKwl9CisKKwlpZiAoIWJjaGVjaykKKwkJcmV0dXJuOworCisJcnRsODE5eF9wcm9jZXNzX2Nja19yeHBhdGhzZWwocHJpdiwgcHJldl9zdCk7CisKKwlwcml2LT5zdGF0cy5udW1fcHJvY2Vzc19waHlpbmZvKys7CisJaWYgKCFwcmV2X3N0LT5iSXNDQ0sgJiYgcHJldl9zdC0+YlBhY2tldFRvU2VsZikgeworCQlmb3IgKHJmcGF0aCA9IFJGOTBfUEFUSF9BOyByZnBhdGggPCBSRjkwX1BBVEhfQzsgcmZwYXRoKyspIHsKKwkJCWlmICghcnRsODE5Ml9waHlfQ2hlY2tJc0xlZ2FsUkZQYXRoKHByaXYtPnJ0bGxpYi0+ZGV2LAorCQkJICAgIHJmcGF0aCkpCisJCQkJY29udGludWU7CisJCQlSVF9UUkFDRShDT01QX0RCRywgIkphY2tlbiAtPiBwUHJldmlvdXNzdGF0cy0+UnhNSU1PIgorCQkJCSAiU2lnbmFsU3RyZW5ndGhbcmZwYXRoXSAgPSAlZFxuIiwKKwkJCQkgcHJldl9zdC0+UnhNSU1PU2lnbmFsU3RyZW5ndGhbcmZwYXRoXSk7CisJCQlpZiAocHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0gPT0gMCkgeworCQkJCXByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdID0KKwkJCQkJIHByZXZfc3QtPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW3JmcGF0aF07CisJCQl9CisJCQlpZiAocHJldl9zdC0+UnhNSU1PU2lnbmFsU3RyZW5ndGhbcmZwYXRoXSAgPgorCQkJICAgIHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdKSB7CisJCQkJcHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0gPQorCQkJCQkoKHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdCisJCQkJCSogKFJYX1NNT09USCAtIDEpKSArCisJCQkJCShwcmV2X3N0LT5SeE1JTU9TaWduYWxTdHJlbmd0aAorCQkJCQlbcmZwYXRoXSkpIC8gKFJYX1NNT09USCk7CisJCQkJcHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0gPQorCQkJCQkgcHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0KKwkJCQkJICsgMTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0gPQorCQkJCSAgICgocHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0gKgorCQkJCSAgIChSWF9TTU9PVEgtMSkpICsKKwkJCQkgICAocHJldl9zdC0+UnhNSU1PU2lnbmFsU3RyZW5ndGhbcmZwYXRoXSkpIC8KKwkJCQkgICAoUlhfU01PT1RIKTsKKwkJCX0KKwkJCVJUX1RSQUNFKENPTVBfREJHLCAiSmFja2VuIC0+IHByaXYtPlJ4U3RhdHMuUnhSU1NJIgorCQkJCSAiUGVyY2VudGFnZVtyZlBhdGhdICA9ICVkXG4iLAorCQkJCSBwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZwYXRoXSk7CisJCX0KKwl9CisKKworCWlmIChwcmV2X3N0LT5iUGFja2V0QmVhY29uKSB7CisJCWlmIChzbGlkZV9iZWFjb25fYWRjX3B3ZGJfc3RhdGlzdGljcysrID49CisJCSAgICBQSFlfQmVhY29uX1JTU0lfU0xJRF9XSU5fTUFYKSB7CisJCQlzbGlkZV9iZWFjb25fYWRjX3B3ZGJfc3RhdGlzdGljcyA9CisJCQkJCSBQSFlfQmVhY29uX1JTU0lfU0xJRF9XSU5fTUFYOworCQkJbGFzdF9iZWFjb25fYWRjX3B3ZGIgPSBwcml2LT5zdGF0cy5TbGlkZV9CZWFjb25fcHdkYgorCQkJCQkgICAgICAgW3NsaWRlX2JlYWNvbl9hZGNfcHdkYl9pbmRleF07CisJCQlwcml2LT5zdGF0cy5TbGlkZV9CZWFjb25fVG90YWwgLT0gbGFzdF9iZWFjb25fYWRjX3B3ZGI7CisJCX0KKwkJcHJpdi0+c3RhdHMuU2xpZGVfQmVhY29uX1RvdGFsICs9IHByZXZfc3QtPlJ4UFdEQkFsbDsKKwkJcHJpdi0+c3RhdHMuU2xpZGVfQmVhY29uX3B3ZGJbc2xpZGVfYmVhY29uX2FkY19wd2RiX2luZGV4XSA9CisJCQkJCQkJIHByZXZfc3QtPlJ4UFdEQkFsbDsKKwkJc2xpZGVfYmVhY29uX2FkY19wd2RiX2luZGV4Kys7CisJCWlmIChzbGlkZV9iZWFjb25fYWRjX3B3ZGJfaW5kZXggPj0gUEhZX0JlYWNvbl9SU1NJX1NMSURfV0lOX01BWCkKKwkJCXNsaWRlX2JlYWNvbl9hZGNfcHdkYl9pbmRleCA9IDA7CisJCXByZXZfc3QtPlJ4UFdEQkFsbCA9IHByaXYtPnN0YXRzLlNsaWRlX0JlYWNvbl9Ub3RhbCAvCisJCQkJICAgICBzbGlkZV9iZWFjb25fYWRjX3B3ZGJfc3RhdGlzdGljczsKKwkJaWYgKHByZXZfc3QtPlJ4UFdEQkFsbCA+PSAzKQorCQkJcHJldl9zdC0+UnhQV0RCQWxsIC09IDM7CisJfQorCisJUlRfVFJBQ0UoQ09NUF9SWERFU0MsICJTbW9vdGggJXMgUFdEQiA9ICVkXG4iLAorCQkJCXByZXZfc3QtPmJJc0NDSyA/ICJDQ0siIDogIk9GRE0iLAorCQkJCXByZXZfc3QtPlJ4UFdEQkFsbCk7CisKKwlpZiAocHJldl9zdC0+YlBhY2tldFRvU2VsZiB8fCBwcmV2X3N0LT5iUGFja2V0QmVhY29uIHx8CisJICAgIHByZXZfc3QtPmJUb1NlbGZCQSkgeworCQlpZiAocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8IDApCisJCQlwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0gcHJldl9zdC0+UnhQV0RCQWxsOworCQlpZiAocHJldl9zdC0+UnhQV0RCQWxsID4gKHUzMilwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiKSB7CisJCQlwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0KKwkJCQkJKCgocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYikgKgorCQkJCQkoUlhfU01PT1RILTEpKSArCisJCQkJCShwcmV2X3N0LT5SeFBXREJBbGwpKSAvIChSWF9TTU9PVEgpOworCQkJcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA9CisJCQkJCSBwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiICsgMTsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPQorCQkJCQkoKChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiKSAqCisJCQkJCShSWF9TTU9PVEgtMSkpICsKKwkJCQkJKHByZXZfc3QtPlJ4UFdEQkFsbCkpIC8gKFJYX1NNT09USCk7CisJCX0KKwkJcnRsODE5eF91cGRhdGVfcnhzaWduYWxzdGF0aXN0aWNzODE5MHBjaShwcml2LCBwcmV2X3N0KTsKKwl9CisKKwlpZiAocHJldl9zdC0+U2lnbmFsUXVhbGl0eSAhPSAwKSB7CisJCWlmIChwcmV2X3N0LT5iUGFja2V0VG9TZWxmIHx8IHByZXZfc3QtPmJQYWNrZXRCZWFjb24gfHwKKwkJICAgIHByZXZfc3QtPmJUb1NlbGZCQSkgeworCQkJaWYgKHNsaWRlX2V2bV9zdGF0aXN0aWNzKysgPj0gUEhZX1JTU0lfU0xJRF9XSU5fTUFYKSB7CisJCQkJc2xpZGVfZXZtX3N0YXRpc3RpY3MgPSBQSFlfUlNTSV9TTElEX1dJTl9NQVg7CisJCQkJbGFzdF9ldm0gPQorCQkJCQkgcHJpdi0+c3RhdHMuc2xpZGVfZXZtW3NsaWRlX2V2bV9pbmRleF07CisJCQkJcHJpdi0+c3RhdHMuc2xpZGVfZXZtX3RvdGFsIC09IGxhc3RfZXZtOworCQkJfQorCisJCQlwcml2LT5zdGF0cy5zbGlkZV9ldm1fdG90YWwgKz0gcHJldl9zdC0+U2lnbmFsUXVhbGl0eTsKKworCQkJcHJpdi0+c3RhdHMuc2xpZGVfZXZtW3NsaWRlX2V2bV9pbmRleCsrXSA9CisJCQkJCQkgcHJldl9zdC0+U2lnbmFsUXVhbGl0eTsKKwkJCWlmIChzbGlkZV9ldm1faW5kZXggPj0gUEhZX1JTU0lfU0xJRF9XSU5fTUFYKQorCQkJCXNsaWRlX2V2bV9pbmRleCA9IDA7CisKKwkJCXRtcF92YWwgPSBwcml2LT5zdGF0cy5zbGlkZV9ldm1fdG90YWwgLworCQkJCSAgc2xpZGVfZXZtX3N0YXRpc3RpY3M7CisJCQlwcml2LT5zdGF0cy5zaWduYWxfcXVhbGl0eSA9IHRtcF92YWw7CisJCQlwcml2LT5zdGF0cy5sYXN0X3NpZ25hbF9zdHJlbmd0aF9pbnBlcmNlbnQgPSB0bXBfdmFsOworCQl9CisKKwkJaWYgKHByZXZfc3QtPmJQYWNrZXRUb1NlbGYgfHwKKwkJICAgIHByZXZfc3QtPmJQYWNrZXRCZWFjb24gfHwKKwkJICAgIHByZXZfc3QtPmJUb1NlbGZCQSkgeworCQkJZm9yIChpaiA9IDA7IGlqIDwgMjsgaWorKykgeworCQkJCWlmIChwcmV2X3N0LT5SeE1JTU9TaWduYWxRdWFsaXR5W2lqXSAhPSAtMSkgeworCQkJCQlpZiAocHJpdi0+c3RhdHMucnhfZXZtX3BlcmNlbnRhZ2VbaWpdID09IDApCisJCQkJCQlwcml2LT5zdGF0cy5yeF9ldm1fcGVyY2VudGFnZVtpal0gPQorCQkJCQkJICAgcHJldl9zdC0+UnhNSU1PU2lnbmFsUXVhbGl0eVtpal07CisJCQkJCXByaXYtPnN0YXRzLnJ4X2V2bV9wZXJjZW50YWdlW2lqXSA9CisJCQkJCSAgKChwcml2LT5zdGF0cy5yeF9ldm1fcGVyY2VudGFnZVtpal0gKgorCQkJCQkgIChSWF9TTU9PVEggLSAxKSkgKworCQkJCQkgIChwcmV2X3N0LT5SeE1JTU9TaWduYWxRdWFsaXR5W2lqXSkpIC8KKwkJCQkJICAoUlhfU01PT1RIKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfVHJhbnNsYXRlUnhTaWduYWxTdHVmZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgICBzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpwc3RhdHMsCisJCQkJCSAgIHN0cnVjdCByeF9kZXNjICpwZGVzYywKKwkJCQkJICAgc3RydWN0IHJ4X2Z3aW5mbyAqcGRydmluZm8pCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilydGxsaWJfcHJpdihkZXYpOworCWJvb2wgYnBhY2tldF9tYXRjaF9ic3NpZCwgYnBhY2tldF90b3NlbGY7CisJYm9vbCBiUGFja2V0QmVhY29uID0gZmFsc2U7CisJc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgKmhkcjsKKwlib29sIGJUb1NlbGZCQSA9IGZhbHNlOworCXN0YXRpYyBzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICBwcmV2aW91c19zdGF0czsKKwl1MTYgZmMsIHR5cGU7CisJdTggKnRtcF9idWY7CisJdTggKnByYWRkcjsKKworCXRtcF9idWYgPSBza2ItPmRhdGEgKyBwc3RhdHMtPlJ4RHJ2SW5mb1NpemUgKyBwc3RhdHMtPlJ4QnVmU2hpZnQ7CisKKwloZHIgPSAoc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgKil0bXBfYnVmOworCWZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCXR5cGUgPSBXTEFOX0ZDX0dFVF9UWVBFKGZjKTsKKwlwcmFkZHIgPSBoZHItPmFkZHIxOworCisJYnBhY2tldF9tYXRjaF9ic3NpZCA9ICgoUlRMTElCX0ZUWVBFX0NUTCAhPSB0eXBlKSAmJgorCQkJKCFjb21wYXJlX2V0aGVyX2FkZHIocHJpdi0+cnRsbGliLT4KKwkJCWN1cnJlbnRfbmV0d29yay5ic3NpZCwKKwkJCSAgIChmYyAmIFJUTExJQl9GQ1RMX1RPRFMpID8gaGRyLT5hZGRyMSA6CisJCQkgICAoZmMgJiBSVExMSUJfRkNUTF9GUk9NRFMpID8gaGRyLT5hZGRyMiA6IGhkci0+YWRkcjMpKQorCQkmJiAoIXBzdGF0cy0+Ykh3RXJyb3IpICYmICghcHN0YXRzLT5iQ1JDKSAmJiAoIXBzdGF0cy0+YklDVikpOworCWJwYWNrZXRfdG9zZWxmID0gIGJwYWNrZXRfbWF0Y2hfYnNzaWQgJiYJLyogY2hlY2sgdGhpcyAqLworCQkJICAoIWNvbXBhcmVfZXRoZXJfYWRkcihwcmFkZHIsCisJCQkgIHByaXYtPnJ0bGxpYi0+ZGV2LT5kZXZfYWRkcikpOworCWlmIChXTEFOX0ZDX0dFVF9GUkFNRVRZUEUoZmMpID09IFJUTExJQl9TVFlQRV9CRUFDT04pCisJCWJQYWNrZXRCZWFjb24gPSB0cnVlOworCWlmIChicGFja2V0X21hdGNoX2Jzc2lkKQorCQlwcml2LT5zdGF0cy5udW1wYWNrZXRfbWF0Y2hic3NpZCsrOworCWlmIChicGFja2V0X3Rvc2VsZikKKwkJcHJpdi0+c3RhdHMubnVtcGFja2V0X3Rvc2VsZisrOworCXJ0bDgxOTJfcHJvY2Vzc19waHlpbmZvKHByaXYsIHRtcF9idWYsICZwcmV2aW91c19zdGF0cywgcHN0YXRzKTsKKwlydGw4MTkyX3F1ZXJ5X3J4cGh5c3RhdHVzKHByaXYsIHBzdGF0cywgcGRlc2MsIHBkcnZpbmZvLAorCQkJCSAgJnByZXZpb3VzX3N0YXRzLCBicGFja2V0X21hdGNoX2Jzc2lkLAorCQkJCSAgYnBhY2tldF90b3NlbGYsIGJQYWNrZXRCZWFjb24sIGJUb1NlbGZCQSk7CisJcnRsODE5Ml9yZWNvcmRfcnhkZXNjX2ZvcmxhdGVydXNlKHBzdGF0cywgJnByZXZpb3VzX3N0YXRzKTsKK30KKworc3RhdGljIHZvaWQgcnRsODE5Ml9VcGRhdGVSZWNlaXZlZFJhdGVIaXN0b2dyYW1TdGF0aXN0aWNzKAorCQkJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICBzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpwc3RhdHMpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilydGxsaWJfcHJpdihkZXYpOworCXUzMiByY3ZUeXBlID0gMTsKKwl1MzIgcmF0ZUluZGV4OworCXUzMiBwcmVhbWJsZV9ndWFyZGludGVydmFsOworCisJaWYgKHBzdGF0cy0+YkNSQykKKwkJcmN2VHlwZSA9IDI7CisJZWxzZSBpZiAocHN0YXRzLT5iSUNWKQorCQlyY3ZUeXBlID0gMzsKKworCWlmIChwc3RhdHMtPmJTaG9ydFByZWFtYmxlKQorCQlwcmVhbWJsZV9ndWFyZGludGVydmFsID0gMTsKKwllbHNlCisJCXByZWFtYmxlX2d1YXJkaW50ZXJ2YWwgPSAwOworCisJc3dpdGNoIChwc3RhdHMtPnJhdGUpIHsKKwljYXNlIE1HTl8xTToKKwkJcmF0ZUluZGV4ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBNR05fMk06CisJCXJhdGVJbmRleCA9IDE7CisJCSBicmVhazsKKwljYXNlIE1HTl81XzVNOgorCQlyYXRlSW5kZXggPSAyOworCQlicmVhazsKKwljYXNlIE1HTl8xMU06CisJCXJhdGVJbmRleCA9IDM7CisJCWJyZWFrOworCWNhc2UgTUdOXzZNOgorCQlyYXRlSW5kZXggPSA0OworCQlicmVhazsKKwljYXNlIE1HTl85TToKKwkJcmF0ZUluZGV4ID0gNTsKKwkJYnJlYWs7CisJY2FzZSBNR05fMTJNOgorCQlyYXRlSW5kZXggPSA2OworCQlicmVhazsKKwljYXNlIE1HTl8xOE06CisJCXJhdGVJbmRleCA9IDc7CisJCSBicmVhazsKKwljYXNlIE1HTl8yNE06CisJCXJhdGVJbmRleCA9IDg7CisJCWJyZWFrOworCWNhc2UgTUdOXzM2TToKKwkJcmF0ZUluZGV4ID0gOTsKKwkJYnJlYWs7CisJY2FzZSBNR05fNDhNOgorCQlyYXRlSW5kZXggPSAxMDsKKwkJYnJlYWs7CisJY2FzZSBNR05fNTRNOgorCQlyYXRlSW5kZXggPSAxMTsKKwkJYnJlYWs7CisJY2FzZSBNR05fTUNTMDoKKwkJcmF0ZUluZGV4ID0gMTI7CisJCWJyZWFrOworCWNhc2UgTUdOX01DUzE6CisJCXJhdGVJbmRleCA9IDEzOworCQlicmVhazsKKwljYXNlIE1HTl9NQ1MyOgorCQlyYXRlSW5kZXggPSAxNDsKKwkJYnJlYWs7CisJY2FzZSBNR05fTUNTMzoKKwkJcmF0ZUluZGV4ID0gMTU7CisJCWJyZWFrOworCWNhc2UgTUdOX01DUzQ6CisJCXJhdGVJbmRleCA9IDE2OworCQlicmVhazsKKwljYXNlIE1HTl9NQ1M1OgorCQlyYXRlSW5kZXggPSAxNzsKKwkJYnJlYWs7CisJY2FzZSBNR05fTUNTNjoKKwkJcmF0ZUluZGV4ID0gMTg7CisJCWJyZWFrOworCWNhc2UgTUdOX01DUzc6CisJCXJhdGVJbmRleCA9IDE5OworCQlicmVhazsKKwljYXNlIE1HTl9NQ1M4OgorCQlyYXRlSW5kZXggPSAyMDsKKwkJYnJlYWs7CisJY2FzZSBNR05fTUNTOToKKwkJcmF0ZUluZGV4ID0gMjE7CisJCWJyZWFrOworCWNhc2UgTUdOX01DUzEwOgorCQlyYXRlSW5kZXggPSAyMjsKKwkJYnJlYWs7CisJY2FzZSBNR05fTUNTMTE6CisJCXJhdGVJbmRleCA9IDIzOworCQlicmVhazsKKwljYXNlIE1HTl9NQ1MxMjoKKwkJcmF0ZUluZGV4ID0gMjQ7CisJCWJyZWFrOworCWNhc2UgTUdOX01DUzEzOgorCQlyYXRlSW5kZXggPSAyNTsKKwkJYnJlYWs7CisJY2FzZSBNR05fTUNTMTQ6CisJCXJhdGVJbmRleCA9IDI2OworCQlicmVhazsKKwljYXNlIE1HTl9NQ1MxNToKKwkJcmF0ZUluZGV4ID0gMjc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJhdGVJbmRleCA9IDI4OworCQlicmVhazsKKwl9CisJcHJpdi0+c3RhdHMucmVjZWl2ZWRfcHJlYW1ibGVfR0lbcHJlYW1ibGVfZ3VhcmRpbnRlcnZhbF1bcmF0ZUluZGV4XSsrOworCXByaXYtPnN0YXRzLnJlY2VpdmVkX3JhdGVfaGlzdG9ncmFtWzBdW3JhdGVJbmRleF0rKzsKKwlwcml2LT5zdGF0cy5yZWNlaXZlZF9yYXRlX2hpc3RvZ3JhbVtyY3ZUeXBlXVtyYXRlSW5kZXhdKys7Cit9CisKK2Jvb2wgcnRsODE5Ml9yeF9xdWVyeV9zdGF0dXNfZGVzYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqc3RhdHMsCisJCQkJICBzdHJ1Y3QgcnhfZGVzYyAqcGRlc2MsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCXN0YXRzLT5iSUNWID0gcGRlc2MtPklDVjsKKwlzdGF0cy0+YkNSQyA9IHBkZXNjLT5DUkMzMjsKKwlzdGF0cy0+Ykh3RXJyb3IgPSBwZGVzYy0+Q1JDMzIgfCBwZGVzYy0+SUNWOworCisJc3RhdHMtPkxlbmd0aCA9IHBkZXNjLT5MZW5ndGg7CisJaWYgKHN0YXRzLT5MZW5ndGggPCAyNCkKKwkJc3RhdHMtPmJId0Vycm9yIHw9IDE7CisKKwlpZiAoc3RhdHMtPmJId0Vycm9yKSB7CisJCXN0YXRzLT5iU2hpZnQgPSBmYWxzZTsKKworCQlpZiAocGRlc2MtPkNSQzMyKSB7CisJCQlpZiAocGRlc2MtPkxlbmd0aCA8IDUwMCkKKwkJCQlwcml2LT5zdGF0cy5yeGNyY2Vycm1pbisrOworCQkJZWxzZSBpZiAocGRlc2MtPkxlbmd0aCA+IDEwMDApCisJCQkJcHJpdi0+c3RhdHMucnhjcmNlcnJtYXgrKzsKKwkJCWVsc2UKKwkJCQlwcml2LT5zdGF0cy5yeGNyY2Vycm1pZCsrOworCQl9CisJCXJldHVybiBmYWxzZTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgcnhfZndpbmZvICpwRHJ2SW5mbyA9IE5VTEw7CisJCXN0YXRzLT5SeERydkluZm9TaXplID0gcGRlc2MtPlJ4RHJ2SW5mb1NpemU7CisJCXN0YXRzLT5SeEJ1ZlNoaWZ0ID0gKChwZGVzYy0+U2hpZnQpJjB4MDMpOworCQlzdGF0cy0+RGVjcnlwdGVkID0gIXBkZXNjLT5TV0RlYzsKKworCQlwRHJ2SW5mbyA9IChzdHJ1Y3QgcnhfZndpbmZvICopKHNrYi0+ZGF0YSArIHN0YXRzLT5SeEJ1ZlNoaWZ0KTsKKworCQlzdGF0cy0+cmF0ZSA9IEh3UmF0ZVRvTVJhdGU5MCgoYm9vbClwRHJ2SW5mby0+UnhIVCwKKwkJCQkJICAgICAodTgpcERydkluZm8tPlJ4UmF0ZSk7CisJCXN0YXRzLT5iU2hvcnRQcmVhbWJsZSA9IHBEcnZJbmZvLT5TUExDUDsKKworCQlydGw4MTkyX1VwZGF0ZVJlY2VpdmVkUmF0ZUhpc3RvZ3JhbVN0YXRpc3RpY3MoZGV2LCBzdGF0cyk7CisKKwkJc3RhdHMtPmJJc0FNUERVID0gKHBEcnZJbmZvLT5QYXJ0QWdnciA9PSAxKTsKKwkJc3RhdHMtPmJGaXJzdE1QRFUgPSAocERydkluZm8tPlBhcnRBZ2dyID09IDEpICYmCisJCQkJICAgIChwRHJ2SW5mby0+Rmlyc3RBR0dSID09IDEpOworCisJCXN0YXRzLT5UaW1lU3RhbXBMb3cgPSBwRHJ2SW5mby0+VFNGTDsKKwkJc3RhdHMtPlRpbWVTdGFtcEhpZ2ggPSByZWFkX25pY19kd29yZChkZXYsIFRTRlIrNCk7CisKKwkJcnRsODE5eF9VcGRhdGVSeFBrdFRpbWVTdGFtcChkZXYsIHN0YXRzKTsKKworCQlpZiAoKHN0YXRzLT5SeEJ1ZlNoaWZ0ICsgc3RhdHMtPlJ4RHJ2SW5mb1NpemUpID4gMCkKKwkJCXN0YXRzLT5iU2hpZnQgPSAxOworCisJCXN0YXRzLT5SeElzNDBNSHpQYWNrZXQgPSBwRHJ2SW5mby0+Qlc7CisKKwkJcnRsODE5Ml9UcmFuc2xhdGVSeFNpZ25hbFN0dWZmKGRldiwgc2tiLCBzdGF0cywgcGRlc2MsCisJCQkJCSAgICAgICBwRHJ2SW5mbyk7CisKKwkJaWYgKHBEcnZJbmZvLT5GaXJzdEFHR1IgPT0gMSB8fCBwRHJ2SW5mby0+UGFydEFnZ3IgPT0gMSkKKwkJCVJUX1RSQUNFKENPTVBfUlhERVNDLCAicERydkluZm8tPkZpcnN0QUdHUiA9ICVkLCIKKwkJCQkgIiBwRHJ2SW5mby0+UGFydEFnZ3IgPSAlZFxuIiwKKwkJCQkgcERydkluZm8tPkZpcnN0QUdHUiwgcERydkluZm8tPlBhcnRBZ2dyKTsKKwkJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDQvKnNDcmNMbmcqLyk7CisKKworCQlzdGF0cy0+cGFja2V0bGVuZ3RoID0gc3RhdHMtPkxlbmd0aC00OworCQlzdGF0cy0+ZnJhZ2xlbmd0aCA9IHN0YXRzLT5wYWNrZXRsZW5ndGg7CisJCXN0YXRzLT5mcmFnb2Zmc2V0ID0gMDsKKwkJc3RhdHMtPm50b3RhbGZyYWcgPSAxOworCQlyZXR1cm4gdHJ1ZTsKKwl9Cit9CisKK3ZvaWQgcnRsODE5Ml9oYWx0X2FkYXB0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYm9vbCByZXNldCkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJaW50IGk7CisJdTgJT3BNb2RlOworCXU4CXUxYlRtcDsKKwl1MzIJdWxSZWdSZWFkOworCisJT3BNb2RlID0gUlRfT1BfTU9ERV9OT19MSU5LOworCXByaXYtPnJ0bGxpYi0+U2V0SHdSZWdIYW5kbGVyKGRldiwgSFdfVkFSX01FRElBX1NUQVRVUywgJk9wTW9kZSk7CisKKwlpZiAoIXByaXYtPnJ0bGxpYi0+YlN1cHBvcnRSZW1vdGVXYWtlVXApIHsKKwkJdTFiVG1wID0gMHgwOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIENNRFIsIHUxYlRtcCk7CisJfQorCisJbWRlbGF5KDIwKTsKKworCWlmICghcmVzZXQpIHsKKwkJbWRlbGF5KDE1MCk7CisKKwkJcHJpdi0+Ykh3UmZPZmZBY3Rpb24gPSAyOworCisJCWlmICghcHJpdi0+cnRsbGliLT5iU3VwcG9ydFJlbW90ZVdha2VVcCkgeworCQkJUEhZX1NldFJ0bDgxOTJlUmZPZmYoZGV2KTsKKwkJCXVsUmVnUmVhZCA9IHJlYWRfbmljX2R3b3JkKGRldiwgQ1BVX0dFTik7CisJCQl1bFJlZ1JlYWQgfD0gQ1BVX0dFTl9TWVNURU1fUkVTRVQ7CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBDUFVfR0VOLCB1bFJlZ1JlYWQpOworCQl9IGVsc2UgeworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgV0ZDUkMwLCAweGZmZmZmZmZmKTsKKwkJCXdyaXRlX25pY19kd29yZChkZXYsIFdGQ1JDMSwgMHhmZmZmZmZmZik7CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXRkNSQzIsIDB4ZmZmZmZmZmYpOworCisKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgUE1SLCAweDUpOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBNYWNCbGtDdHJsLCAweGEpOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1BWF9RVUVVRV9TSVpFOyBpKyspCisJCXNrYl9xdWV1ZV9wdXJnZSgmcHJpdi0+cnRsbGliLT5za2Jfd2FpdFFbaV0pOworCWZvciAoaSA9IDA7IGkgPCBNQVhfUVVFVUVfU0laRTsgaSsrKQorCQlza2JfcXVldWVfcHVyZ2UoJnByaXYtPnJ0bGxpYi0+c2tiX2FnZ1FbaV0pOworCisJc2tiX3F1ZXVlX3B1cmdlKCZwcml2LT5za2JfcXVldWUpOworCXJldHVybjsKK30KKwordm9pZCBydGw4MTkyX3VwZGF0ZV9yYXRyX3RhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gcHJpdi0+cnRsbGliOworCXU4ICpwTWNzUmF0ZSA9IGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQ7CisJdTMyIHJhdHJfdmFsdWUgPSAwOworCXU4IHJhdGVfaW5kZXggPSAwOworCisJcnRsODE5Ml9jb25maWdfcmF0ZShkZXYsICh1MTYgKikoJnJhdHJfdmFsdWUpKTsKKwlyYXRyX3ZhbHVlIHw9ICgqKHUxNiAqKShwTWNzUmF0ZSkpIDw8IDEyOworCXN3aXRjaCAoaWVlZS0+bW9kZSkgeworCWNhc2UgSUVFRV9BOgorCQlyYXRyX3ZhbHVlICY9IDB4MDAwMDBGRjA7CisJCWJyZWFrOworCWNhc2UgSUVFRV9COgorCQlyYXRyX3ZhbHVlICY9IDB4MDAwMDAwMEY7CisJCWJyZWFrOworCWNhc2UgSUVFRV9HOgorCWNhc2UgSUVFRV9HfElFRUVfQjoKKwkJcmF0cl92YWx1ZSAmPSAweDAwMDAwRkY3OworCQlicmVhazsKKwljYXNlIElFRUVfTl8yNEc6CisJY2FzZSBJRUVFX05fNUc6CisJCWlmIChpZWVlLT5wSFRJbmZvLT5QZWVyTWltb1BzID09IDApIHsKKwkJCXJhdHJfdmFsdWUgJj0gMHgwMDA3RjAwNzsKKwkJfSBlbHNlIHsKKwkJCWlmIChwcml2LT5yZl90eXBlID09IFJGXzFUMlIpCisJCQkJcmF0cl92YWx1ZSAmPSAweDAwMEZGMDA3OworCQkJZWxzZQorCQkJCXJhdHJfdmFsdWUgJj0gMHgwRjgxRjAwNzsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmF0cl92YWx1ZSAmPSAweDBGRkZGRkZGOworCWlmIChpZWVlLT5wSFRJbmZvLT5iQ3VyVHhCVzQwTUh6ICYmCisJICAgIGllZWUtPnBIVEluZm8tPmJDdXJTaG9ydEdJNDBNSHopCisJCXJhdHJfdmFsdWUgfD0gMHg4MDAwMDAwMDsKKwllbHNlIGlmICghaWVlZS0+cEhUSW5mby0+YkN1clR4Qlc0ME1IeiAmJgorCQkgIGllZWUtPnBIVEluZm8tPmJDdXJTaG9ydEdJMjBNSHopCisJCXJhdHJfdmFsdWUgfD0gMHg4MDAwMDAwMDsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSQVRSMCtyYXRlX2luZGV4KjQsIHJhdHJfdmFsdWUpOworCXdyaXRlX25pY19ieXRlKGRldiwgVUZXUCwgMSk7Cit9CisKK3ZvaWQKK3J0bDgxOTJfSW5pdGlhbGl6ZVZhcmlhYmxlcyhzdHJ1Y3QgbmV0X2RldmljZSAgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisKKwlzdHJjcHkocHJpdi0+bmljaywgInJ0bDgxOTJFIik7CisKKwlwcml2LT5ydGxsaWItPnNvZnRtYWNfZmVhdHVyZXMgID0gSUVFRV9TT0ZUTUFDX1NDQU4gfAorCQlJRUVFX1NPRlRNQUNfQVNTT0NJQVRFIHwgSUVFRV9TT0ZUTUFDX1BST0JFUlEgfAorCQlJRUVFX1NPRlRNQUNfUFJPQkVSUyB8IElFRUVfU09GVE1BQ19UWF9RVUVVRSAvKiB8CisJCUlFRUVfU09GVE1BQ19CRUFDT05TKi87CisKKwlwcml2LT5ydGxsaWItPnR4X2hlYWRyb29tID0gc2l6ZW9mKHN0cnVjdCB0eF9md2luZm9fODE5MHBjaSk7CisKKwlwcml2LT5TaG9ydFJldHJ5TGltaXQgPSAweDMwOworCXByaXYtPkxvbmdSZXRyeUxpbWl0ID0gMHgzMDsKKworCXByaXYtPkVhcmx5UnhUaHJlc2hvbGQgPSA3OworCXByaXYtPnB3ckdyb3VwQ250ID0gMDsKKworCXByaXYtPmJJZ25vcmVTaWxlbnRSZXNldCA9IGZhbHNlOworCXByaXYtPmVuYWJsZV9ncGlvMCA9IDA7CisKKwlwcml2LT5UcmFuc21pdENvbmZpZyA9IDA7CisKKwlwcml2LT5SZWNlaXZlQ29uZmlnID0gUkNSX0FERDMJfAorCQlSQ1JfQU1GIHwgUkNSX0FERiB8CisJCVJDUl9BSUNWIHwKKwkJUkNSX0FCIHwgUkNSX0FNIHwgUkNSX0FQTSB8CisJCVJDUl9BQVAgfCAoKHUzMik3PDxSQ1JfTVhETUFfT0ZGU0VUKSB8CisJCSgodTMyKTcgPDwgUkNSX0ZJRk9fT0ZGU0VUKSB8IFJDUl9PTkxZRVJMUEtUOworCisJcHJpdi0+aXJxX21hc2tbMF0gPSAodTMyKShJTVJfUk9LIHwgSU1SX1ZPRE9LIHwgSU1SX1ZJRE9LIHwKKwkJCSAgICBJTVJfQkVET0sgfCBJTVJfQktET0sgfCBJTVJfSENDQURPSyB8CisJCQkgICAgSU1SX01HTlRET0sgfCBJTVJfQ09NRE9LIHwgSU1SX0hJR0hET0sgfAorCQkJICAgIElNUl9CRE9LIHwgSU1SX1JYQ01ET0sgfCBJTVJfVElNRU9VVDAgfAorCQkJICAgIElNUl9SRFUgfCBJTVJfUlhGT1ZXIHwgSU1SX1RYRk9WVyB8CisJCQkgICAgSU1SX0JjbkludCB8IElNUl9UQkRPSyB8IElNUl9UQkRFUik7CisKKworCXByaXYtPk1pZEhpZ2hQd3JUSFJfTDEgPSAweDNCOworCXByaXYtPk1pZEhpZ2hQd3JUSFJfTDIgPSAweDQwOworCXByaXYtPlB3ckRvbWFpblByb3RlY3QgPSBmYWxzZTsKKworCXByaXYtPmJmaXJzdF9hZnRlcl9kb3duID0gMDsKK30KKwordm9pZCBydGw4MTkyX0VuYWJsZUludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopcnRsbGliX3ByaXYoZGV2KTsKKwlwcml2LT5pcnFfZW5hYmxlZCA9IDE7CisKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBJTlRBX01BU0ssIHByaXYtPmlycV9tYXNrWzBdKTsKKworfQorCit2b2lkIHJ0bDgxOTJfRGlzYWJsZUludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopcnRsbGliX3ByaXYoZGV2KTsKKworCXdyaXRlX25pY19kd29yZChkZXYsIElOVEFfTUFTSywgMCk7CisKKwlwcml2LT5pcnFfZW5hYmxlZCA9IDA7Cit9CisKK3ZvaWQgcnRsODE5Ml9DbGVhckludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXUzMiB0bXAgPSAwOworCXRtcCA9IHJlYWRfbmljX2R3b3JkKGRldiwgSVNSKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBJU1IsIHRtcCk7Cit9CisKKwordm9pZCBydGw4MTkyX2VuYWJsZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopcnRsbGliX3ByaXYoZGV2KTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSRFFEQSwgcHJpdi0+cnhfcmluZ19kbWFbUlhfTVBEVV9RVUVVRV0pOworfQorCitzdGF0aWMgY29uc3QgdTMyIFRYX0RFU0NfQkFTRVtdID0geworCUJLUURBLCBCRVFEQSwgVklRREEsIFZPUURBLCBIQ0NBUURBLCBDUURBLCBNUURBLCBIUURBLCBCUURBCit9OworCit2b2lkIHJ0bDgxOTJfZW5hYmxlX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilydGxsaWJfcHJpdihkZXYpOworCXUzMiBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9UWF9RVUVVRV9DT1VOVDsgaSsrKQorCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBUWF9ERVNDX0JBU0VbaV0sIHByaXYtPnR4X3JpbmdbaV0uZG1hKTsKK30KKworCit2b2lkIHJ0bDgxOTJfaW50ZXJydXB0X3JlY29nbml6ZWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyICpwX2ludGEsCisJCQkJICB1MzIgKnBfaW50YikKK3sKKwkqcF9pbnRhID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBJU1IpOworCXdyaXRlX25pY19kd29yZChkZXYsIElTUiwgKnBfaW50YSk7Cit9CisKK2Jvb2wgcnRsODE5Ml9IYWxSeENoZWNrU3R1Y2soc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJdTE2CQkgIFJlZ1J4Q291bnRlciA9IHJlYWRfbmljX3dvcmQoZGV2LCAweDEzMCk7CisJYm9vbAkJICBiU3R1Y2sgPSBmYWxzZTsKKwlzdGF0aWMgdTgJICByeF9jaGtfY250OworCXUzMgkJU2xvdEluZGV4ID0gMCwgVG90YWxSeFN0dWNrQ291bnQgPSAwOworCXU4CQlpOworCXU4CQlTaWxlbnRSZXNldFJ4U29sdE51bSA9IDQ7CisKKwlSVF9UUkFDRShDT01QX1JFU0VULCAiJXMoKTogUmVnUnhDb3VudGVyIGlzICVkLCBSeENvdW50ZXIgaXMgJWRcbiIsCisJCSBfX2Z1bmNfXywgUmVnUnhDb3VudGVyLCBwcml2LT5SeENvdW50ZXIpOworCisJcnhfY2hrX2NudCsrOworCWlmIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IChSYXRlQWRhcHRpdmVUSF9IaWdoKzUpKSB7CisJCXJ4X2Noa19jbnQgPSAwOworCX0gZWxzZSBpZiAoKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPCAoUmF0ZUFkYXB0aXZlVEhfSGlnaCArIDUpKQorCSAgJiYgKCgocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKSAmJgorCSAgKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gUmF0ZUFkYXB0aXZlVEhfTG93XzQwTSkpCisJICB8fCAoKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkgJiYKKwkgIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IFJhdGVBZGFwdGl2ZVRIX0xvd18yME0pKSkpIHsKKwkJaWYgKHJ4X2Noa19jbnQgPCAyKQorCQkJcmV0dXJuIGJTdHVjazsKKwkJZWxzZQorCQkJcnhfY2hrX2NudCA9IDA7CisJfSBlbHNlIGlmICgoKChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApICYmCisJCSAgKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPCBSYXRlQWRhcHRpdmVUSF9Mb3dfNDBNKSkgfHwKKwkJKChwcml2LT5DdXJyZW50Q2hhbm5lbEJXID09IEhUX0NIQU5ORUxfV0lEVEhfMjApICYmCisJCSAocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8IFJhdGVBZGFwdGl2ZVRIX0xvd18yME0pKSkgJiYKKwkJcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+PSBWZXJ5TG93UlNTSSkgeworCQlpZiAocnhfY2hrX2NudCA8IDQpCisJCQlyZXR1cm4gYlN0dWNrOworCQllbHNlCisJCQlyeF9jaGtfY250ID0gMDsKKwl9IGVsc2UgeworCQlpZiAocnhfY2hrX2NudCA8IDgpCisJCQlyZXR1cm4gYlN0dWNrOworCQllbHNlCisJCQlyeF9jaGtfY250ID0gMDsKKwl9CisKKworCVNsb3RJbmRleCA9IChwcml2LT5TaWxlbnRSZXNldFJ4U2xvdEluZGV4KyspJVNpbGVudFJlc2V0UnhTb2x0TnVtOworCisJaWYgKHByaXYtPlJ4Q291bnRlciA9PSBSZWdSeENvdW50ZXIpIHsKKwkJcHJpdi0+U2lsZW50UmVzZXRSeFN0dWNrRXZlbnRbU2xvdEluZGV4XSA9IDE7CisKKwkJZm9yIChpID0gMDsgaSA8IFNpbGVudFJlc2V0UnhTb2x0TnVtOyBpKyspCisJCQlUb3RhbFJ4U3R1Y2tDb3VudCArPSBwcml2LT5TaWxlbnRSZXNldFJ4U3R1Y2tFdmVudFtpXTsKKworCQlpZiAoVG90YWxSeFN0dWNrQ291bnQgPT0gU2lsZW50UmVzZXRSeFNvbHROdW0pIHsKKwkJCWJTdHVjayA9IHRydWU7CisJCQlmb3IgKGkgPSAwOyBpIDwgU2lsZW50UmVzZXRSeFNvbHROdW07IGkrKykKKwkJCQlUb3RhbFJ4U3R1Y2tDb3VudCArPQorCQkJCQkgcHJpdi0+U2lsZW50UmVzZXRSeFN0dWNrRXZlbnRbaV07CisJCX0KKworCisJfSBlbHNlIHsKKwkJcHJpdi0+U2lsZW50UmVzZXRSeFN0dWNrRXZlbnRbU2xvdEluZGV4XSA9IDA7CisJfQorCisJcHJpdi0+UnhDb3VudGVyID0gUmVnUnhDb3VudGVyOworCisJcmV0dXJuIGJTdHVjazsKK30KKworYm9vbCBydGw4MTkyX0hhbFR4Q2hlY2tTdHVjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlib29sCWJTdHVjayA9IGZhbHNlOworCXUxNglSZWdUeENvdW50ZXIgPSByZWFkX25pY193b3JkKGRldiwgMHgxMjgpOworCisJUlRfVFJBQ0UoQ09NUF9SRVNFVCwgIiVzKCk6UmVnVHhDb3VudGVyIGlzICVkLFR4Q291bnRlciBpcyAlZFxuIiwKKwkJIF9fZnVuY19fLCBSZWdUeENvdW50ZXIsIHByaXYtPlR4Q291bnRlcik7CisKKwlpZiAocHJpdi0+VHhDb3VudGVyID09IFJlZ1R4Q291bnRlcikKKwkJYlN0dWNrID0gdHJ1ZTsKKworCXByaXYtPlR4Q291bnRlciA9IFJlZ1R4Q291bnRlcjsKKworCXJldHVybiBiU3R1Y2s7Cit9CisKK2Jvb2wgcnRsODE5Ml9HZXRObW9kZVN1cHBvcnRCeVNlY0NmZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSA9IHByaXYtPnJ0bGxpYjsKKwlpZiAoaWVlZS0+cnRsbGliX2FwX3NlY190eXBlICYmCisJICAgKGllZWUtPnJ0bGxpYl9hcF9zZWNfdHlwZShwcml2LT5ydGxsaWIpJihTRUNfQUxHX1dFUCB8CisJCQkJICAgICBTRUNfQUxHX1RLSVApKSkgeworCQlyZXR1cm4gZmFsc2U7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHRydWU7CisJfQorfQorCitib29sIHJ0bDgxOTJfR2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJYm9vbCBSZXZhbDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUgPSBwcml2LT5ydGxsaWI7CisKKwlpZiAoaWVlZS0+YkhhbGZXaXJlbGVzc04yNEdNb2RlID09IHRydWUpCisJCVJldmFsID0gdHJ1ZTsKKwllbHNlCisJCVJldmFsID0gIGZhbHNlOworCisJcmV0dXJuIFJldmFsOworfQorCit1OCBydGw4MTkyX1F1ZXJ5SXNTaG9ydCh1OCBUeEhULCB1OCBUeFJhdGUsIHN0cnVjdCBjYl9kZXNjICp0Y2JfZGVzYykKK3sKKwl1OCAgIHRtcF9TaG9ydDsKKworCXRtcF9TaG9ydCA9IChUeEhUID09IDEpID8gKCh0Y2JfZGVzYy0+YlVzZVNob3J0R0kpID8gMSA6IDApIDoKKwkJCSgodGNiX2Rlc2MtPmJVc2VTaG9ydFByZWFtYmxlKSA/IDEgOiAwKTsKKwlpZiAoVHhIVCA9PSAxICYmIFR4UmF0ZSAhPSBERVNDOTBfUkFURU1DUzE1KQorCQl0bXBfU2hvcnQgPSAwOworCisJcmV0dXJuIHRtcF9TaG9ydDsKK30KKwordm9pZCBBY3RVcGRhdGVDaGFubmVsQWNjZXNzU2V0dGluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCWVudW0gd2lyZWxlc3NfbW9kZSBXaXJlbGVzc01vZGUsCisJc3RydWN0IGNoYW5uZWxfYWNjZXNzX3NldHRpbmcgKkNobmxBY2Nlc3NTZXR0aW5nKQoreworCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfZGV2LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YjNiNTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2Rldi5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEJhc2VkIG9uIHRoZSByODE4MCBkcml2ZXIsIHdoaWNoIGlzOgorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+LCBldCBhbC4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX1JUTDgxOTJFX0gKKyNkZWZpbmUgX1JUTDgxOTJFX0gKKworI2luY2x1ZGUgInI4MTkwUF9kZWYuaCIKKwordTggcnRsODE5Ml9RdWVyeUlzU2hvcnQodTggVHhIVCwgdTggVHhSYXRlLCBzdHJ1Y3QgY2JfZGVzYyAqdGNiX2Rlc2MpOworYm9vbCBydGw4MTkyX0dldEhhbGZObW9kZVN1cHBvcnRCeUFQcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2Jvb2wgcnRsODE5Ml9HZXRObW9kZVN1cHBvcnRCeVNlY0NmZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2Jvb2wgcnRsODE5Ml9IYWxUeENoZWNrU3R1Y2soc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Citib29sIHJ0bDgxOTJfSGFsUnhDaGVja1N0dWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTkyX2ludGVycnVwdF9yZWNvZ25pemVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiAqcF9pbnRhLAorCQkJCSAgdTMyICpwX2ludGIpOwordm9pZCBydGw4MTkyX2VuYWJsZV9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE5Ml9lbmFibGVfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxOTJfRW5hYmxlSW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTkyX0Rpc2FibGVJbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxOTJfQ2xlYXJJbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxOTJfSW5pdGlhbGl6ZVZhcmlhYmxlcyhzdHJ1Y3QgbmV0X2RldmljZSAgKmRldik7Cit2b2lkIHJ0bDgxOTJlX3N0YXJ0X2JlYWNvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE5MmVfU2V0SHdSZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggdmFyaWFibGUsIHU4ICp2YWwpOwordm9pZCBydGw4MTkyX2dldF9lZXByb21fc2l6ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2Jvb2wgcnRsODE5Ml9hZGFwdGVyX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTkyX2xpbmtfY2hhbmdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTkyX0FsbG93QWxsRGVzdEFkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYm9vbCBiQWxsb3dBbGxEQSwKKwkJCSAgICAgIGJvb2wgV3JpdGVJbnRvUmVnKTsKK3ZvaWQgIHJ0bDgxOTJfdHhfZmlsbF9kZXNjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCB0eF9kZXNjICpwZGVzYywKKwkJCSAgIHN0cnVjdCBjYl9kZXNjICpjYl9kZXNjLAorCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7Cit2b2lkICBydGw4MTkyX3R4X2ZpbGxfY21kX2Rlc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgdHhfZGVzY19jbWQgKmVudHJ5LAorCQkJICAgICAgIHN0cnVjdCBjYl9kZXNjICpjYl9kZXNjLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2Jvb2wgcnRsODE5Ml9yeF9xdWVyeV9zdGF0dXNfZGVzYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqc3RhdHMsCisJCQkJICBzdHJ1Y3QgcnhfZGVzYyAqcGRlc2MsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3ZvaWQgcnRsODE5Ml9oYWx0X2FkYXB0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYm9vbCByZXNldCk7Cit2b2lkIHJ0bDgxOTJfdXBkYXRlX3JhdHJfdGFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfZG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfZG0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg4ZDI5Yi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2RtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTU0ICswLDAgQEAKLS8qKysKLUNvcHlyaWdodC1jIFJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3JwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1Nb2R1bGUgTmFtZToKLQlyODE5MlVfZG0uYwotCi1BYnN0cmFjdDoKLQlIVyBkeW5hbWljIG1lY2hhbmlzbS4KLQotTWFqb3IgQ2hhbmdlIEhpc3Rvcnk6Ci0JV2hlbiAgICAgIAlXaG8JCQkJV2hhdAotCS0tLS0tLS0tLS0JLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkyMDA4LTA1LTE0CWFteSAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZSB2ZXJzaW9uIDAgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KLQotLS0qLwotI2luY2x1ZGUgInI4MTkyRS5oIgotI2luY2x1ZGUgInI4MTkyRV9kbS5oIgotI2luY2x1ZGUgInI4MTkyRV9ody5oIgotI2luY2x1ZGUgInI4MTl4RV9waHkuaCIKLSNpbmNsdWRlICJyODE5eEVfcGh5cmVnLmgiCi0jaW5jbHVkZSAicjgxOTBfcnRsODI1Ni5oIgotCi0jZGVmaW5lIERSVl9OQU1FICJydGw4MTl4RSIKLQotLy8KLS8vIEluZGljYXRlIGRpZmZlcmVudCBBUCB2ZW5kb3IgZm9yIElPVCBpc3N1ZS4KLS8vCi1zdGF0aWMgY29uc3QgdTMyIGVkY2Ffc2V0dGluZ19ETFtIVF9JT1RfUEVFUl9NQVhdID0KLXsgMHg1ZTQzMjIsIAkweDVlNDMyMiwgCTB4NWU0MzIyLCAJMHg2MDQzMjIsIAkweGE0NGYsIAkweDVlNDMyMiwJMHg1ZTQzMjJ9Owotc3RhdGljIGNvbnN0IHUzMiBlZGNhX3NldHRpbmdfVUxbSFRfSU9UX1BFRVJfTUFYXSA9Ci17IDB4NWU0MzIyLCAJMHhhNDRmLAkJMHg1ZTQzMjIsICAJMHg2MDQzMjIsIAkweDVlNDMyMiwgCTB4NWU0MzIyLCAJMHg1ZTQzMjJ9OwotCi0jZGVmaW5lIFJUS19VTF9FRENBIDB4YTQ0ZgotI2RlZmluZSBSVEtfRExfRURDQSAweDVlNDMyMgotCi0KLWRpZ190CWRtX2RpZ3RhYmxlOwotLy8gRm9yIER5bmFtaWMgUnggUGF0aCBTZWxlY3Rpb24gYnkgU2lnbmFsIFN0cmVuZ3RoCi1EUnhQYXRoU2VsCURNX1J4UGF0aFNlbFRhYmxlOwotCi12b2lkIGRtX2dwaW9fY2hhbmdlX3JmX2NhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci0KLS8vIERNIC0tPiBSYXRlIEFkYXB0aXZlCi1zdGF0aWMgdm9pZCBkbV9jaGVja19yYXRlX2FkYXB0aXZlKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKLQotLy8gRE0gLS0+IEJhbmR3aWR0aCBzd2l0Y2gKLXN0YXRpYyB2b2lkIGRtX2luaXRfYmFuZHdpZHRoX2F1dG9zd2l0Y2goc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOwotc3RhdGljIHZvaWQgZG1fYmFuZHdpZHRoX2F1dG9zd2l0Y2goc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOwotCi0vLyBETSAtLT4gVFggcG93ZXIgY29udHJvbAotc3RhdGljIHZvaWQgZG1fY2hlY2tfdHhwb3dlcl90cmFja2luZyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7Ci0KLS8vIERNIC0tPiBEeW5hbWljIEluaXQgR2FpbiBieSBSU1NJCi1zdGF0aWMgdm9pZCBkbV9kaWdfaW5pdChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7Ci1zdGF0aWMgdm9pZCBkbV9jdHJsX2luaXRnYWluX2J5cnNzaShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7Ci1zdGF0aWMgdm9pZCBkbV9jdHJsX2luaXRnYWluX2J5cnNzaV9oaWdocHdyKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKLXN0YXRpYyB2b2lkIGRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpX2J5X2RyaXZlcnJzc2koc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOwotc3RhdGljIHZvaWQgZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2lfYnlfZndmYWxzZV9hbGFybShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7Ci1zdGF0aWMgdm9pZCBkbV9pbml0aWFsX2dhaW4oc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOwotc3RhdGljIHZvaWQgZG1fcGRfdGgoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOwotc3RhdGljIHZvaWQgZG1fY3NfcmF0aW8oc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOwotCi1zdGF0aWMgdm9pZCBkbV9pbml0X2N0c3Rvc2VsZihzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7Ci0vLyBETSAtLT4gRURDQSB0dXJib2UgbW9kZSBjb250cm9sCi1zdGF0aWMgdm9pZCBkbV9jaGVja19lZGNhX3R1cmJvKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKLXN0YXRpYyB2b2lkIGRtX2luaXRfZWRjYV90dXJibyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7Ci0KLS8vIERNIC0tPiBIVyBSRiBjb250cm9sCi1zdGF0aWMgdm9pZCBkbV9jaGVja19yZmN0cmxfZ3BpbyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7Ci0KLS8vIERNIC0tPiBDaGVjayBjdXJyZW50IFJYIFJGIHBhdGggc3RhdGUKLXN0YXRpYyB2b2lkIGRtX2NoZWNrX3J4X3BhdGhfc2VsZWN0aW9uKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKLXN0YXRpYyB2b2lkIGRtX2luaXRfcnhwYXRoX3NlbGVjdGlvbihzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7Ci1zdGF0aWMgdm9pZCBkbV9yeHBhdGhfc2VsX2J5cnNzaShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7Ci0KLS8vIERNIC0tPiBGc3luYyBmb3IgYnJvYWRjb20gYXAKLXN0YXRpYyB2b2lkIGRtX2luaXRfZnN5bmMoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOwotc3RhdGljIHZvaWQgZG1fZGVJbml0X2ZzeW5jKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKLQotc3RhdGljIHZvaWQgZG1fY2hlY2tfdHhyYXRlYW5kcmV0cnljb3VudChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7Ci1zdGF0aWMgdm9pZCBkbV9jaGVja19mc3luYyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7Ci0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgb2YgVHggUG93ZXIgQ29udHJvbCBGb3IgTmVhci9GYXIgUmFuZ2UgLS0tLS0tLS0qLyAgIC8vQWRkIGJ5IEphY2tlbiAyMDA4LzAyLzE4Ci1zdGF0aWMgdm9pZCBkbV9pbml0X2R5bmFtaWNfdHhwb3dlcihzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7Ci1zdGF0aWMgdm9pZCBkbV9keW5hbWljX3R4cG93ZXIoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOwotCi0vLyBETSAtLT4gRm9yIHJhdGUgYWRhcHRpdmUgYW5kIERJRywgd2UgbXVzdCBzZW5kIFJTU0kgdG8gZmlybXdhcmUKLXN0YXRpYyB2b2lkIGRtX3NlbmRfcnNzaV90b2Z3KHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKLXN0YXRpYyB2b2lkIGRtX2N0c3Rvc2VsZihzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7Ci0KLXN0YXRpYyB2b2lkIGRtX2ZzeW5jX3RpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci0KLS8qCi0gKiBQcmVwYXJlIFNXIHJlc291cmNlIGZvciBIVyBkeW5hbWljIG1lY2hhbmlzbS4KLSAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSBpbnZva2VkIGF0IGRyaXZlciBpbnRpYWxpemF0aW9uIG9uY2UuCi0gKi8KLXZvaWQgaW5pdF9oYWxfZG0oc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0JLy8gVW5kZWNvcmF0ZWQgU21vb3RoZWQgU2lnbmFsIFN0cmVuZ3RoLCBpdCBjYW4gdXRpbGl6ZWQgdG8gZHluYW1pYyBtZWNoYW5pc20uCi0JcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA9IC0xOwotCi0JLy9Jbml0aWFsIFRYIFBvd2VyIENvbnRyb2wgZm9yIG5lYXIvZmFyIHJhbmdlICwgYWRkIGJ5IGFteSAyMDA4LzA1LzE1LCBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgotCWRtX2luaXRfZHluYW1pY190eHBvd2VyKHByaXYpOwotCWluaXRfcmF0ZV9hZGFwdGl2ZShwcml2KTsKLQkvL2RtX2luaXRpYWxpemVfdHhwb3dlcl90cmFja2luZyhkZXYpOwotCWRtX2RpZ19pbml0KHByaXYpOwotCWRtX2luaXRfZWRjYV90dXJibyhwcml2KTsKLQlkbV9pbml0X2JhbmR3aWR0aF9hdXRvc3dpdGNoKHByaXYpOwotCWRtX2luaXRfZnN5bmMocHJpdik7Ci0JZG1faW5pdF9yeHBhdGhfc2VsZWN0aW9uKHByaXYpOwotCWRtX2luaXRfY3RzdG9zZWxmKHByaXYpOwotCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5ncGlvX2NoYW5nZV9yZl93cSwgIGRtX2dwaW9fY2hhbmdlX3JmX2NhbGxiYWNrKTsKLQotfQotCi12b2lkIGRlaW5pdF9oYWxfZG0oc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0JZG1fZGVJbml0X2ZzeW5jKHByaXYpOwotfQotCi12b2lkIGhhbF9kbV93YXRjaGRvZyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQotCS8qQWRkIGJ5IGFteSAyMDA4LzA1LzE1ICxwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLiovCi0JZG1fY2hlY2tfcmF0ZV9hZGFwdGl2ZShwcml2KTsKLQlkbV9keW5hbWljX3R4cG93ZXIocHJpdik7Ci0JZG1fY2hlY2tfdHhyYXRlYW5kcmV0cnljb3VudChwcml2KTsKLQotCWRtX2NoZWNrX3R4cG93ZXJfdHJhY2tpbmcocHJpdik7Ci0KLQlkbV9jdHJsX2luaXRnYWluX2J5cnNzaShwcml2KTsKLQlkbV9jaGVja19lZGNhX3R1cmJvKHByaXYpOwotCWRtX2JhbmR3aWR0aF9hdXRvc3dpdGNoKHByaXYpOwotCi0JZG1fY2hlY2tfcmZjdHJsX2dwaW8ocHJpdik7Ci0JZG1fY2hlY2tfcnhfcGF0aF9zZWxlY3Rpb24ocHJpdik7Ci0JZG1fY2hlY2tfZnN5bmMocHJpdik7Ci0KLQkvLyBBZGQgYnkgYW15IDIwMDgtMDUtMTUgcG9ydGluZyBmcm9tIHdpbmRvd3MgY29kZS4KLQlkbV9zZW5kX3Jzc2lfdG9mdyhwcml2KTsKLQlkbV9jdHN0b3NlbGYocHJpdik7Ci19Ci0KLQotLyoKLSAgKiBEZWNpZGUgUmF0ZSBBZGFwdGl2ZSBTZXQgYWNjb3JkaW5nIHRvIGRpc3RhbmNlIChzaWduYWwgc3RyZW5ndGgpCi0gICoJMDEvMTEvMjAwOAlNSEMJCU1vZGlmeSBpbnB1dCBhcmd1bWVudHMgYW5kIFJBVFIgdGFibGUgbGV2ZWwuCi0gICoJMDEvMTYvMjAwOAlNSEMJCVJGX1R5cGUgaXMgYXNzaWduZWQgaW4gUmVhZEFkYXB0ZXJJbmZvKCkuIFdlIG11c3QgY2FsbAotICAqCQkJCQkJdGhlIGZ1bmN0aW9uIGFmdGVyIG1ha2luZyBzdXJlIFJGX1R5cGUuCi0gICovCi12b2lkIGluaXRfcmF0ZV9hZGFwdGl2ZShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQlwcmF0ZV9hZGFwdGl2ZSBwcmEgPSAmcHJpdi0+cmF0ZV9hZGFwdGl2ZTsKLQotCXByYS0+cmF0cl9zdGF0ZSA9IERNX1JBVFJfU1RBX01BWDsKLQlwcmEtPmhpZ2gybG93X3Jzc2lfdGhyZXNoX2Zvcl9yYSA9IFJhdGVBZGFwdGl2ZVRIX0hpZ2g7Ci0JcHJhLT5sb3cyaGlnaF9yc3NpX3RocmVzaF9mb3JfcmEyME0gPSBSYXRlQWRhcHRpdmVUSF9Mb3dfMjBNKzU7Ci0JcHJhLT5sb3cyaGlnaF9yc3NpX3RocmVzaF9mb3JfcmE0ME0gPSBSYXRlQWRhcHRpdmVUSF9Mb3dfNDBNKzU7Ci0KLQlwcmEtPmhpZ2hfcnNzaV90aHJlc2hfZm9yX3JhID0gUmF0ZUFkYXB0aXZlVEhfSGlnaCs1OwotCXByYS0+bG93X3Jzc2lfdGhyZXNoX2Zvcl9yYTIwTSA9IFJhdGVBZGFwdGl2ZVRIX0xvd18yME07Ci0JcHJhLT5sb3dfcnNzaV90aHJlc2hfZm9yX3JhNDBNID0gUmF0ZUFkYXB0aXZlVEhfTG93XzQwTTsKLQotCWlmKHByaXYtPkN1c3RvbWVySUQgPT0gUlRfQ0lEXzgxOXhfTmV0Y29yZSkKLQkJcHJhLT5waW5nX3Jzc2lfZW5hYmxlID0gMTsKLQllbHNlCi0JCXByYS0+cGluZ19yc3NpX2VuYWJsZSA9IDA7Ci0JcHJhLT5waW5nX3Jzc2lfdGhyZXNoX2Zvcl9yYSA9IDE1OwotCi0KLQlpZiAocHJpdi0+cmZfdHlwZSA9PSBSRl8yVDRSKQotCXsKLQkJLy8gMDcvMTAvMDggTUggTW9kaWZ5IGZvciBSQSBzbW9vdGggc2NoZW1lLgotCQkvKiAyMDA4LzAxLzExIE1IIE1vZGlmeSAyVCBSQVRSIHRhYmxlIGZvciBkaWZmZXJlbnQgUlNTSS4gMDgwNTE1IHBvcnRpbmcgYnkgYW15IGZyb20gd2luZG93cyBjb2RlLiovCi0JCXByYS0+dXBwZXJfcnNzaV90aHJlc2hvbGRfcmF0cgkJPSAJMHg4ZjBmMDAwMDsKLQkJcHJhLT5taWRkbGVfcnNzaV90aHJlc2hvbGRfcmF0cgkJPSAJMHg4ZjBmZjAwMDsKLQkJcHJhLT5sb3dfcnNzaV90aHJlc2hvbGRfcmF0cgkJPSAJMHg4ZjBmZjAwMTsKLQkJcHJhLT5sb3dfcnNzaV90aHJlc2hvbGRfcmF0cl80ME0JPSAJMHg4ZjBmZjAwNTsKLQkJcHJhLT5sb3dfcnNzaV90aHJlc2hvbGRfcmF0cl8yME0JPSAJMHg4ZjBmZjAwMTsKLQkJcHJhLT5waW5nX3Jzc2lfcmF0cgk9IAkweDAwMDAwMDBkOy8vY29zYSBhZGQgZm9yIHRlc3QKLQl9Ci0JZWxzZSBpZiAocHJpdi0+cmZfdHlwZSA9PSBSRl8xVDJSKQotCXsKLQkJcHJhLT51cHBlcl9yc3NpX3RocmVzaG9sZF9yYXRyCQk9IAkweDAwMGYwMDAwOwotCQlwcmEtPm1pZGRsZV9yc3NpX3RocmVzaG9sZF9yYXRyCQk9IAkweDAwMGZmMDAwOwotCQlwcmEtPmxvd19yc3NpX3RocmVzaG9sZF9yYXRyCQk9IAkweDAwMGZmMDAxOwotCQlwcmEtPmxvd19yc3NpX3RocmVzaG9sZF9yYXRyXzQwTQk9IAkweDAwMGZmMDA1OwotCQlwcmEtPmxvd19yc3NpX3RocmVzaG9sZF9yYXRyXzIwTQk9IAkweDAwMGZmMDAxOwotCQlwcmEtPnBpbmdfcnNzaV9yYXRyCT0gCTB4MDAwMDAwMGQ7Ly9jb3NhIGFkZCBmb3IgdGVzdAotCX0KLQotfQotCi0KLXN0YXRpYyB2b2lkIGRtX2NoZWNrX3JhdGVfYWRhcHRpdmUoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0JUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gcHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvOwotCXByYXRlX2FkYXB0aXZlCQkJcHJhID0gKHByYXRlX2FkYXB0aXZlKSZwcml2LT5yYXRlX2FkYXB0aXZlOwotCXUzMgkJCQkJCWN1cnJlbnRSQVRSLCB0YXJnZXRSQVRSID0gMDsKLQl1MzIJCQkJCQlMb3dSU1NJVGhyZXNoRm9yUkEgPSAwLCBIaWdoUlNTSVRocmVzaEZvclJBID0gMDsKLQlib29sCQkJCQkJYnNob3J0X2dpX2VuYWJsZWQgPSBmYWxzZTsKLQlzdGF0aWMgdTgJCQkJCXBpbmdfcnNzaV9zdGF0ZT0wOwotCi0KLQlpZighcHJpdi0+dXApCi0JewotCQlSVF9UUkFDRShDT01QX1JBVEUsICI8LS0tLSBkbV9jaGVja19yYXRlX2FkYXB0aXZlKCk6IGRyaXZlciBpcyBnb2luZyB0byB1bmxvYWRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYocHJhLT5yYXRlX2FkYXB0aXZlX2Rpc2FibGVkKS8vdGhpcyB2YXJpYWJsZSBpcyBzZXQgYnkgaW9jdGwuCi0JCXJldHVybjsKLQotCS8vIFRPRE86IE9ubHkgMTFuIG1vZGUgaXMgaW1wbGVtZW50ZWQgY3VycmVudGx5LAotCWlmKCAhKHByaXYtPmllZWU4MDIxMS0+bW9kZSA9PSBXSVJFTEVTU19NT0RFX05fMjRHIHx8Ci0JCSBwcml2LT5pZWVlODAyMTEtPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9OXzVHKSkKLQkJIHJldHVybjsKLQotCWlmKCBwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQgKQotCXsKLQkvLwlSVF9UUkFDRShDT01QX1JBVEUsICJkbV9DaGVja1JhdGVBZGFwdGl2ZSgpOiBcdCIpOwotCi0JCS8vCi0JCS8vIENoZWNrIHdoZXRoZXIgU2hvcnQgR0kgaXMgZW5hYmxlZAotCQkvLwotCQlic2hvcnRfZ2lfZW5hYmxlZCA9IChwSFRJbmZvLT5iQ3VyVHhCVzQwTUh6ICYmIHBIVEluZm8tPmJDdXJTaG9ydEdJNDBNSHopIHx8Ci0JCQkoIXBIVEluZm8tPmJDdXJUeEJXNDBNSHogJiYgcEhUSW5mby0+YkN1clNob3J0R0kyME1Ieik7Ci0KLQotCQlwcmEtPnVwcGVyX3Jzc2lfdGhyZXNob2xkX3JhdHIgPQotCQkJCShwcmEtPnVwcGVyX3Jzc2lfdGhyZXNob2xkX3JhdHIgJiAofkJJVDMxKSkgfCAoKGJzaG9ydF9naV9lbmFibGVkKT8gQklUMzE6MCkgOwotCi0JCXByYS0+bWlkZGxlX3Jzc2lfdGhyZXNob2xkX3JhdHIgPQotCQkJCShwcmEtPm1pZGRsZV9yc3NpX3RocmVzaG9sZF9yYXRyICYgKH5CSVQzMSkpIHwgKChic2hvcnRfZ2lfZW5hYmxlZCk/IEJJVDMxOjApIDsKLQotCQlpZiAocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKQotCQl7Ci0JCQlwcmEtPmxvd19yc3NpX3RocmVzaG9sZF9yYXRyID0KLQkJCQkocHJhLT5sb3dfcnNzaV90aHJlc2hvbGRfcmF0cl80ME0gJiAofkJJVDMxKSkgfCAoKGJzaG9ydF9naV9lbmFibGVkKT8gQklUMzE6MCkgOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJcHJhLT5sb3dfcnNzaV90aHJlc2hvbGRfcmF0ciA9Ci0JCQkocHJhLT5sb3dfcnNzaV90aHJlc2hvbGRfcmF0cl8yME0gJiAofkJJVDMxKSkgfCAoKGJzaG9ydF9naV9lbmFibGVkKT8gQklUMzE6MCkgOwotCQl9Ci0JCS8vY29zYSBhZGQgZm9yIHRlc3QKLQkJcHJhLT5waW5nX3Jzc2lfcmF0ciA9Ci0JCQkJKHByYS0+cGluZ19yc3NpX3JhdHIgJiAofkJJVDMxKSkgfCAoKGJzaG9ydF9naV9lbmFibGVkKT8gQklUMzE6MCkgOwotCi0JCS8qIDIwMDcvMTAvMDggTUggV2Ugc3VwcG9ydCBSQSBzbW9vdGggc2NoZW1lIG5vdy4gV2hlbiBpdCBpcyB0aGUgZmlyc3QKLQkJICAgdGltZSB0byBsaW5rIHdpdGggQVAuIFdlIHdpbGwgbm90IGNoYW5nZSB1cHBlci9sb3dlciB0aHJlc2hvbGQuIElmCi0JCSAgIFNUQSBzdGF5IGluIGhpZ2ggb3IgbG93IGxldmVsLCB3ZSBtdXN0IGNoYW5nZSB0d28gZGlmZmVyZW50IHRocmVzaG9sZAotCQkgICB0byBwcmV2ZW50IGp1bXBpbmcgZnJlcXVlbnRseS4gKi8KLQkJaWYgKHByYS0+cmF0cl9zdGF0ZSA9PSBETV9SQVRSX1NUQV9ISUdIKQotCQl7Ci0JCQlIaWdoUlNTSVRocmVzaEZvclJBIAk9IHByYS0+aGlnaDJsb3dfcnNzaV90aHJlc2hfZm9yX3JhOwotCQkJTG93UlNTSVRocmVzaEZvclJBCT0gKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgIT0gSFRfQ0hBTk5FTF9XSURUSF8yMCk/Ci0JCQkJCShwcmEtPmxvd19yc3NpX3RocmVzaF9mb3JfcmE0ME0pOihwcmEtPmxvd19yc3NpX3RocmVzaF9mb3JfcmEyME0pOwotCQl9Ci0JCWVsc2UgaWYgKHByYS0+cmF0cl9zdGF0ZSA9PSBETV9SQVRSX1NUQV9MT1cpCi0JCXsKLQkJCUhpZ2hSU1NJVGhyZXNoRm9yUkEJPSBwcmEtPmhpZ2hfcnNzaV90aHJlc2hfZm9yX3JhOwotCQkJTG93UlNTSVRocmVzaEZvclJBIAk9IChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApPwotCQkJCQkocHJhLT5sb3cyaGlnaF9yc3NpX3RocmVzaF9mb3JfcmE0ME0pOihwcmEtPmxvdzJoaWdoX3Jzc2lfdGhyZXNoX2Zvcl9yYTIwTSk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlIaWdoUlNTSVRocmVzaEZvclJBCT0gcHJhLT5oaWdoX3Jzc2lfdGhyZXNoX2Zvcl9yYTsKLQkJCUxvd1JTU0lUaHJlc2hGb3JSQQk9IChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApPwotCQkJCQkocHJhLT5sb3dfcnNzaV90aHJlc2hfZm9yX3JhNDBNKToocHJhLT5sb3dfcnNzaV90aHJlc2hfZm9yX3JhMjBNKTsKLQkJfQotCi0JCWlmKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gKGxvbmcpSGlnaFJTU0lUaHJlc2hGb3JSQSkKLQkJewotCQkJcHJhLT5yYXRyX3N0YXRlID0gRE1fUkFUUl9TVEFfSElHSDsKLQkJCXRhcmdldFJBVFIgPSBwcmEtPnVwcGVyX3Jzc2lfdGhyZXNob2xkX3JhdHI7Ci0JCX1lbHNlIGlmKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gKGxvbmcpTG93UlNTSVRocmVzaEZvclJBKQotCQl7Ci0JCQlwcmEtPnJhdHJfc3RhdGUgPSBETV9SQVRSX1NUQV9NSURETEU7Ci0JCQl0YXJnZXRSQVRSID0gcHJhLT5taWRkbGVfcnNzaV90aHJlc2hvbGRfcmF0cjsKLQkJfWVsc2UKLQkJewotCQkJcHJhLT5yYXRyX3N0YXRlID0gRE1fUkFUUl9TVEFfTE9XOwotCQkJdGFyZ2V0UkFUUiA9IHByYS0+bG93X3Jzc2lfdGhyZXNob2xkX3JhdHI7Ci0JCX0KLQotCQkJLy9jb3NhIGFkZCBmb3IgdGVzdAotCQlpZihwcmEtPnBpbmdfcnNzaV9lbmFibGUpCi0JCXsKLQkJCS8vcEhhbERhdGEtPlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID0gMTk7Ci0JCQlpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDwgKGxvbmcpKHByYS0+cGluZ19yc3NpX3RocmVzaF9mb3JfcmErNSkpCi0JCQl7Ci0JCQkJaWYoIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDwgKGxvbmcpcHJhLT5waW5nX3Jzc2lfdGhyZXNoX2Zvcl9yYSkgfHwKLQkJCQkJcGluZ19yc3NpX3N0YXRlICkKLQkJCQl7Ci0JCQkJCXByYS0+cmF0cl9zdGF0ZSA9IERNX1JBVFJfU1RBX0xPVzsKLQkJCQkJdGFyZ2V0UkFUUiA9IHByYS0+cGluZ19yc3NpX3JhdHI7Ci0JCQkJCXBpbmdfcnNzaV9zdGF0ZSA9IDE7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXBpbmdfcnNzaV9zdGF0ZSA9IDA7Ci0JCQl9Ci0JCX0KLQotCQkvLyBGb3IgUlRMODE5WCwgaWYgcGFpcndpc2VrZXkgPSB3ZXAvdGtpcCwgd2Ugc3VwcG9ydCBvbmx5IE1DUzB+Ny4KLQkJaWYocHJpdi0+aWVlZTgwMjExLT5HZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHNIYW5kbGVyKHByaXYtPmllZWU4MDIxMSkpCi0JCQl0YXJnZXRSQVRSICY9ICAweGYwMGZmZmZmOwotCi0JCS8vCi0JCS8vIENoZWNrIHdoZXRoZXIgdXBkYXRpbmcgb2YgUkFUUjAgaXMgcmVxdWlyZWQKLQkJLy8KLQkJY3VycmVudFJBVFIgPSByZWFkX25pY19kd29yZChwcml2LCBSQVRSMCk7Ci0JCWlmKCB0YXJnZXRSQVRSICE9ICBjdXJyZW50UkFUUiApCi0JCXsKLQkJCXUzMiByYXRyX3ZhbHVlOwotCQkJcmF0cl92YWx1ZSA9IHRhcmdldFJBVFI7Ci0JCQlSVF9UUkFDRShDT01QX1JBVEUsImN1cnJlbnRSQVRSID0gJXgsIHRhcmdldFJBVFIgPSAleFxuIiwgY3VycmVudFJBVFIsIHRhcmdldFJBVFIpOwotCQkJaWYocHJpdi0+cmZfdHlwZSA9PSBSRl8xVDJSKQotCQkJewotCQkJCXJhdHJfdmFsdWUgJj0gfihSQVRFX0FMTF9PRkRNXzJTUyk7Ci0JCQl9Ci0JCQl3cml0ZV9uaWNfZHdvcmQocHJpdiwgUkFUUjAsIHJhdHJfdmFsdWUpOwotCQkJd3JpdGVfbmljX2J5dGUocHJpdiwgVUZXUCwgMSk7Ci0KLQkJCXByYS0+bGFzdF9yYXRyID0gdGFyZ2V0UkFUUjsKLQkJfQotCi0JfQotCWVsc2UKLQl7Ci0JCXByYS0+cmF0cl9zdGF0ZSA9IERNX1JBVFJfU1RBX01BWDsKLQl9Ci0KLX0KLQotCi1zdGF0aWMgdm9pZCBkbV9pbml0X2JhbmR3aWR0aF9hdXRvc3dpdGNoKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCXByaXYtPmllZWU4MDIxMS0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLnRocmVzaG9sZF8yME1oenRvNDBNaHogPSBCV19BVVRPX1NXSVRDSF9MT1dfSElHSDsKLQlwcml2LT5pZWVlODAyMTEtPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC50aHJlc2hvbGRfNDBNaHp0bzIwTWh6ID0gQldfQVVUT19TV0lUQ0hfSElHSF9MT1c7Ci0JcHJpdi0+aWVlZTgwMjExLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2guYmZvcmNlZF90eDIwTWh6ID0gZmFsc2U7Ci0JcHJpdi0+aWVlZTgwMjExLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2guYmF1dG9zd2l0Y2hfZW5hYmxlID0gZmFsc2U7Ci0KLX0KLQotCi1zdGF0aWMgdm9pZCBkbV9iYW5kd2lkdGhfYXV0b3N3aXRjaChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQlpZihwcml2LT5DdXJyZW50Q2hhbm5lbEJXID09IEhUX0NIQU5ORUxfV0lEVEhfMjAgfHwhcHJpdi0+aWVlZTgwMjExLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2guYmF1dG9zd2l0Y2hfZW5hYmxlKXsKLQkJcmV0dXJuOwotCX1lbHNlewotCQlpZihwcml2LT5pZWVlODAyMTEtPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC5iZm9yY2VkX3R4MjBNaHogPT0gZmFsc2Upey8vSWYgc2VuZCBwYWNrZXRzIGluIDQwIE1oeiBpbiAyMC80MAotCQkJaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8PSBwcml2LT5pZWVlODAyMTEtPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC50aHJlc2hvbGRfNDBNaHp0bzIwTWh6KQotCQkJCXByaXYtPmllZWU4MDIxMS0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLmJmb3JjZWRfdHgyME1oeiA9IHRydWU7Ci0JCX1lbHNley8vaW4gZm9yY2Ugc2VuZCBwYWNrZXRzIGluIDIwIE1oeiBpbiAyMC80MAotCQkJaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+PSBwcml2LT5pZWVlODAyMTEtPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC50aHJlc2hvbGRfMjBNaHp0bzQwTWh6KQotCQkJCXByaXYtPmllZWU4MDIxMS0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLmJmb3JjZWRfdHgyME1oeiA9IGZhbHNlOwotCi0JCX0KLQl9Ci19Ci0KLS8vT0ZETSBkZWZhdWx0IGF0IDBkYiwgaW5kZXg9Ni4KLXN0YXRpYyBjb25zdCB1MzIgT0ZETVN3aW5nVGFibGVbT0ZETV9UYWJsZV9MZW5ndGhdID0gewotCTB4N2Y4MDAxZmUsCS8vIDAsICs2ZGIKLQkweDcxYzAwMWM3LAkvLyAxLCArNWRiCi0JMHg2NTQwMDE5NSwJLy8gMiwgKzRkYgotCTB4NWE0MDAxNjksCS8vIDMsICszZGIKLQkweDUwODAwMTQyLAkvLyA0LCArMmRiCi0JMHg0N2MwMDExZiwJLy8gNSwgKzFkYgotCTB4NDAwMDAxMDAsCS8vIDYsICswZGIgPT09PiBkZWZhdWx0LCB1cHBlciBmb3IgaGlnaGVyIHRlbXBlcmF0dXJlLCBsb3dlciBmb3IgbG93IHRlbXBlcmF0dXJlCi0JMHgzOTAwMDBlNCwJLy8gNywgLTFkYgotCTB4MzJjMDAwY2IsCS8vIDgsIC0yZGIKLQkweDJkNDAwMGI1LAkvLyA5LCAtM2RiCi0JMHgyODgwMDBhMiwJLy8gMTAsIC00ZGIKLQkweDI0MDAwMDkwLAkvLyAxMSwgLTVkYgotCTB4MjAwMDAwODAsCS8vIDEyLCAtNmRiCi0JMHgxYzgwMDA3MiwJLy8gMTMsIC03ZGIKLQkweDE5ODAwMDY2LAkvLyAxNCwgLThkYgotCTB4MjZjMDAwNWIsCS8vIDE1LCAtOWRiCi0JMHgyNDQwMDA1MSwJLy8gMTYsIC0xMGRiCi0JMHgxMjAwMDA0OCwJLy8gMTcsIC0xMWRiCi0JMHgxMDAwMDA0MAkvLyAxOCwgLTEyZGIKLX07Ci1zdGF0aWMgY29uc3QgdTggQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1tDQ0tfVGFibGVfbGVuZ3RoXVs4XSA9IHsKLQl7MHgzNiwgMHgzNSwgMHgyZSwgMHgyNSwgMHgxYywgMHgxMiwgMHgwOSwgMHgwNH0sCS8vIDAsICswZGIgPT09PiBDQ0s0ME0gZGVmYXVsdAotCXsweDMwLCAweDJmLCAweDI5LCAweDIxLCAweDE5LCAweDEwLCAweDA4LCAweDAzfSwJLy8gMSwgLTFkYgotCXsweDJiLCAweDJhLCAweDI1LCAweDFlLCAweDE2LCAweDBlLCAweDA3LCAweDAzfSwJLy8gMiwgLTJkYgotCXsweDI2LCAweDI1LCAweDIxLCAweDFiLCAweDE0LCAweDBkLCAweDA2LCAweDAzfSwJLy8gMywgLTNkYgotCXsweDIyLCAweDIxLCAweDFkLCAweDE4LCAweDExLCAweDBiLCAweDA2LCAweDAyfSwJLy8gNCwgLTRkYgotCXsweDFmLCAweDFlLCAweDFhLCAweDE1LCAweDEwLCAweDBhLCAweDA1LCAweDAyfSwJLy8gNSwgLTVkYgotCXsweDFiLCAweDFhLCAweDE3LCAweDEzLCAweDBlLCAweDA5LCAweDA0LCAweDAyfSwJLy8gNiwgLTZkYiA9PT0+IENDSzIwTSBkZWZhdWx0Ci0JezB4MTgsIDB4MTcsIDB4MTUsIDB4MTEsIDB4MGMsIDB4MDgsIDB4MDQsIDB4MDJ9LAkvLyA3LCAtN2RiCi0JezB4MTYsIDB4MTUsIDB4MTIsIDB4MGYsIDB4MGIsIDB4MDcsIDB4MDQsIDB4MDF9LAkvLyA4LCAtOGRiCi0JezB4MTMsIDB4MTMsIDB4MTAsIDB4MGQsIDB4MGEsIDB4MDYsIDB4MDMsIDB4MDF9LAkvLyA5LCAtOWRiCi0JezB4MTEsIDB4MTEsIDB4MGYsIDB4MGMsIDB4MDksIDB4MDYsIDB4MDMsIDB4MDF9LAkvLyAxMCwgLTEwZGIKLQl7MHgwZiwgMHgwZiwgMHgwZCwgMHgwYiwgMHgwOCwgMHgwNSwgMHgwMywgMHgwMX0JLy8gMTEsIC0xMWRiCi19OwotCi1zdGF0aWMgY29uc3QgdTggQ0NLU3dpbmdUYWJsZV9DaDE0W0NDS19UYWJsZV9sZW5ndGhdWzhdID0gewotCXsweDM2LCAweDM1LCAweDJlLCAweDFiLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gMCwgKzBkYiAgPT09PiBDQ0s0ME0gZGVmYXVsdAotCXsweDMwLCAweDJmLCAweDI5LCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gMSwgLTFkYgotCXsweDJiLCAweDJhLCAweDI1LCAweDE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gMiwgLTJkYgotCXsweDI2LCAweDI1LCAweDIxLCAweDEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gMywgLTNkYgotCXsweDIyLCAweDIxLCAweDFkLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gNCwgLTRkYgotCXsweDFmLCAweDFlLCAweDFhLCAweDBmLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gNSwgLTVkYgotCXsweDFiLCAweDFhLCAweDE3LCAweDBlLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gNiwgLTZkYiAgPT09PiBDQ0syME0gZGVmYXVsdAotCXsweDE4LCAweDE3LCAweDE1LCAweDBjLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gNywgLTdkYgotCXsweDE2LCAweDE1LCAweDEyLCAweDBiLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gOCwgLThkYgotCXsweDEzLCAweDEzLCAweDEwLCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gOSwgLTlkYgotCXsweDExLCAweDExLCAweDBmLCAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwJLy8gMTAsIC0xMGRiCi0JezB4MGYsIDB4MGYsIDB4MGQsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9CS8vIDExLCAtMTFkYgotfTsKLQotI2RlZmluZQkJUHdfVHJhY2tfRmxhZwkJCQkweDExZAotI2RlZmluZQkJVHNzaV9NZWFfVmFsdWUJCQkJMHgxM2MKLSNkZWZpbmUJCVRzc2lfUmVwb3J0X1ZhbHVlMQkJCTB4MTM0Ci0jZGVmaW5lCQlUc3NpX1JlcG9ydF9WYWx1ZTIJCQkweDEzZQotI2RlZmluZQkJRldfQnVzeV9GbGFnCQkJCTB4MTNmCi1zdGF0aWMgdm9pZCBkbV9UWFBvd2VyVHJhY2tpbmdDYWxsYmFja19UU1NJKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCWJvb2wJCQkJCQliSGlnaHBvd2Vyc3RhdGUsIHZpdmlmbGFnID0gRkFMU0U7Ci0JRENNRF9UWENNRF9UCQkJdHhfY21kOwotCXU4CQkJCQlwb3dlcmxldmVsT0ZETTI0RzsKLQlpbnQJICAgIAkJCQlpID0wLCBqID0gMCwgayA9IDA7Ci0JdTgJCQkJCQlSRl9UeXBlLCB0bXBfcmVwb3J0WzVdPXswLCAwLCAwLCAwLCAwfTsKLQl1MzIJCQkJCQlWYWx1ZTsKLQl1OAkJCQkJCVB3cl9GbGFnOwotCXUxNgkJCQkJQXZnX1RTU0lfTWVhcywgVFNTSV8xM2RCbSwgQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlcj0wOwotLy8JYm9vbCBydFN0YXR1cyA9IHRydWU7Ci0JdTMyCQkJCQkJZGVsdGE9MDsKLQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCIlcygpXG4iLF9fRlVOQ1RJT05fXyk7Ci0vLwl3cml0ZV9uaWNfYnl0ZShwcml2LCAweDFiYSwgMCk7Ci0Jd3JpdGVfbmljX2J5dGUocHJpdiwgUHdfVHJhY2tfRmxhZywgMCk7Ci0Jd3JpdGVfbmljX2J5dGUocHJpdiwgRldfQnVzeV9GbGFnLCAwKTsKLQlwcml2LT5pZWVlODAyMTEtPmJkeW5hbWljX3R4cG93ZXJfZW5hYmxlID0gZmFsc2U7Ci0JYkhpZ2hwb3dlcnN0YXRlID0gcHJpdi0+YkR5bmFtaWNUeEhpZ2hQb3dlcjsKLQotCXBvd2VybGV2ZWxPRkRNMjRHID0gKHU4KShwcml2LT5Qd3JfVHJhY2s+PjI0KTsKLQlSRl9UeXBlID0gcHJpdi0+cmZfdHlwZTsKLQlWYWx1ZSA9IChSRl9UeXBlPDw4KSB8IHBvd2VybGV2ZWxPRkRNMjRHOwotCi0JUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInBvd2VybGV2ZWxPRkRNMjRHID0gJXhcbiIsIHBvd2VybGV2ZWxPRkRNMjRHKTsKLQotCWZvcihqID0gMDsgajw9MzA7IGorKykKLXsJLy9maWxsIHR4X2NtZAotCi0JdHhfY21kLk9wCQk9IFRYQ01EX1NFVF9UWF9QV1JfVFJBQ0tJTkc7Ci0JdHhfY21kLkxlbmd0aAk9IDQ7Ci0JdHhfY21kLlZhbHVlCQk9IFZhbHVlOwotCWNtcGtfbWVzc2FnZV9oYW5kbGVfdHgocHJpdiwgKHU4KikmdHhfY21kLCBERVNDX1BBQ0tFVF9UWVBFX0lOSVQsIHNpemVvZihEQ01EX1RYQ01EX1QpKTsKLQltZGVsYXkoMSk7Ci0KLQlmb3IoaSA9IDA7aSA8PSAzMDsgaSsrKQotCXsKLQkJUHdyX0ZsYWcgPSByZWFkX25pY19ieXRlKHByaXYsIFB3X1RyYWNrX0ZsYWcpOwotCi0JCWlmIChQd3JfRmxhZyA9PSAwKQotCQl7Ci0JCQltZGVsYXkoMSk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCUF2Z19UU1NJX01lYXMgPSByZWFkX25pY193b3JkKHByaXYsIFRzc2lfTWVhX1ZhbHVlKTsKLQotCQlpZihBdmdfVFNTSV9NZWFzID09IDApCi0JCXsKLQkJCXdyaXRlX25pY19ieXRlKHByaXYsIFB3X1RyYWNrX0ZsYWcsIDApOwotCQkJd3JpdGVfbmljX2J5dGUocHJpdiwgRldfQnVzeV9GbGFnLCAwKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvcihrID0gMDtrIDwgNTsgaysrKQotCQl7Ci0JCQlpZihrICE9NCkKLQkJCQl0bXBfcmVwb3J0W2tdID0gcmVhZF9uaWNfYnl0ZShwcml2LCBUc3NpX1JlcG9ydF9WYWx1ZTErayk7Ci0JCQllbHNlCi0JCQkJdG1wX3JlcG9ydFtrXSA9IHJlYWRfbmljX2J5dGUocHJpdiwgVHNzaV9SZXBvcnRfVmFsdWUyKTsKLQotCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlRTU0lfcmVwb3J0X3ZhbHVlID0gJWRcbiIsIHRtcF9yZXBvcnRba10pOwotCQl9Ci0KLQkJLy9jaGVjayBpZiB0aGUgcmVwb3J0IHZhbHVlIGlzIHJpZ2h0Ci0JCWZvcihrID0gMDtrIDwgNTsgaysrKQotCQl7Ci0JCQlpZih0bXBfcmVwb3J0W2tdIDw9IDIwKQotCQkJewotCQkJCXZpdmlmbGFnID1UUlVFOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmKHZpdmlmbGFnID09VFJVRSkKLQkJewotCQkJd3JpdGVfbmljX2J5dGUocHJpdiwgUHdfVHJhY2tfRmxhZywgMCk7Ci0JCQl2aXZpZmxhZyA9IEZBTFNFOwotCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIndlIGZpbHRlZCB0aGlzIGRhdGFcbiIpOwotCQkJZm9yKGsgPSAwO2sgPCA1OyBrKyspCi0JCQkJdG1wX3JlcG9ydFtrXSA9IDA7Ci0JCQlicmVhazsKLQkJfQotCi0JCWZvcihrID0gMDtrIDwgNTsgaysrKQotCQl7Ci0JCQlBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyICs9IHRtcF9yZXBvcnRba107Ci0JCX0KLQotCQlBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyID0gQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlcioxMDAvNTsKLQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIkF2Z19UU1NJX01lYXNfZnJvbV9kcml2ZXIgPSAlZFxuIiwgQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlcik7Ci0JCVRTU0lfMTNkQm0gPSBwcml2LT5UU1NJXzEzZEJtOwotCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiVFNTSV8xM2RCbSA9ICVkXG4iLCBUU1NJXzEzZEJtKTsKLQotCQkvL2lmKGFicyhBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyIC0gVFNTSV8xM2RCbSkgPD0gRV9GT1JfVFhfUE9XRVJfVFJBQ0spCi0JCS8vIEZvciBNYWNPUy1jb21wYXRpYmxlCi0JCWlmKEF2Z19UU1NJX01lYXNfZnJvbV9kcml2ZXIgPiBUU1NJXzEzZEJtKQotCQkJZGVsdGEgPSBBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyIC0gVFNTSV8xM2RCbTsKLQkJZWxzZQotCQkJZGVsdGEgPSBUU1NJXzEzZEJtIC0gQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlcjsKLQotCQlpZihkZWx0YSA8PSBFX0ZPUl9UWF9QT1dFUl9UUkFDSykKLQkJewotCQkJcHJpdi0+aWVlZTgwMjExLT5iZHluYW1pY190eHBvd2VyX2VuYWJsZSA9IFRSVUU7Ci0JCQl3cml0ZV9uaWNfYnl0ZShwcml2LCBQd19UcmFja19GbGFnLCAwKTsKLQkJCXdyaXRlX25pY19ieXRlKHByaXYsIEZXX0J1c3lfRmxhZywgMCk7Ci0JCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAidHggcG93ZXIgdHJhY2sgaXMgZG9uZVxuIik7Ci0JCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4ID0gJWRcbiIsIHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCk7Ci0JCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwgPSAlZFxuIiwgcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwpOwotCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZSA9ICVkXG4iLCBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UpOwotCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPSAlZFxuIiwgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZihBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyIDwgVFNTSV8xM2RCbSAtIEVfRk9SX1RYX1BPV0VSX1RSQUNLKQotCQkJewotCQkJCWlmIChSRl9UeXBlID09IFJGXzJUNFIpCi0JCQkJewotCi0JCQkJCQlpZigocHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4ID4gMCkgJiYocHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4ID4gMCkpCi0JCQkJewotCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXgtLTsKLQkJCQkJaWYocHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwgPiA0KQotCQkJCQl7Ci0JCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbC0tOwotCQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCByT0ZETTBfWEFUeElRSW1iYWxhbmNlLCBiTWFza0RXb3JkLCBwcml2LT50eGJiZ2Fpbl90YWJsZVtwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbF0udHhiYmdhaW5fdmFsdWUpOwotCQkJCQl9Ci0KLQkJCQkJcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4LS07Ci0JCQkJCWlmKHByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsID4gNCkKLQkJCQkJewotCQkJCQkJcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwtLTsKLQkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgck9GRE0wX1hDVHhJUUltYmFsYW5jZSwgYk1hc2tEV29yZCwgcHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWxdLnR4YmJnYWluX3ZhbHVlKTsKLQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIGJNYXNrRFdvcmQsIHByaXYtPnR4YmJnYWluX3RhYmxlWzRdLnR4YmJnYWluX3ZhbHVlKTsKLQkJCQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCByT0ZETTBfWENUeElRSW1iYWxhbmNlLCBiTWFza0RXb3JkLCBwcml2LT50eGJiZ2Fpbl90YWJsZVs0XS50eGJiZ2Fpbl92YWx1ZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCQkJaWYocHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4ID4gMCkKLQkJCQkJCXsKLQkJCQkJCQlwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXgtLTsKLQkJCQkJCQlpZihwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCA+IDQpCi0JCQkJCQkJewotCQkJCQkJCQlwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbC0tOwotCQkJCQkJCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJPRkRNMF9YQ1R4SVFJbWJhbGFuY2UsIGJNYXNrRFdvcmQsIHByaXYtPnR4YmJnYWluX3RhYmxlW3ByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsXS50eGJiZ2Fpbl92YWx1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgck9GRE0wX1hDVHhJUUltYmFsYW5jZSwgYk1hc2tEV29yZCwgcHJpdi0+dHhiYmdhaW5fdGFibGVbNF0udHhiYmdhaW5fdmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlpZiAoUkZfVHlwZSA9PSBSRl8yVDRSKQotCQkJCXsKLQkJCQkJaWYoKHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCA8IFR4QkJHYWluVGFibGVMZW5ndGggLSAxKSAmJihwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXggPCBUeEJCR2FpblRhYmxlTGVuZ3RoIC0gMSkpCi0JCQkJewotCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXgrKzsKLQkJCQkJcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwrKzsKLQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCByT0ZETTBfWEFUeElRSW1iYWxhbmNlLCBiTWFza0RXb3JkLCBwcml2LT50eGJiZ2Fpbl90YWJsZVtwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbF0udHhiYmdhaW5fdmFsdWUpOwotCQkJCQlwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXgrKzsKLQkJCQkJcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwrKzsKLQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCByT0ZETTBfWENUeElRSW1iYWxhbmNlLCBiTWFza0RXb3JkLCBwcml2LT50eGJiZ2Fpbl90YWJsZVtwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbF0udHhiYmdhaW5fdmFsdWUpOwotCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIGJNYXNrRFdvcmQsIHByaXYtPnR4YmJnYWluX3RhYmxlW1R4QkJHYWluVGFibGVMZW5ndGggLSAxXS50eGJiZ2Fpbl92YWx1ZSk7Ci0JCQkJCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJPRkRNMF9YQ1R4SVFJbWJhbGFuY2UsIGJNYXNrRFdvcmQsIHByaXYtPnR4YmJnYWluX3RhYmxlW1R4QkJHYWluVGFibGVMZW5ndGggLSAxXS50eGJiZ2Fpbl92YWx1ZSk7Ci0JCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWlmKHByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleCA8IChUeEJCR2FpblRhYmxlTGVuZ3RoIC0gMSkpCi0JCQkJCXsKLQkJCQkJCQlwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXgrKzsKLQkJCQkJCQlwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCsrOwotCQkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgck9GRE0wX1hDVHhJUUltYmFsYW5jZSwgYk1hc2tEV29yZCwgcHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWxdLnR4YmJnYWluX3ZhbHVlKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCByT0ZETTBfWENUeElRSW1iYWxhbmNlLCBiTWFza0RXb3JkLCBwcml2LT50eGJiZ2Fpbl90YWJsZVtUeEJCR2FpblRhYmxlTGVuZ3RoIC0gMV0udHhiYmdhaW5fdmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChSRl9UeXBlID09IFJGXzJUNFIpCi0JCQlwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UKLQkJCQk9IHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCAtIHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdfZGVmYXVsdDsKLQkJCWVsc2UKLQkJCQlwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UKLQkJCQkJPSBwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXggLSBwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5nX2RlZmF1bHQ7Ci0KLQkJCWlmKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkKLQkJCQlwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uCi0JCQkJPSBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uXzIwTWRlZmF1bHQgKyBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2U7Ci0JCQllbHNlCi0JCQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbgotCQkJCT0gcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl80ME1kZWZhdWx0ICsgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlOwotCi0JCQlpZihwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID4gKENDS1R4QkJHYWluVGFibGVMZW5ndGgtMSkpCi0JCQkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPSBDQ0tUeEJCR2FpblRhYmxlTGVuZ3RoLTE7Ci0JCQlpZihwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uIDwgMCkKLQkJCQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA9IDA7Ci0KLQkJCWlmKDEpCi0JCQl7Ci0JCQkJaWYocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9PSAxNCAmJiAhcHJpdi0+YmNja19pbl9jaDE0KQotCQkJCXsKLQkJCQkJcHJpdi0+YmNja19pbl9jaDE0ID0gVFJVRTsKLQkJCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KHByaXYsIHByaXYtPmJjY2tfaW5fY2gxNCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCAhPSAxNCAmJiBwcml2LT5iY2NrX2luX2NoMTQpCi0JCQkJewotCQkJCQlwcml2LT5iY2NrX2luX2NoMTQgPSBGQUxTRTsKLQkJCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KHByaXYsIHByaXYtPmJjY2tfaW5fY2gxNCk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KHByaXYsIHByaXYtPmJjY2tfaW5fY2gxNCk7Ci0JCQl9Ci0JCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXggPSAlZFxuIiwgcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4KTsKLQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsID0gJWRcbiIsIHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsKTsKLQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZSA9ICVkXG4iLCBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UpOwotCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA9ICVkXG4iLCBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKTsKLQotCQlpZiAocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlIDw9IC0xMnx8cHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlID49IDI0KQotCQl7Ci0JCQlwcml2LT5pZWVlODAyMTEtPmJkeW5hbWljX3R4cG93ZXJfZW5hYmxlID0gVFJVRTsKLQkJCXdyaXRlX25pY19ieXRlKHByaXYsIFB3X1RyYWNrX0ZsYWcsIDApOwotCQkJd3JpdGVfbmljX2J5dGUocHJpdiwgRldfQnVzeV9GbGFnLCAwKTsKLQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJ0eCBwb3dlciB0cmFjay0tLT5saW1pdGVkXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCi0KLQl9Ci0JCXdyaXRlX25pY19ieXRlKHByaXYsIFB3X1RyYWNrX0ZsYWcsIDApOwotCQlBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyID0gMDsKLQkJZm9yKGsgPSAwO2sgPCA1OyBrKyspCi0JCQl0bXBfcmVwb3J0W2tdID0gMDsKLQkJYnJlYWs7Ci0JfQotCXdyaXRlX25pY19ieXRlKHByaXYsIEZXX0J1c3lfRmxhZywgMCk7Ci19Ci0JCXByaXYtPmllZWU4MDIxMS0+YmR5bmFtaWNfdHhwb3dlcl9lbmFibGUgPSBUUlVFOwotCQl3cml0ZV9uaWNfYnl0ZShwcml2LCBQd19UcmFja19GbGFnLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgZG1fVFhQb3dlclRyYWNraW5nQ2FsbGJhY2tfVGhlcm1hbE1ldGVyKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotI2RlZmluZSBUaGVybWFsTWV0ZXJWYWwJOQotCXUzMiB0bXBSZWdBLCBUZW1wQ0NrOwotCXU4IHRtcE9GRE1pbmRleCwgdG1wQ0NLaW5kZXgsIHRtcENDSzIwTWluZGV4LCB0bXBDQ0s0ME1pbmRleCwgdG1wdmFsOwotCWludCBpID0wLCBDQ0tTd2luZ05lZWRVcGRhdGU9MDsKLQotCWlmKCFwcml2LT5idHhwb3dlcl90cmFja2luZ0luaXQpCi0JewotCQkvL1F1ZXJ5IE9GRE0gZGVmYXVsdCBzZXR0aW5nCi0JCXRtcFJlZ0EgPSBydGw4MTkyX1F1ZXJ5QkJSZWcocHJpdiwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwgYk1hc2tEV29yZCk7Ci0JCWZvcihpPTA7IGk8T0ZETV9UYWJsZV9MZW5ndGg7IGkrKykJLy9maW5kIHRoZSBpbmRleAotCQl7Ci0JCQlpZih0bXBSZWdBID09IE9GRE1Td2luZ1RhYmxlW2ldKQotCQkJewotCQkJCXByaXYtPk9GRE1faW5kZXg9ICh1OClpOwotCQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJJbml0aWFsIHJlZzB4JXggPSAweCV4LCBPRkRNX2luZGV4PTB4JXhcbiIsCi0JCQkJCXJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIHRtcFJlZ0EsIHByaXYtPk9GRE1faW5kZXgpOwotCQkJfQotCQl9Ci0KLQkJLy9RdWVyeSBDQ0sgZGVmYXVsdCBzZXR0aW5nIEZyb20gMHhhMjIKLQkJVGVtcENDayA9IHJ0bDgxOTJfUXVlcnlCQlJlZyhwcml2LCByQ0NLMF9UeEZpbHRlcjEsIGJNYXNrQnl0ZTIpOwotCQlmb3IoaT0wIDsgaTxDQ0tfVGFibGVfbGVuZ3RoIDsgaSsrKQotCQl7Ci0JCQlpZihUZW1wQ0NrID09ICh1MzIpQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1tpXVswXSkKLQkJCXsKLQkJCQlwcml2LT5DQ0tfaW5kZXggPSh1OCkgaTsKLQkJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiSW5pdGlhbCByZWcweCV4ID0gMHgleCwgQ0NLX2luZGV4PTB4JXhcbiIsCi0JCQkJCXJDQ0swX1R4RmlsdGVyMSwgVGVtcENDaywgcHJpdi0+Q0NLX2luZGV4KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlwcml2LT5idHhwb3dlcl90cmFja2luZ0luaXQgPSBUUlVFOwotCQkvL3BIYWxEYXRhLT5UWFBvd2VyY291bnQgPSAwOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gcmVhZCBhbmQgZmlsdGVyIG91dCB1bnJlYXNvbmFibGUgdmFsdWUKLQl0bXBSZWdBID0gcnRsODE5Ml9waHlfUXVlcnlSRlJlZyhwcml2LCBSRjkwX1BBVEhfQSwgMHgxMiwgMHgwNzgpOwkvLyAweDEyOiBSRiBSZWdbMTA6N10KLQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiUmVhZGJhY2sgVGhlcm1hbE1ldGVyQSA9ICVkXG4iLCB0bXBSZWdBKTsKLQlpZih0bXBSZWdBIDwgMyB8fCB0bXBSZWdBID4gMTMpCi0JCXJldHVybjsKLQlpZih0bXBSZWdBID49IDEyKQkvLyBpZiBvdmVyIDEyLCBUUCB3aWxsIGJlIGJhZCB3aGVuIGhpZ2ggdGVtcGVyYXR1cmUKLQkJdG1wUmVnQSA9IDEyOwotCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJWYWxpZCBUaGVybWFsTWV0ZXJBID0gJWRcbiIsIHRtcFJlZ0EpOwotCXByaXYtPlRoZXJtYWxNZXRlclswXSA9IFRoZXJtYWxNZXRlclZhbDsJLy9XZSB1c2UgZml4ZWQgdmFsdWUgYnkgQnJ5YW50J3Mgc3VnZ2VzdGlvbgotCXByaXYtPlRoZXJtYWxNZXRlclsxXSA9IFRoZXJtYWxNZXRlclZhbDsJLy9XZSB1c2UgZml4ZWQgdmFsdWUgYnkgQnJ5YW50J3Mgc3VnZ2VzdGlvbgotCi0JLy9HZXQgY3VycmVudCBSRi1BIHRlbXBlcmF0dXJlIGluZGV4Ci0JaWYocHJpdi0+VGhlcm1hbE1ldGVyWzBdID49ICh1OCl0bXBSZWdBKQkvL2xvd2VyIHRlbXBlcmF0dXJlCi0JewotCQl0bXBPRkRNaW5kZXggPSB0bXBDQ0syME1pbmRleCA9IDYrKHByaXYtPlRoZXJtYWxNZXRlclswXS0odTgpdG1wUmVnQSk7Ci0JCXRtcENDSzQwTWluZGV4ID0gdG1wQ0NLMjBNaW5kZXggLSA2OwotCQlpZih0bXBPRkRNaW5kZXggPj0gT0ZETV9UYWJsZV9MZW5ndGgpCi0JCQl0bXBPRkRNaW5kZXggPSBPRkRNX1RhYmxlX0xlbmd0aC0xOwotCQlpZih0bXBDQ0syME1pbmRleCA+PSBDQ0tfVGFibGVfbGVuZ3RoKQotCQkJdG1wQ0NLMjBNaW5kZXggPSBDQ0tfVGFibGVfbGVuZ3RoLTE7Ci0JCWlmKHRtcENDSzQwTWluZGV4ID49IENDS19UYWJsZV9sZW5ndGgpCi0JCQl0bXBDQ0s0ME1pbmRleCA9IENDS19UYWJsZV9sZW5ndGgtMTsKLQl9Ci0JZWxzZQotCXsKLQkJdG1wdmFsID0gKCh1OCl0bXBSZWdBIC0gcHJpdi0+VGhlcm1hbE1ldGVyWzBdKTsKLQkJaWYodG1wdmFsID49IDYpCQkJCQkJCQkvLyBoaWdoZXIgdGVtcGVyYXR1cmUKLQkJCXRtcE9GRE1pbmRleCA9IHRtcENDSzIwTWluZGV4ID0gMDsJCS8vIG1heCB0byArNmRCCi0JCWVsc2UKLQkJCXRtcE9GRE1pbmRleCA9IHRtcENDSzIwTWluZGV4ID0gNiAtIHRtcHZhbDsKLQkJdG1wQ0NLNDBNaW5kZXggPSAwOwotCX0KLQotCWlmKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgIT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkJLy80ME0KLQkJdG1wQ0NLaW5kZXggPSB0bXBDQ0s0ME1pbmRleDsKLQllbHNlCi0JCXRtcENDS2luZGV4ID0gdG1wQ0NLMjBNaW5kZXg7Ci0KLQkvL3JlY29yZCBmb3IgYmFuZHdpZHRoIHN3aXRoCi0JcHJpdi0+UmVjb3JkX0NDS18yME1pbmRleCA9IHRtcENDSzIwTWluZGV4OwotCXByaXYtPlJlY29yZF9DQ0tfNDBNaW5kZXggPSB0bXBDQ0s0ME1pbmRleDsKLQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiUmVjb3JkX0NDS18yME1pbmRleCAvIFJlY29yZF9DQ0tfNDBNaW5kZXggPSAlZCAvICVkLlxuIiwKLQkJcHJpdi0+UmVjb3JkX0NDS18yME1pbmRleCwgcHJpdi0+UmVjb3JkX0NDS180ME1pbmRleCk7Ci0KLQlpZihwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID09IDE0ICYmICFwcml2LT5iY2NrX2luX2NoMTQpCi0JewotCQlwcml2LT5iY2NrX2luX2NoMTQgPSBUUlVFOwotCQlDQ0tTd2luZ05lZWRVcGRhdGUgPSAxOwotCX0KLQllbHNlIGlmKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgIT0gMTQgJiYgcHJpdi0+YmNja19pbl9jaDE0KQotCXsKLQkJcHJpdi0+YmNja19pbl9jaDE0ID0gRkFMU0U7Ci0JCUNDS1N3aW5nTmVlZFVwZGF0ZSA9IDE7Ci0JfQotCi0JaWYocHJpdi0+Q0NLX2luZGV4ICE9IHRtcENDS2luZGV4KQotewotCQlwcml2LT5DQ0tfaW5kZXggPSB0bXBDQ0tpbmRleDsKLQkJQ0NLU3dpbmdOZWVkVXBkYXRlID0gMTsKLQl9Ci0KLQlpZihDQ0tTd2luZ05lZWRVcGRhdGUpCi0JewotCQlkbV9jY2tfdHhwb3dlcl9hZGp1c3QocHJpdiwgcHJpdi0+YmNja19pbl9jaDE0KTsKLQl9Ci0JaWYocHJpdi0+T0ZETV9pbmRleCAhPSB0bXBPRkRNaW5kZXgpCi0JewotCQlwcml2LT5PRkRNX2luZGV4ID0gdG1wT0ZETWluZGV4OwotCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIGJNYXNrRFdvcmQsIE9GRE1Td2luZ1RhYmxlW3ByaXYtPk9GRE1faW5kZXhdKTsKLQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlVwZGF0ZSBPRkRNU3dpbmdbJWRdID0gMHgleFxuIiwKLQkJCXByaXYtPk9GRE1faW5kZXgsIE9GRE1Td2luZ1RhYmxlW3ByaXYtPk9GRE1faW5kZXhdKTsKLQl9Ci0JcHJpdi0+dHhwb3dlcl9jb3VudCA9IDA7Ci19Ci0KLXZvaWQgZG1fdHhwb3dlcl90cmFja2luZ2NhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLHN0cnVjdCBkZWxheWVkX3dvcmssd29yayk7Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YoZHdvcmssc3RydWN0IHI4MTkyX3ByaXYsdHhwb3dlcl90cmFja2luZ193cSk7Ci0KLQlpZihwcml2LT5JQ19DdXQgPj0gSUNfVmVyc2lvbkN1dF9EKQotCQlkbV9UWFBvd2VyVHJhY2tpbmdDYWxsYmFja19UU1NJKHByaXYpOwotCWVsc2UKLQkJZG1fVFhQb3dlclRyYWNraW5nQ2FsbGJhY2tfVGhlcm1hbE1ldGVyKHByaXYpOwotfQotCi0KLXN0YXRpYyBjb25zdCB0eGJiZ2Fpbl9zdHJ1Y3QgcnRsODE5Ml90eGJiZ2Fpbl90YWJsZVtdID0gewotCXsgMTIsCTB4N2Y4MDAxZmUgfSwKLQl7IDExLAkweDc4ODAwMWUyIH0sCi0JeyAxMCwJMHg3MWMwMDFjNyB9LAotCXsgOSwJMHg2YjgwMDFhZSB9LAotCXsgOCwJMHg2NTQwMDE5NSB9LAotCXsgNywJMHg1ZmMwMDE3ZiB9LAotCXsgNiwJMHg1YTQwMDE2OSB9LAotCXsgNSwJMHg1NTQwMDE1NSB9LAotCXsgNCwJMHg1MDgwMDE0MiB9LAotCXsgMywJMHg0YzAwMDEzMCB9LAotCXsgMiwJMHg0N2MwMDExZiB9LAotCXsgMSwJMHg0M2MwMDEwZiB9LAotCXsgMCwJMHg0MDAwMDEwMCB9LAotCXsgLTEsCTB4M2M4MDAwZjIgfSwKLQl7IC0yLAkweDM5MDAwMGU0IH0sCi0JeyAtMywJMHgzNWMwMDBkNyB9LAotCXsgLTQsCTB4MzJjMDAwY2IgfSwKLQl7IC01LAkweDMwMDAwMGMwIH0sCi0JeyAtNiwJMHgyZDQwMDBiNSB9LAotCXsgLTcsCTB4MmFjMDAwYWIgfSwKLQl7IC04LAkweDI4ODAwMGEyIH0sCi0JeyAtOSwJMHgyNjAwMDA5OCB9LAotCXsgLTEwLAkweDI0MDAwMDkwIH0sCi0JeyAtMTEsCTB4MjIwMDAwODggfSwKLQl7IC0xMiwJMHgyMDAwMDA4MCB9LAotCXsgLTEzLAkweDFhMDAwMDZjIH0sCi0JeyAtMTQsCTB4MWM4MDAwNzIgfSwKLQl7IC0xNSwJMHgxODAwMDA2MCB9LAotCXsgLTE2LAkweDE5ODAwMDY2IH0sCi0JeyAtMTcsCTB4MTU4MDAwNTYgfSwKLQl7IC0xOCwJMHgyNmMwMDA1YiB9LAotCXsgLTE5LAkweDE0NDAwMDUxIH0sCi0JeyAtMjAsCTB4MjQ0MDAwNTEgfSwKLQl7IC0yMSwJMHgxMzAwMDA0YyB9LAotCXsgLTIyLAkweDEyMDAwMDQ4IH0sCi0JeyAtMjMsCTB4MTEwMDAwNDQgfSwKLQl7IC0yNCwJMHgxMDAwMDA0MCB9LAotfTsKLQotLyoKLSAqIGNja3R4YmJfdmFsdWVhcnJheVswXSBpcyAweEEyMiBbMV0gaXMgMHhBMjQgLi4uWzddIGlzIDB4QTI5Ci0gKiBUaGlzIFRhYmxlIGlzIGZvciBDSDF+Q0gxMwotICovCi1zdGF0aWMgY29uc3QgY2NrdHhiYmdhaW5fc3RydWN0IHJ0bDgxOTJfY2NrX3R4YmJnYWluX3RhYmxlW10gPSB7Ci0Je3sgMHgzNiwgMHgzNSwgMHgyZSwgMHgyNSwgMHgxYywgMHgxMiwgMHgwOSwgMHgwNCB9fSwKLQl7eyAweDMzLCAweDMyLCAweDJiLCAweDIzLCAweDFhLCAweDExLCAweDA4LCAweDA0IH19LAotCXt7IDB4MzAsIDB4MmYsIDB4MjksIDB4MjEsIDB4MTksIDB4MTAsIDB4MDgsIDB4MDMgfX0sCi0Je3sgMHgyZCwgMHgyZCwgMHgyNywgMHgxZiwgMHgxOCwgMHgwZiwgMHgwOCwgMHgwMyB9fSwKLQl7eyAweDJiLCAweDJhLCAweDI1LCAweDFlLCAweDE2LCAweDBlLCAweDA3LCAweDAzIH19LAotCXt7IDB4MjgsIDB4MjgsIDB4MjIsIDB4MWMsIDB4MTUsIDB4MGQsIDB4MDcsIDB4MDMgfX0sCi0Je3sgMHgyNiwgMHgyNSwgMHgyMSwgMHgxYiwgMHgxNCwgMHgwZCwgMHgwNiwgMHgwMyB9fSwKLQl7eyAweDI0LCAweDIzLCAweDFmLCAweDE5LCAweDEzLCAweDBjLCAweDA2LCAweDAzIH19LAotCXt7IDB4MjIsIDB4MjEsIDB4MWQsIDB4MTgsIDB4MTEsIDB4MGIsIDB4MDYsIDB4MDIgfX0sCi0Je3sgMHgyMCwgMHgyMCwgMHgxYiwgMHgxNiwgMHgxMSwgMHgwOCwgMHgwNSwgMHgwMiB9fSwKLQl7eyAweDFmLCAweDFlLCAweDFhLCAweDE1LCAweDEwLCAweDBhLCAweDA1LCAweDAyIH19LAotCXt7IDB4MWQsIDB4MWMsIDB4MTgsIDB4MTQsIDB4MGYsIDB4MGEsIDB4MDUsIDB4MDIgfX0sCi0Je3sgMHgxYiwgMHgxYSwgMHgxNywgMHgxMywgMHgwZSwgMHgwOSwgMHgwNCwgMHgwMiB9fSwKLQl7eyAweDFhLCAweDE5LCAweDE2LCAweDEyLCAweDBkLCAweDA5LCAweDA0LCAweDAyIH19LAotCXt7IDB4MTgsIDB4MTcsIDB4MTUsIDB4MTEsIDB4MGMsIDB4MDgsIDB4MDQsIDB4MDIgfX0sCi0Je3sgMHgxNywgMHgxNiwgMHgxMywgMHgxMCwgMHgwYywgMHgwOCwgMHgwNCwgMHgwMiB9fSwKLQl7eyAweDE2LCAweDE1LCAweDEyLCAweDBmLCAweDBiLCAweDA3LCAweDA0LCAweDAxIH19LAotCXt7IDB4MTQsIDB4MTQsIDB4MTEsIDB4MGUsIDB4MGIsIDB4MDcsIDB4MDMsIDB4MDIgfX0sCi0Je3sgMHgxMywgMHgxMywgMHgxMCwgMHgwZCwgMHgwYSwgMHgwNiwgMHgwMywgMHgwMSB9fSwKLQl7eyAweDEyLCAweDEyLCAweDBmLCAweDBjLCAweDA5LCAweDA2LCAweDAzLCAweDAxIH19LAotCXt7IDB4MTEsIDB4MTEsIDB4MGYsIDB4MGMsIDB4MDksIDB4MDYsIDB4MDMsIDB4MDEgfX0sCi0Je3sgMHgxMCwgMHgxMCwgMHgwZSwgMHgwYiwgMHgwOCwgMHgwNSwgMHgwMywgMHgwMSB9fSwKLQl7eyAweDBmLCAweDBmLCAweDBkLCAweDBiLCAweDA4LCAweDA1LCAweDAzLCAweDAxIH19LAotfTsKLQotLyoKLSAqIGNja3R4YmJfdmFsdWVhcnJheVswXSBpcyAweEEyMiBbMV0gaXMgMHhBMjQgLi4uWzddIGlzIDB4QTI5Ci0gKiBUaGlzIFRhYmxlIGlzIGZvciBDSDE0Ci0gKi8KLXN0YXRpYyBjb25zdCBjY2t0eGJiZ2Fpbl9zdHJ1Y3QgcnRsODE5Ml9jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVtdID0gewotCXt7IDB4MzYsIDB4MzUsIDB4MmUsIDB4MWIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfX0sCi0Je3sgMHgzMywgMHgzMiwgMHgyYiwgMHgxOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9fSwKLQl7eyAweDMwLCAweDJmLCAweDI5LCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwIH19LAotCXt7IDB4MmQsIDB4MmQsIDB4MjcsIDB4MTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfX0sCi0Je3sgMHgyYiwgMHgyYSwgMHgyNSwgMHgxNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9fSwKLQl7eyAweDI4LCAweDI4LCAweDIyLCAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwIH19LAotCXt7IDB4MjYsIDB4MjUsIDB4MjEsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfX0sCi0Je3sgMHgyNCwgMHgyMywgMHgxZiwgMHgxMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9fSwKLQl7eyAweDIyLCAweDIxLCAweDFkLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH19LAotCXt7IDB4MjAsIDB4MjAsIDB4MWIsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfX0sCi0Je3sgMHgxZiwgMHgxZSwgMHgxYSwgMHgwZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9fSwKLQl7eyAweDFkLCAweDFjLCAweDE4LCAweDBlLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH19LAotCXt7IDB4MWIsIDB4MWEsIDB4MTcsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfX0sCi0Je3sgMHgxYSwgMHgxOSwgMHgxNiwgMHgwZCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9fSwKLQl7eyAweDE4LCAweDE3LCAweDE1LCAweDBjLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH19LAotCXt7IDB4MTcsIDB4MTYsIDB4MTMsIDB4MGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfX0sCi0Je3sgMHgxNiwgMHgxNSwgMHgxMiwgMHgwYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9fSwKLQl7eyAweDE0LCAweDE0LCAweDExLCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH19LAotCXt7IDB4MTMsIDB4MTMsIDB4MTAsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfX0sCi0Je3sgMHgxMiwgMHgxMiwgMHgwZiwgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9fSwKLQl7eyAweDExLCAweDExLCAweDBmLCAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDAwIH19LAotCXt7IDB4MTAsIDB4MTAsIDB4MGUsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfX0sCi0Je3sgMHgwZiwgMHgwZiwgMHgwZCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9fSwKLX07Ci0KLXN0YXRpYyB2b2lkIGRtX0luaXRpYWxpemVUWFBvd2VyVHJhY2tpbmdfVFNTSShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQlwcml2LT50eGJiZ2Fpbl90YWJsZSA9IHJ0bDgxOTJfdHhiYmdhaW5fdGFibGU7Ci0JcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlID0gcnRsODE5Ml9jY2tfdHhiYmdhaW5fdGFibGU7Ci0JcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGUgPSBydGw4MTkyX2Nja190eGJiZ2Fpbl9jaDE0X3RhYmxlOwotCi0JcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmcgPSBUUlVFOwotCXByaXYtPnR4cG93ZXJfY291bnQgICAgICAgPSAwOwotCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nSW5pdCA9IEZBTFNFOwotCi19Ci0KLXN0YXRpYyB2b2lkIGRtX0luaXRpYWxpemVUWFBvd2VyVHJhY2tpbmdfVGhlcm1hbE1ldGVyKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCS8vIFR4IFBvd2VyIHRyYWNraW5nIGJ5IFRoZXJlbWFsIE1ldGVyIHJlcXVpcmUgRmlybXdhcmUgUi9XIDMtd2lyZS4gVGhpcyBtZWNoYW5pc20KLQkvLyBjYW4gYmUgZW5hYmxlZCBvbmx5IHdoZW4gRmlybXdhcmUgUi9XIDMtd2lyZSBpcyBlbmFibGVkLiBPdGhlcndpc2UsIGZyZXF1ZW50IHIvdwotCS8vIDMtd2lyZSBieSBkcml2ZXIgY2F1c2UgUkYgZ29lcyBpbnRvIHdyb25nIHN0YXRlLgotCWlmKHByaXYtPmllZWU4MDIxMS0+RndSV1JGKQotCQlwcml2LT5idHhwb3dlcl90cmFja2luZyA9IFRSVUU7Ci0JZWxzZQotCQlwcml2LT5idHhwb3dlcl90cmFja2luZyA9IEZBTFNFOwotCXByaXYtPnR4cG93ZXJfY291bnQgICAgICAgPSAwOwotCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nSW5pdCA9IEZBTFNFOwotfQotCi12b2lkIGRtX2luaXRpYWxpemVfdHhwb3dlcl90cmFja2luZyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQlpZihwcml2LT5JQ19DdXQgPj0gSUNfVmVyc2lvbkN1dF9EKQotCQlkbV9Jbml0aWFsaXplVFhQb3dlclRyYWNraW5nX1RTU0kocHJpdik7Ci0JZWxzZQotCQlkbV9Jbml0aWFsaXplVFhQb3dlclRyYWNraW5nX1RoZXJtYWxNZXRlcihwcml2KTsKLX0KLQotCi1zdGF0aWMgdm9pZCBkbV9DaGVja1RYUG93ZXJUcmFja2luZ19UU1NJKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCXN0YXRpYyB1MzIgdHhfcG93ZXJfdHJhY2tfY291bnRlciA9IDA7Ci0JUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywiJXMoKVxuIixfX0ZVTkNUSU9OX18pOwotCWlmKHJlYWRfbmljX2J5dGUocHJpdiwgMHgxMWUpID09MSkKLQkJcmV0dXJuOwotCWlmKCFwcml2LT5idHhwb3dlcl90cmFja2luZykKLQkJcmV0dXJuOwotCXR4X3Bvd2VyX3RyYWNrX2NvdW50ZXIrKzsKLQotCWlmICh0eF9wb3dlcl90cmFja19jb3VudGVyID4gOTApIHsKLQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPnByaXZfd3EsJnByaXYtPnR4cG93ZXJfdHJhY2tpbmdfd3EsMCk7Ci0JCXR4X3Bvd2VyX3RyYWNrX2NvdW50ZXIgPTA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBkbV9DaGVja1RYUG93ZXJUcmFja2luZ19UaGVybWFsTWV0ZXIoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0Jc3RhdGljIHU4IAlUTV9UcmlnZ2VyPTA7Ci0KLQlpZighcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmcpCi0JCXJldHVybjsKLQllbHNlCi0JewotCQlpZihwcml2LT50eHBvd2VyX2NvdW50ICA8PSAyKQotCQl7Ci0JCQlwcml2LT50eHBvd2VyX2NvdW50Kys7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlpZighVE1fVHJpZ2dlcikKLQl7Ci0JCS8vQXR0ZW50aW9uISEgWW91IGhhdmUgdG8gd2lydGUgYWxsIDEyYml0cyBkYXRhIHRvIFJGLCBvciBpdCBtYXkgY2F1c2UgUkYgdG8gY3Jhc2gKLQkJLy9hY3R1YWxseSB3cml0ZSByZWcweDAyIGJpdDE9MCwgdGhlbiBiaXQxPTEuCi0JCXJ0bDgxOTJfcGh5X1NldFJGUmVnKHByaXYsIFJGOTBfUEFUSF9BLCAweDAyLCBiTWFzazEyQml0cywgMHg0ZCk7Ci0JCXJ0bDgxOTJfcGh5X1NldFJGUmVnKHByaXYsIFJGOTBfUEFUSF9BLCAweDAyLCBiTWFzazEyQml0cywgMHg0Zik7Ci0JCXJ0bDgxOTJfcGh5X1NldFJGUmVnKHByaXYsIFJGOTBfUEFUSF9BLCAweDAyLCBiTWFzazEyQml0cywgMHg0ZCk7Ci0JCXJ0bDgxOTJfcGh5X1NldFJGUmVnKHByaXYsIFJGOTBfUEFUSF9BLCAweDAyLCBiTWFzazEyQml0cywgMHg0Zik7Ci0JCVRNX1RyaWdnZXIgPSAxOwotCQlyZXR1cm47Ci0JfQotCWVsc2UgewotCQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+cHJpdl93cSwmcHJpdi0+dHhwb3dlcl90cmFja2luZ193cSwwKTsKLQkJVE1fVHJpZ2dlciA9IDA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBkbV9jaGVja190eHBvd2VyX3RyYWNraW5nKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCWlmKHByaXYtPklDX0N1dCA+PSBJQ19WZXJzaW9uQ3V0X0QpCi0JCWRtX0NoZWNrVFhQb3dlclRyYWNraW5nX1RTU0kocHJpdik7Ci0JZWxzZQotCQlkbV9DaGVja1RYUG93ZXJUcmFja2luZ19UaGVybWFsTWV0ZXIocHJpdik7Ci19Ci0KLQotc3RhdGljIHZvaWQgZG1fQ0NLVHhQb3dlckFkanVzdF9UU1NJKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCBib29sIGJJbkNIMTQpCi17Ci0JdTMyIFRlbXBWYWw7Ci0JLy9Xcml0ZSAweGEyMiAweGEyMwotCVRlbXBWYWwgPSAwOwotCWlmKCFiSW5DSDE0KXsKLQkJLy9Xcml0ZSAweGEyMiAweGEyMwotCQlUZW1wVmFsID0gCSh1MzIpKHByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gKwotCQkJCQkocHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWyh1OCkocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbildLmNja3R4YmJfdmFsdWVhcnJheVsxXTw8OCkpIDsKLQotCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJDQ0swX1R4RmlsdGVyMSwgYk1hc2tIV29yZCwgVGVtcFZhbCk7Ci0JCS8vV3JpdGUgMHhhMjQgfiAweGEyNwotCQlUZW1wVmFsID0gMDsKLQkJVGVtcFZhbCA9IAkodTMyKShwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzJdICsKLQkJCQkJKHByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM108PDgpICsKLQkJCQkJKHByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF08PDE2ICkrCi0JCQkJCShwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzVdPDwyNCkpOwotCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJDQ0swX1R4RmlsdGVyMiwgYk1hc2tEV29yZCwgVGVtcFZhbCk7Ci0JCS8vV3JpdGUgMHhhMjggIDB4YTI5Ci0JCVRlbXBWYWwgPSAwOwotCQlUZW1wVmFsID0gCSh1MzIpKHByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gKwotCQkJCQkocHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWyh1OCkocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbildLmNja3R4YmJfdmFsdWVhcnJheVs3XTw8OCkpIDsKLQotCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJDQ0swX0RlYnVnUG9ydCwgYk1hc2tMV29yZCwgVGVtcFZhbCk7Ci0JfQotCWVsc2UKLQl7Ci0JCVRlbXBWYWwgPSAJKHUzMikocHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdICsKLQkJCQkJKHByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWyh1OCkocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbildLmNja3R4YmJfdmFsdWVhcnJheVsxXTw8OCkpIDsKLQotCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJDQ0swX1R4RmlsdGVyMSwgYk1hc2tIV29yZCwgVGVtcFZhbCk7Ci0JCS8vV3JpdGUgMHhhMjQgfiAweGEyNwotCQlUZW1wVmFsID0gMDsKLQkJVGVtcFZhbCA9IAkodTMyKShwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gKwotCQkJCQkocHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzNdPDw4KSArCi0JCQkJCShwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF08PDE2ICkrCi0JCQkJCShwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV08PDI0KSk7Ci0JCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgckNDSzBfVHhGaWx0ZXIyLCBiTWFza0RXb3JkLCBUZW1wVmFsKTsKLQkJLy9Xcml0ZSAweGEyOCAgMHhhMjkKLQkJVGVtcFZhbCA9IDA7Ci0JCVRlbXBWYWwgPSAJKHUzMikocHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdICsKLQkJCQkJKHByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWyh1OCkocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbildLmNja3R4YmJfdmFsdWVhcnJheVs3XTw8OCkpIDsKLQotCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJDQ0swX0RlYnVnUG9ydCwgYk1hc2tMV29yZCwgVGVtcFZhbCk7Ci0JfQotCi0KLX0KLQotc3RhdGljIHZvaWQgZG1fQ0NLVHhQb3dlckFkanVzdF9UaGVybWFsTWV0ZXIoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsCi0JCQkJCSAgICAgYm9vbCBiSW5DSDE0KQotewotCXUzMiBUZW1wVmFsOwotCi0JVGVtcFZhbCA9IDA7Ci0JaWYoIWJJbkNIMTQpCi0JewotCQkvL1dyaXRlIDB4YTIyIDB4YTIzCi0JCVRlbXBWYWwgPSAJQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1twcml2LT5DQ0tfaW5kZXhdWzBdICsKLQkJCQkJKENDS1N3aW5nVGFibGVfQ2gxX0NoMTNbcHJpdi0+Q0NLX2luZGV4XVsxXTw8OCkgOwotCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJDQ0swX1R4RmlsdGVyMSwgYk1hc2tIV29yZCwgVGVtcFZhbCk7Ci0JCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJDQ0sgbm90IGNobmwgMTQsIHJlZyAweCV4ID0gMHgleFxuIiwKLQkJCXJDQ0swX1R4RmlsdGVyMSwgVGVtcFZhbCk7Ci0JCS8vV3JpdGUgMHhhMjQgfiAweGEyNwotCQlUZW1wVmFsID0gMDsKLQkJVGVtcFZhbCA9IAlDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW3ByaXYtPkNDS19pbmRleF1bMl0gKwotCQkJCQkoQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1twcml2LT5DQ0tfaW5kZXhdWzNdPDw4KSArCi0JCQkJCShDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW3ByaXYtPkNDS19pbmRleF1bNF08PDE2ICkrCi0JCQkJCShDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW3ByaXYtPkNDS19pbmRleF1bNV08PDI0KTsKLQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCByQ0NLMF9UeEZpbHRlcjIsIGJNYXNrRFdvcmQsIFRlbXBWYWwpOwotCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiQ0NLIG5vdCBjaG5sIDE0LCByZWcgMHgleCA9IDB4JXhcbiIsCi0JCQlyQ0NLMF9UeEZpbHRlcjIsIFRlbXBWYWwpOwotCQkvL1dyaXRlIDB4YTI4ICAweGEyOQotCQlUZW1wVmFsID0gMDsKLQkJVGVtcFZhbCA9IAlDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW3ByaXYtPkNDS19pbmRleF1bNl0gKwotCQkJCQkoQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1twcml2LT5DQ0tfaW5kZXhdWzddPDw4KSA7Ci0KLQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCByQ0NLMF9EZWJ1Z1BvcnQsIGJNYXNrTFdvcmQsIFRlbXBWYWwpOwotCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiQ0NLIG5vdCBjaG5sIDE0LCByZWcgMHgleCA9IDB4JXhcbiIsCi0JCQlyQ0NLMF9EZWJ1Z1BvcnQsIFRlbXBWYWwpOwotCX0KLQllbHNlCi0JewotLy8JCXByaXYtPkNDS1R4UG93ZXJBZGp1c3RDbnROb3RDaDE0Kys7CS8vY29zYSBhZGQgZm9yIGRlYnVnLgotCQkvL1dyaXRlIDB4YTIyIDB4YTIzCi0JCVRlbXBWYWwgPSAJQ0NLU3dpbmdUYWJsZV9DaDE0W3ByaXYtPkNDS19pbmRleF1bMF0gKwotCQkJCQkoQ0NLU3dpbmdUYWJsZV9DaDE0W3ByaXYtPkNDS19pbmRleF1bMV08PDgpIDsKLQotCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJDQ0swX1R4RmlsdGVyMSwgYk1hc2tIV29yZCwgVGVtcFZhbCk7Ci0JCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJDQ0sgY2hubCAxNCwgcmVnIDB4JXggPSAweCV4XG4iLAotCQkJckNDSzBfVHhGaWx0ZXIxLCBUZW1wVmFsKTsKLQkJLy9Xcml0ZSAweGEyNCB+IDB4YTI3Ci0JCVRlbXBWYWwgPSAwOwotCQlUZW1wVmFsID0gCUNDS1N3aW5nVGFibGVfQ2gxNFtwcml2LT5DQ0tfaW5kZXhdWzJdICsKLQkJCQkJKENDS1N3aW5nVGFibGVfQ2gxNFtwcml2LT5DQ0tfaW5kZXhdWzNdPDw4KSArCi0JCQkJCShDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVs0XTw8MTYgKSsKLQkJCQkJKENDS1N3aW5nVGFibGVfQ2gxNFtwcml2LT5DQ0tfaW5kZXhdWzVdPDwyNCk7Ci0JCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgckNDSzBfVHhGaWx0ZXIyLCBiTWFza0RXb3JkLCBUZW1wVmFsKTsKLQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIkNDSyBjaG5sIDE0LCByZWcgMHgleCA9IDB4JXhcbiIsCi0JCQlyQ0NLMF9UeEZpbHRlcjIsIFRlbXBWYWwpOwotCQkvL1dyaXRlIDB4YTI4ICAweGEyOQotCQlUZW1wVmFsID0gMDsKLQkJVGVtcFZhbCA9IAlDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVs2XSArCi0JCQkJCShDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVs3XTw8OCkgOwotCi0JCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgckNDSzBfRGVidWdQb3J0LCBiTWFza0xXb3JkLCBUZW1wVmFsKTsKLQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywiQ0NLIGNobmwgMTQsIHJlZyAweCV4ID0gMHgleFxuIiwKLQkJCXJDQ0swX0RlYnVnUG9ydCwgVGVtcFZhbCk7Ci0JfQotfQotCi12b2lkIGRtX2Nja190eHBvd2VyX2FkanVzdChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgYm9vbCBiaW5jaDE0KQotewotCWlmKHByaXYtPklDX0N1dCA+PSBJQ19WZXJzaW9uQ3V0X0QpCi0JCWRtX0NDS1R4UG93ZXJBZGp1c3RfVFNTSShwcml2LCBiaW5jaDE0KTsKLQllbHNlCi0JCWRtX0NDS1R4UG93ZXJBZGp1c3RfVGhlcm1hbE1ldGVyKHByaXYsIGJpbmNoMTQpOwotfQotCi0vKiBTZXQgRElHIHNjaGVtZSBpbml0IHZhbHVlLiAqLwotc3RhdGljIHZvaWQgZG1fZGlnX2luaXQoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0JLyogMjAwNy8xMC8wNSBNSCBEaXNhYmxlIERJRyBzY2hlbWUgbm93LiBOb3QgdGVzdGVkLiAqLwotCWRtX2RpZ3RhYmxlLmRpZ19lbmFibGVfZmxhZwk9IHRydWU7Ci0JZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobSA9IERJR19BTEdPX0JZX1JTU0k7Ci0JZG1fZGlndGFibGUuZGJnX21vZGUgPSBETV9EQkdfT0ZGOwkvL29mZj1ieSByZWFsIHJzc2kgdmFsdWUsIG9uPWJ5IERNX0RpZ1RhYmxlLlJzc2lfdmFsIGZvciBuZXcgZGlnCi0JZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobV9zd2l0Y2ggPSAwOwotCi0JLyogMjAwNy8xMC8wNCBNSCBEZWZpbmUgaW5pdCBnYWluIHRocmVzaG9sZC4gKi8KLQlkbV9kaWd0YWJsZS5kaWdfc3RhdGUJCT0gRE1fU1RBX0RJR19NQVg7Ci0JZG1fZGlndGFibGUuZGlnX2hpZ2hwd3Jfc3RhdGUJPSBETV9TVEFfRElHX01BWDsKLQlkbV9kaWd0YWJsZS5pbml0aWFsZ2Fpbl9sb3dlcmJvdW5kX3N0YXRlID0gZmFsc2U7Ci0KLQlkbV9kaWd0YWJsZS5yc3NpX2xvd190aHJlc2ggCT0gRE1fRElHX1RIUkVTSF9MT1c7Ci0JZG1fZGlndGFibGUucnNzaV9oaWdoX3RocmVzaCAJPSBETV9ESUdfVEhSRVNIX0hJR0g7Ci0KLQlkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfcG93ZXJfbG93dGhyZXNoID0gRE1fRElHX0hJR0hfUFdSX1RIUkVTSF9MT1c7Ci0JZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2hpZ2h0aHJlc2ggPSBETV9ESUdfSElHSF9QV1JfVEhSRVNIX0hJR0g7Ci0KLQlkbV9kaWd0YWJsZS5yc3NpX3ZhbCA9IDUwOwkvL2ZvciBuZXcgZGlnIGRlYnVnIHJzc2kgdmFsdWUKLQlkbV9kaWd0YWJsZS5iYWNrb2ZmX3ZhbCA9IERNX0RJR19CQUNLT0ZGOwotCWRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWF4ID0gRE1fRElHX01BWDsKLQlpZihwcml2LT5DdXN0b21lcklEID09IFJUX0NJRF84MTl4X05ldGNvcmUpCi0JCWRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWluID0gRE1fRElHX01JTl9OZXRjb3JlOwotCWVsc2UKLQkJZG1fZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9taW4gPSBETV9ESUdfTUlOOwotCi19Ci0KLQotLyoKLSAqIERyaXZlciBtdXN0IG1vbml0b3IgUlNTSSBhbmQgbm90aWZ5IGZpcm13YXJlIHRvIGNoYW5nZSBpbml0aWFsCi0gKiBnYWluIGFjY29yZGluZyB0byBkaWZmZXJlbnQgdGhyZXNob2xkLiBCQiB0ZWFtIHByb3ZpZGUgdGhlCi0gKiBzdWdnZXN0ZWQgc29sdXRpb24uCi0gKi8KLXN0YXRpYyB2b2lkIGRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCWlmIChkbV9kaWd0YWJsZS5kaWdfZW5hYmxlX2ZsYWcgPT0gZmFsc2UpCi0JCXJldHVybjsKLQotCWlmKGRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG0gPT0gRElHX0FMR09fQllfRkFMU0VfQUxBUk0pCi0JCWRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpX2J5X2Z3ZmFsc2VfYWxhcm0ocHJpdik7Ci0JZWxzZSBpZihkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtID09IERJR19BTEdPX0JZX1JTU0kpCi0JCWRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpX2J5X2RyaXZlcnJzc2kocHJpdik7Ci19Ci0KLQotc3RhdGljIHZvaWQgZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2lfYnlfZHJpdmVycnNzaShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQl1OCBpOwotCXN0YXRpYyB1OCAJZndfZGlnPTA7Ci0KLQlpZiAoZG1fZGlndGFibGUuZGlnX2VuYWJsZV9mbGFnID09IGZhbHNlKQotCQlyZXR1cm47Ci0KLQlpZihkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtX3N3aXRjaCkJLy8gaWYgc3dpdGhlZCBhbGdvcml0aG0sIHdlIGhhdmUgdG8gZGlzYWJsZSBGVyBEaWcuCi0JCWZ3X2RpZyA9IDA7Ci0JaWYoZndfZGlnIDw9IDMpCS8vIGV4ZWN1dGUgc2V2ZXJhbCB0aW1lcyB0byBtYWtlIHN1cmUgdGhlIEZXIERpZyBpcyBkaXNhYmxlZAotCXsvLyBGVyBESUcgT2ZmCi0JCWZvcihpPTA7IGk8MzsgaSsrKQotCQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCBVRldQLCBiTWFza0J5dGUxLCAweDgpOwkvLyBPbmx5IGNsZWFyIGJ5dGUgMSBhbmQgcmV3cml0ZS4KLQkJZndfZGlnKys7Ci0JCWRtX2RpZ3RhYmxlLmRpZ19zdGF0ZSA9IERNX1NUQV9ESUdfT0ZGOwkvL2Z3IGRpZyBvZmYuCi0JfQotCi0JaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQotCQlkbV9kaWd0YWJsZS5jdXJfY29ubmVjdF9zdGF0ZSA9IERJR19DT05ORUNUOwotCWVsc2UKLQkJZG1fZGlndGFibGUuY3VyX2Nvbm5lY3Rfc3RhdGUgPSBESUdfRElTQ09OTkVDVDsKLQotCWlmKGRtX2RpZ3RhYmxlLmRiZ19tb2RlID09IERNX0RCR19PRkYpCi0JCWRtX2RpZ3RhYmxlLnJzc2lfdmFsID0gcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYjsKLQotCWRtX2luaXRpYWxfZ2Fpbihwcml2KTsKLQlkbV9wZF90aChwcml2KTsKLQlkbV9jc19yYXRpbyhwcml2KTsKLQlpZihkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtX3N3aXRjaCkKLQkJZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobV9zd2l0Y2ggPSAwOwotCWRtX2RpZ3RhYmxlLnByZV9jb25uZWN0X3N0YXRlID0gZG1fZGlndGFibGUuY3VyX2Nvbm5lY3Rfc3RhdGU7Ci0KLX0KLQotc3RhdGljIHZvaWQgZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2lfYnlfZndmYWxzZV9hbGFybShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQlzdGF0aWMgdTMyIHJlc2V0X2NudCA9IDA7Ci0JdTggaTsKLQotCWlmIChkbV9kaWd0YWJsZS5kaWdfZW5hYmxlX2ZsYWcgPT0gZmFsc2UpCi0JCXJldHVybjsKLQotCWlmKGRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG1fc3dpdGNoKQotCXsKLQkJZG1fZGlndGFibGUuZGlnX3N0YXRlID0gRE1fU1RBX0RJR19NQVg7Ci0JCS8vIEZ3IERJRyBPbi4KLQkJZm9yKGk9MDsgaTwzOyBpKyspCi0JCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIFVGV1AsIGJNYXNrQnl0ZTEsIDB4MSk7CS8vIE9ubHkgY2xlYXIgYnl0ZSAxIGFuZCByZXdyaXRlLgotCQlkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtX3N3aXRjaCA9IDA7Ci0JfQotCi0JaWYgKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkKLQkJcmV0dXJuOwotCi0JLy8gRm9yIHNtb290aCwgd2UgY2FuIG5vdCBjaGFuZ2UgRElHIHN0YXRlLgotCWlmICgocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+IGRtX2RpZ3RhYmxlLnJzc2lfbG93X3RocmVzaCkgJiYKLQkJKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPCBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfdGhyZXNoKSkKLQl7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiAxLiBXaGVuIFJTU0kgZGVjcmVhc2UsIFdlIGhhdmUgdG8ganVkZ2UgaWYgaXQgaXMgc21hbGxlciB0aGFuIGEgdGhyZXNob2xkCi0JCSAgYW5kIHRoZW4gZXhlY3V0ZSBiZWxvdyBzdGVwLiAqLwotCWlmICgocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8PSBkbV9kaWd0YWJsZS5yc3NpX2xvd190aHJlc2gpKQotCXsKLQkJLyogMjAwOC8wMi8wNSBNSCBXaGVuIHdlIGV4ZWN1dGUgc2lsZW50IHJlc2V0LCB0aGUgRElHIFBIWSBwYXJhbWV0ZXJzCi0JCSAgIHdpbGwgYmUgcmVzZXQgdG8gaW5pdCB2YWx1ZS4gV2UgbXVzdCBwcmV2ZW50IHRoZSBjb25kaXRpb24uICovCi0JCWlmIChkbV9kaWd0YWJsZS5kaWdfc3RhdGUgPT0gRE1fU1RBX0RJR19PRkYgJiYKLQkJCShwcml2LT5yZXNldF9jb3VudCA9PSByZXNldF9jbnQpKQotCQl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlyZXNldF9jbnQgPSBwcml2LT5yZXNldF9jb3VudDsKLQkJfQotCi0JCS8vIElmIERJRyBpcyBvZmYsIERJRyBoaWdoIHBvd2VyIHN0YXRlIG11c3QgcmVzZXQuCi0JCWRtX2RpZ3RhYmxlLmRpZ19oaWdocHdyX3N0YXRlID0gRE1fU1RBX0RJR19NQVg7Ci0JCWRtX2RpZ3RhYmxlLmRpZ19zdGF0ZSA9IERNX1NUQV9ESUdfT0ZGOwotCi0JCS8vIDEuMSBESUcgT2ZmLgotCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIFVGV1AsIGJNYXNrQnl0ZTEsIDB4OCk7CS8vIE9ubHkgY2xlYXIgYnl0ZSAxIGFuZCByZXdyaXRlLgotCi0JCS8vIDEuMiBTZXQgaW5pdGlhbCBnYWluLgotCQl3cml0ZV9uaWNfYnl0ZShwcml2LCByT0ZETTBfWEFBR0NDb3JlMSwgMHgxNyk7Ci0JCXdyaXRlX25pY19ieXRlKHByaXYsIHJPRkRNMF9YQkFHQ0NvcmUxLCAweDE3KTsKLQkJd3JpdGVfbmljX2J5dGUocHJpdiwgck9GRE0wX1hDQUdDQ29yZTEsIDB4MTcpOwotCQl3cml0ZV9uaWNfYnl0ZShwcml2LCByT0ZETTBfWERBR0NDb3JlMSwgMHgxNyk7Ci0KLQkJLy8gMS4zIExvd2VyIFBEX1RIIGZvciBPRkRNLgotCQlpZiAocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKQotCQl7Ci0JCQkvKiAyMDA4LzAxLzExIE1IIDQwTUhaIDkwLzkyIHJlZ2lzdGVyIGFyZSBub3QgdGhlIHNhbWUuICovCi0JCQkvLyAyMDA4LzAyLzA1IE1IIFNEMy1KZXJyeSA5MlUvOTJFIFBEX1RIIGFyZSB0aGUgc2FtZS4KLQkJCXdyaXRlX25pY19ieXRlKHByaXYsIChyT0ZETTBfWEFUeEFGRSszKSwgMHgwMCk7Ci0JCX0KLQkJZWxzZQotCQkJd3JpdGVfbmljX2J5dGUocHJpdiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQyKTsKLQotCQkvLyAxLjQgTG93ZXIgQ1MgcmF0aW8gZm9yIENDSy4KLQkJd3JpdGVfbmljX2J5dGUocHJpdiwgMHhhMGEsIDB4MDgpOwotCi0JCS8vIDEuNSBIaWdoZXIgRURDQ0EuCi0JCS8vUGxhdGZvcm1FRklPV3JpdGU0Qnl0ZShwQWRhcHRlciwgck9GRE0wX0VDQ0FUaHJlc2hvbGQsIDB4MzI1KTsKLQkJcmV0dXJuOwotCi0JfQotCi0JLyogMi4gV2hlbiBSU1NJIGluY3JlYXNlLCBXZSBoYXZlIHRvIGp1ZGdlIGlmIGl0IGlzIGxhcmdlciB0aGFuIGEgdGhyZXNob2xkCi0JCSAgYW5kIHRoZW4gZXhlY3V0ZSBiZWxvdyBzdGVwLiAgKi8KLQlpZiAoKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gZG1fZGlndGFibGUucnNzaV9oaWdoX3RocmVzaCkgKQotCXsKLQkJdTggcmVzZXRfZmxhZyA9IDA7Ci0KLQkJaWYgKGRtX2RpZ3RhYmxlLmRpZ19zdGF0ZSA9PSBETV9TVEFfRElHX09OICYmCi0JCQkocHJpdi0+cmVzZXRfY291bnQgPT0gcmVzZXRfY250KSkKLQkJewotCQkJZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2lfaGlnaHB3cihwcml2KTsKLQkJCXJldHVybjsKLQkJfQotCQllbHNlCi0JCXsKLQkJCWlmIChwcml2LT5yZXNldF9jb3VudCAhPSByZXNldF9jbnQpCi0JCQkJcmVzZXRfZmxhZyA9IDE7Ci0KLQkJCXJlc2V0X2NudCA9IHByaXYtPnJlc2V0X2NvdW50OwotCQl9Ci0KLQkJZG1fZGlndGFibGUuZGlnX3N0YXRlID0gRE1fU1RBX0RJR19PTjsKLQotCQkvLyAyLjEgU2V0IGluaXRpYWwgZ2Fpbi4KLQkJLy8gMjAwOC8wMi8yNiBNSCBTRDMtSmVycnkgc3VnZ2VzdCB0byBwcmV2ZW50IGRpcnR5IGVudmlyb25tZW50LgotCQlpZiAocmVzZXRfZmxhZyA9PSAxKQotCQl7Ci0JCQl3cml0ZV9uaWNfYnl0ZShwcml2LCByT0ZETTBfWEFBR0NDb3JlMSwgMHgyYyk7Ci0JCQl3cml0ZV9uaWNfYnl0ZShwcml2LCByT0ZETTBfWEJBR0NDb3JlMSwgMHgyYyk7Ci0JCQl3cml0ZV9uaWNfYnl0ZShwcml2LCByT0ZETTBfWENBR0NDb3JlMSwgMHgyYyk7Ci0JCQl3cml0ZV9uaWNfYnl0ZShwcml2LCByT0ZETTBfWERBR0NDb3JlMSwgMHgyYyk7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQl3cml0ZV9uaWNfYnl0ZShwcml2LCByT0ZETTBfWEFBR0NDb3JlMSwgMHgyMCk7Ci0JCQl3cml0ZV9uaWNfYnl0ZShwcml2LCByT0ZETTBfWEJBR0NDb3JlMSwgMHgyMCk7Ci0JCQl3cml0ZV9uaWNfYnl0ZShwcml2LCByT0ZETTBfWENBR0NDb3JlMSwgMHgyMCk7Ci0JCQl3cml0ZV9uaWNfYnl0ZShwcml2LCByT0ZETTBfWERBR0NDb3JlMSwgMHgyMCk7Ci0JCX0KLQotCQkvLyAyLjIgSGlnaGVyIFBEX1RIIGZvciBPRkRNLgotCQlpZiAocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKQotCQl7Ci0JCQkvKiAyMDA4LzAxLzExIE1IIDQwTUhaIDkwLzkyIHJlZ2lzdGVyIGFyZSBub3QgdGhlIHNhbWUuICovCi0JCQkvLyAyMDA4LzAyLzA1IE1IIFNEMy1KZXJyeSA5MlUvOTJFIFBEX1RIIGFyZSB0aGUgc2FtZS4KLQkJCXdyaXRlX25pY19ieXRlKHByaXYsIChyT0ZETTBfWEFUeEFGRSszKSwgMHgyMCk7Ci0JCX0KLQkJZWxzZQotCQkJd3JpdGVfbmljX2J5dGUocHJpdiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQ0KTsKLQotCQkvLyAyLjMgSGlnaGVyIENTIHJhdGlvIGZvciBDQ0suCi0JCXdyaXRlX25pY19ieXRlKHByaXYsIDB4YTBhLCAweGNkKTsKLQotCQkvLyAyLjQgTG93ZXIgRURDQ0EuCi0JCS8qIDIwMDgvMDEvMTEgTUggOTAvOTIgc2VyaWVzIGFyZSB0aGUgc2FtZS4gKi8KLQkJLy9QbGF0Zm9ybUVGSU9Xcml0ZTRCeXRlKHBBZGFwdGVyLCByT0ZETTBfRUNDQVRocmVzaG9sZCwgMHgzNDYpOwotCi0JCS8vIDIuNSBESUcgT24uCi0JCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgVUZXUCwgYk1hc2tCeXRlMSwgMHgxKTsJLy8gT25seSBjbGVhciBieXRlIDEgYW5kIHJld3JpdGUuCi0KLQl9Ci0KLQlkbV9jdHJsX2luaXRnYWluX2J5cnNzaV9oaWdocHdyKHByaXYpOwotCi19Ci0KLXN0YXRpYyB2b2lkIGRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpX2hpZ2hwd3Ioc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0Jc3RhdGljIHUzMiByZXNldF9jbnRfaGlnaHB3ciA9IDA7Ci0KLQkvLyBGb3Igc21vb3RoLCB3ZSBjYW4gbm90IGNoYW5nZSBoaWdoIHBvd2VyIERJRyBzdGF0ZSBpbiB0aGUgcmFuZ2UuCi0JaWYgKChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID4gZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2xvd3RocmVzaCkgJiYKLQkJKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPCBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfcG93ZXJfaGlnaHRocmVzaCkpCi0JewotCQlyZXR1cm47Ci0JfQotCi0JLyogMy4gV2hlbiBSU1NJID43NSUgb3IgPDcwJSwgaXQgaXMgYSBoaWdoIHBvd2VyIGlzc3VlLiBXZSBoYXZlIHRvIGp1ZGdlIGlmCi0JCSAgaXQgaXMgbGFyZ2VyIHRoYW4gYSB0aHJlc2hvbGQgYW5kIHRoZW4gZXhlY3V0ZSBiZWxvdyBzdGVwLiAgKi8KLQkvLyAyMDA4LzAyLzA1IE1IIFNEMy1KZXJyeSBNb2RpZnkgUERfVEggZm9yIGhpZ2ggcG93ZXIgaXNzdWUuCi0JaWYgKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2hpZ2h0aHJlc2gpCi0JewotCQlpZiAoZG1fZGlndGFibGUuZGlnX2hpZ2hwd3Jfc3RhdGUgPT0gRE1fU1RBX0RJR19PTiAmJgotCQkJKHByaXYtPnJlc2V0X2NvdW50ID09IHJlc2V0X2NudF9oaWdocHdyKSkKLQkJCXJldHVybjsKLQkJZWxzZQotCQkJZG1fZGlndGFibGUuZGlnX2hpZ2hwd3Jfc3RhdGUgPSBETV9TVEFfRElHX09OOwotCi0JCS8vIDMuMSBIaWdoZXIgUERfVEggZm9yIE9GRE0gZm9yIGhpZ2ggcG93ZXIgc3RhdGUuCi0JCWlmIChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApCi0JCXsKLQkJCXdyaXRlX25pY19ieXRlKHByaXYsIChyT0ZETTBfWEFUeEFGRSszKSwgMHgxMCk7Ci0JCX0KLQkJZWxzZQotCQkJd3JpdGVfbmljX2J5dGUocHJpdiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQzKTsKLQl9Ci0JZWxzZQotCXsKLQkJaWYgKGRtX2RpZ3RhYmxlLmRpZ19oaWdocHdyX3N0YXRlID09IERNX1NUQV9ESUdfT0ZGJiYKLQkJCShwcml2LT5yZXNldF9jb3VudCA9PSByZXNldF9jbnRfaGlnaHB3cikpCi0JCQlyZXR1cm47Ci0JCWVsc2UKLQkJCWRtX2RpZ3RhYmxlLmRpZ19oaWdocHdyX3N0YXRlID0gRE1fU1RBX0RJR19PRkY7Ci0KLQkJaWYgKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPCBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfcG93ZXJfbG93dGhyZXNoICYmCi0JCQkgcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+PSBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfdGhyZXNoKQotCQl7Ci0JCQkvLyAzLjIgUmVjb3ZlciBQRF9USCBmb3IgT0ZETSBmb3Igbm9ybWFsIHBvd2VyIHJlZ2lvbi4KLQkJCWlmIChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApCi0JCQl7Ci0JCQkJd3JpdGVfbmljX2J5dGUocHJpdiwgKHJPRkRNMF9YQVR4QUZFKzMpLCAweDIwKTsKLQkJCX0KLQkJCWVsc2UKLQkJCQl3cml0ZV9uaWNfYnl0ZShwcml2LCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4NDQpOwotCQl9Ci0JfQotCi0JcmVzZXRfY250X2hpZ2hwd3IgPSBwcml2LT5yZXNldF9jb3VudDsKLQotfQotCi0KLXN0YXRpYyB2b2lkIGRtX2luaXRpYWxfZ2FpbihzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQl1OAkJCQkJaW5pdGlhbF9nYWluPTA7Ci0Jc3RhdGljIHU4CQkJCWluaXRpYWxpemVkPTAsIGZvcmNlX3dyaXRlPTA7Ci0Jc3RhdGljIHUzMgkJCXJlc2V0X2NudD0wOwotCi0JaWYoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobV9zd2l0Y2gpCi0JewotCQlpbml0aWFsaXplZCA9IDA7Ci0JCXJlc2V0X2NudCA9IDA7Ci0JfQotCi0JaWYoZG1fZGlndGFibGUucHJlX2Nvbm5lY3Rfc3RhdGUgPT0gZG1fZGlndGFibGUuY3VyX2Nvbm5lY3Rfc3RhdGUpCi0JewotCQlpZihkbV9kaWd0YWJsZS5jdXJfY29ubmVjdF9zdGF0ZSA9PSBESUdfQ09OTkVDVCkKLQkJewotCQkJaWYoKGRtX2RpZ3RhYmxlLnJzc2lfdmFsKzEwLWRtX2RpZ3RhYmxlLmJhY2tvZmZfdmFsKSA+IGRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWF4KQotCQkJCWRtX2RpZ3RhYmxlLmN1cl9pZ192YWx1ZSA9IGRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWF4OwotCQkJZWxzZSBpZigoZG1fZGlndGFibGUucnNzaV92YWwrMTAtZG1fZGlndGFibGUuYmFja29mZl92YWwpIDwgZG1fZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9taW4pCi0JCQkJZG1fZGlndGFibGUuY3VyX2lnX3ZhbHVlID0gZG1fZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9taW47Ci0JCQllbHNlCi0JCQkJZG1fZGlndGFibGUuY3VyX2lnX3ZhbHVlID0gZG1fZGlndGFibGUucnNzaV92YWwrMTAtZG1fZGlndGFibGUuYmFja29mZl92YWw7Ci0JCX0KLQkJZWxzZQkJLy9jdXJyZW50IHN0YXRlIGlzIGRpc2Nvbm5lY3RlZAotCQl7Ci0JCQlpZihkbV9kaWd0YWJsZS5jdXJfaWdfdmFsdWUgPT0gMCkKLQkJCQlkbV9kaWd0YWJsZS5jdXJfaWdfdmFsdWUgPSBwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bMF07Ci0JCQllbHNlCi0JCQkJZG1fZGlndGFibGUuY3VyX2lnX3ZhbHVlID0gZG1fZGlndGFibGUucHJlX2lnX3ZhbHVlOwotCQl9Ci0JfQotCWVsc2UJLy8gZGlzY29ubmVjdGVkIC0+IGNvbm5lY3RlZCBvciBjb25uZWN0ZWQgLT4gZGlzY29ubmVjdGVkCi0JewotCQlkbV9kaWd0YWJsZS5jdXJfaWdfdmFsdWUgPSBwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bMF07Ci0JCWRtX2RpZ3RhYmxlLnByZV9pZ192YWx1ZSA9IDA7Ci0JfQotCi0JLy8gaWYgc2lsZW50IHJlc2V0IGhhcHBlbmVkLCB3ZSBzaG91bGQgcmV3cml0ZSB0aGUgdmFsdWVzIGJhY2sKLQlpZihwcml2LT5yZXNldF9jb3VudCAhPSByZXNldF9jbnQpCi0JewotCQlmb3JjZV93cml0ZSA9IDE7Ci0JCXJlc2V0X2NudCA9IHByaXYtPnJlc2V0X2NvdW50OwotCX0KLQotCWlmKGRtX2RpZ3RhYmxlLnByZV9pZ192YWx1ZSAhPSByZWFkX25pY19ieXRlKHByaXYsIHJPRkRNMF9YQUFHQ0NvcmUxKSkKLQkJZm9yY2Vfd3JpdGUgPSAxOwotCi0JewotCQlpZigoZG1fZGlndGFibGUucHJlX2lnX3ZhbHVlICE9IGRtX2RpZ3RhYmxlLmN1cl9pZ192YWx1ZSkKLQkJCXx8ICFpbml0aWFsaXplZCB8fCBmb3JjZV93cml0ZSkKLQkJewotCQkJaW5pdGlhbF9nYWluID0gKHU4KWRtX2RpZ3RhYmxlLmN1cl9pZ192YWx1ZTsKLQkJCS8vIFNldCBpbml0aWFsIGdhaW4uCi0JCQl3cml0ZV9uaWNfYnl0ZShwcml2LCByT0ZETTBfWEFBR0NDb3JlMSwgaW5pdGlhbF9nYWluKTsKLQkJCXdyaXRlX25pY19ieXRlKHByaXYsIHJPRkRNMF9YQkFHQ0NvcmUxLCBpbml0aWFsX2dhaW4pOwotCQkJd3JpdGVfbmljX2J5dGUocHJpdiwgck9GRE0wX1hDQUdDQ29yZTEsIGluaXRpYWxfZ2Fpbik7Ci0JCQl3cml0ZV9uaWNfYnl0ZShwcml2LCByT0ZETTBfWERBR0NDb3JlMSwgaW5pdGlhbF9nYWluKTsKLQkJCWRtX2RpZ3RhYmxlLnByZV9pZ192YWx1ZSA9IGRtX2RpZ3RhYmxlLmN1cl9pZ192YWx1ZTsKLQkJCWluaXRpYWxpemVkID0gMTsKLQkJCWZvcmNlX3dyaXRlID0gMDsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgZG1fcGRfdGgoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0Jc3RhdGljIHU4CQkJCWluaXRpYWxpemVkPTAsIGZvcmNlX3dyaXRlPTA7Ci0Jc3RhdGljIHUzMgkJCXJlc2V0X2NudCA9IDA7Ci0KLQlpZihkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtX3N3aXRjaCkKLQl7Ci0JCWluaXRpYWxpemVkID0gMDsKLQkJcmVzZXRfY250ID0gMDsKLQl9Ci0KLQlpZihkbV9kaWd0YWJsZS5wcmVfY29ubmVjdF9zdGF0ZSA9PSBkbV9kaWd0YWJsZS5jdXJfY29ubmVjdF9zdGF0ZSkKLQl7Ci0JCWlmKGRtX2RpZ3RhYmxlLmN1cl9jb25uZWN0X3N0YXRlID09IERJR19DT05ORUNUKQotCQl7Ci0JCQlpZiAoZG1fZGlndGFibGUucnNzaV92YWwgPj0gZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2hpZ2h0aHJlc2gpCi0JCQkJZG1fZGlndGFibGUuY3VycGRfdGhzdGF0ZSA9IERJR19QRF9BVF9ISUdIX1BPV0VSOwotCQkJZWxzZSBpZiAoKGRtX2RpZ3RhYmxlLnJzc2lfdmFsIDw9IGRtX2RpZ3RhYmxlLnJzc2lfbG93X3RocmVzaCkpCi0JCQkJZG1fZGlndGFibGUuY3VycGRfdGhzdGF0ZSA9IERJR19QRF9BVF9MT1dfUE9XRVI7Ci0JCQllbHNlIGlmICgoZG1fZGlndGFibGUucnNzaV92YWwgPj0gZG1fZGlndGFibGUucnNzaV9oaWdoX3RocmVzaCkgJiYKLQkJCQkJKGRtX2RpZ3RhYmxlLnJzc2lfdmFsIDwgZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2xvd3RocmVzaCkpCi0JCQkJZG1fZGlndGFibGUuY3VycGRfdGhzdGF0ZSA9IERJR19QRF9BVF9OT1JNQUxfUE9XRVI7Ci0JCQllbHNlCi0JCQkJZG1fZGlndGFibGUuY3VycGRfdGhzdGF0ZSA9IGRtX2RpZ3RhYmxlLnByZXBkX3Roc3RhdGU7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlkbV9kaWd0YWJsZS5jdXJwZF90aHN0YXRlID0gRElHX1BEX0FUX0xPV19QT1dFUjsKLQkJfQotCX0KLQllbHNlCS8vIGRpc2Nvbm5lY3RlZCAtPiBjb25uZWN0ZWQgb3IgY29ubmVjdGVkIC0+IGRpc2Nvbm5lY3RlZAotCXsKLQkJZG1fZGlndGFibGUuY3VycGRfdGhzdGF0ZSA9IERJR19QRF9BVF9MT1dfUE9XRVI7Ci0JfQotCi0JLy8gaWYgc2lsZW50IHJlc2V0IGhhcHBlbmVkLCB3ZSBzaG91bGQgcmV3cml0ZSB0aGUgdmFsdWVzIGJhY2sKLQlpZihwcml2LT5yZXNldF9jb3VudCAhPSByZXNldF9jbnQpCi0JewotCQlmb3JjZV93cml0ZSA9IDE7Ci0JCXJlc2V0X2NudCA9IHByaXYtPnJlc2V0X2NvdW50OwotCX0KLQotCXsKLQkJaWYoKGRtX2RpZ3RhYmxlLnByZXBkX3Roc3RhdGUgIT0gZG1fZGlndGFibGUuY3VycGRfdGhzdGF0ZSkgfHwKLQkJCShpbml0aWFsaXplZDw9MykgfHwgZm9yY2Vfd3JpdGUpCi0JCXsKLQkJCWlmKGRtX2RpZ3RhYmxlLmN1cnBkX3Roc3RhdGUgPT0gRElHX1BEX0FUX0xPV19QT1dFUikKLQkJCXsKLQkJCQkvLyBMb3dlciBQRF9USCBmb3IgT0ZETS4KLQkJCQlpZiAocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKQotCQkJCXsKLQkJCQkJLyogMjAwOC8wMS8xMSBNSCA0ME1IWiA5MC85MiByZWdpc3RlciBhcmUgbm90IHRoZSBzYW1lLiAqLwotCQkJCQkvLyAyMDA4LzAyLzA1IE1IIFNEMy1KZXJyeSA5MlUvOTJFIFBEX1RIIGFyZSB0aGUgc2FtZS4KLQkJCQkJd3JpdGVfbmljX2J5dGUocHJpdiwgKHJPRkRNMF9YQVR4QUZFKzMpLCAweDAwKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQl3cml0ZV9uaWNfYnl0ZShwcml2LCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4NDIpOwotCQkJfQotCQkJZWxzZSBpZihkbV9kaWd0YWJsZS5jdXJwZF90aHN0YXRlID09IERJR19QRF9BVF9OT1JNQUxfUE9XRVIpCi0JCQl7Ci0JCQkJLy8gSGlnaGVyIFBEX1RIIGZvciBPRkRNLgotCQkJCWlmIChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApCi0JCQkJewotCQkJCQkvKiAyMDA4LzAxLzExIE1IIDQwTUhaIDkwLzkyIHJlZ2lzdGVyIGFyZSBub3QgdGhlIHNhbWUuICovCi0JCQkJCS8vIDIwMDgvMDIvMDUgTUggU0QzLUplcnJ5IDkyVS85MkUgUERfVEggYXJlIHRoZSBzYW1lLgotCQkJCQl3cml0ZV9uaWNfYnl0ZShwcml2LCAock9GRE0wX1hBVHhBRkUrMyksIDB4MjApOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXdyaXRlX25pY19ieXRlKHByaXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0NCk7Ci0JCQl9Ci0JCQllbHNlIGlmKGRtX2RpZ3RhYmxlLmN1cnBkX3Roc3RhdGUgPT0gRElHX1BEX0FUX0hJR0hfUE9XRVIpCi0JCQl7Ci0JCQkJLy8gSGlnaGVyIFBEX1RIIGZvciBPRkRNIGZvciBoaWdoIHBvd2VyIHN0YXRlLgotCQkJCWlmIChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApCi0JCQkJewotCQkJCQl3cml0ZV9uaWNfYnl0ZShwcml2LCAock9GRE0wX1hBVHhBRkUrMyksIDB4MTApOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXdyaXRlX25pY19ieXRlKHByaXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0Myk7Ci0JCQl9Ci0JCQlkbV9kaWd0YWJsZS5wcmVwZF90aHN0YXRlID0gZG1fZGlndGFibGUuY3VycGRfdGhzdGF0ZTsKLQkJCWlmKGluaXRpYWxpemVkIDw9IDMpCi0JCQkJaW5pdGlhbGl6ZWQrKzsKLQkJCWZvcmNlX3dyaXRlID0gMDsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgZG1fY3NfcmF0aW8oc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0Jc3RhdGljIHU4CQkJCWluaXRpYWxpemVkPTAsZm9yY2Vfd3JpdGU9MDsKLQlzdGF0aWMgdTMyCQkJcmVzZXRfY250ID0gMDsKLQotCWlmKGRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG1fc3dpdGNoKQotCXsKLQkJaW5pdGlhbGl6ZWQgPSAwOwotCQlyZXNldF9jbnQgPSAwOwotCX0KLQotCWlmKGRtX2RpZ3RhYmxlLnByZV9jb25uZWN0X3N0YXRlID09IGRtX2RpZ3RhYmxlLmN1cl9jb25uZWN0X3N0YXRlKQotCXsKLQkJaWYoZG1fZGlndGFibGUuY3VyX2Nvbm5lY3Rfc3RhdGUgPT0gRElHX0NPTk5FQ1QpCi0JCXsKLQkJCWlmICgoZG1fZGlndGFibGUucnNzaV92YWwgPD0gZG1fZGlndGFibGUucnNzaV9sb3dfdGhyZXNoKSkKLQkJCQlkbV9kaWd0YWJsZS5jdXJjc19yYXRpb19zdGF0ZSA9IERJR19DU19SQVRJT19MT1dFUjsKLQkJCWVsc2UgaWYgKChkbV9kaWd0YWJsZS5yc3NpX3ZhbCA+PSBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfdGhyZXNoKSApCi0JCQkJZG1fZGlndGFibGUuY3VyY3NfcmF0aW9fc3RhdGUgPSBESUdfQ1NfUkFUSU9fSElHSEVSOwotCQkJZWxzZQotCQkJCWRtX2RpZ3RhYmxlLmN1cmNzX3JhdGlvX3N0YXRlID0gZG1fZGlndGFibGUucHJlY3NfcmF0aW9fc3RhdGU7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlkbV9kaWd0YWJsZS5jdXJjc19yYXRpb19zdGF0ZSA9IERJR19DU19SQVRJT19MT1dFUjsKLQkJfQotCX0KLQllbHNlCS8vIGRpc2Nvbm5lY3RlZCAtPiBjb25uZWN0ZWQgb3IgY29ubmVjdGVkIC0+IGRpc2Nvbm5lY3RlZAotCXsKLQkJZG1fZGlndGFibGUuY3VyY3NfcmF0aW9fc3RhdGUgPSBESUdfQ1NfUkFUSU9fTE9XRVI7Ci0JfQotCi0JLy8gaWYgc2lsZW50IHJlc2V0IGhhcHBlbmVkLCB3ZSBzaG91bGQgcmV3cml0ZSB0aGUgdmFsdWVzIGJhY2sKLQlpZihwcml2LT5yZXNldF9jb3VudCAhPSByZXNldF9jbnQpCi0JewotCQlmb3JjZV93cml0ZSA9IDE7Ci0JCXJlc2V0X2NudCA9IHByaXYtPnJlc2V0X2NvdW50OwotCX0KLQotCi0JaWYoKGRtX2RpZ3RhYmxlLnByZWNzX3JhdGlvX3N0YXRlICE9IGRtX2RpZ3RhYmxlLmN1cmNzX3JhdGlvX3N0YXRlKSB8fAotCQkhaW5pdGlhbGl6ZWQgfHwgZm9yY2Vfd3JpdGUpCi0JewotCQlpZihkbV9kaWd0YWJsZS5jdXJjc19yYXRpb19zdGF0ZSA9PSBESUdfQ1NfUkFUSU9fTE9XRVIpCi0JCXsKLQkJCS8vIExvd2VyIENTIHJhdGlvIGZvciBDQ0suCi0JCQl3cml0ZV9uaWNfYnl0ZShwcml2LCAweGEwYSwgMHgwOCk7Ci0JCX0KLQkJZWxzZSBpZihkbV9kaWd0YWJsZS5jdXJjc19yYXRpb19zdGF0ZSA9PSBESUdfQ1NfUkFUSU9fSElHSEVSKQotCQl7Ci0JCQkvLyBIaWdoZXIgQ1MgcmF0aW8gZm9yIENDSy4KLQkJCXdyaXRlX25pY19ieXRlKHByaXYsIDB4YTBhLCAweGNkKTsKLQkJfQotCQlkbV9kaWd0YWJsZS5wcmVjc19yYXRpb19zdGF0ZSA9IGRtX2RpZ3RhYmxlLmN1cmNzX3JhdGlvX3N0YXRlOwotCQlpbml0aWFsaXplZCA9IDE7Ci0JCWZvcmNlX3dyaXRlID0gMDsKLQl9Ci19Ci0KLXZvaWQgZG1faW5pdF9lZGNhX3R1cmJvKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCi0JcHJpdi0+YmN1cnJlbnRfdHVyYm9fRURDQSA9IGZhbHNlOwotCXByaXYtPmllZWU4MDIxMS0+YmlzX2FueV9ub25iZXBrdHMgPSBmYWxzZTsKLQlwcml2LT5iaXNfY3VyX3JkbHN0YXRlID0gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtX2NoZWNrX2VkY2FfdHVyYm8oc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0JUFJUX0hJR0hfVEhST1VHSFBVVAlwSFRJbmZvID0gcHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvOwotCS8vUFNUQV9RT1MJCQlwU3RhUW9zID0gcE1nbnRJbmZvLT5wU3RhUW9zOwotCi0JLy8gS2VlcCBwYXN0IFR4L1J4IHBhY2tldCBjb3VudCBmb3IgUlQtdG8tUlQgRURDQSB0dXJiby4KLQlzdGF0aWMgdW5zaWduZWQgbG9uZwkJCWxhc3RUeE9rQ250ID0gMDsKLQlzdGF0aWMgdW5zaWduZWQgbG9uZwkJCWxhc3RSeE9rQ250ID0gMDsKLQl1bnNpZ25lZCBsb25nCQkJCWN1clR4T2tDbnQgPSAwOwotCXVuc2lnbmVkIGxvbmcJCQkJY3VyUnhPa0NudCA9IDA7Ci0KLQkvLwotCS8vIERvIG5vdCBiZSBUdXJibyBpZiBpdCdzIHVuZGVyIFdpRmkgY29uZmlnIGFuZCBRb3MgRW5hYmxlZCwgYmVjYXVzZSB0aGUgRURDQSBwYXJhbWV0ZXJzCi0JLy8gc2hvdWxkIGZvbGxvdyB0aGUgc2V0dGluZ3MgZnJvbSBRQVAuIEJ5IEJydWNlLCAyMDA3LTEyLTA3LgotCS8vCi0JaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEKQotCQlnb3RvIGRtX0NoZWNrRWRjYVR1cmJvX0VYSVQ7Ci0JLy8gV2UgZG8gbm90IHR1cm4gb24gRURDQSB0dXJibyBtb2RlIGZvciBzb21lIEFQIHRoYXQgaGFzIElPVCBpc3N1ZQotCWlmKHByaXYtPmllZWU4MDIxMS0+cEhUSW5mby0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9ESVNBQkxFX0VEQ0FfVFVSQk8pCi0JCWdvdG8gZG1fQ2hlY2tFZGNhVHVyYm9fRVhJVDsKLQotCS8vIENoZWNrIHRoZSBzdGF0dXMgZm9yIGN1cnJlbnQgY29uZGl0aW9uLgotCWlmKCFwcml2LT5pZWVlODAyMTEtPmJpc19hbnlfbm9uYmVwa3RzKQotCXsKLQkJY3VyVHhPa0NudCA9IHByaXYtPnN0YXRzLnR4Ynl0ZXN1bmljYXN0IC0gbGFzdFR4T2tDbnQ7Ci0JCWN1clJ4T2tDbnQgPSBwcml2LT5zdGF0cy5yeGJ5dGVzdW5pY2FzdCAtIGxhc3RSeE9rQ250OwotCQkvLyBGb3IgUlQtQVAsIHdlIG5lZWRzIHRvIHR1cm4gaXQgb24gd2hlbiBSeD5UeAotCQlpZihjdXJSeE9rQ250ID4gNCpjdXJUeE9rQ250KQotCQl7Ci0JCQlpZighcHJpdi0+YmlzX2N1cl9yZGxzdGF0ZSB8fCAhcHJpdi0+YmN1cnJlbnRfdHVyYm9fRURDQSkKLQkJCXsKLQkJCQl3cml0ZV9uaWNfZHdvcmQocHJpdiwgRURDQVBBUkFfQkUsIGVkY2Ffc2V0dGluZ19ETFtwSFRJbmZvLT5JT1RQZWVyXSk7Ci0JCQkJcHJpdi0+YmlzX2N1cl9yZGxzdGF0ZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZihwcml2LT5iaXNfY3VyX3JkbHN0YXRlIHx8ICFwcml2LT5iY3VycmVudF90dXJib19FRENBKQotCQkJewotCQkJCXdyaXRlX25pY19kd29yZChwcml2LCBFRENBUEFSQV9CRSwgZWRjYV9zZXR0aW5nX1VMW3BIVEluZm8tPklPVFBlZXJdKTsKLQkJCQlwcml2LT5iaXNfY3VyX3JkbHN0YXRlID0gZmFsc2U7Ci0JCQl9Ci0KLQkJfQotCi0JCXByaXYtPmJjdXJyZW50X3R1cmJvX0VEQ0EgPSB0cnVlOwotCX0KLQllbHNlCi0JewotCQkvLwotCQkvLyBUdXJuIE9mZiBFRENBIHR1cmJvIGhlcmUuCi0JCS8vIFJlc3RvcmUgb3JpZ2luYWwgRURDQSBhY2NvcmRpbmcgdG8gdGhlIGRlY2xhcmF0aW9uIG9mIEFQLgotCQkvLwotCQkgaWYocHJpdi0+YmN1cnJlbnRfdHVyYm9fRURDQSkKLQkJewotCi0JCQl7Ci0JCQkJdTgJCXUxYkFJRlM7Ci0JCQkJdTMyCQl1NGJBY1BhcmFtOwotCQkJCXN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcnMgKnFvc19wYXJhbWV0ZXJzID0gJnByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnBhcmFtZXRlcnM7Ci0JCQkJdTggbW9kZSA9IHByaXYtPmllZWU4MDIxMS0+bW9kZTsKLQotCQkJLy8gRm9yIEVhY2ggdGltZSB1cGRhdGluZyBFRENBIHBhcmFtZXRlciwgcmVzZXQgRURDQSB0dXJibyBtb2RlIHN0YXR1cy4KLQkJCQlkbV9pbml0X2VkY2FfdHVyYm8ocHJpdik7Ci0JCQkJdTFiQUlGUyA9IHFvc19wYXJhbWV0ZXJzLT5haWZzWzBdICogKChtb2RlJihJRUVFX0d8SUVFRV9OXzI0RykpID85OjIwKSArIGFTaWZzVGltZTsKLQkJCQl1NGJBY1BhcmFtID0gKCgoKHUzMikocW9zX3BhcmFtZXRlcnMtPnR4X29wX2xpbWl0WzBdKSk8PCBBQ19QQVJBTV9UWE9QX0xJTUlUX09GRlNFVCl8Ci0JCQkJCSgoKHUzMikocW9zX3BhcmFtZXRlcnMtPmN3X21heFswXSkpPDwgQUNfUEFSQU1fRUNXX01BWF9PRkZTRVQpfAotCQkJCQkoKCh1MzIpKHFvc19wYXJhbWV0ZXJzLT5jd19taW5bMF0pKTw8IEFDX1BBUkFNX0VDV19NSU5fT0ZGU0VUKXwKLQkJCQkJKCh1MzIpdTFiQUlGUyA8PCBBQ19QQVJBTV9BSUZTX09GRlNFVCkpOwotCQkJCXByaW50aygiPT09PnU0YkFjUGFyYW06JXgsICIsIHU0YkFjUGFyYW0pOwotCQkJLy93cml0ZV9uaWNfZHdvcmQoZGV2LCBXRENBUEFSQV9BRERbaV0sIHU0YkFjUGFyYW0pOwotCQkJCXdyaXRlX25pY19kd29yZChwcml2LCBFRENBUEFSQV9CRSwgIHU0YkFjUGFyYW0pOwotCi0JCQkvLyBDaGVjayBBQ00gYml0LgotCQkJLy8gSWYgaXQgaXMgc2V0LCBpbW1lZGlhdGVseSBzZXQgQUNNIGNvbnRyb2wgYml0IHRvIGRvd25ncmFkaW5nIEFDIGZvciBwYXNzaW5nIFdNTSB0ZXN0cGxhbi4gQW5uaWUsIDIwMDUtMTItMTMuCi0JCQkJewotCQkJLy8gVE9ETzogIE1vZGlmaWVkIHRoaXMgcGFydCBhbmQgdHJ5IHRvIHNldCBhY20gY29udHJvbCBpbiBvbmx5IDEgSU8gcHJvY2Vzc2luZyEhCi0KLQkJCQkJUEFDSV9BSUZTTglwQWNpQWlmc24gPSAoUEFDSV9BSUZTTikmKHFvc19wYXJhbWV0ZXJzLT5haWZzWzBdKTsKLQkJCQkJdTgJCUFjbUN0cmwgPSByZWFkX25pY19ieXRlKHByaXYsIEFjbUh3Q3RybCApOwotCQkJCQlpZiggcEFjaUFpZnNuLT5mLkFDTSApCi0JCQkJCXsgLy8gQUNNIGJpdCBpcyAxLgotCQkJCQkJQWNtQ3RybCB8PSBBY21Id19CZXFFbjsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsgLy8gQUNNIGJpdCBpcyAwLgotCQkJCQkJQWNtQ3RybCAmPSAofkFjbUh3X0JlcUVuKTsKLQkJCQkJfQotCi0JCQkJCVJUX1RSQUNFKCBDT01QX1FPUywiU2V0SHdSZWc4MTkwcGNpKCk6IFtIV19WQVJfQUNNX0NUUkxdIFdyaXRlIDB4JVhcbiIsIEFjbUN0cmwgKSA7Ci0JCQkJCXdyaXRlX25pY19ieXRlKHByaXYsIEFjbUh3Q3RybCwgQWNtQ3RybCApOwotCQkJCX0KLQkJCX0KLQkJCXByaXYtPmJjdXJyZW50X3R1cmJvX0VEQ0EgPSBmYWxzZTsKLQkJfQotCX0KLQotCi1kbV9DaGVja0VkY2FUdXJib19FWElUOgotCS8vIFNldCB2YXJpYWJsZXMgZm9yIG5leHQgdGltZS4KLQlwcml2LT5pZWVlODAyMTEtPmJpc19hbnlfbm9uYmVwa3RzID0gZmFsc2U7Ci0JbGFzdFR4T2tDbnQgPSBwcml2LT5zdGF0cy50eGJ5dGVzdW5pY2FzdDsKLQlsYXN0UnhPa0NudCA9IHByaXYtPnN0YXRzLnJ4Ynl0ZXN1bmljYXN0OwotfQotCi1zdGF0aWMgdm9pZCBkbV9pbml0X2N0c3Rvc2VsZihzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQlwcml2LT5pZWVlODAyMTEtPmJDVFNUb1NlbGZFbmFibGUgPSBUUlVFOwotCXByaXYtPmllZWU4MDIxMS0+Q1RTVG9TZWxmVEggPSBDVFNUb1NlbGZUSFZhbDsKLX0KLQotc3RhdGljIHZvaWQgZG1fY3RzdG9zZWxmKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCVBSVF9ISUdIX1RIUk9VR0hQVVQJcEhUSW5mbyA9IHByaXYtPmllZWU4MDIxMS0+cEhUSW5mbzsKLQlzdGF0aWMgdW5zaWduZWQgbG9uZwkJCQlsYXN0VHhPa0NudCA9IDA7Ci0Jc3RhdGljIHVuc2lnbmVkIGxvbmcJCQkJbGFzdFJ4T2tDbnQgPSAwOwotCXVuc2lnbmVkIGxvbmcJCQkJCQljdXJUeE9rQ250ID0gMDsKLQl1bnNpZ25lZCBsb25nCQkJCQkJY3VyUnhPa0NudCA9IDA7Ci0KLQlpZihwcml2LT5pZWVlODAyMTEtPmJDVFNUb1NlbGZFbmFibGUgIT0gVFJVRSkKLQl7Ci0JCXBIVEluZm8tPklPVEFjdGlvbiAmPSB+SFRfSU9UX0FDVF9GT1JDRURfQ1RTMlNFTEY7Ci0JCXJldHVybjsKLQl9Ci0JLyoKLQkxLiBVcGxpbmsKLQkyLiBMaW5rc3lzMzUwL0xpbmtzeXMzMDBOCi0JMy4gPDUwIGRpc2FibGUsID41NSBlbmFibGUKLQkqLwotCi0JaWYocEhUSW5mby0+SU9UUGVlciA9PSBIVF9JT1RfUEVFUl9CUk9BRENPTSkKLQl7Ci0JCWN1clR4T2tDbnQgPSBwcml2LT5zdGF0cy50eGJ5dGVzdW5pY2FzdCAtIGxhc3RUeE9rQ250OwotCQljdXJSeE9rQ250ID0gcHJpdi0+c3RhdHMucnhieXRlc3VuaWNhc3QgLSBsYXN0UnhPa0NudDsKLQkJaWYoY3VyUnhPa0NudCA+IDQqY3VyVHhPa0NudCkJLy9kb3dubGluaywgZGlzYWJsZSBDVFMgdG8gc2VsZgotCQl7Ci0JCQlwSFRJbmZvLT5JT1RBY3Rpb24gJj0gfkhUX0lPVF9BQ1RfRk9SQ0VEX0NUUzJTRUxGOwotCQl9Ci0JCWVsc2UJLy91cGxpbmsKLQkJewotCQkJcEhUSW5mby0+SU9UQWN0aW9uIHw9IEhUX0lPVF9BQ1RfRk9SQ0VEX0NUUzJTRUxGOwotCQl9Ci0KLQkJbGFzdFR4T2tDbnQgPSBwcml2LT5zdGF0cy50eGJ5dGVzdW5pY2FzdDsKLQkJbGFzdFJ4T2tDbnQgPSBwcml2LT5zdGF0cy5yeGJ5dGVzdW5pY2FzdDsKLQl9Ci19Ci0KLQotCi0vKiBDb3B5IDgxODdCIHRlbXBsYXRlIGZvciA5eHNlcmllcyAqLwotc3RhdGljIHZvaWQgZG1fY2hlY2tfcmZjdHJsX2dwaW8oc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0KLQkvLyBXYWxrIGFyb3VuZCBmb3IgRFRNIHRlc3QsIHdlIHdpbGwgbm90IGVuYWJsZSBIVyAtIHJhZGlvIG9uL29mZiBiZWNhdXNlIHIvdwotCS8vIHBhZ2UgMSByZWdpc3RlciBiZWZvcmUgTGV4dHJhIGJ1cyBpcyBlbmFibGVkIGNhdXNlIHN5c3RlbSBmYWlscyB3aGVuIHJlc3VtaW5nCi0JLy8gZnJvbSBTNC4gMjAwODAyMTgsIEVtaWx5Ci0KLQkvLyBTdG9wIHRvIGV4ZWN1dGUgd29ya2l0ZW0gdG8gcHJldmVudCBTMy9TNCBidWcuCi0JcXVldWVfZGVsYXllZF93b3JrKHByaXYtPnByaXZfd3EsJnByaXYtPmdwaW9fY2hhbmdlX3JmX3dxLDApOwotfQotCi0vKiBQQ0kgd2lsbCBub3Qgc3VwcG9ydCB3b3JraXRlbSBjYWxsIGJhY2sgSFcgcmFkaW8gb24tb2ZmIGNvbnRyb2wuICovCi12b2lkIGRtX2dwaW9fY2hhbmdlX3JmX2NhbGxiYWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLHN0cnVjdCBkZWxheWVkX3dvcmssd29yayk7Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YoZHdvcmssc3RydWN0IHI4MTkyX3ByaXYsZ3Bpb19jaGFuZ2VfcmZfd3EpOwotCXU4IHRtcDFieXRlOwotCVJUX1JGX1BPV0VSX1NUQVRFCWVSZlBvd2VyU3RhdGVUb1NldDsKLQlib29sIGJBY3R1YWxseVNldCA9IGZhbHNlOwotCi0JaWYgKCFwcml2LT51cCkgewotCQlSVF9UUkFDRSgoQ09NUF9JTklUIHwgQ09NUF9QT1dFUiB8IENPTVBfUkYpLCJkbV9ncGlvX2NoYW5nZV9yZl9jYWxsYmFjaygpOiBDYWxsYmFjayBmdW5jdGlvbiBicmVha3Mgb3V0ISFcbiIpOwotCX0gZWxzZSB7Ci0JCS8vIDB4MTA4IEdQSU8gaW5wdXQgcmVnaXN0ZXIgaXMgcmVhZCBvbmx5Ci0JCS8vc2V0IDB4MTA4IEIxPSAxOiBSRi1PTjsgMDogUkYtT0ZGLgotCQl0bXAxYnl0ZSA9IHJlYWRfbmljX2J5dGUocHJpdiwgR1BJKTsKLQotCQllUmZQb3dlclN0YXRlVG9TZXQgPSAodG1wMWJ5dGUmQklUMSkgPyAgZVJmT24gOiBlUmZPZmY7Ci0KLQkJaWYgKHByaXYtPmJId1JhZGlvT2ZmICYmIChlUmZQb3dlclN0YXRlVG9TZXQgPT0gZVJmT24pKSB7Ci0JCQlSVF9UUkFDRShDT01QX1JGLCAiZ3Bpb2NoYW5nZVJGICAtIEhXIFJhZGlvIE9OXG4iKTsKLQotCQkJcHJpdi0+Ykh3UmFkaW9PZmYgPSBmYWxzZTsKLQkJCWJBY3R1YWxseVNldCA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoKCFwcml2LT5iSHdSYWRpb09mZikgJiYgKGVSZlBvd2VyU3RhdGVUb1NldCA9PSBlUmZPZmYpKSB7Ci0JCQlSVF9UUkFDRShDT01QX1JGLCAiZ3Bpb2NoYW5nZVJGICAtIEhXIFJhZGlvIE9GRlxuIik7Ci0JCQlwcml2LT5iSHdSYWRpb09mZiA9IHRydWU7Ci0JCQliQWN0dWFsbHlTZXQgPSB0cnVlOwotCQl9Ci0KLQkJaWYgKGJBY3R1YWxseVNldCkgewotCQkJcHJpdi0+Ykh3UmZPZmZBY3Rpb24gPSAxOwotCQkJTWdudEFjdFNldF9SRl9TdGF0ZShwcml2LCBlUmZQb3dlclN0YXRlVG9TZXQsIFJGX0NIQU5HRV9CWV9IVyk7Ci0JCQkvL0RydklGSW5kaWNhdGVDdXJyZW50UGh5U3RhdHVzKHBBZGFwdGVyKTsKLQkJfSBlbHNlIHsKLQkJCW1zbGVlcCgyMDAwKTsKLQkJfQotCX0KLX0KLQotLyogQ2hlY2sgaWYgQ3VycmVudCBSRiBSWCBwYXRoIGlzIGVuYWJsZWQgKi8KLXZvaWQgZG1fcmZfcGF0aGNoZWNrX3dvcmtpdGVtY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0gY29udGFpbmVyX29mKHdvcmssc3RydWN0IGRlbGF5ZWRfd29yayx3b3JrKTsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihkd29yayxzdHJ1Y3QgcjgxOTJfcHJpdixyZnBhdGhfY2hlY2tfd3EpOwotCXU4IHJmcGF0aCA9IDAsIGk7Ci0KLQotCS8qIDIwMDgvMDEvMzAgTUggQWZ0ZXIgZGlzY3Vzc2luZyB3aXRoIFNEMyBKZXJyeSwgMHhjMDQvMHhkMDQgcmVnaXN0ZXIgd2lsbAotCSAgIGFsd2F5cyBiZSB0aGUgc2FtZS4gV2Ugb25seSByZWFkIDB4YzA0IG5vdy4gKi8KLQlyZnBhdGggPSByZWFkX25pY19ieXRlKHByaXYsIDB4YzA0KTsKLQotCS8vIENoZWNrIEJpdCAwLTMsIGl0IG1lYW5zIGlmIFJGIEEtRCBpcyBlbmFibGVkLgotCWZvciAoaSA9IDA7IGkgPCBSRjkwX1BBVEhfTUFYOyBpKyspCi0JewotCQlpZiAocmZwYXRoICYgKDB4MDE8PGkpKQotCQkJcHJpdi0+YnJmcGF0aF9yeGVuYWJsZVtpXSA9IDE7Ci0JCWVsc2UKLQkJCXByaXYtPmJyZnBhdGhfcnhlbmFibGVbaV0gPSAwOwotCX0KLQlpZighRE1fUnhQYXRoU2VsVGFibGUuRW5hYmxlKQotCQlyZXR1cm47Ci0KLQlkbV9yeHBhdGhfc2VsX2J5cnNzaShwcml2KTsKLX0KLQotc3RhdGljIHZvaWQgZG1faW5pdF9yeHBhdGhfc2VsZWN0aW9uKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCXU4IGk7Ci0KLQlETV9SeFBhdGhTZWxUYWJsZS5FbmFibGUgPSAxOwkvL2RlZmF1bHQgZW5hYmxlZAotCURNX1J4UGF0aFNlbFRhYmxlLlNTX1RIX2xvdyA9IFJ4UGF0aFNlbGVjdGlvbl9TU19USF9sb3c7Ci0JRE1fUnhQYXRoU2VsVGFibGUuZGlmZl9USCA9IFJ4UGF0aFNlbGVjdGlvbl9kaWZmX1RIOwotCWlmKHByaXYtPkN1c3RvbWVySUQgPT0gUlRfQ0lEXzgxOXhfTmV0Y29yZSkKLQkJRE1fUnhQYXRoU2VsVGFibGUuY2NrX21ldGhvZCA9IENDS19SeF9WZXJzaW9uXzI7Ci0JZWxzZQotCQlETV9SeFBhdGhTZWxUYWJsZS5jY2tfbWV0aG9kID0gQ0NLX1J4X1ZlcnNpb25fMTsKLQlETV9SeFBhdGhTZWxUYWJsZS5EYmdNb2RlID0gRE1fREJHX09GRjsKLQlETV9SeFBhdGhTZWxUYWJsZS5kaXNhYmxlZFJGID0gMDsKLQlmb3IoaT0wOyBpPDQ7IGkrKykKLQl7Ci0JCURNX1J4UGF0aFNlbFRhYmxlLnJmX3Jzc2lbaV0gPSA1MDsKLQkJRE1fUnhQYXRoU2VsVGFibGUuY2NrX3B3ZGJfc3RhW2ldID0gLTY0OwotCQlETV9SeFBhdGhTZWxUYWJsZS5yZl9lbmFibGVfcnNzaV90aFtpXSA9IDEwMDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGRtX3J4cGF0aF9zZWxfYnlyc3NpKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCXU4CQkJCWksIG1heF9yc3NpX2luZGV4PTAsIG1pbl9yc3NpX2luZGV4PTAsIHNlY19yc3NpX2luZGV4PTAsIHJmX251bT0wOwotCXU4CQkJCXRtcF9tYXhfcnNzaT0wLCB0bXBfbWluX3Jzc2k9MCwgdG1wX3NlY19yc3NpPTA7Ci0JdTgJCQkJY2NrX2RlZmF1bHRfUng9MHgyOwkvL1JGLUMKLQl1OAkJCQljY2tfb3B0aW9uYWxfUng9MHgzOy8vUkYtRAotCWxvbmcJCQkJdG1wX2Nja19tYXhfcHdkYj0wLCB0bXBfY2NrX21pbl9wd2RiPTAsIHRtcF9jY2tfc2VjX3B3ZGI9MDsKLQl1OAkJCQljY2tfcnhfdmVyMl9tYXhfaW5kZXg9MCwgY2NrX3J4X3ZlcjJfbWluX2luZGV4PTAsIGNja19yeF92ZXIyX3NlY19pbmRleD0wOwotCXU4CQkJCWN1cl9yZl9yc3NpOwotCWxvbmcJCQkJY3VyX2Nja19wd2RiOwotCXN0YXRpYyB1OAkJCWRpc2FibGVkX3JmX2NudD0wLCBjY2tfUnhfUGF0aF9pbml0aWFsaXplZD0wOwotCXU4CQkJCXVwZGF0ZV9jY2tfcnhfcGF0aDsKLQotCWlmKHByaXYtPnJmX3R5cGUgIT0gUkZfMlQ0UikKLQkJcmV0dXJuOwotCi0JaWYoIWNja19SeF9QYXRoX2luaXRpYWxpemVkKQotCXsKLQkJRE1fUnhQYXRoU2VsVGFibGUuY2NrX1J4X3BhdGggPSAocmVhZF9uaWNfYnl0ZShwcml2LCAweGEwNykmMHhmKTsKLQkJY2NrX1J4X1BhdGhfaW5pdGlhbGl6ZWQgPSAxOwotCX0KLQotCURNX1J4UGF0aFNlbFRhYmxlLmRpc2FibGVkUkYgPSAweGY7Ci0JRE1fUnhQYXRoU2VsVGFibGUuZGlzYWJsZWRSRiAmPX4gKHJlYWRfbmljX2J5dGUocHJpdiwgMHhjMDQpKTsKLQotCWlmKHByaXYtPmllZWU4MDIxMS0+bW9kZSA9PSBXSVJFTEVTU19NT0RFX0IpCi0JewotCQlETV9SeFBhdGhTZWxUYWJsZS5jY2tfbWV0aG9kID0gQ0NLX1J4X1ZlcnNpb25fMjsJLy9wdXJlIEIgbW9kZSwgZml4ZWQgY2NrIHZlcnNpb24yCi0JfQotCi0JLy9kZWNpZGUgbWF4L3NlYy9taW4gcnNzaSBpbmRleAotCWZvciAoaT0wOyBpPFJGOTBfUEFUSF9NQVg7IGkrKykKLQl7Ci0JCWlmKCFETV9SeFBhdGhTZWxUYWJsZS5EYmdNb2RlKQotCQkJRE1fUnhQYXRoU2VsVGFibGUucmZfcnNzaVtpXSA9IHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtpXTsKLQotCQlpZihwcml2LT5icmZwYXRoX3J4ZW5hYmxlW2ldKQotCQl7Ci0JCQlyZl9udW0rKzsKLQkJCWN1cl9yZl9yc3NpID0gRE1fUnhQYXRoU2VsVGFibGUucmZfcnNzaVtpXTsKLQotCQkJaWYocmZfbnVtID09IDEpCS8vIGZpbmQgZmlyc3QgZW5hYmxlZCByZiBwYXRoIGFuZCB0aGUgcnNzaSB2YWx1ZXMKLQkJCXsJLy9pbml0aWFsaXplLCBzZXQgYWxsIHJzc2kgaW5kZXggdG8gdGhlIHNhbWUgb25lCi0JCQkJbWF4X3Jzc2lfaW5kZXggPSBtaW5fcnNzaV9pbmRleCA9IHNlY19yc3NpX2luZGV4ID0gaTsKLQkJCQl0bXBfbWF4X3Jzc2kgPSB0bXBfbWluX3Jzc2kgPSB0bXBfc2VjX3Jzc2kgPSBjdXJfcmZfcnNzaTsKLQkJCX0KLQkJCWVsc2UgaWYocmZfbnVtID09IDIpCi0JCQl7CS8vIHdlIHBpY2sgdXAgdGhlIG1heCBpbmRleCBmaXJzdCwgYW5kIGxldCBzZWMgYW5kIG1pbiB0byBiZSB0aGUgc2FtZSBvbmUKLQkJCQlpZihjdXJfcmZfcnNzaSA+PSB0bXBfbWF4X3Jzc2kpCi0JCQkJewotCQkJCQl0bXBfbWF4X3Jzc2kgPSBjdXJfcmZfcnNzaTsKLQkJCQkJbWF4X3Jzc2lfaW5kZXggPSBpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQl0bXBfc2VjX3Jzc2kgPSB0bXBfbWluX3Jzc2kgPSBjdXJfcmZfcnNzaTsKLQkJCQkJc2VjX3Jzc2lfaW5kZXggPSBtaW5fcnNzaV9pbmRleCA9IGk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmKGN1cl9yZl9yc3NpID4gdG1wX21heF9yc3NpKQotCQkJCXsKLQkJCQkJdG1wX3NlY19yc3NpID0gdG1wX21heF9yc3NpOwotCQkJCQlzZWNfcnNzaV9pbmRleCA9IG1heF9yc3NpX2luZGV4OwotCQkJCQl0bXBfbWF4X3Jzc2kgPSBjdXJfcmZfcnNzaTsKLQkJCQkJbWF4X3Jzc2lfaW5kZXggPSBpOwotCQkJCX0KLQkJCQllbHNlIGlmKGN1cl9yZl9yc3NpID09IHRtcF9tYXhfcnNzaSkKLQkJCQl7CS8vIGxldCBzZWMgYW5kIG1pbiBwb2ludCB0byB0aGUgZGlmZmVyZW50IGluZGV4Ci0JCQkJCXRtcF9zZWNfcnNzaSA9IGN1cl9yZl9yc3NpOwotCQkJCQlzZWNfcnNzaV9pbmRleCA9IGk7Ci0JCQkJfQotCQkJCWVsc2UgaWYoKGN1cl9yZl9yc3NpIDwgdG1wX21heF9yc3NpKSAmJihjdXJfcmZfcnNzaSA+IHRtcF9zZWNfcnNzaSkpCi0JCQkJewotCQkJCQl0bXBfc2VjX3Jzc2kgPSBjdXJfcmZfcnNzaTsKLQkJCQkJc2VjX3Jzc2lfaW5kZXggPSBpOwotCQkJCX0KLQkJCQllbHNlIGlmKGN1cl9yZl9yc3NpID09IHRtcF9zZWNfcnNzaSkKLQkJCQl7Ci0JCQkJCWlmKHRtcF9zZWNfcnNzaSA9PSB0bXBfbWluX3Jzc2kpCi0JCQkJCXsJLy8gbGV0IHNlYyBhbmQgbWluIHBvaW50IHRvIHRoZSBkaWZmZXJlbnQgaW5kZXgKLQkJCQkJCXRtcF9zZWNfcnNzaSA9IGN1cl9yZl9yc3NpOwotCQkJCQkJc2VjX3Jzc2lfaW5kZXggPSBpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJLy8gVGhpcyBjYXNlIHdlIGRvbid0IG5lZWQgdG8gc2V0IGFueSBpbmRleAotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYoKGN1cl9yZl9yc3NpIDwgdG1wX3NlY19yc3NpKSAmJiAoY3VyX3JmX3Jzc2kgPiB0bXBfbWluX3Jzc2kpKQotCQkJCXsKLQkJCQkJLy8gVGhpcyBjYXNlIHdlIGRvbid0IG5lZWQgdG8gc2V0IGFueSBpbmRleAotCQkJCX0KLQkJCQllbHNlIGlmKGN1cl9yZl9yc3NpID09IHRtcF9taW5fcnNzaSkKLQkJCQl7Ci0JCQkJCWlmKHRtcF9zZWNfcnNzaSA9PSB0bXBfbWluX3Jzc2kpCi0JCQkJCXsJLy8gbGV0IHNlYyBhbmQgbWluIHBvaW50IHRvIHRoZSBkaWZmZXJlbnQgaW5kZXgKLQkJCQkJCXRtcF9taW5fcnNzaSA9IGN1cl9yZl9yc3NpOwotCQkJCQkJbWluX3Jzc2lfaW5kZXggPSBpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJLy8gVGhpcyBjYXNlIHdlIGRvbid0IG5lZWQgdG8gc2V0IGFueSBpbmRleAotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYoY3VyX3JmX3Jzc2kgPCB0bXBfbWluX3Jzc2kpCi0JCQkJewotCQkJCQl0bXBfbWluX3Jzc2kgPSBjdXJfcmZfcnNzaTsKLQkJCQkJbWluX3Jzc2lfaW5kZXggPSBpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXJmX251bSA9IDA7Ci0JLy8gZGVjaWRlIG1heC9zZWMvbWluIGNjayBwd2RiIGluZGV4Ci0JaWYoRE1fUnhQYXRoU2VsVGFibGUuY2NrX21ldGhvZCA9PSBDQ0tfUnhfVmVyc2lvbl8yKQotCXsKLQkJZm9yIChpPTA7IGk8UkY5MF9QQVRIX01BWDsgaSsrKQotCQl7Ci0JCQlpZihwcml2LT5icmZwYXRoX3J4ZW5hYmxlW2ldKQotCQkJewotCQkJCXJmX251bSsrOwotCQkJCWN1cl9jY2tfcHdkYiA9ICBETV9SeFBhdGhTZWxUYWJsZS5jY2tfcHdkYl9zdGFbaV07Ci0KLQkJCQlpZihyZl9udW0gPT0gMSkJLy8gZmluZCBmaXJzdCBlbmFibGVkIHJmIHBhdGggYW5kIHRoZSByc3NpIHZhbHVlcwotCQkJCXsJLy9pbml0aWFsaXplLCBzZXQgYWxsIHJzc2kgaW5kZXggdG8gdGhlIHNhbWUgb25lCi0JCQkJCWNja19yeF92ZXIyX21heF9pbmRleCA9IGNja19yeF92ZXIyX21pbl9pbmRleCA9IGNja19yeF92ZXIyX3NlY19pbmRleCA9IGk7Ci0JCQkJCXRtcF9jY2tfbWF4X3B3ZGIgPSB0bXBfY2NrX21pbl9wd2RiID0gdG1wX2Nja19zZWNfcHdkYiA9IGN1cl9jY2tfcHdkYjsKLQkJCQl9Ci0JCQkJZWxzZSBpZihyZl9udW0gPT0gMikKLQkJCQl7CS8vIHdlIHBpY2sgdXAgdGhlIG1heCBpbmRleCBmaXJzdCwgYW5kIGxldCBzZWMgYW5kIG1pbiB0byBiZSB0aGUgc2FtZSBvbmUKLQkJCQkJaWYoY3VyX2Nja19wd2RiID49IHRtcF9jY2tfbWF4X3B3ZGIpCi0JCQkJCXsKLQkJCQkJCXRtcF9jY2tfbWF4X3B3ZGIgPSBjdXJfY2NrX3B3ZGI7Ci0JCQkJCQljY2tfcnhfdmVyMl9tYXhfaW5kZXggPSBpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJdG1wX2Nja19zZWNfcHdkYiA9IHRtcF9jY2tfbWluX3B3ZGIgPSBjdXJfY2NrX3B3ZGI7Ci0JCQkJCQljY2tfcnhfdmVyMl9zZWNfaW5kZXggPSBjY2tfcnhfdmVyMl9taW5faW5kZXggPSBpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWlmKGN1cl9jY2tfcHdkYiA+IHRtcF9jY2tfbWF4X3B3ZGIpCi0JCQkJCXsKLQkJCQkJCXRtcF9jY2tfc2VjX3B3ZGIgPSB0bXBfY2NrX21heF9wd2RiOwotCQkJCQkJY2NrX3J4X3ZlcjJfc2VjX2luZGV4ID0gY2NrX3J4X3ZlcjJfbWF4X2luZGV4OwotCQkJCQkJdG1wX2Nja19tYXhfcHdkYiA9IGN1cl9jY2tfcHdkYjsKLQkJCQkJCWNja19yeF92ZXIyX21heF9pbmRleCA9IGk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZihjdXJfY2NrX3B3ZGIgPT0gdG1wX2Nja19tYXhfcHdkYikKLQkJCQkJewkvLyBsZXQgc2VjIGFuZCBtaW4gcG9pbnQgdG8gdGhlIGRpZmZlcmVudCBpbmRleAotCQkJCQkJdG1wX2Nja19zZWNfcHdkYiA9IGN1cl9jY2tfcHdkYjsKLQkJCQkJCWNja19yeF92ZXIyX3NlY19pbmRleCA9IGk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZigoY3VyX2Nja19wd2RiIDwgdG1wX2Nja19tYXhfcHdkYikgJiYoY3VyX2Nja19wd2RiID4gdG1wX2Nja19zZWNfcHdkYikpCi0JCQkJCXsKLQkJCQkJCXRtcF9jY2tfc2VjX3B3ZGIgPSBjdXJfY2NrX3B3ZGI7Ci0JCQkJCQljY2tfcnhfdmVyMl9zZWNfaW5kZXggPSBpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYoY3VyX2Nja19wd2RiID09IHRtcF9jY2tfc2VjX3B3ZGIpCi0JCQkJCXsKLQkJCQkJCWlmKHRtcF9jY2tfc2VjX3B3ZGIgPT0gdG1wX2Nja19taW5fcHdkYikKLQkJCQkJCXsJLy8gbGV0IHNlYyBhbmQgbWluIHBvaW50IHRvIHRoZSBkaWZmZXJlbnQgaW5kZXgKLQkJCQkJCQl0bXBfY2NrX3NlY19wd2RiID0gY3VyX2Nja19wd2RiOwotCQkJCQkJCWNja19yeF92ZXIyX3NlY19pbmRleCA9IGk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJLy8gVGhpcyBjYXNlIHdlIGRvbid0IG5lZWQgdG8gc2V0IGFueSBpbmRleAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYoKGN1cl9jY2tfcHdkYiA8IHRtcF9jY2tfc2VjX3B3ZGIpICYmIChjdXJfY2NrX3B3ZGIgPiB0bXBfY2NrX21pbl9wd2RiKSkKLQkJCQkJewotCQkJCQkJLy8gVGhpcyBjYXNlIHdlIGRvbid0IG5lZWQgdG8gc2V0IGFueSBpbmRleAotCQkJCQl9Ci0JCQkJCWVsc2UgaWYoY3VyX2Nja19wd2RiID09IHRtcF9jY2tfbWluX3B3ZGIpCi0JCQkJCXsKLQkJCQkJCWlmKHRtcF9jY2tfc2VjX3B3ZGIgPT0gdG1wX2Nja19taW5fcHdkYikKLQkJCQkJCXsJLy8gbGV0IHNlYyBhbmQgbWluIHBvaW50IHRvIHRoZSBkaWZmZXJlbnQgaW5kZXgKLQkJCQkJCQl0bXBfY2NrX21pbl9wd2RiID0gY3VyX2Nja19wd2RiOwotCQkJCQkJCWNja19yeF92ZXIyX21pbl9pbmRleCA9IGk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJLy8gVGhpcyBjYXNlIHdlIGRvbid0IG5lZWQgdG8gc2V0IGFueSBpbmRleAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYoY3VyX2Nja19wd2RiIDwgdG1wX2Nja19taW5fcHdkYikKLQkJCQkJewotCQkJCQkJdG1wX2Nja19taW5fcHdkYiA9IGN1cl9jY2tfcHdkYjsKLQkJCQkJCWNja19yeF92ZXIyX21pbl9pbmRleCA9IGk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gU2V0IENDSyBSeCBwYXRoCi0JLy8gcmVnMHhBMDdbMzoyXT1jY2sgZGVmYXVsdCByeCBwYXRoLCByZWcweGEwN1sxOjBdPWNjayBvcHRpb25hbCByeCBwYXRoLgotCXVwZGF0ZV9jY2tfcnhfcGF0aCA9IDA7Ci0JaWYoRE1fUnhQYXRoU2VsVGFibGUuY2NrX21ldGhvZCA9PSBDQ0tfUnhfVmVyc2lvbl8yKQotCXsKLQkJY2NrX2RlZmF1bHRfUnggPSBjY2tfcnhfdmVyMl9tYXhfaW5kZXg7Ci0JCWNja19vcHRpb25hbF9SeCA9IGNja19yeF92ZXIyX3NlY19pbmRleDsKLQkJaWYodG1wX2Nja19tYXhfcHdkYiAhPSAtNjQpCi0JCQl1cGRhdGVfY2NrX3J4X3BhdGggPSAxOwotCX0KLQotCWlmKHRtcF9taW5fcnNzaSA8IERNX1J4UGF0aFNlbFRhYmxlLlNTX1RIX2xvdyAmJiBkaXNhYmxlZF9yZl9jbnQgPCAyKQotCXsKLQkJaWYoKHRtcF9tYXhfcnNzaSAtIHRtcF9taW5fcnNzaSkgPj0gRE1fUnhQYXRoU2VsVGFibGUuZGlmZl9USCkKLQkJewotCQkJLy9yZWNvcmQgdGhlIGVuYWJsZWQgcnNzaSB0aHJlc2hvbGQKLQkJCURNX1J4UGF0aFNlbFRhYmxlLnJmX2VuYWJsZV9yc3NpX3RoW21pbl9yc3NpX2luZGV4XSA9IHRtcF9tYXhfcnNzaSs1OwotCQkJLy9kaXNhYmxlIHRoZSBCQiBSeCBwYXRoLCBPRkRNCi0JCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJPRkRNMF9UUnhQYXRoRW5hYmxlLCAweDE8PG1pbl9yc3NpX2luZGV4LCAweDApOwkvLyAweGMwNFszOjBdCi0JCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJPRkRNMV9UUnhQYXRoRW5hYmxlLCAweDE8PG1pbl9yc3NpX2luZGV4LCAweDApOwkvLyAweGQwNFszOjBdCi0JCQlkaXNhYmxlZF9yZl9jbnQrKzsKLQkJfQotCQlpZihETV9SeFBhdGhTZWxUYWJsZS5jY2tfbWV0aG9kID09IENDS19SeF9WZXJzaW9uXzEpCi0JCXsKLQkJCWNja19kZWZhdWx0X1J4ID0gbWF4X3Jzc2lfaW5kZXg7Ci0JCQljY2tfb3B0aW9uYWxfUnggPSBzZWNfcnNzaV9pbmRleDsKLQkJCWlmKHRtcF9tYXhfcnNzaSkKLQkJCQl1cGRhdGVfY2NrX3J4X3BhdGggPSAxOwotCQl9Ci0JfQotCi0JaWYodXBkYXRlX2Nja19yeF9wYXRoKQotCXsKLQkJRE1fUnhQYXRoU2VsVGFibGUuY2NrX1J4X3BhdGggPSAoY2NrX2RlZmF1bHRfUng8PDIpfChjY2tfb3B0aW9uYWxfUngpOwotCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJDQ0swX0FGRVNldHRpbmcsIDB4MGYwMDAwMDAsIERNX1J4UGF0aFNlbFRhYmxlLmNja19SeF9wYXRoKTsKLQl9Ci0KLQlpZihETV9SeFBhdGhTZWxUYWJsZS5kaXNhYmxlZFJGKQotCXsKLQkJZm9yKGk9MDsgaTw0OyBpKyspCi0JCXsKLQkJCWlmKChETV9SeFBhdGhTZWxUYWJsZS5kaXNhYmxlZFJGPj5pKSAmIDB4MSkJLy9kaXNhYmxlZCByZgotCQkJewotCQkJCWlmKHRtcF9tYXhfcnNzaSA+PSBETV9SeFBhdGhTZWxUYWJsZS5yZl9lbmFibGVfcnNzaV90aFtpXSkKLQkJCQl7Ci0JCQkJCS8vZW5hYmxlIHRoZSBCQiBSeCBwYXRoCi0JCQkJCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgck9GRE0wX1RSeFBhdGhFbmFibGUsIDB4MTw8aSwgMHgxKTsJLy8gMHhjMDRbMzowXQotCQkJCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJPRkRNMV9UUnhQYXRoRW5hYmxlLCAweDE8PGksIDB4MSk7CS8vIDB4ZDA0WzM6MF0KLQkJCQkJRE1fUnhQYXRoU2VsVGFibGUucmZfZW5hYmxlX3Jzc2lfdGhbaV0gPSAxMDA7Ci0JCQkJCWRpc2FibGVkX3JmX2NudC0tOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KLQotLyoKLSAqIENhbGwgYSB3b3JraXRlbSB0byBjaGVjayBjdXJyZW50IFJYUkYgcGF0aCBhbmQgUnggUGF0aCBzZWxlY3Rpb24gYnkgUlNTSS4KLSAqLwotc3RhdGljIHZvaWQgZG1fY2hlY2tfcnhfcGF0aF9zZWxlY3Rpb24oc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0JcXVldWVfZGVsYXllZF93b3JrKHByaXYtPnByaXZfd3EsJnByaXYtPnJmcGF0aF9jaGVja193cSwwKTsKLX0KLQotc3RhdGljIHZvaWQgZG1faW5pdF9mc3luYyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQlwcml2LT5pZWVlODAyMTEtPmZzeW5jX3RpbWVfaW50ZXJ2YWwgPSA1MDA7Ci0JcHJpdi0+aWVlZTgwMjExLT5mc3luY19yYXRlX2JpdG1hcCA9IDB4MGYwMDA4MDA7Ci0JcHJpdi0+aWVlZTgwMjExLT5mc3luY19yc3NpX3RocmVzaG9sZCA9IDMwOwotCXByaXYtPmllZWU4MDIxMS0+YmZzeW5jX2VuYWJsZSA9IGZhbHNlOwotCXByaXYtPmllZWU4MDIxMS0+ZnN5bmNfbXVsdGlwbGVfdGltZWludGVydmFsID0gMzsKLQlwcml2LT5pZWVlODAyMTEtPmZzeW5jX2ZpcnN0ZGlmZl9yYXRldGhyZXNob2xkPSAxMDA7Ci0JcHJpdi0+aWVlZTgwMjExLT5mc3luY19zZWNvbmRkaWZmX3JhdGV0aHJlc2hvbGQ9IDIwMDsKLQlwcml2LT5pZWVlODAyMTEtPmZzeW5jX3N0YXRlID0gRGVmYXVsdF9Gc3luYzsKLQlwcml2LT5mcmFtZXN5bmNNb25pdG9yID0gMTsJLy8gY3VycmVudCBkZWZhdWx0IDB4YzM4IG1vbml0b3Igb24KLQotCWluaXRfdGltZXIoJnByaXYtPmZzeW5jX3RpbWVyKTsKLQlwcml2LT5mc3luY190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcHJpdjsKLQlwcml2LT5mc3luY190aW1lci5mdW5jdGlvbiA9IGRtX2ZzeW5jX3RpbWVyX2NhbGxiYWNrOwotfQotCi0KLXN0YXRpYyB2b2lkIGRtX2RlSW5pdF9mc3luYyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQlkZWxfdGltZXJfc3luYygmcHJpdi0+ZnN5bmNfdGltZXIpOwotfQotCi1zdGF0aWMgdm9pZCBkbV9mc3luY190aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilkYXRhOwotCXUzMiByYXRlX2luZGV4LCByYXRlX2NvdW50ID0gMCwgcmF0ZV9jb3VudF9kaWZmPTA7Ci0JYm9vbAkJYlN3aXRjaEZyb21Db3VudERpZmYgPSBmYWxzZTsKLQlib29sCQliRG91YmxlVGltZUludGVydmFsID0gZmFsc2U7Ci0KLQlpZigJcHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEICYmCi0JCXByaXYtPmllZWU4MDIxMS0+YmZzeW5jX2VuYWJsZSAmJgotCQkocHJpdi0+aWVlZTgwMjExLT5wSFRJbmZvLT5JT1RBY3Rpb24gJiBIVF9JT1RfQUNUX0NERF9GU1lOQykpCi0JewotCQkgLy8gQ291bnQgcmF0ZSA1NCwgTUNTIFs3XSwgWzEyLCAxMywgMTQsIDE1XQotCQl1MzIgcmF0ZV9iaXRtYXA7Ci0JCWZvcihyYXRlX2luZGV4ID0gMDsgcmF0ZV9pbmRleCA8PSAyNzsgcmF0ZV9pbmRleCsrKQotCQl7Ci0JCQlyYXRlX2JpdG1hcCAgPSAxIDw8IHJhdGVfaW5kZXg7Ci0JCQlpZihwcml2LT5pZWVlODAyMTEtPmZzeW5jX3JhdGVfYml0bWFwICYgIHJhdGVfYml0bWFwKQotCQkgCQlyYXRlX2NvdW50Kz0gcHJpdi0+c3RhdHMucmVjZWl2ZWRfcmF0ZV9oaXN0b2dyYW1bMV1bcmF0ZV9pbmRleF07Ci0JCX0KLQotCQlpZihyYXRlX2NvdW50IDwgcHJpdi0+cmF0ZV9yZWNvcmQpCi0JCQlyYXRlX2NvdW50X2RpZmYgPSAweGZmZmZmZmZmIC0gcmF0ZV9jb3VudCArIHByaXYtPnJhdGVfcmVjb3JkOwotCQllbHNlCi0JCQlyYXRlX2NvdW50X2RpZmYgPSByYXRlX2NvdW50IC0gcHJpdi0+cmF0ZV9yZWNvcmQ7Ci0JCWlmKHJhdGVfY291bnRfZGlmZiA8IHByaXYtPnJhdGVDb3VudERpZmZSZWNvcmQpCi0JCXsKLQotCQkJdTMyIERpZmZOdW0gPSBwcml2LT5yYXRlQ291bnREaWZmUmVjb3JkIC0gcmF0ZV9jb3VudF9kaWZmOwotCQkJLy8gQ29udGl1bmUgY291bnQKLQkJCWlmKERpZmZOdW0gPj0gcHJpdi0+aWVlZTgwMjExLT5mc3luY19zZWNvbmRkaWZmX3JhdGV0aHJlc2hvbGQpCi0JCQkJcHJpdi0+Q29udGl1bmVEaWZmQ291bnQrKzsKLQkJCWVsc2UKLQkJCQlwcml2LT5Db250aXVuZURpZmZDb3VudCA9IDA7Ci0KLQkJCS8vIENvbnRpdW5lIGNvdW50IG92ZXIKLQkJCWlmKHByaXYtPkNvbnRpdW5lRGlmZkNvdW50ID49MikKLQkJCXsKLQkJCQliU3dpdGNoRnJvbUNvdW50RGlmZiA9IHRydWU7Ci0JCQkJcHJpdi0+Q29udGl1bmVEaWZmQ291bnQgPSAwOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gU3RvcCBjb250aXVuZSBjb3VudAotCQkJcHJpdi0+Q29udGl1bmVEaWZmQ291bnQgPSAwOwotCQl9Ci0KLQkJLy9JZiBDb3VudCBkaWZmIDw9IEZzeW5jUmF0ZUNvdW50VGhyZXNob2xkCi0JCWlmKHJhdGVfY291bnRfZGlmZiA8PSBwcml2LT5pZWVlODAyMTEtPmZzeW5jX2ZpcnN0ZGlmZl9yYXRldGhyZXNob2xkKQotCQl7Ci0JCQliU3dpdGNoRnJvbUNvdW50RGlmZiA9IHRydWU7Ci0JCQlwcml2LT5Db250aXVuZURpZmZDb3VudCA9IDA7Ci0JCX0KLQkJcHJpdi0+cmF0ZV9yZWNvcmQgPSByYXRlX2NvdW50OwotCQlwcml2LT5yYXRlQ291bnREaWZmUmVjb3JkID0gcmF0ZV9jb3VudF9kaWZmOwotCQlSVF9UUkFDRShDT01QX0hBTERNLCAicmF0ZVJlY29yZCAlZCByYXRlQ291bnQgJWQsIHJhdGVDb3VudGRpZmYgJWQgYlN3aXRjaEZzeW5jICVkXG4iLCBwcml2LT5yYXRlX3JlY29yZCwgcmF0ZV9jb3VudCwgcmF0ZV9jb3VudF9kaWZmICwgcHJpdi0+YnN3aXRjaF9mc3luYyk7Ci0JCS8vIGlmIHdlIG5ldmVyIHJlY2VpdmUgdGhvc2UgbWNzIHJhdGUgYW5kIHJzc2kgPiAzMCAlIHRoZW4gc3dpdGNoIGZzeW4KLQkJaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+IHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfcnNzaV90aHJlc2hvbGQgJiYgYlN3aXRjaEZyb21Db3VudERpZmYpCi0JCXsKLQkJCWJEb3VibGVUaW1lSW50ZXJ2YWwgPSB0cnVlOwotCQkJcHJpdi0+YnN3aXRjaF9mc3luYyA9ICFwcml2LT5ic3dpdGNoX2ZzeW5jOwotCQkJaWYocHJpdi0+YnN3aXRjaF9mc3luYykKLQkJCXsKLQkJCQl3cml0ZV9uaWNfYnl0ZShwcml2LDB4QzM2LCAweDFjKTsKLQkJCQl3cml0ZV9uaWNfYnl0ZShwcml2LCAweEMzZSwgMHg5MCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJd3JpdGVfbmljX2J5dGUocHJpdiwgMHhDMzYsIDB4NWMpOwotCQkJCXdyaXRlX25pY19ieXRlKHByaXYsIDB4QzNlLCAweDk2KTsKLQkJCX0KLQkJfQotCQllbHNlIGlmKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPD0gcHJpdi0+aWVlZTgwMjExLT5mc3luY19yc3NpX3RocmVzaG9sZCkKLQkJewotCQkJaWYocHJpdi0+YnN3aXRjaF9mc3luYykKLQkJCXsKLQkJCQlwcml2LT5ic3dpdGNoX2ZzeW5jICA9IGZhbHNlOwotCQkJCXdyaXRlX25pY19ieXRlKHByaXYsIDB4QzM2LCAweDVjKTsKLQkJCQl3cml0ZV9uaWNfYnl0ZShwcml2LCAweEMzZSwgMHg5Nik7Ci0JCQl9Ci0JCX0KLQkJaWYoYkRvdWJsZVRpbWVJbnRlcnZhbCl7Ci0JCQlpZih0aW1lcl9wZW5kaW5nKCZwcml2LT5mc3luY190aW1lcikpCi0JCQkJZGVsX3RpbWVyX3N5bmMoJnByaXYtPmZzeW5jX3RpbWVyKTsKLQkJCXByaXYtPmZzeW5jX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgTVNFQ1MocHJpdi0+aWVlZTgwMjExLT5mc3luY190aW1lX2ludGVydmFsKnByaXYtPmllZWU4MDIxMS0+ZnN5bmNfbXVsdGlwbGVfdGltZWludGVydmFsKTsKLQkJCWFkZF90aW1lcigmcHJpdi0+ZnN5bmNfdGltZXIpOwotCQl9Ci0JCWVsc2V7Ci0JCQlpZih0aW1lcl9wZW5kaW5nKCZwcml2LT5mc3luY190aW1lcikpCi0JCQkJZGVsX3RpbWVyX3N5bmMoJnByaXYtPmZzeW5jX3RpbWVyKTsKLQkJCXByaXYtPmZzeW5jX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgTVNFQ1MocHJpdi0+aWVlZTgwMjExLT5mc3luY190aW1lX2ludGVydmFsKTsKLQkJCWFkZF90aW1lcigmcHJpdi0+ZnN5bmNfdGltZXIpOwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCS8vIExldCBSZWdpc3RlciByZXR1cm4gdG8gZGVmYXVsdCB2YWx1ZTsKLQkJaWYocHJpdi0+YnN3aXRjaF9mc3luYykKLQkJewotCQkJcHJpdi0+YnN3aXRjaF9mc3luYyAgPSBmYWxzZTsKLQkJCXdyaXRlX25pY19ieXRlKHByaXYsIDB4QzM2LCAweDVjKTsKLQkJCXdyaXRlX25pY19ieXRlKHByaXYsIDB4QzNlLCAweDk2KTsKLQkJfQotCQlwcml2LT5Db250aXVuZURpZmZDb3VudCA9IDA7Ci0JCXdyaXRlX25pY19kd29yZChwcml2LCByT0ZETTBfUnhEZXRlY3RvcjIsIDB4NDY1YzUyY2QpOwotCX0KLQlSVF9UUkFDRShDT01QX0hBTERNLCAiQ29udGl1bmVEaWZmQ291bnQgJWRcbiIsIHByaXYtPkNvbnRpdW5lRGlmZkNvdW50KTsKLQlSVF9UUkFDRShDT01QX0hBTERNLCAicmF0ZVJlY29yZCAlZCByYXRlQ291bnQgJWQsIHJhdGVDb3VudGRpZmYgJWQgYlN3aXRjaEZzeW5jICVkXG4iLCBwcml2LT5yYXRlX3JlY29yZCwgcmF0ZV9jb3VudCwgcmF0ZV9jb3VudF9kaWZmICwgcHJpdi0+YnN3aXRjaF9mc3luYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtX1N0YXJ0SFdGc3luYyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQlSVF9UUkFDRShDT01QX0hBTERNLCAiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0Jd3JpdGVfbmljX2R3b3JkKHByaXYsIHJPRkRNMF9SeERldGVjdG9yMiwgMHg0NjVjMTJjZik7Ci0Jd3JpdGVfbmljX2J5dGUocHJpdiwgMHhjM2IsIDB4NDEpOwotfQotCi1zdGF0aWMgdm9pZCBkbV9FbmRTV0ZzeW5jKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCVJUX1RSQUNFKENPTVBfSEFMRE0sICIlc1xuIiwgX19GVU5DVElPTl9fKTsKLQlkZWxfdGltZXJfc3luYygmKHByaXYtPmZzeW5jX3RpbWVyKSk7Ci0KLQkvLyBMZXQgUmVnaXN0ZXIgcmV0dXJuIHRvIGRlZmF1bHQgdmFsdWU7Ci0JaWYocHJpdi0+YnN3aXRjaF9mc3luYykKLQl7Ci0JCXByaXYtPmJzd2l0Y2hfZnN5bmMgID0gZmFsc2U7Ci0KLQkJd3JpdGVfbmljX2J5dGUocHJpdiwgMHhDMzYsIDB4NDApOwotCi0JCXdyaXRlX25pY19ieXRlKHByaXYsIDB4QzNlLCAweDk2KTsKLQl9Ci0KLQlwcml2LT5Db250aXVuZURpZmZDb3VudCA9IDA7Ci0KLQl3cml0ZV9uaWNfZHdvcmQocHJpdiwgck9GRE0wX1J4RGV0ZWN0b3IyLCAweDQ2NWM1MmNkKTsKLX0KLQotc3RhdGljIHZvaWQgZG1fU3RhcnRTV0ZzeW5jKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCXUzMiAJCQlyYXRlSW5kZXg7Ci0JdTMyIAkJCXJhdGVCaXRtYXA7Ci0KLQlSVF9UUkFDRShDT01QX0hBTERNLCIlc1xuIiwgX19GVU5DVElPTl9fKTsKLQkvLyBJbml0aWFsIHJhdGUgcmVjb3JkIHRvIHplcm8sIHN0YXJ0IHRvIHJlY29yZC4KLQlwcml2LT5yYXRlX3JlY29yZCA9IDA7Ci0JLy8gSW5pdGlhbCBjb250aXVuZSBkaWZmIGNvdW50IHRvIHplcm8sIHN0YXJ0IHRvIHJlY29yZC4KLQlwcml2LT5Db250aXVuZURpZmZDb3VudCA9IDA7Ci0JcHJpdi0+cmF0ZUNvdW50RGlmZlJlY29yZCA9IDA7Ci0JcHJpdi0+YnN3aXRjaF9mc3luYyAgPSBmYWxzZTsKLQotCWlmKHByaXYtPmllZWU4MDIxMS0+bW9kZSA9PSBXSVJFTEVTU19NT0RFX05fMjRHKQotCXsKLQkJcHJpdi0+aWVlZTgwMjExLT5mc3luY19maXJzdGRpZmZfcmF0ZXRocmVzaG9sZD0gNjAwOwotCQlwcml2LT5pZWVlODAyMTEtPmZzeW5jX3NlY29uZGRpZmZfcmF0ZXRocmVzaG9sZCA9IDB4ZmZmZjsKLQl9Ci0JZWxzZQotCXsKLQkJcHJpdi0+aWVlZTgwMjExLT5mc3luY19maXJzdGRpZmZfcmF0ZXRocmVzaG9sZD0gMjAwOwotCQlwcml2LT5pZWVlODAyMTEtPmZzeW5jX3NlY29uZGRpZmZfcmF0ZXRocmVzaG9sZCA9IDIwMDsKLQl9Ci0JZm9yKHJhdGVJbmRleCA9IDA7IHJhdGVJbmRleCA8PSAyNzsgcmF0ZUluZGV4KyspCi0JewotCQlyYXRlQml0bWFwICA9IDEgPDwgcmF0ZUluZGV4OwotCQlpZihwcml2LT5pZWVlODAyMTEtPmZzeW5jX3JhdGVfYml0bWFwICYgIHJhdGVCaXRtYXApCi0JCQlwcml2LT5yYXRlX3JlY29yZCArPSBwcml2LT5zdGF0cy5yZWNlaXZlZF9yYXRlX2hpc3RvZ3JhbVsxXVtyYXRlSW5kZXhdOwotCX0KLQlpZih0aW1lcl9wZW5kaW5nKCZwcml2LT5mc3luY190aW1lcikpCi0JCWRlbF90aW1lcl9zeW5jKCZwcml2LT5mc3luY190aW1lcik7Ci0JcHJpdi0+ZnN5bmNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBNU0VDUyhwcml2LT5pZWVlODAyMTEtPmZzeW5jX3RpbWVfaW50ZXJ2YWwpOwotCWFkZF90aW1lcigmcHJpdi0+ZnN5bmNfdGltZXIpOwotCi0Jd3JpdGVfbmljX2R3b3JkKHByaXYsIHJPRkRNMF9SeERldGVjdG9yMiwgMHg0NjVjMTJjZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtX0VuZEhXRnN5bmMoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0JUlRfVFJBQ0UoQ09NUF9IQUxETSwiJXNcbiIsIF9fRlVOQ1RJT05fXyk7Ci0Jd3JpdGVfbmljX2R3b3JkKHByaXYsIHJPRkRNMF9SeERldGVjdG9yMiwgMHg0NjVjNTJjZCk7Ci0Jd3JpdGVfbmljX2J5dGUocHJpdiwgMHhjM2IsIDB4NDkpOwotfQotCi1zdGF0aWMgdm9pZCBkbV9jaGVja19mc3luYyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLSNkZWZpbmUJUmVnQzM4X0RlZmF1bHQJCQkJMAotI2RlZmluZQlSZWdDMzhfTm9uRnN5bmNfT3RoZXJfQVAJMQotI2RlZmluZQlSZWdDMzhfRnN5bmNfQVBfQkNNCQkyCi0JLy91MzIgCQkJZnJhbWVzeW5jQzM0OwotCXN0YXRpYyB1OAkJcmVnX2MzOF9TdGF0ZT1SZWdDMzhfRGVmYXVsdDsKLQlzdGF0aWMgdTMyCXJlc2V0X2NudD0wOwotCi0JUlRfVFJBQ0UoQ09NUF9IQUxETSwgIlJTU0kgJWQgVGltZUludGVydmFsICVkIE11bHRpcGxlVGltZUludGVydmFsICVkXG4iLCBwcml2LT5pZWVlODAyMTEtPmZzeW5jX3Jzc2lfdGhyZXNob2xkLCBwcml2LT5pZWVlODAyMTEtPmZzeW5jX3RpbWVfaW50ZXJ2YWwsIHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfbXVsdGlwbGVfdGltZWludGVydmFsKTsKLQlSVF9UUkFDRShDT01QX0hBTERNLCAiUmF0ZUJpdG1hcCAweCV4IEZpcnN0RGlmZlJhdGVUaHJlc2hvbGQgJWQgU2Vjb25kRGlmZlJhdGVUaHJlc2hvbGQgJWRcbiIsIHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfcmF0ZV9iaXRtYXAsIHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfZmlyc3RkaWZmX3JhdGV0aHJlc2hvbGQsIHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfc2Vjb25kZGlmZl9yYXRldGhyZXNob2xkKTsKLQotCWlmKAlwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQgJiYKLQkJKHByaXYtPmllZWU4MDIxMS0+cEhUSW5mby0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9DRERfRlNZTkMpKQotCXsKLQkJaWYocHJpdi0+aWVlZTgwMjExLT5iZnN5bmNfZW5hYmxlID09IDApCi0JCXsKLQkJCXN3aXRjaChwcml2LT5pZWVlODAyMTEtPmZzeW5jX3N0YXRlKQotCQkJewotCQkJCWNhc2UgRGVmYXVsdF9Gc3luYzoKLQkJCQkJZG1fU3RhcnRIV0ZzeW5jKHByaXYpOwotCQkJCQlwcml2LT5pZWVlODAyMTEtPmZzeW5jX3N0YXRlID0gSFdfRnN5bmM7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dfRnN5bmM6Ci0JCQkJCWRtX0VuZFNXRnN5bmMocHJpdik7Ci0JCQkJCWRtX1N0YXJ0SFdGc3luYyhwcml2KTsKLQkJCQkJcHJpdi0+aWVlZTgwMjExLT5mc3luY19zdGF0ZSA9IEhXX0ZzeW5jOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhXX0ZzeW5jOgotCQkJCWRlZmF1bHQ6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJewotCQkJc3dpdGNoKHByaXYtPmllZWU4MDIxMS0+ZnN5bmNfc3RhdGUpCi0JCQl7Ci0JCQkJY2FzZSBEZWZhdWx0X0ZzeW5jOgotCQkJCQlkbV9TdGFydFNXRnN5bmMocHJpdik7Ci0JCQkJCXByaXYtPmllZWU4MDIxMS0+ZnN5bmNfc3RhdGUgPSBTV19Gc3luYzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIV19Gc3luYzoKLQkJCQkJZG1fRW5kSFdGc3luYyhwcml2KTsKLQkJCQkJZG1fU3RhcnRTV0ZzeW5jKHByaXYpOwotCQkJCQlwcml2LT5pZWVlODAyMTEtPmZzeW5jX3N0YXRlID0gU1dfRnN5bmM7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU1dfRnN5bmM6Ci0JCQkJZGVmYXVsdDoKLQkJCQkJYnJlYWs7Ci0KLQkJCX0KLQkJfQotCQlpZihwcml2LT5mcmFtZXN5bmNNb25pdG9yKQotCQl7Ci0JCQlpZihyZWdfYzM4X1N0YXRlICE9IFJlZ0MzOF9Gc3luY19BUF9CQ00pCi0JCQl7CS8vRm9yIGJyb2FkY29tIEFQIHdlIHdyaXRlIGRpZmZlcmVudCBkZWZhdWx0IHZhbHVlCi0JCQkJd3JpdGVfbmljX2J5dGUocHJpdiwgck9GRE0wX1J4RGV0ZWN0b3IzLCAweDk1KTsKLQotCQkJCXJlZ19jMzhfU3RhdGUgPSBSZWdDMzhfRnN5bmNfQVBfQkNNOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCXN3aXRjaChwcml2LT5pZWVlODAyMTEtPmZzeW5jX3N0YXRlKQotCQl7Ci0JCQljYXNlIEhXX0ZzeW5jOgotCQkJCWRtX0VuZEhXRnN5bmMocHJpdik7Ci0JCQkJcHJpdi0+aWVlZTgwMjExLT5mc3luY19zdGF0ZSA9IERlZmF1bHRfRnN5bmM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNXX0ZzeW5jOgotCQkJCWRtX0VuZFNXRnN5bmMocHJpdik7Ci0JCQkJcHJpdi0+aWVlZTgwMjExLT5mc3luY19zdGF0ZSA9IERlZmF1bHRfRnN5bmM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERlZmF1bHRfRnN5bmM6Ci0JCQlkZWZhdWx0OgotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYocHJpdi0+ZnJhbWVzeW5jTW9uaXRvcikKLQkJewotCQkJaWYocHJpdi0+aWVlZTgwMjExLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKQotCQkJewotCQkJCWlmKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPD0gUmVnQzM4X1RIKQotCQkJCXsKLQkJCQkJaWYocmVnX2MzOF9TdGF0ZSAhPSBSZWdDMzhfTm9uRnN5bmNfT3RoZXJfQVApCi0JCQkJCXsKLQkJCQkJCXdyaXRlX25pY19ieXRlKHByaXYsIHJPRkRNMF9SeERldGVjdG9yMywgMHg5MCk7Ci0KLQkJCQkJCXJlZ19jMzhfU3RhdGUgPSBSZWdDMzhfTm9uRnN5bmNfT3RoZXJfQVA7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IChSZWdDMzhfVEgrNSkpCi0JCQkJewotCQkJCQlpZihyZWdfYzM4X1N0YXRlKQotCQkJCQl7Ci0JCQkJCQl3cml0ZV9uaWNfYnl0ZShwcml2LCByT0ZETTBfUnhEZXRlY3RvcjMsIHByaXYtPmZyYW1lc3luYyk7Ci0JCQkJCQlyZWdfYzM4X1N0YXRlID0gUmVnQzM4X0RlZmF1bHQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJaWYocmVnX2MzOF9TdGF0ZSkKLQkJCQl7Ci0JCQkJCXdyaXRlX25pY19ieXRlKHByaXYsIHJPRkRNMF9SeERldGVjdG9yMywgcHJpdi0+ZnJhbWVzeW5jKTsKLQkJCQkJcmVnX2MzOF9TdGF0ZSA9IFJlZ0MzOF9EZWZhdWx0OwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlpZihwcml2LT5mcmFtZXN5bmNNb25pdG9yKQotCXsKLQkJaWYocHJpdi0+cmVzZXRfY291bnQgIT0gcmVzZXRfY250KQotCQl7CS8vQWZ0ZXIgc2lsZW50IHJlc2V0LCB0aGUgcmVnX2MzOF9TdGF0ZSB3aWxsIGJlIHJldHVybmVkIHRvIGRlZmF1bHQgdmFsdWUKLQkJCXdyaXRlX25pY19ieXRlKHByaXYsIHJPRkRNMF9SeERldGVjdG9yMywgcHJpdi0+ZnJhbWVzeW5jKTsKLQkJCXJlZ19jMzhfU3RhdGUgPSBSZWdDMzhfRGVmYXVsdDsKLQkJCXJlc2V0X2NudCA9IHByaXYtPnJlc2V0X2NvdW50OwotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCWlmKHJlZ19jMzhfU3RhdGUpCi0JCXsKLQkJCXdyaXRlX25pY19ieXRlKHByaXYsIHJPRkRNMF9SeERldGVjdG9yMywgcHJpdi0+ZnJhbWVzeW5jKTsKLQkJCXJlZ19jMzhfU3RhdGUgPSBSZWdDMzhfRGVmYXVsdDsKLQkJfQotCX0KLX0KLQotLyoKLSAqIERldGVjdCBTaWduYWwgc3RyZW5ndGggdG8gY29udHJvbCBUWCBSZWdpc3RyeQotICogVHggUG93ZXIgQ29udHJvbCBGb3IgTmVhci9GYXIgUmFuZ2UKLSAqLwotc3RhdGljIHZvaWQgZG1faW5pdF9keW5hbWljX3R4cG93ZXIoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0JLy9Jbml0aWFsIFRYIFBvd2VyIENvbnRyb2wgZm9yIG5lYXIvZmFyIHJhbmdlICwgYWRkIGJ5IGFteSAyMDA4LzA1LzE1LCBwb3J0aW5nIGZyb20gd2luZG93cyBjb2RlLgotCXByaXYtPmllZWU4MDIxMS0+YmR5bmFtaWNfdHhwb3dlcl9lbmFibGUgPSB0cnVlOyAgICAvL0RlZmF1bHQgdG8gZW5hYmxlIFR4IFBvd2VyIENvbnRyb2wKLQlwcml2LT5iTGFzdERUUEZsYWdfSGlnaCA9IGZhbHNlOwotCXByaXYtPmJMYXN0RFRQRmxhZ19Mb3cgPSBmYWxzZTsKLQlwcml2LT5iRHluYW1pY1R4SGlnaFBvd2VyID0gZmFsc2U7Ci0JcHJpdi0+YkR5bmFtaWNUeExvd1Bvd2VyID0gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIGRtX2R5bmFtaWNfdHhwb3dlcihzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQl1bnNpZ25lZCBpbnQgdHhoaXBvd2VyX3RocmVzaGhvbGQ9MDsKLSAgICAgICAgdW5zaWduZWQgaW50IHR4bG93cG93ZXJfdGhyZXNob2xkPTA7Ci0JaWYocHJpdi0+aWVlZTgwMjExLT5iZHluYW1pY190eHBvd2VyX2VuYWJsZSAhPSB0cnVlKQotCXsKLQkJcHJpdi0+YkR5bmFtaWNUeEhpZ2hQb3dlciA9IGZhbHNlOwotCQlwcml2LT5iRHluYW1pY1R4TG93UG93ZXIgPSBmYWxzZTsKLQkJcmV0dXJuOwotCX0KLSAgICAgICAgaWYoKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmF0aGVyb3NfY2FwX2V4aXN0ICkgJiYgKHByaXYtPmllZWU4MDIxMS0+bW9kZSA9PSBJRUVFX0cpKXsKLQkJdHhoaXBvd2VyX3RocmVzaGhvbGQgPSBUWF9QT1dFUl9BVEhFUk9BUF9USFJFU0hfSElHSDsKLQkJdHhsb3dwb3dlcl90aHJlc2hvbGQgPSBUWF9QT1dFUl9BVEhFUk9BUF9USFJFU0hfTE9XOwotCX0KLQllbHNlCi0JewotCQl0eGhpcG93ZXJfdGhyZXNoaG9sZCA9IFRYX1BPV0VSX05FQVJfRklFTERfVEhSRVNIX0hJR0g7Ci0JCXR4bG93cG93ZXJfdGhyZXNob2xkID0gVFhfUE9XRVJfTkVBUl9GSUVMRF9USFJFU0hfTE9XOwotCX0KLQotCVJUX1RSQUNFKENPTVBfVFhBR0MsICJwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0gJWxkXG4iICwgcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYik7Ci0KLQlpZihwcml2LT5pZWVlODAyMTEtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpCi0JewotCQlpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IHR4aGlwb3dlcl90aHJlc2hob2xkKQotCQl7Ci0JCQlwcml2LT5iRHluYW1pY1R4SGlnaFBvd2VyID0gdHJ1ZTsKLQkJCXByaXYtPmJEeW5hbWljVHhMb3dQb3dlciA9IGZhbHNlOwotCQl9Ci0JCWVsc2UKLQkJewotCQkJLy8gaGlnaCBwb3dlciBzdGF0ZSBjaGVjawotCQkJaWYocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8IHR4bG93cG93ZXJfdGhyZXNob2xkICYmIHByaXYtPmJEeW5hbWljVHhIaWdoUG93ZXIgPT0gdHJ1ZSkKLQkJCXsKLQkJCQlwcml2LT5iRHluYW1pY1R4SGlnaFBvd2VyID0gZmFsc2U7Ci0JCQl9Ci0JCQkvLyBsb3cgcG93ZXIgc3RhdGUgY2hlY2sKLQkJCWlmKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPCAzNSkKLQkJCXsKLQkJCQlwcml2LT5iRHluYW1pY1R4TG93UG93ZXIgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZihwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IDQwKQotCQkJewotCQkJCXByaXYtPmJEeW5hbWljVHhMb3dQb3dlciA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCWVsc2UKLQl7Ci0JCS8vcEhhbERhdGEtPmJUWFBvd2VyQ3RybGZvck5lYXJGYXJSYW5nZSA9ICFwSGFsRGF0YS0+YlRYUG93ZXJDdHJsZm9yTmVhckZhclJhbmdlOwotCQlwcml2LT5iRHluYW1pY1R4SGlnaFBvd2VyID0gZmFsc2U7Ci0JCXByaXYtPmJEeW5hbWljVHhMb3dQb3dlciA9IGZhbHNlOwotCX0KLQotCWlmKCAocHJpdi0+YkR5bmFtaWNUeEhpZ2hQb3dlciAhPSBwcml2LT5iTGFzdERUUEZsYWdfSGlnaCApIHx8Ci0JCShwcml2LT5iRHluYW1pY1R4TG93UG93ZXIgIT0gcHJpdi0+Ykxhc3REVFBGbGFnX0xvdyApICkKLQl7Ci0JCVJUX1RSQUNFKENPTVBfVFhBR0MsICJTZXRUeFBvd2VyTGV2ZWw4MTkwKCkgY2hhbm5lbCA9ICVkXG4iLCBwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKLQotCi0JCXJ0bDgxOTJfcGh5X3NldFR4UG93ZXIocHJpdiwgcHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7Ci0KLQl9Ci0JcHJpdi0+Ykxhc3REVFBGbGFnX0hpZ2ggPSBwcml2LT5iRHluYW1pY1R4SGlnaFBvd2VyOwotCXByaXYtPmJMYXN0RFRQRmxhZ19Mb3cgPSBwcml2LT5iRHluYW1pY1R4TG93UG93ZXI7Ci0KLX0KLQotLy9hZGRlZCBieSB2aXZpLCBmb3IgcmVhZCB0eCByYXRlIGFuZCByZXRyeWNvdW50Ci1zdGF0aWMgdm9pZCBkbV9jaGVja190eHJhdGVhbmRyZXRyeWNvdW50KHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlKiBpZWVlID0gcHJpdi0+aWVlZTgwMjExOwotCi0JLy9mb3IgaW5pdGlhbCB0eCByYXRlCi0JaWVlZS0+c29mdG1hY19zdGF0cy5sYXN0X3BhY2tldF9yYXRlID0gcmVhZF9uaWNfYnl0ZShwcml2ICxJbml0aWFsX1R4X1JhdGVfUmVnKTsKLQkvL2ZvciB0eCB0eCByZXRyeSBjb3VudAotCWllZWUtPnNvZnRtYWNfc3RhdHMudHhyZXRyeWNvdW50ID0gcmVhZF9uaWNfZHdvcmQocHJpdiwgVHhfUmV0cnlfQ291bnRfUmVnKTsKLX0KLQotc3RhdGljIHZvaWQgZG1fc2VuZF9yc3NpX3RvZncoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0JLy8gSWYgd2UgdGVzdCBjaGFyaW90LCB3ZSBzaG91bGQgc3RvcCB0aGUgVFggY29tbWFuZCA/Ci0JLy8gQmVjYXVzZSA5MkUgd2lsbCBhbHdheXMgc2lsZW50IHJlc2V0IHdoZW4gd2Ugc2VuZCB0eCBjb21tYW5kLiBXZSB1c2UgcmVnaXN0ZXIKLQkvLyAweDFlMChieXRlKSB0byBib3RpZnkgZHJpdmVyLgotCXdyaXRlX25pY19ieXRlKHByaXYsIERSSVZFUl9SU1NJLCAodTgpcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYik7Ci0JcmV0dXJuOwotfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2RtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2RtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YjM0ZWEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9kbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJQ29weXJpZ2h0KGMpIDIwMDcsICBSZWFsVEVLIFRlY2hub2xvZ3kgSW5jLiBBbGwgUmlnaHQgUmVzZXJ2ZWQuCi0gKgotICogTW9kdWxlOgkJSGFsODE5eFVzYkRNLmgJKFJUTDgxOTIgIEhlYWRlciBIIEZpbGUpCi0gKgotICoKLSAqIE5vdGU6CQlGb3IgZHluYW1pYyBjb250cm9sIGRlZmluaXRpb24gY29uc3RhbnQgc3RydWN0dXJlLgotICoKLSAqCi0gKiBFeHBvcnQ6Ci0gKgotICogQWJicmV2OgotICoKLSAqIEhpc3Rvcnk6Ci0gKglEYXRhCQlXaG8JCVJlbWFyawotICoJMTAvMDQvMjAwNyAgTUhDICAgIAlDcmVhdGUgaW5pdGlhbCB2ZXJzaW9uLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZglfX1I4MTkyVURNX0hfXwotI2RlZmluZSBfX1I4MTkyVURNX0hfXwotCi0jZGVmaW5lIAkJT0ZETV9UYWJsZV9MZW5ndGgJMTkKLSNkZWZpbmUJCUNDS19UYWJsZV9sZW5ndGgJMTIKLQotI2RlZmluZQkJRE1fRElHX1RIUkVTSF9ISUdICQkJCQk0MAotI2RlZmluZQkJRE1fRElHX1RIUkVTSF9MT1cJCQkJCTM1Ci0KLSNkZWZpbmUJCURNX0RJR19ISUdIX1BXUl9USFJFU0hfSElHSAkJNzUKLSNkZWZpbmUJCURNX0RJR19ISUdIX1BXUl9USFJFU0hfTE9XCQk3MAotCi0jZGVmaW5lCQlCV19BVVRPX1NXSVRDSF9ISUdIX0xPVwkJCTI1Ci0jZGVmaW5lCQlCV19BVVRPX1NXSVRDSF9MT1dfSElHSAkJCTMwCi0KLSNkZWZpbmUJCURNX2NoZWNrX2ZzeW5jX3RpbWVfaW50ZXJ2YWwJCQkJNTAwCi0KLQotI2RlZmluZQkJRE1fRElHX0JBQ0tPRkYJCQkJMTIKLSNkZWZpbmUJCURNX0RJR19NQVgJCQkJCTB4MzYKLSNkZWZpbmUJCURNX0RJR19NSU4JCQkJCTB4MWMKLSNkZWZpbmUJCURNX0RJR19NSU5fTmV0Y29yZQkJCTB4MTIKLQotI2RlZmluZQkJUnhQYXRoU2VsZWN0aW9uX1NTX1RIX2xvdwkJMzAKLSNkZWZpbmUJCVJ4UGF0aFNlbGVjdGlvbl9kaWZmX1RICQkJMTgKLQotI2RlZmluZQkJUmF0ZUFkYXB0aXZlVEhfSGlnaAkJCTUwCi0jZGVmaW5lCQlSYXRlQWRhcHRpdmVUSF9Mb3dfMjBNCQkzMAotI2RlZmluZQkJUmF0ZUFkYXB0aXZlVEhfTG93XzQwTQkJMTAKLSNkZWZpbmUJCVZlcnlMb3dSU1NJCQkJCQkxNQotI2RlZmluZQkJQ1RTVG9TZWxmVEhWYWwJCQkJCTM1Ci0KLS8vZGVmaW5lZCBieSB2aXZpLCBmb3IgdHggcG93ZXIgdHJhY2sKLSNkZWZpbmUJCUVfRk9SX1RYX1BPV0VSX1RSQUNLICAgICAgICAgICAgICAgMzAwCi0vL0R5bmFtaWMgVHggUG93ZXIgQ29udHJvbCBUaHJlc2hvbGQKLSNkZWZpbmUJCVRYX1BPV0VSX05FQVJfRklFTERfVEhSRVNIX0hJR0gJCTY4Ci0jZGVmaW5lCQlUWF9QT1dFUl9ORUFSX0ZJRUxEX1RIUkVTSF9MT1cJCTYyCi0vL2FkZGVkIGJ5IGFteSBmb3IgYXRoZXJvcyBBUAotI2RlZmluZSAgICAgICAgIFRYX1BPV0VSX0FUSEVST0FQX1RIUkVTSF9ISUdIICAgICAgICAgICA3OAotI2RlZmluZSAJVFhfUE9XRVJfQVRIRVJPQVBfVEhSRVNIX0xPVwkJNzIKLQotLy9kZWZpbmVkIGJ5IHZpdmksIGZvciBzaG93aW5nIG9uIFVJLiBOZXdlciBmaXJtd2FyZSBoYXMgY2hhbmdlZCB0byAweDFlMAotI2RlZmluZSAJCUN1cnJlbnRfVHhfUmF0ZV9SZWcgICAgICAgICAweDFlMC8vMHgxYjgKLSNkZWZpbmUgCQlJbml0aWFsX1R4X1JhdGVfUmVnICAgICAgICAgMHgxZTEgLy8weDFiOQotI2RlZmluZSAJCVR4X1JldHJ5X0NvdW50X1JlZyAgICAgICAgIDB4MWFjCi0jZGVmaW5lCQlSZWdDMzhfVEgJCQkJIDIwCi0KLS8qIDIwMDcvMTAvMDQgTUggRGVmaW5lIHVwcGVyIGFuZCBsb3dlciB0aHJlc2hvbGQgb2YgRElHIGVuYWJsZSBvciBkaXNhYmxlLiAqLwotdHlwZWRlZiBzdHJ1Y3QgX2R5bmFtaWNfaW5pdGlhbF9nYWluX3RocmVzaG9sZF8KLXsKLQl1OAkJZGlnX2VuYWJsZV9mbGFnOwotCXU4CQlkaWdfYWxnb3JpdGhtOwotCXU4CQlkYmdfbW9kZTsKLQl1OAkJZGlnX2FsZ29yaXRobV9zd2l0Y2g7Ci0KLQlsb25nCQlyc3NpX2xvd190aHJlc2g7Ci0JbG9uZwkJcnNzaV9oaWdoX3RocmVzaDsKLQotCWxvbmcJCXJzc2lfaGlnaF9wb3dlcl9sb3d0aHJlc2g7Ci0JbG9uZwkJcnNzaV9oaWdoX3Bvd2VyX2hpZ2h0aHJlc2g7Ci0KLQl1OAkJZGlnX3N0YXRlOwotCXU4CQlkaWdfaGlnaHB3cl9zdGF0ZTsKLQl1OAkJY3VyX2Nvbm5lY3Rfc3RhdGU7Ci0JdTgJCXByZV9jb25uZWN0X3N0YXRlOwotCi0JdTgJCWN1cnBkX3Roc3RhdGU7Ci0JdTgJCXByZXBkX3Roc3RhdGU7Ci0JdTgJCWN1cmNzX3JhdGlvX3N0YXRlOwotCXU4CQlwcmVjc19yYXRpb19zdGF0ZTsKLQotCXUzMgkJcHJlX2lnX3ZhbHVlOwotCXUzMgkJY3VyX2lnX3ZhbHVlOwotCi0JdTgJCWJhY2tvZmZfdmFsOwotCXU4CQlyeF9nYWluX3JhbmdlX21heDsKLQl1OAkJcnhfZ2Fpbl9yYW5nZV9taW47Ci0JYm9vbAkJaW5pdGlhbGdhaW5fbG93ZXJib3VuZF9zdGF0ZTsKLQotCWxvbmcJCXJzc2lfdmFsOwotfWRpZ190OwotCi10eXBlZGVmIGVudW0gdGFnX2R5bmFtaWNfaW5pdF9nYWluX3N0YXRlX2RlZmluaXRpb24KLXsKLQlETV9TVEFfRElHX09GRiA9IDAsCi0JRE1fU1RBX0RJR19PTiwKLQlETV9TVEFfRElHX01BWAotfWRtX2RpZ19zdGFfZTsKLQotCi0vKiAyMDA3LzEwLzA4IE1IIERlZmluZSBSQVRSIHN0YXRlLiAqLwotdHlwZWRlZiBlbnVtIHRhZ19keW5hbWljX3JhdHJfc3RhdGVfZGVmaW5pdGlvbgotewotCURNX1JBVFJfU1RBX0hJR0ggPSAwLAotCURNX1JBVFJfU1RBX01JRERMRSA9IDEsCi0JRE1fUkFUUl9TVEFfTE9XID0gMiwKLQlETV9SQVRSX1NUQV9NQVgKLX1kbV9yYXRyX3N0YV9lOwotCi0vKiAyMDA3LzEwLzExIE1IIERlZmluZSBESUcgb3BlcmF0aW9uIHR5cGUuICovCi10eXBlZGVmIGVudW0gdGFnX2R5bmFtaWNfaW5pdF9nYWluX29wZXJhdGlvbl90eXBlX2RlZmluaXRpb24KLXsKLQlESUdfVFlQRV9USFJFU0hfSElHSAk9IDAsCi0JRElHX1RZUEVfVEhSRVNIX0xPVwk9IDEsCi0JRElHX1RZUEVfVEhSRVNIX0hJR0hQV1JfSElHSAk9IDIsCi0JRElHX1RZUEVfVEhSRVNIX0hJR0hQV1JfTE9XCT0gMywKLQlESUdfVFlQRV9EQkdfTU9ERQkJCQk9IDQsCi0JRElHX1RZUEVfUlNTSQkJCQkJCT0gNSwKLQlESUdfVFlQRV9BTEdPUklUSE0JCQkJPSA2LAotCURJR19UWVBFX0JBQ0tPRkYJCQkJCT0gNywKLQlESUdfVFlQRV9QV0RCX0ZBQ1RPUgkJCT0gOCwKLQlESUdfVFlQRV9SWF9HQUlOX01JTgkJCQk9IDksCi0JRElHX1RZUEVfUlhfR0FJTl9NQVgJCQkJPSAxMCwKLQlESUdfVFlQRV9FTkFCTEUgCQk9IDIwLAotCURJR19UWVBFX0RJU0FCTEUgCQk9IDMwLAotCURJR19PUF9UWVBFX01BWAotfWRtX2RpZ19vcF9lOwotCi10eXBlZGVmIGVudW0gdGFnX2RpZ19hbGdvcml0aG1fZGVmaW5pdGlvbgotewotCURJR19BTEdPX0JZX0ZBTFNFX0FMQVJNID0gMCwKLQlESUdfQUxHT19CWV9SU1NJCT0gMSwKLQlESUdfQUxHT19NQVgKLX1kbV9kaWdfYWxnX2U7Ci0KLXR5cGVkZWYgZW51bSB0YWdfZGlnX2RiZ21vZGVfZGVmaW5pdGlvbgotewotCURJR19EQkdfT0ZGID0gMCwKLQlESUdfREJHX09OID0gMSwKLQlESUdfREJHX01BWAotfWRtX2RpZ19kYmdfZTsKLQotdHlwZWRlZiBlbnVtIHRhZ19kaWdfY29ubmVjdF9kZWZpbml0aW9uCi17Ci0JRElHX0RJU0NPTk5FQ1QgPSAwLAotCURJR19DT05ORUNUID0gMSwKLQlESUdfQ09OTkVDVF9NQVgKLX1kbV9kaWdfY29ubmVjdF9lOwotCi10eXBlZGVmIGVudW0gdGFnX2RpZ19wYWNrZXRkZXRlY3Rpb25fdGhyZXNob2xkX2RlZmluaXRpb24KLXsKLQlESUdfUERfQVRfTE9XX1BPV0VSID0gMCwKLQlESUdfUERfQVRfTk9STUFMX1BPV0VSID0gMSwKLQlESUdfUERfQVRfSElHSF9QT1dFUiA9IDIsCi0JRElHX1BEX01BWAotfWRtX2RpZ19wZF90aF9lOwotCi10eXBlZGVmIGVudW0gdGFnX2RpZ19jY2tfY3NfcmF0aW9fc3RhdGVfZGVmaW5pdGlvbgotewotCURJR19DU19SQVRJT19MT1dFUiA9IDAsCi0JRElHX0NTX1JBVElPX0hJR0hFUiA9IDEsCi0JRElHX0NTX01BWAotfWRtX2RpZ19jc19yYXRpb19lOwotdHlwZWRlZiBzdHJ1Y3QgX0R5bmFtaWNfUnhfUGF0aF9TZWxlY3Rpb25fCi17Ci0JdTgJCUVuYWJsZTsKLQl1OAkJRGJnTW9kZTsKLQl1OAkJY2NrX21ldGhvZDsKLQl1OAkJY2NrX1J4X3BhdGg7Ci0KLQl1OAkJU1NfVEhfbG93OwotCXU4CQlkaWZmX1RIOwotCXU4CQlkaXNhYmxlZFJGOwotCXU4CQlyZXNlcnZlZDsKLQotCXU4CQlyZl9yc3NpWzRdOwotCXU4CQlyZl9lbmFibGVfcnNzaV90aFs0XTsKLQlsb25nCQljY2tfcHdkYl9zdGFbNF07Ci19RFJ4UGF0aFNlbDsKLQotdHlwZWRlZiBlbnVtIHRhZ19DQ0tfUnhfUGF0aF9NZXRob2RfRGVmaW5pdGlvbgotewotCUNDS19SeF9WZXJzaW9uXzEgPSAwLAotCUNDS19SeF9WZXJzaW9uXzI9IDEsCi0JQ0NLX1J4X1ZlcnNpb25fTUFYCi19RE1fQ0NLX1J4X1BhdGhfTWV0aG9kOwotCi10eXBlZGVmIGVudW0gdGFnX0RNX0RiZ01vZGVfRGVmaW5pdGlvbgotewotCURNX0RCR19PRkYgPSAwLAotCURNX0RCR19PTiA9IDEsCi0JRE1fREJHX01BWAotfURNX0RCR19FOwotCi10eXBlZGVmIHN0cnVjdCB0YWdfVHhfQ29uZmlnX0NtZF9Gb3JtYXQKLXsKLQl1MzIJT3A7CQkJCQkJCQkJCS8qIENvbW1hbmQgcGFja2V0IHR5cGUuICovCi0JdTMyCUxlbmd0aDsJCQkJCQkJCQkvKiBDb21tYW5kIHBhY2tldCBsZW5ndGguICovCi0JdTMyCVZhbHVlOwotfURDTURfVFhDTURfVCwgKlBEQ01EX1RYQ01EX1Q7Ci0KLQotZXh0ZXJuIGRpZ190IGRtX2RpZ3RhYmxlOwotZXh0ZXJuIERSeFBhdGhTZWwgRE1fUnhQYXRoU2VsVGFibGU7Ci0KLXZvaWQgaW5pdF9oYWxfZG0oc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOwotdm9pZCBkZWluaXRfaGFsX2RtKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKLQotdm9pZCBoYWxfZG1fd2F0Y2hkb2coc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOwotCi12b2lkIGluaXRfcmF0ZV9hZGFwdGl2ZShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7Ci12b2lkIGRtX3R4cG93ZXJfdHJhY2tpbmdjYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotdm9pZCBkbV9yZl9wYXRoY2hlY2tfd29ya2l0ZW1jYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwotdm9pZCBkbV9pbml0aWFsaXplX3R4cG93ZXJfdHJhY2tpbmcoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOwotdm9pZCBkbV9jY2tfdHhwb3dlcl9hZGp1c3Qoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIGJvb2wgYmluY2gxNCk7Ci0KLQotI2VuZGlmCS8qX19SODE5MlVETV9IX18gKi8KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9maXJtd2FyZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9maXJtd2FyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NzE5ODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2Zpcm13YXJlLmMKQEAgLTAsMCArMSwzNDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJydGxfY29yZS5oIgorI2luY2x1ZGUgInI4MTkyRV9ody5oIgorI2luY2x1ZGUgInI4MTkyRV9od2ltZy5oIgorI2luY2x1ZGUgInI4MTkyRV9maXJtd2FyZS5oIgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisKK3ZvaWQgZmlybXdhcmVfaW5pdF9wYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcnRfZmlybXdhcmUgKnBmaXJtd2FyZSA9IHByaXYtPnBGaXJtd2FyZTsKKworCXBmaXJtd2FyZS0+Y21kcGFja2V0X2ZyYWdfdGhyZXNvbGQgPSBHRVRfQ09NTUFORF9QQUNLRVRfRlJBR19USFJFU0hPTEQoCisJCQkJCSAgICAgTUFYX1RSQU5TTUlUX0JVRkZFUl9TSVpFKTsKK30KKworc3RhdGljIGJvb2wgZndfZG93bmxvYWRfY29kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqY29kZV92aXJ0dWFsX2FkZHJlc3MsCisJCQkgICAgIHUzMiBidWZmZXJfbGVuKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlib29sCQkgICAgcnRfc3RhdHVzID0gdHJ1ZTsKKwl1MTYJCSAgICBmcmFnX3RocmVzaG9sZDsKKwl1MTYJCSAgICBmcmFnX2xlbmd0aCwgZnJhZ19vZmZzZXQgPSAwOworCWludAkJICAgIGk7CisKKwlzdHJ1Y3QgcnRfZmlybXdhcmUgKnBmaXJtd2FyZSA9IHByaXYtPnBGaXJtd2FyZTsKKwlzdHJ1Y3Qgc2tfYnVmZgkgICAgKnNrYjsKKwl1bnNpZ25lZCBjaGFyCSAgICAqc2VnX3B0cjsKKwlzdHJ1Y3QgY2JfZGVzYyAqdGNiX2Rlc2M7CisJdTggICAgICAgICAgICAgICAgICBiTGFzdEluaVBrdDsKKworCWZpcm13YXJlX2luaXRfcGFyYW0oZGV2KTsKKwlmcmFnX3RocmVzaG9sZCA9IHBmaXJtd2FyZS0+Y21kcGFja2V0X2ZyYWdfdGhyZXNvbGQ7CisJZG8geworCQlpZiAoKGJ1ZmZlcl9sZW4gLSBmcmFnX29mZnNldCkgPiBmcmFnX3RocmVzaG9sZCkgeworCQkJZnJhZ19sZW5ndGggPSBmcmFnX3RocmVzaG9sZCA7CisJCQliTGFzdEluaVBrdCA9IDA7CisKKwkJfSBlbHNlIHsKKwkJCWZyYWdfbGVuZ3RoID0gYnVmZmVyX2xlbiAtIGZyYWdfb2Zmc2V0OworCQkJYkxhc3RJbmlQa3QgPSAxOworCisJCX0KKworCQlza2IgID0gZGV2X2FsbG9jX3NrYihmcmFnX2xlbmd0aCArIDQpOworCQltZW1jcHkoKHVuc2lnbmVkIGNoYXIgKikoc2tiLT5jYiksICZkZXYsIHNpemVvZihkZXYpKTsKKwkJdGNiX2Rlc2MgPSAoc3RydWN0IGNiX2Rlc2MgKikoc2tiLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKKwkJdGNiX2Rlc2MtPnF1ZXVlX2luZGV4ID0gVFhDTURfUVVFVUU7CisJCXRjYl9kZXNjLT5iQ21kT3JJbml0ID0gREVTQ19QQUNLRVRfVFlQRV9JTklUOworCQl0Y2JfZGVzYy0+Ykxhc3RJbmlQa3QgPSBiTGFzdEluaVBrdDsKKworCQlzZWdfcHRyID0gc2tiLT5kYXRhOworCQlmb3IgKGkgPSAwOyBpIDwgZnJhZ19sZW5ndGg7IGkgKz0gNCkgeworCQkJKnNlZ19wdHIrKyA9ICgoaSswKSA8IGZyYWdfbGVuZ3RoKSA/CisJCQkJICAgICBjb2RlX3ZpcnR1YWxfYWRkcmVzc1tpKzNdIDogMDsKKwkJCSpzZWdfcHRyKysgPSAoKGkrMSkgPCBmcmFnX2xlbmd0aCkgPworCQkJCSAgICAgY29kZV92aXJ0dWFsX2FkZHJlc3NbaSsyXSA6IDA7CisJCQkqc2VnX3B0cisrID0gKChpKzIpIDwgZnJhZ19sZW5ndGgpID8KKwkJCQkgICAgIGNvZGVfdmlydHVhbF9hZGRyZXNzW2krMV0gOiAwOworCQkJKnNlZ19wdHIrKyA9ICgoaSszKSA8IGZyYWdfbGVuZ3RoKSA/CisJCQkJICAgICBjb2RlX3ZpcnR1YWxfYWRkcmVzc1tpKzBdIDogMDsKKwkJfQorCQl0Y2JfZGVzYy0+dHhidWZfc2l6ZSA9ICh1MTYpaTsKKwkJc2tiX3B1dChza2IsIGkpOworCisJCWlmICghcHJpdi0+cnRsbGliLT5jaGVja19uaWNfZW5vdWdoX2Rlc2MoZGV2LCB0Y2JfZGVzYy0+cXVldWVfaW5kZXgpIHx8CisJCSAgICAoIXNrYl9xdWV1ZV9lbXB0eSgmcHJpdi0+cnRsbGliLT5za2Jfd2FpdFFbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSkpIHx8CisJCSAgICAocHJpdi0+cnRsbGliLT5xdWV1ZV9zdG9wKSkgeworCQkJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwgIj09PT09PT09PT09PT09PT09PT0+IHR4ICIKKwkJCQkgImZ1bGwhXG4iKTsKKwkJCXNrYl9xdWV1ZV90YWlsKCZwcml2LT5ydGxsaWItPnNrYl93YWl0UQorCQkJCQlbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSwgc2tiKTsKKwkJfSBlbHNlIHsKKwkJcHJpdi0+cnRsbGliLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdChza2IsIGRldik7CisJCX0KKworCQljb2RlX3ZpcnR1YWxfYWRkcmVzcyArPSBmcmFnX2xlbmd0aDsKKwkJZnJhZ19vZmZzZXQgKz0gZnJhZ19sZW5ndGg7CisKKwl9IHdoaWxlIChmcmFnX29mZnNldCA8IGJ1ZmZlcl9sZW4pOworCisJd3JpdGVfbmljX2J5dGUoZGV2LCBUUFBvbGwsIFRQUG9sbF9DUSk7CisKKwlyZXR1cm4gcnRfc3RhdHVzOworfQorCitzdGF0aWMgYm9vbCBDUFVjaGVja19tYWluY29kZW9rX3R1cm5vbkNQVShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWJvb2wJCXJ0X3N0YXR1cyA9IHRydWU7CisJdTMyCQlDUFVfc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBsb25nICAgdGltZW91dDsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgTVNFQ1MoMjAwKTsKKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJQ1BVX3N0YXR1cyA9IHJlYWRfbmljX2R3b3JkKGRldiwgQ1BVX0dFTik7CisJCWlmIChDUFVfc3RhdHVzICYgQ1BVX0dFTl9QVVRfQ09ERV9PSykKKwkJCWJyZWFrOworCQltZGVsYXkoMik7CisJfQorCisJaWYgKCEoQ1BVX3N0YXR1cyZDUFVfR0VOX1BVVF9DT0RFX09LKSkgeworCQlSVF9UUkFDRShDT01QX0VSUiwgIkRvd25sb2FkIEZpcm13YXJlOiBQdXQgY29kZSBmYWlsIVxuIik7CisJCWdvdG8gQ1BVQ2hlY2tNYWluQ29kZU9LQW5kVHVybk9uQ1BVX0ZhaWw7CisJfSBlbHNlIHsKKwkJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwgIkRvd25sb2FkIEZpcm13YXJlOiBQdXQgY29kZSBvayFcbiIpOworCX0KKworCUNQVV9zdGF0dXMgPSByZWFkX25pY19kd29yZChkZXYsIENQVV9HRU4pOworCXdyaXRlX25pY19ieXRlKGRldiwgQ1BVX0dFTiwKKwkJICAgICAgICh1OCkoKENQVV9zdGF0dXN8Q1BVX0dFTl9QV1JfU1RCX0NQVSkmMHhmZikpOworCW1kZWxheSgxKTsKKworCXRpbWVvdXQgPSBqaWZmaWVzICsgTVNFQ1MoMjAwKTsKKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJQ1BVX3N0YXR1cyA9IHJlYWRfbmljX2R3b3JkKGRldiwgQ1BVX0dFTik7CisJCWlmIChDUFVfc3RhdHVzJkNQVV9HRU5fQk9PVF9SRFkpCisJCQlicmVhazsKKwkJbWRlbGF5KDIpOworCX0KKworCWlmICghKENQVV9zdGF0dXMmQ1BVX0dFTl9CT09UX1JEWSkpCisJCWdvdG8gQ1BVQ2hlY2tNYWluQ29kZU9LQW5kVHVybk9uQ1BVX0ZhaWw7CisJZWxzZQorCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCAiRG93bmxvYWQgRmlybXdhcmU6IEJvb3QgcmVhZHkhXG4iKTsKKworCXJldHVybiBydF9zdGF0dXM7CisKK0NQVUNoZWNrTWFpbkNvZGVPS0FuZFR1cm5PbkNQVV9GYWlsOgorCVJUX1RSQUNFKENPTVBfRVJSLCAiRVJSIGluICVzKClcbiIsIF9fZnVuY19fKTsKKwlydF9zdGF0dXMgPSBmYWxzZTsKKwlyZXR1cm4gcnRfc3RhdHVzOworfQorCitzdGF0aWMgYm9vbCBDUFVjaGVja19maXJtd2FyZV9yZWFkeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJYm9vbAlydF9zdGF0dXMgPSB0cnVlOworCXUzMglDUFVfc3RhdHVzID0gMDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIE1TRUNTKDIwKTsKKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJQ1BVX3N0YXR1cyA9IHJlYWRfbmljX2R3b3JkKGRldiwgQ1BVX0dFTik7CisJCWlmIChDUFVfc3RhdHVzJkNQVV9HRU5fRklSTV9SRFkpCisJCQlicmVhazsKKwkJbWRlbGF5KDIpOworCX0KKworCWlmICghKENQVV9zdGF0dXMmQ1BVX0dFTl9GSVJNX1JEWSkpCisJCWdvdG8gQ1BVQ2hlY2tGaXJtd2FyZVJlYWR5X0ZhaWw7CisJZWxzZQorCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCAiRG93bmxvYWQgRmlybXdhcmU6IEZpcm13YXJlIHJlYWR5IVxuIik7CisKKwlyZXR1cm4gcnRfc3RhdHVzOworCitDUFVDaGVja0Zpcm13YXJlUmVhZHlfRmFpbDoKKwlSVF9UUkFDRShDT01QX0VSUiwgIkVSUiBpbiAlcygpXG4iLCBfX2Z1bmNfXyk7CisJcnRfc3RhdHVzID0gZmFsc2U7CisJcmV0dXJuIHJ0X3N0YXR1czsKKworfQorCitzdGF0aWMgYm9vbCBmaXJtd2FyZV9jaGVja19yZWFkeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQl1OCBsb2FkX2Z3X3N0YXR1cykKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJc3RydWN0IHJ0X2Zpcm13YXJlICpwZmlybXdhcmUgPSBwcml2LT5wRmlybXdhcmU7CisJYm9vbCBydF9zdGF0dXMgID0gdHJ1ZTsKKworCXN3aXRjaCAobG9hZF9md19zdGF0dXMpIHsKKwljYXNlIEZXX0lOSVRfU1RFUDBfQk9PVDoKKwkJcGZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPSBGV19TVEFUVVNfMV9NT1ZFX0JPT1RfQ09ERTsKKwkJYnJlYWs7CisKKwljYXNlIEZXX0lOSVRfU1RFUDFfTUFJTjoKKwkJcGZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPSBGV19TVEFUVVNfMl9NT1ZFX01BSU5fQ09ERTsKKworCQlydF9zdGF0dXMgPSBDUFVjaGVja19tYWluY29kZW9rX3R1cm5vbkNQVShkZXYpOworCQlpZiAocnRfc3RhdHVzKQorCQkJcGZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPSBGV19TVEFUVVNfM19UVVJOT05fQ1BVOworCQllbHNlCisJCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCAiQ1BVY2hlY2tfbWFpbmNvZGVva190dXJub24iCisJCQkJICJDUFUgZmFpbCFcbiIpOworCisJCWJyZWFrOworCisJY2FzZSBGV19JTklUX1NURVAyX0RBVEE6CisJCXBmaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzID0gRldfU1RBVFVTXzRfTU9WRV9EQVRBX0NPREU7CisJCW1kZWxheSgxKTsKKworCQlydF9zdGF0dXMgPSBDUFVjaGVja19maXJtd2FyZV9yZWFkeShkZXYpOworCQlpZiAocnRfc3RhdHVzKQorCQkJcGZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPSBGV19TVEFUVVNfNV9SRUFEWTsKKwkJZWxzZQorCQkJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwgIkNQVWNoZWNrX2Zpcm13YXJlX3JlYWR5IGZhaWwiCisJCQkJICIoJWQpIVxuIiwgcnRfc3RhdHVzKTsKKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlydF9zdGF0dXMgPSBmYWxzZTsKKwkJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwgIlVua25vd24gZmlyd2FyZSBzdGF0dXMiKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJ0X3N0YXR1czsKK30KKworYm9vbCBpbml0X2Zpcm13YXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCWJvb2wJCQlydF9zdGF0dXMgPSB0cnVlOworCisJdTgJKmZpcm13YXJlX2ltZ19idWZbM10gPSB7ICZSdGw4MTkyUGNpRUZ3Qm9vdEFycmF5WzBdLAorCQkJCQkgJlJ0bDgxOTJQY2lFRndNYWluQXJyYXlbMF0sCisJCQkJCSAmUnRsODE5MlBjaUVGd0RhdGFBcnJheVswXX07CisKKwl1MzIJZmlybXdhcmVfaW1nX2xlblszXSA9IHsgc2l6ZW9mKFJ0bDgxOTJQY2lFRndCb290QXJyYXkpLAorCQkJCQlzaXplb2YoUnRsODE5MlBjaUVGd01haW5BcnJheSksCisJCQkJCXNpemVvZihSdGw4MTkyUGNpRUZ3RGF0YUFycmF5KX07CisJdTMyCWZpbGVfbGVuZ3RoID0gMDsKKwl1OAkqbWFwcGVkX2ZpbGUgPSBOVUxMOworCXU4CWluaXRfc3RlcCA9IDA7CisJZW51bSBvcHRfcnN0X3R5cGUgcnN0X29wdCA9IE9QVF9TWVNURU1fUkVTRVQ7CisJZW51bSBmaXJtd2FyZV9pbml0X3N0ZXAgc3RhcnRpbmdfc3RhdGUgPSBGV19JTklUX1NURVAwX0JPT1Q7CisKKwlzdHJ1Y3QgcnRfZmlybXdhcmUgKnBmaXJtd2FyZSA9IHByaXYtPnBGaXJtd2FyZTsKKworCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsICIgUGxhdGZvcm1Jbml0RmlybXdhcmUoKT09PlxuIik7CisKKwlpZiAocGZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPT0gRldfU1RBVFVTXzBfSU5JVCkgeworCQlyc3Rfb3B0ID0gT1BUX1NZU1RFTV9SRVNFVDsKKwkJc3RhcnRpbmdfc3RhdGUgPSBGV19JTklUX1NURVAwX0JPT1Q7CisKKwl9IGVsc2UgaWYgKHBmaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzID09IEZXX1NUQVRVU181X1JFQURZKSB7CisJCXJzdF9vcHQgPSBPUFRfRklSTVdBUkVfUkVTRVQ7CisJCXN0YXJ0aW5nX3N0YXRlID0gRldfSU5JVF9TVEVQMl9EQVRBOworCX0gZWxzZSB7CisJCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsICJQbGF0Zm9ybUluaXRGaXJtd2FyZTogdW5kZWZpbmVkIgorCQkJICIgZmlybXdhcmUgc3RhdGVcbiIpOworCX0KKworCXByaXYtPmZpcm13YXJlX3NvdXJjZSA9IEZXX1NPVVJDRV9JTUdfRklMRTsKKwlmb3IgKGluaXRfc3RlcCA9IHN0YXJ0aW5nX3N0YXRlOyBpbml0X3N0ZXAgPD0gRldfSU5JVF9TVEVQMl9EQVRBOworCSAgICAgaW5pdF9zdGVwKyspIHsKKwkJaWYgKHJzdF9vcHQgPT0gT1BUX1NZU1RFTV9SRVNFVCkgeworCQkJc3dpdGNoIChwcml2LT5maXJtd2FyZV9zb3VyY2UpIHsKKwkJCWNhc2UgRldfU09VUkNFX0lNR19GSUxFOgorCQkJeworCQkJCWlmIChwZmlybXdhcmUtPmZpcm13YXJlX2J1Zl9zaXplW2luaXRfc3RlcF0gPT0gMCkgeworCQkJCQljb25zdCBjaGFyICpmd19uYW1lWzNdID0geyAiUlRMODE5MkUvYm9vdC5pbWciLAorCQkJCQkJCSAgICJSVEw4MTkyRS9tYWluLmltZyIsCisJCQkJCQkJICAgIlJUTDgxOTJFL2RhdGEuaW1nIgorCQkJCQkJCSB9OworCQkJCQljb25zdCBzdHJ1Y3QgZmlybXdhcmUJKmZ3X2VudHJ5OworCQkJCQlpbnQgcmM7CisJCQkJCXJjID0gcmVxdWVzdF9maXJtd2FyZSgmZndfZW50cnksCisJCQkJCSBmd19uYW1lW2luaXRfc3RlcF0sICZwcml2LT5wZGV2LT5kZXYpOworCQkJCQlpZiAocmMgPCAwKSB7CisJCQkJCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCAicmVxdWVzdCBmaXJtIgorCQkJCQkJICJ3YXJlIGZhaWwhXG4iKTsKKwkJCQkJCWdvdG8gZG93bmxvYWRfZmlybXdhcmVfZmFpbDsKKwkJCQkJfQorCQkJCQlpZiAoZndfZW50cnktPnNpemUgPgorCQkJCSAgICBzaXplb2YocGZpcm13YXJlLT5maXJtd2FyZV9idWZbaW5pdF9zdGVwXSkpIHsKKwkJCQkJCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsICJpbWcgZmlsZSBzaXplICIKKwkJCQkJCSAiZXhjZWVkIHRoZSBjb250YWluZXIgc3RydWN0ICIKKwkJCQkJCSAiYnVmZmVyIGZhaWwhXG4iKTsKKwkJCQkJCWdvdG8gZG93bmxvYWRfZmlybXdhcmVfZmFpbDsKKwkJCQkJfQorCisJCQkJCWlmIChpbml0X3N0ZXAgIT0gRldfSU5JVF9TVEVQMV9NQUlOKSB7CisJCQkJCQltZW1jcHkocGZpcm13YXJlLT5maXJtd2FyZV9idWZbaW5pdF9zdGVwXSwKKwkJCQkJICAgICAgIGZ3X2VudHJ5LT5kYXRhLCBmd19lbnRyeS0+c2l6ZSk7CisJCQkJCQlwZmlybXdhcmUtPmZpcm13YXJlX2J1Zl9zaXplW2luaXRfc3RlcF0gPQorCQkJCQkgICAgICAgZndfZW50cnktPnNpemU7CisKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW1lbXNldChwZmlybXdhcmUtPmZpcm13YXJlX2J1Zltpbml0X3N0ZXBdLAorCQkJCQkgICAgICAgMCwgMTI4KTsKKwkJCQkJCW1lbWNweSgmcGZpcm13YXJlLT5maXJtd2FyZV9idWZbaW5pdF9zdGVwXVsxMjhdLAorCQkJCQkgICAgICAgZndfZW50cnktPmRhdGEsIGZ3X2VudHJ5LT5zaXplKTsKKwkJCQkJCXBmaXJtd2FyZS0+ZmlybXdhcmVfYnVmX3NpemVbaW5pdF9zdGVwXSA9CisJCQkJCQkJIGZ3X2VudHJ5LT5zaXplICsgMTI4OworCQkJCQl9CisKKwkJCQkJaWYgKHJzdF9vcHQgPT0gT1BUX1NZU1RFTV9SRVNFVCkKKwkJCQkJCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOworCQkJCX0KKwkJCQltYXBwZWRfZmlsZSA9IHBmaXJtd2FyZS0+ZmlybXdhcmVfYnVmW2luaXRfc3RlcF07CisJCQkJZmlsZV9sZW5ndGggPSBwZmlybXdhcmUtPmZpcm13YXJlX2J1Zl9zaXplW2luaXRfc3RlcF07CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlIEZXX1NPVVJDRV9IRUFERVJfRklMRToKKwkJCQltYXBwZWRfZmlsZSA9ICBmaXJtd2FyZV9pbWdfYnVmW2luaXRfc3RlcF07CisJCQkJZmlsZV9sZW5ndGggID0gZmlybXdhcmVfaW1nX2xlbltpbml0X3N0ZXBdOworCQkJCWlmIChpbml0X3N0ZXAgPT0gRldfSU5JVF9TVEVQMl9EQVRBKSB7CisJCQkJCW1lbWNweShwZmlybXdhcmUtPmZpcm13YXJlX2J1Zltpbml0X3N0ZXBdLCBtYXBwZWRfZmlsZSwgZmlsZV9sZW5ndGgpOworCQkJCQlwZmlybXdhcmUtPmZpcm13YXJlX2J1Zl9zaXplW2luaXRfc3RlcF0gPSBmaWxlX2xlbmd0aDsKKwkJCQl9CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisKKworCQl9IGVsc2UgaWYgKHJzdF9vcHQgPT0gT1BUX0ZJUk1XQVJFX1JFU0VUKSB7CisJCQltYXBwZWRfZmlsZSA9IHBmaXJtd2FyZS0+ZmlybXdhcmVfYnVmW2luaXRfc3RlcF07CisJCQlmaWxlX2xlbmd0aCA9IHBmaXJtd2FyZS0+ZmlybXdhcmVfYnVmX3NpemVbaW5pdF9zdGVwXTsKKwkJfQorCisJCXJ0X3N0YXR1cyA9IGZ3X2Rvd25sb2FkX2NvZGUoZGV2LCBtYXBwZWRfZmlsZSwgZmlsZV9sZW5ndGgpOworCQlpZiAocnRfc3RhdHVzICE9IHRydWUpIHsKKwkJCWdvdG8gZG93bmxvYWRfZmlybXdhcmVfZmFpbDsKKwkJfQorCisJCWlmICghZmlybXdhcmVfY2hlY2tfcmVhZHkoZGV2LCBpbml0X3N0ZXApKSB7CisJCQlnb3RvIGRvd25sb2FkX2Zpcm13YXJlX2ZhaWw7CisJCX0KKwl9CisKKwlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCAiRmlybXdhcmUgRG93bmxvYWQgU3VjY2Vzc1xuIik7CisJcmV0dXJuIHJ0X3N0YXR1czsKKworZG93bmxvYWRfZmlybXdhcmVfZmFpbDoKKwlSVF9UUkFDRShDT01QX0VSUiwgIkVSUiBpbiAlcygpXG4iLCBfX2Z1bmNfXyk7CisJcnRfc3RhdHVzID0gZmFsc2U7CisJcmV0dXJuIHJ0X3N0YXR1czsKKworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9maXJtd2FyZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9maXJtd2FyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYTg3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2Zpcm13YXJlLmgKQEAgLTAsMCArMSw3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX19JTkNfRklSTVdBUkVfSAorI2RlZmluZSBfX0lOQ19GSVJNV0FSRV9ICisKKyNkZWZpbmUgUlRMODE5MF9DUFVfU1RBUlRfT0ZGU0VUCTB4ODAKKworI2RlZmluZSBHRVRfQ09NTUFORF9QQUNLRVRfRlJBR19USFJFU0hPTEQodikJKDQqKHYvNCkgLSA4KQorCitlbnVtIGZpcm13YXJlX2luaXRfc3RlcCB7CisJRldfSU5JVF9TVEVQMF9CT09UID0gMCwKKwlGV19JTklUX1NURVAxX01BSU4gPSAxLAorCUZXX0lOSVRfU1RFUDJfREFUQSA9IDIsCit9OworCitlbnVtIG9wdF9yc3RfdHlwZSB7CisJT1BUX1NZU1RFTV9SRVNFVCA9IDAsCisJT1BUX0ZJUk1XQVJFX1JFU0VUID0gMSwKK307CisKK2VudW0gZGVzY19wYWNrZXRfdHlwZSB7CisJREVTQ19QQUNLRVRfVFlQRV9JTklUID0gMCwKKwlERVNDX1BBQ0tFVF9UWVBFX05PUk1BTCA9IDEsCit9OworCitlbnVtIGZpcm13YXJlX3NvdXJjZSB7CisJRldfU09VUkNFX0lNR19GSUxFID0gMCwKKwlGV19TT1VSQ0VfSEVBREVSX0ZJTEUgPSAxLAorfTsKKworZW51bSBmaXJtd2FyZV9zdGF0dXMgeworCUZXX1NUQVRVU18wX0lOSVQgPSAwLAorCUZXX1NUQVRVU18xX01PVkVfQk9PVF9DT0RFID0gMSwKKwlGV19TVEFUVVNfMl9NT1ZFX01BSU5fQ09ERSA9IDIsCisJRldfU1RBVFVTXzNfVFVSTk9OX0NQVSA9IDMsCisJRldfU1RBVFVTXzRfTU9WRV9EQVRBX0NPREUgPSA0LAorCUZXX1NUQVRVU181X1JFQURZID0gNSwKK307CisKK3N0cnVjdCBmd19zZWdfY29udGFpbmVyIHsKKwl1MTYJc2VnX3NpemU7CisJdTgJKnNlZ19wdHI7Cit9OworCitzdHJ1Y3QgcnRfZmlybXdhcmUgeworCWVudW0gZmlybXdhcmVfc3RhdHVzIGZpcm13YXJlX3N0YXR1czsKKwl1MTYJCSAgY21kcGFja2V0X2ZyYWdfdGhyZXNvbGQ7CisjZGVmaW5lIFJUTDgxOTBfTUFYX0ZJUk1XQVJFX0NPREVfU0laRQk2NDAwMAorI2RlZmluZSBNQVhfRldfSU5JVF9TVEVQCQkzCisJdTggZmlybXdhcmVfYnVmW01BWF9GV19JTklUX1NURVBdW1JUTDgxOTBfTUFYX0ZJUk1XQVJFX0NPREVfU0laRV07CisJdTE2CQkgIGZpcm13YXJlX2J1Zl9zaXplW01BWF9GV19JTklUX1NURVBdOworfTsKKworYm9vbCBpbml0X2Zpcm13YXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgZmlybXdhcmVfaW5pdF9wYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2h3LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2h3LmgKaW5kZXggMjRlNzMwMy4uNDNjM2ZiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9ody5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfaHcuaApAQCAtMSw0OSArMSwzNiBAQAotLyoKLQlUaGlzIGlzIHBhcnQgb2YgcnRsODE4NyBPcGVuU291cmNlIGRyaXZlci4KLQlDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQtMjAwNSAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgotCVJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0JUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBHUEwgcGFydCBvZiB0aGUKLQlvZmZpY2lhbCBSZWFsdGVrIGRyaXZlci4KLQlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uCi0JZnJvbSBQYXRyaWMgU2NoZW5rZSAmIEFuZHJlcyBTYWxvbW9uLgotCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzCi0JMjEwMCBHUEwgZHJpdmVyLgogCi0JV2Ugd2FudCB0byB0YW5rcyB0aGUgQXV0aG9ycyBvZiB0aG9zZSBwcm9qZWN0cwotCWFuZCB0aGUgTmRpc3dyYXBwZXIgcHJvamVjdCBBdXRob3JzLgotKi8KLQotLyogTWFyaXVzeiBNYXR1c3playBhZGRlZCBmdWxsIHJlZ2lzdGVycyBkZWZpbml0aW9uIHdpdGggUmVhbHRlaydzIG5hbWUgKi8KLQotLyogdGhpcyBmaWxlIGNvbnRhaW5zIHJlZ2lzdGVyIGRlZmluaXRpb25zIGZvciB0aGUgcnRsODE4NyBNQUMgY29udHJvbGxlciAqLwogI2lmbmRlZiBSODE4MF9IVwogI2RlZmluZSBSODE4MF9IVwogCi10eXBlZGVmIGVudW0gX1ZFUlNJT05fODE5MHsKLQlWRVJTSU9OXzgxOTBfQkQ9MHgzLAotCVZFUlNJT05fODE5MF9CRQotfVZFUlNJT05fODE5MCwqUFZFUlNJT05fODE5MDsKLS8vYWRkZWQgZm9yIGRpZmZlcmVudCBSRiB0eXBlCi10eXBlZGVmIGVudW0gX1JUX1JGX1RZUEVfREVGCi17Ci0JUkZfMVQyUiA9IDAsCi0JUkZfMlQ0UiwKLQotCVJGXzgxOVhfTUFYX1RZUEUKLX1SVF9SRl9UWVBFX0RFRjsKLQotdHlwZWRlZiBlbnVtIF9CYXNlQmFuZF9Db25maWdfVHlwZXsKLQlCYXNlQmFuZF9Db25maWdfUEhZX1JFRyA9IDAsCQkJLy9SYWRpbyBQYXRoIEEKLQlCYXNlQmFuZF9Db25maWdfQUdDX1RBQiA9IDEsCQkJLy9SYWRpbyBQYXRoIEIKLX1CYXNlQmFuZF9Db25maWdfVHlwZSwgKlBCYXNlQmFuZF9Db25maWdfVHlwZTsKK2VudW0gYmFzZWJhbmRfY29uZmlnIHsKKwlCYXNlQmFuZF9Db25maWdfUEhZX1JFRyA9IDAsCisJQmFzZUJhbmRfQ29uZmlnX0FHQ19UQUIgPSAxLAorfTsKIAogI2RlZmluZQlSVEw4MTg3X1JFUVRfUkVBRAkweGMwCiAjZGVmaW5lCVJUTDgxODdfUkVRVF9XUklURQkweDQwCiAjZGVmaW5lCVJUTDgxODdfUkVRX0dFVF9SRUdTCTB4MDUKICNkZWZpbmUJUlRMODE4N19SRVFfU0VUX1JFR1MJMHgwNQogCi0jZGVmaW5lIFI4MTgwX01BWF9SRVRSWSAyNTUKICNkZWZpbmUgTUFYX1RYX1VSQiA1CiAjZGVmaW5lIE1BWF9SWF9VUkIgMTYKICNkZWZpbmUgUlhfVVJCX1NJWkUgOTEwMApAQCAtNjUsMTQgKzUyLDE0IEBACiAjZGVmaW5lIEVFUFJPTV9UeFBvd2VyRGlmZgkweDFGCiAKIAotI2RlZmluZSBFRVBST01fUHdEaWZmCQkweDIxCS8vMHgyMQotI2RlZmluZSBFRVBST01fQ3J5c3RhbENhcAkweDIyCS8vMHgyMgorI2RlZmluZSBFRVBST01fUHdEaWZmCQkweDIxCisjZGVmaW5lIEVFUFJPTV9DcnlzdGFsQ2FwCTB4MjIKIAogCiAKLSNkZWZpbmUgRUVQUk9NX1R4UHdJbmRleF9DQ0tfVjEJCTB4MjkJLy8weDI5fjB4MkIKLSNkZWZpbmUgRUVQUk9NX1R4UHdJbmRleF9PRkRNXzI0R19WMQkweDJDCS8vMHgyQ34weDJFCi0jZGVmaW5lIEVFUFJPTV9UeFB3SW5kZXhfVmVyCQkweDI3CS8vMHgyNworI2RlZmluZSBFRVBST01fVHhQd0luZGV4X0NDS19WMQkJMHgyOQorI2RlZmluZSBFRVBST01fVHhQd0luZGV4X09GRE1fMjRHX1YxCTB4MkMKKyNkZWZpbmUgRUVQUk9NX1R4UHdJbmRleF9WZXIJCTB4MjcKIAogI2RlZmluZSBFRVBST01fRGVmYXVsdF9UeFBvd2VyRGlmZgkJMHgwCiAjZGVmaW5lIEVFUFJPTV9EZWZhdWx0X1RoZXJtYWxNZXRlcgkJMHg3NwpAQCAtODEsNDIgKzY4LDM1IEBACiAjZGVmaW5lIEVFUFJPTV9EZWZhdWx0X1B3RGlmZgkJCTB4NAogI2RlZmluZSBFRVBST01fRGVmYXVsdF9DcnlzdGFsQ2FwCQkweDUKICNkZWZpbmUgRUVQUk9NX0RlZmF1bHRfVHhQb3dlcgkJCTB4MTAxMAotI2RlZmluZSBFRVBST01fSUNWZXJzaW9uX0NoYW5uZWxQbGFuCTB4N0MJLy8weDdDOkNoYW5uZWxQbGFuLCAweDdEOklDX1ZlcnNpb24KLSNkZWZpbmUgRUVQUk9NX0N1c3RvbWVyX0lECQkJMHg3QgkvLzB4N0I6Q3VzdG9tZXJJRAotCisjZGVmaW5lIEVFUFJPTV9JQ1ZlcnNpb25fQ2hhbm5lbFBsYW4JMHg3QworI2RlZmluZSBFRVBST01fQ3VzdG9tZXJfSUQJCQkweDdCCiAjZGVmaW5lIEVFUFJPTV9SRkluZF9Qb3dlckRpZmYJCQkweDI4CiAjZGVmaW5lIEVFUFJPTV9UaGVybWFsTWV0ZXIJCQkweDI5Ci0jZGVmaW5lIEVFUFJPTV9UeFB3RGlmZl9DcnlzdGFsQ2FwCQkweDJBCS8vMHgyQX4weDJCCi0jZGVmaW5lIEVFUFJPTV9UeFB3SW5kZXhfQ0NLCQkJMHgyQwkvLzB4MjMKLSNkZWZpbmUgRUVQUk9NX1R4UHdJbmRleF9PRkRNXzI0RwkweDNBCS8vMHgyNH4weDI2Ci0KKyNkZWZpbmUgRUVQUk9NX1R4UHdEaWZmX0NyeXN0YWxDYXAJCTB4MkEKKyNkZWZpbmUgRUVQUk9NX1R4UHdJbmRleF9DQ0sJCQkweDJDCisjZGVmaW5lIEVFUFJPTV9UeFB3SW5kZXhfT0ZETV8yNEcJMHgzQQogI2RlZmluZSBFRVBST01fRGVmYXVsdF9UeFBvd2VyTGV2ZWwJCTB4MTAKLQotI2RlZmluZSBFRVBST01fSUNfVkVSCQkJCTB4N2QJLy8weDdECi0jZGVmaW5lIEVFUFJPTV9DUkMJCQkJMHg3ZQkvLzB4N0V+MHg3RgorI2RlZmluZSBFRVBST01fSUNfVkVSCQkJCTB4N2QKKyNkZWZpbmUgRUVQUk9NX0NSQwkJCQkweDdlCiAKICNkZWZpbmUgRUVQUk9NX0NJRF9ERUZBVUxUCQkJMHgwCiAjZGVmaW5lIEVFUFJPTV9DSURfQ0FNRU8JCQkJMHgxCiAjZGVmaW5lIEVFUFJPTV9DSURfUlVOVE9QCQkJCTB4MgogI2RlZmluZSBFRVBST01fQ0lEX1NlbmFvCQkJCTB4MwotI2RlZmluZSBFRVBST01fQ0lEX1RPU0hJQkEJCQkJMHg0CS8vIFRvc2hpYmEgc2V0dGluZywgTWVyZ2UgYnkgSmFja2VuLCAyMDA4LzAxLzMxCisjZGVmaW5lIEVFUFJPTV9DSURfVE9TSElCQQkJCQkweDQKICNkZWZpbmUgRUVQUk9NX0NJRF9OZXRDb3JlCQkJCTB4NQogI2RlZmluZSBFRVBST01fQ0lEX05ldHRyb25peAkJCTB4NgogI2RlZmluZSBFRVBST01fQ0lEX1Byb25ldAkJCQkweDcKICNkZWZpbmUgRUVQUk9NX0NJRF9ETElOSwkJCQkweDgKLSNkZWZpbmUgRUVQUk9NX0NJRF9XSFFMIAkJCQkweEZFICAvL2FkZGVkIGJ5IHNoZXJyeSBmb3IgZHRtLCAyMDA4MDcyOAotCisjZGVmaW5lIEVFUFJPTV9DSURfV0hRTAkJCQkJMHhGRQogZW51bSBfUlRMODE5MlBjaV9IVyB7Ci0JTUFDMCAJCQk9IDB4MDAwLAotCU1BQzEgCQkJPSAweDAwMSwKLQlNQUMyIAkJCT0gMHgwMDIsCi0JTUFDMyAJCQk9IDB4MDAzLAotCU1BQzQgCQkJPSAweDAwNCwKLQlNQUM1IAkJCT0gMHgwMDUsCi0JUENJRgkJCT0gMHgwMDksIC8vIFBDSSBGdW5jdGlvbiBSZWdpc3RlciAweDAwMDlofjB4MDAwYmgKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gICAgICAgODE5MCBQQ0lGIGJpdHMJCQkJCQkJKE9mZnNldCAweDAwOS0wMDBiLCAyNGJpdCkKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU1BQzAJCQk9IDB4MDAwLAorCU1BQzEJCQk9IDB4MDAxLAorCU1BQzIJCQk9IDB4MDAyLAorCU1BQzMJCQk9IDB4MDAzLAorCU1BQzQJCQk9IDB4MDA0LAorCU1BQzUJCQk9IDB4MDA1LAorCVBDSUYJCQk9IDB4MDA5LAogI2RlZmluZSBNWERNQTJfMTZieXRlcwkJMHgwMDAKICNkZWZpbmUgTVhETUEyXzMyYnl0ZXMJCTB4MDAxCiAjZGVmaW5lIE1YRE1BMl82NGJ5dGVzCQkweDAxMApAQCAtMTI5LDggKzEwOSw4IEBACiAjZGVmaW5lCU1VTFJXX1NISUZUCQkzCiAjZGVmaW5lCU1YRE1BMl9SWF9TSElGVAkJNAogI2RlZmluZQlNWERNQTJfVFhfU0hJRlQJCTAKLSAgICAgICAgUE1SICAgICAgICAgICAgICAgICAgICAgPSAweDAwYywgLy8gUG93ZXIgbWFuYWdlbWVudCByZWdpc3RlcgotCUVQUk9NX0NNRCAJCT0gMHgwMGUsCisJUE1SCQkJPSAweDAwYywKKwlFUFJPTV9DTUQJCT0gMHgwMGUsCiAjZGVmaW5lIEVQUk9NX0NNRF9SRVNFUlZFRF9NQVNLIEJJVDUKICNkZWZpbmUgRVBST01fQ01EXzkzNTZTRUwJQklUNAogI2RlZmluZSBFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfU0hJRlQgNgpAQCAtMTUxLDcxICsxMzEsNjYgQEAKIAogCUFOQVBBUgkJCT0gMHgxNywKICNkZWZpbmUJQkJfR0xPQkFMX1JFU0VUX0JJVAkweDEKLQlCQl9HTE9CQUxfUkVTRVQJCT0gMHgwMjAsIC8vIEJhc2ViYW5kR2xvYmFsIFJlc2V0IFJlZ2lzdGVyCi0JQlNTSURSCQkJPSAweDAyRSwgLy8gQlNTSUQgUmVnaXN0ZXIKLQlDTURSCQkJPSAweDAzNywgLy8gQ29tbWFuZCByZWdpc3RlcgotI2RlZmluZSAJQ1JfUlNUCQkJCQkweDEwCi0jZGVmaW5lIAlDUl9SRQkJCQkJMHgwOAotI2RlZmluZSAJQ1JfVEUJCQkJCTB4MDQKLSNkZWZpbmUgCUNSX011bFJXCQkJCTB4MDEKLQlTSUZTCQk9IDB4MDNFLAkvLyBTSUZTIHJlZ2lzdGVyCi0JVENSCQkJPSAweDA0MCwgLy8gVHJhbnNtaXQgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgotCVJDUgkJCT0gMHgwNDQsIC8vIFJlY2VpdmUgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLy8vICAgICAgIDgxOTAgKFJDUikgUmVjZWl2ZSBDb25maWd1cmF0aW9uIFJlZ2lzdGVyCShPZmZzZXQgMHg0NH40NywgMzIgYml0KQotLy8vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNkZWZpbmUgUkNSX0ZJTFRFUl9NQVNLIChCSVQwfEJJVDF8QklUMnxCSVQzfEJJVDV8QklUMTJ8QklUMTh8QklUMTl8QklUMjB8QklUMjF8QklUMjJ8QklUMjMpCi0jZGVmaW5lIFJDUl9PTkxZRVJMUEtUCQlCSVQzMQkJCS8vIEVhcmx5IFJlY2VpdmluZyBiYXNlZCBvbiBQYWNrZXQgU2l6ZS4KLSNkZWZpbmUgUkNSX0VOQ1MyCQlCSVQzMAkJCQkvLyBFbmFibGUgQ2FycmllciBTZW5zZSBEZXRlY3Rpb24gTWV0aG9kIDIKLSNkZWZpbmUgUkNSX0VOQ1MxCQlCSVQyOQkJCQkvLyBFbmFibGUgQ2FycmllciBTZW5zZSBEZXRlY3Rpb24gTWV0aG9kIDEKLSNkZWZpbmUgUkNSX0VOTUJJRAkJQklUMjcJCQkJLy8gRW5hYmxlIE11bHRpcGxlIEJzc0lkLgotI2RlZmluZSBSQ1JfQUNLVFhCVwkJKEJJVDI0fEJJVDI1KQkJLy8gVFhCVyBTZXR0aW5nIG9mIEFDSyBmcmFtZXMKLSNkZWZpbmUgUkNSX0NCU1NJRAkJQklUMjMJCQkJLy8gQWNjZXB0IEJTU0lEIG1hdGNoIHBhY2tldAotI2RlZmluZSBSQ1JfQVBXUk1HVAkJQklUMjIJCQkJLy8gQWNjZXB0IHBvd2VyIG1hbmFnZW1lbnQgcGFja2V0Ci0jZGVmaW5lCVJDUl9BREQzCQlCSVQyMQkJCS8vIEFjY2VwdCBhZGRyZXNzIDMgbWF0Y2ggcGFja2V0Ci0jZGVmaW5lIFJDUl9BTUYJCQlCSVQyMAkJCQkvLyBBY2NlcHQgbWFuYWdlbWVudCB0eXBlIGZyYW1lCi0jZGVmaW5lIFJDUl9BQ0YJCQlCSVQxOQkJCQkvLyBBY2NlcHQgY29udHJvbCB0eXBlIGZyYW1lCi0jZGVmaW5lIFJDUl9BREYJCQlCSVQxOAkJCQkvLyBBY2NlcHQgZGF0YSB0eXBlIGZyYW1lCi0jZGVmaW5lIFJDUl9SWEZUSAkJQklUMTMJLy8gUnggRklGTyBUaHJlc2hvbGQKLSNkZWZpbmUgUkNSX0FJQ1YJCUJJVDEyCQkJCS8vIEFjY2VwdCBJQ1YgZXJyb3IgcGFja2V0Ci0jZGVmaW5lCVJDUl9BQ1JDMzIJCUJJVDUJCQkvLyBBY2NlcHQgQ1JDMzIgZXJyb3IgcGFja2V0Ci0jZGVmaW5lCVJDUl9BQgkJCUJJVDMJCQkvLyBBY2NlcHQgYnJvYWRjYXN0IHBhY2tldAotI2RlZmluZQlSQ1JfQU0JCQlCSVQyCQkJLy8gQWNjZXB0IG11bHRpY2FzdCBwYWNrZXQKLSNkZWZpbmUJUkNSX0FQTQkJCUJJVDEJCQkvLyBBY2NlcHQgcGh5c2ljYWwgbWF0Y2ggcGFja2V0Ci0jZGVmaW5lCVJDUl9BQVAJCQlCSVQwCQkJLy8gQWNjZXB0IGFsbCB1bmljYXN0IHBhY2tldAorCUJCX0dMT0JBTF9SRVNFVAkJPSAweDAyMCwKKwlCU1NJRFIJCQk9IDB4MDJFLAorCUNNRFIJCQk9IDB4MDM3LAorI2RlZmluZQkJQ1JfUlNUCQkJCQkweDEwCisjZGVmaW5lCQlDUl9SRQkJCQkJMHgwOAorI2RlZmluZQkJQ1JfVEUJCQkJCTB4MDQKKyNkZWZpbmUJCUNSX011bFJXCQkJCTB4MDEKKwlTSUZTCQk9IDB4MDNFLAorCVRDUgkJCT0gMHgwNDAsCisJUkNSCQkJPSAweDA0NCwKKyNkZWZpbmUgUkNSX0ZJTFRFUl9NQVNLIChCSVQwIHwgQklUMSB8IEJJVDIgfCBCSVQzIHwgQklUNSB8IEJJVDEyIHwJXAorCQkJQklUMTggfCBCSVQxOSB8IEJJVDIwIHwgQklUMjEgfCBCSVQyMiB8IEJJVDIzKQorI2RlZmluZSBSQ1JfT05MWUVSTFBLVAkJQklUMzEKKyNkZWZpbmUgUkNSX0VOQ1MyCQlCSVQzMAorI2RlZmluZSBSQ1JfRU5DUzEJCUJJVDI5CisjZGVmaW5lIFJDUl9FTk1CSUQJCUJJVDI3CisjZGVmaW5lIFJDUl9BQ0tUWEJXCQkoQklUMjR8QklUMjUpCisjZGVmaW5lIFJDUl9DQlNTSUQJCUJJVDIzCisjZGVmaW5lIFJDUl9BUFdSTUdUCQlCSVQyMgorI2RlZmluZQlSQ1JfQUREMwkJQklUMjEKKyNkZWZpbmUgUkNSX0FNRgkJCUJJVDIwCisjZGVmaW5lIFJDUl9BQ0YJCQlCSVQxOQorI2RlZmluZSBSQ1JfQURGCQkJQklUMTgKKyNkZWZpbmUgUkNSX1JYRlRICQlCSVQxMworI2RlZmluZSBSQ1JfQUlDVgkJQklUMTIKKyNkZWZpbmUJUkNSX0FDUkMzMgkJQklUNQorI2RlZmluZQlSQ1JfQUIJCQlCSVQzCisjZGVmaW5lCVJDUl9BTQkJCUJJVDIKKyNkZWZpbmUJUkNSX0FQTQkJCUJJVDEKKyNkZWZpbmUJUkNSX0FBUAkJCUJJVDAKICNkZWZpbmUgUkNSX01YRE1BX09GRlNFVAk4CiAjZGVmaW5lIFJDUl9GSUZPX09GRlNFVAkJMTMKLQlTTE9UX1RJTUUJCT0gMHgwNDksIC8vIFNsb3QgVGltZSBSZWdpc3RlcgotCUFDS19USU1FT1VUCQk9IDB4MDRjLCAvLyBBY2sgVGltZW91dCBSZWdpc3RlcgotCVBJRlNfVElNRQkJPSAweDA0ZCwgLy8gUElGUyB0aW1lCi0JVVNUSU1FCQkJPSAweDA0ZSwgLy8gTWljcm9zZWNvbmQgVHVuaW5nIFJlZ2lzdGVyLCBTZXRzIHRoZSBtaWNyb3NlY29uZCB0aW1lIHVuaXQgdXNlZCBieSBNQUMgY2xvY2suCi0JRURDQVBBUkFfQkUJCT0gMHgwNTAsIC8vIEVEQ0EgUGFyYW1ldGVyIG9mIEFDIEJFCi0JRURDQVBBUkFfQksJCT0gMHgwNTQsIC8vIEVEQ0EgUGFyYW1ldGVyIG9mIEFDIEJLCi0JRURDQVBBUkFfVk8JCT0gMHgwNTgsIC8vIEVEQ0EgUGFyYW1ldGVyIG9mIEFDIFZPCi0JRURDQVBBUkFfVkkJCT0gMHgwNUMsIC8vIEVEQ0EgUGFyYW1ldGVyIG9mIEFDIFZJCisJU0xPVF9USU1FCQk9IDB4MDQ5LAorCUFDS19USU1FT1VUCQk9IDB4MDRjLAorCVBJRlNfVElNRQkJPSAweDA0ZCwKKwlVU1RJTUUJCQk9IDB4MDRlLAorCUVEQ0FQQVJBX0JFCQk9IDB4MDUwLAorCUVEQ0FQQVJBX0JLCQk9IDB4MDU0LAorCUVEQ0FQQVJBX1ZPCQk9IDB4MDU4LAorCUVEQ0FQQVJBX1ZJCQk9IDB4MDVDLAogI2RlZmluZQlBQ19QQVJBTV9UWE9QX0xJTUlUX09GRlNFVAkJMTYKICNkZWZpbmUJQUNfUEFSQU1fRUNXX01BWF9PRkZTRVQJCTEyCiAjZGVmaW5lCUFDX1BBUkFNX0VDV19NSU5fT0ZGU0VUCQkJOAogI2RlZmluZQlBQ19QQVJBTV9BSUZTX09GRlNFVAkJCQkwCi0JUkZQQwkJCT0gMHgwNUYsIC8vIFJ4IEZJRk8gUGFja2V0IENvdW50Ci0JQ1dSUgkJCT0gMHgwNjAsIC8vIENvbnRlbnRpb24gV2luZG93IFJlcG9ydCBSZWdpc3RlcgotCUJDTl9UQ0ZHCQk9IDB4MDYyLCAvLyBCZWFjb24gVGltZSBDb25maWd1cmF0aW9uCisJUkZQQwkJCT0gMHgwNUYsCisJQ1dSUgkJCT0gMHgwNjAsCisJQkNOX1RDRkcJCT0gMHgwNjIsCiAjZGVmaW5lIEJDTl9UQ0ZHX0NXX1NISUZUCQk4CiAjZGVmaW5lIEJDTl9UQ0ZHX0lGUwkJCTAKLQlCQ05fSU5URVJWQUwJCT0gMHgwNzAsIC8vIEJlYWNvbiBJbnRlcnZhbCAoVFUpCi0JQVRJTVdORAkJCT0gMHgwNzIsIC8vIEFUSU0gV2luZG93IFNpemUgKFRVKQotCUJDTl9EUlZfRUFSTFlfSU5UCT0gMHgwNzQsIC8vIERyaXZlciBFYXJseSBJbnRlcnJ1cHQgVGltZSAoVFUpLiBUaW1lIHRvIHNlbmQgaW50ZXJydXB0IHRvIG5vdGlmeSB0byBjaGFuZ2UgYmVhY29uIGNvbnRlbnQgYmVmb3JlIFRCVFQKKwlCQ05fSU5URVJWQUwJCT0gMHgwNzAsCisJQVRJTVdORAkJCT0gMHgwNzIsCisJQkNOX0RSVl9FQVJMWV9JTlQJPSAweDA3NCwKICNkZWZpbmUJQkNOX0RSVl9FQVJMWV9JTlRfU1dCQ05fU0hJRlQJOAogI2RlZmluZQlCQ05fRFJWX0VBUkxZX0lOVF9USU1FX1NISUZUCTAKLQlCQ05fRE1BVElNRQkJPSAweDA3NiwgLy8gQmVhY29uIERNQSBhbmQgQVRJTSBpbnRlcnJ1cHQgdGltZSAoVVMpLiBJbmRpY2F0ZXMgdGhlIHRpbWUgYmVmb3JlIFRCVFQgdG8gcGVyZm9ybSBiZWFjb24gcXVldWUgRE1BCi0JQkNOX0VSUl9USFJFU0gJCT0gMHgwNzgsIC8vIEJlYWNvbiBFcnJvciBUaHJlc2hvbGQKLQlSV0NBTQkJCT0gMHgwQTAsIC8vSU4gODE5MCBEYXRhIFNoZWV0IGlzIGNhbGxlZCBDQU1jbWQKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLy8vICAgICAgIDgxOTAgQ0FNIENvbW1hbmQgUmVnaXN0ZXIgICAgIAkJKG9mZnNldCAweEEwLCA0IGJ5dGUpCi0JLy8vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNkZWZpbmUgICBDQU1fQ01fU2VjQ0FNUG9sbGluZwkJQklUMzEJCS8vU2VjdXJpdHkgQ0FNIFBvbGxpbmcKLSNkZWZpbmUgICBDQU1fQ01fU2VjQ0FNQ2xyCQkJQklUMzAJCS8vQ2xlYXIgYWxsIGJpdHMgaW4gQ0FNCi0jZGVmaW5lICAgQ0FNX0NNX1NlY0NBTVdFCQkJQklUMTYJCS8vU2VjdXJpdHkgQ0FNIGVuYWJsZQorCUJDTl9ETUFUSU1FCQk9IDB4MDc2LAorCUJDTl9FUlJfVEhSRVNICQk9IDB4MDc4LAorCVJXQ0FNCQkJPSAweDBBMCwKKyNkZWZpbmUgICBDQU1fQ01fU2VjQ0FNUG9sbGluZwkJQklUMzEKKyNkZWZpbmUgICBDQU1fQ01fU2VjQ0FNQ2xyCQkJQklUMzAKKyNkZWZpbmUgICBDQU1fQ01fU2VjQ0FNV0UJCQlCSVQxNgogI2RlZmluZSAgIENBTV9WQUxJRAkJCSAgICAgICBCSVQxNQogI2RlZmluZSAgIENBTV9OT1RWQUxJRAkJCTB4MDAwMAogI2RlZmluZSAgIENBTV9VU0VESwkJCQlCSVQ1CkBAIC0yMzQsNjggKzIwOSw2MiBAQAogI2RlZmluZSAgIENBTV9SRUFECQkweDAwMDAwMDAwCiAjZGVmaW5lICAgQ0FNX1BPTExJTklHCQlCSVQzMQogI2RlZmluZSAgIFNDUl9Vc2VESwkJMHgwMQotCVdDQU1JCQkJPSAweDBBNCwgLy8gU29mdHdhcmUgd3JpdGUgQ0FNIGlucHV0IGNvbnRlbnQKLQlSQ0FNTwkJCT0gMHgwQTgsIC8vIFNvZnR3YXJlIHJlYWQvd3JpdGUgQ0FNIGNvbmZpZwotCVNFQ1IJCQk9IDB4MEIwLCAvL1NlY3VyaXR5IENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKLSNkZWZpbmUJU0NSX1R4VXNlREsJCQlCSVQwCQkJLy9Gb3JjZSBUeCBVc2UgRGVmYXVsdCBLZXkKLSNkZWZpbmUgICBTQ1JfUnhVc2VESwkJCUJJVDEJCQkvL0ZvcmNlIFJ4IFVzZSBEZWZhdWx0IEtleQotI2RlZmluZSAgIFNDUl9UeEVuY0VuYWJsZQkJQklUMgkJCS8vRW5hYmxlIFR4IEVuY3J5cHRpb24KLSNkZWZpbmUgICBTQ1JfUnhEZWNFbmFibGUJCUJJVDMJCQkvL0VuYWJsZSBSeCBEZWNyeXB0aW9uCi0jZGVmaW5lICAgU0NSX1NLQnlBMgkJCQlCSVQ0CQkJLy9TZWFyY2gga0VZIEJZIEEyCi0jZGVmaW5lICAgU0NSX05vU0tNQwkJCQlCSVQ1CQkJLy9ObyBLZXkgU2VhcmNoIGZvciBNdWx0aWNhc3QKLQlTV1JFR1VMQVRPUgk9IDB4MEJELAkvLyBTd2l0Y2hpbmcgUmVndWxhdG9yCi0JSU5UQV9NQVNLIAkJPSAweDBmNCwKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gICAgICAgODE5MCBJTVIvSVNSIGJpdHMJCQkJCQkob2Zmc2V0IDB4ZmQsICA4Yml0cykKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVdDQU1JCQkJPSAweDBBNCwKKwlSQ0FNTwkJCT0gMHgwQTgsCisJU0VDUgkJCT0gMHgwQjAsCisjZGVmaW5lCVNDUl9UeFVzZURLCQkJQklUMAorI2RlZmluZSAgIFNDUl9SeFVzZURLCQkJQklUMQorI2RlZmluZSAgIFNDUl9UeEVuY0VuYWJsZQkJQklUMgorI2RlZmluZSAgIFNDUl9SeERlY0VuYWJsZQkJQklUMworI2RlZmluZSAgIFNDUl9TS0J5QTIJCQkJQklUNAorI2RlZmluZSAgIFNDUl9Ob1NLTUMJCQkJQklUNQorCVNXUkVHVUxBVE9SCT0gMHgwQkQsCisJSU5UQV9NQVNLCQk9IDB4MGY0LAogI2RlZmluZSBJTVI4MTkwX0RJU0FCTEVECQkweDAKLSNkZWZpbmUgSU1SX0FUSU1FTkQJCQlCSVQyOAkJCS8vIEFUSU0gV2luZG93IEVuZCBJbnRlcnJ1cHQKLSNkZWZpbmUgSU1SX1RCRE9LCQkJQklUMjcJCQkvLyBUcmFuc21pdCBCZWFjb24gT0sgSW50ZXJydXB0Ci0jZGVmaW5lIElNUl9UQkRFUgkJCUJJVDI2CQkJLy8gVHJhbnNtaXQgQmVhY29uIEVycm9yIEludGVycnVwdAotI2RlZmluZSBJTVJfVFhGT1ZXCQkJQklUMTUJCQkvLyBUcmFuc21pdCBGSUZPIE92ZXJmbG93Ci0jZGVmaW5lIElNUl9USU1FT1VUMAkJCUJJVDE0CQkJLy8gVGltZU91dDAKLSNkZWZpbmUgSU1SX0JjbkludAkJCUJJVDEzCQkJLy8gQmVhY29uIERNQSBJbnRlcnJ1cHQgMAotI2RlZmluZQlJTVJfUlhGT1ZXCQkJQklUMTIJCQkvLyBSZWNlaXZlIEZJRk8gT3ZlcmZsb3cKLSNkZWZpbmUgSU1SX1JEVQkJCQlCSVQxMQkJCS8vIFJlY2VpdmUgRGVzY3JpcHRvciBVbmF2YWlsYWJsZQotI2RlZmluZSBJTVJfUlhDTURPSwkJCUJJVDEwCQkJLy8gUmVjZWl2ZSBDb21tYW5kIFBhY2tldCBPSwotI2RlZmluZSBJTVJfQkRPSwkJCUJJVDkJCQkvLyBCZWFjb24gUXVldWUgRE1BIE9LIEludGVycnVwCi0jZGVmaW5lIElNUl9ISUdIRE9LCQkJQklUOAkJCS8vIEhpZ2ggUXVldWUgRE1BIE9LIEludGVycnVwdAotI2RlZmluZQlJTVJfQ09NRE9LCQkJQklUNwkJCS8vIENvbW1hbmQgUXVldWUgRE1BIE9LIEludGVycnVwdAotI2RlZmluZSBJTVJfTUdOVERPSwkJCUJJVDYJCQkvLyBNYW5hZ2VtZW50IFF1ZXVlIERNQSBPSyBJbnRlcnJ1cHQKLSNkZWZpbmUgSU1SX0hDQ0FET0sJCQlCSVQ1CQkJLy8gSENDQSBRdWV1ZSBETUEgT0sgSW50ZXJydXB0Ci0jZGVmaW5lCUlNUl9CS0RPSwkJCUJJVDQJCQkvLyBBQ19CSyBETUEgT0sgSW50ZXJydXB0Ci0jZGVmaW5lCUlNUl9CRURPSwkJCUJJVDMJCQkvLyBBQ19CRSBETUEgT0sgSW50ZXJydXB0Ci0jZGVmaW5lCUlNUl9WSURPSwkJCUJJVDIJCQkvLyBBQ19WSSBETUEgT0sgSW50ZXJydXB0Ci0jZGVmaW5lCUlNUl9WT0RPSwkJCUJJVDEJCQkvLyBBQ19WTyBETUEgSW50ZXJydXB0Ci0jZGVmaW5lCUlNUl9ST0sJCQkJQklUMAkJCS8vIFJlY2VpdmUgRE1BIE9LIEludGVycnVwdAotCUlTUgkJCT0gMHgwZjgsIC8vIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIKLQlUUFBvbGwJCQk9IDB4MGZkLCAvLyBUcmFuc21pdCBwcmlvcml0eSBwb2xsaW5nIHJlZ2lzdGVyCi0jZGVmaW5lIFRQUG9sbF9CS1EJCUJJVDAJCQkJLy8gQksgcXVldWUgcG9sbGluZwotI2RlZmluZSBUUFBvbGxfQkVRCQlCSVQxCQkJCS8vIEJFIHF1ZXVlIHBvbGxpbmcKLSNkZWZpbmUgVFBQb2xsX1ZJUQkJQklUMgkJCQkvLyBWSSBxdWV1ZSBwb2xsaW5nCi0jZGVmaW5lIFRQUG9sbF9WT1EJCUJJVDMJCQkJLy8gVk8gcXVldWUgcG9sbGluZwotI2RlZmluZSBUUFBvbGxfQlEJCUJJVDQJCQkJLy8gQmVhY29uIHF1ZXVlIHBvbGxpbmcKLSNkZWZpbmUgVFBQb2xsX0NRCQlCSVQ1CQkJCS8vIENvbW1hbmQgcXVldWUgcG9sbGluZwotI2RlZmluZSBUUFBvbGxfTVEJCUJJVDYJCQkJLy8gTWFuYWdlbWVudCBxdWV1ZSBwb2xsaW5nCi0jZGVmaW5lIFRQUG9sbF9IUQkJQklUNwkJCQkvLyBIaWdoIHF1ZXVlIHBvbGxpbmcKLSNkZWZpbmUgVFBQb2xsX0hDQ0FRCQlCSVQ4CQkJCS8vIEhDQ0EgcXVldWUgcG9sbGluZwotI2RlZmluZSBUUFBvbGxfU3RvcEJLCUJJVDkJCQkJLy8gU3RvcCBCSyBxdWV1ZQotI2RlZmluZSBUUFBvbGxfU3RvcEJFCUJJVDEwCQkJLy8gU3RvcCBCRSBxdWV1ZQotI2RlZmluZSBUUFBvbGxfU3RvcFZJCQlCSVQxMQkJCS8vIFN0b3AgVkkgcXVldWUKLSNkZWZpbmUgVFBQb2xsX1N0b3BWTwlCSVQxMgkJCS8vIFN0b3AgVk8gcXVldWUKLSNkZWZpbmUgVFBQb2xsX1N0b3BNZ3QJQklUMTMJCQkvLyBTdG9wIE1nbnQgcXVldWUKLSNkZWZpbmUgVFBQb2xsX1N0b3BIaWdoCUJJVDE0CQkJLy8gU3RvcCBIaWdoIHF1ZXVlCi0jZGVmaW5lIFRQUG9sbF9TdG9wSENDQQlCSVQxNQkJCS8vIFN0b3AgSENDQSBxdWV1ZQotI2RlZmluZSBUUFBvbGxfU0hJRlQJCTgJCQkJLy8gUXVldWUgSUQgbWFwcGluZworI2RlZmluZSBJTVJfQVRJTUVORAkJCUJJVDI4CisjZGVmaW5lIElNUl9UQkRPSwkJCUJJVDI3CisjZGVmaW5lIElNUl9UQkRFUgkJCUJJVDI2CisjZGVmaW5lIElNUl9UWEZPVlcJCQlCSVQxNQorI2RlZmluZSBJTVJfVElNRU9VVDAJCQlCSVQxNAorI2RlZmluZSBJTVJfQmNuSW50CQkJQklUMTMKKyNkZWZpbmUJSU1SX1JYRk9WVwkJCUJJVDEyCisjZGVmaW5lIElNUl9SRFUJCQkJQklUMTEKKyNkZWZpbmUgSU1SX1JYQ01ET0sJCQlCSVQxMAorI2RlZmluZSBJTVJfQkRPSwkJCUJJVDkKKyNkZWZpbmUgSU1SX0hJR0hET0sJCQlCSVQ4CisjZGVmaW5lCUlNUl9DT01ET0sJCQlCSVQ3CisjZGVmaW5lIElNUl9NR05URE9LCQkJQklUNgorI2RlZmluZSBJTVJfSENDQURPSwkJCUJJVDUKKyNkZWZpbmUJSU1SX0JLRE9LCQkJQklUNAorI2RlZmluZQlJTVJfQkVET0sJCQlCSVQzCisjZGVmaW5lCUlNUl9WSURPSwkJCUJJVDIKKyNkZWZpbmUJSU1SX1ZPRE9LCQkJQklUMQorI2RlZmluZQlJTVJfUk9LCQkJCUJJVDAKKwlJU1IJCQk9IDB4MGY4LAorCVRQUG9sbAkJCT0gMHgwZmQsCisjZGVmaW5lIFRQUG9sbF9CS1EJCUJJVDAKKyNkZWZpbmUgVFBQb2xsX0JFUQkJQklUMQorI2RlZmluZSBUUFBvbGxfVklRCQlCSVQyCisjZGVmaW5lIFRQUG9sbF9WT1EJCUJJVDMKKyNkZWZpbmUgVFBQb2xsX0JRCQlCSVQ0CisjZGVmaW5lIFRQUG9sbF9DUQkJQklUNQorI2RlZmluZSBUUFBvbGxfTVEJCUJJVDYKKyNkZWZpbmUgVFBQb2xsX0hRCQlCSVQ3CisjZGVmaW5lIFRQUG9sbF9IQ0NBUQkJQklUOAorI2RlZmluZSBUUFBvbGxfU3RvcEJLCUJJVDkKKyNkZWZpbmUgVFBQb2xsX1N0b3BCRQlCSVQxMAorI2RlZmluZSBUUFBvbGxfU3RvcFZJCQlCSVQxMQorI2RlZmluZSBUUFBvbGxfU3RvcFZPCUJJVDEyCisjZGVmaW5lIFRQUG9sbF9TdG9wTWd0CUJJVDEzCisjZGVmaW5lIFRQUG9sbF9TdG9wSGlnaAlCSVQxNAorI2RlZmluZSBUUFBvbGxfU3RvcEhDQ0EJQklUMTUKKyNkZWZpbmUgVFBQb2xsX1NISUZUCQk4CiAKLQlQU1IJCQk9IDB4MGZmLCAvLyBQYWdlIFNlbGVjdCBSZWdpc3RlcgotI2RlZmluZSBQU1JfR0VOCQkJMHgwCQkJCS8vIFBhZ2UgMCByZWdpc3RlciBnZW5lcmFsIE1BQyBDb250cm9sCi0jZGVmaW5lIFBTUl9DUFUJCQkweDEJCQkJLy8gUGFnZSAxIHJlZ2lzdGVyIGZvciBDUFUKLQlDUFVfR0VOCQkJPSAweDEwMCwgLy8gQ1BVIFJlc2V0IFJlZ2lzdGVyCi0JQkJfUkVTRVQJCQk9IDB4MTAxLCAvLyBCYXNlYmFuZCBSZXNldAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgICAgICA4MTkwIENQVSBHZW5lcmFsIFJlZ2lzdGVyCQkob2Zmc2V0IDB4MTAwLCA0IGJ5dGUpCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlQU1IJCQk9IDB4MGZmLAorI2RlZmluZSBQU1JfR0VOCQkJMHgwCisjZGVmaW5lIFBTUl9DUFUJCQkweDEKKwlDUFVfR0VOCQkJPSAweDEwMCwKKwlCQl9SRVNFVAkJCT0gMHgxMDEsCiAjZGVmaW5lCUNQVV9DQ0tfTE9PUEJBQ0sJMHgwMDAzMDAwMAogI2RlZmluZQlDUFVfR0VOX1NZU1RFTV9SRVNFVAkweDAwMDAwMDAxCiAjZGVmaW5lCUNQVV9HRU5fRklSTVdBUkVfUkVTRVQJMHgwMDAwMDAwOApAQCAtMzA0LDE5ICsyNzMsMTUgQEAKICNkZWZpbmUJQ1BVX0dFTl9QVVRfQ09ERV9PSwkweDAwMDAwMDgwCiAjZGVmaW5lCUNQVV9HRU5fQkJfUlNUCQkweDAwMDAwMTAwCiAjZGVmaW5lCUNQVV9HRU5fUFdSX1NUQl9DUFUJMHgwMDAwMDAwNAotI2RlZmluZSBDUFVfR0VOX05PX0xPT1BCQUNLX01TSwkweEZGRjhGRkZGIC8vIFNldCBiaXQxOCwxNywxNiB0byAwLiBTZXQgYml0MTkKLSNkZWZpbmUgQ1BVX0dFTl9OT19MT09QQkFDS19TRVQJMHgwMDA4MDAwMCAvLyBTZXQgQklUMTkgdG8gMQorI2RlZmluZSBDUFVfR0VOX05PX0xPT1BCQUNLX01TSwkweEZGRjhGRkZGCisjZGVmaW5lIENQVV9HRU5fTk9fTE9PUEJBQ0tfU0VUCTB4MDAwODAwMDAKICNkZWZpbmUJQ1BVX0dFTl9HUElPX1VBUlQJCTB4MDAwMDcwMDAKIAotCUxFRDFDZmcJCQk9IDB4MTU0LC8vIExFRDEgQ29uZmlndXJhdGlvbiBSZWdpc3RlcgotIAlMRUQwQ2ZnCQkJPSAweDE1NSwvLyBMRUQwIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIKKwlMRUQxQ2ZnCQkJPSAweDE1NCwKKwlMRUQwQ2ZnCQkJPSAweDE1NSwKIAotCUFjbUF2ZwkJCT0gMHgxNzAsIC8vIEFDTSBBdmVyYWdlIFBlcmlvZCBSZWdpc3RlcgotCUFjbUh3Q3RybAkJPSAweDE3MSwgLy8gQUNNIEhhcmR3YXJlIENvbnRyb2wgUmVnaXN0ZXIKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vICAgICAgIDgxOTAgQWNtSHdDdHJsIGJpdHMgCQkJCQkob2Zmc2V0IDB4MTcxLCAxIGJ5dGUpCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlBY21BdmcJCQk9IDB4MTcwLAorCUFjbUh3Q3RybAkJPSAweDE3MSwKICNkZWZpbmUJQWNtSHdfSHdFbgkJQklUMAogI2RlZmluZQlBY21Id19CZXFFbgkJQklUMQogI2RlZmluZQlBY21Id19WaXFFbgkJQklUMgpAQCAtMzI0LDY3ICsyODksNjUgQEAKICNkZWZpbmUJQWNtSHdfQmVxU3RhdHVzCQlCSVQ0CiAjZGVmaW5lCUFjbUh3X1ZpcVN0YXR1cwkJQklUNQogI2RlZmluZQlBY21Id19Wb3FTdGF0dXMJCUJJVDYKLQlBY21Gd0N0cmwJCT0gMHgxNzIsIC8vIEFDTSBGaXJtd2FyZSBDb250cm9sIFJlZ2lzdGVyCisJQWNtRndDdHJsCQk9IDB4MTcyLAogI2RlZmluZQlBY21Gd19CZXFTdGF0dXMJCUJJVDAKICNkZWZpbmUJQWNtRndfVmlxU3RhdHVzCQlCSVQxCiAjZGVmaW5lCUFjbUZ3X1ZvcVN0YXR1cwkJQklUMgotCVZPQWRtVGltZQkJPSAweDE3NCwgLy8gVk8gUXVldWUgQWRtaXR0ZWQgVGltZSBSZWdpc3RlcgotCVZJQWRtVGltZQkJPSAweDE3OCwgLy8gVkkgUXVldWUgQWRtaXR0ZWQgVGltZSBSZWdpc3RlcgotCUJFQWRtVGltZQkJPSAweDE3QywgLy8gQkUgUXVldWUgQWRtaXR0ZWQgVGltZSBSZWdpc3RlcgotCVJRUE4xCQkJPSAweDE4MCwgLy8gUmVzZXJ2ZWQgUXVldWUgUGFnZSBOdW1iZXIgLCBWbyBWaSwgQmUsIEJrCi0JUlFQTjIJCQk9IDB4MTg0LCAvLyBSZXNlcnZlZCBRdWV1ZSBQYWdlIE51bWJlciwgSENDQSwgQ21kLCBNZ250LCBIaWdoCi0JUlFQTjMJCQk9IDB4MTg4LCAvLyBSZXNlcnZlZCBRdWV1ZSBQYWdlIE51bWJlciwgQmNuLCBQdWJsaWMsCi0JUVBSUgkJCT0gMHgxRTAsIC8vIFF1ZXVlIFBhZ2UgUmVwb3J0IHBlciBUSUQKLQlRUE5SCQkJPSAweDFGMCwgLy8gUXVldWUgUGFja2V0IE51bWJlciByZXBvcnQgcGVyIFRJRAotLyogdGhlcmUncyA5IHR4IGRlc2NyaXB0b3IgYmFzZSBhZGRyZXNzIGF2YWlsYWJsZSAqLwotCUJRREEJCQk9IDB4MjAwLCAvLyBCZWFjb24gUXVldWUgRGVzY3JpcHRvciBBZGRyZXNzCi0JSFFEQQkJCT0gMHgyMDQsIC8vIEhpZ2ggUHJpb3JpdHkgUXVldWUgRGVzY3JpcHRvciBBZGRyZXNzCi0JQ1FEQQkJCT0gMHgyMDgsIC8vIENvbW1hbmQgUXVldWUgRGVzY3JpcHRvciBBZGRyZXNzCi0JTVFEQQkJCT0gMHgyMEMsIC8vIE1hbmFnZW1lbnQgUXVldWUgRGVzY3JpcHRvciBBZGRyZXNzCi0JSENDQVFEQQkJCT0gMHgyMTAsIC8vIEhDQ0EgUXVldWUgRGVzY3JpcHRvciBBZGRyZXNzCi0JVk9RREEJCQk9IDB4MjE0LCAvLyBWTyBRdWV1ZSBEZXNjcmlwdG9yIEFkZHJlc3MKLQlWSVFEQQkJCT0gMHgyMTgsIC8vIFZJIFF1ZXVlIERlc2NyaXB0b3IgQWRkcmVzcwotCUJFUURBCQkJPSAweDIxQywgLy8gQkUgUXVldWUgRGVzY3JpcHRvciBBZGRyZXNzCi0JQktRREEJCQk9IDB4MjIwLCAvLyBCSyBRdWV1ZSBEZXNjcmlwdG9yIEFkZHJlc3MKLS8qIHRoZXJlJ3MgMiByeCBkZXNjcmlwdG9yIGJhc2UgYWRkcmVzcyBhdmFpbGFsYmUgKi8KLQlSQ1FEQQkJCT0gMHgyMjQsIC8vIFJlY2VpdmUgY29tbWFuZCBRdWV1ZSBEZXNjcmlwdG9yIEFkZHJlc3MKLQlSRFFEQQkJCT0gMHgyMjgsIC8vIFJlY2VpdmUgUXVldWUgRGVzY3JpcHRvciBTdGFydCBBZGRyZXNzCisJVk9BZG1UaW1lCQk9IDB4MTc0LAorCVZJQWRtVGltZQkJPSAweDE3OCwKKwlCRUFkbVRpbWUJCT0gMHgxN0MsCisJUlFQTjEJCQk9IDB4MTgwLAorCVJRUE4yCQkJPSAweDE4NCwKKwlSUVBOMwkJCT0gMHgxODgsCisJUVBSUgkJCT0gMHgxRTAsCisJUVBOUgkJCT0gMHgxRjAsCisJQlFEQQkJCT0gMHgyMDAsCisJSFFEQQkJCT0gMHgyMDQsCisJQ1FEQQkJCT0gMHgyMDgsCisJTVFEQQkJCT0gMHgyMEMsCisJSENDQVFEQQkJCT0gMHgyMTAsCisJVk9RREEJCQk9IDB4MjE0LAorCVZJUURBCQkJPSAweDIxOCwKKwlCRVFEQQkJCT0gMHgyMUMsCisJQktRREEJCQk9IDB4MjIwLAorCVJDUURBCQkJPSAweDIyNCwKKwlSRFFEQQkJCT0gMHgyMjgsCiAKLQlNQVIwCQkJPSAweDI0MCwgLy8gTXVsdGljYXN0IGZpbHRlci4KKwlNQVIwCQkJPSAweDI0MCwKIAlNQVI0CQkJPSAweDI0NCwKIAotCUNDWF9QRVJJT0QJCT0gMHgyNTAsIC8vIENDWCBNZWFzdXJlbWVudCBQZXJpb2QgUmVnaXN0ZXIsIGluIHVuaXQgb2YgVFUuCi0JQ0xNX1JFU1VMVAkJPSAweDI1MSwgLy8gQ0NBIEJ1c3kgZnJhY3Rpb24gcmVnaXN0ZXIuCi0JTkhNX1BFUklPRAkJPSAweDI1MiwgLy8gTkhNIE1lYXN1cmVtZW50IFBlcmlvZCByZWdpc3RlciwgaW4gdW5pdCBvZiBUVS4KKwlDQ1hfUEVSSU9ECQk9IDB4MjUwLAorCUNMTV9SRVNVTFQJCT0gMHgyNTEsCisJTkhNX1BFUklPRAkJPSAweDI1MiwKIAotCU5ITV9USFJFU0hPTEQwCQk9IDB4MjUzLCAvLyBOb2lzZSBIaXN0b2dyYW0gTWVhc2hvcmVtZW50MC4KLQlOSE1fVEhSRVNIT0xEMQkJPSAweDI1NCwgLy8gTm9pc2UgSGlzdG9ncmFtIE1lYXNob3JlbWVudDEuCi0JTkhNX1RIUkVTSE9MRDIJCT0gMHgyNTUsIC8vIE5vaXNlIEhpc3RvZ3JhbSBNZWFzaG9yZW1lbnQyLgotCU5ITV9USFJFU0hPTEQzCQk9IDB4MjU2LCAvLyBOb2lzZSBIaXN0b2dyYW0gTWVhc2hvcmVtZW50My4KLQlOSE1fVEhSRVNIT0xENAkJPSAweDI1NywgLy8gTm9pc2UgSGlzdG9ncmFtIE1lYXNob3JlbWVudDQuCi0JTkhNX1RIUkVTSE9MRDUJCT0gMHgyNTgsIC8vIE5vaXNlIEhpc3RvZ3JhbSBNZWFzaG9yZW1lbnQ1LgotCU5ITV9USFJFU0hPTEQ2CQk9IDB4MjU5LCAvLyBOb2lzZSBIaXN0b2dyYW0gTWVhc2hvcmVtZW50NgorCU5ITV9USFJFU0hPTEQwCQk9IDB4MjUzLAorCU5ITV9USFJFU0hPTEQxCQk9IDB4MjU0LAorCU5ITV9USFJFU0hPTEQyCQk9IDB4MjU1LAorCU5ITV9USFJFU0hPTEQzCQk9IDB4MjU2LAorCU5ITV9USFJFU0hPTEQ0CQk9IDB4MjU3LAorCU5ITV9USFJFU0hPTEQ1CQk9IDB4MjU4LAorCU5ITV9USFJFU0hPTEQ2CQk9IDB4MjU5LAogCi0JTUNUUkwJCQk9IDB4MjVBLCAvLyBNZWFzdXJlbWVudCBDb250cm9sCisJTUNUUkwJCQk9IDB4MjVBLAogCi0JTkhNX1JQSV9DT1VOVEVSMAk9IDB4MjY0LCAvLyBOb2lzZSBIaXN0b2dyYW0gUlBJIGNvdW50ZXIwLCB0aGUgZnJhY3Rpb24gb2Ygc2lnbmFsIHN0cmVuZ3RoIDwgTkhNX1RIUkVTSE9MRDAuCi0JTkhNX1JQSV9DT1VOVEVSMQk9IDB4MjY1LCAvLyBOb2lzZSBIaXN0b2dyYW0gUlBJIGNvdW50ZXIxLCB0aGUgZnJhY3Rpb24gb2Ygc2lnbmFsIHN0cmVuZ3RoIGluIChOSE1fVEhSRVNIT0xEMCwgTkhNX1RIUkVTSE9MRDFdLgotCU5ITV9SUElfQ09VTlRFUjIJPSAweDI2NiwgLy8gTm9pc2UgSGlzdG9ncmFtIFJQSSBjb3VudGVyMiwgdGhlIGZyYWN0aW9uIG9mIHNpZ25hbCBzdHJlbmd0aCBpbiAoTkhNX1RIUkVTSE9MRDEsIE5ITV9USFJFU0hPTEQyXS4KLQlOSE1fUlBJX0NPVU5URVIzCT0gMHgyNjcsIC8vIE5vaXNlIEhpc3RvZ3JhbSBSUEkgY291bnRlcjMsIHRoZSBmcmFjdGlvbiBvZiBzaWduYWwgc3RyZW5ndGggaW4gKE5ITV9USFJFU0hPTEQyLCBOSE1fVEhSRVNIT0xEM10uCi0JTkhNX1JQSV9DT1VOVEVSNAk9IDB4MjY4LCAvLyBOb2lzZSBIaXN0b2dyYW0gUlBJIGNvdW50ZXI0LCB0aGUgZnJhY3Rpb24gb2Ygc2lnbmFsIHN0cmVuZ3RoIGluIChOSE1fVEhSRVNIT0xEMywgTkhNX1RIUkVTSE9MRDRdLgotCU5ITV9SUElfQ09VTlRFUjUJPSAweDI2OSwgLy8gTm9pc2UgSGlzdG9ncmFtIFJQSSBjb3VudGVyNSwgdGhlIGZyYWN0aW9uIG9mIHNpZ25hbCBzdHJlbmd0aCBpbiAoTkhNX1RIUkVTSE9MRDQsIE5ITV9USFJFU0hPTEQ1XS4KLQlOSE1fUlBJX0NPVU5URVI2CT0gMHgyNkEsIC8vIE5vaXNlIEhpc3RvZ3JhbSBSUEkgY291bnRlcjYsIHRoZSBmcmFjdGlvbiBvZiBzaWduYWwgc3RyZW5ndGggaW4gKE5ITV9USFJFU0hPTEQ1LCBOSE1fVEhSRVNIT0xENl0uCi0JTkhNX1JQSV9DT1VOVEVSNwk9IDB4MjZCLCAvLyBOb2lzZSBIaXN0b2dyYW0gUlBJIGNvdW50ZXI3LCB0aGUgZnJhY3Rpb24gb2Ygc2lnbmFsIHN0cmVuZ3RoIGluIChOSE1fVEhSRVNIT0xENiwgTkhNX1RIUkVTSE9MRDddLgotICAgICAgICBXRkNSQzAgICAgICAgICAgICAgICAgICA9IDB4MmYwLAotICAgICAgICBXRkNSQzEgICAgICAgICAgICAgICAgICA9IDB4MmY0LAotICAgICAgICBXRkNSQzIgICAgICAgICAgICAgICAgICA9IDB4MmY4LAorCU5ITV9SUElfQ09VTlRFUjAJPSAweDI2NCwKKwlOSE1fUlBJX0NPVU5URVIxCT0gMHgyNjUsCisJTkhNX1JQSV9DT1VOVEVSMgk9IDB4MjY2LAorCU5ITV9SUElfQ09VTlRFUjMJPSAweDI2NywKKwlOSE1fUlBJX0NPVU5URVI0CT0gMHgyNjgsCisJTkhNX1JQSV9DT1VOVEVSNQk9IDB4MjY5LAorCU5ITV9SUElfQ09VTlRFUjYJPSAweDI2QSwKKwlOSE1fUlBJX0NPVU5URVI3CT0gMHgyNkIsCisJV0ZDUkMwCQkgID0gMHgyZjAsCisJV0ZDUkMxCQkgID0gMHgyZjQsCisJV0ZDUkMyCQkgID0gMHgyZjgsCiAKLQlCV19PUE1PREUJCT0gMHgzMDAsIC8vIEJhbmR3aWR0aCBvcGVyYXRpb24gbW9kZQorCUJXX09QTU9ERQkJPSAweDMwMCwKICNkZWZpbmUJQldfT1BNT0RFXzExSgkJCUJJVDAKICNkZWZpbmUJQldfT1BNT0RFXzVHCQkJQklUMQogI2RlZmluZQlCV19PUE1PREVfMjBNSFoJCQlCSVQyCi0JSUNfVkVSUlNJT04JCT0gMHgzMDEsCS8vSUNfVkVSU0lPTgotCU1TUgkJCT0gMHgzMDMsIC8vIE1lZGlhIFN0YXR1cyByZWdpc3RlcgorCUlDX1ZFUlJTSU9OCQk9IDB4MzAxLAorCU1TUgkJCT0gMHgzMDMsCiAjZGVmaW5lIE1TUl9MSU5LX01BU0sgICAgICAoKDE8PDApfCgxPDwxKSkKICNkZWZpbmUgTVNSX0xJTktfTUFOQUdFRCAgIDIKICNkZWZpbmUgTVNSX0xJTktfTk9ORSAgICAgIDAKQEAgLTM5Miw0OSArMzU1LDUwIEBACiAjZGVmaW5lIE1TUl9MSU5LX0FESE9DICAgICAxCiAjZGVmaW5lIE1TUl9MSU5LX01BU1RFUiAgICAzCiAjZGVmaW5lIE1TUl9MSU5LX0VORURDQQkgICAoMTw8NCkKLQlSRVRSWV9MSU1JVAkJPSAweDMwNCwgLy8gUmV0cnkgTGltaXQgWzE1OjhdLXNob3J0LCBbNzowXS1sb25nCisKKyNkZWZpbmUJTVNSX05PTElOSwkJCQkJMHgwMAorI2RlZmluZQlNU1JfQURIT0MJCQkJCTB4MDEKKyNkZWZpbmUJTVNSX0lORlJBCQkJCQkweDAyCisjZGVmaW5lCU1TUl9BUAkJCQkJCTB4MDMKKworCVJFVFJZX0xJTUlUCQk9IDB4MzA0LAogI2RlZmluZSBSRVRSWV9MSU1JVF9TSE9SVF9TSElGVCA4CiAjZGVmaW5lIFJFVFJZX0xJTUlUX0xPTkdfU0hJRlQgMAogCVRTRlIJCQk9IDB4MzA4LAotCVJSU1IJCQk9IDB4MzEwLCAvLyBSZXNwb25zZSBSYXRlIFNldAotI2RlZmluZSBSUlNSX1JTQ19PRkZTRVQJCQkyMQorCVJSU1IJCQk9IDB4MzEwLAorI2RlZmluZSBSUlNSX1JTQ19PRkZTRVQJCQkJMjEKICNkZWZpbmUgUlJTUl9TSE9SVF9PRkZTRVQJCQkyMwogI2RlZmluZSBSUlNSX1JTQ19EVVBMSUNBVEUJCQkweDYwMDAwMAogI2RlZmluZSBSUlNSX1JTQ19VUFNVQkNITkwJCQkweDQwMDAwMAotI2RlZmluZSBSUlNSX1JTQ19MT1dTVUJDSE5MCQkweDIwMDAwMAotI2RlZmluZSBSUlNSX1NIT1JUCQkJCQkweDgwMDAwMAotI2RlZmluZSBSUlNSXzFNCQkJCQkJQklUMAotI2RlZmluZSBSUlNSXzJNCQkJCQkJQklUMQotI2RlZmluZSBSUlNSXzVfNU0JCQkJCUJJVDIKLSNkZWZpbmUgUlJTUl8xMU0JCQkJCUJJVDMKLSNkZWZpbmUgUlJTUl82TQkJCQkJCUJJVDQKLSNkZWZpbmUgUlJTUl85TQkJCQkJCUJJVDUKLSNkZWZpbmUgUlJTUl8xMk0JCQkJCUJJVDYKLSNkZWZpbmUgUlJTUl8xOE0JCQkJCUJJVDcKLSNkZWZpbmUgUlJTUl8yNE0JCQkJCUJJVDgKLSNkZWZpbmUgUlJTUl8zNk0JCQkJCUJJVDkKLSNkZWZpbmUgUlJTUl80OE0JCQkJCUJJVDEwCi0jZGVmaW5lIFJSU1JfNTRNCQkJCQlCSVQxMQotI2RlZmluZSBSUlNSX01DUzAJCQkJCUJJVDEyCi0jZGVmaW5lIFJSU1JfTUNTMQkJCQkJQklUMTMKLSNkZWZpbmUgUlJTUl9NQ1MyCQkJCQlCSVQxNAotI2RlZmluZSBSUlNSX01DUzMJCQkJCUJJVDE1Ci0jZGVmaW5lIFJSU1JfTUNTNAkJCQkJQklUMTYKLSNkZWZpbmUgUlJTUl9NQ1M1CQkJCQlCSVQxNwotI2RlZmluZSBSUlNSX01DUzYJCQkJCUJJVDE4Ci0jZGVmaW5lIFJSU1JfTUNTNwkJCQkJQklUMTkKLSNkZWZpbmUgQlJTUl9BY2tTaG9ydFBtYgkJCUJJVDIzCQkvLyBDQ0sgQUNLOiB1c2UgU2hvcnQgUHJlYW1ibGUgb3Igbm90CisjZGVmaW5lIFJSU1JfUlNDX0xPV1NVQkNITkwJCQkweDIwMDAwMAorI2RlZmluZSBSUlNSX1NIT1JUCQkJCTB4ODAwMDAwCisjZGVmaW5lIFJSU1JfMU0JCQkJCUJJVDAKKyNkZWZpbmUgUlJTUl8yTQkJCQkJQklUMQorI2RlZmluZSBSUlNSXzVfNU0JCQkJQklUMgorI2RlZmluZSBSUlNSXzExTQkJCQlCSVQzCisjZGVmaW5lIFJSU1JfNk0JCQkJCUJJVDQKKyNkZWZpbmUgUlJTUl85TQkJCQkJQklUNQorI2RlZmluZSBSUlNSXzEyTQkJCQlCSVQ2CisjZGVmaW5lIFJSU1JfMThNCQkJCUJJVDcKKyNkZWZpbmUgUlJTUl8yNE0JCQkJQklUOAorI2RlZmluZSBSUlNSXzM2TQkJCQlCSVQ5CisjZGVmaW5lIFJSU1JfNDhNCQkJCUJJVDEwCisjZGVmaW5lIFJSU1JfNTRNCQkJCUJJVDExCisjZGVmaW5lIFJSU1JfTUNTMAkJCQlCSVQxMgorI2RlZmluZSBSUlNSX01DUzEJCQkJQklUMTMKKyNkZWZpbmUgUlJTUl9NQ1MyCQkJCUJJVDE0CisjZGVmaW5lIFJSU1JfTUNTMwkJCQlCSVQxNQorI2RlZmluZSBSUlNSX01DUzQJCQkJQklUMTYKKyNkZWZpbmUgUlJTUl9NQ1M1CQkJCUJJVDE3CisjZGVmaW5lIFJSU1JfTUNTNgkJCQlCSVQxOAorI2RlZmluZSBSUlNSX01DUzcJCQkJQklUMTkKKyNkZWZpbmUgQlJTUl9BY2tTaG9ydFBtYgkJCUJJVDIzCiAJVUZXUAkJCT0gMHgzMTgsCi0JUkFUUjAJCQk9IDB4MzIwLCAvLyBSYXRlIEFkYXB0aXZlIFRhYmxlIHJlZ2lzdGVyMQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgICAgICA4MTkwIFJhdGUgQWRhcHRpdmUgVGFibGUgUmVnaXN0ZXIJKG9mZnNldCAweDMyMCwgNCBieXRlKQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vL0NDSworCVJBVFIwCQkJPSAweDMyMCwKICNkZWZpbmUJUkFUUl8xTQkJCTB4MDAwMDAwMDEKICNkZWZpbmUJUkFUUl8yTQkJCTB4MDAwMDAwMDIKICNkZWZpbmUJUkFUUl81NU0JCTB4MDAwMDAwMDQKICNkZWZpbmUJUkFUUl8xMU0JCTB4MDAwMDAwMDgKLS8vT0ZETQogI2RlZmluZQlSQVRSXzZNCQkJMHgwMDAwMDAxMAogI2RlZmluZQlSQVRSXzlNCQkJMHgwMDAwMDAyMAogI2RlZmluZQlSQVRSXzEyTQkJMHgwMDAwMDA0MApAQCAtNDQzLDcgKzQwNyw2IEBACiAjZGVmaW5lCVJBVFJfMzZNCQkweDAwMDAwMjAwCiAjZGVmaW5lCVJBVFJfNDhNCQkweDAwMDAwNDAwCiAjZGVmaW5lCVJBVFJfNTRNCQkweDAwMDAwODAwCi0vL01DUyAxIFNwYXRpYWwgU3RyZWFtCiAjZGVmaW5lCVJBVFJfTUNTMAkJMHgwMDAwMTAwMAogI2RlZmluZQlSQVRSX01DUzEJCTB4MDAwMDIwMDAKICNkZWZpbmUJUkFUUl9NQ1MyCQkweDAwMDA0MDAwCkBAIC00NTIsNyArNDE1LDYgQEAKICNkZWZpbmUJUkFUUl9NQ1M1CQkweDAwMDIwMDAwCiAjZGVmaW5lCVJBVFJfTUNTNgkJMHgwMDA0MDAwMAogI2RlZmluZQlSQVRSX01DUzcJCTB4MDAwODAwMDAKLS8vTUNTIDIgU3BhdGlhbCBTdHJlYW0KICNkZWZpbmUJUkFUUl9NQ1M4CQkweDAwMTAwMDAwCiAjZGVmaW5lCVJBVFJfTUNTOQkJMHgwMDIwMDAwMAogI2RlZmluZQlSQVRSX01DUzEwCQkweDAwNDAwMDAwCkBAIC00NjEsMzEgKzQyMywzMSBAQAogI2RlZmluZQlSQVRSX01DUzEzCQkweDAyMDAwMDAwCiAjZGVmaW5lCVJBVFJfTUNTMTQJCTB4MDQwMDAwMDAKICNkZWZpbmUJUkFUUl9NQ1MxNQkJMHgwODAwMDAwMAotLy8gQUxMIENDSyBSYXRlCi0jZGVmaW5lIFJBVEVfQUxMX0NDSwkJUkFUUl8xTXxSQVRSXzJNfFJBVFJfNTVNfFJBVFJfMTFNCi0jZGVmaW5lIFJBVEVfQUxMX09GRE1fQUcJUkFUUl82TXxSQVRSXzlNfFJBVFJfMTJNfFJBVFJfMThNfFJBVFJfMjRNfFJBVFJfMzZNfFJBVFJfNDhNfFJBVFJfNTRNCi0jZGVmaW5lIFJBVEVfQUxMX09GRE1fMVNTCVJBVFJfTUNTMHxSQVRSX01DUzF8UkFUUl9NQ1MyfFJBVFJfTUNTMyB8IFwKLQkJCQkJCQkJCVJBVFJfTUNTNHxSQVRSX01DUzV8UkFUUl9NQ1M2CXxSQVRSX01DUzcKLSNkZWZpbmUgUkFURV9BTExfT0ZETV8yU1MJUkFUUl9NQ1M4fFJBVFJfTUNTOQl8UkFUUl9NQ1MxMHxSQVRSX01DUzExfCBcCi0JCQkJCQkJCQlSQVRSX01DUzEyfFJBVFJfTUNTMTN8UkFUUl9NQ1MxNHxSQVRSX01DUzE1CisjZGVmaW5lIFJBVEVfQUxMX0NDSwkJKFJBVFJfMU0gfCBSQVRSXzJNIHwgUkFUUl81NU0gfCBSQVRSXzExTSkKKyNkZWZpbmUgUkFURV9BTExfT0ZETV9BRwkoUkFUUl82TSB8IFJBVFJfOU0gfCBSQVRSXzEyTSB8IFJBVFJfMThNIHwgXAorCQkJCVJBVFJfMjRNIHwgUkFUUl8zNk0gfCBSQVRSXzQ4TSB8IFJBVFJfNTRNKQorI2RlZmluZSBSQVRFX0FMTF9PRkRNXzFTUwkoUkFUUl9NQ1MwIHwgUkFUUl9NQ1MxIHwgUkFUUl9NQ1MyIHwJXAorCQkJCVJBVFJfTUNTMyB8IFJBVFJfTUNTNCB8IFJBVFJfTUNTNSB8CVwKKwkJCQlSQVRSX01DUzYgfCBSQVRSX01DUzcpCisjZGVmaW5lIFJBVEVfQUxMX09GRE1fMlNTCShSQVRSX01DUzggfCBSQVRSX01DUzkgfCBSQVRSX01DUzEwIHwJXAorCQkJCVJBVFJfTUNTMTEgfCBSQVRSX01DUzEyIHwgUkFUUl9NQ1MxMyB8CVwKKwkJCQlSQVRSX01DUzE0fFJBVFJfTUNTMTUpCiAKIAotCURSSVZFUl9SU1NJCQk9IDB4MzJjLAkvLyBEcml2ZXIgdGVsbCBGaXJtd2FyZSBjdXJyZW50IFJTU0kKLQlNQ1NfVFhBR0MJCT0gMHgzNDAsIC8vIE1DUyBBR0MKLQlDQ0tfVFhBR0MJCT0gMHgzNDgsIC8vIENDSyBBR0MKLQlNYWNCbGtDdHJsCQk9IDB4NDAzLCAvLyBNYWMgYmxvY2sgb24vb2ZmIGNvbnRyb2wgcmVnaXN0ZXIKKwlEUklWRVJfUlNTSQkJPSAweDMyYywKKwlNQ1NfVFhBR0MJCT0gMHgzNDAsCisJQ0NLX1RYQUdDCQk9IDB4MzQ4LAorCU1hY0Jsa0N0cmwJCT0gMHg0MDMsCiAKLX07Cit9Cis7CiAKICNkZWZpbmUgR1BJIDB4MTA4CiAjZGVmaW5lIEdQTyAweDEwOQogI2RlZmluZSBHUEUgMHgxMGEKIAotI2RlZmluZQlBTkFQQVJfRk9SXzgxOTJQY2lFCQkJCQkJCTB4MTcJCS8vIEFuYWxvZyBwYXJhbWV0ZXIgcmVnaXN0ZXIKKyNkZWZpbmUJIEhXU0VUX01BWF9TSVpFXzkyUwkJCQkxMjgKIAotI2RlZmluZQlNU1JfTk9MSU5LCQkJCQkweDAwCi0jZGVmaW5lCU1TUl9BREhPQwkJCQkJMHgwMQotI2RlZmluZQlNU1JfSU5GUkEJCQkJCTB4MDIKLSNkZWZpbmUJTVNSX0FQCQkJCQkJMHgwMworI2RlZmluZQlBTkFQQVJfRk9SXzgxOTJQY2lFCQkJCTB4MTcKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2h3aW1nLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX2h3aW1nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlN2RiYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfaHdpbWcuYwpAQCAtMCwwICsxLDMzMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKkNyZWF0ZWQgb24gIDIwMDgvMTEvMTgsICAzOiA3Ki8KKworI2luY2x1ZGUgInI4MTkyRV9od2ltZy5oIgorCit1OCBSdGw4MTkyUGNpRUZ3Qm9vdEFycmF5W0Jvb3RBcnJheUxlbmd0aFBjaUVdID0geworMHgxMCwweDAwLDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwOCwweGJmLDB4YzAsMHgyNSwweDA4LDB4MDAsMHgwOCwKKzB4M2MsMHgwOSwweGIwLDB4MDMsMHhhZCwweDI4LDB4MDAsMHgyMCwweDQwLDB4ODAsMHg2OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MGEsMHhkMCwweDAwLDB4NDAsMHg4YSwweDYwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDgsMHg4MCwweDAxLAorMHgyNSwweDA4LDB4YTgsMHgwNCwweDI0LDB4MDksMHgwMCwweDAxLDB4M2MsMHgwMSwweDdmLDB4ZmYsMHgzNCwweDIxLDB4ZmYsMHhmZiwKKzB4MDEsMHgwMSwweDUwLDB4MjQsMHgwMCwweDA5LDB4NDgsMHg0MCwweDM1LDB4MjksMHgwMCwweDAxLDB4MDEsMHgyYSwweDEwLDB4MmIsCisweDE0LDB4NDAsMHhmZiwweGZjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDBhLDB4MDAsMHgwMCwweDI1LDB4NGEsMHgwMCwweDAwLAorMHg0YywweDhhLDB4MDAsMHgwMCwweDRjLDB4ODksMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDA4LDB4ODAsMHgwMSwKKzB4MjUsMHgwOCwweGE4LDB4MDQsMHgzYywweDAxLDB4ODAsMHgwMCwweDAxLDB4MjEsMHg0OCwweDI1LDB4M2MsMHgwYSwweGJmLDB4YzAsCisweDI1LDB4NGEsMHgwMCwweDdjLDB4M2MsMHgwYiwweGIwLDB4MDMsMHhhZCwweDZhLDB4MDAsMHgyMCwweGFkLDB4MDAsMHgwMCwweDAwLAorMHgyMSwweDA4LDB4MDAsMHgwNCwweDAxLDB4MDksMHgxMCwweDJiLDB4MTQsMHg0MCwweGZmLDB4ZjgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4M2MsMHgwOCwweDgwLDB4MDEsMHgyNSwweDA4LDB4N2YsMHhmZiwweDI0LDB4MDksMHgwMCwweDAxLDB4M2MsMHgwMSwweDdmLDB4ZmYsCisweDM0LDB4MjEsMHhmZiwweGZmLDB4MDEsMHgwMSwweDUwLDB4MjQsMHgwMCwweDA5LDB4NDgsMHg0MCwweDM1LDB4MjksMHgwMCwweDAxLAorMHgwMSwweDJhLDB4MTAsMHgyYiwweDE0LDB4NDAsMHhmZiwweGZjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDBhLDB4ODAsMHgwMSwKKzB4MjUsMHg0YSwweDAwLDB4MDAsMHgzYywweDAxLDB4N2YsMHhmZiwweDM0LDB4MjEsMHhmZiwweGZmLDB4MDEsMHg0MSwweDUwLDB4MjQsCisweDNjLDB4MDksMHgwMCwweDAxLDB4MzUsMHgyOSwweDdmLDB4ZmYsMHg0YywweDhhLDB4MjAsMHgwMCwweDRjLDB4ODksMHgyOCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDA4LDB4MDQsMHgxMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MCwweDg4LDB4YTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MDgsMHhiZiwweGMwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZCwweDA5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDBhLDB4YmYsMHhjMCwweDI1LDB4NGEsMHgwMSwweDIwLDB4M2MsMHgwYiwweGIwLDB4MDMsMHhhZCwweDZhLDB4MDAsMHgyMCwKKzB4M2MsMHgwOCwweGIwLDB4MDMsMHg4ZCwweDA5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzUsMHgyOSwweDAwLDB4MTAsCisweGFkLDB4MDksMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDA4LDB4ODAsMHgwMCwweDI1LDB4MDgsMHg0YiwweDk0LAorMHgwMSwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLH07CisKK3U4IFJ0bDgxOTJQY2lFRndNYWluQXJyYXlbTWFpbkFycmF5TGVuZ3RoUGNpRV0gPSB7CisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4NDAsMHgwNCwweDY4LDB4MDAsMHg0MCwweDA1LDB4NzAsMHgwMCwweDQwLDB4MDYsMHg0MCwweDAwLDB4MGMsMHgwMCwweDEyLDB4OTgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgxYSwweDY4LDB4MDAsMHgzMywweDViLDB4MDAsMHgzYywweDE3LDB4NjAsMHgwMCwweDA5LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDQwLDB4MWIsMHg2MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweDViLDB4ZDAsMHgyNCwKKzB4NDAsMHgxYSwweDcwLDB4MDAsMHgwMywweDQwLDB4MDAsMHgwOCwweDQyLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGZmLDB4ZmYsMHgzNCwweDQyLDB4ZmYsMHhmZiwweDhjLDB4NDMsMHgwMCwweDAwLAorMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLDB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4MDAsMHhkMCwKKzB4YWMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjAsMHgyMSwweDI3LDB4ODUsMHg4YiwweDcwLDB4MDAsMHg4NSwweDE4LDB4MjEsCisweDI0LDB4ODQsMHgwMCwweDAxLDB4MjgsMHg4MiwweDAwLDB4MGEsMHgxNCwweDQwLDB4ZmYsMHhmYywweGEwLDB4NjAsMHgwMCwweDAwLAorMHgyNywweDgyLDB4OGIsMHg3YSwweDI0LDB4MDQsMHgwMCwweDA2LDB4MjQsMHg4NCwweGZmLDB4ZmYsMHhhNCwweDQwLDB4MDAsMHgwMCwKKzB4MDQsMHg4MSwweGZmLDB4ZmQsMHgyNCwweDQyLDB4MDAsMHgwMiwweDI0LDB4MDIsMHgwMCwweDAzLDB4YTMsMHg4MiwweDhiLDB4NzAsCisweDI0LDB4MDIsMHgwMCwweDBhLDB4MjQsMHgwMywweDA5LDB4YzQsMHhhMywweDgyLDB4OGIsMHg3MiwweDI0LDB4MDIsMHgwMCwweDA0LAorMHgyNCwweDA0LDB4MDAsMHgwMSwweDI0LDB4MDUsMHgwMCwweDAyLDB4YTcsMHg4MywweDhiLDB4ODYsMHhhMywweDgyLDB4OGIsMHg3OCwKKzB4MjQsMHgwMywweDA0LDB4MDAsMHgyNCwweDAyLDB4MDIsMHgwMCwweGFmLDB4ODMsMHg4YiwweDhjLDB4YTMsMHg4NSwweDhiLDB4NzksCisweGE3LDB4ODIsMHg4YiwweDdhLDB4YTcsMHg4NCwweDhiLDB4N2MsMHhhZiwweDg0LDB4OGIsMHg4OCwweGEzLDB4ODQsMHg4YiwweDcxLAorMHhhMywweDgwLDB4OGIsMHg3MywweGEzLDB4ODAsMHg4YiwweDc0LDB4YTMsMHg4MCwweDhiLDB4NzUsMHhhMywweDg0LDB4OGIsMHg3NiwKKzB4YTMsMHg4NSwweDhiLDB4NzcsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MDMsCisweDNjLDB4MDIsMHg4MCwweDAwLDB4MjQsMHg0MiwweDAxLDB4N2MsMHgzNCwweDYzLDB4MDAsMHgyMCwweGFjLDB4NjIsMHgwMCwweDAwLAorMHgyNywweDg0LDB4OGIsMHg5OCwweDAwLDB4MDAsMHgxMCwweDIxLDB4MjQsMHg0MiwweDAwLDB4MDEsMHgwMCwweDAyLDB4MTYsMHgwMCwKKzB4MDAsMHgwMiwweDE2LDB4MDMsMHgyOCwweDQzLDB4MDAsMHgwMywweGFjLDB4ODAsMHhmZiwweGZjLDB4YTAsMHg4MCwweDAwLDB4MDAsCisweDE0LDB4NjAsMHhmZiwweGY5LDB4MjQsMHg4NCwweDAwLDB4MGMsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLDB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4MDEsMHhjMCwKKzB4M2MsMHgwOCwweGIwLDB4MDMsMHhhYywweDYyLDB4MDAsMHgwMCwweDM1LDB4MDgsMHgwMCwweDcwLDB4OGQsMHgwMiwweDAwLDB4MDAsCisweDAwLDB4YTAsMHg0OCwweDIxLDB4MDAsMHgwNCwweDI2LDB4MDAsMHgwMCwweDAyLDB4MmEsMHg0MywweDAwLDB4MDYsMHgzNiwweDAwLAorMHgwMCwweDA3LDB4M2UsMHgwMCwweDAwLDB4MDIsMHgxMiwweDAzLDB4MjksMHgyMywweDAwLDB4MDMsMHgwMCwweDA0LDB4NTYsMHgwMywKKzB4MDAsMHgwNiwweDM2LDB4MDMsMHgwMCwweDA3LDB4M2UsMHgwMywweDMwLDB4NDgsMHgwMCwweDAxLDB4MTAsMHg2MCwweDAwLDB4MTEsCisweDMwLDB4YTUsMHgwMCwweDA3LDB4MjQsMHgwMiwweDAwLDB4MDIsMHgwMCwweDQ5LDB4MTAsMHgyMywweDAwLDB4NDUsMHgxMCwweDA3LAorMHgzMCwweDQyLDB4MDAsMHgwMSwweDEwLDB4NDAsMHgwMCwweDY2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweGEyLDB4MDAsMHgxMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MjEsMHg0MywweDExLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwNywweDIwLDB4MGIsCisweDE1LDB4MjAsMHgwMCwweDA2LDB4MjQsMHgwMiwweDAwLDB4MDEsMHgzYywweDAyLDB4YjAsMHgwNSwweDM0LDB4NDIsMHgwMSwweDIwLAorMHhhNCwweDQ0LDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMSwweDIyLDB4MDAsMHgwNCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwNSwweDA4LDB4MDAsMHgwMCwweDk0LDB4MzQsMHg0MiwweDAxLDB4MjQsCisweDNjLDB4MDIsMHhiMCwweDA1LDB4MDgsMHgwMCwweDAwLDB4OTQsMHgzNCwweDQyLDB4MDEsMHgyMiwweDE1LDB4MjAsMHgwMCwweDU0LAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAwLDB4NzQsMHg5MCwweDQzLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHhhZiwweDgzLDB4OGIsMHg5NCwweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAwLDB4NzAsCisweDkwLDB4NDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDZiLDB4MDAsMHgwOCwweDExLDB4NjAsMHgwMCwweDE4LAorMHgwMCwweDA5LDB4MjgsMHg0MCwweDAwLDB4MDAsMHg0MCwweDIxLDB4MjcsMHg4NSwweDhiLDB4OTAsMHg4YywweGEzLDB4MDAsMHgwMCwKKzB4OGMsMHhhMiwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NjIsMHgzOCwweDIzLDB4MDAsMHg0MywweDEwLDB4MmEsCisweDEwLDB4NDAsMHgwMCwweDNkLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhYywweGE3LDB4MDAsMHgwMCwweDI1LDB4MDIsMHgwMCwweDAxLAorMHgwMCwweDAyLDB4MTYsMHgwMCwweDAwLDB4MDIsMHg0NiwweDAzLDB4MjksMHgwMywweDAwLDB4MDMsMHgxNCwweDYwLDB4ZmYsMHhmMywKKzB4MjQsMHhhNSwweDAwLDB4MGMsMHgzYywweDAzLDB4YjAsMHgwMywweDM0LDB4NjMsMHgwMCwweDcwLDB4OTAsMHg2MiwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0YiwweDEwLDB4MjMsMHhhMCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDksMHgyOCwweDQwLAorMHgwMCwweGE5LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MjcsMHg4MywweDhiLDB4OTgsMHgwMCwweDBhLDB4MjAsMHgwYiwKKzB4MDAsMHg0MywweDE4LDB4MjEsMHgxMCwweGMwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgzOCwweDIxLDB4ODAsMHg2MiwweDAwLDB4MDEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MDUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDgwLDB4NjIsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDAzLDB4MDAsMHhhOSwweDEwLDB4MjEsMHgyNCwweDA3LDB4MDAsMHgwMSwKKzB4MDAsMHhhOSwweDEwLDB4MjEsMHgwMCwweDAyLDB4MzAsMHg4MCwweDI3LDB4ODIsMHg4YiwweDk4LDB4YTAsMHg2NywweDAwLDB4MDEsCisweDAwLDB4YzIsMHgzOCwweDIxLDB4ODAsMHhlMywweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NjAsMHgwMCwweDA3LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4ODMsMHg4YiwweDkwLDB4MDAsMHhjMywweDE4LDB4MjEsMHg4YywweDYyLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ0LDB4MTAsMHgyMSwweGFjLDB4NjIsMHgwMCwweDAwLDB4MjcsMHg4NSwweDhiLDB4OTQsCisweDI3LDB4ODIsMHg4YiwweDkwLDB4MDAsMHhjNSwweDI4LDB4MjEsMHgwMCwweGMyLDB4MTAsMHgyMSwweDhjLDB4NDMsMHgwMCwweDAwLAorMHg4YywweGE0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg2NCwweDE4LDB4MmEsMHgxNCwweDYwLDB4MDAsMHgwMywKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHgwMywweGUwLDB4MDAsMHgwOCwweGEwLDB4ZTIsMHgwMCwweDAwLDB4YTAsMHhlMCwweDAwLDB4MDAsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHhiNywweGFjLDB4YTAsMHgwMCwweDAwLAorMHgxMSwweDIyLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDAsMHg3YywKKzB4OTAsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGFmLDB4ODMsMHg4YiwweGFjLDB4MDgsMHgwMCwweDAwLDB4YTcsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDAsMHg3OCwweDkwLDB4NDMsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweGFmLDB4ODMsMHg4YiwweGEwLDB4MDgsMHgwMCwweDAwLDB4YTcsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDA0LDB4MTAsCisweDNjLDB4MDUsMHhiMCwweDAzLDB4YWMsMHg2MiwweDAwLDB4MDAsMHgzNCwweGE1LDB4MDAsMHg3MCwweDhjLDB4YTIsMHgwMCwweDAwLAorMHg5MCwweDg0LDB4MDAsMHgwOCwweDNjLDB4MDYsMHhiMCwweDAzLDB4MDAsMHgwMiwweDE2LDB4MDAsMHgyYywweDgzLDB4MDAsMHgwMywKKzB4MzQsMHhjNiwweDAwLDB4NzIsMHgyNCwweDA3LDB4MDAsMHgwMSwweDEwLDB4NjAsMHgwMCwweDExLDB4MDAsMHgwMiwweDJmLDB4YzIsCisweDkwLDB4YzIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MjEsMHgwMCwweDAyLDB4MTYsMHgwMCwweDEwLDB4YTcsMHgwMCwweDA5LAorMHgwMCwweDAyLDB4MTYsMHgwMywweDE0LDB4ODAsMHgwMCwweDBjLDB4MzAsMHg0MywweDAwLDB4MDMsMHg4MywweDgyLDB4OGIsMHg5OCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDE2LDB4MDAsCisweDAwLDB4MDIsMHgxZSwweDAzLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDAsMHg3MiwweGEwLDB4NDMsMHgwMCwweDAwLAorMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0NSwweDAwLDB4MDUsMHgxMCwweDg3LDB4MDAsMHgwNCwKKzB4MzAsMHg0MywweDAwLDB4MDYsMHg5MywweDgyLDB4OGIsMHhiMCwweDA4LDB4MDAsMHgwMSwweDFmLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDgzLDB4ODIsMHg4YiwweGE0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MTAsMHg0MCwweDA4LDB4MDAsMHgwMSwweDFmLAorMHgwMCwweDQ1LDB4MTAsMHgyMSwweDEwLDB4ODAsMHgwMCwweDA1LDB4MDAsMHgwMCwweDE4LDB4MjEsMHgyNCwweDYzLDB4MDAsMHgwMSwKKzB4MDAsMHg2NCwweDEwLDB4MmIsMHgxNCwweDQwLDB4ZmYsMHhmZCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDI0LDB4NDIsMHgwNCwweGU0LAorMHgzYywweDA0LDB4YjAsMHgwMiwweDM0LDB4NjMsMHgwMCwweDIwLDB4YWMsMHg2MiwweDAwLDB4MDAsMHgzNCwweDg0LDB4MDAsMHgwOCwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHhhZiwweDg0LDB4OGIsMHhjMCwweGEzLDB4ODIsMHg4YiwweGQwLDB4YTcsMHg4MCwweDhiLDB4YzQsCisweGE3LDB4ODAsMHg4YiwweGM2LDB4YWYsMHg4MCwweDhiLDB4YzgsMHhhZiwweDgwLDB4OGIsMHhjYywweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgzNCwweDYzLDB4MDAsMHgyMCwKKzB4MjQsMHg0MiwweDA1LDB4MjQsMHgzYywweDA0LDB4YjAsMHgwMywweGFjLDB4NjIsMHgwMCwweDAwLDB4MzQsMHg4NCwweDAwLDB4YWMsCisweDgwLDB4YTIsMHgwMCwweDE1LDB4OGMsMHg4MywweDAwLDB4MDAsMHgyNywweGJkLDB4ZmYsMHhmMCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHhhYywweDgyLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTAsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4M2MsMHgwMywweDgwLDB4MDAsMHgzNCwweDQyLDB4MDAsMHgyMCwweDI0LDB4NjMsMHgwNSwweDVjLDB4MjcsMHhiZCwweGZmLDB4ZTAsCisweGFjLDB4NDMsMHgwMCwweDAwLDB4YWYsMHhiMSwweDAwLDB4MTQsMHhhZiwweGIwLDB4MDAsMHgxMCwweGFmLDB4YmYsMHgwMCwweDE4LAorMHg4ZiwweDkwLDB4OGIsMHhjMCwweDBjLDB4MDAsMHgwMiwweDk4LDB4MDAsMHg4MCwweDg4LDB4MjEsMHgxNCwweDQwLDB4MDAsMHgyYSwKKzB4M2MsMHgwMiwweDAwLDB4ODAsMHgxNiwweDIwLDB4MDAsMHgwMiwweDM0LDB4NDIsMHgwMiwweDAxLDB4MjQsMHgwMiwweDAyLDB4MDEsCisweGFlLDB4MDIsMHgwMCwweDAwLDB4OTcsMHg4NCwweDhiLDB4YzQsMHg5NywweDgyLDB4OGIsMHhjNiwweDNjLDB4MDMsMHhiMCwweDAyLAorMHgwMCwweDgzLDB4MjAsMHgyMSwweDI0LDB4NDIsMHgwMCwweDA0LDB4YTcsMHg4MiwweDhiLDB4YzYsMHhhNCwweDgyLDB4MDAsMHgwMCwKKzB4OGYsMHg4NCwweDhiLDB4YzgsMHg4ZiwweDgyLDB4OGIsMHhjMCwweDkzLDB4ODUsMHg4YiwweDcyLDB4MjQsMHg4NCwweDAwLDB4MDEsCisweDI0LDB4NDIsMHgwMCwweDA0LDB4MjQsMHgwMywweDhmLDB4ZmYsMHgzYywweDA3LDB4YjAsMHgwNiwweDNjLDB4MDYsMHhiMCwweDAzLAorMHgwMCwweDQzLDB4MTAsMHgyNCwweDAwLDB4ODUsMHgyOCwweDJhLDB4MzQsMHhlNywweDgwLDB4MTgsMHhhZiwweDgyLDB4OGIsMHhjMCwKKzB4YWYsMHg4NCwweDhiLDB4YzgsMHgxMCwweGEwLDB4MDAsMHgwOCwweDM0LDB4YzYsMHgwMSwweDA4LDB4OGYsMHg4MywweDhiLDB4Y2MsCisweDhmLDB4ODQsMHg4YiwweDhjLDB4OGMsMHhjMiwweDAwLDB4MDAsMHgwMCwweDY0LDB4MTgsMHgyMSwweDAwLDB4NDMsMHgxMCwweDJiLAorMHgxNCwweDQwLDB4MDAsMHgwOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHhlMiwweDAwLDB4MDAsMHgzYywweDAzLDB4MGYsMHgwMCwKKzB4M2MsMHgwNCwweDA0LDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyNCwweDEwLDB4NDQsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDBjLDB4MDAsMHgwNCwweDk2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweGJmLDB4MDAsMHgxOCwweDdiLDB4YjAsMHgwMCwweGJjLAorMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDIwLDB4MjcsMHhiZCwweGZmLDB4ZDgsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4M2MsMHgwMywweDgwLDB4MDAsMHgyNCwweDYzLDB4MDYsMHg0OCwweGFmLDB4YjAsMHgwMCwweDEwLDB4MzQsMHg0MiwweDAwLDB4MjAsCisweDhmLDB4OTAsMHg4YiwweGMwLDB4YWMsMHg0MywweDAwLDB4MDAsMHhhZiwweGIzLDB4MDAsMHgxYywweGFmLDB4YjIsMHgwMCwweDE4LAorMHhhZiwweGIxLDB4MDAsMHgxNCwweGFmLDB4YmYsMHgwMCwweDIwLDB4MDAsMHg4MCwweDg4LDB4MjEsMHgwMCwweGEwLDB4OTAsMHgyMSwKKzB4MGMsMHgwMCwweDAyLDB4OTgsMHgwMCwweGMwLDB4OTgsMHgyMSwweDI0LDB4MDcsMHg4ZiwweGZmLDB4MTQsMHg0MCwweDAwLDB4MTksCisweDI2LDB4MDMsMHgwMCwweDA0LDB4MjQsMHgwMiwweDBlLDB4MDMsMHhhZSwweDAyLDB4MDAsMHgwMCwweDAwLDB4NjcsMHg4MCwweDI0LAorMHgyNiwweDAyLDB4MDAsMHgwNCwweGFlLDB4MTEsMHgwMCwweDAwLDB4MDAsMHg0NywweDgwLDB4MjQsMHg5NywweDg2LDB4OGIsMHhjNCwKKzB4MjYsMHgwMywweDAwLDB4MDQsMHhhZSwweDEyLDB4MDAsMHgwMCwweDAwLDB4NjcsMHg4MCwweDI0LDB4YWUsMHgxMywweDAwLDB4MDAsCisweDhmLDB4ODQsMHg4YiwweGMwLDB4M2MsMHgwMiwweGIwLDB4MDIsMHg5NywweDg1LDB4OGIsMHhjNiwweDAwLDB4YzIsMHgzMCwweDIxLAorMHg4ZiwweDgyLDB4OGIsMHhjOCwweDI0LDB4ODQsMHgwMCwweDEwLDB4MjQsMHhhNSwweDAwLDB4MTAsMHgwMCwweDg3LDB4MjAsMHgyNCwKKzB4MjQsMHg0MiwweDAwLDB4MDEsMHhhNywweDg1LDB4OGIsMHhjNiwweGFmLDB4ODQsMHg4YiwweGMwLDB4YWYsMHg4MiwweDhiLDB4YzgsCisweGE0LDB4YzUsMHgwMCwweDAwLDB4OGYsMHhiZiwweDAwLDB4MjAsMHg3YiwweGIyLDB4MDAsMHhmYywweDdiLDB4YjAsMHgwMCwweGJjLAorMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDI4LDB4MjcsMHhiZCwweGZmLDB4ZTgsMHhhZiwweGJmLDB4MDAsMHgxMCwKKzB4OTQsMHg4MiwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHhlMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MTQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTAsMHg4MiwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweGZjLAorMHgwMCwweDgyLDB4MjgsMHgyMSwweDhjLDB4YTQsMHgwMCwweDAwLDB4M2MsMHgwMiwweDAwLDB4NzAsMHg4YywweGE2LDB4MDAsMHgwOCwKKzB4MDAsMHg4MiwweDEwLDB4MjEsMHgyYywweDQzLDB4MDAsMHgwNiwweDEwLDB4NjAsMHgwMCwweDA5LDB4M2MsMHgwMywweDgwLDB4MDEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MjQsMHg2MywweDAxLDB4ZTgsMHgwMCwweDQzLDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhZiwweDg2LDB4ODAsMHgxNCwKKzB4OGYsMHhiZiwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTgsCisweDhjLDB4YTQsMHgwMCwweDAwLDB4MGMsMHgwMCwweDE3LDB4ODQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMSwweGRjLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgyNCwweDQ5LDB4MDAsMHhjMCwweDIwLDB4MjEsMHgwOCwweDAwLDB4MDEsMHhkYywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMywweDM0LDB4NDIsMHgwMSwweDA4LDB4OGMsMHg0NCwweDAwLDB4MDAsCisweDhmLDB4ODIsMHg4MCwweDE4LDB4M2MsMHgwMywweDAwLDB4MGYsMHgzNCwweDYzLDB4NDIsMHg0MCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHgwMCwweDgyLDB4MjAsMHgyYiwweDEwLDB4ODAsMHgwMCwweDA5LDB4MjQsMHgwMywweDAwLDB4MDUsMHg4ZiwweDgyLDB4ODMsMHg2MCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDQyLDB4MDAsMHgwMSwweGFmLDB4ODIsMHg4MywweDYwLDB4MTAsMHg0MywweDAwLDB4MDMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAzLAorMHg4YywweDYzLDB4MDEsMHgwOCwweDI0LDB4MDIsMHgwMCwweDAxLDB4YTMsMHg4MiwweDgwLDB4MTEsMHhhZiwweDgwLDB4ODMsMHg2MCwKKzB4YWYsMHg4MywweDgwLDB4MTgsMHgwOCwweDAwLDB4MDEsMHhmOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg4NCwweDAwLDB4ZmYsCisweDE0LDB4ODAsMHgwMCwweDJmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweDgyLDB4ODAsMHgxNCwweGEzLDB4ODUsMHg4MywweDkzLAorMHgxMCwweDQwLDB4MDAsMHgyYiwweDJjLDB4YTIsMHgwMCwweDA0LDB4MTQsMHg0MCwweDAwLDB4MDYsMHgwMCwweDA1LDB4MTAsMHg0MCwKKzB4MjQsMHhhMiwweGZmLDB4ZmMsMHgyYywweDQyLDB4MDAsMHgwOCwweDEwLDB4NDAsMHgwMCwweDA5LDB4MjQsMHhhMiwweGZmLDB4ZjAsCisweDAwLDB4MDUsMHgxMCwweDQwLDB4MjcsMHg4NCwweDgzLDB4OWMsMHgwMCwweDQ0LDB4MTAsMHgyMSwweDk0LDB4NDMsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NjMsMHgwMCwweDAxLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhNCwweDQzLDB4MDAsMHgwMCwKKzB4MmMsMHg0MiwweDAwLDB4MTAsMHgxNCwweDQwLDB4MDAsMHgwYSwweDAwLDB4MDUsMHgxMCwweDQwLDB4MjQsMHhhMiwweGZmLDB4ZTAsCisweDJjLDB4NDIsMHgwMCwweDEwLDB4MTQsMHg0MCwweDAwLDB4MDYsMHgwMCwweDA1LDB4MTAsMHg0MCwweDI0LDB4YTIsMHhmZiwweGQwLAorMHgyYywweDQyLDB4MDAsMHgxMCwweDEwLDB4NDAsMHgwMCwweDA5LDB4MjQsMHhhMiwweGZmLDB4YzAsMHgwMCwweDA1LDB4MTAsMHg0MCwKKzB4MjcsMHg4NCwweDgzLDB4OWMsMHgwMCwweDQ0LDB4MTAsMHgyMSwweDk0LDB4NDMsMHhmZiwweGY4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4NjMsMHgwMCwweDAxLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhNCwweDQzLDB4ZmYsMHhmOCwweDJjLDB4NDIsMHgwMCwweDEwLAorMHgxMCwweDQwLDB4MDAsMHgwNywweDAwLDB4MDUsMHgxMCwweDQwLDB4MjcsMHg4NCwweDgzLDB4OWMsMHgwMCwweDQ0LDB4MTAsMHgyMSwKKzB4OTQsMHg0MywweGZmLDB4ZjgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NjMsMHgwMCwweDAxLDB4YTQsMHg0MywweGZmLDB4ZjgsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweDg2LDB4OGIsMHhjMCwweDhmLDB4ODIsMHg4MCwweDE0LAorMHgyNywweGJkLDB4ZmYsMHhlOCwweGFmLDB4YmYsMHgwMCwweDEwLDB4MTAsMHg0MCwweDAwLDB4MmEsMHgwMCwweGMwLDB4MzgsMHgyMSwKKzB4MjQsMHgwMiwweDAwLDB4MDcsMHgyNCwweDAzLDB4ZmYsMHg5YywweGEzLDB4ODIsMHg4MywweDliLDB4YTMsMHg4MywweDgzLDB4OWEsCisweDI3LDB4OGEsMHg4MywweDk4LDB4MDAsMHgwMCwweDIwLDB4MjEsMHgyNCwweDA5LDB4OGYsMHhmZiwweDAwLDB4MDQsMHgxMCwweDgwLAorMHgwMCwweDRhLDB4MjgsMHgyMSwweDhjLDB4YTIsMHgwMCwweDAwLDB4MjQsMHhlMywweDAwLDB4MDQsMHgyNCwweDg4LDB4MDAsMHgwMSwKKzB4YWMsMHhlMiwweDAwLDB4MDAsMHgxMCwweDgwLDB4MDAsMHgwMiwweDAwLDB4NjksMHgzOCwweDI0LDB4YWMsMHhhMCwweDAwLDB4MDAsCisweDMxLDB4MDQsMHgwMCwweGZmLDB4MmMsMHg4MiwweDAwLDB4MjcsMHgxNCwweDQwLDB4ZmYsMHhmNSwweDAwLDB4MDQsMHgxMCwweDgwLAorMHg5NywweDgzLDB4OGIsMHhjNiwweDk3LDB4ODUsMHg4YiwweGM0LDB4M2MsMHgwMiwweGIwLDB4MDIsMHgyNCwweDYzLDB4MDAsMHg5YywKKzB4MDAsMHhhMiwweDI4LDB4MjEsMHgzYywweDA0LDB4YjAsMHgwNiwweGE3LDB4ODMsMHg4YiwweGM2LDB4MzQsMHg4NCwweDgwLDB4MTgsCisweGE0LDB4YTMsMHgwMCwweDAwLDB4OGMsMHg4NSwweDAwLDB4MDAsMHgyNCwweDAyLDB4OGYsMHhmZiwweDI0LDB4YzYsMHgwMCwweDljLAorMHgzYywweDAzLDB4MGYsMHgwMCwweDAwLDB4YzIsMHgzMCwweDI0LDB4MDAsMHhhMywweDI4LDB4MjQsMHgzYywweDAyLDB4MDQsMHgwMCwKKzB4YWYsMHg4NiwweDhiLDB4YzAsMHgxMCwweGEyLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDA0LDB4OTYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHhiZiwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgxOCwweDhmLDB4ODYsMHg4YiwweGMwLDB4MjcsMHhiZCwweGZmLDB4YzgsMHgyNCwweDAyLDB4MDAsMHgwOCwKKzB4MjQsMHgwMywweDAwLDB4MjAsMHhhZiwweGJmLDB4MDAsMHgzMCwweGEzLDB4YTIsMHgwMCwweDEzLDB4YTMsMHhhMywweDAwLDB4MTIsCisweGE3LDB4YTQsMHgwMCwweDEwLDB4MDAsMHhjMCwweDI4LDB4MjEsMHgyNywweGE5LDB4MDAsMHgxMCwweDAwLDB4MDAsMHgzOCwweDIxLAorMHgyNCwweDA4LDB4OGYsMHhmZiwweDAwLDB4MDcsMHgxMCwweDgwLDB4MDAsMHg0OSwweDEwLDB4MjEsMHg4YywweDQ0LDB4MDAsMHgwMCwKKzB4MjQsMHhlMywweDAwLDB4MDEsMHgzMCwweDY3LDB4MDAsMHhmZiwweDI0LDB4YTIsMHgwMCwweDA0LDB4MmMsMHhlMywweDAwLDB4MDgsCisweGFjLDB4YTQsMHgwMCwweDAwLDB4MTQsMHg2MCwweGZmLDB4ZjcsMHgwMCwweDQ4LDB4MjgsMHgyNCwweDk3LDB4ODMsMHg4YiwweGM2LAorMHg5NywweDg1LDB4OGIsMHhjNCwweDNjLDB4MDIsMHhiMCwweDAyLDB4MjQsMHg2MywweDAwLDB4MjAsMHgwMCwweGEyLDB4MjgsMHgyMSwKKzB4M2MsMHgwNCwweGIwLDB4MDYsMHhhNywweDgzLDB4OGIsMHhjNiwweDM0LDB4ODQsMHg4MCwweDE4LDB4YTQsMHhhMywweDAwLDB4MDAsCisweDhjLDB4ODUsMHgwMCwweDAwLDB4MjQsMHgwMiwweDhmLDB4ZmYsMHgyNCwweGM2LDB4MDAsMHgyMCwweDNjLDB4MDMsMHgwZiwweDAwLAorMHgwMCwweGMyLDB4MzAsMHgyNCwweDAwLDB4YTMsMHgyOCwweDI0LDB4M2MsMHgwMiwweDA0LDB4MDAsMHhhZiwweDg2LDB4OGIsMHhjMCwKKzB4MTAsMHhhMiwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgwNCwweDk2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhmLDB4YmYsMHgwMCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDM4LAorMHg5MywweDgyLDB4OGIsMHhkMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MTEsMHgyNCwweDA2LDB4MDAsMHgwMSwKKzB4OGYsMHg4MiwweDhiLDB4YzgsMHgzYywweDA1LDB4YjAsMHgwNiwweDNjLDB4MDQsMHhiMCwweDAzLDB4MzQsMHhhNSwweDgwLDB4MTgsCisweDM0LDB4ODQsMHgwMSwweDA4LDB4MTQsMHg0MCwweDAwLDB4MDksMHgwMCwweDAwLDB4MzAsMHgyMSwweDk3LDB4ODIsMHg4YiwweGM0LAorMHg4YywweDg0LDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAyLDB4MDAsMHg0MywweDEwLDB4MjEsMHhhZiwweDg0LDB4OGIsMHhjYywKKzB4YTcsMHg4MCwweDhiLDB4YzYsMHhhYywweDQwLDB4MDAsMHgwMCwweGFjLDB4NDAsMHgwMCwweDA0LDB4OGMsMHhhMiwweDAwLDB4MDAsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHhjMCwweDEwLDB4MjEsMHg4ZiwweDg2LDB4OGIsMHhjMCwweDhmLDB4ODIsMHg4YiwweGM4LAorMHgyNywweGJkLDB4ZmYsMHhlOCwweGFmLDB4YmYsMHgwMCwweDEwLDB4MDAsMHhjMCwweDQwLDB4MjEsMHgxNCwweDQwLDB4MDAsMHgwYSwKKzB4MDAsMHg0MCwweDUwLDB4MjEsMHgwMCwweDAwLDB4MzgsMHgyMSwweDI3LDB4ODksMHg4MywweDY4LDB4MjQsMHhlMiwweDAwLDB4MDEsCisweDAwLDB4MDcsMHgxOCwweDgwLDB4MzAsMHg0NywweDAwLDB4ZmYsMHgwMCwweDY5LDB4MTgsMHgyMSwweDJjLDB4ZTIsMHgwMCwweDBhLAorMHgxNCwweDQwLDB4ZmYsMHhmYSwweGFjLDB4NjAsMHgwMCwweDAwLDB4M2MsMHgwMiwweDAwLDB4ODAsMHgxMCwweDgyLDB4MDAsMHg2ZiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NywweDgyLDB4ODMsMHg2ZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4MDEsCisweGE3LDB4ODIsMHg4MywweDZlLDB4OTAsMHhhMywweDAwLDB4MTUsMHg5NywweDgyLDB4ODMsMHg3MCwweDAwLDB4MDMsMHgxZSwweDAwLAorMHgwMCwweDAzLDB4MWUsMHgwMywweDAwLDB4NDMsMHgxMCwweDIxLDB4YTcsMHg4MiwweDgzLDB4NzAsMHg4YywweGE0LDB4MDAsMHgyMCwKKzB4M2MsMHgwMiwweDAwLDB4NjAsMHgzYywweDAzLDB4MDAsMHgyMCwweDAwLDB4ODIsMHgyMCwweDI0LDB4MTAsMHg4MywweDAwLDB4NTQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg4MCwweDAwLDB4NDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDk3LDB4ODIsMHg4MywweDc0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NDIsMHgwMCwweDAxLDB4YTcsMHg4MiwweDgzLDB4NzQsMHg4NCwweGEzLDB4MDAsMHgwNiwKKzB4OGYsMHg4MiwweDgzLDB4ODQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4YWYsMHg4MiwweDgzLDB4ODQsCisweDI1LDB4NDIsMHgwMCwweDAxLDB4MjgsMHg0MywweDI3LDB4MTAsMHhhZiwweDgyLDB4OGIsMHhjOCwweDEwLDB4NjAsMHgwMCwweDA5LAorMHgyNCwweDAyLDB4MDAsMHgwNCwweDkzLDB4ODMsMHg4MCwweDExLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweDYyLDB4MDAsMHgwNSwKKzB4MjQsMHgwMiwweDAwLDB4MDQsMHg4ZiwweGJmLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDE4LDB4MjQsMHgwMywweDAwLDB4MjgsMHhhMywweDgzLDB4ODMsMHg2YSwweGEzLDB4ODIsMHg4MywweDZiLAorMHg5MCwweGEyLDB4MDAsMHgxOCwweDkzLDB4ODMsMHg4MywweDkzLDB4MDAsMHgwMCwweDM4LDB4MjEsMHgwMCwweDAyLDB4MTYsMHgwMCwKKzB4MDAsMHgwMiwweDE2LDB4MDMsMHhhNywweDgyLDB4ODMsMHg3ZSwweGEzLDB4ODMsMHg4MywweDhjLDB4MjcsMHg4OSwweDgzLDB4NjgsCisweDI0LDB4MDUsMHg4ZiwweGZmLDB4MDAsMHgwNywweDEwLDB4ODAsMHgwMCwweDQ5LDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDAwLAorMHgyNCwweGUzLDB4MDAsMHgwMSwweDMwLDB4NjcsMHgwMCwweGZmLDB4MjUsMHgwMiwweDAwLDB4MDQsMHgyYywweGUzLDB4MDAsMHgwYSwKKzB4YWQsMHgwNCwweDAwLDB4MDAsMHgxNCwweDYwLDB4ZmYsMHhmNywweDAwLDB4NDUsMHg0MCwweDI0LDB4OTcsMHg4MywweDhiLDB4YzYsCisweDk3LDB4ODUsMHg4YiwweGM0LDB4M2MsMHgwMiwweGIwLDB4MDIsMHgyNCwweDYzLDB4MDAsMHgyOCwweDAwLDB4YTIsMHgyOCwweDIxLAorMHgzYywweDA0LDB4YjAsMHgwNiwweGE3LDB4ODMsMHg4YiwweGM2LDB4MzQsMHg4NCwweDgwLDB4MTgsMHhhNCwweGEzLDB4MDAsMHgwMCwKKzB4OGMsMHg4NSwweDAwLDB4MDAsMHgyNCwweDAyLDB4OGYsMHhmZiwweDI0LDB4YzYsMHgwMCwweDI4LDB4M2MsMHgwMywweDBmLDB4MDAsCisweDAwLDB4YzIsMHgzMCwweDI0LDB4MDAsMHhhMywweDI4LDB4MjQsMHgzYywweDAyLDB4MDQsMHgwMCwweGFmLDB4ODYsMHg4YiwweGMwLAorMHgxMCwweGEyLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDA0LDB4OTYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MGMsMHgwMCwweDAyLDB4MzYsMHgwMCwweDAwLDB4MDAsMHgwMCwweGEzLDB4ODAsMHg4MCwweDExLDB4MDgsMHgwMCwweDAyLDB4ZTUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTcsMHg4MiwweDgzLDB4NzYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NDIsMHgwMCwweDAxLAorMHhhNywweDgyLDB4ODMsMHg3NiwweDg0LDB4YTMsMHgwMCwweDA2LDB4OGYsMHg4MiwweDgzLDB4ODgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHhhZiwweDgyLDB4ODMsMHg4OCwweDA4LDB4MDAsMHgwMiwweGRkLDB4MjUsMHg0MiwweDAwLDB4MDEsCisweDk3LDB4ODIsMHg4MywweDcyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDQyLDB4MDAsMHgwMSwweGE3LDB4ODIsMHg4MywweDcyLAorMHg4NCwweGEzLDB4MDAsMHgwNiwweDhmLDB4ODIsMHg4MywweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4YWYsMHg4MiwweDgzLDB4ODAsMHgwOCwweDAwLDB4MDIsMHhkZCwweDI1LDB4NDIsMHgwMCwweDAxLDB4OTcsMHg4MiwweDgzLDB4NmMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4MDEsMHhhNywweDgyLDB4ODMsMHg2YywweDA4LDB4MDAsMHgwMiwweGM1LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGQwLDB4YWYsMHhiZiwweDAwLDB4MjgsMHg4YywweGEzLDB4MDAsMHgyMCwKKzB4OGYsMHg4YSwweDhiLDB4YzAsMHgzYywweDAyLDB4MDAsMHgxMCwweDAwLDB4NjIsMHgxMCwweDI0LDB4MDAsMHhhMCwweDM4LDB4MjEsCisweDAxLDB4NDAsMHg0OCwweDIxLDB4MTAsMHg0MCwweDAwLDB4M2QsMHgwMCwweDgwLDB4MjgsMHgyMSwweDhjLDB4ZTQsMHgwMCwweDFjLAorMHgzNCwweGE1LDB4MTIsMHgwNiwweGFmLDB4YTUsMHgwMCwweDEwLDB4OGMsMHg4MiwweDAwLDB4MDgsMHgwMCwweDAzLDB4MWMsMHg0MiwKKzB4MzAsMHg2MywweDAwLDB4MzAsMHgwMCwweDAyLDB4MTMsMHgwMiwweDMwLDB4NDIsMHgwMCwweDQwLDB4MDAsMHg0MywweDEwLDB4MjUsCisweDkwLDB4ZTYsMHgwMCwweDEwLDB4OTAsMHhlNCwweDAwLDB4MTMsMHg5NCwweGU4LDB4MDAsMHgwYywweDk0LDB4ZTMsMHgwMCwweDFhLAorMHgwMCwweDAyLDB4MTYsMHgwMCwweDkwLDB4ZTcsMHgwMCwweDEyLDB4MDAsMHhhMiwweDI4LDB4MjUsMHgyNCwweDAyLDB4MTIsMHgzNCwKKzB4YTcsMHhhMiwweDAwLDB4MWMsMHgyNCwweDAyLDB4NTYsMHg3OCwweGFmLDB4YTUsMHgwMCwweDEwLDB4YTMsMHhhNiwweDAwLDB4MTgsCisweGEzLDB4YTcsMHgwMCwweDFmLDB4YTcsMHhhMywweDAwLDB4MWEsMHhhMywweGE0LDB4MDAsMHgxOSwweGE3LDB4YTgsMHgwMCwweDIwLAorMHhhNywweGEyLDB4MDAsMHgyMiwweDAwLDB4MDAsMHgyOCwweDIxLDB4MjcsMHhhNywweDAwLDB4MTAsMHgyNCwweDA2LDB4OGYsMHhmZiwKKzB4MDAsMHgwNSwweDEwLDB4ODAsMHgwMCwweDQ3LDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDAwLDB4MjQsMHhhMywweDAwLDB4MDEsCisweDMwLDB4NjUsMHgwMCwweGZmLDB4MjUsMHgyMiwweDAwLDB4MDQsMHgyYywweGEzLDB4MDAsMHgwNSwweGFkLDB4MjQsMHgwMCwweDAwLAorMHgxNCwweDYwLDB4ZmYsMHhmNywweDAwLDB4NDYsMHg0OCwweDI0LDB4OTcsMHg4MywweDhiLDB4YzYsMHg5NywweDg1LDB4OGIsMHhjNCwKKzB4M2MsMHgwMiwweGIwLDB4MDIsMHgyNCwweDYzLDB4MDAsMHgxNCwweDAwLDB4YTIsMHgyOCwweDIxLDB4M2MsMHgwNCwweGIwLDB4MDYsCisweGE3LDB4ODMsMHg4YiwweGM2LDB4MzQsMHg4NCwweDgwLDB4MTgsMHhhNCwweGEzLDB4MDAsMHgwMCwweDhjLDB4ODUsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4OGYsMHhmZiwweDI1LDB4NDYsMHgwMCwweDE0LDB4M2MsMHgwMywweDBmLDB4MDAsMHgwMCwweGMyLDB4NTAsMHgyNCwKKzB4MDAsMHhhMywweDI4LDB4MjQsMHgzYywweDAyLDB4MDQsMHgwMCwweGFmLDB4OGEsMHg4YiwweGMwLDB4MTAsMHhhMiwweDAwLDB4MDMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDA0LDB4OTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4YmYsMHgwMCwweDI4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MzAsMHgzYywweDA1LDB4YjAsMHgwMywKKzB4M2MsMHgwMiwweDgwLDB4MDAsMHgyNywweGJkLDB4ZmYsMHhjOCwweDAwLDB4MDQsMHgyMiwweDAwLDB4MzQsMHhhNSwweDAwLDB4MjAsCisweDI0LDB4NDIsMHgwZCwweGZjLDB4M2MsMHgwMywweGIwLDB4MDAsMHhhZiwweGI1LDB4MDAsMHgyNCwweGFmLDB4YjQsMHgwMCwweDIwLAorMHhhZiwweGIyLDB4MDAsMHgxOCwweGFmLDB4YjAsMHgwMCwweDEwLDB4YWYsMHhiZiwweDAwLDB4MzAsMHgwMCwweDgzLDB4ODAsMHgyMSwKKzB4YWYsMHhiNywweDAwLDB4MmMsMHhhZiwweGI2LDB4MDAsMHgyOCwweGFmLDB4YjMsMHgwMCwweDFjLDB4YWYsMHhiMSwweDAwLDB4MTQsCisweGFjLDB4YTIsMHgwMCwweDAwLDB4OGUsMHgwOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTAsMHgyMSwweDI2LDB4MTAsMHgwMCwweDA4LAorMHgwMCwweDA5LDB4YTYsMHgwMiwweDEyLDB4ODAsMHgwMCwweDEzLDB4MDAsMHgwMCwweGE4LDB4MjEsMHgyNCwweDEzLDB4MDAsMHgwMiwKKzB4M2MsMHgxNiwweDAwLDB4ZmYsMHgzYywweDE3LDB4ZmYsMHgwMCwweDhlLDB4MDksMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDksMHgxMiwweDAyLDB4MjQsMHg0MiwweDAwLDB4MDIsMHgzMSwweDI1LDB4MDAsMHhmZiwweDEwLDB4YjMsMHgwMCwweDc2LAorMHgzMCwweDUxLDB4MDAsMHhmZiwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTAsMHhhMiwweDAwLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDIsMHg1MSwweDEwLDB4MjEsMHgzMCwweDUyLDB4ZmYsMHhmZiwweDAyLDB4NTQsMHgxOCwweDJiLDB4MTQsMHg2MCwweGZmLDB4ZjIsCisweDAyLDB4MTEsMHg4MCwweDIxLDB4MTIsMHhhMCwweDAwLDB4MGEsMHgzYywweDAyLDB4YjAsMHgwNiwweDM0LDB4NDIsMHg4MCwweDE4LAorMHg4YywweDQzLDB4MDAsMHgwMCwweDNjLDB4MDQsMHgwZiwweDAwLDB4M2MsMHgwMiwweDA0LDB4MDAsMHgwMCwweDY0LDB4MTgsMHgyNCwKKzB4MTAsMHg2MiwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgwNCwweDk2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhmLDB4YmYsMHgwMCwweDMwLDB4N2IsMHhiNiwweDAxLDB4N2MsMHg3YiwweGI0LDB4MDEsMHgzYywweDdiLDB4YjIsMHgwMCwweGZjLAorMHg3YiwweGIwLDB4MDAsMHhiYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MzgsMHg4ZSwweDA5LDB4MDAsMHgwNCwKKzB4MjQsMHgxNSwweDAwLDB4MDEsMHg4ZSwweDA2LDB4MDAsMHgwYywweDAwLDB4MDksMHgxMSwweDQyLDB4MDAsMHgwOSwweDE4LDB4YzIsCisweDMwLDB4NDgsMHgwMCwweDAzLDB4MDAsMHgwOSwweDE0LDB4MDIsMHgzMCwweDZjLDB4MDAsMHgwMywweDAwLDB4MDksMHgyNiwweDAyLAorMHgxMSwweDE1LDB4MDAsMHg0NSwweDMwLDB4NDMsMHgwMCwweDBmLDB4MjksMHgwMiwweDAwLDB4MDIsMHgxNCwweDQwLDB4MDAsMHgyNiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMSwweDEzLDB4MDAsMHgwZiwweDAwLDB4MDAsMHgzOCwweDIxLDB4MDAsMHgwNywweDIyLDB4MDIsCisweDMwLDB4ODQsMHhmZiwweDAwLDB4M2MsMHgwMywweDAwLDB4ZmYsMHgwMCwweDA3LDB4MmUsMHgwMiwweDAwLDB4MDcsMHgxMiwweDAwLAorMHgwMCwweDQzLDB4MTAsMHgyNCwweDAwLDB4YTQsMHgyOCwweDI1LDB4MDAsMHhhMiwweDI4LDB4MjUsMHgwMCwweDA3LDB4MWUsMHgwMCwKKzB4MDAsMHhhMywweDI4LDB4MjUsMHgwYywweDAwLDB4MDEsMHg5MiwweDAxLDB4MjAsMHgyMCwweDIxLDB4MDgsMHgwMCwweDAzLDB4YTUsCisweDAyLDB4NTEsMHgxMCwweDIxLDB4MTEsMHg5NSwweDAwLDB4MGYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDExLDB4ODgsMHgwMCwweDA3LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgxMCwweDgwLDB4MjcsMHg4MywweDhiLDB4NzAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4OGMsMHg0NywweDAwLDB4MTgsMHgwOCwweDAwLDB4MDMsMHhjYywweDAwLDB4MDcsMHgyMiwweDAyLDB4MDAsMHgwNCwweDEwLDB4NDAsCisweDI3LDB4ODMsMHg4YiwweDc4LDB4MDAsMHg0MywweDEwLDB4MjEsMHg5NCwweDQ3LDB4MDAsMHgwMiwweDA4LDB4MDAsMHgwMywweGNjLAorMHgwMCwweDA3LDB4MjIsMHgwMiwweDI3LDB4ODIsMHg4YiwweDcwLDB4MDAsMHg4MiwweDEwLDB4MjEsMHg5MCwweDQ3LDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDAzLDB4Y2MsMHgwMCwweDA3LDB4MjIsMHgwMiwweDE1LDB4MDAsMHhmZiwweGRjLDB4MDAsMHgwMCwweDM4LDB4MjEsCisweDEwLDB4NzUsMHgwMCwweDA1LDB4MDAsMHg4MCwweDM4LDB4MjEsMHgwMCwweDY1LDB4MTgsMHgyNiwweDI0LDB4ODIsMHgwMSwweDAwLAorMHgwMCwweDAwLDB4MzgsMHgyMSwweDAwLDB4NDMsMHgzOCwweDBhLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMSwweDgyLDB4MDAsMHgwZSwKKzB4M2MsMHgwMiwweGIwLDB4MDMsMHgyNCwweDAyLDB4MDAsMHgwMiwweDExLDB4ODIsMHgwMCwweDA2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4MDAsMHhlMiwweDEwLDB4MjEsMHg4YywweDQ3LDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMywweGNjLAorMHgwMCwweDA3LDB4MjIsMHgwMiwweDNjLDB4MDIsMHhiMCwweDAzLDB4MDAsMHhlMiwweDEwLDB4MjEsMHg5NCwweDQzLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDAzLDB4Y2IsMHgzMCwweDY3LDB4ZmYsMHhmZiwweDAwLDB4ZTIsMHgxMCwweDIxLDB4OTAsMHg0MywweDAwLDB4MDAsCisweDA4LDB4MDAsMHgwMywweGNiLDB4MzAsMHg2NywweDAwLDB4ZmYsMHgzMCwweDYyLDB4MDAsMHgwMywweDAwLDB4MDIsMHgxMiwweDAwLAorMHgxMSwweDk1LDB4MDAsMHgwNywweDAwLDB4NDQsMHgzOCwweDIxLDB4MTEsMHg5MywweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDAzLDB4ZmQsMHgzYywweDAyLDB4YjAsMHgwYSwweDA4LDB4MDAsMHgwNCwweDAyLDB4M2MsMHgwMiwweGIwLDB4MGEsCisweDA4LDB4MDAsMHgwNCwweDA2LDB4M2MsMHgwMiwweGIwLDB4MGEsMHg4ZSwweDA5LDB4MDAsMHgwNCwweDhlLDB4MDIsMHgwMCwweDA4LAorMHg4ZSwweDAzLDB4MDAsMHgwYywweDAwLDB4MDksMHg0MSwweDQyLDB4MDAsMHgwMiwweDIyLDB4MDIsMHgwMCwweDAzLDB4M2EsMHgwMiwKKzB4MzAsMHg4NCwweGZmLDB4MDAsMHgzMCwweGU3LDB4ZmYsMHgwMCwweDAwLDB4MDIsMHg1ZSwweDAyLDB4MDAsMHgwMiwweDMyLDB4MDAsCisweDAwLDB4MDMsMHg1NiwweDAyLDB4MDAsMHgwMywweDJhLDB4MDAsMHgwMSwweDY0LDB4NTgsMHgyNSwweDAwLDB4ZDYsMHgzMCwweDI0LAorMHgwMSwweDQ3LDB4NTAsMHgyNSwweDAwLDB4MDIsMHgxNiwweDAwLDB4MDAsMHhiNiwweDI4LDB4MjQsMHgwMCwweDAzLDB4MWUsMHgwMCwKKzB4MDEsMHg2NiwweDU4LDB4MjUsMHgwMSwweDQ1LDB4NTAsMHgyNSwweDAwLDB4NTcsMHgxMCwweDI0LDB4MDAsMHg3NywweDE4LDB4MjQsCisweDAxLDB4NjIsMHgzOCwweDI1LDB4MDEsMHg0MywweDMwLDB4MjUsMHgwMCwweDA5LDB4MTAsMHhjMiwweDAwLDB4MDksMHgxYywweDAyLAorMHgzMSwweDA4LDB4MDAsMHgwMywweDMwLDB4NGMsMHgwMCwweDAzLDB4MzAsMHg2MywweDAwLDB4MGYsMHgwMCwweDA5LDB4MjYsMHgwMiwKKzB4MDAsMHhlMCwweDU4LDB4MjEsMHgxNSwweDAwLDB4MDAsMHgyOCwweDAwLDB4YzAsMHg1MCwweDIxLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDEwLDB4NjIsMHgwMCwweDA2LDB4MDAsMHg4MCwweDI4LDB4MjEsMHgyNCwweDAyLDB4MDAsMHgwMywweDE0LDB4NjIsMHhmZiwweDY5LAorMHgwMiwweDUxLDB4MTAsMHgyMSwweDI0LDB4ODUsMHgwMSwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMSwweDgyLDB4MDAsMHgxNSwKKzB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMSwweDgyLDB4MDAsMHgwYSwweDNjLDB4MDMsMHhiMCwweDAzLDB4MDAsMHhhMywweDE4LDB4MjEsCisweDhjLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwYSwweDIwLDB4MjcsMHgwMSwweDZhLDB4MjgsMHgyNCwweDAwLDB4NDQsMHgxMCwweDI0LAorMHgwMCwweDQ1LDB4MTAsMHgyNSwweGFjLDB4NjIsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAzLDB4YTUsMHgwMiwweDUxLDB4MTAsMHgyMSwKKzB4MDAsMHhhMywweDE4LDB4MjEsMHg5NCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MGEsMHgyMCwweDI3LDB4MDEsMHg2YSwweDI4LDB4MjQsCisweDAwLDB4NDQsMHgxMCwweDI0LDB4MDAsMHg0NSwweDEwLDB4MjUsMHhhNCwweDYyLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwMywweGE1LAorMHgwMiwweDUxLDB4MTAsMHgyMSwweDNjLDB4MDMsMHhiMCwweDAzLDB4MDAsMHhhMywweDE4LDB4MjEsMHg5MCwweDYyLDB4MDAsMHgwMCwKKzB4MDAsMHgwYSwweDIwLDB4MjcsMHgwMSwweDZhLDB4MjgsMHgyNCwweDAwLDB4NDQsMHgxMCwweDI0LDB4MDAsMHg0NSwweDEwLDB4MjUsCisweDA4LDB4MDAsMHgwMywweGE0LDB4YTAsMHg2MiwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDExLDB4MDIsMHgwMCwweDIxLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDE1LDB4MTMsMHhmZiwweDQyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMSwweDgyLDB4MDAsMHgxNywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMSwweDg4LDB4MDAsMHgwYiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg4MywweDhiLDB4NzAsCisweDAwLDB4MDQsMHgyMCwweDgwLDB4MDAsMHg4MywweDIwLDB4MjEsMHg4YywweDgyLDB4MDAsMHgxOCwweDAwLDB4MDYsMHgxOCwweDI3LAorMHgwMCwweGU2LDB4MjgsMHgyNCwweDAwLDB4NDMsMHgxMCwweDI0LDB4MDAsMHg0NSwweDEwLDB4MjUsMHgwOCwweDAwLDB4MDMsMHhhNCwKKzB4YWMsMHg4MiwweDAwLDB4MTgsMHgyNywweDgzLDB4OGIsMHg3OCwweDAwLDB4MDQsMHgyMCwweDQwLDB4MDAsMHg4MywweDIwLDB4MjEsCisweDk0LDB4ODIsMHgwMCwweDAyLDB4MDAsMHgwNiwweDE4LDB4MjcsMHgwMCwweGU2LDB4MjgsMHgyNCwweDAwLDB4NDMsMHgxMCwweDI0LAorMHgwMCwweDQ1LDB4MTAsMHgyNSwweDA4LDB4MDAsMHgwMywweGE0LDB4YTQsMHg4MiwweDAwLDB4MDIsMHgyNywweDgzLDB4OGIsMHg3MCwKKzB4MDAsMHg4MywweDE4LDB4MjEsMHg5MCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDYsMHgyMCwweDI3LDB4MDgsMHgwMCwweDA0LDB4NWEsCisweDAwLDB4ZTYsMHgyOCwweDI0LDB4MzAsMHg2MiwweDAwLDB4MDcsMHgwMCwweDAyLDB4MTIsMHgwMCwweDExLDB4ODgsMHgwMCwweDBmLAorMHgwMCwweDQ0LDB4MTAsMHgyMSwweDExLDB4OTMsMHgwMCwweDA3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwYSwKKzB4MDAsMHg0MywweDE4LDB4MjEsMHg4YywweDYyLDB4MDAsMHgwMCwweDAwLDB4MDYsMHgyMCwweDI3LDB4MDgsMHgwMCwweDA0LDB4NDcsCisweDAwLDB4ZTYsMHgyOCwweDI0LDB4M2MsMHgwMywweGIwLDB4MGEsMHgwMCwweDQzLDB4MTgsMHgyMSwweDk0LDB4NjIsMHgwMCwweDAwLAorMHgwMCwweDA2LDB4MjAsMHgyNywweDA4LDB4MDAsMHgwNCwweDUwLDB4MDAsMHhlNiwweDI4LDB4MjQsMHgzYywweDAzLDB4YjAsMHgwYSwKKzB4MDgsMHgwMCwweDA0LDB4N2QsMHgwMCwweDQzLDB4MTgsMHgyMSwweDk3LDB4ODUsMHg4YiwweGM0LDB4M2MsMHgwNywweGIwLDB4MDIsCisweDNjLDB4MDQsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgwMCwweGE3LDB4MjgsMHgyMSwweDM0LDB4ODQsMHgwMCwweDIwLAorMHgyNCwweDQyLDB4MTIsMHg1OCwweDI0LDB4MDMsMHhmZiwweDgwLDB4YWMsMHg4MiwweDAwLDB4MDAsMHhhMCwweGEzLDB4MDAsMHgwNywKKzB4OTcsMHg4MiwweDhiLDB4YzYsMHg5NywweDg1LDB4OGIsMHhjNCwweDNjLDB4MDYsMHhiMCwweDA2LDB4MzAsMHg0MiwweGZmLDB4ZjgsCisweDI0LDB4NDIsMHgwMCwweDEwLDB4MDAsMHhhMiwweDEwLDB4MjEsMHgzMCwweDQyLDB4MGYsMHhmZiwweDI0LDB4NDQsMHgwMCwweDA4LAorMHgzMCwweDg0LDB4MGYsMHhmZiwweDAwLDB4MDUsMHgyOCwweGMyLDB4M2MsMHgwMywweDAwLDB4NDAsMHgwMCwweGEzLDB4MjgsMHgyNSwKKzB4MDAsMHg4NywweDIwLDB4MjEsMHgzNCwweGM2LDB4ODAsMHgxOCwweGFjLDB4YzUsMHgwMCwweDAwLDB4YWYsMHg4NCwweDhiLDB4YzAsCisweGE3LDB4ODIsMHg4YiwweGM0LDB4YTcsMHg4MCwweDhiLDB4YzYsMHhhZiwweDgwLDB4OGIsMHhjOCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4YTUsMHgwMCwweGZmLDB4MzAsMHg4NCwweDAwLDB4ZmYsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MDAsMHhlMCwweDQ4LDB4MjEsMHgzMCwweGM2LDB4MDAsMHhmZiwweDhmLDB4YTcsMHgwMCwweDEwLDB4MTAsMHg4MiwweDAwLDB4MDcsCisweDAwLDB4YTAsMHg0MCwweDIxLDB4MjQsMHgwMiwweDAwLDB4MDMsMHgxMCwweDgyLDB4MDAsMHgwMywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHhhOCwweDAxLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwMywKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHgwMCwweDA3LDB4MjAsMHgyNywweDAxLDB4MjcsMHgyOCwweDI0LDB4MTAsMHhjMiwweDAwLDB4MTQsCisweDAxLDB4MDMsMHgxOCwweDIxLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGMyLDB4MDAsMHgwOSwweDAwLDB4MDcsMHg1MCwweDI3LAorMHgzYywweDAzLDB4YjAsMHgwMywweDAxLDB4MDMsMHgxOCwweDIxLDB4OGMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHg0YSwweDEwLDB4MjQsMHgwMCwweDQ1LDB4MTAsMHgyNSwweDA4LDB4MDAsMHgwNCwweGUxLDB4YWMsMHg2MiwweDAwLDB4MDAsCisweDNjLDB4MDMsMHhiMCwweDAzLDB4MDEsMHgwMywweDE4LDB4MjEsMHg5NCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDRhLDB4MTAsMHgyNCwweDAwLDB4NDUsMHgxMCwweDI1LDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhNCwweDYyLDB4MDAsMHgwMCwKKzB4OTAsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDQsMHgxMCwweDI0LDB4MDAsMHg0NSwweDEwLDB4MjUsCisweGEwLDB4NjIsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4ODQsMHgwMCwweDA3LAorMHgwMCwweDA0LDB4MjIsMHgwMCwweDMwLDB4YTUsMHgwMCwweGZmLDB4MDAsMHg4NSwweDI4LDB4MjEsMHgzYywweDAyLDB4YjAsMHgwYSwKKzB4MDAsMHhhMiwweDQwLDB4MjEsMHgzMCwweGM2LDB4MDAsMHhmZiwweDI0LDB4MDIsMHgwMCwweDAxLDB4OGYsMHhhNCwweDAwLDB4MTAsCisweDEwLDB4YzIsMHgwMCwweDE0LDB4MjQsMHgwMiwweDAwLDB4MDIsMHgwMCwweDA0LDB4NTAsMHgyNywweDEwLDB4YzIsMHgwMCwweDA5LAorMHgwMCwweGU0LDB4NDgsMHgyNCwweDNjLDB4MDMsMHhiMCwweDBhLDB4MDAsMHhhMywweDE4LDB4MjEsMHg4YywweDYyLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDRhLDB4MTAsMHgyNCwweDAwLDB4NDksMHgxMCwweDI1LDB4MDMsMHhlMCwweDAwLDB4MDgsCisweGFjLDB4NjIsMHgwMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MGEsMHgwMCwweGEzLDB4MTgsMHgyMSwweDk0LDB4NjIsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NGEsMHgxMCwweDI0LDB4MDAsMHg0OSwweDEwLDB4MjUsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4YTQsMHg2MiwweDAwLDB4MDAsMHg5MSwweDAyLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgxOCwweDI3LDB4MDAsMHhlNCwweDIwLDB4MjQsCisweDAwLDB4NDMsMHgxMCwweDI0LDB4MDAsMHg0NCwweDEwLDB4MjUsMHgwMywweGUwLDB4MDAsMHgwOCwweGExLDB4MDIsMHgwMCwweDAwLAorMHgzMCwweGE5LDB4MDAsMHhmZiwweDI3LDB4ODMsMHg4YiwweDcwLDB4MzAsMHg4NSwweDAwLDB4ZmYsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MDAsMHgwNywweDUwLDB4MjcsMHgwMCwweGM3LDB4NDAsMHgyNCwweDExLDB4MjIsMHgwMCwweDE3LDB4MDAsMHhhMywweDE4LDB4MjEsCisweDAwLDB4MDUsMHgyMCwweDQwLDB4MjcsMHg4MiwweDhiLDB4NzAsMHgwMCwweDA1LDB4MjgsMHg4MCwweDI3LDB4ODMsMHg4YiwweDc4LAorMHgwMCwweDgzLDB4NTAsMHgyMSwweDAwLDB4YTIsMHgyMCwweDIxLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgwMCwweDA3LDB4NDAsMHgyNywKKzB4MTEsMHgyMiwweDAwLDB4MDcsMHgwMCwweGM3LDB4MjgsMHgyNCwweDhjLDB4ODIsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4NDgsMHgxMCwweDI0LDB4MDAsMHg0NSwweDEwLDB4MjUsMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4ODIsMHgwMCwweDE4LAorMHg5NSwweDQyLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0OCwweDEwLDB4MjQsMHgwMCwweDQ1LDB4MTAsMHgyNSwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHhhNSwweDQyLDB4MDAsMHgwMiwweDkwLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4NGEsMHgxMCwweDI0LDB4MDAsMHg0OCwweDEwLDB4MjUsMHgwMywweGUwLDB4MDAsMHgwOCwweGEwLDB4NjIsMHgwMCwweDAwLAorMHgwMCwweDA0LDB4MzIsMHgwMiwweDMwLDB4YzYsMHhmZiwweDAwLDB4MDAsMHgwNCwweDE2LDB4MDIsMHgwMCwweDA0LDB4MWEsMHgwMCwKKzB4M2MsMHgwNSwweDAwLDB4ZmYsMHgwMCwweDY1LDB4MTgsMHgyNCwweDAwLDB4NDYsMHgxMCwweDI1LDB4MDAsMHg0MywweDEwLDB4MjUsCisweDAwLDB4MDQsMHgyNiwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDQ0LDB4MTAsMHgyNSwweDNjLDB4MDMsMHhiMCwweDAzLAorMHgzYywweDAyLDB4ODAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGU4LDB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4MTQsMHhkYywKKzB4M2MsMHgwNCwweGIwLDB4MDMsMHhhZiwweGJmLDB4MDAsMHgxNCwweGFjLDB4NjIsMHgwMCwweDAwLDB4YWYsMHhiMCwweDAwLDB4MTAsCisweDM0LDB4ODQsMHgwMCwweDJjLDB4OGMsMHg4MywweDAwLDB4MDAsMHhhNywweDgwLDB4YmMsMHgwMCwweDAwLDB4MDMsMHgxMiwweDAyLAorMHgwMCwweDAzLDB4MmQsMHgwMiwweDMwLDB4NDIsMHgwZiwweGZmLDB4YTMsMHg4MywweGJjLDB4MDgsMHhhNywweDg1LDB4YmMsMHgwYywKKzB4YTcsMHg4MiwweGJjLDB4MGEsMHhhNywweDgwLDB4YmMsMHgwMiwweGE3LDB4ODAsMHhiYywweDA0LDB4YTcsMHg4MCwweGJjLDB4MDYsCisweDBjLDB4MDAsMHgwNiwweGQxLDB4MjQsMHgwNCwweDA1LDB4MDAsMHgzYywweDA1LDB4MDgsMHgwMCwweDAwLDB4NDUsMHgyOCwweDI1LAorMHgyNCwweDA0LDB4MDUsMHgwMCwweDBjLDB4MDAsMHgwNiwweGJmLDB4MDAsMHg0MCwweDgwLDB4MjEsMHgzYywweDAyLDB4ZjcsMHhmZiwKKzB4MzQsMHg0MiwweGZmLDB4ZmYsMHgwMiwweDAyLDB4ODAsMHgyNCwweDAyLDB4MDAsMHgyOCwweDIxLDB4MGMsMHgwMCwweDA2LDB4YmYsCisweDI0LDB4MDQsMHgwNSwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzYywweDAzLDB4YjAsMHgwMywweDM0LDB4NDIsMHgwMSwweDA4LAorMHgzNCwweDYzLDB4MDEsMHgxOCwweDhjLDB4NDUsMHgwMCwweDAwLDB4OGMsMHg2NCwweDAwLDB4MDAsMHgzYywweDAyLDB4MDAsMHgwZiwKKzB4M2MsMHgwMywweDAwLDB4NGMsMHgzMCwweDg0LDB4MDIsMHgwMCwweDM0LDB4NjMsMHg0YiwweDQwLDB4YWYsMHg4NSwweGJjLDB4MTAsCisweDEwLDB4ODAsMHgwMCwweDA2LDB4MzQsMHg0MiwweDQyLDB4NDAsMHhhZiwweDgzLDB4YmMsMHgxNCwweDhmLDB4YmYsMHgwMCwweDE0LAorMHg4ZiwweGIwLDB4MDAsMHgxMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTgsMHhhZiwweDgyLDB4YmMsMHgxNCwKKzB4MDgsMHgwMCwweDA1LDB4NjcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsCisweDI3LDB4YmQsMHhmZiwweGM4LDB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4MTUsMHhiOCwweDMwLDB4ODQsMHgwMCwweGZmLAorMHhhZiwweGJmLDB4MDAsMHgzMCwweGFmLDB4YjcsMHgwMCwweDJjLDB4YWYsMHhiNiwweDAwLDB4MjgsMHhhZiwweGI1LDB4MDAsMHgyNCwKKzB4YWYsMHhiNCwweDAwLDB4MjAsMHhhZiwweGIzLDB4MDAsMHgxYywweGFmLDB4YjIsMHgwMCwweDE4LDB4YWYsMHhiMSwweDAwLDB4MTQsCisweGFmLDB4YjAsMHgwMCwweDEwLDB4YWMsMHg2MiwweDAwLDB4MDAsMHgxMCwweDgwLDB4MDAsMHgxYywweDI0LDB4MDIsMHgwMCwweDAyLAorMHgxMCwweDgyLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHhiZiwweDAwLDB4MzAsMHg3YiwweGI2LDB4MDEsMHg3YywKKzB4N2IsMHhiNCwweDAxLDB4M2MsMHg3YiwweGIyLDB4MDAsMHhmYywweDdiLDB4YjAsMHgwMCwweGJjLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDM4LDB4YTcsMHg4MCwweGJjLDB4MDAsMHhhNywweDgwLDB4YmMsMHgwMiwweGE3LDB4ODAsMHhiYywweDA0LAorMHhhNywweDgwLDB4YmMsMHgwNiwweDBjLDB4MDAsMHgwNiwweGQxLDB4MjQsMHgwNCwweDA1LDB4MDAsMHgzYywweDA1LDB4MDgsMHgwMCwKKzB4MDAsMHg0NSwweDI4LDB4MjUsMHgyNCwweDA0LDB4MDUsMHgwMCwweDBjLDB4MDAsMHgwNiwweGJmLDB4MDAsMHg0MCwweDgwLDB4MjEsCisweDNjLDB4MDUsMHhmNywweGZmLDB4MzQsMHhhNSwweGZmLDB4ZmYsMHgwMiwweDA1LDB4MjgsMHgyNCwweDBjLDB4MDAsMHgwNiwweGJmLAorMHgyNCwweDA0LDB4MDUsMHgwMCwweDA4LDB4MDAsMHgwNSwweDgyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwYywweDAwLDB4MDYsMHhkMSwKKzB4MjQsMHgwNCwweDA1LDB4YTAsMHgyNCwweDA0LDB4MDUsMHhhNCwweDBjLDB4MDAsMHgwNiwweGQxLDB4MDAsMHgwMiwweGJjLDB4MDIsCisweDI0LDB4MDQsMHgwNSwweGE4LDB4MDAsMHgwMiwweGI0LDB4MDIsMHgwYywweDAwLDB4MDYsMHhkMSwweDMwLDB4NTUsMHhmZiwweGZmLAorMHgwMCwweDQwLDB4ODAsMHgyMSwweDk3LDB4ODQsMHhiYywweDAwLDB4OTcsMHg4MiwweGJjLDB4MDIsMHg5NywweDgzLDB4YmMsMHgwNiwKKzB4MDIsMHhlNCwweDIwLDB4MjMsMHgwMiwweGEyLDB4MTAsMHgyMywweDAwLDB4ODIsMHgyMCwweDIxLDB4OTcsMHg4MiwweGJjLDB4MDQsCisweDMyLDB4MTQsMHhmZiwweGZmLDB4MDIsMHg4MywweDE4LDB4MjMsMHgwMiwweGMyLDB4MTAsMHgyMywweDAwLDB4ODIsMHgyMCwweDIxLAorMHg5MywweDgyLDB4YmMsMHgwOCwweDAwLDB4ODMsMHgyMCwweDIxLDB4MzAsMHg4NCwweGZmLDB4ZmYsMHgwMCwweDgyLDB4MTAsMHgyYiwKKzB4MTQsMHg0MCwweDAwLDB4YWEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDk3LDB4ODIsMHhiYywweDBjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4NDQsMHgxMCwweDJiLDB4MTQsMHg0MCwweDAwLDB4N2YsMHgwMCwweDAwLDB4MDAsMHgwMCwweDk3LDB4ODIsMHhiYywweDBhLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDQsMHgxMCwweDJiLDB4MTAsMHg0MCwweDAwLDB4M2EsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MGMsMHgwMCwweDA2LDB4ZDEsMHgyNCwweDA0LDB4MDQsMHg1MCwweDMwLDB4NTEsMHgwMCwweDdmLDB4MDAsMHg0MCwweDgwLDB4MjEsCisweDJlLDB4MjIsMHgwMCwweDMyLDB4MTAsMHg0MCwweDAwLDB4MTMsMHgyNCwweDAyLDB4MDAsMHgyMCwweDEyLDB4MjIsMHgwMCwweDE3LAorMHgyNCwweDAyLDB4ZmYsMHg4MCwweDAyLDB4MDIsMHgxMCwweDI0LDB4MjYsMHgzMSwweDAwLDB4MDEsMHgwMCwweDUxLDB4ODAsMHgyNSwKKzB4MDIsMHgwMCwweDI4LDB4MjEsMHgwYywweDAwLDB4MDYsMHhiZiwweDI0LDB4MDQsMHgwNCwweDUwLDB4MDIsMHgwMCwweDI4LDB4MjEsCisweDBjLDB4MDAsMHgwNiwweGJmLDB4MjQsMHgwNCwweDA0LDB4NTgsMHgwMiwweDAwLDB4MjgsMHgyMSwweDBjLDB4MDAsMHgwNiwweGJmLAorMHgyNCwweDA0LDB4MDQsMHg2MCwweDAyLDB4MDAsMHgyOCwweDIxLDB4MjQsMHgwNCwweDA0LDB4NjgsMHgwYywweDAwLDB4MDYsMHhiZiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHhhNywweDk3LDB4YmMsMHgwMCwweGE3LDB4OTUsMHhiYywweDAyLDB4YTcsMHg5NiwweGJjLDB4MDQsCisweGE3LDB4OTQsMHhiYywweDA2LDB4MDgsMHgwMCwweDA1LDB4ODIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgwNiwweGQxLAorMHgyNCwweDA0LDB4MDIsMHgwOCwweDNjLDB4MDQsMHgwMCwweGMwLDB4MDAsMHg0MCwweDI4LDB4MjEsMHgwMCwweDQ0LDB4MTAsMHgyNCwKKzB4MDAsMHgwMiwweDE1LDB4ODIsMHgyNCwweDAzLDB4MDAsMHgwMywweDEwLDB4NDMsMHgwMCwweDA3LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MDIsMHhmZiwweDNmLDB4MzQsMHg0MiwweGZmLDB4ZmYsMHgwMCwweGEyLDB4MTAsMHgyNCwweDAwLDB4NDQsMHgyOCwweDI1LAorMHgwYywweDAwLDB4MDYsMHhiZiwweDI0LDB4MDQsMHgwMiwweDA4LDB4MGMsMHgwMCwweDA2LDB4ZDEsMHgyNCwweDA0LDB4MDIsMHgyYywKKzB4MDAsMHg0MCwweDkwLDB4MjEsMHgzYywweDAyLDB4ZmYsMHhmZiwweDM0LDB4NDIsMHgzZiwweGZmLDB4MDIsMHg0MiwweDkwLDB4MjQsCisweDAyLDB4NDAsMHgyOCwweDIxLDB4MGMsMHgwMCwweDA2LDB4YmYsMHgyNCwweDA0LDB4MDIsMHgyYywweDA4LDB4MDAsMHgwNSwweGM5LAorMHgyNCwweDAyLDB4ZmYsMHg4MCwweDBjLDB4MDAsMHgwNiwweGQxLDB4MjQsMHgwNCwweDA0LDB4NTAsMHgzMCwweDUxLDB4MDAsMHg3ZiwKKzB4MjQsMHgwMiwweDAwLDB4MjAsMHgxNiwweDIyLDB4ZmYsMHhkYiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDA2LDB4ZDEsCisweDI0LDB4MDQsMHgwMiwweDJjLDB4MzQsMHg1MiwweDQwLDB4MDAsMHgwMiwweDQwLDB4MjgsMHgyMSwweDBjLDB4MDAsMHgwNiwweGJmLAorMHgyNCwweDA0LDB4MDIsMHgyYywweDBjLDB4MDAsMHgwNiwweGQxLDB4MjQsMHgwNCwweDAyLDB4NTgsMHgyNCwweDA0LDB4MDIsMHg1YywKKzB4MGMsMHgwMCwweDA2LDB4ZDEsMHgwMCwweDAyLDB4OWUsMHgwMiwweDMwLDB4NDMsMHgwMCwweGZmLDB4MDAsMHgxMywweDEyLDB4MDAsCisweDAwLDB4NDMsMHgxMCwweDI1LDB4MmMsMHg0MywweDAwLDB4MDQsMHgxNCwweDYwLDB4MDAsMHgxZCwweDJjLDB4NDIsMHgwMCwweDExLAorMHgxMCwweDQwLDB4MDAsMHgwYiwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGZmLDB4ZmYsMHgzNCwweDQyLDB4M2YsMHhmZiwKKzB4MDIsMHg0MiwweDkwLDB4MjQsMHgwMiwweDQwLDB4MjgsMHgyMSwweDI0LDB4MDQsMHgwMiwweDJjLDB4MGMsMHgwMCwweDA2LDB4YmYsCisweDM2LDB4NTIsMHg4MCwweDAwLDB4MDIsMHg0MCwweDI4LDB4MjEsMHgwOCwweDAwLDB4MDUsMHhkNywweDI0LDB4MDQsMHgwMiwweDJjLAorMHgwYywweDAwLDB4MDYsMHhkMSwweDI0LDB4MDQsMHgwMiwweDA4LDB4M2MsMHgwNCwweDAwLDB4YzAsMHgwMCwweDQwLDB4MjgsMHgyMSwKKzB4MDAsMHg0NCwweDEwLDB4MjQsMHgwMCwweDAyLDB4MTUsMHg4MiwweDI0LDB4MDMsMHgwMCwweDAyLDB4MTQsMHg0MywweGZmLDB4ZWUsCisweDNjLDB4MDIsMHhmZiwweDNmLDB4MzQsMHg0MiwweGZmLDB4ZmYsMHgwMCwweGEyLDB4MTAsMHgyNCwweDAwLDB4NDQsMHgyOCwweDI1LAorMHgwYywweDAwLDB4MDYsMHhiZiwweDI0LDB4MDQsMHgwMiwweDA4LDB4MDgsMHgwMCwweDA2LDB4MTMsMHgzYywweDAyLDB4ZmYsMHhmZiwKKzB4MGMsMHgwMCwweDA2LDB4ZDEsMHgyNCwweDA0LDB4MDIsMHgwOCwweDAwLDB4NDAsMHgyOCwweDIxLDB4MDAsMHgwMiwweDE1LDB4ODIsCisweDMwLDB4NDIsMHgwMCwweDAzLDB4MjQsMHgwMywweDAwLDB4MDMsMHgxNCwweDQzLDB4ZmYsMHhkZiwweDNjLDB4MDIsMHhmZiwweDNmLAorMHgzNCwweDQyLDB4ZmYsMHhmZiwweDAwLDB4YTIsMHgxMCwweDI0LDB4M2MsMHgwMywweDAwLDB4ODAsMHgwOCwweDAwLDB4MDYsMHgyOCwKKzB4MDAsMHg0MywweDI4LDB4MjUsMHgwYywweDAwLDB4MDYsMHhkMSwweDI0LDB4MDQsMHgwNCwweDUwLDB4MzAsMHg1MSwweDAwLDB4N2YsCisweDAwLDB4NDAsMHg4MCwweDIxLDB4MmUsMHgyMiwweDAwLDB4MzIsMHgxMCwweDQwLDB4ZmYsMHg5YSwweDI0LDB4MDIsMHgwMCwweDIwLAorMHgxMiwweDIyLDB4MDAsMHgwNCwweDI0LDB4MDIsMHhmZiwweDgwLDB4MDIsMHgwMiwweDEwLDB4MjQsMHgwOCwweDAwLDB4MDUsMHhjYiwKKzB4MjYsMHgzMSwweDAwLDB4MDIsMHgwYywweDAwLDB4MDYsMHhkMSwweDI0LDB4MDQsMHgwMiwweDA4LDB4M2MsMHgwNCwweDAwLDB4YzAsCisweDAwLDB4NDAsMHgyOCwweDIxLDB4MDAsMHg0NCwweDEwLDB4MjQsMHgwMCwweDAyLDB4MTUsMHg4MiwweDI0LDB4MDMsMHgwMCwweDAzLAorMHgxMCwweDQzLDB4MDAsMHgwNywweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGZmLDB4M2YsMHgzNCwweDQyLDB4ZmYsMHhmZiwKKzB4MDAsMHhhMiwweDEwLDB4MjQsMHgwMCwweDQ0LDB4MjgsMHgyNSwweDBjLDB4MDAsMHgwNiwweGJmLDB4MjQsMHgwNCwweDAyLDB4MDgsCisweDBjLDB4MDAsMHgwNiwweGQxLDB4MjQsMHgwNCwweDAyLDB4MmMsMHgwMCwweDQwLDB4OTAsMHgyMSwweDNjLDB4MDIsMHhmZiwweGZmLAorMHgzNCwweDQyLDB4M2YsMHhmZiwweDAyLDB4NDIsMHg5MCwweDI0LDB4MDIsMHg0MCwweDI4LDB4MjEsMHgwYywweDAwLDB4MDYsMHhiZiwKKzB4MjQsMHgwNCwweDAyLDB4MmMsMHgwOCwweDAwLDB4MDYsMHg0MiwweDI0LDB4MDIsMHhmZiwweDgwLDB4MGMsMHgwMCwweDA2LDB4ZDEsCisweDI0LDB4MDQsMHgwNCwweDUwLDB4MDAsMHg0MCwweDgwLDB4MjEsMHgzMCwweDUxLDB4MDAsMHg3ZiwweDI0LDB4MDIsMHgwMCwweDIwLAorMHgxMiwweDIyLDB4MDAsMHgxZCwweDJlLDB4MjIsMHgwMCwweDIxLDB4MTQsMHg0MCwweGZmLDB4NzIsMHgyNCwweDAyLDB4ZmYsMHg4MCwKKzB4MDIsMHgwMiwweDEwLDB4MjQsMHgyNiwweDMxLDB4ZmYsMHhmZiwweDAwLDB4NTEsMHg4MCwweDI1LDB4MjQsMHgwNCwweDA0LDB4NTAsCisweDBjLDB4MDAsMHgwNiwweGJmLDB4MDIsMHgwMCwweDI4LDB4MjEsMHgyNCwweDA0LDB4MDQsMHg1OCwweDBjLDB4MDAsMHgwNiwweGJmLAorMHgwMiwweDAwLDB4MjgsMHgyMSwweDI0LDB4MDQsMHgwNCwweDYwLDB4MGMsMHgwMCwweDA2LDB4YmYsMHgwMiwweDAwLDB4MjgsMHgyMSwKKzB4MDIsMHgwMCwweDI4LDB4MjEsMHgwYywweDAwLDB4MDYsMHhiZiwweDI0LDB4MDQsMHgwNCwweDY4LDB4MjQsMHgwMiwweDAwLDB4MjAsCisweDE2LDB4MjIsMHhmZiwweDYwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwYywweDAwLDB4MDYsMHhkMSwweDI0LDB4MDQsMHgwMiwweDJjLAorMHgwMCwweDQwLDB4OTAsMHgyMSwweDNjLDB4MDIsMHhmZiwweGZmLDB4MzQsMHg0MiwweDNmLDB4ZmYsMHgwMiwweDQyLDB4MTAsMHgyNCwKKzB4MDgsMHgwMCwweDA2LDB4MTksMHgzNCwweDUyLDB4ODAsMHgwMCwweDBjLDB4MDAsMHgwNiwweGQxLDB4MjQsMHgwNCwweDAyLDB4MmMsCisweDM0LDB4NTIsMHg0MCwweDAwLDB4MDIsMHg0MCwweDI4LDB4MjEsMHgwYywweDAwLDB4MDYsMHhiZiwweDI0LDB4MDQsMHgwMiwweDJjLAorMHgwYywweDAwLDB4MDYsMHhkMSwweDI0LDB4MDQsMHgwMiwweDU4LDB4MjQsMHgwNCwweDAyLDB4NWMsMHgwYywweDAwLDB4MDYsMHhkMSwKKzB4MDAsMHgwMiwweDllLDB4MDIsMHgzMCwweDQzLDB4MDAsMHhmZiwweDAwLDB4MTMsMHgxMiwweDAwLDB4MDAsMHg0MywweDEwLDB4MjUsCisweDJjLDB4NDMsMHgwMCwweDA0LDB4MTQsMHg2MCwweDAwLDB4MjAsMHgyYywweDQyLDB4MDAsMHgxMSwweDEwLDB4NDAsMHgwMCwweDBkLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhmZiwweGZmLDB4MzQsMHg0MiwweDNmLDB4ZmYsMHgwMiwweDQyLDB4OTAsMHgyNCwKKzB4MDIsMHg0MCwweDI4LDB4MjEsMHgyNCwweDA0LDB4MDIsMHgyYywweDBjLDB4MDAsMHgwNiwweGJmLDB4MzYsMHg1MiwweDgwLDB4MDAsCisweDAyLDB4NDAsMHgyOCwweDIxLDB4MGMsMHgwMCwweDA2LDB4YmYsMHgyNCwweDA0LDB4MDIsMHgyYywweDA4LDB4MDAsMHgwNiwweDY2LAorMHgyZSwweDIyLDB4MDAsMHgyMSwweDBjLDB4MDAsMHgwNiwweGQxLDB4MjQsMHgwNCwweDAyLDB4MDgsMHgzYywweDA0LDB4MDAsMHhjMCwKKzB4MDAsMHg0MCwweDI4LDB4MjEsMHgwMCwweDQ0LDB4MTAsMHgyNCwweDAwLDB4MDIsMHgxNSwweDgyLDB4MjQsMHgwMywweDAwLDB4MDIsCisweDE0LDB4NDMsMHhmZiwweGVjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4ZmYsMHgzZiwweDM0LDB4NDIsMHhmZiwweGZmLAorMHgwMCwweGEyLDB4MTAsMHgyNCwweDAwLDB4NDQsMHgyOCwweDI1LDB4MGMsMHgwMCwweDA2LDB4YmYsMHgyNCwweDA0LDB4MDIsMHgwOCwKKzB4MDgsMHgwMCwweDA2LDB4OTYsMHgzYywweDAyLDB4ZmYsMHhmZiwweDBjLDB4MDAsMHgwNiwweGQxLDB4MjQsMHgwNCwweDAyLDB4MDgsCisweDAwLDB4NDAsMHgyOCwweDIxLDB4MDAsMHgwMiwweDE1LDB4ODIsMHgzMCwweDQyLDB4MDAsMHgwMywweDI0LDB4MDMsMHgwMCwweDAzLAorMHgxNCwweDQzLDB4ZmYsMHhkYywweDNjLDB4MDMsMHgwMCwweDgwLDB4M2MsMHgwMiwweGZmLDB4M2YsMHgzNCwweDQyLDB4ZmYsMHhmZiwKKzB4MDAsMHhhMiwweDEwLDB4MjQsMHgwOCwweDAwLDB4MDYsMHhhZSwweDAwLDB4NDMsMHgyOCwweDI1LDB4MzAsMHg4MywweDAwLDB4MDMsCisweDAwLDB4MDQsMHgyMCwweDQwLDB4MDAsMHg4MywweDIwLDB4MjMsMHgzYywweDAyLDB4YjAsMHgwYSwweDAwLDB4ODIsMHgyMCwweDIxLAorMHgzYywweDA2LDB4MDAsMHgwMSwweGFjLDB4ODUsMHgwMCwweDAwLDB4MjQsMHgwNywweDAwLDB4MDEsMHgwMCwweDAwLDB4MjgsMHgyMSwKKzB4MzQsMHhjNiwweDg2LDB4OWYsMHg4YywweDgyLDB4MTAsMHgwMCwweDI0LDB4YTUsMHgwMCwweDAxLDB4MTAsMHg0NywweDAwLDB4MDMsCisweDAwLDB4YzUsMHgxOCwweDJiLDB4MTAsMHg2MCwweGZmLDB4ZmIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4ODMsMHgwMCwweDAzLDB4MDAsMHgwNCwweDIwLDB4NDAsMHgzYywweDAyLDB4YjAsMHgwYSwKKzB4MDAsMHg4MywweDIwLDB4MjMsMHgwMCwweDgyLDB4MjAsMHgyMSwweDNjLDB4MDYsMHgwMCwweDAxLDB4MjQsMHgwMiwweGZmLDB4ZmYsCisweGFjLDB4ODIsMHgxMCwweDAwLDB4MDAsMHgwMCwweDI4LDB4MjEsMHgyNCwweDA3LDB4MDAsMHgwMSwweDM0LDB4YzYsMHg4NiwweDlmLAorMHg4YywweDgyLDB4MTAsMHgwMCwweDI0LDB4YTUsMHgwMCwweDAxLDB4MTAsMHg0NywweDAwLDB4MDMsMHgwMCwweGM1LDB4MTgsMHgyYiwKKzB4MTAsMHg2MCwweGZmLDB4ZmIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4ODIsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwNSwweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDI0LDB4NDIsMHgxYiwweDk0LAorMHgyNCwweDAzLDB4MDAsMHgwMSwweDM0LDB4YTUsMHgwMCwweDIwLDB4M2MsMHgwNiwweGIwLDB4MDMsMHhhYywweGEyLDB4MDAsMHgwMCwKKzB4MzQsMHhjNiwweDAxLDB4MDQsMHhhMCwweDgzLDB4MDAsMHg0OCwweGEwLDB4ODAsMHgwMCwweDA0LDB4YTAsMHg4MCwweDAwLDB4MDUsCisweGEwLDB4ODAsMHgwMCwweDA2LDB4YTAsMHg4MCwweDAwLDB4MDcsMHhhMCwweDgwLDB4MDAsMHgwOCwweGEwLDB4ODAsMHgwMCwweDA5LAorMHhhMCwweDgwLDB4MDAsMHgwYSwweGEwLDB4ODAsMHgwMCwweDExLDB4YTAsMHg4MCwweDAwLDB4MTMsMHhhMCwweDgwLDB4MDAsMHg0OSwKKzB4OTQsMHhjMiwweDAwLDB4MDAsMHhhYywweDgwLDB4MDAsMHgwMCwweGEwLDB4ODAsMHgwMCwweDRlLDB4MDAsMHgwMiwweDE0LDB4MDAsCisweDAwLDB4MDIsMHgxNCwweDAzLDB4MzAsMHg0MywweDAwLDB4ZmYsMHgzMCwweDQyLDB4ZmYsMHgwMCwweGE0LDB4ODIsMHgwMCwweDQ0LAorMHhhNCwweDgzLDB4MDAsMHg0NiwweGFjLDB4ODAsMHgwMCwweDI0LDB4YWMsMHg4MCwweDAwLDB4MjgsMHhhYywweDgwLDB4MDAsMHgyYywKKzB4YWMsMHg4MCwweDAwLDB4MzAsMHhhYywweDgwLDB4MDAsMHgzNCwweGFjLDB4ODAsMHgwMCwweDM4LDB4YWMsMHg4MCwweDAwLDB4M2MsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4YWMsMHg4MCwweDAwLDB4NDAsMHg4NCwweDgzLDB4MDAsMHgwYywweDNjLDB4MDcsMHhiMCwweDAzLAorMHgzNCwweGU3LDB4MDAsMHgyMCwweDAwLDB4MDMsMHgxMCwweGMwLDB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwKKzB4MjcsMHg4MywweDkwLDB4MDQsMHgwMCwweDQzLDB4MTAsMHgyMSwweDhjLDB4NDgsMHgwMCwweDE4LDB4M2MsMHgwMiwweDgwLDB4MDAsCisweDI0LDB4NDIsMHgxYywweDI4LDB4YWMsMHhlMiwweDAwLDB4MDAsMHg4ZCwweDAzLDB4MDAsMHgwOCwweDgwLDB4ODIsMHgwMCwweDEzLAorMHgwMCwweDA1LDB4MmMsMHgwMCwweDAwLDB4MDMsMHgxZSwweDAyLDB4MDAsMHgwMiwweDEyLDB4MDAsMHgzMCwweDYzLDB4MDAsMHg3ZSwKKzB4MDAsMHg2MiwweDE4LDB4MjEsMHgwMCwweDY1LDB4MTgsMHgyMSwweDNjLDB4MDIsMHhjMCwweDAwLDB4M2MsMHgwNSwweGIwLDB4MDUsCisweDM0LDB4NDIsMHgwNCwweDAwLDB4MjQsMHg2MywweDAwLDB4MDEsMHgzYywweDA3LDB4YjAsMHgwNSwweDNjLDB4MDgsMHhiMCwweDA1LAorMHgzNCwweGE1LDB4MDQsMHgyMCwweGFjLDB4YTMsMHgwMCwweDAwLDB4MDAsMHhjMiwweDMwLDB4MjEsMHgzNCwweGU3LDB4MDQsMHgyNCwKKzB4MzUsMHgwOCwweDAyLDB4MjgsMHgyNCwweDAyLDB4MDAsMHgwMSwweDI0LDB4MDMsMHgwMCwweDIwLDB4YWMsMHhlNiwweDAwLDB4MDAsCisweGFjLDB4ODIsMHgwMCwweDNjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhMSwweDAzLDB4MDAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGE4LAorMHgwMCwweDA3LDB4NjAsMHg4MCwweDI3LDB4ODIsMHhiNCwweDAwLDB4YWYsMHhiZSwweDAwLDB4NTAsMHhhZiwweGI3LDB4MDAsMHg0YywKKzB4YWYsMHhiNSwweDAwLDB4NDQsMHhhZiwweGI0LDB4MDAsMHg0MCwweGFmLDB4YmYsMHgwMCwweDU0LDB4YWYsMHhiNiwweDAwLDB4NDgsCisweGFmLDB4YjMsMHgwMCwweDNjLDB4YWYsMHhiMiwweDAwLDB4MzgsMHhhZiwweGIxLDB4MDAsMHgzNCwweGFmLDB4YjAsMHgwMCwweDMwLAorMHgwMSwweDgyLDB4MTAsMHgyMSwweDhjLDB4NDMsMHgwMCwweDAwLDB4MDAsMHhlMCwweDcwLDB4MjEsMHgzYywweDAyLDB4ODAsMHgwMCwKKzB4OTQsMHg3MywweDAwLDB4MTQsMHgzYywweDA3LDB4YjAsMHgwMywweDM0LDB4ZTcsMHgwMCwweDIwLDB4MjQsMHg0MiwweDFjLDB4YmMsCisweDNjLDB4MDMsMHhiMCwweDA1LDB4YWMsMHhlMiwweDAwLDB4MDAsMHgzNCwweDYzLDB4MDEsMHgyOCwweDkwLDB4NjcsMHgwMCwweDAwLAorMHgwMCwweDEzLDB4YTgsMHhjMCwweDAyLDB4YjMsMHgxOCwweDIxLDB4MjcsMHg4MiwweDkwLDB4MDQsMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4MDAsMHg2MiwweDE4LDB4MjEsMHgwMCwweDA1LDB4MmMsMHgwMCwweDAwLDB4MDcsMHgzZSwweDAwLDB4MjgsMHhjMiwweDAwLDB4MDMsCisweDAwLDB4YzAsMHhhMCwweDIxLDB4MDAsMHg4MCwweDc4LDB4MjEsMHgwMCwweDA1LDB4YmMsMHgwMywweDhjLDB4NjgsMHgwMCwweDE4LAorMHgwMiwweGEwLDB4NTgsMHgyMSwweDEwLDB4NDAsMHgwMSwweDgxLDB4MDAsMHgwNywweGY2LDB4MDMsMHgwMCwweGRlLDB4MTAsMHgwNywKKzB4MzAsMHg1ZSwweDAwLDB4MDEsMHgwMSwweDczLDB4MTAsMHgyMSwweDI3LDB4ODMsMHg5MCwweDA4LDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4ODAsMHg0ZCwweDAwLDB4MDYsMHg4ZCwweDAzLDB4MDAsMHgwMCwweDhkLDB4MDIsMHgwMCwweDA0LAorMHg4ZCwweDBhLDB4MDAsMHgwOCwweDhkLDB4MDMsMHgwMCwweDBjLDB4YWYsMHhhMiwweDAwLDB4MjAsMHgxMSwweGEwLDB4MDEsMHg3MSwKKzB4YWYsMHhhMywweDAwLDB4MTgsMHgyNywweDgyLDB4YjQsMHgwMCwweDAxLDB4ODIsMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTAsMHg4MywweDAwLDB4MTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NjMsMHgwMCwweDA0LAorMHgxNCwweDYwLDB4MDAsMHgxMiwweDAwLDB4MDAsMHhiMCwweDIxLDB4M2MsMHgwMiwweGIwLDB4MDksMHgzNCwweDQyLDB4MDEsMHg0NiwKKzB4OTAsMHg0MywweDAwLDB4MDAsMHgyYSwweDg0LDB4MDAsMHgwNCwweDEwLDB4ODAsMHgwMSwweDU2LDB4MzAsMHg2NSwweDAwLDB4MDEsCisweDkxLDB4ZTIsMHgwMCwweDA5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMiwweDgyLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MjgsMHgyMSwweDE0LDB4YTAsMHgwMCwweDAzLDB4MDAsMHgwMCwweDM4LDB4MjEsMHgxMywweGMwLDB4MDAsMHgwMywKKzB4MzgsMHhmNiwweDAwLDB4MDEsMHgyNCwweDA3LDB4MDAsMHgwMSwweDM4LDB4ZjYsMHgwMCwweDAxLDB4MDEsMHg3MywweDEwLDB4MjEsCisweDAwLDB4MDIsMHgzMCwweDgwLDB4MjcsMHg4MywweDkwLDB4MTAsMHgwMCwweGMzLDB4NDgsMHgyMSwweDkxLDB4MjUsMHgwMCwweDAwLAorMHg4ZiwweGE0LDB4MDAsMHgyMCwweDJjLDB4YTMsMHgwMCwweDA0LDB4MDAsMHgwNCwweDExLDB4YzMsMHgzMCwweDQyLDB4MDAsMHgwMSwKKzB4MDAsMHgwMywweGIwLDB4MGIsMHgxMiwweGMwLDB4MDAsMHhkOCwweGFmLDB4YTIsMHgwMCwweDI0LDB4OTMsMHg5MCwweGJiLDB4ZWEsCisweDAwLDB4MGEsMHgxNiwweDQyLDB4MzAsMHg1MiwweDAwLDB4M2YsMHgyZSwweDA2LDB4MDAsMHgwYywweDEwLDB4YzAsMHgwMCwweGMwLAorMHgwMCwweGEwLDB4MjAsMHgyMSwweDJjLDB4YTIsMHgwMCwweDEwLDB4MTQsMHg0MCwweDAwLDB4MDQsMHgwMCwweDkwLDB4MTAsMHgyYiwKKzB4MzAsMHhhMiwweDAwLDB4MDcsMHgyNCwweDQ0LDB4MDAsMHgwNCwweDAwLDB4OTAsMHgxMCwweDJiLDB4MTAsMHg0MCwweDAwLDB4MGIsCisweDAxLDB4NzMsMHgxMCwweDIxLDB4MjcsMHg4NSwweGJiLDB4MWMsMHgwMCwweDEwLDB4MTAsMHg0MCwweDAwLDB4NTAsMHgxMCwweDIxLAorMHgwMCwweDQ1LDB4MTAsMHgyMSwweDkwLDB4NTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDkwLDB4MTgsMHgyYiwKKzB4MTQsMHg2MCwweGZmLDB4ZmEsMHgwMCwweDEwLDB4MTAsMHg0MCwweDAxLDB4NzMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDI3LDB4ODMsMHg5MCwweDA4LDB4MDAsMHg0MywweDEwLDB4MjEsMHgzMSwweGE0LDB4MDAsMHgwMSwweDEwLDB4ODAsMHgwMCwweGE1LAorMHhhMCwweDUwLDB4MDAsMHgwNywweDNjLDB4MDQsMHhiMCwweDA1LDB4MzQsMHg4NCwweDAwLDB4MDgsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4M2MsMHgwMywweDgwLDB4MDAsMHhhMSwweGUyLDB4MDAsMHg0ZSwweGFjLDB4ODMsMHgwMCwweDAwLDB4OGMsMHg4NSwweDAwLDB4MDAsCisweDNjLDB4MDIsMHgwMCwweGYwLDB4M2MsMHgwMywweDQwLDB4ZjAsMHgzNCwweDQyLDB4ZjAsMHgwMCwweDM0LDB4NjMsMHhmMCwweDAwLAorMHgyNCwweDE3LDB4MDAsMHgwZSwweDI0LDB4MTMsMHgwMSwweDA2LDB4YWMsMHg4MiwweDAwLDB4MDAsMHhhYywweDgzLDB4MDAsMHgwMCwKKzB4MjcsMHg4MiwweGI0LDB4MDAsMHgwMSwweDgyLDB4MTAsMHgyMSwweDhjLDB4NDMsMHgwMCwweDAwLDB4MjQsMHgwNSwweDAwLDB4MDEsCisweGFmLDB4YTUsMHgwMCwweDFjLDB4OTAsMHg2MiwweDAwLDB4MTYsMHgwMCwweDEzLDB4YTgsMHhjMCwweDMyLDB4NTEsMHgwMCwweDAyLAorMHgzNCwweDQyLDB4MDAsMHgwNCwweGEwLDB4NjIsMHgwMCwweDE2LDB4OGYsMHhhMywweDAwLDB4MjAsMHg4ZiwweGE0LDB4MDAsMHgxOCwKKzB4MDAsMHgwMywweDEzLDB4NDMsMHgwMCwweDA0LDB4MWEsMHgwMiwweDMwLDB4NDcsMHgwMCwweDAxLDB4MTIsMHgyMCwweDAwLDB4MDQsCisweDMwLDB4NjQsMHgwNywweGZmLDB4MmUsMHgwMywweDAwLDB4MDQsMHgzMiwweDQyLDB4MDAsMHgzMywweDAwLDB4NDMsMHg5MCwweDBiLAorMHg4ZiwweGE1LDB4MDAsMHgyNCwweDhmLDB4YTYsMHgwMCwweDFjLDB4MDAsMHgxMiwweDEwLDB4NDAsMHgwMCwweDA1LDB4MTksMHhjMCwKKzB4MDAsMHg0NywweDEwLDB4MjEsMHgwMCwweDA2LDB4MmEsMHg4MCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgxMCwweDMyLDB4MDAsCisweDAwLDB4MDQsMHgyNCwweDgwLDB4MDIsMHg2NSwweDI4LDB4MjEsMHgwMCwweGE0LDB4MjgsMHgyMSwweDAwLDB4NDYsMHgxMCwweDIxLAorMHgwMCwweDE3LDB4MWMsMHgwMCwweDNjLDB4MDQsMHhjMCwweDAwLDB4MDAsMHg0MywweDMwLDB4MjEsMHgxNiwweDgwLDB4MDAsMHgyOSwKKzB4MDAsMHhhNCwweDI4LDB4MjEsMHgzYywweDAyLDB4YjAsMHgwNSwweDM0LDB4NDIsMHgwNCwweDAwLDB4M2MsMHgwMywweGIwLDB4MDUsCisweDNjLDB4MDQsMHhiMCwweDA1LDB4YWMsMHg0NiwweDAwLDB4MDAsMHgzNCwweDYzLDB4MDQsMHgwNCwweDM0LDB4ODQsMHgwMiwweDI4LAorMHgyNCwweDAyLDB4MDAsMHgwMSwweGFjLDB4NjUsMHgwMCwweDAwLDB4YTAsMHg4MiwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwOSwKKzB4MzQsMHg0MiwweDAxLDB4NDYsMHg5MCwweDQ0LDB4MDAsMHgwMCwweDkxLDB4ZTMsMHgwMCwweDA5LDB4MzAsMHg4NiwweDAwLDB4MDEsCisweDAyLDB4ODMsMHgxOCwweDI2LDB4MDAsMHgwMywweDMwLDB4MGIsMHgxNCwweGMwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgyOCwweDIxLAorMHgxMywweGMwLDB4MDAsMHgwMywweDAyLDB4YjMsMHgxMCwweDIxLDB4MjQsMHgwNSwweDAwLDB4MDEsMHgwMiwweGIzLDB4MTAsMHgyMSwKKzB4MjcsMHg4MywweDkwLDB4MDgsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDMsMHgxMCwweDIxLDB4ODQsMHg0OCwweDAwLDB4MDQsCisweDAwLDB4YTAsMHgzMCwweDIxLDB4MDAsMHhlMCwweDIwLDB4MjEsMHgwMiwweDgwLDB4MjgsMHgyMSwweDAyLDB4YzAsMHgzOCwweDIxLAorMHgwYywweDAwLDB4MDAsMHg3MCwweGFmLDB4YTgsMHgwMCwweDEwLDB4N2IsMHhiZSwweDAyLDB4YmMsMHg3YiwweGI2LDB4MDIsMHg3YywKKzB4N2IsMHhiNCwweDAyLDB4M2MsMHg3YiwweGIyLDB4MDEsMHhmYywweDdiLDB4YjAsMHgwMSwweGJjLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDU4LDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMiwweDgyLDB4MDAsMHgzZCwweDNjLDB4MDIsMHhiMCwweDA1LAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDEyLDB4ODIsMHgwMCwweDMxLDB4M2MsMHgwMiwweGIwLDB4MDUsMHgyNCwweDAyLDB4MDAsMHgwMywKKzB4MTIsMHg4MiwweDAwLDB4MjUsMHgzYywweDAyLDB4YjAsMHgwNSwweDI0LDB4MDIsMHgwMCwweDEwLDB4MTIsMHg4MiwweDAwLDB4MTksCisweDNjLDB4MDIsMHhiMCwweDA1LDB4MjQsMHgwMiwweDAwLDB4MTEsMHgxMiwweDgyLDB4MDAsMHgwZCwweDNjLDB4MDIsMHhiMCwweDA1LAorMHgyNCwweDAyLDB4MDAsMHgxMiwweDE2LDB4ODIsMHhmZiwweGQxLDB4M2MsMHgwMiwweGIwLDB4MDUsMHgzYywweDAzLDB4YjAsMHgwNSwKKzB4MzQsMHg0MiwweDA0LDB4MjAsMHgzYywweDA0LDB4YjAsMHgwNSwweDM0LDB4NjMsMHgwNCwweDI0LDB4YWMsMHg0NiwweDAwLDB4MDAsCisweDM0LDB4ODQsMHgwMiwweDI4LDB4YWMsMHg2NSwweDAwLDB4MDAsMHgwOCwweDAwLDB4MDcsMHhlNiwweDI0LDB4MDIsMHgwMCwweDIwLAorMHgzNCwweDQyLDB4MDQsMHg0MCwweDNjLDB4MDMsMHhiMCwweDA1LDB4M2MsMHgwNCwweGIwLDB4MDUsMHhhYywweDQ2LDB4MDAsMHgwMCwKKzB4MzQsMHg2MywweDA0LDB4NDQsMHgzNCwweDg0LDB4MDIsMHgyOCwweDI0LDB4MDIsMHgwMCwweDQwLDB4MDgsMHgwMCwweDA3LDB4ZTYsCisweGFjLDB4NjUsMHgwMCwweDAwLDB4MzQsMHg0MiwweDA0LDB4MjgsMHgzYywweDAzLDB4YjAsMHgwNSwweDNjLDB4MDQsMHhiMCwweDA1LAorMHhhYywweDQ2LDB4MDAsMHgwMCwweDM0LDB4NjMsMHgwNCwweDJjLDB4MzQsMHg4NCwweDAyLDB4MjgsMHgyNCwweDAyLDB4ZmYsMHg4MCwKKzB4MDgsMHgwMCwweDA3LDB4ZTYsMHhhYywweDY1LDB4MDAsMHgwMCwweDM0LDB4NDIsMHgwNCwweDE4LDB4M2MsMHgwMywweGIwLDB4MDUsCisweDNjLDB4MDQsMHhiMCwweDA1LDB4YWMsMHg0NiwweDAwLDB4MDAsMHgzNCwweDYzLDB4MDQsMHgxYywweDM0LDB4ODQsMHgwMiwweDI4LAorMHgyNCwweDAyLDB4MDAsMHgwOCwweDA4LDB4MDAsMHgwNywweGU2LDB4YWMsMHg2NSwweDAwLDB4MDAsMHgzNCwweDQyLDB4MDQsMHgxMCwKKzB4M2MsMHgwMywweGIwLDB4MDUsMHgzYywweDA0LDB4YjAsMHgwNSwweGFjLDB4NDYsMHgwMCwweDAwLDB4MzQsMHg2MywweDA0LDB4MTQsCisweDM0LDB4ODQsMHgwMiwweDI4LDB4MjQsMHgwMiwweDAwLDB4MDQsMHgwOCwweDAwLDB4MDcsMHhlNiwweGFjLDB4NjUsMHgwMCwweDAwLAorMHgzNCwweDQyLDB4MDQsMHgwOCwweDNjLDB4MDMsMHhiMCwweDA1LDB4M2MsMHgwNCwweGIwLDB4MDUsMHhhYywweDQ2LDB4MDAsMHgwMCwKKzB4MzQsMHg2MywweDA0LDB4MGMsMHgzNCwweDg0LDB4MDIsMHgyOCwweDI0LDB4MDIsMHgwMCwweDAyLDB4MDgsMHgwMCwweDA3LDB4ZTYsCisweGFjLDB4NjUsMHgwMCwweDAwLDB4MjQsMHgxNywweDAwLDB4MTQsMHgwOCwweDAwLDB4MDcsMHhiOCwweDI0LDB4MTMsMHgwMSwweDAyLAorMHgzMCwweGEyLDB4MDAsMHgwNywweDI0LDB4NDQsMHgwMCwweDBjLDB4MDAsMHg5MCwweDE4LDB4MmIsMHgxMCwweDYwLDB4MDAsMHgwYywKKzB4MjYsMHgwMiwweDAwLDB4MDQsMHgyNywweDg1LDB4YmIsMHgxYywweDAwLDB4MTAsMHgxMCwweDQwLDB4MDAsMHg1MCwweDEwLDB4MjEsCisweDAwLDB4NDUsMHgxMCwweDIxLDB4OTAsMHg1MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTAsMHgxOCwweDJiLAorMHgxNCwweDYwLDB4ZmYsMHhmYSwweDAwLDB4MTAsMHgxMCwweDQwLDB4MmUsMHgwNiwweDAwLDB4MGMsMHgyNiwweDAyLDB4MDAsMHgwNCwKKzB4MDgsMHgwMCwweDA3LDB4YTIsMHgwMCwweDQ2LDB4ODAsMHgwYSwweDI3LDB4ODIsMHhiNCwweDAwLDB4MDEsMHg4MiwweDIwLDB4MjEsCisweDhjLDB4ODcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MCwweGUyLDB4MDAsMHgxOSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxNCwweDQwLDB4MDAsMHgwNywweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg4MiwweDkwLDB4MjAsMHgwMCwweGMyLDB4MTAsMHgyMSwKKzB4OTAsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NjAsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDkwLDB4ZTMsMHgwMCwweDE2LDB4MjcsMHg4MiwweDkwLDB4MDgsMHgwMCwweGMyLDB4MTAsMHgyMSwweDM0LDB4NjMsMHgwMCwweDIwLAorMHg5MCwweDUwLDB4MDAsMHgwNywweGEwLDB4ZTMsMHgwMCwweDE2LDB4OGMsMHg4NCwweDAwLDB4MDAsMHgwMCwweDBhLDB4MWUsMHg0MiwKKzB4MjQsMHgwNiwweDAwLDB4MDEsMHg5MCwweDgyLDB4MDAsMHgxNiwweDMwLDB4NzEsMHgwMCwweDAyLDB4MzAsMHg3MiwweDAwLDB4M2YsCisweDMwLDB4NDIsMHgwMCwweGZiLDB4MjQsMHgxNywweDAwLDB4MTgsMHgyNCwweDEzLDB4MDEsMHgwMywweDI0LDB4MTUsMHgwOCwweDE4LAorMHhhZiwweGE2LDB4MDAsMHgxYywweDA4LDB4MDAsMHgwNywweGMyLDB4YTAsMHg4MiwweDAwLDB4MTYsMHg4ZCwweDAyLDB4MDAsMHgwNCwKKzB4MDAsMHgwYSwweDFjLDB4NDIsMHgzMCwweDQyLDB4MDAsMHgxMCwweDE0LDB4NDAsMHgwMCwweDE1LDB4MzAsMHg3MiwweDAwLDB4M2YsCisweDgxLDB4MjIsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgxMSwweDMwLDB4NzIsMHgwMCwweDNlLAorMHgyNywweDgzLDB4OTAsMHgxOCwweDAwLDB4YzMsMHgxOCwweDIxLDB4ODAsMHg2NCwweDAwLDB4MDAsMHgyNywweDgzLDB4YjUsMHg3OCwKKzB4MDAsMHgwNCwweDExLDB4MDAsMHgwMCwweDQ0LDB4MTAsMHgyMywweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0NCwweDEwLDB4MjMsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjEsMHg5MCwweDQ0LDB4MDAsMHgwNSwweDkwLDB4NDMsMHgwMCwweDA0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NjQsMHgxOCwweDI0LDB4MzAsMHg2MywweDAwLDB4MDEsMHgwMiwweDQzLDB4OTAsMHgyNSwKKzB4MjcsMHg4NSwweGI0LDB4MDAsMHgwMSwweDg1LDB4MjgsMHgyMSwweDhjLDB4YTYsMHgwMCwweDAwLDB4MDEsMHg3MywweDEwLDB4MjEsCisweDI3LDB4ODMsMHg5MCwweDEwLDB4OTAsMHhjNCwweDAwLDB4MTYsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHgzMCwweDg0LDB4MDAsMHhkZiwweDkwLDB4NTAsMHgwMCwweDAwLDB4YTAsMHhjNCwweDAwLDB4MTYsMHg4MCwweGM2LDB4MDAsMHgxMiwKKzB4OGMsMHhhMywweDAwLDB4MDAsMHgyZCwweGM0LDB4MDAsMHgwMiwweGFmLDB4YTYsMHgwMCwweDFjLDB4OTAsMHg2MiwweDAwLDB4MTYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZmIsMHgxNCwweDgwLDB4MDAsMHgwNiwweGEwLDB4NjIsMHgwMCwweDE2LAorMHgyNCwweDAyLDB4MDAsMHgwNiwweDExLDB4YzIsMHgwMCwweDAzLDB4MjQsMHgwMiwweDAwLDB4MDQsMHgxNSwweGMyLDB4ZmYsMHgwZSwKKzB4MzIsMHg1MSwweDAwLDB4MDIsMHgzMiwweDUxLDB4MDAsMHgwMiwweDJlLDB4MDIsMHgwMCwweDBjLDB4MTQsMHg0MCwweDAwLDB4MGYsCisweDAwLDB4MTEsMHgxOCwweDJiLDB4MzIsMHgwMiwweDAwLDB4MGYsMHgzNCwweDQyLDB4MDAsMHgxMCwweDAwLDB4MDMsMHgxOSwweDAwLAorMHgwMCwweDQzLDB4MTgsMHgyMSwweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAwLDB4ZTAsMHhhMCwweDQzLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDIwLDB4MjEsMHgwMiwweDAwLDB4MjgsMHgyMSwweDBjLDB4MDAsMHgwMiwweDAzLDB4YWYsMHhhZiwweDAwLDB4MjgsCisweDhmLDB4YWYsMHgwMCwweDI4LDB4MDgsMHgwMCwweDA3LDB4YzIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwOCwweGJkLAorMHgzMiwweDAzLDB4MDAsMHhmZiwweDNjLDB4MDMsMHhiMCwweDA1LDB4MzQsMHg2MywweDAyLDB4NDIsMHg5MCwweDYyLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHgwZiwweDE0LDB4NDAsMHhmZSwweGFhLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDkxLDB4ZTIsMHgwMCwweDA5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDgyLDB4MTAsMHgyNiwweDA4LDB4MDAsMHgwNywweDc5LAorMHgwMCwweDAyLDB4MjgsMHgwYiwweDA4LDB4MDAsMHgwNywweDdmLDB4MDAsMHgwMCwweGIwLDB4MjEsMHgyNCwweDAyLDB4MDAsMHgxMCwKKzB4MTAsMHhjMiwweDAwLDB4MDgsMHgyNCwweDAyLDB4MDAsMHgxMSwweDEwLDB4YzIsMHhmZSwweDdkLDB4MDAsMHgwNywweDE3LDB4ODMsCisweDI0LDB4MDIsMHgwMCwweDEyLDB4MTQsMHhjMiwweGZlLDB4N2IsMHgwMCwweDA3LDB4MTcsMHg0MywweDA4LDB4MDAsMHgwNywweDU5LAorMHgzMCwweDVlLDB4MDAsMHgwMSwweDA4LDB4MDAsMHgwNywweDU5LDB4MDAsMHgwNywweGY3LDB4YzIsMHgwMCwweDA0LDB4MTAsMHg0MCwKKzB4MjcsMHg4MywweDgwLDB4MWMsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4ODAsMHg0MCwweDIxLDB4OTQsMHg0NCwweDAwLDB4MDAsCisweDJkLDB4MDcsMHgwMCwweDA0LDB4MjQsMHhjMiwweDAwLDB4MDMsMHgwMCwweDQ3LDB4MzAsMHgwYSwweDAwLDB4ODYsMHgwMCwweDE4LAorMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLDB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4MjMsMHg4YywKKzB4YWMsMHg2MiwweDAwLDB4MDAsMHgyZCwweDA2LDB4MDAsMHgxMCwweDAwLDB4MDAsMHgyMCwweDEyLDB4MDAsMHgwNCwweDIyLDB4NDIsCisweDI0LDB4ODQsMHgwMCwweDAxLDB4MjQsMHg4MywweDAwLDB4YzAsMHgxMCwweGUwLDB4MDAsMHgwYiwweDI0LDB4ODIsMHgwMCwweDYwLAorMHgwMCwweDQwLDB4MjAsMHgyMSwweDAwLDB4NjUsMHgyMCwweDBhLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzNCwweDYzLDB4MDEsMHgwMCwKKzB4OTAsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweDAxLDB4MDAsMHg0NCwweDIwLDB4MDQsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHg4MCwweDEwLDB4MjEsMHgyNCwweDg1LDB4MDAsMHgyOCwweDI0LDB4ODMsMHgwMCwweDI0LAorMHgzMSwweDAyLDB4MDAsMHgwOCwweDE0LDB4YzAsMHhmZiwweGY0LDB4MjQsMHg4NCwweDAwLDB4MTQsMHgwMCwweDYwLDB4MjAsMHgyMSwKKzB4MDgsMHgwMCwweDA4LDB4ZmEsMHgwMCwweGEyLDB4MjAsMHgwYiwweDI3LDB4YmQsMHhmZiwweGUwLDB4M2MsMHgwMywweGIwLDB4MDMsCisweDNjLDB4MDIsMHg4MCwweDAwLDB4YWYsMHhiMCwweDAwLDB4MTAsMHgyNCwweDQyLDB4MjQsMHgyOCwweDAwLDB4ODAsMHg4MCwweDIxLAorMHgzNCwweDYzLDB4MDAsMHgyMCwweDNjLDB4MDQsMHhiMCwweDAzLDB4YWYsMHhiMiwweDAwLDB4MTgsMHhhZiwweGIxLDB4MDAsMHgxNCwKKzB4YWYsMHhiZiwweDAwLDB4MWMsMHg4MywweGIxLDB4MDAsMHgzMywweDgzLDB4YTgsMHgwMCwweDM3LDB4MzQsMHg4NCwweDAxLDB4MTAsCisweGFjLDB4NjIsMHgwMCwweDAwLDB4MmUsMHgwMiwweDAwLDB4MTAsMHgwMCwweGUwLDB4OTAsMHgyMSwweDhjLDB4ODcsMHgwMCwweDAwLAorMHgxNCwweDQwLDB4MDAsMHgwYywweDJlLDB4MDIsMHgwMCwweDBjLDB4M2MsMHgwMiwweDAwLDB4MGYsMHgzNCwweDQyLDB4ZjAsMHgwMCwKKzB4MDAsMHhlMiwweDEwLDB4MjQsMHgxNCwweDQwLDB4MDAsMHgzNywweDMyLDB4MDIsMHgwMCwweDA4LDB4MzIsMHgwMiwweDAwLDB4MDcsCisweDI3LDB4ODMsMHg4MCwweGNjLDB4MDAsMHg0MywweDEwLDB4MjEsMHg5MCwweDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyZSwweDAyLDB4MDAsMHgwYywweDE0LDB4NDAsMHgwMCwweDAzLDB4MDIsMHgwMCwweDIwLDB4MjEsMHgzMiwweDAyLDB4MDAsMHgwZiwKKzB4MjQsMHg0NCwweDAwLDB4MGMsMHgwMCwweDg3LDB4MTAsMHgwNiwweDMwLDB4NDIsMHgwMCwweDAxLDB4MTQsMHg0MCwweDAwLDB4MDcsCisweDJjLDB4ODIsMHgwMCwweDBjLDB4MDAsMHgwNCwweDEwLDB4ODAsMHgyNywweDgzLDB4YjQsMHg1MCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHg4YywweDQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MmMsMHg4MiwweDAwLDB4MGMsMHgxNCwweDQwLDB4MDAsMHgwNSwKKzB4MDAsMHgwNSwweDEwLDB4NDAsMHgwMCwweDQ2LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMSwweDAwLDB4MDAsMHg4MiwweDEwLDB4MjEsCisweDI0LDB4NDQsMHgwMCwweDA0LDB4MTUsMHgwMCwweDAwLDB4MDIsMHgyNCwweDA2LDB4MDAsMHgyMCwweDI0LDB4MDYsMHgwMCwweDBlLAorMHgwYywweDAwLDB4MDgsMHhlMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MCwweDMwLDB4MjEsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4MzQsMHg0MiwweDAxLDB4MDAsMHg5MCwweDQzLDB4MDAsMHgwMCwweDJlLDB4MDQsMHgwMCwweDA0LDB4MjQsMHgwMiwweDAwLDB4MTAsCisweDI0LDB4MDUsMHgwMCwweDBhLDB4MDAsMHg0NCwweDI4LDB4MGEsMHgzMCwweDYzLDB4MDAsMHgwMSwweDE0LDB4NjAsMHgwMCwweDAyLAorMHgwMCwweDA1LDB4MTAsMHg0MCwweDAwLDB4YTAsMHgxMCwweDIxLDB4MzAsMHg0NSwweDAwLDB4ZmYsMHgwMCwweGM1LDB4MTAsMHgyMSwKKzB4MjQsMHg0NiwweDAwLDB4NDYsMHgwMiwweDI2LDB4MTgsMHgwNCwweGE2LDB4NDMsMHgwMCwweDAwLDB4OGYsMHhiZiwweDAwLDB4MWMsCisweDhmLDB4YjIsMHgwMCwweDE4LDB4N2IsMHhiMCwweDAwLDB4YmMsMHgwMCwweGMwLDB4MTAsMHgyMSwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgyMCwweDEwLDB4NDAsMHhmZiwweGNmLDB4MmUsMHgwMiwweDAwLDB4MGMsMHgzMiwweDAyLDB4MDAsMHgwNywKKzB4MjcsMHg4MywweDgwLDB4YzQsMHgwMCwweDQzLDB4MTAsMHgyMSwweDkwLDB4NDQsMHgwMCwweDAwLDB4MDgsMHgwMCwweDA5LDB4MjgsCisweDAyLDB4MDQsMHg4MCwweDIzLDB4MjcsMHhiZCwweGZmLDB4YjgsMHgwMCwweDA1LDB4MzgsMHg4MCwweDI3LDB4ODIsMHhiNCwweDAwLAorMHhhZiwweGJlLDB4MDAsMHg0MCwweGFmLDB4YjYsMHgwMCwweDM4LDB4YWYsMHhiMywweDAwLDB4MmMsMHhhZiwweGJmLDB4MDAsMHg0NCwKKzB4YWYsMHhiNywweDAwLDB4M2MsMHhhZiwweGI1LDB4MDAsMHgzNCwweGFmLDB4YjQsMHgwMCwweDMwLDB4YWYsMHhiMiwweDAwLDB4MjgsCisweGFmLDB4YjEsMHgwMCwweDI0LDB4YWYsMHhiMCwweDAwLDB4MjAsMHgwMCwweGUyLDB4MzgsMHgyMSwweDhjLDB4ZTYsMHgwMCwweDAwLAorMHhhZiwweGE1LDB4MDAsMHg0YywweDNjLDB4MDIsMHg4MCwweDAwLDB4M2MsMHgwNSwweGIwLDB4MDMsMHgzNCwweGE1LDB4MDAsMHgyMCwKKzB4MjQsMHg0MiwweDI1LDB4ODQsMHgyNCwweDAzLDB4MDAsMHgwMSwweGFjLDB4YTIsMHgwMCwweDAwLDB4YTAsMHhjMywweDAwLDB4MTIsCisweDhjLDB4ZTUsMHgwMCwweDAwLDB4OTQsMHhjMywweDAwLDB4MDYsMHg5MCwweGEyLDB4MDAsMHgxNiwweGE0LDB4YzMsMHgwMCwweDE0LAorMHgyNywweDgzLDB4OTAsMHgwMCwweDM0LDB4NDIsMHgwMCwweDA4LDB4YTAsMHhhMiwweDAwLDB4MTYsMHg4YywweGU4LDB4MDAsMHgwMCwKKzB4YWYsMHhhNCwweDAwLDB4NDgsMHgyNywweDgyLDB4OTAsMHgwNCwweDk1LDB4MTEsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MTEsMHg5OCwweGMwLDB4MDIsMHg3MSwweDIwLDB4MjEsMHgwMCwweDA0LDB4MjAsMHg4MCwweDAwLDB4ODIsMHgxMCwweDIxLAorMHg4YywweDUyLDB4MDAsMHgxOCwweDAwLDB4ODMsMHgxOCwweDIxLDB4ODQsMHg3NSwweDAwLDB4MDYsMHg4ZSwweDQ1LDB4MDAsMHgwOCwKKzB4OGUsMHg0NiwweDAwLDB4MDQsMHg4ZSwweDQ3LDB4MDAsMHgwNCwweDAwLDB4MDUsMHgxYywweDgyLDB4MDAsMHgwNiwweDMxLDB4NDIsCisweDI3LDB4ODIsMHg5MCwweDEwLDB4MzAsMHg2MywweDAwLDB4MDEsMHgzMCwweGM2LDB4MDAsMHgwMSwweDAwLDB4ODIsMHgyMCwweDIxLAorMHhhNSwweDE1LDB4MDAsMHgxYSwweDAwLDB4MDUsMHgxNCwweDQyLDB4YWYsMHhhMywweDAwLDB4MTgsMHhhZiwweGE2LDB4MDAsMHgxYywKKzB4MzAsMHhlNywweDAwLDB4MTAsMHgzMCwweDU2LDB4MDAsMHgwMSwweDgwLDB4OTcsMHgwMCwweDA2LDB4MTQsMHhlMCwweDAwLDB4NDcsCisweDAwLDB4MDUsMHhmNywweGMyLDB4ODAsMHg4MiwweDAwLDB4MDUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDQ0LAorMHgwMiwweDcxLDB4MTAsMHgyMSwweDkzLDB4OTAsMHhiYiwweGU5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZSwweDAyLDB4MDAsMHgwYywKKzB4MTQsMHg0MCwweDAwLDB4MDYsMHgwMiwweDAwLDB4MjAsMHgyMSwweDAwLDB4MTYsMHgxMCwweDQwLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMSwweDAwLDB4MDIsMHgwMiwweDEwLDB4MjEsMHgyNCwweDQ0LDB4MDAsMHgwNCwweDAyLDB4NzEsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDI3LDB4ODMsMHg5MCwweDEwLDB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDgwLDB4ODAsMHgyMSwKKzB4YTAsMHg0NCwweDAwLDB4MDMsMHhhMCwweDQ0LDB4MDAsMHgwMCwweDAyLDB4MDAsMHgyMCwweDIxLDB4MDIsMHhjMCwweDI4LDB4MjEsCisweDBjLDB4MDAsMHgwOCwweGUzLDB4MDIsMHhhMCwweDMwLDB4MjEsMHgwMiwweDcxLDB4MTgsMHgyMSwweDAwLDB4MDMsMHg4OCwweDgwLAorMHgwMCwweDQwLDB4YTAsMHgyMSwweDI3LDB4ODIsMHg5MCwweDIwLDB4MDIsMHgyMiwweDEwLDB4MjEsMHg4YywweDQ0LDB4MDAsMHgwMCwKKzB4MjYsMHhlMywweDAwLDB4MDIsMHgwMCwweDAzLDB4MTcsMHhjMiwweDAwLDB4NjIsMHgxOCwweDIxLDB4MDAsMHgwNCwweDI1LDB4YzIsCisweDAwLDB4MDMsMHgxOCwweDQzLDB4MzAsMHg4NCwweDAwLDB4MDEsMHgwMCwweDAzLDB4MTgsMHg0MCwweDAzLDB4YzQsMHgyMCwweDI0LAorMHgxNCwweDgwLDB4MDAsMHgxNSwweDAyLDB4NDMsMHgzOCwweDIxLDB4M2MsMHgwOCwweGIwLDB4MDMsMHgzNSwweDA4LDB4MDAsMHgyOCwKKzB4OGQsMHgwMywweDAwLDB4MDAsMHg4ZiwweGE2LDB4MDAsMHg0YywweDhmLDB4YTQsMHgwMCwweDQ4LDB4MjcsMHg4MiwweDkwLDB4MDgsCisweDAyLDB4MjIsMHgxMCwweDIxLDB4MjQsMHg2MywweDAwLDB4MDEsMHgwMiwweGEwLDB4MjgsMHgyMSwweGE0LDB4NTQsMHgwMCwweDA0LAorMHgwMCwweGMwLDB4MzgsMHgyMSwweDBjLDB4MDAsMHgwNywweDJmLDB4YWQsMHgwMywweDAwLDB4MDAsMHg3YiwweGJlLDB4MDIsMHgzYywKKzB4N2IsMHhiNiwweDAxLDB4ZmMsMHg3YiwweGI0LDB4MDEsMHhiYywweDdiLDB4YjIsMHgwMSwweDdjLDB4N2IsMHhiMCwweDAxLDB4M2MsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4NDgsMHg4ZiwweGEyLDB4MDAsMHgxYywweDhmLDB4YTYsMHgwMCwweDE4LAorMHgwMiwweDAwLDB4MjAsMHgyMSwweDAyLDB4YzAsMHgyOCwweDIxLDB4YWYsMHhhMiwweDAwLDB4MTAsMHgwYywweDAwLDB4MDksMHgwYSwKKzB4YWYsMHhhMCwweDAwLDB4MTQsMHgwOCwweDAwLDB4MDksMHhjNiwweDAyLDB4ODIsMHhhMCwweDIxLDB4MDIsMHg3MSwweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MjcsMHg4MywweDkwLDB4MTAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDkwLDB4NTAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MDksMHhiMiwweGEwLDB4NTAsMHgwMCwweDAzLDB4MjcsMHhiZCwweGZmLDB4YjgsMHhhZiwweGIxLDB4MDAsMHgyNCwKKzB4OGYsMHhiMSwweDAwLDB4NWMsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLDB4MzQsMHg2MywweDAwLDB4MjAsCisweDI0LDB4NDIsMHgyNywweGE4LDB4YWYsMHhiZSwweDAwLDB4NDAsMHhhZiwweGI3LDB4MDAsMHgzYywweGFmLDB4YjYsMHgwMCwweDM4LAorMHhhZiwweGI1LDB4MDAsMHgzNCwweGFmLDB4YjQsMHgwMCwweDMwLDB4YWYsMHhhNSwweDAwLDB4NGMsMHg4ZiwweGI1LDB4MDAsMHg1OCwKKzB4YWYsMHhiZiwweDAwLDB4NDQsMHhhZiwweGIzLDB4MDAsMHgyYywweGFmLDB4YjIsMHgwMCwweDI4LDB4YWYsMHhiMCwweDAwLDB4MjAsCisweDAwLDB4ZTAsMHhiMCwweDIxLDB4YWMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDgwLDB4ZjAsMHgyMSwweDAwLDB4MDAsMHhiOCwweDIxLAorMHgxNiwweDIwLDB4MDAsMHgyYiwweDAwLDB4MDAsMHhhMCwweDIxLDB4MjcsMHg4NSwweGI0LDB4MDAsMHgwMCwweDA3LDB4MTAsMHg4MCwKKzB4MDAsMHg0NSwweDEwLDB4MjEsMHg4YywweDUzLDB4MDAsMHgwMCwweDAwLDB4MTUsMHgxOCwweDgwLDB4MDAsMHg2NSwweDE4LDB4MjEsCisweDkyLDB4NjIsMHgwMCwweDE2LDB4OGMsMHg3MiwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHgwMywweDE0LDB4NDAsMHgwMCwweDJkLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDkyLDB4NDIsMHgwMCwweDE2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHgwMywKKzB4MTQsMHg0MCwweDAwLDB4MjgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4ODIsMHgwMCwweDM0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDE0LDB4NDAsMHgwMCwweDE4LDB4MDIsMHgyMCwweDEwLDB4MjEsMHg4YywweDgyLDB4MDAsMHgzOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxNCwweDQwLDB4MDAsMHgxNCwweDAyLDB4MjAsMHgxMCwweDIxLDB4OGMsMHg4MiwweDAwLDB4M2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTQsMHg0MCwweDAwLDB4MGYsMHgzYywweDAzLDB4YjAsMHgwOSwweDNjLDB4MDUsMHhiMCwweDA1LDB4MzQsMHg2MywweDAxLDB4NDQsCisweDM0LDB4YTUsMHgwMiwweDUyLDB4OTQsMHg2NiwweDAwLDB4MDAsMHg5MCwweGEyLDB4MDAsMHgwMCwweDhmLDB4YTMsMHgwMCwweDRjLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NjIsMHgxMCwweDA2LDB4MzAsMHg0MiwweDAwLDB4MDEsMHgxMCwweDQwLDB4MDAsMHgwNCwKKzB4MzAsMHhjNiwweGZmLDB4ZmYsMHgyYywweGMyLDB4MDAsMHg0MSwweDEwLDB4NDAsMHgwMCwweDA5LDB4MjQsMHgwNSwweDAwLDB4MTQsCisweDAyLDB4MjAsMHgxMCwweDIxLDB4N2IsMHhiZSwweDAyLDB4M2MsMHg3YiwweGI2LDB4MDEsMHhmYywweDdiLDB4YjQsMHgwMSwweGJjLAorMHg3YiwweGIyLDB4MDEsMHg3YywweDdiLDB4YjAsMHgwMSwweDNjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHg0OCwKKzB4MGMsMHgwMCwweDA3LDB4MGEsMHgyNCwweDA2LDB4MDEsMHgwNywweDI0LDB4MDIsMHgwMCwweDAxLDB4MDgsMHgwMCwweDBhLDB4MmMsCisweGEzLDB4YzIsMHgwMCwweDExLDB4MTAsMHhjMCwweDAwLDB4MWMsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YzIsMHgwMCwweDE3LAorMHgwMCwweGMwLDB4ODgsMHgyMSwweDk2LDB4NTQsMHgwMCwweDFhLDB4MDIsMHhhMCwweGI4LDB4MjEsMHgxMiwweDIwLDB4ZmYsMHhlZCwKKzB4MDIsMHgyMCwweDEwLDB4MjEsMHgyNywweDgzLDB4YjQsMHgwMCwweDAwLDB4MTcsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDhjLDB4NDQsMHgwMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzNCwweDYzLDB4MDAsMHgyOCwweDgwLDB4ODYsMHgwMCwweDEyLAorMHg4YywweDYyLDB4MDAsMHgwMCwweDAwLDB4MTQsMHgyYywweDAwLDB4MDAsMHgwNSwweDJjLDB4MDMsMHgwMCwweDQ2LDB4MTAsMHgyMSwKKzB4OGYsMHhhNiwweDAwLDB4NGMsMHgwMiwweGUwLDB4MzgsMHgyMSwweDAzLDB4YzAsMHgyMCwweDIxLDB4MGMsMHgwMCwweDA3LDB4MmYsCisweGFjLDB4NjIsMHgwMCwweDAwLDB4MDgsMHgwMCwweDBhLDB4MmMsMHhhZiwweGQxLDB4MDAsMHg0MCwweDk2LDB4NzQsMHgwMCwweDFhLAorMHgwOCwweDAwLDB4MGEsMHgzZiwweDAyLDB4YzAsMHhiOCwweDIxLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDEsMHgwOCwKKzB4OGMsMHg1MCwweDAwLDB4MDAsMHgwMiwweDYwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgxZSwweGYzLDB4MDIsMHgwMCwweDI4LDB4MjEsCisweDMwLDB4NDIsMHgwMCwweGZmLDB4MDIsMHgwMCwweDI4LDB4MjEsMHgwMiwweDQwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgxZSwweGYzLAorMHhhZiwweGEyLDB4MDAsMHgxOCwweDhmLDB4YTQsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDgwLDB4MDAsMHhlZCwKKzB4MzAsMHg1MCwweDAwLDB4ZmYsMHgxMiwweDAwLDB4MDAsMHgxOCwweDI0LDB4MTEsMHgwMCwweDAxLDB4OTYsMHg2MywweDAwLDB4MTQsCisweDk2LDB4NDQsMHgwMCwweDE0LDB4MjcsMHg4NSwweDkwLDB4MDAsMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDUsMHgxMCwweDIxLDB4MDAsMHgwNCwweDE4LDB4YzAsMHg4YywweDQ2LDB4MDAsMHgwOCwKKzB4MDAsMHg2NCwweDE4LDB4MjEsMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4NjUsMHgxOCwweDIxLDB4MDAsMHgwNiwweDE3LDB4MDIsCisweDI0LDB4MDQsMHgwMCwweGZmLDB4OGMsMHg2MywweDAwLDB4MDgsMHgxMCwweDQ0LDB4MDAsMHhkNiwweDAwLDB4MDMsMHgxNywweDAyLAorMHgxMCwweDQ0LDB4MDAsMHhkNSwweDNjLDB4MDIsMHg4MCwweDAwLDB4MDAsMHg2NiwweDE4LDB4MmIsMHgyNCwweDExLDB4MDAsMHgwMiwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHgwMCwweDQzLDB4ODgsMHgwYSwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTIsMHgyMiwweDAwLDB4NWEsCisweDI0LDB4MDIsMHgwMCwweDAyLDB4MTYsMHgyMiwweGZmLDB4YmQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDk2LDB4NDksMHgwMCwweDE0LAorMHgyNywweDgyLDB4OTAsMHgwNCwweDAyLDB4YTAsMHhiOCwweDIxLDB4MDAsMHgwOSwweDUwLDB4YzAsMHgwMSwweDQ5LDB4MTgsMHgyMSwKKzB4MDAsMHgwMywweDQwLDB4ODAsMHgwMSwweDAyLDB4MTAsMHgyMSwweDhjLDB4NDMsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhjLDB4NjUsMHgwMCwweDA4LDB4OGMsMHg2MiwweDAwLDB4MGMsMHg4YywweDYyLDB4MDAsMHgwNCwweDAwLDB4MDUsMHgyNCwweDQyLAorMHgwMCwweDA1LDB4MWMsMHg4MiwweDMwLDB4NDIsMHgwMCwweDEwLDB4MzAsMHg2NiwweDAwLDB4MDEsMHgxNCwweDQwLDB4MDAsMHg0MSwKKzB4MzAsMHg4NywweDAwLDB4MDEsMHgyNywweDgyLDB4OTAsMHgxOCwweDAxLDB4MDIsMHgxMCwweDIxLDB4ODAsMHg0NCwweDAwLDB4MDAsCisweDI3LDB4ODIsMHhiNSwweDc4LDB4MDAsMHgwNCwweDE5LDB4MDAsMHgwMCwweDY0LDB4MTgsMHgyMywweDAwLDB4MDMsMHgxOCwweDgwLAorMHgwMCwweDY0LDB4MTgsMHgyMywweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHg2MiwweDEwLDB4MjEsMHg5MCwweDQ1LDB4MDAsMHgwNSwKKzB4MjcsMHg4NCwweGI0LDB4YTAsMHgwMCwweDY0LDB4MTgsMHgyMSwweDkwLDB4NjMsMHgwMCwweDAwLDB4MTAsMHhhMCwweDAwLDB4MmIsCisweDJjLDB4NjQsMHgwMCwweDBjLDB4MTQsMHg4MCwweDAwLDB4MDQsMHgwMCwweDYwLDB4MTAsMHgyMSwweDAwLDB4MDYsMHgxMSwweDAwLAorMHgwMCwweDYyLDB4MTAsMHgyMSwweDI0LDB4NDIsMHgwMCwweDI0LDB4M2MsMHgwMSwweGIwLDB4MDMsMHhhMCwweDIyLDB4MDAsMHhlMSwKKzB4MTQsMHg4MCwweDAwLDB4MDYsMHgwMCwweDYwLDB4MjgsMHgyMSwweDAwLDB4MDcsMHgxMCwweDQwLDB4MDAsMHg0NiwweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMSwweDAwLDB4MDAsMHg2MiwweDEwLDB4MjEsMHgyNCwweDQ1LDB4MDAsMHgwNCwweDAxLDB4NDksMHgxMCwweDIxLAorMHgyNywweDgzLDB4OTAsMHgxMCwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweGEwLDB4MTgsMHgyMSwKKzB4YTAsMHg0NSwweDAwLDB4MDMsMHhhMCwweDQ1LDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDA4LDB4MTIsMHgwMiwweDAwLDB4MGIsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MDAsMHg2MCwweDI4LDB4MjEsMHgwMiwweDQwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgxZiwweDZmLAorMHhhZiwweGEyLDB4MDAsMHgxMCwweDMwLDB4NTQsMHhmZiwweGZmLDB4OTIsMHg0MiwweDAwLDB4MTYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDIsMHgwMiwweDEwLDB4MjUsMHgwOCwweDAwLDB4MGEsMHgzZiwweGEyLDB4NDIsMHgwMCwweDE2LDB4MDAsMHg2MCwweDI4LDB4MjEsCisweDAyLDB4NDAsMHgyMCwweDIxLDB4MGMsMHgwMCwweDFmLDB4MjAsMHhhZiwweGEwLDB4MDAsMHgxMCwweDA4LDB4MDAsMHgwYSwweGMyLAorMHgzMCwweDU0LDB4ZmYsMHhmZiwweDA4LDB4MDAsMHgwYSwweGFhLDB4MDAsMHg2MCwweDEwLDB4MjEsMHgxNCwweDgwLDB4ZmYsMHhmZCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA2LDB4MTEsMHgwMCwweDAwLDB4NjIsMHgxMCwweDIxLDB4MDgsMHgwMCwweDBhLDB4YWEsCisweDI0LDB4NDIsMHgwMCwweDA0LDB4MjcsMHg4MiwweDkwLDB4MTAsMHgwMSwweDAyLDB4MTAsMHgyMSwweDkwLDB4NDMsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MGEsMHhiYSwweGEwLDB4NDMsMHgwMCwweDAzLDB4OTYsMHg2OSwweDAwLDB4MTQsMHgwMiwweGMwLDB4YjgsMHgyMSwKKzB4MjQsMHgwYiwweDAwLDB4MDEsMHgwMCwweDA5LDB4MTAsMHhjMCwweDAwLDB4NDksMHgxOCwweDIxLDB4MDAsMHgwMywweDQwLDB4ODAsCisweDAwLDB4NDAsMHg1MCwweDIxLDB4MjcsMHg4MiwweDkwLDB4MDQsMHgwMSwweDAyLDB4MTAsMHgyMSwweDhjLDB4NDMsMHgwMCwweDE4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4NjUsMHgwMCwweDA4LDB4OGMsMHg2MiwweDAwLDB4MGMsMHg4YywweDYyLDB4MDAsMHgwNCwKKzB4MDAsMHgwNSwweDI0LDB4NDIsMHgwMCwweDA1LDB4MWMsMHg4MiwweDMwLDB4NDIsMHgwMCwweDEwLDB4MzAsMHg2NiwweDAwLDB4MDEsCisweDEwLDB4NDAsMHgwMCwweDBkLDB4MzAsMHg4NywweDAwLDB4MDEsMHgyNywweDgyLDB4OTAsMHgxOCwweDAxLDB4MDIsMHgxMCwweDIxLAorMHg4MCwweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1OCwweDIxLDB4MDAsMHgwMywweDExLDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyMywKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMywweDAwLDB4MDIsMHgxMCwweDgwLDB4MjcsMHg4MywweGI1LDB4NzAsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4YTAsMHg0MCwweDAwLDB4MDQsMHgxMSwweDYwLDB4MDAsMHg0ZiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMSwweDQ5LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgyMCwweDgwLDB4MjcsMHg4NSwweDkwLDB4MTAsMHgwMCwweDg1LDB4MTAsMHgyMSwKKzB4ODAsMHg0MywweDAwLDB4MDUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NjAsMHgwMCwweDQyLDB4MDEsMHg0OSwweDEwLDB4MjEsCisweDI3LDB4ODIsMHg5MCwweDE4LDB4MDAsMHg4MiwweDEwLDB4MjEsMHg4MCwweDQ0LDB4MDAsMHgwMCwweDI3LDB4ODIsMHhiNSwweDc4LAorMHgwMCwweDA0LDB4MTksMHgwMCwweDAwLDB4NjQsMHgxOCwweDIzLDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDY0LDB4MTgsMHgyMywKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDYyLDB4MTAsMHgyMSwweDkwLDB4NDUsMHgwMCwweDA1LDB4MjcsMHg4NCwweGI0LDB4YTAsCisweDAwLDB4NjQsMHgxOCwweDIxLDB4OTAsMHg2MywweDAwLDB4MDAsMHgxMCwweGEwLDB4MDAsMHgyYywweDJjLDB4NjQsMHgwMCwweDBjLAorMHgxNCwweDgwLDB4MDAsMHgwNCwweDAwLDB4NjAsMHgxMCwweDIxLDB4MDAsMHgwNiwweDExLDB4MDAsMHgwMCwweDYyLDB4MTAsMHgyMSwKKzB4MjQsMHg0MiwweDAwLDB4MjQsMHgzYywweDAxLDB4YjAsMHgwMywweGEwLDB4MjIsMHgwMCwweGUxLDB4MTQsMHg4MCwweDAwLDB4MDYsCisweDAwLDB4NjAsMHgyOCwweDIxLDB4MDAsMHgwNywweDEwLDB4NDAsMHgwMCwweDQ2LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMSwweDAwLAorMHgwMCwweDYyLDB4MTAsMHgyMSwweDI0LDB4NDUsMHgwMCwweDA0LDB4MDEsMHg0OSwweDEwLDB4MjEsMHgyNywweDgzLDB4OTAsMHgxMCwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4YTAsMHgxOCwweDIxLDB4YTAsMHg0NSwweDAwLDB4MDMsCisweGEwLDB4NDUsMHgwMCwweDAwLDB4OGYsMHhhNCwweDAwLDB4MTgsMHgyNCwweDAyLDB4MDAsMHgwOCwweDEwLDB4ODIsMHgwMCwweDBjLAorMHgwMCwweDYwLDB4MjgsMHgyMSwweDI0LDB4MDIsMHgwMCwweDAxLDB4MDIsMHg2MCwweDIwLDB4MjEsMHgwYywweDAwLDB4MWYsMHg2ZiwKKzB4YWYsMHhhMiwweDAwLDB4MTAsMHg4ZiwweGEzLDB4MDAsMHgxOCwweDMwLDB4NTQsMHhmZiwweGZmLDB4OTIsMHg2MiwweDAwLDB4MTYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg2MiwweDEwLDB4MjUsMHgwOCwweDAwLDB4MGEsMHgzZiwweGEyLDB4NjIsMHgwMCwweDE2LAorMHgwMiwweDYwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgxZiwweDIwLDB4YWYsMHhhMCwweDAwLDB4MTAsMHgwOCwweDAwLDB4MGIsMHgzMSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MGIsMHgxOSwweDAwLDB4NjAsMHgxMCwweDIxLDB4MTQsMHg4MCwweGZmLDB4ZmQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNiwweDExLDB4MDAsMHgwMCwweDYyLDB4MTAsMHgyMSwweDA4LDB4MDAsMHgwYiwweDE5LAorMHgyNCwweDQyLDB4MDAsMHgwNCwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0NSwweDEwLDB4MjEsMHg5MCwweDQzLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDBiLDB4MjksMHhhMCwweDQzLDB4MDAsMHgwMywweDI3LDB4ODUsMHg5MCwweDEwLDB4MDgsMHgwMCwweDBiLDB4NDUsCisweDAxLDB4NDksMHgxMCwweDIxLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgwMCwweDYyLDB4MTgsMHgyNiwweDA4LDB4MDAsMHgwYSwweDdhLAorMHgwMCwweGMyLDB4MzAsMHgyNiwweDEyLDB4MDAsMHhmZiwweDJkLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgwOCwweDAwLDB4MGEsMHg3ZiwKKzB4MjQsMHgxMSwweDAwLDB4MDIsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAwLDB4MjcsMHhiZCwweGZmLDB4ZDAsCisweDI0LDB4NDIsMHgyZCwweDU0LDB4MzQsMHg2MywweDAwLDB4MjAsMHgzYywweDA1LDB4YjAsMHgwNSwweGFmLDB4YjMsMHgwMCwweDI0LAorMHhhZiwweGIyLDB4MDAsMHgyMCwweGFmLDB4YjEsMHgwMCwweDFjLDB4YWYsMHhiZiwweDAwLDB4MjgsMHhhZiwweGIwLDB4MDAsMHgxOCwKKzB4YWMsMHg2MiwweDAwLDB4MDAsMHgzNCwweGE1LDB4MDIsMHg0MiwweDkwLDB4YTIsMHgwMCwweDAwLDB4MDAsMHg4MCwweDkwLDB4MjEsCisweDI0LDB4MTEsMHgwMCwweDEwLDB4MzAsMHg1MywweDAwLDB4ZmYsMHgyNCwweDAyLDB4MDAsMHgxMCwweDEyLDB4MjIsMHgwMCwweGNmLAorMHgwMCwweDAwLDB4MTgsMHgyMSwweDI0LDB4MDIsMHgwMCwweDExLDB4MTIsMHgyMiwweDAwLDB4YzEsMHgyNCwweDAyLDB4MDAsMHgxMiwKKzB4MTIsMHgyMiwweDAwLDB4YjQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NjAsMHgwMCwweGFkLDB4YWUsMHg0MywweDAwLDB4NDAsCisweDNjLDB4MDIsMHhiMCwweDA1LDB4MzQsMHg0MiwweDAyLDB4MmMsMHg4YywweDQ0LDB4MDAsMHgwMCwweDNjLDB4MDMsMHgwMCwweDAyLAorMHgzNCwweDYzLDB4MDAsMHhmZiwweDAwLDB4ODMsMHg4MCwweDI0LDB4MDAsMHgxMCwweDE0LDB4NDMsMHgxMCwweDQwLDB4MDAsMHgwNSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZSwweDQyLDB4MDAsMHgzNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4OTIsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTMsMHg4MywweDhiLDB4NzEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NjIsMHgwMCwweDAyLAorMHgxMCwweDQwLDB4MDAsMHgwNCwweDMyLDB4MTAsMHgwMCwweGZmLDB4MDAsMHgxMCwweDExLDB4YzMsMHgxNCwweDQwLDB4MDAsMHg4NiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNiwweDAwLDB4MDAsMHgxNSwweDAyLDB4MDAsMHgxMCwweDIxLDB4MjYsMHgyMiwweDAwLDB4MDEsCisweDMwLDB4NTEsMHgwMCwweGZmLDB4MmUsMHgyMywweDAwLDB4MTMsMHgxNCwweDYwLDB4ZmYsMHhkYiwweDI0LDB4MDMsMHgwMCwweDAyLAorMHgxMiwweDYzLDB4MDAsMHg3MywweDI0LDB4MDIsMHgwMCwweDA1LDB4MmEsMHg2MiwweDAwLDB4MDMsMHgxMCwweDQwLDB4MDAsMHg1OCwKKzB4MjQsMHgwMiwweDAwLDB4MDQsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEyLDB4NjIsMHgwMCwweDRiLDB4MDIsMHg0MCwweDIwLDB4MjEsCisweDNjLDB4MDIsMHhiMCwweDA1LDB4MzQsMHg0MiwweDAyLDB4MmMsMHg4YywweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweDcwLDB4MDAsMHhmZiwweDEyLDB4MDAsMHgwMCwweDA2LDB4MDIsMHgwMCwweDEwLDB4MjEsMHg4ZiwweGJmLDB4MDAsMHgyOCwKKzB4N2IsMHhiMiwweDAxLDB4M2MsMHg3YiwweGIwLDB4MDAsMHhmYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MzAsCisweDkyLDB4NDYsMHgwMCwweDA0LDB4OGUsMHg0MywweDAwLDB4MjQsMHgyNCwweDAyLDB4MDAsMHgwNywweDAyLDB4NDAsMHgyMCwweDIxLAorMHgwMCwweDAwLDB4MjgsMHgyMSwweDI0LDB4MDcsMHgwMCwweDA2LDB4YWYsMHhhMiwweDAwLDB4MTAsMHgwYywweDAwLDB4MDksMHhlYSwKKzB4YWYsMHhhMywweDAwLDB4MTQsMHhhZSwweDQyLDB4MDAsMHgyNCwweDNjLDB4MDIsMHhiMCwweDA1LDB4OGMsMHg0MiwweDAyLDB4MmMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg1MCwweDAwLDB4ZmYsMHgxNiwweDAwLDB4ZmYsMHhlYywweDAyLDB4MDAsMHgxMCwweDIxLAorMHg5MiwweDQ2LDB4MDAsMHgwNSwweDhlLDB4NDMsMHgwMCwweDI4LDB4MjQsMHgwMiwweDAwLDB4MDUsMHgwMiwweDQwLDB4MjAsMHgyMSwKKzB4MjQsMHgwNSwweDAwLDB4MDEsMHgyNCwweDA3LDB4MDAsMHgwNCwweGFmLDB4YTIsMHgwMCwweDEwLDB4MGMsMHgwMCwweDA5LDB4ZWEsCisweGFmLDB4YTMsMHgwMCwweDE0LDB4YWUsMHg0MiwweDAwLDB4MjgsMHgzYywweDAyLDB4YjAsMHgwNSwweDhjLDB4NDIsMHgwMiwweDJjLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NTAsMHgwMCwweGZmLDB4MTYsMHgwMCwweGZmLDB4ZGMsMHgwMiwweDAwLDB4MTAsMHgyMSwKKzB4OTIsMHg0NiwweDAwLDB4MDYsMHg4ZSwweDQzLDB4MDAsMHgyYywweDI0LDB4MDIsMHgwMCwweDAzLDB4MDIsMHg0MCwweDIwLDB4MjEsCisweDI0LDB4MDUsMHgwMCwweDAyLDB4MDAsMHgwMCwweDM4LDB4MjEsMHhhZiwweGEyLDB4MDAsMHgxMCwweDBjLDB4MDAsMHgwOSwweGVhLAorMHhhZiwweGEzLDB4MDAsMHgxNCwweGFlLDB4NDIsMHgwMCwweDJjLDB4M2MsMHgwMiwweGIwLDB4MDUsMHg4YywweDQyLDB4MDIsMHgyYywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDUwLDB4MDAsMHhmZiwweDE2LDB4MDAsMHhmZiwweGNjLDB4MDIsMHgwMCwweDEwLDB4MjEsCisweDkyLDB4NDYsMHgwMCwweDA3LDB4OGUsMHg0MywweDAwLDB4MzAsMHgyNCwweDAyLDB4MDAsMHgwMiwweDAyLDB4NDAsMHgyMCwweDIxLAorMHgyNCwweDA1LDB4MDAsMHgwMywweDI0LDB4MDcsMHgwMCwweDAxLDB4YWYsMHhhMiwweDAwLDB4MTAsMHgwYywweDAwLDB4MDksMHhlYSwKKzB4YWYsMHhhMywweDAwLDB4MTQsMHhhZSwweDQyLDB4MDAsMHgzMCwweDNjLDB4MDIsMHhiMCwweDA1LDB4OGMsMHg0MiwweDAyLDB4MmMsCisweDA4LDB4MDAsMHgwYiwweDliLDB4MzAsMHg0MiwweDAwLDB4ZmYsMHg5MiwweDQ2LDB4MDAsMHgwNCwweDhlLDB4NDMsMHgwMCwweDI0LAorMHgyNCwweDAyLDB4MDAsMHgwNywweDAwLDB4MDAsMHgyOCwweDIxLDB4MjQsMHgwNywweDAwLDB4MDYsMHhhZiwweGEyLDB4MDAsMHgxMCwKKzB4MGMsMHgwMCwweDA5LDB4ZWEsMHhhZiwweGEzLDB4MDAsMHgxNCwweDA4LDB4MDAsMHgwYiwweDk0LDB4YWUsMHg0MiwweDAwLDB4MjQsCisweDEyLDB4NjIsMHgwMCwweDBkLDB4MjQsMHgwMiwweDAwLDB4MDMsMHgyNCwweDAyLDB4MDAsMHgwOCwweDE2LDB4NjIsMHhmZiwweGE4LAorMHgwMiwweDQwLDB4MjAsMHgyMSwweDkyLDB4NDYsMHgwMCwweDA3LDB4OGUsMHg0MiwweDAwLDB4MzAsMHgyNCwweDA1LDB4MDAsMHgwMywKKzB4MjQsMHgwNywweDAwLDB4MDEsMHhhZiwweGEzLDB4MDAsMHgxMCwweDBjLDB4MDAsMHgwOSwweGVhLDB4YWYsMHhhMiwweDAwLDB4MTQsCisweDA4LDB4MDAsMHgwYiwweDk0LDB4YWUsMHg0MiwweDAwLDB4MzAsMHg5MiwweDQ2LDB4MDAsMHgwNiwweDhlLDB4NDMsMHgwMCwweDJjLAorMHgwMiwweDQwLDB4MjAsMHgyMSwweDI0LDB4MDUsMHgwMCwweDAyLDB4MDAsMHgwMCwweDM4LDB4MjEsMHhhZiwweGEyLDB4MDAsMHgxMCwKKzB4MGMsMHgwMCwweDA5LDB4ZWEsMHhhZiwweGEzLDB4MDAsMHgxNCwweDA4LDB4MDAsMHgwYiwweDk0LDB4YWUsMHg0MiwweDAwLDB4MmMsCisweDkyLDB4NDYsMHgwMCwweDA1LDB4OGUsMHg0MywweDAwLDB4MjgsMHgwMiwweDQwLDB4MjAsMHgyMSwweDI0LDB4MDUsMHgwMCwweDAxLAorMHgyNCwweDA3LDB4MDAsMHgwNCwweGFmLDB4YTIsMHgwMCwweDEwLDB4MGMsMHgwMCwweDA5LDB4ZWEsMHhhZiwweGEzLDB4MDAsMHgxNCwKKzB4MDgsMHgwMCwweDBiLDB4OTQsMHhhZSwweDQyLDB4MDAsMHgyOCwweDBjLDB4MDAsMHgwMSwweDU3LDB4MjQsMHgwNCwweDAwLDB4MDEsCisweDA4LDB4MDAsMHgwYiwweDg1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweDg0LDB4YjQsMHg0MCwweGFlLDB4NDAsMHgwMCwweDM0LAorMHg5NCwweDg1LDB4MDAsMHgxNCwweDBjLDB4MDAsMHgxYiwweDY2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MywweDgzLDB4OGIsMHg3MSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDYyLDB4MDAsMHgwMiwweDEwLDB4NDAsMHhmZiwweDY5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDBjLDB4MDAsMHgwMSwweDU3LDB4MDAsMHgwMCwweDIwLDB4MjEsMHgwOCwweDAwLDB4MGIsMHg3ZCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMiwweDQwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgwOSwweDYxLDB4MDIsMHgyMCwweDI4LDB4MjEsMHgwOCwweDAwLDB4MGIsMHg3MSwKKzB4M2MsMHgwMiwweGIwLDB4MDUsMHg4ZSwweDQyLDB4MDAsMHgzYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweGZmLDB4NGEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHg4MiwweGI0LDB4NDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDkwLDB4NDIsMHgwMCwweDBhLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxOCwweDJiLDB4MDgsMHgwMCwweDBiLDB4NmUsMHhhZSwweDQzLDB4MDAsMHgzYywKKzB4OGUsMHg0MiwweDAwLDB4MzgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHhmZiwweDNkLDB4MjQsMHgwMiwweDAwLDB4MTIsCisweDhmLDB4ODIsMHhiNCwweDQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MCwweDQyLDB4MDAsMHgwYSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAyLDB4MTgsMHgyYiwweDA4LDB4MDAsMHgwYiwweDZlLDB4YWUsMHg0MywweDAwLDB4MzgsMHg4ZSwweDQyLDB4MDAsMHgzNCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4ZmYsMHgzMCwweDI0LDB4MDIsMHgwMCwweDExLDB4OGYsMHg4MiwweGI0LDB4NDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTAsMHg0MiwweDAwLDB4MGEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxOCwweDJiLAorMHgwOCwweDAwLDB4MGIsMHg2ZSwweGFlLDB4NDMsMHgwMCwweDM0LDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwKKzB4MjcsMHhiZCwweGZmLDB4ZTAsMHgzNCwweDYzLDB4MDAsMHgyMCwweDI0LDB4NDIsMHgzMSwweDA4LDB4M2MsMHgwOCwweGIwLDB4MDMsCisweGFmLDB4YjEsMHgwMCwweDE0LDB4YWMsMHg2MiwweDAwLDB4MDAsMHgzNSwweDA4LDB4MDEsMHgwMCwweGFmLDB4YmYsMHgwMCwweDE4LAorMHhhZiwweGIwLDB4MDAsMHgxMCwweDkxLDB4MDMsMHgwMCwweDAwLDB4MDAsMHhhMCwweDQ4LDB4MjEsMHgyNCwweDExLDB4MDAsMHgwYSwKKzB4MmMsMHhhNSwweDAwLDB4MDQsMHgyNCwweDAyLDB4MDAsMHgxMCwweDAwLDB4NDUsMHg4OCwweDBhLDB4MzAsMHg2MywweDAwLDB4MDEsCisweDAwLDB4YzAsMHgyOCwweDIxLDB4MTQsMHg2MCwweDAwLDB4MDIsMHgwMCwweDExLDB4NDAsMHg0MCwweDAyLDB4MjAsMHg0MCwweDIxLAorMHg4NCwweDgzLDB4MDAsMHgwYywweDMxLDB4MTEsMHgwMCwweGZmLDB4MDEsMHgyMCwweDIwLDB4MjEsMHgwMCwweDAzLDB4MTAsMHhjMCwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDI3LDB4ODMsMHg5MCwweDA4LDB4MDAsMHg0MywweDEwLDB4MjEsCisweDg0LDB4NDMsMHgwMCwweDA0LDB4MjQsMHgwNiwweDAwLDB4MGUsMHgxMCwweGUwLDB4MDAsMHgwNiwweDAyLDB4MjMsMHg4MCwweDIxLAorMHgwMiwweDAwLDB4MTAsMHgyMSwweDhmLDB4YmYsMHgwMCwweDE4LDB4N2IsMHhiMCwweDAwLDB4YmMsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MjcsMHhiZCwweDAwLDB4MjAsMHgwYywweDAwLDB4MDgsMHhlMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxMSwweDE4LDB4MjEsCisweDA4LDB4MDAsMHgwYywweDY0LDB4MDAsMHg2MiwweDgwLDB4MjEsMHgyNywweGJkLDB4ZmYsMHhkMCwweGFmLDB4YmYsMHgwMCwweDI4LAorMHhhZiwweGI0LDB4MDAsMHgyMCwweGFmLDB4YjMsMHgwMCwweDFjLDB4YWYsMHhiMiwweDAwLDB4MTgsMHhhZiwweGI1LDB4MDAsMHgyNCwKKzB4YWYsMHhiMSwweDAwLDB4MTQsMHhhZiwweGIwLDB4MDAsMHgxMCwweDg0LDB4ODIsMHgwMCwweDBjLDB4M2MsMHgwNiwweGIwLDB4MDMsCisweDM0LDB4YzYsMHgwMCwweDIwLDB4MDAsMHgwMiwweDE4LDB4YzAsMHgwMCwweDYyLDB4MTgsMHgyMSwweDAwLDB4MDMsMHgxOCwweDgwLAorMHgyNywweDgyLDB4OTAsMHgwNCwweDAwLDB4NjIsMHgxMCwweDIxLDB4OGMsMHg1NSwweDAwLDB4MTgsMHgzYywweDAyLDB4ODAsMHgwMCwKKzB4MjQsMHg0MiwweDMxLDB4YjgsMHhhYywweGMyLDB4MDAsMHgwMCwweDhlLDB4YjAsMHgwMCwweDA4LDB4MjcsMHg4MiwweDkwLDB4MDgsCisweDAwLDB4NjIsMHgxOCwweDIxLDB4OTAsMHg3MSwweDAwLDB4MDcsMHgwMCwweDEwLDB4ODYsMHg0MywweDMyLDB4MTAsMHgwMCwweDAxLAorMHgwMCwweGEwLDB4MzgsMHgyMSwweDAyLDB4MDAsMHgzMCwweDIxLDB4MDAsMHhhMCwweDk4LDB4MjEsMHgwMiwweDIwLDB4MjgsMHgyMSwKKzB4MGMsMHgwMCwweDBjLDB4NDIsMHgwMCwweDgwLDB4OTAsMHgyMSwweDAyLDB4MjAsMHgyMCwweDIxLDB4MDIsMHgwMCwweDI4LDB4MjEsCisweDI0LDB4MDYsMHgwMCwweDE0LDB4MGMsMHgwMCwweDA4LDB4ZTMsMHgwMCwweDQwLDB4YTAsMHgyMSwweDg2LDB4NDMsMHgwMCwweDBjLAorMHgzYywweDA5LDB4YjAsMHgwOSwweDNjLDB4MDgsMHhiMCwweDA5LDB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgyNywweDgzLDB4OTAsMHgxMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4ODAsMHg0MywweDAwLDB4MDYsCisweDNjLDB4MDcsMHhiMCwweDA5LDB4M2MsMHgwNSwweGIwLDB4MDksMHgyOCwweDYyLDB4MDAsMHgwMCwweDI0LDB4NjQsMHgwMCwweDAzLAorMHgwMCwweDgyLDB4MTgsMHgwYiwweDAwLDB4MDMsMHgxOCwweDgzLDB4M2MsMHgwMiwweGIwLDB4MDksMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4MzQsMHg0MiwweDAxLDB4MDIsMHgzNSwweDI5LDB4MDEsMHgxMCwweDM1LDB4MDgsMHgwMSwweDE0LDB4MzQsMHhlNywweDAxLDB4MjAsCisweDM0LDB4YTUsMHgwMSwweDI0LDB4YTQsMHg1NCwweDAwLDB4MDAsMHgxMiwweDYwLDB4MDAsMHgxMSwweDAyLDB4YTMsMHhhOCwweDIxLAorMHg4ZSwweGEyLDB4MDAsMHgwYywweDhlLDB4YTMsMHgwMCwweDA4LDB4MDAsMHgwMiwweDE0LDB4MDAsMHgwMCwweDAzLDB4MWMsMHgwMiwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHhhZCwweDIyLDB4MDAsMHgwMCwweDhlLDB4YTMsMHgwMCwweDBjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDMsMHgxYywweDAyLDB4YTUsMHgwMywweDAwLDB4MDAsMHg4ZiwweGJmLDB4MDAsMHgyOCwweDdiLDB4YjQsMHgwMSwweDNjLAorMHg3YiwweGIyLDB4MDAsMHhmYywweDdiLDB4YjAsMHgwMCwweGJjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgzMCwKKzB4OGUsMHhhMiwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweGFkLDB4MjIsMHgwMCwweDAwLDB4OGUsMHhhNCwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4YTUsMHgwNCwweDAwLDB4MDAsMHg3YSwweGEyLDB4MDAsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAzLDB4MWMsMHgwMCwweDAwLDB4MDIsMHgxNCwweDAyLDB4MDAsMHg2MiwweDE4LDB4MjEsMHhhYywweGUzLDB4MDAsMHgwMCwKKzB4OGUsMHhhMiwweDAwLDB4MGMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxNCwweDAyLDB4MDgsMHgwMCwweDBjLDB4YjYsCisweGE0LDB4YTIsMHgwMCwweDAwLDB4MjcsMHhiZCwweGZmLDB4ZTAsMHhhZiwweGIyLDB4MDAsMHgxOCwweGFmLDB4YjAsMHgwMCwweDEwLAorMHhhZiwweGJmLDB4MDAsMHgxYywweGFmLDB4YjEsMHgwMCwweDE0LDB4ODQsMHg4MiwweDAwLDB4MGMsMHgwMCwweDgwLDB4OTAsMHgyMSwKKzB4M2MsMHgwNSwweGIwLDB4MDMsMHgwMCwweDAyLDB4MjAsMHhjMCwweDAwLDB4ODIsMHgyMCwweDIxLDB4MDAsMHgwNCwweDIwLDB4ODAsCisweDI3LDB4ODIsMHg5MCwweDA0LDB4MDAsMHg4MiwweDEwLDB4MjEsMHg4YywweDUxLDB4MDAsMHgxOCwweDNjLDB4MDIsMHg4MCwweDAwLAorMHgzNCwweGE1LDB4MDAsMHgyMCwweDI0LDB4NDIsMHgzMywweDM0LDB4MjcsMHg4MywweDkwLDB4MDgsMHhhYywweGEyLDB4MDAsMHgwMCwKKzB4MDAsMHg4MywweDIwLDB4MjEsMHgzYywweDAyLDB4YjAsMHgwMywweDkwLDB4ODYsMHgwMCwweDA3LDB4MzQsMHg0MiwweDAxLDB4MDAsCisweDhlLDB4MjMsMHgwMCwweDA4LDB4OTAsMHg0NCwweDAwLDB4MDAsMHgyYywweGM1LDB4MDAsMHgwNCwweDI0LDB4MDIsMHgwMCwweDEwLAorMHgyNCwweDEwLDB4MDAsMHgwYSwweDAwLDB4NDUsMHg4MCwweDBhLDB4MDAsMHgwMywweDFlLDB4NDMsMHgzMCwweDg0LDB4MDAsMHgwMSwKKzB4MzAsMHg2NSwweDAwLDB4MDEsMHgxNCwweDgwLDB4MDAsMHgwMiwweDAwLDB4MTAsMHgxMCwweDQwLDB4MDIsMHgwMCwweDEwLDB4MjEsCisweDAwLDB4YzAsMHgyMCwweDIxLDB4MjQsMHgwNiwweDAwLDB4MjAsMHgwYywweDAwLDB4MDgsMHhlMywweDMwLDB4NTAsMHgwMCwweGZmLAorMHg4NiwweDQ0LDB4MDAsMHgwYywweDI3LDB4ODUsMHg5MCwweDEwLDB4M2MsMHgwNiwweGIwLDB4MDksMHgwMCwweDA0LDB4MTgsMHhjMCwKKzB4MDAsMHg2NCwweDE4LDB4MjEsMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4NjUsMHgxOCwweDIxLDB4ODAsMHg2NCwweDAwLDB4MDYsCisweDAwLDB4NTAsMHgxMCwweDIxLDB4MzQsMHhjNiwweDAxLDB4MDIsMHgyNCwweDg1LDB4MDAsMHgwMywweDI4LDB4ODMsMHgwMCwweDAwLAorMHgwMCwweGEzLDB4MjAsMHgwYiwweDAwLDB4MDQsMHgyMCwweDgzLDB4MDAsMHgwNCwweDIwLDB4ODAsMHhhNCwweGMyLDB4MDAsMHgwMCwKKzB4MDIsMHgyNCwweDIwLDB4MjEsMHg4YywweDgzLDB4MDAsMHgwNCwweDNjLDB4MDIsMHhiMCwweDA5LDB4MzQsMHg0MiwweDAxLDB4MTAsCisweGFjLDB4NDMsMHgwMCwweDAwLDB4OGMsMHg4NiwweDAwLDB4MDgsMHgzYywweDAyLDB4YjAsMHgwOSwweDM0LDB4NDIsMHgwMSwweDE0LAorMHhhNCwweDQ2LDB4MDAsMHgwMCwweDhjLDB4ODUsMHgwMCwweDBjLDB4OGMsMHg4MiwweDAwLDB4MDgsMHgzYywweDA2LDB4YjAsMHgwOSwKKzB4MDAsMHgwNSwweDJjLDB4MDAsMHgwMCwweDAyLDB4MTQsMHgwMiwweDAwLDB4YTIsMHgyOCwweDIxLDB4MzQsMHhjNiwweDAxLDB4MjAsCisweGFjLDB4YzUsMHgwMCwweDAwLDB4OGMsMHg4MywweDAwLDB4MGMsMHgzYywweDA1LDB4YjAsMHgwOSwweDM0LDB4YTUsMHgwMSwweDI0LAorMHgwMCwweDAzLDB4MWMsMHgwMiwweGE0LDB4YTMsMHgwMCwweDAwLDB4OTIsMHg0MiwweDAwLDB4MGEsMHgzYywweDAzLDB4YjAsMHgwOSwKKzB4MzQsMHg2MywweDAxLDB4MzAsMHgwMCwweDAyLDB4MTMsMHgwMCwweDI0LDB4NDIsMHgwMCwweDA0LDB4MzAsMHg0MiwweGZmLDB4ZmYsCisweGE0LDB4NjIsMHgwMCwweDAwLDB4ODYsMHg0NCwweDAwLDB4MGMsMHgyNywweDgzLDB4OTAsMHgxOCwweDhmLDB4YmYsMHgwMCwweDFjLAorMHgwMCwweDA0LDB4MTAsMHhjMCwweDAwLDB4NDQsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4OTQsMHg0NCwweDAwLDB4MDIsMHg4ZiwweGIyLDB4MDAsMHgxOCwweDdiLDB4YjAsMHgwMCwweGJjLDB4M2MsMHgwNSwweGIwLDB4MDksCisweDM0LDB4YTUsMHgwMSwweDMyLDB4YTQsMHhhNCwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDIwLAorMHgyNywweGJkLDB4ZmYsMHhlMCwweDNjLDB4MDIsMHhiMCwweDAzLDB4M2MsMHgwMywweDgwLDB4MDAsMHhhZiwweGIwLDB4MDAsMHgxMCwKKzB4MzQsMHg0MiwweDAwLDB4MjAsMHgwMCwweGEwLDB4ODAsMHgyMSwweDI0LDB4NjMsMHgzNCwweGMwLDB4MDAsMHgwNSwweDJjLDB4NDMsCisweGFmLDB4YjEsMHgwMCwweDE0LDB4YWYsMHhiZiwweDAwLDB4MTgsMHhhYywweDQzLDB4MDAsMHgwMCwweDEwLDB4YTAsMHgwMCwweDA1LAorMHgwMCwweDgwLDB4ODgsMHgyMSwweDhjLDB4ODIsMHgwMCwweDM0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHhiNiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMiwweDEwLDB4MDAsMHhmZiwweDEyLDB4MDAsMHgwMCwweDRjLDB4MDAsMHgwMCwweDEwLDB4MjEsCisweDI0LDB4MDIsMHgwMCwweDA4LDB4MTIsMHgwMiwweDAwLDB4YTMsMHgyYSwweDAyLDB4MDAsMHgwOSwweDEwLDB4NDAsMHgwMCwweDg5LAorMHgyNCwweDAyLDB4MDAsMHg0MCwweDI0LDB4MDQsMHgwMCwweDAyLDB4MTIsMHgwNCwweDAwLDB4NzksMHgyYSwweDAyLDB4MDAsMHgwMywKKzB4MTAsMHg0MCwweDAwLDB4NjksMHgyNCwweDAyLDB4MDAsMHgwNCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTIsMHgwMiwweDAwLDB4NWEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDUsMHgzNCwweDQyLDB4MDAsMHgwOCwweDNjLDB4MDMsMHg4MCwweDAwLAorMHhhMiwweDIwLDB4MDAsMHg0ZSwweGFjLDB4NDMsMHgwMCwweDAwLDB4ODIsMHgyNCwweDAwLDB4MTEsMHg5MiwweDI3LDB4MDAsMHgxMSwKKzB4MTAsMHg4MCwweDAwLDB4NGUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDkyLDB4MjYsMHgwMCwweDBhLDB4MjQsMHgwMiwweDAwLDB4MTIsCisweDEwLDB4NDYsMHgwMCwweDA5LDB4MzAsMHhjMiwweDAwLDB4ZmYsMHgyNywweDgzLDB4YjQsMHgwMCwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NCwweDgzLDB4MDAsMHgxNCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHhhNiwweDIzLDB4MDAsMHgwYywweDNjLDB4MDIsMHhiMCwweDA5LDB4MzQsMHg0MiwweDAwLDB4NDAsCisweDkwLDB4NDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDYzLDB4MDAsMHgwMywweGEyLDB4MjMsMHgwMCwweDEwLAorMHgxNCwweDYwLDB4MDAsMHgyYiwweDMwLDB4NjUsMHgwMCwweDAxLDB4MzAsMHhjMiwweDAwLDB4ZmYsMHgyNywweDgzLDB4YjQsMHgwMCwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDAwLDB4ODIsMHgyMywweDAwLDB4MTIsCisweDkwLDB4ODIsMHgwMCwweDE2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MTEsMHg0MiwweDMwLDB4NDIsMHgwMCwweDAxLAorMHgwMCwweDYyLDB4MTgsMHgyMSwweDAwLDB4MDMsMHgyNiwweDAwLDB4MTQsMHg4MCwweDAwLDB4MTgsMHhhMiwweDIzLDB4MDAsMHgxMiwKKzB4MDAsMHgwNywweDE2LDB4MDAsMHgxNCwweDQwLDB4MDAsMHgxMSwweDI0LDB4MDIsMHgwMCwweDAxLDB4OTYsMHgyMywweDAwLDB4MGMsCisweDI3LDB4ODQsMHg5MCwweDEwLDB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDQ0LDB4MTAsMHgyMSwweDgwLDB4NDUsMHgwMCwweDA2LDB4MDAsMHgwMywweDFhLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMCwKKzB4MDAsMHg2NSwweDE4LDB4MjEsMHgwMCwweDYyLDB4MTgsMHgyMSwweDkwLDB4NjQsMHgwMCwweDAwLDB4OTAsMHg2MiwweDAwLDB4MDQsCisweGEyLDB4MjAsMHgwMCwweDE1LDB4YTMsMHg4MCwweDhiLDB4ZDQsMHgyNCwweDAyLDB4MDAsMHgwMSwweDhmLDB4YmYsMHgwMCwweDE4LAorMHg3YiwweGIwLDB4MDAsMHhiYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MjAsMHgwYywweDAwLDB4MGMsMHhjZCwKKzB4MDIsMHgyMCwweDIwLDB4MjEsMHg5MiwweDI3LDB4MDAsMHgxMSwweDA4LDB4MDAsMHgwZCwweDdkLDB4MDAsMHgwNywweDE2LDB4MDAsCisweDBjLDB4MDAsMHgwYywweDZlLDB4MDIsMHgyMCwweDIwLDB4MjEsMHg4NiwweDIzLDB4MDAsMHgwYywweDI3LDB4ODQsMHg5MCwweDA4LAorMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ0LDB4MjAsMHgyMSwKKzB4OTAsMHg4NSwweDAwLDB4MDcsMHgyNywweDgzLDB4OTAsMHgxMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4YTIsMHgyNSwweDAwLDB4MTMsCisweDkwLDB4ODMsMHgwMCwweDA3LDB4MDgsMHgwMCwweDBkLDB4OTUsMHhhMCwweDQzLDB4MDAsMHgwMiwweDkyLDB4MjYsMHgwMCwweDBhLAorMHgwOCwweDAwLDB4MGQsMHg1ZSwweDMwLDB4YzIsMHgwMCwweGZmLDB4OGUsMHgyMiwweDAwLDB4MjQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHg1MCwweDAwLDB4MDcsMHhhMiwweDIwLDB4MDAsMHgwOCwweDI0LDB4MDIsMHgwMCwweDA3LDB4YTIsMHgyMiwweDAwLDB4MGEsCisweDkyLDB4MjIsMHgwMCwweDI3LDB4YWUsMHgyMCwweDAwLDB4MjQsMHgwOCwweDAwLDB4MGQsMHg1MSwweGEyLDB4MjIsMHgwMCwweDA0LAorMHgwOCwweDAwLDB4MGQsMHhhZiwweDI0LDB4MDIsMHgwMCwweDA2LDB4MTYsMHgwMiwweGZmLDB4OWIsMHgzYywweDAyLDB4YjAsMHgwNSwKKzB4OGUsMHgyMywweDAwLDB4MmMsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4NjIsMHgwMCwweDA3LDB4YTIsMHgyNCwweDAwLDB4MDgsCisweDI0LDB4MDIsMHgwMCwweDAzLDB4YTIsMHgyMiwweDAwLDB4MGEsMHg5MiwweDIyLDB4MDAsMHgyZiwweGFlLDB4MjAsMHgwMCwweDJjLAorMHgwOCwweDAwLDB4MGQsMHg1MSwweGEyLDB4MjIsMHgwMCwweDA2LDB4MDgsMHgwMCwweDBkLDB4YmUsMHhhMiwweDIwLDB4MDAsMHgwYSwKKzB4OGUsMHgyMiwweDAwLDB4MjgsMHgyNCwweDAzLDB4MDAsMHgwMSwweDI0LDB4MDQsMHgwMCwweDAxLDB4MTAsMHg0NCwweDAwLDB4MDcsCisweGEyLDB4MjMsMHgwMCwweDA4LDB4MjQsMHgwMiwweDAwLDB4MDUsMHhhMiwweDIyLDB4MDAsMHgwYSwweDkyLDB4MjIsMHgwMCwweDJiLAorMHhhZSwweDIwLDB4MDAsMHgyOCwweDA4LDB4MDAsMHgwZCwweDUxLDB4YTIsMHgyMiwweDAwLDB4MDUsMHgwOCwweDAwLDB4MGQsMHhjYSwKKzB4MjQsMHgwMiwweDAwLDB4MDQsMHgxMiwweDAyLDB4MDAsMHgxMiwweDJhLDB4MDIsMHgwMCwweDQxLDB4MTAsMHg0MCwweDAwLDB4MDksCisweDI0LDB4MDIsMHgwMCwweDgwLDB4MjQsMHgwMiwweDAwLDB4MjAsMHgxNiwweDAyLDB4ZmYsMHg3YiwweDNjLDB4MDIsMHhiMCwweDA1LAorMHgyNCwweDAyLDB4MDAsMHgxMiwweGEyLDB4MjIsMHgwMCwweDBhLDB4YTIsMHgyMiwweDAwLDB4MDgsMHgwOCwweDAwLDB4MGQsMHg1MSwKKzB4YWUsMHgyMCwweDAwLDB4M2MsMHgxNiwweDAyLDB4ZmYsMHg3NCwweDNjLDB4MDIsMHhiMCwweDA1LDB4MjQsMHgwMiwweDAwLDB4MTAsCisweGEyLDB4MjIsMHgwMCwweDBhLDB4YTIsMHgyMiwweDAwLDB4MDgsMHgwOCwweDAwLDB4MGQsMHg1MSwweGFlLDB4MjAsMHgwMCwweDM0LAorMHgyNCwweDAyLDB4MDAsMHgxMSwweGEyLDB4MjIsMHgwMCwweDBhLDB4YTIsMHgyMiwweDAwLDB4MDgsMHgwOCwweDAwLDB4MGQsMHg1MSwKKzB4YWUsMHgyMCwweDAwLDB4MzgsMHg4ZSwweDI0LDB4MDAsMHgzMCwweDI0LDB4MDIsMHgwMCwweDAzLDB4MjQsMHgwMywweDAwLDB4MDEsCisweDEwLDB4ODMsMHgwMCwweDA3LDB4YTIsMHgyMiwweDAwLDB4MDgsMHgyNCwweDAyLDB4MDAsMHgwMiwweGEyLDB4MjIsMHgwMCwweDBhLAorMHg5MiwweDIyLDB4MDAsMHgzMywweGFlLDB4MjAsMHgwMCwweDMwLDB4MDgsMHgwMCwweDBkLDB4NTEsMHhhMiwweDIyLDB4MDAsMHgwNywKKzB4MDgsMHgwMCwweDBkLDB4ZjAsMHhhMiwweDI0LDB4MDAsMHgwYSwweDhmLDB4ODQsMHhiNCwweDQwLDB4YWUsMHgyMCwweDAwLDB4MzQsCisweDk0LDB4ODUsMHgwMCwweDE0LDB4MGMsMHgwMCwweDFiLDB4NjYsMHgzMiwweDEwLDB4MDAsMHhmZiwweDA4LDB4MDAsMHgwZCwweDQyLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgyNCwweDQyLDB4MzcsMHhmNCwKKzB4MzQsMHg2MywweDAwLDB4MjAsMHhhYywweDYyLDB4MDAsMHgwMCwweDgwLDB4YTIsMHgwMCwweDE1LDB4M2MsMHgwNiwweGIwLDB4MDUsCisweDEwLDB4NDAsMHgwMCwweDBhLDB4MzQsMHhjNiwweDAyLDB4NTQsMHg4MywweDgzLDB4OGIsMHhkNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHhhYywweDgzLDB4MDAsMHgyNCwweDhjLDB4YzIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MTcsMHg0MiwKKzB4MzAsMHg0MiwweDAwLDB4MDEsMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4ODIsMHgwMCwweDI4LDB4OGMsMHg4MiwweDAwLDB4MmMsCisweDNjLDB4MDYsMHhiMCwweDA1LDB4MzQsMHhjNiwweDA0LDB4NTAsMHgwMCwweDAyLDB4MTgsMHg0MywweDMwLDB4NjMsMHgwMCwweDAxLAorMHgxMCwweDQwLDB4MDAsMHgwNCwweDMwLDB4NDUsMHgwMCwweDAxLDB4YWMsMHg4MywweDAwLDB4MjgsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4YWMsMHg4NSwweDAwLDB4MjQsMHg5MCwweGMyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZmYsCisweDMwLDB4NDMsMHgwMCwweDAyLDB4MzAsMHg0MiwweDAwLDB4MDEsMHhhYywweDgzLDB4MDAsMHgyOCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHhhYywweDgyLDB4MDAsMHgyNCwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgyNywweGJkLDB4ZmYsMHhkOCwKKzB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4MzgsMHg4NCwweGFjLDB4NjIsMHgwMCwweDAwLDB4YWYsMHhiMSwweDAwLDB4MWMsCisweGFmLDB4YmYsMHgwMCwweDIwLDB4YWYsMHhiMCwweDAwLDB4MTgsMHg5MCwweGE2LDB4MDAsMHgwYSwweDI3LDB4ODMsMHhiNCwweDAwLAorMHgwMCwweGEwLDB4ODgsMHgyMSwweDAwLDB4MDYsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDUwLDB4MDAsMHgwMCwKKzB4ODAsMHhhNSwweDAwLDB4MTEsMHg5MiwweDAzLDB4MDAsMHgxMiwweDEwLDB4YTAsMHgwMCwweDA0LDB4YTIsMHgyMCwweDAwLDB4MTUsCisweDI0LDB4MDIsMHgwMCwweDEyLDB4MTAsMHhjMiwweDAwLDB4ZGEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDgyLDB4MjIsMHgwMCwweDEyLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDY3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhMiwweDIwLDB4MDAsMHgxMiwKKzB4YTIsMHgwMCwweDAwLDB4MTksMHg4NiwweDIzLDB4MDAsMHgwYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweDEwLDB4YzAsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgyNywweDgzLDB4OTAsMHgyMCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHhhMCwweDQwLDB4MDAsMHgwMCwweDkyLDB4MDMsMHgwMCwweDE2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDYzLDB4MDAsMHhkZiwKKzB4YTIsMHgwMywweDAwLDB4MTYsMHg4MiwweDAyLDB4MDAsMHgxMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MjAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTIsMHgyMywweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NjAsMHgwMCwweDQ1LAorMHgyNCwweDAyLDB4MDAsMHgwMSwweGEyLDB4MjAsMHgwMCwweDA0LDB4OTIsMHgwOCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTUsMHgwMCwweDAwLDB4MWUsMHgyNCwweDAyLDB4MDAsMHgwMSwweDkyLDB4MDcsMHgwMCwweDBhLDB4YTIsMHgwMiwweDAwLDB4MTcsCisweDkyLDB4MDIsMHgwMCwweDE2LDB4MzAsMHhlMywweDAwLDB4ZmYsMHgzMCwweDQyLDB4MDAsMHhlNCwweDEwLDB4NjAsMHgwMCwweDAzLAorMHhhMiwweDAyLDB4MDAsMHgxNiwweDM0LDB4NDIsMHgwMCwweDAxLDB4YTIsMHgwMiwweDAwLDB4MTYsMHgxMSwweDAwLDB4MDAsMHgwNSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MiwweDAyLDB4MDAsMHgxNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzQsMHg0MiwweDAwLDB4MDIsCisweGEyLDB4MDIsMHgwMCwweDE2LDB4OTIsMHgwMiwweDAwLDB4MTcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDA4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDk2LDB4MDIsMHgwMCwweDA2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhNiwweDAyLDB4MDAsMHgxNCwKKzB4OGYsMHhiZiwweDAwLDB4MjAsMHg3YiwweGIwLDB4MDAsMHhmYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MjgsCisweDk2LDB4MDIsMHgwMCwweDAwLDB4MDgsMHgwMCwweDBlLDB4NmMsMHhhNiwweDAyLDB4MDAsMHgxNCwweDkyLDB4MDcsMHgwMCwweDBhLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4ZTAsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MGUsMHg1OCwKKzB4YTIsMHgwMCwweDAwLDB4MTcsMHg5NiwweDA0LDB4MDAsMHgwMCwweDk2LDB4MDUsMHgwMCwweDA2LDB4MjcsMHg4NiwweDkwLDB4MDAsCisweDAwLDB4MDQsMHgxOCwweGMwLDB4MDAsMHg2NCwweDE4LDB4MjEsMHgwMCwweDA1LDB4MTAsMHhjMCwweDAwLDB4NDUsMHgxMCwweDIxLAorMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4NjYsMHgxOCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ2LDB4MTAsMHgyMSwKKzB4OGMsMHg2NiwweDAwLDB4MDgsMHg4YywweDQ1LDB4MDAsMHgwOCwweDNjLDB4MDMsMHg4MCwweDAwLDB4MDAsMHhjMywweDIwLDB4MjQsCisweDEwLDB4ODAsMHgwMCwweDA4LDB4MDAsMHhhMywweDEwLDB4MjQsMHgxMCwweDQwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgxOCwweDIxLAorMHgxMCwweDgwLDB4MDAsMHgwMiwweDI0LDB4MDMsMHgwMCwweDAxLDB4MDAsMHhhNiwweDE4LDB4MmIsMHgwOCwweDAwLDB4MGUsMHg1OCwKKzB4YTIsMHgwMywweDAwLDB4MTcsMHgxMCwweDQwLDB4ZmYsMHhmZCwweDAwLDB4YTYsMHgxOCwweDJiLDB4MDgsMHgwMCwweDBlLDB4OGMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg2MiwweDAwLDB4MDksMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4NjIsMHgwMCwweDA1LAorMHgyNCwweDAyLDB4MDAsMHgwMywweDE0LDB4NjIsMHhmZiwweGI4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MGUsMHg1MiwKKzB4YTIsMHgyMCwweDAwLDB4MDcsMHgwOCwweDAwLDB4MGUsMHg1MiwweGEyLDB4MjAsMHgwMCwweDA2LDB4MDgsMHgwMCwweDBlLDB4NTIsCisweGEyLDB4MjAsMHgwMCwweDA1LDB4ODIsMHgyMiwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDY5LAorMHgyYywweDYyLDB4MDAsMHgwMiwweDEwLDB4NDAsMHgwMCwweDQ5LDB4M2MsMHgwMiwweGIwLDB4MDksMHg5MiwweDI1LDB4MDAsMHgwOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweGE2LDB4MDAsMHhmZiwweDJjLDB4YzIsMHgwMCwweDA0LDB4MTAsMHg0MCwweDAwLDB4M2IsCisweDJjLDB4YzIsMHgwMCwweDEwLDB4M2MsMHgwNCwweGIwLDB4MDUsMHgzNCwweDg0LDB4MDIsMHgyOSwweDkwLDB4ODMsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDAwLDB4YzIsMHgxMCwweDA0LDB4MDAsMHgwMiwweDEwLDB4MjcsMHgwMCwweDYyLDB4MTgsMHgyNCwKKzB4YTAsMHg4MywweDAwLDB4MDAsMHg4NiwweDIzLDB4MDAsMHgwYywweDk2LDB4MjYsMHgwMCwweDBjLDB4MDAsMHgwMywweDEwLDB4YzAsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDI4LDB4ODAsMHgyNywweDgzLDB4OTAsMHgwNCwweDAwLDB4YTMsMHgxOCwweDIxLAorMHg4YywweDY0LDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHg4MiwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweDAwLDB4MTAsMHgxMCwweDQwLDB4MDAsMHgxOCwweDI0LDB4MDcsMHgwMCwweDAxLDB4OTMsMHg4MiwweDhiLDB4NzEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4MDEsMHgxNCwweDQwLDB4MDAsMHgwYSwweDI0LDB4MDUsMHgwMCwweDI0LAorMHgwMCwweDA2LDB4MmMsMHgwMCwweDAwLDB4MDUsMHgyYywweDAzLDB4MGMsMHgwMCwweDFiLDB4NjYsMHgwMiwweDAwLDB4MjAsMHgyMSwKKzB4OTIsMHgwMiwweDAwLDB4MTYsMHhhMiwweDAwLDB4MDAsMHgxMiwweDMwLDB4NDIsMHgwMCwweGU3LDB4MDgsMHgwMCwweDBlLDB4NDksCisweGEyLDB4MDIsMHgwMCwweDE2LDB4ZjAsMHhjNSwweDAwLDB4MDYsMHgwMCwweDAwLDB4MjgsMHgxMiwweDI3LDB4ODIsMHg5MCwweDAwLAorMHgwMCwweGEyLDB4MjgsMHgyMSwweDBjLDB4MDAsMHgwMSwweDQ5LDB4M2MsMHgwNCwweDAwLDB4ODAsMHg5NiwweDI2LDB4MDAsMHgwYywKKzB4MDgsMHgwMCwweDBlLDB4YzksMHgwMCwweDA2LDB4MmMsMHgwMCwweDI3LDB4ODMsMHg5MCwweDEwLDB4MjcsMHg4MiwweDkwLDB4MTgsCisweDAwLDB4YTIsMHgxMCwweDIxLDB4MDAsMHhhMywweDE4LDB4MjEsMHg5MCwweDQ0LDB4MDAsMHgwMCwweDkwLDB4NjUsMHgwMCwweDA1LAorMHg5MywweDgyLDB4ODAsMHgxMCwweDAwLDB4MDAsMHgzMCwweDIxLDB4MGMsMHgwMCwweDIxLDB4OWEsMHhhZiwweGEyLDB4MDAsMHgxMCwKKzB4OTYsMHgyNiwweDAwLDB4MGMsMHgwOCwweDAwLDB4MGUsMHhjMywweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweGZmLDB4Y2QsCisweDNjLDB4MDQsMHhiMCwweDA1LDB4MzQsMHg4NCwweDAyLDB4MjksMHg5MCwweDgzLDB4MDAsMHgwMCwweDMwLDB4YTUsMHgwMCwweDBmLAorMHgyNCwweDAyLDB4MDAsMHg4MCwweDA4LDB4MDAsMHgwZSwweGIyLDB4MDAsMHhhMiwweDEwLDB4MDcsMHg4NiwweDI2LDB4MDAsMHgwYywKKzB4M2MsMHgwMywweGIwLDB4MDksMHgzNCwweDQyLDB4MDEsMHg3MiwweDM0LDB4NjMsMHgwMSwweDc4LDB4OTQsMHg0NywweDAwLDB4MDAsCisweDhjLDB4NjUsMHgwMCwweDAwLDB4MDAsMHgwNiwweDEwLDB4YzAsMHgwMCwweDQ2LDB4MTAsMHgyMSwweDNjLDB4MDQsMHhiMCwweDA5LAorMHhhZSwweDI1LDB4MDAsMHgxYywweDM0LDB4ODQsMHgwMSwweDdjLDB4MjcsMHg4MywweDkwLDB4MDQsMHgwMCwweDAyLDB4MTAsMHg4MCwKKzB4OGMsMHg4NSwweDAwLDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDhjLDB4NDMsMHgwMCwweDE4LDB4YWUsMHgyNSwweDAwLDB4MjAsCisweGE2LDB4MjcsMHgwMCwweDE4LDB4OGMsMHg2NiwweDAwLDB4MDgsMHgwMiwweDIwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgwZiwweDE5LAorMHgwMCwweDAwLDB4MjgsMHgyMSwweDg2LDB4MjUsMHgwMCwweDE4LDB4OGUsMHgyNiwweDAwLDB4MWMsMHg4ZSwweDI3LDB4MDAsMHgyMCwKKzB4MDIsMHgyMCwweDIwLDB4MjEsMHgwYywweDAwLDB4MWMsMHg2OCwweGFmLDB4YTIsMHgwMCwweDEwLDB4MDgsMHgwMCwweDBlLDB4NDksCisweGEyLDB4MDIsMHgwMCwweDEyLDB4OTIsMHgyMiwweDAwLDB4MDgsMHgwOCwweDAwLDB4MGUsMHg0OSwweGEyLDB4MjIsMHgwMCwweDA5LAorMHhhMiwweDIwLDB4MDAsMHgxMSwweDgwLDB4ODIsMHgwMCwweDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgwMywKKzB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDAsMHhkMCwweGFjLDB4NDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDBlLDB4NDksCisweGEwLDB4ODAsMHgwMCwweDUwLDB4OTQsMHg4YSwweDAwLDB4MGMsMHgyNCwweDAzLDB4MDAsMHgyNCwweDAwLDB4ODAsMHg3MCwweDIxLAorMHgzYywweDAyLDB4ODAsMHgwMCwweDNjLDB4MDQsMHhiMCwweDAzLDB4MjQsMHg0MiwweDNjLDB4NjQsMHhmMSwweDQzLDB4MDAsMHgwNiwKKzB4MzQsMHg4NCwweDAwLDB4MjAsMHgwMCwweDAwLDB4MTgsMHgxMiwweDAwLDB4YTAsMHg2OCwweDIxLDB4YWMsMHg4MiwweDAwLDB4MDAsCisweDI3LDB4ODUsMHg5MCwweDEwLDB4MjcsMHg4MiwweDkwLDB4MGYsMHgyNywweGJkLDB4ZmYsMHhmOCwweDAwLDB4NjIsMHg2MCwweDIxLAorMHgwMCwweDY1LDB4NTgsMHgyMSwweDAwLDB4MDAsMHhjMCwweDIxLDB4MTEsMHhhMCwweDAwLDB4Y2MsMHgwMCwweDAwLDB4NzgsMHgyMSwKKzB4MDAsMHgwYSwweDFjLDB4MDAsMHgwMCwweDAzLDB4MWMsMHgwMywweDAwLDB4MDMsMHgxMCwweGMwLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0NSwweDEwLDB4MjEsMHg5MSwweDg3LDB4MDAsMHgwMCwweDgwLDB4NDgsMHgwMCwweDA0LAorMHgwMywweGEwLDB4NjAsMHgyMSwweDAwLDB4MGEsMHgxYywweDAwLDB4MDAsMHgwMywweDFjLDB4MDMsMHgwMCwweDAzLDB4MTAsMHhjMCwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4NDgsMHg4MCwweDI3LDB4ODMsMHg5MCwweDA0LDB4YTMsMHhhNywweDAwLDB4MDAsCisweDAxLDB4MjMsMHgxOCwweDIxLDB4OGMsMHg2NCwweDAwLDB4MTgsMHgyNSwweDAyLDB4ZmYsMHhmZiwweDAwLDB4NDgsMHg0MCwweDBiLAorMHg4YywweDgzLDB4MDAsMHgwNCwweDJkLDB4MDUsMHgwMCwweDA3LDB4MjQsMHgwMiwweDAwLDB4MDYsMHgzMCwweDYzLDB4MDAsMHgwOCwKKzB4MTQsMHg2MCwweDAwLDB4MzUsMHgwMCwweDQ1LDB4NDAsMHgwYSwweDkzLDB4YTcsMHgwMCwweDAwLDB4MjcsMHg4MiwweDkwLDB4MTgsCisweDAxLDB4MjIsMHgxMCwweDIxLDB4MzAsMHhlMywweDAwLDB4ZjAsMHgzOCwweDYzLDB4MDAsMHg1MCwweDMwLDB4ZTUsMHgwMCwweGZmLAorMHgwMCwweDA1LDB4MjAsMHgyYiwweDAwLDB4MDMsMHgxOCwweDJiLDB4MDAsMHg2NCwweDE4LDB4MjQsMHg5MCwweDQ5LDB4MDAsMHgwMCwKKzB4MTAsMHg2MCwweDAwLDB4MTYsMHgzMCwweGU0LDB4MDAsMHgwZiwweDI0LDB4MDIsMHgwMCwweDA0LDB4MTAsMHhhMiwweDAwLDB4OWQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTEsMHhhMCwweDAwLDB4M2EsMHgyYywweGEyLDB4MDAsMHgwYywweDEwLDB4NDAsMHgwMCwweDAyLAorMHgyNCwweDg0LDB4MDAsMHgwYywweDAwLDB4ZTAsMHgyMCwweDIxLDB4MzAsMHg4NCwweDAwLDB4ZmYsMHgwMCwweDA0LDB4MTAsMHg0MCwKKzB4MjcsMHg4MywweGJiLDB4MWMsMHgwMCwweDQ0LDB4MTAsMHgyMSwweDAwLDB4NDMsMHgxMCwweDIxLDB4OTAsMHg0NywweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MmMsMHhlMywweDAwLDB4MGMsMHhhMywweGE3LDB4MDAsMHgwMCwweDEwLDB4NjAsMHgwMCwweDAyLAorMHgyNCwweGUyLDB4MDAsMHgwNCwweDAwLDB4ZTAsMHgxMCwweDIxLDB4YTMsMHhhMiwweDAwLDB4MDAsMHg5MSwweDY1LDB4MDAsMHgwMCwKKzB4OTEsMHg4MiwweDAwLDB4MDAsMHgzMCwweGEzLDB4MDAsMHhmZiwweDAwLDB4NjIsMHgxMCwweDJiLDB4MTAsMHg0MCwweDAwLDB4MGUsCisweDJjLDB4NjIsMHgwMCwweDBjLDB4MTQsMHg0MCwweDAwLDB4MDMsMHgwMCwweDYwLDB4MjAsMHgyMSwweDMwLDB4YTIsMHgwMCwweDBmLAorMHgyNCwweDQ0LDB4MDAsMHgwYywweDAwLDB4MDQsMHgxMCwweDQwLDB4MDAsMHg0NCwweDIwLDB4MjEsMHgyNywweDgzLDB4YmIsMHgxYywKKzB4MDAsMHg4MywweDE4LDB4MjEsMHg5MCwweDYyLDB4MDAsMHgwMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MDUsCisweDAwLDB4MDksMHgxMSwweDAwLDB4YTEsMHg4NSwweDAwLDB4MDAsMHg5MywweGEyLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgwOCwweDAwLDB4NDksMHgxMCwweDIzLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ5LDB4MTAsMHgyMywKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ0LDB4MTAsMHgyMSwweDI3LDB4ODMsMHhiNCwweGE4LDB4MDAsMHg0MywweDEwLDB4MjEsCisweDkwLDB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyYywweDgzLDB4MDAsMHgwYywweDE0LDB4NjAsMHgwMCwweDA2LAorMHgwMCwweDgwLDB4MTAsMHgyMSwweDAwLDB4MTgsMHgxMCwweDQwLDB4MDAsMHg0ZiwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTEsMHgwMCwKKzB4MDAsMHg4MiwweDEwLDB4MjEsMHgyNCwweDQyLDB4MDAsMHgwNCwweDA4LDB4MDAsMHgwZiwweDdhLDB4YTEsMHg4MiwweDAwLDB4MDAsCisweDhmLDB4OGQsMHg4MSwweDVjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweGE4LDB4MTAsMHgyMSwweDkwLDB4NDMsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NjAsMHhmZiwweGQxLDB4MDAsMHgwMCwweDI4LDB4MjEsMHgwMCwweDA2LDB4NzQsMHg4MiwKKzB4MzAsMHhlMiwweDAwLDB4ZmYsMHgyYywweDQyLDB4MDAsMHgwYywweDE0LDB4NDAsMHgwMCwweDAzLDB4MDAsMHhlMCwweDEwLDB4MjEsCisweDMwLDB4ZTIsMHgwMCwweDBmLDB4MjQsMHg0MiwweDAwLDB4MGMsMHgzMCwweDQ0LDB4MDAsMHhmZiwweGEzLDB4YTIsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwYywweDEwLDB4ODIsMHgwMCwweDBkLDB4MDAsMHgwOSwweDExLDB4MDAsMHgwMCwweDQ5LDB4MTAsMHgyMywKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDA0LDB4MTgsMHg0MCwweDAwLDB4NDksMHgxMCwweDIzLDB4MDAsMHg2NCwweDE4LDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjEsMHgyNywweDg0LDB4YjQsMHhhOCwweDAwLDB4NDQsMHgxMCwweDIxLAorMHg5MCwweDQ3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4YTMsMHhhNywweDAwLDB4MDAsMHgwMCwweDBhLDB4MWMsMHgwMCwKKzB4MDAsMHgwMywweDFjLDB4MDMsMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDI3LDB4ODMsMHg5MCwweDA0LDB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDQ0LDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4YywweDgzLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg2MywweDAwLDB4MTAsMHgxNCwweDYwLDB4MDAsMHgzMywKKzB4MDAsMHgwNiwweDE0LDB4NDIsMHgwMCwweDA5LDB4MTEsMHgwMCwweDAwLDB4NDksMHgxMCwweDIzLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDAwLDB4NDksMHgxMCwweDIzLDB4MjcsMHg4MywweGI1LDB4NzgsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHg5MCwweDQ0LDB4MDAsMHgwNCwweDkwLDB4NDMsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDY0LDB4YzAsMHgyNCwKKzB4OTMsMHhhNywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDJjLDB4ZTIsMHgwMCwweDBmLDB4MTAsMHg0MCwweDAwLDB4MGYsCisweDMxLDB4Y2YsMHgwMCwweDAxLDB4MDAsMHgwYSwweDFjLDB4MDAsMHgwMCwweDAzLDB4MWMsMHgwMywweDAwLDB4MDMsMHgxMCwweGMwLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MjcsMHg4NCwweDkwLDB4MDAsMHgwMCwweDQ0LDB4MTAsMHgyMSwKKzB4ODQsMHg0MywweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI4LDB4NjMsMHgwNiwweDQxLDB4MTQsMHg2MCwweDAwLDB4MDQsCisweDMwLDB4ZTIsMHgwMCwweGZmLDB4MjQsMHgwNywweDAwLDB4MGYsMHhhMywweGE3LDB4MDAsMHgwMCwweDMwLDB4ZTIsMHgwMCwweGZmLAorMHgyYywweDQyLDB4MDAsMHgwYywweDE0LDB4NDAsMHgwMCwweDA2LDB4MDAsMHhlMCwweDEwLDB4MjEsMHgwMCwweDE4LDB4MTAsMHg0MCwKKzB4MDAsMHg0ZiwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTEsMHgwMCwweDAwLDB4NDcsMHgxMCwweDIxLDB4MjQsMHg0MiwweDAwLDB4MDQsCisweGEzLDB4YTIsMHgwMCwweDAwLDB4MDAsMHg0MCwweDM4LDB4MjEsMHgwMSwweGE4LDB4MTAsMHgyMSwweDkwLDB4NDMsMHgwMCwweDAwLAorMHgyNCwweGE0LDB4MDAsMHgwMSwweDMwLDB4ODUsMHhmZiwweGZmLDB4MDAsMHhhMywweDE4LDB4MmIsMHgxNCwweDYwLDB4ZmYsMHhhZCwKKzB4MzAsMHhlMiwweDAwLDB4ZmYsMHgwOCwweDAwLDB4MGYsMHg2NywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDBmLDB4YzgsCisweDMwLDB4NTgsMHgwMCwweDAxLDB4ODEsMHhjMiwweDAwLDB4NDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHhmZiwweDczLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwZiwweDU1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBhLDB4MWMsMHgwMCwKKzB4MDAsMHgwMywweDFjLDB4MDMsMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDAwLDB4NDUsMHgxMCwweDIxLDB4ODAsMHg0OCwweDAwLDB4MDUsMHg5MSwweDY3LDB4MDAsMHgwMCwweDA4LDB4MDAsMHgwZiwweDM1LAorMHgwMywweGEwLDB4NTgsMHgyMSwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgzNCwweDYzLDB4MDAsMHgyMCwKKzB4MjQsMHg0MiwweDQwLDB4MDQsMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4NjIsMHgwMCwweDAwLDB4MjcsMHhiZCwweGZmLDB4YzAsCisweGFmLDB4YjcsMHgwMCwweDM0LDB4YWYsMHhiNiwweDAwLDB4MzAsMHhhZiwweGI1LDB4MDAsMHgyYywweGFmLDB4YjQsMHgwMCwweDI4LAorMHhhZiwweGIzLDB4MDAsMHgyNCwweGFmLDB4YjIsMHgwMCwweDIwLDB4YWYsMHhiZiwweDAwLDB4M2MsMHhhZiwweGJlLDB4MDAsMHgzOCwKKzB4YWYsMHhiMSwweDAwLDB4MWMsMHhhZiwweGIwLDB4MDAsMHgxOCwweDg0LDB4ODIsMHgwMCwweDBjLDB4MjcsMHg5MywweDkwLDB4MDQsCisweDNjLDB4MDUsMHhiMCwweDAzLDB4MDAsMHgwMiwweDE4LDB4YzAsMHgwMCwweDYyLDB4MTgsMHgyMSwweDAwLDB4MDMsMHgxOCwweDgwLAorMHgwMCwweDczLDB4MTAsMHgyMSwweDhjLDB4NWUsMHgwMCwweDE4LDB4M2MsMHgwMiwweDgwLDB4MDAsMHgzNCwweGE1LDB4MDAsMHgyMCwKKzB4MjQsMHg0MiwweDQwLDB4MWMsMHhhYywweGEyLDB4MDAsMHgwMCwweDhmLDB4ZDAsMHgwMCwweDA4LDB4MjcsMHg5NSwweDkwLDB4MTAsCisweDAwLDB4NzUsMHgxOCwweDIxLDB4MDAsMHgwMCwweDI4LDB4MjEsMHgwMiwweDAwLDB4MzAsMHgyMSwweDkwLDB4NzEsMHgwMCwweDAwLAorMHgwYywweDAwLDB4MGYsMHgxOSwweDAwLDB4ODAsMHhiMCwweDIxLDB4MDAsMHg0MCwweDkwLDB4MjEsMHgwMCwweDEwLDB4MTQsMHg0MiwKKzB4MzAsMHg1NCwweDAwLDB4MDEsMHgwMiwweDQwLDB4MjAsMHgyMSwweDAwLDB4MTAsMHgxNCwweDgyLDB4MDIsMHg4MCwweDI4LDB4MjEsCisweDEyLDB4NTEsMHgwMCwweDIzLDB4MDAsMHgxMCwweGJmLDB4YzIsMHg4NiwweGMzLDB4MDAsMHgwYywweDMwLDB4NTAsMHgwMCwweDAxLAorMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDU1LDB4MTAsMHgyMSwKKzB4YTAsMHg1MiwweDAwLDB4MDAsMHg4NiwweGMzLDB4MDAsMHgwYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweDEwLDB4YzAsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDUzLDB4MzAsMHgyMSwweDhjLDB4YzcsMHgwMCwweDE4LAorMHgyNywweDgzLDB4OTAsMHgwMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4OGMsMHhlMywweDAwLDB4MDQsMHg4NCwweDQ2LDB4MDAsMHgwNiwKKzB4MDAsMHgwMywweDE5LDB4NDIsMHgwYywweDAwLDB4MDgsMHhlMywweDMwLDB4NzMsMHgwMCwweDAxLDB4MDAsMHg0MCwweDg4LDB4MjEsCisweDAyLDB4NDAsMHgyMCwweDIxLDB4MDIsMHg4MCwweDI4LDB4MjEsMHgxNiwweGUwLDB4MDAsMHgxMCwweDAyLDB4MDAsMHgzMCwweDIxLAorMHg4NiwweGMyLDB4MDAsMHgwYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDE4LDB4YzAsMHgwMCwweDYyLDB4MTgsMHgyMSwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgyNywweDgyLDB4OTAsMHgwOCwweDAwLDB4NjIsMHgxOCwweDIxLDB4YTQsMHg3MSwweDAwLDB4MDQsCisweDdiLDB4YmUsMHgwMSwweGZjLDB4N2IsMHhiNiwweDAxLDB4YmMsMHg3YiwweGI0LDB4MDEsMHg3YywweDdiLDB4YjIsMHgwMSwweDNjLAorMHg3YiwweGIwLDB4MDAsMHhmYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4NDAsMHg4NiwweGMzLDB4MDAsMHgwYywKKzB4YWYsMHhiMywweDAwLDB4MTAsMHhhZiwweGEwLDB4MDAsMHgxNCwweDAwLDB4MDMsMHgxMCwweGMwLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg1NSwweDEwLDB4MjEsMHg4MCwweDQ3LDB4MDAsMHgwNiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweGU3LDB4MDAsMHgwMiwweDAwLDB4MDcsMHgxNywweGMyLDB4MDAsMHhlMiwweDM4LDB4MjEsMHgwMCwweDA3LDB4MzgsMHg0MywKKzB4MDAsMHgwNywweDM4LDB4NDAsMHgwYywweDAwLDB4MDksMHgwYSwweDAzLDB4YzcsMHgzOCwweDIxLDB4MDgsMHgwMCwweDEwLDB4NDgsCisweDAyLDB4MjIsMHg4OCwweDIxLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGQwLAorMHgzNCwweDYzLDB4MDAsMHgyMCwweDI0LDB4NDIsMHg0MSwweGE0LDB4YWYsMHhiMiwweDAwLDB4MjAsMHhhYywweDYyLDB4MDAsMHgwMCwKKzB4YWYsMHhiZiwweDAwLDB4MjgsMHhhZiwweGIzLDB4MDAsMHgyNCwweGFmLDB4YjEsMHgwMCwweDFjLDB4YWYsMHhiMCwweDAwLDB4MTgsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4OTAsMHg4MywweDAwLDB4MGEsMHgzNCwweDQyLDB4MDEsMHgwNCwweDk0LDB4NDUsMHgwMCwweDAwLAorMHgwMCwweDAzLDB4MTgsMHg4MCwweDI3LDB4ODIsMHhiNCwweDAwLDB4MDAsMHg2MiwweDE4LDB4MjEsMHgzMCwweGE2LDB4ZmYsMHhmZiwKKzB4OGMsMHg3MSwweDAwLDB4MDAsMHg4MCwweDg1LDB4MDAsMHgxMiwweDMwLDB4YzksMHgwMCwweGZmLDB4MDAsMHgwNiwweDMyLDB4MDIsCisweGE0LDB4ODYsMHgwMCwweDQ0LDB4YTQsMHg4OSwweDAwLDB4NDYsMHg4MiwweDIyLDB4MDAsMHgxMiwweDAwLDB4ODAsMHg5MCwweDIxLAorMHgxMCwweGEwLDB4MDAsMHgxYiwweGEwLDB4ODAsMHgwMCwweDE1LDB4MDAsMHhjNSwweDEwLDB4MmEsMHgxMCwweDQwLDB4MDAsMHgxNCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHhhMiwweDIwLDB4MDAsMHgxOSwweDg0LDB4ODMsMHgwMCwweDBjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDMsMHgxMCwweGMwLDB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDI3LDB4ODMsMHg5MCwweDIwLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweGEwLDB4NDAsMHgwMCwweDAwLDB4YTAsMHg4MCwweDAwLDB4MTIsMHg5MiwweDIyLDB4MDAsMHgxNiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHhkZiwweGEyLDB4MjIsMHgwMCwweDE2LDB4OGYsMHhiZiwweDAwLDB4MjgsCisweDdiLDB4YjIsMHgwMSwweDNjLDB4N2IsMHhiMCwweDAwLDB4ZmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDMwLAorMHgwYywweDAwLDB4MTAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDEwLDB4OTcsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjgsMHg0MiwweDAwLDB4MDIsMHgxMCwweDQwLDB4MDEsMHg3NiwweDAwLDB4MDAsMHgyOCwweDIxLDB4OTQsMHg4NywweDAwLDB4MGMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhlMCwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTQsMHgwMCwweDAwLDB4MDIsMHgxNCwweDAzLAorMHgwMCwweDA3LDB4MjQsMHgwMCwweDAwLDB4MDQsMHgyNCwweDAzLDB4MDAsMHgwMiwweDE4LDB4YzAsMHgwMCwweDYyLDB4MTgsMHgyMSwKKzB4MDAsMHgwNCwweDI4LDB4YzAsMHgwMCwweGE0LDB4MjgsMHgyMSwweDI3LDB4ODIsMHg5MCwweDIwLDB4MDAsMHgwMywweDE4LDB4ODAsCisweDAwLDB4NjIsMHgxOCwweDIxLDB4MDAsMHgwNSwweDI4LDB4ODAsMHgyNywweDgyLDB4OTAsMHgwOCwweDAwLDB4YTIsMHgxMCwweDIxLAorMHg4YywweDY4LDB4MDAsMHgwMCwweDgwLDB4NDQsMHgwMCwweDA2LDB4MjcsMHg4MiwweDkwLDB4MTAsMHgwMCwweDA4LDB4MWQsMHgwMiwKKzB4MDAsMHhhMiwweDI4LDB4MjEsMHgzOCwweDg0LDB4MDAsMHgwMCwweDMwLDB4NjMsMHgwMCwweDAxLDB4MDEsMHgyNCwweDMwLDB4MGIsCisweDgwLDB4YWEsMHgwMCwweDA0LDB4ODAsMHhhOSwweDAwLDB4MDUsMHgxMCwweDYwLDB4MDAsMHgwMiwweDAwLDB4MDgsMHgxNCwweDAyLAorMHgzMCwweDQ2LDB4MDAsMHgwZiwweDE1LDB4MjAsMHgwMCwweDI4LDB4MDEsMHg0OSwweDEwLDB4MjEsMHgxNSwweDQwLDB4MDAsMHgxMSwKKzB4MzAsMHhlMywweGZmLDB4ZmYsMHg5MiwweDQ1LDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHhhOCwweDAwLDB4ZmYsCisweDJkLDB4MDIsMHgwMCwweDA0LDB4MTAsMHg0MCwweDAxLDB4NDYsMHgyZCwweDAyLDB4MDAsMHgxMCwweDNjLDB4MDQsMHhiMCwweDA1LAorMHgzNCwweDg0LDB4MDIsMHgyOSwweDkwLDB4ODMsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgwMSwweDAyLDB4MTAsMHgwNCwKKzB4MDAsMHg2MiwweDE4LDB4MjUsMHhhMCwweDgzLDB4MDAsMHgwMCwweDk2LDB4NDcsMHgwMCwweDBjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4ZTMsMHhmZiwweGZmLDB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDI3LDB4ODQsMHg5MCwweDEwLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDQsMHgxMCwweDIxLDB4ODAsMHg0NSwweDAwLDB4MDYsMHgwMCwweDAzLDB4MWEsMHgwMCwKKzB4M2MsMHgwNCwweGIwLDB4MDAsMHgwMCwweDY1LDB4MTgsMHgyMSwweDAwLDB4NjQsMHgyMCwweDIxLDB4OTQsMHg4MiwweDAwLDB4MDAsCisweDgyLDB4NDMsMHgwMCwweDEwLDB4MDAsMHgwMiwweDE0LDB4MDAsMHgxNCwweDYwLDB4MDAsMHgwNiwweDAwLDB4MDIsMHgzYywweDAzLAorMHgzMCwweGUyLDB4MDAsMHgwNCwweDE0LDB4NDAsMHgwMCwweDA0LDB4MDEsMHg0OSwweDEwLDB4MjEsMHgzNCwweGUyLDB4MDgsMHgwMCwKKzB4YTQsMHg4MiwweDAwLDB4MDAsMHgwMSwweDQ5LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxNiwweDAwLDB4MDAsMHgwMiwweDE2LDB4MDMsCisweDAwLDB4NDYsMHgxMCwweDJhLDB4MTAsMHg0MCwweDAwLDB4N2MsMHgwMCwweDAwLDB4MDAsMHgwMCwweDgyLDB4NDIsMHgwMCwweDEwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDBlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4NiwweDQzLDB4MDAsMHgwYywKKzB4MjUsMHg0NCwweDAwLDB4MDEsMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDI3LDB4ODMsMHg5MCwweDEwLDB4MDAsMHg0MywweDEwLDB4MjEsMHhhMCwweDQ0LDB4MDAsMHgwNCwweDkyLDB4MjMsMHgwMCwweDE2LAorMHgwMiwweDQwLDB4MjAsMHgyMSwweDMwLDB4NjMsMHgwMCwweGZiLDB4MDgsMHgwMCwweDEwLDB4OWMsMHhhMiwweDIzLDB4MDAsMHgxNiwKKzB4ODYsMHg0MywweDAwLDB4MGMsMHgyNSwweDI0LDB4MDAsMHgwMSwweDAwLDB4MDMsMHgxMCwweGMwLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MjcsMHg4MywweDkwLDB4MTAsMHgwMCwweDQzLDB4MTAsMHgyMSwweGEwLDB4NDQsMHgwMCwweDA1LAorMHg4NiwweDQ1LDB4MDAsMHgwYywweDBjLDB4MDAsMHgxZSwweGVhLDB4MDIsMHgyMCwweDIwLDB4MjEsMHgxMCwweDQwLDB4MDAsMHg1YSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MiwweDQ1LDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHhhNiwweDAwLDB4ZmYsCisweDJjLDB4YzIsMHgwMCwweDA0LDB4MTAsMHg0MCwweDAwLDB4NGMsMHgyYywweGMyLDB4MDAsMHgxMCwweDNjLDB4MDQsMHhiMCwweDA1LAorMHgzNCwweDg0LDB4MDIsMHgyOSwweDkwLDB4ODMsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgwMCwweGMyLDB4MTAsMHgwNCwKKzB4MDAsMHgwMiwweDEwLDB4MjcsMHgwMCwweDYyLDB4MTgsMHgyNCwweGEwLDB4ODMsMHgwMCwweDAwLDB4OTIsMHg0NSwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHhhNSwweDAwLDB4ZmYsMHgxNCwweGEwLDB4MDAsMHgzMywweDI0LDB4MDIsMHgwMCwweDAxLAorMHhhMiwweDQwLDB4MDAsMHgwNCwweDkyLDB4MjIsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgwYywKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHhhMiwweDIyLDB4MDAsMHgxNywweDkyLDB4MjIsMHgwMCwweDE3LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4NDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NiwweDIyLDB4MDAsMHgwNiwweDA4LDB4MDAsMHgxMCwweDk3LAorMHhhNiwweDIyLDB4MDAsMHgxNCwweDk2LDB4MjIsMHgwMCwweDAwLDB4MDgsMHgwMCwweDEwLDB4OTcsMHhhNiwweDIyLDB4MDAsMHgxNCwKKzB4OTIsMHgyMiwweDAwLDB4MGEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgxMSwweDI2LDB4YTIsMHgyMCwweDAwLDB4MTcsMHg5NiwweDI0LDB4MDAsMHgwMCwweDk2LDB4MjUsMHgwMCwweDA2LAorMHgyNywweDg2LDB4OTAsMHgwMCwweDAwLDB4MDQsMHgxOCwweGMwLDB4MDAsMHg2NCwweDE4LDB4MjEsMHgwMCwweDA1LDB4MTAsMHhjMCwKKzB4MDAsMHg0NSwweDEwLDB4MjEsMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4NjYsMHgxOCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDAwLDB4NDYsMHgxMCwweDIxLDB4OGMsMHg2NSwweDAwLDB4MDgsMHg4YywweDQ0LDB4MDAsMHgwOCwweDNjLDB4MDMsMHg4MCwweDAwLAorMHgwMCwweGEzLDB4MzAsMHgyNCwweDEwLDB4YzAsMHgwMCwweDA4LDB4MDAsMHg4MywweDEwLDB4MjQsMHgxMCwweDQwLDB4MDAsMHgwNCwKKzB4MDAsMHgwMCwweDE4LDB4MjEsMHgxMCwweGMwLDB4MDAsMHgwMiwweDI0LDB4MDMsMHgwMCwweDAxLDB4MDAsMHg4NSwweDE4LDB4MmIsCisweDA4LDB4MDAsMHgxMSwweDI2LDB4YTIsMHgyMywweDAwLDB4MTcsMHgxMCwweDQwLDB4ZmYsMHhmZCwweDAwLDB4ODUsMHgxOCwweDJiLAorMHgwOCwweDAwLDB4MTEsMHg0OSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHhhMiwweDAwLDB4MDksMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTAsMHhhMiwweDAwLDB4MDUsMHgyNCwweDAyLDB4MDAsMHgwMywweDE0LDB4YTIsMHhmZiwweGNhLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgxMSwweDIxLDB4YTIsMHg0MCwweDAwLDB4MDcsMHgwOCwweDAwLDB4MTEsMHgyMSwweGEyLDB4NDAsMHgwMCwweDA2LAorMHgwOCwweDAwLDB4MTEsMHgyMSwweGEyLDB4NDAsMHgwMCwweDA1LDB4MTQsMHg0MCwweGZmLDB4YmUsMHgzYywweDA0LDB4YjAsMHgwNSwKKzB4MzQsMHg4NCwweDAyLDB4MjksMHg5MCwweDgzLDB4MDAsMHgwMCwweDMwLDB4YTUsMHgwMCwweDBmLDB4MjQsMHgwMiwweDAwLDB4ODAsCisweDA4LDB4MDAsMHgxMSwweDE4LDB4MDAsMHhhMiwweDEwLDB4MDcsMHgwYywweDAwLDB4MTAsMHgwNywweDAyLDB4NDAsMHgyMCwweDIxLAorMHgwOCwweDAwLDB4MTAsMHg5NywweDAwLDB4MDAsMHgwMCwweDAwLDB4OTIsMHg0NSwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHhhNiwweDAwLDB4ZmYsMHgyYywweGMyLDB4MDAsMHgwNCwweDEwLDB4NDAsMHgwMCwweDk5LDB4MmMsMHhjMiwweDAwLDB4MTAsCisweDNjLDB4MDQsMHhiMCwweDA1LDB4MzQsMHg4NCwweDAyLDB4MjksMHg5MCwweDgzLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLAorMHgwMCwweGMyLDB4MTAsMHgwNCwweDAwLDB4MDIsMHgxMCwweDI3LDB4MDAsMHg2MiwweDE4LDB4MjQsMHhhMCwweDgzLDB4MDAsMHgwMCwKKzB4OTIsMHg0NSwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4YTUsMHgwMCwweGZmLDB4MTQsMHhhMCwweDAwLDB4ODAsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4YTIsMHg0MCwweDAwLDB4MDQsMHg4NiwweDQzLDB4MDAsMHgwYywweDI3LDB4OTMsMHg5MCwweDA0LAorMHg5NiwweDQ3LDB4MDAsMHgwYywweDAwLDB4MDMsMHgxMCwweGMwLDB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MjgsMHg4MCwKKzB4MDAsMHhiMywweDE4LDB4MjEsMHg4YywweDY0LDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHg4MiwweDAwLDB4MDQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4MTAsMHgxMCwweDQwLDB4MDAsMHg2NCwweDAwLDB4MDAsMHgzMCwweDIxLAorMHgwMCwweDA3LDB4MWMsMHgwMCwweDAwLDB4MDMsMHgxYywweDAzLDB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDUzLDB4MTAsMHgyMSwweDhjLDB4NDMsMHgwMCwweDE4LDB4OTMsMHg4MiwweDhiLDB4NzEsCisweDhjLDB4NjQsMHgwMCwweDA0LDB4MzAsMHg0MiwweDAwLDB4MDEsMHgwMCwweDA0LDB4MjEsMHg0MiwweDE0LDB4NDAsMHgwMCwweDRkLAorMHgzMCwweDkwLDB4MDAsMHgwMSwweDAwLDB4MDcsMHgyYywweDAwLDB4MDAsMHgwNSwweDJjLDB4MDMsMHgwYywweDAwLDB4MWIsMHg2NiwKKzB4MDIsMHgyMCwweDIwLDB4MjEsMHg5NiwweDI2LDB4MDAsMHgwNiwweDEyLDB4MDAsMHgwMCwweDE0LDB4MzAsMHhjNSwweGZmLDB4ZmYsCisweDAyLDB4NjAsMHg5MCwweDIxLDB4MDAsMHgwNSwweDEwLDB4YzAsMHgwMCwweDQ1LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDUyLDB4MTgsMHgyMSwweDkyLDB4MjIsMHgwMCwweDBhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgwYiwKKzB4MDIsMHgyMCwweDIwLDB4MjEsMHg4YywweDYzLDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHg2MiwweDAwLDB4MDQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDExLDB4NDIsMHgwYywweDAwLDB4MWIsMHg2NiwweDMwLDB4NTAsMHgwMCwweDAxLAorMHg5NiwweDI2LDB4MDAsMHgwNiwweDE2LDB4MDAsMHhmZiwweGVmLDB4MzAsMHhjNSwweGZmLDB4ZmYsMHg5MiwweDIyLDB4MDAsMHgwNCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgwZCwweDI0LDB4MDIsMHgwMCwweDAxLDB4YTIsMHgyMiwweDAwLDB4MTcsCisweDkyLDB4MjIsMHgwMCwweDE3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHhhNiwweDI2LDB4MDAsMHgxNCwweDkyLDB4MjIsMHgwMCwweDE2LDB4MDgsMHgwMCwweDEwLDB4OTYsMHgzMCwweDQyLDB4MDAsMHhjMywKKzB4OTYsMHgyMiwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTEsMHhiZCwweGE2LDB4MjIsMHgwMCwweDE0LDB4OTIsMHgyMiwweDAwLDB4MGEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxMSwweGI4LAorMHhhMiwweDIwLDB4MDAsMHgxNywweDk2LDB4MjQsMHgwMCwweDAwLDB4MzAsMHhjNSwweGZmLDB4ZmYsMHgwMCwweDA1LDB4MTgsMHhjMCwKKzB4MDAsMHgwNCwweDEwLDB4YzAsMHgwMCwweDQ0LDB4MTAsMHgyMSwweDAwLDB4NjUsMHgxOCwweDIxLDB4MjcsMHg4NCwweDkwLDB4MDAsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0NCwweDEwLDB4MjEsMHgwMCwweDAzLDB4MTgsMHg4MCwweDhjLDB4NDUsMHgwMCwweDA4LAorMHgwMCwweDY0LDB4MTgsMHgyMSwweDhjLDB4NjQsMHgwMCwweDA4LDB4M2MsMHgwMiwweDgwLDB4MDAsMHgwMCwweGEyLDB4MzgsMHgyNCwKKzB4MTAsMHhlMCwweDAwLDB4MDgsMHgwMCwweDgyLDB4MTAsMHgyNCwweDEwLDB4NDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDE4LDB4MjEsCisweDEwLDB4ZTAsMHgwMCwweDAyLDB4MjQsMHgwMywweDAwLDB4MDEsMHgwMCwweDg1LDB4MTgsMHgyYiwweDA4LDB4MDAsMHgxMSwweGI4LAorMHhhMiwweDIzLDB4MDAsMHgxNywweDEwLDB4NDAsMHhmZiwweGZkLDB4MDAsMHg4NSwweDE4LDB4MmIsMHgwOCwweDAwLDB4MTEsMHhkYywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDA1LDB4MDAsMHgyNCwweGYwLDB4ZTUsMHgwMCwweDA2LDB4MDAsMHgwMCwweDI4LDB4MTIsCisweDI3LDB4ODIsMHg5MCwweDAwLDB4MDAsMHhhMiwweDI4LDB4MjEsMHgwYywweDAwLDB4MDEsMHg0OSwweDAwLDB4MDAsMHgyMCwweDIxLAorMHg5NiwweDQ3LDB4MDAsMHgwYywweDA4LDB4MDAsMHgxMSwweDlhLDB4MDAsMHgwNywweDJjLDB4MDAsMHgyNywweDgzLDB4OTAsMHgxMCwKKzB4MjcsMHg4MiwweDkwLDB4MTgsMHgwMCwweGEyLDB4MTAsMHgyMSwweDAwLDB4YTMsMHgxOCwweDIxLDB4OTAsMHg0NCwweDAwLDB4MDAsCisweDkwLDB4NjUsMHgwMCwweDA1LDB4OTMsMHg4MiwweDgwLDB4MTAsMHgyNCwweDA3LDB4MDAsMHgwMSwweDBjLDB4MDAsMHgyMSwweDlhLAorMHhhZiwweGEyLDB4MDAsMHgxMCwweDk2LDB4NDcsMHgwMCwweDBjLDB4MDgsMHgwMCwweDExLDB4OGQsMHgwMCwweDA3LDB4MWMsMHgwMCwKKzB4MTAsMHhhMiwweDAwLDB4MDksMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHgwMCwweDA1LDB4MjQsMHgwMiwweDAwLDB4MDMsCisweDE0LDB4YTIsMHhmZiwweDdkLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTEsMHg3ZSwweGEyLDB4NDAsMHgwMCwweDA3LAorMHgwOCwweDAwLDB4MTEsMHg3ZSwweGEyLDB4NDAsMHgwMCwweDA2LDB4MDgsMHgwMCwweDExLDB4N2UsMHhhMiwweDQwLDB4MDAsMHgwNSwKKzB4MTQsMHg0MCwweGZmLDB4NzEsMHgzYywweDA0LDB4YjAsMHgwNSwweDM0LDB4ODQsMHgwMiwweDI5LDB4OTAsMHg4MywweDAwLDB4MDAsCisweDMwLDB4YTUsMHgwMCwweDBmLDB4MjQsMHgwMiwweDAwLDB4ODAsMHgwOCwweDAwLDB4MTEsMHg3NSwweDAwLDB4YTIsMHgxMCwweDA3LAorMHgxNCwweDQwLDB4ZmUsMHhjMywweDNjLDB4MDQsMHhiMCwweDA1LDB4MzQsMHg4NCwweDAyLDB4MjksMHg5MCwweDgzLDB4MDAsMHgwMCwKKzB4MzAsMHhhNSwweDAwLDB4MGYsMHgyNCwweDAyLDB4MDAsMHg4MCwweDA4LDB4MDAsMHgxMCwweGQwLDB4MDAsMHhhMiwweDEwLDB4MDcsCisweDg0LDB4ODMsMHgwMCwweDBjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4MTAsMHhjMCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDI3LDB4ODMsMHg5MCwweDA0LDB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDQ3LDB4MDAsMHgxOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4YywweGU2LDB4MDAsMHgwOCwweDBjLDB4MDAsMHgwZiwweDE5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAyLDB4NDAsMHgyMCwweDIxLDB4MDAsMHgwMCwweDI4LDB4MjEsMHgwMCwweDAwLDB4MzAsMHgyMSwweDAwLDB4MDAsMHgzOCwweDIxLAorMHgwYywweDAwLDB4MWMsMHg2OCwweGFmLDB4YTIsMHgwMCwweDEwLDB4MDAsMHgwMiwweDFlLDB4MDAsMHgxNCwweDYwLDB4ZmUsMHg2YiwKKzB4YTIsMHgyMiwweDAwLDB4MTIsMHg5MiwweDQzLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg2MCwweDAwLDB4NDAsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4YTIsMHg0MCwweDAwLDB4MDQsMHg5MiwweDI4LDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxNSwweDAwLDB4MDAsMHgxOSwweDI0LDB4MDIsMHgwMCwweDAxLDB4OTIsMHgyNywweDAwLDB4MGEsMHhhMiwweDIyLDB4MDAsMHgxNywKKzB4OTIsMHgyMiwweDAwLDB4MTcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDk2LDB4MjIsMHgwMCwweDA2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhNiwweDIyLDB4MDAsMHgxNCwweDkyLDB4MjIsMHgwMCwweDE2LAorMHgzMCwweGUzLDB4MDAsMHhmZiwweDMwLDB4NDIsMHgwMCwweGMwLDB4MTAsMHg2MCwweDAwLDB4MDMsMHhhMiwweDIyLDB4MDAsMHgxNiwKKzB4MzQsMHg0MiwweDAwLDB4MDEsMHhhMiwweDIyLDB4MDAsMHgxNiwweDExLDB4MDAsMHhmZSwweDUwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDkyLDB4MjIsMHgwMCwweDE2LDB4MDgsMHgwMCwweDEwLDB4OTYsMHgzNCwweDQyLDB4MDAsMHgwMiwweDk2LDB4MjIsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MTIsMHgzZiwweGE2LDB4MjIsMHgwMCwweDE0LDB4OTIsMHgyNywweDAwLDB4MGEsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTQsMHhlMCwweDAwLDB4MDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxMiwweDM4LDB4YTIsMHgyMCwweDAwLDB4MTcsCisweDk2LDB4MjQsMHgwMCwweDAwLDB4OTYsMHgyNSwweDAwLDB4MDYsMHgyNywweDg2LDB4OTAsMHgwMCwweDAwLDB4MDQsMHgxOCwweGMwLAorMHgwMCwweDY0LDB4MTgsMHgyMSwweDAwLDB4MDUsMHgxMCwweGMwLDB4MDAsMHg0NSwweDEwLDB4MjEsMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4MDAsMHg2NiwweDE4LDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDYsMHgxMCwweDIxLDB4OGMsMHg2NSwweDAwLDB4MDgsCisweDhjLDB4NDQsMHgwMCwweDA4LDB4M2MsMHgwMywweDgwLDB4MDAsMHgwMCwweGEzLDB4MzAsMHgyNCwweDEwLDB4YzAsMHgwMCwweDA4LAorMHgwMCwweDgzLDB4MTAsMHgyNCwweDEwLDB4NDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDE4LDB4MjEsMHgxMCwweGMwLDB4MDAsMHgwMiwKKzB4MjQsMHgwMywweDAwLDB4MDEsMHgwMCwweDg1LDB4MTgsMHgyYiwweDA4LDB4MDAsMHgxMiwweDM4LDB4YTIsMHgyMywweDAwLDB4MTcsCisweDEwLDB4NDAsMHhmZiwweGZkLDB4MDAsMHg4NSwweDE4LDB4MmIsMHgwOCwweDAwLDB4MTIsMHg2NywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMCwweDYyLDB4MDAsMHgwOSwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHg2MiwweDAwLDB4MDUsMHgyNCwweDAyLDB4MDAsMHgwMywKKzB4MTQsMHg2MiwweGZmLDB4YmQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxMiwweDMyLDB4YTIsMHg0MCwweDAwLDB4MDcsCisweDA4LDB4MDAsMHgxMiwweDMyLDB4YTIsMHg0MCwweDAwLDB4MDYsMHgwOCwweDAwLDB4MTIsMHgzMiwweGEyLDB4NDAsMHgwMCwweDA1LAorMHgzYywweDAyLDB4ODAsMHgwMCwweDAwLDB4ODIsMHgzMCwweDI0LDB4MTAsMHhjMCwweDAwLDB4MDgsMHgwMCwweGEyLDB4MTgsMHgyNCwKKzB4MTAsMHg2MCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MTAsMHgyMSwweDEwLDB4YzAsMHgwMCwweDAyLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDAwLDB4YTQsMHgxMCwweDJiLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NjAsMHhmZiwweGZkLAorMHgwMCwweGE0LDB4MTAsMHgyYiwweDA4LDB4MDAsMHgxMiwweDgyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDgyLDB4ZmYsMHhmZiwKKzB4MDAsMHgwMiwweDE4LDB4YzAsMHgwMCwweDYyLDB4MTgsMHgyMSwweDI3LDB4ODQsMHg5MCwweDEwLDB4MDAsMHgwMywweDE4LDB4ODAsCisweDAwLDB4NjQsMHgxOCwweDIxLDB4ODAsMHg2NiwweDAwLDB4MDYsMHgwMCwweDAyLDB4MTIsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAwLAorMHgwMCwweDQ2LDB4MTAsMHgyMSwweDAwLDB4NDUsMHgxMCwweDIxLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDQzLDB4MTAsMHgyMSwKKzB4MjcsMHhiZCwweGZmLDB4ZTAsMHgzMCwweDgyLDB4MDAsMHg3YywweDMwLDB4ODQsMHhmZiwweDAwLDB4YWYsMHhiZiwweDAwLDB4MWMsCisweGFmLDB4YjIsMHgwMCwweDE4LDB4YWYsMHhiMSwweDAwLDB4MTQsMHhhZiwweGIwLDB4MDAsMHgxMCwweDE0LDB4NDAsMHgwMCwweDQxLAorMHgwMCwweDA0LDB4MjIsMHgwMywweDI0LDB4MDIsMHgwMCwweDA0LDB4M2MsMHgxMCwweGIwLDB4MDMsMHg4ZSwweDEwLDB4MDAsMHgwMCwKKzB4MTAsMHg4MiwweDAwLDB4MzIsMHgyNCwweDAyLDB4MDAsMHgwOCwweDEwLDB4ODIsMHgwMCwweDAzLDB4MzIsMHgwMiwweDAwLDB4MjAsCisweDA4LDB4MDAsMHgxMiwweGE4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgxNywweDNjLDB4MDIsMHhiMCwweDA2LAorMHgzNCwweDQyLDB4ODAsMHgyNCwweDhjLDB4NDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDY3LDB4MDAsMHhmZiwKKzB4MTAsMHhlMCwweDAwLDB4MjMsMHgwMCwweDAwLDB4ODgsMHgyMSwweDhmLDB4ODUsMHg4ZiwweGUwLDB4MDAsMHg0MCwweDMwLDB4MjEsCisweDk0LDB4YTIsMHgwMCwweDA4LDB4OGMsMHhjMywweDAwLDB4MDAsMHgyNiwweDMxLDB4MDAsMHgwMSwweDI0LDB4NDIsMHgwMCwweDAyLAorMHgzMCwweDQyLDB4MDEsMHhmZiwweDM0LDB4NjMsMHgwMSwweDAwLDB4MDIsMHgyNywweDIwLDB4MmEsMHhhNCwweGEyLDB4MDAsMHgwOCwKKzB4MTQsMHg4MCwweGZmLDB4ZjcsMHhhYywweGMzLDB4MDAsMHgwMCwweDg0LDB4YTMsMHgwMCwweDA4LDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDM0LDB4NDIsMHgwMCwweDMwLDB4YWMsMHg0MywweDAwLDB4MDAsMHgyNywweDkyLDB4YjQsMHgwMCwweDI0LDB4MTEsMHgwMCwweDEyLAorMHg4ZSwweDQ0LDB4MDAsMHgwMCwweDI2LDB4MzEsMHhmZiwweGZmLDB4OTAsMHg4MiwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHg0MCwweDAwLDB4MDMsMHgyNiwweDUyLDB4MDAsMHgwNCwweDBjLDB4MDAsMHgxOCwweGQwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA2LDB4MjEsMHhmZiwweGY3LDB4MjQsMHgwMiwweGZmLDB4ZGYsMHgwMiwweDAyLDB4ODAsMHgyNCwweDNjLDB4MDEsMHhiMCwweDAzLAorMHgwYywweDAwLDB4MTMsMHgxYywweGFjLDB4MzAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDEyLDB4YTgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGYsMHg4NSwweDhmLDB4ZTAsMHgwOCwweDAwLDB4MTIsMHhiZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweGZmLDB4OTUsCisweDNjLDB4MDMsMHhiMCwweDAzLDB4MDIsMHgwMiwweDgwLDB4MjQsMHgzNCwweDYzLDB4MDAsMHgzMCwweDNjLDB4MDEsMHhiMCwweDAzLAorMHhhYywweDMwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgxMiwweGU1LDB4YWMsMHg2MCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTIsMHhhOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMywweDM0LDB4NDIsMHgwMCwweDUwLDB4MDgsMHgwMCwweDEyLDB4YTgsCisweGFjLDB4NDYsMHgwMCwweDAwLDB4M2MsMHgwYSwweDgwLDB4MDAsMHgyNSwweDRhLDB4NGIsMHg5NCwweDNjLDB4MGIsMHhiMCwweDAzLAorMHhhZCwweDZhLDB4MDAsMHgyMCwweDNjLDB4MDgsMHg4MCwweDAxLDB4MjUsMHgwOCwweDAwLDB4MDAsMHgzYywweDA5LDB4ODAsMHgwMSwKKzB4MjUsMHgyOSwweDAzLDB4NTAsMHgxMSwweDA5LDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwYSwweDgwLDB4MDAsCisweDI1LDB4NGEsMHg0YiwweGJjLDB4M2MsMHgwYiwweGIwLDB4MDMsMHhhZCwweDZhLDB4MDAsMHgyMCwweDNjLDB4MDgsMHhiMCwweDA2LAorMHgzNSwweDA4LDB4ODAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZCwweDA5LDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMSwweDI5LDB4MDAsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMSwweDAwLDB4MDEsCisweDE1LDB4MjEsMHhmZiwweGYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDBhLDB4ODAsMHgwMCwweDI1LDB4NGEsMHg0YiwweGY4LAorMHgzYywweDBiLDB4YjAsMHgwMywweGFkLDB4NmEsMHgwMCwweDIwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHg4YywweDQzLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzNCwweDYzLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4YWMsMHg0MywweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwYSwweDgwLDB4MDAsMHgyNSwweDRhLDB4NGMsMHgyNCwweDNjLDB4MGIsMHhiMCwweDAzLAorMHhhZCwweDZhLDB4MDAsMHgyMCwweDNjLDB4MDIsMHg4MCwweDAxLDB4MjQsMHg0MiwweDAwLDB4MDAsMHgzYywweDAzLDB4ODAsMHgwMSwKKzB4MjQsMHg2MywweDAzLDB4NTAsMHgzYywweDA0LDB4YjAsMHgwMCwweDhjLDB4ODUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweGFjLDB4NDUsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4MDQsMHgyNCwweDg0LDB4MDAsMHgwNCwweDAwLDB4NDMsMHgwOCwweDJhLAorMHgxNCwweDIwLDB4ZmYsMHhmOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDEzLDB4MWMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4M2MsMHgwYSwweDgwLDB4MDAsMHgyNSwweDRhLDB4NGMsMHg3MCwweDNjLDB4MGIsMHhiMCwweDAzLDB4YWQsMHg2YSwweDAwLDB4MjAsCisweDNjLDB4MDIsMHg4MCwweDAxLDB4MjQsMHg0MiwweDAzLDB4NTAsMHgzYywweDAzLDB4ODAsMHgwMSwweDI0LDB4NjMsMHgzZiwweDI0LAorMHhhYywweDQwLDB4MDAsMHgwMCwweGFjLDB4NDAsMHgwMCwweDA0LDB4YWMsMHg0MCwweDAwLDB4MDgsMHhhYywweDQwLDB4MDAsMHgwYywKKzB4MjQsMHg0MiwweDAwLDB4MTAsMHgwMCwweDQzLDB4MDgsMHgyYSwweDE0LDB4MjAsMHhmZiwweGY5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDNjLDB4MGEsMHg4MCwweDAwLDB4MjUsMHg0YSwweDRjLDB4YjAsMHgzYywweDBiLDB4YjAsMHgwMywweGFkLDB4NmEsMHgwMCwweDIwLAorMHgzYywweDFjLDB4ODAsMHgwMSwweDI3LDB4OWMsMHg3ZiwweGYwLDB4MjcsMHg5ZCwweDhiLDB4ZTAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjcsMHg5ZCwweDhmLDB4YzgsMHgzYywweDBhLDB4ODAsMHgwMCwweDI1LDB4NGEsMHg0YywweGQ0LDB4M2MsMHgwYiwweGIwLDB4MDMsCisweGFkLDB4NmEsMHgwMCwweDIwLDB4NDAsMHg4MCwweDY4LDB4MDAsMHg0MCwweDA4LDB4NjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzNSwweDA4LDB4ZmYsMHgwMSwweDQwLDB4ODgsMHg2MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwYywweDAwLDB4MTUsMHg2MiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDg0LDB4ZjgsMHgwMCwweDMwLDB4ODcsMHgwMCwweDAzLDB4MDAsMHgwNCwweDMwLDB4NDAsCisweDAwLDB4YzcsMHgyMCwweDIzLDB4M2MsMHgwMiwweGIwLDB4MGEsMHgyNywweGJkLDB4ZmYsMHhlMCwweDI0LDB4MDMsMHhmZiwweGZmLAorMHgwMCwweDgyLDB4MjAsMHgyMSwweGFmLDB4YjEsMHgwMCwweDE0LDB4YWMsMHg4MywweDEwLDB4MDAsMHhhZiwweGJmLDB4MDAsMHgxOCwKKzB4YWYsMHhiMCwweDAwLDB4MTAsMHgwMCwweGEwLDB4ODgsMHgyMSwweDI0LDB4MDMsMHgwMCwweDAxLDB4OGMsMHg4MiwweDEwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MywweGZmLDB4ZmQsMHgwMCwweGM3LDB4MTAsMHgyMywweDNjLDB4MDMsMHhiMCwweDBhLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDhjLDB4NTAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDEzLDB4OTksMHgwMiwweDIwLDB4MjAsMHgyMSwKKzB4MDIsMHgxMSwweDgwLDB4MjQsMHgwMCwweDUwLDB4ODAsMHgwNiwweDAyLDB4MDAsMHgxMCwweDIxLDB4OGYsMHhiZiwweDAwLDB4MTgsCisweDdiLDB4YjAsMHgwMCwweGJjLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgyMCwweDI3LDB4YmQsMHhmZiwweGQ4LAorMHhhZiwweGIyLDB4MDAsMHgxOCwweDAwLDB4YTAsMHg5MCwweDIxLDB4MjQsMHgwNSwweGZmLDB4ZmYsMHhhZiwweGIzLDB4MDAsMHgxYywKKzB4YWYsMHhiZiwweDAwLDB4MjAsMHhhZiwweGIxLDB4MDAsMHgxNCwweGFmLDB4YjAsMHgwMCwweDEwLDB4MDAsMHhjMCwweDk4LDB4MjEsCisweDEyLDB4NDUsMHgwMCwweDIzLDB4MjQsMHg4NCwweGY4LDB4MDAsMHgzMCwweDgzLDB4MDAsMHgwMywweDAwLDB4MDQsMHgxMCwweDQwLAorMHgwMCwweDQwLDB4ODgsMHgyMSwweDAwLDB4NjAsMHgyMCwweDIxLDB4MDAsMHg0MywweDEwLDB4MjMsMHgzYywweDAzLDB4YjAsMHgwYSwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHhhYywweDQ1LDB4MTAsMHgwMCwweDAwLDB4NDAsMHgxOCwweDIxLDB4MjQsMHgwNSwweDAwLDB4MDEsCisweDhjLDB4NjIsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQ1LDB4ZmYsMHhmZCwweDNjLDB4MDIsMHhiMCwweDBhLAorMHgwMiwweDI0LDB4ODgsMHgyMywweDAyLDB4MjIsMHg4OCwweDIxLDB4OGUsMHgzMCwweDAwLDB4MDAsMHgwYywweDAwLDB4MTMsMHg5OSwKKzB4MDIsMHg0MCwweDIwLDB4MjEsMHgwMCwweDEyLDB4MTgsMHgyNywweDAyLDB4MDMsMHg4MCwweDI0LDB4MDAsMHg1MywweDEwLDB4MDQsCisweDAyLDB4MDIsMHg4MCwweDI1LDB4YWUsMHgzMCwweDAwLDB4MDAsMHgyNCwweDAzLDB4MDAsMHgwMSwweDhlLDB4MjIsMHgxMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDMsMHhmZiwweGZkLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweGJmLDB4MDAsMHgyMCwKKzB4N2IsMHhiMiwweDAwLDB4ZmMsMHg3YiwweGIwLDB4MDAsMHhiYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MjgsCisweDMwLDB4ODIsMHgwMCwweDAzLDB4MDAsMHgwNCwweDE4LDB4NDAsMHgwMCwweDYyLDB4MTgsMHgyMywweDNjLDB4MDQsMHhiMCwweDBhLAorMHgwMCwweDY0LDB4MTgsMHgyMSwweGFjLDB4NjYsMHgwMCwweDAwLDB4MjQsMHgwNCwweDAwLDB4MDEsMHg4YywweDYyLDB4MTAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQ0LDB4ZmYsMHhmZCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDEzLDB4ODcsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MjEsMHgwMCwweDY0LDB4MTAsMHgwNiwweDMwLDB4NDIsMHgwMCwweDAxLAorMHgxNCwweDQwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg2MywweDAwLDB4MDEsMHgyYywweDYyLDB4MDAsMHgyMCwKKzB4MTQsMHg0MCwweGZmLDB4ZjksMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHg2MCwweDEwLDB4MjEsCisweDI3LDB4YmQsMHhmZiwweGUwLDB4M2MsMHgwMywweGIwLDB4MDUsMHhhZiwweGIyLDB4MDAsMHgxOCwweGFmLDB4YjEsMHgwMCwweDE0LAorMHhhZiwweGIwLDB4MDAsMHgxMCwweGFmLDB4YmYsMHgwMCwweDFjLDB4MDAsMHg4MCwweDkwLDB4MjEsMHgwMCwweGEwLDB4ODAsMHgyMSwKKzB4MDAsMHhjMCwweDg4LDB4MjEsMHgzNCwweDYzLDB4MDIsMHgyZSwweDkwLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4NDIsMHgwMCwweDAxLDB4MTQsMHg0MCwweGZmLDB4ZmMsMHgyNCwweDA0LDB4MDgsMHgyNCwweDNjLDB4MDUsMHgwMCwweGMwLAorMHgwYywweDAwLDB4MTMsMHg1ZiwweDI0LDB4MDYsMHgwMCwweDAzLDB4MjQsMHgwNCwweDA4LDB4MzQsMHgzYywweDA1LDB4MDAsMHhjMCwKKzB4MGMsMHgwMCwweDEzLDB4NWYsMHgyNCwweDA2LDB4MDAsMHgwMywweDNjLDB4MDIsMHhjMCwweDAwLDB4MDAsMHgxMCwweDFjLDB4MDAsCisweDM0LDB4NDIsMHgwNCwweDAwLDB4M2MsMHgwNCwweGIwLDB4MDUsMHgzYywweDA1LDB4YjAsMHgwNSwweDI0LDB4NjMsMHgxNiwweDA5LAorMHgwMiwweDIyLDB4MTAsMHgyMSwweDM0LDB4ODQsMHgwNCwweDIwLDB4MzQsMHhhNSwweDA0LDB4MjQsMHgzYywweDA2LDB4YjAsMHgwNSwKKzB4YWMsMHg4MywweDAwLDB4MDAsMHgyNCwweDA3LDB4MDAsMHgwMSwweGFjLDB4YTIsMHgwMCwweDAwLDB4MzQsMHhjNiwweDAyLDB4MjgsCisweDI0LDB4MDIsMHgwMCwweDIwLDB4YWUsMHg0NywweDAwLDB4M2MsMHgyNCwweDA0LDB4MDgsMHgyNCwweGEwLDB4YzIsMHgwMCwweDAwLAorMHgzYywweDA1LDB4MDAsMHhjMCwweGEyLDB4NDcsMHgwMCwweDExLDB4MGMsMHgwMCwweDEzLDB4NWYsMHgyNCwweDA2LDB4MDAsMHgwMSwKKzB4MjQsMHgwNCwweDA4LDB4MzQsMHgzYywweDA1LDB4MDAsMHhjMCwweDBjLDB4MDAsMHgxMywweDVmLDB4MjQsMHgwNiwweDAwLDB4MDEsCisweDhmLDB4YmYsMHgwMCwweDFjLDB4OGYsMHhiMiwweDAwLDB4MTgsMHg3YiwweGIwLDB4MDAsMHhiYywweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgyMCwweDI0LDB4MDIsMHgwMCwweDA2LDB4YWMsMHg4MiwweDAwLDB4MGMsMHhhMCwweDgwLDB4MDAsMHg1MCwKKzB4YWMsMHg4MCwweDAwLDB4MDAsMHhhYywweDgwLDB4MDAsMHgwNCwweGFjLDB4ODAsMHgwMCwweDA4LDB4YWMsMHg4MCwweDAwLDB4MTQsCisweGFjLDB4ODAsMHgwMCwweDE4LDB4YWMsMHg4MCwweDAwLDB4MWMsMHhhNCwweDgwLDB4MDAsMHgyMCwweGFjLDB4ODAsMHgwMCwweDI0LAorMHhhYywweDgwLDB4MDAsMHgyOCwweGFjLDB4ODAsMHgwMCwweDJjLDB4YTAsMHg4MCwweDAwLDB4MzAsMHhhMCwweDgwLDB4MDAsMHgzMSwKKzB4YWMsMHg4MCwweDAwLDB4MzQsMHhhYywweDgwLDB4MDAsMHgzOCwweGEwLDB4ODAsMHgwMCwweDNjLDB4YWMsMHg4MiwweDAwLDB4MTAsCisweGEwLDB4ODAsMHgwMCwweDQ0LDB4YWMsMHg4MCwweDAwLDB4NDgsMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4ODAsMHgwMCwweDRjLAorMHgzYywweDA0LDB4YjAsMHgwNiwweDM0LDB4ODQsMHg4MCwweDAwLDB4OGMsMHg4MywweDAwLDB4MDAsMHgzYywweDAyLDB4MTIsMHgwMCwKKzB4M2MsMHgwNSwweGIwLDB4MDMsMHgwMCwweDYyLDB4MTgsMHgyNSwweDM0LDB4YTUsMHgwMCwweDhiLDB4MjQsMHgwMiwweGZmLDB4ODAsCisweGFjLDB4ODMsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhMCwweGEyLDB4MDAsMHgwMCwweDNjLDB4MDQsMHhiMCwweDAzLAorMHgzNCwweDg0LDB4MDAsMHgwYiwweDI0LDB4MDIsMHgwMCwweDIyLDB4M2MsMHgwNSwweGIwLDB4MDEsMHgzYywweDA2LDB4NDUsMHg2NywKKzB4M2MsMHgwYSwweGIwLDB4MDksMHhhMCwweDgyLDB4MDAsMHgwMCwweDM0LDB4YTUsMHgwMCwweDA0LDB4MzQsMHhjNiwweDg5LDB4YWEsCisweDM1LDB4NGEsMHgwMCwweDA0LDB4MjQsMHgwMiwweDAxLDB4MjMsMHgzYywweDBiLDB4YjAsMHgwOSwweDNjLDB4MDcsMHgwMSwweDIzLAorMHgzYywweDBjLDB4YjAsMHgwOSwweDNjLDB4MDEsMHhiMCwweDAxLDB4YWMsMHgyMCwweDAwLDB4MDAsMHgyNywweGJkLDB4ZmYsMHhlMCwKKzB4YWMsMHhhMCwweDAwLDB4MDAsMHgzNSwweDZiLDB4MDAsMHgwOCwweDNjLDB4MDEsMHhiMCwweDA5LDB4YWMsMHgyNiwweDAwLDB4MDAsCisweDM0LDB4ZTcsMHg0NSwweDY2LDB4YTUsMHg0MiwweDAwLDB4MDAsMHgzNSwweDhjLDB4MDAsMHgwYywweDI0LDB4MDIsMHhjZCwweGVmLAorMHgzYywweDBkLDB4YjAsMHgwOSwweDNjLDB4MDgsMHhjZCwweGVmLDB4M2MsMHgwZSwweGIwLDB4MDksMHhhZCwweDY3LDB4MDAsMHgwMCwKKzB4YWYsMHhiNywweDAwLDB4MWMsMHhhNSwweDgyLDB4MDAsMHgwMCwweGFmLDB4YjYsMHgwMCwweDE4LDB4YWYsMHhiNSwweDAwLDB4MTQsCisweGFmLDB4YjQsMHgwMCwweDEwLDB4YWYsMHhiMywweDAwLDB4MGMsMHhhZiwweGIyLDB4MDAsMHgwOCwweGFmLDB4YjEsMHgwMCwweDA0LAorMHhhZiwweGIwLDB4MDAsMHgwMCwweDM1LDB4YWQsMHgwMCwweDEwLDB4MzUsMHgwOCwweDAxLDB4MjIsMHgzNSwweGNlLDB4MDAsMHgxNCwKKzB4MjQsMHgwMiwweDg5LDB4YWIsMHgzYywweDBmLDB4YjAsMHgwOSwweDNjLDB4MDksMHg4OSwweGFiLDB4M2MsMHgxMCwweGIwLDB4MDksCisweDNjLDB4MTEsMHhiMCwweDA5LDB4M2MsMHgxMiwweGIwLDB4MDksMHgzYywweDEzLDB4YjAsMHgwOSwweDNjLDB4MTQsMHhiMCwweDA5LAorMHgzYywweDE1LDB4YjAsMHgwOSwweDNjLDB4MTYsMHhiMCwweDA5LDB4M2MsMHgxNywweGIwLDB4MDksMHhhZCwweGE4LDB4MDAsMHgwMCwKKzB4MjQsMHgwMywweGZmLDB4ZmYsMHhhNSwweGMyLDB4MDAsMHgwMCwweDM1LDB4ZWYsMHgwMCwweDE4LDB4MzUsMHgyOSwweGNkLDB4ZWUsCisweDM2LDB4MTAsMHgwMCwweDFjLDB4MzYsMHgzMSwweDAwLDB4MjAsMHgzNiwweDUyLDB4MDAsMHgyNCwweDM2LDB4NzMsMHgwMCwweDI4LAorMHgzNiwweDk0LDB4MDAsMHgyYywweDM2LDB4YjUsMHgwMCwweDMwLDB4MzYsMHhkNiwweDAwLDB4MzQsMHgzNiwweGY3LDB4MDAsMHgzOCwKKzB4MjQsMHgwMiwweDQ1LDB4NjcsMHhhZCwweGU5LDB4MDAsMHgwMCwweGE2LDB4MDIsMHgwMCwweDAwLDB4YWUsMHgyMywweDAwLDB4MDAsCisweDhmLDB4YjAsMHgwMCwweDAwLDB4YTYsMHg0MywweDAwLDB4MDAsMHg4ZiwweGIxLDB4MDAsMHgwNCwweGFlLDB4NjMsMHgwMCwweDAwLAorMHg4ZiwweGIyLDB4MDAsMHgwOCwweGE2LDB4ODMsMHgwMCwweDAwLDB4OGYsMHhiMywweDAwLDB4MGMsMHhhZSwweGEzLDB4MDAsMHgwMCwKKzB4OGYsMHhiNCwweDAwLDB4MTAsMHhhNiwweGMzLDB4MDAsMHgwMCwweDhmLDB4YjUsMHgwMCwweDE0LDB4YWUsMHhlMywweDAwLDB4MDAsCisweDdiLDB4YjYsMHgwMCwweGZjLDB4M2MsMHgxOCwweGIwLDB4MDksMHgzNywweDE4LDB4MDAsMHgzYywweGE3LDB4MDMsMHgwMCwweDAwLAorMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDIwLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwKKzB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4NTEsMHg0OCwweGFjLDB4NjIsMHgwMCwweDAwLDB4OGMsMHg4MywweDAwLDB4MzQsCisweDM0LDB4MDIsMHhmZiwweGZmLDB4MDAsMHg0MywweDEwLDB4MmEsMHgxNCwweDQwLDB4MDEsMHgwNCwweDAwLDB4ODAsMHgyOCwweDIxLAorMHg4YywweDg2LDB4MDAsMHgwOCwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTAsMHhjMiwweDAwLDB4ZjcsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGMsMHhhMiwweDAwLDB4MmMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDRmLDB4MjQsMHgwMiwweDAwLDB4MDYsCisweDNjLDB4MDMsMHhiMCwweDA1LDB4MzQsMHg2MywweDA0LDB4NTAsMHg5MCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweDQyLDB4MDAsMHhmZiwweDE0LDB4NDAsMHgwMCwweGRkLDB4YWMsMHhhMiwweDAwLDB4MmMsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MTAsMHhjMiwweDAwLDB4ZGMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhjMiwweDAwLDB4Y2EsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHhhNywweDAwLDB4MDQsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4ZTIsMHgwMCwweGMwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4YTIsMHgwMCwweDE0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgwOSwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHgzYywweDAzLDB4YjAsMHgwOSwweDM0LDB4NjMsMHgwMSwweDYwLDB4OTAsMHg2MiwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZmYsMHgxMCwweDQwLDB4MDAsMHgwNSwweGFjLDB4YTIsMHgwMCwweDE0LAorMHgyNCwweDAyLDB4MDAsMHgwMSwweGFjLDB4YTIsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweGEwLDB4MDAsMHgxNCwKKzB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDAsMHhkMCwweDhjLDB4NDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA0LDB4NjEsMHgwMCwweDE5LDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzYywweDAzLDB4YjAsMHgwNSwweDM0LDB4NjMsMHgwMiwweDJlLAorMHg5MCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4MDEsMHgxNCwweDQwLDB4MDAsMHgxMiwKKzB4M2MsMHgwMiwweGIwLDB4MDMsMHgzYywweDAyLDB4YjAsMHgwNSwweDM0LDB4NDIsMHgwMiwweDQyLDB4OTAsMHg0MywweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg2MCwweDAwLDB4MGMsMHgzYywweDAyLDB4YjAsMHgwMywweDgwLDB4YTIsMHgwMCwweDUwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDA4LDB4M2MsMHgwMiwweGIwLDB4MDMsMHgxNCwweGMwLDB4MDAsMHgwNywKKzB4MzQsMHg0MiwweDAwLDB4M2YsMHgyNCwweDAyLDB4MDAsMHgwZSwweDI0LDB4MDMsMHgwMCwweDAxLDB4YWMsMHhhMiwweDAwLDB4MDAsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4YTAsMHhhMywweDAwLDB4NTAsMHgzNCwweDQyLDB4MDAsMHgzZiwweDkwLDB4NDQsMHgwMCwweDAwLAorMHgyNCwweDAzLDB4MDAsMHgwMSwweDEwLDB4NjQsMHgwMCwweDdmLDB4M2MsMHgwMywweGIwLDB4MDUsMHg4MCwweGEyLDB4MDAsMHgzMSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgwYSwweDNjLDB4MDIsMHhiMCwweDA2LDB4MzQsMHg0MiwweDgwLDB4MTgsCisweDhjLDB4NDMsMHgwMCwweDAwLDB4M2MsMHgwNCwweGYwLDB4MDAsMHgzYywweDAyLDB4ODAsMHgwMCwweDAwLDB4NjQsMHgxOCwweDI0LAorMHgxMCwweDYyLDB4MDAsMHgwMywweDI0LDB4MDIsMHgwMCwweDA5LDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweGEyLDB4MDAsMHgwMCwKKzB4OGMsMHhhMiwweDAwLDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4NDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4NjAsMHgwMCwweDA5LDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4YjAsMHgwNSwweDM0LDB4NDIsMHgwMiwweDJjLAorMHg4YywweDQzLDB4MDAsMHgwMCwweDNjLDB4MDQsMHgwMCwweDAyLDB4MDAsMHg2NCwweDE4LDB4MjQsMHgxNCwweDYwLDB4ZmYsMHhmMiwKKzB4MjQsMHgwMiwweDAwLDB4MTAsMHgzYywweDAzLDB4YjAsMHgwMywweDM0LDB4NjMsMHgwMiwweDAxLDB4OTAsMHg2MiwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ODAsMHgxMCwweDQwLDB4MDAsMHgwZSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4YywweGEzLDB4MDAsMHgwYywweDAwLDB4MDAsMHgwMCwweDAwLDB4YWMsMHhhMywweDAwLDB4MTAsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4OTAsMHg0MiwweDAyLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweDBmLDB4YWMsMHhhMiwweDAwLDB4MGMsCisweDkwLDB4YTMsMHgwMCwweDBmLDB4MjQsMHgwMiwweDAwLDB4MGQsMHgzYywweDAxLDB4YjAsMHgwMywweDA4LDB4MDAsMHgxNCwweGIyLAorMHhhMCwweDIzLDB4MDIsMHgwMSwweDNjLDB4MDIsMHhiMCwweDA5LDB4MzQsMHg0MiwweDAxLDB4ODAsMHg5MCwweDQ0LDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4MWUsMHgwMCwweDAwLDB4MDMsMHgxZSwweDAzLDB4MTAsMHg2MCwweDAwLDB4MTUsCisweGEwLDB4YTQsMHgwMCwweDQ0LDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweDYyLDB4MDAsMHgwYiwweDI0LDB4MDIsMHgwMCwweDAyLAorMHgxMCwweDYyLDB4MDAsMHgwMywweDI0LDB4MDMsMHgwMCwweDBkLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGMsMHhhMiwweDAwLDB4MGMsMHhhYywweGEzLDB4MDAsMHgwMCwweDI0LDB4MDMsMHgwMCwweDA0LDB4YWMsMHhhMiwweDAwLDB4MTAsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4YWMsMHhhMywweDAwLDB4MGMsMHgyNCwweDAyLDB4MDAsMHgwZCwweGFjLDB4YTIsMHgwMCwweDAwLAorMHgyNCwweDAzLDB4MDAsMHgwNCwweDI0LDB4MDIsMHgwMCwweDA2LDB4YWMsMHhhMywweDAwLDB4MTAsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4YWMsMHhhMiwweDAwLDB4MGMsMHg4YywweGEzLDB4MDAsMHgzOCwweDI0LDB4MDQsMHgwMCwweDAxLDB4MTAsMHg2NCwweDAwLDB4MmQsCisweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHg2MCwweDAwLDB4MTksMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NjIsMHgwMCwweDEwLAorMHgyNCwweDAyLDB4MDAsMHgwNCwweDEwLDB4NjIsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhYywweGEwLDB4MDAsMHgzOCwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweGEwLDB4MDAsMHgwMCwweDEwLDB4ZTQsMHgwMCwweDA3LDB4MjQsMHgwMiwweDAwLDB4MDMsCisweDgwLDB4YTIsMHgwMCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MTgsMHgwYiwweGFjLDB4YTMsMHgwMCwweDAwLAorMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4YTAsMHgwMCwweDM4LDB4MDgsMHgwMCwweDE1LDB4MDQsMHhhYywweGEyLDB4MDAsMHgwMCwKKzB4MTAsMHhlNCwweDAwLDB4MDIsMHgyNCwweDAyLDB4MDAsMHgwMywweDI0LDB4MDIsMHgwMCwweDBjLDB4YWMsMHhhMiwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDA0LDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhYywweGEyLDB4MDAsMHgzOCwweDEwLDB4ZTQsMHgwMCwweDBlLAorMHgzYywweDAzLDB4YjAsMHgwNiwweDM0LDB4NjMsMHg4MCwweDI0LDB4OGMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweDAwLDB4ZmYsMHgxMCwweDQwLDB4MDAsMHgwNiwweGFjLDB4YTIsMHgwMCwweDE4LDB4MjQsMHgwMiwweDAwLDB4MDIsCisweGFjLDB4YTIsMHgwMCwweDAwLDB4YWMsMHhhMCwweDAwLDB4MTgsMHgwOCwweDAwLDB4MTUsMHgwZCwweDI0LDB4MDIsMHgwMCwweDAxLAorMHgwOCwweDAwLDB4MTUsMHgxYSwweGFjLDB4YTAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDMsMHgwOCwweDAwLDB4MTUsMHgxYSwKKzB4YWMsMHhhMiwweDAwLDB4MDAsMHgyNCwweDAzLDB4MDAsMHgwYiwweGFjLDB4YTIsMHgwMCwweDM4LDB4MDMsMHhlMCwweDAwLDB4MDgsCisweGFjLDB4YTMsMHgwMCwweDAwLDB4MzQsMHg2MywweDAyLDB4MmUsMHg5MCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweDQyLDB4MDAsMHgwMSwweDE0LDB4NDAsMHhmZiwweDdkLDB4M2MsMHgwMiwweGIwLDB4MDUsMHgzNCwweDQyLDB4MDIsMHg0MiwKKzB4OTAsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NjAsMHhmZiwweDc4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4YzAsMHhmZiwweDgxLDB4MjQsMHgwMiwweDAwLDB4MGUsMHgwOCwweDAwLDB4MTQsMHhhNywweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4MCwweGEyLDB4MDAsMHgzMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweGZmLDB4M2UsMHgyNCwweDAyLDB4MDAsMHgwNCwKKzB4MDgsMHgwMCwweDE0LDB4YjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDg0LDB4YTIsMHgwMCwweDIwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4NDAsMHhmZiwweDc1LDB4MjQsMHgwMiwweDAwLDB4MDYsMHgzYywweDAyLDB4YjAsMHgwNSwweDM0LDB4NDIsMHgwMiwweDJlLAorMHg5MCwweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg2MywweDAwLDB4MDEsMHgzMCwweDYzLDB4MDAsMHhmZiwKKzB4MDAsMHg2MCwweDEwLDB4MjEsMHgxNCwweDQwLDB4ZmYsMHgyYiwweGE0LDB4YTMsMHgwMCwweDIwLDB4MDgsMHgwMCwweDE0LDB4YjIsCisweDI0LDB4MDIsMHgwMCwweDA2LDB4OGMsMHhhMiwweDAwLDB4MWMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4NDAsMHhmZiwweDY2LAorMHgyNCwweDAyLDB4MDAsMHgwNSwweDNjLDB4MDMsMHhiMCwweDA1LDB4MzQsMHg2MywweDAyLDB4MmMsMHg4YywweDYyLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHhmZiwweDEwLDB4NDAsMHhmZiwweDFiLDB4YWMsMHhhMiwweDAwLDB4MWMsCisweDA4LDB4MDAsMHgxNCwweGIyLDB4MjQsMHgwMiwweDAwLDB4MDUsMHgzYywweDAyLDB4YjAsMHgwNSwweDhjLDB4NDIsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxNywweDQyLDB4MzAsMHg0MiwweDAwLDB4MDEsMHgxNCwweDQwLDB4ZmYsMHg1NiwKKzB4MjQsMHgwMiwweDAwLDB4MDYsMHgwOCwweDAwLDB4MTQsMHg2MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MGEsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4YWMsMHg4MiwweDAwLDB4MDAsMHgyNywweGJkLDB4ZmYsMHhkOCwweGFmLDB4YjAsMHgwMCwweDEwLAorMHgyNywweDkwLDB4ODYsMHg1OCwweGFmLDB4YmYsMHgwMCwweDIwLDB4YWYsMHhiMywweDAwLDB4MWMsMHhhZiwweGIyLDB4MDAsMHgxOCwKKzB4MGMsMHgwMCwweDI5LDB4ZDUsMHhhZiwweGIxLDB4MDAsMHgxNCwweGFmLDB4OTAsMHg4ZiwweGUwLDB4NDgsMHgwMiwweDAwLDB4MDAsCisweDBjLDB4MDAsMHgxMywweGYwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwYywweDAwLDB4MTgsMHgxZiwweDAyLDB4MDAsMHgyMCwweDIxLAorMHgzYywweDAyLDB4YjAsMHgwMywweDM0LDB4NDIsMHgwMCwweDNhLDB4OTQsMHg0MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4YTMsMHg4MywweDhmLDB4ZTQsMHgwYywweDAwLDB4MDAsMHgzNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDEzLDB4ZmIsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg4NCwweDg0LDB4OTgsMHgwYywweDAwLDB4MjcsMHg1OSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5MywweDg0LDB4ODAsMHgxMCwweDBjLDB4MDAsMHgyMSwweDNmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg0LDB4ODksMHgxOCwKKzB4MGMsMHgwMCwweDA2LDB4ZTUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgwMSwweDM5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI3LDB4ODQsMHg4NCwweDQwLDB4MGMsMHgwMCwweDEzLDB4ZDksMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4ODIsMHg4OSwweDRjLAorMHhhZiwweDgyLDB4ODQsMHg4MCwweDBjLDB4MDAsMHgwMCwweDVmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwMywKKzB4MzQsMHg2MywweDAxLDB4MDgsMHgzYywweDA0LDB4YjAsMHgwOSwweDNjLDB4MDUsMHhiMCwweDA5LDB4OGMsMHg2NiwweDAwLDB4MDAsCisweDM0LDB4ODQsMHgwMSwweDY4LDB4MzQsMHhhNSwweDAxLDB4NDAsMHgyNCwweDAyLDB4YzgsMHg4MCwweDI0LDB4MDMsMHgwMCwweDBhLAorMHhhNCwweDgyLDB4MDAsMHgwMCwweGE0LDB4YTMsMHgwMCwweDAwLDB4M2MsMHgwNCwweGIwLDB4MDMsMHg4YywweDgyLDB4MDAsMHgwMCwKKzB4OGYsMHg4NSwweDg0LDB4NDAsMHhhZiwweDg2LDB4ODQsMHgzOCwweDM0LDB4NDIsMHgwMCwweDIwLDB4YWMsMHg4MiwweDAwLDB4MDAsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAwLDB4NTgsMHg4YywweDQzLDB4MDAsMHgwMCwweDJjLDB4YTQsMHgwMCwweDExLAorMHgzNCwweDYzLDB4MDEsMHgwMCwweGFjLDB4NDMsMHgwMCwweDAwLDB4MTAsMHg4MCwweGZmLDB4ZmEsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4M2MsMHgwMywweDgwLDB4MDEsMHgwMCwweDA1LDB4MTAsMHg4MCwweDI0LDB4NjMsMHgwMiwweDAwLDB4MDAsMHg0MywweDEwLDB4MjEsCisweDhjLDB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDgwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNywweDg0LDB4ODQsMHg5OCwweDBjLDB4MDAsMHgyNiwweDhlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg0LDB4ODQsMHg0MCwKKzB4MGMsMHgwMCwweDE0LDB4NTIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDkzLDB4ODMsMHg4MSwweGYxLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDEwLDB4NjIsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweDg1LDB4ODQsMHg0MCwweDhmLDB4ODIsMHg4NCwweDc0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NDIsMHgwMCwweDAxLDB4YWYsMHg4MiwweDg0LDB4NzQsMHgwOCwweDAwLDB4MTUsMHg5ZCwKKzB4M2MsMHgwMiwweGIwLDB4MDMsMHgyNywweDg0LDB4ODQsMHg5OCwweDBjLDB4MDAsMHgyNywweDBkLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgxNSwweGI2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg0LDB4ODQsMHg5OCwweDBjLDB4MDAsMHgyOCwweGRkLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweGEzLDB4ODIsMHg4NCwweDcxLDB4OGYsMHg4MiwweDg0LDB4NzQsMHhhZiwweDgwLDB4ODQsMHg0MCwKKzB4MjQsMHg0MiwweDAwLDB4MDEsMHhhZiwweDgyLDB4ODQsMHg3NCwweDA4LDB4MDAsMHgxNSwweDljLDB4MDAsMHgwMCwweDI4LDB4MjEsCisweDI3LDB4ODQsMHg4NiwweDU4LDB4MGMsMHgwMCwweDE5LDB4NWIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweGZmLAorMHgxNCwweDQwLDB4MDAsMHgwNSwweDNjLDB4MDMsMHhiMCwweDA1LDB4YWYsMHg4MCwweDg0LDB4NDAsMHhhZiwweDgwLDB4ODQsMHg0NCwKKzB4MDgsMHgwMCwweDE1LDB4YjYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDM0LDB4NjMsMHgwNCwweDUwLDB4OTAsMHg2MiwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZmYsMHhhZiwweDgyLDB4ODQsMHg2YywweDE0LDB4NDAsMHgwMCwweDIwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDhmLDB4ODQsMHg4NCwweDQ4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDgyLDB4MDAsMHgyMCwKKzB4M2MsMHgwMywweGIwLDB4MDksMHgzNCwweDYzLDB4MDEsMHg2MCwweDkwLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4NDIsMHgwMCwweGZmLDB4YWYsMHg4MiwweDg0LDB4NTQsMHgxNCwweDQwLDB4MDAsMHgxNSwweDI0LDB4MDIsMHgwMCwweDAxLAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4ODIsMHgwMCwweDA3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDA1LDB4MDAsMHgwMywKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHhhZiwweDgyLDB4ODQsMHg0NCwweGFmLDB4ODUsMHg4NCwweDQwLDB4MDgsMHgwMCwweDE1LDB4YjYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDUsMHgzNCwweDQyLDB4MDIsMHgyZSwweDkwLDB4NDMsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NjMsMHgwMCwweDAxLDB4MzAsMHg2MywweDAwLDB4ZmYsMHgwMCwweDYwLDB4MTAsMHgyMSwKKzB4YTcsMHg4MywweDg0LDB4NjAsMHgxNCwweDQwLDB4ZmYsMHhmMSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweGFmLDB4ODIsMHg4NCwweDQ0LDB4YWYsMHg4MCwweDg0LDB4NDAsMHgwOCwweDAwLDB4MTUsMHhiNiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDAzLDB4YjAsMHgwNSwweDM0LDB4NjMsMHgwMiwweDJjLDB4OGMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweDAwLDB4ZmYsMHhhZiwweDgyLDB4ODQsMHg1YywweDE0LDB4NDAsMHhmZiwweGY1LDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDA4LDB4MDAsMHgxNSwweGUxLDB4M2MsMHgwMywweGIwLDB4MDksMHgyNywweDg0LDB4ODYsMHg1OCwweDBjLDB4MDAsMHgxYSwweGQxLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDgzLDB4ODIsMHg4NCwweDcwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4ZmYsMHhlYywKKzB4MjQsMHgwMiwweDAwLDB4MDIsMHgzYywweDAzLDB4YjAsMHgwNSwweDM0LDB4NjMsMHgwNCwweDUwLDB4OTAsMHg2MiwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZmYsMHhhZiwweDgyLDB4ODQsMHg2YywweDE0LDB4NDAsMHhmZiwweGU0LAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDhmLDB4ODQsMHg4NCwweDQ4LDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweDgyLDB4MDAsMHgxMiwKKzB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweDgyLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwNSwweDAwLDB4MDQsCisweDA4LDB4MDAsMHgxNSwweGVkLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgzYywweDAyLDB4YjAsMHgwNSwweDM0LDB4NDIsMHgwMiwweDJlLAorMHg5MCwweDQzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg2MywweDAwLDB4MDEsMHgzMCwweDYzLDB4MDAsMHhmZiwKKzB4MDAsMHg2MCwweDEwLDB4MjEsMHhhNywweDgzLDB4ODQsMHg2MCwweDE0LDB4NDAsMHhmZiwweGY0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgxNSwweGZjLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgzYywweDAzLDB4YjAsMHgwNSwweDM0LDB4NjMsMHgwMiwweDJjLAorMHg4YywweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZmYsMHhhZiwweDgyLDB4ODQsMHg1YywKKzB4MTQsMHg0MCwweGZmLDB4ZjcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxNiwweDFkLDB4MjQsMHgwMiwweDAwLDB4MDIsCisweDI3LDB4ODQsMHg4OSwweDE4LDB4MGMsMHgwMCwweDBiLDB4NTUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4ODMsMHg4NCwweDQ0LAorMHhhZiwweDgyLDB4ODQsMHg1YywweDM4LDB4NjQsMHgwMCwweDAyLDB4MDAsMHgwNCwweDE4LDB4MGEsMHhhZiwweDgzLDB4ODQsMHg0NCwKKzB4MTQsMHg0MCwweGZmLDB4YWQsMHgyNCwweDA1LDB4MDAsMHgwNSwweDhmLDB4ODIsMHg4OSwweDU4LDB4YWYsMHg4MCwweDg0LDB4NDAsCisweDEwLDB4NDAsMHgwMCwweDAyLDB4MjQsMHgwNCwweDAwLDB4MDEsMHhhZiwweDg0LDB4ODQsMHg0OCwweDkzLDB4ODIsMHg4OSwweDY2LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHhmZiwweDZjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwNSwKKzB4MzQsMHg0MiwweDAwLDB4MDgsMHg4YywweDQzLDB4MDAsMHgwMCwweDNjLDB4MDQsMHgyMCwweDAwLDB4MDAsMHg2NCwweDE4LDB4MjQsCisweDEwLDB4NjAsMHhmZiwweDY1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMywweDM0LDB4NDIsMHgwMCwweGEwLAorMHg4YywweDQzLDB4MDAsMHgwMCwweDNjLDB4MDQsMHg4MCwweDAwLDB4YWYsMHg4MCwweDg5LDB4NDAsMHgyNCwweDYzLDB4MDAsMHgwMSwKKzB4YWMsMHg0MywweDAwLDB4MDAsMHgzYywweDAxLDB4YjAsMHgwNSwweGFjLDB4MjQsMHgwMCwweDA4LDB4YWYsMHg4MCwweDg5LDB4M2MsCisweGFmLDB4ODAsMHg4OSwweDQ0LDB4YWYsMHg4MCwweDg5LDB4NDgsMHhhZiwweDgwLDB4ODksMHg1NCwweGFmLDB4ODAsMHg4OSwweDRjLAorMHgwOCwweDAwLDB4MTUsMHhiNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODMsMHg4MiwweDg0LDB4OTAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHg0MCwweDAwLDB4MDIsMHgyNCwweDAyLDB4MDAsMHgyMCwweGFmLDB4ODIsMHg4NCwweDVjLDB4OGYsMHg4NSwweDg0LDB4NWMsCisweDI3LDB4ODQsMHg4OSwweDE4LDB4MGMsMHgwMCwweDBkLDB4MzAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxZSwweDAwLAorMHhhMywweDgyLDB4ODQsMHg3MCwweGFmLDB4ODAsMHg4NCwweDVjLDB4MTAsMHg2MCwweGZmLDB4OGUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4M2MsMHgwMiwweGIwLDB4MDUsMHgzNCwweDQyLDB4MDIsMHgyZSwweDkwLDB4NDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4NjMsMHgwMCwweDAxLDB4MzAsMHg2MywweDAwLDB4ZmYsMHgwMCwweDYwLDB4MTAsMHgyMSwweGE3LDB4ODMsMHg4NCwweDYwLAorMHgxMCwweDQwLDB4MDAsMHgwNCwweDI0LDB4MDQsMHgwMCwweDAyLDB4YWYsMHg4NCwweDg0LDB4NDgsMHgwOCwweDAwLDB4MTUsMHhmZCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTUsMHhlZSwweDI0LDB4MDUsMHgwMCwweDA2LDB4MjcsMHg4NCwweDg0LDB4NDAsCisweDI3LDB4ODUsMHg4OSwweDE4LDB4MGMsMHgwMCwweDBkLDB4ZmQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4ODIsMHg4NCwweDY0LAorMHhhZiwweDgwLDB4ODQsMHg2YywweDE0LDB4NDAsMHgwMCwweDE5LDB4MDAsMHg0MCwweDE4LDB4MjEsMHg4ZiwweDgyLDB4ODQsMHg2OCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgxNSwweDI0LDB4MDIsMHgwMCwweDAyLDB4OGYsMHg4MywweDg0LDB4NDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg2MiwweDAwLDB4MGIsMHgzYywweDAyLDB4NDAsMHgwMCwweDhmLDB4ODMsMHg4NCwweDQ0LAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4NjIsMHgwMCwweDAyLDB4MjQsMHgwNSwweDAwLDB4MDMsMHgyNCwweDA1LDB4MDAsMHgwNiwKKzB4YWYsMHg4NSwweDg0LDB4NDAsMHgyNCwweDA0LDB4MDAsMHgwMywweGFmLDB4ODQsMHg4NCwweDQ4LDB4MDgsMHgwMCwweDE1LDB4YjYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzQsMHg0MiwweDAwLDB4MTQsMHgzYywweDAxLDB4YjAsMHgwNSwweGFjLDB4MjIsMHgwMCwweDAwLAorMHhhZiwweDgwLDB4ODQsMHg0MCwweDA4LDB4MDAsMHgxNiwweDk2LDB4MjQsMHgwNCwweDAwLDB4MDMsMHgxMCwweDYwLDB4MDAsMHgxMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg1LDB4ODksMHgxOCwweDI3LDB4ODQsMHg4NCwweDQwLDB4MGMsMHgwMCwweDBlLDB4MjEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHg4MywweDg0LDB4NDQsMHgyNCwweDAyLDB4MDAsMHgwMSwweGEzLDB4ODAsMHg4NCwweDcwLAorMHhhZiwweDgwLDB4ODQsMHg0OCwweDEwLDB4NjIsMHgwMCwweDAyLDB4MjQsMHgwNSwweDAwLDB4MDMsMHgyNCwweDA1LDB4MDAsMHgwNCwKKzB4YWYsMHg4NSwweDg0LDB4NDAsMHhhZiwweDgwLDB4ODQsMHg2NCwweDA4LDB4MDAsMHgxNSwweGI2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDgzLDB4ODIsMHg4NCwweDkwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNywweDg0LDB4ODksMHgxOCwweDBjLDB4MDAsMHgxMCwweDY5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweDgyLDB4ODQsMHg0NCwKKzB4YTMsMHg4MCwweDg0LDB4NzAsMHhhZiwweDgwLDB4ODQsMHg0MCwweGFmLDB4ODAsMHg4NCwweDQ4LDB4MTQsMHg0MCwweDAwLDB4MDMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDIsMHhhZiwweDgyLDB4ODQsMHg0NCwweGFmLDB4ODAsMHg4NCwweDY4LAorMHgwOCwweDAwLDB4MTUsMHhiNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg4NCwweDg0LDB4NDAsMHgyNywweDg1LDB4ODksMHgxOCwKKzB4MGMsMHgwMCwweDBlLDB4MjEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4ODIsMHg4NCwweDQ0LDB4YTMsMHg4MCwweDg0LDB4NzAsCisweGFmLDB4ODAsMHg4NCwweDQwLDB4YWYsMHg4MCwweDg0LDB4NDgsMHgxNCwweDQwLDB4ZmUsMHhlYiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMiwweGFmLDB4ODIsMHg4NCwweDQ0LDB4MDgsMHgwMCwweDE1LDB4YjYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjcsMHg4NCwweDg5LDB4MTgsMHgwYywweDAwLDB4MTAsMHg2OSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDE2LDB4YzYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjcsMHg4NCwweDg0LDB4OTgsMHgwYywweDAwLDB4MjksMHg3MywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MTUsMHhjNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDI0LDB4MDUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MGMsMHgwMCwweDI2LDB4ZmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgxOCwweDExLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDkzLDB4ODMsMHhiYywweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDYwLDB4MDAsMHgyYiwweDNjLDB4MDIsMHhiMCwweDAzLAorMHgzNCwweDQyLDB4MDEsMHgwOCwweDhjLDB4NDQsMHgwMCwweDAwLDB4OGYsMHg4MywweGJjLDB4MTAsMHg4ZiwweDgyLDB4YmMsMHgxNCwKKzB4MDAsMHg4MywweDE4LDB4MjMsMHgwMCwweDQzLDB4MTAsMHgyYiwweDEwLDB4NDAsMHgwMCwweDIzLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDI0LDB4MDQsMHgwNSwweGEwLDB4MzQsMHg0MiwweDAxLDB4MTgsMHg4YywweDQyLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgwNiwweGQxLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDQsMHgwNSwweGE0LDB4MGMsMHgwMCwweDA2LDB4ZDEsMHgwMCwweDAyLDB4ODQsMHgwMiwKKzB4MzAsMHg1MSwweGZmLDB4ZmYsMHgyNCwweDA0LDB4MDUsMHhhOCwweDAwLDB4MDIsMHg5NCwweDAyLDB4MGMsMHgwMCwweDA2LDB4ZDEsCisweDNhLDB4MTAsMHhmZiwweGZmLDB4M2EsMHgzMSwweGZmLDB4ZmYsMHgzMCwweDQyLDB4ZmYsMHhmZiwweDJlLDB4MTAsMHgwMCwweDAxLAorMHgyZSwweDMxLDB4MDAsMHgwMSwweDNhLDB4NTIsMHhmZiwweGZmLDB4MDIsMHgxMSwweDgwLDB4MjUsMHgyZSwweDUyLDB4MDAsMHgwMSwKKzB4MzgsMHg0MiwweGZmLDB4ZmYsMHgwMiwweDEyLDB4ODAsMHgyNSwweDJjLDB4NDIsMHgwMCwweDAxLDB4MDIsMHgwMiwweDgwLDB4MjUsCisweDE2LDB4MDAsMHgwMCwweDAyLDB4MjQsMHgwNCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgwNSwweDZlLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAxLDB4MDgsMHg4YywweDQzLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHhhZiwweDgzLDB4YmMsMHgxMCwweDBjLDB4MDAsMHgwMSwweGU5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweGFmLDB4ODAsMHg4NCwweDQwLDB4YWYsMHg4MCwweDg0LDB4NzQsMHgwOCwweDAwLDB4MTUsMHg5YywweDAwLDB4MDAsMHgyOCwweDIxLAorMHgyNywweDkwLDB4YjQsMHgwMCwweDI0LDB4MTEsMHgwMCwweDEyLDB4OGUsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OTAsMHg4MiwweDAwLDB4MTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDBjLDB4MDAsMHgxOCwweGQwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNiwweDMxLDB4ZmYsMHhmZiwweDA2LDB4MjEsMHhmZiwweGY2LAorMHgyNiwweDEwLDB4MDAsMHgwNCwweGFmLDB4ODAsMHg4NCwweDQwLDB4MDgsMHgwMCwweDE1LDB4YjcsMHgwMCwweDAwLDB4MjgsMHgyMSwKKzB4M2MsMHgwMiwweGIwLDB4MDMsMHgzNCwweDQyLDB4MDEsMHgwOCwweDhjLDB4NDQsMHgwMCwweDAwLDB4OGYsMHg4MiwweDg0LDB4MzgsCisweDAwLDB4MDQsMHgxOSwweGMyLDB4MDAsMHgwMiwweDExLDB4YzIsMHgxMCwweDYyLDB4ZmYsMHhmNiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDAyLDB4YjAsMHgwMywweDM0LDB4NDIsMHgwMSwweDAyLDB4OTAsMHg0MywweDAwLDB4MDAsMHgzYywweDEyLDB4YjAsMHgwNSwKKzB4YWYsMHg4NCwweDg0LDB4MzgsMHgzMCwweDYzLDB4MDAsMHhmZiwweDAwLDB4MDMsMHgxMSwweDQwLDB4MDAsMHg0MywweDEwLDB4MjMsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4OTksMHgwMCwweDAwLDB4MDAsMHg4OCwweDIxLAorMHgzNiwweDUyLDB4MDIsMHgyYywweDI3LDB4OTAsMHhiNCwweDAwLDB4OGUsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OTAsMHg4MywweDAwLDB4MTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NjIsMHgwMCwweDAzLDB4MTAsMHg0MCwweDAwLDB4MDYsCisweDMwLDB4NjIsMHgwMCwweDFjLDB4MTQsMHg0MCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4ODUsMHg4NCwweDM4LAorMHgwYywweDAwLDB4MWUsMHg5NCwweDAyLDB4NjAsMHgzMCwweDIxLDB4OGUsMHg0MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweDAwLDB4ZmYsMHgxNCwweDQwLDB4ZmYsMHhkNywweDAwLDB4MDAsMHgwMCwweDAwLDB4MjYsMHgzMSwweDAwLDB4MDEsCisweDJhLDB4MjIsMHgwMCwweDEzLDB4MTQsMHg0MCwweGZmLDB4ZWMsMHgyNiwweDEwLDB4MDAsMHgwNCwweDA4LDB4MDAsMHgxNywweDIxLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4ODQsMHg4NCwweDRjLDB4MjcsMHg4NSwweDg5LDB4MTgsMHgwYywweDAwLDB4MTcsMHhhNCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweDgzLDB4ODQsMHg0YywweDI0LDB4MDIsMHgwMCwweDA0LDB4MTQsMHg2MiwweGZlLDB4YTUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDE1LDB4ZWUsMHgyNCwweDA1LDB4MDAsMHgwNSwweDNjLDB4MDIsMHhiMCwweDAzLAorMHgzNCwweDQyLDB4MDAsMHgzZiwweDkwLDB4NDQsMHgwMCwweDAwLDB4MjQsMHgwMywweDAwLDB4MDEsMHgxMCwweDY0LDB4MDAsMHgwOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg0LDB4ODksMHgxOCwweDBjLDB4MDAsMHgyNCwweDJjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDUsMHgwMCwweDA1LDB4YWYsMHg4NSwweDg0LDB4NDAsMHgwOCwweDAwLDB4MTUsMHhiNywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDAyLDB4YjAsMHgwMywweDM0LDB4NDIsMHgwMCwweDE0LDB4OGMsMHg0NCwweDAwLDB4MDAsMHgwYywweDAwLDB4MjQsMHg0OSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MTcsMHg2NSwweDI0LDB4MDUsMHgwMCwweDA1LDB4OGYsMHg4MiwweDg5LDB4NGMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MGQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4ODQsMHhiNCwweDQwLAorMHhhZiwweDgwLDB4ODksMHg0YywweDk0LDB4ODUsMHgwMCwweDE0LDB4MGMsMHgwMCwweDFiLDB4NjYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OTMsMHg4MiwweDhiLDB4NzEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweDAyLDB4MTAsMHg0MCwweDAwLDB4MDMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MGMsMHgwMCwweDAxLDB4NTcsMHgwMCwweDAwLDB4MjAsMHgyMSwweDhmLDB4ODQsMHhiNCwweDQwLAorMHgwYywweDAwLDB4MTgsMHhkMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDE3LDB4MjEsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4M2MsMHgwMiwweGZmLDB4OTAsMHgyNywweGJkLDB4ZmYsMHhlOCwweDAwLDB4ODAsMHgxOCwweDIxLDB4MzQsMHg0MiwweDAwLDB4MDEsCisweDI3LDB4ODQsMHg4OSwweDE4LDB4MTAsMHg2MiwweDAwLDB4MDUsMHhhZiwweGJmLDB4MDAsMHgxMCwweDhmLDB4YmYsMHgwMCwweDEwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTgsMHgwYywweDAwLDB4MDYsMHhlNSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNywweDg0LDB4ODYsMHg1OCwweDBjLDB4MDAsMHgxOCwweDFmLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI3LDB4ODQsMHg4NCwweDQwLDB4MGMsMHgwMCwweDEzLDB4ZDksMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxNywweDhiLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4ODIsMHg4OSwweDU4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgwNSwKKzB4MDAsMHgwMCwweDE4LDB4MjEsMHg4ZiwweDgyLDB4ODQsMHg0OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MDIsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMywweDAwLDB4MDEsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4NjAsMHgxMCwweDIxLAorMHgyNywweGJkLDB4ZmYsMHhlMCwweDNjLDB4MDYsMHhiMCwweDAzLDB4YWYsMHhiMSwweDAwLDB4MTQsMHhhZiwweGIwLDB4MDAsMHgxMCwKKzB4MzQsMHhjNiwweDAwLDB4NWYsMHhhZiwweGJmLDB4MDAsMHgxOCwweDkwLDB4YzMsMHgwMCwweDAwLDB4M2MsMHgwNywweGIwLDB4MDMsCisweDM0LDB4ZTcsMHgwMCwweDVkLDB4MzQsMHg2MywweDAwLDB4MDEsMHgzYywweDA5LDB4YjAsMHgwMywweDI0LDB4MDIsMHgwMCwweDAxLAorMHhhMCwweGMzLDB4MDAsMHgwMCwweDAwLDB4ODAsMHg4MCwweDIxLDB4YTAsMHhlMiwweDAwLDB4MDAsMHgwMCwweGEwLDB4ODgsMHgyMSwKKzB4MzUsMHgyOSwweDAwLDB4NWUsMHgwMCwweGUwLDB4NDAsMHgyMSwweDI0LDB4MDQsMHgwMCwweDAxLDB4OTEsMHgyMiwweDAwLDB4MDAsCisweDkxLDB4MDMsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4MDEsMHgxNCwweDgzLDB4MDAsMHgwMywweDMwLDB4NDIsMHgwMCwweDAxLAorMHgxNCwweDQwLDB4ZmYsMHhmYSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDQsMHgxMiwweDAyLDB4MDAsMHgyYywKKzB4MjQsMHgwNSwweDBmLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwNiwweDEyLDB4MDIsMHgwMCwweDA4LDB4MjQsMHgwNSwweDAwLDB4MGYsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAyLDB4MDAsMHhhMCwweDUwLDB4MDAsMHgwMCwweDhmLDB4YmYsMHgwMCwweDE4LAorMHg3YiwweGIwLDB4MDAsMHhiYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MjAsMHgyNCwweDA0LDB4MGMsMHgwNCwKKzB4MGMsMHgwMCwweDEzLDB4NWYsMHgyNCwweDA2LDB4MDAsMHgwZiwweDI0LDB4MDQsMHgwZCwweDA0LDB4MjQsMHgwNSwweDAwLDB4MGYsCisweDBjLDB4MDAsMHgxMywweDVmLDB4MjQsMHgwNiwweDAwLDB4MGYsMHgyNCwweDA0LDB4MDgsMHg4MCwweDI0LDB4MDUsMHgxZSwweDAwLAorMHgwYywweDAwLDB4MTMsMHg1ZiwweDI0LDB4MDYsMHgwMCwweDBmLDB4MjQsMHgwNCwweDA4LDB4OGMsMHgyNCwweDA1LDB4MGYsMHgwMCwKKzB4MGMsMHgwMCwweDEzLDB4NWYsMHgyNCwweDA2LDB4MDAsMHgwZiwweDI0LDB4MDQsMHgwOCwweDI0LDB4M2MsMHgwNSwweDAwLDB4MzAsCisweDBjLDB4MDAsMHgxMywweDVmLDB4MjQsMHgwNiwweDAwLDB4MDIsMHgyNCwweDA0LDB4MDgsMHgyYywweDNjLDB4MDUsMHgwMCwweDMwLAorMHgwYywweDAwLDB4MTMsMHg1ZiwweDI0LDB4MDYsMHgwMCwweDAyLDB4MjQsMHgwNCwweDA4LDB4MzQsMHgzYywweDA1LDB4MDAsMHgzMCwKKzB4MGMsMHgwMCwweDEzLDB4NWYsMHgyNCwweDA2LDB4MDAsMHgwMiwweDI0LDB4MDQsMHgwOCwweDNjLDB4M2MsMHgwNSwweDAwLDB4MzAsCisweDBjLDB4MDAsMHgxMywweDVmLDB4MjQsMHgwNiwweDAwLDB4MDIsMHgwOCwweDAwLDB4MTcsMHhjNSwweDNjLDB4MDIsMHhiMCwweDAzLAorMHgyNCwweDA0LDB4MDgsMHg4YywweDBjLDB4MDAsMHgxMywweDVmLDB4MjQsMHgwNiwweDAwLDB4MDQsMHgyNCwweDA0LDB4MDgsMHg4MCwKKzB4MjQsMHgwNSwweDFlLDB4MDAsMHgwYywweDAwLDB4MTMsMHg1ZiwweDI0LDB4MDYsMHgwMCwweDA0LDB4MjQsMHgwNCwweDBjLDB4MDQsCisweDI0LDB4MDUsMHgwMCwweDBmLDB4MGMsMHgwMCwweDEzLDB4NWYsMHgyNCwweDA2LDB4MDAsMHgwNCwweDI0LDB4MDQsMHgwZCwweDA0LAorMHgyNCwweDA1LDB4MDAsMHgwZiwweDBjLDB4MDAsMHgxMywweDVmLDB4MjQsMHgwNiwweDAwLDB4MDQsMHgyNCwweDA0LDB4MDgsMHgyNCwKKzB4M2MsMHgwNSwweDAwLDB4MzAsMHgwYywweDAwLDB4MTMsMHg1ZiwweDI0LDB4MDYsMHgwMCwweDAzLDB4MjQsMHgwNCwweDA4LDB4MmMsCisweDNjLDB4MDUsMHgwMCwweDMwLDB4MGMsMHgwMCwweDEzLDB4NWYsMHgyNCwweDA2LDB4MDAsMHgwMywweDI0LDB4MDQsMHgwOCwweDM0LAorMHgzYywweDA1LDB4MDAsMHgzMCwweDBjLDB4MDAsMHgxMywweDVmLDB4MjQsMHgwNiwweDAwLDB4MDIsMHgzYywweDA1LDB4MDAsMHgzMCwKKzB4MjQsMHgwNiwweDAwLDB4MDMsMHgwYywweDAwLDB4MTMsMHg1ZiwweDI0LDB4MDQsMHgwOCwweDNjLDB4MDIsMHgyMCwweDIwLDB4MjEsCisweDI0LDB4MDUsMHgwMCwweDE0LDB4MGMsMHgwMCwweDEzLDB4YTQsMHgyNCwweDA2LDB4MDEsMHgwNywweDA4LDB4MDAsMHgxNywweGM1LAorMHgzYywweDAyLDB4YjAsMHgwMywweDNjLDB4MDMsMHhiMCwweDAzLDB4MzQsMHg2MywweDAwLDB4NzMsMHg5MCwweDYyLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHgwMiwweDE0LDB4NDAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweGEzLDB4ODAsMHg4MSwweDU4LDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLAorMHhhMywweDgyLDB4ODEsMHg1OCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwMywKKzB4M2MsMHgwMiwweDgwLDB4MDAsMHgwMCwweDgwLDB4NzAsMHgyMSwweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDYwLDB4N2MsCisweDNjLDB4MDQsMHhiMCwweDAzLDB4YWMsMHg2MiwweDAwLDB4MDAsMHgzNCwweDg0LDB4MDAsMHgzMCwweGFkLDB4YzAsMHgwMiwweGI4LAorMHg4YywweDgzLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweGZmLDB4YTUsMHhjMCwweDAwLDB4MGEsMHgwMCwweDAwLDB4MzAsMHgyMSwKKzB4YTcsMHg4MiwweDhmLDB4ZjAsMHgyNywweDg4LDB4OTAsMHgwMCwweGE1LDB4YzMsMHgwMCwweDA4LDB4M2MsMHgwNywweGIwLDB4MDgsCisweDMwLDB4YzIsMHhmZiwweGZmLDB4MDAsMHgwMiwweDIwLDB4YzAsMHgyNCwweGMzLDB4MDAsMHgwMSwweDAwLDB4ODIsMHgxMCwweDIxLAorMHgwMCwweDYwLDB4MzAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MzAsMHg2MywweGZmLDB4ZmYsMHgwMCwweDQ4LDB4MTAsMHgyMSwKKzB4MDAsMHg4NywweDIwLDB4MjEsMHgyOCwweGM1LDB4MDAsMHhmZiwweGFjLDB4ODMsMHgwMCwweDAwLDB4MTQsMHhhMCwweGZmLDB4ZjQsCisweGE0LDB4NDMsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDgsMHgzNCwweDAzLDB4ZmYsMHhmZiwweDI1LDB4YzQsMHgwMCwweDBjLAorMHgyNCwweDBhLDB4MDAsMHgwMiwweDM0LDB4NDIsMHgwNywweGY4LDB4M2MsMHgwNiwweGIwLDB4MDMsMHhhNywweDgzLDB4YjMsMHhkYywKKzB4YWMsMHg0MywweDAwLDB4MDAsMHhhZiwweDg0LDB4YjQsMHgwMCwweDM0LDB4YzYsMHgwMCwweDY0LDB4YTAsMHg4YSwweDAwLDB4MTgsCisweDk0LDB4YzUsMHgwMCwweDAwLDB4OGYsMHg4MiwweGI0LDB4MDAsMHgyNSwweGM0LDB4MDAsMHgzMCwweDI0LDB4MDgsMHgwMCwweDAzLAorMHgzYywweDAzLDB4YjAsMHgwMywweGEwLDB4NDUsMHgwMCwweDIxLDB4MzQsMHg2MywweDAwLDB4NjYsMHhhZiwweDg0LDB4YjQsMHgwNCwKKzB4YTAsMHg4OCwweDAwLDB4MTgsMHg5NCwweDY1LDB4MDAsMHgwMCwweDhmLDB4ODIsMHhiNCwweDA0LDB4MjUsMHhjNCwweDAwLDB4NTQsCisweDI1LDB4YzcsMHgwMCwweDc4LDB4YTAsMHg0NSwweDAwLDB4MjEsMHhhZiwweDg0LDB4YjQsMHgwOCwweGEwLDB4ODgsMHgwMCwweDE4LAorMHg5NCwweDY1LDB4MDAsMHgwMCwweDhmLDB4ODIsMHhiNCwweDA4LDB4MjUsMHhjOCwweDAwLDB4OWMsMHgyNCwweDA5LDB4MDAsMHgwMSwKKzB4YTAsMHg0NSwweDAwLDB4MjEsMHhhZiwweDg3LDB4YjQsMHgwYywweGEwLDB4ZWEsMHgwMCwweDE4LDB4OTQsMHhjNCwweDAwLDB4MDAsCisweDhmLDB4ODIsMHhiNCwweDBjLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzNCwweDYzLDB4MDAsMHg2MiwweGEwLDB4NDQsMHgwMCwweDIxLAorMHhhZiwweDg4LDB4YjQsMHgxMCwweGExLDB4MDksMHgwMCwweDE4LDB4OTQsMHg2NSwweDAwLDB4MDAsMHg4ZiwweDgyLDB4YjQsMHgxMCwKKzB4MjUsMHhjNCwweDAwLDB4YzAsMHgzYywweDA2LDB4YjAsMHgwMywweGEwLDB4NDUsMHgwMCwweDIxLDB4YWYsMHg4NCwweGI0LDB4MTQsCisweGEwLDB4ODksMHgwMCwweDE4LDB4OTQsMHg2NSwweDAwLDB4MDAsMHg4ZiwweDgyLDB4YjQsMHgxNCwweDI1LDB4YzQsMHgwMCwweGU0LAorMHgzNCwweGM2LDB4MDAsMHg2MCwweGEwLDB4NDUsMHgwMCwweDIxLDB4YWYsMHg4NCwweGI0LDB4MTgsMHhhMCwweDgwLDB4MDAsMHgxOCwKKzB4OTQsMHhjNSwweDAwLDB4MDAsMHg4ZiwweDgyLDB4YjQsMHgxOCwweDI1LDB4YzMsMHgwMSwweDA4LDB4MjUsMHhjNywweDAxLDB4MmMsCisweGEwLDB4NDUsMHgwMCwweDIxLDB4YWYsMHg4MywweGI0LDB4MWMsMHhhMCwweDYwLDB4MDAsMHgxOCwweDk0LDB4YzgsMHgwMCwweDAwLAorMHg4ZiwweDgyLDB4YjQsMHgxYywweDI1LDB4YzQsMHgwMSwweDUwLDB4MjUsMHhjNSwweDAxLDB4NzQsMHhhMCwweDQ4LDB4MDAsMHgyMSwKKzB4MjUsMHhjNiwweDAxLDB4OTgsMHgyNSwweGM5LDB4MDEsMHhiYywweDI1LDB4Y2EsMHgwMSwweGUwLDB4MjUsMHhjYiwweDAyLDB4MDQsCisweDI1LDB4Y2MsMHgwMiwweDI4LDB4MjUsMHhjZCwweDAyLDB4NGMsMHgyNCwweDAyLDB4MDAsMHgxMCwweDNjLDB4MDMsMHhiMCwweDAzLAorMHhhZiwweDg3LDB4YjQsMHgyMCwweDM0LDB4NjMsMHgwMCwweDM4LDB4YTAsMHhlMCwweDAwLDB4MTgsMHhhZiwweDg0LDB4YjQsMHgyNCwKKzB4YTAsMHg4MCwweDAwLDB4MTgsMHhhZiwweDg1LDB4YjQsMHgyOCwweGEwLDB4YTAsMHgwMCwweDE4LDB4YWYsMHg4NiwweGI0LDB4MmMsCisweGEwLDB4YzAsMHgwMCwweDE4LDB4YWYsMHg4OSwweGI0LDB4MzAsMHhhMSwweDIwLDB4MDAsMHgxOCwweGFmLDB4OGEsMHhiNCwweDM0LAorMHhhMSwweDQwLDB4MDAsMHgxOCwweGFmLDB4OGIsMHhiNCwweDM4LDB4YTEsMHg2MCwweDAwLDB4MTgsMHhhZiwweDhjLDB4YjQsMHgzYywKKzB4YTEsMHg4MCwweDAwLDB4MTgsMHhhZiwweDhkLDB4YjQsMHg0MCwweGExLDB4YTIsMHgwMCwweDE4LDB4OTQsMHg2NCwweDAwLDB4MDAsCisweDhmLDB4ODIsMHhiNCwweDQwLDB4MjUsMHhjNSwweDAyLDB4NzAsMHgzYywweDAzLDB4YjAsMHgwMywweGEwLDB4NDQsMHgwMCwweDIxLAorMHgyNCwweDAyLDB4MDAsMHgxMSwweGFmLDB4ODUsMHhiNCwweDQ0LDB4MzQsMHg2MywweDAwLDB4NmUsMHhhMCwweGEyLDB4MDAsMHgxOCwKKzB4OTQsMHg2NCwweDAwLDB4MDAsMHg4ZiwweDgyLDB4YjQsMHg0NCwweDI1LDB4YzUsMHgwMiwweDk0LDB4M2MsMHgwMywweGIwLDB4MDMsCisweGEwLDB4NDQsMHgwMCwweDIxLDB4MjQsMHgwMiwweDAwLDB4MTIsMHhhZiwweDg1LDB4YjQsMHg0OCwweDM0LDB4NjMsMHgwMCwweDZjLAorMHhhMCwweGEyLDB4MDAsMHgxOCwweDk0LDB4NjQsMHgwMCwweDAwLDB4OGYsMHg4MiwweGI0LDB4NDgsMHgyNCwweDA1LDB4ZmYsMHhmZiwKKzB4MjQsMHgwNywweDAwLDB4MDEsMHhhMCwweDQ0LDB4MDAsMHgyMSwweDI0LDB4MDYsMHgwMCwweDEyLDB4MjcsMHg4NCwweGI0LDB4MDAsCisweDhjLDB4ODIsMHgwMCwweDAwLDB4MjQsMHhjNiwweGZmLDB4ZmYsMHhhMCwweDQwLDB4MDAsMHgwNCwweDhjLDB4ODMsMHgwMCwweDAwLAorMHhhNCwweDQ1LDB4MDAsMHgwMCwweGE0LDB4NDUsMHgwMCwweDAyLDB4YTAsMHg2MCwweDAwLDB4MGEsMHg4YywweDgyLDB4MDAsMHgwMCwKKzB4YTQsMHg2NSwweDAwLDB4MDYsMHhhNCwweDY1LDB4MDAsMHgwOCwweGEwLDB4NDAsMHgwMCwweDEwLDB4OGMsMHg4MywweDAwLDB4MDAsCisweGE0LDB4NDUsMHgwMCwweDBjLDB4YTQsMHg0NSwweDAwLDB4MGUsMHhhMCwweDYwLDB4MDAsMHgxMiwweDhjLDB4ODIsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweGEwLDB4NDAsMHgwMCwweDE2LDB4OGMsMHg4MywweDAwLDB4MDAsMHhhNCwweDQ1LDB4MDAsMHgxNCwKKzB4YTAsMHg2NywweDAwLDB4MTcsMHg4YywweDgyLDB4MDAsMHgwMCwweDI0LDB4ODQsMHgwMCwweDA0LDB4YTAsMHg0MCwweDAwLDB4MjAsCisweDA0LDB4YzEsMHhmZiwweGU3LDB4YWMsMHg0MCwweDAwLDB4MWMsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDAyLDB4YjAsMHgwMywweDNjLDB4MDMsMHg4MCwweDAwLDB4MzQsMHg0MiwweDAwLDB4MjAsMHgyNCwweDYzLDB4NjMsMHg0MCwKKzB4YWMsMHg0MywweDAwLDB4MDAsMHg5MCwweDgyLDB4MDAsMHgxMCwweDAwLDB4ODAsMHg2MCwweDIxLDB4MTAsMHg0MCwweDAwLDB4NTYsCisweDAwLDB4MDAsMHg3MCwweDIxLDB4OTcsMHg4MiwweDhmLDB4ZjAsMHg5NCwweDhhLDB4MDAsMHgwYywweDI3LDB4ODcsMHg5MCwweDAwLAorMHgwMCwweDAyLDB4NDAsMHhjMCwweDAxLDB4MDIsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ3LDB4MTAsMHgyMSwKKzB4OTAsMHg4YiwweDAwLDB4MTgsMHhhNCwweDRhLDB4MDAsMHgwMCwweDk0LDB4ODMsMHgwMCwweDBlLDB4MzksMHg2NCwweDAwLDB4MTAsCisweDJjLDB4ODQsMHgwMCwweDAxLDB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDM0LDB4ODUsMHgwMCwweDAyLAorMHgzOSwweDYzLDB4MDAsMHgxMSwweDAwLDB4ODMsMHgyOCwweDBiLDB4MzQsMHhhMywweDAwLDB4MDgsMHgzOSwweDY0LDB4MDAsMHgxMiwKKzB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweGE0LDB4MTgsMHgwYiwweDAwLDB4NDcsMHgxMCwweDIxLDB4OTQsMHg0OSwweDAwLDB4MDQsCisweDM0LDB4NjQsMHgwMCwweDIwLDB4MDAsMHg2YiwweDIwLDB4MGIsMHgzNCwweDgzLDB4MDAsMHg0MCwweDM5LDB4NjIsMHgwMCwweDAxLAorMHgwMCwweDgyLDB4MTgsMHgwYiwweDAwLDB4MDksMHgzMCwweGMwLDB4MzQsMHg2NCwweDAwLDB4ODAsMHgwMCwweGM5LDB4MjgsMHgyMSwKKzB4MzksMHg2MiwweDAwLDB4MDIsMHgwMCwweDYwLDB4NjgsMHgyMSwweDAwLDB4ODIsMHg2OCwweDBhLDB4MDAsMHgwNSwweDI4LDB4ODAsCisweDNjLDB4MDIsMHhiMCwweDA4LDB4MDAsMHhhNywweDI4LDB4MjEsMHgwMCwweGMyLDB4MzAsMHgyMSwweDAxLDB4MDIsMHg0MCwweDIxLAorMHgzNCwweDAzLDB4ZmYsMHhmZiwweDM1LDB4YTQsMHgwMSwweDAwLDB4MzksMHg2MiwweDAwLDB4MDMsMHgyZCwweDY3LDB4MDAsMHgxMywKKzB4YWQsMHgwYSwweDAwLDB4MDAsMHhhNCwweGEzLDB4MDAsMHgwMCwweGFjLDB4YzMsMHgwMCwweDAwLDB4YTcsMHg4OSwweDhmLDB4ZjAsCisweDEwLDB4ZTAsMHgwMCwweDBmLDB4MDAsMHg4MiwweDY4LDB4MGEsMHgzYywweDAzLDB4ODAsMHgwMSwweDAwLDB4MGIsMHgxMCwweDgwLAorMHgyNCwweDYzLDB4MDIsMHg0NCwweDAwLDB4NDMsMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHg4MCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDAzLDB4MzQsMHg2MywweDAwLDB4NjAsCisweDk0LDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MTQsMHgwMCwweDAwLDB4MDIsMHg3NCwweDAzLAorMHgzYywweDAyLDB4YjAsMHgwMywweDM0LDB4NDIsMHgwMCwweDNhLDB4OTQsMHg0NCwweDAwLDB4MDAsMHg5MywweDgzLDB4OGYsMHhlNCwKKzB4OTEsMHg4MiwweDAwLDB4MjEsMHgwMSwweGM0LDB4MjAsMHgyMSwweDkxLDB4ODUsMHgwMCwweDEwLDB4MDAsMHgwNCwweDI0LDB4MDAsCisweDAwLDB4NjIsMHgxOCwweDIxLDB4MDAsMHgwNCwweDc0LDB4MDMsMHgwMCwweDZlLDB4MTgsMHgyMywweDAwLDB4NjUsMHgxMCwweDJhLAorMHgwMCwweGEyLDB4MTgsMHgwYSwweDAwLDB4MGQsMHgyNCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDYsMHgyNCwweDA1LDB4ZmYsMHhmZiwKKzB4MDAsMHg2NCwweDE4LDB4MjUsMHgzNCwweDQyLDB4ODAsMHgyMCwweGFjLDB4NDMsMHgwMCwweDAwLDB4YTUsMHg4NSwweDAwLDB4MGUsCisweGExLDB4ODAsMHgwMCwweDEwLDB4YTUsMHg4NSwweDAwLDB4MGMsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzYywweDAzLDB4YjAsMHgwMywweDA4LDB4MDAsMHgxOSwweDE0LDB4MzQsMHg2MywweDAwLDB4NjIsMHgzYywweDAzLDB4YjAsMHgwMywKKzB4MDgsMHgwMCwweDE5LDB4MTQsMHgzNCwweDYzLDB4MDAsMHg2NCwweDNjLDB4MDMsMHhiMCwweDAzLDB4MDgsMHgwMCwweDE5LDB4MTQsCisweDM0LDB4NjMsMHgwMCwweDY2LDB4M2MsMHgwMywweGIwLDB4MDMsMHgwOCwweDAwLDB4MTksMHgxNCwweDM0LDB4NjMsMHgwMCwweDM4LAorMHgzYywweDAzLDB4YjAsMHgwMywweDA4LDB4MDAsMHgxOSwweDE0LDB4MzQsMHg2MywweDAwLDB4NmUsMHgzYywweDAzLDB4YjAsMHgwMywKKzB4MDgsMHgwMCwweDE5LDB4MTQsMHgzNCwweDYzLDB4MDAsMHg2YywweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsCisweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDY1LDB4MDgsMHgwMCwweDA1LDB4MjgsMHg0MCwweGFjLDB4NjIsMHgwMCwweDAwLAorMHgwMCwweGE2LDB4MjgsMHgyMSwweDJjLDB4ZTIsMHgwMCwweDEwLDB4MTQsMHg4MCwweDAwLDB4MDYsMHgwMCwweDAwLDB4MTgsMHgyMSwKKzB4MTAsMHg0MCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZTAsMHgxOCwweDIxLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDAwLDB4NjAsMHgxMCwweDIxLDB4MjQsMHgwMiwweDAwLDB4MjAsMHgxMCwweGUyLDB4MDAsMHgwNiwweDJjLDB4ZTQsMHgwMCwweDEwLAorMHgyNCwweGEyLDB4MDAsMHgwMSwweDEwLDB4ODAsMHhmZiwweGY5LDB4MDAsMHgwMiwweDExLDB4MDAsMHgwOCwweDAwLDB4MTksMHg0ZiwKKzB4MDAsMHg0NywweDE4LDB4MjEsMHgwOCwweDAwLDB4MTksMHg0ZiwweDI0LDB4YTMsMHgwMCwweDUwLDB4MjcsMHhiZCwweGZmLDB4YzgsCisweGFmLDB4YjMsMHgwMCwweDFjLDB4YWYsMHhiMiwweDAwLDB4MTgsMHhhZiwweGIxLDB4MDAsMHgxNCwweGFmLDB4YmYsMHgwMCwweDMwLAorMHhhZiwweGI3LDB4MDAsMHgyYywweGFmLDB4YjYsMHgwMCwweDI4LDB4YWYsMHhiNSwweDAwLDB4MjQsMHhhZiwweGI0LDB4MDAsMHgyMCwKKzB4YWYsMHhiMCwweDAwLDB4MTAsMHgwMCwweDgwLDB4ODgsMHgyMSwweDg0LDB4ODQsMHgwMCwweDA4LDB4M2MsMHgwNSwweGIwLDB4MDMsCisweDNjLDB4MDIsMHg4MCwweDAwLDB4MzQsMHhhNSwweDAwLDB4MjAsMHgyNCwweDQyLDB4NjUsMHg2YywweDNjLDB4MDMsMHhiMCwweDA2LAorMHgwMCwweDA0LDB4MjAsMHg4MCwweGFjLDB4YTIsMHgwMCwweDAwLDB4MDAsMHg4MywweDIwLDB4MjEsMHgzYywweDA2LDB4YjAsMHgwNiwKKzB4OGMsMHg4MiwweDAwLDB4MDAsMHgzNCwweGM2LDB4ODAsMHgyNCwweDhjLDB4ODgsMHgwMCwweDAwLDB4OGMsMHhjNCwweDAwLDB4MDAsCisweDk2LDB4MjUsMHgwMCwweDA4LDB4MzAsMHg1MiwweGZmLDB4ZmYsMHgwMCwweDA4LDB4NDQsMHgwMiwweDM0LDB4ODQsMHgwMSwweDAwLAorMHgzYywweDAyLDB4YjAsMHgwMCwweDAwLDB4MDgsMHgxOCwweGMwLDB4MDAsMHgxMiwweDNhLDB4MDAsMHhhYywweGM0LDB4MDAsMHgwMCwKKzB4MDAsMHhlMiwweDM4LDB4MjEsMHhhZSwweDMyLDB4MDIsMHhiOCwweDAwLDB4NjgsMHgxOCwweDIxLDB4MjQsMHhhNSwweDAwLDB4MDIsCisweDhjLDB4ZjYsMHgwMCwweDAwLDB4MzAsMHhhNSwweDAxLDB4ZmYsMHg4YywweGY0LDB4MDAsMHgwNCwweDI3LDB4ODYsMHg5MCwweDAwLAorMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4MTIsMHg5OCwweGMwLDB4YTYsMHgyNSwweDAwLDB4MDgsMHgwMCwweDY2LDB4MTgsMHgyMSwKKzB4MDIsMHg3MiwweDEwLDB4MjEsMHg5NCwweDY1LDB4MDAsMHgwMCwweDAwLDB4MDIsMHg0OCwweDgwLDB4MDEsMHgyNiwweDMwLDB4MjEsCisweDI0LDB4MDIsMHhmZiwweGZmLDB4MDAsMHgxNCwweDFhLDB4MDIsMHgyNywweDg0LDB4OTAsMHgxMCwweGE0LDB4YzIsMHgwMCwweDAyLAorMHgzMCwweDYzLDB4MDAsMHgxZiwweDI0LDB4MDIsMHgwMCwweDEwLDB4MDEsMHgyNCwweDIwLDB4MjEsMHhhNCwweGM4LDB4MDAsMHgwNCwKKzB4OGMsMHhmMCwweDAwLDB4MDgsMHhhNiwweDIzLDB4MDAsMHgwNiwweGE2LDB4MjUsMHgwMCwweDBhLDB4YTAsMHg4MiwweDAwLDB4MDYsCisweDg2LDB4MjUsMHgwMCwweDA2LDB4MjcsMHg4MiwweDkwLDB4MDQsMHgwMSwweDIyLDB4MTAsMHgyMSwweDI0LDB4MDMsMHgwMCwweDEzLAorMHgxMCwweGEzLDB4MDAsMHhlZSwweGFjLDB4NDcsMHgwMCwweDE4LDB4M2MsMHgwMywweGIwLDB4MDMsMHgzNCwweDYzLDB4MDEsMHgwMCwKKzB4YTYsMHgyMCwweDAwLDB4MDIsMHgzYywweDAyLDB4YjAsMHgwMywweDkwLDB4NjQsMHgwMCwweDAwLDB4MzQsMHg0MiwweDAxLDB4MDgsCisweDhjLDB4NDUsMHgwMCwweDAwLDB4MDAsMHgxMCwweDFiLDB4YzIsMHgwMCwweDA0LDB4MjAsMHg4MiwweDMwLDB4NjMsMHgwMCwweDAxLAorMHhhYywweGM1LDB4MDAsMHgwOCwweDEwLDB4NjAsMHgwMCwweGM3LDB4MzAsMHg5NywweDAwLDB4MDEsMHgwMCwweDEwLDB4MTYsMHg4MiwKKzB4MzAsMHg0NiwweDAwLDB4MDEsMHgwMCwweDEwLDB4MTIsMHgwMiwweDAwLDB4MTAsMHgxOSwweGMyLDB4MDAsMHgxMCwweDI2LDB4MDIsCisweDAwLDB4MTAsMHgyZSwweDQyLDB4MzAsMHg0OCwweDAwLDB4N2YsMHgyNCwweDAyLDB4MDAsMHgwMSwweDMwLDB4NzUsMHgwMCwweDAxLAorMHgzMCwweDg0LDB4MDAsMHgwMSwweDEwLDB4YzIsMHgwMCwweGIzLDB4MzAsMHhhMywweDAwLDB4MDEsMHgwMCwweDYwLDB4MjgsMHgyMSwKKzB4MGMsMHgwMCwweDE5LDB4NDIsMHgwMSwweDAwLDB4MzgsMHgyMSwweDAyLDB4NzIsMHgxOCwweDIxLDB4MDAsMHgwMywweDE4LDB4ODAsCisweDJjLDB4NDYsMHgwMCwweDU0LDB4MjcsMHg4NSwweDkwLDB4MTAsMHgyNywweDg0LDB4OTAsMHgwOCwweDAwLDB4MDYsMHgxMCwweDBhLAorMHgwMCwweDY1LDB4MjgsMHgyMSwweDI2LDB4YTYsMHgwMCwweDAyLDB4MDAsMHg2NCwweDE4LDB4MjEsMHhhMCwweGEyLDB4MDAsMHgwMiwKKzB4YTAsMHg2NiwweDAwLDB4MDYsMHhhMCwweDYyLDB4MDAsMHgwNywweGEwLDB4YTIsMHgwMCwweDAxLDB4MDIsMHg3MiwweDI4LDB4MjEsCisweDAwLDB4MDUsMHgyOCwweDgwLDB4MjcsMHg4MiwweDkwLDB4MDQsMHgwMCwweGEyLDB4NTgsMHgyMSwweDhkLDB4NjQsMHgwMCwweDE4LAorMHgwMCwweDEwLDB4MTUsMHhjMiwweDMwLDB4NDIsMHgwMCwweDAxLDB4OGMsMHg4MywweDAwLDB4MGMsMHgyNywweDg0LDB4OTAsMHgyMCwKKzB4MDAsMHhhNCwweDQ4LDB4MjEsMHhhNiwweDIyLDB4MDAsMHgwMCwweGE2LDB4MzYsMHgwMCwweDA0LDB4OGQsMHgyNiwweDAwLDB4MDAsCisweDAwLDB4MDMsMHgxOSwweDQyLDB4M2MsMHgwMiwweGZmLDB4ZWYsMHgzNCwweDQyLDB4ZmYsMHhmZiwweDMwLDB4NjMsMHgwMCwweDAxLAorMHgwMCwweGMyLDB4NDAsMHgyNCwweDAwLDB4MDMsMHgxZCwweDAwLDB4MDEsMHgwMywweDQwLDB4MjUsMHgwMCwweDA4LDB4MTUsMHgwMiwKKzB4MDAsMHgxNCwweDE5LDB4ODIsMHgwMCwweDE0LDB4MjUsMHg4MiwweDAwLDB4MTAsMHgzNCwweDQyLDB4MDAsMHgxMCwweDNjLDB4ODIsCisweDAwLDB4MTAsMHgyYywweDAyLDB4MzAsMHg0MiwweDAwLDB4MDEsMHgzMCwweGNkLDB4MDAsMHgwMSwweDMwLDB4NmMsMHgwMCwweDAxLAorMHgzMCwweGU2LDB4MDAsMHgwMSwweDMwLDB4OGEsMHgwMCwweDAzLDB4MzIsMHg5NCwweDAwLDB4MDcsMHgzMCwweGE1LDB4MDAsMHgwMSwKKzB4YWQsMHgyOCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgwYiwweDMyLDB4MDcsMHgwMCwweDdmLDB4OGQsMHg2NCwweDAwLDB4MTgsCisweDNjLDB4MDMsMHhmZiwweGYwLDB4MzQsMHg2MywweGZmLDB4ZmYsMHg4YywweDgyLDB4MDAsMHgwYywweDAxLDB4MDMsMHgxOCwweDI0LAorMHgwMCwweDAyLDB4MTMsMHg4MiwweDMwLDB4NDIsMHgwMCwweDBmLDB4MDAsMHgwMiwweDE0LDB4MDAsMHgwMCwweDYyLDB4MTgsMHgyNSwKKzB4YWQsMHgyMywweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YzIsMHgwMCwweDZhLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDE1LDB4ODAsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNSwweDQwLDB4MDAsMHg1YiwweDI0LDB4MDIsMHgwMCwweDAxLAorMHg5NiwweDIyLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4MDQsMHhhNiwweDIyLDB4MDAsMHgwNCwKKzB4MDAsMHhhMCwweDIwLDB4MjEsMHgwYywweDAwLDB4MTksMHg0MiwweDAxLDB4YTAsMHgyOCwweDIxLDB4MDIsMHg3MiwweDE4LDB4MjEsCisweDAwLDB4MDMsMHg0MCwweDgwLDB4MmMsMHg0NSwweDAwLDB4NTQsMHgyNywweDg0LDB4OTAsMHgxMCwweDAxLDB4MDQsMHgyMCwweDIxLAorMHgwMCwweDA1LDB4MTAsMHgwYSwweGEwLDB4ODIsMHgwMCwweDAwLDB4YTAsMHg4MCwweDAwLDB4MDQsMHhhMCwweDgwLDB4MDAsMHgwNSwKKzB4OTYsMHgyMywweDAwLDB4MDQsMHgyNywweDgyLDB4OTAsMHgwMCwweDAxLDB4MDIsMHgxMCwweDIxLDB4YTQsMHg0MywweDAwLDB4MDYsCisweDI3LDB4ODIsMHg5MCwweDA0LDB4OTIsMHgyNiwweDAwLDB4MDEsMHgwMSwweDAyLDB4MTAsMHgyMSwweDhjLDB4NDUsMHgwMCwweDE4LAorMHgyNywweDgzLDB4OTAsMHgyMCwweDAxLDB4MDMsMHgxOCwweDIxLDB4YTAsMHg2MCwweDAwLDB4MDAsMHhhMCwweDg2LDB4MDAsMHgwNywKKzB4OTQsMHhhMiwweDAwLDB4MTAsMHgyNCwweDAzLDB4MDAsMHgwNCwweDMwLDB4NDIsMHgwMCwweDBmLDB4MTAsMHg0MywweDAwLDB4MzYsCisweDI0LDB4YTUsMHgwMCwweDEwLDB4OTQsMHhhMywweDAwLDB4MTYsMHgyNywweDg3LDB4OTAsMHgxOCwweDAxLDB4MDcsMHgxMCwweDIxLAorMHhhNCwweDQzLDB4MDAsMHgwMiwweDk0LDB4YTIsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHgwMSwKKzB4MTQsMHg0MCwweDAwLDB4MjQsMHgwMiwweDcyLDB4MjAsMHgyMSwweDk0LDB4YTIsMHgwMCwweDAwLDB4MjQsMHgwMywweDAwLDB4YTQsCisweDMwLDB4NDIsMHgwMCwweGZmLDB4MTAsMHg0MywweDAwLDB4MWYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDk0LDB4YTIsMHgwMCwweDAwLAorMHgyNCwweDAzLDB4MDAsMHg4OCwweDMwLDB4NDIsMHgwMCwweDg4LDB4MTAsMHg0MywweDAwLDB4MTQsMHgwMiwweDcyLDB4MTgsMHgyMSwKKzB4MjcsMHg4NCwweDkwLDB4MjAsMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4NjQsMHgxOCwweDIxLDB4OGMsMHg2MiwweDAwLDB4MDAsCisweDNjLDB4MDQsMHgwMCwweDgwLDB4MDAsMHg0NCwweDEwLDB4MjUsMHhhYywweDYyLDB4MDAsMHgwMCwweDAyLDB4NzIsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDcsMHgxMCwweDIxLDB4YTAsMHg1NCwweDAwLDB4MDAsMHg4ZiwweGJmLDB4MDAsMHgzMCwKKzB4N2IsMHhiNiwweDAxLDB4N2MsMHg3YiwweGI0LDB4MDEsMHgzYywweDdiLDB4YjIsMHgwMCwweGZjLDB4N2IsMHhiMCwweDAwLDB4YmMsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgzOCwweDk0LDB4YTIsMHgwMCwweDE4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweDYwLDB4MTAsMHg0MCwweGZmLDB4ZTksMHgwMiwweDcyLDB4MTgsMHgyMSwKKzB4MDIsMHg3MiwweDIwLDB4MjEsMHgyNywweDgyLDB4OTAsMHgyMCwweDAwLDB4MDQsMHgyMCwweDgwLDB4MDAsMHg4MiwweDIwLDB4MjEsCisweDhjLDB4ODMsMHgwMCwweDAwLDB4M2MsMHgwMiwweGZmLDB4N2YsMHgzNCwweDQyLDB4ZmYsMHhmZiwweDAwLDB4NjIsMHgxOCwweDI0LAorMHgwOCwweDAwLDB4MWEsMHgzNywweGFjLDB4ODMsMHgwMCwweDAwLDB4MjcsMHg4NywweDkwLDB4MTgsMHgwMSwweDA3LDB4MTAsMHgyMSwKKzB4MDgsMHgwMCwweDFhLDB4MjEsMHhhNCwweDQwLDB4MDAsMHgwMiwweDExLDB4NDIsMHgwMCwweDA3LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDJkLDB4NDIsMHgwMCwweDAyLDB4MTQsMHg0MCwweGZmLDB4YTcsMHgwMCwweGEwLDB4MjAsMHgyMSwweDk2LDB4MjIsMHgwMCwweDA0LAorMHgwOCwweDAwLDB4MTksMHhmZiwweDI0LDB4NDIsMHgwMCwweDBjLDB4OTYsMHgyMiwweDAwLDB4MDQsMHgwOCwweDAwLDB4MTksMHhmZiwKKzB4MjQsMHg0MiwweDAwLDB4MDgsMHgxNiwweGU2LDB4ZmYsMHg5NiwweDNjLDB4MDIsMHhmZiwweGZiLDB4OGQsMHg2MywweDAwLDB4MTgsCisweDM0LDB4NDIsMHhmZiwweGZmLDB4MDIsMHgwMiwweDEwLDB4MjQsMHhhYywweDYyLDB4MDAsMHgwOCwweDA4LDB4MDAsMHgxOSwweGY4LAorMHgwMCwweDAwLDB4MzAsMHgyMSwweDE2LDB4ZTYsMHhmZiwweDRlLDB4MDAsMHg2MCwweDI4LDB4MjEsMHgzYywweDAyLDB4ZmIsMHhmZiwKKzB4MzQsMHg0MiwweGZmLDB4ZmYsMHgwMiwweDAyLDB4MTAsMHgyNCwweGFjLDB4ZTIsMHgwMCwweDA4LDB4MDgsMHgwMCwweDE5LDB4YjcsCisweDAwLDB4MDAsMHgzMCwweDIxLDB4OTMsMHg4NywweGJiLDB4MTQsMHgwMCwweDEwLDB4MWUsMHg0MiwweDAwLDB4MTAsMHgyNiwweDgyLAorMHgyNywweDgyLDB4OTAsMHgwOCwweDJjLDB4ZTUsMHgwMCwweDBjLDB4MDEsMHgyMiwweDQ4LDB4MjEsMHgzMCwweDYzLDB4MDAsMHgwMSwKKzB4MzAsMHg4NiwweDAwLDB4MDEsMHgxNCwweGEwLDB4MDAsMHgwNiwweDAwLDB4ZTAsMHg0MCwweDIxLDB4MDAsMHgwMywweDEwLDB4NDAsCisweDAwLDB4NDYsMHgxMCwweDIxLDB4MDAsMHgwMiwweDExLDB4MDAsMHgwMCwweGUyLDB4MTAsMHgyMSwweDI0LDB4NDgsMHgwMCwweDA0LAorMHgwMiwweDcyLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MjcsMHg4NCwweDkwLDB4MTAsMHgyNywweDgzLDB4OTAsMHgwOCwKKzB4MDAsMHg0NCwweDIwLDB4MjEsMHgwMCwweDQzLDB4MTAsMHgyMSwweGExLDB4MjgsMHgwMCwweDA3LDB4YTAsMHg0MCwweDAwLDB4MDYsCisweGEwLDB4ODAsMHgwMCwweDAyLDB4MDgsMHgwMCwweDE5LDB4YzcsMHhhMCwweDgwLDB4MDAsMHgwMSwweDI0LDB4MDIsMHgwMCwweDAxLAorMHhhNiwweDIyLDB4MDAsMHgwMiwweDBjLDB4MDAsMHgwMSwweGMyLDB4MDAsMHhlMCwweDIwLDB4MjEsMHgwOCwweDAwLDB4MWEsMHgzYiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweGE3LDB4ZmYsMHhmZiwweDAwLDB4MDcsMHgxOCwweGMwLDB4MDAsMHg2NywweDE4LDB4MjEsCisweDNjLDB4MDYsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgyNCwweDQyLDB4NmEsMHg0NCwweDI3LDB4ODUsMHg5MCwweDEwLAorMHgwMCwweDAzLDB4MTgsMHg4MCwweDM0LDB4YzYsMHgwMCwweDIwLDB4MDAsMHg2NSwweDE4LDB4MjEsMHhhYywweGMyLDB4MDAsMHgwMCwKKzB4ODAsMHg2MiwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDI5LDB4MDAsMHg4MCwweDI4LDB4MjEsCisweDkwLDB4ODIsMHgwMCwweDE2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzNCwweDQyLDB4MDAsMHgwMiwweDMwLDB4NDMsMHgwMCwweDAxLAorMHgxNCwweDYwLDB4MDAsMHgwMiwweGEwLDB4ODIsMHgwMCwweDE2LDB4YTAsMHg4MCwweDAwLDB4MTcsMHg5MCwweGEyLDB4MDAsMHgwNCwKKzB4M2MsMHgwMywweGIwLDB4MDMsMHgyNywweDg2LDB4OTAsMHgwMCwweDE0LDB4NDAsMHgwMCwweDA2LDB4MzQsMHg2MywweDAwLDB4MjAsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4YTAsMHhhMiwweDAwLDB4MDQsMHhhNCwweGE3LDB4MDAsMHgwMiwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHhhNCwweGE3LDB4MDAsMHgwMCwweDk0LDB4YTQsMHgwMCwweDAyLDB4M2MsMHgwMiwweDgwLDB4MDEsMHgyNCwweDQyLDB4ODIsMHg2YywKKzB4YWMsMHg2MiwweDAwLDB4MDAsMHgwMCwweDA0LDB4MTgsMHhjMCwweDAwLDB4NjQsMHgxOCwweDIxLDB4MDAsMHgwMywweDE4LDB4ODAsCisweDAwLDB4NjYsMHgxOCwweDIxLDB4OTQsMHg2MiwweDAwLDB4MDQsMHhhNCwweDY3LDB4MDAsMHgwMiwweDNjLDB4MDMsMHhiMCwweDA4LAorMHgwMCwweDAyLDB4MjAsMHhjMCwweDAwLDB4ODIsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ2LDB4MTAsMHgyMSwKKzB4MDAsMHg4MywweDIwLDB4MjEsMHhhNCwweDQ3LDB4MDAsMHgwMCwweGFjLDB4ODcsMHgwMCwweDAwLDB4OTAsMHhhMiwweDAwLDB4MDQsCisweGE0LDB4YTcsMHgwMCwweDAyLDB4MjQsMHg0MiwweDAwLDB4MDEsMHgwMywweGUwLDB4MDAsMHgwOCwweGEwLDB4YTIsMHgwMCwweDA0LAorMHg5MCwweDgyLDB4MDAsMHgxNiwweDI0LDB4ODUsMHgwMCwweDA2LDB4MzQsMHg0MiwweDAwLDB4MDEsMHgzMCwweDQzLDB4MDAsMHgwMiwKKzB4MTQsMHg2MCwweGZmLDB4ZGEsMHhhMCwweDgyLDB4MDAsMHgxNiwweDI0LDB4MDIsMHgwMCwweDAxLDB4MDgsMHgwMCwweDFhLDB4YTcsCisweGEwLDB4ODIsMHgwMCwweDE3LDB4MjcsMHhiZCwweGZmLDB4ZTgsMHhhZiwweGJmLDB4MDAsMHgxMCwweDAwLDB4ODAsMHgzOCwweDIxLAorMHg4NCwweDg0LDB4MDAsMHgwMiwweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgzYywweDBhLDB4YjAsMHgwNiwKKzB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4NmIsMHg0NCwweDNjLDB4MGIsMHhiMCwweDA4LDB4MjcsMHg4OSwweDkwLDB4MDAsCisweDM0LDB4MGMsMHhmZiwweGZmLDB4MzUsMHg0YSwweDgwLDB4MjAsMHgxMCwweDgwLDB4MDAsMHgzMCwweGFjLDB4NjIsMHgwMCwweDAwLAorMHg5NywweDgyLDB4OGYsMHhmMCwweDk0LDB4ZTYsMHgwMiwweGJhLDB4MDAsMHgwMiwweDE4LDB4YzAsMHgwMCwweDZiLDB4MjgsMHgyMSwKKzB4YWMsMHhhNiwweDAwLDB4MDAsMHg4YywweGU0LDB4MDIsMHhiOCwweDAwLDB4NjIsMHgxOCwweDIxLDB4MDAsMHgwMywweDE4LDB4ODAsCisweDAwLDB4MDQsMHgxMCwweGMwLDB4MDAsMHg0NCwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDksMHgxMCwweDIxLAorMHg5NCwweDQ4LDB4MDAsMHgwNCwweDAwLDB4NjksMHgxOCwweDIxLDB4YTQsMHg2NiwweDAwLDB4MDAsMHgwMCwweDA4LDB4MjgsMHhjMCwKKzB4MDAsMHhhYiwweDEwLDB4MjEsMHhhYywweDRjLDB4MDAsMHgwMCwweDhjLDB4ZTQsMHgwMiwweGI4LDB4MjcsMHg4MiwweDkwLDB4MDQsCisweDAwLDB4YTgsMHgyOCwweDIxLDB4MDAsMHgwNCwweDE4LDB4YzAsMHgwMCwweDY0LDB4MTgsMHgyMSwweDAwLDB4MDMsMHgxOCwweDgwLAorMHgwMCwweDYyLDB4MTAsMHgyMSwweDhjLDB4NDYsMHgwMCwweDE4LDB4MjcsMHg4NCwweDkwLDB4MTAsMHgwMCwweDY0LDB4MTgsMHgyMSwKKzB4OGMsMHhjMiwweDAwLDB4MDAsMHg4MCwweDY3LDB4MDAsMHgwNiwweDAwLDB4MDUsMHgyOCwweDgwLDB4MzAsMHg0MiwweGZmLDB4ZmYsCisweDAwLDB4NDcsMHgxMCwweDIxLDB4MzAsMHg0MywweDAwLDB4ZmYsMHgwMCwweDAzLDB4MTgsMHgyYiwweDAwLDB4MDIsMHgxMiwweDAyLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDNjLDB4MDQsMHgwMCwweDA0LDB4MDAsMHhhOSwweDI4LDB4MjEsMHgwMCwweDQ0LDB4MTAsMHgyNSwKKzB4YTQsMHhhYywweDAwLDB4MDAsMHhhZCwweDQyLDB4MDAsMHgwMCwweGE3LDB4ODgsMHg4ZiwweGYwLDB4OGYsMHhiZiwweDAwLDB4MTAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgxOCwweDg0LDB4ZTMsMHgwMCwweDA2LAorMHgyNywweDgyLDB4YjQsMHgwMCwweDk0LDB4ZTUsMHgwMiwweGJhLDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDYyLDB4MTgsMHgyMSwKKzB4OGMsMHg2NCwweDAwLDB4MDAsMHgwYywweDAwLDB4MWEsMHg5MSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDFiLDB4MGIsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OTQsMHg4OCwweDAwLDB4MDAsMHgwMCwweDgwLDB4NTgsMHgyMSwweDI3LDB4OGEsMHg5MCwweDAwLAorMHgwMCwweDA4LDB4MTgsMHhjMCwweDAwLDB4NjgsMHgxOCwweDIxLDB4M2MsMHgwNCwweGIwLDB4MDMsMHgwMCwweDAzLDB4MTgsMHg4MCwKKzB4M2MsMHgwMiwweDgwLDB4MDAsMHgwMCwweDZhLDB4MTgsMHgyMSwweDM0LDB4ODQsMHgwMCwweDIwLDB4MjQsMHg0MiwweDZjLDB4NjQsCisweDMwLDB4YTUsMHhmZiwweGZmLDB4YWMsMHg4MiwweDAwLDB4MDAsMHg5NCwweDY3LDB4MDAsMHgwMiwweDExLDB4MDUsMHgwMCwweDM1LAorMHgyNCwweDA0LDB4MDAsMHgwMSwweDkxLDB4NjYsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDg2LDB4MTAsMHgyYSwKKzB4MTAsMHg0MCwweDAwLDB4MTAsMHgwMCwweGMwLDB4NDgsMHgyMSwweDNjLDB4MGQsMHhiMCwweDAzLDB4MDEsMHg0MCwweDYwLDB4MjEsCisweDM1LDB4YWQsMHgwMCwweDIwLDB4MTAsMHhlNSwweDAwLDB4MGQsMHgyNCwweDg0LDB4MDAsMHgwMSwweDAwLDB4MDcsMHgxMCwweGMwLAorMHgwMCwweDQ3LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDEsMHgyMCwweDMwLDB4MjEsMHgwMCwweDRhLDB4MTAsMHgyMSwKKzB4MDAsMHg4NiwweDE4LDB4MmEsMHgwMCwweGUwLDB4NDAsMHgyMSwweDk0LDB4NDcsMHgwMCwweDAyLDB4MTQsMHg2MCwweGZmLDB4ZjUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MTAsMHgyMSwweDAwLDB4MDgsMHgyMCwweGMwLAorMHgwMCwweDg4LDB4MjAsMHgyMSwweDI0LDB4YzIsMHhmZiwweGZmLDB4MDAsMHgwNCwweDIwLDB4ODAsMHhhMSwweDYyLDB4MDAsMHgwNCwKKzB4MDAsMHg4YywweDIwLDB4MjEsMHg5NCwweDgzLDB4MDAsMHgwNCwweDAwLDB4MDcsMHgxMCwweGMwLDB4MDAsMHg0NywweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0YywweDEwLDB4MjEsMHgwMCwweDAzLDB4MjgsMHhjMCwweDk0LDB4NDYsMHgwMCwweDAyLAorMHgwMCwweGEzLDB4MTgsMHgyMSwweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHg2YywweDE4LDB4MjEsMHhhNCwweDY2LDB4MDAsMHgwMCwKKzB4YTQsMHg4NiwweDAwLDB4MDIsMHg5NSwweDY0LDB4MDAsMHgwMiwweDNjLDB4MDMsMHhiMCwweDA4LDB4M2MsMHgwMiwweDgwLDB4MDEsCisweDAwLDB4YTMsMHgyOCwweDIxLDB4MjQsMHg0MiwweDgyLDB4NmMsMHhhZCwweGEyLDB4MDAsMHgwMCwweDEwLDB4ODcsMHgwMCwweDAzLAorMHhhYywweGE2LDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjQsMHgwMiwweDAwLDB4MDEsMHgwOCwweDAwLDB4MWIsMHg1OSwKKzB4YTUsMHg2OCwweDAwLDB4MDIsMHg5MSwweDYyLDB4MDAsMHgwNCwweGE1LDB4NjcsMHgwMCwweDAwLDB4MjQsMHg0MiwweGZmLDB4ZmYsCisweDMwLDB4NDMsMHgwMCwweGZmLDB4MTQsMHg2MCwweGZmLDB4ZjcsMHhhMSwweDYyLDB4MDAsMHgwNCwweDI0LDB4MDIsMHhmZiwweGZmLAorMHgwOCwweDAwLDB4MWIsMHg1OSwweGE1LDB4NjIsMHgwMCwweDAyLDB4MDAsMHgwNSwweDQwLDB4YzAsMHgwMSwweDA1LDB4MzAsMHgyMSwKKzB4MjcsMHhiZCwweGZmLDB4ZDgsMHgwMCwweDA2LDB4MzAsMHg4MCwweDI3LDB4ODIsMHg5MCwweDA0LDB4YWYsMHhiMiwweDAwLDB4MTgsCisweGFmLDB4YjEsMHgwMCwweDE0LDB4YWYsMHhiZiwweDAwLDB4MjAsMHhhZiwweGIzLDB4MDAsMHgxYywweGFmLDB4YjAsMHgwMCwweDEwLAorMHgwMCwweGMyLDB4MTAsMHgyMSwweDhjLDB4NDcsMHgwMCwweDE4LDB4MDAsMHhhMCwweDkwLDB4MjEsMHgzYywweDAyLDB4ODAsMHgwMCwKKzB4M2MsMHgwNSwweGIwLDB4MDMsMHgzNCwweGE1LDB4MDAsMHgyMCwweDI0LDB4NDIsMHg2ZCwweDk4LDB4YWMsMHhhMiwweDAwLDB4MDAsCisweDI3LDB4ODMsMHg5MCwweDEwLDB4MDAsMHhjMywweDMwLDB4MjEsMHg4YywweGUyLDB4MDAsMHgwMCwweDgwLDB4YzUsMHgwMCwweDA2LAorMHgwMCwweDgwLDB4ODgsMHgyMSwweDMwLDB4NDIsMHhmZiwweGZmLDB4MDAsMHg0NSwweDEwLDB4MjEsMHgzMCwweDQzLDB4MDAsMHhmZiwKKzB4MTAsMHg2MCwweDAwLDB4MDIsMHgwMCwweDAyLDB4MTIsMHgwMiwweDI0LDB4NDIsMHgwMCwweDAxLDB4MzAsMHg1MywweDAwLDB4ZmYsCisweDAxLDB4MTIsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgyNywweDgzLDB4OTAsMHgxMCwweDAwLDB4NDMsMHgxMCwweDIxLAorMHg4MCwweDQ0LDB4MDAsMHgwNywweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg4MCwweDAwLDB4NGIsMHgyNiwweDI0LDB4MDAsMHgwNiwKKzB4MzIsMHg1MCwweGZmLDB4ZmYsMHgwMiwweDIwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgxYiwweDE5LDB4MDIsMHgwMCwweDI4LDB4MjEsCisweDkyLDB4MjIsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgyZSwweDNjLDB4MDMsMHhiMCwweDA4LAorMHgzYywweDA5LDB4ODAsMHgwMSwweDI3LDB4ODgsMHg5MCwweDAwLDB4YTYsMHgzMiwweDAwLDB4MGMsMHgwMCwweDEwLDB4MjAsMHhjMCwKKzB4MDAsMHg5MCwweDIwLDB4MjEsMHgwMCwweDA0LDB4MjAsMHg4MCwweDAwLDB4ODgsMHgyMCwweDIxLDB4OTQsMHg4MiwweDAwLDB4MDQsCisweDNjLDB4MDMsMHhiMCwweDA4LDB4M2MsMHgwNywweGIwLDB4MDMsMHgwMCwweDAyLDB4MjgsMHhjMCwweDAwLDB4YTIsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDgsMHgxMCwweDIxLDB4MDAsMHhhMywweDI4LDB4MjEsMHgyNSwweDI2LDB4ODIsMHg2YywKKzB4MzQsMHgwMywweGZmLDB4ZmYsMHgzNCwweGU3LDB4MDAsMHgyMCwweGFjLDB4ZTYsMHgwMCwweDAwLDB4YTQsMHg4MywweDAwLDB4MDIsCisweGE0LDB4NDMsMHgwMCwweDAwLDB4YWMsMHhhMywweDAwLDB4MDAsMHg5MiwweDIyLDB4MDAsMHgxMCwweDkyLDB4MjMsMHgwMCwweDBhLAorMHhhNiwweDMyLDB4MDAsMHgwZSwweDAyLDB4NjIsMHgxMCwweDIxLDB4MTQsMHg2MCwweDAwLDB4MDUsMHhhMiwweDIyLDB4MDAsMHgxMCwKKzB4OTIsMHgyMiwweDAwLDB4MTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweGZlLDB4YTIsMHgyMiwweDAwLDB4MTYsCisweDkyLDB4MjIsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5MiwweDIyLDB4MDAsMHgxNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4ZmQsMHhhMiwweDIyLDB4MDAsMHgxNiwKKzB4OGYsMHhiZiwweDAwLDB4MjAsMHg3YiwweGIyLDB4MDAsMHhmYywweDdiLDB4YjAsMHgwMCwweGJjLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDI4LDB4OTYsMHgyMiwweDAwLDB4MGUsMHgyNywweDg4LDB4OTAsMHgwMCwweDAwLDB4MDIsMHgyMCwweGMwLAorMHgwMCwweDgyLDB4MjAsMHgyMSwweDAwLDB4MDQsMHgyMCwweDgwLDB4MDAsMHg4OCwweDIwLDB4MjEsMHg5NCwweDgyLDB4MDAsMHgwNCwKKzB4M2MsMHgwNiwweGIwLDB4MDMsMHgzYywweDA5LDB4ODAsMHgwMSwweDAwLDB4MDIsMHgyOCwweGMwLDB4MDAsMHhhMiwweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHhhMywweDI4LDB4MjEsMHgwMCwweDQ4LDB4MTAsMHgyMSwweDM0LDB4YzYsMHgwMCwweDIwLAorMHgyNSwweDIzLDB4ODIsMHg2YywweGFjLDB4YzMsMHgwMCwweDAwLDB4YTQsMHg1MCwweDAwLDB4MDAsMHhhYywweGIwLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDFiLDB4OTcsMHhhNCwweDkwLDB4MDAsMHgwMiwweDA4LDB4MDAsMHgxYiwweDhlLDB4MzIsMHg1MCwweGZmLDB4ZmYsCisweDNjLDB4MDMsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgyNCwweDQyLDB4NmYsMHg2MCwweDM0LDB4NjMsMHgwMCwweDIwLAorMHhhYywweDYyLDB4MDAsMHgwMCwweDkwLDB4ODIsMHgwMCwweDA0LDB4OTcsMHhhYSwweDAwLDB4MTIsMHgwMCwweDgwLDB4NjAsMHgyMSwKKzB4MzAsMHhhOCwweGZmLDB4ZmYsMHgwMCwweDRhLDB4MjAsMHgyMywweDM0LDB4MDksMHhmZiwweGZmLDB4MzAsMHhjZiwweGZmLDB4ZmYsCisweDMwLDB4ZWUsMHhmZiwweGZmLDB4MTEsMHgwOSwweDAwLDB4NzMsMHhhMSwweDg0LDB4MDAsMHgwNCwweDAwLDB4MGUsMHhjMCwweGMwLAorMHgwMCwweDA4LDB4MTAsMHhjMCwweDAwLDB4NDgsMHgxMCwweDIxLDB4MDMsMHgwZSwweDIwLDB4MjEsMHgyNywweDhkLDB4OTAsMHgwMCwKKzB4MDAsMHgwNCwweDIwLDB4ODAsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NGQsMHgxMCwweDIxLDB4MDAsMHg4ZCwweDIwLDB4MjEsCisweDk0LDB4ODYsMHgwMCwweDAyLDB4OTQsMHg0MywweDAwLDB4MDQsMHgzYywweDE5LDB4ODAsMHgwMSwweGE0LDB4NDYsMHgwMCwweDAyLAorMHgwMCwweDAzLDB4MjgsMHhjMCwweDAwLDB4YTMsMHgxOCwweDIxLDB4OTQsMHg4NywweDAwLDB4MDIsMHgzYywweDAyLDB4YjAsMHgwOCwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweGEyLDB4MjgsMHgyMSwweDAwLDB4NmQsMHgxOCwweDIxLDB4MjcsMHgyMiwweDgyLDB4NmMsCisweDNjLDB4MDEsMHhiMCwweDAzLDB4YWMsMHgyMiwweDAwLDB4MjAsMHhhNCwweDY2LDB4MDAsMHgwMCwweDEwLDB4ZTksMHgwMCwweDU3LAorMHhhYywweGE2LDB4MDAsMHgwMCwweDAxLDB4ZTAsMHgzMCwweDIxLDB4MTEsMHg0MCwweDAwLDB4MWQsMHgwMCwweDAwLDB4NDgsMHgyMSwKKzB4MDEsMHg0MCwweDM4LDB4MjEsMHgyNywweDhiLDB4OTAsMHgwNCwweDI3LDB4OGEsMHg5MCwweDEwLDB4MDAsMHgwNiwweDQwLDB4YzAsCisweDAxLDB4MDYsMHgxOCwweDIxLDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDZiLDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDE4LAorMHgwMCwweDZhLDB4MTgsMHgyMSwweDgwLDB4NjUsMHgwMCwweDA2LDB4OGMsMHg4MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg0MiwweGZmLDB4ZmYsMHgwMCwweDQ1LDB4MTAsMHgyMSwweDMwLDB4NDQsMHgwMCwweGZmLDB4MDAsMHgwMiwweDEyLDB4MDIsCisweDAxLDB4MjIsMHgxOCwweDIxLDB4MjQsMHg2MiwweDAwLDB4MDEsMHgxNCwweDgwLDB4MDAsMHgwMiwweDMwLDB4NDksMHgwMCwweGZmLAorMHgzMCwweDY5LDB4MDAsMHhmZiwweDAxLDB4MDYsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDRkLDB4MTAsMHgyMSwKKzB4MjQsMHhlNywweGZmLDB4ZmYsMHg5NCwweDQ2LDB4MDAsMHgwMiwweDE0LDB4ZTAsMHhmZiwweGU5LDB4MDAsMHgwNiwweDQwLDB4YzAsCisweDkxLDB4ODIsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgyMCwweDNjLDB4MDYsMHhiMCwweDAzLAorMHhhNSwweDhmLDB4MDAsMHgwYywweDAzLDB4MGUsMHgyMCwweDIxLDB4MDAsMHgwNCwweDIwLDB4ODAsMHgwMCwweDhkLDB4MjAsMHgyMSwKKzB4OTQsMHg4MiwweDAwLDB4MDQsMHgzYywweDAzLDB4YjAsMHgwOCwweDNjLDB4MDcsMHhiMCwweDAzLDB4MDAsMHgwMiwweDI4LDB4YzAsCisweDAwLDB4YTIsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDRkLDB4MTAsMHgyMSwweDAwLDB4YTMsMHgyOCwweDIxLAorMHgyNywweDI2LDB4ODIsMHg2YywweDM0LDB4MDMsMHhmZiwweGZmLDB4MzQsMHhlNywweDAwLDB4MjAsMHhhYywweGU2LDB4MDAsMHgwMCwKKzB4YTQsMHg4MywweDAwLDB4MDIsMHhhNCwweDQzLDB4MDAsMHgwMCwweGFjLDB4YTMsMHgwMCwweDAwLDB4OTEsMHg4MiwweDAwLDB4MTAsCisweDkxLDB4ODMsMHgwMCwweDA0LDB4YTUsMHg4ZSwweDAwLDB4MGUsMHgwMSwweDIyLDB4MTAsMHgyMSwweDE0LDB4NjAsMHgwMCwweDA1LAorMHhhMSwweDgyLDB4MDAsMHgxMCwweDkxLDB4ODIsMHgwMCwweDE2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHhmZCwKKzB4YTEsMHg4MiwweDAwLDB4MTYsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTUsMHg4MiwweDAwLDB4MGUsCisweDNjLDB4MDMsMHhiMCwweDA4LDB4MDAsMHgwMiwweDIwLDB4YzAsMHgwMCwweDgyLDB4MjAsMHgyMSwweDAwLDB4MDQsMHgyMCwweDgwLAorMHgwMCwweDhkLDB4MjAsMHgyMSwweDk0LDB4ODIsMHgwMCwweDA0LDB4MzQsMHhjNiwweDAwLDB4MjAsMHgyNywweDI3LDB4ODIsMHg2YywKKzB4MDAsMHgwMiwweDI4LDB4YzAsMHgwMCwweGEyLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHhhMywweDI4LDB4MjEsCisweDAwLDB4NGQsMHgxMCwweDIxLDB4YWMsMHhjNywweDAwLDB4MDAsMHhhNCwweDhmLDB4MDAsMHgwMiwweGE0LDB4NGYsMHgwMCwweDAwLAorMHhhYywweGFmLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxYywweDI2LDB4MDMsMHgwZSwweDIwLDB4MjEsMHgwOCwweDAwLDB4MWMsMHgwMSwKKzB4YTUsMHg4OCwweDAwLDB4MDIsMHgwMCwweDBlLDB4YzAsMHhjMCwweDAzLDB4MGUsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDI3LDB4OGQsMHg5MCwweDAwLDB4MDAsMHg0ZCwweDEwLDB4MjEsMHg5NCwweDQzLDB4MDAsMHgwMiwweDMwLDB4ODQsMHgwMCwweGZmLAorMHgxNCwweDgwLDB4MDAsMHgwNSwweGE1LDB4ODMsMHgwMCwweDAwLDB4MjQsMHgwMiwweGZmLDB4ZmYsMHgzYywweDE5LDB4ODAsMHgwMSwKKzB4MDgsMHgwMCwweDFjLDB4MDEsMHhhNSwweDgyLDB4MDAsMHgwMiwweDA4LDB4MDAsMHgxYywweDAxLDB4M2MsMHgxOSwweDgwLDB4MDEsCisweDNjLDB4MDgsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDAsMHgyNywweGJkLDB4ZmYsMHg3OCwweDM1LDB4MDgsMHgwMCwweDIwLAorMHgyNCwweDQyLDB4NzEsMHhhMCwweGFmLDB4YjIsMHgwMCwweDY4LDB4YWYsMHhiMSwweDAwLDB4NjQsMHhhZiwweGIwLDB4MDAsMHg2MCwKKzB4YWQsMHgwMiwweDAwLDB4MDAsMHhhZiwweGJmLDB4MDAsMHg4NCwweGFmLDB4YmUsMHgwMCwweDgwLDB4YWYsMHhiNywweDAwLDB4N2MsCisweGFmLDB4YjYsMHgwMCwweDc4LDB4YWYsMHhiNSwweDAwLDB4NzQsMHhhZiwweGI0LDB4MDAsMHg3MCwweGFmLDB4YjMsMHgwMCwweDZjLAorMHhhZiwweGE0LDB4MDAsMHg4OCwweDkwLDB4ODMsMHgwMCwweDBhLDB4MjcsMHg4MiwweGI0LDB4MDAsMHhhZiwweGE2LDB4MDAsMHg5MCwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDYyLDB4MTgsMHgyMSwweDhjLDB4NjMsMHgwMCwweDAwLDB4YWYsMHhhNywweDAwLDB4OTQsCisweDI3LDB4ODYsMHg5MCwweDA0LDB4YWYsMHhhMywweDAwLDB4MWMsMHg5NCwweDYzLDB4MDAsMHgxNCwweDMwLDB4YjEsMHhmZiwweGZmLAorMHgyNCwweDA4LDB4MDAsMHgwMSwweDAwLDB4MDMsMHgyMCwweGMwLDB4YWYsMHhhMywweDAwLDB4MTgsMHgwMCwweDgzLDB4MTgsMHgyMSwKKzB4YWYsMHhhNCwweDAwLDB4NTQsMHgwMCwweDAzLDB4MTgsMHg4MCwweDI3LDB4ODQsMHg5MCwweDEwLDB4MDAsMHg2NCwweDIwLDB4MjEsCisweDgwLDB4ODIsMHgwMCwweDA2LDB4MDAsMHg2NiwweDE4LDB4MjEsMHg4YywweDY2LDB4MDAsMHgxOCwweDI0LDB4NDIsMHgwMCwweDAyLAorMHgwMCwweDAyLDB4MWYsMHhjMiwweDhjLDB4YzQsMHgwMCwweDA4LDB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg0MywKKzB4MDAsMHgwMiwweDEwLDB4NDAsMHgwMCwweDA0LDB4MmYsMHhjMiwweDAwLDB4MDQsMHgxYywweDgyLDB4MDAsMHhjMiwweDM4LDB4MjEsCisweDAwLDB4MDQsMHgyNCwweDQyLDB4OGYsMHhhMiwweDAwLDB4MWMsMHgzMCwweDYzLDB4MDAsMHgwMSwweDMwLDB4ODQsMHgwMCwweDAxLAorMHhhZiwweGE1LDB4MDAsMHgzYywweGFmLDB4YTMsMHgwMCwweDM0LDB4YWYsMHhhNCwweDAwLDB4MzgsMHhhZiwweGEwLDB4MDAsMHg0MCwKKzB4YWYsMHhhMCwweDAwLDB4NDQsMHhhZiwweGEwLDB4MDAsMHg1MCwweGFmLDB4YTgsMHgwMCwweDIwLDB4ODAsMHg0MiwweDAwLDB4MTIsCisweDhmLDB4YjIsMHgwMCwweDE4LDB4YWYsMHhhMiwweDAwLDB4MjgsMHg4YywweGQwLDB4MDAsMHgwYywweDE0LDB4YTAsMHgwMSwweGU0LAorMHgwMCwweDYwLDB4MzAsMHgyMSwweDAwLDB4MTAsMHgxMCwweDgyLDB4MzAsMHg0NSwweDAwLDB4MDcsMHgxMCwweGEwLDB4MDAsMHgxMSwKKzB4YWYsMHhhMCwweDAwLDB4MzAsMHg4ZiwweGE0LDB4MDAsMHg5OCwweDI3LDB4ODIsMHg4MCwweDFjLDB4MDAsMHgwNCwweDE4LDB4NDAsCisweDAwLDB4NjIsMHgxOCwweDIxLDB4MjQsMHhhMiwweDAwLDB4MDYsMHg4ZiwweGE1LDB4MDAsMHgyMCwweDk0LDB4NjQsMHgwMCwweDAwLAorMHgwMCwweDQ1LDB4MTAsMHgwNCwweDAwLDB4NDQsMHgwMCwweDFhLDB4MTQsMHg4MCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwNywweDAwLDB4MGQsMHgwMCwweDAwLDB4MTAsMHgxMiwweDI0LDB4NDIsMHgwMCwweDIwLDB4MzAsMHg0MiwweGZmLDB4ZmMsCisweGFmLDB4YTIsMHgwMCwweDMwLDB4OGYsMHhhMywweDAwLDB4MTgsMHg4ZiwweGE0LDB4MDAsMHgyOCwweDM0LDB4MDIsMHhmZiwweGZmLAorMHhhZiwweGEwLDB4MDAsMHgyYywweGFmLDB4YTIsMHgwMCwweDQ4LDB4YWYsMHhhMywweDAwLDB4NGMsMHgwMCwweDYwLDB4ZjAsMHgyMSwKKzB4MDAsMHgwMCwweGI4LDB4MjEsMHgxOCwweDgwLDB4MDAsMHg0OCwweGFmLDB4YTAsMHgwMCwweDI0LDB4MDAsMHgxMSwweDg5LDB4MDIsCisweGFmLDB4YjEsMHgwMCwweDU4LDB4MDAsMHg4MCwweGE4LDB4MjEsMHgwMCwweDEyLDB4MTAsMHhjMCwweDAwLDB4NTIsMHgxOCwweDIxLAorMHgwMCwweDAzLDB4ODAsMHg4MCwweDI3LDB4ODUsMHg5MCwweDAwLDB4MDIsMHg0MCwweDIwLDB4MjEsMHgwMCwweDQwLDB4YTAsMHgyMSwKKzB4MDIsMHgwNSwweDEwLDB4MjEsMHg5NCwweDU2LDB4MDAsMHgwMiwweDBjLDB4MDAsMHgxMiwweDhiLDB4MDAsMHgwMCwweDI4LDB4MjEsCisweDkwLDB4NDIsMHgwMCwweDAwLDB4MjQsMHgwMywweDAwLDB4MDgsMHgzMCwweDQyLDB4MDAsMHgwYywweDEwLDB4NDMsMHgwMSwweDllLAorMHgyNCwweDA0LDB4MDAsMHgwMSwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHg4MiwweDAxLDB4N2MsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4OGYsMHhhNiwweDAwLDB4ODgsMHgzNCwweDQyLDB4MDEsMHgwNCwweDg0LDB4YzUsMHgwMCwweDBjLDB4MDIsMHg5MiwweDE4LDB4MjEsCisweDk0LDB4NDYsMHgwMCwweDAwLDB4MDAsMHgwNSwweDIwLDB4YzAsMHgwMCwweDg1LDB4MjAsMHgyMSwweDAwLDB4MDMsMHgxOCwweDgwLAorMHgyNywweDgyLDB4OTAsMHgxMCwweDI3LDB4ODUsMHg5MCwweDA4LDB4MDAsMHg2NSwweDI4LDB4MjEsMHgwMCwweDYyLDB4MTgsMHgyMSwKKzB4ODAsMHg3MSwweDAwLDB4MDUsMHg4MCwweDczLDB4MDAsMHgwNCwweDhmLDB4YTMsMHgwMCwweDg4LDB4MzAsMHhkMCwweGZmLDB4ZmYsCisweDAwLDB4MTAsMHgzYSwweDAzLDB4MzIsMHgwOCwweDAwLDB4ZmYsMHgyNywweDgyLDB4OTAsMHgyMCwweDAwLDB4MDQsMHgyMCwweDgwLAorMHg4MCwweGE2LDB4MDAsMHgwNiwweDAwLDB4ODIsMHgyMCwweDIxLDB4YTQsMHg2NywweDAwLDB4NDQsMHhhNCwweDY4LDB4MDAsMHg0NiwKKzB4OGMsMHg4NCwweDAwLDB4MDAsMHgzOCwweGM2LDB4MDAsMHgwMCwweDAxLDB4MDAsMHg4MCwweDIxLDB4MDAsMHgwNCwweDE1LDB4MDIsCisweDMwLDB4NDIsMHgwMCwweDAxLDB4MTAsMHg0MCwweDAwLDB4MDMsMHgwMCwweGU2LDB4ODAsMHgwYSwweDAwLDB4MDQsMHgxNCwweDAyLAorMHgzMCwweDUwLDB4MDAsMHgwZiwweDEyLDB4MjAsMHgwMSwweDUwLDB4MDIsMHg0MCwweDIwLDB4MjEsMHgwMiwweDcxLDB4MTAsMHgyMSwKKzB4MDAsMHg1MCwweDEwLDB4MmEsMHgxNCwweDQwLDB4MDAsMHhlZCwweDAyLDB4OTIsMHgxMCwweDIxLDB4OTMsMHg4MiwweDhiLDB4NzEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MiwweDAwLDB4MDEsMHgxNCwweDQwLDB4MDAsMHhlMCwweDAyLDB4OTIsMHgyOCwweDIxLAorMHgyNiwweGUyLDB4MDAsMHgwMSwweDMwLDB4NTcsMHhmZiwweGZmLDB4MDIsMHg0MCwweGYwLDB4MjEsMHgyNiwweGI1LDB4ZmYsMHhmZiwKKzB4MTYsMHhhMCwweGZmLDB4YmQsMHgwMiwweGMwLDB4OTAsMHgyMSwweDE2LDB4ZTAsMHgwMCwweGQwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhmLDB4YTMsMHgwMCwweDk4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyYywweDYyLDB4MDAsMHgxMCwweDEwLDB4NDAsMHgwMCwweDJlLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4YTQsMHgwMCwweDI0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxOCwweDgwLDB4MDAsMHgyYSwKKzB4MjQsMHgwMywweDAwLDB4MDEsMHg4ZiwweGE1LDB4MDAsMHgxYywweDI3LDB4ODQsMHg5MCwweDA0LDB4OTQsMHhiMiwweDAwLDB4MTQsCisweGEwLDB4YTMsMHgwMCwweDEyLDB4OGYsMHhhNiwweDAwLDB4M2MsMHgwMCwweDEyLDB4MTAsMHhjMCwweDAwLDB4NTIsMHgxMCwweDIxLAorMHgwMCwweDAyLDB4ODAsMHg4MCwweDI3LDB4ODIsMHg5MCwweDEwLDB4MDIsMHgwMiwweDEwLDB4MjEsMHg4MCwweDQzLDB4MDAsMHgwNiwKKzB4MDIsMHgwNCwweDIwLDB4MjEsMHg4YywweDg1LDB4MDAsMHgxOCwweDI0LDB4NjMsMHgwMCwweDAyLDB4MDAsMHgwMywweDE3LDB4YzIsCisweDAwLDB4NjIsMHgxOCwweDIxLDB4MDAsMHgwMywweDE4LDB4NDMsMHgwMCwweDAzLDB4MTgsMHg0MCwweDE0LDB4YzAsMHgwMCwweDBlLAorMHgwMCwweGEzLDB4MzgsMHgyMSwweDI3LDB4ODIsMHg5MCwweDAwLDB4MDIsMHgwMiwweDEwLDB4MjEsMHg5NCwweDQzLDB4MDAsMHgwNiwKKzB4OGYsMHhhOCwweDAwLDB4MWMsMHgyNCwweDAyLDB4MDAsMHgwMSwweGE1LDB4MDMsMHgwMCwweDFhLDB4N2IsMHhiZSwweDA0LDB4M2MsCisweDdiLDB4YjYsMHgwMywweGZjLDB4N2IsMHhiNCwweDAzLDB4YmMsMHg3YiwweGIyLDB4MDMsMHg3YywweDdiLDB4YjAsMHgwMywweDNjLAorMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDg4LDB4OGYsMHhhNCwweDAwLDB4OTgsMHg4ZiwweGE1LDB4MDAsMHgzOCwKKzB4OGYsMHhhNiwweDAwLDB4MzQsMHhhZiwweGEwLDB4MDAsMHgxMCwweDBjLDB4MDAsMHgwOSwweDBhLDB4YWYsMHhhMCwweDAwLDB4MTQsCisweDA4LDB4MDAsMHgxZCwweDJkLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweGEzLDB4MDAsMHg0NCwweDkzLDB4ODIsMHg4MSwweDU4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDYxLDB4MzAsMHg2OSwweDAwLDB4MDMsMHg4ZiwweGE0LDB4MDAsMHgyNCwKKzB4OGYsMHhhNSwweDAwLDB4MjgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODUsMHgxMCwweDJhLDB4MTAsMHg0MCwweDAwLDB4OGYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHhhNiwweDAwLDB4MWMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDkwLDB4YzQsMHgwMCwweDA0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4ODMsMHgwMCwweGZmLDB4MDAsMHhhMywweDEwLDB4MmEsMHgxMCwweDQwLDB4MDAsMHg4NywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZiwweGE4LDB4MDAsMHgyNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTEsMHgwMCwweDAwLDB4ODMsCisweDAwLDB4NjUsMHgxMCwweDIzLDB4MDAsMHhhOCwweDE4LDB4MjMsMHgwMCwweDYyLDB4MTAsMHgyYSwweDE0LDB4NDAsMHgwMCwweDdkLAorMHgzMCwweDYzLDB4MDAsMHhmZiwweDAwLDB4ODUsMHgxMCwweDIzLDB4MzAsMHg0MiwweDAwLDB4ZmYsMHhhZiwweGEyLDB4MDAsMHg1MCwKKzB4OGYsMHhhMiwweDAwLDB4NTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDczLDB4MDAsMHgwMCwweGE4LDB4MjEsCisweDI3LDB4OGMsMHg5MCwweDAwLDB4M2MsMHgwYiwweDgwLDB4ZmYsMHgyNCwweDEwLDB4MDAsMHgwNCwweDI3LDB4OTEsMHg5MCwweDA0LAorMHgzNSwweDZiLDB4ZmYsMHhmZiwweDNjLDB4MGQsMHg3ZiwweDAwLDB4MjcsMHg4ZSwweDkwLDB4MTAsMHgwMSwweDgwLDB4NzgsMHgyMSwKKzB4MDAsMHgxMiwweDMwLDB4YzAsMHgwMCwweGQyLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0YywweDEwLDB4MjEsCisweDk0LDB4NDIsMHgwMCwweDA2LDB4OGYsMHhhMywweDAwLDB4MmMsMHg4ZiwweGE0LDB4MDAsMHgzMCwweGFmLDB4YTIsMHgwMCwweDQ0LAorMHg4ZiwweGE1LDB4MDAsMHg0NCwweDMwLDB4NDksMHgwMCwweDAzLDB4MDIsMHgwOSwweDEwLDB4MjMsMHgzMCwweDQyLDB4MDAsMHgwMywKKzB4MDAsMHhhMiwweDEwLDB4MjEsMHg4ZiwweGE4LDB4MDAsMHgzMCwweDI0LDB4NDIsMHgwMCwweDA0LDB4MzAsMHg0MiwweGZmLDB4ZmYsCisweDAwLDB4NjQsMHgzOCwweDIxLDB4MDEsMHgwMiwweDI4LDB4MjMsMHgwMCwweDYyLDB4MTgsMHgyMSwweDAwLDB4NDgsMHgxMCwweDJiLAorMHgxMCwweDQwLDB4MDAsMHg1MiwweDAwLDB4MDAsMHgyMCwweDIxLDB4MzAsMHhlNywweGZmLDB4ZmYsMHgzMCwweGE0LDB4ZmYsMHhmZiwKKzB4YWYsMHhhNywweDAwLDB4MmMsMHgwMCwweGQyLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg1MSwweDE4LDB4MjEsCisweDhjLDB4NjUsMHgwMCwweDE4LDB4MDAsMHgwNCwweDI1LDB4NDAsMHgwMCwweDhkLDB4MjAsMHgyNCwweDhjLDB4YTgsMHgwMCwweDA0LAorMHgwMCwweDRlLDB4MTgsMHgyMSwweDAwLDB4NGYsMHg1MCwweDIxLDB4MDEsMHgwYiwweDQwLDB4MjQsMHgwMSwweDA0LDB4NDAsMHgyNSwKKzB4YWMsMHhhOCwweDAwLDB4MDQsMHg4ZiwweGE0LDB4MDAsMHg5OCwweDhmLDB4YTIsMHgwMCwweDUwLDB4MjYsMHhiNSwweDAwLDB4MDEsCisweGEwLDB4NjQsMHgwMCwweDAwLDB4OGMsMHhhNCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA0LDB4ODEsMHgwMCwweDBjLAorMHgwMiwweGEyLDB4MzAsMHgyYSwweDgwLDB4NjIsMHgwMCwweDA2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDQyLDB4MDAsMHgwMiwKKzB4MDAsMHgwMiwweDFmLDB4YzIsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDQzLDB4MDAsMHgwMiwweDEwLDB4NDAsCisweDAwLDB4YTIsMHgzOCwweDIxLDB4OGYsMHhhNSwweDAwLDB4NDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGE0LDB4ZTUsMHgwMCwweDAwLAorMHg5NSwweDUyLDB4MDAsMHgwMiwweDE0LDB4YzAsMHhmZiwweGM3LDB4MDAsMHgxMiwweDMwLDB4YzAsMHg4ZiwweGE0LDB4MDAsMHgyNCwKKzB4OGYsMHhhNSwweDAwLDB4NTAsMHg4ZiwweGE2LDB4MDAsMHgxYywweDhmLDB4YTMsMHgwMCwweDJjLDB4MDAsMHg4NSwweDgwLDB4MjEsCisweGEwLDB4ZDAsMHgwMCwweDEyLDB4MDAsMHgwOSwweDEwLDB4MjMsMHgzMCwweDQyLDB4MDAsMHgwMywweDhmLDB4YTgsMHgwMCwweDg4LAorMHgwMCwweDYyLDB4MTAsMHgyMywweGE0LDB4YzIsMHgwMCwweDFhLDB4ODUsMHgwMywweDAwLDB4MGMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDAsMHgwMywweDEwLDB4YzAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLDB4MjcsMHg4MywweDkwLDB4MDQsCisweDAwLDB4NDMsMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4ODMsMHgwMCwweDA0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NjMsMHgwMCwweDEwLDB4MTQsMHg2MCwweGZmLDB4NzQsMHgwMiwweDAwLDB4MTAsMHgyMSwKKzB4OGYsMHhhMywweDAwLDB4NTQsMHg4ZiwweGE0LDB4MDAsMHgxOCwweDhmLDB4YTUsMHgwMCwweDI0LDB4MDAsMHg2NCwweDEwLDB4MjEsCisweDAwLDB4MDIsMHgxMCwweDgwLDB4MjcsMHg4MywweDkwLDB4MTgsMHgwMCwweDQzLDB4MTAsMHgyMSwweDkwLDB4NDQsMHgwMCwweDAwLAorMHgxMCwweGEwLDB4MDAsMHgwMywweDAwLDB4MDAsMHgzMCwweDIxLDB4MDgsMHgwMCwweDFkLDB4MzMsMHgwMiwweDAwLDB4MTAsMHgyMSwKKzB4OTMsMHg4MiwweDgwLDB4MTAsMHgwMCwweDAwLDB4MjgsMHgyMSwweDAwLDB4MDAsMHgzOCwweDIxLDB4MGMsMHgwMCwweDIxLDB4OWEsCisweGFmLDB4YTIsMHgwMCwweDEwLDB4MDgsMHgwMCwweDFkLDB4MzMsMHgwMiwweDAwLDB4MTAsMHgyMSwweDMwLDB4NjMsMHhmZiwweGZmLAorMHgwOCwweDAwLDB4MWQsMHg4NSwweGFmLDB4YTMsMHgwMCwweDJjLDB4OGYsMHhhOCwweDAwLDB4NDQsMHgwOCwweDAwLDB4MWQsMHhhNywKKzB4MzEsMHgwOSwweDAwLDB4MDMsMHgwOCwweDAwLDB4MWQsMHg2MCwweGFmLDB4YTMsMHgwMCwweDUwLDB4OGYsMHhhNiwweDAwLDB4NDQsCisweGFmLDB4YTAsMHgwMCwweDUwLDB4MDgsMHgwMCwweDFkLDB4YTcsMHgzMCwweGM5LDB4MDAsMHgwMywweDhmLDB4YTUsMHgwMCwweDQ4LAorMHg4ZiwweGE2LDB4MDAsMHg0YywweDhmLDB4YTQsMHgwMCwweDFjLDB4MDMsMHhjMCwweDM4LDB4MjEsMHgwYywweDAwLDB4MWIsMHhkOCwKKzB4YWYsMHhiNywweDAwLDB4MTAsMHgwOCwweDAwLDB4MWQsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNSwweDI4LDB4ODAsCisweDI3LDB4ODIsMHg5MCwweDAwLDB4MDAsMHhhMiwweDI4LDB4MjEsMHgwMCwweDAwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgwMSwweDQ5LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgxZCwweDA5LDB4MjYsMHhlMiwweDAwLDB4MDEsMHgwMCwweDAyLDB4ODAsMHg4MCwKKzB4MjcsMHg4MywweDkwLDB4MTAsMHg4ZiwweGE0LDB4MDAsMHgxYywweDAyLDB4MDMsMHgxOCwweDIxLDB4MjYsMHgzMSwweDAwLDB4MDEsCisweDAyLDB4NDAsMHgyOCwweDIxLDB4MGMsMHgwMCwweDFlLDB4ZWEsMHhhMCwweDcxLDB4MDAsMHgwNSwweDE0LDB4NDAsMHhmZiwweDEzLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDE2LDB4ZTAsMHgwMCwweDRkLDB4MDMsMHhjMCwweDM4LDB4MjEsMHg4ZiwweGE0LDB4MDAsMHgyNCwKKzB4OGYsMHhhNSwweDAwLDB4MjAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDI0LDB4ODQsMHgwMCwweDAxLDB4YWYsMHhiMiwweDAwLDB4NDgsCisweGFmLDB4YjYsMHgwMCwweDRjLDB4MDIsMHhjMCwweGYwLDB4MjEsMHgxMCwweGEyLDB4MDAsMHg0MSwweGFmLDB4YTQsMHgwMCwweDI0LAorMHgyNywweDgyLDB4OTAsMHgwMCwweDAyLDB4MDIsMHgxMCwweDIxLDB4OTQsMHg0MiwweDAwLDB4MDYsMHg4ZiwweGE0LDB4MDAsMHgzMCwKKzB4YWYsMHhhMCwweDAwLDB4MjAsMHhhZiwweGEyLDB4MDAsMHg0NCwweDMwLDB4NDksMHgwMCwweDAzLDB4OGYsMHhhOCwweDAwLDB4NDQsCisweDAwLDB4MDksMHgxMCwweDIzLDB4MzAsMHg0MiwweDAwLDB4MDMsMHgwMSwweDAyLDB4MTAsMHgyMSwweDI0LDB4NDIsMHgwMCwweDA0LAorMHgzMCwweDQyLDB4ZmYsMHhmZiwweDAwLDB4NDQsMHgxOCwweDJiLDB4MTAsMHg2MCwweDAwLDB4MmIsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGYsMHhhNSwweDAwLDB4MmMsMHgwMCwweDgyLDB4MTAsMHgyMywweDAwLDB4YTQsMHgxOCwweDIxLDB4MzAsMHg2MywweGZmLDB4ZmYsCisweDMwLDB4NDQsMHhmZiwweGZmLDB4YWYsMHhhMywweDAwLDB4MmMsMHgwMiwweDkyLDB4MjgsMHgyMSwweDAwLDB4MDUsMHgyOCwweDgwLAorMHgyNywweDgyLDB4OTAsMHgwNCwweDAwLDB4YTIsMHgxMCwweDIxLDB4OGMsMHg0NiwweDAwLDB4MTgsMHgzYywweDAzLDB4ODAsMHhmZiwKKzB4M2MsMHgwMiwweDdmLDB4MDAsMHg4YywweGM4LDB4MDAsMHgwNCwweDAwLDB4MDQsMHgyNSwweDQwLDB4MzQsMHg2MywweGZmLDB4ZmYsCisweDAwLDB4ODIsMHgyMCwweDI0LDB4MDEsMHgwMywweDQwLDB4MjQsMHgwMSwweDA0LDB4NDAsMHgyNSwweGFjLDB4YzgsMHgwMCwweDA0LAorMHg4ZiwweGE4LDB4MDAsMHg5OCwweDI3LDB4ODIsMHg5MCwweDEwLDB4MDAsMHhhMiwweDEwLDB4MjEsMHhhMCwweDQ4LDB4MDAsMHgwMCwKKzB4OGMsMHhjNCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgyNywweGMyLDB4MTAsMHg4MCwweGZlLDB4ZGIsCisweGFmLDB4YTQsMHgwMCwweDNjLDB4ODAsMHg0MiwweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NDIsMHgwMCwweDAyLAorMHgwMCwweDAyLDB4MWYsMHhjMiwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4NDMsMHgwMCwweDAyLDB4MTAsMHg0MCwKKzB4MDAsMHhjMiwweDM4LDB4MjEsMHg4ZiwweGEyLDB4MDAsMHg0MCwweDAwLDB4MDAsMHgwMCwweDAwLDB4YTQsMHhlMiwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgxZCwweDBjLDB4MjYsMHhiNSwweGZmLDB4ZmYsMHg4ZiwweGE2LDB4MDAsMHgyYywweDAwLDB4MDAsMHgyMCwweDIxLAorMHgwMCwweGMyLDB4MTAsMHgyMSwweDMwLDB4NDIsMHhmZiwweGZmLDB4MDgsMHgwMCwweDFlLDB4MWEsMHhhZiwweGEyLDB4MDAsMHgyYywKKzB4OGYsMHhhNiwweDAwLDB4MWMsMHgwOCwweDAwLDB4MWUsMHgwNCwweGE0LDB4ZDIsMHgwMCwweDE0LDB4OGYsMHhhNSwweDAwLDB4NDgsCisweDhmLDB4YTYsMHgwMCwweDRjLDB4OGYsMHhhNCwweDAwLDB4MWMsMHgwYywweDAwLDB4MWIsMHhkOCwweGFmLDB4YjcsMHgwMCwweDEwLAorMHgwOCwweDAwLDB4MWQsMHhmYiwweDAwLDB4MDAsMHhiOCwweDIxLDB4MGMsMHgwMCwweDEyLDB4OGIsMHgwMCwweDAwLDB4MjgsMHgyMSwKKzB4MDAsMHg0MCwweDE4LDB4MjEsMHg5NCwweDQyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzQsMHg0MiwweDA4LDB4MDAsCisweGE0LDB4NjIsMHgwMCwweDAwLDB4MDgsMHgwMCwweDFkLDB4MDAsMHgwMiwweDcxLDB4MTAsMHgyMSwweDAyLDB4OTIsMHgxOCwweDIxLAorMHgwMCwweDAzLDB4ODAsMHg4MCwweDI3LDB4ODIsMHg5MCwweDA0LDB4MDIsMHgwMiwweDEwLDB4MjEsMHg4YywweDQ0LDB4MDAsMHgxOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4YywweDgzLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg2MywweDAwLDB4MTAsCisweDEwLDB4NjAsMHgwMCwweDA5LDB4MjQsMHgwNiwweDAwLDB4MDEsMHg5MywweDgyLDB4OGIsMHg3MSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgzMCwweDQyLDB4MDAsMHgwMSwweDEwLDB4NDAsMHhmZSwweGEyLDB4M2MsMHgwNCwweDAwLDB4ODAsMHgyNywweDg1LDB4OTAsMHgwMCwKKzB4MDgsMHgwMCwweDFkLDB4ZWIsMHgwMiwweDA1LDB4MjgsMHgyMSwweDI3LDB4ODMsMHg5MCwweDE4LDB4MjcsMHg4MiwweDkwLDB4MTAsCisweDAyLDB4MDMsMHgxOCwweDIxLDB4MDIsMHgwMiwweDEwLDB4MjEsMHg5MCwweDY0LDB4MDAsMHgwMCwweDkwLDB4NDUsMHgwMCwweDA1LAorMHg5MywweDgzLDB4ODAsMHgxMCwweDAwLDB4MDAsMHgzOCwweDIxLDB4MGMsMHgwMCwweDIxLDB4OWEsMHhhZiwweGEzLDB4MDAsMHgxMCwKKzB4MDgsMHgwMCwweDFlLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4ODIsMHg5MCwweDE4LDB4MDIsMHgwMiwweDEwLDB4MjEsCisweDk0LDB4NDMsMHgwMCwweDAyLDB4OGYsMHhhNiwweDAwLDB4NTgsMHgwMCwweDAzLDB4MTksMHgwMiwweDAwLDB4NjYsMHgxOCwweDIzLAorMHgzMCwweDYzLDB4MGYsMHhmZiwweDI4LDB4NjIsMHgwMCwweDIwLDB4MTAsMHg0MCwweDAwLDB4MDYsMHgyOCwweDYyLDB4MDAsMHg0MCwKKzB4OGYsMHhhOCwweDAwLDB4OTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NjgsMHgxMCwweDA2LDB4MDgsMHgwMCwweDFjLDB4ZDksCisweDMwLDB4NDQsMHgwMCwweDAxLDB4MTAsMHg0MCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4YTQsMHgwMCwweDk0LAorMHgwOCwweDAwLDB4MWUsMHg4MywweDAwLDB4NjQsMHgxMCwweDA2LDB4MDgsMHgwMCwweDFjLDB4ZDksMHgwMCwweDAwLDB4MjAsMHgyMSwKKzB4OGYsMHhhNCwweDAwLDB4OTgsMHg4ZiwweGE1LDB4MDAsMHgzOCwweGFmLDB4YTAsMHgwMCwweDEwLDB4MGMsMHgwMCwweDA5LDB4MGEsCisweGFmLDB4YTgsMHgwMCwweDE0LDB4MzAsMHg0MiwweGZmLDB4ZmYsMHgwOCwweDAwLDB4MWMsMHhhOSwweGFmLDB4YTIsMHgwMCwweDQwLAorMHgzYywweDAyLDB4YjAsMHgwMywweDNjLDB4MDMsMHg4MCwweDAwLDB4MjcsMHhiZCwweGZmLDB4ZTAsMHgzNCwweDQyLDB4MDAsMHgyMCwKKzB4MjQsMHg2MywweDdhLDB4NTAsMHhhZiwweGIxLDB4MDAsMHgxNCwweGFmLDB4YjAsMHgwMCwweDEwLDB4YWYsMHhiZiwweDAwLDB4MTgsCisweGFjLDB4NDMsMHgwMCwweDAwLDB4OTAsMHg4MiwweDAwLDB4MGEsMHgwMCwweDgwLDB4ODAsMHgyMSwweDE0LDB4NDAsMHgwMCwweDQ1LAorMHgwMCwweDAwLDB4ODgsMHgyMSwweDkyLDB4MDIsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgzYywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMiwweDIwLDB4MDAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTIsMHgwMiwweDAwLDB4MTYsCisweDkyLDB4MDUsMHgwMCwweDBhLDB4MzAsMHg0MiwweDAwLDB4ZmMsMHgxMCwweGEwLDB4MDAsMHgwMywweGEyLDB4MDIsMHgwMCwweDE2LAorMHgzNCwweDQyLDB4MDAsMHgwMSwweGEyLDB4MDIsMHgwMCwweDE2LDB4OTIsMHgwNCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHg4MywweDAwLDB4ZmYsMHgxMCwweDYwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTIsMHgwMiwweDAwLDB4MTYsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzQsMHg0MiwweDAwLDB4MDIsMHhhMiwweDAyLDB4MDAsMHgxNiwweDEwLDB4NjAsMHgwMCwweDBhLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4YTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NiwweDAyLDB4MDAsMHgwMCwKKzB4YTIsMHgwMCwweDAwLDB4MTcsMHhhNiwweDAyLDB4MDAsMHgxNCwweDhmLDB4YmYsMHgwMCwweDE4LDB4N2IsMHhiMCwweDAwLDB4YmMsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MjAsMHgxNCwweDgwLDB4MDAsMHgwNSwweDI0LDB4MDIsMHgwMCwweDAxLAorMHg5NiwweDAzLDB4MDAsMHgwNiwweGEyLDB4MDIsMHgwMCwweDE3LDB4MDgsMHgwMCwweDFlLDB4YmUsMHhhNiwweDAzLDB4MDAsMHgxNCwKKzB4OTYsMHgwNCwweDAwLDB4MDAsMHg5NiwweDA1LDB4MDAsMHgwNiwweDI3LDB4ODYsMHg5MCwweDAwLDB4MDAsMHgwNCwweDEwLDB4YzAsCisweDAwLDB4MDUsMHgxOCwweGMwLDB4MDAsMHg0NCwweDEwLDB4MjEsMHgwMCwweDY1LDB4MTgsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4NjYsMHgxOCwweDIxLDB4MDAsMHg0NiwweDEwLDB4MjEsMHg4YywweDY1LDB4MDAsMHgwOCwKKzB4OGMsMHg0NCwweDAwLDB4MDgsMHgwYywweDAwLDB4MTIsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0MywweDAwLDB4ZmYsCisweDEwLDB4NjAsMHgwMCwweDA0LDB4YTIsMHgwMiwweDAwLDB4MTcsMHg5NiwweDAyLDB4MDAsMHgwNiwweDA4LDB4MDAsMHgxZSwweGJlLAorMHhhNiwweDAyLDB4MDAsMHgxNCwweDk2LDB4MDIsMHgwMCwweDAwLDB4MDgsMHgwMCwweDFlLDB4YmUsMHhhNiwweDAyLDB4MDAsMHgxNCwKKzB4OTYsMHgwNSwweDAwLDB4MDAsMHgwYywweDAwLDB4MWUsMHhlYSwweDAyLDB4MDAsMHgyMCwweDIxLDB4MDgsMHgwMCwweDFlLDB4YTUsCisweDAyLDB4MjIsMHg4OCwweDIxLDB4OTQsMHg4NSwweDAwLDB4MDYsMHgwYywweDAwLDB4MWUsMHhlYSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MWUsMHhhMSwweDAwLDB4NDAsMHg4OCwweDIxLDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMCwKKzB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4N2IsMHhhOCwweDI3LDB4YmQsMHhmZiwweGYwLDB4YWMsMHg2MiwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgxMCwweDIxLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgxMCwweDNjLDB4MDMsMHhiMCwweDAzLAorMHgzYywweDAyLDB4ODAsMHgwMCwweDM0LDB4NjMsMHgwMCwweDIwLDB4MjQsMHg0MiwweDdiLDB4Y2MsMHhhYywweDYyLDB4MDAsMHgwMCwKKzB4OTAsMHg4OSwweDAwLDB4MGEsMHgwMCwweDgwLDB4MzAsMHgyMSwweDExLDB4MjAsMHgwMCwweDA1LDB4MDAsMHhhMCwweDUwLDB4MjEsCisweDkwLDB4ODIsMHgwMCwweDE3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgxYiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5MCwweGM3LDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHhlMCwweDAwLDB4MWIsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OTQsMHhjOCwweDAwLDB4MDAsMHgyNywweDgzLDB4OTAsMHgwMCwweDkzLDB4ODUsMHg4YiwweDcwLDB4MDAsMHgwOCwweDEwLDB4YzAsCisweDAwLDB4NDgsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDA4LAorMHgwMCwweGU1LDB4MjgsMHgyYiwweDEwLDB4YTAsMHgwMCwweDA2LDB4MDEsMHg0NCwweDE4LDB4MjMsMHg4ZiwweDgyLDB4OGIsMHg4OCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyYiwweDEwLDB4NDAsMHgwMCwweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDMsMHgwMCwweDEwLDB4YTQsMHhjOCwweDAwLDB4MTQsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4NjAsMHgxMCwweDIxLAorMHgxMSwweDIwLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTQsMHhjMiwweDAwLDB4MDYsMHgyNCwweDAzLDB4MDAsMHgwOCwKKzB4MDgsMHgwMCwweDFmLDB4MTYsMHhhNCwweGMyLDB4MDAsMHgxNCwweDA4LDB4MDAsMHgxZiwweDE2LDB4MDAsMHgwMCwweDE4LDB4MjEsCisweDI3LDB4YmQsMHhmZiwweGM4LDB4YWYsMHhiNSwweDAwLDB4MmMsMHhhZiwweGI0LDB4MDAsMHgyOCwweGFmLDB4YjMsMHgwMCwweDI0LAorMHhhZiwweGIwLDB4MDAsMHgxOCwweGFmLDB4YmYsMHgwMCwweDMwLDB4YWYsMHhiMiwweDAwLDB4MjAsMHhhZiwweGIxLDB4MDAsMHgxYywKKzB4OTQsMHg5MSwweDAwLDB4MDYsMHgwMCwweDgwLDB4YTAsMHgyMSwweDNjLDB4MDIsMHg4MCwweDAwLDB4M2MsMHgwNCwweGIwLDB4MDMsCisweDAwLDB4MTEsMHhhOCwweGMwLDB4MzQsMHg4NCwweDAwLDB4MjAsMHgyNCwweDQyLDB4N2MsMHg4MCwweDAyLDB4YjEsMHg0OCwweDIxLAorMHhhYywweDgyLDB4MDAsMHgwMCwweDAwLDB4MDksMHg0OCwweDgwLDB4MjQsMHgwMywweDAwLDB4MDEsMHgyNywweDgyLDB4OTAsMHgxMCwKKzB4YTIsMHg4MywweDAwLDB4MTIsMHgwMSwweDIyLDB4MTAsMHgyMSwweDI3LDB4ODQsMHg5MCwweDA0LDB4MDEsMHgyNCwweDIwLDB4MjEsCisweDgwLDB4NDgsMHgwMCwweDA2LDB4OGMsMHg4YSwweDAwLDB4MTgsMHgyNywweDgzLDB4OTAsMHgyMCwweDAxLDB4MjMsMHg0OCwweDIxLAorMHg4ZCwweDI0LDB4MDAsMHgwMCwweDI1LDB4MDgsMHgwMCwweDAyLDB4OGQsMHg0MiwweDAwLDB4MDAsMHg4ZCwweDQ5LDB4MDAsMHgwNCwKKzB4MDAsMHgwOCwweDE3LDB4YzIsMHg4ZCwweDQzLDB4MDAsMHgwOCwweDAxLDB4MDIsMHg0MCwweDIxLDB4MDAsMHgwNCwweDI1LDB4YzIsCisweDAwLDB4MDgsMHg0MCwweDQzLDB4MzAsMHg4NCwweDAwLDB4MDEsMHgwMCwweDAzLDB4MWYsMHhjMiwweDAwLDB4MDgsMHg0MCwweDQwLAorMHgwMCwweGUwLDB4ODAsMHgyMSwweDAwLDB4NjQsMHgxOCwweDI0LDB4MDAsMHgwOSwweDQ5LDB4NDIsMHgwMSwweDQ4LDB4MTAsMHgyMSwKKzB4MDAsMHhhMCwweDk4LDB4MjEsMHgwMCwweGEwLDB4MjAsMHgyMSwweDAwLDB4NDAsMHgzOCwweDIxLDB4MDIsMHgwMCwweDI4LDB4MjEsCisweDE0LDB4NjAsMHgwMCwweDE5LDB4MzEsMHgyOSwweDAwLDB4MDEsMHg5NCwweDQyLDB4MDAsMHgwMCwweDAyLDB4YjEsMHg4OCwweDIxLAorMHgwMiwweDAwLDB4MjgsMHgyMSwweDAwLDB4MTEsMHg4OCwweDgwLDB4MjcsMHg5MCwweDkwLDB4MDAsMHgwMiwweDMwLDB4ODAsMHgyMSwKKzB4OTYsMHgwMywweDAwLDB4MDYsMHgzMCwweDUyLDB4ZmYsMHhmZiwweDAyLDB4NjAsMHgyMCwweDIxLDB4MDAsMHg2MCwweDMwLDB4MjEsCisweGE2LDB4ODMsMHgwMCwweDFhLDB4MjcsMHg4MiwweDkwLDB4MDgsMHgwYywweDAwLDB4MDgsMHhlMywweDAyLDB4MjIsMHg4OCwweDIxLAorMHgwMCwweDUyLDB4MTAsMHgyMSwweDk2LDB4MDMsMHgwMCwweDA2LDB4YTYsMHgyMiwweDAwLDB4MDQsMHg4ZiwweGJmLDB4MDAsMHgzMCwKKzB4N2IsMHhiNCwweDAxLDB4N2MsMHg3YiwweGIyLDB4MDEsMHgzYywweDdiLDB4YjAsMHgwMCwweGZjLDB4MDAsMHg2MCwweDEwLDB4MjEsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MzgsMHhhZiwweGE5LDB4MDAsMHgxMCwweDBjLDB4MDAsMHgwOSwweDBhLAorMHhhZiwweGEwLDB4MDAsMHgxNCwweDA4LDB4MDAsMHgxZiwweDU0LDB4MDIsMHhiMSwweDg4LDB4MjEsMHgyNywweGJkLDB4ZmYsMHhjMCwKKzB4YWYsMHhiZSwweDAwLDB4MzgsMHhhZiwweGI3LDB4MDAsMHgzNCwweGFmLDB4YjYsMHgwMCwweDMwLDB4YWYsMHhiNSwweDAwLDB4MmMsCisweGFmLDB4YjMsMHgwMCwweDI0LDB4YWYsMHhiMSwweDAwLDB4MWMsMHhhZiwweGJmLDB4MDAsMHgzYywweGFmLDB4YjQsMHgwMCwweDI4LAorMHhhZiwweGIyLDB4MDAsMHgyMCwweGFmLDB4YjAsMHgwMCwweDE4LDB4OTQsMHg5MCwweDAwLDB4MDAsMHgzYywweDA4LDB4YjAsMHgwMywKKzB4MzUsMHgwOCwweDAwLDB4MjAsMHgwMCwweDEwLDB4MTAsMHhjMCwweDAwLDB4NTAsMHgxOCwweDIxLDB4MDAsMHg0MCwweDg4LDB4MjEsCisweDNjLDB4MDIsMHg4MCwweDAwLDB4MDAsMHgwMywweDQ4LDB4ODAsMHgyNCwweDQyLDB4N2QsMHhiYywweDAwLDB4ODAsMHg5OCwweDIxLAorMHgyNywweDg0LDB4OTAsMHgxMCwweDAxLDB4MjQsMHgyMCwweDIxLDB4OTMsMHhiNywweDAwLDB4NTMsMHhhZCwweDAyLDB4MDAsMHgwMCwKKzB4ODAsMHg4MywweDAwLDB4MDYsMHgyNywweDgyLDB4OTAsMHgwNCwweDAxLDB4MjIsMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MTgsCisweDI0LDB4NjMsMHgwMCwweDAyLDB4MDAsMHgwMywweDE3LDB4YzIsMHg4YywweDg4LDB4MDAsMHgwOCwweDAwLDB4NjIsMHgxOCwweDIxLAorMHgwMCwweDAzLDB4MTgsMHg0MywweDAwLDB4MDMsMHgxOCwweDQwLDB4YWYsMHhhNywweDAwLDB4NGMsMHgyYywweGEyLDB4MDAsMHgxMCwKKzB4MDAsMHhhMCwweGE4LDB4MjEsMHgwMCwweDgzLDB4NTAsMHgyMSwweDAwLDB4MDgsMHg0NywweGMyLDB4MDAsMHhjMCwweDU4LDB4MjEsCisweDAwLDB4MDAsMHhiMCwweDIxLDB4OGMsMHg5MiwweDAwLDB4MGMsMHgxNCwweDQwLDB4MDAsMHgxMywweDAwLDB4MDAsMHhmMCwweDIxLAorMHg5MiwweDY3LDB4MDAsMHgwNCwweDI0LDB4MTQsMHgwMCwweDAxLDB4MTIsMHg4NywweDAwLDB4MTAsMHgwMiwweDMwLDB4MTAsMHgyMSwKKzB4MjcsMHg4MywweDkwLDB4MTgsMHgwMSwweDIzLDB4MTgsMHgyMSwweDgwLDB4NjQsMHgwMCwweDAwLDB4MjcsMHg4MywweGI1LDB4NzAsCisweDAwLDB4MDQsMHgxMSwweDAwLDB4MDAsMHg0NCwweDEwLDB4MjMsMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDQsMHgxMCwweDIzLAorMHgwMCwweDAyLDB4MTAsMHg4MCwweDAwLDB4NDMsMHgxMCwweDIxLDB4OTAsMHg0NCwweDAwLDB4MDQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHg4MCwweDAwLDB4MjMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAyLDB4MzAsMHgxMCwweDIxLDB4MDAsMHgwMiwweDgwLDB4ODAsCisweDI0LDB4MDQsMHgwMCwweDAxLDB4MjcsMHg4MywweDkwLDB4MjAsMHhhMiwweDY0LDB4MDAsMHgxMiwweDAyLDB4MDMsMHgxOCwweDIxLAorMHg4YywweDYyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDE1LDB4YzIsMHgzMCwweDQyLDB4MDAsMHgwMSwKKzB4MDEsMHgwMiwweDEwLDB4MjQsMHgxNCwweDQwLDB4MDAsMHgwZSwweDAyLDB4YTAsMHgyMCwweDIxLDB4MjcsMHg4MiwweDkwLDB4MDAsCisweDAyLDB4MDIsMHgxMCwweDIxLDB4OTQsMHg0MywweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwweGE2LDB4NjMsMHgwMCwweDFhLAorMHg5NCwweDQyLDB4MDAsMHgwNiwweDdiLDB4YmUsMHgwMSwweGZjLDB4N2IsMHhiNiwweDAxLDB4YmMsMHg3YiwweGI0LDB4MDEsMHg3YywKKzB4N2IsMHhiMiwweDAxLDB4M2MsMHg3YiwweGIwLDB4MDAsMHhmYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4NDAsCisweDhmLDB4YTUsMHgwMCwweDRjLDB4MDEsMHg2MCwweDMwLDB4MjEsMHgwMSwweDQwLDB4MzgsMHgyMSwweGFmLDB4YTAsMHgwMCwweDEwLAorMHgwYywweDAwLDB4MDksMHgwYSwweGFmLDB4YTAsMHgwMCwweDE0LDB4MDgsMHgwMCwweDFmLDB4YmIsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjcsMHg4MywweDkwLDB4MjAsMHgwMSwweDIzLDB4MTgsMHgyMSwweDhjLDB4NjIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4MDIsMHgxNSwweGMyLDB4MzAsMHg0MiwweDAwLDB4MDEsMHgwMSwweDAyLDB4MTAsMHgyNCwweDE0LDB4NDAsMHgwMCwweGFmLAorMHgwMCwweGEwLDB4MjAsMHgyMSwweDMyLDB4NGYsMHgwMCwweDAzLDB4MDAsMHgxMiwweDEwLDB4ODIsMHgyNSwweGUzLDB4MDAsMHgwZCwKKzB4MzAsMHg0NSwweDAwLDB4MDcsMHgwMCwweDc0LDB4NzgsMHgwNCwweDEwLDB4YTAsMHgwMCwweDBlLDB4MDAsMHgwMCwweDkwLDB4MjEsCisweDI3LDB4ODIsMHg4MCwweDFjLDB4MDAsMHgxNSwweDE4LDB4NDAsMHgwMCwweDYyLDB4MTgsMHgyMSwweDk0LDB4NjQsMHgwMCwweDAwLAorMHgyNCwweGEyLDB4MDAsMHgwNiwweDAwLDB4NTQsMHgxMCwweDA0LDB4MDAsMHg0NCwweDAwLDB4MWEsMHgxNCwweDgwLDB4MDAsMHgwMiwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA3LDB4MDAsMHgwZCwweDAwLDB4MDAsMHgxMCwweDEyLDB4MjQsMHg0MiwweDAwLDB4MjAsCisweDMwLDB4NTIsMHhmZiwweGZjLDB4MDIsMHgzMCwweDEwLDB4MjEsMHgyNywweDgzLDB4OTAsMHgxMCwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDQzLDB4MTAsMHgyMSwweDkwLDB4NDQsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDgzLDB4MDAsMHhmZiwKKzB4MmMsMHg2MiwweDAwLDB4MGMsMHgxNCwweDQwLDB4MDAsMHgwNCwweDJjLDB4NjIsMHgwMCwweDE5LDB4MzAsMHg4MiwweDAwLDB4MGYsCisweDI0LDB4NDMsMHgwMCwweDBjLDB4MmMsMHg2MiwweDAwLDB4MTksMHgxMCwweDQwLDB4MDAsMHgxOSwweDI0LDB4MGUsMHgwMCwweDIwLAorMHgyNCwweDYyLDB4ZmYsMHhlOSwweDJjLDB4NDIsMHgwMCwweDAyLDB4MTQsMHg0MCwweDAwLDB4MTUsMHgyNCwweDBlLDB4MDAsMHgxMCwKKzB4MjQsMHg2MiwweGZmLDB4ZWIsMHgyYywweDQyLDB4MDAsMHgwMiwweDE0LDB4NDAsMHgwMCwweDExLDB4MjQsMHgwZSwweDAwLDB4MDgsCisweDI0LDB4MDIsMHgwMCwweDE0LDB4MTAsMHg2MiwweDAwLDB4MGUsMHgyNCwweDBlLDB4MDAsMHgwMiwweDI0LDB4NjIsMHhmZiwweGVmLAorMHgyYywweDQyLDB4MDAsMHgwMywweDE0LDB4NDAsMHgwMCwweDBhLDB4MjQsMHgwZSwweDAwLDB4MTAsMHgyNCwweDYyLDB4ZmYsMHhmMSwKKzB4MmMsMHg0MiwweDAwLDB4MDIsMHgxNCwweDQwLDB4MDAsMHgwNiwweDI0LDB4MGUsMHgwMCwweDA4LDB4MjQsMHg2MiwweGZmLDB4ZjMsCisweDJjLDB4NDIsMHgwMCwweDAyLDB4MjQsMHgwZSwweDAwLDB4MDQsMHgyNCwweDAzLDB4MDAsMHgwMiwweDAwLDB4NjIsMHg3MCwweDBhLAorMHgzMCwweGUyLDB4MDAsMHhmZiwweDAwLDB4MDAsMHg0OCwweDIxLDB4MDAsMHgwMCwweDY4LDB4MjEsMHgxMCwweDQwLDB4MDAsMHg2ZCwKKzB4MDAsMHgwMCwweDU4LDB4MjEsMHgzYywweDE0LDB4ODAsMHhmZiwweDI3LDB4OTksMHg5MCwweDAwLDB4MDEsMHhmMiwweGMwLDB4MjMsCisweDM2LDB4OTQsMHhmZiwweGZmLDB4MDEsMHhjOSwweDEwLDB4MmEsMHgxNCwweDQwLDB4MDAsMHg2NCwweDI0LDB4MDMsMHgwMCwweDA0LAorMHgwMCwweDEwLDB4MjgsMHhjMCwweDAwLDB4YjAsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDU5LDB4MTAsMHgyMSwKKzB4OTQsMHg1NiwweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMyLDB4Y2MsMHgwMCwweDAzLDB4MDAsMHg2YywweDEwLDB4MjMsCisweDMwLDB4NDIsMHgwMCwweDAzLDB4MDIsMHhjMiwweDEwLDB4MjEsMHgyNCwweDQyLDB4MDAsMHgwNCwweDMwLDB4NTEsMHhmZiwweGZmLAorMHgwMiwweDMyLDB4MTgsMHgyYiwweDEwLDB4NjAsMHgwMCwweDRkLDB4MDEsMHhmMSwweDEwLDB4MjMsMHgwMiwweDUxLDB4MTAsMHgyMywKKzB4MDEsMHg3OCwweDE4LDB4MmIsMHgxMCwweDYwLDB4MDAsMHgzNCwweDMwLDB4NDQsMHhmZiwweGZmLDB4MjksMHgyMiwweDAwLDB4NDAsCisweDEwLDB4NDAsMHgwMCwweDMxLDB4MDEsMHg3MiwweDE4LDB4MjEsMHgyNSwweDIyLDB4MDAsMHgwMSwweDAwLDB4MDIsMHgxNiwweDAwLAorMHgwMCwweDAyLDB4NGUsMHgwMywweDAwLDB4YjAsMHgxMCwweDIxLDB4MDAsMHgwMiwweDMwLDB4ODAsMHgyNywweDgyLDB4OTAsMHgwNCwKKzB4MzAsMHg2YiwweGZmLDB4ZmYsMHgwMCwweGMyLDB4MTgsMHgyMSwweDhjLDB4NjcsMHgwMCwweDE4LDB4MDAsMHgwNCwweDI1LDB4NDAsCisweDNjLDB4MDMsMHg3ZiwweDAwLDB4OGMsMHhlMiwweDAwLDB4MDQsMHgwMCwweDgzLDB4MjAsMHgyNCwweDI3LDB4ODMsMHg5MCwweDEwLAorMHgwMCwweDU0LDB4MTAsMHgyNCwweDAwLDB4YzMsMHgyOCwweDIxLDB4MDAsMHg0NCwweDEwLDB4MjUsMHhhYywweGUyLDB4MDAsMHgwNCwKKzB4MTYsMHhlMCwweDAwLDB4MDIsMHhhMCwweGI1LDB4MDAsMHgwMCwweGEwLDB4YjUsMHgwMCwweDAzLDB4MjcsMHg4NCwweDkwLDB4MjAsCisweDAwLDB4YzQsMHgxOCwweDIxLDB4OGMsMHg2MiwweDAwLDB4MDAsMHg4YywweGU4LDB4MDAsMHgwOCwweDAwLDB4MDIsMHgxNSwweGMyLAorMHgwMCwweDA4LDB4NDcsMHhjMiwweDMwLDB4NDIsMHgwMCwweDAxLDB4MDEsMHgwMiwweDEwLDB4MjQsMHgxMCwweDQwLDB4MDAsMHgwYSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MCwweGEyLDB4MDAsMHgwNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg0MiwweDAwLDB4MDIsCisweDAwLDB4MDIsMHgxZiwweGMyLDB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg0MywweDAwLDB4MDIsMHgxMCwweDQwLAorMHgwMCwweGUyLDB4NTAsMHgyMSwweGE1LDB4NWUsMHgwMCwweDAwLDB4OTIsMHg2MiwweDAwLDB4MDQsMHgyNSwweGFkLDB4MDAsMHgwMSwKKzB4MjcsMHg4NCwweDkwLDB4MDAsMHgwMCwweGM0LDB4MTgsMHgyMSwweDAxLDB4YTIsMHgxMCwweDJhLDB4OTQsMHg3MCwweDAwLDB4MDIsCisweDE0LDB4NDAsMHhmZiwweGI4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NiwweDYzLDB4MDAsMHgxNCwweDAwLDB4MGMsMHgxMCwweDIzLAorMHhhMiwweDY5LDB4MDAsMHgxMiwweDMwLDB4NDIsMHgwMCwweDAzLDB4MDEsMHg2MiwweDEwLDB4MjMsMHgwMCwweDAzLDB4ODAsMHhjMCwKKzB4OGYsMHhhNSwweDAwLDB4NGMsMHgzMCwweDRiLDB4ZmYsMHhmZiwweDAyLDB4MDMsMHg4MCwweDIxLDB4MjcsMHg4MiwweDkwLDB4MDgsCisweDAwLDB4MTAsMHg4MCwweDgwLDB4YTYsMHg2YiwweDAwLDB4MWEsMHgwMiwweGEwLDB4MjAsMHgyMSwweDAxLDB4NjAsMHgzMCwweDIxLAorMHgwMSwweDYwLDB4ODgsMHgyMSwweDBjLDB4MDAsMHgwOCwweGUzLDB4MDIsMHgwMiwweDgwLDB4MjEsMHgwMCwweDVlLDB4MTAsMHgyMSwKKzB4YTYsMHgwMiwweDAwLDB4MDQsMHgwOCwweDAwLDB4MWYsMHhjMSwweDAyLDB4MjAsMHgxMCwweDIxLDB4MDEsMHg2MiwweDEwLDB4MmIsCisweDEwLDB4NDAsMHhmZiwweGU5LDB4MDAsMHgwMCwweDIwLDB4MjEsMHgyOSwweDIyLDB4MDAsMHg0MCwweDEwLDB4NDAsMHhmZiwweGU2LAorMHgwMSwweDcxLDB4MTgsMHgyMSwweDA4LDB4MDAsMHgyMCwweDM3LDB4MjUsMHgyMiwweDAwLDB4MDEsMHgwOCwweDAwLDB4MjAsMHg2NiwKKzB4MzIsMHhjYywweDAwLDB4MDMsMHgwOCwweDAwLDB4MjAsMHg2NiwweDAwLDB4MDAsMHg2MCwweDIxLDB4OGYsMHhhNSwweDAwLDB4NGMsCisweDAxLDB4NDAsMHgzOCwweDIxLDB4YWYsMHhhMCwweDAwLDB4MTAsMHgwYywweDAwLDB4MDksMHgwYSwweGFmLDB4YjQsMHgwMCwweDE0LAorMHg5MiwweDY3LDB4MDAsMHgwNCwweDA4LDB4MDAsMHgxZiwweGQ5LDB4MzAsMHg1ZSwweGZmLDB4ZmYsMHgzMCwweDg0LDB4ZmYsMHhmZiwKKzB4MDAsMHgwNCwweDMwLDB4YzAsMHgwMCwweGM0LDB4MjAsMHgyMSwweDAwLDB4MDQsMHgyMCwweDgwLDB4MjcsMHg4MiwweDkwLDB4MDAsCisweDNjLDB4MDMsMHhiMCwweDA4LDB4MzAsMHhhNSwweGZmLDB4ZmYsMHgwMCwweDgyLDB4MjAsMHgyMSwweDAwLDB4YzMsMHgzMCwweDIxLAorMHhhYywweGM1LDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4YTQsMHg4NSwweDAwLDB4MDAsMHgzMCwweDg0LDB4ZmYsMHhmZiwKKzB4MDAsMHgwNCwweDMwLDB4YzAsMHgwMCwweGM0LDB4MzAsMHgyMSwweDI3LDB4ODgsMHg5MCwweDAwLDB4MDAsMHgwNiwweDMwLDB4ODAsCisweDAwLDB4YzgsMHgzMCwweDIxLDB4OTQsMHhjMywweDAwLDB4MDQsMHgzYywweDAyLDB4YjAsMHgwOCwweDNjLDB4MDcsMHhiMCwweDAzLAorMHgwMCwweDAzLDB4MjAsMHhjMCwweDAwLDB4ODMsMHgxOCwweDIxLDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDgyLDB4MjAsMHgyMSwKKzB4M2MsMHgwMiwweDgwLDB4MDEsMHgzMCwweGE1LDB4ZmYsMHhmZiwweDAwLDB4NjgsMHgxOCwweDIxLDB4MzQsMHhlNywweDAwLDB4MjAsCisweDI0LDB4NDIsMHg4MiwweDZjLDB4YWMsMHhlMiwweDAwLDB4MDAsMHhhNCwweGM1LDB4MDAsMHgwMiwweGE0LDB4NjUsMHgwMCwweDAwLAorMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4ODUsMHgwMCwweDAwLDB4MzAsMHg4NCwweGZmLDB4ZmYsMHgwMCwweDA0LDB4MTAsMHhjMCwKKzB4MDAsMHg0NCwweDEwLDB4MjEsMHgyNywweDg5LDB4OTAsMHgwMCwweDAwLDB4MDIsMHgxMCwweDgwLDB4MDAsMHg0OSwweDEwLDB4MjEsCisweDk3LDB4ODMsMHg4ZiwweGYwLDB4OTQsMHg0YSwweDAwLDB4MDQsMHgzYywweDAyLDB4YjAsMHgwOCwweDAwLDB4MDMsMHgzOCwweGMwLAorMHgwMCwweDBhLDB4NDAsMHhjMCwweDAwLDB4ZTMsMHgxOCwweDIxLDB4MDEsMHgwYSwweDI4LDB4MjEsMHgwMCwweGUyLDB4MzgsMHgyMSwKKzB4MDEsMHgwMiwweDQwLDB4MjEsMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4MDUsMHgyOCwweDgwLDB4M2MsMHgwNiwweGIwLDB4MDMsCisweDNjLDB4MDIsMHg4MCwweDAxLDB4MDAsMHhhOSwweDI4LDB4MjEsMHgwMCwweDY5LDB4MTgsMHgyMSwweDM0LDB4YzYsMHgwMCwweDIwLAorMHgzNCwweDA5LDB4ZmYsMHhmZiwweDI0LDB4NDIsMHg4MiwweGM4LDB4YWMsMHhjMiwweDAwLDB4MDAsMHhhNCwweDY0LDB4MDAsMHgwMCwKKzB4YWMsMHhlNCwweDAwLDB4MDAsMHhhNCwweGE5LDB4MDAsMHgwMCwweGFkLDB4MDksMHgwMCwweDAwLDB4YTcsMHg4YSwweDhmLDB4ZjAsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAxLAorMHgzNCwweDYzLDB4MDAsMHgyMCwweDI0LDB4NDIsMHg4MywweDQ4LDB4M2MsMHgwNCwweGIwLDB4MDMsMHhhYywweDYyLDB4MDAsMHgwMCwKKzB4MzQsMHg4NCwweDAxLDB4MTAsMHg4YywweDgyLDB4MDAsMHgwMCwweDk3LDB4ODMsMHg4MSwweDYwLDB4MzAsMHg0MiwweGZmLDB4ZmYsCisweDEwLDB4NjIsMHgwMCwweDE2LDB4MjQsMHgwYSwweDAwLDB4MDEsMHhhNywweDgyLDB4ODEsMHg2MCwweGFmLDB4ODAsMHhiNCwweDUwLAorMHgwMCwweDQwLDB4MjgsMHgyMSwweDI0LDB4MDYsMHgwMCwweDAxLDB4MjcsMHg4NCwweGI0LDB4NTQsMHgyNSwweDQzLDB4ZmYsMHhmZiwKKzB4MDAsMHg2NiwweDEwLDB4MDQsMHgwMCwweGEyLDB4MTAsMHgyNCwweDE0LDB4NDAsMHgwMCwweDA3LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhjLDB4ODMsMHhmZiwweGZjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDY2LDB4MTAsMHgwNCwweDAwLDB4YTIsMHgxMCwweDI0LAorMHgzOCwweDQyLDB4MDAsMHgwMCwweDAxLDB4NDIsMHgxOCwweDBhLDB4MjUsMHg0YSwweDAwLDB4MDEsMHgyZCwweDQyLDB4MDAsMHgxNCwKKzB4YWMsMHg4MywweDAwLDB4MDAsMHgxNCwweDQwLDB4ZmYsMHhmMSwweDI0LDB4ODQsMHgwMCwweDA0LDB4M2MsMHgwYiwweGIwLDB4MDMsCisweDAwLDB4MDAsMHg1MCwweDIxLDB4M2MsMHgwYywweDgwLDB4MDAsMHgyNywweDg5LDB4YjQsMHhhMCwweDM1LDB4NmIsMHgwMSwweDIwLAorMHg4ZCwweDY4LDB4MDAsMHgwMCwweDhkLDB4MjMsMHgwMCwweDA0LDB4MDEsMHgwYywweDEwLDB4MjQsMHgwMCwweDAyLDB4MTcsMHhjMiwKKzB4MTEsMHgwMywweDAwLDB4MzcsMHhhMSwweDIyLDB4MDAsMHhkYywweGExLDB4MjAsMHgwMCwweGQ1LDB4YTEsMHgyMCwweDAwLDB4ZDYsCisweDAxLDB4MjAsMHgzMCwweDIxLDB4MDAsMHgwMCwweDM4LDB4MjEsMHgwMCwweDAwLDB4MjgsMHgyMSwweDAxLDB4MjAsMHgyMCwweDIxLAorMHgwMCwweGE4LDB4MTAsMHgwNiwweDMwLDB4NDIsMHgwMCwweDAxLDB4MTAsMHhlMCwweDAwLDB4MTAsMHhhMCwweDgyLDB4MDAsMHgwYSwKKzB4OTAsMHg4MiwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDMxLDB4MjQsMHhhMiwweGZmLDB4ZmYsCisweGEwLDB4ODIsMHgwMCwweDA4LDB4OTAsMHg4MiwweDAwLDB4MGEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDA5LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDkwLDB4ODMsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4MTAsMHg0MCwKKzB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDQ2LDB4MTAsMHgyMSwweGEwLDB4NDUsMHgwMCwweDA5LDB4OTAsMHg4MiwweDAwLDB4MGEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE0LDB4ZTAsMHgwMCwweDA0LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweGEwLDB4YzUsMHgwMCwweGQ1LDB4MjQsMHgwNywweDAwLDB4MDEsMHhhMCwweDg1LDB4MDAsMHgwOCwKKzB4YTAsMHhjNSwweDAwLDB4ZDYsMHgyNCwweGE1LDB4MDAsMHgwMSwweDJjLDB4YTIsMHgwMCwweDFjLDB4MTQsMHg0MCwweGZmLDB4ZTAsCisweDI0LDB4ODQsMHgwMCwweDAzLDB4OTAsMHhjNCwweDAwLDB4ZDUsMHgwMCwweDAwLDB4MjgsMHgyMSwweDAwLDB4YTQsMHgxMCwweDJiLAorMHgxMCwweDQwLDB4MDAsMHgwYiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhjMCwweDE4LDB4MjEsMHhhMCwweDY0LDB4MDAsMHgwOCwKKzB4OTAsMHhjMiwweDAwLDB4ZDUsMHgyNCwweGE1LDB4MDAsMHgwMSwweGEwLDB4NjIsMHgwMCwweDA5LDB4OTAsMHhjNCwweDAwLDB4ZDUsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhNCwweDEwLDB4MmIsMHgxNCwweDQwLDB4ZmYsMHhmOCwweDI0LDB4NjMsMHgwMCwweDAzLAorMHgyNSwweDRhLDB4MDAsMHgwMSwweDJkLDB4NDIsMHgwMCwweDA4LDB4YWQsMHgyOCwweDAwLDB4MDQsMHgyNSwweDZiLDB4MDAsMHgwNCwKKzB4MTQsMHg0MCwweGZmLDB4YmYsMHgyNSwweDI5LDB4MDAsMHhlYywweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDkwLDB4ODIsMHgwMCwweDA1LDB4MDgsMHgwMCwweDIxLDB4MGQsMHhhMCwweDgyLDB4MDAsMHgwOCwweDk3LDB4ODUsMHg4YiwweDdhLAorMHgzYywweDAzLDB4YjAsMHgwMywweDNjLDB4MDIsMHg4MCwweDAxLDB4MjcsMHhiZCwweGZmLDB4ZTgsMHgzNCwweDYzLDB4MDAsMHgyMCwKKzB4MjQsMHg0MiwweDg0LDB4ZmMsMHhhZiwweGIwLDB4MDAsMHgxMCwweGFmLDB4YmYsMHgwMCwweDE0LDB4YWMsMHg2MiwweDAwLDB4MDAsCisweDMwLDB4OTAsMHgwMCwweGZmLDB4MDAsMHgwNSwweDI4LDB4NDIsMHgwMCwweDAwLDB4NDgsMHgyMSwweDI3LDB4OGYsMHhiNCwweGE0LAorMHgwMCwweDAwLDB4NTAsMHgyMSwweDAwLDB4MDAsMHg1OCwweDIxLDB4MjcsMHg5OCwweGI1LDB4ODQsMHgyNywweDk5LDB4YjUsMHg4MCwKKzB4MjcsMHg4ZSwweGI1LDB4N2UsMHgyNywweDhjLDB4YjQsMHhhOCwweDI3LDB4OGQsMHhiNSwweDAwLDB4MjcsMHg4OCwweGI1LDB4NzgsCisweDAwLDB4MGEsMHgxOCwweDgwLDB4MDEsMHg2ZiwweDEwLDB4MjEsMHhhYywweDQwLDB4MDAsMHgwMCwweGFjLDB4NDUsMHgwMCwweDU4LAorMHgwMCwweDZlLDB4MjAsMHgyMSwweDAwLDB4NzgsMHgxMCwweDIxLDB4YTEsMHgwMCwweGZmLDB4ZmMsMHhhZCwweDAwLDB4MDAsMHgwMCwKKzB4YTEsMHgwMCwweDAwLDB4MDQsMHhhMSwweDAwLDB4MDAsMHgwNSwweGFkLDB4MDAsMHhmZiwweGY4LDB4MDAsMHg3OSwweDE4LDB4MjEsCisweDI0LDB4MDYsMHgwMCwweDAxLDB4MjQsMHhjNiwweGZmLDB4ZmYsMHhhMCwweDgwLDB4MDAsMHgwMCwweGE0LDB4NjAsMHgwMCwweDAwLAorMHhhYywweDQwLDB4MDAsMHgwMCwweDI0LDB4NjMsMHgwMCwweDAyLDB4MjQsMHg0MiwweDAwLDB4MDQsMHgwNCwweGMxLDB4ZmYsMHhmOSwKKzB4MjQsMHg4NCwweDAwLDB4MDEsMHgwMCwweDBhLDB4MTAsMHg4MCwweDAwLDB4NGQsMHgyMCwweDIxLDB4MDAsMHgwMCwweDMwLDB4MjEsCisweDAwLDB4NGMsMHgxOCwweDIxLDB4MjcsMHg4NywweDgxLDB4NjQsMHg4YywweGUyLDB4MDAsMHgwMCwweDI0LDB4ZTcsMHgwMCwweDA0LAorMHhhYywweDgyLDB4MDAsMHgwMCwweGEwLDB4NjYsMHgwMCwweDAwLDB4YTAsMHg2NiwweDAwLDB4MDEsMHgyNCwweGM2LDB4MDAsMHgwMSwKKzB4MjgsMHhjMiwweDAwLDB4MWMsMHhhMCwweDYwLDB4MDAsMHgwMiwweDI0LDB4ODQsMHgwMCwweDA0LDB4MTQsMHg0MCwweGZmLDB4ZjYsCisweDI0LDB4NjMsMHgwMCwweDAzLDB4MjUsMHgyOSwweDAwLDB4MDEsMHgyOSwweDIyLDB4MDAsMHgwOCwweDI1LDB4NGEsMHgwMCwweDNiLAorMHgyNSwweDA4LDB4MDAsMHhlYywweDE0LDB4NDAsMHhmZiwweGQ2LDB4MjUsMHg2YiwweDAwLDB4ZWMsMHhhNywweDgwLDB4ODEsMHg2MCwKKzB4MDAsMHgwMCwweDQ4LDB4MjEsMHgyNywweDgzLDB4YjQsMHg1MCwweGFjLDB4NjksMHgwMCwweDAwLDB4MjUsMHgyOSwweDAwLDB4MDEsCisweDI5LDB4MjIsMHgwMCwweDBjLDB4MTQsMHg0MCwweGZmLDB4ZmMsMHgyNCwweDYzLDB4MDAsMHgwNCwweDBjLDB4MDAsMHgyMCwweGQyLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDJlLDB4MDQsMHgwMCwweDE0LDB4MjcsMHg4MywweGI0LDB4YTAsMHgyNCwweDA5LDB4MDAsMHgwNywKKzB4MTAsMHg4MCwweDAwLDB4MGEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDkwLDB4NjIsMHgwMCwweGQ1LDB4MjUsMHgyOSwweGZmLDB4ZmYsCisweGEwLDB4NjIsMHgwMCwweDAwLDB4MDUsMHgyMSwweGZmLDB4ZmEsMHgyNCwweDYzLDB4MDAsMHhlYywweDhmLDB4YmYsMHgwMCwweDE0LAorMHg4ZiwweGIwLDB4MDAsMHgxMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTgsMHg5MCwweDYyLDB4MDAsMHhkNiwKKzB4MDgsMHgwMCwweDIxLDB4OTAsMHgyNSwweDI5LDB4ZmYsMHhmZiwweDMwLDB4ODQsMHgwMCwweGZmLDB4MDAsMHgwNCwweDExLDB4MDAsCisweDAwLDB4NDQsMHgxMCwweDIzLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ0LDB4MTAsMHgyMywweDAwLDB4MDIsMHgxMCwweDgwLAorMHgyNywweDgzLDB4YjQsMHhhMCwweDAwLDB4NDMsMHg2MCwweDIxLDB4M2MsMHgwNCwweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMSwKKzB4MzQsMHg4NCwweDAwLDB4MjAsMHgyNCwweDQyLDB4ODYsMHg2OCwweDMwLDB4YzYsMHgwMCwweGZmLDB4OTMsMHhhYSwweDAwLDB4MTMsCisweDMwLDB4YTUsMHgwMCwweGZmLDB4MzAsMHhlNywweDAwLDB4ZmYsMHhhYywweDgyLDB4MDAsMHgwMCwweDEwLDB4YzAsMHgwMCwweGU4LAorMHgyNSwweDhmLDB4MDAsMHhkMCwweDkxLDB4ODIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDQyLDB4ZmYsMHhmYywKKzB4MmMsMHg0MywweDAwLDB4MTgsMHgxMCwweDYwLDB4MDAsMHhjNywweDNjLDB4MDMsMHg4MCwweDAxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDI0LDB4NjMsMHgwMiwweDkwLDB4MDAsMHg0MywweDEwLDB4MjEsMHg4YywweDQ0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDgwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MmQsMHg0MiwweDAwLDB4MzAsMHgxNCwweDQwLDB4MDAsMHgxYywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweGEwLDB4MDAsMHgxNywweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDEwLDB4YTIsMHgwMCwweDExLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHgwMCwweDBjLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTAsMHhhMiwweDAwLDB4MDYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NDIsMHhmZiwweGUwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweGFkLDB4ODIsMHgwMCwweGQwLDB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjEsMHhjYiwweDI0LDB4NDIsMHhmZiwweGU4LAorMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjEsMHhjYiwKKzB4MjQsMHg0MiwweDAwLDB4MDEsMHg4ZCwweDgyLDB4MDAsMHhkMCwweDA4LDB4MDAsMHgyMSwweGNiLDB4MjQsMHg0MiwweDAwLDB4MDIsCisweDEwLDB4YTAsMHhmZiwweGY5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHgwMCwweDBhLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweGZmLDB4ZTksMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDMsMHgxMCwweGEyLDB4ZmYsMHhlNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGQsMHg4MiwweDAwLDB4ZDAsCisweDA4LDB4MDAsMHgyMSwweGNiLDB4MjQsMHg0MiwweGZmLDB4ZDAsMHg4ZCwweDgyLDB4MDAsMHhkMCwweDA4LDB4MDAsMHgyMSwweGNiLAorMHgyNCwweDQyLDB4ZmYsMHhmYywweDEwLDB4YTAsMHhmZiwweGViLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MTAsMHhhMiwweGZmLDB4ZTUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweGZmLDB4ZTAsCisweDI0LDB4MDIsMHgwMCwweDAzLDB4MTQsMHhhMiwweGZmLDB4ZGIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhkLDB4ODIsMHgwMCwweGQwLAorMHgwOCwweDAwLDB4MjEsMHhjYiwweDI0LDB4NDIsMHhmZiwweGY4LDB4MmQsMHg0MiwweDAwLDB4MTksMHgxNCwweDQwLDB4ZmYsMHhjNSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweGEwLDB4ZmYsMHhkYiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDEwLDB4YTIsMHhmZiwweGQ1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHhmZiwweGQwLAorMHgyNCwweDAyLDB4MDAsMHgwMywweDEwLDB4YTIsMHhmZiwweGYxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZCwweDgyLDB4MDAsMHhkMCwKKzB4MDgsMHgwMCwweDIxLDB4Y2IsMHgyNCwweDQyLDB4ZmYsMHhmMCwweDJkLDB4NDIsMHgwMCwweDFiLDB4MTAsMHg0MCwweGZmLDB4ZjEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHhhMCwweGZmLDB4Y2IsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLAorMHgxMCwweGEyLDB4ZmYsMHhjNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxNCwweGEyLDB4ZmYsMHhiNSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZCwweDgyLDB4MDAsMHhkMCwweDA4LDB4MDAsMHgyMSwweGNiLDB4MjQsMHg0MiwweGZmLDB4ZjQsCisweDJkLDB4NDIsMHgwMCwweDFlLDB4MTAsMHg0MCwweGZmLDB4ZTMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTAsMHhmZiwweGJkLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4YjUsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTAsMHhhMiwweGZmLDB4ZDYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMSwweGM2LDB4MjQsMHgwMiwweDAwLDB4MDMsCisweDJkLDB4NDIsMHgwMCwweDIzLDB4MTAsMHg0MCwweGZmLDB4ZDcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTAsMHhmZiwweGFlLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4YTksMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTQsMHhhMiwweGZmLDB4YjcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMiwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDJkLDB4NDIsMHgwMCwweDI1LDB4MTAsMHg0MCwweGZmLDB4Y2IsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMSwweGQ4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDJkLDB4NDIsMHgwMCwweDE2LDB4MTQsMHg0MCwweDAwLDB4MGUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHhhMCwweGZmLDB4YTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4OWEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGEyLDB4ZmYsMHg5NSwweDI0LDB4MDIsMHgwMCwweDAzLAorMHgxNCwweGEyLDB4ZmYsMHhiNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjEsMHhjYiwKKzB4MjQsMHg0MiwweGZmLDB4ZmEsMHgxMCwweGEwLDB4ZmYsMHg5MywweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDEwLDB4YTIsMHhmZiwweDhkLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHhmZiwweDg4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMSwweGYzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDQyLDB4MDAsMHgxNywKKzB4MTQsMHg0MCwweGZmLDB4YWMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMiwweDM0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDJkLDB4NDIsMHgwMCwweDE5LDB4MTAsMHg0MCwweGZmLDB4ZTIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTAsMHhmZiwweDgxLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4N2IsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGEyLDB4ZmYsMHg3NiwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTAsMHhhMiwweGZmLDB4OTcsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDIxLDB4YzgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMiwweDUxLAorMHgyZCwweDQyLDB4MDAsMHgxYiwweDJkLDB4NDIsMHgwMCwweDFlLDB4MTAsMHg0MCwweGZmLDB4ZGUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MTAsMHhhMCwweGZmLDB4NzAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4NmEsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGEyLDB4ZmYsMHg2NSwweDI0LDB4MDIsMHgwMCwweDAzLAorMHgxMCwweGEyLDB4ZmYsMHg5NiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDIxLDB4YzgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MmQsMHg0MiwweDAwLDB4MjMsMHgxNCwweDQwLDB4ZmYsMHhmMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDIxLDB4ZjksCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDIxLDB4ZjcsMHgyZCwweDQyLDB4MDAsMHgyNSwweDA4LDB4MDAsMHgyMiwweDJkLAorMHgyZCwweDQyLDB4MDAsMHgyNywweDEwLDB4YTAsMHhmZiwweDViLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MTAsMHhhMiwweGZmLDB4NTUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweGZmLDB4NTAsCisweDI0LDB4MDIsMHgwMCwweDAzLDB4MTQsMHhhMiwweGZmLDB4NzEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMSwweGU2LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDJkLDB4NDIsMHgwMCwweDI3LDB4MTQsMHg0MCwweGZmLDB4YWQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDIyLDB4NzksMHgwMCwweDAwLDB4MDAsMHgwMCwweDJkLDB4NDIsMHgwMCwweDJhLDB4MTQsMHg0MCwweGZmLDB4ZDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDIxLDB4ZTksMHgwMCwweDAwLDB4MDAsMHgwMCwweDJkLDB4NDIsMHgwMCwweDJjLAorMHgxNCwweDQwLDB4ZmYsMHg3OCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDIxLDB4YmQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OTEsMHg4NiwweDAwLDB4MDAsMHg5MSwweDgzLDB4MDAsMHhkNCwweDI1LDB4OGQsMHgwMCwweDVjLDB4MzAsMHhjNCwweDAwLDB4ZmYsCisweDAwLDB4MDQsMHgxMCwweDQwLDB4MDAsMHg0NCwweDEwLDB4MjEsMHgwMCwweDA0LDB4NDgsMHg4MCwweDAxLDB4ODIsMHg1OCwweDIxLAorMHgwMSwweDg5LDB4NDAsMHgyMSwweDI1LDB4NzgsMHgwMCwweDA4LDB4MTAsMHg2MCwweDAwLDB4MzcsMHgyNSwweDBlLDB4MDAsMHg2MCwKKzB4MmMsMHhhMiwweDAwLDB4MDMsMHgxNCwweDQwLDB4MDAsMHgyNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTEsMHg4MiwweDAwLDB4ZGQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweDAwLDB4MWUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4ODcsMHg4MSwweDY0LAorMHgwMSwweDI3LDB4MTAsMHgyMSwweDhjLDB4NDMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhhZCwweDAzLDB4MDAsMHg2MCwKKzB4OTEsMHg2MiwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDAsMHgzMCwweDIxLDB4YTEsMHg4MiwweDAwLDB4MDAsCisweDMwLDB4YzIsMHgwMCwweGZmLDB4MDAsMHgwMiwweDEwLDB4ODAsMHgwMCwweDQ3LDB4MTAsMHgyMSwweDhjLDB4NDMsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgxOCwweDQyLDB4YWQsMHhhMywweDAwLDB4MDAsMHg5MSwweDg0LDB4MDAsMHgwMCwKKzB4OGQsMHhjNSwweDAwLDB4MDAsMHgwMCwweDA0LDB4MjAsMHg4MCwweDAwLDB4ODcsMHgxMCwweDIxLDB4OGMsMHg0MywweDAwLDB4MDAsCisweDAwLDB4MDUsMHgyOCwweDQwLDB4MDAsMHg4YywweDIwLDB4MjEsMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4YTMsMHgxMCwweDJiLAorMHgwMCwweDYyLDB4MjgsMHgwYSwweGFjLDB4ODUsMHgwMCwweDYwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHhhMSwweDgwLDB4MDAsMHhkNCwKKzB4MjcsMHg4NywweDgxLDB4NjQsMHgwOCwweDAwLDB4MjIsMHhiMCwweGExLDB4ODAsMHgwMCwweGRkLDB4MjcsMHg4MiwweDgxLDB4ZDQsCisweDhkLDB4ODMsMHgwMCwweGQ4LDB4MDAsMHg4MiwweDEwLDB4MjEsMHg5MCwweDQ0LDB4MDAsMHgwMCwweDI0LDB4NjMsMHgwMCwweDAxLAorMHgwMCwweDY0LDB4MjAsMHgyYiwweDE0LDB4ODAsMHhmZiwweDAyLDB4YWQsMHg4MywweDAwLDB4ZDgsMHg4ZCwweDAyLDB4MDAsMHg2MCwKKzB4YTEsMHg4MCwweDAwLDB4ZDQsMHgwMCwweDAyLDB4MWYsMHhjMiwweDAwLDB4NDMsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4NDMsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4YWQsMHg4MiwweDAwLDB4NWMsMHgxMCwweGUwLDB4MDAsMHgxZCwweDI0LDB4ODMsMHhmZiwweGZjLAorMHgyYywweDYyLDB4MDAsMHgxOCwweDEwLDB4NDAsMHgwMSwweDEwLDB4MDAsMHgwMywweDEwLDB4ODAsMHgzYywweDAzLDB4ODAsMHgwMSwKKzB4MjQsMHg2MywweDAyLDB4ZjAsMHgwMCwweDQzLDB4MTAsMHgyMSwweDhjLDB4NDQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDAwLDB4ODAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDQyLDB4MDAsMHgzMCwweDE0LDB4NDAsMHgwMCwweDY1LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTAsMHgwMCwweDYwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MTAsMHhhMiwweDAwLDB4NWEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDMsMHgxMCwweGEyLDB4MDAsMHg1MSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4ZCwweDgyLDB4MDAsMHhkMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHg0MiwweGZmLDB4ZTAsMHhhZCwweDgyLDB4MDAsMHhkMCwKKzB4OGQsMHhlMywweDAwLDB4MDAsMHg4ZCwweGEyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MywweDEwLDB4MjEsCisweGFkLDB4YTIsMHgwMCwweDAwLDB4YWQsMHhlMCwweDAwLDB4MDAsMHg4ZCwweGEzLDB4MDAsMHgwMCwweDhkLDB4YzQsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODMsMHgxMCwweDJhLDB4MTAsMHg0MCwweDAwLDB4MjIsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OTMsMHgwNSwweDAwLDB4MDEsMHg5MSwweDgyLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0NSwweDAwLDB4MDUsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4YTEsMHg4NSwweDAwLDB4MDAsMHhhMSwweDgyLDB4MDAsMHhkNCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHhhZCwweDgwLDB4MDAsMHhkOCwweDkxLDB4ODIsMHgwMCwweGRkLDB4MjQsMHgwMywweDAwLDB4MDEsMHgxMCwweDQzLDB4MDAsMHgwNSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHhhMSwweDgzLDB4MDAsMHhkNCwweGFkLDB4ODAsMHgwMCwweGQ4LDB4MDMsMHhlMCwweDAwLDB4MDgsCisweGExLDB4ODMsMHgwMCwweGRkLDB4MDAsMHgwNCwweDE3LDB4YzIsMHgwMCwweDgyLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDQzLAorMHhhZCwweGEyLDB4MDAsMHgwMCwweDkxLDB4ODMsMHgwMCwweDAwLDB4MjcsMHg4MiwweDgxLDB4NjQsMHg4ZCwweGM1LDB4MDAsMHgwMCwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDYyLDB4MTgsMHgyMSwweDhjLDB4NjQsMHgwMCwweDAwLDB4MDAsMHgwNSwweDI4LDB4NDAsCisweDAwLDB4MDQsMHgxOCwweDgwLDB4MDAsMHhhMywweDEwLDB4MmIsMHgwMCwweDYyLDB4MjgsMHgwYSwweDA4LDB4MDAsMHgyMiwweGMyLAorMHhhZCwweGM1LDB4MDAsMHgwMCwweDk3LDB4ODIsMHg4YiwweDdjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDYyLDB4MTAsMHgyYSwKKzB4MTAsMHg0MCwweGZlLDB4YWIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDkxLDB4ODIsMHgwMCwweGRkLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDE0LDB4NDAsMHgwMCwweDE1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5MSwweDgzLDB4MDAsMHgwMCwweDI3LDB4ODIsMHg4MSwweDY0LAorMHgwMCwweDAzLDB4MTgsMHg4MCwweDAwLDB4NjIsMHgxMCwweDIxLDB4OGMsMHg0NCwweDAwLDB4MDAsMHgwMCwweDZjLDB4MTgsMHgyMSwKKzB4YWMsMHg2NCwweDAwLDB4NjAsMHg5MywweDA1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwNSwweDEwLDB4ODAsCisweDAxLDB4ODIsMHgxMCwweDIxLDB4MjQsMHg0ZSwweDAwLDB4NjAsMHhhMSwweDg1LDB4MDAsMHgwMCwweDhkLDB4YzIsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDIsMHgxZiwweGMyLDB4MDAsMHg0MywweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHg0MywKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHhhZCwweGEyLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMywweDM3LDB4YTEsMHg4MCwweDAwLDB4ZGQsCisweDhkLDB4ODIsMHgwMCwweGQwLDB4MDgsMHgwMCwweDIyLDB4ZjMsMHgyNCwweDQyLDB4ZmYsMHhlOCwweDhkLDB4ODIsMHgwMCwweGQwLAorMHgwOCwweDAwLDB4MjIsMHhmMywweDI0LDB4NDIsMHgwMCwweDAxLDB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjIsMHhmMywKKzB4MjQsMHg0MiwweDAwLDB4MDIsMHgxMCwweGEwLDB4ZmYsMHhmOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweDEwLDB4YTIsMHgwMCwweDBhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHhmZiwweGEwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTAsMHhhMiwweGZmLDB4OWQsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjIsMHhmMywweDI0LDB4NDIsMHhmZiwweGQwLDB4OGQsMHg4MiwweDAwLDB4ZDAsCisweDA4LDB4MDAsMHgyMiwweGYzLDB4MjQsMHg0MiwweGZmLDB4ZmMsMHgxMCwweGEwLDB4ZmYsMHhlYiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweGU1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTAsMHhhMiwweGZmLDB4OTMsMHgyNCwweDAyLDB4MDAsMHgwMywweDE0LDB4YTIsMHhmZiwweGRkLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhkLDB4ODIsMHgwMCwweGQwLDB4MDgsMHgwMCwweDIyLDB4ZjMsMHgyNCwweDQyLDB4ZmYsMHhmOCwweDJkLDB4NDIsMHgwMCwweDE5LAorMHgxNCwweDQwLDB4ZmYsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHhhMCwweGZmLDB4ZGIsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGEyLDB4ZmYsMHhkNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDIsCisweDEwLDB4YTIsMHhmZiwweDgzLDB4MjQsMHgwMiwweDAwLDB4MDMsMHgxMCwweGEyLDB4ZmYsMHhmMSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4ZCwweDgyLDB4MDAsMHhkMCwweDA4LDB4MDAsMHgyMiwweGYzLDB4MjQsMHg0MiwweGZmLDB4ZjAsMHgyZCwweDQyLDB4MDAsMHgxYiwKKzB4MTAsMHg0MCwweGZmLDB4ZjEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTAsMHhmZiwweGNiLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweGZmLDB4YzUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLAorMHgxNCwweGEyLDB4ZmYsMHg2YywweDAwLDB4MDAsMHgwMCwweDAwLDB4OGQsMHg4MiwweDAwLDB4ZDAsMHgwOCwweDAwLDB4MjIsMHhmMywKKzB4MjQsMHg0MiwweGZmLDB4ZjQsMHgyZCwweDQyLDB4MDAsMHgxZSwweDEwLDB4NDAsMHhmZiwweGUzLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4YTAsMHhmZiwweGJkLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweDY4LAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHhmZiwweGQ2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjIsMHhlZSwKKzB4MjQsMHgwMiwweDAwLDB4MDMsMHgyZCwweDQyLDB4MDAsMHgyMywweDEwLDB4NDAsMHhmZiwweGQ3LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4YTAsMHhmZiwweGFlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweDVjLAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDE0LDB4YTIsMHhmZiwweGI3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjMsMHg3NCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDQyLDB4MDAsMHgyNSwweDEwLDB4NDAsMHhmZiwweGNiLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgyMywweDQ5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDQyLDB4MDAsMHgxNiwweDE0LDB4NDAsMHgwMCwweDBlLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTAsMHhmZiwweGEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MTAsMHhhMiwweGZmLDB4OWEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweGZmLDB4NDgsCisweDI0LDB4MDIsMHgwMCwweDAzLDB4MTQsMHhhMiwweGZmLDB4YjYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhkLDB4ODIsMHgwMCwweGQwLAorMHgwOCwweDAwLDB4MjIsMHhmMywweDI0LDB4NDIsMHhmZiwweGZhLDB4MTAsMHhhMCwweGZmLDB4OTMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGEyLDB4ZmYsMHg4ZCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDIsCisweDEwLDB4YTIsMHhmZiwweDNiLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjMsMHg2NCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyZCwweDQyLDB4MDAsMHgxNywweDE0LDB4NDAsMHhmZiwweGFjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjMsMHhhNSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDQyLDB4MDAsMHgxOSwweDEwLDB4NDAsMHhmZiwweGUyLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDEwLDB4YTAsMHhmZiwweDgxLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweDdiLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweGZmLDB4MjksMHgyNCwweDAyLDB4MDAsMHgwMywKKzB4MTAsMHhhMiwweGZmLDB4OTcsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMiwweGYwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgyMywweGMyLDB4MmQsMHg0MiwweDAwLDB4MWIsMHgyZCwweDQyLDB4MDAsMHgxZSwweDEwLDB4NDAsMHhmZiwweGRlLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4YTAsMHhmZiwweDcwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwKKzB4MTAsMHhhMiwweGZmLDB4NmEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLDB4MTAsMHhhMiwweGZmLDB4MTgsCisweDI0LDB4MDIsMHgwMCwweDAzLDB4MTAsMHhhMiwweGZmLDB4OTYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMiwweGYwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDJkLDB4NDIsMHgwMCwweDIzLDB4MTQsMHg0MCwweGZmLDB4ZjIsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDIzLDB4NmEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMywweDY4LDB4MmQsMHg0MiwweDAwLDB4MjUsCisweDA4LDB4MDAsMHgyMywweDllLDB4MmQsMHg0MiwweDAwLDB4MjcsMHgxMCwweGEwLDB4ZmYsMHg1YiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHhmZiwweDU1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTAsMHhhMiwweGZmLDB4MDMsMHgyNCwweDAyLDB4MDAsMHgwMywweDE0LDB4YTIsMHhmZiwweDcxLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgyMywweDU3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDQyLDB4MDAsMHgyNywweDE0LDB4NDAsMHhmZiwweGFkLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMywweGVhLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyZCwweDQyLDB4MDAsMHgyYSwKKzB4MTQsMHg0MCwweGZmLDB4ZDgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMywweDVhLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDJkLDB4NDIsMHgwMCwweDJjLDB4MTQsMHg0MCwweGZmLDB4NzgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyMiwweGU1LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGU4LDB4M2MsMHgwMiwweGIwLDB4MDMsMHhhZiwweGJmLDB4MDAsMHgxNCwKKzB4YWYsMHhiMCwweDAwLDB4MTAsMHgzNCwweDQyLDB4MDEsMHgxOCwweDNjLDB4MDMsMHhiMCwweDAzLDB4OGMsMHg1MCwweDAwLDB4MDAsCisweDM0LDB4NjMsMHgwMSwweDJjLDB4OTAsMHg2MiwweDAwLDB4MDAsMHgzMiwweDA1LDB4MDAsMHgwMSwweGEzLDB4ODIsMHg4MCwweDEwLAorMHgxNCwweGEwLDB4MDAsMHgxNCwweDMwLDB4NDQsMHgwMCwweGZmLDB4MzIsMHgwMiwweDAxLDB4MDAsMHgxNCwweDQwLDB4MDAsMHgwOSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMiwweDAyLDB4MDgsMHgwMCwweDEwLDB4NDAsMHgwMCwweDAyLDB4MjQsMHgwMiwweDAwLDB4MDEsCisweGEzLDB4ODIsMHhiYywweDE4LDB4OGYsMHhiZiwweDAwLDB4MTQsMHg4ZiwweGIwLDB4MDAsMHgxMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgxOCwweDBjLDB4MDAsMHgwNSwweDM3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNiwweDAyLDB4ZmYsMHgwMCwKKzB4YTMsMHg4MCwweGJjLDB4MTgsMHgzYywweDAxLDB4YjAsMHgwMywweGFjLDB4MjIsMHgwMSwweDE4LDB4MDgsMHgwMCwweDI0LDB4MTYsCisweDMyLDB4MDIsMHgwOCwweDAwLDB4MGMsMHgwMCwweDIxLDB4M2YsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI2LDB4MDIsMHhmZiwweGZmLAorMHgzYywweDAxLDB4YjAsMHgwMywweGFjLDB4MjIsMHgwMSwweDE4LDB4MDgsMHgwMCwweDI0LDB4MTMsMHgzMiwweDAyLDB4MDEsMHgwMCwKKzB4MjcsMHhiZCwweGZmLDB4ZTAsMHgzYywweDAyLDB4YjAsMHgwMywweDM0LDB4NDIsMHgwMCwweGQwLDB4YWYsMHhiZiwweDAwLDB4MTgsCisweDhjLDB4NDMsMHgwMCwweDAwLDB4M2MsMHgwMiwweDAwLDB4NDAsMHgyNCwweDA3LDB4MGYsMHhmZiwweDAwLDB4MDMsMHgzMywweDAyLAorMHgwMCwweDAzLDB4MmQsMHgwMiwweDAwLDB4MDMsMHg0MywweDAyLDB4MzAsMHg2OSwweDBmLDB4ZmYsMHgwMCwweDYyLDB4MTgsMHgyNCwKKzB4MzAsMHhhNSwweDAwLDB4MDMsMHgzMCwweGM2LDB4MDAsMHhmZiwweDEwLDB4NjAsMHgwMCwweDA4LDB4MzEsMHgwOCwweDAwLDB4ZmYsCisweDAxLDB4MDAsMHgzMCwweDIxLDB4MGMsMHgwMCwweDI0LDB4ZGYsMHhhZiwweGE5LDB4MDAsMHgxMCwweDhmLDB4YmYsMHgwMCwweDE4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MjAsMHgwYywweDAwLDB4MjUsMHgzMSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAzLDB4YjAsMHgwMywweDM0LDB4NjMsMHgwMCwweGQ0LDB4MDgsMHgwMCwweDI0LDB4M2YsCisweGFjLDB4NjIsMHgwMCwweDAwLDB4MjcsMHhiZCwweGZmLDB4YzAsMHgzYywweDAyLDB4YjAsMHgwMywweGFmLDB4YmUsMHgwMCwweDM4LAorMHhhZiwweGI1LDB4MDAsMHgyYywweGFmLDB4YjEsMHgwMCwweDFjLDB4YWYsMHhiMCwweDAwLDB4MTgsMHhhZiwweGJmLDB4MDAsMHgzYywKKzB4YWYsMHhiNywweDAwLDB4MzQsMHhhZiwweGI2LDB4MDAsMHgzMCwweGFmLDB4YjQsMHgwMCwweDI4LDB4YWYsMHhiMywweDAwLDB4MjQsCisweGFmLDB4YjIsMHgwMCwweDIwLDB4MzQsMHg0MiwweDAwLDB4M2YsMHg5MCwweDQzLDB4MDAsMHgwMCwweDAwLDB4ODAsMHg4MCwweDIxLAorMHgwMCwweDAwLDB4ZjAsMHgyMSwweDAwLDB4MDAsMHg4OCwweDIxLDB4MTAsMHg2MCwweDAwLDB4NzYsMHgwMCwweDAwLDB4YTgsMHgyMSwKKzB4M2MsMHgwMSwweGIwLDB4MDMsMHhhMCwweDIwLDB4MDAsMHgzZiwweDAwLDB4MTAsMHgxMiwweDAyLDB4MjQsMHgwNCwweDA2LDB4MTQsCisweDBjLDB4MDAsMHgwNiwweGQxLDB4MzAsMHg1NCwweDAwLDB4MGYsMHgyNCwweDA0LDB4MDYsMHgxNCwweDBjLDB4MDAsMHgwNiwweGQxLAorMHhhZiwweGEyLDB4MDAsMHgxMCwweDNjLDB4MDMsMHgwMCwweGZmLDB4MzQsMHg2MywweGZmLDB4ZmYsMHgzMiwweDEwLDB4MDAsMHg3ZiwKKzB4MDAsMHg0MywweDEwLDB4MjQsMHgwMCwweDEwLDB4ODYsMHgwMCwweDAyLDB4MDIsMHg4MCwweDI1LDB4MDIsMHgwMCwweDI4LDB4MjEsCisweDI0LDB4MDQsMHgwNiwweDE0LDB4M2MsMHgxMywweGJmLDB4ZmYsMHgwYywweDAwLDB4MDYsMHhiZiwweDNjLDB4MTYsMHhiMCwweDAzLAorMHgwMCwweDAwLDB4OTAsMHgyMSwweDNjLDB4MTcsMHg0MCwweDAwLDB4MzYsMHg3MywweGZmLDB4ZmYsMHgzNiwweGQ2LDB4MDAsMHgzZSwKKzB4MGMsMHgwMCwweDA2LDB4ZDEsMHgyNCwweDA0LDB4MDQsMHgwMCwweDAwLDB4NTcsMHgxMCwweDI1LDB4MDAsMHg0MCwweDI4LDB4MjEsCisweDBjLDB4MDAsMHgwNiwweGJmLDB4MjQsMHgwNCwweDA0LDB4MDAsMHgwMCwweDAwLDB4ODAsMHgyMSwweDBjLDB4MDAsMHgyNSwweGY5LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI2LDB4MDMsMHgwMCwweDAxLDB4MTAsMHg0MCwweDAwLDB4NDYsMHgzMCwweDcwLDB4MDAsMHhmZiwKKzB4MTIsMHgwMCwweGZmLDB4ZmEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgwNiwweGQxLDB4MjQsMHgwNCwweDA0LDB4MDAsCisweDAwLDB4NTMsMHgxMCwweDI0LDB4MDAsMHg0MCwweDI4LDB4MjEsMHgwYywweDAwLDB4MDYsMHhiZiwweDI0LDB4MDQsMHgwNCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDEyLDB4ODIsMHgwMCwweDM3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMiwweDgwLDB4MDAsMHgzNSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMiwweDMxLDB4MDAsMHg3ZiwweDEyLDB4MjAsMHgwMCwweDA0LDB4MjQsMHgwMywweDAwLDB4MDQsCisweDI3LDB4YzIsMHgwMCwweDAxLDB4MzAsMHg1ZSwweDAwLDB4ZmYsMHgwMiwweGIxLDB4YTgsMHgyMSwweDEyLDB4NDMsMHgwMCwweDJhLAorMHgzYywweDAzLDB4YjAsMHgwMywweDAyLDB4NDMsMHgxMCwweDIxLDB4YTAsMHg1MSwweDAwLDB4MzQsMHgyNiwweDQyLDB4MDAsMHgwMSwKKzB4MzAsMHg1MiwweDAwLDB4ZmYsMHgyZSwweDQzLDB4MDAsMHgwNSwweDE0LDB4NjAsMHhmZiwweGQ5LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDhmLDB4YTUsMHgwMCwweDEwLDB4MGMsMHgwMCwweDA2LDB4YmYsMHgyNCwweDA0LDB4MDYsMHgxNCwweDEyLDB4YTAsMHgwMCwweDBlLAorMHgzYywweDAyLDB4YjAsMHgwMywweDEzLDB4YzAsMHgwMCwweDBkLDB4MzQsMHg0MiwweDAwLDB4M2MsMHgwMCwweDE1LDB4MTAsMHg0MCwKKzB4MDAsMHg1NSwweDEwLDB4MjEsMHgwMCwweDAyLDB4MTAsMHhjMCwweDAwLDB4NTUsMHgxMCwweDIxLDB4MDAsMHgwMiwweGE4LDB4ODAsCisweDAyLDB4YmUsMHgwMCwweDFiLDB4MTcsMHhjMCwweDAwLDB4MDIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDcsMHgwMCwweDBkLAorMHgwMCwweDAwLDB4YTgsMHgxMiwweDNjLDB4MDIsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAwLDB4M2MsMHgzYywweDAzLDB4YjAsMHgwMywKKzB4M2MsMHgwNCwweGIwLDB4MDMsMHhhNCwweDU1LDB4MDAsMHgwMCwweDM0LDB4NjMsMHgwMCwweDFjLDB4MzQsMHg4NCwweDAwLDB4MWQsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4YTAsMHg2MCwweDAwLDB4MDAsMHhhMCwweDgyLDB4MDAsMHgwMCwweDdiLDB4YmUsMHgwMSwweGZjLAorMHg3YiwweGI2LDB4MDEsMHhiYywweDdiLDB4YjQsMHgwMSwweDdjLDB4N2IsMHhiMiwweDAxLDB4M2MsMHg3YiwweGIwLDB4MDAsMHhmYywKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHg0MCwweGEyLDB4ZDEsMHgwMCwweDAwLDB4MDgsMHgwMCwweDI0LDB4OTgsCisweDI2LDB4NDIsMHgwMCwweDAxLDB4MGMsMHgwMCwweDA2LDB4ZDEsMHgyNCwweDA0LDB4MDQsMHhmYywweDA4LDB4MDAsMHgyNCwweDhkLAorMHgwMCwweDQwLDB4ODgsMHgyMSwweDNjLDB4MDMsMHhiMCwweDAzLDB4MzQsMHg2MywweDAwLDB4M2MsMHgzYywweDA0LDB4YjAsMHgwMywKKzB4M2MsMHgwNSwweGIwLDB4MDMsMHhhNCwweDYwLDB4MDAsMHgwMCwweDM0LDB4ODQsMHgwMCwweDFjLDB4MzQsMHhhNSwweDAwLDB4MWQsCisweDI0LDB4MDIsMHgwMCwweDAyLDB4MjQsMHgwMywweDAwLDB4MDEsMHhhMCwweDgyLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyNCwweGI3LAorMHhhMCwweGEzLDB4MDAsMHgwMCwweDBjLDB4MDAsMHgxNywweDk5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4ZmYsMHg4YiwKKzB4MDAsMHgxMCwweDEyLDB4MDIsMHgzYywweDAyLDB4YjAsMHgwMywweDNjLDB4MDQsMHhiMCwweDAzLDB4MzQsMHg0MiwweDAwLDB4M2MsCisweDM0LDB4ODQsMHgwMCwweDE0LDB4MjQsMHgwMywweDAwLDB4MDEsMHhhNCwweDQwLDB4MDAsMHgwMCwweDNjLDB4MDEsMHhiMCwweDAzLAorMHhhMCwweDIzLDB4MDAsMHgzZiwweDA4LDB4MDAsMHgyNCwweGI3LDB4YWMsMHg5MCwweDAwLDB4MDAsMHgyNywweGJkLDB4ZmYsMHhkOCwKKzB4YWYsMHhiMCwweDAwLDB4MTAsMHgzMCwweGQwLDB4MDAsMHhmZiwweDJlLDB4MDIsMHgwMCwweDJlLDB4YWYsMHhiMiwweDAwLDB4MTgsCisweGFmLDB4YjEsMHgwMCwweDE0LDB4YWYsMHhiZiwweDAwLDB4MjAsMHhhZiwweGIzLDB4MDAsMHgxYywweDMwLDB4YjEsMHgwMCwweGZmLAorMHgxNCwweDQwLDB4MDAsMHgwNiwweDAwLDB4ODAsMHg5MCwweDIxLDB4OGYsMHhiZiwweDAwLDB4MjAsMHg3YiwweGIyLDB4MDAsMHhmYywKKzB4N2IsMHhiMCwweDAwLDB4YmMsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDI4LDB4MmUsMHgxMywweDAwLDB4MTAsCisweDI0LDB4MDUsMHgwMCwweDE0LDB4MGMsMHgwMCwweDEzLDB4YTQsMHgyNCwweDA2LDB4MDEsMHgwNywweDEyLDB4NjAsMHgwMCwweDM4LAorMHgwMiwweDAwLDB4MzAsMHgyMSwweDhmLDB4YTIsMHgwMCwweDM4LDB4MzAsMHhjMywweDAwLDB4M2YsMHgzYywweDA0LDB4YjAsMHgwOSwKKzB4MDAsMHgwMiwweDE0LDB4MDAsMHgwMCwweDQzLDB4MzAsMHgyNSwweDM0LDB4ODQsMHgwMSwweDYwLDB4OTAsMHg4MiwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MTQsMHg0MCwweGZmLDB4ZmQsMHgyNCwweDAyLDB4MDAsMHgwMSwweDEyLDB4MjIsMHgwMCwweDJhLAorMHgyYSwweDIyLDB4MDAsMHgwMiwweDE0LDB4NDAsMHgwMCwweDI0LDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMiwweDIyLDB4MDAsMHgyMCwKKzB4MjQsMHgwMiwweDAwLDB4MDMsMHgxMiwweDIyLDB4MDAsMHgxOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTYsMHg2MCwweGZmLDB4ZTIsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MTIsMHgyMiwweDAwLDB4MTMsMHgyYSwweDIyLDB4MDAsMHgwMiwweDE0LDB4NDAsMHgwMCwweDBkLAorMHgyNCwweDAyLDB4MDAsMHgwMiwweDEyLDB4MjIsMHgwMCwweDA5LDB4MjQsMHgwMiwweDAwLDB4MDMsMHgxNiwweDIyLDB4ZmYsMHhkYSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDA0LDB4MDgsMHg0YywweDI0LDB4MDUsMHhmZiwweGZmLDB4MGMsMHgwMCwweDEzLDB4NWYsCisweDNjLDB4MDYsMHgwYywweGI4LDB4MDgsMHgwMCwweDI0LDB4ZWEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyNSwweDEyLAorMHgyNCwweDA0LDB4MDgsMHg0OCwweDE2LDB4MjAsMHhmZiwweGQwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjUsMHgxMiwKKzB4MjQsMHgwNCwweDA4LDB4NDAsMHgwOCwweDAwLDB4MjUsMHgxMiwweDI0LDB4MDQsMHgwOCwweDQ0LDB4MjQsMHgwNCwweDA4LDB4NGMsCisweDBjLDB4MDAsMHgxMywweDVmLDB4MjQsMHgwNSwweGZmLDB4ZmYsMHgwOCwweDAwLDB4MjUsMHgwNywweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MjUsMHgyMCwweDI0LDB4MDQsMHgwOCwweDQ4LDB4MTYsMHgyMCwweGZmLDB4ZTAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MDgsMHgwMCwweDI1LDB4MjAsMHgyNCwweDA0LDB4MDgsMHg0MCwweDA4LDB4MDAsMHgyNSwweDIwLDB4MjQsMHgwNCwweDA4LDB4NDQsCisweDAyLDB4NDAsMHgyMCwweDIxLDB4MGMsMHgwMCwweDI1LDB4NzEsMHgwMiwweDIwLDB4MjgsMHgyMSwweDA4LDB4MDAsMHgyNCwweGY1LAorMHgwMCwweDQwLDB4MzAsMHgyMSwweDI3LDB4YmQsMHhmZiwweGQ4LDB4MmMsMHhjMiwweDAwLDB4MmUsMHhhZiwweGIyLDB4MDAsMHgxOCwKKzB4YWYsMHhiMSwweDAwLDB4MTQsMHhhZiwweGIwLDB4MDAsMHgxMCwweGFmLDB4YmYsMHgwMCwweDIwLDB4YWYsMHhiMywweDAwLDB4MWMsCisweDAwLDB4YzAsMHg4MCwweDIxLDB4MzAsMHhiMSwweDAwLDB4ZmYsMHgwMCwweDgwLDB4OTAsMHgyMSwweDE0LDB4NDAsMHgwMCwweDA3LAorMHgwMCwweDAwLDB4MTgsMHgyMSwweDhmLDB4YmYsMHgwMCwweDIwLDB4N2IsMHhiMiwweDAwLDB4ZmMsMHg3YiwweGIwLDB4MDAsMHhiYywKKzB4MDAsMHg2MCwweDEwLDB4MjEsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDI4LDB4MmUsMHgxMywweDAwLDB4MTAsCisweDI0LDB4MDUsMHgwMCwweDE0LDB4MGMsMHgwMCwweDEzLDB4YTQsMHgyNCwweDA2LDB4MDEsMHgwNywweDEyLDB4NjAsMHgwMCwweDI0LAorMHgwMiwweDAwLDB4MzAsMHgyMSwweDNjLDB4MDMsMHhiMCwweDA5LDB4MzQsMHg2MywweDAxLDB4NjAsMHg5MCwweDYyLDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDQwLDB4ZmYsMHhmZCwweDMwLDB4YzUsMHgwMCwweDNmLDB4MGMsMHgwMCwweDI1LDB4YWUsCisweDAyLDB4MjAsMHgyMCwweDIxLDB4MTYsMHg2MCwweDAwLDB4MGEsMHgwMCwweDQwLDB4ODAsMHgyMSwweDI0LDB4MDIsMHgwMCwweDAxLAorMHgxMiwweDIyLDB4MDAsMHgxNSwweDJhLDB4MjIsMHgwMCwweDAyLDB4MTQsMHg0MCwweDAwLDB4MGYsMHgyNCwweDAyLDB4MDAsMHgwMiwKKzB4MTIsMHgyMiwweDAwLDB4MGIsMHgyNCwweDAyLDB4MDAsMHgwMywweDEyLDB4MjIsMHgwMCwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgyNSwweDNkLDB4MDIsMHgwMCwweDE4LDB4MjEsMHgyNCwweDA0LDB4MDgsMHg0YywweDI0LDB4MDUsMHhmZiwweGZmLAorMHgwYywweDAwLDB4MTMsMHg1ZiwweDNjLDB4MDYsMHgwYywweGI4LDB4MDgsMHgwMCwweDI1LDB4M2QsMHgwMiwweDAwLDB4MTgsMHgyMSwKKzB4MDgsMHgwMCwweDI1LDB4NWYsMHgyNCwweDA0LDB4MDgsMHg0OCwweDE2LDB4MjAsMHhmZiwweGY1LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDA4LDB4MDAsMHgyNSwweDVmLDB4MjQsMHgwNCwweDA4LDB4NDAsMHgwOCwweDAwLDB4MjUsMHg1ZiwweDI0LDB4MDQsMHgwOCwweDQ0LAorMHgwMiwweDQwLDB4MjAsMHgyMSwweDBjLDB4MDAsMHgyNSwweDcxLDB4MDIsMHgyMCwweDI4LDB4MjEsMHgwOCwweDAwLDB4MjUsMHg0OSwKKzB4MDAsMHg0MCwweDMwLDB4MjEsMHgyNywweGJkLDB4ZmYsMHhlOCwweDJjLDB4YzIsMHgwMCwweDFmLDB4YWYsMHhiMCwweDAwLDB4MTAsCisweGFmLDB4YmYsMHgwMCwweDE0LDB4MDAsMHhjMCwweDgwLDB4MjEsMHgxNCwweDQwLDB4MDAsMHgxZCwweDMwLDB4YTUsMHgwMCwweGZmLAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDEwLDB4YTIsMHgwMCwweDE4LDB4MjgsMHhhMiwweDAwLDB4MDIsMHgxNCwweDQwLDB4MDAsMHgxMiwKKzB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweGEyLDB4MDAsMHgwZSwweDI0LDB4MDIsMHgwMCwweDAzLDB4MTAsMHhhMiwweDAwLDB4MDcsCisweDI0LDB4MDQsMHgwOCwweDRjLDB4MjYsMHgxMCwweGZmLDB4ZTIsMHgwMiwweDAwLDB4MTAsMHgyMSwweDhmLDB4YmYsMHgwMCwweDE0LAorMHg4ZiwweGIwLDB4MDAsMHgxMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTgsMHgyNCwweDA1LDB4ZmYsMHhmZiwKKzB4MGMsMHgwMCwweDEzLDB4NWYsMHgzYywweDA2LDB4MGQsMHhmOCwweDA4LDB4MDAsMHgyNSwweDgyLDB4MjYsMHgxMCwweGZmLDB4ZTIsCisweDA4LDB4MDAsMHgyNSwweDg3LDB4MjQsMHgwNCwweDA4LDB4NDgsMHgxNCwweGEwLDB4ZmYsMHhmMiwweDI0LDB4MDQsMHgwOCwweDQwLAorMHgwOCwweDAwLDB4MjUsMHg4OCwweDI0LDB4MDUsMHhmZiwweGZmLDB4MDgsMHgwMCwweDI1LDB4ODcsMHgyNCwweDA0LDB4MDgsMHg0NCwKKzB4MmMsMHhjMiwweDAwLDB4MTAsMHgxNCwweDQwLDB4ZmYsMHhlYywweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHhhMiwweDAwLDB4MTQsCisweDI4LDB4YTIsMHgwMCwweDAyLDB4MTQsMHg0MCwweDAwLDB4MGUsMHgyNCwweDAyLDB4MDAsMHgwMiwweDEwLDB4YTIsMHgwMCwweDBhLAorMHgyNCwweDAyLDB4MDAsMHgwMywweDEwLDB4YTIsMHgwMCwweDAzLDB4MjQsMHgwNCwweDA4LDB4NGMsMHgwOCwweDAwLDB4MjUsMHg4MiwKKzB4MjYsMHgxMCwweGZmLDB4ZjEsMHgyNCwweDA1LDB4ZmYsMHhmZiwweDBjLDB4MDAsMHgxMywweDVmLDB4M2MsMHgwNiwweDBkLDB4YjgsCisweDA4LDB4MDAsMHgyNSwweDgyLDB4MjYsMHgxMCwweGZmLDB4ZjEsMHgwOCwweDAwLDB4MjUsMHhhMSwweDI0LDB4MDQsMHgwOCwweDQ4LAorMHgxNCwweGEwLDB4ZmYsMHhmNiwweDI0LDB4MDQsMHgwOCwweDQwLDB4MDgsMHgwMCwweDI1LDB4YTIsMHgyNCwweDA1LDB4ZmYsMHhmZiwKKzB4MDgsMHgwMCwweDI1LDB4YTEsMHgyNCwweDA0LDB4MDgsMHg0NCwweDI3LDB4YmQsMHhmZiwweGU4LDB4MzAsMHg4NCwweDAwLDB4ZmYsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MTAsMHg4MiwweDAwLDB4MzksMHhhZiwweGJmLDB4MDAsMHgxMCwweDI4LDB4ODIsMHgwMCwweDAyLAorMHgxNCwweDQwLDB4MDAsMHgyNywweDAwLDB4MDAsMHgwMCwweDAwLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxMCwweDgyLDB4MDAsMHgxNywKKzB4MDAsMHhhMCwweDMwLDB4MjEsMHgyNCwweDAyLDB4MDAsMHgwMywweDEwLDB4ODIsMHgwMCwweDA1LDB4MjQsMHgwNCwweDA4LDB4M2MsCisweDhmLDB4YmYsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMywweGUwLDB4MDAsMHgwOCwweDI3LDB4YmQsMHgwMCwweDE4LAorMHgwYywweDAwLDB4MTMsMHg1ZiwweDNjLDB4MDUsMHgzZiwweDAwLDB4MjQsMHgwNCwweDA4LDB4M2MsMHgzYywweDA1LDB4ODAsMHgwMCwKKzB4MGMsMHgwMCwweDEzLDB4NWYsMHgwMCwweDAwLDB4MzAsMHgyMSwweDI0LDB4MDQsMHgwOCwweDNjLDB4M2MsMHgwNSwweDgwLDB4MDAsCisweDBjLDB4MDAsMHgxMywweDVmLDB4MjQsMHgwNiwweDAwLDB4MDEsMHgyNCwweDA0LDB4MDgsMHhhYywweDBjLDB4MDAsMHgxMywweDQxLAorMHgyNCwweDA1LDB4MGYsMHhmZiwweDA4LDB4MDAsMHgyNSwweGJjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDA0LDB4MDgsMHgzNCwKKzB4MGMsMHgwMCwweDEzLDB4NWYsMHgzYywweDA1LDB4M2YsMHgwMCwweDI0LDB4MDQsMHgwOCwweDM0LDB4M2MsMHgwNSwweDgwLDB4MDAsCisweDBjLDB4MDAsMHgxMywweDVmLDB4MDAsMHgwMCwweDMwLDB4MjEsMHgyNCwweDA0LDB4MDgsMHgzNCwweDNjLDB4MDUsMHg4MCwweDAwLAorMHgwYywweDAwLDB4MTMsMHg1ZiwweDI0LDB4MDYsMHgwMCwweDAxLDB4MDgsMHgwMCwweDI1LDB4Y2IsMHgyNCwweDA0LDB4MDgsMHhhOCwKKzB4MTQsMHg4MCwweGZmLDB4ZGYsMHgwMCwweGEwLDB4MzAsMHgyMSwweDI0LDB4MDQsMHgwOCwweDI0LDB4MGMsMHgwMCwweDEzLDB4NWYsCisweDNjLDB4MDUsMHgzZiwweDAwLDB4MjQsMHgwNCwweDA4LDB4MjQsMHgzYywweDA1LDB4ODAsMHgwMCwweDBjLDB4MDAsMHgxMywweDVmLAorMHgwMCwweDAwLDB4MzAsMHgyMSwweDI0LDB4MDQsMHgwOCwweDI0LDB4M2MsMHgwNSwweDgwLDB4MDAsMHgwYywweDAwLDB4MTMsMHg1ZiwKKzB4MjQsMHgwNiwweDAwLDB4MDEsMHgwOCwweDAwLDB4MjUsMHhjYiwweDI0LDB4MDQsMHgwOCwweGEwLDB4MDAsMHhhMCwweDMwLDB4MjEsCisweDI0LDB4MDQsMHgwOCwweDJjLDB4MGMsMHgwMCwweDEzLDB4NWYsMHgzYywweDA1LDB4M2YsMHgwMCwweDI0LDB4MDQsMHgwOCwweDJjLAorMHgzYywweDA1LDB4ODAsMHgwMCwweDBjLDB4MDAsMHgxMywweDVmLDB4MDAsMHgwMCwweDMwLDB4MjEsMHgyNCwweDA0LDB4MDgsMHgyYywKKzB4M2MsMHgwNSwweDgwLDB4MDAsMHgwYywweDAwLDB4MTMsMHg1ZiwweDI0LDB4MDYsMHgwMCwweDAxLDB4MDgsMHgwMCwweDI1LDB4Y2IsCisweDI0LDB4MDQsMHgwOCwweGE0LDB4M2MsMHgwNSwweDAwLDB4MTQsMHgzYywweDAyLDB4YjAsMHgwNSwweDM0LDB4NDIsMHgwNCwweDIwLAorMHgzYywweDA2LDB4YzAsMHgwMCwweDNjLDB4MDMsMHhiMCwweDA1LDB4M2MsMHgwNCwweGIwLDB4MDUsMHgzNCwweGE1LDB4MTcsMHgwOSwKKzB4YWMsMHg0NSwweDAwLDB4MDAsMHgzNCwweGM2LDB4MDUsMHgwNywweDM0LDB4NjMsMHgwNCwweDI0LDB4MzQsMHg4NCwweDAyLDB4MjgsCisweDNjLDB4MDcsMHhiMCwweDA1LDB4MjQsMHgwMiwweDAwLDB4MjAsMHhhYywweDY2LDB4MDAsMHgwMCwweDM0LDB4ZTcsMHgwNCwweDUwLAorMHhhMCwweDgyLDB4MDAsMHgwMCwweDkwLDB4ZTIsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDQyLDB4MDAsMHgwMywKKzB4MTAsMHg0MCwweGZmLDB4ZmMsMHgyNCwweDAyLDB4MDAsMHgwMSwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDkzLDB4ODUsMHg4MSwweGYxLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxNCwweGEyLDB4MDAsMHg1MywweDAwLDB4ODAsMHg0MCwweDIxLAorMHg4YywweDg5LDB4MDAsMHgwNCwweDNjLDB4MDIsMHhiMCwweDAxLDB4MDEsMHgyMiwweDMwLDB4MjEsMHg4YywweGMzLDB4MDAsMHgwNCwKKzB4M2MsMHgwMiwweDAxLDB4MDAsMHgwMCwweDYyLDB4MTAsMHgyNCwweDEwLDB4NDAsMHgwMCwweDRiLDB4MzAsMHg2MiwweDAwLDB4MDgsCisweDEwLDB4NDUsMHgwMCwweDU5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NCwweGMyLDB4MDAsMHgzOCwweDI0LDB4MDMsMHgwMCwweGI0LAorMHgzMCwweDQ0LDB4MDAsMHhmZiwweDEwLDB4ODMsMHgwMCwweDYxLDB4MjQsMHgwMiwweDAwLDB4YzQsMHgxMCwweDgyLDB4MDAsMHg1NCwKKzB4MjQsMHgwMiwweDAwLDB4OTQsMHgxMCwweDgyLDB4MDAsMHg0NSwweDAwLDB4MDAsMHgwMCwweDAwLDB4OTQsMHhjMiwweDAwLDB4MzgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0NywweGZmLDB4ZmYsMHgzMCwweGUzLDB4NDAsMHhmZiwweDI0LDB4MDIsMHg0MCwweDg4LAorMHgxNCwweDYyLDB4MDAsMHgzOSwweDMwLDB4ZTMsMHgwMywweDAwLDB4MjQsMHgwMiwweDAzLDB4MDAsMHgxMCwweDYyLDB4MDAsMHgzOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg5NCwweGMyLDB4MDAsMHg1NiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MzAsMHg0NywweGZmLDB4ZmYsCisweDMwLDB4ZTIsMHgwMCwweDgwLDB4MTQsMHg0MCwweDAwLDB4MzAsMHgzYywweDAyLDB4YjAsMHgwMSwweDAxLDB4MjIsMHgzMCwweDIxLAorMHg5NCwweGMzLDB4MDAsMHg2MCwweDI0LDB4MDIsMHgwMCwweDA4LDB4MTQsMHg0MywweDAwLDB4M2IsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OTAsMHhjMiwweDAwLDB4NjIsMHgyNCwweDAzLDB4MDAsMHgwNCwweDAwLDB4MDIsMHgzOSwweDAyLDB4MTAsMHhlMywweDAwLDB4MTUsCisweDI0LDB4MDIsMHgwMCwweDA2LDB4MTQsMHhlMiwweDAwLDB4MzQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhkLDB4MDUsMHgwMSwweGFjLAorMHg5NCwweGM0LDB4MDAsMHg2NiwweDI3LDB4ODIsMHg4OSwweDY4LDB4MDAsMHgwNSwweDI4LDB4ODAsMHgzMCwweDg3LDB4ZmYsMHhmZiwKKzB4MDAsMHhhMiwweDI4LDB4MjEsMHgwMCwweDA3LDB4MWEsMHgwMCwweDhjLDB4YTQsMHgwMCwweDAwLDB4MDAsMHgwNywweDEyLDB4MDIsCisweDAwLDB4NDMsMHgxMCwweDI1LDB4MjQsMHg0MiwweDAwLDB4NWUsMHgyNCwweDAzLDB4YzAsMHgwMCwweDMwLDB4NDcsMHhmZiwweGZmLAorMHgwMCwweDgzLDB4MjAsMHgyNCwweDAwLDB4ODcsMHgyMCwweDI1LDB4YWMsMHhhNCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjYsMHg3NiwKKzB4YWQsMHgwNywweDAwLDB4MTAsMHg4ZCwweDA1LDB4MDEsMHhhYywweDk0LDB4YzQsMHgwMCwweDY0LDB4MjcsMHg4MiwweDg5LDB4NjgsCisweDAwLDB4MDUsMHgyOCwweDgwLDB4MzAsMHg4NywweGZmLDB4ZmYsMHgwMCwweGEyLDB4MjgsMHgyMSwweDAwLDB4MDcsMHgxYSwweDAwLAorMHg4YywweGE0LDB4MDAsMHgwMCwweDAwLDB4MDcsMHgxMiwweDAyLDB4MDAsMHg0MywweDEwLDB4MjUsMHgyNCwweDQyLDB4MDAsMHgzNiwKKzB4M2MsMHgwMywweGZmLDB4ZmYsMHgzMCwweDQ3LDB4ZmYsMHhmZiwweDAwLDB4ODMsMHgyMCwweDI0LDB4MDAsMHg4NywweDIwLDB4MjUsCisweGFjLDB4YTQsMHgwMCwweDAwLDB4YWQsMHgwNywweDAwLDB4MTAsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg5NCwweGMyLDB4MDAsMHg1MCwweDA4LDB4MDAsMHgyNiwweDM0LDB4MzAsMHg0NywweGZmLDB4ZmYsMHg4ZCwweDA0LDB4MDEsMHhhYywKKzB4MjcsMHg4MywweDg5LDB4NjgsMHgwMCwweDA0LDB4MjAsMHg4MCwweDAwLDB4ODMsMHgyMCwweDIxLDB4OGMsMHg4MiwweDAwLDB4MDAsCisweDNjLDB4MDMsMHhmZiwweGZmLDB4MDAsMHg0MywweDEwLDB4MjQsMHgzNCwweDQyLDB4MDAsMHgyZSwweGFjLDB4ODIsMHgwMCwweDAwLAorMHgyNCwweDAzLDB4MDAsMHgyZSwweGFkLDB4MDMsMHgwMCwweDEwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4OGQsMHgwNCwweDAxLDB4YWMsMHgyNywweDgzLDB4ODksMHg2OCwweDAwLDB4MDQsMHgyMCwweDgwLDB4MDAsMHg4MywweDIwLDB4MjEsCisweDhjLDB4ODIsMHgwMCwweDAwLDB4M2MsMHgwMywweGZmLDB4ZmYsMHgwMCwweDQzLDB4MTAsMHgyNCwweDM0LDB4NDIsMHgwMCwweDBlLAorMHgyNCwweDAzLDB4MDAsMHgwZSwweDA4LDB4MDAsMHgyNiwweDc1LDB4YWMsMHg4MiwweDAwLDB4MDAsMHg4ZCwweDA0LDB4MDEsMHhhYywKKzB4MjcsMHg4MywweDg5LDB4NjgsMHgwMCwweDA0LDB4MjAsMHg4MCwweDAwLDB4ODMsMHgyMCwweDIxLDB4OGMsMHg4MiwweDAwLDB4MDAsCisweDNjLDB4MDMsMHhmZiwweGZmLDB4MDAsMHg0MywweDEwLDB4MjQsMHgzNCwweDQyLDB4MDAsMHgxNCwweDI0LDB4MDMsMHgwMCwweDE0LAorMHgwOCwweDAwLDB4MjYsMHg3NSwweGFjLDB4ODIsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4MzAsMHhjNiwweDAwLDB4ZmYsMHgwMCwweDA2LDB4NDgsMHg0MCwweDAxLDB4MjYsMHgxMCwweDIxLDB4MDAsMHgwMiwweDEwLDB4ODAsCisweDI3LDB4OGIsMHhiYywweDMwLDB4MjcsMHg4MywweGJjLDB4MzYsMHgwMCwweDRiLDB4NDAsMHgyMSwweDAwLDB4NDMsMHgxMCwweDIxLAorMHg5NCwweDQ3LDB4MDAsMHgwMCwweDMwLDB4YTIsMHgzZiwweGZmLDB4MTAsMHhlMiwweDAwLDB4MjksMHgzMCwweDhhLDB4ZmYsMHhmZiwKKzB4OTUsMHgwMiwweDAwLDB4MDIsMHgyNCwweDAzLDB4MDAsMHgwMSwweDAwLDB4MDIsMHgxMSwweDgyLDB4MzAsMHg0MiwweDAwLDB4MDEsCisweDEwLDB4NDMsMHgwMCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMSwweDI2LDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMCwweDgwLAorMHgwMCwweDRiLDB4MzAsMHgyMSwweDk0LDB4YzQsMHgwMCwweDAyLDB4MjcsMHg4MywweGJjLDB4MzYsMHgyNywweDg1LDB4YmMsMHgzNCwKKzB4MDAsMHg0NSwweDI4LDB4MjEsMHgzMCwweDg0LDB4ZmYsMHhkZiwweDAwLDB4NDMsMHgxMCwweDIxLDB4YTQsMHhjNCwweDAwLDB4MDIsCisweGE0LDB4NDAsMHgwMCwweDAwLDB4YTQsMHhhMCwweDAwLDB4MDAsMHg5NCwweGMzLDB4MDAsMHgwMiwweDNjLDB4MDQsMHhiMCwweDAxLAorMHgwMSwweDQ0LDB4MjAsMHgyMSwweDMwLDB4NjMsMHhmZiwweGJmLDB4YTQsMHhjMywweDAwLDB4MDIsMHhhMCwweGMwLDB4MDAsMHgwMCwKKzB4OGMsMHg4MiwweDAwLDB4MDQsMHgyNCwweDAzLDB4ZjAsMHhmZiwweDAwLDB4NDMsMHgxMCwweDI0LDB4MDMsMHhlMCwweDAwLDB4MDgsCisweGFjLDB4ODIsMHgwMCwweDA0LDB4MjQsMHgwMiwweGMwLDB4MDAsMHg5MSwweDA0LDB4MDAsMHgwMSwweDAwLDB4YTIsMHgxMCwweDI0LAorMHgwMCwweDQ3LDB4MjgsMHgyNSwweDNjLDB4MDMsMHhiMCwweDAxLDB4MjQsMHgwMiwweDAwLDB4MDIsMHgxNCwweDgyLDB4ZmYsMHhlMiwKKzB4MDEsMHg0MywweDE4LDB4MjEsMHhhYywweDY1LDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyNiwweGEzLDB4MDEsMHgyNiwweDEwLDB4MjEsCisweDA4LDB4MDAsMHgyNiwweGEzLDB4MDEsMHgyNiwweDEwLDB4MjEsMHg5MywweDgzLDB4ODEsMHhmMSwweDI0LDB4MDIsMHgwMCwweDAxLAorMHgxNCwweDYyLDB4MDAsMHgwZCwweDNjLDB4MDIsMHhiMCwweDAxLDB4OGMsMHg4NCwweDAwLDB4MDQsMHgzYywweDA2LDB4YjAsMHgwOSwKKzB4MDAsMHg4MiwweDIwLDB4MjEsMHg4YywweDg1LDB4MDAsMHgwOCwweDhjLDB4ODMsMHgwMCwweDA0LDB4M2MsMHgwMiwweDAxLDB4MDAsCisweDM0LDB4YzYsMHgwMSwweDAwLDB4MDAsMHg2MiwweDE4LDB4MjQsMHgxNCwweDYwLDB4MDAsMHgwNSwweDMwLDB4YTUsMHgyMCwweDAwLAorMHgyNCwweDAyLDB4MDAsMHgwNiwweGEwLDB4YzIsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKzB4M2MsMHgwMywweGIwLDB4MDksMHgxMCwweGEwLDB4ZmYsMHhmYywweDM0LDB4NjMsMHgwMSwweDAwLDB4MjQsMHgwMiwweDAwLDB4MGUsCisweDA4LDB4MDAsMHgyNiwweGQ2LDB4YTAsMHg2MiwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMSwweDMwLDB4YTUsMHhmZiwweGZmLAorMHgwMCwweGEyLDB4MjgsMHgyMSwweDhjLDB4YTMsMHgwMCwweDAwLDB4M2MsMHgwMiwweDEwLDB4MDAsMHgwMCwweDgwLDB4MzAsMHgyMSwKKzB4MDAsMHg2MiwweDE4LDB4MjQsMHg4YywweGEyLDB4MDAsMHgwNCwweDEwLDB4NjAsMHgwMCwweDA0LDB4MDAsMHgwMCwweDAwLDB4MDAsCisweDMwLDB4NDIsMHg4MCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MTMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhjLDB4YzIsMHgwMSwweGE4LAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NDQsMHgwMCwweDAxLDB4MjgsMHg4MywweDAwLDB4MDAsMHgyNCwweDQyLDB4MDAsMHg0MCwKKzB4MDAsMHg4MywweDEwLDB4MGEsMHg5MywweDgzLDB4ODEsMHhmMCwweDAwLDB4MDIsMHgxMSwweDgzLDB4MDAsMHgwMiwweDExLDB4ODAsCisweDAwLDB4ODIsMHgyMCwweDIzLDB4MjQsMHg2MywweGZmLDB4ZmYsMHhhYywweGM0LDB4MDEsMHhhOCwweGEzLDB4ODMsMHg4MSwweGYwLAorMHg4YywweGM0LDB4MDEsMHhhYywweDhjLDB4YzIsMHgwMSwweGE4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQ0LDB4MTAsMHgyNiwKKzB4MDAsMHgwMiwweDEwLDB4MmIsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMywweGIwLDB4MDMsCisweDM0LDB4NjMsMHgwMCwweDczLDB4OTAsMHg2MiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDMwLDB4NDIsMHgwMCwweDAxLAorMHgxNCwweDQwLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4YTMsMHg4MCwweDgxLDB4ZjEsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMSwweGEzLDB4ODIsMHg4MSwweGYxLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHg4MiwweDAwLDB4MDQsMHgzYywweDA1LDB4YjAsMHgwMSwweDAwLDB4ODAsMHg1MCwweDIxLAorMHgwMCwweDQ1LDB4MTAsMHgyMSwweDhjLDB4NDMsMHgwMCwweDA0LDB4MjQsMHgwMiwweDAwLDB4MDUsMHgwMCwweDAzLDB4MWEsMHgwMiwKKzB4MzAsMHg2OSwweDAwLDB4MGYsMHgxMSwweDIyLDB4MDAsMHgwYiwweDI0LDB4MDIsMHgwMCwweDA3LDB4MTEsMHgyMiwweDAwLDB4MDksCisweDI0LDB4MDIsMHgwMCwweDBhLDB4MTEsMHgyMiwweDAwLDB4MDcsMHgyNCwweDAyLDB4MDAsMHgwYiwweDExLDB4MjIsMHgwMCwweDA1LAorMHgyNCwweDAyLDB4MDAsMHgwMSwweDkzLDB4ODMsMHg4MSwweGYwLDB4M2MsMHgwNCwweGIwLDB4MDYsMHgxMCwweDYyLDB4MDAsMHgwMywKKzB4MzQsMHg4NCwweDgwLDB4MTgsMHgwMywweGUwLDB4MDAsMHgwOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHg4MiwweDAwLDB4MDAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDE3LDB4MDIsMHgxNCwweDQwLDB4ZmYsMHhmYSwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg4ZCwweDQzLDB4MDEsMHhhOCwweDI3LDB4ODIsMHg4OSwweDY4LDB4MDAsMHgwMywweDE4LDB4ODAsMHgwMCwweDZhLDB4MjAsMHgyMSwKKzB4OGMsMHg4NywweDAwLDB4YTgsMHgwMCwweDYyLDB4MTgsMHgyMSwweDhjLDB4NjgsMHgwMCwweDAwLDB4MDAsMHhlNSwweDI4LDB4MjEsCisweDhjLDB4YTksMHgwMCwweDAwLDB4M2MsMHgwMiwweGZmLDB4ZmYsMHgyNywweDgzLDB4OGEsMHg2OCwweDAxLDB4MjIsMHgxMCwweDI0LAorMHgwMCwweDQ4LDB4MTAsMHgyNSwweGFjLDB4YTIsMHgwMCwweDAwLDB4OGQsMHg0NCwweDAxLDB4YTgsMHgwMCwweDA3LDB4MzAsMHhjMiwKKzB4M2MsMHgwMiwweDAwLDB4ODAsMHgwMCwweDA0LDB4MjAsMHg4MCwweDAwLDB4ODMsMHgyMCwweDIxLDB4MDAsMHgwNiwweDMyLDB4MDAsCisweDhjLDB4YTksMHgwMCwweDA0LDB4MDAsMHhjMiwweDMwLDB4MjUsMHg4YywweDgyLDB4MDAsMHgwMCwweDNjLDB4MDMsMHg4MCwweDAwLAorMHgwMSwweDIyLDB4MTAsMHgyNSwweDAwLDB4NDMsMHgxMCwweDI1LDB4YWMsMHhhMiwweDAwLDB4MDQsMHhhZiwweDg3LDB4YmMsMHgyMCwKKzB4OGMsMHhhMiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGFmLDB4ODIsMHhiYywweDI4LDB4OGMsMHhhMywweDAwLDB4MDQsCisweDNjLDB4MDEsMHhiMCwweDA3LDB4YWMsMHgyNiwweDgwLDB4MTgsMHg4ZCwweDQyLDB4MDEsMHhhOCwweGFmLDB4ODMsMHhiYywweDI0LAorMHg5MywweDg1LDB4ODEsMHhmMCwweDI0LDB4NDQsMHgwMCwweDAxLDB4MjgsMHg4MywweDAwLDB4MDAsMHgyNCwweDQyLDB4MDAsMHg0MCwKKzB4MDAsMHg4MywweDEwLDB4MGEsMHgwMCwweDAyLDB4MTEsMHg4MywweDAwLDB4MDIsMHgxMSwweDgwLDB4MjQsMHhhNSwweGZmLDB4ZmYsCisweDAwLDB4ODIsMHgyMCwweDIzLDB4YWQsMHg0NCwweDAxLDB4YTgsMHhhMywweDg1LDB4ODEsMHhmMCwweDA4LDB4MDAsMHgyNywweDIxLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDUsMHhiMCwweDAzLDB4M2MsMHgwMiwweDgwLDB4MDEsMHgzNCwweGE1LDB4MDAsMHgyMCwKKzB4MjQsMHg0MiwweDlkLDB4NjQsMHhhYywweGEyLDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAyLDB4MjQsMHgwMywweDAwLDB4MjAsCisweGFjLDB4ODIsMHgwMCwweDY0LDB4M2MsMHgwMiwweDgwLDB4MDEsMHhhYywweDgzLDB4MDAsMHg2MCwweGFjLDB4ODAsMHgwMCwweDAwLAorMHhhYywweDgwLDB4MDAsMHgwNCwweGFjLDB4ODAsMHgwMCwweDA4LDB4YWMsMHg4MCwweDAwLDB4NGMsMHhhYywweDgwLDB4MDAsMHg1MCwKKzB4YWMsMHg4MCwweDAwLDB4NTQsMHhhYywweDgwLDB4MDAsMHgwYywweGFjLDB4ODAsMHgwMCwweDU4LDB4YTAsMHg4MCwweDAwLDB4NWMsCisweDI0LDB4NDIsMHg5ZSwweDI4LDB4MjQsMHg4MywweDAwLDB4NjgsMHgyNCwweDA1LDB4MDAsMHgwZiwweDI0LDB4YTUsMHhmZiwweGZmLAorMHhhYywweDYyLDB4MDAsMHgwMCwweDA0LDB4YTEsMHhmZiwweGZkLDB4MjQsMHg2MywweDAwLDB4MDQsMHgzYywweDAyLDB4ODAsMHgwMSwKKzB4MjQsMHg0MiwweDlmLDB4MTAsMHhhYywweDgyLDB4MDAsMHg3OCwweDNjLDB4MDMsMHg4MCwweDAxLDB4M2MsMHgwMiwweDgwLDB4MDEsCisweDI0LDB4NjMsMHhhMCwweDljLDB4MjQsMHg0MiwweGEwLDB4MDgsMHhhYywweDgzLDB4MDAsMHg4OCwweGFjLDB4ODIsMHgwMCwweDk4LAorMHgzYywweDAzLDB4ODAsMHgwMSwweDNjLDB4MDIsMHg4MCwweDAxLDB4MjQsMHg2MywweGExLDB4NDQsMHgyNCwweDQyLDB4YTIsMHg1YywKKzB4YWMsMHg4MywweDAwLDB4YTAsMHhhYywweDgyLDB4MDAsMHhhNCwweGEwLDB4ODAsMHgwMSwweGJhLDB4YWMsMHg4MCwweDAxLDB4YTgsCisweGFjLDB4ODAsMHgwMSwweGFjLDB4YWMsMHg4MCwweDAxLDB4YjAsMHhhYywweDgwLDB4MDEsMHhiNCwweGEwLDB4ODAsMHgwMSwweGI4LAorMHgwMywweGUwLDB4MDAsMHgwOCwweGEwLDB4ODAsMHgwMSwweGI5LDB4M2MsMHgwMywweGIwLDB4MDMsMHgzYywweDAyLDB4ODAsMHgwMSwKKzB4MzQsMHg2MywweDAwLDB4MjAsMHgyNCwweDQyLDB4OWUsMHgyOCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4YWMsMHg2MiwweDAwLDB4MDAsCisweDNjLDB4MDIsMHhiMCwweDAzLDB4M2MsMHgwMywweDgwLDB4MDEsMHgzNCwweDQyLDB4MDAsMHgyMCwweDI0LDB4NjMsMHg5ZSwweDQwLAorMHhhYywweDQzLDB4MDAsMHgwMCwweDhjLDB4ODIsMHgwMCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgxMSwKKzB4MDAsMHg4MCwweDI4LDB4MjEsMHg4YywweDgyLDB4MDAsMHgxNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MGQsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGMsMHg4NCwweDAwLDB4MTAsMHg4YywweGEzLDB4MDAsMHgxNCwweDhjLDB4YTIsMHgwMCwweDA0LAorMHgwMCwweDgzLDB4MjAsMHgyMSwweDAwLDB4NDQsMHgxMCwweDIxLDB4MzAsMHg0MywweDAwLDB4ZmYsMHgwMCwweDAzLDB4MTgsMHgyYiwKKzB4MDAsMHgwMiwweDEyLDB4MDIsMHgwMCwweDQzLDB4MTAsMHgyMSwweDAwLDB4MDIsMHgxMiwweDAwLDB4MzAsMHg0MiwweDNmLDB4ZmYsCisweGFjLDB4YTIsMHgwMCwweDA0LDB4YWMsMHhhMCwweDAwLDB4MDAsMHhhYywweGEwLDB4MDAsMHg0YywweGFjLDB4YTAsMHgwMCwweDUwLAorMHhhYywweGEwLDB4MDAsMHg1NCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4YWMsMHhhMCwweDAwLDB4MGMsMHgzYywweDAzLDB4YjAsMHgwMywKKzB4M2MsMHgwMiwweDgwLDB4MDEsMHgzNCwweDYzLDB4MDAsMHgyMCwweDI0LDB4NDIsMHg5ZSwweGJjLDB4YWMsMHg2MiwweDAwLDB4MDAsCisweDhjLDB4ODYsMHgwMCwweDA0LDB4M2MsMHgwMiwweGIwLDB4MDEsMHgyNCwweDAzLDB4MDAsMHgwMSwweDAwLDB4YzIsMHgxMCwweDIxLAorMHg4YywweDQ1LDB4MDAsMHgwMCwweGFjLDB4ODMsMHgwMCwweDRjLDB4MDAsMHgwNSwweDE0LDB4MDIsMHgzMCwweGEzLDB4M2YsMHhmZiwKKzB4MzAsMHg0MiwweDAwLDB4ZmYsMHhhYywweDgzLDB4MDAsMHgxMCwweGFjLDB4ODIsMHgwMCwweDE0LDB4OGMsMHg4MywweDAwLDB4MTQsCisweGFjLDB4ODUsMHgwMCwweDQwLDB4MDAsMHhjMywweDMwLDB4MjEsMHgwMywweGUwLDB4MDAsMHgwOCwweGFjLDB4ODYsMHgwMCwweDA4LAorMHgzYywweDAyLDB4YjAsMHgwMywweDNjLDB4MDMsMHg4MCwweDAxLDB4MjcsMHhiZCwweGZmLDB4ZTgsMHgzNCwweDQyLDB4MDAsMHgyMCwKKzB4MjQsMHg2MywweDlmLDB4MTAsMHhhZiwweGIwLDB4MDAsMHgxMCwweGFmLDB4YmYsMHgwMCwweDE0LDB4YWMsMHg0MywweDAwLDB4MDAsCisweDhjLDB4ODIsMHgwMCwweDRjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgwYSwweDAwLDB4ODAsMHg4MCwweDIxLAorMHhhZSwweDAwLDB4MDAsMHgwMCwweGFlLDB4MDAsMHgwMCwweDRjLDB4YWUsMHgwMCwweDAwLDB4NTAsMHhhZSwweDAwLDB4MDAsMHg1NCwKKzB4YWUsMHgwMCwweDAwLDB4MGMsMHg4ZiwweGJmLDB4MDAsMHgxNCwweDhmLDB4YjAsMHgwMCwweDEwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDE4LDB4MGMsMHgwMCwweDI3LDB4YWYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyNywweGQxLAorMHhhZSwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhiMCwweDAzLDB4M2MsMHgwMywweDgwLDB4MDEsMHgyNywweGJkLDB4ZmYsMHhlOCwKKzB4MzQsMHg0MiwweDAwLDB4MjAsMHgyNCwweDYzLDB4OWYsMHg3NCwweGFmLDB4YjAsMHgwMCwweDEwLDB4YWYsMHhiZiwweDAwLDB4MTQsCisweGFjLDB4NDMsMHgwMCwweDAwLDB4OGMsMHg4MiwweDAwLDB4NGMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDE2LAorMHgwMCwweDgwLDB4ODAsMHgyMSwweDhlLDB4MDMsMHgwMCwweDA4LDB4M2MsMHgwMiwweGIwLDB4MDEsMHg4ZSwweDA0LDB4MDAsMHg0NCwKKzB4MDAsMHg2MiwweDE4LDB4MjEsMHg5MCwweDY1LDB4MDAsMHgwMCwweDI0LDB4MDIsMHgwMCwweDAxLDB4YWUsMHgwMiwweDAwLDB4NTAsCisweDMwLDB4YTMsMHgwMCwweGZmLDB4MDAsMHgwMywweDEwLDB4ODIsMHgwMCwweDA0LDB4MjMsMHgwMiwweDMwLDB4ODQsMHgwMCwweDBmLAorMHgzMCwweDQyLDB4MDAsMHgwMywweDAwLDB4MDMsMHgxOSwweDAyLDB4YWUsMHgwNCwweDAwLDB4MzQsMHhhZSwweDAyLDB4MDAsMHgyYywKKzB4YWUsMHgwMywweDAwLDB4MzAsMHhhMiwweDA1LDB4MDAsMHg0OCwweDhmLDB4YmYsMHgwMCwweDE0LDB4OGYsMHhiMCwweDAwLDB4MTAsCisweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTgsMHgwYywweDAwLDB4MjcsMHhhZiwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwOCwweDAwLDB4MjcsMHhlOSwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzYywweDAzLDB4ODAsMHgwMSwKKzB4MjcsMHhiZCwweGZmLDB4ZTgsMHgzNCwweDQyLDB4MDAsMHgyMCwweDI0LDB4NjMsMHhhMCwweDA4LDB4YWYsMHhiMCwweDAwLDB4MTAsCisweGFmLDB4YmYsMHgwMCwweDE0LDB4YWMsMHg0MywweDAwLDB4MDAsMHg4YywweDgyLDB4MDAsMHg1MCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgxMCwweDQwLDB4MDAsMHgxNiwweDAwLDB4ODAsMHg4MCwweDIxLDB4OTIsMHgwMywweDAwLDB4NDQsMHg4ZSwweDAyLDB4MDAsMHg0MCwKKzB4ODMsMHg4NSwweDhiLDB4ZDQsMHg5MiwweDA0LDB4MDAsMHg0MSwweDMwLDB4NjMsMHgwMCwweDAxLDB4MDAsMHgwMiwweDE2LDB4MDIsCisweGFlLDB4MDQsMHgwMCwweDE0LDB4MDAsMHgwMCwweDMwLDB4MjEsMHhhZSwweDAyLDB4MDAsMHgxOCwweDEwLDB4YTAsMHgwMCwweDA0LAorMHhhZSwweDAzLDB4MDAsMHgzYywweDEwLDB4NjAsMHgwMCwweDAzLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgyNCwweDA2LDB4MDAsMHgwMSwKKzB4MjQsMHgwMiwweDAwLDB4MDEsMHhhMywweDg2LDB4OGIsMHhkNCwweDhmLDB4YmYsMHgwMCwweDE0LDB4YWUsMHgwMiwweDAwLDB4NTQsCisweDhmLDB4YjAsMHgwMCwweDEwLDB4MDMsMHhlMCwweDAwLDB4MDgsMHgyNywweGJkLDB4MDAsMHgxOCwweDBjLDB4MDAsMHgyNywweGRkLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDA4LDB4MDAsMHgyOCwweDBlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4M2MsMHgwMywweDgwLDB4MDEsMHgyNywweGJkLDB4ZmYsMHhlOCwweDM0LDB4NDIsMHgwMCwweDIwLDB4MjQsMHg2MywweGEwLDB4OWMsCisweGFmLDB4YjAsMHgwMCwweDEwLDB4YWYsMHhiZiwweDAwLDB4MTQsMHhhYywweDQzLDB4MDAsMHgwMCwweDhjLDB4ODIsMHgwMCwweDUwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4NDAsMHgwMCwweDFiLDB4MDAsMHg4MCwweDgwLDB4MjEsMHgzYywweDAyLDB4YjAsMHgwMywKKzB4OGMsMHg0MiwweDAwLDB4MDAsMHg5MiwweDA0LDB4MDAsMHg0NCwweDhlLDB4MDMsMHgwMCwweDQwLDB4ODMsMHg4NiwweDhiLDB4ZDQsCisweDkyLDB4MDUsMHgwMCwweDQxLDB4MzAsMHg0MiwweDA4LDB4MDAsMHgzMCwweDg0LDB4MDAsMHgwMSwweDAwLDB4MDIsMHgxMiwweGMyLAorMHgwMCwweDAzLDB4MWUsMHgwMiwweDAwLDB4ODIsMHgyMCwweDI1LDB4YWUsMHgwNSwweDAwLDB4MTQsMHgwMCwweDAwLDB4MzgsMHgyMSwKKzB4YWUsMHgwMywweDAwLDB4MTgsMHgxMCwweGMwLDB4MDAsMHgwNCwweGFlLDB4MDQsMHgwMCwweDNjLDB4MTAsMHg4MCwweDAwLDB4MDMsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MjQsMHgwNywweDAwLDB4MDEsMHgyNCwweDAyLDB4MDAsMHgwMSwweGEzLDB4ODcsMHg4YiwweGQ0LAorMHg4ZiwweGJmLDB4MDAsMHgxNCwweGFlLDB4MDIsMHgwMCwweDU0LDB4OGYsMHhiMCwweDAwLDB4MTAsMHgwMywweGUwLDB4MDAsMHgwOCwKKzB4MjcsMHhiZCwweDAwLDB4MTgsMHgwYywweDAwLDB4MjcsMHhkZCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDI4LDB4MzMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsMHgzYywweDAzLDB4ODAsMHgwMSwweDI3LDB4YmQsMHhmZiwweGU4LAorMHgzNCwweDQyLDB4MDAsMHgyMCwweDI0LDB4NjMsMHhhMSwweDQ0LDB4YWYsMHhiMCwweDAwLDB4MTAsMHhhZiwweGJmLDB4MDAsMHgxNCwKKzB4YWMsMHg0MywweDAwLDB4MDAsMHg4YywweDgyLDB4MDAsMHg1NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHg0MCwweDAwLDB4MzcsCisweDAwLDB4ODAsMHg4MCwweDIxLDB4OGUsMHgwNCwweDAwLDB4MDQsMHg4ZSwweDAzLDB4MDAsMHg0NCwweDNjLDB4MDIsMHg4MCwweDAwLAorMHgzYywweDA1LDB4YjAsMHgwMSwweDM0LDB4NDIsMHgwMCwweDEwLDB4MDAsMHg4NSwweDIwLDB4MjEsMHgwMCwweDYyLDB4MTgsMHgyNSwKKzB4YWMsMHg4MywweDAwLDB4MDQsMHg4ZSwweDAyLDB4MDAsMHgwNCwweDhlLDB4MDMsMHgwMSwweGFjLDB4MDIsMHgwMCwweDIwLDB4MjEsCisweDAwLDB4NDUsMHgxMCwweDIxLDB4OGMsMHg0NiwweDAwLDB4MDAsMHgwMCwweDAzLDB4MTgsMHg4MCwweDI3LDB4ODIsMHg4OSwweDY4LAorMHgwMCwweDYyLDB4MTgsMHgyMSwweGFjLDB4NjYsMHgwMCwweDAwLDB4OGUsMHgwMiwweDAwLDB4MDQsMHg4ZSwweDAzLDB4MDEsMHhhYywKKzB4MDAsMHg0NSwweDEwLDB4MjEsMHg4YywweDQ2LDB4MDAsMHgwNCwweDAwLDB4MDMsMHgxOCwweDgwLDB4MjcsMHg4MiwweDhhLDB4NjgsCisweDAwLDB4NjIsMHgxOCwweDIxLDB4MGMsMHgwMCwweDI2LDB4MTAsMHhhYywweDY2LDB4MDAsMHgwMCwweDhlLDB4MDMsMHgwMSwweGFjLAorMHg4ZSwweDA3LDB4MDAsMHgwNCwweDNjLDB4MDYsMHhiMCwweDAzLDB4MjQsMHg2NSwweDAwLDB4MDEsMHgyOCwweGE0LDB4MDAsMHgwMCwKKzB4MjQsMHg2MiwweDAwLDB4NDAsMHgwMCwweGE0LDB4MTAsMHgwYSwweDAwLDB4MDIsMHgxMSwweDgzLDB4MDAsMHgwMiwweDExLDB4ODAsCisweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHhhMiwweDI4LDB4MjMsMHgwMCwweDcwLDB4MTgsMHgyMSwweGFlLDB4MDUsMHgwMSwweGFjLAorMHhhYywweDY3LDB4MDAsMHhhOCwweDM0LDB4YzYsMHgwMCwweDMwLDB4OGMsMHhjMywweDAwLDB4MDAsMHg5MywweDgyLDB4ODEsMHhmMCwKKzB4MDIsMHgwMCwweDIwLDB4MjEsMHgyNCwweDYzLDB4MDAsMHgwMSwweDI0LDB4NDIsMHgwMCwweDAxLDB4YWMsMHhjMywweDAwLDB4MDAsCisweGEzLDB4ODIsMHg4MSwweGYwLDB4MGMsMHgwMCwweDI3LDB4OTAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDhmLDB4YmYsMHgwMCwweDE0LAorMHg4ZiwweGIwLDB4MDAsMHgxMCwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MTgsMHgwYywweDAwLDB4MjgsMHgyNywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjgsMHg1ZCwweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHgwMiwweGIwLDB4MDMsCisweDNjLDB4MDMsMHg4MCwweDAxLDB4MjcsMHhiZCwweGZmLDB4ZTgsMHgzNCwweDQyLDB4MDAsMHgyMCwweDI0LDB4NjMsMHhhMiwweDVjLAorMHhhZiwweGIwLDB4MDAsMHgxMCwweGFmLDB4YmYsMHgwMCwweDE0LDB4YWMsMHg0MywweDAwLDB4MDAsMHg4YywweDgyLDB4MDAsMHg1NCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDQwLDB4MDAsMHgzNywweDAwLDB4ODAsMHg4MCwweDIxLDB4OGUsMHgwNCwweDAwLDB4MDQsCisweDhlLDB4MDMsMHgwMCwweDQ0LDB4M2MsMHgwMiwweDgwLDB4MDAsMHgzYywweDA1LDB4YjAsMHgwMSwweDM0LDB4NDIsMHgwMCwweDEwLAorMHgwMCwweDg1LDB4MjAsMHgyMSwweDAwLDB4NjIsMHgxOCwweDI1LDB4YWMsMHg4MywweDAwLDB4MDQsMHg4ZSwweDAyLDB4MDAsMHgwNCwKKzB4OGUsMHgwMywweDAxLDB4YWMsMHgwMiwweDAwLDB4MjAsMHgyMSwweDAwLDB4NDUsMHgxMCwweDIxLDB4OGMsMHg0NiwweDAwLDB4MDAsCisweDAwLDB4MDMsMHgxOCwweDgwLDB4MjcsMHg4MiwweDg5LDB4NjgsMHgwMCwweDYyLDB4MTgsMHgyMSwweGFjLDB4NjYsMHgwMCwweDAwLAorMHg4ZSwweDAyLDB4MDAsMHgwNCwweDhlLDB4MDMsMHgwMSwweGFjLDB4MDAsMHg0NSwweDEwLDB4MjEsMHg4YywweDQ2LDB4MDAsMHgwNCwKKzB4MDAsMHgwMywweDE4LDB4ODAsMHgyNywweDgyLDB4OGEsMHg2OCwweDAwLDB4NjIsMHgxOCwweDIxLDB4MGMsMHgwMCwweDI2LDB4MTAsCisweGFjLDB4NjYsMHgwMCwweDAwLDB4OGUsMHgwMywweDAxLDB4YWMsMHg4ZSwweDA3LDB4MDAsMHgwNCwweDNjLDB4MDYsMHhiMCwweDAzLAorMHgyNCwweDY1LDB4MDAsMHgwMSwweDI4LDB4YTQsMHgwMCwweDAwLDB4MjQsMHg2MiwweDAwLDB4NDAsMHgwMCwweGE0LDB4MTAsMHgwYSwKKzB4MDAsMHgwMiwweDExLDB4ODMsMHgwMCwweDAyLDB4MTEsMHg4MCwweDAwLDB4MDMsMHgxOCwweDgwLDB4MDAsMHhhMiwweDI4LDB4MjMsCisweDAwLDB4NzAsMHgxOCwweDIxLDB4YWUsMHgwNSwweDAxLDB4YWMsMHhhYywweDY3LDB4MDAsMHhhOCwweDM0LDB4YzYsMHgwMCwweDMwLAorMHg4YywweGMzLDB4MDAsMHgwMCwweDkzLDB4ODIsMHg4MSwweGYwLDB4MDIsMHgwMCwweDIwLDB4MjEsMHgyNCwweDYzLDB4MDAsMHgwMSwKKzB4MjQsMHg0MiwweDAwLDB4MDEsMHhhYywweGMzLDB4MDAsMHgwMCwweGEzLDB4ODIsMHg4MSwweGYwLDB4MGMsMHgwMCwweDI3LDB4OTAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4OGYsMHhiZiwweDAwLDB4MTQsMHg4ZiwweGIwLDB4MDAsMHgxMCwweDAzLDB4ZTAsMHgwMCwweDA4LAorMHgyNywweGJkLDB4MDAsMHgxOCwweDBjLDB4MDAsMHgyOCwweDI3LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwOCwweDAwLDB4MjgsMHhhMywKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwMywweDNjLDB4MDMsMHg4MCwweDAxLDB4MzQsMHg0MiwweDAwLDB4MjAsCisweDI0LDB4NjMsMHhhMywweDc0LDB4MjcsMHhiZCwweGZmLDB4ZTAsMHhhYywweDQzLDB4MDAsMHgwMCwweDNjLDB4MDIsMHg4MCwweDAxLAorMHhhZiwweGIyLDB4MDAsMHgxOCwweGFmLDB4YjEsMHgwMCwweDE0LDB4YWYsMHhiMCwweDAwLDB4MTAsMHhhZiwweGJmLDB4MDAsMHgxYywKKzB4MDAsMHg4MCwweDgwLDB4MjEsMHgyNCwweDUyLDB4OWUsMHgyOCwweDAwLDB4MDAsMHg4OCwweDIxLDB4M2MsMHgwMywweGIwLDB4MDksCisweDM0LDB4NjMsMHgwMCwweDA2LDB4OGUsMHgwNiwweDAwLDB4MDQsMHg5MCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDYsMHgyMiwweDAyLAorMHgwMCwweDQ0LDB4MTAsMHgyMywweDI0LDB4NDQsMHgwMCwweDQwLDB4MjgsMHg4MywweDAwLDB4MDAsMHgyNCwweDQyLDB4MDAsMHg3ZiwKKzB4MDAsMHg4MywweDEwLDB4MGEsMHgwMCwweDAyLDB4MTEsMHg4MywweDAwLDB4MDIsMHgxMSwweDgwLDB4MjQsMHg4NCwweGZmLDB4ZmYsCisweDEwLDB4NDQsMHgwMCwweDY4LDB4MDAsMHgwMCwweDI4LDB4MjEsMHgzYywweDAyLDB4YjAsMHgwMSwweDAwLDB4YzIsMHgxMCwweDIxLAorMHg4YywweDQ0LDB4MDAsMHgwNCwweDNjLDB4MDMsMHg3YywweDAwLDB4MzQsMHg2MywweDAwLDB4ZjAsMHgwMCwweDgzLDB4MTgsMHgyNCwKKzB4YWUsMHgwNCwweDAwLDB4NDQsMHg4YywweDQ0LDB4MDAsMHgwMCwweDEwLDB4NjAsMHgwMCwweDY5LDB4MDAsMHgwMCwweDM4LDB4MjEsCisweDNjLDB4MDksMHhiMCwweDAzLDB4M2MsMHgwNiwweDdjLDB4MDAsMHgzNSwweDI5LDB4MDAsMHg5OSwweDNjLDB4MGEsMHhiMCwweDAxLAorMHgyNCwweDA4LDB4MDAsMHg0MCwweDM0LDB4YzYsMHgwMCwweGYwLDB4M2MsMHgwYiwweGZmLDB4ZmYsMHgzYywweDBjLDB4MjgsMHgzOCwKKzB4MTYsMHgyMCwweDAwLDB4MDYsMHgyNCwweGE1LDB4MDAsMHgwMSwweDkzLDB4ODIsMHg4MSwweGY2LDB4MjQsMHgxMSwweDAwLDB4MDEsCisweDI0LDB4NDIsMHgwMCwweDAxLDB4YTEsMHgyMiwweDAwLDB4MDAsMHhhMywweDgyLDB4ODEsMHhmNiwweDhlLDB4MDIsMHgwMCwweDA0LAorMHgyNCwweDA3LDB4MDAsMHgwMSwweDI0LDB4NDIsMHgwMSwweDAwLDB4MzAsMHg0MiwweDNmLDB4ZmYsMHhhZSwweDAyLDB4MDAsMHgwNCwKKzB4MDAsMHg0YSwweDEwLDB4MjEsMHg4YywweDQzLDB4MDAsMHgwNCwweDAwLDB4MDAsMHgwMCwweDAwLDB4YWUsMHgwMywweDAwLDB4NDQsCisweDhjLDB4NDQsMHgwMCwweDAwLDB4MTAsMHhhOCwweDAwLDB4MmQsMHgwMCwweDY2LDB4MTgsMHgyNCwweDE0LDB4NjAsMHhmZiwweGVjLAorMHgwMCwweDhiLDB4MTAsMHgyNCwweDE0LDB4NGMsMHhmZiwweGVhLDB4MjQsMHgwMiwweDAwLDB4MDEsMHgxMCwweGUyLDB4MDAsMHgyZiwKKzB4M2MsMHgwMywweGIwLDB4MDksMHg4ZSwweDAyLDB4MDAsMHg0NCwweDhlLDB4MDQsMHgwMCwweDYwLDB4MDAsMHgwMiwweDFlLDB4NDIsCisweDAwLDB4MDIsMHgxMiwweDAyLDB4MzAsMHg0MiwweDAwLDB4MGYsMHgzMCwweDYzLDB4MDAsMHgwMSwweGFlLDB4MDIsMHgwMCwweDAwLAorMHgxMCwweDQ0LDB4MDAsMHgxYSwweGFlLDB4MDMsMHgwMCwweDU4LDB4OGUsMHgwMiwweDAwLDB4NjQsMHg4ZSwweDA0LDB4MDAsMHg1OCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDgyLDB4MDAsMHgwNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4YWUsMHgwMCwweDAwLDB4NGMsCisweGFlLDB4MDAsMHgwMCwweDUwLDB4YWUsMHgwMCwweDAwLDB4NTQsMHhhZSwweDAwLDB4MDAsMHgwYywweDhlLDB4MDMsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDMsMHgxMCwweDgwLDB4MDAsMHg1MCwweDEwLDB4MjEsMHg4YywweDQyLDB4MDAsMHg2OCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxMCwweDUyLDB4MDAsMHgwNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0MCwweGY4LDB4MDksCisweDAyLDB4MDAsMHgyMCwweDIxLDB4OGUsMHgwNCwweDAwLDB4NTgsMHg4ZSwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHhhZSwweDAzLDB4MDAsMHg2MCwweDA4LDB4MDAsMHgyOCwweGViLDB4YWUsMHgwNCwweDAwLDB4NjQsMHg4ZSwweDAyLDB4MDAsMHg2NCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgxNCwweDYyLDB4ZmYsMHhlNSwweDAwLDB4MDAsMHgwMCwweDAwLDB4N2EsMHgwMiwweDBkLDB4N2MsCisweDhmLDB4YmYsMHgwMCwweDFjLDB4OGYsMHhiMiwweDAwLDB4MTgsMHg3YiwweGIwLDB4MDAsMHhiYywweDAwLDB4NDMsMHgxMCwweDI2LAorMHgwMCwweDAyLDB4MTAsMHgyYiwweDAzLDB4ZTAsMHgwMCwweDA4LDB4MjcsMHhiZCwweDAwLDB4MjAsMHgzNCwweDYzLDB4MDAsMHgwNiwKKzB4OGUsMHgwNCwweDAwLDB4MDQsMHg5MCwweDYyLDB4MDAsMHgwMCwweDAwLDB4MDQsMHgyMiwweDAyLDB4MDAsMHg0NCwweDEwLDB4MjMsCisweDI0LDB4NDQsMHgwMCwweDQwLDB4MjgsMHg4MywweDAwLDB4MDAsMHgyNCwweDQyLDB4MDAsMHg3ZiwweDAwLDB4ODMsMHgxMCwweDBhLAorMHgwMCwweDAyLDB4MTEsMHg4MywweDAwLDB4MDIsMHgxMSwweDgwLDB4MDAsMHg4MiwweDIwLDB4MjMsMHgxNCwweDg3LDB4ZmYsMHhjNSwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHg4ZSwweDAzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MmMsMHg2MiwweDAwLDB4MDMsCisweDE0LDB4NDAsMHgwMCwweDA1LDB4MjQsMHgwMiwweDAwLDB4MGQsMHgxMCwweDYyLDB4MDAsMHgwMywweDI0LDB4MDIsMHgwMCwweDAxLAorMHgwOCwweDAwLDB4MjksMHg0YiwweGEyLDB4MDIsMHgwMCwweDVjLDB4MDgsMHgwMCwweDI5LDB4NGIsMHhhMiwweDAwLDB4MDAsMHg1YywKKzB4M2MsMHgwMiwweGZmLDB4ZmYsMHgwMCwweDgyLDB4MTAsMHgyNCwweDNjLDB4MDMsMHgyOCwweDM4LDB4MTQsMHg0MywweGZmLDB4OTQsCisweDI0LDB4MDIsMHgwMCwweDAxLDB4MDgsMHgwMCwweDI5LDB4MjMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNjLDB4MDIsMHhiMCwweDAzLAorMHgzYywweDAzLDB4ODAsMHgwMSwweDM0LDB4NDIsMHgwMCwweDIwLDB4MjQsMHg2MywweGE1LDB4Y2MsMHhhYywweDQzLDB4MDAsMHgwMCwKKzB4OGMsMHg4MywweDAxLDB4YTgsMHg4YywweDgyLDB4MDEsMHhhYywweDAwLDB4ODAsMHg0MCwweDIxLDB4MTAsMHg2MiwweDAwLDB4MjAsCisweDAwLDB4MDAsMHgyMCwweDIxLDB4OTMsMHg4MiwweDgxLDB4ZjEsMHgwMCwweDAzLDB4MjgsMHg4MCwweDNjLDB4MDcsMHhiMCwweDA2LAorMHgwMCwweGE4LDB4MTgsMHgyMSwweDI0LDB4MDQsMHgwMCwweDAxLDB4OGMsMHg2NiwweDAwLDB4YTgsMHgxMCwweDQ0LDB4MDAsMHgxYywKKzB4MzQsMHhlNywweDgwLDB4MTgsMHgzYywweDA1LDB4YjAsMHgwMSwweGFmLDB4ODYsMHhiYywweDIwLDB4MDAsMHhjNSwweDI4LDB4MjEsCisweDhjLDB4YTMsMHgwMCwweDAwLDB4MDAsMHgwNiwweDIwLDB4YzIsMHgzYywweDAyLDB4MDAsMHg4MCwweDAwLDB4MDQsMHgyMiwweDAwLAorMHgwMCwweDgyLDB4MjAsMHgyNSwweGFmLDB4ODMsMHhiYywweDI4LDB4OGMsMHhhMiwweDAwLDB4MDQsMHhhYywweGU0LDB4MDAsMHgwMCwKKzB4OGQsMHgwMywweDAxLDB4YTgsMHhhZiwweDgyLDB4YmMsMHgyNCwweDI0LDB4NjQsMHgwMCwweDAxLDB4MDQsMHg4MCwweDAwLDB4MGEsCisweDAwLDB4ODAsMHgxMCwweDIxLDB4MDAsMHgwMiwweDExLDB4ODMsMHg4ZCwweDAzLDB4MDEsMHhhYywweDAwLDB4MDIsMHgxMSwweDgwLAorMHgwMCwweDgyLDB4MTAsMHgyMywweDAwLDB4NDMsMHgxOCwweDI2LDB4YWQsMHgwMiwweDAxLDB4YTgsMHgwMCwweDAzLDB4MjAsMHgyYiwKKzB4MDMsMHhlMCwweDAwLDB4MDgsMHgwMCwweDgwLDB4MTAsMHgyMSwweDA4LDB4MDAsMHgyOSwweDk1LDB4MjQsMHg2MiwweDAwLDB4NDAsCisweDI3LDB4ODIsMHg4OSwweDY4LDB4MDAsMHgwNiwweDIwLDB4YzIsMHgwMCwweDA0LDB4MjIsMHgwMCwweDAwLDB4YTIsMHg0OCwweDIxLAorMHgzYywweDAyLDB4MDAsMHg4MCwweDAwLDB4ODIsMHg1OCwweDI1LDB4OTMsMHg4MiwweDgxLDB4ZjAsMHgzYywweDBhLDB4YjAsMHgwNiwKKzB4M2MsMHgwMywweGIwLDB4MDEsMHgyYywweDQyLDB4MDAsMHgwMiwweDAwLDB4YzMsMHgzOCwweDIxLDB4MzUsMHg0YSwweDgwLDB4MTgsCisweDE0LDB4NDAsMHhmZiwweGVmLDB4MDAsMHgwMCwweDIwLDB4MjEsMHg4YywweGU1LDB4MDAsMHgwMCwweDhkLDB4MjMsMHgwMCwweDAwLAorMHgyNCwweDAyLDB4YzAsMHgwMCwweDAwLDB4YTIsMHgxMCwweDI0LDB4MDAsMHg0MywweDEwLDB4MjUsMHhhYywweGUyLDB4MDAsMHgwMCwKKzB4OGQsMHgwNCwweDAxLDB4YTgsMHgyNywweDgzLDB4OGEsMHg2OCwweDhjLDB4ZTUsMHgwMCwweDA0LDB4MDAsMHgwNCwweDIwLDB4ODAsCisweDAwLDB4ODMsMHgyMCwweDIxLDB4OGMsMHg4MiwweDAwLDB4MDAsMHgzYywweDAzLDB4ODAsMHgwMCwweDAwLDB4YTIsMHgxMCwweDI1LAorMHgwMCwweDQzLDB4MTAsMHgyNSwweGFjLDB4ZTIsMHgwMCwweDA0LDB4YWYsMHg4NiwweGJjLDB4MjAsMHg4YywweGUyLDB4MDAsMHgwMCwKKzB4OTMsMHg4NSwweDgxLDB4ZjAsMHhhZiwweDgyLDB4YmMsMHgyOCwweDhjLDB4ZTMsMHgwMCwweDA0LDB4YWQsMHg0YiwweDAwLDB4MDAsCisweDhkLDB4MDIsMHgwMSwweGE4LDB4YWYsMHg4MywweGJjLDB4MjQsMHgyNCwweGE1LDB4ZmYsMHhmZiwweDI0LDB4NDQsMHgwMCwweDAxLAorMHgyOCwweDgzLDB4MDAsMHgwMCwweDI0LDB4NDIsMHgwMCwweDQwLDB4MDAsMHg4MywweDEwLDB4MGEsMHgwMCwweDAyLDB4MTEsMHg4MywKKzB4MDAsMHgwMiwweDExLDB4ODAsMHgwMCwweDgyLDB4MjAsMHgyMywweGFkLDB4MDQsMHgwMSwweGE4LDB4YTMsMHg4NSwweDgxLDB4ZjAsCisweDc5LDB4MDIsMHgwZCwweDdjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQzLDB4MTAsMHgyNiwweDA4LDB4MDAsMHgyOSwweDljLAorMHgwMCwweDAyLDB4MjAsMHgyYiwweDNjLDB4MDQsMHhiMCwweDAzLDB4M2MsMHgwNiwweGIwLDB4MDcsMHgzYywweDAyLDB4ODAsMHgwMSwKKzB4MzQsMHhjNiwweDAwLDB4MTgsMHgzNCwweDg0LDB4MDAsMHgyMCwweDI0LDB4NDIsMHhhNywweDU0LDB4MjQsMHgwMywweGZmLDB4ODMsCisweGFjLDB4ODIsMHgwMCwweDAwLDB4YTAsMHhjMywweDAwLDB4MDAsMHg5MCwweGM0LDB4MDAsMHgwMCwweDI3LDB4YmQsMHhmZiwweGY4LAorMHgzYywweDAzLDB4YjAsMHgwNywweDI0LDB4MDIsMHhmZiwweDgyLDB4YTMsMHhhNCwweDAwLDB4MDAsMHhhMCwweDYyLDB4MDAsMHgwMCwKKzB4OTAsMHg2NCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwNywweDM0LDB4NDIsMHgwMCwweDA4LDB4YTMsMHhhNCwweDAwLDB4MDEsCisweGEwLDB4NDAsMHgwMCwweDAwLDB4OTAsMHg0MywweDAwLDB4MDAsMHgyNCwweDAyLDB4MDAsMHgwMywweDNjLDB4MDUsMHhiMCwweDA3LAorMHhhMywweGEzLDB4MDAsMHgwMCwweGEwLDB4YzIsMHgwMCwweDAwLDB4OTAsMHhjNCwweDAwLDB4MDAsMHgzNCwweGE1LDB4MDAsMHgxMCwKKzB4MjQsMHgwMiwweDAwLDB4MDYsMHgzYywweDAzLDB4YjAsMHgwNywweGEzLDB4YTQsMHgwMCwweDAwLDB4MzQsMHg2MywweDAwLDB4MzgsCisweGEwLDB4YTIsMHgwMCwweDAwLDB4OTAsMHg2NCwweDAwLDB4MDAsMHgzYywweDAyLDB4YjAsMHgwNywweDM0LDB4NDIsMHgwMCwweDIwLAorMHhhMywweGE0LDB4MDAsMHgwMCwweGEwLDB4YTAsMHgwMCwweDAwLDB4OTAsMHhhMywweDAwLDB4MDAsMHhhZiwweDgyLDB4YmYsMHgzMCwKKzB4YTMsMHhhMywweDAwLDB4MDAsMHhhMCwweDQwLDB4MDAsMHgwMCwweDkwLDB4NDMsMHgwMCwweDAwLDB4MDMsMHhlMCwweDAwLDB4MDgsCisweDI3LDB4YmQsMHgwMCwweDA4LH07CisKK3U4IFJ0bDgxOTJQY2lFRndEYXRhQXJyYXlbRGF0YUFycmF5TGVuZ3RoUGNpRV0gPSB7CisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDEsMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MDAsMHgwOCwweDAwLAorMHgwMiwweGU5LDB4MDEsMHg3NCwweDAyLDB4YWIsMHgwMSwweGM3LDB4MDEsMHg1NSwweDAwLDB4ZTQsMHgwMCwweGFiLDB4MDAsMHg3MiwKKzB4MDAsMHg1NSwweDAwLDB4NGMsMHgwMCwweDRjLDB4MDAsMHg0YywweDAwLDB4NGMsMHgwMCwweDRjLDB4MDIsMHg3NiwweDAxLDB4M2IsCisweDAwLDB4ZDIsMHgwMCwweDllLDB4MDAsMHg2OSwweDAwLDB4NGYsMHgwMCwweDQ2LDB4MDAsMHgzZiwweDAxLDB4M2IsMHgwMCwweDllLAorMHgwMCwweDY5LDB4MDAsMHg0ZiwweDAwLDB4MzUsMHgwMCwweDI3LDB4MDAsMHgyMywweDAwLDB4MjAsMHgwMSwweDJmLDB4MDAsMHg5OCwKKzB4MDAsMHg2NSwweDAwLDB4NGMsMHgwMCwweDMzLDB4MDAsMHgyNiwweDAwLDB4MjIsMHgwMCwweDFlLDB4MDAsMHg5OCwweDAwLDB4NGMsCisweDAwLDB4MzMsMHgwMCwweDI2LDB4MDAsMHgxOSwweDAwLDB4MTMsMHgwMCwweDExLDB4MDAsMHgwZiwweDAyLDB4MzksMHgwMSwweDFjLAorMHgwMCwweGJkLDB4MDAsMHg4ZSwweDAwLDB4NWYsMHgwMCwweDQ3LDB4MDAsMHgzZiwweDAwLDB4MzksMHgwMSwweDFjLDB4MDAsMHg4ZSwKKzB4MDAsMHg1ZiwweDAwLDB4NDcsMHgwMCwweDJmLDB4MDAsMHgyMywweDAwLDB4MjAsMHgwMCwweDFjLDB4MDEsMHgxMSwweDAwLDB4ODksCisweDAwLDB4NWIsMHgwMCwweDQ0LDB4MDAsMHgyZSwweDAwLDB4MjIsMHgwMCwweDFlLDB4MDAsMHgxYiwweDAwLDB4ODksMHgwMCwweDQ0LAorMHgwMCwweDJlLDB4MDAsMHgyMiwweDAwLDB4MTcsMHgwMCwweDExLDB4MDAsMHgwZiwweDAwLDB4MGUsMHgwMiwweGFiLDB4MDIsMHhhYiwKKzB4MDIsMHg2NiwweDAyLDB4NjYsMHgwNywweDA2LDB4MDYsMHgwNiwweDA1LDB4MDYsMHgwNywweDA4LDB4MDQsMHgwNiwweDA3LDB4MDgsCisweDA5LDB4MGEsMHgwYiwweDBiLDB4NDksMHg2ZSwweDc0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1NCwweDRjLAorMHg0MiwweDRkLDB4NGYsMHg0NCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NTQsMHg0YywweDQyLDB4NGMsMHg1ZiwweDY0LDB4NjEsMHg3NCwKKzB4NjEsMHgwMCwweDU0LDB4NGMsMHg0MiwweDUzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NDEsMHg2NCwweDQ1LDB4NGMsCisweDVmLDB4NjQsMHg2MSwweDc0LDB4NjEsMHgwMCwweDQxLDB4NjQsMHg0NSwweDUzLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHg0NSwweDc4LDB4NjMsMHg0MywweDZmLDB4NjQsMHg2NSwweDM2LDB4MDAsMHgwMCwweDQ1LDB4NzgsMHg2MywweDQzLDB4NmYsMHg2NCwKKzB4NjUsMHgzNywweDAwLDB4MDAsMHg1MywweDc5LDB4NzMsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDQyLDB4NzAsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg1MiwweDQ5LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorMHgwMCwweDAwLDB4NDMsMHg3MCwweDU1LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg0ZiwweDc2LDB4MDAsMHgwMCwKKzB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ODAsMHgwMSwweDBiLDB4NjMsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDgsMHgwMCwweDAwLDB4MDAsMHgxMCwweDAwLDB4MDAsMHgwMCwweDJjLAorMHgwMCwweDAwLDB4MDAsMHg1OCwweDAwLDB4MDAsMHgwMCwweDMwLDB4MDAsMHgwMCwweDAwLDB4NDgsMHgwMCwweDAwLDB4MDAsMHg2MCwKKzB4MDAsMHgwMCwweDAwLDB4OTAsMHgwMCwweDAwLDB4MDAsMHhjMCwweDAwLDB4MDAsMHgwMSwweDIwLDB4MDAsMHgwMCwweDAxLDB4ODAsCisweDAwLDB4MDAsMHgwMSwweGIwLDB4MDAsMHgwMCwweDAwLDB4MzQsMHgwMCwweDAwLDB4MDAsMHg2OCwweDAwLDB4MDAsMHgwMCwweDljLAorMHgwMCwweDAwLDB4MDAsMHhkMCwweDAwLDB4MDAsMHgwMSwweDM4LDB4MDAsMHgwMCwweDAxLDB4YTAsMHgwMCwweDAwLDB4MDEsMHhkNCwKKzB4MDAsMHgwMCwweDAyLDB4MDgsMHgwMCwweDAwLDB4MDAsMHg2OCwweDAwLDB4MDAsMHgwMCwweGQwLDB4MDAsMHgwMCwweDAxLDB4MzgsCisweDAwLDB4MDAsMHgwMSwweGEwLDB4MDAsMHgwMCwweDAyLDB4NmYsMHgwMCwweDAwLDB4MDMsMHg0MCwweDAwLDB4MDAsMHgwMywweGE4LAorMHgwMCwweDAwLDB4MDQsMHgxMCwweDAxLDB4MDEsMHgwMSwweDAyLDB4MDEsMHgwMSwweDAyLDB4MDIsMHgwMywweDAzLDB4MDQsMHgwNCwKKzB4MDEsMHgwMSwweDAyLDB4MDIsMHgwMywweDAzLDB4MDQsMHgwNCwweDAyLDB4MDMsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsCisweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg4MCwweDAwLDB4MDcsMHg2YywweDgwLDB4MDAsMHgwNywweDgwLAorMHg4MCwweDAwLDB4MDcsMHg4MCwweDgwLDB4MDAsMHgwNywweDcwLDB4ODAsMHgwMCwweDA3LDB4NzAsMHg4MCwweDAwLDB4MDcsMHg5NCwKKzB4ODAsMHgwMCwweDU2LDB4YjAsMHg4MCwweDAwLDB4NTcsMHgwOCwweDgwLDB4MDAsMHg1NywweDMwLDB4ODAsMHgwMCwweDU4LDB4MjgsCisweDgwLDB4MDAsMHg1OCwweGUwLDB4ODAsMHgwMCwweDU5LDB4ODgsMHg4MCwweDAwLDB4NTksMHhmYywweDgwLDB4MDAsMHg1YiwweDA4LAorMHg4MCwweDAwLDB4NWIsMHg0MCwweDgwLDB4MDAsMHg1YiwweDU0LDB4ODAsMHgwMCwweDViLDB4NjgsMHg4MCwweDAwLDB4NWMsMHg1MCwKKzB4ODAsMHgwMCwweDVjLDB4OTAsMHg4MCwweDAwLDB4NWQsMHg0NCwweDgwLDB4MDAsMHg1ZCwweDZjLDB4ODAsMHgwMCwweDU2LDB4NzAsCisweDgwLDB4MDAsMHg1ZCwweGJjLDB4ODAsMHgwMCwweDY0LDB4NDgsMHg4MCwweDAwLDB4NjQsMHhjMCwweDgwLDB4MDAsMHg2NCwweGNjLAorMHg4MCwweDAwLDB4NjQsMHhkOCwweDgwLDB4MDAsMHg2NCwweDYwLDB4ODAsMHgwMCwweDY0LDB4NjAsMHg4MCwweDAwLDB4NjQsMHg2MCwKKzB4ODAsMHgwMCwweDY0LDB4NjAsMHg4MCwweDAwLDB4NjQsMHg2MCwweDgwLDB4MDAsMHg2NCwweDYwLDB4ODAsMHgwMCwweDY0LDB4NjAsCisweDgwLDB4MDAsMHg2NCwweDYwLDB4ODAsMHgwMCwweDY0LDB4NjAsMHg4MCwweDAwLDB4NjQsMHg2MCwweDgwLDB4MDAsMHg2NCwweDYwLAorMHg4MCwweDAwLDB4NjQsMHg2MCwweDgwLDB4MDAsMHg2NCwweGU0LDB4ODAsMHgwMCwweDY0LDB4ZjAsMHg4MCwweDAwLDB4NjQsMHhmYywKKzB4ODAsMHgwMCwweDg3LDB4YTQsMHg4MCwweDAwLDB4ODcsMHhhNCwweDgwLDB4MDAsMHg4NywweGE0LDB4ODAsMHgwMCwweDg3LDB4ZDgsCisweDgwLDB4MDAsMHg4OCwweDE4LDB4ODAsMHgwMCwweDg4LDB4NTAsMHg4MCwweDAwLDB4ODgsMHg4MCwweDgwLDB4MDAsMHg4OCwweGIwLAorMHg4MCwweDAwLDB4ODgsMHhjNCwweDgwLDB4MDAsMHg4OSwweDJjLDB4ODAsMHgwMCwweDg5LDB4NDAsMHg4MCwweDAwLDB4ODksMHg3YywKKzB4ODAsMHgwMCwweDg5LDB4ODQsMHg4MCwweDAwLDB4ODksMHhjMCwweDgwLDB4MDAsMHg4OSwweGQ0LDB4ODAsMHgwMCwweDg5LDB4ZGMsCisweDgwLDB4MDAsMHg4OSwweGU0LDB4ODAsMHgwMCwweDg5LDB4ZTQsMHg4MCwweDAwLDB4ODksMHhlNCwweDgwLDB4MDAsMHg4OSwweGU0LAorMHg4MCwweDAwLDB4OGEsMHgxNCwweDgwLDB4MDAsMHg4YSwweDI4LDB4ODAsMHgwMCwweDhhLDB4M2MsMHg4MCwweDAwLDB4ODYsMHhlOCwKKzB4ODAsMHgwMCwweDhkLDB4NjgsMHg4MCwweDAwLDB4OGQsMHg2OCwweDgwLDB4MDAsMHg4ZCwweDY4LDB4ODAsMHgwMCwweDhkLDB4OWMsCisweDgwLDB4MDAsMHg4ZCwweGRjLDB4ODAsMHgwMCwweDhlLDB4MTQsMHg4MCwweDAwLDB4OGUsMHg0NCwweDgwLDB4MDAsMHg4ZSwweDc0LAorMHg4MCwweDAwLDB4OGUsMHg4OCwweDgwLDB4MDAsMHg4ZSwweGYwLDB4ODAsMHgwMCwweDhmLDB4MDQsMHg4MCwweDAwLDB4OGYsMHg0MCwKKzB4ODAsMHgwMCwweDhmLDB4NDgsMHg4MCwweDAwLDB4OGYsMHg4NCwweDgwLDB4MDAsMHg4ZiwweDk4LDB4ODAsMHgwMCwweDhmLDB4YTAsCisweDgwLDB4MDAsMHg4ZiwweGE4LDB4ODAsMHgwMCwweDhmLDB4YTgsMHg4MCwweDAwLDB4OGYsMHhhOCwweDgwLDB4MDAsMHg4ZiwweGE4LAorMHg4MCwweDAwLDB4OGYsMHhkOCwweDgwLDB4MDAsMHg4ZiwweGVjLDB4ODAsMHgwMCwweDkwLDB4MDAsMHg4MCwweDAwLDB4OGIsMHg4OCwKK307CisKK3UzMiBSdGw4MTkyUGNpRVBIWV9SRUdBcnJheVtQSFlfUkVHQXJyYXlMZW5ndGhQY2lFXSA9IHsweDAsfTsKKwordTMyIFJ0bDgxOTJQY2lFUEhZX1JFR18xVDJSQXJyYXlbUEhZX1JFR18xVDJSQXJyYXlMZW5ndGhQY2lFXSA9IHsKKwkweDgwMCwgMHgwMDAwMDAwMCwKKwkweDgwNCwgMHgwMDAwMDAwMSwKKwkweDgwOCwgMHgwMDAwZmMwMCwKKwkweDgwYywgMHgwMDAwMDAxYywKKwkweDgxMCwgMHg4MDEwMTBhYSwKKwkweDgxNCwgMHgwMDg1MTRkMCwKKwkweDgxOCwgMHgwMDAwMDA0MCwKKwkweDgxYywgMHgwMDAwMDAwMCwKKwkweDgyMCwgMHgwMDAwMDAwNCwKKwkweDgyNCwgMHgwMDY5MDAwMCwKKwkweDgyOCwgMHgwMDAwMDAwNCwKKwkweDgyYywgMHgwMGU5MDAwMCwKKwkweDgzMCwgMHgwMDAwMDAwNCwKKwkweDgzNCwgMHgwMDY5MDAwMCwKKwkweDgzOCwgMHgwMDAwMDAwNCwKKwkweDgzYywgMHgwMGU5MDAwMCwKKwkweDg0MCwgMHgwMDAwMDAwMCwKKwkweDg0NCwgMHgwMDAwMDAwMCwKKwkweDg0OCwgMHgwMDAwMDAwMCwKKwkweDg0YywgMHgwMDAwMDAwMCwKKwkweDg1MCwgMHgwMDAwMDAwMCwKKwkweDg1NCwgMHgwMDAwMDAwMCwKKwkweDg1OCwgMHg2NWE5NjVhOSwKKwkweDg1YywgMHg2NWE5NjVhOSwKKwkweDg2MCwgMHgwMDFmMDAxMCwKKwkweDg2NCwgMHgwMDdmMDAxMCwKKwkweDg2OCwgMHgwMDFmMDAxMCwKKwkweDg2YywgMHgwMDdmMDAxMCwKKwkweDg3MCwgMHgwZjEwMGY3MCwKKwkweDg3NCwgMHgwZjEwMGY3MCwKKwkweDg3OCwgMHgwMDAwMDAwMCwKKwkweDg3YywgMHgwMDAwMDAwMCwKKwkweDg4MCwgMHg2ODcwZTM2YywKKwkweDg4NCwgMHhlMzU3MzYwMCwKKwkweDg4OCwgMHg0MjYwYzM0MCwKKwkweDg4YywgMHgwMDAwZmYwMCwKKwkweDg5MCwgMHgwMDAwMDAwMCwKKwkweDg5NCwgMHhmZmZmZmZmZSwKKwkweDg5OCwgMHg0YzQyMzgyZiwKKwkweDg5YywgMHgwMDY1NjA1NiwKKwkweDhiMCwgMHgwMDAwMDAwMCwKKwkweDhlMCwgMHgwMDAwMDAwMCwKKwkweDhlNCwgMHgwMDAwMDAwMCwKKwkweDkwMCwgMHgwMDAwMDAwMCwKKwkweDkwNCwgMHgwMDAwMDAyMywKKwkweDkwOCwgMHgwMDAwMDAwMCwKKwkweDkwYywgMHgzMTEyMTMxMSwKKwkweGEwMCwgMHgwMGQwYzdkOCwKKwkweGEwNCwgMHg4MTFmMDAwOCwKKwkweGEwOCwgMHg4MGNkODMwMCwKKwkweGEwYywgMHgyZTYyNzQwZiwKKwkweGExMCwgMHg5NTAwOWI3OCwKKwkweGExNCwgMHgxMTE0NTAwOCwKKwkweGExOCwgMHgwMDg4MTExNywKKwkweGExYywgMHg4OTE0MGZhMCwKKwkweGEyMCwgMHgxYTFiMDAwMCwKKwkweGEyNCwgMHgwOTBlMTMxNywKKwkweGEyOCwgMHgwMDAwMDIwNCwKKwkweGEyYywgMHgwMDAwMDAwMCwKKwkweGMwMCwgMHgwMDAwMDA0MCwKKwkweGMwNCwgMHgwMDAwNTQzMywKKwkweGMwOCwgMHgwMDAwMDBlNCwKKwkweGMwYywgMHg2YzZjNmM2YywKKwkweGMxMCwgMHgwODgwMDAwMCwKKwkweGMxNCwgMHg0MDAwMDEwMCwKKwkweGMxOCwgMHgwODAwMDAwMCwKKwkweGMxYywgMHg0MDAwMDEwMCwKKwkweGMyMCwgMHgwODAwMDAwMCwKKwkweGMyNCwgMHg0MDAwMDEwMCwKKwkweGMyOCwgMHgwODAwMDAwMCwKKwkweGMyYywgMHg0MDAwMDEwMCwKKwkweGMzMCwgMHg2ZGU5YWM0NCwKKwkweGMzNCwgMHg0NjVjNTJjZCwKKwkweGMzOCwgMHg0OTdmNTk5NCwKKwkweGMzYywgMHgwYTk2OTc2NCwKKwkweGM0MCwgMHgxZjdjNDAzZiwKKwkweGM0NCwgMHgwMDAxMDBiNywKKwkweGM0OCwgMHhlYzAyMDAwMCwKKwkweGM0YywgMHgwMDAwMDMwMCwKKwkweGM1MCwgMHg2OTU0MzQyMCwKKwkweGM1NCwgMHg0MzNjMDA5NCwKKwkweGM1OCwgMHg2OTU0MzQyMCwKKwkweGM1YywgMHg0MzNjMDA5NCwKKwkweGM2MCwgMHg2OTU0MzQyMCwKKwkweGM2NCwgMHg0MzNjMDA5NCwKKwkweGM2OCwgMHg2OTU0MzQyMCwKKwkweGM2YywgMHg0MzNjMDA5NCwKKwkweGM3MCwgMHgyYzdmMDAwZCwKKwkweGM3NCwgMHgwMTg2MTc1YiwKKwkweGM3OCwgMHgwMDAwMDAxZiwKKwkweGM3YywgMHgwMGI5MTYxMiwKKwkweGM4MCwgMHg0MDAwMDEwMCwKKwkweGM4NCwgMHgyMDAwMDAwMCwKKwkweGM4OCwgMHg0MDAwMDEwMCwKKwkweGM4YywgMHgyMDIwMDAwMCwKKwkweGM5MCwgMHg0MDAwMDEwMCwKKwkweGM5NCwgMHgwMDAwMDAwMCwKKwkweGM5OCwgMHg0MDAwMDEwMCwKKwkweGM5YywgMHgwMDAwMDAwMCwKKwkweGNhMCwgMHgwMDQ5MjQ5MiwKKwkweGNhNCwgMHgwMDAwMDAwMCwKKwkweGNhOCwgMHgwMDAwMDAwMCwKKwkweGNhYywgMHgwMDAwMDAwMCwKKwkweGNiMCwgMHgwMDAwMDAwMCwKKwkweGNiNCwgMHgwMDAwMDAwMCwKKwkweGNiOCwgMHgwMDAwMDAwMCwKKwkweGNiYywgMHgwMDQ5MjQ5MiwKKwkweGNjMCwgMHgwMDAwMDAwMCwKKwkweGNjNCwgMHgwMDAwMDAwMCwKKwkweGNjOCwgMHgwMDAwMDAwMCwKKwkweGNjYywgMHgwMDAwMDAwMCwKKwkweGNkMCwgMHgwMDAwMDAwMCwKKwkweGNkNCwgMHgwMDAwMDAwMCwKKwkweGNkOCwgMHg2NGIyMjQyNywKKwkweGNkYywgMHgwMDc2NjkzMiwKKwkweGNlMCwgMHgwMDIyMjIyMiwKKwkweGQwMCwgMHgwMDAwMDc1MCwKKwkweGQwNCwgMHgwMDAwMDQwMywKKwkweGQwOCwgMHgwMDAwOTA3ZiwKKwkweGQwYywgMHgwMDAwMDAwMSwKKwkweGQxMCwgMHhhMDYzMzMzMywKKwkweGQxNCwgMHgzMzMzM2M2MywKKwkweGQxOCwgMHg2YThmNWI2YiwKKwkweGQxYywgMHgwMDAwMDAwMCwKKwkweGQyMCwgMHgwMDAwMDAwMCwKKwkweGQyNCwgMHgwMDAwMDAwMCwKKwkweGQyOCwgMHgwMDAwMDAwMCwKKwkweGQyYywgMHhjYzk3OTk3NSwKKwkweGQzMCwgMHgwMDAwMDAwMCwKKwkweGQzNCwgMHgwMDAwMDAwMCwKKwkweGQzOCwgMHgwMDAwMDAwMCwKKwkweGQzYywgMHgwMDAyNzI5MywKKwkweGQ0MCwgMHgwMDAwMDAwMCwKKwkweGQ0NCwgMHgwMDAwMDAwMCwKKwkweGQ0OCwgMHgwMDAwMDAwMCwKKwkweGQ0YywgMHgwMDAwMDAwMCwKKwkweGQ1MCwgMHg2NDM3MTQwYSwKKwkweGQ1NCwgMHgwMjRkYmQwMiwKKwkweGQ1OCwgMHgwMDAwMDAwMCwKKwkweGQ1YywgMHgwNDAzMjA2NCwKKwkweGUwMCwgMHgxNjFhMWExYSwKKwkweGUwNCwgMHgxMjEyMTQxNiwKKwkweGUwOCwgMHgwMDAwMTgwMCwKKwkweGUwYywgMHgwMDAwMDAwMCwKKwkweGUxMCwgMHgxNjFhMWExYSwKKwkweGUxNCwgMHgxMjEyMTQxNiwKKwkweGUxOCwgMHgxNjFhMWExYSwKKwkweGUxYywgMHgxMjEyMTQxNiwKK307CisKK3UzMiBSdGw4MTkyUGNpRVJhZGlvQV9BcnJheVtSYWRpb0FfQXJyYXlMZW5ndGhQY2lFXSA9IHsKKwkweDAxOSwgMHgwMDAwMDAwMywKKwkweDAwMCwgMHgwMDAwMDBiZiwKKwkweDAwMSwgMHgwMDAwMGVlMCwKKwkweDAwMiwgMHgwMDAwMDA0YywKKwkweDAwMywgMHgwMDAwMDdmMSwKKwkweDAwNCwgMHgwMDAwMDk3NSwKKwkweDAwNSwgMHgwMDAwMGM1OCwKKwkweDAwNiwgMHgwMDAwMGFlNiwKKwkweDAwNywgMHgwMDAwMDBjYSwKKwkweDAwOCwgMHgwMDAwMGUxYywKKwkweDAwOSwgMHgwMDAwMDdmMCwKKwkweDAwYSwgMHgwMDAwMDlkMCwKKwkweDAwYiwgMHgwMDAwMDFiYSwKKwkweDAwYywgMHgwMDAwMDI0MCwKKwkweDAwZSwgMHgwMDAwMDAyMCwKKwkweDAwZiwgMHgwMDAwMDk5MCwKKwkweDAxMiwgMHgwMDAwMDgwNiwKKwkweDAxNCwgMHgwMDAwMDVhYiwKKwkweDAxNSwgMHgwMDAwMGY4MCwKKwkweDAxNiwgMHgwMDAwMDAyMCwKKwkweDAxNywgMHgwMDAwMDU5NywKKwkweDAxOCwgMHgwMDAwMDUwYSwKKwkweDAxYSwgMHgwMDAwMGY4MCwKKwkweDAxYiwgMHgwMDAwMGY1ZSwKKwkweDAxYywgMHgwMDAwMDAwOCwKKwkweDAxZCwgMHgwMDAwMDYwNywKKwkweDAxZSwgMHgwMDAwMDZjYywKKwkweDAxZiwgMHgwMDAwMDAwMCwKKwkweDAyMCwgMHgwMDAwMDFhNSwKKwkweDAxZiwgMHgwMDAwMDAwMSwKKwkweDAyMCwgMHgwMDAwMDE2NSwKKwkweDAxZiwgMHgwMDAwMDAwMiwKKwkweDAyMCwgMHgwMDAwMDBjNiwKKwkweDAxZiwgMHgwMDAwMDAwMywKKwkweDAyMCwgMHgwMDAwMDA4NiwKKwkweDAxZiwgMHgwMDAwMDAwNCwKKwkweDAyMCwgMHgwMDAwMDA0NiwKKwkweDAxZiwgMHgwMDAwMDAwNSwKKwkweDAyMCwgMHgwMDAwMDFlNiwKKwkweDAxZiwgMHgwMDAwMDAwNiwKKwkweDAyMCwgMHgwMDAwMDFhNiwKKwkweDAxZiwgMHgwMDAwMDAwNywKKwkweDAyMCwgMHgwMDAwMDE2NiwKKwkweDAxZiwgMHgwMDAwMDAwOCwKKwkweDAyMCwgMHgwMDAwMDBjNywKKwkweDAxZiwgMHgwMDAwMDAwOSwKKwkweDAyMCwgMHgwMDAwMDA4NywKKwkweDAxZiwgMHgwMDAwMDAwYSwKKwkweDAyMCwgMHgwMDAwMDBmNywKKwkweDAxZiwgMHgwMDAwMDAwYiwKKwkweDAyMCwgMHgwMDAwMDBkNywKKwkweDAxZiwgMHgwMDAwMDAwYywKKwkweDAyMCwgMHgwMDAwMDBiNywKKwkweDAxZiwgMHgwMDAwMDAwZCwKKwkweDAyMCwgMHgwMDAwMDA5NywKKwkweDAxZiwgMHgwMDAwMDAwZSwKKwkweDAyMCwgMHgwMDAwMDA3NywKKwkweDAxZiwgMHgwMDAwMDAwZiwKKwkweDAyMCwgMHgwMDAwMDA1NywKKwkweDAxZiwgMHgwMDAwMDAxMCwKKwkweDAyMCwgMHgwMDAwMDAzNywKKwkweDAxZiwgMHgwMDAwMDAxMSwKKwkweDAyMCwgMHgwMDAwMDBmYiwKKwkweDAxZiwgMHgwMDAwMDAxMiwKKwkweDAyMCwgMHgwMDAwMDBkYiwKKwkweDAxZiwgMHgwMDAwMDAxMywKKwkweDAyMCwgMHgwMDAwMDBiYiwKKwkweDAxZiwgMHgwMDAwMDAxNCwKKwkweDAyMCwgMHgwMDAwMDBmZiwKKwkweDAxZiwgMHgwMDAwMDAxNSwKKwkweDAyMCwgMHgwMDAwMDBlMywKKwkweDAxZiwgMHgwMDAwMDAxNiwKKwkweDAyMCwgMHgwMDAwMDBjMywKKwkweDAxZiwgMHgwMDAwMDAxNywKKwkweDAyMCwgMHgwMDAwMDBhMywKKwkweDAxZiwgMHgwMDAwMDAxOCwKKwkweDAyMCwgMHgwMDAwMDA4MywKKwkweDAxZiwgMHgwMDAwMDAxOSwKKwkweDAyMCwgMHgwMDAwMDA2MywKKwkweDAxZiwgMHgwMDAwMDAxYSwKKwkweDAyMCwgMHgwMDAwMDA0MywKKwkweDAxZiwgMHgwMDAwMDAxYiwKKwkweDAyMCwgMHgwMDAwMDAyMywKKwkweDAxZiwgMHgwMDAwMDAxYywKKwkweDAyMCwgMHgwMDAwMDAwMywKKwkweDAxZiwgMHgwMDAwMDAxZCwKKwkweDAyMCwgMHgwMDAwMDFlMywKKwkweDAxZiwgMHgwMDAwMDAxZSwKKwkweDAyMCwgMHgwMDAwMDFjMywKKwkweDAxZiwgMHgwMDAwMDAxZiwKKwkweDAyMCwgMHgwMDAwMDFhMywKKwkweDAxZiwgMHgwMDAwMDAyMCwKKwkweDAyMCwgMHgwMDAwMDE4MywKKwkweDAxZiwgMHgwMDAwMDAyMSwKKwkweDAyMCwgMHgwMDAwMDE2MywKKwkweDAxZiwgMHgwMDAwMDAyMiwKKwkweDAyMCwgMHgwMDAwMDE0MywKKwkweDAxZiwgMHgwMDAwMDAyMywKKwkweDAyMCwgMHgwMDAwMDEyMywKKwkweDAxZiwgMHgwMDAwMDAyNCwKKwkweDAyMCwgMHgwMDAwMDEwMywKKwkweDAyMywgMHgwMDAwMDIwMywKKwkweDAyNCwgMHgwMDAwMDEwMCwKKwkweDAwYiwgMHgwMDAwMDFiYSwKKwkweDAyYywgMHgwMDAwMDNkNywKKwkweDAyZCwgMHgwMDAwMGZmMCwKKwkweDAwMCwgMHgwMDAwMDAzNywKKwkweDAwNCwgMHgwMDAwMDE2MCwKKwkweDAwNywgMHgwMDAwMDA4MCwKKwkweDAwMiwgMHgwMDAwMDg4ZCwKKwkweDBmZSwgMHgwMDAwMDAwMCwKKwkweDBmZSwgMHgwMDAwMDAwMCwKKwkweDAxNiwgMHgwMDAwMDIwMCwKKwkweDAxNiwgMHgwMDAwMDM4MCwKKwkweDAxNiwgMHgwMDAwMDAyMCwKKwkweDAxNiwgMHgwMDAwMDFhMCwKKwkweDAwMCwgMHgwMDAwMDBiZiwKKwkweDAwZCwgMHgwMDAwMDAxZiwKKwkweDAwZCwgMHgwMDAwMGM5ZiwKKwkweDAwMiwgMHgwMDAwMDA0ZCwKKwkweDAwMCwgMHgwMDAwMGNiZiwKKwkweDAwNCwgMHgwMDAwMDk3NSwKKwkweDAwNywgMHgwMDAwMDcwMCwKK307CisKK3UzMiBSdGw4MTkyUGNpRVJhZGlvQl9BcnJheVtSYWRpb0JfQXJyYXlMZW5ndGhQY2lFXSA9IHsKKwkweDAxOSwgMHgwMDAwMDAwMywKKwkweDAwMCwgMHgwMDAwMDBiZiwKKwkweDAwMSwgMHgwMDAwMDZlMCwKKwkweDAwMiwgMHgwMDAwMDA0YywKKwkweDAwMywgMHgwMDAwMDdmMSwKKwkweDAwNCwgMHgwMDAwMDk3NSwKKwkweDAwNSwgMHgwMDAwMGM1OCwKKwkweDAwNiwgMHgwMDAwMGFlNiwKKwkweDAwNywgMHgwMDAwMDBjYSwKKwkweDAwOCwgMHgwMDAwMGUxYywKKwkweDAwMCwgMHgwMDAwMDBiNywKKwkweDAwYSwgMHgwMDAwMDg1MCwKKwkweDAwMCwgMHgwMDAwMDBiZiwKKwkweDAwYiwgMHgwMDAwMDFiYSwKKwkweDAwYywgMHgwMDAwMDI0MCwKKwkweDAwZSwgMHgwMDAwMDAyMCwKKwkweDAxNSwgMHgwMDAwMGY4MCwKKwkweDAxNiwgMHgwMDAwMDAyMCwKKwkweDAxNywgMHgwMDAwMDU5NywKKwkweDAxOCwgMHgwMDAwMDUwYSwKKwkweDAxYSwgMHgwMDAwMGUwMCwKKwkweDAxYiwgMHgwMDAwMGY1ZSwKKwkweDAxZCwgMHgwMDAwMDYwNywKKwkweDAxZSwgMHgwMDAwMDZjYywKKwkweDAwYiwgMHgwMDAwMDFiYSwKKwkweDAyMywgMHgwMDAwMDIwMywKKwkweDAyNCwgMHgwMDAwMDEwMCwKKwkweDAwMCwgMHgwMDAwMDAzNywKKwkweDAwNCwgMHgwMDAwMDE2MCwKKwkweDAxNiwgMHgwMDAwMDIwMCwKKwkweDAxNiwgMHgwMDAwMDM4MCwKKwkweDAxNiwgMHgwMDAwMDAyMCwKKwkweDAxNiwgMHgwMDAwMDFhMCwKKwkweDAwZCwgMHgwMDAwMGNjYywKKwkweDAwMCwgMHgwMDAwMDBiZiwKKwkweDAwMiwgMHgwMDAwMDA0ZCwKKwkweDAwMCwgMHgwMDAwMGNiZiwKKwkweDAwNCwgMHgwMDAwMDk3NSwKKwkweDAwNywgMHgwMDAwMDcwMCwKK307CisKK3UzMiBSdGw4MTkyUGNpRVJhZGlvQ19BcnJheVtSYWRpb0NfQXJyYXlMZW5ndGhQY2lFXSA9IHsKKwkweDAsICB9OworCit1MzIgUnRsODE5MlBjaUVSYWRpb0RfQXJyYXlbUmFkaW9EX0FycmF5TGVuZ3RoUGNpRV0gPSB7CisJMHgwLCB9OworCit1MzIgUnRsODE5MlBjaUVNQUNQSFlfQXJyYXlbXSA9IHsKKwkweDAzYywgMHhmZmZmMDAwMCwgMHgwMDAwMGYwZiwKKwkweDM0MCwgMHhmZmZmZmZmZiwgMHgxNjFhMWExYSwKKwkweDM0NCwgMHhmZmZmZmZmZiwgMHgxMjEyMTQxNiwKKwkweDM0OCwgMHgwMDAwZmZmZiwgMHgwMDAwMTgxOCwKKwkweDEyYywgMHhmZmZmZmZmZiwgMHgwNDAwMDgwMiwKKwkweDMxOCwgMHgwMDAwMGZmZiwgMHgwMDAwMDEwMCwKK307CisKK3UzMiBSdGw4MTkyUGNpRU1BQ1BIWV9BcnJheV9QR1tdID0geworCTB4MDNjLCAweGZmZmYwMDAwLCAweDAwMDAwZjBmLAorCTB4ZTAwLCAweGZmZmZmZmZmLCAweDA2MDkwOTA5LAorCTB4ZTA0LCAweGZmZmZmZmZmLCAweDAwMDMwMzA2LAorCTB4ZTA4LCAweDAwMDBmZjAwLCAweDAwMDAwMDAwLAorCTB4ZTEwLCAweGZmZmZmZmZmLCAweDBhMGMwZDBmLAorCTB4ZTE0LCAweGZmZmZmZmZmLCAweDA2MDcwODA5LAorCTB4ZTE4LCAweGZmZmZmZmZmLCAweDBhMGMwZDBmLAorCTB4ZTFjLCAweGZmZmZmZmZmLCAweDA2MDcwODA5LAorCTB4MTJjLCAweGZmZmZmZmZmLCAweDA0MDAwODAyLAorCTB4MzE4LCAweDAwMDAwZmZmLCAweDAwMDAwODAwLAorfTsKKwordTMyIFJ0bDgxOTJQY2lFQUdDVEFCX0FycmF5W0FHQ1RBQl9BcnJheUxlbmd0aFBjaUVdID0geworCTB4Yzc4LCAweDdkMDAwMDAxLAorCTB4Yzc4LCAweDdkMDEwMDAxLAorCTB4Yzc4LCAweDdkMDIwMDAxLAorCTB4Yzc4LCAweDdkMDMwMDAxLAorCTB4Yzc4LCAweDdkMDQwMDAxLAorCTB4Yzc4LCAweDdkMDUwMDAxLAorCTB4Yzc4LCAweDdjMDYwMDAxLAorCTB4Yzc4LCAweDdiMDcwMDAxLAorCTB4Yzc4LCAweDdhMDgwMDAxLAorCTB4Yzc4LCAweDc5MDkwMDAxLAorCTB4Yzc4LCAweDc4MGEwMDAxLAorCTB4Yzc4LCAweDc3MGIwMDAxLAorCTB4Yzc4LCAweDc2MGMwMDAxLAorCTB4Yzc4LCAweDc1MGQwMDAxLAorCTB4Yzc4LCAweDc0MGUwMDAxLAorCTB4Yzc4LCAweDczMGYwMDAxLAorCTB4Yzc4LCAweDcyMTAwMDAxLAorCTB4Yzc4LCAweDcxMTEwMDAxLAorCTB4Yzc4LCAweDcwMTIwMDAxLAorCTB4Yzc4LCAweDZmMTMwMDAxLAorCTB4Yzc4LCAweDZlMTQwMDAxLAorCTB4Yzc4LCAweDZkMTUwMDAxLAorCTB4Yzc4LCAweDZjMTYwMDAxLAorCTB4Yzc4LCAweDZiMTcwMDAxLAorCTB4Yzc4LCAweDZhMTgwMDAxLAorCTB4Yzc4LCAweDY5MTkwMDAxLAorCTB4Yzc4LCAweDY4MWEwMDAxLAorCTB4Yzc4LCAweDY3MWIwMDAxLAorCTB4Yzc4LCAweDY2MWMwMDAxLAorCTB4Yzc4LCAweDY1MWQwMDAxLAorCTB4Yzc4LCAweDY0MWUwMDAxLAorCTB4Yzc4LCAweDQ5MWYwMDAxLAorCTB4Yzc4LCAweDQ4MjAwMDAxLAorCTB4Yzc4LCAweDQ3MjEwMDAxLAorCTB4Yzc4LCAweDQ2MjIwMDAxLAorCTB4Yzc4LCAweDQ1MjMwMDAxLAorCTB4Yzc4LCAweDQ0MjQwMDAxLAorCTB4Yzc4LCAweDQzMjUwMDAxLAorCTB4Yzc4LCAweDI4MjYwMDAxLAorCTB4Yzc4LCAweDI3MjcwMDAxLAorCTB4Yzc4LCAweDI2MjgwMDAxLAorCTB4Yzc4LCAweDI1MjkwMDAxLAorCTB4Yzc4LCAweDI0MmEwMDAxLAorCTB4Yzc4LCAweDIzMmIwMDAxLAorCTB4Yzc4LCAweDIyMmMwMDAxLAorCTB4Yzc4LCAweDIxMmQwMDAxLAorCTB4Yzc4LCAweDIwMmUwMDAxLAorCTB4Yzc4LCAweDBhMmYwMDAxLAorCTB4Yzc4LCAweDA4MzAwMDAxLAorCTB4Yzc4LCAweDA2MzEwMDAxLAorCTB4Yzc4LCAweDA1MzIwMDAxLAorCTB4Yzc4LCAweDA0MzMwMDAxLAorCTB4Yzc4LCAweDAzMzQwMDAxLAorCTB4Yzc4LCAweDAyMzUwMDAxLAorCTB4Yzc4LCAweDAxMzYwMDAxLAorCTB4Yzc4LCAweDAwMzcwMDAxLAorCTB4Yzc4LCAweDAwMzgwMDAxLAorCTB4Yzc4LCAweDAwMzkwMDAxLAorCTB4Yzc4LCAweDAwM2EwMDAxLAorCTB4Yzc4LCAweDAwM2IwMDAxLAorCTB4Yzc4LCAweDAwM2MwMDAxLAorCTB4Yzc4LCAweDAwM2QwMDAxLAorCTB4Yzc4LCAweDAwM2UwMDAxLAorCTB4Yzc4LCAweDAwM2YwMDAxLAorCTB4Yzc4LCAweDdkNDAwMDAxLAorCTB4Yzc4LCAweDdkNDEwMDAxLAorCTB4Yzc4LCAweDdkNDIwMDAxLAorCTB4Yzc4LCAweDdkNDMwMDAxLAorCTB4Yzc4LCAweDdkNDQwMDAxLAorCTB4Yzc4LCAweDdkNDUwMDAxLAorCTB4Yzc4LCAweDdjNDYwMDAxLAorCTB4Yzc4LCAweDdiNDcwMDAxLAorCTB4Yzc4LCAweDdhNDgwMDAxLAorCTB4Yzc4LCAweDc5NDkwMDAxLAorCTB4Yzc4LCAweDc4NGEwMDAxLAorCTB4Yzc4LCAweDc3NGIwMDAxLAorCTB4Yzc4LCAweDc2NGMwMDAxLAorCTB4Yzc4LCAweDc1NGQwMDAxLAorCTB4Yzc4LCAweDc0NGUwMDAxLAorCTB4Yzc4LCAweDczNGYwMDAxLAorCTB4Yzc4LCAweDcyNTAwMDAxLAorCTB4Yzc4LCAweDcxNTEwMDAxLAorCTB4Yzc4LCAweDcwNTIwMDAxLAorCTB4Yzc4LCAweDZmNTMwMDAxLAorCTB4Yzc4LCAweDZlNTQwMDAxLAorCTB4Yzc4LCAweDZkNTUwMDAxLAorCTB4Yzc4LCAweDZjNTYwMDAxLAorCTB4Yzc4LCAweDZiNTcwMDAxLAorCTB4Yzc4LCAweDZhNTgwMDAxLAorCTB4Yzc4LCAweDY5NTkwMDAxLAorCTB4Yzc4LCAweDY4NWEwMDAxLAorCTB4Yzc4LCAweDY3NWIwMDAxLAorCTB4Yzc4LCAweDY2NWMwMDAxLAorCTB4Yzc4LCAweDY1NWQwMDAxLAorCTB4Yzc4LCAweDY0NWUwMDAxLAorCTB4Yzc4LCAweDQ5NWYwMDAxLAorCTB4Yzc4LCAweDQ4NjAwMDAxLAorCTB4Yzc4LCAweDQ3NjEwMDAxLAorCTB4Yzc4LCAweDQ2NjIwMDAxLAorCTB4Yzc4LCAweDQ1NjMwMDAxLAorCTB4Yzc4LCAweDQ0NjQwMDAxLAorCTB4Yzc4LCAweDQzNjUwMDAxLAorCTB4Yzc4LCAweDI4NjYwMDAxLAorCTB4Yzc4LCAweDI3NjcwMDAxLAorCTB4Yzc4LCAweDI2NjgwMDAxLAorCTB4Yzc4LCAweDI1NjkwMDAxLAorCTB4Yzc4LCAweDI0NmEwMDAxLAorCTB4Yzc4LCAweDIzNmIwMDAxLAorCTB4Yzc4LCAweDIyNmMwMDAxLAorCTB4Yzc4LCAweDIxNmQwMDAxLAorCTB4Yzc4LCAweDIwNmUwMDAxLAorCTB4Yzc4LCAweDBhNmYwMDAxLAorCTB4Yzc4LCAweDA4NzAwMDAxLAorCTB4Yzc4LCAweDA2NzEwMDAxLAorCTB4Yzc4LCAweDA1NzIwMDAxLAorCTB4Yzc4LCAweDA0NzMwMDAxLAorCTB4Yzc4LCAweDAzNzQwMDAxLAorCTB4Yzc4LCAweDAyNzUwMDAxLAorCTB4Yzc4LCAweDAxNzYwMDAxLAorCTB4Yzc4LCAweDAwNzcwMDAxLAorCTB4Yzc4LCAweDAwNzgwMDAxLAorCTB4Yzc4LCAweDAwNzkwMDAxLAorCTB4Yzc4LCAweDAwN2EwMDAxLAorCTB4Yzc4LCAweDAwN2IwMDAxLAorCTB4Yzc4LCAweDAwN2MwMDAxLAorCTB4Yzc4LCAweDAwN2QwMDAxLAorCTB4Yzc4LCAweDAwN2UwMDAxLAorCTB4Yzc4LCAweDAwN2YwMDAxLAorCTB4Yzc4LCAweDJlMDAwMDFlLAorCTB4Yzc4LCAweDJlMDEwMDFlLAorCTB4Yzc4LCAweDJlMDIwMDFlLAorCTB4Yzc4LCAweDJlMDMwMDFlLAorCTB4Yzc4LCAweDJlMDQwMDFlLAorCTB4Yzc4LCAweDJlMDUwMDFlLAorCTB4Yzc4LCAweDMwMDYwMDFlLAorCTB4Yzc4LCAweDM0MDcwMDFlLAorCTB4Yzc4LCAweDM5MDgwMDFlLAorCTB4Yzc4LCAweDNjMDkwMDFlLAorCTB4Yzc4LCAweDNmMGEwMDFlLAorCTB4Yzc4LCAweDQyMGIwMDFlLAorCTB4Yzc4LCAweDQ0MGMwMDFlLAorCTB4Yzc4LCAweDQ1MGQwMDFlLAorCTB4Yzc4LCAweDQ2MGUwMDFlLAorCTB4Yzc4LCAweDQ2MGYwMDFlLAorCTB4Yzc4LCAweDQ3MTAwMDFlLAorCTB4Yzc4LCAweDQ4MTEwMDFlLAorCTB4Yzc4LCAweDQ5MTIwMDFlLAorCTB4Yzc4LCAweDRhMTMwMDFlLAorCTB4Yzc4LCAweDRiMTQwMDFlLAorCTB4Yzc4LCAweDRiMTUwMDFlLAorCTB4Yzc4LCAweDRjMTYwMDFlLAorCTB4Yzc4LCAweDRkMTcwMDFlLAorCTB4Yzc4LCAweDRlMTgwMDFlLAorCTB4Yzc4LCAweDRmMTkwMDFlLAorCTB4Yzc4LCAweDRmMWEwMDFlLAorCTB4Yzc4LCAweDUwMWIwMDFlLAorCTB4Yzc4LCAweDUxMWMwMDFlLAorCTB4Yzc4LCAweDUyMWQwMDFlLAorCTB4Yzc4LCAweDUyMWUwMDFlLAorCTB4Yzc4LCAweDUzMWYwMDFlLAorCTB4Yzc4LCAweDUzMjAwMDFlLAorCTB4Yzc4LCAweDU0MjEwMDFlLAorCTB4Yzc4LCAweDU1MjIwMDFlLAorCTB4Yzc4LCAweDU1MjMwMDFlLAorCTB4Yzc4LCAweDU2MjQwMDFlLAorCTB4Yzc4LCAweDU3MjUwMDFlLAorCTB4Yzc4LCAweDU3MjYwMDFlLAorCTB4Yzc4LCAweDU4MjcwMDFlLAorCTB4Yzc4LCAweDU4MjgwMDFlLAorCTB4Yzc4LCAweDU5MjkwMDFlLAorCTB4Yzc4LCAweDU5MmEwMDFlLAorCTB4Yzc4LCAweDVhMmIwMDFlLAorCTB4Yzc4LCAweDViMmMwMDFlLAorCTB4Yzc4LCAweDVjMmQwMDFlLAorCTB4Yzc4LCAweDVjMmUwMDFlLAorCTB4Yzc4LCAweDVkMmYwMDFlLAorCTB4Yzc4LCAweDVlMzAwMDFlLAorCTB4Yzc4LCAweDVmMzEwMDFlLAorCTB4Yzc4LCAweDYwMzIwMDFlLAorCTB4Yzc4LCAweDYwMzMwMDFlLAorCTB4Yzc4LCAweDYxMzQwMDFlLAorCTB4Yzc4LCAweDYyMzUwMDFlLAorCTB4Yzc4LCAweDYzMzYwMDFlLAorCTB4Yzc4LCAweDY0MzcwMDFlLAorCTB4Yzc4LCAweDY0MzgwMDFlLAorCTB4Yzc4LCAweDY1MzkwMDFlLAorCTB4Yzc4LCAweDY2M2EwMDFlLAorCTB4Yzc4LCAweDY3M2IwMDFlLAorCTB4Yzc4LCAweDY3M2MwMDFlLAorCTB4Yzc4LCAweDY4M2QwMDFlLAorCTB4Yzc4LCAweDY5M2UwMDFlLAorCTB4Yzc4LCAweDZhM2YwMDFlLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfaHdpbWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfaHdpbWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTk4MzZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9od2ltZy5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9fSU5DX0hBTDgxOTJQY2lFX0ZXX0lNR19ICisjZGVmaW5lIF9fSU5DX0hBTDgxOTJQY2lFX0ZXX0lNR19ICisKKy8qQ3JlYXRlZCBvbiAgMjAwOC8xMS8xOCwgIDM6IDcqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBCb290QXJyYXlMZW5ndGhQY2lFIDM0NAorZXh0ZXJuIHU4IFJ0bDgxOTJQY2lFRndCb290QXJyYXlbQm9vdEFycmF5TGVuZ3RoUGNpRV07CisjZGVmaW5lIE1haW5BcnJheUxlbmd0aFBjaUUgNDMwMTIKK2V4dGVybiB1OCBSdGw4MTkyUGNpRUZ3TWFpbkFycmF5W01haW5BcnJheUxlbmd0aFBjaUVdOworI2RlZmluZSBEYXRhQXJyYXlMZW5ndGhQY2lFIDg0OAorZXh0ZXJuIHU4IFJ0bDgxOTJQY2lFRndEYXRhQXJyYXlbRGF0YUFycmF5TGVuZ3RoUGNpRV07CisjZGVmaW5lIFBIWV9SRUdBcnJheUxlbmd0aFBjaUUgMQorZXh0ZXJuIHUzMiBSdGw4MTkyUGNpRVBIWV9SRUdBcnJheVtQSFlfUkVHQXJyYXlMZW5ndGhQY2lFXTsKKyNkZWZpbmUgUEhZX1JFR18xVDJSQXJyYXlMZW5ndGhQY2lFIDI5NgorZXh0ZXJuIHUzMiBSdGw4MTkyUGNpRVBIWV9SRUdfMVQyUkFycmF5W1BIWV9SRUdfMVQyUkFycmF5TGVuZ3RoUGNpRV07CisjZGVmaW5lIFJhZGlvQV9BcnJheUxlbmd0aFBjaUUgMjQ2CitleHRlcm4gdTMyIFJ0bDgxOTJQY2lFUmFkaW9BX0FycmF5W1JhZGlvQV9BcnJheUxlbmd0aFBjaUVdIDsKKyNkZWZpbmUgUmFkaW9CX0FycmF5TGVuZ3RoUGNpRSA3OAorZXh0ZXJuIHUzMiBSdGw4MTkyUGNpRVJhZGlvQl9BcnJheVtSYWRpb0JfQXJyYXlMZW5ndGhQY2lFXSA7CisjZGVmaW5lIFJhZGlvQ19BcnJheUxlbmd0aFBjaUUgMgorZXh0ZXJuIHUzMiBSdGw4MTkyUGNpRVJhZGlvQ19BcnJheVtSYWRpb0NfQXJyYXlMZW5ndGhQY2lFXSA7CisjZGVmaW5lIFJhZGlvRF9BcnJheUxlbmd0aFBjaUUgMgorZXh0ZXJuIHUzMiBSdGw4MTkyUGNpRVJhZGlvRF9BcnJheVtSYWRpb0RfQXJyYXlMZW5ndGhQY2lFXSA7CisjZGVmaW5lIE1BQ1BIWV9BcnJheUxlbmd0aFBjaUUgMTgKK2V4dGVybiB1MzIgUnRsODE5MlBjaUVNQUNQSFlfQXJyYXlbTUFDUEhZX0FycmF5TGVuZ3RoUGNpRV0gOworI2RlZmluZSBNQUNQSFlfQXJyYXlfUEdMZW5ndGhQY2lFIDMwCitleHRlcm4gdTMyIFJ0bDgxOTJQY2lFTUFDUEhZX0FycmF5X1BHW01BQ1BIWV9BcnJheV9QR0xlbmd0aFBjaUVdIDsKKyNkZWZpbmUgQUdDVEFCX0FycmF5TGVuZ3RoUGNpRSAzODQKK2V4dGVybiB1MzIgUnRsODE5MlBjaUVBR0NUQUJfQXJyYXlbQUdDVEFCX0FycmF5TGVuZ3RoUGNpRV0gOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfcGh5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX3BoeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZTY5YTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX3BoeS5jCkBAIC0wLDAgKzEsMTYzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgInJ0bF9jb3JlLmgiCisjaW5jbHVkZSAicjgxOTJFX2h3LmgiCisjaW5jbHVkZSAicjgxOTJFX3BoeXJlZy5oIgorI2luY2x1ZGUgInI4MTkwUF9ydGw4MjU2LmgiCisjaW5jbHVkZSAicjgxOTJFX3BoeS5oIgorI2luY2x1ZGUgInJ0bF9kbS5oIgorI2luY2x1ZGUgImRvdDExZC5oIgorCisjaW5jbHVkZSAicjgxOTJFX2h3aW1nLmgiCisKK3N0YXRpYyB1MzIgUkZfQ0hBTk5FTF9UQUJMRV9aRUJSQVtdID0geworCTAsCisJMHgwODVjLAorCTB4MDhkYywKKwkweDA5NWMsCisJMHgwOWRjLAorCTB4MGE1YywKKwkweDBhZGMsCisJMHgwYjVjLAorCTB4MGJkYywKKwkweDBjNWMsCisJMHgwY2RjLAorCTB4MGQ1YywKKwkweDBkZGMsCisJMHgwZTVjLAorCTB4MGY3MiwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqRGVmaW5lIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZSoqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB1MzIgcGh5X0Z3UkZTZXJpYWxSZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBlbnVtIHJmOTBfcmFkaW9fcGF0aCBlUkZQYXRoLAorCQkJICAgICAgdTMyIE9mZnNldCk7CitzdGF0aWMgdm9pZCBwaHlfRndSRlNlcmlhbFdyaXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJZW51bSByZjkwX3JhZGlvX3BhdGggZVJGUGF0aCwKKwkJCQl1MzIgT2Zmc2V0LCB1MzIgRGF0YSk7CisKK3N0YXRpYyB1MzIgcnRsODE5Ml9DYWxjdWxhdGVCaXRTaGlmdCh1MzIgZHdCaXRNYXNrKQoreworCXUzMiBpOworCWZvciAoaSA9IDA7IGkgPD0gMzE7IGkrKykgeworCQlpZiAoKChkd0JpdE1hc2sgPj4gaSkgJiAweDEpID09IDEpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGk7Cit9CisKK3U4IHJ0bDgxOTJfcGh5X0NoZWNrSXNMZWdhbFJGUGF0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZVJGUGF0aCkKK3sKKwl1OCByZXQgPSAxOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlpZiAocHJpdi0+cmZfdHlwZSA9PSBSRl8yVDRSKQorCQlyZXQgPSAwOworCWVsc2UgaWYgKHByaXYtPnJmX3R5cGUgPT0gUkZfMVQyUikgeworCQlpZiAoZVJGUGF0aCA9PSBSRjkwX1BBVEhfQSB8fCBlUkZQYXRoID09IFJGOTBfUEFUSF9CKQorCQkJcmV0ID0gMTsKKwkJZWxzZSBpZiAoZVJGUGF0aCA9PSBSRjkwX1BBVEhfQyB8fCBlUkZQYXRoID09IFJGOTBfUEFUSF9EKQorCQkJcmV0ID0gMDsKKwl9CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBydGw4MTkyX3NldEJCcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkd1JlZ0FkZHIsIHUzMiBkd0JpdE1hc2ssCisJCSAgICAgIHUzMiBkd0RhdGEpCit7CisKKwl1MzIgT3JpZ2luYWxWYWx1ZSwgQml0U2hpZnQsIE5ld1ZhbHVlOworCisJaWYgKGR3Qml0TWFzayAhPSBiTWFza0RXb3JkKSB7CisJCU9yaWdpbmFsVmFsdWUgPSByZWFkX25pY19kd29yZChkZXYsIGR3UmVnQWRkcik7CisJCUJpdFNoaWZ0ID0gcnRsODE5Ml9DYWxjdWxhdGVCaXRTaGlmdChkd0JpdE1hc2spOworCQlOZXdWYWx1ZSA9ICgoKE9yaWdpbmFsVmFsdWUpICYgKH5kd0JpdE1hc2spKSB8CisJCQkgICAgKGR3RGF0YSA8PCBCaXRTaGlmdCkpOworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBkd1JlZ0FkZHIsIE5ld1ZhbHVlKTsKKwl9IGVsc2UKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgZHdSZWdBZGRyLCBkd0RhdGEpOworCXJldHVybjsKK30KKwordTMyIHJ0bDgxOTJfUXVlcnlCQlJlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZHdSZWdBZGRyLCB1MzIgZHdCaXRNYXNrKQoreworCXUzMiBSZXQgPSAwLCBPcmlnaW5hbFZhbHVlLCBCaXRTaGlmdDsKKworCU9yaWdpbmFsVmFsdWUgPSByZWFkX25pY19kd29yZChkZXYsIGR3UmVnQWRkcik7CisJQml0U2hpZnQgPSBydGw4MTkyX0NhbGN1bGF0ZUJpdFNoaWZ0KGR3Qml0TWFzayk7CisJUmV0ID0gKE9yaWdpbmFsVmFsdWUgJiBkd0JpdE1hc2spID4+IEJpdFNoaWZ0OworCisJcmV0dXJuIFJldDsKK30KK3N0YXRpYyB1MzIgcnRsODE5Ml9waHlfUkZTZXJpYWxSZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgIGVudW0gcmY5MF9yYWRpb19wYXRoIGVSRlBhdGgsIHUzMiBPZmZzZXQpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXUzMiByZXQgPSAwOworCXUzMiBOZXdPZmZzZXQgPSAwOworCXN0cnVjdCBiYl9yZWdfZGVmaW5pdGlvbiAqcFBoeVJlZyA9ICZwcml2LT5QSFlSZWdEZWZbZVJGUGF0aF07CisJT2Zmc2V0ICY9IDB4M2Y7CisKKwlpZiAocHJpdi0+cmZfY2hpcCA9PSBSRl84MjU2KSB7CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyNCwgMHhmMDAsIDB4MCk7CisJCWlmIChPZmZzZXQgPj0gMzEpIHsKKwkJCXByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdIHw9IDB4MTQwOworCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmM3dpcmVPZmZzZXQsCisJCQkJCSBiTWFza0RXb3JkLAorCQkJCQkgKHByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdPDwxNikpOworCQkJTmV3T2Zmc2V0ID0gT2Zmc2V0IC0gMzA7CisJCX0gZWxzZSBpZiAoT2Zmc2V0ID49IDE2KSB7CisJCQlwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSB8PSAweDEwMDsKKwkJCXByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdICY9ICh+MHg0MCk7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmYzd2lyZU9mZnNldCwKKwkJCQkJIGJNYXNrRFdvcmQsCisJCQkJCSAocHJpdi0+UmZSZWcwVmFsdWVbZVJGUGF0aF08PDE2KSk7CisKKwkJCU5ld09mZnNldCA9IE9mZnNldCAtIDE1OworCQl9IGVsc2UKKwkJCU5ld09mZnNldCA9IE9mZnNldDsKKwl9IGVsc2UgeworCQlSVF9UUkFDRSgoQ09NUF9QSFl8Q09NUF9FUlIpLCAiY2hlY2sgUkYgdHlwZSBoZXJlLCBuZWVkIgorCQkJICIgdG8gYmUgODI1NlxuIik7CisJCU5ld09mZnNldCA9IE9mZnNldDsKKwl9CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmSFNTSVBhcmEyLCBiTFNTSVJlYWRBZGRyZXNzLAorCQkJIE5ld09mZnNldCk7CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmSFNTSVBhcmEyLCAgYkxTU0lSZWFkRWRnZSwgMHgwKTsKKwlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmZIU1NJUGFyYTIsICBiTFNTSVJlYWRFZGdlLCAweDEpOworCisJbWRlbGF5KDEpOworCisJcmV0ID0gcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgcFBoeVJlZy0+cmZMU1NJUmVhZEJhY2ssCisJCQkJIGJMU1NJUmVhZEJhY2tEYXRhKTsKKworCWlmIChwcml2LT5yZl9jaGlwID09IFJGXzgyNTYpIHsKKwkJcHJpdi0+UmZSZWcwVmFsdWVbZVJGUGF0aF0gJj0gMHhlYmY7CisKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmM3dpcmVPZmZzZXQsIGJNYXNrRFdvcmQsCisJCQkJKHByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdIDw8IDE2KSk7CisKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXI0LCAweDMwMCwgMHgzKTsKKwl9CisKKworCXJldHVybiByZXQ7CisKK30KKworc3RhdGljIHZvaWQgcnRsODE5Ml9waHlfUkZTZXJpYWxXcml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgIGVudW0gcmY5MF9yYWRpb19wYXRoIGVSRlBhdGgsIHUzMiBPZmZzZXQsCisJCQkJICAgICAgdTMyIERhdGEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXUzMiBEYXRhQW5kQWRkciA9IDAsIE5ld09mZnNldCA9IDA7CisJc3RydWN0IGJiX3JlZ19kZWZpbml0aW9uICpwUGh5UmVnID0gJnByaXYtPlBIWVJlZ0RlZltlUkZQYXRoXTsKKworCU9mZnNldCAmPSAweDNmOworCWlmIChwcml2LT5yZl9jaGlwID09IFJGXzgyNTYpIHsKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXI0LCAweGYwMCwgMHgwKTsKKworCQlpZiAoT2Zmc2V0ID49IDMxKSB7CisJCQlwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSB8PSAweDE0MDsKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBwUGh5UmVnLT5yZjN3aXJlT2Zmc2V0LAorCQkJCQkgYk1hc2tEV29yZCwKKwkJCQkJIChwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSA8PCAxNikpOworCQkJTmV3T2Zmc2V0ID0gT2Zmc2V0IC0gMzA7CisJCX0gZWxzZSBpZiAoT2Zmc2V0ID49IDE2KSB7CisJCQlwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSB8PSAweDEwMDsKKwkJCXByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdICY9ICh+MHg0MCk7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmYzd2lyZU9mZnNldCwKKwkJCQkJIGJNYXNrRFdvcmQsCisJCQkJCSAocHJpdi0+UmZSZWcwVmFsdWVbZVJGUGF0aF0gPDwgMTYpKTsKKwkJCU5ld09mZnNldCA9IE9mZnNldCAtIDE1OworCQl9IGVsc2UKKwkJCU5ld09mZnNldCA9IE9mZnNldDsKKwl9IGVsc2UgeworCQlSVF9UUkFDRSgoQ09NUF9QSFl8Q09NUF9FUlIpLCAiY2hlY2sgUkYgdHlwZSBoZXJlLCBuZWVkIHRvIGJlIgorCQkJICIgODI1NlxuIik7CisJCU5ld09mZnNldCA9IE9mZnNldDsKKwl9CisKKwlEYXRhQW5kQWRkciA9IChEYXRhPDwxNikgfCAoTmV3T2Zmc2V0JjB4M2YpOworCisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHBQaHlSZWctPnJmM3dpcmVPZmZzZXQsIGJNYXNrRFdvcmQsIERhdGFBbmRBZGRyKTsKKworCWlmIChPZmZzZXQgPT0gMHgwKQorCQlwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSA9IERhdGE7CisKKwlpZiAocHJpdi0+cmZfY2hpcCA9PSBSRl84MjU2KSB7CisJCWlmIChPZmZzZXQgIT0gMCkgeworCQkJcHJpdi0+UmZSZWcwVmFsdWVbZVJGUGF0aF0gJj0gMHhlYmY7CisJCQlydGw4MTkyX3NldEJCcmVnKAorCQkJCWRldiwKKwkJCQlwUGh5UmVnLT5yZjN3aXJlT2Zmc2V0LAorCQkJCWJNYXNrRFdvcmQsCisJCQkJKHByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdIDw8IDE2KSk7CisJCX0KKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXI0LCAweDMwMCwgMHgzKTsKKwl9CisJcmV0dXJuOworfQorCit2b2lkIHJ0bDgxOTJfcGh5X1NldFJGUmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGVudW0gcmY5MF9yYWRpb19wYXRoIGVSRlBhdGgsCisJCQkgIHUzMiBSZWdBZGRyLCB1MzIgQml0TWFzaywgdTMyIERhdGEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXUzMiBPcmlnaW5hbF9WYWx1ZSwgQml0U2hpZnQsIE5ld19WYWx1ZTsKKworCWlmICghcnRsODE5Ml9waHlfQ2hlY2tJc0xlZ2FsUkZQYXRoKGRldiwgZVJGUGF0aCkpCisJCXJldHVybjsKKwlpZiAocHJpdi0+cnRsbGliLT5lUkZQb3dlclN0YXRlICE9IGVSZk9uICYmICFwcml2LT5iZWluZ19pbml0X2FkYXB0ZXIpCisJCXJldHVybjsKKworCVJUX1RSQUNFKENPTVBfUEhZLCAiRlcgUkYgQ1RSTCBpcyBub3QgcmVhZHkgbm93XG4iKTsKKwlpZiAocHJpdi0+UmZfTW9kZSA9PSBSRl9PUF9CeV9GVykgeworCQlpZiAoQml0TWFzayAhPSBiTWFzazEyQml0cykgeworCQkJT3JpZ2luYWxfVmFsdWUgPSBwaHlfRndSRlNlcmlhbFJlYWQoZGV2LCBlUkZQYXRoLAorCQkJCQkJCSAgICBSZWdBZGRyKTsKKwkJCUJpdFNoaWZ0ID0gIHJ0bDgxOTJfQ2FsY3VsYXRlQml0U2hpZnQoQml0TWFzayk7CisJCQlOZXdfVmFsdWUgPSAoKChPcmlnaW5hbF9WYWx1ZSkgJiAofkJpdE1hc2spKSB8CisJCQkJICAgIChEYXRhIDw8IEJpdFNoaWZ0KSk7CisKKwkJCXBoeV9Gd1JGU2VyaWFsV3JpdGUoZGV2LCBlUkZQYXRoLCBSZWdBZGRyLCBOZXdfVmFsdWUpOworCQl9IGVsc2UKKwkJCXBoeV9Gd1JGU2VyaWFsV3JpdGUoZGV2LCBlUkZQYXRoLCBSZWdBZGRyLCBEYXRhKTsKKwkJdWRlbGF5KDIwMCk7CisKKwl9IGVsc2UgeworCQlpZiAoQml0TWFzayAhPSBiTWFzazEyQml0cykgeworCQkJT3JpZ2luYWxfVmFsdWUgPSBydGw4MTkyX3BoeV9SRlNlcmlhbFJlYWQoZGV2LCBlUkZQYXRoLAorCQkJCQkJCQkgIFJlZ0FkZHIpOworCQkJQml0U2hpZnQgPSAgcnRsODE5Ml9DYWxjdWxhdGVCaXRTaGlmdChCaXRNYXNrKTsKKwkJCU5ld19WYWx1ZSA9ICgoKE9yaWdpbmFsX1ZhbHVlKSAmICh+Qml0TWFzaykpIHwKKwkJCQkgICAgIChEYXRhIDw8IEJpdFNoaWZ0KSk7CisKKwkJCXJ0bDgxOTJfcGh5X1JGU2VyaWFsV3JpdGUoZGV2LCBlUkZQYXRoLCBSZWdBZGRyLAorCQkJCQkJICBOZXdfVmFsdWUpOworCQl9IGVsc2UKKwkJCXJ0bDgxOTJfcGh5X1JGU2VyaWFsV3JpdGUoZGV2LCBlUkZQYXRoLCBSZWdBZGRyLCBEYXRhKTsKKwl9CisJcmV0dXJuOworfQorCit1MzIgcnRsODE5Ml9waHlfUXVlcnlSRlJlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBlbnVtIHJmOTBfcmFkaW9fcGF0aCBlUkZQYXRoLAorCQkJICAgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrKQoreworCXUzMiBPcmlnaW5hbF9WYWx1ZSwgUmVhZGJhY2tfVmFsdWUsIEJpdFNoaWZ0OworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlpZiAoIXJ0bDgxOTJfcGh5X0NoZWNrSXNMZWdhbFJGUGF0aChkZXYsIGVSRlBhdGgpKQorCQlyZXR1cm4gMDsKKwlpZiAocHJpdi0+cnRsbGliLT5lUkZQb3dlclN0YXRlICE9IGVSZk9uICYmICFwcml2LT5iZWluZ19pbml0X2FkYXB0ZXIpCisJCXJldHVybgkwOworCWRvd24oJnByaXYtPnJmX3NlbSk7CisJaWYgKHByaXYtPlJmX01vZGUgPT0gUkZfT1BfQnlfRlcpIHsKKwkJT3JpZ2luYWxfVmFsdWUgPSBwaHlfRndSRlNlcmlhbFJlYWQoZGV2LCBlUkZQYXRoLCBSZWdBZGRyKTsKKwkJdWRlbGF5KDIwMCk7CisJfSBlbHNlIHsKKwkJT3JpZ2luYWxfVmFsdWUgPSBydGw4MTkyX3BoeV9SRlNlcmlhbFJlYWQoZGV2LCBlUkZQYXRoLAorCQkJCQkJCSAgUmVnQWRkcik7CisJfQorCUJpdFNoaWZ0ID0gIHJ0bDgxOTJfQ2FsY3VsYXRlQml0U2hpZnQoQml0TWFzayk7CisJUmVhZGJhY2tfVmFsdWUgPSAoT3JpZ2luYWxfVmFsdWUgJiBCaXRNYXNrKSA+PiBCaXRTaGlmdDsKKwl1cCgmcHJpdi0+cmZfc2VtKTsKKwlyZXR1cm4gUmVhZGJhY2tfVmFsdWU7Cit9CisKK3N0YXRpYyB1MzIgcGh5X0Z3UkZTZXJpYWxSZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBlbnVtIHJmOTBfcmFkaW9fcGF0aCBlUkZQYXRoLCB1MzIgT2Zmc2V0KQoreworCXUzMgkJcmV0VmFsdWUgPSAwOworCXUzMgkJRGF0YSA9IDA7CisJdTgJCXRpbWUgPSAwOworCURhdGEgfD0gKChPZmZzZXQgJiAweEZGKSA8PCAxMik7CisJRGF0YSB8PSAoKGVSRlBhdGggJiAweDMpIDw8IDIwKTsKKwlEYXRhIHw9IDB4ODAwMDAwMDA7CisJd2hpbGUgKHJlYWRfbmljX2R3b3JkKGRldiwgUVBOUikmMHg4MDAwMDAwMCkgeworCQlpZiAodGltZSsrIDwgMTAwKQorCQkJdWRlbGF5KDEwKTsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCXdyaXRlX25pY19kd29yZChkZXYsIFFQTlIsIERhdGEpOworCXdoaWxlIChyZWFkX25pY19kd29yZChkZXYsIFFQTlIpICYgMHg4MDAwMDAwMCkgeworCQlpZiAodGltZSsrIDwgMTAwKQorCQkJdWRlbGF5KDEwKTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfQorCXJldFZhbHVlID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBSRl9EQVRBKTsKKworCXJldHVybglyZXRWYWx1ZTsKKworfQkvKiBwaHlfRndSRlNlcmlhbFJlYWQgKi8KKworc3RhdGljIHZvaWQgcGh5X0Z3UkZTZXJpYWxXcml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCWVudW0gcmY5MF9yYWRpb19wYXRoIGVSRlBhdGgsCisJCQkJdTMyIE9mZnNldCwgdTMyIERhdGEpCit7CisJdTgJdGltZSA9IDA7CisKKwlEYXRhIHw9ICgoT2Zmc2V0ICYgMHhGRikgPDwgMTIpOworCURhdGEgfD0gKChlUkZQYXRoICYgMHgzKSA8PCAyMCk7CisJRGF0YSB8PSAweDQwMDAwMDsKKwlEYXRhIHw9IDB4ODAwMDAwMDA7CisKKwl3aGlsZSAocmVhZF9uaWNfZHdvcmQoZGV2LCBRUE5SKSAmIDB4ODAwMDAwMDApIHsKKwkJaWYgKHRpbWUrKyA8IDEwMCkKKwkJCXVkZWxheSgxMCk7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBRUE5SLCBEYXRhKTsKKworfQkvKiBwaHlfRndSRlNlcmlhbFdyaXRlICovCisKKwordm9pZCBydGw4MTkyX3BoeV9jb25maWdtYWMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1MzIgZHdBcnJheUxlbiA9IDAsIGkgPSAwOworCXUzMiAqcGR3QXJyYXkgPSBOVUxMOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCWlmIChwcml2LT5iVFhQb3dlckRhdGFSZWFkRnJvbUVFUE9STSkgeworCQlSVF9UUkFDRShDT01QX1BIWSwgIlJ0bDgxOVhNQUNQSFlfQXJyYXlfUEdcbiIpOworCQlkd0FycmF5TGVuID0gTUFDUEhZX0FycmF5X1BHTGVuZ3RoOworCQlwZHdBcnJheSA9IFJ0bDgxOVhNQUNQSFlfQXJyYXlfUEc7CisKKwl9IGVsc2UgeworCQlSVF9UUkFDRShDT01QX1BIWSwgIlJlYWQgcnRsODE5WE1BQ1BIWV9BcnJheVxuIik7CisJCWR3QXJyYXlMZW4gPSBNQUNQSFlfQXJyYXlMZW5ndGg7CisJCXBkd0FycmF5ID0gUnRsODE5WE1BQ1BIWV9BcnJheTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGR3QXJyYXlMZW47IGkgKz0gMykgeworCQlSVF9UUkFDRShDT01QX0RCRywgIlRoZSBSdGw4MTkwTUFDUEhZX0FycmF5WzBdIGlzICV4IFJ0bDgxOTBNQUMiCisJCQkgIlBIWV9BcnJheVsxXSBpcyAleCBSdGw4MTkwTUFDUEhZX0FycmF5WzJdIGlzICV4XG4iLAorCQkJIHBkd0FycmF5W2ldLCBwZHdBcnJheVtpKzFdLCBwZHdBcnJheVtpKzJdKTsKKwkJaWYgKHBkd0FycmF5W2ldID09IDB4MzE4KQorCQkJcGR3QXJyYXlbaSsyXSA9IDB4MDAwMDA4MDA7CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBwZHdBcnJheVtpXSwgcGR3QXJyYXlbaSsxXSwKKwkJCQkgcGR3QXJyYXlbaSsyXSk7CisJfQorCXJldHVybjsKKworfQorCit2b2lkIHJ0bDgxOTJfcGh5Q29uZmlnQkIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggQ29uZmlnVHlwZSkKK3sKKwlpbnQgaTsKKwl1MzIgKlJ0bDgxOVhQSFlfUkVHQXJyYXlfVGFibGUgPSBOVUxMOworCXUzMiAqUnRsODE5WEFHQ1RBQl9BcnJheV9UYWJsZSA9IE5VTEw7CisJdTE2IEFHQ1RBQl9BcnJheUxlbiwgUEhZX1JFR0FycmF5TGVuID0gMDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisKKwlBR0NUQUJfQXJyYXlMZW4gPSBBR0NUQUJfQXJyYXlMZW5ndGg7CisJUnRsODE5WEFHQ1RBQl9BcnJheV9UYWJsZSA9IFJ0bDgxOVhBR0NUQUJfQXJyYXk7CisJaWYgKHByaXYtPnJmX3R5cGUgPT0gUkZfMlQ0UikgeworCQlQSFlfUkVHQXJyYXlMZW4gPSBQSFlfUkVHQXJyYXlMZW5ndGg7CisJCVJ0bDgxOVhQSFlfUkVHQXJyYXlfVGFibGUgPSBSdGw4MTlYUEhZX1JFR0FycmF5OworCX0gZWxzZSBpZiAocHJpdi0+cmZfdHlwZSA9PSBSRl8xVDJSKSB7CisJCVBIWV9SRUdBcnJheUxlbiA9IFBIWV9SRUdfMVQyUkFycmF5TGVuZ3RoOworCQlSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlID0gUnRsODE5WFBIWV9SRUdfMVQyUkFycmF5OworCX0KKworCWlmIChDb25maWdUeXBlID09IEJhc2VCYW5kX0NvbmZpZ19QSFlfUkVHKSB7CisJCWZvciAoaSA9IDA7IGkgPCBQSFlfUkVHQXJyYXlMZW47IGkgKz0gMikgeworCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIFJ0bDgxOVhQSFlfUkVHQXJyYXlfVGFibGVbaV0sCisJCQkJCSBiTWFza0RXb3JkLAorCQkJCQkgUnRsODE5WFBIWV9SRUdBcnJheV9UYWJsZVtpKzFdKTsKKwkJCVJUX1RSQUNFKENPTVBfREJHLCAiaTogJXgsIFRoZSBSdGw4MTl4VXNiUEhZX1JFR0FycmF5IgorCQkJCSAiWzBdIGlzICV4IFJ0bDgxOXhVc2JQSFlfUkVHQXJyYXlbMV0gaXMgJXhcbiIsCisJCQkJIGksIFJ0bDgxOVhQSFlfUkVHQXJyYXlfVGFibGVbaV0sCisJCQkJIFJ0bDgxOVhQSFlfUkVHQXJyYXlfVGFibGVbaSsxXSk7CisJCX0KKwl9IGVsc2UgaWYgKENvbmZpZ1R5cGUgPT0gQmFzZUJhbmRfQ29uZmlnX0FHQ19UQUIpIHsKKwkJZm9yIChpID0gMDsgaSA8IEFHQ1RBQl9BcnJheUxlbjsgaSArPSAyKSB7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgUnRsODE5WEFHQ1RBQl9BcnJheV9UYWJsZVtpXSwKKwkJCQkJIGJNYXNrRFdvcmQsCisJCQkJCSBSdGw4MTlYQUdDVEFCX0FycmF5X1RhYmxlW2krMV0pOworCQkJUlRfVFJBQ0UoQ09NUF9EQkcsICJpOiV4LCBUaGUgcnRsODE5WEFHQ1RBQl9BcnJheVswXSAiCisJCQkJICJpcyAleCBydGw4MTlYQUdDVEFCX0FycmF5WzFdIGlzICV4XG4iLCBpLAorCQkJCSBSdGw4MTlYQUdDVEFCX0FycmF5X1RhYmxlW2ldLAorCQkJCSBSdGw4MTlYQUdDVEFCX0FycmF5X1RhYmxlW2krMV0pOworCQl9CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgcnRsODE5Ml9Jbml0QkJSRlJlZ0RlZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZpbnRmcyA9IHJGUEdBMF9YQUJfUkZJbnRlcmZhY2VTVzsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmaW50ZnMgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlU1c7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZmludGZzID0gckZQR0EwX1hDRF9SRkludGVyZmFjZVNXOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZpbnRmcyA9IHJGUEdBMF9YQ0RfUkZJbnRlcmZhY2VTVzsKKworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZpbnRmaSA9IHJGUEdBMF9YQUJfUkZJbnRlcmZhY2VSQjsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmaW50ZmkgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlUkI7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZmludGZpID0gckZQR0EwX1hDRF9SRkludGVyZmFjZVJCOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZpbnRmaSA9IHJGUEdBMF9YQ0RfUkZJbnRlcmZhY2VSQjsKKworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZpbnRmbyA9IHJGUEdBMF9YQV9SRkludGVyZmFjZU9FOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZpbnRmbyA9IHJGUEdBMF9YQl9SRkludGVyZmFjZU9FOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQ10ucmZpbnRmbyA9IHJGUEdBMF9YQ19SRkludGVyZmFjZU9FOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZpbnRmbyA9IHJGUEdBMF9YRF9SRkludGVyZmFjZU9FOworCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZmludGZlID0gckZQR0EwX1hBX1JGSW50ZXJmYWNlT0U7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZmludGZlID0gckZQR0EwX1hCX1JGSW50ZXJmYWNlT0U7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZmludGZlID0gckZQR0EwX1hDX1JGSW50ZXJmYWNlT0U7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZmludGZlID0gckZQR0EwX1hEX1JGSW50ZXJmYWNlT0U7CisKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmM3dpcmVPZmZzZXQgPSByRlBHQTBfWEFfTFNTSVBhcmFtZXRlcjsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmM3dpcmVPZmZzZXQgPSByRlBHQTBfWEJfTFNTSVBhcmFtZXRlcjsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmM3dpcmVPZmZzZXQgPSByRlBHQTBfWENfTFNTSVBhcmFtZXRlcjsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmM3dpcmVPZmZzZXQgPSByRlBHQTBfWERfTFNTSVBhcmFtZXRlcjsKKworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZMU1NJX1NlbGVjdCA9IHJGUEdBMF9YQUJfUkZQYXJhbWV0ZXI7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZkxTU0lfU2VsZWN0ID0gckZQR0EwX1hBQl9SRlBhcmFtZXRlcjsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmTFNTSV9TZWxlY3QgPSByRlBHQTBfWENEX1JGUGFyYW1ldGVyOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZMU1NJX1NlbGVjdCA9IHJGUEdBMF9YQ0RfUkZQYXJhbWV0ZXI7CisKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmVHhHYWluU3RhZ2UgPSByRlBHQTBfVHhHYWluU3RhZ2U7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZlR4R2FpblN0YWdlID0gckZQR0EwX1R4R2FpblN0YWdlOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQ10ucmZUeEdhaW5TdGFnZSA9IHJGUEdBMF9UeEdhaW5TdGFnZTsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmVHhHYWluU3RhZ2UgPSByRlBHQTBfVHhHYWluU3RhZ2U7CisKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmSFNTSVBhcmExID0gckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIxOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZIU1NJUGFyYTEgPSByRlBHQTBfWEJfSFNTSVBhcmFtZXRlcjE7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZkhTU0lQYXJhMSA9IHJGUEdBMF9YQ19IU1NJUGFyYW1ldGVyMTsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmSFNTSVBhcmExID0gckZQR0EwX1hEX0hTU0lQYXJhbWV0ZXIxOworCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZkhTU0lQYXJhMiA9IHJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMjsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmSFNTSVBhcmEyID0gckZQR0EwX1hCX0hTU0lQYXJhbWV0ZXIyOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQ10ucmZIU1NJUGFyYTIgPSByRlBHQTBfWENfSFNTSVBhcmFtZXRlcjI7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZkhTU0lQYXJhMiA9IHJGUEdBMF9YRF9IU1NJUGFyYW1ldGVyMjsKKworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZTd2l0Y2hDb250cm9sID0gckZQR0EwX1hBQl9Td2l0Y2hDb250cm9sOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZTd2l0Y2hDb250cm9sID0gckZQR0EwX1hBQl9Td2l0Y2hDb250cm9sOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQ10ucmZTd2l0Y2hDb250cm9sID0gckZQR0EwX1hDRF9Td2l0Y2hDb250cm9sOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZTd2l0Y2hDb250cm9sID0gckZQR0EwX1hDRF9Td2l0Y2hDb250cm9sOworCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZkFHQ0NvbnRyb2wxID0gck9GRE0wX1hBQUdDQ29yZTE7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZkFHQ0NvbnRyb2wxID0gck9GRE0wX1hCQUdDQ29yZTE7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZkFHQ0NvbnRyb2wxID0gck9GRE0wX1hDQUdDQ29yZTE7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZkFHQ0NvbnRyb2wxID0gck9GRE0wX1hEQUdDQ29yZTE7CisKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmQUdDQ29udHJvbDIgPSByT0ZETTBfWEFBR0NDb3JlMjsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmQUdDQ29udHJvbDIgPSByT0ZETTBfWEJBR0NDb3JlMjsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmQUdDQ29udHJvbDIgPSByT0ZETTBfWENBR0NDb3JlMjsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmQUdDQ29udHJvbDIgPSByT0ZETTBfWERBR0NDb3JlMjsKKworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZSeElRSW1iYWxhbmNlID0gck9GRE0wX1hBUnhJUUltYmFsYW5jZTsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YQlJ4SVFJbWJhbGFuY2U7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZlJ4SVFJbWJhbGFuY2UgPSByT0ZETTBfWENSeElRSW1iYWxhbmNlOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZSeElRSW1iYWxhbmNlID0gck9GRE0wX1hEUnhJUUltYmFsYW5jZTsKKworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZSeEFGRSA9IHJPRkRNMF9YQVJ4QUZFOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZSeEFGRSA9IHJPRkRNMF9YQlJ4QUZFOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQ10ucmZSeEFGRSA9IHJPRkRNMF9YQ1J4QUZFOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZSeEFGRSA9IHJPRkRNMF9YRFJ4QUZFOworCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZlR4SVFJbWJhbGFuY2UgPSByT0ZETTBfWEFUeElRSW1iYWxhbmNlOworCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hCVHhJUUltYmFsYW5jZTsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmVHhJUUltYmFsYW5jZSA9IHJPRkRNMF9YQ1R4SVFJbWJhbGFuY2U7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZlR4SVFJbWJhbGFuY2UgPSByT0ZETTBfWERUeElRSW1iYWxhbmNlOworCisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZlR4QUZFID0gck9GRE0wX1hBVHhBRkU7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZlR4QUZFID0gck9GRE0wX1hCVHhBRkU7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZlR4QUZFID0gck9GRE0wX1hDVHhBRkU7CisJcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZlR4QUZFID0gck9GRE0wX1hEVHhBRkU7CisKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmTFNTSVJlYWRCYWNrID0gckZQR0EwX1hBX0xTU0lSZWFkQmFjazsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmTFNTSVJlYWRCYWNrID0gckZQR0EwX1hCX0xTU0lSZWFkQmFjazsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmTFNTSVJlYWRCYWNrID0gckZQR0EwX1hDX0xTU0lSZWFkQmFjazsKKwlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmTFNTSVJlYWRCYWNrID0gckZQR0EwX1hEX0xTU0lSZWFkQmFjazsKKworfQorCitib29sIHJ0bDgxOTJfcGh5X2NoZWNrQkJBbmRSRihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgZW51bSBodzkwX2Jsb2NrIENoZWNrQmxvY2ssCisJCQkgICAgICBlbnVtIHJmOTBfcmFkaW9fcGF0aCBlUkZQYXRoKQoreworCWJvb2wgcmV0ID0gdHJ1ZTsKKwl1MzIgaSwgQ2hlY2tUaW1lcyA9IDQsIGR3UmVnUmVhZCA9IDA7CisJdTMyIFdyaXRlQWRkcls0XTsKKwl1MzIgV3JpdGVEYXRhW10gPSB7MHhmZmZmZjAyNywgMHhhYTU1YTAyZiwgMHgwMDAwMDAyNywgMHg1NWFhNTAyZn07CisKKwlXcml0ZUFkZHJbSFc5MF9CTE9DS19NQUNdID0gMHgxMDA7CisJV3JpdGVBZGRyW0hXOTBfQkxPQ0tfUEhZMF0gPSAweDkwMDsKKwlXcml0ZUFkZHJbSFc5MF9CTE9DS19QSFkxXSA9IDB4ODAwOworCVdyaXRlQWRkcltIVzkwX0JMT0NLX1JGXSA9IDB4MzsKKwlSVF9UUkFDRShDT01QX1BIWSwgIj09PT09PT0+JXMoKSwgQ2hlY2tCbG9jazolZFxuIiwgX19mdW5jX18sCisJCSBDaGVja0Jsb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgQ2hlY2tUaW1lczsgaSsrKSB7CisJCXN3aXRjaCAoQ2hlY2tCbG9jaykgeworCQljYXNlIEhXOTBfQkxPQ0tfTUFDOgorCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJQSFlfQ2hlY2tCQlJGT0soKTogTmV2ZXIgV3JpdGUgIgorCQkJCSAiMHgxMDAgaGVyZSEiKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSFc5MF9CTE9DS19QSFkwOgorCQljYXNlIEhXOTBfQkxPQ0tfUEhZMToKKwkJCXdyaXRlX25pY19kd29yZChkZXYsIFdyaXRlQWRkcltDaGVja0Jsb2NrXSwKKwkJCQkJV3JpdGVEYXRhW2ldKTsKKwkJCWR3UmVnUmVhZCA9IHJlYWRfbmljX2R3b3JkKGRldiwgV3JpdGVBZGRyW0NoZWNrQmxvY2tdKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSFc5MF9CTE9DS19SRjoKKwkJCVdyaXRlRGF0YVtpXSAmPSAweGZmZjsKKwkJCXJ0bDgxOTJfcGh5X1NldFJGUmVnKGRldiwgZVJGUGF0aCwKKwkJCQkJCSBXcml0ZUFkZHJbSFc5MF9CTE9DS19SRl0sCisJCQkJCQkgYk1hc2sxMkJpdHMsIFdyaXRlRGF0YVtpXSk7CisJCQltZGVsYXkoMTApOworCQkJZHdSZWdSZWFkID0gcnRsODE5Ml9waHlfUXVlcnlSRlJlZyhkZXYsIGVSRlBhdGgsCisJCQkJCQkgV3JpdGVBZGRyW0hXOTBfQkxPQ0tfUkZdLAorCQkJCQkJIGJNYXNrRFdvcmQpOworCQkJbWRlbGF5KDEwKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXQgPSBmYWxzZTsKKwkJCWJyZWFrOworCQl9CisKKworCQlpZiAoZHdSZWdSZWFkICE9IFdyaXRlRGF0YVtpXSkgeworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICI9PT09PmVycm9yPT09PT1kd1JlZ1JlYWQ6ICV4LCAiCisJCQkJICJXcml0ZURhdGE6ICV4XG4iLCBkd1JlZ1JlYWQsIFdyaXRlRGF0YVtpXSk7CisJCQlyZXQgPSBmYWxzZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGJvb2wgcnRsODE5Ml9CQl9Db25maWdfUGFyYUZpbGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJYm9vbCBydFN0YXR1cyA9IHRydWU7CisJdTggYlJlZ1ZhbHVlID0gMCwgZUNoZWNrSXRlbSA9IDA7CisJdTMyIGR3UmVnVmFsdWUgPSAwOworCisJYlJlZ1ZhbHVlID0gcmVhZF9uaWNfYnl0ZShkZXYsIEJCX0dMT0JBTF9SRVNFVCk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBCQl9HTE9CQUxfUkVTRVQsIChiUmVnVmFsdWV8QkJfR0xPQkFMX1JFU0VUX0JJVCkpOworCisJZHdSZWdWYWx1ZSA9IHJlYWRfbmljX2R3b3JkKGRldiwgQ1BVX0dFTik7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgQ1BVX0dFTiwgKGR3UmVnVmFsdWUmKH5DUFVfR0VOX0JCX1JTVCkpKTsKKworCWZvciAoZUNoZWNrSXRlbSA9IChlbnVtIGh3OTBfYmxvY2spSFc5MF9CTE9DS19QSFkwOworCSAgICAgZUNoZWNrSXRlbSA8PSBIVzkwX0JMT0NLX1BIWTE7IGVDaGVja0l0ZW0rKykgeworCQlydFN0YXR1cyAgPSBydGw4MTkyX3BoeV9jaGVja0JCQW5kUkYoZGV2LAorCQkJCQkgKGVudW0gaHc5MF9ibG9jayllQ2hlY2tJdGVtLAorCQkJCQkgKGVudW0gcmY5MF9yYWRpb19wYXRoKTApOworCQlpZiAocnRTdGF0dXMgIT0gdHJ1ZSkgeworCQkJUlRfVFJBQ0UoKENPTVBfRVJSIHwgQ09NUF9QSFkpLCAiUEhZX1JGODI1Nl9Db25maWcoKToiCisJCQkJICJDaGVjayBQSFklZCBGYWlsISFcbiIsIGVDaGVja0l0ZW0tMSk7CisJCQlyZXR1cm4gcnRTdGF0dXM7CisJCX0KKwl9CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9SRk1PRCwgYkNDS0VufGJPRkRNRW4sIDB4MCk7CisJcnRsODE5Ml9waHlDb25maWdCQihkZXYsIEJhc2VCYW5kX0NvbmZpZ19QSFlfUkVHKTsKKworCWR3UmVnVmFsdWUgPSByZWFkX25pY19kd29yZChkZXYsIENQVV9HRU4pOworCXdyaXRlX25pY19kd29yZChkZXYsIENQVV9HRU4sIChkd1JlZ1ZhbHVlfENQVV9HRU5fQkJfUlNUKSk7CisKKwlydGw4MTkyX3BoeUNvbmZpZ0JCKGRldiwgQmFzZUJhbmRfQ29uZmlnX0FHQ19UQUIpOworCisJaWYgKHByaXYtPklDX0N1dCAgPiBWRVJTSU9OXzgxOTBfQkQpIHsKKwkJaWYgKHByaXYtPnJmX3R5cGUgPT0gUkZfMlQ0UikKKwkJCWR3UmVnVmFsdWUgPSAocHJpdi0+QW50ZW5uYVR4UHdEaWZmWzJdPDw4IHwKKwkJCQkgICAgICBwcml2LT5BbnRlbm5hVHhQd0RpZmZbMV08PDQgfAorCQkJCSAgICAgIHByaXYtPkFudGVubmFUeFB3RGlmZlswXSk7CisJCWVsc2UKKwkJCWR3UmVnVmFsdWUgPSAweDA7CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfVHhHYWluU3RhZ2UsCisJCQkoYlhCVHhBR0N8YlhDVHhBR0N8YlhEVHhBR0MpLCBkd1JlZ1ZhbHVlKTsKKworCisJCWR3UmVnVmFsdWUgPSBwcml2LT5DcnlzdGFsQ2FwOworCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjEsIGJYdGFsQ2FwOTJ4LAorCQkJCSBkd1JlZ1ZhbHVlKTsKKwl9CisKKwlyZXR1cm4gcnRTdGF0dXM7Cit9Citib29sIHJ0bDgxOTJfQkJDb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlib29sIHJ0U3RhdHVzID0gdHJ1ZTsKKworCXJ0bDgxOTJfSW5pdEJCUkZSZWdEZWYoZGV2KTsKKwlydFN0YXR1cyA9IHJ0bDgxOTJfQkJfQ29uZmlnX1BhcmFGaWxlKGRldik7CisJcmV0dXJuIHJ0U3RhdHVzOworfQorCit2b2lkIHJ0bDgxOTJfcGh5X2dldFR4UG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisKKwlwcml2LT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFswXSA9CisJCXJlYWRfbmljX2R3b3JkKGRldiwgclR4QUdDX1JhdGUxOF8wNik7CisJcHJpdi0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbMV0gPQorCQlyZWFkX25pY19kd29yZChkZXYsIHJUeEFHQ19SYXRlNTRfMjQpOworCXByaXYtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WzJdID0KKwkJcmVhZF9uaWNfZHdvcmQoZGV2LCByVHhBR0NfTWNzMDNfTWNzMDApOworCXByaXYtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WzNdID0KKwkJcmVhZF9uaWNfZHdvcmQoZGV2LCByVHhBR0NfTWNzMDdfTWNzMDQpOworCXByaXYtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WzRdID0KKwkJcmVhZF9uaWNfZHdvcmQoZGV2LCByVHhBR0NfTWNzMTFfTWNzMDgpOworCXByaXYtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WzVdID0KKwkJcmVhZF9uaWNfZHdvcmQoZGV2LCByVHhBR0NfTWNzMTVfTWNzMTIpOworCisJcHJpdi0+RGVmYXVsdEluaXRpYWxHYWluWzBdID0gcmVhZF9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQUFHQ0NvcmUxKTsKKwlwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bMV0gPSByZWFkX25pY19ieXRlKGRldiwgck9GRE0wX1hCQUdDQ29yZTEpOworCXByaXYtPkRlZmF1bHRJbml0aWFsR2FpblsyXSA9IHJlYWRfbmljX2J5dGUoZGV2LCByT0ZETTBfWENBR0NDb3JlMSk7CisJcHJpdi0+RGVmYXVsdEluaXRpYWxHYWluWzNdID0gcmVhZF9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YREFHQ0NvcmUxKTsKKwlSVF9UUkFDRShDT01QX0lOSVQsICJEZWZhdWx0IGluaXRpYWwgZ2FpbiAoYzUwPTB4JXgsIGM1OD0weCV4LCAiCisJCSJjNjA9MHgleCwgYzY4PTB4JXgpXG4iLAorCQlwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bMF0sIHByaXYtPkRlZmF1bHRJbml0aWFsR2FpblsxXSwKKwkJcHJpdi0+RGVmYXVsdEluaXRpYWxHYWluWzJdLCBwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bM10pOworCisJcHJpdi0+ZnJhbWVzeW5jID0gcmVhZF9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMyk7CisJcHJpdi0+ZnJhbWVzeW5jQzM0ID0gcmVhZF9uaWNfZHdvcmQoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjIpOworCVJUX1RSQUNFKENPTVBfSU5JVCwgIkRlZmF1bHQgZnJhbWVzeW5jICgweCV4KSA9IDB4JXhcbiIsCisJCXJPRkRNMF9SeERldGVjdG9yMywgcHJpdi0+ZnJhbWVzeW5jKTsKKwlwcml2LT5TaWZzVGltZSA9IHJlYWRfbmljX3dvcmQoZGV2LCBTSUZTKTsKKwlyZXR1cm47Cit9CisKK3ZvaWQgcnRsODE5Ml9waHlfc2V0VHhQb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBjaGFubmVsKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwl1OAlwb3dlcmxldmVsID0gMCwgcG93ZXJsZXZlbE9GRE0yNEcgPSAwOworCWNoYXIgYW50X3B3cl9kaWZmOworCXUzMgl1NFJlZ1ZhbHVlOworCisJaWYgKHByaXYtPmVwcm9tdHlwZSA9PSBFRVBST01fOTNDNDYpIHsKKwkJcG93ZXJsZXZlbCA9IHByaXYtPlR4UG93ZXJMZXZlbENDS1tjaGFubmVsLTFdOworCQlwb3dlcmxldmVsT0ZETTI0RyA9IHByaXYtPlR4UG93ZXJMZXZlbE9GRE0yNEdbY2hhbm5lbC0xXTsKKwl9IGVsc2UgaWYgKHByaXYtPmVwcm9tdHlwZSA9PSBFRVBST01fOTNDNTYpIHsKKwkJaWYgKHByaXYtPnJmX3R5cGUgPT0gUkZfMVQyUikgeworCQkJcG93ZXJsZXZlbCA9IHByaXYtPlR4UG93ZXJMZXZlbENDS19DW2NoYW5uZWwtMV07CisJCQlwb3dlcmxldmVsT0ZETTI0RyA9IHByaXYtPlR4UG93ZXJMZXZlbE9GRE0yNEdfQ1tjaGFubmVsLTFdOworCQl9IGVsc2UgaWYgKHByaXYtPnJmX3R5cGUgPT0gUkZfMlQ0UikgeworCQkJcG93ZXJsZXZlbCA9IHByaXYtPlR4UG93ZXJMZXZlbENDS19BW2NoYW5uZWwtMV07CisJCQlwb3dlcmxldmVsT0ZETTI0RyA9IHByaXYtPlR4UG93ZXJMZXZlbE9GRE0yNEdfQVtjaGFubmVsLTFdOworCisJCQlhbnRfcHdyX2RpZmYgPSBwcml2LT5UeFBvd2VyTGV2ZWxPRkRNMjRHX0NbY2hhbm5lbC0xXQorCQkJCSAgICAgICAtIHByaXYtPlR4UG93ZXJMZXZlbE9GRE0yNEdfQVtjaGFubmVsLTFdOworCisJCQlwcml2LT5SRl9DX1R4UHdEaWZmID0gYW50X3B3cl9kaWZmOworCisJCQlhbnRfcHdyX2RpZmYgJj0gMHhmOworCisJCQlwcml2LT5BbnRlbm5hVHhQd0RpZmZbMl0gPSAwOworCQkJcHJpdi0+QW50ZW5uYVR4UHdEaWZmWzFdID0gKHU4KShhbnRfcHdyX2RpZmYpOworCQkJcHJpdi0+QW50ZW5uYVR4UHdEaWZmWzBdID0gMDsKKworCQkJdTRSZWdWYWx1ZSA9IChwcml2LT5BbnRlbm5hVHhQd0RpZmZbMl08PDggfAorCQkJCSAgICAgIHByaXYtPkFudGVubmFUeFB3RGlmZlsxXTw8NCB8CisJCQkJICAgICAgcHJpdi0+QW50ZW5uYVR4UHdEaWZmWzBdKTsKKworCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9UeEdhaW5TdGFnZSwKKwkJCShiWEJUeEFHQ3xiWENUeEFHQ3xiWERUeEFHQyksIHU0UmVnVmFsdWUpOworCQl9CisJfQorCXN3aXRjaCAocHJpdi0+cmZfY2hpcCkgeworCWNhc2UgUkZfODIyNToKKwkJYnJlYWs7CisJY2FzZSBSRl84MjU2OgorCQlQSFlfU2V0UkY4MjU2Q0NLVHhQb3dlcihkZXYsIHBvd2VybGV2ZWwpOworCQlQSFlfU2V0UkY4MjU2T0ZETVR4UG93ZXIoZGV2LCBwb3dlcmxldmVsT0ZETTI0Ryk7CisJCWJyZWFrOworCWNhc2UgUkZfODI1ODoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJ1bmtub3duIHJmIGNoaXAgaW4gZnVudGlvbiAlcygpXG4iLAorCQkJIF9fZnVuY19fKTsKKwkJYnJlYWs7CisJfQorCXJldHVybjsKK30KKworYm9vbCBydGw4MTkyX3BoeV9SRkNvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlib29sIHJ0U3RhdHVzID0gdHJ1ZTsKKwlzd2l0Y2ggKHByaXYtPnJmX2NoaXApIHsKKwljYXNlIFJGXzgyMjU6CisJCWJyZWFrOworCWNhc2UgUkZfODI1NjoKKwkJcnRTdGF0dXMgPSBQSFlfUkY4MjU2X0NvbmZpZyhkZXYpOworCQlicmVhazsKKworCWNhc2UgUkZfODI1ODoKKwkJYnJlYWs7CisJY2FzZSBSRl9QU0VVRE9fMTFOOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVJUX1RSQUNFKENPTVBfRVJSLCAiZXJyb3IgY2hpcCBpZFxuIik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcnRTdGF0dXM7Cit9CisKK3ZvaWQgcnRsODE5Ml9waHlfdXBkYXRlSW5pdEdhaW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm47Cit9CisKK3U4IHJ0bDgxOTJfcGh5X0NvbmZpZ1JGV2l0aEhlYWRlckZpbGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICBlbnVtIHJmOTBfcmFkaW9fcGF0aCBlUkZQYXRoKQoreworCisJaW50IGk7CisJdTggcmV0ID0gMDsKKworCXN3aXRjaCAoZVJGUGF0aCkgeworCWNhc2UgUkY5MF9QQVRIX0E6CisJCWZvciAoaSA9IDA7IGkgPCBSYWRpb0FfQXJyYXlMZW5ndGg7IGkgKz0gMikgeworCQkJaWYgKFJ0bDgxOVhSYWRpb0FfQXJyYXlbaV0gPT0gMHhmZSkgeworCQkJCW1zbGVlcCgxMDApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCBlUkZQYXRoLAorCQkJCQkgICAgIFJ0bDgxOVhSYWRpb0FfQXJyYXlbaV0sCisJCQkJCSAgICAgYk1hc2sxMkJpdHMsCisJCQkJCSAgICAgUnRsODE5WFJhZGlvQV9BcnJheVtpKzFdKTsKKworCQl9CisJCWJyZWFrOworCWNhc2UgUkY5MF9QQVRIX0I6CisJCWZvciAoaSA9IDA7IGkgPCBSYWRpb0JfQXJyYXlMZW5ndGg7IGkgKz0gMikgeworCQkJaWYgKFJ0bDgxOVhSYWRpb0JfQXJyYXlbaV0gPT0gMHhmZSkgeworCQkJCW1zbGVlcCgxMDApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCBlUkZQYXRoLAorCQkJCQkgICAgIFJ0bDgxOVhSYWRpb0JfQXJyYXlbaV0sCisJCQkJCSAgICAgYk1hc2sxMkJpdHMsCisJCQkJCSAgICAgUnRsODE5WFJhZGlvQl9BcnJheVtpKzFdKTsKKworCQl9CisJCWJyZWFrOworCWNhc2UgUkY5MF9QQVRIX0M6CisJCWZvciAoaSA9IDA7IGkgPCBSYWRpb0NfQXJyYXlMZW5ndGg7IGkgKz0gMikgeworCQkJaWYgKFJ0bDgxOVhSYWRpb0NfQXJyYXlbaV0gPT0gMHhmZSkgeworCQkJCW1zbGVlcCgxMDApOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCBlUkZQYXRoLAorCQkJCQkgICAgIFJ0bDgxOVhSYWRpb0NfQXJyYXlbaV0sCisJCQkJCSAgICAgYk1hc2sxMkJpdHMsCisJCQkJCSAgICAgUnRsODE5WFJhZGlvQ19BcnJheVtpKzFdKTsKKworCQl9CisJCWJyZWFrOworCWNhc2UgUkY5MF9QQVRIX0Q6CisJCWZvciAoaSA9IDA7IGkgPCBSYWRpb0RfQXJyYXlMZW5ndGg7IGkgKz0gMikgeworCQkJaWYgKFJ0bDgxOVhSYWRpb0RfQXJyYXlbaV0gPT0gMHhmZSkgeworCQkJCQltc2xlZXAoMTAwKTsKKwkJCQkJY29udGludWU7CisJCQl9CisJCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIGVSRlBhdGgsCisJCQkJCSBSdGw4MTlYUmFkaW9EX0FycmF5W2ldLCBiTWFzazEyQml0cywKKwkJCQkJIFJ0bDgxOVhSYWRpb0RfQXJyYXlbaSsxXSk7CisKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworCit9CitzdGF0aWMgdm9pZCBydGw4MTkyX1NldFR4UG93ZXJMZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBjaGFubmVsKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwl1OAlwb3dlcmxldmVsID0gcHJpdi0+VHhQb3dlckxldmVsQ0NLW2NoYW5uZWwtMV07CisJdTgJcG93ZXJsZXZlbE9GRE0yNEcgPSBwcml2LT5UeFBvd2VyTGV2ZWxPRkRNMjRHW2NoYW5uZWwtMV07CisKKwlzd2l0Y2ggKHByaXYtPnJmX2NoaXApIHsKKwljYXNlIFJGXzgyMjU6CisJCWJyZWFrOworCisJY2FzZSBSRl84MjU2OgorCQlQSFlfU2V0UkY4MjU2Q0NLVHhQb3dlcihkZXYsIHBvd2VybGV2ZWwpOworCQlQSFlfU2V0UkY4MjU2T0ZETVR4UG93ZXIoZGV2LCBwb3dlcmxldmVsT0ZETTI0Ryk7CisJCWJyZWFrOworCisJY2FzZSBSRl84MjU4OgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlSVF9UUkFDRShDT01QX0VSUiwgInVua25vd24gcmYgY2hpcCBJRCBpbiBydGw4MTkyX1NldFR4UG93ZXIiCisJCQkgIkxldmVsKClcbiIpOworCQlicmVhazsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdTggcnRsODE5Ml9waHlfU2V0U3dDaG5sQ21kQXJyYXkoc3RydWN0IHN3X2NobmxfY21kICpDbWRUYWJsZSwKKwkJCQkJdTMyIENtZFRhYmxlSWR4LCB1MzIgQ21kVGFibGVTeiwKKwkJCQkJZW51bSBzd19jaG5sX2NtZF9pZCBDbWRJRCwKKwkJCQkJdTMyIFBhcmExLCB1MzIgUGFyYTIsIHUzMiBtc0RlbGF5KQoreworCXN0cnVjdCBzd19jaG5sX2NtZCAqcENtZDsKKworCWlmIChDbWRUYWJsZSA9PSBOVUxMKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCAicGh5X1NldFN3Q2hubENtZEFycmF5KCk6IENtZFRhYmxlIGNhbm5vdCAiCisJCQkgImJlIE5VTEwuXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAoQ21kVGFibGVJZHggPj0gQ21kVGFibGVTeikgeworCQlSVF9UUkFDRShDT01QX0VSUiwgInBoeV9TZXRTd0NobmxDbWRBcnJheSgpOiBBY2Nlc3MgaW52YWxpZCIKKwkJCSAiIGluZGV4LCBwbGVhc2UgY2hlY2sgc2l6ZSBvZiB0aGUgdGFibGUsIENtZFRhYmxlSWR4OiIKKwkJCSAiJWQsIENtZFRhYmxlU3o6JWRcbiIsCisJCQkJQ21kVGFibGVJZHgsIENtZFRhYmxlU3opOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcENtZCA9IENtZFRhYmxlICsgQ21kVGFibGVJZHg7CisJcENtZC0+Q21kSUQgPSBDbWRJRDsKKwlwQ21kLT5QYXJhMSA9IFBhcmExOworCXBDbWQtPlBhcmEyID0gUGFyYTI7CisJcENtZC0+bXNEZWxheSA9IG1zRGVsYXk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHU4IHJ0bDgxOTJfcGh5X1N3Q2hubFN0ZXBCeVN0ZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggY2hhbm5lbCwKKwkJCQkgICAgICAgdTggKnN0YWdlLCB1OCAqc3RlcCwgdTMyICpkZWxheSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUgPSBwcml2LT5ydGxsaWI7CisJdTMyCQkJCQlQcmVDb21tb25DbWRDbnQ7CisJdTMyCQkJCQlQb3N0Q29tbW9uQ21kQ250OworCXUzMgkJCQkJUmZEZXBlbmRDbWRDbnQ7CisJc3RydWN0IHN3X2NobmxfY21kICpDdXJyZW50Q21kID0gTlVMTDsKKwl1OAkJZVJGUGF0aDsKKworCVJUX1RSQUNFKENPTVBfVFJBQ0UsICI9PT09PiVzKCk9PT09c3RhZ2U6JWQsIHN0ZXA6JWQsIGNoYW5uZWw6JWRcbiIsCisJCSAgX19mdW5jX18sICpzdGFnZSwgKnN0ZXAsIGNoYW5uZWwpOworCisJaWYgKCFJc0xlZ2FsQ2hhbm5lbChwcml2LT5ydGxsaWIsIGNoYW5uZWwpKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCAiPT09PT09PT09PT09PT5zZXQgdG8gaWxsZWdhbCBjaGFubmVsOiVkXG4iLAorCQkJIGNoYW5uZWwpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwl7CisJCVByZUNvbW1vbkNtZENudCA9IDA7CisJCXJ0bDgxOTJfcGh5X1NldFN3Q2hubENtZEFycmF5KGllZWUtPlByZUNvbW1vbkNtZCwKKwkJCQkJUHJlQ29tbW9uQ21kQ250KyssCisJCQkJCU1BWF9QUkVDTURfQ05ULCBDbWRJRF9TZXRUeFBvd2VyTGV2ZWwsCisJCQkJCTAsIDAsIDApOworCQlydGw4MTkyX3BoeV9TZXRTd0NobmxDbWRBcnJheShpZWVlLT5QcmVDb21tb25DbWQsCisJCQkJCVByZUNvbW1vbkNtZENudCsrLAorCQkJCQlNQVhfUFJFQ01EX0NOVCwgQ21kSURfRW5kLCAwLCAwLCAwKTsKKworCQlQb3N0Q29tbW9uQ21kQ250ID0gMDsKKworCQlydGw4MTkyX3BoeV9TZXRTd0NobmxDbWRBcnJheShpZWVlLT5Qb3N0Q29tbW9uQ21kLAorCQkJCQlQb3N0Q29tbW9uQ21kQ250KyssCisJCQkJCU1BWF9QT1NUQ01EX0NOVCwgQ21kSURfRW5kLCAwLCAwLCAwKTsKKworCQlSZkRlcGVuZENtZENudCA9IDA7CisJCXN3aXRjaCAocHJpdi0+cmZfY2hpcCkgeworCQljYXNlIFJGXzgyMjU6CisJCQlpZiAoIShjaGFubmVsID49IDEgJiYgY2hhbm5lbCA8PSAxNCkpIHsKKwkJCQlSVF9UUkFDRShDT01QX0VSUiwgImlsbGVnYWwgY2hhbm5lbCBmb3IgWmVicmEgIgorCQkJCQkgIjgyMjU6ICVkXG4iLCBjaGFubmVsKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCQlydGw4MTkyX3BoeV9TZXRTd0NobmxDbWRBcnJheShpZWVlLT5SZkRlcGVuZENtZCwKKwkJCQlSZkRlcGVuZENtZENudCsrLCBNQVhfUkZERVBFTkRDTURfQ05ULAorCQkJCUNtZElEX1JGX1dyaXRlUmVnLCByWmVicmExX0NoYW5uZWwsCisJCQkJUkZfQ0hBTk5FTF9UQUJMRV9aRUJSQVtjaGFubmVsXSwgMTApOworCQkJcnRsODE5Ml9waHlfU2V0U3dDaG5sQ21kQXJyYXkoaWVlZS0+UmZEZXBlbmRDbWQsCisJCQkJUmZEZXBlbmRDbWRDbnQrKywgTUFYX1JGREVQRU5EQ01EX0NOVCwKKwkJCQlDbWRJRF9FbmQsIDAsIDAsIDApOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRl84MjU2OgorCQkJaWYgKCEoY2hhbm5lbCA+PSAxICYmIGNoYW5uZWwgPD0gMTQpKSB7CisJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJpbGxlZ2FsIGNoYW5uZWwgZm9yIFplYnJhIgorCQkJCQkgIiA4MjU2OiAlZFxuIiwgY2hhbm5lbCk7CisJCQkJcmV0dXJuIGZhbHNlOworCQkJfQorCQkJcnRsODE5Ml9waHlfU2V0U3dDaG5sQ21kQXJyYXkoaWVlZS0+UmZEZXBlbmRDbWQsCisJCQkJIFJmRGVwZW5kQ21kQ250KyssIE1BWF9SRkRFUEVORENNRF9DTlQsCisJCQkJQ21kSURfUkZfV3JpdGVSZWcsIHJaZWJyYTFfQ2hhbm5lbCwgY2hhbm5lbCwKKwkJCQkgMTApOworCQkJcnRsODE5Ml9waHlfU2V0U3dDaG5sQ21kQXJyYXkoaWVlZS0+UmZEZXBlbmRDbWQsCisKKwkJCQkJCSAgICAgIFJmRGVwZW5kQ21kQ250KyssCisJCQkJCQkgICAgICBNQVhfUkZERVBFTkRDTURfQ05ULAorCQkJQ21kSURfRW5kLCAwLCAwLCAwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUkZfODI1ODoKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlSVF9UUkFDRShDT01QX0VSUiwgIlVua25vd24gUkZDaGlwSUQ6ICVkXG4iLAorCQkJCSBwcml2LT5yZl9jaGlwKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJCWJyZWFrOworCQl9CisKKworCQlkbyB7CisJCQlzd2l0Y2ggKCpzdGFnZSkgeworCQkJY2FzZSAwOgorCQkJCUN1cnJlbnRDbWQgPSAmaWVlZS0+UHJlQ29tbW9uQ21kWypzdGVwXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlDdXJyZW50Q21kID0gJmllZWUtPlJmRGVwZW5kQ21kWypzdGVwXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlDdXJyZW50Q21kID0gJmllZWUtPlBvc3RDb21tb25DbWRbKnN0ZXBdOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoQ3VycmVudENtZCAmJiBDdXJyZW50Q21kLT5DbWRJRCA9PSBDbWRJRF9FbmQpIHsKKwkJCQlpZiAoKCpzdGFnZSkgPT0gMikgeworCQkJCQlyZXR1cm4gdHJ1ZTsKKwkJCQl9IGVsc2UgeworCQkJCQkoKnN0YWdlKSsrOworCQkJCQkoKnN0ZXApID0gMDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCisJCQlpZiAoIUN1cnJlbnRDbWQpCisJCQkJY29udGludWU7CisJCQlzd2l0Y2ggKEN1cnJlbnRDbWQtPkNtZElEKSB7CisJCQljYXNlIENtZElEX1NldFR4UG93ZXJMZXZlbDoKKwkJCQlpZiAocHJpdi0+SUNfQ3V0ID4gKHU4KVZFUlNJT05fODE5MF9CRCkKKwkJCQkJcnRsODE5Ml9TZXRUeFBvd2VyTGV2ZWwoZGV2LCBjaGFubmVsKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ21kSURfV3JpdGVQb3J0VWxvbmc6CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgQ3VycmVudENtZC0+UGFyYTEsCisJCQkJCQlDdXJyZW50Q21kLT5QYXJhMik7CisJCQkJYnJlYWs7CisJCQljYXNlIENtZElEX1dyaXRlUG9ydFVzaG9ydDoKKwkJCQl3cml0ZV9uaWNfd29yZChkZXYsIEN1cnJlbnRDbWQtPlBhcmExLAorCQkJCQkgICAgICAgKHUxNilDdXJyZW50Q21kLT5QYXJhMik7CisJCQkJYnJlYWs7CisJCQljYXNlIENtZElEX1dyaXRlUG9ydFVjaGFyOgorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgQ3VycmVudENtZC0+UGFyYTEsCisJCQkJCSAgICAgICAodTgpQ3VycmVudENtZC0+UGFyYTIpOworCQkJCWJyZWFrOworCQkJY2FzZSBDbWRJRF9SRl9Xcml0ZVJlZzoKKwkJCQlmb3IgKGVSRlBhdGggPSAwOyBlUkZQYXRoIDwKKwkJCQkgICAgIHByaXYtPk51bVRvdGFsUkZQYXRoOyBlUkZQYXRoKyspCisJCQkJCXJ0bDgxOTJfcGh5X1NldFJGUmVnKGRldiwKKwkJCQkJCSAoZW51bSByZjkwX3JhZGlvX3BhdGgpZVJGUGF0aCwKKwkJCQkJCSBDdXJyZW50Q21kLT5QYXJhMSwgYk1hc2sxMkJpdHMsCisJCQkJCQkgQ3VycmVudENtZC0+UGFyYTI8PDcpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0gd2hpbGUgKHRydWUpOworCX0gLypmb3IgKE51bWJlciBvZiBSRiBwYXRocykqLworCisJKCpkZWxheSkgPSBDdXJyZW50Q21kLT5tc0RlbGF5OworCSgqc3RlcCkrKzsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfcGh5X0ZpbmlzaFN3Q2hubE5vdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBjaGFubmVsKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwl1MzIgZGVsYXkgPSAwOworCisJd2hpbGUgKCFydGw4MTkyX3BoeV9Td0NobmxTdGVwQnlTdGVwKGRldiwgY2hhbm5lbCwgJnByaXYtPlN3Q2hubFN0YWdlLAorCSAgICAgICZwcml2LT5Td0NobmxTdGVwLCAmZGVsYXkpKSB7CisJCWlmIChkZWxheSA+IDApCisJCQltc2xlZXAoZGVsYXkpOworCQlpZiAoSVNfTklDX0RPV04ocHJpdikpCisJCQlicmVhazsKKwl9Cit9Cit2b2lkIHJ0bDgxOTJfU3dDaG5sX1dvcmtJdGVtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisKKwlSVF9UUkFDRShDT01QX1RSQUNFLCAiPT0+IFN3Q2hubENhbGxiYWNrODE5eFVzYldvcmtJdGVtKClcbiIpOworCisJUlRfVFJBQ0UoQ09NUF9UUkFDRSwgIj09PT09Pi0tJXMoKSwgc2V0IGNoYW46JWQsIHByaXY6JXBcbiIsIF9fZnVuY19fLAorCQkgcHJpdi0+Y2hhbiwgcHJpdik7CisKKwlydGw4MTkyX3BoeV9GaW5pc2hTd0NobmxOb3coZGV2ICwgcHJpdi0+Y2hhbik7CisKKwlSVF9UUkFDRShDT01QX1RSQUNFLCAiPD09IFN3Q2hubENhbGxiYWNrODE5eFVzYldvcmtJdGVtKClcbiIpOworfQorCit1OCBydGw4MTkyX3BoeV9Td0Nobmwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJUlRfVFJBQ0UoQ09NUF9QSFksICI9PT09PT4lcygpXG4iLCBfX2Z1bmNfXyk7CisJaWYgKElTX05JQ19ET1dOKHByaXYpKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCAiJXMoKTogRVJSICEhIGRyaXZlciBpcyBub3QgdXBcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAocHJpdi0+U3dDaG5sSW5Qcm9ncmVzcykKKwkJcmV0dXJuIGZhbHNlOworCisKKwlzd2l0Y2ggKHByaXYtPnJ0bGxpYi0+bW9kZSkgeworCWNhc2UgV0lSRUxFU1NfTU9ERV9BOgorCWNhc2UgV0lSRUxFU1NfTU9ERV9OXzVHOgorCQlpZiAoY2hhbm5lbCA8PSAxNCkgeworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJXSVJFTEVTU19NT0RFX0EgYnV0IGNoYW5uZWw8PTE0Iik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBXSVJFTEVTU19NT0RFX0I6CisJCWlmIChjaGFubmVsID4gMTQpIHsKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCAiV0lSRUxFU1NfTU9ERV9CIGJ1dCBjaGFubmVsPjE0Iik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBXSVJFTEVTU19NT0RFX0c6CisJY2FzZSBXSVJFTEVTU19NT0RFX05fMjRHOgorCQlpZiAoY2hhbm5lbCA+IDE0KSB7CisJCQlSVF9UUkFDRShDT01QX0VSUiwgIldJUkVMRVNTX01PREVfRyBidXQgY2hhbm5lbD4xNCIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWJyZWFrOworCX0KKworCXByaXYtPlN3Q2hubEluUHJvZ3Jlc3MgPSB0cnVlOworCWlmIChjaGFubmVsID09IDApCisJCWNoYW5uZWwgPSAxOworCisJcHJpdi0+Y2hhbiA9IGNoYW5uZWw7CisKKwlwcml2LT5Td0NobmxTdGFnZSA9IDA7CisJcHJpdi0+U3dDaG5sU3RlcCA9IDA7CisKKwlpZiAoIUlTX05JQ19ET1dOKHByaXYpKQorCQlydGw4MTkyX1N3Q2hubF9Xb3JrSXRlbShkZXYpOworCXByaXYtPlN3Q2hubEluUHJvZ3Jlc3MgPSBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgQ0NLX1R4X1Bvd2VyX1RyYWNrX0JXX1N3aXRjaF9UU1NJKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJc3dpdGNoIChwcml2LT5DdXJyZW50Q2hhbm5lbEJXKSB7CisJY2FzZSBIVF9DSEFOTkVMX1dJRFRIXzIwOgorCQlwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID0KKwkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fMjBNZGVmYXVsdCArCisJCQkgICAgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlOworCisJCWlmIChwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID4KKwkJICAgIChDQ0tUeEJCR2FpblRhYmxlTGVuZ3RoLTEpKQorCQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA9CisJCQkJCSBDQ0tUeEJCR2FpblRhYmxlTGVuZ3RoLTE7CisJCWlmIChwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uIDwgMCkKKwkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPSAwOworCisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICIyME0sIHByaXYtPkNDS1ByZXNlbnQiCisJCQkgIkF0dGVudHVhdGlvbiA9ICVkXG4iLAorCQkJIHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pOworCisJCWlmIChwcml2LT5ydGxsaWItPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID09IDE0ICYmCisJCSAgICAhcHJpdi0+YmNja19pbl9jaDE0KSB7CisJCQlwcml2LT5iY2NrX2luX2NoMTQgPSB0cnVlOworCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldiwgcHJpdi0+YmNja19pbl9jaDE0KTsKKwkJfSBlbHNlIGlmIChwcml2LT5ydGxsaWItPmN1cnJlbnRfbmV0d29yay5jaGFubmVsICE9CisJCQkgICAxNCAmJiBwcml2LT5iY2NrX2luX2NoMTQpIHsKKwkJCXByaXYtPmJjY2tfaW5fY2gxNCA9IGZhbHNlOworCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldiwgcHJpdi0+YmNja19pbl9jaDE0KTsKKwkJfSBlbHNlIHsKKwkJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYsIHByaXYtPmJjY2tfaW5fY2gxNCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjBfNDA6CisJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPQorCQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl80ME1kZWZhdWx0ICsKKwkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZTsKKworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiNDBNLCBwcml2LT5DQ0tQcmVzZW50IgorCQkJICJBdHRlbnR1YXRpb24gPSAlZFxuIiwKKwkJCSBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKTsKKwkJaWYgKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPgorCQkgICAgKENDS1R4QkJHYWluVGFibGVMZW5ndGggLSAxKSkKKwkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPQorCQkJCQkgQ0NLVHhCQkdhaW5UYWJsZUxlbmd0aC0xOworCQlpZiAocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA8IDApCisJCQlwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID0gMDsKKworCQlpZiAocHJpdi0+cnRsbGliLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9PSAxNCAmJgorCQkgICAgIXByaXYtPmJjY2tfaW5fY2gxNCkgeworCQkJcHJpdi0+YmNja19pbl9jaDE0ID0gdHJ1ZTsKKwkJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYsIHByaXYtPmJjY2tfaW5fY2gxNCk7CisJCX0gZWxzZSBpZiAocHJpdi0+cnRsbGliLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCAhPSAxNAorCQkJICAgJiYgcHJpdi0+YmNja19pbl9jaDE0KSB7CisJCQlwcml2LT5iY2NrX2luX2NoMTQgPSBmYWxzZTsKKwkJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYsIHByaXYtPmJjY2tfaW5fY2gxNCk7CisJCX0gZWxzZSB7CisJCQlkbV9jY2tfdHhwb3dlcl9hZGp1c3QoZGV2LCBwcml2LT5iY2NrX2luX2NoMTQpOworCQl9CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgQ0NLX1R4X1Bvd2VyX1RyYWNrX0JXX1N3aXRjaF9UaGVybWFsTWV0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisKKwlpZiAocHJpdi0+cnRsbGliLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9PSAxNCAmJgorCSAgICAhcHJpdi0+YmNja19pbl9jaDE0KQorCQlwcml2LT5iY2NrX2luX2NoMTQgPSB0cnVlOworCWVsc2UgaWYgKHByaXYtPnJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgIT0gMTQgJiYKKwkJIHByaXYtPmJjY2tfaW5fY2gxNCkKKwkJcHJpdi0+YmNja19pbl9jaDE0ID0gZmFsc2U7CisKKwlzd2l0Y2ggKHByaXYtPkN1cnJlbnRDaGFubmVsQlcpIHsKKwljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjA6CisJCWlmIChwcml2LT5SZWNvcmRfQ0NLXzIwTWluZGV4ID09IDApCisJCQlwcml2LT5SZWNvcmRfQ0NLXzIwTWluZGV4ID0gNjsKKwkJcHJpdi0+Q0NLX2luZGV4ID0gcHJpdi0+UmVjb3JkX0NDS18yME1pbmRleDsKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIjIwTUh6LCBDQ0tfVHhfUG93ZXJfVHJhY2tfQldfIgorCQkJICJTd2l0Y2hfVGhlcm1hbE1ldGVyKCksQ0NLX2luZGV4ID0gJWRcbiIsCisJCQkgcHJpdi0+Q0NLX2luZGV4KTsKKwlicmVhazsKKworCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMF80MDoKKwkJcHJpdi0+Q0NLX2luZGV4ID0gcHJpdi0+UmVjb3JkX0NDS180ME1pbmRleDsKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIjQwTUh6LCBDQ0tfVHhfUG93ZXJfVHJhY2tfQldfIgorCQkJICJTd2l0Y2hfVGhlcm1hbE1ldGVyKCksIENDS19pbmRleCA9ICVkXG4iLAorCQkJIHByaXYtPkNDS19pbmRleCk7CisJYnJlYWs7CisJfQorCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYsIHByaXYtPmJjY2tfaW5fY2gxNCk7Cit9CisKK3N0YXRpYyB2b2lkIENDS19UeF9Qb3dlcl9UcmFja19CV19Td2l0Y2goc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisKKwlpZiAocHJpdi0+SUNfQ3V0ID49IElDX1ZlcnNpb25DdXRfRCkKKwkJQ0NLX1R4X1Bvd2VyX1RyYWNrX0JXX1N3aXRjaF9UU1NJKGRldik7CisJZWxzZQorCQlDQ0tfVHhfUG93ZXJfVHJhY2tfQldfU3dpdGNoX1RoZXJtYWxNZXRlcihkZXYpOworfQorCit2b2lkIHJ0bDgxOTJfU2V0QldNb2RlV29ya0l0ZW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwl1OCByZWdCd09wTW9kZTsKKworCVJUX1RSQUNFKENPTVBfU1dCVywgIj09PnJ0bDgxOTJfU2V0QldNb2RlV29ya0l0ZW0oKSAgU3dpdGNoIHRvICVzICIKKwkJICJiYW5kd2lkdGhcbiIsIHByaXYtPkN1cnJlbnRDaGFubmVsQlcgPT0gSFRfQ0hBTk5FTF9XSURUSF8yMCA/CisJCSAiMjBNSHoiIDogIjQwTUh6IikKKworCisJaWYgKHByaXYtPnJmX2NoaXAgPT0gUkZfUFNFVURPXzExTikgeworCQlwcml2LT5TZXRCV01vZGVJblByb2dyZXNzID0gZmFsc2U7CisJCXJldHVybjsKKwl9CisJaWYgKElTX05JQ19ET1dOKHByaXYpKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCAiJXMoKTogRVJSISEgZHJpdmVyIGlzIG5vdCB1cFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCXJlZ0J3T3BNb2RlID0gcmVhZF9uaWNfYnl0ZShkZXYsIEJXX09QTU9ERSk7CisKKwlzd2l0Y2ggKHByaXYtPkN1cnJlbnRDaGFubmVsQlcpIHsKKwljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjA6CisJCXJlZ0J3T3BNb2RlIHw9IEJXX09QTU9ERV8yME1IWjsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBCV19PUE1PREUsIHJlZ0J3T3BNb2RlKTsKKwkJYnJlYWs7CisKKwljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjBfNDA6CisJCXJlZ0J3T3BNb2RlICY9IH5CV19PUE1PREVfMjBNSFo7CisJCXdyaXRlX25pY19ieXRlKGRldiwgQldfT1BNT0RFLCByZWdCd09wTW9kZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJTZXRDaGFubmVsQmFuZHdpZHRoODE5eFVzYigpOiB1bmtub3duICIKKwkJCSAiQmFuZHdpZHRoOiAlI1hcbiIsIHByaXYtPkN1cnJlbnRDaGFubmVsQlcpOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2ggKHByaXYtPkN1cnJlbnRDaGFubmVsQlcpIHsKKwljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjA6CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfUkZNT0QsIGJSRk1PRCwgMHgwKTsKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMV9SRk1PRCwgYlJGTU9ELCAweDApOworCisJCWlmICghcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmcpIHsKKwkJCXdyaXRlX25pY19kd29yZChkZXYsIHJDQ0swX1R4RmlsdGVyMSwgMHgxYTFiMDAwMCk7CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCByQ0NLMF9UeEZpbHRlcjIsIDB4MDkwZTEzMTcpOworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgckNDSzBfRGVidWdQb3J0LCAweDAwMDAwMjA0KTsKKwkJfSBlbHNlIHsKKwkJCUNDS19UeF9Qb3dlcl9UcmFja19CV19Td2l0Y2goZGV2KTsKKwkJfQorCisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMSwgMHgwMDEwMDAwMCwgMSk7CisKKwkJYnJlYWs7CisJY2FzZSBIVF9DSEFOTkVMX1dJRFRIXzIwXzQwOgorCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX1JGTU9ELCBiUkZNT0QsIDB4MSk7CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTFfUkZNT0QsIGJSRk1PRCwgMHgxKTsKKworCQlpZiAoIXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nKSB7CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCByQ0NLMF9UeEZpbHRlcjEsIDB4MzUzNjAwMDApOworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgckNDSzBfVHhGaWx0ZXIyLCAweDEyMWMyNTJlKTsKKwkJCXdyaXRlX25pY19kd29yZChkZXYsIHJDQ0swX0RlYnVnUG9ydCwgMHgwMDAwMDQwOSk7CisJCX0gZWxzZSB7CisJCQlDQ0tfVHhfUG93ZXJfVHJhY2tfQldfU3dpdGNoKGRldik7CisJCX0KKworCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfU3lzdGVtLCBiQ0NLU2lkZUJhbmQsCisJCQkJIChwcml2LT5uQ3VyNDBNaHpQcmltZVNDPj4xKSk7CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTFfTFNURiwgMHhDMDAsCisJCQkJIHByaXYtPm5DdXI0ME1oelByaW1lU0MpOworCisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMSwgMHgwMDEwMDAwMCwgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVJUX1RSQUNFKENPTVBfRVJSLCAiU2V0Q2hhbm5lbEJhbmR3aWR0aDgxOXhVc2IoKTogdW5rbm93biAiCisJCQkgIkJhbmR3aWR0aDogJSNYXG4iLCBwcml2LT5DdXJyZW50Q2hhbm5lbEJXKTsKKwkJYnJlYWs7CisKKwl9CisKKwlzd2l0Y2ggKHByaXYtPnJmX2NoaXApIHsKKwljYXNlIFJGXzgyMjU6CisJCWJyZWFrOworCisJY2FzZSBSRl84MjU2OgorCQlQSFlfU2V0UkY4MjU2QmFuZHdpZHRoKGRldiwgcHJpdi0+Q3VycmVudENoYW5uZWxCVyk7CisJCWJyZWFrOworCisJY2FzZSBSRl84MjU4OgorCQlicmVhazsKKworCWNhc2UgUkZfUFNFVURPXzExTjoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlSVF9UUkFDRShDT01QX0VSUiwgIlVua25vd24gUkZDaGlwSUQ6ICVkXG4iLCBwcml2LT5yZl9jaGlwKTsKKwkJYnJlYWs7CisJfQorCisJYXRvbWljX2RlYygmKHByaXYtPnJ0bGxpYi0+YXRtX3N3YncpKTsKKwlwcml2LT5TZXRCV01vZGVJblByb2dyZXNzID0gZmFsc2U7CisKKwlSVF9UUkFDRShDT01QX1NXQlcsICI8PT1TZXRCV01vZGU4MTl4VXNiKCkiKTsKK30KKwordm9pZCBydGw4MTkyX1NldEJXTW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBlbnVtIGh0X2NoYW5uZWxfd2lkdGggQmFuZHdpZHRoLAorCQkgICAgICAgZW51bSBodF9leHRjaG5sX29mZnNldCBPZmZzZXQpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisKKwlpZiAocHJpdi0+U2V0QldNb2RlSW5Qcm9ncmVzcykKKwkJcmV0dXJuOworCisJYXRvbWljX2luYygmKHByaXYtPnJ0bGxpYi0+YXRtX3N3YncpKTsKKwlwcml2LT5TZXRCV01vZGVJblByb2dyZXNzID0gdHJ1ZTsKKworCXByaXYtPkN1cnJlbnRDaGFubmVsQlcgPSBCYW5kd2lkdGg7CisKKwlpZiAoT2Zmc2V0ID09IEhUX0VYVENITkxfT0ZGU0VUX0xPV0VSKQorCQlwcml2LT5uQ3VyNDBNaHpQcmltZVNDID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX1VQUEVSOworCWVsc2UgaWYgKE9mZnNldCA9PSBIVF9FWFRDSE5MX09GRlNFVF9VUFBFUikKKwkJcHJpdi0+bkN1cjQwTWh6UHJpbWVTQyA9IEhBTF9QUklNRV9DSE5MX09GRlNFVF9MT1dFUjsKKwllbHNlCisJCXByaXYtPm5DdXI0ME1oelByaW1lU0MgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFOworCisJcnRsODE5Ml9TZXRCV01vZGVXb3JrSXRlbShkZXYpOworCit9CisKK3ZvaWQgSW5pdGlhbEdhaW44MTl4UGNpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IE9wZXJhdGlvbikKK3sKKyNkZWZpbmUgU0NBTl9SWF9JTklUSUFMX0dBSU4JMHgxNworI2RlZmluZSBQT1dFUl9ERVRFQ1RJT05fVEgJMHgwOAorCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwl1MzIgQml0TWFzazsKKwl1OCBpbml0aWFsX2dhaW47CisKKwlpZiAoIUlTX05JQ19ET1dOKHByaXYpKSB7CisJCXN3aXRjaCAoT3BlcmF0aW9uKSB7CisJCWNhc2UgSUdfQmFja3VwOgorCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiSUdfQmFja3VwLCBiYWNrdXAgdGhlIGluaXRpYWwiCisJCQkJICIgZ2Fpbi5cbiIpOworCQkJaW5pdGlhbF9nYWluID0gU0NBTl9SWF9JTklUSUFMX0dBSU47CisJCQlCaXRNYXNrID0gYk1hc2tCeXRlMDsKKwkJCWlmIChkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtID09CisJCQkgICAgRElHX0FMR09fQllfRkFMU0VfQUxBUk0pCisJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIFVGV1AsIGJNYXNrQnl0ZTEsIDB4OCk7CisJCQlwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGFhZ2Njb3JlMSA9CisJCQkJICh1OClydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByT0ZETTBfWEFBR0NDb3JlMSwKKwkJCQkgQml0TWFzayk7CisJCQlwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGJhZ2Njb3JlMSA9CisJCQkJICh1OClydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByT0ZETTBfWEJBR0NDb3JlMSwKKwkJCQkgQml0TWFzayk7CisJCQlwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGNhZ2Njb3JlMSA9CisJCQkJICh1OClydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByT0ZETTBfWENBR0NDb3JlMSwKKwkJCQkgQml0TWFzayk7CisJCQlwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGRhZ2Njb3JlMSA9CisJCQkJICh1OClydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByT0ZETTBfWERBR0NDb3JlMSwKKwkJCQkgQml0TWFzayk7CisJCQlCaXRNYXNrID0gYk1hc2tCeXRlMjsKKwkJCXByaXYtPmluaXRnYWluX2JhY2t1cC5jY2EgPSAodTgpcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwKKwkJCQkJCSAgICByQ0NLMF9DQ0EsIEJpdE1hc2spOworCisJCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEluaXRpYWxHYWluQmFja3VwIDB4YzUwIGlzIgorCQkJCSAiICV4XG4iLCBwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGFhZ2Njb3JlMSk7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEluaXRpYWxHYWluQmFja3VwIDB4YzU4IGlzIgorCQkJCSAiICV4XG4iLCBwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGJhZ2Njb3JlMSk7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEluaXRpYWxHYWluQmFja3VwIDB4YzYwIGlzIgorCQkJCSAiICV4XG4iLCBwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGNhZ2Njb3JlMSk7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEluaXRpYWxHYWluQmFja3VwIDB4YzY4IGlzIgorCQkJCSAiICV4XG4iLCBwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGRhZ2Njb3JlMSk7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEluaXRpYWxHYWluQmFja3VwIDB4YTBhIGlzIgorCQkJCSAiICV4XG4iLCBwcml2LT5pbml0Z2Fpbl9iYWNrdXAuY2NhKTsKKworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiV3JpdGUgc2NhbiBpbml0aWFsIGdhaW4gPSAweCV4XG4iLAorCQkJCSBpbml0aWFsX2dhaW4pOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWEFBR0NDb3JlMSwgaW5pdGlhbF9nYWluKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hCQUdDQ29yZTEsIGluaXRpYWxfZ2Fpbik7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQ0FHQ0NvcmUxLCBpbml0aWFsX2dhaW4pOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWERBR0NDb3JlMSwgaW5pdGlhbF9nYWluKTsKKwkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIldyaXRlIHNjYW4gMHhhMGEgPSAweCV4XG4iLAorCQkJCSBQT1dFUl9ERVRFQ1RJT05fVEgpOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweGEwYSwgUE9XRVJfREVURUNUSU9OX1RIKTsKKwkJCWJyZWFrOworCQljYXNlIElHX1Jlc3RvcmU6CisJCQlSVF9UUkFDRShDT01QX1NDQU4sICJJR19SZXN0b3JlLCByZXN0b3JlIHRoZSBpbml0aWFsICIKKwkJCQkgImdhaW4uXG4iKTsKKwkJCUJpdE1hc2sgPSAweDdmOworCQkJaWYgKGRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG0gPT0KKwkJCSAgICBESUdfQUxHT19CWV9GQUxTRV9BTEFSTSkKKwkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgVUZXUCwgYk1hc2tCeXRlMSwgMHg4KTsKKworCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQUFHQ0NvcmUxLCBCaXRNYXNrLAorCQkJCQkgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGFhZ2Njb3JlMSk7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hCQUdDQ29yZTEsIEJpdE1hc2ssCisJCQkJCSAodTMyKXByaXYtPmluaXRnYWluX2JhY2t1cC54YmFnY2NvcmUxKTsKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWENBR0NDb3JlMSwgQml0TWFzaywKKwkJCQkJICh1MzIpcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhjYWdjY29yZTEpOworCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YREFHQ0NvcmUxLCBCaXRNYXNrLAorCQkJCQkgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGRhZ2Njb3JlMSk7CisJCQlCaXRNYXNrICA9IGJNYXNrQnl0ZTI7CisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfQ0NBLCBCaXRNYXNrLAorCQkJCQkgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAuY2NhKTsKKworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBCQkluaXRpYWxHYWluUmVzdG9yZSAweGM1MCIKKwkJCQkgIiBpcyAleFxuIiwgcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhhYWdjY29yZTEpOworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBCQkluaXRpYWxHYWluUmVzdG9yZSAweGM1OCIKKwkJCQkgIiBpcyAleFxuIiwgcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhiYWdjY29yZTEpOworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBCQkluaXRpYWxHYWluUmVzdG9yZSAweGM2MCIKKwkJCQkgIiBpcyAleFxuIiwgcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhjYWdjY29yZTEpOworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBCQkluaXRpYWxHYWluUmVzdG9yZSAweGM2OCIKKwkJCQkgIiBpcyAleFxuIiwgcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhkYWdjY29yZTEpOworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBCQkluaXRpYWxHYWluUmVzdG9yZSAweGEwYSIKKwkJCQkgIiBpcyAleFxuIiwgcHJpdi0+aW5pdGdhaW5fYmFja3VwLmNjYSk7CisKKwkJCXJ0bDgxOTJfcGh5X3NldFR4UG93ZXIoZGV2LAorCQkJCQkgcHJpdi0+cnRsbGliLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisKKwkJCWlmIChkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtID09CisJCQkgICAgRElHX0FMR09fQllfRkFMU0VfQUxBUk0pCisJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIFVGV1AsIGJNYXNrQnl0ZTEsIDB4MSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIlVua25vd24gSUcgT3BlcmF0aW9uLlxuIik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKwordm9pZCBQSFlfU2V0UnRsODE5MmVSZk9mZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FLCBCSVQ0LCAweDApOworCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyNCwgMHgzMDAsIDB4MCk7CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIxLCAweDE4LCAweDApOworCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfVFJ4UGF0aEVuYWJsZSwgMHhmLCAweDApOworCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTFfVFJ4UGF0aEVuYWJsZSwgMHhmLCAweDApOworCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMSwgMHg2MCwgMHgwKTsKKwlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjEsIDB4NCwgMHgwKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEFOQVBBUl9GT1JfODE5MlBjaUUsIDB4MDcpOworCit9CisKK3N0YXRpYyBib29sIFNldFJGUG93ZXJTdGF0ZTgxOTAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQllbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIGVSRlBvd2VyU3RhdGUpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXN0cnVjdCBydF9wd3Jfc2F2ZV9jdHJsICpwUFNDID0gKHN0cnVjdCBydF9wd3Jfc2F2ZV9jdHJsICopCisJCQkJCSgmKHByaXYtPnJ0bGxpYi0+UG93ZXJTYXZlQ29udHJvbCkpOworCWJvb2wgYlJlc3VsdCA9IHRydWU7CisJdTgJaSA9IDAsIFF1ZXVlSUQgPSAwOworCXN0cnVjdCBydGw4MTkyX3R4X3JpbmcgICpyaW5nID0gTlVMTDsKKworCWlmIChwcml2LT5TZXRSRlBvd2VyU3RhdGVJblByb2dyZXNzID09IHRydWUpCisJCXJldHVybiBmYWxzZTsKKwlSVF9UUkFDRShDT01QX1BTLCAiPT09PT09PT09PT0+IFNldFJGUG93ZXJTdGF0ZTgxOTAoKSFcbiIpOworCXByaXYtPlNldFJGUG93ZXJTdGF0ZUluUHJvZ3Jlc3MgPSB0cnVlOworCisJc3dpdGNoIChwcml2LT5yZl9jaGlwKSB7CisJY2FzZSBSRl84MjU2OgorCQlzd2l0Y2ggKGVSRlBvd2VyU3RhdGUpIHsKKwkJY2FzZSBlUmZPbjoKKwkJCVJUX1RSQUNFKENPTVBfUFMsICJTZXRSRlBvd2VyU3RhdGU4MTkwKCkgZVJmT24hXG4iKTsKKwkJCWlmICgocHJpdi0+cnRsbGliLT5lUkZQb3dlclN0YXRlID09IGVSZk9mZikgJiYKKwkJCSAgICAgUlRfSU5fUFNfTEVWRUwocFBTQywgUlRfUkZfT0ZGX0xFVkxfSEFMVF9OSUMpKSB7CisJCQkJYm9vbCBydHN0YXR1cyA9IHRydWU7CisJCQkJdTMyIEluaXRpbGl6ZUNvdW50ID0gMzsKKwkJCQlkbyB7CisJCQkJCUluaXRpbGl6ZUNvdW50LS07CisJCQkJCXByaXYtPlJlZ1JmT2ZmID0gZmFsc2U7CisJCQkJCXJ0c3RhdHVzID0gTmljSUZFbmFibGVOSUMoZGV2KTsKKwkJCQl9IHdoaWxlICgocnRzdGF0dXMgIT0gdHJ1ZSkgJiYKKwkJCQkJIChJbml0aWxpemVDb3VudCA+IDApKTsKKworCQkJCWlmIChydHN0YXR1cyAhPSB0cnVlKSB7CisJCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiJXMoKTpJbml0aWFsaXplIEFkYSIKKwkJCQkJCSAicHRlciBmYWlsLHJldHVyblxuIiwKKwkJCQkJCSBfX2Z1bmNfXyk7CisJCQkJCXByaXYtPlNldFJGUG93ZXJTdGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKworCQkJCVJUX0NMRUFSX1BTX0xFVkVMKHBQU0MsCisJCQkJCQkgIFJUX1JGX09GRl9MRVZMX0hBTFRfTklDKTsKKwkJCX0gZWxzZSB7CisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBBTkFQQVIsIDB4MzcpOworCQkJCW1kZWxheSgxKTsKKwkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjEsCisJCQkJCQkgMHg0LCAweDEpOworCQkJCXByaXYtPmJId1JmT2ZmQWN0aW9uID0gMDsKKworCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRSwKKwkJCQkJCSBCSVQ0LCAweDEpOworCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyNCwKKwkJCQkJCSAweDMwMCwgMHgzKTsKKwkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjEsCisJCQkJCQkgMHgxOCwgMHgzKTsKKwkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1RSeFBhdGhFbmFibGUsIDB4MywKKwkJCQkJCSAweDMpOworCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTFfVFJ4UGF0aEVuYWJsZSwgMHgzLAorCQkJCQkJIDB4Myk7CisJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIxLAorCQkJCQkJIDB4NjAsIDB4Myk7CisKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBlUmZTbGVlcDoKKwkJCWlmIChwcml2LT5ydGxsaWItPmVSRlBvd2VyU3RhdGUgPT0gZVJmT2ZmKQorCQkJCWJyZWFrOworCisKKwkJCWZvciAoUXVldWVJRCA9IDAsIGkgPSAwOyBRdWV1ZUlEIDwgTUFYX1RYX1FVRVVFOyApIHsKKwkJCQlyaW5nID0gJnByaXYtPnR4X3JpbmdbUXVldWVJRF07CisKKwkJCQlpZiAoc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpID09IDApIHsKKwkJCQkJUXVldWVJRCsrOworCQkJCQljb250aW51ZTsKKwkJCQl9IGVsc2UgeworCQkJCQlSVF9UUkFDRSgoQ09NUF9QT1dFUnxDT01QX1JGKSwgImVSZiBPZmYiCisJCQkJCQkgIi9TbGVlcDogJWQgdGltZXMgVGNiQnVzeVF1ZXVlIgorCQkJCQkJICJbJWRdICE9MCBiZWZvcmUgZG96ZSFcbiIsCisJCQkJCQkgKGkrMSksIFF1ZXVlSUQpOworCQkJCQl1ZGVsYXkoMTApOworCQkJCQlpKys7CisJCQkJfQorCisJCQkJaWYgKGkgPj0gTUFYX0RPWkVfV0FJVElOR19USU1FU185eCkgeworCQkJCQlSVF9UUkFDRShDT01QX1BPV0VSLCAiXG5cblxuIFRpbWVPdXQhISAiCisJCQkJCQkgIlNldFJGUG93ZXJTdGF0ZTgxOTAoKTogZVJmT2ZmIgorCQkJCQkJICI6ICVkIHRpbWVzIFRjYkJ1c3lRdWV1ZVslZF0gIgorCQkJCQkJICIhPSAwICEhIVxuIiwKKwkJCQkJCSBNQVhfRE9aRV9XQUlUSU5HX1RJTUVTXzl4LAorCQkJCQkJIFF1ZXVlSUQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlQSFlfU2V0UnRsODE5MmVSZk9mZihkZXYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBlUmZPZmY6CisJCQlSVF9UUkFDRShDT01QX1BTLCAiU2V0UkZQb3dlclN0YXRlODE5MCgpIGVSZk9mZi8iCisJCQkJICJTbGVlcCAhXG4iKTsKKworCQkJZm9yIChRdWV1ZUlEID0gMCwgaSA9IDA7IFF1ZXVlSUQgPCBNQVhfVFhfUVVFVUU7ICkgeworCQkJCXJpbmcgPSAmcHJpdi0+dHhfcmluZ1tRdWV1ZUlEXTsKKworCQkJCWlmIChza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSkgPT0gMCkgeworCQkJCQlRdWV1ZUlEKys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0gZWxzZSB7CisJCQkJCVJUX1RSQUNFKENPTVBfUE9XRVIsICJlUmYgT2ZmL1NsZWVwOiAlZCIKKwkJCQkJCSAiIHRpbWVzIFRjYkJ1c3lRdWV1ZVslZF0gIT0wIGIiCisJCQkJCQkgImVmb3JlIGRvemUhXG4iLCAoaSsxKSwKKwkJCQkJCSBRdWV1ZUlEKTsKKwkJCQkJdWRlbGF5KDEwKTsKKwkJCQkJaSsrOworCQkJCX0KKworCQkJCWlmIChpID49IE1BWF9ET1pFX1dBSVRJTkdfVElNRVNfOXgpIHsKKwkJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUiwgIlxuXG5cbiBTZXRaZWJyYTogIgorCQkJCQkJICJSRlBvd2VyU3RhdGU4MTg1QigpOiBlUmZPZmY6IgorCQkJCQkJICIgJWQgdGltZXMgVGNiQnVzeVF1ZXVlWyVkXSAiCisJCQkJCQkgIiE9IDAgISEhXG4iLAorCQkJCQkJIE1BWF9ET1pFX1dBSVRJTkdfVElNRVNfOXgsCisJCQkJCQkgUXVldWVJRCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHBQU0MtPlJlZ1JmUHNMZXZlbCAmIFJUX1JGX09GRl9MRVZMX0hBTFRfTklDICYmCisJCQkgICAgIVJUX0lOX1BTX0xFVkVMKHBQU0MsIFJUX1JGX09GRl9MRVZMX0hBTFRfTklDKSkgeworCQkJCU5pY0lGRGlzYWJsZU5JQyhkZXYpOworCQkJCVJUX1NFVF9QU19MRVZFTChwUFNDLCBSVF9SRl9PRkZfTEVWTF9IQUxUX05JQyk7CisJCQl9IGVsc2UgaWYgKCEocFBTQy0+UmVnUmZQc0xldmVsICYKKwkJCQkgICBSVF9SRl9PRkZfTEVWTF9IQUxUX05JQykpIHsKKwkJCQlQSFlfU2V0UnRsODE5MmVSZk9mZihkZXYpOworCQkJfQorCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYlJlc3VsdCA9IGZhbHNlOworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJTZXRSRlBvd2VyU3RhdGU4MTkwKCk6IHVua25vdyBzdGF0ZSIKKwkJCQkgIiB0byBzZXQ6IDB4JVghISFcbiIsIGVSRlBvd2VyU3RhdGUpOworCQkJYnJlYWs7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVJUX1RSQUNFKENPTVBfRVJSLCAiU2V0UkZQb3dlclN0YXRlODE5MCgpOiBVbmtub3duIFJGIHR5cGVcbiIpOworCQlicmVhazsKKwl9CisKKwlpZiAoYlJlc3VsdCkgeworCQlwcml2LT5ydGxsaWItPmVSRlBvd2VyU3RhdGUgPSBlUkZQb3dlclN0YXRlOworCisJCXN3aXRjaCAocHJpdi0+cmZfY2hpcCkgeworCQljYXNlIFJGXzgyNTY6CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJTZXRSRlBvd2VyU3RhdGU4MTkwKCk6IFVua25vd24gIgorCQkJCSAiUkYgdHlwZVxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKworCXByaXYtPlNldFJGUG93ZXJTdGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTsKKwlSVF9UUkFDRShDT01QX1BTLCAiPD09PT09PT09PT09IFNldFJGUG93ZXJTdGF0ZTgxOTAoKSBiUmVzdWx0ID0gJWQhXG4iLAorCQkgYlJlc3VsdCk7CisJcmV0dXJuIGJSZXN1bHQ7Cit9CisKK2Jvb2wgU2V0UkZQb3dlclN0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgZW51bSBydF9yZl9wb3dlcl9zdGF0ZSBlUkZQb3dlclN0YXRlKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCWJvb2wgYlJlc3VsdCA9IGZhbHNlOworCisJUlRfVFJBQ0UoQ09NUF9QUywgIi0tLS0tLS0tLT4gU2V0UkZQb3dlclN0YXRlKCk6IGVSRlBvd2VyU3RhdGUoJWQpXG4iLAorCQkgZVJGUG93ZXJTdGF0ZSk7CisJaWYgKGVSRlBvd2VyU3RhdGUgPT0gcHJpdi0+cnRsbGliLT5lUkZQb3dlclN0YXRlICYmCisJICAgIHByaXYtPmJId1JmT2ZmQWN0aW9uID09IDApIHsKKwkJUlRfVFJBQ0UoQ09NUF9QUywgIjwtLS0tLS0tLS0gU2V0UkZQb3dlclN0YXRlKCk6IGRpc2NhcmQgdGhlICIKKwkJCSAicmVxdWVzdCBmb3IgZVJGUG93ZXJTdGF0ZSglZCkgaXMgdGhlIHNhbWUuXG4iLAorCQkJIGVSRlBvd2VyU3RhdGUpOworCQlyZXR1cm4gYlJlc3VsdDsKKwl9CisKKwliUmVzdWx0ID0gU2V0UkZQb3dlclN0YXRlODE5MChkZXYsIGVSRlBvd2VyU3RhdGUpOworCisJUlRfVFJBQ0UoQ09NUF9QUywgIjwtLS0tLS0tLS0gU2V0UkZQb3dlclN0YXRlKCk6IGJSZXN1bHQoJWQpXG4iLAorCQkgYlJlc3VsdCk7CisKKwlyZXR1cm4gYlJlc3VsdDsKK30KKwordm9pZCBQSFlfU2Nhbk9wZXJhdGlvbkJhY2t1cDgxOTIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggT3BlcmF0aW9uKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCWlmIChwcml2LT51cCkgeworCQlzd2l0Y2ggKE9wZXJhdGlvbikgeworCQljYXNlIFNDQU5fT1BUX0JBQ0tVUDoKKwkJCXByaXYtPnJ0bGxpYi0+SW5pdGlhbEdhaW5IYW5kbGVyKGRldiwgSUdfQmFja3VwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0NBTl9PUFRfUkVTVE9SRToKKwkJCXByaXYtPnJ0bGxpYi0+SW5pdGlhbEdhaW5IYW5kbGVyKGRldiwgSUdfUmVzdG9yZSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiVW5rbm93biBTY2FuIEJhY2t1cCBPcGVyYXRpb24uXG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX3BoeS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9waHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzE4Zjg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV9waHkuaApAQCAtMCwwICsxLDEyMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX1I4MTlYVV9QSFlfSAorI2RlZmluZSBfUjgxOVhVX1BIWV9ICisKKyNkZWZpbmUgTUFYX0RPWkVfV0FJVElOR19USU1FU185eCA2NAorCisjZGVmaW5lIEFHQ1RBQl9BcnJheUxlbmd0aAkJCUFHQ1RBQl9BcnJheUxlbmd0aFBjaUUKKyNkZWZpbmUgTUFDUEhZX0FycmF5TGVuZ3RoCQkJTUFDUEhZX0FycmF5TGVuZ3RoUGNpRQorI2RlZmluZSBSYWRpb0FfQXJyYXlMZW5ndGgJCQlSYWRpb0FfQXJyYXlMZW5ndGhQY2lFCisjZGVmaW5lIFJhZGlvQl9BcnJheUxlbmd0aAkJCVJhZGlvQl9BcnJheUxlbmd0aFBjaUUKKyNkZWZpbmUgTUFDUEhZX0FycmF5X1BHTGVuZ3RoCQkJTUFDUEhZX0FycmF5X1BHTGVuZ3RoUGNpRQorI2RlZmluZSBSYWRpb0NfQXJyYXlMZW5ndGgJCQlSYWRpb0NfQXJyYXlMZW5ndGhQY2lFCisjZGVmaW5lIFJhZGlvRF9BcnJheUxlbmd0aAkJCVJhZGlvRF9BcnJheUxlbmd0aFBjaUUKKyNkZWZpbmUgUEhZX1JFR0FycmF5TGVuZ3RoCQkJUEhZX1JFR0FycmF5TGVuZ3RoUGNpRQorI2RlZmluZSBQSFlfUkVHXzFUMlJBcnJheUxlbmd0aAkJCVBIWV9SRUdfMVQyUkFycmF5TGVuZ3RoUGNpRQorCisjZGVmaW5lIFJ0bDgxOVhNQUNQSFlfQXJyYXlfUEcJCQlSdGw4MTkyUGNpRU1BQ1BIWV9BcnJheV9QRworI2RlZmluZSBSdGw4MTlYTUFDUEhZX0FycmF5CQkJUnRsODE5MlBjaUVNQUNQSFlfQXJyYXkKKyNkZWZpbmUgUnRsODE5WFJhZGlvQV9BcnJheQkJCVJ0bDgxOTJQY2lFUmFkaW9BX0FycmF5CisjZGVmaW5lIFJ0bDgxOVhSYWRpb0JfQXJyYXkJCQlSdGw4MTkyUGNpRVJhZGlvQl9BcnJheQorI2RlZmluZSBSdGw4MTlYUmFkaW9DX0FycmF5CQkJUnRsODE5MlBjaUVSYWRpb0NfQXJyYXkKKyNkZWZpbmUgUnRsODE5WFJhZGlvRF9BcnJheQkJCVJ0bDgxOTJQY2lFUmFkaW9EX0FycmF5CisjZGVmaW5lIFJ0bDgxOVhBR0NUQUJfQXJyYXkJCQlSdGw4MTkyUGNpRUFHQ1RBQl9BcnJheQorI2RlZmluZSBSdGw4MTlYUEhZX1JFR0FycmF5CQkJUnRsODE5MlBjaUVQSFlfUkVHQXJyYXkKKyNkZWZpbmUgUnRsODE5WFBIWV9SRUdfMVQyUkFycmF5CQlSdGw4MTkyUGNpRVBIWV9SRUdfMVQyUkFycmF5CisKK2V4dGVybiB1MzIgcnRsODE5WE1BQ1BIWV9BcnJheV9QR1tdOworZXh0ZXJuIHUzMiBydGw4MTlYUEhZX1JFR18xVDJSQXJyYXlbXTsKK2V4dGVybiB1MzIgcnRsODE5WEFHQ1RBQl9BcnJheVtdOworZXh0ZXJuIHUzMiBydGw4MTlYUmFkaW9BX0FycmF5W107CitleHRlcm4gdTMyIHJ0bDgxOVhSYWRpb0JfQXJyYXlbXTsKK2V4dGVybiB1MzIgcnRsODE5WFJhZGlvQ19BcnJheVtdOworZXh0ZXJuIHUzMiBydGw4MTlYUmFkaW9EX0FycmF5W107CisKK2VudW0gaHc5MF9ibG9jayB7CisJSFc5MF9CTE9DS19NQUMgPSAwLAorCUhXOTBfQkxPQ0tfUEhZMCA9IDEsCisJSFc5MF9CTE9DS19QSFkxID0gMiwKKwlIVzkwX0JMT0NLX1JGID0gMywKKwlIVzkwX0JMT0NLX01BWElNVU0gPSA0LAorfTsKKworZW51bSByZjkwX3JhZGlvX3BhdGggeworCVJGOTBfUEFUSF9BID0gMCwKKwlSRjkwX1BBVEhfQiA9IDEsCisJUkY5MF9QQVRIX0MgPSAyLAorCVJGOTBfUEFUSF9EID0gMywKKwlSRjkwX1BBVEhfTUFYCit9OworCisjZGVmaW5lIGJNYXNrQnl0ZTAgICAgICAgICAgICAgICAgMHhmZgorI2RlZmluZSBiTWFza0J5dGUxICAgICAgICAgICAgICAgIDB4ZmYwMAorI2RlZmluZSBiTWFza0J5dGUyICAgICAgICAgICAgICAgIDB4ZmYwMDAwCisjZGVmaW5lIGJNYXNrQnl0ZTMgICAgICAgICAgICAgICAgMHhmZjAwMDAwMAorI2RlZmluZSBiTWFza0hXb3JkICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKKyNkZWZpbmUgYk1hc2tMV29yZCAgICAgICAgICAgICAgICAweDAwMDBmZmZmCisjZGVmaW5lIGJNYXNrRFdvcmQgICAgICAgICAgICAgICAgMHhmZmZmZmZmZgorCitleHRlcm4gdTggcnRsODE5Ml9waHlfQ2hlY2tJc0xlZ2FsUkZQYXRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSB1MzIgZVJGUGF0aCk7CitleHRlcm4gdm9pZCBydGw4MTkyX3NldEJCcmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkd1JlZ0FkZHIsCisJCQkgICAgIHUzMiBkd0JpdE1hc2ssIHUzMiBkd0RhdGEpOworZXh0ZXJuIHUzMiBydGw4MTkyX1F1ZXJ5QkJSZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGR3UmVnQWRkciwKKwkJCSAgICAgIHUzMiBkd0JpdE1hc2spOworZXh0ZXJuIHZvaWQgcnRsODE5Ml9waHlfU2V0UkZSZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgZW51bSByZjkwX3JhZGlvX3BhdGggZVJGUGF0aCwKKwkJCQkgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrLCB1MzIgRGF0YSk7CitleHRlcm4gdTMyIHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIGVudW0gcmY5MF9yYWRpb19wYXRoIGVSRlBhdGgsCisJCQkJICB1MzIgUmVnQWRkciwgdTMyIEJpdE1hc2spOworZXh0ZXJuIHZvaWQgcnRsODE5Ml9waHlfY29uZmlnbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgcnRsODE5Ml9waHlDb25maWdCQihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBDb25maWdUeXBlKTsKK2V4dGVybiBib29sIHJ0bDgxOTJfcGh5X2NoZWNrQkJBbmRSRihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgZW51bSBodzkwX2Jsb2NrIENoZWNrQmxvY2ssCisJCQkJICAgICBlbnVtIHJmOTBfcmFkaW9fcGF0aCBlUkZQYXRoKTsKK2V4dGVybiBib29sIHJ0bDgxOTJfQkJDb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBydGw4MTkyX3BoeV9nZXRUeFBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgcnRsODE5Ml9waHlfc2V0VHhQb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBjaGFubmVsKTsKK2V4dGVybiBib29sIHJ0bDgxOTJfcGh5X1JGQ29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgcnRsODE5Ml9waHlfdXBkYXRlSW5pdEdhaW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gdTggcnRsODE5Ml9waHlfQ29uZmlnUkZXaXRoSGVhZGVyRmlsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICAgIGVudW0gcmY5MF9yYWRpb19wYXRoIGVSRlBhdGgpOworCitleHRlcm4gdTggcnRsODE5Ml9waHlfU3dDaG5sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGNoYW5uZWwpOworZXh0ZXJuIHZvaWQgcnRsODE5Ml9TZXRCV01vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIGVudW0gaHRfY2hhbm5lbF93aWR0aCBCYW5kd2lkdGgsCisJCQkgICAgICBlbnVtIGh0X2V4dGNobmxfb2Zmc2V0IE9mZnNldCk7CitleHRlcm4gdm9pZCBydGw4MTkyX1N3Q2hubF9Xb3JrSXRlbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiB2b2lkIHJ0bDgxOTJfU2V0QldNb2RlV29ya0l0ZW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBJbml0aWFsR2FpbjgxOXhQY2koc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggT3BlcmF0aW9uKTsKKworZXh0ZXJuCXZvaWQgUEhZX1NldFJ0bDgxOTJlUmZPZmYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK2Jvb2wKK1NldFJGUG93ZXJTdGF0ZSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCWVudW0gcnRfcmZfcG93ZXJfc3RhdGUgZVJGUG93ZXJTdGF0ZQorCSk7CisjZGVmaW5lIFBIWV9TZXRSRlBvd2VyU3RhdGUgU2V0UkZQb3dlclN0YXRlCisKK2V4dGVybiB2b2lkIFBIWV9TY2FuT3BlcmF0aW9uQmFja3VwODE5MihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBPcGVyYXRpb24pOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfcGh5cmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX3BoeXJlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OTlkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX3BoeXJlZy5oCkBAIC0wLDAgKzEsODUyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfUjgxOVhVX1BIWVJFR19ICisjZGVmaW5lIF9SODE5WFVfUEhZUkVHX0gKKworCisjZGVmaW5lICAgUkZfREFUQQkJCQkweDFkNAorCisjZGVmaW5lIHJQTUFDX1Jlc2V0CQkJCTB4MTAwCisjZGVmaW5lIHJQTUFDX1R4U3RhcnQJCQkJMHgxMDQKKyNkZWZpbmUgclBNQUNfVHhMZWdhY3lTSUcJCQkweDEwOAorI2RlZmluZSByUE1BQ19UeEhUU0lHMQkJCQkweDEwYworI2RlZmluZSByUE1BQ19UeEhUU0lHMgkJCQkweDExMAorI2RlZmluZSByUE1BQ19QSFlEZWJ1ZwkJCQkweDExNAorI2RlZmluZSByUE1BQ19UeFBhY2tldE51bQkJCTB4MTE4CisjZGVmaW5lIHJQTUFDX1R4SWRsZQkJCQkweDExYworI2RlZmluZSByUE1BQ19UeE1BQ0hlYWRlcjAJCTB4MTIwCisjZGVmaW5lIHJQTUFDX1R4TUFDSGVhZGVyMQkJMHgxMjQKKyNkZWZpbmUgclBNQUNfVHhNQUNIZWFkZXIyCQkweDEyOAorI2RlZmluZSByUE1BQ19UeE1BQ0hlYWRlcjMJCTB4MTJjCisjZGVmaW5lIHJQTUFDX1R4TUFDSGVhZGVyNAkJMHgxMzAKKyNkZWZpbmUgclBNQUNfVHhNQUNIZWFkZXI1CQkweDEzNAorI2RlZmluZSByUE1BQ19UeERhdGFUeXBlCQkJMHgxMzgKKyNkZWZpbmUgclBNQUNfVHhSYW5kb21TZWVkCQkJMHgxM2MKKyNkZWZpbmUgclBNQUNfQ0NLUExDUFByZWFtYmxlCQkweDE0MAorI2RlZmluZSByUE1BQ19DQ0tQTENQSGVhZGVyCQkJMHgxNDQKKyNkZWZpbmUgclBNQUNfQ0NLQ1JDMTYJCQkJMHgxNDgKKyNkZWZpbmUgclBNQUNfT0ZETVJ4Q1JDMzJPSwkJMHgxNzAKKyNkZWZpbmUgclBNQUNfT0ZETVJ4Q1JDMzJFcgkJMHgxNzQKKyNkZWZpbmUgclBNQUNfT0ZETVJ4UGFyaXR5RXIJCQkweDE3OAorI2RlZmluZSByUE1BQ19PRkRNUnhDUkM4RXIJCTB4MTdjCisjZGVmaW5lIHJQTUFDX0NDS0NSeFJDMTZFcgkJCTB4MTgwCisjZGVmaW5lIHJQTUFDX0NDS0NSeFJDMzJFcgkJCTB4MTg0CisjZGVmaW5lIHJQTUFDX0NDS0NSeFJDMzJPSwkJCTB4MTg4CisjZGVmaW5lIHJQTUFDX1R4U3RhdHVzCQkJCTB4MThjCisKKyNkZWZpbmUJTUNTX1RYQUdDCQkJCTB4MzQwCisjZGVmaW5lCUNDS19UWEFHQwkJCQkweDM0OAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLTB4NDAwfjB4NGZmLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCU1hY0Jsa0N0cmwJCQkJMHg0MDMKKworI2RlZmluZSByRlBHQTBfUkZNT0QJCQkJMHg4MDAKKyNkZWZpbmUgckZQR0EwX1R4SW5mbwkJCQkweDgwNAorI2RlZmluZSByRlBHQTBfUFNERnVuY3Rpb24JCQkweDgwOAorI2RlZmluZSByRlBHQTBfVHhHYWluU3RhZ2UJCQkweDgwYworI2RlZmluZSByRlBHQTBfUkZUaW1pbmcxCQkJMHg4MTAKKyNkZWZpbmUgckZQR0EwX1JGVGltaW5nMgkJCTB4ODE0CisjZGVmaW5lIHJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMQkweDgyMAorI2RlZmluZSByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjIJMHg4MjQKKyNkZWZpbmUgckZQR0EwX1hCX0hTU0lQYXJhbWV0ZXIxCTB4ODI4CisjZGVmaW5lIHJGUEdBMF9YQl9IU1NJUGFyYW1ldGVyMgkweDgyYworI2RlZmluZSByRlBHQTBfWENfSFNTSVBhcmFtZXRlcjEJMHg4MzAKKyNkZWZpbmUgckZQR0EwX1hDX0hTU0lQYXJhbWV0ZXIyCTB4ODM0CisjZGVmaW5lIHJGUEdBMF9YRF9IU1NJUGFyYW1ldGVyMQkweDgzOAorI2RlZmluZSByRlBHQTBfWERfSFNTSVBhcmFtZXRlcjIJMHg4M2MKKyNkZWZpbmUgckZQR0EwX1hBX0xTU0lQYXJhbWV0ZXIJCTB4ODQwCisjZGVmaW5lIHJGUEdBMF9YQl9MU1NJUGFyYW1ldGVyCQkweDg0NAorI2RlZmluZSByRlBHQTBfWENfTFNTSVBhcmFtZXRlcgkJMHg4NDgKKyNkZWZpbmUgckZQR0EwX1hEX0xTU0lQYXJhbWV0ZXIJCTB4ODRjCisjZGVmaW5lIHJGUEdBMF9SRldha2VVcFBhcmFtZXRlcgkweDg1MAorI2RlZmluZSByRlBHQTBfUkZTbGVlcFVwUGFyYW1ldGVyCTB4ODU0CisjZGVmaW5lIHJGUEdBMF9YQUJfU3dpdGNoQ29udHJvbAkweDg1OAorI2RlZmluZSByRlBHQTBfWENEX1N3aXRjaENvbnRyb2wJMHg4NWMKKyNkZWZpbmUgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UJCTB4ODYwCisjZGVmaW5lIHJGUEdBMF9YQl9SRkludGVyZmFjZU9FCQkweDg2NAorI2RlZmluZSByRlBHQTBfWENfUkZJbnRlcmZhY2VPRQkJMHg4NjgKKyNkZWZpbmUgckZQR0EwX1hEX1JGSW50ZXJmYWNlT0UJCTB4ODZjCisjZGVmaW5lIHJGUEdBMF9YQUJfUkZJbnRlcmZhY2VTVwkweDg3MAorI2RlZmluZSByRlBHQTBfWENEX1JGSW50ZXJmYWNlU1cJMHg4NzQKKyNkZWZpbmUgckZQR0EwX1hBQl9SRlBhcmFtZXRlcgkJMHg4NzgKKyNkZWZpbmUgckZQR0EwX1hDRF9SRlBhcmFtZXRlcgkJMHg4N2MKKyNkZWZpbmUgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjEJCTB4ODgwCisjZGVmaW5lIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIyCQkweDg4NAorI2RlZmluZSByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMwkJMHg4ODgKKyNkZWZpbmUgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjQJCTB4ODhjCisjZGVmaW5lIHJGUEdBMF9YQV9MU1NJUmVhZEJhY2sJCTB4OGEwCisjZGVmaW5lIHJGUEdBMF9YQl9MU1NJUmVhZEJhY2sJCTB4OGE0CisjZGVmaW5lIHJGUEdBMF9YQ19MU1NJUmVhZEJhY2sJCTB4OGE4CisjZGVmaW5lIHJGUEdBMF9YRF9MU1NJUmVhZEJhY2sJCTB4OGFjCisjZGVmaW5lIHJGUEdBMF9QU0RSZXBvcnQJCQkweDhiNAorI2RlZmluZSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlUkIJMHg4ZTAKKyNkZWZpbmUgckZQR0EwX1hDRF9SRkludGVyZmFjZVJCCTB4OGU0CisKKyNkZWZpbmUgckZQR0ExX1JGTU9ECQkJCTB4OTAwCisjZGVmaW5lIHJGUEdBMV9UeEJsb2NrCQkJCTB4OTA0CisjZGVmaW5lIHJGUEdBMV9EZWJ1Z1NlbGVjdAkJCTB4OTA4CisjZGVmaW5lIHJGUEdBMV9UeEluZm8JCQkJMHg5MGMKKworI2RlZmluZSByQ0NLMF9TeXN0ZW0JCQkJMHhhMDAKKyNkZWZpbmUgckNDSzBfQUZFU2V0dGluZwkJCTB4YTA0CisjZGVmaW5lIHJDQ0swX0NDQQkJCQkJMHhhMDgKKyNkZWZpbmUgckNDSzBfUnhBR0MxCQkJCTB4YTBjCisjZGVmaW5lIHJDQ0swX1J4QUdDMgkJCQkweGExMAorI2RlZmluZSByQ0NLMF9SeEhQCQkJCTB4YTE0CisjZGVmaW5lIHJDQ0swX0RTUFBhcmFtZXRlcjEJCTB4YTE4CisjZGVmaW5lIHJDQ0swX0RTUFBhcmFtZXRlcjIJCTB4YTFjCisjZGVmaW5lIHJDQ0swX1R4RmlsdGVyMQkJCQkweGEyMAorI2RlZmluZSByQ0NLMF9UeEZpbHRlcjIJCQkJMHhhMjQKKyNkZWZpbmUgckNDSzBfRGVidWdQb3J0CQkJCTB4YTI4CisjZGVmaW5lIHJDQ0swX0ZhbHNlQWxhcm1SZXBvcnQJCTB4YTJjCisjZGVmaW5lIHJDQ0swX1RSU1NJUmVwb3J0CQkJMHhhNTAKKyNkZWZpbmUgckNDSzBfUnhSZXBvcnQJCQkJMHhhNTQKKyNkZWZpbmUgckNDSzBfRkFDb3VudGVyTG93ZXIJCTB4YTVjCisjZGVmaW5lIHJDQ0swX0ZBQ291bnRlclVwcGVyCQkweGE1OAorCisjZGVmaW5lIHJPRkRNMF9MU1RGCQkJCTB4YzAwCisjZGVmaW5lIHJPRkRNMF9UUnhQYXRoRW5hYmxlCQkweGMwNAorI2RlZmluZSByT0ZETTBfVFJNdXhQYXIJCQkJMHhjMDgKKyNkZWZpbmUgck9GRE0wX1RSU1dJc29sYXRpb24JCQkweGMwYworI2RlZmluZSByT0ZETTBfWEFSeEFGRQkJCQkweGMxMAorI2RlZmluZSByT0ZETTBfWEFSeElRSW1iYWxhbmNlCQkweGMxNAorI2RlZmluZSByT0ZETTBfWEJSeEFGRQkJCQkweGMxOAorI2RlZmluZSByT0ZETTBfWEJSeElRSW1iYWxhbmNlCQkweGMxYworI2RlZmluZSByT0ZETTBfWENSeEFGRQkJCQkweGMyMAorI2RlZmluZSByT0ZETTBfWENSeElRSW1iYWxhbmNlCQkweGMyNAorI2RlZmluZSByT0ZETTBfWERSeEFGRQkJCQkweGMyOAorI2RlZmluZSByT0ZETTBfWERSeElRSW1iYWxhbmNlCQkweGMyYworI2RlZmluZSByT0ZETTBfUnhEZXRlY3RvcjEJCQkweGMzMAorI2RlZmluZSByT0ZETTBfUnhEZXRlY3RvcjIJCQkweGMzNAorI2RlZmluZSByT0ZETTBfUnhEZXRlY3RvcjMJCQkweGMzOAorI2RlZmluZSByT0ZETTBfUnhEZXRlY3RvcjQJCQkweGMzYworI2RlZmluZSByT0ZETTBfUnhEU1AJCQkJMHhjNDAKKyNkZWZpbmUgck9GRE0wX0NGT2FuZERBR0MJCTB4YzQ0CisjZGVmaW5lIHJPRkRNMF9DQ0FEcm9wVGhyZXNob2xkCQkweGM0OAorI2RlZmluZSByT0ZETTBfRUNDQVRocmVzaG9sZAkJMHhjNGMKKyNkZWZpbmUgck9GRE0wX1hBQUdDQ29yZTEJCTB4YzUwCisjZGVmaW5lIHJPRkRNMF9YQUFHQ0NvcmUyCQkweGM1NAorI2RlZmluZSByT0ZETTBfWEJBR0NDb3JlMQkJMHhjNTgKKyNkZWZpbmUgck9GRE0wX1hCQUdDQ29yZTIJCTB4YzVjCisjZGVmaW5lIHJPRkRNMF9YQ0FHQ0NvcmUxCQkweGM2MAorI2RlZmluZSByT0ZETTBfWENBR0NDb3JlMgkJMHhjNjQKKyNkZWZpbmUgck9GRE0wX1hEQUdDQ29yZTEJCTB4YzY4CisjZGVmaW5lIHJPRkRNMF9YREFHQ0NvcmUyCQkweGM2YworI2RlZmluZSByT0ZETTBfQUdDUGFyYW1ldGVyMQkJMHhjNzAKKyNkZWZpbmUgck9GRE0wX0FHQ1BhcmFtZXRlcjIJCTB4Yzc0CisjZGVmaW5lIHJPRkRNMF9BR0NSU1NJVGFibGUJCTB4Yzc4CisjZGVmaW5lIHJPRkRNMF9IVFNURkFHQwkJCQkweGM3YworI2RlZmluZSByT0ZETTBfWEFUeElRSW1iYWxhbmNlCQkweGM4MAorI2RlZmluZSByT0ZETTBfWEFUeEFGRQkJCQkweGM4NAorI2RlZmluZSByT0ZETTBfWEJUeElRSW1iYWxhbmNlCQkweGM4OAorI2RlZmluZSByT0ZETTBfWEJUeEFGRQkJCQkweGM4YworI2RlZmluZSByT0ZETTBfWENUeElRSW1iYWxhbmNlCQkweGM5MAorI2RlZmluZSByT0ZETTBfWENUeEFGRQkJCQkweGM5NAorI2RlZmluZSByT0ZETTBfWERUeElRSW1iYWxhbmNlCQkweGM5OAorI2RlZmluZSByT0ZETTBfWERUeEFGRQkJCQkweGM5YworI2RlZmluZSByT0ZETTBfUnhIUFBhcmFtZXRlcgkJMHhjZTAKKyNkZWZpbmUgck9GRE0wX1R4UHNldWRvTm9pc2VXZ3QJCTB4Y2U0CisjZGVmaW5lIHJPRkRNMF9GcmFtZVN5bmMJCQkweGNmMAorI2RlZmluZSByT0ZETTBfREZTUmVwb3J0CQkJMHhjZjQKKyNkZWZpbmUgck9GRE0wX1R4Q29lZmYxCQkJCTB4Y2E0CisjZGVmaW5lIHJPRkRNMF9UeENvZWZmMgkJCQkweGNhOAorI2RlZmluZSByT0ZETTBfVHhDb2VmZjMJCQkJMHhjYWMKKyNkZWZpbmUgck9GRE0wX1R4Q29lZmY0CQkJCTB4Y2IwCisjZGVmaW5lIHJPRkRNMF9UeENvZWZmNQkJCQkweGNiNAorI2RlZmluZSByT0ZETTBfVHhDb2VmZjYJCQkJMHhjYjgKKworCisjZGVmaW5lIHJPRkRNMV9MU1RGCQkJCTB4ZDAwCisjZGVmaW5lIHJPRkRNMV9UUnhQYXRoRW5hYmxlCQkweGQwNAorI2RlZmluZSByT0ZETTFfQ0ZPCQkJCTB4ZDA4CisjZGVmaW5lIHJPRkRNMV9DU0kxCQkJCTB4ZDEwCisjZGVmaW5lIHJPRkRNMV9TQkQJCQkJMHhkMTQKKyNkZWZpbmUgck9GRE0xX0NTSTIJCQkJMHhkMTgKKyNkZWZpbmUgck9GRE0xX0NGT1RyYWNraW5nCQkJMHhkMmMKKyNkZWZpbmUgck9GRE0xX1RSeE1lc2F1cmUxCQkweGQzNAorI2RlZmluZSByT0ZETTFfSW50ZkRldAkJCQkweGQzYworI2RlZmluZSByT0ZETTFfUHNldWRvTm9pc2VTdGF0ZUFCIDB4ZDUwCisjZGVmaW5lIHJPRkRNMV9Qc2V1ZG9Ob2lzZVN0YXRlQ0QgMHhkNTQKKyNkZWZpbmUgck9GRE0xX1J4UHNldWRvTm9pc2VXZ3QgICAweGQ1OAorI2RlZmluZSByT0ZETV9QSFlDb3VudGVyMQkJCTB4ZGEwCisjZGVmaW5lIHJPRkRNX1BIWUNvdW50ZXIyCQkJMHhkYTQKKyNkZWZpbmUgck9GRE1fUEhZQ291bnRlcjMJCQkweGRhOAorI2RlZmluZSByT0ZETV9TaG9ydENGT0FCCQkJMHhkYWMKKyNkZWZpbmUgck9GRE1fU2hvcnRDRk9DRAkJCTB4ZGIwCisjZGVmaW5lIHJPRkRNX0xvbmdDRk9BQgkJCQkweGRiNAorI2RlZmluZSByT0ZETV9Mb25nQ0ZPQ0QJCQkJMHhkYjgKKyNkZWZpbmUgck9GRE1fVGFpbENGT0FCCQkJCTB4ZGJjCisjZGVmaW5lIHJPRkRNX1RhaWxDRk9DRAkJCQkweGRjMAorI2RlZmluZSByT0ZETV9QV01lYXN1cmUxCQkweGRjNAorI2RlZmluZSByT0ZETV9QV01lYXN1cmUyCQkweGRjOAorI2RlZmluZSByT0ZETV9CV1JlcG9ydAkJCQkweGRjYworI2RlZmluZSByT0ZETV9BR0NSZXBvcnQJCQkJMHhkZDAKKyNkZWZpbmUgck9GRE1fUnhTTlIJCQkJMHhkZDQKKyNkZWZpbmUgck9GRE1fUnhFVk1DU0kJCQkJMHhkZDgKKyNkZWZpbmUgck9GRE1fU0lHUmVwb3J0CQkJCTB4ZGRjCisKKyNkZWZpbmUgclR4QUdDX1JhdGUxOF8wNgkJCTB4ZTAwCisjZGVmaW5lIHJUeEFHQ19SYXRlNTRfMjQJCQkweGUwNAorI2RlZmluZSByVHhBR0NfQ0NLX01jczMyCQkJMHhlMDgKKyNkZWZpbmUgclR4QUdDX01jczAzX01jczAwCQkJMHhlMTAKKyNkZWZpbmUgclR4QUdDX01jczA3X01jczA0CQkJMHhlMTQKKyNkZWZpbmUgclR4QUdDX01jczExX01jczA4CQkJMHhlMTgKKyNkZWZpbmUgclR4QUdDX01jczE1X01jczEyCQkJMHhlMWMKKworCisjZGVmaW5lIHJaZWJyYTFfSFNTSUVuYWJsZQkJMHgwCisjZGVmaW5lIHJaZWJyYTFfVFJ4RW5hYmxlMQkJMHgxCisjZGVmaW5lIHJaZWJyYTFfVFJ4RW5hYmxlMgkJMHgyCisjZGVmaW5lIHJaZWJyYTFfQUdDCQkJCTB4NAorI2RlZmluZSByWmVicmExX0NoYXJnZVB1bXAJCTB4NQorI2RlZmluZSByWmVicmExX0NoYW5uZWwJCQkJMHg3CisjZGVmaW5lIHJaZWJyYTFfVHhHYWluCQkJCTB4OAorI2RlZmluZSByWmVicmExX1R4TFBGCQkJCTB4OQorI2RlZmluZSByWmVicmExX1J4TFBGCQkJCTB4YgorI2RlZmluZSByWmVicmExX1J4SFBGQ29ybmVyCQkweGMKKworI2RlZmluZSByR2xvYmFsQ3RybAkJCQkwCisjZGVmaW5lIHJSVEw4MjU2X1R4TFBGCQkJCTE5CisjZGVmaW5lIHJSVEw4MjU2X1J4TFBGCQkJCTExCisKKyNkZWZpbmUgclJUTDgyNThfVHhMUEYJCQkJMHgxMQorI2RlZmluZSByUlRMODI1OF9SeExQRgkJCQkweDEzCisjZGVmaW5lIHJSVEw4MjU4X1JTU0lMUEYJCTB4YQorCisjZGVmaW5lIGJCQlJlc2V0QgkJCQkJMHgxMDAKKyNkZWZpbmUgYkdsb2JhbFJlc2V0QgkJCQkweDIwMAorI2RlZmluZSBiT0ZETVR4U3RhcnQJCQkJMHg0CisjZGVmaW5lIGJDQ0tUeFN0YXJ0CQkJCQkweDgKKyNkZWZpbmUgYkNSQzMyRGVidWcJCQkJMHgxMDAKKyNkZWZpbmUgYlBNQUNMb29wYmFjawkJCQkweDEwCisjZGVmaW5lIGJUeExTSUcJCQkJCQkweGZmZmZmZgorI2RlZmluZSBiT0ZETVR4UmF0ZQkJCQkweGYKKyNkZWZpbmUgYk9GRE1UeFJlc2VydmVkCQkJCTB4MTAKKyNkZWZpbmUgYk9GRE1UeExlbmd0aAkJCQkweDFmZmUwCisjZGVmaW5lIGJPRkRNVHhQYXJpdHkJCQkJMHgyMDAwMAorI2RlZmluZSBiVHhIVFNJRzEJCQkJCTB4ZmZmZmZmCisjZGVmaW5lIGJUeEhUTUNTUmF0ZQkJCQkweDdmCisjZGVmaW5lIGJUeEhUQlcJCQkJCQkweDgwCisjZGVmaW5lIGJUeEhUTGVuZ3RoCQkJCTB4ZmZmZjAwCisjZGVmaW5lIGJUeEhUU0lHMgkJCQkJMHhmZmZmZmYKKyNkZWZpbmUgYlR4SFRTbW9vdGhpbmcJCQkJMHgxCisjZGVmaW5lIGJUeEhUU291bmRpbmcJCQkJMHgyCisjZGVmaW5lIGJUeEhUUmVzZXJ2ZWQJCQkJMHg0CisjZGVmaW5lIGJUeEhUQWdncmVhdGlvbgkJCQkweDgKKyNkZWZpbmUgYlR4SFRTVEJDCQkJCQkweDMwCisjZGVmaW5lIGJUeEhUQWR2YW5jZUNvZGluZwkJCTB4NDAKKyNkZWZpbmUgYlR4SFRTaG9ydEdJCQkJCTB4ODAKKyNkZWZpbmUgYlR4SFROdW1iZXJIVF9MVEYJCQkweDMwMAorI2RlZmluZSBiVHhIVENSQzgJCQkJCTB4M2ZjMDAKKyNkZWZpbmUgYkNvdW50ZXJSZXNldAkJCQkweDEwMDAwCisjZGVmaW5lIGJOdW1PZk9GRE1UeAkJCQkweGZmZmYKKyNkZWZpbmUgYk51bU9mQ0NLVHgJCQkJMHhmZmZmMDAwMAorI2RlZmluZSBiVHhJZGxlSW50ZXJ2YWwJCQkJCTB4ZmZmZgorI2RlZmluZSBiT0ZETVNlcnZpY2UJCQkJMHhmZmZmMDAwMAorI2RlZmluZSBiVHhNQUNIZWFkZXIJCQkJMHhmZmZmZmZmZgorI2RlZmluZSBiVHhEYXRhSW5pdAkJCQkJMHhmZgorI2RlZmluZSBiVHhIVE1vZGUJCQkJMHgxMDAKKyNkZWZpbmUgYlR4RGF0YVR5cGUJCQkJMHgzMDAwMAorI2RlZmluZSBiVHhSYW5kb21TZWVkCQkJCTB4ZmZmZmZmZmYKKyNkZWZpbmUgYkNDS1R4UHJlYW1ibGUJCQkJMHgxCisjZGVmaW5lIGJDQ0tUeFNGRAkJCQkJMHhmZmZmMDAwMAorI2RlZmluZSBiQ0NLVHhTSUcJCQkJCTB4ZmYKKyNkZWZpbmUgYkNDS1R4U2VydmljZQkJCQkweGZmMDAKKyNkZWZpbmUgYkNDS0xlbmd0aEV4dAkJCQkweDgwMDAKKyNkZWZpbmUgYkNDS1R4TGVuZ3RoCQkJCTB4ZmZmZjAwMDAKKyNkZWZpbmUgYkNDS1R4Q1JDMTYJCQkJMHhmZmZmCisjZGVmaW5lIGJDQ0tUeFN0YXR1cwkJCQkweDEKKyNkZWZpbmUgYk9GRE1UeFN0YXR1cwkJCQkweDIKKworI2RlZmluZSBiUkZNT0QJCQkJCQkweDEKKyNkZWZpbmUgYkphcGFuTW9kZQkJCQkweDIKKyNkZWZpbmUgYkNDS1R4U0MJCQkJCTB4MzAKKyNkZWZpbmUgYkNDS0VuCQkJCQkJMHgxMDAwMDAwCisjZGVmaW5lIGJPRkRNRW4JCQkJCQkweDIwMDAwMDAKKyNkZWZpbmUgYk9GRE1SeEFEQ1BoYXNlCQkJCTB4MTAwMDAKKyNkZWZpbmUgYk9GRE1UeERBQ1BoYXNlCQkJCTB4NDAwMDAKKyNkZWZpbmUgYlhBVHhBR0MJCQkJCTB4M2YKKyNkZWZpbmUgYlhCVHhBR0MJCQkJCTB4ZjAwCisjZGVmaW5lIGJYQ1R4QUdDCQkJCQkweGYwMDAKKyNkZWZpbmUgYlhEVHhBR0MJCQkJCTB4ZjAwMDAKKyNkZWZpbmUgYlBBU3RhcnQJCQkJCTB4ZjAwMDAwMDAKKyNkZWZpbmUgYlRSU3RhcnQJCQkJCTB4MDBmMDAwMDAKKyNkZWZpbmUgYlJGU3RhcnQJCQkJCTB4MDAwMGYwMDAKKyNkZWZpbmUgYkJCU3RhcnQJCQkJCTB4MDAwMDAwZjAKKyNkZWZpbmUgYkJCQ0NLU3RhcnQJCQkJMHgwMDAwMDAwZgorI2RlZmluZSBiUEFFbmQJCQkJCQkweGYKKyNkZWZpbmUgYlRSRW5kCQkJCQkJMHgwZjAwMDAwMAorI2RlZmluZSBiUkZFbmQJCQkJCQkweDAwMGYwMDAwCisjZGVmaW5lIGJDQ0FNYXNrCQkJCQkweDAwMDAwMGYwCisjZGVmaW5lIGJSMlJDQ0FNYXNrCQkJCTB4MDAwMDBmMDAKKyNkZWZpbmUgYkhTU0lfUjJURGVsYXkJCQkJMHhmODAwMDAwMAorI2RlZmluZSBiSFNTSV9UMlJEZWxheQkJCQkweGY4MDAwMAorI2RlZmluZSBiQ29udFR4SFNTSQkJCQkweDQwMAorI2RlZmluZSBiSUdGcm9tQ0NLCQkJCTB4MjAwCisjZGVmaW5lIGJBR0NBZGRyZXNzCQkJCTB4M2YKKyNkZWZpbmUgYlJ4SFBUeAkJCQkJCTB4NzAwMAorI2RlZmluZSBiUnhIUFQyUgkJCQkJMHgzODAwMAorI2RlZmluZSBiUnhIUENDS0luaQkJCQkweGMwMDAwCisjZGVmaW5lIGJBR0NUeENvZGUJCQkJMHhjMDAwMDAKKyNkZWZpbmUgYkFHQ1J4Q29kZQkJCQkweDMwMDAwMAorI2RlZmluZSBiM1dpcmVEYXRhTGVuZ3RoCQkJMHg4MDAKKyNkZWZpbmUgYjNXaXJlQWRkcmVzc0xlbmd0aAkJCTB4NDAwCisjZGVmaW5lIGIzV2lyZVJGUG93ZXJEb3duCQkJMHgxCisjZGVmaW5lIGI1R1BBUEVQb2xhcml0eQkJCQkweDQwMDAwMDAwCisjZGVmaW5lIGIyR1BBUEVQb2xhcml0eQkJCQkweDgwMDAwMDAwCisjZGVmaW5lIGJSRlNXX1R4RGVmYXVsdEFudAkJCTB4MworI2RlZmluZSBiUkZTV19UeE9wdGlvbkFudAkJCTB4MzAKKyNkZWZpbmUgYlJGU1dfUnhEZWZhdWx0QW50CQkJMHgzMDAKKyNkZWZpbmUgYlJGU1dfUnhPcHRpb25BbnQJCQkweDMwMDAKKyNkZWZpbmUgYlJGU0lfM1dpcmVEYXRhCQkJCTB4MQorI2RlZmluZSBiUkZTSV8zV2lyZUNsb2NrCQkJMHgyCisjZGVmaW5lIGJSRlNJXzNXaXJlTG9hZAkJCQkweDQKKyNkZWZpbmUgYlJGU0lfM1dpcmVSVwkJCQkweDgKKyNkZWZpbmUgYlJGU0lfM1dpcmUJCQkJCTB4ZgorI2RlZmluZSBiUkZTSV9SRkVOVgkJCQkweDEwCisjZGVmaW5lIGJSRlNJX1RSU1cJCQkJMHgyMAorI2RlZmluZSBiUkZTSV9UUlNXQgkJCQkweDQwCisjZGVmaW5lIGJSRlNJX0FOVFNXCQkJCTB4MTAwCisjZGVmaW5lIGJSRlNJX0FOVFNXQgkJCQkweDIwMAorI2RlZmluZSBiUkZTSV9QQVBFCQkJCQkweDQwMAorI2RlZmluZSBiUkZTSV9QQVBFNUcJCQkJMHg4MDAKKyNkZWZpbmUgYkJhbmRTZWxlY3QJCQkJCTB4MQorI2RlZmluZSBiSFRTSUcyX0dJCQkJCQkweDgwCisjZGVmaW5lIGJIVFNJRzJfU21vb3RoaW5nCQkJMHgwMQorI2RlZmluZSBiSFRTSUcyX1NvdW5kaW5nCQkJMHgwMgorI2RlZmluZSBiSFRTSUcyX0FnZ3JlYXRvbgkJCTB4MDgKKyNkZWZpbmUgYkhUU0lHMl9TVEJDCQkJCTB4MzAKKyNkZWZpbmUgYkhUU0lHMl9BZHZDb2RpbmcJCQkweDQwCisjZGVmaW5lIGJIVFNJRzJfTnVtT2ZIVExURgkJMHgzMDAKKyNkZWZpbmUgYkhUU0lHMl9DUkM4CQkJCTB4M2ZjCisjZGVmaW5lIGJIVFNJRzFfTUNTCQkJCTB4N2YKKyNkZWZpbmUgYkhUU0lHMV9CYW5kV2lkdGgJCQkweDgwCisjZGVmaW5lIGJIVFNJRzFfSFRMZW5ndGgJCQkweGZmZmYKKyNkZWZpbmUgYkxTSUdfUmF0ZQkJCQkJMHhmCisjZGVmaW5lIGJMU0lHX1Jlc2VydmVkCQkJCTB4MTAKKyNkZWZpbmUgYkxTSUdfTGVuZ3RoCQkJCTB4MWZmZmUKKyNkZWZpbmUgYkxTSUdfUGFyaXR5CQkJCQkweDIwCisjZGVmaW5lIGJDQ0tSeFBoYXNlCQkJCTB4NAorI2RlZmluZSBiTFNTSVJlYWRBZGRyZXNzCQkJMHgzZjAwMDAwMAorI2RlZmluZSBiTFNTSVJlYWRFZGdlCQkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgYkxTU0lSZWFkQmFja0RhdGEJCQkweGZmZgorI2RlZmluZSBiTFNTSVJlYWRPS0ZsYWcJCQkJMHgxMDAwCisjZGVmaW5lIGJDQ0tTYW1wbGVSYXRlCQkJCTB4OAorCisjZGVmaW5lIGJSZWd1bGF0b3IwU3RhbmRieQkJCTB4MQorI2RlZmluZSBiUmVndWxhdG9yUExMU3RhbmRieQkJCTB4MgorI2RlZmluZSBiUmVndWxhdG9yMVN0YW5kYnkJCQkweDQKKyNkZWZpbmUgYlBMTFBvd2VyVXAJCQkJMHg4CisjZGVmaW5lIGJEUExMUG93ZXJVcAkJCQkweDEwCisjZGVmaW5lIGJEQTEwUG93ZXJVcAkJCQkweDIwCisjZGVmaW5lIGJBRDdQb3dlclVwCQkJCTB4MjAwCisjZGVmaW5lIGJEQTZQb3dlclVwCQkJCTB4MjAwMAorI2RlZmluZSBiWHRhbFBvd2VyVXAJCQkJMHg0MDAwCisjZGVmaW5lIGI0ME1EQ2xrUG93ZXJVUAkJCQkweDgwMDAKKyNkZWZpbmUgYkRBNkRlYnVnTW9kZQkJCQkweDIwMDAwCisjZGVmaW5lIGJEQTZTd2luZwkJCQkJMHgzODAwMDAKKyNkZWZpbmUgYkFEQ2xrUGhhc2UJCQkJMHg0MDAwMDAwCisjZGVmaW5lIGI4ME1DbGtEZWxheQkJCQkweDE4MDAwMDAwCisjZGVmaW5lIGJBRkVXYXRjaERvZ0VuYWJsZQkJCTB4MjAwMDAwMDAKKyNkZWZpbmUgYlh0YWxDYXAJCQkJCTB4MGYwMDAwMDAKKyNkZWZpbmUgYlh0YWxDYXAwMQkJCQkJMHhjMDAwMDAwMAorI2RlZmluZSBiWHRhbENhcDIzCQkJCQkweDMKKyNkZWZpbmUgYlh0YWxDYXA5MngJCQkJCTB4MGYwMDAwMDAKKyNkZWZpbmUgYkludERpZkNsa0VuYWJsZQkJCTB4NDAwCisjZGVmaW5lIGJFeHRTaWdDbGtFbmFibGUJCQkweDgwMAorI2RlZmluZSBiQmFuZGdhcE1iaWFzUG93ZXJVcAkJMHgxMDAwMAorI2RlZmluZSBiQUQxMVNIR2FpbgkJCQkweGMwMDAwCisjZGVmaW5lIGJBRDExSW5wdXRSYW5nZQkJCQkweDcwMDAwMAorI2RlZmluZSBiQUQxMU9QQ3VycmVudAkJCQkweDM4MDAwMDAKKyNkZWZpbmUgYklQYXRoTG9vcGJhY2sJCQkJMHg0MDAwMDAwCisjZGVmaW5lIGJRUGF0aExvb3BiYWNrCQkJCTB4ODAwMDAwMAorI2RlZmluZSBiQUZFTG9vcGJhY2sJCQkJMHgxMDAwMDAwMAorI2RlZmluZSBiREExMFN3aW5nCQkJCTB4N2UwCisjZGVmaW5lIGJEQTEwUmV2ZXJzZQkJCQkweDgwMAorI2RlZmluZSBiREFDbGtTb3VyY2UJCQkJMHgxMDAwCisjZGVmaW5lIGJBRDdJbnB1dFJhbmdlCQkJCTB4NjAwMAorI2RlZmluZSBiQUQ3R2FpbgkJCQkJMHgzODAwMAorI2RlZmluZSBiQUQ3T3V0cHV0Q01Nb2RlCQkJMHg0MDAwMAorI2RlZmluZSBiQUQ3SW5wdXRDTU1vZGUJCQkJMHgzODAwMDAKKyNkZWZpbmUgYkFEN0N1cnJlbnQJCQkJCTB4YzAwMDAwCisjZGVmaW5lIGJSZWd1bGF0b3JBZGp1c3QJCQkweDcwMDAwMDAKKyNkZWZpbmUgYkFEMTFQb3dlclVwQXRUeAkJCTB4MQorI2RlZmluZSBiREExMFBTQXRUeAkJCQkweDEwCisjZGVmaW5lIGJBRDExUG93ZXJVcEF0UngJCQkweDEwMAorI2RlZmluZSBiREExMFBTQXRSeAkJCQkweDEwMDAKKworI2RlZmluZSBiQ0NLUnhBR0NGb3JtYXQJCQkJMHgyMDAKKworI2RlZmluZSBiUFNERkZUU2FtcGxlcFBvaW50CQkJMHhjMDAwCisjZGVmaW5lIGJQU0RBdmVyYWdlTnVtCQkJCTB4MzAwMAorI2RlZmluZSBiSVFQYXRoQ29udHJvbAkJCQkweGMwMAorI2RlZmluZSBiUFNERnJlcQkJCQkJMHgzZmYKKyNkZWZpbmUgYlBTREFudGVubmFQYXRoCQkJCTB4MzAKKyNkZWZpbmUgYlBTRElRU3dpdGNoCQkJCTB4NDAKKyNkZWZpbmUgYlBTRFJ4VHJpZ2dlcgkJCQkweDQwMDAwMAorI2RlZmluZSBiUFNEVHhUcmlnZ2VyCQkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgYlBTRFNpbmVUb25lU2NhbGUJCQkweDdmMDAwMDAwCisjZGVmaW5lIGJQU0RSZXBvcnQJCQkJCTB4ZmZmZgorCisjZGVmaW5lIGJPRkRNVHhTQwkJCQkweDMwMDAwMDAwCisjZGVmaW5lIGJDQ0tUeE9uCQkJCQkweDEKKyNkZWZpbmUgYk9GRE1UeE9uCQkJCTB4MgorI2RlZmluZSBiRGVidWdQYWdlCQkJCTB4ZmZmCisjZGVmaW5lIGJEZWJ1Z0l0ZW0JCQkJMHhmZgorI2RlZmluZSBiQW50TAkJCQkJMHgxMAorI2RlZmluZSBiQW50Tm9uSFQJCQkJCTB4MTAwCisjZGVmaW5lIGJBbnRIVDEJCQkJCTB4MTAwMAorI2RlZmluZSBiQW50SFQyCQkJCQkJMHgxMDAwMAorI2RlZmluZSBiQW50SFQxUzEJCQkJCTB4MTAwMDAwCisjZGVmaW5lIGJBbnROb25IVFMxCQkJCTB4MTAwMDAwMAorCisjZGVmaW5lIGJDQ0tCQk1vZGUJCQkJMHgzCisjZGVmaW5lIGJDQ0tUeFBvd2VyU2F2aW5nCQkJMHg4MAorI2RlZmluZSBiQ0NLUnhQb3dlclNhdmluZwkJCTB4NDAKKyNkZWZpbmUgYkNDS1NpZGVCYW5kCQkJCTB4MTAKKyNkZWZpbmUgYkNDS1NjcmFtYmxlCQkJCTB4OAorI2RlZmluZSBiQ0NLQW50RGl2ZXJzaXR5CQkJMHg4MDAwCisjZGVmaW5lIGJDQ0tDYXJyaWVyUmVjb3ZlcnkJCTB4NDAwMAorI2RlZmluZSBiQ0NLVHhSYXRlCQkJCTB4MzAwMAorI2RlZmluZSBiQ0NLRENDYW5jZWwJCQkJMHgwODAwCisjZGVmaW5lIGJDQ0tJU0lDYW5jZWwJCQkJMHgwNDAwCisjZGVmaW5lIGJDQ0tNYXRjaEZpbHRlcgkJCQkweDAyMDAKKyNkZWZpbmUgYkNDS0VxdWFsaXplcgkJCQkweDAxMDAKKyNkZWZpbmUgYkNDS1ByZWFtYmxlRGV0ZWN0CQkJMHg4MDAwMDAKKyNkZWZpbmUgYkNDS0Zhc3RGYWxzZUNDQQkJCTB4NDAwMDAwCisjZGVmaW5lIGJDQ0tDaEVzdFN0YXJ0CQkJCTB4MzAwMDAwCisjZGVmaW5lIGJDQ0tDQ0FDb3VudAkJCQkweDA4MDAwMAorI2RlZmluZSBiQ0NLY3NfbGltCQkJCQkweDA3MDAwMAorI2RlZmluZSBiQ0NLQmlzdE1vZGUJCQkJMHg4MDAwMDAwMAorI2RlZmluZSBiQ0NLQ0NBTWFzawkJCQkweDQwMDAwMDAwCisjZGVmaW5lIGJDQ0tUeERBQ1BoYXNlCQkJMHg0CisjZGVmaW5lIGJDQ0tSeEFEQ1BoYXNlCQkJMHgyMDAwMDAwMAorI2RlZmluZSBiQ0NLcl9jcF9tb2RlMAkJCTB4MDEwMAorI2RlZmluZSBiQ0NLVHhEQ09mZnNldAkJCQkweGYwCisjZGVmaW5lIGJDQ0tSeERDT2Zmc2V0CQkJCTB4ZgorI2RlZmluZSBiQ0NLQ0NBTW9kZQkJCQkweGMwMDAKKyNkZWZpbmUgYkNDS0ZhbHNlQ1NfbGltCQkJCTB4M2YwMAorI2RlZmluZSBiQ0NLQ1NfcmF0aW8JCQkJMHhjMDAwMDAKKyNkZWZpbmUgYkNDS0NvcmdCaXRfc2VsCQkJCTB4MzAwMDAwCisjZGVmaW5lIGJDQ0tQRF9saW0JCQkJCTB4MGYwMDAwCisjZGVmaW5lIGJDQ0tOZXdDQ0EJCQkJMHg4MDAwMDAwMAorI2RlZmluZSBiQ0NLUnhIUG9mSUcJCQkJMHg4MDAwCisjZGVmaW5lIGJDQ0tSeElHCQkJCQkweDdmMDAKKyNkZWZpbmUgYkNDS0xOQVBvbGFyaXR5CQkJCTB4ODAwMDAwCisjZGVmaW5lIGJDQ0tSeDFzdEdhaW4JCQkJMHg3ZjAwMDAKKyNkZWZpbmUgYkNDS1JGRXh0ZW5kCQkJCTB4MjAwMDAwMDAKKyNkZWZpbmUgYkNDS1J4QUdDU2F0TGV2ZWwJCQkweDFmMDAwMDAwCisjZGVmaW5lIGJDQ0tSeEFHQ1NhdENvdW50CQkJMHhlMAorI2RlZmluZSBiQ0NLUnhSRlNldHRsZQkJCQkweDFmCisjZGVmaW5lIGJDQ0tGaXhlZFJ4QUdDCQkJCTB4ODAwMAorI2RlZmluZSBiQ0NLQW50ZW5uYVBvbGFyaXR5CQkJMHgyMDAwCisjZGVmaW5lIGJDQ0tUeEZpbHRlclR5cGUJCQkweDBjMDAKKyNkZWZpbmUgYkNDS1J4QUdDUmVwb3J0VHlwZQkJMHgwMzAwCisjZGVmaW5lIGJDQ0tSeERBR0NFbgkJCQkweDgwMDAwMDAwCisjZGVmaW5lIGJDQ0tSeERBR0NQZXJpb2QJCQkweDIwMDAwMDAwCisjZGVmaW5lIGJDQ0tSeERBR0NTYXRMZXZlbAkJMHgxZjAwMDAwMAorI2RlZmluZSBiQ0NLVGltaW5nUmVjb3ZlcnkJCQkweDgwMDAwMAorI2RlZmluZSBiQ0NLVHhDMAkJCQkJMHgzZjAwMDAKKyNkZWZpbmUgYkNDS1R4QzEJCQkJCTB4M2YwMDAwMDAKKyNkZWZpbmUgYkNDS1R4QzIJCQkJCTB4M2YKKyNkZWZpbmUgYkNDS1R4QzMJCQkJCTB4M2YwMAorI2RlZmluZSBiQ0NLVHhDNAkJCQkJMHgzZjAwMDAKKyNkZWZpbmUgYkNDS1R4QzUJCQkJCTB4M2YwMDAwMDAKKyNkZWZpbmUgYkNDS1R4QzYJCQkJCTB4M2YKKyNkZWZpbmUgYkNDS1R4QzcJCQkJCTB4M2YwMAorI2RlZmluZSBiQ0NLRGVidWdQb3J0CQkJCTB4ZmYwMDAwCisjZGVmaW5lIGJDQ0tEQUNEZWJ1ZwkJCQkweDBmMDAwMDAwCisjZGVmaW5lIGJDQ0tGYWxzZUFsYXJtRW5hYmxlCQkJMHg4MDAwCisjZGVmaW5lIGJDQ0tGYWxzZUFsYXJtUmVhZAkJCTB4NDAwMAorI2RlZmluZSBiQ0NLVFJTU0kJCQkJCTB4N2YKKyNkZWZpbmUgYkNDS1J4QUdDUmVwb3J0CQkJCTB4ZmUKKyNkZWZpbmUgYkNDS1J4UmVwb3J0X0FudFNlbAkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgYkNDS1J4UmVwb3J0X01GT2ZmCQkJMHg0MDAwMDAwMAorI2RlZmluZSBiQ0NLUnhSeFJlcG9ydF9TUUxvc3MJCTB4MjAwMDAwMDAKKyNkZWZpbmUgYkNDS1J4UmVwb3J0X1BrdGxvc3MJCQkweDEwMDAwMDAwCisjZGVmaW5lIGJDQ0tSeFJlcG9ydF9Mb2NrZWRiaXQJCTB4MDgwMDAwMDAKKyNkZWZpbmUgYkNDS1J4UmVwb3J0X1JhdGVFcnJvcgkJMHgwNDAwMDAwMAorI2RlZmluZSBiQ0NLUnhSZXBvcnRfUnhSYXRlCQkJMHgwMzAwMDAwMAorI2RlZmluZSBiQ0NLUnhGQUNvdW50ZXJMb3dlcgkJMHhmZgorI2RlZmluZSBiQ0NLUnhGQUNvdW50ZXJVcHBlcgkJMHhmZjAwMDAwMAorI2RlZmluZSBiQ0NLUnhIUEFHQ1N0YXJ0CQkJMHhlMDAwCisjZGVmaW5lIGJDQ0tSeEhQQUdDRmluYWwJCQkweDFjMDAKKworI2RlZmluZSBiQ0NLUnhGYWxzZUFsYXJtRW5hYmxlCQkweDgwMDAKKyNkZWZpbmUgYkNDS0ZBQ291bnRlckZyZWV6ZQkJCTB4NDAwMAorCisjZGVmaW5lIGJDQ0tUeFBhdGhTZWwJCQkJMHgxMDAwMDAwMAorI2RlZmluZSBiQ0NLRGVmYXVsdFJ4UGF0aAkJCTB4YzAwMDAwMAorI2RlZmluZSBiQ0NLT3B0aW9uUnhQYXRoCQkJMHgzMDAwMDAwCisKKyNkZWZpbmUgYk51bU9mU1RGCQkJCQkweDMKKyNkZWZpbmUgYlNoaWZ0X0wJCQkJCTB4YzAKKyNkZWZpbmUgYkdJX1RICQkJCQkJMHhjCisjZGVmaW5lIGJSeFBhdGhBCQkJCQkweDEKKyNkZWZpbmUgYlJ4UGF0aEIJCQkJCTB4MgorI2RlZmluZSBiUnhQYXRoQwkJCQkJMHg0CisjZGVmaW5lIGJSeFBhdGhECQkJCQkweDgKKyNkZWZpbmUgYlR4UGF0aEEJCQkJCTB4MQorI2RlZmluZSBiVHhQYXRoQgkJCQkJMHgyCisjZGVmaW5lIGJUeFBhdGhDCQkJCQkweDQKKyNkZWZpbmUgYlR4UGF0aEQJCQkJCTB4OAorI2RlZmluZSBiVFJTU0lGcmVxCQkJCQkweDIwMAorI2RlZmluZSBiQURDQmFja29mZgkJCQkJMHgzMDAwCisjZGVmaW5lIGJERklSQmFja29mZgkJCQkJMHhjMDAwCisjZGVmaW5lIGJUUlNTSUxhdGNoUGhhc2UJCQkweDEwMDAwCisjZGVmaW5lIGJSeElEQ09mZnNldAkJCQkJMHhmZgorI2RlZmluZSBiUnhRRENPZmZzZXQJCQkJCTB4ZmYwMAorI2RlZmluZSBiUnhERklSTW9kZQkJCQkweDE4MDAwMDAKKyNkZWZpbmUgYlJ4RENORlR5cGUJCQkJMHhlMDAwMDAwCisjZGVmaW5lIGJSWElRSW1iX0EJCQkJCTB4M2ZmCisjZGVmaW5lIGJSWElRSW1iX0IJCQkJCTB4ZmMwMAorI2RlZmluZSBiUlhJUUltYl9DCQkJCQkweDNmMDAwMAorI2RlZmluZSBiUlhJUUltYl9ECQkJCQkweGZmYzAwMDAwCisjZGVmaW5lIGJEQ19kY19Ob3RjaAkJCQkweDYwMDAwCisjZGVmaW5lIGJSeE5CSU5vdGNoCQkJCQkweDFmMDAwMDAwCisjZGVmaW5lIGJQRF9USAkJCQkJCTB4ZgorI2RlZmluZSBiUERfVEhfT3B0MgkJCQkweGMwMDAKKyNkZWZpbmUgYlBXRURfVEgJCQkJCTB4NzAwCisjZGVmaW5lIGJJZk1GX1dpbl9MCQkJCQkweDgwMAorI2RlZmluZSBiUERfT3B0aW9uCQkJCQkweDEwMDAKKyNkZWZpbmUgYk1GX1dpbl9MCQkJCQkweGUwMDAKKyNkZWZpbmUgYkJXX1NlYXJjaF9MCQkJCTB4MzAwMDAKKyNkZWZpbmUgYndpbl9lbmhfTAkJCQkJMHhjMDAwMAorI2RlZmluZSBiQldfVEgJCQkJCQkweDcwMDAwMAorI2RlZmluZSBiRURfVEgyCQkJCQkJMHgzODAwMDAwCisjZGVmaW5lIGJCV19vcHRpb24JCQkJCTB4NDAwMDAwMAorI2RlZmluZSBiUmF0aW9fVEgJCQkJCTB4MTgwMDAwMDAKKyNkZWZpbmUgYldpbmRvd19MCQkJCQkweGUwMDAwMDAwCisjZGVmaW5lIGJTQkRfT3B0aW9uCQkJCQkweDEKKyNkZWZpbmUgYkZyYW1lX1RICQkJCQkweDFjCisjZGVmaW5lIGJGU19PcHRpb24JCQkJCTB4NjAKKyNkZWZpbmUgYkRDX1Nsb3BlX2NoZWNrCQkJCTB4ODAKKyNkZWZpbmUgYkZHdWFyZF9Db3VudGVyX0RDX0wJCQkweGUwMAorI2RlZmluZSBiRnJhbWVfV2VpZ2h0X1Nob3J0CQkJMHg3MDAwCisjZGVmaW5lIGJTdWJfVHVuZQkJCQkJMHhlMDAwMDAKKyNkZWZpbmUgYkZyYW1lX0RDX0xlbmd0aAkJCTB4ZTAwMDAwMAorI2RlZmluZSBiU0JEX3N0YXJ0X29mZnNldAkJCTB4MzAwMDAwMDAKKyNkZWZpbmUgYkZyYW1lX1RIXzIJCQkJMHg3CisjZGVmaW5lIGJGcmFtZV9HSTJfVEgJCQkJMHgzOAorI2RlZmluZSBiR0kyX1N5bmNfZW4JCQkJMHg0MAorI2RlZmluZSBiU2FyY2hfU2hvcnRfRWFybHkJCQkweDMwMAorI2RlZmluZSBiU2FyY2hfU2hvcnRfTGF0ZQkJCTB4YzAwCisjZGVmaW5lIGJTYXJjaF9HSTJfTGF0ZQkJCQkweDcwMDAwCisjZGVmaW5lIGJDRk9BbnRTdW0JCQkJMHgxCisjZGVmaW5lIGJDRk9BY2MJCQkJCQkweDIKKyNkZWZpbmUgYkNGT1N0YXJ0T2Zmc2V0CQkJCTB4YworI2RlZmluZSBiQ0ZPTG9va0JhY2sJCQkJMHg3MAorI2RlZmluZSBiQ0ZPU3VtV2VpZ2h0CQkJCTB4ODAKKyNkZWZpbmUgYkRBR0NFbmFibGUJCQkJCTB4MTAwMDAKKyNkZWZpbmUgYlRYSVFJbWJfQQkJCQkJMHgzZmYKKyNkZWZpbmUgYlRYSVFJbWJfQgkJCQkJMHhmYzAwCisjZGVmaW5lIGJUWElRSW1iX0MJCQkJCTB4M2YwMDAwCisjZGVmaW5lIGJUWElRSW1iX0QJCQkJCTB4ZmZjMDAwMDAKKyNkZWZpbmUgYlR4SURDT2Zmc2V0CQkJCQkweGZmCisjZGVmaW5lIGJUeFFEQ09mZnNldAkJCQkJMHhmZjAwCisjZGVmaW5lIGJUeERGSVJNb2RlCQkJCTB4MTAwMDAKKyNkZWZpbmUgYlR4UGVzdWRvTm9pc2VPbgkJCTB4NDAwMDAwMAorI2RlZmluZSBiVHhQZXN1ZG9Ob2lzZV9BCQkJMHhmZgorI2RlZmluZSBiVHhQZXN1ZG9Ob2lzZV9CCQkJMHhmZjAwCisjZGVmaW5lIGJUeFBlc3Vkb05vaXNlX0MJCQkweGZmMDAwMAorI2RlZmluZSBiVHhQZXN1ZG9Ob2lzZV9ECQkJMHhmZjAwMDAwMAorI2RlZmluZSBiQ0NBRHJvcE9wdGlvbgkJCQkweDIwMDAwCisjZGVmaW5lIGJDQ0FEcm9wVGhyZXMJCQkJMHhmZmYwMDAwMAorI2RlZmluZSBiRURDQ0FfSAkJCQkJMHhmCisjZGVmaW5lIGJFRENDQV9MCQkJCQkweGYwCisjZGVmaW5lIGJMYW1iZGFfRUQgICAgICAgICAgICAgICAweDMwMAorI2RlZmluZSBiUnhJbml0aWFsR2FpbiAgICAgICAgICAgMHg3ZgorI2RlZmluZSBiUnhBbnREaXZFbiAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBiUnhBR0NBZGRyZXNzRm9yTE5BICAgICAgMHg3ZjAwCisjZGVmaW5lIGJSeEhpZ2hQb3dlckZsb3cgICAgICAgICAweDgwMDAKKyNkZWZpbmUgYlJ4QUdDRnJlZXplVGhyZXMgICAgICAgIDB4YzAwMDAKKyNkZWZpbmUgYlJ4RnJlZXplU3RlcF9BR0MxICAgICAgIDB4MzAwMDAwCisjZGVmaW5lIGJSeEZyZWV6ZVN0ZXBfQUdDMiAgICAgICAweGMwMDAwMAorI2RlZmluZSBiUnhGcmVlemVTdGVwX0FHQzMgICAgICAgMHgzMDAwMDAwCisjZGVmaW5lIGJSeEZyZWV6ZVN0ZXBfQUdDMCAgICAgICAweGMwMDAwMDAKKyNkZWZpbmUgYlJ4UnNzaV9DbXBfRW4gICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgYlJ4UXVpY2tBR0NFbiAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgYlJ4QUdDRnJlZXplVGhyZXNNb2RlICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgYlJ4T3ZlckZsb3dDaGVja1R5cGUgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgYlJ4QUdDU2hpZnQgICAgICAgICAgICAgIDB4N2YKKyNkZWZpbmUgYlRSU1dfVHJpX09ubHkgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgYlBvd2VyVGhyZXMgICAgICAgICAgICAgIDB4MzAwCisjZGVmaW5lIGJSeEFHQ0VuICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgYlJ4QUdDVG9nZXRoZXJFbiAgICAgICAgIDB4MgorI2RlZmluZSBiUnhBR0NNaW4gICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lIGJSeEhQX0luaSAgICAgICAgICAgICAgICAweDcKKyNkZWZpbmUgYlJ4SFBfVFJMTkEgICAgICAgICAgICAgIDB4NzAKKyNkZWZpbmUgYlJ4SFBfUlNTSSAgICAgICAgICAgICAgIDB4NzAwCisjZGVmaW5lIGJSeEhQX0JCUDEgICAgICAgICAgICAgICAweDcwMDAKKyNkZWZpbmUgYlJ4SFBfQkJQMiAgICAgICAgICAgICAgIDB4NzAwMDAKKyNkZWZpbmUgYlJ4SFBfQkJQMyAgICAgICAgICAgICAgIDB4NzAwMDAwCisjZGVmaW5lIGJSU1NJX0ggICAgICAgICAgICAgICAgICAweDdmMDAwMAorI2RlZmluZSBiUlNTSV9HZW4gICAgICAgICAgICAgICAgMHg3ZjAwMDAwMAorI2RlZmluZSBiUnhTZXR0bGVfVFJTVyAgICAgICAgICAgMHg3CisjZGVmaW5lIGJSeFNldHRsZV9MTkEgICAgICAgICAgICAweDM4CisjZGVmaW5lIGJSeFNldHRsZV9SU1NJICAgICAgICAgICAweDFjMAorI2RlZmluZSBiUnhTZXR0bGVfQkJQICAgICAgICAgICAgMHhlMDAKKyNkZWZpbmUgYlJ4U2V0dGxlX1J4SFAgICAgICAgICAgIDB4NzAwMAorI2RlZmluZSBiUnhTZXR0bGVfQW50U1dfUlNTSSAgICAgMHgzODAwMAorI2RlZmluZSBiUnhTZXR0bGVfQW50U1cgICAgICAgICAgMHhjMDAwMAorI2RlZmluZSBiUnhQcm9jZXNzVGltZV9EQUdDICAgICAgMHgzMDAwMDAKKyNkZWZpbmUgYlJ4U2V0dGxlX0hTU0kgICAgICAgICAgIDB4NDAwMDAwCisjZGVmaW5lIGJSeFByb2Nlc3NUaW1lX0JCUFBXICAgICAweDgwMDAwMAorI2RlZmluZSBiUnhBbnRlbm5hUG93ZXJTaGlmdCAgICAgMHgzMDAwMDAwCisjZGVmaW5lIGJSU1NJVGFibGVTZWxlY3QgICAgICAgICAweGMwMDAwMDAKKyNkZWZpbmUgYlJ4SFBfRmluYWwgICAgICAgICAgICAgIDB4NzAwMDAwMAorI2RlZmluZSBiUnhIVFNldHRsZV9CQlAgICAgICAgICAgMHg3CisjZGVmaW5lIGJSeEhUU2V0dGxlX0hTU0kgICAgICAgICAweDgKKyNkZWZpbmUgYlJ4SFRTZXR0bGVfUnhIUCAgICAgICAgIDB4NzAKKyNkZWZpbmUgYlJ4SFRTZXR0bGVfQkJQUFcgICAgICAgIDB4ODAKKyNkZWZpbmUgYlJ4SFRTZXR0bGVfSWRsZSAgICAgICAgIDB4MzAwCisjZGVmaW5lIGJSeEhUU2V0dGxlX1Jlc2VydmVkICAgICAweDFjMDAKKyNkZWZpbmUgYlJ4SFRSeEhQRW4gICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBiUnhIVEFHQ0ZyZWV6ZVRocmVzICAgICAgMHgzMDAwMAorI2RlZmluZSBiUnhIVEFHQ1RvZ2V0aGVyRW4gICAgICAgMHg0MDAwMAorI2RlZmluZSBiUnhIVEFHQ01pbiAgICAgICAgICAgICAgMHg4MDAwMAorI2RlZmluZSBiUnhIVEFHQ0VuICAgICAgICAgICAgICAgMHgxMDAwMDAKKyNkZWZpbmUgYlJ4SFREQUdDRW4gICAgICAgICAgICAgIDB4MjAwMDAwCisjZGVmaW5lIGJSeEhUUnhIUF9CQlAgICAgICAgICAgICAweDFjMDAwMDAKKyNkZWZpbmUgYlJ4SFRSeEhQX0ZpbmFsICAgICAgICAgIDB4ZTAwMDAwMDAKKyNkZWZpbmUgYlJ4UFdSYXRpb1RIICAgICAgICAgICAgIDB4MworI2RlZmluZSBiUnhQV1JhdGlvRW4gICAgICAgICAgICAgMHg0CisjZGVmaW5lIGJSeE1GSG9sZCAgICAgICAgICAgICAgICAweDM4MDAKKyNkZWZpbmUgYlJ4UERfRGVsYXlfVEgxICAgICAgICAgIDB4MzgKKyNkZWZpbmUgYlJ4UERfRGVsYXlfVEgyICAgICAgICAgIDB4MWMwCisjZGVmaW5lIGJSeFBEX0RDX0NPVU5UX01BWCAgICAgICAweDYwMAorI2RlZmluZSBiUnhQRF9EZWxheV9USCAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIGJSeFByb2Nlc3NfRGVsYXkgICAgICAgICAweGYwMDAwCisjZGVmaW5lIGJSeFNlYXJjaHJhbmdlX0dJMl9FYXJseSAweDcwMDAwMAorI2RlZmluZSBiUnhGcmFtZV9HdWFyZF9Db3VudGVyX0wgMHgzODAwMDAwCisjZGVmaW5lIGJSeFNHSV9HdWFyZF9MICAgICAgICAgICAweGMwMDAwMDAKKyNkZWZpbmUgYlJ4U0dJX1NlYXJjaF9MICAgICAgICAgIDB4MzAwMDAwMDAKKyNkZWZpbmUgYlJ4U0dJX1RIICAgICAgICAgICAgICAgIDB4YzAwMDAwMDAKKyNkZWZpbmUgYkRGU0NudDAgICAgICAgICAgICAgICAgIDB4ZmYKKyNkZWZpbmUgYkRGU0NudDEgICAgICAgICAgICAgICAgIDB4ZmYwMAorI2RlZmluZSBiREZTRmxhZyAgICAgICAgICAgICAgICAgMHhmMDAwMAorCisjZGVmaW5lIGJNRldlaWdodFN1bSAgICAgICAgICAgICAweDMwMDAwMAorI2RlZmluZSBiTWluSWR4VEggICAgICAgICAgICAgICAgMHg3ZjAwMDAwMAorCisjZGVmaW5lIGJEQUZvcm1hdCAgICAgICAgICAgICAgICAweDQwMDAwCisKKyNkZWZpbmUgYlR4Q2hFbXVFbmFibGUgICAgICAgICAgIDB4MDEwMDAwMDAKKworI2RlZmluZSBiVFJTV0lzb2xhdGlvbl9BICAgICAgICAgMHg3ZgorI2RlZmluZSBiVFJTV0lzb2xhdGlvbl9CICAgICAgICAgMHg3ZjAwCisjZGVmaW5lIGJUUlNXSXNvbGF0aW9uX0MgICAgICAgICAweDdmMDAwMAorI2RlZmluZSBiVFJTV0lzb2xhdGlvbl9EICAgICAgICAgMHg3ZjAwMDAwMAorCisjZGVmaW5lIGJFeHRMTkFHYWluICAgICAgICAgICAgICAweDdjMDAKKworI2RlZmluZSBiU1RCQ0VuICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lIGJBbnRlbm5hTWFwcGluZyAgICAgICAgICAweDEwCisjZGVmaW5lIGJOc3MgICAgICAgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIGJDRk9BbnRTdW1EICAgICAgICAgICAgICAweDIwMAorI2RlZmluZSBiUEhZQ291bnRlclJlc2V0ICAgICAgICAgMHg4MDAwMDAwCisjZGVmaW5lIGJDRk9SZXBvcnRHZXQgICAgICAgICAgICAweDQwMDAwMDAKKyNkZWZpbmUgYk9GRE1Db250aW51ZVR4ICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgYk9GRE1TaW5nbGVDYXJyaWVyICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgYk9GRE1TaW5nbGVUb25lICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgYkhURGV0ZWN0ICAgICAgICAgICAgICAgIDB4MTAwCisjZGVmaW5lIGJDRk9FbiAgICAgICAgICAgICAgICAgICAweDEwMDAwCisjZGVmaW5lIGJDRk9WYWx1ZSAgICAgICAgICAgICAgICAweGZmZjAwMDAwCisjZGVmaW5lIGJTaWdUb25lX1JlICAgICAgICAgICAgICAweDNmCisjZGVmaW5lIGJTaWdUb25lX0ltICAgICAgICAgICAgICAweDdmMDAKKyNkZWZpbmUgYkNvdW50ZXJfQ0NBICAgICAgICAgICAgIDB4ZmZmZgorI2RlZmluZSBiQ291bnRlcl9QYXJpdHlGYWlsICAgICAgMHhmZmZmMDAwMAorI2RlZmluZSBiQ291bnRlcl9SYXRlSWxsZWdhbCAgICAgMHhmZmZmCisjZGVmaW5lIGJDb3VudGVyX0NSQzhGYWlsICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIGJDb3VudGVyX01DU05vU3VwcG9ydCAgICAweGZmZmYKKyNkZWZpbmUgYkNvdW50ZXJfRmFzdFN5bmMgICAgICAgIDB4ZmZmZgorI2RlZmluZSBiU2hvcnRDRk8gICAgICAgICAgICAgICAgMHhmZmYKKyNkZWZpbmUgYlNob3J0Q0ZPVExlbmd0aCAgICAgICAgIDEyCisjZGVmaW5lIGJTaG9ydENGT0ZMZW5ndGggICAgICAgICAxMQorI2RlZmluZSBiTG9uZ0NGTyAgICAgICAgICAgICAgICAgMHg3ZmYKKyNkZWZpbmUgYkxvbmdDRk9UTGVuZ3RoICAgICAgICAgIDExCisjZGVmaW5lIGJMb25nQ0ZPRkxlbmd0aCAgICAgICAgICAxMQorI2RlZmluZSBiVGFpbENGTyAgICAgICAgICAgICAgICAgMHgxZmZmCisjZGVmaW5lIGJUYWlsQ0ZPVExlbmd0aCAgICAgICAgICAxMworI2RlZmluZSBiVGFpbENGT0ZMZW5ndGggICAgICAgICAgMTIKKworI2RlZmluZSBibWF4X2VuX3B3ZEIgICAgICAgICAgICAgMHhmZmZmCisjZGVmaW5lIGJDQ19wb3dlcl9kQiAgICAgICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIGJub2lzZV9wd2RCICAgICAgICAgICAgICAweGZmZmYKKyNkZWZpbmUgYlBvd2VyTWVhc1RMZW5ndGggICAgICAgIDEwCisjZGVmaW5lIGJQb3dlck1lYXNGTGVuZ3RoICAgICAgICAzCisjZGVmaW5lIGJSeF9IVF9CVyAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgYlJ4U0MgICAgICAgICAgICAgICAgICAgIDB4NgorI2RlZmluZSBiUnhfSFQgICAgICAgICAgICAgICAgICAgMHg4CisKKyNkZWZpbmUgYk5CX2ludGZfZGV0X29uICAgICAgICAgIDB4MQorI2RlZmluZSBiSW50Zl93aW5fbGVuX2NmZyAgICAgICAgMHgzMAorI2RlZmluZSBiTkJfSW50Zl9USF9jZmcgICAgICAgICAgMHgxYzAKKworI2RlZmluZSBiUkZHYWluICAgICAgICAgICAgICAgICAgMHgzZgorI2RlZmluZSBiVGFibGVTZWwgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBiVFJTVyAgICAgICAgICAgICAgICAgICAgMHg4MAorCisjZGVmaW5lIGJSeFNOUl9BICAgICAgICAgICAgICAgICAweGZmCisjZGVmaW5lIGJSeFNOUl9CICAgICAgICAgICAgICAgICAweGZmMDAKKyNkZWZpbmUgYlJ4U05SX0MgICAgICAgICAgICAgICAgIDB4ZmYwMDAwCisjZGVmaW5lIGJSeFNOUl9EICAgICAgICAgICAgICAgICAweGZmMDAwMDAwCisjZGVmaW5lIGJTTlJFVk1UTGVuZ3RoICAgICAgICAgICA4CisjZGVmaW5lIGJTTlJFVk1GTGVuZ3RoICAgICAgICAgICAxCisKKyNkZWZpbmUgYkNTSTFzdCAgICAgICAgICAgICAgICAgIDB4ZmYKKyNkZWZpbmUgYkNTSTJuZCAgICAgICAgICAgICAgICAgIDB4ZmYwMAorI2RlZmluZSBiUnhFVk0xc3QgICAgICAgICAgICAgICAgMHhmZjAwMDAKKyNkZWZpbmUgYlJ4RVZNMm5kICAgICAgICAgICAgICAgIDB4ZmYwMDAwMDAKKworI2RlZmluZSBiU0lHRVZNICAgICAgICAgICAgICAgICAgMHhmZgorI2RlZmluZSBiUFdEQiAgICAgICAgICAgICAgICAgICAgMHhmZjAwCisjZGVmaW5lIGJTR0lFTiAgICAgICAgICAgICAgICAgICAweDEwMDAwCisKKyNkZWZpbmUgYlNGYWN0b3JRQU0xICAgICAgICAgICAgIDB4ZgorI2RlZmluZSBiU0ZhY3RvclFBTTIgICAgICAgICAgICAgMHhmMAorI2RlZmluZSBiU0ZhY3RvclFBTTMgICAgICAgICAgICAgMHhmMDAKKyNkZWZpbmUgYlNGYWN0b3JRQU00ICAgICAgICAgICAgIDB4ZjAwMAorI2RlZmluZSBiU0ZhY3RvclFBTTUgICAgICAgICAgICAgMHhmMDAwMAorI2RlZmluZSBiU0ZhY3RvclFBTTYgICAgICAgICAgICAgMHhmMDAwMAorI2RlZmluZSBiU0ZhY3RvclFBTTcgICAgICAgICAgICAgMHhmMDAwMDAKKyNkZWZpbmUgYlNGYWN0b3JRQU04ICAgICAgICAgICAgIDB4ZjAwMDAwMAorI2RlZmluZSBiU0ZhY3RvclFBTTkgICAgICAgICAgICAgMHhmMDAwMDAwMAorI2RlZmluZSBiQ1NJU2NoZW1lICAgICAgICAgICAgICAgMHgxMDAwMDAKKworI2RlZmluZSBiTm9pc2VMdmxUb3BTZXQgICAgICAgICAgMHgzCisjZGVmaW5lIGJDaFNtb290aCAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgYkNoU21vb3RoQ2ZnMSAgICAgICAgICAgIDB4MzgKKyNkZWZpbmUgYkNoU21vb3RoQ2ZnMiAgICAgICAgICAgIDB4MWMwCisjZGVmaW5lIGJDaFNtb290aENmZzMgICAgICAgICAgICAweGUwMAorI2RlZmluZSBiQ2hTbW9vdGhDZmc0ICAgICAgICAgICAgMHg3MDAwCisjZGVmaW5lIGJNUkNNb2RlICAgICAgICAgICAgICAgICAweDgwMDAwMAorI2RlZmluZSBiVEhFVk1DZmcgICAgICAgICAgICAgICAgMHg3MDAwMDAwCisKKyNkZWZpbmUgYkxvb3BGaXRUeXBlICAgICAgICAgICAgIDB4MQorI2RlZmluZSBiVXBkQ0ZPICAgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBiVXBkQ0ZPT2ZmRGF0YSAgICAgICAgICAgMHg4MAorI2RlZmluZSBiQWR2VXBkQ0ZPICAgICAgICAgICAgICAgMHgxMDAKKyNkZWZpbmUgYkFkdlRpbWVDdHJsICAgICAgICAgICAgIDB4ODAwCisjZGVmaW5lIGJVcGRDbGtvICAgICAgICAgICAgICAgICAweDEwMDAKKyNkZWZpbmUgYkZDICAgICAgICAgICAgICAgICAgICAgIDB4NjAwMAorI2RlZmluZSBiVHJhY2tpbmdNb2RlICAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIGJQaENtcEVuYWJsZSAgICAgICAgICAgICAweDEwMDAwCisjZGVmaW5lIGJVcGRDbGtvTFRGICAgICAgICAgICAgICAweDIwMDAwCisjZGVmaW5lIGJDb21DaENGTyAgICAgICAgICAgICAgICAweDQwMDAwCisjZGVmaW5lIGJDU0lFc3RpTW9kZSAgICAgICAgICAgICAweDgwMDAwCisjZGVmaW5lIGJBZHZVcGRFcXogICAgICAgICAgICAgICAweDEwMDAwMAorI2RlZmluZSBiVUNoQ2ZnICAgICAgICAgICAgICAgICAgMHg3MDAwMDAwCisjZGVmaW5lIGJVcGRFcXogICAgICAgICAgICAgICAgICAweDgwMDAwMDAKKworI2RlZmluZSBiVHhBR0NSYXRlMThfMDYJCQkweDdmN2Y3ZjdmCisjZGVmaW5lIGJUeEFHQ1JhdGU1NF8yNAkJCTB4N2Y3ZjdmN2YKKyNkZWZpbmUgYlR4QUdDUmF0ZU1DUzMyCQkweDdmCisjZGVmaW5lIGJUeEFHQ1JhdGVDQ0sJCQkweDdmMDAKKyNkZWZpbmUgYlR4QUdDUmF0ZU1DUzNfTUNTMAkweDdmN2Y3ZjdmCisjZGVmaW5lIGJUeEFHQ1JhdGVNQ1M3X01DUzQJMHg3ZjdmN2Y3ZgorI2RlZmluZSBiVHhBR0NSYXRlTUNTMTFfTUNTOAkweDdmN2Y3ZjdmCisjZGVmaW5lIGJUeEFHQ1JhdGVNQ1MxNV9NQ1MxMgkweDdmN2Y3ZjdmCisKKworI2RlZmluZSBiUnhQZXN1ZG9Ob2lzZU9uICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBiUnhQZXN1ZG9Ob2lzZV9BICAgICAgICAgMHhmZgorI2RlZmluZSBiUnhQZXN1ZG9Ob2lzZV9CICAgICAgICAgMHhmZjAwCisjZGVmaW5lIGJSeFBlc3Vkb05vaXNlX0MgICAgICAgICAweGZmMDAwMAorI2RlZmluZSBiUnhQZXN1ZG9Ob2lzZV9EICAgICAgICAgMHhmZjAwMDAwMAorI2RlZmluZSBiUGVzdWRvTm9pc2VTdGF0ZV9BICAgICAgMHhmZmZmCisjZGVmaW5lIGJQZXN1ZG9Ob2lzZVN0YXRlX0IgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIGJQZXN1ZG9Ob2lzZVN0YXRlX0MgICAgICAweGZmZmYKKyNkZWZpbmUgYlBlc3Vkb05vaXNlU3RhdGVfRCAgICAgIDB4ZmZmZjAwMDAKKworI2RlZmluZSBiWmVicmExX0hTU0lFbmFibGUgICAgICAgIDB4OAorI2RlZmluZSBiWmVicmExX1RSeENvbnRyb2wgICAgICAgIDB4YzAwCisjZGVmaW5lIGJaZWJyYTFfVFJ4R2FpblNldHRpbmcgICAgMHgwN2YKKyNkZWZpbmUgYlplYnJhMV9SeENvcm5lciAgICAgICAgICAweGMwMAorI2RlZmluZSBiWmVicmExX1R4Q2hhcmdlUHVtcCAgICAgIDB4MzgKKyNkZWZpbmUgYlplYnJhMV9SeENoYXJnZVB1bXAgICAgICAweDcKKyNkZWZpbmUgYlplYnJhMV9DaGFubmVsTnVtICAgICAgICAweGY4MAorI2RlZmluZSBiWmVicmExX1R4TFBGQlcgICAgICAgICAgIDB4NDAwCisjZGVmaW5lIGJaZWJyYTFfUnhMUEZCVyAgICAgICAgICAgMHg2MDAKKworI2RlZmluZSBiUlRMODI1NlJlZ01vZGVDdHJsMSAgICAgIDB4MTAwCisjZGVmaW5lIGJSVEw4MjU2UmVnTW9kZUN0cmwwICAgICAgMHg0MAorI2RlZmluZSBiUlRMODI1Nl9UeExQRkJXICAgICAgICAgIDB4MTgKKyNkZWZpbmUgYlJUTDgyNTZfUnhMUEZCVyAgICAgICAgICAweDYwMAorCisjZGVmaW5lIGJSVEw4MjU4X1R4TFBGQlcgICAgICAgICAgMHhjCisjZGVmaW5lIGJSVEw4MjU4X1J4TFBGQlcgICAgICAgICAgMHhjMDAKKyNkZWZpbmUgYlJUTDgyNThfUlNTSUxQRkJXICAgICAgICAweGMwCisKKyNkZWZpbmUgYkJ5dGUwICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgYkJ5dGUxICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgYkJ5dGUyICAgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgYkJ5dGUzICAgICAgICAgICAgICAgICAgICAweDgKKyNkZWZpbmUgYldvcmQwICAgICAgICAgICAgICAgICAgICAweDMKKyNkZWZpbmUgYldvcmQxICAgICAgICAgICAgICAgICAgICAweGMKKyNkZWZpbmUgYkRXb3JkICAgICAgICAgICAgICAgICAgICAweGYKKworI2RlZmluZSBiTWFza0J5dGUwICAgICAgICAgICAgICAgIDB4ZmYKKyNkZWZpbmUgYk1hc2tCeXRlMSAgICAgICAgICAgICAgICAweGZmMDAKKyNkZWZpbmUgYk1hc2tCeXRlMiAgICAgICAgICAgICAgICAweGZmMDAwMAorI2RlZmluZSBiTWFza0J5dGUzICAgICAgICAgICAgICAgIDB4ZmYwMDAwMDAKKyNkZWZpbmUgYk1hc2tIV29yZCAgICAgICAgICAgICAgICAweGZmZmYwMDAwCisjZGVmaW5lIGJNYXNrTFdvcmQgICAgICAgICAgICAgICAgMHgwMDAwZmZmZgorI2RlZmluZSBiTWFza0RXb3JkICAgICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKworI2RlZmluZSBiTWFzazEyQml0cyAgICAgICAgICAgICAgIDB4ZmZmCisKKyNkZWZpbmUgYkVuYWJsZSAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgYkRpc2FibGUgICAgICAgICAgICAgICAgICAweDAKKworI2RlZmluZSBMZWZ0QW50ZW5uYSAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBSaWdodEFudGVubmEgICAgICAgICAgICAgIDB4MQorCisjZGVmaW5lIHRDaGVja1R4U3RhdHVzICAgICAgICAgICAgNTAwCisjZGVmaW5lIHRVcGRhdGVSeENvdW50ZXIgICAgICAgICAgMTAwCisKKyNkZWZpbmUgcmF0ZUNDSyAgICAgMAorI2RlZmluZSByYXRlT0ZETSAgICAxCisjZGVmaW5lIHJhdGVIVCAgICAgIDIKKworI2RlZmluZSBiUE1BQ19FbmQgICAgICAgICAgICAgICAgIDB4MWZmCisjZGVmaW5lIGJGUEdBUEhZMF9FbmQgICAgICAgICAgICAgMHg4ZmYKKyNkZWZpbmUgYkZQR0FQSFkxX0VuZCAgICAgICAgICAgICAweDlmZgorI2RlZmluZSBiQ0NLUEhZMF9FbmQgICAgICAgICAgICAgIDB4YWZmCisjZGVmaW5lIGJPRkRNUEhZMF9FbmQgICAgICAgICAgICAgMHhjZmYKKyNkZWZpbmUgYk9GRE1QSFkxX0VuZCAgICAgICAgICAgICAweGRmZgorCisKKyNkZWZpbmUgYlBNQUNDb250cm9sICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgYldNQUNDb250cm9sICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgYldOSUNDb250cm9sICAgICAgICAgICAgICAweDIKKworI2RlZmluZSBQYXRoQSAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSBQYXRoQiAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSBQYXRoQyAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBQYXRoRCAgICAgICAgICAgICAgICAgICAgIDB4MworCisjZGVmaW5lCXJSVEw4MjU2UnhNaXhlclBvbGUJCTB4YgorI2RlZmluZQkJYlplYnJhUnhNaXhlclBvbGUJCTB4NgorI2RlZmluZQkJclJUTDgyNTZUeEJCT1BCaWFzICAgICAgICAweDkKKyNkZWZpbmUJCWJSVEw4MjU2VHhCQk9QQmlhcyAgICAgICAweDQwMAorI2RlZmluZQkJclJUTDgyNTZUeEJCQlcgICAgICAgICAgICAgMTkKKyNkZWZpbmUJCWJSVEw4MjU2VHhCQkJXCQkJMHgxOAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5MkVfd3guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRhZDkxYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX3d4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYzICswLDAgQEAKLS8qCi0gICBUaGlzIGZpbGUgY29udGFpbnMgd2lyZWxlc3MgZXh0ZW5zaW9uIGhhbmRsZXJzLgotCi0gICBUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlci4KLSAgIENvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNC0yMDA1ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+Ci0gICBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQotCi0gICBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEdQTCBwYXJ0Ci0gICBvZiB0aGUgb2ZmaWNpYWwgcmVhbHRlayBkcml2ZXIuCi0KLSAgIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgcnRsODE4MCBkcml2ZXIgc2tlbGV0b24KLSAgIGZyb20gUGF0cmljIFNjaGVua2UgJiBBbmRyZXMgU2Fsb21vbi4KLQotICAgUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBJbnRlbCBQcm8gV2lyZWxlc3MgMjEwMCBHUEwgZHJpdmVyLgotCi0gICBXZSB3YW50IHRvIHRhbmtzIHRoZSBBdXRob3JzIG9mIHRob3NlIHByb2plY3RzIGFuZCB0aGUgTmRpc3dyYXBwZXIKLSAgIHByb2plY3QgQXV0aG9ycy4KLSovCi0KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlICJyODE5MkUuaCIKLSNpbmNsdWRlICJyODE5MkVfaHcuaCIKLSNpbmNsdWRlICJyODE5MkVfd3guaCIKLSNpZmRlZiBFTkFCTEVfRE9UMTFECi0jaW5jbHVkZSAiaWVlZTgwMjExL2RvdDExZC5oIgotI2VuZGlmCi0KLSNkZWZpbmUgUkFURV9DT1VOVCAxMgotc3RhdGljIGNvbnN0IHUzMiBydGw4MTgwX3JhdGVzW10gPSB7MTAwMDAwMCwyMDAwMDAwLDU1MDAwMDAsMTEwMDAwMDAsCi0JNjAwMDAwMCw5MDAwMDAwLDEyMDAwMDAwLDE4MDAwMDAwLDI0MDAwMDAwLDM2MDAwMDAwLDQ4MDAwMDAwLDU0MDAwMDAwfTsKLQotCi0jaWZuZGVmIEVORVRET1dOCi0jZGVmaW5lIEVORVRET1dOIDEKLSNlbmRpZgotc3RhdGljIGludCByODE5Ml93eF9nZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAotCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQotCXJldHVybiBpZWVlODAyMTFfd3hfZ2V0X2ZyZXEocHJpdi0+aWVlZTgwMjExLGEsd3JxdSxiKTsKLX0KLQotCi1zdGF0aWMgaW50IHI4MTkyX3d4X2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCi0JCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCi17Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXY9aWVlZTgwMjExX3ByaXYoZGV2KTsKLQotCXJldHVybiBpZWVlODAyMTFfd3hfZ2V0X21vZGUocHJpdi0+aWVlZTgwMjExLGEsd3JxdSxiKTsKLX0KLQotCi0KLXN0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCXJldHVybiBpZWVlODAyMTFfd3hfZ2V0X3JhdGUocHJpdi0+aWVlZTgwMjExLGluZm8sd3JxdSxleHRyYSk7Ci19Ci0KLQotCi1zdGF0aWMgaW50IHI4MTkyX3d4X3NldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCWludCByZXQ7Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCi0JaWYgKHByaXYtPmJId1JhZGlvT2ZmKQotCQlyZXR1cm4gMDsKLQotCWRvd24oJnByaXYtPnd4X3NlbSk7Ci0KLQlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X3JhdGUocHJpdi0+aWVlZTgwMjExLGluZm8sd3JxdSxleHRyYSk7Ci0KLQl1cCgmcHJpdi0+d3hfc2VtKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIGludCByODE5Ml93eF9zZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCWludCByZXQ7Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCi0JaWYgKHByaXYtPmJId1JhZGlvT2ZmKQotCQlyZXR1cm4gMDsKLQotCWRvd24oJnByaXYtPnd4X3NlbSk7Ci0KLQlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X3J0cyhwcml2LT5pZWVlODAyMTEsaW5mbyx3cnF1LGV4dHJhKTsKLQotCXVwKCZwcml2LT53eF9zZW0pOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCByODE5Ml93eF9nZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQlyZXR1cm4gaWVlZTgwMjExX3d4X2dldF9ydHMocHJpdi0+aWVlZTgwMjExLGluZm8sd3JxdSxleHRyYSk7Ci19Ci0KLXN0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X3Bvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCWludCByZXQ7Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCi0JaWYgKHByaXYtPmJId1JhZGlvT2ZmKQotCQlyZXR1cm4gMDsKLQotCWRvd24oJnByaXYtPnd4X3NlbSk7Ci0KLQlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X3Bvd2VyKHByaXYtPmllZWU4MDIxMSxpbmZvLHdycXUsZXh0cmEpOwotCi0JdXAoJnByaXYtPnd4X3NlbSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHI4MTkyX3d4X2dldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0JcmV0dXJuIGllZWU4MDIxMV93eF9nZXRfcG93ZXIocHJpdi0+aWVlZTgwMjExLGluZm8sd3JxdSxleHRyYSk7Ci19Ci0KLXN0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X3Jhd3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0JaW50IHJldDsKLQotCWlmIChwcml2LT5iSHdSYWRpb09mZikKLQkJcmV0dXJuIDA7Ci0KLQlkb3duKCZwcml2LT53eF9zZW0pOwotCi0JcmV0ID0gaWVlZTgwMjExX3d4X3NldF9yYXd0eChwcml2LT5pZWVlODAyMTEsIGluZm8sIHdycXUsIGV4dHJhKTsKLQotCXVwKCZwcml2LT53eF9zZW0pOwotCi0JcmV0dXJuIHJldDsKLQotfQotCi1zdGF0aWMgaW50IHI4MTkyX3d4X2ZvcmNlX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQotCWRvd24oJnByaXYtPnd4X3NlbSk7Ci0KLQlwcmludGsoIiVzKCk6IGZvcmNlIHJlc2V0ICEgZXh0cmEgaXMgJWRcbiIsX19GVU5DVElPTl9fLCAqZXh0cmEpOwotCXByaXYtPmZvcmNlX3Jlc2V0ID0gKmV4dHJhOwotCXVwKCZwcml2LT53eF9zZW0pOwotCXJldHVybiAwOwotCi19Ci0KLQotc3RhdGljIGludCByODE5Ml93eF9zZXRfY3JjbW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0JaW50ICpwYXJtcyA9IChpbnQgKilleHRyYTsKLQlpbnQgZW5hYmxlID0gKHBhcm1zWzBdID4gMCk7Ci0Jc2hvcnQgcHJldiA9IHByaXYtPmNyY21vbjsKLQotCWlmIChwcml2LT5iSHdSYWRpb09mZikKLQkJcmV0dXJuIDA7Ci0KLQlkb3duKCZwcml2LT53eF9zZW0pOwotCi0JaWYoZW5hYmxlKQotCQlwcml2LT5jcmNtb249MTsKLQllbHNlCi0JCXByaXYtPmNyY21vbj0wOwotCi0JRE1FU0coImJhZCBDUkMgaW4gbW9uaXRvciBtb2RlIGFyZSAlcyIsCi0JICAgICAgcHJpdi0+Y3JjbW9uID8gImFjY2VwdGVkIiA6ICJyZWplY3RlZCIpOwotCi0JaWYocHJldiAhPSBwcml2LT5jcmNtb24gJiYgcHJpdi0+dXApewotCQkvL3J0bDgxODBfZG93bihkZXYpOwotCQkvL3J0bDgxODBfdXAoZGV2KTsKLQl9Ci0KLQl1cCgmcHJpdi0+d3hfc2VtKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHI4MTkyX3d4X3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCi0JCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCi17Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCVJUX1JGX1BPV0VSX1NUQVRFCXJ0U3RhdGU7Ci0JaW50IHJldDsKLQotCWlmIChwcml2LT5iSHdSYWRpb09mZikKLQkJcmV0dXJuIDA7Ci0KLQlydFN0YXRlID0gcHJpdi0+ZVJGUG93ZXJTdGF0ZTsKLQlkb3duKCZwcml2LT53eF9zZW0pOwotI2lmZGVmIEVOQUJMRV9JUFMKLQlpZih3cnF1LT5tb2RlID09IElXX01PREVfQURIT0MpewotCi0JCWlmIChwcml2LT5Qb3dlclNhdmVDb250cm9sLmJJbmFjdGl2ZVBzKSB7Ci0JCQlpZihydFN0YXRlID09IGVSZk9mZil7Ci0JCQkJaWYocHJpdi0+UmZPZmZSZWFzb24gPiBSRl9DSEFOR0VfQllfSVBTKQotCQkJCXsKLQkJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICIlcygpOiBSRiBpcyBPRkYuXG4iLF9fRlVOQ1RJT05fXyk7Ci0JCQkJCXVwKCZwcml2LT53eF9zZW0pOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCWVsc2V7Ci0JCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiJXMoKTogSVBTTGVhdmVcbiIsX19GVU5DVElPTl9fKTsKLQkJCQkJZG93bigmcHJpdi0+aWVlZTgwMjExLT5pcHNfc2VtKTsKLQkJCQkJSVBTTGVhdmUocHJpdik7Ci0JCQkJCXVwKCZwcml2LT5pZWVlODAyMTEtPmlwc19zZW0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLSNlbmRpZgotCXJldCA9IGllZWU4MDIxMV93eF9zZXRfbW9kZShwcml2LT5pZWVlODAyMTEsYSx3cnF1LGIpOwotCi0JLy9ydGw4MTg3X3NldF9yeGNvbmYoZGV2KTsKLQotCXVwKCZwcml2LT53eF9zZW0pOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0cnVjdCAgaXdfcmFuZ2Vfd2l0aF9zY2FuX2NhcGEKLXsKLSAgICAgICAgLyogSW5mb3JtYXRpdmUgc3R1ZmYgKHRvIGNob29zZSBiZXR3ZWVuIGRpZmZlcmVudCBpbnRlcmZhY2UpICovCi0gICAgICAgIF9fdTMyICAgICAgICAgICB0aHJvdWdocHV0OyAgICAgLyogVG8gZ2l2ZSBhbiBpZGVhLi4uICovCi0gICAgICAgIC8qIEluIHRoZW9yeSB0aGlzIHZhbHVlIHNob3VsZCBiZSB0aGUgbWF4aW11bSBiZW5jaG1hcmtlZAotICAgICAgICAgKiBUQ1AvSVAgdGhyb3VnaHB1dCwgYmVjYXVzZSB3aXRoIG1vc3Qgb2YgdGhlc2UgZGV2aWNlcyB0aGUKLSAgICAgICAgICogYml0IHJhdGUgaXMgbWVhbmluZ2xlc3MgKG92ZXJoZWFkIGFuIGNvKSB0byBlc3RpbWF0ZSBob3cKLSAgICAgICAgICogZmFzdCB0aGUgY29ubmVjdGlvbiB3aWxsIGdvIGFuZCBwaWNrIHRoZSBmYXN0ZXN0IG9uZS4KLSAgICAgICAgICogSSBzdWdnZXN0IHBlb3BsZSB0byBwbGF5IHdpdGggTmV0cGVyZiBvciBhbnkgYmVuY2htYXJrLi4uCi0gICAgICAgICAqLwotCi0gICAgICAgIC8qIE5XSUQgKG9yIGRvbWFpbiBpZCkgKi8KLSAgICAgICAgX191MzIgICAgICAgICAgIG1pbl9ud2lkOyAgICAgICAvKiBNaW5pbWFsIE5XSUQgd2UgYXJlIGFibGUgdG8gc2V0ICovCi0gICAgICAgIF9fdTMyICAgICAgICAgICBtYXhfbndpZDsgICAgICAgLyogTWF4aW1hbCBOV0lEIHdlIGFyZSBhYmxlIHRvIHNldCAqLwotCi0gICAgICAgIC8qIE9sZCBGcmVxdWVuY3kgKGJhY2t3YXJkIGNvbXBhdCAtIG1vdmVkIGxvd2VyICkgKi8KLSAgICAgICAgX191MTYgICAgICAgICAgIG9sZF9udW1fY2hhbm5lbHM7Ci0gICAgICAgIF9fdTggICAgICAgICAgICBvbGRfbnVtX2ZyZXF1ZW5jeTsKLQotICAgICAgICAvKiBTY2FuIGNhcGFiaWxpdGllcyAqLwotICAgICAgICBfX3U4ICAgICAgICAgICAgc2Nhbl9jYXBhOwotfTsKLXN0YXRpYyBpbnQgcnRsODE4MF93eF9nZXRfcmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopZXh0cmE7Ci0Jc3RydWN0IGl3X3JhbmdlX3dpdGhfc2Nhbl9jYXBhKiB0bXAgPSAoc3RydWN0IGl3X3JhbmdlX3dpdGhfc2Nhbl9jYXBhKilyYW5nZTsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0JdTE2IHZhbDsKLQlpbnQgaTsKLQotCXdycXUtPmRhdGEubGVuZ3RoID0gc2l6ZW9mKCpyYW5nZSk7Ci0JbWVtc2V0KHJhbmdlLCAwLCBzaXplb2YoKnJhbmdlKSk7Ci0KLQkvKiBMZXQncyB0cnkgdG8ga2VlcCB0aGlzIHN0cnVjdCBpbiB0aGUgc2FtZSBvcmRlciBhcyBpbgotCSAqIGxpbnV4L2luY2x1ZGUvd2lyZWxlc3MuaAotCSAqLwotCi0JLyogVE9ETzogU2VlIHdoYXQgdmFsdWVzIHdlIGNhbiBzZXQsIGFuZCByZW1vdmUgdGhlIG9uZXMgd2UgY2FuJ3QKLQkgKiBzZXQsIG9yIGZpbGwgdGhlbSB3aXRoIHNvbWUgZGVmYXVsdCBkYXRhLgotCSAqLwotCi0JLyogfjUgTWIvcyByZWFsICg4MDIuMTFiKSAqLwotCXJhbmdlLT50aHJvdWdocHV0ID0gMTMwICogMTAwMCAqIDEwMDA7Ci0KLQkvLyBUT0RPOiBOb3QgdXNlZCBpbiA4MDIuMTFiPwotLy8JcmFuZ2UtPm1pbl9ud2lkOwkvKiBNaW5pbWFsIE5XSUQgd2UgYXJlIGFibGUgdG8gc2V0ICovCi0JLy8gVE9ETzogTm90IHVzZWQgaW4gODAyLjExYj8KLS8vCXJhbmdlLT5tYXhfbndpZDsJLyogTWF4aW1hbCBOV0lEIHdlIGFyZSBhYmxlIHRvIHNldCAqLwotCi0gICAgICAgIC8qIE9sZCBGcmVxdWVuY3kgKGJhY2t3YXJkIGNvbXBhdCAtIG1vdmVkIGxvd2VyICkgKi8KLS8vCXJhbmdlLT5vbGRfbnVtX2NoYW5uZWxzOwotLy8JcmFuZ2UtPm9sZF9udW1fZnJlcXVlbmN5OwotLy8JcmFuZ2UtPm9sZF9mcmVxWzZdOyAvKiBGaWxsZXIgdG8ga2VlcCAidmVyc2lvbiIgYXQgdGhlIHNhbWUgb2Zmc2V0ICovCi0KLQlyYW5nZS0+bWF4X3F1YWwucXVhbCA9IDEwMDsKLQkvKiBUT0RPOiBGaW5kIHJlYWwgbWF4IFJTU0kgYW5kIHN0aWNrIGhlcmUgKi8KLQlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgPSAwOwotCXJhbmdlLT5tYXhfcXVhbC5ub2lzZSA9IC05ODsKLQlyYW5nZS0+bWF4X3F1YWwudXBkYXRlZCA9IDc7IC8qIFVwZGF0ZWQgYWxsIHRocmVlICovCi0KLQlyYW5nZS0+YXZnX3F1YWwucXVhbCA9IDkyOyAvKiA+IDglIG1pc3NlZCBiZWFjb25zIGlzICdiYWQnICovCi0JLyogVE9ETzogRmluZCByZWFsICdnb29kJyB0byAnYmFkJyB0aHJlc2hvbGQgdmFsdWUgZm9yIFJTU0kgKi8KLQlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAyMCArIC05ODsKLQlyYW5nZS0+YXZnX3F1YWwubm9pc2UgPSAwOwotCXJhbmdlLT5hdmdfcXVhbC51cGRhdGVkID0gNzsgLyogVXBkYXRlZCBhbGwgdGhyZWUgKi8KLQotCXJhbmdlLT5udW1fYml0cmF0ZXMgPSBSQVRFX0NPVU5UOwotCi0JZm9yIChpID0gMDsgaSA8IFJBVEVfQ09VTlQgJiYgaSA8IElXX01BWF9CSVRSQVRFUzsgaSsrKSB7Ci0JCXJhbmdlLT5iaXRyYXRlW2ldID0gcnRsODE4MF9yYXRlc1tpXTsKLQl9Ci0KLQlyYW5nZS0+bWluX2ZyYWcgPSBNSU5fRlJBR19USFJFU0hPTEQ7Ci0JcmFuZ2UtPm1heF9mcmFnID0gTUFYX0ZSQUdfVEhSRVNIT0xEOwotCi0JcmFuZ2UtPm1pbl9wbXA9MDsKLQlyYW5nZS0+bWF4X3BtcCA9IDUwMDAwMDA7Ci0JcmFuZ2UtPm1pbl9wbXQgPSAwOwotCXJhbmdlLT5tYXhfcG10ID0gNjU1MzUqMTAwMDsKLQlyYW5nZS0+cG1wX2ZsYWdzID0gSVdfUE9XRVJfUEVSSU9EOwotCXJhbmdlLT5wbXRfZmxhZ3MgPSBJV19QT1dFUl9USU1FT1VUOwotCXJhbmdlLT5wbV9jYXBhID0gSVdfUE9XRVJfUEVSSU9EIHwgSVdfUE9XRVJfVElNRU9VVCB8IElXX1BPV0VSX0FMTF9SOwotCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOwotCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDE4OwotCi0vLwlyYW5nZS0+cmV0cnlfY2FwYTsJLyogV2hhdCByZXRyeSBvcHRpb25zIGFyZSBzdXBwb3J0ZWQgKi8KLS8vCXJhbmdlLT5yZXRyeV9mbGFnczsJLyogSG93IHRvIGRlY29kZSBtYXgvbWluIHJldHJ5IGxpbWl0ICovCi0vLwlyYW5nZS0+cl90aW1lX2ZsYWdzOwkvKiBIb3cgdG8gZGVjb2RlIG1heC9taW4gcmV0cnkgbGlmZSAqLwotLy8JcmFuZ2UtPm1pbl9yZXRyeTsJLyogTWluaW1hbCBudW1iZXIgb2YgcmV0cmllcyAqLwotLy8JcmFuZ2UtPm1heF9yZXRyeTsJLyogTWF4aW1hbCBudW1iZXIgb2YgcmV0cmllcyAqLwotLy8JcmFuZ2UtPm1pbl9yX3RpbWU7CS8qIE1pbmltYWwgcmV0cnkgbGlmZXRpbWUgKi8KLS8vCXJhbmdlLT5tYXhfcl90aW1lOwkvKiBNYXhpbWFsIHJldHJ5IGxpZmV0aW1lICovCi0KLQotCWZvciAoaSA9IDAsIHZhbCA9IDA7IGkgPCAxNDsgaSsrKSB7Ci0KLQkJLy8gSW5jbHVkZSBvbmx5IGxlZ2FsIGZyZXF1ZW5jaWVzIGZvciBzb21lIGNvdW50cmllcwotI2lmZGVmIEVOQUJMRV9ET1QxMUQKLQkJaWYgKChHRVRfRE9UMTFEX0lORk8ocHJpdi0+aWVlZTgwMjExKS0+Y2hhbm5lbF9tYXApW2krMV0pIHsKLSNlbHNlCi0JCWlmICgocHJpdi0+aWVlZTgwMjExLT5jaGFubmVsX21hcClbaSsxXSkgewotI2VuZGlmCi0JCSAgICAgICAgcmFuZ2UtPmZyZXFbdmFsXS5pID0gaSArIDE7Ci0JCQlyYW5nZS0+ZnJlcVt2YWxdLm0gPSBpZWVlODAyMTFfd2xhbl9mcmVxdWVuY2llc1tpXSAqIDEwMDAwMDsKLQkJCXJhbmdlLT5mcmVxW3ZhbF0uZSA9IDE7Ci0JCQl2YWwrKzsKLQkJfSBlbHNlIHsKLQkJCS8vIEZJWE1FOiBkbyB3ZSBuZWVkIHRvIHNldCBhbnl0aGluZyBmb3IgY2hhbm5lbHMKLQkJCS8vIHdlIGRvbid0IHVzZSA/Ci0JCX0KLQotCQlpZiAodmFsID09IElXX01BWF9GUkVRVUVOQ0lFUykKLQkJYnJlYWs7Ci0JfQotCXJhbmdlLT5udW1fZnJlcXVlbmN5ID0gdmFsOwotCXJhbmdlLT5udW1fY2hhbm5lbHMgPSB2YWw7Ci0KLQlyYW5nZS0+ZW5jX2NhcGEgPSBJV19FTkNfQ0FQQV9XUEF8SVdfRU5DX0NBUEFfV1BBMnwKLQkJCSAgSVdfRU5DX0NBUEFfQ0lQSEVSX1RLSVB8SVdfRU5DX0NBUEFfQ0lQSEVSX0NDTVA7Ci0KLQl0bXAtPnNjYW5fY2FwYSA9IDB4MDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCByODE5Ml93eF9zZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAotCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKLQlSVF9SRl9QT1dFUl9TVEFURQlydFN0YXRlOwotCWludCByZXQ7Ci0KLQlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCi0JCXJldHVybiAwOwotCi0JcnRTdGF0ZSA9IHByaXYtPmVSRlBvd2VyU3RhdGU7Ci0KLQlpZighcHJpdi0+dXApIHJldHVybiAtRU5FVERPV047Ci0JaWYgKHByaXYtPmllZWU4MDIxMS0+TGlua0RldGVjdEluZm8uYkJ1c3lUcmFmZmljID09IHRydWUpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JaWYgKHdycXUtPmRhdGEuZmxhZ3MgJiBJV19TQ0FOX1RISVNfRVNTSUQpCi0JewotCQlzdHJ1Y3QgaXdfc2Nhbl9yZXEqIHJlcSA9IChzdHJ1Y3QgaXdfc2Nhbl9yZXEqKWI7Ci0JCWlmIChyZXEtPmVzc2lkX2xlbikKLQkJewotCQkJLy9wcmludGsoIj09KiomKiYqJioqPT09PnNjYW4gc2V0IHNzaWQ6JXNcbiIsIHJlcS0+ZXNzaWQpOwotCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID0gcmVxLT5lc3NpZF9sZW47Ci0JCQltZW1jcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIHJlcS0+ZXNzaWQsIHJlcS0+ZXNzaWRfbGVuKTsKLQkJCS8vcHJpbnRrKCI9PT09PT5uZXR3b3JrIHNzaWQ6JXNcbiIsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkKTsKLQkJfQotCX0KLQotCWRvd24oJnByaXYtPnd4X3NlbSk7Ci0jaWZkZWYgRU5BQkxFX0lQUwotCXByaXYtPmllZWU4MDIxMS0+YWN0c2Nhbm5pbmcgPSB0cnVlOwotCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCl7Ci0JCWlmIChwcml2LT5Qb3dlclNhdmVDb250cm9sLmJJbmFjdGl2ZVBzKSB7Ci0JCQlpZihydFN0YXRlID09IGVSZk9mZil7Ci0JCQkJaWYocHJpdi0+UmZPZmZSZWFzb24gPiBSRl9DSEFOR0VfQllfSVBTKQotCQkJCXsKLQkJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICIlcygpOiBSRiBpcyBPRkYuXG4iLF9fRlVOQ1RJT05fXyk7Ci0JCQkJCXVwKCZwcml2LT53eF9zZW0pOwotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCWVsc2V7Ci0JCQkJCS8vUlRfVFJBQ0UoQ09NUF9QUywgIiVzKCk6IElQU0xlYXZlXG4iLF9fRlVOQ1RJT05fXyk7Ci0JCQkJCWRvd24oJnByaXYtPmllZWU4MDIxMS0+aXBzX3NlbSk7Ci0JCQkJCUlQU0xlYXZlKHByaXYpOwotCQkJCQl1cCgmcHJpdi0+aWVlZTgwMjExLT5pcHNfc2VtKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcHJpdi0+aWVlZTgwMjExLT5zY2FubmluZyA9IDA7Ci0JCWllZWU4MDIxMV9zb2Z0bWFjX3NjYW5fc3luY3JvKHByaXYtPmllZWU4MDIxMSk7Ci0JCXJldCA9IDA7Ci0JfQotCWVsc2UKLSNlbHNlCi0KLQlpZihwcml2LT5pZWVlODAyMTEtPnN0YXRlICE9IElFRUU4MDIxMV9MSU5LRUQpewotCQlwcml2LT5pZWVlODAyMTEtPnNjYW5uaW5nID0gMDsKLQkJaWVlZTgwMjExX3NvZnRtYWNfc2Nhbl9zeW5jcm8ocHJpdi0+aWVlZTgwMjExKTsKLQkJcmV0ID0gMDsKLQl9Ci0JZWxzZQotI2VuZGlmCi0JcmV0ID0gaWVlZTgwMjExX3d4X3NldF9zY2FuKHByaXYtPmllZWU4MDIxMSxhLHdycXUsYik7Ci0KLQl1cCgmcHJpdi0+d3hfc2VtKTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKLQkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKLXsKLQotCWludCByZXQ7Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCi0JaWYgKHByaXYtPmJId1JhZGlvT2ZmKQotCQlyZXR1cm4gMDsKLQotCWlmKCFwcml2LT51cCkgcmV0dXJuIC1FTkVURE9XTjsKLQotCWRvd24oJnByaXYtPnd4X3NlbSk7Ci0KLQlyZXQgPSBpZWVlODAyMTFfd3hfZ2V0X3NjYW4ocHJpdi0+aWVlZTgwMjExLGEsd3JxdSxiKTsKLQotCXVwKCZwcml2LT53eF9zZW0pOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCByODE5Ml93eF9zZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCi0JCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQlSVF9SRl9QT1dFUl9TVEFURQlydFN0YXRlOwotCWludCByZXQ7Ci0KLQlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCi0JCXJldHVybiAwOwotCi0JcnRTdGF0ZSA9IHByaXYtPmVSRlBvd2VyU3RhdGU7Ci0JZG93bigmcHJpdi0+d3hfc2VtKTsKLQotI2lmZGVmIEVOQUJMRV9JUFMKLSAgICAgICAgZG93bigmcHJpdi0+aWVlZTgwMjExLT5pcHNfc2VtKTsKLSAgICAgICAgSVBTTGVhdmUocHJpdik7Ci0gICAgICAgIHVwKCZwcml2LT5pZWVlODAyMTEtPmlwc19zZW0pOwotI2VuZGlmCi0JcmV0ID0gaWVlZTgwMjExX3d4X3NldF9lc3NpZChwcml2LT5pZWVlODAyMTEsYSx3cnF1LGIpOwotCi0JdXAoJnByaXYtPnd4X3NlbSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0KLQotCi1zdGF0aWMgaW50IHI4MTkyX3d4X2dldF9lc3NpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKLQkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0KLQlkb3duKCZwcml2LT53eF9zZW0pOwotCi0JcmV0ID0gaWVlZTgwMjExX3d4X2dldF9lc3NpZChwcml2LT5pZWVlODAyMTEsIGEsIHdycXUsIGIpOwotCi0JdXAoJnByaXYtPnd4X3NlbSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X2ZyZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKLQkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQotCWlmIChwcml2LT5iSHdSYWRpb09mZikKLQkJcmV0dXJuIDA7Ci0KLQlkb3duKCZwcml2LT53eF9zZW0pOwotCi0JcmV0ID0gaWVlZTgwMjExX3d4X3NldF9mcmVxKHByaXYtPmllZWU4MDIxMSwgYSwgd3JxdSwgYik7Ci0KLQl1cCgmcHJpdi0+d3hfc2VtKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHI4MTkyX3d4X2dldF9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQlyZXR1cm4gaWVlZTgwMjExX3d4X2dldF9uYW1lKHByaXYtPmllZWU4MDIxMSwgaW5mbywgd3JxdSwgZXh0cmEpOwotfQotCi0KLXN0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCi0JaWYgKHByaXYtPmJId1JhZGlvT2ZmKQotCQlyZXR1cm4gMDsKLQotCWlmICh3cnF1LT5mcmFnLmRpc2FibGVkKQotCQlwcml2LT5pZWVlODAyMTEtPmZ0cyA9IERFRkFVTFRfRlJBR19USFJFU0hPTEQ7Ci0JZWxzZSB7Ci0JCWlmICh3cnF1LT5mcmFnLnZhbHVlIDwgTUlOX0ZSQUdfVEhSRVNIT0xEIHx8Ci0JCSAgICB3cnF1LT5mcmFnLnZhbHVlID4gTUFYX0ZSQUdfVEhSRVNIT0xEKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkJcHJpdi0+aWVlZTgwMjExLT5mdHMgPSB3cnF1LT5mcmFnLnZhbHVlICYgfjB4MTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IHI4MTkyX3d4X2dldF9mcmFnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQotCXdycXUtPmZyYWcudmFsdWUgPSBwcml2LT5pZWVlODAyMTEtPmZ0czsKLQl3cnF1LT5mcmFnLmZpeGVkID0gMDsJLyogbm8gYXV0byBzZWxlY3QgKi8KLQl3cnF1LT5mcmFnLmRpc2FibGVkID0gKHdycXUtPmZyYWcudmFsdWUgPT0gREVGQVVMVF9GUkFHX1RIUkVTSE9MRCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IHI4MTkyX3d4X3NldF93YXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJIHVuaW9uIGl3cmVxX2RhdGEgKmF3cnEsCi0JCQkgY2hhciAqZXh0cmEpCi17Ci0KLQlpbnQgcmV0OwotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLS8vICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKnRlbXAgPSAoc3RydWN0IHNvY2thZGRyICopYXdycTsKLQotCWlmIChwcml2LT5iSHdSYWRpb09mZikKLQkJcmV0dXJuIDA7Ci0KLQlkb3duKCZwcml2LT53eF9zZW0pOwotCi0jaWZkZWYgRU5BQkxFX0lQUwotICAgICAgICBkb3duKCZwcml2LT5pZWVlODAyMTEtPmlwc19zZW0pOwotICAgICAgICBJUFNMZWF2ZShwcml2KTsKLSAgICAgICAgdXAoJnByaXYtPmllZWU4MDIxMS0+aXBzX3NlbSk7Ci0jZW5kaWYKLQlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X3dhcChwcml2LT5pZWVlODAyMTEsaW5mbyxhd3JxLGV4dHJhKTsKLQotCXVwKCZwcml2LT53eF9zZW0pOwotCi0JcmV0dXJuIHJldDsKLQotfQotCi0KLXN0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCi0JcmV0dXJuIGllZWU4MDIxMV93eF9nZXRfd2FwKHByaXYtPmllZWU4MDIxMSxpbmZvLHdycXUsZXh0cmEpOwotfQotCi0KLXN0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X2VuYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQotCXJldHVybiBpZWVlODAyMTFfd3hfZ2V0X2VuY29kZShwcml2LT5pZWVlODAyMTEsIGluZm8sIHdycXUsIGtleSk7Ci19Ci0KLXN0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X2VuYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQlpbnQgcmV0OwotCi0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBwcml2LT5pZWVlODAyMTE7Ci0JLy91MzIgVGFyZ2V0Q29udGVudDsKLQl1MzIgaHdrZXlbNF09ezAsMCwwLDB9OwotCXU4IG1hc2s9MHhmZjsKLQl1MzIga2V5X2lkeD0wOwotCXU4IHplcm9fYWRkcls0XVs2XSA9e3sweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMH0sCi0JCQkJezB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAxfSwKLQkJCQl7MHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDJ9LAotCQkJCXsweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwM30gfTsKLQlpbnQgaTsKLQotCWlmIChwcml2LT5iSHdSYWRpb09mZikKLQkJcmV0dXJuIDA7Ci0KLSAgICAgICBpZighcHJpdi0+dXApIHJldHVybiAtRU5FVERPV047Ci0KLSAgICAgICAgcHJpdi0+aWVlZTgwMjExLT53eF9zZXRfZW5jID0gMTsKLSNpZmRlZiBFTkFCTEVfSVBTCi0gICAgICAgIGRvd24oJnByaXYtPmllZWU4MDIxMS0+aXBzX3NlbSk7Ci0gICAgICAgIElQU0xlYXZlKHByaXYpOwotICAgICAgICB1cCgmcHJpdi0+aWVlZTgwMjExLT5pcHNfc2VtKTsKLSNlbmRpZgotCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKLQotCVJUX1RSQUNFKENPTVBfU0VDLCAiU2V0dGluZyBTVyB3ZXAga2V5XG4iKTsKLQlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X2VuY29kZShwcml2LT5pZWVlODAyMTEsaW5mbyx3cnF1LGtleSk7Ci0KLQl1cCgmcHJpdi0+d3hfc2VtKTsKLQotCS8vc29tZXRpbWVzLCB0aGUgbGVuZ3RoIGlzIHplcm8gd2hpbGUgd2UgZG8gbm90IHR5cGUga2V5IHZhbHVlCi0JaWYod3JxdS0+ZW5jb2RpbmcubGVuZ3RoIT0wKXsKLQotCQlmb3IoaT0wIDsgaTw0IDsgaSsrKXsKLQkJCWh3a2V5W2ldIHw9ICBrZXlbNCppKzBdJm1hc2s7Ci0JCQlpZihpPT0xJiYoNCppKzEpPT13cnF1LT5lbmNvZGluZy5sZW5ndGgpIG1hc2s9MHgwMDsKLQkJCWlmKGk9PTMmJig0KmkrMSk9PXdycXUtPmVuY29kaW5nLmxlbmd0aCkgbWFzaz0weDAwOwotCQkJaHdrZXlbaV0gfD0gKGtleVs0KmkrMV0mbWFzayk8PDg7Ci0JCQlod2tleVtpXSB8PSAoa2V5WzQqaSsyXSZtYXNrKTw8MTY7Ci0JCQlod2tleVtpXSB8PSAoa2V5WzQqaSszXSZtYXNrKTw8MjQ7Ci0JCX0KLQotCQkjZGVmaW5lIENPTkZfV0VQNDAgIDB4NAotCQkjZGVmaW5lIENPTkZfV0VQMTA0IDB4MTQKLQotCQlzd2l0Y2god3JxdS0+ZW5jb2RpbmcuZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpewotCQkJY2FzZSAwOiBrZXlfaWR4ID0gaWVlZS0+dHhfa2V5aWR4OyBicmVhazsKLQkJCWNhc2UgMToJa2V5X2lkeCA9IDA7IGJyZWFrOwotCQkJY2FzZSAyOglrZXlfaWR4ID0gMTsgYnJlYWs7Ci0JCQljYXNlIDM6CWtleV9pZHggPSAyOyBicmVhazsKLQkJCWNhc2UgNDoJa2V5X2lkeAk9IDM7IGJyZWFrOwotCQkJZGVmYXVsdDogYnJlYWs7Ci0JCX0KLQotCQkvL3ByaW50aygiLS0tLS0tLT09PT0+bGVuZ3RoOiVkLCBrZXlfaWR4OiVkLCBmbGFnOiV4XG4iLCB3cnF1LT5lbmNvZGluZy5sZW5ndGgsIGtleV9pZHgsIHdycXUtPmVuY29kaW5nLmZsYWdzKTsKLQkJaWYod3JxdS0+ZW5jb2RpbmcubGVuZ3RoPT0weDUpewotCQlpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IEtFWV9UWVBFX1dFUDQwOwotCQkJRW5hYmxlSFdTZWN1cml0eUNvbmZpZzgxOTIocHJpdik7Ci0JCQlzZXRLZXkocHJpdiwga2V5X2lkeCwga2V5X2lkeCwgS0VZX1RZUEVfV0VQNDAsCi0JCQkgICAgICAgemVyb19hZGRyW2tleV9pZHhdLCAwLCBod2tleSk7Ci0JCX0KLQotCQllbHNlIGlmKHdycXUtPmVuY29kaW5nLmxlbmd0aD09MHhkKXsKLQkJCWllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfV0VQMTA0OwotCQkJCUVuYWJsZUhXU2VjdXJpdHlDb25maWc4MTkyKHByaXYpOwotCQkJc2V0S2V5KHByaXYsIGtleV9pZHgsIGtleV9pZHgsIEtFWV9UWVBFX1dFUDEwNCwKLQkJCSAgICAgICB6ZXJvX2FkZHJba2V5X2lkeF0sIDAsIGh3a2V5KTsKLQkJfQotCQllbHNlIHByaW50aygid3JvbmcgdHlwZSBpbiBXRVAsIG5vdCBXRVA0MCBhbmQgV0VQMTA0XG4iKTsKLQl9Ci0KLQlwcml2LT5pZWVlODAyMTEtPnd4X3NldF9lbmMgPSAwOwotCi0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgaW50IHI4MTkyX3d4X3NldF9zY2FuX3R5cGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYWEsIHVuaW9uCi0gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqcCl7Ci0KLSAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCWludCAqcGFybXM9KGludCopcDsKLQlpbnQgbW9kZT1wYXJtc1swXTsKLQotCXByaXYtPmllZWU4MDIxMS0+YWN0aXZlX3NjYW4gPSBtb2RlOwotCi0JcmV0dXJuIDE7Ci19Ci0KLQotCi1zdGF0aWMgaW50IHI4MTkyX3d4X3NldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCWludCBlcnIgPSAwOwotCi0JaWYgKHByaXYtPmJId1JhZGlvT2ZmKQotCQlyZXR1cm4gMDsKLQotCWRvd24oJnByaXYtPnd4X3NlbSk7Ci0KLQlpZiAod3JxdS0+cmV0cnkuZmxhZ3MgJiBJV19SRVRSWV9MSUZFVElNRSB8fAotCSAgICB3cnF1LT5yZXRyeS5kaXNhYmxlZCl7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0JaWYgKCEod3JxdS0+cmV0cnkuZmxhZ3MgJiBJV19SRVRSWV9MSU1JVCkpewotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYod3JxdS0+cmV0cnkudmFsdWUgPiBSODE4MF9NQVhfUkVUUlkpewotCQllcnI9IC1FSU5WQUw7Ci0JCWdvdG8gZXhpdDsKLQl9Ci0JaWYgKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTUFYKSB7Ci0JCXByaXYtPnJldHJ5X3J0cyA9IHdycXUtPnJldHJ5LnZhbHVlOwotCQlETUVTRygiU2V0dGluZyByZXRyeSBmb3IgUlRTL0NUUyBkYXRhIHRvICVkIiwgd3JxdS0+cmV0cnkudmFsdWUpOwotCi0JfWVsc2UgewotCQlwcml2LT5yZXRyeV9kYXRhID0gd3JxdS0+cmV0cnkudmFsdWU7Ci0JCURNRVNHKCJTZXR0aW5nIHJldHJ5IGZvciBub24gUlRTL0NUUyBkYXRhIHRvICVkIiwgd3JxdS0+cmV0cnkudmFsdWUpOwotCX0KLQotCS8qIEZJWE1FICEKLQkgKiBXZSBtaWdodCB0cnkgdG8gd3JpdGUgZGlyZWN0bHkgdGhlIFRYIGNvbmZpZyByZWdpc3RlcgotCSAqIG9yIHRvIHJlc3RhcnQganVzdCB0aGUgKFIpVFggcHJvY2Vzcy4KLQkgKiBJJ20gdW5zdXJlIGlmIHdob2xlIHJlc2V0IGlzIHJlYWxseSBuZWVkZWQKLQkgKi8KLQotCXJ0bDgxOTJfY29tbWl0KHByaXYpOwotCS8qCi0JaWYocHJpdi0+dXApewotCQlydGw4MTgwX3J0eF9kaXNhYmxlKGRldik7Ci0JCXJ0bDgxODBfcnhfZW5hYmxlKGRldik7Ci0JCXJ0bDgxODBfdHhfZW5hYmxlKGRldik7Ci0KLQl9Ci0JKi8KLWV4aXQ6Ci0JdXAoJnByaXYtPnd4X3NlbSk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IHI4MTkyX3d4X2dldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCi0KLQl3cnF1LT5yZXRyeS5kaXNhYmxlZCA9IDA7IC8qIGNhbid0IGJlIGRpc2FibGVkICovCi0KLQlpZiAoKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfVFlQRSkgPT0KLQkgICAgSVdfUkVUUllfTElGRVRJTUUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHdycXUtPnJldHJ5LmZsYWdzICYgSVdfUkVUUllfTUFYKSB7Ci0JCXdycXUtPnJldHJ5LmZsYWdzID0gSVdfUkVUUllfTElNSVQgJiBJV19SRVRSWV9NQVg7Ci0JCXdycXUtPnJldHJ5LnZhbHVlID0gcHJpdi0+cmV0cnlfcnRzOwotCX0gZWxzZSB7Ci0JCXdycXUtPnJldHJ5LmZsYWdzID0gSVdfUkVUUllfTElNSVQgJiBJV19SRVRSWV9NSU47Ci0JCXdycXUtPnJldHJ5LnZhbHVlID0gcHJpdi0+cmV0cnlfZGF0YTsKLQl9Ci0JLy9ETUVTRygicmV0dXJuaW5nICVkIix3cnF1LT5yZXRyeS52YWx1ZSk7Ci0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHI4MTkyX3d4X2dldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0JaWYocHJpdi0+cmZfc2V0X3NlbnMgPT0gTlVMTCkKLQkJcmV0dXJuIC0xOyAvKiB3ZSBoYXZlIG5vdCB0aGlzIHN1cHBvcnQgZm9yIHRoaXMgcmFkaW8gKi8KLQl3cnF1LT5zZW5zLnZhbHVlID0gcHJpdi0+c2VuczsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IHI4MTkyX3d4X3NldF9zZW5zKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLQkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKLXsKLQotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQotCXNob3J0IGVyciA9IDA7Ci0KLQlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCi0JCXJldHVybiAwOwotCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKLQkvL0RNRVNHKCJhdHRlbXB0IHRvIHNldCBzZW5zaXZpdHkgdG8gJWRkYiIsd3JxdS0+c2Vucy52YWx1ZSk7Ci0JaWYocHJpdi0+cmZfc2V0X3NlbnMgPT0gTlVMTCkgewotCQllcnI9IC0xOyAvKiB3ZSBoYXZlIG5vdCB0aGlzIHN1cHBvcnQgZm9yIHRoaXMgcmFkaW8gKi8KLQkJZ290byBleGl0OwotCX0KLQlpZihwcml2LT5yZl9zZXRfc2VucyhkZXYsIHdycXUtPnNlbnMudmFsdWUpID09IDApCi0JCXByaXYtPnNlbnMgPSB3cnF1LT5zZW5zLnZhbHVlOwotCWVsc2UKLQkJZXJyPSAtRUlOVkFMOwotCi1leGl0OgotCXVwKCZwcml2LT53eF9zZW0pOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCByODE5Ml93eF9zZXRfZW5jX2V4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0JaW50IHJldD0wOwotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSogaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKLQotCWlmIChwcml2LT5iSHdSYWRpb09mZikKLQkJcmV0dXJuIDA7Ci0KLQlkb3duKCZwcml2LT53eF9zZW0pOwotCi0JcHJpdi0+aWVlZTgwMjExLT53eF9zZXRfZW5jID0gMTsKLQotI2lmZGVmIEVOQUJMRV9JUFMKLSAgICAgICAgZG93bigmcHJpdi0+aWVlZTgwMjExLT5pcHNfc2VtKTsKLSAgICAgICAgSVBTTGVhdmUocHJpdik7Ci0gICAgICAgIHVwKCZwcml2LT5pZWVlODAyMTEtPmlwc19zZW0pOwotI2VuZGlmCi0KLQlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X2VuY29kZV9leHQoaWVlZSwgaW5mbywgd3JxdSwgZXh0cmEpOwotCi0JewotCQl1OCBicm9hZGNhc3RfYWRkcls2XSA9IHsweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZn07Ci0JCXU4IHplcm9bNl0gPSB7MH07Ci0JCXUzMiBrZXlbNF0gPSB7MH07Ci0JCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilleHRyYTsKLQkJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKLQkJdTggaWR4ID0gMCwgYWxnID0gMCwgZ3JvdXAgPSAwOwotCi0JCWlmICgoZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0RJU0FCTEVEKSB8fAotCQlleHQtPmFsZyA9PSBJV19FTkNPREVfQUxHX05PTkUpIC8vbm9uZSBpcyBub3QgYWxsb3dlZCB0byB1c2UgaHdzZWMgV0IgMjAwOC4wNy4wMQotCQl7Ci0JCQlpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IGllZWUtPmdyb3VwX2tleV90eXBlID0gS0VZX1RZUEVfTkE7Ci0JCQlDYW1SZXNldEFsbEVudHJ5KHByaXYpOwotCQkJZ290byBlbmRfaHdfc2VjOwotCQl9Ci0JCWFsZyA9ICAoZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19DQ01QKT9LRVlfVFlQRV9DQ01QOmV4dC0+YWxnOyAvLyBhcyBJV19FTkNPREVfQUxHX0NDTVAgaXMgZGVmaW5lZCB0byBiZSAzIGFuZCBLRVlfVFlQRV9DQ01QIGlzIGRlZmluZWQgdG8gNDsKLQkJaWR4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOwotCQlpZiAoaWR4KQotCQkJaWR4IC0tOwotCQlncm91cCA9IGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVk7Ci0KLQkJaWYgKCghZ3JvdXApIHx8IChJV19NT0RFX0FESE9DID09IGllZWUtPml3X21vZGUpIHx8IChhbGcgPT0gIEtFWV9UWVBFX1dFUDQwKSkKLQkJewotCQkJaWYgKChleHQtPmtleV9sZW4gPT0gMTMpICYmIChhbGcgPT0gS0VZX1RZUEVfV0VQNDApICkKLQkJCQlhbGcgPSBLRVlfVFlQRV9XRVAxMDQ7Ci0JCQlpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IGFsZzsKLQkJCUVuYWJsZUhXU2VjdXJpdHlDb25maWc4MTkyKHByaXYpOwotCQl9Ci0JCW1lbWNweSgodTgqKWtleSwgZXh0LT5rZXksIDE2KTsgLy93ZSBvbmx5IGdldCAxNiBieXRlcyBrZXkud2h5PyBXQiAyMDA4LjcuMQotCi0JCWlmICgoYWxnICYgS0VZX1RZUEVfV0VQNDApICYmIChpZWVlLT5hdXRoX21vZGUgIT0yKSApCi0JCXsKLQkJCWlmIChleHQtPmtleV9sZW4gPT0gMTMpCi0JCQkJaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPSBhbGcgPSBLRVlfVFlQRV9XRVAxMDQ7Ci0JCQlzZXRLZXkocHJpdiwgaWR4LCBpZHgsIGFsZywgemVybywgMCwga2V5KTsKLQkJfQotCQllbHNlIGlmIChncm91cCkKLQkJewotCQkJaWVlZS0+Z3JvdXBfa2V5X3R5cGUgPSBhbGc7Ci0JCQlzZXRLZXkocHJpdiwgaWR4LCBpZHgsIGFsZywgYnJvYWRjYXN0X2FkZHIsIDAsIGtleSk7Ci0JCX0KLQkJZWxzZSAvL3BhaXJ3aXNlIGtleQotCQl7Ci0JCQlpZiAoKGllZWUtPnBhaXJ3aXNlX2tleV90eXBlID09IEtFWV9UWVBFX0NDTVApICYmIGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0KXsKLQkJCQkJCQl3cml0ZV9uaWNfYnl0ZShwcml2LCAweDE3MywgMSk7IC8vZml4IGFlcyBidWcKLQkJCX0KLQkJCXNldEtleShwcml2LCA0LCBpZHgsIGFsZywKLQkJCSAgICAgICAodTgqKWllZWUtPmFwX21hY19hZGRyLCAwLCBrZXkpOwotCQl9Ci0KLQotCX0KLQotZW5kX2h3X3NlYzoKLQlwcml2LT5pZWVlODAyMTEtPnd4X3NldF9lbmMgPSAwOwotCXVwKCZwcml2LT53eF9zZW0pOwotCXJldHVybiByZXQ7Ci0KLX0KLXN0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKmRhdGEsIGNoYXIgKmV4dHJhKQotewotCWludCByZXQ9MDsKLQkvL3ByaW50aygiPT09PT4lcygpXG4iLCBfX0ZVTkNUSU9OX18pOwotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQotCWlmIChwcml2LT5iSHdSYWRpb09mZikKLQkJcmV0dXJuIDA7Ci0KLQlkb3duKCZwcml2LT53eF9zZW0pOwotCXJldCA9IGllZWU4MDIxMV93eF9zZXRfYXV0aChwcml2LT5pZWVlODAyMTEsIGluZm8sICYoZGF0YS0+cGFyYW0pLCBleHRyYSk7Ci0JdXAoJnByaXYtPnd4X3NlbSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCByODE5Ml93eF9zZXRfbWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCi17Ci0JLy9wcmludGsoIj09PT0+JXMoKVxuIiwgX19GVU5DVElPTl9fKTsKLQotCWludCByZXQ9MDsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0KLQlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCi0JCXJldHVybiAwOwotCi0JZG93bigmcHJpdi0+d3hfc2VtKTsKLQlyZXQgPSBpZWVlODAyMTFfd3hfc2V0X21sbWUocHJpdi0+aWVlZTgwMjExLCBpbmZvLCB3cnF1LCBleHRyYSk7Ci0JdXAoJnByaXYtPnd4X3NlbSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCByODE5Ml93eF9zZXRfZ2VuX2llKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlvbiBpd3JlcV9kYXRhICpkYXRhLCBjaGFyICpleHRyYSkKLXsKLQkgICAvL3ByaW50aygiPT09PT4lcygpLCBsZW46JWRcbiIsIF9fRlVOQ1RJT05fXywgZGF0YS0+bGVuZ3RoKTsKLQlpbnQgcmV0PTA7Ci0gICAgICAgIHN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQotCWlmIChwcml2LT5iSHdSYWRpb09mZikKLQkJcmV0dXJuIDA7Ci0KLSAgICAgICAgZG93bigmcHJpdi0+d3hfc2VtKTsKLSAgICAgICAgcmV0ID0gaWVlZTgwMjExX3d4X3NldF9nZW5faWUocHJpdi0+aWVlZTgwMjExLCBleHRyYSwgZGF0YS0+ZGF0YS5sZW5ndGgpOwotICAgICAgICB1cCgmcHJpdi0+d3hfc2VtKTsKLQkvL3ByaW50aygiPD09PT09PSVzKCksIHJldDolZFxuIiwgX19GVU5DVElPTl9fLCByZXQpOwotICAgICAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGR1bW15KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCi0JCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LGNoYXIgKmIpCi17Ci0JcmV0dXJuIC0xOwotfQotCi0vLyBjaGVjayBhYy9kYyBzdGF0dXMgd2l0aCB0aGUgaGVscCBvZiB1c2VyIHNwYWNlIGFwcGxpY2F0aW9uICovCi1zdGF0aWMgaW50IHI4MTkyX3d4X2FkYXB0ZXJfcG93ZXJfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQotewotCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLSNpZmRlZiBFTkFCTEVfTFBTCi0JUFJUX1BPV0VSX1NBVkVfQ09OVFJPTCBwUFNDID0gJnByaXYtPlBvd2VyU2F2ZUNvbnRyb2w7Ci0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUgPSBwcml2LT5pZWVlODAyMTE7Ci0jZW5kaWYKLQlkb3duKCZwcml2LT53eF9zZW0pOwotCi0jaWZkZWYgRU5BQkxFX0xQUwotCVJUX1RSQUNFKENPTVBfUE9XRVIsICIlcygpOiAlc1xuIixfX0ZVTkNUSU9OX18sICgqZXh0cmEgPT0gIDYpPyJEQyBwb3dlciI6IkFDIHBvd2VyIik7Ci0JLy8gaWVlZS0+cHMgc2hhbGwgbm90IGJlIHNldCB1bmRlciBEQyBtb2RlLCBvdGhlcndpc2UgaXQgY29uZmxpY3QKLQkvLyB3aXRoIExlaXN1cmUgcG93ZXIgc2F2ZSBtb2RlIHNldHRpbmcuCi0JLy8KLQlpZigqZXh0cmEgfHwgcHJpdi0+Zm9yY2VfbHBzKSB7Ci0JCXByaXYtPnBzX2ZvcmNlID0gZmFsc2U7Ci0JCXBQU0MtPmJMZWlzdXJlUHMgPSB0cnVlOwotCX0gZWxzZSB7Ci0JCS8vTFpNIGZvciBQUy1Qb2xsIEFJRCBpc3N1ZS4gMDkwNDI5Ci0JCWlmKHByaXYtPmllZWU4MDIxMS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkKLQkJCUxlaXN1cmVQU0xlYXZlKHByaXYtPmllZWU4MDIxMSk7Ci0KLQkJcHJpdi0+cHNfZm9yY2UgPSB0cnVlOwotCQlwUFNDLT5iTGVpc3VyZVBzID0gZmFsc2U7Ci0JCWllZWUtPnBzID0gKmV4dHJhOwotCX0KLQotI2VuZGlmCi0JdXAoJnByaXYtPnd4X3NlbSk7Ci0JcmV0dXJuIDA7Ci0KLX0KLQotCi1zdGF0aWMgaXdfaGFuZGxlciByODE5Ml93eF9oYW5kbGVyc1tdID0KLXsKLSAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXQ09NTUlUICovCi0gICAgICAgIHI4MTkyX3d4X2dldF9uYW1lLCAgIAkgIC8qIFNJT0NHSVdOQU1FICovCi0gICAgICAgIGR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV05XSUQgKi8KLSAgICAgICAgZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXTldJRCAqLwotICAgICAgICByODE5Ml93eF9zZXRfZnJlcSwgICAgICAgIC8qIFNJT0NTSVdGUkVRICovCi0gICAgICAgIHI4MTkyX3d4X2dldF9mcmVxLCAgICAgICAgLyogU0lPQ0dJV0ZSRVEgKi8KLSAgICAgICAgcjgxOTJfd3hfc2V0X21vZGUsICAgICAgICAvKiBTSU9DU0lXTU9ERSAqLwotICAgICAgICByODE5Ml93eF9nZXRfbW9kZSwgICAgICAgIC8qIFNJT0NHSVdNT0RFICovCi0gICAgICAgIHI4MTkyX3d4X3NldF9zZW5zLCAgICAgICAgLyogU0lPQ1NJV1NFTlMgKi8KLSAgICAgICAgcjgxOTJfd3hfZ2V0X3NlbnMsICAgICAgICAvKiBTSU9DR0lXU0VOUyAqLwotICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdSQU5HRSAqLwotICAgICAgICBydGw4MTgwX3d4X2dldF9yYW5nZSwJICAvKiBTSU9DR0lXUkFOR0UgKi8KLSAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUFJJViAqLwotICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdQUklWICovCi0gICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NUQVRTICovCi0gICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NUQVRTICovCi0gICAgICAgIGR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1NQWSAqLwotICAgICAgICBkdW1teSwgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdTUFkgKi8KLSAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXVEhSU1BZICovCi0gICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1dJV1RIUlNQWSAqLwotICAgICAgICByODE5Ml93eF9zZXRfd2FwLCAgICAgIAkgIC8qIFNJT0NTSVdBUCAqLwotICAgICAgICByODE5Ml93eF9nZXRfd2FwLCAgICAgICAgIC8qIFNJT0NHSVdBUCAqLwotCXI4MTkyX3d4X3NldF9tbG1lLCAgICAgICAgLyogTUxNRS0tICovCi0gICAgICAgIGR1bW15LCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdBUExJU1QgLS0gZGVwcmljYXRlZCAqLwotICAgICAgICByODE5Ml93eF9zZXRfc2NhbiwgICAgICAgIC8qIFNJT0NTSVdTQ0FOICovCi0gICAgICAgIHI4MTkyX3d4X2dldF9zY2FuLCAgICAgICAgLyogU0lPQ0dJV1NDQU4gKi8KLSAgICAgICAgcjgxOTJfd3hfc2V0X2Vzc2lkLCAgICAgICAvKiBTSU9DU0lXRVNTSUQgKi8KLSAgICAgICAgcjgxOTJfd3hfZ2V0X2Vzc2lkLCAgICAgICAvKiBTSU9DR0lXRVNTSUQgKi8KLSAgICAgICAgZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXTklDS04gKi8KLSAgICAgICAgZHVtbXksICAgICAgICAgICAgICAgICAgICAvKiBTSU9DR0lXTklDS04gKi8KLSAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiAtLSBob2xlIC0tICovCi0gICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgLyogLS0gaG9sZSAtLSAqLwotICAgICAgICByODE5Ml93eF9zZXRfcmF0ZSwgICAgICAgIC8qIFNJT0NTSVdSQVRFICovCi0gICAgICAgIHI4MTkyX3d4X2dldF9yYXRlLCAgICAgICAgLyogU0lPQ0dJV1JBVEUgKi8KLSAgICAgICAgcjgxOTJfd3hfc2V0X3J0cywgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdSVFMgKi8KLSAgICAgICAgcjgxOTJfd3hfZ2V0X3J0cywgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdSVFMgKi8KLSAgICAgICAgcjgxOTJfd3hfc2V0X2ZyYWcsICAgICAgICAvKiBTSU9DU0lXRlJBRyAqLwotICAgICAgICByODE5Ml93eF9nZXRfZnJhZywgICAgICAgIC8qIFNJT0NHSVdGUkFHICovCi0gICAgICAgIGR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1RYUE9XICovCi0gICAgICAgIGR1bW15LCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1RYUE9XICovCi0gICAgICAgIHI4MTkyX3d4X3NldF9yZXRyeSwgICAgICAgLyogU0lPQ1NJV1JFVFJZICovCi0gICAgICAgIHI4MTkyX3d4X2dldF9yZXRyeSwgICAgICAgLyogU0lPQ0dJV1JFVFJZICovCi0gICAgICAgIHI4MTkyX3d4X3NldF9lbmMsICAgICAgICAgLyogU0lPQ1NJV0VOQ09ERSAqLwotICAgICAgICByODE5Ml93eF9nZXRfZW5jLCAgICAgICAgIC8qIFNJT0NHSVdFTkNPREUgKi8KLSAgICAgICAgcjgxOTJfd3hfc2V0X3Bvd2VyLCAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1BPV0VSICovCi0gICAgICAgIHI4MTkyX3d4X2dldF9wb3dlciwgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdQT1dFUiAqLwotCU5VTEwsCQkJLyotLS1ob2xlLS0tKi8KLQlOVUxMLCAJCQkvKi0tLWhvbGUtLS0qLwotCXI4MTkyX3d4X3NldF9nZW5faWUsLy9OVUxMLCAJCQkvKiBTSU9DU0lXR0VOSUUgKi8KLQlOVUxMLCAJCQkvKiBTSU9DU0lXR0VOSUUgKi8KLQlyODE5Ml93eF9zZXRfYXV0aCwvL05VTEwsIAkJCS8qIFNJT0NTSVdBVVRIICovCi0JTlVMTCwvL3I4MTkyX3d4X2dldF9hdXRoLC8vTlVMTCwgCQkJLyogU0lPQ1NJV0FVVEggKi8KLQlyODE5Ml93eF9zZXRfZW5jX2V4dCwgCQkJLyogU0lPQ1NJV0VOQ09ERUVYVCAqLwotCU5VTEwsLy9yODE5Ml93eF9nZXRfZW5jX2V4dCwvL05VTEwsIAkJCS8qIFNJT0NTSVdFTkNPREVFWFQgKi8KLQlOVUxMLCAJCQkvKiBTSU9DU0lXUE1LU0EgKi8KLQlOVUxMLCAJCQkgLyotLS1ob2xlLS0tKi8KLQotfTsKLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGl3X3ByaXZfYXJncyByODE5Ml9wcml2YXRlX2FyZ3NbXSA9IHsKLQotCXsKLQkJU0lPQ0lXRklSU1RQUklWICsgMHgwLAotCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImJhZGNyYyIKLQl9LAotCi0JewotCQlTSU9DSVdGSVJTVFBSSVYgKyAweDEsCi0JCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiYWN0aXZlc2NhbiIKLQotCX0sCi0JewotCQlTSU9DSVdGSVJTVFBSSVYgKyAweDIsCi0JCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAicmF3dHgiCi0JfQotCSwKLQl7Ci0JCVNJT0NJV0ZJUlNUUFJJViArIDB4MywKLQkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJmb3JjZXJlc2V0IgotCi0JfQotCSwKLQl7Ci0JCVNJT0NJV0ZJUlNUUFJJViArIDB4NCwKLQkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRHwxLCBJV19QUklWX1RZUEVfTk9ORSwKLQkJInNldF9wb3dlciIKLQl9Ci0KLX07Ci0KLQotc3RhdGljIGl3X2hhbmRsZXIgcjgxOTJfcHJpdmF0ZV9oYW5kbGVyW10gPSB7Ci0JcjgxOTJfd3hfc2V0X2NyY21vbiwgICAvKlNJT0NJV1NFQ09ORFBSSVYqLwotCXI4MTkyX3d4X3NldF9zY2FuX3R5cGUsCi0JcjgxOTJfd3hfc2V0X3Jhd3R4LAotCXI4MTkyX3d4X2ZvcmNlX3Jlc2V0LAotCXI4MTkyX3d4X2FkYXB0ZXJfcG93ZXJfc3RhdHVzLAotfTsKLQotc3RhdGljIHN0cnVjdCBpd19zdGF0aXN0aWNzICpyODE5Ml9nZXRfd2lyZWxlc3Nfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLSAgICAgICBzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UqIGllZWUgPSBwcml2LT5pZWVlODAyMTE7Ci0Jc3RydWN0IGl3X3N0YXRpc3RpY3MqIHdzdGF0cyA9ICZwcml2LT53c3RhdHM7Ci0JaW50IHRtcF9sZXZlbCA9IDA7Ci0JaW50IHRtcF9xdWFsID0gMDsKLQlpbnQgdG1wX25vaXNlID0gMDsKLQlpZihpZWVlLT5zdGF0ZSA8IElFRUU4MDIxMV9MSU5LRUQpCi0JewotCQl3c3RhdHMtPnF1YWwucXVhbCA9IDA7Ci0JCXdzdGF0cy0+cXVhbC5sZXZlbCA9IDA7Ci0JCXdzdGF0cy0+cXVhbC5ub2lzZSA9IDA7Ci0JCXdzdGF0cy0+cXVhbC51cGRhdGVkID0gSVdfUVVBTF9BTExfVVBEQVRFRCB8IElXX1FVQUxfREJNOwotCQlyZXR1cm4gd3N0YXRzOwotCX0KLQotICAgICAgIHRtcF9sZXZlbCA9ICgmaWVlZS0+Y3VycmVudF9uZXR3b3JrKS0+c3RhdHMucnNzaTsKLQl0bXBfcXVhbCA9ICgmaWVlZS0+Y3VycmVudF9uZXR3b3JrKS0+c3RhdHMuc2lnbmFsOwotCXRtcF9ub2lzZSA9ICgmaWVlZS0+Y3VycmVudF9uZXR3b3JrKS0+c3RhdHMubm9pc2U7Ci0JLy9wcmludGsoImxldmVsOiVkLCBxdWFsOiVkLCBub2lzZTolZFxuIiwgdG1wX2xldmVsLCB0bXBfcXVhbCwgdG1wX25vaXNlKTsKLQotCXdzdGF0cy0+cXVhbC5sZXZlbCA9IHRtcF9sZXZlbDsKLQl3c3RhdHMtPnF1YWwucXVhbCA9IHRtcF9xdWFsOwotCXdzdGF0cy0+cXVhbC5ub2lzZSA9IHRtcF9ub2lzZTsKLQl3c3RhdHMtPnF1YWwudXBkYXRlZCA9IElXX1FVQUxfQUxMX1VQREFURUQgfCBJV19RVUFMX0RCTTsKLQlyZXR1cm4gd3N0YXRzOwotfQotCi0KLXN0cnVjdCBpd19oYW5kbGVyX2RlZiAgcjgxOTJfd3hfaGFuZGxlcnNfZGVmPXsKLQkuc3RhbmRhcmQgPSByODE5Ml93eF9oYW5kbGVycywKLQkubnVtX3N0YW5kYXJkID0gc2l6ZW9mKHI4MTkyX3d4X2hhbmRsZXJzKSAvIHNpemVvZihpd19oYW5kbGVyKSwKLQkucHJpdmF0ZSA9IHI4MTkyX3ByaXZhdGVfaGFuZGxlciwKLQkubnVtX3ByaXZhdGUgPSBzaXplb2YocjgxOTJfcHJpdmF0ZV9oYW5kbGVyKSAvIHNpemVvZihpd19oYW5kbGVyKSwKLSAJLm51bV9wcml2YXRlX2FyZ3MgPSBzaXplb2YocjgxOTJfcHJpdmF0ZV9hcmdzKSAvIHNpemVvZihzdHJ1Y3QgaXdfcHJpdl9hcmdzKSwKLQkuZ2V0X3dpcmVsZXNzX3N0YXRzID0gcjgxOTJfZ2V0X3dpcmVsZXNzX3N0YXRzLAotCS5wcml2YXRlX2FyZ3MgPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKXI4MTkyX3ByaXZhdGVfYXJncywKLX07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX3d4LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJFX3d4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZjA2YzEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTkyRV93eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLQlUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlciAtIHYgMC4zCi0JQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0ICA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+Ci0JUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKLQotCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyCi0JUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbiBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24KLQlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIKLQotCVdlIHdhbnQgdG8gdGFua3MgdGhlIEF1dGhvcnMgb2Ygc3VjaCBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyIHByb2plY3QgQXV0aG9ycy4KLSovCi0KLS8qIHRoaXMgZmlsZSAod2lsbCkgY29udGFpbnMgd2lyZWxlc3MgZXh0ZW5zaW9uIGhhbmRsZXJzKi8KLQotI2lmbmRlZiBSODE4MF9XWF9ICi0jZGVmaW5lIFI4MTgwX1dYX0gKLWV4dGVybiBzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgcjgxOTJfd3hfaGFuZGxlcnNfZGVmOwotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJfcG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5Ml9wbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmNjNGEzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5Ml9wbS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gICBQb3dlciBtYW5hZ2VtZW50IGludGVyZmFjZSByb3V0aW5lcy4KLSAgIFdyaXR0ZW4gYnkgTWFyaXVzeiBNYXR1c3play4KLSAgIFRoaXMgY29kZSBpcyBjdXJyZW50bHkganVzdCBhIHBsYWNlaG9sZGVyIGZvciBsYXRlciB3b3JrIGFuZAotICAgZG9lcyBub3QgZG8gYW55dGhpbmcgdXNlZnVsLgotCi0gICBUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlci4KLSAgIENvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNCAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgotICAgUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIEdQTCAoR2VuZXJhbCBQdWJsaWMgTGljZW5jZSkKLSovCi0KLSNpbmNsdWRlICJyODE5MkUuaCIKLSNpbmNsdWRlICJyODE5MkVfaHcuaCIKLSNpbmNsdWRlICJyODE5Ml9wbS5oIgotI2luY2x1ZGUgInI4MTkwX3J0bDgyNTYuaCIKLQotaW50IHJ0bDgxOTJFX3NhdmVfc3RhdGUgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLSAgICAgICAgcHJpbnRrKEtFUk5fTk9USUNFICJyODE5MkUgc2F2ZSBzdGF0ZSBjYWxsIChzdGF0ZSAldSkuXG4iLCBzdGF0ZS5ldmVudCk7Ci0JcmV0dXJuIC1FQUdBSU47Ci19Ci0KLQotaW50IHJ0bDgxOTJFX3N1c3BlbmQgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7Ci0JdTMyCXVsUmVnUmVhZDsKLQotICAgICAgICBSVF9UUkFDRShDT01QX1BPV0VSLCAiPT09PT09PT09PT09PiByODE5MkUgc3VzcGVuZCBjYWxsLlxuIik7Ci0JaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpCi0JCWdvdG8gb3V0X3BjaV9zdXNwZW5kOwotCi0JaWYgKGRldi0+bmV0ZGV2X29wcy0+bmRvX3N0b3ApCi0JCWRldi0+bmV0ZGV2X29wcy0+bmRvX3N0b3AoZGV2KTsKLQotCS8vIENhbGwgTWdudEFjdFNldF9SRl9TdGF0ZSBpbnN0ZWFkIHRvIHByZXZlbnQgUkYgY29uZmlnIHJhY2UgY29uZGl0aW9uLgotCWlmKCFwcml2LT5pZWVlODAyMTEtPmJTdXBwb3J0UmVtb3RlV2FrZVVwKSB7Ci0JCU1nbnRBY3RTZXRfUkZfU3RhdGUocHJpdiwgZVJmT2ZmLCBSRl9DSEFOR0VfQllfSU5JVCk7Ci0JCS8vIDIwMDYuMTEuMzAuIFN5c3RlbSByZXNldCBiaXQKLQkJdWxSZWdSZWFkID0gcmVhZF9uaWNfZHdvcmQocHJpdiwgQ1BVX0dFTik7Ci0JCXVsUmVnUmVhZHw9Q1BVX0dFTl9TWVNURU1fUkVTRVQ7Ci0JCXdyaXRlX25pY19kd29yZChwcml2LCBDUFVfR0VOLCB1bFJlZ1JlYWQpOwotCX0gZWxzZSB7Ci0JCS8vMjAwOC4wNi4wMyBmb3IgV09MCi0JCXdyaXRlX25pY19kd29yZChwcml2LCBXRkNSQzAsIDB4ZmZmZmZmZmYpOwotCQl3cml0ZV9uaWNfZHdvcmQocHJpdiwgV0ZDUkMxLCAweGZmZmZmZmZmKTsKLQkJd3JpdGVfbmljX2R3b3JkKHByaXYsIFdGQ1JDMiwgMHhmZmZmZmZmZik7Ci0JCS8vV3JpdGUgUE1SIHJlZ2lzdGVyCi0JCXdyaXRlX25pY19ieXRlKHByaXYsIFBNUiwgMHg1KTsKLQkJLy9EaXNhYmxlIHR4LCBlbmFuYmxlIHJ4Ci0JCXdyaXRlX25pY19ieXRlKHByaXYsIE1hY0Jsa0N0cmwsIDB4YSk7Ci0JfQotCi1vdXRfcGNpX3N1c3BlbmQ6Ci0JUlRfVFJBQ0UoQ09NUF9QT1dFUiwgInI4MTkyRSBzdXBwb3J0IFdPTCBjYWxsPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/P1xuIik7Ci0JaWYocHJpdi0+aWVlZTgwMjExLT5iU3VwcG9ydFJlbW90ZVdha2VVcCkgewotCQlSVF9UUkFDRShDT01QX1BPV0VSLCAicjgxOTJFIHN1cHBvcnQgV09MIGNhbGwhISEhISEhISEhISEhISEhISEuXG4iKTsKLQl9Ci0JbmV0aWZfZGV2aWNlX2RldGFjaChkZXYpOwotCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQlwY2lfZW5hYmxlX3dha2UocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LHN0YXRlKSwKLQkJCXByaXYtPmllZWU4MDIxMS0+YlN1cHBvcnRSZW1vdGVXYWtlVXA/MTowKTsKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYscGNpX2Nob29zZV9zdGF0ZShwZGV2LHN0YXRlKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHJ0bDgxOTJFX3Jlc3VtZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgZXJyOwotCXUzMiB2YWw7Ci0KLSAgICAgICAgUlRfVFJBQ0UoQ09NUF9QT1dFUiwgIj09PT09PT09PT09PT09PT0+cjgxOTJFIHJlc3VtZSBjYWxsLlxuIik7Ci0KLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7Ci0KLQllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKLQlpZihlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICIlczogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkIG9uIHJlc3VtZVxuIiwKLQkJCQlkZXYtPm5hbWUpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwotCi0JLyoKLQkgKiBTdXNwZW5kL1Jlc3VtZSByZXNldHMgdGhlIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlLCBzbyB3ZSBoYXZlIHRvCi0JICogcmUtZGlzYWJsZSB0aGUgUkVUUllfVElNRU9VVCByZWdpc3RlciAoMHg0MSkgdG8ga2VlcCBQQ0kgVHggcmV0cmllcwotCSAqIGZyb20gaW50ZXJmZXJpbmcgd2l0aCBDMyBDUFUgc3RhdGUuIHBjaV9yZXN0b3JlX3N0YXRlIHdvbid0IGhlbHAKLQkgKiBoZXJlIHNpbmNlIGl0IG9ubHkgcmVzdG9yZXMgdGhlIGZpcnN0IDY0IGJ5dGVzIHBjaSBjb25maWcgaGVhZGVyLgotCSAqLwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDQwLCAmdmFsKTsKLQlpZiAoKHZhbCAmIDB4MDAwMGZmMDApICE9IDApIHsKLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDQwLCB2YWwgJiAweGZmZmYwMGZmKTsKLQl9Ci0KLQotCi0JcGNpX2VuYWJsZV93YWtlKHBkZXYsIFBDSV9EMCwgMCk7Ci0KLQlpZighbmV0aWZfcnVubmluZyhkZXYpKQotCQlnb3RvIG91dDsKLQotCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKLQotCWlmIChkZXYtPm5ldGRldl9vcHMtPm5kb19vcGVuKQotCQlkZXYtPm5ldGRldl9vcHMtPm5kb19vcGVuKGRldik7Ci0KLW91dDoKLSAgICAgICAgUlRfVFJBQ0UoQ09NUF9QT1dFUiwgIjw9PT09PT09PT09PT09PT09cjgxOTJFIHJlc3VtZSBjYWxsLlxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotaW50IHJ0bDgxOTJFX2VuYWJsZV93YWtlIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUsIGludCBlbmFibGUpCi17Ci0gICAgICAgIHByaW50ayhLRVJOX05PVElDRSAicjgxOTJFIGVuYWJsZSB3YWtlIGNhbGwgKHN0YXRlICV1LCBlbmFibGUgJWQpLlxuIiwKLQkgICAgICAgc3RhdGUuZXZlbnQsIGVuYWJsZSk7Ci0JcmV0dXJuIC1FQUdBSU47Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOTJfcG0uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5Ml9wbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGE5YjQ2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5Ml9wbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoKLSAgICAgICAgUG93ZXIgbWFuYWdlbWVudCBpbnRlcmZhY2Ugcm91dGluZXMuCi0JV3JpdHRlbiBieSBNYXJpdXN6IE1hdHVzemVrLgotCVRoaXMgY29kZSBpcyBjdXJyZW50bHkganVzdCBhIHBsYWNlaG9sZGVyIGZvciBsYXRlciB3b3JrIGFuZAotCWRvZXMgbm90IGRvIGFueXRoaW5nIHVzZWZ1bC4KLQotCVRoaXMgaXMgcGFydCBvZiBydGw4MTgwIE9wZW5Tb3VyY2UgZHJpdmVyLgotCUNvcHlyaWdodCAoQykgQW5kcmVhIE1lcmVsbG8gMjAwNCAgPGFuZHJlYW1ybEB0aXNjYWxpLml0PgotCVJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCi0KLSovCi0KLSNpZm5kZWYgUjgxOTJFX1BNX0gKLSNkZWZpbmUgUjgxOTJFX1BNX0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0KLWludCBydGw4MTkyRV9zYXZlX3N0YXRlIChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOwotaW50IHJ0bDgxOTJFX3N1c3BlbmQgKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7Ci1pbnQgcnRsODE5MkVfcmVzdW1lIChzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKLWludCBydGw4MTkyRV9lbmFibGVfd2FrZSAoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlLCBpbnQgZW5hYmxlKTsKLQotI2VuZGlmIC8vUjgxOTJFX1BNX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5eEVfY21kcGt0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOXhFX2NtZHBrdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTZlMDY2Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5eEVfY21kcGt0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgIChjKSBDb3B5cmlnaHQgMjAwOCwgUmVhbFRFSyBUZWNobm9sb2dpZXMgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi0gTW9kdWxlOglyODE5eHVzYl9jbWRwa3QuYwkoUlRMODE5MCBUWC9SWCBjb21tYW5kIHBhY2tldCBoYW5kbGVyIFNvdXJjZSBDIEZpbGUpCi0KLSBOb3RlOiAgICAgIFRoZSBtb2R1bGUgaXMgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIFRYIGFuZCBSWCBjb21tYW5kIHBhY2tldC4KLSAJCQkxLiBUWCA6IFNlbmQgc2V0IGFuZCBxdWVyeSBjb25maWd1cmF0aW9uIGNvbW1hbmQgcGFja2V0LgotIAkJCTIuIFJYIDogUmVjZWl2ZSB0eCBmZWVkYmFjaywgYmVhY29uIHN0YXRlLCBxdWVyeSBjb25maWd1cmF0aW9uCi0gCQkJICAgICAgICBjb21tYW5kIHBhY2tldC4KLQotIEZ1bmN0aW9uOgotCi0gRXhwb3J0OgotCi0gQWJicmV2OgotCi0gSGlzdG9yeToKLQlEYXRhCQlXaG8JCVJlbWFyawotCi0JMDUvMDYvMjAwOCAgYW15ICAgIAlDcmVhdGUgaW5pdGlhbCB2ZXJzaW9uIHBvcnRpbmcgZnJvbSB3aW5kb3dzIGRyaXZlci4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgInI4MTkyRS5oIgotI2luY2x1ZGUgInI4MTkyRV9ody5oIgotI2luY2x1ZGUgInI4MTl4RV9jbWRwa3QuaCIKLQotLyoKLSAqIERyaXZlciBpbnRlcm5hbCBtb2R1bGUgY2FuIGNhbGwgdGhlIEFQSSB0byBzZW5kIG1lc3NhZ2UgdG8KLSAqIGZpcm13YXJlIHNpZGUuIEZvciBleGFtcGxlLCB5b3UgY2FuIHNlbmQgYSBkZWJ1ZyBjb21tYW5kIHBhY2tldC4KLSAqIE9yIHlvdSBjYW4gc2VuZCBhIHJlcXVlc3QgZm9yIEZXIHRvIG1vZGlmeSBSTFg0MTgxIExCVVMgSFcgYmFuay4KLSAqIE90aGVyd2lzZSwgeW91IGNhbiBjaGFuZ2UgTUFDL1BIVC9SRiByZWdpc3RlciBieSBmaXJtd2FyZSBhdAotICogcnVuIHRpbWUuIFdlIGRvIG5vdCBzdXBwb3J0IG1lc3NhZ2UgbW9yZSB0aGFuIG9uZSBzZWdtZW50IG5vdy4KLSAqLwotUlRfU1RBVFVTIGNtcGtfbWVzc2FnZV9oYW5kbGVfdHgoCi0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsCi0JdTgqCWNvZGVfdmlydHVhbF9hZGRyZXNzLAotCXUzMglwYWNrZXR0eXBlLAotCXUzMglidWZmZXJfbGVuKQotewotCVJUX1NUQVRVUyAJICAgIHJ0X3N0YXR1cyA9IFJUX1NUQVRVU19TVUNDRVNTOwotCXUxNgkJICAgIGZyYWdfdGhyZXNob2xkOwotCXUxNgkJICAgIGZyYWdfbGVuZ3RoID0gMCwgZnJhZ19vZmZzZXQgPSAwOwotCXJ0X2Zpcm13YXJlCSAgICAqcGZpcm13YXJlID0gcHJpdi0+cEZpcm13YXJlOwotCXN0cnVjdCBza19idWZmCSAgICAqc2tiOwotCXVuc2lnbmVkIGNoYXIJICAgICpzZWdfcHRyOwotCWNiX2Rlc2MJCSAgICAqdGNiX2Rlc2M7Ci0JdTggICAgICAgICAgICAgICAgICBiTGFzdEluaVBrdDsKLQotCVBUWF9GV0lORk9fODE5MFBDSSAgICAgIHBUeEZ3SW5mbyA9IE5VTEw7Ci0gICAgICAgIGludCBpOwotCi0JUlRfVFJBQ0UoQ09NUF9DTURQS1QsIiVzKCksYnVmZmVyX2xlbiBpcyAlZFxuIixfX0ZVTkNUSU9OX18sYnVmZmVyX2xlbik7Ci0JZmlybXdhcmVfaW5pdF9wYXJhbShwcml2KTsKLQkvL0ZyYWdtZW50YXRpb24gbWlnaHQgYmUgcmVxdWlyZWQKLQlmcmFnX3RocmVzaG9sZCA9IHBmaXJtd2FyZS0+Y21kcGFja2V0X2ZyYWdfdGhyZXNvbGQ7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmKChidWZmZXJfbGVuIC0gZnJhZ19vZmZzZXQpID4gZnJhZ190aHJlc2hvbGQpIHsKLSAgICAgICAgICAgICAgICBmcmFnX2xlbmd0aCA9IGZyYWdfdGhyZXNob2xkIDsKLSAgICAgICAgICAgICAgICBiTGFzdEluaVBrdCA9IDA7Ci0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZnJhZ19sZW5ndGggPSh1MTYpKGJ1ZmZlcl9sZW4gLSBmcmFnX29mZnNldCk7Ci0gICAgICAgICAgICAgICAgYkxhc3RJbmlQa3QgPSAxOwotCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIEFsbG9jYXRlIHNrYiBidWZmZXIgdG8gY29udGFpbiBmaXJtd2FyZSBpbmZvIGFuZCB0eCBkZXNjcmlwdG9yIGluZm8KLSAgICAgICAgICAgICAqIGFkZCA0IHRvIGF2b2lkIHBhY2tldCBhcHBlbmRpbmcgb3ZlcmZsb3cuCi0gICAgICAgICAgICAgKiAqLwotICAgICAgICAgICAgc2tiICA9IGRldl9hbGxvY19za2IoZnJhZ19sZW5ndGggKyBwcml2LT5pZWVlODAyMTEtPnR4X2hlYWRyb29tICsgNCk7Ci0gICAgICAgICAgICBpZihza2IgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJ0X3N0YXR1cyA9IFJUX1NUQVRVU19GQUlMVVJFOwotICAgICAgICAgICAgICAgIGdvdG8gRmFpbGVkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0Y2JfZGVzYyA9IChjYl9kZXNjKikoc2tiLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKLSAgICAgICAgICAgIHRjYl9kZXNjLT5xdWV1ZV9pbmRleCA9IFRYQ01EX1FVRVVFOwotICAgICAgICAgICAgdGNiX2Rlc2MtPmJDbWRPckluaXQgPSBwYWNrZXR0eXBlOwotICAgICAgICAgICAgdGNiX2Rlc2MtPmJMYXN0SW5pUGt0ID0gYkxhc3RJbmlQa3Q7Ci0gICAgICAgICAgICB0Y2JfZGVzYy0+cGt0X3NpemUgPSBmcmFnX2xlbmd0aDsKLQotICAgICAgICAgICAgLy9zZWdfcHRyID0gc2tiX3B1dChza2IsIGZyYWdfbGVuZ3RoICsgcHJpdi0+aWVlZTgwMjExLT50eF9oZWFkcm9vbSk7Ci0gICAgICAgICAgICBzZWdfcHRyID0gc2tiX3B1dChza2IsIHByaXYtPmllZWU4MDIxMS0+dHhfaGVhZHJvb20pOwotCi0gICAgICAgICAgICBwVHhGd0luZm8gPSAoUFRYX0ZXSU5GT184MTkwUENJKXNlZ19wdHI7Ci0gICAgICAgICAgICBtZW1zZXQocFR4RndJbmZvLDAsc2l6ZW9mKFRYX0ZXSU5GT184MTkwUENJKSk7Ci0gICAgICAgICAgICBtZW1zZXQocFR4RndJbmZvLDB4MTIsOCk7Ci0KLSAgICAgICAgICAgIHNlZ19wdHIgKz1zaXplb2YoVFhfRldJTkZPXzgxOTBQQ0kpOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVHJhbnNmb3JtIGZyb20gbGl0dGxlIGVuZGlhbiB0byBiaWcgZW5kaWFuCi0gICAgICAgICAgICAgKiBhbmQgcGVuZGluZyAgemVybwotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBzZWdfcHRyID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwotICAgICAgICAgICAgZm9yKGk9MCA7IGkgPCBmcmFnX2xlbmd0aDsgaSs9NCkgewotICAgICAgICAgICAgICAgICpzZWdfcHRyKysgPSAoKGkrMCk8ZnJhZ19sZW5ndGgpP2NvZGVfdmlydHVhbF9hZGRyZXNzW2krM106MDsKLSAgICAgICAgICAgICAgICAqc2VnX3B0cisrID0gKChpKzEpPGZyYWdfbGVuZ3RoKT9jb2RlX3ZpcnR1YWxfYWRkcmVzc1tpKzJdOjA7Ci0gICAgICAgICAgICAgICAgKnNlZ19wdHIrKyA9ICgoaSsyKTxmcmFnX2xlbmd0aCk/Y29kZV92aXJ0dWFsX2FkZHJlc3NbaSsxXTowOwotICAgICAgICAgICAgICAgICpzZWdfcHRyKysgPSAoKGkrMyk8ZnJhZ19sZW5ndGgpP2NvZGVfdmlydHVhbF9hZGRyZXNzW2krMF06MDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNrYl9wdXQoc2tiLCBpKTsKLSAgICAgICAgICAgIHByaXYtPmllZWU4MDIxMS0+c29mdG1hY19oYXJkX3N0YXJ0X3htaXQoc2tiLCBwcml2LT5pZWVlODAyMTEpOwotCi0gICAgICAgICAgICBjb2RlX3ZpcnR1YWxfYWRkcmVzcyArPSBmcmFnX2xlbmd0aDsKLSAgICAgICAgICAgIGZyYWdfb2Zmc2V0ICs9IGZyYWdfbGVuZ3RoOwotCi0gICAgICAgIH13aGlsZShmcmFnX29mZnNldCA8IGJ1ZmZlcl9sZW4pOwotCi1GYWlsZWQ6Ci0JcmV0dXJuIHJ0X3N0YXR1czsKLX0KLQotc3RhdGljIHZvaWQgY21wa19jb3VudF90eHN0YXRpc3RpYyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgY21wa190eGZiX3QgKnBzdHhfZmIpCi17Ci0jaWZkZWYgRU5BQkxFX1BTCi0JUlRfUkZfUE9XRVJfU1RBVEUJcnRTdGF0ZTsKLQotCXBBZGFwdGVyLT5IYWxGdW5jLkdldEh3UmVnSGFuZGxlcihwQWRhcHRlciwgSFdfVkFSX1JGX1NUQVRFLCAocHUxQnl0ZSkoJnJ0U3RhdGUpKTsKLQotCS8vIFdoZW4gUkYgaXMgb2ZmLCB3ZSBzaG91bGQgbm90IGNvdW50IHRoZSBwYWNrZXQgZm9yIGh3L3N3IHN5bmNocm9uaXplCi0JLy8gcmVhc29uLCBpZS4gdGhlcmUgbWF5IGJlIGEgZHVyYXRpb24gd2hpbGUgc3cgc3dpdGNoIGlzIGNoYW5nZWQgYW5kIGh3Ci0JLy8gc3dpdGNoIGlzIGJlaW5nIGNoYW5nZWQuIDIwMDYuMTIuMDQsIGJ5IHNoaWVuIGNoYW5nLgotCWlmIChydFN0YXRlID09IGVSZk9mZikKLQl7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYKLQotI2lmZGVmIFRPRE8KLQlpZihwQWRhcHRlci0+YkluSGN0VGVzdCkKLQkJcmV0dXJuOwotI2VuZGlmCi0JLyogV2UgY2FuIG5vdCBrbm93IHRoZSBwYWNrZXQgbGVuZ3RoIGFuZCB0cmFuc21pdCB0eXBlOiBicm9hZGNhc3Qgb3IgdW5pCi0JICAgb3IgbXVsdGljYXN0LiBTbyB0aGUgcmVsYXRpdmUgc3RhdGlzdGljcyBtdXN0IGJlIGNvbGxlY3RlZCBpbiB0eAotCSAgIGZlZWRiYWNrIGluZm8uICovCi0JaWYgKHBzdHhfZmItPnRvaykKLQl7Ci0JCXByaXYtPnN0YXRzLnR4b2t0b3RhbCsrOwotCi0JCS8qIFdlIGNhbiBub3QgbWFrZSBzdXJlIGJyb2FkY2FzdC9tdWx0aWNhc3Qgb3IgdW5pY2FzdCBtb2RlLiAqLwotCQlpZiAocHN0eF9mYi0+cGt0X3R5cGUgIT0gUEFDS0VUX01VTFRJQ0FTVCAmJgotCQkgICAgcHN0eF9mYi0+cGt0X3R5cGUgIT0gUEFDS0VUX0JST0FEQ0FTVCkgewotCQkJcHJpdi0+c3RhdHMudHhieXRlc3VuaWNhc3QgKz0gcHN0eF9mYi0+cGt0X2xlbmd0aDsKLQkJfQotCX0KLX0KLQotCi0KLS8qCi0gKiBUaGUgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGV4dHJhY3QgdGhlIG1lc3NhZ2UgaW5zaWRlIFRYCi0gKiBmZWVkYmNrIG1lc3NhZ2UgZnJvbSBmaXJtd2FyZS4gSXQgd2lsbCBjb250YWluIGRlZGljYXRlZCBpbmZvIGluCi0gKiB3cy0wNi0wMDYzLXJ0bDgxOTAtY29tbWFuZC1wYWNrZXQtc3BlY2lmaWNhdGlvbi4gUGxlYXNlCi0gKiByZWZlciB0byBjaGFwdGVyICJUWCBGZWVkYmFjayBFbGVtZW50Ii4gV2UgaGF2ZSB0byByZWFkIDIwIGJ5dGVzCi0gKiBpbiB0aGUgY29tbWFuZCBwYWNrZXQuCi0gKi8KLXN0YXRpYyB2b2lkIGNtcGtfaGFuZGxlX3R4X2ZlZWRiYWNrKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCB1OCAqcG1zZykKLXsKLQljbXBrX3R4ZmJfdAkJcnhfdHhfZmI7CS8qICovCi0KLQlwcml2LT5zdGF0cy50eGZlZWRiYWNrKys7Ci0KLQltZW1jcHkoKHU4KikmcnhfdHhfZmIsIHBtc2csIHNpemVvZihjbXBrX3R4ZmJfdCkpOwotCS8qIFVzZSB0eCBmZWVkYmFjayBpbmZvIHRvIGNvdW50IFRYIHN0YXRpc3RpY3MuICovCi0JY21wa19jb3VudF90eHN0YXRpc3RpYyhwcml2LCAmcnhfdHhfZmIpOwotfQotCi0KLS8qCi0gKiBUaGUgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGV4dHJhY3QgdGhlIG1lc3NhZ2UgZnJvbQotICogZmlybXdhcmUuIEl0IHdpbGwgY29udGFpbiBkZWRpY2F0ZWQgaW5mbyBpbgotICogd3MtMDctMDA2My12MDYtcnRsODE5eC1jb21tYW5kLXBhY2tldC1zcGVjaWZpY2F0aW9uLTA3MDMxNS5kb2MuCi0gKiBQbGVhc2UgcmVmZXIgdG8gY2hhcHRlciAiSW50ZXJydXB0IFN0YXR1cyBFbGVtZW50Ii4KLSAqLwotc3RhdGljIHZvaWQgY21wa19oYW5kbGVfaW50ZXJydXB0X3N0YXR1cyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgdTggKnBtc2cpCi17Ci0JY21wa19pbnRyX3N0YV90CQlyeF9pbnRyX3N0YXR1czsJLyogKi8KLQotCURNRVNHKCItLS0+IGNtcGtfSGFuZGxlX0ludGVycnVwdF9TdGF0dXMoKVxuIik7Ci0KLQkvKiAxLiBFeHRyYWN0IFRYIGZlZWRiYWNrIGluZm8gZnJvbSBSRkQgdG8gdGVtcCBzdHJ1Y3R1cmUgYnVmZmVyLiAqLwotCS8qIEl0IHNlZW1zIHRoYXQgRlcgdXNlIGJpZyBlbmRpYW4oTUlQUykgYW5kIERSViB1c2UgbGl0dGxlIGVuZGlhbiBpbgotCSAgIHdpbmRvd3MgT1MuIFNvIHdlIGhhdmUgdG8gcmVhZCB0aGUgY29udGVudCBieXRlIGJ5IGJ5dGUgb3IgdHJhbnNmZXIKLQkgICBlbmRpYW4gdHlwZSBiZWZvcmUgY29weSB0aGUgbWVzc2FnZSBjb3B5LiAqLwotCS8vcnhfYmNuX3N0YXRlLkVsZW1lbnRfSUQgCT0gcE1zZ1swXTsKLQkvL3J4X2Jjbl9zdGF0ZS5MZW5ndGggCQk9IHBNc2dbMV07Ci0JcnhfaW50cl9zdGF0dXMubGVuZ3RoID0gcG1zZ1sxXTsKLQlpZiAocnhfaW50cl9zdGF0dXMubGVuZ3RoICE9IChzaXplb2YoY21wa19pbnRyX3N0YV90KSAtIDIpKQotCXsKLQkJRE1FU0coImNtcGtfSGFuZGxlX0ludGVycnVwdF9TdGF0dXM6IHdyb25nIGxlbmd0aCFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0KLQkvLyBTdGF0aXN0aWNzIG9mIGJlYWNvbiBmb3IgYWQtaG9jIG1vZGUuCi0JaWYoCXByaXYtPmllZWU4MDIxMS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKQotCXsKLQkJLy8yIG1heWJlIG5lZWQgZW5kaWFuIHRyYW5zZm9ybT8KLQkJcnhfaW50cl9zdGF0dXMuaW50ZXJydXB0X3N0YXR1cyA9ICooKHUzMiAqKShwbXNnICsgNCkpOwotCQkvL3J4X2ludHJfc3RhdHVzLkludGVycnVwdFN0YXR1cyA9IE4ySDRCWVRFKCooKFVJTlQzMiAqKShwTXNnICsgNCkpKTsKLQotCQlETUVTRygiaW50ZXJydXB0IHN0YXR1cyA9IDB4JXhcbiIsIHJ4X2ludHJfc3RhdHVzLmludGVycnVwdF9zdGF0dXMpOwotCi0JCWlmIChyeF9pbnRyX3N0YXR1cy5pbnRlcnJ1cHRfc3RhdHVzICYgSVNSX1R4QmNuT2spCi0JCXsKLQkJCXByaXYtPmllZWU4MDIxMS0+Ymlic3Njb29yZGluYXRvciA9IHRydWU7Ci0JCQlwcml2LT5zdGF0cy50eGJlYWNvbm9raW50Kys7Ci0JCX0KLQkJZWxzZSBpZiAocnhfaW50cl9zdGF0dXMuaW50ZXJydXB0X3N0YXR1cyAmIElTUl9UeEJjbkVycikKLQkJewotCQkJcHJpdi0+aWVlZTgwMjExLT5iaWJzc2Nvb3JkaW5hdG9yID0gZmFsc2U7Ci0JCQlwcml2LT5zdGF0cy50eGJlYWNvbmVycisrOwotCQl9Ci0JfQotCi0JIC8vIE90aGVyIGluZm9ybWF0aW9ucyBpbiBpbnRlcnJ1cHQgc3RhdHVzIHdlIG5lZWQ/Ci0KLQotCURNRVNHKCI8LS0tLSBjbXBrX2hhbmRsZV9pbnRlcnJ1cHRfc3RhdHVzKClcbiIpOwotCi19Ci0KLQotLyoKLSAqIFRoZSBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZXh0cmFjdCB0aGUgbWVzc2FnZSBmcm9tCi0gKiBmaXJtd2FyZS4gSXQgd2lsbCBjb250YWluIGRlZGljYXRlZCBpbmZvIGluCi0gKiB3cy0wNi0wMDYzLXJ0bDgxOTAtY29tbWFuZC1wYWNrZXQtc3BlY2lmaWNhdGlvbi4gUGxlYXNlCi0gKiByZWZlciB0byBjaGFwdGVyICJCZWFjb24gU3RhdGUgRWxlbWVudCIuCi0gKi8KLXN0YXRpYyB2b2lkIGNtcGtfaGFuZGxlX3F1ZXJ5X2NvbmZpZ19yeChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgdTggKnBtc2cpCi17Ci0JY21wa19xdWVyeV9jZmdfdAlyeF9xdWVyeV9jZmc7CS8qICovCi0KLQkvKiAwLiBEaXNwbGF5IHJlY2VpdmVkIG1lc3NhZ2UuICovCi0JLy9jbXBrX0Rpc3BsYXlfTWVzc2FnZShDTVBLX1JYX0JFQUNPTl9TVEFURV9TSVpFLCBwTXNnKTsKLQotCS8qIDEuIEV4dHJhY3QgVFggZmVlZGJhY2sgaW5mbyBmcm9tIFJGRCB0byB0ZW1wIHN0cnVjdHVyZSBidWZmZXIuICovCi0JLyogSXQgc2VlbXMgdGhhdCBGVyB1c2UgYmlnIGVuZGlhbihNSVBTKSBhbmQgRFJWIHVzZSBsaXR0bGUgZW5kaWFuIGluCi0JICAgd2luZG93cyBPUy4gU28gd2UgaGF2ZSB0byByZWFkIHRoZSBjb250ZW50IGJ5dGUgYnkgYnl0ZSBvciB0cmFuc2ZlcgotCSAgIGVuZGlhbiB0eXBlIGJlZm9yZSBjb3B5IHRoZSBtZXNzYWdlIGNvcHkuICovCi0JLy9yeF9xdWVyeV9jZmcuRWxlbWVudF9JRCAJPSBwTXNnWzBdOwotCS8vcnhfcXVlcnlfY2ZnLkxlbmd0aCAJCT0gcE1zZ1sxXTsKLQlyeF9xdWVyeV9jZmcuY2ZnX2FjdGlvbiAJPSAocG1zZ1s0XSAmIDB4ODAwMDAwMDApPj4zMTsKLQlyeF9xdWVyeV9jZmcuY2ZnX3R5cGUgCQk9IChwbXNnWzRdICYgMHg2MCkgPj4gNTsKLQlyeF9xdWVyeV9jZmcuY2ZnX3NpemUgCQk9IChwbXNnWzRdICYgMHgxOCkgPj4gMzsKLQlyeF9xdWVyeV9jZmcuY2ZnX3BhZ2UgCQk9IChwbXNnWzZdICYgMHgwRikgPj4gMDsKLQlyeF9xdWVyeV9jZmcuY2ZnX29mZnNldCAJCT0gcG1zZ1s3XTsKLQlyeF9xdWVyeV9jZmcudmFsdWUgCQkJPSAocG1zZ1s4XSA8PCAyNCkgfCAocG1zZ1s5XSA8PCAxNikgfAotCQkJCQkJCQkgIChwbXNnWzEwXSA8PCA4KSB8IChwbXNnWzExXSA8PCAwKTsKLQlyeF9xdWVyeV9jZmcubWFzayAJCQk9IChwbXNnWzEyXSA8PCAyNCkgfCAocG1zZ1sxM10gPDwgMTYpIHwKLQkJCQkJCQkJICAocG1zZ1sxNF0gPDwgOCkgfCAocG1zZ1sxNV0gPDwgMCk7Ci0KLX0KLQotCi0vKgotICogQ291bnQgYWdncmVnYXRlZCB0eCBzdGF0dXMgZnJvbSBmaXJtd2FyIG9mIG9uZSB0eXBlIHJ4IGNvbW1hbmQKLSAqIHBhY2tldCBlbGVtZW50IGlkID0gUlhfVFhfU1RBVFVTLgotICovCi1zdGF0aWMgdm9pZCBjbXBrX2NvdW50X3R4X3N0YXR1cyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgY21wa190eF9zdGF0dXNfdCAqcHN0eF9zdGF0dXMpCi17Ci0KLSNpZmRlZiBFTkFCTEVfUFMKLQotCVJUX1JGX1BPV0VSX1NUQVRFCXJ0c3RhdGU7Ci0KLQlwQWRhcHRlci0+SGFsRnVuYy5HZXRId1JlZ0hhbmRsZXIocEFkYXB0ZXIsIEhXX1ZBUl9SRl9TVEFURSwgKHB1MUJ5dGUpKCZydFN0YXRlKSk7Ci0KLQkvLyBXaGVuIFJGIGlzIG9mZiwgd2Ugc2hvdWxkIG5vdCBjb3VudCB0aGUgcGFja2V0IGZvciBody9zdyBzeW5jaHJvbml6ZQotCS8vIHJlYXNvbiwgaWUuIHRoZXJlIG1heSBiZSBhIGR1cmF0aW9uIHdoaWxlIHN3IHN3aXRjaCBpcyBjaGFuZ2VkIGFuZCBodwotCS8vIHN3aXRjaCBpcyBiZWluZyBjaGFuZ2VkLiAyMDA2LjEyLjA0LCBieSBzaGllbiBjaGFuZy4KLQlpZiAocnRTdGF0ZSA9PSBlUmZPZmYpCi0JewotCQlyZXR1cm47Ci0JfQotI2VuZGlmCi0KLQlwcml2LT5zdGF0cy50eGZlZWRiYWNrb2sJKz0gcHN0eF9zdGF0dXMtPnR4b2s7Ci0JcHJpdi0+c3RhdHMudHhva3RvdGFsCQkrPSBwc3R4X3N0YXR1cy0+dHhvazsKLQotCXByaXYtPnN0YXRzLnR4Ynl0ZXN1bmljYXN0CQkrPSBwc3R4X3N0YXR1cy0+dHh1Y2xlbmd0aDsKLX0KLQotCi0KLS8qCi0gKiBGaXJtd2FyZSBhZGQgYSBuZXcgdHggZmVlZGJhY2sgc3RhdHVzIHRvIHJlZHVjZSByeCBjb21tYW5kCi0gKiBwYWNrZXQgYnVmZmVyIG9wZXJhdGlvbiBsb2FkLgotICovCi1zdGF0aWMgdm9pZCBjbXBrX2hhbmRsZV90eF9zdGF0dXMoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHU4ICpwbXNnKQotewotCWNtcGtfdHhfc3RhdHVzX3QJcnhfdHhfc3RzOwkvKiAqLwotCi0JbWVtY3B5KCh2b2lkKikmcnhfdHhfc3RzLCAodm9pZCopcG1zZywgc2l6ZW9mKGNtcGtfdHhfc3RhdHVzX3QpKTsKLQkvKiAyLiBVc2UgdHggZmVlZGJhY2sgaW5mbyB0byBjb3VudCBUWCBzdGF0aXN0aWNzLiAqLwotCWNtcGtfY291bnRfdHhfc3RhdHVzKHByaXYsICZyeF90eF9zdHMpOwotCi19Ci0KLQotLyogRmlybXdhcmUgYWRkIGEgbmV3IHR4IHJhdGUgaGlzdG9yeSAqLwotc3RhdGljIHZvaWQgY21wa19oYW5kbGVfdHhfcmF0ZV9oaXN0b3J5KHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCB1OCAqcG1zZykKLXsKLQl1OAkJCQlpOwotCXUxNgkJCQlsZW5ndGggPSBzaXplb2YoY21wa190eF9yYWhpc190KTsKLQl1MzIJCQkJKnB0ZW1wOwotCi0jaWZkZWYgRU5BQkxFX1BTCi0JcEFkYXB0ZXItPkhhbEZ1bmMuR2V0SHdSZWdIYW5kbGVyKHBBZGFwdGVyLCBIV19WQVJfUkZfU1RBVEUsIChwdTFCeXRlKSgmcnRTdGF0ZSkpOwotCi0JLy8gV2hlbiBSRiBpcyBvZmYsIHdlIHNob3VsZCBub3QgY291bnQgdGhlIHBhY2tldCBmb3IgaHcvc3cgc3luY2hyb25pemUKLQkvLyByZWFzb24sIGllLiB0aGVyZSBtYXkgYmUgYSBkdXJhdGlvbiB3aGlsZSBzdyBzd2l0Y2ggaXMgY2hhbmdlZCBhbmQgaHcKLQkvLyBzd2l0Y2ggaXMgYmVpbmcgY2hhbmdlZC4gMjAwNi4xMi4wNCwgYnkgc2hpZW4gY2hhbmcuCi0JaWYgKHJ0U3RhdGUgPT0gZVJmT2ZmKQotCXsKLQkJcmV0dXJuOwotCX0KLSNlbmRpZgotCi0JcHRlbXAgPSAodTMyICopcG1zZzsKLQotCS8vCi0JLy8gRG8gZW5kaWFuIHRyYW5zZmVyIHRvIHdvcmQgYWxpZ25tZW50KDE2IGJpdHMpIGZvciB3aW5kb3dzIHN5c3RlbS4KLQkvLyBZb3UgbXVzdCBkbyBkaWZmZXJlbnQgZW5kaWFuIHRyYW5zZmVyIGZvciBsaW51eCBhbmQgTUFDIE9TCi0JLy8KLQlmb3IgKGkgPSAwOyBpIDwgKGxlbmd0aC80KTsgaSsrKQotCXsKLQkJdTE2CSB0ZW1wMSwgdGVtcDI7Ci0KLQkJdGVtcDEgPSBwdGVtcFtpXSYweDAwMDBGRkZGOwotCQl0ZW1wMiA9IHB0ZW1wW2ldPj4xNjsKLQkJcHRlbXBbaV0gPSAodGVtcDE8PDE2KXx0ZW1wMjsKLQl9Ci19Ci0KLQotLyoKLSAqIEluIHRoZSBmdW5jdGlvbiwgd2Ugd2lsbCBjYXB0dXJlIGRpZmZlcmVudCBSWCBjb21tYW5kIHBhY2tldAotICogaW5mby4gRXZlcnkgUlggY29tbWFuZCBwYWNrZXQgZWxlbWVudCBoYXMgZGlmZmVyZW50IG1lc3NhZ2UKLSAqIGxlbmd0aCBhbmQgbWVhbmluZyBpbiBjb250ZW50LiBXZSBvbmx5IHN1cHBvcnQgdGhyZWUgdHlwZSBvZiBSWAotICogY29tbWFuZCBwYWNrZXQgbm93LiBQbGVhc2UgcmVmZXIgdG8gZG9jdW1lbnQKLSAqIHdzLTA2LTAwNjMtcnRsODE5MC1jb21tYW5kLXBhY2tldC1zcGVjaWZpY2F0aW9uLgotICovCi11MzIgY21wa19tZXNzYWdlX2hhbmRsZV9yeChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcHN0YXRzKQotewotLy8JdTMyCQkJZGVidWdfbGV2ZWwgPSBEQkdfTE9VRDsKLQlpbnQJCQl0b3RhbF9sZW5ndGg7Ci0JdTgJCQljbWRfbGVuZ3RoLCBleGVfY250ID0gMDsKLQl1OAkJCWVsZW1lbnRfaWQ7Ci0JdTgJCQkqcGNtZF9idWZmOwotCi0gICAgICAgIFJUX1RSQUNFKENPTVBfRVZFTlRTLCAiLS0tLT5jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KClcbiIpOwotCi0JLyogMC4gQ2hlY2sgaW5wdCBhcmd1bWVudHMuIElmIGlzIGlzIGEgY29tbWFuZCBxdWV1ZSBtZXNzYWdlIG9yIHBvaW50ZXIgaXMKLQkgICAgICBudWxsLiAqLwotCWlmICgvKihwcmZkLT5xdWV1ZV9pZCAhPSBDTVBLX1JYX1FVRVVFX0lEKSB8fCAqLyhwc3RhdHM9PSBOVUxMKSkKLQl7Ci0JCS8qIFByaW50IGVycm9yIG1lc3NhZ2UuICovCi0JCS8qUlRfVFJBQ0UoQ09NUF9TRU5ELCBEZWJ1Z0xldmVsLAotCQkJCSgiXG5ccltDTVBLXS0tPkVyciBxdWV1ZSBpZCBvciBwb2ludGVyIikpOyovCi0JCXJldHVybiAwOwkvKiBUaGlzIGlzIG5vdCBhIGNvbW1hbmQgcGFja2V0LiAqLwotCX0KLQotCS8qIDEuIFJlYWQgcmVjZWl2ZWQgY29tbWFuZCBwYWNrZXQgbWVzc2FnZSBsZW5ndGggZnJvbSBSRkQuICovCi0JdG90YWxfbGVuZ3RoID0gcHN0YXRzLT5MZW5ndGg7Ci0KLQkvKiAyLiBSZWFkIHZpcnR1YWwgYWRkcmVzcyBmcm9tIFJGRC4gKi8KLQlwY21kX2J1ZmYgPSBwc3RhdHMtPnZpcnR1YWxfYWRkcmVzczsKLQotCS8qIDMuIFJlYWQgY29tbWFuZCBwYWtjZXQgZWxlbWVudCBpZCBhbmQgbGVuZ3RoLiAqLwotCWVsZW1lbnRfaWQgPSBwY21kX2J1ZmZbMF07Ci0JLypSVF9UUkFDRShDT01QX1NFTkQsIERlYnVnTGV2ZWwsCi0JCQkoIlxuXHJbQ01QS10tLT5lbGVtZW50IElEPSVkIExlbj0lZCIsIGVsZW1lbnRfaWQsIHRvdGFsX2xlbmd0aCkpOyovCi0KLQkvKiA0LiBDaGVjayBldmVyeSByZWNlaXZlZCBjb21tYW5kIHBhY2tldCBjb25lbnQgYWNjb3JkaW5nIHRvIGRpZmZlcmVudAotCSAgICAgIGVsZW1lbnQgdHlwZS4gQmVjYXVzZSBGVyBtYXkgYWdncmVnYXRlIFJYIGNvbW1hbmQgcGFja2V0IHRvIG1pbmltaXplCi0JICAgICAgdHJhbnNtaXQgdGltZSBiZXR3ZWVuIERSViBhbmQgRlcuKi8KLQkvLyBBZGQgYSBjb3VudGVyIHRvIHByZXZlbnQgdG8gbG9ja2VkIGluIHRoZSBsb29wIHRvbyBsb25nCi0Jd2hpbGUgKHRvdGFsX2xlbmd0aCA+IDAgfHwgZXhlX2NudCsrID4xMDApCi0JewotCQkvKiAyMDA3LzAxLzE3IE1IIFdlIHN1cHBvcnQgYWdncmVnYXRpb24gb2YgZGlmZmVyZW50IGNtZCBpbiB0aGUgc2FtZSBwYWNrZXQuICovCi0JCWVsZW1lbnRfaWQgPSBwY21kX2J1ZmZbMF07Ci0KLQkJc3dpdGNoKGVsZW1lbnRfaWQpCi0JCXsKLQkJCWNhc2UgUlhfVFhfRkVFREJBQ0s6Ci0KLSAgICAgICAgCQkJUlRfVFJBQ0UoQ09NUF9FVkVOVFMsICItLS0tPmNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKTpSWF9UWF9GRUVEQkFDS1xuIik7Ci0JCQkJY21wa19oYW5kbGVfdHhfZmVlZGJhY2socHJpdiwgcGNtZF9idWZmKTsKLQkJCQljbWRfbGVuZ3RoID0gQ01QS19SWF9UWF9GQl9TSVpFOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFJYX0lOVEVSUlVQVF9TVEFUVVM6Ci0KLQkJCSAgICAgICAgUlRfVFJBQ0UoQ09NUF9FVkVOVFMsICItLS0tPmNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKTpSWF9JTlRFUlJVUFRfU1RBVFVTXG4iKTsKLQkJCQljbXBrX2hhbmRsZV9pbnRlcnJ1cHRfc3RhdHVzKHByaXYsIHBjbWRfYnVmZik7Ci0JCQkJY21kX2xlbmd0aCA9IHNpemVvZihjbXBrX2ludHJfc3RhX3QpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEJPVEhfUVVFUllfQ09ORklHOgotCi0JCQkgICAgICAgIFJUX1RSQUNFKENPTVBfRVZFTlRTLCAiLS0tLT5jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KCk6Qk9USF9RVUVSWV9DT05GSUdcbiIpOwotCQkJCWNtcGtfaGFuZGxlX3F1ZXJ5X2NvbmZpZ19yeChwcml2LCBwY21kX2J1ZmYpOwotCQkJCWNtZF9sZW5ndGggPSBDTVBLX0JPVEhfUVVFUllfQ09ORklHX1NJWkU7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgUlhfVFhfU1RBVFVTOgotCi0JCQkgICAgICAgIFJUX1RSQUNFKENPTVBfRVZFTlRTLCAiLS0tLT5jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KCk6UlhfVFhfU1RBVFVTXG4iKTsKLQkJCQljbXBrX2hhbmRsZV90eF9zdGF0dXMocHJpdiwgcGNtZF9idWZmKTsKLQkJCQljbWRfbGVuZ3RoID0gQ01QS19SWF9UWF9TVFNfU0laRTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBSWF9UWF9QRVJfUEtUX0ZFRURCQUNLOgotCQkJCS8vIFlvdSBtdXN0IGF0IGxlYXNlIGFkZCBhIHN3aXRjaCBjYXNlIGVsZW1lbnQgaGVyZSwKLQkJCQkvLyBPdGhlcndpc2UsIHdlIHdpbGwganVtcCB0byBkZWZhdWx0IGNhc2UuCi0JCQkJLy9EYmdQcmludCgiQ0NYIFRlc3RcclxuIik7Ci0JCQkgICAgICAgIFJUX1RSQUNFKENPTVBfRVZFTlRTLCAiLS0tLT5jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KCk6UlhfVFhfUEVSX1BLVF9GRUVEQkFDS1xuIik7Ci0JCQkJY21kX2xlbmd0aCA9IENNUEtfUlhfVFhfRkJfU0laRTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBSWF9UWF9SQVRFX0hJU1RPUlk6Ci0JCQkJLy9EYmdQcmludCgiIHJ4IHR4IHJhdGUgaGlzdG9yeVxyXG4iKTsKLQotCQkJICAgICAgICBSVF9UUkFDRShDT01QX0VWRU5UUywgIi0tLS0+Y21wa19tZXNzYWdlX2hhbmRsZV9yeCgpOlJYX1RYX0hJU1RPUllcbiIpOwotCQkJCWNtcGtfaGFuZGxlX3R4X3JhdGVfaGlzdG9yeShwcml2LCBwY21kX2J1ZmYpOwotCQkJCWNtZF9sZW5ndGggPSBDTVBLX1RYX1JBSElTX1NJWkU7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQ6Ci0KLQkJCSAgICAgICAgUlRfVFJBQ0UoQ09NUF9FVkVOVFMsICItLS0tPmNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKTp1bmtub3duIENNRCBFbGVtZW50XG4iKTsKLQkJCQlyZXR1cm4gMTsJLyogVGhpcyBpcyBhIGNvbW1hbmQgcGFja2V0LiAqLwotCQl9Ci0KLQkJdG90YWxfbGVuZ3RoIC09IGNtZF9sZW5ndGg7Ci0JCXBjbWRfYnVmZiAgICArPSBjbWRfbGVuZ3RoOwotCX0JLyogd2hpbGUgKHRvdGFsX2xlbmd0aCA+IDApICovCi0JcmV0dXJuCTE7CS8qIFRoaXMgaXMgYSBjb21tYW5kIHBhY2tldC4gKi8KLQotCVJUX1RSQUNFKENPTVBfRVZFTlRTLCAiPC0tLS1jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KClcbiIpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTl4RV9jbWRwa3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5eEVfY21kcGt0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMmU0ZjguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3I4MTl4RV9jbWRwa3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwNyArMCwwIEBACi0jaWZuZGVmIFI4MTlYVVNCX0NNRFBLVF9ICi0jZGVmaW5lIFI4MTlYVVNCX0NNRFBLVF9ICi0vKiBEaWZmZXJlbnQgY29tbWFuZCBwYWNrZXQgaGF2ZSBkZWRpY2F0ZWQgbWVzc2FnZSBsZW5ndGggYW5kIGRlZmluaXRpb24uICovCi0jZGVmaW5lCQlDTVBLX1JYX1RYX0ZCX1NJWkUJCQkJCXNpemVvZihjbXBrX3R4ZmJfdCkJCS8vMjAKLSNkZWZpbmUJCUNNUEtfVFhfU0VUX0NPTkZJR19TSVpFCQkJCXNpemVvZihjbXBrX3NldF9jZmdfdCkJLy8xNgotI2RlZmluZQkJQ01QS19CT1RIX1FVRVJZX0NPTkZJR19TSVpFCQkJc2l6ZW9mKGNtcGtfc2V0X2NmZ190KQkvLzE2Ci0jZGVmaW5lCQlDTVBLX1JYX1RYX1NUU19TSVpFCQkJCQlzaXplb2YoY21wa190eF9zdGF0dXNfdCkvLwotI2RlZmluZQkJQ01QS19SWF9EQkdfTVNHX1NJWkUJCQlzaXplb2YoY21wa19yeF9kYmdpbmZvX3QpLy8KLSNkZWZpbmUJCUNNUEtfVFhfUkFISVNfU0laRQkJCXNpemVvZihjbXBrX3R4X3JhaGlzX3QpCi0KLS8qIDIwMDgvMDUvMDggYW15IEZvciBVU0IgY29uc3RhbnQuICovCi0jZGVmaW5lIElTUl9UeEJjbk9rCQkJCQlCSVQyNwkJCS8vIFRyYW5zbWl0IEJlYWNvbiBPSwotI2RlZmluZSBJU1JfVHhCY25FcnIJCQkJQklUMjYJCQkvLyBUcmFuc21pdCBCZWFjb24gRXJyb3IKLSNkZWZpbmUgSVNSX0JjblRpbWVySW50cgkJCUJJVDEzCQkJLy8gQmVhY29uIFRpbWVyIEludGVycnVwdAotCi0jaWYgMAotLyogRGVmaW5lIHBhY2tldCB0eXBlLiAqLwotdHlwZWRlZiBlbnVtIHRhZ19wYWNrZXRfdHlwZQotewotICAgIFBBQ0tFVF9CUk9BRENBU1QsCi0gICAgUEFDS0VUX01VTFRJQ0FTVCwKLSAgICBQQUNLRVRfVU5JQ0FTVCwKLSAgICBQQUNLRVRfVFlQRV9NQVgKLX1jbXBrX3BrdF90eXBlX2U7Ci0jZW5kaWYKLQotLyogRGVmaW5lIGVsZW1lbnQgSUQgb2YgY29tbWFuZCBwYWNrZXQuICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIHN0cnVjdHVyZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRGVmaW5lIGRpZmZlcmVudCBjb21tYW5kIHBhY2tldCBzdHJ1Y3R1cmUuICovCi0vKiAxLiBSWCBzaWRlOiBUWCBmZWVkYmFjayBwYWNrZXQuICovCi10eXBlZGVmIHN0cnVjdCB0YWdfY21kX3BrdF90eF9mZWVkYmFjawotewotCS8vIERXT1JEIDAKLQl1OAllbGVtZW50X2lkOwkJCS8qIENvbW1hbmQgcGFja2V0IHR5cGUuICovCi0JdTgJbGVuZ3RoOwkJCQkvKiBDb21tYW5kIHBhY2tldCBsZW5ndGguICovCi0JLyogMjAwNy8wNy8wNSBNSCBDaGFuZ2UgdHggZmVlZGJhY2sgaW5mbyBmaWVsZC4gKi8KLQkvKi0tLS0tLVRYIEZlZWRiYWNrIEluZm8gRmllbGQgKi8KLQl1OAlUSUQ6NDsJCQkJLyogKi8KLQl1OAlmYWlsX3JlYXNvbjozOwkJLyogKi8KLQl1OAl0b2s6MTsJCQkJLyogVHJhbnNtaXQgb2suICovCi0JdTgJcmVzZXJ2ZTE6NDsJCQkvKiAqLwotCXU4CXBrdF90eXBlOjI7CQkvKiAqLwotCXU4CWJhbmR3aWR0aDoxOwkJLyogKi8KLQl1OAlxb3NfcGt0OjE7CQkJLyogKi8KLQotCS8vIERXT1JEIDEKLQl1OAlyZXNlcnZlMjsJCQkvKiAqLwotCS8qLS0tLS0tVFggRmVlZGJhY2sgSW5mbyBGaWVsZCAqLwotCXU4CXJldHJ5X2NudDsJCQkvKiAqLwotCXUxNglwa3RfaWQ7CQkJCS8qICovCi0KLQkvLyBEV09SRCAzCi0JdTE2CXNlcV9udW07CQkJLyogKi8KLQl1OAlzX3JhdGU7CQkJCS8qIFN0YXJ0IHJhdGUuICovCi0JdTgJZl9yYXRlOwkJCQkvKiBGaW5hbCByYXRlLiAqLwotCi0JLy8gRFdPUkQgNAotCXU4CXNfcnRzX3JhdGU7CQkJLyogKi8KLQl1OAlmX3J0c19yYXRlOwkJCS8qICovCi0JdTE2CXBrdF9sZW5ndGg7CQkJLyogKi8KLQotCS8vIERXT1JEIDUKLQl1MTYJcmVzZXJ2ZTM7CQkJLyogKi8KLQl1MTYJZHVyYXRpb247CQkJLyogKi8KLX1jbXBrX3R4ZmJfdDsKLQotLyogMi4gUlggc2lkZTogSW50ZXJydXB0IHN0YXR1cyBwYWNrZXQuIEl0IGluY2x1ZGVzIEJlYWNvbiBTdGF0ZSwKLQkgIEJlYWNvbiBUaW1lciBJbnRlcnJ1cHQgYW5kIG90aGVyIHVzZWZ1bCBpbmZvcm1hdGlvbnMgaW4gTUFDIElTUiBSZWcuICovCi10eXBlZGVmIHN0cnVjdCB0YWdfY21kX3BrdF9pbnRlcnJ1cHRfc3RhdHVzCi17Ci0JdTgJZWxlbWVudF9pZDsJCQkvKiBDb21tYW5kIHBhY2tldCB0eXBlLiAqLwotCXU4CWxlbmd0aDsJCQkJLyogQ29tbWFuZCBwYWNrZXQgbGVuZ3RoLiAqLwotCXUxNglyZXNlcnZlOwotCXUzMglpbnRlcnJ1cHRfc3RhdHVzOwkJCQkvKiBJbnRlcnJ1cHQgU3RhdHVzLiAqLwotfWNtcGtfaW50cl9zdGFfdDsKLQotCi0vKiAzLiBUWCBzaWRlOiBTZXQgY29uZmlndXJhdGlvbiBwYWNrZXQuICovCi10eXBlZGVmIHN0cnVjdCB0YWdfY21kX3BrdF9zZXRfY29uZmlndXJhdGlvbgotewotCXU4CWVsZW1lbnRfaWQ7CQkJLyogQ29tbWFuZCBwYWNrZXQgdHlwZS4gKi8KLQl1OAlsZW5ndGg7CQkJCS8qIENvbW1hbmQgcGFja2V0IGxlbmd0aC4gKi8KLQl1MTYJcmVzZXJ2ZTE7CQkJLyogKi8KLQl1OCAJY2ZnX3Jlc2VydmUxOjM7Ci0JdTgJY2ZnX3NpemU6MjsJCQkvKiBDb25maWd1cmF0aW9uIGluZm8uICovCi0JdTgJY2ZnX3R5cGU6MjsJCQkvKiBDb25maWd1cmF0aW9uIGluZm8uICovCi0JdTgJY2ZnX2FjdGlvbjoxOwkJLyogQ29uZmlndXJhdGlvbiBpbmZvLiAqLwotCXU4CWNmZ19yZXNlcnZlMjsJCS8qIENvbmZpZ3VyYXRpb24gaW5mby4gKi8KLQl1OAljZmdfcGFnZTo0OwkJCS8qIENvbmZpZ3VyYXRpb24gaW5mby4gKi8KLQl1OAljZmdfcmVzZXJ2ZTM6NDsJCS8qIENvbmZpZ3VyYXRpb24gaW5mby4gKi8KLQl1OAljZmdfb2Zmc2V0OwkJCS8qIENvbmZpZ3VyYXRpb24gaW5mby4gKi8KLQl1MzIJdmFsdWU7CQkJCS8qICovCi0JdTMyCW1hc2s7CQkJCS8qICovCi19Y21wa19zZXRfY2ZnX3Q7Ci0KLS8qIDQuIEJvdGggc2lkZSA6IFRYL1JYIHF1ZXJ5IGNvbmZpZ3VyYXRvbiBwYWNrZXQuIFRoZSBxdWVyeSBzdHJ1Y3R1cmUgaXMgdGhlCi0gICAgICBzYW1lIGFzIHNldCBjb25maWd1cmF0aW9uLiAqLwotI2RlZmluZQkJY21wa19xdWVyeV9jZmdfdAljbXBrX3NldF9jZmdfdAotCi0vKiA1LiBNdWx0aSBwYWNrZXQgZmVlZGJhY2sgc3RhdHVzLiAqLwotdHlwZWRlZiBzdHJ1Y3QgdGFnX3R4X3N0YXRzX2ZlZWRiYWNrIC8vIFBKIHF1aWNrIHJ4Y21kIDA5MDQyMDA3Ci17Ci0JLy8gRm9yIGVuZGlhbiB0cmFuc2ZlciAtLT4gRHJpdmVyIHdpbGwgbm90IHRoZSBzYW1lIGFzIGZpcm13YXJlIHN0cnVjdHVyZS4KLQkvLyBEVyAwCi0JdTE2CXJlc2VydmUxOwotCXU4IAlsZW5ndGg7CQkJCS8vIENvbW1hbmQgcGFja2V0IGxlbmd0aAotCXU4IAllbGVtZW50X2lkOwkJCS8vIENvbW1hbmQgcGFja2V0IHR5cGUKLQotCS8vIERXIDEKLQl1MTYJdHhmYWlsOwkJCQkvLyBUeCBGYWlsIGNvdW50Ci0JdTE2IAl0eG9rOwkJCQkvLyBUeCBvayBjb3VudAotCi0JLy8gRFcgMgotCXUxNgl0eG1jb2s7ICAJCQkvLyB0eCBtdWx0aWNhc3QKLQl1MTYgCXR4cmV0cnk7CQkJLy8gVHggUmV0cnkgY291bnQKLQotCS8vIERXIDMKLQl1MTYgIHR4dWNvazsJCQkJLy8gdHggdW5pY2FzdAotCXUxNgl0eGJjb2s7ICAJCQkvLyB0eCBicm9hZGNhc3QKLQotCS8vIERXIDQKLQl1MTYJdHhiY2ZhaWw7CQkJLy8KLQl1MTYJdHhtY2ZhaWw7CQkJLy8KLQotCS8vIERXIDUKLQl1MTYJcmVzZXJ2ZTI7CQkJLy8KLQl1MTYJdHh1Y2ZhaWw7CQkJLy8KLQotCS8vIERXIDYtOAotCXUzMgl0eG1jbGVuZ3RoOwotCXUzMgl0eGJjbGVuZ3RoOwotCXUzMgl0eHVjbGVuZ3RoOwotCi0JLy8gRFcgOQotCXUxNglyZXNlcnZlM18yMzsKLQl1OAlyZXNlcnZlM18xOwotCXU4CXJhdGU7Ci19X19hdHRyaWJ1dGVfXygocGFja2VkKSkgY21wa190eF9zdGF0dXNfdDsKLQotLyogNi4gRGVidWcgZmVlZGJhY2sgbWVzc2FnZS4gKi8KLS8qIDIwMDcvMTAvMjMgTUggRGVmaW5lIFJYIGRlYnVnIG1lc3NhZ2UgICovCi10eXBlZGVmIHN0cnVjdCB0YWdfcnhfZGVidWdfbWVzc2FnZV9mZWVkYmFjawotewotCS8vIEZvciBlbmRpYW4gdHJhbnNmZXIgLS0+IGZvciBkcml2ZXIKLQkvLyBEVyAwCi0JdTE2CXJlc2VydmUxOwotCXU4IAlsZW5ndGg7CQkJCS8vIENvbW1hbmQgcGFja2V0IGxlbmd0aAotCXU4IAllbGVtZW50X2lkOwkJCS8vIENvbW1hbmQgcGFja2V0IHR5cGUKLQotCS8vIERXIDEtPz8KLQkvLyBWYXJpYWJsZSBkZWJ1ZyBtZXNzYWdlLgotCi19Y21wa19yeF9kYmdpbmZvX3Q7Ci0KLS8qIDIwMDgvMDMvMjAgTUggRGVmaW5lIHRyYW5zbWl0IHJhdGUgaGlzdG9yeS4gRm9yIGJpZyBlbmRpYW4gZm9ybWF0LiAqLwotdHlwZWRlZiBzdHJ1Y3QgdGFnX3R4X3JhdGVfaGlzdG9yeQotewotCS8vIEZvciBlbmRpYW4gdHJhbnNmZXIgLS0+IGZvciBkcml2ZXIKLQkvLyBEVyAwCi0JdTggCWVsZW1lbnRfaWQ7CQkJLy8gQ29tbWFuZCBwYWNrZXQgdHlwZQotCXU4IAlsZW5ndGg7CQkJCS8vIENvbW1hbmQgcGFja2V0IGxlbmd0aAotCXUxNglyZXNlcnZlZDE7Ci0KLQkvLyBEVyAxLTIJQ0NLIHJhdGUgY291bnRlcgotCXUxNiAJY2NrWzRdOwotCi0JLy8gRFcgMy02Ci0JdTE2IAlvZmRtWzhdOwotCi0JLy8gRFcgNy0xNAotCS8vVUlOVDE2CU1DU19CVzBfU0cwWzE2XTsKLQotCS8vIERXIDE1LTIyCi0JLy9VSU5UMTYJTUNTX0JXMV9TRzBbMTZdOwotCi0JLy8gRFcgMjMtMzAKLQkvL1VJTlQxNglNQ1NfQlcwX1NHMVsxNl07Ci0KLQkvLyBEVyAzMS0zOAotCS8vVUlOVDE2CU1DU19CVzFfU0cxWzE2XTsKLQotCS8vIERXIDctMTQJQlc9MCBTRz0wCi0JLy8gRFcgMTUtMjIJQlc9MSBTRz0wCi0JLy8gRFcgMjMtMzAJQlc9MCBTRz0xCi0JLy8gRFcgMzEtMzgJQlc9MSBTRz0xCi0JdTE2CWh0X21jc1s0XVsxNl07Ci0KLX1fX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBjbXBrX3R4X3JhaGlzX3Q7Ci0KLXR5cGVkZWYgZW51bSB0YWdfY29tbWFuZF9wYWNrZXRfZGlyZWN0b3JpZXMKLXsKLSAgICBSWF9UWF9GRUVEQkFDSyA9IDAsCi0gICAgUlhfSU5URVJSVVBUX1NUQVRVUwkJPSAxLAotICAgIFRYX1NFVF9DT05GSUcJCQkJPSAyLAotICAgIEJPVEhfUVVFUllfQ09ORklHCQkJPSAzLAotICAgIFJYX1RYX1NUQVRVUwkJCQk9IDQsCi0gICAgUlhfREJHSU5GT19GRUVEQkFDSwkJPSA1LAotICAgIFJYX1RYX1BFUl9QS1RfRkVFREJBQ0sJCT0gNiwKLSAgICBSWF9UWF9SQVRFX0hJU1RPUlkJCT0gNywKLSAgICBSWF9DTURfRUxFX01BWAotfWNtcGtfZWxlbWVudF9lOwotCi11MzIgY21wa19tZXNzYWdlX2hhbmRsZV9yeChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcHN0YXRzKTsKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5eEVfZmlybXdhcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5eEVfZmlybXdhcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDllOGI1YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOXhFX2Zpcm13YXJlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTEgKzAsMCBAQAotLyoKLSAqIFByb2NlZHVyZTogSW5pdCBib290IGNvZGUvZmlybXdhcmUgY29kZS9kYXRhIHNlc3Npb24KLSAqCi0gKiBEZXNjcmlwdGlvbjogVGhpcyByb3V0aW5lIHdpbGwgaW5pdGlhbGl6ZSBmaXJtd2FyZS4gSWYgYW55IGVycm9yIG9jY3VycwotICoJCWR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24gcHJvY2VzcywgdGhlIHJvdXRpbmUgc2hhbGwgdGVybWluYXRlCi0gKgkJaW1tZWRpYXRlbHkgYW5kIHJldHVybiBmYWlsLgotICovCi0KLSNpbmNsdWRlICJyODE5MkUuaCIKLSNpbmNsdWRlICJyODE5MkVfaHcuaCIKLQotI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0KLS8qIEl0IHNob3VsZCBiZSBkb3VibGUgd29yZCBhbGlnbm1lbnQgKi8KLSNkZWZpbmUgR0VUX0NPTU1BTkRfUEFDS0VUX0ZSQUdfVEhSRVNIT0xEKHYpICg0ICogKHYgLyA0KSAtIDgpCi0KLWVudW0gZmlybXdhcmVfaW5pdF9zdGVwIHsKLQlGV19JTklUX1NURVAwX0JPT1QgPSAwLAotCUZXX0lOSVRfU1RFUDFfTUFJTiA9IDEsCi0JRldfSU5JVF9TVEVQMl9EQVRBID0gMiwKLX07Ci0KLWVudW0gb3B0X3JzdF90eXBlIHsKLQlPUFRfU1lTVEVNX1JFU0VUID0gMCwKLQlPUFRfRklSTVdBUkVfUkVTRVQgPSAxLAotfTsKLQotdm9pZCBmaXJtd2FyZV9pbml0X3BhcmFtKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCXJ0X2Zpcm13YXJlICpwZmlybXdhcmUgPSBwcml2LT5wRmlybXdhcmU7Ci0KLQlwZmlybXdhcmUtPmNtZHBhY2tldF9mcmFnX3RocmVzb2xkID0KLQkJR0VUX0NPTU1BTkRfUEFDS0VUX0ZSQUdfVEhSRVNIT0xEKE1BWF9UUkFOU01JVF9CVUZGRVJfU0laRSk7Ci19Ci0KLS8qCi0gKiBzZWdtZW50IHRoZSBpbWcgYW5kIHVzZSB0aGUgcHRyIGFuZCBsZW5ndGggdG8gcmVtZW1iZXIgaW5mbyBvbiBlYWNoIHNlZ21lbnQKLSAqLwotc3RhdGljIGJvb2wgZndfZG93bmxvYWRfY29kZShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgdTggKmNvZGVfdmlydHVhbF9hZGRyZXNzLAotCQkJICAgICB1MzIgYnVmZmVyX2xlbikKLXsKLQlib29sIHJ0X3N0YXR1cyA9IHRydWU7Ci0JdTE2IGZyYWdfdGhyZXNob2xkOwotCXUxNiBmcmFnX2xlbmd0aCwgZnJhZ19vZmZzZXQgPSAwOwotCWludCBpOwotCi0JcnRfZmlybXdhcmUgKnBmaXJtd2FyZSA9IHByaXYtPnBGaXJtd2FyZTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXVuc2lnbmVkIGNoYXIgKnNlZ19wdHI7Ci0JY2JfZGVzYyAqdGNiX2Rlc2M7Ci0JdTggYkxhc3RJbmlQa3Q7Ci0KLQlmaXJtd2FyZV9pbml0X3BhcmFtKHByaXYpOwotCi0JLyogRnJhZ21lbnRhdGlvbiBtaWdodCBiZSByZXF1aXJlZCAqLwotCWZyYWdfdGhyZXNob2xkID0gcGZpcm13YXJlLT5jbWRwYWNrZXRfZnJhZ190aHJlc29sZDsKLQlkbyB7Ci0JCWlmICgoYnVmZmVyX2xlbiAtIGZyYWdfb2Zmc2V0KSA+IGZyYWdfdGhyZXNob2xkKSB7Ci0JCQlmcmFnX2xlbmd0aCA9IGZyYWdfdGhyZXNob2xkIDsKLQkJCWJMYXN0SW5pUGt0ID0gMDsKLQkJfSBlbHNlIHsKLQkJCWZyYWdfbGVuZ3RoID0gYnVmZmVyX2xlbiAtIGZyYWdfb2Zmc2V0OwotCQkJYkxhc3RJbmlQa3QgPSAxOwotCQl9Ci0KLQkJLyoKLQkJICogQWxsb2NhdGUgc2tiIGJ1ZmZlciB0byBjb250YWluIGZpcm13YXJlIGluZm8gYW5kIHR4Ci0JCSAqIGRlc2NyaXB0b3IgaW5mbyBhZGQgNCB0byBhdm9pZCBwYWNrZXQgYXBwZW5kaW5nIG92ZXJmbG93LgotCQkgKi8KLQkJc2tiICA9IGRldl9hbGxvY19za2IoZnJhZ19sZW5ndGggKyA0KTsKLQkJdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOwotCQl0Y2JfZGVzYy0+cXVldWVfaW5kZXggPSBUWENNRF9RVUVVRTsKLQkJdGNiX2Rlc2MtPmJDbWRPckluaXQgPSBERVNDX1BBQ0tFVF9UWVBFX0lOSVQ7Ci0JCXRjYl9kZXNjLT5iTGFzdEluaVBrdCA9IGJMYXN0SW5pUGt0OwotCi0JCXNlZ19wdHIgPSBza2ItPmRhdGE7Ci0KLQkJLyoKLQkJICogVHJhbnNmb3JtIGZyb20gbGl0dGxlIGVuZGlhbiB0byBiaWcgZW5kaWFuIGFuZCBwZW5kaW5nIHplcm8KLQkJICovCi0JCWZvciAoaSA9IDA7IGkgPCBmcmFnX2xlbmd0aDsgaSArPSA0KSB7Ci0JCQkqc2VnX3B0cisrID0gKChpKzApIDwgZnJhZ19sZW5ndGgpID8KLQkJCQkJY29kZV92aXJ0dWFsX2FkZHJlc3NbaSszXSA6IDA7Ci0KLQkJCSpzZWdfcHRyKysgPSAoKGkrMSkgPCBmcmFnX2xlbmd0aCkgPwotCQkJCQljb2RlX3ZpcnR1YWxfYWRkcmVzc1tpKzJdIDogMDsKLQotCQkJKnNlZ19wdHIrKyA9ICgoaSsyKSA8IGZyYWdfbGVuZ3RoKSA/Ci0JCQkJCWNvZGVfdmlydHVhbF9hZGRyZXNzW2krMV0gOiAwOwotCi0JCQkqc2VnX3B0cisrID0gKChpKzMpIDwgZnJhZ19sZW5ndGgpID8KLQkJCQkJY29kZV92aXJ0dWFsX2FkZHJlc3NbaSswXSA6IDA7Ci0JCX0KLQkJdGNiX2Rlc2MtPnR4YnVmX3NpemUgPSAodTE2KWk7Ci0JCXNrYl9wdXQoc2tiLCBpKTsKLQkJcHJpdi0+aWVlZTgwMjExLT5zb2Z0bWFjX2hhcmRfc3RhcnRfeG1pdChza2IsIHByaXYtPmllZWU4MDIxMSk7Ci0KLQkJY29kZV92aXJ0dWFsX2FkZHJlc3MgKz0gZnJhZ19sZW5ndGg7Ci0JCWZyYWdfb2Zmc2V0ICs9IGZyYWdfbGVuZ3RoOwotCi0JfSB3aGlsZSAoZnJhZ19vZmZzZXQgPCBidWZmZXJfbGVuKTsKLQotCXJldHVybiBydF9zdGF0dXM7Ci19Ci0KLS8qCi0gKiBDaGVjayB3aGV0aGVyIG1haW4gY29kZSBpcyBkb3dubG9hZCBPSy4gSWYgT0ssIHR1cm4gb24gQ1BVCi0gKgotICogQ1BVIHJlZ2lzdGVyIGxvY2F0ZXMgaW4gZGlmZmVyZW50IHBhZ2UgYWdhaW5zdCBnZW5lcmFsCi0gKiByZWdpc3Rlci4gIFN3aXRjaCB0byBDUFUgcmVnaXN0ZXIgaW4gdGhlIGJlZ2luIGFuZCBzd2l0Y2gKLSAqIGJhY2sgYmVmb3JlIHJldHVybgotICovCi1zdGF0aWMgYm9vbCBDUFVjaGVja19tYWluY29kZW9rX3R1cm5vbkNQVShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0JYm9vbCBydF9zdGF0dXMgPSB0cnVlOwotCXUzMiBDUFVfc3RhdHVzID0gMDsKLQotCS8qIENoZWNrIHdoZXRoZXIgcHV0IGNvZGUgT0sgKi8KLQl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjApOwotCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewotCQlDUFVfc3RhdHVzID0gcmVhZF9uaWNfZHdvcmQocHJpdiwgQ1BVX0dFTik7Ci0KLQkJaWYgKENQVV9zdGF0dXMgJiBDUFVfR0VOX1BVVF9DT0RFX09LKQotCQkJYnJlYWs7Ci0JCW1zbGVlcCgyKTsKLQl9Ci0KLQlpZiAoIShDUFVfc3RhdHVzICYgQ1BVX0dFTl9QVVRfQ09ERV9PSykpIHsKLQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJEb3dubG9hZCBGaXJtd2FyZTogUHV0IGNvZGUgZmFpbCFcbiIpOwotCQlnb3RvIENQVUNoZWNrTWFpbkNvZGVPS0FuZFR1cm5PbkNQVV9GYWlsOwotCX0gZWxzZSB7Ci0JCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsICJEb3dubG9hZCBGaXJtd2FyZTogUHV0IGNvZGUgb2shXG4iKTsKLQl9Ci0KLQkvKiBUdXJuIE9uIENQVSAqLwotCUNQVV9zdGF0dXMgPSByZWFkX25pY19kd29yZChwcml2LCBDUFVfR0VOKTsKLQl3cml0ZV9uaWNfYnl0ZShwcml2LCBDUFVfR0VOLAotCQkgICAgICAgKHU4KSgoQ1BVX3N0YXR1cyB8IENQVV9HRU5fUFdSX1NUQl9DUFUpICYgMHhmZikpOwotCW1kZWxheSgxKTsKLQotCS8qIENoZWNrIHdoZXRoZXIgQ1BVIGJvb3QgT0sgKi8KLQl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjApOwotCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewotCQlDUFVfc3RhdHVzID0gcmVhZF9uaWNfZHdvcmQocHJpdiwgQ1BVX0dFTik7Ci0KLQkJaWYgKENQVV9zdGF0dXMgJiBDUFVfR0VOX0JPT1RfUkRZKQotCQkJYnJlYWs7Ci0JCW1zbGVlcCgyKTsKLQl9Ci0KLQlpZiAoIShDUFVfc3RhdHVzICYgQ1BVX0dFTl9CT09UX1JEWSkpCi0JCWdvdG8gQ1BVQ2hlY2tNYWluQ29kZU9LQW5kVHVybk9uQ1BVX0ZhaWw7Ci0JZWxzZQotCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCAiRG93bmxvYWQgRmlybXdhcmU6IEJvb3QgcmVhZHkhXG4iKTsKLQotCXJldHVybiBydF9zdGF0dXM7Ci0KLUNQVUNoZWNrTWFpbkNvZGVPS0FuZFR1cm5PbkNQVV9GYWlsOgotCVJUX1RSQUNFKENPTVBfRVJSLCAiRVJSIGluICVzKClcbiIsIF9fZnVuY19fKTsKLQlydF9zdGF0dXMgPSBGQUxTRTsKLQlyZXR1cm4gcnRfc3RhdHVzOwotfQotCi1zdGF0aWMgYm9vbCBDUFVjaGVja19maXJtd2FyZV9yZWFkeShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0JYm9vbCBydF9zdGF0dXMgPSB0cnVlOwotCXUzMiBDUFVfc3RhdHVzID0gMDsKLQotCS8qIENoZWNrIEZpcm13YXJlIFJlYWR5ICovCi0JdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwKTsKLQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKLQkJQ1BVX3N0YXR1cyA9IHJlYWRfbmljX2R3b3JkKHByaXYsIENQVV9HRU4pOwotCi0JCWlmIChDUFVfc3RhdHVzICYgQ1BVX0dFTl9GSVJNX1JEWSkKLQkJCWJyZWFrOwotCQltc2xlZXAoMik7Ci0JfQotCi0JaWYgKCEoQ1BVX3N0YXR1cyAmIENQVV9HRU5fRklSTV9SRFkpKQotCQlnb3RvIENQVUNoZWNrRmlybXdhcmVSZWFkeV9GYWlsOwotCWVsc2UKLQkJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwgIkRvd25sb2FkIEZpcm13YXJlOiBGaXJtd2FyZSByZWFkeSFcbiIpOwotCi0JcmV0dXJuIHJ0X3N0YXR1czsKLQotQ1BVQ2hlY2tGaXJtd2FyZVJlYWR5X0ZhaWw6Ci0JUlRfVFJBQ0UoQ09NUF9FUlIsICJFUlIgaW4gJXMoKVxuIiwgX19mdW5jX18pOwotCXJ0X3N0YXR1cyA9IGZhbHNlOwotCXJldHVybiBydF9zdGF0dXM7Ci0KLX0KLQotYm9vbCBpbml0X2Zpcm13YXJlKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCWJvb2wgcnRfc3RhdHVzID0gdHJ1ZTsKLQl1MzIgZmlsZV9sZW5ndGggPSAwOwotCXU4ICptYXBwZWRfZmlsZSA9IE5VTEw7Ci0JdTMyIGluaXRfc3RlcCA9IDA7Ci0JZW51bSBvcHRfcnN0X3R5cGUgcnN0X29wdCA9IE9QVF9TWVNURU1fUkVTRVQ7Ci0JZW51bSBmaXJtd2FyZV9pbml0X3N0ZXAJc3RhcnRpbmdfc3RhdGUgPSBGV19JTklUX1NURVAwX0JPT1Q7Ci0KLQlydF9maXJtd2FyZSAqcGZpcm13YXJlID0gcHJpdi0+cEZpcm13YXJlOwotCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfZW50cnk7Ci0JY29uc3QgY2hhciAqZndfbmFtZVszXSA9IHsgIlJUTDgxOTJFL2Jvb3QuaW1nIiwKLQkJCQkgICAiUlRMODE5MkUvbWFpbi5pbWciLAotCQkJCSAgICJSVEw4MTkyRS9kYXRhLmltZyJ9OwotCWludCByYzsKLQotCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsICIgUGxhdGZvcm1Jbml0RmlybXdhcmUoKT09PlxuIik7Ci0KLQlpZiAocGZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPT0gRldfU1RBVFVTXzBfSU5JVCkgewotCQkvKiBpdCBpcyBjYWxsZWQgYnkgcmVzZXQgKi8KLQkJcnN0X29wdCA9IE9QVF9TWVNURU1fUkVTRVQ7Ci0JCXN0YXJ0aW5nX3N0YXRlID0gRldfSU5JVF9TVEVQMF9CT09UOwotCQkvKiBUT0RPOiBzeXN0ZW0gcmVzZXQgKi8KLQotCX0gZWxzZSBpZiAocGZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPT0gRldfU1RBVFVTXzVfUkVBRFkpIHsKLQkJLyogaXQgaXMgY2FsbGVkIGJ5IEluaXRpYWxpemUgKi8KLQkJcnN0X29wdCA9IE9QVF9GSVJNV0FSRV9SRVNFVDsKLQkJc3RhcnRpbmdfc3RhdGUgPSBGV19JTklUX1NURVAyX0RBVEE7Ci0JfSBlbHNlIHsKLQkJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwKLQkJCSJQbGF0Zm9ybUluaXRGaXJtd2FyZTogdW5kZWZpbmVkIGZpcm13YXJlIHN0YXRlXG4iKTsKLQl9Ci0KLQkvKgotCSAqIERvd25sb2FkIGJvb3QsIG1haW4sIGFuZCBkYXRhIGltYWdlIGZvciBTeXN0ZW0gcmVzZXQuCi0JICogRG93bmxvYWQgZGF0YSBpbWFnZSBmb3IgZmlybXdhcmUgcmVzZXRhCi0JICovCi0JZm9yIChpbml0X3N0ZXAgPSBzdGFydGluZ19zdGF0ZTsgaW5pdF9zdGVwIDw9IEZXX0lOSVRfU1RFUDJfREFUQTsKLQkJCWluaXRfc3RlcCsrKSB7Ci0JCS8qCi0JCSAqIE9wZW4gSW1hZ2UgZmlsZSwgYW5kIG1hcCBmaWxlIHRvIGNvbnRpbmVvdXMgbWVtb3J5IGlmIG9wZW4gZmlsZSBzdWNjZXNzLgotCQkgKiBvciByZWFkIGltYWdlIGZpbGUgZnJvbSBhcnJheS4gRGVmYXVsdCBsb2FkIGZyb20gSU1HIGZpbGUKLQkJICovCi0JCWlmIChyc3Rfb3B0ID09IE9QVF9TWVNURU1fUkVTRVQpIHsKLQkJCWlmIChwZmlybXdhcmUtPmZpcm13YXJlX2J1Zl9zaXplW2luaXRfc3RlcF0gPT0gMCkgewotCQkJCXJjID0gcmVxdWVzdF9maXJtd2FyZSgmZndfZW50cnksCi0JCQkJCWZ3X25hbWVbaW5pdF9zdGVwXSwgJnByaXYtPnBkZXYtPmRldik7Ci0KLQkJCQlpZiAocmMgPCAwKSB7Ci0JCQkJCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsICJyZXF1ZXN0IGZpcm13YXJlIGZhaWwhXG4iKTsKLQkJCQkJZ290byBkb3dubG9hZF9maXJtd2FyZV9mYWlsOwotCQkJCX0KLQotCQkJCWlmIChmd19lbnRyeS0+c2l6ZSA+IHNpemVvZihwZmlybXdhcmUtPmZpcm13YXJlX2J1Zltpbml0X3N0ZXBdKSkgewotCQkJCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLAotCQkJCQkJImltZyBmaWxlIHNpemUgZXhjZWVkIHRoZSBjb250YWluZXIgYnVmZmVyIGZhaWwhXG4iKTsKLQkJCQkJZ290byBkb3dubG9hZF9maXJtd2FyZV9mYWlsOwotCQkJCX0KLQotCQkJCWlmIChpbml0X3N0ZXAgIT0gRldfSU5JVF9TVEVQMV9NQUlOKSB7Ci0JCQkJCW1lbWNweShwZmlybXdhcmUtPmZpcm13YXJlX2J1Zltpbml0X3N0ZXBdLAotCQkJCQkJCWZ3X2VudHJ5LT5kYXRhLCBmd19lbnRyeS0+c2l6ZSk7Ci0JCQkJCXBmaXJtd2FyZS0+ZmlybXdhcmVfYnVmX3NpemVbaW5pdF9zdGVwXSA9IGZ3X2VudHJ5LT5zaXplOwotCi0JCQkJfSBlbHNlIHsKLQkJCQkJbWVtc2V0KHBmaXJtd2FyZS0+ZmlybXdhcmVfYnVmW2luaXRfc3RlcF0sIDAsIDEyOCk7Ci0JCQkJCW1lbWNweSgmcGZpcm13YXJlLT5maXJtd2FyZV9idWZbaW5pdF9zdGVwXVsxMjhdLCBmd19lbnRyeS0+ZGF0YSwKLQkJCQkJCQkJCWZ3X2VudHJ5LT5zaXplKTsKLQkJCQkJcGZpcm13YXJlLT5maXJtd2FyZV9idWZfc2l6ZVtpbml0X3N0ZXBdID0gZndfZW50cnktPnNpemUrMTI4OwotCQkJCX0KLQotCQkJCWlmIChyc3Rfb3B0ID09IE9QVF9TWVNURU1fUkVTRVQpCi0JCQkJCXJlbGVhc2VfZmlybXdhcmUoZndfZW50cnkpOwotCQkJfQotCQkJbWFwcGVkX2ZpbGUgPSBwZmlybXdhcmUtPmZpcm13YXJlX2J1Zltpbml0X3N0ZXBdOwotCQkJZmlsZV9sZW5ndGggPSBwZmlybXdhcmUtPmZpcm13YXJlX2J1Zl9zaXplW2luaXRfc3RlcF07Ci0KLQkJfSBlbHNlIGlmIChyc3Rfb3B0ID09IE9QVF9GSVJNV0FSRV9SRVNFVCkgewotCQkJLyogd2Ugb25seSBuZWVkIHRvIGRvd25sb2FkIGRhdGEuaW1nIGhlcmUgKi8KLQkJCW1hcHBlZF9maWxlID0gcGZpcm13YXJlLT5maXJtd2FyZV9idWZbaW5pdF9zdGVwXTsKLQkJCWZpbGVfbGVuZ3RoID0gcGZpcm13YXJlLT5maXJtd2FyZV9idWZfc2l6ZVtpbml0X3N0ZXBdOwotCQl9Ci0KLQkJLyogRG93bmxvYWQgaW1hZ2UgZmlsZSAqLwotCQkvKiBUaGUgZmlybXdhcmUgZG93bmxvYWQgcHJvY2VzcyBpcyBqdXN0IGFzIGZvbGxvd2luZywKLQkJICogMS4gdGhhdCBpcyBlYWNoIHBhY2tldCB3aWxsIGJlIHNlZ21lbnRlZCBhbmQgaW5zZXJ0ZWQgdG8gdGhlCi0JCSAqICAgIHdhaXQgcXVldWUuCi0JCSAqIDIuIGVhY2ggcGFja2V0IHNlZ21lbnQgd2lsbCBiZSBwdXQgaW4gdGhlIHNrYl9idWZmIHBhY2tldC4KLQkJICogMy4gZWFjaCBza2JfYnVmZiBwYWNrZXQgZGF0YSBjb250ZW50IHdpbGwgYWxyZWFkeSBpbmNsdWRlCi0JCSAqICAgIHRoZSBmaXJtd2FyZSBpbmZvIGFuZCBUeCBkZXNjcmlwdG9yIGluZm8KLQkJICovCi0JCXJ0X3N0YXR1cyA9IGZ3X2Rvd25sb2FkX2NvZGUocHJpdiwgbWFwcGVkX2ZpbGUsIGZpbGVfbGVuZ3RoKTsKLQkJaWYgKHJ0X3N0YXR1cyAhPSBUUlVFKQotCQkJZ290byBkb3dubG9hZF9maXJtd2FyZV9mYWlsOwotCi0JCXN3aXRjaCAoaW5pdF9zdGVwKSB7Ci0JCWNhc2UgRldfSU5JVF9TVEVQMF9CT09UOgotCQkJLyogRG93bmxvYWQgYm9vdAotCQkJICogaW5pdGlhbGl6ZSBjb21tYW5kIGRlc2NyaXB0b3IuCi0JCQkgKiB3aWxsIHNldCBwb2xsaW5nIGJpdCB3aGVuIGZpcm13YXJlIGNvZGUgaXMgYWxzbwotCQkJICogY29uZmlndXJlZAotCQkJICovCi0JCQlwZmlybXdhcmUtPmZpcm13YXJlX3N0YXR1cyA9IEZXX1NUQVRVU18xX01PVkVfQk9PVF9DT0RFOwotCQkJLyogbWRlbGF5KDEwMDApOyAqLwotCQkJLyoKLQkJCSAqIFRvIGluaXRpYWxpemUgSU1FTSwgQ1BVIG1vdmUgY29kZSAgZnJvbSAweDgwMDAwMDgwLAotCQkJICogaGVuY2UsIHdlIHNlbmQgMHg4MCBieXRlIHBhY2tldAotCQkJICovCi0JCQlicmVhazsKLQotCQljYXNlIEZXX0lOSVRfU1RFUDFfTUFJTjoKLQkJCS8qIERvd25sb2FkIGZpcm13YXJlIGNvZGUuCi0JCQkgKiBXYWl0IHVudGlsIEJvb3QgUmVhZHkgYW5kIFR1cm4gb24gQ1BVICovCi0JCQlwZmlybXdhcmUtPmZpcm13YXJlX3N0YXR1cyA9IEZXX1NUQVRVU18yX01PVkVfTUFJTl9DT0RFOwotCi0JCQkvKiBDaGVjayBQdXQgQ29kZSBPSyBhbmQgVHVybiBPbiBDUFUgKi8KLQkJCXJ0X3N0YXR1cyA9IENQVWNoZWNrX21haW5jb2Rlb2tfdHVybm9uQ1BVKHByaXYpOwotCQkJaWYgKHJ0X3N0YXR1cyAhPSBUUlVFKSB7Ci0JCQkJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwKLQkJCQkJIkNQVWNoZWNrX21haW5jb2Rlb2tfdHVybm9uQ1BVIGZhaWwhXG4iKTsKLQkJCQlnb3RvIGRvd25sb2FkX2Zpcm13YXJlX2ZhaWw7Ci0JCQl9Ci0KLQkJCXBmaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzID0gRldfU1RBVFVTXzNfVFVSTk9OX0NQVTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgRldfSU5JVF9TVEVQMl9EQVRBOgotCQkJLyogZG93bmxvYWQgaW5pdGlhbCBkYXRhIGNvZGUgKi8KLQkJCXBmaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzID0gRldfU1RBVFVTXzRfTU9WRV9EQVRBX0NPREU7Ci0JCQltZGVsYXkoMSk7Ci0KLQkJCXJ0X3N0YXR1cyA9IENQVWNoZWNrX2Zpcm13YXJlX3JlYWR5KHByaXYpOwotCQkJaWYgKHJ0X3N0YXR1cyAhPSBUUlVFKSB7Ci0JCQkJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwKLQkJCQkJIkNQVWNoZWNrX2Zpcm13YXJlX3JlYWR5IGZhaWwoJWQpIVxuIiwKLQkJCQkJcnRfc3RhdHVzKTsKLQkJCQlnb3RvIGRvd25sb2FkX2Zpcm13YXJlX2ZhaWw7Ci0JCQl9Ci0KLQkJCS8qIHdhaXQgdW50aWwgZGF0YSBjb2RlIGlzIGluaXRpYWxpemVkIHJlYWR5LiovCi0JCQlwZmlybXdhcmUtPmZpcm13YXJlX3N0YXR1cyA9IEZXX1NUQVRVU181X1JFQURZOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCAiRmlybXdhcmUgRG93bmxvYWQgU3VjY2Vzc1xuIik7Ci0JcmV0dXJuIHJ0X3N0YXR1czsKLQotZG93bmxvYWRfZmlybXdhcmVfZmFpbDoKLQlSVF9UUkFDRShDT01QX0VSUiwgIkVSUiBpbiAlcygpIHN0ZXAgJWRcbiIsIF9fZnVuY19fLCBpbml0X3N0ZXApOwotCXJ0X3N0YXR1cyA9IGZhbHNlOwotCXJldHVybiBydF9zdGF0dXM7Ci19Ci0KLU1PRFVMRV9GSVJNV0FSRSgiUlRMODE5MkUvYm9vdC5pbWciKTsKLU1PRFVMRV9GSVJNV0FSRSgiUlRMODE5MkUvbWFpbi5pbWciKTsKLU1PRFVMRV9GSVJNV0FSRSgiUlRMODE5MkUvZGF0YS5pbWciKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5eEVfcGh5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOXhFX3BoeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTc4MjhlLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5eEVfcGh5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjI1ICswLDAgQEAKLSNpbmNsdWRlICJyODE5MkUuaCIKLSNpbmNsdWRlICJyODE5MkVfaHcuaCIKLSNpbmNsdWRlICJyODE5eEVfcGh5cmVnLmgiCi0jaW5jbHVkZSAicjgxOTBfcnRsODI1Ni5oIgotI2luY2x1ZGUgInI4MTl4RV9waHkuaCIKLSNpbmNsdWRlICJyODE5MkVfZG0uaCIKLSNpZmRlZiBFTkFCTEVfRE9UMTFECi0jaW5jbHVkZSAiaWVlZTgwMjExL2RvdDExZC5oIgotI2VuZGlmCi1zdGF0aWMgY29uc3QgdTMyIFJGX0NIQU5ORUxfVEFCTEVfWkVCUkFbXSA9IHsKLQkwLAotCTB4MDg1YywgLy8yNDEyIDEKLQkweDA4ZGMsIC8vMjQxNyAyCi0JMHgwOTVjLCAvLzI0MjIgMwotCTB4MDlkYywgLy8yNDI3IDQKLQkweDBhNWMsIC8vMjQzMiA1Ci0JMHgwYWRjLCAvLzI0MzcgNgotCTB4MGI1YywgLy8yNDQyIDcKLQkweDBiZGMsIC8vMjQ0NyA4Ci0JMHgwYzVjLCAvLzI0NTIgOQotCTB4MGNkYywgLy8yNDU3IDEwCi0JMHgwZDVjLCAvLzI0NjIgMTEKLQkweDBkZGMsIC8vMjQ2NyAxMgotCTB4MGU1YywgLy8yNDcyIDEzCi0JMHgwZjcyLCAvLzI0ODQKLX07Ci0KLXN0YXRpYyB1MzIgUnRsODE5MlBjaUVNQUNQSFlfQXJyYXlbXSA9IHsKLTB4MDNjLDB4ZmZmZjAwMDAsMHgwMDAwMGYwZiwKLTB4MzQwLDB4ZmZmZmZmZmYsMHgxNjFhMWExYSwKLTB4MzQ0LDB4ZmZmZmZmZmYsMHgxMjEyMTQxNiwKLTB4MzQ4LDB4MDAwMGZmZmYsMHgwMDAwMTgxOCwKLTB4MTJjLDB4ZmZmZmZmZmYsMHgwNDAwMDgwMiwKLTB4MzE4LDB4MDAwMDBmZmYsMHgwMDAwMDEwMCwKLX07Ci1zdGF0aWMgdTMyIFJ0bDgxOTJQY2lFTUFDUEhZX0FycmF5X1BHW10gPSB7Ci0weDAzYywweGZmZmYwMDAwLDB4MDAwMDBmMGYsCi0weGUwMCwweGZmZmZmZmZmLDB4MDYwOTA5MDksCi0weGUwNCwweGZmZmZmZmZmLDB4MDAwMzAzMDYsCi0weGUwOCwweDAwMDBmZjAwLDB4MDAwMDAwMDAsCi0weGUxMCwweGZmZmZmZmZmLDB4MGEwYzBkMGYsCi0weGUxNCwweGZmZmZmZmZmLDB4MDYwNzA4MDksCi0weGUxOCwweGZmZmZmZmZmLDB4MGEwYzBkMGYsCi0weGUxYywweGZmZmZmZmZmLDB4MDYwNzA4MDksCi0weDEyYywweGZmZmZmZmZmLDB4MDQwMDA4MDIsCi0weDMxOCwweDAwMDAwZmZmLDB4MDAwMDA4MDAsCi19Owotc3RhdGljIHUzMiBSdGw4MTkyUGNpRUFHQ1RBQl9BcnJheVtBR0NUQUJfQXJyYXlMZW5ndGhdID0gewotMHhjNzgsMHg3ZDAwMDAwMSwKLTB4Yzc4LDB4N2QwMTAwMDEsCi0weGM3OCwweDdkMDIwMDAxLAotMHhjNzgsMHg3ZDAzMDAwMSwKLTB4Yzc4LDB4N2QwNDAwMDEsCi0weGM3OCwweDdkMDUwMDAxLAotMHhjNzgsMHg3YzA2MDAwMSwKLTB4Yzc4LDB4N2IwNzAwMDEsCi0weGM3OCwweDdhMDgwMDAxLAotMHhjNzgsMHg3OTA5MDAwMSwKLTB4Yzc4LDB4NzgwYTAwMDEsCi0weGM3OCwweDc3MGIwMDAxLAotMHhjNzgsMHg3NjBjMDAwMSwKLTB4Yzc4LDB4NzUwZDAwMDEsCi0weGM3OCwweDc0MGUwMDAxLAotMHhjNzgsMHg3MzBmMDAwMSwKLTB4Yzc4LDB4NzIxMDAwMDEsCi0weGM3OCwweDcxMTEwMDAxLAotMHhjNzgsMHg3MDEyMDAwMSwKLTB4Yzc4LDB4NmYxMzAwMDEsCi0weGM3OCwweDZlMTQwMDAxLAotMHhjNzgsMHg2ZDE1MDAwMSwKLTB4Yzc4LDB4NmMxNjAwMDEsCi0weGM3OCwweDZiMTcwMDAxLAotMHhjNzgsMHg2YTE4MDAwMSwKLTB4Yzc4LDB4NjkxOTAwMDEsCi0weGM3OCwweDY4MWEwMDAxLAotMHhjNzgsMHg2NzFiMDAwMSwKLTB4Yzc4LDB4NjYxYzAwMDEsCi0weGM3OCwweDY1MWQwMDAxLAotMHhjNzgsMHg2NDFlMDAwMSwKLTB4Yzc4LDB4NDkxZjAwMDEsCi0weGM3OCwweDQ4MjAwMDAxLAotMHhjNzgsMHg0NzIxMDAwMSwKLTB4Yzc4LDB4NDYyMjAwMDEsCi0weGM3OCwweDQ1MjMwMDAxLAotMHhjNzgsMHg0NDI0MDAwMSwKLTB4Yzc4LDB4NDMyNTAwMDEsCi0weGM3OCwweDI4MjYwMDAxLAotMHhjNzgsMHgyNzI3MDAwMSwKLTB4Yzc4LDB4MjYyODAwMDEsCi0weGM3OCwweDI1MjkwMDAxLAotMHhjNzgsMHgyNDJhMDAwMSwKLTB4Yzc4LDB4MjMyYjAwMDEsCi0weGM3OCwweDIyMmMwMDAxLAotMHhjNzgsMHgyMTJkMDAwMSwKLTB4Yzc4LDB4MjAyZTAwMDEsCi0weGM3OCwweDBhMmYwMDAxLAotMHhjNzgsMHgwODMwMDAwMSwKLTB4Yzc4LDB4MDYzMTAwMDEsCi0weGM3OCwweDA1MzIwMDAxLAotMHhjNzgsMHgwNDMzMDAwMSwKLTB4Yzc4LDB4MDMzNDAwMDEsCi0weGM3OCwweDAyMzUwMDAxLAotMHhjNzgsMHgwMTM2MDAwMSwKLTB4Yzc4LDB4MDAzNzAwMDEsCi0weGM3OCwweDAwMzgwMDAxLAotMHhjNzgsMHgwMDM5MDAwMSwKLTB4Yzc4LDB4MDAzYTAwMDEsCi0weGM3OCwweDAwM2IwMDAxLAotMHhjNzgsMHgwMDNjMDAwMSwKLTB4Yzc4LDB4MDAzZDAwMDEsCi0weGM3OCwweDAwM2UwMDAxLAotMHhjNzgsMHgwMDNmMDAwMSwKLTB4Yzc4LDB4N2Q0MDAwMDEsCi0weGM3OCwweDdkNDEwMDAxLAotMHhjNzgsMHg3ZDQyMDAwMSwKLTB4Yzc4LDB4N2Q0MzAwMDEsCi0weGM3OCwweDdkNDQwMDAxLAotMHhjNzgsMHg3ZDQ1MDAwMSwKLTB4Yzc4LDB4N2M0NjAwMDEsCi0weGM3OCwweDdiNDcwMDAxLAotMHhjNzgsMHg3YTQ4MDAwMSwKLTB4Yzc4LDB4Nzk0OTAwMDEsCi0weGM3OCwweDc4NGEwMDAxLAotMHhjNzgsMHg3NzRiMDAwMSwKLTB4Yzc4LDB4NzY0YzAwMDEsCi0weGM3OCwweDc1NGQwMDAxLAotMHhjNzgsMHg3NDRlMDAwMSwKLTB4Yzc4LDB4NzM0ZjAwMDEsCi0weGM3OCwweDcyNTAwMDAxLAotMHhjNzgsMHg3MTUxMDAwMSwKLTB4Yzc4LDB4NzA1MjAwMDEsCi0weGM3OCwweDZmNTMwMDAxLAotMHhjNzgsMHg2ZTU0MDAwMSwKLTB4Yzc4LDB4NmQ1NTAwMDEsCi0weGM3OCwweDZjNTYwMDAxLAotMHhjNzgsMHg2YjU3MDAwMSwKLTB4Yzc4LDB4NmE1ODAwMDEsCi0weGM3OCwweDY5NTkwMDAxLAotMHhjNzgsMHg2ODVhMDAwMSwKLTB4Yzc4LDB4Njc1YjAwMDEsCi0weGM3OCwweDY2NWMwMDAxLAotMHhjNzgsMHg2NTVkMDAwMSwKLTB4Yzc4LDB4NjQ1ZTAwMDEsCi0weGM3OCwweDQ5NWYwMDAxLAotMHhjNzgsMHg0ODYwMDAwMSwKLTB4Yzc4LDB4NDc2MTAwMDEsCi0weGM3OCwweDQ2NjIwMDAxLAotMHhjNzgsMHg0NTYzMDAwMSwKLTB4Yzc4LDB4NDQ2NDAwMDEsCi0weGM3OCwweDQzNjUwMDAxLAotMHhjNzgsMHgyODY2MDAwMSwKLTB4Yzc4LDB4Mjc2NzAwMDEsCi0weGM3OCwweDI2NjgwMDAxLAotMHhjNzgsMHgyNTY5MDAwMSwKLTB4Yzc4LDB4MjQ2YTAwMDEsCi0weGM3OCwweDIzNmIwMDAxLAotMHhjNzgsMHgyMjZjMDAwMSwKLTB4Yzc4LDB4MjE2ZDAwMDEsCi0weGM3OCwweDIwNmUwMDAxLAotMHhjNzgsMHgwYTZmMDAwMSwKLTB4Yzc4LDB4MDg3MDAwMDEsCi0weGM3OCwweDA2NzEwMDAxLAotMHhjNzgsMHgwNTcyMDAwMSwKLTB4Yzc4LDB4MDQ3MzAwMDEsCi0weGM3OCwweDAzNzQwMDAxLAotMHhjNzgsMHgwMjc1MDAwMSwKLTB4Yzc4LDB4MDE3NjAwMDEsCi0weGM3OCwweDAwNzcwMDAxLAotMHhjNzgsMHgwMDc4MDAwMSwKLTB4Yzc4LDB4MDA3OTAwMDEsCi0weGM3OCwweDAwN2EwMDAxLAotMHhjNzgsMHgwMDdiMDAwMSwKLTB4Yzc4LDB4MDA3YzAwMDEsCi0weGM3OCwweDAwN2QwMDAxLAotMHhjNzgsMHgwMDdlMDAwMSwKLTB4Yzc4LDB4MDA3ZjAwMDEsCi0weGM3OCwweDJlMDAwMDFlLAotMHhjNzgsMHgyZTAxMDAxZSwKLTB4Yzc4LDB4MmUwMjAwMWUsCi0weGM3OCwweDJlMDMwMDFlLAotMHhjNzgsMHgyZTA0MDAxZSwKLTB4Yzc4LDB4MmUwNTAwMWUsCi0weGM3OCwweDMwMDYwMDFlLAotMHhjNzgsMHgzNDA3MDAxZSwKLTB4Yzc4LDB4MzkwODAwMWUsCi0weGM3OCwweDNjMDkwMDFlLAotMHhjNzgsMHgzZjBhMDAxZSwKLTB4Yzc4LDB4NDIwYjAwMWUsCi0weGM3OCwweDQ0MGMwMDFlLAotMHhjNzgsMHg0NTBkMDAxZSwKLTB4Yzc4LDB4NDYwZTAwMWUsCi0weGM3OCwweDQ2MGYwMDFlLAotMHhjNzgsMHg0NzEwMDAxZSwKLTB4Yzc4LDB4NDgxMTAwMWUsCi0weGM3OCwweDQ5MTIwMDFlLAotMHhjNzgsMHg0YTEzMDAxZSwKLTB4Yzc4LDB4NGIxNDAwMWUsCi0weGM3OCwweDRiMTUwMDFlLAotMHhjNzgsMHg0YzE2MDAxZSwKLTB4Yzc4LDB4NGQxNzAwMWUsCi0weGM3OCwweDRlMTgwMDFlLAotMHhjNzgsMHg0ZjE5MDAxZSwKLTB4Yzc4LDB4NGYxYTAwMWUsCi0weGM3OCwweDUwMWIwMDFlLAotMHhjNzgsMHg1MTFjMDAxZSwKLTB4Yzc4LDB4NTIxZDAwMWUsCi0weGM3OCwweDUyMWUwMDFlLAotMHhjNzgsMHg1MzFmMDAxZSwKLTB4Yzc4LDB4NTMyMDAwMWUsCi0weGM3OCwweDU0MjEwMDFlLAotMHhjNzgsMHg1NTIyMDAxZSwKLTB4Yzc4LDB4NTUyMzAwMWUsCi0weGM3OCwweDU2MjQwMDFlLAotMHhjNzgsMHg1NzI1MDAxZSwKLTB4Yzc4LDB4NTcyNjAwMWUsCi0weGM3OCwweDU4MjcwMDFlLAotMHhjNzgsMHg1ODI4MDAxZSwKLTB4Yzc4LDB4NTkyOTAwMWUsCi0weGM3OCwweDU5MmEwMDFlLAotMHhjNzgsMHg1YTJiMDAxZSwKLTB4Yzc4LDB4NWIyYzAwMWUsCi0weGM3OCwweDVjMmQwMDFlLAotMHhjNzgsMHg1YzJlMDAxZSwKLTB4Yzc4LDB4NWQyZjAwMWUsCi0weGM3OCwweDVlMzAwMDFlLAotMHhjNzgsMHg1ZjMxMDAxZSwKLTB4Yzc4LDB4NjAzMjAwMWUsCi0weGM3OCwweDYwMzMwMDFlLAotMHhjNzgsMHg2MTM0MDAxZSwKLTB4Yzc4LDB4NjIzNTAwMWUsCi0weGM3OCwweDYzMzYwMDFlLAotMHhjNzgsMHg2NDM3MDAxZSwKLTB4Yzc4LDB4NjQzODAwMWUsCi0weGM3OCwweDY1MzkwMDFlLAotMHhjNzgsMHg2NjNhMDAxZSwKLTB4Yzc4LDB4NjczYjAwMWUsCi0weGM3OCwweDY3M2MwMDFlLAotMHhjNzgsMHg2ODNkMDAxZSwKLTB4Yzc4LDB4NjkzZTAwMWUsCi0weGM3OCwweDZhM2YwMDFlLAotfTsKLXN0YXRpYyB1MzIgUnRsODE5MlBjaUVQSFlfUkVHQXJyYXlbUEhZX1JFR0FycmF5TGVuZ3RoXSA9IHsKLTB4MCwgfTsKLXN0YXRpYyB1MzIgUnRsODE5MlBjaUVQSFlfUkVHXzFUMlJBcnJheVtQSFlfUkVHXzFUMlJBcnJheUxlbmd0aF0gPSB7Ci0weDgwMCwweDAwMDAwMDAwLAotMHg4MDQsMHgwMDAwMDAwMSwKLTB4ODA4LDB4MDAwMGZjMDAsCi0weDgwYywweDAwMDAwMDFjLAotMHg4MTAsMHg4MDEwMTBhYSwKLTB4ODE0LDB4MDA4NTE0ZDAsCi0weDgxOCwweDAwMDAwMDQwLAotMHg4MWMsMHgwMDAwMDAwMCwKLTB4ODIwLDB4MDAwMDAwMDQsCi0weDgyNCwweDAwNjkwMDAwLAotMHg4MjgsMHgwMDAwMDAwNCwKLTB4ODJjLDB4MDBlOTAwMDAsCi0weDgzMCwweDAwMDAwMDA0LAotMHg4MzQsMHgwMDY5MDAwMCwKLTB4ODM4LDB4MDAwMDAwMDQsCi0weDgzYywweDAwZTkwMDAwLAotMHg4NDAsMHgwMDAwMDAwMCwKLTB4ODQ0LDB4MDAwMDAwMDAsCi0weDg0OCwweDAwMDAwMDAwLAotMHg4NGMsMHgwMDAwMDAwMCwKLTB4ODUwLDB4MDAwMDAwMDAsCi0weDg1NCwweDAwMDAwMDAwLAotMHg4NTgsMHg2NWE5NjVhOSwKLTB4ODVjLDB4NjVhOTY1YTksCi0weDg2MCwweDAwMWYwMDEwLAotMHg4NjQsMHgwMDdmMDAxMCwKLTB4ODY4LDB4MDAxZjAwMTAsCi0weDg2YywweDAwN2YwMDEwLAotMHg4NzAsMHgwZjEwMGY3MCwKLTB4ODc0LDB4MGYxMDBmNzAsCi0weDg3OCwweDAwMDAwMDAwLAotMHg4N2MsMHgwMDAwMDAwMCwKLTB4ODgwLDB4Njg3MGUzNmMsCi0weDg4NCwweGUzNTczNjAwLAotMHg4ODgsMHg0MjYwYzM0MCwKLTB4ODhjLDB4MDAwMGZmMDAsCi0weDg5MCwweDAwMDAwMDAwLAotMHg4OTQsMHhmZmZmZmZmZSwKLTB4ODk4LDB4NGM0MjM4MmYsCi0weDg5YywweDAwNjU2MDU2LAotMHg4YjAsMHgwMDAwMDAwMCwKLTB4OGUwLDB4MDAwMDAwMDAsCi0weDhlNCwweDAwMDAwMDAwLAotMHg5MDAsMHgwMDAwMDAwMCwKLTB4OTA0LDB4MDAwMDAwMjMsCi0weDkwOCwweDAwMDAwMDAwLAotMHg5MGMsMHgzMTEyMTMxMSwKLTB4YTAwLDB4MDBkMGM3ZDgsCi0weGEwNCwweDgxMWYwMDA4LAotMHhhMDgsMHg4MGNkODMwMCwKLTB4YTBjLDB4MmU2Mjc0MGYsCi0weGExMCwweDk1MDA5Yjc4LAotMHhhMTQsMHgxMTE0NTAwOCwKLTB4YTE4LDB4MDA4ODExMTcsCi0weGExYywweDg5MTQwZmEwLAotMHhhMjAsMHgxYTFiMDAwMCwKLTB4YTI0LDB4MDkwZTEzMTcsCi0weGEyOCwweDAwMDAwMjA0LAotMHhhMmMsMHgwMDAwMDAwMCwKLTB4YzAwLDB4MDAwMDAwNDAsCi0weGMwNCwweDAwMDA1NDMzLAotMHhjMDgsMHgwMDAwMDBlNCwKLTB4YzBjLDB4NmM2YzZjNmMsCi0weGMxMCwweDA4ODAwMDAwLAotMHhjMTQsMHg0MDAwMDEwMCwKLTB4YzE4LDB4MDgwMDAwMDAsCi0weGMxYywweDQwMDAwMTAwLAotMHhjMjAsMHgwODAwMDAwMCwKLTB4YzI0LDB4NDAwMDAxMDAsCi0weGMyOCwweDA4MDAwMDAwLAotMHhjMmMsMHg0MDAwMDEwMCwKLTB4YzMwLDB4NmRlOWFjNDQsCi0weGMzNCwweDQ2NWM1MmNkLAotMHhjMzgsMHg0OTdmNTk5NCwKLTB4YzNjLDB4MGE5Njk3NjQsCi0weGM0MCwweDFmN2M0MDNmLAotMHhjNDQsMHgwMDAxMDBiNywKLTB4YzQ4LDB4ZWMwMjAwMDAsCi0weGM0YywweDAwMDAwMzAwLAotMHhjNTAsMHg2OTU0MzQyMCwKLTB4YzU0LDB4NDMzYzAwOTQsCi0weGM1OCwweDY5NTQzNDIwLAotMHhjNWMsMHg0MzNjMDA5NCwKLTB4YzYwLDB4Njk1NDM0MjAsCi0weGM2NCwweDQzM2MwMDk0LAotMHhjNjgsMHg2OTU0MzQyMCwKLTB4YzZjLDB4NDMzYzAwOTQsCi0weGM3MCwweDJjN2YwMDBkLAotMHhjNzQsMHgwMTg2MTc1YiwKLTB4Yzc4LDB4MDAwMDAwMWYsCi0weGM3YywweDAwYjkxNjEyLAotMHhjODAsMHg0MDAwMDEwMCwKLTB4Yzg0LDB4MjAwMDAwMDAsCi0weGM4OCwweDQwMDAwMTAwLAotMHhjOGMsMHgyMDIwMDAwMCwKLTB4YzkwLDB4NDAwMDAxMDAsCi0weGM5NCwweDAwMDAwMDAwLAotMHhjOTgsMHg0MDAwMDEwMCwKLTB4YzljLDB4MDAwMDAwMDAsCi0weGNhMCwweDAwNDkyNDkyLAotMHhjYTQsMHgwMDAwMDAwMCwKLTB4Y2E4LDB4MDAwMDAwMDAsCi0weGNhYywweDAwMDAwMDAwLAotMHhjYjAsMHgwMDAwMDAwMCwKLTB4Y2I0LDB4MDAwMDAwMDAsCi0weGNiOCwweDAwMDAwMDAwLAotMHhjYmMsMHgwMDQ5MjQ5MiwKLTB4Y2MwLDB4MDAwMDAwMDAsCi0weGNjNCwweDAwMDAwMDAwLAotMHhjYzgsMHgwMDAwMDAwMCwKLTB4Y2NjLDB4MDAwMDAwMDAsCi0weGNkMCwweDAwMDAwMDAwLAotMHhjZDQsMHgwMDAwMDAwMCwKLTB4Y2Q4LDB4NjRiMjI0MjcsCi0weGNkYywweDAwNzY2OTMyLAotMHhjZTAsMHgwMDIyMjIyMiwKLTB4ZDAwLDB4MDAwMDA3NTAsCi0weGQwNCwweDAwMDAwNDAzLAotMHhkMDgsMHgwMDAwOTA3ZiwKLTB4ZDBjLDB4MDAwMDAwMDEsCi0weGQxMCwweGEwNjMzMzMzLAotMHhkMTQsMHgzMzMzM2M2MywKLTB4ZDE4LDB4NmE4ZjViNmIsCi0weGQxYywweDAwMDAwMDAwLAotMHhkMjAsMHgwMDAwMDAwMCwKLTB4ZDI0LDB4MDAwMDAwMDAsCi0weGQyOCwweDAwMDAwMDAwLAotMHhkMmMsMHhjYzk3OTk3NSwKLTB4ZDMwLDB4MDAwMDAwMDAsCi0weGQzNCwweDAwMDAwMDAwLAotMHhkMzgsMHgwMDAwMDAwMCwKLTB4ZDNjLDB4MDAwMjcyOTMsCi0weGQ0MCwweDAwMDAwMDAwLAotMHhkNDQsMHgwMDAwMDAwMCwKLTB4ZDQ4LDB4MDAwMDAwMDAsCi0weGQ0YywweDAwMDAwMDAwLAotMHhkNTAsMHg2NDM3MTQwYSwKLTB4ZDU0LDB4MDI0ZGJkMDIsCi0weGQ1OCwweDAwMDAwMDAwLAotMHhkNWMsMHgwNDAzMjA2NCwKLTB4ZTAwLDB4MTYxYTFhMWEsCi0weGUwNCwweDEyMTIxNDE2LAotMHhlMDgsMHgwMDAwMTgwMCwKLTB4ZTBjLDB4MDAwMDAwMDAsCi0weGUxMCwweDE2MWExYTFhLAotMHhlMTQsMHgxMjEyMTQxNiwKLTB4ZTE4LDB4MTYxYTFhMWEsCi0weGUxYywweDEyMTIxNDE2LAotfTsKLXN0YXRpYyB1MzIgUnRsODE5MlBjaUVSYWRpb0FfQXJyYXlbUmFkaW9BX0FycmF5TGVuZ3RoXSA9IHsKLTB4MDE5LDB4MDAwMDAwMDMsCi0weDAwMCwweDAwMDAwMGJmLAotMHgwMDEsMHgwMDAwMGVlMCwKLTB4MDAyLDB4MDAwMDAwNGMsCi0weDAwMywweDAwMDAwN2YxLAotMHgwMDQsMHgwMDAwMDk3NSwKLTB4MDA1LDB4MDAwMDBjNTgsCi0weDAwNiwweDAwMDAwYWU2LAotMHgwMDcsMHgwMDAwMDBjYSwKLTB4MDA4LDB4MDAwMDBlMWMsCi0weDAwOSwweDAwMDAwN2YwLAotMHgwMGEsMHgwMDAwMDlkMCwKLTB4MDBiLDB4MDAwMDAxYmEsCi0weDAwYywweDAwMDAwMjQwLAotMHgwMGUsMHgwMDAwMDAyMCwKLTB4MDBmLDB4MDAwMDA5OTAsCi0weDAxMiwweDAwMDAwODA2LAotMHgwMTQsMHgwMDAwMDVhYiwKLTB4MDE1LDB4MDAwMDBmODAsCi0weDAxNiwweDAwMDAwMDIwLAotMHgwMTcsMHgwMDAwMDU5NywKLTB4MDE4LDB4MDAwMDA1MGEsCi0weDAxYSwweDAwMDAwZjgwLAotMHgwMWIsMHgwMDAwMGY1ZSwKLTB4MDFjLDB4MDAwMDAwMDgsCi0weDAxZCwweDAwMDAwNjA3LAotMHgwMWUsMHgwMDAwMDZjYywKLTB4MDFmLDB4MDAwMDAwMDAsCi0weDAyMCwweDAwMDAwMWE1LAotMHgwMWYsMHgwMDAwMDAwMSwKLTB4MDIwLDB4MDAwMDAxNjUsCi0weDAxZiwweDAwMDAwMDAyLAotMHgwMjAsMHgwMDAwMDBjNiwKLTB4MDFmLDB4MDAwMDAwMDMsCi0weDAyMCwweDAwMDAwMDg2LAotMHgwMWYsMHgwMDAwMDAwNCwKLTB4MDIwLDB4MDAwMDAwNDYsCi0weDAxZiwweDAwMDAwMDA1LAotMHgwMjAsMHgwMDAwMDFlNiwKLTB4MDFmLDB4MDAwMDAwMDYsCi0weDAyMCwweDAwMDAwMWE2LAotMHgwMWYsMHgwMDAwMDAwNywKLTB4MDIwLDB4MDAwMDAxNjYsCi0weDAxZiwweDAwMDAwMDA4LAotMHgwMjAsMHgwMDAwMDBjNywKLTB4MDFmLDB4MDAwMDAwMDksCi0weDAyMCwweDAwMDAwMDg3LAotMHgwMWYsMHgwMDAwMDAwYSwKLTB4MDIwLDB4MDAwMDAwZjcsCi0weDAxZiwweDAwMDAwMDBiLAotMHgwMjAsMHgwMDAwMDBkNywKLTB4MDFmLDB4MDAwMDAwMGMsCi0weDAyMCwweDAwMDAwMGI3LAotMHgwMWYsMHgwMDAwMDAwZCwKLTB4MDIwLDB4MDAwMDAwOTcsCi0weDAxZiwweDAwMDAwMDBlLAotMHgwMjAsMHgwMDAwMDA3NywKLTB4MDFmLDB4MDAwMDAwMGYsCi0weDAyMCwweDAwMDAwMDU3LAotMHgwMWYsMHgwMDAwMDAxMCwKLTB4MDIwLDB4MDAwMDAwMzcsCi0weDAxZiwweDAwMDAwMDExLAotMHgwMjAsMHgwMDAwMDBmYiwKLTB4MDFmLDB4MDAwMDAwMTIsCi0weDAyMCwweDAwMDAwMGRiLAotMHgwMWYsMHgwMDAwMDAxMywKLTB4MDIwLDB4MDAwMDAwYmIsCi0weDAxZiwweDAwMDAwMDE0LAotMHgwMjAsMHgwMDAwMDBmZiwKLTB4MDFmLDB4MDAwMDAwMTUsCi0weDAyMCwweDAwMDAwMGUzLAotMHgwMWYsMHgwMDAwMDAxNiwKLTB4MDIwLDB4MDAwMDAwYzMsCi0weDAxZiwweDAwMDAwMDE3LAotMHgwMjAsMHgwMDAwMDBhMywKLTB4MDFmLDB4MDAwMDAwMTgsCi0weDAyMCwweDAwMDAwMDgzLAotMHgwMWYsMHgwMDAwMDAxOSwKLTB4MDIwLDB4MDAwMDAwNjMsCi0weDAxZiwweDAwMDAwMDFhLAotMHgwMjAsMHgwMDAwMDA0MywKLTB4MDFmLDB4MDAwMDAwMWIsCi0weDAyMCwweDAwMDAwMDIzLAotMHgwMWYsMHgwMDAwMDAxYywKLTB4MDIwLDB4MDAwMDAwMDMsCi0weDAxZiwweDAwMDAwMDFkLAotMHgwMjAsMHgwMDAwMDFlMywKLTB4MDFmLDB4MDAwMDAwMWUsCi0weDAyMCwweDAwMDAwMWMzLAotMHgwMWYsMHgwMDAwMDAxZiwKLTB4MDIwLDB4MDAwMDAxYTMsCi0weDAxZiwweDAwMDAwMDIwLAotMHgwMjAsMHgwMDAwMDE4MywKLTB4MDFmLDB4MDAwMDAwMjEsCi0weDAyMCwweDAwMDAwMTYzLAotMHgwMWYsMHgwMDAwMDAyMiwKLTB4MDIwLDB4MDAwMDAxNDMsCi0weDAxZiwweDAwMDAwMDIzLAotMHgwMjAsMHgwMDAwMDEyMywKLTB4MDFmLDB4MDAwMDAwMjQsCi0weDAyMCwweDAwMDAwMTAzLAotMHgwMjMsMHgwMDAwMDIwMywKLTB4MDI0LDB4MDAwMDAxMDAsCi0weDAwYiwweDAwMDAwMWJhLAotMHgwMmMsMHgwMDAwMDNkNywKLTB4MDJkLDB4MDAwMDBmZjAsCi0weDAwMCwweDAwMDAwMDM3LAotMHgwMDQsMHgwMDAwMDE2MCwKLTB4MDA3LDB4MDAwMDAwODAsCi0weDAwMiwweDAwMDAwODhkLAotMHgwZmUsMHgwMDAwMDAwMCwKLTB4MGZlLDB4MDAwMDAwMDAsCi0weDAxNiwweDAwMDAwMjAwLAotMHgwMTYsMHgwMDAwMDM4MCwKLTB4MDE2LDB4MDAwMDAwMjAsCi0weDAxNiwweDAwMDAwMWEwLAotMHgwMDAsMHgwMDAwMDBiZiwKLTB4MDBkLDB4MDAwMDAwMWYsCi0weDAwZCwweDAwMDAwYzlmLAotMHgwMDIsMHgwMDAwMDA0ZCwKLTB4MDAwLDB4MDAwMDBjYmYsCi0weDAwNCwweDAwMDAwOTc1LAotMHgwMDcsMHgwMDAwMDcwMCwKLX07Ci1zdGF0aWMgdTMyIFJ0bDgxOTJQY2lFUmFkaW9CX0FycmF5W1JhZGlvQl9BcnJheUxlbmd0aF0gPSB7Ci0weDAxOSwweDAwMDAwMDAzLAotMHgwMDAsMHgwMDAwMDBiZiwKLTB4MDAxLDB4MDAwMDA2ZTAsCi0weDAwMiwweDAwMDAwMDRjLAotMHgwMDMsMHgwMDAwMDdmMSwKLTB4MDA0LDB4MDAwMDA5NzUsCi0weDAwNSwweDAwMDAwYzU4LAotMHgwMDYsMHgwMDAwMGFlNiwKLTB4MDA3LDB4MDAwMDAwY2EsCi0weDAwOCwweDAwMDAwZTFjLAotMHgwMDAsMHgwMDAwMDBiNywKLTB4MDBhLDB4MDAwMDA4NTAsCi0weDAwMCwweDAwMDAwMGJmLAotMHgwMGIsMHgwMDAwMDFiYSwKLTB4MDBjLDB4MDAwMDAyNDAsCi0weDAwZSwweDAwMDAwMDIwLAotMHgwMTUsMHgwMDAwMGY4MCwKLTB4MDE2LDB4MDAwMDAwMjAsCi0weDAxNywweDAwMDAwNTk3LAotMHgwMTgsMHgwMDAwMDUwYSwKLTB4MDFhLDB4MDAwMDBlMDAsCi0weDAxYiwweDAwMDAwZjVlLAotMHgwMWQsMHgwMDAwMDYwNywKLTB4MDFlLDB4MDAwMDA2Y2MsCi0weDAwYiwweDAwMDAwMWJhLAotMHgwMjMsMHgwMDAwMDIwMywKLTB4MDI0LDB4MDAwMDAxMDAsCi0weDAwMCwweDAwMDAwMDM3LAotMHgwMDQsMHgwMDAwMDE2MCwKLTB4MDE2LDB4MDAwMDAyMDAsCi0weDAxNiwweDAwMDAwMzgwLAotMHgwMTYsMHgwMDAwMDAyMCwKLTB4MDE2LDB4MDAwMDAxYTAsCi0weDAwZCwweDAwMDAwY2NjLAotMHgwMDAsMHgwMDAwMDBiZiwKLTB4MDAyLDB4MDAwMDAwNGQsCi0weDAwMCwweDAwMDAwY2JmLAotMHgwMDQsMHgwMDAwMDk3NSwKLTB4MDA3LDB4MDAwMDA3MDAsCi19Owotc3RhdGljIHUzMiBSdGw4MTkyUGNpRVJhZGlvQ19BcnJheVtSYWRpb0NfQXJyYXlMZW5ndGhdID0gewotMHgwLCAgfTsKLXN0YXRpYyB1MzIgUnRsODE5MlBjaUVSYWRpb0RfQXJyYXlbUmFkaW9EX0FycmF5TGVuZ3RoXSA9IHsKLTB4MCwgfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKipEZWZpbmUgbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHUzMiBwaHlfRndSRlNlcmlhbFJlYWQoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIFJGOTBfUkFESU9fUEFUSF9FIGVSRlBhdGgsIHUzMiBPZmZzZXQpOwotc3RhdGljIHZvaWQgcGh5X0Z3UkZTZXJpYWxXcml0ZShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwgdTMyIE9mZnNldCwgdTMyIERhdGEpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKkRlZmluZSBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGUqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gcmVhZCBCQiBwYXJhbWV0ZXJzIGZyb20gSGVhZGVyIGZpbGUgd2UgZ2VuLAotICoJICAgICBhbmQgZG8gcmVnaXN0ZXIgcmVhZC93cml0ZQotICogICBpbnB1dDogIHUzMglkd0JpdE1hc2sgIC8vdGFnZXQgYml0IHBvcyBpbiB0aGUgYWRkciB0byBiZSBtb2RpZmllZAotICogIG91dHB1dDogIG5vbmUKLSAqICByZXR1cm46ICB1MzIJcmV0dXJuIHRoZSBzaGlmdCBiaXQgYml0IHBvc2l0aW9uIG9mIHRoZSBtYXNrCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHUzMiBydGw4MTkyX0NhbGN1bGF0ZUJpdFNoaWZ0KHUzMiBkd0JpdE1hc2spCi17Ci0JdTMyIGk7Ci0JZm9yIChpPTA7IGk8PTMxOyBpKyspCi0JewotCQlpZiAoKChkd0JpdE1hc2s+PmkpJjB4MSkgPT0gMSkKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gaTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIGNoZWNrIGRpZmZlcmVudCBSRiB0eXBlIHRvIGV4ZWN1dGUgbGVnYWwganVkZ2VtZW50LiBJZiBSRiBQYXRoIGlzIGlsbGVnYWwsIHdlIHdpbGwgcmV0dXJuIGZhbHNlLgotICogICBpbnB1dDogIG5vbmUKLSAqICBvdXRwdXQ6ICBub25lCi0gKiAgcmV0dXJuOiAgMChpbGxlZ2FsLCBmYWxzZSksIDEobGVnYWwsdHJ1ZSkKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IHJ0bDgxOTJfcGh5X0NoZWNrSXNMZWdhbFJGUGF0aChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgdTMyIGVSRlBhdGgpCi17Ci0JdTggcmV0ID0gMTsKLQotCWlmIChwcml2LT5yZl90eXBlID09IFJGXzJUNFIpCi0JCXJldCA9IDA7Ci0JZWxzZSBpZiAocHJpdi0+cmZfdHlwZSA9PSBSRl8xVDJSKQotCXsKLQkJaWYgKGVSRlBhdGggPT0gUkY5MF9QQVRIX0EgfHwgZVJGUGF0aCA9PSBSRjkwX1BBVEhfQikKLQkJCXJldCA9IDE7Ci0JCWVsc2UgaWYgKGVSRlBhdGggPT0gUkY5MF9QQVRIX0MgfHwgZVJGUGF0aCA9PSBSRjkwX1BBVEhfRCkKLQkJCXJldCA9IDA7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHNldCBzcGVjaWZpYyBiaXRzIHRvIEJCIHJlZ2lzdGVyCi0gKiAgIGlucHV0OiAgbmV0X2RldmljZSBkZXYKLSAqICAgICAgICAgICB1MzIJZHdSZWdBZGRyICAvL3RhcmdldCBhZGRyIHRvIGJlIG1vZGlmaWVkCi0gKiAgICAgICAgICAgdTMyCWR3Qml0TWFzayAgLy90YWdldCBiaXQgcG9zIGluIHRoZSBhZGRyIHRvIGJlIG1vZGlmaWVkCi0gKiAgICAgICAgICAgdTMyCWR3RGF0YSAgICAgLy92YWx1ZSB0byBiZSB3cml0ZQotICogIG91dHB1dDogIG5vbmUKLSAqICByZXR1cm46ICBub25lCi0gKiAgbm90aWNlOgotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcnRsODE5Ml9zZXRCQnJlZyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgdTMyIGR3UmVnQWRkciwgdTMyIGR3Qml0TWFzaywgdTMyIGR3RGF0YSkKLXsKLQl1MzIgT3JpZ2luYWxWYWx1ZSwgQml0U2hpZnQsIE5ld1ZhbHVlOwotCi0JaWYoZHdCaXRNYXNrIT0gYk1hc2tEV29yZCkKLQl7Ly9pZiBub3QgImRvdWJsZSB3b3JkIiB3cml0ZQotCQlPcmlnaW5hbFZhbHVlID0gcmVhZF9uaWNfZHdvcmQocHJpdiwgZHdSZWdBZGRyKTsKLQkJQml0U2hpZnQgPSBydGw4MTkyX0NhbGN1bGF0ZUJpdFNoaWZ0KGR3Qml0TWFzayk7Ci0gICAgICAgICAgICAJTmV3VmFsdWUgPSAoKChPcmlnaW5hbFZhbHVlKSAmICh+ZHdCaXRNYXNrKSkgfCAoZHdEYXRhIDw8IEJpdFNoaWZ0KSk7Ci0JCXdyaXRlX25pY19kd29yZChwcml2LCBkd1JlZ0FkZHIsIE5ld1ZhbHVlKTsKLQl9ZWxzZQotCQl3cml0ZV9uaWNfZHdvcmQocHJpdiwgZHdSZWdBZGRyLCBkd0RhdGEpOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gcmVhZHMgc3BlY2lmaWMgYml0cyBmcm9tIEJCIHJlZ2lzdGVyCi0gKiAgIGlucHV0OiAgbmV0X2RldmljZSBkZXYKLSAqICAgICAgICAgICB1MzIJZHdSZWdBZGRyICAvL3RhcmdldCBhZGRyIHRvIGJlIHJlYWRiYWNrCi0gKiAgICAgICAgICAgdTMyCWR3Qml0TWFzayAgLy90YWdldCBiaXQgcG9zIGluIHRoZSBhZGRyIHRvIGJlIHJlYWRiYWNrCi0gKiAgb3V0cHV0OiAgbm9uZQotICogIHJldHVybjogIHUzMglEYXRhCS8vdGhlIHJlYWRiYWNrIHJlZ2lzdGVyIHZhbHVlCi0gKiAgbm90aWNlOgotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXUzMiBydGw4MTkyX1F1ZXJ5QkJSZWcoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHUzMiBkd1JlZ0FkZHIsIHUzMiBkd0JpdE1hc2spCi17Ci0JdTMyIE9yaWdpbmFsVmFsdWUsIEJpdFNoaWZ0OwotCi0JT3JpZ2luYWxWYWx1ZSA9IHJlYWRfbmljX2R3b3JkKHByaXYsIGR3UmVnQWRkcik7Ci0JQml0U2hpZnQgPSBydGw4MTkyX0NhbGN1bGF0ZUJpdFNoaWZ0KGR3Qml0TWFzayk7Ci0JcmV0dXJuIChPcmlnaW5hbFZhbHVlICYgZHdCaXRNYXNrKSA+PiBCaXRTaGlmdDsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHJlYWQgcmVnaXN0ZXIgZnJvbSBSRiBjaGlwCi0gKiAgIGlucHV0OiAgbmV0X2RldmljZSBkZXYKLSAqICAgCSAgICAgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCAvL3JhZGlvIHBhdGggb2YgQS9CL0MvRAotICogICAgICAgICAgIHUzMglPZmZzZXQgICAgIC8vdGFyZ2V0IGFkZHJlc3MgdG8gYmUgcmVhZAotICogIG91dHB1dDogIG5vbmUKLSAqICByZXR1cm46ICB1MzIgCXJlYWRiYWNrIHZhbHVlCi0gKiAgbm90aWNlOiAgVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIHNlcmlhbCBvcGVyYXRpb25zOigxKSBTb2Z0d2FyZSBzZXJpYWwgd3JpdGUuKDIpSGFyZHdhcmUgTFNTSS1Mb3cgU3BlZWQgU2VyaWFsIEludGVyZmFjZS4oMylIYXJkd2FyZSBIU1NJLUhpZ2ggc3BlZWQgc2VyaWFsIHdyaXRlLiBEcml2ZXIgaGVyZSBuZWVkIHRvIGltcGxlbWVudCAoMSkgYW5kICgyKS0tLW5lZWQgbW9yZSBzcGVjIGZvciB0aGlzIGluZm9ybWF0aW9uLgotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1MzIgcnRsODE5Ml9waHlfUkZTZXJpYWxSZWFkKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LAotCQkJCSAgICBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoLCB1MzIgT2Zmc2V0KQotewotCXUzMiByZXQgPSAwOwotCXUzMiBOZXdPZmZzZXQgPSAwOwotCUJCX1JFR0lTVEVSX0RFRklOSVRJT05fVCogcFBoeVJlZyA9ICZwcml2LT5QSFlSZWdEZWZbZVJGUGF0aF07Ci0JLy9ydGw4MTkyX3NldEJCcmVnKGRldiwgcFBoeVJlZy0+cmZMU1NJUmVhZEJhY2ssIGJMU1NJUmVhZEJhY2tEYXRhLCAwKTsKLQkvL21ha2Ugc3VyZSBSRiByZWdpc3RlciBvZmZzZXQgaXMgY29ycmVjdAotCU9mZnNldCAmPSAweDNmOwotCi0JLy9zd2l0Y2ggcGFnZSBmb3IgODI1NiBSRiBJQwotCS8vYW5hbG9nIHRvIGRpZ2l0YWwgb2ZmLCBmb3IgcHJvdGVjdGlvbgotCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjQsIDB4ZjAwLCAweDApOy8vIDB4ODhjWzExOjhdCi0JaWYgKE9mZnNldCA+PSAzMSkKLQl7Ci0JCXByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdIHw9IDB4MTQwOwotCQkvL1N3aXRjaCB0byBSZWdfTW9kZTIgZm9yIFJlZyAzMS00NQotCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHBQaHlSZWctPnJmM3dpcmVPZmZzZXQsIGJNYXNrRFdvcmQsIChwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXTw8MTYpICk7Ci0JCS8vbW9kaWZ5IG9mZnNldAotCQlOZXdPZmZzZXQgPSBPZmZzZXQgLTMwOwotCX0KLQllbHNlIGlmIChPZmZzZXQgPj0gMTYpCi0JewotCQlwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSB8PSAweDEwMDsKLQkJcHJpdi0+UmZSZWcwVmFsdWVbZVJGUGF0aF0gJj0gKH4weDQwKTsKLQkJLy9Td2l0Y2ggdG8gUmVnX01vZGUgMSBmb3IgUmVnMTYtMzAKLQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCBwUGh5UmVnLT5yZjN3aXJlT2Zmc2V0LCBiTWFza0RXb3JkLCAocHJpdi0+UmZSZWcwVmFsdWVbZVJGUGF0aF08PDE2KSApOwotCi0JCU5ld09mZnNldCA9IE9mZnNldCAtIDE1OwotCX0KLQllbHNlCi0JCU5ld09mZnNldCA9IE9mZnNldDsKLQotCS8vcHV0IGRlc2lyZWQgcmVhZCBhZGRyIHRvIExTU0kgY29udHJvbCBSZWdpc3RlcgotCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgcFBoeVJlZy0+cmZIU1NJUGFyYTIsIGJMU1NJUmVhZEFkZHJlc3MsIE5ld09mZnNldCk7Ci0JLy9Jc3N1ZSBhIHBvc2VkZ2UgdHJpZ2dlcgotCS8vCi0JcnRsODE5Ml9zZXRCQnJlZyhwcml2LCBwUGh5UmVnLT5yZkhTU0lQYXJhMiwgIGJMU1NJUmVhZEVkZ2UsIDB4MCk7Ci0JcnRsODE5Ml9zZXRCQnJlZyhwcml2LCBwUGh5UmVnLT5yZkhTU0lQYXJhMiwgIGJMU1NJUmVhZEVkZ2UsIDB4MSk7Ci0KLQotCS8vIFRPRE86IHdlIHNob3VsZCBub3QgZGVsYXkgc3VjaCBhICBsb25nIHRpbWUuIEFzayBoZWxwIGZyb20gU0QzCi0JbXNsZWVwKDEpOwotCi0JcmV0ID0gcnRsODE5Ml9RdWVyeUJCUmVnKHByaXYsIHBQaHlSZWctPnJmTFNTSVJlYWRCYWNrLCBiTFNTSVJlYWRCYWNrRGF0YSk7Ci0KLQotCS8vIFN3aXRjaCBiYWNrIHRvIFJlZ19Nb2RlMDsKLQlwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSAmPSAweGViZjsKLQotCXJ0bDgxOTJfc2V0QkJyZWcoCi0JCXByaXYsCi0JCXBQaHlSZWctPnJmM3dpcmVPZmZzZXQsCi0JCWJNYXNrRFdvcmQsCi0JCShwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSA8PCAxNikpOwotCi0JLy9hbmFsb2cgdG8gZGlnaXRhbCBvbgotCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjQsIDB4MzAwLCAweDMpOy8vIDB4ODhjWzk6OF0KLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHdyaXRlIGRhdGEgdG8gUkYgcmVnaXN0ZXIKLSAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgotICogICAJICAgICBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoIC8vcmFkaW8gcGF0aCBvZiBBL0IvQy9ECi0gKiAgICAgICAgICAgdTMyCU9mZnNldCAgICAgLy90YXJnZXQgYWRkcmVzcyB0byBiZSB3cml0dGVuCi0gKiAgICAgICAgICAgdTMyCURhdGEJLy9UaGUgbmV3IHJlZ2lzdGVyIGRhdGEgdG8gYmUgd3JpdHRlbgotICogIG91dHB1dDogIG5vbmUKLSAqICByZXR1cm46ICBub25lCi0gKiAgbm90aWNlOiAgRm9yIFJGODI1NiBvbmx5LgotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICpSZWcgTW9kZQlSZWdDVExbMV0JUmVnQ1RMWzBdCQlOb3RlCi0gKgkJKFJlZzAwWzEyXSkJKFJlZzAwWzEwXSkKLSAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqUmVnX01vZGUwCTAJCXgJCQlSZWcgMCB+MTUoMHgwIH4gMHhmKQotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqUmVnX01vZGUxCTEJCTAJCQlSZWcgMTYgfjMwKDB4MSB+IDB4ZikKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBSZWdfTW9kZTIJMQkJMQkJCVJlZyAzMSB+IDQ1KDB4MSB+IDB4ZikKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHZvaWQgcnRsODE5Ml9waHlfUkZTZXJpYWxXcml0ZShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwKLQkJCQkgICAgICBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoLCB1MzIgT2Zmc2V0LAotCQkJCSAgICAgIHUzMiBEYXRhKQotewotCXUzMiBEYXRhQW5kQWRkciA9IDAsIE5ld09mZnNldCA9IDA7Ci0JQkJfUkVHSVNURVJfREVGSU5JVElPTl9UCSpwUGh5UmVnID0gJnByaXYtPlBIWVJlZ0RlZltlUkZQYXRoXTsKLQotCU9mZnNldCAmPSAweDNmOwotCi0JLy9hbmFsb2cgdG8gZGlnaXRhbCBvZmYsIGZvciBwcm90ZWN0aW9uCi0JcnRsODE5Ml9zZXRCQnJlZyhwcml2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyNCwgMHhmMDAsIDB4MCk7Ly8gMHg4OGNbMTE6OF0KLQotCWlmIChPZmZzZXQgPj0gMzEpCi0JewotCQlwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSB8PSAweDE0MDsKLQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCBwUGh5UmVnLT5yZjN3aXJlT2Zmc2V0LCBiTWFza0RXb3JkLCAocHJpdi0+UmZSZWcwVmFsdWVbZVJGUGF0aF0gPDwgMTYpKTsKLQkJTmV3T2Zmc2V0ID0gT2Zmc2V0IC0gMzA7Ci0JfQotCWVsc2UgaWYgKE9mZnNldCA+PSAxNikKLQl7Ci0JCXByaXYtPlJmUmVnMFZhbHVlW2VSRlBhdGhdIHw9IDB4MTAwOwotCQlwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSAmPSAofjB4NDApOwotCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHBQaHlSZWctPnJmM3dpcmVPZmZzZXQsIGJNYXNrRFdvcmQsIChwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXTw8MTYpKTsKLQkJTmV3T2Zmc2V0ID0gT2Zmc2V0IC0gMTU7Ci0JfQotCWVsc2UKLQkJTmV3T2Zmc2V0ID0gT2Zmc2V0OwotCi0JLy8gUHV0IHdyaXRlIGFkZHIgaW4gWzU6MF0gIGFuZCB3cml0ZSBkYXRhIGluIFszMToxNl0KLQlEYXRhQW5kQWRkciA9IChEYXRhPDwxNikgfCAoTmV3T2Zmc2V0JjB4M2YpOwotCi0JLy8gV3JpdGUgT3BlcmF0aW9uCi0JcnRsODE5Ml9zZXRCQnJlZyhwcml2LCBwUGh5UmVnLT5yZjN3aXJlT2Zmc2V0LCBiTWFza0RXb3JkLCBEYXRhQW5kQWRkcik7Ci0KLQotCWlmKE9mZnNldD09MHgwKQotCQlwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSA9IERhdGE7Ci0KLQkvLyBTd2l0Y2ggYmFjayB0byBSZWdfTW9kZTA7Ci0JaWYoT2Zmc2V0ICE9IDApCi0JewotCQlwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSAmPSAweGViZjsKLQkJcnRsODE5Ml9zZXRCQnJlZygKLQkJCXByaXYsCi0JCQlwUGh5UmVnLT5yZjN3aXJlT2Zmc2V0LAotCQkJYk1hc2tEV29yZCwKLQkJCShwcml2LT5SZlJlZzBWYWx1ZVtlUkZQYXRoXSA8PCAxNikpOwotCX0KLQkvL2FuYWxvZyB0byBkaWdpdGFsIG9uCi0JcnRsODE5Ml9zZXRCQnJlZyhwcml2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyNCwgMHgzMDAsIDB4Myk7Ly8gMHg4OGNbOTo4XQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBzZXQgc3BlY2lmaWMgYml0cyB0byBSRiByZWdpc3RlcgotICogICBpbnB1dDogIFJGOTBfUkFESU9fUEFUSF9FIGVSRlBhdGggLy9yYWRpbyBwYXRoIG9mIEEvQi9DL0QKLSAqICAgICAgICAgICB1MzIJUmVnQWRkciAgLy90YXJnZXQgYWRkciB0byBiZSBtb2RpZmllZAotICogICAgICAgICAgIHUzMglCaXRNYXNrICAvL3RhZ2V0IGJpdCBwb3MgaW4gdGhlIGFkZHIgdG8gYmUgbW9kaWZpZWQKLSAqICAgICAgICAgICB1MzIJRGF0YSAgICAgLy92YWx1ZSB0byBiZSB3cml0ZQotICogIG91dHB1dDogIG5vbmUKLSAqICByZXR1cm46ICBub25lCi0gKiAgbm90aWNlOgotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcnRsODE5Ml9waHlfU2V0UkZSZWcoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIFJGOTBfUkFESU9fUEFUSF9FIGVSRlBhdGgsCi0JCQkgIHUzMiBSZWdBZGRyLCB1MzIgQml0TWFzaywgdTMyIERhdGEpCi17Ci0JdTMyIE9yaWdpbmFsX1ZhbHVlLCBCaXRTaGlmdCwgTmV3X1ZhbHVlOwotLy8JdTgJdGltZSA9IDA7Ci0KLQlpZiAoIXJ0bDgxOTJfcGh5X0NoZWNrSXNMZWdhbFJGUGF0aChwcml2LCBlUkZQYXRoKSkKLQkJcmV0dXJuOwotCWlmIChwcml2LT5lUkZQb3dlclN0YXRlICE9IGVSZk9uICYmICFwcml2LT5iZWluZ19pbml0X2FkYXB0ZXIpCi0JCXJldHVybjsKLQkvL2Rvd24oJnByaXYtPnJmX3NlbSk7Ci0KLQlSVF9UUkFDRShDT01QX1BIWSwgIkZXIFJGIENUUkwgaXMgbm90IHJlYWR5IG5vd1xuIik7Ci0JaWYgKHByaXYtPlJmX01vZGUgPT0gUkZfT1BfQnlfRlcpCi0JewotCQlpZiAoQml0TWFzayAhPSBiTWFzazEyQml0cykgLy8gUkYgZGF0YSBpcyAxMiBiaXRzIG9ubHkKLQkJewotCQkJT3JpZ2luYWxfVmFsdWUgPSBwaHlfRndSRlNlcmlhbFJlYWQocHJpdiwgZVJGUGF0aCwgUmVnQWRkcik7Ci0JCQlCaXRTaGlmdCA9ICBydGw4MTkyX0NhbGN1bGF0ZUJpdFNoaWZ0KEJpdE1hc2spOwotCQkJTmV3X1ZhbHVlID0gKCgoT3JpZ2luYWxfVmFsdWUpICYgKH5CaXRNYXNrKSkgfCAoRGF0YTw8IEJpdFNoaWZ0KSk7Ci0KLQkJCXBoeV9Gd1JGU2VyaWFsV3JpdGUocHJpdiwgZVJGUGF0aCwgUmVnQWRkciwgTmV3X1ZhbHVlKTsKLQkJfWVsc2UKLQkJCXBoeV9Gd1JGU2VyaWFsV3JpdGUocHJpdiwgZVJGUGF0aCwgUmVnQWRkciwgRGF0YSk7Ci0JCXVkZWxheSgyMDApOwotCi0JfQotCWVsc2UKLQl7Ci0JCWlmIChCaXRNYXNrICE9IGJNYXNrMTJCaXRzKSAvLyBSRiBkYXRhIGlzIDEyIGJpdHMgb25seQotICAgCSAgICAgICAgewotCQkJT3JpZ2luYWxfVmFsdWUgPSBydGw4MTkyX3BoeV9SRlNlcmlhbFJlYWQocHJpdiwgZVJGUGF0aCwgUmVnQWRkcik7Ci0gICAgICAJCQlCaXRTaGlmdCA9ICBydGw4MTkyX0NhbGN1bGF0ZUJpdFNoaWZ0KEJpdE1hc2spOwotICAgICAgCQkJTmV3X1ZhbHVlID0gKCgoT3JpZ2luYWxfVmFsdWUpICYgKH5CaXRNYXNrKSkgfCAoRGF0YTw8IEJpdFNoaWZ0KSk7Ci0KLQkJCXJ0bDgxOTJfcGh5X1JGU2VyaWFsV3JpdGUocHJpdiwgZVJGUGF0aCwgUmVnQWRkciwgTmV3X1ZhbHVlKTsKLQkgICAgICAgIH1lbHNlCi0JCQlydGw4MTkyX3BoeV9SRlNlcmlhbFdyaXRlKHByaXYsIGVSRlBhdGgsIFJlZ0FkZHIsIERhdGEpOwotCX0KLQkvL3VwKCZwcml2LT5yZl9zZW0pOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiByZWFkcyBzcGVjaWZpYyBiaXRzIGZyb20gUkYgcmVnaXN0ZXIKLSAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgotICogICAgICAgICAgIHUzMglSZWdBZGRyICAvL3RhcmdldCBhZGRyIHRvIGJlIHJlYWRiYWNrCi0gKiAgICAgICAgICAgdTMyCUJpdE1hc2sgIC8vdGFnZXQgYml0IHBvcyBpbiB0aGUgYWRkciB0byBiZSByZWFkYmFjawotICogIG91dHB1dDogIG5vbmUKLSAqICByZXR1cm46ICB1MzIJRGF0YQkvL3RoZSByZWFkYmFjayByZWdpc3RlciB2YWx1ZQotICogIG5vdGljZToKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11MzIgcnRsODE5Ml9waHlfUXVlcnlSRlJlZyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwKLQkJCSAgIHUzMiBSZWdBZGRyLCB1MzIgQml0TWFzaykKLXsKLQl1MzIgT3JpZ2luYWxfVmFsdWUsIFJlYWRiYWNrX1ZhbHVlLCBCaXRTaGlmdDsKLQotCWlmICghcnRsODE5Ml9waHlfQ2hlY2tJc0xlZ2FsUkZQYXRoKHByaXYsIGVSRlBhdGgpKQotCQlyZXR1cm4gMDsKLQlpZiAocHJpdi0+ZVJGUG93ZXJTdGF0ZSAhPSBlUmZPbiAmJiAhcHJpdi0+YmVpbmdfaW5pdF9hZGFwdGVyKQotCQlyZXR1cm4JMDsKLQlkb3duKCZwcml2LT5yZl9zZW0pOwotCWlmIChwcml2LT5SZl9Nb2RlID09IFJGX09QX0J5X0ZXKQotCXsKLQkJT3JpZ2luYWxfVmFsdWUgPSBwaHlfRndSRlNlcmlhbFJlYWQocHJpdiwgZVJGUGF0aCwgUmVnQWRkcik7Ci0JCXVkZWxheSgyMDApOwotCX0KLQllbHNlCi0JewotCQlPcmlnaW5hbF9WYWx1ZSA9IHJ0bDgxOTJfcGh5X1JGU2VyaWFsUmVhZChwcml2LCBlUkZQYXRoLCBSZWdBZGRyKTsKLQotCX0KLQlCaXRTaGlmdCA9ICBydGw4MTkyX0NhbGN1bGF0ZUJpdFNoaWZ0KEJpdE1hc2spOwotICAgCVJlYWRiYWNrX1ZhbHVlID0gKE9yaWdpbmFsX1ZhbHVlICYgQml0TWFzaykgPj4gQml0U2hpZnQ7Ci0JdXAoJnByaXYtPnJmX3NlbSk7Ci0vLwl1ZGVsYXkoMjAwKTsKLQlyZXR1cm4gUmVhZGJhY2tfVmFsdWU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqZnVuY3Rpb246ICBXZSBzdXBwb3J0IGZpcm13YXJlIHRvIGV4ZWN1dGUgUkYtUi9XLgotICogICBpbnB1dDogIGRldgotICogIG91dHB1dDogIG5vbmUKLSAqICByZXR1cm46ICBub25lCi0gKiAgbm90aWNlOgotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHUzMiBwaHlfRndSRlNlcmlhbFJlYWQoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsCi0JCQkgICAgICBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoLCB1MzIgT2Zmc2V0KQotewotCXUzMgkJRGF0YSA9IDA7Ci0JdTgJCXRpbWUgPSAwOwotCS8vRGJnUHJpbnQoIkZXIFJGIENUUkxcblxyIik7Ci0JLyogMjAwNy8xMS8wMiBNSCBGaXJtd2FyZSBSRiBXcml0ZSBjb250cm9sLiBCeSBGcmFuY2lzJyBzdWdnZXN0aW9uLCB3ZSBjYW4KLQkgICBub3QgZXhlY3V0ZSB0aGUgc2NoZW1lIGluIHRoZSBpbml0aWFsIHN0ZXAuIE90aGVyd2lzZSwgUkYtUi9XIHdpbGwgd2FzdGUKLQkgICBtdWNoIHRpbWUuIFRoaXMgaXMgb25seSBmb3Igc2l0ZSBzdXJ2ZXkuICovCi0JLy8gMS4gUmVhZCBvcGVyYXRpb24gbmVlZCBub3QgaW5zZXJ0IGRhdGEuIGJpdCAwLTExCi0JLy9EYXRhICY9IGJNYXNrMTJCaXRzOwotCS8vIDIuIFdyaXRlIFJGIHJlZ2lzdGVyIGFkZHJlc3MuIEJpdCAxMi0xOQotCURhdGEgfD0gKChPZmZzZXQmMHhGRik8PDEyKTsKLQkvLyAzLiBXcml0ZSBSRiBwYXRoLiAgYml0IDIwLTIxCi0JRGF0YSB8PSAoKGVSRlBhdGgmMHgzKTw8MjApOwotCS8vIDQuIFNldCBSRiByZWFkIGluZGljYXRvci4gYml0IDIyPTAKLQkvL0RhdGEgfD0gMHgwMDAwMDsKLQkvLyA1LiBUcmlnZ2VyIEZ3IHRvIG9wZXJhdGUgdGhlIGNvbW1hbmQuIGJpdCAzMQotCURhdGEgfD0gMHg4MDAwMDAwMDsKLQkvLyA2LiBXZSBjYW4gbm90IGV4ZWN1dGUgcmVhZCBvcGVyYXRpb24gaWYgYml0IDMxIGlzIDEuCi0Jd2hpbGUgKHJlYWRfbmljX2R3b3JkKHByaXYsIFFQTlIpJjB4ODAwMDAwMDApCi0JewotCQkvLyBJZiBGVyBjYW4gbm90IGZpbmlzaCBSRi1SL1cgZm9yIG1vcmUgdGhhbiA/PyB0aW1lcy4gV2UgbXVzdCByZXNldCBGVy4KLQkJaWYgKHRpbWUrKyA8IDEwMCkKLQkJewotCQkJLy9EYmdQcmludCgiRlcgbm90IGZpbmlzaCBSRi1SIFRpbWU9JWRcblxyIiwgdGltZSk7Ci0JCQl1ZGVsYXkoMTApOwotCQl9Ci0JCWVsc2UKLQkJCWJyZWFrOwotCX0KLQkvLyA3LiBFeGVjdXRlIHJlYWQgb3BlcmF0aW9uLgotCXdyaXRlX25pY19kd29yZChwcml2LCBRUE5SLCBEYXRhKTsKLQkvLyA4LiBDaGVjayBpZiBmaXJtYXdyZSBzZW5kIGJhY2sgUkYgY29udGVudC4KLQl3aGlsZSAocmVhZF9uaWNfZHdvcmQocHJpdiwgUVBOUikmMHg4MDAwMDAwMCkKLQl7Ci0JCS8vIElmIEZXIGNhbiBub3QgZmluaXNoIFJGLVIvVyBmb3IgbW9yZSB0aGFuID8/IHRpbWVzLiBXZSBtdXN0IHJlc2V0IEZXLgotCQlpZiAodGltZSsrIDwgMTAwKQotCQl7Ci0JCQkvL0RiZ1ByaW50KCJGVyBub3QgZmluaXNoIFJGLVcgVGltZT0lZFxuXHIiLCB0aW1lKTsKLQkJCXVkZWxheSgxMCk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiByZWFkX25pY19kd29yZChwcml2LCBSRl9EQVRBKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICpmdW5jdGlvbjogIFdlIHN1cHBvcnQgZmlybXdhcmUgdG8gZXhlY3V0ZSBSRi1SL1cuCi0gKiAgIGlucHV0OiAgZGV2Ci0gKiAgb3V0cHV0OiAgbm9uZQotICogIHJldHVybjogIG5vbmUKLSAqICBub3RpY2U6Ci0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBwaHlfRndSRlNlcmlhbFdyaXRlKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LAotCQkJCVJGOTBfUkFESU9fUEFUSF9FIGVSRlBhdGgsIHUzMiBPZmZzZXQsIHUzMiBEYXRhKQotewotCXU4CXRpbWUgPSAwOwotCi0JLy9EYmdQcmludCgiTiBGVyBSRiBDVFJMIFJGLSVkIE9GJTAyeCBEQVRBPSUwM3hcblxyIiwgZVJGUGF0aCwgT2Zmc2V0LCBEYXRhKTsKLQkvKiAyMDA3LzExLzAyIE1IIEZpcm13YXJlIFJGIFdyaXRlIGNvbnRyb2wuIEJ5IEZyYW5jaXMnIHN1Z2dlc3Rpb24sIHdlIGNhbgotCSAgIG5vdCBleGVjdXRlIHRoZSBzY2hlbWUgaW4gdGhlIGluaXRpYWwgc3RlcC4gT3RoZXJ3aXNlLCBSRi1SL1cgd2lsbCB3YXN0ZQotCSAgIG11Y2ggdGltZS4gVGhpcyBpcyBvbmx5IGZvciBzaXRlIHN1cnZleS4gKi8KLQotCS8vIDEuIFNldCBkcml2ZXIgd3JpdGUgYml0IGFuZCAxMiBiaXQgZGF0YS4gYml0IDAtMTEKLQkvL0RhdGEgJj0gYk1hc2sxMkJpdHM7CS8vIERvbmUgYnkgdXBlciBsYXllci4KLQkvLyAyLiBXcml0ZSBSRiByZWdpc3RlciBhZGRyZXNzLiBiaXQgMTItMTkKLQlEYXRhIHw9ICgoT2Zmc2V0JjB4RkYpPDwxMik7Ci0JLy8gMy4gV3JpdGUgUkYgcGF0aC4gIGJpdCAyMC0yMQotCURhdGEgfD0gKChlUkZQYXRoJjB4Myk8PDIwKTsKLQkvLyA0LiBTZXQgUkYgd3JpdGUgaW5kaWNhdG9yLiBiaXQgMjI9MQotCURhdGEgfD0gMHg0MDAwMDA7Ci0JLy8gNS4gVHJpZ2dlciBGdyB0byBvcGVyYXRlIHRoZSBjb21tYW5kLiBiaXQgMzE9MQotCURhdGEgfD0gMHg4MDAwMDAwMDsKLQotCS8vIDYuIFdyaXRlIG9wZXJhdGlvbi4gV2UgY2FuIG5vdCB3cml0ZSBpZiBiaXQgMzEgaXMgMS4KLQl3aGlsZSAocmVhZF9uaWNfZHdvcmQocHJpdiwgUVBOUikmMHg4MDAwMDAwMCkKLQl7Ci0JCS8vIElmIEZXIGNhbiBub3QgZmluaXNoIFJGLVIvVyBmb3IgbW9yZSB0aGFuID8/IHRpbWVzLiBXZSBtdXN0IHJlc2V0IEZXLgotCQlpZiAodGltZSsrIDwgMTAwKQotCQl7Ci0JCQkvL0RiZ1ByaW50KCJGVyBub3QgZmluaXNoIFJGLVcgVGltZT0lZFxuXHIiLCB0aW1lKTsKLQkJCXVkZWxheSgxMCk7Ci0JCX0KLQkJZWxzZQotCQkJYnJlYWs7Ci0JfQotCS8vIDcuIE5vIG1hdHRlciBjaGVjayBiaXQuIFdlIGFsd2F5cyBmb3JjZSB0aGUgd3JpdGUuIEJlY2F1c2UgRlcgd2lsbAotCS8vICAgIG5vdCBhY2NlcHQgdGhlIGNvbW1hbmQuCi0Jd3JpdGVfbmljX2R3b3JkKHByaXYsIFFQTlIsIERhdGEpOwotCS8qIDIwMDcvMTEvMDIgTUggQWNvb3JkaW5nIHRvIHRlc3QsIHdlIG11c3QgZGVsYXkgMjB1cyB0byB3YWl0IGZpcm13YXJlCi0JICAgdG8gZmluaXNoIFJGIHdyaXRlIG9wZXJhdGlvbi4gKi8KLQkvKiAyMDA4LzAxLzE3IE1IIFdlIHN1cHBvcnQgZGVsYXkgaW4gZmlybXdhcmUgc2lkZSBub3cuICovCi0JLy9kZWxheV91cygyMCk7Ci0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiByZWFkIEJCIHBhcmFtZXRlcnMgZnJvbSBIZWFkZXIgZmlsZSB3ZSBnZW4sCi0gKgkgICAgIGFuZCBkbyByZWdpc3RlciByZWFkL3dyaXRlCi0gKiAgIGlucHV0OiAgZGV2Ci0gKiAgb3V0cHV0OiAgbm9uZQotICogIHJldHVybjogIG5vbmUKLSAqICBub3RpY2U6ICBCQiBwYXJhbWV0ZXJzIG1heSBjaGFuZ2UgYWxsIHRoZSB0aW1lLCBzbyBwbGVhc2UgbWFrZQotICogICAgICAgICAgIHN1cmUgaXQgaGFzIGJlZW4gc3luY2VkIHdpdGggdGhlIG5ld2VzdC4KLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcnRsODE5Ml9waHlfY29uZmlnbWFjKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCXUzMiBkd0FycmF5TGVuID0gMCwgaSA9IDA7Ci0JdTMyKiBwZHdBcnJheSA9IE5VTEw7Ci0jaWZkZWYgVE9fRE9fTElTVAotaWYoQWRhcHRlci0+YkluSGN0VGVzdCkKLQl7Ci0JCVJUX1RSQUNFKENPTVBfUEhZLCAiUnRsODE5WE1BQ1BIWV9BcnJheURUTVxuIik7Ci0JCWR3QXJyYXlMZW4gPSBNQUNQSFlfQXJyYXlMZW5ndGhEVE07Ci0JCXBkd0FycmF5ID0gUnRsODE5WE1BQ1BIWV9BcnJheURUTTsKLQl9Ci0JZWxzZSBpZihwcml2LT5iVFhQb3dlckRhdGFSZWFkRnJvbUVFUE9STSkKLSNlbmRpZgotCSBpZihwcml2LT5iVFhQb3dlckRhdGFSZWFkRnJvbUVFUE9STSkKLQl7Ci0JCVJUX1RSQUNFKENPTVBfUEhZLCAiUnRsODE5WE1BQ1BIWV9BcnJheV9QR1xuIik7Ci0JCWR3QXJyYXlMZW4gPSBNQUNQSFlfQXJyYXlfUEdMZW5ndGg7Ci0JCXBkd0FycmF5ID0gUnRsODE5WE1BQ1BIWV9BcnJheV9QRzsKLQotCX0KLQllbHNlCi0JewotCQlSVF9UUkFDRShDT01QX1BIWSwiUmVhZCBydGw4MTlYTUFDUEhZX0FycmF5XG4iKTsKLQkJZHdBcnJheUxlbiA9IE1BQ1BIWV9BcnJheUxlbmd0aDsKLQkJcGR3QXJyYXkgPSBSdGw4MTlYTUFDUEhZX0FycmF5OwotCX0KLQlmb3IoaSA9IDA7IGk8ZHdBcnJheUxlbjsgaT1pKzMpewotCQlSVF9UUkFDRShDT01QX0RCRywgIlRoZSBSdGw4MTkwTUFDUEhZX0FycmF5WzBdIGlzICV4IFJ0bDgxOTBNQUNQSFlfQXJyYXlbMV0gaXMgJXggUnRsODE5ME1BQ1BIWV9BcnJheVsyXSBpcyAleFxuIiwKLQkJCQlwZHdBcnJheVtpXSwgcGR3QXJyYXlbaSsxXSwgcGR3QXJyYXlbaSsyXSk7Ci0JCWlmKHBkd0FycmF5W2ldID09IDB4MzE4KQotCQl7Ci0JCQlwZHdBcnJheVtpKzJdID0gMHgwMDAwMDgwMDsKLQkJCS8vRGJnUHJpbnQoInB0ckFycmF5W2ldLCBwdHJBcnJheVtpKzFdLCBwdHJBcnJheVtpKzJdID0gJXgsICV4LCAleFxuIiwKLQkJCS8vCXB0ckFycmF5W2ldLCBwdHJBcnJheVtpKzFdLCBwdHJBcnJheVtpKzJdKTsKLQkJfQotCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHBkd0FycmF5W2ldLCBwZHdBcnJheVtpKzFdLCBwZHdBcnJheVtpKzJdKTsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIGRvIGRpcnR5IHdvcmsKLSAqICAgaW5wdXQ6ICBkZXYKLSAqICBvdXRwdXQ6ICBub25lCi0gKiAgcmV0dXJuOiAgbm9uZQotICogIG5vdGljZTogIEJCIHBhcmFtZXRlcnMgbWF5IGNoYW5nZSBhbGwgdGhlIHRpbWUsIHNvIHBsZWFzZSBtYWtlCi0gKiAgICAgICAgICAgc3VyZSBpdCBoYXMgYmVlbiBzeW5jZWQgd2l0aCB0aGUgbmV3ZXN0LgotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIHJ0bDgxOTJfcGh5Q29uZmlnQkIoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHU4IENvbmZpZ1R5cGUpCi17Ci0JaW50IGk7Ci0JLy91OCBBcnJheUxlbmd0aDsKLQl1MzIqCVJ0bDgxOVhQSFlfUkVHQXJyYXlfVGFibGUgPSBOVUxMOwotCXUzMioJUnRsODE5WEFHQ1RBQl9BcnJheV9UYWJsZSA9IE5VTEw7Ci0JdTE2CUFHQ1RBQl9BcnJheUxlbiwgUEhZX1JFR0FycmF5TGVuID0gMDsKLSNpZmRlZiBUT19ET19MSVNUCi0JdTMyICpydGw4MTkyUGh5UmVnQXJyYXlUYWJsZSA9IE5VTEwsICpydGw4MTkyQWdjVGFiQXJyYXlUYWJsZSA9IE5VTEw7Ci0JaWYoQWRhcHRlci0+YkluSGN0VGVzdCkKLQl7Ci0JCUFHQ1RBQl9BcnJheUxlbiA9IEFHQ1RBQl9BcnJheUxlbmd0aERUTTsKLQkJUnRsODE5WEFHQ1RBQl9BcnJheV9UYWJsZSA9IFJ0bDgxOVhBR0NUQUJfQXJyYXlEVE07Ci0KLQkJaWYocHJpdi0+UkZfVHlwZSA9PSBSRl8yVDRSKQotCQl7Ci0JCQlQSFlfUkVHQXJyYXlMZW4gPSBQSFlfUkVHQXJyYXlMZW5ndGhEVE07Ci0JCQlSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlID0gUnRsODE5WFBIWV9SRUdBcnJheURUTTsKLQkJfQotCQllbHNlIGlmIChwcml2LT5SRl9UeXBlID09IFJGXzFUMlIpCi0JCXsKLQkJCVBIWV9SRUdBcnJheUxlbiA9IFBIWV9SRUdfMVQyUkFycmF5TGVuZ3RoRFRNOwotCQkJUnRsODE5WFBIWV9SRUdBcnJheV9UYWJsZSA9IFJ0bDgxOVhQSFlfUkVHXzFUMlJBcnJheURUTTsKLQkJfQotCX0KLQllbHNlCi0jZW5kaWYKLQl7Ci0JCUFHQ1RBQl9BcnJheUxlbiA9IEFHQ1RBQl9BcnJheUxlbmd0aDsKLQkJUnRsODE5WEFHQ1RBQl9BcnJheV9UYWJsZSA9IFJ0bDgxOVhBR0NUQUJfQXJyYXk7Ci0JCWlmKHByaXYtPnJmX3R5cGUgPT0gUkZfMlQ0UikKLQkJewotCQkJUEhZX1JFR0FycmF5TGVuID0gUEhZX1JFR0FycmF5TGVuZ3RoOwotCQkJUnRsODE5WFBIWV9SRUdBcnJheV9UYWJsZSA9IFJ0bDgxOVhQSFlfUkVHQXJyYXk7Ci0JCX0KLQkJZWxzZSBpZiAocHJpdi0+cmZfdHlwZSA9PSBSRl8xVDJSKQotCQl7Ci0JCQlQSFlfUkVHQXJyYXlMZW4gPSBQSFlfUkVHXzFUMlJBcnJheUxlbmd0aDsKLQkJCVJ0bDgxOVhQSFlfUkVHQXJyYXlfVGFibGUgPSBSdGw4MTlYUEhZX1JFR18xVDJSQXJyYXk7Ci0JCX0KLQl9Ci0KLQlpZiAoQ29uZmlnVHlwZSA9PSBCYXNlQmFuZF9Db25maWdfUEhZX1JFRykKLQl7Ci0JCWZvciAoaT0wOyBpPFBIWV9SRUdBcnJheUxlbjsgaSs9MikKLQkJewotCQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCBSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlW2ldLCBiTWFza0RXb3JkLCBSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlW2krMV0pOwotCQkJUlRfVFJBQ0UoQ09NUF9EQkcsICJpOiAleCwgVGhlIFJ0bDgxOXhVc2JQSFlfUkVHQXJyYXlbMF0gaXMgJXggUnRsODE5eFVzYlBIWV9SRUdBcnJheVsxXSBpcyAleFxuIixpLCBSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlW2ldLCBSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlW2krMV0pOwotCQl9Ci0JfQotCWVsc2UgaWYgKENvbmZpZ1R5cGUgPT0gQmFzZUJhbmRfQ29uZmlnX0FHQ19UQUIpCi0JewotCQlmb3IgKGk9MDsgaTxBR0NUQUJfQXJyYXlMZW47IGkrPTIpCi0JCXsKLQkJCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgUnRsODE5WEFHQ1RBQl9BcnJheV9UYWJsZVtpXSwgYk1hc2tEV29yZCwgUnRsODE5WEFHQ1RBQl9BcnJheV9UYWJsZVtpKzFdKTsKLQkJCVJUX1RSQUNFKENPTVBfREJHLCAiaToleCwgVGhlIHJ0bDgxOVhBR0NUQUJfQXJyYXlbMF0gaXMgJXggcnRsODE5WEFHQ1RBQl9BcnJheVsxXSBpcyAleFxuIixpLCBSdGw4MTlYQUdDVEFCX0FycmF5X1RhYmxlW2ldLCBSdGw4MTlYQUdDVEFCX0FycmF5X1RhYmxlW2krMV0pOwotCQl9Ci0JfQotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZSBSZWdpc3RlciBkZWZpbml0aW9uIG9mZnNldCBmb3IgUmFkaW8gUGF0aAotICoJICAgICBBL0IvQy9ECi0gKiAgIGlucHV0OiAgbmV0X2RldmljZSBkZXYKLSAqICBvdXRwdXQ6ICBub25lCi0gKiAgcmV0dXJuOiAgbm9uZQotICogIG5vdGljZTogIEluaXRpYWxpemF0aW9uIHZhbHVlIGhlcmUgaXMgY29uc3RhbnQgYW5kIGl0IHNob3VsZCBuZXZlciBiZSBjaGFuZ2VkCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBydGw4MTkyX0luaXRCQlJGUmVnRGVmKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotLy8gUkYgSW50ZXJmYWNlIFNvd3J0d2FyZSBDb250cm9sCi0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZmludGZzID0gckZQR0EwX1hBQl9SRkludGVyZmFjZVNXOyAvLyAxNiBMU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NzAKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmaW50ZnMgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlU1c7IC8vIDE2IE1TQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDg3MCAoMTYtYml0IGZvciAweDg3MikKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmaW50ZnMgPSByRlBHQTBfWENEX1JGSW50ZXJmYWNlU1c7Ly8gMTYgTFNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODc0Ci0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZmludGZzID0gckZQR0EwX1hDRF9SRkludGVyZmFjZVNXOy8vIDE2IE1TQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDg3NCAoMTYtYml0IGZvciAweDg3NikKLQotCS8vIFJGIEludGVyZmFjZSBSZWFkYmFjayBWYWx1ZQotCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZpbnRmaSA9IHJGUEdBMF9YQUJfUkZJbnRlcmZhY2VSQjsgLy8gMTYgTFNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4OEUwCi0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZmludGZpID0gckZQR0EwX1hBQl9SRkludGVyZmFjZVJCOy8vIDE2IE1TQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDhFMCAoMTYtYml0IGZvciAweDhFMikKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmaW50ZmkgPSByRlBHQTBfWENEX1JGSW50ZXJmYWNlUkI7Ly8gMTYgTFNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4OEU0Ci0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZmludGZpID0gckZQR0EwX1hDRF9SRkludGVyZmFjZVJCOy8vIDE2IE1TQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDhFNCAoMTYtYml0IGZvciAweDhFNikKLQotCS8vIFJGIEludGVyZmFjZSBPdXRwdXQgKGFuZCBFbmFibGUpCi0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZmludGZvID0gckZQR0EwX1hBX1JGSW50ZXJmYWNlT0U7IC8vIDE2IExTQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDg2MAotCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZpbnRmbyA9IHJGUEdBMF9YQl9SRkludGVyZmFjZU9FOyAvLyAxNiBMU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NjQKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmaW50Zm8gPSByRlBHQTBfWENfUkZJbnRlcmZhY2VPRTsvLyAxNiBMU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NjgKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmaW50Zm8gPSByRlBHQTBfWERfUkZJbnRlcmZhY2VPRTsvLyAxNiBMU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NkMKLQotCS8vIFJGIEludGVyZmFjZSAoT3V0cHV0IGFuZCkgIEVuYWJsZQotCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZpbnRmZSA9IHJGUEdBMF9YQV9SRkludGVyZmFjZU9FOyAvLyAxNiBNU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NjAgKDE2LWJpdCBmb3IgMHg4NjIpCi0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZmludGZlID0gckZQR0EwX1hCX1JGSW50ZXJmYWNlT0U7IC8vIDE2IE1TQnMgaWYgcmVhZCAzMi1iaXQgZnJvbSAweDg2NCAoMTYtYml0IGZvciAweDg2NikKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmaW50ZmUgPSByRlBHQTBfWENfUkZJbnRlcmZhY2VPRTsvLyAxNiBNU0JzIGlmIHJlYWQgMzItYml0IGZyb20gMHg4NkEgKDE2LWJpdCBmb3IgMHg4NkEpCi0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZmludGZlID0gckZQR0EwX1hEX1JGSW50ZXJmYWNlT0U7Ly8gMTYgTVNCcyBpZiByZWFkIDMyLWJpdCBmcm9tIDB4ODZDICgxNi1iaXQgZm9yIDB4ODZFKQotCi0JLy9BZGRyIG9mIExTU0kuIFdpcnRlIFJGIHJlZ2lzdGVyIGJ5IGRyaXZlcgotCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmYzd2lyZU9mZnNldCA9IHJGUEdBMF9YQV9MU1NJUGFyYW1ldGVyOyAvL0xTU0kgUGFyYW1ldGVyCi0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZjN3aXJlT2Zmc2V0ID0gckZQR0EwX1hCX0xTU0lQYXJhbWV0ZXI7Ci0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZjN3aXJlT2Zmc2V0ID0gckZQR0EwX1hDX0xTU0lQYXJhbWV0ZXI7Ci0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZjN3aXJlT2Zmc2V0ID0gckZQR0EwX1hEX0xTU0lQYXJhbWV0ZXI7Ci0KLQkvLyBSRiBwYXJhbWV0ZXIKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmTFNTSV9TZWxlY3QgPSByRlBHQTBfWEFCX1JGUGFyYW1ldGVyOyAgLy9CQiBCYW5kIFNlbGVjdAotCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZMU1NJX1NlbGVjdCA9IHJGUEdBMF9YQUJfUkZQYXJhbWV0ZXI7Ci0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZkxTU0lfU2VsZWN0ID0gckZQR0EwX1hDRF9SRlBhcmFtZXRlcjsKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmTFNTSV9TZWxlY3QgPSByRlBHQTBfWENEX1JGUGFyYW1ldGVyOwotCi0JLy8gVHggQUdDIEdhaW4gU3RhZ2UgKHNhbWUgZm9yIGFsbCBwYXRoLiBTaG91bGQgd2UgcmVtb3ZlIHRoaXM/KQotCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZUeEdhaW5TdGFnZSA9IHJGUEdBMF9UeEdhaW5TdGFnZTsgLy9UeCBnYWluIHN0YWdlCi0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZlR4R2FpblN0YWdlID0gckZQR0EwX1R4R2FpblN0YWdlOyAvL1R4IGdhaW4gc3RhZ2UKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmVHhHYWluU3RhZ2UgPSByRlBHQTBfVHhHYWluU3RhZ2U7IC8vVHggZ2FpbiBzdGFnZQotCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZUeEdhaW5TdGFnZSA9IHJGUEdBMF9UeEdhaW5TdGFnZTsgLy9UeCBnYWluIHN0YWdlCi0KLQkvLyBUcmFuY2VpdmVyIEF+RCBIU1NJIFBhcmFtZXRlci0xCi0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZkhTU0lQYXJhMSA9IHJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMTsgIC8vd2lyZSBjb250cm9sIHBhcmFtZXRlcjEKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmSFNTSVBhcmExID0gckZQR0EwX1hCX0hTU0lQYXJhbWV0ZXIxOyAgLy93aXJlIGNvbnRyb2wgcGFyYW1ldGVyMQotCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQ10ucmZIU1NJUGFyYTEgPSByRlBHQTBfWENfSFNTSVBhcmFtZXRlcjE7ICAvL3dpcmUgY29udHJvbCBwYXJhbWV0ZXIxCi0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZkhTU0lQYXJhMSA9IHJGUEdBMF9YRF9IU1NJUGFyYW1ldGVyMTsgIC8vd2lyZSBjb250cm9sIHBhcmFtZXRlcjEKLQotCS8vIFRyYW5jZWl2ZXIgQX5EIEhTU0kgUGFyYW1ldGVyLTIKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmSFNTSVBhcmEyID0gckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyOyAgLy93aXJlIGNvbnRyb2wgcGFyYW1ldGVyMgotCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZIU1NJUGFyYTIgPSByRlBHQTBfWEJfSFNTSVBhcmFtZXRlcjI7ICAvL3dpcmUgY29udHJvbCBwYXJhbWV0ZXIyCi0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZkhTU0lQYXJhMiA9IHJGUEdBMF9YQ19IU1NJUGFyYW1ldGVyMjsgIC8vd2lyZSBjb250cm9sIHBhcmFtZXRlcjIKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmSFNTSVBhcmEyID0gckZQR0EwX1hEX0hTU0lQYXJhbWV0ZXIyOyAgLy93aXJlIGNvbnRyb2wgcGFyYW1ldGVyMQotCi0JLy8gUkYgc3dpdGNoIENvbnRyb2wKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmU3dpdGNoQ29udHJvbCA9IHJGUEdBMF9YQUJfU3dpdGNoQ29udHJvbDsgLy9UUi9BbnQgc3dpdGNoIGNvbnRyb2wKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmU3dpdGNoQ29udHJvbCA9IHJGUEdBMF9YQUJfU3dpdGNoQ29udHJvbDsKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmU3dpdGNoQ29udHJvbCA9IHJGUEdBMF9YQ0RfU3dpdGNoQ29udHJvbDsKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmU3dpdGNoQ29udHJvbCA9IHJGUEdBMF9YQ0RfU3dpdGNoQ29udHJvbDsKLQotCS8vIEFHQyBjb250cm9sIDEKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmQUdDQ29udHJvbDEgPSByT0ZETTBfWEFBR0NDb3JlMTsKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmQUdDQ29udHJvbDEgPSByT0ZETTBfWEJBR0NDb3JlMTsKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmQUdDQ29udHJvbDEgPSByT0ZETTBfWENBR0NDb3JlMTsKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmQUdDQ29udHJvbDEgPSByT0ZETTBfWERBR0NDb3JlMTsKLQotCS8vIEFHQyBjb250cm9sIDIKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmQUdDQ29udHJvbDIgPSByT0ZETTBfWEFBR0NDb3JlMjsKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0JdLnJmQUdDQ29udHJvbDIgPSByT0ZETTBfWEJBR0NDb3JlMjsKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmQUdDQ29udHJvbDIgPSByT0ZETTBfWENBR0NDb3JlMjsKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmQUdDQ29udHJvbDIgPSByT0ZETTBfWERBR0NDb3JlMjsKLQotCS8vIFJYIEFGRSBjb250cm9sIDEKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0FdLnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YQVJ4SVFJbWJhbGFuY2U7Ci0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZlJ4SVFJbWJhbGFuY2UgPSByT0ZETTBfWEJSeElRSW1iYWxhbmNlOwotCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQ10ucmZSeElRSW1iYWxhbmNlID0gck9GRE0wX1hDUnhJUUltYmFsYW5jZTsKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0RdLnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YRFJ4SVFJbWJhbGFuY2U7Ci0KLQkvLyBSWCBBRkUgY29udHJvbCAxCi0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZlJ4QUZFID0gck9GRE0wX1hBUnhBRkU7Ci0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZlJ4QUZFID0gck9GRE0wX1hCUnhBRkU7Ci0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZlJ4QUZFID0gck9GRE0wX1hDUnhBRkU7Ci0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZlJ4QUZFID0gck9GRE0wX1hEUnhBRkU7Ci0KLQkvLyBUeCBBRkUgY29udHJvbCAxCi0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZlR4SVFJbWJhbGFuY2UgPSByT0ZETTBfWEFUeElRSW1iYWxhbmNlOwotCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hCVHhJUUltYmFsYW5jZTsKLQlwcml2LT5QSFlSZWdEZWZbUkY5MF9QQVRIX0NdLnJmVHhJUUltYmFsYW5jZSA9IHJPRkRNMF9YQ1R4SVFJbWJhbGFuY2U7Ci0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZlR4SVFJbWJhbGFuY2UgPSByT0ZETTBfWERUeElRSW1iYWxhbmNlOwotCi0JLy8gVHggQUZFIGNvbnRyb2wgMgotCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQV0ucmZUeEFGRSA9IHJPRkRNMF9YQVR4QUZFOwotCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQl0ucmZUeEFGRSA9IHJPRkRNMF9YQlR4QUZFOwotCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfQ10ucmZUeEFGRSA9IHJPRkRNMF9YQ1R4QUZFOwotCXByaXYtPlBIWVJlZ0RlZltSRjkwX1BBVEhfRF0ucmZUeEFGRSA9IHJPRkRNMF9YRFR4QUZFOwotCi0JLy8gVHJhbmNlaXZlciBMU1NJIFJlYWRiYWNrCi0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9BXS5yZkxTU0lSZWFkQmFjayA9IHJGUEdBMF9YQV9MU1NJUmVhZEJhY2s7Ci0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9CXS5yZkxTU0lSZWFkQmFjayA9IHJGUEdBMF9YQl9MU1NJUmVhZEJhY2s7Ci0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9DXS5yZkxTU0lSZWFkQmFjayA9IHJGUEdBMF9YQ19MU1NJUmVhZEJhY2s7Ci0JcHJpdi0+UEhZUmVnRGVmW1JGOTBfUEFUSF9EXS5yZkxTU0lSZWFkQmFjayA9IHJGUEdBMF9YRF9MU1NJUmVhZEJhY2s7Ci0KLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIGlzIHRvIHdyaXRlIHJlZ2lzdGVyIGFuZCB0aGVuIHJlYWRiYWNrIHRvIG1ha2Ugc3VyZSB3aGV0aGVyIEJCIGFuZCBSRiBpcyBPSwotICogICBpbnB1dDogIG5ldF9kZXZpY2UgZGV2Ci0gKiAgIAkgICAgIEhXOTBfQkxPQ0tfRSBDaGVja0Jsb2NrCi0gKiAgIAkgICAgIFJGOTBfUkFESU9fUEFUSF9FIGVSRlBhdGggIC8vb25seSB1c2VkIHdoZW4gY2hlY2tibG9jayBpcyBIVzkwX0JMT0NLX1JGCi0gKiAgb3V0cHV0OiAgbm9uZQotICogIHJldHVybjogIHJldHVybiB3aGV0aGVyIEJCIGFuZCBSRiBpcyBvaygwOk9LOyAxOkZhaWwpCi0gKiAgbm90aWNlOiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgcmVtb3ZlZCBpbiB0aGUgQVNJQwotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotUlRfU1RBVFVTIHJ0bDgxOTJfcGh5X2NoZWNrQkJBbmRSRihzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwKLQkJCQkgICBIVzkwX0JMT0NLX0UgQ2hlY2tCbG9jaywKLQkJCQkgICBSRjkwX1JBRElPX1BBVEhfRSBlUkZQYXRoKQotewotLy8JQkJfUkVHSVNURVJfREVGSU5JVElPTl9UICpwUGh5UmVnID0gJnByaXYtPlBIWVJlZ0RlZltlUkZQYXRoXTsKLQlSVF9TVEFUVVMgcmV0ID0gUlRfU1RBVFVTX1NVQ0NFU1M7Ci0JdTMyIGksIENoZWNrVGltZXMgPSA0LCBkd1JlZ1JlYWQgPSAwOwotCXUzMiBXcml0ZUFkZHJbNF07Ci0JdTMyIFdyaXRlRGF0YVtdID0gezB4ZmZmZmYwMjcsIDB4YWE1NWEwMmYsIDB4MDAwMDAwMjcsIDB4NTVhYTUwMmZ9OwotCS8vIEluaXRpYWxpemUgcmVnaXN0ZXIgYWRkcmVzcyBvZmZzZXQgdG8gYmUgY2hlY2tlZAotCVdyaXRlQWRkcltIVzkwX0JMT0NLX01BQ10gPSAweDEwMDsKLQlXcml0ZUFkZHJbSFc5MF9CTE9DS19QSFkwXSA9IDB4OTAwOwotCVdyaXRlQWRkcltIVzkwX0JMT0NLX1BIWTFdID0gMHg4MDA7Ci0JV3JpdGVBZGRyW0hXOTBfQkxPQ0tfUkZdID0gMHgzOwotCVJUX1RSQUNFKENPTVBfUEhZLCAiPT09PT09PT4lcygpLCBDaGVja0Jsb2NrOiVkXG4iLCBfX0ZVTkNUSU9OX18sIENoZWNrQmxvY2spOwotCWZvcihpPTAgOyBpIDwgQ2hlY2tUaW1lcyA7IGkrKykKLQl7Ci0KLQkJLy8KLQkJLy8gV3JpdGUgRGF0YSB0byByZWdpc3RlciBhbmQgcmVhZGJhY2sKLQkJLy8KLQkJc3dpdGNoKENoZWNrQmxvY2spCi0JCXsKLQkJY2FzZSBIVzkwX0JMT0NLX01BQzoKLQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiUEhZX0NoZWNrQkJSRk9LKCk6IE5ldmVyIFdyaXRlIDB4MTAwIGhlcmUhXG4iKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSFc5MF9CTE9DS19QSFkwOgotCQljYXNlIEhXOTBfQkxPQ0tfUEhZMToKLQkJCXdyaXRlX25pY19kd29yZChwcml2LCBXcml0ZUFkZHJbQ2hlY2tCbG9ja10sIFdyaXRlRGF0YVtpXSk7Ci0JCQlkd1JlZ1JlYWQgPSByZWFkX25pY19kd29yZChwcml2LCBXcml0ZUFkZHJbQ2hlY2tCbG9ja10pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBIVzkwX0JMT0NLX1JGOgotCQkJV3JpdGVEYXRhW2ldICY9IDB4ZmZmOwotCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcocHJpdiwgZVJGUGF0aCwgV3JpdGVBZGRyW0hXOTBfQkxPQ0tfUkZdLCBiTWFzazEyQml0cywgV3JpdGVEYXRhW2ldKTsKLQkJCS8vIFRPRE86IHdlIHNob3VsZCBub3QgZGVsYXkgZm9yIHN1Y2ggYSBsb25nIHRpbWUuIEFzayBTRDMKLQkJCW1kZWxheSgxMCk7Ci0JCQlkd1JlZ1JlYWQgPSBydGw4MTkyX3BoeV9RdWVyeVJGUmVnKHByaXYsIGVSRlBhdGgsIFdyaXRlQWRkcltIVzkwX0JMT0NLX1JGXSwgYk1hc2tEV29yZCk7Ci0JCQltZGVsYXkoMTApOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXJldCA9IFJUX1NUQVRVU19GQUlMVVJFOwotCQkJYnJlYWs7Ci0JCX0KLQotCi0JCS8vCi0JCS8vIENoZWNrIHdoZXRoZXIgcmVhZGJhY2sgZGF0YSBpcyBjb3JyZWN0Ci0JCS8vCi0JCWlmKGR3UmVnUmVhZCAhPSBXcml0ZURhdGFbaV0pCi0JCXsKLQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiPT09PT5lcnJvcj09PT09ZHdSZWdSZWFkOiAleCwgV3JpdGVEYXRhOiAleFxuIiwgZHdSZWdSZWFkLCBXcml0ZURhdGFbaV0pOwotCQkJcmV0ID0gUlRfU1RBVFVTX0ZBSUxVUkU7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZSBCQiZSRgotICogICBpbnB1dDogIG5ldF9kZXZpY2UgZGV2Ci0gKiAgb3V0cHV0OiAgbm9uZQotICogIHJldHVybjogIG5vbmUKLSAqICBub3RpY2U6ICBJbml0aWFsaXphdGlvbiB2YWx1ZSBtYXkgY2hhbmdlIGFsbCB0aGUgdGltZSwgc28gcGxlYXNlIG1ha2UKLSAqICAgICAgICAgICBzdXJlIGl0IGhhcyBiZWVuIHN5bmNlZCB3aXRoIHRoZSBuZXdlc3QuCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgUlRfU1RBVFVTIHJ0bDgxOTJfQkJfQ29uZmlnX1BhcmFGaWxlKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCVJUX1NUQVRVUyBydFN0YXR1cyA9IFJUX1NUQVRVU19TVUNDRVNTOwotCi0JdTggYlJlZ1ZhbHVlID0gMCwgZUNoZWNrSXRlbSA9IDA7Ci0JdTMyIGR3UmVnVmFsdWUgPSAwOwotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCS8vPDE+SW5pdGlhbGl6ZSBCYXNlQmFuZAotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0JLyotLXNldCBCQiBHbG9iYWwgUmVzZXQtLSovCi0JYlJlZ1ZhbHVlID0gcmVhZF9uaWNfYnl0ZShwcml2LCBCQl9HTE9CQUxfUkVTRVQpOwotCXdyaXRlX25pY19ieXRlKHByaXYsIEJCX0dMT0JBTF9SRVNFVCwoYlJlZ1ZhbHVlfEJCX0dMT0JBTF9SRVNFVF9CSVQpKTsKLQotCS8qLS0tc2V0IEJCIHJlc2V0IEFjdGl2ZS0tLSovCi0JZHdSZWdWYWx1ZSA9IHJlYWRfbmljX2R3b3JkKHByaXYsIENQVV9HRU4pOwotCXdyaXRlX25pY19kd29yZChwcml2LCBDUFVfR0VOLCAoZHdSZWdWYWx1ZSYofkNQVV9HRU5fQkJfUlNUKSkpOwotCi0JLyotLS0tQ2tlY2sgRlBHQVBIWTAgYW5kIFBIWTEgYm9hcmQgaXMgT0stLS0tKi8KLQkvLyBUT0RPOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSByZW1vdmVkIG9uIEFTSUMgLCBFbWlseSAyMDA3LjIuMgotCWZvcihlQ2hlY2tJdGVtPShIVzkwX0JMT0NLX0UpSFc5MF9CTE9DS19QSFkwOyBlQ2hlY2tJdGVtPD1IVzkwX0JMT0NLX1BIWTE7IGVDaGVja0l0ZW0rKykKLQl7Ci0JCXJ0U3RhdHVzICA9IHJ0bDgxOTJfcGh5X2NoZWNrQkJBbmRSRihwcml2LCAoSFc5MF9CTE9DS19FKWVDaGVja0l0ZW0sIChSRjkwX1JBRElPX1BBVEhfRSkwKTsgLy9kb24ndCBjYXJlIFJGIHBhdGgKLQkJaWYocnRTdGF0dXMgIT0gUlRfU1RBVFVTX1NVQ0NFU1MpCi0JCXsKLQkJCVJUX1RSQUNFKChDT01QX0VSUiB8IENPTVBfUEhZKSwgIlBIWV9SRjgyNTZfQ29uZmlnKCk6Q2hlY2sgUEhZJWQgRmFpbCEhXG4iLCBlQ2hlY2tJdGVtLTEpOwotCQkJcmV0dXJuIHJ0U3RhdHVzOwotCQl9Ci0JfQotCS8qLS0tLSBTZXQgQ0NLIGFuZCBPRkRNIEJsb2NrICJPRkYiLS0tLSovCi0JcnRsODE5Ml9zZXRCQnJlZyhwcml2LCByRlBHQTBfUkZNT0QsIGJDQ0tFbnxiT0ZETUVuLCAweDApOwotCS8qLS0tLUJCIFJlZ2lzdGVyIEluaXRpbGF6YXRpb24tLS0tKi8KLQkvLz09bT09PlNldCBQSFkgUkVHIEZyb20gSGVhZGVyPD09bT09Ci0JcnRsODE5Ml9waHlDb25maWdCQihwcml2LCBCYXNlQmFuZF9Db25maWdfUEhZX1JFRyk7Ci0KLQkvKi0tLS1TZXQgQkIgcmVzZXQgZGUtQWN0aXZlLS0tLSovCi0JZHdSZWdWYWx1ZSA9IHJlYWRfbmljX2R3b3JkKHByaXYsIENQVV9HRU4pOwotCXdyaXRlX25pY19kd29yZChwcml2LCBDUFVfR0VOLCAoZHdSZWdWYWx1ZXxDUFVfR0VOX0JCX1JTVCkpOwotCi0gCS8qLS0tLUJCIEFHQyB0YWJsZSBJbml0aWFsaXphdGlvbi0tLS0qLwotCS8vPT1tPT0+U2V0IFBIWSBSRUcgRnJvbSBIZWFkZXI8PT1tPT0KLQlydGw4MTkyX3BoeUNvbmZpZ0JCKHByaXYsIEJhc2VCYW5kX0NvbmZpZ19BR0NfVEFCKTsKLQotCWlmIChwcml2LT5jYXJkXzgxOTJfdmVyc2lvbiAgPiBWRVJTSU9OXzgxOTBfQkQpCi0JewotCQlpZihwcml2LT5yZl90eXBlID09IFJGXzJUNFIpCi0JCXsKLQkJLy8gQW50ZW5uYSBnYWluIG9mZnNldCBmcm9tIEIvQy9EIHRvIEEKLQkJZHdSZWdWYWx1ZSA9ICggIHByaXYtPkFudGVubmFUeFB3RGlmZlsyXTw8OCB8Ci0JCQkJCQlwcml2LT5BbnRlbm5hVHhQd0RpZmZbMV08PDQgfAotCQkJCQkJcHJpdi0+QW50ZW5uYVR4UHdEaWZmWzBdKTsKLQkJfQotCQllbHNlCi0JCQlkd1JlZ1ZhbHVlID0gMHgwOwkvL0FudGVubmEgZ2FpbiBvZmZzZXQgZG9lc24ndCBtYWtlIHNlbnNlIGluIFJGIDFUMlIuCi0JCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgckZQR0EwX1R4R2FpblN0YWdlLAotCQkJKGJYQlR4QUdDfGJYQ1R4QUdDfGJYRFR4QUdDKSwgZHdSZWdWYWx1ZSk7Ci0KLQotCQkvL1hTVEFMTENhcAotCQlkd1JlZ1ZhbHVlID0gcHJpdi0+Q3J5c3RhbENhcDsKLQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMSwgYlh0YWxDYXA5MngsIGR3UmVnVmFsdWUpOwotCX0KLQotCS8vIENoZWNrIGlmIHRoZSBDQ0sgSGlnaFBvd2VyIGlzIHR1cm5lZCBPTi4KLQkvLyBUaGlzIGlzIHVzZWQgdG8gY2FsY3VsYXRlIFBXREIuCi0vLwlwcml2LT5iQ2NrSGlnaFBvd2VyID0gKHU4KShydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjIsIDB4MjAwKSk7Ci0JcmV0dXJuIHJ0U3RhdHVzOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZSBCQiZSRgotICogICBpbnB1dDogIG5ldF9kZXZpY2UgZGV2Ci0gKiAgb3V0cHV0OiAgbm9uZQotICogIHJldHVybjogIG5vbmUKLSAqICBub3RpY2U6ICBJbml0aWFsaXphdGlvbiB2YWx1ZSBtYXkgY2hhbmdlIGFsbCB0aGUgdGltZSwgc28gcGxlYXNlIG1ha2UKLSAqICAgICAgICAgICBzdXJlIGl0IGhhcyBiZWVuIHN5bmNlZCB3aXRoIHRoZSBuZXdlc3QuCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1SVF9TVEFUVVMgcnRsODE5Ml9CQkNvbmZpZyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQlydGw4MTkyX0luaXRCQlJGUmVnRGVmKHByaXYpOwotCS8vY29uZmlnIEJCJlJGLiBBcyBoYXJkQ29kZSBiYXNlZCBpbml0aWFsaXphdGlvbiBoYXMgbm90IGJlZW4gd2VsbAotCS8vaW1wbGVtZW50ZWQsIHNvIHVzZSBmaWxlIGZpcnN0LkZJWE1FOnNob3VsZCBpbXBsZW1lbnQgaXQgZm9yIGhhcmRjb2RlPwotCXJldHVybiBydGw4MTkyX0JCX0NvbmZpZ19QYXJhRmlsZShwcml2KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gb2J0YWlucyB0aGUgaW5pdGlhbGl6YXRpb24gdmFsdWUgb2YgVHggcG93ZXIgTGV2ZWwgb2Zmc2V0Ci0gKiAgIGlucHV0OiAgbmV0X2RldmljZSBkZXYKLSAqICBvdXRwdXQ6ICBub25lCi0gKiAgcmV0dXJuOiAgbm9uZQotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBydGw4MTkyX3BoeV9nZXRUeFBvd2VyKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQotewotCXByaXYtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WzBdID0KLQkJcmVhZF9uaWNfZHdvcmQocHJpdiwgclR4QUdDX1JhdGUxOF8wNik7Ci0JcHJpdi0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbMV0gPQotCQlyZWFkX25pY19kd29yZChwcml2LCByVHhBR0NfUmF0ZTU0XzI0KTsKLQlwcml2LT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFsyXSA9Ci0JCXJlYWRfbmljX2R3b3JkKHByaXYsIHJUeEFHQ19NY3MwM19NY3MwMCk7Ci0JcHJpdi0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbM10gPQotCQlyZWFkX25pY19kd29yZChwcml2LCByVHhBR0NfTWNzMDdfTWNzMDQpOwotCXByaXYtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WzRdID0KLQkJcmVhZF9uaWNfZHdvcmQocHJpdiwgclR4QUdDX01jczExX01jczA4KTsKLQlwcml2LT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFs1XSA9Ci0JCXJlYWRfbmljX2R3b3JkKHByaXYsIHJUeEFHQ19NY3MxNV9NY3MxMik7Ci0KLQkvLyByZWFkIHJ4IGluaXRpYWwgZ2FpbgotCXByaXYtPkRlZmF1bHRJbml0aWFsR2FpblswXSA9IHJlYWRfbmljX2J5dGUocHJpdiwgck9GRE0wX1hBQUdDQ29yZTEpOwotCXByaXYtPkRlZmF1bHRJbml0aWFsR2FpblsxXSA9IHJlYWRfbmljX2J5dGUocHJpdiwgck9GRE0wX1hCQUdDQ29yZTEpOwotCXByaXYtPkRlZmF1bHRJbml0aWFsR2FpblsyXSA9IHJlYWRfbmljX2J5dGUocHJpdiwgck9GRE0wX1hDQUdDQ29yZTEpOwotCXByaXYtPkRlZmF1bHRJbml0aWFsR2FpblszXSA9IHJlYWRfbmljX2J5dGUocHJpdiwgck9GRE0wX1hEQUdDQ29yZTEpOwotCVJUX1RSQUNFKENPTVBfSU5JVCwgIkRlZmF1bHQgaW5pdGlhbCBnYWluIChjNTA9MHgleCwgYzU4PTB4JXgsIGM2MD0weCV4LCBjNjg9MHgleClcbiIsCi0JCXByaXYtPkRlZmF1bHRJbml0aWFsR2FpblswXSwgcHJpdi0+RGVmYXVsdEluaXRpYWxHYWluWzFdLAotCQlwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bMl0sIHByaXYtPkRlZmF1bHRJbml0aWFsR2FpblszXSk7Ci0KLQkvLyByZWFkIGZyYW1lc3luYwotCXByaXYtPmZyYW1lc3luYyA9IHJlYWRfbmljX2J5dGUocHJpdiwgck9GRE0wX1J4RGV0ZWN0b3IzKTsKLQlwcml2LT5mcmFtZXN5bmNDMzQgPSByZWFkX25pY19kd29yZChwcml2LCByT0ZETTBfUnhEZXRlY3RvcjIpOwotCVJUX1RSQUNFKENPTVBfSU5JVCwgIkRlZmF1bHQgZnJhbWVzeW5jICgweCV4KSA9IDB4JXhcbiIsCi0JCXJPRkRNMF9SeERldGVjdG9yMywgcHJpdi0+ZnJhbWVzeW5jKTsKLQkvLyByZWFkIFNJRlMgKHNhdmUgdGhlIHZhbHVlIHJlYWQgZm9tZSBNQUNQSFlfUkVHLnR4dCkKLQlwcml2LT5TaWZzVGltZSA9IHJlYWRfbmljX3dvcmQocHJpdiwgU0lGUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIG9idGFpbnMgdGhlIGluaXRpYWxpemF0aW9uIHZhbHVlIG9mIFR4IHBvd2VyIExldmVsIG9mZnNldAotICogICBpbnB1dDogIG5ldF9kZXZpY2UgZGV2Ci0gKiAgb3V0cHV0OiAgbm9uZQotICogIHJldHVybjogIG5vbmUKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcnRsODE5Ml9waHlfc2V0VHhQb3dlcihzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgdTggY2hhbm5lbCkKLXsKLQl1OAlwb3dlcmxldmVsID0gMCxwb3dlcmxldmVsT0ZETTI0RyA9IDA7Ci0JY2hhciBhbnRfcHdyX2RpZmY7Ci0JdTMyCXU0UmVnVmFsdWU7Ci0KLQlpZihwcml2LT5lcHJvbXR5cGUgPT0gRVBST01fOTNjNDYpCi0JewotCQlwb3dlcmxldmVsID0gcHJpdi0+VHhQb3dlckxldmVsQ0NLW2NoYW5uZWwtMV07Ci0JCXBvd2VybGV2ZWxPRkRNMjRHID0gcHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R1tjaGFubmVsLTFdOwotCX0KLQllbHNlIGlmKHByaXYtPmVwcm9tdHlwZSA9PSBFUFJPTV85M2M1NikKLQl7Ci0JCWlmKHByaXYtPnJmX3R5cGUgPT0gUkZfMVQyUikKLQkJewotCQkJcG93ZXJsZXZlbCA9IHByaXYtPlR4UG93ZXJMZXZlbENDS19DW2NoYW5uZWwtMV07Ci0JCQlwb3dlcmxldmVsT0ZETTI0RyA9IHByaXYtPlR4UG93ZXJMZXZlbE9GRE0yNEdfQ1tjaGFubmVsLTFdOwotCQl9Ci0JCWVsc2UgaWYocHJpdi0+cmZfdHlwZSA9PSBSRl8yVDRSKQotCQl7Ci0JCQkvLyBNYWlubHkgd2UgdXNlIFJGLUEgVHggUG93ZXIgdG8gd3JpdGUgdGhlIFR4IFBvd2VyIHJlZ2lzdGVycywgYnV0IHRoZSBSRi1DIFR4Ci0JCQkvLyBQb3dlciBtdXN0IGJlIGNhbGN1bGF0ZWQgYnkgdGhlIGFudGVubmEgZGlmZi4KLQkJCS8vIFNvIHdlIGhhdmUgdG8gcmV3cml0ZSBBbnRlbm5hIGdhaW4gb2Zmc2V0IHJlZ2lzdGVyIGhlcmUuCi0JCQlwb3dlcmxldmVsID0gcHJpdi0+VHhQb3dlckxldmVsQ0NLX0FbY2hhbm5lbC0xXTsKLQkJCXBvd2VybGV2ZWxPRkRNMjRHID0gcHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R19BW2NoYW5uZWwtMV07Ci0KLQkJCWFudF9wd3JfZGlmZiA9IHByaXYtPlR4UG93ZXJMZXZlbE9GRE0yNEdfQ1tjaGFubmVsLTFdCi0JCQkJCQktcHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R19BW2NoYW5uZWwtMV07Ci0JCQlhbnRfcHdyX2RpZmYgJj0gMHhmOwotCi0JCQlwcml2LT5BbnRlbm5hVHhQd0RpZmZbMl0gPSAwOy8vIFJGLUQsIGRvbid0IGNhcmUKLQkJCXByaXYtPkFudGVubmFUeFB3RGlmZlsxXSA9ICh1OCkoYW50X3B3cl9kaWZmKTsvLyBSRi1DCi0JCQlwcml2LT5BbnRlbm5hVHhQd0RpZmZbMF0gPSAwOy8vIFJGLUIsIGRvbid0IGNhcmUKLQotCQkJLy8gQW50ZW5uYSBnYWluIG9mZnNldCBmcm9tIEIvQy9EIHRvIEEKLQkJCXU0UmVnVmFsdWUgPSAoICBwcml2LT5BbnRlbm5hVHhQd0RpZmZbMl08PDggfAotCQkJCQkJcHJpdi0+QW50ZW5uYVR4UHdEaWZmWzFdPDw0IHwKLQkJCQkJCXByaXYtPkFudGVubmFUeFB3RGlmZlswXSk7Ci0KLQkJCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgckZQR0EwX1R4R2FpblN0YWdlLAotCQkJKGJYQlR4QUdDfGJYQ1R4QUdDfGJYRFR4QUdDKSwgdTRSZWdWYWx1ZSk7Ci0JCX0KLQl9Ci0jaWZkZWYgVE9ETwotCS8vCi0JLy8gQ0NYIDIgUzMxLCBBUCBjb250cm9sIG9mIGNsaWVudCB0cmFuc21pdCBwb3dlcjoKLQkvLyAxLiBXZSBzaGFsbCBub3QgZXhjZWVkIENlbGwgUG93ZXIgTGltaXQgYXMgcG9zc2libGUgYXMgd2UgY2FuLgotCS8vIDIuIFRvbGVyYW5jZSBpcyArLy0gNWRCLgotCS8vIDMuIDgwMi4xMWggUG93ZXIgQ29udHJhaW50IHRha2VzIGhpZ2hlciBwcmVjZWRlbmNlIG92ZXIgQ0NYIENlbGwgUG93ZXIgTGltaXQuCi0JLy8KLQkvLyBUT0RPOgotCS8vIDEuIDgwMi4xMWggcG93ZXIgY29udHJhaW50Ci0JLy8KLQkvLyAwNzEwMTEsIGJ5IHJjbmprby4KLQkvLwotCWlmKAlwTWdudEluZm8tPk9wTW9kZSA9PSBSVF9PUF9NT0RFX0lORlJBU1RSVUNUVVJFICYmCi0JCXBNZ250SW5mby0+YldpdGhDY3hDZWxsUHdyICYmCi0JCWNoYW5uZWwgPT0gcE1nbnRJbmZvLT5kb3QxMUN1cnJlbnRDaGFubmVsTnVtYmVyKQotCXsKLQkJdTgJQ2NrQ2VsbFB3cklkeCA9IERibVRvVHhQd3JJZHgoQWRhcHRlciwgV0lSRUxFU1NfTU9ERV9CLCBwTWdudEluZm8tPkNjeENlbGxQd3IpOwotCQl1OAlMZWdhY3lPZmRtQ2VsbFB3cklkeCA9IERibVRvVHhQd3JJZHgoQWRhcHRlciwgV0lSRUxFU1NfTU9ERV9HLCBwTWdudEluZm8tPkNjeENlbGxQd3IpOwotCQl1OAlPZmRtQ2VsbFB3cklkeCA9IERibVRvVHhQd3JJZHgoQWRhcHRlciwgV0lSRUxFU1NfTU9ERV9OXzI0RywgcE1nbnRJbmZvLT5DY3hDZWxsUHdyKTsKLQotCQlSVF9UUkFDRShDT01QX1RYQUdDLCBEQkdfTE9VRCwKLQkJCSgiQ0NYIENlbGwgTGltaXQ6ICVkIGRibSA9PiBDQ0sgVHggcG93ZXIgaW5kZXggOiAlZCwgTGVnYWN5IE9GRE0gVHggcG93ZXIgaW5kZXggOiAlZCwgT0ZETSBUeCBwb3dlciBpbmRleDogJWRcbiIsCi0JCQlwTWdudEluZm8tPkNjeENlbGxQd3IsIENja0NlbGxQd3JJZHgsIExlZ2FjeU9mZG1DZWxsUHdySWR4LCBPZmRtQ2VsbFB3cklkeCkpOwotCQlSVF9UUkFDRShDT01QX1RYQUdDLCBEQkdfTE9VRCwKLQkJCSgiRUVQUk9NIGNoYW5uZWwoJWQpID0+IENDSyBUeCBwb3dlciBpbmRleDogJWQsIExlZ2FjeSBPRkRNIFR4IHBvd2VyIGluZGV4IDogJWQsIE9GRE0gVHggcG93ZXIgaW5kZXg6ICVkXG4iLAotCQkJY2hhbm5lbCwgcG93ZXJsZXZlbCwgcG93ZXJsZXZlbE9GRE0yNEcgKyBwSGFsRGF0YS0+TGVnYWN5SFRUeFBvd2VyRGlmZiwgcG93ZXJsZXZlbE9GRE0yNEcpKTsKLQotCQkvLyBDQ0sKLQkJaWYocG93ZXJsZXZlbCA+IENja0NlbGxQd3JJZHgpCi0JCQlwb3dlcmxldmVsID0gQ2NrQ2VsbFB3cklkeDsKLQkJLy8gTGVnYWN5IE9GRE0sIEhUIE9GRE0KLQkJaWYocG93ZXJsZXZlbE9GRE0yNEcgKyBwSGFsRGF0YS0+TGVnYWN5SFRUeFBvd2VyRGlmZiA+IE9mZG1DZWxsUHdySWR4KQotCQl7Ci0JCQlpZigoT2ZkbUNlbGxQd3JJZHggLSBwSGFsRGF0YS0+TGVnYWN5SFRUeFBvd2VyRGlmZikgPiAwKQotCQkJewotCQkJCXBvd2VybGV2ZWxPRkRNMjRHID0gT2ZkbUNlbGxQd3JJZHggLSBwSGFsRGF0YS0+TGVnYWN5SFRUeFBvd2VyRGlmZjsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlMZWdhY3lPZmRtQ2VsbFB3cklkeCA9IDA7Ci0JCQl9Ci0JCX0KLQotCQlSVF9UUkFDRShDT01QX1RYQUdDLCBEQkdfTE9VRCwKLQkJCSgiQWx0ZXJlZCBDQ0sgVHggcG93ZXIgaW5kZXggOiAlZCwgTGVnYWN5IE9GRE0gVHggcG93ZXIgaW5kZXg6ICVkLCBPRkRNIFR4IHBvd2VyIGluZGV4OiAlZFxuIiwKLQkJCXBvd2VybGV2ZWwsIHBvd2VybGV2ZWxPRkRNMjRHICsgcEhhbERhdGEtPkxlZ2FjeUhUVHhQb3dlckRpZmYsIHBvd2VybGV2ZWxPRkRNMjRHKSk7Ci0JfQotCi0JcEhhbERhdGEtPkN1cnJlbnRDY2tUeFB3cklkeCA9IHBvd2VybGV2ZWw7Ci0JcEhhbERhdGEtPkN1cnJlbnRPZmRtMjRHVHhQd3JJZHggPSBwb3dlcmxldmVsT0ZETTI0RzsKLSNlbmRpZgotCVBIWV9TZXRSRjgyNTZDQ0tUeFBvd2VyKHByaXYsIHBvd2VybGV2ZWwpOyAvL25lZWQgZnVydGhlciBpbXBsZW1lbnQKLQlQSFlfU2V0UkY4MjU2T0ZETVR4UG93ZXIocHJpdiwgcG93ZXJsZXZlbE9GRE0yNEcpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBjaGVjayBSZiBjaGlwIHRvIGRvIFJGIGNvbmZpZwotICogICBpbnB1dDogIG5ldF9kZXZpY2UgZGV2Ci0gKiAgb3V0cHV0OiAgbm9uZQotICogIHJldHVybjogIG9ubHkgODI1NiBpcyBzdXBwb3J0ZWQKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLVJUX1NUQVRVUyBydGw4MTkyX3BoeV9SRkNvbmZpZyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQlyZXR1cm4gUEhZX1JGODI1Nl9Db25maWcocHJpdik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZSBJbml0aWFsIGdhaW4KLSAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgotICogIG91dHB1dDogIG5vbmUKLSAqICByZXR1cm46ICBBcyBXaW5kb3dzIGhhcyBub3QgaW1wbGVtZW50ZWQgdGhpcywgd2FpdCBmb3IgY29tcGxlbWVudAotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBydGw4MTkyX3BoeV91cGRhdGVJbml0R2FpbihzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gcmVhZCBSRiBwYXJhbWV0ZXJzIGZyb20gZ2VuZXJhbCBoZWFkIGZpbGUsIGFuZCBkbyBSRiAzLXdpcmUKLSAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgotICogIG91dHB1dDogIG5vbmUKLSAqICByZXR1cm46ICByZXR1cm4gY29kZSBzaG93IGlmIFJGIGNvbmZpZ3VyYXRpb24gaXMgc3VjY2Vzc2Z1bCgwOnBhc3MsIDE6ZmFpbCkKLSAqICAgIE5vdGU6ICBEZWxheSBtYXkgYmUgcmVxdWlyZWQgZm9yIFJGIGNvbmZpZ3VyYXRpb24KLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXU4IHJ0bDgxOTJfcGh5X0NvbmZpZ1JGV2l0aEhlYWRlckZpbGUoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsCi0JCQkJICAgICAgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCkKLXsKLQotCWludCBpOwotCS8vdTMyKiBwUkZBcnJheTsKLQl1OCByZXQgPSAwOwotCi0Jc3dpdGNoKGVSRlBhdGgpewotCQljYXNlIFJGOTBfUEFUSF9BOgotCQkJZm9yKGkgPSAwO2k8UmFkaW9BX0FycmF5TGVuZ3RoOyBpPWkrMil7Ci0KLQkJCQlpZihSdGw4MTlYUmFkaW9BX0FycmF5W2ldID09IDB4ZmUpewotCQkJCQkJbXNsZWVwKDEwMCk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcocHJpdiwgZVJGUGF0aCwgUnRsODE5WFJhZGlvQV9BcnJheVtpXSwgYk1hc2sxMkJpdHMsIFJ0bDgxOVhSYWRpb0FfQXJyYXlbaSsxXSk7Ci0JCQkJLy9tc2xlZXAoMSk7Ci0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFJGOTBfUEFUSF9COgotCQkJZm9yKGkgPSAwO2k8UmFkaW9CX0FycmF5TGVuZ3RoOyBpPWkrMil7Ci0KLQkJCQlpZihSdGw4MTlYUmFkaW9CX0FycmF5W2ldID09IDB4ZmUpewotCQkJCQkJbXNsZWVwKDEwMCk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcocHJpdiwgZVJGUGF0aCwgUnRsODE5WFJhZGlvQl9BcnJheVtpXSwgYk1hc2sxMkJpdHMsIFJ0bDgxOVhSYWRpb0JfQXJyYXlbaSsxXSk7Ci0JCQkJLy9tc2xlZXAoMSk7Ci0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFJGOTBfUEFUSF9DOgotCQkJZm9yKGkgPSAwO2k8UmFkaW9DX0FycmF5TGVuZ3RoOyBpPWkrMil7Ci0KLQkJCQlpZihSdGw4MTlYUmFkaW9DX0FycmF5W2ldID09IDB4ZmUpewotCQkJCQkJbXNsZWVwKDEwMCk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcocHJpdiwgZVJGUGF0aCwgUnRsODE5WFJhZGlvQ19BcnJheVtpXSwgYk1hc2sxMkJpdHMsIFJ0bDgxOVhSYWRpb0NfQXJyYXlbaSsxXSk7Ci0JCQkJLy9tc2xlZXAoMSk7Ci0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIFJGOTBfUEFUSF9EOgotCQkJZm9yKGkgPSAwO2k8UmFkaW9EX0FycmF5TGVuZ3RoOyBpPWkrMil7Ci0KLQkJCQlpZihSdGw4MTlYUmFkaW9EX0FycmF5W2ldID09IDB4ZmUpewotCQkJCQkJbXNsZWVwKDEwMCk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJcnRsODE5Ml9waHlfU2V0UkZSZWcocHJpdiwgZVJGUGF0aCwgUnRsODE5WFJhZGlvRF9BcnJheVtpXSwgYk1hc2sxMkJpdHMsIFJ0bDgxOVhSYWRpb0RfQXJyYXlbaSsxXSk7Ci0JCQkJLy9tc2xlZXAoMSk7Ci0KLQkJCX0KLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJldDsKLQotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gc2V0IFR4IFBvd2VyIG9mIHRoZSBjaGFubmVsCi0gKiAgIGlucHV0OiAgc3RydWN0IG5ldF9kZXZpY2UgKmRldgotICogICAJICAgICB1OCAJCWNoYW5uZWwKLSAqICBvdXRwdXQ6ICBub25lCi0gKiAgcmV0dXJuOiAgbm9uZQotICogICAgTm90ZToKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB2b2lkIHJ0bDgxOTJfU2V0VHhQb3dlckxldmVsKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCB1OCBjaGFubmVsKQotewotCXU4CXBvd2VybGV2ZWwgPSBwcml2LT5UeFBvd2VyTGV2ZWxDQ0tbY2hhbm5lbC0xXTsKLQl1OAlwb3dlcmxldmVsT0ZETTI0RyA9IHByaXYtPlR4UG93ZXJMZXZlbE9GRE0yNEdbY2hhbm5lbC0xXTsKLQotCVBIWV9TZXRSRjgyNTZDQ0tUeFBvd2VyKHByaXYsIHBvd2VybGV2ZWwpOwotCVBIWV9TZXRSRjgyNTZPRkRNVHhQb3dlcihwcml2LCBwb3dlcmxldmVsT0ZETTI0Ryk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBzZXQgY29tbWFuZCB0YWJsZSB2YXJpYWJsZShzdHJ1Y3QgU3dDaG5sQ21kKS4KLSAqICAgaW5wdXQ6ICBTd0NobmxDbWQqCQlDbWRUYWJsZSAJLy90YWJsZSB0byBiZSBzZXQuCi0gKiAgIAkgICAgIHUzMgkJQ21kVGFibGVJZHggCS8vdmFyaWFibGUgaW5kZXggaW4gdGFibGUgdG8gYmUgc2V0Ci0gKiAgIAkgICAgIHUzMgkJQ21kVGFibGVTegkvL3RhYmxlIHNpemUuCi0gKiAgIAkgICAgIFN3Q2hubENtZElECUNtZElECQkvL2NvbW1hbmQgSUQgdG8gc2V0LgotICoJICAgICB1MzIJCVBhcmExCi0gKgkgICAgIHUzMgkJUGFyYTIKLSAqCSAgICAgdTMyCQltc0RlbGF5Ci0gKiAgb3V0cHV0OgotICogIHJldHVybjogIHRydWUgaWYgZmluaXNoZWQsIGZhbHNlIG90aGVyd2lzZQotICogICAgTm90ZToKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyB1OCBydGw4MTkyX3BoeV9TZXRTd0NobmxDbWRBcnJheSgKLQlTd0NobmxDbWQqCQlDbWRUYWJsZSwKLQl1MzIJCQlDbWRUYWJsZUlkeCwKLQl1MzIJCQlDbWRUYWJsZVN6LAotCVN3Q2hubENtZElECQlDbWRJRCwKLQl1MzIJCQlQYXJhMSwKLQl1MzIJCQlQYXJhMiwKLQl1MzIJCQltc0RlbGF5Ci0JKQotewotCVN3Q2hubENtZCogcENtZDsKLQotCWlmKENtZFRhYmxlID09IE5VTEwpCi0JewotCQlSVF9UUkFDRShDT01QX0VSUiwgInBoeV9TZXRTd0NobmxDbWRBcnJheSgpOiBDbWRUYWJsZSBjYW5ub3QgYmUgTlVMTC5cbiIpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCWlmKENtZFRhYmxlSWR4ID49IENtZFRhYmxlU3opCi0JewotCQlSVF9UUkFDRShDT01QX0VSUiwgInBoeV9TZXRTd0NobmxDbWRBcnJheSgpOiBBY2Nlc3MgaW52YWxpZCBpbmRleCwgcGxlYXNlIGNoZWNrIHNpemUgb2YgdGhlIHRhYmxlLCBDbWRUYWJsZUlkeDolZCwgQ21kVGFibGVTejolZFxuIiwKLQkJCQlDbWRUYWJsZUlkeCwgQ21kVGFibGVTeik7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwQ21kID0gQ21kVGFibGUgKyBDbWRUYWJsZUlkeDsKLQlwQ21kLT5DbWRJRCA9IENtZElEOwotCXBDbWQtPlBhcmExID0gUGFyYTE7Ci0JcENtZC0+UGFyYTIgPSBQYXJhMjsKLQlwQ21kLT5tc0RlbGF5ID0gbXNEZWxheTsKLQotCXJldHVybiB0cnVlOwotfQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gc2V0IGNoYW5uZWwgc3RlcCBieSBzdGVwCi0gKiAgIGlucHV0OiAgc3RydWN0IG5ldF9kZXZpY2UgKmRldgotICogICAJICAgICB1OCAJCWNoYW5uZWwKLSAqICAgCSAgICAgdTgqIAkJc3RhZ2UgLy8zIHN0YWdlcwotICogICAJICAgICB1OCogCQlzdGVwICAvLwotICogICAJICAgICB1MzIqIAkJZGVsYXkgLy93aGV0aGVyIG5lZWQgdG8gZGVsYXkKLSAqICBvdXRwdXQ6ICBzdG9yZSBuZXcgc3RhZ2UsIHN0ZXAgYW5kIGRlbGF5IGZvciBuZXh0IHN0ZXAoY29tYmluZSB3aXRoIGZ1bmN0aW9uIGFib3ZlKQotICogIHJldHVybjogIHRydWUgaWYgZmluaXNoZWQsIGZhbHNlIG90aGVyd2lzZQotICogICAgTm90ZTogIFdhaXQgZm9yIHNpbXBsZXIgZnVuY3Rpb24gdG8gcmVwbGFjZSBpdCAvL3diCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdTggcnRsODE5Ml9waHlfU3dDaG5sU3RlcEJ5U3RlcChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgdTggY2hhbm5lbCwKLQkJCQkgICAgICAgdTgqIHN0YWdlLCB1OCogc3RlcCwgdTMyKiBkZWxheSkKLXsKLS8vCVBDSEFOTkVMX0FDQ0VTU19TRVRUSU5HCXBDaG5sQWNjZXNzU2V0dGluZzsKLQlTd0NobmxDbWQJCQkJUHJlQ29tbW9uQ21kW01BWF9QUkVDTURfQ05UXTsKLQl1MzIJCQkJCVByZUNvbW1vbkNtZENudDsKLQlTd0NobmxDbWQJCQkJUG9zdENvbW1vbkNtZFtNQVhfUE9TVENNRF9DTlRdOwotCXUzMgkJCQkJUG9zdENvbW1vbkNtZENudDsKLQlTd0NobmxDbWQJCQkJUmZEZXBlbmRDbWRbTUFYX1JGREVQRU5EQ01EX0NOVF07Ci0JdTMyCQkJCQlSZkRlcGVuZENtZENudDsKLQlTd0NobmxDbWQJCQkJKkN1cnJlbnRDbWQgPSBOVUxMOwotCS8vUkY5MF9SQURJT19QQVRIX0UJCWVSRlBhdGg7Ci0JdTgJCWVSRlBhdGg7Ci0vLwl1MzIJCVJmUmV0VmFsOwotLy8JdTgJCVJldHJ5Q250OwotCi0JUlRfVFJBQ0UoQ09NUF9UUkFDRSwgIj09PT0+JXMoKT09PT1zdGFnZTolZCwgc3RlcDolZCwgY2hhbm5lbDolZFxuIiwgX19GVU5DVElPTl9fLCAqc3RhZ2UsICpzdGVwLCBjaGFubmVsKTsKLS8vCVJUX0FTU0VSVChJc0xlZ2FsQ2hhbm5lbChBZGFwdGVyLCBjaGFubmVsKSwgKCJpbGxlZ2FsIGNoYW5uZWw6ICVkXG4iLCBjaGFubmVsKSk7Ci0KLSNpZmRlZiBFTkFCTEVfRE9UMTFECi0JaWYgKCFJc0xlZ2FsQ2hhbm5lbChwcml2LT5pZWVlODAyMTEsIGNoYW5uZWwpKQotCXsKLQkJUlRfVFJBQ0UoQ09NUF9FUlIsICI9PT09PT09PT09PT09PnNldCB0byBpbGxlZ2FsIGNoYW5uZWw6JWRcbiIsIGNoYW5uZWwpOwotCQlyZXR1cm4gdHJ1ZTsgLy9yZXR1cm4gdHJ1ZSB0byB0ZWxsIHVwcGVyIGNhbGxlciBmdW5jdGlvbiB0aGlzIGNoYW5uZWwgc2V0dGluZyBpcyBmaW5pc2hlZCEgT3IgaXQgd2lsbCBpbiB3aGlsZSBsb29wLgotCX0KLSNlbmRpZgotCi0JLy9mb3IoZVJGUGF0aCA9IFJGOTBfUEFUSF9BOyBlUkZQYXRoIDxwSGFsRGF0YS0+TnVtVG90YWxSRlBhdGg7IGVSRlBhdGgrKykKLQkvL2ZvcihlUkZQYXRoID0gMDsgZVJGUGF0aCA8UkY5MF9QQVRIX01BWDsgZVJGUGF0aCsrKQotCXsKLQkJLy9pZiAoIXJ0bDgxOTJfcGh5X0NoZWNrSXNMZWdhbFJGUGF0aChkZXYsIGVSRlBhdGgpKQotCQkvLwlyZXR1cm4gZmFsc2U7Ci0JCS8vIDwxPiBGaWxsIHVwIHByZSBjb21tb24gY29tbWFuZC4KLQkJUHJlQ29tbW9uQ21kQ250ID0gMDsKLQkJcnRsODE5Ml9waHlfU2V0U3dDaG5sQ21kQXJyYXkoUHJlQ29tbW9uQ21kLCBQcmVDb21tb25DbWRDbnQrKywgTUFYX1BSRUNNRF9DTlQsCi0JCQkJCUNtZElEX1NldFR4UG93ZXJMZXZlbCwgMCwgMCwgMCk7Ci0JCXJ0bDgxOTJfcGh5X1NldFN3Q2hubENtZEFycmF5KFByZUNvbW1vbkNtZCwgUHJlQ29tbW9uQ21kQ250KyssIE1BWF9QUkVDTURfQ05ULAotCQkJCQlDbWRJRF9FbmQsIDAsIDAsIDApOwotCi0JCS8vIDwyPiBGaWxsIHVwIHBvc3QgY29tbW9uIGNvbW1hbmQuCi0JCVBvc3RDb21tb25DbWRDbnQgPSAwOwotCi0JCXJ0bDgxOTJfcGh5X1NldFN3Q2hubENtZEFycmF5KFBvc3RDb21tb25DbWQsIFBvc3RDb21tb25DbWRDbnQrKywgTUFYX1BPU1RDTURfQ05ULAotCQkJCQlDbWRJRF9FbmQsIDAsIDAsIDApOwotCi0JCS8vIDwzPiBGaWxsIHVwIFJGIGRlcGVuZGVudCBjb21tYW5kLgotCQlSZkRlcGVuZENtZENudCA9IDA7Ci0KLQkJLy8gVEVTVCEhIFRoaXMgaXMgbm90IHRoZSB0YWJsZSBmb3IgODI1NiEhCi0JCWlmICghKGNoYW5uZWwgPj0gMSAmJiBjaGFubmVsIDw9IDE0KSkKLQkJewotCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJpbGxlZ2FsIGNoYW5uZWwgZm9yIFplYnJhIDgyNTY6ICVkXG4iLCBjaGFubmVsKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlydGw4MTkyX3BoeV9TZXRTd0NobmxDbWRBcnJheShSZkRlcGVuZENtZCwgUmZEZXBlbmRDbWRDbnQrKywgTUFYX1JGREVQRU5EQ01EX0NOVCwKLQkJCUNtZElEX1JGX1dyaXRlUmVnLCByWmVicmExX0NoYW5uZWwsIGNoYW5uZWwsIDEwKTsKLQkJcnRsODE5Ml9waHlfU2V0U3dDaG5sQ21kQXJyYXkoUmZEZXBlbmRDbWQsIFJmRGVwZW5kQ21kQ250KyssIE1BWF9SRkRFUEVORENNRF9DTlQsCi0JCUNtZElEX0VuZCwgMCwgMCwgMCk7Ci0KLQkJZG97Ci0JCQlzd2l0Y2goKnN0YWdlKQotCQkJewotCQkJY2FzZSAwOgotCQkJCUN1cnJlbnRDbWQ9JlByZUNvbW1vbkNtZFsqc3RlcF07Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6Ci0JCQkJQ3VycmVudENtZD0mUmZEZXBlbmRDbWRbKnN0ZXBdOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyOgotCQkJCUN1cnJlbnRDbWQ9JlBvc3RDb21tb25DbWRbKnN0ZXBdOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlpZihDdXJyZW50Q21kLT5DbWRJRD09Q21kSURfRW5kKQotCQkJewotCQkJCWlmKCgqc3RhZ2UpPT0yKQotCQkJCXsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCSgqc3RhZ2UpKys7Ci0JCQkJCSgqc3RlcCk9MDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCi0JCQlzd2l0Y2goQ3VycmVudENtZC0+Q21kSUQpCi0JCQl7Ci0JCQljYXNlIENtZElEX1NldFR4UG93ZXJMZXZlbDoKLQkJCQlpZihwcml2LT5jYXJkXzgxOTJfdmVyc2lvbiA+ICh1OClWRVJTSU9OXzgxOTBfQkQpIC8veGlvbmc6IGNvbnNpZGVyIGl0IGxhdGVyIQotCQkJCQlydGw4MTkyX1NldFR4UG93ZXJMZXZlbChwcml2LCBjaGFubmVsKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ21kSURfV3JpdGVQb3J0VWxvbmc6Ci0JCQkJd3JpdGVfbmljX2R3b3JkKHByaXYsIEN1cnJlbnRDbWQtPlBhcmExLCBDdXJyZW50Q21kLT5QYXJhMik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENtZElEX1dyaXRlUG9ydFVzaG9ydDoKLQkJCQl3cml0ZV9uaWNfd29yZChwcml2LCBDdXJyZW50Q21kLT5QYXJhMSwgKHUxNilDdXJyZW50Q21kLT5QYXJhMik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENtZElEX1dyaXRlUG9ydFVjaGFyOgotCQkJCXdyaXRlX25pY19ieXRlKHByaXYsIEN1cnJlbnRDbWQtPlBhcmExLCAodTgpQ3VycmVudENtZC0+UGFyYTIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDbWRJRF9SRl9Xcml0ZVJlZzoKLQkJCQlmb3IoZVJGUGF0aCA9IDA7IGVSRlBhdGggPHByaXYtPk51bVRvdGFsUkZQYXRoOyBlUkZQYXRoKyspCi0JCQkJCXJ0bDgxOTJfcGh5X1NldFJGUmVnKHByaXYsIChSRjkwX1JBRElPX1BBVEhfRSllUkZQYXRoLCBDdXJyZW50Q21kLT5QYXJhMSwgYk1hc2sxMkJpdHMsIEN1cnJlbnRDbWQtPlBhcmEyPDw3KTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWJyZWFrOwotCQl9d2hpbGUodHJ1ZSk7Ci0JfS8qZm9yKE51bWJlciBvZiBSRiBwYXRocykqLwotCi0JKCpkZWxheSk9Q3VycmVudENtZC0+bXNEZWxheTsKLQkoKnN0ZXApKys7Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKmZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiBkb2VzIGFjdHVyYWxseSBzZXQgY2hhbm5lbCB3b3JrCi0gKiAgIGlucHV0OiAgc3RydWN0IG5ldF9kZXZpY2UgKmRldgotICogICAJICAgICB1OCAJCWNoYW5uZWwKLSAqICBvdXRwdXQ6ICBub25lCi0gKiAgcmV0dXJuOiAgbm9pbgotICogICAgTm90ZTogIFdlIHNob3VsZCBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5Ci0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBydGw4MTkyX3BoeV9GaW5pc2hTd0NobmxOb3coc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHU4IGNoYW5uZWwpCi17Ci0JdTMyCWRlbGF5ID0gMDsKLQotCXdoaWxlICghcnRsODE5Ml9waHlfU3dDaG5sU3RlcEJ5U3RlcChwcml2LCBjaGFubmVsLCAmcHJpdi0+U3dDaG5sU3RhZ2UsICZwcml2LT5Td0NobmxTdGVwLCAmZGVsYXkpKQotCXsKLQkJaWYoZGVsYXk+MCkKLQkJCW1zbGVlcChkZWxheSk7Ly9vciBtZGVsYXk/IG5lZWQgZnVydGhlciBjb25zaWRlcmF0aW9uCi0gICAgICAgICAgICAgICAgaWYoIXByaXYtPnVwKQotCQkgICAgICAgIGJyZWFrOwotCX0KLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqZnVuY3Rpb246ICBDYWxsYmFjayByb3V0aW5lIG9mIHRoZSB3b3JrIGl0ZW0gZm9yIHN3aXRjaCBjaGFubmVsLgotICogICBpbnB1dDoKLSAqCi0gKiAgb3V0cHV0OiAgbm9uZQotICogIHJldHVybjogIG5vaW4KLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcnRsODE5Ml9Td0NobmxfV29ya0l0ZW0oc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0JUlRfVFJBQ0UoQ09NUF9UUkFDRSwgIj09PiBTd0NobmxDYWxsYmFjazgxOXhVc2JXb3JrSXRlbSgpXG4iKTsKLQotCVJUX1RSQUNFKENPTVBfVFJBQ0UsICI9PT09PT4tLSVzKCksIHNldCBjaGFuOiVkLCBwcml2OiVwXG4iLCBfX0ZVTkNUSU9OX18sIHByaXYtPmNoYW4sIHByaXYpOwotCi0JcnRsODE5Ml9waHlfRmluaXNoU3dDaG5sTm93KHByaXYsIHByaXYtPmNoYW4pOwotCi0JUlRfVFJBQ0UoQ09NUF9UUkFDRSwgIjw9PSBTd0NobmxDYWxsYmFjazgxOXhVc2JXb3JrSXRlbSgpXG4iKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICpmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gc2NoZWR1bGVkIGFjdHVyYWwgd29ya2l0ZW0gdG8gc2V0IGNoYW5uZWwKLSAqICAgaW5wdXQ6ICBuZXRfZGV2aWNlIGRldgotICogICAJICAgICB1OAkJY2hhbm5lbCAvL2NoYW5uZWwgdG8gc2V0Ci0gKiAgb3V0cHV0OiAgbm9uZQotICogIHJldHVybjogIHJldHVybiBjb2RlIHNob3cgaWYgd29ya2l0ZW0gaXMgc2NoZWR1bGVkKDE6cGFzcywgMDpmYWlsKQotICogICAgTm90ZTogIERlbGF5IG1heSBiZSByZXF1aXJlZCBmb3IgUkYgY29uZmlndXJhdGlvbgotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdTggcnRsODE5Ml9waHlfU3dDaG5sKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlODAyMTEsIHU4IGNoYW5uZWwpCi17Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihpZWVlODAyMTEtPmRldik7Ci0KLQlSVF9UUkFDRShDT01QX1BIWSwgIj09PT09PiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGlmKCFwcml2LT51cCkKLQkJcmV0dXJuIGZhbHNlOwotCWlmKHByaXYtPlN3Q2hubEluUHJvZ3Jlc3MpCi0JCXJldHVybiBmYWxzZTsKLQotLy8JaWYocEhhbERhdGEtPlNldEJXTW9kZUluUHJvZ3Jlc3MpCi0vLwkJcmV0dXJuOwotCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCXN3aXRjaChwcml2LT5pZWVlODAyMTEtPm1vZGUpCi0JewotCWNhc2UgV0lSRUxFU1NfTU9ERV9BOgotCWNhc2UgV0lSRUxFU1NfTU9ERV9OXzVHOgotCQlpZiAoY2hhbm5lbDw9MTQpewotCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJXSVJFTEVTU19NT0RFX0EgYnV0IGNoYW5uZWw8PTE0XG4iKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlicmVhazsKLQljYXNlIFdJUkVMRVNTX01PREVfQjoKLQkJaWYgKGNoYW5uZWw+MTQpewotCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJXSVJFTEVTU19NT0RFX0IgYnV0IGNoYW5uZWw+MTRcbiIpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgV0lSRUxFU1NfTU9ERV9HOgotCWNhc2UgV0lSRUxFU1NfTU9ERV9OXzI0RzoKLQkJaWYgKGNoYW5uZWw+MTQpewotCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJXSVJFTEVTU19NT0RFX0cgYnV0IGNoYW5uZWw+MTRcbiIpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWJyZWFrOwotCX0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQlwcml2LT5Td0NobmxJblByb2dyZXNzID0gdHJ1ZTsKLQlpZihjaGFubmVsID09IDApCi0JCWNoYW5uZWwgPSAxOwotCi0JcHJpdi0+Y2hhbj1jaGFubmVsOwotCi0JcHJpdi0+U3dDaG5sU3RhZ2U9MDsKLQlwcml2LT5Td0NobmxTdGVwPTA7Ci0JaWYgKHByaXYtPnVwKQotCQlydGw4MTkyX1N3Q2hubF9Xb3JrSXRlbShwcml2KTsKLQotICAgICAgICBwcml2LT5Td0NobmxJblByb2dyZXNzID0gZmFsc2U7Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIENDS19UeF9Qb3dlcl9UcmFja19CV19Td2l0Y2hfVFNTSShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQlzd2l0Y2gocHJpdi0+Q3VycmVudENoYW5uZWxCVykKLQl7Ci0JCS8qIDIwIE1IeiBjaGFubmVsKi8KLQkJY2FzZSBIVF9DSEFOTkVMX1dJRFRIXzIwOgotCS8vYWRkZWQgYnkgdml2aSwgY2NrLHR4IHBvd2VyIHRyYWNrLCAyMDA4MDcwMwotCQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA9Ci0JCQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl8yME1kZWZhdWx0ICsgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlOwotCi0JCQlpZihwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID4gKENDS1R4QkJHYWluVGFibGVMZW5ndGgtMSkpCi0JCQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA9IENDS1R4QkJHYWluVGFibGVMZW5ndGgtMTsKLQkJCWlmKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPCAwKQotCQkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPSAwOwotCi0JCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiMjBNLCBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID0gJWRcbiIsIHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pOwotCi0JCQlpZihwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsPT0gMTQgJiYgIXByaXYtPmJjY2tfaW5fY2gxNCkKLQkJCXsKLQkJCQlwcml2LT5iY2NrX2luX2NoMTQgPSBUUlVFOwotCQkJCWRtX2Nja190eHBvd2VyX2FkanVzdChwcml2LCBwcml2LT5iY2NrX2luX2NoMTQpOwotCQkJfQotCQkJZWxzZSBpZihwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsICE9IDE0ICYmIHByaXYtPmJjY2tfaW5fY2gxNCkKLQkJCXsKLQkJCQlwcml2LT5iY2NrX2luX2NoMTQgPSBGQUxTRTsKLQkJCQlkbV9jY2tfdHhwb3dlcl9hZGp1c3QocHJpdiwgcHJpdi0+YmNja19pbl9jaDE0KTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlkbV9jY2tfdHhwb3dlcl9hZGp1c3QocHJpdiwgcHJpdi0+YmNja19pbl9jaDE0KTsKLQkJYnJlYWs7Ci0KLQkJLyogNDAgTUh6IGNoYW5uZWwqLwotCQljYXNlIEhUX0NIQU5ORUxfV0lEVEhfMjBfNDA6Ci0JCQkvL2FkZGVkIGJ5IHZpdmksIGNjayx0eCBwb3dlciB0cmFjaywgMjAwODA3MDMKLQkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPQotCQkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fNDBNZGVmYXVsdCArIHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZTsKLQotCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIjQwTSwgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA9ICVkXG4iLCBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKTsKLQkJCWlmKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPiAoQ0NLVHhCQkdhaW5UYWJsZUxlbmd0aC0xKSkKLQkJCQlwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID0gQ0NLVHhCQkdhaW5UYWJsZUxlbmd0aC0xOwotCQkJaWYocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA8IDApCi0JCQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA9IDA7Ci0KLQkJCWlmKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPT0gMTQgJiYgIXByaXYtPmJjY2tfaW5fY2gxNCkKLQkJCXsKLQkJCQlwcml2LT5iY2NrX2luX2NoMTQgPSBUUlVFOwotCQkJCWRtX2Nja190eHBvd2VyX2FkanVzdChwcml2LCBwcml2LT5iY2NrX2luX2NoMTQpOwotCQkJfQotCQkJZWxzZSBpZihwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsICE9IDE0ICYmIHByaXYtPmJjY2tfaW5fY2gxNCkKLQkJCXsKLQkJCQlwcml2LT5iY2NrX2luX2NoMTQgPSBGQUxTRTsKLQkJCQlkbV9jY2tfdHhwb3dlcl9hZGp1c3QocHJpdiwgcHJpdi0+YmNja19pbl9jaDE0KTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlkbV9jY2tfdHhwb3dlcl9hZGp1c3QocHJpdiwgcHJpdi0+YmNja19pbl9jaDE0KTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBDQ0tfVHhfUG93ZXJfVHJhY2tfQldfU3dpdGNoX1RoZXJtYWxNZXRlcihzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQlpZihwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID09IDE0ICYmICFwcml2LT5iY2NrX2luX2NoMTQpCi0JCXByaXYtPmJjY2tfaW5fY2gxNCA9IFRSVUU7Ci0JZWxzZSBpZihwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsICE9IDE0ICYmIHByaXYtPmJjY2tfaW5fY2gxNCkKLQkJcHJpdi0+YmNja19pbl9jaDE0ID0gRkFMU0U7Ci0KLQkvL3dyaXRlIHRvIGRlZmF1bHQgaW5kZXggYW5kIHR4IHBvd2VyIHRyYWNrIHdpbGwgYmUgZG9uZSBpbiBkbS4KLQlzd2l0Y2gocHJpdi0+Q3VycmVudENoYW5uZWxCVykKLQl7Ci0JCS8qIDIwIE1IeiBjaGFubmVsKi8KLQkJY2FzZSBIVF9DSEFOTkVMX1dJRFRIXzIwOgotCQkJaWYocHJpdi0+UmVjb3JkX0NDS18yME1pbmRleCA9PSAwKQotCQkJCXByaXYtPlJlY29yZF9DQ0tfMjBNaW5kZXggPSA2OwkvL3NldCBkZWZhdWx0IHZhbHVlLgotCQkJcHJpdi0+Q0NLX2luZGV4ID0gcHJpdi0+UmVjb3JkX0NDS18yME1pbmRleDsvLzY7Ci0JCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiMjBNSHosIENDS19UeF9Qb3dlcl9UcmFja19CV19Td2l0Y2hfVGhlcm1hbE1ldGVyKCksQ0NLX2luZGV4ID0gJWRcbiIsIHByaXYtPkNDS19pbmRleCk7Ci0JCWJyZWFrOwotCi0JCS8qIDQwIE1IeiBjaGFubmVsKi8KLQkJY2FzZSBIVF9DSEFOTkVMX1dJRFRIXzIwXzQwOgotCQkJcHJpdi0+Q0NLX2luZGV4ID0gcHJpdi0+UmVjb3JkX0NDS180ME1pbmRleDsvLzA7Ci0JCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiNDBNSHosIENDS19UeF9Qb3dlcl9UcmFja19CV19Td2l0Y2hfVGhlcm1hbE1ldGVyKCksIENDS19pbmRleCA9ICVkXG4iLCBwcml2LT5DQ0tfaW5kZXgpOwotCQlicmVhazsKLQl9Ci0JZG1fY2NrX3R4cG93ZXJfYWRqdXN0KHByaXYsIHByaXYtPmJjY2tfaW5fY2gxNCk7Ci19Ci0KLXN0YXRpYyB2b2lkIENDS19UeF9Qb3dlcl9UcmFja19CV19Td2l0Y2goc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpCi17Ci0KLQkvL2lmKHBIYWxEYXRhLT5iRGN1dCA9PSBUUlVFKQotCWlmKHByaXYtPklDX0N1dCA+PSBJQ19WZXJzaW9uQ3V0X0QpCi0JCUNDS19UeF9Qb3dlcl9UcmFja19CV19Td2l0Y2hfVFNTSShwcml2KTsKLQllbHNlCi0JCUNDS19UeF9Qb3dlcl9UcmFja19CV19Td2l0Y2hfVGhlcm1hbE1ldGVyKHByaXYpOwotfQotCi0KLS8vCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKmZ1bmN0aW9uOiAgQ2FsbGJhY2sgcm91dGluZSBvZiB0aGUgd29yayBpdGVtIGZvciBzZXQgYmFuZHdpZHRoIG1vZGUuCi0gKiAgIGlucHV0OiAgc3RydWN0IG5ldF9kZXZpY2UgKmRldgotICogICAJICAgICBIVF9DSEFOTkVMX1dJRFRICUJhbmR3aWR0aCAgLy8yME0gb3IgNDBNCi0gKiAgIAkgICAgIEhUX0VYVENITkxfT0ZGU0VUIE9mZnNldCAJICAgLy9VcHBlciwgTG93ZXIsIG9yIERvbid0IGNhcmUKLSAqICBvdXRwdXQ6ICBub25lCi0gKiAgcmV0dXJuOiAgbm9uZQotICogICAgTm90ZTogIEkgZG91YnQgd2hldGhlciBTZXRCV01vZGVJblByb2dyZXNzIGZsYWcgaXMgbmVjZXNzYXJ5IGFzIHdlIGNhbgotICogICAgCSAgICAgdGVzdCB3aGV0aGVyIGN1cnJlbnQgd29yayBpbiB0aGUgcXVldWUgb3Igbm90Li8vZG8gST8KLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcnRsODE5Ml9TZXRCV01vZGVXb3JrSXRlbShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKLXsKLQl1OCByZWdCd09wTW9kZTsKLQotCVJUX1RSQUNFKENPTVBfU1dCVywgIj09PnJ0bDgxOTJfU2V0QldNb2RlV29ya0l0ZW0oKSAgU3dpdGNoIHRvICVzIGJhbmR3aWR0aFxuIiwKLQkJCQkJcHJpdi0+Q3VycmVudENoYW5uZWxCVyA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwPyIyME1IeiI6IjQwTUh6IikKLQotCi0JaWYoIXByaXYtPnVwKQotCXsKLQkJcHJpdi0+U2V0QldNb2RlSW5Qcm9ncmVzcz0gZmFsc2U7Ci0JCXJldHVybjsKLQl9Ci0JLy88MT5TZXQgTUFDIHJlZ2lzdGVyCi0JcmVnQndPcE1vZGUgPSByZWFkX25pY19ieXRlKHByaXYsIEJXX09QTU9ERSk7Ci0KLQlzd2l0Y2gocHJpdi0+Q3VycmVudENoYW5uZWxCVykKLQl7Ci0JCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMDoKLQkJCXJlZ0J3T3BNb2RlIHw9IEJXX09QTU9ERV8yME1IWjsKLQkJICAgICAgIC8vIDIwMDcvMDIvMDcgTWFyayBieSBFbWlseSBiZWNhdXNlIHdlIGhhdmUgbm90IHZlcmlmeSB3aGV0aGVyIHRoaXMgcmVnaXN0ZXIgd29ya3MKLQkJCXdyaXRlX25pY19ieXRlKHByaXYsIEJXX09QTU9ERSwgcmVnQndPcE1vZGUpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBIVF9DSEFOTkVMX1dJRFRIXzIwXzQwOgotCQkJcmVnQndPcE1vZGUgJj0gfkJXX09QTU9ERV8yME1IWjsKLSAgICAgICAgCQkvLyAyMDA3LzAyLzA3IE1hcmsgYnkgRW1pbHkgYmVjYXVzZSB3ZSBoYXZlIG5vdCB2ZXJpZnkgd2hldGhlciB0aGlzIHJlZ2lzdGVyIHdvcmtzCi0JCQl3cml0ZV9uaWNfYnl0ZShwcml2LCBCV19PUE1PREUsIHJlZ0J3T3BNb2RlKTsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlSVF9UUkFDRShDT01QX0VSUiwgIlNldENoYW5uZWxCYW5kd2lkdGg4MTl4VXNiKCk6IHVua25vd24gQmFuZHdpZHRoOiAlI1hcbiIscHJpdi0+Q3VycmVudENoYW5uZWxCVyk7Ci0JCQlicmVhazsKLQl9Ci0KLQkvLzwyPlNldCBQSFkgcmVsYXRlZCByZWdpc3RlcgotCXN3aXRjaChwcml2LT5DdXJyZW50Q2hhbm5lbEJXKQotCXsKLQkJY2FzZSBIVF9DSEFOTkVMX1dJRFRIXzIwOgotCQkJLy8gQWRkIGJ5IFZpdmkgMjAwNzExMTkKLQkJCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgckZQR0EwX1JGTU9ELCBiUkZNT0QsIDB4MCk7Ci0JCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJGUEdBMV9SRk1PRCwgYlJGTU9ELCAweDApOwotLy8JCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjEsIDB4MDAxMDAwMDAsIDEpOwotCi0JCQkvLyBDb3JyZWN0IHRoZSB0eCBwb3dlciBmb3IgQ0NLIHJhdGUgaW4gMjBNLiBTdWdnZXN0IGJ5IFlOLCAyMDA3MTIwNwotLy8JCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCByQ0NLMF9UeEZpbHRlcjEsIDB4MWExYjAwMDApOwotLy8JCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCByQ0NLMF9UeEZpbHRlcjIsIDB4MDkwZTEzMTcpOwotLy8JCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCByQ0NLMF9EZWJ1Z1BvcnQsIDB4MDAwMDAyMDQpOwotCQkJaWYoIXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nKQotCQkJewotCQkJCXdyaXRlX25pY19kd29yZChwcml2LCByQ0NLMF9UeEZpbHRlcjEsIDB4MWExYjAwMDApOwotCQkJCXdyaXRlX25pY19kd29yZChwcml2LCByQ0NLMF9UeEZpbHRlcjIsIDB4MDkwZTEzMTcpOwotCQkJCXdyaXRlX25pY19kd29yZChwcml2LCByQ0NLMF9EZWJ1Z1BvcnQsIDB4MDAwMDAyMDQpOwotCQkJfQotCQkJZWxzZQotCQkJCUNDS19UeF9Qb3dlcl9UcmFja19CV19Td2l0Y2gocHJpdik7Ci0KLQkJCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjEsIDB4MDAxMDAwMDAsIDEpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSFRfQ0hBTk5FTF9XSURUSF8yMF80MDoKLQkJCS8vIEFkZCBieSBWaXZpIDIwMDcxMTE5Ci0JCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJGUEdBMF9SRk1PRCwgYlJGTU9ELCAweDEpOwotCQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCByRlBHQTFfUkZNT0QsIGJSRk1PRCwgMHgxKTsKLQkJCS8vcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX1N5c3RlbSwgYkNDS1NpZGVCYW5kLCAocHJpdi0+bkN1cjQwTWh6UHJpbWVTQz4+MSkpOwotICAgICAgICAgICAgICAgICAgICAvL3J0bDgxOTJfc2V0QkJyZWcoZGV2LCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyMSwgMHgwMDEwMDAwMCwgMCk7Ci0JCQkvL3J0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTFfTFNURiwgMHhDMDAsIHByaXYtPm5DdXI0ME1oelByaW1lU0MpOwotCi0JCQkvLyBDb3JyZWN0IHRoZSB0eCBwb3dlciBmb3IgQ0NLIHJhdGUgaW4gNDBNLiBTdWdnZXN0IGJ5IFlOLCAyMDA3MTIwNwotCQkJLy93cml0ZV9uaWNfZHdvcmQoZGV2LCByQ0NLMF9UeEZpbHRlcjEsIDB4MzUzNjAwMDApOwotCQkJLy93cml0ZV9uaWNfZHdvcmQoZGV2LCByQ0NLMF9UeEZpbHRlcjIsIDB4MTIxYzI1MmUpOwotCQkJLy93cml0ZV9uaWNfZHdvcmQoZGV2LCByQ0NLMF9EZWJ1Z1BvcnQsIDB4MDAwMDA0MDkpOwotCQkJaWYoIXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nKQotCQkJewotCQkJCXdyaXRlX25pY19kd29yZChwcml2LCByQ0NLMF9UeEZpbHRlcjEsIDB4MzUzNjAwMDApOwotCQkJCXdyaXRlX25pY19kd29yZChwcml2LCByQ0NLMF9UeEZpbHRlcjIsIDB4MTIxYzI1MmUpOwotCQkJCXdyaXRlX25pY19kd29yZChwcml2LCByQ0NLMF9EZWJ1Z1BvcnQsIDB4MDAwMDA0MDkpOwotCQkJfQotCQkJZWxzZQotCQkJCUNDS19UeF9Qb3dlcl9UcmFja19CV19Td2l0Y2gocHJpdik7Ci0KLQkJCS8vIFNldCBDb250cm9sIGNoYW5uZWwgdG8gdXBwZXIgb3IgbG93ZXIuIFRoZXNlIHNldHRpbmdzIGFyZSByZXF1aXJlZCBvbmx5IGZvciA0ME1IegotCQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCByQ0NLMF9TeXN0ZW0sIGJDQ0tTaWRlQmFuZCwgKHByaXYtPm5DdXI0ME1oelByaW1lU0M+PjEpKTsKLQkJCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgck9GRE0xX0xTVEYsIDB4QzAwLCBwcml2LT5uQ3VyNDBNaHpQcmltZVNDKTsKLQotCi0JCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXIxLCAweDAwMTAwMDAwLCAwKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJTZXRDaGFubmVsQmFuZHdpZHRoODE5eFVzYigpOiB1bmtub3duIEJhbmR3aWR0aDogJSNYXG4iICxwcml2LT5DdXJyZW50Q2hhbm5lbEJXKTsKLQkJCWJyZWFrOwotCi0JfQotCS8vU2tpcCBvdmVyIHNldHRpbmcgb2YgSi1tb2RlIGluIEJCIHJlZ2lzdGVyIGhlcmUuIERlZmF1bHQgdmFsdWUgaXMgIk5vbmUgSiBtb2RlIi4gRW1pbHkgMjAwNzAzMTUKLQotCS8vPDM+U2V0IFJGIHJlbGF0ZWQgcmVnaXN0ZXIKLQlQSFlfU2V0UkY4MjU2QmFuZHdpZHRoKHByaXYsIHByaXYtPkN1cnJlbnRDaGFubmVsQlcpOwotCi0JYXRvbWljX2RlYygmKHByaXYtPmllZWU4MDIxMS0+YXRtX3N3YncpKTsKLQlwcml2LT5TZXRCV01vZGVJblByb2dyZXNzPSBmYWxzZTsKLQotCVJUX1RSQUNFKENPTVBfU1dCVywgIjw9PVNldEJXTW9kZTgxOXhVc2IoKVxuIik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqZnVuY3Rpb246ICBUaGlzIGZ1bmN0aW9uIHNjaGVkdWxlcyBiYW5kd2lkdGggc3dpdGNoIHdvcmsuCi0gKiAgIGlucHV0OiAgc3RydWN0IG5ldF9kZXZpY2UgKmRldgotICogICAJICAgICBIVF9DSEFOTkVMX1dJRFRICUJhbmR3aWR0aCAgLy8yME0gb3IgNDBNCi0gKiAgIAkgICAgIEhUX0VYVENITkxfT0ZGU0VUIE9mZnNldCAJICAgLy9VcHBlciwgTG93ZXIsIG9yIERvbid0IGNhcmUKLSAqICBvdXRwdXQ6ICBub25lCi0gKiAgcmV0dXJuOiAgbm9uZQotICogICAgTm90ZTogIEkgZG91YnQgd2hldGhlciBTZXRCV01vZGVJblByb2dyZXNzIGZsYWcgaXMgbmVjZXNzYXJ5IGFzIHdlIGNhbgotICogICAgCSAgICAgdGVzdCB3aGV0aGVyIGN1cnJlbnQgd29yayBpbiB0aGUgcXVldWUgb3Igbm90Li8vZG8gST8KLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgcnRsODE5Ml9TZXRCV01vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIEhUX0NIQU5ORUxfV0lEVEggQmFuZHdpZHRoLCBIVF9FWFRDSE5MX09GRlNFVCBPZmZzZXQpCi17Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihpZWVlLT5kZXYpOwotCi0KLQlpZihwcml2LT5TZXRCV01vZGVJblByb2dyZXNzKQotCQlyZXR1cm47Ci0KLQkgYXRvbWljX2luYygmKHByaXYtPmllZWU4MDIxMS0+YXRtX3N3YncpKTsKLQlwcml2LT5TZXRCV01vZGVJblByb2dyZXNzPSB0cnVlOwotCi0JcHJpdi0+Q3VycmVudENoYW5uZWxCVyA9IEJhbmR3aWR0aDsKLQotCWlmKE9mZnNldD09SFRfRVhUQ0hOTF9PRkZTRVRfTE9XRVIpCi0JCXByaXYtPm5DdXI0ME1oelByaW1lU0MgPSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVI7Ci0JZWxzZSBpZihPZmZzZXQ9PUhUX0VYVENITkxfT0ZGU0VUX1VQUEVSKQotCQlwcml2LT5uQ3VyNDBNaHpQcmltZVNDID0gSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSOwotCWVsc2UKLQkJcHJpdi0+bkN1cjQwTWh6UHJpbWVTQyA9IEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkU7Ci0KLQkvL3F1ZXVlX3dvcmsocHJpdi0+cHJpdl93cSwgJihwcml2LT5TZXRCV01vZGVXb3JrSXRlbSkpOwotCS8vCXNjaGVkdWxlX3dvcmsoJihwcml2LT5TZXRCV01vZGVXb3JrSXRlbSkpOwotCXJ0bDgxOTJfU2V0QldNb2RlV29ya0l0ZW0ocHJpdik7Ci0KLX0KLQotCi12b2lkIEluaXRpYWxHYWluODE5eFBjaShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggT3BlcmF0aW9uKQotewotI2RlZmluZSBTQ0FOX1JYX0lOSVRJQUxfR0FJTgkweDE3Ci0jZGVmaW5lIFBPV0VSX0RFVEVDVElPTl9USAkweDA4Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihpZWVlLT5kZXYpOwotCXUzMgkJCQkJQml0TWFzazsKLQl1OAkJCQkJaW5pdGlhbF9nYWluOwotCi0JaWYocHJpdi0+dXApCi0JewotCQlzd2l0Y2goT3BlcmF0aW9uKQotCQl7Ci0JCQljYXNlIElHX0JhY2t1cDoKLQkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIklHX0JhY2t1cCwgYmFja3VwIHRoZSBpbml0aWFsIGdhaW4uXG4iKTsKLQkJCQlpbml0aWFsX2dhaW4gPSBTQ0FOX1JYX0lOSVRJQUxfR0FJTjsvL3BIYWxEYXRhLT5EZWZhdWx0SW5pdGlhbEdhaW5bMF07Ly8KLQkJCQlCaXRNYXNrID0gYk1hc2tCeXRlMDsKLQkJCQlpZihkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtID09IERJR19BTEdPX0JZX0ZBTFNFX0FMQVJNKQotCQkJCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIFVGV1AsIGJNYXNrQnl0ZTEsIDB4OCk7CS8vIEZXIERJRyBPRkYKLQkJCQlwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGFhZ2Njb3JlMSA9ICh1OClydGw4MTkyX1F1ZXJ5QkJSZWcocHJpdiwgck9GRE0wX1hBQUdDQ29yZTEsIEJpdE1hc2spOwotCQkJCXByaXYtPmluaXRnYWluX2JhY2t1cC54YmFnY2NvcmUxID0gKHU4KXJ0bDgxOTJfUXVlcnlCQlJlZyhwcml2LCByT0ZETTBfWEJBR0NDb3JlMSwgQml0TWFzayk7Ci0JCQkJcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhjYWdjY29yZTEgPSAodTgpcnRsODE5Ml9RdWVyeUJCUmVnKHByaXYsIHJPRkRNMF9YQ0FHQ0NvcmUxLCBCaXRNYXNrKTsKLQkJCQlwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGRhZ2Njb3JlMSA9ICh1OClydGw4MTkyX1F1ZXJ5QkJSZWcocHJpdiwgck9GRE0wX1hEQUdDQ29yZTEsIEJpdE1hc2spOwotCQkJCUJpdE1hc2sgID0gYk1hc2tCeXRlMjsKLQkJCQlwcml2LT5pbml0Z2Fpbl9iYWNrdXAuY2NhID0gKHU4KXJ0bDgxOTJfUXVlcnlCQlJlZyhwcml2LCByQ0NLMF9DQ0EsIEJpdE1hc2spOwotCi0JCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEluaXRpYWxHYWluQmFja3VwIDB4YzUwIGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54YWFnY2NvcmUxKTsKLQkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIlNjYW4gSW5pdGlhbEdhaW5CYWNrdXAgMHhjNTggaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLnhiYWdjY29yZTEpOwotCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBJbml0aWFsR2FpbkJhY2t1cCAweGM2MCBpcyAleFxuIixwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGNhZ2Njb3JlMSk7Ci0JCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEluaXRpYWxHYWluQmFja3VwIDB4YzY4IGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54ZGFnY2NvcmUxKTsKLQkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIlNjYW4gSW5pdGlhbEdhaW5CYWNrdXAgMHhhMGEgaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLmNjYSk7Ci0KLQkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIldyaXRlIHNjYW4gaW5pdGlhbCBnYWluID0gMHgleCBcbiIsIGluaXRpYWxfZ2Fpbik7Ci0JCQkJd3JpdGVfbmljX2J5dGUocHJpdiwgck9GRE0wX1hBQUdDQ29yZTEsIGluaXRpYWxfZ2Fpbik7Ci0JCQkJd3JpdGVfbmljX2J5dGUocHJpdiwgck9GRE0wX1hCQUdDQ29yZTEsIGluaXRpYWxfZ2Fpbik7Ci0JCQkJd3JpdGVfbmljX2J5dGUocHJpdiwgck9GRE0wX1hDQUdDQ29yZTEsIGluaXRpYWxfZ2Fpbik7Ci0JCQkJd3JpdGVfbmljX2J5dGUocHJpdiwgck9GRE0wX1hEQUdDQ29yZTEsIGluaXRpYWxfZ2Fpbik7Ci0JCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiV3JpdGUgc2NhbiAweGEwYSA9IDB4JXggXG4iLCBQT1dFUl9ERVRFQ1RJT05fVEgpOwotCQkJCXdyaXRlX25pY19ieXRlKHByaXYsIDB4YTBhLCBQT1dFUl9ERVRFQ1RJT05fVEgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJR19SZXN0b3JlOgotCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiSUdfUmVzdG9yZSwgcmVzdG9yZSB0aGUgaW5pdGlhbCBnYWluLlxuIik7Ci0JCQkJQml0TWFzayA9IDB4N2Y7IC8vQml0MH4gQml0NgotCQkJCWlmKGRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG0gPT0gRElHX0FMR09fQllfRkFMU0VfQUxBUk0pCi0JCQkJCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgVUZXUCwgYk1hc2tCeXRlMSwgMHg4KTsJLy8gRlcgRElHIE9GRgotCi0JCQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCByT0ZETTBfWEFBR0NDb3JlMSwgQml0TWFzaywgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGFhZ2Njb3JlMSk7Ci0JCQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCByT0ZETTBfWEJBR0NDb3JlMSwgQml0TWFzaywgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGJhZ2Njb3JlMSk7Ci0JCQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCByT0ZETTBfWENBR0NDb3JlMSwgQml0TWFzaywgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGNhZ2Njb3JlMSk7Ci0JCQkJcnRsODE5Ml9zZXRCQnJlZyhwcml2LCByT0ZETTBfWERBR0NDb3JlMSwgQml0TWFzaywgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGRhZ2Njb3JlMSk7Ci0JCQkJQml0TWFzayAgPSBiTWFza0J5dGUyOwotCQkJCXJ0bDgxOTJfc2V0QkJyZWcocHJpdiwgckNDSzBfQ0NBLCBCaXRNYXNrLCAodTMyKXByaXYtPmluaXRnYWluX2JhY2t1cC5jY2EpOwotCi0JCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEJCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzUwIGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54YWFnY2NvcmUxKTsKLQkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIlNjYW4gQkJJbml0aWFsR2FpblJlc3RvcmUgMHhjNTggaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLnhiYWdjY29yZTEpOwotCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBCQkluaXRpYWxHYWluUmVzdG9yZSAweGM2MCBpcyAleFxuIixwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGNhZ2Njb3JlMSk7Ci0JCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEJCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzY4IGlzICV4XG4iLHByaXYtPmluaXRnYWluX2JhY2t1cC54ZGFnY2NvcmUxKTsKLQkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIlNjYW4gQkJJbml0aWFsR2FpblJlc3RvcmUgMHhhMGEgaXMgJXhcbiIscHJpdi0+aW5pdGdhaW5fYmFja3VwLmNjYSk7Ci0KLQkJCQlydGw4MTkyX3BoeV9zZXRUeFBvd2VyKHByaXYsIHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOwotCi0KLQkJCQlpZihkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtID09IERJR19BTEdPX0JZX0ZBTFNFX0FMQVJNKQotCQkJCQlydGw4MTkyX3NldEJCcmVnKHByaXYsIFVGV1AsIGJNYXNrQnl0ZTEsIDB4MSk7CS8vIEZXIERJRyBPTgotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCVJUX1RSQUNFKENPTVBfU0NBTiwgIlVua25vd24gSUcgT3BlcmF0aW9uLlxuIik7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5eEVfcGh5LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcjgxOXhFX3BoeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTZlNzZmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9yODE5eEVfcGh5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotI2lmbmRlZiBfUjgxOVhVX1BIWV9ICi0jZGVmaW5lIF9SODE5WFVfUEhZX0gKLQotLyogQ2hhbm5lbCBzd2l0Y2g6IHRoZSBzaXplIG9mIGNvbW1hbmQgdGFibGVzIGZvciBzd2l0Y2ggY2hhbm5lbCAqLwotI2RlZmluZSBNQVhfUFJFQ01EX0NOVCAxNgotI2RlZmluZSBNQVhfUkZERVBFTkRDTURfQ05UIDE2Ci0jZGVmaW5lIE1BWF9QT1NUQ01EX0NOVCAxNgotCi0jZGVmaW5lIE1BQ1BIWV9BcnJheV9QR0xlbmd0aCAzMAotI2RlZmluZSBSdGw4MTlYTUFDUEhZX0FycmF5X1BHIFJ0bDgxOTJQY2lFTUFDUEhZX0FycmF5X1BHCi0jZGVmaW5lIFJ0bDgxOVhNQUNQSFlfQXJyYXkgUnRsODE5MlBjaUVNQUNQSFlfQXJyYXkKLSNkZWZpbmUgUmFkaW9DX0FycmF5TGVuZ3RoIDEKLSNkZWZpbmUgUmFkaW9EX0FycmF5TGVuZ3RoIDEKLSNkZWZpbmUgUnRsODE5WFJhZGlvQV9BcnJheSBSdGw4MTkyUGNpRVJhZGlvQV9BcnJheQotI2RlZmluZSBSdGw4MTlYUmFkaW9CX0FycmF5IFJ0bDgxOTJQY2lFUmFkaW9CX0FycmF5Ci0jZGVmaW5lIFJ0bDgxOVhSYWRpb0NfQXJyYXkgUnRsODE5MlBjaUVSYWRpb0NfQXJyYXkKLSNkZWZpbmUgUnRsODE5WFJhZGlvRF9BcnJheSBSdGw4MTkyUGNpRVJhZGlvRF9BcnJheQotI2RlZmluZSBSdGw4MTlYQUdDVEFCX0FycmF5IFJ0bDgxOTJQY2lFQUdDVEFCX0FycmF5Ci0jZGVmaW5lIFBIWV9SRUdBcnJheUxlbmd0aCAxCi0jZGVmaW5lIFJ0bDgxOVhQSFlfUkVHQXJyYXkgUnRsODE5MlBjaUVQSFlfUkVHQXJyYXkKLSNkZWZpbmUgUEhZX1JFR18xVDJSQXJyYXlMZW5ndGggMjk2Ci0jZGVmaW5lIFJ0bDgxOVhQSFlfUkVHXzFUMlJBcnJheSBSdGw4MTkyUGNpRVBIWV9SRUdfMVQyUkFycmF5Ci0KLSNkZWZpbmUgQUdDVEFCX0FycmF5TGVuZ3RoIDM4NAotI2RlZmluZSBNQUNQSFlfQXJyYXlMZW5ndGggMTgKLQotI2RlZmluZSBSYWRpb0FfQXJyYXlMZW5ndGggMjQ2Ci0jZGVmaW5lIFJhZGlvQl9BcnJheUxlbmd0aCA3OAotCi0KLXR5cGVkZWYgZW51bSBfU3dDaG5sQ21kSUQgewotCUNtZElEX0VuZCwKLQlDbWRJRF9TZXRUeFBvd2VyTGV2ZWwsCi0JQ21kSURfQkJSZWdXcml0ZTEwLAotCUNtZElEX1dyaXRlUG9ydFVsb25nLAotCUNtZElEX1dyaXRlUG9ydFVzaG9ydCwKLQlDbWRJRF9Xcml0ZVBvcnRVY2hhciwKLQlDbWRJRF9SRl9Xcml0ZVJlZywKLX0gU3dDaG5sQ21kSUQ7Ci0KLS8qIHN3aXRjaCBjaGFubmVsIGRhdGEgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdCBfU3dDaG5sQ21kIHsKLQlTd0NobmxDbWRJRCBDbWRJRDsKLQl1MzIgUGFyYTE7Ci0JdTMyIFBhcmEyOwotCXUzMiBtc0RlbGF5OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgU3dDaG5sQ21kOwotCi1leHRlcm4gdTMyIHJ0bDgxOVhNQUNQSFlfQXJyYXlfUEdbXTsKLWV4dGVybiB1MzIgcnRsODE5WFBIWV9SRUdfMVQyUkFycmF5W107Ci1leHRlcm4gdTMyIHJ0bDgxOVhBR0NUQUJfQXJyYXlbXTsKLWV4dGVybiB1MzIgcnRsODE5WFJhZGlvQV9BcnJheVtdOwotZXh0ZXJuIHUzMiBydGw4MTlYUmFkaW9CX0FycmF5W107Ci1leHRlcm4gdTMyIHJ0bDgxOVhSYWRpb0NfQXJyYXlbXTsKLWV4dGVybiB1MzIgcnRsODE5WFJhZGlvRF9BcnJheVtdOwotCi10eXBlZGVmIGVudW0gX0hXOTBfQkxPQ0sgewotCUhXOTBfQkxPQ0tfTUFDID0gMCwKLQlIVzkwX0JMT0NLX1BIWTAgPSAxLAotCUhXOTBfQkxPQ0tfUEhZMSA9IDIsCi0JSFc5MF9CTE9DS19SRiA9IDMsCi0JLyogRG9uJ3QgZXZlciB1c2UgdGhpcy4gKi8KLQlIVzkwX0JMT0NLX01BWElNVU0gPSA0LAotfSBIVzkwX0JMT0NLX0UsICpQSFc5MF9CTE9DS19FOwotCi10eXBlZGVmIGVudW0gX1JGOTBfUkFESU9fUEFUSCB7Ci0JLyogUmFkaW8gcGF0aHMgKi8KLQlSRjkwX1BBVEhfQSA9IDAsCi0JUkY5MF9QQVRIX0IgPSAxLAotCVJGOTBfUEFUSF9DID0gMiwKLQlSRjkwX1BBVEhfRCA9IDMsCi0KLQkvKiBNYXggUkYgbnVtYmVyIDkyIHN1cHBvcnQgKi8KLQlSRjkwX1BBVEhfTUFYCi19IFJGOTBfUkFESU9fUEFUSF9FLCAqUFJGOTBfUkFESU9fUEFUSF9FOwotCi0jZGVmaW5lIGJNYXNrQnl0ZTAgMHhmZgotI2RlZmluZSBiTWFza0J5dGUxIDB4ZmYwMAotI2RlZmluZSBiTWFza0J5dGUyIDB4ZmYwMDAwCi0jZGVmaW5lIGJNYXNrQnl0ZTMgMHhmZjAwMDAwMAotI2RlZmluZSBiTWFza0hXb3JkIDB4ZmZmZjAwMDAKLSNkZWZpbmUgYk1hc2tMV29yZCAweDAwMDBmZmZmCi0jZGVmaW5lIGJNYXNrRFdvcmQgMHhmZmZmZmZmZgotCi11OCBydGw4MTkyX3BoeV9DaGVja0lzTGVnYWxSRlBhdGgoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHUzMiBlUkZQYXRoKTsKLQotdm9pZCBydGw4MTkyX3NldEJCcmVnKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCB1MzIgZHdSZWdBZGRyLAotCQkJICAgICB1MzIgZHdCaXRNYXNrLCB1MzIgZHdEYXRhKTsKLQotdTMyIHJ0bDgxOTJfUXVlcnlCQlJlZyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgdTMyIGR3UmVnQWRkciwKLQkJCSAgICAgdTMyIGR3Qml0TWFzayk7Ci0KLXZvaWQgcnRsODE5Ml9waHlfU2V0UkZSZWcoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsCi0JCVJGOTBfUkFESU9fUEFUSF9FIGVSRlBhdGgsIHUzMiBSZWdBZGRyLAotCQl1MzIgQml0TWFzaywgdTMyIERhdGEpOwotCi11MzIgcnRsODE5Ml9waHlfUXVlcnlSRlJlZyhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwKLQkJUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCwgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrKTsKLQotdm9pZCBydGw4MTkyX3BoeV9jb25maWdtYWMoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOwotCi12b2lkIHJ0bDgxOTJfcGh5Q29uZmlnQkIoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHU4IENvbmZpZ1R5cGUpOwotCi1SVF9TVEFUVVMgcnRsODE5Ml9waHlfY2hlY2tCQkFuZFJGKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LAotCQlIVzkwX0JMT0NLX0UgQ2hlY2tCbG9jaywgUkY5MF9SQURJT19QQVRIX0UgZVJGUGF0aCk7Ci0KLVJUX1NUQVRVUyBydGw4MTkyX0JCQ29uZmlnKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKLQotdm9pZCBydGw4MTkyX3BoeV9nZXRUeFBvd2VyKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKLQotdm9pZCBydGw4MTkyX3BoeV9zZXRUeFBvd2VyKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCB1OCBjaGFubmVsKTsKLQotUlRfU1RBVFVTIHJ0bDgxOTJfcGh5X1JGQ29uZmlnKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKLQotdm9pZCBydGw4MTkyX3BoeV91cGRhdGVJbml0R2FpbihzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7Ci0KLXU4IHJ0bDgxOTJfcGh5X0NvbmZpZ1JGV2l0aEhlYWRlckZpbGUoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsCi0JCQkJCVJGOTBfUkFESU9fUEFUSF9FIGVSRlBhdGgpOwotCi11OCBydGw4MTkyX3BoeV9Td0Nobmwoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU4MDIxMSwgdTggY2hhbm5lbCk7Ci0KLXZvaWQgcnRsODE5Ml9TZXRCV01vZGUoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWU4MDIxMSwKLQkJSFRfQ0hBTk5FTF9XSURUSCBCYW5kd2lkdGgsIEhUX0VYVENITkxfT0ZGU0VUIE9mZnNldCk7Ci0KLXZvaWQgcnRsODE5Ml9Td0NobmxfV29ya0l0ZW0oc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOwotCi12b2lkIHJ0bDgxOTJfU2V0QldNb2RlV29ya0l0ZW0oc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOwotCi12b2lkIEluaXRpYWxHYWluODE5eFBjaShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggT3BlcmF0aW9uKTsKLQotI2VuZGlmIC8qIF9SODE5WFVfUEhZX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTl4X0JBLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9CQS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxM2UxNGMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9CQS5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9CQVRZUEVfSF8KKyNkZWZpbmUgX0JBVFlQRV9IXworCisjZGVmaW5lCQlUT1RBTF9UWEJBX05VTQkxNgorI2RlZmluZQlUT1RBTF9SWEJBX05VTQkxNgorCisjZGVmaW5lCUJBX1NFVFVQX1RJTUVPVVQJMjAwCisjZGVmaW5lCUJBX0lOQUNUX1RJTUVPVVQJNjAwMDAKKworI2RlZmluZQlCQV9QT0xJQ1lfREVMQVlFRAkJMAorI2RlZmluZQlCQV9QT0xJQ1lfSU1NRURJQVRFCTEKKworI2RlZmluZQlBRERCQV9TVEFUVVNfU1VDQ0VTUwkJCTAKKyNkZWZpbmUJQUREQkFfU1RBVFVTX1JFRlVTRUQJCTM3CisjZGVmaW5lCUFEREJBX1NUQVRVU19JTlZBTElEX1BBUkFNCTM4CisKKyNkZWZpbmUJREVMQkFfUkVBU09OX1FTVEFfTEVBVklORwkzNgorI2RlZmluZQlERUxCQV9SRUFTT05fRU5EX0JBCQkJMzcKKyNkZWZpbmUJREVMQkFfUkVBU09OX1VOS05PV05fQkEJMzgKKyNkZWZpbmUJREVMQkFfUkVBU09OX1RJTUVPVVQJCQkzOQordW5pb24gc2VxdWVuY2VfY29udHJvbCB7CisJdTE2IFNob3J0RGF0YTsKKwlzdHJ1Y3QgeworCQl1MTYJRnJhZ051bTo0OworCQl1MTYJU2VxTnVtOjEyOworCX0gZmllbGQ7Cit9OworCit1bmlvbiBiYV9wYXJhbV9zZXQgeworCXU4IGNoYXJEYXRhWzJdOworCXUxNiBzaG9ydERhdGE7CisJc3RydWN0IHsKKwkJdTE2IEFNU0RVX1N1cHBvcnQ6MTsKKwkJdTE2IEJBUG9saWN5OjE7CisJCXUxNiBUSUQ6NDsKKwkJdTE2IEJ1ZmZlclNpemU6MTA7CisJfSBmaWVsZDsKK307CisKK3VuaW9uIGRlbGJhX3BhcmFtX3NldCB7CisJdTggY2hhckRhdGFbMl07CisJdTE2IHNob3J0RGF0YTsKKwlzdHJ1Y3QgeworCQl1MTYgUmVzZXJ2ZWQ6MTE7CisJCXUxNiBJbml0aWF0b3I6MTsKKwkJdTE2IFRJRDo0OworCX0gZmllbGQ7Cit9OworCitzdHJ1Y3QgYmFfcmVjb3JkIHsKKwlzdHJ1Y3QgdGltZXJfbGlzdAkJVGltZXI7CisJdTgJCQkJYlZhbGlkOworCXU4CQkJCURpYWxvZ1Rva2VuOworCXVuaW9uIGJhX3BhcmFtX3NldCBCYVBhcmFtU2V0OworCXUxNgkJCQlCYVRpbWVvdXRWYWx1ZTsKKwl1bmlvbiBzZXF1ZW5jZV9jb250cm9sIEJhU3RhcnRTZXFDdHJsOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9CQVByb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTl4X0JBUHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOWQ4NWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9CQVByb2MuYwpAQCAtMCwwICsxLDU2NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJydGxsaWIuaCIKKyNpbmNsdWRlICJydGw4MTl4X0JBLmgiCisjaW5jbHVkZSAicnRsX2NvcmUuaCIKKworc3RhdGljIHZvaWQgQWN0aXZhdGVCQUVudHJ5KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3QgYmFfcmVjb3JkICpwQkEsCisJCQkgICAgdTE2IFRpbWUpCit7CisJcEJBLT5iVmFsaWQgPSB0cnVlOworCWlmIChUaW1lICE9IDApCisJCW1vZF90aW1lcigmcEJBLT5UaW1lciwgamlmZmllcyArIE1TRUNTKFRpbWUpKTsKK30KKworc3RhdGljIHZvaWQgRGVBY3RpdmF0ZUJBRW50cnkoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBiYV9yZWNvcmQgKnBCQSkKK3sKKwlwQkEtPmJWYWxpZCA9IGZhbHNlOworCWRlbF90aW1lcl9zeW5jKCZwQkEtPlRpbWVyKTsKK30KKworc3RhdGljIHU4IFR4VHNEZWxldGVCQShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHR4X3RzX3JlY29yZCAqcFR4VHMpCit7CisJc3RydWN0IGJhX3JlY29yZCAqcEFkbWl0dGVkQmEgPSAmcFR4VHMtPlR4QWRtaXR0ZWRCQVJlY29yZDsKKwlzdHJ1Y3QgYmFfcmVjb3JkICpwUGVuZGluZ0JhID0gJnBUeFRzLT5UeFBlbmRpbmdCQVJlY29yZDsKKwl1OCBiU2VuZERFTEJBID0gZmFsc2U7CisKKwlpZiAocFBlbmRpbmdCYS0+YlZhbGlkKSB7CisJCURlQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBQZW5kaW5nQmEpOworCQliU2VuZERFTEJBID0gdHJ1ZTsKKwl9CisKKwlpZiAocEFkbWl0dGVkQmEtPmJWYWxpZCkgeworCQlEZUFjdGl2YXRlQkFFbnRyeShpZWVlLCBwQWRtaXR0ZWRCYSk7CisJCWJTZW5kREVMQkEgPSB0cnVlOworCX0KKwlyZXR1cm4gYlNlbmRERUxCQTsKK30KKworc3RhdGljIHU4IFJ4VHNEZWxldGVCQShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHJ4X3RzX3JlY29yZCAqcFJ4VHMpCit7CisJc3RydWN0IGJhX3JlY29yZCAqcEJhID0gJnBSeFRzLT5SeEFkbWl0dGVkQkFSZWNvcmQ7CisJdTgJCQliU2VuZERFTEJBID0gZmFsc2U7CisKKwlpZiAocEJhLT5iVmFsaWQpIHsKKwkJRGVBY3RpdmF0ZUJBRW50cnkoaWVlZSwgcEJhKTsKKwkJYlNlbmRERUxCQSA9IHRydWU7CisJfQorCisJcmV0dXJuIGJTZW5kREVMQkE7Cit9CisKK3ZvaWQgUmVzZXRCYUVudHJ5KHN0cnVjdCBiYV9yZWNvcmQgKnBCQSkKK3sKKwlwQkEtPmJWYWxpZAkJCT0gZmFsc2U7CisJcEJBLT5CYVBhcmFtU2V0LnNob3J0RGF0YQk9IDA7CisJcEJBLT5CYVRpbWVvdXRWYWx1ZQkJPSAwOworCXBCQS0+RGlhbG9nVG9rZW4JCT0gMDsKKwlwQkEtPkJhU3RhcnRTZXFDdHJsLlNob3J0RGF0YQk9IDA7Cit9CitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnJ0bGxpYl9BRERCQShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggKkRzdCwKKwkJCQkgICAgc3RydWN0IGJhX3JlY29yZCAqcEJBLAorCQkJCSAgICB1MTYgU3RhdHVzQ29kZSwgdTggdHlwZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwkgc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgKkJBUmVxID0gTlVMTDsKKwl1OCAqdGFnID0gTlVMTDsKKwl1MTYgdG1wID0gMDsKKwl1MTYgbGVuID0gaWVlZS0+dHhfaGVhZHJvb20gKyA5OworCisJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9UUkFDRSB8IFJUTExJQl9ETF9CQSwgIj09PT09PT09PiVzKCksIGZyYW1lKCVkKSIKKwkJICAgICAiIHNlbnRkIHRvOiAlcE0sIGllZWUtPmRldjolcFxuIiwgX19mdW5jX18sCisJCSAgICAgdHlwZSwgRHN0LCBpZWVlLT5kZXYpOworCWlmIChwQkEgPT0gTlVMTCkgeworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgInBCQSBpcyBOVUxMXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgc2l6ZW9mKHN0cnVjdCBydGxsaWJfaGRyXzNhZGRyKSk7CisJaWYgKHNrYiA9PSBOVUxMKSB7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiY2FuJ3QgYWxsb2Mgc2tiIGZvciBBRERCQV9SRVFcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwltZW1zZXQoc2tiLT5kYXRhLCAwLCBzaXplb2Yoc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIpKTsKKworCXNrYl9yZXNlcnZlKHNrYiwgaWVlZS0+dHhfaGVhZHJvb20pOworCisJQkFSZXEgPSAoc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgKilza2JfcHV0KHNrYiwKKwkJIHNpemVvZihzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkcikpOworCisJbWVtY3B5KEJBUmVxLT5hZGRyMSwgRHN0LCBFVEhfQUxFTik7CisJbWVtY3B5KEJBUmVxLT5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCisJbWVtY3B5KEJBUmVxLT5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisJQkFSZXEtPmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KFJUTExJQl9TVFlQRV9NQU5BR0VfQUNUKTsKKworCXRhZyA9ICh1OCAqKXNrYl9wdXQoc2tiLCA5KTsKKwkqdGFnICsrPSBBQ1RfQ0FUX0JBOworCSp0YWcgKys9IHR5cGU7CisJKnRhZyArKz0gcEJBLT5EaWFsb2dUb2tlbjsKKworCWlmIChBQ1RfQUREQkFSU1AgPT0gdHlwZSkgeworCQlSVF9UUkFDRShDT01QX0RCRywgIj09PT0+dG8gc2VuZCBBRERCQVJTUFxuIik7CisJCXRtcCA9IGNwdV90b19sZTE2KFN0YXR1c0NvZGUpOworCQltZW1jcHkodGFnLCAodTggKikmdG1wLCAyKTsKKwkJdGFnICs9IDI7CisJfQorCXRtcCA9IGNwdV90b19sZTE2KHBCQS0+QmFQYXJhbVNldC5zaG9ydERhdGEpOworCW1lbWNweSh0YWcsICh1OCAqKSZ0bXAsIDIpOworCXRhZyArPSAyOworCXRtcCA9IGNwdV90b19sZTE2KHBCQS0+QmFUaW1lb3V0VmFsdWUpOworCW1lbWNweSh0YWcsICh1OCAqKSZ0bXAsIDIpOworCXRhZyArPSAyOworCisJaWYgKEFDVF9BRERCQVJFUSA9PSB0eXBlKSB7CisJCW1lbWNweSh0YWcsICh1OCAqKSYocEJBLT5CYVN0YXJ0U2VxQ3RybCksIDIpOworCQl0YWcgKz0gMjsKKwl9CisKKwlSVExMSUJfREVCVUdfREFUQShSVExMSUJfRExfREFUQXxSVExMSUJfRExfQkEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqcnRsbGliX0RFTEJBKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCAqZHN0LAorCQkJCSAgICBzdHJ1Y3QgYmFfcmVjb3JkICpwQkEsCisJCQkJICAgIGVudW0gdHJfc2VsZWN0IFR4UnhTZWxlY3QsIHUxNiBSZWFzb25Db2RlKQoreworCXVuaW9uIGRlbGJhX3BhcmFtX3NldCBEZWxiYVBhcmFtU2V0OworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCSBzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkciAqRGVsYmEgPSBOVUxMOworCXU4ICp0YWcgPSBOVUxMOworCXUxNiB0bXAgPSAwOworCXUxNiBsZW4gPSA2ICsgaWVlZS0+dHhfaGVhZHJvb207CisKKwlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX1RSQUNFIHwgUlRMTElCX0RMX0JBLAorCQkJICAgICAiPT09PT09PT0+JXMoKSwgUmVhc29uIgorCQkJICAgICAiQ29kZSglZCkgc2VudGQgdG86ICVwTVxuIiwgX19mdW5jX18sCisJCQkgICAgIFJlYXNvbkNvZGUsIGRzdCk7CisKKwltZW1zZXQoJkRlbGJhUGFyYW1TZXQsIDAsIDIpOworCisJRGVsYmFQYXJhbVNldC5maWVsZC5Jbml0aWF0b3IgPSAoVHhSeFNlbGVjdCA9PSBUWF9ESVIpID8gMSA6IDA7CisJRGVsYmFQYXJhbVNldC5maWVsZC5USUQJPSBwQkEtPkJhUGFyYW1TZXQuZmllbGQuVElEOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4gKyBzaXplb2Yoc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIpKTsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICJjYW4ndCBhbGxvYyBza2IgZm9yIEFEREJBX1JFUVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXNrYl9yZXNlcnZlKHNrYiwgaWVlZS0+dHhfaGVhZHJvb20pOworCisJRGVsYmEgPSAoc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgKikgc2tiX3B1dChza2IsCisJCSBzaXplb2Yoc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIpKTsKKworCW1lbWNweShEZWxiYS0+YWRkcjEsIGRzdCwgRVRIX0FMRU4pOworCW1lbWNweShEZWxiYS0+YWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoRGVsYmEtPmFkZHIzLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKwlEZWxiYS0+ZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoUlRMTElCX1NUWVBFX01BTkFHRV9BQ1QpOworCisJdGFnID0gKHU4ICopc2tiX3B1dChza2IsIDYpOworCisJKnRhZyArKz0gQUNUX0NBVF9CQTsKKwkqdGFnICsrPSBBQ1RfREVMQkE7CisKKwl0bXAgPSBjcHVfdG9fbGUxNihEZWxiYVBhcmFtU2V0LnNob3J0RGF0YSk7CisJbWVtY3B5KHRhZywgKHU4ICopJnRtcCwgMik7CisJdGFnICs9IDI7CisJdG1wID0gY3B1X3RvX2xlMTYoUmVhc29uQ29kZSk7CisJbWVtY3B5KHRhZywgKHU4ICopJnRtcCwgMik7CisJdGFnICs9IDI7CisKKwlSVExMSUJfREVCVUdfREFUQShSVExMSUJfRExfREFUQXxSVExMSUJfRExfQkEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfVFJBQ0UgfCBSVExMSUJfRExfQkEsICI8PT09PT0lcygpXG4iLAorCQkJICAgICBfX2Z1bmNfXyk7CisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIHZvaWQgcnRsbGliX3NlbmRfQUREQkFSZXEoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHU4ICpkc3QsCisJCQkJIHN0cnVjdCBiYV9yZWNvcmQgKnBCQSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlza2IgPSBydGxsaWJfQUREQkEoaWVlZSwgZHN0LCBwQkEsIDAsIEFDVF9BRERCQVJFUSk7CisKKwlpZiAoc2tiKSB7CisJCVJUX1RSQUNFKENPTVBfREJHLCAiPT09PT50byBzZW5kIEFEREJBUkVRISEhISFcbiIpOworCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworCX0gZWxzZSB7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiYWxsb2Mgc2tiIGVycm9yIGluIGZ1bmN0aW9uIgorCQkJICAgICAiICVzKClcbiIsIF9fZnVuY19fKTsKKwl9CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBydGxsaWJfc2VuZF9BRERCQVJzcChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggKmRzdCwKKwkJCQkgc3RydWN0IGJhX3JlY29yZCAqcEJBLCB1MTYgU3RhdHVzQ29kZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlza2IgPSBydGxsaWJfQUREQkEoaWVlZSwgZHN0LCBwQkEsIFN0YXR1c0NvZGUsIEFDVF9BRERCQVJTUCk7CisJaWYgKHNrYikKKwkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKwllbHNlCisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiYWxsb2Mgc2tiIGVycm9yIGluIGZ1bmN0aW9uIgorCQkJICAgICAiICVzKClcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHJ0bGxpYl9zZW5kX0RFTEJBKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCAqZHN0LAorCQkJICAgICAgc3RydWN0IGJhX3JlY29yZCAqcEJBLCBlbnVtIHRyX3NlbGVjdCBUeFJ4U2VsZWN0LAorCQkJICAgICAgdTE2IFJlYXNvbkNvZGUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJc2tiID0gcnRsbGliX0RFTEJBKGllZWUsIGRzdCwgcEJBLCBUeFJ4U2VsZWN0LCBSZWFzb25Db2RlKTsKKwlpZiAoc2tiKQorCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOworCWVsc2UKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICJhbGxvYyBza2IgZXJyb3IgaW4gZnVuYyIKKwkJCSAgICAgInRpb24gJXMoKVxuIiwgX19mdW5jX18pOworCXJldHVybiA7Cit9CisKK2ludCBydGxsaWJfcnhfQUREQkFSZXEoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgKnJlcSA9IE5VTEw7CisJdTE2IHJjID0gMDsKKwl1OCAqZHN0ID0gTlVMTCwgKnBEaWFsb2dUb2tlbiA9IE5VTEwsICp0YWcgPSBOVUxMOworCXN0cnVjdCBiYV9yZWNvcmQgKnBCQSA9IE5VTEw7CisJdW5pb24gYmFfcGFyYW1fc2V0ICpwQmFQYXJhbVNldCA9IE5VTEw7CisJdTE2ICpwQmFUaW1lb3V0VmFsID0gTlVMTDsKKwl1bmlvbiBzZXF1ZW5jZV9jb250cm9sICpwQmFTdGFydFNlcUN0cmwgPSBOVUxMOworCXN0cnVjdCByeF90c19yZWNvcmQgKnBUUyA9IE5VTEw7CisKKwlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIpICsgOSkgeworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgIiBJbnZhbGlkIHNrYiBsZW4gaW4gQkFSRVEoJWQgLyAiCisJCQkgICAgICIlZClcbiIsIChpbnQpc2tiLT5sZW4sCisJCQkgICAgIChpbnQpKHNpemVvZihzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkcikgKyA5KSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlSVExMSUJfREVCVUdfREFUQShSVExMSUJfRExfREFUQXxSVExMSUJfRExfQkEsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCisJcmVxID0gKHN0cnVjdCBydGxsaWJfaGRyXzNhZGRyICopIHNrYi0+ZGF0YTsKKwl0YWcgPSAodTggKilyZXE7CisJZHN0ID0gKHU4ICopKCZyZXEtPmFkZHIyWzBdKTsKKwl0YWcgKz0gc2l6ZW9mKHN0cnVjdCBydGxsaWJfaGRyXzNhZGRyKTsKKwlwRGlhbG9nVG9rZW4gPSB0YWcgKyAyOworCXBCYVBhcmFtU2V0ID0gKHVuaW9uIGJhX3BhcmFtX3NldCAqKSh0YWcgKyAzKTsKKwlwQmFUaW1lb3V0VmFsID0gKHUxNiAqKSh0YWcgKyA1KTsKKwlwQmFTdGFydFNlcUN0cmwgPSAodW5pb24gc2VxdWVuY2VfY29udHJvbCAqKShyZXEgKyA3KTsKKworCVJUX1RSQUNFKENPTVBfREJHLCAiPT09PT5yeCBBRERCQVJFUSBmcm9tIDogJXBNXG4iLCBkc3QpOworCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlID09IDAgIHx8CisJICAgIChpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9PSBmYWxzZSkgfHwKKwkgICAgKGllZWUtPnBIVEluZm8tPklPVEFjdGlvbiAmIEhUX0lPVF9BQ1RfUkVKRUNUX0FEREJBX1JFUSkpIHsKKwkJcmMgPSBBRERCQV9TVEFUVVNfUkVGVVNFRDsKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICJGYWlsZWQgdG8gcmVwbHkgb24gQUREQkFfUkVRIGFzICIKKwkJCSAgICAgInNvbWUgY2FwYWJpbGl0eSBpcyBub3QgcmVhZHkoJWQsICVkKVxuIiwKKwkJCSAgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSwKKwkJCSAgICAgaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQpOworCQlnb3RvIE9uQUREQkFSZXFfRmFpbDsKKwl9CisJaWYgKCFHZXRUcyhpZWVlLCAoc3RydWN0IHRzX2NvbW1vbl9pbmZvICoqKSgmcFRTKSwgZHN0LAorCSAgICAodTgpKHBCYVBhcmFtU2V0LT5maWVsZC5USUQpLCBSWF9ESVIsIHRydWUpKSB7CisJCXJjID0gQUREQkFfU1RBVFVTX1JFRlVTRUQ7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiY2FuJ3QgZ2V0IFRTIGluICVzKClcbiIsIF9fZnVuY19fKTsKKwkJZ290byBPbkFEREJBUmVxX0ZhaWw7CisJfQorCXBCQSA9ICZwVFMtPlJ4QWRtaXR0ZWRCQVJlY29yZDsKKworCWlmIChwQmFQYXJhbVNldC0+ZmllbGQuQkFQb2xpY3kgPT0gQkFfUE9MSUNZX0RFTEFZRUQpIHsKKwkJcmMgPSBBRERCQV9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICJCQSBQb2xpY3kgaXMgbm90IGNvcnJlY3QgaW4gIgorCQkJICAgICAiJXMoKVxuIiwgX19mdW5jX18pOworCQlnb3RvIE9uQUREQkFSZXFfRmFpbDsKKwl9CisKKwlydGxsaWJfRmx1c2hSeFRzUGVuZGluZ1BrdHMoaWVlZSwgcFRTKTsKKworCURlQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBCQSk7CisJcEJBLT5EaWFsb2dUb2tlbiA9ICpwRGlhbG9nVG9rZW47CisJcEJBLT5CYVBhcmFtU2V0ID0gKnBCYVBhcmFtU2V0OworCXBCQS0+QmFUaW1lb3V0VmFsdWUgPSAqcEJhVGltZW91dFZhbDsKKwlwQkEtPkJhU3RhcnRTZXFDdHJsID0gKnBCYVN0YXJ0U2VxQ3RybDsKKworCWlmIChpZWVlLT5HZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHNIYW5kbGVyKGllZWUtPmRldikgfHwKKwkgICAoaWVlZS0+cEhUSW5mby0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9BTExPV19QRUVSX0FHR19PTkVfUEtUKSkKKwkJcEJBLT5CYVBhcmFtU2V0LmZpZWxkLkJ1ZmZlclNpemUgPSAxOworCWVsc2UKKwkJcEJBLT5CYVBhcmFtU2V0LmZpZWxkLkJ1ZmZlclNpemUgPSAzMjsKKworCUFjdGl2YXRlQkFFbnRyeShpZWVlLCBwQkEsIDApOworCXJ0bGxpYl9zZW5kX0FEREJBUnNwKGllZWUsIGRzdCwgcEJBLCBBRERCQV9TVEFUVVNfU1VDQ0VTUyk7CisKKwlyZXR1cm4gMDsKKworT25BRERCQVJlcV9GYWlsOgorCXsKKwkJc3RydWN0IGJhX3JlY29yZCBCQTsKKwkJQkEuQmFQYXJhbVNldCA9ICpwQmFQYXJhbVNldDsKKwkJQkEuQmFUaW1lb3V0VmFsdWUgPSAqcEJhVGltZW91dFZhbDsKKwkJQkEuRGlhbG9nVG9rZW4gPSAqcERpYWxvZ1Rva2VuOworCQlCQS5CYVBhcmFtU2V0LmZpZWxkLkJBUG9saWN5ID0gQkFfUE9MSUNZX0lNTUVESUFURTsKKwkJcnRsbGliX3NlbmRfQUREQkFSc3AoaWVlZSwgZHN0LCAmQkEsIHJjKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitpbnQgcnRsbGliX3J4X0FEREJBUnNwKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCSBzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkciAqcnNwID0gTlVMTDsKKwlzdHJ1Y3QgYmFfcmVjb3JkICpwUGVuZGluZ0JBLCAqcEFkbWl0dGVkQkE7CisJc3RydWN0IHR4X3RzX3JlY29yZCAqcFRTID0gTlVMTDsKKwl1OCAqZHN0ID0gTlVMTCwgKnBEaWFsb2dUb2tlbiA9IE5VTEwsICp0YWcgPSBOVUxMOworCXUxNiAqcFN0YXR1c0NvZGUgPSBOVUxMLCAqcEJhVGltZW91dFZhbCA9IE5VTEw7CisJdW5pb24gYmFfcGFyYW1fc2V0ICpwQmFQYXJhbVNldCA9IE5VTEw7CisJdTE2CQkJUmVhc29uQ29kZTsKKworCWlmIChza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkcikgKyA5KSB7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiIEludmFsaWQgc2tiIGxlbiBpbiBCQVJTUCglZCAvICIKKwkJCSAgICAgIiVkKVxuIiwgKGludClza2ItPmxlbiwKKwkJCSAgICAgKGludCkoc2l6ZW9mKHN0cnVjdCBydGxsaWJfaGRyXzNhZGRyKSArIDkpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyc3AgPSAoc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgKilza2ItPmRhdGE7CisJdGFnID0gKHU4ICopcnNwOworCWRzdCA9ICh1OCAqKSgmcnNwLT5hZGRyMlswXSk7CisJdGFnICs9IHNpemVvZihzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkcik7CisJcERpYWxvZ1Rva2VuID0gdGFnICsgMjsKKwlwU3RhdHVzQ29kZSA9ICh1MTYgKikodGFnICsgMyk7CisJcEJhUGFyYW1TZXQgPSAodW5pb24gYmFfcGFyYW1fc2V0ICopKHRhZyArIDUpOworCXBCYVRpbWVvdXRWYWwgPSAodTE2ICopKHRhZyArIDcpOworCisJUlRfVFJBQ0UoQ09NUF9EQkcsICI9PT09PnJ4IEFEREJBUlNQIGZyb20gOiAlcE1cbiIsIGRzdCk7CisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUgPT0gMCAgfHwKKwkgICAgaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPT0gZmFsc2UgfHwKKwkgICAgaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRBTVBEVUVuYWJsZSA9PSBmYWxzZSkgeworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgInJlamVjdCB0byBBRERCQV9SU1AgYXMgc29tZSBjYXBhYiIKKwkJCSAgICAgImlsaXR5IGlzIG5vdCByZWFkeSglZCwgJWQsICVkKVxuIiwKKwkJCSAgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSwKKwkJCSAgICAgaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQsCisJCQkgICAgIGllZWUtPnBIVEluZm8tPmJDdXJyZW50QU1QRFVFbmFibGUpOworCQlSZWFzb25Db2RlID0gREVMQkFfUkVBU09OX1VOS05PV05fQkE7CisJCWdvdG8gT25BRERCQVJzcF9SZWplY3Q7CisJfQorCisKKwlpZiAoIUdldFRzKGllZWUsIChzdHJ1Y3QgdHNfY29tbW9uX2luZm8gKiopKCZwVFMpLCBkc3QsCisJCSAgICh1OCkocEJhUGFyYW1TZXQtPmZpZWxkLlRJRCksIFRYX0RJUiwgZmFsc2UpKSB7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiY2FuJ3QgZ2V0IFRTIGluICVzKClcbiIsIF9fZnVuY19fKTsKKwkJUmVhc29uQ29kZSA9IERFTEJBX1JFQVNPTl9VTktOT1dOX0JBOworCQlnb3RvIE9uQUREQkFSc3BfUmVqZWN0OworCX0KKworCXBUUy0+YkFkZEJhUmVxSW5Qcm9ncmVzcyA9IGZhbHNlOworCXBQZW5kaW5nQkEgPSAmcFRTLT5UeFBlbmRpbmdCQVJlY29yZDsKKwlwQWRtaXR0ZWRCQSA9ICZwVFMtPlR4QWRtaXR0ZWRCQVJlY29yZDsKKworCisJaWYgKChwQWRtaXR0ZWRCQS0+YlZhbGlkID09IHRydWUpKSB7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfQkEsICJPbkFEREJBUnNwKCk6IFJlY3YgQUREQkEgUnNwLiIKKwkJCSAgICAgIiBEcm9wIGJlY2F1c2UgYWxyZWFkeSBhZG1pdCBpdCFcbiIpOworCQlyZXR1cm4gLTE7CisJfSBlbHNlIGlmICgocFBlbmRpbmdCQS0+YlZhbGlkID09IGZhbHNlKSB8fAorCQkgICAoKnBEaWFsb2dUb2tlbiAhPSBwUGVuZGluZ0JBLT5EaWFsb2dUb2tlbikpIHsKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICAiT25BRERCQVJzcCgpOiBSZWN2IEFEREJBIFJzcC4gIgorCQkJICAgICAiQkEgaW52YWxpZCwgREVMQkEhXG4iKTsKKwkJUmVhc29uQ29kZSA9IERFTEJBX1JFQVNPTl9VTktOT1dOX0JBOworCQlnb3RvIE9uQUREQkFSc3BfUmVqZWN0OworCX0gZWxzZSB7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfQkEsICJPbkFEREJBUnNwKCk6IFJlY3YgQUREQkEgUnNwLiBCQSAiCisJCQkgICAgICJpcyBhZG1pdHRlZCEgU3RhdHVzIGNvZGU6JVhcbiIsICpwU3RhdHVzQ29kZSk7CisJCURlQWN0aXZhdGVCQUVudHJ5KGllZWUsIHBQZW5kaW5nQkEpOworCX0KKworCisJaWYgKCpwU3RhdHVzQ29kZSA9PSBBRERCQV9TVEFUVVNfU1VDQ0VTUykgeworCQlpZiAocEJhUGFyYW1TZXQtPmZpZWxkLkJBUG9saWN5ID09IEJBX1BPTElDWV9ERUxBWUVEKSB7CisJCQlwVFMtPmJBZGRCYVJlcURlbGF5ZWQgPSB0cnVlOworCQkJRGVBY3RpdmF0ZUJBRW50cnkoaWVlZSwgcEFkbWl0dGVkQkEpOworCQkJUmVhc29uQ29kZSA9IERFTEJBX1JFQVNPTl9FTkRfQkE7CisJCQlnb3RvIE9uQUREQkFSc3BfUmVqZWN0OworCQl9CisKKworCQlwQWRtaXR0ZWRCQS0+RGlhbG9nVG9rZW4gPSAqcERpYWxvZ1Rva2VuOworCQlwQWRtaXR0ZWRCQS0+QmFUaW1lb3V0VmFsdWUgPSAqcEJhVGltZW91dFZhbDsKKwkJcEFkbWl0dGVkQkEtPkJhU3RhcnRTZXFDdHJsID0gcFBlbmRpbmdCQS0+QmFTdGFydFNlcUN0cmw7CisJCXBBZG1pdHRlZEJBLT5CYVBhcmFtU2V0ID0gKnBCYVBhcmFtU2V0OworCQlEZUFjdGl2YXRlQkFFbnRyeShpZWVlLCBwQWRtaXR0ZWRCQSk7CisJCUFjdGl2YXRlQkFFbnRyeShpZWVlLCBwQWRtaXR0ZWRCQSwgKnBCYVRpbWVvdXRWYWwpOworCX0gZWxzZSB7CisJCXBUUy0+YkFkZEJhUmVxRGVsYXllZCA9IHRydWU7CisJCXBUUy0+YkRpc2FibGVfQWRkQmEgPSB0cnVlOworCQlSZWFzb25Db2RlID0gREVMQkFfUkVBU09OX0VORF9CQTsKKwkJZ290byBPbkFEREJBUnNwX1JlamVjdDsKKwl9CisKKwlyZXR1cm4gMDsKKworT25BRERCQVJzcF9SZWplY3Q6CisJeworCQlzdHJ1Y3QgYmFfcmVjb3JkIEJBOworCQlCQS5CYVBhcmFtU2V0ID0gKnBCYVBhcmFtU2V0OworCQlydGxsaWJfc2VuZF9ERUxCQShpZWVlLCBkc3QsICZCQSwgVFhfRElSLCBSZWFzb25Db2RlKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitpbnQgcnRsbGliX3J4X0RFTEJBKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCSBzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkciAqZGVsYmEgPSBOVUxMOworCXVuaW9uIGRlbGJhX3BhcmFtX3NldCAqcERlbEJhUGFyYW1TZXQgPSBOVUxMOworCXUxNiAqcFJlYXNvbkNvZGUgPSBOVUxMOworCXU4ICpkc3QgPSBOVUxMOworCisJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBydGxsaWJfaGRyXzNhZGRyKSArIDYpIHsKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICIgSW52YWxpZCBza2IgbGVuIGluIERFTEJBKCVkIC8iCisJCQkgICAgICIgJWQpXG4iLCAoaW50KXNrYi0+bGVuLAorCQkJICAgICAoaW50KShzaXplb2Yoc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIpICsgNikpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUgPT0gMCAgfHwKKwkJaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPT0gZmFsc2UpIHsKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICJyZWNlaXZlZCBERUxCQSB3aGlsZSBRT1Mgb3IgSFQgIgorCQkJICAgICAiaXMgbm90IHN1cHBvcnRlZCglZCwgJWQpXG4iLAorCQkJICAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsuIHFvc19kYXRhLmFjdGl2ZSwKKwkJCSAgICAgaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQpOworCQlyZXR1cm4gLTE7CisJfQorCisJUlRMTElCX0RFQlVHX0RBVEEoUlRMTElCX0RMX0RBVEF8UlRMTElCX0RMX0JBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlkZWxiYSA9IChzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkciAqKXNrYi0+ZGF0YTsKKwlkc3QgPSAodTggKikoJmRlbGJhLT5hZGRyMlswXSk7CisJZGVsYmEgKz0gc2l6ZW9mKHN0cnVjdCBydGxsaWJfaGRyXzNhZGRyKTsKKwlwRGVsQmFQYXJhbVNldCA9ICh1bmlvbiBkZWxiYV9wYXJhbV9zZXQgKikoZGVsYmErMik7CisJcFJlYXNvbkNvZGUgPSAodTE2ICopKGRlbGJhKzQpOworCisJaWYgKHBEZWxCYVBhcmFtU2V0LT5maWVsZC5Jbml0aWF0b3IgPT0gMSkgeworCQlzdHJ1Y3QgcnhfdHNfcmVjb3JkICpwUnhUczsKKworCQlpZiAoIUdldFRzKGllZWUsIChzdHJ1Y3QgdHNfY29tbW9uX2luZm8gKiopJnBSeFRzLCBkc3QsCisJCSAgICAodTgpcERlbEJhUGFyYW1TZXQtPmZpZWxkLlRJRCwgUlhfRElSLCBmYWxzZSkpIHsKKwkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAgImNhbid0IGdldCBUUyBmb3IgUlhUUyBpbiAiCisJCQkJICAgICAiJXMoKS5kc3Q6ICVwTSBUSUQ6JWRcbiIsIF9fZnVuY19fLCBkc3QsCisJCQkJICAgICAodTgpcERlbEJhUGFyYW1TZXQtPmZpZWxkLlRJRCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlSeFRzRGVsZXRlQkEoaWVlZSwgcFJ4VHMpOworCX0gZWxzZSB7CisJCXN0cnVjdCB0eF90c19yZWNvcmQgKnBUeFRzOworCisJCWlmICghR2V0VHMoaWVlZSwgKHN0cnVjdCB0c19jb21tb25faW5mbyAqKikmcFR4VHMsIGRzdCwKKwkJCSAgICh1OClwRGVsQmFQYXJhbVNldC0+ZmllbGQuVElELCBUWF9ESVIsIGZhbHNlKSkgeworCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICAiY2FuJ3QgZ2V0IFRTIGZvciBUWFRTIGluICIKKwkJCQkgICAgICIlcygpXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlwVHhUcy0+YlVzaW5nQmEgPSBmYWxzZTsKKwkJcFR4VHMtPmJBZGRCYVJlcUluUHJvZ3Jlc3MgPSBmYWxzZTsKKwkJcFR4VHMtPmJBZGRCYVJlcURlbGF5ZWQgPSBmYWxzZTsKKwkJZGVsX3RpbWVyX3N5bmMoJnBUeFRzLT5Uc0FkZEJhVGltZXIpOworCQlUeFRzRGVsZXRlQkEoaWVlZSwgcFR4VHMpOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBUc0luaXRBZGRCQShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHR4X3RzX3JlY29yZCAqcFRTLAorCQkgdTggUG9saWN5LCB1OAliT3ZlcndyaXRlUGVuZGluZykKK3sKKwlzdHJ1Y3QgYmFfcmVjb3JkICpwQkEgPSAmcFRTLT5UeFBlbmRpbmdCQVJlY29yZDsKKworCWlmIChwQkEtPmJWYWxpZCA9PSB0cnVlICYmIGJPdmVyd3JpdGVQZW5kaW5nID09IGZhbHNlKQorCQlyZXR1cm47CisKKwlEZUFjdGl2YXRlQkFFbnRyeShpZWVlLCBwQkEpOworCisJcEJBLT5EaWFsb2dUb2tlbisrOworCXBCQS0+QmFQYXJhbVNldC5maWVsZC5BTVNEVV9TdXBwb3J0ID0gMDsKKwlwQkEtPkJhUGFyYW1TZXQuZmllbGQuQkFQb2xpY3kgPSBQb2xpY3k7CisJcEJBLT5CYVBhcmFtU2V0LmZpZWxkLlRJRCA9CisJCQkgcFRTLT5Uc0NvbW1vbkluZm8uVFNwZWMuZi5UU0luZm8uZmllbGQudWNUU0lEOworCXBCQS0+QmFQYXJhbVNldC5maWVsZC5CdWZmZXJTaXplID0gMzI7CisJcEJBLT5CYVRpbWVvdXRWYWx1ZSA9IDA7CisJcEJBLT5CYVN0YXJ0U2VxQ3RybC5maWVsZC5TZXFOdW0gPSAocFRTLT5UeEN1clNlcSArIDMpICUgNDA5NjsKKworCUFjdGl2YXRlQkFFbnRyeShpZWVlLCBwQkEsIEJBX1NFVFVQX1RJTUVPVVQpOworCisJcnRsbGliX3NlbmRfQUREQkFSZXEoaWVlZSwgcFRTLT5Uc0NvbW1vbkluZm8uQWRkciwgcEJBKTsKK30KKwordm9pZCBUc0luaXREZWxCQShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJIHN0cnVjdCB0c19jb21tb25faW5mbyAqcFRzQ29tbW9uSW5mbywKKwkJIGVudW0gdHJfc2VsZWN0IFR4UnhTZWxlY3QpCit7CisJaWYgKFR4UnhTZWxlY3QgPT0gVFhfRElSKSB7CisJCXN0cnVjdCB0eF90c19yZWNvcmQgKnBUeFRzID0KKwkJCSAoc3RydWN0IHR4X3RzX3JlY29yZCAqKXBUc0NvbW1vbkluZm87CisKKwkJaWYgKFR4VHNEZWxldGVCQShpZWVlLCBwVHhUcykpCisJCQlydGxsaWJfc2VuZF9ERUxCQShpZWVlLCBwVHNDb21tb25JbmZvLT5BZGRyLAorCQkJCQkgIChwVHhUcy0+VHhBZG1pdHRlZEJBUmVjb3JkLmJWYWxpZCkgPworCQkJCQkgKCZwVHhUcy0+VHhBZG1pdHRlZEJBUmVjb3JkKSA6CisJCQkJCSgmcFR4VHMtPlR4UGVuZGluZ0JBUmVjb3JkKSwKKwkJCQkJIFR4UnhTZWxlY3QsIERFTEJBX1JFQVNPTl9FTkRfQkEpOworCX0gZWxzZSBpZiAoVHhSeFNlbGVjdCA9PSBSWF9ESVIpIHsKKwkJc3RydWN0IHJ4X3RzX3JlY29yZCAqcFJ4VHMgPQorCQkJCSAoc3RydWN0IHJ4X3RzX3JlY29yZCAqKXBUc0NvbW1vbkluZm87CisJCWlmIChSeFRzRGVsZXRlQkEoaWVlZSwgcFJ4VHMpKQorCQkJcnRsbGliX3NlbmRfREVMQkEoaWVlZSwgcFRzQ29tbW9uSW5mby0+QWRkciwKKwkJCQkJICAmcFJ4VHMtPlJ4QWRtaXR0ZWRCQVJlY29yZCwKKwkJCQkJICBUeFJ4U2VsZWN0LCBERUxCQV9SRUFTT05fRU5EX0JBKTsKKwl9Cit9CisKK3ZvaWQgQmFTZXR1cFRpbWVPdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCB0eF90c19yZWNvcmQgKnBUeFRzID0gKHN0cnVjdCB0eF90c19yZWNvcmQgKilkYXRhOworCisJcFR4VHMtPmJBZGRCYVJlcUluUHJvZ3Jlc3MgPSBmYWxzZTsKKwlwVHhUcy0+YkFkZEJhUmVxRGVsYXllZCA9IHRydWU7CisJcFR4VHMtPlR4UGVuZGluZ0JBUmVjb3JkLmJWYWxpZCA9IGZhbHNlOworfQorCit2b2lkIFR4QmFJbmFjdFRpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCB0eF90c19yZWNvcmQgKnBUeFRzID0gKHN0cnVjdCB0eF90c19yZWNvcmQgKilkYXRhOworCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHBUeFRzLCBzdHJ1Y3QgcnRsbGliX2RldmljZSwKKwkJCQkgICAgIFR4VHNSZWNvcmRbcFR4VHMtPm51bV0pOworCVR4VHNEZWxldGVCQShpZWVlLCBwVHhUcyk7CisJcnRsbGliX3NlbmRfREVMQkEoaWVlZSwgcFR4VHMtPlRzQ29tbW9uSW5mby5BZGRyLAorCQkJICAmcFR4VHMtPlR4QWRtaXR0ZWRCQVJlY29yZCwgVFhfRElSLAorCQkJICBERUxCQV9SRUFTT05fVElNRU9VVCk7Cit9CisKK3ZvaWQgUnhCYUluYWN0VGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IHJ4X3RzX3JlY29yZCAqcFJ4VHMgPSAoc3RydWN0IHJ4X3RzX3JlY29yZCAqKWRhdGE7CisJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YocFJ4VHMsIHN0cnVjdCBydGxsaWJfZGV2aWNlLAorCQkJCSAgICAgUnhUc1JlY29yZFtwUnhUcy0+bnVtXSk7CisKKwlSeFRzRGVsZXRlQkEoaWVlZSwgcFJ4VHMpOworCXJ0bGxpYl9zZW5kX0RFTEJBKGllZWUsIHBSeFRzLT5Uc0NvbW1vbkluZm8uQWRkciwKKwkJCSAgJnBSeFRzLT5SeEFkbWl0dGVkQkFSZWNvcmQsIFJYX0RJUiwKKwkJCSAgREVMQkFfUkVBU09OX1RJTUVPVVQpOworCXJldHVybiA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9IVC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfSFQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2Y0MTA1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfSFQuaApAQCAtMCwwICsxLDQ3NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX1JUTDgxOVhVX0hUVFlQRV9IXworI2RlZmluZSBfUlRMODE5WFVfSFRUWVBFX0hfCisKKworI2RlZmluZSBIVF9PUE1PREVfTk9fUFJPVEVDVAkJMAorI2RlZmluZSBIVF9PUE1PREVfT1BUSU9OQUwJCTEKKyNkZWZpbmUgSFRfT1BNT0RFXzQwTUhaX1BST1RFQ1QJMgorI2RlZmluZSBIVF9PUE1PREVfTUlYRUQJCQkzCisKKyNkZWZpbmUgTUlNT19QU19TVEFUSUMJCQkJMAorI2RlZmluZSBNSU1PX1BTX0RZTkFNSUMJCQkxCisjZGVmaW5lIE1JTU9fUFNfTk9MSU1JVAkJCTMKKworCisKKyNkZWZpbmUgc0hUQ0xuZwk0CisKKworI2RlZmluZSBIVF9TVVBQT1JURURfTUNTXzFTU19CSVRNQVAJCQkweDAwMDAwMGZmCisjZGVmaW5lIEhUX1NVUFBPUlRFRF9NQ1NfMlNTX0JJVE1BUAkJCTB4MDAwMGZmMDAKKyNkZWZpbmUgSFRfU1VQUE9SVEVEX01DU18xU1NfMlNTX0JJVE1BUAkJCVwKKwkoSFRfTUNTXzFTU19CSVRNQVAgfCBIVF9NQ1NfMVNTXzJTU19CSVRNQVApCisKK2VudW0gaHRfbWNzX3JhdGUgeworCUhUX01DUzAgICA9IDB4MDAwMDAwMDEsCisJSFRfTUNTMSAgID0gMHgwMDAwMDAwMiwKKwlIVF9NQ1MyICAgPSAweDAwMDAwMDA0LAorCUhUX01DUzMgICA9IDB4MDAwMDAwMDgsCisJSFRfTUNTNCAgID0gMHgwMDAwMDAxMCwKKwlIVF9NQ1M1ICAgPSAweDAwMDAwMDIwLAorCUhUX01DUzYgICA9IDB4MDAwMDAwNDAsCisJSFRfTUNTNyAgID0gMHgwMDAwMDA4MCwKKwlIVF9NQ1M4ICAgPSAweDAwMDAwMTAwLAorCUhUX01DUzkgICA9IDB4MDAwMDAyMDAsCisJSFRfTUNTMTAgPSAweDAwMDAwNDAwLAorCUhUX01DUzExID0gMHgwMDAwMDgwMCwKKwlIVF9NQ1MxMiA9IDB4MDAwMDEwMDAsCisJSFRfTUNTMTMgPSAweDAwMDAyMDAwLAorCUhUX01DUzE0ID0gMHgwMDAwNDAwMCwKKwlIVF9NQ1MxNSA9IDB4MDAwMDgwMDAsCit9OworCitlbnVtIGh0X2NoYW5uZWxfd2lkdGggeworCUhUX0NIQU5ORUxfV0lEVEhfMjAgPSAwLAorCUhUX0NIQU5ORUxfV0lEVEhfMjBfNDAgPSAxLAorfTsKKworZW51bSBodF9leHRjaG5sX29mZnNldCB7CisJSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUID0gMCwKKwlIVF9FWFRDSE5MX09GRlNFVF9VUFBFUiA9IDEsCisJSFRfRVhUQ0hOTF9PRkZTRVRfTk9fREVGID0gMiwKKwlIVF9FWFRDSE5MX09GRlNFVF9MT1dFUiA9IDMsCit9OworCitlbnVtIGNobmxfb3AgeworCUNITkxPUF9OT05FID0gMCwKKwlDSE5MT1BfU0NBTiA9IDEsCisJQ0hOTE9QX1NXQlcgPSAyLAorCUNITkxPUF9TV0NITkwgPSAzLAorfTsKKworI2RlZmluZSBDSEhMT1BfSU5fUFJPR1JFU1MoX3BIVEluZm8pCVwKKwkJKChfcEhUSW5mbyktPkNobmxPcCA+IENITkxPUF9OT05FKSA/IHRydWUgOiBmYWxzZQorCisvKgordW5pb24gaHRfY2FwYWJpbGl0eSB7CisJdTE2CVNob3J0RGF0YTsKKwl1OAlDaGFyRGF0YVsyXTsKKwlzdHJ1Y3QKKwl7CisJCXUxNglBZHZDb2Rpbmc6MTsKKwkJdTE2CUNobFdpZHRoOjE7CisJCXUxNglNaW1vUHdyU2F2ZToyOworCQl1MTYJR3JlZW5GaWVsZDoxOworCQl1MTYJU2hvcnRHSTIwTWh6OjE7CisJCXUxNglTaG9ydEdJNDBNaHo6MTsKKwkJdTE2CVNUQkM6MTsKKwkJdTE2CUJlYW1Gb3JtOjE7CisJCXUxNglEZWxheUJBOjE7CisJCXUxNglNYXhBTVNEVVNpemU6MTsKKwkJdTE2CURzc0NDazoxOworCQl1MTYJUFNNUDoxOworCQl1MTYJUnN2ZDozOworCX1GaWVsZDsKK307CisKK3VuaW9uIGh0X2NhcGFiaWxpdHlfbWFjcGFyYSB7CisJdTgJU2hvcnREYXRhOworCXU4CUNoYXJEYXRhWzFdOworCXN0cnVjdAorCXsKKwkJdTgJTWF4UnhBTVBEVToyOworCQl1OAlNUERVRGVuc2l0eToyOworCQl1OAlSc3ZkOjQ7CisJfUZpZWxkOworfTsKKyovCisKK2VudW0gaHRfYWN0aW9uIHsKKwlBQ1RfUkVDT01NQU5EX1dJRFRICQk9IDAsCisJQUNUX01JTU9fUFdSX1NBVkUJCT0gMSwKKwlBQ1RfUFNNUAkJCQkJPSAyLAorCUFDVF9TRVRfUENPX1BIQVNFCQk9IDMsCisJQUNUX01JTU9fQ0hMX01FQVNVUkUJPSA0LAorCUFDVF9SRUNJUFJPQ0lUWV9DT1JSRUNUCT0gNSwKKwlBQ1RfTUlNT19DU0lfTUFUUklDUwkJPSA2LAorCUFDVF9NSU1PX05PQ09NUFJfU1RFRVIJPSA3LAorCUFDVF9NSU1PX0NPTVBSX1NURUVSCQk9IDgsCisJQUNUX0FOVEVOTkFfU0VMRUNUCQk9IDksCit9OworCisKK2VudW0gaHRfYnc0MF9zYyB7CisJU0NfTU9ERV9EVVBMSUNBVEUgPSAwLAorCVNDX01PREVfTE9XRVIgPSAxLAorCVNDX01PREVfVVBQRVIgPSAyLAorCVNDX01PREVfRlVMTDQwTUhaID0gMywKK307CisKK3N0cnVjdCBodF9jYXBhYl9lbGUgeworCisJdTgJQWR2Q29kaW5nOjE7CisJdTgJQ2hsV2lkdGg6MTsKKwl1OAlNaW1vUHdyU2F2ZToyOworCXU4CUdyZWVuRmllbGQ6MTsKKwl1OAlTaG9ydEdJMjBNaHo6MTsKKwl1OAlTaG9ydEdJNDBNaHo6MTsKKwl1OAlUeFNUQkM6MTsKKwl1OAlSeFNUQkM6MjsKKwl1OAlEZWxheUJBOjE7CisJdTgJTWF4QU1TRFVTaXplOjE7CisJdTgJRHNzQ0NrOjE7CisJdTgJUFNNUDoxOworCXU4CVJzdmQxOjE7CisJdTgJTFNpZ1R4b3BQcm90ZWN0OjE7CisKKwl1OAlNYXhSeEFNUERVRmFjdG9yOjI7CisJdTgJTVBEVURlbnNpdHk6MzsKKwl1OAlSc3ZkMjozOworCisJdTgJTUNTWzE2XTsKKworCisJdTE2CUV4dEhUQ2FwSW5mbzsKKworCXU4CVR4QkZDYXBbNF07CisKKwl1OAlBU0NhcDsKKworfSBfX3BhY2tlZDsKKworCitzdHJ1Y3QgaHRfaW5mb19lbGUgeworCXU4CUNvbnRyb2xDaGw7CisKKwl1OAlFeHRDaGxPZmZzZXQ6MjsKKwl1OAlSZWNvbW1lbWRlZFR4V2lkdGg6MTsKKwl1OAlSSUZTOjE7CisJdTgJUFNNUEFjY2Vzc09ubHk6MTsKKwl1OAlTcnZJbnRHcmFudWxhcml0eTozOworCisJdTgJT3B0TW9kZToyOworCXU4CU5vbkdGRGV2UHJlc2VudDoxOworCXU4CVJldmQxOjU7CisJdTgJUmV2ZDI6ODsKKworCXU4CVJzdmQzOjY7CisJdTgJRHVhbEJlYWNvbjoxOworCXU4CUR1YWxDVFNQcm90ZWN0OjE7CisKKwl1OAlTZWNvbmRhcnlCZWFjb246MTsKKwl1OAlMU2lnVHhvcFByb3RlY3RGdWxsOjE7CisJdTgJUGNvQWN0aXZlOjE7CisJdTgJUGNvUGhhc2U6MTsKKwl1OAlSc3ZkNDo0OworCisJdTgJQmFzaWNNU0NbMTZdOworfSBfX3BhY2tlZDsKKworc3RydWN0IG1pbW9wc19jdHJsIHsKKwl1OAlNaW1vUHNFbmFibGU6MTsKKwl1OAlNaW1vUHNNb2RlOjE7CisJdTgJUmVzZXJ2ZWQ6NjsKK307CisKK2VudW0gaHRfc3BlY192ZXIgeworCUhUX1NQRUNfVkVSX0lFRUUgPSAwLAorCUhUX1NQRUNfVkVSX0VXQyA9IDEsCit9OworCitlbnVtIGh0X2FnZ3JlX21vZGUgeworCUhUX0FHR19BVVRPID0gMCwKKwlIVF9BR0dfRk9SQ0VfRU5BQkxFID0gMSwKKwlIVF9BR0dfRk9SQ0VfRElTQUJMRSA9IDIsCit9OworCisKK3N0cnVjdCBydF9oaV90aHJvdWdocHV0IHsKKwl1OAkJCQliRW5hYmxlSFQ7CisJdTgJCQkJYkN1cnJlbnRIVFN1cHBvcnQ7CisKKwl1OAkJCQliUmVnQlc0ME1IejsKKwl1OAkJCQliQ3VyQlc0ME1IejsKKworCXU4CQkJCWJSZWdTaG9ydEdJNDBNSHo7CisJdTgJCQkJYkN1clNob3J0R0k0ME1IejsKKworCXU4CQkJCWJSZWdTaG9ydEdJMjBNSHo7CisJdTgJCQkJYkN1clNob3J0R0kyME1IejsKKworCXU4CQkJCWJSZWdTdXBwQ0NLOworCXU4CQkJCWJDdXJTdXBwQ0NLOworCisJZW51bSBodF9zcGVjX3ZlciBlUGVlckhUU3BlY1ZlcjsKKworCisJc3RydWN0IGh0X2NhcGFiX2VsZSBTZWxmSFRDYXA7CisJc3RydWN0IGh0X2luZm9fZWxlIFNlbGZIVEluZm87CisKKwl1OAkJCQlQZWVySFRDYXBCdWZbMzJdOworCXU4CQkJCVBlZXJIVEluZm9CdWZbMzJdOworCisKKwl1OAkJCQliQU1TRFVfU3VwcG9ydDsKKwl1MTYJCQkJbkFNU0RVX01heFNpemU7CisJdTgJCQkJYkN1cnJlbnRfQU1TRFVfU3VwcG9ydDsKKwl1MTYJCQkJbkN1cnJlbnRfQU1TRFVfTWF4U2l6ZTsKKworCXU4CQkJCWJBTVBEVUVuYWJsZTsKKwl1OAkJCQliQ3VycmVudEFNUERVRW5hYmxlOworCXU4CQkJCUFNUERVX0ZhY3RvcjsKKwl1OAkJCQlDdXJyZW50QU1QRFVGYWN0b3I7CisJdTgJCQkJTVBEVV9EZW5zaXR5OworCXU4CQkJCUN1cnJlbnRNUERVRGVuc2l0eTsKKworCWVudW0gaHRfYWdncmVfbW9kZSBGb3JjZWRBTVBEVU1vZGU7CisJdTgJCQkJRm9yY2VkQU1QRFVGYWN0b3I7CisJdTgJCQkJRm9yY2VkTVBEVURlbnNpdHk7CisKKwllbnVtIGh0X2FnZ3JlX21vZGUgRm9yY2VkQU1TRFVNb2RlOworCXUxNgkJCQlGb3JjZWRBTVNEVU1heFNpemU7CisKKwl1OAkJCQliRm9yY2VkU2hvcnRHSTsKKworCXU4CQkJCUN1cnJlbnRPcE1vZGU7CisKKwl1OAkJCQlTZWxmTWltb1BzOworCXU4CQkJCVBlZXJNaW1vUHM7CisKKwllbnVtIGh0X2V4dGNobmxfb2Zmc2V0IEN1clNUQUV4dENobmxPZmZzZXQ7CisJdTgJCQkJYkN1clR4Qlc0ME1IejsKKwl1OAkJCQlQZWVyQmFuZHdpZHRoOworCisJdTgJCQkJYlN3QndJblByb2dyZXNzOworCWVudW0gY2hubF9vcCBDaG5sT3A7CisJdTgJCQkJU3dCd1N0ZXA7CisKKwl1OAkJCQliUmVnUlQyUlRBZ2dyZWdhdGlvbjsKKwl1OAkJCQlSVDJSVF9IVF9Nb2RlOworCXU4CQkJCWJDdXJyZW50UlQyUlRBZ2dyZWdhdGlvbjsKKwl1OAkJCQliQ3VycmVudFJUMlJUTG9uZ1Nsb3RUaW1lOworCXU4CQkJCXN6UlQyUlRBZ2dCdWZmZXJbMTBdOworCisJdTgJCQkJYlJlZ1J4UmVvcmRlckVuYWJsZTsKKwl1OAkJCQliQ3VyUnhSZW9yZGVyRW5hYmxlOworCXU4CQkJCVJ4UmVvcmRlcldpblNpemU7CisJdTgJCQkJUnhSZW9yZGVyUGVuZGluZ1RpbWU7CisJdTE2CQkJCVJ4UmVvcmRlckRyb3BDb3VudGVyOworCisJdTgJCQkJYklzUGVlckJjbTsKKworCXU4CQkJCUlPVFBlZXI7CisJdTMyCQkJCUlPVEFjdGlvbjsKKwl1OAkJCQlJT1RSYUZ1bmM7CisKKwl1OAliV0FJb3RCcm9hZGNvbTsKKwl1OAlXQUlvdFRIOworCisJdTgJCQkJYkFjY2VwdEFkZGJhUmVxOworfSBfX3BhY2tlZDsKKworCisKK3N0cnVjdCBydF9odGluZm9fc3RhX2VudHJ5IHsKKwl1OAkJCWJFbmFibGVIVDsKKworCXU4CQkJYlN1cHBvcnRDY2s7CisKKwl1MTYJCQlBTVNEVV9NYXhTaXplOworCisJdTgJCQlBTVBEVV9GYWN0b3I7CisJdTgJCQlNUERVX0RlbnNpdHk7CisKKwl1OAkJCUhUSGlnaGVzdE9wZXJhUmF0ZTsKKworCXU4CQkJYkJ3NDBNSHo7CisKKwl1OAkJCWJDdXJUeEJXNDBNSHo7CisKKwl1OAkJCWJDdXJTaG9ydEdJMjBNSHo7CisKKwl1OAkJCWJDdXJTaG9ydEdJNDBNSHo7CisKKwl1OAkJCU1pbW9QczsKKworCXU4CQkJTWNzUmF0ZVNldFsxNl07CisKKwl1OCAgICAgICAgICAgICAgICAgICAgICBiQ3VyUnhSZW9yZGVyRW5hYmxlOworCisJdTE2ICAgICAgICAgICAgICAgICAgICAgbkFNU0RVX01heFNpemU7CisKK307CisKKworCisKKworCitzdHJ1Y3QgYnNzX2h0IHsKKworCXU4CQkJCWJkU3VwcG9ydEhUOworCisJdTgJCQkJCWJkSFRDYXBCdWZbMzJdOworCXUxNgkJCQkJYmRIVENhcExlbjsKKwl1OAkJCQkJYmRIVEluZm9CdWZbMzJdOworCXUxNgkJCQkJYmRIVEluZm9MZW47CisKKwllbnVtIGh0X3NwZWNfdmVyIGJkSFRTcGVjVmVyOworCWVudW0gaHRfY2hhbm5lbF93aWR0aCBiZEJhbmRXaWR0aDsKKworCXU4CQkJCQliZFJUMlJUQWdncmVnYXRpb247CisJdTgJCQkJCWJkUlQyUlRMb25nU2xvdFRpbWU7CisJdTgJCQkJCVJUMlJUX0hUX01vZGU7CisJdTgJCQkJCWJkSFQxUjsKK307CisKK3N0cnVjdCBtaW1vX3Jzc2kgeworCXUzMglFbmFibGVBbnRlbm5hOworCXUzMglBbnRlbm5hQTsKKwl1MzIJQW50ZW5uYUI7CisJdTMyCUFudGVubmFDOworCXUzMglBbnRlbm5hRDsKKwl1MzIJQXZlcmFnZTsKK307CisKK3N0cnVjdCBtaW1vX2V2bSB7CisJdTMyCUVWTTE7CisJdTMyICAgIEVWTTI7Cit9OworCitzdHJ1Y3QgZmFsc2VfYWxhcm1fc3RhdHMgeworCXUzMglDbnRfUGFyaXR5X0ZhaWw7CisJdTMyCUNudF9SYXRlX0lsbGVnYWw7CisJdTMyCUNudF9DcmM4X2ZhaWw7CisJdTMyCUNudF9NY3NfZmFpbDsKKwl1MzIJQ250X09mZG1fZmFpbDsKKwl1MzIJQ250X0Nja19mYWlsOworCXUzMglDbnRfYWxsOworfTsKKworCitleHRlcm4gdTggTUNTX0ZJTFRFUl9BTExbMTZdOworZXh0ZXJuIHU4IE1DU19GSUxURVJfMVNTWzE2XTsKKworI2RlZmluZSBQSUNLX1JBVEUoX25MZWdhY3lSYXRlLCBfbk1jc1JhdGUpCVwKKwkJKChfbk1jc1JhdGUgPT0gMCkgPyAoX25MZWdhY3lSYXRlJjB4N2YpIDogKF9uTWNzUmF0ZSkpCisjZGVmaW5lCUxFR0FDWV9XSVJFTEVTU19NT0RFCUlFRUVfTU9ERV9NQVNLCisKKyNkZWZpbmUgQ1VSUkVOVF9SQVRFKFdpcmVsZXNzTW9kZSwgTGVnYWN5UmF0ZSwgSFRSYXRlKQlcCisJCQkoKFdpcmVsZXNzTW9kZSAmIChMRUdBQ1lfV0lSRUxFU1NfTU9ERSkpICE9IDApID8gXAorCQkJKExlZ2FjeVJhdGUpIDogKFBJQ0tfUkFURShMZWdhY3lSYXRlLCBIVFJhdGUpKQorCisKKworI2RlZmluZQlSQVRFX0FEUFRfMVNTX01BU0sJCTB4RkYKKyNkZWZpbmUJUkFURV9BRFBUXzJTU19NQVNLCQkweEYwCisjZGVmaW5lCVJBVEVfQURQVF9NQ1MzMl9NQVNLCQkweDAxCisKKyNkZWZpbmUJCUlTXzExTl9NQ1NfUkFURShyYXRlKQkJKHJhdGUmMHg4MCkKKworZW51bSBodF9hZ2dyZV9zaXplIHsKKwlIVF9BR0dfU0laRV84SyA9IDAsCisJSFRfQUdHX1NJWkVfMTZLID0gMSwKKwlIVF9BR0dfU0laRV8zMksgPSAyLAorCUhUX0FHR19TSVpFXzY0SyA9IDMsCit9OworCitlbnVtIGh0X2lvdF9wZWVyIHsKKwlIVF9JT1RfUEVFUl9VTktOT1dOID0gMCwKKwlIVF9JT1RfUEVFUl9SRUFMVEVLID0gMSwKKwlIVF9JT1RfUEVFUl9SRUFMVEVLXzkyU0UgPSAyLAorCUhUX0lPVF9QRUVSX0JST0FEQ09NID0gMywKKwlIVF9JT1RfUEVFUl9SQUxJTksgPSA0LAorCUhUX0lPVF9QRUVSX0FUSEVST1MgPSA1LAorCUhUX0lPVF9QRUVSX0NJU0NPID0gNiwKKwlIVF9JT1RfUEVFUl9NQVJWRUxMID0gNywKKwlIVF9JT1RfUEVFUl85MlVfU09GVEFQID0gOCwKKwlIVF9JT1RfUEVFUl9TRUxGX1NPRlRBUCA9IDksCisJSFRfSU9UX1BFRVJfQUlSR08gPSAxMCwKKwlIVF9JT1RfUEVFUl9NQVggPSAxMSwKK307CisKK2VudW0gaHRfaW90X3BlZXJfc3VidHlwZSB7CisJSFRfSU9UX1BFRVJfQVRIRVJPU19ESVI2MzUgPSAwLAorfTsKKworZW51bSBodF9pb3RfYWN0aW9uIHsKKwlIVF9JT1RfQUNUX1RYX1VTRV9BTVNEVV80SyA9IDB4MDAwMDAwMDEsCisJSFRfSU9UX0FDVF9UWF9VU0VfQU1TRFVfOEsgPSAweDAwMDAwMDAyLAorCUhUX0lPVF9BQ1RfRElTQUJMRV9NQ1MxNCA9IDB4MDAwMDAwMDQsCisJSFRfSU9UX0FDVF9ESVNBQkxFX01DUzE1ID0gMHgwMDAwMDAwOCwKKwlIVF9JT1RfQUNUX0RJU0FCTEVfQUxMXzJTUyA9IDB4MDAwMDAwMTAsCisJSFRfSU9UX0FDVF9ESVNBQkxFX0VEQ0FfVFVSQk8gPSAweDAwMDAwMDIwLAorCUhUX0lPVF9BQ1RfTUdOVF9VU0VfQ0NLXzZNID0gMHgwMDAwMDA0MCwKKwlIVF9JT1RfQUNUX0NERF9GU1lOQyA9IDB4MDAwMDAwODAsCisJSFRfSU9UX0FDVF9QVVJFX05fTU9ERSA9IDB4MDAwMDAxMDAsCisJSFRfSU9UX0FDVF9GT1JDRURfQ1RTMlNFTEYgPSAweDAwMDAwMjAwLAorCUhUX0lPVF9BQ1RfRk9SQ0VEX1JUUyA9IDB4MDAwMDA0MDAsCisJSFRfSU9UX0FDVF9BTVNEVV9FTkFCTEUgPSAweDAwMDAwODAwLAorCUhUX0lPVF9BQ1RfUkVKRUNUX0FEREJBX1JFUSA9IDB4MDAwMDEwMDAsCisJSFRfSU9UX0FDVF9BTExPV19QRUVSX0FHR19PTkVfUEtUID0gMHgwMDAwMjAwMCwKKwlIVF9JT1RfQUNUX0VEQ0FfQklBU19PTl9SWCA9IDB4MDAwMDQwMDAsCisKKwlIVF9JT1RfQUNUX0hZQlJJRF9BR0dSRUdBVElPTiA9IDB4MDAwMTAwMDAsCisJSFRfSU9UX0FDVF9ESVNBQkxFX1NIT1JUX0dJID0gMHgwMDAyMDAwMCwKKwlIVF9JT1RfQUNUX0RJU0FCTEVfSElHSF9QT1dFUiA9IDB4MDAwNDAwMDAsCisJSFRfSU9UX0FDVF9ESVNBQkxFX1RYXzQwX01IWiA9IDB4MDAwODAwMDAsCisJSFRfSU9UX0FDVF9UWF9OT19BR0dSRUdBVElPTiA9IDB4MDAxMDAwMDAsCisJSFRfSU9UX0FDVF9ESVNBQkxFX1RYXzJTUyA9IDB4MDAyMDAwMDAsCisKKwlIVF9JT1RfQUNUX01JRF9ISUdIUE9XRVIgPSAweDAwNDAwMDAwLAorCUhUX0lPVF9BQ1RfTlVMTF9EQVRBX1BPV0VSX1NBVklORyA9IDB4MDA4MDAwMDAsCisKKwlIVF9JT1RfQUNUX0RJU0FCTEVfQ0NLX1JBVEUgPSAweDAxMDAwMDAwLAorCUhUX0lPVF9BQ1RfRk9SQ0VEX0VOQUJMRV9CRV9UWE9QID0gMHgwMjAwMDAwMCwKKwlIVF9JT1RfQUNUX1dBX0lPVF9Ccm9hZGNvbSA9IDB4MDQwMDAwMDAsCisKKwlIVF9JT1RfQUNUX0RJU0FCTEVfUlhfNDBNSFpfU0hPUlRfR0kgPSAweDA4MDAwMDAwLAorCit9OworCitlbnVtIGh0X2lvdF9yYWZ1bmMgeworCUhUX0lPVF9SQUZVTkNfRElTQUJMRV9BTEwgPSAweDAwLAorCUhUX0lPVF9SQUZVTkNfUEVFUl8xUiA9IDB4MDEsCisJSFRfSU9UX1JBRlVOQ19UWF9BTVNEVSA9IDB4MDIsCit9OworCitlbnVtIHJ0X2h0X2NhcGFiaWxpdHkgeworCVJUX0hUX0NBUF9VU0VfVFVSQk9fQUdHUiA9IDB4MDEsCisJUlRfSFRfQ0FQX1VTRV9MT05HX1BSRUFNQkxFID0gMHgwMiwKKwlSVF9IVF9DQVBfVVNFX0FNUERVID0gMHgwNCwKKwlSVF9IVF9DQVBfVVNFX1dPVyA9IDB4OCwKKwlSVF9IVF9DQVBfVVNFX1NPRlRBUCA9IDB4MTAsCisJUlRfSFRfQ0FQX1VTRV85MlNFID0gMHgyMCwKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfSFRQcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9IVFByb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWMwYzU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfSFRQcm9jLmMKQEAgLTAsMCArMSwxMDc1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInJ0bGxpYi5oIgorI2luY2x1ZGUgInJ0bDgxOXhfSFQuaCIKK3U4IE1DU19GSUxURVJfQUxMWzE2XSA9IHsKKwkweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLAorCTB4ZmYsIDB4MWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK3U4IE1DU19GSUxURVJfMVNTWzE2XSA9IHsKKwkweGZmLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9Cis7CisKK3UxNiBNQ1NfREFUQV9SQVRFWzJdWzJdWzc3XSA9IHsKKwl7ezEzLCAyNiwgMzksIDUyLCA3OCwgMTA0LCAxMTcsIDEzMCwgMjYsIDUyLCA3OCwgMTA0LCAxNTYsIDIwOCwgMjM0LAorCSAyNjAsIDM5LCA3OCwgMTE3LCAyMzQsIDMxMiwgMzUxLCAzOTAsIDUyLCAxMDQsIDE1NiwgMjA4LCAzMTIsIDQxNiwKKwkgNDY4LCA1MjAsIDAsIDc4LCAxMDQsIDEzMCwgMTE3LCAxNTYsIDE5NSwgMTA0LCAxMzAsIDEzMCwgMTU2LCAxODIsCisJIDE4MiwgMjA4LCAxNTYsIDE5NSwgMTk1LCAyMzQsIDI3MywgMjczLCAzMTIsIDEzMCwgMTU2LCAxODEsIDE1NiwKKwkgMTgxLCAyMDgsIDIzNCwgMjA4LCAyMzQsIDI2MCwgMjYwLCAyODYsIDE5NSwgMjM0LCAyNzMsIDIzNCwgMjczLAorCSAzMTIsIDM1MSwgMzEyLCAzNTEsIDM5MCwgMzkwLCA0Mjl9ICwKKwl7MTQsIDI5LCA0MywgNTgsIDg3LCAxMTYsIDEzMCwgMTQ0LCAyOSwgNTgsIDg3LCAxMTYsIDE3MywgMjMxLCAyNjAsIDI4OSwKKwkgNDMsIDg3LCAxMzAsIDE3MywgMjYwLCAzNDcsIDM5MCwgNDMzLCA1OCwgMTE2LCAxNzMsIDIzMSwgMzQ3LCA0NjIsIDUyMCwKKwkgNTc4LCAwLCA4NywgMTE2LCAxNDQsIDEzMCwgMTczLCAyMTcsIDExNiwgMTQ0LCAxNDQsIDE3MywgMjAyLCAyMDIsIDIzMSwKKwkgMTczLCAyMTcsIDIxNywgMjYwLCAzMDMsIDMwMywgMzQ3LCAxNDQsIDE3MywgMjAyLCAxNzMsIDIwMiwgMjMxLCAyNjAsCisJIDIzMSwgMjYwLCAyODksIDI4OSwgMzE4LCAyMTcsIDI2MCwgMzAzLCAyNjAsIDMwMywgMzQ3LCAzOTAsIDM0NywgMzkwLAorCSA0MzMsIDQzMywgNDc3fSB9ICwKKwl7ezI3LCA1NCwgODEsIDEwOCwgMTYyLCAyMTYsIDI0MywgMjcwLCA1NCwgMTA4LCAxNjIsIDIxNiwgMzI0LCA0MzIsIDQ4NiwKKwkgNTQwLCA4MSwgMTYyLCAyNDMsIDMyNCwgNDg2LCA2NDgsIDcyOSwgODEwLCAxMDgsIDIxNiwgMzI0LCA0MzIsIDY0OCwKKwkgODY0LCA5NzIsIDEwODAsIDEyLCAxNjIsIDIxNiwgMjcwLCAyNDMsIDMyNCwgNDA1LCAyMTYsIDI3MCwgMjcwLCAzMjQsCisJIDM3OCwgMzc4LCA0MzIsIDMyNCwgNDA1LCA0MDUsIDQ4NiwgNTY3LCA1NjcsIDY0OCwgMjcwLCAzMjQsIDM3OCwgMzI0LAorCSAzNzgsIDQzMiwgNDg2LCA0MzIsIDQ4NiwgNTQwLCA1NDAsIDU5NCwgNDA1LCA0ODYsIDU2NywgNDg2LCA1NjcsIDY0OCwKKwkgNzI5LCA2NDgsIDcyOSwgODEwLCA4MTAsIDg5MX0sCisJezMwLCA2MCwgOTAsIDEyMCwgMTgwLCAyNDAsIDI3MCwgMzAwLCA2MCwgMTIwLCAxODAsIDI0MCwgMzYwLCA0ODAsIDU0MCwKKwkgNjAwLCA5MCwgMTgwLCAyNzAsIDM2MCwgNTQwLCA3MjAsIDgxMCwgOTAwLCAxMjAsIDI0MCwgMzYwLCA0ODAsIDcyMCwKKwkgOTYwLCAxMDgwLCAxMjAwLCAxMywgMTgwLCAyNDAsIDMwMCwgMjcwLCAzNjAsIDQ1MCwgMjQwLCAzMDAsIDMwMCwgMzYwLAorCSA0MjAsIDQyMCwgNDgwLCAzNjAsIDQ1MCwgNDUwLCA1NDAsIDYzMCwgNjMwLCA3MjAsIDMwMCwgMzYwLCA0MjAsIDM2MCwKKwkgNDIwLCA0ODAsIDU0MCwgNDgwLCA1NDAsIDYwMCwgNjAwLCA2NjAsIDQ1MCwgNTQwLCA2MzAsIDU0MCwgNjMwLCA3MjAsCisJIDgxMCwgNzIwLCA4MTAsIDkwMCwgOTAwLCA5OTB9IH0KK307CisKK3N0YXRpYyB1OCBVTktOT1dOX0JPUkFEQ09NWzNdID0gezB4MDAsIDB4MTQsIDB4YmZ9OworCitzdGF0aWMgdTggTElOS1NZU1dSVDMzMF9MSU5LU1lTV1JUMzAwX0JST0FEQ09NWzNdID0gezB4MDAsIDB4MWEsIDB4NzB9OworCitzdGF0aWMgdTggTElOS1NZU1dSVDM1MF9MSU5LU1lTV1JUMTUwX0JST0FEQ09NWzNdID0gezB4MDAsIDB4MWQsIDB4N2V9OworCitzdGF0aWMgdTggQkVMS0lORjVEODIzM1YxX1JBTElOS1szXSA9IHsweDAwLCAweDE3LCAweDNmfTsKKworc3RhdGljIHU4IEJFTEtJTkY1RDgyMzM0VjNfUkFMSU5LWzNdID0gezB4MDAsIDB4MWMsIDB4ZGZ9OworCitzdGF0aWMgdTggUENJX1JBTElOS1szXSA9IHsweDAwLCAweDkwLCAweGNjfTsKKworc3RhdGljIHU4IEVESU1BWF9SQUxJTktbM10gPSB7MHgwMCwgMHgwZSwgMHgyZX07CisKK3N0YXRpYyB1OCBBSVJMSU5LX1JBTElOS1szXSA9IHsweDAwLCAweDE4LCAweDAyfTsKKworc3RhdGljIHU4IERMSU5LX0FUSEVST1NfMVszXSA9IHsweDAwLCAweDFjLCAweGYwfTsKKworc3RhdGljIHU4IERMSU5LX0FUSEVST1NfMlszXSA9IHsweDAwLCAweDIxLCAweDkxfTsKKworc3RhdGljIHU4IENJU0NPX0JST0FEQ09NWzNdID0gezB4MDAsIDB4MTcsIDB4OTR9OworCitzdGF0aWMgdTggTElOS1NZU19NQVJWRUxMXzQ0MDBOWzNdID0gezB4MDAsIDB4MTQsIDB4YTR9OworCit2b2lkIEhUVXBkYXRlRGVmYXVsdFNldHRpbmcoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IHJ0X2hpX3Rocm91Z2hwdXQgKnBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCisJcEhUSW5mby0+YkFjY2VwdEFkZGJhUmVxID0gMTsKKworCXBIVEluZm8tPmJSZWdTaG9ydEdJMjBNSHogPSAxOworCXBIVEluZm8tPmJSZWdTaG9ydEdJNDBNSHogPSAxOworCisJcEhUSW5mby0+YlJlZ0JXNDBNSHogPSAxOworCisJaWYgKHBIVEluZm8tPmJSZWdCVzQwTUh6KQorCQlwSFRJbmZvLT5iUmVnU3VwcENDSyA9IDE7CisJZWxzZQorCQlwSFRJbmZvLT5iUmVnU3VwcENDSyA9IHRydWU7CisKKwlwSFRJbmZvLT5uQU1TRFVfTWF4U2l6ZSA9IDc5MzVVTDsKKwlwSFRJbmZvLT5iQU1TRFVfU3VwcG9ydCA9IDA7CisKKwlwSFRJbmZvLT5iQU1QRFVFbmFibGUgPSAxOworCXBIVEluZm8tPkFNUERVX0ZhY3RvciA9IDI7CisJcEhUSW5mby0+TVBEVV9EZW5zaXR5ID0gMDsKKworCXBIVEluZm8tPlNlbGZNaW1vUHMgPSAzOworCWlmIChwSFRJbmZvLT5TZWxmTWltb1BzID09IDIpCisJCXBIVEluZm8tPlNlbGZNaW1vUHMgPSAzOworCWllZWUtPmJUeERpc2FibGVSYXRlRmFsbEJhY2sgPSAwOworCWllZWUtPmJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZSA9IDA7CisKKwlpZWVlLT5iVHhFbmFibGVGd0NhbGNEdXIgPSAxOworCisJcEhUSW5mby0+YlJlZ1JUMlJUQWdncmVnYXRpb24gPSAxOworCisJcEhUSW5mby0+YlJlZ1J4UmVvcmRlckVuYWJsZSA9IDE7CisJcEhUSW5mby0+UnhSZW9yZGVyV2luU2l6ZSA9IDY0OworCXBIVEluZm8tPlJ4UmVvcmRlclBlbmRpbmdUaW1lID0gMzA7Cit9CisKK3ZvaWQgSFREZWJ1Z0hUQ2FwYWJpbGl0eSh1OCAqQ2FwSUUsIHU4ICpUaXRsZVN0cmluZykKK3sKKworCXN0YXRpYyB1OAlFV0MxMU5IVENhcFtdID0gezB4MDAsIDB4OTAsIDB4NGMsIDB4MzN9OworCXN0cnVjdCBodF9jYXBhYl9lbGUgKnBDYXBFTEU7CisKKwlpZiAoIW1lbWNtcChDYXBJRSwgRVdDMTFOSFRDYXAsIHNpemVvZihFV0MxMU5IVENhcCkpKSB7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICJFV0MgSUUgaW4gJXMoKVxuIiwgX19mdW5jX18pOworCQlwQ2FwRUxFID0gKHN0cnVjdCBodF9jYXBhYl9lbGUgKikoJkNhcElFWzRdKTsKKwl9IGVsc2UKKwkJcENhcEVMRSA9IChzdHJ1Y3QgaHRfY2FwYWJfZWxlICopKCZDYXBJRVswXSk7CisKKwlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAiPExvZyBIVCBDYXBhYmlsaXR5Pi4gQ2FsbGVkIGJ5ICVzXG4iLAorCQkgICAgIFRpdGxlU3RyaW5nKTsKKworCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICAiXHRTdXBwb3J0ZWQgQ2hhbm5lbCBXaWR0aCA9ICVzXG4iLAorCQkgICAgIChwQ2FwRUxFLT5DaGxXaWR0aCkgPyAiMjBNSHoiIDogIjIwLzQwTUh6Iik7CisJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgICJcdFN1cHBvcnQgU2hvcnQgR0kgZm9yIDIwTSA9ICVzXG4iLAorCQkgICAgIChwQ2FwRUxFLT5TaG9ydEdJMjBNaHopID8gIllFUyIgOiAiTk8iKTsKKwlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAgIlx0U3VwcG9ydCBTaG9ydCBHSSBmb3IgNDBNID0gJXNcbiIsCisJCSAgICAgKHBDYXBFTEUtPlNob3J0R0k0ME1oeikgPyAiWUVTIiA6ICJOTyIpOworCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICAiXHRTdXBwb3J0IFRYIFNUQkMgPSAlc1xuIiwKKwkJICAgICAocENhcEVMRS0+VHhTVEJDKSA/ICJZRVMiIDogIk5PIik7CisJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgICJcdE1heCBBTVNEVSBTaXplID0gJXNcbiIsCisJCSAgICAgKHBDYXBFTEUtPk1heEFNU0RVU2l6ZSkgPyAiMzgzOSIgOiAiNzkzNSIpOworCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICAiXHRTdXBwb3J0IENDSyBpbiAyMC80MCBtb2RlID0gJXNcbiIsCisJCSAgICAgKHBDYXBFTEUtPkRzc0NDaykgPyAiWUVTIiA6ICJOTyIpOworCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICAiXHRNYXggQU1QRFUgRmFjdG9yID0gJWRcbiIsCisJCSAgICAgcENhcEVMRS0+TWF4UnhBTVBEVUZhY3Rvcik7CisJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgICJcdE1QRFUgRGVuc2l0eSA9ICVkXG4iLAorCQkgICAgIHBDYXBFTEUtPk1QRFVEZW5zaXR5KTsKKwlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAgIlx0TUNTIFJhdGUgU2V0ID0gWyV4XVsleF1bJXhdWyV4XVsleF1cbiIsCisJCSAgICAgcENhcEVMRS0+TUNTWzBdLCBwQ2FwRUxFLT5NQ1NbMV0sIHBDYXBFTEUtPk1DU1syXSwKKwkJICAgICBwQ2FwRUxFLT5NQ1NbM10sIHBDYXBFTEUtPk1DU1s0XSk7CisJcmV0dXJuOworCit9CisKK3ZvaWQgSFREZWJ1Z0hUSW5mbyh1OCAqSW5mb0lFLCB1OCAqVGl0bGVTdHJpbmcpCit7CisKKwlzdGF0aWMgdTgJRVdDMTFOSFRJbmZvW10gPSB7MHgwMCwgMHg5MCwgMHg0YywgMHgzNH07CisJc3RydWN0IGh0X2luZm9fZWxlICpwSFRJbmZvRWxlOworCisJaWYgKCFtZW1jbXAoSW5mb0lFLCBFV0MxMU5IVEluZm8sIHNpemVvZihFV0MxMU5IVEluZm8pKSkgeworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAiRVdDIElFIGluICVzKClcbiIsIF9fZnVuY19fKTsKKwkJcEhUSW5mb0VsZSA9IChzdHJ1Y3QgaHRfaW5mb19lbGUgKikoJkluZm9JRVs0XSk7CisJfSBlbHNlCisJCXBIVEluZm9FbGUgPSAoc3RydWN0IGh0X2luZm9fZWxlICopKCZJbmZvSUVbMF0pOworCisKKwlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAiPExvZyBIVCBJbmZvcm1hdGlvbiBFbGVtZW50Pi4gIgorCQkgICAgICJDYWxsZWQgYnkgJXNcbiIsIFRpdGxlU3RyaW5nKTsKKworCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICJcdFByaW1hcnkgY2hhbm5lbCA9ICVkXG4iLAorCQkgICAgIHBIVEluZm9FbGUtPkNvbnRyb2xDaGwpOworCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICJcdFNlbm9uZGFyeSBjaGFubmVsID0iKTsKKwlzd2l0Y2ggKHBIVEluZm9FbGUtPkV4dENobE9mZnNldCkgeworCWNhc2UgMDoKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgIk5vdCBQcmVzZW50XG4iKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAiVXBwZXIgY2hhbm5lbFxuIik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgIlJlc2VydmVkLiBFb29ybyEhIVxuIik7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgIkxvd2VyIENoYW5uZWxcbiIpOworCQlicmVhazsKKwl9CisJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgIlx0UmVjb21tZW5kZWQgY2hhbm5lbCB3aWR0aCA9ICVzXG4iLAorCQkgICAgIChwSFRJbmZvRWxlLT5SZWNvbW1lbWRlZFR4V2lkdGgpID8gIjIwTWh6IiA6ICI0ME1oeiIpOworCisJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgIlx0T3BlcmF0aW9uIG1vZGUgZm9yIHByb3RlY3Rpb24gPSAiKTsKKwlzd2l0Y2ggKHBIVEluZm9FbGUtPk9wdE1vZGUpIHsKKwljYXNlIDA6CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICJObyBQcm90ZWN0aW9uXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAiSFQgbm9uLW1lbWJlciBwcm90ZWN0aW9uIG1vZGVcbiIpOworCQlicmVhazsKKwljYXNlIDI6CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICJTdWdnZXN0IHRvIG9wZW4gcHJvdGVjdGlvblxuIik7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgIkhUIG1peGVkIG1vZGVcbiIpOworCQlicmVhazsKKwl9CisKKwlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAiXHRCYXNpYyBNQ1MgUmF0ZSBTZXQgPSBbJXhdWyV4XVsleF1bJXhdIgorCQkgICAgICJbJXhdXG4iLCBwSFRJbmZvRWxlLT5CYXNpY01TQ1swXSwgcEhUSW5mb0VsZS0+QmFzaWNNU0NbMV0sCisJCSAgICAgcEhUSW5mb0VsZS0+QmFzaWNNU0NbMl0sIHBIVEluZm9FbGUtPkJhc2ljTVNDWzNdLAorCQkgICAgIHBIVEluZm9FbGUtPkJhc2ljTVNDWzRdKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBib29sIElzSFRIYWxmTm1vZGU0MEJhbmR3aWR0aChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwlib29sCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwlzdHJ1Y3QgcnRfaGlfdGhyb3VnaHB1dCAqcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisKKwlpZiAocEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPT0gZmFsc2UpCisJCXJldFZhbHVlID0gZmFsc2U7CisJZWxzZSBpZiAocEhUSW5mby0+YlJlZ0JXNDBNSHogPT0gZmFsc2UpCisJCXJldFZhbHVlID0gZmFsc2U7CisJZWxzZSBpZiAoIWllZWUtPkdldEhhbGZObW9kZVN1cHBvcnRCeUFQc0hhbmRsZXIoaWVlZS0+ZGV2KSkKKwkJcmV0VmFsdWUgPSBmYWxzZTsKKwllbHNlIGlmICgoKHN0cnVjdCBodF9jYXBhYl9lbGUgKikocEhUSW5mby0+UGVlckhUQ2FwQnVmKSktPkNobFdpZHRoKQorCQlyZXRWYWx1ZSA9IHRydWU7CisJZWxzZQorCQlyZXRWYWx1ZSA9IGZhbHNlOworCisJcmV0dXJuIHJldFZhbHVlOworfQorCitzdGF0aWMgYm9vbCBJc0hUSGFsZk5tb2RlU0dJKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBib29sIGlzNDBNSHopCit7CisJYm9vbAkJCXJldFZhbHVlID0gZmFsc2U7CisJc3RydWN0IHJ0X2hpX3Rocm91Z2hwdXQgKnBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCisJaWYgKHBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID09IGZhbHNlKQorCQlyZXRWYWx1ZSA9IGZhbHNlOworCWVsc2UgaWYgKCFpZWVlLT5HZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHNIYW5kbGVyKGllZWUtPmRldikpCisJCXJldFZhbHVlID0gZmFsc2U7CisJZWxzZSBpZiAoaXM0ME1IeikgeworCQlpZiAoKChzdHJ1Y3QgaHRfY2FwYWJfZWxlICopCisJCSAgICAocEhUSW5mby0+UGVlckhUQ2FwQnVmKSktPlNob3J0R0k0ME1oeikKKwkJCXJldFZhbHVlID0gdHJ1ZTsKKwkJZWxzZQorCQkJcmV0VmFsdWUgPSBmYWxzZTsKKwl9IGVsc2UgeworCQlpZiAoKChzdHJ1Y3QgaHRfY2FwYWJfZWxlICopCisJCSAgIChwSFRJbmZvLT5QZWVySFRDYXBCdWYpKS0+U2hvcnRHSTIwTWh6KQorCQkJcmV0VmFsdWUgPSB0cnVlOworCQllbHNlCisJCQlyZXRWYWx1ZSA9IGZhbHNlOworCX0KKworCXJldHVybiByZXRWYWx1ZTsKK30KKwordTE2IEhUSGFsZk1jc1RvRGF0YVJhdGUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHU4IG5NY3NSYXRlKQoreworCisJdTgJaXM0ME1IejsKKwl1OAlpc1Nob3J0R0k7CisKKwlpczQwTUh6ICA9ICAoSXNIVEhhbGZObW9kZTQwQmFuZHdpZHRoKGllZWUpKSA/IDEgOiAwOworCWlzU2hvcnRHSSA9IChJc0hUSGFsZk5tb2RlU0dJKGllZWUsIGlzNDBNSHopKSA/IDEgOiAwOworCisJcmV0dXJuIE1DU19EQVRBX1JBVEVbaXM0ME1Iel1baXNTaG9ydEdJXVsobk1jc1JhdGUgJiAweDdmKV07Cit9CisKKwordTE2IEhUTWNzVG9EYXRhUmF0ZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggbk1jc1JhdGUpCit7CisJc3RydWN0IHJ0X2hpX3Rocm91Z2hwdXQgKnBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCisJdTgJaXM0ME1IeiA9IChwSFRJbmZvLT5iQ3VyQlc0ME1IeikgPyAxIDogMDsKKwl1OAlpc1Nob3J0R0kgPSAocEhUSW5mby0+YkN1ckJXNDBNSHopID8KKwkJCSAgICAoKHBIVEluZm8tPmJDdXJTaG9ydEdJNDBNSHopID8gMSA6IDApIDoKKwkJCSAgICAoKHBIVEluZm8tPmJDdXJTaG9ydEdJMjBNSHopID8gMSA6IDApOworCXJldHVybiBNQ1NfREFUQV9SQVRFW2lzNDBNSHpdW2lzU2hvcnRHSV1bKG5NY3NSYXRlICYgMHg3ZildOworfQorCit1MTYgIFR4Q291bnRUb0RhdGFSYXRlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCBuRGF0YVJhdGUpCit7CisJdTE2CUNDS09GRE1SYXRlWzEyXSA9IHsweDAyLCAweDA0LCAweDBiLCAweDE2LCAweDBjLCAweDEyLCAweDE4LAorCQkJCSAgIDB4MjQsIDB4MzAsIDB4NDgsIDB4NjAsIDB4NmN9OworCXU4CWlzNDBNSHogPSAwOworCXU4CWlzU2hvcnRHSSA9IDA7CisKKwlpZiAobkRhdGFSYXRlIDwgMTIpIHsKKwkJcmV0dXJuIENDS09GRE1SYXRlW25EYXRhUmF0ZV07CisJfSBlbHNlIHsKKwkJaWYgKG5EYXRhUmF0ZSA+PSAweDEwICYmIG5EYXRhUmF0ZSA8PSAweDFmKSB7CisJCQlpczQwTUh6ID0gMDsKKwkJCWlzU2hvcnRHSSA9IDA7CisJCX0gZWxzZSBpZiAobkRhdGFSYXRlID49IDB4MjAgICYmIG5EYXRhUmF0ZSA8PSAweDJmKSB7CisJCQlpczQwTUh6ID0gMTsKKwkJCWlzU2hvcnRHSSA9IDA7CisKKwkJfSBlbHNlIGlmIChuRGF0YVJhdGUgPj0gMHgzMCAgJiYgbkRhdGFSYXRlIDw9IDB4M2YpIHsKKwkJCWlzNDBNSHogPSAwOworCQkJaXNTaG9ydEdJID0gMTsKKwkJfSBlbHNlIGlmIChuRGF0YVJhdGUgPj0gMHg0MCAgJiYgbkRhdGFSYXRlIDw9IDB4NGYpIHsKKwkJCWlzNDBNSHogPSAxOworCQkJaXNTaG9ydEdJID0gMTsKKwkJfQorCQlyZXR1cm4gTUNTX0RBVEFfUkFURVtpczQwTUh6XVtpc1Nob3J0R0ldW25EYXRhUmF0ZSYweGZdOworCX0KK30KKworYm9vbCBJc0hUSGFsZk5tb2RlQVBzKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQoreworCWJvb2wJCQlyZXRWYWx1ZSA9IGZhbHNlOworCXN0cnVjdCBydGxsaWJfbmV0d29yayAqbmV0ID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKKworCWlmICgobWVtY21wKG5ldC0+YnNzaWQsIEJFTEtJTkY1RDgyMzNWMV9SQUxJTkssIDMpID09IDApIHx8CisJICAgIChtZW1jbXAobmV0LT5ic3NpZCwgQkVMS0lORjVEODIzMzRWM19SQUxJTkssIDMpID09IDApIHx8CisJICAgIChtZW1jbXAobmV0LT5ic3NpZCwgUENJX1JBTElOSywgMykgPT0gMCkgfHwKKwkgICAgKG1lbWNtcChuZXQtPmJzc2lkLCBFRElNQVhfUkFMSU5LLCAzKSA9PSAwKSB8fAorCSAgICAobWVtY21wKG5ldC0+YnNzaWQsIEFJUkxJTktfUkFMSU5LLCAzKSA9PSAwKSB8fAorCSAgICAobmV0LT5yYWxpbmtfY2FwX2V4aXN0KSkKKwkJcmV0VmFsdWUgPSB0cnVlOworCWVsc2UgaWYgKCFtZW1jbXAobmV0LT5ic3NpZCwgVU5LTk9XTl9CT1JBRENPTSwgMykgfHwKKwkJIW1lbWNtcChuZXQtPmJzc2lkLCBMSU5LU1lTV1JUMzMwX0xJTktTWVNXUlQzMDBfQlJPQURDT00sIDMpIHx8CisJCSFtZW1jbXAobmV0LT5ic3NpZCwgTElOS1NZU1dSVDM1MF9MSU5LU1lTV1JUMTUwX0JST0FEQ09NLCAzKSB8fAorCQkobmV0LT5icm9hZGNvbV9jYXBfZXhpc3QpKQorCQlyZXRWYWx1ZSA9IHRydWU7CisJZWxzZSBpZiAobmV0LT5ic3NodC5iZFJUMlJUQWdncmVnYXRpb24pCisJCXJldFZhbHVlID0gdHJ1ZTsKKwllbHNlCisJCXJldFZhbHVlID0gZmFsc2U7CisKKwlyZXR1cm4gcmV0VmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIEhUSU9UUGVlckRldGVybWluZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3QgcnRfaGlfdGhyb3VnaHB1dCAqcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisJc3RydWN0IHJ0bGxpYl9uZXR3b3JrICpuZXQgPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOworCWlmIChuZXQtPmJzc2h0LmJkUlQyUlRBZ2dyZWdhdGlvbikgeworCQlwSFRJbmZvLT5JT1RQZWVyID0gSFRfSU9UX1BFRVJfUkVBTFRFSzsKKwkJaWYgKG5ldC0+YnNzaHQuUlQyUlRfSFRfTW9kZSAmIFJUX0hUX0NBUF9VU0VfOTJTRSkKKwkJCXBIVEluZm8tPklPVFBlZXIgPSBIVF9JT1RfUEVFUl9SRUFMVEVLXzkyU0U7CisJCWlmIChuZXQtPmJzc2h0LlJUMlJUX0hUX01vZGUgJiBSVF9IVF9DQVBfVVNFX1NPRlRBUCkKKwkJCXBIVEluZm8tPklPVFBlZXIgPSBIVF9JT1RfUEVFUl85MlVfU09GVEFQOworCX0gZWxzZSBpZiAobmV0LT5icm9hZGNvbV9jYXBfZXhpc3QpCisJCXBIVEluZm8tPklPVFBlZXIgPSBIVF9JT1RfUEVFUl9CUk9BRENPTTsKKwllbHNlIGlmICghbWVtY21wKG5ldC0+YnNzaWQsIFVOS05PV05fQk9SQURDT00sIDMpIHx8CisJCSAhbWVtY21wKG5ldC0+YnNzaWQsIExJTktTWVNXUlQzMzBfTElOS1NZU1dSVDMwMF9CUk9BRENPTSwgMykgfHwKKwkJICFtZW1jbXAobmV0LT5ic3NpZCwgTElOS1NZU1dSVDM1MF9MSU5LU1lTV1JUMTUwX0JST0FEQ09NLCAzKSkKKwkJcEhUSW5mby0+SU9UUGVlciA9IEhUX0lPVF9QRUVSX0JST0FEQ09NOworCWVsc2UgaWYgKChtZW1jbXAobmV0LT5ic3NpZCwgQkVMS0lORjVEODIzM1YxX1JBTElOSywgMykgPT0gMCkgfHwKKwkJIChtZW1jbXAobmV0LT5ic3NpZCwgQkVMS0lORjVEODIzMzRWM19SQUxJTkssIDMpID09IDApIHx8CisJCSAobWVtY21wKG5ldC0+YnNzaWQsIFBDSV9SQUxJTkssIDMpID09IDApIHx8CisJCSAobWVtY21wKG5ldC0+YnNzaWQsIEVESU1BWF9SQUxJTkssIDMpID09IDApIHx8CisJCSAobWVtY21wKG5ldC0+YnNzaWQsIEFJUkxJTktfUkFMSU5LLCAzKSA9PSAwKSB8fAorCQkgIG5ldC0+cmFsaW5rX2NhcF9leGlzdCkKKwkJcEhUSW5mby0+SU9UUGVlciA9IEhUX0lPVF9QRUVSX1JBTElOSzsKKwllbHNlIGlmICgobmV0LT5hdGhlcm9zX2NhcF9leGlzdCkgfHwKKwkJKG1lbWNtcChuZXQtPmJzc2lkLCBETElOS19BVEhFUk9TXzEsIDMpID09IDApIHx8CisJCShtZW1jbXAobmV0LT5ic3NpZCwgRExJTktfQVRIRVJPU18yLCAzKSA9PSAwKSkKKwkJcEhUSW5mby0+SU9UUGVlciA9IEhUX0lPVF9QRUVSX0FUSEVST1M7CisJZWxzZSBpZiAoKG1lbWNtcChuZXQtPmJzc2lkLCBDSVNDT19CUk9BRENPTSwgMykgPT0gMCkgfHwKKwkJICBuZXQtPmNpc2NvX2NhcF9leGlzdCkKKwkJcEhUSW5mby0+SU9UUGVlciA9IEhUX0lPVF9QRUVSX0NJU0NPOworCWVsc2UgaWYgKChtZW1jbXAobmV0LT5ic3NpZCwgTElOS1NZU19NQVJWRUxMXzQ0MDBOLCAzKSA9PSAwKSB8fAorCQkgIG5ldC0+bWFydmVsbF9jYXBfZXhpc3QpCisJCXBIVEluZm8tPklPVFBlZXIgPSBIVF9JT1RfUEVFUl9NQVJWRUxMOworCWVsc2UgaWYgKG5ldC0+YWlyZ29fY2FwX2V4aXN0KQorCQlwSFRJbmZvLT5JT1RQZWVyID0gSFRfSU9UX1BFRVJfQUlSR087CisJZWxzZQorCQlwSFRJbmZvLT5JT1RQZWVyID0gSFRfSU9UX1BFRVJfVU5LTk9XTjsKKworCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSU9ULCAiSm9zZXBoIGRlYnVnISEgSU9UUEVFUjogJXhcbiIsCisJCSAgICAgcEhUSW5mby0+SU9UUGVlcik7Cit9CisKK3N0YXRpYyB1OCBIVElPVEFjdElzRGlzYWJsZU1DUzE0KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCAqUGVlck1hY0FkZHIpCit7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGJvb2wgSFRJT1RBY3RJc0Rpc2FibGVNQ1MxNShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwlib29sIHJldFZhbHVlID0gZmFsc2U7CisKKwlyZXR1cm4gcmV0VmFsdWU7Cit9CisKK3N0YXRpYyBib29sIEhUSU9UQWN0SXNEaXNhYmxlTUNTVHdvU3BhdGlhbFN0cmVhbShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB1OCBIVElPVEFjdElzRGlzYWJsZUVEQ0FUdXJibyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggKlBlZXJNYWNBZGRyKQoreworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHU4IEhUSU9UQWN0SXNNZ250VXNlQ0NLNk0oc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkJIHN0cnVjdCBydGxsaWJfbmV0d29yayAqbmV0d29yaykKK3sKKwl1OAlyZXRWYWx1ZSA9IDA7CisKKworCWlmIChpZWVlLT5wSFRJbmZvLT5JT1RQZWVyID09IEhUX0lPVF9QRUVSX0JST0FEQ09NKQorCQlyZXRWYWx1ZSA9IDE7CisKKwlyZXR1cm4gcmV0VmFsdWU7Cit9CisKK3N0YXRpYyB1OCBIVElPVEFjdElzQ0NERnN5bmMoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJdTgJcmV0VmFsdWUgPSAwOworCisJaWYgKGllZWUtPnBIVEluZm8tPklPVFBlZXIgPT0gSFRfSU9UX1BFRVJfQlJPQURDT00pCisJCXJldFZhbHVlID0gMTsKKwlyZXR1cm4gcmV0VmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIEhUSU9UQWN0RGV0ZXJtaW5lUmFGdW5jKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBib29sIGJQZWVyUngyc3MpCit7CisJc3RydWN0IHJ0X2hpX3Rocm91Z2hwdXQgKnBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCXBIVEluZm8tPklPVFJhRnVuYyAmPSBIVF9JT1RfUkFGVU5DX0RJU0FCTEVfQUxMOworCisJaWYgKHBIVEluZm8tPklPVFBlZXIgPT0gSFRfSU9UX1BFRVJfUkFMSU5LICYmICFiUGVlclJ4MnNzKQorCQlwSFRJbmZvLT5JT1RSYUZ1bmMgfD0gSFRfSU9UX1JBRlVOQ19QRUVSXzFSOworCisJaWYgKHBIVEluZm8tPklPVEFjdGlvbiAmIEhUX0lPVF9BQ1RfQU1TRFVfRU5BQkxFKQorCQlwSFRJbmZvLT5JT1RSYUZ1bmMgfD0gSFRfSU9UX1JBRlVOQ19UWF9BTVNEVTsKKworfQorCit2b2lkIEhUUmVzZXRJT1RTZXR0aW5nKHN0cnVjdCBydF9oaV90aHJvdWdocHV0ICpwSFRJbmZvKQoreworCXBIVEluZm8tPklPVEFjdGlvbiA9IDA7CisJcEhUSW5mby0+SU9UUGVlciA9IEhUX0lPVF9QRUVSX1VOS05PV047CisJcEhUSW5mby0+SU9UUmFGdW5jID0gMDsKK30KKwordm9pZCBIVENvbnN0cnVjdENhcGFiaWxpdHlFbGVtZW50KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCAqcG9zSFRDYXAsCisJCQkJICB1OCAqbGVuLCB1OCBJc0VuY3J5cHQsIGJvb2wgYkFzc29jKQoreworCXN0cnVjdCBydF9oaV90aHJvdWdocHV0ICpwSFQgPSBpZWVlLT5wSFRJbmZvOworCXN0cnVjdCBodF9jYXBhYl9lbGUgKnBDYXBFTEUgPSBOVUxMOworCisJaWYgKChwb3NIVENhcCA9PSBOVUxMKSB8fCAocEhUID09IE5VTEwpKSB7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAicG9zSFRDYXAgb3IgcEhUSW5mbyBjYW4ndCBiZSAiCisJCQkgICAgICJudWxsIGluIEhUQ29uc3RydWN0Q2FwYWJpbGl0eUVsZW1lbnQoKVxuIik7CisJCXJldHVybjsKKwl9CisJbWVtc2V0KHBvc0hUQ2FwLCAwLCAqbGVuKTsKKworCWlmICgoYkFzc29jKSAmJiAocEhULT5lUGVlckhUU3BlY1ZlciA9PSBIVF9TUEVDX1ZFUl9FV0MpKSB7CisJCXU4CUVXQzExTkhUQ2FwW10gPSB7MHgwMCwgMHg5MCwgMHg0YywgMHgzM307CisJCW1lbWNweShwb3NIVENhcCwgRVdDMTFOSFRDYXAsIHNpemVvZihFV0MxMU5IVENhcCkpOworCQlwQ2FwRUxFID0gKHN0cnVjdCBodF9jYXBhYl9lbGUgKikmKHBvc0hUQ2FwWzRdKTsKKwkJKmxlbiA9IDMwICsgMjsKKwl9IGVsc2UgeworCQlwQ2FwRUxFID0gKHN0cnVjdCBodF9jYXBhYl9lbGUgKilwb3NIVENhcDsKKwkJKmxlbiA9IDI2ICsgMjsKKwl9CisKKwlwQ2FwRUxFLT5BZHZDb2RpbmcJCT0gMDsKKwlpZiAoaWVlZS0+R2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzSGFuZGxlcihpZWVlLT5kZXYpKQorCQlwQ2FwRUxFLT5DaGxXaWR0aCA9IDA7CisJZWxzZQorCQlwQ2FwRUxFLT5DaGxXaWR0aCA9IChwSFQtPmJSZWdCVzQwTUh6ID8gMSA6IDApOworCisJcENhcEVMRS0+TWltb1B3clNhdmUJCT0gcEhULT5TZWxmTWltb1BzOworCXBDYXBFTEUtPkdyZWVuRmllbGQJCT0gMDsKKwlwQ2FwRUxFLT5TaG9ydEdJMjBNaHoJCT0gMTsKKwlwQ2FwRUxFLT5TaG9ydEdJNDBNaHoJCT0gMTsKKworCXBDYXBFTEUtPlR4U1RCQwkJCT0gMTsKKwlwQ2FwRUxFLT5SeFNUQkMJCQk9IDA7CisJcENhcEVMRS0+RGVsYXlCQQkJPSAwOworCXBDYXBFTEUtPk1heEFNU0RVU2l6ZSA9IChNQVhfUkVDRUlWRV9CVUZGRVJfU0laRSA+PSA3OTM1KSA/IDEgOiAwOworCXBDYXBFTEUtPkRzc0NDayA9ICgocEhULT5iUmVnQlc0ME1IeikgPyAocEhULT5iUmVnU3VwcENDSyA/IDEgOiAwKSA6IDApOworCXBDYXBFTEUtPlBTTVAgPSAwOworCXBDYXBFTEUtPkxTaWdUeG9wUHJvdGVjdCA9IDA7CisKKworCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICJUWCBIVCBjYXAvaW5mbyBlbGUgQlc9JWQgTWF4QU1TRFVTaXplOiVkICIKKwkJICAgICAiRHNzQ0NrOiVkXG4iLCBwQ2FwRUxFLT5DaGxXaWR0aCwgcENhcEVMRS0+TWF4QU1TRFVTaXplLAorCQkgICAgIHBDYXBFTEUtPkRzc0NDayk7CisKKwlpZiAoSXNFbmNyeXB0KSB7CisJCXBDYXBFTEUtPk1QRFVEZW5zaXR5CT0gNzsKKwkJcENhcEVMRS0+TWF4UnhBTVBEVUZhY3Rvcgk9IDI7CisJfSBlbHNlIHsKKwkJcENhcEVMRS0+TWF4UnhBTVBEVUZhY3Rvcgk9IDM7CisJCXBDYXBFTEUtPk1QRFVEZW5zaXR5CT0gMDsKKwl9CisKKwltZW1jcHkocENhcEVMRS0+TUNTLCBpZWVlLT5SZWdkb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0LCAxNik7CisJbWVtc2V0KCZwQ2FwRUxFLT5FeHRIVENhcEluZm8sIDAsIDIpOworCW1lbXNldChwQ2FwRUxFLT5UeEJGQ2FwLCAwLCA0KTsKKworCXBDYXBFTEUtPkFTQ2FwID0gMDsKKworCWlmIChiQXNzb2MpIHsKKwkJaWYgKHBIVC0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9ESVNBQkxFX01DUzE1KQorCQkJcENhcEVMRS0+TUNTWzFdICY9IDB4N2Y7CisKKwkJaWYgKHBIVC0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9ESVNBQkxFX01DUzE0KQorCQkJcENhcEVMRS0+TUNTWzFdICY9IDB4YmY7CisKKwkJaWYgKHBIVC0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9ESVNBQkxFX0FMTF8yU1MpCisJCQlwQ2FwRUxFLT5NQ1NbMV0gJj0gMHgwMDsKKworCQlpZiAocEhULT5JT1RBY3Rpb24gJiBIVF9JT1RfQUNUX0RJU0FCTEVfUlhfNDBNSFpfU0hPUlRfR0kpCisJCQlwQ2FwRUxFLT5TaG9ydEdJNDBNaHoJCT0gMDsKKworCQlpZiAoaWVlZS0+R2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzSGFuZGxlcihpZWVlLT5kZXYpKSB7CisJCQlwQ2FwRUxFLT5DaGxXaWR0aCA9IDA7CisJCQlwQ2FwRUxFLT5NQ1NbMV0gPSAwOworCQl9CisJfQorCXJldHVybjsKK30KKwordm9pZCBIVENvbnN0cnVjdEluZm9FbGVtZW50KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCAqcG9zSFRJbmZvLAorCQkJICAgIHU4ICpsZW4sIHU4IElzRW5jcnlwdCkKK3sKKwlzdHJ1Y3QgcnRfaGlfdGhyb3VnaHB1dCAqcEhUID0gaWVlZS0+cEhUSW5mbzsKKwlzdHJ1Y3QgaHRfaW5mb19lbGUgKnBIVEluZm9FbGUgPSAoc3RydWN0IGh0X2luZm9fZWxlICopcG9zSFRJbmZvOworCWlmICgocG9zSFRJbmZvID09IE5VTEwpIHx8IChwSFRJbmZvRWxlID09IE5VTEwpKSB7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAicG9zSFRJbmZvIG9yIHBIVEluZm9FbGUgY2FuJ3QgYmUgIgorCQkJICAgICAibnVsbCBpbiBIVENvbnN0cnVjdEluZm9FbGVtZW50KClcbiIpOworCQlyZXR1cm47CisJfQorCisJbWVtc2V0KHBvc0hUSW5mbywgMCwgKmxlbik7CisJaWYgKChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHx8CisJICAgIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSkgeworCQlwSFRJbmZvRWxlLT5Db250cm9sQ2hsCT0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWw7CisJCXBIVEluZm9FbGUtPkV4dENobE9mZnNldCA9ICgocEhULT5iUmVnQlc0ME1IeiA9PSBmYWxzZSkgPworCQkJCQkgICAgSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUIDoKKwkJCQkJICAgIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA8PSA2KQorCQkJCQkgICAgPyBIVF9FWFRDSE5MX09GRlNFVF9VUFBFUiA6CisJCQkJCSAgICBIVF9FWFRDSE5MX09GRlNFVF9MT1dFUik7CisJCXBIVEluZm9FbGUtPlJlY29tbWVtZGVkVHhXaWR0aAk9IHBIVC0+YlJlZ0JXNDBNSHo7CisJCXBIVEluZm9FbGUtPlJJRlMJCQk9IDA7CisJCXBIVEluZm9FbGUtPlBTTVBBY2Nlc3NPbmx5CQk9IDA7CisJCXBIVEluZm9FbGUtPlNydkludEdyYW51bGFyaXR5CQk9IDA7CisJCXBIVEluZm9FbGUtPk9wdE1vZGUJCQk9IHBIVC0+Q3VycmVudE9wTW9kZTsKKwkJcEhUSW5mb0VsZS0+Tm9uR0ZEZXZQcmVzZW50CQk9IDA7CisJCXBIVEluZm9FbGUtPkR1YWxCZWFjb24JCQk9IDA7CisJCXBIVEluZm9FbGUtPlNlY29uZGFyeUJlYWNvbgkJPSAwOworCQlwSFRJbmZvRWxlLT5MU2lnVHhvcFByb3RlY3RGdWxsCQk9IDA7CisJCXBIVEluZm9FbGUtPlBjb0FjdGl2ZQkJCT0gMDsKKwkJcEhUSW5mb0VsZS0+UGNvUGhhc2UJCQk9IDA7CisKKwkJbWVtc2V0KHBIVEluZm9FbGUtPkJhc2ljTVNDLCAwLCAxNik7CisKKworCQkqbGVuID0gMjIgKyAyOworCisJfSBlbHNlIHsKKwkJKmxlbiA9IDA7CisJfQorCXJldHVybjsKK30KKwordm9pZCBIVENvbnN0cnVjdFJUMlJUQWdnRWxlbWVudChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggKnBvc1JUMlJUQWdnLAorCQkJCXU4ICpsZW4pCit7CisJaWYgKHBvc1JUMlJUQWdnID09IE5VTEwpIHsKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICJwb3NSVDJSVEFnZyBjYW4ndCBiZSBudWxsIGluICIKKwkJCSAgICAgIkhUQ29uc3RydWN0UlQyUlRBZ2dFbGVtZW50KClcbiIpOworCQlyZXR1cm47CisJfQorCW1lbXNldChwb3NSVDJSVEFnZywgMCwgKmxlbik7CisJKnBvc1JUMlJUQWdnKysgPSAweDAwOworCSpwb3NSVDJSVEFnZysrID0gMHhlMDsKKwkqcG9zUlQyUlRBZ2crKyA9IDB4NGM7CisJKnBvc1JUMlJUQWdnKysgPSAweDAyOworCSpwb3NSVDJSVEFnZysrID0gMHgwMTsKKworCSpwb3NSVDJSVEFnZyA9IDB4MzA7CisKKwlpZiAoaWVlZS0+YlN1cHBvcnRSZW1vdGVXYWtlVXApCisJCSpwb3NSVDJSVEFnZyB8PSBSVF9IVF9DQVBfVVNFX1dPVzsKKworCSpsZW4gPSA2ICsgMjsKKworCXJldHVybjsKK30KKworc3RhdGljIHU4IEhUX1BpY2tNQ1NSYXRlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCAqcE9wZXJhdGVNQ1MpCit7CisJdTggaTsKKwlpZiAocE9wZXJhdGVNQ1MgPT0gTlVMTCkgeworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgInBPcGVyYXRlTUNTIGNhbid0IGJlIG51bGwiCisJCQkgICAgICIgaW4gSFRfUGlja01DU1JhdGUoKVxuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlzd2l0Y2ggKGllZWUtPm1vZGUpIHsKKwljYXNlIElFRUVfQToKKwljYXNlIElFRUVfQjoKKwljYXNlIElFRUVfRzoKKwkJZm9yIChpID0gMDsgaSA8PSAxNTsgaSsrKQorCQkJcE9wZXJhdGVNQ1NbaV0gPSAwOworCQlicmVhazsKKwljYXNlIElFRUVfTl8yNEc6CisJY2FzZSBJRUVFX05fNUc6CisJCXBPcGVyYXRlTUNTWzBdICY9IFJBVEVfQURQVF8xU1NfTUFTSzsKKwkJcE9wZXJhdGVNQ1NbMV0gJj0gUkFURV9BRFBUXzJTU19NQVNLOworCQlwT3BlcmF0ZU1DU1szXSAmPSBSQVRFX0FEUFRfTUNTMzJfTUFTSzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwordTggSFRHZXRIaWdoZXN0TUNTUmF0ZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggKnBNQ1NSYXRlU2V0LAorCQkgICAgICAgdTggKnBNQ1NGaWx0ZXIpCit7CisJdTgJCWksIGo7CisJdTgJCWJpdE1hcDsKKwl1OAkJbWNzUmF0ZSA9IDA7CisJdTgJCWF2YWlsYWJsZU1jc1JhdGVbMTZdOworCWlmIChwTUNTUmF0ZVNldCA9PSBOVUxMIHx8IHBNQ1NGaWx0ZXIgPT0gTlVMTCkgeworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgInBNQ1NSYXRlU2V0IG9yIHBNQ1NGaWx0ZXIgY2FuJ3QgIgorCQkJICAgICAiYmUgbnVsbCBpbiBIVEdldEhpZ2hlc3RNQ1NSYXRlKClcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlhdmFpbGFibGVNY3NSYXRlW2ldID0gcE1DU1JhdGVTZXRbaV0gJiBwTUNTRmlsdGVyW2ldOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJaWYgKGF2YWlsYWJsZU1jc1JhdGVbaV0gIT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSAxNikKKwkJcmV0dXJuIGZhbHNlOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJaWYgKGF2YWlsYWJsZU1jc1JhdGVbaV0gIT0gMCkgeworCQkJYml0TWFwID0gYXZhaWxhYmxlTWNzUmF0ZVtpXTsKKwkJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJCQlpZiAoKGJpdE1hcCUyKSAhPSAwKSB7CisJCQkJCWlmIChIVE1jc1RvRGF0YVJhdGUoaWVlZSwgKDgqaStqKSkgPgorCQkJCQkgICAgSFRNY3NUb0RhdGFSYXRlKGllZWUsIG1jc1JhdGUpKQorCQkJCQkJbWNzUmF0ZSA9ICg4Kmkraik7CisJCQkJfQorCQkJCWJpdE1hcCA9IGJpdE1hcD4+MTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gbWNzUmF0ZSB8IDB4ODA7Cit9CisKK3U4IEhURmlsdGVyTUNTUmF0ZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggKnBTdXBwb3J0TUNTLCB1OCAqcE9wZXJhdGVNQ1MpCit7CisKKwl1OCBpOworCisJZm9yIChpID0gMDsgaSA8PSAxNTsgaSsrKQorCQlwT3BlcmF0ZU1DU1tpXSA9IGllZWUtPlJlZ2RvdDExVHhIVE9wZXJhdGlvbmFsUmF0ZVNldFtpXSAmCisJCQkJIHBTdXBwb3J0TUNTW2ldOworCisJSFRfUGlja01DU1JhdGUoaWVlZSwgcE9wZXJhdGVNQ1MpOworCisJaWYgKGllZWUtPkdldEhhbGZObW9kZVN1cHBvcnRCeUFQc0hhbmRsZXIoaWVlZS0+ZGV2KSkKKwkJcE9wZXJhdGVNQ1NbMV0gPSAwOworCisJZm9yIChpID0gMjsgaSA8PSAxNTsgaSsrKQorCQlwT3BlcmF0ZU1DU1tpXSA9IDA7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBIVFNldENvbm5lY3RCd01vZGUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQllbnVtIGh0X2NoYW5uZWxfd2lkdGggQmFuZHdpZHRoLAorCQkJZW51bSBodF9leHRjaG5sX29mZnNldCBPZmZzZXQpOworCit2b2lkIEhUT25Bc3NvY1JzcChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3QgcnRfaGlfdGhyb3VnaHB1dCAqcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisJc3RydWN0IGh0X2NhcGFiX2VsZSAqcFBlZXJIVENhcCA9IE5VTEw7CisJc3RydWN0IGh0X2luZm9fZWxlICpwUGVlckhUSW5mbyA9IE5VTEw7CisJdTE2IG5NYXhBTVNEVVNpemUgPSAwOworCXU4ICpwTWNzRmlsdGVyID0gTlVMTDsKKworCXN0YXRpYyB1OCBFV0MxMU5IVENhcFtdID0gezB4MDAsIDB4OTAsIDB4NGMsIDB4MzN9OworCXN0YXRpYyB1OCBFV0MxMU5IVEluZm9bXSA9IHsweDAwLCAweDkwLCAweDRjLCAweDM0fTsKKworCWlmIChwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9PSBmYWxzZSkgeworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgIjw9PT0gSFRPbkFzc29jUnNwKCk6ICIKKwkJCSAgICAgIkhUX0RJU0FCTEVcbiIpOworCQlyZXR1cm47CisJfQorCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICI9PT0+IEhUT25Bc3NvY1JzcF93cSgpOiBIVF9FTkFCTEVcbiIpOworCisJaWYgKCFtZW1jbXAocEhUSW5mby0+UGVlckhUQ2FwQnVmLCBFV0MxMU5IVENhcCwgc2l6ZW9mKEVXQzExTkhUQ2FwKSkpCisJCXBQZWVySFRDYXAgPSAoc3RydWN0IGh0X2NhcGFiX2VsZSAqKSgmcEhUSW5mby0+UGVlckhUQ2FwQnVmWzRdKTsKKwllbHNlCisJCXBQZWVySFRDYXAgPSAoc3RydWN0IGh0X2NhcGFiX2VsZSAqKShwSFRJbmZvLT5QZWVySFRDYXBCdWYpOworCisJaWYgKCFtZW1jbXAocEhUSW5mby0+UGVlckhUSW5mb0J1ZiwgRVdDMTFOSFRJbmZvLCBzaXplb2YoRVdDMTFOSFRJbmZvKSkpCisJCXBQZWVySFRJbmZvID0gKHN0cnVjdCBodF9pbmZvX2VsZSAqKQorCQkJICAgICAoJnBIVEluZm8tPlBlZXJIVEluZm9CdWZbNF0pOworCWVsc2UKKwkJcFBlZXJIVEluZm8gPSAoc3RydWN0IGh0X2luZm9fZWxlICopKHBIVEluZm8tPlBlZXJIVEluZm9CdWYpOworCisJUlRMTElCX0RFQlVHX0RBVEEoUlRMTElCX0RMX0RBVEEgfCBSVExMSUJfRExfSFQsIHBQZWVySFRDYXAsCisJCQkgIHNpemVvZihzdHJ1Y3QgaHRfY2FwYWJfZWxlKSk7CisJSFRTZXRDb25uZWN0QndNb2RlKGllZWUsIChlbnVtIGh0X2NoYW5uZWxfd2lkdGgpKHBQZWVySFRDYXAtPkNobFdpZHRoKSwKKwkJCSAgKGVudW0gaHRfZXh0Y2hubF9vZmZzZXQpKHBQZWVySFRJbmZvLT5FeHRDaGxPZmZzZXQpKTsKKwlwSFRJbmZvLT5iQ3VyVHhCVzQwTUh6ID0gKChwUGVlckhUSW5mby0+UmVjb21tZW1kZWRUeFdpZHRoID09IDEpID8KKwkJCQkgdHJ1ZSA6IGZhbHNlKTsKKworCXBIVEluZm8tPmJDdXJTaG9ydEdJMjBNSHogPSAoKHBIVEluZm8tPmJSZWdTaG9ydEdJMjBNSHopID8KKwkJCQkgICAgKChwUGVlckhUQ2FwLT5TaG9ydEdJMjBNaHogPT0gMSkgPworCQkJCSAgICB0cnVlIDogZmFsc2UpIDogZmFsc2UpOworCXBIVEluZm8tPmJDdXJTaG9ydEdJNDBNSHogPSAoKHBIVEluZm8tPmJSZWdTaG9ydEdJNDBNSHopID8KKwkJCQkgICAgICgocFBlZXJIVENhcC0+U2hvcnRHSTQwTWh6ID09IDEpID8KKwkJCQkgICAgIHRydWUgOiBmYWxzZSkgOiBmYWxzZSk7CisKKwlwSFRJbmZvLT5iQ3VyU3VwcENDSyA9ICgocEhUSW5mby0+YlJlZ1N1cHBDQ0spID8KKwkJCSAgICAgICAoKHBQZWVySFRDYXAtPkRzc0NDayA9PSAxKSA/IHRydWUgOgorCQkJICAgICAgIGZhbHNlKSA6IGZhbHNlKTsKKworCisJcEhUSW5mby0+YkN1cnJlbnRfQU1TRFVfU3VwcG9ydCA9IHBIVEluZm8tPmJBTVNEVV9TdXBwb3J0OworCisJbk1heEFNU0RVU2l6ZSA9IChwUGVlckhUQ2FwLT5NYXhBTVNEVVNpemUgPT0gMCkgPyAzODM5IDogNzkzNTsKKworCWlmIChwSFRJbmZvLT5uQU1TRFVfTWF4U2l6ZSA+IG5NYXhBTVNEVVNpemUpCisJCXBIVEluZm8tPm5DdXJyZW50X0FNU0RVX01heFNpemUgPSBuTWF4QU1TRFVTaXplOworCWVsc2UKKwkJcEhUSW5mby0+bkN1cnJlbnRfQU1TRFVfTWF4U2l6ZSA9IHBIVEluZm8tPm5BTVNEVV9NYXhTaXplOworCisJcEhUSW5mby0+YkN1cnJlbnRBTVBEVUVuYWJsZSA9IHBIVEluZm8tPmJBTVBEVUVuYWJsZTsKKwlpZiAoaWVlZS0+cnRsbGliX2FwX3NlY190eXBlICYmCisJICAgKGllZWUtPnJ0bGxpYl9hcF9zZWNfdHlwZShpZWVlKSYoU0VDX0FMR19XRVB8U0VDX0FMR19US0lQKSkpIHsKKwkJaWYgKChwSFRJbmZvLT5JT1RQZWVyID09IEhUX0lPVF9QRUVSX0FUSEVST1MpIHx8CisJCQkJKHBIVEluZm8tPklPVFBlZXIgPT0gSFRfSU9UX1BFRVJfVU5LTk9XTikpCisJCQlwSFRJbmZvLT5iQ3VycmVudEFNUERVRW5hYmxlID0gZmFsc2U7CisJfQorCisJaWYgKCFwSFRJbmZvLT5iUmVnUlQyUlRBZ2dyZWdhdGlvbikgeworCQlpZiAocEhUSW5mby0+QU1QRFVfRmFjdG9yID4gcFBlZXJIVENhcC0+TWF4UnhBTVBEVUZhY3RvcikKKwkJCXBIVEluZm8tPkN1cnJlbnRBTVBEVUZhY3RvciA9CisJCQkJCQkgcFBlZXJIVENhcC0+TWF4UnhBTVBEVUZhY3RvcjsKKwkJZWxzZQorCQkJcEhUSW5mby0+Q3VycmVudEFNUERVRmFjdG9yID0gcEhUSW5mby0+QU1QRFVfRmFjdG9yOworCisJfSBlbHNlIHsKKwkJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NodC5iZFJUMlJUQWdncmVnYXRpb24pIHsKKwkJCWlmIChpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSAhPSBLRVlfVFlQRV9OQSkKKwkJCQlwSFRJbmZvLT5DdXJyZW50QU1QRFVGYWN0b3IgPQorCQkJCQkJIHBQZWVySFRDYXAtPk1heFJ4QU1QRFVGYWN0b3I7CisJCQllbHNlCisJCQkJcEhUSW5mby0+Q3VycmVudEFNUERVRmFjdG9yID0gSFRfQUdHX1NJWkVfNjRLOworCQl9IGVsc2UgeworCQkJaWYgKHBQZWVySFRDYXAtPk1heFJ4QU1QRFVGYWN0b3IgPCBIVF9BR0dfU0laRV8zMkspCisJCQkJcEhUSW5mby0+Q3VycmVudEFNUERVRmFjdG9yID0KKwkJCQkJCSBwUGVlckhUQ2FwLT5NYXhSeEFNUERVRmFjdG9yOworCQkJZWxzZQorCQkJCXBIVEluZm8tPkN1cnJlbnRBTVBEVUZhY3RvciA9IEhUX0FHR19TSVpFXzMySzsKKwkJfQorCX0KKwlpZiAocEhUSW5mby0+TVBEVV9EZW5zaXR5ID4gcFBlZXJIVENhcC0+TVBEVURlbnNpdHkpCisJCXBIVEluZm8tPkN1cnJlbnRNUERVRGVuc2l0eSA9IHBIVEluZm8tPk1QRFVfRGVuc2l0eTsKKwllbHNlCisJCXBIVEluZm8tPkN1cnJlbnRNUERVRGVuc2l0eSA9IHBQZWVySFRDYXAtPk1QRFVEZW5zaXR5OworCWlmIChwSFRJbmZvLT5JT1RBY3Rpb24gJiBIVF9JT1RfQUNUX1RYX1VTRV9BTVNEVV84SykgeworCQlwSFRJbmZvLT5iQ3VycmVudEFNUERVRW5hYmxlID0gZmFsc2U7CisJCXBIVEluZm8tPkZvcmNlZEFNU0RVTW9kZSA9IEhUX0FHR19GT1JDRV9FTkFCTEU7CisJCXBIVEluZm8tPkZvcmNlZEFNU0RVTWF4U2l6ZSA9IDc5MzU7CisJfQorCXBIVEluZm8tPmJDdXJSeFJlb3JkZXJFbmFibGUgPSBwSFRJbmZvLT5iUmVnUnhSZW9yZGVyRW5hYmxlOworCisJaWYgKHBQZWVySFRDYXAtPk1DU1swXSA9PSAwKQorCQlwUGVlckhUQ2FwLT5NQ1NbMF0gPSAweGZmOworCisJSFRJT1RBY3REZXRlcm1pbmVSYUZ1bmMoaWVlZSwgKChwUGVlckhUQ2FwLT5NQ1NbMV0pICE9IDApKTsKKworCUhURmlsdGVyTUNTUmF0ZShpZWVlLCBwUGVlckhUQ2FwLT5NQ1MsIGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQpOworCisJcEhUSW5mby0+UGVlck1pbW9QcyA9IHBQZWVySFRDYXAtPk1pbW9Qd3JTYXZlOworCWlmIChwSFRJbmZvLT5QZWVyTWltb1BzID09IE1JTU9fUFNfU1RBVElDKQorCQlwTWNzRmlsdGVyID0gTUNTX0ZJTFRFUl8xU1M7CisJZWxzZQorCQlwTWNzRmlsdGVyID0gTUNTX0ZJTFRFUl9BTEw7CisJaWVlZS0+SFRIaWdoZXN0T3BlcmFSYXRlID0gSFRHZXRIaWdoZXN0TUNTUmF0ZShpZWVlLAorCQkJCSAgIGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIHBNY3NGaWx0ZXIpOworCWllZWUtPkhUQ3VycmVudE9wZXJhUmF0ZSA9IGllZWUtPkhUSGlnaGVzdE9wZXJhUmF0ZTsKKworCXBIVEluZm8tPkN1cnJlbnRPcE1vZGUgPSBwUGVlckhUSW5mby0+T3B0TW9kZTsKK30KKwordm9pZCBIVEluaXRpYWxpemVIVEluZm8oc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IHJ0X2hpX3Rocm91Z2hwdXQgKnBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCisJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgIj09PT09PT09PT09PiVzKClcbiIsIF9fZnVuY19fKTsKKwlwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9IGZhbHNlOworCisJcEhUSW5mby0+YkN1ckJXNDBNSHogPSBmYWxzZTsKKwlwSFRJbmZvLT5iQ3VyVHhCVzQwTUh6ID0gZmFsc2U7CisKKwlwSFRJbmZvLT5iQ3VyU2hvcnRHSTIwTUh6ID0gZmFsc2U7CisJcEhUSW5mby0+YkN1clNob3J0R0k0ME1IeiA9IGZhbHNlOworCXBIVEluZm8tPmJGb3JjZWRTaG9ydEdJID0gZmFsc2U7CisKKwlwSFRJbmZvLT5iQ3VyU3VwcENDSyA9IHRydWU7CisKKwlwSFRJbmZvLT5iQ3VycmVudF9BTVNEVV9TdXBwb3J0ID0gZmFsc2U7CisJcEhUSW5mby0+bkN1cnJlbnRfQU1TRFVfTWF4U2l6ZSA9IHBIVEluZm8tPm5BTVNEVV9NYXhTaXplOworCXBIVEluZm8tPkN1cnJlbnRNUERVRGVuc2l0eSA9IHBIVEluZm8tPk1QRFVfRGVuc2l0eTsKKwlwSFRJbmZvLT5DdXJyZW50QU1QRFVGYWN0b3IgPSBwSFRJbmZvLT5BTVBEVV9GYWN0b3I7CisKKwltZW1zZXQoKHZvaWQgKikoJihwSFRJbmZvLT5TZWxmSFRDYXApKSwgMCwKKwkJc2l6ZW9mKHBIVEluZm8tPlNlbGZIVENhcCkpOworCW1lbXNldCgodm9pZCAqKSgmKHBIVEluZm8tPlNlbGZIVEluZm8pKSwgMCwKKwkJc2l6ZW9mKHBIVEluZm8tPlNlbGZIVEluZm8pKTsKKwltZW1zZXQoKHZvaWQgKikoJihwSFRJbmZvLT5QZWVySFRDYXBCdWYpKSwgMCwKKwkJc2l6ZW9mKHBIVEluZm8tPlBlZXJIVENhcEJ1ZikpOworCW1lbXNldCgodm9pZCAqKSgmKHBIVEluZm8tPlBlZXJIVEluZm9CdWYpKSwgMCwKKwkJc2l6ZW9mKHBIVEluZm8tPlBlZXJIVEluZm9CdWYpKTsKKworCXBIVEluZm8tPmJTd0J3SW5Qcm9ncmVzcyA9IGZhbHNlOworCXBIVEluZm8tPkNobmxPcCA9IENITkxPUF9OT05FOworCisJcEhUSW5mby0+ZVBlZXJIVFNwZWNWZXIgPSBIVF9TUEVDX1ZFUl9JRUVFOworCisJcEhUSW5mby0+YkN1cnJlbnRSVDJSVEFnZ3JlZ2F0aW9uID0gZmFsc2U7CisJcEhUSW5mby0+YkN1cnJlbnRSVDJSVExvbmdTbG90VGltZSA9IGZhbHNlOworCXBIVEluZm8tPlJUMlJUX0hUX01vZGUgPSAoZW51bSBydF9odF9jYXBhYmlsaXR5KTA7CisKKwlwSFRJbmZvLT5JT1RQZWVyID0gMDsKKwlwSFRJbmZvLT5JT1RBY3Rpb24gPSAwOworCXBIVEluZm8tPklPVFJhRnVuYyA9IDA7CisKKwl7CisJCXU4ICpSZWdIVFN1cHBSYXRlU2V0cyA9ICYoaWVlZS0+UmVnSFRTdXBwUmF0ZVNldFswXSk7CisJCVJlZ0hUU3VwcFJhdGVTZXRzWzBdID0gMHhGRjsKKwkJUmVnSFRTdXBwUmF0ZVNldHNbMV0gPSAweEZGOworCQlSZWdIVFN1cHBSYXRlU2V0c1s0XSA9IDB4MDE7CisJfQorfQorCit2b2lkIEhUSW5pdGlhbGl6ZUJzc0Rlc2Moc3RydWN0IGJzc19odCAqcEJzc0hUKQoreworCisJcEJzc0hULT5iZFN1cHBvcnRIVCA9IGZhbHNlOworCW1lbXNldChwQnNzSFQtPmJkSFRDYXBCdWYsIDAsIHNpemVvZihwQnNzSFQtPmJkSFRDYXBCdWYpKTsKKwlwQnNzSFQtPmJkSFRDYXBMZW4gPSAwOworCW1lbXNldChwQnNzSFQtPmJkSFRJbmZvQnVmLCAwLCBzaXplb2YocEJzc0hULT5iZEhUSW5mb0J1ZikpOworCXBCc3NIVC0+YmRIVEluZm9MZW4gPSAwOworCisJcEJzc0hULT5iZEhUU3BlY1ZlciA9IEhUX1NQRUNfVkVSX0lFRUU7CisKKwlwQnNzSFQtPmJkUlQyUlRBZ2dyZWdhdGlvbiA9IGZhbHNlOworCXBCc3NIVC0+YmRSVDJSVExvbmdTbG90VGltZSA9IGZhbHNlOworCXBCc3NIVC0+UlQyUlRfSFRfTW9kZSA9IChlbnVtIHJ0X2h0X2NhcGFiaWxpdHkpMDsKK30KKwordm9pZCBIVFJlc2V0U2VsZkFuZFNhdmVQZWVyU2V0dGluZyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCQkgICBzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKnBOZXR3b3JrKQoreworCXN0cnVjdCBydF9oaV90aHJvdWdocHV0ICpwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKwl1OAliSU9UQWN0aW9uID0gMDsKKworCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICI9PT09PT09PT09PT09PT4lcygpXG4iLCBfX2Z1bmNfXyk7CisJLyogdW5tYXJrIGJFbmFibGVIVCBmbGFnIGhlcmUgaXMgdGhlIHNhbWUgcmVhc29uIHdoeSB1bm1hcmtlZCBpbgorCSAqIGZ1bmN0aW9uIHJ0bGxpYl9zb2Z0bWFjX25ld19uZXQuIFdCIDIwMDguMDkuMTAqLworCWlmIChwTmV0d29yay0+YnNzaHQuYmRTdXBwb3J0SFQpIHsKKwkJcEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPSB0cnVlOworCQlwSFRJbmZvLT5lUGVlckhUU3BlY1ZlciA9IHBOZXR3b3JrLT5ic3NodC5iZEhUU3BlY1ZlcjsKKworCQlpZiAocE5ldHdvcmstPmJzc2h0LmJkSFRDYXBMZW4gPiAwICYmCisJCSAgICBwTmV0d29yay0+YnNzaHQuYmRIVENhcExlbiA8PSBzaXplb2YocEhUSW5mby0+UGVlckhUQ2FwQnVmKSkKKwkJCW1lbWNweShwSFRJbmZvLT5QZWVySFRDYXBCdWYsCisJCQkgICAgICAgcE5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWYsCisJCQkgICAgICAgcE5ldHdvcmstPmJzc2h0LmJkSFRDYXBMZW4pOworCisJCWlmIChwTmV0d29yay0+YnNzaHQuYmRIVEluZm9MZW4gPiAwICYmCisJCSAgICBwTmV0d29yay0+YnNzaHQuYmRIVEluZm9MZW4gPD0KKwkJICAgIHNpemVvZihwSFRJbmZvLT5QZWVySFRJbmZvQnVmKSkKKwkJCW1lbWNweShwSFRJbmZvLT5QZWVySFRJbmZvQnVmLAorCQkJICAgICAgIHBOZXR3b3JrLT5ic3NodC5iZEhUSW5mb0J1ZiwKKwkJCSAgICAgICBwTmV0d29yay0+YnNzaHQuYmRIVEluZm9MZW4pOworCisJCWlmIChwSFRJbmZvLT5iUmVnUlQyUlRBZ2dyZWdhdGlvbikgeworCQkJcEhUSW5mby0+YkN1cnJlbnRSVDJSVEFnZ3JlZ2F0aW9uID0KKwkJCQkgcE5ldHdvcmstPmJzc2h0LmJkUlQyUlRBZ2dyZWdhdGlvbjsKKwkJCXBIVEluZm8tPmJDdXJyZW50UlQyUlRMb25nU2xvdFRpbWUgPQorCQkJCSBwTmV0d29yay0+YnNzaHQuYmRSVDJSVExvbmdTbG90VGltZTsKKwkJCXBIVEluZm8tPlJUMlJUX0hUX01vZGUgPSBwTmV0d29yay0+YnNzaHQuUlQyUlRfSFRfTW9kZTsKKwkJfSBlbHNlIHsKKwkJCXBIVEluZm8tPmJDdXJyZW50UlQyUlRBZ2dyZWdhdGlvbiA9IGZhbHNlOworCQkJcEhUSW5mby0+YkN1cnJlbnRSVDJSVExvbmdTbG90VGltZSA9IGZhbHNlOworCQkJcEhUSW5mby0+UlQyUlRfSFRfTW9kZSA9IChlbnVtIHJ0X2h0X2NhcGFiaWxpdHkpMDsKKwkJfQorCisJCUhUSU9UUGVlckRldGVybWluZShpZWVlKTsKKworCQlwSFRJbmZvLT5JT1RBY3Rpb24gPSAwOworCQliSU9UQWN0aW9uID0gSFRJT1RBY3RJc0Rpc2FibGVNQ1MxNChpZWVlLCBwTmV0d29yay0+YnNzaWQpOworCQlpZiAoYklPVEFjdGlvbikKKwkJCXBIVEluZm8tPklPVEFjdGlvbiB8PSBIVF9JT1RfQUNUX0RJU0FCTEVfTUNTMTQ7CisKKwkJYklPVEFjdGlvbiA9IEhUSU9UQWN0SXNEaXNhYmxlTUNTMTUoaWVlZSk7CisJCWlmIChiSU9UQWN0aW9uKQorCQkJcEhUSW5mby0+SU9UQWN0aW9uIHw9IEhUX0lPVF9BQ1RfRElTQUJMRV9NQ1MxNTsKKworCQliSU9UQWN0aW9uID0gSFRJT1RBY3RJc0Rpc2FibGVNQ1NUd29TcGF0aWFsU3RyZWFtKGllZWUpOworCQlpZiAoYklPVEFjdGlvbikKKwkJCXBIVEluZm8tPklPVEFjdGlvbiB8PSBIVF9JT1RfQUNUX0RJU0FCTEVfQUxMXzJTUzsKKworCisJCWJJT1RBY3Rpb24gPSBIVElPVEFjdElzRGlzYWJsZUVEQ0FUdXJibyhpZWVlLCBwTmV0d29yay0+YnNzaWQpOworCQlpZiAoYklPVEFjdGlvbikKKwkJCXBIVEluZm8tPklPVEFjdGlvbiB8PSBIVF9JT1RfQUNUX0RJU0FCTEVfRURDQV9UVVJCTzsKKworCQliSU9UQWN0aW9uID0gSFRJT1RBY3RJc01nbnRVc2VDQ0s2TShpZWVlLCBwTmV0d29yayk7CisJCWlmIChiSU9UQWN0aW9uKQorCQkJcEhUSW5mby0+SU9UQWN0aW9uIHw9IEhUX0lPVF9BQ1RfTUdOVF9VU0VfQ0NLXzZNOworCQliSU9UQWN0aW9uID0gSFRJT1RBY3RJc0NDREZzeW5jKGllZWUpOworCQlpZiAoYklPVEFjdGlvbikKKwkJCXBIVEluZm8tPklPVEFjdGlvbiB8PSBIVF9JT1RfQUNUX0NERF9GU1lOQzsKKwl9IGVsc2UgeworCQlwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9IGZhbHNlOworCQlwSFRJbmZvLT5iQ3VycmVudFJUMlJUQWdncmVnYXRpb24gPSBmYWxzZTsKKwkJcEhUSW5mby0+YkN1cnJlbnRSVDJSVExvbmdTbG90VGltZSA9IGZhbHNlOworCQlwSFRJbmZvLT5SVDJSVF9IVF9Nb2RlID0gKGVudW0gcnRfaHRfY2FwYWJpbGl0eSkwOworCisJCXBIVEluZm8tPklPVEFjdGlvbiA9IDA7CisJCXBIVEluZm8tPklPVFJhRnVuYyA9IDA7CisJfQorfQorCit2b2lkIEhUVXBkYXRlU2VsZkFuZFBlZXJTZXR0aW5nKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJCXN0cnVjdCBydGxsaWJfbmV0d29yayAqcE5ldHdvcmspCit7CisJc3RydWN0IHJ0X2hpX3Rocm91Z2hwdXQgKnBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCXN0cnVjdCBodF9pbmZvX2VsZSAqcFBlZXJIVEluZm8gPQorCQkgKHN0cnVjdCBodF9pbmZvX2VsZSAqKXBOZXR3b3JrLT5ic3NodC5iZEhUSW5mb0J1ZjsKKworCWlmIChwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCkgeworCQlpZiAocE5ldHdvcmstPmJzc2h0LmJkSFRJbmZvTGVuICE9IDApCisJCQlwSFRJbmZvLT5DdXJyZW50T3BNb2RlID0gcFBlZXJIVEluZm8tPk9wdE1vZGU7CisJfQorfQorCit2b2lkIEhUVXNlRGVmYXVsdFNldHRpbmcoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IHJ0X2hpX3Rocm91Z2hwdXQgKnBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCisJaWYgKHBIVEluZm8tPmJFbmFibGVIVCkgeworCQlwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9IHRydWU7CisJCXBIVEluZm8tPmJDdXJTdXBwQ0NLID0gcEhUSW5mby0+YlJlZ1N1cHBDQ0s7CisKKwkJcEhUSW5mby0+YkN1ckJXNDBNSHogPSBwSFRJbmZvLT5iUmVnQlc0ME1IejsKKwkJcEhUSW5mby0+YkN1clNob3J0R0kyME1IeiA9IHBIVEluZm8tPmJSZWdTaG9ydEdJMjBNSHo7CisKKwkJcEhUSW5mby0+YkN1clNob3J0R0k0ME1IeiA9IHBIVEluZm8tPmJSZWdTaG9ydEdJNDBNSHo7CisKKwkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUgPQorCQkJCSBpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuc3VwcG9ydGVkOworCQlwSFRJbmZvLT5iQ3VycmVudF9BTVNEVV9TdXBwb3J0ID0gcEhUSW5mby0+YkFNU0RVX1N1cHBvcnQ7CisJCXBIVEluZm8tPm5DdXJyZW50X0FNU0RVX01heFNpemUgPSBwSFRJbmZvLT5uQU1TRFVfTWF4U2l6ZTsKKworCQlwSFRJbmZvLT5iQ3VycmVudEFNUERVRW5hYmxlID0gcEhUSW5mby0+YkFNUERVRW5hYmxlOworCQlwSFRJbmZvLT5DdXJyZW50QU1QRFVGYWN0b3IgPSBwSFRJbmZvLT5BTVBEVV9GYWN0b3I7CisKKwkJcEhUSW5mby0+Q3VycmVudE1QRFVEZW5zaXR5ID0gcEhUSW5mby0+Q3VycmVudE1QRFVEZW5zaXR5OworCisJCUhURmlsdGVyTUNTUmF0ZShpZWVlLCBpZWVlLT5SZWdkb3QxMVR4SFRPcGVyYXRpb25hbFJhdGVTZXQsCisJCQkJaWVlZS0+ZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCk7CisJCWllZWUtPkhUSGlnaGVzdE9wZXJhUmF0ZSA9IEhUR2V0SGlnaGVzdE1DU1JhdGUoaWVlZSwKKwkJCQkJICAgaWVlZS0+ZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCwKKwkJCQkJICAgTUNTX0ZJTFRFUl9BTEwpOworCQlpZWVlLT5IVEN1cnJlbnRPcGVyYVJhdGUgPSBpZWVlLT5IVEhpZ2hlc3RPcGVyYVJhdGU7CisKKwl9IGVsc2UgeworCQlwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9IGZhbHNlOworCX0KKwlyZXR1cm47Cit9CisKK3U4IEhUQ0NoZWNrKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCAqcEZyYW1lKQoreworCWlmIChpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCkgeworCQlpZiAoKElzUW9TRGF0YUZyYW1lKHBGcmFtZSkgJiYgRnJhbWVfT3JkZXIocEZyYW1lKSkgPT0gMSkgeworCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgIkhUIENPTlRST0wgRklMRUQgIgorCQkJCSAgICAgIkVYSVNUISFcbiIpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBIVFNldENvbm5lY3RCd01vZGVDYWxsYmFjayhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3QgcnRfaGlfdGhyb3VnaHB1dCAqcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisKKwlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAiPT09PT09PiVzKClcbiIsIF9fZnVuY19fKTsKKwlpZiAocEhUSW5mby0+YkN1ckJXNDBNSHopIHsKKwkJaWYgKHBIVEluZm8tPkN1clNUQUV4dENobmxPZmZzZXQgPT0gSFRfRVhUQ0hOTF9PRkZTRVRfVVBQRVIpCisJCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsCisJCQkJICAgICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsICsgMik7CisJCWVsc2UgaWYgKHBIVEluZm8tPkN1clNUQUV4dENobmxPZmZzZXQgPT0KKwkJCSBIVF9FWFRDSE5MX09GRlNFVF9MT1dFUikKKwkJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwKKwkJCQkgICAgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgLSAyKTsKKwkJZWxzZQorCQkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LAorCQkJCSAgICAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisKKwkJaWVlZS0+U2V0QldNb2RlSGFuZGxlcihpZWVlLT5kZXYsIEhUX0NIQU5ORUxfV0lEVEhfMjBfNDAsCisJCQkJICAgICAgIHBIVEluZm8tPkN1clNUQUV4dENobmxPZmZzZXQpOworCX0gZWxzZSB7CisJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCQlpZWVlLT5TZXRCV01vZGVIYW5kbGVyKGllZWUtPmRldiwgSFRfQ0hBTk5FTF9XSURUSF8yMCwKKwkJCQkgICAgICAgSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUKTsKKwl9CisKKwlwSFRJbmZvLT5iU3dCd0luUHJvZ3Jlc3MgPSBmYWxzZTsKK30KKwordm9pZCBIVFNldENvbm5lY3RCd01vZGUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQllbnVtIGh0X2NoYW5uZWxfd2lkdGggQmFuZHdpZHRoLAorCQkJZW51bSBodF9leHRjaG5sX29mZnNldCBPZmZzZXQpCit7CisJc3RydWN0IHJ0X2hpX3Rocm91Z2hwdXQgKnBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCisJaWYgKHBIVEluZm8tPmJSZWdCVzQwTUh6ID09IGZhbHNlKQorCQlyZXR1cm47CisKKwlpZiAoaWVlZS0+R2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzSGFuZGxlcihpZWVlLT5kZXYpKQorCQlCYW5kd2lkdGggPSBIVF9DSEFOTkVMX1dJRFRIXzIwOworCisJaWYgKHBIVEluZm8tPmJTd0J3SW5Qcm9ncmVzcykgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogYlN3QndJblByb2dyZXNzISFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoQmFuZHdpZHRoID09IEhUX0NIQU5ORUxfV0lEVEhfMjBfNDApIHsKKwkJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsIDwgMiAmJgorCQkgICAgT2Zmc2V0ID09IEhUX0VYVENITkxfT0ZGU0VUX0xPV0VSKQorCQkJT2Zmc2V0ID0gSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUOworCQlpZiAoT2Zmc2V0ID09IEhUX0VYVENITkxfT0ZGU0VUX1VQUEVSIHx8CisJCSAgICBPZmZzZXQgPT0gSFRfRVhUQ0hOTF9PRkZTRVRfTE9XRVIpIHsKKwkJCXBIVEluZm8tPmJDdXJCVzQwTUh6ID0gdHJ1ZTsKKwkJCXBIVEluZm8tPkN1clNUQUV4dENobmxPZmZzZXQgPSBPZmZzZXQ7CisJCX0gZWxzZSB7CisJCQlwSFRJbmZvLT5iQ3VyQlc0ME1IeiA9IGZhbHNlOworCQkJcEhUSW5mby0+Q3VyU1RBRXh0Q2hubE9mZnNldCA9IEhUX0VYVENITkxfT0ZGU0VUX05PX0VYVDsKKwkJfQorCX0gZWxzZSB7CisJCXBIVEluZm8tPmJDdXJCVzQwTUh6ID0gZmFsc2U7CisJCXBIVEluZm8tPkN1clNUQUV4dENobmxPZmZzZXQgPSBIVF9FWFRDSE5MX09GRlNFVF9OT19FWFQ7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTpwSFRJbmZvLT5iQ3VyQlc0ME1IejoleFxuIiwgX19mdW5jX18sCisJICAgICAgIHBIVEluZm8tPmJDdXJCVzQwTUh6KTsKKworCXBIVEluZm8tPmJTd0J3SW5Qcm9ncmVzcyA9IHRydWU7CisKKwlIVFNldENvbm5lY3RCd01vZGVDYWxsYmFjayhpZWVlKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTl4X1Fvcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfUW9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVjZDU1NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTl4X1Fvcy5oCkBAIC0wLDAgKzEsNDQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfX0lOQ19RT1NfVFlQRV9ICisjZGVmaW5lIF9fSU5DX1FPU19UWVBFX0gKKworI2luY2x1ZGUgInJ0bGxpYl9lbmRpYW5mcmVlLmgiCisKKyNkZWZpbmUgQklUMAkJICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQklUMQkJICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQklUMgkJICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQklUMwkJICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQklUNAkJICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgQklUNQkJICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgQklUNgkJICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgQklUNwkJICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgQklUOAkJICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgQklUOQkJICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgQklUMTAJCSAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgQklUMTEJCSAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgQklUMTIJCSAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgQklUMTMJCSAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgQklUMTQJCSAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgQklUMTUJCSAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgQklUMTYJCSAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgQklUMTcJCSAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgQklUMTgJCSAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgQklUMTkJCSAgIDB4MDAwODAwMDAKKyNkZWZpbmUgQklUMjAJCSAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgQklUMjEJCSAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgQklUMjIJCSAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgQklUMjMJCSAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgQklUMjQJCSAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgQklUMjUJCSAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgQklUMjYJCSAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgQklUMjcJCSAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgQklUMjgJCSAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgQklUMjkJCSAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgQklUMzAJCSAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgQklUMzEJCSAgIDB4ODAwMDAwMDAKKwordW5pb24gcW9zX3RzaW5mbyB7CisJdTgJCWNoYXJEYXRhWzNdOworCXN0cnVjdCB7CisJCXU4CQl1Y1RyYWZmaWNUeXBlOjE7CisJCXU4CQl1Y1RTSUQ6NDsKKwkJdTgJCXVjRGlyZWN0aW9uOjI7CisJCXU4CQl1Y0FjY2Vzc1BvbGljeToyOworCQl1OAkJdWNBZ2dyZWdhdGlvbjoxOworCQl1OAkJdWNQU0I6MTsKKwkJdTgJCXVjVVA6MzsKKwkJdTgJCXVjVFNJbmZvQWNrUG9saWN5OjI7CisJCXU4CQl1Y1NjaGVkdWxlOjE7CisJCXU4CQl1Y1Jlc2VydmVkOjc7CisJfSBmaWVsZDsKK307CisKK3VuaW9uIHRzcGVjX2JvZHkgeworCXU4CQljaGFyRGF0YVs1NV07CisKKwlzdHJ1Y3QgeworCQl1bmlvbiBxb3NfdHNpbmZvIFRTSW5mbzsKKwkJdTE2CU5vbWluYWxNU0RVc2l6ZTsKKwkJdTE2CU1heE1TRFVzaXplOworCQl1MzIJTWluU2VydmljZUl0djsKKwkJdTMyCU1heFNlcnZpY2VJdHY7CisJCXUzMglJbmFjdGl2aXR5SXR2OworCQl1MzIJU3VzcGVuSXR2OworCQl1MzIJU2VydmljZVN0YXJ0VGltZTsKKwkJdTMyCU1pbkRhdGFSYXRlOworCQl1MzIJTWVhbkRhdGFSYXRlOworCQl1MzIJUGVha0RhdGFSYXRlOworCQl1MzIJTWF4QnVyc3RTaXplOworCQl1MzIJRGVsYXlCb3VuZDsKKwkJdTMyCU1pblBoeVJhdGU7CisJCXUxNglTdXJwbHVzQmFuZHdpZHRoQWxsb3dhbmNlOworCQl1MTYJTWVkaXVtVGltZTsKKwl9IGY7Cit9OworCitzdHJ1Y3Qgd21tX3RzcGVjIHsKKwl1OAkJSUQ7CisJdTgJCUxlbmd0aDsKKwl1OAkJT1VJWzNdOworCXU4CQlPVUlfVHlwZTsKKwl1OAkJT1VJX1N1YlR5cGU7CisJdTgJCVZlcnNpb247CisJdW5pb24gdHNwZWNfYm9keSBCb2R5OworfTsKKworc3RydWN0IG9jdGV0X3N0cmluZyB7CisJdTggKk9jdGV0OworCXUxNiBMZW5ndGg7Cit9OworCisjZGVmaW5lCU1BWF9XTU1FTEVfTEVOR1RICTY0CisKKyNkZWZpbmUgUU9TX01PREUgdTMyCisKKyNkZWZpbmUgUU9TX0RJU0FCTEUJCTAKKyNkZWZpbmUgUU9TX1dNTQkJMQorI2RlZmluZSBRT1NfV01NU0EJCTIKKyNkZWZpbmUgUU9TX0VEQ0EJCTQKKyNkZWZpbmUgUU9TX0hDQ0EJCTgKKyNkZWZpbmUgUU9TX1dNTV9VQVBTRAkJMTYKKworI2RlZmluZSBXTU1fUEFSQU1fRUxFX0JPRFlfTEVOCTE4CisKKyNkZWZpbmUgTUFYX1NUQV9UU19DT1VOVAkJCTE2CisjZGVmaW5lIE1BWF9BUF9UU19DT1VOVAkJCTMyCisjZGVmaW5lIFFPU19UU1RSRUFNX0tFWV9TSVpFCQkxMworCisjZGVmaW5lIFdNTV9BQ1RJT05fQ0FURUdPUllfQ09ERQkxNworI2RlZmluZSBXTU1fUEFSQU1fRUxFX0JPRFlfTEVOCTE4CisKKyNkZWZpbmUgTUFYX1RTUEVDX1RTSUQJCQkJMTUKKyNkZWZpbmUgU0VTU0lPTl9SRUpFQ1RfVFNJRAkJCTB4ZmUKKyNkZWZpbmUgREVGQVVMVF9UU0lECQkJCQkweGZmCisKKyNkZWZpbmUgQUREVFNfVElNRV9TTE9UCQkJCTEwMAorCisjZGVmaW5lIEFDTV9USU1FT1VUCQkJCTEwMDAKKyNkZWZpbmUgU0VTU0lPTl9SRUpFQ1RfVElNRU9VVAkJNjAwMDAKKworZW51bSBhY2tfcG9saWN5IHsKKwllQWNrUGxjMF9BQ0sJCT0gMHgwMCwKKwllQWNrUGxjMV9Ob0FDSwkJPSAweDAxLAorfTsKKworCisjZGVmaW5lIFNFVF9XTU1fUU9TX0lORk9fRklFTEQoX3BTdGFydCwgX3ZhbCkJXAorCVdyaXRlRUYxQnl0ZShfcFN0YXJ0LCBfdmFsKQorCisjZGVmaW5lIEdFVF9XTU1fUU9TX0lORk9fRklFTERfUEFSQU1FVEVSU0VUX0NPVU5UKF9wU3RhcnQpIFwKKwlMRV9CSVRTX1RPXzFCWVRFKF9wU3RhcnQsIDAsIDQpCisjZGVmaW5lIFNFVF9XTU1fUU9TX0lORk9fRklFTERfUEFSQU1FVEVSU0VUX0NPVU5UKF9wU3RhcnQsIF92YWwpIFwKKwlTRVRfQklUU19UT19MRV8xQllURShfcFN0YXJ0LCAwLCA0LCBfdmFsKQorCisjZGVmaW5lIEdFVF9XTU1fUU9TX0lORk9fRklFTERfQVBfVUFQU0QoX3BTdGFydCkgXAorCUxFX0JJVFNfVE9fMUJZVEUoX3BTdGFydCwgNywgMSkKKyNkZWZpbmUgU0VUX1dNTV9RT1NfSU5GT19GSUVMRF9BUF9VQVBTRChfcFN0YXJ0LCBfdmFsKSBcCisJU0VUX0JJVFNfVE9fTEVfMUJZVEUoX3BTdGFydCwgNywgMSwgX3ZhbCkKKworI2RlZmluZSBHRVRfV01NX1FPU19JTkZPX0ZJRUxEX1NUQV9BQ19WT19VQVBTRChfcFN0YXJ0KSBcCisJTEVfQklUU19UT18xQllURShfcFN0YXJ0LCAwLCAxKQorI2RlZmluZSBTRVRfV01NX1FPU19JTkZPX0ZJRUxEX1NUQV9BQ19WT19VQVBTRChfcFN0YXJ0LCBfdmFsKSBcCisJU0VUX0JJVFNfVE9fTEVfMUJZVEUoX3BTdGFydCwgMCwgMSwgX3ZhbCkKKworI2RlZmluZSBHRVRfV01NX1FPU19JTkZPX0ZJRUxEX1NUQV9BQ19WSV9VQVBTRChfcFN0YXJ0KSBcCisJTEVfQklUU19UT18xQllURShfcFN0YXJ0LCAxLCAxKQorI2RlZmluZSBTRVRfV01NX1FPU19JTkZPX0ZJRUxEX1NUQV9BQ19WSV9VQVBTRChfcFN0YXJ0LCBfdmFsKSBcCisJU0VUX0JJVFNfVE9fTEVfMUJZVEUoX3BTdGFydCwgMSwgMSwgX3ZhbCkKKworI2RlZmluZSBHRVRfV01NX1FPU19JTkZPX0ZJRUxEX1NUQV9BQ19CRV9VQVBTRChfcFN0YXJ0KSBcCisJTEVfQklUU19UT18xQllURShfcFN0YXJ0LCAyLCAxKQorI2RlZmluZSBTRVRfV01NX1FPU19JTkZPX0ZJRUxEX1NUQV9BQ19CRV9VQVBTRChfcFN0YXJ0LCBfdmFsKSBcCisJU0VUX0JJVFNfVE9fTEVfMUJZVEUoX3BTdGFydCwgMiwgMSwgX3ZhbCkKKworI2RlZmluZSBHRVRfV01NX1FPU19JTkZPX0ZJRUxEX1NUQV9BQ19CS19VQVBTRChfcFN0YXJ0KSBcCisJTEVfQklUU19UT18xQllURShfcFN0YXJ0LCAzLCAxKQorI2RlZmluZSBTRVRfV01NX1FPU19JTkZPX0ZJRUxEX1NUQV9BQ19CS19VQVBTRChfcFN0YXJ0LCBfdmFsKSBcCisJU0VUX0JJVFNfVE9fTEVfMUJZVEUoX3BTdGFydCwgMywgMSwgX3ZhbCkKKworI2RlZmluZSBHRVRfV01NX1FPU19JTkZPX0ZJRUxEX1NUQV9NQVhfU1BfTEVOKF9wU3RhcnQpIFwKKwlMRV9CSVRTX1RPXzFCWVRFKF9wU3RhcnQsIDUsIDIpCisjZGVmaW5lIFNFVF9XTU1fUU9TX0lORk9fRklFTERfU1RBX01BWF9TUF9MRU4oX3BTdGFydCwgX3ZhbCkgXAorCVNFVF9CSVRTX1RPX0xFXzFCWVRFKF9wU3RhcnQsIDUsIDIsIF92YWwpCisKK2VudW0gcW9zX2llX3NvdXJjZSB7CisJUU9TSUVfU1JDX0FERFRTUkVRLAorCVFPU0lFX1NSQ19BRERUU1JTUCwKKwlRT1NJRV9TUkNfUkVBU09DUkVRLAorCVFPU0lFX1NSQ19SRUFTT0NSU1AsCisJUU9TSUVfU1JDX0RFTFRTLAorfTsKKworCisjZGVmaW5lIEFDX0NPRElORyB1MzIKKworI2RlZmluZSBBQzBfQkUJMAorI2RlZmluZSBBQzFfQksJMQorI2RlZmluZSBBQzJfVkkJMgorI2RlZmluZSBBQzNfVk8JMworI2RlZmluZSBBQ19NQVgJNAorCisKKyNkZWZpbmUgQUNfUEFSQU1fU0laRQk0CisKKyNkZWZpbmUgR0VUX1dNTV9BQ19QQVJBTV9BSUZTTihfcFN0YXJ0KSBcCisJKCh1OClMRV9CSVRTX1RPXzRCWVRFKF9wU3RhcnQsIDAsIDQpKQorI2RlZmluZSBTRVRfV01NX0FDX1BBUkFNX0FJRlNOKF9wU3RhcnQsIF92YWwpIFwKKwlTRVRfQklUU19UT19MRV80QllURShfcFN0YXJ0LCAwLCA0LCBfdmFsKQorCisjZGVmaW5lIEdFVF9XTU1fQUNfUEFSQU1fQUNNKF9wU3RhcnQpIFwKKwkoKHU4KUxFX0JJVFNfVE9fNEJZVEUoX3BTdGFydCwgNCwgMSkpCisjZGVmaW5lIFNFVF9XTU1fQUNfUEFSQU1fQUNNKF9wU3RhcnQsIF92YWwpIFwKKwlTRVRfQklUU19UT19MRV80QllURShfcFN0YXJ0LCA0LCAxLCBfdmFsKQorCisjZGVmaW5lIEdFVF9XTU1fQUNfUEFSQU1fQUNJKF9wU3RhcnQpIFwKKwkoKHU4KUxFX0JJVFNfVE9fNEJZVEUoX3BTdGFydCwgNSwgMikpCisjZGVmaW5lIFNFVF9XTU1fQUNfUEFSQU1fQUNJKF9wU3RhcnQsIF92YWwpIFwKKwlTRVRfQklUU19UT19MRV80QllURShfcFN0YXJ0LCA1LCAyLCBfdmFsKQorCisjZGVmaW5lIEdFVF9XTU1fQUNfUEFSQU1fQUNJX0FJRlNOKF9wU3RhcnQpIFwKKwkoKHU4KUxFX0JJVFNfVE9fNEJZVEUoX3BTdGFydCwgMCwgOCkpCisjZGVmaW5lIFNFVF9XTU1fQUNfUEFSQU1fQUNJX0FJRlNOKF9wU3RhcnQsIF92YWwpIFwKKwlTRVRfQklUU19UT19MRV80QllURShfcFN0YXJ0LCAwLCA4LCBfdmFsKQorCisjZGVmaW5lIEdFVF9XTU1fQUNfUEFSQU1fRUNXTUlOKF9wU3RhcnQpIFwKKwkoKHU4KUxFX0JJVFNfVE9fNEJZVEUoX3BTdGFydCwgOCwgNCkpCisjZGVmaW5lIFNFVF9XTU1fQUNfUEFSQU1fRUNXTUlOKF9wU3RhcnQsIF92YWwpIFwKKwlTRVRfQklUU19UT19MRV80QllURShfcFN0YXJ0LCA4LCA0LCBfdmFsKQorCisjZGVmaW5lIEdFVF9XTU1fQUNfUEFSQU1fRUNXTUFYKF9wU3RhcnQpIFwKKwkoKHU4KUxFX0JJVFNfVE9fNEJZVEUoX3BTdGFydCwgMTIsIDQpKQorI2RlZmluZSBTRVRfV01NX0FDX1BBUkFNX0VDV01BWChfcFN0YXJ0LCBfdmFsKSBcCisJU0VUX0JJVFNfVE9fTEVfNEJZVEUoX3BTdGFydCwgMTIsIDQsIF92YWwpCisKKyNkZWZpbmUgR0VUX1dNTV9BQ19QQVJBTV9UWE9QX0xJTUlUKF9wU3RhcnQpIFwKKwkoKHU4KUxFX0JJVFNfVE9fNEJZVEUoX3BTdGFydCwgMTYsIDE2KSkKKyNkZWZpbmUgU0VUX1dNTV9BQ19QQVJBTV9UWE9QX0xJTUlUKF9wU3RhcnQsIF92YWwpIFwKKwlTRVRfQklUU19UT19MRV80QllURShfcFN0YXJ0LCAxNiwgMTYsIF92YWwpCisKKworCisjZGVmaW5lIFdNTV9QQVJBTV9FTEVNRU5UX1NJWkUJKDgrKDQqQUNfUEFSQU1fU0laRSkpCisKK2VudW0gcW9zX2VsZV9zdWJ0eXBlIHsKKwlRT1NFTEVfVFlQRV9JTkZPCQk9IDB4MDAsCisJUU9TRUxFX1RZUEVfUEFSQU0JPSAweDAxLAorfTsKKworCitlbnVtIGRpcmVjdGlvbl92YWx1ZSB7CisJRElSX1VQCQkJPSAwLAorCURJUl9ET1dOCQk9IDEsCisJRElSX0RJUkVDVAkJPSAyLAorCURJUl9CSV9ESVIJCT0gMywKK307CisKK2VudW0gYWNtX21ldGhvZCB7CisJZUFjbVdheTBfU3dBbmRIdwkJPSAwLAorCWVBY21XYXkxX0hXCQkJPSAxLAorCWVBY21XYXkyX1NXCQkJPSAyLAorfTsKKworCitzdHJ1Y3QgYWNtIHsKKwl1NjQJCVVzZWRUaW1lOworCXU2NAkJTWVkaXVtVGltZTsKKwl1OAkJSHdBY21DdGw7Cit9OworCisKKworI2RlZmluZSBBQ19VQVBTRAl1OAorCisjZGVmaW5lCUdFVF9WT19VQVBTRChfYXBzZCkgKChfYXBzZCkgJiBCSVQwKQorI2RlZmluZQlTRVRfVk9fVUFQU0QoX2Fwc2QpICgoX2Fwc2QpIHw9IEJJVDApCisKKyNkZWZpbmUJR0VUX1ZJX1VBUFNEKF9hcHNkKSAoKF9hcHNkKSAmIEJJVDEpCisjZGVmaW5lCVNFVF9WSV9VQVBTRChfYXBzZCkgKChfYXBzZCkgfD0gQklUMSkKKworI2RlZmluZQlHRVRfQktfVUFQU0QoX2Fwc2QpICgoX2Fwc2QpICYgQklUMikKKyNkZWZpbmUJU0VUX0JLX1VBUFNEKF9hcHNkKSAoKF9hcHNkKSB8PSBCSVQyKQorCisjZGVmaW5lCUdFVF9CRV9VQVBTRChfYXBzZCkgKChfYXBzZCkgJiBCSVQzKQorI2RlZmluZQlTRVRfQkVfVUFQU0QoX2Fwc2QpICgoX2Fwc2QpIHw9IEJJVDMpCisKK3VuaW9uIHFvc190Y2xhcyB7CisKKwlzdHJ1Y3QgX1RZUEVfR0VORVJBTCB7CisJCXU4CQlQcmlvcml0eTsKKwkJdTgJCUNsYXNzaWZpZXJUeXBlOworCQl1OAkJTWFzazsKKwl9IFRZUEVfR0VORVJBTDsKKworCXN0cnVjdCBfVFlQRTBfRVRIIHsKKwkJdTgJCVByaW9yaXR5OworCQl1OAkJQ2xhc3NpZmllclR5cGU7CisJCXU4CQlNYXNrOworCQl1OAkJU3JjQWRkcls2XTsKKwkJdTgJCURzdEFkZHJbNl07CisJCXUxNgkJVHlwZTsKKwl9IFRZUEUwX0VUSDsKKworCXN0cnVjdCBfVFlQRTFfSVBWNCB7CisJCXU4CQlQcmlvcml0eTsKKwkJdTgJCUNsYXNzaWZpZXJUeXBlOworCQl1OAkJTWFzazsKKwkJdTgJCVZlcnNpb247CisJCXU4CQlTcmNJUFs0XTsKKwkJdTgJCURzdElQWzRdOworCQl1MTYJCVNyY1BvcnQ7CisJCXUxNgkJRHN0UG9ydDsKKwkJdTgJCURTQ1A7CisJCXU4CQlQcm90b2NvbDsKKwkJdTgJCVJlc2VydmVkOworCX0gVFlQRTFfSVBWNDsKKworCXN0cnVjdCBfVFlQRTFfSVBWNiB7CisJCXU4CQlQcmlvcml0eTsKKwkJdTgJCUNsYXNzaWZpZXJUeXBlOworCQl1OAkJTWFzazsKKwkJdTgJCVZlcnNpb247CisJCXU4CQlTcmNJUFsxNl07CisJCXU4CQlEc3RJUFsxNl07CisJCXUxNgkJU3JjUG9ydDsKKwkJdTE2CQlEc3RQb3J0OworCQl1OAkJRmxvd0xhYmVsWzNdOworCX0gVFlQRTFfSVBWNjsKKworCXN0cnVjdCBfVFlQRTJfODAyMVEgeworCQl1OAkJUHJpb3JpdHk7CisJCXU4CQlDbGFzc2lmaWVyVHlwZTsKKwkJdTgJCU1hc2s7CisJCXUxNgkJVGFnVHlwZTsKKwl9IFRZUEUyXzgwMjFROworfTsKKworc3RydWN0IHFvc190c3RyZWFtIHsKKworCWJvb2wJCQliVXNlZDsKKwl1MTYJCQlNc2R1TGlmZXRpbWU7CisJYm9vbAkJCWJFc3RhYmxpc2hpbmc7CisJdTgJCQlUaW1lU2xvdENvdW50OworCXU4CQkJRGlhbG9nVG9rZW47CisJc3RydWN0IHdtbV90c3BlYyBUU3BlYzsKKwlzdHJ1Y3Qgd21tX3RzcGVjIE91dFN0YW5kaW5nVFNwZWM7CisJdTgJCQlOb21pbmFsUGh5UmF0ZTsKK307CisKK3N0cnVjdCBzdGFfcW9zIHsKKwl1OCBXTU1JRUJ1ZltNQVhfV01NRUxFX0xFTkdUSF07CisJdTggKldNTUlFOworCisJUU9TX01PREUgUW9zQ2FwYWJpbGl0eTsKKwlRT1NfTU9ERSBDdXJyZW50UW9zTW9kZTsKKworCUFDX1VBUFNEIGI0YWNfVWFwc2Q7CisJQUNfVUFQU0QgQ3VycjRhY1VhcHNkOworCXU4IGJJblNlcnZpY2VQZXJpb2Q7CisJdTggTWF4U1BMZW5ndGg7CisJaW50IE51bUJjbkJlZm9yZVRyaWdnZXI7CisKKwl1OCAqcFdNTUluZm9FbGU7CisJdTggV01NUGFyYW1FbGVbV01NX1BBUkFNX0VMRU1FTlRfU0laRV07CisKKwlzdHJ1Y3QgYWNtIGFjbVs0XTsKKwllbnVtIGFjbV9tZXRob2QgQWNtTWV0aG9kOworCisJc3RydWN0IHFvc190c3RyZWFtIFN0YVRzQXJyYXlbTUFYX1NUQV9UU19DT1VOVF07CisJdTgJCQkJRGlhbG9nVG9rZW47CisJc3RydWN0IHdtbV90c3BlYyBUU3BlYzsKKworCXU4CQkJCVFCc3NXaXJlbGVzc01vZGU7CisKKwlib29sCQkJCWJOb0FjazsKKworCWJvb2wJCQkJYkVuYWJsZVJ4SW1tQkE7CisKK307CisKKyNkZWZpbmUgUUJTU19MT0FEX1NJWkUJCQkJNQorI2RlZmluZSBHRVRfUUJTU19MT0FEX1NUQV9DT1VOVChfX3BTdGFydCkJXAorCQlSZWFkRUYyQnl0ZShfX3BTdGFydCkKKyNkZWZpbmUgU0VUX1FCU1NfTE9BRF9TVEFfQ09VTlQoX19wU3RhcnQsIF9fVmFsdWUpCVwKKwkJV3JpdGVFRjJCeXRlKF9fcFN0YXJ0LCBfX1ZhbHVlKQorI2RlZmluZSBHRVRfUUJTU19MT0FEX0NITkxfVVRJTElaQVRJT04oX19wU3RhcnQpCVwKKwkJUmVhZEVGMUJ5dGUoKHU4ICopKF9fcFN0YXJ0KSArIDIpCisjZGVmaW5lIFNFVF9RQlNTX0xPQURfQ0hOTF9VVElMSVpBVElPTihfX3BTdGFydCwgX19WYWx1ZSkJXAorCQlXcml0ZUVGMUJ5dGUoKHU4ICopKF9fcFN0YXJ0KSArIDIsIF9fVmFsdWUpCisjZGVmaW5lIEdFVF9RQlNTX0xPQURfQVZBSUxBQkxFX0NBUEFDSVRZKF9fcFN0YXJ0KQlcCisJCVJlYWRFRjJCeXRlKCh1OCAqKShfX3BTdGFydCkgKyAzKQorI2RlZmluZSBTRVRfUUJTU19MT0FEX0FWQUlMQUJMRV9DQVBBQ0lUWShfX3BTdGFydCwgX19WYWx1ZSkgXAorCQlXcml0ZUVGMkJ5dGUoKHU4ICopKF9fcFN0YXJ0KSArIDMsIF9fVmFsdWUpCisKK3N0cnVjdCBic3NfcW9zIHsKKwlRT1NfTU9ERSBiZFFvU01vZGU7CisJdTggYmRXTU1JRUJ1ZltNQVhfV01NRUxFX0xFTkdUSF07CisJc3RydWN0IG9jdGV0X3N0cmluZyBiZFdNTUlFOworCisJZW51bSBxb3NfZWxlX3N1YnR5cGUgRWxlU3ViVHlwZTsKKworCXU4ICpwV01NSW5mb0VsZTsKKwl1OCAqcFdNTVBhcmFtRWxlOworCisJdTggUUJzc0xvYWRbUUJTU19MT0FEX1NJWkVdOworCWJvb2wgYlFCc3NMb2FkVmFsaWQ7Cit9OworCisjZGVmaW5lIHNRb1NDdGxMbmcJMgorI2RlZmluZSBRT1NfQ1RSTF9MRU4oX1Fvc01vZGUpCSgoX1Fvc01vZGUgPiBRT1NfRElTQUJMRSkgPyBzUW9TQ3RsTG5nIDogMCkKKworCisjZGVmaW5lIElzQUNWYWxpZChhYykJCSgoYWMgPj0gMCAmJiBhYyA8PSA3KSA/IHRydWUgOiBmYWxzZSkKKworCit1bmlvbiBhY2lfYWlmc24geworCXU4CWNoYXJEYXRhOworCisJc3RydWN0IHsKKwkJdTgJQUlGU046NDsKKwkJdTgJYWNtOjE7CisJCXU4CUFDSToyOworCQl1OAlSZXNlcnZlZDoxOworCX0gZjsKK307CisKK3VuaW9uIGVjdyB7CisJdTgJY2hhckRhdGE7CisJc3RydWN0IHsKKwkJdTgJRUNXbWluOjQ7CisJCXU4CUVDV21heDo0OworCX0gZjsKK307CisKK3VuaW9uIGFjX3BhcmFtIHsKKwl1MzIJbG9uZ0RhdGE7CisJdTgJY2hhckRhdGFbNF07CisKKwlzdHJ1Y3QgeworCQl1bmlvbiBhY2lfYWlmc24gQWNpQWlmc247CisJCXVuaW9uIGVjdyBFY3c7CisJCXUxNgkJVFhPUExpbWl0OworCX0gZjsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfVFMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTl4X1RTLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYwMWIxYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTl4X1RTLmgKQEAgLTAsMCArMSw3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX1RTVFlQRV9IXworI2RlZmluZSBfVFNUWVBFX0hfCisjaW5jbHVkZSAicnRsODE5eF9Rb3MuaCIKKyNkZWZpbmUgVFNfU0VUVVBfVElNRU9VVAk2MAorI2RlZmluZSBUU19JTkFDVF9USU1FT1VUCTYwCisjZGVmaW5lIFRTX0FEREJBX0RFTEFZCQk2MAorCisjZGVmaW5lIFRPVEFMX1RTX05VTQkJMTYKKyNkZWZpbmUgVENMQVNfTlVNCQk0CisKK2VudW0gdHJfc2VsZWN0IHsKKwlUWF9ESVIgPSAwLAorCVJYX0RJUiA9IDEsCit9OworCitzdHJ1Y3QgdHNfY29tbW9uX2luZm8geworCXN0cnVjdCBsaXN0X2hlYWQJCUxpc3Q7CisJc3RydWN0IHRpbWVyX2xpc3QJCVNldHVwVGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3QJCUluYWN0VGltZXI7CisJdTgJCQkJQWRkcls2XTsKKwl1bmlvbiB0c3BlY19ib2R5IFRTcGVjOworCXVuaW9uIHFvc190Y2xhcyBUQ2xhc3NbVENMQVNfTlVNXTsKKwl1OAkJCQlUQ2xhc1Byb2M7CisJdTgJCQkJVENsYXNOdW07Cit9OworCitzdHJ1Y3QgdHhfdHNfcmVjb3JkIHsKKwlzdHJ1Y3QgdHNfY29tbW9uX2luZm8gVHNDb21tb25JbmZvOworCXUxNgkJCQlUeEN1clNlcTsKKwlzdHJ1Y3QgYmFfcmVjb3JkIFR4UGVuZGluZ0JBUmVjb3JkOworCXN0cnVjdCBiYV9yZWNvcmQgVHhBZG1pdHRlZEJBUmVjb3JkOworCXU4CQkJCWJBZGRCYVJlcUluUHJvZ3Jlc3M7CisJdTgJCQkJYkFkZEJhUmVxRGVsYXllZDsKKwl1OAkJCQliVXNpbmdCYTsKKwl1OAkJCQliRGlzYWJsZV9BZGRCYTsKKwlzdHJ1Y3QgdGltZXJfbGlzdAkJVHNBZGRCYVRpbWVyOworCXU4CQkJCW51bTsKK307CisKK3N0cnVjdCByeF90c19yZWNvcmQgeworCXN0cnVjdCB0c19jb21tb25faW5mbyBUc0NvbW1vbkluZm87CisJdTE2CQkJCVJ4SW5kaWNhdGVTZXE7CisJdTE2CQkJCVJ4VGltZW91dEluZGljYXRlU2VxOworCXN0cnVjdCBsaXN0X2hlYWQJCVJ4UGVuZGluZ1BrdExpc3Q7CisJc3RydWN0IHRpbWVyX2xpc3QJCVJ4UGt0UGVuZGluZ1RpbWVyOworCXN0cnVjdCBiYV9yZWNvcmQgUnhBZG1pdHRlZEJBUmVjb3JkOworCXUxNgkJCQlSeExhc3RTZXFOdW07CisJdTgJCQkJUnhMYXN0RnJhZ051bTsKKwl1OAkJCQludW07Cit9OworCit2b2lkIF9zZXR1cF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqLCB2b2lkICosIHVuc2lnbmVkIGxvbmcpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfVFNQcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9UU1Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWE2MDJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfVFNQcm9jLmMKQEAgLTAsMCArMSw1NDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAicnRsbGliLmgiCisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlICJydGw4MTl4X1RTLmgiCisKK3N0YXRpYyB2b2lkIFRzU2V0dXBUaW1lT3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKK30KKworc3RhdGljIHZvaWQgVHNJbmFjdFRpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworfQorCitzdGF0aWMgdm9pZCBSeFBrdFBlbmRpbmdUaW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgcnhfdHNfcmVjb3JkICpwUnhUcyA9IChzdHJ1Y3QgcnhfdHNfcmVjb3JkICopZGF0YTsKKwlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZihwUnhUcywgc3RydWN0IHJ0bGxpYl9kZXZpY2UsCisJCQkJCQkgIFJ4VHNSZWNvcmRbcFJ4VHMtPm51bV0pOworCisJc3RydWN0IHJ4X3Jlb3JkZXJfZW50cnkgKnBSZW9yZGVyRW50cnkgPSBOVUxMOworCisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJdTggaW5kZXggPSAwOworCWJvb2wgYlBrdEluQnVmID0gZmFsc2U7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmKGllZWUtPnJlb3JkZXJfc3BpbmxvY2spLCBmbGFncyk7CisJaWYgKHBSeFRzLT5SeFRpbWVvdXRJbmRpY2F0ZVNlcSAhPSAweGZmZmYpIHsKKwkJd2hpbGUgKCFsaXN0X2VtcHR5KCZwUnhUcy0+UnhQZW5kaW5nUGt0TGlzdCkpIHsKKwkJCXBSZW9yZGVyRW50cnkgPSAoc3RydWN0IHJ4X3Jlb3JkZXJfZW50cnkgKikKKwkJCQkJbGlzdF9lbnRyeShwUnhUcy0+UnhQZW5kaW5nUGt0TGlzdC5wcmV2LAorCQkJCQlzdHJ1Y3QgcnhfcmVvcmRlcl9lbnRyeSwgTGlzdCk7CisJCQlpZiAoaW5kZXggPT0gMCkKKwkJCQlwUnhUcy0+UnhJbmRpY2F0ZVNlcSA9IHBSZW9yZGVyRW50cnktPlNlcU51bTsKKworCQkJaWYgKFNOX0xFU1MocFJlb3JkZXJFbnRyeS0+U2VxTnVtLCBwUnhUcy0+UnhJbmRpY2F0ZVNlcSkgfHwKKwkJCQlTTl9FUVVBTChwUmVvcmRlckVudHJ5LT5TZXFOdW0sIHBSeFRzLT5SeEluZGljYXRlU2VxKSkgeworCQkJCWxpc3RfZGVsX2luaXQoJnBSZW9yZGVyRW50cnktPkxpc3QpOworCisJCQkJaWYgKFNOX0VRVUFMKHBSZW9yZGVyRW50cnktPlNlcU51bSwKKwkJCQkgICAgcFJ4VHMtPlJ4SW5kaWNhdGVTZXEpKQorCQkJCQlwUnhUcy0+UnhJbmRpY2F0ZVNlcSA9CisJCQkJCSAgICAgIChwUnhUcy0+UnhJbmRpY2F0ZVNlcSArIDEpICUgNDA5NjsKKworCQkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfUkVPUkRFUiwgIiVzKCk6IEluZGljYXRlIgorCQkJCQkgICAgICIgU2VxTnVtOiAlZFxuIiwgX19mdW5jX18sCisJCQkJCSAgICAgcFJlb3JkZXJFbnRyeS0+U2VxTnVtKTsKKwkJCQlpZWVlLT5zdGF0c19JbmRpY2F0ZUFycmF5W2luZGV4XSA9CisJCQkJCQkJIHBSZW9yZGVyRW50cnktPnByeGI7CisJCQkJaW5kZXgrKzsKKworCQkJCWxpc3RfYWRkX3RhaWwoJnBSZW9yZGVyRW50cnktPkxpc3QsCisJCQkJCSAgICAgICZpZWVlLT5SeFJlb3JkZXJfVW51c2VkX0xpc3QpOworCQkJfSBlbHNlIHsKKwkJCQliUGt0SW5CdWYgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGluZGV4ID4gMCkgeworCQlwUnhUcy0+UnhUaW1lb3V0SW5kaWNhdGVTZXEgPSAweGZmZmY7CisKKwkJaWYgKGluZGV4ID4gUkVPUkRFUl9XSU5fU0laRSkgeworCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICJSeFJlb3JkZXJJbmRpY2F0ZVBhY2tldCgpOiIKKwkJCQkgICAgICIgUnggUmVvcmVyIHN0cnVjdCBidWZmZXIgZnVsbCEhXG4iKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihpZWVlLT5yZW9yZGVyX3NwaW5sb2NrKSwKKwkJCQkJICAgICAgIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCQlydGxsaWJfaW5kaWNhdGVfcGFja2V0cyhpZWVlLCBpZWVlLT5zdGF0c19JbmRpY2F0ZUFycmF5LCBpbmRleCk7CisJCWJQa3RJbkJ1ZiA9IGZhbHNlOworCX0KKworCWlmIChiUGt0SW5CdWYgJiYgKHBSeFRzLT5SeFRpbWVvdXRJbmRpY2F0ZVNlcSA9PSAweGZmZmYpKSB7CisJCXBSeFRzLT5SeFRpbWVvdXRJbmRpY2F0ZVNlcSA9IHBSeFRzLT5SeEluZGljYXRlU2VxOworCQltb2RfdGltZXIoJnBSeFRzLT5SeFBrdFBlbmRpbmdUaW1lciwgIGppZmZpZXMgKworCQkJICBNU0VDUyhpZWVlLT5wSFRJbmZvLT5SeFJlb3JkZXJQZW5kaW5nVGltZSkpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaWVlZS0+cmVvcmRlcl9zcGlubG9jayksIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgVHNBZGRCYVByb2Nlc3ModW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCB0eF90c19yZWNvcmQgKnBUeFRzID0gKHN0cnVjdCB0eF90c19yZWNvcmQgKilkYXRhOworCXU4IG51bSA9IHBUeFRzLT5udW07CisJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2YocFR4VHMsIHN0cnVjdCBydGxsaWJfZGV2aWNlLAorCQkJCSAgICAgVHhUc1JlY29yZFtudW1dKTsKKworCVRzSW5pdEFkZEJBKGllZWUsIHBUeFRzLCBCQV9QT0xJQ1lfSU1NRURJQVRFLCBmYWxzZSk7CisJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9CQSwgIlRzQWRkQmFQcm9jZXNzKCk6IEFEREJBIFJlcSBpcyAiCisJCSAgICAgInN0YXJ0ZWQhIVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIFJlc2V0VHNDb21tb25JbmZvKHN0cnVjdCB0c19jb21tb25faW5mbyAqcFRzQ29tbW9uSW5mbykKK3sKKwltZW1zZXQocFRzQ29tbW9uSW5mby0+QWRkciwgMCwgNik7CisJbWVtc2V0KCZwVHNDb21tb25JbmZvLT5UU3BlYywgMCwgc2l6ZW9mKHVuaW9uIHRzcGVjX2JvZHkpKTsKKwltZW1zZXQoJnBUc0NvbW1vbkluZm8tPlRDbGFzcywgMCwgc2l6ZW9mKHVuaW9uIHFvc190Y2xhcykqVENMQVNfTlVNKTsKKwlwVHNDb21tb25JbmZvLT5UQ2xhc1Byb2MgPSAwOworCXBUc0NvbW1vbkluZm8tPlRDbGFzTnVtID0gMDsKK30KKworc3RhdGljIHZvaWQgUmVzZXRUeFRzRW50cnkoc3RydWN0IHR4X3RzX3JlY29yZCAqcFRTKQoreworCVJlc2V0VHNDb21tb25JbmZvKCZwVFMtPlRzQ29tbW9uSW5mbyk7CisJcFRTLT5UeEN1clNlcSA9IDA7CisJcFRTLT5iQWRkQmFSZXFJblByb2dyZXNzID0gZmFsc2U7CisJcFRTLT5iQWRkQmFSZXFEZWxheWVkID0gZmFsc2U7CisJcFRTLT5iVXNpbmdCYSA9IGZhbHNlOworCXBUUy0+YkRpc2FibGVfQWRkQmEgPSBmYWxzZTsKKwlSZXNldEJhRW50cnkoJnBUUy0+VHhBZG1pdHRlZEJBUmVjb3JkKTsKKwlSZXNldEJhRW50cnkoJnBUUy0+VHhQZW5kaW5nQkFSZWNvcmQpOworfQorCitzdGF0aWMgdm9pZCBSZXNldFJ4VHNFbnRyeShzdHJ1Y3QgcnhfdHNfcmVjb3JkICpwVFMpCit7CisJUmVzZXRUc0NvbW1vbkluZm8oJnBUUy0+VHNDb21tb25JbmZvKTsKKwlwVFMtPlJ4SW5kaWNhdGVTZXEgPSAweGZmZmY7CisJcFRTLT5SeFRpbWVvdXRJbmRpY2F0ZVNlcSA9IDB4ZmZmZjsKKwlSZXNldEJhRW50cnkoJnBUUy0+UnhBZG1pdHRlZEJBUmVjb3JkKTsKK30KKwordm9pZCBUU0luaXRpYWxpemUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IHR4X3RzX3JlY29yZCAqcFR4VFMgID0gaWVlZS0+VHhUc1JlY29yZDsKKwlzdHJ1Y3QgcnhfdHNfcmVjb3JkICpwUnhUUyAgPSBpZWVlLT5SeFRzUmVjb3JkOworCXN0cnVjdCByeF9yZW9yZGVyX2VudHJ5ICpwUnhSZW9yZGVyRW50cnkgPSBpZWVlLT5SeFJlb3JkZXJFbnRyeTsKKwl1OAkJCQljb3VudCA9IDA7CisJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9UUywgIj09PT09PT09PT0+JXMoKVxuIiwgX19mdW5jX18pOworCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5UeF9UU19BZG1pdF9MaXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+VHhfVFNfUGVuZGluZ19MaXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+VHhfVFNfVW51c2VkX0xpc3QpOworCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgVE9UQUxfVFNfTlVNOyBjb3VudCsrKSB7CisJCXBUeFRTLT5udW0gPSBjb3VudDsKKwkJX3NldHVwX3RpbWVyKCZwVHhUUy0+VHNDb21tb25JbmZvLlNldHVwVGltZXIsCisJCQkgICAgVHNTZXR1cFRpbWVPdXQsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpIHBUeFRTKTsKKworCQlfc2V0dXBfdGltZXIoJnBUeFRTLT5Uc0NvbW1vbkluZm8uSW5hY3RUaW1lciwKKwkJCSAgICBUc0luYWN0VGltZW91dCwKKwkJCSAgICAodW5zaWduZWQgbG9uZykgcFR4VFMpOworCisJCV9zZXR1cF90aW1lcigmcFR4VFMtPlRzQWRkQmFUaW1lciwKKwkJCSAgICBUc0FkZEJhUHJvY2VzcywKKwkJCSAgICAodW5zaWduZWQgbG9uZykgcFR4VFMpOworCisJCV9zZXR1cF90aW1lcigmcFR4VFMtPlR4UGVuZGluZ0JBUmVjb3JkLlRpbWVyLAorCQkJICAgIEJhU2V0dXBUaW1lT3V0LAorCQkJICAgICh1bnNpZ25lZCBsb25nKSBwVHhUUyk7CisJCV9zZXR1cF90aW1lcigmcFR4VFMtPlR4QWRtaXR0ZWRCQVJlY29yZC5UaW1lciwKKwkJCSAgICBUeEJhSW5hY3RUaW1lb3V0LAorCQkJICAgICh1bnNpZ25lZCBsb25nKSBwVHhUUyk7CisKKwkJUmVzZXRUeFRzRW50cnkocFR4VFMpOworCQlsaXN0X2FkZF90YWlsKCZwVHhUUy0+VHNDb21tb25JbmZvLkxpc3QsCisJCQkJJmllZWUtPlR4X1RTX1VudXNlZF9MaXN0KTsKKwkJcFR4VFMrKzsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+UnhfVFNfQWRtaXRfTGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmllZWUtPlJ4X1RTX1BlbmRpbmdfTGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmllZWUtPlJ4X1RTX1VudXNlZF9MaXN0KTsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBUT1RBTF9UU19OVU07IGNvdW50KyspIHsKKwkJcFJ4VFMtPm51bSA9IGNvdW50OworCQlJTklUX0xJU1RfSEVBRCgmcFJ4VFMtPlJ4UGVuZGluZ1BrdExpc3QpOworCisJCV9zZXR1cF90aW1lcigmcFJ4VFMtPlRzQ29tbW9uSW5mby5TZXR1cFRpbWVyLAorCQkJICAgIFRzU2V0dXBUaW1lT3V0LAorCQkJICAgICh1bnNpZ25lZCBsb25nKSBwUnhUUyk7CisKKwkJX3NldHVwX3RpbWVyKCZwUnhUUy0+VHNDb21tb25JbmZvLkluYWN0VGltZXIsCisJCQkgICAgVHNJbmFjdFRpbWVvdXQsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpIHBSeFRTKTsKKworCQlfc2V0dXBfdGltZXIoJnBSeFRTLT5SeEFkbWl0dGVkQkFSZWNvcmQuVGltZXIsCisJCQkgICAgUnhCYUluYWN0VGltZW91dCwKKwkJCSAgICAodW5zaWduZWQgbG9uZykgcFJ4VFMpOworCisJCV9zZXR1cF90aW1lcigmcFJ4VFMtPlJ4UGt0UGVuZGluZ1RpbWVyLAorCQkJICAgIFJ4UGt0UGVuZGluZ1RpbWVvdXQsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpIHBSeFRTKTsKKworCQlSZXNldFJ4VHNFbnRyeShwUnhUUyk7CisJCWxpc3RfYWRkX3RhaWwoJnBSeFRTLT5Uc0NvbW1vbkluZm8uTGlzdCwKKwkJCSAgICAgICZpZWVlLT5SeF9UU19VbnVzZWRfTGlzdCk7CisJCXBSeFRTKys7CisJfQorCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5SeFJlb3JkZXJfVW51c2VkX0xpc3QpOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IFJFT1JERVJfRU5UUllfTlVNOyBjb3VudCsrKSB7CisJCWxpc3RfYWRkX3RhaWwoJnBSeFJlb3JkZXJFbnRyeS0+TGlzdCwKKwkJCSAgICAgICZpZWVlLT5SeFJlb3JkZXJfVW51c2VkX0xpc3QpOworCQlpZiAoY291bnQgPT0gKFJFT1JERVJfRU5UUllfTlVNLTEpKQorCQkJYnJlYWs7CisJCXBSeFJlb3JkZXJFbnRyeSA9ICZpZWVlLT5SeFJlb3JkZXJFbnRyeVtjb3VudCsxXTsKKwl9CisKK30KKworc3RhdGljIHZvaWQgQWRtaXRUUyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJICAgIHN0cnVjdCB0c19jb21tb25faW5mbyAqcFRzQ29tbW9uSW5mbywgdTMyIEluYWN0VGltZSkKK3sKKwlkZWxfdGltZXJfc3luYygmcFRzQ29tbW9uSW5mby0+U2V0dXBUaW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJnBUc0NvbW1vbkluZm8tPkluYWN0VGltZXIpOworCisJaWYgKEluYWN0VGltZSAhPSAwKQorCQltb2RfdGltZXIoJnBUc0NvbW1vbkluZm8tPkluYWN0VGltZXIsIGppZmZpZXMgKworCQkJICBNU0VDUyhJbmFjdFRpbWUpKTsKK30KKworc3RhdGljIHN0cnVjdCB0c19jb21tb25faW5mbyAqU2VhcmNoQWRtaXRUUlN0cmVhbShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCQkJCSAgdTggKkFkZHIsIHU4IFRJRCwKKwkJCQkJCSAgZW51bSB0cl9zZWxlY3QgVHhSeFNlbGVjdCkKK3sKKwl1OAlkaXI7CisJYm9vbAlzZWFyY2hfZGlyWzRdID0gezB9OworCXN0cnVjdCBsaXN0X2hlYWQgKnBzZWFyY2hfbGlzdDsKKwlzdHJ1Y3QgdHNfY29tbW9uX2luZm8gKnBSZXQgPSBOVUxMOworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7CisJCWlmIChUeFJ4U2VsZWN0ID09IFRYX0RJUikgeworCQkJc2VhcmNoX2RpcltESVJfRE9XTl0gPSB0cnVlOworCQkJc2VhcmNoX2RpcltESVJfQklfRElSXSA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlzZWFyY2hfZGlyW0RJUl9VUF0gPSB0cnVlOworCQkJc2VhcmNoX2RpcltESVJfQklfRElSXSA9IHRydWU7CisJCX0KKwl9IGVsc2UgaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgeworCQlpZiAoVHhSeFNlbGVjdCA9PSBUWF9ESVIpCisJCQlzZWFyY2hfZGlyW0RJUl9VUF0gPSB0cnVlOworCQllbHNlCisJCQlzZWFyY2hfZGlyW0RJUl9ET1dOXSA9IHRydWU7CisJfSBlbHNlIHsKKwkJaWYgKFR4UnhTZWxlY3QgPT0gVFhfRElSKSB7CisJCQlzZWFyY2hfZGlyW0RJUl9VUF0gPSB0cnVlOworCQkJc2VhcmNoX2RpcltESVJfQklfRElSXSA9IHRydWU7CisJCQlzZWFyY2hfZGlyW0RJUl9ESVJFQ1RdID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCXNlYXJjaF9kaXJbRElSX0RPV05dID0gdHJ1ZTsKKwkJCXNlYXJjaF9kaXJbRElSX0JJX0RJUl0gPSB0cnVlOworCQkJc2VhcmNoX2RpcltESVJfRElSRUNUXSA9IHRydWU7CisJCX0KKwl9CisKKwlpZiAoVHhSeFNlbGVjdCA9PSBUWF9ESVIpCisJCXBzZWFyY2hfbGlzdCA9ICZpZWVlLT5UeF9UU19BZG1pdF9MaXN0OworCWVsc2UKKwkJcHNlYXJjaF9saXN0ID0gJmllZWUtPlJ4X1RTX0FkbWl0X0xpc3Q7CisKKwlmb3IgKGRpciA9IDA7IGRpciA8PSBESVJfQklfRElSOyBkaXIrKykgeworCQlpZiAoc2VhcmNoX2RpcltkaXJdID09IGZhbHNlKQorCQkJY29udGludWU7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkocFJldCwgcHNlYXJjaF9saXN0LCBMaXN0KSB7CisJCQlpZiAobWVtY21wKHBSZXQtPkFkZHIsIEFkZHIsIDYpID09IDApCisJCQkJaWYgKHBSZXQtPlRTcGVjLmYuVFNJbmZvLmZpZWxkLnVjVFNJRCA9PSBUSUQpCisJCQkJCWlmIChwUmV0LT5UU3BlYy5mLlRTSW5mby5maWVsZC51Y0RpcmVjdGlvbiA9PSBkaXIpCisJCQkJCQlicmVhazsKKworCQl9CisJCWlmICgmcFJldC0+TGlzdCAgIT0gcHNlYXJjaF9saXN0KQorCQkJYnJlYWs7CisJfQorCisJaWYgKHBSZXQgJiYgJnBSZXQtPkxpc3QgICE9IHBzZWFyY2hfbGlzdCkKKwkJcmV0dXJuIHBSZXQgOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIE1ha2VUU0VudHJ5KHN0cnVjdCB0c19jb21tb25faW5mbyAqcFRzQ29tbW9uSW5mbywgdTggKkFkZHIsCisJCQl1bmlvbiB0c3BlY19ib2R5ICpwVFNQRUMsIHVuaW9uIHFvc190Y2xhcyAqcFRDTEFTLAorCQkJdTggVENMQVNfTnVtLCB1OCBUQ0xBU19Qcm9jKQoreworCXU4CWNvdW50OworCisJaWYgKHBUc0NvbW1vbkluZm8gPT0gTlVMTCkKKwkJcmV0dXJuOworCisJbWVtY3B5KHBUc0NvbW1vbkluZm8tPkFkZHIsIEFkZHIsIDYpOworCisJaWYgKHBUU1BFQyAhPSBOVUxMKQorCQltZW1jcHkoKHU4ICopKCYocFRzQ29tbW9uSW5mby0+VFNwZWMpKSwgKHU4ICopcFRTUEVDLAorCQkJc2l6ZW9mKHVuaW9uIHRzcGVjX2JvZHkpKTsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IFRDTEFTX051bTsgY291bnQrKykKKwkJbWVtY3B5KCh1OCAqKSgmKHBUc0NvbW1vbkluZm8tPlRDbGFzc1tjb3VudF0pKSwKKwkJICAgICAgICh1OCAqKXBUQ0xBUywgc2l6ZW9mKHVuaW9uIHFvc190Y2xhcykpOworCisJcFRzQ29tbW9uSW5mby0+VENsYXNQcm9jID0gVENMQVNfUHJvYzsKKwlwVHNDb21tb25JbmZvLT5UQ2xhc051bSA9IFRDTEFTX051bTsKK30KKworYm9vbCBHZXRUcyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHRzX2NvbW1vbl9pbmZvICoqcHBUUywKKwkgICB1OCAqQWRkciwgdTggVElELCBlbnVtIHRyX3NlbGVjdCBUeFJ4U2VsZWN0LCBib29sIGJBZGROZXdUcykKK3sKKwl1OAlVUCA9IDA7CisJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKEFkZHIpIHx8IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKEFkZHIpKSB7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiRVJSISBnZXQgVFMgZm9yIEJyb2FkY2FzdCBvciAiCisJCQkgICAgICJNdWx0aWNhc3RcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuc3VwcG9ydGVkID09IDApIHsKKwkJVVAgPSAwOworCX0gZWxzZSB7CisJCWlmICghSXNBQ1ZhbGlkKFRJRCkpIHsKKwkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiRVJSISBpbiAlcygpLCBUSUQoJWQpIGlzICIKKwkJCQkgICAgICJub3QgdmFsaWRcbiIsIF9fZnVuY19fLCBUSUQpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJc3dpdGNoIChUSUQpIHsKKwkJY2FzZSAwOgorCQljYXNlIDM6CisJCQlVUCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQljYXNlIDI6CisJCQlVUCA9IDI7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQljYXNlIDU6CisJCQlVUCA9IDU7CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQljYXNlIDc6CisJCQlVUCA9IDc7CisJCQlicmVhazsKKwkJfQorCX0KKworCSpwcFRTID0gU2VhcmNoQWRtaXRUUlN0cmVhbShpZWVlLCBBZGRyLCBVUCwgVHhSeFNlbGVjdCk7CisJaWYgKCpwcFRTICE9IE5VTEwpIHsKKwkJcmV0dXJuIHRydWU7CisJfSBlbHNlIHsKKwkJaWYgKGJBZGROZXdUcyA9PSBmYWxzZSkgeworCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9UUywgImFkZCBuZXcgVFMgZmFpbGVkIgorCQkJCSAgICAgIih0aWQ6JWQpXG4iLCBVUCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0gZWxzZSB7CisJCQl1bmlvbiB0c3BlY19ib2R5IFRTcGVjOworCQkJdW5pb24gcW9zX3RzaW5mbyAqcFRTSW5mbyA9ICZUU3BlYy5mLlRTSW5mbzsKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKnBVbnVzZWRMaXN0ID0KKwkJCQkoVHhSeFNlbGVjdCA9PSBUWF9ESVIpID8KKwkJCQkoJmllZWUtPlR4X1RTX1VudXNlZF9MaXN0KSA6CisJCQkJKCZpZWVlLT5SeF9UU19VbnVzZWRfTGlzdCk7CisKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKnBBZGRtaXRMaXN0ID0KKwkJCQkoVHhSeFNlbGVjdCA9PSBUWF9ESVIpID8KKwkJCQkoJmllZWUtPlR4X1RTX0FkbWl0X0xpc3QpIDoKKwkJCQkoJmllZWUtPlJ4X1RTX0FkbWl0X0xpc3QpOworCisJCQllbnVtIGRpcmVjdGlvbl92YWx1ZSBEaXIgPQorCQkJCSAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgPworCQkJCSAoKFR4UnhTZWxlY3QgPT0gVFhfRElSKSA/IERJUl9ET1dOIDogRElSX1VQKSA6CisJCQkJICgoVHhSeFNlbGVjdCA9PSBUWF9ESVIpID8gRElSX1VQIDogRElSX0RPV04pOworCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9UUywgInRvIGFkZCBUc1xuIik7CisJCQlpZiAoIWxpc3RfZW1wdHkocFVudXNlZExpc3QpKSB7CisJCQkJKCpwcFRTKSA9IGxpc3RfZW50cnkocFVudXNlZExpc3QtPm5leHQsCisJCQkJCSAgc3RydWN0IHRzX2NvbW1vbl9pbmZvLCBMaXN0KTsKKwkJCQlsaXN0X2RlbF9pbml0KCYoKnBwVFMpLT5MaXN0KTsKKwkJCQlpZiAoVHhSeFNlbGVjdCA9PSBUWF9ESVIpIHsKKwkJCQkJc3RydWN0IHR4X3RzX3JlY29yZCAqdG1wID0KKwkJCQkJCWNvbnRhaW5lcl9vZigqcHBUUywKKwkJCQkJCXN0cnVjdCB0eF90c19yZWNvcmQsCisJCQkJCQlUc0NvbW1vbkluZm8pOworCQkJCQlSZXNldFR4VHNFbnRyeSh0bXApOworCQkJCX0gZWxzZSB7CisJCQkJCXN0cnVjdCByeF90c19yZWNvcmQgKnRtcCA9CisJCQkJCQkgY29udGFpbmVyX29mKCpwcFRTLAorCQkJCQkJIHN0cnVjdCByeF90c19yZWNvcmQsCisJCQkJCQkgVHNDb21tb25JbmZvKTsKKwkJCQkJUmVzZXRSeFRzRW50cnkodG1wKTsKKwkJCQl9CisKKwkJCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX1RTLCAidG8gaW5pdCBjdXJyZW50IFRTIgorCQkJCQkgICAgICIsIFVQOiVkLCBEaXI6JWQsIGFkZHI6ICVwTSIKKwkJCQkJICAgICAiIHBwVHM9JXBcbiIsIFVQLCBEaXIsCisJCQkJCSAgICAgIEFkZHIsICpwcFRTKTsKKwkJCQlwVFNJbmZvLT5maWVsZC51Y1RyYWZmaWNUeXBlID0gMDsKKwkJCQlwVFNJbmZvLT5maWVsZC51Y1RTSUQgPSBVUDsKKwkJCQlwVFNJbmZvLT5maWVsZC51Y0RpcmVjdGlvbiA9IERpcjsKKwkJCQlwVFNJbmZvLT5maWVsZC51Y0FjY2Vzc1BvbGljeSA9IDE7CisJCQkJcFRTSW5mby0+ZmllbGQudWNBZ2dyZWdhdGlvbiA9IDA7CisJCQkJcFRTSW5mby0+ZmllbGQudWNQU0IgPSAwOworCQkJCXBUU0luZm8tPmZpZWxkLnVjVVAgPSBVUDsKKwkJCQlwVFNJbmZvLT5maWVsZC51Y1RTSW5mb0Fja1BvbGljeSA9IDA7CisJCQkJcFRTSW5mby0+ZmllbGQudWNTY2hlZHVsZSA9IDA7CisKKwkJCQlNYWtlVFNFbnRyeSgqcHBUUywgQWRkciwgJlRTcGVjLCBOVUxMLCAwLCAwKTsKKwkJCQlBZG1pdFRTKGllZWUsICpwcFRTLCAwKTsKKwkJCQlsaXN0X2FkZF90YWlsKCYoKCpwcFRTKS0+TGlzdCksIHBBZGRtaXRMaXN0KTsKKworCQkJCXJldHVybiB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgIkVSUiEhaW4gZnVuY3Rpb24gIgorCQkJCQkgICAgICIlcygpIFRoZXJlIGlzIG5vdCBlbm91Z2ggZGlyPSVkIgorCQkJCQkgICAgICIoMD11cCBkb3duPTEpIFRTIHJlY29yZCB0byBiZSAiCisJCQkJCSAgICAgInVzZWQhISIsIF9fZnVuY19fLCBEaXIpOworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgUmVtb3ZlVHNFbnRyeShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHRzX2NvbW1vbl9pbmZvICpwVHMsCisJCQkgIGVudW0gdHJfc2VsZWN0IFR4UnhTZWxlY3QpCit7CisJZGVsX3RpbWVyX3N5bmMoJnBUcy0+U2V0dXBUaW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJnBUcy0+SW5hY3RUaW1lcik7CisJVHNJbml0RGVsQkEoaWVlZSwgcFRzLCBUeFJ4U2VsZWN0KTsKKworCWlmIChUeFJ4U2VsZWN0ID09IFJYX0RJUikgeworCQlzdHJ1Y3QgcnhfcmVvcmRlcl9lbnRyeSAqcFJ4UmVvcmRlckVudHJ5OworCQlzdHJ1Y3QgcnhfdHNfcmVjb3JkICpwUnhUUyA9IChzdHJ1Y3QgcnhfdHNfcmVjb3JkICopcFRzOworCisJCWlmICh0aW1lcl9wZW5kaW5nKCZwUnhUUy0+UnhQa3RQZW5kaW5nVGltZXIpKQorCQkJZGVsX3RpbWVyX3N5bmMoJnBSeFRTLT5SeFBrdFBlbmRpbmdUaW1lcik7CisKKwkJd2hpbGUgKCFsaXN0X2VtcHR5KCZwUnhUUy0+UnhQZW5kaW5nUGt0TGlzdCkpIHsKKwkJCXBSeFJlb3JkZXJFbnRyeSA9IChzdHJ1Y3QgcnhfcmVvcmRlcl9lbnRyeSAqKQorCQkJCQlsaXN0X2VudHJ5KHBSeFRTLT5SeFBlbmRpbmdQa3RMaXN0LnByZXYsCisJCQkJCXN0cnVjdCByeF9yZW9yZGVyX2VudHJ5LCBMaXN0KTsKKwkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfUkVPUkRFUiwgIiVzKCk6IERlbGV0ZSBTZXFOdW0gIgorCQkJCSAgICAgIiVkIVxuIiwgX19mdW5jX18sCisJCQkJICAgICBwUnhSZW9yZGVyRW50cnktPlNlcU51bSk7CisJCQlsaXN0X2RlbF9pbml0KCZwUnhSZW9yZGVyRW50cnktPkxpc3QpOworCQkJeworCQkJCWludCBpID0gMDsKKwkJCQlzdHJ1Y3QgcnRsbGliX3J4YiAqcHJ4YiA9IHBSeFJlb3JkZXJFbnRyeS0+cHJ4YjsKKwkJCQlpZiAodW5saWtlbHkoIXByeGIpKQorCQkJCQlyZXR1cm47CisJCQkJZm9yIChpID0gMDsgaSA8IHByeGItPm5yX3N1YmZyYW1lczsgaSsrKQorCQkJCQlkZXZfa2ZyZWVfc2tiKHByeGItPnN1YmZyYW1lc1tpXSk7CisJCQkJa2ZyZWUocHJ4Yik7CisJCQkJcHJ4YiA9IE5VTEw7CisJCQl9CisJCQlsaXN0X2FkZF90YWlsKCZwUnhSZW9yZGVyRW50cnktPkxpc3QsCisJCQkJICAgICAgJmllZWUtPlJ4UmVvcmRlcl9VbnVzZWRfTGlzdCk7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3QgdHhfdHNfcmVjb3JkICpwVHhUUyA9IChzdHJ1Y3QgdHhfdHNfcmVjb3JkICopcFRzOworCQlkZWxfdGltZXJfc3luYygmcFR4VFMtPlRzQWRkQmFUaW1lcik7CisJfQorfQorCit2b2lkIFJlbW92ZVBlZXJUUyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggKkFkZHIpCit7CisJc3RydWN0IHRzX2NvbW1vbl9pbmZvICpwVFMsICpwVG1wVFM7CisJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT09PT0+UmVtb3ZlUGVlclRTLCAlcE1cbiIsIEFkZHIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBUUywgcFRtcFRTLCAmaWVlZS0+VHhfVFNfUGVuZGluZ19MaXN0LCBMaXN0KSB7CisJCWlmIChtZW1jbXAocFRTLT5BZGRyLCBBZGRyLCA2KSA9PSAwKSB7CisJCQlSZW1vdmVUc0VudHJ5KGllZWUsIHBUUywgVFhfRElSKTsKKwkJCWxpc3RfZGVsX2luaXQoJnBUUy0+TGlzdCk7CisJCQlsaXN0X2FkZF90YWlsKCZwVFMtPkxpc3QsICZpZWVlLT5UeF9UU19VbnVzZWRfTGlzdCk7CisJCX0KKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocFRTLCBwVG1wVFMsICZpZWVlLT5UeF9UU19BZG1pdF9MaXN0LCBMaXN0KSB7CisJCWlmIChtZW1jbXAocFRTLT5BZGRyLCBBZGRyLCA2KSA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICI9PT09PnJlbW92ZSBUeF9UU19hZG1pbl9saXN0XG4iKTsKKwkJCVJlbW92ZVRzRW50cnkoaWVlZSwgcFRTLCBUWF9ESVIpOworCQkJbGlzdF9kZWxfaW5pdCgmcFRTLT5MaXN0KTsKKwkJCWxpc3RfYWRkX3RhaWwoJnBUUy0+TGlzdCwgJmllZWUtPlR4X1RTX1VudXNlZF9MaXN0KTsKKwkJfQorCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwVFMsIHBUbXBUUywgJmllZWUtPlJ4X1RTX1BlbmRpbmdfTGlzdCwgTGlzdCkgeworCQlpZiAobWVtY21wKHBUUy0+QWRkciwgQWRkciwgNikgPT0gMCkgeworCQkJUmVtb3ZlVHNFbnRyeShpZWVlLCBwVFMsIFJYX0RJUik7CisJCQlsaXN0X2RlbF9pbml0KCZwVFMtPkxpc3QpOworCQkJbGlzdF9hZGRfdGFpbCgmcFRTLT5MaXN0LCAmaWVlZS0+UnhfVFNfVW51c2VkX0xpc3QpOworCQl9CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBUUywgcFRtcFRTLCAmaWVlZS0+UnhfVFNfQWRtaXRfTGlzdCwgTGlzdCkgeworCQlpZiAobWVtY21wKHBUUy0+QWRkciwgQWRkciwgNikgPT0gMCkgeworCQkJUmVtb3ZlVHNFbnRyeShpZWVlLCBwVFMsIFJYX0RJUik7CisJCQlsaXN0X2RlbF9pbml0KCZwVFMtPkxpc3QpOworCQkJbGlzdF9hZGRfdGFpbCgmcFRTLT5MaXN0LCAmaWVlZS0+UnhfVFNfVW51c2VkX0xpc3QpOworCQl9CisJfQorfQorCit2b2lkIFJlbW92ZUFsbFRTKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCB0c19jb21tb25faW5mbyAqcFRTLCAqcFRtcFRTOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBUUywgcFRtcFRTLCAmaWVlZS0+VHhfVFNfUGVuZGluZ19MaXN0LCBMaXN0KSB7CisJCVJlbW92ZVRzRW50cnkoaWVlZSwgcFRTLCBUWF9ESVIpOworCQlsaXN0X2RlbF9pbml0KCZwVFMtPkxpc3QpOworCQlsaXN0X2FkZF90YWlsKCZwVFMtPkxpc3QsICZpZWVlLT5UeF9UU19VbnVzZWRfTGlzdCk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBUUywgcFRtcFRTLCAmaWVlZS0+VHhfVFNfQWRtaXRfTGlzdCwgTGlzdCkgeworCQlSZW1vdmVUc0VudHJ5KGllZWUsIHBUUywgVFhfRElSKTsKKwkJbGlzdF9kZWxfaW5pdCgmcFRTLT5MaXN0KTsKKwkJbGlzdF9hZGRfdGFpbCgmcFRTLT5MaXN0LCAmaWVlZS0+VHhfVFNfVW51c2VkX0xpc3QpOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwVFMsIHBUbXBUUywgJmllZWUtPlJ4X1RTX1BlbmRpbmdfTGlzdCwgTGlzdCkgeworCQlSZW1vdmVUc0VudHJ5KGllZWUsIHBUUywgUlhfRElSKTsKKwkJbGlzdF9kZWxfaW5pdCgmcFRTLT5MaXN0KTsKKwkJbGlzdF9hZGRfdGFpbCgmcFRTLT5MaXN0LCAmaWVlZS0+UnhfVFNfVW51c2VkX0xpc3QpOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwVFMsIHBUbXBUUywgJmllZWUtPlJ4X1RTX0FkbWl0X0xpc3QsIExpc3QpIHsKKwkJUmVtb3ZlVHNFbnRyeShpZWVlLCBwVFMsIFJYX0RJUik7CisJCWxpc3RfZGVsX2luaXQoJnBUUy0+TGlzdCk7CisJCWxpc3RfYWRkX3RhaWwoJnBUUy0+TGlzdCwgJmllZWUtPlJ4X1RTX1VudXNlZF9MaXN0KTsKKwl9Cit9CisKK3ZvaWQgVHNTdGFydEFkZEJhUHJvY2VzcyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHR4X3RzX3JlY29yZCAqcFR4VFMpCit7CisJaWYgKHBUeFRTLT5iQWRkQmFSZXFJblByb2dyZXNzID09IGZhbHNlKSB7CisJCXBUeFRTLT5iQWRkQmFSZXFJblByb2dyZXNzID0gdHJ1ZTsKKworCQlpZiAocFR4VFMtPmJBZGRCYVJlcURlbGF5ZWQpIHsKKwkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfQkEsICJUc1N0YXJ0QWRkQmFQcm9jZXNzKCk6ICIKKwkJCQkgICAgICJEZWxheWVkIFN0YXJ0IEFEREJBIGFmdGVyIDYwIHNlYyEhXG4iKTsKKwkJCW1vZF90aW1lcigmcFR4VFMtPlRzQWRkQmFUaW1lciwgamlmZmllcyArCisJCQkJICBNU0VDUyhUU19BRERCQV9ERUxBWSkpOworCQl9IGVsc2UgeworCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9CQSwgIlRzU3RhcnRBZGRCYVByb2Nlc3MoKTogIgorCQkJCSAgICAgIkltbWVkaWF0ZWx5IFN0YXJ0IEFEREJBIG5vdyEhXG4iKTsKKwkJCW1vZF90aW1lcigmcFR4VFMtPlRzQWRkQmFUaW1lciwgamlmZmllcysxMCk7CisJCX0KKwl9IGVsc2UKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9CQSwgIiVzKCk9PT5CQSB0aW1lciBpcyBhbHJlYWR5IGFkZGVkXG4iLAorCQkJICAgICBfX2Z1bmNfXyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsX2NhbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9jYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWYzYjYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9jYW0uYwpAQCAtMCwwICsxLDMwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQmFzZWQgb24gdGhlIHI4MTgwIGRyaXZlciwgd2hpY2ggaXM6CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4sIGV0IGFsLgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInJ0bF9jb3JlLmgiCisjaW5jbHVkZSAicjgxOTJFX3BoeS5oIgorI2luY2x1ZGUgInI4MTkyRV9waHlyZWcuaCIKKyNpbmNsdWRlICJyODE5MFBfcnRsODI1Ni5oIiAvKiBSVEw4MjI1IFJhZGlvIGZyb250ZW5kICovCisjaW5jbHVkZSAicjgxOTJFX2NtZHBrdC5oIgorCitleHRlcm4gaW50IGh3d2VwOwordm9pZCBDYW1SZXNldEFsbEVudHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTMyIHVsY29tbWFuZCA9IDA7CisKKwl1bGNvbW1hbmQgfD0gQklUMzF8QklUMzA7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgUldDQU0sIHVsY29tbWFuZCk7Cit9CisKK3ZvaWQgd3JpdGVfY2FtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkZHIsIHUzMiBkYXRhKQoreworCXdyaXRlX25pY19kd29yZChkZXYsIFdDQU1JLCBkYXRhKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSV0NBTSwgQklUMzF8QklUMTZ8KGFkZHImMHhmZikpOworfQorCit1MzIgcmVhZF9jYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRkcikKK3sKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSV0NBTSwgMHg4MDAwMDAwMHwoYWRkciYweGZmKSk7CisJcmV0dXJuIHJlYWRfbmljX2R3b3JkKGRldiwgMHhhOCk7Cit9CisKK3ZvaWQgRW5hYmxlSFdTZWN1cml0eUNvbmZpZzgxOTIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OCBTRUNSX3ZhbHVlID0gMHgwOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopcnRsbGliX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSA9IHByaXYtPnJ0bGxpYjsKKwlTRUNSX3ZhbHVlID0gU0NSX1R4RW5jRW5hYmxlIHwgU0NSX1J4RGVjRW5hYmxlOworCWlmICgoKEtFWV9UWVBFX1dFUDQwID09IGllZWUtPnBhaXJ3aXNlX2tleV90eXBlKSB8fAorCSAgICAgKEtFWV9UWVBFX1dFUDEwNCA9PSBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSkpICYmCisJICAgICAocHJpdi0+cnRsbGliLT5hdXRoX21vZGUgIT0gMikpIHsKKwkJU0VDUl92YWx1ZSB8PSBTQ1JfUnhVc2VESzsKKwkJU0VDUl92YWx1ZSB8PSBTQ1JfVHhVc2VESzsKKwl9IGVsc2UgaWYgKChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpICYmCisJCSAgIChpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSAmIChLRVlfVFlQRV9DQ01QIHwKKwkJICAgS0VZX1RZUEVfVEtJUCkpKSB7CisJCVNFQ1JfdmFsdWUgfD0gU0NSX1J4VXNlREs7CisJCVNFQ1JfdmFsdWUgfD0gU0NSX1R4VXNlREs7CisJfQorCisKKwlpZWVlLT5od3NlY19hY3RpdmUgPSAxOworCWlmICgoaWVlZS0+cEhUSW5mby0+SU9UQWN0aW9uJkhUX0lPVF9BQ1RfUFVSRV9OX01PREUpIHx8ICFod3dlcCkgeworCQlpZWVlLT5od3NlY19hY3RpdmUgPSAwOworCQlTRUNSX3ZhbHVlICY9IH5TQ1JfUnhEZWNFbmFibGU7CisJfQorCisJUlRfVFJBQ0UoQ09NUF9TRUMsICIlczosIGh3c2VjOiVkLCBwYWlyd2lzZV9rZXk6JWQsIFNFQ1JfdmFsdWU6JXhcbiIsCisJCSBfX2Z1bmNfXywgaWVlZS0+aHdzZWNfYWN0aXZlLCBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSwKKwkJIFNFQ1JfdmFsdWUpOworCXdyaXRlX25pY19ieXRlKGRldiwgU0VDUiwgIFNFQ1JfdmFsdWUpOworfQorCit2b2lkIHNldF9zd2NhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBFbnRyeU5vLCB1OCBLZXlJbmRleCwgdTE2IEtleVR5cGUsCisJICAgICAgIHU4ICpNYWNBZGRyLCB1OCBEZWZhdWx0S2V5LCB1MzIgKktleUNvbnRlbnQsIHU4IGlzX21lc2gpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gcHJpdi0+cnRsbGliOworCVJUX1RSQUNFKENPTVBfREJHLCAiPT09PT09PT09PT0+JXMoKTpFbnRyeU5vIGlzICVkLEtleUluZGV4IGlzICIKKwkJICIlZCxLZXlUeXBlIGlzICVkLGlzX21lc2ggaXMgJWRcbiIsIF9fZnVuY19fLCBFbnRyeU5vLAorCQkgS2V5SW5kZXgsIEtleVR5cGUsIGlzX21lc2gpOworCWlmICghaXNfbWVzaCkgeworCQlpZWVlLT5zd2NhbXRhYmxlW0VudHJ5Tm9dLmJ1c2VkID0gdHJ1ZTsKKwkJaWVlZS0+c3djYW10YWJsZVtFbnRyeU5vXS5rZXlfaW5kZXggPSBLZXlJbmRleDsKKwkJaWVlZS0+c3djYW10YWJsZVtFbnRyeU5vXS5rZXlfdHlwZSA9IEtleVR5cGU7CisJCW1lbWNweShpZWVlLT5zd2NhbXRhYmxlW0VudHJ5Tm9dLm1hY2FkZHIsIE1hY0FkZHIsIDYpOworCQlpZWVlLT5zd2NhbXRhYmxlW0VudHJ5Tm9dLnVzZURLID0gRGVmYXVsdEtleTsKKwkJbWVtY3B5KGllZWUtPnN3Y2FtdGFibGVbRW50cnlOb10ua2V5X2J1ZiwgKHU4ICopS2V5Q29udGVudCwgMTYpOworCX0KK30KKwordm9pZCBzZXRLZXkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggRW50cnlObywgdTggS2V5SW5kZXgsIHUxNiBLZXlUeXBlLAorCSAgICB1OCAqTWFjQWRkciwgdTggRGVmYXVsdEtleSwgdTMyICpLZXlDb250ZW50KQoreworCXUzMiBUYXJnZXRDb21tYW5kID0gMDsKKwl1MzIgVGFyZ2V0Q29udGVudCA9IDA7CisJdTE2IHVzQ29uZmlnID0gMDsKKwl1OCBpOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopcnRsbGliX3ByaXYoZGV2KTsKKwllbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIHJ0U3RhdGU7CisJcnRTdGF0ZSA9IHByaXYtPnJ0bGxpYi0+ZVJGUG93ZXJTdGF0ZTsKKwlpZiAocHJpdi0+cnRsbGliLT5Qb3dlclNhdmVDb250cm9sLmJJbmFjdGl2ZVBzKSB7CisJCWlmIChydFN0YXRlID09IGVSZk9mZikgeworCQkJaWYgKHByaXYtPnJ0bGxpYi0+UmZPZmZSZWFzb24gPiBSRl9DSEFOR0VfQllfSVBTKSB7CisJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICIlcygpOiBSRiBpcyBPRkYuXG4iLAorCQkJCQlfX2Z1bmNfXyk7CisJCQkJcmV0dXJuIDsKKwkJCX0gZWxzZSB7CisJCQkJZG93bigmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKKwkJCQlJUFNMZWF2ZShkZXYpOworCQkJCXVwKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworCQkJfQorCQl9CisJfQorCXByaXYtPnJ0bGxpYi0+aXNfc2V0X2tleSA9IHRydWU7CisJaWYgKEVudHJ5Tm8gPj0gVE9UQUxfQ0FNX0VOVFJZKQorCQlSVF9UUkFDRShDT01QX0VSUiwgImNhbSBlbnRyeSBleGNlZWRzIGluIHNldEtleSgpXG4iKTsKKworCVJUX1RSQUNFKENPTVBfU0VDLCAiPT09PT50byBzZXRLZXkoKSwgZGV2OiVwLCBFbnRyeU5vOiVkLCBLZXlJbmRleDolZCwiCisJCSAiS2V5VHlwZTolZCwgTWFjQWRkciAlcE1cbiIsIGRldiwgRW50cnlObywgS2V5SW5kZXgsCisJCSBLZXlUeXBlLCBNYWNBZGRyKTsKKworCWlmIChEZWZhdWx0S2V5KQorCQl1c0NvbmZpZyB8PSBCSVQxNSB8IChLZXlUeXBlPDwyKTsKKwllbHNlCisJCXVzQ29uZmlnIHw9IEJJVDE1IHwgKEtleVR5cGU8PDIpIHwgS2V5SW5kZXg7CisKKworCWZvciAoaSA9IDA7IGkgPCBDQU1fQ09OVEVOVF9DT1VOVDsgaSsrKSB7CisJCVRhcmdldENvbW1hbmQgID0gaSArIENBTV9DT05URU5UX0NPVU5UICogRW50cnlObzsKKwkJVGFyZ2V0Q29tbWFuZCB8PSBCSVQzMXxCSVQxNjsKKworCQlpZiAoaSA9PSAwKSB7CisJCQlUYXJnZXRDb250ZW50ID0gKHUzMikoKihNYWNBZGRyKzApKSA8PCAxNiB8CisJCQkJKHUzMikoKihNYWNBZGRyKzEpKSA8PCAyNCB8CisJCQkJKHUzMil1c0NvbmZpZzsKKworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgV0NBTUksIFRhcmdldENvbnRlbnQpOworCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgUldDQU0sIFRhcmdldENvbW1hbmQpOworCQl9IGVsc2UgaWYgKGkgPT0gMSkgeworCQkJVGFyZ2V0Q29udGVudCA9ICh1MzIpKCooTWFjQWRkcisyKSkgfAorCQkJCSh1MzIpKCooTWFjQWRkciszKSkgPDwgIDggfAorCQkJCSh1MzIpKCooTWFjQWRkcis0KSkgPDwgMTYgfAorCQkJCSh1MzIpKCooTWFjQWRkcis1KSkgPDwgMjQ7CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXQ0FNSSwgVGFyZ2V0Q29udGVudCk7CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSV0NBTSwgVGFyZ2V0Q29tbWFuZCk7CisJCX0gZWxzZSB7CisJCQlpZiAoS2V5Q29udGVudCAhPSBOVUxMKSB7CisJCQkJd3JpdGVfbmljX2R3b3JkKGRldiwgV0NBTUksCisJCQkJCQkodTMyKSgqKEtleUNvbnRlbnQraS0yKSkpOworCQkJCXdyaXRlX25pY19kd29yZChkZXYsIFJXQ0FNLCBUYXJnZXRDb21tYW5kKTsKKwkJCQl1ZGVsYXkoMTAwKTsKKwkJCX0KKwkJfQorCX0KKwlSVF9UUkFDRShDT01QX1NFQywgIj09PT09PT09PT5hZnRlciBzZXQga2V5LCB1c2NvbmZpZzoleFxuIiwgdXNDb25maWcpOworfQorCit2b2lkIENBTV9yZWFkX2VudHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBpSW5kZXgpCit7CisJdTMyIHRhcmdldF9jb21tYW5kID0gMDsKKwl1MzIgdGFyZ2V0X2NvbnRlbnQgPSAwOworCXU4IGVudHJ5X2kgPSAwOworCXUzMiB1bFN0YXR1czsKKwlzMzIgaSA9IDEwMDsKKwlmb3IgKGVudHJ5X2kgPSAwOyBlbnRyeV9pIDwgQ0FNX0NPTlRFTlRfQ09VTlQ7IGVudHJ5X2krKykgeworCQl0YXJnZXRfY29tbWFuZCA9IGVudHJ5X2krQ0FNX0NPTlRFTlRfQ09VTlQqaUluZGV4OworCQl0YXJnZXRfY29tbWFuZCA9IHRhcmdldF9jb21tYW5kIHwgQklUMzE7CisKKwkJd2hpbGUgKChpLS0pID49IDApIHsKKwkJCXVsU3RhdHVzID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBSV0NBTSk7CisJCQlpZiAodWxTdGF0dXMgJiBCSVQzMSkKKwkJCQljb250aW51ZTsKKwkJCWVsc2UKKwkJCQlicmVhazsKKwkJfQorCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSV0NBTSwgdGFyZ2V0X2NvbW1hbmQpOworCQlSVF9UUkFDRShDT01QX1NFQywgIkNBTV9yZWFkX2VudHJ5KCk6IFdSSVRFIEEwOiAleFxuIiwKKwkJCSB0YXJnZXRfY29tbWFuZCk7CisJCXRhcmdldF9jb250ZW50ID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBSQ0FNTyk7CisJCVJUX1RSQUNFKENPTVBfU0VDLCAiQ0FNX3JlYWRfZW50cnkoKTogV1JJVEUgQTg6ICV4XG4iLAorCQkJIHRhcmdldF9jb250ZW50KTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKK30KKwordm9pZCBDYW1SZXN0b3JlQWxsRW50cnkoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OCBFbnRyeUlkID0gMDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJdTggKk1hY0FkZHIgPSBwcml2LT5ydGxsaWItPmN1cnJlbnRfbmV0d29yay5ic3NpZDsKKworCXN0YXRpYyB1OAlDQU1fQ09OU1RfQUREUls0XVs2XSA9IHsKKwkJezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAorCQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMX0sCisJCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyfSwKKwkJezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDN9CisJfTsKKwlzdGF0aWMgdTgJQ0FNX0NPTlNUX0JST0FEW10gPSB7CisJCTB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYKKwl9OworCisJUlRfVFJBQ0UoQ09NUF9TRUMsICJDYW1SZXN0b3JlQWxsRW50cnk6XG4iKTsKKworCisJaWYgKChwcml2LT5ydGxsaWItPnBhaXJ3aXNlX2tleV90eXBlID09IEtFWV9UWVBFX1dFUDQwKSB8fAorCSAgICAocHJpdi0+cnRsbGliLT5wYWlyd2lzZV9rZXlfdHlwZSA9PSBLRVlfVFlQRV9XRVAxMDQpKSB7CisKKwkJZm9yIChFbnRyeUlkID0gMDsgRW50cnlJZCA8IDQ7IEVudHJ5SWQrKykgeworCQkJTWFjQWRkciA9IENBTV9DT05TVF9BRERSW0VudHJ5SWRdOworCQkJaWYgKHByaXYtPnJ0bGxpYi0+c3djYW10YWJsZVtFbnRyeUlkXS5idXNlZCkgeworCQkJCXNldEtleShkZXYsIEVudHJ5SWQgLCBFbnRyeUlkLAorCQkJCSAgICAgICBwcml2LT5ydGxsaWItPnBhaXJ3aXNlX2tleV90eXBlLCBNYWNBZGRyLAorCQkJCSAgICAgICAwLCAodTMyICopKCZwcml2LT5ydGxsaWItPnN3Y2FtdGFibGUKKwkJCQkgICAgICBbRW50cnlJZF0ua2V5X2J1ZlswXSkpOworCQkJfQorCQl9CisKKwl9IGVsc2UgaWYgKHByaXYtPnJ0bGxpYi0+cGFpcndpc2Vfa2V5X3R5cGUgPT0gS0VZX1RZUEVfVEtJUCkgeworCQlpZiAocHJpdi0+cnRsbGliLT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKKwkJCXNldEtleShkZXYsIDQsIDAsIHByaXYtPnJ0bGxpYi0+cGFpcndpc2Vfa2V5X3R5cGUsCisJCQkgICAgICAgKHU4ICopZGV2LT5kZXZfYWRkciwgMCwKKwkJCSAgICAgICAodTMyICopKCZwcml2LT5ydGxsaWItPnN3Y2FtdGFibGVbNF0ua2V5X2J1ZlswXSkpOworCQl9IGVsc2UgeworCQkJc2V0S2V5KGRldiwgNCwgMCwgcHJpdi0+cnRsbGliLT5wYWlyd2lzZV9rZXlfdHlwZSwKKwkJCSAgICAgICBNYWNBZGRyLCAwLAorCQkJICAgICAgICh1MzIgKikoJnByaXYtPnJ0bGxpYi0+c3djYW10YWJsZVs0XS5rZXlfYnVmWzBdKSk7CisJCX0KKworCX0gZWxzZSBpZiAocHJpdi0+cnRsbGliLT5wYWlyd2lzZV9rZXlfdHlwZSA9PSBLRVlfVFlQRV9DQ01QKSB7CisJCWlmIChwcml2LT5ydGxsaWItPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgeworCQkJc2V0S2V5KGRldiwgNCwgMCwKKwkJCSAgICAgICBwcml2LT5ydGxsaWItPnBhaXJ3aXNlX2tleV90eXBlLAorCQkJICAgICAgICh1OCAqKWRldi0+ZGV2X2FkZHIsIDAsCisJCQkgICAgICAgKHUzMiAqKSgmcHJpdi0+cnRsbGliLT5zd2NhbXRhYmxlWzRdLgorCQkJICAgICAgIGtleV9idWZbMF0pKTsKKwkJfSBlbHNlIHsKKwkJCXNldEtleShkZXYsIDQsIDAsCisJCQkgICAgICAgcHJpdi0+cnRsbGliLT5wYWlyd2lzZV9rZXlfdHlwZSwgTWFjQWRkciwKKwkJCSAgICAgICAwLCAodTMyICopKCZwcml2LT5ydGxsaWItPnN3Y2FtdGFibGVbNF0uCisJCQkgICAgICAga2V5X2J1ZlswXSkpOworCQkJfQorCX0KKworCWlmIChwcml2LT5ydGxsaWItPmdyb3VwX2tleV90eXBlID09IEtFWV9UWVBFX1RLSVApIHsKKwkJTWFjQWRkciA9IENBTV9DT05TVF9CUk9BRDsKKwkJZm9yIChFbnRyeUlkID0gMTsgRW50cnlJZCA8IDQ7IEVudHJ5SWQrKykgeworCQkJaWYgKHByaXYtPnJ0bGxpYi0+c3djYW10YWJsZVtFbnRyeUlkXS5idXNlZCkgeworCQkJCXNldEtleShkZXYsIEVudHJ5SWQsIEVudHJ5SWQsCisJCQkJCXByaXYtPnJ0bGxpYi0+Z3JvdXBfa2V5X3R5cGUsCisJCQkJCU1hY0FkZHIsIDAsCisJCQkJCSh1MzIgKikoJnByaXYtPnJ0bGxpYi0+c3djYW10YWJsZVtFbnRyeUlkXS5rZXlfYnVmWzBdKQorCQkJCSAgICAgKTsKKwkJCX0KKwkJfQorCQlpZiAocHJpdi0+cnRsbGliLT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKKwkJCWlmIChwcml2LT5ydGxsaWItPnN3Y2FtdGFibGVbMF0uYnVzZWQpIHsKKwkJCQlzZXRLZXkoZGV2LCAwLCAwLAorCQkJCSAgICAgICBwcml2LT5ydGxsaWItPmdyb3VwX2tleV90eXBlLAorCQkJCSAgICAgICBDQU1fQ09OU1RfQUREUlswXSwgMCwKKwkJCQkgICAgICAgKHUzMiAqKSgmcHJpdi0+cnRsbGliLT5zd2NhbXRhYmxlWzBdLmtleV9idWZbMF0pCisJCQkJICAgICApOworCQkJfSBlbHNlIHsKKwkJCQlSVF9UUkFDRShDT01QX0VSUiwgIj09PT4lcygpOkVSUiEhIEFESE9DIFRLSVAgIgorCQkJCQkgIixidXQgMCBlbnRyeSBpcyBoYXZlIG5vIGRhdGFcbiIsCisJCQkJCSBfX2Z1bmNfXyk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChwcml2LT5ydGxsaWItPmdyb3VwX2tleV90eXBlID09IEtFWV9UWVBFX0NDTVApIHsKKwkJTWFjQWRkciA9IENBTV9DT05TVF9CUk9BRDsKKwkJZm9yIChFbnRyeUlkID0gMTsgRW50cnlJZCA8IDQ7IEVudHJ5SWQrKykgeworCQkJaWYgKHByaXYtPnJ0bGxpYi0+c3djYW10YWJsZVtFbnRyeUlkXS5idXNlZCkgeworCQkJCXNldEtleShkZXYsIEVudHJ5SWQgLCBFbnRyeUlkLAorCQkJCSAgICAgICBwcml2LT5ydGxsaWItPmdyb3VwX2tleV90eXBlLAorCQkJCSAgICAgICBNYWNBZGRyLCAwLAorCQkJCSAgICAgICAodTMyICopKCZwcml2LT5ydGxsaWItPnN3Y2FtdGFibGVbRW50cnlJZF0ua2V5X2J1ZlswXSkpOworCQkJfQorCQl9CisKKwkJaWYgKHByaXYtPnJ0bGxpYi0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7CisJCQlpZiAocHJpdi0+cnRsbGliLT5zd2NhbXRhYmxlWzBdLmJ1c2VkKSB7CisJCQkJc2V0S2V5KGRldiwgMCAsIDAsCisJCQkJCXByaXYtPnJ0bGxpYi0+Z3JvdXBfa2V5X3R5cGUsCisJCQkJCUNBTV9DT05TVF9BRERSWzBdLCAwLAorCQkJCQkodTMyICopKCZwcml2LT5ydGxsaWItPnN3Y2FtdGFibGVbMF0ua2V5X2J1ZlswXSkpOworCQkJfSBlbHNlIHsKKwkJCQlSVF9UUkFDRShDT01QX0VSUiwgIj09PT4lcygpOkVSUiEhIEFESE9DIENDTVAgLCIKKwkJCQkJICJidXQgMCBlbnRyeSBpcyBoYXZlIG5vIGRhdGFcbiIsCisJCQkJCSBfX2Z1bmNfXyk7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9jYW0uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxfY2FtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2MDdmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxfY2FtLmgKQEAgLTAsMCArMSw0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQmFzZWQgb24gdGhlIHI4MTgwIGRyaXZlciwgd2hpY2ggaXM6CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4sIGV0IGFsLgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfUlRMX0NBTV9ICisjZGVmaW5lIF9SVExfQ0FNX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CitzdHJ1Y3QgbmV0X2RldmljZTsKKwordm9pZCBDYW1SZXNldEFsbEVudHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBFbmFibGVIV1NlY3VyaXR5Q29uZmlnODE5MihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgc2V0S2V5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IEVudHJ5Tm8sIHU4IEtleUluZGV4LCB1MTYgS2V5VHlwZSwKKwkgICAgdTggKk1hY0FkZHIsIHU4IERlZmF1bHRLZXksIHUzMiAqS2V5Q29udGVudCk7Cit2b2lkIHNldF9zd2NhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBFbnRyeU5vLCB1OCBLZXlJbmRleCwgdTE2IEtleVR5cGUsCisJICAgICAgIHU4ICpNYWNBZGRyLCB1OCBEZWZhdWx0S2V5LCB1MzIgKktleUNvbnRlbnQsIHU4IGlzX21lc2gpOwordm9pZCBDYW1QcmludERiZ1JlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwordTMyIHJlYWRfY2FtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGFkZHIpOwordm9pZCB3cml0ZV9jYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggYWRkciwgdTMyIGRhdGEpOworCit2b2lkIENhbVJlc3RvcmVBbGxFbnRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwordm9pZCBDQU1fcmVhZF9lbnRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgaUluZGV4KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxfY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZDk2NjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsX2NvcmUuYwpAQCAtMCwwICsxLDMxOTggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEJhc2VkIG9uIHRoZSByODE4MCBkcml2ZXIsIHdoaWNoIGlzOgorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+LCBldCBhbC4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyN1bmRlZiBSWF9ET05UX1BBU1NfVUwKKyN1bmRlZiBERUJVR19FUFJPTQorI3VuZGVmIERFQlVHX1JYX1ZFUkJPU0UKKyN1bmRlZiBEVU1NWV9SWAorI3VuZGVmIERFQlVHX1pFUk9fUlgKKyN1bmRlZiBERUJVR19SWF9TS0IKKyN1bmRlZiBERUJVR19UWF9GUkFHCisjdW5kZWYgREVCVUdfUlhfRlJBRworI3VuZGVmIERFQlVHX1RYX0ZJTExERVNDCisjdW5kZWYgREVCVUdfVFgKKyN1bmRlZiBERUJVR19JUlEKKyN1bmRlZiBERUJVR19SWAorI3VuZGVmIERFQlVHX1JYQUxMT0MKKyN1bmRlZiBERUJVR19SRUdJU1RFUlMKKyN1bmRlZiBERUJVR19SSU5HCisjdW5kZWYgREVCVUdfSVJRX1RBU0tMRVQKKyN1bmRlZiBERUJVR19UWF9BTExPQworI3VuZGVmIERFQlVHX1RYX0RFU0MKKworI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSAicnRsX2NvcmUuaCIKKyNpbmNsdWRlICJyODE5MkVfcGh5LmgiCisjaW5jbHVkZSAicjgxOTJFX3BoeXJlZy5oIgorI2luY2x1ZGUgInI4MTkwUF9ydGw4MjU2LmgiCisjaW5jbHVkZSAicjgxOTJFX2NtZHBrdC5oIgorCisjaW5jbHVkZSAicnRsX3d4LmgiCisjaW5jbHVkZSAicnRsX2RtLmgiCisKKyNpZmRlZiBDT05GSUdfUE1fUlRMCisjaW5jbHVkZSAicnRsX3BtLmgiCisjZW5kaWYKKworaW50IGh3d2VwID0gMTsKK3N0YXRpYyBpbnQgY2hhbm5lbHMgPSAweDNmZmY7CitzdGF0aWMgY2hhciAqaWZuYW1lID0gIndsYW4lZCI7CisKKworc3RhdGljIHN0cnVjdCBydGw4MTl4X29wcyBydGw4MTl4cF9vcHMgPSB7CisJLm5pY190eXBlCQkJPSBOSUNfODE5MkUsCisJLmdldF9lZXByb21fc2l6ZQkJPSBydGw4MTkyX2dldF9lZXByb21fc2l6ZSwKKwkuaW5pdF9hZGFwdGVyX3ZhcmlhYmxlCQk9IHJ0bDgxOTJfSW5pdGlhbGl6ZVZhcmlhYmxlcywKKwkuaW5pdGlhbGl6ZV9hZGFwdGVyCQk9IHJ0bDgxOTJfYWRhcHRlcl9zdGFydCwKKwkubGlua19jaGFuZ2UJCQk9IHJ0bDgxOTJfbGlua19jaGFuZ2UsCisJLnR4X2ZpbGxfZGVzY3JpcHRvcgkJPSBydGw4MTkyX3R4X2ZpbGxfZGVzYywKKwkudHhfZmlsbF9jbWRfZGVzY3JpcHRvcgkJPSBydGw4MTkyX3R4X2ZpbGxfY21kX2Rlc2MsCisJLnJ4X3F1ZXJ5X3N0YXR1c19kZXNjcmlwdG9yCT0gcnRsODE5Ml9yeF9xdWVyeV9zdGF0dXNfZGVzYywKKwkucnhfY29tbWFuZF9wYWNrZXRfaGFuZGxlciA9IE5VTEwsCisJLnN0b3BfYWRhcHRlcgkJCT0gcnRsODE5Ml9oYWx0X2FkYXB0ZXIsCisJLnVwZGF0ZV9yYXRyX3RhYmxlCQk9IHJ0bDgxOTJfdXBkYXRlX3JhdHJfdGFibGUsCisJLmlycV9lbmFibGUJCQk9IHJ0bDgxOTJfRW5hYmxlSW50ZXJydXB0LAorCS5pcnFfZGlzYWJsZQkJCT0gcnRsODE5Ml9EaXNhYmxlSW50ZXJydXB0LAorCS5pcnFfY2xlYXIJCQk9IHJ0bDgxOTJfQ2xlYXJJbnRlcnJ1cHQsCisJLnJ4X2VuYWJsZQkJCT0gcnRsODE5Ml9lbmFibGVfcngsCisJLnR4X2VuYWJsZQkJCT0gcnRsODE5Ml9lbmFibGVfdHgsCisJLmludGVycnVwdF9yZWNvZ25pemVkCQk9IHJ0bDgxOTJfaW50ZXJydXB0X3JlY29nbml6ZWQsCisJLlR4Q2hlY2tTdHVja0hhbmRsZXIJCT0gcnRsODE5Ml9IYWxUeENoZWNrU3R1Y2ssCisJLlJ4Q2hlY2tTdHVja0hhbmRsZXIJCT0gcnRsODE5Ml9IYWxSeENoZWNrU3R1Y2ssCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgcnRsODE5Ml9wY2lfaWRfdGJsW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7UlRMX1BDSV9ERVZJQ0UoMHgxMGVjLCAweDgxOTIsIHJ0bDgxOXhwX29wcyl9LAorCXtSVExfUENJX0RFVklDRSgweDA3YWEsIDB4MDA0NCwgcnRsODE5eHBfb3BzKX0sCisJe1JUTF9QQ0lfREVWSUNFKDB4MDdhYSwgMHgwMDQ3LCBydGw4MTl4cF9vcHMpfSwKKwl7fQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHJ0bDgxOTJfcGNpX2lkX3RibCk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJ0bDgxOTJfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKTsKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBydGw4MTkyX3BjaV9kaXNjb25uZWN0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHJ0bDgxOTJfcGNpX2RyaXZlciA9IHsKKwkubmFtZSA9IERSVl9OQU1FLAkvKiBEcml2ZXIgbmFtZSAgICovCisJLmlkX3RhYmxlID0gcnRsODE5Ml9wY2lfaWRfdGJsLAkvKiBQQ0lfSUQgdGFibGUgICovCisJLnByb2JlCT0gcnRsODE5Ml9wY2lfcHJvYmUsCS8qIHByb2JlIGZuICAgICAgKi8KKwkucmVtb3ZlCSA9IF9fZGV2ZXhpdF9wKHJ0bDgxOTJfcGNpX2Rpc2Nvbm5lY3QpLAkvKiByZW1vdmUgZm4gKi8KKwkuc3VzcGVuZCA9IHJ0bDgxOTJFX3N1c3BlbmQsCS8qIFBNIHN1c3BlbmQgZm4gKi8KKwkucmVzdW1lID0gcnRsODE5MkVfcmVzdW1lLCAgICAgICAgICAgICAgICAgLyogUE0gcmVzdW1lIGZuICAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tSU8gU1RVRkYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBib29sIFBsYXRmb3JtSU9DaGVja1BhZ2VMZWdhbEFuZEdldFJlZ01hc2sodTMyIHU0YlBhZ2UsIHU4ICpwdTFiUGFnZU1hc2spCit7CisJYm9vbAkJYlJldHVybiA9IGZhbHNlOworCisJKnB1MWJQYWdlTWFzayA9IDB4ZmU7CisKKwlzd2l0Y2ggKHU0YlBhZ2UpIHsKKwljYXNlIDE6IGNhc2UgMjogY2FzZSAzOiBjYXNlIDQ6CisJY2FzZSA4OiBjYXNlIDk6IGNhc2UgMTA6IGNhc2UgMTI6IGNhc2UgMTM6CisJCWJSZXR1cm4gPSB0cnVlOworCQkqcHUxYlBhZ2VNYXNrID0gMHhmMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQliUmV0dXJuID0gZmFsc2U7CisJCWJyZWFrOworCX0KKworCXJldHVybiBiUmV0dXJuOworfQorCit2b2lkIHdyaXRlX25pY19pb19ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LCB1OCB5KQoreworCXUzMiB1NGJQYWdlID0gKHggPj4gOCk7CisJdTggdTFQYWdlTWFzayA9IDA7CisJYm9vbAliSXNMZWdhbFBhZ2UgPSBmYWxzZTsKKworCWlmICh1NGJQYWdlID09IDApIHsKKwkJb3V0Yih5JjB4ZmYsIGRldi0+YmFzZV9hZGRyICsgeCk7CisKKwl9IGVsc2UgeworCQliSXNMZWdhbFBhZ2UgPSBQbGF0Zm9ybUlPQ2hlY2tQYWdlTGVnYWxBbmRHZXRSZWdNYXNrKHU0YlBhZ2UsCisJCQkgICAgICAgJnUxUGFnZU1hc2spOworCQlpZiAoYklzTGVnYWxQYWdlKSB7CisJCQl1OCB1MWJQc3IgPSByZWFkX25pY19pb19ieXRlKGRldiwgUFNSKTsKKworCQkJd3JpdGVfbmljX2lvX2J5dGUoZGV2LCBQU1IsICgodTFiUHNyICYgdTFQYWdlTWFzaykgfAorCQkJCQkgICh1OCl1NGJQYWdlKSk7CisJCQl3cml0ZV9uaWNfaW9fYnl0ZShkZXYsICh4ICYgMHhmZiksIHkpOworCQkJd3JpdGVfbmljX2lvX2J5dGUoZGV2LCBQU1IsICh1MWJQc3IgJiB1MVBhZ2VNYXNrKSk7CisJCX0KKwl9Cit9CisKK3ZvaWQgd3JpdGVfbmljX2lvX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsIHUxNiB5KQoreworCXUzMiB1NGJQYWdlID0gKHggPj4gOCk7CisJdTggdTFQYWdlTWFzayA9IDA7CisJYm9vbAliSXNMZWdhbFBhZ2UgPSBmYWxzZTsKKworCWlmICh1NGJQYWdlID09IDApIHsKKwkJb3V0dyh5LCBkZXYtPmJhc2VfYWRkciArIHgpOworCX0gZWxzZSB7CisJCWJJc0xlZ2FsUGFnZSA9IFBsYXRmb3JtSU9DaGVja1BhZ2VMZWdhbEFuZEdldFJlZ01hc2sodTRiUGFnZSwKKwkJCQkJCQkgJnUxUGFnZU1hc2spOworCQlpZiAoYklzTGVnYWxQYWdlKSB7CisJCQl1OCB1MWJQc3IgPSByZWFkX25pY19pb19ieXRlKGRldiwgUFNSKTsKKworCQkJd3JpdGVfbmljX2lvX2J5dGUoZGV2LCBQU1IsICgodTFiUHNyICYgdTFQYWdlTWFzaykgfAorCQkJCQkgICh1OCl1NGJQYWdlKSk7CisJCQl3cml0ZV9uaWNfaW9fd29yZChkZXYsICh4ICYgMHhmZiksIHkpOworCQkJd3JpdGVfbmljX2lvX2J5dGUoZGV2LCBQU1IsICh1MWJQc3IgJiB1MVBhZ2VNYXNrKSk7CisKKwkJfQorCX0KK30KKwordm9pZCB3cml0ZV9uaWNfaW9fZHdvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsIHUzMiB5KQoreworCXUzMiB1NGJQYWdlID0gKHggPj4gOCk7CisJdTggdTFQYWdlTWFzayA9IDA7CisJYm9vbAliSXNMZWdhbFBhZ2UgPSBmYWxzZTsKKworCWlmICh1NGJQYWdlID09IDApIHsKKwkJb3V0bCh5LCBkZXYtPmJhc2VfYWRkciArIHgpOworCX0gZWxzZSB7CisJCWJJc0xlZ2FsUGFnZSA9IFBsYXRmb3JtSU9DaGVja1BhZ2VMZWdhbEFuZEdldFJlZ01hc2sodTRiUGFnZSwKKwkJCQkJCSAmdTFQYWdlTWFzayk7CisJCWlmIChiSXNMZWdhbFBhZ2UpIHsKKwkJCXU4IHUxYlBzciA9IHJlYWRfbmljX2lvX2J5dGUoZGV2LCBQU1IpOworCisJCQl3cml0ZV9uaWNfaW9fYnl0ZShkZXYsIFBTUiwgKCh1MWJQc3IgJiB1MVBhZ2VNYXNrKSB8CisJCQkJCSAgKHU4KXU0YlBhZ2UpKTsKKwkJCXdyaXRlX25pY19pb19kd29yZChkZXYsICh4ICYgMHhmZiksIHkpOworCQkJd3JpdGVfbmljX2lvX2J5dGUoZGV2LCBQU1IsICh1MWJQc3IgJiB1MVBhZ2VNYXNrKSk7CisJCX0KKwl9Cit9CisKK3U4IHJlYWRfbmljX2lvX2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpCit7CisJdTMyIHU0YlBhZ2UgPSAoeCA+PiA4KTsKKwl1OCB1MVBhZ2VNYXNrID0gMDsKKwlib29sCWJJc0xlZ2FsUGFnZSA9IGZhbHNlOworCXU4CURhdGEgPSAwOworCisJaWYgKHU0YlBhZ2UgPT0gMCkgeworCQlyZXR1cm4gMHhmZiZpbmIoZGV2LT5iYXNlX2FkZHIgKyB4KTsKKwl9IGVsc2UgeworCQliSXNMZWdhbFBhZ2UgPSBQbGF0Zm9ybUlPQ2hlY2tQYWdlTGVnYWxBbmRHZXRSZWdNYXNrKHU0YlBhZ2UsCisJCQkJCQkJJnUxUGFnZU1hc2spOworCQlpZiAoYklzTGVnYWxQYWdlKSB7CisJCQl1OCB1MWJQc3IgPSByZWFkX25pY19pb19ieXRlKGRldiwgUFNSKTsKKworCQkJd3JpdGVfbmljX2lvX2J5dGUoZGV2LCBQU1IsICgodTFiUHNyICYgdTFQYWdlTWFzaykgfAorCQkJCQkgICh1OCl1NGJQYWdlKSk7CisJCQlEYXRhID0gcmVhZF9uaWNfaW9fYnl0ZShkZXYsICh4ICYgMHhmZikpOworCQkJd3JpdGVfbmljX2lvX2J5dGUoZGV2LCBQU1IsICh1MWJQc3IgJiB1MVBhZ2VNYXNrKSk7CisJCX0KKwl9CisKKwlyZXR1cm4gRGF0YTsKK30KKwordTE2IHJlYWRfbmljX2lvX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpCit7CisJdTMyIHU0YlBhZ2UgPSAoeCA+PiA4KTsKKwl1OCB1MVBhZ2VNYXNrID0gMDsKKwlib29sCWJJc0xlZ2FsUGFnZSA9IGZhbHNlOworCXUxNglEYXRhID0gMDsKKworCWlmICh1NGJQYWdlID09IDApIHsKKwkJcmV0dXJuIGludyhkZXYtPmJhc2VfYWRkciArIHgpOworCX0gZWxzZSB7CisJCWJJc0xlZ2FsUGFnZSA9IFBsYXRmb3JtSU9DaGVja1BhZ2VMZWdhbEFuZEdldFJlZ01hc2sodTRiUGFnZSwKKwkJCSAgICAgICAmdTFQYWdlTWFzayk7CisJCWlmIChiSXNMZWdhbFBhZ2UpIHsKKwkJCXU4IHUxYlBzciA9IHJlYWRfbmljX2lvX2J5dGUoZGV2LCBQU1IpOworCisJCQl3cml0ZV9uaWNfaW9fYnl0ZShkZXYsIFBTUiwgKCh1MWJQc3IgJiB1MVBhZ2VNYXNrKSB8CisJCQkJCSAgKHU4KXU0YlBhZ2UpKTsKKwkJCURhdGEgPSByZWFkX25pY19pb193b3JkKGRldiwgKHggJiAweGZmKSk7CisJCQl3cml0ZV9uaWNfaW9fYnl0ZShkZXYsIFBTUiwgKHUxYlBzciAmIHUxUGFnZU1hc2spKTsKKworCQl9CisJfQorCisJcmV0dXJuIERhdGE7Cit9CisKK3UzMiByZWFkX25pY19pb19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCkKK3sKKwl1MzIgdTRiUGFnZSA9ICh4ID4+IDgpOworCXU4IHUxUGFnZU1hc2sgPSAwOworCWJvb2wJYklzTGVnYWxQYWdlID0gZmFsc2U7CisJdTMyCURhdGEgPSAwOworCisJaWYgKHU0YlBhZ2UgPT0gMCkgeworCQlyZXR1cm4gaW5sKGRldi0+YmFzZV9hZGRyICsgeCk7CisJfSBlbHNlIHsKKwkJYklzTGVnYWxQYWdlID0gUGxhdGZvcm1JT0NoZWNrUGFnZUxlZ2FsQW5kR2V0UmVnTWFzayh1NGJQYWdlLAorCQkJICAgICAgICZ1MVBhZ2VNYXNrKTsKKwkJaWYgKGJJc0xlZ2FsUGFnZSkgeworCQkJdTggdTFiUHNyID0gcmVhZF9uaWNfaW9fYnl0ZShkZXYsIFBTUik7CisKKwkJCXdyaXRlX25pY19pb19ieXRlKGRldiwgUFNSLCAoKHUxYlBzciAmIHUxUGFnZU1hc2spIHwKKwkJCQkJICAodTgpdTRiUGFnZSkpOworCQkJRGF0YSA9IHJlYWRfbmljX2lvX2R3b3JkKGRldiwgKHggJiAweGZmKSk7CisJCQl3cml0ZV9uaWNfaW9fYnl0ZShkZXYsIFBTUiwgKHUxYlBzciAmIHUxUGFnZU1hc2spKTsKKworCQl9CisJfQorCisJcmV0dXJuIERhdGE7Cit9CisKK3U4IHJlYWRfbmljX2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpCit7CisJcmV0dXJuIDB4ZmYgJiByZWFkYigodTggX19pb21lbSAqKWRldi0+bWVtX3N0YXJ0ICsgeCk7Cit9CisKK3UzMiByZWFkX25pY19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCkKK3sKKwlyZXR1cm4gcmVhZGwoKHU4IF9faW9tZW0gKilkZXYtPm1lbV9zdGFydCArIHgpOworfQorCit1MTYgcmVhZF9uaWNfd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCkKK3sKKwlyZXR1cm4gcmVhZHcoKHU4IF9faW9tZW0gKilkZXYtPm1lbV9zdGFydCArIHgpOworfQorCit2b2lkIHdyaXRlX25pY19ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LCB1OCB5KQoreworCXdyaXRlYih5LCAodTggX19pb21lbSAqKWRldi0+bWVtX3N0YXJ0ICsgeCk7CisKKwl1ZGVsYXkoMjApOworfQorCit2b2lkIHdyaXRlX25pY19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCwgdTMyIHkpCit7CisJd3JpdGVsKHksICh1OCBfX2lvbWVtICopZGV2LT5tZW1fc3RhcnQgKyB4KTsKKworCXVkZWxheSgyMCk7Cit9CisKK3ZvaWQgd3JpdGVfbmljX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsIHUxNiB5KQoreworCXdyaXRldyh5LCAodTggX19pb21lbSAqKWRldi0+bWVtX3N0YXJ0ICsgeCk7CisKKwl1ZGVsYXkoMjApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUkFMIEZVTkNUSU9OLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitib29sIE1nbnRBY3RTZXRfUkZfU3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBlbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIFN0YXRlVG9TZXQsCisJCQkgUlRfUkZfQ0hBTkdFX1NPVVJDRSBDaGFuZ2VTb3VyY2UsCisJCQkgYm9vbAlQcm90ZWN0T3JOb3QpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gcHJpdi0+cnRsbGliOworCWJvb2wJCQliQWN0aW9uQWxsb3dlZCA9IGZhbHNlOworCWJvb2wJCQliQ29ubmVjdEJ5U1NJRCA9IGZhbHNlOworCWVudW0gcnRfcmZfcG93ZXJfc3RhdGUgcnRTdGF0ZTsKKwl1MTYJCQlSRldhaXRDb3VudGVyID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWc7CisJUlRfVFJBQ0UoKENPTVBfUFMgfCBDT01QX1JGKSwgIj09PT5NZ250QWN0U2V0X1JGX1N0YXRlKCk6ICIKKwkJICJTdGF0ZVRvU2V0KCVkKVxuIiwgU3RhdGVUb1NldCk7CisKKwlQcm90ZWN0T3JOb3QgPSBmYWxzZTsKKworCisJaWYgKCFQcm90ZWN0T3JOb3QpIHsKKwkJd2hpbGUgKHRydWUpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZl9wc19sb2NrLCBmbGFnKTsKKwkJCWlmIChwcml2LT5SRkNoYW5nZUluUHJvZ3Jlc3MpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZl9wc19sb2NrLCBmbGFnKTsKKwkJCQlSVF9UUkFDRSgoQ09NUF9QUyB8IENPTVBfUkYpLAorCQkJCQkgIk1nbnRBY3RTZXRfUkZfU3RhdGUoKTogUkYgQ2hhbmdlIGluICIKKwkJCQkJICJwcm9ncmVzcyEgV2FpdCB0byBzZXQuLlN0YXRlVG9TZXQiCisJCQkJCSAiKCVkKS5cbiIsIFN0YXRlVG9TZXQpOworCisJCQkJd2hpbGUgKHByaXYtPlJGQ2hhbmdlSW5Qcm9ncmVzcykgeworCQkJCQlSRldhaXRDb3VudGVyKys7CisJCQkJCVJUX1RSQUNFKChDT01QX1BTIHwgQ09NUF9SRiksCisJCQkJCQkgIk1nbnRBY3RTZXRfUkZfU3RhdGUoKTogV2FpdCAxIgorCQkJCQkJICIgbXMgKCVkIHRpbWVzKS4uLlxuIiwKKwkJCQkJCSBSRldhaXRDb3VudGVyKTsKKwkJCQkJbWRlbGF5KDEpOworCisJCQkJCWlmIChSRldhaXRDb3VudGVyID4gMTAwKSB7CisJCQkJCQlSVF9UUkFDRShDT01QX0VSUiwgIk1nbnRBY3RTZXRfIgorCQkJCQkJCSAiUkZfU3RhdGUoKTogV2FpdCB0b28gIgorCQkJCQkJCSAibG9nbiB0byBzZXQgUkZcbiIpOworCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlwcml2LT5SRkNoYW5nZUluUHJvZ3Jlc3MgPSB0cnVlOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJmX3BzX2xvY2ssIGZsYWcpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcnRTdGF0ZSA9IHByaXYtPnJ0bGxpYi0+ZVJGUG93ZXJTdGF0ZTsKKworCXN3aXRjaCAoU3RhdGVUb1NldCkgeworCWNhc2UgZVJmT246CisJCXByaXYtPnJ0bGxpYi0+UmZPZmZSZWFzb24gJj0gKH5DaGFuZ2VTb3VyY2UpOworCisJCWlmICgoQ2hhbmdlU291cmNlID09IFJGX0NIQU5HRV9CWV9IVykgJiYKKwkJICAgIChwcml2LT5iSHdSYWRpb09mZiA9PSB0cnVlKSkKKwkJCXByaXYtPmJId1JhZGlvT2ZmID0gZmFsc2U7CisKKwkJaWYgKCFwcml2LT5ydGxsaWItPlJmT2ZmUmVhc29uKSB7CisJCQlwcml2LT5ydGxsaWItPlJmT2ZmUmVhc29uID0gMDsKKwkJCWJBY3Rpb25BbGxvd2VkID0gdHJ1ZTsKKworCisJCQlpZiAocnRTdGF0ZSA9PSBlUmZPZmYgJiYKKwkJCSAgICBDaGFuZ2VTb3VyY2UgPj0gUkZfQ0hBTkdFX0JZX0hXKQorCQkJCWJDb25uZWN0QnlTU0lEID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCVJUX1RSQUNFKChDT01QX1BTIHwgQ09NUF9SRiksICJNZ250QWN0U2V0X1JGX1N0YXRlIC0gIgorCQkJCSAiZVJmb24gcmVqZWN0IHBNZ250SW5mby0+UmZPZmZSZWFzb249IDB4JXgsIgorCQkJCSAiIENoYW5nZVNvdXJjZT0weCVYXG4iLAorCQkJCSAgcHJpdi0+cnRsbGliLT5SZk9mZlJlYXNvbiwgQ2hhbmdlU291cmNlKTsKKwl9CisKKwkJYnJlYWs7CisKKwljYXNlIGVSZk9mZjoKKworCQlpZiAoKHByaXYtPnJ0bGxpYi0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSB8fAorCQkgICAgKHByaXYtPnJ0bGxpYi0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSkgeworCQkJaWYgKChwcml2LT5ydGxsaWItPlJmT2ZmUmVhc29uID4gUkZfQ0hBTkdFX0JZX0lQUykgfHwKKwkJCSAgICAoQ2hhbmdlU291cmNlID4gUkZfQ0hBTkdFX0JZX0lQUykpIHsKKwkJCQlpZiAoaWVlZS0+c3RhdGUgPT0gUlRMTElCX0xJTktFRCkKKwkJCQkJcHJpdi0+YmxpbmtlZF9pbmdwaW8gPSB0cnVlOworCQkJCWVsc2UKKwkJCQkJcHJpdi0+YmxpbmtlZF9pbmdwaW8gPSBmYWxzZTsKKwkJCQlydGxsaWJfTWdudERpc2Nvbm5lY3QocHJpdi0+cnRsbGliLAorCQkJCQkJICAgICAgZGlzYXNfbHZfc3MpOworCQkJfQorCQl9CisJCWlmICgoQ2hhbmdlU291cmNlID09IFJGX0NIQU5HRV9CWV9IVykgJiYKKwkJICAgICAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gZmFsc2UpKQorCQkJcHJpdi0+Ykh3UmFkaW9PZmYgPSB0cnVlOworCQlwcml2LT5ydGxsaWItPlJmT2ZmUmVhc29uIHw9IENoYW5nZVNvdXJjZTsKKwkJYkFjdGlvbkFsbG93ZWQgPSB0cnVlOworCQlicmVhazsKKworCWNhc2UgZVJmU2xlZXA6CisJCXByaXYtPnJ0bGxpYi0+UmZPZmZSZWFzb24gfD0gQ2hhbmdlU291cmNlOworCQliQWN0aW9uQWxsb3dlZCA9IHRydWU7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKGJBY3Rpb25BbGxvd2VkKSB7CisJCVJUX1RSQUNFKChDT01QX1BTIHwgQ09NUF9SRiksICJNZ250QWN0U2V0X1JGX1N0YXRlKCk6IEFjdGlvbiBpcyIKKwkJCSAiIGFsbG93ZWQuLi4uIFN0YXRlVG9TZXQoJWQpLCBSZk9mZlJlYXNvbiglI1gpXG4iLAorCQkJIFN0YXRlVG9TZXQsIHByaXYtPnJ0bGxpYi0+UmZPZmZSZWFzb24pOworCQlQSFlfU2V0UkZQb3dlclN0YXRlKGRldiwgU3RhdGVUb1NldCk7CisJCWlmIChTdGF0ZVRvU2V0ID09IGVSZk9uKSB7CisKKwkJCWlmIChiQ29ubmVjdEJ5U1NJRCAmJiAocHJpdi0+YmxpbmtlZF9pbmdwaW8gPT0gdHJ1ZSkpIHsKKwkJCQlxdWV1ZV9kZWxheWVkX3dvcmtfcnNsKGllZWUtPndxLAorCQkJCQkgJmllZWUtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EsIDApOworCQkJCXByaXYtPmJsaW5rZWRfaW5ncGlvID0gZmFsc2U7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlSVF9UUkFDRSgoQ09NUF9QUyB8IENPTVBfUkYpLCAiTWdudEFjdFNldF9SRl9TdGF0ZSgpOiAiCisJCQkgIkFjdGlvbiBpcyByZWplY3RlZC4uLi4gU3RhdGVUb1NldCglZCksIENoYW5nZVNvdXJjZSIKKwkJCSAiKCUjWCksIFJmT2ZmUmVhc29uKCUjWClcbiIsIFN0YXRlVG9TZXQsIENoYW5nZVNvdXJjZSwKKwkJCSBwcml2LT5ydGxsaWItPlJmT2ZmUmVhc29uKTsKKwl9CisKKwlpZiAoIVByb3RlY3RPck5vdCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmZfcHNfbG9jaywgZmxhZyk7CisJCXByaXYtPlJGQ2hhbmdlSW5Qcm9ncmVzcyA9IGZhbHNlOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZl9wc19sb2NrLCBmbGFnKTsKKwl9CisKKwlSVF9UUkFDRSgoQ09NUF9QUyB8IENPTVBfUkYpLCAiPD09PU1nbnRBY3RTZXRfUkZfU3RhdGUoKVxuIik7CisJcmV0dXJuIGJBY3Rpb25BbGxvd2VkOworfQorCisKK3N0YXRpYyBzaG9ydCBydGw4MTkyX2dldF9uaWNfZGVzY19udW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHByaW8pCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXN0cnVjdCBydGw4MTkyX3R4X3JpbmcgKnJpbmcgPSAmcHJpdi0+dHhfcmluZ1twcmlvXTsKKworCS8qIEZvciBub3csIHdlIHJlc2VydmVkIHR3byBmcmVlIGRlc2NyaXB0b3IgYXMgYSBzYWZldHkgYm91bmRhcnkKKwkqIGJldHdlZW4gdGhlIHRhaWwgYW5kIHRoZSBoZWFkCisJKi8KKwlpZiAoKHByaW8gPT0gTUdOVF9RVUVVRSkgJiYgKHNrYl9xdWV1ZV9sZW4oJnJpbmctPnF1ZXVlKSA+IDEwKSkKKwkJUlRfVFJBQ0UoQ09NUF9EQkcsICItLS0tLVslZF0tLS0tLS0tLS1yaW5nLT5pZHg9JWQgIgorCQkJICJxdWV1ZV9sZW49JWQtLS0tLS0tLS1cbiIsIHByaW8sIHJpbmctPmlkeCwKKwkJCSBza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSkpOworCXJldHVybiBza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSk7Cit9CisKK3N0YXRpYyBzaG9ydCBydGw4MTkyX2NoZWNrX25pY19lbm91Z2hfZGVzYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcHJpbykKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJc3RydWN0IHJ0bDgxOTJfdHhfcmluZyAqcmluZyA9ICZwcml2LT50eF9yaW5nW3ByaW9dOworCisJaWYgKHJpbmctPmVudHJpZXMgLSBza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSkgPj0gMikKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgcnRsODE5Ml90eF90aW1lb3V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJc2NoZWR1bGVfd29yaygmcHJpdi0+cmVzZXRfd3EpOworCXByaW50ayhLRVJOX0lORk8gIlRYVElNRU9VVCIpOworfQorCit2b2lkIHJ0bDgxOTJfaXJxX2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopcnRsbGliX3ByaXYoZGV2KTsKKwlwcml2LT5pcnFfZW5hYmxlZCA9IDE7CisKKwlwcml2LT5vcHMtPmlycV9lbmFibGUoZGV2KTsKK30KKwordm9pZCBydGw4MTkyX2lycV9kaXNhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilydGxsaWJfcHJpdihkZXYpOworCisJcHJpdi0+b3BzLT5pcnFfZGlzYWJsZShkZXYpOworCisJcHJpdi0+aXJxX2VuYWJsZWQgPSAwOworfQorCit2b2lkIHJ0bDgxOTJfc2V0X2NoYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgY2gpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilydGxsaWJfcHJpdihkZXYpOworCisJUlRfVFJBQ0UoQ09NUF9DSCwgIj09PT09PiVzKCk9PT09Y2g6JWRcbiIsIF9fZnVuY19fLCBjaCk7CisJaWYgKHByaXYtPmNoYW5fZm9yY2VkKQorCQlyZXR1cm47CisKKwlwcml2LT5jaGFuID0gY2g7CisKKwlpZiAocHJpdi0+cmZfc2V0X2NoYW4pCisJCXByaXYtPnJmX3NldF9jaGFuKGRldiwgcHJpdi0+Y2hhbik7Cit9CisKK3ZvaWQgcnRsODE5Ml91cGRhdGVfY2FwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBjYXApCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXN0cnVjdCBydGxsaWJfbmV0d29yayAqbmV0ID0gJnByaXYtPnJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrOworCWJvb2wJCVNob3J0UHJlYW1ibGU7CisKKwlpZiAoY2FwICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKSB7CisJCWlmIChwcml2LT5kb3QxMUN1cnJlbnRQcmVhbWJsZU1vZGUgIT0gUFJFQU1CTEVfU0hPUlQpIHsKKwkJCVNob3J0UHJlYW1ibGUgPSB0cnVlOworCQkJcHJpdi0+ZG90MTFDdXJyZW50UHJlYW1ibGVNb2RlID0gUFJFQU1CTEVfU0hPUlQ7CisJCQlSVF9UUkFDRShDT01QX0RCRywgIiVzKCk6IFdMQU5fQ0FQQUJJTElUWV9TSE9SVF8iCisJCQkJICJQUkVBTUJMRVxuIiwgX19mdW5jX18pOworCQkJcHJpdi0+cnRsbGliLT5TZXRId1JlZ0hhbmRsZXIoZGV2LCBIV19WQVJfQUNLX1BSRUFNQkxFLAorCQkJCQkodW5zaWduZWQgY2hhciAqKSZTaG9ydFByZWFtYmxlKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChwcml2LT5kb3QxMUN1cnJlbnRQcmVhbWJsZU1vZGUgIT0gUFJFQU1CTEVfTE9ORykgeworCQkJU2hvcnRQcmVhbWJsZSA9IGZhbHNlOworCQkJcHJpdi0+ZG90MTFDdXJyZW50UHJlYW1ibGVNb2RlID0gUFJFQU1CTEVfTE9ORzsKKwkJCVJUX1RSQUNFKENPTVBfREJHLCAiJXMoKTogV0xBTl9DQVBBQklMSVRZX0xPTkdfIgorCQkJCSAiUFJFQU1CTEVcbiIsIF9fZnVuY19fKTsKKwkJCXByaXYtPnJ0bGxpYi0+U2V0SHdSZWdIYW5kbGVyKGRldiwgSFdfVkFSX0FDS19QUkVBTUJMRSwKKwkJCQkJICAgICAgKHVuc2lnbmVkIGNoYXIgKikmU2hvcnRQcmVhbWJsZSk7CisJCX0KKwl9CisKKwlpZiAobmV0LT5tb2RlICYgKElFRUVfR3xJRUVFX05fMjRHKSkgeworCQl1OAlzbG90X3RpbWVfdmFsOworCQl1OAlDdXJTbG90VGltZSA9IHByaXYtPnNsb3RfdGltZTsKKworCQlpZiAoKGNhcCAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UX1RJTUUpICYmCisJCSAgICghcHJpdi0+cnRsbGliLT5wSFRJbmZvLT5iQ3VycmVudFJUMlJUTG9uZ1Nsb3RUaW1lKSkgeworCQkJaWYgKEN1clNsb3RUaW1lICE9IFNIT1JUX1NMT1RfVElNRSkgeworCQkJCXNsb3RfdGltZV92YWwgPSBTSE9SVF9TTE9UX1RJTUU7CisJCQkJcHJpdi0+cnRsbGliLT5TZXRId1JlZ0hhbmRsZXIoZGV2LAorCQkJCQkgSFdfVkFSX1NMT1RfVElNRSwgJnNsb3RfdGltZV92YWwpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKEN1clNsb3RUaW1lICE9IE5PTl9TSE9SVF9TTE9UX1RJTUUpIHsKKwkJCQlzbG90X3RpbWVfdmFsID0gTk9OX1NIT1JUX1NMT1RfVElNRTsKKwkJCQlwcml2LT5ydGxsaWItPlNldEh3UmVnSGFuZGxlcihkZXYsCisJCQkJCSBIV19WQVJfU0xPVF9USU1FLCAmc2xvdF90aW1lX3ZhbCk7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnRsbGliX3Fvc19wYXJhbWV0ZXJzIGRlZl9xb3NfcGFyYW1ldGVycyA9IHsKKwl7MywgMywgMywgM30sCisJezcsIDcsIDcsIDd9LAorCXsyLCAyLCAyLCAyfSwKKwl7MCwgMCwgMCwgMH0sCisJezAsIDAsIDAsIDB9Cit9OworCitzdGF0aWMgdm9pZCBydGw4MTkyX3VwZGF0ZV9iZWFjb24odm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZl93b3JrX3JzbChkYXRhLCBzdHJ1Y3QgcjgxOTJfcHJpdiwKKwkJCQkgIHVwZGF0ZV9iZWFjb25fd3Eud29yayk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPnJ0bGxpYi0+ZGV2OworCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gcHJpdi0+cnRsbGliOworCXN0cnVjdCBydGxsaWJfbmV0d29yayAqbmV0ID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKKworCWlmIChpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCkKKwkJSFRVcGRhdGVTZWxmQW5kUGVlclNldHRpbmcoaWVlZSwgbmV0KTsKKwlpZWVlLT5wSFRJbmZvLT5iQ3VycmVudFJUMlJUTG9uZ1Nsb3RUaW1lID0KKwkJIG5ldC0+YnNzaHQuYmRSVDJSVExvbmdTbG90VGltZTsKKwlpZWVlLT5wSFRJbmZvLT5SVDJSVF9IVF9Nb2RlID0gbmV0LT5ic3NodC5SVDJSVF9IVF9Nb2RlOworCXJ0bDgxOTJfdXBkYXRlX2NhcChkZXYsIG5ldC0+Y2FwYWJpbGl0eSk7Cit9CisKK2ludCBXRENBUEFSQV9BRERbXSA9IHtFRENBUEFSQV9CRSwgRURDQVBBUkFfQkssIEVEQ0FQQVJBX1ZJLCBFRENBUEFSQV9WT307CisKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfcW9zX2FjdGl2YXRlKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Zfd29ya19yc2woZGF0YSwgc3RydWN0IHI4MTkyX3ByaXYsCisJCQkJICBxb3NfYWN0aXZhdGUpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5ydGxsaWItPmRldjsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKKwlpZiAocHJpdi0+cnRsbGliLT5zdGF0ZSAhPSBSVExMSUJfTElOS0VEKQorCQlnb3RvIHN1Y2Nlc3M7CisJUlRfVFJBQ0UoQ09NUF9RT1MsICJxb3MgYWN0aXZlIHByb2Nlc3Mgd2l0aCBhc3NvY2lhdGUgcmVzcG9uc2UgIgorCQkgInJlY2VpdmVkXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCAgUU9TX1FVRVVFX05VTTsgaSsrKSB7CisJCXByaXYtPnJ0bGxpYi0+U2V0SHdSZWdIYW5kbGVyKGRldiwgSFdfVkFSX0FDX1BBUkFNLCAodTggKikoJmkpKTsKKwl9CisKK3N1Y2Nlc3M6CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE5Ml9xb3NfaGFuZGxlX3Byb2JlX3Jlc3BvbnNlKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LAorCQlpbnQgYWN0aXZlX25ldHdvcmssCisJCXN0cnVjdCBydGxsaWJfbmV0d29yayAqbmV0d29yaykKK3sKKwlpbnQgcmV0ID0gMDsKKwl1MzIgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcnRsbGliX3Fvc19wYXJhbWV0ZXJzKTsKKworCWlmIChwcml2LT5ydGxsaWItPnN0YXRlICE9IFJUTExJQl9MSU5LRUQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoKHByaXYtPnJ0bGxpYi0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBKSkKKwkJcmV0dXJuIHJldDsKKworCWlmIChuZXR3b3JrLT5mbGFncyAmIE5FVFdPUktfSEFTX1FPU19NQVNLKSB7CisJCWlmIChhY3RpdmVfbmV0d29yayAmJgorCQkJCShuZXR3b3JrLT5mbGFncyAmIE5FVFdPUktfSEFTX1FPU19QQVJBTUVURVJTKSkKKwkJCW5ldHdvcmstPnFvc19kYXRhLmFjdGl2ZSA9IG5ldHdvcmstPnFvc19kYXRhLnN1cHBvcnRlZDsKKworCQlpZiAoKG5ldHdvcmstPnFvc19kYXRhLmFjdGl2ZSA9PSAxKSAmJiAoYWN0aXZlX25ldHdvcmsgPT0gMSkgJiYKKwkJCQkobmV0d29yay0+ZmxhZ3MgJiBORVRXT1JLX0hBU19RT1NfUEFSQU1FVEVSUykgJiYKKwkJCQkobmV0d29yay0+cW9zX2RhdGEub2xkX3BhcmFtX2NvdW50ICE9CisJCQkJbmV0d29yay0+cW9zX2RhdGEucGFyYW1fY291bnQpKSB7CisJCQluZXR3b3JrLT5xb3NfZGF0YS5vbGRfcGFyYW1fY291bnQgPQorCQkJCW5ldHdvcmstPnFvc19kYXRhLnBhcmFtX2NvdW50OworCXByaXYtPnJ0bGxpYi0+d21tX2FjbSA9IG5ldHdvcmstPnFvc19kYXRhLndtbV9hY207CisJCQlxdWV1ZV93b3JrX3JzbChwcml2LT5wcml2X3dxLCAmcHJpdi0+cW9zX2FjdGl2YXRlKTsKKwkJCVJUX1RSQUNFKENPTVBfUU9TLCAiUW9TIHBhcmFtZXRlcnMgY2hhbmdlIGNhbGwgIgorCQkJCQkicW9zX2FjdGl2YXRlXG4iKTsKKwkJfQorCX0gZWxzZSB7CisJCW1lbWNweSgmcHJpdi0+cnRsbGliLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEucGFyYW1ldGVycywKKwkJICAgICAgICZkZWZfcW9zX3BhcmFtZXRlcnMsIHNpemUpOworCisJCWlmICgobmV0d29yay0+cW9zX2RhdGEuYWN0aXZlID09IDEpICYmIChhY3RpdmVfbmV0d29yayA9PSAxKSkgeworCQkJcXVldWVfd29ya19yc2wocHJpdi0+cHJpdl93cSwgJnByaXYtPnFvc19hY3RpdmF0ZSk7CisJCQlSVF9UUkFDRShDT01QX1FPUywgIlFvUyB3YXMgZGlzYWJsZWQgY2FsbCBxb3NfIgorCQkJCSAiYWN0aXZhdGVcbiIpOworCQl9CisJCW5ldHdvcmstPnFvc19kYXRhLmFjdGl2ZSA9IDA7CisJCW5ldHdvcmstPnFvc19kYXRhLnN1cHBvcnRlZCA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE5Ml9oYW5kbGVfYmVhY29uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJc3RydWN0IHJ0bGxpYl9iZWFjb24gKmJlYWNvbiwKKwlzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKm5ldHdvcmspCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJcnRsODE5Ml9xb3NfaGFuZGxlX3Byb2JlX3Jlc3BvbnNlKHByaXYsIDEsIG5ldHdvcmspOworCisJcXVldWVfZGVsYXllZF93b3JrX3JzbChwcml2LT5wcml2X3dxLCAmcHJpdi0+dXBkYXRlX2JlYWNvbl93cSwgMCk7CisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludCBydGw4MTkyX3Fvc19hc3NvY2lhdGlvbl9yZXNwKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LAorCXN0cnVjdCBydGxsaWJfbmV0d29yayAqbmV0d29yaykKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBzaXplID0gc2l6ZW9mKHN0cnVjdCBydGxsaWJfcW9zX3BhcmFtZXRlcnMpOworCWludCBzZXRfcW9zX3BhcmFtID0gMDsKKworCWlmICgocHJpdiA9PSBOVUxMKSB8fCAobmV0d29yayA9PSBOVUxMKSkKKwkJcmV0dXJuIHJldDsKKworCWlmIChwcml2LT5ydGxsaWItPnN0YXRlICE9IFJUTExJQl9MSU5LRUQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoKHByaXYtPnJ0bGxpYi0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBKSkKKwkJcmV0dXJuIHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5ydGxsaWItPmxvY2ssIGZsYWdzKTsKKwlpZiAobmV0d29yay0+ZmxhZ3MgJiBORVRXT1JLX0hBU19RT1NfUEFSQU1FVEVSUykgeworCQltZW1jcHkoJnByaXYtPnJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnBhcmFtZXRlcnMsCisJCSAgICAgICAmbmV0d29yay0+cW9zX2RhdGEucGFyYW1ldGVycywKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRsbGliX3Fvc19wYXJhbWV0ZXJzKSk7CisJCXByaXYtPnJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSA9IDE7CisJCXByaXYtPnJ0bGxpYi0+d21tX2FjbSA9IG5ldHdvcmstPnFvc19kYXRhLndtbV9hY207CisJCXNldF9xb3NfcGFyYW0gPSAxOworCQlwcml2LT5ydGxsaWItPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5vbGRfcGFyYW1fY291bnQgPQorCQkJcHJpdi0+cnRsbGliLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEucGFyYW1fY291bnQ7CisJCXByaXYtPnJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnBhcmFtX2NvdW50ID0KKwkJCW5ldHdvcmstPnFvc19kYXRhLnBhcmFtX2NvdW50OworCX0gZWxzZSB7CisJCW1lbWNweSgmcHJpdi0+cnRsbGliLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEucGFyYW1ldGVycywKKwkJJmRlZl9xb3NfcGFyYW1ldGVycywgc2l6ZSk7CisJCXByaXYtPnJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSA9IDA7CisJCXByaXYtPnJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnN1cHBvcnRlZCA9IDA7CisJCXNldF9xb3NfcGFyYW0gPSAxOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJ0bGxpYi0+bG9jaywgZmxhZ3MpOworCisJUlRfVFJBQ0UoQ09NUF9RT1MsICIlczogbmV0d29yay0+ZmxhZ3MgPSAlZCwlZFxuIiwgX19mdW5jX18sCisJCSBuZXR3b3JrLT5mbGFncywgcHJpdi0+cnRsbGliLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlKTsKKwlpZiAoc2V0X3Fvc19wYXJhbSA9PSAxKSB7CisJCWRtX2luaXRfZWRjYV90dXJibyhwcml2LT5ydGxsaWItPmRldik7CisJCXF1ZXVlX3dvcmtfcnNsKHByaXYtPnByaXZfd3EsICZwcml2LT5xb3NfYWN0aXZhdGUpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJ0bDgxOTJfaGFuZGxlX2Fzc29jX3Jlc3BvbnNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBydGxsaWJfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKnJlc3AsCisJCQkJIHN0cnVjdCBydGxsaWJfbmV0d29yayAqbmV0d29yaykKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJcnRsODE5Ml9xb3NfYXNzb2NpYXRpb25fcmVzcChwcml2LCBuZXR3b3JrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcnRsODE5Ml9wcmVwYXJlX2JlYWNvbihzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+cnRsbGliLT5kZXY7CisJc3RydWN0IHNrX2J1ZmYgKnBza2IgPSBOVUxMLCAqcG5ld3NrYiA9IE5VTEw7CisJc3RydWN0IGNiX2Rlc2MgKnRjYl9kZXNjID0gTlVMTDsKKwlzdHJ1Y3QgcnRsODE5Ml90eF9yaW5nICpyaW5nID0gTlVMTDsKKwlzdHJ1Y3QgdHhfZGVzYyAqcGRlc2MgPSBOVUxMOworCisJcmluZyA9ICZwcml2LT50eF9yaW5nW0JFQUNPTl9RVUVVRV07CisJcHNrYiA9IF9fc2tiX2RlcXVldWUoJnJpbmctPnF1ZXVlKTsKKwlpZiAocHNrYikKKwkJa2ZyZWVfc2tiKHBza2IpOworCisJcG5ld3NrYiA9IHJ0bGxpYl9nZXRfYmVhY29uKHByaXYtPnJ0bGxpYik7CisJaWYgKCFwbmV3c2tiKQorCQlyZXR1cm47CisKKwl0Y2JfZGVzYyA9IChzdHJ1Y3QgY2JfZGVzYyAqKShwbmV3c2tiLT5jYiArIDgpOworCXRjYl9kZXNjLT5xdWV1ZV9pbmRleCA9IEJFQUNPTl9RVUVVRTsKKwl0Y2JfZGVzYy0+ZGF0YV9yYXRlID0gMjsKKwl0Y2JfZGVzYy0+UkFUUkluZGV4ID0gNzsKKwl0Y2JfZGVzYy0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjayA9IDE7CisJdGNiX2Rlc2MtPmJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZSA9IDE7CisJc2tiX3B1c2gocG5ld3NrYiwgcHJpdi0+cnRsbGliLT50eF9oZWFkcm9vbSk7CisKKwlwZGVzYyA9ICZyaW5nLT5kZXNjWzBdOworCXByaXYtPm9wcy0+dHhfZmlsbF9kZXNjcmlwdG9yKGRldiwgcGRlc2MsIHRjYl9kZXNjLCBwbmV3c2tiKTsKKwlfX3NrYl9xdWV1ZV90YWlsKCZyaW5nLT5xdWV1ZSwgcG5ld3NrYik7CisJcGRlc2MtPk9XTiA9IDE7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfc3RvcF9iZWFjb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKK30KKwordm9pZCBydGw4MTkyX2NvbmZpZ19yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiAqcmF0ZV9jb25maWcpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXN0cnVjdCBydGxsaWJfbmV0d29yayAqbmV0OworCXU4IGkgPSAwLCBiYXNpY19yYXRlID0gMDsKKwluZXQgPSAmcHJpdi0+cnRsbGliLT5jdXJyZW50X25ldHdvcms7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmV0LT5yYXRlc19sZW47IGkrKykgeworCQliYXNpY19yYXRlID0gbmV0LT5yYXRlc1tpXSAmIDB4N2Y7CisJCXN3aXRjaCAoYmFzaWNfcmF0ZSkgeworCQljYXNlIE1HTl8xTToKKwkJCSpyYXRlX2NvbmZpZyB8PSBSUlNSXzFNOworCQkJYnJlYWs7CisJCWNhc2UgTUdOXzJNOgorCQkJKnJhdGVfY29uZmlnIHw9IFJSU1JfMk07CisJCQlicmVhazsKKwkJY2FzZSBNR05fNV81TToKKwkJCSpyYXRlX2NvbmZpZyB8PSBSUlNSXzVfNU07CisJCQlicmVhazsKKwkJY2FzZSBNR05fMTFNOgorCQkJKnJhdGVfY29uZmlnIHw9IFJSU1JfMTFNOworCQkJYnJlYWs7CisJCWNhc2UgTUdOXzZNOgorCQkJKnJhdGVfY29uZmlnIHw9IFJSU1JfNk07CisJCQlicmVhazsKKwkJY2FzZSBNR05fOU06CisJCQkqcmF0ZV9jb25maWcgfD0gUlJTUl85TTsKKwkJCWJyZWFrOworCQljYXNlIE1HTl8xMk06CisJCQkqcmF0ZV9jb25maWcgfD0gUlJTUl8xMk07CisJCQlicmVhazsKKwkJY2FzZSBNR05fMThNOgorCQkJKnJhdGVfY29uZmlnIHw9IFJSU1JfMThNOworCQkJYnJlYWs7CisJCWNhc2UgTUdOXzI0TToKKwkJCSpyYXRlX2NvbmZpZyB8PSBSUlNSXzI0TTsKKwkJCWJyZWFrOworCQljYXNlIE1HTl8zNk06CisJCQkqcmF0ZV9jb25maWcgfD0gUlJTUl8zNk07CisJCQlicmVhazsKKwkJY2FzZSBNR05fNDhNOgorCQkJKnJhdGVfY29uZmlnIHw9IFJSU1JfNDhNOworCQkJYnJlYWs7CisJCWNhc2UgTUdOXzU0TToKKwkJCSpyYXRlX2NvbmZpZyB8PSBSUlNSXzU0TTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5ldC0+cmF0ZXNfZXhfbGVuOyBpKyspIHsKKwkJYmFzaWNfcmF0ZSA9IG5ldC0+cmF0ZXNfZXhbaV0gJiAweDdmOworCQlzd2l0Y2ggKGJhc2ljX3JhdGUpIHsKKwkJY2FzZSBNR05fMU06CisJCQkqcmF0ZV9jb25maWcgfD0gUlJTUl8xTTsKKwkJCWJyZWFrOworCQljYXNlIE1HTl8yTToKKwkJCSpyYXRlX2NvbmZpZyB8PSBSUlNSXzJNOworCQkJYnJlYWs7CisJCWNhc2UgTUdOXzVfNU06CisJCQkqcmF0ZV9jb25maWcgfD0gUlJTUl81XzVNOworCQkJYnJlYWs7CisJCWNhc2UgTUdOXzExTToKKwkJCSpyYXRlX2NvbmZpZyB8PSBSUlNSXzExTTsKKwkJCWJyZWFrOworCQljYXNlIE1HTl82TToKKwkJCSpyYXRlX2NvbmZpZyB8PSBSUlNSXzZNOworCQkJYnJlYWs7CisJCWNhc2UgTUdOXzlNOgorCQkJKnJhdGVfY29uZmlnIHw9IFJSU1JfOU07CisJCQlicmVhazsKKwkJY2FzZSBNR05fMTJNOgorCQkJKnJhdGVfY29uZmlnIHw9IFJSU1JfMTJNOworCQkJYnJlYWs7CisJCWNhc2UgTUdOXzE4TToKKwkJCSpyYXRlX2NvbmZpZyB8PSBSUlNSXzE4TTsKKwkJCWJyZWFrOworCQljYXNlIE1HTl8yNE06CisJCQkqcmF0ZV9jb25maWcgfD0gUlJTUl8yNE07CisJCQlicmVhazsKKwkJY2FzZSBNR05fMzZNOgorCQkJKnJhdGVfY29uZmlnIHw9IFJSU1JfMzZNOworCQkJYnJlYWs7CisJCWNhc2UgTUdOXzQ4TToKKwkJCSpyYXRlX2NvbmZpZyB8PSBSUlNSXzQ4TTsKKwkJCWJyZWFrOworCQljYXNlIE1HTl81NE06CisJCQkqcmF0ZV9jb25maWcgfD0gUlJTUl81NE07CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcnRsODE5Ml9yZWZyZXNoX3N1cHBvcnRyYXRlKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQoreworCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gcHJpdi0+cnRsbGliOworCWlmIChpZWVlLT5tb2RlID09IFdJUkVMRVNTX01PREVfTl8yNEcgfHwKKwkgICAgaWVlZS0+bW9kZSA9PSBXSVJFTEVTU19NT0RFX05fNUcpIHsKKwkJbWVtY3B5KGllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsCisJCSAgICAgICBpZWVlLT5SZWdIVFN1cHBSYXRlU2V0LCAxNik7CisJCW1lbWNweShpZWVlLT5SZWdkb3QxMVR4SFRPcGVyYXRpb25hbFJhdGVTZXQsCisJCSAgICAgICBpZWVlLT5SZWdIVFN1cHBSYXRlU2V0LCAxNik7CisKKwl9IGVsc2UgeworCQltZW1zZXQoaWVlZS0+UmVnZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCwgMCwgMTYpOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB1OCBydGw4MTkyX2dldFN1cHBvcnRlZFdpcmVsZWVNb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXU4IHJldCA9IDA7CisKKwlzd2l0Y2ggKHByaXYtPnJmX2NoaXApIHsKKwljYXNlIFJGXzgyMjU6CisJY2FzZSBSRl84MjU2OgorCWNhc2UgUkZfNjA1MjoKKwljYXNlIFJGX1BTRVVET18xMU46CisJCXJldCA9IChXSVJFTEVTU19NT0RFX05fMjRHfFdJUkVMRVNTX01PREVfRyB8IFdJUkVMRVNTX01PREVfQik7CisJCWJyZWFrOworCWNhc2UgUkZfODI1ODoKKwkJcmV0ID0gKFdJUkVMRVNTX01PREVfQSB8IFdJUkVMRVNTX01PREVfTl81Ryk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IFdJUkVMRVNTX01PREVfQjsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgcnRsODE5Ml9TZXRXaXJlbGVzc01vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggd2lyZWxlc3NfbW9kZSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJdTggYlN1cHBvcnRNb2RlID0gcnRsODE5Ml9nZXRTdXBwb3J0ZWRXaXJlbGVlTW9kZShkZXYpOworCisJaWYgKCh3aXJlbGVzc19tb2RlID09IFdJUkVMRVNTX01PREVfQVVUTykgfHwKKwkgICAgKCh3aXJlbGVzc19tb2RlICYgYlN1cHBvcnRNb2RlKSA9PSAwKSkgeworCQlpZiAoYlN1cHBvcnRNb2RlICYgV0lSRUxFU1NfTU9ERV9OXzI0RykgeworCQkJd2lyZWxlc3NfbW9kZSA9IFdJUkVMRVNTX01PREVfTl8yNEc7CisJCX0gZWxzZSBpZiAoYlN1cHBvcnRNb2RlICYgV0lSRUxFU1NfTU9ERV9OXzVHKSB7CisJCQl3aXJlbGVzc19tb2RlID0gV0lSRUxFU1NfTU9ERV9OXzVHOworCQl9IGVsc2UgaWYgKChiU3VwcG9ydE1vZGUgJiBXSVJFTEVTU19NT0RFX0EpKSB7CisJCQl3aXJlbGVzc19tb2RlID0gV0lSRUxFU1NfTU9ERV9BOworCQl9IGVsc2UgaWYgKChiU3VwcG9ydE1vZGUgJiBXSVJFTEVTU19NT0RFX0cpKSB7CisJCQl3aXJlbGVzc19tb2RlID0gV0lSRUxFU1NfTU9ERV9HOworCQl9IGVsc2UgaWYgKChiU3VwcG9ydE1vZGUgJiBXSVJFTEVTU19NT0RFX0IpKSB7CisJCQl3aXJlbGVzc19tb2RlID0gV0lSRUxFU1NfTU9ERV9COworCQl9IGVsc2UgeworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICIlcygpLCBObyB2YWxpZCB3aXJlbGVzcyBtb2RlICIKKwkJCQkgInN1cHBvcnRlZCAoJXgpISEhXG4iLCBfX2Z1bmNfXywgYlN1cHBvcnRNb2RlKTsKKwkJCXdpcmVsZXNzX21vZGUgPSBXSVJFTEVTU19NT0RFX0I7CisJCX0KKwl9CisKKwlpZiAoKHdpcmVsZXNzX21vZGUgJiAoV0lSRUxFU1NfTU9ERV9CIHwgV0lSRUxFU1NfTU9ERV9HKSkgPT0KKwkgICAgKFdJUkVMRVNTX01PREVfRyB8IFdJUkVMRVNTX01PREVfQikpCisJCXdpcmVsZXNzX21vZGUgPSBXSVJFTEVTU19NT0RFX0c7CisKKwlwcml2LT5ydGxsaWItPm1vZGUgPSB3aXJlbGVzc19tb2RlOworCisJQWN0VXBkYXRlQ2hhbm5lbEFjY2Vzc1NldHRpbmcoZGV2LCB3aXJlbGVzc19tb2RlLAorCQkJCSAgICAgICZwcml2LT5DaGFubmVsQWNjZXNzU2V0dGluZyk7CisKKwlpZiAoKHdpcmVsZXNzX21vZGUgPT0gV0lSRUxFU1NfTU9ERV9OXzI0RykgfHwKKwkgICAgKHdpcmVsZXNzX21vZGUgPT0gV0lSRUxFU1NfTU9ERV9OXzVHKSkgeworCQlwcml2LT5ydGxsaWItPnBIVEluZm8tPmJFbmFibGVIVCA9IDE7CisJUlRfVFJBQ0UoQ09NUF9EQkcsICIlcygpLCB3aXJlbGVzc19tb2RlOiV4LCBiRW5hYmxlSFQgPSAxXG4iLAorCQkgX19mdW5jX18sIHdpcmVsZXNzX21vZGUpOworCX0gZWxzZSB7CisJCXByaXYtPnJ0bGxpYi0+cEhUSW5mby0+YkVuYWJsZUhUID0gMDsKKwkJUlRfVFJBQ0UoQ09NUF9EQkcsICIlcygpLCB3aXJlbGVzc19tb2RlOiV4LCBiRW5hYmxlSFQgPSAwXG4iLAorCQkJIF9fZnVuY19fLCB3aXJlbGVzc19tb2RlKTsKKwl9CisKKwlSVF9UUkFDRShDT01QX0lOSVQsICJDdXJyZW50IFdpcmVsZXNzIE1vZGUgaXMgJXhcbiIsIHdpcmVsZXNzX21vZGUpOworCXJ0bDgxOTJfcmVmcmVzaF9zdXBwb3J0cmF0ZShwcml2KTsKK30KKworc3RhdGljIGludCBfcnRsODE5Ml9zdGFfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYm9vbCBpc19zaWxlbnRfcmVzZXQpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXN0cnVjdCBydF9wd3Jfc2F2ZV9jdHJsICpwUFNDID0gKHN0cnVjdCBydF9wd3Jfc2F2ZV9jdHJsICopCisJCQkJCSgmKHByaXYtPnJ0bGxpYi0+UG93ZXJTYXZlQ29udHJvbCkpOworCWJvb2wgaW5pdF9zdGF0dXMgPSB0cnVlOworCXByaXYtPmJEcml2ZXJJc0dvaW5nVG9VbmxvYWQgPSBmYWxzZTsKKwlwcml2LT5iZGlzYWJsZV9uaWMgPSBmYWxzZTsKKworCXByaXYtPnVwID0gMTsKKwlwcml2LT5ydGxsaWItPmllZWVfdXAgPSAxOworCisJcHJpdi0+dXBfZmlyc3RfdGltZSA9IDA7CisJUlRfVFJBQ0UoQ09NUF9JTklULCAiQnJpbmdpbmcgdXAgaWZhY2UiKTsKKwlwcml2LT5iZmlyc3RfaW5pdCA9IHRydWU7CisJaW5pdF9zdGF0dXMgPSBwcml2LT5vcHMtPmluaXRpYWxpemVfYWRhcHRlcihkZXYpOworCWlmIChpbml0X3N0YXR1cyAhPSB0cnVlKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCAiRVJSISEhICVzKCk6IGluaXRpYWxpemF0aW9uIGlzIGZhaWxlZCFcbiIsCisJCQkgX19mdW5jX18pOworCQlwcml2LT5iZmlyc3RfaW5pdCA9IGZhbHNlOworCQlyZXR1cm4gLTE7CisJfQorCisJUlRfVFJBQ0UoQ09NUF9JTklULCAic3RhcnQgYWRhcHRlciBmaW5pc2hlZFxuIik7CisJUlRfQ0xFQVJfUFNfTEVWRUwocFBTQywgUlRfUkZfT0ZGX0xFVkxfSEFMVF9OSUMpOworCXByaXYtPmJmaXJzdF9pbml0ID0gZmFsc2U7CisKKwlpZiAocHJpdi0+cG9sbGluZ190aW1lcl9vbiA9PSAwKQorCQljaGVja19yZmN0cmxfZ3Bpb190aW1lcigodW5zaWduZWQgbG9uZylkZXYpOworCisJaWYgKHByaXYtPnJ0bGxpYi0+c3RhdGUgIT0gUlRMTElCX0xJTktFRCkKKwkJcnRsbGliX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2wocHJpdi0+cnRsbGliLCAwKTsKKwlydGxsaWJfcmVzZXRfcXVldWUocHJpdi0+cnRsbGliKTsKKwl3YXRjaF9kb2dfdGltZXJfY2FsbGJhY2soKHVuc2lnbmVkIGxvbmcpIGRldik7CisKKwlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKwllbHNlCisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0bDgxOTJfc3RhX2Rvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYm9vbCBzaHV0ZG93bnJmKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwl1OCBSRkluUHJvZ3Jlc3NUaW1lT3V0ID0gMDsKKworCWlmIChwcml2LT51cCA9PSAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAocHJpdi0+cnRsbGliLT5ydGxsaWJfaXBzX2xlYXZlICE9IE5VTEwpCisJCXByaXYtPnJ0bGxpYi0+cnRsbGliX2lwc19sZWF2ZShkZXYpOworCisJaWYgKHByaXYtPnJ0bGxpYi0+c3RhdGUgPT0gUlRMTElCX0xJTktFRCkKKwkJTGVpc3VyZVBTTGVhdmUoZGV2KTsKKworCXByaXYtPmJEcml2ZXJJc0dvaW5nVG9VbmxvYWQgPSB0cnVlOworCXByaXYtPnVwID0gMDsKKwlwcml2LT5ydGxsaWItPmllZWVfdXAgPSAwOworCXByaXYtPmJmaXJzdF9hZnRlcl9kb3duID0gMTsKKwlSVF9UUkFDRShDT01QX0RPV04sICI9PT09PT09PT09PiVzKClcbiIsIF9fZnVuY19fKTsKKwlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJcHJpdi0+cnRsbGliLT53cGFfaWVfbGVuID0gMDsKKwlrZnJlZShwcml2LT5ydGxsaWItPndwYV9pZSk7CisJcHJpdi0+cnRsbGliLT53cGFfaWUgPSBOVUxMOworCUNhbVJlc2V0QWxsRW50cnkoZGV2KTsKKwltZW1zZXQocHJpdi0+cnRsbGliLT5zd2NhbXRhYmxlLCAwLCBzaXplb2Yoc3RydWN0IHN3X2NhbV90YWJsZSkgKiAzMik7CisJcnRsODE5Ml9pcnFfZGlzYWJsZShkZXYpOworCisJZGVsX3RpbWVyX3N5bmMoJnByaXYtPndhdGNoX2RvZ190aW1lcik7CisJcnRsODE5Ml9jYW5jZWxfZGVmZXJyZWRfd29yayhwcml2KTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5ydGxsaWItPmh3X3dha2V1cF93cSk7CisKKwlydGxsaWJfc29mdG1hY19zdG9wX3Byb3RvY29sKHByaXYtPnJ0bGxpYiwgMCwgdHJ1ZSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJmX3BzX2xvY2ssIGZsYWdzKTsKKwl3aGlsZSAocHJpdi0+UkZDaGFuZ2VJblByb2dyZXNzKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJmX3BzX2xvY2ssIGZsYWdzKTsKKwkJaWYgKFJGSW5Qcm9ncmVzc1RpbWVPdXQgPiAxMDApIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZl9wc19sb2NrLCBmbGFncyk7CisJCQlicmVhazsKKwkJfQorCQlSVF9UUkFDRShDT01QX0RCRywgIj09PT4lcygpOlJGIGlzIGluIHByb2dyZXNzLCBuZWVkIHRvIHdhaXQgIgorCQkJICJ1bnRpbCByZiBjaGFuZyBpcyBkb25lLlxuIiwgX19mdW5jX18pOworCQltZGVsYXkoMSk7CisJCVJGSW5Qcm9ncmVzc1RpbWVPdXQrKzsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJmX3BzX2xvY2ssIGZsYWdzKTsKKwl9CisJcHJpdi0+UkZDaGFuZ2VJblByb2dyZXNzID0gdHJ1ZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZl9wc19sb2NrLCBmbGFncyk7CisJcHJpdi0+b3BzLT5zdG9wX2FkYXB0ZXIoZGV2LCBmYWxzZSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJmX3BzX2xvY2ssIGZsYWdzKTsKKwlwcml2LT5SRkNoYW5nZUluUHJvZ3Jlc3MgPSBmYWxzZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZl9wc19sb2NrLCBmbGFncyk7CisJdWRlbGF5KDEwMCk7CisJbWVtc2V0KCZwcml2LT5ydGxsaWItPmN1cnJlbnRfbmV0d29yaywgMCwKKwkgICAgICAgb2Zmc2V0b2Yoc3RydWN0IHJ0bGxpYl9uZXR3b3JrLCBsaXN0KSk7CisJUlRfVFJBQ0UoQ09NUF9ET1dOLCAiPD09PT09PT09PT0lcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcnRsODE5Ml9pbml0X3ByaXZfaGFuZGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCXByaXYtPnJ0bGxpYi0+c29mdG1hY19oYXJkX3N0YXJ0X3htaXQJPSBydGw4MTkyX2hhcmRfc3RhcnRfeG1pdDsKKwlwcml2LT5ydGxsaWItPnNldF9jaGFuCQkJPSBydGw4MTkyX3NldF9jaGFuOworCXByaXYtPnJ0bGxpYi0+bGlua19jaGFuZ2UJCT0gcHJpdi0+b3BzLT5saW5rX2NoYW5nZTsKKwlwcml2LT5ydGxsaWItPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQgPSBydGw4MTkyX2hhcmRfZGF0YV94bWl0OworCXByaXYtPnJ0bGxpYi0+ZGF0YV9oYXJkX3N0b3AJCT0gcnRsODE5Ml9kYXRhX2hhcmRfc3RvcDsKKwlwcml2LT5ydGxsaWItPmRhdGFfaGFyZF9yZXN1bWUJCT0gcnRsODE5Ml9kYXRhX2hhcmRfcmVzdW1lOworCXByaXYtPnJ0bGxpYi0+Y2hlY2tfbmljX2Vub3VnaF9kZXNjCT0gcnRsODE5Ml9jaGVja19uaWNfZW5vdWdoX2Rlc2M7CisJcHJpdi0+cnRsbGliLT5nZXRfbmljX2Rlc2NfbnVtCQk9IHJ0bDgxOTJfZ2V0X25pY19kZXNjX251bTsKKwlwcml2LT5ydGxsaWItPmhhbmRsZV9hc3NvY19yZXNwb25zZQk9IHJ0bDgxOTJfaGFuZGxlX2Fzc29jX3Jlc3BvbnNlOworCXByaXYtPnJ0bGxpYi0+aGFuZGxlX2JlYWNvbgkJPSBydGw4MTkyX2hhbmRsZV9iZWFjb247CisJcHJpdi0+cnRsbGliLT5TZXRXaXJlbGVzc01vZGUJCT0gcnRsODE5Ml9TZXRXaXJlbGVzc01vZGU7CisJcHJpdi0+cnRsbGliLT5MZWlzdXJlUFNMZWF2ZQkJPSBMZWlzdXJlUFNMZWF2ZTsKKwlwcml2LT5ydGxsaWItPlNldEJXTW9kZUhhbmRsZXIJCT0gcnRsODE5Ml9TZXRCV01vZGU7CisJcHJpdi0+cmZfc2V0X2NoYW4JCQk9IHJ0bDgxOTJfcGh5X1N3Q2hubDsKKworCXByaXYtPnJ0bGxpYi0+c3RhcnRfc2VuZF9iZWFjb25zID0gcnRsODE5MmVfc3RhcnRfYmVhY29uOworCXByaXYtPnJ0bGxpYi0+c3RvcF9zZW5kX2JlYWNvbnMgPSBydGw4MTkyX3N0b3BfYmVhY29uOworCisJcHJpdi0+cnRsbGliLT5zdGFfd2FrZV91cCA9IHJ0bDgxOTJfaHdfd2FrZXVwOworCXByaXYtPnJ0bGxpYi0+ZW50ZXJfc2xlZXBfc3RhdGUgPSBydGw4MTkyX2h3X3RvX3NsZWVwOworCXByaXYtPnJ0bGxpYi0+cHNfaXNfcXVldWVfZW1wdHkgPSBydGw4MTkyX2lzX3R4X3F1ZXVlX2VtcHR5OworCisJcHJpdi0+cnRsbGliLT5HZXRObW9kZVN1cHBvcnRCeVNlY0NmZyA9IHJ0bDgxOTJfR2V0Tm1vZGVTdXBwb3J0QnlTZWNDZmc7CisJcHJpdi0+cnRsbGliLT5HZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHNIYW5kbGVyID0KKwkJCQkJIHJ0bDgxOTJfR2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzOworCisJcHJpdi0+cnRsbGliLT5TZXRId1JlZ0hhbmRsZXIgPSBydGw4MTkyZV9TZXRId1JlZzsKKwlwcml2LT5ydGxsaWItPkFsbG93QWxsRGVzdEFkZHJIYW5kbGVyID0gcnRsODE5Ml9BbGxvd0FsbERlc3RBZGRyOworCXByaXYtPnJ0bGxpYi0+U2V0RndDbWRIYW5kbGVyID0gTlVMTDsKKwlwcml2LT5ydGxsaWItPkluaXRpYWxHYWluSGFuZGxlciA9IEluaXRpYWxHYWluODE5eFBjaTsKKwlwcml2LT5ydGxsaWItPnJ0bGxpYl9pcHNfbGVhdmVfd3EgPSBydGxsaWJfaXBzX2xlYXZlX3dxOworCXByaXYtPnJ0bGxpYi0+cnRsbGliX2lwc19sZWF2ZSA9IHJ0bGxpYl9pcHNfbGVhdmU7CisKKwlwcml2LT5ydGxsaWItPkxlZENvbnRyb2xIYW5kbGVyID0gTlVMTDsKKwlwcml2LT5ydGxsaWItPlVwZGF0ZUJlYWNvbkludGVycnVwdEhhbmRsZXIgPSBOVUxMOworCisJcHJpdi0+cnRsbGliLT5TY2FuT3BlcmF0aW9uQmFja3VwSGFuZGxlciA9IFBIWV9TY2FuT3BlcmF0aW9uQmFja3VwODE5MjsKKworCXByaXYtPnJ0bGxpYi0+cnRsbGliX3Jma2lsbF9wb2xsID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcnRsODE5Ml9pbml0X3ByaXZfY29uc3RhbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJc3RydWN0IHJ0X3B3cl9zYXZlX2N0cmwgKnBQU0MgPSAoc3RydWN0IHJ0X3B3cl9zYXZlX2N0cmwgKikKKwkJCQkJJihwcml2LT5ydGxsaWItPlBvd2VyU2F2ZUNvbnRyb2wpOworCisJcFBTQy0+UmVnTWF4TFBTQXdha2VJbnR2bCA9IDU7CisKKwlwcml2LT5SZWdQY2lBU1BNID0gMjsKKworCXByaXYtPlJlZ0RldmljZVBjaUFTUE1TZXR0aW5nID0gMHgwMzsKKworCXByaXYtPlJlZ0hvc3RQY2lBU1BNU2V0dGluZyA9IDB4MDI7CisKKwlwcml2LT5SZWdId1N3UmZPZmZEMyA9IDI7CisKKwlwcml2LT5SZWdTdXBwb3J0UGNpQVNQTSA9IDI7Cit9CisKKworc3RhdGljIHZvaWQgcnRsODE5Ml9pbml0X3ByaXZfdmFyaWFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJdTggaTsKKworCXByaXYtPkFjbU1ldGhvZCA9IGVBY21XYXkyX1NXOworCXByaXYtPmRvdDExQ3VycmVudFByZWFtYmxlTW9kZSA9IFBSRUFNQkxFX0FVVE87CisJcHJpdi0+cnRsbGliLT5od3NjYW5fc2VtX3VwID0gMTsKKwlwcml2LT5ydGxsaWItPnN0YXR1cyA9IDA7CisJcHJpdi0+SDJDVHhDbWRTZXEgPSAwOworCXByaXYtPmJEaXNhYmxlRnJhbWVCdXJzdGluZyA9IDA7CisJcHJpdi0+YkRNSW5pdGlhbEdhaW5FbmFibGUgPSAxOworCXByaXYtPnBvbGxpbmdfdGltZXJfb24gPSAwOworCXByaXYtPnVwX2ZpcnN0X3RpbWUgPSAxOworCXByaXYtPmJsaW5rZWRfaW5ncGlvID0gZmFsc2U7CisJcHJpdi0+YkRyaXZlcklzR29pbmdUb1VubG9hZCA9IGZhbHNlOworCXByaXYtPmJlaW5nX2luaXRfYWRhcHRlciA9IGZhbHNlOworCXByaXYtPmluaXRpYWxpemVkX2F0X3Byb2JlID0gZmFsc2U7CisJcHJpdi0+c3dfcmFkaW9fb24gPSB0cnVlOworCXByaXYtPmJkaXNhYmxlX25pYyA9IGZhbHNlOworCXByaXYtPmJmaXJzdF9pbml0ID0gZmFsc2U7CisJcHJpdi0+dHhyaW5nY291bnQgPSA2NDsKKwlwcml2LT5yeGJ1ZmZlcnNpemUgPSA5MTAwOworCXByaXYtPnJ4cmluZ2NvdW50ID0gTUFYX1JYX0NPVU5UOworCXByaXYtPmlycV9lbmFibGVkID0gMDsKKwlwcml2LT5jaGFuID0gMTsKKwlwcml2LT5SZWdXaXJlbGVzc01vZGUgPSBXSVJFTEVTU19NT0RFX0FVVE87CisJcHJpdi0+UmVnQ2hhbm5lbFBsYW4gPSAweGY7CisJcHJpdi0+bnJ4QU1QRFVfc2l6ZSA9IDA7CisJcHJpdi0+bnJ4QU1QRFVfYWdncl9udW0gPSAwOworCXByaXYtPmxhc3RfcnhkZXNjX3RzZl9oaWdoID0gMDsKKwlwcml2LT5sYXN0X3J4ZGVzY190c2ZfbG93ID0gMDsKKwlwcml2LT5ydGxsaWItPm1vZGUgPSBXSVJFTEVTU19NT0RFX0FVVE87CisJcHJpdi0+cnRsbGliLT5pd19tb2RlID0gSVdfTU9ERV9JTkZSQTsKKwlwcml2LT5ydGxsaWItPmJOZXRQcm9taXNjdW91c01vZGUgPSBmYWxzZTsKKwlwcml2LT5ydGxsaWItPkludGVsUHJvbWlzY3VvdXNNb2RlSW5mby5iUHJvbWlzY3VvdXNPbiA9IGZhbHNlOworCXByaXYtPnJ0bGxpYi0+SW50ZWxQcm9taXNjdW91c01vZGVJbmZvLmJGaWx0ZXJTb3VyY2VTdGF0aW9uRnJhbWUgPQorCQkJCQkJCQkgZmFsc2U7CisJcHJpdi0+cnRsbGliLT5pZWVlX3VwID0gMDsKKwlwcml2LT5yZXRyeV9ydHMgPSBERUZBVUxUX1JFVFJZX1JUUzsKKwlwcml2LT5yZXRyeV9kYXRhID0gREVGQVVMVF9SRVRSWV9EQVRBOworCXByaXYtPnJ0bGxpYi0+cnRzID0gREVGQVVMVF9SVFNfVEhSRVNIT0xEOworCXByaXYtPnJ0bGxpYi0+cmF0ZSA9IDExMDsKKwlwcml2LT5ydGxsaWItPnNob3J0X3Nsb3QgPSAxOworCXByaXYtPnByb21pc2MgPSAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSA/IDEgOiAwOworCXByaXYtPmJjY2tfaW5fY2gxNCA9IGZhbHNlOworCXByaXYtPmJmc3luY19wcm9jZXNzaW5nICA9IGZhbHNlOworCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPSAwOworCXByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCA9IDA7CisJcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4ID0gMDsKKwlwcml2LT5DY2tQd0VubCA9IDY7CisJcHJpdi0+U2NhbkRlbGF5ID0gNTA7CisJcHJpdi0+UmVzZXRQcm9ncmVzcyA9IFJFU0VUX1RZUEVfTk9SRVNFVDsKKwlwcml2LT5iRm9yY2VkU2lsZW50UmVzZXQgPSAwOworCXByaXYtPmJEaXNhYmxlTm9ybWFsUmVzZXRDaGVjayA9IGZhbHNlOworCXByaXYtPmZvcmNlX3Jlc2V0ID0gZmFsc2U7CisJbWVtc2V0KHByaXYtPnJ0bGxpYi0+c3djYW10YWJsZSwgMCwgc2l6ZW9mKHN0cnVjdCBzd19jYW1fdGFibGUpICogMzIpOworCisJbWVtc2V0KCZwcml2LT5JbnRlcnJ1cHRMb2csIDAsIHNpemVvZihzdHJ1Y3QgbG9nX2ludF84MTkwKSk7CisJcHJpdi0+UnhDb3VudGVyID0gMDsKKwlwcml2LT5ydGxsaWItPnd4X3NldF9lbmMgPSAwOworCXByaXYtPmJId1JhZGlvT2ZmID0gZmFsc2U7CisJcHJpdi0+UmVnUmZPZmYgPSAwOworCXByaXYtPmlzUkZPZmYgPSBmYWxzZTsKKwlwcml2LT5iSW5Qb3dlclNhdmVNb2RlID0gZmFsc2U7CisJcHJpdi0+cnRsbGliLT5SZk9mZlJlYXNvbiA9IDA7CisJcHJpdi0+UkZDaGFuZ2VJblByb2dyZXNzID0gZmFsc2U7CisJcHJpdi0+Ykh3UmZPZmZBY3Rpb24gPSAwOworCXByaXYtPlNldFJGUG93ZXJTdGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTsKKwlwcml2LT5ydGxsaWItPlBvd2VyU2F2ZUNvbnRyb2wuYkluYWN0aXZlUHMgPSB0cnVlOworCXByaXYtPnJ0bGxpYi0+UG93ZXJTYXZlQ29udHJvbC5iSVBTTW9kZUJhY2t1cCA9IGZhbHNlOworCXByaXYtPnJ0bGxpYi0+UG93ZXJTYXZlQ29udHJvbC5iTGVpc3VyZVBzID0gdHJ1ZTsKKwlwcml2LT5ydGxsaWItPlBvd2VyU2F2ZUNvbnRyb2wuYkZ3Q3RybExQUyA9IGZhbHNlOworCXByaXYtPnJ0bGxpYi0+TFBTRGVsYXlDbnQgPSAwOworCXByaXYtPnJ0bGxpYi0+c3RhX3NsZWVwID0gTFBTX0lTX1dBS0U7CisJcHJpdi0+cnRsbGliLT5lUkZQb3dlclN0YXRlID0gZVJmT247CisKKwlwcml2LT50eHBvd2VyX2NoZWNrY250ID0gMDsKKwlwcml2LT50aGVybWFsX3JlYWRiYWNrX2luZGV4ID0gMDsKKwlwcml2LT50eHBvd2VyX3RyYWNraW5nX2NhbGxiYWNrX2NudCA9IDA7CisJcHJpdi0+Y2NrdHhwb3dlcl9hZGp1c3RjbnRfY2gxNCA9IDA7CisJcHJpdi0+Y2NrdHhwb3dlcl9hZGp1c3RjbnRfbm90X2NoMTQgPSAwOworCisJcHJpdi0+cnRsbGliLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsID0gREVGQVVMVF9CRUFDT05JTlRFUlZBTDsKKwlwcml2LT5ydGxsaWItPml3X21vZGUgPSBJV19NT0RFX0lORlJBOworCXByaXYtPnJ0bGxpYi0+YWN0aXZlX3NjYW4gPSAxOworCXByaXYtPnJ0bGxpYi0+YmVfc2Nhbl9pbnByb2dyZXNzID0gZmFsc2U7CisJcHJpdi0+cnRsbGliLT5tb2R1bGF0aW9uID0gUlRMTElCX0NDS19NT0RVTEFUSU9OIHwKKwkJCQkgICBSVExMSUJfT0ZETV9NT0RVTEFUSU9OOworCXByaXYtPnJ0bGxpYi0+aG9zdF9lbmNyeXB0ID0gMTsKKwlwcml2LT5ydGxsaWItPmhvc3RfZGVjcnlwdCA9IDE7CisKKwlwcml2LT5ydGxsaWItPmRvdDExUG93ZXJTYXZlTW9kZSA9IGVBY3RpdmU7CisJcHJpdi0+cnRsbGliLT5mdHMgPSBERUZBVUxUX0ZSQUdfVEhSRVNIT0xEOworCXByaXYtPnJ0bGxpYi0+TWF4TXNzRGVuc2l0eSA9IDA7CisJcHJpdi0+cnRsbGliLT5NaW5TcGFjZUNmZyA9IDA7CisKKwlwcml2LT5jYXJkX3R5cGUgPSBQQ0k7CisKKwlwcml2LT5BY21Db250cm9sID0gMDsKKwlwcml2LT5wRmlybXdhcmUgPSB2emFsbG9jKHNpemVvZihzdHJ1Y3QgcnRfZmlybXdhcmUpKTsKKwlpZiAoIXByaXYtPnBGaXJtd2FyZSkKKwkJcHJpbnRrKEtFUk5fRVJSICJydGw4MTkzZTogVW5hYmxlIHRvIGFsbG9jYXRlIHNwYWNlICIKKwkJICAgICAgICJmb3IgZmlybXdhcmVcbiIpOworCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcHJpdi0+cnhfcXVldWUpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnByaXYtPnNrYl9xdWV1ZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1FVRVVFX1NJWkU7IGkrKykKKwkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcHJpdi0+cnRsbGliLT5za2Jfd2FpdFFbaV0pOworCWZvciAoaSA9IDA7IGkgPCBNQVhfUVVFVUVfU0laRTsgaSsrKQorCQlza2JfcXVldWVfaGVhZF9pbml0KCZwcml2LT5ydGxsaWItPnNrYl9hZ2dRW2ldKTsKK30KKworc3RhdGljIHZvaWQgcnRsODE5Ml9pbml0X3ByaXZfbG9jayhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdikKK3sKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+Zndfc2Nhbl9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+dHhfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPmlycV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+aXJxX3RoX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZwcml2LT5yZl9wc19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+cHNfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnJmX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZwcml2LT5ydF9oMmNfbG9jayk7CisJc2VtYV9pbml0KCZwcml2LT53eF9zZW0sIDEpOworCXNlbWFfaW5pdCgmcHJpdi0+cmZfc2VtLCAxKTsKKwltdXRleF9pbml0KCZwcml2LT5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfaW5pdF9wcml2X3Rhc2soc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisKKwlwcml2LT5wcml2X3dxID0gY3JlYXRlX3dvcmtxdWV1ZShEUlZfTkFNRSk7CisJSU5JVF9XT1JLX1JTTCgmcHJpdi0+cmVzZXRfd3EsICh2b2lkICopcnRsODE5Ml9yZXN0YXJ0LCBkZXYpOworCUlOSVRfV09SS19SU0woJnByaXYtPnJ0bGxpYi0+aXBzX2xlYXZlX3dxLCAodm9pZCAqKUlQU0xlYXZlX3dxLCBkZXYpOworCUlOSVRfREVMQVlFRF9XT1JLX1JTTCgmcHJpdi0+d2F0Y2hfZG9nX3dxLAorCQkJICAgICAgKHZvaWQgKilydGw4MTl4X3dhdGNoZG9nX3dxY2FsbGJhY2ssIGRldik7CisJSU5JVF9ERUxBWUVEX1dPUktfUlNMKCZwcml2LT50eHBvd2VyX3RyYWNraW5nX3dxLAorCQkJICAgICAgKHZvaWQgKilkbV90eHBvd2VyX3RyYWNraW5nY2FsbGJhY2ssIGRldik7CisJSU5JVF9ERUxBWUVEX1dPUktfUlNMKCZwcml2LT5yZnBhdGhfY2hlY2tfd3EsCisJCQkgICAgICAodm9pZCAqKWRtX3JmX3BhdGhjaGVja193b3JraXRlbWNhbGxiYWNrLCBkZXYpOworCUlOSVRfREVMQVlFRF9XT1JLX1JTTCgmcHJpdi0+dXBkYXRlX2JlYWNvbl93cSwKKwkJCSAgICAgICh2b2lkICopcnRsODE5Ml91cGRhdGVfYmVhY29uLCBkZXYpOworCUlOSVRfV09SS19SU0woJnByaXYtPnFvc19hY3RpdmF0ZSwgKHZvaWQgKilydGw4MTkyX3Fvc19hY3RpdmF0ZSwgZGV2KTsKKwlJTklUX0RFTEFZRURfV09SS19SU0woJnByaXYtPnJ0bGxpYi0+aHdfd2FrZXVwX3dxLAorCQkJICAgICAgKHZvaWQgKikgcnRsODE5Ml9od193YWtldXBfd3EsIGRldik7CisJSU5JVF9ERUxBWUVEX1dPUktfUlNMKCZwcml2LT5ydGxsaWItPmh3X3NsZWVwX3dxLAorCQkJICAgICAgKHZvaWQgKikgcnRsODE5Ml9od19zbGVlcF93cSwgZGV2KTsKKwl0YXNrbGV0X2luaXQoJnByaXYtPmlycV9yeF90YXNrbGV0LAorCQkgICAgICh2b2lkKCopKHVuc2lnbmVkIGxvbmcpKXJ0bDgxOTJfaXJxX3J4X3Rhc2tsZXQsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpcHJpdik7CisJdGFza2xldF9pbml0KCZwcml2LT5pcnFfdHhfdGFza2xldCwKKwkJICAgICAodm9pZCgqKSh1bnNpZ25lZCBsb25nKSlydGw4MTkyX2lycV90eF90YXNrbGV0LAorCQkgICAgICh1bnNpZ25lZCBsb25nKXByaXYpOworCXRhc2tsZXRfaW5pdCgmcHJpdi0+aXJxX3ByZXBhcmVfYmVhY29uX3Rhc2tsZXQsCisJCSAgICAgKHZvaWQoKikodW5zaWduZWQgbG9uZykpcnRsODE5Ml9wcmVwYXJlX2JlYWNvbiwKKwkJICAgICAodW5zaWduZWQgbG9uZylwcml2KTsKK30KKworc3RhdGljIHNob3J0IHJ0bDgxOTJfZ2V0X2NoYW5uZWxfbWFwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJaWYgKChwcml2LT5yZl9jaGlwICE9IFJGXzgyMjUpICYmIChwcml2LT5yZl9jaGlwICE9IFJGXzgyNTYpCisJCQkmJiAocHJpdi0+cmZfY2hpcCAhPSBSRl82MDUyKSkgeworCQlSVF9UUkFDRShDT01QX0VSUiwgIiVzOiB1bmtub3duIHJmIGNoaXAsIGNhbid0IHNldCBjaGFubmVsICIKKwkJCSAibWFwXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocHJpdi0+Q2hhbm5lbFBsYW4gPj0gQ09VTlRSWV9DT0RFX01BWCkgeworCQlwcmludGsoS0VSTl9JTkZPICJydGw4MTl4X2luaXQ6RXJyb3IgY2hhbm5lbCBwbGFuISBTZXQgdG8gIgorCQkgICAgICAgImRlZmF1bHQuXG4iKTsKKwkJcHJpdi0+Q2hhbm5lbFBsYW4gPSBDT1VOVFJZX0NPREVfRkNDOworCX0KKwlSVF9UUkFDRShDT01QX0lOSVQsICJDaGFubmVsIHBsYW4gaXMgJWRcbiIsIHByaXYtPkNoYW5uZWxQbGFuKTsKKwlEb3QxMWRfSW5pdChwcml2LT5ydGxsaWIpOworCURvdDExZF9DaGFubmVsbWFwKHByaXYtPkNoYW5uZWxQbGFuLCBwcml2LT5ydGxsaWIpOworCWZvciAoaSA9IDE7IGkgPD0gMTE7IGkrKykKKwkJKHByaXYtPnJ0bGxpYi0+YWN0aXZlX2NoYW5uZWxfbWFwKVtpXSA9IDE7CisJKHByaXYtPnJ0bGxpYi0+YWN0aXZlX2NoYW5uZWxfbWFwKVsxMl0gPSAyOworCShwcml2LT5ydGxsaWItPmFjdGl2ZV9jaGFubmVsX21hcClbMTNdID0gMjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc2hvcnQgcnRsODE5Ml9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJbWVtc2V0KCYocHJpdi0+c3RhdHMpLCAwLCBzaXplb2Yoc3RydWN0IHJ0X3N0YXRzKSk7CisKKwlydGw4MTkyX2RiZ3BfZmxhZ19pbml0KGRldik7CisJcnRsODE5Ml9pbml0X3ByaXZfaGFuZGxlcihkZXYpOworCXJ0bDgxOTJfaW5pdF9wcml2X2NvbnN0YW50KGRldik7CisJcnRsODE5Ml9pbml0X3ByaXZfdmFyaWFibGUoZGV2KTsKKwlydGw4MTkyX2luaXRfcHJpdl9sb2NrKHByaXYpOworCXJ0bDgxOTJfaW5pdF9wcml2X3Rhc2soZGV2KTsKKwlwcml2LT5vcHMtPmdldF9lZXByb21fc2l6ZShkZXYpOworCXByaXYtPm9wcy0+aW5pdF9hZGFwdGVyX3ZhcmlhYmxlKGRldik7CisJcnRsODE5Ml9nZXRfY2hhbm5lbF9tYXAoZGV2KTsKKworCWluaXRfaGFsX2RtKGRldik7CisKKwlpbml0X3RpbWVyKCZwcml2LT53YXRjaF9kb2dfdGltZXIpOworCXNldHVwX3RpbWVyKCZwcml2LT53YXRjaF9kb2dfdGltZXIsCisJCSAgICB3YXRjaF9kb2dfdGltZXJfY2FsbGJhY2ssCisJCSAgICAodW5zaWduZWQgbG9uZykgZGV2KTsKKworCWluaXRfdGltZXIoJnByaXYtPmdwaW9fcG9sbGluZ190aW1lcik7CisJc2V0dXBfdGltZXIoJnByaXYtPmdwaW9fcG9sbGluZ190aW1lciwKKwkJICAgIGNoZWNrX3JmY3RybF9ncGlvX3RpbWVyLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpZGV2KTsKKworCXJ0bDgxOTJfaXJxX2Rpc2FibGUoZGV2KTsKKwlpZiAocmVxdWVzdF9pcnEoZGV2LT5pcnEsICh2b2lkICopcnRsODE5Ml9pbnRlcnJ1cHRfcnNsLCBJUlFGX1NIQVJFRCwKKwkgICAgZGV2LT5uYW1lLCBkZXYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgYWxsb2NhdGluZyBJUlEgJWQiLCBkZXYtPmlycSk7CisJCXJldHVybiAtMTsKKwl9IGVsc2UgeworCQlwcml2LT5pcnEgPSBkZXYtPmlycTsKKwkJUlRfVFJBQ0UoQ09NUF9JTklULCAiSVJRICVkXG4iLCBkZXYtPmlycSk7CisJfQorCisJaWYgKHJ0bDgxOTJfcGNpX2luaXRkZXNjcmluZyhkZXYpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFbmRvcG9pbnRzIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVdBVENIRE9HIFNUVUZGLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzaG9ydCBydGw4MTkyX2lzX3R4X3F1ZXVlX2VtcHR5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGkgPSAwOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlmb3IgKGkgPSAwOyBpIDw9IE1HTlRfUVVFVUU7IGkrKykgeworCQlpZiAoKGkgPT0gVFhDTURfUVVFVUUpIHx8IChpID09IEhDQ0FfUVVFVUUpKQorCQkJY29udGludWU7CisJCWlmIChza2JfcXVldWVfbGVuKCYoJnByaXYtPnR4X3JpbmdbaV0pLT5xdWV1ZSkgPiAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICI9PT0+dHggcXVldWUgaXMgbm90IGVtcHR5OiVkLCAlZFxuIiwKKwkJCSAgICAgICBpLCBza2JfcXVldWVfbGVuKCYoJnByaXYtPnR4X3JpbmdbaV0pLT5xdWV1ZSkpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBlbnVtIHJlc2V0X3R5cGUgcnRsODE5eF9UeENoZWNrU3R1Y2soc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJdTgJUXVldWVJRDsKKwl1OAlSZXNldFRocmVzaG9sZCA9IE5JQ19TRU5EX0hBTkdfVEhSRVNIT0xEX1BPV0VSU0FWRTsKKwlib29sCWJDaGVja0Z3VHhDbnQgPSBmYWxzZTsKKwlzdHJ1Y3QgcnRsODE5Ml90eF9yaW5nICAqcmluZyA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJc3RydWN0IGNiX2Rlc2MgKnRjYl9kZXNjID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKworCXN3aXRjaCAocHJpdi0+cnRsbGliLT5wcykgeworCWNhc2UgUlRMTElCX1BTX0RJU0FCTEVEOgorCQlSZXNldFRocmVzaG9sZCA9IE5JQ19TRU5EX0hBTkdfVEhSRVNIT0xEX05PUk1BTDsKKwkJYnJlYWs7CisJY2FzZSAoUlRMTElCX1BTX01CQ0FTVHxSVExMSUJfUFNfVU5JQ0FTVCk6CisJCVJlc2V0VGhyZXNob2xkID0gTklDX1NFTkRfSEFOR19USFJFU0hPTERfUE9XRVJTQVZFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlSZXNldFRocmVzaG9sZCA9IE5JQ19TRU5EX0hBTkdfVEhSRVNIT0xEX1BPV0VSU0FWRTsKKwkJYnJlYWs7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5pcnFfdGhfbG9jaywgZmxhZ3MpOworCWZvciAoUXVldWVJRCA9IDA7IFF1ZXVlSUQgPCBNQVhfVFhfUVVFVUU7IFF1ZXVlSUQrKykgeworCQlpZiAoUXVldWVJRCA9PSBUWENNRF9RVUVVRSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChRdWV1ZUlEID09IEJFQUNPTl9RVUVVRSkKKwkJCWNvbnRpbnVlOworCisJCXJpbmcgPSAmcHJpdi0+dHhfcmluZ1tRdWV1ZUlEXTsKKworCQlpZiAoc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpID09IDApIHsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgeworCQkJc2tiID0gKCZyaW5nLT5xdWV1ZSktPm5leHQ7CisJCQl0Y2JfZGVzYyA9IChzdHJ1Y3QgY2JfZGVzYyAqKShza2ItPmNiICsKKwkJCQkgICAgTUFYX0RFVl9BRERSX1NJWkUpOworCQkJdGNiX2Rlc2MtPm5TdHVja0NvdW50Kys7CisJCQliQ2hlY2tGd1R4Q250ID0gdHJ1ZTsKKwkJCWlmICh0Y2JfZGVzYy0+blN0dWNrQ291bnQgPiAxKQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBRdWV1ZUlEPSVkIHRjYl9kZXNjLT5uIgorCQkJCSAgICAgICAiU3R1Y2tDb3VudD0lZFxuIiwgX19mdW5jX18sIFF1ZXVlSUQsCisJCQkJICAgICAgIHRjYl9kZXNjLT5uU3R1Y2tDb3VudCk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxX3RoX2xvY2ssIGZsYWdzKTsKKworCWlmIChiQ2hlY2tGd1R4Q250KSB7CisJCWlmIChwcml2LT5vcHMtPlR4Q2hlY2tTdHVja0hhbmRsZXIoZGV2KSkgeworCQkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwgIlR4Q2hlY2tTdHVjaygpOiBGdyBpbmRpY2F0ZXMgbm8iCisJCQkJICIgVHggY29uZGl0aW9uIVxuIik7CisJCQlyZXR1cm4gUkVTRVRfVFlQRV9TSUxFTlQ7CisJCX0KKwl9CisKKwlyZXR1cm4gUkVTRVRfVFlQRV9OT1JFU0VUOworfQorCitzdGF0aWMgZW51bSByZXNldF90eXBlIHJ0bDgxOXhfUnhDaGVja1N0dWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJaWYgKHByaXYtPm9wcy0+UnhDaGVja1N0dWNrSGFuZGxlcihkZXYpKSB7CisJCVJUX1RSQUNFKENPTVBfUkVTRVQsICJSeFN0dWNrIENvbmRpdGlvblxuIik7CisJCXJldHVybiBSRVNFVF9UWVBFX1NJTEVOVDsKKwl9CisKKwlyZXR1cm4gUkVTRVRfVFlQRV9OT1JFU0VUOworfQorCitzdGF0aWMgZW51bSByZXNldF90eXBlIHJ0bDgxOXhfaWZjaGVja19yZXNldG9ybm90KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCWVudW0gcmVzZXRfdHlwZSBUeFJlc2V0VHlwZSA9IFJFU0VUX1RZUEVfTk9SRVNFVDsKKwllbnVtIHJlc2V0X3R5cGUgUnhSZXNldFR5cGUgPSBSRVNFVF9UWVBFX05PUkVTRVQ7CisJZW51bSBydF9yZl9wb3dlcl9zdGF0ZSByZlN0YXRlOworCisJcmZTdGF0ZSA9IHByaXYtPnJ0bGxpYi0+ZVJGUG93ZXJTdGF0ZTsKKworCWlmIChyZlN0YXRlID09IGVSZk9uKQorCQlUeFJlc2V0VHlwZSA9IHJ0bDgxOXhfVHhDaGVja1N0dWNrKGRldik7CisKKwlpZiAocmZTdGF0ZSA9PSBlUmZPbiAmJgorCSAgICAocHJpdi0+cnRsbGliLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpICYmCisJICAgIChwcml2LT5ydGxsaWItPnN0YXRlID09IFJUTExJQl9MSU5LRUQpKQorCQlSeFJlc2V0VHlwZSA9IHJ0bDgxOXhfUnhDaGVja1N0dWNrKGRldik7CisKKwlpZiAoVHhSZXNldFR5cGUgPT0gUkVTRVRfVFlQRV9OT1JNQUwgfHwKKwkgICAgUnhSZXNldFR5cGUgPT0gUkVTRVRfVFlQRV9OT1JNQUwpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTogVHhSZXNldFR5cGUgaXMgJWQsIFJ4UmVzZXRUeXBlIGlzICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIFR4UmVzZXRUeXBlLCBSeFJlc2V0VHlwZSk7CisJCXJldHVybiBSRVNFVF9UWVBFX05PUk1BTDsKKwl9IGVsc2UgaWYgKFR4UmVzZXRUeXBlID09IFJFU0VUX1RZUEVfU0lMRU5UIHx8CisJCSAgIFJ4UmVzZXRUeXBlID09IFJFU0VUX1RZUEVfU0lMRU5UKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzKCk6IFR4UmVzZXRUeXBlIGlzICVkLCBSeFJlc2V0VHlwZSBpcyAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBUeFJlc2V0VHlwZSwgUnhSZXNldFR5cGUpOworCQlyZXR1cm4gUkVTRVRfVFlQRV9TSUxFTlQ7CisJfSBlbHNlIHsKKwkJcmV0dXJuIFJFU0VUX1RZUEVfTk9SRVNFVDsKKwl9CisKK30KKworc3RhdGljIHZvaWQgcnRsODE5eF9zaWxlbnRyZXNldF9tZXNoX2JrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IElzUG9ydGFsKQoreworfQorCitzdGF0aWMgdm9pZCBydGw4MTl4X2lmc2lsZW50cmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJdTgJcmVzZXRfdGltZXMgPSAwOworCWludCByZXNldF9zdGF0dXMgPSAwOworCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gcHJpdi0+cnRsbGliOworCXVuc2lnbmVkIGxvbmcgZmxhZzsKKworCXU4IElzUG9ydGFsID0gMDsKKworCisJaWYgKHByaXYtPlJlc2V0UHJvZ3Jlc3MgPT0gUkVTRVRfVFlQRV9OT1JFU0VUKSB7CisKKwkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwgIj09PT09PT09PT5SZXNldCBwcm9ncmVzcyEhXG4iKTsKKworCQlwcml2LT5SZXNldFByb2dyZXNzID0gUkVTRVRfVFlQRV9TSUxFTlQ7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJmX3BzX2xvY2ssIGZsYWcpOworCQlpZiAocHJpdi0+UkZDaGFuZ2VJblByb2dyZXNzKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZl9wc19sb2NrLCBmbGFnKTsKKwkJCWdvdG8gRU5EOworCQl9CisJCXByaXYtPlJGQ2hhbmdlSW5Qcm9ncmVzcyA9IHRydWU7CisJCXByaXYtPmJSZXNldEluUHJvZ3Jlc3MgPSB0cnVlOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZl9wc19sb2NrLCBmbGFnKTsKKworUkVTRVRfU1RBUlQ6CisKKwkJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCQlpZiAocHJpdi0+cnRsbGliLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEKQorCQkJTGVpc3VyZVBTTGVhdmUoZGV2KTsKKworCQlpZiAoSVNfTklDX0RPV04ocHJpdikpIHsKKwkJCVJUX1RSQUNFKENPTVBfRVJSLCAiJXMoKTp0aGUgZHJpdmVyIGlzIG5vdCB1cCEgIgorCQkJCSAicmV0dXJuXG4iLCBfX2Z1bmNfXyk7CisJCQl1cCgmcHJpdi0+d3hfc2VtKTsKKwkJCXJldHVybiA7CisJCX0KKwkJcHJpdi0+dXAgPSAwOworCisJCVJUX1RSQUNFKENPTVBfUkVTRVQsICIlcygpOj09PT09PT5zdGFydCB0byBkb3duIHRoZSBkcml2ZXJcbiIsCisJCQkgIF9fZnVuY19fKTsKKwkJbWRlbGF5KDEwMDApOworCQlSVF9UUkFDRShDT01QX1JFU0VULCAiJXMoKToxMTExMTExMTExMTExMTExMTExMTExMTE9PT09PT0+c3RhcnQiCisJCQkgIiB0byBkb3duIHRoZSBkcml2ZXJcbiIsIF9fZnVuY19fKTsKKworCQlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSkKKwkJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCQlydGw4MTkyX2lycV9kaXNhYmxlKGRldik7CisJCWRlbF90aW1lcl9zeW5jKCZwcml2LT53YXRjaF9kb2dfdGltZXIpOworCQlydGw4MTkyX2NhbmNlbF9kZWZlcnJlZF93b3JrKHByaXYpOworCQlkZWluaXRfaGFsX2RtKGRldik7CisJCXJ0bGxpYl9zdG9wX3NjYW5fc3luY3JvKGllZWUpOworCisJCWlmIChpZWVlLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEKSB7CisJCQlTRU1fRE9XTl9JRUVFX1dYKCZpZWVlLT53eF9zZW0pOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiaWVlZS0+c3RhdGUgaXMgUlRMTElCX0xJTktFRFxuIik7CisJCQlydGxsaWJfc3RvcF9zZW5kX2JlYWNvbnMocHJpdi0+cnRsbGliKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOworCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxKTsKKwkJCXJ0bGxpYl9zdG9wX3NjYW4oaWVlZSk7CisJCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCQkJU0VNX1VQX0lFRUVfV1goJmllZWUtPnd4X3NlbSk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJpZWVlLT5zdGF0ZSBpcyBOT1QgTElOS0VEXG4iKTsKKwkJCXJ0bGxpYl9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wocHJpdi0+cnRsbGliLCAwICwgdHJ1ZSk7CisJCX0KKworCQlkbV9iYWNrdXBfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoZGV2KTsKKworCQl1cCgmcHJpdi0+d3hfc2VtKTsKKwkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwgIiVzKCk6PD09PT09PT09PT1kb3duIHByb2Nlc3MgaXMgIgorCQkJICJmaW5pc2hlZFxuIiwgX19mdW5jX18pOworCisJCVJUX1RSQUNFKENPTVBfUkVTRVQsICIlcygpOjw9PT09PT09PT09PXVwIHByb2Nlc3Mgc3RhcnRcbiIsCisJCQkgX19mdW5jX18pOworCQlyZXNldF9zdGF0dXMgPSBfcnRsODE5Ml91cChkZXYsIHRydWUpOworCisJCVJUX1RSQUNFKENPTVBfUkVTRVQsICIlcygpOjw9PT09PT09PT09PXVwIHByb2Nlc3MgaXMgIgorCQkJICJmaW5pc2hlZFxuIiwgX19mdW5jX18pOworCQlpZiAocmVzZXRfc3RhdHVzID09IC0xKSB7CisJCQlpZiAocmVzZXRfdGltZXMgPCAzKSB7CisJCQkJcmVzZXRfdGltZXMrKzsKKwkJCQlnb3RvIFJFU0VUX1NUQVJUOworCQkJfSBlbHNlIHsKKwkJCQlSVF9UUkFDRShDT01QX0VSUiwgIiBFUlIhISEgJXMoKTogIFJlc2V0ICIKKwkJCQkJICJGYWlsZWQhIVxuIiwgX19mdW5jX18pOworCQkJfQorCQl9CisKKwkJaWVlZS0+aXNfc2lsZW50X3Jlc2V0ID0gMTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmZfcHNfbG9jaywgZmxhZyk7CisJCXByaXYtPlJGQ2hhbmdlSW5Qcm9ncmVzcyA9IGZhbHNlOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZl9wc19sb2NrLCBmbGFnKTsKKworCQlFbmFibGVIV1NlY3VyaXR5Q29uZmlnODE5MihkZXYpOworCisJCWlmIChpZWVlLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEICYmIGllZWUtPml3X21vZGUgPT0KKwkJICAgIElXX01PREVfSU5GUkEpIHsKKwkJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwKKwkJCQkgICAgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCisJCQlxdWV1ZV93b3JrX3JzbChpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9jb21wbGV0ZV93cSk7CisKKwkJfSBlbHNlIGlmIChpZWVlLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEICYmIGllZWUtPml3X21vZGUgPT0KKwkJCSAgIElXX01PREVfQURIT0MpIHsKKwkJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwKKwkJCQkgICAgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCQkJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKKworCQkJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOworCisJCQlydGxsaWJfc3RhcnRfc2VuZF9iZWFjb25zKGllZWUpOworCisJCQlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKKwkJCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUtPmRldik7CisJCQluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7CisJCX0gZWxzZSBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01FU0gpIHsKKwkJCXJ0bDgxOXhfc2lsZW50cmVzZXRfbWVzaF9iayhkZXYsIElzUG9ydGFsKTsKKwkJfQorCisJCUNhbVJlc3RvcmVBbGxFbnRyeShkZXYpOworCQlkbV9yZXN0b3JlX2R5bmFtaWNfbWVjaGFuaXNtX3N0YXRlKGRldik7CitFTkQ6CisJCXByaXYtPlJlc2V0UHJvZ3Jlc3MgPSBSRVNFVF9UWVBFX05PUkVTRVQ7CisJCXByaXYtPnJlc2V0X2NvdW50Kys7CisKKwkJcHJpdi0+YkZvcmNlZFNpbGVudFJlc2V0ID0gZmFsc2U7CisJCXByaXYtPmJSZXNldEluUHJvZ3Jlc3MgPSBmYWxzZTsKKworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFVGV1AsIDEpOworCQlSVF9UUkFDRShDT01QX1JFU0VULCAiUmVzZXQgZmluaXNoZWQhISA9PT09PlslZF1cbiIsCisJCQkgcHJpdi0+cmVzZXRfY291bnQpOworCX0KK30KKworc3RhdGljIHZvaWQgcnRsODE5eF91cGRhdGVfcnhjb3VudHMoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsIHUzMiAqVG90YWxSeEJjbk51bSwKKwkJCQkgICAgdTMyICpUb3RhbFJ4RGF0YU51bSkKK3sKKwl1MTYJU2xvdEluZGV4OworCXU4CWk7CisKKwkqVG90YWxSeEJjbk51bSA9IDA7CisJKlRvdGFsUnhEYXRhTnVtID0gMDsKKworCVNsb3RJbmRleCA9IChwcml2LT5ydGxsaWItPkxpbmtEZXRlY3RJbmZvLlNsb3RJbmRleCsrKSAlCisJCQkocHJpdi0+cnRsbGliLT5MaW5rRGV0ZWN0SW5mby5TbG90TnVtKTsKKwlwcml2LT5ydGxsaWItPkxpbmtEZXRlY3RJbmZvLlJ4QmNuTnVtW1Nsb3RJbmRleF0gPQorCQkJcHJpdi0+cnRsbGliLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2QmNuSW5QZXJpb2Q7CisJcHJpdi0+cnRsbGliLT5MaW5rRGV0ZWN0SW5mby5SeERhdGFOdW1bU2xvdEluZGV4XSA9CisJCQlwcml2LT5ydGxsaWItPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZEYXRhSW5QZXJpb2Q7CisJZm9yIChpID0gMDsgaSA8IHByaXYtPnJ0bGxpYi0+TGlua0RldGVjdEluZm8uU2xvdE51bTsgaSsrKSB7CisJCSpUb3RhbFJ4QmNuTnVtICs9IHByaXYtPnJ0bGxpYi0+TGlua0RldGVjdEluZm8uUnhCY25OdW1baV07CisJCSpUb3RhbFJ4RGF0YU51bSArPSBwcml2LT5ydGxsaWItPkxpbmtEZXRlY3RJbmZvLlJ4RGF0YU51bVtpXTsKKwl9Cit9CisKKwordm9pZAlydGw4MTl4X3dhdGNoZG9nX3dxY2FsbGJhY2sodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZl9kd29ya19yc2woZGF0YSwKKwkJCQkgIHN0cnVjdCByODE5Ml9wcml2LCB3YXRjaF9kb2dfd3EpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5ydGxsaWItPmRldjsKKwlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSA9IHByaXYtPnJ0bGxpYjsKKwllbnVtIHJlc2V0X3R5cGUgUmVzZXRUeXBlID0gUkVTRVRfVFlQRV9OT1JFU0VUOworCXN0YXRpYyB1OCBjaGVja19yZXNldF9jbnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcnRfcHdyX3NhdmVfY3RybCAqcFBTQyA9IChzdHJ1Y3QgcnRfcHdyX3NhdmVfY3RybCAqKQorCQkJCQkoJihwcml2LT5ydGxsaWItPlBvd2VyU2F2ZUNvbnRyb2wpKTsKKwlib29sIGJCdXN5VHJhZmZpYyA9IGZhbHNlOworCWJvb2wJYkhpZ2hlckJ1c3lUcmFmZmljID0gZmFsc2U7CisJYm9vbAliSGlnaGVyQnVzeVJ4VHJhZmZpYyA9IGZhbHNlOworCWJvb2wgYkVudGVyUFMgPSBmYWxzZTsKKworCWlmIChJU19OSUNfRE9XTihwcml2KSB8fCAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkpCisJCXJldHVybjsKKworCWlmIChwcml2LT5ydGxsaWItPnN0YXRlID49IFJUTExJQl9MSU5LRUQpIHsKKwkJaWYgKHByaXYtPnJ0bGxpYi0+Q250QWZ0ZXJMaW5rIDwgMikKKwkJCXByaXYtPnJ0bGxpYi0+Q250QWZ0ZXJMaW5rKys7CisJfSBlbHNlIHsKKwkJcHJpdi0+cnRsbGliLT5DbnRBZnRlckxpbmsgPSAwOworCX0KKworCWhhbF9kbV93YXRjaGRvZyhkZXYpOworCisJaWYgKHJ0bGxpYl9hY3Rfc2Nhbm5pbmcocHJpdi0+cnRsbGliLCBmYWxzZSkgPT0gZmFsc2UpIHsKKwkJaWYgKChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpICYmIChpZWVlLT5zdGF0ZSA9PQorCQkgICAgIFJUTExJQl9OT0xJTkspICYmCisJCSAgICAgKGllZWUtPmVSRlBvd2VyU3RhdGUgPT0gZVJmT24pICYmICFpZWVlLT5pc19zZXRfa2V5ICYmCisJCSAgICAgKCFpZWVlLT5wcm90b19zdG9wcHBpbmcpICYmICFpZWVlLT53eF9zZXRfZW5jKSB7CisJCQlpZiAoKGllZWUtPlBvd2VyU2F2ZUNvbnRyb2wuUmV0dXJuUG9pbnQgPT0KKwkJCSAgICAgSVBTX0NBTExCQUNLX05PTkUpICYmCisJCQkgICAgICghaWVlZS0+Yk5ldFByb21pc2N1b3VzTW9kZSkpIHsKKwkJCQlSVF9UUkFDRShDT01QX1BTLCAiPT09PT09PT09PT09PT09PT09PT0+aGFoYTogIgorCQkJCQkgIklQU0VudGVyKClcbiIpOworCQkJCUlQU0VudGVyKGRldik7CisJCQl9CisJCX0KKwl9CisJaWYgKChpZWVlLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEKSAmJiAoaWVlZS0+aXdfbW9kZSA9PQorCSAgICAgSVdfTU9ERV9JTkZSQSkgJiYgKCFpZWVlLT5iTmV0UHJvbWlzY3VvdXNNb2RlKSkgeworCQlpZiAoaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUnhPa0luUGVyaW9kID4gMTAwIHx8CisJCWllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVR4T2tJblBlcmlvZCA+IDEwMCkKKwkJCWJCdXN5VHJhZmZpYyA9IHRydWU7CisKKworCQlpZiAoaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUnhPa0luUGVyaW9kID4gNDAwMCB8fAorCQkgICAgaWVlZS0+TGlua0RldGVjdEluZm8uTnVtVHhPa0luUGVyaW9kID4gNDAwMCkgeworCQkJYkhpZ2hlckJ1c3lUcmFmZmljID0gdHJ1ZTsKKwkJCWlmIChpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SeE9rSW5QZXJpb2QgPiA1MDAwKQorCQkJCWJIaWdoZXJCdXN5UnhUcmFmZmljID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCQliSGlnaGVyQnVzeVJ4VHJhZmZpYyA9IGZhbHNlOworCQl9CisKKwkJaWYgKCgoaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUnhVbmljYXN0T2tJblBlcmlvZCArCisJCSAgICBpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1UeE9rSW5QZXJpb2QpID4gOCkgfHwKKwkJICAgIChpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SeFVuaWNhc3RPa0luUGVyaW9kID4gMikpCisJCQliRW50ZXJQUyA9IGZhbHNlOworCQllbHNlCisJCQliRW50ZXJQUyA9IHRydWU7CisKKwkJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgPCA5NSkKKwkJCWJFbnRlclBTID0gZmFsc2U7CisKKwkJaWYgKGJFbnRlclBTKQorCQkJTGVpc3VyZVBTRW50ZXIoZGV2KTsKKwkJZWxzZQorCQkJTGVpc3VyZVBTTGVhdmUoZGV2KTsKKworCX0gZWxzZSB7CisJCVJUX1RSQUNFKENPTVBfTFBTLCAiPT09PT5ubyBsaW5rIExQUyBsZWF2ZVxuIik7CisJCUxlaXN1cmVQU0xlYXZlKGRldik7CisJfQorCisJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUnhPa0luUGVyaW9kID0gMDsKKwlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1UeE9rSW5QZXJpb2QgPSAwOworCWllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJ4VW5pY2FzdE9rSW5QZXJpb2QgPSAwOworCWllZWUtPkxpbmtEZXRlY3RJbmZvLmJCdXN5VHJhZmZpYyA9IGJCdXN5VHJhZmZpYzsKKworCWllZWUtPkxpbmtEZXRlY3RJbmZvLmJIaWdoZXJCdXN5VHJhZmZpYyA9IGJIaWdoZXJCdXN5VHJhZmZpYzsKKwlpZWVlLT5MaW5rRGV0ZWN0SW5mby5iSGlnaGVyQnVzeVJ4VHJhZmZpYyA9IGJIaWdoZXJCdXN5UnhUcmFmZmljOworCisJaWYgKGllZWUtPnN0YXRlID09IFJUTExJQl9MSU5LRUQgJiYgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSB7CisJCXUzMglUb3RhbFJ4QmNuTnVtID0gMDsKKwkJdTMyCVRvdGFsUnhEYXRhTnVtID0gMDsKKworCQlydGw4MTl4X3VwZGF0ZV9yeGNvdW50cyhwcml2LCAmVG90YWxSeEJjbk51bSwgJlRvdGFsUnhEYXRhTnVtKTsKKworCQlpZiAoKFRvdGFsUnhCY25OdW0rVG90YWxSeERhdGFOdW0pID09IDApCisJCQlwcml2LT5jaGVja19yb2FtaW5nX2NudCsrOworCQllbHNlCisJCQlwcml2LT5jaGVja19yb2FtaW5nX2NudCA9IDA7CisKKworCQlpZiAocHJpdi0+Y2hlY2tfcm9hbWluZ19jbnQgPiAwKSB7CisJCQlpZiAoaWVlZS0+ZVJGUG93ZXJTdGF0ZSA9PSBlUmZPZmYpCisJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICI9PT09PT09PT4lcygpXG4iLCBfX2Z1bmNfXyk7CisKKwkJCXByaW50ayhLRVJOX0lORk8gIj09PT4lcygpOiBBUCBpcyBwb3dlciBvZmYsIGNoYW46JWQsIgorCQkJICAgICAgICIgY29ubmVjdCBhbm90aGVyIG9uZVxuIiwgX19mdW5jX18sIHByaXYtPmNoYW4pOworCisJCQlpZWVlLT5zdGF0ZSA9IFJUTExJQl9BU1NPQ0lBVElORzsKKworCQkJUmVtb3ZlUGVlclRTKHByaXYtPnJ0bGxpYiwKKwkJCQkgICAgIHByaXYtPnJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLmJzc2lkKTsKKwkJCWllZWUtPmlzX3JvYW1pbmcgPSB0cnVlOworCQkJaWVlZS0+aXNfc2V0X2tleSA9IGZhbHNlOworCQkJaWVlZS0+bGlua19jaGFuZ2UoZGV2KTsKKwkJCWlmIChpZWVlLT5MZWRDb250cm9sSGFuZGxlcikKKwkJCQlpZWVlLT5MZWRDb250cm9sSGFuZGxlcihpZWVlLT5kZXYsCisJCQkJCQkJTEVEX0NUTF9TVEFSVF9UT19MSU5LKTsKKworCQkJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOworCisJCQlpZiAoIShpZWVlLT5ydGxsaWJfYXBfc2VjX3R5cGUoaWVlZSkgJgorCQkJICAgICAoU0VDX0FMR19DQ01QfFNFQ19BTEdfVEtJUCkpKQorCQkJCXF1ZXVlX2RlbGF5ZWRfd29ya19yc2woaWVlZS0+d3EsCisJCQkJCSZpZWVlLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxLCAwKTsKKworCQkJcHJpdi0+Y2hlY2tfcm9hbWluZ19jbnQgPSAwOworCQl9CisJCWllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZCY25JblBlcmlvZCA9IDA7CisJCWllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZEYXRhSW5QZXJpb2QgPSAwOworCisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKKwlpZiAoKGNoZWNrX3Jlc2V0X2NudCsrID49IDMpICYmICghaWVlZS0+aXNfcm9hbWluZykgJiYKKwkgICAgKCFwcml2LT5SRkNoYW5nZUluUHJvZ3Jlc3MpICYmICghcFBTQy0+YlN3UmZQcm9jZXNzaW5nKSkgeworCQlSZXNldFR5cGUgPSBydGw4MTl4X2lmY2hlY2tfcmVzZXRvcm5vdChkZXYpOworCQljaGVja19yZXNldF9jbnQgPSAzOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9sb2NrLCBmbGFncyk7CisKKwlpZiAoIXByaXYtPmJEaXNhYmxlTm9ybWFsUmVzZXRDaGVjayAmJiBSZXNldFR5cGUgPT0gUkVTRVRfVFlQRV9OT1JNQUwpIHsKKwkJcHJpdi0+UmVzZXRQcm9ncmVzcyA9IFJFU0VUX1RZUEVfTk9STUFMOworCQlSVF9UUkFDRShDT01QX1JFU0VULCAiJXMoKTogTk9NQUwgUkVTRVRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgoKHByaXYtPmZvcmNlX3Jlc2V0KSB8fCAoIXByaXYtPmJEaXNhYmxlTm9ybWFsUmVzZXRDaGVjayAmJgorCSAgICAgIFJlc2V0VHlwZSA9PSBSRVNFVF9UWVBFX1NJTEVOVCkpKQorCQlydGw4MTl4X2lmc2lsZW50cmVzZXQoZGV2KTsKKwlwcml2LT5mb3JjZV9yZXNldCA9IGZhbHNlOworCXByaXYtPmJGb3JjZWRTaWxlbnRSZXNldCA9IGZhbHNlOworCXByaXYtPmJSZXNldEluUHJvZ3Jlc3MgPSBmYWxzZTsKKwlSVF9UUkFDRShDT01QX1RSQUNFLCAiIDw9PVJ0VXNiQ2hlY2tGb3JIYW5nV29ya0l0ZW1DYWxsYmFjaygpXG4iKTsKK30KKwordm9pZCB3YXRjaF9kb2dfdGltZXJfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YSk7CisJcXVldWVfZGVsYXllZF93b3JrX3JzbChwcml2LT5wcml2X3dxLCAmcHJpdi0+d2F0Y2hfZG9nX3dxLCAwKTsKKwltb2RfdGltZXIoJnByaXYtPndhdGNoX2RvZ190aW1lciwgamlmZmllcyArCisJCSAgTVNFQ1MoUlRMTElCX1dBVENIX0RPR19USU1FKSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBOSUMgVFgvUlggU1RVRkYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX3J4X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopcnRsbGliX3ByaXYoZGV2KTsKKwlwcml2LT5vcHMtPnJ4X2VuYWJsZShkZXYpOworfQorCit2b2lkIHJ0bDgxOTJfdHhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilydGxsaWJfcHJpdihkZXYpOworCisJcHJpdi0+b3BzLT50eF9lbmFibGUoZGV2KTsKKworCXJ0bGxpYl9yZXNldF9xdWV1ZShwcml2LT5ydGxsaWIpOworfQorCisKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfZnJlZV9yeF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCWludCBpLCByeF9xdWV1ZV9pZHg7CisKKwlmb3IgKHJ4X3F1ZXVlX2lkeCA9IDA7IHJ4X3F1ZXVlX2lkeCA8IE1BWF9SWF9RVUVVRTsKKwkgICAgIHJ4X3F1ZXVlX2lkeCsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBwcml2LT5yeHJpbmdjb3VudDsgaSsrKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJpdi0+cnhfYnVmW3J4X3F1ZXVlX2lkeF1baV07CisJCQlpZiAoIXNrYikKKwkJCQljb250aW51ZTsKKworCQkJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wZGV2LAorCQkJCSooKGRtYV9hZGRyX3QgKilza2ItPmNiKSwKKwkJCQlwcml2LT5yeGJ1ZmZlcnNpemUsIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQkJa2ZyZWVfc2tiKHNrYik7CisJCX0KKworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHByaXYtPnBkZXYsCisJCQlzaXplb2YoKnByaXYtPnJ4X3JpbmdbcnhfcXVldWVfaWR4XSkgKgorCQkJcHJpdi0+cnhyaW5nY291bnQsCisJCQlwcml2LT5yeF9yaW5nW3J4X3F1ZXVlX2lkeF0sCisJCQlwcml2LT5yeF9yaW5nX2RtYVtyeF9xdWV1ZV9pZHhdKTsKKwkJcHJpdi0+cnhfcmluZ1tyeF9xdWV1ZV9pZHhdID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfZnJlZV90eF9yaW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBwcmlvKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcnRsODE5Ml90eF9yaW5nICpyaW5nID0gJnByaXYtPnR4X3JpbmdbcHJpb107CisKKwl3aGlsZSAoc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpKSB7CisJCXN0cnVjdCB0eF9kZXNjICplbnRyeSA9ICZyaW5nLT5kZXNjW3JpbmctPmlkeF07CisJCXN0cnVjdCBza19idWZmICpza2IgPSBfX3NrYl9kZXF1ZXVlKCZyaW5nLT5xdWV1ZSk7CisKKwkJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wZGV2LCBsZTMyX3RvX2NwdShlbnRyeS0+VHhCdWZmQWRkciksCisJCQlza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCWtmcmVlX3NrYihza2IpOworCQlyaW5nLT5pZHggPSAocmluZy0+aWR4ICsgMSkgJSByaW5nLT5lbnRyaWVzOworCX0KKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocHJpdi0+cGRldiwgc2l6ZW9mKCpyaW5nLT5kZXNjKSpyaW5nLT5lbnRyaWVzLAorCXJpbmctPmRlc2MsIHJpbmctPmRtYSk7CisJcmluZy0+ZGVzYyA9IE5VTEw7Cit9CisKK3ZvaWQgcnRsODE5Ml9kYXRhX2hhcmRfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworfQorCisKK3ZvaWQgcnRsODE5Ml9kYXRhX2hhcmRfcmVzdW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7Cit9CisKK3ZvaWQgcnRsODE5Ml9oYXJkX2RhdGFfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIGludCByYXRlKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopcnRsbGliX3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCXN0cnVjdCBjYl9kZXNjICp0Y2JfZGVzYyA9IChzdHJ1Y3QgY2JfZGVzYyAqKShza2ItPmNiICsKKwkJCQkgICAgTUFYX0RFVl9BRERSX1NJWkUpOworCXU4IHF1ZXVlX2luZGV4ID0gdGNiX2Rlc2MtPnF1ZXVlX2luZGV4OworCisJaWYgKChwcml2LT5ydGxsaWItPmVSRlBvd2VyU3RhdGUgPT0gZVJmT2ZmKSB8fCBJU19OSUNfRE9XTihwcml2KSB8fAorCSAgICAgcHJpdi0+YlJlc2V0SW5Qcm9ncmVzcykgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKworCWFzc2VydChxdWV1ZV9pbmRleCAhPSBUWENNRF9RVUVVRSk7CisKKworCW1lbWNweSgodW5zaWduZWQgY2hhciAqKShza2ItPmNiKSwgJmRldiwgc2l6ZW9mKGRldikpOworCXNrYl9wdXNoKHNrYiwgcHJpdi0+cnRsbGliLT50eF9oZWFkcm9vbSk7CisJcmV0ID0gcnRsODE5Ml90eChkZXYsIHNrYik7CisJaWYgKHJldCAhPSAwKSB7CisJCWtmcmVlX3NrYihza2IpOworCX07CisKKwlpZiAocXVldWVfaW5kZXggIT0gTUdOVF9RVUVVRSkgeworCQlwcml2LT5ydGxsaWItPnN0YXRzLnR4X2J5dGVzICs9IChza2ItPmxlbiAtCisJCQkJCQkgcHJpdi0+cnRsbGliLT50eF9oZWFkcm9vbSk7CisJCXByaXYtPnJ0bGxpYi0+c3RhdHMudHhfcGFja2V0cysrOworCX0KKworCisJcmV0dXJuOworfQorCitpbnQgcnRsODE5Ml9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKXJ0bGxpYl9wcml2KGRldik7CisJaW50IHJldDsKKwlzdHJ1Y3QgY2JfZGVzYyAqdGNiX2Rlc2MgPSAoc3RydWN0IGNiX2Rlc2MgKikoc2tiLT5jYiArCisJCQkJICAgIE1BWF9ERVZfQUREUl9TSVpFKTsKKwl1OCBxdWV1ZV9pbmRleCA9IHRjYl9kZXNjLT5xdWV1ZV9pbmRleDsKKworCWlmIChxdWV1ZV9pbmRleCAhPSBUWENNRF9RVUVVRSkgeworCQlpZiAoKHByaXYtPnJ0bGxpYi0+ZVJGUG93ZXJTdGF0ZSA9PSBlUmZPZmYpIHx8CisJCSAgICAgSVNfTklDX0RPV04ocHJpdikgfHwgcHJpdi0+YlJlc2V0SW5Qcm9ncmVzcykgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCW1lbWNweSgodW5zaWduZWQgY2hhciAqKShza2ItPmNiKSwgJmRldiwgc2l6ZW9mKGRldikpOworCWlmIChxdWV1ZV9pbmRleCA9PSBUWENNRF9RVUVVRSkgeworCQlydGw4MTkyX3R4X2NtZChkZXYsIHNrYik7CisJCXJldCA9IDA7CisJCXJldHVybiByZXQ7CisJfSBlbHNlIHsKKwkJdGNiX2Rlc2MtPlJBVFJJbmRleCA9IDc7CisJCXRjYl9kZXNjLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrID0gMTsKKwkJdGNiX2Rlc2MtPmJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZSA9IDE7CisJCXRjYl9kZXNjLT5iVHhFbmFibGVGd0NhbGNEdXIgPSAxOworCQlza2JfcHVzaChza2IsIHByaXYtPnJ0bGxpYi0+dHhfaGVhZHJvb20pOworCQlyZXQgPSBydGw4MTkyX3R4KGRldiwgc2tiKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlrZnJlZV9za2Ioc2tiKTsKKwkJfTsKKwl9CisKKworCisJcmV0dXJuIHJldDsKKworfQorCitzdGF0aWMgdm9pZCBydGw4MTkyX3R4X2lzcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcHJpbykKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKXJ0bGxpYl9wcml2KGRldik7CisKKwlzdHJ1Y3QgcnRsODE5Ml90eF9yaW5nICpyaW5nID0gJnByaXYtPnR4X3JpbmdbcHJpb107CisKKwl3aGlsZSAoc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpKSB7CisJCXN0cnVjdCB0eF9kZXNjICplbnRyeSA9ICZyaW5nLT5kZXNjW3JpbmctPmlkeF07CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJaWYgKHByaW8gIT0gQkVBQ09OX1FVRVVFKSB7CisJCQlpZiAoZW50cnktPk9XTikKKwkJCQlyZXR1cm47CisJCQlyaW5nLT5pZHggPSAocmluZy0+aWR4ICsgMSkgJSByaW5nLT5lbnRyaWVzOworCQl9CisKKwkJc2tiID0gX19za2JfZGVxdWV1ZSgmcmluZy0+cXVldWUpOworCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsIGxlMzJfdG9fY3B1KGVudHJ5LT5UeEJ1ZmZBZGRyKSwKKwkJc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJCWtmcmVlX3NrYihza2IpOworCX0KKwlpZiAocHJpbyAhPSBCRUFDT05fUVVFVUUpCisJCXRhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmlycV90eF90YXNrbGV0KTsKK30KKwordm9pZCBydGw4MTkyX3R4X2NtZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcnRsODE5Ml90eF9yaW5nICpyaW5nOworCXN0cnVjdCB0eF9kZXNjX2NtZCAqZW50cnk7CisJdW5zaWduZWQgaW50IGlkeDsKKwlzdHJ1Y3QgY2JfZGVzYyAqdGNiX2Rlc2M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5pcnFfdGhfbG9jaywgZmxhZ3MpOworCXJpbmcgPSAmcHJpdi0+dHhfcmluZ1tUWENNRF9RVUVVRV07CisKKwlpZHggPSAocmluZy0+aWR4ICsgc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpKSAlIHJpbmctPmVudHJpZXM7CisJZW50cnkgPSAoc3RydWN0IHR4X2Rlc2NfY21kICopICZyaW5nLT5kZXNjW2lkeF07CisKKwl0Y2JfZGVzYyA9IChzdHJ1Y3QgY2JfZGVzYyAqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCisJcHJpdi0+b3BzLT50eF9maWxsX2NtZF9kZXNjcmlwdG9yKGRldiwgZW50cnksIHRjYl9kZXNjLCBza2IpOworCisJX19za2JfcXVldWVfdGFpbCgmcmluZy0+cXVldWUsIHNrYik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxX3RoX2xvY2ssIGZsYWdzKTsKKworCXJldHVybjsKK30KKworc2hvcnQgcnRsODE5Ml90eChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcnRsODE5Ml90eF9yaW5nICAqcmluZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBjYl9kZXNjICp0Y2JfZGVzYyA9IChzdHJ1Y3QgY2JfZGVzYyAqKShza2ItPmNiICsKKwkJCQkgICAgTUFYX0RFVl9BRERSX1NJWkUpOworCXN0cnVjdCB0eF9kZXNjICpwZGVzYyA9IE5VTEw7CisJc3RydWN0IHJ0bGxpYl9oZHJfMWFkZHIgKmhlYWRlciA9IE5VTEw7CisJdTE2IGZjID0gMCwgdHlwZSA9IDAsIHN0eXBlID0gMDsKKwlib29sICBtdWx0aV9hZGRyID0gZmFsc2UsIGJyb2FkX2FkZHIgPSBmYWxzZSwgdW5pX2FkZHIgPSBmYWxzZTsKKwl1OCAqcGRhX2FkZHIgPSBOVUxMOworCWludCAgIGlkeDsKKwl1MzIgZndpbmZvX3NpemUgPSAwOworCisJaWYgKHByaXYtPmJkaXNhYmxlX25pYykgeworCQlSVF9UUkFDRShDT01QX0VSUiwgIiVzOiBFUlIhISBOaWMgaXMgZGlzYWJsZWQhIENhbid0IHR4IHBhY2tldCIKKwkJCSAiIGxlbj0lZCBxaWR4PSVkISEhXG4iLCBfX2Z1bmNfXywgc2tiLT5sZW4sCisJCQkgdGNiX2Rlc2MtPnF1ZXVlX2luZGV4KTsKKwkJcmV0dXJuIHNrYi0+bGVuOworCX0KKworCXByaXYtPnJ0bGxpYi0+YkF3YWtlUGt0U2VudCA9IHRydWU7CisKKwlmd2luZm9fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdHhfZndpbmZvXzgxOTBwY2kpOworCisJaGVhZGVyID0gKHN0cnVjdCBydGxsaWJfaGRyXzFhZGRyICopKCgodTggKilza2ItPmRhdGEpICsgZndpbmZvX3NpemUpOworCWZjID0gaGVhZGVyLT5mcmFtZV9jdGw7CisJdHlwZSA9IFdMQU5fRkNfR0VUX1RZUEUoZmMpOworCXN0eXBlID0gV0xBTl9GQ19HRVRfU1RZUEUoZmMpOworCXBkYV9hZGRyID0gaGVhZGVyLT5hZGRyMTsKKworCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwZGFfYWRkcikpCisJCW11bHRpX2FkZHIgPSB0cnVlOworCWVsc2UgaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKHBkYV9hZGRyKSkKKwkJYnJvYWRfYWRkciA9IHRydWU7CisJZWxzZQorCQl1bmlfYWRkciA9IHRydWU7CisKKwlpZiAodW5pX2FkZHIpCisJCXByaXYtPnN0YXRzLnR4Ynl0ZXN1bmljYXN0ICs9IHNrYi0+bGVuIC0gZndpbmZvX3NpemU7CisJZWxzZSBpZiAobXVsdGlfYWRkcikKKwkJcHJpdi0+c3RhdHMudHhieXRlc211bHRpY2FzdCArPSBza2ItPmxlbiAtIGZ3aW5mb19zaXplOworCWVsc2UKKwkJcHJpdi0+c3RhdHMudHhieXRlc2Jyb2FkY2FzdCArPSBza2ItPmxlbiAtIGZ3aW5mb19zaXplOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmlycV90aF9sb2NrLCBmbGFncyk7CisJcmluZyA9ICZwcml2LT50eF9yaW5nW3RjYl9kZXNjLT5xdWV1ZV9pbmRleF07CisJaWYgKHRjYl9kZXNjLT5xdWV1ZV9pbmRleCAhPSBCRUFDT05fUVVFVUUpCisJCWlkeCA9IChyaW5nLT5pZHggKyBza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSkpICUgcmluZy0+ZW50cmllczsKKwllbHNlCisJCWlkeCA9IDA7CisKKwlwZGVzYyA9ICZyaW5nLT5kZXNjW2lkeF07CisJaWYgKChwZGVzYy0+T1dOID09IDEpICYmICh0Y2JfZGVzYy0+cXVldWVfaW5kZXggIT0gQkVBQ09OX1FVRVVFKSkgeworCQlSVF9UUkFDRShDT01QX0VSUiwgIk5vIG1vcmUgVFggZGVzY0AlZCwgcmluZy0+aWR4ID0gJWQsIGlkeCA9ICIKKwkJCSAiJWQsIHNrYmxlbiA9IDB4JXggcXVldWVsZW49JWQiLAorCQkJIHRjYl9kZXNjLT5xdWV1ZV9pbmRleCwgcmluZy0+aWR4LCBpZHgsIHNrYi0+bGVuLAorCQkJIHNrYl9xdWV1ZV9sZW4oJnJpbmctPnF1ZXVlKSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycV90aF9sb2NrLCBmbGFncyk7CisJCXJldHVybiBza2ItPmxlbjsKKwl9CisKKwlpZiAodHlwZSA9PSBSVExMSUJfRlRZUEVfREFUQSkgeworCQlpZiAocHJpdi0+cnRsbGliLT5MZWRDb250cm9sSGFuZGxlcikKKwkJCXByaXYtPnJ0bGxpYi0+TGVkQ29udHJvbEhhbmRsZXIoZGV2LCBMRURfQ1RMX1RYKTsKKwl9CisJcHJpdi0+b3BzLT50eF9maWxsX2Rlc2NyaXB0b3IoZGV2LCBwZGVzYywgdGNiX2Rlc2MsIHNrYik7CisJX19za2JfcXVldWVfdGFpbCgmcmluZy0+cXVldWUsIHNrYik7CisJcGRlc2MtPk9XTiA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxX3RoX2xvY2ssIGZsYWdzKTsKKwlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCXdyaXRlX25pY193b3JkKGRldiwgVFBQb2xsLCAweDAxIDw8IHRjYl9kZXNjLT5xdWV1ZV9pbmRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzaG9ydCBydGw4MTkyX2FsbG9jX3J4X2Rlc2NfcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcnhfZGVzYyAqZW50cnkgPSBOVUxMOworCWludCBpLCByeF9xdWV1ZV9pZHg7CisKKwlmb3IgKHJ4X3F1ZXVlX2lkeCA9IDA7IHJ4X3F1ZXVlX2lkeCA8IE1BWF9SWF9RVUVVRTsgcnhfcXVldWVfaWR4KyspIHsKKwkJcHJpdi0+cnhfcmluZ1tyeF9xdWV1ZV9pZHhdID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocHJpdi0+cGRldiwKKwkJCQkJc2l6ZW9mKCpwcml2LT5yeF9yaW5nW3J4X3F1ZXVlX2lkeF0pICoKKwkJCQkJcHJpdi0+cnhyaW5nY291bnQsCisJCQkJCSZwcml2LT5yeF9yaW5nX2RtYVtyeF9xdWV1ZV9pZHhdKTsKKworCQlpZiAoIXByaXYtPnJ4X3JpbmdbcnhfcXVldWVfaWR4XSB8fAorCQkgICAgKHVuc2lnbmVkIGxvbmcpcHJpdi0+cnhfcmluZ1tyeF9xdWV1ZV9pZHhdICYgMHhGRikgeworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJDYW5ub3QgYWxsb2NhdGUgUlggcmluZ1xuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCW1lbXNldChwcml2LT5yeF9yaW5nW3J4X3F1ZXVlX2lkeF0sIDAsCisJCSAgICAgICBzaXplb2YoKnByaXYtPnJ4X3JpbmdbcnhfcXVldWVfaWR4XSkgKgorCQkgICAgICAgcHJpdi0+cnhyaW5nY291bnQpOworCQlwcml2LT5yeF9pZHhbcnhfcXVldWVfaWR4XSA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IHByaXYtPnJ4cmluZ2NvdW50OyBpKyspIHsKKwkJCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKHByaXYtPnJ4YnVmZmVyc2l6ZSk7CisJCQlkbWFfYWRkcl90ICptYXBwaW5nOworCQkJZW50cnkgPSAmcHJpdi0+cnhfcmluZ1tyeF9xdWV1ZV9pZHhdW2ldOworCQkJaWYgKCFza2IpCisJCQkJcmV0dXJuIDA7CisJCQlza2ItPmRldiA9IGRldjsKKwkJCXByaXYtPnJ4X2J1ZltyeF9xdWV1ZV9pZHhdW2ldID0gc2tiOworCQkJbWFwcGluZyA9IChkbWFfYWRkcl90ICopc2tiLT5jYjsKKwkJCSptYXBwaW5nID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGRldiwKKwkJCQkJCSAgc2tiX3RhaWxfcG9pbnRlcl9yc2woc2tiKSwKKwkJCQkJCSAgcHJpdi0+cnhidWZmZXJzaXplLAorCQkJCQkJICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQllbnRyeS0+QnVmZmVyQWRkcmVzcyA9IGNwdV90b19sZTMyKCptYXBwaW5nKTsKKworCQkJZW50cnktPkxlbmd0aCA9IHByaXYtPnJ4YnVmZmVyc2l6ZTsKKwkJCWVudHJ5LT5PV04gPSAxOworCQl9CisKKwkJaWYoZW50cnkpCisJCQllbnRyeS0+RU9SID0gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRsODE5Ml9hbGxvY190eF9kZXNjX3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwl1bnNpZ25lZCBpbnQgcHJpbywgdW5zaWduZWQgaW50IGVudHJpZXMpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilydGxsaWJfcHJpdihkZXYpOworCXN0cnVjdCB0eF9kZXNjICpyaW5nOworCWRtYV9hZGRyX3QgZG1hOworCWludCBpOworCisJcmluZyA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHByaXYtPnBkZXYsIHNpemVvZigqcmluZykgKiBlbnRyaWVzLCAmZG1hKTsKKwlpZiAoIXJpbmcgfHwgKHVuc2lnbmVkIGxvbmcpcmluZyAmIDB4RkYpIHsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJDYW5ub3QgYWxsb2NhdGUgVFggcmluZyAocHJpbyA9ICVkKVxuIiwKKwkJCSBwcmlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KHJpbmcsIDAsIHNpemVvZigqcmluZykqZW50cmllcyk7CisJcHJpdi0+dHhfcmluZ1twcmlvXS5kZXNjID0gcmluZzsKKwlwcml2LT50eF9yaW5nW3ByaW9dLmRtYSA9IGRtYTsKKwlwcml2LT50eF9yaW5nW3ByaW9dLmlkeCA9IDA7CisJcHJpdi0+dHhfcmluZ1twcmlvXS5lbnRyaWVzID0gZW50cmllczsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZwcml2LT50eF9yaW5nW3ByaW9dLnF1ZXVlKTsKKworCWZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspCisJCXJpbmdbaV0uTmV4dERlc2NBZGRyZXNzID0KKwkJCWNwdV90b19sZTMyKCh1MzIpZG1hICsgKChpICsgMSkgJSBlbnRyaWVzKSAqCisJCQlzaXplb2YoKnJpbmcpKTsKKworCXJldHVybiAwOworfQorCisKK3Nob3J0IHJ0bDgxOTJfcGNpX2luaXRkZXNjcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXUzMiByZXQ7CisJaW50IGk7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJcmV0ID0gcnRsODE5Ml9hbGxvY19yeF9kZXNjX3JpbmcoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IE1BWF9UWF9RVUVVRV9DT1VOVDsgaSsrKSB7CisJCXJldCA9IHJ0bDgxOTJfYWxsb2NfdHhfZGVzY19yaW5nKGRldiwgaSwgcHJpdi0+dHhyaW5nY291bnQpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfZnJlZV9yaW5nczsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfcmluZ3M6CisJcnRsODE5Ml9mcmVlX3J4X3JpbmcoZGV2KTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1RYX1FVRVVFX0NPVU5UOyBpKyspCisJCWlmIChwcml2LT50eF9yaW5nW2ldLmRlc2MpCisJCQlydGw4MTkyX2ZyZWVfdHhfcmluZyhkZXYsIGkpOworCXJldHVybiAxOworfQorCit2b2lkIHJ0bDgxOTJfcGNpX3Jlc2V0ZGVzY3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJaW50IGksIHJ4X3F1ZXVlX2lkeDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKworCWZvciAocnhfcXVldWVfaWR4ID0gMDsgcnhfcXVldWVfaWR4IDwgTUFYX1JYX1FVRVVFOyByeF9xdWV1ZV9pZHgrKykgeworCQlpZiAocHJpdi0+cnhfcmluZ1tyeF9xdWV1ZV9pZHhdKSB7CisJCQlzdHJ1Y3QgcnhfZGVzYyAqZW50cnkgPSBOVUxMOworCQkJZm9yIChpID0gMDsgaSA8IHByaXYtPnJ4cmluZ2NvdW50OyBpKyspIHsKKwkJCQllbnRyeSA9ICZwcml2LT5yeF9yaW5nW3J4X3F1ZXVlX2lkeF1baV07CisJCQkJZW50cnktPk9XTiA9IDE7CisJCQl9CisJCQlwcml2LT5yeF9pZHhbcnhfcXVldWVfaWR4XSA9IDA7CisJCX0KKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aXJxX3RoX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1RYX1FVRVVFX0NPVU5UOyBpKyspIHsKKwkJaWYgKHByaXYtPnR4X3JpbmdbaV0uZGVzYykgeworCQkJc3RydWN0IHJ0bDgxOTJfdHhfcmluZyAqcmluZyA9ICZwcml2LT50eF9yaW5nW2ldOworCisJCQl3aGlsZSAoc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpKSB7CisJCQkJc3RydWN0IHR4X2Rlc2MgKmVudHJ5ID0gJnJpbmctPmRlc2NbcmluZy0+aWR4XTsKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0KKwkJCQkJCSBfX3NrYl9kZXF1ZXVlKCZyaW5nLT5xdWV1ZSk7CisKKwkJCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsCisJCQkJCQkgbGUzMl90b19jcHUoZW50cnktPlR4QnVmZkFkZHIpLAorCQkJCQkJIHNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCQlrZnJlZV9za2Ioc2tiKTsKKwkJCQlyaW5nLT5pZHggPSAocmluZy0+aWR4ICsgMSkgJSByaW5nLT5lbnRyaWVzOworCQkJfQorCQkJcmluZy0+aWR4ID0gMDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFfdGhfbG9jaywgZmxhZ3MpOworfQorCit2b2lkIHJ0bDgxOXhfVXBkYXRlUnhQa3RUaW1lU3RhbXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKnN0YXRzKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopcnRsbGliX3ByaXYoZGV2KTsKKworCWlmIChzdGF0cy0+YklzQU1QRFUgJiYgIXN0YXRzLT5iRmlyc3RNUERVKQorCQlzdGF0cy0+bWFjX3RpbWUgPSBwcml2LT5MYXN0UnhEZXNjVFNGOworCWVsc2UKKwkJcHJpdi0+TGFzdFJ4RGVzY1RTRiA9IHN0YXRzLT5tYWNfdGltZTsKK30KKworbG9uZyBydGw4MTl4X3RyYW5zbGF0ZV90b2RibShzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwgdTggc2lnbmFsX3N0cmVuZ3RoX2luZGV4KQoreworCWxvbmcJc2lnbmFsX3Bvd2VyOworCisJc2lnbmFsX3Bvd2VyID0gKGxvbmcpKChzaWduYWxfc3RyZW5ndGhfaW5kZXggKyAxKSA+PiAxKTsKKwlzaWduYWxfcG93ZXIgLT0gOTU7CisKKwlyZXR1cm4gc2lnbmFsX3Bvd2VyOworfQorCisKK3ZvaWQKK3J0bDgxOXhfdXBkYXRlX3J4c2lnbmFsc3RhdGlzdGljczgxOTBwY2koCisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsCisJc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqcHByZXZpb3VzX3N0YXRzCisJKQoreworCWludCB3ZWlnaHRpbmcgPSAwOworCisKKwlpZiAocHJpdi0+c3RhdHMucmVjdl9zaWduYWxfcG93ZXIgPT0gMCkKKwkJcHJpdi0+c3RhdHMucmVjdl9zaWduYWxfcG93ZXIgPQorCQkJCQkgcHByZXZpb3VzX3N0YXRzLT5SZWN2U2lnbmFsUG93ZXI7CisKKwlpZiAocHByZXZpb3VzX3N0YXRzLT5SZWN2U2lnbmFsUG93ZXIgPiBwcml2LT5zdGF0cy5yZWN2X3NpZ25hbF9wb3dlcikKKwkJd2VpZ2h0aW5nID0gNTsKKwllbHNlIGlmIChwcHJldmlvdXNfc3RhdHMtPlJlY3ZTaWduYWxQb3dlciA8CisJCSBwcml2LT5zdGF0cy5yZWN2X3NpZ25hbF9wb3dlcikKKwkJd2VpZ2h0aW5nID0gKC01KTsKKwlwcml2LT5zdGF0cy5yZWN2X3NpZ25hbF9wb3dlciA9IChwcml2LT5zdGF0cy5yZWN2X3NpZ25hbF9wb3dlciAqIDUgKworCQkJCQlwcHJldmlvdXNfc3RhdHMtPlJlY3ZTaWduYWxQb3dlciArCisJCQkJCXdlaWdodGluZykgLyA2OworfQorCit2b2lkIHJ0bDgxOXhfcHJvY2Vzc19jY2tfcnhwYXRoc2VsKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LAorCQkJCSAgIHN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKnBwcmV2aW91c19zdGF0cykKK3sKK30KKworCit1OCBydGw4MTl4X3F1ZXJ5X3J4cHdycGVyY2VudGFnZShjaGFyIGFudHBvd2VyKQoreworCWlmICgoYW50cG93ZXIgPD0gLTEwMCkgfHwgKGFudHBvd2VyID49IDIwKSkKKwkJcmV0dXJuCTA7CisJZWxzZSBpZiAoYW50cG93ZXIgPj0gMCkKKwkJcmV0dXJuCTEwMDsKKwllbHNlCisJCXJldHVybgkxMDAgKyBhbnRwb3dlcjsKKworfQkvKiBRdWVyeVJ4UHdyUGVyY2VudGFnZSAqLworCit1OAorcnRsODE5eF9ldm1fZGJ0b3BlcmNlbnRhZ2UoCisJY2hhciB2YWx1ZQorCSkKK3sKKwljaGFyIHJldF92YWw7CisKKwlyZXRfdmFsID0gdmFsdWU7CisKKwlpZiAocmV0X3ZhbCA+PSAwKQorCQlyZXRfdmFsID0gMDsKKwlpZiAocmV0X3ZhbCA8PSAtMzMpCisJCXJldF92YWwgPSAtMzM7CisJcmV0X3ZhbCA9IDAgLSByZXRfdmFsOworCXJldF92YWwgKj0gMzsKKwlpZiAocmV0X3ZhbCA9PSA5OSkKKwkJcmV0X3ZhbCA9IDEwMDsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKwordm9pZAorcnRsODE5Ml9yZWNvcmRfcnhkZXNjX2ZvcmxhdGVydXNlKAorCXN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKnBzcmNfc3RhdHMsCisJc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqcHRhcmdldF9zdGF0cworKQoreworCXB0YXJnZXRfc3RhdHMtPmJJc0FNUERVID0gcHNyY19zdGF0cy0+YklzQU1QRFU7CisJcHRhcmdldF9zdGF0cy0+YkZpcnN0TVBEVSA9IHBzcmNfc3RhdHMtPmJGaXJzdE1QRFU7Cit9CisKKworCitzdGF0aWMgdm9pZCBydGw4MTkyX3J4X25vcm1hbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopcnRsbGliX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcnRsbGliX2hkcl8xYWRkciAqcnRsbGliX2hkciA9IE5VTEw7CisJYm9vbCB1bmljYXN0X3BhY2tldCA9IGZhbHNlOworCWJvb2wgYkxlZEJsaW5raW5nID0gdHJ1ZTsKKwl1MTYgZmMgPSAwLCB0eXBlID0gMDsKKwl1MzIgc2tiX2xlbiA9IDA7CisJaW50IHJ4X3F1ZXVlX2lkeCA9IFJYX01QRFVfUVVFVUU7CisKKwlzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzIHN0YXRzID0geworCQkuc2lnbmFsID0gMCwKKwkJLm5vaXNlID0gLTk4LAorCQkucmF0ZSA9IDAsCisJCS5mcmVxID0gUlRMTElCXzI0R0haX0JBTkQsCisJfTsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSBwcml2LT5yeHJpbmdjb3VudDsKKworCXN0YXRzLm5pY190eXBlID0gTklDXzgxOTJFOworCisJd2hpbGUgKGNvdW50LS0pIHsKKwkJc3RydWN0IHJ4X2Rlc2MgKnBkZXNjID0gJnByaXYtPnJ4X3JpbmdbcnhfcXVldWVfaWR4XQorCQkJCQlbcHJpdi0+cnhfaWR4W3J4X3F1ZXVlX2lkeF1dOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJpdi0+cnhfYnVmW3J4X3F1ZXVlX2lkeF0KKwkJCQkgICAgICBbcHJpdi0+cnhfaWR4W3J4X3F1ZXVlX2lkeF1dOworCisJCWlmIChwZGVzYy0+T1dOKSB7CisJCQlyZXR1cm47CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYjsKKworCQkJaWYgKCFwcml2LT5vcHMtPnJ4X3F1ZXJ5X3N0YXR1c19kZXNjcmlwdG9yKGRldiwgJnN0YXRzLAorCQkJcGRlc2MsIHNrYikpCisJCQkJZ290byBkb25lOworCQkJbmV3X3NrYiA9IGRldl9hbGxvY19za2IocHJpdi0+cnhidWZmZXJzaXplKTsKKwkJCS8qIGlmIGFsbG9jYXRpb24gb2YgbmV3IHNrYiBmYWlsZWQgLSBkcm9wIGN1cnJlbnQgcGFja2V0CisJCQkqIGFuZCByZXVzZSBza2IgKi8KKwkJCWlmICh1bmxpa2VseSghbmV3X3NrYikpCisJCQkJZ290byBkb25lOworCisJCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsCisJCQkJCSooKGRtYV9hZGRyX3QgKilza2ItPmNiKSwKKwkJCQkJcHJpdi0+cnhidWZmZXJzaXplLAorCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCQlza2JfcHV0KHNrYiwgcGRlc2MtPkxlbmd0aCk7CisJCQlza2JfcmVzZXJ2ZShza2IsIHN0YXRzLlJ4RHJ2SW5mb1NpemUgKworCQkJCXN0YXRzLlJ4QnVmU2hpZnQpOworCQkJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDQvKnNDcmNMbmcqLyk7CisJCQlydGxsaWJfaGRyID0gKHN0cnVjdCBydGxsaWJfaGRyXzFhZGRyICopc2tiLT5kYXRhOworCQkJaWYgKCFpc19icm9hZGNhc3RfZXRoZXJfYWRkcihydGxsaWJfaGRyLT5hZGRyMSkgJiYKKwkJCSFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihydGxsaWJfaGRyLT5hZGRyMSkpIHsKKwkJCQkvKiB1bmljYXN0IHBhY2tldCAqLworCQkJCXVuaWNhc3RfcGFja2V0ID0gdHJ1ZTsKKwkJCX0KKwkJCWZjID0gbGUxNl90b19jcHUocnRsbGliX2hkci0+ZnJhbWVfY3RsKTsKKwkJCXR5cGUgPSBXTEFOX0ZDX0dFVF9UWVBFKGZjKTsKKwkJCWlmICh0eXBlID09IFJUTExJQl9GVFlQRV9NR01UKQorCQkJCWJMZWRCbGlua2luZyA9IGZhbHNlOworCisJCQlpZiAoYkxlZEJsaW5raW5nKQorCQkJCWlmIChwcml2LT5ydGxsaWItPkxlZENvbnRyb2xIYW5kbGVyKQorCQkJCQlwcml2LT5ydGxsaWItPkxlZENvbnRyb2xIYW5kbGVyKGRldiwKKwkJCQkJCQkJTEVEX0NUTF9SWCk7CisKKwkJCWlmIChzdGF0cy5iQ1JDKSB7CisJCQkJaWYgKHR5cGUgIT0gUlRMTElCX0ZUWVBFX01HTVQpCisJCQkJCXByaXYtPnN0YXRzLnJ4ZGF0YWNyY2VycisrOworCQkJCWVsc2UKKwkJCQkJcHJpdi0+c3RhdHMucnhtZ210Y3JjZXJyKys7CisJCQl9CisKKwkJCXNrYl9sZW4gPSBza2ItPmxlbjsKKworCQkJaWYgKCFydGxsaWJfcngocHJpdi0+cnRsbGliLCBza2IsICZzdGF0cykpIHsKKwkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJfSBlbHNlIHsKKwkJCQlwcml2LT5zdGF0cy5yeG9rKys7CisJCQkJaWYgKHVuaWNhc3RfcGFja2V0KQorCQkJCQlwcml2LT5zdGF0cy5yeGJ5dGVzdW5pY2FzdCArPSBza2JfbGVuOworCQkJfQorCisJCQlza2IgPSBuZXdfc2tiOworCQkJc2tiLT5kZXYgPSBkZXY7CisKKwkJCXByaXYtPnJ4X2J1ZltyeF9xdWV1ZV9pZHhdW3ByaXYtPnJ4X2lkeFtyeF9xdWV1ZV9pZHhdXSA9CisJCQkJCQkJCQkgc2tiOworCQkJKigoZG1hX2FkZHJfdCAqKSBza2ItPmNiKSA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYsCisJCQkJCQkgICAgc2tiX3RhaWxfcG9pbnRlcl9yc2woc2tiKSwKKwkJCQkJCSAgICBwcml2LT5yeGJ1ZmZlcnNpemUsCisJCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKworCQl9Citkb25lOgorCQlwZGVzYy0+QnVmZmVyQWRkcmVzcyA9IGNwdV90b19sZTMyKCooKGRtYV9hZGRyX3QgKilza2ItPmNiKSk7CisJCXBkZXNjLT5PV04gPSAxOworCQlwZGVzYy0+TGVuZ3RoID0gcHJpdi0+cnhidWZmZXJzaXplOworCQlpZiAocHJpdi0+cnhfaWR4W3J4X3F1ZXVlX2lkeF0gPT0gcHJpdi0+cnhyaW5nY291bnQtMSkKKwkJCXBkZXNjLT5FT1IgPSAxOworCQlwcml2LT5yeF9pZHhbcnhfcXVldWVfaWR4XSA9IChwcml2LT5yeF9pZHhbcnhfcXVldWVfaWR4XSArIDEpICUKKwkJCQkJICAgICAgcHJpdi0+cnhyaW5nY291bnQ7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfcnhfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7Cit9CisKKworc3RhdGljIHZvaWQgcnRsODE5Ml90eF9yZXN1bWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKXJ0bGxpYl9wcml2KGRldik7CisJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUgPSBwcml2LT5ydGxsaWI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgcXVldWVfaW5kZXg7CisKKwlmb3IgKHF1ZXVlX2luZGV4ID0gQktfUVVFVUU7CisJICAgICBxdWV1ZV9pbmRleCA8IE1BWF9RVUVVRV9TSVpFOyBxdWV1ZV9pbmRleCsrKSB7CisJCXdoaWxlICgoIXNrYl9xdWV1ZV9lbXB0eSgmaWVlZS0+c2tiX3dhaXRRW3F1ZXVlX2luZGV4XSkpICYmCisJCShwcml2LT5ydGxsaWItPmNoZWNrX25pY19lbm91Z2hfZGVzYyhkZXYsIHF1ZXVlX2luZGV4KSA+IDApKSB7CisJCQlza2IgPSBza2JfZGVxdWV1ZSgmaWVlZS0+c2tiX3dhaXRRW3F1ZXVlX2luZGV4XSk7CisJCQlpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KHNrYiwgZGV2LCAwKTsKKwkJfQorCX0KK30KKwordm9pZCBydGw4MTkyX2lycV90eF90YXNrbGV0KHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQoreworCXJ0bDgxOTJfdHhfcmVzdW1lKHByaXYtPnJ0bGxpYi0+ZGV2KTsKK30KKwordm9pZCBydGw4MTkyX2lycV9yeF90YXNrbGV0KHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQoreworCXJ0bDgxOTJfcnhfbm9ybWFsKHByaXYtPnJ0bGxpYi0+ZGV2KTsKKworCWlmIChNQVhfUlhfUVVFVUUgPiAxKQorCQlydGw4MTkyX3J4X2NtZChwcml2LT5ydGxsaWItPmRldik7CisKKwl3cml0ZV9uaWNfZHdvcmQocHJpdi0+cnRsbGliLT5kZXYsIElOVEFfTUFTSywKKwkJCXJlYWRfbmljX2R3b3JkKHByaXYtPnJ0bGxpYi0+ZGV2LCBJTlRBX01BU0spIHwgSU1SX1JEVSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBOSUMgU1RBUlQvQ0xPU0UgU1RVRkYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBydGw4MTkyX2NhbmNlbF9kZWZlcnJlZF93b3JrKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQoreworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPndhdGNoX2RvZ193cSk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+dXBkYXRlX2JlYWNvbl93cSk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+cnRsbGliLT5od19zbGVlcF93cSk7CisJY2FuY2VsX3dvcmtfc3luYygmcHJpdi0+cmVzZXRfd3EpOworCWNhbmNlbF93b3JrX3N5bmMoJnByaXYtPnFvc19hY3RpdmF0ZSk7Cit9CisKK2ludCBfcnRsODE5Ml91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBib29sIGlzX3NpbGVudF9yZXNldCkKK3sKKwlpZiAoX3J0bDgxOTJfc3RhX3VwKGRldiwgaXNfc2lsZW50X3Jlc2V0KSA9PSAtMSkKKwkJcmV0dXJuIC0xOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcnRsODE5Ml9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCWludCByZXQ7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCXJldCA9IHJ0bDgxOTJfdXAoZGV2KTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworCit9CisKKworaW50IHJ0bDgxOTJfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisKKwlpZiAocHJpdi0+dXAgPT0gMSkKKwkJcmV0dXJuIC0xOworCXJldHVybiBfcnRsODE5Ml91cChkZXYsIGZhbHNlKTsKK30KKworCitzdGF0aWMgaW50IHJ0bDgxOTJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJaW50IHJldDsKKworCWlmICgocnRsbGliX2FjdF9zY2FubmluZyhwcml2LT5ydGxsaWIsIGZhbHNlKSkgJiYKKwkJIShwcml2LT5ydGxsaWItPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0NBTikpIHsKKwkJcnRsbGliX3N0b3Bfc2Nhbihwcml2LT5ydGxsaWIpOworCX0KKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlyZXQgPSBydGw4MTkyX2Rvd24oZGV2LCB0cnVlKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKKworfQorCitpbnQgcnRsODE5Ml9kb3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGJvb2wgc2h1dGRvd25yZikKK3sKKwlpZiAocnRsODE5Ml9zdGFfZG93bihkZXYsIHNodXRkb3ducmYpID09IC0xKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBydGw4MTkyX2NvbW1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCWlmIChwcml2LT51cCA9PSAwKQorCQlyZXR1cm47CisJcnRsbGliX3NvZnRtYWNfc3RvcF9wcm90b2NvbChwcml2LT5ydGxsaWIsIDAgLCB0cnVlKTsKKwlydGw4MTkyX2lycV9kaXNhYmxlKGRldik7CisJcHJpdi0+b3BzLT5zdG9wX2FkYXB0ZXIoZGV2LCB0cnVlKTsKKwlfcnRsODE5Ml91cChkZXYsIGZhbHNlKTsKK30KKwordm9pZCBydGw4MTkyX3Jlc3RhcnQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZl93b3JrX3JzbChkYXRhLCBzdHJ1Y3QgcjgxOTJfcHJpdiwKKwkJCQkgIHJlc2V0X3dxKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+cnRsbGliLT5kZXY7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcnRsODE5Ml9jb21taXQoZGV2KTsKKworCXVwKCZwcml2LT53eF9zZW0pOworfQorCitzdGF0aWMgdm9pZCByODE5Ml9zZXRfbXVsdGljYXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXNob3J0IHByb21pc2M7CisKKwlwcm9taXNjID0gKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgPyAxIDogMDsKKwlwcml2LT5wcm9taXNjID0gcHJvbWlzYzsKKworfQorCisKK3N0YXRpYyBpbnQgcjgxOTJfc2V0X21hY19hZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqbWFjKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBtYWM7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEsIEVUSF9BTEVOKTsKKworCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJlc2V0X3dxKTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworfQorCisvKiBiYXNlZCBvbiBpcHcyMjAwIGRyaXZlciAqLworc3RhdGljIGludCBydGw4MTkyX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilydGxsaWJfcHJpdihkZXYpOworCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKXJxOworCWludCByZXQgPSAtMTsKKwlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSA9IHByaXYtPnJ0bGxpYjsKKwl1MzIga2V5WzRdOworCXU4IGJyb2FkY2FzdF9hZGRyWzZdID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworCXU4IHplcm9fYWRkcls2XSA9IHswfTsKKwlzdHJ1Y3QgaXdfcG9pbnQgKnAgPSAmd3JxLT51LmRhdGE7CisJc3RydWN0IGllZWVfcGFyYW0gKmlwdyA9IE5VTEw7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJUTF9JT0NUTF9XUEFfU1VQUExJQ0FOVDoKKwkJaWYgKHAtPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaWVlZV9wYXJhbSkgfHwgIXAtPnBvaW50ZXIpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlwdyA9IGttYWxsb2MocC0+bGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGlwdyA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKGlwdywgcC0+cG9pbnRlciwgcC0+bGVuZ3RoKSkgeworCQkJa2ZyZWUoaXB3KTsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChpcHctPmNtZCA9PSBJRUVFX0NNRF9TRVRfRU5DUllQVElPTikgeworCQkJaWYgKGlwdy0+dS5jcnlwdC5zZXRfdHgpIHsKKwkJCQlpZiAoc3RyY21wKGlwdy0+dS5jcnlwdC5hbGcsICJDQ01QIikgPT0gMCkKKwkJCQkJaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPSBLRVlfVFlQRV9DQ01QOworCQkJCWVsc2UgaWYgKHN0cmNtcChpcHctPnUuY3J5cHQuYWxnLCAiVEtJUCIpID09IDApCisJCQkJCWllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfVEtJUDsKKwkJCQllbHNlIGlmIChzdHJjbXAoaXB3LT51LmNyeXB0LmFsZywgIldFUCIpID09IDApIHsKKwkJCQkJaWYgKGlwdy0+dS5jcnlwdC5rZXlfbGVuID09IDEzKQorCQkJCQkJaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPQorCQkJCQkJCSBLRVlfVFlQRV9XRVAxMDQ7CisJCQkJCWVsc2UgaWYgKGlwdy0+dS5jcnlwdC5rZXlfbGVuID09IDUpCisJCQkJCQlpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9CisJCQkJCQkJIEtFWV9UWVBFX1dFUDQwOworCQkJCX0gZWxzZSB7CisJCQkJCWllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfTkE7CisJCQkJfQorCisJCQkJaWYgKGllZWUtPnBhaXJ3aXNlX2tleV90eXBlKSB7CisJCQkJCWlmIChtZW1jbXAoaWVlZS0+YXBfbWFjX2FkZHIsIHplcm9fYWRkciwKKwkJCQkJICAgIDYpID09IDApCisJCQkJCQlpZWVlLT5pd19tb2RlID0gSVdfTU9ERV9BREhPQzsKKwkJCQkJbWVtY3B5KCh1OCAqKWtleSwgaXB3LT51LmNyeXB0LmtleSwgMTYpOworCQkJCQlFbmFibGVIV1NlY3VyaXR5Q29uZmlnODE5MihkZXYpOworCQkJCQlzZXRfc3djYW0oZGV2LCA0LCBpcHctPnUuY3J5cHQuaWR4LAorCQkJCQkJICBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSwKKwkJCQkJCSAgKHU4ICopaWVlZS0+YXBfbWFjX2FkZHIsCisJCQkJCQkgIDAsIGtleSwgMCk7CisJCQkJCXNldEtleShkZXYsIDQsIGlwdy0+dS5jcnlwdC5pZHgsCisJCQkJCSAgICAgICBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSwKKwkJCQkJICAgICAgICh1OCAqKWllZWUtPmFwX21hY19hZGRyLCAwLCBrZXkpOworCQkJCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7CisJCQkJCQlzZXRfc3djYW0oZGV2LCBpcHctPnUuY3J5cHQuaWR4LAorCQkJCQkJCWlwdy0+dS5jcnlwdC5pZHgsCisJCQkJCQkJaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUsCisJCQkJCQkJKHU4ICopaWVlZS0+YXBfbWFjX2FkZHIsCisJCQkJCQkJMCwga2V5LCAwKTsKKwkJCQkJCXNldEtleShkZXYsIGlwdy0+dS5jcnlwdC5pZHgsCisJCQkJCQkgICAgICAgaXB3LT51LmNyeXB0LmlkeCwKKwkJCQkJCSAgICAgICBpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSwKKwkJCQkJCSAgICAgICAodTggKilpZWVlLT5hcF9tYWNfYWRkciwKKwkJCQkJCSAgICAgICAwLCBrZXkpOworCQkJCQl9CisJCQkJfQorCQkJCWlmICgoaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPT0gS0VZX1RZUEVfQ0NNUCkKKwkJCQkgICAgICYmIGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0KSB7CisJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgMHgxNzMsIDEpOworCQkJCX0KKworCQkJfSBlbHNlIHsKKwkJCQltZW1jcHkoKHU4ICopa2V5LCBpcHctPnUuY3J5cHQua2V5LCAxNik7CisJCQkJaWYgKHN0cmNtcChpcHctPnUuY3J5cHQuYWxnLCAiQ0NNUCIpID09IDApCisJCQkJCWllZWUtPmdyb3VwX2tleV90eXBlID0gS0VZX1RZUEVfQ0NNUDsKKwkJCQllbHNlIGlmIChzdHJjbXAoaXB3LT51LmNyeXB0LmFsZywgIlRLSVAiKSA9PSAwKQorCQkJCQlpZWVlLT5ncm91cF9rZXlfdHlwZSA9IEtFWV9UWVBFX1RLSVA7CisJCQkJZWxzZSBpZiAoc3RyY21wKGlwdy0+dS5jcnlwdC5hbGcsICJXRVAiKSA9PSAwKSB7CisJCQkJCWlmIChpcHctPnUuY3J5cHQua2V5X2xlbiA9PSAxMykKKwkJCQkJCWllZWUtPmdyb3VwX2tleV90eXBlID0KKwkJCQkJCQkgS0VZX1RZUEVfV0VQMTA0OworCQkJCQllbHNlIGlmIChpcHctPnUuY3J5cHQua2V5X2xlbiA9PSA1KQorCQkJCQkJaWVlZS0+Z3JvdXBfa2V5X3R5cGUgPQorCQkJCQkJCSBLRVlfVFlQRV9XRVA0MDsKKwkJCQl9IGVsc2UKKwkJCQkJaWVlZS0+Z3JvdXBfa2V5X3R5cGUgPSBLRVlfVFlQRV9OQTsKKworCQkJCWlmIChpZWVlLT5ncm91cF9rZXlfdHlwZSkgeworCQkJCQlzZXRfc3djYW0oZGV2LCBpcHctPnUuY3J5cHQuaWR4LAorCQkJCQkJICBpcHctPnUuY3J5cHQuaWR4LAorCQkJCQkJICBpZWVlLT5ncm91cF9rZXlfdHlwZSwKKwkJCQkJCSAgYnJvYWRjYXN0X2FkZHIsIDAsIGtleSwgMCk7CisJCQkJCXNldEtleShkZXYsIGlwdy0+dS5jcnlwdC5pZHgsCisJCQkJCSAgICAgICBpcHctPnUuY3J5cHQuaWR4LAorCQkJCQkgICAgICAgaWVlZS0+Z3JvdXBfa2V5X3R5cGUsCisJCQkJCSAgICAgICBicm9hZGNhc3RfYWRkciwgMCwga2V5KTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlyZXQgPSBydGxsaWJfd3BhX3N1cHBsaWNhbnRfaW9jdGwocHJpdi0+cnRsbGliLCAmd3JxLT51LmRhdGEsCisJCQkJCQkgIDApOworCQlrZnJlZShpcHcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisJfQorCitvdXQ6CisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCisKK2lycXJldHVybl90eXBlIHJ0bDgxOTJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKm5ldGRldiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBuZXRkZXY7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilydGxsaWJfcHJpdihkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGludGE7CisJdTMyIGludGI7CisJaW50YiA9IDA7CisKKwlpZiAocHJpdi0+aXJxX2VuYWJsZWQgPT0gMCkKKwkJZ290byBkb25lOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmlycV90aF9sb2NrLCBmbGFncyk7CisKKwlwcml2LT5vcHMtPmludGVycnVwdF9yZWNvZ25pemVkKGRldiwgJmludGEsICZpbnRiKTsKKwlwcml2LT5zdGF0cy5zaGludHMrKzsKKworCWlmICghaW50YSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFfdGhfbG9jaywgZmxhZ3MpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGludGEgPT0gMHhmZmZmKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycV90aF9sb2NrLCBmbGFncyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlwcml2LT5zdGF0cy5pbnRzKys7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFfdGhfbG9jaywgZmxhZ3MpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGludGEgJiBJTVJfVEJET0spIHsKKwkJUlRfVFJBQ0UoQ09NUF9JTlRSLCAiYmVhY29uIG9rIGludGVycnVwdCFcbiIpOworCQlwcml2LT5zdGF0cy50eGJlYWNvbm9raW50Kys7CisJfQorCisJaWYgKGludGEgJiBJTVJfVEJERVIpIHsKKwkJUlRfVFJBQ0UoQ09NUF9JTlRSLCAiYmVhY29uIG9rIGludGVycnVwdCFcbiIpOworCQlwcml2LT5zdGF0cy50eGJlYWNvbmVycisrOworCX0KKworCWlmIChpbnRhICYgSU1SX0JET0spCisJCVJUX1RSQUNFKENPTVBfSU5UUiwgImJlYWNvbiBpbnRlcnJ1cHQhXG4iKTsKKworCWlmIChpbnRhICAmIElNUl9NR05URE9LKSB7CisJCVJUX1RSQUNFKENPTVBfSU5UUiwgIk1hbmFnZSBvayBpbnRlcnJ1cHQhXG4iKTsKKwkJcHJpdi0+c3RhdHMudHhtYW5hZ2Vva2ludCsrOworCQlydGw4MTkyX3R4X2lzcihkZXYsIE1HTlRfUVVFVUUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFfdGhfbG9jaywgZmxhZ3MpOworCQlpZiAocHJpdi0+cnRsbGliLT5hY2tfdHhfdG9faWVlZSkgeworCQkJaWYgKHJ0bDgxOTJfaXNfdHhfcXVldWVfZW1wdHkoZGV2KSkgeworCQkJCXByaXYtPnJ0bGxpYi0+YWNrX3R4X3RvX2llZWUgPSAwOworCQkJCXJ0bGxpYl9wc190eF9hY2socHJpdi0+cnRsbGliLCAxKTsKKwkJCX0KKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aXJxX3RoX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAoaW50YSAmIElNUl9DT01ET0spIHsKKwkJcHJpdi0+c3RhdHMudHhjbWRwa3Rva2ludCsrOworCQlydGw4MTkyX3R4X2lzcihkZXYsIFRYQ01EX1FVRVVFKTsKKwl9CisKKwlpZiAoaW50YSAmIElNUl9ISUdIRE9LKQorCQlydGw4MTkyX3R4X2lzcihkZXYsIEhJR0hfUVVFVUUpOworCisJaWYgKGludGEgJiBJTVJfUk9LKSB7CisJCXByaXYtPnN0YXRzLnJ4aW50Kys7CisJCXByaXYtPkludGVycnVwdExvZy5uSU1SX1JPSysrOworCQl0YXNrbGV0X3NjaGVkdWxlKCZwcml2LT5pcnFfcnhfdGFza2xldCk7CisJfQorCisJaWYgKGludGEgJiBJTVJfQmNuSW50KSB7CisJCVJUX1RSQUNFKENPTVBfSU5UUiwgInByZXBhcmUgYmVhY29uIGZvciBpbnRlcnJ1cHQhXG4iKTsKKwkJdGFza2xldF9zY2hlZHVsZSgmcHJpdi0+aXJxX3ByZXBhcmVfYmVhY29uX3Rhc2tsZXQpOworCX0KKworCWlmIChpbnRhICYgSU1SX1JEVSkgeworCQlSVF9UUkFDRShDT01QX0lOVFIsICJyeCBkZXNjcmlwdG9yIHVuYXZhaWxhYmxlIVxuIik7CisJCXByaXYtPnN0YXRzLnJ4cmR1Kys7CisJCXdyaXRlX25pY19kd29yZChkZXYsIElOVEFfTUFTSywKKwkJCQlyZWFkX25pY19kd29yZChkZXYsIElOVEFfTUFTSykgJiB+SU1SX1JEVSk7CisJCXRhc2tsZXRfc2NoZWR1bGUoJnByaXYtPmlycV9yeF90YXNrbGV0KTsKKwl9CisKKwlpZiAoaW50YSAmIElNUl9SWEZPVlcpIHsKKwkJUlRfVFJBQ0UoQ09NUF9JTlRSLCAicnggb3ZlcmZsb3cgIVxuIik7CisJCXByaXYtPnN0YXRzLnJ4b3ZlcmZsb3crKzsKKwkJdGFza2xldF9zY2hlZHVsZSgmcHJpdi0+aXJxX3J4X3Rhc2tsZXQpOworCX0KKworCWlmIChpbnRhICYgSU1SX1RYRk9WVykKKwkJcHJpdi0+c3RhdHMudHhvdmVyZmxvdysrOworCisJaWYgKGludGEgJiBJTVJfQktET0spIHsKKwkJUlRfVFJBQ0UoQ09NUF9JTlRSLCAiQksgVHggT0sgaW50ZXJydXB0IVxuIik7CisJCXByaXYtPnN0YXRzLnR4Ymtva2ludCsrOworCQlwcml2LT5ydGxsaWItPkxpbmtEZXRlY3RJbmZvLk51bVR4T2tJblBlcmlvZCsrOworCQlydGw4MTkyX3R4X2lzcihkZXYsIEJLX1FVRVVFKTsKKwl9CisKKwlpZiAoaW50YSAmIElNUl9CRURPSykgeworCQlSVF9UUkFDRShDT01QX0lOVFIsICJCRSBUWCBPSyBpbnRlcnJ1cHQhXG4iKTsKKwkJcHJpdi0+c3RhdHMudHhiZW9raW50Kys7CisJCXByaXYtPnJ0bGxpYi0+TGlua0RldGVjdEluZm8uTnVtVHhPa0luUGVyaW9kKys7CisJCXJ0bDgxOTJfdHhfaXNyKGRldiwgQkVfUVVFVUUpOworCX0KKworCWlmIChpbnRhICYgSU1SX1ZJRE9LKSB7CisJCVJUX1RSQUNFKENPTVBfSU5UUiwgIlZJIFRYIE9LIGludGVycnVwdCFcbiIpOworCQlwcml2LT5zdGF0cy50eHZpb2tpbnQrKzsKKwkJcHJpdi0+cnRsbGliLT5MaW5rRGV0ZWN0SW5mby5OdW1UeE9rSW5QZXJpb2QrKzsKKwkJcnRsODE5Ml90eF9pc3IoZGV2LCBWSV9RVUVVRSk7CisJfQorCisJaWYgKGludGEgJiBJTVJfVk9ET0spIHsKKwkJcHJpdi0+c3RhdHMudHh2b29raW50Kys7CisJCVJUX1RSQUNFKENPTVBfSU5UUiwgIlZvIFRYIE9LIGludGVycnVwdCFcbiIpOworCQlwcml2LT5ydGxsaWItPkxpbmtEZXRlY3RJbmZvLk51bVR4T2tJblBlcmlvZCsrOworCQlydGw4MTkyX3R4X2lzcihkZXYsIFZPX1FVRVVFKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFfdGhfbG9jaywgZmxhZ3MpOworCitkb25lOgorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBDSV9TVFVGRi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgSEFWRV9ORVRfREVWSUNFX09QUworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBydGw4MTkyX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuID0gcnRsODE5Ml9vcGVuLAorCS5uZG9fc3RvcCA9IHJ0bDgxOTJfY2xvc2UsCisJLm5kb190eF90aW1lb3V0ID0gcnRsODE5Ml90eF90aW1lb3V0LAorCS5uZG9fZG9faW9jdGwgPSBydGw4MTkyX2lvY3RsLAorCS5uZG9fc2V0X3J4X21vZGUgPSByODE5Ml9zZXRfbXVsdGljYXN0LAorCS5uZG9fc2V0X21hY19hZGRyZXNzID0gcjgxOTJfc2V0X21hY19hZHIsCisJLm5kb192YWxpZGF0ZV9hZGRyID0gZXRoX3ZhbGlkYXRlX2FkZHIsCisJLm5kb19jaGFuZ2VfbXR1ID0gZXRoX2NoYW5nZV9tdHUsCisJLm5kb19zdGFydF94bWl0ID0gcnRsbGliX3htaXQsCit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJ0bDgxOTJfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXVuc2lnbmVkIGxvbmcgaW9hZGRyID0gMDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IE5VTEw7CisJc3RydWN0IHJ0bDgxOXhfb3BzICpvcHMgPSAoc3RydWN0IHJ0bDgxOXhfb3BzICopKGlkLT5kcml2ZXJfZGF0YSk7CisJdW5zaWduZWQgbG9uZyBwbWVtX3N0YXJ0LCBwbWVtX2xlbiwgcG1lbV9mbGFnczsKKwlpbnQgZXJyID0gLUVOT01FTTsKKwlib29sIGJkbWE2NCA9IGZhbHNlOworCXU4IHJldmlzaW9uX2lkOworCisJUlRfVFJBQ0UoQ09NUF9JTklULCAiQ29uZmlndXJpbmcgY2hpcCByZXNvdXJjZXMiKTsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgeworCQlSVF9UUkFDRShDT01QX0VSUiwgIkZhaWxlZCB0byBlbmFibGUgUENJIGRldmljZSIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWlmICghcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKSkgeworCQlpZiAocGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJVbmFibGUgdG8gb2J0YWluIDMyYml0IERNQSBmb3IgY29uc2lzdGVudCBhbGxvY2F0aW9uc1xuIik7CisJCQlnb3RvIGVycl9wY2lfZGlzYWJsZTsKKwkJfQorCX0KKwlkZXYgPSBhbGxvY19ydGxsaWIoc2l6ZW9mKHN0cnVjdCByODE5Ml9wcml2KSk7CisJaWYgKCFkZXYpCisJCWdvdG8gZXJyX3BjaV9kaXNhYmxlOworCisJZXJyID0gLUVOT0RFVjsKKwlpZiAoYmRtYTY0KQorCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisJcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJcHJpdi0+cnRsbGliID0gKHN0cnVjdCBydGxsaWJfZGV2aWNlICopbmV0ZGV2X3ByaXZfcnNsKGRldik7CisJcHJpdi0+cGRldiA9IHBkZXY7CisJcHJpdi0+cnRsbGliLT5wZGV2ID0gcGRldjsKKwlpZiAoKHBkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9ETElOSykgJiYKKwkgICAgKHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHgzMzA0KSkKKwkJcHJpdi0+cnRsbGliLT5iU3VwcG9ydFJlbW90ZVdha2VVcCA9IDE7CisJZWxzZQorCQlwcml2LT5ydGxsaWItPmJTdXBwb3J0UmVtb3RlV2FrZVVwID0gMDsKKworCXBtZW1fc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisJcG1lbV9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDEpOworCXBtZW1fZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMSk7CisKKwlpZiAoIShwbWVtX2ZsYWdzICYgSU9SRVNPVVJDRV9NRU0pKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCAicmVnaW9uICMxIG5vdCBhIE1NSU8gcmVzb3VyY2UsIGFib3J0aW5nIik7CisJCWdvdG8gZXJyX3JlbF9ydGxsaWI7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiTWVtb3J5IG1hcHBlZCBzcGFjZSBzdGFydDogMHglMDhseFxuIiwgcG1lbV9zdGFydCk7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocG1lbV9zdGFydCwgcG1lbV9sZW4sIERSVl9OQU1FKSkgeworCQlSVF9UUkFDRShDT01QX0VSUiwgInJlcXVlc3RfbWVtX3JlZ2lvbiBmYWlsZWQhIik7CisJCWdvdG8gZXJyX3JlbF9ydGxsaWI7CisJfQorCisKKwlpb2FkZHIgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwX25vY2FjaGUocG1lbV9zdGFydCwgcG1lbV9sZW4pOworCWlmIChpb2FkZHIgPT0gKHVuc2lnbmVkIGxvbmcpTlVMTCkgeworCQlSVF9UUkFDRShDT01QX0VSUiwgImlvcmVtYXAgZmFpbGVkISIpOworCQlnb3RvIGVycl9yZWxfbWVtOworCX0KKworCWRldi0+bWVtX3N0YXJ0ID0gaW9hZGRyOworCWRldi0+bWVtX2VuZCA9IGlvYWRkciArIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCAweDA4LCAmcmV2aXNpb25faWQpOworCS8qIElmIHRoZSByZXZpc2lvbmlkIGlzIDB4MTAsIHRoZSBkZXZpY2UgdXNlcyBydGw4MTkyc2UuICovCisJaWYgKHBkZXYtPmRldmljZSA9PSAweDgxOTIgJiYgcmV2aXNpb25faWQgPT0gMHgxMCkKKwkJZ290byBlcnJfcmVsX21lbTsKKworCXByaXYtPm9wcyA9IG9wczsKKworCWlmIChydGw4MTkyX3BjaV9maW5kYWRhcHRlcihwZGV2LCBkZXYpID09IGZhbHNlKQorCQlnb3RvIGVycl9yZWxfbWVtOworCisJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CisJcHJpdi0+aXJxID0gMDsKKworI2lmZGVmIEhBVkVfTkVUX0RFVklDRV9PUFMKKwlkZXYtPm5ldGRldl9vcHMgPSAmcnRsODE5Ml9uZXRkZXZfb3BzOworI2Vsc2UKKwlkZXYtPm9wZW4gPSBydGw4MTkyX29wZW47CisJZGV2LT5zdG9wID0gcnRsODE5Ml9jbG9zZTsKKwlkZXYtPnR4X3RpbWVvdXQgPSBydGw4MTkyX3R4X3RpbWVvdXQ7CisJZGV2LT5kb19pb2N0bCA9IHJ0bDgxOTJfaW9jdGw7CisJZGV2LT5zZXRfbXVsdGljYXN0X2xpc3QgPSByODE5Ml9zZXRfbXVsdGljYXN0OworCWRldi0+c2V0X21hY19hZGRyZXNzID0gcjgxOTJfc2V0X21hY19hZHI7CisJZGV2LT5oYXJkX3N0YXJ0X3htaXQgPSBydGxsaWJfeG1pdDsKKyNlbmRpZgorCisJZGV2LT53aXJlbGVzc19oYW5kbGVycyA9IChzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgKikKKwkJCQkgJnI4MTkyX3d4X2hhbmRsZXJzX2RlZjsKKwlkZXYtPmV0aHRvb2xfb3BzID0gJnJ0bDgxOXhfZXRodG9vbF9vcHM7CisKKwlkZXYtPnR5cGUgPSBBUlBIUkRfRVRIRVI7CisJZGV2LT53YXRjaGRvZ190aW1lbyA9IEhaICogMzsKKworCWlmIChkZXZfYWxsb2NfbmFtZShkZXYsIGlmbmFtZSkgPCAwKSB7CisJCVJUX1RSQUNFKENPTVBfSU5JVCwgIk9vcHM6IGRldm5hbWUgYWxyZWFkeSB0YWtlbiEgVHJ5aW5nICIKKwkJCSAid2xhbiUlZC4uLlxuIik7CisJCQlkZXZfYWxsb2NfbmFtZShkZXYsIGlmbmFtZSk7CisJfQorCisJUlRfVFJBQ0UoQ09NUF9JTklULCAiRHJpdmVyIHByb2JlIGNvbXBsZXRlZDFcbiIpOworCWlmIChydGw4MTkyX2luaXQoZGV2KSAhPSAwKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCAiSW5pdGlhbGl6YXRpb24gZmFpbGVkIik7CisJCWdvdG8gZXJyX2ZyZWVfaXJxOworCX0KKworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJcmVnaXN0ZXJfbmV0ZGV2KGRldik7CisJUlRfVFJBQ0UoQ09NUF9JTklULCAiZGV2IG5hbWU6ICVzXG4iLCBkZXYtPm5hbWUpOworCWVyciA9IHJ0bF9kZWJ1Z19tb2R1bGVfaW5pdChwcml2LCBkZXYtPm5hbWUpOworCWlmIChlcnIpCisJCVJUX1RSQUNFKENPTVBfREJHLCAiZmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGZpbGVzLiBJZ25vcmluZyAiCisJCQkgImVycm9yOiAlZFxuIiwgZXJyKTsKKwlydGw4MTkyX3Byb2NfaW5pdF9vbmUoZGV2KTsKKworCWlmIChwcml2LT5wb2xsaW5nX3RpbWVyX29uID09IDApCisJCWNoZWNrX3JmY3RybF9ncGlvX3RpbWVyKCh1bnNpZ25lZCBsb25nKWRldik7CisKKwlSVF9UUkFDRShDT01QX0lOSVQsICJEcml2ZXIgcHJvYmUgY29tcGxldGVkXG4iKTsKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWVfaXJxOgorCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOworCXByaXYtPmlycSA9IDA7CitlcnJfcmVsX21lbToKKwlyZWxlYXNlX21lbV9yZWdpb24ocG1lbV9zdGFydCwgcG1lbV9sZW4pOworZXJyX3JlbF9ydGxsaWI6CisJZnJlZV9ydGxsaWIoZGV2KTsKKworCURNRVNHKCJ3bGFuIGRyaXZlciBsb2FkIGZhaWxlZFxuIik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworZXJyX3BjaV9kaXNhYmxlOgorCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgcnRsODE5Ml9wY2lfZGlzY29ubmVjdChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2IDsKKwl1MzIgaTsKKworCWlmIChkZXYpIHsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKworCQlwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCQlkZWxfdGltZXJfc3luYygmcHJpdi0+Z3Bpb19wb2xsaW5nX3RpbWVyKTsKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+Z3Bpb19jaGFuZ2VfcmZfd3EpOworCQlwcml2LT5wb2xsaW5nX3RpbWVyX29uID0gMDsKKwkJcnRsX2RlYnVnX21vZHVsZV9yZW1vdmUocHJpdik7CisJCXJ0bDgxOTJfcHJvY19yZW1vdmVfb25lKGRldik7CisJCXJ0bDgxOTJfZG93bihkZXYsIHRydWUpOworCQlkZWluaXRfaGFsX2RtKGRldik7CisJCWlmIChwcml2LT5wRmlybXdhcmUpIHsKKwkJCXZmcmVlKHByaXYtPnBGaXJtd2FyZSk7CisJCQlwcml2LT5wRmlybXdhcmUgPSBOVUxMOworCQl9CisJCWRlc3Ryb3lfd29ya3F1ZXVlKHByaXYtPnByaXZfd3EpOworCQlydGw4MTkyX2ZyZWVfcnhfcmluZyhkZXYpOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1RYX1FVRVVFX0NPVU5UOyBpKyspCisJCQlydGw4MTkyX2ZyZWVfdHhfcmluZyhkZXYsIGkpOworCisJCWlmIChwcml2LT5pcnEpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIkZyZWVpbmcgaXJxICVkXG4iLCBkZXYtPmlycSk7CisJCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKKwkJCXByaXYtPmlycSA9IDA7CisJCX0KKwkJZnJlZV9ydGxsaWIoZGV2KTsKKworCQlrZnJlZShwcml2LT5zY2FuX2NtZCk7CisKKwkJaWYgKGRldi0+bWVtX3N0YXJ0ICE9IDApIHsKKwkJCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKWRldi0+bWVtX3N0YXJ0KTsKKwkJCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSksCisJCQkJCXBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSkpOworCQl9CisJfSBlbHNlIHsKKwkJcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJfQorCisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCVJUX1RSQUNFKENPTVBfRE9XTiwgIndsYW4gZHJpdmVyIHJlbW92ZWRcbiIpOworfQorCitib29sIE5pY0lGRW5hYmxlTklDKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJYm9vbCBpbml0X3N0YXR1cyA9IHRydWU7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXN0cnVjdCBydF9wd3Jfc2F2ZV9jdHJsICpwUFNDID0gKHN0cnVjdCBydF9wd3Jfc2F2ZV9jdHJsICopCisJCQkJCSgmKHByaXYtPnJ0bGxpYi0+UG93ZXJTYXZlQ29udHJvbCkpOworCisJaWYgKElTX05JQ19ET1dOKHByaXYpKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLCAiRVJSISEhICVzKCk6IERyaXZlciBpcyBhbHJlYWR5IGRvd24hXG4iLAorCQkJIF9fZnVuY19fKTsKKwkJcHJpdi0+YmRpc2FibGVfbmljID0gZmFsc2U7CisJCXJldHVybiBSVF9TVEFUVVNfRkFJTFVSRTsKKwl9CisKKwlSVF9UUkFDRShDT01QX1BTLCAiPT09PT09PT09PT0+JXMoKVxuIiwgX19mdW5jX18pOworCXByaXYtPmJmaXJzdF9pbml0ID0gdHJ1ZTsKKwlpbml0X3N0YXR1cyA9IHByaXYtPm9wcy0+aW5pdGlhbGl6ZV9hZGFwdGVyKGRldik7CisJaWYgKGluaXRfc3RhdHVzICE9IHRydWUpIHsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJFUlIhISEgJXMoKTogaW5pdGlhbGl6YXRpb24gaXMgZmFpbGVkIVxuIiwKKwkJCSBfX2Z1bmNfXyk7CisJCXByaXYtPmJkaXNhYmxlX25pYyA9IGZhbHNlOworCQlyZXR1cm4gLTE7CisJfQorCVJUX1RSQUNFKENPTVBfSU5JVCwgInN0YXJ0IGFkYXB0ZXIgZmluaXNoZWRcbiIpOworCVJUX0NMRUFSX1BTX0xFVkVMKHBQU0MsIFJUX1JGX09GRl9MRVZMX0hBTFRfTklDKTsKKwlwcml2LT5iZmlyc3RfaW5pdCA9IGZhbHNlOworCisJcnRsODE5Ml9pcnFfZW5hYmxlKGRldik7CisJcHJpdi0+YmRpc2FibGVfbmljID0gZmFsc2U7CisJUlRfVFJBQ0UoQ09NUF9QUywgIjw9PT09PT09PT09PSVzKClcbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gaW5pdF9zdGF0dXM7Cit9Citib29sIE5pY0lGRGlzYWJsZU5JQyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWJvb2wJc3RhdHVzID0gdHJ1ZTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJdTggdG1wX3N0YXRlID0gMDsKKwlSVF9UUkFDRShDT01QX1BTLCAiPT09PT09PT09PiVzKClcbiIsIF9fZnVuY19fKTsKKwlwcml2LT5iZGlzYWJsZV9uaWMgPSB0cnVlOworCXRtcF9zdGF0ZSA9IHByaXYtPnJ0bGxpYi0+c3RhdGU7CisJcnRsbGliX3NvZnRtYWNfc3RvcF9wcm90b2NvbChwcml2LT5ydGxsaWIsIDAsIGZhbHNlKTsKKwlwcml2LT5ydGxsaWItPnN0YXRlID0gdG1wX3N0YXRlOworCXJ0bDgxOTJfY2FuY2VsX2RlZmVycmVkX3dvcmsocHJpdik7CisJcnRsODE5Ml9pcnFfZGlzYWJsZShkZXYpOworCisJcHJpdi0+b3BzLT5zdG9wX2FkYXB0ZXIoZGV2LCBmYWxzZSk7CisJUlRfVFJBQ0UoQ09NUF9QUywgIjw9PT09PT09PT0lcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IF9faW5pdCBydGw4MTkyX3BjaV9tb2R1bGVfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisJaW50IGVycm9yOworCisJcmV0ID0gcnRsbGliX2luaXQoKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAicnRsbGliX2luaXQoKSBmYWlsZWQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IHJ0bGxpYl9jcnlwdG9faW5pdCgpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJydGxsaWJfY3J5cHRvX2luaXQoKSBmYWlsZWQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IHJ0bGxpYl9jcnlwdG9fdGtpcF9pbml0KCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgInJ0bGxpYl9jcnlwdG9fdGtpcF9pbml0KCkgZmFpbGVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSBydGxsaWJfY3J5cHRvX2NjbXBfaW5pdCgpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJydGxsaWJfY3J5cHRvX2NjbXBfaW5pdCgpIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gcnRsbGliX2NyeXB0b193ZXBfaW5pdCgpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJydGxsaWJfY3J5cHRvX3dlcF9pbml0KCkgZmFpbGVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlwcmludGsoS0VSTl9JTkZPICJcbkxpbnV4IGtlcm5lbCBkcml2ZXIgZm9yIFJUTDgxOTJFIFdMQU4gY2FyZHNcbiIpOworCXByaW50ayhLRVJOX0lORk8gIkNvcHlyaWdodCAoYykgMjAwNy0yMDA4LCBSZWFsc2lsIFdsYW4gRHJpdmVyXG4iKTsKKworCWVycm9yID0gcnRsX2NyZWF0ZV9kZWJ1Z2ZzX3Jvb3QoKTsKKwlpZiAoZXJyb3IpIHsKKwkJUlRfVFJBQ0UoQ09NUF9EQkcsICJDcmVhdGUgZGVidWdmcyByb290IGZhaWw6ICVkXG4iLCBlcnJvcik7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwlydGw4MTkyX3Byb2NfbW9kdWxlX2luaXQoKTsKKwlpZiAoMCAhPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZydGw4MTkyX3BjaV9kcml2ZXIpKSB7CisJCURNRVNHKCJObyBkZXZpY2UgZm91bmQiKTsKKwkJLypwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZydGw4MTkyX3BjaV9kcml2ZXIpOyovCisJCXJldHVybiAtRU5PREVWOworCX0KKwlyZXR1cm4gMDsKK2Vycl9vdXQ6CisJcmV0dXJuIGVycm9yOworCit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBydGw4MTkyX3BjaV9tb2R1bGVfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcnRsODE5Ml9wY2lfZHJpdmVyKTsKKworCVJUX1RSQUNFKENPTVBfRE9XTiwgIkV4aXRpbmciKTsKKwlydGw4MTkyX3Byb2NfbW9kdWxlX3JlbW92ZSgpOworCXJ0bF9yZW1vdmVfZGVidWdmc19yb290KCk7CisJcnRsbGliX2NyeXB0b190a2lwX2V4aXQoKTsKKwlydGxsaWJfY3J5cHRvX2NjbXBfZXhpdCgpOworCXJ0bGxpYl9jcnlwdG9fd2VwX2V4aXQoKTsKKwlydGxsaWJfY3J5cHRvX2RlaW5pdCgpOworCXJ0bGxpYl9leGl0KCk7Cit9CisKK3ZvaWQgY2hlY2tfcmZjdHJsX2dwaW9fdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopZGF0YSk7CisKKwlwcml2LT5wb2xsaW5nX3RpbWVyX29uID0gMTsKKworCXF1ZXVlX2RlbGF5ZWRfd29ya19yc2wocHJpdi0+cHJpdl93cSwgJnByaXYtPmdwaW9fY2hhbmdlX3JmX3dxLCAwKTsKKworCW1vZF90aW1lcigmcHJpdi0+Z3Bpb19wb2xsaW5nX3RpbWVyLCBqaWZmaWVzICsKKwkJICBNU0VDUyhSVExMSUJfV0FUQ0hfRE9HX1RJTUUpKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCS0tLS0tLS0tLS0tLS0tLS0tLS0gbW9kdWxlIGluaXQgLyBleGl0IHN0dWJzIC0tLS0tLS0tLS0tLS0tLS0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCittb2R1bGVfaW5pdChydGw4MTkyX3BjaV9tb2R1bGVfaW5pdCk7Cittb2R1bGVfZXhpdChydGw4MTkyX3BjaV9tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiTGludXggZHJpdmVyIGZvciBSZWFsdGVrIFJUTDgxOXggV2lGaSBjYXJkcyIpOworTU9EVUxFX0FVVEhPUihEUlZfQ09QWVJJR0hUICIgIiBEUlZfQVVUSE9SKTsKK01PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtKGlmbmFtZSwgY2hhcnAsIFNfSVJVR098U19JV1VTUik7Cittb2R1bGVfcGFyYW0oaHd3ZXAsIGludCwgU19JUlVHT3xTX0lXVVNSKTsKK21vZHVsZV9wYXJhbShjaGFubmVscywgaW50LCBTX0lSVUdPfFNfSVdVU1IpOworCitNT0RVTEVfUEFSTV9ERVNDKGlmbmFtZSwgIiBOZXQgaW50ZXJmYWNlIG5hbWUsIHdsYW4lZD1kZWZhdWx0Iik7CitNT0RVTEVfUEFSTV9ERVNDKGh3d2VwLCAiIFRyeSB0byB1c2UgaGFyZHdhcmUgV0VQIHN1cHBvcnQoZGVmYXVsdCB1c2UgaHcuIHNldCAwIHRvIHVzZSBzb2Z0d2FyZSBzZWN1cml0eSkiKTsKK01PRFVMRV9QQVJNX0RFU0MoY2hhbm5lbHMsICIgQ2hhbm5lbCBiaXRtYXNrIGZvciBzcGVjaWZpYyBsb2NhbGVzLiBOWUkiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxfY29yZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9jb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlhZjUxNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxfY29yZS5oCkBAIC0wLDAgKzEsMTEyNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQmFzZWQgb24gdGhlIHI4MTgwIGRyaXZlciwgd2hpY2ggaXM6CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4sIGV0IGFsLgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9SVExfQ09SRV9ICisjZGVmaW5lIF9SVExfQ09SRV9ICisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlICJydGxsaWIuaCIKKworI2luY2x1ZGUgImRvdDExZC5oIgorCisjaW5jbHVkZSAicjgxOTJFX2Zpcm13YXJlLmgiCisjaW5jbHVkZSAicjgxOTJFX2h3LmgiCisKKyNpbmNsdWRlICJyODE5MFBfZGVmLmgiCisjaW5jbHVkZSAicjgxOTJFX2Rldi5oIgorCisjaW5jbHVkZSAicnRsX2RlYnVnLmgiCisjaW5jbHVkZSAicnRsX2VlcHJvbS5oIgorI2luY2x1ZGUgInJ0bF9wcy5oIgorI2luY2x1ZGUgInJ0bF9wY2kuaCIKKyNpbmNsdWRlICJydGxfY2FtLmgiCisKKyNkZWZpbmUgRFJWX0NPUFlSSUdIVAkJXAorCSJDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTAgUmVhbHNpbCBTZW1pY29uZHVjdG9yIENvcnBvcmF0aW9uIgorI2RlZmluZSBEUlZfQVVUSE9SICAiPHdsYW5mYWVAcmVhbHRlay5jb20+IgorI2RlZmluZSBEUlZfVkVSU0lPTiAgIjAwMTQuMDQwMS4yMDEwIgorCisjZGVmaW5lIERSVl9OQU1FICJydGw4MTl4RSIKKworI2RlZmluZSBJU19IQVJEV0FSRV9UWVBFXzgxOXhQKF9wcml2KQkJXAorCSgoKChzdHJ1Y3QgcjgxOTJfcHJpdiAqKXJ0bGxpYl9wcml2KGRldikpLT5jYXJkXzgxOTIgPT0gTklDXzgxOTBQKSB8fCBcCisJKCgoc3RydWN0IHI4MTkyX3ByaXYgKilydGxsaWJfcHJpdihkZXYpKS0+Y2FyZF84MTkyID09IE5JQ184MTkyRSkpCisjZGVmaW5lIElTX0hBUkRXQVJFX1RZUEVfODE5MlNFKF9wcml2KQkJXAorCSgoKHN0cnVjdCByODE5Ml9wcml2ICopcnRsbGliX3ByaXYoZGV2KSktPmNhcmRfODE5MiA9PSBOSUNfODE5MlNFKQorI2RlZmluZSBJU19IQVJEV0FSRV9UWVBFXzgxOTJDRShfcHJpdikJCVwKKwkoKChzdHJ1Y3QgcjgxOTJfcHJpdiAqKXJ0bGxpYl9wcml2KGRldikpLT5jYXJkXzgxOTIgPT0gTklDXzgxOTJDRSkKKyNkZWZpbmUgSVNfSEFSRFdBUkVfVFlQRV84MTkyQ1UoX3ByaXYpCQlcCisJKCgoc3RydWN0IHI4MTkyX3ByaXYgKilydGxsaWJfcHJpdihkZXYpKS0+Y2FyZF84MTkyID09IE5JQ184MTkyQ1UpCisjZGVmaW5lIElTX0hBUkRXQVJFX1RZUEVfODE5MkRFKF9wcml2KQkJXAorCSgoKHN0cnVjdCByODE5Ml9wcml2ICopcnRsbGliX3ByaXYoZGV2KSktPmNhcmRfODE5MiA9PSBOSUNfODE5MkRFKQorI2RlZmluZSBJU19IQVJEV0FSRV9UWVBFXzgxOTJEVShfcHJpdikJCVwKKwkoKChzdHJ1Y3QgcjgxOTJfcHJpdiAqKXJ0bGxpYl9wcml2KGRldikpLT5jYXJkXzgxOTIgPT0gTklDXzgxOTJEVSkKKworI2RlZmluZSBSVExfUENJX0RFVklDRSh2ZW5kLCBkZXYsIGNmZykgXAorCS52ZW5kb3IgPSAodmVuZCksIC5kZXZpY2UgPSAoZGV2KSwgXAorCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELCAuc3ViZGV2aWNlID0gUENJX0FOWV9JRCAsIFwKKwkuZHJpdmVyX2RhdGEgPSAoa2VybmVsX3Vsb25nX3QpJihjZmcpCisKKyNkZWZpbmUgaXJxcmV0dXJuX3R5cGUgaXJxcmV0dXJuX3QKKworI2RlZmluZSBydGw4MTkyX2ludGVycnVwdCh4LCB5LCB6KSBydGw4MTkyX2ludGVycnVwdF9yc2woeCwgeSkKKworI2RlZmluZSBSVExfTUFYX1NDQU5fU0laRSAxMjgKKworI2RlZmluZSBSVExfUkFURV9NQVgJCTMwCisKKyNkZWZpbmUgVE9UQUxfQ0FNX0VOVFJZCQkzMgorI2RlZmluZSBDQU1fQ09OVEVOVF9DT1VOVAk4CisKKyNpZm5kZWYgQklUCisjZGVmaW5lIEJJVChfaSkJCQkJKDE8PChfaSkpCisjZW5kaWYKKworI2RlZmluZSBJU19OSUNfRE9XTihwcml2KQkoIShwcml2KS0+dXApCisKKyNkZWZpbmUgSVNfQURBUFRFUl9TRU5EU19CRUFDT04oZGV2KSAwCisKKyNkZWZpbmUgSVNfVU5ERVJfMTFOX0FFU19NT0RFKF9ydGxsaWIpCQlcCisJKChfcnRsbGliLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9PSB0cnVlKSAmJiBcCisJKF9ydGxsaWItPnBhaXJ3aXNlX2tleV90eXBlID09IEtFWV9UWVBFX0NDTVApKQorCisjZGVmaW5lIEhBTF9NRU1PUllfTUFQUEVEX0lPX1JBTkdFXzgxOTBQQ0kJMHgxMDAwCisjZGVmaW5lIEhBTF9IV19QQ0lfUkVWSVNJT05fSURfODE5MFBDSQkJCTB4MDAKKyNkZWZpbmUgSEFMX01FTU9SWV9NQVBQRURfSU9fUkFOR0VfODE5MlBDSUUJMHg0MDAwCisjZGVmaW5lIEhBTF9IV19QQ0lfUkVWSVNJT05fSURfODE5MlBDSUUJCTB4MDEKKyNkZWZpbmUgSEFMX01FTU9SWV9NQVBQRURfSU9fUkFOR0VfODE5MlNFCTB4NDAwMAorI2RlZmluZSBIQUxfSFdfUENJX1JFVklTSU9OX0lEXzgxOTJTRQkweDEwCisjZGVmaW5lIEhBTF9IV19QQ0lfUkVWSVNJT05fSURfODE5MkNFCQkJMHgxCisjZGVmaW5lIEhBTF9NRU1PUllfTUFQUEVEX0lPX1JBTkdFXzgxOTJDRQkweDQwMDAKKyNkZWZpbmUgSEFMX0hXX1BDSV9SRVZJU0lPTl9JRF84MTkyREUJCQkweDAKKyNkZWZpbmUgSEFMX01FTU9SWV9NQVBQRURfSU9fUkFOR0VfODE5MkRFCTB4NDAwMAorCisjZGVmaW5lIEhBTF9IV19QQ0lfODE4MF9ERVZJQ0VfSUQJCQkweDgxODAKKyNkZWZpbmUgSEFMX0hXX1BDSV84MTg1X0RFVklDRV9JRAkJCTB4ODE4NQorI2RlZmluZSBIQUxfSFdfUENJXzgxODhfREVWSUNFX0lECQkJMHg4MTg4CisjZGVmaW5lIEhBTF9IV19QQ0lfODE5OF9ERVZJQ0VfSUQJCQkweDgxOTgKKyNkZWZpbmUgSEFMX0hXX1BDSV84MTkwX0RFVklDRV9JRAkJCTB4ODE5MAorI2RlZmluZSBIQUxfSFdfUENJXzgxOTJfREVWSUNFX0lECQkJMHg4MTkyCisjZGVmaW5lIEhBTF9IV19QQ0lfODE5MlNFX0RFVklDRV9JRAkJCTB4ODE5MgorI2RlZmluZSBIQUxfSFdfUENJXzgxNzRfREVWSUNFX0lECQkJMHg4MTc0CisjZGVmaW5lIEhBTF9IV19QQ0lfODE3M19ERVZJQ0VfSUQJCQkweDgxNzMKKyNkZWZpbmUgSEFMX0hXX1BDSV84MTcyX0RFVklDRV9JRAkJCTB4ODE3MgorI2RlZmluZSBIQUxfSFdfUENJXzgxNzFfREVWSUNFX0lECQkJMHg4MTcxCisjZGVmaW5lIEhBTF9IV19QQ0lfMDA0NV9ERVZJQ0VfSUQJCQkweDAwNDUKKyNkZWZpbmUgSEFMX0hXX1BDSV8wMDQ2X0RFVklDRV9JRAkJCTB4MDA0NgorI2RlZmluZSBIQUxfSFdfUENJXzAwNDRfREVWSUNFX0lECQkJMHgwMDQ0CisjZGVmaW5lIEhBTF9IV19QQ0lfMDA0N19ERVZJQ0VfSUQJCQkweDAwNDcKKyNkZWZpbmUgSEFMX0hXX1BDSV83MDBGX0RFVklDRV9JRAkJCTB4NzAwRgorI2RlZmluZSBIQUxfSFdfUENJXzcwMUZfREVWSUNFX0lECQkJMHg3MDFGCisjZGVmaW5lIEhBTF9IV19QQ0lfRExJTktfREVWSUNFX0lECQkJMHgzMzA0CisjZGVmaW5lIEhBTF9IV19QQ0lfODE5MkNFVF9ERVZJQ0VfSUQJCQkweDgxOTEKKyNkZWZpbmUgSEFMX0hXX1BDSV84MTkyQ0VfREVWSUNFX0lECQkJMHg4MTc4CisjZGVmaW5lIEhBTF9IV19QQ0lfODE5MUNFX0RFVklDRV9JRAkJCTB4ODE3NworI2RlZmluZSBIQUxfSFdfUENJXzgxODhDRV9ERVZJQ0VfSUQJCQkweDgxNzYKKyNkZWZpbmUgSEFMX0hXX1BDSV84MTkyQ1VfREVWSUNFX0lECQkJMHg4MTkxCisjZGVmaW5lIEhBTF9IV19QQ0lfODE5MkRFX0RFVklDRV9JRAkJCTB4MDkyRAorI2RlZmluZSBIQUxfSFdfUENJXzgxOTJEVV9ERVZJQ0VfSUQJCQkweDA5MkQKKworI2RlZmluZSBSVEw4MTlYX0RFRkFVTFRfUkZfVFlQRQkJUkZfMVQyUgorCisjZGVmaW5lIFJUTExJQl9XQVRDSF9ET0dfVElNRQkJMjAwMAorCisjZGVmaW5lIE1BWF9ERVZfQUREUl9TSVpFCQk4ICAvKnN1cHBvcnQgdGlsbCA2NCBiaXQgYnVzIHdpZHRoIE9TKi8KKyNkZWZpbmUgTUFYX0ZJUk1XQVJFX0lORk9STUFUSU9OX1NJWkUgICAzMgorI2RlZmluZSBNQVhfODAyXzExX0hFQURFUl9MRU5HVEgJKDQwICsgTUFYX0ZJUk1XQVJFX0lORk9STUFUSU9OX1NJWkUpCisjZGVmaW5lIEVOQ1JZUFRJT05fTUFYX09WRVJIRUFECQkxMjgKKyNkZWZpbmUgTUFYX0ZSQUdNRU5UX0NPVU5UCQk4CisjZGVmaW5lIE1BWF9UUkFOU01JVF9CVUZGRVJfU0laRQlcCisJKDE2MDAgKyAoTUFYXzgwMl8xMV9IRUFERVJfTEVOR1RIICsgRU5DUllQVElPTl9NQVhfT1ZFUkhFQUQpICoJXAorCSBNQVhfRlJBR01FTlRfQ09VTlQpCisKKyNkZWZpbmUgc2NyY2xuZwkJCQk0CisKKyNkZWZpbmUgREVGQVVMVF9GUkFHX1RIUkVTSE9MRAkyMzQyVQorI2RlZmluZSBNSU5fRlJBR19USFJFU0hPTEQJMjU2VQorI2RlZmluZSBERUZBVUxUX0JFQUNPTklOVEVSVkFMCTB4NjRVCisKKyNkZWZpbmUgREVGQVVMVF9TU0lECQkiIgorI2RlZmluZSBERUZBVUxUX1JFVFJZX1JUUwk3CisjZGVmaW5lIERFRkFVTFRfUkVUUllfREFUQQk3CisjZGVmaW5lIFBSSVNNX0hEUl9TSVpFCQk2NAorCisjZGVmaW5lCVBIWV9SU1NJX1NMSURfV0lOX01BWAkJCTEwMAorCisjZGVmaW5lIFJUTF9JT0NUTF9XUEFfU1VQUExJQ0FOVAkJKFNJT0NJV0ZJUlNUUFJJViArIDMwKQorCisjZGVmaW5lIFR4QkJHYWluVGFibGVMZW5ndGgJCQkzNworI2RlZmluZSBDQ0tUeEJCR2FpblRhYmxlTGVuZ3RoCQkJMjMKKworI2RlZmluZSBDSEFOTkVMX1BMQU5fTEVOCQkJMTAKKyNkZWZpbmUgc0NyY0xuZwkJCQkJNAorCisjZGVmaW5lIE5JQ19TRU5EX0hBTkdfVEhSRVNIT0xEX05PUk1BTAkJNAorI2RlZmluZSBOSUNfU0VORF9IQU5HX1RIUkVTSE9MRF9QT1dFUlNBVkUJOAorCisjZGVmaW5lIE1BWF9UWF9RVUVVRQkJCQk5CisKKyNkZWZpbmUgTUFYX1JYX1FVRVVFCQkJCTEKKworI2RlZmluZSBNQVhfUlhfQ09VTlQJCQkJNjQKKyNkZWZpbmUgTUFYX1RYX1FVRVVFX0NPVU5UCQkJOQorCitlbnVtIFJUTDgxOXhfUEhZX1BBUkFNIHsKKwlSVEw4MTlYX1BIWV9NQUNQSFlfUkVHCQkJPSAwLAorCVJUTDgxOVhfUEhZX01BQ1BIWV9SRUdfUEcJCT0gMSwKKwlSVEw4MTg4Q19QSFlfTUFDUkVHCQkJPSAyLAorCVJUTDgxOTJDX1BIWV9NQUNSRUcJCQk9IDMsCisJUlRMODE5WF9QSFlfUkVHCQkJCT0gNCwKKwlSVEw4MTlYX1BIWV9SRUdfMVQyUgkJCT0gNSwKKwlSVEw4MTlYX1BIWV9SRUdfdG8xVDFSCQkJPSA2LAorCVJUTDgxOVhfUEhZX1JFR190bzFUMlIJCQk9IDcsCisJUlRMODE5WF9QSFlfUkVHX3RvMlQyUgkJCT0gOCwKKwlSVEw4MTlYX1BIWV9SRUdfUEcJCQk9IDksCisJUlRMODE5WF9BR0NfVEFCCQkJCT0gMTAsCisJUlRMODE5WF9QSFlfUkFESU9fQQkJCT0gMTEsCisJUlRMODE5WF9QSFlfUkFESU9fQV8xVAkJCT0gMTIsCisJUlRMODE5WF9QSFlfUkFESU9fQV8yVAkJCT0gMTMsCisJUlRMODE5WF9QSFlfUkFESU9fQgkJCT0gMTQsCisJUlRMODE5WF9QSFlfUkFESU9fQl9HTQkJCT0gMTUsCisJUlRMODE5WF9QSFlfUkFESU9fQwkJCT0gMTYsCisJUlRMODE5WF9QSFlfUkFESU9fRAkJCT0gMTcsCisJUlRMODE5WF9FRVBST01fTUFQCQkJPSAxOCwKKwlSVEw4MTlYX0VGVVNFX01BUAkJCT0gMTksCit9OworCitlbnVtIFJUTF9ERUJVRyB7CisJQ09NUF9UUkFDRQkJPSBCSVQwLAorCUNPTVBfREJHCQk9IEJJVDEsCisJQ09NUF9JTklUCQk9IEJJVDIsCisJQ09NUF9SRUNWCQk9IEJJVDMsCisJQ09NUF9TRU5ECQk9IEJJVDQsCisJQ09NUF9DTUQJCT0gQklUNSwKKwlDT01QX1BPV0VSCQk9IEJJVDYsCisJQ09NUF9FUFJPTQkJPSBCSVQ3LAorCUNPTVBfU1dCVwkJPSBCSVQ4LAorCUNPTVBfU0VDCQk9IEJJVDksCisJQ09NUF9MUFMJCT0gQklUMTAsCisJQ09NUF9RT1MJCT0gQklUMTEsCisJQ09NUF9SQVRFCQk9IEJJVDEyLAorCUNPTVBfUlhERVNDCQk9IEJJVDEzLAorCUNPTVBfUEhZCQk9IEJJVDE0LAorCUNPTVBfRElHCQk9IEJJVDE1LAorCUNPTVBfVFhBR0MJCT0gQklUMTYsCisJQ09NUF9IQUxETQkJPSBCSVQxNywKKwlDT01QX1BPV0VSX1RSQUNLSU5HCT0gQklUMTgsCisJQ09NUF9DSAkJCT0gQklUMTksCisJQ09NUF9SRgkJCT0gQklUMjAsCisJQ09NUF9GSVJNV0FSRQkJPSBCSVQyMSwKKwlDT01QX0hUCQkJPSBCSVQyMiwKKwlDT01QX1JFU0VUCQk9IEJJVDIzLAorCUNPTVBfQ01EUEtUCQk9IEJJVDI0LAorCUNPTVBfU0NBTgkJPSBCSVQyNSwKKwlDT01QX1BTCQkJPSBCSVQyNiwKKwlDT01QX0RPV04JCT0gQklUMjcsCisJQ09NUF9JTlRSCQk9IEJJVDI4LAorCUNPTVBfTEVECQk9IEJJVDI5LAorCUNPTVBfTUxNRQkJPSBCSVQzMCwKKwlDT01QX0VSUgkJPSBCSVQzMQorfTsKKworZW51bSBuaWNfdCB7CisJTklDX1VOS05PV04gICAgID0gMCwKKwlOSUNfODE5MkUgICAgICAgPSAxLAorCU5JQ184MTkwUCAgICAgICA9IDIsCisJTklDXzgxOTJTRSAgICAgID0gNCwKKwlOSUNfODE5MkNFCT0gNSwKKwlOSUNfODE5MkNVCT0gNiwKKwlOSUNfODE5MkRFCT0gNywKKwlOSUNfODE5MkRVCT0gOCwKK307CisKK2VudW0gcnRfZWVwcm9tX3R5cGUgeworCUVFUFJPTV85M0M0NiwKKwlFRVBST01fOTNDNTYsCisJRUVQUk9NX0JPT1RfRUZVU0UsCit9OworCitlbnVtIGRjbWdfdHhjbWRfb3AgeworCVRYQ01EX1RYUkFfSElTVE9SWV9DVFJMCQk9IDB4RkY5MDAwMDAsCisJVFhDTURfUkVTRVRfVFhfUEtUX0JVRkYJCT0gMHhGRjkwMDAwMSwKKwlUWENNRF9SRVNFVF9SWF9QS1RfQlVGRgkJPSAweEZGOTAwMDAyLAorCVRYQ01EX1NFVF9UWF9EVVJBVElPTgkJPSAweEZGOTAwMDAzLAorCVRYQ01EX1NFVF9SWF9SU1NJCQk9IDB4RkY5MDAwMDQsCisJVFhDTURfU0VUX1RYX1BXUl9UUkFDS0lORwk9IDB4RkY5MDAwMDUsCisJVFhDTURfWFhYWF9DVFJMLAorfTsKKworZW51bSBydF9yZl90eXBlXzgxOXh1IHsKKwlSRl9UWVBFX01JTiA9IDAsCisJUkZfODIyNSwKKwlSRl84MjU2LAorCVJGXzgyNTgsCisJUkZfNjA1MiA9IDQsCisJUkZfUFNFVURPXzExTiA9IDUsCit9OworCitlbnVtIHJmX3N0ZXAgeworCVJGX1NURVBfSU5JVCA9IDAsCisJUkZfU1RFUF9OT1JNQUwsCisJUkZfU1RFUF9NQVgKK307CisKK2VudW0gcnRfc3RhdHVzIHsKKwlSVF9TVEFUVVNfU1VDQ0VTUywKKwlSVF9TVEFUVVNfRkFJTFVSRSwKKwlSVF9TVEFUVVNfUEVORElORywKKwlSVF9TVEFUVVNfUkVTT1VSQ0UKK307CisKK2VudW0gcnRfY3VzdG9tZXJfaWQgeworCVJUX0NJRF9ERUZBVUxUCSAgPSAwLAorCVJUX0NJRF84MTg3X0FMUEhBMCAgICAgID0gMSwKKwlSVF9DSURfODE4N19TRVJDT01NX1BTICA9IDIsCisJUlRfQ0lEXzgxODdfSFdfTEVEICAgICAgPSAzLAorCVJUX0NJRF84MTg3X05FVEdFQVIgICAgID0gNCwKKwlSVF9DSURfV0hRTAkgICAgID0gNSwKKwlSVF9DSURfODE5eF9DQU1FTyAgICAgICA9IDYsCisJUlRfQ0lEXzgxOXhfUlVOVE9QICAgICAgPSA3LAorCVJUX0NJRF84MTl4X1NlbmFvICAgICAgID0gOCwKKwlSVF9DSURfVE9TSElCQQkgID0gOSwKKwlSVF9DSURfODE5eF9OZXRjb3JlICAgICA9IDEwLAorCVJUX0NJRF9OZXR0cm9uaXgJPSAxMSwKKwlSVF9DSURfRExJTksJICAgID0gMTIsCisJUlRfQ0lEX1BST05FVAkgICA9IDEzLAorCVJUX0NJRF9DT1JFR0EJICAgPSAxNCwKKwlSVF9DSURfODE5eF9BTFBIQSAgICAgICA9IDE1LAorCVJUX0NJRF84MTl4X1NpdGVjb20gICAgID0gMTYsCisJUlRfQ0lEX0NDWAkgICAgICA9IDE3LAorCVJUX0NJRF84MTl4X0xlbm92byAgICAgID0gMTgsCisJUlRfQ0lEXzgxOXhfUU1JCSA9IDE5LAorCVJUX0NJRF84MTl4X0VkaW1heF9CZWxraW4gPSAyMCwKKwlSVF9DSURfODE5eF9TZXJjb21tX0JlbGtpbiA9IDIxLAorCVJUX0NJRF84MTl4X0NBTUVPMSA9IDIyLAorCVJUX0NJRF84MTl4X01TSSA9IDIzLAorCVJUX0NJRF84MTl4X0FjZXIgPSAyNCwKKwlSVF9DSURfODE5eF9IUAk9IDI3LAorCVJUX0NJRF84MTl4X0NMRVZPID0gMjgsCisJUlRfQ0lEXzgxOXhfQXJjYWR5YW5fQmVsa2luID0gMjksCisJUlRfQ0lEXzgxOXhfU0FNU1VORyA9IDMwLAorCVJUX0NJRF84MTl4X1dOQ19DT1JFR0EgPSAzMSwKK307CisKK2VudW0gcmVzZXRfdHlwZSB7CisJUkVTRVRfVFlQRV9OT1JFU0VUID0gMHgwMCwKKwlSRVNFVF9UWVBFX05PUk1BTCA9IDB4MDEsCisJUkVTRVRfVFlQRV9TSUxFTlQgPSAweDAyCit9OworCitlbnVtIGljX2luZmVyaW9yaXR5XzgxOTJzIHsKKwlJQ19JTkZFUklPUklUWV9BCSAgICA9IDAsCisJSUNfSU5GRVJJT1JJVFlfQgkgICAgPSAxLAorfTsKKworZW51bSBwY2lfYnJpZGdlX3ZlbmRvciB7CisJUENJX0JSSURHRV9WRU5ET1JfSU5URUwgPSAweDAsCisJUENJX0JSSURHRV9WRU5ET1JfQVRJLAorCVBDSV9CUklER0VfVkVORE9SX0FNRCwKKwlQQ0lfQlJJREdFX1ZFTkRPUl9TSVMgLAorCVBDSV9CUklER0VfVkVORE9SX1VOS05PV04sCisJUENJX0JSSURHRV9WRU5ET1JfTUFYICwKK307CisKK3N0cnVjdCBidWZmZXIgeworCXN0cnVjdCBidWZmZXIgKm5leHQ7CisJdTMyICpidWY7CisJZG1hX2FkZHJfdCBkbWE7CisKK307CisKK3N0cnVjdCBydGxfcmVnX2RlYnVnIHsKKwl1bnNpZ25lZCBpbnQgIGNtZDsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIHR5cGU7CisJCXVuc2lnbmVkIGNoYXIgYWRkcjsKKwkJdW5zaWduZWQgY2hhciBwYWdlOworCQl1bnNpZ25lZCBjaGFyIGxlbmd0aDsKKwl9IGhlYWQ7CisJdW5zaWduZWQgY2hhciBidWZbMHhmZl07Cit9OworCitzdHJ1Y3QgcnRfdHhfcmFoaXMgeworCXUzMgkgICAgIGNja1s0XTsKKwl1MzIJICAgICBvZmRtWzhdOworCXUzMgkgICAgIGh0X21jc1s0XVsxNl07Cit9OworCitzdHJ1Y3QgcnRfc21vb3RoX2RhdGFfNHJmIHsKKwljaGFyCWVsZW1lbnRzWzRdWzEwMF07CisJdTMyCWluZGV4OworCXUzMglUb3RhbE51bTsKKwl1MzIJVG90YWxWYWxbNF07Cit9OworCitzdHJ1Y3QgcnRfc3RhdHMgeworCXVuc2lnbmVkIGxvbmcgdHhyZHU7CisJdW5zaWduZWQgbG9uZyByeHJkdTsKKwl1bnNpZ25lZCBsb25nIHJ4b2s7CisJdW5zaWduZWQgbG9uZyByeGZyYW1nbWVudDsKKwl1bnNpZ25lZCBsb25nIHJ4Y21kcGt0WzhdOworCXVuc2lnbmVkIGxvbmcgcnh1cmJlcnI7CisJdW5zaWduZWQgbG9uZyByeHN0YXRlcnI7CisJdW5zaWduZWQgbG9uZyByeGRhdGFjcmNlcnI7CisJdW5zaWduZWQgbG9uZyByeG1nbXRjcmNlcnI7CisJdW5zaWduZWQgbG9uZyByeGNyY2Vycm1pbjsKKwl1bnNpZ25lZCBsb25nIHJ4Y3JjZXJybWlkOworCXVuc2lnbmVkIGxvbmcgcnhjcmNlcnJtYXg7CisJdW5zaWduZWQgbG9uZyByZWNlaXZlZF9yYXRlX2hpc3RvZ3JhbVs0XVszMl07CisJdW5zaWduZWQgbG9uZyByZWNlaXZlZF9wcmVhbWJsZV9HSVsyXVszMl07CisJdW5zaWduZWQgbG9uZwlyeF9BTVBEVXNpemVfaGlzdG9ncmFtWzVdOworCXVuc2lnbmVkIGxvbmcgcnhfQU1QRFVudW1faGlzdG9ncmFtWzVdOworCXVuc2lnbmVkIGxvbmcgbnVtcGFja2V0X21hdGNoYnNzaWQ7CisJdW5zaWduZWQgbG9uZyBudW1wYWNrZXRfdG9zZWxmOworCXVuc2lnbmVkIGxvbmcgbnVtX3Byb2Nlc3NfcGh5aW5mbzsKKwl1bnNpZ25lZCBsb25nIG51bXFyeV9waHlzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBudW1xcnlfcGh5c3RhdHVzQ0NLOworCXVuc2lnbmVkIGxvbmcgbnVtcXJ5X3BoeXN0YXR1c0hUOworCXVuc2lnbmVkIGxvbmcgcmVjZWl2ZWRfYnd0eXBlWzVdOworCXVuc2lnbmVkIGxvbmcgdHhucGVycjsKKwl1bnNpZ25lZCBsb25nIHR4bnBkcm9wOworCXVuc2lnbmVkIGxvbmcgdHhyZXN1bWVkOworCXVuc2lnbmVkIGxvbmcgcnhvdmVyZmxvdzsKKwl1bnNpZ25lZCBsb25nIHJ4aW50OworCXVuc2lnbmVkIGxvbmcgdHhucG9raW50OworCXVuc2lnbmVkIGxvbmcgaW50czsKKwl1bnNpZ25lZCBsb25nIHNoaW50czsKKwl1bnNpZ25lZCBsb25nIHR4b3ZlcmZsb3c7CisJdW5zaWduZWQgbG9uZyB0eGxwb2tpbnQ7CisJdW5zaWduZWQgbG9uZyB0eGxwZHJvcDsKKwl1bnNpZ25lZCBsb25nIHR4bHBlcnI7CisJdW5zaWduZWQgbG9uZyB0eGJlb2tpbnQ7CisJdW5zaWduZWQgbG9uZyB0eGJlZHJvcDsKKwl1bnNpZ25lZCBsb25nIHR4YmVlcnI7CisJdW5zaWduZWQgbG9uZyB0eGJrb2tpbnQ7CisJdW5zaWduZWQgbG9uZyB0eGJrZHJvcDsKKwl1bnNpZ25lZCBsb25nIHR4YmtlcnI7CisJdW5zaWduZWQgbG9uZyB0eHZpb2tpbnQ7CisJdW5zaWduZWQgbG9uZyB0eHZpZHJvcDsKKwl1bnNpZ25lZCBsb25nIHR4dmllcnI7CisJdW5zaWduZWQgbG9uZyB0eHZvb2tpbnQ7CisJdW5zaWduZWQgbG9uZyB0eHZvZHJvcDsKKwl1bnNpZ25lZCBsb25nIHR4dm9lcnI7CisJdW5zaWduZWQgbG9uZyB0eGJlYWNvbm9raW50OworCXVuc2lnbmVkIGxvbmcgdHhiZWFjb25kcm9wOworCXVuc2lnbmVkIGxvbmcgdHhiZWFjb25lcnI7CisJdW5zaWduZWQgbG9uZyB0eG1hbmFnZW9raW50OworCXVuc2lnbmVkIGxvbmcgdHhtYW5hZ2Vkcm9wOworCXVuc2lnbmVkIGxvbmcgdHhtYW5hZ2VlcnI7CisJdW5zaWduZWQgbG9uZyB0eGNtZHBrdG9raW50OworCXVuc2lnbmVkIGxvbmcgdHhkYXRhcGt0OworCXVuc2lnbmVkIGxvbmcgdHhmZWVkYmFjazsKKwl1bnNpZ25lZCBsb25nIHR4ZmVlZGJhY2tvazsKKwl1bnNpZ25lZCBsb25nIHR4b2t0b3RhbDsKKwl1bnNpZ25lZCBsb25nIHR4b2tieXRlc3RvdGFsOworCXVuc2lnbmVkIGxvbmcgdHhva2lucGVyaW9kOworCXVuc2lnbmVkIGxvbmcgdHhtdWx0aWNhc3Q7CisJdW5zaWduZWQgbG9uZyB0eGJ5dGVzbXVsdGljYXN0OworCXVuc2lnbmVkIGxvbmcgdHhicm9hZGNhc3Q7CisJdW5zaWduZWQgbG9uZyB0eGJ5dGVzYnJvYWRjYXN0OworCXVuc2lnbmVkIGxvbmcgdHh1bmljYXN0OworCXVuc2lnbmVkIGxvbmcgdHhieXRlc3VuaWNhc3Q7CisJdW5zaWduZWQgbG9uZyByeGJ5dGVzdW5pY2FzdDsKKwl1bnNpZ25lZCBsb25nIHR4ZmVlZGJhY2tmYWlsOworCXVuc2lnbmVkIGxvbmcgdHhlcnJ0b3RhbDsKKwl1bnNpZ25lZCBsb25nIHR4ZXJyYnl0ZXN0b3RhbDsKKwl1bnNpZ25lZCBsb25nIHR4ZXJybXVsdGljYXN0OworCXVuc2lnbmVkIGxvbmcgdHhlcnJicm9hZGNhc3Q7CisJdW5zaWduZWQgbG9uZyB0eGVycnVuaWNhc3Q7CisJdW5zaWduZWQgbG9uZyB0eHJldHJ5Y291bnQ7CisJdW5zaWduZWQgbG9uZyB0eGZlZWRiYWNrcmV0cnk7CisJdTgJbGFzdF9wYWNrZXRfcmF0ZTsKKwl1bnNpZ25lZCBsb25nIHNsaWRlX3NpZ25hbF9zdHJlbmd0aFsxMDBdOworCXVuc2lnbmVkIGxvbmcgc2xpZGVfZXZtWzEwMF07CisJdW5zaWduZWQgbG9uZwlzbGlkZV9yc3NpX3RvdGFsOworCXVuc2lnbmVkIGxvbmcgc2xpZGVfZXZtX3RvdGFsOworCWxvbmcgc2lnbmFsX3N0cmVuZ3RoOworCWxvbmcgc2lnbmFsX3F1YWxpdHk7CisJbG9uZyBsYXN0X3NpZ25hbF9zdHJlbmd0aF9pbnBlcmNlbnQ7CisJbG9uZwlyZWN2X3NpZ25hbF9wb3dlcjsKKwl1OCByeF9yc3NpX3BlcmNlbnRhZ2VbNF07CisJdTggcnhfZXZtX3BlcmNlbnRhZ2VbMl07CisJbG9uZyByeFNOUmRCWzRdOworCXN0cnVjdCBydF90eF9yYWhpcyB0eHJhdGU7CisJdTMyIFNsaWRlX0JlYWNvbl9wd2RiWzEwMF07CisJdTMyIFNsaWRlX0JlYWNvbl9Ub3RhbDsKKwlzdHJ1Y3QgcnRfc21vb3RoX2RhdGFfNHJmIGNja19hZGNfcHdkYjsKKwl1MzIJQ3VycmVudFNob3dUeGF0ZTsKK307CisKK3N0cnVjdCBjaGFubmVsX2FjY2Vzc19zZXR0aW5nIHsKKwl1MTYgU0lGU19UaW1lcjsKKwl1MTYgRElGU19UaW1lcjsKKwl1MTYgU2xvdFRpbWVUaW1lcjsKKwl1MTYgRUlGU19UaW1lcjsKKwl1MTYgQ1dtaW5JbmRleDsKKwl1MTYgQ1dtYXhJbmRleDsKK307CisKK2VudW0gdHdvX3BvcnRfc3RhdHVzIHsKKwlUV09fUE9SVF9TVEFUVVNfX0RFRkFVTFRfT05MWSwKKwlUV09fUE9SVF9TVEFUVVNfX0VYVEVOU0lPTl9PTkxZLAorCVRXT19QT1JUX1NUQVRVU19fRVhURU5TSU9OX0ZPTExPV19ERUZBVUxULAorCVRXT19QT1JUX1NUQVRVU19fREVGQVVMVF9HX0VYVEVOU0lPTl9OMjAsCisJVFdPX1BPUlRfU1RBVFVTX19BREhPQywKKwlUV09fUE9SVF9TVEFUVVNfX1dJVEhPVVRfQU5ZX0FTU09DSUFURQorfTsKKworc3RydWN0IHR4YmJnYWluX3N0cnVjdCB7CisJbG9uZwl0eGJiX2lxX2FtcGxpZnlnYWluOworCXUzMgl0eGJiZ2Fpbl92YWx1ZTsKK307CisKK3N0cnVjdCBjY2t0eGJiZ2FpbiB7CisJdTgJY2NrdHhiYl92YWx1ZWFycmF5WzhdOworfTsKKworc3RydWN0IGluaXRfZ2FpbiB7CisJdTgJeGFhZ2Njb3JlMTsKKwl1OAl4YmFnY2NvcmUxOworCXU4CXhjYWdjY29yZTE7CisJdTgJeGRhZ2Njb3JlMTsKKwl1OAljY2E7CisKK307CisKK3N0cnVjdCB0eF9yaW5nIHsKKwl1MzIgKmRlc2M7CisJdTggblN0dWNrQ291bnQ7CisJc3RydWN0IHR4X3JpbmcgKm5leHQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcnRsODE5Ml90eF9yaW5nIHsKKwlzdHJ1Y3QgdHhfZGVzYyAqZGVzYzsKKwlkbWFfYWRkcl90IGRtYTsKKwl1bnNpZ25lZCBpbnQgaWR4OworCXVuc2lnbmVkIGludCBlbnRyaWVzOworCXN0cnVjdCBza19idWZmX2hlYWQgcXVldWU7Cit9OworCisKKworc3RydWN0IHJ0bDgxOXhfb3BzIHsKKwllbnVtIG5pY190IG5pY190eXBlOworCXZvaWQgKCpnZXRfZWVwcm9tX3NpemUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCppbml0X2FkYXB0ZXJfdmFyaWFibGUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCppbml0X2JlZm9yZV9hZGFwdGVyX3N0YXJ0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwlib29sICgqaW5pdGlhbGl6ZV9hZGFwdGVyKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqbGlua19jaGFuZ2UpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCp0eF9maWxsX2Rlc2NyaXB0b3IpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IHR4X2Rlc2MgKnR4X2Rlc2MsCisJCQkJICAgc3RydWN0IGNiX2Rlc2MgKmNiX2Rlc2MsCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJdm9pZCAoKnR4X2ZpbGxfY21kX2Rlc2NyaXB0b3IpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCB0eF9kZXNjX2NtZCAqZW50cnksCisJCQkJICAgICAgIHN0cnVjdCBjYl9kZXNjICpjYl9kZXNjLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKwlib29sICgqcnhfcXVlcnlfc3RhdHVzX2Rlc2NyaXB0b3IpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKnN0YXRzLAorCQkJCQkgICBzdHJ1Y3QgcnhfZGVzYyAqcGRlc2MsCisJCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpOworCWJvb2wgKCpyeF9jb21tYW5kX3BhY2tldF9oYW5kbGVyKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgc3RydWN0IHJ4X2Rlc2MgKnBkZXNjKTsKKwl2b2lkICgqc3RvcF9hZGFwdGVyKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBib29sIHJlc2V0KTsKKwl2b2lkICgqdXBkYXRlX3JhdHJfdGFibGUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCppcnFfZW5hYmxlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqaXJxX2Rpc2FibGUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCppcnFfY2xlYXIpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpyeF9lbmFibGUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCp0eF9lbmFibGUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCppbnRlcnJ1cHRfcmVjb2duaXplZCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHUzMiAqcF9pbnRhLCB1MzIgKnBfaW50Yik7CisJYm9vbCAoKlR4Q2hlY2tTdHVja0hhbmRsZXIpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCWJvb2wgKCpSeENoZWNrU3R1Y2tIYW5kbGVyKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK307CisKK3N0cnVjdCByODE5Ml9wcml2IHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwlzdHJ1Y3QgcGNpX2RldiAqYnJpZGdlX3BkZXY7CisKKwlib29sCQliZmlyc3RfaW5pdDsKKwlib29sCQliZmlyc3RfYWZ0ZXJfZG93bjsKKwlib29sCQlpbml0aWFsaXplZF9hdF9wcm9iZTsKKwlib29sCQliZWluZ19pbml0X2FkYXB0ZXI7CisJYm9vbAkJYkRyaXZlcklzR29pbmdUb1VubG9hZDsKKworCWludAkJaXJxOworCXNob3J0CWlycV9lbmFibGVkOworCisJc2hvcnQJdXA7CisJc2hvcnQJdXBfZmlyc3RfdGltZTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCQl1cGRhdGVfYmVhY29uX3dxOworCXN0cnVjdCBkZWxheWVkX3dvcmsJCXdhdGNoX2RvZ193cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCQl0eHBvd2VyX3RyYWNraW5nX3dxOworCXN0cnVjdCBkZWxheWVkX3dvcmsJCXJmcGF0aF9jaGVja193cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCQlncGlvX2NoYW5nZV9yZl93cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCQlpbml0aWFsZ2Fpbl9vcGVyYXRlX3dxOworCXN0cnVjdCBkZWxheWVkX3dvcmsJCWNoZWNrX2h3X3NjYW5fd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yawkJaHdfc2Nhbl9zaW11X3dxOworCXN0cnVjdCBkZWxheWVkX3dvcmsJCXN0YXJ0X2h3X3NjYW5fd3E7CisKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdAkJKnByaXZfd3E7CisKKwlzdHJ1Y3QgY2hhbm5lbF9hY2Nlc3Nfc2V0dGluZyBDaGFubmVsQWNjZXNzU2V0dGluZzsKKworCXN0cnVjdCBtcF9hZGFwdGVyIE5kaXNBZGFwdGVyOworCisJc3RydWN0IHJ0bDgxOXhfb3BzCQkJKm9wczsKKwlzdHJ1Y3QgcnRsbGliX2RldmljZQkJCSpydGxsaWI7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCQkJcmVzZXRfd3E7CisKKwlzdHJ1Y3QgbG9nX2ludF84MTkwIEludGVycnVwdExvZzsKKworCWVudW0gcnRfY3VzdG9tZXJfaWQgQ3VzdG9tZXJJRDsKKworCisJZW51bSBydF9yZl90eXBlXzgxOXh1IHJmX2NoaXA7CisJZW51bSBpY19pbmZlcmlvcml0eV84MTkycyBJQ19DbGFzczsKKwllbnVtIGh0X2NoYW5uZWxfd2lkdGggQ3VycmVudENoYW5uZWxCVzsKKwlzdHJ1Y3QgYmJfcmVnX2RlZmluaXRpb24gUEhZUmVnRGVmWzRdOworCXN0cnVjdCByYXRlX2FkYXB0aXZlIHJhdGVfYWRhcHRpdmU7CisKKwlzdHJ1Y3QgY2NrdHhiYmdhaW4gY2NrX3R4YmJnYWluX3RhYmxlW0NDS1R4QkJHYWluVGFibGVMZW5ndGhdOworCXN0cnVjdCBjY2t0eGJiZ2FpbiBjY2tfdHhiYmdhaW5fY2gxNF90YWJsZVtDQ0tUeEJCR2FpblRhYmxlTGVuZ3RoXTsKKworCXN0cnVjdCB0eGJiZ2Fpbl9zdHJ1Y3QgdHhiYmdhaW5fdGFibGVbVHhCQkdhaW5UYWJsZUxlbmd0aF07CisKKwllbnVtIGFjbV9tZXRob2QgQWNtTWV0aG9kOworCisJc3RydWN0IHJ0X2Zpcm13YXJlCQkJKnBGaXJtd2FyZTsKKwllbnVtIHJ0bDgxOXhfbG9vcGJhY2sgTG9vcGJhY2tNb2RlOworCWVudW0gZmlybXdhcmVfc291cmNlIGZpcm13YXJlX3NvdXJjZTsKKworCXN0cnVjdCB0aW1lcl9saXN0CQkJd2F0Y2hfZG9nX3RpbWVyOworCXN0cnVjdCB0aW1lcl9saXN0CQkJZnN5bmNfdGltZXI7CisJc3RydWN0IHRpbWVyX2xpc3QJCQlncGlvX3BvbGxpbmdfdGltZXI7CisKKwlzcGlubG9ja190CQkJCWZ3X3NjYW5fbG9jazsKKwlzcGlubG9ja190CQkJCWlycV9sb2NrOworCXNwaW5sb2NrX3QJCQkJaXJxX3RoX2xvY2s7CisJc3BpbmxvY2tfdAkJCQl0eF9sb2NrOworCXNwaW5sb2NrX3QJCQkJcmZfcHNfbG9jazsKKwlzcGlubG9ja190CQkJCXJ3X2xvY2s7CisJc3BpbmxvY2tfdAkJCQlydF9oMmNfbG9jazsKKwlzcGlubG9ja190CQkJCXJmX2xvY2s7CisJc3BpbmxvY2tfdAkJCQlwc19sb2NrOworCisJc3RydWN0IHNrX2J1ZmZfaGVhZAkJcnhfcXVldWU7CisJc3RydWN0IHNrX2J1ZmZfaGVhZAkJc2tiX3F1ZXVlOworCisJc3RydWN0IHRhc2tsZXRfc3RydWN0CQlpcnFfcnhfdGFza2xldDsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJCWlycV90eF90YXNrbGV0OworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAkJaXJxX3ByZXBhcmVfYmVhY29uX3Rhc2tsZXQ7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlCQkJd3hfc2VtOworCXN0cnVjdCBzZW1hcGhvcmUJCQlyZl9zZW07CisJc3RydWN0IG11dGV4CQkJCW11dGV4OworCisJc3RydWN0IHJ0X3N0YXRzIHN0YXRzOworCXN0cnVjdCBpd19zdGF0aXN0aWNzCQkJd3N0YXRzOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeQkJKmRpcl9kZXY7CisKKwlzaG9ydCAoKnJmX3NldF9zZW5zKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzaG9ydCBzZW5zKTsKKwl1OCAoKnJmX3NldF9jaGFuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBjaCk7CisJdm9pZCAoKnJmX2Nsb3NlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqcmZfaW5pdCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwlzdHJ1Y3QgcnhfZGVzYyAqcnhfcmluZ1tNQVhfUlhfUVVFVUVdOworCXN0cnVjdCBza19idWZmCSpyeF9idWZbTUFYX1JYX1FVRVVFXVtNQVhfUlhfQ09VTlRdOworCWRtYV9hZGRyX3QJcnhfcmluZ19kbWFbTUFYX1JYX1FVRVVFXTsKKwl1bnNpZ25lZCBpbnQJcnhfaWR4W01BWF9SWF9RVUVVRV07CisJaW50CQlyeHJpbmdjb3VudDsKKwl1MTYJCXJ4YnVmZmVyc2l6ZTsKKworCXU2NAkJTGFzdFJ4RGVzY1RTRjsKKworCXUxNgkJRWFybHlSeFRocmVzaG9sZDsKKwl1MzIJCVJlY2VpdmVDb25maWc7CisJdTgJCUFjbUNvbnRyb2w7CisJdTgJCVJGUHJvZ1R5cGU7CisJdTgJCXJldHJ5X2RhdGE7CisJdTgJCXJldHJ5X3J0czsKKwl1MTYJCXJ0czsKKworCXN0cnVjdCBydGw4MTkyX3R4X3JpbmcgdHhfcmluZ1tNQVhfVFhfUVVFVUVfQ09VTlRdOworCWludAkJIHR4cmluZ2NvdW50OworCWludAkJdHhidWZmc2l6ZTsKKwlpbnQJCXR4ZndidWZmZXJzaXplOworCWF0b21pY190CXR4X3BlbmRpbmdbMHgxMF07CisKKwl1MTYJCVNob3J0UmV0cnlMaW1pdDsKKwl1MTYJCUxvbmdSZXRyeUxpbWl0OworCXUzMgkJVHJhbnNtaXRDb25maWc7CisJdTgJCVJlZ0NXaW5NaW47CisJdTgJCWtlZXBBbGl2ZUxldmVsOworCisJYm9vbAkJc3dfcmFkaW9fb247CisJYm9vbAkJYkh3UmFkaW9PZmY7CisJYm9vbAkJcHdyZG93bjsKKwlib29sCQlibGlua2VkX2luZ3BpbzsKKwl1OAkJcG9sbGluZ190aW1lcl9vbjsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJZW51bSBjYXJkX3R5cGUgeworCQlQQ0ksIE1JTklQQ0ksCisJCUNBUkRCVVMsIFVTQgorCX0gY2FyZF90eXBlOworCisJc3RydWN0IHdvcmtfc3RydWN0IHFvc19hY3RpdmF0ZTsKKworCXU4IGJJYnNzQ29vcmRpbmF0b3I7CisKKwlzaG9ydAlwcm9taXNjOworCXNob3J0CWNyY21vbjsKKworCWludCB0eGJlYWNvbmNvdW50OworCisJc2hvcnQJY2hhbjsKKwlzaG9ydAlzZW5zOworCXNob3J0CW1heF9zZW5zOworCXUzMiByeF9wcmV2bGVuOworCisJdTggU2NhbkRlbGF5OworCWJvb2wgcHNfZm9yY2U7CisKKwl1MzIgaXJxX21hc2tbMl07CisKKwl1OCBSZl9Nb2RlOworCWVudW0gbmljX3QgY2FyZF84MTkyOworCXU4IGNhcmRfODE5Ml92ZXJzaW9uOworCisJc2hvcnQJZW5hYmxlX2dwaW8wOworCisJdTggcmZfdHlwZTsKKwl1OCBJQ19DdXQ7CisJY2hhciBuaWNrW0lXX0VTU0lEX01BWF9TSVpFICsgMV07CisKKwl1OCBSZWdCY25DdHJsVmFsOworCWJvb2wgYkh3QW50RGl2OworCisJYm9vbCBiVEtJUGluTm1vZGVGcm9tUmVnOworCWJvb2wgYldFUGluTm1vZGVGcm9tUmVnOworCisJYm9vbCBiTGVkT3BlbkRyYWluOworCisJdTggY2hlY2tfcm9hbWluZ19jbnQ7CisKKwlib29sIGJJZ25vcmVTaWxlbnRSZXNldDsKKwl1MzIgU2lsZW50UmVzZXRSeFNvbHROdW07CisJdTMyIFNpbGVudFJlc2V0UnhTbG90SW5kZXg7CisJdTMyIFNpbGVudFJlc2V0UnhTdHVja0V2ZW50W01BWF9TSUxFTlRfUkVTRVRfUlhfU0xPVF9OVU1dOworCisJdm9pZCAqc2Nhbl9jbWQ7CisJdTggaHdzY2FuX2J3XzQwOworCisJdTE2IG5yeEFNUERVX3NpemU7CisJdTggbnJ4QU1QRFVfYWdncl9udW07CisKKwl1MzIgbGFzdF9yeGRlc2NfdHNmX2hpZ2g7CisJdTMyIGxhc3RfcnhkZXNjX3RzZl9sb3c7CisKKwl1MTYgYmFzaWNfcmF0ZTsKKwl1OCBzaG9ydF9wcmVhbWJsZTsKKwl1OCBkb3QxMUN1cnJlbnRQcmVhbWJsZU1vZGU7CisJdTggc2xvdF90aW1lOworCXUxNiBTaWZzVGltZTsKKworCXU4IFJlZ1dpcmVsZXNzTW9kZTsKKworCXU4IGZpcm13YXJlX3ZlcnNpb247CisJdTE2IEZpcm13YXJlU3ViVmVyc2lvbjsKKwl1MTYgcmZfcGF0aG1hcDsKKwlib29sIEF1dG9sb2FkRmFpbEZsYWc7CisKKwl1OCBSZWdQY2lBU1BNOworCXU4IFJlZ0FNRFBjaUFTUE07CisJdTggUmVnSHdTd1JmT2ZmRDM7CisJdTggUmVnU3VwcG9ydFBjaUFTUE07CisJYm9vbCBiU3VwcG9ydEFTUE07CisKKwl1MzIgUmZSZWdDaG5sVmFsWzJdOworCisJdTggU2hvd1JhdGVNb2RlOworCXU4IFJBVFJUYWJsZUJpdG1hcDsKKworCXU4IEVmdXNlTWFwWzJdW0hXU0VUX01BWF9TSVpFXzkyU107CisJdTE2IEVmdXNlVXNlZEJ5dGVzOworCXU4IEVmdXNlVXNlZFBlcmNlbnRhZ2U7CisKKwlzaG9ydAllcHJvbXR5cGU7CisJdTE2IGVlcHJvbV92aWQ7CisJdTE2IGVlcHJvbV9kaWQ7CisJdTE2IGVlcHJvbV9zdmlkOworCXUxNiBlZXByb21fc21pZDsKKwl1OCBlZXByb21fQ3VzdG9tZXJJRDsKKwl1MTYgZWVwcm9tX0NoYW5uZWxQbGFuOworCXU4IGVlcHJvbV92ZXJzaW9uOworCisJdTggRUVQUk9NUmVndWxhdG9yeTsKKwl1OCBFRVBST01Qd3JHcm91cFsyXVszXTsKKwl1OCBFRVBST01PcHRpb25hbDsKKworCXU4IEVFUFJPTVR4UG93ZXJMZXZlbENDS1sxNF07CisJdTggRUVQUk9NVHhQb3dlckxldmVsT0ZETTI0R1sxNF07CisJdTggRUVQUk9NVHhQb3dlckxldmVsT0ZETTVHWzI0XTsKKwl1OCBFRVBST01SZkFDQ0tDaG5sMVR4UHdMZXZlbFszXTsKKwl1OCBFRVBST01SZkFPZmRtQ2hubFR4UHdMZXZlbFszXTsKKwl1OCBFRVBST01SZkNDQ0tDaG5sMVR4UHdMZXZlbFszXTsKKwl1OCBFRVBST01SZkNPZmRtQ2hubFR4UHdMZXZlbFszXTsKKwl1MTYgRUVQUk9NVHhQb3dlckRpZmY7CisJdTE2IEVFUFJPTUFudFB3RGlmZjsKKwl1OCBFRVBST01UaGVybWFsTWV0ZXI7CisJdTggRUVQUk9NUHdEaWZmOworCXU4IEVFUFJPTUNyeXN0YWxDYXA7CisKKwl1OCBFRVBST01CbHVldG9vdGhDb2V4aXN0OworCXU4IEVFUFJPTUJsdWV0b290aFR5cGU7CisJdTggRUVQUk9NQmx1ZXRvb3RoQW50TnVtOworCXU4IEVFUFJPTUJsdWV0b290aEFudElzb2xhdGlvbjsKKwl1OCBFRVBST01CbHVldG9vdGhSYWRpb1NoYXJlZDsKKworCisJdTggRUVQUk9NU3VwcG9ydFdvV0xBTjsKKwl1OCBFRVBST01Cb2FyZFR5cGU7CisJdTggRUVQUk9NX0RlZl9WZXI7CisJdTggRUVQUk9NSFQyVF9UeFB3cls2XTsKKwl1OCBFRVBST01UU1NJX0E7CisJdTggRUVQUk9NVFNTSV9COworCXU4IEVFUFJPTVR4UG93ZXJMZXZlbENDS19WMVszXTsKKwl1OCBFRVBST01MZWdhY3lIVFR4UG93ZXJEaWZmOworCisJdTggQmx1ZXRvb3RoQ29leGlzdDsKKworCXU4IENyeXN0YWxDYXA7CisJdTggVGhlcm1hbE1ldGVyWzJdOworCisJdTE2IEZ3Q21kSU9NYXA7CisJdTMyIEZ3Q21kSU9QYXJhbTsKKworCXU4IFN3Q2hubEluUHJvZ3Jlc3M7CisJdTggU3dDaG5sU3RhZ2U7CisJdTggU3dDaG5sU3RlcDsKKwl1OCBTZXRCV01vZGVJblByb2dyZXNzOworCisJdTggbkN1cjQwTWh6UHJpbWVTQzsKKworCXUzMiBSZlJlZzBWYWx1ZVs0XTsKKwl1OCBOdW1Ub3RhbFJGUGF0aDsKKwlib29sIGJyZnBhdGhfcnhlbmFibGVbNF07CisKKwlib29sIGJUWFBvd2VyRGF0YVJlYWRGcm9tRUVQT1JNOworCisJdTE2IFJlZ0NoYW5uZWxQbGFuOworCXUxNiBDaGFubmVsUGxhbjsKKwlib29sIGJDaG5sUGxhbkZyb21IVzsKKworCWJvb2wgUmVnUmZPZmY7CisJYm9vbCBpc1JGT2ZmOworCWJvb2wgYkluUG93ZXJTYXZlTW9kZTsKKwl1OCBiSHdSZk9mZkFjdGlvbjsKKworCWJvb2wgYXNwbV9jbGtyZXFfZW5hYmxlOworCXUzMiBwY2lfYnJpZGdlX3ZlbmRvcjsKKwl1OCBSZWdIb3N0UGNpQVNQTVNldHRpbmc7CisJdTggUmVnRGV2aWNlUGNpQVNQTVNldHRpbmc7CisKKwlib29sIFJGQ2hhbmdlSW5Qcm9ncmVzczsKKwlib29sIFNldFJGUG93ZXJTdGF0ZUluUHJvZ3Jlc3M7CisJYm9vbCBiZGlzYWJsZV9uaWM7CisKKwl1OCBwd3JHcm91cENudDsKKworCXU4IFRoZXJtYWxWYWx1ZV9MQ0s7CisJdTggVGhlcm1hbFZhbHVlX0lRSzsKKwlib29sIGJSZlBpRW5hYmxlOworCisJdTMyIEFQS291dHB1dFsyXVsyXTsKKwlib29sIGJBUEtkb25lOworCisJbG9uZyBSZWdFOTQ7CisJbG9uZyBSZWdFOUM7CisJbG9uZyBSZWdFQjQ7CisJbG9uZyBSZWdFQkM7CisKKwl1MzIgUmVnQzA0OworCXUzMiBSZWc4NzQ7CisJdTMyIFJlZ0MwODsKKwl1MzIgQUREQV9iYWNrdXBbMTZdOworCXUzMiBJUUtfTUFDX2JhY2t1cFszXTsKKworCWJvb2wgU2V0RndDbWRJblByb2dyZXNzOworCXU4IEN1cnJlbnRGd0NtZElPOworCisJdTggcnNzaV9sZXZlbDsKKworCWJvb2wgYkluZm9ybUZXRHJpdmVyQ29udHJvbERNOworCXU4IFB3ckdyb3VwSFQyMFsyXVsxNF07CisJdTggUHdyR3JvdXBIVDQwWzJdWzE0XTsKKworCXU4IFRoZXJtYWxWYWx1ZTsKKwlsb25nIEVudHJ5TWluVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7CisJbG9uZyBFbnRyeU1heFVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOworCXU4IER5bmFtaWNUeEhpZ2hQb3dlckx2bDsKKwl1OCBMYXN0RFRQTHZsOworCXUzMiBDdXJyZW50UkFUUjA7CisJc3RydWN0IGZhbHNlX2FsYXJtX3N0YXRzIEZhbHNlQWxtQ250OworCisJdTggRE1GbGFnOworCXU4IERNX1R5cGU7CisKKwl1OCBDY2tQd0VubDsKKwl1MTYgVFNTSV8xM2RCbTsKKwl1MzIgUHdyX1RyYWNrOworCXU4IENDS1ByZXNlbnRBdHRlbnR1YXRpb25fMjBNZGVmYXVsdDsKKwl1OCBDQ0tQcmVzZW50QXR0ZW50dWF0aW9uXzQwTWRlZmF1bHQ7CisJY2hhciBDQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2U7CisJY2hhciBDQ0tQcmVzZW50QXR0ZW50dWF0aW9uOworCXU4IGJDY2tIaWdoUG93ZXI7CisJbG9uZyB1bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiOworCWxvbmcgdW5kZWNvcmF0ZWRfc21vb3RoZWRfY2NrX2FkY19wd2RiWzRdOworCisJdTMyIE1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WzZdOworCXUzMiBDQ0tUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldDsKKwl1OCBUeFBvd2VyTGV2ZWxDQ0tbMTRdOworCXU4IFR4UG93ZXJMZXZlbENDS19BWzE0XTsKKwl1OCBUeFBvd2VyTGV2ZWxDQ0tfQ1sxNF07CisJdTgJCVR4UG93ZXJMZXZlbE9GRE0yNEdbMTRdOworCXU4CQlUeFBvd2VyTGV2ZWxPRkRNNUdbMTRdOworCXU4CQlUeFBvd2VyTGV2ZWxPRkRNMjRHX0FbMTRdOworCXU4CQlUeFBvd2VyTGV2ZWxPRkRNMjRHX0NbMTRdOworCXU4CQlMZWdhY3lIVFR4UG93ZXJEaWZmOworCXU4CQlUeFBvd2VyRGlmZjsKKwlzOAkJUkZfQ19UeFB3RGlmZjsKKwlzOAkJUkZfQl9UeFB3RGlmZjsKKwl1OAkJUmZUeFB3ckxldmVsQ2NrWzJdWzE0XTsKKwl1OAkJUmZUeFB3ckxldmVsT2ZkbTFUWzJdWzE0XTsKKwl1OAkJUmZUeFB3ckxldmVsT2ZkbTJUWzJdWzE0XTsKKwl1OAkJQW50ZW5uYVR4UHdEaWZmWzNdOworCXU4CQlUeFB3ckh0MjBEaWZmWzJdWzE0XTsKKwl1OAkJVHhQd3JMZWdhY3lIdERpZmZbMl1bMTRdOworCXU4CQlUeFB3clNhZmV0eUZsYWc7CisJdTgJCUhUMlRfVHhQd3JfQVsxNF07CisJdTgJCUhUMlRfVHhQd3JfQlsxNF07CisJdTgJCUN1cnJlbnRDY2tUeFB3cklkeDsKKwl1OAkJQ3VycmVudE9mZG0yNEdUeFB3cklkeDsKKworCWJvb2wJCWJkeW5hbWljX3R4cG93ZXI7CisJYm9vbAkJYkR5bmFtaWNUeEhpZ2hQb3dlcjsKKwlib29sCQliRHluYW1pY1R4TG93UG93ZXI7CisJYm9vbAkJYkxhc3REVFBGbGFnX0hpZ2g7CisJYm9vbAkJYkxhc3REVFBGbGFnX0xvdzsKKworCWJvb2wJCWJzdG9yZV9sYXN0X2R0cGZsYWc7CisJYm9vbAkJYnN0YXJ0X3R4Y3RybF9ieWR0cDsKKworCXU4CQlyZmFfdHhwb3dlcnRyYWNraW5naW5kZXg7CisJdTgJCXJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsOworCXU4CQlyZmFfdHhwb3dlcnRyYWNraW5nX2RlZmF1bHQ7CisJdTgJCXJmY190eHBvd2VydHJhY2tpbmdpbmRleDsKKwl1OAkJcmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWw7CisJdTgJCXJmY190eHBvd2VydHJhY2tpbmdfZGVmYXVsdDsKKwlib29sCQlidHhwb3dlcl90cmFja2luZzsKKwlib29sCQliY2NrX2luX2NoMTQ7CisKKwl1OAkJVHhQb3dlclRyYWNrQ29udHJvbDsKKwl1OAkJdHhwb3dlcl9jb3VudDsKKwlib29sCQlidHhwb3dlcl90cmFja2luZ0luaXQ7CisKKwl1OAkJT0ZETV9pbmRleFsyXTsKKwl1OAkJQ0NLX2luZGV4OworCisJdTgJCVJlY29yZF9DQ0tfMjBNaW5kZXg7CisJdTgJCVJlY29yZF9DQ0tfNDBNaW5kZXg7CisKKwlzdHJ1Y3QgaW5pdF9nYWluIGluaXRnYWluX2JhY2t1cDsKKwl1OAkJRGVmYXVsdEluaXRpYWxHYWluWzRdOworCWJvb2wJCWJpc19hbnlfbm9uYmVwa3RzOworCWJvb2wJCWJjdXJyZW50X3R1cmJvX0VEQ0E7CisJYm9vbAkJYmlzX2N1cl9yZGxzdGF0ZTsKKworCWJvb2wJCWJDQ0tpbkNIMTQ7CisKKwl1OAkJTWlkSGlnaFB3clRIUl9MMTsKKwl1OAkJTWlkSGlnaFB3clRIUl9MMjsKKworCWJvb2wJCWJmc3luY19wcm9jZXNzaW5nOworCXUzMgkJcmF0ZV9yZWNvcmQ7CisJdTMyCQlyYXRlQ291bnREaWZmUmVjb3JkOworCXUzMgkJQ29udGl1bmVEaWZmQ291bnQ7CisJYm9vbAkJYnN3aXRjaF9mc3luYzsKKwl1OAkJZnJhbWVzeW5jOworCXUzMgkJZnJhbWVzeW5jQzM0OworCXU4CQlmcmFtZXN5bmNNb25pdG9yOworCisJYm9vbAkJYkRNSW5pdGlhbEdhaW5FbmFibGU7CisJYm9vbAkJTXV0dWFsQXV0aGVudGljYXRpb25GYWlsOworCisJYm9vbAkJYkRpc2FibGVGcmFtZUJ1cnN0aW5nOworCisJdTMyCQlyZXNldF9jb3VudDsKKwlib29sCQlicGJjX3ByZXNzZWQ7CisKKwl1MzIJCXR4cG93ZXJfY2hlY2tjbnQ7CisJdTMyCQl0eHBvd2VyX3RyYWNraW5nX2NhbGxiYWNrX2NudDsKKwl1OAkJdGhlcm1hbF9yZWFkX3ZhbFs0MF07CisJdTgJCXRoZXJtYWxfcmVhZGJhY2tfaW5kZXg7CisJdTMyCQljY2t0eHBvd2VyX2FkanVzdGNudF9ub3RfY2gxNDsKKwl1MzIJCWNja3R4cG93ZXJfYWRqdXN0Y250X2NoMTQ7CisKKwllbnVtIHJlc2V0X3R5cGUgUmVzZXRQcm9ncmVzczsKKwlib29sCQliRm9yY2VkU2lsZW50UmVzZXQ7CisJYm9vbAkJYkRpc2FibGVOb3JtYWxSZXNldENoZWNrOworCXUxNgkJVHhDb3VudGVyOworCXUxNgkJUnhDb3VudGVyOworCWludAkJSXJwUGVuZGluZ0NvdW50OworCWJvb2wJCWJSZXNldEluUHJvZ3Jlc3M7CisJYm9vbAkJZm9yY2VfcmVzZXQ7CisJYm9vbAkJZm9yY2VfbHBzOworCXU4CQlJbml0aWFsR2Fpbk9wZXJhdGVUeXBlOworCisJYm9vbAkJY2hhbl9mb3JjZWQ7CisJYm9vbAkJYlNpbmdsZUNhcnJpZXI7CisJYm9vbAkJUmVnQm9hcmQ7CisJYm9vbAkJYkNja0NvbnRUeDsKKwlib29sCQliT2ZkbUNvbnRUeDsKKwlib29sCQliU3RhcnRDb250VHg7CisJdTgJCVJlZ1BhTW9kZWw7CisJdTgJCWJ0TXBDY2tUeFBvd2VyOworCXU4CQlidE1wT2ZkbVR4UG93ZXI7CisKKwl1MzIJCU1wdEFjdFR5cGU7CisJdTMyCQlNcHRJb09mZnNldDsKKwl1MzIJCU1wdElvVmFsdWU7CisJdTMyCQlNcHRSZlBhdGg7CisKKwl1MzIJCU1wdEJhbmRXaWR0aDsKKwl1MzIJCU1wdFJhdGVJbmRleDsKKwl1OAkJTXB0Q2hhbm5lbFRvU3c7CisJdTMyCU1wdFJDUjsKKworCXU4CQlQd3JEb21haW5Qcm90ZWN0OworCXU4CQlIMkNUeENtZFNlcTsKKworCit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHJ0bDgxOXhfZXRodG9vbF9vcHM7CisKK3ZvaWQgcnRsODE5Ml90eF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzaG9ydCBydGw4MTkyX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpOworCit1OCByZWFkX25pY19pb19ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KTsKK3UzMiByZWFkX25pY19pb19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCk7Cit1MTYgcmVhZF9uaWNfaW9fd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCkgOwordm9pZCB3cml0ZV9uaWNfaW9fYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCwgdTggeSk7Cit2b2lkIHdyaXRlX25pY19pb193b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LCB1MTYgeSk7Cit2b2lkIHdyaXRlX25pY19pb19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCwgdTMyIHkpOworCit1OCByZWFkX25pY19ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KTsKK3UzMiByZWFkX25pY19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCk7Cit1MTYgcmVhZF9uaWNfd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCkgOwordm9pZCB3cml0ZV9uaWNfYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCwgdTggeSk7Cit2b2lkIHdyaXRlX25pY193b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LCB1MTYgeSk7Cit2b2lkIHdyaXRlX25pY19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCwgdTMyIHkpOworCit2b2lkIGZvcmNlX3BjaV9wb3N0aW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCit2b2lkIHJ0bDgxOTJfcnhfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICopOwordm9pZCBydGw4MTkyX3R4X2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKKworaW50IHJ0bDgxOTJfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTkyX2hhcmRfZGF0YV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgaW50IHJhdGUpOwordm9pZCBydGw4MTkyX2RhdGFfaGFyZF9zdG9wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTkyX2RhdGFfaGFyZF9yZXN1bWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxOTJfcmVzdGFydCh2b2lkICpkYXRhKTsKK3ZvaWQgcnRsODE5eF93YXRjaGRvZ193cWNhbGxiYWNrKHZvaWQgKmRhdGEpOwordm9pZCBydGw4MTkyX2h3X3NsZWVwX3dxKHZvaWQgKmRhdGEpOwordm9pZCB3YXRjaF9kb2dfdGltZXJfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKTsKK3ZvaWQgcnRsODE5Ml9pcnFfcnhfdGFza2xldChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7Cit2b2lkIHJ0bDgxOTJfaXJxX3R4X3Rhc2tsZXQoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOworaW50IHJ0bDgxOTJfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBib29sIHNodXRkb3ducmYpOworaW50IHJ0bDgxOTJfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxOTJfY29tbWl0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTkyX3NldF9jaGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGNoKTsKKwordm9pZCBjaGVja19yZmN0cmxfZ3Bpb190aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpOworCit2b2lkIHJ0bDgxOTJfaHdfd2FrZXVwX3dxKHZvaWQgKmRhdGEpOworaXJxcmV0dXJuX3R5cGUgcnRsODE5Ml9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqbmV0ZGV2LCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKK3Nob3J0IHJ0bDgxOTJfcGNpX2luaXRkZXNjcmluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwordm9pZCBydGw4MTkyX2NhbmNlbF9kZWZlcnJlZF93b3JrKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KTsKKworaW50IF9ydGw4MTkyX3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGJvb2wgaXNfc2lsZW50X3Jlc2V0KTsKKworc2hvcnQgcnRsODE5Ml9pc190eF9xdWV1ZV9lbXB0eShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgcnRsODE5Ml9pcnFfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwordm9pZCBydGw4MTkyX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxOTJfcGNpX3Jlc2V0ZGVzY3Jpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxOTJfU2V0V2lyZWxlc3NNb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IHdpcmVsZXNzX21vZGUpOwordm9pZCBydGw4MTkyX2lycV9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxOTJfY29uZmlnX3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2ICpyYXRlX2NvbmZpZyk7Cit2b2lkIHJ0bDgxOTJfdXBkYXRlX2NhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MTYgY2FwKTsKK3ZvaWQgcnRsODE5Ml9pcnFfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwordm9pZCBydGw4MTl4X1VwZGF0ZVJ4UGt0VGltZVN0YW1wKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpzdGF0cyk7Citsb25nIHJ0bDgxOXhfdHJhbnNsYXRlX3RvZGJtKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LCB1OCBzaWduYWxfc3RyZW5ndGhfaW5kZXgpOwordm9pZCBydGw4MTl4X3VwZGF0ZV9yeHNpZ25hbHN0YXRpc3RpY3M4MTkwcGNpKHN0cnVjdCByODE5Ml9wcml2ICpwcml2LAorCQkJCSAgICAgIHN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKnBwcmV2aW91c19zdGF0cyk7Cit1OCBydGw4MTl4X2V2bV9kYnRvcGVyY2VudGFnZShjaGFyIHZhbHVlKTsKK3ZvaWQgcnRsODE5eF9wcm9jZXNzX2Nja19yeHBhdGhzZWwoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYsCisJCQkJICAgc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqcHByZXZpb3VzX3N0YXRzKTsKK3U4IHJ0bDgxOXhfcXVlcnlfcnhwd3JwZXJjZW50YWdlKGNoYXIgYW50cG93ZXIpOwordm9pZCBydGw4MTkyX3JlY29yZF9yeGRlc2NfZm9ybGF0ZXJ1c2Uoc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqcHNyY19zdGF0cywKKwkJCQkgICAgICAgc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqcHRhcmdldF9zdGF0cyk7Citib29sIE5pY0lGRW5hYmxlTklDKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworYm9vbCBOaWNJRkRpc2FibGVOSUMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK2Jvb2wgTWdudEFjdFNldF9SRl9TdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIGVudW0gcnRfcmZfcG93ZXJfc3RhdGUgU3RhdGVUb1NldCwKKwkJCSBSVF9SRl9DSEFOR0VfU09VUkNFIENoYW5nZVNvdXJjZSwKKwkJCSBib29sCVByb3RlY3RPck5vdCk7Cit2b2lkIEFjdFVwZGF0ZUNoYW5uZWxBY2Nlc3NTZXR0aW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBlbnVtIHdpcmVsZXNzX21vZGUgV2lyZWxlc3NNb2RlLAorCQkJICAgc3RydWN0IGNoYW5uZWxfYWNjZXNzX3NldHRpbmcgKkNobmxBY2Nlc3NTZXR0aW5nKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL3J0bF9jcnlwdG8uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxfY3J5cHRvLmgKc2ltaWxhcml0eSBpbmRleCA3NCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9ydGxfY3J5cHRvLmgKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxfY3J5cHRvLmgKaW5kZXggY2NmNmFlNy4uZWU1N2MwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9ydGxfY3J5cHRvLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9jcnlwdG8uaApAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAKICNkZWZpbmUgY3J5cHRvX3JlZ2lzdGVyX2FsZyBjcnlwdG9fcmVnaXN0ZXJfYWxnX3JzbAogI2RlZmluZSBjcnlwdG9fdW5yZWdpc3Rlcl9hbGcgY3J5cHRvX3VucmVnaXN0ZXJfYWxnX3JzbApAQCAtNTIsMTAgKzUyLDEwIEBACiAKICNkZWZpbmUgQ1JZUFRPX1RGTV9SRVFfV0VBS19LRVkJCTB4MDAwMDAxMDAKICNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfV0VBS19LRVkJCTB4MDAxMDAwMDAKLSNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU4gICAJMHgwMDIwMDAwMAotI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfS0VZX1NDSEVEIAkweDAwNDAwMDAwCi0jZGVmaW5lIENSWVBUT19URk1fUkVTX0JBRF9CTE9DS19MRU4gCTB4MDA4MDAwMDAKLSNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfQkFEX0ZMQUdTIAkweDAxMDAwMDAwCisjZGVmaW5lIENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOCTB4MDAyMDAwMDAKKyNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9TQ0hFRAkweDAwNDAwMDAwCisjZGVmaW5lIENSWVBUT19URk1fUkVTX0JBRF9CTE9DS19MRU4JMHgwMDgwMDAwMAorI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfRkxBR1MJMHgwMTAwMDAwMAogCiAvKgogICogTWlzY2VsbGFuZW91cyBzdHVmZi4KQEAgLTczLDcgKzczLDcgQEAKIAl1bnNpZ25lZCBpbnQgY2lhX21pbl9rZXlzaXplOwogCXVuc2lnbmVkIGludCBjaWFfbWF4X2tleXNpemU7CiAJaW50ICgqY2lhX3NldGtleSkodm9pZCAqY3R4LCBjb25zdCB1OCAqa2V5LAotCSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4sIHUzMiAqZmxhZ3MpOworCQkJICB1bnNpZ25lZCBpbnQga2V5bGVuLCB1MzIgKmZsYWdzKTsKIAl2b2lkICgqY2lhX2VuY3J5cHQpKHZvaWQgKmN0eCwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7CiAJdm9pZCAoKmNpYV9kZWNyeXB0KSh2b2lkICpjdHgsIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOwogfTsKQEAgLTg0LDE2ICs4NCwxNiBAQAogCXZvaWQgKCpkaWFfdXBkYXRlKSh2b2lkICpjdHgsIGNvbnN0IHU4ICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKTsKIAl2b2lkICgqZGlhX2ZpbmFsKSh2b2lkICpjdHgsIHU4ICpvdXQpOwogCWludCAoKmRpYV9zZXRrZXkpKHZvaWQgKmN0eCwgY29uc3QgdTggKmtleSwKLQkgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQga2V5bGVuLCB1MzIgKmZsYWdzKTsKKwkJCSAgdW5zaWduZWQgaW50IGtleWxlbiwgdTMyICpmbGFncyk7CiB9OwogCiBzdHJ1Y3QgY29tcHJlc3NfYWxnIHsKIAlpbnQgKCpjb2FfaW5pdCkodm9pZCAqY3R4KTsKIAl2b2lkICgqY29hX2V4aXQpKHZvaWQgKmN0eCk7CiAJaW50ICgqY29hX2NvbXByZXNzKSh2b2lkICpjdHgsIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAotCSAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKKwkJCSAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pOwogCWludCAoKmNvYV9kZWNvbXByZXNzKSh2b2lkICpjdHgsIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAotCSAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pOworCQkJICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKIH07CiAKICNkZWZpbmUgY3JhX2NpcGhlcgljcmFfdS5jaXBoZXIKQEAgLTEzOSwxNSArMTM5LDE1IEBACiAJdW5zaWduZWQgaW50IGNpdF9pdnNpemU7CiAJdTMyIGNpdF9tb2RlOwogCWludCAoKmNpdF9zZXRrZXkpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbik7CisJCQkgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pOwogCWludCAoKmNpdF9lbmNyeXB0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAogCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCiAJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKIAkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpOwogCWludCAoKmNpdF9lbmNyeXB0X2l2KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCSAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLQkgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0JICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdik7CisJCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkJICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KTsKIAlpbnQgKCpjaXRfZGVjcnlwdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKIAkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAogCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCkBAIC0xNjIsMjQgKzE2MiwyMSBAQAogc3RydWN0IGRpZ2VzdF90Zm0gewogCXZvaWQgKCpkaXRfaW5pdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7CiAJdm9pZCAoKmRpdF91cGRhdGUpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0JICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuc2cpOworCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5zZyk7CiAJdm9pZCAoKmRpdF9maW5hbCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCk7CiAJdm9pZCAoKmRpdF9kaWdlc3QpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCi0JICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuc2csIHU4ICpvdXQpOworCQkJICAgdW5zaWduZWQgaW50IG5zZywgdTggKm91dCk7CiAJaW50ICgqZGl0X3NldGtleSkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKTsKLSNpZmRlZiBDT05GSUdfQ1JZUFRPX0hNQUMKLQl2b2lkICpkaXRfaG1hY19ibG9jazsKLSNlbmRpZgorCQkJICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKTsKIH07CiAKIHN0cnVjdCBjb21wcmVzc190Zm0gewogCWludCAoKmNvdF9jb21wcmVzcykoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAotCSAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKKwkJCSAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKKwkJCSAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pOwogCWludCAoKmNvdF9kZWNvbXByZXNzKShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotCSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKLQkgICAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKKwkJCSAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAorCQkJICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKIH07CiAKICNkZWZpbmUgY3J0X2NpcGhlcgljcnRfdS5jaXBoZXIKQEAgLTI3Nyw4ICsyNzQsOCBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2RpZ2VzdF91cGRhdGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuc2cpCisJCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqc2csCisJCQkJCXVuc2lnbmVkIGludCBuc2cpCiB7CiAJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfRElHRVNUKTsKIAl0Zm0tPmNydF9kaWdlc3QuZGl0X3VwZGF0ZSh0Zm0sIHNnLCBuc2cpOwpAQCAtMjkxLDE1ICsyODgsMTUgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19kaWdlc3RfZGlnZXN0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnNnLCB1OCAqb3V0KQorCQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkJCQl1bnNpZ25lZCBpbnQgbnNnLCB1OCAqb3V0KQogewogCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7CiAJdGZtLT5jcnRfZGlnZXN0LmRpdF9kaWdlc3QodGZtLCBzZywgbnNnLCBvdXQpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fZGlnZXN0X3NldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKKwkJCQkgICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKIHsKIAlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9ESUdFU1QpOwogCWlmICh0Zm0tPmNydF9kaWdlc3QuZGl0X3NldGtleSA9PSBOVUxMKQpAQCAtMzA4LDI1ICszMDUsMjUgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCisJCQkJICAgICAgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCiB7CiAJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKIAlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9zZXRrZXkodGZtLCBrZXksIGtleWxlbik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCisJCQkJCXN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKKwkJCQkJdW5zaWduZWQgaW50IG5ieXRlcykKIHsKIAlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwogCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2VuY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9lbmNyeXB0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KQorCQkJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJCQkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKIHsKIAlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwogCUJVR19PTih0Zm0tPmNydF9jaXBoZXIuY2l0X21vZGUgPT0gQ1JZUFRPX1RGTV9NT0RFX0VDQik7CkBAIC0zMzQsMTggKzMzMSwxOCBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKQorCQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisJCQkJCXVuc2lnbmVkIGludCBuYnl0ZXMpCiB7CiAJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKIAlyZXR1cm4gdGZtLT5jcnRfY2lwaGVyLmNpdF9kZWNyeXB0KHRmbSwgZHN0LCBzcmMsIG5ieXRlcyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZGVjcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKKwkJCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpCiB7CiAJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKIAlCVUdfT04odGZtLT5jcnRfY2lwaGVyLmNpdF9tb2RlID09IENSWVBUT19URk1fTU9ERV9FQ0IpOwpAQCAtMzUzLDQ3ICszNTAsMzMgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19jaXBoZXJfc2V0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IGxlbikKKwkJCQkJY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IGxlbikKIHsKIAlCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwogCW1lbWNweSh0Zm0tPmNydF9jaXBoZXIuY2l0X2l2LCBzcmMsIGxlbik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fY2lwaGVyX2dldF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCBsZW4pCisJCQkJCXU4ICpkc3QsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKIAltZW1jcHkoZHN0LCB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2LCBsZW4pOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY29tcF9jb21wcmVzcyhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCisJCQkJICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAorCQkJCSAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCiB7CiAJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ09NUFJFU1MpOwogCXJldHVybiB0Zm0tPmNydF9jb21wcmVzcy5jb3RfY29tcHJlc3ModGZtLCBzcmMsIHNsZW4sIGRzdCwgZGxlbik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jb21wX2RlY29tcHJlc3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IHNsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbikKKwkJCQkJIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAorCQkJCQkgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKQogewogCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTKTsKIAlyZXR1cm4gdGZtLT5jcnRfY29tcHJlc3MuY290X2RlY29tcHJlc3ModGZtLCBzcmMsIHNsZW4sIGRzdCwgZGxlbik7CiB9CiAKLS8qCi0gKiBITUFDIHN1cHBvcnQuCi0gKi8KLSNpZmRlZiBDT05GSUdfQ1JZUFRPX0hNQUMKLXZvaWQgY3J5cHRvX2htYWNfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQgKmtleWxlbik7Ci12b2lkIGNyeXB0b19obWFjX3VwZGF0ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdW5zaWduZWQgaW50IG5zZyk7Ci12b2lkIGNyeXB0b19obWFjX2ZpbmFsKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICprZXksCi0gICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqa2V5bGVuLCB1OCAqb3V0KTsKLXZvaWQgY3J5cHRvX2htYWMoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmtleSwgdW5zaWduZWQgaW50ICprZXlsZW4sCi0gICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuc2csIHU4ICpvdXQpOwotI2VuZGlmCS8qIENPTkZJR19DUllQVE9fSE1BQyAqLwotCiAjZW5kaWYJLyogX0xJTlVYX0NSWVBUT19IICovCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxfZGVidWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxfZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmJjMmRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9kZWJ1Zy5jCkBAIC0wLDAgKzEsMTEwOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQmFzZWQgb24gdGhlIHI4MTgwIGRyaXZlciwgd2hpY2ggaXM6CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4sIGV0IGFsLgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgInJ0bF9kZWJ1Zy5oIgorI2luY2x1ZGUgInJ0bF9jb3JlLmgiCisjaW5jbHVkZSAicjgxOTJFX3BoeS5oIgorI2luY2x1ZGUgInI4MTkyRV9waHlyZWcuaCIKKyNpbmNsdWRlICJyODE5MFBfcnRsODI1Ni5oIiAvKiBSVEw4MjI1IFJhZGlvIGZyb250ZW5kICovCisjaW5jbHVkZSAicjgxOTJFX2NtZHBrdC5oIgorCit1MzIgcnRfZ2xvYmFsX2RlYnVnX2NvbXBvbmVudCA9IFwKKwkJCQlDT01QX0VSUiA7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tRGVjbGFyZSB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3UzMglEQkdQX1R5cGVbREJHUF9UWVBFX01BWF07CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEZ1bmN0aW9uOiAgICBEQkdQX0ZsYWdfSW5pdAorICoKKyAqIE92ZXJ2aWV3OiAgICBSZWZyZXNoIGFsbCBkZWJ1ZyBwcmludCBjb250cm9sIGZsYWcgY29udGVudCB0byB6ZXJvLgorICoKKyAqIElucHV0OiAgICAgICBOT05FCisgKgorICogT3V0cHV0OiAgICAgIE5PTkUKKyAqCisgKiBSZXR1cm46ICAgICAgTk9ORQorICoKKyAqIFJldmlzZWQgSGlzdG9yeToKKyAqICBXaGVuCQlXaG8JCVJlbWFyaworICogIDEwLzIwLzIwMDYJTUhDCQlDcmVhdGUgVmVyc2lvbiAwLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQJcnRsODE5Ml9kYmdwX2ZsYWdfaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXU4IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgREJHUF9UWVBFX01BWDsgaSsrKQorCQlEQkdQX1R5cGVbaV0gPSAwOworCisKK30JLyogREJHUF9GbGFnX0luaXQgKi8KKworLyogdGhpcyBpcyBvbmx5IGZvciBkZWJ1Z2dpbmcgKi8KK3ZvaWQgcHJpbnRfYnVmZmVyKHUzMiAqYnVmZmVyLCBpbnQgbGVuKQoreworCWludCBpOworCXU4ICpidWYgPSAodTggKilidWZmZXI7CisKKwlwcmludGsoS0VSTl9JTkZPICJBU0NJSSBCVUZGRVIgRFVNUCAobGVuOiAleCk6XG4iLCBsZW4pOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlwcmludGsoS0VSTl9JTkZPICIlYyIsIGJ1ZltpXSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJcbkJJTkFSWSBCVUZGRVIgRFVNUCAobGVuOiAleCk6XG4iLCBsZW4pOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlwcmludGsoS0VSTl9JTkZPICIleCIsIGJ1ZltpXSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJcbiIpOworfQorCisvKiB0aGlzIGlzIG9ubHkgZm9yIGRlYnVnICovCit2b2lkIGR1bXBfZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAweGZmOyBpKyspCisJCVJUX1RSQUNFKENPTVBfSU5JVCwgIkVFUFJPTSBhZGRyICV4IDogJXgiLCBpLAorCQkJIGVwcm9tX3JlYWQoZGV2LCBpKSk7Cit9CisKKy8qIHRoaXMgaXMgb25seSBmb3IgZGVidWcgKi8KK3ZvaWQgcnRsODE5Ml9kdW1wX3JlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCWludCBuOworCWludCBtYXggPSAweDVmZjsKKworCVJUX1RSQUNFKENPTVBfSU5JVCwgIkR1bXBpbmcgTklDIHJlZ2lzdGVyIG1hcCIpOworCisJZm9yIChuID0gMDsgbiA8PSBtYXg7ICkgeworCQlwcmludGsoS0VSTl9JTkZPICJcbkQ6ICUyeD4gIiwgbik7CisJCWZvciAoaSA9IDA7IGkgPCAxNiAmJiBuIDw9IG1heDsgaSsrLCBuKyspCisJCQlwcmludGsoS0VSTl9JTkZPICIlMnggIiwgcmVhZF9uaWNfYnl0ZShkZXYsIG4pKTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tUFJPQ0ZTIFNUVUZGLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKlRoaXMgcGFydCBpcyByZWxhdGVkIHRvIFBST0MsIHdoaWNoIHdpbGwgcmVjb3JkIHNvbWUgc3RhdGlzdGljcy4gKi8KK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnJ0bDgxOTJfcHJvYzsKKworc3RhdGljIGludCBwcm9jX2dldF9zdGF0c19hcChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKXJ0bGxpYl9wcml2KGRldik7CisJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUgPSBwcml2LT5ydGxsaWI7CisJc3RydWN0IHJ0bGxpYl9uZXR3b3JrICp0YXJnZXQ7CisJaW50IGxlbiA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhcmdldCwgJmllZWUtPm5ldHdvcmtfbGlzdCwgbGlzdCkgeworCisJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCQkiJXMgIiwgdGFyZ2V0LT5zc2lkKTsKKworCQlpZiAodGFyZ2V0LT53cGFfaWVfbGVuID4gMCB8fCB0YXJnZXQtPnJzbl9pZV9sZW4gPiAwKQorCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJCQkiV1BBXG4iKTsKKwkJZWxzZQorCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJCQkibm9uX1dQQVxuIik7CisKKwl9CisKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHByb2NfZ2V0X3JlZ2lzdGVyc18wKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKKwkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCisJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCisJaW50IGxlbiA9IDA7CisJaW50IGksIG4sIHBhZ2UwOworCisJaW50IG1heCA9IDB4ZmY7CisJcGFnZTAgPSAweDAwMDsKKworCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjcGFnZSAleCMjIyMjIyMjIyMjIyMjIyMjI1xuICIsCisJCQkocGFnZTA+PjgpKTsKKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkiXG5EOiAgT0YgPiAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAwQSAwQiAiCisJCQkiMEMgMEQgMEUgMEYiKTsKKwlmb3IgKG4gPSAwOyBuIDw9IG1heDspIHsKKwkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG5EOiAgJTJ4ID4gIiwgbik7CisJCWZvciAoaSA9IDA7IGkgPCAxNiAmJiBuIDw9IG1heDsgbisrLCBpKyspCisJCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkJCSIlMi4yeCAiLCByZWFkX25pY19ieXRlKGRldiwKKwkJCQkJKHBhZ2UwIHwgbikpKTsKKwl9CisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG4iKTsKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworCit9CitzdGF0aWMgaW50IHByb2NfZ2V0X3JlZ2lzdGVyc18xKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKKwkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCisJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCisJaW50IGxlbiA9IDA7CisJaW50IGksIG4sIHBhZ2UwOworCisJaW50IG1heCA9IDB4ZmY7CisJcGFnZTAgPSAweDEwMDsKKworCS8qIFRoaXMgZHVtcCB0aGUgY3VycmVudCByZWdpc3RlciBwYWdlICovCisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyNwYWdlICV4IyMjIyMjIyMjIyMjIyMjIyMjXG4gIiwKKwkJCShwYWdlMD4+OCkpOworCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbkQ6ICBPRiA+IDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3IDA4IDA5IDBBIDBCICIKKwkJCSIwQyAwRCAwRSAwRiIpOworCWZvciAobiA9IDA7IG4gPD0gbWF4OykgeworCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkJIlxuRDogICUyeCA+ICIsIG4pOworCQlmb3IgKGkgPSAwOyBpIDwgMTYgJiYgbiA8PSBtYXg7IGkrKywgbisrKQorCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJCQkiJTIuMnggIiwgcmVhZF9uaWNfYnl0ZShkZXYsCisJCQkJCShwYWdlMCB8IG4pKSk7CisJfQorCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuIik7CisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKKworfQorc3RhdGljIGludCBwcm9jX2dldF9yZWdpc3RlcnNfMihjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKworCWludCBsZW4gPSAwOworCWludCBpLCBuLCBwYWdlMDsKKworCWludCBtYXggPSAweGZmOworCXBhZ2UwID0gMHgyMDA7CisKKwkvKiBUaGlzIGR1bXAgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgcGFnZSAqLworCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjcGFnZSAleCMjIyMjIyMjIyMjIyMjIyMjI1xuICIsCisJCQkocGFnZTAgPj4gOCkpOworCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbkQ6ICBPRiA+IDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3IDA4IDA5IDBBIDBCIDBDICIKKwkJCSIwRCAwRSAwRiIpOworCWZvciAobiA9IDA7IG4gPD0gbWF4OykgeworCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkJIlxuRDogICUyeCA+ICIsIG4pOworCQlmb3IgKGkgPSAwOyBpIDwgMTYgJiYgbiA8PSBtYXg7IGkrKywgbisrKQorCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJCQkiJTIuMnggIiwgcmVhZF9uaWNfYnl0ZShkZXYsCisJCQkJCShwYWdlMCB8IG4pKSk7CisJfQorCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuIik7CisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKKworfQorc3RhdGljIGludCBwcm9jX2dldF9yZWdpc3RlcnNfMyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKworCWludCBsZW4gPSAwOworCWludCBpLCBuLCBwYWdlMDsKKworCWludCBtYXggPSAweGZmOworCXBhZ2UwID0gMHgzMDA7CisKKwkvKiBUaGlzIGR1bXAgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgcGFnZSAqLworCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjcGFnZSAleCMjIyMjIyMjIyMjIyMjIyMjI1xuICIsCisJCQkocGFnZTA+PjgpKTsKKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkiXG5EOiAgT0YgPiAwMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAwQSAwQiAiCisJCQkiMEMgMEQgMEUgMEYiKTsKKwlmb3IgKG4gPSAwOyBuIDw9IG1heDspIHsKKwkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJCSJcbkQ6ICAlMnggPiAiLCBuKTsKKwkJZm9yIChpID0gMDsgaSA8IDE2ICYmIG4gPD0gbWF4OyBpKyssIG4rKykKKwkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCQkJIiUyLjJ4ICIsIHJlYWRfbmljX2J5dGUoZGV2LAorCQkJCQkocGFnZTAgfCBuKSkpOworCX0KKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbiIpOworCSplb2YgPSAxOworCXJldHVybiBsZW47CisKK30KK3N0YXRpYyBpbnQgcHJvY19nZXRfcmVnaXN0ZXJzXzQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAorCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKKwkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisKKwlpbnQgbGVuID0gMDsKKwlpbnQgaSwgbiwgcGFnZTA7CisKKwlpbnQgbWF4ID0gMHhmZjsKKwlwYWdlMCA9IDB4NDAwOworCisJLyogVGhpcyBkdW1wIHRoZSBjdXJyZW50IHJlZ2lzdGVyIHBhZ2UgKi8KKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkiXG4jIyMjIyMjIyMjIyMjIyMjIyMjI3BhZ2UgJXgjIyMjIyMjIyMjIyMjIyMjIyNcbiAiLAorCQkJKHBhZ2UwPj44KSk7CisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIlxuRDogIE9GID4gMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcgMDggMDkgMEEgMEIgIgorCQkJIjBDIDBEIDBFIDBGIik7CisJZm9yIChuID0gMDsgbiA8PSBtYXg7KSB7CisJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCQkiXG5EOiAgJTJ4ID4gIiwgbik7CisJCWZvciAoaSA9IDA7IGkgPCAxNiAmJiBuIDw9IG1heDsgaSsrLCBuKyspCisJCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkJCSIlMi4yeCAiLCByZWFkX25pY19ieXRlKGRldiwKKwkJCQkJKHBhZ2UwIHwgbikpKTsKKwl9CisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG4iKTsKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworCit9CitzdGF0aWMgaW50IHByb2NfZ2V0X3JlZ2lzdGVyc181KGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKKwkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCisJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCisJaW50IGxlbiA9IDA7CisJaW50IGksIG4sIHBhZ2UwOworCisJaW50IG1heCA9IDB4ZmY7CisJcGFnZTAgPSAweDUwMDsKKworCS8qIFRoaXMgZHVtcCB0aGUgY3VycmVudCByZWdpc3RlciBwYWdlICovCisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyNwYWdlICV4IyMjIyMjIyMjIyMjIyMjIyMjXG4gIiwKKwkJCShwYWdlMCA+PiA4KSk7CisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIlxuRDogIE9GID4gMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcgMDggMDkgMEEgMEIgIgorCQkJIjBDIDBEIDBFIDBGIik7CisJZm9yIChuID0gMDsgbiA8PSBtYXg7KSB7CisJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCQkiXG5EOiAgJTJ4ID4gIiwgbik7CisJCWZvciAoaSA9IDA7IGkgPCAxNiAmJiBuIDw9IG1heDsgaSsrLCBuKyspCisJCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkJCSIlMi4yeCAiLCByZWFkX25pY19ieXRlKGRldiwKKwkJCQkJKHBhZ2UwIHwgbikpKTsKKwl9CisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG4iKTsKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworCit9CitzdGF0aWMgaW50IHByb2NfZ2V0X3JlZ2lzdGVyc182KGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKKwkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCisJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCisJaW50IGxlbiA9IDA7CisJaW50IGksIG4sIHBhZ2UwOworCisJaW50IG1heCA9IDB4ZmY7CisJcGFnZTAgPSAweDYwMDsKKworCS8qIFRoaXMgZHVtcCB0aGUgY3VycmVudCByZWdpc3RlciBwYWdlICovCisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyNwYWdlICV4IyMjIyMjIyMjIyMjIyMjIyMjXG4gIiwKKwkJCShwYWdlMD4+OCkpOworCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbkQ6ICBPRiA+IDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3IDA4IDA5IDBBIDBCICIKKwkJCSIwQyAwRCAwRSAwRiIpOworCWZvciAobiA9IDA7IG4gPD0gbWF4OykgeworCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkJIlxuRDogICUyeCA+ICIsIG4pOworCQlmb3IgKGkgPSAwOyBpIDwgMTYgJiYgbiA8PSBtYXg7IGkrKywgbisrKQorCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJCQkiJTIuMnggIiwgcmVhZF9uaWNfYnl0ZShkZXYsCisJCQkJCShwYWdlMCB8IG4pKSk7CisJfQorCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuIik7CisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKKworfQorc3RhdGljIGludCBwcm9jX2dldF9yZWdpc3RlcnNfNyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKworCWludCBsZW4gPSAwOworCWludCBpLCBuLCBwYWdlMDsKKworCWludCBtYXggPSAweGZmOworCXBhZ2UwID0gMHg3MDA7CisKKwkvKiBUaGlzIGR1bXAgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgcGFnZSAqLworCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjcGFnZSAleCMjIyMjIyMjIyMjIyMjIyMjI1xuICIsCisJCQkocGFnZTAgPj4gOCkpOworCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbkQ6ICBPRiA+IDAwIDAxIDAyIDAzIDA0IDA1IDA2IDA3IDA4IDA5IDBBIDBCIDBDICIKKwkJCSIwRCAwRSAwRiIpOworCWZvciAobiA9IDA7IG4gPD0gbWF4OykgeworCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkJIlxuRDogICUyeCA+ICIsIG4pOworCQlmb3IgKGkgPSAwOyBpIDwgMTYgJiYgbiA8PSBtYXg7IGkrKywgbisrKQorCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJCQkiJTIuMnggIiwgcmVhZF9uaWNfYnl0ZShkZXYsCisJCQkJCShwYWdlMCB8IG4pKSk7CisJfQorCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuIik7CisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKKworfQorc3RhdGljIGludCBwcm9jX2dldF9yZWdpc3RlcnNfOChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKworCWludCBsZW4gPSAwOworCWludCBpLCBuLCBwYWdlMDsKKworCWludCBtYXggPSAweGZmOworCXBhZ2UwID0gMHg4MDA7CisKKwkvKiBUaGlzIGR1bXAgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgcGFnZSAqLworCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjcGFnZSAleCMjIyMjIyMjIyMjIyMjIyMjI1xuIiwKKwkJCShwYWdlMCA+PiA4KSk7CisJZm9yIChuID0gMDsgbiA8PSBtYXg7KSB7CisJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuRDogICUyeCA+ICIsIG4pOworCQlmb3IgKGkgPSAwOyBpIDwgNCAmJiBuIDw9IG1heDsgbiArPSA0LCBpKyspCisJCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkJCSIlOC44eCAiLCBydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LAorCQkJCQkocGFnZTAgfCBuKSwgYk1hc2tEV29yZCkpOworCX0KKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbiIpOworCSplb2YgPSAxOworCXJldHVybiBsZW47CisKK30KK3N0YXRpYyBpbnQgcHJvY19nZXRfcmVnaXN0ZXJzXzkoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAorCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKKwkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisKKwlpbnQgbGVuID0gMDsKKwlpbnQgaSwgbiwgcGFnZTA7CisKKwlpbnQgbWF4ID0gMHhmZjsKKwlwYWdlMCA9IDB4OTAwOworCisJLyogVGhpcyBkdW1wIHRoZSBjdXJyZW50IHJlZ2lzdGVyIHBhZ2UgKi8KKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkiXG4jIyMjIyMjIyMjIyMjIyMjIyMjI3BhZ2UgJXgjIyMjIyMjIyMjIyMjIyMjIyNcbiIsCisJCQkocGFnZTA+PjgpKTsKKwlmb3IgKG4gPSAwOyBuIDw9IG1heDspIHsKKwkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG5EOiAgJTJ4ID4gIiwgbik7CisJCWZvciAoaSA9IDA7IGkgPCA0ICYmIG4gPD0gbWF4OyBuICs9IDQsIGkrKykKKwkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCQkJIiU4Ljh4ICIsIHJ0bDgxOTJfUXVlcnlCQlJlZyhkZXYsCisJCQkJCShwYWdlMCB8IG4pLCBiTWFza0RXb3JkKSk7CisJfQorCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuIik7CisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKK30KK3N0YXRpYyBpbnQgcHJvY19nZXRfcmVnaXN0ZXJzX2EoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAorCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKKwkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisKKwlpbnQgbGVuID0gMDsKKwlpbnQgaSwgbiwgcGFnZTA7CisKKwlpbnQgbWF4ID0gMHhmZjsKKwlwYWdlMCA9IDB4YTAwOworCisJLyogVGhpcyBkdW1wIHRoZSBjdXJyZW50IHJlZ2lzdGVyIHBhZ2UgKi8KKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkiXG4jIyMjIyMjIyMjIyMjIyMjIyMjI3BhZ2UgJXgjIyMjIyMjIyMjIyMjIyMjIyNcbiIsCisJCQkocGFnZTA+PjgpKTsKKwlmb3IgKG4gPSAwOyBuIDw9IG1heDspIHsKKwkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG5EOiAgJTJ4ID4gIiwgbik7CisJCWZvciAoaSA9IDA7IGkgPCA0ICYmIG4gPD0gbWF4OyBuICs9IDQsIGkrKykKKwkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCQkJIiU4Ljh4ICIsIHJ0bDgxOTJfUXVlcnlCQlJlZyhkZXYsCisJCQkJCShwYWdlMCB8IG4pLCBiTWFza0RXb3JkKSk7CisJfQorCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuIik7CisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKK30KK3N0YXRpYyBpbnQgcHJvY19nZXRfcmVnaXN0ZXJzX2IoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAorCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKKwkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisKKwlpbnQgbGVuID0gMDsKKwlpbnQgaSwgbiwgcGFnZTA7CisKKwlpbnQgbWF4ID0gMHhmZjsKKwlwYWdlMCA9IDB4YjAwOworCisJLyogVGhpcyBkdW1wIHRoZSBjdXJyZW50IHJlZ2lzdGVyIHBhZ2UgKi8KKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkiXG4jIyMjIyMjIyMjIyMjIyMjIyMjI3BhZ2UgJXgjIyMjIyMjIyMjIyMjIyMjIyNcbiIsCisJCQkocGFnZTAgPj4gOCkpOworCWZvciAobiA9IDA7IG4gPD0gbWF4OykgeworCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbkQ6ICAlMnggPiAiLCBuKTsKKwkJZm9yIChpID0gMDsgaSA8IDQgJiYgbiA8PSBtYXg7IG4gKz0gNCwgaSsrKQorCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJCQkiJTguOHggIiwgcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwKKwkJCQkJKHBhZ2UwIHwgbiksIGJNYXNrRFdvcmQpKTsKKwl9CisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG4iKTsKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIGludCBwcm9jX2dldF9yZWdpc3RlcnNfYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKworCWludCBsZW4gPSAwOworCWludCBpLCBuLCBwYWdlMDsKKworCWludCBtYXggPSAweGZmOworCXBhZ2UwID0gMHhjMDA7CisKKwkvKiBUaGlzIGR1bXAgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgcGFnZSAqLworCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjcGFnZSAleCMjIyMjIyMjIyMjIyMjIyMjI1xuIiwKKwkJCShwYWdlMD4+OCkpOworCWZvciAobiA9IDA7IG4gPD0gbWF4OykgeworCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbkQ6ICAlMnggPiAiLCBuKTsKKwkJZm9yIChpID0gMDsgaSA8IDQgJiYgbiA8PSBtYXg7IG4gKz0gNCwgaSsrKQorCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJCQkiJTguOHggIiwgcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwKKwkJCQkJKHBhZ2UwIHwgbiksIGJNYXNrRFdvcmQpKTsKKwl9CisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG4iKTsKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIGludCBwcm9jX2dldF9yZWdpc3RlcnNfZChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKworCWludCBsZW4gPSAwOworCWludCBpLCBuLCBwYWdlMDsKKworCWludCBtYXggPSAweGZmOworCXBhZ2UwID0gMHhkMDA7CisKKwkvKiBUaGlzIGR1bXAgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgcGFnZSAqLworCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjcGFnZSAleCMjIyMjIyMjIyMjIyMjIyMjI1xuIiwKKwkJCShwYWdlMD4+OCkpOworCWZvciAobiA9IDA7IG4gPD0gbWF4OykgeworCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbkQ6ICAlMnggPiAiLCBuKTsKKwkJZm9yIChpID0gMDsgaSA8IDQgJiYgbiA8PSBtYXg7IG4gKz0gNCwgaSsrKQorCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJCQkiJTguOHggIiwgcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwKKwkJCQkJKHBhZ2UwIHwgbiksIGJNYXNrRFdvcmQpKTsKKwl9CisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG4iKTsKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIGludCBwcm9jX2dldF9yZWdpc3RlcnNfZShjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKworCWludCBsZW4gPSAwOworCWludCBpLCBuLCBwYWdlMDsKKworCWludCBtYXggPSAweGZmOworCXBhZ2UwID0gMHhlMDA7CisKKwkvKiBUaGlzIGR1bXAgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgcGFnZSAqLworCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjcGFnZSAleCMjIyMjIyMjIyMjIyMjIyMjI1xuIiwKKwkJCShwYWdlMD4+OCkpOworCWZvciAobiA9IDA7IG4gPD0gbWF4OykgeworCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbkQ6ICAlMnggPiAiLCBuKTsKKwkJZm9yIChpID0gMDsgaSA8IDQgJiYgbiA8PSBtYXg7IG4gKz0gNCwgaSsrKQorCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJCQkiJTguOHggIiwgcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwKKwkJCQkJKHBhZ2UwIHwgbiksIGJNYXNrRFdvcmQpKTsKKwl9CisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG4iKTsKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHByb2NfZ2V0X3JlZ19yZl9hKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKKwkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCisJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCisJaW50IGxlbiA9IDA7CisJaW50IGksIG47CisKKwlpbnQgbWF4ID0gMHhmZjsKKworCS8qIFRoaXMgZHVtcCB0aGUgY3VycmVudCByZWdpc3RlciBwYWdlICovCisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyMgUkYtQSAjIyMjIyMjIyMjIyMjIyMjIyNcbiAiKTsKKwlmb3IgKG4gPSAwOyBuIDw9IG1heDspIHsKKwkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG5EOiAgJTJ4ID4gIiwgbik7CisJCWZvciAoaSA9IDA7IGkgPCA0ICYmIG4gPD0gbWF4OyBuICs9IDQsIGkrKykKKwkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCQkJIiU4Ljh4ICIsIHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoZGV2LAorCQkJCQkoZW51bSByZjkwX3JhZGlvX3BhdGgpUkY5MF9QQVRIX0EsIG4sCisJCQkJCWJNYXNrRFdvcmQpKTsKKwl9CisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG4iKTsKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHByb2NfZ2V0X3JlZ19yZl9iKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKKwkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCisJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCisJaW50IGxlbiA9IDA7CisJaW50IGksIG47CisKKwlpbnQgbWF4ID0gMHhmZjsKKworCS8qIFRoaXMgZHVtcCB0aGUgY3VycmVudCByZWdpc3RlciBwYWdlICovCisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyMgUkYtQiAjIyMjIyMjIyMjIyMjIyMjIyNcbiAiKTsKKwlmb3IgKG4gPSAwOyBuIDw9IG1heDspIHsKKwkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG5EOiAgJTJ4ID4gIiwgbik7CisJCWZvciAoaSA9IDA7IGkgPCA0ICYmIG4gPD0gbWF4OyBuICs9IDQsIGkrKykKKwkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCQkJIiU4Ljh4ICIsIHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoZGV2LAorCQkJCQkoZW51bSByZjkwX3JhZGlvX3BhdGgpUkY5MF9QQVRIX0IsIG4sCisJCQkJCWJNYXNrRFdvcmQpKTsKKwl9CisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG4iKTsKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHByb2NfZ2V0X3JlZ19yZl9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKKwkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCisJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCisJaW50IGxlbiA9IDA7CisJaW50IGksIG47CisKKwlpbnQgbWF4ID0gMHhmZjsKKworCS8qIFRoaXMgZHVtcCB0aGUgY3VycmVudCByZWdpc3RlciBwYWdlICovCisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyMgUkYtQyAjIyMjIyMjIyMjIyMjIyMjIyNcbiIpOworCWZvciAobiA9IDA7IG4gPD0gbWF4OykgeworCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbkQ6ICAlMnggPiAiLCBuKTsKKwkJZm9yIChpID0gMDsgaSA8IDQgJiYgbiA8PSBtYXg7IG4gKz0gNCwgaSsrKQorCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJCQkiJTguOHggIiwgcnRsODE5Ml9waHlfUXVlcnlSRlJlZyhkZXYsCisJCQkJCShlbnVtIHJmOTBfcmFkaW9fcGF0aClSRjkwX1BBVEhfQywgbiwKKwkJCQkJYk1hc2tEV29yZCkpOworCX0KKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbiIpOworCSplb2YgPSAxOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgcHJvY19nZXRfcmVnX3JmX2QoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAorCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKKwkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisKKwlpbnQgbGVuID0gMDsKKwlpbnQgaSwgbjsKKworCWludCBtYXggPSAweGZmOworCisJLyogVGhpcyBkdW1wIHRoZSBjdXJyZW50IHJlZ2lzdGVyIHBhZ2UgKi8KKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkiXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyBSRi1EICMjIyMjIyMjIyMjIyMjIyMjI1xuICIpOworCWZvciAobiA9IDA7IG4gPD0gbWF4OykgeworCQlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbkQ6ICAlMnggPiAiLCBuKTsKKwkJZm9yIChpID0gMDsgaSA8IDQgJiYgbiA8PSBtYXg7IG4gKz0gNCwgaSsrKQorCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJCQkiJTguOHggIiwgcnRsODE5Ml9waHlfUXVlcnlSRlJlZyhkZXYsCisJCQkJCShlbnVtIHJmOTBfcmFkaW9fcGF0aClSRjkwX1BBVEhfRCwgbiwKKwkJCQkJYk1hc2tEV29yZCkpOworCX0KKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sICJcbiIpOworCSplb2YgPSAxOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgcHJvY19nZXRfY2FtX3JlZ2lzdGVyXzEoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAorCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKKwkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisJdTMyIHRhcmdldF9jb21tYW5kID0gMDsKKwl1MzIgdGFyZ2V0X2NvbnRlbnQgPSAwOworCXU4IGVudHJ5X2kgPSAwOworCXUzMiB1bFN0YXR1czsKKwlpbnQgbGVuID0gMDsKKwlpbnQgaSA9IDEwMCwgaiA9IDA7CisKKwkvKiBUaGlzIGR1bXAgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgcGFnZSAqLworCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJCSJcbiMjIyMjIyMjIyMjIyMjIyMjIyMjIFNFQ1VSSVRZIENBTSAoMC0xMCkgIyMjIyMjIgorCQkJIiMjIyMjIyMjIyMjI1xuICIpOworCWZvciAoaiA9IDA7IGogPCAxMTsgaisrKSB7CisJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuRDogICUyeCA+ICIsIGopOworCQlmb3IgKGVudHJ5X2kgPSAwOyBlbnRyeV9pIDwgQ0FNX0NPTlRFTlRfQ09VTlQ7IGVudHJ5X2krKykgeworCQkJdGFyZ2V0X2NvbW1hbmQgPSBlbnRyeV9pK0NBTV9DT05URU5UX0NPVU5UKmo7CisJCQl0YXJnZXRfY29tbWFuZCA9IHRhcmdldF9jb21tYW5kIHwgQklUMzE7CisKKwkJCXdoaWxlICgoaS0tKSA+PSAwKSB7CisJCQkJdWxTdGF0dXMgPSByZWFkX25pY19kd29yZChkZXYsIFJXQ0FNKTsKKwkJCQlpZiAodWxTdGF0dXMgJiBCSVQzMSkKKwkJCQkJY29udGludWU7CisJCQkJZWxzZQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXdyaXRlX25pY19kd29yZChkZXYsIFJXQ0FNLCB0YXJnZXRfY29tbWFuZCk7CisJCQl0YXJnZXRfY29udGVudCA9IHJlYWRfbmljX2R3b3JkKGRldiwgUkNBTU8pOworCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiJTguOHggIiwKKwkJCQkJdGFyZ2V0X2NvbnRlbnQpOworCQl9CisJfQorCisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG4iKTsKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHByb2NfZ2V0X2NhbV9yZWdpc3Rlcl8yKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwKKwkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsCisJCQkgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkYXRhOworCXUzMiB0YXJnZXRfY29tbWFuZCA9IDA7CisJdTMyIHRhcmdldF9jb250ZW50ID0gMDsKKwl1OCBlbnRyeV9pID0gMDsKKwl1MzIgdWxTdGF0dXM7CisJaW50IGxlbiA9IDA7CisJaW50IGkgPSAxMDAsIGogPSAwOworCisJLyogVGhpcyBkdW1wIHRoZSBjdXJyZW50IHJlZ2lzdGVyIHBhZ2UgKi8KKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCQkiXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyBTRUNVUklUWSBDQU0gKDExLTIxKSAiCisJCQkiIyMjIyMjIyMjIyMjIyMjIyMjXG4gIik7CisJZm9yIChqID0gMTE7IGogPCAyMjsgaisrKSB7CisJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuRDogICUyeCA+ICIsIGopOworCQlmb3IgKGVudHJ5X2kgPSAwOyBlbnRyeV9pIDwgQ0FNX0NPTlRFTlRfQ09VTlQ7IGVudHJ5X2krKykgeworCQkJdGFyZ2V0X2NvbW1hbmQgPSBlbnRyeV9pICsgQ0FNX0NPTlRFTlRfQ09VTlQgKiBqOworCQkJdGFyZ2V0X2NvbW1hbmQgPSB0YXJnZXRfY29tbWFuZCB8IEJJVDMxOworCisJCQl3aGlsZSAoKGktLSkgPj0gMCkgeworCQkJCXVsU3RhdHVzID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBSV0NBTSk7CisJCQkJaWYgKHVsU3RhdHVzICYgQklUMzEpCisJCQkJCWNvbnRpbnVlOworCQkJCWVsc2UKKwkJCQkJYnJlYWs7CisJCQl9CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSV0NBTSwgdGFyZ2V0X2NvbW1hbmQpOworCQkJdGFyZ2V0X2NvbnRlbnQgPSByZWFkX25pY19kd29yZChkZXYsIFJDQU1PKTsKKwkJCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIiU4Ljh4ICIsCisJCQkJCXRhcmdldF9jb250ZW50KTsKKwkJfQorCX0KKworCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwgIlxuIik7CisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBwcm9jX2dldF9jYW1fcmVnaXN0ZXJfMyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKwl1MzIgdGFyZ2V0X2NvbW1hbmQgPSAwOworCXUzMiB0YXJnZXRfY29udGVudCA9IDA7CisJdTggZW50cnlfaSA9IDA7CisJdTMyIHVsU3RhdHVzOworCWludCBsZW4gPSAwOworCWludCBpID0gMTAwLCBqID0gMDsKKworCS8qIFRoaXMgZHVtcCB0aGUgY3VycmVudCByZWdpc3RlciBwYWdlICovCisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLAorCQkJIlxuIyMjIyMjIyMjIyMjIyMjIyMjIyMgU0VDVVJJVFkgQ0FNICgyMi0zMSkgIyMjIyMjIgorCQkJIiMjIyMjIyMjIyMjI1xuICIpOworCWZvciAoaiA9IDIyOyBqIDwgVE9UQUxfQ0FNX0VOVFJZOyBqKyspIHsKKwkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG5EOiAgJTJ4ID4gIiwgaik7CisJCWZvciAoZW50cnlfaSA9IDA7IGVudHJ5X2kgPCBDQU1fQ09OVEVOVF9DT1VOVDsgZW50cnlfaSsrKSB7CisJCQl0YXJnZXRfY29tbWFuZCA9IGVudHJ5X2kgKyBDQU1fQ09OVEVOVF9DT1VOVCAqIGo7CisJCQl0YXJnZXRfY29tbWFuZCA9IHRhcmdldF9jb21tYW5kIHwgQklUMzE7CisKKwkJCXdoaWxlICgoaS0tKSA+PSAwKSB7CisJCQkJdWxTdGF0dXMgPSByZWFkX25pY19kd29yZChkZXYsIFJXQ0FNKTsKKwkJCQlpZiAodWxTdGF0dXMgJiBCSVQzMSkKKwkJCQkJY29udGludWU7CisJCQkJZWxzZQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXdyaXRlX25pY19kd29yZChkZXYsIFJXQ0FNLCB0YXJnZXRfY29tbWFuZCk7CisJCQl0YXJnZXRfY29udGVudCA9IHJlYWRfbmljX2R3b3JkKGRldiwgUkNBTU8pOworCQkJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiJTguOHggIiwKKwkJCQkJdGFyZ2V0X2NvbnRlbnQpOworCQl9CisJfQorCisJbGVuICs9IHNucHJpbnRmKHBhZ2UgKyBsZW4sIGNvdW50IC0gbGVuLCAiXG4iKTsKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIGludCBwcm9jX2dldF9zdGF0c190eChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsCisJCQkgIG9mZl90IG9mZnNldCwgaW50IGNvdW50LAorCQkJICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKXJ0bGxpYl9wcml2KGRldik7CisKKwlpbnQgbGVuID0gMDsKKworCWxlbiArPSBzbnByaW50ZihwYWdlICsgbGVuLCBjb3VudCAtIGxlbiwKKwkJIlRYIFZJIHByaW9yaXR5IG9rIGludDogJWx1XG4iCisJCSJUWCBWTyBwcmlvcml0eSBvayBpbnQ6ICVsdVxuIgorCQkiVFggQkUgcHJpb3JpdHkgb2sgaW50OiAlbHVcbiIKKwkJIlRYIEJLIHByaW9yaXR5IG9rIGludDogJWx1XG4iCisJCSJUWCBNQU5BR0UgcHJpb3JpdHkgb2sgaW50OiAlbHVcbiIKKwkJIlRYIEJFQUNPTiBwcmlvcml0eSBvayBpbnQ6ICVsdVxuIgorCQkiVFggQkVBQ09OIHByaW9yaXR5IGVycm9yIGludDogJWx1XG4iCisJCSJUWCBDTURQS1QgcHJpb3JpdHkgb2sgaW50OiAlbHVcbiIKKwkJIlRYIHF1ZXVlIHN0b3BwZWQ/OiAlZFxuIgorCQkiVFggZmlmbyBvdmVyZmxvdzogJWx1XG4iCisJCSJUWCB0b3RhbCBkYXRhIHBhY2tldHMgJWx1XG4iCisJCSJUWCB0b3RhbCBkYXRhIGJ5dGVzIDolbHVcbiIsCisJCXByaXYtPnN0YXRzLnR4dmlva2ludCwKKwkJcHJpdi0+c3RhdHMudHh2b29raW50LAorCQlwcml2LT5zdGF0cy50eGJlb2tpbnQsCisJCXByaXYtPnN0YXRzLnR4Ymtva2ludCwKKwkJcHJpdi0+c3RhdHMudHhtYW5hZ2Vva2ludCwKKwkJcHJpdi0+c3RhdHMudHhiZWFjb25va2ludCwKKwkJcHJpdi0+c3RhdHMudHhiZWFjb25lcnIsCisJCXByaXYtPnN0YXRzLnR4Y21kcGt0b2tpbnQsCisJCW5ldGlmX3F1ZXVlX3N0b3BwZWQoZGV2KSwKKwkJcHJpdi0+c3RhdHMudHhvdmVyZmxvdywKKwkJcHJpdi0+cnRsbGliLT5zdGF0cy50eF9wYWNrZXRzLAorCQlwcml2LT5ydGxsaWItPnN0YXRzLnR4X2J5dGVzCisKKworCQkpOworCisJKmVvZiA9IDE7CisJcmV0dXJuIGxlbjsKK30KKworCisKK3N0YXRpYyBpbnQgcHJvY19nZXRfc3RhdHNfcngoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LAorCQkJICBvZmZfdCBvZmZzZXQsIGludCBjb3VudCwKKwkJCSAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRhdGE7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilydGxsaWJfcHJpdihkZXYpOworCisJaW50IGxlbiA9IDA7CisKKwlsZW4gKz0gc25wcmludGYocGFnZSArIGxlbiwgY291bnQgLSBsZW4sCisJCSJSWCBwYWNrZXRzOiAlbHVcbiIKKwkJIlJYIGRhdGEgY3JjIGVycjogJWx1XG4iCisJCSJSWCBtZ210IGNyYyBlcnI6ICVsdVxuIgorCQkiUlggZGVzYyBlcnI6ICVsdVxuIgorCQkiUlggcnggb3ZlcmZsb3cgZXJyb3I6ICVsdVxuIiwKKwkJcHJpdi0+c3RhdHMucnhpbnQsCisJCXByaXYtPnN0YXRzLnJ4ZGF0YWNyY2VyciwKKwkJcHJpdi0+c3RhdHMucnhtZ210Y3JjZXJyLAorCQlwcml2LT5zdGF0cy5yeHJkdSwKKwkJcHJpdi0+c3RhdHMucnhvdmVyZmxvdyk7CisKKwkqZW9mID0gMTsKKwlyZXR1cm4gbGVuOworfQorCit2b2lkIHJ0bDgxOTJfcHJvY19tb2R1bGVfaW5pdCh2b2lkKQoreworCVJUX1RSQUNFKENPTVBfSU5JVCwgIkluaXRpYWxpemluZyBwcm9jIGZpbGVzeXN0ZW0iKTsKKwlydGw4MTkyX3Byb2MgPSBjcmVhdGVfcHJvY19lbnRyeShEUlZfTkFNRSwgU19JRkRJUiwgaW5pdF9uZXQucHJvY19uZXQpOworfQorCisKK3ZvaWQgcnRsODE5Ml9wcm9jX21vZHVsZV9yZW1vdmUodm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeShEUlZfTkFNRSwgaW5pdF9uZXQucHJvY19uZXQpOworfQorCisKK3ZvaWQgcnRsODE5Ml9wcm9jX3JlbW92ZV9vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKXJ0bGxpYl9wcml2KGRldik7CisKKwlwcmludGsoS0VSTl9JTkZPICJkZXYgbmFtZSAlc1xuIiwgZGV2LT5uYW1lKTsKKworCWlmIChwcml2LT5kaXJfZGV2KSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJzdGF0cy10eCIsIHByaXYtPmRpcl9kZXYpOworCQlyZW1vdmVfcHJvY19lbnRyeSgic3RhdHMtcngiLCBwcml2LT5kaXJfZGV2KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInN0YXRzLWFwIiwgcHJpdi0+ZGlyX2Rldik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJyZWdpc3RlcnMtMCIsIHByaXYtPmRpcl9kZXYpOworCQlyZW1vdmVfcHJvY19lbnRyeSgicmVnaXN0ZXJzLTEiLCBwcml2LT5kaXJfZGV2KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInJlZ2lzdGVycy0yIiwgcHJpdi0+ZGlyX2Rldik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJyZWdpc3RlcnMtMyIsIHByaXYtPmRpcl9kZXYpOworCQlyZW1vdmVfcHJvY19lbnRyeSgicmVnaXN0ZXJzLTQiLCBwcml2LT5kaXJfZGV2KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInJlZ2lzdGVycy01IiwgcHJpdi0+ZGlyX2Rldik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJyZWdpc3RlcnMtNiIsIHByaXYtPmRpcl9kZXYpOworCQlyZW1vdmVfcHJvY19lbnRyeSgicmVnaXN0ZXJzLTciLCBwcml2LT5kaXJfZGV2KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInJlZ2lzdGVycy04IiwgcHJpdi0+ZGlyX2Rldik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJyZWdpc3RlcnMtOSIsIHByaXYtPmRpcl9kZXYpOworCQlyZW1vdmVfcHJvY19lbnRyeSgicmVnaXN0ZXJzLWEiLCBwcml2LT5kaXJfZGV2KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInJlZ2lzdGVycy1iIiwgcHJpdi0+ZGlyX2Rldik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJyZWdpc3RlcnMtYyIsIHByaXYtPmRpcl9kZXYpOworCQlyZW1vdmVfcHJvY19lbnRyeSgicmVnaXN0ZXJzLWQiLCBwcml2LT5kaXJfZGV2KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInJlZ2lzdGVycy1lIiwgcHJpdi0+ZGlyX2Rldik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJSRi1BIiwgcHJpdi0+ZGlyX2Rldik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJSRi1CIiwgcHJpdi0+ZGlyX2Rldik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJSRi1DIiwgcHJpdi0+ZGlyX2Rldik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJSRi1EIiwgcHJpdi0+ZGlyX2Rldik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJTRUMtQ0FNLTEiLCBwcml2LT5kaXJfZGV2KTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoIlNFQy1DQU0tMiIsIHByaXYtPmRpcl9kZXYpOworCQlyZW1vdmVfcHJvY19lbnRyeSgiU0VDLUNBTS0zIiwgcHJpdi0+ZGlyX2Rldik7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJ3bGFuMCIsIHJ0bDgxOTJfcHJvYyk7CisJCXByaXYtPmRpcl9kZXYgPSBOVUxMOworCX0KK30KKworCit2b2lkIHJ0bDgxOTJfcHJvY19pbml0X29uZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKXJ0bGxpYl9wcml2KGRldik7CisKKwlwcml2LT5kaXJfZGV2ID0gY3JlYXRlX3Byb2NfZW50cnkoZGV2LT5uYW1lLAorCQkJCQkgIFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTywKKwkJCQkJICBydGw4MTkyX3Byb2MpOworCWlmICghcHJpdi0+ZGlyX2RldikgeworCQlSVF9UUkFDRShDT01QX0VSUiwgIlVuYWJsZSB0byBpbml0aWFsaXplIC9wcm9jL25ldC9ydGw4MTkyIgorCQkJICIvJXNcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybjsKKwl9CisJZSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInN0YXRzLXJ4IiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJICAgcHJpdi0+ZGlyX2RldiwgcHJvY19nZXRfc3RhdHNfcngsIGRldik7CisKKwlpZiAoIWUpCisJCVJUX1RSQUNFKENPTVBfRVJSLCAiVW5hYmxlIHRvIGluaXRpYWxpemUgIgorCQkgICAgICAiL3Byb2MvbmV0L3J0bDgxOTIvJXMvc3RhdHMtcnhcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisKKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgic3RhdHMtdHgiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgICBwcml2LT5kaXJfZGV2LCBwcm9jX2dldF9zdGF0c190eCwgZGV2KTsKKworCWlmICghZSkKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCisJCSAgICAgICIvcHJvYy9uZXQvcnRsODE5Mi8lcy9zdGF0cy10eFxuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKworCWUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJzdGF0cy1hcCIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgIHByaXYtPmRpcl9kZXYsIHByb2NfZ2V0X3N0YXRzX2FwLCBkZXYpOworCisJaWYgKCFlKQorCQlSVF9UUkFDRShDT01QX0VSUiwgIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJICAgICAgIi9wcm9jL25ldC9ydGw4MTkyLyVzL3N0YXRzLWFwXG4iLAorCQkgICAgICBkZXYtPm5hbWUpOworCisJZSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInJlZ2lzdGVycy0wIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJICAgcHJpdi0+ZGlyX2RldiwgcHJvY19nZXRfcmVnaXN0ZXJzXzAsIGRldik7CisJaWYgKCFlKQorCQlSVF9UUkFDRShDT01QX0VSUiwgIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJICAgICAgIi9wcm9jL25ldC9ydGw4MTkyLyVzL3JlZ2lzdGVycy0wXG4iLAorCQkgICAgICBkZXYtPm5hbWUpOworCWUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJyZWdpc3RlcnMtMSIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgIHByaXYtPmRpcl9kZXYsIHByb2NfZ2V0X3JlZ2lzdGVyc18xLCBkZXYpOworCWlmICghZSkKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCisJCSAgICAgICIvcHJvYy9uZXQvcnRsODE5Mi8lcy9yZWdpc3RlcnMtMVxuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgicmVnaXN0ZXJzLTIiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgICBwcml2LT5kaXJfZGV2LCBwcm9jX2dldF9yZWdpc3RlcnNfMiwgZGV2KTsKKwlpZiAoIWUpCisJCVJUX1RSQUNFKENPTVBfRVJSLCAiVW5hYmxlIHRvIGluaXRpYWxpemUgIgorCQkgICAgICAiL3Byb2MvbmV0L3J0bDgxOTIvJXMvcmVnaXN0ZXJzLTJcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJZSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInJlZ2lzdGVycy0zIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJICAgcHJpdi0+ZGlyX2RldiwgcHJvY19nZXRfcmVnaXN0ZXJzXzMsIGRldik7CisJaWYgKCFlKQorCQlSVF9UUkFDRShDT01QX0VSUiwgIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJICAgICAgIi9wcm9jL25ldC9ydGw4MTkyLyVzL3JlZ2lzdGVycy0zXG4iLAorCQkgICAgICBkZXYtPm5hbWUpOworCWUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJyZWdpc3RlcnMtNCIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgIHByaXYtPmRpcl9kZXYsIHByb2NfZ2V0X3JlZ2lzdGVyc180LCBkZXYpOworCWlmICghZSkKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCisJCSAgICAgICIvcHJvYy9uZXQvcnRsODE5Mi8lcy9yZWdpc3RlcnMtNFxuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgicmVnaXN0ZXJzLTUiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgICBwcml2LT5kaXJfZGV2LCBwcm9jX2dldF9yZWdpc3RlcnNfNSwgZGV2KTsKKwlpZiAoIWUpCisJCVJUX1RSQUNFKENPTVBfRVJSLCAiVW5hYmxlIHRvIGluaXRpYWxpemUgIgorCQkgICAgICAiL3Byb2MvbmV0L3J0bDgxOTIvJXMvcmVnaXN0ZXJzLTVcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJZSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInJlZ2lzdGVycy02IiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJICAgcHJpdi0+ZGlyX2RldiwgcHJvY19nZXRfcmVnaXN0ZXJzXzYsIGRldik7CisJaWYgKCFlKQorCQlSVF9UUkFDRShDT01QX0VSUiwgIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJICAgICAgIi9wcm9jL25ldC9ydGw4MTkyLyVzL3JlZ2lzdGVycy02XG4iLAorCQkgICAgICBkZXYtPm5hbWUpOworCWUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJyZWdpc3RlcnMtNyIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgIHByaXYtPmRpcl9kZXYsIHByb2NfZ2V0X3JlZ2lzdGVyc183LCBkZXYpOworCWlmICghZSkKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCisJCSAgICAgICIvcHJvYy9uZXQvcnRsODE5Mi8lcy9yZWdpc3RlcnMtN1xuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgicmVnaXN0ZXJzLTgiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgICBwcml2LT5kaXJfZGV2LCBwcm9jX2dldF9yZWdpc3RlcnNfOCwgZGV2KTsKKwlpZiAoIWUpCisJCVJUX1RSQUNFKENPTVBfRVJSLCAiVW5hYmxlIHRvIGluaXRpYWxpemUgIgorCQkgICAgICAiL3Byb2MvbmV0L3J0bDgxOTIvJXMvcmVnaXN0ZXJzLThcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJZSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInJlZ2lzdGVycy05IiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJICAgcHJpdi0+ZGlyX2RldiwgcHJvY19nZXRfcmVnaXN0ZXJzXzksIGRldik7CisJaWYgKCFlKQorCQlSVF9UUkFDRShDT01QX0VSUiwgIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJICAgICAgIi9wcm9jL25ldC9ydGw4MTkyLyVzL3JlZ2lzdGVycy05XG4iLAorCQkgICAgICBkZXYtPm5hbWUpOworCWUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJyZWdpc3RlcnMtYSIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgIHByaXYtPmRpcl9kZXYsIHByb2NfZ2V0X3JlZ2lzdGVyc19hLCBkZXYpOworCWlmICghZSkKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCisJCSAgICAgICIvcHJvYy9uZXQvcnRsODE5Mi8lcy9yZWdpc3RlcnMtYVxuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgicmVnaXN0ZXJzLWIiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgICBwcml2LT5kaXJfZGV2LCBwcm9jX2dldF9yZWdpc3RlcnNfYiwgZGV2KTsKKwlpZiAoIWUpCisJCVJUX1RSQUNFKENPTVBfRVJSLCAiVW5hYmxlIHRvIGluaXRpYWxpemUgIgorCQkgICAgICAiL3Byb2MvbmV0L3J0bDgxOTIvJXMvcmVnaXN0ZXJzLWJcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJZSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInJlZ2lzdGVycy1jIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJICAgcHJpdi0+ZGlyX2RldiwgcHJvY19nZXRfcmVnaXN0ZXJzX2MsIGRldik7CisJaWYgKCFlKQorCQlSVF9UUkFDRShDT01QX0VSUiwgIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJICAgICAgIi9wcm9jL25ldC9ydGw4MTkyLyVzL3JlZ2lzdGVycy1jXG4iLAorCQkgICAgICBkZXYtPm5hbWUpOworCWUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJyZWdpc3RlcnMtZCIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgIHByaXYtPmRpcl9kZXYsIHByb2NfZ2V0X3JlZ2lzdGVyc19kLCBkZXYpOworCWlmICghZSkKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCisJCSAgICAgICIvcHJvYy9uZXQvcnRsODE5Mi8lcy9yZWdpc3RlcnMtZFxuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgicmVnaXN0ZXJzLWUiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgICBwcml2LT5kaXJfZGV2LCBwcm9jX2dldF9yZWdpc3RlcnNfZSwgZGV2KTsKKwlpZiAoIWUpCisJCVJUX1RSQUNFKENPTVBfRVJSLCAiVW5hYmxlIHRvIGluaXRpYWxpemUgIgorCQkgICAgICAiL3Byb2MvbmV0L3J0bDgxOTIvJXMvcmVnaXN0ZXJzLWVcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJZSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoIlJGLUEiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgICBwcml2LT5kaXJfZGV2LCBwcm9jX2dldF9yZWdfcmZfYSwgZGV2KTsKKwlpZiAoIWUpCisJCVJUX1RSQUNFKENPTVBfRVJSLCAiVW5hYmxlIHRvIGluaXRpYWxpemUgIgorCQkgICAgICAiL3Byb2MvbmV0L3J0bDgxOTIvJXMvUkYtQVxuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiUkYtQiIsIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgIHByaXYtPmRpcl9kZXYsIHByb2NfZ2V0X3JlZ19yZl9iLCBkZXYpOworCWlmICghZSkKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCisJCSAgICAgICIvcHJvYy9uZXQvcnRsODE5Mi8lcy9SRi1CXG4iLAorCQkgICAgICBkZXYtPm5hbWUpOworCWUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJSRi1DIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJICAgcHJpdi0+ZGlyX2RldiwgcHJvY19nZXRfcmVnX3JmX2MsIGRldik7CisJaWYgKCFlKQorCQlSVF9UUkFDRShDT01QX0VSUiwgIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJICAgICAgIi9wcm9jL25ldC9ydGw4MTkyLyVzL1JGLUNcbiIsCisJCSAgICAgIGRldi0+bmFtZSk7CisJZSA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoIlJGLUQiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgICBwcml2LT5kaXJfZGV2LCBwcm9jX2dldF9yZWdfcmZfZCwgZGV2KTsKKwlpZiAoIWUpCisJCVJUX1RSQUNFKENPTVBfRVJSLCAiVW5hYmxlIHRvIGluaXRpYWxpemUgIgorCQkgICAgICAiL3Byb2MvbmV0L3J0bDgxOTIvJXMvUkYtRFxuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiU0VDLUNBTS0xIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJICAgcHJpdi0+ZGlyX2RldiwgcHJvY19nZXRfY2FtX3JlZ2lzdGVyXzEsIGRldik7CisJaWYgKCFlKQorCQlSVF9UUkFDRShDT01QX0VSUiwgIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJICAgICAgIi9wcm9jL25ldC9ydGw4MTkyLyVzL1NFQy1DQU0tMVxuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiU0VDLUNBTS0yIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJICAgcHJpdi0+ZGlyX2RldiwgcHJvY19nZXRfY2FtX3JlZ2lzdGVyXzIsIGRldik7CisJaWYgKCFlKQorCQlSVF9UUkFDRShDT01QX0VSUiwgIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJICAgICAgIi9wcm9jL25ldC9ydGw4MTkyLyVzL1NFQy1DQU0tMlxuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKKwllID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiU0VDLUNBTS0zIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQkJICAgcHJpdi0+ZGlyX2RldiwgcHJvY19nZXRfY2FtX3JlZ2lzdGVyXzMsIGRldik7CisJaWYgKCFlKQorCQlSVF9UUkFDRShDT01QX0VSUiwgIlVuYWJsZSB0byBpbml0aWFsaXplICIKKwkJICAgICAgIi9wcm9jL25ldC9ydGw4MTkyLyVzL1NFQy1DQU0tM1xuIiwKKwkJICAgICAgZGV2LT5uYW1lKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxfZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGZiOWE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9kZWJ1Zy5oCkBAIC0wLDAgKzEsMjk5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBCYXNlZCBvbiB0aGUgcjgxODAgZHJpdmVyLCB3aGljaCBpczoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDUgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PiwgZXQgYWwuCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9SVExfREVCVUdfSAorI2RlZmluZSBfUlRMX0RFQlVHX0gKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorCitzdHJ1Y3QgcjgxOTJfcHJpdjsKK3N0cnVjdCBfdHhfZGVzY184MTkyc2U7CitzdHJ1Y3QgX1RYX0RFU0NfODE5MkNFOworc3RydWN0IG5ldF9kZXZpY2U7CisKKyNkZWZpbmUJREJHX0xPVUQJNAorCisjZGVmaW5lIFJUX0FTU0VSVChfRXhwLCBGbXQpCQkJCVwKKwkJaWYgKCEoX0V4cCkpIHsJCQkJXAorCQkJcHJpbnRrKCJSdGw4MTl4OiAiKTsJCVwKKwkJCXByaW50ayBGbXQ7CQkJXAorCQl9CisKK2VudW0gZGJncF9mbGFnIHsKKwlGUW9TCQkJCT0gMCwKKwlGVFgJCQkJPSAxLAorCUZSWAkJCQk9IDIsCisJRlNFQwkJCQk9IDMsCisJRk1HTlQJCQkJPSA0LAorCUZNTE1FCQkJCT0gNSwKKwlGUkVTT1VSQ0UJCQk9IDYsCisJRkJFQUNPTgkJCQk9IDcsCisJRklTUgkJCQk9IDgsCisJRlBIWQkJCQk9IDksCisJRk1QCQkJCT0gMTAsCisJRkVFUFJPTQkJCQk9IDExLAorCUZQV1IJCQkJPSAxMiwKKwlGRE0JCQkJPSAxMywKKwlGREJHQ3RybAkJCT0gMTQsCisJRkMySAkJCQk9IDE1LAorCUZCVAkJCQk9IDE2LAorCUZJTklUCQkJCT0gMTcsCisJRklPQ1RMCQkJCT0gMTgsCisJREJHUF9UWVBFX01BWAorfTsKKworI2RlZmluZQkJUW9TX0lOSVQJCQkJQklUMAorI2RlZmluZQkJUW9TX1ZJU1RBCQkJCUJJVDEKKworI2RlZmluZQkJVFhfREVTQwkJCQkJQklUMAorI2RlZmluZQkJVFhfREVTQ19USUQJCQkJQklUMQorCisjZGVmaW5lCQlSWF9EQVRBCQkJCQlCSVQwCisjZGVmaW5lCQlSWF9QSFlfU1RTCQkJCUJJVDEKKyNkZWZpbmUJCVJYX1BIWV9TUwkJCQlCSVQyCisjZGVmaW5lCQlSWF9QSFlfU1EJCQkJQklUMworI2RlZmluZQkJUlhfUEhZX0FTVFMJCQkJQklUNAorI2RlZmluZQkJUlhfRVJSX0xFTgkJCQlCSVQ1CisjZGVmaW5lCQlSWF9ERUZSQUcJCQkJQklUNgorI2RlZmluZQkJUlhfRVJSX1JBVEUJCQkJQklUNworCisKKworI2RlZmluZQkJTUVESUFfU1RTCQkJCUJJVDAKKyNkZWZpbmUJCUxJTktfU1RTCQkJCUJJVDEKKworI2RlZmluZQkJT1NfQ0hLCQkJCQlCSVQwCisKKyNkZWZpbmUJCUJDTl9TSE9XCQkJCUJJVDAKKyNkZWZpbmUJCUJDTl9QRUVSCQkJCUJJVDEKKworI2RlZmluZQkJSVNSX0NISwkJCQkJQklUMAorCisjZGVmaW5lCQlQSFlfQkJSCQkJCQlCSVQwCisjZGVmaW5lCQlQSFlfQkJXCQkJCQlCSVQxCisjZGVmaW5lCQlQSFlfUkZSCQkJCQlCSVQyCisjZGVmaW5lCQlQSFlfUkZXCQkJCQlCSVQzCisjZGVmaW5lCQlQSFlfTUFDUgkJCQlCSVQ0CisjZGVmaW5lCQlQSFlfTUFDVwkJCQlCSVQ1CisjZGVmaW5lCQlQSFlfQUxMUgkJCQlCSVQ2CisjZGVmaW5lCQlQSFlfQUxMVwkJCQlCSVQ3CisjZGVmaW5lCQlQSFlfVFhQV1IJCQkJQklUOAorI2RlZmluZQkJUEhZX1BXUkRJRkYJCQkJQklUOQorCisjZGVmaW5lCQlNUF9SWAkJCQkJQklUMAorI2RlZmluZQkJTVBfU1dJQ0hfQ0gJCQkJQklUMQorCisjZGVmaW5lCQlFRVBST01fVwkJCQlCSVQwCisjZGVmaW5lCQlFRlVTRV9QRwkJCQlCSVQxCisjZGVmaW5lCQlFRlVTRV9SRUFEX0FMTAkJCQlCSVQyCisKKyNkZWZpbmUJCUxQUwkJCQkJQklUMAorI2RlZmluZQkJSVBTCQkJCQlCSVQxCisjZGVmaW5lCQlQV1JTVwkJCQkJQklUMgorI2RlZmluZQkJUFdSSFcJCQkJCUJJVDMKKyNkZWZpbmUJCVBXUkhBTAkJCQkJQklUNAorCisjZGVmaW5lCQlXQV9JT1QJCQkJCUJJVDAKKyNkZWZpbmUJCURNX1BXREIJCQkJCUJJVDEKKyNkZWZpbmUJCURNX01vbml0b3IJCQkJQklUMgorI2RlZmluZQkJRE1fRElHCQkJCQlCSVQzCisjZGVmaW5lCQlETV9FRENBX1R1cmJvCQkJCUJJVDQKKworI2RlZmluZQkJRGJnQ3RybF9UcmFjZQkJCQlCSVQwCisjZGVmaW5lCQlEYmdDdHJsX0luYmFuZE5vaXNlCQkJQklUMQorCisjZGVmaW5lCQlCVF9UUkFDRQkJCQlCSVQwCisjZGVmaW5lCQlCVF9SRlBvbGwJCQkJQklUMQorCisjZGVmaW5lCQlDMkhfU3VtbWFyeQkJCQlCSVQwCisjZGVmaW5lCQlDMkhfUGFja2V0RGF0YQkJCQlCSVQxCisjZGVmaW5lCQlDMkhfQ29udGVudERhdGEJCQkJQklUMgorI2RlZmluZQkJQlRfVFJBQ0UJCQkJQklUMAorI2RlZmluZQkJQlRfUkZQb2xsCQkJCUJJVDEKKworI2RlZmluZQkJSU5JVF9FRVBST00JCQkJQklUMAorI2RlZmluZQkJSU5JVF9UeFBvd2VyCQkJCUJJVDEKKyNkZWZpbmUJCUlOSVRfSVFLCQkJCUJJVDIKKyNkZWZpbmUJCUlOSVRfUkYJCQkJCUJJVDMKKworI2RlZmluZQkJSU9DVExfVFJBQ0UJCQkJQklUMAorI2RlZmluZQkJSU9DVExfQlRfRVZFTlQJCQkJQklUMQorI2RlZmluZQkJSU9DVExfQlRfRVZFTlRfREVUQUlMCQkJQklUMgorI2RlZmluZQkJSU9DVExfQlRfVFhfQUNMREFUQQkJCUJJVDMKKyNkZWZpbmUJCUlPQ1RMX0JUX1RYX0FDTERBVEFfREVUQUlMCQlCSVQ0CisjZGVmaW5lCQlJT0NUTF9CVF9SWF9BQ0xEQVRBCQkJQklUNQorI2RlZmluZQkJSU9DVExfQlRfUlhfQUNMREFUQV9ERVRBSUwJCUJJVDYKKyNkZWZpbmUJCUlPQ1RMX0JUX0hDSUNNRAkJCQlCSVQ3CisjZGVmaW5lCQlJT0NUTF9CVF9IQ0lDTURfREVUQUlMCQkJQklUOAorI2RlZmluZQkJSU9DVExfSVJQCQkJCUJJVDkKKyNkZWZpbmUJCUlPQ1RMX0lSUF9ERVRBSUwJCQlCSVQxMAorI2RlZmluZQkJSU9DVExfQ0FMTEJBQ0tfRlVOCQkJQklUMTEKKyNkZWZpbmUJCUlPQ1RMX1NUQVRFCQkJCUJJVDEyCisjZGVmaW5lCQlJT0NUTF9CVF9UUAkJCQlCSVQxMworI2RlZmluZQkJSU9DVExfQlRfTE9HTwkJCQlCSVQxNAorCisvKiAyMDA3LzA3LzEzIE1IICAtLS0tLS1Gb3IgRGVCdUcgUHJpbnQgbW9kZXVlLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIHN0cnVjdHVyZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IE1hcmNvIERlZmluaXRpb24tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZQkJREVCVUdfUFJJTlQJCTEKKworI2lmIChERUJVR19QUklOVCA9PSAxKQorI2RlZmluZSBSVFBSSU5UKGRiZ3R5cGUsIGRiZ2ZsYWcsIHByaW50c3RyKQkJCVwKK3sJCQkJCQkJCVwKKwlpZiAoREJHUF9UeXBlW2RiZ3R5cGVdICYgZGJnZmxhZykgewkJCVwKKwkJcHJpbnRrIHByaW50c3RyOwkJCQlcCisJfQkJCQkJCQlcCit9CisKKyNkZWZpbmUJUlRQUklOVF9BRERSKGRiZ3R5cGUsIGRiZ2ZsYWcsIHByaW50c3RyLCBfUHRyKQkJXAorewkJCQkJCQkJXAorCWlmIChEQkdQX1R5cGVbZGJndHlwZV0gJiBkYmdmbGFnKSB7CQkJXAorCQlpbnQgX19pOwkJCQkJXAorCQl1OCAqcHRyID0gKHU4ICopX1B0cjsJCQkJXAorCQlwcmludGsgcHJpbnRzdHI7CQkJCVwKKwkJcHJpbnRrKCIgIik7CQkJCQlcCisJCWZvciAoX19pID0gMDsgX19pIDwgNjsgX19pKyspCQkJXAorCQkJcHJpbnRrKCIlMDJYJXMiLCBwdHJbX19pXSwJCVwKKwkJCSAgICAgICAoX19pID09IDUpID8gIiIgOiAiLSIpOwkJXAorCQkJcHJpbnRrKCJcbiIpOwkJCQlcCisJfQkJCQkJCQlcCit9CisKKyNkZWZpbmUgUlRQUklOVF9EQVRBKGRiZ3R5cGUsIGRiZ2ZsYWcsIF9UaXRsZVN0cmluZywgX0hleERhdGEsIF9IZXhEYXRhTGVuKVwKK3sJCQkJCQkJCVwKKwlpZiAoREJHUF9UeXBlW2RiZ3R5cGVdICYgZGJnZmxhZykgewkJCVwKKwkJaW50IF9faTsJCQkJCVwKKwkJdTggKnB0ciA9ICh1OCAqKV9IZXhEYXRhOwkJCVwKKwkJcHJpbnRrKF9UaXRsZVN0cmluZyk7CQkJCVwKKwkJZm9yIChfX2kgPSAwOyBfX2kgPCAoaW50KV9IZXhEYXRhTGVuOyBfX2krKykgewlcCisJCQlwcmludGsoIiUwMlglcyIsIHB0cltfX2ldLCAoKChfX2kgKyAxKQlcCisJCQkgICAgICAgJSA0KSA9PSAwKSA/ICIgICIgOiAiICIpOwlcCisJCQlpZiAoKChfX2kgKyAxKSAlIDE2KSA9PSAwKQkJXAorCQkJCXByaW50aygiXG4iKTsJCQlcCisJCX0JCQkJCQlcCisJCXByaW50aygiXG4iKTsJCQkJCVwKKwl9CQkJCQkJCVwKK30KKyNlbHNlCisjZGVmaW5lCVJUUFJJTlQoZGJndHlwZSwgZGJnZmxhZywgcHJpbnRzdHIpCisjZGVmaW5lCVJUUFJJTlRfQUREUihkYmd0eXBlLCBkYmdmbGFnLCBwcmludHN0ciwgX1B0cikKKyNkZWZpbmUgUlRQUklOVF9EQVRBKGRiZ3R5cGUsIGRiZ2ZsYWcsIF9UaXRsZVN0cmluZywgX0hleERhdGEsIF9IZXhEYXRhTGVuKQorI2VuZGlmCisKK2V4dGVybiB1MzIJREJHUF9UeXBlW0RCR1BfVFlQRV9NQVhdOworCisjZGVmaW5lIFJUX1BSSU5UX0RBVEEoX0NvbXAsIF9MZXZlbCwgX1RpdGxlU3RyaW5nLCBfSGV4RGF0YSwgX0hleERhdGFMZW4pIFwKK2RvIHtcCisJaWYgKCgoX0NvbXApICYgcnRfZ2xvYmFsX2RlYnVnX2NvbXBvbmVudCkgJiYJCQlcCisJICAgICAoX0xldmVsIDw9IHJ0X2dsb2JhbF9kZWJ1Z19jb21wb25lbnQpKSB7CQkJXAorCQlpbnQgX19pOwkJCQkJCVwKKwkJdTgqCXB0ciA9ICh1OCAqKV9IZXhEYXRhOwkJCQlcCisJCXByaW50ayhLRVJOX0lORk8gIlJ0bDgxOXg6ICIpOwkJCQlcCisJCXByaW50ayhfVGl0bGVTdHJpbmcpOwkJCQkJXAorCQlmb3IgKF9faSA9IDA7IF9faSA8IChpbnQpX0hleERhdGFMZW47IF9faSsrKSB7CQlcCisJCQlwcmludGsoIiUwMlglcyIsIHB0cltfX2ldLCAoKChfX2kgKyAxKSAlCVwKKwkJCSAgICAgICA0KSA9PSAwKSA/ICIgICIgOiAiICIpOwkJCVwKKwkJCWlmICgoKF9faSArIDEpICUgMTYpID09IDApCQkJXAorCQkJCXByaW50aygiXG4iKTsJCQkJXAorCQl9CQkJCQkJCVwKKwkJcHJpbnRrKCJcbiIpOwkJCQkJCVwKKwl9IFwKK30gd2hpbGUgKDApOworCisjZGVmaW5lIERNRVNHKHgsIGEuLi4pCisjZGVmaW5lIERNRVNHVyh4LCBhLi4uKQorI2RlZmluZSBETUVTR0UoeCwgYS4uLikKK2V4dGVybiB1MzIgcnRfZ2xvYmFsX2RlYnVnX2NvbXBvbmVudDsKKyNkZWZpbmUgUlRfVFJBQ0UoY29tcG9uZW50LCB4LCBhcmdzLi4uKSBcCitkbyB7CQkJXAorCWlmIChydF9nbG9iYWxfZGVidWdfY29tcG9uZW50ICYgY29tcG9uZW50KSBcCisJCXByaW50ayhLRVJOX0RFQlVHIERSVl9OQU1FICI6IiB4ICJcbiIgLCBcCisJCSAgICAgICAjI2FyZ3MpO1wKK30gd2hpbGUgKDApOworCisjZGVmaW5lIGFzc2VydChleHByKSBcCisJaWYgKCEoZXhwcikpIHsJCQkJICBcCisJCXByaW50ayhLRVJOX0lORk8gIkFzc2VydGlvbiBmYWlsZWQhICVzLCVzLCVzLGxpbmU9JWRcbiIsIFwKKwkJI2V4cHIsIF9fRklMRV9fLCBfX2Z1bmNfXywgX19MSU5FX18pOwkgIFwKKwl9CisjZGVmaW5lIFJUX0RFQlVHX0RBVEEobGV2ZWwsIGRhdGEsIGRhdGFsZW4pICAgICAgXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKChydF9nbG9iYWxfZGVidWdfY29tcG9uZW50ICYgKGxldmVsKSkgPT0gKGxldmVsKSkge1wKKwkJCWludCBfaTsJCQkJICBcCisJCQl1OCAqX3BkYXRhID0gKHU4ICopZGF0YTsJCSBcCisJCQlwcmludGsoS0VSTl9ERUJVRyBEUlZfTkFNRSAiOiAlcygpXG4iLCBfX2Z1bmNfXyk7ICAgXAorCQkJZm9yIChfaSA9IDA7IF9pIDwgKGludCkoZGF0YWxlbik7IF9pKyspIHsJXAorCQkJCXByaW50ayhLRVJOX0lORk8gIiUyeCAiLCBfcGRhdGFbX2ldKTsJXAorCQkJCWlmICgoX2krMSkgJSAxNiA9PSAwKQkJCVwKKwkJCQkJcHJpbnRrKCJcbiIpOwkJCVwKKwkJCX0JCQkgICAgICAgXAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiXG4iKTsJICBcCisJCX0JCQkJICAgICAgIFwKKwl9IHdoaWxlICgwKQorCitzdHJ1Y3QgcnRsX2ZzX2RlYnVnIHsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBkZW50cnkgKmRpcl9kcnY7CisJc3RydWN0IGRlbnRyeSAqZGVidWdfcmVnaXN0ZXI7CisJdTMyIGh3X3R5cGU7CisJdTMyIGh3X29mZnNldDsKKwlib29sIGh3X2hvbGRpbmc7Cit9OworCit2b2lkIHByaW50X2J1ZmZlcih1MzIgKmJ1ZmZlciwgaW50IGxlbik7Cit2b2lkIGR1bXBfZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxOTJfZHVtcF9yZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKy8qIGRlYnVnZnMgc3R1ZmYgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJ0bF9kZWJ1Z19tb2R1bGVfaW5pdChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiwKKwkJCQkJY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0bF9kZWJ1Z19tb2R1bGVfcmVtb3ZlKHN0cnVjdCByODE5Ml9wcml2ICpwcml2KQoreworfQorCitzdGF0aWMgaW5saW5lIGludCBydGxfY3JlYXRlX2RlYnVnZnNfcm9vdCh2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRsX3JlbW92ZV9kZWJ1Z2ZzX3Jvb3Qodm9pZCkKK3sKK30KKworLyogcHJvYyBzdHVmZiAqLwordm9pZCBydGw4MTkyX3Byb2NfaW5pdF9vbmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxOTJfcHJvY19yZW1vdmVfb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGw4MTkyX3Byb2NfbW9kdWxlX2luaXQodm9pZCk7Cit2b2lkIHJ0bDgxOTJfcHJvY19tb2R1bGVfcmVtb3ZlKHZvaWQpOwordm9pZCBydGw4MTkyX2RiZ3BfZmxhZ19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxfZG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxfZG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2ZhOWFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9kbS5jCkBAIC0wLDAgKzEsMjk5NSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJydGxfY29yZS5oIgorI2luY2x1ZGUgInJ0bF9kbS5oIgorI2luY2x1ZGUgInI4MTkyRV9ody5oIgorI2luY2x1ZGUgInI4MTkyRV9waHkuaCIKKyNpbmNsdWRlICJyODE5MkVfcGh5cmVnLmgiCisjaW5jbHVkZSAicjgxOTBQX3J0bDgyNTYuaCIKKyNpbmNsdWRlICJyODE5MkVfY21kcGt0LmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIExvY2FsIENvbnN0YW50LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB1MzIgZWRjYV9zZXR0aW5nX0RMW0hUX0lPVF9QRUVSX01BWF0gPSB7CisJMHg1ZTQzMjIsCisJMHg1ZTQzMjIsCisJMHg1ZWE0NGYsCisJMHg1ZTQzMjIsCisJMHg2MDQzMjIsCisJMHhhNDRmLAorCTB4NWU0MzIyLAorCTB4NWU0MzMyCit9OworCitzdGF0aWMgdTMyIGVkY2Ffc2V0dGluZ19ETF9HTW9kZVtIVF9JT1RfUEVFUl9NQVhdID0geworCTB4NWU0MzIyLAorCTB4NWU0MzIyLAorCTB4NWU0MzIyLAorCTB4NWU0MzIyLAorCTB4NjA0MzIyLAorCTB4YTQ0ZiwKKwkweDVlNDMyMiwKKwkweDVlNDMyMgorfTsKKworc3RhdGljIHUzMiBlZGNhX3NldHRpbmdfVUxbSFRfSU9UX1BFRVJfTUFYXSA9IHsKKwkweDVlNDMyMiwKKwkweGE0NGYsCisJMHg1ZWE0NGYsCisJMHg1ZTQzMjIsCisJMHg2MDQzMjIsCisJMHg1ZTQzMjIsCisJMHg1ZTQzMjIsCisJMHg1ZTQzMzIKK307CisKKyNkZWZpbmUgUlRLX1VMX0VEQ0EgMHhhNDRmCisjZGVmaW5lIFJUS19ETF9FRENBIDB4NWU0MzIyCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBMb2NhbCBDb25zdGFudC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgZ2xvYmFsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RydWN0IGRpZ190IGRtX2RpZ3RhYmxlOwordTggZG1fc2hhZG93WzE2XVsyNTZdID0geworCXswfQorfTsKKworc3RydWN0IGRyeF9wYXRoX3NlbCBETV9SeFBhdGhTZWxUYWJsZTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIGdsb2JhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBsb2NhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBsb2NhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMJdm9pZAlkbV9jaGVja19yYXRlX2FkYXB0aXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCitzdGF0aWMJdm9pZAlkbV9pbml0X2JhbmR3aWR0aF9hdXRvc3dpdGNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljCXZvaWQJZG1fYmFuZHdpZHRoX2F1dG9zd2l0Y2goc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworc3RhdGljCXZvaWQJZG1fY2hlY2tfdHhwb3dlcl90cmFja2luZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCisKKworCitzdGF0aWMJdm9pZAlkbV9iYl9pbml0aWFsZ2Fpbl9yZXN0b3JlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisKK3N0YXRpYwl2b2lkCWRtX2JiX2luaXRpYWxnYWluX2JhY2t1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljCXZvaWQgZG1fZGlnX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMJdm9pZCBkbV9jdHJsX2luaXRnYWluX2J5cnNzaShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYwl2b2lkIGRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpX2hpZ2hwd3Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitzdGF0aWMJdm9pZCBkbV9jdHJsX2luaXRnYWluX2J5cnNzaV9ieV9kcml2ZXJyc3NpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljCXZvaWQgZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2lfYnlfZndmYWxzZV9hbGFybShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYwl2b2lkIGRtX2luaXRpYWxfZ2FpbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYwl2b2lkIGRtX3BkX3RoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljCXZvaWQgZG1fY3NfcmF0aW8oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYwl2b2lkIGRtX2luaXRfY3RzdG9zZWxmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljCXZvaWQgZG1fSW5pdF9XQV9Ccm9hZGNvbV9JT1Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYwl2b2lkCWRtX2NoZWNrX2VkY2FfdHVyYm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3N0YXRpYwl2b2lkIGRtX2NoZWNrX3BiY19ncGlvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisKK3N0YXRpYwl2b2lkIGRtX2NoZWNrX3J4X3BhdGhfc2VsZWN0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljCXZvaWQgZG1faW5pdF9yeHBhdGhfc2VsZWN0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljCXZvaWQgZG1fcnhwYXRoX3NlbF9ieXJzc2koc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKworc3RhdGljIHZvaWQgZG1faW5pdF9mc3luYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIGRtX2RlSW5pdF9mc3luYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RhdGljCXZvaWQgZG1fY2hlY2tfdHhyYXRlYW5kcmV0cnljb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyAgdm9pZCBkbV9jaGVja19hY19kY19wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgbG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMJdm9pZAlkbV9pbml0X2R5bmFtaWNfdHhwb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYwl2b2lkCWRtX2R5bmFtaWNfdHhwb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCitzdGF0aWMJdm9pZCBkbV9zZW5kX3Jzc2lfdG9mdyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYwl2b2lkCWRtX2N0c3Rvc2VsZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIGZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaW5pdF9oYWxfZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJcHJpdi0+RE1fVHlwZSA9IERNX1R5cGVfQnlEcml2ZXI7CisKKwlwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0gLTE7CisKKwlkbV9pbml0X2R5bmFtaWNfdHhwb3dlcihkZXYpOworCisJaW5pdF9yYXRlX2FkYXB0aXZlKGRldik7CisKKwlkbV9kaWdfaW5pdChkZXYpOworCWRtX2luaXRfZWRjYV90dXJibyhkZXYpOworCWRtX2luaXRfYmFuZHdpZHRoX2F1dG9zd2l0Y2goZGV2KTsKKwlkbV9pbml0X2ZzeW5jKGRldik7CisJZG1faW5pdF9yeHBhdGhfc2VsZWN0aW9uKGRldik7CisJZG1faW5pdF9jdHN0b3NlbGYoZGV2KTsKKwlpZiAoSVNfSEFSRFdBUkVfVFlQRV84MTkyU0UoZGV2KSkKKwkJZG1fSW5pdF9XQV9Ccm9hZGNvbV9JT1QoZGV2KTsKKworCUlOSVRfREVMQVlFRF9XT1JLX1JTTCgmcHJpdi0+Z3Bpb19jaGFuZ2VfcmZfd3EsICh2b2lkICopZG1fQ2hlY2tSZkN0cmxHUElPLCBkZXYpOworfQorCit2b2lkIGRlaW5pdF9oYWxfZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCWRtX2RlSW5pdF9mc3luYyhkZXYpOworCit9CisKK3ZvaWQgaGFsX2RtX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCWlmIChwcml2LT5iZWluZ19pbml0X2FkYXB0ZXIpCisJCXJldHVybjsKKworCWRtX2NoZWNrX2FjX2RjX3Bvd2VyKGRldik7CisKKwlkbV9jaGVja19wYmNfZ3BpbyhkZXYpOworCWRtX2NoZWNrX3R4cmF0ZWFuZHJldHJ5Y291bnQoZGV2KTsKKwlkbV9jaGVja19lZGNhX3R1cmJvKGRldik7CisKKwlkbV9jaGVja19yYXRlX2FkYXB0aXZlKGRldik7CisJZG1fZHluYW1pY190eHBvd2VyKGRldik7CisJZG1fY2hlY2tfdHhwb3dlcl90cmFja2luZyhkZXYpOworCisJZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2koZGV2KTsKKwlkbV9iYW5kd2lkdGhfYXV0b3N3aXRjaChkZXYpOworCisJZG1fY2hlY2tfcnhfcGF0aF9zZWxlY3Rpb24oZGV2KTsKKwlkbV9jaGVja19mc3luYyhkZXYpOworCisJZG1fc2VuZF9yc3NpX3RvZncoZGV2KTsKKwlkbV9jdHN0b3NlbGYoZGV2KTsKK30KKworc3RhdGljIHZvaWQgZG1fY2hlY2tfYWNfZGNfcG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJc3RhdGljIGNoYXIgKmFjX2RjX2NoZWNrX3NjcmlwdF9wYXRoID0gIi9ldGMvYWNwaS93aXJlbGVzcy1ydGwtYWMtZGMtcG93ZXIuc2giOworCWNoYXIgKmFyZ3ZbXSA9IHthY19kY19jaGVja19zY3JpcHRfcGF0aCwgRFJWX05BTUUsIE5VTEx9OworCXN0YXRpYyBjaGFyICplbnZwW10gPSB7IkhPTUU9LyIsCisJCQkiVEVSTT1saW51eCIsCisJCQkiUEFUSD0vdXNyL2JpbjovYmluIiwKKwkJCSBOVUxMfTsKKworCWlmIChwcml2LT5SZXNldFByb2dyZXNzID09IFJFU0VUX1RZUEVfU0lMRU5UKSB7CisJCVJUX1RSQUNFKChDT01QX0lOSVQgfCBDT01QX1BPV0VSIHwgQ09NUF9SRiksCisJCQkgIkdQSU9DaGFuZ2VSRldvcmtJdGVtQ2FsbEJhY2soKTogU2lsZW50IFJlc2V0aW5nISEhISEhIVxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAocHJpdi0+cnRsbGliLT5zdGF0ZSAhPSBSVExMSUJfTElOS0VEKQorCQlyZXR1cm47CisJY2FsbF91c2VybW9kZWhlbHBlcihhY19kY19jaGVja19zY3JpcHRfcGF0aCwgYXJndiwgZW52cCwgMSk7CisKKwlyZXR1cm47Cit9OworCisKK3ZvaWQgaW5pdF9yYXRlX2FkYXB0aXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJc3RydWN0IHJhdGVfYWRhcHRpdmUgKnByYSA9IChzdHJ1Y3QgcmF0ZV9hZGFwdGl2ZSAqKSZwcml2LT5yYXRlX2FkYXB0aXZlOworCisJcHJhLT5yYXRyX3N0YXRlID0gRE1fUkFUUl9TVEFfTUFYOworCXByYS0+aGlnaDJsb3dfcnNzaV90aHJlc2hfZm9yX3JhID0gUmF0ZUFkYXB0aXZlVEhfSGlnaDsKKwlwcmEtPmxvdzJoaWdoX3Jzc2lfdGhyZXNoX2Zvcl9yYTIwTSA9IFJhdGVBZGFwdGl2ZVRIX0xvd18yME0rNTsKKwlwcmEtPmxvdzJoaWdoX3Jzc2lfdGhyZXNoX2Zvcl9yYTQwTSA9IFJhdGVBZGFwdGl2ZVRIX0xvd180ME0rNTsKKworCXByYS0+aGlnaF9yc3NpX3RocmVzaF9mb3JfcmEgPSBSYXRlQWRhcHRpdmVUSF9IaWdoKzU7CisJcHJhLT5sb3dfcnNzaV90aHJlc2hfZm9yX3JhMjBNID0gUmF0ZUFkYXB0aXZlVEhfTG93XzIwTTsKKwlwcmEtPmxvd19yc3NpX3RocmVzaF9mb3JfcmE0ME0gPSBSYXRlQWRhcHRpdmVUSF9Mb3dfNDBNOworCisJaWYgKHByaXYtPkN1c3RvbWVySUQgPT0gUlRfQ0lEXzgxOXhfTmV0Y29yZSkKKwkJcHJhLT5waW5nX3Jzc2lfZW5hYmxlID0gMTsKKwllbHNlCisJCXByYS0+cGluZ19yc3NpX2VuYWJsZSA9IDA7CisJcHJhLT5waW5nX3Jzc2lfdGhyZXNoX2Zvcl9yYSA9IDE1OworCisKKwlpZiAocHJpdi0+cmZfdHlwZSA9PSBSRl8yVDRSKSB7CisJCXByYS0+dXBwZXJfcnNzaV90aHJlc2hvbGRfcmF0cgkJPQkweDhmMGYwMDAwOworCQlwcmEtPm1pZGRsZV9yc3NpX3RocmVzaG9sZF9yYXRyCQk9CTB4OGYwZmYwMDA7CisJCXByYS0+bG93X3Jzc2lfdGhyZXNob2xkX3JhdHIJCT0JMHg4ZjBmZjAwMTsKKwkJcHJhLT5sb3dfcnNzaV90aHJlc2hvbGRfcmF0cl80ME0JPQkweDhmMGZmMDA1OworCQlwcmEtPmxvd19yc3NpX3RocmVzaG9sZF9yYXRyXzIwTQk9CTB4OGYwZmYwMDE7CisJCXByYS0+cGluZ19yc3NpX3JhdHIJPQkweDAwMDAwMDBkOworCX0gZWxzZSBpZiAocHJpdi0+cmZfdHlwZSA9PSBSRl8xVDJSKSB7CisJCXByYS0+dXBwZXJfcnNzaV90aHJlc2hvbGRfcmF0cgkJPQkweDAwMGZjMDAwOworCQlwcmEtPm1pZGRsZV9yc3NpX3RocmVzaG9sZF9yYXRyCQk9CTB4MDAwZmYwMDA7CisJCXByYS0+bG93X3Jzc2lfdGhyZXNob2xkX3JhdHIJCT0JMHgwMDBmZjAwMTsKKwkJcHJhLT5sb3dfcnNzaV90aHJlc2hvbGRfcmF0cl80ME0JPQkweDAwMGZmMDA1OworCQlwcmEtPmxvd19yc3NpX3RocmVzaG9sZF9yYXRyXzIwTQk9CTB4MDAwZmYwMDE7CisJCXByYS0+cGluZ19yc3NpX3JhdHIJPQkweDAwMDAwMDBkOworCX0KKworfQorCisKK3N0YXRpYyB2b2lkIGRtX2NoZWNrX3JhdGVfYWRhcHRpdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJc3RydWN0IHJ0X2hpX3Rocm91Z2hwdXQgKnBIVEluZm8gPSBwcml2LT5ydGxsaWItPnBIVEluZm87CisJc3RydWN0IHJhdGVfYWRhcHRpdmUgKnByYSA9IChzdHJ1Y3QgcmF0ZV9hZGFwdGl2ZSAqKSZwcml2LT5yYXRlX2FkYXB0aXZlOworCXUzMiBjdXJyZW50UkFUUiwgdGFyZ2V0UkFUUiA9IDA7CisJdTMyIExvd1JTU0lUaHJlc2hGb3JSQSA9IDAsIEhpZ2hSU1NJVGhyZXNoRm9yUkEgPSAwOworCWJvb2wgYnNob3J0X2dpX2VuYWJsZWQgPSBmYWxzZTsKKwlzdGF0aWMgdTggcGluZ19yc3NpX3N0YXRlOworCisJaWYgKElTX05JQ19ET1dOKHByaXYpKSB7CisJCVJUX1RSQUNFKENPTVBfUkFURSwgIjwtLS0tIGRtX2NoZWNrX3JhdGVfYWRhcHRpdmUoKTogZHJpdmVyIGlzIGdvaW5nIHRvIHVubG9hZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAocHJhLT5yYXRlX2FkYXB0aXZlX2Rpc2FibGVkKQorCQlyZXR1cm47CisKKwlpZiAoIShwcml2LT5ydGxsaWItPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9OXzI0RyB8fAorCSAgICBwcml2LT5ydGxsaWItPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9OXzVHKSkKKwkJcmV0dXJuOworCisJaWYgKHByaXYtPnJ0bGxpYi0+c3RhdGUgPT0gUlRMTElCX0xJTktFRCkgeworCisJCWJzaG9ydF9naV9lbmFibGVkID0gKHBIVEluZm8tPmJDdXJUeEJXNDBNSHogJiYgcEhUSW5mby0+YkN1clNob3J0R0k0ME1IeikgfHwKKwkJCSghcEhUSW5mby0+YkN1clR4Qlc0ME1IeiAmJiBwSFRJbmZvLT5iQ3VyU2hvcnRHSTIwTUh6KTsKKworCisJCXByYS0+dXBwZXJfcnNzaV90aHJlc2hvbGRfcmF0ciA9CisJCQkJKHByYS0+dXBwZXJfcnNzaV90aHJlc2hvbGRfcmF0ciAmICh+QklUMzEpKSB8ICgoYnNob3J0X2dpX2VuYWJsZWQpID8gQklUMzEgOiAwKTsKKworCQlwcmEtPm1pZGRsZV9yc3NpX3RocmVzaG9sZF9yYXRyID0KKwkJCQkocHJhLT5taWRkbGVfcnNzaV90aHJlc2hvbGRfcmF0ciAmICh+QklUMzEpKSB8ICgoYnNob3J0X2dpX2VuYWJsZWQpID8gQklUMzEgOiAwKTsKKworCQlpZiAocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKSB7CisJCQlwcmEtPmxvd19yc3NpX3RocmVzaG9sZF9yYXRyID0KKwkJCQkocHJhLT5sb3dfcnNzaV90aHJlc2hvbGRfcmF0cl80ME0gJiAofkJJVDMxKSkgfCAoKGJzaG9ydF9naV9lbmFibGVkKSA/IEJJVDMxIDogMCk7CisJCX0gZWxzZSB7CisJCQlwcmEtPmxvd19yc3NpX3RocmVzaG9sZF9yYXRyID0KKwkJCShwcmEtPmxvd19yc3NpX3RocmVzaG9sZF9yYXRyXzIwTSAmICh+QklUMzEpKSB8ICgoYnNob3J0X2dpX2VuYWJsZWQpID8gQklUMzEgOiAwKTsKKwkJfQorCQlwcmEtPnBpbmdfcnNzaV9yYXRyID0KKwkJCQkocHJhLT5waW5nX3Jzc2lfcmF0ciAmICh+QklUMzEpKSB8ICgoYnNob3J0X2dpX2VuYWJsZWQpID8gQklUMzEgOiAwKTsKKworCQlpZiAocHJhLT5yYXRyX3N0YXRlID09IERNX1JBVFJfU1RBX0hJR0gpIHsKKwkJCUhpZ2hSU1NJVGhyZXNoRm9yUkEJPSBwcmEtPmhpZ2gybG93X3Jzc2lfdGhyZXNoX2Zvcl9yYTsKKwkJCUxvd1JTU0lUaHJlc2hGb3JSQQk9IChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApID8KKwkJCQkJKHByYS0+bG93X3Jzc2lfdGhyZXNoX2Zvcl9yYTQwTSkgOiAocHJhLT5sb3dfcnNzaV90aHJlc2hfZm9yX3JhMjBNKTsKKwkJfSBlbHNlIGlmIChwcmEtPnJhdHJfc3RhdGUgPT0gRE1fUkFUUl9TVEFfTE9XKSB7CisJCQlIaWdoUlNTSVRocmVzaEZvclJBCT0gcHJhLT5oaWdoX3Jzc2lfdGhyZXNoX2Zvcl9yYTsKKwkJCUxvd1JTU0lUaHJlc2hGb3JSQQk9IChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApID8KKwkJCQkJKHByYS0+bG93MmhpZ2hfcnNzaV90aHJlc2hfZm9yX3JhNDBNKSA6IChwcmEtPmxvdzJoaWdoX3Jzc2lfdGhyZXNoX2Zvcl9yYTIwTSk7CisJCX0gZWxzZSB7CisJCQlIaWdoUlNTSVRocmVzaEZvclJBCT0gcHJhLT5oaWdoX3Jzc2lfdGhyZXNoX2Zvcl9yYTsKKwkJCUxvd1JTU0lUaHJlc2hGb3JSQQk9IChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApID8KKwkJCQkJKHByYS0+bG93X3Jzc2lfdGhyZXNoX2Zvcl9yYTQwTSkgOiAocHJhLT5sb3dfcnNzaV90aHJlc2hfZm9yX3JhMjBNKTsKKwkJfQorCisJCWlmIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IChsb25nKUhpZ2hSU1NJVGhyZXNoRm9yUkEpIHsKKwkJCXByYS0+cmF0cl9zdGF0ZSA9IERNX1JBVFJfU1RBX0hJR0g7CisJCQl0YXJnZXRSQVRSID0gcHJhLT51cHBlcl9yc3NpX3RocmVzaG9sZF9yYXRyOworCQl9IGVsc2UgaWYgKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gKGxvbmcpTG93UlNTSVRocmVzaEZvclJBKSB7CisJCQlwcmEtPnJhdHJfc3RhdGUgPSBETV9SQVRSX1NUQV9NSURETEU7CisJCQl0YXJnZXRSQVRSID0gcHJhLT5taWRkbGVfcnNzaV90aHJlc2hvbGRfcmF0cjsKKwkJfSBlbHNlIHsKKwkJCXByYS0+cmF0cl9zdGF0ZSA9IERNX1JBVFJfU1RBX0xPVzsKKwkJCXRhcmdldFJBVFIgPSBwcmEtPmxvd19yc3NpX3RocmVzaG9sZF9yYXRyOworCQl9CisKKwkJaWYgKHByYS0+cGluZ19yc3NpX2VuYWJsZSkgeworCQkJaWYgKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPCAobG9uZykocHJhLT5waW5nX3Jzc2lfdGhyZXNoX2Zvcl9yYSs1KSkgeworCQkJCWlmICgocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8IChsb25nKXByYS0+cGluZ19yc3NpX3RocmVzaF9mb3JfcmEpIHx8CisJCQkJICAgIHBpbmdfcnNzaV9zdGF0ZSkgeworCQkJCQlwcmEtPnJhdHJfc3RhdGUgPSBETV9SQVRSX1NUQV9MT1c7CisJCQkJCXRhcmdldFJBVFIgPSBwcmEtPnBpbmdfcnNzaV9yYXRyOworCQkJCQlwaW5nX3Jzc2lfc3RhdGUgPSAxOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcGluZ19yc3NpX3N0YXRlID0gMDsKKwkJCX0KKwkJfQorCisJCWlmIChwcml2LT5ydGxsaWItPkdldEhhbGZObW9kZVN1cHBvcnRCeUFQc0hhbmRsZXIoZGV2KSkKKwkJCXRhcmdldFJBVFIgJj0gIDB4ZjAwZmZmZmY7CisKKwkJY3VycmVudFJBVFIgPSByZWFkX25pY19kd29yZChkZXYsIFJBVFIwKTsKKwkJaWYgKHRhcmdldFJBVFIgIT0gIGN1cnJlbnRSQVRSKSB7CisJCQl1MzIgcmF0cl92YWx1ZTsKKwkJCXJhdHJfdmFsdWUgPSB0YXJnZXRSQVRSOworCQkJUlRfVFJBQ0UoQ09NUF9SQVRFLAorCQkJCSAiY3VycmVudFJBVFIgPSAleCwgdGFyZ2V0UkFUUiA9ICV4XG4iLAorCQkJCSBjdXJyZW50UkFUUiwgdGFyZ2V0UkFUUik7CisJCQlpZiAocHJpdi0+cmZfdHlwZSA9PSBSRl8xVDJSKQorCQkJCXJhdHJfdmFsdWUgJj0gfihSQVRFX0FMTF9PRkRNXzJTUyk7CisJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSQVRSMCwgcmF0cl92YWx1ZSk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFVGV1AsIDEpOworCisJCQlwcmEtPmxhc3RfcmF0ciA9IHRhcmdldFJBVFI7CisJCX0KKworCX0gZWxzZSB7CisJCXByYS0+cmF0cl9zdGF0ZSA9IERNX1JBVFJfU1RBX01BWDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRtX2luaXRfYmFuZHdpZHRoX2F1dG9zd2l0Y2goc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisKKwlwcml2LT5ydGxsaWItPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC50aHJlc2hvbGRfMjBNaHp0bzQwTWh6ID0gQldfQVVUT19TV0lUQ0hfTE9XX0hJR0g7CisJcHJpdi0+cnRsbGliLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2gudGhyZXNob2xkXzQwTWh6dG8yME1oeiA9IEJXX0FVVE9fU1dJVENIX0hJR0hfTE9XOworCXByaXYtPnJ0bGxpYi0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLmJmb3JjZWRfdHgyME1oeiA9IGZhbHNlOworCXByaXYtPnJ0bGxpYi0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLmJhdXRvc3dpdGNoX2VuYWJsZSA9IGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBkbV9iYW5kd2lkdGhfYXV0b3N3aXRjaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCWlmIChwcml2LT5DdXJyZW50Q2hhbm5lbEJXID09IEhUX0NIQU5ORUxfV0lEVEhfMjAgfHwKKwkgICAhcHJpdi0+cnRsbGliLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2guYmF1dG9zd2l0Y2hfZW5hYmxlKSB7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQlpZiAocHJpdi0+cnRsbGliLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2guYmZvcmNlZF90eDIwTWh6ID09IGZhbHNlKSB7CisJCQlpZiAocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8PQorCQkJICAgIHByaXYtPnJ0bGxpYi0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLnRocmVzaG9sZF80ME1oenRvMjBNaHopCisJCQkJcHJpdi0+cnRsbGliLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2guYmZvcmNlZF90eDIwTWh6ID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCWlmIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49CisJCQkgICAgcHJpdi0+cnRsbGliLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2gudGhyZXNob2xkXzIwTWh6dG80ME1oeikKKwkJCQlwcml2LT5ydGxsaWItPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC5iZm9yY2VkX3R4MjBNaHogPSBmYWxzZTsKKworCQl9CisJfQorfQorCitzdGF0aWMgdTMyIE9GRE1Td2luZ1RhYmxlW09GRE1fVGFibGVfTGVuZ3RoXSA9IHsKKwkweDdmODAwMWZlLAorCTB4NzFjMDAxYzcsCisJMHg2NTQwMDE5NSwKKwkweDVhNDAwMTY5LAorCTB4NTA4MDAxNDIsCisJMHg0N2MwMDExZiwKKwkweDQwMDAwMTAwLAorCTB4MzkwMDAwZTQsCisJMHgzMmMwMDBjYiwKKwkweDJkNDAwMGI1LAorCTB4Mjg4MDAwYTIsCisJMHgyNDAwMDA5MCwKKwkweDIwMDAwMDgwLAorCTB4MWM4MDAwNzIsCisJMHgxOTgwMDA2NiwKKwkweDI2YzAwMDViLAorCTB4MjQ0MDAwNTEsCisJMHgxMjAwMDA0OCwKKwkweDEwMDAwMDQwCit9OworCitzdGF0aWMgdTgJQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1tDQ0tfVGFibGVfbGVuZ3RoXVs4XSA9IHsKKwl7MHgzNiwgMHgzNSwgMHgyZSwgMHgyNSwgMHgxYywgMHgxMiwgMHgwOSwgMHgwNH0sCisJezB4MzAsIDB4MmYsIDB4MjksIDB4MjEsIDB4MTksIDB4MTAsIDB4MDgsIDB4MDN9LAorCXsweDJiLCAweDJhLCAweDI1LCAweDFlLCAweDE2LCAweDBlLCAweDA3LCAweDAzfSwKKwl7MHgyNiwgMHgyNSwgMHgyMSwgMHgxYiwgMHgxNCwgMHgwZCwgMHgwNiwgMHgwM30sCisJezB4MjIsIDB4MjEsIDB4MWQsIDB4MTgsIDB4MTEsIDB4MGIsIDB4MDYsIDB4MDJ9LAorCXsweDFmLCAweDFlLCAweDFhLCAweDE1LCAweDEwLCAweDBhLCAweDA1LCAweDAyfSwKKwl7MHgxYiwgMHgxYSwgMHgxNywgMHgxMywgMHgwZSwgMHgwOSwgMHgwNCwgMHgwMn0sCisJezB4MTgsIDB4MTcsIDB4MTUsIDB4MTEsIDB4MGMsIDB4MDgsIDB4MDQsIDB4MDJ9LAorCXsweDE2LCAweDE1LCAweDEyLCAweDBmLCAweDBiLCAweDA3LCAweDA0LCAweDAxfSwKKwl7MHgxMywgMHgxMywgMHgxMCwgMHgwZCwgMHgwYSwgMHgwNiwgMHgwMywgMHgwMX0sCisJezB4MTEsIDB4MTEsIDB4MGYsIDB4MGMsIDB4MDksIDB4MDYsIDB4MDMsIDB4MDF9LAorCXsweDBmLCAweDBmLCAweDBkLCAweDBiLCAweDA4LCAweDA1LCAweDAzLCAweDAxfQorfTsKKworc3RhdGljIHU4CUNDS1N3aW5nVGFibGVfQ2gxNFtDQ0tfVGFibGVfbGVuZ3RoXVs4XSA9IHsKKwl7MHgzNiwgMHgzNSwgMHgyZSwgMHgxYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCisJezB4MzAsIDB4MmYsIDB4MjksIDB4MTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAorCXsweDJiLCAweDJhLCAweDI1LCAweDE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwKKwl7MHgyNiwgMHgyNSwgMHgyMSwgMHgxMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCisJezB4MjIsIDB4MjEsIDB4MWQsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAorCXsweDFmLCAweDFlLCAweDFhLCAweDBmLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwKKwl7MHgxYiwgMHgxYSwgMHgxNywgMHgwZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCisJezB4MTgsIDB4MTcsIDB4MTUsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAorCXsweDE2LCAweDE1LCAweDEyLCAweDBiLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwKKwl7MHgxMywgMHgxMywgMHgxMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCisJezB4MTEsIDB4MTEsIDB4MGYsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAorCXsweDBmLCAweDBmLCAweDBkLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDAwfQorfTsKKworI2RlZmluZQkJUHdfVHJhY2tfRmxhZwkJCQkweDExZAorI2RlZmluZQkJVHNzaV9NZWFfVmFsdWUJCQkJMHgxM2MKKyNkZWZpbmUJCVRzc2lfUmVwb3J0X1ZhbHVlMQkJCTB4MTM0CisjZGVmaW5lCQlUc3NpX1JlcG9ydF9WYWx1ZTIJCQkweDEzZQorI2RlZmluZQkJRldfQnVzeV9GbGFnCQkJCTB4MTNmCisKK3N0YXRpYyB2b2lkIGRtX1RYUG93ZXJUcmFja2luZ0NhbGxiYWNrX1RTU0koc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJYm9vbAliSGlnaHBvd2Vyc3RhdGUsIHZpdmlmbGFnID0gZmFsc2U7CisJc3RydWN0IGRjbWRfdHhjbWQgdHhfY21kOworCXU4CXBvd2VybGV2ZWxPRkRNMjRHOworCWludAlpID0gMCwgaiA9IDAsIGsgPSAwOworCXU4CVJGX1R5cGUsIHRtcF9yZXBvcnRbNV0gPSB7MCwgMCwgMCwgMCwgMH07CisJdTMyCVZhbHVlOworCXU4CVB3cl9GbGFnOworCXUxNglBdmdfVFNTSV9NZWFzLCBUU1NJXzEzZEJtLCBBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyID0gMDsKKwl1MzIJZGVsdGEgPSAwOworCisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIiVzKClcbiIsIF9fZnVuY19fKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFB3X1RyYWNrX0ZsYWcsIDApOworCXdyaXRlX25pY19ieXRlKGRldiwgRldfQnVzeV9GbGFnLCAwKTsKKwlwcml2LT5ydGxsaWItPmJkeW5hbWljX3R4cG93ZXJfZW5hYmxlID0gZmFsc2U7CisJYkhpZ2hwb3dlcnN0YXRlID0gcHJpdi0+YkR5bmFtaWNUeEhpZ2hQb3dlcjsKKworCXBvd2VybGV2ZWxPRkRNMjRHID0gKHU4KShwcml2LT5Qd3JfVHJhY2s+PjI0KTsKKwlSRl9UeXBlID0gcHJpdi0+cmZfdHlwZTsKKwlWYWx1ZSA9IChSRl9UeXBlPDw4KSB8IHBvd2VybGV2ZWxPRkRNMjRHOworCisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInBvd2VybGV2ZWxPRkRNMjRHID0gJXhcbiIsCisJCSBwb3dlcmxldmVsT0ZETTI0Ryk7CisKKworCWZvciAoaiA9IDA7IGogPD0gMzA7IGorKykgeworCisJCXR4X2NtZC5PcAkJPSBUWENNRF9TRVRfVFhfUFdSX1RSQUNLSU5HOworCQl0eF9jbWQuTGVuZ3RoCT0gNDsKKwkJdHhfY21kLlZhbHVlCQk9IFZhbHVlOworCQljbXBrX21lc3NhZ2VfaGFuZGxlX3R4KGRldiwgKHU4ICopJnR4X2NtZCwKKwkJCQkgICAgICAgREVTQ19QQUNLRVRfVFlQRV9JTklULAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGRjbWRfdHhjbWQpKTsKKwkJbWRlbGF5KDEpOworCQlmb3IgKGkgPSAwOyBpIDw9IDMwOyBpKyspIHsKKwkJCVB3cl9GbGFnID0gcmVhZF9uaWNfYnl0ZShkZXYsIFB3X1RyYWNrX0ZsYWcpOworCisJCQlpZiAoUHdyX0ZsYWcgPT0gMCkgeworCQkJCW1kZWxheSgxKTsKKworCQkJCWlmIChwcml2LT5iUmVzZXRJblByb2dyZXNzKSB7CisJCQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsCisJCQkJCQkgIndlIGFyZSBpbiBzbGllbnQgcmVzZXQgcHJvZ3Jlc3MsIHNvIHJldHVyblxuIik7CisJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgUHdfVHJhY2tfRmxhZywgMCk7CisJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgRldfQnVzeV9GbGFnLCAwKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKwkJCQlpZiAoKHByaXYtPnJ0bGxpYi0+ZVJGUG93ZXJTdGF0ZSAhPSBlUmZPbikpIHsKKwkJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywKKwkJCQkJCSAid2UgYXJlIGluIHBvd2VyIHNhdmUsIHNvIHJldHVyblxuIik7CisJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgUHdfVHJhY2tfRmxhZywgMCk7CisJCQkJCXdyaXRlX25pY19ieXRlKGRldiwgRldfQnVzeV9GbGFnLCAwKTsKKwkJCQkJcmV0dXJuOworCQkJCX0KKworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlBdmdfVFNTSV9NZWFzID0gcmVhZF9uaWNfd29yZChkZXYsIFRzc2lfTWVhX1ZhbHVlKTsKKworCQkJaWYgKEF2Z19UU1NJX01lYXMgPT0gMCkgeworCQkJCXdyaXRlX25pY19ieXRlKGRldiwgUHdfVHJhY2tfRmxhZywgMCk7CisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBGV19CdXN5X0ZsYWcsIDApOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJZm9yIChrID0gMDsgayA8IDU7IGsrKykgeworCQkJCWlmIChrICE9IDQpCisJCQkJCXRtcF9yZXBvcnRba10gPSByZWFkX25pY19ieXRlKGRldiwKKwkJCQkJCQkgVHNzaV9SZXBvcnRfVmFsdWUxK2spOworCQkJCWVsc2UKKwkJCQkJdG1wX3JlcG9ydFtrXSA9IHJlYWRfbmljX2J5dGUoZGV2LAorCQkJCQkJCSBUc3NpX1JlcG9ydF9WYWx1ZTIpOworCisJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywKKwkJCQkJICJUU1NJX3JlcG9ydF92YWx1ZSA9ICVkXG4iLAorCQkJCQkgdG1wX3JlcG9ydFtrXSk7CisKKwkJCSAgICAgICBpZiAodG1wX3JlcG9ydFtrXSA8PSAyMCkgeworCQkJCQl2aXZpZmxhZyA9IHRydWU7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHZpdmlmbGFnID09IHRydWUpIHsKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFB3X1RyYWNrX0ZsYWcsIDApOworCQkJCXZpdmlmbGFnID0gZmFsc2U7CisJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIndlIGZpbHRlZCB0aGlzIGRhdGFcbiIpOworCQkJCWZvciAoayA9IDA7IGsgPCA1OyBrKyspCisJCQkJCXRtcF9yZXBvcnRba10gPSAwOworCQkJCWJyZWFrOworCQkJfQorCisJCQlmb3IgKGsgPSAwOyBrIDwgNTsgaysrKQorCQkJCUF2Z19UU1NJX01lYXNfZnJvbV9kcml2ZXIgKz0gdG1wX3JlcG9ydFtrXTsKKworCQkJQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlciA9IEF2Z19UU1NJX01lYXNfZnJvbV9kcml2ZXIqMTAwLzU7CisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLAorCQkJCSAiQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlciA9ICVkXG4iLAorCQkJCSBBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyKTsKKwkJCVRTU0lfMTNkQm0gPSBwcml2LT5UU1NJXzEzZEJtOworCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlRTU0lfMTNkQm0gPSAlZFxuIiwgVFNTSV8xM2RCbSk7CisKKwkJCWlmIChBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyID4gVFNTSV8xM2RCbSkKKwkJCQlkZWx0YSA9IEF2Z19UU1NJX01lYXNfZnJvbV9kcml2ZXIgLSBUU1NJXzEzZEJtOworCQkJZWxzZQorCQkJCWRlbHRhID0gVFNTSV8xM2RCbSAtIEF2Z19UU1NJX01lYXNfZnJvbV9kcml2ZXI7CisKKwkJCWlmIChkZWx0YSA8PSBFX0ZPUl9UWF9QT1dFUl9UUkFDSykgeworCQkJCXByaXYtPnJ0bGxpYi0+YmR5bmFtaWNfdHhwb3dlcl9lbmFibGUgPSB0cnVlOworCQkJCXdyaXRlX25pY19ieXRlKGRldiwgUHdfVHJhY2tfRmxhZywgMCk7CisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBGV19CdXN5X0ZsYWcsIDApOworCQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsCisJCQkJCSAidHggcG93ZXIgdHJhY2sgaXMgZG9uZVxuIik7CisJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywKKwkJCQkJICJwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXggPSAlZFxuIiwKKwkJCQkJIHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCk7CisJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywKKwkJCQkJICJwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCA9ICVkXG4iLAorCQkJCQkgcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwpOworCQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsCisJCQkJCSAicHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlID0gJWRcbiIsCisJCQkJCSBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UpOworCQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsCisJCQkJCSAicHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA9ICVkXG4iLAorCQkJCQkgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbik7CisJCQkJcmV0dXJuOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlciA8IFRTU0lfMTNkQm0gLSBFX0ZPUl9UWF9QT1dFUl9UUkFDSykgeworCQkJCQlpZiAoUkZfVHlwZSA9PSBSRl8yVDRSKSB7CisKKwkJCQkJCWlmICgocHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4ID4gMCkgJiYKKwkJCQkJCSAgICAocHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4ID4gMCkpIHsKKwkJCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXgtLTsKKwkJCQkJCQlpZiAocHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwgPiA0KSB7CisJCQkJCQkJCXByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsLS07CisJCQkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LAorCQkJCQkJCQkJIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsCisJCQkJCQkJCQkgYk1hc2tEV29yZCwKKwkJCQkJCQkJCSBwcml2LT50eGJiZ2Fpbl90YWJsZVtwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbF0udHhiYmdhaW5fdmFsdWUpOworCQkJCQkJCX0KKworCQkJCQkJCXByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleC0tOworCQkJCQkJCWlmIChwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCA+IDQpIHsKKwkJCQkJCQkJcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwtLTsKKwkJCQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsCisJCQkJCQkJCQkgck9GRE0wX1hDVHhJUUltYmFsYW5jZSwKKwkJCQkJCQkJCSBiTWFza0RXb3JkLAorCQkJCQkJCQkJIHByaXYtPnR4YmJnYWluX3RhYmxlW3ByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsXS50eGJiZ2Fpbl92YWx1ZSk7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwKKwkJCQkJCQkJCSBiTWFza0RXb3JkLAorCQkJCQkJCQkJIHByaXYtPnR4YmJnYWluX3RhYmxlWzRdLnR4YmJnYWluX3ZhbHVlKTsKKwkJCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwKKwkJCQkJCQkJCSByT0ZETTBfWENUeElRSW1iYWxhbmNlLAorCQkJCQkJCQkJIGJNYXNrRFdvcmQsIHByaXYtPnR4YmJnYWluX3RhYmxlWzRdLnR4YmJnYWluX3ZhbHVlKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXggPiAwKSB7CisJCQkJCQkJcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4LS07CisJCQkJCQkJaWYgKHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsID4gNCkgeworCQkJCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbC0tOworCQkJCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwKKwkJCQkJCQkJCQkgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwKKwkJCQkJCQkJCQkgYk1hc2tEV29yZCwKKwkJCQkJCQkJCQkgcHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWxdLnR4YmJnYWluX3ZhbHVlKTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UKKwkJCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwKKwkJCQkJCQkJCSBiTWFza0RXb3JkLCBwcml2LT50eGJiZ2Fpbl90YWJsZVs0XS50eGJiZ2Fpbl92YWx1ZSk7CisKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmIChSRl9UeXBlID09IFJGXzJUNFIpIHsKKwkJCQkJCWlmICgocHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4IDwKKwkJCQkJCSAgICBUeEJCR2FpblRhYmxlTGVuZ3RoIC0gMSkgJiYKKwkJCQkJCSAgICAocHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4IDwKKwkJCQkJCSAgICBUeEJCR2FpblRhYmxlTGVuZ3RoIC0gMSkpIHsKKwkJCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXgrKzsKKwkJCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCsrOworCQkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LAorCQkJCQkJCQkgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwKKwkJCQkJCQkJIGJNYXNrRFdvcmQsCisJCQkJCQkJCSBwcml2LT50eGJiZ2Fpbl90YWJsZQorCQkJCQkJCQkgW3ByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsXS50eGJiZ2Fpbl92YWx1ZSk7CisJCQkJCQkJcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4Kys7CisJCQkJCQkJcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwrKzsKKwkJCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwKKwkJCQkJCQkJIHJPRkRNMF9YQ1R4SVFJbWJhbGFuY2UsCisJCQkJCQkJCSBiTWFza0RXb3JkLAorCQkJCQkJCQkgcHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWxdLnR4YmJnYWluX3ZhbHVlKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsCisJCQkJCQkJCSByT0ZETTBfWEFUeElRSW1iYWxhbmNlLAorCQkJCQkJCQkgYk1hc2tEV29yZCwKKwkJCQkJCQkJIHByaXYtPnR4YmJnYWluX3RhYmxlW1R4QkJHYWluVGFibGVMZW5ndGggLSAxXS50eGJiZ2Fpbl92YWx1ZSk7CisJCQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsCisJCQkJCQkJCSByT0ZETTBfWENUeElRSW1iYWxhbmNlLAorCQkJCQkJCQkgYk1hc2tEV29yZCwgcHJpdi0+dHhiYmdhaW5fdGFibGVbVHhCQkdhaW5UYWJsZUxlbmd0aCAtIDFdLnR4YmJnYWluX3ZhbHVlKTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWlmIChwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXggPCAoVHhCQkdhaW5UYWJsZUxlbmd0aCAtIDEpKSB7CisJCQkJCQkJcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4Kys7CisJCQkJCQkJcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwrKzsKKwkJCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwKKwkJCQkJCQkJCSBiTWFza0RXb3JkLAorCQkJCQkJCQkJIHByaXYtPnR4YmJnYWluX3RhYmxlW3ByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsXS50eGJiZ2Fpbl92YWx1ZSk7CisJCQkJCQl9IGVsc2UKKwkJCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwKKwkJCQkJCQkJCSBiTWFza0RXb3JkLAorCQkJCQkJCQkJIHByaXYtPnR4YmJnYWluX3RhYmxlW1R4QkJHYWluVGFibGVMZW5ndGggLSAxXS50eGJiZ2Fpbl92YWx1ZSk7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKFJGX1R5cGUgPT0gUkZfMlQ0UikgeworCQkJCQlwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UKKwkJCQkJCT0gcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4IC0gcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ19kZWZhdWx0OworCQkJCX0gZWxzZSB7CisJCQkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZQorCQkJCQkJPSBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCAtIHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdfZGVmYXVsdDsKKwkJCQl9CisKKwkJCQlpZiAocHJpdi0+Q3VycmVudENoYW5uZWxCVyA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwKQorCQkJCQlwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID0KKwkJCQkJCSBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uXzIwTWRlZmF1bHQgKworCQkJCQkJIHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZTsKKwkJCQllbHNlCisJCQkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPQorCQkJCQkJIHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fNDBNZGVmYXVsdCArCisJCQkJCQkgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlOworCisJCQkJaWYgKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPiAoQ0NLVHhCQkdhaW5UYWJsZUxlbmd0aC0xKSkKKwkJCQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA9IENDS1R4QkJHYWluVGFibGVMZW5ndGgtMTsKKwkJCQlpZiAocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA8IDApCisJCQkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPSAwOworCisJCQkJaWYgKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPiAtMSAmJgorCQkJCSAgICBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uIDwgQ0NLVHhCQkdhaW5UYWJsZUxlbmd0aCkgeworCQkJCQlpZiAocHJpdi0+cnRsbGliLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9PSAxNCAmJgorCQkJCQkgICAgIXByaXYtPmJjY2tfaW5fY2gxNCkgeworCQkJCQkJcHJpdi0+YmNja19pbl9jaDE0ID0gdHJ1ZTsKKwkJCQkJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYsIHByaXYtPmJjY2tfaW5fY2gxNCk7CisJCQkJCX0gZWxzZSBpZiAocHJpdi0+cnRsbGliLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCAhPSAxNCAmJiBwcml2LT5iY2NrX2luX2NoMTQpIHsKKwkJCQkJCXByaXYtPmJjY2tfaW5fY2gxNCA9IGZhbHNlOworCQkJCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldiwgcHJpdi0+YmNja19pbl9jaDE0KTsKKwkJCQkJfSBlbHNlCisJCQkJCQlkbV9jY2tfdHhwb3dlcl9hZGp1c3QoZGV2LCBwcml2LT5iY2NrX2luX2NoMTQpOworCQkJCX0KKwkJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLAorCQkJCQkgInByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCA9ICVkXG4iLAorCQkJCQkgcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4KTsKKwkJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLAorCQkJCQkgInByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsID0gJWRcbiIsCisJCQkJCSBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCk7CisJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywKKwkJCQkJICJwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UgPSAlZFxuIiwKKwkJCQkJIHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZSk7CisJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywKKwkJCQkJICJwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID0gJWRcbiIsCisJCQkJCSBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKTsKKworCQkJCWlmIChwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UgPD0gLTEyIHx8IHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZSA+PSAyNCkgeworCQkJCQlwcml2LT5ydGxsaWItPmJkeW5hbWljX3R4cG93ZXJfZW5hYmxlID0gdHJ1ZTsKKwkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBQd19UcmFja19GbGFnLCAwKTsKKwkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBGV19CdXN5X0ZsYWcsIDApOworCQkJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAidHggcG93ZXIgdHJhY2stLS0+bGltaXRlZFxuIik7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFB3X1RyYWNrX0ZsYWcsIDApOworCQkJQXZnX1RTU0lfTWVhc19mcm9tX2RyaXZlciA9IDA7CisJCQlmb3IgKGsgPSAwOyBrIDwgNTsgaysrKQorCQkJCXRtcF9yZXBvcnRba10gPSAwOworCQkJYnJlYWs7CisJCX0KKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBGV19CdXN5X0ZsYWcsIDApOworCX0KKwlwcml2LT5ydGxsaWItPmJkeW5hbWljX3R4cG93ZXJfZW5hYmxlID0gdHJ1ZTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIFB3X1RyYWNrX0ZsYWcsIDApOworfQorCitzdGF0aWMgdm9pZCBkbV9UWFBvd2VyVHJhY2tpbmdDYWxsYmFja19UaGVybWFsTWV0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKyNkZWZpbmUgVGhlcm1hbE1ldGVyVmFsCTkKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJdTMyIHRtcFJlZ0EsIFRlbXBDQ2s7CisJdTggdG1wT0ZETWluZGV4LCB0bXBDQ0tpbmRleCwgdG1wQ0NLMjBNaW5kZXgsIHRtcENDSzQwTWluZGV4LCB0bXB2YWw7CisJaW50IGkgPSAwLCBDQ0tTd2luZ05lZWRVcGRhdGUgPSAwOworCisJaWYgKCFwcml2LT5idHhwb3dlcl90cmFja2luZ0luaXQpIHsKKwkJdG1wUmVnQSA9IHJ0bDgxOTJfUXVlcnlCQlJlZyhkZXYsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIGJNYXNrRFdvcmQpOworCQlmb3IgKGkgPSAwOyBpIDwgT0ZETV9UYWJsZV9MZW5ndGg7IGkrKykgeworCQkJaWYgKHRtcFJlZ0EgPT0gT0ZETVN3aW5nVGFibGVbaV0pIHsKKwkJCQlwcml2LT5PRkRNX2luZGV4WzBdID0gKHU4KWk7CisJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIkluaXRpYWwgcmVnMHgleCA9IDB4JXgsIE9GRE1faW5kZXggPSAweCV4XG4iLAorCQkJCQlyT0ZETTBfWEFUeElRSW1iYWxhbmNlLCB0bXBSZWdBLCBwcml2LT5PRkRNX2luZGV4WzBdKTsKKwkJCX0KKwkJfQorCisJCVRlbXBDQ2sgPSBydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByQ0NLMF9UeEZpbHRlcjEsIGJNYXNrQnl0ZTIpOworCQlmb3IgKGkgPSAwOyBpIDwgQ0NLX1RhYmxlX2xlbmd0aDsgaSsrKSB7CisJCQlpZiAoVGVtcENDayA9PSAodTMyKUNDS1N3aW5nVGFibGVfQ2gxX0NoMTNbaV1bMF0pIHsKKwkJCQlwcml2LT5DQ0tfaW5kZXggPSAodTgpIGk7CisJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIkluaXRpYWwgcmVnMHgleCIKKwkJCQkJICIgPSAweCV4LCBDQ0tfaW5kZXggPSAweCV4XG4iLAorCQkJCQkgckNDSzBfVHhGaWx0ZXIxLCBUZW1wQ0NrLAorCQkJCQkgcHJpdi0+Q0NLX2luZGV4KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlwcml2LT5idHhwb3dlcl90cmFja2luZ0luaXQgPSB0cnVlOworCQlyZXR1cm47CisJfQorCisJdG1wUmVnQSA9IHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoZGV2LCBSRjkwX1BBVEhfQSwgMHgxMiwgMHgwNzgpOworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJSZWFkYmFjayBUaGVybWFsTWV0ZXJBID0gJWRcbiIsIHRtcFJlZ0EpOworCWlmICh0bXBSZWdBIDwgMyB8fCB0bXBSZWdBID4gMTMpCisJCXJldHVybjsKKwlpZiAodG1wUmVnQSA+PSAxMikKKwkJdG1wUmVnQSA9IDEyOworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJWYWxpZCBUaGVybWFsTWV0ZXJBID0gJWRcbiIsIHRtcFJlZ0EpOworCXByaXYtPlRoZXJtYWxNZXRlclswXSA9IFRoZXJtYWxNZXRlclZhbDsKKwlwcml2LT5UaGVybWFsTWV0ZXJbMV0gPSBUaGVybWFsTWV0ZXJWYWw7CisKKwlpZiAocHJpdi0+VGhlcm1hbE1ldGVyWzBdID49ICh1OCl0bXBSZWdBKSB7CisJCXRtcE9GRE1pbmRleCA9IHRtcENDSzIwTWluZGV4ID0gNisocHJpdi0+VGhlcm1hbE1ldGVyWzBdIC0KKwkJCSAgICAgICh1OCl0bXBSZWdBKTsKKwkJdG1wQ0NLNDBNaW5kZXggPSB0bXBDQ0syME1pbmRleCAtIDY7CisJCWlmICh0bXBPRkRNaW5kZXggPj0gT0ZETV9UYWJsZV9MZW5ndGgpCisJCQl0bXBPRkRNaW5kZXggPSBPRkRNX1RhYmxlX0xlbmd0aC0xOworCQlpZiAodG1wQ0NLMjBNaW5kZXggPj0gQ0NLX1RhYmxlX2xlbmd0aCkKKwkJCXRtcENDSzIwTWluZGV4ID0gQ0NLX1RhYmxlX2xlbmd0aC0xOworCQlpZiAodG1wQ0NLNDBNaW5kZXggPj0gQ0NLX1RhYmxlX2xlbmd0aCkKKwkJCXRtcENDSzQwTWluZGV4ID0gQ0NLX1RhYmxlX2xlbmd0aC0xOworCX0gZWxzZSB7CisJCXRtcHZhbCA9ICgodTgpdG1wUmVnQSAtIHByaXYtPlRoZXJtYWxNZXRlclswXSk7CisJCWlmICh0bXB2YWwgPj0gNikKKwkJCXRtcE9GRE1pbmRleCA9IHRtcENDSzIwTWluZGV4ID0gMDsKKwkJZWxzZQorCQkJdG1wT0ZETWluZGV4ID0gdG1wQ0NLMjBNaW5kZXggPSA2IC0gdG1wdmFsOworCQl0bXBDQ0s0ME1pbmRleCA9IDA7CisJfQorCWlmIChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApCisJCXRtcENDS2luZGV4ID0gdG1wQ0NLNDBNaW5kZXg7CisJZWxzZQorCQl0bXBDQ0tpbmRleCA9IHRtcENDSzIwTWluZGV4OworCisJcHJpdi0+UmVjb3JkX0NDS18yME1pbmRleCA9IHRtcENDSzIwTWluZGV4OworCXByaXYtPlJlY29yZF9DQ0tfNDBNaW5kZXggPSB0bXBDQ0s0ME1pbmRleDsKKwlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiUmVjb3JkX0NDS18yME1pbmRleCAvIFJlY29yZF9DQ0tfNDAiCisJCSAiTWluZGV4ID0gJWQgLyAlZC5cbiIsCisJCSBwcml2LT5SZWNvcmRfQ0NLXzIwTWluZGV4LCBwcml2LT5SZWNvcmRfQ0NLXzQwTWluZGV4KTsKKworCWlmIChwcml2LT5ydGxsaWItPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID09IDE0ICYmCisJICAgICFwcml2LT5iY2NrX2luX2NoMTQpIHsKKwkJcHJpdi0+YmNja19pbl9jaDE0ID0gdHJ1ZTsKKwkJQ0NLU3dpbmdOZWVkVXBkYXRlID0gMTsKKwl9IGVsc2UgaWYgKHByaXYtPnJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgIT0gMTQgJiYKKwkJICAgcHJpdi0+YmNja19pbl9jaDE0KSB7CisJCXByaXYtPmJjY2tfaW5fY2gxNCA9IGZhbHNlOworCQlDQ0tTd2luZ05lZWRVcGRhdGUgPSAxOworCX0KKworCWlmIChwcml2LT5DQ0tfaW5kZXggIT0gdG1wQ0NLaW5kZXgpIHsKKwkJcHJpdi0+Q0NLX2luZGV4ID0gdG1wQ0NLaW5kZXg7CisJCUNDS1N3aW5nTmVlZFVwZGF0ZSA9IDE7CisJfQorCisJaWYgKENDS1N3aW5nTmVlZFVwZGF0ZSkKKwkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldiwgcHJpdi0+YmNja19pbl9jaDE0KTsKKwlpZiAocHJpdi0+T0ZETV9pbmRleFswXSAhPSB0bXBPRkRNaW5kZXgpIHsKKwkJcHJpdi0+T0ZETV9pbmRleFswXSA9IHRtcE9GRE1pbmRleDsKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIGJNYXNrRFdvcmQsCisJCQkJIE9GRE1Td2luZ1RhYmxlW3ByaXYtPk9GRE1faW5kZXhbMF1dKTsKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlVwZGF0ZSBPRkRNU3dpbmdbJWRdID0gMHgleFxuIiwKKwkJCSBwcml2LT5PRkRNX2luZGV4WzBdLAorCQkJIE9GRE1Td2luZ1RhYmxlW3ByaXYtPk9GRE1faW5kZXhbMF1dKTsKKwl9CisJcHJpdi0+dHhwb3dlcl9jb3VudCA9IDA7Cit9CisKK3ZvaWQJZG1fdHhwb3dlcl90cmFja2luZ2NhbGxiYWNrKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2ZfZHdvcmtfcnNsKGRhdGEsCisJCQkJICBzdHJ1Y3QgcjgxOTJfcHJpdiwgdHhwb3dlcl90cmFja2luZ193cSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPnJ0bGxpYi0+ZGV2OworCisJaWYgKHByaXYtPklDX0N1dCA+PSBJQ19WZXJzaW9uQ3V0X0QpCisJCWRtX1RYUG93ZXJUcmFja2luZ0NhbGxiYWNrX1RTU0koZGV2KTsKKwllbHNlCisJCWRtX1RYUG93ZXJUcmFja2luZ0NhbGxiYWNrX1RoZXJtYWxNZXRlcihkZXYpOworfQorCitzdGF0aWMgdm9pZCBkbV9Jbml0aWFsaXplVFhQb3dlclRyYWNraW5nX1RTU0koc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCXByaXYtPnR4YmJnYWluX3RhYmxlWzBdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAxMjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVswXS50eGJiZ2Fpbl92YWx1ZSA9IDB4N2Y4MDAxZmU7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMV0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IDExOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzFdLnR4YmJnYWluX3ZhbHVlID0gMHg3ODgwMDFlMjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyXS50eGJiX2lxX2FtcGxpZnlnYWluID0gMTA7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMl0udHhiYmdhaW5fdmFsdWUgPSAweDcxYzAwMWM3OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzNdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSA5OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzNdLnR4YmJnYWluX3ZhbHVlID0gMHg2YjgwMDFhZTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVs0XS50eGJiX2lxX2FtcGxpZnlnYWluID0gODsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVs0XS50eGJiZ2Fpbl92YWx1ZSA9IDB4NjU0MDAxOTU7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbNV0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IDc7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbNV0udHhiYmdhaW5fdmFsdWUgPSAweDVmYzAwMTdmOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzZdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSA2OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzZdLnR4YmJnYWluX3ZhbHVlID0gMHg1YTQwMDE2OTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVs3XS50eGJiX2lxX2FtcGxpZnlnYWluID0gNTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVs3XS50eGJiZ2Fpbl92YWx1ZSA9IDB4NTU0MDAxNTU7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbOF0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IDQ7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbOF0udHhiYmdhaW5fdmFsdWUgPSAweDUwODAwMTQyOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzldLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAzOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzldLnR4YmJnYWluX3ZhbHVlID0gMHg0YzAwMDEzMDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxMF0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IDI7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMTBdLnR4YmJnYWluX3ZhbHVlID0gMHg0N2MwMDExZjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxMV0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IDE7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMTFdLnR4YmJnYWluX3ZhbHVlID0gMHg0M2MwMDEwZjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxMl0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IDA7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMTJdLnR4YmJnYWluX3ZhbHVlID0gMHg0MDAwMDEwMDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxM10udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IC0xOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzEzXS50eGJiZ2Fpbl92YWx1ZSA9IDB4M2M4MDAwZjI7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMTRdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAtMjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxNF0udHhiYmdhaW5fdmFsdWUgPSAweDM5MDAwMGU0OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzE1XS50eGJiX2lxX2FtcGxpZnlnYWluID0gLTM7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMTVdLnR4YmJnYWluX3ZhbHVlID0gMHgzNWMwMDBkNzsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxNl0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IC00OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzE2XS50eGJiZ2Fpbl92YWx1ZSA9IDB4MzJjMDAwY2I7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMTddLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAtNTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxN10udHhiYmdhaW5fdmFsdWUgPSAweDMwMDAwMGMwOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzE4XS50eGJiX2lxX2FtcGxpZnlnYWluID0gLTY7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMThdLnR4YmJnYWluX3ZhbHVlID0gMHgyZDQwMDBiNTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsxOV0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IC03OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzE5XS50eGJiZ2Fpbl92YWx1ZSA9IDB4MmFjMDAwYWI7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjBdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAtODsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyMF0udHhiYmdhaW5fdmFsdWUgPSAweDI4ODAwMGEyOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzIxXS50eGJiX2lxX2FtcGxpZnlnYWluID0gLTk7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjFdLnR4YmJnYWluX3ZhbHVlID0gMHgyNjAwMDA5ODsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyMl0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IC0xMDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyMl0udHhiYmdhaW5fdmFsdWUgPSAweDI0MDAwMDkwOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzIzXS50eGJiX2lxX2FtcGxpZnlnYWluID0gLTExOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzIzXS50eGJiZ2Fpbl92YWx1ZSA9IDB4MjIwMDAwODg7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjRdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAtMTI7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjRdLnR4YmJnYWluX3ZhbHVlID0gMHgyMDAwMDA4MDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyNV0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IC0xMzsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyNV0udHhiYmdhaW5fdmFsdWUgPSAweDFhMDAwMDZjOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzI2XS50eGJiX2lxX2FtcGxpZnlnYWluID0gLTE0OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzI2XS50eGJiZ2Fpbl92YWx1ZSA9IDB4MWM4MDAwNzI7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjddLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAtMTU7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMjddLnR4YmJnYWluX3ZhbHVlID0gMHgxODAwMDA2MDsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyOF0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IC0xNjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVsyOF0udHhiYmdhaW5fdmFsdWUgPSAweDE5ODAwMDY2OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzI5XS50eGJiX2lxX2FtcGxpZnlnYWluID0gLTE3OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzI5XS50eGJiZ2Fpbl92YWx1ZSA9IDB4MTU4MDAwNTY7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMzBdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAtMTg7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMzBdLnR4YmJnYWluX3ZhbHVlID0gMHgyNmMwMDA1YjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVszMV0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IC0xOTsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVszMV0udHhiYmdhaW5fdmFsdWUgPSAweDE0NDAwMDUxOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzMyXS50eGJiX2lxX2FtcGxpZnlnYWluID0gLTIwOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzMyXS50eGJiZ2Fpbl92YWx1ZSA9IDB4MjQ0MDAwNTE7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMzNdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAtMjE7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMzNdLnR4YmJnYWluX3ZhbHVlID0gMHgxMzAwMDA0YzsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVszNF0udHhiYl9pcV9hbXBsaWZ5Z2FpbiA9IC0yMjsKKwlwcml2LT50eGJiZ2Fpbl90YWJsZVszNF0udHhiYmdhaW5fdmFsdWUgPSAweDEyMDAwMDQ4OworCXByaXYtPnR4YmJnYWluX3RhYmxlWzM1XS50eGJiX2lxX2FtcGxpZnlnYWluID0gLTIzOworCXByaXYtPnR4YmJnYWluX3RhYmxlWzM1XS50eGJiZ2Fpbl92YWx1ZSA9IDB4MTEwMDAwNDQ7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMzZdLnR4YmJfaXFfYW1wbGlmeWdhaW4gPSAtMjQ7CisJcHJpdi0+dHhiYmdhaW5fdGFibGVbMzZdLnR4YmJnYWluX3ZhbHVlID0gMHgxMDAwMDA0MDsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVswXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDM2OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVswXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDM1OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVswXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDJlOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVswXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDI1OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVswXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDFjOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVswXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDEyOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVswXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDA5OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVswXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDA0OworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzFdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MzM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzFdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MzI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzFdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MmI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzFdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MjM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzFdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MWE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzFdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MTE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzFdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzFdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDQ7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMl0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgzMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMl0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyZjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMl0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgyOTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMl0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgyMTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMl0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgxOTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMl0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgxMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMl0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMl0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMzsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVszXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDJkOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVszXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDJkOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVszXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDI3OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVszXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDFmOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVszXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDE4OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVszXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDBmOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVszXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDA4OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVszXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAzOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzRdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MmI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzRdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MmE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzRdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MjU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzRdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MWU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzRdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MTY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzRdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MGU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzRdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDc7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzRdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDM7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgyODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNV0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgyMjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNV0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxYzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgxNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNV0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwZDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwNzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbNV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMzsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDI2OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDI1OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDIxOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDFiOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDE0OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDBkOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDA2OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAzOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzddLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MjQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzddLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MjM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzddLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MWY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzddLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTk7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzddLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MTM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzddLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MGM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzddLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzddLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDM7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbOF0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgyMjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbOF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyMTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbOF0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxZDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbOF0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbOF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgxMTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbOF0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbOF0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwNjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbOF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMjsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDIwOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDIwOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDFiOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDE2OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDExOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDA4OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDA1OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVs5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAyOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDFmOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxZTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTBdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MWE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDE1OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgxMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTBdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MGE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDA1OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMjsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxZDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MWM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzExXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDE4OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMV0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxNDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MGY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzExXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDBhOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDI7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTJdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MWI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDFhOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxNzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTJdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDBlOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwOTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTJdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAyOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDFhOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxM10uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxOTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTNdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MTY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDEyOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxM10uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwZDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTNdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDk7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDA0OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxM10uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMjsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNF0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTc7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDE1OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNF0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgxMTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MGM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDA4OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNF0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwNDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDI7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTVdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MTc7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDE2OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTVdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDBjOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTVdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAyOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDE2OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNl0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTZdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MTI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDBmOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNl0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTZdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDc7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDA0OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxNl0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMTsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxN10uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxNDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDExOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxN10uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwZTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MGI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDA3OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxN10uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDI7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMThdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MTM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDEzOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMThdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MGQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDBhOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwNjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMThdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAxOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDEyOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxOV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxMjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTldLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MGY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDBjOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxOV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwOTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMTldLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAzOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsxOV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMTsKKworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMF0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxMTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDBmOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMF0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwYzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MDk7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDA2OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMF0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDE7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjFdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MTA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDEwOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgwZTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjFdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MGI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDA4OworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjFdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAxOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDBmOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMl0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgwZjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjJdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MGQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDBiOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMl0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbMjJdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAzOworCXByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsyMl0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMTsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MzY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgzNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVswXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDJlOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MWI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVswXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzBdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzFdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MzM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgzMjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDJiOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzFdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTk7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzFdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzJdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MzA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMl0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyZjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDI5OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzJdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMl0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzJdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMl0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MmQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbM10uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyZDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVszXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDI3OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTc7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbM10uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVszXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzNdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbM10uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzRdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MmI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyYTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDI1OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzRdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs0XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzRdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzVdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4Mjg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDIyOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzVdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs1XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzVdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MjY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNl0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyNTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDIxOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNl0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzZdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbNl0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzddLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MjQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDFmOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzddLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs3XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzddLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbN10uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzhdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MjI7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyMTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDFkOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzhdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs4XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzhdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MjA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgyMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDFiOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MTA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVs5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzldLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbOV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDFmOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDFlOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDFhOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDBmOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEwXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MWQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MWM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MTg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MGU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTFdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDA7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxYTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxNzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwZTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxMl0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDFhOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDE5OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDE2OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDBkOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzEzXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MTg7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTc7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MTU7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MGM7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTRdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDA7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxNzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxNjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwYjsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxNV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDE2OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDE1OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDEyOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDBiOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE2XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MTQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTQ7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MTE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MGE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMTddLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDA7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxMzsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgxMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwYTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsxOF0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDEyOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDEyOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDBmOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDA5OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzE5XS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVswXSA9IDB4MTE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVsxXSA9IDB4MTE7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVsyXSA9IDB4MGY7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVszXSA9IDB4MDk7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVs0XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVs1XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CisJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjBdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDA7CisKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdID0gMHgxMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzFdID0gMHgxMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzJdID0gMHgwZTsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzNdID0gMHgwODsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzVdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdID0gMHgwMDsKKwlwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsyMV0uY2NrdHhiYl92YWx1ZWFycmF5WzddID0gMHgwMDsKKworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gPSAweDBmOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV0gPSAweDBmOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gPSAweDBkOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbM10gPSAweDA4OworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNF0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNl0gPSAweDAwOworCXByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWzIyXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN10gPSAweDAwOworCisJcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmcgPSB0cnVlOworCXByaXYtPnR4cG93ZXJfY291bnQgICAgICAgPSAwOworCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nSW5pdCA9IGZhbHNlOworCit9CisKK3N0YXRpYyB2b2lkIGRtX0luaXRpYWxpemVUWFBvd2VyVHJhY2tpbmdfVGhlcm1hbE1ldGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisKKwlpZiAocHJpdi0+cnRsbGliLT5Gd1JXUkYpCisJCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nID0gdHJ1ZTsKKwllbHNlCisJCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nID0gZmFsc2U7CisJcHJpdi0+dHhwb3dlcl9jb3VudCAgICAgICA9IDA7CisJcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmdJbml0ID0gZmFsc2U7CisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInBNZ250SW5mby0+YlRYUG93ZXJUcmFja2luZyA9ICVkXG4iLAorCQkgcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmcpOworfQorCit2b2lkIGRtX2luaXRpYWxpemVfdHhwb3dlcl90cmFja2luZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlpZiAocHJpdi0+SUNfQ3V0ID49IElDX1ZlcnNpb25DdXRfRCkKKwkJZG1fSW5pdGlhbGl6ZVRYUG93ZXJUcmFja2luZ19UU1NJKGRldik7CisJZWxzZQorCQlkbV9Jbml0aWFsaXplVFhQb3dlclRyYWNraW5nX1RoZXJtYWxNZXRlcihkZXYpOworfQorCitzdGF0aWMgdm9pZCBkbV9DaGVja1RYUG93ZXJUcmFja2luZ19UU1NJKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXN0YXRpYyB1MzIgdHhfcG93ZXJfdHJhY2tfY291bnRlcjsKKwlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiJXMoKVxuIiwgX19mdW5jX18pOworCWlmIChyZWFkX25pY19ieXRlKGRldiwgMHgxMWUpID09IDEpCisJCXJldHVybjsKKwlpZiAoIXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nKQorCQlyZXR1cm47CisJdHhfcG93ZXJfdHJhY2tfY291bnRlcisrOworCisKKwkgaWYgKHR4X3Bvd2VyX3RyYWNrX2NvdW50ZXIgPj0gMTgwKSB7CisJCXF1ZXVlX2RlbGF5ZWRfd29ya19yc2wocHJpdi0+cHJpdl93cSwgJnByaXYtPnR4cG93ZXJfdHJhY2tpbmdfd3EsIDApOworCQl0eF9wb3dlcl90cmFja19jb3VudGVyID0gMDsKKwl9CisKK30KK3N0YXRpYyB2b2lkIGRtX0NoZWNrVFhQb3dlclRyYWNraW5nX1RoZXJtYWxNZXRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlzdGF0aWMgdTgJVE1fVHJpZ2dlcjsKKwl1OAkJVHhQb3dlckNoZWNrQ250ID0gMDsKKworCWlmIChJU19IQVJEV0FSRV9UWVBFXzgxOTJTRShkZXYpKQorCQlUeFBvd2VyQ2hlY2tDbnQgPSA1OworCWVsc2UKKwkJVHhQb3dlckNoZWNrQ250ID0gMjsKKwlpZiAoIXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nKSB7CisJCXJldHVybjsKKwl9IGVsc2UgeworCQlpZiAocHJpdi0+dHhwb3dlcl9jb3VudCAgPD0gVHhQb3dlckNoZWNrQ250KSB7CisJCQlwcml2LT50eHBvd2VyX2NvdW50Kys7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpZiAoIVRNX1RyaWdnZXIpIHsKKwkJeworCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIFJGOTBfUEFUSF9BLCAweDAyLCBiTWFzazEyQml0cywgMHg0ZCk7CisJCXJ0bDgxOTJfcGh5X1NldFJGUmVnKGRldiwgUkY5MF9QQVRIX0EsIDB4MDIsIGJNYXNrMTJCaXRzLCAweDRmKTsKKwkJcnRsODE5Ml9waHlfU2V0UkZSZWcoZGV2LCBSRjkwX1BBVEhfQSwgMHgwMiwgYk1hc2sxMkJpdHMsIDB4NGQpOworCQlydGw4MTkyX3BoeV9TZXRSRlJlZyhkZXYsIFJGOTBfUEFUSF9BLCAweDAyLCBiTWFzazEyQml0cywgMHg0Zik7CisJCX0KKwkJVE1fVHJpZ2dlciA9IDE7CisJCXJldHVybjsKKwl9IGVsc2UgeworCSAgICBwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT09PT09PT0+U2NoZWR1bGUgVHhQb3dlclRyYWNraW5nV29ya0l0ZW1cbiIpOworCisJCXF1ZXVlX2RlbGF5ZWRfd29ya19yc2wocHJpdi0+cHJpdl93cSwgJnByaXYtPnR4cG93ZXJfdHJhY2tpbmdfd3EsIDApOworCQlUTV9UcmlnZ2VyID0gMDsKKwkJfQorCisJfQorCitzdGF0aWMgdm9pZCBkbV9jaGVja190eHBvd2VyX3RyYWNraW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJaWYgKHByaXYtPklDX0N1dCA+PSBJQ19WZXJzaW9uQ3V0X0QpCisJCWRtX0NoZWNrVFhQb3dlclRyYWNraW5nX1RTU0koZGV2KTsKKwllbHNlCisJCWRtX0NoZWNrVFhQb3dlclRyYWNraW5nX1RoZXJtYWxNZXRlcihkZXYpOworfQorCitzdGF0aWMgdm9pZCBkbV9DQ0tUeFBvd2VyQWRqdXN0X1RTU0koc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYm9vbCAgYkluQ0gxNCkKK3sKKwl1MzIgVGVtcFZhbDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJVGVtcFZhbCA9IDA7CisJaWYgKCFiSW5DSDE0KSB7CisJCVRlbXBWYWwgPSAodTMyKShwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzBdICsKKwkJCSAgKHByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV08PDgpKSA7CisKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX1R4RmlsdGVyMSwgYk1hc2tIV29yZCwgVGVtcFZhbCk7CisJCVRlbXBWYWwgPSAwOworCQlUZW1wVmFsID0gKHUzMikocHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWyh1OCkocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbildLmNja3R4YmJfdmFsdWVhcnJheVsyXSArCisJCQkgIChwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzNdPDw4KSArCisJCQkgIChwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdPDwxNikrCisJCQkgIChwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzVdPDwyNCkpOworCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfVHhGaWx0ZXIyLCBiTWFza0RXb3JkLCBUZW1wVmFsKTsKKwkJVGVtcFZhbCA9IDA7CisJCVRlbXBWYWwgPSAodTMyKShwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdICsKKwkJCSAgKHByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN108PDgpKSA7CisKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX0RlYnVnUG9ydCwgYk1hc2tMV29yZCwgVGVtcFZhbCk7CisJfSBlbHNlIHsKKwkJVGVtcFZhbCA9ICh1MzIpKHByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWyh1OCkocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbildLmNja3R4YmJfdmFsdWVhcnJheVswXSArCisJCQkgIChwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV08PDgpKSA7CisKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX1R4RmlsdGVyMSwgYk1hc2tIV29yZCwgVGVtcFZhbCk7CisJCVRlbXBWYWwgPSAwOworCQlUZW1wVmFsID0gKHUzMikocHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzJdICsKKwkJCSAgKHByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWyh1OCkocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbildLmNja3R4YmJfdmFsdWVhcnJheVszXTw8OCkgKworCQkJICAocHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzRdPDwxNikrCisJCQkgIChwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbNV08PDI0KSk7CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9UeEZpbHRlcjIsIGJNYXNrRFdvcmQsIFRlbXBWYWwpOworCQlUZW1wVmFsID0gMDsKKwkJVGVtcFZhbCA9ICh1MzIpKHByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWyh1OCkocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbildLmNja3R4YmJfdmFsdWVhcnJheVs2XSArCisJCQkgIChwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN108PDgpKSA7CisKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX0RlYnVnUG9ydCwgYk1hc2tMV29yZCwgVGVtcFZhbCk7CisJfQorCisKK30KKworc3RhdGljIHZvaWQgZG1fQ0NLVHhQb3dlckFkanVzdF9UaGVybWFsTWV0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwJYm9vbCAgYkluQ0gxNCkKK3sKKwl1MzIgVGVtcFZhbDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisKKwlUZW1wVmFsID0gMDsKKwlpZiAoIWJJbkNIMTQpIHsKKwkJVGVtcFZhbCA9CUNDS1N3aW5nVGFibGVfQ2gxX0NoMTNbcHJpdi0+Q0NLX2luZGV4XVswXSArCisJCQkJCShDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW3ByaXYtPkNDS19pbmRleF1bMV08PDgpIDsKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX1R4RmlsdGVyMSwgYk1hc2tIV29yZCwgVGVtcFZhbCk7CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJDQ0sgbm90IGNobmwgMTQsIHJlZyAweCV4ID0gMHgleFxuIiwKKwkJCXJDQ0swX1R4RmlsdGVyMSwgVGVtcFZhbCk7CisJCVRlbXBWYWwgPSAwOworCQlUZW1wVmFsID0JQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1twcml2LT5DQ0tfaW5kZXhdWzJdICsKKwkJCQkJKENDS1N3aW5nVGFibGVfQ2gxX0NoMTNbcHJpdi0+Q0NLX2luZGV4XVszXTw8OCkgKworCQkJCQkoQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1twcml2LT5DQ0tfaW5kZXhdWzRdPDwxNikrCisJCQkJCShDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW3ByaXYtPkNDS19pbmRleF1bNV08PDI0KTsKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX1R4RmlsdGVyMiwgYk1hc2tEV29yZCwgVGVtcFZhbCk7CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJDQ0sgbm90IGNobmwgMTQsIHJlZyAweCV4ID0gMHgleFxuIiwKKwkJCXJDQ0swX1R4RmlsdGVyMiwgVGVtcFZhbCk7CisJCVRlbXBWYWwgPSAwOworCQlUZW1wVmFsID0JQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1twcml2LT5DQ0tfaW5kZXhdWzZdICsKKwkJCQkJKENDS1N3aW5nVGFibGVfQ2gxX0NoMTNbcHJpdi0+Q0NLX2luZGV4XVs3XTw8OCkgOworCisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9EZWJ1Z1BvcnQsIGJNYXNrTFdvcmQsIFRlbXBWYWwpOworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiQ0NLIG5vdCBjaG5sIDE0LCByZWcgMHgleCA9IDB4JXhcbiIsCisJCQlyQ0NLMF9EZWJ1Z1BvcnQsIFRlbXBWYWwpOworCX0gZWxzZSB7CisJCVRlbXBWYWwgPQlDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVswXSArCisJCQkJCShDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVsxXTw8OCkgOworCisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9UeEZpbHRlcjEsIGJNYXNrSFdvcmQsIFRlbXBWYWwpOworCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiQ0NLIGNobmwgMTQsIHJlZyAweCV4ID0gMHgleFxuIiwKKwkJCXJDQ0swX1R4RmlsdGVyMSwgVGVtcFZhbCk7CisJCVRlbXBWYWwgPSAwOworCQlUZW1wVmFsID0JQ0NLU3dpbmdUYWJsZV9DaDE0W3ByaXYtPkNDS19pbmRleF1bMl0gKworCQkJCQkoQ0NLU3dpbmdUYWJsZV9DaDE0W3ByaXYtPkNDS19pbmRleF1bM108PDgpICsKKwkJCQkJKENDS1N3aW5nVGFibGVfQ2gxNFtwcml2LT5DQ0tfaW5kZXhdWzRdPDwxNikrCisJCQkJCShDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVs1XTw8MjQpOworCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfVHhGaWx0ZXIyLCBiTWFza0RXb3JkLCBUZW1wVmFsKTsKKwkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIkNDSyBjaG5sIDE0LCByZWcgMHgleCA9IDB4JXhcbiIsCisJCQlyQ0NLMF9UeEZpbHRlcjIsIFRlbXBWYWwpOworCQlUZW1wVmFsID0gMDsKKwkJVGVtcFZhbCA9CUNDS1N3aW5nVGFibGVfQ2gxNFtwcml2LT5DQ0tfaW5kZXhdWzZdICsKKwkJCQkJKENDS1N3aW5nVGFibGVfQ2gxNFtwcml2LT5DQ0tfaW5kZXhdWzddPDw4KSA7CisKKwkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX0RlYnVnUG9ydCwgYk1hc2tMV29yZCwgVGVtcFZhbCk7CisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJDQ0sgY2hubCAxNCwgcmVnIDB4JXggPSAweCV4XG4iLAorCQkJckNDSzBfRGVidWdQb3J0LCBUZW1wVmFsKTsKKwl9CisJfQorCit2b2lkIGRtX2Nja190eHBvd2VyX2FkanVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBib29sICBiaW5jaDE0KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlpZiAocHJpdi0+SUNfQ3V0ID49IElDX1ZlcnNpb25DdXRfRCkKKwkJZG1fQ0NLVHhQb3dlckFkanVzdF9UU1NJKGRldiwgYmluY2gxNCk7CisJZWxzZQorCQlkbV9DQ0tUeFBvd2VyQWRqdXN0X1RoZXJtYWxNZXRlcihkZXYsIGJpbmNoMTQpOworfQorCitzdGF0aWMgdm9pZCBkbV90eHBvd2VyX3Jlc2V0X3JlY292ZXJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlN0YXJ0IFJlc2V0IFJlY292ZXJ5ID09PlxuIik7CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIGJNYXNrRFdvcmQsCisJCQkgcHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4XS50eGJiZ2Fpbl92YWx1ZSk7CisJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlJlc2V0IFJlY292ZXJ5OiBGaWxsIGluIDB4YzgwIGlzICUwOHhcbiIsCisJCSBwcml2LT50eGJiZ2Fpbl90YWJsZVtwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhdLnR4YmJnYWluX3ZhbHVlKTsKKwlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiUmVzZXQgUmVjb3Zlcnk6IEZpbGwgaW4gUkZBX3R4UG93ZXJUcmFja2luZ0luZGV4IGlzICV4XG4iLAorCQkgcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4KTsKKwlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiUmVzZXQgUmVjb3ZlcnkgOiBSRiBBIEkvUSBBbXBsaWZ5IEdhaW4gaXMgJWxkXG4iLAorCQkgcHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4XS50eGJiX2lxX2FtcGxpZnlnYWluKTsKKwlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiUmVzZXQgUmVjb3Zlcnk6IENDSyBBdHRlbnVhdGlvbiBpcyAlZCBkQlxuIiwKKwkJIHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pOworCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYsIHByaXYtPmJjY2tfaW5fY2gxNCk7CisKKwlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hDVHhJUUltYmFsYW5jZSwgYk1hc2tEV29yZCwKKwkJCSBwcml2LT50eGJiZ2Fpbl90YWJsZVtwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhdLnR4YmJnYWluX3ZhbHVlKTsKKwlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiUmVzZXQgUmVjb3Zlcnk6IEZpbGwgaW4gMHhjOTAgaXMgJTA4eFxuIiwKKwkJIHByaXYtPnR4YmJnYWluX3RhYmxlW3ByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleF0udHhiYmdhaW5fdmFsdWUpOworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJSZXNldCBSZWNvdmVyeTogRmlsbCBpbiBSRkNfdHhQb3dlclRyYWNraW5nSW5kZXggaXMgJXhcbiIsCisJCSBwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXgpOworCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJSZXNldCBSZWNvdmVyeSA6IFJGIEMgSS9RIEFtcGxpZnkgR2FpbiBpcyAlbGRcbiIsCisJCSBwcml2LT50eGJiZ2Fpbl90YWJsZVtwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhdLnR4YmJfaXFfYW1wbGlmeWdhaW4pOworCit9CisKK3ZvaWQgZG1fcmVzdG9yZV9keW5hbWljX21lY2hhbmlzbV9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwl1MzIJcmVnX3JhdHIgPSBwcml2LT5yYXRlX2FkYXB0aXZlLmxhc3RfcmF0cjsKKwl1MzIgcmF0cl92YWx1ZTsKKworCWlmIChJU19OSUNfRE9XTihwcml2KSkgeworCQlSVF9UUkFDRShDT01QX1JBVEUsICI8LS0tLSBkbV9yZXN0b3JlX2R5bmFtaWNfbWVjaGFuaXNtX3N0YXRlKCk6IGRyaXZlciBpcyBnb2luZyB0byB1bmxvYWRcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHByaXYtPnJhdGVfYWRhcHRpdmUucmF0ZV9hZGFwdGl2ZV9kaXNhYmxlZCkKKwkJcmV0dXJuOworCWlmICghKHByaXYtPnJ0bGxpYi0+bW9kZSA9PSBXSVJFTEVTU19NT0RFX05fMjRHIHx8CisJICAgICAgcHJpdi0+cnRsbGliLT5tb2RlID09IFdJUkVMRVNTX01PREVfTl81RykpCisJCXJldHVybjsKKwlyYXRyX3ZhbHVlID0gcmVnX3JhdHI7CisJaWYgKHByaXYtPnJmX3R5cGUgPT0gUkZfMVQyUikKKwkJcmF0cl92YWx1ZSAmPSB+KFJBVEVfQUxMX09GRE1fMlNTKTsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCBSQVRSMCwgcmF0cl92YWx1ZSk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBVRldQLCAxKTsKKwlpZiAocHJpdi0+YnR4cG93ZXJfdHJhY2tpbmdJbml0ICYmIHByaXYtPmJ0eHBvd2VyX3RyYWNraW5nKQorCQlkbV90eHBvd2VyX3Jlc2V0X3JlY292ZXJ5KGRldik7CisKKwlkbV9iYl9pbml0aWFsZ2Fpbl9yZXN0b3JlKGRldik7CisKK30KKworc3RhdGljIHZvaWQgZG1fYmJfaW5pdGlhbGdhaW5fcmVzdG9yZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwl1MzIgYml0X21hc2sgPSAweDdmOworCisJaWYgKGRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG0gPT0gRElHX0FMR09fQllfUlNTSSkKKwkJcmV0dXJuOworCisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIFVGV1AsIGJNYXNrQnl0ZTEsIDB4OCk7CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQUFHQ0NvcmUxLCBiaXRfbWFzaywgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGFhZ2Njb3JlMSk7CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQkFHQ0NvcmUxLCBiaXRfbWFzaywgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGJhZ2Njb3JlMSk7CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQ0FHQ0NvcmUxLCBiaXRfbWFzaywgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGNhZ2Njb3JlMSk7CisJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YREFHQ0NvcmUxLCBiaXRfbWFzaywgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGRhZ2Njb3JlMSk7CisJYml0X21hc2sgID0gYk1hc2tCeXRlMjsKKwlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfQ0NBLCBiaXRfbWFzaywgKHUzMilwcml2LT5pbml0Z2Fpbl9iYWNrdXAuY2NhKTsKKworCVJUX1RSQUNFKENPTVBfRElHLCAiZG1fQkJJbml0aWFsR2FpblJlc3RvcmUgMHhjNTAgaXMgJXhcbiIsIHByaXYtPmluaXRnYWluX2JhY2t1cC54YWFnY2NvcmUxKTsKKwlSVF9UUkFDRShDT01QX0RJRywgImRtX0JCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzU4IGlzICV4XG4iLCBwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGJhZ2Njb3JlMSk7CisJUlRfVFJBQ0UoQ09NUF9ESUcsICJkbV9CQkluaXRpYWxHYWluUmVzdG9yZSAweGM2MCBpcyAleFxuIiwgcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhjYWdjY29yZTEpOworCVJUX1RSQUNFKENPTVBfRElHLCAiZG1fQkJJbml0aWFsR2FpblJlc3RvcmUgMHhjNjggaXMgJXhcbiIsIHByaXYtPmluaXRnYWluX2JhY2t1cC54ZGFnY2NvcmUxKTsKKwlSVF9UUkFDRShDT01QX0RJRywgImRtX0JCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YTBhIGlzICV4XG4iLCBwcml2LT5pbml0Z2Fpbl9iYWNrdXAuY2NhKTsKKwlydGw4MTkyX3NldEJCcmVnKGRldiwgVUZXUCwgYk1hc2tCeXRlMSwgMHgxKTsKKworfQorCisKK3ZvaWQgZG1fYmFja3VwX2R5bmFtaWNfbWVjaGFuaXNtX3N0YXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJcHJpdi0+YnN3aXRjaF9mc3luYyAgPSBmYWxzZTsKKwlwcml2LT5iZnN5bmNfcHJvY2Vzc2luZyA9IGZhbHNlOworCWRtX2JiX2luaXRpYWxnYWluX2JhY2t1cChkZXYpOworCit9CisKKworc3RhdGljIHZvaWQgZG1fYmJfaW5pdGlhbGdhaW5fYmFja3VwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXUzMiBiaXRfbWFzayA9IGJNYXNrQnl0ZTA7CisKKwlpZiAoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobSA9PSBESUdfQUxHT19CWV9SU1NJKQorCQlyZXR1cm47CisKKwlydGw4MTkyX3NldEJCcmVnKGRldiwgVUZXUCwgYk1hc2tCeXRlMSwgMHg4KTsKKwlwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGFhZ2Njb3JlMSA9ICh1OClydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByT0ZETTBfWEFBR0NDb3JlMSwgYml0X21hc2spOworCXByaXYtPmluaXRnYWluX2JhY2t1cC54YmFnY2NvcmUxID0gKHU4KXJ0bDgxOTJfUXVlcnlCQlJlZyhkZXYsIHJPRkRNMF9YQkFHQ0NvcmUxLCBiaXRfbWFzayk7CisJcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhjYWdjY29yZTEgPSAodTgpcnRsODE5Ml9RdWVyeUJCUmVnKGRldiwgck9GRE0wX1hDQUdDQ29yZTEsIGJpdF9tYXNrKTsKKwlwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGRhZ2Njb3JlMSA9ICh1OClydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByT0ZETTBfWERBR0NDb3JlMSwgYml0X21hc2spOworCWJpdF9tYXNrICA9IGJNYXNrQnl0ZTI7CisJcHJpdi0+aW5pdGdhaW5fYmFja3VwLmNjYSA9ICh1OClydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByQ0NLMF9DQ0EsIGJpdF9tYXNrKTsKKworCVJUX1RSQUNFKENPTVBfRElHLCAiQkJJbml0aWFsR2FpbkJhY2t1cCAweGM1MCBpcyAleFxuIiwgcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhhYWdjY29yZTEpOworCVJUX1RSQUNFKENPTVBfRElHLCAiQkJJbml0aWFsR2FpbkJhY2t1cCAweGM1OCBpcyAleFxuIiwgcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhiYWdjY29yZTEpOworCVJUX1RSQUNFKENPTVBfRElHLCAiQkJJbml0aWFsR2FpbkJhY2t1cCAweGM2MCBpcyAleFxuIiwgcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhjYWdjY29yZTEpOworCVJUX1RSQUNFKENPTVBfRElHLCAiQkJJbml0aWFsR2FpbkJhY2t1cCAweGM2OCBpcyAleFxuIiwgcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhkYWdjY29yZTEpOworCVJUX1RSQUNFKENPTVBfRElHLCAiQkJJbml0aWFsR2FpbkJhY2t1cCAweGEwYSBpcyAleFxuIiwgcHJpdi0+aW5pdGdhaW5fYmFja3VwLmNjYSk7CisKK30KKwordm9pZCBkbV9jaGFuZ2VfZHluYW1pY19pbml0Z2Fpbl90aHJlc2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICAgICAgdTMyIGRtX3R5cGUsIHUzMiBkbV92YWx1ZSkKK3sKKwlpZiAoZG1fdHlwZSA9PSBESUdfVFlQRV9USFJFU0hfSElHSCkgeworCQlkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfdGhyZXNoID0gZG1fdmFsdWU7CisJfSBlbHNlIGlmIChkbV90eXBlID09IERJR19UWVBFX1RIUkVTSF9MT1cpIHsKKwkJZG1fZGlndGFibGUucnNzaV9sb3dfdGhyZXNoID0gZG1fdmFsdWU7CisJfSBlbHNlIGlmIChkbV90eXBlID09IERJR19UWVBFX1RIUkVTSF9ISUdIUFdSX0hJR0gpIHsKKwkJZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2hpZ2h0aHJlc2ggPSBkbV92YWx1ZTsKKwl9IGVsc2UgaWYgKGRtX3R5cGUgPT0gRElHX1RZUEVfVEhSRVNIX0hJR0hQV1JfSElHSCkgeworCQlkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfcG93ZXJfaGlnaHRocmVzaCA9IGRtX3ZhbHVlOworCX0gZWxzZSBpZiAoZG1fdHlwZSA9PSBESUdfVFlQRV9FTkFCTEUpIHsKKwkJZG1fZGlndGFibGUuZGlnX3N0YXRlCQk9IERNX1NUQV9ESUdfTUFYOworCQlkbV9kaWd0YWJsZS5kaWdfZW5hYmxlX2ZsYWcJPSB0cnVlOworCX0gZWxzZSBpZiAoZG1fdHlwZSA9PSBESUdfVFlQRV9ESVNBQkxFKSB7CisJCWRtX2RpZ3RhYmxlLmRpZ19zdGF0ZQkJPSBETV9TVEFfRElHX01BWDsKKwkJZG1fZGlndGFibGUuZGlnX2VuYWJsZV9mbGFnCT0gZmFsc2U7CisJfSBlbHNlIGlmIChkbV90eXBlID09IERJR19UWVBFX0RCR19NT0RFKSB7CisJCWlmIChkbV92YWx1ZSA+PSBETV9EQkdfTUFYKQorCQkJZG1fdmFsdWUgPSBETV9EQkdfT0ZGOworCQlkbV9kaWd0YWJsZS5kYmdfbW9kZQkJPSAodTgpZG1fdmFsdWU7CisJfSBlbHNlIGlmIChkbV90eXBlID09IERJR19UWVBFX1JTU0kpIHsKKwkJaWYgKGRtX3ZhbHVlID4gMTAwKQorCQkJZG1fdmFsdWUgPSAzMDsKKwkJZG1fZGlndGFibGUucnNzaV92YWwJCQk9IChsb25nKWRtX3ZhbHVlOworCX0gZWxzZSBpZiAoZG1fdHlwZSA9PSBESUdfVFlQRV9BTEdPUklUSE0pIHsKKwkJaWYgKGRtX3ZhbHVlID49IERJR19BTEdPX01BWCkKKwkJCWRtX3ZhbHVlID0gRElHX0FMR09fQllfRkFMU0VfQUxBUk07CisJCWlmIChkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtICE9ICh1OClkbV92YWx1ZSkKKwkJCWRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG1fc3dpdGNoID0gMTsKKwkJZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobQk9ICh1OClkbV92YWx1ZTsKKwl9IGVsc2UgaWYgKGRtX3R5cGUgPT0gRElHX1RZUEVfQkFDS09GRikgeworCQlpZiAoZG1fdmFsdWUgPiAzMCkKKwkJCWRtX3ZhbHVlID0gMzA7CisJCWRtX2RpZ3RhYmxlLmJhY2tvZmZfdmFsCQk9ICh1OClkbV92YWx1ZTsKKwl9IGVsc2UgaWYgKGRtX3R5cGUgPT0gRElHX1RZUEVfUlhfR0FJTl9NSU4pIHsKKwkJaWYgKGRtX3ZhbHVlID09IDApCisJCQlkbV92YWx1ZSA9IDB4MTsKKwkJZG1fZGlndGFibGUucnhfZ2Fpbl9yYW5nZV9taW4gPSAodTgpZG1fdmFsdWU7CisJfSBlbHNlIGlmIChkbV90eXBlID09IERJR19UWVBFX1JYX0dBSU5fTUFYKSB7CisJCWlmIChkbV92YWx1ZSA+IDB4NTApCisJCQlkbV92YWx1ZSA9IDB4NTA7CisJCWRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWF4ID0gKHU4KWRtX3ZhbHVlOworCX0KK30KKworc3RhdGljIHZvaWQgZG1fZGlnX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJZG1fZGlndGFibGUuZGlnX2VuYWJsZV9mbGFnCT0gdHJ1ZTsKKwlkbV9kaWd0YWJsZS5CYWNrb2ZmX0VuYWJsZV9GbGFnID0gdHJ1ZTsKKworCWRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG0gPSBESUdfQUxHT19CWV9SU1NJOworCisJZG1fZGlndGFibGUuRGlnX1R3b1BvcnRfQWxnb3JpdGhtID0gRElHX1RXT19QT1JUX0FMR09fUlNTSTsKKwlkbV9kaWd0YWJsZS5EaWdfRXh0X1BvcnRfU3RhZ2UgPSBESUdfRVhUX1BPUlRfU1RBR0VfTUFYOworCWRtX2RpZ3RhYmxlLmRiZ19tb2RlID0gRE1fREJHX09GRjsKKwlkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtX3N3aXRjaCA9IDA7CisKKwlkbV9kaWd0YWJsZS5kaWdfc3RhdGUJCT0gRE1fU1RBX0RJR19NQVg7CisJZG1fZGlndGFibGUuZGlnX2hpZ2hwd3Jfc3RhdGUJPSBETV9TVEFfRElHX01BWDsKKwlkbV9kaWd0YWJsZS5DdXJTVEFDb25uZWN0U3RhdGUgPSBkbV9kaWd0YWJsZS5QcmVTVEFDb25uZWN0U3RhdGUgPSBESUdfU1RBX0RJU0NPTk5FQ1Q7CisJZG1fZGlndGFibGUuQ3VyQVBDb25uZWN0U3RhdGUgPSBkbV9kaWd0YWJsZS5QcmVBUENvbm5lY3RTdGF0ZSA9IERJR19BUF9ESVNDT05ORUNUOworCWRtX2RpZ3RhYmxlLmluaXRpYWxnYWluX2xvd2VyYm91bmRfc3RhdGUgPSBmYWxzZTsKKworCWRtX2RpZ3RhYmxlLnJzc2lfbG93X3RocmVzaAk9IERNX0RJR19USFJFU0hfTE9XOworCWRtX2RpZ3RhYmxlLnJzc2lfaGlnaF90aHJlc2gJPSBETV9ESUdfVEhSRVNIX0hJR0g7CisKKwlkbV9kaWd0YWJsZS5GQUxvd1RocmVzaAk9IERNX0ZBTFNFQUxBUk1fVEhSRVNIX0xPVzsKKwlkbV9kaWd0YWJsZS5GQUhpZ2hUaHJlc2gJPSBETV9GQUxTRUFMQVJNX1RIUkVTSF9ISUdIOworCisJZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2xvd3RocmVzaCA9IERNX0RJR19ISUdIX1BXUl9USFJFU0hfTE9XOworCWRtX2RpZ3RhYmxlLnJzc2lfaGlnaF9wb3dlcl9oaWdodGhyZXNoID0gRE1fRElHX0hJR0hfUFdSX1RIUkVTSF9ISUdIOworCisJZG1fZGlndGFibGUucnNzaV92YWwgPSA1MDsKKwlkbV9kaWd0YWJsZS5iYWNrb2ZmX3ZhbCA9IERNX0RJR19CQUNLT0ZGOworCWRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWF4ID0gRE1fRElHX01BWDsKKwlpZiAocHJpdi0+Q3VzdG9tZXJJRCA9PSBSVF9DSURfODE5eF9OZXRjb3JlKQorCQlkbV9kaWd0YWJsZS5yeF9nYWluX3JhbmdlX21pbiA9IERNX0RJR19NSU5fTmV0Y29yZTsKKwllbHNlCisJCWRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWluID0gRE1fRElHX01JTjsKKworCWRtX2RpZ3RhYmxlLkJhY2tvZmZWYWxfcmFuZ2VfbWF4ID0gRE1fRElHX0JBQ0tPRkZfTUFYOworCWRtX2RpZ3RhYmxlLkJhY2tvZmZWYWxfcmFuZ2VfbWluID0gRE1fRElHX0JBQ0tPRkZfTUlOOworfQorCitzdGF0aWMgdm9pZCBkbV9jdHJsX2luaXRnYWluX2J5cnNzaShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCisJaWYgKGRtX2RpZ3RhYmxlLmRpZ19lbmFibGVfZmxhZyA9PSBmYWxzZSkKKwkJcmV0dXJuOworCisJaWYgKGRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG0gPT0gRElHX0FMR09fQllfRkFMU0VfQUxBUk0pCisJCWRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpX2J5X2Z3ZmFsc2VfYWxhcm0oZGV2KTsKKwllbHNlIGlmIChkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtID09IERJR19BTEdPX0JZX1JTU0kpCisJCWRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpX2J5X2RyaXZlcnJzc2koZGV2KTsKKwllbHNlCisJCXJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogRnVuY3Rpb246CWRtX0N0cmxJbml0R2FpbkJlZm9yZUNvbm5lY3RCeVJzc2lBbmRGYWxzZUFsYXJtKCkKKyAqCisgKiBPdmVydmlldzoJRHJpdmVyIG1vbml0b3IgUlNTSSBhbmQgRmFsc2UgQWxhcm0gdG8gY2hhbmdlIGluaXRpYWwgZ2Fpbi4KKwkJCU9ubHkgY2hhbmdlIGluaXRpYWwgZ2FpbiBkdXJpbmcgbGluayBpbiBwcm9ncmVzcy4KKyAqCisgKiBJbnB1dDoJCUlOCVBBREFQVEVSCXBBZGFwdGVyCisgKgorICogT3V0cHV0OgkJTk9ORQorICoKKyAqIFJldHVybjoJCU5PTkUKKyAqCisgKiBSZXZpc2VkIEhpc3Rvcnk6CisgKglXaGVuCQlXaG8JCVJlbWFyaworICoJMDMvMDQvMjAwOQlocGZhbglDcmVhdGUgVmVyc2lvbiAwLgorICoKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2lfYnlfZHJpdmVycnNzaSgKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwl1OCBpOworCXN0YXRpYyB1OAlmd19kaWc7CisKKwlpZiAoZG1fZGlndGFibGUuZGlnX2VuYWJsZV9mbGFnID09IGZhbHNlKQorCQlyZXR1cm47CisKKwlpZiAoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobV9zd2l0Y2gpCisJCWZ3X2RpZyA9IDA7CisJaWYgKGZ3X2RpZyA8PSAzKSB7CisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgVUZXUCwgYk1hc2tCeXRlMSwgMHg4KTsKKwkJZndfZGlnKys7CisJCWRtX2RpZ3RhYmxlLmRpZ19zdGF0ZSA9IERNX1NUQV9ESUdfT0ZGOworCX0KKworCWlmIChwcml2LT5ydGxsaWItPnN0YXRlID09IFJUTExJQl9MSU5LRUQpCisJCWRtX2RpZ3RhYmxlLkN1clNUQUNvbm5lY3RTdGF0ZSA9IERJR19TVEFfQ09OTkVDVDsKKwllbHNlCisJCWRtX2RpZ3RhYmxlLkN1clNUQUNvbm5lY3RTdGF0ZSA9IERJR19TVEFfRElTQ09OTkVDVDsKKworCisJaWYgKGRtX2RpZ3RhYmxlLmRiZ19tb2RlID09IERNX0RCR19PRkYpCisJCWRtX2RpZ3RhYmxlLnJzc2lfdmFsID0gcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYjsKKwlkbV9pbml0aWFsX2dhaW4oZGV2KTsKKwlkbV9wZF90aChkZXYpOworCWRtX2NzX3JhdGlvKGRldik7CisJaWYgKGRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG1fc3dpdGNoKQorCQlkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtX3N3aXRjaCA9IDA7CisJZG1fZGlndGFibGUuUHJlU1RBQ29ubmVjdFN0YXRlID0gZG1fZGlndGFibGUuQ3VyU1RBQ29ubmVjdFN0YXRlOworCit9CisKK3N0YXRpYyB2b2lkIGRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpX2J5X2Z3ZmFsc2VfYWxhcm0oCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJc3RhdGljIHUzMiByZXNldF9jbnQ7CisJdTggaTsKKworCWlmIChkbV9kaWd0YWJsZS5kaWdfZW5hYmxlX2ZsYWcgPT0gZmFsc2UpCisJCXJldHVybjsKKworCWlmIChkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtX3N3aXRjaCkgeworCQlkbV9kaWd0YWJsZS5kaWdfc3RhdGUgPSBETV9TVEFfRElHX01BWDsKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBVRldQLCBiTWFza0J5dGUxLCAweDEpOworCQlkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtX3N3aXRjaCA9IDA7CisJfQorCisJaWYgKHByaXYtPnJ0bGxpYi0+c3RhdGUgIT0gUlRMTElCX0xJTktFRCkKKwkJcmV0dXJuOworCisJaWYgKChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID4gZG1fZGlndGFibGUucnNzaV9sb3dfdGhyZXNoKSAmJgorCQkocHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA8IGRtX2RpZ3RhYmxlLnJzc2lfaGlnaF90aHJlc2gpKQorCQlyZXR1cm47CisJaWYgKChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDw9IGRtX2RpZ3RhYmxlLnJzc2lfbG93X3RocmVzaCkpIHsKKwkJaWYgKGRtX2RpZ3RhYmxlLmRpZ19zdGF0ZSA9PSBETV9TVEFfRElHX09GRiAmJgorCQkJKHByaXYtPnJlc2V0X2NvdW50ID09IHJlc2V0X2NudCkpCisJCQlyZXR1cm47CisJCWVsc2UKKwkJCXJlc2V0X2NudCA9IHByaXYtPnJlc2V0X2NvdW50OworCisJCWRtX2RpZ3RhYmxlLmRpZ19oaWdocHdyX3N0YXRlID0gRE1fU1RBX0RJR19NQVg7CisJCWRtX2RpZ3RhYmxlLmRpZ19zdGF0ZSA9IERNX1NUQV9ESUdfT0ZGOworCisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBVRldQLCBiTWFza0J5dGUxLCAweDgpOworCisJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hBQUdDQ29yZTEsIDB4MTcpOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQkFHQ0NvcmUxLCAweDE3KTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWENBR0NDb3JlMSwgMHgxNyk7CisJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hEQUdDQ29yZTEsIDB4MTcpOworCisJCWlmIChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIChyT0ZETTBfWEFUeEFGRSszKSwgMHgwMCk7CisJCWVsc2UKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQyKTsKKworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4YTBhLCAweDA4KTsKKworCQlyZXR1cm47CisJfQorCisJaWYgKChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IGRtX2RpZ3RhYmxlLnJzc2lfaGlnaF90aHJlc2gpKSB7CisJCXU4IHJlc2V0X2ZsYWcgPSAwOworCisJCWlmIChkbV9kaWd0YWJsZS5kaWdfc3RhdGUgPT0gRE1fU1RBX0RJR19PTiAmJgorCQkgICAgKHByaXYtPnJlc2V0X2NvdW50ID09IHJlc2V0X2NudCkpIHsKKwkJCWRtX2N0cmxfaW5pdGdhaW5fYnlyc3NpX2hpZ2hwd3IoZGV2KTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCWlmIChwcml2LT5yZXNldF9jb3VudCAhPSByZXNldF9jbnQpCisJCQkJcmVzZXRfZmxhZyA9IDE7CisKKwkJCXJlc2V0X2NudCA9IHByaXYtPnJlc2V0X2NvdW50OworCQl9CisKKwkJZG1fZGlndGFibGUuZGlnX3N0YXRlID0gRE1fU1RBX0RJR19PTjsKKworCQlpZiAocmVzZXRfZmxhZyA9PSAxKSB7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQUFHQ0NvcmUxLCAweDJjKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hCQUdDQ29yZTEsIDB4MmMpOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWENBR0NDb3JlMSwgMHgyYyk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YREFHQ0NvcmUxLCAweDJjKTsKKwkJfSBlbHNlIHsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hBQUdDQ29yZTEsIDB4MjApOworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWEJBR0NDb3JlMSwgMHgyMCk7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQ0FHQ0NvcmUxLCAweDIwKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hEQUdDQ29yZTEsIDB4MjApOworCQl9CisKKwkJaWYgKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgIT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgKHJPRkRNMF9YQVR4QUZFKzMpLCAweDIwKTsKKwkJZWxzZQorCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjEsIDB4NDQpOworCisJCXdyaXRlX25pY19ieXRlKGRldiwgMHhhMGEsIDB4Y2QpOworCisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBVRldQLCBiTWFza0J5dGUxLCAweDEpOworCX0KKwlkbV9jdHJsX2luaXRnYWluX2J5cnNzaV9oaWdocHdyKGRldik7Cit9CisKKworc3RhdGljIHZvaWQgZG1fY3RybF9pbml0Z2Fpbl9ieXJzc2lfaGlnaHB3cihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlzdGF0aWMgdTMyIHJlc2V0X2NudF9oaWdocHdyOworCisJaWYgKChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID4gZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2xvd3RocmVzaCkgJiYKKwkJKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPCBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfcG93ZXJfaGlnaHRocmVzaCkpCisJCXJldHVybjsKKworCWlmIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IGRtX2RpZ3RhYmxlLnJzc2lfaGlnaF9wb3dlcl9oaWdodGhyZXNoKSB7CisJCWlmIChkbV9kaWd0YWJsZS5kaWdfaGlnaHB3cl9zdGF0ZSA9PSBETV9TVEFfRElHX09OICYmCisJCQkocHJpdi0+cmVzZXRfY291bnQgPT0gcmVzZXRfY250X2hpZ2hwd3IpKQorCQkJcmV0dXJuOworCQllbHNlCisJCQlkbV9kaWd0YWJsZS5kaWdfaGlnaHB3cl9zdGF0ZSA9IERNX1NUQV9ESUdfT047CisKKwkJaWYgKHByaXYtPkN1cnJlbnRDaGFubmVsQlcgIT0gSFRfQ0hBTk5FTF9XSURUSF8yMCkKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIChyT0ZETTBfWEFUeEFGRSszKSwgMHgxMCk7CisJCWVsc2UKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQzKTsKKwl9IGVsc2UgeworCQlpZiAoZG1fZGlndGFibGUuZGlnX2hpZ2hwd3Jfc3RhdGUgPT0gRE1fU1RBX0RJR19PRkYgJiYKKwkJCShwcml2LT5yZXNldF9jb3VudCA9PSByZXNldF9jbnRfaGlnaHB3cikpCisJCQlyZXR1cm47CisJCWVsc2UKKwkJCWRtX2RpZ3RhYmxlLmRpZ19oaWdocHdyX3N0YXRlID0gRE1fU1RBX0RJR19PRkY7CisKKwkJaWYgKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPCBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfcG93ZXJfbG93dGhyZXNoICYmCisJCQkgcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYiA+PSBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfdGhyZXNoKSB7CisJCQlpZiAocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKQorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgKHJPRkRNMF9YQVR4QUZFKzMpLCAweDIwKTsKKwkJCWVsc2UKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0NCk7CisJCX0KKwl9CisJcmVzZXRfY250X2hpZ2hwd3IgPSBwcml2LT5yZXNldF9jb3VudDsKK30KKworc3RhdGljIHZvaWQgZG1faW5pdGlhbF9nYWluKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXU4IGluaXRpYWxfZ2FpbiA9IDA7CisJc3RhdGljIHU4IGluaXRpYWxpemVkLCBmb3JjZV93cml0ZTsKKwlzdGF0aWMgdTMyIHJlc2V0X2NudDsKKworCWlmIChkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtX3N3aXRjaCkgeworCQlpbml0aWFsaXplZCA9IDA7CisJCXJlc2V0X2NudCA9IDA7CisJfQorCisJaWYgKHJ0bGxpYl9hY3Rfc2Nhbm5pbmcocHJpdi0+cnRsbGliLCB0cnVlKSA9PSB0cnVlKSB7CisJCWZvcmNlX3dyaXRlID0gMTsKKwkJcmV0dXJuOworCX0KKworCWlmIChkbV9kaWd0YWJsZS5QcmVTVEFDb25uZWN0U3RhdGUgPT0gZG1fZGlndGFibGUuQ3VyU1RBQ29ubmVjdFN0YXRlKSB7CisJCWlmIChkbV9kaWd0YWJsZS5DdXJTVEFDb25uZWN0U3RhdGUgPT0gRElHX1NUQV9DT05ORUNUKSB7CisJCQlpZiAoKGRtX2RpZ3RhYmxlLnJzc2lfdmFsKzEwLWRtX2RpZ3RhYmxlLmJhY2tvZmZfdmFsKSA+IGRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWF4KQorCQkJCWRtX2RpZ3RhYmxlLmN1cl9pZ192YWx1ZSA9IGRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWF4OworCQkJZWxzZSBpZiAoKGRtX2RpZ3RhYmxlLnJzc2lfdmFsKzEwLWRtX2RpZ3RhYmxlLmJhY2tvZmZfdmFsKSA8IGRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWluKQorCQkJCWRtX2RpZ3RhYmxlLmN1cl9pZ192YWx1ZSA9IGRtX2RpZ3RhYmxlLnJ4X2dhaW5fcmFuZ2VfbWluOworCQkJZWxzZQorCQkJCWRtX2RpZ3RhYmxlLmN1cl9pZ192YWx1ZSA9IGRtX2RpZ3RhYmxlLnJzc2lfdmFsKzEwLWRtX2RpZ3RhYmxlLmJhY2tvZmZfdmFsOworCQl9IGVsc2UgeworCQkJaWYgKGRtX2RpZ3RhYmxlLmN1cl9pZ192YWx1ZSA9PSAwKQorCQkJCWRtX2RpZ3RhYmxlLmN1cl9pZ192YWx1ZSA9IHByaXYtPkRlZmF1bHRJbml0aWFsR2FpblswXTsKKwkJCWVsc2UKKwkJCQlkbV9kaWd0YWJsZS5jdXJfaWdfdmFsdWUgPSBkbV9kaWd0YWJsZS5wcmVfaWdfdmFsdWU7CisJCX0KKwl9IGVsc2UgeworCQlkbV9kaWd0YWJsZS5jdXJfaWdfdmFsdWUgPSBwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bMF07CisJCWRtX2RpZ3RhYmxlLnByZV9pZ192YWx1ZSA9IDA7CisJfQorCisJaWYgKHByaXYtPnJlc2V0X2NvdW50ICE9IHJlc2V0X2NudCkgeworCQlmb3JjZV93cml0ZSA9IDE7CisJCXJlc2V0X2NudCA9IHByaXYtPnJlc2V0X2NvdW50OworCX0KKworCWlmIChkbV9kaWd0YWJsZS5wcmVfaWdfdmFsdWUgIT0gcmVhZF9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQUFHQ0NvcmUxKSkKKwkJZm9yY2Vfd3JpdGUgPSAxOworCisJaWYgKChkbV9kaWd0YWJsZS5wcmVfaWdfdmFsdWUgIT0gZG1fZGlndGFibGUuY3VyX2lnX3ZhbHVlKQorCSAgICB8fCAhaW5pdGlhbGl6ZWQgfHwgZm9yY2Vfd3JpdGUpIHsKKwkJaW5pdGlhbF9nYWluID0gKHU4KWRtX2RpZ3RhYmxlLmN1cl9pZ192YWx1ZTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWEFBR0NDb3JlMSwgaW5pdGlhbF9nYWluKTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWEJBR0NDb3JlMSwgaW5pdGlhbF9nYWluKTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWENBR0NDb3JlMSwgaW5pdGlhbF9nYWluKTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfWERBR0NDb3JlMSwgaW5pdGlhbF9nYWluKTsKKwkJZG1fZGlndGFibGUucHJlX2lnX3ZhbHVlID0gZG1fZGlndGFibGUuY3VyX2lnX3ZhbHVlOworCQlpbml0aWFsaXplZCA9IDE7CisJCWZvcmNlX3dyaXRlID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRtX3BkX3RoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXN0YXRpYyB1OCBpbml0aWFsaXplZCwgZm9yY2Vfd3JpdGU7CisJc3RhdGljIHUzMiByZXNldF9jbnQ7CisKKwlpZiAoZG1fZGlndGFibGUuZGlnX2FsZ29yaXRobV9zd2l0Y2gpIHsKKwkJaW5pdGlhbGl6ZWQgPSAwOworCQlyZXNldF9jbnQgPSAwOworCX0KKworCWlmIChkbV9kaWd0YWJsZS5QcmVTVEFDb25uZWN0U3RhdGUgPT0gZG1fZGlndGFibGUuQ3VyU1RBQ29ubmVjdFN0YXRlKSB7CisJCWlmIChkbV9kaWd0YWJsZS5DdXJTVEFDb25uZWN0U3RhdGUgPT0gRElHX1NUQV9DT05ORUNUKSB7CisJCQlpZiAoZG1fZGlndGFibGUucnNzaV92YWwgPj0gZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2hpZ2h0aHJlc2gpCisJCQkJZG1fZGlndGFibGUuY3VycGRfdGhzdGF0ZSA9IERJR19QRF9BVF9ISUdIX1BPV0VSOworCQkJZWxzZSBpZiAoKGRtX2RpZ3RhYmxlLnJzc2lfdmFsIDw9IGRtX2RpZ3RhYmxlLnJzc2lfbG93X3RocmVzaCkpCisJCQkJZG1fZGlndGFibGUuY3VycGRfdGhzdGF0ZSA9IERJR19QRF9BVF9MT1dfUE9XRVI7CisJCQllbHNlIGlmICgoZG1fZGlndGFibGUucnNzaV92YWwgPj0gZG1fZGlndGFibGUucnNzaV9oaWdoX3RocmVzaCkgJiYKKwkJCQkJKGRtX2RpZ3RhYmxlLnJzc2lfdmFsIDwgZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2xvd3RocmVzaCkpCisJCQkJZG1fZGlndGFibGUuY3VycGRfdGhzdGF0ZSA9IERJR19QRF9BVF9OT1JNQUxfUE9XRVI7CisJCQllbHNlCisJCQkJZG1fZGlndGFibGUuY3VycGRfdGhzdGF0ZSA9IGRtX2RpZ3RhYmxlLnByZXBkX3Roc3RhdGU7CisJCX0gZWxzZSB7CisJCQlkbV9kaWd0YWJsZS5jdXJwZF90aHN0YXRlID0gRElHX1BEX0FUX0xPV19QT1dFUjsKKwkJfQorCX0gZWxzZSB7CisJCWRtX2RpZ3RhYmxlLmN1cnBkX3Roc3RhdGUgPSBESUdfUERfQVRfTE9XX1BPV0VSOworCX0KKworCWlmIChwcml2LT5yZXNldF9jb3VudCAhPSByZXNldF9jbnQpIHsKKwkJZm9yY2Vfd3JpdGUgPSAxOworCQlyZXNldF9jbnQgPSBwcml2LT5yZXNldF9jb3VudDsKKwl9CisKKwlpZiAoKGRtX2RpZ3RhYmxlLnByZXBkX3Roc3RhdGUgIT0gZG1fZGlndGFibGUuY3VycGRfdGhzdGF0ZSkgfHwKKwkgICAgKGluaXRpYWxpemVkIDw9IDMpIHx8IGZvcmNlX3dyaXRlKSB7CisJCWlmIChkbV9kaWd0YWJsZS5jdXJwZF90aHN0YXRlID09IERJR19QRF9BVF9MT1dfUE9XRVIpIHsKKwkJCWlmIChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApCisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAock9GRE0wX1hBVHhBRkUrMyksIDB4MDApOworCQkJZWxzZQorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQyKTsKKwkJfSBlbHNlIGlmIChkbV9kaWd0YWJsZS5jdXJwZF90aHN0YXRlID09IERJR19QRF9BVF9OT1JNQUxfUE9XRVIpIHsKKwkJCWlmIChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApCisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAock9GRE0wX1hBVHhBRkUrMyksIDB4MjApOworCQkJZWxzZQorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IxLCAweDQ0KTsKKwkJfSBlbHNlIGlmIChkbV9kaWd0YWJsZS5jdXJwZF90aHN0YXRlID09IERJR19QRF9BVF9ISUdIX1BPV0VSKSB7CisJCQlpZiAocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKQorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgKHJPRkRNMF9YQVR4QUZFKzMpLCAweDEwKTsKKwkJCWVsc2UKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMSwgMHg0Myk7CisJCX0KKwkJZG1fZGlndGFibGUucHJlcGRfdGhzdGF0ZSA9IGRtX2RpZ3RhYmxlLmN1cnBkX3Roc3RhdGU7CisJCWlmIChpbml0aWFsaXplZCA8PSAzKQorCQkJaW5pdGlhbGl6ZWQrKzsKKwkJZm9yY2Vfd3JpdGUgPSAwOworCX0KK30KKworc3RhdGljCXZvaWQgZG1fY3NfcmF0aW8oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJc3RhdGljIHU4IGluaXRpYWxpemVkLCBmb3JjZV93cml0ZTsKKwlzdGF0aWMgdTMyIHJlc2V0X2NudDsKKworCWlmIChkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtX3N3aXRjaCkgeworCQlpbml0aWFsaXplZCA9IDA7CisJCXJlc2V0X2NudCA9IDA7CisJfQorCisJaWYgKGRtX2RpZ3RhYmxlLlByZVNUQUNvbm5lY3RTdGF0ZSA9PSBkbV9kaWd0YWJsZS5DdXJTVEFDb25uZWN0U3RhdGUpIHsKKwkJaWYgKGRtX2RpZ3RhYmxlLkN1clNUQUNvbm5lY3RTdGF0ZSA9PSBESUdfU1RBX0NPTk5FQ1QpIHsKKwkJCWlmICgoZG1fZGlndGFibGUucnNzaV92YWwgPD0gZG1fZGlndGFibGUucnNzaV9sb3dfdGhyZXNoKSkKKwkJCQlkbV9kaWd0YWJsZS5jdXJjc19yYXRpb19zdGF0ZSA9IERJR19DU19SQVRJT19MT1dFUjsKKwkJCWVsc2UgaWYgKChkbV9kaWd0YWJsZS5yc3NpX3ZhbCA+PSBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfdGhyZXNoKSkKKwkJCQlkbV9kaWd0YWJsZS5jdXJjc19yYXRpb19zdGF0ZSA9IERJR19DU19SQVRJT19ISUdIRVI7CisJCQllbHNlCisJCQkJZG1fZGlndGFibGUuY3VyY3NfcmF0aW9fc3RhdGUgPSBkbV9kaWd0YWJsZS5wcmVjc19yYXRpb19zdGF0ZTsKKwkJfSBlbHNlIHsKKwkJCWRtX2RpZ3RhYmxlLmN1cmNzX3JhdGlvX3N0YXRlID0gRElHX0NTX1JBVElPX0xPV0VSOworCQl9CisJfSBlbHNlIHsKKwkJZG1fZGlndGFibGUuY3VyY3NfcmF0aW9fc3RhdGUgPSBESUdfQ1NfUkFUSU9fTE9XRVI7CisJfQorCisJaWYgKHByaXYtPnJlc2V0X2NvdW50ICE9IHJlc2V0X2NudCkgeworCQlmb3JjZV93cml0ZSA9IDE7CisJCXJlc2V0X2NudCA9IHByaXYtPnJlc2V0X2NvdW50OworCX0KKworCisJaWYgKChkbV9kaWd0YWJsZS5wcmVjc19yYXRpb19zdGF0ZSAhPSBkbV9kaWd0YWJsZS5jdXJjc19yYXRpb19zdGF0ZSkgfHwKKwkgICAgIWluaXRpYWxpemVkIHx8IGZvcmNlX3dyaXRlKSB7CisJCWlmIChkbV9kaWd0YWJsZS5jdXJjc19yYXRpb19zdGF0ZSA9PSBESUdfQ1NfUkFUSU9fTE9XRVIpCisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4YTBhLCAweDA4KTsKKwkJZWxzZSBpZiAoZG1fZGlndGFibGUuY3VyY3NfcmF0aW9fc3RhdGUgPT0gRElHX0NTX1JBVElPX0hJR0hFUikKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgMHhhMGEsIDB4Y2QpOworCQlkbV9kaWd0YWJsZS5wcmVjc19yYXRpb19zdGF0ZSA9IGRtX2RpZ3RhYmxlLmN1cmNzX3JhdGlvX3N0YXRlOworCQlpbml0aWFsaXplZCA9IDE7CisJCWZvcmNlX3dyaXRlID0gMDsKKwl9Cit9CisKK3ZvaWQgZG1faW5pdF9lZGNhX3R1cmJvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJcHJpdi0+YmN1cnJlbnRfdHVyYm9fRURDQSA9IGZhbHNlOworCXByaXYtPnJ0bGxpYi0+YmlzX2FueV9ub25iZXBrdHMgPSBmYWxzZTsKKwlwcml2LT5iaXNfY3VyX3JkbHN0YXRlID0gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIGRtX2NoZWNrX2VkY2FfdHVyYm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJc3RydWN0IHJ0X2hpX3Rocm91Z2hwdXQgKnBIVEluZm8gPSBwcml2LT5ydGxsaWItPnBIVEluZm87CisKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0VHhPa0NudDsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0UnhPa0NudDsKKwl1bnNpZ25lZCBsb25nIGN1clR4T2tDbnQgPSAwOworCXVuc2lnbmVkIGxvbmcgY3VyUnhPa0NudCA9IDA7CisKKwlpZiAocHJpdi0+cnRsbGliLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJCWdvdG8gZG1fQ2hlY2tFZGNhVHVyYm9fRVhJVDsKKwlpZiAocHJpdi0+cnRsbGliLT5zdGF0ZSAhPSBSVExMSUJfTElOS0VEKQorCQlnb3RvIGRtX0NoZWNrRWRjYVR1cmJvX0VYSVQ7CisJaWYgKHByaXYtPnJ0bGxpYi0+cEhUSW5mby0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9ESVNBQkxFX0VEQ0FfVFVSQk8pCisJCWdvdG8gZG1fQ2hlY2tFZGNhVHVyYm9fRVhJVDsKKworCXsKKwkJdTggKnBlZXJuYW1lWzExXSA9IHsKKwkJCSJ1bmtub3duIiwgInJlYWx0ZWtfOTAiLCAicmVhbHRla185MnNlIiwgImJyb2FkY29tIiwKKwkJCSJyYWxpbmsiLCAiYXRoZXJvcyIsICJjaXNjbyIsICJtYXJ2ZWxsIiwgIjkydV9zb2Z0YXAiLAorCQkJInNlbGZfc29mdGFwIgorCQl9OworCQlzdGF0aWMgaW50IHdiX3RtcDsKKwkJaWYgKHdiX3RtcCA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIlcygpOmlvdCBwZWVyIGlzICVzLCBic3NpZDoiCisJCQkgICAgICAgIiAlcE1cbiIsIF9fZnVuY19fLAorCQkJICAgICAgIHBlZXJuYW1lW3BIVEluZm8tPklPVFBlZXJdLAorCQkJICAgICAgIHByaXYtPnJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLmJzc2lkKTsKKwkJCXdiX3RtcCA9IDE7CisJCX0KKwl9CisJaWYgKCFwcml2LT5ydGxsaWItPmJpc19hbnlfbm9uYmVwa3RzKSB7CisJCWN1clR4T2tDbnQgPSBwcml2LT5zdGF0cy50eGJ5dGVzdW5pY2FzdCAtIGxhc3RUeE9rQ250OworCQljdXJSeE9rQ250ID0gcHJpdi0+c3RhdHMucnhieXRlc3VuaWNhc3QgLSBsYXN0UnhPa0NudDsKKwkJaWYgKHBIVEluZm8tPklPVEFjdGlvbiAmIEhUX0lPVF9BQ1RfRURDQV9CSUFTX09OX1JYKSB7CisJCQlpZiAoY3VyVHhPa0NudCA+IDQqY3VyUnhPa0NudCkgeworCQkJCWlmIChwcml2LT5iaXNfY3VyX3JkbHN0YXRlIHx8CisJCQkJICAgICFwcml2LT5iY3VycmVudF90dXJib19FRENBKSB7CisJCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEVEQ0FQQVJBX0JFLAorCQkJCQkJIGVkY2Ffc2V0dGluZ19VTFtwSFRJbmZvLT5JT1RQZWVyXSk7CisJCQkJCXByaXYtPmJpc19jdXJfcmRsc3RhdGUgPSBmYWxzZTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICghcHJpdi0+YmlzX2N1cl9yZGxzdGF0ZSB8fAorCQkJCSAgICAhcHJpdi0+YmN1cnJlbnRfdHVyYm9fRURDQSkgeworCQkJCQlpZiAocHJpdi0+cnRsbGliLT5tb2RlID09IFdJUkVMRVNTX01PREVfRykKKwkJCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEVEQ0FQQVJBX0JFLAorCQkJCQkJCSBlZGNhX3NldHRpbmdfRExfR01vZGVbcEhUSW5mby0+SU9UUGVlcl0pOworCQkJCQllbHNlCisJCQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBFRENBUEFSQV9CRSwKKwkJCQkJCQkgZWRjYV9zZXR0aW5nX0RMW3BIVEluZm8tPklPVFBlZXJdKTsKKwkJCQkJcHJpdi0+YmlzX2N1cl9yZGxzdGF0ZSA9IHRydWU7CisJCQkJfQorCQkJfQorCQkJcHJpdi0+YmN1cnJlbnRfdHVyYm9fRURDQSA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlpZiAoY3VyUnhPa0NudCA+IDQqY3VyVHhPa0NudCkgeworCQkJCWlmICghcHJpdi0+YmlzX2N1cl9yZGxzdGF0ZSB8fCAhcHJpdi0+YmN1cnJlbnRfdHVyYm9fRURDQSkgeworCQkJCQlpZiAocHJpdi0+cnRsbGliLT5tb2RlID09IFdJUkVMRVNTX01PREVfRykKKwkJCQkJCXdyaXRlX25pY19kd29yZChkZXYsIEVEQ0FQQVJBX0JFLAorCQkJCQkJCSBlZGNhX3NldHRpbmdfRExfR01vZGVbcEhUSW5mby0+SU9UUGVlcl0pOworCQkJCQllbHNlCisJCQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBFRENBUEFSQV9CRSwKKwkJCQkJCQkgZWRjYV9zZXR0aW5nX0RMW3BIVEluZm8tPklPVFBlZXJdKTsKKwkJCQkJcHJpdi0+YmlzX2N1cl9yZGxzdGF0ZSA9IHRydWU7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAocHJpdi0+YmlzX2N1cl9yZGxzdGF0ZSB8fAorCQkJCSAgICAhcHJpdi0+YmN1cnJlbnRfdHVyYm9fRURDQSkgeworCQkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBFRENBUEFSQV9CRSwKKwkJCQkJCQllZGNhX3NldHRpbmdfVUxbcEhUSW5mby0+SU9UUGVlcl0pOworCQkJCQlwcml2LT5iaXNfY3VyX3JkbHN0YXRlID0gZmFsc2U7CisJCQkJfQorCisJCQl9CisKKwkJCXByaXYtPmJjdXJyZW50X3R1cmJvX0VEQ0EgPSB0cnVlOworCQl9CisJfSBlbHNlIHsKKwkJIGlmIChwcml2LT5iY3VycmVudF90dXJib19FRENBKSB7CisJCQl1OCB0bXAgPSBBQzBfQkU7CisJCQlwcml2LT5ydGxsaWItPlNldEh3UmVnSGFuZGxlcihkZXYsIEhXX1ZBUl9BQ19QQVJBTSwgKHU4ICopKCZ0bXApKTsKKwkJCXByaXYtPmJjdXJyZW50X3R1cmJvX0VEQ0EgPSBmYWxzZTsKKwkJfQorCX0KKworCitkbV9DaGVja0VkY2FUdXJib19FWElUOgorCXByaXYtPnJ0bGxpYi0+YmlzX2FueV9ub25iZXBrdHMgPSBmYWxzZTsKKwlsYXN0VHhPa0NudCA9IHByaXYtPnN0YXRzLnR4Ynl0ZXN1bmljYXN0OworCWxhc3RSeE9rQ250ID0gcHJpdi0+c3RhdHMucnhieXRlc3VuaWNhc3Q7Cit9CisKK3N0YXRpYyB2b2lkIGRtX2luaXRfY3RzdG9zZWxmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdigoc3RydWN0IG5ldF9kZXZpY2UgKilkZXYpOworCisJcHJpdi0+cnRsbGliLT5iQ1RTVG9TZWxmRW5hYmxlID0gdHJ1ZTsKKwlwcml2LT5ydGxsaWItPkNUU1RvU2VsZlRIID0gQ1RTVG9TZWxmVEhWYWw7Cit9CisKK3N0YXRpYyB2b2lkIGRtX2N0c3Rvc2VsZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2KTsKKwlzdHJ1Y3QgcnRfaGlfdGhyb3VnaHB1dCAqcEhUSW5mbyA9IHByaXYtPnJ0bGxpYi0+cEhUSW5mbzsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0VHhPa0NudDsKKwlzdGF0aWMgdW5zaWduZWQgbG9uZyBsYXN0UnhPa0NudDsKKwl1bnNpZ25lZCBsb25nIGN1clR4T2tDbnQgPSAwOworCXVuc2lnbmVkIGxvbmcgY3VyUnhPa0NudCA9IDA7CisKKwlpZiAocHJpdi0+cnRsbGliLT5iQ1RTVG9TZWxmRW5hYmxlICE9IHRydWUpIHsKKwkJcEhUSW5mby0+SU9UQWN0aW9uICY9IH5IVF9JT1RfQUNUX0ZPUkNFRF9DVFMyU0VMRjsKKwkJcmV0dXJuOworCX0KKwlpZiAocEhUSW5mby0+SU9UUGVlciA9PSBIVF9JT1RfUEVFUl9CUk9BRENPTSkgeworCQljdXJUeE9rQ250ID0gcHJpdi0+c3RhdHMudHhieXRlc3VuaWNhc3QgLSBsYXN0VHhPa0NudDsKKwkJY3VyUnhPa0NudCA9IHByaXYtPnN0YXRzLnJ4Ynl0ZXN1bmljYXN0IC0gbGFzdFJ4T2tDbnQ7CisJCWlmIChjdXJSeE9rQ250ID4gNCpjdXJUeE9rQ250KQorCQkJcEhUSW5mby0+SU9UQWN0aW9uICY9IH5IVF9JT1RfQUNUX0ZPUkNFRF9DVFMyU0VMRjsKKwkJZWxzZQorCQkJcEhUSW5mby0+SU9UQWN0aW9uIHw9IEhUX0lPVF9BQ1RfRk9SQ0VEX0NUUzJTRUxGOworCisJCWxhc3RUeE9rQ250ID0gcHJpdi0+c3RhdHMudHhieXRlc3VuaWNhc3Q7CisJCWxhc3RSeE9rQ250ID0gcHJpdi0+c3RhdHMucnhieXRlc3VuaWNhc3Q7CisJfQorfQorCisKK3N0YXRpYwl2b2lkIGRtX0luaXRfV0FfQnJvYWRjb21fSU9UKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdigoc3RydWN0IG5ldF9kZXZpY2UgKilkZXYpOworCXN0cnVjdCBydF9oaV90aHJvdWdocHV0ICpwSFRJbmZvID0gcHJpdi0+cnRsbGliLT5wSFRJbmZvOworCisJcEhUSW5mby0+YldBSW90QnJvYWRjb20gPSBmYWxzZTsKKwlwSFRJbmZvLT5XQUlvdFRIID0gV0FJb3RUSFZhbDsKK30KKworc3RhdGljCXZvaWQJZG1fY2hlY2tfcGJjX2dwaW8oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKK30KKwordm9pZCBkbV9DaGVja1JmQ3RybEdQSU8odm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZl9kd29ya19yc2woZGF0YSwKKwkJCQkgIHN0cnVjdCByODE5Ml9wcml2LCBncGlvX2NoYW5nZV9yZl93cSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPnJ0bGxpYi0+ZGV2OworCXU4IHRtcDFieXRlOworCWVudW0gcnRfcmZfcG93ZXJfc3RhdGUgZVJmUG93ZXJTdGF0ZVRvU2V0OworCWJvb2wgYkFjdHVhbGx5U2V0ID0gZmFsc2U7CisJY2hhciAqYXJndlszXTsKKwlzdGF0aWMgY2hhciAqUmFkaW9Qb3dlclBhdGggPSAiL2V0Yy9hY3BpL2V2ZW50cy9SYWRpb1Bvd2VyLnNoIjsKKwlzdGF0aWMgY2hhciAqZW52cFtdID0geyJIT01FPS8iLCAiVEVSTT1saW51eCIsICJQQVRIPS91c3IvYmluOi9iaW4iLCBOVUxMfTsKKworCWJBY3R1YWxseVNldCA9IGZhbHNlOworCisJaWYgKChwcml2LT51cF9maXJzdF90aW1lID09IDEpIHx8IChwcml2LT5iZWluZ19pbml0X2FkYXB0ZXIpKQorCQlyZXR1cm47CisKKwlpZiAocHJpdi0+YmZpcnN0X2FmdGVyX2Rvd24pIHsKKwkJcHJpdi0+YmZpcnN0X2FmdGVyX2Rvd24gPSAxOworCQlyZXR1cm47CisJfQorCisJdG1wMWJ5dGUgPSByZWFkX25pY19ieXRlKGRldiwgR1BJKTsKKworCWVSZlBvd2VyU3RhdGVUb1NldCA9ICh0bXAxYnl0ZSZCSVQxKSA/ICBlUmZPbiA6IGVSZk9mZjsKKworCWlmICgocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkgJiYgKGVSZlBvd2VyU3RhdGVUb1NldCA9PSBlUmZPbikpIHsKKwkJUlRfVFJBQ0UoQ09NUF9SRiwgImdwaW9jaGFuZ2VSRiAgLSBIVyBSYWRpbyBPTlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gImdwaW9jaGFuZ2VSRiAgLSBIVyBSYWRpbyBPTlxuIik7CisJCXByaXYtPmJId1JhZGlvT2ZmID0gZmFsc2U7CisJCWJBY3R1YWxseVNldCA9IHRydWU7CisJfSBlbHNlIGlmICgocHJpdi0+Ykh3UmFkaW9PZmYgPT0gZmFsc2UpICYmIChlUmZQb3dlclN0YXRlVG9TZXQgPT0gZVJmT2ZmKSkgeworCQlSVF9UUkFDRShDT01QX1JGLCAiZ3Bpb2NoYW5nZVJGICAtIEhXIFJhZGlvIE9GRlxuIik7CisJCXByaW50ayhLRVJOX0lORk8gImdwaW9jaGFuZ2VSRiAgLSBIVyBSYWRpbyBPRkZcbiIpOworCQlwcml2LT5iSHdSYWRpb09mZiA9IHRydWU7CisJCWJBY3R1YWxseVNldCA9IHRydWU7CisJfQorCisJaWYgKGJBY3R1YWxseVNldCkgeworCQltZGVsYXkoMTAwMCk7CisJCXByaXYtPmJId1JmT2ZmQWN0aW9uID0gMTsKKwkJTWdudEFjdFNldF9SRl9TdGF0ZShkZXYsIGVSZlBvd2VyU3RhdGVUb1NldCwgUkZfQ0hBTkdFX0JZX0hXLCB0cnVlKTsKKwkJaWYgKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpCisJCQlhcmd2WzFdID0gIlJGT0ZGIjsKKwkJZWxzZQorCQkJYXJndlsxXSA9ICJSRk9OIjsKKworCQlhcmd2WzBdID0gUmFkaW9Qb3dlclBhdGg7CisJCWFyZ3ZbMl0gPSBOVUxMOworCQljYWxsX3VzZXJtb2RlaGVscGVyKFJhZGlvUG93ZXJQYXRoLCBhcmd2LCBlbnZwLCAxKTsKKwl9Cit9CisKK3ZvaWQJZG1fcmZfcGF0aGNoZWNrX3dvcmtpdGVtY2FsbGJhY2sodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZl9kd29ya19yc2woZGF0YSwKKwkJCQkgIHN0cnVjdCByODE5Ml9wcml2LAorCQkJCSAgcmZwYXRoX2NoZWNrX3dxKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcHJpdi0+cnRsbGliLT5kZXY7CisJdTggcmZwYXRoID0gMCwgaTsKKworCXJmcGF0aCA9IHJlYWRfbmljX2J5dGUoZGV2LCAweGMwNCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUkY5MF9QQVRIX01BWDsgaSsrKSB7CisJCWlmIChyZnBhdGggJiAoMHgwMTw8aSkpCisJCQlwcml2LT5icmZwYXRoX3J4ZW5hYmxlW2ldID0gMTsKKwkJZWxzZQorCQkJcHJpdi0+YnJmcGF0aF9yeGVuYWJsZVtpXSA9IDA7CisJfQorCWlmICghRE1fUnhQYXRoU2VsVGFibGUuRW5hYmxlKQorCQlyZXR1cm47CisKKwlkbV9yeHBhdGhfc2VsX2J5cnNzaShkZXYpOworfQorCitzdGF0aWMgdm9pZCBkbV9pbml0X3J4cGF0aF9zZWxlY3Rpb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OCBpOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCURNX1J4UGF0aFNlbFRhYmxlLkVuYWJsZSA9IDE7CisJRE1fUnhQYXRoU2VsVGFibGUuU1NfVEhfbG93ID0gUnhQYXRoU2VsZWN0aW9uX1NTX1RIX2xvdzsKKwlETV9SeFBhdGhTZWxUYWJsZS5kaWZmX1RIID0gUnhQYXRoU2VsZWN0aW9uX2RpZmZfVEg7CisJaWYgKHByaXYtPkN1c3RvbWVySUQgPT0gUlRfQ0lEXzgxOXhfTmV0Y29yZSkKKwkJRE1fUnhQYXRoU2VsVGFibGUuY2NrX21ldGhvZCA9IENDS19SeF9WZXJzaW9uXzI7CisJZWxzZQorCQlETV9SeFBhdGhTZWxUYWJsZS5jY2tfbWV0aG9kID0gQ0NLX1J4X1ZlcnNpb25fMTsKKwlETV9SeFBhdGhTZWxUYWJsZS5EYmdNb2RlID0gRE1fREJHX09GRjsKKwlETV9SeFBhdGhTZWxUYWJsZS5kaXNhYmxlZFJGID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCURNX1J4UGF0aFNlbFRhYmxlLnJmX3Jzc2lbaV0gPSA1MDsKKwkJRE1fUnhQYXRoU2VsVGFibGUuY2NrX3B3ZGJfc3RhW2ldID0gLTY0OworCQlETV9SeFBhdGhTZWxUYWJsZS5yZl9lbmFibGVfcnNzaV90aFtpXSA9IDEwMDsKKwl9Cit9CisKKyNkZWZpbmUgUFdEQl9JTl9SQU5HRQkoKGN1cl9jY2tfcHdkYiA8IHRtcF9jY2tfbWF4X3B3ZGIpICYmCVwKKwkJCShjdXJfY2NrX3B3ZGIgPiB0bXBfY2NrX3NlY19wd2RiKSkKKworc3RhdGljIHZvaWQgZG1fcnhwYXRoX3NlbF9ieXJzc2koc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJdTggaSwgbWF4X3Jzc2lfaW5kZXggPSAwLCBtaW5fcnNzaV9pbmRleCA9IDA7CisJdTggc2VjX3Jzc2lfaW5kZXggPSAwLCByZl9udW0gPSAwOworCXU4IHRtcF9tYXhfcnNzaSA9IDAsIHRtcF9taW5fcnNzaSA9IDAsIHRtcF9zZWNfcnNzaSA9IDA7CisJdTggY2NrX2RlZmF1bHRfUnggPSAweDI7CisJdTggY2NrX29wdGlvbmFsX1J4ID0gMHgzOworCWxvbmcgdG1wX2Nja19tYXhfcHdkYiA9IDAsIHRtcF9jY2tfbWluX3B3ZGIgPSAwLCB0bXBfY2NrX3NlY19wd2RiID0gMDsKKwl1OCBjY2tfcnhfdmVyMl9tYXhfaW5kZXggPSAwLCBjY2tfcnhfdmVyMl9taW5faW5kZXggPSAwOworCXU4IGNja19yeF92ZXIyX3NlY19pbmRleCA9IDA7CisJdTggY3VyX3JmX3Jzc2k7CisJbG9uZyBjdXJfY2NrX3B3ZGI7CisJc3RhdGljIHU4IGRpc2FibGVkX3JmX2NudCwgY2NrX1J4X1BhdGhfaW5pdGlhbGl6ZWQ7CisJdTggdXBkYXRlX2Nja19yeF9wYXRoOworCisJaWYgKHByaXYtPnJmX3R5cGUgIT0gUkZfMlQ0UikKKwkJcmV0dXJuOworCisJaWYgKCFjY2tfUnhfUGF0aF9pbml0aWFsaXplZCkgeworCQlETV9SeFBhdGhTZWxUYWJsZS5jY2tfUnhfcGF0aCA9IChyZWFkX25pY19ieXRlKGRldiwgMHhhMDcpJjB4Zik7CisJCWNja19SeF9QYXRoX2luaXRpYWxpemVkID0gMTsKKwl9CisKKwlETV9SeFBhdGhTZWxUYWJsZS5kaXNhYmxlZFJGID0gMHhmOworCURNX1J4UGF0aFNlbFRhYmxlLmRpc2FibGVkUkYgJj0gfihyZWFkX25pY19ieXRlKGRldiwgMHhjMDQpKTsKKworCWlmIChwcml2LT5ydGxsaWItPm1vZGUgPT0gV0lSRUxFU1NfTU9ERV9CKQorCQlETV9SeFBhdGhTZWxUYWJsZS5jY2tfbWV0aG9kID0gQ0NLX1J4X1ZlcnNpb25fMjsKKworCWZvciAoaSA9IDA7IGkgPCBSRjkwX1BBVEhfTUFYOyBpKyspIHsKKwkJaWYgKCFETV9SeFBhdGhTZWxUYWJsZS5EYmdNb2RlKQorCQkJRE1fUnhQYXRoU2VsVGFibGUucmZfcnNzaVtpXSA9IHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtpXTsKKworCQlpZiAocHJpdi0+YnJmcGF0aF9yeGVuYWJsZVtpXSkgeworCQkJcmZfbnVtKys7CisJCQljdXJfcmZfcnNzaSA9IERNX1J4UGF0aFNlbFRhYmxlLnJmX3Jzc2lbaV07CisKKwkJCWlmIChyZl9udW0gPT0gMSkgeworCQkJCW1heF9yc3NpX2luZGV4ID0gbWluX3Jzc2lfaW5kZXggPSBzZWNfcnNzaV9pbmRleCA9IGk7CisJCQkJdG1wX21heF9yc3NpID0gdG1wX21pbl9yc3NpID0gdG1wX3NlY19yc3NpID0gY3VyX3JmX3Jzc2k7CisJCQl9IGVsc2UgaWYgKHJmX251bSA9PSAyKSB7CisJCQkJaWYgKGN1cl9yZl9yc3NpID49IHRtcF9tYXhfcnNzaSkgeworCQkJCQl0bXBfbWF4X3Jzc2kgPSBjdXJfcmZfcnNzaTsKKwkJCQkJbWF4X3Jzc2lfaW5kZXggPSBpOworCQkJCX0gZWxzZSB7CisJCQkJCXRtcF9zZWNfcnNzaSA9IHRtcF9taW5fcnNzaSA9IGN1cl9yZl9yc3NpOworCQkJCQlzZWNfcnNzaV9pbmRleCA9IG1pbl9yc3NpX2luZGV4ID0gaTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChjdXJfcmZfcnNzaSA+IHRtcF9tYXhfcnNzaSkgeworCQkJCQl0bXBfc2VjX3Jzc2kgPSB0bXBfbWF4X3Jzc2k7CisJCQkJCXNlY19yc3NpX2luZGV4ID0gbWF4X3Jzc2lfaW5kZXg7CisJCQkJCXRtcF9tYXhfcnNzaSA9IGN1cl9yZl9yc3NpOworCQkJCQltYXhfcnNzaV9pbmRleCA9IGk7CisJCQkJfSBlbHNlIGlmIChjdXJfcmZfcnNzaSA9PSB0bXBfbWF4X3Jzc2kpIHsKKwkJCQkJdG1wX3NlY19yc3NpID0gY3VyX3JmX3Jzc2k7CisJCQkJCXNlY19yc3NpX2luZGV4ID0gaTsKKwkJCQl9IGVsc2UgaWYgKChjdXJfcmZfcnNzaSA8IHRtcF9tYXhfcnNzaSkgJiYKKwkJCQkJICAgKGN1cl9yZl9yc3NpID4gdG1wX3NlY19yc3NpKSkgeworCQkJCQl0bXBfc2VjX3Jzc2kgPSBjdXJfcmZfcnNzaTsKKwkJCQkJc2VjX3Jzc2lfaW5kZXggPSBpOworCQkJCX0gZWxzZSBpZiAoY3VyX3JmX3Jzc2kgPT0gdG1wX3NlY19yc3NpKSB7CisJCQkJCWlmICh0bXBfc2VjX3Jzc2kgPT0gdG1wX21pbl9yc3NpKSB7CisJCQkJCQl0bXBfc2VjX3Jzc2kgPSBjdXJfcmZfcnNzaTsKKwkJCQkJCXNlY19yc3NpX2luZGV4ID0gaTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoKGN1cl9yZl9yc3NpIDwgdG1wX3NlY19yc3NpKSAmJgorCQkJCQkgICAoY3VyX3JmX3Jzc2kgPiB0bXBfbWluX3Jzc2kpKSB7CisJCQkJCTsKKwkJCQl9IGVsc2UgaWYgKGN1cl9yZl9yc3NpID09IHRtcF9taW5fcnNzaSkgeworCQkJCQlpZiAodG1wX3NlY19yc3NpID09IHRtcF9taW5fcnNzaSkgeworCQkJCQkJdG1wX21pbl9yc3NpID0gY3VyX3JmX3Jzc2k7CisJCQkJCQltaW5fcnNzaV9pbmRleCA9IGk7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGN1cl9yZl9yc3NpIDwgdG1wX21pbl9yc3NpKSB7CisJCQkJCXRtcF9taW5fcnNzaSA9IGN1cl9yZl9yc3NpOworCQkJCQltaW5fcnNzaV9pbmRleCA9IGk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcmZfbnVtID0gMDsKKwlpZiAoRE1fUnhQYXRoU2VsVGFibGUuY2NrX21ldGhvZCA9PSBDQ0tfUnhfVmVyc2lvbl8yKSB7CisJCWZvciAoaSA9IDA7IGkgPCBSRjkwX1BBVEhfTUFYOyBpKyspIHsKKwkJCWlmIChwcml2LT5icmZwYXRoX3J4ZW5hYmxlW2ldKSB7CisJCQkJcmZfbnVtKys7CisJCQkJY3VyX2Nja19wd2RiID0KKwkJCQkJIERNX1J4UGF0aFNlbFRhYmxlLmNja19wd2RiX3N0YVtpXTsKKworCQkJCWlmIChyZl9udW0gPT0gMSkgeworCQkJCQljY2tfcnhfdmVyMl9tYXhfaW5kZXggPSBpOworCQkJCQljY2tfcnhfdmVyMl9taW5faW5kZXggPSBpOworCQkJCQljY2tfcnhfdmVyMl9zZWNfaW5kZXggPSBpOworCQkJCQl0bXBfY2NrX21heF9wd2RiID0gY3VyX2Nja19wd2RiOworCQkJCQl0bXBfY2NrX21pbl9wd2RiID0gY3VyX2Nja19wd2RiOworCQkJCQl0bXBfY2NrX3NlY19wd2RiID0gY3VyX2Nja19wd2RiOworCQkJCX0gZWxzZSBpZiAocmZfbnVtID09IDIpIHsKKwkJCQkJaWYgKGN1cl9jY2tfcHdkYiA+PSB0bXBfY2NrX21heF9wd2RiKSB7CisJCQkJCQl0bXBfY2NrX21heF9wd2RiID0gY3VyX2Nja19wd2RiOworCQkJCQkJY2NrX3J4X3ZlcjJfbWF4X2luZGV4ID0gaTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXRtcF9jY2tfc2VjX3B3ZGIgPSBjdXJfY2NrX3B3ZGI7CisJCQkJCQl0bXBfY2NrX21pbl9wd2RiID0gY3VyX2Nja19wd2RiOworCQkJCQkJY2NrX3J4X3ZlcjJfc2VjX2luZGV4ID0gaTsKKwkJCQkJCWNja19yeF92ZXIyX21pbl9pbmRleCA9IGk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoY3VyX2Nja19wd2RiID4gdG1wX2Nja19tYXhfcHdkYikgeworCQkJCQkJdG1wX2Nja19zZWNfcHdkYiA9CisJCQkJCQkJIHRtcF9jY2tfbWF4X3B3ZGI7CisJCQkJCQljY2tfcnhfdmVyMl9zZWNfaW5kZXggPQorCQkJCQkJCSBjY2tfcnhfdmVyMl9tYXhfaW5kZXg7CisJCQkJCQl0bXBfY2NrX21heF9wd2RiID0gY3VyX2Nja19wd2RiOworCQkJCQkJY2NrX3J4X3ZlcjJfbWF4X2luZGV4ID0gaTsKKwkJCQkJfSBlbHNlIGlmIChjdXJfY2NrX3B3ZGIgPT0KKwkJCQkJCSAgIHRtcF9jY2tfbWF4X3B3ZGIpIHsKKwkJCQkJCXRtcF9jY2tfc2VjX3B3ZGIgPSBjdXJfY2NrX3B3ZGI7CisJCQkJCQljY2tfcnhfdmVyMl9zZWNfaW5kZXggPSBpOworCQkJCQl9IGVsc2UgaWYgKFBXREJfSU5fUkFOR0UpIHsKKwkJCQkJCXRtcF9jY2tfc2VjX3B3ZGIgPSBjdXJfY2NrX3B3ZGI7CisJCQkJCQljY2tfcnhfdmVyMl9zZWNfaW5kZXggPSBpOworCQkJCQl9IGVsc2UgaWYgKGN1cl9jY2tfcHdkYiA9PQorCQkJCQkJICAgdG1wX2Nja19zZWNfcHdkYikgeworCQkJCQkJaWYgKHRtcF9jY2tfc2VjX3B3ZGIgPT0KKwkJCQkJCSAgICB0bXBfY2NrX21pbl9wd2RiKSB7CisJCQkJCQkJdG1wX2Nja19zZWNfcHdkYiA9CisJCQkJCQkJCSBjdXJfY2NrX3B3ZGI7CisJCQkJCQkJY2NrX3J4X3ZlcjJfc2VjX2luZGV4ID0KKwkJCQkJCQkJIGk7CisJCQkJCQl9CisJCQkJCX0gZWxzZSBpZiAoKGN1cl9jY2tfcHdkYiA8IHRtcF9jY2tfc2VjX3B3ZGIpICYmCisJCQkJCQkgICAoY3VyX2Nja19wd2RiID4gdG1wX2Nja19taW5fcHdkYikpIHsKKwkJCQkJCTsKKwkJCQkJfSBlbHNlIGlmIChjdXJfY2NrX3B3ZGIgPT0gdG1wX2Nja19taW5fcHdkYikgeworCQkJCQkJaWYgKHRtcF9jY2tfc2VjX3B3ZGIgPT0gdG1wX2Nja19taW5fcHdkYikgeworCQkJCQkJCXRtcF9jY2tfbWluX3B3ZGIgPSBjdXJfY2NrX3B3ZGI7CisJCQkJCQkJY2NrX3J4X3ZlcjJfbWluX2luZGV4ID0gaTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIGlmIChjdXJfY2NrX3B3ZGIgPCB0bXBfY2NrX21pbl9wd2RiKSB7CisJCQkJCQl0bXBfY2NrX21pbl9wd2RiID0gY3VyX2Nja19wd2RiOworCQkJCQkJY2NrX3J4X3ZlcjJfbWluX2luZGV4ID0gaTsKKwkJCQkJfQorCQkJCX0KKworCQkJfQorCQl9CisJfQorCisJdXBkYXRlX2Nja19yeF9wYXRoID0gMDsKKwlpZiAoRE1fUnhQYXRoU2VsVGFibGUuY2NrX21ldGhvZCA9PSBDQ0tfUnhfVmVyc2lvbl8yKSB7CisJCWNja19kZWZhdWx0X1J4ID0gY2NrX3J4X3ZlcjJfbWF4X2luZGV4OworCQljY2tfb3B0aW9uYWxfUnggPSBjY2tfcnhfdmVyMl9zZWNfaW5kZXg7CisJCWlmICh0bXBfY2NrX21heF9wd2RiICE9IC02NCkKKwkJCXVwZGF0ZV9jY2tfcnhfcGF0aCA9IDE7CisJfQorCisJaWYgKHRtcF9taW5fcnNzaSA8IERNX1J4UGF0aFNlbFRhYmxlLlNTX1RIX2xvdyAmJiBkaXNhYmxlZF9yZl9jbnQgPCAyKSB7CisJCWlmICgodG1wX21heF9yc3NpIC0gdG1wX21pbl9yc3NpKSA+PQorCQkgICAgIERNX1J4UGF0aFNlbFRhYmxlLmRpZmZfVEgpIHsKKwkJCURNX1J4UGF0aFNlbFRhYmxlLnJmX2VuYWJsZV9yc3NpX3RoW21pbl9yc3NpX2luZGV4XSA9CisJCQkJIHRtcF9tYXhfcnNzaSs1OworCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9UUnhQYXRoRW5hYmxlLAorCQkJCSAweDE8PG1pbl9yc3NpX2luZGV4LCAweDApOworCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMV9UUnhQYXRoRW5hYmxlLAorCQkJCSAweDE8PG1pbl9yc3NpX2luZGV4LCAweDApOworCQkJZGlzYWJsZWRfcmZfY250Kys7CisJCX0KKwkJaWYgKERNX1J4UGF0aFNlbFRhYmxlLmNja19tZXRob2QgPT0gQ0NLX1J4X1ZlcnNpb25fMSkgeworCQkJY2NrX2RlZmF1bHRfUnggPSBtYXhfcnNzaV9pbmRleDsKKwkJCWNja19vcHRpb25hbF9SeCA9IHNlY19yc3NpX2luZGV4OworCQkJaWYgKHRtcF9tYXhfcnNzaSkKKwkJCQl1cGRhdGVfY2NrX3J4X3BhdGggPSAxOworCQl9CisJfQorCisJaWYgKHVwZGF0ZV9jY2tfcnhfcGF0aCkgeworCQlETV9SeFBhdGhTZWxUYWJsZS5jY2tfUnhfcGF0aCA9IChjY2tfZGVmYXVsdF9SeDw8MikgfAorCQkJCQkJKGNja19vcHRpb25hbF9SeCk7CisJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9BRkVTZXR0aW5nLCAweDBmMDAwMDAwLAorCQkJCSBETV9SeFBhdGhTZWxUYWJsZS5jY2tfUnhfcGF0aCk7CisJfQorCisJaWYgKERNX1J4UGF0aFNlbFRhYmxlLmRpc2FibGVkUkYpIHsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJaWYgKChETV9SeFBhdGhTZWxUYWJsZS5kaXNhYmxlZFJGPj5pKSAmIDB4MSkgeworCQkJCWlmICh0bXBfbWF4X3Jzc2kgPj0KKwkJCQkgICAgRE1fUnhQYXRoU2VsVGFibGUucmZfZW5hYmxlX3Jzc2lfdGhbaV0pIHsKKwkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsCisJCQkJCQkgck9GRE0wX1RSeFBhdGhFbmFibGUsIDB4MSA8PCBpLAorCQkJCQkJIDB4MSk7CisJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LAorCQkJCQkJIHJPRkRNMV9UUnhQYXRoRW5hYmxlLAorCQkJCQkJIDB4MSA8PCBpLCAweDEpOworCQkJCQlETV9SeFBhdGhTZWxUYWJsZS5yZl9lbmFibGVfcnNzaV90aFtpXQorCQkJCQkJID0gMTAwOworCQkJCQlkaXNhYmxlZF9yZl9jbnQtLTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYwl2b2lkCWRtX2NoZWNrX3J4X3BhdGhfc2VsZWN0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJcXVldWVfZGVsYXllZF93b3JrX3JzbChwcml2LT5wcml2X3dxLCAmcHJpdi0+cmZwYXRoX2NoZWNrX3dxLCAwKTsKK30KKworCitzdGF0aWMgdm9pZCBkbV9pbml0X2ZzeW5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJcHJpdi0+cnRsbGliLT5mc3luY190aW1lX2ludGVydmFsID0gNTAwOworCXByaXYtPnJ0bGxpYi0+ZnN5bmNfcmF0ZV9iaXRtYXAgPSAweDBmMDAwODAwOworCXByaXYtPnJ0bGxpYi0+ZnN5bmNfcnNzaV90aHJlc2hvbGQgPSAzMDsKKwlwcml2LT5ydGxsaWItPmJmc3luY19lbmFibGUgPSBmYWxzZTsKKwlwcml2LT5ydGxsaWItPmZzeW5jX211bHRpcGxlX3RpbWVpbnRlcnZhbCA9IDM7CisJcHJpdi0+cnRsbGliLT5mc3luY19maXJzdGRpZmZfcmF0ZXRocmVzaG9sZCA9IDEwMDsKKwlwcml2LT5ydGxsaWItPmZzeW5jX3NlY29uZGRpZmZfcmF0ZXRocmVzaG9sZCA9IDIwMDsKKwlwcml2LT5ydGxsaWItPmZzeW5jX3N0YXRlID0gRGVmYXVsdF9Gc3luYzsKKwlwcml2LT5mcmFtZXN5bmNNb25pdG9yID0gMTsKKworCWluaXRfdGltZXIoJnByaXYtPmZzeW5jX3RpbWVyKTsKKwlzZXR1cF90aW1lcigmcHJpdi0+ZnN5bmNfdGltZXIsIGRtX2ZzeW5jX3RpbWVyX2NhbGxiYWNrLAorCQkgICAodW5zaWduZWQgbG9uZykgZGV2KTsKK30KKworCitzdGF0aWMgdm9pZCBkbV9kZUluaXRfZnN5bmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJZGVsX3RpbWVyX3N5bmMoJnByaXYtPmZzeW5jX3RpbWVyKTsKK30KKwordm9pZCBkbV9mc3luY190aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRhdGE7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdigoc3RydWN0IG5ldF9kZXZpY2UgKilkYXRhKTsKKwl1MzIgcmF0ZV9pbmRleCwgcmF0ZV9jb3VudCA9IDAsIHJhdGVfY291bnRfZGlmZiA9IDA7CisJYm9vbAkJYlN3aXRjaEZyb21Db3VudERpZmYgPSBmYWxzZTsKKwlib29sCQliRG91YmxlVGltZUludGVydmFsID0gZmFsc2U7CisKKwlpZiAocHJpdi0+cnRsbGliLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEICYmCisJICAgIHByaXYtPnJ0bGxpYi0+YmZzeW5jX2VuYWJsZSAmJgorCSAgICAocHJpdi0+cnRsbGliLT5wSFRJbmZvLT5JT1RBY3Rpb24gJiBIVF9JT1RfQUNUX0NERF9GU1lOQykpIHsKKwkJdTMyIHJhdGVfYml0bWFwOworCQlmb3IgKHJhdGVfaW5kZXggPSAwOyByYXRlX2luZGV4IDw9IDI3OyByYXRlX2luZGV4KyspIHsKKwkJCXJhdGVfYml0bWFwICA9IDEgPDwgcmF0ZV9pbmRleDsKKwkJCWlmIChwcml2LT5ydGxsaWItPmZzeW5jX3JhdGVfYml0bWFwICYgIHJhdGVfYml0bWFwKQorCQkJCXJhdGVfY291bnQgKz0KKwkJCQkgICBwcml2LT5zdGF0cy5yZWNlaXZlZF9yYXRlX2hpc3RvZ3JhbVsxXQorCQkJCSAgIFtyYXRlX2luZGV4XTsKKwkJfQorCisJCWlmIChyYXRlX2NvdW50IDwgcHJpdi0+cmF0ZV9yZWNvcmQpCisJCQlyYXRlX2NvdW50X2RpZmYgPSAweGZmZmZmZmZmIC0gcmF0ZV9jb3VudCArCisJCQkJCSAgcHJpdi0+cmF0ZV9yZWNvcmQ7CisJCWVsc2UKKwkJCXJhdGVfY291bnRfZGlmZiA9IHJhdGVfY291bnQgLSBwcml2LT5yYXRlX3JlY29yZDsKKwkJaWYgKHJhdGVfY291bnRfZGlmZiA8IHByaXYtPnJhdGVDb3VudERpZmZSZWNvcmQpIHsKKworCQkJdTMyIERpZmZOdW0gPSBwcml2LT5yYXRlQ291bnREaWZmUmVjb3JkIC0KKwkJCQkgICAgICByYXRlX2NvdW50X2RpZmY7CisJCQlpZiAoRGlmZk51bSA+PQorCQkJICAgIHByaXYtPnJ0bGxpYi0+ZnN5bmNfc2Vjb25kZGlmZl9yYXRldGhyZXNob2xkKQorCQkJCXByaXYtPkNvbnRpdW5lRGlmZkNvdW50Kys7CisJCQllbHNlCisJCQkJcHJpdi0+Q29udGl1bmVEaWZmQ291bnQgPSAwOworCisJCQlpZiAocHJpdi0+Q29udGl1bmVEaWZmQ291bnQgPj0gMikgeworCQkJCWJTd2l0Y2hGcm9tQ291bnREaWZmID0gdHJ1ZTsKKwkJCQlwcml2LT5Db250aXVuZURpZmZDb3VudCA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwcml2LT5Db250aXVuZURpZmZDb3VudCA9IDA7CisJCX0KKworCQlpZiAocmF0ZV9jb3VudF9kaWZmIDw9CisJCSAgICBwcml2LT5ydGxsaWItPmZzeW5jX2ZpcnN0ZGlmZl9yYXRldGhyZXNob2xkKSB7CisJCQliU3dpdGNoRnJvbUNvdW50RGlmZiA9IHRydWU7CisJCQlwcml2LT5Db250aXVuZURpZmZDb3VudCA9IDA7CisJCX0KKwkJcHJpdi0+cmF0ZV9yZWNvcmQgPSByYXRlX2NvdW50OworCQlwcml2LT5yYXRlQ291bnREaWZmUmVjb3JkID0gcmF0ZV9jb3VudF9kaWZmOworCQlSVF9UUkFDRShDT01QX0hBTERNLCAicmF0ZVJlY29yZCAlZCByYXRlQ291bnQgJWQsIHJhdGUiCisJCQkgIkNvdW50ZGlmZiAlZCBiU3dpdGNoRnN5bmMgJWRcbiIsIHByaXYtPnJhdGVfcmVjb3JkLAorCQkJIHJhdGVfY291bnQsIHJhdGVfY291bnRfZGlmZiwgcHJpdi0+YnN3aXRjaF9mc3luYyk7CisJCWlmIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID4KKwkJICAgIHByaXYtPnJ0bGxpYi0+ZnN5bmNfcnNzaV90aHJlc2hvbGQgJiYKKwkJICAgIGJTd2l0Y2hGcm9tQ291bnREaWZmKSB7CisJCQliRG91YmxlVGltZUludGVydmFsID0gdHJ1ZTsKKwkJCXByaXYtPmJzd2l0Y2hfZnN5bmMgPSAhcHJpdi0+YnN3aXRjaF9mc3luYzsKKwkJCWlmIChwcml2LT5ic3dpdGNoX2ZzeW5jKSB7CisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweEMzNiwgMHgxYyk7CisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweEMzZSwgMHg5MCk7CisJCQl9IGVsc2UgeworCQkJCXdyaXRlX25pY19ieXRlKGRldiwgMHhDMzYsIDB4NWMpOworCQkJCXdyaXRlX25pY19ieXRlKGRldiwgMHhDM2UsIDB4OTYpOworCQkJfQorCQl9IGVsc2UgaWYgKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPD0KKwkJCSAgIHByaXYtPnJ0bGxpYi0+ZnN5bmNfcnNzaV90aHJlc2hvbGQpIHsKKwkJCWlmIChwcml2LT5ic3dpdGNoX2ZzeW5jKSB7CisJCQkJcHJpdi0+YnN3aXRjaF9mc3luYyAgPSBmYWxzZTsKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4QzM2LCAweDVjKTsKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4QzNlLCAweDk2KTsKKwkJCX0KKwkJfQorCQlpZiAoYkRvdWJsZVRpbWVJbnRlcnZhbCkgeworCQkJaWYgKHRpbWVyX3BlbmRpbmcoJnByaXYtPmZzeW5jX3RpbWVyKSkKKwkJCQlkZWxfdGltZXJfc3luYygmcHJpdi0+ZnN5bmNfdGltZXIpOworCQkJcHJpdi0+ZnN5bmNfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKworCQkJCSBNU0VDUyhwcml2LT5ydGxsaWItPmZzeW5jX3RpbWVfaW50ZXJ2YWwgKgorCQkJCSBwcml2LT5ydGxsaWItPmZzeW5jX211bHRpcGxlX3RpbWVpbnRlcnZhbCk7CisJCQlhZGRfdGltZXIoJnByaXYtPmZzeW5jX3RpbWVyKTsKKwkJfSBlbHNlIHsKKwkJCWlmICh0aW1lcl9wZW5kaW5nKCZwcml2LT5mc3luY190aW1lcikpCisJCQkJZGVsX3RpbWVyX3N5bmMoJnByaXYtPmZzeW5jX3RpbWVyKTsKKwkJCXByaXYtPmZzeW5jX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsKKwkJCQkgTVNFQ1MocHJpdi0+cnRsbGliLT5mc3luY190aW1lX2ludGVydmFsKTsKKwkJCWFkZF90aW1lcigmcHJpdi0+ZnN5bmNfdGltZXIpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHByaXYtPmJzd2l0Y2hfZnN5bmMpIHsKKwkJCXByaXYtPmJzd2l0Y2hfZnN5bmMgID0gZmFsc2U7CisJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4QzM2LCAweDVjKTsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgMHhDM2UsIDB4OTYpOworCQl9CisJCXByaXYtPkNvbnRpdW5lRGlmZkNvdW50ID0gMDsKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IyLCAweDQ2NWM1MmNkKTsKKwl9CisJUlRfVFJBQ0UoQ09NUF9IQUxETSwgIkNvbnRpdW5lRGlmZkNvdW50ICVkXG4iLCBwcml2LT5Db250aXVuZURpZmZDb3VudCk7CisJUlRfVFJBQ0UoQ09NUF9IQUxETSwgInJhdGVSZWNvcmQgJWQgcmF0ZUNvdW50ICVkLCByYXRlQ291bnRkaWZmICVkICIKKwkJICJiU3dpdGNoRnN5bmMgJWRcbiIsIHByaXYtPnJhdGVfcmVjb3JkLCByYXRlX2NvdW50LAorCQkgcmF0ZV9jb3VudF9kaWZmLCBwcml2LT5ic3dpdGNoX2ZzeW5jKTsKK30KKworc3RhdGljIHZvaWQgZG1fU3RhcnRIV0ZzeW5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTggcmZfdGltaW5nID0gMHg3NzsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJUlRfVFJBQ0UoQ09NUF9IQUxETSwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJd3JpdGVfbmljX2R3b3JkKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IyLCAweDQ2NWMxMmNmKTsKKwlwcml2LT5ydGxsaWItPlNldEh3UmVnSGFuZGxlcihkZXYsIEhXX1ZBUl9SRl9USU1JTkcsCisJCQkJICAgICAgKHU4ICopKCZyZl90aW1pbmcpKTsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4YzNiLCAweDQxKTsKK30KKworc3RhdGljIHZvaWQgZG1fRW5kSFdGc3luYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXU4IHJmX3RpbWluZyA9IDB4YWE7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCVJUX1RSQUNFKENPTVBfSEFMRE0sICIlc1xuIiwgX19mdW5jX18pOworCXdyaXRlX25pY19kd29yZChkZXYsIHJPRkRNMF9SeERldGVjdG9yMiwgMHg0NjVjNTJjZCk7CisJcHJpdi0+cnRsbGliLT5TZXRId1JlZ0hhbmRsZXIoZGV2LCBIV19WQVJfUkZfVElNSU5HLCAodTggKikKKwkJCQkgICAgICgmcmZfdGltaW5nKSk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCAweGMzYiwgMHg0OSk7Cit9CisKK3N0YXRpYyB2b2lkIGRtX0VuZFNXRnN5bmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisKKwlSVF9UUkFDRShDT01QX0hBTERNLCAiJXNcbiIsIF9fZnVuY19fKTsKKwlkZWxfdGltZXJfc3luYygmKHByaXYtPmZzeW5jX3RpbWVyKSk7CisKKwlpZiAocHJpdi0+YnN3aXRjaF9mc3luYykgeworCQlwcml2LT5ic3dpdGNoX2ZzeW5jICA9IGZhbHNlOworCisJCXdyaXRlX25pY19ieXRlKGRldiwgMHhDMzYsIDB4NWMpOworCisJCXdyaXRlX25pY19ieXRlKGRldiwgMHhDM2UsIDB4OTYpOworCX0KKworCXByaXYtPkNvbnRpdW5lRGlmZkNvdW50ID0gMDsKKwl3cml0ZV9uaWNfZHdvcmQoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjIsIDB4NDY1YzUyY2QpOworfQorCitzdGF0aWMgdm9pZCBkbV9TdGFydFNXRnN5bmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJdTMyCQkJcmF0ZUluZGV4OworCXUzMgkJCXJhdGVCaXRtYXA7CisKKwlSVF9UUkFDRShDT01QX0hBTERNLCAiJXNcbiIsIF9fZnVuY19fKTsKKwlwcml2LT5yYXRlX3JlY29yZCA9IDA7CisJcHJpdi0+Q29udGl1bmVEaWZmQ291bnQgPSAwOworCXByaXYtPnJhdGVDb3VudERpZmZSZWNvcmQgPSAwOworCXByaXYtPmJzd2l0Y2hfZnN5bmMgID0gZmFsc2U7CisKKwlpZiAocHJpdi0+cnRsbGliLT5tb2RlID09IFdJUkVMRVNTX01PREVfTl8yNEcpIHsKKwkJcHJpdi0+cnRsbGliLT5mc3luY19maXJzdGRpZmZfcmF0ZXRocmVzaG9sZCA9IDYwMDsKKwkJcHJpdi0+cnRsbGliLT5mc3luY19zZWNvbmRkaWZmX3JhdGV0aHJlc2hvbGQgPSAweGZmZmY7CisJfSBlbHNlIHsKKwkJcHJpdi0+cnRsbGliLT5mc3luY19maXJzdGRpZmZfcmF0ZXRocmVzaG9sZCA9IDIwMDsKKwkJcHJpdi0+cnRsbGliLT5mc3luY19zZWNvbmRkaWZmX3JhdGV0aHJlc2hvbGQgPSAyMDA7CisJfQorCWZvciAocmF0ZUluZGV4ID0gMDsgcmF0ZUluZGV4IDw9IDI3OyByYXRlSW5kZXgrKykgeworCQlyYXRlQml0bWFwICA9IDEgPDwgcmF0ZUluZGV4OworCQlpZiAocHJpdi0+cnRsbGliLT5mc3luY19yYXRlX2JpdG1hcCAmIHJhdGVCaXRtYXApCisJCQlwcml2LT5yYXRlX3JlY29yZCArPQorCQkJCSBwcml2LT5zdGF0cy5yZWNlaXZlZF9yYXRlX2hpc3RvZ3JhbVsxXQorCQkJCVtyYXRlSW5kZXhdOworCX0KKwlpZiAodGltZXJfcGVuZGluZygmcHJpdi0+ZnN5bmNfdGltZXIpKQorCQlkZWxfdGltZXJfc3luYygmcHJpdi0+ZnN5bmNfdGltZXIpOworCXByaXYtPmZzeW5jX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsKKwkJCQkgICAgTVNFQ1MocHJpdi0+cnRsbGliLT5mc3luY190aW1lX2ludGVydmFsKTsKKwlhZGRfdGltZXIoJnByaXYtPmZzeW5jX3RpbWVyKTsKKworCXdyaXRlX25pY19kd29yZChkZXYsIHJPRkRNMF9SeERldGVjdG9yMiwgMHg0NjVjMTJjZCk7CisKK30KKwordm9pZCBkbV9jaGVja19mc3luYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworI2RlZmluZQlSZWdDMzhfRGVmYXVsdAkJCTAKKyNkZWZpbmUJUmVnQzM4X05vbkZzeW5jX090aGVyX0FQCTEKKyNkZWZpbmUJUmVnQzM4X0ZzeW5jX0FQX0JDTQkJMgorCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlzdGF0aWMgdTggcmVnX2MzOF9TdGF0ZSA9IFJlZ0MzOF9EZWZhdWx0OworCXN0YXRpYyB1MzIgcmVzZXRfY250OworCisJUlRfVFJBQ0UoQ09NUF9IQUxETSwgIlJTU0kgJWQgVGltZUludGVydmFsICVkIE11bHRpcGxlVGltZUludGVydmFsICIKKwkJICIlZFxuIiwgcHJpdi0+cnRsbGliLT5mc3luY19yc3NpX3RocmVzaG9sZCwKKwkJIHByaXYtPnJ0bGxpYi0+ZnN5bmNfdGltZV9pbnRlcnZhbCwKKwkJIHByaXYtPnJ0bGxpYi0+ZnN5bmNfbXVsdGlwbGVfdGltZWludGVydmFsKTsKKwlSVF9UUkFDRShDT01QX0hBTERNLCAiUmF0ZUJpdG1hcCAweCV4IEZpcnN0RGlmZlJhdGVUaHJlc2hvbGQgJWQgU2Vjb25kIgorCQkgIkRpZmZSYXRlVGhyZXNob2xkICVkXG4iLCBwcml2LT5ydGxsaWItPmZzeW5jX3JhdGVfYml0bWFwLAorCQkgcHJpdi0+cnRsbGliLT5mc3luY19maXJzdGRpZmZfcmF0ZXRocmVzaG9sZCwKKwkJIHByaXYtPnJ0bGxpYi0+ZnN5bmNfc2Vjb25kZGlmZl9yYXRldGhyZXNob2xkKTsKKworCWlmIChwcml2LT5ydGxsaWItPnN0YXRlID09IFJUTExJQl9MSU5LRUQgJiYKKwkgICAgcHJpdi0+cnRsbGliLT5wSFRJbmZvLT5JT1RQZWVyID09IEhUX0lPVF9QRUVSX0JST0FEQ09NKSB7CisJCWlmIChwcml2LT5ydGxsaWItPmJmc3luY19lbmFibGUgPT0gMCkgeworCQkJc3dpdGNoIChwcml2LT5ydGxsaWItPmZzeW5jX3N0YXRlKSB7CisJCQljYXNlIERlZmF1bHRfRnN5bmM6CisJCQkJZG1fU3RhcnRIV0ZzeW5jKGRldik7CisJCQkJcHJpdi0+cnRsbGliLT5mc3luY19zdGF0ZSA9IEhXX0ZzeW5jOworCQkJCWJyZWFrOworCQkJY2FzZSBTV19Gc3luYzoKKwkJCQlkbV9FbmRTV0ZzeW5jKGRldik7CisJCQkJZG1fU3RhcnRIV0ZzeW5jKGRldik7CisJCQkJcHJpdi0+cnRsbGliLT5mc3luY19zdGF0ZSA9IEhXX0ZzeW5jOworCQkJCWJyZWFrOworCQkJY2FzZSBIV19Gc3luYzoKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKHByaXYtPnJ0bGxpYi0+ZnN5bmNfc3RhdGUpIHsKKwkJCWNhc2UgRGVmYXVsdF9Gc3luYzoKKwkJCQlkbV9TdGFydFNXRnN5bmMoZGV2KTsKKwkJCQlwcml2LT5ydGxsaWItPmZzeW5jX3N0YXRlID0gU1dfRnN5bmM7CisJCQkJYnJlYWs7CisJCQljYXNlIEhXX0ZzeW5jOgorCQkJCWRtX0VuZEhXRnN5bmMoZGV2KTsKKwkJCQlkbV9TdGFydFNXRnN5bmMoZGV2KTsKKwkJCQlwcml2LT5ydGxsaWItPmZzeW5jX3N0YXRlID0gU1dfRnN5bmM7CisJCQkJYnJlYWs7CisJCQljYXNlIFNXX0ZzeW5jOgorCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKworCQkJfQorCQl9CisJCWlmIChwcml2LT5mcmFtZXN5bmNNb25pdG9yKSB7CisJCQlpZiAocmVnX2MzOF9TdGF0ZSAhPSBSZWdDMzhfRnN5bmNfQVBfQkNNKSB7CisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjMsIDB4OTUpOworCisJCQkJcmVnX2MzOF9TdGF0ZSA9IFJlZ0MzOF9Gc3luY19BUF9CQ007CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKHByaXYtPnJ0bGxpYi0+ZnN5bmNfc3RhdGUpIHsKKwkJY2FzZSBIV19Gc3luYzoKKwkJCWRtX0VuZEhXRnN5bmMoZGV2KTsKKwkJCXByaXYtPnJ0bGxpYi0+ZnN5bmNfc3RhdGUgPSBEZWZhdWx0X0ZzeW5jOworCQkJYnJlYWs7CisJCWNhc2UgU1dfRnN5bmM6CisJCQlkbV9FbmRTV0ZzeW5jKGRldik7CisJCQlwcml2LT5ydGxsaWItPmZzeW5jX3N0YXRlID0gRGVmYXVsdF9Gc3luYzsKKwkJCWJyZWFrOworCQljYXNlIERlZmF1bHRfRnN5bmM6CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWlmIChwcml2LT5mcmFtZXN5bmNNb25pdG9yKSB7CisJCQlpZiAocHJpdi0+cnRsbGliLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEKSB7CisJCQkJaWYgKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPD0KKwkJCQkgICAgUmVnQzM4X1RIKSB7CisJCQkJCWlmIChyZWdfYzM4X1N0YXRlICE9CisJCQkJCSAgICBSZWdDMzhfTm9uRnN5bmNfT3RoZXJfQVApIHsKKwkJCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsCisJCQkJCQkJICAgIHJPRkRNMF9SeERldGVjdG9yMywKKwkJCQkJCQkgICAgMHg5MCk7CisKKwkJCQkJCXJlZ19jMzhfU3RhdGUgPQorCQkJCQkJICAgICBSZWdDMzhfTm9uRnN5bmNfT3RoZXJfQVA7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0KKwkJCQkJICAgKFJlZ0MzOF9USCs1KSkgeworCQkJCQlpZiAocmVnX2MzOF9TdGF0ZSkgeworCQkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LAorCQkJCQkJCXJPRkRNMF9SeERldGVjdG9yMywKKwkJCQkJCQlwcml2LT5mcmFtZXN5bmMpOworCQkJCQkJcmVnX2MzOF9TdGF0ZSA9IFJlZ0MzOF9EZWZhdWx0OworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAocmVnX2MzOF9TdGF0ZSkgeworCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIHJPRkRNMF9SeERldGVjdG9yMywKKwkJCQkJCSAgICAgICBwcml2LT5mcmFtZXN5bmMpOworCQkJCQlyZWdfYzM4X1N0YXRlID0gUmVnQzM4X0RlZmF1bHQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmIChwcml2LT5mcmFtZXN5bmNNb25pdG9yKSB7CisJCWlmIChwcml2LT5yZXNldF9jb3VudCAhPSByZXNldF9jbnQpIHsKKwkJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1J4RGV0ZWN0b3IzLAorCQkJCSAgICAgICBwcml2LT5mcmFtZXN5bmMpOworCQkJcmVnX2MzOF9TdGF0ZSA9IFJlZ0MzOF9EZWZhdWx0OworCQkJcmVzZXRfY250ID0gcHJpdi0+cmVzZXRfY291bnQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocmVnX2MzOF9TdGF0ZSkgeworCQkJd3JpdGVfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjMsCisJCQkJICAgICAgIHByaXYtPmZyYW1lc3luYyk7CisJCQlyZWdfYzM4X1N0YXRlID0gUmVnQzM4X0RlZmF1bHQ7CisJCX0KKwl9Cit9CisKK3ZvaWQgZG1fc2hhZG93X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwl1OAlwYWdlOworCXUxNglvZmZzZXQ7CisKKwlmb3IgKHBhZ2UgPSAwOyBwYWdlIDwgNTsgcGFnZSsrKQorCQlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IDI1Njsgb2Zmc2V0KyspCisJCQlkbV9zaGFkb3dbcGFnZV1bb2Zmc2V0XSA9IHJlYWRfbmljX2J5dGUoZGV2LAorCQkJCQkJICBvZmZzZXQrcGFnZSAqIDI1Nik7CisKKwlmb3IgKHBhZ2UgPSA4OyBwYWdlIDwgMTE7IHBhZ2UrKykKKwkJZm9yIChvZmZzZXQgPSAwOyBvZmZzZXQgPCAyNTY7IG9mZnNldCsrKQorCQkJZG1fc2hhZG93W3BhZ2VdW29mZnNldF0gPSByZWFkX25pY19ieXRlKGRldiwKKwkJCQkJCSAgb2Zmc2V0K3BhZ2UgKiAyNTYpOworCisJZm9yIChwYWdlID0gMTI7IHBhZ2UgPCAxNTsgcGFnZSsrKQorCQlmb3IgKG9mZnNldCA9IDA7IG9mZnNldCA8IDI1Njsgb2Zmc2V0KyspCisJCQlkbV9zaGFkb3dbcGFnZV1bb2Zmc2V0XSA9IHJlYWRfbmljX2J5dGUoZGV2LAorCQkJCQkJICBvZmZzZXQrcGFnZSoyNTYpOworCit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIGZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBkbV9pbml0X2R5bmFtaWNfdHhwb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCXByaXYtPnJ0bGxpYi0+YmR5bmFtaWNfdHhwb3dlcl9lbmFibGUgPSB0cnVlOworCXByaXYtPmJMYXN0RFRQRmxhZ19IaWdoID0gZmFsc2U7CisJcHJpdi0+Ykxhc3REVFBGbGFnX0xvdyA9IGZhbHNlOworCXByaXYtPmJEeW5hbWljVHhIaWdoUG93ZXIgPSBmYWxzZTsKKwlwcml2LT5iRHluYW1pY1R4TG93UG93ZXIgPSBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgZG1fZHluYW1pY190eHBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCB0eGhpcG93ZXJfdGhyZXNoaG9sZCA9IDA7CisJdW5zaWduZWQgaW50IHR4bG93cG93ZXJfdGhyZXNob2xkID0gMDsKKwlpZiAocHJpdi0+cnRsbGliLT5iZHluYW1pY190eHBvd2VyX2VuYWJsZSAhPSB0cnVlKSB7CisJCXByaXYtPmJEeW5hbWljVHhIaWdoUG93ZXIgPSBmYWxzZTsKKwkJcHJpdi0+YkR5bmFtaWNUeExvd1Bvd2VyID0gZmFsc2U7CisJCXJldHVybjsKKwl9CisJaWYgKChwcml2LT5ydGxsaWItPnBIVEluZm8tPklPVFBlZXIgPT0gSFRfSU9UX1BFRVJfQVRIRVJPUykgJiYKKwkgICAgKHByaXYtPnJ0bGxpYi0+bW9kZSA9PSBJRUVFX0cpKSB7CisJCXR4aGlwb3dlcl90aHJlc2hob2xkID0gVFhfUE9XRVJfQVRIRVJPQVBfVEhSRVNIX0hJR0g7CisJCXR4bG93cG93ZXJfdGhyZXNob2xkID0gVFhfUE9XRVJfQVRIRVJPQVBfVEhSRVNIX0xPVzsKKwl9IGVsc2UgeworCQl0eGhpcG93ZXJfdGhyZXNoaG9sZCA9IFRYX1BPV0VSX05FQVJfRklFTERfVEhSRVNIX0hJR0g7CisJCXR4bG93cG93ZXJfdGhyZXNob2xkID0gVFhfUE9XRVJfTkVBUl9GSUVMRF9USFJFU0hfTE9XOworCX0KKworCVJUX1RSQUNFKENPTVBfVFhBR0MsICJwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID0gJWxkXG4iLAorCQkgcHJpdi0+dW5kZWNvcmF0ZWRfc21vb3RoZWRfcHdkYik7CisKKwlpZiAocHJpdi0+cnRsbGliLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEKSB7CisJCWlmIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IHR4aGlwb3dlcl90aHJlc2hob2xkKSB7CisJCQlwcml2LT5iRHluYW1pY1R4SGlnaFBvd2VyID0gdHJ1ZTsKKwkJCXByaXYtPmJEeW5hbWljVHhMb3dQb3dlciA9IGZhbHNlOworCQl9IGVsc2UgeworCQkJaWYgKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPAorCQkJICAgIHR4bG93cG93ZXJfdGhyZXNob2xkICYmCisJCQkgICAgcHJpdi0+YkR5bmFtaWNUeEhpZ2hQb3dlciA9PSB0cnVlKQorCQkJCXByaXYtPmJEeW5hbWljVHhIaWdoUG93ZXIgPSBmYWxzZTsKKwkJCWlmIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDwgMzUpCisJCQkJcHJpdi0+YkR5bmFtaWNUeExvd1Bvd2VyID0gdHJ1ZTsKKwkJCWVsc2UgaWYgKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gNDApCisJCQkJcHJpdi0+YkR5bmFtaWNUeExvd1Bvd2VyID0gZmFsc2U7CisJCX0KKwl9IGVsc2UgeworCQlwcml2LT5iRHluYW1pY1R4SGlnaFBvd2VyID0gZmFsc2U7CisJCXByaXYtPmJEeW5hbWljVHhMb3dQb3dlciA9IGZhbHNlOworCX0KKworCWlmICgocHJpdi0+YkR5bmFtaWNUeEhpZ2hQb3dlciAhPSBwcml2LT5iTGFzdERUUEZsYWdfSGlnaCkgfHwKKwkgICAgKHByaXYtPmJEeW5hbWljVHhMb3dQb3dlciAhPSBwcml2LT5iTGFzdERUUEZsYWdfTG93KSkgeworCQlSVF9UUkFDRShDT01QX1RYQUdDLCAiU2V0VHhQb3dlckxldmVsODE5MCgpICBjaGFubmVsID0gJWRcbiIsCisJCQkgcHJpdi0+cnRsbGliLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisKKwkJcnRsODE5Ml9waHlfc2V0VHhQb3dlcihkZXYsCisJCQkJIHByaXYtPnJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOworCX0KKwlwcml2LT5iTGFzdERUUEZsYWdfSGlnaCA9IHByaXYtPmJEeW5hbWljVHhIaWdoUG93ZXI7CisJcHJpdi0+Ykxhc3REVFBGbGFnX0xvdyA9IHByaXYtPmJEeW5hbWljVHhMb3dQb3dlcjsKKworfQorCitzdGF0aWMgdm9pZCBkbV9jaGVja190eHJhdGVhbmRyZXRyeWNvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gcHJpdi0+cnRsbGliOworCisJaWVlZS0+c29mdG1hY19zdGF0cy5DdXJyZW50U2hvd1R4YXRlID0gcmVhZF9uaWNfYnl0ZShkZXYsCisJCQkJCQkgQ3VycmVudF9UeF9SYXRlX1JlZyk7CisKKwlpZWVlLT5zb2Z0bWFjX3N0YXRzLmxhc3RfcGFja2V0X3JhdGUgPSByZWFkX25pY19ieXRlKGRldiwKKwkJCQkJCSBJbml0aWFsX1R4X1JhdGVfUmVnKTsKKworCWllZWUtPnNvZnRtYWNfc3RhdHMudHhyZXRyeWNvdW50ID0gcmVhZF9uaWNfZHdvcmQoZGV2LAorCQkJCQkJIFR4X1JldHJ5X0NvdW50X1JlZyk7Cit9CisKK3N0YXRpYyB2b2lkIGRtX3NlbmRfcnNzaV90b2Z3KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJd3JpdGVfbmljX2J5dGUoZGV2LCBEUklWRVJfUlNTSSwgKHU4KXByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9kbS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9kbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNDRhOWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsX2RtLmgKQEAgLTAsMCArMSwzMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmCV9fUjgxOTJVRE1fSF9fCisjZGVmaW5lIF9fUjgxOTJVRE1fSF9fCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBQYXJhbWV0ZXJzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lCQkJT0ZETV9UYWJsZV9MZW5ndGgJMTkKKyNkZWZpbmUJCUNDS19UYWJsZV9sZW5ndGgJMTIKKworI2RlZmluZQkJRE1fRElHX1RIUkVTSF9ISUdICQkJCQk0MAorI2RlZmluZQkJRE1fRElHX1RIUkVTSF9MT1cJCQkJCTM1CisKKyNkZWZpbmUJCURNX0ZBTFNFQUxBUk1fVEhSRVNIX0xPVwk0MAorI2RlZmluZQkJRE1fRkFMU0VBTEFSTV9USFJFU0hfSElHSAkxMDAwCisKKyNkZWZpbmUJCURNX0RJR19ISUdIX1BXUl9USFJFU0hfSElHSAkJNzUKKyNkZWZpbmUJCURNX0RJR19ISUdIX1BXUl9USFJFU0hfTE9XCQk3MAorCisjZGVmaW5lCQlCV19BVVRPX1NXSVRDSF9ISUdIX0xPVwkJCTI1CisjZGVmaW5lCQlCV19BVVRPX1NXSVRDSF9MT1dfSElHSAkJCTMwCisKKyNkZWZpbmUJCURNX2NoZWNrX2ZzeW5jX3RpbWVfaW50ZXJ2YWwJCQkJNTAwCisKKworI2RlZmluZQkJRE1fRElHX0JBQ0tPRkYJCQkJMTIKKyNkZWZpbmUJCURNX0RJR19NQVgJCQkJCTB4MzYKKyNkZWZpbmUJCURNX0RJR19NSU4JCQkJCTB4MWMKKyNkZWZpbmUJCURNX0RJR19NSU5fTmV0Y29yZQkJCTB4MTIKKworI2RlZmluZQkJRE1fRElHX0JBQ0tPRkZfTUFYCQkJMTIKKyNkZWZpbmUJCURNX0RJR19CQUNLT0ZGX01JTgkJCS00CisKKyNkZWZpbmUJCVJ4UGF0aFNlbGVjdGlvbl9TU19USF9sb3cJCTMwCisjZGVmaW5lCQlSeFBhdGhTZWxlY3Rpb25fZGlmZl9USAkJCTE4CisKKyNkZWZpbmUJCVJhdGVBZGFwdGl2ZVRIX0hpZ2gJCQk1MAorI2RlZmluZQkJUmF0ZUFkYXB0aXZlVEhfTG93XzIwTQkJMzAKKyNkZWZpbmUJCVJhdGVBZGFwdGl2ZVRIX0xvd180ME0JCTEwCisjZGVmaW5lCQlWZXJ5TG93UlNTSQkJCQkJMTUKKworI2RlZmluZQkJQ1RTVG9TZWxmVEhWYWwJCQkJCTM1CisKKyNkZWZpbmUJCVdBSW90VEhWYWwJCQkJCQkyNQorCisjZGVmaW5lCQlFX0ZPUl9UWF9QT1dFUl9UUkFDSwkgICAgICAgMzAwCisjZGVmaW5lCQlUWF9QT1dFUl9ORUFSX0ZJRUxEX1RIUkVTSF9ISUdICQk2OAorI2RlZmluZQkJVFhfUE9XRVJfTkVBUl9GSUVMRF9USFJFU0hfTE9XCQk2MgorI2RlZmluZQkgVFhfUE9XRVJfQVRIRVJPQVBfVEhSRVNIX0hJR0gJICAgNzgKKyNkZWZpbmUJCVRYX1BPV0VSX0FUSEVST0FQX1RIUkVTSF9MT1cJCTcyCisKKyNkZWZpbmUJCQlDdXJyZW50X1R4X1JhdGVfUmVnCSAweDFlMAorI2RlZmluZQkJCUluaXRpYWxfVHhfUmF0ZV9SZWcJIDB4MWUxCisjZGVmaW5lCQkJVHhfUmV0cnlfQ291bnRfUmVnCSAweDFhYworI2RlZmluZQkJUmVnQzM4X1RICQkJCSAyMAorCisjZGVmaW5lCQlUWF9QT1dFUl9ORUFSX0ZJRUxEX1RIUkVTSF9MVkwyCTc0CisjZGVmaW5lCQlUWF9QT1dFUl9ORUFSX0ZJRUxEX1RIUkVTSF9MVkwxCTY3CisKKyNkZWZpbmUJCVR4SGlnaFB3ckxldmVsX05vcm1hbAkJMAorI2RlZmluZQkJVHhIaWdoUHdyTGV2ZWxfTGV2ZWwxCQkxCisjZGVmaW5lCQlUeEhpZ2hQd3JMZXZlbF9MZXZlbDIJCTIKKworI2RlZmluZQkJRE1fVHlwZV9CeUZXCQkJMAorI2RlZmluZQkJRE1fVHlwZV9CeURyaXZlcgkJMQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIFBhcmFtZXRlcnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBzdHJ1Y3R1cmUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0cnVjdCBkaWdfdCB7CisJdTgJCWRpZ19lbmFibGVfZmxhZzsKKwl1OAkJZGlnX2FsZ29yaXRobTsKKwl1OAkJRGlnX1R3b1BvcnRfQWxnb3JpdGhtOworCXU4CQlEaWdfRXh0X1BvcnRfU3RhZ2U7CisJdTgJCWRiZ19tb2RlOworCXU4CQlkaWdfYWxnb3JpdGhtX3N3aXRjaDsKKworCWxvbmcJCXJzc2lfbG93X3RocmVzaDsKKwlsb25nCQlyc3NpX2hpZ2hfdGhyZXNoOworCisJdTMyCQlGQUxvd1RocmVzaDsKKwl1MzIJCUZBSGlnaFRocmVzaDsKKworCWxvbmcJCXJzc2lfaGlnaF9wb3dlcl9sb3d0aHJlc2g7CisJbG9uZwkJcnNzaV9oaWdoX3Bvd2VyX2hpZ2h0aHJlc2g7CisKKwl1OAkJZGlnX3N0YXRlOworCXU4CQlkaWdfaGlnaHB3cl9zdGF0ZTsKKwl1OAkJQ3VyU1RBQ29ubmVjdFN0YXRlOworCXU4CQlQcmVTVEFDb25uZWN0U3RhdGU7CisJdTgJCUN1ckFQQ29ubmVjdFN0YXRlOworCXU4CQlQcmVBUENvbm5lY3RTdGF0ZTsKKworCXU4CQljdXJwZF90aHN0YXRlOworCXU4CQlwcmVwZF90aHN0YXRlOworCXU4CQljdXJjc19yYXRpb19zdGF0ZTsKKwl1OAkJcHJlY3NfcmF0aW9fc3RhdGU7CisKKwl1MzIJCXByZV9pZ192YWx1ZTsKKwl1MzIJCWN1cl9pZ192YWx1ZTsKKworCXU4CQlCYWNrb2ZmX0VuYWJsZV9GbGFnOworCXU4CQliYWNrb2ZmX3ZhbDsKKwljaGFyCQlCYWNrb2ZmVmFsX3JhbmdlX21heDsKKwljaGFyCQlCYWNrb2ZmVmFsX3JhbmdlX21pbjsKKwl1OAkJcnhfZ2Fpbl9yYW5nZV9tYXg7CisJdTgJCXJ4X2dhaW5fcmFuZ2VfbWluOworCWJvb2wJCWluaXRpYWxnYWluX2xvd2VyYm91bmRfc3RhdGU7CisKKwlsb25nCQlyc3NpX3ZhbDsKK307CisKK2VudW0gZG1fZGlnX3N0YSB7CisJRE1fU1RBX0RJR19PRkYgPSAwLAorCURNX1NUQV9ESUdfT04sCisJRE1fU1RBX0RJR19NQVgKK307CisKKworZW51bSBkbV9yYXRyX3N0YSB7CisJRE1fUkFUUl9TVEFfSElHSCA9IDAsCisJRE1fUkFUUl9TVEFfTUlERExFID0gMSwKKwlETV9SQVRSX1NUQV9MT1cgPSAyLAorCURNX1JBVFJfU1RBX01BWAorfTsKKworZW51bSBkbV9kaWdfb3Bfc3RhIHsKKwlESUdfVFlQRV9USFJFU0hfSElHSAk9IDAsCisJRElHX1RZUEVfVEhSRVNIX0xPVwk9IDEsCisJRElHX1RZUEVfVEhSRVNIX0hJR0hQV1JfSElHSAk9IDIsCisJRElHX1RZUEVfVEhSRVNIX0hJR0hQV1JfTE9XCT0gMywKKwlESUdfVFlQRV9EQkdfTU9ERQkJCQk9IDQsCisJRElHX1RZUEVfUlNTSQkJCQkJCT0gNSwKKwlESUdfVFlQRV9BTEdPUklUSE0JCQkJPSA2LAorCURJR19UWVBFX0JBQ0tPRkYJCQkJCT0gNywKKwlESUdfVFlQRV9QV0RCX0ZBQ1RPUgkJCT0gOCwKKwlESUdfVFlQRV9SWF9HQUlOX01JTgkJCQk9IDksCisJRElHX1RZUEVfUlhfR0FJTl9NQVgJCQkJPSAxMCwKKwlESUdfVFlQRV9FTkFCTEUJCQk9IDIwLAorCURJR19UWVBFX0RJU0FCTEUJCT0gMzAsCisJRElHX09QX1RZUEVfTUFYCit9OworCitlbnVtIGRtX2RpZ19hbGcgeworCURJR19BTEdPX0JZX0ZBTFNFX0FMQVJNID0gMCwKKwlESUdfQUxHT19CWV9SU1NJCT0gMSwKKwlESUdfQUxHT19CRUZPUkVfQ09OTkVDVF9CWV9SU1NJX0FORF9BTEFSTSA9IDIsCisJRElHX0FMR09fQllfVE9XX1BPUlQgPSAzLAorCURJR19BTEdPX01BWAorfTsKKworZW51bSBkbV9kaWdfdHdvX3BvcnRfYWxnIHsKKwlESUdfVFdPX1BPUlRfQUxHT19SU1NJID0gMCwKKwlESUdfVFdPX1BPUlRfQUxHT19GQUxTRV9BTEFSTSA9IDEsCit9OworCisKK2VudW0gZG1fZGlnX2V4dF9wb3J0X2FsZyB7CisJRElHX0VYVF9QT1JUX1NUQUdFXzAgPSAwLAorCURJR19FWFRfUE9SVF9TVEFHRV8xID0gMSwKKwlESUdfRVhUX1BPUlRfU1RBR0VfMiA9IDIsCisJRElHX0VYVF9QT1JUX1NUQUdFXzMgPSAzLAorCURJR19FWFRfUE9SVF9TVEFHRV9NQVggPSA0LAorfTsKKworZW51bSBkbV9kaWdfZGJnIHsKKwlESUdfREJHX09GRiA9IDAsCisJRElHX0RCR19PTiA9IDEsCisJRElHX0RCR19NQVgKK307CisKK2VudW0gZG1fZGlnX2Nvbm5lY3QgeworCURJR19TVEFfRElTQ09OTkVDVCA9IDAsCisJRElHX1NUQV9DT05ORUNUID0gMSwKKwlESUdfU1RBX0JFRk9SRV9DT05ORUNUID0gMiwKKwlESUdfQVBfRElTQ09OTkVDVCA9IDMsCisJRElHX0FQX0NPTk5FQ1QgPSA0LAorCURJR19BUF9BRERfU1RBVElPTiA9IDUsCisJRElHX0NPTk5FQ1RfTUFYCit9OworCitlbnVtIGRtX2RpZ19wZF90aCB7CisJRElHX1BEX0FUX0xPV19QT1dFUiA9IDAsCisJRElHX1BEX0FUX05PUk1BTF9QT1dFUiA9IDEsCisJRElHX1BEX0FUX0hJR0hfUE9XRVIgPSAyLAorCURJR19QRF9NQVgKK307CisKK2VudW0gZG1fZGlnX2NzX3JhdGlvIHsKKwlESUdfQ1NfUkFUSU9fTE9XRVIgPSAwLAorCURJR19DU19SQVRJT19ISUdIRVIgPSAxLAorCURJR19DU19NQVgKK307CisKK3N0cnVjdCBkcnhfcGF0aF9zZWwgeworCXU4CQlFbmFibGU7CisJdTgJCURiZ01vZGU7CisJdTgJCWNja19tZXRob2Q7CisJdTgJCWNja19SeF9wYXRoOworCisJdTgJCVNTX1RIX2xvdzsKKwl1OAkJZGlmZl9USDsKKwl1OAkJZGlzYWJsZWRSRjsKKwl1OAkJcmVzZXJ2ZWQ7CisKKwl1OAkJcmZfcnNzaVs0XTsKKwl1OAkJcmZfZW5hYmxlX3Jzc2lfdGhbNF07CisJbG9uZwkJY2NrX3B3ZGJfc3RhWzRdOworfTsKKworZW51bSBkbV9jY2tfcnhfcGF0aF9tZXRob2QgeworCUNDS19SeF9WZXJzaW9uXzEgPSAwLAorCUNDS19SeF9WZXJzaW9uXzIgPSAxLAorCUNDS19SeF9WZXJzaW9uX01BWAorfTsKKworCitlbnVtIGRtX2RiZyB7CisJRE1fREJHX09GRiA9IDAsCisJRE1fREJHX09OID0gMSwKKwlETV9EQkdfTUFYCit9OworCitzdHJ1Y3QgZGNtZF90eGNtZCB7CisJdTMyCU9wOworCXUzMglMZW5ndGg7CisJdTMyCVZhbHVlOworfTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIHN0cnVjdHVyZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IGdsb2JhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuCXN0cnVjdCBkaWdfdCBkbV9kaWd0YWJsZTsKK2V4dGVybgl1OAkJZG1fc2hhZG93WzE2XVsyNTZdOworZXh0ZXJuIHN0cnVjdCBkcnhfcGF0aF9zZWwgRE1fUnhQYXRoU2VsVGFibGU7CisKK2V4dGVybgl1OAkJCXRlc3RfZmxhZzsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IGdsb2JhbCB2YXJpYWJsZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0IE1hcmNvIERlZmluaXRpb24tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBETV9BUEluaXRHYWluQ2hhbmdlTm90aWZ5KEV2ZW50KQkJXAorCXsJCQkJCQlcCisJCWRtX2RpZ3RhYmxlLkN1ckFQQ29ubmVjdFN0YXRlID0gRXZlbnQ7CVwKKwl9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBNYXJjbyBEZWZpbml0aW9uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0ZWQgRnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnRlZCBGdW5jdGlvbiBwcm90b3R5cGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworZXh0ZXJuICB2b2lkICAgIGluaXRfaGFsX2RtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuICB2b2lkIGRlaW5pdF9oYWxfZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK2V4dGVybiB2b2lkIGhhbF9kbV93YXRjaGRvZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCitleHRlcm4gIHZvaWQgICAgaW5pdF9yYXRlX2FkYXB0aXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuICB2b2lkICAgIGRtX3R4cG93ZXJfdHJhY2tpbmdjYWxsYmFjayh2b2lkICpkYXRhKTsKKworZXh0ZXJuICB2b2lkIGRtX2Nja190eHBvd2VyX2FkanVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBib29sIGJpbmNoMTQpOworCitleHRlcm4gIHZvaWQgICAgZG1fcmVzdG9yZV9keW5hbWljX21lY2hhbmlzbV9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiAgdm9pZCAgICBkbV9iYWNrdXBfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gIHZvaWQgICAgZG1fY2hhbmdlX2R5bmFtaWNfaW5pdGdhaW5fdGhyZXNoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCXUzMgkgICAgIGRtX3R5cGUsCisJCQkJCXUzMgkgICAgIGRtX3ZhbHVlKTsKK2V4dGVybiAgdm9pZCAgICBETV9DaGFuZ2VGc3luY1NldHRpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJczMyCSAgICAgRE1fVHlwZSwKKwkJCQkJczMyCSAgICAgRE1fVmFsdWUpOworZXh0ZXJuICB2b2lkIGRtX2ZvcmNlX3R4X2Z3X2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJdTMyCSAgICAgZm9yY2VfdHlwZSwKKwkJCQkJdTMyCSAgICAgZm9yY2VfdmFsdWUpOworZXh0ZXJuICB2b2lkICAgIGRtX2luaXRfZWRjYV90dXJibyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiAgdm9pZCAgICBkbV9yZl9vcGVyYXRpb25fdGVzdF9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpOworZXh0ZXJuICB2b2lkICAgIGRtX3JmX3BhdGhjaGVja193b3JraXRlbWNhbGxiYWNrKHZvaWQgKmRhdGEpOworZXh0ZXJuICB2b2lkIGRtX2ZzeW5jX3RpbWVyX2NhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7CitleHRlcm4gIHZvaWQgZG1fY2hlY2tfZnN5bmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gIHZvaWQgICAgZG1fc2hhZG93X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gIHZvaWQgZG1faW5pdGlhbGl6ZV90eHBvd2VyX3RyYWNraW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuICB2b2lkICAgIGRtX0NoZWNrUmZDdHJsR1BJTyh2b2lkICpkYXRhKTsKK2V4dGVybiB2b2lkIGRtX0luaXRSYXRlQWRhcHRpdmVNYXNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuCXZvaWQJaW5pdF9oYWxfZG0oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4Jdm9pZCBkZWluaXRfaGFsX2RtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgaGFsX2RtX3dhdGNoZG9nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuCXZvaWQJaW5pdF9yYXRlX2FkYXB0aXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuCXZvaWQJZG1fdHhwb3dlcl90cmFja2luZ2NhbGxiYWNrKHZvaWQgKmRhdGEpOworZXh0ZXJuCXZvaWQJZG1fcmVzdG9yZV9keW5hbWljX21lY2hhbmlzbV9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybgl2b2lkCWRtX2JhY2t1cF9keW5hbWljX21lY2hhbmlzbV9zdGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybgl2b2lkCWRtX2NoYW5nZV9keW5hbWljX2luaXRnYWluX3RocmVzaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQl1MzIJZG1fdHlwZSwKKwkJCQkJdTMyCWRtX3ZhbHVlKTsKK2V4dGVybgl2b2lkCURNX0NoYW5nZUZzeW5jU2V0dGluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQlzMzIJCURNX1R5cGUsCisJCQkJCXMzMgkJRE1fVmFsdWUpOworZXh0ZXJuCXZvaWQgZG1fZm9yY2VfdHhfZndfaW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQl1MzIJCWZvcmNlX3R5cGUsCisJCQkJCXUzMgkJZm9yY2VfdmFsdWUpOworZXh0ZXJuCXZvaWQJZG1faW5pdF9lZGNhX3R1cmJvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuCXZvaWQJZG1fcmZfb3BlcmF0aW9uX3Rlc3RfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKTsKK2V4dGVybgl2b2lkCWRtX3JmX3BhdGhjaGVja193b3JraXRlbWNhbGxiYWNrKHZvaWQgKmRhdGEpOworZXh0ZXJuCXZvaWQgZG1fZnN5bmNfdGltZXJfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKTsKK2V4dGVybgl2b2lkIGRtX2NoZWNrX2ZzeW5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuCXZvaWQJZG1fc2hhZG93X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4Jdm9pZCBkbV9pbml0aWFsaXplX3R4cG93ZXJfdHJhY2tpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gIHZvaWQgICAgZG1fQ2hlY2tSZkN0cmxHUElPKHZvaWQgKmRhdGEpOworCisjZW5kaWYJLypfX1I4MTkyVURNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9lZXByb20uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxfZWVwcm9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFjY2ZmNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxfZWVwcm9tLmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEJhc2VkIG9uIHRoZSByODE4MCBkcml2ZXIsIHdoaWNoIGlzOgorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+LCBldCBhbC4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJydGxfY29yZS5oIgorI2luY2x1ZGUgInJ0bF9lZXByb20uaCIKKworc3RhdGljIHZvaWQgZXByb21fY3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgYml0KQoreworCWlmIChiaXQpCisJCXdyaXRlX25pY19ieXRlKGRldiwgRVBST01fQ01ELAorCQkJICAgICAgICgxIDw8IEVQUk9NX0NTX1NISUZUKSB8CisJCQkgICAgICAgcmVhZF9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCkpOworCWVsc2UKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQsIHJlYWRfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQpCisJCQkgICAgICAgJiB+KDE8PEVQUk9NX0NTX1NISUZUKSk7CisKKwl1ZGVsYXkoRVBST01fREVMQVkpOworfQorCisKK3N0YXRpYyB2b2lkIGVwcm9tX2NrX2N5Y2xlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQsCisJCSAgICAgICAoMTw8RVBST01fQ0tfU0hJRlQpIHwgcmVhZF9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCkpOworCXVkZWxheShFUFJPTV9ERUxBWSk7CisJd3JpdGVfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQsCisJCSAgICAgICByZWFkX25pY19ieXRlKGRldiwgRVBST01fQ01EKSAmIH4oMTw8RVBST01fQ0tfU0hJRlQpKTsKKwl1ZGVsYXkoRVBST01fREVMQVkpOworfQorCisKK3N0YXRpYyB2b2lkIGVwcm9tX3coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgYml0KQoreworCWlmIChiaXQpCisJCXdyaXRlX25pY19ieXRlKGRldiwgRVBST01fQ01ELCAoMTw8RVBST01fV19TSElGVCkgfAorCQkJICAgICAgIHJlYWRfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQpKTsKKwllbHNlCisJCXdyaXRlX25pY19ieXRlKGRldiwgRVBST01fQ01ELCByZWFkX25pY19ieXRlKGRldiwgRVBST01fQ01EKQorCQkJICAgICAgICYgfigxPDxFUFJPTV9XX1NISUZUKSk7CisKKwl1ZGVsYXkoRVBST01fREVMQVkpOworfQorCisKK3N0YXRpYyBzaG9ydCBlcHJvbV9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc2hvcnQgYml0OworCisJYml0ID0gKHJlYWRfbmljX2J5dGUoZGV2LCBFUFJPTV9DTUQpICYgKDE8PEVQUk9NX1JfU0hJRlQpKTsKKwl1ZGVsYXkoRVBST01fREVMQVkpOworCisJaWYgKGJpdCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVwcm9tX3NlbmRfYml0c19zdHJpbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc2hvcnQgYltdLCBpbnQgbGVuKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWVwcm9tX3coZGV2LCBiW2ldKTsKKwkJZXByb21fY2tfY3ljbGUoZGV2KTsKKwl9Cit9CisKK3UzMiBlcHJvbV9yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBhZGRyKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlzaG9ydCByZWFkX2NtZFtdID0gezEsIDEsIDB9OworCXNob3J0IGFkZHJfc3RyWzhdOworCWludCBpOworCWludCBhZGRyX2xlbjsKKwl1MzIgcmV0OworCisJcmV0ID0gMDsKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCwKKwkJICAgICAgIChFUFJPTV9DTURfUFJPR1JBTSA8PCBFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfU0hJRlQpKTsKKwl1ZGVsYXkoRVBST01fREVMQVkpOworCisJaWYgKHByaXYtPmVwcm9tdHlwZSA9PSBFRVBST01fOTNDNTYpIHsKKwkJYWRkcl9zdHJbN10gPSBhZGRyICYgMTsKKwkJYWRkcl9zdHJbNl0gPSBhZGRyICYgKDE8PDEpOworCQlhZGRyX3N0cls1XSA9IGFkZHIgJiAoMTw8Mik7CisJCWFkZHJfc3RyWzRdID0gYWRkciAmICgxPDwzKTsKKwkJYWRkcl9zdHJbM10gPSBhZGRyICYgKDE8PDQpOworCQlhZGRyX3N0clsyXSA9IGFkZHIgJiAoMTw8NSk7CisJCWFkZHJfc3RyWzFdID0gYWRkciAmICgxPDw2KTsKKwkJYWRkcl9zdHJbMF0gPSBhZGRyICYgKDE8PDcpOworCQlhZGRyX2xlbiA9IDg7CisJfSBlbHNlIHsKKwkJYWRkcl9zdHJbNV0gPSBhZGRyICYgMTsKKwkJYWRkcl9zdHJbNF0gPSBhZGRyICYgKDE8PDEpOworCQlhZGRyX3N0clszXSA9IGFkZHIgJiAoMTw8Mik7CisJCWFkZHJfc3RyWzJdID0gYWRkciAmICgxPDwzKTsKKwkJYWRkcl9zdHJbMV0gPSBhZGRyICYgKDE8PDQpOworCQlhZGRyX3N0clswXSA9IGFkZHIgJiAoMTw8NSk7CisJCWFkZHJfbGVuID0gNjsKKwl9CisJZXByb21fY3MoZGV2LCAxKTsKKwllcHJvbV9ja19jeWNsZShkZXYpOworCWVwcm9tX3NlbmRfYml0c19zdHJpbmcoZGV2LCByZWFkX2NtZCwgMyk7CisJZXByb21fc2VuZF9iaXRzX3N0cmluZyhkZXYsIGFkZHJfc3RyLCBhZGRyX2xlbik7CisKKwllcHJvbV93KGRldiwgMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQllcHJvbV9ja19jeWNsZShkZXYpOworCQlyZXQgfD0gKGVwcm9tX3IoZGV2KTw8KDE1LWkpKTsKKwl9CisKKwllcHJvbV9jcyhkZXYsIDApOworCWVwcm9tX2NrX2N5Y2xlKGRldik7CisKKwl3cml0ZV9uaWNfYnl0ZShkZXYsIEVQUk9NX0NNRCwKKwkJICAgICAgIChFUFJPTV9DTURfTk9STUFMPDxFUFJPTV9DTURfT1BFUkFUSU5HX01PREVfU0hJRlQpKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9lZXByb20uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxfZWVwcm9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ1MmUxNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxfZWVwcm9tLmgKQEAgLTAsMCArMSwyOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQmFzZWQgb24gdGhlIHI4MTgwIGRyaXZlciwgd2hpY2ggaXM6CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4sIGV0IGFsLgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNkZWZpbmUgRVBST01fREVMQVkgMTAKKwordTMyIGVwcm9tX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGFkZHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9ldGh0b29sLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsX2V0aHRvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjQ1MmZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9ldGh0b29sLmMKQEAgLTAsMCArMSw1MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQmFzZWQgb24gdGhlIHI4MTgwIGRyaXZlciwgd2hpY2ggaXM6CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4sIGV0IGFsLgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgInJ0bF9jb3JlLmgiCisKK3N0YXRpYyB2b2lkIHJ0bDgxOXhfZXRodG9vbF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKKwlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocHJpdi0+cGRldikpOworfQorCitzdGF0aWMgdTMyIHJ0bDgxOXhfZXRodG9vbF9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCXJldHVybiAoKHByaXYtPnJ0bGxpYi0+c3RhdGUgPT0gUlRMTElCX0xJTktFRCkgfHwKKwkJKHByaXYtPnJ0bGxpYi0+c3RhdGUgPT0gUlRMTElCX0xJTktFRF9TQ0FOTklORykpOworfQorCitjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgcnRsODE5eF9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8gPSBydGw4MTl4X2V0aHRvb2xfZ2V0X2RydmluZm8sCisJLmdldF9saW5rID0gcnRsODE5eF9ldGh0b29sX2dldF9saW5rLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsX3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYWRjYzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsX3BjaS5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEJhc2VkIG9uIHRoZSByODE4MCBkcml2ZXIsIHdoaWNoIGlzOgorICogQ29weXJpZ2h0IDIwMDQtMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+LCBldCBhbC4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJydGxfcGNpLmgiCisjaW5jbHVkZSAicnRsX2NvcmUuaCIKKworc3RhdGljIHZvaWQgcnRsODE5Ml9wYXJzZV9wY2lfY29uZmlndXJhdGlvbihzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilydGxsaWJfcHJpdihkZXYpOworCisJdTggdG1wOworCWludCBwb3M7CisJdTggTGlua0N0cmxSZWc7CisKKwlwb3MgPSBwY2lfZmluZF9jYXBhYmlsaXR5KHByaXYtPnBkZXYsIFBDSV9DQVBfSURfRVhQKTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwcml2LT5wZGV2LCBwb3MgKyBQQ0lfRVhQX0xOS0NUTCwgJkxpbmtDdHJsUmVnKTsKKwlwcml2LT5OZGlzQWRhcHRlci5MaW5rQ3RybFJlZyA9IExpbmtDdHJsUmVnOworCisJUlRfVFJBQ0UoQ09NUF9JTklULCAiTGluayBDb250cm9sIFJlZ2lzdGVyID0leFxuIiwKKwkJIHByaXYtPk5kaXNBZGFwdGVyLkxpbmtDdHJsUmVnKTsKKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsIDB4OTgsICZ0bXApOworCXRtcCB8PSBCSVQ0OworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDk4LCB0bXApOworCisJdG1wID0gMHgxNzsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgMHg3MGYsIHRtcCk7Cit9CisKK2Jvb2wgcnRsODE5Ml9wY2lfZmluZGFkYXB0ZXIoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSAoc3RydWN0IHI4MTkyX3ByaXYgKilydGxsaWJfcHJpdihkZXYpOworCXUxNiBWZW5kZXJJRDsKKwl1MTYgRGV2aWNlSUQ7CisJdTggIFJldmlzaW9uSUQ7CisJdTE2IElycUxpbmU7CisKKwlWZW5kZXJJRCA9IHBkZXYtPnZlbmRvcjsKKwlEZXZpY2VJRCA9IHBkZXYtPmRldmljZTsKKwlSZXZpc2lvbklEID0gcGRldi0+cmV2aXNpb247CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgMHgzQywgJklycUxpbmUpOworCisJcHJpdi0+Y2FyZF84MTkyID0gcHJpdi0+b3BzLT5uaWNfdHlwZTsKKworCWlmIChEZXZpY2VJRCA9PSAweDgxNzIpIHsKKwkJc3dpdGNoIChSZXZpc2lvbklEKSB7CisJCWNhc2UgSEFMX0hXX1BDSV9SRVZJU0lPTl9JRF84MTkyUENJRToKKwkJCXByaW50ayhLRVJOX0lORk8gIkFkYXB0ZXIoODE5MiBQQ0ktRSkgaXMgZm91bmQgLSAiCisJCQkgICAgICAgIkRldmljZUlEPSV4XG4iLCBEZXZpY2VJRCk7CisJCQlwcml2LT5jYXJkXzgxOTIgPSBOSUNfODE5MkU7CisJCQlicmVhazsKKwkJY2FzZSBIQUxfSFdfUENJX1JFVklTSU9OX0lEXzgxOTJTRToKKwkJCXByaW50ayhLRVJOX0lORk8gIkFkYXB0ZXIoODE5MlNFKSBpcyBmb3VuZCAtICIKKwkJCSAgICAgICAiRGV2aWNlSUQ9JXhcbiIsIERldmljZUlEKTsKKwkJCXByaXYtPmNhcmRfODE5MiA9IE5JQ184MTkyU0U7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0lORk8gIlVOS05PV04gbmljIHR5cGUoJTR4OiU0eClcbiIsCisJCQkgICAgICAgcGRldi0+dmVuZG9yLCBwZGV2LT5kZXZpY2UpOworCQkJcHJpdi0+Y2FyZF84MTkyID0gTklDX1VOS05PV047CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlpZiAocHJpdi0+b3BzLT5uaWNfdHlwZSAhPSBwcml2LT5jYXJkXzgxOTIpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRGV0ZWN0IGluZm8oJXgpIGFuZCBoYXJkd2FyZSBpbmZvKCV4KSBub3QgbWF0Y2ghXG4iLAorCQkJCXByaXYtPm9wcy0+bmljX3R5cGUsIHByaXYtPmNhcmRfODE5Mik7CisJCXByaW50ayhLRVJOX0lORk8gIlBsZWFzZSBzZWxlY3QgcHJvcGVyIGRyaXZlciBiZWZvcmUgaW5zdGFsbCEhISFcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcnRsODE5Ml9wYXJzZV9wY2lfY29uZmlndXJhdGlvbihwZGV2LCBkZXYpOworCisJcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsX3BjaS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9wY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWE1YTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9wY2kuaApAQCAtMCwwICsxLDEwNCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQmFzZWQgb24gdGhlIHI4MTgwIGRyaXZlciwgd2hpY2ggaXM6CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4sIGV0IGFsLgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX1JUTF9QQ0lfSAorI2RlZmluZSBfUlRMX1BDSV9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgInJ0bGxpYi5oIgorCitzdGF0aWMgaW5saW5lIHZvaWQgTmRpc1Jhd1dyaXRlUG9ydFVsb25nKHUzMiBwb3J0LCAgdTMyIHZhbCkKK3sKKwlvdXRsKHZhbCwgcG9ydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBOZGlzUmF3V3JpdGVQb3J0VWNoYXIodTMyIHBvcnQsICB1OCB2YWwpCit7CisJb3V0Yih2YWwsIHBvcnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgTmRpc1Jhd1JlYWRQb3J0VWNoYXIodTMyIHBvcnQsIHU4ICpwdmFsKQoreworCSpwdmFsID0gaW5iKHBvcnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgTmRpc1Jhd1JlYWRQb3J0VXNob3J0KHUzMiBwb3J0LCB1MTYgKnB2YWwpCit7CisJKnB2YWwgPSBpbncocG9ydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBOZGlzUmF3UmVhZFBvcnRVbG9uZyh1MzIgcG9ydCwgdTMyICpwdmFsKQoreworCSpwdmFsID0gaW5sKHBvcnQpOworfQorCitzdHJ1Y3QgbXBfYWRhcHRlciB7CisJdTgJCUxpbmtDdHJsUmVnOworCisJdTgJCUJ1c051bWJlcjsKKwl1OAkJRGV2TnVtYmVyOworCXU4CQlGdW5jTnVtYmVyOworCisJdTgJCVBjaUJyaWRnZUJ1c051bTsKKwl1OAkJUGNpQnJpZGdlRGV2TnVtOworCXU4CQlQY2lCcmlkZ2VGdW5jTnVtOworCXU4CQlQY2lCcmlkZ2VWZW5kb3I7CisJdTE2CQlQY2lCcmlkZ2VWZW5kb3JJZDsKKwl1MTYJCVBjaUJyaWRnZURldmljZUlkOworCXU4CQlQY2lCcmlkZ2VQQ0llSGRyT2Zmc2V0OworCXU4CQlQY2lCcmlkZ2VMaW5rQ3RybFJlZzsKK307CisKK3N0cnVjdCBydF9wY2lfY2FwYWJfaGVhZGVyIHsKKwl1bnNpZ25lZCBjaGFyICAgQ2FwYWJpbGl0eUlEOworCXVuc2lnbmVkIGNoYXIgICBOZXh0OworfTsKKworI2RlZmluZSBQQ0lfTUFYX0JSSURHRV9OVU1CRVIJCQkJMjU1CisjZGVmaW5lIFBDSV9NQVhfREVWSUNFUwkJCQkJCTMyCisjZGVmaW5lIFBDSV9NQVhfRlVOQ1RJT04JCQkJCTgKKworI2RlZmluZSBQQ0lfQ09ORl9BRERSRVNTCQkJCQkweDBDRjgKKyNkZWZpbmUgUENJX0NPTkZfREFUQQkJCQkJCTB4MENGQworCisjZGVmaW5lCVBDSV9DTEFTU19CUklER0VfREVWCQkJCTB4MDYKKyNkZWZpbmUJUENJX1NVQkNMQVNTX0JSX1BDSV9UT19QQ0kJCTB4MDQKKworI2RlZmluZQlVMURPTlRDQVJFCQkJCQkJMHhGRgorI2RlZmluZQlVMkRPTlRDQVJFCQkJCQkJMHhGRkZGCisjZGVmaW5lCVU0RE9OVENBUkUJCQkJCQkweEZGRkZGRkZGCisKKyNkZWZpbmUJSU5URUxfVkVORE9SX0lECQkJCQkweDgwODYKKyNkZWZpbmUJU0lTX1ZFTkRPUl9JRAkJCQkJCTB4MTAzOQorI2RlZmluZQlBVElfVkVORE9SX0lECQkJCQkJMHgxMDAyCisjZGVmaW5lCUFUSV9ERVZJQ0VfSUQJCQkJCQkweDc5MTQKKyNkZWZpbmUJQU1EX1ZFTkRPUl9JRAkJCQkJCTB4MTAyMgorCisjZGVmaW5lIFBDSV9DQVBBQklMSVRZX0lEX1BDSV9FWFBSRVNTCQkweDEwCisKK3N0cnVjdCBuZXRfZGV2aWNlOworYm9vbCBydGw4MTkyX3BjaV9maW5kYWRhcHRlcihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9wbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9wbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZTJmZGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsX3BtLmMKQEAgLTAsMCArMSwxMzYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBDT05GSUdfUE1fUlRMCisjaW5jbHVkZSAicnRsX2NvcmUuaCIKKyNpbmNsdWRlICJyODE5MkVfaHcuaCIKKyNpbmNsdWRlICJyODE5MFBfcnRsODI1Ni5oIgorI2luY2x1ZGUgInJ0bF9wbS5oIgorCitpbnQgcnRsODE5MkVfc2F2ZV9zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJcHJpbnRrKEtFUk5fTk9USUNFICJyODE5MkUgc2F2ZSBzdGF0ZSBjYWxsIChzdGF0ZSAldSkuXG4iLCBzdGF0ZS5ldmVudCk7CisJcmV0dXJuIC1FQUdBSU47Cit9CisKKworaW50IHJ0bDgxOTJFX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwl1MzIJdWxSZWdSZWFkOworCisJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT09PT09PiByODE5MkUgc3VzcGVuZCBjYWxsLlxuIik7CisJZGVsX3RpbWVyX3N5bmMoJnByaXYtPmdwaW9fcG9sbGluZ190aW1lcik7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+Z3Bpb19jaGFuZ2VfcmZfd3EpOworCXByaXYtPnBvbGxpbmdfdGltZXJfb24gPSAwOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUlRMODE5WEU6VUkgaXMgb3BlbiBvdXQgb2Ygc3VzcGVuZCAiCisJCSAgICAgICAiZnVuY3Rpb25cbiIpOworCQlnb3RvIG91dF9wY2lfc3VzcGVuZDsKKwl9CisKKwlpZiAoZGV2LT5uZXRkZXZfb3BzLT5uZG9fc3RvcCkKKwkJZGV2LT5uZXRkZXZfb3BzLT5uZG9fc3RvcChkZXYpOworCW5ldGlmX2RldmljZV9kZXRhY2goZGV2KTsKKworCWlmICghcHJpdi0+cnRsbGliLT5iU3VwcG9ydFJlbW90ZVdha2VVcCkgeworCQlNZ250QWN0U2V0X1JGX1N0YXRlKGRldiwgZVJmT2ZmLCBSRl9DSEFOR0VfQllfSU5JVCwgdHJ1ZSk7CisJCXVsUmVnUmVhZCA9IHJlYWRfbmljX2R3b3JkKGRldiwgQ1BVX0dFTik7CisJCXVsUmVnUmVhZCB8PSBDUFVfR0VOX1NZU1RFTV9SRVNFVDsKKwkJd3JpdGVfbmljX2R3b3JkKGRldiwgQ1BVX0dFTiwgdWxSZWdSZWFkKTsKKwl9IGVsc2UgeworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXRkNSQzAsIDB4ZmZmZmZmZmYpOworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXRkNSQzEsIDB4ZmZmZmZmZmYpOworCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBXRkNSQzIsIDB4ZmZmZmZmZmYpOworCQl3cml0ZV9uaWNfYnl0ZShkZXYsIFBNUiwgMHg1KTsKKwkJd3JpdGVfbmljX2J5dGUoZGV2LCBNYWNCbGtDdHJsLCAweGEpOworCX0KK291dF9wY2lfc3VzcGVuZDoKKwlwcmludGsoInI4MTkyRSBzdXBwb3J0IFdPTCBjYWxsPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/P1xuIik7CisJaWYgKHByaXYtPnJ0bGxpYi0+YlN1cHBvcnRSZW1vdGVXYWtlVXApCisJCVJUX1RSQUNFKENPTVBfUE9XRVIsICJyODE5MkUgc3VwcG9ydCBXT0wgY2FsbCEhISEhISEiCisJCQkgIiEhISEhISEhISEhLlxuIik7CisJcGNpX3NhdmVfc3RhdGUocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9lbmFibGVfd2FrZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSwKKwkJCXByaXYtPnJ0bGxpYi0+YlN1cHBvcnRSZW1vdGVXYWtlVXAgPyAxIDogMCk7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CisKKwltZGVsYXkoMjApOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydGw4MTkyRV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJaW50IGVycjsKKwl1MzIgdmFsOworCisJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT09PT09PT09PT5yODE5MkUgcmVzdW1lIGNhbGwuXG4iKTsKKworCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkIG9uIHJlc3VtZVxuIiwKKwkJICAgICAgIGRldi0+bmFtZSk7CisJCXJldHVybiBlcnI7CisJfQorCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIDB4NDAsICZ2YWwpOworCWlmICgodmFsICYgMHgwMDAwZmYwMCkgIT0gMCkKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDQwLCB2YWwgJiAweGZmZmYwMGZmKTsKKworCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDAsIDApOworCisJaWYgKHByaXYtPnBvbGxpbmdfdGltZXJfb24gPT0gMCkKKwkJY2hlY2tfcmZjdHJsX2dwaW9fdGltZXIoKHVuc2lnbmVkIGxvbmcpZGV2KTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIlJUTDgxOVhFOlVJIGlzIG9wZW4gb3V0IG9mIHJlc3VtZSAiCisJCSAgICAgICAiZnVuY3Rpb25cbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwluZXRpZl9kZXZpY2VfYXR0YWNoKGRldik7CisJaWYgKGRldi0+bmV0ZGV2X29wcy0+bmRvX29wZW4pCisJCWRldi0+bmV0ZGV2X29wcy0+bmRvX29wZW4oZGV2KTsKKworCWlmICghcHJpdi0+cnRsbGliLT5iU3VwcG9ydFJlbW90ZVdha2VVcCkKKwkJTWdudEFjdFNldF9SRl9TdGF0ZShkZXYsIGVSZk9uLCBSRl9DSEFOR0VfQllfSU5JVCwgdHJ1ZSk7CisKK291dDoKKwlSVF9UUkFDRShDT01QX1BPV0VSLCAiPD09PT09PT09PT09PT09PT1yODE5MkUgcmVzdW1lIGNhbGwuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCitpbnQgcnRsODE5MkVfZW5hYmxlX3dha2Uoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlLCBpbnQgZW5hYmxlKQoreworCXByaW50ayhLRVJOX05PVElDRSAicjgxOTJFIGVuYWJsZSB3YWtlIGNhbGwgKHN0YXRlICV1LCBlbmFibGUgJWQpLlxuIiwKKwkgICAgICAgc3RhdGUuZXZlbnQsIGVuYWJsZSk7CisJcmV0dXJuIC1FQUdBSU47Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9wbS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9wbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkN2Y0MDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsX3BtLmgKQEAgLTAsMCArMSwzNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIENPTkZJR19QTV9SVEwKKworI2lmbmRlZiBSODE5MkVfUE1fSAorI2RlZmluZSBSODE5MkVfUE1fSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworaW50IHJ0bDgxOTJFX3NhdmVfc3RhdGUoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKK2ludCBydGw4MTkyRV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CitpbnQgcnRsODE5MkVfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpkZXYpOworaW50IHJ0bDgxOTJFX2VuYWJsZV93YWtlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSwgaW50IGVuYWJsZSk7CisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxfcHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxfcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWE3YzU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9wcy5jCkBAIC0wLDAgKzEsMzEwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBCYXNlZCBvbiB0aGUgcjgxODAgZHJpdmVyLCB3aGljaCBpczoKKyAqIENvcHlyaWdodCAyMDA0LTIwMDUgQW5kcmVhIE1lcmVsbG8gPGFuZHJlYW1ybEB0aXNjYWxpLml0PiwgZXQgYWwuCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqIHdsYW5mYWUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAicnRsX3BzLmgiCisjaW5jbHVkZSAicnRsX2NvcmUuaCIKKyNpbmNsdWRlICJyODE5MkVfcGh5LmgiCisjaW5jbHVkZSAicjgxOTJFX3BoeXJlZy5oIgorI2luY2x1ZGUgInI4MTkwUF9ydGw4MjU2LmgiIC8qIFJUTDgyMjUgUmFkaW8gZnJvbnRlbmQgKi8KKyNpbmNsdWRlICJyODE5MkVfY21kcGt0LmgiCisKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfaHdfc2xlZXBfZG93bihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmZfcHNfbG9jaywgZmxhZ3MpOworCWlmIChwcml2LT5SRkNoYW5nZUluUHJvZ3Jlc3MpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmZfcHNfbG9jaywgZmxhZ3MpOworCQlSVF9UUkFDRShDT01QX0RCRywgInJ0bDgxOTJfaHdfc2xlZXBfZG93bigpOiBSRiBDaGFuZ2UgaW4gIgorCQkJICJwcm9ncmVzcyFcbiIpOworCQlyZXR1cm47CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJmX3BzX2xvY2ssIGZsYWdzKTsKKwlSVF9UUkFDRShDT01QX0RCRywgIiVzKCk9PT09PT09PT09PT0+Y29tZSB0byBzbGVlcCBkb3duXG4iLCBfX2Z1bmNfXyk7CisKKwlNZ250QWN0U2V0X1JGX1N0YXRlKGRldiwgZVJmU2xlZXAsIFJGX0NIQU5HRV9CWV9QUywgZmFsc2UpOworfQorCit2b2lkIHJ0bDgxOTJfaHdfc2xlZXBfd3Eodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZl9kd29ya19yc2woZGF0YSwKKwkJCQkgICAgIHN0cnVjdCBydGxsaWJfZGV2aWNlLCBod19zbGVlcF93cSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKwlydGw4MTkyX2h3X3NsZWVwX2Rvd24oZGV2KTsKK30KKwordm9pZCBydGw4MTkyX2h3X3dha2V1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmZfcHNfbG9jaywgZmxhZ3MpOworCWlmIChwcml2LT5SRkNoYW5nZUluUHJvZ3Jlc3MpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmZfcHNfbG9jaywgZmxhZ3MpOworCQlSVF9UUkFDRShDT01QX0RCRywgInJ0bDgxOTJfaHdfd2FrZXVwKCk6IFJGIENoYW5nZSBpbiAiCisJCQkgInByb2dyZXNzIVxuIik7CisJCXF1ZXVlX2RlbGF5ZWRfd29ya19yc2wocHJpdi0+cnRsbGliLT53cSwKKwkJCQkgICAgICAgJnByaXYtPnJ0bGxpYi0+aHdfd2FrZXVwX3dxLCBNU0VDUygxMCkpOworCQlyZXR1cm47CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJmX3BzX2xvY2ssIGZsYWdzKTsKKwlSVF9UUkFDRShDT01QX1BTLCAiJXMoKT09PT09PT09PT09PT5jb21lIHRvIHdha2UgdXBcbiIsIF9fZnVuY19fKTsKKwlNZ250QWN0U2V0X1JGX1N0YXRlKGRldiwgZVJmT24sIFJGX0NIQU5HRV9CWV9QUywgZmFsc2UpOworfQorCit2b2lkIHJ0bDgxOTJfaHdfd2FrZXVwX3dxKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2ZfZHdvcmtfcnNsKGRhdGEsCisJCQkJICAgICBzdHJ1Y3QgcnRsbGliX2RldmljZSwgaHdfd2FrZXVwX3dxKTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworCXJ0bDgxOTJfaHdfd2FrZXVwKGRldik7CisKK30KKworI2RlZmluZSBNSU5fU0xFRVBfVElNRSA1MAorI2RlZmluZSBNQVhfU0xFRVBfVElNRSAxMDAwMAordm9pZCBydGw4MTkyX2h3X3RvX3NsZWVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU2NCB0aW1lKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCXUzMiB0bXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5wc19sb2NrLCBmbGFncyk7CisKKwl0aW1lIC09IE1TRUNTKDgrMTYrNyk7CisKKwlpZiAoKHRpbWUgLSBqaWZmaWVzKSA8PSBNU0VDUyhNSU5fU0xFRVBfVElNRSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cHNfbG9jaywgZmxhZ3MpOworCQlwcmludGsoS0VSTl9JTkZPICJ0b28gc2hvcnQgdG8gc2xlZXA6OiVsbGQgPCAlbGRcbiIsCisJCSAgICAgICB0aW1lIC0gamlmZmllcywgTVNFQ1MoTUlOX1NMRUVQX1RJTUUpKTsKKwkJcmV0dXJuOworCX0KKworCWlmICgodGltZSAtIGppZmZpZXMpID4gTVNFQ1MoTUFYX1NMRUVQX1RJTUUpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PnRvbyBsb25nIHRvIHNsZWVwOiVsbGQgPiAlbGRcbiIsCisJCSAgICAgICB0aW1lIC0gamlmZmllcywgIE1TRUNTKE1BWF9TTEVFUF9USU1FKSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnBzX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwl0bXAgPSB0aW1lIC0gamlmZmllczsKKwlxdWV1ZV9kZWxheWVkX3dvcmtfcnNsKHByaXYtPnJ0bGxpYi0+d3EsCisJCQkmcHJpdi0+cnRsbGliLT5od193YWtldXBfd3EsIHRtcCk7CisJcXVldWVfZGVsYXllZF93b3JrX3JzbChwcml2LT5ydGxsaWItPndxLAorCQkJKHZvaWQgKikmcHJpdi0+cnRsbGliLT5od19zbGVlcF93cSwgMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cHNfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBJbmFjdGl2ZVBzV29ya0l0ZW1DYWxsYmFjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcnRfcHdyX3NhdmVfY3RybCAqcFBTQyA9IChzdHJ1Y3QgcnRfcHdyX3NhdmVfY3RybCAqKQorCQkJCQkmKHByaXYtPnJ0bGxpYi0+UG93ZXJTYXZlQ29udHJvbCk7CisKKwlSVF9UUkFDRShDT01QX1BTLCAiSW5hY3RpdmVQc1dvcmtJdGVtQ2FsbGJhY2soKSAtLS0tLS0tLS0+XG4iKTsKKwlwUFNDLT5iU3dSZlByb2Nlc3NpbmcgPSB0cnVlOworCisJUlRfVFJBQ0UoQ09NUF9QUywgIkluYWN0aXZlUHNXb3JrSXRlbUNhbGxiYWNrKCk6IFNldCBSRiB0byAlcy5cbiIsCisJCSBwUFNDLT5lSW5hY3RpdmVQb3dlclN0YXRlID09IGVSZk9mZiA/ICJPRkYiIDogIk9OIik7CisJTWdudEFjdFNldF9SRl9TdGF0ZShkZXYsIHBQU0MtPmVJbmFjdGl2ZVBvd2VyU3RhdGUsIFJGX0NIQU5HRV9CWV9JUFMsCisJCQkgICAgZmFsc2UpOworCisJcFBTQy0+YlN3UmZQcm9jZXNzaW5nID0gZmFsc2U7CisJUlRfVFJBQ0UoQ09NUF9QUywgIkluYWN0aXZlUHNXb3JrSXRlbUNhbGxiYWNrKCkgPC0tLS0tLS0tLVxuIik7Cit9CisKK3ZvaWQgSVBTRW50ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJc3RydWN0IHJ0X3B3cl9zYXZlX2N0cmwgKnBQU0MgPSAoc3RydWN0IHJ0X3B3cl9zYXZlX2N0cmwgKikKKwkJCQkJJihwcml2LT5ydGxsaWItPlBvd2VyU2F2ZUNvbnRyb2wpOworCWVudW0gcnRfcmZfcG93ZXJfc3RhdGUgcnRTdGF0ZTsKKworCWlmIChwUFNDLT5iSW5hY3RpdmVQcykgeworCQlydFN0YXRlID0gcHJpdi0+cnRsbGliLT5lUkZQb3dlclN0YXRlOworCQlpZiAocnRTdGF0ZSA9PSBlUmZPbiAmJiAhcFBTQy0+YlN3UmZQcm9jZXNzaW5nICYmCisJCQkocHJpdi0+cnRsbGliLT5zdGF0ZSAhPSBSVExMSUJfTElOS0VEKSAmJgorCQkJKHByaXYtPnJ0bGxpYi0+aXdfbW9kZSAhPSBJV19NT0RFX01BU1RFUikpIHsKKwkJCVJUX1RSQUNFKENPTVBfUFMsICJJUFNFbnRlcigpOiBUdXJuIG9mZiBSRi5cbiIpOworCQkJcFBTQy0+ZUluYWN0aXZlUG93ZXJTdGF0ZSA9IGVSZk9mZjsKKwkJCXByaXYtPmlzUkZPZmYgPSB0cnVlOworCQkJcHJpdi0+YkluUG93ZXJTYXZlTW9kZSA9IHRydWU7CisJCQlJbmFjdGl2ZVBzV29ya0l0ZW1DYWxsYmFjayhkZXYpOworCQl9CisJfQorfQorCit2b2lkIElQU0xlYXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXN0cnVjdCBydF9wd3Jfc2F2ZV9jdHJsICpwUFNDID0gKHN0cnVjdCBydF9wd3Jfc2F2ZV9jdHJsICopCisJCQkJCSYocHJpdi0+cnRsbGliLT5Qb3dlclNhdmVDb250cm9sKTsKKwllbnVtIHJ0X3JmX3Bvd2VyX3N0YXRlIHJ0U3RhdGU7CisKKwlpZiAocFBTQy0+YkluYWN0aXZlUHMpIHsKKwkJcnRTdGF0ZSA9IHByaXYtPnJ0bGxpYi0+ZVJGUG93ZXJTdGF0ZTsKKwkJaWYgKHJ0U3RhdGUgIT0gZVJmT24gICYmICFwUFNDLT5iU3dSZlByb2Nlc3NpbmcgJiYKKwkJICAgIHByaXYtPnJ0bGxpYi0+UmZPZmZSZWFzb24gPD0gUkZfQ0hBTkdFX0JZX0lQUykgeworCQkJUlRfVFJBQ0UoQ09NUF9QUywgIklQU0xlYXZlKCk6IFR1cm4gb24gUkYuXG4iKTsKKwkJCXBQU0MtPmVJbmFjdGl2ZVBvd2VyU3RhdGUgPSBlUmZPbjsKKwkJCXByaXYtPmJJblBvd2VyU2F2ZU1vZGUgPSBmYWxzZTsKKwkJCUluYWN0aXZlUHNXb3JrSXRlbUNhbGxiYWNrKGRldik7CisJCX0KKwl9Cit9CisKK3ZvaWQgSVBTTGVhdmVfd3Eodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZl93b3JrX3JzbChkYXRhLAorCQkJCSAgICAgc3RydWN0IHJ0bGxpYl9kZXZpY2UsIGlwc19sZWF2ZV93cSk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKXJ0bGxpYl9wcml2KGRldik7CisJZG93bigmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKKwlJUFNMZWF2ZShkZXYpOworCXVwKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworfQorCit2b2lkIHJ0bGxpYl9pcHNfbGVhdmVfd3Eoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgcjgxOTJfcHJpdiAqKXJ0bGxpYl9wcml2KGRldik7CisJZW51bSBydF9yZl9wb3dlcl9zdGF0ZSBydFN0YXRlOworCXJ0U3RhdGUgPSBwcml2LT5ydGxsaWItPmVSRlBvd2VyU3RhdGU7CisKKwlpZiAocHJpdi0+cnRsbGliLT5Qb3dlclNhdmVDb250cm9sLmJJbmFjdGl2ZVBzKSB7CisJCWlmIChydFN0YXRlID09IGVSZk9mZikgeworCQkJaWYgKHByaXYtPnJ0bGxpYi0+UmZPZmZSZWFzb24gPiBSRl9DSEFOR0VfQllfSVBTKSB7CisJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICIlcygpOiBSRiBpcyBPRkYuXG4iLAorCQkJCQkgX19mdW5jX18pOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT09PiVzKCk6IElQU0xlYXZlXG4iLAorCQkJCSAgICAgICBfX2Z1bmNfXyk7CisJCQkJcXVldWVfd29ya19yc2wocHJpdi0+cnRsbGliLT53cSwKKwkJCQkJICAgICAgICZwcml2LT5ydGxsaWItPmlwc19sZWF2ZV93cSk7CisJCQl9CisJCX0KKwl9Cit9CisKK3ZvaWQgcnRsbGliX2lwc19sZWF2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopcnRsbGliX3ByaXYoZGV2KTsKKwlkb3duKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworCUlQU0xlYXZlKGRldik7CisJdXAoJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7Cit9CisKK3N0YXRpYyBib29sIE1nbnRBY3RTZXRfODAyXzExX1Bvd2VyU2F2ZU1vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgIHU4IHJ0UHNNb2RlKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCWlmIChwcml2LT5ydGxsaWItPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKKwkJcmV0dXJuIGZhbHNlOworCisJUlRfVFJBQ0UoQ09NUF9MUFMsICIlcygpOiBzZXQgaWVlZS0+cHMgPSAleFxuIiwgX19mdW5jX18sIHJ0UHNNb2RlKTsKKwlpZiAoIXByaXYtPnBzX2ZvcmNlKQorCQlwcml2LT5ydGxsaWItPnBzID0gcnRQc01vZGU7CisJaWYgKHByaXYtPnJ0bGxpYi0+c3RhX3NsZWVwICE9IExQU19JU19XQUtFICYmCisJICAgIHJ0UHNNb2RlID09IFJUTExJQl9QU19ESVNBQkxFRCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXJ0bDgxOTJfaHdfd2FrZXVwKGRldik7CisJCXByaXYtPnJ0bGxpYi0+c3RhX3NsZWVwID0gTFBTX0lTX1dBS0U7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJihwcml2LT5ydGxsaWItPm1nbXRfdHhfbG9jayksIGZsYWdzKTsKKwkJUlRfVFJBQ0UoQ09NUF9EQkcsICJMUFMgbGVhdmU6IG5vdGlmeSBBUCB3ZSBhcmUgYXdha2VkIgorCQkJICIgKysrKysrKysrKyBTZW5kTnVsbEZ1bmN0aW9uRGF0YVxuIik7CisJCXJ0bGxpYl9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKHByaXYtPnJ0bGxpYiwgMCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihwcml2LT5ydGxsaWItPm1nbXRfdHhfbG9jayksIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBMZWlzdXJlUFNFbnRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcnRfcHdyX3NhdmVfY3RybCAqcFBTQyA9IChzdHJ1Y3QgcnRfcHdyX3NhdmVfY3RybCAqKQorCQkJCQkmKHByaXYtPnJ0bGxpYi0+UG93ZXJTYXZlQ29udHJvbCk7CisKKwlSVF9UUkFDRShDT01QX1BTLCAiTGVpc3VyZVBTRW50ZXIoKS4uLlxuIik7CisJUlRfVFJBQ0UoQ09NUF9QUywgInBQU0MtPmJMZWlzdXJlUHMgPSAlZCwgaWVlZS0+cHMgPSAlZCxwUFNDLT5McHNJZGxlIgorCQkgIkNvdW50IGlzICVkLFJUX0NIRUNLX0ZPUl9IQU5HX1BFUklPRCBpcyAlZFxuIiwKKwkJIHBQU0MtPmJMZWlzdXJlUHMsIHByaXYtPnJ0bGxpYi0+cHMsIHBQU0MtPkxwc0lkbGVDb3VudCwKKwkJIFJUX0NIRUNLX0ZPUl9IQU5HX1BFUklPRCk7CisKKwlpZiAoISgocHJpdi0+cnRsbGliLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpICYmCisJICAgIChwcml2LT5ydGxsaWItPnN0YXRlID09IFJUTExJQl9MSU5LRUQpKQorCSAgICB8fCAocHJpdi0+cnRsbGliLT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHx8CisJICAgIChwcml2LT5ydGxsaWItPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpKQorCQlyZXR1cm47CisKKwlpZiAocFBTQy0+YkxlaXN1cmVQcykgeworCQlpZiAocFBTQy0+THBzSWRsZUNvdW50ID49IFJUX0NIRUNLX0ZPUl9IQU5HX1BFUklPRCkgeworCisJCQlpZiAocHJpdi0+cnRsbGliLT5wcyA9PSBSVExMSUJfUFNfRElTQUJMRUQpIHsKKworCQkJCVJUX1RSQUNFKENPTVBfTFBTLCAiTGVpc3VyZVBTRW50ZXIoKTogRW50ZXIgIgorCQkJCQkgIjgwMi4xMSBwb3dlciBzYXZlIG1vZGUuLi5cbiIpOworCisJCQkJaWYgKCFwUFNDLT5iRndDdHJsTFBTKSB7CisJCQkJCWlmIChwcml2LT5ydGxsaWItPlNldEZ3Q21kSGFuZGxlcikKKwkJCQkJCXByaXYtPnJ0bGxpYi0+U2V0RndDbWRIYW5kbGVyKAorCQkJCQkJCWRldiwgRldfQ01EX0xQU19FTlRFUik7CisJCQkJfQorCQkJCU1nbnRBY3RTZXRfODAyXzExX1Bvd2VyU2F2ZU1vZGUoZGV2LAorCQkJCQkJCSBSVExMSUJfUFNfTUJDQVNUIHwKKwkJCQkJCQkgUlRMTElCX1BTX1VOSUNBU1QpOworCQkJfQorCQl9IGVsc2UKKwkJCXBQU0MtPkxwc0lkbGVDb3VudCsrOworCX0KK30KKwordm9pZCBMZWlzdXJlUFNMZWF2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcnRfcHdyX3NhdmVfY3RybCAqcFBTQyA9IChzdHJ1Y3QgcnRfcHdyX3NhdmVfY3RybCAqKQorCQkJCQkmKHByaXYtPnJ0bGxpYi0+UG93ZXJTYXZlQ29udHJvbCk7CisKKworCVJUX1RSQUNFKENPTVBfUFMsICJMZWlzdXJlUFNMZWF2ZSgpLi4uXG4iKTsKKwlSVF9UUkFDRShDT01QX1BTLCAicFBTQy0+YkxlaXN1cmVQcyA9ICVkLCBpZWVlLT5wcyA9ICVkXG4iLAorCQlwUFNDLT5iTGVpc3VyZVBzLCBwcml2LT5ydGxsaWItPnBzKTsKKworCWlmIChwUFNDLT5iTGVpc3VyZVBzKSB7CisJCWlmIChwcml2LT5ydGxsaWItPnBzICE9IFJUTExJQl9QU19ESVNBQkxFRCkgeworCQkJUlRfVFJBQ0UoQ09NUF9MUFMsICJMZWlzdXJlUFNMZWF2ZSgpOiBCdXN5IFRyYWZmaWMgLCAiCisJCQkJICJMZWF2ZSA4MDIuMTEgcG93ZXIgc2F2ZS4uXG4iKTsKKwkJCU1nbnRBY3RTZXRfODAyXzExX1Bvd2VyU2F2ZU1vZGUoZGV2LAorCQkJCQkgUlRMTElCX1BTX0RJU0FCTEVEKTsKKworCQkJaWYgKCFwUFNDLT5iRndDdHJsTFBTKSB7CisJCQkJaWYgKHByaXYtPnJ0bGxpYi0+U2V0RndDbWRIYW5kbGVyKQorCQkJCQlwcml2LT5ydGxsaWItPlNldEZ3Q21kSGFuZGxlcihkZXYsCisJCQkJCQkJIEZXX0NNRF9MUFNfTEVBVkUpOworCQkgICAgfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9wcy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YzJkNzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsX3BzLmgKQEAgLTAsMCArMSw0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQmFzZWQgb24gdGhlIHI4MTgwIGRyaXZlciwgd2hpY2ggaXM6CisgKiBDb3B5cmlnaHQgMjAwNC0yMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4sIGV0IGFsLgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiB3bGFuZmFlIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX1JUTF9QU19ICisjZGVmaW5lIF9SVExfUFNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlICJydGxsaWIuaCIKK3N0cnVjdCBuZXRfZGV2aWNlOworCisjZGVmaW5lIFJUX0NIRUNLX0ZPUl9IQU5HX1BFUklPRCAyCisjZGVmaW5lIElOSVRfREVGQVVMVF9DSEFOCSAxCisKK3ZvaWQgcnRsODE5Ml9od193YWtldXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHJ0bDgxOTJfaHdfdG9fc2xlZXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTY0IHRpbWUpOwordm9pZCBydGxsaWJfaXBzX2xlYXZlX3dxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBydGxsaWJfaXBzX2xlYXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordm9pZCBJUFNMZWF2ZV93cSh2b2lkICpkYXRhKTsKKwordm9pZCBJUFNFbnRlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgSVBTTGVhdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKK3ZvaWQgTGVpc3VyZVBTRW50ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIExlaXN1cmVQU0xlYXZlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxfd3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2IxZWRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF93eC5jCkBAIC0wLDAgKzEsMTMzMyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgInJ0bF9jb3JlLmgiCisjaW5jbHVkZSAiZG90MTFkLmgiCisKKyNkZWZpbmUgUkFURV9DT1VOVCAxMgorc3RhdGljIHUzMiBydGw4MTkyX3JhdGVzW10gPSB7CisJMTAwMDAwMCwgMjAwMDAwMCwgNTUwMDAwMCwgMTEwMDAwMDAsIDYwMDAwMDAsIDkwMDAwMDAsIDEyMDAwMDAwLAorCTE4MDAwMDAwLCAyNDAwMDAwMCwgMzYwMDAwMDAsIDQ4MDAwMDAwLCA1NDAwMDAwMAorfTsKKworI2lmbmRlZiBFTkVURE9XTgorI2RlZmluZSBFTkVURE9XTiAxCisjZW5kaWYKKworc3RhdGljIGludCByODE5Ml93eF9nZXRfZnJlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCXJldHVybiBydGxsaWJfd3hfZ2V0X2ZyZXEocHJpdi0+cnRsbGliLCBhLCB3cnF1LCBiKTsKK30KKworCitzdGF0aWMgaW50IHI4MTkyX3d4X2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJcmV0dXJuIHJ0bGxpYl93eF9nZXRfbW9kZShwcml2LT5ydGxsaWIsIGEsIHdycXUsIGIpOworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X2dldF9yYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlyZXR1cm4gcnRsbGliX3d4X2dldF9yYXRlKHByaXYtPnJ0bGxpYiwgaW5mbywgd3JxdSwgZXh0cmEpOworfQorCisKKworc3RhdGljIGludCByODE5Ml93eF9zZXRfcmF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCWlmIChwcml2LT5iSHdSYWRpb09mZiA9PSB0cnVlKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlyZXQgPSBydGxsaWJfd3hfc2V0X3JhdGUocHJpdi0+cnRsbGliLCBpbmZvLCB3cnF1LCBleHRyYSk7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCByODE5Ml93eF9zZXRfcnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQ7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJaWYgKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IHJ0bGxpYl93eF9zZXRfcnRzKHByaXYtPnJ0bGxpYiwgaW5mbywgd3JxdSwgZXh0cmEpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X2dldF9ydHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXJldHVybiBydGxsaWJfd3hfZ2V0X3J0cyhwcml2LT5ydGxsaWIsIGluZm8sIHdycXUsIGV4dHJhKTsKK30KKworc3RhdGljIGludCByODE5Ml93eF9zZXRfcG93ZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisKKwlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkgeworCQlSVF9UUkFDRShDT01QX0VSUiwgIiVzKCk6SHcgaXMgUmFkaW8gT2ZmLCB3ZSBjYW4ndCBzZXQgIgorCQkJICJQb3dlcixyZXR1cm5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlyZXQgPSBydGxsaWJfd3hfc2V0X3Bvd2VyKHByaXYtPnJ0bGxpYiwgaW5mbywgd3JxdSwgZXh0cmEpOworCisJdXAoJnByaXYtPnd4X3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X2dldF9wb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJcmV0dXJuIHJ0bGxpYl93eF9nZXRfcG93ZXIocHJpdi0+cnRsbGliLCBpbmZvLCB3cnF1LCBleHRyYSk7Cit9CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X3Jhd3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCWludCByZXQ7CisKKwlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gcnRsbGliX3d4X3NldF9yYXd0eChwcml2LT5ydGxsaWIsIGluZm8sIHdycXUsIGV4dHJhKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKKworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X2ZvcmNlX3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlSVF9UUkFDRShDT01QX0RCRywgIiVzKCk6IGZvcmNlIHJlc2V0ICEgZXh0cmEgaXMgJWRcbiIsCisJCSBfX2Z1bmNfXywgKmV4dHJhKTsKKwlwcml2LT5mb3JjZV9yZXNldCA9ICpleHRyYTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X2ZvcmNlX21pY19lcnJvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUgPSBwcml2LT5ydGxsaWI7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJUlRfVFJBQ0UoQ09NUF9EQkcsICIlcygpOiBmb3JjZSBtaWMgZXJyb3IgIVxuIiwgX19mdW5jX18pOworCWllZWUtPmZvcmNlX21pY19lcnJvciA9IHRydWU7CisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIDA7CisKK30KKworI2RlZmluZSBNQVhfQURIT0NfUEVFUl9OVU0gNjQKK3N0cnVjdCBhZGhvY19wZWVyX2VudHJ5IHsKKwl1bnNpZ25lZCBjaGFyIE1hY0FkZHJbRVRIX0FMRU5dOworCXVuc2lnbmVkIGNoYXIgV2lyZWxlc3NNb2RlOworCXVuc2lnbmVkIGNoYXIgYkN1clR4Qlc0ME1IejsKK307CitzdHJ1Y3QgYWRob2NfcGVlcnNfaW5mbyB7CisJc3RydWN0IGFkaG9jX3BlZXJfZW50cnkgRW50cnlbTUFYX0FESE9DX1BFRVJfTlVNXTsKKwl1bnNpZ25lZCBjaGFyIG51bTsKK307CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X2FkaG9jX3BlZXJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcjgxOTFzZV93eF9nZXRfZmlybV92ZXJzaW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCXN0cnVjdCBpd19wYXJhbSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfYWRhcHRlcl9wb3dlcl9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXN0cnVjdCBydF9wd3Jfc2F2ZV9jdHJsICpwUFNDID0gKHN0cnVjdCBydF9wd3Jfc2F2ZV9jdHJsICopCisJCQkJCSgmKHByaXYtPnJ0bGxpYi0+UG93ZXJTYXZlQ29udHJvbCkpOworCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gcHJpdi0+cnRsbGliOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCVJUX1RSQUNFKENPTVBfUE9XRVIsICIlcygpOiAlc1xuIiwgX19mdW5jX18sICgqZXh0cmEgPT0gNikgPworCQkgIkRDIHBvd2VyIiA6ICJBQyBwb3dlciIpOworCWlmICgqZXh0cmEgfHwgcHJpdi0+Zm9yY2VfbHBzKSB7CisJCXByaXYtPnBzX2ZvcmNlID0gZmFsc2U7CisJCXBQU0MtPmJMZWlzdXJlUHMgPSB0cnVlOworCX0gZWxzZSB7CisJCWlmIChwcml2LT5ydGxsaWItPnN0YXRlID09IFJUTExJQl9MSU5LRUQpCisJCQlMZWlzdXJlUFNMZWF2ZShkZXYpOworCisJCXByaXYtPnBzX2ZvcmNlID0gdHJ1ZTsKKwkJcFBTQy0+YkxlaXN1cmVQcyA9IGZhbHNlOworCQlpZWVlLT5wcyA9ICpleHRyYTsKKwl9CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHI4MTkyc2Vfd3hfc2V0X3JhZGlvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTogc2V0IHJhZGlvICEgZXh0cmEgaXMgJWRcbiIsIF9fZnVuY19fLCAqZXh0cmEpOworCWlmICgoKmV4dHJhICE9IDApICYmICgqZXh0cmEgIT0gMSkpIHsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsICIlcygpOiBzZXQgcmFkaW8gYW4gZXJyIHZhbHVlLG11c3QgMChyYWRpbyAiCisJCQkgIm9mZikgb3IgMShyYWRpbyBvbilcbiIsIF9fZnVuY19fKTsKKwkJdXAoJnByaXYtPnd4X3NlbSk7CisJCXJldHVybiAtMTsKKwl9CisJcHJpdi0+c3dfcmFkaW9fb24gPSAqZXh0cmE7CisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludCByODE5MnNlX3d4X3NldF9scHNfYXdha2VfaW50ZXJ2YWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcnRfcHdyX3NhdmVfY3RybCAqcFBTQyA9IChzdHJ1Y3QgcnRfcHdyX3NhdmVfY3RybCAqKQorCQkJCQkoJihwcml2LT5ydGxsaWItPlBvd2VyU2F2ZUNvbnRyb2wpKTsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlwcmludGsoS0VSTl9JTkZPICIlcygpOiBzZXQgbHBzIGF3YWtlIGludGVydmFsICEgZXh0cmEgaXMgJWRcbiIsCisJICAgICAgIF9fZnVuY19fLCAqZXh0cmEpOworCisJcFBTQy0+UmVnTWF4TFBTQXdha2VJbnR2bCA9ICpleHRyYTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByODE5MnNlX3d4X3NldF9mb3JjZV9scHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzKCk6IGZvcmNlIExQUyAhIGV4dHJhIGlzICVkICgxIGlzIG9wZW4gMCBpcyAiCisJICAgICAgICJjbG9zZSlcbiIsIF9fZnVuY19fLCAqZXh0cmEpOworCXByaXYtPmZvcmNlX2xwcyA9ICpleHRyYTsKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9kZWJ1Z2ZsYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJdTggYyA9ICpleHRyYTsKKworCWlmIChwcml2LT5iSHdSYWRpb09mZiA9PSB0cnVlKQorCQlyZXR1cm4gMDsKKworCXByaW50ayhLRVJOX0lORk8gIj09PT09PiVzKCksICpleHRyYToleCwgZGVidWdmbGFnOiV4XG4iLCBfX2Z1bmNfXywKKwkgICAgICAgKmV4dHJhLCBydF9nbG9iYWxfZGVidWdfY29tcG9uZW50KTsKKwlpZiAoYyA+IDApCisJCXJ0X2dsb2JhbF9kZWJ1Z19jb21wb25lbnQgfD0gKDE8PGMpOworCWVsc2UKKwkJcnRfZ2xvYmFsX2RlYnVnX2NvbXBvbmVudCAmPSBCSVQzMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByODE5Ml93eF9zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2X3JzbChkZXYpOworCisJZW51bSBydF9yZl9wb3dlcl9zdGF0ZSBydFN0YXRlOworCWludCByZXQ7CisKKwlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkKKwkJcmV0dXJuIDA7CisJcnRTdGF0ZSA9IHByaXYtPnJ0bGxpYi0+ZVJGUG93ZXJTdGF0ZTsKKwlkb3duKCZwcml2LT53eF9zZW0pOworCWlmICh3cnF1LT5tb2RlID09IElXX01PREVfQURIT0MgfHwgd3JxdS0+bW9kZSA9PSBJV19NT0RFX01PTklUT1IgfHwKKwkgICAgaWVlZS0+Yk5ldFByb21pc2N1b3VzTW9kZSkgeworCQlpZiAocHJpdi0+cnRsbGliLT5Qb3dlclNhdmVDb250cm9sLmJJbmFjdGl2ZVBzKSB7CisJCQlpZiAocnRTdGF0ZSA9PSBlUmZPZmYpIHsKKwkJCQlpZiAocHJpdi0+cnRsbGliLT5SZk9mZlJlYXNvbiA+CisJCQkJICAgIFJGX0NIQU5HRV9CWV9JUFMpIHsKKwkJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICIlcygpOiBSRiBpcyBPRkYuXG4iLAorCQkJCQkJIF9fZnVuY19fKTsKKwkJCQkJdXAoJnByaXYtPnd4X3NlbSk7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT0+JXMoKTogIgorCQkJCQkgICAgICAgIklQU0xlYXZlXG4iLCBfX2Z1bmNfXyk7CisJCQkJCWRvd24oJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7CisJCQkJCUlQU0xlYXZlKGRldik7CisJCQkJCXVwKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXQgPSBydGxsaWJfd3hfc2V0X21vZGUocHJpdi0+cnRsbGliLCBhLCB3cnF1LCBiKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCAgaXdfcmFuZ2Vfd2l0aF9zY2FuX2NhcGEgeworCS8qIEluZm9ybWF0aXZlIHN0dWZmICh0byBjaG9vc2UgYmV0d2VlbiBkaWZmZXJlbnQgaW50ZXJmYWNlKSAqLworCV9fdTMyCSAgIHRocm91Z2hwdXQ7ICAgICAvKiBUbyBnaXZlIGFuIGlkZWEuLi4gKi8KKwkvKiBJbiB0aGVvcnkgdGhpcyB2YWx1ZSBzaG91bGQgYmUgdGhlIG1heGltdW0gYmVuY2htYXJrZWQKKwkgKiBUQ1AvSVAgdGhyb3VnaHB1dCwgYmVjYXVzZSB3aXRoIG1vc3Qgb2YgdGhlc2UgZGV2aWNlcyB0aGUKKwkgKiBiaXQgcmF0ZSBpcyBtZWFuaW5nbGVzcyAob3ZlcmhlYWQgYW4gY28pIHRvIGVzdGltYXRlIGhvdworCSAqIGZhc3QgdGhlIGNvbm5lY3Rpb24gd2lsbCBnbyBhbmQgcGljayB0aGUgZmFzdGVzdCBvbmUuCisJICogSSBzdWdnZXN0IHBlb3BsZSB0byBwbGF5IHdpdGggTmV0cGVyZiBvciBhbnkgYmVuY2htYXJrLi4uCisJICovCisKKwkvKiBOV0lEIChvciBkb21haW4gaWQpICovCisJX191MzIJICAgbWluX253aWQ7CS8qIE1pbmltYWwgTldJRCB3ZSBhcmUgYWJsZSB0byBzZXQgKi8KKwlfX3UzMgkgICBtYXhfbndpZDsJLyogTWF4aW1hbCBOV0lEIHdlIGFyZSBhYmxlIHRvIHNldCAqLworCisJLyogT2xkIEZyZXF1ZW5jeSAoYmFja3dhcmQgY29tcGF0IC0gbW92ZWQgbG93ZXIgKSAqLworCV9fdTE2CSAgIG9sZF9udW1fY2hhbm5lbHM7CisJX191OAkgICAgb2xkX251bV9mcmVxdWVuY3k7CisKKwkvKiBTY2FuIGNhcGFiaWxpdGllcyAqLworCV9fdTgJICAgIHNjYW5fY2FwYTsKK307CisKK3N0YXRpYyBpbnQgcnRsODE5Ml93eF9nZXRfcmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBpd19yYW5nZSAqcmFuZ2UgPSAoc3RydWN0IGl3X3JhbmdlICopZXh0cmE7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXUxNiB2YWw7CisJaW50IGk7CisKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IHNpemVvZigqcmFuZ2UpOworCW1lbXNldChyYW5nZSwgMCwgc2l6ZW9mKCpyYW5nZSkpOworCisJLyogfjEzMCBNYi9zIHJlYWwgKDgwMi4xMW4pICovCisJcmFuZ2UtPnRocm91Z2hwdXQgPSAxMzAgKiAxMDAwICogMTAwMDsKKworCWlmIChwcml2LT5yZl9zZXRfc2VucyAhPSBOVUxMKSB7CisJCS8qIHNpZ25hbCBsZXZlbCB0aHJlc2hvbGQgcmFuZ2UgKi8KKwkJcmFuZ2UtPnNlbnNpdGl2aXR5ID0gcHJpdi0+bWF4X3NlbnM7CisJfQorCisJcmFuZ2UtPm1heF9xdWFsLnF1YWwgPSAxMDA7CisJcmFuZ2UtPm1heF9xdWFsLmxldmVsID0gMDsKKwlyYW5nZS0+bWF4X3F1YWwubm9pc2UgPSAwOworCXJhbmdlLT5tYXhfcXVhbC51cGRhdGVkID0gNzsgLyogVXBkYXRlZCBhbGwgdGhyZWUgKi8KKworCXJhbmdlLT5hdmdfcXVhbC5xdWFsID0gNzA7IC8qID4gOCUgbWlzc2VkIGJlYWNvbnMgaXMgJ2JhZCcgKi8KKwlyYW5nZS0+YXZnX3F1YWwubGV2ZWwgPSAwOworCXJhbmdlLT5hdmdfcXVhbC5ub2lzZSA9IDA7CisJcmFuZ2UtPmF2Z19xdWFsLnVwZGF0ZWQgPSA3OyAvKiBVcGRhdGVkIGFsbCB0aHJlZSAqLworCisJcmFuZ2UtPm51bV9iaXRyYXRlcyA9IG1pbihSQVRFX0NPVU5ULCBJV19NQVhfQklUUkFURVMpOworCisJZm9yIChpID0gMDsgaSA8IHJhbmdlLT5udW1fYml0cmF0ZXM7IGkrKykKKwkJcmFuZ2UtPmJpdHJhdGVbaV0gPSBydGw4MTkyX3JhdGVzW2ldOworCisJcmFuZ2UtPm1heF9ydHMgPSBERUZBVUxUX1JUU19USFJFU0hPTEQ7CisJcmFuZ2UtPm1pbl9mcmFnID0gTUlOX0ZSQUdfVEhSRVNIT0xEOworCXJhbmdlLT5tYXhfZnJhZyA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKKworCXJhbmdlLT5taW5fcG1wID0gMDsKKwlyYW5nZS0+bWF4X3BtcCA9IDUwMDAwMDA7CisJcmFuZ2UtPm1pbl9wbXQgPSAwOworCXJhbmdlLT5tYXhfcG10ID0gNjU1MzUqMTAwMDsKKwlyYW5nZS0+cG1wX2ZsYWdzID0gSVdfUE9XRVJfUEVSSU9EOworCXJhbmdlLT5wbXRfZmxhZ3MgPSBJV19QT1dFUl9USU1FT1VUOworCXJhbmdlLT5wbV9jYXBhID0gSVdfUE9XRVJfUEVSSU9EIHwgSVdfUE9XRVJfVElNRU9VVCB8IElXX1BPV0VSX0FMTF9SOworCXJhbmdlLT53ZV92ZXJzaW9uX2NvbXBpbGVkID0gV0lSRUxFU1NfRVhUOworCXJhbmdlLT53ZV92ZXJzaW9uX3NvdXJjZSA9IDE4OworCisJZm9yIChpID0gMCwgdmFsID0gMDsgaSA8IDE0OyBpKyspIHsKKwkJaWYgKChwcml2LT5ydGxsaWItPmFjdGl2ZV9jaGFubmVsX21hcClbaSsxXSkgeworCQkJcmFuZ2UtPmZyZXFbdmFsXS5pID0gaSArIDE7CisJCQlyYW5nZS0+ZnJlcVt2YWxdLm0gPSBydGxsaWJfd2xhbl9mcmVxdWVuY2llc1tpXSAqCisJCQkJCSAgICAgMTAwMDAwOworCQkJcmFuZ2UtPmZyZXFbdmFsXS5lID0gMTsKKwkJCXZhbCsrOworCQl9CisKKwkJaWYgKHZhbCA9PSBJV19NQVhfRlJFUVVFTkNJRVMpCisJCQlicmVhazsKKwl9CisJcmFuZ2UtPm51bV9mcmVxdWVuY3kgPSB2YWw7CisJcmFuZ2UtPm51bV9jaGFubmVscyA9IHZhbDsKKwlyYW5nZS0+ZW5jX2NhcGEgPSBJV19FTkNfQ0FQQV9XUEF8SVdfRU5DX0NBUEFfV1BBMnwKKwkJCSAgSVdfRU5DX0NBUEFfQ0lQSEVSX1RLSVB8SVdfRU5DX0NBUEFfQ0lQSEVSX0NDTVA7CisJcmFuZ2UtPnNjYW5fY2FwYSA9IElXX1NDQU5fQ0FQQV9FU1NJRCB8IElXX1NDQU5fQ0FQQV9UWVBFOworCisJLyogRXZlbnQgY2FwYWJpbGl0eSAoa2VybmVsICsgZHJpdmVyKSAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X3NjYW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUgPSBwcml2LT5ydGxsaWI7CisJZW51bSBydF9yZl9wb3dlcl9zdGF0ZSBydFN0YXRlOworCWludCByZXQ7CisKKwlpZiAoIShpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NDQU4pKSB7CisJCWlmICgoaWVlZS0+c3RhdGUgPj0gUlRMTElCX0FTU09DSUFUSU5HKSAmJgorCQkgICAgKGllZWUtPnN0YXRlIDw9IFJUTExJQl9BU1NPQ0lBVElOR19BVVRIRU5USUNBVEVEKSkKKwkJCXJldHVybiAwOworCQlpZiAoKHByaXYtPnJ0bGxpYi0+c3RhdGUgPT0gUlRMTElCX0xJTktFRCkgJiYKKwkJICAgIChwcml2LT5ydGxsaWItPkNudEFmdGVyTGluayA8IDIpKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT09PT09PT09PT4lcygpOiBod3JhZGlvIG9mZlxuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCXJ0U3RhdGUgPSBwcml2LT5ydGxsaWItPmVSRlBvd2VyU3RhdGU7CisJaWYgKCFwcml2LT51cCkKKwkJcmV0dXJuIC1FTkVURE9XTjsKKwlpZiAocHJpdi0+cnRsbGliLT5MaW5rRGV0ZWN0SW5mby5iQnVzeVRyYWZmaWMgPT0gdHJ1ZSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlpZiAod3JxdS0+ZGF0YS5mbGFncyAmIElXX1NDQU5fVEhJU19FU1NJRCkgeworCQlzdHJ1Y3QgaXdfc2Nhbl9yZXEgKnJlcSA9IChzdHJ1Y3QgaXdfc2Nhbl9yZXEgKiliOworCQlpZiAocmVxLT5lc3NpZF9sZW4pIHsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IHJlcS0+ZXNzaWRfbGVuOworCQkJbWVtY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCByZXEtPmVzc2lkLAorCQkJICAgICAgIHJlcS0+ZXNzaWRfbGVuKTsKKwkJfQorCX0KKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlwcml2LT5ydGxsaWItPkZpcnN0SWVfSW5TY2FuID0gdHJ1ZTsKKworCWlmIChwcml2LT5ydGxsaWItPnN0YXRlICE9IFJUTExJQl9MSU5LRUQpIHsKKwkJaWYgKHByaXYtPnJ0bGxpYi0+UG93ZXJTYXZlQ29udHJvbC5iSW5hY3RpdmVQcykgeworCQkJaWYgKHJ0U3RhdGUgPT0gZVJmT2ZmKSB7CisJCQkJaWYgKHByaXYtPnJ0bGxpYi0+UmZPZmZSZWFzb24gPgorCQkJCSAgICBSRl9DSEFOR0VfQllfSVBTKSB7CisJCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiJXMoKTogUkYgaXMgIgorCQkJCQkJICJPRkYuXG4iLCBfX2Z1bmNfXyk7CisJCQkJCXVwKCZwcml2LT53eF9zZW0pOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfSBlbHNlIHsKKwkJCQkJUlRfVFJBQ0UoQ09NUF9QUywgIj09PT09PT09PT4lcygpOiAiCisJCQkJCQkgIklQU0xlYXZlXG4iLCBfX2Z1bmNfXyk7CisJCQkJCWRvd24oJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7CisJCQkJCUlQU0xlYXZlKGRldik7CisJCQkJCXVwKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworCQkJCX0KKwkJCX0KKwkJfQorCQlydGxsaWJfc3RvcF9zY2FuKHByaXYtPnJ0bGxpYik7CisJCWlmIChwcml2LT5ydGxsaWItPkxlZENvbnRyb2xIYW5kbGVyKQorCQkJcHJpdi0+cnRsbGliLT5MZWRDb250cm9sSGFuZGxlcihkZXYsCisJCQkJCQkJIExFRF9DVExfU0lURV9TVVJWRVkpOworCisJCWlmIChwcml2LT5ydGxsaWItPmVSRlBvd2VyU3RhdGUgIT0gZVJmT2ZmKSB7CisJCQlwcml2LT5ydGxsaWItPmFjdHNjYW5uaW5nID0gdHJ1ZTsKKworCQkJaWYgKGllZWUtPlNjYW5PcGVyYXRpb25CYWNrdXBIYW5kbGVyKQorCQkJCWllZWUtPlNjYW5PcGVyYXRpb25CYWNrdXBIYW5kbGVyKGllZWUtPmRldiwKKwkJCQkJCQkgU0NBTl9PUFRfQkFDS1VQKTsKKworCQkJcnRsbGliX3N0YXJ0X3NjYW5fc3luY3JvKHByaXYtPnJ0bGxpYiwgMCk7CisKKwkJCWlmIChpZWVlLT5TY2FuT3BlcmF0aW9uQmFja3VwSGFuZGxlcikKKwkJCQlpZWVlLT5TY2FuT3BlcmF0aW9uQmFja3VwSGFuZGxlcihpZWVlLT5kZXYsCisJCQkJCQkJIFNDQU5fT1BUX1JFU1RPUkUpOworCQl9CisJCXJldCA9IDA7CisJfSBlbHNlIHsKKwkJcHJpdi0+cnRsbGliLT5hY3RzY2FubmluZyA9IHRydWU7CisJCXJldCA9IHJ0bGxpYl93eF9zZXRfc2Nhbihwcml2LT5ydGxsaWIsIGEsIHdycXUsIGIpOworCX0KKworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCByODE5Ml93eF9nZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCisJaW50IHJldDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisKKwlpZiAoIXByaXYtPnVwKQorCQlyZXR1cm4gLUVORVRET1dOOworCisJaWYgKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpCisJCXJldHVybiAwOworCisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gcnRsbGliX3d4X2dldF9zY2FuKHByaXYtPnJ0bGxpYiwgYSwgd3JxdSwgYik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X2Vzc2lkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJaW50IHJldDsKKworCWlmICgocnRsbGliX2FjdF9zY2FubmluZyhwcml2LT5ydGxsaWIsIGZhbHNlKSkgJiYKKwkgICAgIShwcml2LT5ydGxsaWItPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0NBTikpIHsKKwkJOwkvKiBUT0RPIC0gZ2V0IHJpZCBvZiBpZiAqLworCX0KKwlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkgeworCQlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT0+JXMoKTpodyByYWRpbyBvZmYsb3IgUmYgc3RhdGUgaXMgIgorCQkgICAgICAgImVSZk9mZiwgcmV0dXJuXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKwlkb3duKCZwcml2LT53eF9zZW0pOworCXJldCA9IHJ0bGxpYl93eF9zZXRfZXNzaWQocHJpdi0+cnRsbGliLCBhLCB3cnF1LCBiKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByODE5Ml93eF9nZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKQoreworCWludCByZXQ7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXJldCA9IHJ0bGxpYl93eF9nZXRfZXNzaWQocHJpdi0+cnRsbGliLCBhLCB3cnF1LCBiKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByODE5Ml93eF9zZXRfbmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCWlmICh3cnF1LT5kYXRhLmxlbmd0aCA+IElXX0VTU0lEX01BWF9TSVpFKQorCQlyZXR1cm4gLUUyQklHOworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJd3JxdS0+ZGF0YS5sZW5ndGggPSBtaW4oKHNpemVfdCkgd3JxdS0+ZGF0YS5sZW5ndGgsIHNpemVvZihwcml2LT5uaWNrKSk7CisJbWVtc2V0KHByaXYtPm5pY2ssIDAsIHNpemVvZihwcml2LT5uaWNrKSk7CisJbWVtY3B5KHByaXYtPm5pY2ssIGV4dHJhLCB3cnF1LT5kYXRhLmxlbmd0aCk7CisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludCByODE5Ml93eF9nZXRfbmljayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCXdycXUtPmRhdGEubGVuZ3RoID0gc3RybGVuKHByaXYtPm5pY2spOworCW1lbWNweShleHRyYSwgcHJpdi0+bmljaywgd3JxdS0+ZGF0YS5sZW5ndGgpOworCXdycXUtPmRhdGEuZmxhZ3MgPSAxOyAgIC8qIGFjdGl2ZSAqLworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9mcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisKKwlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCisJcmV0ID0gcnRsbGliX3d4X3NldF9mcmVxKHByaXYtPnJ0bGxpYiwgYSwgd3JxdSwgYik7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X2dldF9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlyZXR1cm4gcnRsbGliX3d4X2dldF9uYW1lKHByaXYtPnJ0bGxpYiwgaW5mbywgd3JxdSwgZXh0cmEpOworfQorCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJaWYgKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpCisJCXJldHVybiAwOworCisJaWYgKHdycXUtPmZyYWcuZGlzYWJsZWQpCisJCXByaXYtPnJ0bGxpYi0+ZnRzID0gREVGQVVMVF9GUkFHX1RIUkVTSE9MRDsKKwllbHNlIHsKKwkJaWYgKHdycXUtPmZyYWcudmFsdWUgPCBNSU5fRlJBR19USFJFU0hPTEQgfHwKKwkJICAgIHdycXUtPmZyYWcudmFsdWUgPiBNQVhfRlJBR19USFJFU0hPTEQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwcml2LT5ydGxsaWItPmZ0cyA9IHdycXUtPmZyYWcudmFsdWUgJiB+MHgxOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X2ZyYWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJd3JxdS0+ZnJhZy52YWx1ZSA9IHByaXYtPnJ0bGxpYi0+ZnRzOworCXdycXUtPmZyYWcuZml4ZWQgPSAwOwkvKiBubyBhdXRvIHNlbGVjdCAqLworCXdycXUtPmZyYWcuZGlzYWJsZWQgPSAod3JxdS0+ZnJhZy52YWx1ZSA9PSBERUZBVUxUX0ZSQUdfVEhSRVNIT0xEKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgdW5pb24gaXdyZXFfZGF0YSAqYXdycSwKKwkJCSBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCWlmICgocnRsbGliX2FjdF9zY2FubmluZyhwcml2LT5ydGxsaWIsIGZhbHNlKSkgJiYKKwkgICAgIShwcml2LT5ydGxsaWItPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0NBTikpIHsKKwkJOwkvKiBUT0RPIC0gZ2V0IHJpZCBvZiBpZiAqLworCX0KKworCWlmIChwcml2LT5iSHdSYWRpb09mZiA9PSB0cnVlKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisKKwlyZXQgPSBydGxsaWJfd3hfc2V0X3dhcChwcml2LT5ydGxsaWIsIGluZm8sIGF3cnEsIGV4dHJhKTsKKworCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKKworfQorCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJcmV0dXJuIHJ0bGxpYl93eF9nZXRfd2FwKHByaXYtPnJ0bGxpYiwgaW5mbywgd3JxdSwgZXh0cmEpOworfQorCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X2VuYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCXJldHVybiBydGxsaWJfd3hfZ2V0X2VuY29kZShwcml2LT5ydGxsaWIsIGluZm8sIHdycXUsIGtleSk7Cit9CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X2VuYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlpbnQgcmV0OworCisJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUgPSBwcml2LT5ydGxsaWI7CisJdTMyIGh3a2V5WzRdID0gezAsIDAsIDAsIDB9OworCXU4IG1hc2sgPSAweGZmOworCXUzMiBrZXlfaWR4ID0gMDsKKwl1OCB6ZXJvX2FkZHJbNF1bNl0gPSB7ezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAorCQkJICAgICB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMX0sCisJCQkgICAgIHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyfSwKKwkJCSAgICAgezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDN9IH07CisJaW50IGk7CisKKwlpZiAoKHJ0bGxpYl9hY3Rfc2Nhbm5pbmcocHJpdi0+cnRsbGliLCBmYWxzZSkpICYmCisJICAgIShwcml2LT5ydGxsaWItPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0NBTikpCisJCTsJLyogVE9ETyAtIGdldCByaWQgb2YgaWYgKi8KKwlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXByaXYtPnVwKQorCQlyZXR1cm4gLUVORVRET1dOOworCisJcHJpdi0+cnRsbGliLT53eF9zZXRfZW5jID0gMTsKKwlkb3duKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworCUlQU0xlYXZlKGRldik7CisJdXAoJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7CisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCVJUX1RSQUNFKENPTVBfU0VDLCAiU2V0dGluZyBTVyB3ZXAga2V5Iik7CisJcmV0ID0gcnRsbGliX3d4X3NldF9lbmNvZGUocHJpdi0+cnRsbGliLCBpbmZvLCB3cnF1LCBrZXkpOworCXVwKCZwcml2LT53eF9zZW0pOworCisKKwlpZiAod3JxdS0+ZW5jb2RpbmcuZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKKwkJaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPSBpZWVlLT5ncm91cF9rZXlfdHlwZSA9IEtFWV9UWVBFX05BOworCQlDYW1SZXNldEFsbEVudHJ5KGRldik7CisJCW1lbXNldChwcml2LT5ydGxsaWItPnN3Y2FtdGFibGUsIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHN3X2NhbV90YWJsZSkgKiAzMik7CisJCWdvdG8gZW5kX2h3X3NlYzsKKwl9CisJaWYgKHdycXUtPmVuY29kaW5nLmxlbmd0aCAhPSAwKSB7CisKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJaHdrZXlbaV0gfD0gIGtleVs0KmkrMF0mbWFzazsKKwkJCWlmIChpID09IDEgJiYgKDQgKiBpICsgMSkgPT0gd3JxdS0+ZW5jb2RpbmcubGVuZ3RoKQorCQkJCW1hc2sgPSAweDAwOworCQkJaWYgKGkgPT0gMyAmJiAoNCAqIGkgKyAxKSA9PSB3cnF1LT5lbmNvZGluZy5sZW5ndGgpCisJCQkJbWFzayA9IDB4MDA7CisJCQlod2tleVtpXSB8PSAoa2V5WzQgKiBpICsgMV0gJiBtYXNrKSA8PCA4OworCQkJaHdrZXlbaV0gfD0gKGtleVs0ICogaSArIDJdICYgbWFzaykgPDwgMTY7CisJCQlod2tleVtpXSB8PSAoa2V5WzQgKiBpICsgM10gJiBtYXNrKSA8PCAyNDsKKwkJfQorCisJCSNkZWZpbmUgQ09ORl9XRVA0MCAgMHg0CisJCSNkZWZpbmUgQ09ORl9XRVAxMDQgMHgxNAorCisJCXN3aXRjaCAod3JxdS0+ZW5jb2RpbmcuZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIHsKKwkJY2FzZSAwOgorCQkJa2V5X2lkeCA9IGllZWUtPnR4X2tleWlkeDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlrZXlfaWR4ID0gMDsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlrZXlfaWR4ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlrZXlfaWR4ID0gMjsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlrZXlfaWR4CT0gMzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJaWYgKHdycXUtPmVuY29kaW5nLmxlbmd0aCA9PSAweDUpIHsKKwkJCWllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gS0VZX1RZUEVfV0VQNDA7CisJCQlFbmFibGVIV1NlY3VyaXR5Q29uZmlnODE5MihkZXYpOworCQl9CisKKwkJZWxzZSBpZiAod3JxdS0+ZW5jb2RpbmcubGVuZ3RoID09IDB4ZCkgeworCQkJaWVlZS0+cGFpcndpc2Vfa2V5X3R5cGUgPSBLRVlfVFlQRV9XRVAxMDQ7CisJCQkJRW5hYmxlSFdTZWN1cml0eUNvbmZpZzgxOTIoZGV2KTsKKwkJCXNldEtleShkZXYsIGtleV9pZHgsIGtleV9pZHgsIEtFWV9UWVBFX1dFUDEwNCwKKwkJCSAgICAgICB6ZXJvX2FkZHJba2V5X2lkeF0sIDAsIGh3a2V5KTsKKwkJCXNldF9zd2NhbShkZXYsIGtleV9pZHgsIGtleV9pZHgsIEtFWV9UWVBFX1dFUDEwNCwKKwkJCQkgIHplcm9fYWRkcltrZXlfaWR4XSwgMCwgaHdrZXksIDApOworCQl9IGVsc2UgeworCQkJIHByaW50ayhLRVJOX0lORk8gIndyb25nIHR5cGUgaW4gV0VQLCBub3QgV0VQNDAgYW5kIFdFUDEwNFxuIik7CisJCX0KKwl9CisKK2VuZF9od19zZWM6CisJcHJpdi0+cnRsbGliLT53eF9zZXRfZW5jID0gMDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9zY2FuX3R5cGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmFhLAorCQkJCSAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqcCkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJaW50ICpwYXJtcyA9IChpbnQgKilwOworCWludCBtb2RlID0gcGFybXNbMF07CisKKwlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkKKwkJcmV0dXJuIDA7CisKKwlwcml2LT5ydGxsaWItPmFjdGl2ZV9zY2FuID0gbW9kZTsKKworCXJldHVybiAxOworfQorCisKKworI2RlZmluZSBSODE5Ml9NQVhfUkVUUlkgMjU1CitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9yZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCWludCBlcnIgPSAwOworCisJaWYgKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCWlmICh3cnF1LT5yZXRyeS5mbGFncyAmIElXX1JFVFJZX0xJRkVUSU1FIHx8CisJICAgIHdycXUtPnJldHJ5LmRpc2FibGVkKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisJaWYgKCEod3JxdS0+cmV0cnkuZmxhZ3MgJiBJV19SRVRSWV9MSU1JVCkpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCWlmICh3cnF1LT5yZXRyeS52YWx1ZSA+IFI4MTkyX01BWF9SRVRSWSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCWlmICh3cnF1LT5yZXRyeS5mbGFncyAmIElXX1JFVFJZX01BWCkgeworCQlwcml2LT5yZXRyeV9ydHMgPSB3cnF1LT5yZXRyeS52YWx1ZTsKKwkJRE1FU0coIlNldHRpbmcgcmV0cnkgZm9yIFJUUy9DVFMgZGF0YSB0byAlZCIsCisJCSAgICAgIHdycXUtPnJldHJ5LnZhbHVlKTsKKworCX0gZWxzZSB7CisJCXByaXYtPnJldHJ5X2RhdGEgPSB3cnF1LT5yZXRyeS52YWx1ZTsKKwkJRE1FU0coIlNldHRpbmcgcmV0cnkgZm9yIG5vbiBSVFMvQ1RTIGRhdGEgdG8gJWQiLAorCQkgICAgICB3cnF1LT5yZXRyeS52YWx1ZSk7CisJfQorCisKKwlydGw4MTkyX2NvbW1pdChkZXYpOworZXhpdDoKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X3JldHJ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisKKworCXdycXUtPnJldHJ5LmRpc2FibGVkID0gMDsgLyogY2FuJ3QgYmUgZGlzYWJsZWQgKi8KKworCWlmICgod3JxdS0+cmV0cnkuZmxhZ3MgJiBJV19SRVRSWV9UWVBFKSA9PQorCSAgICBJV19SRVRSWV9MSUZFVElNRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAod3JxdS0+cmV0cnkuZmxhZ3MgJiBJV19SRVRSWV9NQVgpIHsKKwkJd3JxdS0+cmV0cnkuZmxhZ3MgPSBJV19SRVRSWV9MSU1JVCAmIElXX1JFVFJZX01BWDsKKwkJd3JxdS0+cmV0cnkudmFsdWUgPSBwcml2LT5yZXRyeV9ydHM7CisJfSBlbHNlIHsKKwkJd3JxdS0+cmV0cnkuZmxhZ3MgPSBJV19SRVRSWV9MSU1JVCAmIElXX1JFVFJZX01JTjsKKwkJd3JxdS0+cmV0cnkudmFsdWUgPSBwcml2LT5yZXRyeV9kYXRhOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByODE5Ml93eF9nZXRfc2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisJaWYgKHByaXYtPnJmX3NldF9zZW5zID09IE5VTEwpCisJCXJldHVybiAtMTsgLyogd2UgaGF2ZSBub3QgdGhpcyBzdXBwb3J0IGZvciB0aGlzIHJhZGlvICovCisJd3JxdS0+c2Vucy52YWx1ZSA9IHByaXYtPnNlbnM7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCByODE5Ml93eF9zZXRfc2VucyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisKKwlzaG9ydCBlcnIgPSAwOworCisJaWYgKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlpZiAocHJpdi0+cmZfc2V0X3NlbnMgPT0gTlVMTCkgeworCQllcnIgPSAtMTsgLyogd2UgaGF2ZSBub3QgdGhpcyBzdXBwb3J0IGZvciB0aGlzIHJhZGlvICovCisJCWdvdG8gZXhpdDsKKwl9CisJaWYgKHByaXYtPnJmX3NldF9zZW5zKGRldiwgd3JxdS0+c2Vucy52YWx1ZSkgPT0gMCkKKwkJcHJpdi0+c2VucyA9IHdycXUtPnNlbnMudmFsdWU7CisJZWxzZQorCQllcnIgPSAtRUlOVkFMOworCitleGl0OgorCXVwKCZwcml2LT53eF9zZW0pOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCByODE5Ml93eF9zZXRfZW5jX2V4dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gcHJpdi0+cnRsbGliOworCisJaWYgKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXByaXYtPnJ0bGxpYi0+d3hfc2V0X2VuYyA9IDE7CisJZG93bigmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKKwlJUFNMZWF2ZShkZXYpOworCXVwKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworCisJcmV0ID0gcnRsbGliX3d4X3NldF9lbmNvZGVfZXh0KGllZWUsIGluZm8sIHdycXUsIGV4dHJhKTsKKwl7CisJCXU4IGJyb2FkY2FzdF9hZGRyWzZdID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworCQl1OCB6ZXJvWzZdID0gezB9OworCQl1MzIga2V5WzRdID0gezB9OworCQlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisJCXN0cnVjdCBpd19wb2ludCAqZW5jb2RpbmcgPSAmd3JxdS0+ZW5jb2Rpbmc7CisJCXU4IGlkeCA9IDAsIGFsZyA9IDAsIGdyb3VwID0gMDsKKwkJaWYgKChlbmNvZGluZy0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHx8CisJCSAgICAgZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19OT05FKSB7CisJCQlpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IGllZWUtPmdyb3VwX2tleV90eXBlCisJCQkJCQk9IEtFWV9UWVBFX05BOworCQkJQ2FtUmVzZXRBbGxFbnRyeShkZXYpOworCQkJbWVtc2V0KHByaXYtPnJ0bGxpYi0+c3djYW10YWJsZSwgMCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IHN3X2NhbV90YWJsZSkgKiAzMik7CisJCQlnb3RvIGVuZF9od19zZWM7CisJCX0KKwkJYWxnID0gKGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfQ0NNUCkgPyBLRVlfVFlQRV9DQ01QIDoKKwkJICAgICAgZXh0LT5hbGc7CisJCWlkeCA9IGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwkJaWYgKGlkeCkKKwkJCWlkeC0tOworCQlncm91cCA9IGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9HUk9VUF9LRVk7CisKKwkJaWYgKCghZ3JvdXApIHx8IChJV19NT0RFX0FESE9DID09IGllZWUtPml3X21vZGUpIHx8CisJCSAgICAoYWxnID09ICBLRVlfVFlQRV9XRVA0MCkpIHsKKwkJCWlmICgoZXh0LT5rZXlfbGVuID09IDEzKSAmJiAoYWxnID09IEtFWV9UWVBFX1dFUDQwKSkKKwkJCQlhbGcgPSBLRVlfVFlQRV9XRVAxMDQ7CisJCQlpZWVlLT5wYWlyd2lzZV9rZXlfdHlwZSA9IGFsZzsKKwkJCUVuYWJsZUhXU2VjdXJpdHlDb25maWc4MTkyKGRldik7CisJCX0KKwkJbWVtY3B5KCh1OCAqKWtleSwgZXh0LT5rZXksIDE2KTsKKworCQlpZiAoKGFsZyAmIEtFWV9UWVBFX1dFUDQwKSAmJiAoaWVlZS0+YXV0aF9tb2RlICE9IDIpKSB7CisJCQlpZiAoZXh0LT5rZXlfbGVuID09IDEzKQorCQkJCWllZWUtPnBhaXJ3aXNlX2tleV90eXBlID0gYWxnID0gS0VZX1RZUEVfV0VQMTA0OworCQkJc2V0S2V5KGRldiwgaWR4LCBpZHgsIGFsZywgemVybywgMCwga2V5KTsKKwkJCXNldF9zd2NhbShkZXYsIGlkeCwgaWR4LCBhbGcsIHplcm8sIDAsIGtleSwgMCk7CisJCX0gZWxzZSBpZiAoZ3JvdXApIHsKKwkJCWllZWUtPmdyb3VwX2tleV90eXBlID0gYWxnOworCQkJc2V0S2V5KGRldiwgaWR4LCBpZHgsIGFsZywgYnJvYWRjYXN0X2FkZHIsIDAsIGtleSk7CisJCQlzZXRfc3djYW0oZGV2LCBpZHgsIGlkeCwgYWxnLCBicm9hZGNhc3RfYWRkciwgMCwKKwkJCQkgIGtleSwgMCk7CisJCX0gZWxzZSB7CisJCQlpZiAoKGllZWUtPnBhaXJ3aXNlX2tleV90eXBlID09IEtFWV9UWVBFX0NDTVApICYmCisJCQkgICAgIGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0KQorCQkJCXdyaXRlX25pY19ieXRlKGRldiwgMHgxNzMsIDEpOworCQkJc2V0S2V5KGRldiwgNCwgaWR4LCBhbGcsICh1OCAqKWllZWUtPmFwX21hY19hZGRyLAorCQkJICAgICAgIDAsIGtleSk7CisJCQlzZXRfc3djYW0oZGV2LCA0LCBpZHgsIGFsZywgKHU4ICopaWVlZS0+YXBfbWFjX2FkZHIsCisJCQkJICAwLCBrZXksIDApOworCQl9CisKKworCX0KKworZW5kX2h3X3NlYzoKKwlwcml2LT5ydGxsaWItPnd4X3NldF9lbmMgPSAwOworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiByZXQ7CisKK30KK3N0YXRpYyBpbnQgcjgxOTJfd3hfc2V0X2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9IDA7CisKKwlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CisKKwlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkKKwkJcmV0dXJuIDA7CisKKwlkb3duKCZwcml2LT53eF9zZW0pOworCXJldCA9IHJ0bGxpYl93eF9zZXRfYXV0aChwcml2LT5ydGxsaWIsIGluZm8sICYoZGF0YS0+cGFyYW0pLCBleHRyYSk7CisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByODE5Ml93eF9zZXRfbWxtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKworCWludCByZXQgPSAwOworCisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCisJaWYgKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpCisJCXJldHVybiAwOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKwlyZXQgPSBydGxsaWJfd3hfc2V0X21sbWUocHJpdi0+cnRsbGliLCBpbmZvLCB3cnF1LCBleHRyYSk7CisJdXAoJnByaXYtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByODE5Ml93eF9zZXRfZ2VuX2llKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICpkYXRhLCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKworCWlmIChwcml2LT5iSHdSYWRpb09mZiA9PSB0cnVlKQorCQlyZXR1cm4gMDsKKworCWRvd24oJnByaXYtPnd4X3NlbSk7CisJcmV0ID0gcnRsbGliX3d4X3NldF9nZW5faWUocHJpdi0+cnRsbGliLCBleHRyYSwgZGF0YS0+ZGF0YS5sZW5ndGgpOworCXVwKCZwcml2LT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X2dlbl9pZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqZGF0YSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gcHJpdi0+cnRsbGliOworCisJaWYgKGllZWUtPndwYV9pZV9sZW4gPT0gMCB8fCBpZWVlLT53cGFfaWUgPT0gTlVMTCkgeworCQlkYXRhLT5kYXRhLmxlbmd0aCA9IDA7CisJCXJldHVybiAwOworCX0KKworCWlmIChkYXRhLT5kYXRhLmxlbmd0aCA8IGllZWUtPndwYV9pZV9sZW4pCisJCXJldHVybiAtRTJCSUc7CisKKwlkYXRhLT5kYXRhLmxlbmd0aCA9IGllZWUtPndwYV9pZV9sZW47CisJbWVtY3B5KGV4dHJhLCBpZWVlLT53cGFfaWUsIGllZWUtPndwYV9pZV9sZW4pOworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgT0lEX1JUX0lOVEVMX1BST01JU0NVT1VTX01PREUJMHhGRjAxMDFGNgorCitzdGF0aWMgaW50IHI4MTkyX3d4X3NldF9Qcm9taXNjdW91c01vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gcHJpdi0+cnRsbGliOworCisJdTMyICppbmZvX2J1ZiA9ICh1MzIgKikod3JxdS0+ZGF0YS5wb2ludGVyKTsKKworCXUzMiBvaWQgPSBpbmZvX2J1ZlswXTsKKwl1MzIgYlByb21pc2N1b3VzT24gPSBpbmZvX2J1ZlsxXTsKKwl1MzIgYkZpbHRlclNvdXJjZVN0YXRpb25GcmFtZSA9IGluZm9fYnVmWzJdOworCisJaWYgKE9JRF9SVF9JTlRFTF9QUk9NSVNDVU9VU19NT0RFID09IG9pZCkgeworCQlpZWVlLT5JbnRlbFByb21pc2N1b3VzTW9kZUluZm8uYlByb21pc2N1b3VzT24gPQorCQkJCQkoYlByb21pc2N1b3VzT24pID8gKHRydWUpIDogKGZhbHNlKTsKKwkJaWVlZS0+SW50ZWxQcm9taXNjdW91c01vZGVJbmZvLmJGaWx0ZXJTb3VyY2VTdGF0aW9uRnJhbWUgPQorCQkJKGJGaWx0ZXJTb3VyY2VTdGF0aW9uRnJhbWUpID8gKHRydWUpIDogKGZhbHNlKTsKKwkJCShiUHJvbWlzY3VvdXNPbikgPworCQkJKHJ0bGxpYl9FbmFibGVJbnRlbFByb21pc2N1b3VzTW9kZShkZXYsIGZhbHNlKSkgOgorCQkJKHJ0bGxpYl9EaXNhYmxlSW50ZWxQcm9taXNjdW91c01vZGUoZGV2LCBmYWxzZSkpOworCisJCXByaW50ayhLRVJOX0lORk8gIj09PT09PT0+JXMoKSwgb24gPSAlZCwgZmlsdGVyIHNyYyBzdGEgPSAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBiUHJvbWlzY3VvdXNPbiwgYkZpbHRlclNvdXJjZVN0YXRpb25GcmFtZSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgcjgxOTJfd3hfZ2V0X1Byb21pc2N1b3VzTW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gcHJpdi0+cnRsbGliOworCisJZG93bigmcHJpdi0+d3hfc2VtKTsKKworCXNucHJpbnRmKGV4dHJhLCA0NSwgIlByb21pc2N1b3VzTW9kZTolZCwgRmlsdGVyU3JjU1RBRnJhbWU6JWQiLAorCQkgaWVlZS0+SW50ZWxQcm9taXNjdW91c01vZGVJbmZvLmJQcm9taXNjdW91c09uLAorCQkgaWVlZS0+SW50ZWxQcm9taXNjdW91c01vZGVJbmZvLmJGaWx0ZXJTb3VyY2VTdGF0aW9uRnJhbWUpOworCXdycXUtPmRhdGEubGVuZ3RoID0gc3RybGVuKGV4dHJhKSArIDE7CisKKwl1cCgmcHJpdi0+d3hfc2VtKTsKKworCXJldHVybiAwOworfQorCisKKyNkZWZpbmUgSVdfSU9DVEwoeCkgWyh4KS1TSU9DU0lXQ09NTUlUXQorc3RhdGljIGl3X2hhbmRsZXIgcjgxOTJfd3hfaGFuZGxlcnNbXSA9IHsKKwlJV19JT0NUTChTSU9DR0lXTkFNRSkgPSByODE5Ml93eF9nZXRfbmFtZSwKKwlJV19JT0NUTChTSU9DU0lXRlJFUSkgPSByODE5Ml93eF9zZXRfZnJlcSwKKwlJV19JT0NUTChTSU9DR0lXRlJFUSkgPSByODE5Ml93eF9nZXRfZnJlcSwKKwlJV19JT0NUTChTSU9DU0lXTU9ERSkgPSByODE5Ml93eF9zZXRfbW9kZSwKKwlJV19JT0NUTChTSU9DR0lXTU9ERSkgPSByODE5Ml93eF9nZXRfbW9kZSwKKwlJV19JT0NUTChTSU9DU0lXU0VOUykgPSByODE5Ml93eF9zZXRfc2VucywKKwlJV19JT0NUTChTSU9DR0lXU0VOUykgPSByODE5Ml93eF9nZXRfc2VucywKKwlJV19JT0NUTChTSU9DR0lXUkFOR0UpID0gcnRsODE5Ml93eF9nZXRfcmFuZ2UsCisJSVdfSU9DVEwoU0lPQ1NJV0FQKSA9IHI4MTkyX3d4X3NldF93YXAsCisJSVdfSU9DVEwoU0lPQ0dJV0FQKSA9IHI4MTkyX3d4X2dldF93YXAsCisJSVdfSU9DVEwoU0lPQ1NJV1NDQU4pID0gcjgxOTJfd3hfc2V0X3NjYW4sCisJSVdfSU9DVEwoU0lPQ0dJV1NDQU4pID0gcjgxOTJfd3hfZ2V0X3NjYW4sCisJSVdfSU9DVEwoU0lPQ1NJV0VTU0lEKSA9IHI4MTkyX3d4X3NldF9lc3NpZCwKKwlJV19JT0NUTChTSU9DR0lXRVNTSUQpID0gcjgxOTJfd3hfZ2V0X2Vzc2lkLAorCUlXX0lPQ1RMKFNJT0NTSVdOSUNLTikgPSByODE5Ml93eF9zZXRfbmljaywKKwkJSVdfSU9DVEwoU0lPQ0dJV05JQ0tOKSA9IHI4MTkyX3d4X2dldF9uaWNrLAorCUlXX0lPQ1RMKFNJT0NTSVdSQVRFKSA9IHI4MTkyX3d4X3NldF9yYXRlLAorCUlXX0lPQ1RMKFNJT0NHSVdSQVRFKSA9IHI4MTkyX3d4X2dldF9yYXRlLAorCUlXX0lPQ1RMKFNJT0NTSVdSVFMpID0gcjgxOTJfd3hfc2V0X3J0cywKKwlJV19JT0NUTChTSU9DR0lXUlRTKSA9IHI4MTkyX3d4X2dldF9ydHMsCisJSVdfSU9DVEwoU0lPQ1NJV0ZSQUcpID0gcjgxOTJfd3hfc2V0X2ZyYWcsCisJSVdfSU9DVEwoU0lPQ0dJV0ZSQUcpID0gcjgxOTJfd3hfZ2V0X2ZyYWcsCisJSVdfSU9DVEwoU0lPQ1NJV1JFVFJZKSA9IHI4MTkyX3d4X3NldF9yZXRyeSwKKwlJV19JT0NUTChTSU9DR0lXUkVUUlkpID0gcjgxOTJfd3hfZ2V0X3JldHJ5LAorCUlXX0lPQ1RMKFNJT0NTSVdFTkNPREUpID0gcjgxOTJfd3hfc2V0X2VuYywKKwlJV19JT0NUTChTSU9DR0lXRU5DT0RFKSA9IHI4MTkyX3d4X2dldF9lbmMsCisJSVdfSU9DVEwoU0lPQ1NJV1BPV0VSKSA9IHI4MTkyX3d4X3NldF9wb3dlciwKKwlJV19JT0NUTChTSU9DR0lXUE9XRVIpID0gcjgxOTJfd3hfZ2V0X3Bvd2VyLAorCUlXX0lPQ1RMKFNJT0NTSVdHRU5JRSkgPSByODE5Ml93eF9zZXRfZ2VuX2llLAorCUlXX0lPQ1RMKFNJT0NHSVdHRU5JRSkgPSByODE5Ml93eF9nZXRfZ2VuX2llLAorCUlXX0lPQ1RMKFNJT0NTSVdNTE1FKSA9IHI4MTkyX3d4X3NldF9tbG1lLAorCUlXX0lPQ1RMKFNJT0NTSVdBVVRIKSA9IHI4MTkyX3d4X3NldF9hdXRoLAorCUlXX0lPQ1RMKFNJT0NTSVdFTkNPREVFWFQpID0gcjgxOTJfd3hfc2V0X2VuY19leHQsCit9OworCisvKgorICogdGhlIGZvbGxvd2luZyBydWxlIG5lZWQgdG8gYmUgZm9sbHdpbmcsCisgKiBPZGQgOiBnZXQgKHdvcmxkIGFjY2VzcyksCisgKiBldmVuIDogc2V0IChyb290IGFjY2VzcykKKyAqICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGl3X3ByaXZfYXJncyByODE5Ml9wcml2YXRlX2FyZ3NbXSA9IHsKKwl7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4MCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJzZXRfZGVidWdmbGFnIgorCX0sIHsKKwkJU0lPQ0lXRklSU1RQUklWICsgMHgxLAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMSwgMCwgImFjdGl2ZXNjYW4iCisJfSwgeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDIsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAicmF3dHgiCisJfSwgeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDMsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiZm9yY2VyZXNldCIKKwl9LCB7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4NCwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDEsIDAsICJmb3JjZV9taWNfZXJyb3IiCisJfSwgeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDUsCisJCUlXX1BSSVZfVFlQRV9OT05FLCBJV19QUklWX1RZUEVfSU5UfElXX1BSSVZfU0laRV9GSVhFRHwxLAorCQkiZmlybV92ZXIiCisJfSwgeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDYsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUR8MSwgSVdfUFJJVl9UWVBFX05PTkUsCisJCSJzZXRfcG93ZXIiCisJfSwgeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDksCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUR8MSwgSVdfUFJJVl9UWVBFX05PTkUsCisJCSJyYWRpbyIKKwl9LCB7CisJCVNJT0NJV0ZJUlNUUFJJViArIDB4YSwKKwkJSVdfUFJJVl9UWVBFX0lOVCB8IElXX1BSSVZfU0laRV9GSVhFRHwxLCBJV19QUklWX1RZUEVfTk9ORSwKKwkJImxwc19pbnRlcnYiCisJfSwgeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweGIsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUR8MSwgSVdfUFJJVl9UWVBFX05PTkUsCisJCSJscHNfZm9yY2UiCisJfSwgeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweGMsCisJCTAsIElXX1BSSVZfVFlQRV9DSEFSfDIwNDcsICJhZGhvY19wZWVyX2xpc3QiCisJfSwgeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDE2LAorCQlJV19QUklWX1RZUEVfSU5UIHwgSVdfUFJJVl9TSVpFX0ZJWEVEIHwgMywgMCwgInNldHByb21pc2MiCisJfSwgeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDE3LAorCQkwLCBJV19QUklWX1RZUEVfQ0hBUiB8IElXX1BSSVZfU0laRV9GSVhFRCB8IDQ1LCAiZ2V0cHJvbWlzYyIKKwl9CisKK307CisKK3N0YXRpYyBpd19oYW5kbGVyIHI4MTkyX3ByaXZhdGVfaGFuZGxlcltdID0geworCShpd19oYW5kbGVyKXI4MTkyX3d4X3NldF9kZWJ1Z2ZsYWcsICAgLypTSU9DSVdTRUNPTkRQUklWKi8KKwkoaXdfaGFuZGxlcilyODE5Ml93eF9zZXRfc2Nhbl90eXBlLAorCShpd19oYW5kbGVyKXI4MTkyX3d4X3NldF9yYXd0eCwKKwkoaXdfaGFuZGxlcilyODE5Ml93eF9mb3JjZV9yZXNldCwKKwkoaXdfaGFuZGxlcilyODE5Ml93eF9mb3JjZV9taWNfZXJyb3IsCisJKGl3X2hhbmRsZXIpcjgxOTFzZV93eF9nZXRfZmlybV92ZXJzaW9uLAorCShpd19oYW5kbGVyKXI4MTkyX3d4X2FkYXB0ZXJfcG93ZXJfc3RhdHVzLAorCShpd19oYW5kbGVyKU5VTEwsCisJKGl3X2hhbmRsZXIpTlVMTCwKKwkoaXdfaGFuZGxlcilyODE5MnNlX3d4X3NldF9yYWRpbywKKwkoaXdfaGFuZGxlcilyODE5MnNlX3d4X3NldF9scHNfYXdha2VfaW50ZXJ2YWwsCisJKGl3X2hhbmRsZXIpcjgxOTJzZV93eF9zZXRfZm9yY2VfbHBzLAorCShpd19oYW5kbGVyKXI4MTkyX3d4X2dldF9hZGhvY19wZWVycywKKwkoaXdfaGFuZGxlcilOVUxMLAorCShpd19oYW5kbGVyKU5VTEwsCisJKGl3X2hhbmRsZXIpTlVMTCwKKwkoaXdfaGFuZGxlcilOVUxMLAorCShpd19oYW5kbGVyKU5VTEwsCisJKGl3X2hhbmRsZXIpTlVMTCwKKwkoaXdfaGFuZGxlcilOVUxMLAorCShpd19oYW5kbGVyKU5VTEwsCisJKGl3X2hhbmRsZXIpTlVMTCwKKwkoaXdfaGFuZGxlcilyODE5Ml93eF9zZXRfUHJvbWlzY3VvdXNNb2RlLAorCShpd19oYW5kbGVyKXI4MTkyX3d4X2dldF9Qcm9taXNjdW91c01vZGUsCit9OworCitzdGF0aWMgc3RydWN0IGl3X3N0YXRpc3RpY3MgKnI4MTkyX2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSA9IHByaXYtPnJ0bGxpYjsKKwlzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqd3N0YXRzID0gJnByaXYtPndzdGF0czsKKwlpbnQgdG1wX2xldmVsID0gMDsKKwlpbnQgdG1wX3F1YWwgPSAwOworCWludCB0bXBfbm9pc2UgPSAwOworCWlmIChpZWVlLT5zdGF0ZSA8IFJUTExJQl9MSU5LRUQpIHsKKwkJd3N0YXRzLT5xdWFsLnF1YWwgPSAxMDsKKwkJd3N0YXRzLT5xdWFsLmxldmVsID0gMDsKKwkJd3N0YXRzLT5xdWFsLm5vaXNlID0gLTEwMDsKKwkJd3N0YXRzLT5xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX0FMTF9VUERBVEVEIHwgSVdfUVVBTF9EQk07CisJCXJldHVybiB3c3RhdHM7CisJfQorCisJdG1wX2xldmVsID0gKCZpZWVlLT5jdXJyZW50X25ldHdvcmspLT5zdGF0cy5yc3NpOworCXRtcF9xdWFsID0gKCZpZWVlLT5jdXJyZW50X25ldHdvcmspLT5zdGF0cy5zaWduYWw7CisJdG1wX25vaXNlID0gKCZpZWVlLT5jdXJyZW50X25ldHdvcmspLT5zdGF0cy5ub2lzZTsKKworCXdzdGF0cy0+cXVhbC5sZXZlbCA9IHRtcF9sZXZlbDsKKwl3c3RhdHMtPnF1YWwucXVhbCA9IHRtcF9xdWFsOworCXdzdGF0cy0+cXVhbC5ub2lzZSA9IHRtcF9ub2lzZTsKKwl3c3RhdHMtPnF1YWwudXBkYXRlZCA9IElXX1FVQUxfQUxMX1VQREFURUQgfCBJV19RVUFMX0RCTTsKKwlyZXR1cm4gd3N0YXRzOworfQorCitzdHJ1Y3QgaXdfaGFuZGxlcl9kZWYgIHI4MTkyX3d4X2hhbmRsZXJzX2RlZiA9IHsKKwkuc3RhbmRhcmQgPSByODE5Ml93eF9oYW5kbGVycywKKwkubnVtX3N0YW5kYXJkID0gc2l6ZW9mKHI4MTkyX3d4X2hhbmRsZXJzKSAvIHNpemVvZihpd19oYW5kbGVyKSwKKwkucHJpdmF0ZSA9IHI4MTkyX3ByaXZhdGVfaGFuZGxlciwKKwkubnVtX3ByaXZhdGUgPSBzaXplb2YocjgxOTJfcHJpdmF0ZV9oYW5kbGVyKSAvIHNpemVvZihpd19oYW5kbGVyKSwKKwkubnVtX3ByaXZhdGVfYXJncyA9IHNpemVvZihyODE5Ml9wcml2YXRlX2FyZ3MpIC8KKwkJCSAgICBzaXplb2Yoc3RydWN0IGl3X3ByaXZfYXJncyksCisJLmdldF93aXJlbGVzc19zdGF0cyA9IHI4MTkyX2dldF93aXJlbGVzc19zdGF0cywKKwkucHJpdmF0ZV9hcmdzID0gKHN0cnVjdCBpd19wcml2X2FyZ3MgKilyODE5Ml9wcml2YXRlX2FyZ3MsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF93eC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bF93eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNTFhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsX3d4LmgKQEAgLTAsMCArMSwzMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogd2xhbmZhZSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBSODE5eF9XWF9ICisjZGVmaW5lIFI4MTl4X1dYX0gKKworc3RydWN0IG5ldF9kZXZpY2U7CitzdHJ1Y3QgaXdfaGFuZGxlcl9kZWY7CitzdHJ1Y3QgaXdfc3RhdGlzdGljczsKKworZXh0ZXJuIHN0cnVjdCBpd19oYW5kbGVyX2RlZiByODE5Ml93eF9oYW5kbGVyc19kZWY7CitzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcjgxOTJfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwordTE2IHJ0bDgxOTJfMTFuX3VzZXJfc2hvd19yYXRlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUyNTk3NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWIuaApAQCAtMCwwICsxLDMxNDQgQEAKKy8qCisgKiBNZXJnZWQgd2l0aCBtYWlubGluZSBydGxsaWIuaCBpbiBBdWcgMjAwNC4gIE9yaWdpbmFsIGllZWU4MDJfMTEKKyAqIHJlbWFpbnMgY29weXJpZ2h0IGJ5IHRoZSBvcmlnaW5hbCBhdXRob3JzCisgKgorICogUG9ydGlvbnMgb2YgdGhlIG1lcmdlZCBjb2RlIGFyZSBiYXNlZCBvbiBIb3N0IEFQIChzb2Z0d2FyZSB3aXJlbGVzcworICogTEFOIGFjY2VzcyBwb2ludCkgZHJpdmVyIGZvciBJbnRlcnNpbCBQcmlzbTIvMi41LzMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqCisgKiBBZGFwdGlvbiB0byBhIGdlbmVyaWMgSUVFRSA4MDIuMTEgc3RhY2sgYnkgSmFtZXMgS2V0cmVub3MKKyAqIDxqa2V0cmVub0BsaW51eC5pbnRlbC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIEludGVsIENvcnBvcmF0aW9uCisgKgorICogTW9kaWZpZWQgZm9yIFJlYWx0ZWsncyB3aS1maSBjYXJkcyBieSBBbmRyZWEgTWVyZWxsbworICogPGFuZHJlYW1ybEB0aXNjYWxpLml0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgUlRMTElCX0gKKyNkZWZpbmUgUlRMTElCX0gKKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPiAvKiBFVEhfQUxFTiAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPiAgIC8qIEFSUkFZX1NJWkUgKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKworI2luY2x1ZGUgInJ0bDgxOXhfSFQuaCIKKyNpbmNsdWRlICJydGw4MTl4X0JBLmgiCisjaW5jbHVkZSAicnRsODE5eF9UUy5oIgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+IC8qIEFSUEhSRF9FVEhFUiAqLworCisjZGVmaW5lIE1BWF9QUkVDTURfQ05UIDE2CisjZGVmaW5lIE1BWF9SRkRFUEVORENNRF9DTlQgMTYKKyNkZWZpbmUgTUFYX1BPU1RDTURfQ05UIDE2CisKKyNpZm5kZWYgV0lSRUxFU1NfU1BZCisjZGVmaW5lIFdJUkVMRVNTX1NQWQorI2VuZGlmCisjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KKworI2lmbmRlZiBJV19NT0RFX01PTklUT1IKKyNkZWZpbmUgSVdfTU9ERV9NT05JVE9SIDYKKyNlbmRpZgorCisjaWZuZGVmIElXRVZDVVNUT00KKyNkZWZpbmUgSVdFVkNVU1RPTSAweDhjMDIKKyNlbmRpZgorCisjaWZuZGVmIElXX0NVU1RPTV9NQVgKKy8qIE1heCBudW1iZXIgb2YgY2hhciBpbiBjdXN0b20gZXZlbnQgLSB1c2UgbXVsdGlwbGUgb2YgdGhlbSBpZiBuZWVkZWQgKi8KKyNkZWZpbmUgSVdfQ1VTVE9NX01BWAkyNTYJLyogSW4gYnl0ZXMgKi8KKyNlbmRpZgorCisjaWZuZGVmIGNvbnRhaW5lcl9vZgorLyoqCisgKiBjb250YWluZXJfb2YgLSBjYXN0IGEgbWVtYmVyIG9mIGEgc3RydWN0dXJlIG91dCB0byB0aGUgY29udGFpbmluZyBzdHJ1Y3R1cmUKKyAqCisgKiBAcHRyOgl0aGUgcG9pbnRlciB0byB0aGUgbWVtYmVyLgorICogQHR5cGU6ICAgICAgIHRoZSB0eXBlIG9mIHRoZSBjb250YWluZXIgc3RydWN0IHRoaXMgaXMgZW1iZWRkZWQgaW4uCisgKiBAbWVtYmVyOiAgICAgdGhlIG5hbWUgb2YgdGhlIG1lbWJlciB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKi8KKyNkZWZpbmUgY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKSAoewkJICAgICAgXAorCWNvbnN0IHR5cGVvZigoKHR5cGUgKikwKS0+bWVtYmVyKSpfX21wdHIgPSAocHRyKTsgICAgXAorCSh0eXBlICopKChjaGFyICopX19tcHRyIC0gb2Zmc2V0b2YodHlwZSwgbWVtYmVyKSk7IH0pCisjZW5kaWYKKworI2RlZmluZSBza2JfdGFpbF9wb2ludGVyX3JzbChza2IpIHNrYl90YWlsX3BvaW50ZXIoc2tiKQorCisjZGVmaW5lIEVYUE9SVF9TWU1CT0xfUlNMKHgpIEVYUE9SVF9TWU1CT0woeCkKKworCisjZGVmaW5lIHF1ZXVlX2RlbGF5ZWRfd29ya19yc2woeCwgeSwgeikgcXVldWVfZGVsYXllZF93b3JrKHgsIHksIHopCisjZGVmaW5lIElOSVRfREVMQVlFRF9XT1JLX1JTTCh4LCB5LCB6KSBJTklUX0RFTEFZRURfV09SSyh4LCB5KQorCisjZGVmaW5lIHF1ZXVlX3dvcmtfcnNsKHgsIHkpIHF1ZXVlX3dvcmsoeCwgeSkKKyNkZWZpbmUgSU5JVF9XT1JLX1JTTCh4LCB5LCB6KSBJTklUX1dPUksoeCwgeSkKKworI2RlZmluZSBjb250YWluZXJfb2Zfd29ya19yc2woeCwgeSwgeikgY29udGFpbmVyX29mKHgsIHksIHopCisjZGVmaW5lIGNvbnRhaW5lcl9vZl9kd29ya19yc2woeCwgeSwgeikJCQkJXAorCWNvbnRhaW5lcl9vZihjb250YWluZXJfb2YoeCwgc3RydWN0IGRlbGF5ZWRfd29yaywgd29yayksIHksIHopCisKKyNkZWZpbmUgaXdlX3N0cmVhbV9hZGRfZXZlbnRfcnNsKGluZm8sIHN0YXJ0LCBzdG9wLCBpd2UsIGxlbikJXAorCWl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIHN0YXJ0LCBzdG9wLCBpd2UsIGxlbikKKworI2RlZmluZSBpd2Vfc3RyZWFtX2FkZF9wb2ludF9yc2woaW5mbywgc3RhcnQsIHN0b3AsIGl3ZSwgcCkJXAorCWl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIHN0YXJ0LCBzdG9wLCBpd2UsIHApCisKKyNkZWZpbmUgdXNiX2FsbG9jX3VyYl9yc2woeCwgeSkgdXNiX2FsbG9jX3VyYih4LCB5KQorI2RlZmluZSB1c2Jfc3VibWl0X3VyYl9yc2woeCwgeSkgdXNiX3N1Ym1pdF91cmIoeCwgeSkKKworc3RhdGljIGlubGluZSB2b2lkICpuZXRkZXZfcHJpdl9yc2woc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gbmV0ZGV2X3ByaXYoZGV2KTsKK30KKworI2RlZmluZSBLRVlfVFlQRV9OQQkJMHgwCisjZGVmaW5lIEtFWV9UWVBFX1dFUDQwCQkweDEKKyNkZWZpbmUgS0VZX1RZUEVfVEtJUAkJMHgyCisjZGVmaW5lIEtFWV9UWVBFX0NDTVAJCTB4NAorI2RlZmluZSBLRVlfVFlQRV9XRVAxMDQJCTB4NQorLyogYWRkZWQgZm9yIHJ0bDgxOXggdHggcHJvY2VkdXJlICovCisjZGVmaW5lIE1BWF9RVUVVRV9TSVpFCQkweDEwCisKKyNkZWZpbmUgQktfUVVFVUUJCQkgICAgICAgMAorI2RlZmluZSBCRV9RVUVVRQkJCSAgICAgICAxCisjZGVmaW5lIFZJX1FVRVVFCQkJICAgICAgIDIKKyNkZWZpbmUgVk9fUVVFVUUJCQkgICAgICAgMworI2RlZmluZSBIQ0NBX1FVRVVFCQkJICAgICA0CisjZGVmaW5lIFRYQ01EX1FVRVVFCQkJICAgIDUKKyNkZWZpbmUgTUdOVF9RVUVVRQkJCSAgICAgNgorI2RlZmluZSBISUdIX1FVRVVFCQkJICAgICA3CisjZGVmaW5lIEJFQUNPTl9RVUVVRQkJCSAgIDgKKworI2RlZmluZSBMT1dfUVVFVUUJCQkgICAgICBCRV9RVUVVRQorI2RlZmluZSBOT1JNQUxfUVVFVUUJCQkgICBNR05UX1FVRVVFCisKKyNpZm5kZWYgSVdfTU9ERV9NRVNICisjZGVmaW5lIElXX01PREVfTUVTSAkJCTcKKyNlbmRpZgorI2RlZmluZSBBTVNEVV9TVUJIRUFERVJfTEVOIDE0CisjZGVmaW5lIFNXUkZfVElNRU9VVAkJCQk1MAorCisjZGVmaW5lIElFX0NJU0NPX0ZMQUdfUE9TSVRJT04JCTB4MDgKKyNkZWZpbmUgU1VQUE9SVF9DS0lQX01JQwkJCTB4MDgKKyNkZWZpbmUgU1VQUE9SVF9DS0lQX1BLCQkJMHgxMAorI2RlZmluZQlSVF9SRl9PRkZfTEVWTF9BU1BNCQkJQklUMAorI2RlZmluZQlSVF9SRl9PRkZfTEVWTF9DTEtfUkVRCQlCSVQxCisjZGVmaW5lCVJUX1JGX09GRl9MRVZMX1BDSV9EMwkJCUJJVDIKKyNkZWZpbmUJUlRfUkZfT0ZGX0xFVkxfSEFMVF9OSUMJCUJJVDMKKyNkZWZpbmUJUlRfUkZfT0ZGX0xFVkxfRlJFRV9GVwkJQklUNAorI2RlZmluZQlSVF9SRl9PRkZfTEVWTF9GV18zMksJCUJJVDUKKyNkZWZpbmUJUlRfUkZfUFNfTEVWRUxfQUxXQVlTX0FTUE0JQklUNgorI2RlZmluZQlSVF9SRl9MUFNfRElTQUxCRV8yUgkJCUJJVDMwCisjZGVmaW5lCVJUX1JGX0xQU19MRVZFTF9BU1BNCQkJQklUMzEKKyNkZWZpbmUJUlRfSU5fUFNfTEVWRUwocFBTQywgX1BTX0ZMQUcpCQlcCisJKChwUFNDLT5DdXJQc0xldmVsICYgX1BTX0ZMQUcpID8gdHJ1ZSA6IGZhbHNlKQorI2RlZmluZQlSVF9DTEVBUl9QU19MRVZFTChwUFNDLCBfUFNfRkxBRykJXAorCShwUFNDLT5DdXJQc0xldmVsICY9ICh+KF9QU19GTEFHKSkpCisjZGVmaW5lCVJUX1NFVF9QU19MRVZFTChwUFNDLCBfUFNfRkxBRykJKHBQU0MtPkN1clBzTGV2ZWwgfD0gX1BTX0ZMQUcpCisKKy8qIGRlZmluZWQgZm9yIHNrYiBjYiBmaWVsZCAqLworLyogQXQgbW9zdCAyOCBieXRlICovCitzdHJ1Y3QgY2JfZGVzYyB7CisJLyogVHggRGVzYyBSZWxhdGVkIGZsYWdzICg4LTkpICovCisJdTggYkxhc3RJbmlQa3Q6MTsKKwl1OCBiQ21kT3JJbml0OjE7CisJdTggYkZpcnN0U2VnOjE7CisJdTggYkxhc3RTZWc6MTsKKwl1OCBiRW5jcnlwdDoxOworCXU4IGJUeERpc2FibGVSYXRlRmFsbEJhY2s6MTsKKwl1OCBiVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGU6MTsKKwl1OCBiSHdTZWM6MTsKKworCXU4IG5TdHVja0NvdW50OworCisJLyogVHggRmlybXdhcmUgUmVsYWdlZCBmbGFncyAoMTAtMTEpKi8KKwl1OCBiQ1RTRW5hYmxlOjE7CisJdTggYlJUU0VuYWJsZToxOworCXU4IGJVc2VTaG9ydEdJOjE7CisJdTggYlVzZVNob3J0UHJlYW1ibGU6MTsKKwl1OCBiVHhFbmFibGVGd0NhbGNEdXI6MTsKKwl1OCBiQU1QRFVFbmFibGU6MTsKKwl1OCBiUlRTU1RCQzoxOworCXU4IFJUU1NDOjE7CisKKwl1OCBiUlRTQlc6MTsKKwl1OCBiUGFja2V0Qlc6MTsKKwl1OCBiUlRTVXNlU2hvcnRQcmVhbWJsZToxOworCXU4IGJSVFNVc2VTaG9ydEdJOjE7CisJdTggYk11bHRpY2FzdDoxOworCXU4IGJCcm9hZGNhc3Q6MTsKKwl1OCBkcnZfYWdnX2VuYWJsZToxOworCXU4IHJlc2VydmVkMjoxOworCisJLyogVHggRGVzYyByZWxhdGVkIGVsZW1lbnQoMTItMTkpICovCisJdTggcmF0YV9pbmRleDsKKwl1OCBxdWV1ZV9pbmRleDsKKwl1MTYgdHhidWZfc2l6ZTsKKwl1OCBSQVRSSW5kZXg7CisJdTggYkFNU0RVOjE7CisJdTggYkZyb21BZ2dyUToxOworCXU4IHJlc2VydmVkNjo2OworCXU4IG1hY0lkOworCXU4IHByaW9yaXR5OworCisJLyogVHggZmlybXdhcmUgcmVsYXRlZCBlbGVtZW50KDIwLTI3KSAqLworCXU4IGRhdGFfcmF0ZTsKKwl1OCBydHNfcmF0ZTsKKwl1OCBhbXBkdV9mYWN0b3I7CisJdTggYW1wZHVfZGVuc2l0eTsKKwl1OCBEcnZBZ2dyTnVtOworCXU4IGJkaGNwOworCXUxNiBwa3Rfc2l6ZTsKKwl1OCBiSXNTcGVjaWFsRGF0YUZyYW1lOworCisJdTggYkJUVHhQYWNrZXQ7CisJdTggYklzQlRQcm9iUnNwOworfTsKKworZW51bSBzd19jaG5sX2NtZF9pZCB7CisJQ21kSURfRW5kLAorCUNtZElEX1NldFR4UG93ZXJMZXZlbCwKKwlDbWRJRF9CQlJlZ1dyaXRlMTAsCisJQ21kSURfV3JpdGVQb3J0VWxvbmcsCisJQ21kSURfV3JpdGVQb3J0VXNob3J0LAorCUNtZElEX1dyaXRlUG9ydFVjaGFyLAorCUNtZElEX1JGX1dyaXRlUmVnLAorfTsKKworc3RydWN0IHN3X2NobmxfY21kIHsKKwllbnVtIHN3X2NobmxfY21kX2lkIENtZElEOworCXUzMgkJCVBhcmExOworCXUzMgkJCVBhcmEyOworCXUzMgkJCW1zRGVsYXk7Cit9IF9fcGFja2VkOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBNR05fMU0JCSAgMHgwMgorI2RlZmluZSBNR05fMk0JCSAgMHgwNAorI2RlZmluZSBNR05fNV81TQkJMHgwYgorI2RlZmluZSBNR05fMTFNCQkgMHgxNgorCisjZGVmaW5lIE1HTl82TQkJICAweDBjCisjZGVmaW5lIE1HTl85TQkJICAweDEyCisjZGVmaW5lIE1HTl8xMk0JCSAweDE4CisjZGVmaW5lIE1HTl8xOE0JCSAweDI0CisjZGVmaW5lIE1HTl8yNE0JCSAweDMwCisjZGVmaW5lIE1HTl8zNk0JCSAweDQ4CisjZGVmaW5lIE1HTl80OE0JCSAweDYwCisjZGVmaW5lIE1HTl81NE0JCSAweDZjCisKKyNkZWZpbmUgTUdOX01DUzAJCTB4ODAKKyNkZWZpbmUgTUdOX01DUzEJCTB4ODEKKyNkZWZpbmUgTUdOX01DUzIJCTB4ODIKKyNkZWZpbmUgTUdOX01DUzMJCTB4ODMKKyNkZWZpbmUgTUdOX01DUzQJCTB4ODQKKyNkZWZpbmUgTUdOX01DUzUJCTB4ODUKKyNkZWZpbmUgTUdOX01DUzYJCTB4ODYKKyNkZWZpbmUgTUdOX01DUzcJCTB4ODcKKyNkZWZpbmUgTUdOX01DUzgJCTB4ODgKKyNkZWZpbmUgTUdOX01DUzkJCTB4ODkKKyNkZWZpbmUgTUdOX01DUzEwCSAgICAgICAweDhhCisjZGVmaW5lIE1HTl9NQ1MxMQkgICAgICAgMHg4YgorI2RlZmluZSBNR05fTUNTMTIJICAgICAgIDB4OGMKKyNkZWZpbmUgTUdOX01DUzEzCSAgICAgICAweDhkCisjZGVmaW5lIE1HTl9NQ1MxNAkgICAgICAgMHg4ZQorI2RlZmluZSBNR05fTUNTMTUJICAgICAgIDB4OGYKKyNkZWZpbmUJTUdOX01DUzBfU0cJCQkweDkwCisjZGVmaW5lCU1HTl9NQ1MxX1NHCQkJMHg5MQorI2RlZmluZQlNR05fTUNTMl9TRwkJCTB4OTIKKyNkZWZpbmUJTUdOX01DUzNfU0cJCQkweDkzCisjZGVmaW5lCU1HTl9NQ1M0X1NHCQkJMHg5NAorI2RlZmluZQlNR05fTUNTNV9TRwkJCTB4OTUKKyNkZWZpbmUJTUdOX01DUzZfU0cJCQkweDk2CisjZGVmaW5lCU1HTl9NQ1M3X1NHCQkJMHg5NworI2RlZmluZQlNR05fTUNTOF9TRwkJCTB4OTgKKyNkZWZpbmUJTUdOX01DUzlfU0cJCQkweDk5CisjZGVmaW5lCU1HTl9NQ1MxMF9TRwkJMHg5YQorI2RlZmluZQlNR05fTUNTMTFfU0cJCTB4OWIKKyNkZWZpbmUJTUdOX01DUzEyX1NHCQkweDljCisjZGVmaW5lCU1HTl9NQ1MxM19TRwkJMHg5ZAorI2RlZmluZQlNR05fTUNTMTRfU0cJCTB4OWUKKyNkZWZpbmUJTUdOX01DUzE1X1NHCQkweDlmCisKKworZW51bQlfUmVhc29uQ29kZSB7CisJdW5zcGVjX3JlYXNvbgk9IDB4MSwKKwlhdXRoX25vdF92YWxpZAk9IDB4MiwKKwlkZWF1dGhfbHZfc3MJPSAweDMsCisJaW5hY3Rpdml0eQkJPSAweDQsCisJYXBfb3ZlcmxvYWQJPSAweDUsCisJY2xhc3MyX2VycgkJPSAweDYsCisJY2xhc3MzX2VycgkJPSAweDcsCisJZGlzYXNfbHZfc3MJPSAweDgsCisJYXNvY19ub3RfYXV0aAk9IDB4OSwKKworCW1pY19mYWlsdXJlCT0gMHhlLAorCisJaW52YWxpZF9JRQkJPSAweDBkLAorCWZvdXJfd2F5X3Rtb3V0CT0gMHgwZiwKKwl0d29fd2F5X3Rtb3V0CT0gMHgxMCwKKwlJRV9kaXNtYXRjaAk9IDB4MTEsCisJaW52YWxpZF9HY2lwaGVyID0gMHgxMiwKKwlpbnZhbGlkX1BjaXBoZXIgPSAweDEzLAorCWludmFsaWRfQUtNUAk9IDB4MTQsCisJdW5zdXBfUlNOSUV2ZXIgPSAweDE1LAorCWludmFsaWRfUlNOSUUJPSAweDE2LAorCWF1dGhfODAyXzF4X2ZhaWwgPSAweDE3LAorCWNpcGVyX3JlamVjdAkJPSAweDE4LAorCisJUW9TX3Vuc3BlYwkJPSAweDIwLAorCVFBUF9iYW5kd2lkdGgJPSAweDIxLAorCXBvb3JfY29uZGl0aW9uCT0gMHgyMiwKKwlub19mYWNpbGl0eQk9IDB4MjMsCisJcmVxX2RlY2xpbmVkCT0gMHgyNSwKKwlpbnZhbGlkX3BhcmFtCT0gMHgyNiwKKwlyZXFfbm90X2hvbm9yZWQgPSAweDI3LAorCVRTX25vdF9jcmVhdGVkCT0gMHgyRiwKKwlETF9ub3RfYWxsb3dlZAk9IDB4MzAsCisJZGVzdF9ub3RfZXhpc3QJPSAweDMxLAorCWRlc3Rfbm90X1FTVEEJPSAweDMyLAorfTsKKworZW51bSBoYWxfZGVmX3ZhcmlhYmxlIHsKKwlIQUxfREVGX1RQQ19FTkFCTEUsCisJSEFMX0RFRl9JTklUX0dBSU4sCisJSEFMX0RFRl9QUk9UX0lNUF9NT0RFLAorCUhBTF9ERUZfSElHSF9QT1dFUl9NRUNIQU5JU00sCisJSEFMX0RFRl9SQVRFX0FEQVBUSVZFX01FQ0hBTklTTSwKKwlIQUxfREVGX0FOVEVOTkFfRElWRVJTSVRZX01FQ0hBTklTTSwKKwlIQUxfREVGX0xFRCwKKwlIQUxfREVGX0NXX01BWF9NSU4sCisKKwlIQUxfREVGX1dPV0xBTiwKKwlIQUxfREVGX0VORFBPSU5UUywKKwlIQUxfREVGX01JTl9UWF9QT1dFUl9EQk0sCisJSEFMX0RFRl9NQVhfVFhfUE9XRVJfREJNLAorCUhXX0RFRl9FRlVTRV9SRVBHX1NFQ1RJT04xX0ZMQUcsCisJSFdfREVGX0VGVVNFX1JFUEdfREFUQSwKKwlIV19ERUZfR1BJTywKKwlIQUxfREVGX1BDSV9TVVBQT1JUX0FTUE0sCisJSEFMX0RFRl9USEVSTUFMX1ZBTFVFLAorCUhBTF9ERUZfVVNCX0lOX1RPS0VOX1JFViwKK307CisKK2VudW0gaHdfdmFyaWFibGVzIHsKKwlIV19WQVJfRVRIRVJfQUREUiwKKwlIV19WQVJfTVVMVElDQVNUX1JFRywKKwlIV19WQVJfQkFTSUNfUkFURSwKKwlIV19WQVJfQlNTSUQsCisJSFdfVkFSX01FRElBX1NUQVRVUywKKwlIV19WQVJfU0VDVVJJVFlfQ09ORiwKKwlIV19WQVJfQkVBQ09OX0lOVEVSVkFMLAorCUhXX1ZBUl9BVElNX1dJTkRPVywKKwlIV19WQVJfTElTVEVOX0lOVEVSVkFMLAorCUhXX1ZBUl9DU19DT1VOVEVSLAorCUhXX1ZBUl9ERUZBVUxUS0VZMCwKKwlIV19WQVJfREVGQVVMVEtFWTEsCisJSFdfVkFSX0RFRkFVTFRLRVkyLAorCUhXX1ZBUl9ERUZBVUxUS0VZMywKKwlIV19WQVJfU0lGUywKKwlIV19WQVJfRElGUywKKwlIV19WQVJfRUlGUywKKwlIV19WQVJfU0xPVF9USU1FLAorCUhXX1ZBUl9BQ0tfUFJFQU1CTEUsCisJSFdfVkFSX0NXX0NPTkZJRywKKwlIV19WQVJfQ1dfVkFMVUVTLAorCUhXX1ZBUl9SQVRFX0ZBTExCQUNLX0NPTlRST0wsCisJSFdfVkFSX0NPTlRFTlRJT05fV0lORE9XLAorCUhXX1ZBUl9SRVRSWV9DT1VOVCwKKwlIV19WQVJfVFJfU1dJVENILAorCUhXX1ZBUl9DT01NQU5ELAorCUhXX1ZBUl9XUEFfQ09ORklHLAorCUhXX1ZBUl9BTVBEVV9NSU5fU1BBQ0UsCisJSFdfVkFSX1NIT1JUR0lfREVOU0lUWSwKKwlIV19WQVJfQU1QRFVfRkFDVE9SLAorCUhXX1ZBUl9NQ1NfUkFURV9BVkFJTEFCTEUsCisJSFdfVkFSX0FDX1BBUkFNLAorCUhXX1ZBUl9BQ01fQ1RSTCwKKwlIV19WQVJfRElTX1JlcV9Rc2l6ZSwKKwlIV19WQVJfQ0NYX0NITkxfTE9BRCwKKwlIV19WQVJfQ0NYX05PSVNFX0hJU1RPR1JBTSwKKwlIV19WQVJfQ0NYX0NMTV9OSE0sCisJSFdfVkFSX1R4T1BMaW1pdCwKKwlIV19WQVJfVFVSQk9fTU9ERSwKKwlIV19WQVJfUkZfU1RBVEUsCisJSFdfVkFSX1JGX09GRl9CWV9IVywKKwlIV19WQVJfQlVTX1NQRUVELAorCUhXX1ZBUl9TRVRfREVWX1BPV0VSLAorCisJSFdfVkFSX1JDUiwKKwlIV19WQVJfUkFUUl8wLAorCUhXX1ZBUl9SUlNSLAorCUhXX1ZBUl9DUFVfUlNULAorCUhXX1ZBUl9DRUNIS19CU1NJRCwKKwlIV19WQVJfTEJLX01PREUsCisJSFdfVkFSX0FFU18xMU5fRklYLAorCUhXX1ZBUl9VU0JfUlhfQUdHUiwKKwlIV19WQVJfVVNFUl9DT05UUk9MX1RVUkJPX01PREUsCisJSFdfVkFSX1JFVFJZX0xJTUlULAorCUhXX1ZBUl9JTklUX1RYX1JBVEUsCisJSFdfVkFSX1RYX1JBVEVfUkVHLAorCUhXX1ZBUl9FRlVTRV9VU0FHRSwKKwlIV19WQVJfRUZVU0VfQllURVMsCisJSFdfVkFSX0FVVE9MT0FEX1NUQVRVUywKKwlIV19WQVJfUkZfMlJfRElTQUJMRSwKKwlIV19WQVJfU0VUX1JQV00sCisJSFdfVkFSX0gyQ19GV19QV1JNT0RFLAorCUhXX1ZBUl9IMkNfRldfSk9JTkJTU1JQVCwKKwlIV19WQVJfMVgxX1JFQ1ZfQ09NQklORSwKKwlIV19WQVJfU1RPUF9TRU5EX0JFQUNPTiwKKwlIV19WQVJfVFNGX1RJTUVSLAorCUhXX1ZBUl9JT19DTUQsCisKKwlIV19WQVJfUkZfUkVDT1ZFUlksCisJSFdfVkFSX0gyQ19GV19VUERBVEVfR1RLLAorCUhXX1ZBUl9XRl9NQVNLLAorCUhXX1ZBUl9XRl9DUkMsCisJSFdfVkFSX1dGX0lTX01BQ19BRERSLAorCUhXX1ZBUl9IMkNfRldfT0ZGTE9BRCwKKwlIV19WQVJfUkVTRVRfV0ZDUkMsCisKKwlIV19WQVJfSEFORExFX0ZXX0MySCwKKwlIV19WQVJfRExfRldfUlNWRF9QQUdFLAorCUhXX1ZBUl9BSUQsCisJSFdfVkFSX0hXX1NFUV9FTkFCTEUsCisJSFdfVkFSX0NPUlJFQ1RfVFNGLAorCUhXX1ZBUl9CQ05fVkFMSUQsCisJSFdfVkFSX0ZXTFBTX1JGX09OLAorCUhXX1ZBUl9EVUFMX1RTRl9SU1QsCisJSFdfVkFSX1NXSVRDSF9FUEhZX1dvV0xBTiwKKwlIV19WQVJfSU5UX01JR1JBVElPTiwKKwlIV19WQVJfSU5UX0FDLAorCUhXX1ZBUl9SRl9USU1JTkcsCit9OworCitlbnVtIHJ0X29wX21vZGUgeworCVJUX09QX01PREVfQVAsCisJUlRfT1BfTU9ERV9JTkZSQVNUUlVDVFVSRSwKKwlSVF9PUF9NT0RFX0lCU1MsCisJUlRfT1BfTU9ERV9OT19MSU5LLAorfTsKKworCisjZGVmaW5lIGFTaWZzVGltZQkJCQkJCVwKKwkgKCgocHJpdi0+cnRsbGliLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX0EpCVwKKwl8fCAocHJpdi0+cnRsbGliLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX05fMjRHKQlcCisJfHwgKHByaXYtPnJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0gSUVFRV9OXzVHKSkgPyAxNiA6IDEwKQorCisjZGVmaW5lIE1HTVRfUVVFVUVfTlVNIDUKKworI2RlZmluZSBJRUVFX0NNRF9TRVRfV1BBX1BBUkFNCQkJMQorI2RlZmluZQlJRUVFX0NNRF9TRVRfV1BBX0lFCQkJMgorI2RlZmluZSBJRUVFX0NNRF9TRVRfRU5DUllQVElPTgkJCTMKKyNkZWZpbmUgSUVFRV9DTURfTUxNRQkJCQk0CisKKyNkZWZpbmUgSUVFRV9QQVJBTV9XUEFfRU5BQkxFRAkJCTEKKyNkZWZpbmUgSUVFRV9QQVJBTV9US0lQX0NPVU5URVJNRUFTVVJFUwkJMgorI2RlZmluZSBJRUVFX1BBUkFNX0RST1BfVU5FTkNSWVBURUQJCTMKKyNkZWZpbmUgSUVFRV9QQVJBTV9QUklWQUNZX0lOVk9LRUQJCTQKKyNkZWZpbmUgSUVFRV9QQVJBTV9BVVRIX0FMR1MJCQk1CisjZGVmaW5lIElFRUVfUEFSQU1fSUVFRV84MDJfMVgJCQk2CisjZGVmaW5lIElFRUVfUEFSQU1fV1BBWF9TRUxFQ1QJCQk3CisjZGVmaW5lIElFRUVfUFJPVE9fV1BBCQkJCTEKKyNkZWZpbmUgSUVFRV9QUk9UT19SU04JCQkJMgorI2RlZmluZSBJRUVFX1dQQVhfVVNFR1JPVVAJCQkwCisjZGVmaW5lIElFRUVfV1BBWF9XRVA0MAkJCQkxCisjZGVmaW5lIElFRUVfV1BBWF9US0lQCQkJCTIKKyNkZWZpbmUgSUVFRV9XUEFYX1dSQVAJCQkJMworI2RlZmluZSBJRUVFX1dQQVhfQ0NNUAkJCQk0CisjZGVmaW5lIElFRUVfV1BBWF9XRVAxMDQJCQk1CisKKyNkZWZpbmUgSUVFRV9LRVlfTUdNVF9JRUVFODAyMVgJCQkxCisjZGVmaW5lIElFRUVfS0VZX01HTVRfUFNLCQkJMgorCisjZGVmaW5lIElFRUVfTUxNRV9TVEFfREVBVVRICQkJMQorI2RlZmluZSBJRUVFX01MTUVfU1RBX0RJU0FTU09DCQkJMgorCisKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfVU5LTk9XTl9BTEcJCTIKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfVU5LTk9XTl9BRERSCQkzCisjZGVmaW5lIElFRUVfQ1JZUFRfRVJSX0NSWVBUX0lOSVRfRkFJTEVECTQKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfS0VZX1NFVF9GQUlMRUQJCTUKKyNkZWZpbmUgSUVFRV9DUllQVF9FUlJfVFhfS0VZX1NFVF9GQUlMRUQJNgorI2RlZmluZSBJRUVFX0NSWVBUX0VSUl9DQVJEX0NPTkZfRkFJTEVECQk3CisjZGVmaW5lCUlFRUVfQ1JZUFRfQUxHX05BTUVfTEVOCQkJMTYKKworI2RlZmluZSBNQVhfSUVfTEVOICAweGZmCisjZGVmaW5lIFJUX0FTU0VSVF9SRVQoX0V4cCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIFJUX0FTU0VSVF9SRVRfVkFMVUUoX0V4cCwgUmV0KQkJXAorCWRvIHt9IHdoaWxlICgwKQorCitzdHJ1Y3QgaWVlZV9wYXJhbSB7CisJdTMyIGNtZDsKKwl1OCBzdGFfYWRkcltFVEhfQUxFTl07CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdTggbmFtZTsKKwkJCXUzMiB2YWx1ZTsKKwkJfSB3cGFfcGFyYW07CisJCXN0cnVjdCB7CisJCQl1MzIgbGVuOworCQkJdTggcmVzZXJ2ZWRbMzJdOworCQkJdTggZGF0YVswXTsKKwkJfSB3cGFfaWU7CisJCXN0cnVjdCB7CisJCQlpbnQgY29tbWFuZDsKKwkJCWludCByZWFzb25fY29kZTsKKwkJfSBtbG1lOworCQlzdHJ1Y3QgeworCQkJdTggYWxnW0lFRUVfQ1JZUFRfQUxHX05BTUVfTEVOXTsKKwkJCXU4IHNldF90eDsKKwkJCXUzMiBlcnI7CisJCQl1OCBpZHg7CisJCQl1OCBzZXFbOF07IC8qIHNlcXVlbmNlIGNvdW50ZXIgKHNldDogUlgsIGdldDogVFgpICovCisJCQl1MTYga2V5X2xlbjsKKwkJCXU4IGtleVswXTsKKwkJfSBjcnlwdDsKKwl9IHU7Cit9OworCisKKyNpZiBXSVJFTEVTU19FWFQgPCAxNworI2RlZmluZSBJV19RVUFMX1FVQUxfSU5WQUxJRCAgIDB4MTAKKyNkZWZpbmUgSVdfUVVBTF9MRVZFTF9JTlZBTElEICAweDIwCisjZGVmaW5lIElXX1FVQUxfTk9JU0VfSU5WQUxJRCAgMHg0MAorI2RlZmluZSBJV19RVUFMX1FVQUxfVVBEQVRFRCAgIDB4MQorI2RlZmluZSBJV19RVUFMX0xFVkVMX1VQREFURUQgIDB4MgorI2RlZmluZSBJV19RVUFMX05PSVNFX1VQREFURUQgIDB4NAorI2VuZGlmCisKKyNkZWZpbmUgTVNFQ1ModCkgbXNlY3NfdG9famlmZmllcyh0KQorI2RlZmluZSBtc2xlZXBfaW50ZXJydXB0aWJsZV9yc2wgIG1zbGVlcF9pbnRlcnJ1cHRpYmxlCisKKyNkZWZpbmUgUlRMTElCX0RBVEFfTEVOCQkyMzA0CisvKiBNYXhpbXVtIHNpemUgZm9yIHRoZSBNQS1VTklUREFUQSBwcmltaXRpdmUsIDgwMi4xMSBzdGFuZGFyZCBzZWN0aW9uCisgICA2LjIuMS4xLjIuCisKKyAgIFRoZSBmaWd1cmUgaW4gc2VjdGlvbiA3LjEuMiBzdWdnZXN0cyBhIGJvZHkgc2l6ZSBvZiB1cCB0byAyMzEyCisgICBieXRlcyBpcyBhbGxvd2VkLCB3aGljaCBpcyBhIGJpdCBjb25mdXNpbmcsIEkgc3VzcGVjdCB0aGlzCisgICByZXByZXNlbnRzIHRoZSAyMzA0IGJ5dGVzIG9mIHJlYWwgZGF0YSwgcGx1cyBhIHBvc3NpYmxlIDggYnl0ZXMgb2YKKyAgIFdFUCBJViBhbmQgSUNWLiAodGhpcyBpbnRlcnByZXRhdGlvbiBzdWdnZXN0ZWQgYnkgUmFtaXJvIEJhcnJlaXJvKSAqLworI2RlZmluZSBSVExMSUJfMUFERFJfTEVOIDEwCisjZGVmaW5lIFJUTExJQl8yQUREUl9MRU4gMTYKKyNkZWZpbmUgUlRMTElCXzNBRERSX0xFTiAyNAorI2RlZmluZSBSVExMSUJfNEFERFJfTEVOIDMwCisjZGVmaW5lIFJUTExJQl9GQ1NfTEVOICAgIDQKKyNkZWZpbmUgUlRMTElCX0hMRU4JCSAgKFJUTExJQl80QUREUl9MRU4pCisjZGVmaW5lIFJUTExJQl9GUkFNRV9MRU4JICAgICAoUlRMTElCX0RBVEFfTEVOICsgUlRMTElCX0hMRU4pCisjZGVmaW5lIFJUTExJQl9NR01UX0hEUl9MRU4gMjQKKyNkZWZpbmUgUlRMTElCX0RBVEFfSERSM19MRU4gMjQKKyNkZWZpbmUgUlRMTElCX0RBVEFfSERSNF9MRU4gMzAKKworI2RlZmluZSBSVExMSUJfU0tCQlVGRkVSX1NJWkUgMjUwMAorCisjZGVmaW5lIE1JTl9GUkFHX1RIUkVTSE9MRCAgICAgMjU2VQorI2RlZmluZSBNQVhfRlJBR19USFJFU0hPTEQgICAgIDIzNDZVCisjZGVmaW5lIE1BWF9IVF9EQVRBX0ZSQUdfVEhSRVNIT0xEIDB4MjAwMAorCisjZGVmaW5lIEhUX0FNU0RVX1NJWkVfNEsgMzgzOQorI2RlZmluZSBIVF9BTVNEVV9TSVpFXzhLIDc5MzUKKworLyogRnJhbWUgY29udHJvbCBmaWVsZCBjb25zdGFudHMgKi8KKyNkZWZpbmUgUlRMTElCX0ZDVExfVkVSUwkJMHgwMDAzCisjZGVmaW5lIFJUTExJQl9GQ1RMX0ZUWVBFCQkweDAwMGMKKyNkZWZpbmUgUlRMTElCX0ZDVExfU1RZUEUJCTB4MDBmMAorI2RlZmluZSBSVExMSUJfRkNUTF9GUkFNRVRZUEUJMHgwMGZjCisjZGVmaW5lIFJUTExJQl9GQ1RMX1RPRFMJCTB4MDEwMAorI2RlZmluZSBSVExMSUJfRkNUTF9GUk9NRFMJCTB4MDIwMAorI2RlZmluZSBSVExMSUJfRkNUTF9EU1RPRFMJCTB4MDMwMAorI2RlZmluZSBSVExMSUJfRkNUTF9NT1JFRlJBR1MJMHgwNDAwCisjZGVmaW5lIFJUTExJQl9GQ1RMX1JFVFJZCQkweDA4MDAKKyNkZWZpbmUgUlRMTElCX0ZDVExfUE0JCTB4MTAwMAorI2RlZmluZSBSVExMSUJfRkNUTF9NT1JFREFUQQkJMHgyMDAwCisjZGVmaW5lIFJUTExJQl9GQ1RMX1dFUAkJMHg0MDAwCisjZGVmaW5lIFJUTExJQl9GQ1RMX09SREVSCQkweDgwMDAKKworI2RlZmluZSBSVExMSUJfRlRZUEVfTUdNVAkJMHgwMDAwCisjZGVmaW5lIFJUTExJQl9GVFlQRV9DVEwJCTB4MDAwNAorI2RlZmluZSBSVExMSUJfRlRZUEVfREFUQQkJMHgwMDA4CisKKy8qIG1hbmFnZW1lbnQgKi8KKyNkZWZpbmUgUlRMTElCX1NUWVBFX0FTU09DX1JFUQkweDAwMDAKKyNkZWZpbmUgUlRMTElCX1NUWVBFX0FTU09DX1JFU1AJCTB4MDAxMAorI2RlZmluZSBSVExMSUJfU1RZUEVfUkVBU1NPQ19SRVEJMHgwMDIwCisjZGVmaW5lIFJUTExJQl9TVFlQRV9SRUFTU09DX1JFU1AJMHgwMDMwCisjZGVmaW5lIFJUTExJQl9TVFlQRV9QUk9CRV9SRVEJMHgwMDQwCisjZGVmaW5lIFJUTExJQl9TVFlQRV9QUk9CRV9SRVNQCTB4MDA1MAorI2RlZmluZSBSVExMSUJfU1RZUEVfQkVBQ09OCQkweDAwODAKKyNkZWZpbmUgUlRMTElCX1NUWVBFX0FUSU0JCTB4MDA5MAorI2RlZmluZSBSVExMSUJfU1RZUEVfRElTQVNTT0MJMHgwMEEwCisjZGVmaW5lIFJUTExJQl9TVFlQRV9BVVRICQkweDAwQjAKKyNkZWZpbmUgUlRMTElCX1NUWVBFX0RFQVVUSAkJMHgwMEMwCisjZGVmaW5lIFJUTExJQl9TVFlQRV9NQU5BR0VfQUNUCTB4MDBEMAorCisvKiBjb250cm9sICovCisjZGVmaW5lIFJUTExJQl9TVFlQRV9QU1BPTEwJCTB4MDBBMAorI2RlZmluZSBSVExMSUJfU1RZUEVfUlRTCQkweDAwQjAKKyNkZWZpbmUgUlRMTElCX1NUWVBFX0NUUwkJMHgwMEMwCisjZGVmaW5lIFJUTExJQl9TVFlQRV9BQ0sJCTB4MDBEMAorI2RlZmluZSBSVExMSUJfU1RZUEVfQ0ZFTkQJCTB4MDBFMAorI2RlZmluZSBSVExMSUJfU1RZUEVfQ0ZFTkRBQ0sJMHgwMEYwCisjZGVmaW5lIFJUTExJQl9TVFlQRV9CTE9DS0FDSyAgIDB4MDA5NAorCisvKiBkYXRhICovCisjZGVmaW5lIFJUTExJQl9TVFlQRV9EQVRBCQkweDAwMDAKKyNkZWZpbmUgUlRMTElCX1NUWVBFX0RBVEFfQ0ZBQ0sJMHgwMDEwCisjZGVmaW5lIFJUTExJQl9TVFlQRV9EQVRBX0NGUE9MTAkweDAwMjAKKyNkZWZpbmUgUlRMTElCX1NUWVBFX0RBVEFfQ0ZBQ0tQT0xMCTB4MDAzMAorI2RlZmluZSBSVExMSUJfU1RZUEVfTlVMTEZVTkMJMHgwMDQwCisjZGVmaW5lIFJUTExJQl9TVFlQRV9DRkFDSwkJMHgwMDUwCisjZGVmaW5lIFJUTExJQl9TVFlQRV9DRlBPTEwJCTB4MDA2MAorI2RlZmluZSBSVExMSUJfU1RZUEVfQ0ZBQ0tQT0xMCTB4MDA3MAorI2RlZmluZSBSVExMSUJfU1RZUEVfUU9TX0RBVEEJMHgwMDgwCisjZGVmaW5lIFJUTExJQl9TVFlQRV9RT1NfTlVMTAkweDAwQzAKKworI2RlZmluZSBSVExMSUJfU0NUTF9GUkFHCQkweDAwMEYKKyNkZWZpbmUgUlRMTElCX1NDVExfU0VRCQkweEZGRjAKKworLyogUU9TIGNvbnRyb2wgKi8KKyNkZWZpbmUgUlRMTElCX1FDVExfVElECSAgICAgIDB4MDAwRgorCisjZGVmaW5lCUZDX1FPU19CSVQJCQkJCUJJVDcKKyNkZWZpbmUgSXNEYXRhRnJhbWUocGR1KQkoKChwZHVbMF0gJiAweDBDKSA9PSAweDA4KSA/IHRydWUgOiBmYWxzZSkKKyNkZWZpbmUJSXNMZWdhY3lEYXRhRnJhbWUocGR1KQkoSXNEYXRhRnJhbWUocGR1KSAmJiAoIShwZHVbMF0mRkNfUU9TX0JJVCkpKQorI2RlZmluZSBJc1FvU0RhdGFGcmFtZShwZnJhbWUpCQkJXAorCSgoKih1MTYgKilwZnJhbWUmKFJUTExJQl9TVFlQRV9RT1NfREFUQXxSVExMSUJfRlRZUEVfREFUQSkpID09CVwKKwkoUlRMTElCX1NUWVBFX1FPU19EQVRBfFJUTExJQl9GVFlQRV9EQVRBKSkKKyNkZWZpbmUgRnJhbWVfT3JkZXIocGZyYW1lKSAgICAgKCoodTE2ICopcGZyYW1lJlJUTExJQl9GQ1RMX09SREVSKQorI2RlZmluZSBTTl9MRVNTKGEsIGIpCQkoKChhLWIpJjB4ODAwKSAhPSAwKQorI2RlZmluZSBTTl9FUVVBTChhLCBiKQkoYSA9PSBiKQorI2RlZmluZSBNQVhfREVWX0FERFJfU0laRSA4CisKK2VudW0gYWN0X2NhdGVnb3J5IHsKKwlBQ1RfQ0FUX1FPUyA9IDEsCisJQUNUX0NBVF9ETFMgPSAyLAorCUFDVF9DQVRfQkEgID0gMywKKwlBQ1RfQ0FUX0hUICA9IDcsCisJQUNUX0NBVF9XTU0gPSAxNywKK307CisKK2VudW0gdHNfYWN0aW9uIHsKKwlBQ1RfQUREVFNSRVEgPSAwLAorCUFDVF9BRERUU1JTUCA9IDEsCisJQUNUX0RFTFRTICAgID0gMiwKKwlBQ1RfU0NIRURVTEUgPSAzLAorfTsKKworZW51bSBiYV9hY3Rpb24geworCUFDVF9BRERCQVJFUSA9IDAsCisJQUNUX0FEREJBUlNQID0gMSwKKwlBQ1RfREVMQkEgICAgPSAyLAorfTsKKworZW51bSBpbml0X2dhaW5fb3BfdHlwZSB7CisJSUdfQmFja3VwID0gMCwKKwlJR19SZXN0b3JlLAorCUlHX01heAorfTsKKworZW51bSBsZWRfY3RsX21vZGUgeworCUxFRF9DVExfUE9XRVJfT04gPSAxLAorCUxFRF9DVExfTElOSyA9IDIsCisJTEVEX0NUTF9OT19MSU5LID0gMywKKwlMRURfQ1RMX1RYID0gNCwKKwlMRURfQ1RMX1JYID0gNSwKKwlMRURfQ1RMX1NJVEVfU1VSVkVZID0gNiwKKwlMRURfQ1RMX1BPV0VSX09GRiA9IDcsCisJTEVEX0NUTF9TVEFSVF9UT19MSU5LID0gOCwKKwlMRURfQ1RMX1NUQVJUX1dQUyA9IDksCisJTEVEX0NUTF9TVE9QX1dQUyA9IDEwLAorCUxFRF9DVExfU1RBUlRfV1BTX0JPVFRPTiA9IDExLAorCUxFRF9DVExfU1RPUF9XUFNfRkFJTCA9IDEyLAorCSBMRURfQ1RMX1NUT1BfV1BTX0ZBSUxfT1ZFUkxBUCA9IDEzLAorfTsKKworZW51bSBydF9yZl90eXBlX2RlZiB7CisJUkZfMVQyUiA9IDAsCisJUkZfMlQ0UiwKKwlSRl8yVDJSLAorCVJGXzFUMVIsCisJUkZfMlQyUl9HUkVFTiwKKwlSRl84MTlYX01BWF9UWVBFCit9OworCitlbnVtIHdpcmVsZXNzX21vZGUgeworCVdJUkVMRVNTX01PREVfVU5LTk9XTiA9IDB4MDAsCisJV0lSRUxFU1NfTU9ERV9BID0gMHgwMSwKKwlXSVJFTEVTU19NT0RFX0IgPSAweDAyLAorCVdJUkVMRVNTX01PREVfRyA9IDB4MDQsCisJV0lSRUxFU1NfTU9ERV9BVVRPID0gMHgwOCwKKwlXSVJFTEVTU19NT0RFX05fMjRHID0gMHgxMCwKKwlXSVJFTEVTU19NT0RFX05fNUcgPSAweDIwCit9OworCitlbnVtIHdpcmVsZXNzX25ldHdvcmtfdHlwZSB7CisJV0lSRUxFU1NfMTFCID0gMSwKKwlXSVJFTEVTU18xMUcgPSAyLAorCVdJUkVMRVNTXzExQSA9IDQsCisJV0lSRUxFU1NfMTFOID0gOAorfTsKKworI2RlZmluZSBPVUlfU1VCVFlQRV9XTU1fSU5GTwkJMAorI2RlZmluZSBPVUlfU1VCVFlQRV9XTU1fUEFSQU0JMQorI2RlZmluZSBPVUlfU1VCVFlQRV9RT1NfQ0FQQUJJCTUKKworLyogZGVidWcgbWFjcm9zICovCitleHRlcm4gdTMyIHJ0bGxpYl9kZWJ1Z19sZXZlbDsKKyNkZWZpbmUgUlRMTElCX0RFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIFwKK2RvIHsJCQkJCQkJCVwKKwlpZiAocnRsbGliX2RlYnVnX2xldmVsICYgKGxldmVsKSkJCQlcCisJCXByaW50ayhLRVJOX0RFQlVHICJydGxsaWI6ICIgZm10LCAjIyBhcmdzKTsJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBSVExMSUJfREVCVUdfREFUQShsZXZlbCwgZGF0YSwgZGF0YWxlbikJXAorCWRvIHsJCQkJCQkJXAorCQlpZiAoKHJ0bGxpYl9kZWJ1Z19sZXZlbCAmIChsZXZlbCkpID09IChsZXZlbCkpIHsJXAorCQkJaW50IGk7CQkJCQlcCisJCQl1OCAqcGRhdGEgPSAodTggKilkYXRhOwkJCVwKKwkJCXByaW50ayhLRVJOX0RFQlVHICJydGxsaWI6ICVzKClcbiIsIF9fZnVuY19fKTsJXAorCQkJZm9yIChpID0gMDsgaSA8IChpbnQpKGRhdGFsZW4pOyBpKyspCXsJXAorCQkJCXByaW50aygiJTIuMnggIiwgcGRhdGFbaV0pOwkJXAorCQkJCWlmICgoaSsxKSUxNiA9PSAwKQkJCVwKKwkJCQkJcHJpbnRrKCJcbiIpOwlcCisJCQl9CQkJCVwKKwkJCXByaW50aygiXG4iKTsJCQlcCisJCX0JCQkJCVwKKwl9IHdoaWxlICgwKQorCisvKgorICogVG8gdXNlIHRoZSBkZWJ1ZyBzeXN0ZW07CisgKgorICogSWYgeW91IGFyZSBkZWZpbmluZyBhIG5ldyBkZWJ1ZyBjbGFzc2lmaWNhdGlvbiwgc2ltcGx5IGFkZCBpdCB0byB0aGUgI2RlZmluZQorICogbGlzdCBoZXJlIGluIHRoZSBmb3JtIG9mOgorICoKKyAqICNkZWZpbmUgUlRMTElCX0RMX3h4eHggVkFMVUUKKyAqCisgKiBzaGlmdGluZyB2YWx1ZSB0byB0aGUgbGVmdCBvbmUgYml0IGZyb20gdGhlIHByZXZpb3VzIGVudHJ5LiAgeHh4eCBzaG91bGQgYmUKKyAqIHRoZSBuYW1lIG9mIHRoZSBjbGFzc2lmaWNhdGlvbiAoZm9yIGV4YW1wbGUsIFdFUCkKKyAqCisgKiBZb3UgdGhlbiBuZWVkIHRvIGVpdGhlciBhZGQgYSBSVExMSUJfeHh4eF9ERUJVRygpIG1hY3JvIGRlZmluaXRpb24gZm9yIHlvdXIKKyAqIGNsYXNzaWZpY2F0aW9uLCBvciB1c2UgUlRMTElCX0RFQlVHKFJUTExJQl9ETF94eHh4LCAuLi4pIHdoZW5ldmVyIHlvdSB3YW50CisgKiB0byBzZW5kIG91dHB1dCB0byB0aGF0IGNsYXNzaWZpY2F0aW9uLgorICoKKyAqIFRvIGFkZCB5b3VyIGRlYnVnIGxldmVsIHRvIHRoZSBsaXN0IG9mIGxldmVscyBzZWVuIHdoZW4geW91IHBlcmZvcm0KKyAqCisgKiAlIGNhdCAvcHJvYy9uZXQvaXB3L2RlYnVnX2xldmVsCisgKgorICogeW91IHNpbXBseSBuZWVkIHRvIGFkZCB5b3VyIGVudHJ5IHRvIHRoZSBpcHdfZGVidWdfbGV2ZWxzIGFycmF5LgorICoKKyAqCisgKi8KKworI2RlZmluZSBSVExMSUJfRExfSU5GTwkgICgxPDwwKQorI2RlZmluZSBSVExMSUJfRExfV1gJICAgICgxPDwxKQorI2RlZmluZSBSVExMSUJfRExfU0NBTgkgICgxPDwyKQorI2RlZmluZSBSVExMSUJfRExfU1RBVEUJICgxPDwzKQorI2RlZmluZSBSVExMSUJfRExfTUdNVAkgICgxPDw0KQorI2RlZmluZSBSVExMSUJfRExfRlJBRwkgICgxPDw1KQorI2RlZmluZSBSVExMSUJfRExfRUFQCSAgICgxPDw2KQorI2RlZmluZSBSVExMSUJfRExfRFJPUAkgICgxPDw3KQorCisjZGVmaW5lIFJUTExJQl9ETF9UWAkgICAgKDE8PDgpCisjZGVmaW5lIFJUTExJQl9ETF9SWAkgICAgKDE8PDkpCisKKyNkZWZpbmUgUlRMTElCX0RMX0hUCQkgICAoMTw8MTApCisjZGVmaW5lIFJUTExJQl9ETF9CQQkJICAgKDE8PDExKQorI2RlZmluZSBSVExMSUJfRExfVFMJCSAgICgxPDwxMikKKyNkZWZpbmUgUlRMTElCX0RMX1FPUwkgICAoMTw8MTMpCisjZGVmaW5lIFJUTExJQl9ETF9SRU9SREVSCSAgICgxPDwxNCkKKyNkZWZpbmUgUlRMTElCX0RMX0lPVAkgICAoMTw8MTUpCisjZGVmaW5lIFJUTExJQl9ETF9JUFMJICAgKDE8PDE2KQorI2RlZmluZSBSVExMSUJfRExfVFJBQ0UJICAgKDE8PDI5KQorI2RlZmluZSBSVExMSUJfRExfREFUQQkgICAoMTw8MzApCisjZGVmaW5lIFJUTExJQl9ETF9FUlIJICAgKDE8PDMxKQorI2RlZmluZSBSVExMSUJfRVJST1IoZiwgYS4uLikgcHJpbnRrKEtFUk5fRVJSICJydGxsaWI6ICIgZiwgIyMgYSkKKyNkZWZpbmUgUlRMTElCX1dBUk5JTkcoZiwgYS4uLikgcHJpbnRrKEtFUk5fV0FSTklORyAicnRsbGliOiAiIGYsICMjIGEpCisjZGVmaW5lIFJUTExJQl9ERUJVR19JTkZPKGYsIGEuLi4pICAgUlRMTElCX0RFQlVHKFJUTExJQl9ETF9JTkZPLCBmLCAjIyBhKQorCisjZGVmaW5lIFJUTExJQl9ERUJVR19XWChmLCBhLi4uKSAgICAgUlRMTElCX0RFQlVHKFJUTExJQl9ETF9XWCwgZiwgIyMgYSkKKyNkZWZpbmUgUlRMTElCX0RFQlVHX1NDQU4oZiwgYS4uLikgICBSVExMSUJfREVCVUcoUlRMTElCX0RMX1NDQU4sIGYsICMjIGEpCisjZGVmaW5lIFJUTExJQl9ERUJVR19TVEFURShmLCBhLi4uKSAgUlRMTElCX0RFQlVHKFJUTExJQl9ETF9TVEFURSwgZiwgIyMgYSkKKyNkZWZpbmUgUlRMTElCX0RFQlVHX01HTVQoZiwgYS4uLikgIFJUTExJQl9ERUJVRyhSVExMSUJfRExfTUdNVCwgZiwgIyMgYSkKKyNkZWZpbmUgUlRMTElCX0RFQlVHX0ZSQUcoZiwgYS4uLikgIFJUTExJQl9ERUJVRyhSVExMSUJfRExfRlJBRywgZiwgIyMgYSkKKyNkZWZpbmUgUlRMTElCX0RFQlVHX0VBUChmLCBhLi4uKSAgUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FQVAsIGYsICMjIGEpCisjZGVmaW5lIFJUTExJQl9ERUJVR19EUk9QKGYsIGEuLi4pICBSVExMSUJfREVCVUcoUlRMTElCX0RMX0RST1AsIGYsICMjIGEpCisjZGVmaW5lIFJUTExJQl9ERUJVR19UWChmLCBhLi4uKSAgUlRMTElCX0RFQlVHKFJUTExJQl9ETF9UWCwgZiwgIyMgYSkKKyNkZWZpbmUgUlRMTElCX0RFQlVHX1JYKGYsIGEuLi4pICBSVExMSUJfREVCVUcoUlRMTElCX0RMX1JYLCBmLCAjIyBhKQorI2RlZmluZSBSVExMSUJfREVCVUdfUU9TKGYsIGEuLi4pICBSVExMSUJfREVCVUcoUlRMTElCX0RMX1FPUywgZiwgIyMgYSkKKworLyogQWRkZWQgYnkgQW5uaWUsIDIwMDUtMTEtMjIuICovCisjZGVmaW5lIE1BWF9TVFJfTEVOICAgICA2NAorLyogSSB3YW50IHRvIHNlZSBBU0NJSSAzMyB0byAxMjYgb25seS4gT3RoZXJ3aXNlLCBJIHByaW50ICc/Jy4gKi8KKyNkZWZpbmUgUFJJTlRBQkxFKF9jaCkgIChfY2ggPiAnIScgJiYgX2NoIDwgJ34nKQorI2RlZmluZSBSVExMSUJfUFJJTlRfU1RSKF9Db21wLCBfVGl0bGVTdHJpbmcsIF9QdHIsIF9MZW4pCQlcCisJaWYgKChfQ29tcCkgJiBsZXZlbCkgewkJCQkJICAgICAgIFwKKwkJaW50CSAgICAgX19pOwkJCQkgICAgXAorCQl1OCAgc3RydWN0IGJ1ZmZlcltNQVhfU1RSX0xFTl07CQkJCVwKKwkJaW50IGxlbmd0aCA9IChfTGVuIDwgTUFYX1NUUl9MRU4pID8gX0xlbiA6IChNQVhfU1RSX0xFTi0xKSA7XAorCQltZW1zZXQoc3RydWN0IGJ1ZmZlciwgMCwgTUFYX1NUUl9MRU4pOwkJXAorCQltZW1jcHkoc3RydWN0IGJ1ZmZlciwgKHU4ICopX1B0ciwgbGVuZ3RoKTsJCVwKKwkJZm9yIChfX2kgPSAwOyBfX2kgPCBNQVhfU1RSX0xFTjsgX19pKyspIHsJCVwKKwkJCWlmICghUFJJTlRBQkxFKHN0cnVjdCBidWZmZXJbX19pXSkpCQlcCisJCQkJc3RydWN0IGJ1ZmZlcltfX2ldID0gJz8nOwkJXAorCQl9CQkJCQkJCVwKKwkJc3RydWN0IGJ1ZmZlcltsZW5ndGhdID0gJ1wwJzsJCQkJXAorCQlwcmludGsoS0VSTl9JTkZPICJSdGw4MTl4OiAiKTsJCQkJXAorCQlwcmludGsoX1RpdGxlU3RyaW5nKTsJCQkJCVwKKwkJcHJpbnRrKCI6ICVkLCA8JXM+XG4iLCBfTGVuLCBzdHJ1Y3QgYnVmZmVyKTsJCVwKKwl9CisjaWZuZGVmIEVUSF9QX1BBRQorI2RlZmluZSBFVEhfUF9QQUUgMHg4ODhFIC8qIFBvcnQgQWNjZXNzIEVudGl0eSAoSUVFRSA4MDIuMVgpICovCisjZGVmaW5lIEVUSF9QX0lQCTB4MDgwMAkJLyogSW50ZXJuZXQgUHJvdG9jb2wgcGFja2V0CSovCisjZGVmaW5lIEVUSF9QX0FSUAkweDA4MDYJCS8qIEFkZHJlc3MgUmVzb2x1dGlvbiBwYWNrZXQJKi8KKyNlbmRpZiAvKiBFVEhfUF9QQUUgKi8KKworI2RlZmluZSBFVEhfUF9QUkVBVVRIIDB4ODhDNyAvKiBJRUVFIDgwMi4xMWkgcHJlLWF1dGhlbnRpY2F0aW9uICovCisKKyNpZm5kZWYgRVRIX1BfODAyMTFfUkFXCisjZGVmaW5lIEVUSF9QXzgwMjExX1JBVyAoRVRIX1BfRUNPTkVUICsgMSkKKyNlbmRpZgorCisvKiBJRUVFIDgwMi4xMSBkZWZpbmVzICovCisKKyNkZWZpbmUgUDgwMjExX09VSV9MRU4gMworCitzdHJ1Y3QgcnRsbGliX3NuYXBfaGRyIHsKKworCXU4ICAgIGRzYXA7ICAgLyogYWx3YXlzIDB4QUEgKi8KKwl1OCAgICBzc2FwOyAgIC8qIGFsd2F5cyAweEFBICovCisJdTggICAgY3RybDsgICAvKiBhbHdheXMgMHgwMyAqLworCXU4ICAgIG91aVtQODAyMTFfT1VJX0xFTl07ICAgIC8qIG9yZ2FuaXphdGlvbmFsIHVuaXZlcnNhbCBpZCAqLworCit9IF9fcGFja2VkOworCitlbnVtIF9SRUdfUFJFQU1CTEVfTU9ERSB7CisJUFJFQU1CTEVfTE9ORyA9IDEsCisJUFJFQU1CTEVfQVVUTyA9IDIsCisJUFJFQU1CTEVfU0hPUlQgPSAzLAorfTsKKworI2RlZmluZSBTTkFQX1NJWkUgc2l6ZW9mKHN0cnVjdCBydGxsaWJfc25hcF9oZHIpCisKKyNkZWZpbmUgV0xBTl9GQ19HRVRfVkVSUyhmYykgKChmYykgJiBSVExMSUJfRkNUTF9WRVJTKQorI2RlZmluZSBXTEFOX0ZDX0dFVF9UWVBFKGZjKSAoKGZjKSAmIFJUTExJQl9GQ1RMX0ZUWVBFKQorI2RlZmluZSBXTEFOX0ZDX0dFVF9TVFlQRShmYykgKChmYykgJiBSVExMSUJfRkNUTF9TVFlQRSkKKyNkZWZpbmUgV0xBTl9GQ19NT1JFX0RBVEEoZmMpICgoZmMpICYgUlRMTElCX0ZDVExfTU9SRURBVEEpCisKKyNkZWZpbmUgV0xBTl9GQ19HRVRfRlJBTUVUWVBFKGZjKSAoKGZjKSAmIFJUTExJQl9GQ1RMX0ZSQU1FVFlQRSkKKyNkZWZpbmUgV0xBTl9HRVRfU0VRX0ZSQUcoc2VxKSAoKHNlcSkgJiBSVExMSUJfU0NUTF9GUkFHKQorI2RlZmluZSBXTEFOX0dFVF9TRVFfU0VRKHNlcSkgICgoKHNlcSkgJiBSVExMSUJfU0NUTF9TRVEpID4+IDQpCisKKy8qIEF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobXMgKi8KKyNkZWZpbmUgV0xBTl9BVVRIX09QRU4gMAorI2RlZmluZSBXTEFOX0FVVEhfU0hBUkVEX0tFWSAxCisjZGVmaW5lIFdMQU5fQVVUSF9MRUFQIDEyOAorCisjZGVmaW5lIFdMQU5fQVVUSF9DSEFMTEVOR0VfTEVOIDEyOAorCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9FU1MgKDE8PDApCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9JQlNTICgxPDwxKQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0ZfUE9MTEFCTEUgKDE8PDIpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9DRl9QT0xMX1JFUVVFU1QgKDE8PDMpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZICgxPDw0KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUgKDE8PDUpCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9QQkNDICgxPDw2KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfQ0hBTk5FTF9BR0lMSVRZICgxPDw3KQorI2RlZmluZSBXTEFOX0NBUEFCSUxJVFlfU1BFQ1RSVU1fTUdNVCAoMTw8OCkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1FPUyAoMTw8OSkKKyNkZWZpbmUgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1RfVElNRSAoMTw8MTApCisjZGVmaW5lIFdMQU5fQ0FQQUJJTElUWV9EU1NTX09GRE0gKDE8PDEzKQorCisvKiA4MDIuMTFnIEVSUCBpbmZvcm1hdGlvbiBlbGVtZW50ICovCisjZGVmaW5lIFdMQU5fRVJQX05PTl9FUlBfUFJFU0VOVCAoMTw8MCkKKyNkZWZpbmUgV0xBTl9FUlBfVVNFX1BST1RFQ1RJT04gKDE8PDEpCisjZGVmaW5lIFdMQU5fRVJQX0JBUktFUl9QUkVBTUJMRSAoMTw8MikKKworLyogU3RhdHVzIGNvZGVzICovCitlbnVtIHJ0bGxpYl9zdGF0dXNjb2RlIHsKKwlXTEFOX1NUQVRVU19TVUNDRVNTID0gMCwKKwlXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFID0gMSwKKwlXTEFOX1NUQVRVU19DQVBTX1VOU1VQUE9SVEVEID0gMTAsCisJV0xBTl9TVEFUVVNfUkVBU1NPQ19OT19BU1NPQyA9IDExLAorCVdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9VTlNQRUMgPSAxMiwKKwlXTEFOX1NUQVRVU19OT1RfU1VQUE9SVEVEX0FVVEhfQUxHID0gMTMsCisJV0xBTl9TVEFUVVNfVU5LTk9XTl9BVVRIX1RSQU5TQUNUSU9OID0gMTQsCisJV0xBTl9TVEFUVVNfQ0hBTExFTkdFX0ZBSUwgPSAxNSwKKwlXTEFOX1NUQVRVU19BVVRIX1RJTUVPVVQgPSAxNiwKKwlXTEFOX1NUQVRVU19BUF9VTkFCTEVfVE9fSEFORExFX05FV19TVEEgPSAxNywKKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfUkFURVMgPSAxOCwKKwkvKiA4MDIuMTFiICovCisJV0xBTl9TVEFUVVNfQVNTT0NfREVOSUVEX05PU0hPUlRQUkVBTUJMRSA9IDE5LAorCVdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT1BCQ0MgPSAyMCwKKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9BR0lMSVRZID0gMjEsCisJLyogODAyLjExaCAqLworCVdMQU5fU1RBVFVTX0FTU09DX0RFTklFRF9OT1NQRUNUUlVNID0gMjIsCisJV0xBTl9TVEFUVVNfQVNTT0NfUkVKRUNURURfQkFEX1BPV0VSID0gMjMsCisJV0xBTl9TVEFUVVNfQVNTT0NfUkVKRUNURURfQkFEX1NVUFBfQ0hBTiA9IDI0LAorCS8qIDgwMi4xMWcgKi8KKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9TSE9SVFRJTUUgPSAyNSwKKwlXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfTk9EU1NTT0ZETSA9IDI2LAorCS8qIDgwMi4xMWkgKi8KKwlXTEFOX1NUQVRVU19JTlZBTElEX0lFID0gNDAsCisJV0xBTl9TVEFUVVNfSU5WQUxJRF9HUk9VUF9DSVBIRVIgPSA0MSwKKwlXTEFOX1NUQVRVU19JTlZBTElEX1BBSVJXSVNFX0NJUEhFUiA9IDQyLAorCVdMQU5fU1RBVFVTX0lOVkFMSURfQUtNUCA9IDQzLAorCVdMQU5fU1RBVFVTX1VOU1VQUF9SU05fVkVSU0lPTiA9IDQ0LAorCVdMQU5fU1RBVFVTX0lOVkFMSURfUlNOX0lFX0NBUCA9IDQ1LAorCVdMQU5fU1RBVFVTX0NJUEhFUl9TVUlURV9SRUpFQ1RFRCA9IDQ2LAorfTsKKworLyogUmVhc29uIGNvZGVzICovCitlbnVtIHJ0bGxpYl9yZWFzb25jb2RlIHsKKwlXTEFOX1JFQVNPTl9VTlNQRUNJRklFRCA9IDEsCisJV0xBTl9SRUFTT05fUFJFVl9BVVRIX05PVF9WQUxJRCA9IDIsCisJV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcgPSAzLAorCVdMQU5fUkVBU09OX0RJU0FTU09DX0RVRV9UT19JTkFDVElWSVRZID0gNCwKKwlXTEFOX1JFQVNPTl9ESVNBU1NPQ19BUF9CVVNZID0gNSwKKwlXTEFOX1JFQVNPTl9DTEFTUzJfRlJBTUVfRlJPTV9OT05BVVRIX1NUQSA9IDYsCisJV0xBTl9SRUFTT05fQ0xBU1MzX0ZSQU1FX0ZST01fTk9OQVNTT0NfU1RBID0gNywKKwlXTEFOX1JFQVNPTl9ESVNBU1NPQ19TVEFfSEFTX0xFRlQgPSA4LAorCVdMQU5fUkVBU09OX1NUQV9SRVFfQVNTT0NfV0lUSE9VVF9BVVRIID0gOSwKKwkvKiA4MDIuMTFoICovCisJV0xBTl9SRUFTT05fRElTQVNTT0NfQkFEX1BPV0VSID0gMTAsCisJV0xBTl9SRUFTT05fRElTQVNTT0NfQkFEX1NVUFBfQ0hBTiA9IDExLAorCS8qIDgwMi4xMWkgKi8KKwlXTEFOX1JFQVNPTl9JTlZBTElEX0lFID0gMTMsCisJV0xBTl9SRUFTT05fTUlDX0ZBSUxVUkUgPSAxNCwKKwlXTEFOX1JFQVNPTl80V0FZX0hBTkRTSEFLRV9USU1FT1VUID0gMTUsCisJV0xBTl9SRUFTT05fR1JPVVBfS0VZX0hBTkRTSEFLRV9USU1FT1VUID0gMTYsCisJV0xBTl9SRUFTT05fSUVfRElGRkVSRU5UID0gMTcsCisJV0xBTl9SRUFTT05fSU5WQUxJRF9HUk9VUF9DSVBIRVIgPSAxOCwKKwlXTEFOX1JFQVNPTl9JTlZBTElEX1BBSVJXSVNFX0NJUEhFUiA9IDE5LAorCVdMQU5fUkVBU09OX0lOVkFMSURfQUtNUCA9IDIwLAorCVdMQU5fUkVBU09OX1VOU1VQUF9SU05fVkVSU0lPTiA9IDIxLAorCVdMQU5fUkVBU09OX0lOVkFMSURfUlNOX0lFX0NBUCA9IDIyLAorCVdMQU5fUkVBU09OX0lFRUU4MDIxWF9GQUlMRUQgPSAyMywKKwlXTEFOX1JFQVNPTl9DSVBIRVJfU1VJVEVfUkVKRUNURUQgPSAyNCwKK307CisKKyNkZWZpbmUgUlRMTElCX1NUQVRNQVNLX1NJR05BTCAoMTw8MCkKKyNkZWZpbmUgUlRMTElCX1NUQVRNQVNLX1JTU0kgKDE8PDEpCisjZGVmaW5lIFJUTExJQl9TVEFUTUFTS19OT0lTRSAoMTw8MikKKyNkZWZpbmUgUlRMTElCX1NUQVRNQVNLX1JBVEUgKDE8PDMpCisjZGVmaW5lIFJUTExJQl9TVEFUTUFTS19XRU1BU0sgMHg3CisKKyNkZWZpbmUgUlRMTElCX0NDS19NT0RVTEFUSU9OICAgICgxPDwwKQorI2RlZmluZSBSVExMSUJfT0ZETV9NT0RVTEFUSU9OICAgKDE8PDEpCisKKyNkZWZpbmUgUlRMTElCXzI0R0haX0JBTkQgICAgICgxPDwwKQorI2RlZmluZSBSVExMSUJfNTJHSFpfQkFORCAgICAgKDE8PDEpCisKKyNkZWZpbmUgUlRMTElCX0NDS19SQVRFX0xFTgkJNAorI2RlZmluZSBSVExMSUJfQ0NLX1JBVEVfMU1CCQkJMHgwMgorI2RlZmluZSBSVExMSUJfQ0NLX1JBVEVfMk1CCQkJMHgwNAorI2RlZmluZSBSVExMSUJfQ0NLX1JBVEVfNU1CCQkJMHgwQgorI2RlZmluZSBSVExMSUJfQ0NLX1JBVEVfMTFNQgkJCTB4MTYKKyNkZWZpbmUgUlRMTElCX09GRE1fUkFURV9MRU4JCTgKKyNkZWZpbmUgUlRMTElCX09GRE1fUkFURV82TUIJCQkweDBDCisjZGVmaW5lIFJUTExJQl9PRkRNX1JBVEVfOU1CCQkJMHgxMgorI2RlZmluZSBSVExMSUJfT0ZETV9SQVRFXzEyTUIJCTB4MTgKKyNkZWZpbmUgUlRMTElCX09GRE1fUkFURV8xOE1CCQkweDI0CisjZGVmaW5lIFJUTExJQl9PRkRNX1JBVEVfMjRNQgkJMHgzMAorI2RlZmluZSBSVExMSUJfT0ZETV9SQVRFXzM2TUIJCTB4NDgKKyNkZWZpbmUgUlRMTElCX09GRE1fUkFURV80OE1CCQkweDYwCisjZGVmaW5lIFJUTExJQl9PRkRNX1JBVEVfNTRNQgkJMHg2QworI2RlZmluZSBSVExMSUJfQkFTSUNfUkFURV9NQVNLCQkweDgwCisKKyNkZWZpbmUgUlRMTElCX0NDS19SQVRFXzFNQl9NQVNLCQkoMTw8MCkKKyNkZWZpbmUgUlRMTElCX0NDS19SQVRFXzJNQl9NQVNLCQkoMTw8MSkKKyNkZWZpbmUgUlRMTElCX0NDS19SQVRFXzVNQl9NQVNLCQkoMTw8MikKKyNkZWZpbmUgUlRMTElCX0NDS19SQVRFXzExTUJfTUFTSwkJKDE8PDMpCisjZGVmaW5lIFJUTExJQl9PRkRNX1JBVEVfNk1CX01BU0sJCSgxPDw0KQorI2RlZmluZSBSVExMSUJfT0ZETV9SQVRFXzlNQl9NQVNLCQkoMTw8NSkKKyNkZWZpbmUgUlRMTElCX09GRE1fUkFURV8xMk1CX01BU0sJCSgxPDw2KQorI2RlZmluZSBSVExMSUJfT0ZETV9SQVRFXzE4TUJfTUFTSwkJKDE8PDcpCisjZGVmaW5lIFJUTExJQl9PRkRNX1JBVEVfMjRNQl9NQVNLCQkoMTw8OCkKKyNkZWZpbmUgUlRMTElCX09GRE1fUkFURV8zNk1CX01BU0sJCSgxPDw5KQorI2RlZmluZSBSVExMSUJfT0ZETV9SQVRFXzQ4TUJfTUFTSwkJKDE8PDEwKQorI2RlZmluZSBSVExMSUJfT0ZETV9SQVRFXzU0TUJfTUFTSwkJKDE8PDExKQorCisjZGVmaW5lIFJUTExJQl9DQ0tfUkFURVNfTUFTSwkJMHgwMDAwMDAwRgorI2RlZmluZSBSVExMSUJfQ0NLX0JBU0lDX1JBVEVTX01BU0sJKFJUTExJQl9DQ0tfUkFURV8xTUJfTUFTSyB8IFwKKwlSVExMSUJfQ0NLX1JBVEVfMk1CX01BU0spCisjZGVmaW5lIFJUTExJQl9DQ0tfREVGQVVMVF9SQVRFU19NQVNLCShSVExMSUJfQ0NLX0JBU0lDX1JBVEVTX01BU0sgfCBcCisJUlRMTElCX0NDS19SQVRFXzVNQl9NQVNLIHwgXAorCVJUTExJQl9DQ0tfUkFURV8xMU1CX01BU0spCisKKyNkZWZpbmUgUlRMTElCX09GRE1fUkFURVNfTUFTSwkJMHgwMDAwMEZGMAorI2RlZmluZSBSVExMSUJfT0ZETV9CQVNJQ19SQVRFU19NQVNLCShSVExMSUJfT0ZETV9SQVRFXzZNQl9NQVNLIHwgXAorCVJUTExJQl9PRkRNX1JBVEVfMTJNQl9NQVNLIHwgXAorCVJUTExJQl9PRkRNX1JBVEVfMjRNQl9NQVNLKQorI2RlZmluZSBSVExMSUJfT0ZETV9ERUZBVUxUX1JBVEVTX01BU0sJKFJUTExJQl9PRkRNX0JBU0lDX1JBVEVTX01BU0sgfCBcCisJUlRMTElCX09GRE1fUkFURV85TUJfTUFTSyAgfCBcCisJUlRMTElCX09GRE1fUkFURV8xOE1CX01BU0sgfCBcCisJUlRMTElCX09GRE1fUkFURV8zNk1CX01BU0sgfCBcCisJUlRMTElCX09GRE1fUkFURV80OE1CX01BU0sgfCBcCisJUlRMTElCX09GRE1fUkFURV81NE1CX01BU0spCisjZGVmaW5lIFJUTExJQl9ERUZBVUxUX1JBVEVTX01BU0sgKFJUTExJQl9PRkRNX0RFRkFVTFRfUkFURVNfTUFTSyB8IFwKKwkJCQlSVExMSUJfQ0NLX0RFRkFVTFRfUkFURVNfTUFTSykKKworI2RlZmluZSBSVExMSUJfTlVNX09GRE1fUkFURVMJICAgIDgKKyNkZWZpbmUgUlRMTElCX05VTV9DQ0tfUkFURVMJCSAgICA0CisjZGVmaW5lIFJUTExJQl9PRkRNX1NISUZUX01BU0tfQQkgNAorCisKKy8qIHRoaXMgaXMgc3RvbGVuIGFuZCBtb2RpZmllZCBmcm9tIHRoZSBtYWR3aWZpIGRyaXZlciovCisjZGVmaW5lIFJUTExJQl9GQzBfVFlQRV9NQVNLCQkweDBjCisjZGVmaW5lIFJUTExJQl9GQzBfVFlQRV9EQVRBCQkweDA4CisjZGVmaW5lIFJUTExJQl9GQzBfU1VCVFlQRV9NQVNLCTB4QjAKKyNkZWZpbmUgUlRMTElCX0ZDMF9TVUJUWVBFX1FPUwkweDgwCisKKyNkZWZpbmUgUlRMTElCX1FPU19IQVNfU0VRKGZjKSBcCisJKCgoZmMpICYgKFJUTExJQl9GQzBfVFlQRV9NQVNLIHwgUlRMTElCX0ZDMF9TVUJUWVBFX01BU0spKSA9PSBcCisJIChSVExMSUJfRkMwX1RZUEVfREFUQSB8IFJUTExJQl9GQzBfU1VCVFlQRV9RT1MpKQorCisvKiB0aGlzIGlzIHN0b2xlbiBmcm9tIGlwdzIyMDAgZHJpdmVyICovCisjZGVmaW5lIElFRUVfSUJTU19NQUNfSEFTSF9TSVpFIDMxCitzdHJ1Y3QgaWVlZV9pYnNzX3NlcSB7CisJdTggbWFjW0VUSF9BTEVOXTsKKwl1MTYgc2VxX251bVsxN107CisJdTE2IGZyYWdfbnVtWzE3XTsKKwl1bnNpZ25lZCBsb25nIHBhY2tldF90aW1lWzE3XTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCisvKiBOT1RFOiBUaGlzIGRhdGEgaXMgZm9yIHN0YXRpc3RpY2FsIHB1cnBvc2VzOyBub3QgYWxsIGhhcmR3YXJlIHByb3ZpZGVzIHRoaXMKKyAqICAgICAgIGluZm9ybWF0aW9uIGZvciBmcmFtZXMgcmVjZWl2ZWQuICBOb3Qgc2V0dGluZyB0aGVzZSB3aWxsIG5vdCBjYXVzZQorICogICAgICAgYW55IGFkdmVyc2UgYWZmZWN0cy4gKi8KK3N0cnVjdCBydGxsaWJfcnhfc3RhdHMgeworCXU2NCBtYWNfdGltZTsKKwlzOCAgcnNzaTsKKwl1OCAgc2lnbmFsOworCXU4ICBub2lzZTsKKwl1MTYgcmF0ZTsgLyogaW4gMTAwIGticHMgKi8KKwl1OCAgcmVjZWl2ZWRfY2hhbm5lbDsKKwl1OCAgY29udHJvbDsKKwl1OCAgbWFzazsKKwl1OCAgZnJlcTsKKwl1MTYgbGVuOworCXU2NCB0c2Y7CisJdTMyIGJlYWNvbl90aW1lOworCXU4ICBuaWNfdHlwZTsKKwl1MTYgTGVuZ3RoOworCXU4ICBTaWduYWxRdWFsaXR5OworCXMzMiBSZWN2U2lnbmFsUG93ZXI7CisJczggIFJ4UG93ZXI7CisJdTggIFNpZ25hbFN0cmVuZ3RoOworCXUxNiBiSHdFcnJvcjoxOworCXUxNiBiQ1JDOjE7CisJdTE2IGJJQ1Y6MTsKKwl1MTYgYlNob3J0UHJlYW1ibGU6MTsKKwl1MTYgQW50ZW5uYToxOworCXUxNiBEZWNyeXB0ZWQ6MTsKKwl1MTYgV2FrZXVwOjE7CisJdTE2IFJlc2VydmVkMDoxOworCXU4ICBBR0M7CisJdTMyIFRpbWVTdGFtcExvdzsKKwl1MzIgVGltZVN0YW1wSGlnaDsKKwlib29sIGJTaGlmdDsKKwlib29sIGJJc1Fvc0RhdGE7CisJdTggICBVc2VyUHJpb3JpdHk7CisKKwl1OCAgICBSeERydkluZm9TaXplOworCXU4ICAgIFJ4QnVmU2hpZnQ7CisJYm9vbCAgYklzQU1QRFU7CisJYm9vbCAgYkZpcnN0TVBEVTsKKwlib29sICBiQ29udGFpbkhUQzsKKwlib29sICBSeElzNDBNSHpQYWNrZXQ7CisJdTMyICAgUnhQV0RCQWxsOworCXU4ICAgIFJ4TUlNT1NpZ25hbFN0cmVuZ3RoWzRdOworCXM4ICAgIFJ4TUlNT1NpZ25hbFF1YWxpdHlbMl07CisJYm9vbCAgYlBhY2tldE1hdGNoQlNTSUQ7CisJYm9vbCAgYklzQ0NLOworCWJvb2wgIGJQYWNrZXRUb1NlbGY7CisJdTggKnZpcnR1YWxfYWRkcmVzczsKKwl1MTYgICAgcGFja2V0bGVuZ3RoOworCXUxNiAgICBmcmFnbGVuZ3RoOworCXUxNiAgICBmcmFnb2Zmc2V0OworCXUxNiAgICBudG90YWxmcmFnOworCWJvb2wgICBiaXNyeGFnZ3JzdWJmcmFtZTsKKwlib29sICAgYlBhY2tldEJlYWNvbjsKKwlib29sICAgYlRvU2VsZkJBOworCWNoYXIgICBjY2tfYWRjX3B3ZGJbNF07CisJdTE2ICAgIFNlcV9OdW07CisJdTggICAgIG5Ub3RhbEFnZ1BrdDsKK307CisKKy8qIElFRUUgODAyLjExIHJlcXVpcmVzIHRoYXQgU1RBIHN1cHBvcnRzIGNvbmN1cnJlbnQgcmVjZXB0aW9uIG9mIGF0IGxlYXN0CisgKiB0aHJlZSBmcmFnbWVudGVkIGZyYW1lcy4gVGhpcyBkZWZpbmUgY2FuIGJlIGluY3JlYXNlZCB0byBzdXBwb3J0IG1vcmUKKyAqIGNvbmN1cnJlbnQgZnJhbWVzLCBidXQgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgZWFjaCBlbnRyeSBjYW4gY29uc3VtZSBhYm91dAorICogMiBrQiBvZiBSQU0gYW5kIGluY3JlYXNpbmcgY2FjaGUgc2l6ZSB3aWxsIHNsb3cgZG93biBmcmFtZSByZWFzc2VtYmx5LiAqLworI2RlZmluZSBSVExMSUJfRlJBR19DQUNIRV9MRU4gNAorCitzdHJ1Y3QgcnRsbGliX2ZyYWdfZW50cnkgeworCXVuc2lnbmVkIGxvbmcgZmlyc3RfZnJhZ190aW1lOworCXVuc2lnbmVkIGludCBzZXE7CisJdW5zaWduZWQgaW50IGxhc3RfZnJhZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXU4IHNyY19hZGRyW0VUSF9BTEVOXTsKKwl1OCBkc3RfYWRkcltFVEhfQUxFTl07Cit9OworCitzdHJ1Y3QgcnRsbGliX3N0YXRzIHsKKwl1bnNpZ25lZCBpbnQgdHhfdW5pY2FzdF9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X211bHRpY2FzdF9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X2ZyYWdtZW50czsKKwl1bnNpZ25lZCBpbnQgdHhfdW5pY2FzdF9vY3RldHM7CisJdW5zaWduZWQgaW50IHR4X211bHRpY2FzdF9vY3RldHM7CisJdW5zaWduZWQgaW50IHR4X2RlZmVycmVkX3RyYW5zbWlzc2lvbnM7CisJdW5zaWduZWQgaW50IHR4X3NpbmdsZV9yZXRyeV9mcmFtZXM7CisJdW5zaWduZWQgaW50IHR4X211bHRpcGxlX3JldHJ5X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgdHhfcmV0cnlfbGltaXRfZXhjZWVkZWQ7CisJdW5zaWduZWQgaW50IHR4X2Rpc2NhcmRzOworCXVuc2lnbmVkIGludCByeF91bmljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgcnhfbXVsdGljYXN0X2ZyYW1lczsKKwl1bnNpZ25lZCBpbnQgcnhfZnJhZ21lbnRzOworCXVuc2lnbmVkIGludCByeF91bmljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgcnhfbXVsdGljYXN0X29jdGV0czsKKwl1bnNpZ25lZCBpbnQgcnhfZmNzX2Vycm9yczsKKwl1bnNpZ25lZCBpbnQgcnhfZGlzY2FyZHNfbm9fYnVmZmVyOworCXVuc2lnbmVkIGludCB0eF9kaXNjYXJkc193cm9uZ19zYTsKKwl1bnNpZ25lZCBpbnQgcnhfZGlzY2FyZHNfdW5kZWNyeXB0YWJsZTsKKwl1bnNpZ25lZCBpbnQgcnhfbWVzc2FnZV9pbl9tc2dfZnJhZ21lbnRzOworCXVuc2lnbmVkIGludCByeF9tZXNzYWdlX2luX2JhZF9tc2dfZnJhZ21lbnRzOworfTsKKworc3RydWN0IHJ0bGxpYl9kZXZpY2U7CisKKyNpbmNsdWRlICJydGxsaWJfY3J5cHQuaCIKKworI2RlZmluZSBTRUNfS0VZXzEJICgxPDwwKQorI2RlZmluZSBTRUNfS0VZXzIJICgxPDwxKQorI2RlZmluZSBTRUNfS0VZXzMJICgxPDwyKQorI2RlZmluZSBTRUNfS0VZXzQJICgxPDwzKQorI2RlZmluZSBTRUNfQUNUSVZFX0tFWSAgICAoMTw8NCkKKyNkZWZpbmUgU0VDX0FVVEhfTU9ERSAgICAgKDE8PDUpCisjZGVmaW5lIFNFQ19VTklDQVNUX0dST1VQICgxPDw2KQorI2RlZmluZSBTRUNfTEVWRUwJICgxPDw3KQorI2RlZmluZSBTRUNfRU5BQkxFRCAgICAgICAoMTw8OCkKKyNkZWZpbmUgU0VDX0VOQ1JZUFQgICAgICAgKDE8PDkpCisKKyNkZWZpbmUgU0VDX0xFVkVMXzAgICAgICAwIC8qIE5vbmUgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzEgICAgICAxIC8qIFdFUCA0MCBhbmQgMTA0IGJpdCAqLworI2RlZmluZSBTRUNfTEVWRUxfMiAgICAgIDIgLyogTGV2ZWwgMSArIFRLSVAgKi8KKyNkZWZpbmUgU0VDX0xFVkVMXzJfQ0tJUCAzIC8qIExldmVsIDEgKyBDS0lQICovCisjZGVmaW5lIFNFQ19MRVZFTF8zICAgICAgNCAvKiBMZXZlbCAyICsgQ0NNUCAqLworCisjZGVmaW5lIFNFQ19BTEdfTk9ORQkJMAorI2RlZmluZSBTRUNfQUxHX1dFUAkJMQorI2RlZmluZSBTRUNfQUxHX1RLSVAJCTIKKyNkZWZpbmUgU0VDX0FMR19DQ01QCQk0CisKKyNkZWZpbmUgV0VQX0tFWVMJCTQKKyNkZWZpbmUgV0VQX0tFWV9MRU4JCTEzCisjZGVmaW5lIFNDTV9LRVlfTEVOCQkzMgorI2RlZmluZSBTQ01fVEVNUE9SQUxfS0VZX0xFTkdUSCAxNgorCitzdHJ1Y3QgcnRsbGliX3NlY3VyaXR5IHsKKwl1MTYgYWN0aXZlX2tleToyLAorCSAgICBlbmFibGVkOjEsCisJICAgIGF1dGhfbW9kZToyLAorCSAgICBhdXRoX2FsZ286NCwKKwkgICAgdW5pY2FzdF91c2VzX2dyb3VwOjEsCisJICAgIGVuY3J5cHQ6MTsKKwl1OCBrZXlfc2l6ZXNbV0VQX0tFWVNdOworCXU4IGtleXNbV0VQX0tFWVNdW1NDTV9LRVlfTEVOXTsKKwl1OCBsZXZlbDsKKwl1MTYgZmxhZ3M7Cit9IF9fcGFja2VkOworCisKKy8qCisgODAyLjExIGRhdGEgZnJhbWUgZnJvbSBBUAorICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCitCeXRlcyB8ICAyICAgfCAgMiAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgICA2ICAgIHwgIDIgICB8IDAuLjIzMTIgfCAgIDQgIHwKKyAgICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfAorRGVzYy4gfCBjdHJsIHwgZHVyYSB8ICBEQS9SQSAgfCAgIFRBICAgIHwgICAgU0EgICB8IFNlcXUgfCAgZnJhbWUgIHwgIGZjcyB8CisgICAgICB8ICAgICAgfCB0aW9uIHwgKEJTU0lEKSB8CSB8CSB8IGVuY2UgfCAgZGF0YSAgIHwgICAgICB8CisgICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKK1RvdGFsOiAyOC0yMzQwIGJ5dGVzCisqLworCisvKiBNYW5hZ2VtZW50IEZyYW1lIEluZm9ybWF0aW9uIEVsZW1lbnQgVHlwZXMgKi8KK2VudW0gcnRsbGliX21maWUgeworCU1GSUVfVFlQRV9TU0lEID0gMCwKKwlNRklFX1RZUEVfUkFURVMgPSAxLAorCU1GSUVfVFlQRV9GSF9TRVQgPSAyLAorCU1GSUVfVFlQRV9EU19TRVQgPSAzLAorCU1GSUVfVFlQRV9DRl9TRVQgPSA0LAorCU1GSUVfVFlQRV9USU0gPSA1LAorCU1GSUVfVFlQRV9JQlNTX1NFVCA9IDYsCisJTUZJRV9UWVBFX0NPVU5UUlkgPSA3LAorCU1GSUVfVFlQRV9IT1BfUEFSQU1TID0gOCwKKwlNRklFX1RZUEVfSE9QX1RBQkxFID0gOSwKKwlNRklFX1RZUEVfUkVRVUVTVCA9IDEwLAorCU1GSUVfVFlQRV9DSEFMTEVOR0UgPSAxNiwKKwlNRklFX1RZUEVfUE9XRVJfQ09OU1RSQUlOVCA9IDMyLAorCU1GSUVfVFlQRV9QT1dFUl9DQVBBQklMSVRZID0gMzMsCisJTUZJRV9UWVBFX1RQQ19SRVFVRVNUID0gMzQsCisJTUZJRV9UWVBFX1RQQ19SRVBPUlQgPSAzNSwKKwlNRklFX1RZUEVfU1VQUF9DSEFOTkVMUyA9IDM2LAorCU1GSUVfVFlQRV9DU0EgPSAzNywKKwlNRklFX1RZUEVfTUVBU1VSRV9SRVFVRVNUID0gMzgsCisJTUZJRV9UWVBFX01FQVNVUkVfUkVQT1JUID0gMzksCisJTUZJRV9UWVBFX1FVSUVUID0gNDAsCisJTUZJRV9UWVBFX0lCU1NfREZTID0gNDEsCisJTUZJRV9UWVBFX0VSUCA9IDQyLAorCU1GSUVfVFlQRV9IVF9DQVAgPSA0NSwKKwlNRklFX1RZUEVfUlNOID0gNDgsCisJTUZJRV9UWVBFX1JBVEVTX0VYID0gNTAsCisJTUZJRV9UWVBFX0hUX0lORk8gPSA2MSwKKwlNRklFX1RZUEVfQUlST05FVCA9IDEzMywKKwlNRklFX1RZUEVfR0VORVJJQyA9IDIyMSwKKwlNRklFX1RZUEVfUU9TX1BBUkFNRVRFUiA9IDIyMiwKK307CisKKy8qIE1pbmltYWwgaGVhZGVyOyBjYW4gYmUgdXNlZCBmb3IgcGFzc2luZyA4MDIuMTEgZnJhbWVzIHdpdGggc3VmZmljaWVudAorICogaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiB1bmRlcmx5aW5nIGRhdGEgdHlwZSBpcyBhY3R1YWxseQorICogc3RvcmVkIGluIHRoZSBkYXRhLiAqLworc3RydWN0IHJ0bGxpYl9wc3BvbGxfaGRyIHsKKwlfX2xlMTYgZnJhbWVfY3RsOworCV9fbGUxNiBhaWQ7CisJdTggYnNzaWRbRVRIX0FMRU5dOworCXU4IHRhW0VUSF9BTEVOXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBydGxsaWJfaGRyIHsKKwlfX2xlMTYgZnJhbWVfY3RsOworCV9fbGUxNiBkdXJhdGlvbl9pZDsKKwl1OCBwYXlsb2FkWzBdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHJ0bGxpYl9oZHJfMWFkZHIgeworCV9fbGUxNiBmcmFtZV9jdGw7CisJX19sZTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBwYXlsb2FkWzBdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHJ0bGxpYl9oZHJfMmFkZHIgeworCV9fbGUxNiBmcmFtZV9jdGw7CisJX19sZTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggcGF5bG9hZFswXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBydGxsaWJfaGRyXzNhZGRyIHsKKwlfX2xlMTYgZnJhbWVfY3RsOworCV9fbGUxNiBkdXJhdGlvbl9pZDsKKwl1OCBhZGRyMVtFVEhfQUxFTl07CisJdTggYWRkcjJbRVRIX0FMRU5dOworCXU4IGFkZHIzW0VUSF9BTEVOXTsKKwlfX2xlMTYgc2VxX2N0bDsKKwl1OCBwYXlsb2FkWzBdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHJ0bGxpYl9oZHJfNGFkZHIgeworCV9fbGUxNiBmcmFtZV9jdGw7CisJX19sZTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggYWRkcjNbRVRIX0FMRU5dOworCV9fbGUxNiBzZXFfY3RsOworCXU4IGFkZHI0W0VUSF9BTEVOXTsKKwl1OCBwYXlsb2FkWzBdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHJxb3MgeworCV9fbGUxNiBmcmFtZV9jdGw7CisJX19sZTE2IGR1cmF0aW9uX2lkOworCXU4IGFkZHIxW0VUSF9BTEVOXTsKKwl1OCBhZGRyMltFVEhfQUxFTl07CisJdTggYWRkcjNbRVRIX0FMRU5dOworCV9fbGUxNiBzZXFfY3RsOworCV9fbGUxNiBxb3NfY3RsOworCXU4IHBheWxvYWRbMF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcnRsbGliX2hkcl80YWRkcnFvcyB7CisJX19sZTE2IGZyYW1lX2N0bDsKKwlfX2xlMTYgZHVyYXRpb25faWQ7CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CisJX19sZTE2IHNlcV9jdGw7CisJdTggYWRkcjRbRVRIX0FMRU5dOworCV9fbGUxNiBxb3NfY3RsOworCXU4IHBheWxvYWRbMF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcnRsbGliX2luZm9fZWxlbWVudCB7CisJdTggaWQ7CisJdTggbGVuOworCXU4IGRhdGFbMF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcnRsbGliX2F1dGhlbnRpY2F0aW9uIHsKKwlzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkciBoZWFkZXI7CisJX19sZTE2IGFsZ29yaXRobTsKKwlfX2xlMTYgdHJhbnNhY3Rpb247CisJX19sZTE2IHN0YXR1czsKKwkvKmNoYWxsZW5nZSovCisJc3RydWN0IHJ0bGxpYl9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHJ0bGxpYl9kaXNhdXRoIHsKKwlzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkciBoZWFkZXI7CisJX19sZTE2IHJlYXNvbjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBydGxsaWJfZGlzYXNzb2MgeworCXN0cnVjdCBydGxsaWJfaGRyXzNhZGRyIGhlYWRlcjsKKwlfX2xlMTYgcmVhc29uOworfSBfX3BhY2tlZDsKKworc3RydWN0IHJ0bGxpYl9wcm9iZV9yZXF1ZXN0IHsKKwlzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkciBoZWFkZXI7CisJLyogU1NJRCwgc3VwcG9ydGVkIHJhdGVzICovCisJc3RydWN0IHJ0bGxpYl9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHJ0bGxpYl9wcm9iZV9yZXNwb25zZSB7CisJc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgaGVhZGVyOworCXUzMiB0aW1lX3N0YW1wWzJdOworCV9fbGUxNiBiZWFjb25faW50ZXJ2YWw7CisJX19sZTE2IGNhcGFiaWxpdHk7CisJLyogU1NJRCwgc3VwcG9ydGVkIHJhdGVzLCBGSCBwYXJhbXMsIERTIHBhcmFtcywKKwkgKiBDRiBwYXJhbXMsIElCU1MgcGFyYW1zLCBUSU0gKGlmIGJlYWNvbiksIFJTTiAqLworCXN0cnVjdCBydGxsaWJfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKK30gX19wYWNrZWQ7CisKKy8qIEFsaWFzIGJlYWNvbiBmb3IgcHJvYmVfcmVzcG9uc2UgKi8KKyNkZWZpbmUgcnRsbGliX2JlYWNvbiBydGxsaWJfcHJvYmVfcmVzcG9uc2UKKworc3RydWN0IHJ0bGxpYl9hc3NvY19yZXF1ZXN0X2ZyYW1lIHsKKwlzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkciBoZWFkZXI7CisJX19sZTE2IGNhcGFiaWxpdHk7CisJX19sZTE2IGxpc3Rlbl9pbnRlcnZhbDsKKwkvKiBTU0lELCBzdXBwb3J0ZWQgcmF0ZXMsIFJTTiAqLworCXN0cnVjdCBydGxsaWJfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBydGxsaWJfcmVhc3NvY19yZXF1ZXN0X2ZyYW1lIHsKKwlzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkciBoZWFkZXI7CisJX19sZTE2IGNhcGFiaWxpdHk7CisJX19sZTE2IGxpc3Rlbl9pbnRlcnZhbDsKKwl1OCBjdXJyZW50X2FwW0VUSF9BTEVOXTsKKwkvKiBTU0lELCBzdXBwb3J0ZWQgcmF0ZXMsIFJTTiAqLworCXN0cnVjdCBydGxsaWJfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBydGxsaWJfYXNzb2NfcmVzcG9uc2VfZnJhbWUgeworCXN0cnVjdCBydGxsaWJfaGRyXzNhZGRyIGhlYWRlcjsKKwlfX2xlMTYgY2FwYWJpbGl0eTsKKwlfX2xlMTYgc3RhdHVzOworCV9fbGUxNiBhaWQ7CisJc3RydWN0IHJ0bGxpYl9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOyAvKiBzdXBwb3J0ZWQgcmF0ZXMgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBydGxsaWJfdHhiIHsKKwl1OCBucl9mcmFnczsKKwl1OCBlbmNyeXB0ZWQ7CisJdTggcXVldWVfaW5kZXg7CisJdTggcnRzX2luY2x1ZGVkOworCXUxNiByZXNlcnZlZDsKKwlfX2xlMTYgZnJhZ19zaXplOworCV9fbGUxNiBwYXlsb2FkX3NpemU7CisJc3RydWN0IHNrX2J1ZmYgKmZyYWdtZW50c1swXTsKK307CisKKyNkZWZpbmUgTUFYX1RYX0FHR19DT1VOVAkJICAxNgorc3RydWN0IHJ0bGxpYl9kcnZfYWdnX3R4YiB7CisJdTggbnJfZHJ2X2FnZ19mcmFtZXM7CisJc3RydWN0IHNrX2J1ZmYgKnR4X2FnZ19mcmFtZXNbTUFYX1RYX0FHR19DT1VOVF07Cit9IF9fcGFja2VkOworCisjZGVmaW5lIE1BWF9TVUJGUkFNRV9DT1VOVAkJICA2NAorc3RydWN0IHJ0bGxpYl9yeGIgeworCXU4IG5yX3N1YmZyYW1lczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc3ViZnJhbWVzW01BWF9TVUJGUkFNRV9DT1VOVF07CisJdTggZHN0W0VUSF9BTEVOXTsKKwl1OCBzcmNbRVRIX0FMRU5dOworfSBfX3BhY2tlZDsKKwordW5pb24gZnJhbWVxb3MgeworCXUxNiBzaG9ydGRhdGE7CisJdTggIGNoYXJkYXRhWzJdOworCXN0cnVjdCB7CisJCXUxNiB0aWQ6NDsKKwkJdTE2IGVvc3A6MTsKKwkJdTE2IGFja19wb2xpY3k6MjsKKwkJdTE2IHJlc2VydmVkOjE7CisJCXUxNiB0eG9wOjg7CisJfSBmaWVsZDsKK307CisKKy8qIFNXRUVQIFRBQkxFIEVOVFJJRVMgTlVNQkVSKi8KKyNkZWZpbmUgTUFYX1NXRUVQX1RBQl9FTlRSSUVTCQkgIDQyCisjZGVmaW5lIE1BWF9TV0VFUF9UQUJfRU5UUklFU19QRVJfUEFDS0VUICA3CisvKiBNQVhfUkFURVNfTEVOR1RIIG5lZWRzIHRvIGJlIDEyLiAgVGhlIHNwZWMgc2F5cyA4LCBhbmQgbWFueSBBUHMKKyAqIG9ubHkgdXNlIDgsIGFuZCB0aGVuIHVzZSBleHRlbmRlZCByYXRlcyBmb3IgdGhlIHJlbWFpbmluZyBzdXBwb3J0ZWQKKyAqIHJhdGVzLiAgT3RoZXIgQVBzLCBob3dldmVyLCBzdGljayBhbGwgb2YgdGhlaXIgc3VwcG9ydGVkIHJhdGVzIG9uIHRoZQorICogbWFpbiByYXRlcyBpbmZvcm1hdGlvbiBlbGVtZW50Li4uICovCisjZGVmaW5lIE1BWF9SQVRFU19MRU5HVEgJCSAgKCh1OCkxMikKKyNkZWZpbmUgTUFYX1JBVEVTX0VYX0xFTkdUSAkgICAgICAgKCh1OCkxNikKKyNkZWZpbmUgTUFYX05FVFdPUktfQ09VTlQJCSAgOTYKKworI2RlZmluZSBNQVhfQ0hBTk5FTF9OVU1CRVIJCSAxNjEKKyNkZWZpbmUgUlRMTElCX1NPRlRNQUNfU0NBTl9USU1FCSAgIDEwMAorI2RlZmluZSBSVExMSUJfU09GVE1BQ19BU1NPQ19SRVRSWV9USU1FIChIWiAqIDIpCisKKyNkZWZpbmUgQ1JDX0xFTkdUSAkJIDRVCisKKyNkZWZpbmUgTUFYX1dQQV9JRV9MRU4gNjQKKyNkZWZpbmUgTUFYX1daQ19JRV9MRU4gMjU2CisKKyNkZWZpbmUgTkVUV09SS19FTVBUWV9FU1NJRCAoMTw8MCkKKyNkZWZpbmUgTkVUV09SS19IQVNfT0ZETSAgICAoMTw8MSkKKyNkZWZpbmUgTkVUV09SS19IQVNfQ0NLICAgICAoMTw8MikKKworLyogUW9TIHN0cnVjdHVyZSAqLworI2RlZmluZSBORVRXT1JLX0hBU19RT1NfUEFSQU1FVEVSUyAgICAgICgxPDwzKQorI2RlZmluZSBORVRXT1JLX0hBU19RT1NfSU5GT1JNQVRJT04gICAgICgxPDw0KQorI2RlZmluZSBORVRXT1JLX0hBU19RT1NfTUFTSwkgICAgKE5FVFdPUktfSEFTX1FPU19QQVJBTUVURVJTIHwgXAorCQkJCQkgTkVUV09SS19IQVNfUU9TX0lORk9STUFUSU9OKQorLyogODAyLjExaCAqLworI2RlZmluZSBORVRXT1JLX0hBU19QT1dFUl9DT05TVFJBSU5UICAgICgxPDw1KQorI2RlZmluZSBORVRXT1JLX0hBU19DU0EJCSAoMTw8NikKKyNkZWZpbmUgTkVUV09SS19IQVNfUVVJRVQJICAgICAgICgxPDw3KQorI2RlZmluZSBORVRXT1JLX0hBU19JQlNTX0RGUwkgICAgKDE8PDgpCisjZGVmaW5lIE5FVFdPUktfSEFTX1RQQ19SRVBPUlQJICAoMTw8OSkKKworI2RlZmluZSBORVRXT1JLX0hBU19FUlBfVkFMVUUJICAgKDE8PDEwKQorCisjZGVmaW5lIFFPU19RVUVVRV9OVU0JCSAgIDQKKyNkZWZpbmUgUU9TX09VSV9MRU4JCSAgICAgMworI2RlZmluZSBRT1NfT1VJX1RZUEUJCSAgICAyCisjZGVmaW5lIFFPU19FTEVNRU5UX0lECQkgIDIyMQorI2RlZmluZSBRT1NfT1VJX0lORk9fU1VCX1RZUEUJICAgMAorI2RlZmluZSBRT1NfT1VJX1BBUkFNX1NVQl9UWVBFCSAgMQorI2RlZmluZSBRT1NfVkVSU0lPTl8xCQkgICAxCisjZGVmaW5lIFFPU19BSUZTTl9NSU5fVkFMVUUJICAgICAyCisKK3N0cnVjdCBydGxsaWJfcW9zX2luZm9ybWF0aW9uX2VsZW1lbnQgeworCXU4IGVsZW1lbnRJRDsKKwl1OCBsZW5ndGg7CisJdTggcXVpW1FPU19PVUlfTEVOXTsKKwl1OCBxdWlfdHlwZTsKKwl1OCBxdWlfc3VidHlwZTsKKwl1OCB2ZXJzaW9uOworCXU4IGFjX2luZm87Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcnRsbGliX3Fvc19hY19wYXJhbWV0ZXIgeworCXU4IGFjaV9haWZzbjsKKwl1OCBlY3dfbWluX21heDsKKwlfX2xlMTYgdHhfb3BfbGltaXQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcnRsbGliX3Fvc19wYXJhbWV0ZXJfaW5mbyB7CisJc3RydWN0IHJ0bGxpYl9xb3NfaW5mb3JtYXRpb25fZWxlbWVudCBpbmZvX2VsZW1lbnQ7CisJdTggcmVzZXJ2ZWQ7CisJc3RydWN0IHJ0bGxpYl9xb3NfYWNfcGFyYW1ldGVyIGFjX3BhcmFtc19yZWNvcmRbUU9TX1FVRVVFX05VTV07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcnRsbGliX3Fvc19wYXJhbWV0ZXJzIHsKKwlfX2xlMTYgY3dfbWluW1FPU19RVUVVRV9OVU1dOworCV9fbGUxNiBjd19tYXhbUU9TX1FVRVVFX05VTV07CisJdTggYWlmc1tRT1NfUVVFVUVfTlVNXTsKKwl1OCBmbGFnW1FPU19RVUVVRV9OVU1dOworCV9fbGUxNiB0eF9vcF9saW1pdFtRT1NfUVVFVUVfTlVNXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBydGxsaWJfcW9zX2RhdGEgeworCXN0cnVjdCBydGxsaWJfcW9zX3BhcmFtZXRlcnMgcGFyYW1ldGVyczsKKwl1bnNpZ25lZCBpbnQgd21tX2FjbTsKKwlpbnQgYWN0aXZlOworCWludCBzdXBwb3J0ZWQ7CisJdTggcGFyYW1fY291bnQ7CisJdTggb2xkX3BhcmFtX2NvdW50OworfTsKKworc3RydWN0IHJ0bGxpYl90aW1fcGFyYW1ldGVycyB7CisJdTggdGltX2NvdW50OworCXU4IHRpbV9wZXJpb2Q7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcnRsbGliX3dtbV9hY19wYXJhbSB7CisJdTggYWNfYWNpX2FjbV9haWZzbjsKKwl1OCBhY19lY3dtaW5fZWN3bWF4OworCXUxNiBhY190eG9wX2xpbWl0OworfTsKKworc3RydWN0IHJ0bGxpYl93bW1fdHNfaW5mbyB7CisJdTggYWNfZGlyX3RpZDsKKwl1OCBhY191cF9wc2I7CisJdTggcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcnRsbGliX3dtbV90c3BlY19lbGVtIHsKKwlzdHJ1Y3QgcnRsbGliX3dtbV90c19pbmZvIHRzX2luZm87CisJdTE2IG5vcm1fbXNkdV9zaXplOworCXUxNiBtYXhfbXNkdV9zaXplOworCXUzMiBtaW5fc2Vydl9pbnRlcjsKKwl1MzIgbWF4X3NlcnZfaW50ZXI7CisJdTMyIGluYWN0X2ludGVyOworCXUzMiBzdXNwZW5faW50ZXI7CisJdTMyIHNlcnZfc3RhcnRfdGltZTsKKwl1MzIgbWluX2RhdGFfcmF0ZTsKKwl1MzIgbWVhbl9kYXRhX3JhdGU7CisJdTMyIHBlYWtfZGF0YV9yYXRlOworCXUzMiBtYXhfYnVyc3Rfc2l6ZTsKKwl1MzIgZGVsYXlfYm91bmQ7CisJdTMyIG1pbl9waHlfcmF0ZTsKKwl1MTYgc3VycF9iYW5kX2FsbG93OworCXUxNiBtZWRpdW1fdGltZTsKK30gX19wYWNrZWQ7CisKK2VudW0gZWFwX3R5cGUgeworCUVBUF9QQUNLRVQgPSAwLAorCUVBUE9MX1NUQVJULAorCUVBUE9MX0xPR09GRiwKKwlFQVBPTF9LRVksCisJRUFQT0xfRU5DQVBfQVNGX0FMRVJUCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqZWFwX3R5cGVzW10gPSB7CisJW0VBUF9QQUNLRVRdCQk9ICJFQVAtUGFja2V0IiwKKwlbRUFQT0xfU1RBUlRdCQk9ICJFQVBPTC1TdGFydCIsCisJW0VBUE9MX0xPR09GRl0JCT0gIkVBUE9MLUxvZ29mZiIsCisJW0VBUE9MX0tFWV0JCT0gIkVBUE9MLUtleSIsCisJW0VBUE9MX0VOQ0FQX0FTRl9BTEVSVF0JPSAiRUFQT0wtRW5jYXAtQVNGLUFsZXJ0IgorfTsKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICplYXBfZ2V0X3R5cGUoaW50IHR5cGUpCit7CisJcmV0dXJuICgodTMyKXR5cGUgPj0gQVJSQVlfU0laRShlYXBfdHlwZXMpKSA/ICJVbmtub3duIiA6CisJCSBlYXBfdHlwZXNbdHlwZV07Cit9CitzdGF0aWMgaW5saW5lIHU4IEZyYW1lX1FvU1RJRCh1OCAqYnVmKQoreworCXN0cnVjdCBydGxsaWJfaGRyXzNhZGRyICpoZHI7CisJdTE2IGZjOworCWhkciA9IChzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkciAqKWJ1ZjsKKwlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKwlyZXR1cm4gKHU4KSgodW5pb24gZnJhbWVxb3MgKikoYnVmICsgKCgoZmMgJiBSVExMSUJfRkNUTF9UT0RTKSAmJgorCQkgICAgKGZjICYgUlRMTElCX0ZDVExfRlJPTURTKSkgPyAzMCA6IDI0KSkpLT5maWVsZC50aWQ7Cit9CisKKworc3RydWN0IGVhcG9sIHsKKwl1OCBzbmFwWzZdOworCXUxNiBldGhlcnR5cGU7CisJdTggdmVyc2lvbjsKKwl1OCB0eXBlOworCXUxNiBsZW5ndGg7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcnRsbGliX3NvZnRtYWNfc3RhdHMgeworCXVuc2lnbmVkIGludCByeF9hc3Nfb2s7CisJdW5zaWduZWQgaW50IHJ4X2Fzc19lcnI7CisJdW5zaWduZWQgaW50IHJ4X3Byb2JlX3JxOworCXVuc2lnbmVkIGludCB0eF9wcm9iZV9yczsKKwl1bnNpZ25lZCBpbnQgdHhfYmVhY29uczsKKwl1bnNpZ25lZCBpbnQgcnhfYXV0aF9ycTsKKwl1bnNpZ25lZCBpbnQgcnhfYXV0aF9yc19vazsKKwl1bnNpZ25lZCBpbnQgcnhfYXV0aF9yc19lcnI7CisJdW5zaWduZWQgaW50IHR4X2F1dGhfcnE7CisJdW5zaWduZWQgaW50IG5vX2F1dGhfcnM7CisJdW5zaWduZWQgaW50IG5vX2Fzc19yczsKKwl1bnNpZ25lZCBpbnQgdHhfYXNzX3JxOworCXVuc2lnbmVkIGludCByeF9hc3NfcnE7CisJdW5zaWduZWQgaW50IHR4X3Byb2JlX3JxOworCXVuc2lnbmVkIGludCByZWFzc29jOworCXVuc2lnbmVkIGludCBzd3R4c3RvcDsKKwl1bnNpZ25lZCBpbnQgc3d0eGF3YWtlOworCXVuc2lnbmVkIGNoYXIgQ3VycmVudFNob3dUeGF0ZTsKKwl1bnNpZ25lZCBjaGFyIGxhc3RfcGFja2V0X3JhdGU7CisJdW5zaWduZWQgaW50IHR4cmV0cnljb3VudDsKK307CisKKyNkZWZpbmUgQkVBQ09OX1BST0JFX1NTSURfSURfUE9TSVRJT04gMTIKKworc3RydWN0IHJ0bGxpYl9pbmZvX2VsZW1lbnRfaGRyIHsKKwl1OCBpZDsKKwl1OCBsZW47Cit9IF9fcGFja2VkOworCisvKgorICogVGhlc2UgYXJlIHRoZSBkYXRhIHR5cGVzIHRoYXQgY2FuIG1ha2UgdXAgbWFuYWdlbWVudCBwYWNrZXRzCisgKgorCXUxNiBhdXRoX2FsZ29yaXRobTsKKwl1MTYgYXV0aF9zZXF1ZW5jZTsKKwl1MTYgYmVhY29uX2ludGVydmFsOworCXUxNiBjYXBhYmlsaXR5OworCXU4IGN1cnJlbnRfYXBbRVRIX0FMRU5dOworCXUxNiBsaXN0ZW5faW50ZXJ2YWw7CisJc3RydWN0IHsKKwkJdTE2IGFzc29jaWF0aW9uX2lkOjE0LCByZXNlcnZlZDoyOworCX0gX19wYWNrZWQ7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJdTE2IHJlYXNvbjsKKwl1MTYgc3RhdHVzOworKi8KKworI2RlZmluZSBSVExMSUJfREVGQVVMVF9UWF9FU1NJRCAiUGVuZ3VpbiIKKyNkZWZpbmUgUlRMTElCX0RFRkFVTFRfQkFTSUNfUkFURSAyCisKK2VudW0ge1dNTV9hbGxfZnJhbWUsIFdNTV90d29fZnJhbWUsIFdNTV9mb3VyX2ZyYW1lLCBXTU1fc2l4X2ZyYW1lfTsKKyNkZWZpbmUgTUFYX1NQX0xlbiAgKFdNTV9hbGxfZnJhbWUgPDwgNCkKKyNkZWZpbmUgUlRMTElCX1FPU19USUQgMHgwZgorI2RlZmluZSBRT1NfQ1RMX05PVENPTlRBSU5fQUNLICgweDAxIDw8IDUpCisKKyNkZWZpbmUgUlRMTElCX0RUSU1fTUJDQVNUIDQKKyNkZWZpbmUgUlRMTElCX0RUSU1fVUNBU1QgMgorI2RlZmluZSBSVExMSUJfRFRJTV9WQUxJRCAxCisjZGVmaW5lIFJUTExJQl9EVElNX0lOVkFMSUQgMAorCisjZGVmaW5lIFJUTExJQl9QU19ESVNBQkxFRCAwCisjZGVmaW5lIFJUTExJQl9QU19VTklDQVNUIFJUTExJQl9EVElNX1VDQVNUCisjZGVmaW5lIFJUTExJQl9QU19NQkNBU1QgUlRMTElCX0RUSU1fTUJDQVNUCisKKyNkZWZpbmUgV01FX0FDX0JLICAgMHgwMAorI2RlZmluZSBXTUVfQUNfQkUgICAweDAxCisjZGVmaW5lIFdNRV9BQ19WSSAgIDB4MDIKKyNkZWZpbmUgV01FX0FDX1ZPICAgMHgwMworI2RlZmluZSBXTUVfQUNJX01BU0sgMHgwMworI2RlZmluZSBXTUVfQUlGU05fTUFTSyAweDAzCisjZGVmaW5lIFdNRV9BQ19QUkFNX0xFTiAxNgorCisjZGVmaW5lIE1BWF9SRUNFSVZFX0JVRkZFUl9TSVpFIDkxMDAKKworI2RlZmluZSBVUDJBQyh1cCkgKAkJICAgXAorCSgodXApIDwgMSkgPyBXTUVfQUNfQkUgOiBcCisJKCh1cCkgPCAzKSA/IFdNRV9BQ19CSyA6IFwKKwkoKHVwKSA8IDQpID8gV01FX0FDX0JFIDogXAorCSgodXApIDwgNikgPyBXTUVfQUNfVkkgOiBcCisJV01FX0FDX1ZPKQorCisjZGVmaW5lIEFDMlVQKF9hYykJKCAgICAgICBcCisJKChfYWMpID09IFdNRV9BQ19WTykgPyA2IDogXAorCSgoX2FjKSA9PSBXTUVfQUNfVkkpID8gNSA6IFwKKwkoKF9hYykgPT0gV01FX0FDX0JLKSA/IDEgOiBcCisJMCkKKworI2RlZmluZQlFVEhFUl9BRERSX0xFTgkJNgkvKiBsZW5ndGggb2YgYW4gRXRoZXJuZXQgYWRkcmVzcyAqLworI2RlZmluZSBFVEhFUk5FVF9IRUFERVJfU0laRSAgICAxNCAgICAgIC8qIGxlbmd0aCBvZiB0d28gRXRoZXJuZXQgYWRkcmVzcworCQkJCQkgKiBwbHVzIGV0aGVyIHR5cGUqLworCitzdHJ1Y3QJZXRoZXJfaGVhZGVyIHsKKwl1OCBldGhlcl9kaG9zdFtFVEhFUl9BRERSX0xFTl07CisJdTggZXRoZXJfc2hvc3RbRVRIRVJfQUREUl9MRU5dOworCXUxNiBldGhlcl90eXBlOworfSBfX3BhY2tlZDsKKworI2lmbmRlZiBFVEhFUlRZUEVfUEFFCisjZGVmaW5lCUVUSEVSVFlQRV9QQUUJMHg4ODhlCQkvKiBFQVBPTCBQQUUvODAyLjF4ICovCisjZW5kaWYKKyNpZm5kZWYgRVRIRVJUWVBFX0lQCisjZGVmaW5lCUVUSEVSVFlQRV9JUAkweDA4MDAJCS8qIElQIHByb3RvY29sICovCisjZW5kaWYKKworCitlbnVtIGVycF90IHsKKwlFUlBfTm9uRVJQcHJlc2VudAk9IDB4MDEsCisJRVJQX1VzZVByb3RlY3Rpb24JPSAweDAyLAorCUVSUF9CYXJrZXJQcmVhbWJsZU1vZGUgPSAweDA0LAorfTsKKworc3RydWN0IHJ0bGxpYl9uZXR3b3JrIHsKKwkvKiBUaGVzZSBlbnRyaWVzIGFyZSB1c2VkIHRvIGlkZW50aWZ5IGEgdW5pcXVlIG5ldHdvcmsgKi8KKwl1OCBic3NpZFtFVEhfQUxFTl07CisJdTggY2hhbm5lbDsKKwkvKiBFbnN1cmUgbnVsbC10ZXJtaW5hdGVkIGZvciBhbnkgZGVidWcgbXNncyAqLworCXU4IHNzaWRbSVdfRVNTSURfTUFYX1NJWkUgKyAxXTsKKwl1OCBzc2lkX2xlbjsKKwl1OCBoaWRkZW5fc3NpZFtJV19FU1NJRF9NQVhfU0laRSArIDFdOworCXU4IGhpZGRlbl9zc2lkX2xlbjsKKwlzdHJ1Y3QgcnRsbGliX3Fvc19kYXRhIHFvc19kYXRhOworCisJYm9vbAliV2l0aEFpcm9uZXRJRTsKKwlib29sCWJDa2lwU3VwcG9ydGVkOworCWJvb2wJYkNjeFJtRW5hYmxlOworCXUxNglDY3hSbVN0YXRlWzJdOworCWJvb2wJYk1Cc3NpZFZhbGlkOworCXU4CU1Cc3NpZE1hc2s7CisJdTgJTUJzc2lkWzZdOworCWJvb2wJYldpdGhDY3hWZXJOdW07CisJdTgJQnNzQ2N4VmVyTnVtYmVyOworCS8qIFRoZXNlIGFyZSBuZXR3b3JrIHN0YXRpc3RpY3MgKi8KKwlzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzIHN0YXRzOworCXUxNiBjYXBhYmlsaXR5OworCXU4ICByYXRlc1tNQVhfUkFURVNfTEVOR1RIXTsKKwl1OCAgcmF0ZXNfbGVuOworCXU4ICByYXRlc19leFtNQVhfUkFURVNfRVhfTEVOR1RIXTsKKwl1OCAgcmF0ZXNfZXhfbGVuOworCXVuc2lnbmVkIGxvbmcgbGFzdF9zY2FubmVkOworCXU4ICBtb2RlOworCXUzMiBmbGFnczsKKwl1MzIgbGFzdF9hc3NvY2lhdGU7CisJdTMyIHRpbWVfc3RhbXBbMl07CisJdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgbGlzdGVuX2ludGVydmFsOworCXUxNiBhdGltX3dpbmRvdzsKKwl1OCAgZXJwX3ZhbHVlOworCXU4ICB3cGFfaWVbTUFYX1dQQV9JRV9MRU5dOworCXNpemVfdCB3cGFfaWVfbGVuOworCXU4ICByc25faWVbTUFYX1dQQV9JRV9MRU5dOworCXNpemVfdCByc25faWVfbGVuOworCXU4ICB3emNfaWVbTUFYX1daQ19JRV9MRU5dOworCXNpemVfdCB3emNfaWVfbGVuOworCisJc3RydWN0IHJ0bGxpYl90aW1fcGFyYW1ldGVycyB0aW07CisJdTggIGR0aW1fcGVyaW9kOworCXU4ICBkdGltX2RhdGE7CisJdTY0IGxhc3RfZHRpbV9zdGFfdGltZTsKKworCXU4IHdtbV9pbmZvOworCXN0cnVjdCBydGxsaWJfd21tX2FjX3BhcmFtIHdtbV9wYXJhbVs0XTsKKwl1OCBUdXJib19FbmFibGU7CisJdTE2IENvdW50cnlJZUxlbjsKKwl1OCBDb3VudHJ5SWVCdWZbTUFYX0lFX0xFTl07CisJc3RydWN0IGJzc19odCBic3NodDsKKwlib29sIGJyb2FkY29tX2NhcF9leGlzdDsKKwlib29sIHJlYWx0ZWtfY2FwX2V4aXQ7CisJYm9vbCBtYXJ2ZWxsX2NhcF9leGlzdDsKKwlib29sIHJhbGlua19jYXBfZXhpc3Q7CisJYm9vbCBhdGhlcm9zX2NhcF9leGlzdDsKKwlib29sIGNpc2NvX2NhcF9leGlzdDsKKwlib29sIGFpcmdvX2NhcF9leGlzdDsKKwlib29sIHVua25vd25fY2FwX2V4aXN0OworCWJvb2wJYmVycF9pbmZvX3ZhbGlkOworCWJvb2wgYnVzZXByb3RlY3Rpb247CisJYm9vbCBiSXNOZXRnZWFyODU0VDsKKwl1OCBTaWduYWxTdHJlbmd0aDsKKwl1OCBSU1NJOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKyNpZiAxCitlbnVtIHJ0bGxpYl9zdGF0ZSB7CisKKwkvKiB0aGUgY2FyZCBpcyBub3QgbGlua2VkIGF0IGFsbCAqLworCVJUTExJQl9OT0xJTksgPSAwLAorCisJLyogUlRMTElCX0FTU09DSUFUSU5HKiBhcmUgZm9yIEJTUyBjbGllbnQgbW9kZQorCSAqIHRoZSBkcml2ZXIgc2hhbGwgbm90IHBlcmZvcm0gUlggZmlsdGVyaW5nIHVubGVzcworCSAqIHRoZSBzdGF0ZSBpcyBMSU5LRUQuCisJICogVGhlIGRyaXZlciBzaGFsbCBqdXN0IGNoZWNrIGZvciB0aGUgc3RhdGUgTElOS0VEIGFuZAorCSAqIGRlZmF1bHRzIHRvIE5PTElOSyBmb3IgQUxMIHRoZSBvdGhlciBzdGF0ZXMgKGluY2x1ZGluZworCSAqIExJTktFRF9TQ0FOTklORykKKwkgKi8KKworCS8qIHRoZSBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgd2lsbCBzdGFydCAod3Egc2NoZWR1bGluZykqLworCVJUTExJQl9BU1NPQ0lBVElORywKKwlSVExMSUJfQVNTT0NJQVRJTkdfUkVUUlksCisKKwkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIGlzIHNlbmRpbmcgQVVUSCByZXF1ZXN0Ki8KKwlSVExMSUJfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcsCisKKwkvKiB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlIGhhcyBzdWNjZXNzZnVsbHkgYXV0aGVudGNhdGVkCisJICogYW5kIGlzIHNlbmRpbmcgYXNzb2NpYXRpb24gcmVxdWVzdAorCSAqLworCVJUTExJQl9BU1NPQ0lBVElOR19BVVRIRU5USUNBVEVELAorCisJLyogdGhlIGxpbmsgaXMgb2suIHRoZSBjYXJkIGFzc29jaWF0ZWQgdG8gYSBCU1Mgb3IgbGlua2VkCisJICogdG8gYSBpYnNzIGNlbGwgb3IgYWN0aW5nIGFzIGFuIEFQIGFuZCBjcmVhdGluZyB0aGUgYnNzCisJICovCisJUlRMTElCX0xJTktFRCwKKworCS8qIHNhbWUgYXMgTElOS0VELCBidXQgdGhlIGRyaXZlciBzaGFsbCBhcHBseSBSWCBmaWx0ZXIKKwkgKiBydWxlcyBhcyB3ZSBhcmUgaW4gTk9fTElOSyBtb2RlLiBBcyB0aGUgY2FyZCBpcyBzdGlsbAorCSAqIGxvZ2ljYWxseSBsaW5rZWQsIGJ1dCBpdCBpcyBkb2luZyBhIHN5bmNybyBzaXRlIHN1cnZleQorCSAqIHRoZW4gaXQgd2lsbCBiZSBiYWNrIHRvIExJTktFRCBzdGF0ZS4KKwkgKi8KKwlSVExMSUJfTElOS0VEX1NDQU5OSU5HLAorfTsKKyNlbHNlCitlbnVtIHJ0bGxpYl9zdGF0ZSB7CisJUlRMTElCX1VOSU5JVElBTElaRUQgPSAwLAorCVJUTExJQl9JTklUSUFMSVpFRCwKKwlSVExMSUJfQVNTT0NJQVRJTkcsCisJUlRMTElCX0FTU09DSUFURUQsCisJUlRMTElCX0FVVEhFTlRJQ0FUSU5HLAorCVJUTExJQl9BVVRIRU5USUNBVEVELAorCVJUTExJQl9TSFVURE9XTgorfTsKKyNlbmRpZgorCisjZGVmaW5lIERFRkFVTFRfTUFYX1NDQU5fQUdFICgxNSAqIEhaKQorI2RlZmluZSBERUZBVUxUX0ZUUyAyMzQ2CisKKyNkZWZpbmUgQ0ZHX1JUTExJQl9SRVNFUlZFX0ZDUyAoMTw8MCkKKyNkZWZpbmUgQ0ZHX1JUTExJQl9DT01QVVRFX0ZDUyAoMTw8MSkKKyNkZWZpbmUgQ0ZHX1JUTExJQl9SVFMgKDE8PDIpCisKKyNkZWZpbmUgUlRMTElCXzI0R0haX01JTl9DSEFOTkVMIDEKKyNkZWZpbmUgUlRMTElCXzI0R0haX01BWF9DSEFOTkVMIDE0CisjZGVmaW5lIFJUTExJQl8yNEdIWl9DSEFOTkVMUyAoUlRMTElCXzI0R0haX01BWF9DSEFOTkVMIC0gXAorCQkJCSAgUlRMTElCXzI0R0haX01JTl9DSEFOTkVMICsgMSkKKworI2RlZmluZSBSVExMSUJfNTJHSFpfTUlOX0NIQU5ORUwgMzQKKyNkZWZpbmUgUlRMTElCXzUyR0haX01BWF9DSEFOTkVMIDE2NQorI2RlZmluZSBSVExMSUJfNTJHSFpfQ0hBTk5FTFMgKFJUTExJQl81MkdIWl9NQVhfQ0hBTk5FTCAtIFwKKwkJCQkgIFJUTExJQl81MkdIWl9NSU5fQ0hBTk5FTCArIDEpCisjaWZuZGVmIGVxTWFjQWRkcgorI2RlZmluZSBlcU1hY0FkZHIoYSwgYikJCQkJCVwKKwkoKChhKVswXSA9PSAoYilbMF0gJiYgKGEpWzFdID09IChiKVsxXSAmJiAoYSlbMl0gPT0gKGIpWzJdICYmCVwKKwkoYSlbM10gPT0gKGIpWzNdICYmIChhKVs0XSA9PSAoYilbNF0gJiYgKGEpWzVdID09IChiKVs1XSkgPyAxIDogMCkKKyNlbmRpZgorc3RydWN0IHR4X3BlbmRpbmcgeworCWludCBmcmFnOworCXN0cnVjdCBydGxsaWJfdHhiICp0eGI7Cit9OworCitzdHJ1Y3QgYmFuZHdpZHRoX2F1dG9zd2l0Y2ggeworCWxvbmcgdGhyZXNob2xkXzIwTWh6dG80ME1oejsKKwlsb25nCXRocmVzaG9sZF80ME1oenRvMjBNaHo7CisJYm9vbCBiZm9yY2VkX3R4MjBNaHo7CisJYm9vbCBiYXV0b3N3aXRjaF9lbmFibGU7Cit9OworCisKKworI2RlZmluZSBSRU9SREVSX1dJTl9TSVpFCTEyOAorI2RlZmluZSBSRU9SREVSX0VOVFJZX05VTQkxMjgKK3N0cnVjdCByeF9yZW9yZGVyX2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCUxpc3Q7CisJdTE2CQkJU2VxTnVtOworCXN0cnVjdCBydGxsaWJfcnhiICpwcnhiOworfTsKK2VudW0gZnN5bmNfc3RhdGUgeworCURlZmF1bHRfRnN5bmMsCisJSFdfRnN5bmMsCisJU1dfRnN5bmMKK307CisKK2VudW0gcnRfcHNfbW9kZSB7CisJZUFjdGl2ZSwKKwllTWF4UHMsCisJZUZhc3RQcywKKwllQXV0b1BzLAorfTsKKworZW51bSBpcHNfY2FsbGJhY2tfZnVuY3Rpb24geworCUlQU19DQUxMQkFDS19OT05FID0gMCwKKwlJUFNfQ0FMTEJBQ0tfTUdOVF9MSU5LX1JFUVVFU1QgPSAxLAorCUlQU19DQUxMQkFDS19KT0lOX1JFUVVFU1QgPSAyLAorfTsKKworZW51bSBydF9qb2luX2FjdGlvbiB7CisJUlRfSk9JTl9JTkZSQSAgID0gMSwKKwlSVF9KT0lOX0lCU1MgID0gMiwKKwlSVF9TVEFSVF9JQlNTID0gMywKKwlSVF9OT19BQ1RJT04gID0gNCwKK307CisKK3N0cnVjdCBpYnNzX3Bhcm1zIHsKKwl1MTYgICBhdGltV2luOworfTsKKyNkZWZpbmUgTUFYX05VTV9SQVRFUwkyNjQKKworZW51bSBydF9yZl9wb3dlcl9zdGF0ZSB7CisJZVJmT24sCisJZVJmU2xlZXAsCisJZVJmT2ZmCit9OworCisjZGVmaW5lCU1BWF9TVVBQT1JUX1dPTF9QQVRURVJOX05VTQkJOAorCisjZGVmaW5lCU1BWF9XT0xfQklUX01BU0tfU0laRQkJMTYKKyNkZWZpbmUJTUFYX1dPTF9QQVRURVJOX1NJWkUJCTEyOAorCitlbnVtIHdvbF9wYXR0ZXJuX3R5cGUgeworCWVOZXRCSU9TID0gMCwKKwllSVB2NElQdjZBUlAsCisJZUlQdjRJUHY2VENQU1lOLAorCWVNQUNJRE9ubHksCisJZU5vRGVmaW5lZCwKK307CisKK3N0cnVjdCBydF9wbV93b2xfaW5mbyB7CisJdTMyCVBhdHRlcm5JZDsKKwl1MzIJTWFza1s0XTsKKwl1MTYJQ3JjUmVtYWluZGVyOworCXU4CVdGTUluZGV4OworCWVudW0gd29sX3BhdHRlcm5fdHlwZSBQYXR0ZXJuVHlwZTsKK307CisKK3N0cnVjdCBydF9wd3Jfc2F2ZV9jdHJsIHsKKworCWJvb2wJCQkJYkluYWN0aXZlUHM7CisJYm9vbAkJCQliSVBTTW9kZUJhY2t1cDsKKwlib29sCQkJCWJIYWx0QWRhcHRlckNsa1JROworCWJvb2wJCQkJYlN3UmZQcm9jZXNzaW5nOworCWVudW0gcnRfcmZfcG93ZXJfc3RhdGUgZUluYWN0aXZlUG93ZXJTdGF0ZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCUluYWN0aXZlUHNXb3JrSXRlbTsKKwlzdHJ1Y3QgdGltZXJfbGlzdAlJbmFjdGl2ZVBzVGltZXI7CisKKwllbnVtIGlwc19jYWxsYmFja19mdW5jdGlvbiBSZXR1cm5Qb2ludDsKKworCWJvb2wJCQkJYlRtcEJzc0Rlc2M7CisJZW51bSBydF9qb2luX2FjdGlvbiB0bXBKb2luQWN0aW9uOworCXN0cnVjdCBydGxsaWJfbmV0d29yayB0bXBCc3NEZXNjOworCisJYm9vbAkJCQliVG1wU2Nhbk9ubHk7CisJYm9vbAkJCQliVG1wQWN0aXZlU2NhbjsKKwlib29sCQkJCWJUbXBGaWx0ZXJIaWRkZW5BUDsKKwlib29sCQkJCWJUbXBVcGRhdGVQYXJtczsKKwl1OAkJCQl0bXBTc2lkQnVmWzMzXTsKKwlzdHJ1Y3Qgb2N0ZXRfc3RyaW5nIHRtcFNzaWQyU2NhbjsKKwlib29sCQkJCWJUbXBTc2lkMlNjYW47CisJdTgJCQkJdG1wTmV0d29ya1R5cGU7CisJdTgJCQkJdG1wQ2hhbm5lbE51bWJlcjsKKwl1MTYJCQkJdG1wQmNuUGVyaW9kOworCXU4CQkJCXRtcER0aW1QZXJpb2Q7CisJdTE2CQkJCXRtcG1DYXA7CisJc3RydWN0IG9jdGV0X3N0cmluZyB0bXBTdXBwUmF0ZVNldDsKKwl1OAkJCQl0bXBTdXBwUmF0ZUJ1ZltNQVhfTlVNX1JBVEVTXTsKKwlib29sCQkJCWJUbXBTdXBwUmF0ZTsKKwlzdHJ1Y3QgaWJzc19wYXJtcyB0bXBJYnBtOworCWJvb2wJCQkJYlRtcElicG07CisKKwlib29sCQkJCWJMZWlzdXJlUHM7CisJdTMyCQkJCVBvd2VyUHJvZmlsZTsKKwl1OAkJCQlMcHNJZGxlQ291bnQ7CisJdTgJCQkJUmVnTWF4TFBTQXdha2VJbnR2bDsKKwl1OAkJCQlMUFNBd2FrZUludHZsOworCisJdTMyCQkJCUN1clBzTGV2ZWw7CisJdTMyCQkJCVJlZ1JmUHNMZXZlbDsKKworCWJvb2wJCQkJYkZ3Q3RybExQUzsKKwl1OAkJCQlGV0N0cmxQU01vZGU7CisKKwlib29sCQkJCUxpbmtSZXFJbklQU1JGT2ZmUGdzOworCWJvb2wJCQkJQnVmQ29ubmVjdGluZm9CZWZvcmU7CisKKworCWJvb2wJCQkJYkdwaW9SZlN3OworCisJdTgJCQkJUmVnQU1EUGNpQVNQTTsKKworCXU4CQkJCW9XTEFOTW9kZTsKKwlzdHJ1Y3QgcnRfcG1fd29sX2luZm8gUG1Xb0xQYXR0ZXJuSW5mb1tNQVhfU1VQUE9SVF9XT0xfUEFUVEVSTl9OVU1dOworCit9OworCisjZGVmaW5lIFJUX1JGX0NIQU5HRV9TT1VSQ0UgdTMyCisKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX1NXIEJJVDMxCisjZGVmaW5lIFJGX0NIQU5HRV9CWV9IVyBCSVQzMAorI2RlZmluZSBSRl9DSEFOR0VfQllfUFMgQklUMjkKKyNkZWZpbmUgUkZfQ0hBTkdFX0JZX0lQUyBCSVQyOAorI2RlZmluZSBSRl9DSEFOR0VfQllfSU5JVAkwCisKK2VudW0gY291bnRyeV9jb2RlX3R5cGUgeworCUNPVU5UUllfQ09ERV9GQ0MgPSAwLAorCUNPVU5UUllfQ09ERV9JQyA9IDEsCisJQ09VTlRSWV9DT0RFX0VUU0kgPSAyLAorCUNPVU5UUllfQ09ERV9TUEFJTiA9IDMsCisJQ09VTlRSWV9DT0RFX0ZSQU5DRSA9IDQsCisJQ09VTlRSWV9DT0RFX01LSyA9IDUsCisJQ09VTlRSWV9DT0RFX01LSzEgPSA2LAorCUNPVU5UUllfQ09ERV9JU1JBRUwgPSA3LAorCUNPVU5UUllfQ09ERV9URUxFQyA9IDgsCisJQ09VTlRSWV9DT0RFX01JQyA9IDksCisJQ09VTlRSWV9DT0RFX0dMT0JBTF9ET01BSU4gPSAxMCwKKwlDT1VOVFJZX0NPREVfV09STERfV0lERV8xMyA9IDExLAorCUNPVU5UUllfQ09ERV9URUxFQ19ORVRHRUFSID0gMTIsCisJQ09VTlRSWV9DT0RFX01BWAorfTsKKworZW51bSBzY2FuX29wX2JhY2t1cF9vcHQgeworCVNDQU5fT1BUX0JBQ0tVUCA9IDAsCisJU0NBTl9PUFRfUkVTVE9SRSwKKwlTQ0FOX09QVF9NQVgKK307CisKK2VudW0gZndfY21kX2lvX3R5cGUgeworCUZXX0NNRF9ESUdfRU5BQkxFID0gMCwKKwlGV19DTURfRElHX0RJU0FCTEUgPSAxLAorCUZXX0NNRF9ESUdfSEFMVCA9IDIsCisJRldfQ01EX0RJR19SRVNVTUUgPSAzLAorCUZXX0NNRF9ISUdIX1BXUl9FTkFCTEUgPSA0LAorCUZXX0NNRF9ISUdIX1BXUl9ESVNBQkxFID0gNSwKKwlGV19DTURfUkFfUkVTRVQgPSA2LAorCUZXX0NNRF9SQV9BQ1RJVkUgPSA3LAorCUZXX0NNRF9SQV9SRUZSRVNIX04gPSA4LAorCUZXX0NNRF9SQV9SRUZSRVNIX0JHID0gOSwKKwlGV19DTURfUkFfSU5JVCA9IDEwLAorCUZXX0NNRF9JUUtfRU5BQkxFID0gMTEsCisJRldfQ01EX1RYUFdSX1RSQUNLX0VOQUJMRSA9IDEyLAorCUZXX0NNRF9UWFBXUl9UUkFDS19ESVNBQkxFID0gMTMsCisJRldfQ01EX1RYUFdSX1RSQUNLX1RIRVJNQUwgPSAxNCwKKwlGV19DTURfUEFVU0VfRE1fQllfU0NBTiA9IDE1LAorCUZXX0NNRF9SRVNVTUVfRE1fQllfU0NBTiA9IDE2LAorCUZXX0NNRF9SQV9SRUZSRVNIX05fQ09NQiA9IDE3LAorCUZXX0NNRF9SQV9SRUZSRVNIX0JHX0NPTUIgPSAxOCwKKwlGV19DTURfQU5URU5OQV9TV19FTkFCTEUgPSAxOSwKKwlGV19DTURfQU5URU5OQV9TV19ESVNBQkxFID0gMjAsCisJRldfQ01EX1RYX0ZFRURCQUNLX0NDWF9FTkFCTEUgPSAyMSwKKwlGV19DTURfTFBTX0VOVEVSID0gMjIsCisJRldfQ01EX0xQU19MRUFWRSA9IDIzLAorCUZXX0NNRF9ESUdfTU9ERV9TUyA9IDI0LAorCUZXX0NNRF9ESUdfTU9ERV9GQSA9IDI1LAorCUZXX0NNRF9BRERfQTJfRU5UUlkgPSAyNiwKKwlGV19DTURfQ1RSTF9ETV9CWV9EUklWRVIgPSAyNywKKwlGV19DTURfQ1RSTF9ETV9CWV9EUklWRVJfTkVXID0gMjgsCisJRldfQ01EX1BBUEVfQ09OVFJPTCA9IDI5LAorCUZXX0NNRF9DSEFOX1NFVCA9IDMwLAorfTsKKworI2RlZmluZSBSVF9NQVhfTERfU0xPVF9OVU0JMTAKK3N0cnVjdCBydF9saW5rX2RldGVjdCB7CisKKwl1MzIJCQkJTnVtUmVjdkJjbkluUGVyaW9kOworCXUzMgkJCQlOdW1SZWN2RGF0YUluUGVyaW9kOworCisJdTMyCQkJCVJ4QmNuTnVtW1JUX01BWF9MRF9TTE9UX05VTV07CisJdTMyCQkJCVJ4RGF0YU51bVtSVF9NQVhfTERfU0xPVF9OVU1dOworCXUxNgkJCQlTbG90TnVtOworCXUxNgkJCQlTbG90SW5kZXg7CisKKwl1MzIJCQkJTnVtVHhPa0luUGVyaW9kOworCXUzMgkJCQlOdW1SeE9rSW5QZXJpb2Q7CisJdTMyCQkJCU51bVJ4VW5pY2FzdE9rSW5QZXJpb2Q7CisJYm9vbAkJCQliQnVzeVRyYWZmaWM7CisJYm9vbAkJCQliSGlnaGVyQnVzeVRyYWZmaWM7CisJYm9vbAkJCQliSGlnaGVyQnVzeVJ4VHJhZmZpYzsKKwl1OAkJCQlJZGxlQ291bnQ7CisJdTMyCQkJCU51bVR4VW5pY2FzdE9rSW5QZXJpb2Q7CisJdTMyCQkJCUxhc3ROdW1UeFVuaWNhc3Q7CisJdTMyCQkJCUxhc3ROdW1SeFVuaWNhc3Q7Cit9OworCitzdHJ1Y3Qgc3dfY2FtX3RhYmxlIHsKKworCXU4CQkJCW1hY2FkZHJbNl07CisJYm9vbAkJCQlidXNlZDsKKwl1OAkJCQlrZXlfYnVmWzE2XTsKKwl1MTYJCQkJa2V5X3R5cGU7CisJdTgJCQkJdXNlREs7CisJdTgJCQkJa2V5X2luZGV4OworCit9OworI2RlZmluZSAgIFRPVEFMX0NBTV9FTlRSWQkJCQkzMgorc3RydWN0IHJhdGVfYWRhcHRpdmUgeworCXU4CQkJCXJhdGVfYWRhcHRpdmVfZGlzYWJsZWQ7CisJdTgJCQkJcmF0cl9zdGF0ZTsKKwl1MTYJCQkJcmVzZXJ2ZTsKKworCXUzMgkJCQloaWdoX3Jzc2lfdGhyZXNoX2Zvcl9yYTsKKwl1MzIJCQkJaGlnaDJsb3dfcnNzaV90aHJlc2hfZm9yX3JhOworCXU4CQkJCWxvdzJoaWdoX3Jzc2lfdGhyZXNoX2Zvcl9yYTQwTTsKKwl1MzIJCQkJbG93X3Jzc2lfdGhyZXNoX2Zvcl9yYTQwTTsKKwl1OAkJCQlsb3cyaGlnaF9yc3NpX3RocmVzaF9mb3JfcmEyME07CisJdTMyCQkJCWxvd19yc3NpX3RocmVzaF9mb3JfcmEyME07CisJdTMyCQkJCXVwcGVyX3Jzc2lfdGhyZXNob2xkX3JhdHI7CisJdTMyCQkJCW1pZGRsZV9yc3NpX3RocmVzaG9sZF9yYXRyOworCXUzMgkJCQlsb3dfcnNzaV90aHJlc2hvbGRfcmF0cjsKKwl1MzIJCQkJbG93X3Jzc2lfdGhyZXNob2xkX3JhdHJfNDBNOworCXUzMgkJCQlsb3dfcnNzaV90aHJlc2hvbGRfcmF0cl8yME07CisJdTgJCQkJcGluZ19yc3NpX2VuYWJsZTsKKwl1MzIJCQkJcGluZ19yc3NpX3JhdHI7CisJdTMyCQkJCXBpbmdfcnNzaV90aHJlc2hfZm9yX3JhOworCXUzMgkJCQlsYXN0X3JhdHI7CisJdTgJCQkJUHJlUkFUUlN0YXRlOworCit9OworZW51bSByYXRyX3RhYmxlX21vZGVfODE5MnMgeworCVJBVFJfSU5YX1dJUkVMRVNTX05HQiA9IDAsCisJUkFUUl9JTlhfV0lSRUxFU1NfTkcgPSAxLAorCVJBVFJfSU5YX1dJUkVMRVNTX05CID0gMiwKKwlSQVRSX0lOWF9XSVJFTEVTU19OID0gMywKKwlSQVRSX0lOWF9XSVJFTEVTU19HQiA9IDQsCisJUkFUUl9JTlhfV0lSRUxFU1NfRyA9IDUsCisJUkFUUl9JTlhfV0lSRUxFU1NfQiA9IDYsCisJUkFUUl9JTlhfV0lSRUxFU1NfTUMgPSA3LAorCVJBVFJfSU5YX1dJUkVMRVNTX0EgPSA4LAorfTsKKworI2RlZmluZQlOVU1fUE1LSURfQ0FDSEUJCTE2CitzdHJ1Y3QgcnRfcG1raWRfbGlzdCB7CisJdTggYlVzZWQ7CisJdTggQnNzaWRbNl07CisJdTggUE1LSURbMTZdOworCXU4IFNzaWRCdWZbMzNdOworCXU4ICpzc2lkX29jdGV0OworCXUxNiBzc2lkX2xlbmd0aDsKK307CisKK3N0cnVjdCBydF9pbnRlbF9wcm9taXNjX21vZGUgeworCWJvb2wgYlByb21pc2N1b3VzT247CisJYm9vbCBiRmlsdGVyU291cmNlU3RhdGlvbkZyYW1lOworfTsKKworCisvKioqKioqKioqKioqKioqIERSSVZFUiBTVEFUVVMgICAqKioqKi8KKyNkZWZpbmUgU1RBVFVTX1NDQU5OSU5HCQkJMAorI2RlZmluZSBTVEFUVVNfU0NBTl9IVwkJCTEKKyNkZWZpbmUgU1RBVFVTX1NDQU5fQUJPUlRJTkcJMgorI2RlZmluZSBTVEFUVVNfU0VUVElOR19DSEFOCQkzCisvKioqKioqKioqKioqKioqIERSSVZFUiBTVEFUVVMgICAqKioqKi8KKworZW51bSB7CisJTk9fVVNFCQk9IDAsCisJVVNFRAkJPSAxLAorCUhXX1NFQwkJPSAyLAorCVNXX1NFQwkJPSAzLAorfTsKKworZW51bSB7CisJTFBTX0lTX1dBS0UgPSAwLAorCUxQU19JU19TTEVFUCA9IDEsCisJTFBTX1dBSVRfTlVMTF9EQVRBX1NFTkQgPSAyLAorfTsKKworc3RydWN0IHJ0bGxpYl9kZXZpY2UgeworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHJ0bGxpYl9zZWN1cml0eSBzZWM7CisKKwlib29sIGRpc2FibGVfbWdudF9xdWV1ZTsKKworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCXNob3J0IGh3c2Nhbl9jaF9iazsKKwllbnVtIGh0X2V4dGNobmxfb2Zmc2V0IGNoYW5fb2Zmc2V0X2JrOworCWVudW0gaHRfY2hhbm5lbF93aWR0aCBiYW5kd2lkdGhfYms7CisJdTggaHdzY2FuX3NlbV91cDsKKwl1OAlDbnRBZnRlckxpbms7CisKKwllbnVtIHJ0X29wX21vZGUgT3BNb2RlOworCisJdTggVmVyc2lvbklEOworCS8qIFRoZSBsYXN0IEFzc29jUmVxL1Jlc3AgSUVzICovCisJdTggKmFzc29jcmVxX2llcywgKmFzc29jcmVzcF9pZXM7CisJc2l6ZV90IGFzc29jcmVxX2llc19sZW4sIGFzc29jcmVzcF9pZXNfbGVuOworCisJYm9vbCBiX2N1c3RvbWVyX2xlbm92b19pZDsKKwlib29sCWJGb3JjZWRTaG93UnhSYXRlOworCWJvb2wJYkZvcmNlZFNob3dSYXRlU3RpbGw7CisJdTgJU3lzdGVtUXVlcnlEYXRhUmF0ZUNvdW50OworCWJvb2wJYkZvcmNlZEJnTW9kZTsKKwlib29sIGJVc2VSQU1hc2s7CisJYm9vbCBiMXgxUmVjdkNvbWJpbmU7CisJdTggUkZfVHlwZTsKKwlib29sIGIxU1NTdXBwb3J0OworCisJdTggaHdzZWNfYWN0aXZlOworCWJvb2wgaXNfc2lsZW50X3Jlc2V0OworCWJvb2wgZm9yY2VfbWljX2Vycm9yOworCWJvb2wgaXNfcm9hbWluZzsKKwlib29sIGllZWVfdXA7CisJYm9vbCBjYW5ub3Rfbm90aWZ5OworCWJvb2wgYlN1cHBvcnRSZW1vdGVXYWtlVXA7CisJZW51bSBydF9wc19tb2RlIGRvdDExUG93ZXJTYXZlTW9kZTsKKwlib29sIGFjdHNjYW5uaW5nOworCWJvb2wgRmlyc3RJZV9JblNjYW47CisJYm9vbCBiZV9zY2FuX2lucHJvZ3Jlc3M7CisJYm9vbCBiZWlucmV0cnk7CisJZW51bSBydF9yZl9wb3dlcl9zdGF0ZSBlUkZQb3dlclN0YXRlOworCVJUX1JGX0NIQU5HRV9TT1VSQ0UJUmZPZmZSZWFzb247CisJYm9vbCBpc19zZXRfa2V5OworCWJvb2wgd3hfc2V0X2VuYzsKKwlzdHJ1Y3QgcnRfaGlfdGhyb3VnaHB1dCAqcEhUSW5mbzsKKwlzcGlubG9ja190IGJ3X3NwaW5sb2NrOworCisJc3BpbmxvY2tfdCByZW9yZGVyX3NwaW5sb2NrOworCXU4CVJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXRbMTZdOworCXU4CVJlZ2RvdDExVHhIVE9wZXJhdGlvbmFsUmF0ZVNldFsxNl07CisJdTgJZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldFsxNl07CisJdTgJUmVnSFRTdXBwUmF0ZVNldFsxNl07CisJdTgJSFRDdXJyZW50T3BlcmFSYXRlOworCXU4CUhUSGlnaGVzdE9wZXJhUmF0ZTsKKwl1OAlNaW5TcGFjZUNmZzsKKwl1OAlNYXhNc3NEZW5zaXR5OworCXU4CWJUeERpc2FibGVSYXRlRmFsbEJhY2s7CisJdTgJYlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlOworCXU4CWJUeEVuYWJsZUZ3Q2FsY0R1cjsKKwlhdG9taWNfdAlhdG1fY2hubG9wOworCWF0b21pY190CWF0bV9zd2J3OworCisJc3RydWN0IGxpc3RfaGVhZAkJVHhfVFNfQWRtaXRfTGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlUeF9UU19QZW5kaW5nX0xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAkJVHhfVFNfVW51c2VkX0xpc3Q7CisJc3RydWN0IHR4X3RzX3JlY29yZCBUeFRzUmVjb3JkW1RPVEFMX1RTX05VTV07CisJc3RydWN0IGxpc3RfaGVhZAkJUnhfVFNfQWRtaXRfTGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlSeF9UU19QZW5kaW5nX0xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZAkJUnhfVFNfVW51c2VkX0xpc3Q7CisJc3RydWN0IHJ4X3RzX3JlY29yZCBSeFRzUmVjb3JkW1RPVEFMX1RTX05VTV07CisJc3RydWN0IHJ4X3Jlb3JkZXJfZW50cnkgUnhSZW9yZGVyRW50cnlbMTI4XTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlSeFJlb3JkZXJfVW51c2VkX0xpc3Q7CisJdTgJCQkJRm9yY2VkUHJpb3JpdHk7CisKKworCS8qIEJvb2trZWVwaW5nIHN0cnVjdHVyZXMgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKKwlzdHJ1Y3QgcnRsbGliX3N0YXRzIGllZWVfc3RhdHM7CisJc3RydWN0IHJ0bGxpYl9zb2Z0bWFjX3N0YXRzIHNvZnRtYWNfc3RhdHM7CisKKwkvKiBQcm9iZSAvIEJlYWNvbiBtYW5hZ2VtZW50ICovCisJc3RydWN0IGxpc3RfaGVhZCBuZXR3b3JrX2ZyZWVfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5ldHdvcmtfbGlzdDsKKwlzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKm5ldHdvcmtzOworCWludCBzY2FuczsKKwlpbnQgc2Nhbl9hZ2U7CisKKwlpbnQgaXdfbW9kZTsgLyogb3BlcmF0aW5nIG1vZGUgKElXX01PREVfKikgKi8KKwlib29sIGJOZXRQcm9taXNjdW91c01vZGU7CisJc3RydWN0IHJ0X2ludGVsX3Byb21pc2NfbW9kZSBJbnRlbFByb21pc2N1b3VzTW9kZUluZm87CisKKwlzdHJ1Y3QgaXdfc3B5X2RhdGEgc3B5X2RhdGE7CisKKwlzcGlubG9ja190IGxvY2s7CisJc3BpbmxvY2tfdCB3cGF4X3N1aXRsaXN0X2xvY2s7CisKKwlpbnQgdHhfaGVhZHJvb207IC8qIFNldCB0byBzaXplIG9mIGFueSBhZGRpdGlvbmFsIHJvb20gbmVlZGVkIGF0IGZyb250CisJCQkgICogb2YgYWxsb2NhdGVkIFR4IFNLQnMgKi8KKwl1MzIgY29uZmlnOworCisJLyogV0VQIGFuZCBvdGhlciBlbmNyeXB0aW9uIHJlbGF0ZWQgc2V0dGluZ3MgYXQgdGhlIGRldmljZSBsZXZlbCAqLworCWludCBvcGVuX3dlcDsgLyogU2V0IHRvIDEgdG8gYWxsb3cgdW5lbmNyeXB0ZWQgZnJhbWVzICovCisJaW50IGF1dGhfbW9kZTsKKwlpbnQgcmVzZXRfb25fa2V5Y2hhbmdlOyAvKiBTZXQgdG8gMSBpZiB0aGUgSFcgbmVlZHMgdG8gYmUgcmVzZXQgb24KKwkJCQkgKiBXRVAga2V5IGNoYW5nZXMgKi8KKworCS8qIElmIHRoZSBob3N0IHBlcmZvcm1zIHtlbixkZX1jcnlwdGlvbiwgdGhlbiBzZXQgdG8gMSAqLworCWludCBob3N0X2VuY3J5cHQ7CisJaW50IGhvc3RfZW5jcnlwdF9tc2R1OworCWludCBob3N0X2RlY3J5cHQ7CisJLyogaG9zdCBwZXJmb3JtcyBtdWx0aWNhc3QgZGVjcnlwdGlvbiAqLworCWludCBob3N0X21jX2RlY3J5cHQ7CisKKwkvKiBob3N0IHNob3VsZCBzdHJpcCBJViBhbmQgSUNWIGZyb20gcHJvdGVjdGVkIGZyYW1lcyAqLworCS8qIG1lYW5pbmdmdWwgb25seSB3aGVuIGhhcmR3YXJlIGRlY3J5cHRpb24gaXMgYmVpbmcgdXNlZCAqLworCWludCBob3N0X3N0cmlwX2l2X2ljdjsKKworCWludCBob3N0X29wZW5fZnJhZzsKKwlpbnQgaG9zdF9idWlsZF9pdjsKKwlpbnQgaWVlZTgwMl8xeDsgLyogaXMgSUVFRSA4MDIuMVggdXNlZCAqLworCisJLyogV1BBIGRhdGEgKi8KKwlib29sIGJIYWxmTk1vZGU7CisJYm9vbCBiSGFsZldpcmVsZXNzTjI0R01vZGU7CisJaW50IHdwYV9lbmFibGVkOworCWludCBkcm9wX3VuZW5jcnlwdGVkOworCWludCB0a2lwX2NvdW50ZXJtZWFzdXJlczsKKwlpbnQgcHJpdmFjeV9pbnZva2VkOworCXNpemVfdCB3cGFfaWVfbGVuOworCXU4ICp3cGFfaWU7CisJc2l6ZV90IHdwc19pZV9sZW47CisJdTggKndwc19pZTsKKwl1OCBhcF9tYWNfYWRkcls2XTsKKwl1MTYgcGFpcndpc2Vfa2V5X3R5cGU7CisJdTE2IGdyb3VwX2tleV90eXBlOworCXN0cnVjdCBsaXN0X2hlYWQgY3J5cHRfZGVpbml0X2xpc3Q7CisJc3RydWN0IHJ0bGxpYl9jcnlwdF9kYXRhICpjcnlwdFtXRVBfS0VZU107CisKKwlpbnQgdHhfa2V5aWR4OyAvKiBkZWZhdWx0IFRYIGtleSBpbmRleCAoY3J5cHRbdHhfa2V5aWR4XSkgKi8KKwlzdHJ1Y3Qgc3dfY2FtX3RhYmxlIHN3Y2FtdGFibGVbVE9UQUxfQ0FNX0VOVFJZXTsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBjcnlwdF9kZWluaXRfdGltZXI7CisJaW50IGNyeXB0X3F1aWVzY2VkOworCisJaW50IGJjcnhfc3RhX2tleTsgLyogdXNlIGluZGl2aWR1YWwga2V5cyB0byBvdmVycmlkZSBkZWZhdWx0IGtleXMgZXZlbgorCQkJICAgKiB3aXRoIFJYIG9mIGJyb2FkL211bHRpY2FzdCBmcmFtZXMgKi8KKworCXN0cnVjdCBydF9wbWtpZF9saXN0IFBNS0lETGlzdFtOVU1fUE1LSURfQ0FDSEVdOworCisJLyogRnJhZ21lbnRhdGlvbiBzdHJ1Y3R1cmVzICovCisJc3RydWN0IHJ0bGxpYl9mcmFnX2VudHJ5IGZyYWdfY2FjaGVbMTddW1JUTExJQl9GUkFHX0NBQ0hFX0xFTl07CisJdW5zaWduZWQgaW50IGZyYWdfbmV4dF9pZHhbMTddOworCXUxNiBmdHM7IC8qIEZyYWdtZW50YXRpb24gVGhyZXNob2xkICovCisjZGVmaW5lIERFRkFVTFRfUlRTX1RIUkVTSE9MRCAyMzQ2VQorI2RlZmluZSBNSU5fUlRTX1RIUkVTSE9MRCAxCisjZGVmaW5lIE1BWF9SVFNfVEhSRVNIT0xEIDIzNDZVCisJdTE2IHJ0czsgLyogUlRTIHRocmVzaG9sZCAqLworCisJLyogQXNzb2NpYXRpb24gaW5mbyAqLworCXU4IGJzc2lkW0VUSF9BTEVOXTsKKworCS8qIFRoaXMgc3RvcmVzIGluZm9zIGZvciB0aGUgY3VycmVudCBuZXR3b3JrLgorCSAqIEVpdGhlciB0aGUgbmV0d29yayB3ZSBhcmUgYXNzb2NpYXRlZCBpbiBJTkZSQVNUUlVDVFVSRQorCSAqIG9yIHRoZSBuZXR3b3JrIHRoYXQgd2UgYXJlIGNyZWF0aW5nIGluIE1BU1RFUiBtb2RlLgorCSAqIGFkLWhvYyBpcyBhIG1peHR1cmUgOy0pLgorCSAqIE5vdGUgdGhhdCBpbiBpbmZyYXN0cnVjdHVyZSBtb2RlLCBldmVuIHdoZW4gbm90IGFzc29jaWF0ZWQsCisJICogZmllbGRzIGJzc2lkIGFuZCBlc3NpZCBtYXkgYmUgdmFsaWQgKGlmIHdwYV9zZXQgYW5kIGVzc2lkX3NldAorCSAqIGFyZSB0cnVlKSBhcyB0aHkgY2FycnkgdGhlIHZhbHVlIHNldCBieSB0aGUgdXNlciB2aWEgaXdjb25maWcKKwkgKi8KKwlzdHJ1Y3QgcnRsbGliX25ldHdvcmsgY3VycmVudF9uZXR3b3JrOworCisJZW51bSBydGxsaWJfc3RhdGUgc3RhdGU7CisKKwlpbnQgc2hvcnRfc2xvdDsKKwlpbnQgcmVnX21vZGU7CisJaW50IG1vZGU7ICAgICAgIC8qIEEsIEIsIEcgKi8KKwlpbnQgbW9kdWxhdGlvbjsgLyogQ0NLLCBPRkRNICovCisJaW50IGZyZXFfYmFuZDsgIC8qIDIuNEdoeiwgNS4yR2h6LCBNaXhlZCAqLworCWludCBhYmdfdHJ1ZTsgICAvKiBBQkcgZmxhZwkgICAgICAqLworCisJLyogdXNlZCBmb3IgZm9yY2luZyB0aGUgaWJzcyB3b3JrcXVldWUgdG8gdGVybWluYXRlCisJICogd2l0aG91dCB3YWl0IGZvciB0aGUgc3luY3JvIHNjYW4gdG8gdGVybWluYXRlCisJICovCisJc2hvcnQgc3luY19zY2FuX2h1cnJ5dXA7CisJdTE2IHNjYW5fd2F0Y2hfZG9nOworCWludCBwZXJmZWN0X3Jzc2k7CisJaW50IHdvcnN0X3Jzc2k7CisKKwl1MTYgcHJldl9zZXFfY3RsOyAgICAgICAvKiB1c2VkIHRvIGRyb3AgZHVwbGljYXRlIGZyYW1lcyAqLworCisJLyogbWFwIG9mIGFsbG93ZWQgY2hhbm5lbHMuIDAgaXMgZHVtbXkgKi8KKwl2b2lkICpwRG90MTFkSW5mbzsKKwlib29sIGJHbG9iYWxEb21haW47CisJdTggYWN0aXZlX2NoYW5uZWxfbWFwW01BWF9DSEFOTkVMX05VTUJFUisxXTsKKworCXU4ICAgSWJzc1N0YXJ0Q2hubDsKKwl1OCAgIGlic3NfbWF4am9pbl9jaGFsOworCisJaW50IHJhdGU7ICAgICAgIC8qIGN1cnJlbnQgcmF0ZSAqLworCWludCBiYXNpY19yYXRlOworCXUzMgljdXJyZW50UmF0ZTsKKworCXNob3J0IGFjdGl2ZV9zY2FuOworCisJLyogdGhpcyBjb250YWlucyBmbGFncyBmb3Igc2VsZWN0aXZlbHkgZW5hYmxlIHNvZnRtYWMgc3VwcG9ydCAqLworCXUxNiBzb2Z0bWFjX2ZlYXR1cmVzOworCisJLyogaWYgdGhlIHNlcXVlbmNlIGNvbnRyb2wgZmllbGQgaXMgbm90IGZpbGxlZCBieSBIVyAqLworCXUxNiBzZXFfY3RybFs1XTsKKworCS8qIGFzc29jaWF0aW9uIHByb2NlZHVyZSB0cmFuc2FjdGlvbiBzZXF1ZW5jZSBudW1iZXIgKi8KKwl1MTYgYXNzb2NpYXRlX3NlcTsKKworCS8qIEFJRCBmb3IgUlRYZWQgYXNzb2NpYXRpb24gcmVzcG9uc2VzICovCisJdTE2IGFzc29jX2lkOworCisJLyogcG93ZXIgc2F2ZSBtb2RlIHJlbGF0ZWQqLworCXU4IGFja190eF90b19pZWVlOworCXNob3J0IHBzOworCXNob3J0IHN0YV9zbGVlcDsKKwlpbnQgcHNfdGltZW91dDsKKwlpbnQgcHNfcGVyaW9kOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBwc190YXNrOworCXU2NCBwc190aW1lOworCWJvb2wgcG9sbGluZzsKKworCXNob3J0IHJhd190eDsKKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19UWF9RVUVVRSBpcyBzZXQgKi8KKwlzaG9ydCBxdWV1ZV9zdG9wOworCXNob3J0IHNjYW5uaW5nX2NvbnRpbnVlIDsKKwlzaG9ydCBwcm90b19zdGFydGVkOworCXNob3J0IHByb3RvX3N0b3BwcGluZzsKKworCXN0cnVjdCBzZW1hcGhvcmUgd3hfc2VtOworCXN0cnVjdCBzZW1hcGhvcmUgc2Nhbl9zZW07CisJc3RydWN0IHNlbWFwaG9yZSBpcHNfc2VtOworCisJc3BpbmxvY2tfdCBtZ210X3R4X2xvY2s7CisJc3BpbmxvY2tfdCBiZWFjb25fbG9jazsKKworCXNob3J0IGJlYWNvbl90eGluZzsKKworCXNob3J0IHdhcF9zZXQ7CisJc2hvcnQgc3NpZF9zZXQ7CisKKwkvKiBzZXQgb24gaW5pdGlhbGl6YXRpb24gKi8KKwl1OCAgcW9zX3N1cHBvcnQ7CisJdW5zaWduZWQgaW50IHdtbV9hY207CisKKwkvKiBmb3IgZGlzY2FyZGluZyBkdXBsaWNhdGVkIHBhY2tldHMgaW4gSUJTUyAqLworCXN0cnVjdCBsaXN0X2hlYWQgaWJzc19tYWNfaGFzaFtJRUVFX0lCU1NfTUFDX0hBU0hfU0laRV07CisKKwkvKiBmb3IgZGlzY2FyZGluZyBkdXBsaWNhdGVkIHBhY2tldHMgaW4gQlNTICovCisJdTE2IGxhc3RfcnhzZXFfbnVtWzE3XTsgLyogcnggc2VxIHByZXZpb3VzIHBlci10aWQgKi8KKwl1MTYgbGFzdF9yeGZyYWdfbnVtWzE3XTsvKiB0eCBmcmFnIHByZXZpb3VzIHBlci10aWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfcGFja2V0X3RpbWVbMTddOworCisJLyogZm9yIFBTIG1vZGUgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfcnhfcHNfdGltZTsKKwlib29sCQkJYkF3YWtlUGt0U2VudDsKKwl1OAkJCUxQU0RlbGF5Q250OworCisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFIGlzIHNldCAqLworCXN0cnVjdCBza19idWZmICptZ210X3F1ZXVlX3JpbmdbTUdNVF9RVUVVRV9OVU1dOworCWludCBtZ210X3F1ZXVlX2hlYWQ7CisJaW50IG1nbXRfcXVldWVfdGFpbDsKKyNkZWZpbmUgUlRMTElCX1FVRVVFX0xJTUlUIDEyOAorCXU4IEFzb2NSZXRyeUNvdW50OworCXVuc2lnbmVkIGludCBod19oZWFkZXI7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBza2Jfd2FpdFFbTUFYX1FVRVVFX1NJWkVdOworCXN0cnVjdCBza19idWZmX2hlYWQgIHNrYl9hZ2dRW01BWF9RVUVVRV9TSVpFXTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICBza2JfZHJ2X2FnZ1FbTUFYX1FVRVVFX1NJWkVdOworCXUzMglzdGFfZWRjYV9wYXJhbVs0XTsKKwlib29sIGFnZ3JlZ2F0aW9uOworCWJvb2wgZW5hYmxlX3J4X2ltbV9CQTsKKwlib29sIGJpYnNzY29vcmRpbmF0b3I7CisKKwlib29sCWJkeW5hbWljX3R4cG93ZXJfZW5hYmxlOworCisJYm9vbCBiQ1RTVG9TZWxmRW5hYmxlOworCXU4CUNUU1RvU2VsZlRIOworCisJdTMyCWZzeW5jX3RpbWVfaW50ZXJ2YWw7CisJdTMyCWZzeW5jX3JhdGVfYml0bWFwOworCXU4CWZzeW5jX3Jzc2lfdGhyZXNob2xkOworCWJvb2wJYmZzeW5jX2VuYWJsZTsKKworCXU4CWZzeW5jX211bHRpcGxlX3RpbWVpbnRlcnZhbDsKKwl1MzIJZnN5bmNfZmlyc3RkaWZmX3JhdGV0aHJlc2hvbGQ7CisJdTMyCWZzeW5jX3NlY29uZGRpZmZfcmF0ZXRocmVzaG9sZDsKKwllbnVtIGZzeW5jX3N0YXRlIGZzeW5jX3N0YXRlOworCWJvb2wJCWJpc19hbnlfbm9uYmVwa3RzOworCXN0cnVjdCBiYW5kd2lkdGhfYXV0b3N3aXRjaCBiYW5kd2lkdGhfYXV0b19zd2l0Y2g7CisJYm9vbCBGd1JXUkY7CisKKwlzdHJ1Y3QgcnRfbGlua19kZXRlY3QgTGlua0RldGVjdEluZm87CisJYm9vbCBiSXNBZ2dyZWdhdGVGcmFtZTsKKwlzdHJ1Y3QgcnRfcHdyX3NhdmVfY3RybCBQb3dlclNhdmVDb250cm9sOworCXU4IGFtc2R1X2luX3Byb2Nlc3M7CisKKwkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19UWF9RVUVVRSBpcyBzZXQgKi8KKwlzdHJ1Y3QgdHhfcGVuZGluZyB0eF9wZW5kaW5nOworCisJLyogdXNlZCBpZiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFIGlzIHNldCAqLworCXN0cnVjdCB0aW1lcl9saXN0IGFzc29jaWF0ZV90aW1lcjsKKworCS8qIHVzZWQgaWYgSUVFRV9TT0ZUTUFDX0JFQUNPTlMgaXMgc2V0ICovCisJc3RydWN0IHRpbWVyX2xpc3QgYmVhY29uX3RpbWVyOworCXU4IG5lZWRfc3dfZW5jOworCXN0cnVjdCB3b3JrX3N0cnVjdCBhc3NvY2lhdGVfY29tcGxldGVfd3E7CisJc3RydWN0IHdvcmtfc3RydWN0IGlwc19sZWF2ZV93cTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGFzc29jaWF0ZV9wcm9jZWR1cmVfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBzb2Z0bWFjX3NjYW5fd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBzb2Z0bWFjX2hpbnQxMWRfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBhc3NvY2lhdGVfcmV0cnlfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBzdGFydF9pYnNzX3dxOworCXN0cnVjdCBkZWxheWVkX3dvcmsgaHdfd2FrZXVwX3dxOworCXN0cnVjdCBkZWxheWVkX3dvcmsgaHdfc2xlZXBfd3E7CisJc3RydWN0IGRlbGF5ZWRfd29yayBsaW5rX2NoYW5nZV93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd3hfc3luY19zY2FuX3dxOworCisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOworCXVuaW9uIHsKKwkJc3RydWN0IHJ0bGxpYl9yeGIgKlJmZEFycmF5W1JFT1JERVJfV0lOX1NJWkVdOworCQlzdHJ1Y3QgcnRsbGliX3J4YiAqc3RhdHNfSW5kaWNhdGVBcnJheVtSRU9SREVSX1dJTl9TSVpFXTsKKwkJc3RydWN0IHJ0bGxpYl9yeGIgKnByeGJJbmRpY2F0ZUFycmF5W1JFT1JERVJfV0lOX1NJWkVdOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHN3X2NobmxfY21kIFByZUNvbW1vbkNtZFtNQVhfUFJFQ01EX0NOVF07CisJCQlzdHJ1Y3Qgc3dfY2hubF9jbWQgUG9zdENvbW1vbkNtZFtNQVhfUE9TVENNRF9DTlRdOworCQkJc3RydWN0IHN3X2NobmxfY21kIFJmRGVwZW5kQ21kW01BWF9SRkRFUEVORENNRF9DTlRdOworCQl9OworCX07CisKKwkvKiBDYWxsYmFjayBmdW5jdGlvbnMgKi8KKwl2b2lkICgqc2V0X3NlY3VyaXR5KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgcnRsbGliX3NlY3VyaXR5ICpzZWMpOworCisJLyogVXNlZCB0byBUWCBkYXRhIGZyYW1lIGJ5IHVzaW5nIHR4YiBzdHJ1Y3RzLgorCSAqIHRoaXMgaXMgbm90IHVzZWQgaWYgaW4gdGhlIHNvZnRtYWNfZmVhdHVyZXMKKwkgKiBpcyBzZXQgdGhlIGZsYWcgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFCisJICovCisJaW50ICgqaGFyZF9zdGFydF94bWl0KShzdHJ1Y3QgcnRsbGliX3R4YiAqdHhiLAorCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJaW50ICgqcmVzZXRfcG9ydCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJaW50ICgqaXNfcXVldWVfZnVsbCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHByaSk7CisKKwlpbnQgKCpoYW5kbGVfbWFuYWdlbWVudCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IHJ0bGxpYl9uZXR3b3JrICpuZXR3b3JrLCB1MTYgdHlwZSk7CisJaW50ICgqaXNfcW9zX2FjdGl2ZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKKwkvKiBTb2Z0bWFjLWdlbmVyYXRlZCBmcmFtZXMgKG1hbWFnZW1lbnQpIGFyZSBUWGVkIHZpYSB0aGlzCisJICogY2FsbGJhY2sgaWYgdGhlIGZsYWcgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSBpcworCSAqIG5vdCBzZXQuIEFzIHNvbWUgY2FyZHMgbWF5IGhhdmUgZGlmZmVyZW50IEhXIHF1ZXVlcyB0aGF0CisJICogb25lIG1pZ2h0IHdhbnQgdG8gdXNlIGZvciBkYXRhIGFuZCBtYW5hZ2VtZW50IGZyYW1lcworCSAqIHRoZSBvcHRpb24gdG8gaGF2ZSB0d28gY2FsbGJhY2tzIG1pZ2h0IGJlIHVzZWZ1bC4KKwkgKiBUaGlzIGZ1Y250aW9uIGNhbid0IHNsZWVwLgorCSAqLworCWludCAoKnNvZnRtYWNfaGFyZF9zdGFydF94bWl0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogdXNlZCBpbnN0ZWFkIG9mIGhhcmRfc3RhcnRfeG1pdCAobm90IHNvZnRtYWNfaGFyZF9zdGFydF94bWl0KQorCSAqIGlmIHRoZSBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgZmVhdHVyZSBpcyB1c2VkIHRvIFRYIGRhdGEKKwkgKiBmcmFtZXMuIEkgdGhlIG9wdGlvbiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFIGlzIGFsc28gc2V0CisJICogdGhlbiBhbHNvIG1hbmFnZW1lbnQgZnJhbWVzIGFyZSBzZW50IHZpYSB0aGlzIGNhbGxiYWNrLgorCSAqIFRoaXMgZnVuY3Rpb24gY2FuJ3Qgc2xlZXAuCisJICovCisJdm9pZCAoKnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQpKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHJhdGUpOworCisJLyogc3RvcHMgdGhlIEhXIHF1ZXVlIGZvciBEQVRBIGZyYW1lcy4gVXNlZnVsIHRvIGF2b2lkCisJICogd2FzdGUgdGltZSB0byBUWCBkYXRhIGZyYW1lIHdoZW4gd2UgYXJlIHJlYXNzb2NpYXRpbmcKKwkgKiBUaGlzIGZ1bmN0aW9uIGNhbiBzbGVlcC4KKwkgKi8KKwl2b2lkICgqZGF0YV9oYXJkX3N0b3ApKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogT0sgdGhpcyBpcyBjb21wbGVtZW50YXIgdG8gZGF0YV9wb2xsX2hhcmRfc3RvcCAqLworCXZvaWQgKCpkYXRhX2hhcmRfcmVzdW1lKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIGFzayB0byB0aGUgZHJpdmVyIHRvIHJldHVuZSB0aGUgcmFkaW8gLgorCSAqIFRoaXMgZnVuY3Rpb24gY2FuIHNsZWVwLiB0aGUgZHJpdmVyIHNob3VsZCBlbnN1cmUKKwkgKiB0aGUgcmFkaW8gaGFzIGJlZW4gc3dpdGhjZWQgYmVmb3JlIHJldHVybi4KKwkgKi8KKwl2b2lkICgqc2V0X2NoYW4pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHNob3J0IGNoKTsKKworCS8qIFRoZXNlIGFyZSBub3QgdXNlZCBpZiB0aGUgaWVlZSBzdGFjayB0YWtlcyBjYXJlIG9mCisJICogc2Nhbm5pbmcgKElFRUVfU09GVE1BQ19TQ0FOIGZlYXR1cmUgc2V0KS4KKwkgKiBJbiB0aGlzIGNhc2Ugb25seSB0aGUgc2V0X2NoYW4gaXMgdXNlZC4KKwkgKgorCSAqIFRoZSBzeW5jcm8gdmVyc2lvbiBpcyBzaW1pbGFyIHRvIHRoZSBzdGFydF9zY2FuIGJ1dAorCSAqIGRvZXMgbm90IHJldHVybiB1bnRpbCBhbGwgY2hhbm5lbHMgaGFzIGJlZW4gc2Nhbm5lZC4KKwkgKiB0aGlzIGlzIGNhbGxlZCBpbiB1c2VyIGNvbnRleHQgYW5kIHNob3VsZCBzbGVlcCwKKwkgKiBpdCBpcyBjYWxsZWQgaW4gYSB3b3JrX3F1ZXVlIHdoZW4gc3dpdGhjaW5nIHRvIGFkLWhvYyBtb2RlCisJICogb3IgaW4gYmVoYWxmIG9mIGl3bGlzdCBzY2FuIHdoZW4gdGhlIGNhcmQgaXMgYXNzb2NpYXRlZAorCSAqIGFuZCByb290IHVzZXIgYXNrIGZvciBhIHNjYW4uCisJICogdGhlIGZ1Y250aW9uIHN0b3Bfc2NhbiBzaG91bGQgc3RvcCBib3RoIHRoZSBzeW5jcm8gYW5kCisJICogYmFja2dyb3VuZCBzY2FubmluZyBhbmQgY2FuIHNsZWVwLgorCSAqIFRoZSBmdWNudGlvbiBzdGFydF9zY2FuIHNob3VsZCBpbml0aWF0ZSB0aGUgYmFja2dyb3VuZAorCSAqIHNjYW5uaW5nIGFuZCBjYW4ndCBzbGVlcC4KKwkgKi8KKwl2b2lkICgqc2Nhbl9zeW5jcm8pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpzdGFydF9zY2FuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqc3RvcF9zY2FuKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCXZvaWQgKCpydGxsaWJfc3RhcnRfaHdfc2Nhbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKnJ0bGxpYl9zdG9wX2h3X3NjYW4pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogaW5kaWNhdGUgdGhlIGRyaXZlciB0aGF0IHRoZSBsaW5rIHN0YXRlIGlzIGNoYW5nZWQKKwkgKiBmb3IgZXhhbXBsZSBpdCBtYXkgaW5kaWNhdGUgdGhlIGNhcmQgaXMgYXNzb2NpYXRlZCBub3cuCisJICogRHJpdmVyIG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4gdGhpcyB0byBhcHBseSBSWCBmaWx0ZXIKKwkgKiBydWxlcyBvciBzaW1wbHkgbGlnaHQgdGhlIExJTksgbGVkCisJICovCisJdm9pZCAoKmxpbmtfY2hhbmdlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworCS8qIHRoZXNlIHR3byBmdW5jdGlvbiBpbmRpY2F0ZXMgdG8gdGhlIEhXIHdoZW4gdG8gc3RhcnQKKwkgKiBhbmQgc3RvcCB0byBzZW5kIGJlYWNvbnMuIFRoaXMgaXMgdXNlZCB3aGVuIHRoZQorCSAqIElFRUVfU09GVE1BQ19CRUFDT05TIGlzIG5vdCBzZXQuIEZvciBub3cgdGhlCisJICogc3RvcF9zZW5kX2JhY29ucyBpcyBOT1QgZ3VhcmFudGVlZCB0byBiZSBjYWxsZWQgb25seQorCSAqIGFmdGVyIHN0YXJ0X3NlbmRfYmVhY29ucy4KKwkgKi8KKwl2b2lkICgqc3RhcnRfc2VuZF9iZWFjb25zKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl2b2lkICgqc3RvcF9zZW5kX2JlYWNvbnMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisJLyogcG93ZXIgc2F2ZSBtb2RlIHJlbGF0ZWQgKi8KKwl2b2lkICgqc3RhX3dha2VfdXApKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCplbnRlcl9zbGVlcF9zdGF0ZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTY0IHRpbWUpOworCXNob3J0ICgqcHNfaXNfcXVldWVfZW1wdHkpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCWludCAoKmhhbmRsZV9iZWFjb24pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgIHN0cnVjdCBydGxsaWJfYmVhY29uICpiZWFjb24sCisJCQkgICAgIHN0cnVjdCBydGxsaWJfbmV0d29yayAqbmV0d29yayk7CisJaW50ICgqaGFuZGxlX2Fzc29jX3Jlc3BvbnNlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IHJ0bGxpYl9hc3NvY19yZXNwb25zZV9mcmFtZSAqcmVzcCwKKwkJCQkgICAgIHN0cnVjdCBydGxsaWJfbmV0d29yayAqbmV0d29yayk7CisKKworCS8qIGNoZWNrIHdoZXRoZXIgVHggaHcgcmVzb3VjZSBhdmFpbGFibGUgKi8KKwlzaG9ydCAoKmNoZWNrX25pY19lbm91Z2hfZGVzYykoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHF1ZXVlX2luZGV4KTsKKwlzaG9ydCAoKmdldF9uaWNfZGVzY19udW0pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBxdWV1ZV9pbmRleCk7CisJdm9pZCAoKlNldEJXTW9kZUhhbmRsZXIpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIGVudW0gaHRfY2hhbm5lbF93aWR0aCBCYW5kd2lkdGgsCisJCQkJIGVudW0gaHRfZXh0Y2hubF9vZmZzZXQgT2Zmc2V0KTsKKwlib29sICgqR2V0Tm1vZGVTdXBwb3J0QnlTZWNDZmcpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpTZXRXaXJlbGVzc01vZGUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IHdpcmVsZXNzX21vZGUpOworCWJvb2wgKCpHZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHNIYW5kbGVyKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKwl1OCAgICgqcnRsbGliX2FwX3NlY190eXBlKShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSk7CisJdm9pZCAoKkhhbFVzYlJ4QWdnckhhbmRsZXIpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGJvb2wgVmFsdWUpOworCXZvaWQgKCpJbml0aWFsR2FpbkhhbmRsZXIpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IE9wZXJhdGlvbik7CisJYm9vbCAoKlNldEZ3Q21kSGFuZGxlcikoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQllbnVtIGZ3X2NtZF9pb190eXBlIEZ3Q21kSU8pOworCXZvaWQgKCpVcGRhdGVIYWxSQU1hc2tIYW5kbGVyKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBib29sIGJNdWx0aWNhc3QsCisJCQkJICAgICAgIHU4IG1hY0lkLCB1OCBNaW1vUHMsIHU4IFdpcmVsZXNzTW9kZSwKKwkJCQkgICAgICAgdTggYkN1clR4Qlc0ME1IeiwgdTggcnNzaV9sZXZlbCk7CisJdm9pZCAoKlVwZGF0ZUJlYWNvbkludGVycnVwdEhhbmRsZXIpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgICAgYm9vbCBzdGFydCk7CisJdm9pZCAoKlVwZGF0ZUludGVycnVwdE1hc2tIYW5kbGVyKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgQWRkTVNSLAorCQkJCQkgICB1MzIgUmVtb3ZlTVNSKTsKKwl1MTYgICgqcnRsXzExbl91c2VyX3Nob3dfcmF0ZXMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpTY2FuT3BlcmF0aW9uQmFja3VwSGFuZGxlcikoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgdTggT3BlcmF0aW9uKTsKKwl2b2lkICgqTGVkQ29udHJvbEhhbmRsZXIpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBlbnVtIGxlZF9jdGxfbW9kZSBMZWRBY3Rpb24pOworCXZvaWQgKCpTZXRId1JlZ0hhbmRsZXIpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IHZhcmlhYmxlLCB1OCAqdmFsKTsKKwl2b2lkICgqR2V0SHdSZWdIYW5kbGVyKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCB2YXJpYWJsZSwgdTggKnZhbCk7CisKKwl2b2lkICgqQWxsb3dBbGxEZXN0QWRkckhhbmRsZXIpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCWJvb2wgYkFsbG93QWxsREEsIGJvb2wgV3JpdGVJbnRvUmVnKTsKKworCXZvaWQgKCpydGxsaWJfaXBzX2xlYXZlX3dxKSAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKnJ0bGxpYl9pcHNfbGVhdmUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCXZvaWQgKCpMZWlzdXJlUFNMZWF2ZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisJdm9pZCAoKnJ0bGxpYl9yZmtpbGxfcG9sbCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKwkvKiBUaGlzIG11c3QgYmUgdGhlIGxhc3QgaXRlbSBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUgZGF0YQorCSAqIGFsbG9jYXRlZCBiZXlvbmQgdGhpcyBzdHJ1Y3R1cmUgYnkgYWxsb2NfcnRsbGliICovCisJdTggcHJpdlswXTsKK307CisKKyNkZWZpbmUgSUVFRV9BCSAgICAoMTw8MCkKKyNkZWZpbmUgSUVFRV9CCSAgICAoMTw8MSkKKyNkZWZpbmUgSUVFRV9HCSAgICAoMTw8MikKKyNkZWZpbmUgSUVFRV9OXzI0RwkJICAoMTw8NCkKKyNkZWZpbmUJSUVFRV9OXzVHCQkgICgxPDw1KQorI2RlZmluZSBJRUVFX01PREVfTUFTSyAgICAoSUVFRV9BfElFRUVfQnxJRUVFX0cpCisKKy8qIEdlbmVyYXRlIGEgODAyLjExIGhlYWRlciAqLworCisvKiBVc2VzIHRoZSBjaGFubmVsIGNoYW5nZSBjYWxsYmFjayBkaXJlY3RseQorICogaW5zdGVhZCBvZiBbc3RhcnQvc3RvcF0gc2NhbiBjYWxsYmFja3MKKyAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfU0NBTiAoMTw8MikKKworLyogUGVyZm9ybSBhdXRoZW50aWNhdGlvbiBhbmQgYXNzb2NpYXRpb24gaGFuZHNoYWtlICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUgKDE8PDMpCisKKy8qIEdlbmVyYXRlIHByb2JlIHJlcXVlc3RzICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19QUk9CRVJRICgxPDw0KQorCisvKiBHZW5lcmF0ZSByZXNwb25lcyB0byBwcm9iZSByZXF1ZXN0cyAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfUFJPQkVSUyAoMTw8NSkKKworLyogVGhlIGllZWU4MDIuMTEgc3RhY2sgd2lsbCBtYW5hZ2VzIHRoZSBuZXRpZiBxdWV1ZQorICogd2FrZS9zdG9wIGZvciB0aGUgZHJpdmVyLCB0YWtpbmcgY2FyZSBvZiA4MDIuMTEKKyAqIGZyYWdtZW50YXRpb24uIFNlZSBzb2Z0bWFjLmMgZm9yIGRldGFpbHMuICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19UWF9RVUVVRSAoMTw8NykKKworLyogVXNlcyBvbmx5IHRoZSBzb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0CisgKiBldmVuIGZvciBUWCBtYW5hZ2VtZW50IGZyYW1lcy4KKyAqLworI2RlZmluZSBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFICgxPDw4KQorCisvKiBHZW5lcmF0ZSBiZWFjb25zLiAgVGhlIHN0YWNrIHdpbGwgZW5xdWV1ZSBiZWFjb25zCisgKiB0byB0aGUgY2FyZAorICovCisjZGVmaW5lIElFRUVfU09GVE1BQ19CRUFDT05TICgxPDw2KQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqcnRsbGliX3ByaXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gKChzdHJ1Y3QgcnRsbGliX2RldmljZSAqKW5ldGRldl9wcml2KGRldikpLT5wcml2OworfQorCitleHRlcm4gaW5saW5lIGludCBydGxsaWJfaXNfZW1wdHlfZXNzaWQoY29uc3QgY2hhciAqZXNzaWQsIGludCBlc3NpZF9sZW4pCit7CisJLyogU2luZ2xlIHdoaXRlIHNwYWNlIGlzIGZvciBMaW5rc3lzIEFQcyAqLworCWlmIChlc3NpZF9sZW4gPT0gMSAmJiBlc3NpZFswXSA9PSAnICcpCisJCXJldHVybiAxOworCisJLyogT3RoZXJ3aXNlLCBpZiB0aGUgZW50aXJlIGVzc2lkIGlzIDAsIHdlIGFzc3VtZSBpdCBpcyBoaWRkZW4gKi8KKwl3aGlsZSAoZXNzaWRfbGVuKSB7CisJCWVzc2lkX2xlbi0tOworCQlpZiAoZXNzaWRbZXNzaWRfbGVuXSAhPSAnXDAnKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK2V4dGVybiBpbmxpbmUgaW50IHJ0bGxpYl9pc192YWxpZF9tb2RlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBpbnQgbW9kZSkKK3sKKwkvKgorCSAqIEl0IGlzIHBvc3NpYmxlIGZvciBib3RoIGFjY2VzcyBwb2ludHMgYW5kIG91ciBkZXZpY2UgdG8gc3VwcG9ydAorCSAqIGNvbWJpbmF0aW9ucyBvZiBtb2Rlcywgc28gYXMgbG9uZyBhcyB0aGVyZSBpcyBvbmUgdmFsaWQgY29tYmluYXRpb24KKwkgKiBvZiBhcC9kZXZpY2Ugc3VwcG9ydGVkIG1vZGVzLCB0aGVuIHJldHVybiBzdWNjZXNzCisJICoKKwkgKi8KKwlpZiAoKG1vZGUgJiBJRUVFX0EpICYmCisJICAgIChpZWVlLT5tb2R1bGF0aW9uICYgUlRMTElCX09GRE1fTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIFJUTExJQl81MkdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKG1vZGUgJiBJRUVFX0cpICYmCisJICAgIChpZWVlLT5tb2R1bGF0aW9uICYgUlRMTElCX09GRE1fTU9EVUxBVElPTikgJiYKKwkgICAgKGllZWUtPmZyZXFfYmFuZCAmIFJUTExJQl8yNEdIWl9CQU5EKSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoKG1vZGUgJiBJRUVFX0IpICYmCisJICAgIChpZWVlLT5tb2R1bGF0aW9uICYgUlRMTElCX0NDS19NT0RVTEFUSU9OKSAmJgorCSAgICAoaWVlZS0+ZnJlcV9iYW5kICYgUlRMTElCXzI0R0haX0JBTkQpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitleHRlcm4gaW5saW5lIGludCBydGxsaWJfZ2V0X2hkcmxlbih1MTYgZmMpCit7CisJaW50IGhkcmxlbiA9IFJUTExJQl8zQUREUl9MRU47CisKKwlzd2l0Y2ggKFdMQU5fRkNfR0VUX1RZUEUoZmMpKSB7CisJY2FzZSBSVExMSUJfRlRZUEVfREFUQToKKwkJaWYgKChmYyAmIFJUTExJQl9GQ1RMX0ZST01EUykgJiYgKGZjICYgUlRMTElCX0ZDVExfVE9EUykpCisJCQloZHJsZW4gPSBSVExMSUJfNEFERFJfTEVOOyAvKiBBZGRyNCAqLworCQlpZiAoUlRMTElCX1FPU19IQVNfU0VRKGZjKSkKKwkJCWhkcmxlbiArPSAyOyAvKiBRT1MgY3RybCovCisJCWJyZWFrOworCWNhc2UgUlRMTElCX0ZUWVBFX0NUTDoKKwkJc3dpdGNoIChXTEFOX0ZDX0dFVF9TVFlQRShmYykpIHsKKwkJY2FzZSBSVExMSUJfU1RZUEVfQ1RTOgorCQljYXNlIFJUTExJQl9TVFlQRV9BQ0s6CisJCQloZHJsZW4gPSBSVExMSUJfMUFERFJfTEVOOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQloZHJsZW4gPSBSVExMSUJfMkFERFJfTEVOOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGhkcmxlbjsKK30KKworc3RhdGljIGlubGluZSB1OCAqcnRsbGliX2dldF9wYXlsb2FkKHN0cnVjdCBydGxsaWJfaGRyICpoZHIpCit7CisJc3dpdGNoIChydGxsaWJfZ2V0X2hkcmxlbihsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpKSB7CisJY2FzZSBSVExMSUJfMUFERFJfTEVOOgorCQlyZXR1cm4gKChzdHJ1Y3QgcnRsbGliX2hkcl8xYWRkciAqKWhkciktPnBheWxvYWQ7CisJY2FzZSBSVExMSUJfMkFERFJfTEVOOgorCQlyZXR1cm4gKChzdHJ1Y3QgcnRsbGliX2hkcl8yYWRkciAqKWhkciktPnBheWxvYWQ7CisJY2FzZSBSVExMSUJfM0FERFJfTEVOOgorCQlyZXR1cm4gKChzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkciAqKWhkciktPnBheWxvYWQ7CisJY2FzZSBSVExMSUJfNEFERFJfTEVOOgorCQlyZXR1cm4gKChzdHJ1Y3QgcnRsbGliX2hkcl80YWRkciAqKWhkciktPnBheWxvYWQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludCBydGxsaWJfaXNfb2ZkbV9yYXRlKHU4IHJhdGUpCit7CisJc3dpdGNoIChyYXRlICYgflJUTExJQl9CQVNJQ19SQVRFX01BU0spIHsKKwljYXNlIFJUTExJQl9PRkRNX1JBVEVfNk1COgorCWNhc2UgUlRMTElCX09GRE1fUkFURV85TUI6CisJY2FzZSBSVExMSUJfT0ZETV9SQVRFXzEyTUI6CisJY2FzZSBSVExMSUJfT0ZETV9SQVRFXzE4TUI6CisJY2FzZSBSVExMSUJfT0ZETV9SQVRFXzI0TUI6CisJY2FzZSBSVExMSUJfT0ZETV9SQVRFXzM2TUI6CisJY2FzZSBSVExMSUJfT0ZETV9SQVRFXzQ4TUI6CisJY2FzZSBSVExMSUJfT0ZETV9SQVRFXzU0TUI6CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcnRsbGliX2lzX2Nja19yYXRlKHU4IHJhdGUpCit7CisJc3dpdGNoIChyYXRlICYgflJUTExJQl9CQVNJQ19SQVRFX01BU0spIHsKKwljYXNlIFJUTExJQl9DQ0tfUkFURV8xTUI6CisJY2FzZSBSVExMSUJfQ0NLX1JBVEVfMk1COgorCWNhc2UgUlRMTElCX0NDS19SQVRFXzVNQjoKKwljYXNlIFJUTExJQl9DQ0tfUkFURV8xMU1COgorCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyogcnRsbGliLmMgKi8KK2V4dGVybiB2b2lkIGZyZWVfcnRsbGliKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHN0cnVjdCBuZXRfZGV2aWNlICphbGxvY19ydGxsaWIoaW50IHNpemVvZl9wcml2KTsKKworZXh0ZXJuIGludCBydGxsaWJfc2V0X2VuY3J5cHRpb24oc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpOworCisvKiBydGxsaWJfdHguYyAqLworCitleHRlcm4gaW50IHJ0bGxpYl9lbmNyeXB0X2ZyYWdtZW50KAorCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCXN0cnVjdCBza19idWZmICpmcmFnLAorCWludCBoZHJfbGVuKTsKKworZXh0ZXJuIGludCBydGxsaWJfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IHJ0bGxpYl94bWl0X2ludGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgcnRsbGliX3R4Yl9mcmVlKHN0cnVjdCBydGxsaWJfdHhiICopOworCisvKiBydGxsaWJfcnguYyAqLworZXh0ZXJuIGludCBydGxsaWJfcngoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQlzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpyeF9zdGF0cyk7CitleHRlcm4gdm9pZCBydGxsaWJfcnhfbWd0KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICBzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpzdGF0cyk7CitleHRlcm4gdm9pZCBydGxsaWJfcnhfcHJvYmVfcnEoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBpbnQgSXNMZWdhbENoYW5uZWwoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKnJ0bGxpYiwgdTggY2hhbm5lbCk7CisKKy8qIHJ0bGxpYl93eC5jICovCitleHRlcm4gaW50IHJ0bGxpYl93eF9nZXRfc2NhbihzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5KTsKK2V4dGVybiBpbnQgcnRsbGliX3d4X3NldF9lbmNvZGUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXkpOworZXh0ZXJuIGludCBydGxsaWJfd3hfZ2V0X2VuY29kZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleSk7CisjaWYgV0lSRUxFU1NfRVhUID49IDE4CitleHRlcm4gaW50IHJ0bGxpYl93eF9nZXRfZW5jb2RlX2V4dChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKK2V4dGVybiBpbnQgcnRsbGliX3d4X3NldF9lbmNvZGVfZXh0KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworI2VuZGlmCitleHRlcm4gaW50IHJ0bGxpYl93eF9zZXRfYXV0aChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHN0cnVjdCBpd19wYXJhbSAqZGF0YSwgY2hhciAqZXh0cmEpOworZXh0ZXJuIGludCBydGxsaWJfd3hfc2V0X21sbWUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CitleHRlcm4gaW50IHJ0bGxpYl93eF9zZXRfZ2VuX2llKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCAqaWUsIHNpemVfdCBsZW4pOworCisvKiBydGxsaWJfc29mdG1hYy5jICovCitleHRlcm4gc2hvcnQgcnRsbGliX2lzXzU0ZyhzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKm5ldCk7CitleHRlcm4gc2hvcnQgcnRsbGliX2lzX3Nob3J0c2xvdChzdHJ1Y3QgcnRsbGliX25ldHdvcmsgbmV0KTsKK2V4dGVybiBpbnQgcnRsbGliX3J4X2ZyYW1lX3NvZnRtYWMoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICBzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpyeF9zdGF0cywgdTE2IHR5cGUsCisJCQkJICAgdTE2IHN0eXBlKTsKK2V4dGVybiB2b2lkIHJ0bGxpYl9zb2Z0bWFjX25ld19uZXQoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkJICAgc3RydWN0IHJ0bGxpYl9uZXR3b3JrICpuZXQpOworCit2b2lkIFNlbmREaXNhc3NvY2lhdGlvbihzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgYm9vbCBkZWF1dGgsIHUxNiBhc1Jzbik7CitleHRlcm4gdm9pZCBydGxsaWJfc29mdG1hY194bWl0KHN0cnVjdCBydGxsaWJfdHhiICp0eGIsCisJCQkJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpOworCitleHRlcm4gdm9pZCBydGxsaWJfc3RvcF9zZW5kX2JlYWNvbnMoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgbm90aWZ5X3d4X2Fzc29jX2V2ZW50KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIHJ0bGxpYl9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIHJ0bGxpYl9zdGFydF9ic3Moc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgcnRsbGliX3N0YXJ0X21hc3Rlcl9ic3Moc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgcnRsbGliX3N0YXJ0X2lic3Moc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgcnRsbGliX3NvZnRtYWNfaW5pdChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBydGxsaWJfc29mdG1hY19mcmVlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIHJ0bGxpYl9hc3NvY2lhdGVfYWJvcnQoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgcnRsbGliX2Rpc2Fzc29jaWF0ZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBydGxsaWJfc3RvcF9zY2FuKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKTsKK2V4dGVybiBib29sIHJ0bGxpYl9hY3Rfc2Nhbm5pbmcoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIGJvb2wgc3luY19zY2FuKTsKK2V4dGVybiB2b2lkIHJ0bGxpYl9zdG9wX3NjYW5fc3luY3JvKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIHJ0bGxpYl9zdGFydF9zY2FuX3N5bmNybyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggaXNfbWVzaCk7CitleHRlcm4gaW5saW5lIHN0cnVjdCBza19idWZmICpydGxsaWJfcHJvYmVfcmVxKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKTsKK2V4dGVybiB1OCBNZ250UXVlcnlfTWdudEZyYW1lVHhSYXRlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIHJ0bGxpYl9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJCQkgIHNob3J0IHB3cik7CitleHRlcm4gdm9pZCBydGxsaWJfc3RhX3dha2V1cChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc2hvcnQgbmwpOworZXh0ZXJuIHZvaWQgcnRsbGliX3N0YV9wc19zZW5kX3BzcG9sbF9mcmFtZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBydGxsaWJfY2hlY2tfYWxsX25ldHMoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgcnRsbGliX3N0YXJ0X3Byb3RvY29sKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIHJ0bGxpYl9zdG9wX3Byb3RvY29sKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCBzaHV0ZG93bik7CisKK2V4dGVybiB2b2lkIHJ0bGxpYl9FbmFibGVOZXRNb25pdG9yTW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQlib29sIGJJbml0U3RhdGUpOworZXh0ZXJuIHZvaWQgcnRsbGliX0Rpc2FibGVOZXRNb25pdG9yTW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgYm9vbCBiSW5pdFN0YXRlKTsKK2V4dGVybiB2b2lkIHJ0bGxpYl9FbmFibGVJbnRlbFByb21pc2N1b3VzTW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICAgICBib29sIGJJbml0U3RhdGUpOworZXh0ZXJuIHZvaWQgcnRsbGliX0Rpc2FibGVJbnRlbFByb21pc2N1b3VzTW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICAgICAgYm9vbCBiSW5pdFN0YXRlKTsKK2V4dGVybiB2b2lkIHJ0bGxpYl9zZW5kX3Byb2JlX3JlcXVlc3RzKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCBpc19tZXNoKTsKKworZXh0ZXJuIHZvaWQgcnRsbGliX3NvZnRtYWNfc3RvcF9wcm90b2NvbChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCQkJIHU4IG1lc2hfZmxhZywgdTggc2h1dGRvd24pOworZXh0ZXJuIHZvaWQgcnRsbGliX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2woc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkJCSAgdTggbWVzaF9mbGFnKTsKKworZXh0ZXJuIHZvaWQgcnRsbGliX3Jlc2V0X3F1ZXVlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIHJ0bGxpYl93YWtlX3F1ZXVlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIHJ0bGxpYl9zdG9wX3F1ZXVlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIHJ0bGxpYl93YWtlX2FsbF9xdWV1ZXMoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgcnRsbGliX3N0b3BfYWxsX3F1ZXVlcyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSk7CitleHRlcm4gc3RydWN0IHNrX2J1ZmYgKnJ0bGxpYl9nZXRfYmVhY29uKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIHJ0bGxpYl9zdGFydF9zZW5kX2JlYWNvbnMoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgcnRsbGliX3N0b3Bfc2VuZF9iZWFjb25zKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKTsKK2V4dGVybiBpbnQgcnRsbGliX3dwYV9zdXBwbGljYW50X2lvY3RsKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJCSAgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKnAsIHU4IGlzX21lc2gpOworCitleHRlcm4gdm9pZCBub3RpZnlfd3hfYXNzb2NfZXZlbnQoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgcnRsbGliX3BzX3R4X2FjayhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc2hvcnQgc3VjY2Vzcyk7CisKK2V4dGVybiB2b2lkIHNvZnRtYWNfbWdtdF94bWl0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgICBzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSk7CitleHRlcm4gdTE2IHJ0bGxpYl9xdWVyeV9zZXFudW0oc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKmRzdCk7CitleHRlcm4gdTggcnRsbGliX2FwX3NlY190eXBlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKTsKKworLyogcnRsbGliX2NyeXB0X2NjbXAmdGtpcCZ3ZXAuYyAqLworZXh0ZXJuIHZvaWQgcnRsbGliX3RraXBfbnVsbCh2b2lkKTsKK2V4dGVybiB2b2lkIHJ0bGxpYl93ZXBfbnVsbCh2b2lkKTsKK2V4dGVybiB2b2lkIHJ0bGxpYl9jY21wX251bGwodm9pZCk7CisKKy8qIHJ0bGxpYl9zb2Z0bWFjX3d4LmMgKi8KKworZXh0ZXJuIGludCBydGxsaWJfd3hfZ2V0X3dhcChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0KTsKKworZXh0ZXJuIGludCBydGxsaWJfd3hfc2V0X3dhcChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqYXdycSwKKwkJCSAgICAgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IHJ0bGxpYl93eF9nZXRfZXNzaWQoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBydGxsaWJfd3hfc2V0X3JhdGUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IHJ0bGxpYl93eF9nZXRfcmF0ZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgcnRsbGliX3d4X3NldF9tb2RlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCitleHRlcm4gaW50IHJ0bGxpYl93eF9zZXRfc2NhbihzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKKworZXh0ZXJuIGludCBydGxsaWJfd3hfc2V0X2Vzc2lkKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBydGxsaWJfd3hfZ2V0X21vZGUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYik7CisKK2V4dGVybiBpbnQgcnRsbGliX3d4X3NldF9mcmVxKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpOworCitleHRlcm4gaW50IHJ0bGxpYl93eF9nZXRfZnJlcShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpiKTsKK2V4dGVybiB2b2lkIHJ0bGxpYl93eF9zeW5jX3NjYW5fd3Eodm9pZCAqZGF0YSk7CisKK2V4dGVybiBpbnQgcnRsbGliX3d4X3NldF9yYXd0eChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBydGxsaWJfd3hfZ2V0X25hbWUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKworZXh0ZXJuIGludCBydGxsaWJfd3hfc2V0X3Bvd2VyKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgcnRsbGliX3d4X2dldF9wb3dlcihzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQkgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCitleHRlcm4gaW50IHJ0bGxpYl93eF9zZXRfcnRzKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSk7CisKK2V4dGVybiBpbnQgcnRsbGliX3d4X2dldF9ydHMoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKKyNkZWZpbmUgTUFYX1JFQ0VJVkVfQlVGRkVSX1NJWkUgOTEwMAorZXh0ZXJuIHZvaWQgSFREZWJ1Z0hUQ2FwYWJpbGl0eSh1OCAqQ2FwSUUsIHU4ICpUaXRsZVN0cmluZyk7CitleHRlcm4gdm9pZCBIVERlYnVnSFRJbmZvKHU4ICpJbmZvSUUsIHU4ICpUaXRsZVN0cmluZyk7CisKK3ZvaWQgSFRTZXRDb25uZWN0QndNb2RlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJZW51bSBodF9jaGFubmVsX3dpZHRoIEJhbmR3aWR0aCwKKwkJCWVudW0gaHRfZXh0Y2hubF9vZmZzZXQgT2Zmc2V0KTsKK2V4dGVybiB2b2lkIEhUVXBkYXRlRGVmYXVsdFNldHRpbmcoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgSFRDb25zdHJ1Y3RDYXBhYmlsaXR5RWxlbWVudChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCQkJIHU4ICpwb3NIVENhcCwgdTggKmxlbiwKKwkJCQkJIHU4IGlzRW5jcnlwdCwgYm9vbCBiQXNzb2MpOworZXh0ZXJuIHZvaWQgSFRDb25zdHJ1Y3RJbmZvRWxlbWVudChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCQkgICB1OCAqcG9zSFRJbmZvLCB1OCAqbGVuLCB1OCBpc0VuY3J5cHQpOworZXh0ZXJuIHZvaWQgSFRDb25zdHJ1Y3RSVDJSVEFnZ0VsZW1lbnQoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkJICAgICAgIHU4ICpwb3NSVDJSVEFnZywgdTgqIGxlbik7CitleHRlcm4gdm9pZCBIVE9uQXNzb2NSc3Aoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgSFRJbml0aWFsaXplSFRJbmZvKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKTsKK2V4dGVybiB2b2lkIEhUSW5pdGlhbGl6ZUJzc0Rlc2Moc3RydWN0IGJzc19odCAqcEJzc0hUKTsKK2V4dGVybiB2b2lkIEhUUmVzZXRTZWxmQW5kU2F2ZVBlZXJTZXR0aW5nKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJCQkgIHN0cnVjdCBydGxsaWJfbmV0d29yayAqcE5ldHdvcmspOworZXh0ZXJuIHZvaWQgSFRVcGRhdGVTZWxmQW5kUGVlclNldHRpbmcoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkJICAgICAgIHN0cnVjdCBydGxsaWJfbmV0d29yayAqcE5ldHdvcmspOworZXh0ZXJuIHU4IEhUR2V0SGlnaGVzdE1DU1JhdGUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHU4ICpwTUNTUmF0ZVNldCwKKwkJCSAgICAgIHU4ICpwTUNTRmlsdGVyKTsKK2V4dGVybiB1OCBNQ1NfRklMVEVSX0FMTFtdOworZXh0ZXJuIHUxNiBNQ1NfREFUQV9SQVRFWzJdWzJdWzc3XSA7CitleHRlcm4gdTggSFRDQ2hlY2soc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHU4ICpwRnJhbWUpOworZXh0ZXJuIHZvaWQgSFRSZXNldElPVFNldHRpbmcoc3RydWN0IHJ0X2hpX3Rocm91Z2hwdXQgKnBIVEluZm8pOworZXh0ZXJuIGJvb2wgSXNIVEhhbGZObW9kZUFQcyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSk7CitleHRlcm4gdTE2IEhUSGFsZk1jc1RvRGF0YVJhdGUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHU4IG5NY3NSYXRlKTsKK2V4dGVybiB1MTYgSFRNY3NUb0RhdGFSYXRlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCBuTWNzUmF0ZSk7CitleHRlcm4gdTE2ICBUeENvdW50VG9EYXRhUmF0ZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggbkRhdGFSYXRlKTsKK2V4dGVybiBpbnQgcnRsbGliX3J4X0FEREJBUmVxKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBpbnQgcnRsbGliX3J4X0FEREJBUnNwKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiBpbnQgcnRsbGliX3J4X0RFTEJBKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiB2b2lkIFRzSW5pdEFkZEJBKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3QgdHhfdHNfcmVjb3JkICpwVFMsCisJCQl1OCBQb2xpY3ksIHU4IGJPdmVyd3JpdGVQZW5kaW5nKTsKK2V4dGVybiB2b2lkIFRzSW5pdERlbEJBKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJc3RydWN0IHRzX2NvbW1vbl9pbmZvICpwVHNDb21tb25JbmZvLAorCQkJZW51bSB0cl9zZWxlY3QgVHhSeFNlbGVjdCk7CitleHRlcm4gdm9pZCBCYVNldHVwVGltZU91dCh1bnNpZ25lZCBsb25nIGRhdGEpOworZXh0ZXJuIHZvaWQgVHhCYUluYWN0VGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpOworZXh0ZXJuIHZvaWQgUnhCYUluYWN0VGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpOworZXh0ZXJuIHZvaWQgUmVzZXRCYUVudHJ5KHN0cnVjdCBiYV9yZWNvcmQgKnBCQSk7CitleHRlcm4gYm9vbCBHZXRUcygKKwlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwlzdHJ1Y3QgdHNfY29tbW9uX2luZm8gKipwcFRTLAorCXU4ICpBZGRyLAorCXU4IFRJRCwKKwllbnVtIHRyX3NlbGVjdCBUeFJ4U2VsZWN0LAorCWJvb2wgYkFkZE5ld1RzCispOworZXh0ZXJuIHZvaWQgVFNJbml0aWFsaXplKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKTsKK2V4dGVybiAgdm9pZCBUc1N0YXJ0QWRkQmFQcm9jZXNzKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJCSAgc3RydWN0IHR4X3RzX3JlY29yZCAqcFR4VFMpOworZXh0ZXJuIHZvaWQgUmVtb3ZlUGVlclRTKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCAqQWRkcik7CitleHRlcm4gdm9pZCBSZW1vdmVBbGxUUyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSk7Cit2b2lkIHJ0bGxpYl9zb2Z0bWFjX3NjYW5fc3luY3JvKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCBpc19tZXNoKTsKKworZXh0ZXJuIGNvbnN0IGxvbmcgcnRsbGliX3dsYW5fZnJlcXVlbmNpZXNbXTsKKworZXh0ZXJuIGlubGluZSB2b2lkIHJ0bGxpYl9pbmNyZW1lbnRfc2NhbnMoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJaWVlZS0+c2NhbnMrKzsKK30KKworZXh0ZXJuIGlubGluZSBpbnQgcnRsbGliX2dldF9zY2FucyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwlyZXR1cm4gaWVlZS0+c2NhbnM7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqZXNjYXBlX2Vzc2lkKGNvbnN0IGNoYXIgKmVzc2lkLCB1OCBlc3NpZF9sZW4pCit7CisJc3RhdGljIGNoYXIgZXNjYXBlZFtJV19FU1NJRF9NQVhfU0laRSAqIDIgKyAxXTsKKwljb25zdCBjaGFyICpzID0gZXNzaWQ7CisJY2hhciAqZCA9IGVzY2FwZWQ7CisKKwlpZiAocnRsbGliX2lzX2VtcHR5X2Vzc2lkKGVzc2lkLCBlc3NpZF9sZW4pKSB7CisJCW1lbWNweShlc2NhcGVkLCAiPGhpZGRlbj4iLCBzaXplb2YoIjxoaWRkZW4+IikpOworCQlyZXR1cm4gZXNjYXBlZDsKKwl9CisKKwllc3NpZF9sZW4gPSBtaW4oZXNzaWRfbGVuLCAodTgpSVdfRVNTSURfTUFYX1NJWkUpOworCXdoaWxlIChlc3NpZF9sZW4tLSkgeworCQlpZiAoKnMgPT0gJ1wwJykgeworCQkJKmQrKyA9ICdcXCc7CisJCQkqZCsrID0gJzAnOworCQkJcysrOworCQl9IGVsc2UgeworCQkJKmQrKyA9ICpzKys7CisJCX0KKwl9CisJKmQgPSAnXDAnOworCXJldHVybiBlc2NhcGVkOworfQorCisjZGVmaW5lIENPTlZFUlRfUkFURShfaWVlZSwgX01HTl9SQVRFKQkJCVwKKwkoKF9NR05fUkFURSA8IE1HTl9NQ1MwKSA/IChfTUdOX1JBVEUpIDoJCVwKKwkoSFRNY3NUb0RhdGFSYXRlKF9pZWVlLCAodTgpX01HTl9SQVRFKSkpCisKKy8qIGZ1biB3aXRoIHRoZSBidWlsdC1pbiBydGxsaWIgc3RhY2suLi4gKi8KK2ludCBydGxsaWJfaW5pdCh2b2lkKTsKK3ZvaWQgcnRsbGliX2V4aXQodm9pZCk7CitpbnQgcnRsbGliX2NyeXB0b19pbml0KHZvaWQpOwordm9pZCBydGxsaWJfY3J5cHRvX2RlaW5pdCh2b2lkKTsKK2ludCBydGxsaWJfY3J5cHRvX3RraXBfaW5pdCh2b2lkKTsKK3ZvaWQgcnRsbGliX2NyeXB0b190a2lwX2V4aXQodm9pZCk7CitpbnQgcnRsbGliX2NyeXB0b19jY21wX2luaXQodm9pZCk7Cit2b2lkIHJ0bGxpYl9jcnlwdG9fY2NtcF9leGl0KHZvaWQpOworaW50IHJ0bGxpYl9jcnlwdG9fd2VwX2luaXQodm9pZCk7Cit2b2lkIHJ0bGxpYl9jcnlwdG9fd2VwX2V4aXQodm9pZCk7CisKK3ZvaWQgcnRsbGliX01nbnREaXNjb25uZWN0SUJTUyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqcnRsbGliKTsKK3ZvaWQgcnRsbGliX01sbWVEaXNhc3NvY2lhdGVSZXF1ZXN0KHN0cnVjdCBydGxsaWJfZGV2aWNlICpydGxsaWIsIHU4ICphc1N0YSwKKwkJCQkgICAgdTggYXNSc24pOwordm9pZCBydGxsaWJfTWdudERpc2Nvbm5lY3RBUChzdHJ1Y3QgcnRsbGliX2RldmljZSAqcnRsbGliLCB1OCBhc1Jzbik7Citib29sIHJ0bGxpYl9NZ250RGlzY29ubmVjdChzdHJ1Y3QgcnRsbGliX2RldmljZSAqcnRsbGliLCB1OCBhc1Jzbik7CisKKworLyogRm9yIHRoZSBmdW5jdGlvbiBpcyBtb3JlIHJlbGF0ZWQgdG8gaGFyZHdhcmUgc2V0dGluZywgaXQncyBiZXR0ZXIgdG8gdXNlIHRoZQorICogaWVlZSBoYW5kbGVyIHRvIHJlZmVyIHRvIGl0LgorICovCitleHRlcm4gdm9pZCBydGxsaWJfdXBkYXRlX2FjdGl2ZV9jaGFuX21hcChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSk7CitleHRlcm4gdm9pZCBydGxsaWJfRmx1c2hSeFRzUGVuZGluZ1BrdHMoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkJCXN0cnVjdCByeF90c19yZWNvcmQgKnBUUyk7CitleHRlcm4gaW50IHJ0bGxpYl9kYXRhX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IHJ0bGxpYl9wYXJzZV9pbmZvX3BhcmFtKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQlzdHJ1Y3QgcnRsbGliX2luZm9fZWxlbWVudCAqaW5mb19lbGVtZW50LAorCQl1MTYgbGVuZ3RoLAorCQlzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKm5ldHdvcmssCisJCXN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKnN0YXRzKTsKKwordm9pZCBydGxsaWJfaW5kaWNhdGVfcGFja2V0cyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCSAgICAgc3RydWN0IHJ0bGxpYl9yeGIgKipwcnhiSW5kaWNhdGVBcnJheSwgdTggIGluZGV4KTsKK2V4dGVybiB1OCBIVEZpbHRlck1DU1JhdGUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHU4ICpwU3VwcG9ydE1DUywKKwkJCSAgdTggKnBPcGVyYXRlTUNTKTsKK2V4dGVybiB2b2lkIEhUVXNlRGVmYXVsdFNldHRpbmcoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpOworI2RlZmluZSBSVF9BU09DX1JFVFJZX0xJTUlUCTUKK3U4IE1nbnRRdWVyeV9UeFJhdGVFeGNsdWRlQ0NLUmF0ZXMoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpOworZXh0ZXJuIHZvaWQgcnRsbGliX1RVUkJPX0luZm8oc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHU4ICoqdGFnX3ApOworI2lmbmRlZiBFTkFCTEVfTE9DS19ERUJVRworI2RlZmluZSBTUElOX0xPQ0tfSUVFRShwbG9jaykgc3Bpbl9sb2NrX2lycXNhdmUoKHBsb2NrKSwgZmxhZ3MpCisjZGVmaW5lIFNQSU5fVU5MT0NLX0lFRUUocGxvY2spIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoKHBsb2NrKSwgZmxhZ3MpCisjZGVmaW5lIFNQSU5fTE9DS19JRUVFX1JFT1JERVIocGxvY2spIHNwaW5fbG9ja19pcnFzYXZlKChwbG9jayksIGZsYWdzKQorI2RlZmluZSBTUElOX1VOTE9DS19JRUVFX1JFT1JERVIocGxvY2spIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoKHBsb2NrKSwgZmxhZ3MpCisjZGVmaW5lIFNQSU5fTE9DS19JRUVFX1dQQVgocGxvY2spIHNwaW5fbG9ja19pcnFzYXZlKChwbG9jayksIGZsYWdzKQorI2RlZmluZSBTUElOX1VOTE9DS19JRUVFX1dQQVgocGxvY2spIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoKHBsb2NrKSwgZmxhZ3MpCisjZGVmaW5lIFNQSU5fTE9DS19JRUVFX01HTlRUWChwbG9jaykgc3Bpbl9sb2NrX2lycXNhdmUoKHBsb2NrKSwgZmxhZ3MpCisjZGVmaW5lIFNQSU5fVU5MT0NLX0lFRUVfTUdOVFRYKHBsb2NrKSBzcGluX3VubG9ja19pcnFyZXN0b3JlKChwbG9jayksIGZsYWdzKQorI2RlZmluZSBTUElOX0xPQ0tfSUVFRV9CQ04ocGxvY2spIHNwaW5fbG9ja19pcnFzYXZlKChwbG9jayksIGZsYWdzKQorI2RlZmluZSBTUElOX1VOTE9DS19JRUVFX0JDTihwbG9jaykgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgocGxvY2spLCBmbGFncykKKyNkZWZpbmUgU1BJTl9MT0NLX01TSF9TVEFJTkZPKHBsb2NrKSBzcGluX2xvY2tfaXJxc2F2ZSgocGxvY2spLCBmbGFncykKKyNkZWZpbmUgU1BJTl9VTkxPQ0tfTVNIX1NUQUlORk8ocGxvY2spIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoKHBsb2NrKSwgZmxhZ3MpCisjZGVmaW5lIFNQSU5fTE9DS19NU0hfUFJFUShwbG9jaykgc3Bpbl9sb2NrX2lycXNhdmUoKHBsb2NrKSwgZmxhZ3MpCisjZGVmaW5lIFNQSU5fVU5MT0NLX01TSF9QUkVRKHBsb2NrKSBzcGluX3VubG9ja19pcnFyZXN0b3JlKChwbG9jayksIGZsYWdzKQorI2RlZmluZSBTUElOX0xPQ0tfTVNIX1FVRVVFKHBsb2NrKSBzcGluX2xvY2tfaXJxc2F2ZSgocGxvY2spLCBmbGFncykKKyNkZWZpbmUgU1BJTl9VTkxPQ0tfTVNIX1FVRVVFKHBsb2NrKSBzcGluX3VubG9ja19pcnFyZXN0b3JlKChwbG9jayksIGZsYWdzKQorI2RlZmluZSBTUElOX0xPQ0tfUFJJVl9SRlBTKHBsb2NrKSBzcGluX2xvY2tfaXJxc2F2ZSgocGxvY2spLCBmbGFncykKKyNkZWZpbmUgU1BJTl9VTkxPQ0tfUFJJVl9SRlBTKHBsb2NrKSBzcGluX3VubG9ja19pcnFyZXN0b3JlKChwbG9jayksIGZsYWdzKQorI2RlZmluZSBTUElOX0xPQ0tfUFJJVl9JUlFUSChwbG9jaykgc3Bpbl9sb2NrX2lycXNhdmUoKHBsb2NrKSwgZmxhZ3MpCisjZGVmaW5lIFNQSU5fVU5MT0NLX1BSSVZfSVJRVEgocGxvY2spIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoKHBsb2NrKSwgZmxhZ3MpCisjZGVmaW5lIFNQSU5fTE9DS19QUklWX1RYKHBsb2NrKSBzcGluX2xvY2tfaXJxc2F2ZSgocGxvY2spLCBmbGFncykKKyNkZWZpbmUgU1BJTl9VTkxPQ0tfUFJJVl9UWChwbG9jaykgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgocGxvY2spLCBmbGFncykKKyNkZWZpbmUgU1BJTl9MT0NLX1BSSVZfRDMocGxvY2spIHNwaW5fbG9ja19pcnFzYXZlKChwbG9jayksIGZsYWdzKQorI2RlZmluZSBTUElOX1VOTE9DS19QUklWX0QzKHBsb2NrKSBzcGluX3VubG9ja19pcnFyZXN0b3JlKChwbG9jayksIGZsYWdzKQorI2RlZmluZSBTUElOX0xPQ0tfUFJJVl9SRihwbG9jaykgc3Bpbl9sb2NrX2lycXNhdmUoKHBsb2NrKSwgZmxhZ3MpCisjZGVmaW5lIFNQSU5fVU5MT0NLX1BSSVZfUkYocGxvY2spIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoKHBsb2NrKSwgZmxhZ3MpCisjZGVmaW5lIFNQSU5fTE9DS19QUklWX1BTKHBsb2NrKSBzcGluX2xvY2tfaXJxc2F2ZSgocGxvY2spLCBmbGFncykKKyNkZWZpbmUgU1BJTl9VTkxPQ0tfUFJJVl9QUyhwbG9jaykgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgocGxvY2spLCBmbGFncykKKyNkZWZpbmUgU0VNX0RPV05fSUVFRV9XWChwc2VtKSBkb3duKHBzZW0pCisjZGVmaW5lIFNFTV9VUF9JRUVFX1dYKHBzZW0pIHVwKHBzZW0pCisjZGVmaW5lIFNFTV9ET1dOX0lFRUVfU0NBTihwc2VtKSBkb3duKHBzZW0pCisjZGVmaW5lIFNFTV9VUF9JRUVFX1NDQU4ocHNlbSkgdXAocHNlbSkKKyNkZWZpbmUgU0VNX0RPV05fSUVFRV9JUFMocHNlbSkgZG93bihwc2VtKQorI2RlZmluZSBTRU1fVVBfSUVFRV9JUFMocHNlbSkgdXAocHNlbSkKKyNkZWZpbmUgU0VNX0RPV05fUFJJVl9XWChwc2VtKSBkb3duKHBzZW0pCisjZGVmaW5lIFNFTV9VUF9QUklWX1dYKHBzZW0pIHVwKHBzZW0pCisjZGVmaW5lIFNFTV9ET1dOX1BSSVZfUkYocHNlbSkgZG93bihwc2VtKQorI2RlZmluZSBTRU1fVVBfUFJJVl9SRihwc2VtKSB1cChwc2VtKQorI2RlZmluZSBNVVRFWF9MT0NLX1BSSVYocG11dGV4KSBtdXRleF9sb2NrKHBtdXRleCkKKyNkZWZpbmUgTVVURVhfVU5MT0NLX1BSSVYocG11dGV4KSBtdXRleF91bmxvY2socG11dGV4KQorI2VuZGlmCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtcF9idWYodTggKmJ1ZiwgdTMyIGxlbikKK3sKKwl1MzIgaTsKKwlwcmludGsoS0VSTl9JTkZPICItLS0tLS0tLS0tLS0tLS0tLUxlbiAlZC0tLS0tLS0tLS0tLS0tLS1cbiIsIGxlbik7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlwcmludGsoIiUyLjJ4LSIsICooYnVmK2kpKTsKKwlwcmludGsoIlxuIik7Cit9CisjZW5kaWYgLyogUlRMTElCX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2NyeXB0LmMKc2ltaWxhcml0eSBpbmRleCA2MyUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9jcnlwdC5jCmluZGV4IDYxZmQ0Y2UuLmFjZGEzN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9jcnlwdC5jCkBAIC0xMSw0MSArMTEsMzcgQEAKICAqCiAgKi8KIAotLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8YXNtL3N0cmluZy5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAKLSNpbmNsdWRlICJpZWVlODAyMTEuaCIKKyNpbmNsdWRlICJydGxsaWIuaCIKIAotLy9NT0RVTEVfQVVUSE9SKCJKb3VuaSBNYWxpbmVuIik7Ci0vL01PRFVMRV9ERVNDUklQVElPTigiSG9zdEFQIGNyeXB0byIpOwotLy9NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyB7CitzdHJ1Y3QgcnRsbGliX2NyeXB0b19hbGcgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKm9wczsKKwlzdHJ1Y3QgcnRsbGliX2NyeXB0b19vcHMgKm9wczsKIH07CiAKIAotc3RydWN0IGllZWU4MDIxMV9jcnlwdG8geworc3RydWN0IHJ0bGxpYl9jcnlwdG8gewogCXN0cnVjdCBsaXN0X2hlYWQgYWxnczsKIAlzcGlubG9ja190IGxvY2s7CiB9OwogCi1zdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jcnlwdG8gKmhjcnlwdDsKK3N0YXRpYyBzdHJ1Y3QgcnRsbGliX2NyeXB0byAqaGNyeXB0OwogCi12b2lkIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllcyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKK3ZvaWQgcnRsbGliX2NyeXB0X2RlaW5pdF9lbnRyaWVzKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAogCQkJCQkgICBpbnQgZm9yY2UpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqcHRyLCAqbjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKmVudHJ5OworCXN0cnVjdCBydGxsaWJfY3J5cHRfZGF0YSAqZW50cnk7CiAKIAlmb3IgKHB0ciA9IGllZWUtPmNyeXB0X2RlaW5pdF9saXN0Lm5leHQsIG4gPSBwdHItPm5leHQ7CiAJICAgICBwdHIgIT0gJmllZWUtPmNyeXB0X2RlaW5pdF9saXN0OyBwdHIgPSBuLCBuID0gcHRyLT5uZXh0KSB7Ci0JCWVudHJ5ID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBpZWVlODAyMTFfY3J5cHRfZGF0YSwgbGlzdCk7CisJCWVudHJ5ID0gbGlzdF9lbnRyeShwdHIsIHN0cnVjdCBydGxsaWJfY3J5cHRfZGF0YSwgbGlzdCk7CiAKIAkJaWYgKGF0b21pY19yZWFkKCZlbnRyeS0+cmVmY250KSAhPSAwICYmICFmb3JjZSkKIAkJCWNvbnRpbnVlOwpAQCAtNTgsMTMgKzU0LDEzIEBACiAJfQogfQogCi12b2lkIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlcih1bnNpZ25lZCBsb25nIGRhdGEpCit2b2lkIHJ0bGxpYl9jcnlwdF9kZWluaXRfaGFuZGxlcih1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSAoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKilkYXRhOworCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gKHN0cnVjdCBydGxsaWJfZGV2aWNlICopZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKLQlpZWVlODAyMTFfY3J5cHRfZGVpbml0X2VudHJpZXMoaWVlZSwgMCk7CisJcnRsbGliX2NyeXB0X2RlaW5pdF9lbnRyaWVzKGllZWUsIDApOwogCWlmICghbGlzdF9lbXB0eSgmaWVlZS0+Y3J5cHRfZGVpbml0X2xpc3QpKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogZW50cmllcyByZW1haW5pbmcgaW4gZGVsYXllZCBjcnlwdCAiCiAJCSAgICAgICAiZGVsZXRpb24gbGlzdFxuIiwgaWVlZS0+ZGV2LT5uYW1lKTsKQEAgLTc1LDEwICs3MSwxMCBAQAogCiB9CiAKLXZvaWQgaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdCkKK3ZvaWQgcnRsbGliX2NyeXB0X2RlbGF5ZWRfZGVpbml0KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJCSAgICBzdHJ1Y3QgcnRsbGliX2NyeXB0X2RhdGEgKipjcnlwdCkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKnRtcDsKKwlzdHJ1Y3QgcnRsbGliX2NyeXB0X2RhdGEgKnRtcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKCpjcnlwdCA9PSBOVUxMKQpAQCAtMTAwLDQzICs5Niw0NCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIH0KIAotaW50IGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKQoraW50IHJ0bGxpYl9yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBydGxsaWJfY3J5cHRvX29wcyAqb3BzKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICphbGc7CisJc3RydWN0IHJ0bGxpYl9jcnlwdG9fYWxnICphbGc7CiAKIAlpZiAoaGNyeXB0ID09IE5VTEwpCiAJCXJldHVybiAtMTsKIAotCWFsZyA9IGt6YWxsb2Moc2l6ZW9mKCphbGcpLCBHRlBfS0VSTkVMKTsKKwlhbGcgPSBrbWFsbG9jKHNpemVvZigqYWxnKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGFsZyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCW1lbXNldChhbGcsIDAsIHNpemVvZigqYWxnKSk7CiAJYWxnLT5vcHMgPSBvcHM7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CiAJbGlzdF9hZGQoJmFsZy0+bGlzdCwgJmhjcnlwdC0+YWxncyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CiAKLQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0OiByZWdpc3RlcmVkIGFsZ29yaXRobSAnJXMnXG4iLAorCXByaW50ayhLRVJOX0RFQlVHICJydGxsaWJfY3J5cHQ6IHJlZ2lzdGVyZWQgYWxnb3JpdGhtICclcydcbiIsCiAJICAgICAgIG9wcy0+bmFtZSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHMoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzICpvcHMpCitpbnQgcnRsbGliX3VucmVnaXN0ZXJfY3J5cHRvX29wcyhzdHJ1Y3QgcnRsbGliX2NyeXB0b19vcHMgKm9wcykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBsaXN0X2hlYWQgKnB0cjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKmRlbF9hbGcgPSBOVUxMOworCXN0cnVjdCBydGxsaWJfY3J5cHRvX2FsZyAqZGVsX2FsZyA9IE5VTEw7CiAKIAlpZiAoaGNyeXB0ID09IE5VTEwpCiAJCXJldHVybiAtMTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZoY3J5cHQtPmxvY2ssIGZsYWdzKTsKIAlmb3IgKHB0ciA9IGhjcnlwdC0+YWxncy5uZXh0OyBwdHIgIT0gJmhjcnlwdC0+YWxnczsgcHRyID0gcHRyLT5uZXh0KSB7Ci0JCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqYWxnID0KLQkJCShzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKikgcHRyOworCQlzdHJ1Y3QgcnRsbGliX2NyeXB0b19hbGcgKmFsZyA9CisJCQkoc3RydWN0IHJ0bGxpYl9jcnlwdG9fYWxnICopIHB0cjsKIAkJaWYgKGFsZy0+b3BzID09IG9wcykgewogCQkJbGlzdF9kZWwoJmFsZy0+bGlzdCk7CiAJCQlkZWxfYWxnID0gYWxnOwpAQCAtMTQ2LDcgKzE0Myw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CiAKIAlpZiAoZGVsX2FsZykgewotCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0OiB1bnJlZ2lzdGVyZWQgYWxnb3JpdGhtICIKKwkJcHJpbnRrKEtFUk5fREVCVUcgInJ0bGxpYl9jcnlwdDogdW5yZWdpc3RlcmVkIGFsZ29yaXRobSAiCiAJCSAgICAgICAiJyVzJ1xuIiwgb3BzLT5uYW1lKTsKIAkJa2ZyZWUoZGVsX2FsZyk7CiAJfQpAQCAtMTU1LDE5ICsxNTIsMTkgQEAKIH0KIAogCi1zdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgKiBpZWVlODAyMTFfZ2V0X2NyeXB0b19vcHMoY29uc3QgY2hhciAqbmFtZSkKK3N0cnVjdCBydGxsaWJfY3J5cHRvX29wcyAqcnRsbGliX2dldF9jcnlwdG9fb3BzKGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7Ci0Jc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICpmb3VuZF9hbGcgPSBOVUxMOworCXN0cnVjdCBydGxsaWJfY3J5cHRvX2FsZyAqZm91bmRfYWxnID0gTlVMTDsKIAogCWlmIChoY3J5cHQgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGNyeXB0LT5sb2NrLCBmbGFncyk7CiAJZm9yIChwdHIgPSBoY3J5cHQtPmFsZ3MubmV4dDsgcHRyICE9ICZoY3J5cHQtPmFsZ3M7IHB0ciA9IHB0ci0+bmV4dCkgewotCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKmFsZyA9Ci0JCQkoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICopIHB0cjsKKwkJc3RydWN0IHJ0bGxpYl9jcnlwdG9fYWxnICphbGcgPQorCQkJKHN0cnVjdCBydGxsaWJfY3J5cHRvX2FsZyAqKSBwdHI7CiAJCWlmIChzdHJjbXAoYWxnLT5vcHMtPm5hbWUsIG5hbWUpID09IDApIHsKIAkJCWZvdW5kX2FsZyA9IGFsZzsKIAkJCWJyZWFrOwpAQCAtMTgyLDEzICsxNzksMTMgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCAqIGllZWU4MDIxMV9jcnlwdF9udWxsX2luaXQoaW50IGtleWlkeCkgeyByZXR1cm4gKHZvaWQgKikgMTsgfQotc3RhdGljIHZvaWQgaWVlZTgwMjExX2NyeXB0X251bGxfZGVpbml0KHZvaWQgKnByaXYpIHt9CitzdGF0aWMgdm9pZCAqIHJ0bGxpYl9jcnlwdF9udWxsX2luaXQoaW50IGtleWlkeCkgeyByZXR1cm4gKHZvaWQgKikgMTsgfQorc3RhdGljIHZvaWQgcnRsbGliX2NyeXB0X251bGxfZGVpbml0KHZvaWQgKnByaXYpIHt9CiAKLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgaWVlZTgwMjExX2NyeXB0X251bGwgPSB7CitzdGF0aWMgc3RydWN0IHJ0bGxpYl9jcnlwdG9fb3BzIHJ0bGxpYl9jcnlwdF9udWxsID0gewogCS5uYW1lCQkJPSAiTlVMTCIsCi0JLmluaXQJCQk9IGllZWU4MDIxMV9jcnlwdF9udWxsX2luaXQsCi0JLmRlaW5pdAkJCT0gaWVlZTgwMjExX2NyeXB0X251bGxfZGVpbml0LAorCS5pbml0CQkJPSBydGxsaWJfY3J5cHRfbnVsbF9pbml0LAorCS5kZWluaXQJCQk9IHJ0bGxpYl9jcnlwdF9udWxsX2RlaW5pdCwKIAkuZW5jcnlwdF9tcGR1CQk9IE5VTEwsCiAJLmRlY3J5cHRfbXBkdQkJPSBOVUxMLAogCS5lbmNyeXB0X21zZHUJCT0gTlVMTCwKQEAgLTIwMSwxOCArMTk4LDE5IEBACiB9OwogCiAKLWludCBfX2luaXQgaWVlZTgwMjExX2NyeXB0b19pbml0KHZvaWQpCitpbnQgX19pbml0IHJ0bGxpYl9jcnlwdG9faW5pdCh2b2lkKQogewogCWludCByZXQgPSAtRU5PTUVNOwogCi0JaGNyeXB0ID0ga3phbGxvYyhzaXplb2YoKmhjcnlwdCksIEdGUF9LRVJORUwpOworCWhjcnlwdCA9IGttYWxsb2Moc2l6ZW9mKCpoY3J5cHQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhjcnlwdCkKIAkJZ290byBvdXQ7CiAKKwltZW1zZXQoaGNyeXB0LCAwLCBzaXplb2YoKmhjcnlwdCkpOwogCUlOSVRfTElTVF9IRUFEKCZoY3J5cHQtPmFsZ3MpOwogCXNwaW5fbG9ja19pbml0KCZoY3J5cHQtPmxvY2spOwogCi0JcmV0ID0gaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF9udWxsKTsKKwlyZXQgPSBydGxsaWJfcmVnaXN0ZXJfY3J5cHRvX29wcygmcnRsbGliX2NyeXB0X251bGwpOwogCWlmIChyZXQgPCAwKSB7CiAJCWtmcmVlKGhjcnlwdCk7CiAJCWhjcnlwdCA9IE5VTEw7CkBAIC0yMjIsNyArMjIwLDcgQEAKIH0KIAogCi12b2lkIGllZWU4MDIxMV9jcnlwdG9fZGVpbml0KHZvaWQpCit2b2lkIF9fZXhpdCBydGxsaWJfY3J5cHRvX2RlaW5pdCh2b2lkKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKnB0ciwgKm47CiAKQEAgLTIzMSwxNCArMjI5LDEzIEBACiAKIAlmb3IgKHB0ciA9IGhjcnlwdC0+YWxncy5uZXh0LCBuID0gcHRyLT5uZXh0OyBwdHIgIT0gJmhjcnlwdC0+YWxnczsKIAkgICAgIHB0ciA9IG4sIG4gPSBwdHItPm5leHQpIHsKLQkJc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICphbGcgPQotCQkJKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX2FsZyAqKSBwdHI7CisJCXN0cnVjdCBydGxsaWJfY3J5cHRvX2FsZyAqYWxnID0KKwkJCShzdHJ1Y3QgcnRsbGliX2NyeXB0b19hbGcgKikgcHRyOwogCQlsaXN0X2RlbChwdHIpOwotCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0OiB1bnJlZ2lzdGVyZWQgYWxnb3JpdGhtICIKKwkJcHJpbnRrKEtFUk5fREVCVUcgInJ0bGxpYl9jcnlwdDogdW5yZWdpc3RlcmVkIGFsZ29yaXRobSAiCiAJCSAgICAgICAiJyVzJyAoZGVpbml0KVxuIiwgYWxnLT5vcHMtPm5hbWUpOwogCQlrZnJlZShhbGcpOwogCX0KIAogCWtmcmVlKGhjcnlwdCk7CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2NyeXB0LmgKc2ltaWxhcml0eSBpbmRleCA3NCUKcmVuYW1lIGZyb20gZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuaApyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9jcnlwdC5oCmluZGV4IGNhN2RkMGQuLjQ5YjkwYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9jcnlwdC5oCkBAIC0xOCwxNCArMTgsMTQgQEAKICAqLwogCiAvKgotICogVGhpcyBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZSB0byB0aGUgaWVlZTgwMjExIGNyeXB0byBtb2R1bGUuCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIHRvIHRoZSBydGxsaWIgY3J5cHRvIG1vZHVsZS4KICAqLwotI2lmbmRlZiBJRUVFODAyMTFfQ1JZUFRfSAotI2RlZmluZSBJRUVFODAyMTFfQ1JZUFRfSAorI2lmbmRlZiBSVExMSUJfQ1JZUFRfSAorI2RlZmluZSBSVExMSUJfQ1JZUFRfSAogCiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAKLXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyB7CitzdHJ1Y3QgcnRsbGliX2NyeXB0b19vcHMgewogCWNvbnN0IGNoYXIgKm5hbWU7CiAKIAkvKiBpbml0IG5ldyBjcnlwdG8gY29udGV4dCAoZS5nLiwgYWxsb2NhdGUgcHJpdmF0ZSBkYXRhIHNwYWNlLApAQCAtNDksNyArNDksNyBAQAogCSAqIFRoZXNlIGNhbiBiZSBOVUxMIGlmIGZ1bGwgTVNEVSBvcGVyYXRpb25zIGFyZSBub3QgbmVlZGVkLiAqLwogCWludCAoKmVuY3J5cHRfbXNkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpOwogCWludCAoKmRlY3J5cHRfbXNkdSkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGtleWlkeCwgaW50IGhkcl9sZW4sCi0JCQkgICAgdm9pZCAqcHJpdik7CisJCQkgICAgdm9pZCAqcHJpdiwgc3RydWN0IHJ0bGxpYl9kZXZpY2UqIGllZWUpOwogCiAJaW50ICgqc2V0X2tleSkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KTsKIAlpbnQgKCpnZXRfa2V5KSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpOwpAQCAtNjEsMjUgKzYxLDI1IEBACiAJLyogbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgYWRkZWQgYnkgZW5jcnlwdGlvbjsgZW5jcnlwdCBidWYgaXMKIAkgKiBhbGxvY2F0ZWQgd2l0aCBleHRyYV9wcmVmaXhfbGVuIGJ5dGVzLCBjb3B5IG9mIGluX2J1ZiwgYW5kCiAJICogZXh0cmFfcG9zdGZpeF9sZW47IGVuY3J5cHQgbmVlZCBub3QgdXNlIGFsbCB0aGlzIHNwYWNlLCBidXQKLQkgKiB0aGUgcmVzdWx0IG11c3Qgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIGFuZCBjb3JyZWN0Ci0JICogbGVuZ3RoIG11c3QgYmUgcmV0dXJuZWQgKi8KKwkgKiB0aGUgcmVzdWx0IG11c3Qgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RydWN0IGJ1ZmZlciBhbmQKKwkgKiBjb3JyZWN0IGxlbmd0aCBtdXN0IGJlIHJldHVybmVkICovCiAJaW50IGV4dHJhX3ByZWZpeF9sZW4sIGV4dHJhX3Bvc3RmaXhfbGVuOwogCiAJc3RydWN0IG1vZHVsZSAqb3duZXI7CiB9OwogCi1zdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgeworc3RydWN0IHJ0bGxpYl9jcnlwdF9kYXRhIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7IC8qIGRlbGF5ZWQgZGVsZXRpb24gbGlzdCAqLwotCXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzOworCXN0cnVjdCBydGxsaWJfY3J5cHRvX29wcyAqb3BzOwogCXZvaWQgKnByaXY7CiAJYXRvbWljX3QgcmVmY250OwogfTsKIAotaW50IGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKTsKLWludCBpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKHN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqb3BzKTsKLXN0cnVjdCBpZWVlODAyMTFfY3J5cHRvX29wcyAqIGllZWU4MDIxMV9nZXRfY3J5cHRvX29wcyhjb25zdCBjaGFyICpuYW1lKTsKLXZvaWQgaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9lbnRyaWVzKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICosIGludCk7Ci12b2lkIGllZWU4MDIxMV9jcnlwdF9kZWluaXRfaGFuZGxlcih1bnNpZ25lZCBsb25nKTsKLXZvaWQgaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAotCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEgKipjcnlwdCk7CitpbnQgcnRsbGliX3JlZ2lzdGVyX2NyeXB0b19vcHMoc3RydWN0IHJ0bGxpYl9jcnlwdG9fb3BzICpvcHMpOworaW50IHJ0bGxpYl91bnJlZ2lzdGVyX2NyeXB0b19vcHMoc3RydWN0IHJ0bGxpYl9jcnlwdG9fb3BzICpvcHMpOworc3RydWN0IHJ0bGxpYl9jcnlwdG9fb3BzICpydGxsaWJfZ2V0X2NyeXB0b19vcHMoY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIHJ0bGxpYl9jcnlwdF9kZWluaXRfZW50cmllcyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqLCBpbnQpOwordm9pZCBydGxsaWJfY3J5cHRfZGVpbml0X2hhbmRsZXIodW5zaWduZWQgbG9uZyk7Cit2b2lkIHJ0bGxpYl9jcnlwdF9kZWxheWVkX2RlaW5pdChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCQkgc3RydWN0IHJ0bGxpYl9jcnlwdF9kYXRhICoqY3J5cHQpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2NyeXB0X2NjbXAuYwpzaW1pbGFyaXR5IGluZGV4IDY3JQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfY3J5cHRfY2NtcC5jCmluZGV4IDQ4MjY3YTAuLjYxOTZiOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X2NjbXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2NyeXB0X2NjbXAuYwpAQCAtOSw3ICs5LDcgQEAKICAqIG1vcmUgZGV0YWlscy4KICAqLwogCi0vLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTE4LDIyICsxOCwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0jaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+Ci0KLSNpbmNsdWRlICJpZWVlODAyMTEuaCIKKyNpbmNsdWRlICJydGxsaWIuaCIKIAogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgogCi0gICAgI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+Ci0KLU1PRFVMRV9BVVRIT1IoIkpvdW5pIE1hbGluZW4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSG9zdCBBUCBjcnlwdDogQ0NNUCIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0jaWZuZGVmIE9QRU5TVVNFX1NMRUQKLSNkZWZpbmUgT1BFTlNVU0VfU0xFRCAwCi0jZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogCiAjZGVmaW5lIEFFU19CTE9DS19MRU4gMTYKICNkZWZpbmUgQ0NNUF9IRFJfTEVOIDgKQEAgLTQxLDcgKzMyLDcgQEAKICNkZWZpbmUgQ0NNUF9US19MRU4gMTYKICNkZWZpbmUgQ0NNUF9QTl9MRU4gNgogCi1zdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSB7CitzdHJ1Y3QgcnRsbGliX2NjbXBfZGF0YSB7CiAJdTgga2V5W0NDTVBfVEtfTEVOXTsKIAlpbnQga2V5X3NldDsKIApAQCAtNjIsMjQgKzUzLDI1IEBACiAJdTggcnhfYjBbQUVTX0JMT0NLX0xFTl0sIHJ4X2JbQUVTX0JMT0NLX0xFTl0sIHJ4X2FbQUVTX0JMT0NLX0xFTl07CiB9OwogCi12b2lkIGllZWU4MDIxMV9jY21wX2Flc19lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCitzdGF0aWMgdm9pZCBydGxsaWJfY2NtcF9hZXNfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAogCQkJICAgICBjb25zdCB1OCBwdFsxNl0sIHU4IGN0WzE2XSkKIHsKLQljcnlwdG9fY2lwaGVyX2VuY3J5cHRfb25lKCh2b2lkKil0Zm0sIGN0LCBwdCk7CisJY3J5cHRvX2NpcGhlcl9lbmNyeXB0X29uZSgodm9pZCAqKXRmbSwgY3QsIHB0KTsKIH0KIAotc3RhdGljIHZvaWQgKiBpZWVlODAyMTFfY2NtcF9pbml0KGludCBrZXlfaWR4KQorc3RhdGljIHZvaWQgKnJ0bGxpYl9jY21wX2luaXQoaW50IGtleV9pZHgpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKnByaXY7CisJc3RydWN0IHJ0bGxpYl9jY21wX2RhdGEgKnByaXY7CiAKLQlwcml2ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfQVRPTUlDKTsKKwlwcml2ID0ga21hbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfQVRPTUlDKTsKIAlpZiAocHJpdiA9PSBOVUxMKQogCQlnb3RvIGZhaWw7CisJbWVtc2V0KHByaXYsIDAsIHNpemVvZigqcHJpdikpOwogCXByaXYtPmtleV9pZHggPSBrZXlfaWR4OwogCi0gICAgICAgcHJpdi0+dGZtID0gKHZvaWQqKWNyeXB0b19hbGxvY19jaXBoZXIoImFlcyIsIDAsIENSWVBUT19BTEdfQVNZTkMpOworCXByaXYtPnRmbSA9ICh2b2lkICopY3J5cHRvX2FsbG9jX2NpcGhlcigiYWVzIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CiAJaWYgKElTX0VSUihwcml2LT50Zm0pKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfY2NtcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJcHJpbnRrKEtFUk5fREVCVUcgInJ0bGxpYl9jcnlwdF9jY21wOiBjb3VsZCBub3QgYWxsb2NhdGUgIgogCQkgICAgICAgImNyeXB0byBBUEkgYWVzXG4iKTsKIAkJcHJpdi0+dGZtID0gTlVMTDsKIAkJZ290byBmYWlsOwpAQCAtODksNyArODEsNyBAQAogZmFpbDoKIAlpZiAocHJpdikgewogCQlpZiAocHJpdi0+dGZtKQotCQkJY3J5cHRvX2ZyZWVfY2lwaGVyKCh2b2lkKilwcml2LT50Zm0pOworCQkJY3J5cHRvX2ZyZWVfY2lwaGVyKCh2b2lkICopcHJpdi0+dGZtKTsKIAkJa2ZyZWUocHJpdik7CiAJfQogCkBAIC05NywxMSArODksMTEgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfY2NtcF9kZWluaXQodm9pZCAqcHJpdikKK3N0YXRpYyB2b2lkIHJ0bGxpYl9jY21wX2RlaW5pdCh2b2lkICpwcml2KQogewotCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICpfcHJpdiA9IHByaXY7CisJc3RydWN0IHJ0bGxpYl9jY21wX2RhdGEgKl9wcml2ID0gcHJpdjsKIAlpZiAoX3ByaXYgJiYgX3ByaXYtPnRmbSkKLQkJY3J5cHRvX2ZyZWVfY2lwaGVyKCh2b2lkKilfcHJpdi0+dGZtKTsKKwkJY3J5cHRvX2ZyZWVfY2lwaGVyKCh2b2lkICopX3ByaXYtPnRmbSk7CiAJa2ZyZWUocHJpdik7CiB9CiAKQEAgLTExNiw3ICsxMDgsNyBAQAogCiAKIHN0YXRpYyB2b2lkIGNjbXBfaW5pdF9ibG9ja3Moc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKLQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkciwKKwkJCSAgICAgc3RydWN0IHJ0bGxpYl9oZHJfNGFkZHIgKmhkciwKIAkJCSAgICAgdTggKnBuLCBzaXplX3QgZGxlbiwgdTggKmIwLCB1OCAqYXV0aCwKIAkJCSAgICAgdTggKnMwKQogewpAQCAtMTI3LDE0ICsxMTksMTMgQEAKIAl1OCBhYWRbMiAqIEFFU19CTE9DS19MRU5dOwogCiAJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7Ci0JYTRfaW5jbHVkZWQgPSAoKGZjICYgKElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKSA9PQotCQkgICAgICAgKElFRUU4MDIxMV9GQ1RMX1RPRFMgfCBJRUVFODAyMTFfRkNUTF9GUk9NRFMpKTsKKwlhNF9pbmNsdWRlZCA9ICgoZmMgJiAoUlRMTElCX0ZDVExfVE9EUyB8IFJUTExJQl9GQ1RMX0ZST01EUykpID09CisJCSAgICAgICAoUlRMTElCX0ZDVExfVE9EUyB8IFJUTExJQl9GQ1RMX0ZST01EUykpOwogCS8qCi0JcWNfaW5jbHVkZWQgPSAoKFdMQU5fRkNfR0VUX1RZUEUoZmMpID09IElFRUU4MDIxMV9GVFlQRV9EQVRBKSAmJgorCXFjX2luY2x1ZGVkID0gKChXTEFOX0ZDX0dFVF9UWVBFKGZjKSA9PSBSVExMSUJfRlRZUEVfREFUQSkgJiYKIAkJICAgICAgIChXTEFOX0ZDX0dFVF9TVFlQRShmYykgJiAweDA4KSk7Ci0gICAgICAgICovCi0JLy8gZml4ZWQgYnkgRGF2aWQgOjIwMDYuOS42Ci0JcWNfaW5jbHVkZWQgPSAoKFdMQU5fRkNfR0VUX1RZUEUoZmMpID09IElFRUU4MDIxMV9GVFlQRV9EQVRBKSAmJgorCSovCisJcWNfaW5jbHVkZWQgPSAoKFdMQU5fRkNfR0VUX1RZUEUoZmMpID09IFJUTExJQl9GVFlQRV9EQVRBKSAmJgogCQkgICAgICAgKFdMQU5fRkNfR0VUX1NUWVBFKGZjKSAmIDB4ODApKTsKIAlhYWRfbGVuID0gMjI7CiAJaWYgKGE0X2luY2x1ZGVkKQpAQCAtMTgzLDI2ICsxNzQsMjYgQEAKIAl9CiAKIAkvKiBTdGFydCB3aXRoIHRoZSBmaXJzdCBibG9jayBhbmQgQUFEICovCi0JaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQodGZtLCBiMCwgYXV0aCk7CisJcnRsbGliX2NjbXBfYWVzX2VuY3J5cHQodGZtLCBiMCwgYXV0aCk7CiAJeG9yX2Jsb2NrKGF1dGgsIGFhZCwgQUVTX0JMT0NLX0xFTik7Ci0JaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQodGZtLCBhdXRoLCBhdXRoKTsKKwlydGxsaWJfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGF1dGgsIGF1dGgpOwogCXhvcl9ibG9jayhhdXRoLCAmYWFkW0FFU19CTE9DS19MRU5dLCBBRVNfQkxPQ0tfTEVOKTsKLQlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGF1dGgsIGF1dGgpOworCXJ0bGxpYl9jY21wX2Flc19lbmNyeXB0KHRmbSwgYXV0aCwgYXV0aCk7CiAJYjBbMF0gJj0gMHgwNzsKIAliMFsxNF0gPSBiMFsxNV0gPSAwOwotCWllZWU4MDIxMV9jY21wX2Flc19lbmNyeXB0KHRmbSwgYjAsIHMwKTsKKwlydGxsaWJfY2NtcF9hZXNfZW5jcnlwdCh0Zm0sIGIwLCBzMCk7CiB9CiAKIAogCi1zdGF0aWMgaW50IGllZWU4MDIxMV9jY21wX2VuY3J5cHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCitzdGF0aWMgaW50IHJ0bGxpYl9jY21wX2VuY3J5cHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcl9sZW4sIHZvaWQgKnByaXYpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9jY21wX2RhdGEgKmtleSA9IHByaXY7CisJc3RydWN0IHJ0bGxpYl9jY21wX2RhdGEgKmtleSA9IHByaXY7CiAJaW50IGRhdGFfbGVuLCBpOwogCXU4ICpwb3M7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcjsKLQljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7Ci0KKwlzdHJ1Y3QgcnRsbGliX2hkcl80YWRkciAqaGRyOworCXN0cnVjdCBjYl9kZXNjICp0Y2JfZGVzYyA9IChzdHJ1Y3QgY2JfZGVzYyAqKShza2ItPmNiICsKKwkJCQkgICAgTUFYX0RFVl9BRERSX1NJWkUpOwogCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IENDTVBfSERSX0xFTiB8fAogCSAgICBza2JfdGFpbHJvb20oc2tiKSA8IENDTVBfTUlDX0xFTiB8fAogCSAgICBza2ItPmxlbiA8IGhkcl9sZW4pCkBAIC0yMTIsNyArMjAzLDYgQEAKIAlwb3MgPSBza2JfcHVzaChza2IsIENDTVBfSERSX0xFTik7CiAJbWVtbW92ZShwb3MsIHBvcyArIENDTVBfSERSX0xFTiwgaGRyX2xlbik7CiAJcG9zICs9IGhkcl9sZW47Ci0vLwltaWMgPSBza2JfcHV0KHNrYiwgQ0NNUF9NSUNfTEVOKTsKIAogCWkgPSBDQ01QX1BOX0xFTiAtIDE7CiAJd2hpbGUgKGkgPj0gMCkgewpAQCAtMjMyLDkgKzIyMiw4IEBACiAJKnBvcysrID0ga2V5LT50eF9wblswXTsKIAogCi0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKLQlpZiAoIXRjYl9kZXNjLT5iSHdTZWMpCi0JeworCWhkciA9IChzdHJ1Y3QgcnRsbGliX2hkcl80YWRkciAqKSBza2ItPmRhdGE7CisJaWYgKCF0Y2JfZGVzYy0+Ykh3U2VjKSB7CiAJCWludCBibG9ja3MsIGxhc3QsIGxlbjsKIAkJdTggKm1pYzsKIAkJdTggKmIwID0ga2V5LT50eF9iMDsKQEAgLTI0MiwxMCArMjMxLDEwIEBACiAJCXU4ICplID0ga2V5LT50eF9lOwogCQl1OCAqczAgPSBrZXktPnR4X3MwOwogCi0JCS8vbWljIGlzIG1vdmVkIHRvIGhlcmUgYnkgam9obgogCQltaWMgPSBza2JfcHV0KHNrYiwgQ0NNUF9NSUNfTEVOKTsKIAotCQljY21wX2luaXRfYmxvY2tzKGtleS0+dGZtLCBoZHIsIGtleS0+dHhfcG4sIGRhdGFfbGVuLCBiMCwgYiwgczApOworCQljY21wX2luaXRfYmxvY2tzKGtleS0+dGZtLCBoZHIsIGtleS0+dHhfcG4sIGRhdGFfbGVuLAorCQkJCSBiMCwgYiwgczApOwogCiAJCWJsb2NrcyA9IChkYXRhX2xlbiArIEFFU19CTE9DS19MRU4gLSAxKSAvIEFFU19CTE9DS19MRU47CiAJCWxhc3QgPSBkYXRhX2xlbiAlIEFFU19CTE9DS19MRU47CkBAIC0yNTQsMTEgKzI0MywxMSBAQAogCQkJbGVuID0gKGkgPT0gYmxvY2tzICYmIGxhc3QpID8gbGFzdCA6IEFFU19CTE9DS19MRU47CiAJCQkvKiBBdXRoZW50aWNhdGlvbiAqLwogCQkJeG9yX2Jsb2NrKGIsIHBvcywgbGVuKTsKLQkJCWllZWU4MDIxMV9jY21wX2Flc19lbmNyeXB0KGtleS0+dGZtLCBiLCBiKTsKKwkJCXJ0bGxpYl9jY21wX2Flc19lbmNyeXB0KGtleS0+dGZtLCBiLCBiKTsKIAkJCS8qIEVuY3J5cHRpb24sIHdpdGggY291bnRlciAqLwogCQkJYjBbMTRdID0gKGkgPj4gOCkgJiAweGZmOwogCQkJYjBbMTVdID0gaSAmIDB4ZmY7Ci0JCQlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdChrZXktPnRmbSwgYjAsIGUpOworCQkJcnRsbGliX2NjbXBfYWVzX2VuY3J5cHQoa2V5LT50Zm0sIGIwLCBlKTsKIAkJCXhvcl9ibG9jayhwb3MsIGUsIGxlbik7CiAJCQlwb3MgKz0gbGVuOwogCQl9CkBAIC0yNzAsMTIgKzI1OSwxMyBAQAogfQogCiAKLXN0YXRpYyBpbnQgaWVlZTgwMjExX2NjbXBfZGVjcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3N0YXRpYyBpbnQgcnRsbGliX2NjbXBfZGVjcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSAqa2V5ID0gcHJpdjsKKwlzdHJ1Y3QgcnRsbGliX2NjbXBfZGF0YSAqa2V5ID0gcHJpdjsKIAl1OCBrZXlpZHgsICpwb3M7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcjsKLQljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7CisJc3RydWN0IHJ0bGxpYl9oZHJfNGFkZHIgKmhkcjsKKwlzdHJ1Y3QgY2JfZGVzYyAqdGNiX2Rlc2MgPSAoc3RydWN0IGNiX2Rlc2MgKikoc2tiLT5jYiArCisJCQkJICAgIE1BWF9ERVZfQUREUl9TSVpFKTsKIAl1OCBwbls2XTsKIAogCWlmIChza2ItPmxlbiA8IGhkcl9sZW4gKyBDQ01QX0hEUl9MRU4gKyBDQ01QX01JQ19MRU4pIHsKQEAgLTI4Myw3ICsyNzMsNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKwloZHIgPSAoc3RydWN0IHJ0bGxpYl9oZHJfNGFkZHIgKikgc2tiLT5kYXRhOwogCXBvcyA9IHNrYi0+ZGF0YSArIGhkcl9sZW47CiAJa2V5aWR4ID0gcG9zWzNdOwogCWlmICghKGtleWlkeCAmICgxIDw8IDUpKSkgewpAQCAtMzE2LDE0ICszMDYsMTMgQEAKIAlwbls0XSA9IHBvc1sxXTsKIAlwbls1XSA9IHBvc1swXTsKIAlwb3MgKz0gODsKLQogCWlmIChtZW1jbXAocG4sIGtleS0+cnhfcG4sIENDTVBfUE5fTEVOKSA8PSAwKSB7CiAJCWtleS0+ZG90MTFSU05BU3RhdHNDQ01QUmVwbGF5cysrOwogCQlyZXR1cm4gLTQ7CiAJfQotCWlmICghdGNiX2Rlc2MtPmJId1NlYykKLQl7Ci0JCXNpemVfdCBkYXRhX2xlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbiAtIENDTVBfSERSX0xFTiAtIENDTVBfTUlDX0xFTjsKKwlpZiAoIXRjYl9kZXNjLT5iSHdTZWMpIHsKKwkJc2l6ZV90IGRhdGFfbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuIC0gQ0NNUF9IRFJfTEVOIC0KKwkJCQkgIENDTVBfTUlDX0xFTjsKIAkJdTggKm1pYyA9IHNrYi0+ZGF0YSArIHNrYi0+bGVuIC0gQ0NNUF9NSUNfTEVOOwogCQl1OCAqYjAgPSBrZXktPnJ4X2IwOwogCQl1OCAqYiA9IGtleS0+cnhfYjsKQEAgLTM0MiwxOCArMzMxLDE4IEBACiAJCQkvKiBEZWNyeXB0LCB3aXRoIGNvdW50ZXIgKi8KIAkJCWIwWzE0XSA9IChpID4+IDgpICYgMHhmZjsKIAkJCWIwWzE1XSA9IGkgJiAweGZmOwotCQkJaWVlZTgwMjExX2NjbXBfYWVzX2VuY3J5cHQoa2V5LT50Zm0sIGIwLCBiKTsKKwkJCXJ0bGxpYl9jY21wX2Flc19lbmNyeXB0KGtleS0+dGZtLCBiMCwgYik7CiAJCQl4b3JfYmxvY2socG9zLCBiLCBsZW4pOwogCQkJLyogQXV0aGVudGljYXRpb24gKi8KIAkJCXhvcl9ibG9jayhhLCBwb3MsIGxlbik7Ci0JCQlpZWVlODAyMTFfY2NtcF9hZXNfZW5jcnlwdChrZXktPnRmbSwgYSwgYSk7CisJCQlydGxsaWJfY2NtcF9hZXNfZW5jcnlwdChrZXktPnRmbSwgYSwgYSk7CiAJCQlwb3MgKz0gbGVuOwogCQl9CiAKIAkJaWYgKG1lbWNtcChtaWMsIGEsIENDTVBfTUlDX0xFTikgIT0gMCkgewogCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkgewogCQkJCXByaW50ayhLRVJOX0RFQlVHICJDQ01QOiBkZWNyeXB0IGZhaWxlZDogU1RBPSIKLQkJCQkiJXBNXG4iLCBoZHItPmFkZHIyKTsKKwkJCQkiICVwTVxuIiwgaGRyLT5hZGRyMik7CiAJCQl9CiAJCQlrZXktPmRvdDExUlNOQVN0YXRzQ0NNUERlY3J5cHRFcnJvcnMrKzsKIAkJCXJldHVybiAtNTsKQEAgLTM3MCw5ICszNTksOSBAQAogfQogCiAKLXN0YXRpYyBpbnQgaWVlZTgwMjExX2NjbXBfc2V0X2tleSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpCitzdGF0aWMgaW50IHJ0bGxpYl9jY21wX3NldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQogewotCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICpkYXRhID0gcHJpdjsKKwlzdHJ1Y3QgcnRsbGliX2NjbXBfZGF0YSAqZGF0YSA9IHByaXY7CiAJaW50IGtleWlkeDsKIAlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gZGF0YS0+dGZtOwogCkBAIC0zOTEsNyArMzgwLDcgQEAKIAkJCWRhdGEtPnJ4X3BuWzRdID0gc2VxWzFdOwogCQkJZGF0YS0+cnhfcG5bNV0gPSBzZXFbMF07CiAJCX0KLQkJY3J5cHRvX2NpcGhlcl9zZXRrZXkoKHZvaWQqKWRhdGEtPnRmbSwgZGF0YS0+a2V5LCBDQ01QX1RLX0xFTik7CisJCWNyeXB0b19jaXBoZXJfc2V0a2V5KCh2b2lkICopZGF0YS0+dGZtLCBkYXRhLT5rZXksIENDTVBfVEtfTEVOKTsKIAl9IGVsc2UgaWYgKGxlbiA9PSAwKQogCQlkYXRhLT5rZXlfc2V0ID0gMDsKIAllbHNlCkBAIC00MDEsOSArMzkwLDkgQEAKIH0KIAogCi1zdGF0aWMgaW50IGllZWU4MDIxMV9jY21wX2dldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQorc3RhdGljIGludCBydGxsaWJfY2NtcF9nZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdikKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NjbXBfZGF0YSAqZGF0YSA9IHByaXY7CisJc3RydWN0IHJ0bGxpYl9jY21wX2RhdGEgKmRhdGEgPSBwcml2OwogCiAJaWYgKGxlbiA8IENDTVBfVEtfTEVOKQogCQlyZXR1cm4gLTE7CkBAIC00MjUsMjIgKzQxNCwxNCBAQAogfQogCiAKLXN0YXRpYyBjaGFyICogaWVlZTgwMjExX2NjbXBfcHJpbnRfc3RhdHMoY2hhciAqcCwgdm9pZCAqcHJpdikKK3N0YXRpYyBjaGFyICpydGxsaWJfY2NtcF9wcmludF9zdGF0cyhjaGFyICpwLCB2b2lkICpwcml2KQogewotCXN0cnVjdCBpZWVlODAyMTFfY2NtcF9kYXRhICpjY21wID0gcHJpdjsKLQlpbnQgaTsKLQotCXAgKz0gc3ByaW50ZihwLCAia2V5WyVkXSBhbGc9Q0NNUCBrZXlfc2V0PSVkIHR4X3BuPSIsCi0JCSAgICAgY2NtcC0+a2V5X2lkeCwgY2NtcC0+a2V5X3NldCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjY21wLT50eF9wbik7IGkrKykKLQkJcCArPSBzcHJpbnRmKHAsICIlMDJ4IiwgY2NtcC0+dHhfcG5baV0pOwotCi0Jc3ByaW50ZihwLCAiIHJ4X3BuPSIpOwotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNjbXAtPnJ4X3BuKTsgaSsrKQotCQlwICs9IHNwcmludGYocCwgIiUwMngiLCBjY21wLT50eF9wbltpXSk7Ci0KLQlwICs9IHNwcmludGYocCwgIiBmb3JtYXRfZXJyb3JzPSVkIHJlcGxheXM9JWQgZGVjcnlwdF9lcnJvcnM9JWRcbiIsCisJc3RydWN0IHJ0bGxpYl9jY21wX2RhdGEgKmNjbXAgPSBwcml2OworCXAgKz0gc3ByaW50ZihwLCAia2V5WyVkXSBhbGc9Q0NNUCBrZXlfc2V0PSVkICIKKwkJICAgICAidHhfcG49JXBNIHJ4X3BuPSVwTSAiCisJCSAgICAgImZvcm1hdF9lcnJvcnM9JWQgcmVwbGF5cz0lZCBkZWNyeXB0X2Vycm9ycz0lZFxuIiwKKwkJICAgICBjY21wLT5rZXlfaWR4LCBjY21wLT5rZXlfc2V0LAorCQkgICAgIGNjbXAtPnR4X3BuLCBjY21wLT5yeF9wbiwKIAkJICAgICBjY21wLT5kb3QxMVJTTkFTdGF0c0NDTVBGb3JtYXRFcnJvcnMsCiAJCSAgICAgY2NtcC0+ZG90MTFSU05BU3RhdHNDQ01QUmVwbGF5cywKIAkJICAgICBjY21wLT5kb3QxMVJTTkFTdGF0c0NDTVBEZWNyeXB0RXJyb3JzKTsKQEAgLTQ0OCwzNiArNDI5LDM1IEBACiAJcmV0dXJuIHA7CiB9CiAKLXZvaWQgaWVlZTgwMjExX2NjbXBfbnVsbCh2b2lkKQordm9pZCBydGxsaWJfY2NtcF9udWxsKHZvaWQpCiB7CiAJcmV0dXJuOwogfQogCi1zdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fb3BzIGllZWU4MDIxMV9jcnlwdF9jY21wID0geworc3RhdGljIHN0cnVjdCBydGxsaWJfY3J5cHRvX29wcyBydGxsaWJfY3J5cHRfY2NtcCA9IHsKIAkubmFtZQkJCT0gIkNDTVAiLAotCS5pbml0CQkJPSBpZWVlODAyMTFfY2NtcF9pbml0LAotCS5kZWluaXQJCQk9IGllZWU4MDIxMV9jY21wX2RlaW5pdCwKLQkuZW5jcnlwdF9tcGR1CQk9IGllZWU4MDIxMV9jY21wX2VuY3J5cHQsCi0JLmRlY3J5cHRfbXBkdQkJPSBpZWVlODAyMTFfY2NtcF9kZWNyeXB0LAorCS5pbml0CQkJPSBydGxsaWJfY2NtcF9pbml0LAorCS5kZWluaXQJCQk9IHJ0bGxpYl9jY21wX2RlaW5pdCwKKwkuZW5jcnlwdF9tcGR1CQk9IHJ0bGxpYl9jY21wX2VuY3J5cHQsCisJLmRlY3J5cHRfbXBkdQkJPSBydGxsaWJfY2NtcF9kZWNyeXB0LAogCS5lbmNyeXB0X21zZHUJCT0gTlVMTCwKIAkuZGVjcnlwdF9tc2R1CQk9IE5VTEwsCi0JLnNldF9rZXkJCT0gaWVlZTgwMjExX2NjbXBfc2V0X2tleSwKLQkuZ2V0X2tleQkJPSBpZWVlODAyMTFfY2NtcF9nZXRfa2V5LAotCS5wcmludF9zdGF0cwkJPSBpZWVlODAyMTFfY2NtcF9wcmludF9zdGF0cywKKwkuc2V0X2tleQkJPSBydGxsaWJfY2NtcF9zZXRfa2V5LAorCS5nZXRfa2V5CQk9IHJ0bGxpYl9jY21wX2dldF9rZXksCisJLnByaW50X3N0YXRzCQk9IHJ0bGxpYl9jY21wX3ByaW50X3N0YXRzLAogCS5leHRyYV9wcmVmaXhfbGVuCT0gQ0NNUF9IRFJfTEVOLAogCS5leHRyYV9wb3N0Zml4X2xlbgk9IENDTVBfTUlDX0xFTiwKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogfTsKIAogCi1pbnQgX19pbml0IGllZWU4MDIxMV9jcnlwdG9fY2NtcF9pbml0KHZvaWQpCitpbnQgX19pbml0IHJ0bGxpYl9jcnlwdG9fY2NtcF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfY2NtcCk7CisJcmV0dXJuIHJ0bGxpYl9yZWdpc3Rlcl9jcnlwdG9fb3BzKCZydGxsaWJfY3J5cHRfY2NtcCk7CiB9CiAKIAotdm9pZCBpZWVlODAyMTFfY3J5cHRvX2NjbXBfZXhpdCh2b2lkKQordm9pZCBfX2V4aXQgcnRsbGliX2NyeXB0b19jY21wX2V4aXQodm9pZCkKIHsKLQlpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfY2NtcCk7CisJcnRsbGliX3VucmVnaXN0ZXJfY3J5cHRvX29wcygmcnRsbGliX2NyeXB0X2NjbXApOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2NyeXB0X3RraXAuYwpzaW1pbGFyaXR5IGluZGV4IDcxJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMKcmVuYW1lIHRvIGRyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfY3J5cHRfdGtpcC5jCmluZGV4IGVkNjIzYTkuLjZhMGM4NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2NyeXB0X3RraXAuYwpAQCAtOSw3ICs5LDcgQEAKICAqIG1vcmUgZGV0YWlscy4KICAqLwogCi0vLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTE4LDI1ICsxOCwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0jaW5jbHVkZSA8YXNtL3N0cmluZy5oPgotCi0jaW5jbHVkZSAiaWVlZTgwMjExLmgiCi0KLQorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+Ci0KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogCi1NT0RVTEVfQVVUSE9SKCJKb3VuaSBNYWxpbmVuIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkhvc3QgQVAgY3J5cHQ6IFRLSVAiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKyNpbmNsdWRlICJydGxsaWIuaCIKIAotI2lmbmRlZiBPUEVOU1VTRV9TTEVECi0jZGVmaW5lIE9QRU5TVVNFX1NMRUQgMAotI2VuZGlmCi0KLXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhIHsKK3N0cnVjdCBydGxsaWJfdGtpcF9kYXRhIHsKICNkZWZpbmUgVEtJUF9LRVlfTEVOIDMyCiAJdTgga2V5W1RLSVBfS0VZX0xFTl07CiAJaW50IGtleV9zZXQ7CkBAIC00OCw2ICszNyw3IEBACiAKIAl1MzIgcnhfaXYzMjsKIAl1MTYgcnhfaXYxNjsKKwlib29sIGluaXRpYWxpemVkOwogCXUxNiByeF90dGFrWzVdOwogCWludCByeF9waGFzZTFfZG9uZTsKIAl1MzIgcnhfaXYzMl9uZXc7CkBAIC02NiwxOCArNTYsMTkgQEAKIAl1OCByeF9oZHJbMTZdLCB0eF9oZHJbMTZdOwogfTsKIAotc3RhdGljIHZvaWQgKiBpZWVlODAyMTFfdGtpcF9pbml0KGludCBrZXlfaWR4KQorc3RhdGljIHZvaWQgKnJ0bGxpYl90a2lwX2luaXQoaW50IGtleV9pZHgpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnByaXY7CisJc3RydWN0IHJ0bGxpYl90a2lwX2RhdGEgKnByaXY7CiAKLQlwcml2ID0ga3phbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfQVRPTUlDKTsKKwlwcml2ID0ga21hbGxvYyhzaXplb2YoKnByaXYpLCBHRlBfQVRPTUlDKTsKIAlpZiAocHJpdiA9PSBOVUxMKQogCQlnb3RvIGZhaWw7CisJbWVtc2V0KHByaXYsIDAsIHNpemVvZigqcHJpdikpOwogCXByaXYtPmtleV9pZHggPSBrZXlfaWR4OwogCXByaXYtPnR4X3RmbV9hcmM0ID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiZWNiKGFyYzQpIiwgMCwKIAkJCUNSWVBUT19BTEdfQVNZTkMpOwogCWlmIChJU19FUlIocHJpdi0+dHhfdGZtX2FyYzQpKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJcHJpbnRrKEtFUk5fREVCVUcgInJ0bGxpYl9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgogCQkJCSJjcnlwdG8gQVBJIGFyYzRcbiIpOwogCQlwcml2LT50eF90Zm1fYXJjNCA9IE5VTEw7CiAJCWdvdG8gZmFpbDsKQEAgLTg2LDcgKzc3LDcgQEAKIAlwcml2LT50eF90Zm1fbWljaGFlbCA9IGNyeXB0b19hbGxvY19oYXNoKCJtaWNoYWVsX21pYyIsIDAsCiAJCQlDUllQVE9fQUxHX0FTWU5DKTsKIAlpZiAoSVNfRVJSKHByaXYtPnR4X3RmbV9taWNoYWVsKSkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiaWVlZTgwMjExX2NyeXB0X3RraXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCisJCXByaW50ayhLRVJOX0RFQlVHICJydGxsaWJfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlICIKIAkJCQkiY3J5cHRvIEFQSSBtaWNoYWVsX21pY1xuIik7CiAJCXByaXYtPnR4X3RmbV9taWNoYWVsID0gTlVMTDsKIAkJZ290byBmYWlsOwpAQCAtOTUsNyArODYsNyBAQAogCXByaXYtPnJ4X3RmbV9hcmM0ID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiZWNiKGFyYzQpIiwgMCwKIAkJCUNSWVBUT19BTEdfQVNZTkMpOwogCWlmIChJU19FUlIocHJpdi0+cnhfdGZtX2FyYzQpKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlICIKKwkJcHJpbnRrKEtFUk5fREVCVUcgInJ0bGxpYl9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgogCQkJCSJjcnlwdG8gQVBJIGFyYzRcbiIpOwogCQlwcml2LT5yeF90Zm1fYXJjNCA9IE5VTEw7CiAJCWdvdG8gZmFpbDsKQEAgLTEwNCw3ICs5NSw3IEBACiAJcHJpdi0+cnhfdGZtX21pY2hhZWwgPSBjcnlwdG9fYWxsb2NfaGFzaCgibWljaGFlbF9taWMiLCAwLAogCQkJQ1JZUFRPX0FMR19BU1lOQyk7CiAJaWYgKElTX0VSUihwcml2LT5yeF90Zm1fbWljaGFlbCkpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQlwcmludGsoS0VSTl9ERUJVRyAicnRsbGliX2NyeXB0X3RraXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCiAJCQkJImNyeXB0byBBUEkgbWljaGFlbF9taWNcbiIpOwogCQlwcml2LT5yeF90Zm1fbWljaGFlbCA9IE5VTEw7CiAJCWdvdG8gZmFpbDsKQEAgLTEyOCw5ICsxMTksMTAgQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfdGtpcF9kZWluaXQodm9pZCAqcHJpdikKK3N0YXRpYyB2b2lkIHJ0bGxpYl90a2lwX2RlaW5pdCh2b2lkICpwcml2KQogewotCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICpfcHJpdiA9IHByaXY7CisJc3RydWN0IHJ0bGxpYl90a2lwX2RhdGEgKl9wcml2ID0gcHJpdjsKKwogCWlmIChfcHJpdikgewogCQlpZiAoX3ByaXYtPnR4X3RmbV9taWNoYWVsKQogCQkJY3J5cHRvX2ZyZWVfaGFzaChfcHJpdi0+dHhfdGZtX21pY2hhZWwpOwpAQCAtMTg3LDggKzE3OSw3IEBACiB9CiAKIAotc3RhdGljIGNvbnN0IHUxNiBTYm94WzI1Nl0gPQoteworc3RhdGljIGNvbnN0IHUxNiBTYm94WzI1Nl0gPSB7CiAJMHhDNkE1LCAweEY4ODQsIDB4RUU5OSwgMHhGNjhELCAweEZGMEQsIDB4RDZCRCwgMHhERUIxLCAweDkxNTQsCiAJMHg2MDUwLCAweDAyMDMsIDB4Q0VBOSwgMHg1NjdELCAweEU3MTksIDB4QjU2MiwgMHg0REU2LCAweEVDOUEsCiAJMHg4RjQ1LCAweDFGOUQsIDB4ODk0MCwgMHhGQTg3LCAweEVGMTUsIDB4QjJFQiwgMHg4RUM5LCAweEZCMEIsCkBAIC0zMDMsMTQgKzI5NCwxNCBAQAogfQogCiAKLXN0YXRpYyBpbnQgaWVlZTgwMjExX3RraXBfZW5jcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3N0YXRpYyBpbnQgcnRsbGliX3RraXBfZW5jcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CisJc3RydWN0IHJ0bGxpYl90a2lwX2RhdGEgKnRrZXkgPSBwcml2OwogCQlpbnQgbGVuOwogCXU4ICpwb3M7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcjsKLQljYl9kZXNjICp0Y2JfZGVzYyA9IChjYl9kZXNjICopKHNrYi0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7Ci0KKwlzdHJ1Y3QgcnRsbGliX2hkcl80YWRkciAqaGRyOworCXN0cnVjdCBjYl9kZXNjICp0Y2JfZGVzYyA9IChzdHJ1Y3QgY2JfZGVzYyAqKShza2ItPmNiICsKKwkJCQkgICAgTUFYX0RFVl9BRERSX1NJWkUpOwogCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjID0gey50Zm0gPSB0a2V5LT50eF90Zm1fYXJjNH07CiAJaW50IHJldCA9IDA7CiAJdTggcmM0a2V5WzE2XSwgICppY3Y7CkBAIC0zMjEsMTggKzMxMiwxNyBAQAogCSAgICBza2ItPmxlbiA8IGhkcl9sZW4pCiAJCXJldHVybiAtMTsKIAotCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKSBza2ItPmRhdGE7CisJaGRyID0gKHN0cnVjdCBydGxsaWJfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKIAotCWlmICghdGNiX2Rlc2MtPmJId1NlYykKLQl7CisJaWYgKCF0Y2JfZGVzYy0+Ykh3U2VjKSB7CiAJCWlmICghdGtleS0+dHhfcGhhc2UxX2RvbmUpIHsKIAkJCXRraXBfbWl4aW5nX3BoYXNlMSh0a2V5LT50eF90dGFrLCB0a2V5LT5rZXksIGhkci0+YWRkcjIsCiAJCQkJCXRrZXktPnR4X2l2MzIpOwogCQkJdGtleS0+dHhfcGhhc2UxX2RvbmUgPSAxOwogCQl9Ci0JCXRraXBfbWl4aW5nX3BoYXNlMihyYzRrZXksIHRrZXktPmtleSwgdGtleS0+dHhfdHRhaywgdGtleS0+dHhfaXYxNik7Ci0JfQotCWVsc2UKKwkJdGtpcF9taXhpbmdfcGhhc2UyKHJjNGtleSwgdGtleS0+a2V5LCB0a2V5LT50eF90dGFrLAorCQkJCSAgIHRrZXktPnR4X2l2MTYpOworCX0gZWxzZQogCXRrZXktPnR4X3BoYXNlMV9kb25lID0gMTsKIAogCkBAIC0zNDEsMTQgKzMzMSwxMSBAQAogCW1lbW1vdmUocG9zLCBwb3MgKyA4LCBoZHJfbGVuKTsKIAlwb3MgKz0gaGRyX2xlbjsKIAotCWlmICh0Y2JfZGVzYy0+Ykh3U2VjKQotCXsKKwlpZiAodGNiX2Rlc2MtPmJId1NlYykgewogCQkqcG9zKysgPSBIaTgodGtleS0+dHhfaXYxNik7CiAJCSpwb3MrKyA9IChIaTgodGtleS0+dHhfaXYxNikgfCAweDIwKSAmIDB4N0Y7CiAJCSpwb3MrKyA9IExvOCh0a2V5LT50eF9pdjE2KTsKLQl9Ci0JZWxzZQotCXsKKwl9IGVsc2UgewogCQkqcG9zKysgPSByYzRrZXlbMF07CiAJCSpwb3MrKyA9IHJjNGtleVsxXTsKIAkJKnBvcysrID0gcmM0a2V5WzJdOwpAQCAtMzYwLDE4ICszNDcsMTkgQEAKIAkqcG9zKysgPSAodGtleS0+dHhfaXYzMiA+PiAxNikgJiAweGZmOwogCSpwb3MrKyA9ICh0a2V5LT50eF9pdjMyID4+IDI0KSAmIDB4ZmY7CiAKLQlpZiAoIXRjYl9kZXNjLT5iSHdTZWMpCi0JeworCWlmICghdGNiX2Rlc2MtPmJId1NlYykgewogCQlpY3YgPSBza2JfcHV0KHNrYiwgNCk7CiAJCWNyYyA9IH5jcmMzMl9sZSh+MCwgcG9zLCBsZW4pOwogCQlpY3ZbMF0gPSBjcmM7CiAJCWljdlsxXSA9IGNyYyA+PiA4OwogCQlpY3ZbMl0gPSBjcmMgPj4gMTY7CiAJCWljdlszXSA9IGNyYyA+PiAyNDsKLQkJY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkodGtleS0+dHhfdGZtX2FyYzQsIHJjNGtleSwgMTYpOwotCQlzZ19pbml0X29uZSgmc2csIHBvcywgbGVuKzQpOwotCQlyZXQ9IGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdCgmZGVzYywgJnNnLCAmc2csIGxlbiArIDQpOwogCisJCXNnX2luaXRfb25lKCZzZywgcG9zLCBsZW4rNCk7CisKKworCQljcnlwdG9fYmxrY2lwaGVyX3NldGtleSh0a2V5LT50eF90Zm1fYXJjNCwgcmM0a2V5LCAxNik7CisJCXJldCA9IGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdCgmZGVzYywgJnNnLCAmc2csIGxlbiArIDQpOwogCX0KIAogCXRrZXktPnR4X2l2MTYrKzsKQEAgLTM4MywxOSArMzcxLDIwIEBACiAJaWYgKCF0Y2JfZGVzYy0+Ykh3U2VjKQogCQlyZXR1cm4gcmV0OwogCWVsc2UKLSAgICAgICAgCXJldHVybiAwOworCQlyZXR1cm4gMDsKIAogCiB9CiAKLXN0YXRpYyBpbnQgaWVlZTgwMjExX3RraXBfZGVjcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3N0YXRpYyBpbnQgcnRsbGliX3RraXBfZGVjcnlwdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CisJc3RydWN0IHJ0bGxpYl90a2lwX2RhdGEgKnRrZXkgPSBwcml2OwogCXU4IGtleWlkeCwgKnBvczsKIAl1MzIgaXYzMjsKIAl1MTYgaXYxNjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGRyOwotCWNiX2Rlc2MgKnRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKKwlzdHJ1Y3QgcnRsbGliX2hkcl80YWRkciAqaGRyOworCXN0cnVjdCBjYl9kZXNjICp0Y2JfZGVzYyA9IChzdHJ1Y3QgY2JfZGVzYyAqKShza2ItPmNiICsKKwkJCQkgICAgTUFYX0RFVl9BRERSX1NJWkUpOwogCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjID0gey50Zm0gPSB0a2V5LT5yeF90Zm1fYXJjNH07CiAJdTggcmM0a2V5WzE2XTsKIAl1OCBpY3ZbNF07CkBAIC00MDUsNyArMzk0LDcgQEAKIAlpZiAoc2tiLT5sZW4gPCBoZHJfbGVuICsgOCArIDQpCiAJCXJldHVybiAtMTsKIAotCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKSBza2ItPmRhdGE7CisJaGRyID0gKHN0cnVjdCBydGxsaWJfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKIAlwb3MgPSBza2ItPmRhdGEgKyBoZHJfbGVuOwogCWtleWlkeCA9IHBvc1szXTsKIAlpZiAoIShrZXlpZHggJiAoMSA8PCA1KSkpIHsKQEAgLTQzMywzNSArNDIyLDM4IEBACiAJaXYzMiA9IHBvc1s0XSB8IChwb3NbNV0gPDwgOCkgfCAocG9zWzZdIDw8IDE2KSB8IChwb3NbN10gPDwgMjQpOwogCXBvcyArPSA4OwogCi0JaWYgKCF0Y2JfZGVzYy0+Ykh3U2VjKQotCXsKLQkJaWYgKGl2MzIgPCB0a2V5LT5yeF9pdjMyIHx8Ci0JCShpdjMyID09IHRrZXktPnJ4X2l2MzIgJiYgaXYxNiA8PSB0a2V5LT5yeF9pdjE2KSkgeworCWlmICghdGNiX2Rlc2MtPmJId1NlYyB8fCAoc2tiLT5jYlswXSA9PSAxKSkgeworCQlpZiAoKGl2MzIgPCB0a2V5LT5yeF9pdjMyIHx8CisJCSAgICAoaXYzMiA9PSB0a2V5LT5yeF9pdjMyICYmIGl2MTYgPD0gdGtleS0+cnhfaXYxNikpICYmCisJCSAgICB0a2V5LT5pbml0aWFsaXplZCkgewogCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkgewotCQkJCXByaW50ayhLRVJOX0RFQlVHICJUS0lQOiByZXBsYXkgZGV0ZWN0ZWQ6IFNUQT0lcE0iCi0JCQkJIiBwcmV2aW91cyBUU0MgJTA4eCUwNHggcmVjZWl2ZWQgVFNDICIKLQkJCQkiJTA4eCUwNHhcbiIsIGhkci0+YWRkcjIsCi0JCQkJdGtleS0+cnhfaXYzMiwgdGtleS0+cnhfaXYxNiwgaXYzMiwgaXYxNik7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IHJlcGxheSBkZXRlY3RlZDogU1RBPSIKKwkJCQkgICAgICAgIiAlcE0gcHJldmlvdXMgVFNDICUwOHglMDR4IHJlY2VpdmVkICIKKwkJCQkgICAgICAiVFNDICUwOHglMDR4XG4iLGhkci0+YWRkcjIsCisJCQkJICAgICAgdGtleS0+cnhfaXYzMiwgdGtleS0+cnhfaXYxNiwgaXYzMiwgaXYxNik7CiAJCQl9CiAJCQl0a2V5LT5kb3QxMVJTTkFTdGF0c1RLSVBSZXBsYXlzKys7CiAJCQlyZXR1cm4gLTQ7CiAJCX0KKwkJdGtleS0+aW5pdGlhbGl6ZWQgPSB0cnVlOwogCiAJCWlmIChpdjMyICE9IHRrZXktPnJ4X2l2MzIgfHwgIXRrZXktPnJ4X3BoYXNlMV9kb25lKSB7Ci0JCQl0a2lwX21peGluZ19waGFzZTEodGtleS0+cnhfdHRhaywgdGtleS0+a2V5LCBoZHItPmFkZHIyLCBpdjMyKTsKKwkJCXRraXBfbWl4aW5nX3BoYXNlMSh0a2V5LT5yeF90dGFrLCB0a2V5LT5rZXksCisJCQkJCSAgIGhkci0+YWRkcjIsIGl2MzIpOwogCQkJdGtleS0+cnhfcGhhc2UxX2RvbmUgPSAxOwogCQl9CiAJCXRraXBfbWl4aW5nX3BoYXNlMihyYzRrZXksIHRrZXktPmtleSwgdGtleS0+cnhfdHRhaywgaXYxNik7CiAKIAkJcGxlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbiAtIDEyOwogCi0JCWNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KHRrZXktPnJ4X3RmbV9hcmM0LCByYzRrZXksIDE2KTsKIAkJc2dfaW5pdF9vbmUoJnNnLCBwb3MsIHBsZW4rNCk7CisKKwkJY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkodGtleS0+cnhfdGZtX2FyYzQsIHJjNGtleSwgMTYpOwogCQlpZiAoY3J5cHRvX2Jsa2NpcGhlcl9kZWNyeXB0KCZkZXNjLCAmc2csICZzZywgcGxlbiArIDQpKSB7CiAJCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7CiAJCQkJcHJpbnRrKEtFUk5fREVCVUcgIjogVEtJUDogZmFpbGVkIHRvIGRlY3J5cHQgIgotCQkJCQkJInJlY2VpdmVkIHBhY2tldCBmcm9tICVwTVxuIiwKLQkJCQkJCWhkci0+YWRkcjIpOworCQkJCSAgICAgICAicmVjZWl2ZWQgcGFja2V0IGZyb20gJXBNXG4iLAorCQkJCSAgICAgICBoZHItPmFkZHIyKTsKIAkJCX0KIAkJCXJldHVybiAtNzsKIAkJfQpAQCAtNDc0LDE0ICs0NjYsMTQgQEAKIAogCQlpZiAobWVtY21wKGljdiwgcG9zICsgcGxlbiwgNCkgIT0gMCkgewogCQkJaWYgKGl2MzIgIT0gdGtleS0+cnhfaXYzMikgewotCQkJCS8qIFByZXZpb3VzbHkgY2FjaGVkIFBoYXNlMSByZXN1bHQgd2FzIGFscmVhZHkgbG9zdCwgc28KLQkJCQkqIGl0IG5lZWRzIHRvIGJlIHJlY2FsY3VsYXRlZCBmb3IgdGhlIG5leHQgcGFja2V0LiAqLworCQkJCS8qIFByZXZpb3VzbHkgY2FjaGVkIFBoYXNlMSByZXN1bHQgd2FzIGFscmVhZHkKKwkJCQkgKiBsb3N0LCBzbyBpdCBuZWVkcyB0byBiZSByZWNhbGN1bGF0ZWQgZm9yIHRoZQorCQkJCSAqIG5leHQgcGFja2V0LiAqLwogCQkJCXRrZXktPnJ4X3BoYXNlMV9kb25lID0gMDsKIAkJCX0KIAkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKLQkJCQlwcmludGsoS0VSTl9ERUJVRwotCQkJCSAgICAgICAiVEtJUDogSUNWIGVycm9yIGRldGVjdGVkOiBTVEE9JXBNXG4iLAotCQkJCSAgICAgICBoZHItPmFkZHIyKTsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiVEtJUDogSUNWIGVycm9yIGRldGVjdGVkOiBTVEE9IgorCQkJCSIgJXBNXG4iLCBoZHItPmFkZHIyKTsKIAkJCX0KIAkJCXRrZXktPmRvdDExUlNOQVN0YXRzVEtJUElDVkVycm9ycysrOwogCQkJcmV0dXJuIC01OwpAQCAtNTAzLDQ2ICs0OTUsNDQgQEAKIH0KIAogCi1zdGF0aWMgaW50IG1pY2hhZWxfbWljKHN0cnVjdCBjcnlwdG9faGFzaCAqdGZtX21pY2hhZWwsIHU4ICoga2V5LCB1OCAqIGhkciwKLSAgICAgICAgICAgICAgICAgICAgICAgdTggKiBkYXRhLCBzaXplX3QgZGF0YV9sZW4sIHU4ICogbWljKQorc3RhdGljIGludCBtaWNoYWVsX21pYyhzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbV9taWNoYWVsLCB1OCAqa2V5LCB1OCAqaGRyLAorCQkgICAgICAgdTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggKm1pYykKIHsKLSAgICAgICAgc3RydWN0IGhhc2hfZGVzYyBkZXNjOwotICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbMl07CisJc3RydWN0IGhhc2hfZGVzYyBkZXNjOworCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1syXTsKIAotICAgICAgICBpZiAodGZtX21pY2hhZWwgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIm1pY2hhZWxfbWljOiB0Zm1fbWljaGFlbCA9PSBOVUxMXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgc2dfaW5pdF90YWJsZShzZywgMik7Ci0gICAgICAgIHNnX3NldF9idWYoJnNnWzBdLCBoZHIsIDE2KTsKLSAgICAgICAgc2dfc2V0X2J1Zigmc2dbMV0sIGRhdGEsIGRhdGFfbGVuKTsKKwlpZiAodGZtX21pY2hhZWwgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtaWNoYWVsX21pYzogdGZtX21pY2hhZWwgPT0gTlVMTFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJc2dfaW5pdF90YWJsZShzZywgMik7CisJc2dfc2V0X2J1Zigmc2dbMF0sIGhkciwgMTYpOworCXNnX3NldF9idWYoJnNnWzFdLCBkYXRhLCBkYXRhX2xlbik7CiAKLSAgICAgICAgaWYgKGNyeXB0b19oYXNoX3NldGtleSh0Zm1fbWljaGFlbCwga2V5LCA4KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisJaWYgKGNyeXB0b19oYXNoX3NldGtleSh0Zm1fbWljaGFlbCwga2V5LCA4KSkKKwkJcmV0dXJuIC0xOwogCi0gICAgICAgIGRlc2MudGZtID0gdGZtX21pY2hhZWw7Ci0gICAgICAgIGRlc2MuZmxhZ3MgPSAwOwotICAgICAgICByZXR1cm4gY3J5cHRvX2hhc2hfZGlnZXN0KCZkZXNjLCBzZywgZGF0YV9sZW4gKyAxNiwgbWljKTsKKwlkZXNjLnRmbSA9IHRmbV9taWNoYWVsOworCWRlc2MuZmxhZ3MgPSAwOworCXJldHVybiBjcnlwdG9faGFzaF9kaWdlc3QoJmRlc2MsIHNnLCBkYXRhX2xlbiArIDE2LCBtaWMpOwogfQogCi0KLQogc3RhdGljIHZvaWQgbWljaGFlbF9taWNfaGRyKHN0cnVjdCBza19idWZmICpza2IsIHU4ICpoZHIpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcjExOworCXN0cnVjdCBydGxsaWJfaGRyXzRhZGRyICpoZHIxMTsKIAotCWhkcjExID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKwloZHIxMSA9IChzdHJ1Y3QgcnRsbGliX2hkcl80YWRkciAqKSBza2ItPmRhdGE7CiAJc3dpdGNoIChsZTE2X3RvX2NwdShoZHIxMS0+ZnJhbWVfY3RsKSAmCi0JCShJRUVFODAyMTFfRkNUTF9GUk9NRFMgfCBJRUVFODAyMTFfRkNUTF9UT0RTKSkgewotCWNhc2UgSUVFRTgwMjExX0ZDVExfVE9EUzoKKwkJKFJUTExJQl9GQ1RMX0ZST01EUyB8IFJUTExJQl9GQ1RMX1RPRFMpKSB7CisJY2FzZSBSVExMSUJfRkNUTF9UT0RTOgogCQltZW1jcHkoaGRyLCBoZHIxMS0+YWRkcjMsIEVUSF9BTEVOKTsgLyogREEgKi8KIAkJbWVtY3B5KGhkciArIEVUSF9BTEVOLCBoZHIxMS0+YWRkcjIsIEVUSF9BTEVOKTsgLyogU0EgKi8KIAkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfRkNUTF9GUk9NRFM6CisJY2FzZSBSVExMSUJfRkNUTF9GUk9NRFM6CiAJCW1lbWNweShoZHIsIGhkcjExLT5hZGRyMSwgRVRIX0FMRU4pOyAvKiBEQSAqLwogCQltZW1jcHkoaGRyICsgRVRIX0FMRU4sIGhkcjExLT5hZGRyMywgRVRIX0FMRU4pOyAvKiBTQSAqLwogCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9GQ1RMX0ZST01EUyB8IElFRUU4MDIxMV9GQ1RMX1RPRFM6CisJY2FzZSBSVExMSUJfRkNUTF9GUk9NRFMgfCBSVExMSUJfRkNUTF9UT0RTOgogCQltZW1jcHkoaGRyLCBoZHIxMS0+YWRkcjMsIEVUSF9BTEVOKTsgLyogREEgKi8KIAkJbWVtY3B5KGhkciArIEVUSF9BTEVOLCBoZHIxMS0+YWRkcjQsIEVUSF9BTEVOKTsgLyogU0EgKi8KIAkJYnJlYWs7CkBAIC01NTgsMTMgKzU0OCwxMyBAQAogfQogCiAKLXN0YXRpYyBpbnQgaWVlZTgwMjExX21pY2hhZWxfbWljX2FkZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKK3N0YXRpYyBpbnQgcnRsbGliX21pY2hhZWxfbWljX2FkZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdikKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CisJc3RydWN0IHJ0bGxpYl90a2lwX2RhdGEgKnRrZXkgPSBwcml2OwogCXU4ICpwb3M7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcjsKKwlzdHJ1Y3QgcnRsbGliX2hkcl80YWRkciAqaGRyOwogCi0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKwloZHIgPSAoc3RydWN0IHJ0bGxpYl9oZHJfNGFkZHIgKikgc2tiLT5kYXRhOwogCiAJaWYgKHNrYl90YWlscm9vbShza2IpIDwgOCB8fCBza2ItPmxlbiA8IGhkcl9sZW4pIHsKIAkJcHJpbnRrKEtFUk5fREVCVUcgIkludmFsaWQgcGFja2V0IGZvciBNaWNoYWVsIE1JQyBhZGQgIgpAQCAtNTc1LDI0ICs1NjUsMTkgQEAKIAogCW1pY2hhZWxfbWljX2hkcihza2IsIHRrZXktPnR4X2hkcik7CiAKLQkvLyB7IGRhdmlkLCAyMDA2LjkuMQotCS8vIGZpeCB0aGUgd3BhIHByb2Nlc3Mgd2l0aCB3bW0gZW5hYmxlZC4KLQlpZihJRUVFODAyMTFfUU9TX0hBU19TRVEobGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKSkgeworCWlmIChSVExMSUJfUU9TX0hBU19TRVEobGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKSkKIAkJdGtleS0+dHhfaGRyWzEyXSA9ICooc2tiLT5kYXRhICsgaGRyX2xlbiAtIDIpICYgMHgwNzsKLQl9Ci0JLy8gfQogCXBvcyA9IHNrYl9wdXQoc2tiLCA4KTsKIAlpZiAobWljaGFlbF9taWModGtleS0+dHhfdGZtX21pY2hhZWwsICZ0a2V5LT5rZXlbMTZdLCB0a2V5LT50eF9oZHIsCi0JCQkJc2tiLT5kYXRhICsgaGRyX2xlbiwgc2tiLT5sZW4gLSA4IC0gaGRyX2xlbiwgcG9zKSkKKwkgICAgc2tiLT5kYXRhICsgaGRyX2xlbiwgc2tiLT5sZW4gLSA4IC0gaGRyX2xlbiwgcG9zKSkKIAkJcmV0dXJuIC0xOwogCiAJcmV0dXJuIDA7CiB9CiAKIAotI2lmIFdJUkVMRVNTX0VYVCA+PSAxOAotc3RhdGljIHZvaWQgaWVlZTgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkciwKK3N0YXRpYyB2b2lkIHJ0bGxpYl9taWNoYWVsX21pY19mYWlsdXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBydGxsaWJfaGRyXzRhZGRyICpoZHIsCiAJCQkJICAgICAgIGludCBrZXlpZHgpCiB7CiAJdW5pb24gaXdyZXFfZGF0YSB3cnF1OwpAQCAtNjExLDYzICs1OTYsNDUgQEAKIAl3cnF1LmRhdGEubGVuZ3RoID0gc2l6ZW9mKGV2KTsKIAl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgSVdFVk1JQ0hBRUxNSUNGQUlMVVJFLCAmd3JxdSwgKGNoYXIgKikgJmV2KTsKIH0KLSNlbGlmIFdJUkVMRVNTX0VYVCA+PSAxNQotc3RhdGljIHZvaWQgaWVlZTgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkciwKLQkJCQkgICAgICAgaW50IGtleWlkeCkKLXsKLQl1bmlvbiBpd3JlcV9kYXRhIHdycXU7Ci0JY2hhciBidWZbMTI4XTsKIAotCS8qIFRPRE86IG5lZWRlZCBwYXJhbWV0ZXJzOiBjb3VudCwga2V5aWQsIGtleSB0eXBlLCBUU0MgKi8KLQlzcHJpbnRmKGJ1ZiwgIk1MTUUtTUlDSEFFTE1JQ0ZBSUxVUkUuaW5kaWNhdGlvbihrZXlpZD0lZCAlc2Nhc3QgYWRkcj0iCi0JCSIlcE0pIiwga2V5aWR4LCBoZHItPmFkZHIxWzBdICYgMHgwMSA/ICJicm9hZCIgOiAidW5pIiwKLQkJaGRyLT5hZGRyMik7Ci0JbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOwotCXdycXUuZGF0YS5sZW5ndGggPSBzdHJsZW4oYnVmKTsKLQl3aXJlbGVzc19zZW5kX2V2ZW50KGRldiwgSVdFVkNVU1RPTSwgJndycXUsIGJ1Zik7Ci19Ci0jZWxzZSAvKiBXSVJFTEVTU19FWFQgPj0gMTUgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfbWljaGFlbF9taWNfZmFpbHVyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqaGRyLAotCQkJCQkgICAgICBpbnQga2V5aWR4KQorc3RhdGljIGludCBydGxsaWJfbWljaGFlbF9taWNfdmVyaWZ5KHN0cnVjdCBza19idWZmICpza2IsIGludCBrZXlpZHgsCisJCQkJICAgICBpbnQgaGRyX2xlbiwgdm9pZCAqcHJpdiwKKwkJCQkgICAgIHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQogewotfQotI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+PSAxNSAqLwotCi1zdGF0aWMgaW50IGllZWU4MDIxMV9taWNoYWVsX21pY192ZXJpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGtleWlkeCwKLQkJCQkgICAgIGludCBoZHJfbGVuLCB2b2lkICpwcml2KQotewotCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5ID0gcHJpdjsKKwlzdHJ1Y3QgcnRsbGliX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CiAJdTggbWljWzhdOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICpoZHI7CisJc3RydWN0IHJ0bGxpYl9oZHJfNGFkZHIgKmhkcjsKIAotCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKSBza2ItPmRhdGE7CisJaGRyID0gKHN0cnVjdCBydGxsaWJfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKIAogCWlmICghdGtleS0+a2V5X3NldCkKIAkJcmV0dXJuIC0xOwogCiAJbWljaGFlbF9taWNfaGRyKHNrYiwgdGtleS0+cnhfaGRyKTsKLQkvLyB7IGRhdmlkLCAyMDA2LjkuMQotCS8vIGZpeCB0aGUgd3BhIHByb2Nlc3Mgd2l0aCB3bW0gZW5hYmxlZC4KLQlpZihJRUVFODAyMTFfUU9TX0hBU19TRVEobGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKSkgeworCWlmIChSVExMSUJfUU9TX0hBU19TRVEobGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpKSkKIAkJdGtleS0+cnhfaGRyWzEyXSA9ICooc2tiLT5kYXRhICsgaGRyX2xlbiAtIDIpICYgMHgwNzsKLQl9Ci0JLy8gfQogCiAJaWYgKG1pY2hhZWxfbWljKHRrZXktPnJ4X3RmbV9taWNoYWVsLCAmdGtleS0+a2V5WzI0XSwgdGtleS0+cnhfaGRyLAotCQkJCXNrYi0+ZGF0YSArIGhkcl9sZW4sIHNrYi0+bGVuIC0gOCAtIGhkcl9sZW4sIG1pYykpCi0gICAgICAgICAgICAJcmV0dXJuIC0xOwotCWlmIChtZW1jbXAobWljLCBza2ItPmRhdGEgKyBza2ItPmxlbiAtIDgsIDgpICE9IDApIHsKLQkJc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgKmhkcjsKLQkJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKwkJCXNrYi0+ZGF0YSArIGhkcl9sZW4sIHNrYi0+bGVuIC0gOCAtIGhkcl9sZW4sIG1pYykpCisJCXJldHVybiAtMTsKKworCWlmICgobWVtY21wKG1pYywgc2tiLT5kYXRhICsgc2tiLT5sZW4gLSA4LCA4KSAhPSAwKSB8fAorCSAgIChpZWVlLT5mb3JjZV9taWNfZXJyb3IpKSB7CisJCXN0cnVjdCBydGxsaWJfaGRyXzRhZGRyICpoZHI7CisJCWhkciA9IChzdHJ1Y3QgcnRsbGliX2hkcl80YWRkciAqKSBza2ItPmRhdGE7CiAJCXByaW50ayhLRVJOX0RFQlVHICIlczogTWljaGFlbCBNSUMgdmVyaWZpY2F0aW9uIGZhaWxlZCBmb3IgIgogCQkgICAgICAgIk1TRFUgZnJvbSAlcE0ga2V5aWR4PSVkXG4iLAogCQkgICAgICAgc2tiLT5kZXYgPyBza2ItPmRldi0+bmFtZSA6ICJOL0EiLCBoZHItPmFkZHIyLAogCQkgICAgICAga2V5aWR4KTsKLQkJaWYgKHNrYi0+ZGV2KQotCQkJaWVlZTgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUoc2tiLT5kZXYsIGhkciwga2V5aWR4KTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIiVkLCBmb3JjZV9taWNfZXJyb3IgPSAlZFxuIiwKKwkJICAgICAgIChtZW1jbXAobWljLCBza2ItPmRhdGEgKyBza2ItPmxlbiAtIDgsIDgpICE9IDApLFwKKwkJCWllZWUtPmZvcmNlX21pY19lcnJvcik7CisJCWlmIChza2ItPmRldikgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAic2tiLT5kZXYgIT0gTlVMTFxuIik7CisJCQlydGxsaWJfbWljaGFlbF9taWNfZmFpbHVyZShza2ItPmRldiwgaGRyLCBrZXlpZHgpOworCQl9CiAJCXRrZXktPmRvdDExUlNOQVN0YXRzVEtJUExvY2FsTUlDRmFpbHVyZXMrKzsKKwkJaWVlZS0+Zm9yY2VfbWljX2Vycm9yID0gZmFsc2U7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTY4Miw5ICs2NDksOSBAQAogfQogCiAKLXN0YXRpYyBpbnQgaWVlZTgwMjExX3RraXBfc2V0X2tleSh2b2lkICprZXksIGludCBsZW4sIHU4ICpzZXEsIHZvaWQgKnByaXYpCitzdGF0aWMgaW50IHJ0bGxpYl90a2lwX3NldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQogewotCXN0cnVjdCBpZWVlODAyMTFfdGtpcF9kYXRhICp0a2V5ID0gcHJpdjsKKwlzdHJ1Y3QgcnRsbGliX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CiAJaW50IGtleWlkeDsKIAlzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbSA9IHRrZXktPnR4X3RmbV9taWNoYWVsOwogCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0yID0gdGtleS0+dHhfdGZtX2FyYzQ7CkBAIC03MTcsOSArNjg0LDkgQEAKIH0KIAogCi1zdGF0aWMgaW50IGllZWU4MDIxMV90a2lwX2dldF9rZXkodm9pZCAqa2V5LCBpbnQgbGVuLCB1OCAqc2VxLCB2b2lkICpwcml2KQorc3RhdGljIGludCBydGxsaWJfdGtpcF9nZXRfa2V5KHZvaWQgKmtleSwgaW50IGxlbiwgdTggKnNlcSwgdm9pZCAqcHJpdikKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3RraXBfZGF0YSAqdGtleSA9IHByaXY7CisJc3RydWN0IHJ0bGxpYl90a2lwX2RhdGEgKnRrZXkgPSBwcml2OwogCiAJaWYgKGxlbiA8IFRLSVBfS0VZX0xFTikKIAkJcmV0dXJuIC0xOwpAQCAtNzQ3LDkgKzcxNCw5IEBACiB9CiAKIAotc3RhdGljIGNoYXIgKiBpZWVlODAyMTFfdGtpcF9wcmludF9zdGF0cyhjaGFyICpwLCB2b2lkICpwcml2KQorc3RhdGljIGNoYXIgKnJ0bGxpYl90a2lwX3ByaW50X3N0YXRzKGNoYXIgKnAsIHZvaWQgKnByaXYpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV90a2lwX2RhdGEgKnRraXAgPSBwcml2OworCXN0cnVjdCBydGxsaWJfdGtpcF9kYXRhICp0a2lwID0gcHJpdjsKIAlwICs9IHNwcmludGYocCwgImtleVslZF0gYWxnPVRLSVAga2V5X3NldD0lZCAiCiAJCSAgICAgInR4X3BuPSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCiAJCSAgICAgInJ4X3BuPSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCkBAIC03NzQsMzYgKzc0MSwzNSBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgaWVlZTgwMjExX2NyeXB0X3RraXAgPSB7CitzdGF0aWMgc3RydWN0IHJ0bGxpYl9jcnlwdG9fb3BzIHJ0bGxpYl9jcnlwdF90a2lwID0gewogCS5uYW1lCQkJPSAiVEtJUCIsCi0JLmluaXQJCQk9IGllZWU4MDIxMV90a2lwX2luaXQsCi0JLmRlaW5pdAkJCT0gaWVlZTgwMjExX3RraXBfZGVpbml0LAotCS5lbmNyeXB0X21wZHUJCT0gaWVlZTgwMjExX3RraXBfZW5jcnlwdCwKLQkuZGVjcnlwdF9tcGR1CQk9IGllZWU4MDIxMV90a2lwX2RlY3J5cHQsCi0JLmVuY3J5cHRfbXNkdQkJPSBpZWVlODAyMTFfbWljaGFlbF9taWNfYWRkLAotCS5kZWNyeXB0X21zZHUJCT0gaWVlZTgwMjExX21pY2hhZWxfbWljX3ZlcmlmeSwKLQkuc2V0X2tleQkJPSBpZWVlODAyMTFfdGtpcF9zZXRfa2V5LAotCS5nZXRfa2V5CQk9IGllZWU4MDIxMV90a2lwX2dldF9rZXksCi0JLnByaW50X3N0YXRzCQk9IGllZWU4MDIxMV90a2lwX3ByaW50X3N0YXRzLAorCS5pbml0CQkJPSBydGxsaWJfdGtpcF9pbml0LAorCS5kZWluaXQJCQk9IHJ0bGxpYl90a2lwX2RlaW5pdCwKKwkuZW5jcnlwdF9tcGR1CQk9IHJ0bGxpYl90a2lwX2VuY3J5cHQsCisJLmRlY3J5cHRfbXBkdQkJPSBydGxsaWJfdGtpcF9kZWNyeXB0LAorCS5lbmNyeXB0X21zZHUJCT0gcnRsbGliX21pY2hhZWxfbWljX2FkZCwKKwkuZGVjcnlwdF9tc2R1CQk9IHJ0bGxpYl9taWNoYWVsX21pY192ZXJpZnksCisJLnNldF9rZXkJCT0gcnRsbGliX3RraXBfc2V0X2tleSwKKwkuZ2V0X2tleQkJPSBydGxsaWJfdGtpcF9nZXRfa2V5LAorCS5wcmludF9zdGF0cwkJPSBydGxsaWJfdGtpcF9wcmludF9zdGF0cywKIAkuZXh0cmFfcHJlZml4X2xlbgk9IDQgKyA0LCAvKiBJViArIEV4dElWICovCiAJLmV4dHJhX3Bvc3RmaXhfbGVuCT0gOCArIDQsIC8qIE1JQyArIElDViAqLwotCS5vd25lcgkJICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiB9OwogCiAKLWludCBfX2luaXQgaWVlZTgwMjExX2NyeXB0b190a2lwX2luaXQodm9pZCkKK2ludCBfX2luaXQgcnRsbGliX2NyeXB0b190a2lwX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gaWVlZTgwMjExX3JlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF90a2lwKTsKKwlyZXR1cm4gcnRsbGliX3JlZ2lzdGVyX2NyeXB0b19vcHMoJnJ0bGxpYl9jcnlwdF90a2lwKTsKIH0KIAogCi12b2lkIGllZWU4MDIxMV9jcnlwdG9fdGtpcF9leGl0KHZvaWQpCit2b2lkIF9fZXhpdCBydGxsaWJfY3J5cHRvX3RraXBfZXhpdCh2b2lkKQogewotCWllZWU4MDIxMV91bnJlZ2lzdGVyX2NyeXB0b19vcHMoJmllZWU4MDIxMV9jcnlwdF90a2lwKTsKKwlydGxsaWJfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKCZydGxsaWJfY3J5cHRfdGtpcCk7CiB9CiAKLXZvaWQgaWVlZTgwMjExX3RraXBfbnVsbCh2b2lkKQordm9pZCBydGxsaWJfdGtpcF9udWxsKHZvaWQpCiB7Ci0gICAgICAgIHJldHVybjsKKwlyZXR1cm47CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9jcnlwdF93ZXAuYwpzaW1pbGFyaXR5IGluZGV4IDcxJQpyZW5hbWUgZnJvbSBkcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYwpyZW5hbWUgdG8gZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9jcnlwdF93ZXAuYwppbmRleCA1NTA0MzkxLi5jNTliZjEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2NyeXB0X3dlcC5jCkBAIC05LDYyICs5LDU1IEBACiAgKiBtb3JlIGRldGFpbHMuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KLQotI2luY2x1ZGUgImllZWU4MDIxMS5oIgotCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSAicnRsbGliLmgiCiAKICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KIAogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KIAotTU9EVUxFX0FVVEhPUigiSm91bmkgTWFsaW5lbiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJIb3N0IEFQIGNyeXB0OiBXRVAiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLSNpZm5kZWYgT1BFTlNVU0VfU0xFRAotI2RlZmluZSBPUEVOU1VTRV9TTEVEIDAKLSNlbmRpZgotCiBzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhIHsKIAl1MzIgaXY7CiAjZGVmaW5lIFdFUF9LRVlfTEVOIDEzCiAJdTgga2V5W1dFUF9LRVlfTEVOICsgMV07CiAJdTgga2V5X2xlbjsKIAl1OCBrZXlfaWR4OwotICAgICAgICBzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdHhfdGZtOwotICAgICAgICBzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqcnhfdGZtOworCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0eF90Zm07CisJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnJ4X3RmbTsKIH07CiAKIAotc3RhdGljIHZvaWQgKiBwcmlzbTJfd2VwX2luaXQoaW50IGtleWlkeCkKK3N0YXRpYyB2b2lkICpwcmlzbTJfd2VwX2luaXQoaW50IGtleWlkeCkKIHsKIAlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICpwcml2OwogCi0JcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0FUT01JQyk7CisJcHJpdiA9IGttYWxsb2Moc2l6ZW9mKCpwcml2KSwgR0ZQX0FUT01JQyk7CiAJaWYgKHByaXYgPT0gTlVMTCkKIAkJZ290byBmYWlsOworCW1lbXNldChwcml2LCAwLCBzaXplb2YoKnByaXYpKTsKIAlwcml2LT5rZXlfaWR4ID0ga2V5aWR4OwogCiAJcHJpdi0+dHhfdGZtID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiZWNiKGFyYzQpIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7Ci0gICAgICAgIGlmIChJU19FUlIocHJpdi0+dHhfdGZtKSkgewotICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfd2VwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgotICAgICAgICAgICAgICAgICAgICAgICAiY3J5cHRvIEFQSSBhcmM0XG4iKTsKLSAgICAgICAgICAgICAgICBwcml2LT50eF90Zm0gPSBOVUxMOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotICAgICAgICBwcml2LT5yeF90Zm0gPSBjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKCJlY2IoYXJjNCkiLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKLSAgICAgICAgaWYgKElTX0VSUihwcml2LT5yeF90Zm0pKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF93ZXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICJjcnlwdG8gQVBJIGFyYzRcbiIpOwotICAgICAgICAgICAgICAgIHByaXYtPnJ4X3RmbSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9CisJaWYgKElTX0VSUihwcml2LT50eF90Zm0pKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJydGxsaWJfY3J5cHRfd2VwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgYXJjNFxuIik7CisJCXByaXYtPnR4X3RmbSA9IE5VTEw7CisJCWdvdG8gZmFpbDsKKwl9CisJcHJpdi0+cnhfdGZtID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiZWNiKGFyYzQpIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CisJaWYgKElTX0VSUihwcml2LT5yeF90Zm0pKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJydGxsaWJfY3J5cHRfd2VwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQkgICAgICAgImNyeXB0byBBUEkgYXJjNFxuIik7CisJCXByaXYtPnJ4X3RmbSA9IE5VTEw7CisJCWdvdG8gZmFpbDsKKwl9CiAKIAkvKiBzdGFydCBXRVAgSVYgZnJvbSBhIHJhbmRvbSB2YWx1ZSAqLwogCWdldF9yYW5kb21fYnl0ZXMoJnByaXYtPml2LCA0KTsKQEAgLTczLDEyICs2NiwxMiBAQAogCiBmYWlsOgogCWlmIChwcml2KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByaXYtPnR4X3RmbSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNyeXB0b19mcmVlX2Jsa2NpcGhlcihwcml2LT50eF90Zm0pOwotICAgICAgICAgICAgICAgIGlmIChwcml2LT5yeF90Zm0pCi0gICAgICAgICAgICAgICAgICAgICAgICBjcnlwdG9fZnJlZV9ibGtjaXBoZXIocHJpdi0+cnhfdGZtKTsKLSAgICAgICAgICAgICAgICBrZnJlZShwcml2KTsKLSAgICAgICAgfQorCQlpZiAocHJpdi0+dHhfdGZtKQorCQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHByaXYtPnR4X3RmbSk7CisJCWlmIChwcml2LT5yeF90Zm0pCisJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIocHJpdi0+cnhfdGZtKTsKKwkJa2ZyZWUocHJpdik7CisJfQogCXJldHVybiBOVUxMOwogfQogCkBAIC04NiwxMiArNzksMTMgQEAKIHN0YXRpYyB2b2lkIHByaXNtMl93ZXBfZGVpbml0KHZvaWQgKnByaXYpCiB7CiAJc3RydWN0IHByaXNtMl93ZXBfZGF0YSAqX3ByaXYgPSBwcml2OworCiAJaWYgKF9wcml2KSB7Ci0gICAgICAgICAgICAgICAgaWYgKF9wcml2LT50eF90Zm0pCi0gICAgICAgICAgICAgICAgICAgICAgICBjcnlwdG9fZnJlZV9ibGtjaXBoZXIoX3ByaXYtPnR4X3RmbSk7Ci0gICAgICAgICAgICAgICAgaWYgKF9wcml2LT5yeF90Zm0pCi0gICAgICAgICAgICAgICAgICAgICAgICBjcnlwdG9fZnJlZV9ibGtjaXBoZXIoX3ByaXYtPnJ4X3RmbSk7Ci0gICAgICAgIH0KKwkJaWYgKF9wcml2LT50eF90Zm0pCisJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIoX3ByaXYtPnR4X3RmbSk7CisJCWlmIChfcHJpdi0+cnhfdGZtKQorCQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKF9wcml2LT5yeF90Zm0pOworCX0KIAlrZnJlZShwcml2KTsKIH0KIApAQCAtMTA3LDE1ICsxMDEsMTkgQEAKIAl1MzIga2xlbiwgbGVuOwogCXU4IGtleVtXRVBfS0VZX0xFTiArIDNdOwogCXU4ICpwb3M7Ci0JY2JfZGVzYyAqdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCXN0cnVjdCBjYl9kZXNjICp0Y2JfZGVzYyA9IChzdHJ1Y3QgY2JfZGVzYyAqKShza2ItPmNiICsKKwkJCQkgICAgTUFYX0RFVl9BRERSX1NJWkUpOwogCXN0cnVjdCBibGtjaXBoZXJfZGVzYyBkZXNjID0gey50Zm0gPSB3ZXAtPnR4X3RmbX07CiAJdTMyIGNyYzsKIAl1OCAqaWN2OwogCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKIAlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCA0IHx8IHNrYl90YWlscm9vbShza2IpIDwgNCB8fAotCSAgICBza2ItPmxlbiA8IGhkcl9sZW4pCisJICAgIHNrYi0+bGVuIDwgaGRyX2xlbil7CisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IhISEgaGVhZHJvb209JWQgdGFpbHJvb209JWQgc2tibGVuPSVkIgorCQkgICAgICAgIiBoZHJfbGVuPSVkXG4iLCBza2JfaGVhZHJvb20oc2tiKSwgc2tiX3RhaWxyb29tKHNrYiksCisJCSAgICAgICBza2ItPmxlbiwgaGRyX2xlbik7CiAJCXJldHVybiAtMTsKLQorCX0KIAlsZW4gPSBza2ItPmxlbiAtIGhkcl9sZW47CiAJcG9zID0gc2tiX3B1c2goc2tiLCA0KTsKIAltZW1tb3ZlKHBvcywgcG9zICsgNCwgaGRyX2xlbik7CkBAIC0xNDMsOCArMTQxLDcgQEAKIAkvKiBDb3B5IHJlc3Qgb2YgdGhlIFdFUCBrZXkgKHRoZSBzZWNyZXQgcGFydCkgKi8KIAltZW1jcHkoa2V5ICsgMywgd2VwLT5rZXksIHdlcC0+a2V5X2xlbik7CiAKLQlpZiAoIXRjYl9kZXNjLT5iSHdTZWMpCi0JeworCWlmICghdGNiX2Rlc2MtPmJId1NlYykgewogCiAJCS8qIEFwcGVuZCBsaXR0bGUtZW5kaWFuIENSQzMyIGFuZCBlbmNyeXB0IGl0IHRvIHByb2R1Y2UgSUNWICovCiAJCWNyYyA9IH5jcmMzMl9sZSh+MCwgcG9zLCBsZW4pOwpAQCAtMTU0LDggKzE1MSw4IEBACiAJCWljdlsyXSA9IGNyYyA+PiAxNjsKIAkJaWN2WzNdID0gY3JjID4+IDI0OwogCi0JCWNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KHdlcC0+dHhfdGZtLCBrZXksIGtsZW4pOwogCQlzZ19pbml0X29uZSgmc2csIHBvcywgbGVuKzQpOworCQljcnlwdG9fYmxrY2lwaGVyX3NldGtleSh3ZXAtPnR4X3RmbSwga2V5LCBrbGVuKTsKIAkJcmV0dXJuIGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdCgmZGVzYywgJnNnLCAmc2csIGxlbiArIDQpOwogCX0KIApAQCAtMTYzLDggKzE2MCw4IEBACiB9CiAKIAotLyogUGVyZm9ybSBXRVAgZGVjcnlwdGlvbiBvbiBnaXZlbiBidWZmZXIuIEJ1ZmZlciBpbmNsdWRlcyB3aG9sZSBXRVAgcGFydCBvZgotICogdGhlIGZyYW1lOiBJViAoNCBieXRlcyksIGVuY3J5cHRlZCBwYXlsb2FkIChpbmNsdWRpbmcgU05BUCBoZWFkZXIpLAorLyogUGVyZm9ybSBXRVAgZGVjcnlwdGlvbiBvbiBnaXZlbiBzdHJ1Y3QgYnVmZmVyLiBCdWZmZXIgaW5jbHVkZXMgd2hvbGUgV0VQCisgKiBwYXJ0IG9mIHRoZSBmcmFtZTogSVYgKDQgYnl0ZXMpLCBlbmNyeXB0ZWQgcGF5bG9hZCAoaW5jbHVkaW5nIFNOQVAgaGVhZGVyKSwKICAqIElDViAoNCBieXRlcykuIGxlbiBpbmNsdWRlcyBib3RoIElWIGFuZCBJQ1YuCiAgKgogICogUmV0dXJucyAwIGlmIGZyYW1lIHdhcyBkZWNyeXB0ZWQgc3VjY2Vzc2Z1bGx5IGFuZCBJQ1Ygd2FzIGNvcnJlY3QgYW5kIC0xIG9uCkBAIC0xNzYsNyArMTczLDggQEAKIAl1MzIgIGtsZW4sIHBsZW47CiAJdTgga2V5W1dFUF9LRVlfTEVOICsgM107CiAJdTgga2V5aWR4LCAqcG9zOwotCWNiX2Rlc2MgKnRjYl9kZXNjID0gKGNiX2Rlc2MgKikoc2tiLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKKwlzdHJ1Y3QgY2JfZGVzYyAqdGNiX2Rlc2MgPSAoc3RydWN0IGNiX2Rlc2MgKikoc2tiLT5jYiArCisJCQkJICAgIE1BWF9ERVZfQUREUl9TSVpFKTsKIAlzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZGVzYyA9IHsudGZtID0gd2VwLT5yeF90Zm19OwogCXUzMiBjcmM7CiAJdTggaWN2WzRdOwpAQCAtMjAwLDEwICsxOTgsOSBAQAogCS8qIEFwcGx5IFJDNCB0byBkYXRhIGFuZCBjb21wdXRlIENSQzMyIG92ZXIgZGVjcnlwdGVkIGRhdGEgKi8KIAlwbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuIC0gODsKIAotCWlmICghdGNiX2Rlc2MtPmJId1NlYykKLQl7Ci0JCWNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KHdlcC0+cnhfdGZtLCBrZXksIGtsZW4pOworCWlmICghdGNiX2Rlc2MtPmJId1NlYykgewogCQlzZ19pbml0X29uZSgmc2csIHBvcywgcGxlbis0KTsKKwkJY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkod2VwLT5yeF90Zm0sIGtleSwga2xlbik7CiAJCWlmIChjcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHQoJmRlc2MsICZzZywgJnNnLCBwbGVuICsgNCkpCiAJCQlyZXR1cm4gLTc7CiAJCWNyYyA9IH5jcmMzMl9sZSh+MCwgcG9zLCBwbGVuKTsKQEAgLTI1Miw3ICsyNDksNyBAQAogfQogCiAKLXN0YXRpYyBjaGFyICogcHJpc20yX3dlcF9wcmludF9zdGF0cyhjaGFyICpwLCB2b2lkICpwcml2KQorc3RhdGljIGNoYXIgKnByaXNtMl93ZXBfcHJpbnRfc3RhdHMoY2hhciAqcCwgdm9pZCAqcHJpdikKIHsKIAlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICp3ZXAgPSBwcml2OwogCXAgKz0gc3ByaW50ZihwLCAia2V5WyVkXSBhbGc9V0VQIGxlbj0lZFxuIiwKQEAgLTI2MSw3ICsyNTgsNyBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19vcHMgaWVlZTgwMjExX2NyeXB0X3dlcCA9IHsKK3N0YXRpYyBzdHJ1Y3QgcnRsbGliX2NyeXB0b19vcHMgcnRsbGliX2NyeXB0X3dlcCA9IHsKIAkubmFtZQkJCT0gIldFUCIsCiAJLmluaXQJCQk9IHByaXNtMl93ZXBfaW5pdCwKIAkuZGVpbml0CQkJPSBwcmlzbTJfd2VwX2RlaW5pdCwKQEAgLTI3OCwxOSArMjc1LDE4IEBACiB9OwogCiAKLWludCBfX2luaXQgaWVlZTgwMjExX2NyeXB0b193ZXBfaW5pdCh2b2lkKQoraW50IF9faW5pdCBydGxsaWJfY3J5cHRvX3dlcF9pbml0KHZvaWQpCiB7Ci0JcmV0dXJuIGllZWU4MDIxMV9yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfd2VwKTsKKwlyZXR1cm4gcnRsbGliX3JlZ2lzdGVyX2NyeXB0b19vcHMoJnJ0bGxpYl9jcnlwdF93ZXApOwogfQogCiAKLXZvaWQgX19leGl0IGllZWU4MDIxMV9jcnlwdG9fd2VwX2V4aXQodm9pZCkKK3ZvaWQgX19leGl0IHJ0bGxpYl9jcnlwdG9fd2VwX2V4aXQodm9pZCkKIHsKLQlpZWVlODAyMTFfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKCZpZWVlODAyMTFfY3J5cHRfd2VwKTsKKwlydGxsaWJfdW5yZWdpc3Rlcl9jcnlwdG9fb3BzKCZydGxsaWJfY3J5cHRfd2VwKTsKIH0KIAotdm9pZCBpZWVlODAyMTFfd2VwX251bGwodm9pZCkKK3ZvaWQgcnRsbGliX3dlcF9udWxsKHZvaWQpCiB7Ci0gICAgICAgIHJldHVybjsKKwlyZXR1cm47CiB9Ci0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfZW5kaWFuZnJlZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9lbmRpYW5mcmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2ODYwNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfZW5kaWFuZnJlZS5oCkBAIC0wLDAgKzEsMTYwIEBACisjaWZuZGVmIF9fSU5DX0VORElBTkZSRUVfSAorI2RlZmluZSBfX0lOQ19FTkRJQU5GUkVFX0gKKworLyoKKyAqCUNhbGwgZW5kaWFuIGZyZWUgZnVuY3Rpb24gd2hlbgorICoJCTEuIFJlYWQvd3JpdGUgcGFja2V0IGNvbnRlbnQuCisgKgkJMi4gQmVmb3JlIHdyaXRlIGludGVnZXIgdG8gSU8uCisgKgkJMy4gQWZ0ZXIgcmVhZCBpbnRlZ2VyIGZyb20gSU8uCisgKi8KKworI2RlZmluZSBfX01BQ0hJTkVfTElUVExFX0VORElBTiAxMjM0ICAgIC8qIExTQiBmaXJzdDogaTM4NiwgdmF4ICovCisjZGVmaW5lIF9fTUFDSElORV9CSUdfRU5ESUFOICAgIDQzMjEgICAgLyogTVNCIGZpcnN0OiA2ODAwMCwgaWJtLCBuZXQsIHBwYyAqLworCisjZGVmaW5lIEJZVEVfT1JERVIgX19NQUNISU5FX0xJVFRMRV9FTkRJQU4KKworI2lmIEJZVEVfT1JERVIgPT0gX19NQUNISU5FX0xJVFRMRV9FTkRJQU4KKyNkZWZpbmUgRUYxQnl0ZShfdmFsKQkJCSgodTgpKF92YWwpKQorI2RlZmluZSBFRjJCeXRlKF92YWwpCQkJKCh1MTYpKF92YWwpKQorI2RlZmluZSBFRjRCeXRlKF92YWwpCQkJKCh1MzIpKF92YWwpKQorCisjZWxzZQorI2RlZmluZSBFRjFCeXRlKF92YWwpCQkJKCh1OCkoX3ZhbCkpCisjZGVmaW5lIEVGMkJ5dGUoX3ZhbCkJCQlcCisJKCgoKCh1MTYpKF92YWwpKSYweDAwZmYpPDw4KXwoKCgodTE2KShfdmFsKSkmMHhmZjAwKT4+OCkpCisjZGVmaW5lIEVGNEJ5dGUoX3ZhbCkJCQlcCisJKCgoKCh1MzIpKF92YWwpKSYweDAwMDAwMGZmKTw8MjQpfFwKKwkoKCgodTMyKShfdmFsKSkmMHgwMDAwZmYwMCk8PDgpfFwKKwkoKCgodTMyKShfdmFsKSkmMHgwMGZmMDAwMCk+PjgpfFwKKwkoKCgodTMyKShfdmFsKSkmMHhmZjAwMDAwMCk+PjI0KSkKKyNlbmRpZgorCisjZGVmaW5lIFJlYWRFRjFCeXRlKF9wdHIpCQlFRjFCeXRlKCooKHU4ICopKF9wdHIpKSkKKyNkZWZpbmUgUmVhZEVGMkJ5dGUoX3B0cikJCUVGMkJ5dGUoKigodTE2ICopKF9wdHIpKSkKKyNkZWZpbmUgUmVhZEVGNEJ5dGUoX3B0cikJCUVGNEJ5dGUoKigodTMyICopKF9wdHIpKSkKKworI2RlZmluZSBXcml0ZUVGMUJ5dGUoX3B0ciwgX3ZhbCkJKCooKHU4ICopKF9wdHIpKSkgPSBFRjFCeXRlKF92YWwpCisjZGVmaW5lIFdyaXRlRUYyQnl0ZShfcHRyLCBfdmFsKQkoKigodTE2ICopKF9wdHIpKSkgPSBFRjJCeXRlKF92YWwpCisjZGVmaW5lIFdyaXRlRUY0Qnl0ZShfcHRyLCBfdmFsKQkoKigodTMyICopKF9wdHIpKSkgPSBFRjRCeXRlKF92YWwpCisjaWYgQllURV9PUkRFUiA9PSBfX01BQ0hJTkVfTElUVExFX0VORElBTgorI2RlZmluZSBIMk4xQllURShfdmFsKQkoKHU4KShfdmFsKSkKKyNkZWZpbmUgSDJOMkJZVEUoX3ZhbCkJKCgoKCh1MTYpKF92YWwpKSYweDAwZmYpPDw4KXxcCisJCQkoKCgodTE2KShfdmFsKSkmMHhmZjAwKT4+OCkpCisjZGVmaW5lIEgyTjRCWVRFKF92YWwpCSgoKCgodTMyKShfdmFsKSkmMHgwMDAwMDBmZik8PDI0KXxcCisJCQkoKCgodTMyKShfdmFsKSkmMHgwMDAwZmYwMCk8PDgpCXxcCisJCQkoKCgodTMyKShfdmFsKSkmMHgwMGZmMDAwMCk+PjgpCXxcCisJCQkoKCgodTMyKShfdmFsKSkmMHhmZjAwMDAwMCk+PjI0KSkKKyNlbHNlCisjZGVmaW5lIEgyTjFCWVRFKF92YWwpCQkJKCh1OCkoX3ZhbCkpCisjZGVmaW5lIEgyTjJCWVRFKF92YWwpCQkJKCh1MTYpKF92YWwpKQorI2RlZmluZSBIMk40QllURShfdmFsKQkJCSgodTMyKShfdmFsKSkKKyNlbmRpZgorCisjaWYgQllURV9PUkRFUiA9PSBfX01BQ0hJTkVfTElUVExFX0VORElBTgorI2RlZmluZSBOMkgxQllURShfdmFsKQkoKHU4KShfdmFsKSkKKyNkZWZpbmUgTjJIMkJZVEUoX3ZhbCkJKCgoKCh1MTYpKF92YWwpKSYweDAwZmYpPDw4KXxcCisJCQkoKCgodTE2KShfdmFsKSkmMHhmZjAwKT4+OCkpCisjZGVmaW5lIE4ySDRCWVRFKF92YWwpCSgoKCgodTMyKShfdmFsKSkmMHgwMDAwMDBmZik8PDI0KXxcCisJCQkoKCgodTMyKShfdmFsKSkmMHgwMDAwZmYwMCk8PDgpCXxcCisJCQkoKCgodTMyKShfdmFsKSkmMHgwMGZmMDAwMCk+PjgpCXxcCisJCQkoKCgodTMyKShfdmFsKSkmMHhmZjAwMDAwMCk+PjI0KSkKKyNlbHNlCisjZGVmaW5lIE4ySDFCWVRFKF92YWwpCQkJKCh1OCkoX3ZhbCkpCisjZGVmaW5lIE4ySDJCWVRFKF92YWwpCQkJKCh1MTYpKF92YWwpKQorI2RlZmluZSBOMkg0QllURShfdmFsKQkJCSgodTMyKShfdmFsKSkKKyNlbmRpZgorCisjZGVmaW5lIEJJVF9MRU5fTUFTS18zMihfX0JpdExlbikgKDB4RkZGRkZGRkYgPj4gKDMyIC0gKF9fQml0TGVuKSkpCisjZGVmaW5lIEJJVF9PRkZTRVRfTEVOX01BU0tfMzIoX19CaXRPZmZzZXQsIF9fQml0TGVuKQkJCVwKKwkoQklUX0xFTl9NQVNLXzMyKF9fQml0TGVuKSA8PCAoX19CaXRPZmZzZXQpKQorCisjZGVmaW5lIExFX1A0QllURV9UT19IT1NUXzRCWVRFKF9fcFN0YXJ0KSAoRUY0Qnl0ZSgqKCh1MzIgKikoX19wU3RhcnQpKSkpCisKKyNkZWZpbmUgTEVfQklUU19UT180QllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCisJKCBcCisJICAoTEVfUDRCWVRFX1RPX0hPU1RfNEJZVEUoX19wU3RhcnQpID4+IChfX0JpdE9mZnNldCkpIFwKKwkgICYgXAorCSAgQklUX0xFTl9NQVNLXzMyKF9fQml0TGVuKSBcCisJKQorCisjZGVmaW5lIExFX0JJVFNfQ0xFQVJFRF9UT180QllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCisJKCBcCisJICBMRV9QNEJZVEVfVE9fSE9TVF80QllURShfX3BTdGFydCkgXAorCSAgJiBcCisJICAofkJJVF9PRkZTRVRfTEVOX01BU0tfMzIoX19CaXRPZmZzZXQsIF9fQml0TGVuKSkgXAorCSkKKworI2RlZmluZSBTRVRfQklUU19UT19MRV80QllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuLCBfX1ZhbHVlKSBcCisJKigodTMyICopKF9fcFN0YXJ0KSkgPSBcCisJRUY0Qnl0ZSggXAorCUxFX0JJVFNfQ0xFQVJFRF9UT180QllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCisJfCBcCisJKCgoKHUzMilfX1ZhbHVlKSAmIEJJVF9MRU5fTUFTS18zMihfX0JpdExlbikpIDw8IChfX0JpdE9mZnNldCkpIFwKKwkpOworCisKKyNkZWZpbmUgQklUX0xFTl9NQVNLXzE2KF9fQml0TGVuKSBcCisJKDB4RkZGRiA+PiAoMTYgLSAoX19CaXRMZW4pKSkKKworI2RlZmluZSBCSVRfT0ZGU0VUX0xFTl9NQVNLXzE2KF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAorCShCSVRfTEVOX01BU0tfMTYoX19CaXRMZW4pIDw8IChfX0JpdE9mZnNldCkpCisKKyNkZWZpbmUgTEVfUDJCWVRFX1RPX0hPU1RfMkJZVEUoX19wU3RhcnQpIFwKKwkoRUYyQnl0ZSgqKCh1MTYgKikoX19wU3RhcnQpKSkpCisKKyNkZWZpbmUgTEVfQklUU19UT18yQllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCisJKCBcCisJICAoTEVfUDJCWVRFX1RPX0hPU1RfMkJZVEUoX19wU3RhcnQpID4+IChfX0JpdE9mZnNldCkpIFwKKwkgICYgXAorCSAgQklUX0xFTl9NQVNLXzE2KF9fQml0TGVuKSBcCisJKQorCisjZGVmaW5lIExFX0JJVFNfQ0xFQVJFRF9UT18yQllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCisJKCBcCisJICBMRV9QMkJZVEVfVE9fSE9TVF8yQllURShfX3BTdGFydCkgXAorCSAgJiBcCisJICAofkJJVF9PRkZTRVRfTEVOX01BU0tfMTYoX19CaXRPZmZzZXQsIF9fQml0TGVuKSkgXAorCSkKKworI2RlZmluZSBTRVRfQklUU19UT19MRV8yQllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuLCBfX1ZhbHVlKSBcCisJKigodTE2ICopKF9fcFN0YXJ0KSkgPSBcCisJRUYyQnl0ZSggXAorCQlMRV9CSVRTX0NMRUFSRURfVE9fMkJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAorCQl8ICgoKCh1MTYpX19WYWx1ZSkgJiBCSVRfTEVOX01BU0tfMTYoX19CaXRMZW4pKSA8PAlcCisJCShfX0JpdE9mZnNldCkpIFwKKwkpOworCisjZGVmaW5lIEJJVF9MRU5fTUFTS184KF9fQml0TGVuKSBcCisJKDB4RkYgPj4gKDggLSAoX19CaXRMZW4pKSkKKworI2RlZmluZSBCSVRfT0ZGU0VUX0xFTl9NQVNLXzgoX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCisJKEJJVF9MRU5fTUFTS184KF9fQml0TGVuKSA8PCAoX19CaXRPZmZzZXQpKQorCisjZGVmaW5lIExFX1AxQllURV9UT19IT1NUXzFCWVRFKF9fcFN0YXJ0KSBcCisJKEVGMUJ5dGUoKigodTggKikoX19wU3RhcnQpKSkpCisKKyNkZWZpbmUgTEVfQklUU19UT18xQllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCisJKCBcCisJICAoTEVfUDFCWVRFX1RPX0hPU1RfMUJZVEUoX19wU3RhcnQpID4+IChfX0JpdE9mZnNldCkpIFwKKwkgICYgXAorCSAgQklUX0xFTl9NQVNLXzgoX19CaXRMZW4pIFwKKwkpCisKKyNkZWZpbmUgTEVfQklUU19DTEVBUkVEX1RPXzFCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKKwkoIFwKKwkgIExFX1AxQllURV9UT19IT1NUXzFCWVRFKF9fcFN0YXJ0KSBcCisJICAmIFwKKwkgICh+QklUX09GRlNFVF9MRU5fTUFTS184KF9fQml0T2Zmc2V0LCBfX0JpdExlbikpIFwKKwkpCisKKyNkZWZpbmUgU0VUX0JJVFNfVE9fTEVfMUJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbiwgX19WYWx1ZSkJXAorCSooKHU4ICopKF9fcFN0YXJ0KSkgPSBFRjFCeXRlKAkJCQkJXAorCQlMRV9CSVRTX0NMRUFSRURfVE9fMUJZVEUoX19wU3RhcnQsIF9fQml0T2Zmc2V0LCBfX0JpdExlbikgXAorCQl8ICgoKCh1OClfX1ZhbHVlKSAmIEJJVF9MRU5fTUFTS184KF9fQml0TGVuKSkgPDwJXAorCQkoX19CaXRPZmZzZXQpKQkJCQkJCVwKKwkpOworCisjZGVmaW5lCU5fQllURV9BTElHTUVOVChfX1ZhbHVlLCBfX0FsaWdtZW50KQkJCVwKKwkgKChfX0FsaWdtZW50ID09IDEpID8gKF9fVmFsdWUpIDogKCgoX19WYWx1ZSArIF9fQWxpZ21lbnQgLSAxKSAvIFwKKwlfX0FsaWdtZW50KSAqIF9fQWxpZ21lbnQpKQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX21vZHVsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9tb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzZhMTQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9tb2R1bGUuYwpAQCAtMCwwICsxLDI4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICBDb3B5cmlnaHQoYykgMjAwNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGJhc2VkIG9uIHRoZSBXRVAgZW5hYmxlbWVudCBjb2RlIHByb3ZpZGVkIGJ5IHRoZQorICBIb3N0IEFQIHByb2plY3QgaG9zdGFwLWRyaXZlcnMgdjAuMS4zCisgIENvcHlyaWdodCAoYykgMjAwMS0yMDAyLCBTU0ggQ29tbXVuaWNhdGlvbnMgU2VjdXJpdHkgQ29ycCBhbmQgSm91bmkgTWFsaW5lbgorICA8amttYWxpbmVAY2MuaHV0LmZpPgorICBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgSm91bmkgTWFsaW5lbiA8amttYWxpbmVAY2MuaHV0LmZpPgorCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCisKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisKKyAgQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAgSmFtZXMgUC4gS2V0cmVub3MgPGlwdzIxMDAtYWRtaW5AbGludXguaW50ZWwuY29tPgorICBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CisKKyNpbmNsdWRlICJydGxsaWIuaCIKKworCisjZGVmaW5lIERSVl9OQU1FICJydGxsaWJfOTJlIgorCit2b2lkIF9zZXR1cF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqcHRpbWVyLCB2b2lkICpmdW4sIHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlwdGltZXItPmZ1bmN0aW9uID0gZnVuOworCXB0aW1lci0+ZGF0YSA9IGRhdGE7CisJaW5pdF90aW1lcihwdGltZXIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBydGxsaWJfbmV0d29ya3NfYWxsb2NhdGUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJaWYgKGllZWUtPm5ldHdvcmtzKQorCQlyZXR1cm4gMDsKKworCWllZWUtPm5ldHdvcmtzID0ga3phbGxvYygKKwkJTUFYX05FVFdPUktfQ09VTlQgKiBzaXplb2Yoc3RydWN0IHJ0bGxpYl9uZXR3b3JrKSwKKwkJR0ZQX0tFUk5FTCk7CisJaWYgKCFpZWVlLT5uZXR3b3JrcykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIGJlYWNvbnNcbiIsCisJCSAgICAgICBpZWVlLT5kZXYtPm5hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0bGxpYl9uZXR3b3Jrc19mcmVlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQoreworCWlmICghaWVlZS0+bmV0d29ya3MpCisJCXJldHVybjsKKwlrZnJlZShpZWVlLT5uZXR3b3Jrcyk7CisJaWVlZS0+bmV0d29ya3MgPSBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRsbGliX25ldHdvcmtzX2luaXRpYWxpemUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJaW50IGk7CisKKwlJTklUX0xJU1RfSEVBRCgmaWVlZS0+bmV0d29ya19mcmVlX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5uZXR3b3JrX2xpc3QpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTkVUV09SS19DT1VOVDsgaSsrKQorCQlsaXN0X2FkZF90YWlsKCZpZWVlLT5uZXR3b3Jrc1tpXS5saXN0LAorCQkJICAgICAgJmllZWUtPm5ldHdvcmtfZnJlZV9saXN0KTsKK30KKworc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX3J0bGxpYihpbnQgc2l6ZW9mX3ByaXYpCit7CisJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUgPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJaW50IGksIGVycjsKKworCVJUTExJQl9ERUJVR19JTkZPKCJJbml0aWFsaXppbmcuLi5cbiIpOworCisJZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBydGxsaWJfZGV2aWNlKSArIHNpemVvZl9wcml2KTsKKwlpZiAoIWRldikgeworCQlSVExMSUJfRVJST1IoIlVuYWJsZSB0byBuZXR3b3JrIGRldmljZS5cbiIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJaWVlZSA9IChzdHJ1Y3QgcnRsbGliX2RldmljZSAqKW5ldGRldl9wcml2X3JzbChkZXYpOworCW1lbXNldChpZWVlLCAwLCBzaXplb2Yoc3RydWN0IHJ0bGxpYl9kZXZpY2UpK3NpemVvZl9wcml2KTsKKwlpZWVlLT5kZXYgPSBkZXY7CisKKwllcnIgPSBydGxsaWJfbmV0d29ya3NfYWxsb2NhdGUoaWVlZSk7CisJaWYgKGVycikgeworCQlSVExMSUJfRVJST1IoIlVuYWJsZSB0byBhbGxvY2F0ZSBiZWFjb24gc3RvcmFnZTogJWRcbiIsCisJCQkJZXJyKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCXJ0bGxpYl9uZXR3b3Jrc19pbml0aWFsaXplKGllZWUpOworCisKKwkvKiBEZWZhdWx0IGZyYWdtZW50YXRpb24gdGhyZXNob2xkIGlzIG1heGltdW0gcGF5bG9hZCBzaXplICovCisJaWVlZS0+ZnRzID0gREVGQVVMVF9GVFM7CisJaWVlZS0+c2Nhbl9hZ2UgPSBERUZBVUxUX01BWF9TQ0FOX0FHRTsKKwlpZWVlLT5vcGVuX3dlcCA9IDE7CisKKwkvKiBEZWZhdWx0IHRvIGVuYWJsaW5nIGZ1bGwgb3BlbiBXRVAgd2l0aCBob3N0IGJhc2VkIGVuY3J5cHQvZGVjcnlwdCAqLworCWllZWUtPmhvc3RfZW5jcnlwdCA9IDE7CisJaWVlZS0+aG9zdF9kZWNyeXB0ID0gMTsKKwlpZWVlLT5pZWVlODAyXzF4ID0gMTsgLyogRGVmYXVsdCB0byBzdXBwb3J0aW5nIDgwMi4xeCAqLworCisJSU5JVF9MSVNUX0hFQUQoJmllZWUtPmNyeXB0X2RlaW5pdF9saXN0KTsKKwlfc2V0dXBfdGltZXIoJmllZWUtPmNyeXB0X2RlaW5pdF90aW1lciwKKwkJICAgIHJ0bGxpYl9jcnlwdF9kZWluaXRfaGFuZGxlciwKKwkJICAgICh1bnNpZ25lZCBsb25nKSBpZWVlKTsKKwlpZWVlLT5ydGxsaWJfYXBfc2VjX3R5cGUgPSBydGxsaWJfYXBfc2VjX3R5cGU7CisKKwlzcGluX2xvY2tfaW5pdCgmaWVlZS0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmllZWUtPndwYXhfc3VpdGxpc3RfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmllZWUtPmJ3X3NwaW5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmaWVlZS0+cmVvcmRlcl9zcGlubG9jayk7CisJYXRvbWljX3NldCgmKGllZWUtPmF0bV9jaG5sb3ApLCAwKTsKKwlhdG9taWNfc2V0KCYoaWVlZS0+YXRtX3N3YncpLCAwKTsKKworCWllZWUtPmJIYWxmTk1vZGUgPSBmYWxzZTsKKwlpZWVlLT53cGFfZW5hYmxlZCA9IDA7CisJaWVlZS0+dGtpcF9jb3VudGVybWVhc3VyZXMgPSAwOworCWllZWUtPmRyb3BfdW5lbmNyeXB0ZWQgPSAwOworCWllZWUtPnByaXZhY3lfaW52b2tlZCA9IDA7CisJaWVlZS0+aWVlZTgwMl8xeCA9IDE7CisJaWVlZS0+cmF3X3R4ID0gMDsKKwlpZWVlLT5od3NlY19hY3RpdmUgPSAwOworCisJbWVtc2V0KGllZWUtPnN3Y2FtdGFibGUsIDAsIHNpemVvZihzdHJ1Y3Qgc3dfY2FtX3RhYmxlKSAqIDMyKTsKKwlydGxsaWJfc29mdG1hY19pbml0KGllZWUpOworCisJaWVlZS0+cEhUSW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9oaV90aHJvdWdocHV0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGllZWUtPnBIVEluZm8gPT0gTlVMTCkgeworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgImNhbid0IGFsbG9jIG1lbW9yeSBmb3IgSFRJbmZvXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCUhUVXBkYXRlRGVmYXVsdFNldHRpbmcoaWVlZSk7CisJSFRJbml0aWFsaXplSFRJbmZvKGllZWUpOworCVRTSW5pdGlhbGl6ZShpZWVlKTsKKwlmb3IgKGkgPSAwOyBpIDwgSUVFRV9JQlNTX01BQ19IQVNIX1NJWkU7IGkrKykKKwkJSU5JVF9MSVNUX0hFQUQoJmllZWUtPmlic3NfbWFjX2hhc2hbaV0pOworCisJZm9yIChpID0gMDsgaSA8IDE3OyBpKyspIHsKKwkJaWVlZS0+bGFzdF9yeHNlcV9udW1baV0gPSAtMTsKKwkJaWVlZS0+bGFzdF9yeGZyYWdfbnVtW2ldID0gLTE7CisJCWllZWUtPmxhc3RfcGFja2V0X3RpbWVbaV0gPSAwOworCX0KKworCXJ0bGxpYl90a2lwX251bGwoKTsKKwlydGxsaWJfd2VwX251bGwoKTsKKwlydGxsaWJfY2NtcF9udWxsKCk7CisKKwlyZXR1cm4gZGV2OworCisgZmFpbGVkOgorCWlmIChkZXYpCisJCWZyZWVfbmV0ZGV2KGRldik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgZnJlZV9ydGxsaWIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSA9IChzdHJ1Y3QgcnRsbGliX2RldmljZSAqKQorCQkJCSAgICAgIG5ldGRldl9wcml2X3JzbChkZXYpOworCWludCBpOworCisJa2ZyZWUoaWVlZS0+cEhUSW5mbyk7CisJaWVlZS0+cEhUSW5mbyA9IE5VTEw7CisJcnRsbGliX3NvZnRtYWNfZnJlZShpZWVlKTsKKwlkZWxfdGltZXJfc3luYygmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKTsKKwlydGxsaWJfY3J5cHRfZGVpbml0X2VudHJpZXMoaWVlZSwgMSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVM7IGkrKykgeworCQlzdHJ1Y3QgcnRsbGliX2NyeXB0X2RhdGEgKmNyeXB0ID0gaWVlZS0+Y3J5cHRbaV07CisJCWlmIChjcnlwdCkgeworCQkJaWYgKGNyeXB0LT5vcHMpCisJCQkJY3J5cHQtPm9wcy0+ZGVpbml0KGNyeXB0LT5wcml2KTsKKwkJCWtmcmVlKGNyeXB0KTsKKwkJCWllZWUtPmNyeXB0W2ldID0gTlVMTDsKKwkJfQorCX0KKworCXJ0bGxpYl9uZXR3b3Jrc19mcmVlKGllZWUpOworCWZyZWVfbmV0ZGV2KGRldik7Cit9CisKK3UzMiBydGxsaWJfZGVidWdfbGV2ZWw7CitzdGF0aWMgaW50IGRlYnVnID0gXAorCQkJICAgIFJUTExJQl9ETF9FUlIKKwkJCSAgICA7CitzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpydGxsaWJfcHJvYzsKKworc3RhdGljIGludCBzaG93X2RlYnVnX2xldmVsKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIHNucHJpbnRmKHBhZ2UsIGNvdW50LCAiMHglMDhYXG4iLCBydGxsaWJfZGVidWdfbGV2ZWwpOworfQorCitzdGF0aWMgaW50IHN0b3JlX2RlYnVnX2xldmVsKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworCWNoYXIgYnVmW10gPSAiMHgwMDAwMDAwMCI7CisJdW5zaWduZWQgbG9uZyBsZW4gPSBtaW4oKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKGJ1ZikgLSAxLCBjb3VudCk7CisJY2hhciAqcCA9IChjaGFyICopYnVmOworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBsZW4pKQorCQlyZXR1cm4gY291bnQ7CisJYnVmW2xlbl0gPSAwOworCWlmIChwWzFdID09ICd4JyB8fCBwWzFdID09ICdYJyB8fCBwWzBdID09ICd4JyB8fCBwWzBdID09ICdYJykgeworCQlwKys7CisJCWlmIChwWzBdID09ICd4JyB8fCBwWzBdID09ICdYJykKKwkJCXArKzsKKwkJdmFsID0gc2ltcGxlX3N0cnRvdWwocCwgJnAsIDE2KTsKKwl9IGVsc2UKKwkJdmFsID0gc2ltcGxlX3N0cnRvdWwocCwgJnAsIDEwKTsKKwlpZiAocCA9PSBidWYpCisJCXByaW50ayhLRVJOX0lORk8gRFJWX05BTUUKKwkJICAgICAgICI6ICVzIGlzIG5vdCBpbiBoZXggb3IgZGVjaW1hbCBmb3JtLlxuIiwgYnVmKTsKKwllbHNlCisJCXJ0bGxpYl9kZWJ1Z19sZXZlbCA9IHZhbDsKKworCXJldHVybiBzdHJubGVuKGJ1ZiwgY291bnQpOworfQorCitpbnQgX19pbml0IHJ0bGxpYl9pbml0KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplOworCisJcnRsbGliX2RlYnVnX2xldmVsID0gZGVidWc7CisJcnRsbGliX3Byb2MgPSBjcmVhdGVfcHJvY19lbnRyeShEUlZfTkFNRSwgU19JRkRJUiwgaW5pdF9uZXQucHJvY19uZXQpOworCWlmIChydGxsaWJfcHJvYyA9PSBOVUxMKSB7CisJCVJUTExJQl9FUlJPUigiVW5hYmxlIHRvIGNyZWF0ZSAiIERSVl9OQU1FCisJCQkJIiBwcm9jIGRpcmVjdG9yeVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwllID0gY3JlYXRlX3Byb2NfZW50cnkoImRlYnVnX2xldmVsIiwgU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSLAorCQkJICAgICAgcnRsbGliX3Byb2MpOworCWlmICghZSkgeworCQlyZW1vdmVfcHJvY19lbnRyeShEUlZfTkFNRSwgaW5pdF9uZXQucHJvY19uZXQpOworCQlydGxsaWJfcHJvYyA9IE5VTEw7CisJCXJldHVybiAtRUlPOworCX0KKwllLT5yZWFkX3Byb2MgPSBzaG93X2RlYnVnX2xldmVsOworCWUtPndyaXRlX3Byb2MgPSBzdG9yZV9kZWJ1Z19sZXZlbDsKKwllLT5kYXRhID0gTlVMTDsKKworCXJldHVybiAwOworfQorCit2b2lkIF9fZXhpdCBydGxsaWJfZXhpdCh2b2lkKQoreworCWlmIChydGxsaWJfcHJvYykgeworCQlyZW1vdmVfcHJvY19lbnRyeSgiZGVidWdfbGV2ZWwiLCBydGxsaWJfcHJvYyk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KERSVl9OQU1FLCBpbml0X25ldC5wcm9jX25ldCk7CisJCXJ0bGxpYl9wcm9jID0gTlVMTDsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3J4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3J4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwYWY1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfcnguYwpAQCAtMCwwICsxLDI3MjAgQEAKKy8qCisgKiBPcmlnaW5hbCBjb2RlIGJhc2VkIEhvc3QgQVAgKHNvZnR3YXJlIHdpcmVsZXNzIExBTiBhY2Nlc3MgcG9pbnQpIGRyaXZlcgorICogZm9yIEludGVyc2lsIFByaXNtMi8yLjUvMyAtIGhvc3RhcC5vIG1vZHVsZSwgY29tbW9uIHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIsIFNTSCBDb21tdW5pY2F0aW9ucyBTZWN1cml0eSBDb3JwIGFuZCBKb3VuaSBNYWxpbmVuCisgKiA8amttYWxpbmVAY2MuaHV0LmZpPgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKyAqIENvcHlyaWdodCAoYykgMjAwNCwgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBTZWUgUkVBRE1FIGFuZCBDT1BZSU5HIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgIEZldyBtb2RpZmljYXRpb25zIGZvciBSZWFsdGVrJ3MgV2ktRmkgZHJpdmVycyBieQorICBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisKKyAgQSBzcGVjaWFsIHRoYW5rcyBnb2VzIHRvIFJlYWx0ZWsgZm9yIHRoZWlyIHN1cHBvcnQgIQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisKKyNpbmNsdWRlICJydGxsaWIuaCIKKyNpbmNsdWRlICJkb3QxMWQuaCIKKworc3RhdGljIGlubGluZSB2b2lkIHJ0bGxpYl9tb25pdG9yX3J4KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJCXN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKnJ4X3N0YXR1cywKKwkJCQlzaXplX3QgaGRyX2xlbmd0aCkKK3sKKwlza2ItPmRldiA9IGllZWUtPmRldjsKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCXNrYl9wdWxsKHNrYiwgaGRyX2xlbmd0aCk7CisJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7CisJc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMTFfUkFXKTsKKwltZW1zZXQoc2tiLT5jYiwgMCwgc2l6ZW9mKHNrYi0+Y2IpKTsKKwluZXRpZl9yeChza2IpOworfQorCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK3N0YXRpYyBzdHJ1Y3QgcnRsbGliX2ZyYWdfZW50cnkgKgorcnRsbGliX2ZyYWdfY2FjaGVfZmluZChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdW5zaWduZWQgaW50IHNlcSwKKwkJCSAgdW5zaWduZWQgaW50IGZyYWcsIHU4IHRpZCwgdTggKnNyYywgdTggKmRzdCkKK3sKKwlzdHJ1Y3QgcnRsbGliX2ZyYWdfZW50cnkgKmVudHJ5OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFJUTExJQl9GUkFHX0NBQ0hFX0xFTjsgaSsrKSB7CisJCWVudHJ5ID0gJmllZWUtPmZyYWdfY2FjaGVbdGlkXVtpXTsKKwkJaWYgKGVudHJ5LT5za2IgIT0gTlVMTCAmJgorCQkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBlbnRyeS0+Zmlyc3RfZnJhZ190aW1lICsgMiAqIEhaKSkgeworCQkJUlRMTElCX0RFQlVHX0ZSQUcoCisJCQkJImV4cGlyaW5nIGZyYWdtZW50IGNhY2hlIGVudHJ5ICIKKwkJCQkic2VxPSV1IGxhc3RfZnJhZz0ldVxuIiwKKwkJCQllbnRyeS0+c2VxLCBlbnRyeS0+bGFzdF9mcmFnKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KGVudHJ5LT5za2IpOworCQkJZW50cnktPnNrYiA9IE5VTEw7CisJCX0KKworCQlpZiAoZW50cnktPnNrYiAhPSBOVUxMICYmIGVudHJ5LT5zZXEgPT0gc2VxICYmCisJCSAgICAoZW50cnktPmxhc3RfZnJhZyArIDEgPT0gZnJhZyB8fCBmcmFnID09IC0xKSAmJgorCQkgICAgbWVtY21wKGVudHJ5LT5zcmNfYWRkciwgc3JjLCBFVEhfQUxFTikgPT0gMCAmJgorCQkgICAgbWVtY21wKGVudHJ5LT5kc3RfYWRkciwgZHN0LCBFVEhfQUxFTikgPT0gMCkKKwkJCXJldHVybiBlbnRyeTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpICovCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKgorcnRsbGliX2ZyYWdfY2FjaGVfZ2V0KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJIHN0cnVjdCBydGxsaWJfaGRyXzRhZGRyICpoZHIpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJdTE2IGZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCXUxNiBzYyA9IGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0bCk7CisJdW5zaWduZWQgaW50IGZyYWcgPSBXTEFOX0dFVF9TRVFfRlJBRyhzYyk7CisJdW5zaWduZWQgaW50IHNlcSA9IFdMQU5fR0VUX1NFUV9TRVEoc2MpOworCXN0cnVjdCBydGxsaWJfZnJhZ19lbnRyeSAqZW50cnk7CisJc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHJxb3MgKmhkcl8zYWRkcnFvczsKKwlzdHJ1Y3QgcnRsbGliX2hkcl80YWRkcnFvcyAqaGRyXzRhZGRycW9zOworCXU4IHRpZDsKKworCWlmICgoKGZjICYgUlRMTElCX0ZDVExfRFNUT0RTKSA9PSBSVExMSUJfRkNUTF9EU1RPRFMpICYmIFJUTExJQl9RT1NfSEFTX1NFUShmYykpIHsKKwkJaGRyXzRhZGRycW9zID0gKHN0cnVjdCBydGxsaWJfaGRyXzRhZGRycW9zICopaGRyOworCQl0aWQgPSBsZTE2X3RvX2NwdShoZHJfNGFkZHJxb3MtPnFvc19jdGwpICYgUlRMTElCX1FDVExfVElEOworCQl0aWQgPSBVUDJBQyh0aWQpOworCQl0aWQrKzsKKwl9IGVsc2UgaWYgKFJUTExJQl9RT1NfSEFTX1NFUShmYykpIHsKKwkJaGRyXzNhZGRycW9zID0gKHN0cnVjdCBydGxsaWJfaGRyXzNhZGRycW9zICopaGRyOworCQl0aWQgPSBsZTE2X3RvX2NwdShoZHJfM2FkZHJxb3MtPnFvc19jdGwpICYgUlRMTElCX1FDVExfVElEOworCQl0aWQgPSBVUDJBQyh0aWQpOworCQl0aWQrKzsKKwl9IGVsc2UgeworCQl0aWQgPSAwOworCX0KKworCWlmIChmcmFnID09IDApIHsKKwkJLyogUmVzZXJ2ZSBlbm91Z2ggc3BhY2UgdG8gZml0IG1heGltdW0gZnJhbWUgbGVuZ3RoICovCisJCXNrYiA9IGRldl9hbGxvY19za2IoaWVlZS0+ZGV2LT5tdHUgKworCQkJCSAgICBzaXplb2Yoc3RydWN0IHJ0bGxpYl9oZHJfNGFkZHIpICsKKwkJCQkgICAgOCAvKiBMTEMgKi8gKworCQkJCSAgICAyIC8qIGFsaWdubWVudCAqLyArCisJCQkJICAgIDggLyogV0VQICovICsKKwkJCQkgICAgRVRIX0FMRU4gLyogV0RTICovICsKKwkJCQkgICAgKFJUTExJQl9RT1NfSEFTX1NFUShmYykgPyAyIDogMCkgLyogUU9TIENvbnRyb2wgKi8pOworCQlpZiAoc2tiID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKworCQllbnRyeSA9ICZpZWVlLT5mcmFnX2NhY2hlW3RpZF1baWVlZS0+ZnJhZ19uZXh0X2lkeFt0aWRdXTsKKwkJaWVlZS0+ZnJhZ19uZXh0X2lkeFt0aWRdKys7CisJCWlmIChpZWVlLT5mcmFnX25leHRfaWR4W3RpZF0gPj0gUlRMTElCX0ZSQUdfQ0FDSEVfTEVOKQorCQkJaWVlZS0+ZnJhZ19uZXh0X2lkeFt0aWRdID0gMDsKKworCQlpZiAoZW50cnktPnNrYiAhPSBOVUxMKQorCQkJZGV2X2tmcmVlX3NrYl9hbnkoZW50cnktPnNrYik7CisKKwkJZW50cnktPmZpcnN0X2ZyYWdfdGltZSA9IGppZmZpZXM7CisJCWVudHJ5LT5zZXEgPSBzZXE7CisJCWVudHJ5LT5sYXN0X2ZyYWcgPSBmcmFnOworCQllbnRyeS0+c2tiID0gc2tiOworCQltZW1jcHkoZW50cnktPnNyY19hZGRyLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7CisJCW1lbWNweShlbnRyeS0+ZHN0X2FkZHIsIGhkci0+YWRkcjEsIEVUSF9BTEVOKTsKKwl9IGVsc2UgeworCQkvKiByZWNlaXZlZCBhIGZyYWdtZW50IG9mIGEgZnJhbWUgZm9yIHdoaWNoIHRoZSBoZWFkIGZyYWdtZW50CisJCSAqIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZWNlaXZlZCAqLworCQllbnRyeSA9IHJ0bGxpYl9mcmFnX2NhY2hlX2ZpbmQoaWVlZSwgc2VxLCBmcmFnLCB0aWQsIGhkci0+YWRkcjIsCisJCQkJCQkgIGhkci0+YWRkcjEpOworCQlpZiAoZW50cnkgIT0gTlVMTCkgeworCQkJZW50cnktPmxhc3RfZnJhZyA9IGZyYWc7CisJCQlza2IgPSBlbnRyeS0+c2tiOworCQl9CisJfQorCisJcmV0dXJuIHNrYjsKK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkgKi8KK3N0YXRpYyBpbnQgcnRsbGliX2ZyYWdfY2FjaGVfaW52YWxpZGF0ZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCQkJICAgc3RydWN0IHJ0bGxpYl9oZHJfNGFkZHIgKmhkcikKK3sKKwl1MTYgZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisJdTE2IHNjID0gbGUxNl90b19jcHUoaGRyLT5zZXFfY3RsKTsKKwl1bnNpZ25lZCBpbnQgc2VxID0gV0xBTl9HRVRfU0VRX1NFUShzYyk7CisJc3RydWN0IHJ0bGxpYl9mcmFnX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkcnFvcyAqaGRyXzNhZGRycW9zOworCXN0cnVjdCBydGxsaWJfaGRyXzRhZGRycW9zICpoZHJfNGFkZHJxb3M7CisJdTggdGlkOworCisJaWYgKCgoZmMgJiBSVExMSUJfRkNUTF9EU1RPRFMpID09IFJUTExJQl9GQ1RMX0RTVE9EUykgJiYgUlRMTElCX1FPU19IQVNfU0VRKGZjKSkgeworCQloZHJfNGFkZHJxb3MgPSAoc3RydWN0IHJ0bGxpYl9oZHJfNGFkZHJxb3MgKiloZHI7CisJCXRpZCA9IGxlMTZfdG9fY3B1KGhkcl80YWRkcnFvcy0+cW9zX2N0bCkgJiBSVExMSUJfUUNUTF9USUQ7CisJCXRpZCA9IFVQMkFDKHRpZCk7CisJCXRpZCsrOworCX0gZWxzZSBpZiAoUlRMTElCX1FPU19IQVNfU0VRKGZjKSkgeworCQloZHJfM2FkZHJxb3MgPSAoc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHJxb3MgKiloZHI7CisJCXRpZCA9IGxlMTZfdG9fY3B1KGhkcl8zYWRkcnFvcy0+cW9zX2N0bCkgJiBSVExMSUJfUUNUTF9USUQ7CisJCXRpZCA9IFVQMkFDKHRpZCk7CisJCXRpZCsrOworCX0gZWxzZSB7CisJCXRpZCA9IDA7CisJfQorCisJZW50cnkgPSBydGxsaWJfZnJhZ19jYWNoZV9maW5kKGllZWUsIHNlcSwgLTEsIHRpZCwgaGRyLT5hZGRyMiwKKwkJCQkJICBoZHItPmFkZHIxKTsKKworCWlmIChlbnRyeSA9PSBOVUxMKSB7CisJCVJUTExJQl9ERUJVR19GUkFHKAorCQkJImNvdWxkIG5vdCBpbnZhbGlkYXRlIGZyYWdtZW50IGNhY2hlICIKKwkJCSJlbnRyeSAoc2VxPSV1KVxuIiwgc2VxKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWVudHJ5LT5za2IgPSBOVUxMOworCXJldHVybiAwOworfQorCisvKiBydGxsaWJfcnhfZnJhbWVfbWd0bXQKKyAqCisgKiBSZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgbWFuYWdlbWVudCBjb250cm9sIGZyYW1lcworICoKKyAqIENhbGxlZCBieSBydGxsaWJfcnggKi8KK3N0YXRpYyBpbmxpbmUgaW50CitydGxsaWJfcnhfZnJhbWVfbWdtdChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKnJ4X3N0YXRzLCB1MTYgdHlwZSwKKwkJCXUxNiBzdHlwZSkKK3sKKwkvKiBPbiB0aGUgc3RydWN0IHN0YXRzIGRlZmluaXRpb24gdGhlcmUgaXMgd3JpdHRlbiB0aGF0CisJICogdGhpcyBpcyBub3QgbWFuZGF0b3J5Li4uLiBidXQgc2VlbXMgdGhhdCB0aGUgcHJvYmUKKwkgKiByZXNwb25zZSBwYXJzZXIgdXNlcyBpdAorCSAqLworCXN0cnVjdCBydGxsaWJfaGRyXzNhZGRyICogaGRyID0gKHN0cnVjdCBydGxsaWJfaGRyXzNhZGRyICopc2tiLT5kYXRhOworCisJcnhfc3RhdHMtPmxlbiA9IHNrYi0+bGVuOworCXJ0bGxpYl9yeF9tZ3QoaWVlZSwgc2tiLCByeF9zdGF0cyk7CisJaWYgKChtZW1jbXAoaGRyLT5hZGRyMSwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pKSkgeworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQlyZXR1cm4gMDsKKwl9CisJcnRsbGliX3J4X2ZyYW1lX3NvZnRtYWMoaWVlZSwgc2tiLCByeF9zdGF0cywgdHlwZSwgc3R5cGUpOworCisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKworCXJldHVybiAwOworfQorCisvKiBTZWUgSUVFRSA4MDIuMUggZm9yIExMQy9TTkFQIGVuY2Fwc3VsYXRpb24vZGVjYXBzdWxhdGlvbiAqLworLyogRXRoZXJuZXQtSUkgc25hcCBoZWFkZXIgKFJGQzEwNDIgZm9yIG1vc3QgRXRoZXJUeXBlcykgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJmYzEwNDJfaGVhZGVyW10gPSB7CisJMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMAorfTsKKy8qIEJyaWRnZS1UdW5uZWwgaGVhZGVyIChmb3IgRXRoZXJUeXBlcyBFVEhfUF9BQVJQIGFuZCBFVEhfUF9JUFgpICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBicmlkZ2VfdHVubmVsX2hlYWRlcltdID0geworCTB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4ZjgKK307CisvKiBObyBlbmNhcHN1bGF0aW9uIGhlYWRlciBpZiBFdGhlclR5cGUgPCAweDYwMCAoPWxlbmd0aCkgKi8KKworLyogQ2FsbGVkIGJ5IHJ0bGxpYl9yeF9mcmFtZV9kZWNyeXB0ICovCitzdGF0aWMgaW50IHJ0bGxpYl9pc19lYXBvbF9mcmFtZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc2l6ZV90IGhkcmxlbikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaWVlZS0+ZGV2OworCXUxNiBmYywgZXRoZXJ0eXBlOworCXN0cnVjdCBydGxsaWJfaGRyXzRhZGRyICpoZHI7CisJdTggKnBvczsKKworCWlmIChza2ItPmxlbiA8IDI0KQorCQlyZXR1cm4gMDsKKworCWhkciA9IChzdHJ1Y3QgcnRsbGliX2hkcl80YWRkciAqKSBza2ItPmRhdGE7CisJZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCk7CisKKwkvKiBjaGVjayB0aGF0IHRoZSBmcmFtZSBpcyB1bmljYXN0IGZyYW1lIHRvIHVzICovCisJaWYgKChmYyAmIChSVExMSUJfRkNUTF9UT0RTIHwgUlRMTElCX0ZDVExfRlJPTURTKSkgPT0KKwkgICAgUlRMTElCX0ZDVExfVE9EUyAmJgorCSAgICBtZW1jbXAoaGRyLT5hZGRyMSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pID09IDAgJiYKKwkgICAgbWVtY21wKGhkci0+YWRkcjMsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSA9PSAwKSB7CisJCS8qIFRvRFMgZnJhbWUgd2l0aCBvd24gYWRkciBCU1NJRCBhbmQgREEgKi8KKwl9IGVsc2UgaWYgKChmYyAmIChSVExMSUJfRkNUTF9UT0RTIHwgUlRMTElCX0ZDVExfRlJPTURTKSkgPT0KKwkJICAgUlRMTElCX0ZDVExfRlJPTURTICYmCisJCSAgIG1lbWNtcChoZHItPmFkZHIxLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTikgPT0gMCkgeworCQkvKiBGcm9tRFMgZnJhbWUgd2l0aCBvd24gYWRkciBhcyBEQSAqLworCX0gZWxzZQorCQlyZXR1cm4gMDsKKworCWlmIChza2ItPmxlbiA8IDI0ICsgOCkKKwkJcmV0dXJuIDA7CisKKwkvKiBjaGVjayBmb3IgcG9ydCBhY2Nlc3MgZW50aXR5IEV0aGVybmV0IHR5cGUgKi8KKwlwb3MgPSBza2ItPmRhdGEgKyBoZHJsZW47CisJZXRoZXJ0eXBlID0gKHBvc1s2XSA8PCA4KSB8IHBvc1s3XTsKKwlpZiAoZXRoZXJ0eXBlID09IEVUSF9QX1BBRSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpLCBieSBydGxsaWJfcnggKi8KK3N0YXRpYyBpbmxpbmUgaW50CitydGxsaWJfcnhfZnJhbWVfZGVjcnlwdChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBydGxsaWJfY3J5cHRfZGF0YSAqY3J5cHQpCit7CisJc3RydWN0IHJ0bGxpYl9oZHJfNGFkZHIgKmhkcjsKKwlpbnQgcmVzLCBoZHJsZW47CisKKwlpZiAoY3J5cHQgPT0gTlVMTCB8fCBjcnlwdC0+b3BzLT5kZWNyeXB0X21wZHUgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoaWVlZS0+aHdzZWNfYWN0aXZlKSB7CisJCXN0cnVjdCBjYl9kZXNjICp0Y2JfZGVzYyA9IChzdHJ1Y3QgY2JfZGVzYyAqKShza2ItPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCQl0Y2JfZGVzYy0+Ykh3U2VjID0gMTsKKworCQlpZiAoaWVlZS0+bmVlZF9zd19lbmMpCisJCQl0Y2JfZGVzYy0+Ykh3U2VjID0gMDsKKwl9CisKKwloZHIgPSAoc3RydWN0IHJ0bGxpYl9oZHJfNGFkZHIgKikgc2tiLT5kYXRhOworCWhkcmxlbiA9IHJ0bGxpYl9nZXRfaGRybGVuKGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKSk7CisKKwlhdG9taWNfaW5jKCZjcnlwdC0+cmVmY250KTsKKwlyZXMgPSBjcnlwdC0+b3BzLT5kZWNyeXB0X21wZHUoc2tiLCBoZHJsZW4sIGNyeXB0LT5wcml2KTsKKwlhdG9taWNfZGVjKCZjcnlwdC0+cmVmY250KTsKKwlpZiAocmVzIDwgMCkgeworCQlSVExMSUJfREVCVUdfRFJPUCgKKwkJCSJkZWNyeXB0aW9uIGZhaWxlZCAoU0E9ICVwTSIKKwkJCSIpIHJlcz0lZFxuIiwgaGRyLT5hZGRyMiwgcmVzKTsKKwkJaWYgKHJlcyA9PSAtMikKKwkJCVJUTExJQl9ERUJVR19EUk9QKCJEZWNyeXB0aW9uIGZhaWxlZCBJQ1YgIgorCQkJCQkgICAgICJtaXNtYXRjaCAoa2V5ICVkKVxuIiwKKwkJCQkJICAgICBza2ItPmRhdGFbaGRybGVuICsgM10gPj4gNik7CisJCWllZWUtPmllZWVfc3RhdHMucnhfZGlzY2FyZHNfdW5kZWNyeXB0YWJsZSsrOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIHJlczsKK30KKworCisvKiBDYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSksIGJ5IHJ0bGxpYl9yeCAqLworc3RhdGljIGlubGluZSBpbnQKK3J0bGxpYl9yeF9mcmFtZV9kZWNyeXB0X21zZHUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIGludCBrZXlpZHgsIHN0cnVjdCBydGxsaWJfY3J5cHRfZGF0YSAqY3J5cHQpCit7CisJc3RydWN0IHJ0bGxpYl9oZHJfNGFkZHIgKmhkcjsKKwlpbnQgcmVzLCBoZHJsZW47CisKKwlpZiAoY3J5cHQgPT0gTlVMTCB8fCBjcnlwdC0+b3BzLT5kZWNyeXB0X21zZHUgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaWYgKGllZWUtPmh3c2VjX2FjdGl2ZSkgeworCQlzdHJ1Y3QgY2JfZGVzYyAqdGNiX2Rlc2MgPSAoc3RydWN0IGNiX2Rlc2MgKikoc2tiLT5jYiArIE1BWF9ERVZfQUREUl9TSVpFKTsKKwkJdGNiX2Rlc2MtPmJId1NlYyA9IDE7CisKKwkJaWYgKGllZWUtPm5lZWRfc3dfZW5jKQorCQkJdGNiX2Rlc2MtPmJId1NlYyA9IDA7CisJfQorCisJaGRyID0gKHN0cnVjdCBydGxsaWJfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKwloZHJsZW4gPSBydGxsaWJfZ2V0X2hkcmxlbihsZTE2X3RvX2NwdShoZHItPmZyYW1lX2N0bCkpOworCisJYXRvbWljX2luYygmY3J5cHQtPnJlZmNudCk7CisJcmVzID0gY3J5cHQtPm9wcy0+ZGVjcnlwdF9tc2R1KHNrYiwga2V5aWR4LCBoZHJsZW4sIGNyeXB0LT5wcml2LCBpZWVlKTsKKwlhdG9taWNfZGVjKCZjcnlwdC0+cmVmY250KTsKKwlpZiAocmVzIDwgMCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1TRFUgZGVjcnlwdGlvbi9NSUMgdmVyaWZpY2F0aW9uIGZhaWxlZCIKKwkJICAgICAgICIgKFNBPSAlcE0ga2V5aWR4PSVkKVxuIiwKKwkJICAgICAgIGllZWUtPmRldi0+bmFtZSwgaGRyLT5hZGRyMiwga2V5aWR4KTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qIHRoaXMgZnVuY3Rpb24gaXMgc3RvbGVuIGZyb20gaXB3MjIwMCBkcml2ZXIqLworI2RlZmluZSBJRUVFX1BBQ0tFVF9SRVRSWV9USU1FICg1KkhaKQorc3RhdGljIGludCBpc19kdXBsaWNhdGVfcGFja2V0KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJCSAgICAgIHN0cnVjdCBydGxsaWJfaGRyXzRhZGRyICpoZWFkZXIpCit7CisJdTE2IGZjID0gbGUxNl90b19jcHUoaGVhZGVyLT5mcmFtZV9jdGwpOworCXUxNiBzYyA9IGxlMTZfdG9fY3B1KGhlYWRlci0+c2VxX2N0bCk7CisJdTE2IHNlcSA9IFdMQU5fR0VUX1NFUV9TRVEoc2MpOworCXUxNiBmcmFnID0gV0xBTl9HRVRfU0VRX0ZSQUcoc2MpOworCXUxNiAqbGFzdF9zZXEsICpsYXN0X2ZyYWc7CisJdW5zaWduZWQgbG9uZyAqbGFzdF90aW1lOworCXN0cnVjdCBydGxsaWJfaGRyXzNhZGRycW9zICpoZHJfM2FkZHJxb3M7CisJc3RydWN0IHJ0bGxpYl9oZHJfNGFkZHJxb3MgKmhkcl80YWRkcnFvczsKKwl1OCB0aWQ7CisKKwlpZiAoKChmYyAmIFJUTExJQl9GQ1RMX0RTVE9EUykgPT0gUlRMTElCX0ZDVExfRFNUT0RTKSAmJiBSVExMSUJfUU9TX0hBU19TRVEoZmMpKSB7CisJCWhkcl80YWRkcnFvcyA9IChzdHJ1Y3QgcnRsbGliX2hkcl80YWRkcnFvcyAqKWhlYWRlcjsKKwkJdGlkID0gbGUxNl90b19jcHUoaGRyXzRhZGRycW9zLT5xb3NfY3RsKSAmIFJUTExJQl9RQ1RMX1RJRDsKKwkJdGlkID0gVVAyQUModGlkKTsKKwkJdGlkKys7CisJfSBlbHNlIGlmIChSVExMSUJfUU9TX0hBU19TRVEoZmMpKSB7CisJCWhkcl8zYWRkcnFvcyA9IChzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkcnFvcyAqKWhlYWRlcjsKKwkJdGlkID0gbGUxNl90b19jcHUoaGRyXzNhZGRycW9zLT5xb3NfY3RsKSAmIFJUTExJQl9RQ1RMX1RJRDsKKwkJdGlkID0gVVAyQUModGlkKTsKKwkJdGlkKys7CisJfSBlbHNlIHsKKwkJdGlkID0gMDsKKwl9CisKKwlzd2l0Y2ggKGllZWUtPml3X21vZGUpIHsKKwljYXNlIElXX01PREVfQURIT0M6CisJeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCQlzdHJ1Y3QgaWVlZV9pYnNzX3NlcSAqZW50cnkgPSBOVUxMOworCQl1OCAqbWFjID0gaGVhZGVyLT5hZGRyMjsKKwkJaW50IGluZGV4ID0gbWFjWzVdICUgSUVFRV9JQlNTX01BQ19IQVNIX1NJWkU7CisJCWxpc3RfZm9yX2VhY2gocCwgJmllZWUtPmlic3NfbWFjX2hhc2hbaW5kZXhdKSB7CisJCQllbnRyeSA9IGxpc3RfZW50cnkocCwgc3RydWN0IGllZWVfaWJzc19zZXEsIGxpc3QpOworCQkJaWYgKCFtZW1jbXAoZW50cnktPm1hYywgbWFjLCBFVEhfQUxFTikpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKHAgPT0gJmllZWUtPmlic3NfbWFjX2hhc2hbaW5kZXhdKSB7CisJCQllbnRyeSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpZWVlX2lic3Nfc2VxKSwgR0ZQX0FUT01JQyk7CisJCQlpZiAoIWVudHJ5KSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2Fubm90IG1hbGxvYyBuZXcgbWFjIGVudHJ5XG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCW1lbWNweShlbnRyeS0+bWFjLCBtYWMsIEVUSF9BTEVOKTsKKwkJCWVudHJ5LT5zZXFfbnVtW3RpZF0gPSBzZXE7CisJCQllbnRyeS0+ZnJhZ19udW1bdGlkXSA9IGZyYWc7CisJCQllbnRyeS0+cGFja2V0X3RpbWVbdGlkXSA9IGppZmZpZXM7CisJCQlsaXN0X2FkZCgmZW50cnktPmxpc3QsICZpZWVlLT5pYnNzX21hY19oYXNoW2luZGV4XSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlsYXN0X3NlcSA9ICZlbnRyeS0+c2VxX251bVt0aWRdOworCQlsYXN0X2ZyYWcgPSAmZW50cnktPmZyYWdfbnVtW3RpZF07CisJCWxhc3RfdGltZSA9ICZlbnRyeS0+cGFja2V0X3RpbWVbdGlkXTsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBJV19NT0RFX0lORlJBOgorCQlsYXN0X3NlcSA9ICZpZWVlLT5sYXN0X3J4c2VxX251bVt0aWRdOworCQlsYXN0X2ZyYWcgPSAmaWVlZS0+bGFzdF9yeGZyYWdfbnVtW3RpZF07CisJCWxhc3RfdGltZSA9ICZpZWVlLT5sYXN0X3BhY2tldF90aW1lW3RpZF07CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCWlmICgoKmxhc3Rfc2VxID09IHNlcSkgJiYKKwkgICAgdGltZV9hZnRlcigqbGFzdF90aW1lICsgSUVFRV9QQUNLRVRfUkVUUllfVElNRSwgamlmZmllcykpIHsKKwkJaWYgKCpsYXN0X2ZyYWcgPT0gZnJhZykKKwkJCWdvdG8gZHJvcDsKKwkJaWYgKCpsYXN0X2ZyYWcgKyAxICE9IGZyYWcpCisJCQkvKiBvdXQtb2Ytb3JkZXIgZnJhZ21lbnQgKi8KKwkJCWdvdG8gZHJvcDsKKwl9IGVsc2UKKwkJKmxhc3Rfc2VxID0gc2VxOworCisJKmxhc3RfZnJhZyA9IGZyYWc7CisJKmxhc3RfdGltZSA9IGppZmZpZXM7CisJcmV0dXJuIDA7CisKK2Ryb3A6CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGJvb2wgQWRkUmVvcmRlckVudHJ5KHN0cnVjdCByeF90c19yZWNvcmQgKnBUUywKKwkJCSAgICBzdHJ1Y3QgcnhfcmVvcmRlcl9lbnRyeSAqcFJlb3JkZXJFbnRyeSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwTGlzdCA9ICZwVFMtPlJ4UGVuZGluZ1BrdExpc3Q7CisKKwl3aGlsZSAocExpc3QtPm5leHQgIT0gJnBUUy0+UnhQZW5kaW5nUGt0TGlzdCkgeworCQlpZiAoU05fTEVTUyhwUmVvcmRlckVudHJ5LT5TZXFOdW0sICgoc3RydWN0IHJ4X3Jlb3JkZXJfZW50cnkgKikKKwkJICAgIGxpc3RfZW50cnkocExpc3QtPm5leHQsIHN0cnVjdCByeF9yZW9yZGVyX2VudHJ5LAorCQkgICAgTGlzdCkpLT5TZXFOdW0pKQorCQkJcExpc3QgPSBwTGlzdC0+bmV4dDsKKwkJZWxzZSBpZiAoU05fRVFVQUwocFJlb3JkZXJFbnRyeS0+U2VxTnVtLAorCQkJKChzdHJ1Y3QgcnhfcmVvcmRlcl9lbnRyeSAqKWxpc3RfZW50cnkocExpc3QtPm5leHQsCisJCQlzdHJ1Y3QgcnhfcmVvcmRlcl9lbnRyeSwgTGlzdCkpLT5TZXFOdW0pKQorCQkJCXJldHVybiBmYWxzZTsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCXBSZW9yZGVyRW50cnktPkxpc3QubmV4dCA9IHBMaXN0LT5uZXh0OworCXBSZW9yZGVyRW50cnktPkxpc3QubmV4dC0+cHJldiA9ICZwUmVvcmRlckVudHJ5LT5MaXN0OworCXBSZW9yZGVyRW50cnktPkxpc3QucHJldiA9IHBMaXN0OworCXBMaXN0LT5uZXh0ID0gJnBSZW9yZGVyRW50cnktPkxpc3Q7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBydGxsaWJfaW5kaWNhdGVfcGFja2V0cyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHJ0bGxpYl9yeGIgKipwcnhiSW5kaWNhdGVBcnJheSwgdTggaW5kZXgpCit7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmllZWUtPnN0YXRzOworCXU4IGkgPSAwICwgaiA9IDA7CisJdTE2IGV0aGVydHlwZTsKKwlmb3IgKGogPSAwOyBqIDwgaW5kZXg7IGorKykgeworCQlzdHJ1Y3QgcnRsbGliX3J4YiAqcHJ4YiA9IHByeGJJbmRpY2F0ZUFycmF5W2pdOworCQlmb3IgKGkgPSAwOyBpIDwgcHJ4Yi0+bnJfc3ViZnJhbWVzOyBpKyspIHsKKwkJCXN0cnVjdCBza19idWZmICpzdWJfc2tiID0gcHJ4Yi0+c3ViZnJhbWVzW2ldOworCisJCS8qIGNvbnZlcnQgaGRyICsgcG9zc2libGUgTExDIGhlYWRlcnMgaW50byBFdGhlcm5ldCBoZWFkZXIgKi8KKwkJCWV0aGVydHlwZSA9IChzdWJfc2tiLT5kYXRhWzZdIDw8IDgpIHwgc3ViX3NrYi0+ZGF0YVs3XTsKKwkJCWlmIChzdWJfc2tiLT5sZW4gPj0gOCAmJgorCQkJICAgICgobWVtY21wKHN1Yl9za2ItPmRhdGEsIHJmYzEwNDJfaGVhZGVyLCBTTkFQX1NJWkUpID09IDAgJiYKKwkJCSAgICBldGhlcnR5cGUgIT0gRVRIX1BfQUFSUCAmJiBldGhlcnR5cGUgIT0gRVRIX1BfSVBYKSB8fAorCQkJICAgIG1lbWNtcChzdWJfc2tiLT5kYXRhLCBicmlkZ2VfdHVubmVsX2hlYWRlciwgU05BUF9TSVpFKSA9PSAwKSkgeworCQkJCS8qIHJlbW92ZSBSRkMxMDQyIG9yIEJyaWRnZS1UdW5uZWwgZW5jYXBzdWxhdGlvbgorCQkJCSAqIGFuZCByZXBsYWNlIEV0aGVyVHlwZSAqLworCQkJCXNrYl9wdWxsKHN1Yl9za2IsIFNOQVBfU0laRSk7CisJCQkJbWVtY3B5KHNrYl9wdXNoKHN1Yl9za2IsIEVUSF9BTEVOKSwgcHJ4Yi0+c3JjLCBFVEhfQUxFTik7CisJCQkJbWVtY3B5KHNrYl9wdXNoKHN1Yl9za2IsIEVUSF9BTEVOKSwgcHJ4Yi0+ZHN0LCBFVEhfQUxFTik7CisJCQl9IGVsc2UgeworCQkJCXUxNiBsZW47CisJCQkvKiBMZWF2ZSBFdGhlcm5ldCBoZWFkZXIgcGFydCBvZiBoZHIgYW5kIGZ1bGwgcGF5bG9hZCAqLworCQkJCWxlbiA9IGh0b25zKHN1Yl9za2ItPmxlbik7CisJCQkJbWVtY3B5KHNrYl9wdXNoKHN1Yl9za2IsIDIpLCAmbGVuLCAyKTsKKwkJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgRVRIX0FMRU4pLCBwcnhiLT5zcmMsIEVUSF9BTEVOKTsKKwkJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgRVRIX0FMRU4pLCBwcnhiLT5kc3QsIEVUSF9BTEVOKTsKKwkJCX0KKworCQkJLyogSW5kaWNhdCB0aGUgcGFja2V0cyB0byB1cHBlciBsYXllciAqLworCQkJaWYgKHN1Yl9za2IpIHsKKwkJCQlzdGF0cy0+cnhfcGFja2V0cysrOworCQkJCXN0YXRzLT5yeF9ieXRlcyArPSBzdWJfc2tiLT5sZW47CisKKwkJCQltZW1zZXQoc3ViX3NrYi0+Y2IsIDAsIHNpemVvZihzdWJfc2tiLT5jYikpOworCQkJCXN1Yl9za2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc3ViX3NrYiwgaWVlZS0+ZGV2KTsKKwkJCQlzdWJfc2tiLT5kZXYgPSBpZWVlLT5kZXY7CisJCQkJc3ViX3NrYi0+ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQkJc3ViX3NrYi0+ZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBzdWJfc2tiLT5sZW47CisJCQkJc3ViX3NrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsgLyogODAyLjExIGNyYyBub3Qgc3VmZmljaWVudCAqLworCQkJCWllZWUtPmxhc3RfcnhfcHNfdGltZSA9IGppZmZpZXM7CisJCQkJbmV0aWZfcngoc3ViX3NrYik7CisJCQl9CisJCX0KKwkJa2ZyZWUocHJ4Yik7CisJCXByeGIgPSBOVUxMOworCX0KK30KKwordm9pZCBydGxsaWJfRmx1c2hSeFRzUGVuZGluZ1BrdHMoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCXN0cnVjdCByeF90c19yZWNvcmQgKnBUUykKK3sKKwlzdHJ1Y3QgcnhfcmVvcmRlcl9lbnRyeSAqcFJ4UmVvcmRlckVudHJ5OworCXU4IFJmZENudCA9IDA7CisKKwlkZWxfdGltZXJfc3luYygmcFRTLT5SeFBrdFBlbmRpbmdUaW1lcik7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZwVFMtPlJ4UGVuZGluZ1BrdExpc3QpKSB7CisJCWlmIChSZmRDbnQgPj0gUkVPUkRFUl9XSU5fU0laRSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiLS0tLS0tLS0tLS0tLS0+JXMoKSBlcnJvciEgUmZkQ250ID49IFJFT1JERVJfV0lOX1NJWkVcbiIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcFJ4UmVvcmRlckVudHJ5ID0gKHN0cnVjdCByeF9yZW9yZGVyX2VudHJ5ICopbGlzdF9lbnRyeShwVFMtPlJ4UGVuZGluZ1BrdExpc3QucHJldiwgc3RydWN0IHJ4X3Jlb3JkZXJfZW50cnksIExpc3QpOworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX1JFT1JERVIsICIlcygpOiBJbmRpY2F0ZSBTZXFOdW0gJWQhXG4iLCBfX2Z1bmNfXywgcFJ4UmVvcmRlckVudHJ5LT5TZXFOdW0pOworCQlsaXN0X2RlbF9pbml0KCZwUnhSZW9yZGVyRW50cnktPkxpc3QpOworCisJCWllZWUtPlJmZEFycmF5W1JmZENudF0gPSBwUnhSZW9yZGVyRW50cnktPnByeGI7CisKKwkJUmZkQ250ID0gUmZkQ250ICsgMTsKKwkJbGlzdF9hZGRfdGFpbCgmcFJ4UmVvcmRlckVudHJ5LT5MaXN0LCAmaWVlZS0+UnhSZW9yZGVyX1VudXNlZF9MaXN0KTsKKwl9CisJcnRsbGliX2luZGljYXRlX3BhY2tldHMoaWVlZSwgaWVlZS0+UmZkQXJyYXksIFJmZENudCk7CisKKwlwVFMtPlJ4SW5kaWNhdGVTZXEgPSAweGZmZmY7Cit9CisKK3N0YXRpYyB2b2lkIFJ4UmVvcmRlckluZGljYXRlUGFja2V0KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJCSAgICBzdHJ1Y3QgcnRsbGliX3J4YiAqcHJ4YiwKKwkJCQkgICAgc3RydWN0IHJ4X3RzX3JlY29yZCAqcFRTLCB1MTYgU2VxTnVtKQoreworCXN0cnVjdCBydF9oaV90aHJvdWdocHV0ICpwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKwlzdHJ1Y3QgcnhfcmVvcmRlcl9lbnRyeSAqcFJlb3JkZXJFbnRyeSA9IE5VTEw7CisJdTggV2luU2l6ZSA9IHBIVEluZm8tPlJ4UmVvcmRlcldpblNpemU7CisJdTE2IFdpbkVuZCA9IDA7CisJdTggaW5kZXggPSAwOworCWJvb2wgYk1hdGNoV2luU3RhcnQgPSBmYWxzZSwgYlBrdEluQnVmID0gZmFsc2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCVJUTExJQl9ERUJVRyhSVExMSUJfRExfUkVPUkRFUiwgIiVzKCk6IFNlcSBpcyAlZCwgcFRTLT5SeEluZGljYXRlU2VxIgorCQkgICAgICIgaXMgJWQsIFdpblNpemUgaXMgJWRcbiIsIF9fZnVuY19fLCBTZXFOdW0sCisJCSAgICAgcFRTLT5SeEluZGljYXRlU2VxLCBXaW5TaXplKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCYoaWVlZS0+cmVvcmRlcl9zcGlubG9jayksIGZsYWdzKTsKKworCVdpbkVuZCA9IChwVFMtPlJ4SW5kaWNhdGVTZXEgKyBXaW5TaXplIC0gMSkgJSA0MDk2OworCS8qIFJ4IFJlb3JkZXIgaW5pdGlhbGl6ZSBjb25kaXRpb24uKi8KKwlpZiAocFRTLT5SeEluZGljYXRlU2VxID09IDB4ZmZmZikKKwkJcFRTLT5SeEluZGljYXRlU2VxID0gU2VxTnVtOworCisJLyogRHJvcCBvdXQgdGhlIHBhY2tldCB3aGljaCBTZXFOdW0gaXMgc21hbGxlciB0aGFuIFdpblN0YXJ0ICovCisJaWYgKFNOX0xFU1MoU2VxTnVtLCBwVFMtPlJ4SW5kaWNhdGVTZXEpKSB7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfUkVPUkRFUiwgIlBhY2tldCBEcm9wISBJbmRpY2F0ZVNlcTogJWQsIE5ld1NlcTogJWRcbiIsCisJCQkJIHBUUy0+UnhJbmRpY2F0ZVNlcSwgU2VxTnVtKTsKKwkJcEhUSW5mby0+UnhSZW9yZGVyRHJvcENvdW50ZXIrKzsKKwkJeworCQkJaW50IGk7CisJCQlmb3IgKGkgPSAwOyBpIDwgcHJ4Yi0+bnJfc3ViZnJhbWVzOyBpKyspCisJCQkJZGV2X2tmcmVlX3NrYihwcnhiLT5zdWJmcmFtZXNbaV0pOworCQkJa2ZyZWUocHJ4Yik7CisJCQlwcnhiID0gTlVMTDsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaWVlZS0+cmVvcmRlcl9zcGlubG9jayksIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogU2xpZGluZyB3aW5kb3cgbWFuaXB1bGF0aW9uLiBDb25kaXRpb25zIGluY2x1ZGVzOgorCSAqIDEuIEluY29taW5nIFNlcU51bSBpcyBlcXVhbCB0byBXaW5TdGFydCA9PldpbmRvdyBzaGlmdCAxCisJICogMi4gSW5jb21pbmcgU2VxTnVtIGlzIGxhcmdlciB0aGFuIHRoZSBXaW5FbmQgPT4gV2luZG93IHNoaWZ0IE4KKwkgKi8KKwlpZiAoU05fRVFVQUwoU2VxTnVtLCBwVFMtPlJ4SW5kaWNhdGVTZXEpKSB7CisJCXBUUy0+UnhJbmRpY2F0ZVNlcSA9IChwVFMtPlJ4SW5kaWNhdGVTZXEgKyAxKSAlIDQwOTY7CisJCWJNYXRjaFdpblN0YXJ0ID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKFNOX0xFU1MoV2luRW5kLCBTZXFOdW0pKSB7CisJCWlmIChTZXFOdW0gPj0gKFdpblNpemUgLSAxKSkKKwkJCXBUUy0+UnhJbmRpY2F0ZVNlcSA9IFNlcU51bSArIDEgLSBXaW5TaXplOworCQllbHNlCisJCQlwVFMtPlJ4SW5kaWNhdGVTZXEgPSA0MDk1IC0gKFdpblNpemUgLSAoU2VxTnVtICsgMSkpICsgMTsKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9SRU9SREVSLCAiV2luZG93IFNoaWZ0ISBJbmRpY2F0ZVNlcTogJWQsIgorCQkJICAgICAiIE5ld1NlcTogJWRcbiIsIHBUUy0+UnhJbmRpY2F0ZVNlcSwgU2VxTnVtKTsKKwl9CisKKwkvKgorCSAqIEluZGljYXRpb24gcHJvY2Vzcy4KKwkgKiBBZnRlciBQYWNrZXQgZHJvcHBpbmcgYW5kIFNsaWRpbmcgV2luZG93IHNoaWZ0aW5nIGFzIGFib3ZlLCB3ZSBjYW4KKwkgKiBub3cganVzdCBpbmRpY2F0ZSB0aGUgcGFja2V0cyB3aXRoIHRoZSBTZXFOdW0gc21hbGxlciB0aGFuIGxhdGVzdAorCSAqIFdpblN0YXJ0IGFuZCBzdHJ1Y3QgYnVmZmVyIG90aGVyIHBhY2tldHMuCisJICovCisJLyogRm9yIFJ4IFJlb3JkZXIgY29uZGl0aW9uOgorCSAqIDEuIEFsbCBwYWNrZXRzIHdpdGggU2VxTnVtIHNtYWxsZXIgdGhhbiBXaW5TdGFydCA9PiBJbmRpY2F0ZQorCSAqIDIuIEFsbCBwYWNrZXRzIHdpdGggU2VxTnVtIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvCisJICoJIFdpblN0YXJ0ID0+IEJ1ZmZlciBpdC4KKwkgKi8KKwlpZiAoYk1hdGNoV2luU3RhcnQpIHsKKwkJLyogQ3VycmVudCBwYWNrZXQgaXMgZ29pbmcgdG8gYmUgaW5kaWNhdGVkLiovCisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfUkVPUkRFUiwgIlBhY2tldHMgaW5kaWNhdGlvbiEhICIKKwkJCQkiSW5kaWNhdGVTZXE6ICVkLCBOZXdTZXE6ICVkXG4iLAorCQkJCXBUUy0+UnhJbmRpY2F0ZVNlcSwgU2VxTnVtKTsKKwkJaWVlZS0+cHJ4YkluZGljYXRlQXJyYXlbMF0gPSBwcnhiOworCQlpbmRleCA9IDE7CisJfSBlbHNlIHsKKwkJLyogQ3VycmVudCBwYWNrZXQgaXMgZ29pbmcgdG8gYmUgaW5zZXJ0ZWQgaW50byBwZW5kaW5nIGxpc3QuKi8KKwkJaWYgKCFsaXN0X2VtcHR5KCZpZWVlLT5SeFJlb3JkZXJfVW51c2VkX0xpc3QpKSB7CisJCQlwUmVvcmRlckVudHJ5ID0gKHN0cnVjdCByeF9yZW9yZGVyX2VudHJ5ICopCisJCQkJCWxpc3RfZW50cnkoaWVlZS0+UnhSZW9yZGVyX1VudXNlZF9MaXN0Lm5leHQsCisJCQkJCXN0cnVjdCByeF9yZW9yZGVyX2VudHJ5LCBMaXN0KTsKKwkJCWxpc3RfZGVsX2luaXQoJnBSZW9yZGVyRW50cnktPkxpc3QpOworCisJCQkvKiBNYWtlIGEgcmVvcmRlciBlbnRyeSBhbmQgaW5zZXJ0IGludG8gYSB0aGUgcGFja2V0IGxpc3QuKi8KKwkJCXBSZW9yZGVyRW50cnktPlNlcU51bSA9IFNlcU51bTsKKwkJCXBSZW9yZGVyRW50cnktPnByeGIgPSBwcnhiOworCisJCQlpZiAoIUFkZFJlb3JkZXJFbnRyeShwVFMsIHBSZW9yZGVyRW50cnkpKSB7CisJCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9SRU9SREVSLAorCQkJCQkgICAgICIlcygpOiBEdXBsaWNhdGUgcGFja2V0IGlzICIKKwkJCQkJICAgICAiZHJvcHBlZCEhIEluZGljYXRlU2VxOiAlZCwgIgorCQkJCQkgICAgICJOZXdTZXE6ICVkXG4iLAorCQkJCQkgICAgX19mdW5jX18sIHBUUy0+UnhJbmRpY2F0ZVNlcSwKKwkJCQkJICAgIFNlcU51bSk7CisJCQkJbGlzdF9hZGRfdGFpbCgmcFJlb3JkZXJFbnRyeS0+TGlzdCwKKwkJCQkJICAgICAgJmllZWUtPlJ4UmVvcmRlcl9VbnVzZWRfTGlzdCk7IHsKKwkJCQkJaW50IGk7CisJCQkJCWZvciAoaSA9IDA7IGkgPCBwcnhiLT5ucl9zdWJmcmFtZXM7IGkrKykKKwkJCQkJCWRldl9rZnJlZV9za2IocHJ4Yi0+c3ViZnJhbWVzW2ldKTsKKwkJCQkJa2ZyZWUocHJ4Yik7CisJCQkJCXByeGIgPSBOVUxMOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9SRU9SREVSLAorCQkJCQkgIlBrdCBpbnNlcnQgaW50byBzdHJ1Y3QgYnVmZmVyISEgIgorCQkJCQkgIkluZGljYXRlU2VxOiAlZCwgTmV3U2VxOiAlZFxuIiwKKwkJCQkJIHBUUy0+UnhJbmRpY2F0ZVNlcSwgU2VxTnVtKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBQYWNrZXRzIGFyZSBkcm9wcGVkIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoIHJlb3JkZXIKKwkJCSAqIGVudHJpZXMuIFRoaXMgcGFydCBzaG91bGQgYmUgbW9kaWZpZWQhISBXZSBjYW4ganVzdAorCQkJICogaW5kaWNhdGUgYWxsIHRoZSBwYWNrZXRzIGluIHN0cnVjdCBidWZmZXIgYW5kIGdldAorCQkJICogcmVvcmRlciBlbnRyaWVzLgorCQkJICovCisJCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgIlJ4UmVvcmRlckluZGljYXRlUGFja2V0KCk6IgorCQkJCSAgICAgIiBUaGVyZSBpcyBubyByZW9yZGVyIGVudHJ5ISEgUGFja2V0IGlzICIKKwkJCQkgICAgICJkcm9wcGVkISFcbiIpOworCQkJeworCQkJCWludCBpOworCQkJCWZvciAoaSA9IDA7IGkgPCBwcnhiLT5ucl9zdWJmcmFtZXM7IGkrKykKKwkJCQkJZGV2X2tmcmVlX3NrYihwcnhiLT5zdWJmcmFtZXNbaV0pOworCQkJCWtmcmVlKHByeGIpOworCQkJCXByeGIgPSBOVUxMOworCQkJfQorCQl9CisJfQorCisJLyogQ2hlY2sgaWYgdGhlcmUgaXMgYW55IHBhY2tldCBuZWVkIGluZGljYXRlLiovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZwVFMtPlJ4UGVuZGluZ1BrdExpc3QpKSB7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfUkVPUkRFUiwgIiVzKCk6IHN0YXJ0IFJSRU9SREVSIGluZGljYXRlXG4iLCBfX2Z1bmNfXyk7CisKKwkJcFJlb3JkZXJFbnRyeSA9IChzdHJ1Y3QgcnhfcmVvcmRlcl9lbnRyeSAqKWxpc3RfZW50cnkocFRTLT5SeFBlbmRpbmdQa3RMaXN0LnByZXYsCisJCQkJIHN0cnVjdCByeF9yZW9yZGVyX2VudHJ5LCBMaXN0KTsKKwkJaWYgKFNOX0xFU1MocFJlb3JkZXJFbnRyeS0+U2VxTnVtLCBwVFMtPlJ4SW5kaWNhdGVTZXEpIHx8CisJCQkJU05fRVFVQUwocFJlb3JkZXJFbnRyeS0+U2VxTnVtLCBwVFMtPlJ4SW5kaWNhdGVTZXEpKSB7CisJCQkvKiBUaGlzIHByb3RlY3Qgc3RydWN0IGJ1ZmZlciBmcm9tIG92ZXJmbG93LiAqLworCQkJaWYgKGluZGV4ID49IFJFT1JERVJfV0lOX1NJWkUpIHsKKwkJCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgIlJ4UmVvcmRlckluZGljYXRlIgorCQkJCQkgICAgICJQYWNrZXQoKTogQnVmZmVyIG92ZXJmbG93ISFcbiIpOworCQkJCWJQa3RJbkJ1ZiA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWxpc3RfZGVsX2luaXQoJnBSZW9yZGVyRW50cnktPkxpc3QpOworCisJCQlpZiAoU05fRVFVQUwocFJlb3JkZXJFbnRyeS0+U2VxTnVtLCBwVFMtPlJ4SW5kaWNhdGVTZXEpKQorCQkJCXBUUy0+UnhJbmRpY2F0ZVNlcSA9IChwVFMtPlJ4SW5kaWNhdGVTZXEgKyAxKSAlIDQwOTY7CisKKwkJCWllZWUtPnByeGJJbmRpY2F0ZUFycmF5W2luZGV4XSA9IHBSZW9yZGVyRW50cnktPnByeGI7CisJCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX1JFT1JERVIsICIlcygpOiBJbmRpY2F0ZSBTZXFOdW0iCisJCQkJICAgICAiICVkIVxuIiwgX19mdW5jX18sIHBSZW9yZGVyRW50cnktPlNlcU51bSk7CisJCQlpbmRleCsrOworCisJCQlsaXN0X2FkZF90YWlsKCZwUmVvcmRlckVudHJ5LT5MaXN0LAorCQkJCSAgICAgICZpZWVlLT5SeFJlb3JkZXJfVW51c2VkX0xpc3QpOworCQl9IGVsc2UgeworCQkJYlBrdEluQnVmID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogSGFuZGxpbmcgcGVuZGluZyB0aW1lci4gU2V0IHRoaXMgdGltZXIgdG8gcHJldmVudCBmcm9tIGxvbmcgdGltZQorCSAqIFJ4IGJ1ZmZlcmluZy4qLworCWlmIChpbmRleCA+IDApIHsKKwkJaWYgKHRpbWVyX3BlbmRpbmcoJnBUUy0+UnhQa3RQZW5kaW5nVGltZXIpKQorCQkJZGVsX3RpbWVyX3N5bmMoJnBUUy0+UnhQa3RQZW5kaW5nVGltZXIpOworCQlwVFMtPlJ4VGltZW91dEluZGljYXRlU2VxID0gMHhmZmZmOworCisJCWlmIChpbmRleCA+IFJFT1JERVJfV0lOX1NJWkUpIHsKKwkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiUnhSZW9yZGVySW5kaWNhdGVQYWNrZXQoKToiCisJCQkJICAgICAiIFJ4IFJlb3JlciBzdHJ1Y3QgYnVmZmVyIGZ1bGwhIVxuIik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaWVlZS0+cmVvcmRlcl9zcGlubG9jayksCisJCQkJCSAgICAgICBmbGFncyk7CisJCQlyZXR1cm47CisJCX0KKwkJcnRsbGliX2luZGljYXRlX3BhY2tldHMoaWVlZSwgaWVlZS0+cHJ4YkluZGljYXRlQXJyYXksIGluZGV4KTsKKwkJYlBrdEluQnVmID0gZmFsc2U7CisJfQorCisJaWYgKGJQa3RJbkJ1ZiAmJiBwVFMtPlJ4VGltZW91dEluZGljYXRlU2VxID09IDB4ZmZmZikgeworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX1JFT1JERVIsICIlcygpOiBTRVQgcnggdGltZW91dCB0aW1lclxuIiwKKwkJCSAgICAgX19mdW5jX18pOworCQlwVFMtPlJ4VGltZW91dEluZGljYXRlU2VxID0gcFRTLT5SeEluZGljYXRlU2VxOworCQltb2RfdGltZXIoJnBUUy0+UnhQa3RQZW5kaW5nVGltZXIsIGppZmZpZXMgKworCQkJICBNU0VDUyhwSFRJbmZvLT5SeFJlb3JkZXJQZW5kaW5nVGltZSkpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaWVlZS0+cmVvcmRlcl9zcGlubG9jayksIGZsYWdzKTsKK30KKworc3RhdGljIHU4IHBhcnNlX3N1YmZyYW1lKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJIHN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKnJ4X3N0YXRzLAorCQkJIHN0cnVjdCBydGxsaWJfcnhiICpyeGIsIHU4ICpzcmMsIHU4ICpkc3QpCit7CisJc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgICpoZHIgPSAoc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgKilza2ItPmRhdGE7CisJdTE2CQlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKworCXUxNgkJTExDT2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBydGxsaWJfaGRyXzNhZGRyKTsKKwl1MTYJCUNoa0xlbmd0aDsKKwlib29sCQliSXNBZ2dyZWdhdGVGcmFtZSA9IGZhbHNlOworCXUxNgkJblN1YmZyYW1lX0xlbmd0aDsKKwl1OAkJblBhZGRpbmdfTGVuZ3RoID0gMDsKKwl1MTYJCVNlcU51bSA9IDA7CisJc3RydWN0IHNrX2J1ZmYgKnN1Yl9za2I7CisJdTgJICAgICAqZGF0YV9wdHI7CisJLyoganVzdCBmb3IgZGVidWcgcHVycG9zZSAqLworCVNlcU51bSA9IFdMQU5fR0VUX1NFUV9TRVEobGUxNl90b19jcHUoaGRyLT5zZXFfY3RsKSk7CisJaWYgKChSVExMSUJfUU9TX0hBU19TRVEoZmMpKSAmJgorCSAgICgoKHVuaW9uIGZyYW1lcW9zICopKHNrYi0+ZGF0YSArIFJUTExJQl8zQUREUl9MRU4pKS0+ZmllbGQucmVzZXJ2ZWQpKQorCQliSXNBZ2dyZWdhdGVGcmFtZSA9IHRydWU7CisKKwlpZiAoUlRMTElCX1FPU19IQVNfU0VRKGZjKSkKKwkJTExDT2Zmc2V0ICs9IDI7CisJaWYgKHJ4X3N0YXRzLT5iQ29udGFpbkhUQykKKwkJTExDT2Zmc2V0ICs9IHNIVENMbmc7CisKKwlDaGtMZW5ndGggPSBMTENPZmZzZXQ7CisKKwlpZiAoc2tiLT5sZW4gPD0gQ2hrTGVuZ3RoKQorCQlyZXR1cm4gMDsKKworCXNrYl9wdWxsKHNrYiwgTExDT2Zmc2V0KTsKKwlpZWVlLT5iSXNBZ2dyZWdhdGVGcmFtZSA9IGJJc0FnZ3JlZ2F0ZUZyYW1lOworCWlmICghYklzQWdncmVnYXRlRnJhbWUpIHsKKwkJcnhiLT5ucl9zdWJmcmFtZXMgPSAxOworCisJCS8qIGFsdGVyZWQgYnkgY2xhcmsgMy8zMC8yMDEwCisJCSAqIFRoZSBzdHJ1Y3QgYnVmZmVyIHNpemUgb2YgdGhlIHNrYiBpbmRpY2F0ZWQgdG8gdXBwZXIgbGF5ZXIKKwkJICogbXVzdCBiZSBsZXNzIHRoYW4gNTAwMCwgb3IgdGhlIGRlZnJhZ2VkIElQIGRhdGFncmFtCisJCSAqIGluIHRoZSBJUCBsYXllciB3aWxsIGV4Y2VlZCAiaXBmcmFnX2hpZ2hfdHJlc2giIGFuZCBiZQorCQkgKiBkaXNjYXJkZWQuIHNvIHRoZXJlIG11c3Qgbm90IHVzZSB0aGUgZnVuY3Rpb24KKwkJICogInNrYl9jb3B5IiBhbmQgInNrYl9jbG9uZSIgZm9yICJza2IiLgorCQkgKi8KKworCQkvKiBBbGxvY2F0ZSBuZXcgc2tiIGZvciByZWxlYXNpbmcgdG8gdXBwZXIgbGF5ZXIgKi8KKwkJc3ViX3NrYiA9IGRldl9hbGxvY19za2IoUlRMTElCX1NLQkJVRkZFUl9TSVpFKTsKKwkJc2tiX3Jlc2VydmUoc3ViX3NrYiwgMTIpOworCQlkYXRhX3B0ciA9ICh1OCAqKXNrYl9wdXQoc3ViX3NrYiwgc2tiLT5sZW4pOworCQltZW1jcHkoZGF0YV9wdHIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOworCQlzdWJfc2tiLT5kZXYgPSBpZWVlLT5kZXY7CisKKwkJcnhiLT5zdWJmcmFtZXNbMF0gPSBzdWJfc2tiOworCisJCW1lbWNweShyeGItPnNyYywgc3JjLCBFVEhfQUxFTik7CisJCW1lbWNweShyeGItPmRzdCwgZHN0LCBFVEhfQUxFTik7CisJCXJ4Yi0+c3ViZnJhbWVzWzBdLT5kZXYgPSBpZWVlLT5kZXY7CisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCXJ4Yi0+bnJfc3ViZnJhbWVzID0gMDsKKwkJbWVtY3B5KHJ4Yi0+c3JjLCBzcmMsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHJ4Yi0+ZHN0LCBkc3QsIEVUSF9BTEVOKTsKKwkJd2hpbGUgKHNrYi0+bGVuID4gRVRIRVJORVRfSEVBREVSX1NJWkUpIHsKKwkJCS8qIE9mZnNldCAxMiBkZW5vdGUgMiBtYWMgYWRkcmVzcyAqLworCQkJblN1YmZyYW1lX0xlbmd0aCA9ICooKHUxNiAqKShza2ItPmRhdGEgKyAxMikpOworCQkJblN1YmZyYW1lX0xlbmd0aCA9IChuU3ViZnJhbWVfTGVuZ3RoID4+IDgpICsKKwkJCQkJICAgKG5TdWJmcmFtZV9MZW5ndGggPDwgOCk7CisKKwkJCWlmIChza2ItPmxlbiA8IChFVEhFUk5FVF9IRUFERVJfU0laRSArIG5TdWJmcmFtZV9MZW5ndGgpKSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEEtTVNEVSBwYXJzZSBlcnJvciEhICIKKwkJCQkgICAgICAgInBSZmQtPm5Ub3RhbFN1YmZyYW1lIDogJWRcbiIsXAorCQkJCSAgICAgICBfX2Z1bmNfXywgcnhiLT5ucl9zdWJmcmFtZXMpOworCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBLU1TRFUgcGFyc2UgZXJyb3IhISAiCisJCQkJICAgICAgICJTdWJmcmFtZSBMZW5ndGg6ICVkXG4iLCBfX2Z1bmNfXywKKwkJCQkgICAgICAgblN1YmZyYW1lX0xlbmd0aCk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiblJlbWFpbl9MZW5ndGggaXMgJWQgYW5kICIKKwkJCQkgICAgICAgIm5TdWJmcmFtZV9MZW5ndGggaXMgOiAlZFxuIiwgc2tiLT5sZW4sCisJCQkJICAgICAgIG5TdWJmcmFtZV9MZW5ndGgpOworCQkJCXByaW50ayhLRVJOX0lORk8gIlRoZSBQYWNrZXQgU2VxTnVtIGlzICVkXG4iLCBTZXFOdW0pOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQkvKiBtb3ZlIHRoZSBkYXRhIHBvaW50IHRvIGRhdGEgY29udGVudCAqLworCQkJc2tiX3B1bGwoc2tiLCBFVEhFUk5FVF9IRUFERVJfU0laRSk7CisKKwkJCS8qIGFsdGVyZWQgYnkgY2xhcmsgMy8zMC8yMDEwCisJCQkgKiBUaGUgc3RydWN0IGJ1ZmZlciBzaXplIG9mIHRoZSBza2IgaW5kaWNhdGVkIHRvIHVwcGVyIGxheWVyCisJCQkgKiBtdXN0IGJlIGxlc3MgdGhhbiA1MDAwLCBvciB0aGUgZGVmcmFnZWQgSVAgZGF0YWdyYW0KKwkJCSAqIGluIHRoZSBJUCBsYXllciB3aWxsIGV4Y2VlZCAiaXBmcmFnX2hpZ2hfdHJlc2giIGFuZCBiZQorCQkJICogZGlzY2FyZGVkLiBzbyB0aGVyZSBtdXN0IG5vdCB1c2UgdGhlIGZ1bmN0aW9uCisJCQkgKiAic2tiX2NvcHkiIGFuZCAic2tiX2Nsb25lIiBmb3IgInNrYiIuCisJCQkgKi8KKworCQkJLyogQWxsb2NhdGUgbmV3IHNrYiBmb3IgcmVsZWFzaW5nIHRvIHVwcGVyIGxheWVyICovCisJCQlzdWJfc2tiID0gZGV2X2FsbG9jX3NrYihuU3ViZnJhbWVfTGVuZ3RoICsgMTIpOworCQkJc2tiX3Jlc2VydmUoc3ViX3NrYiwgMTIpOworCQkJZGF0YV9wdHIgPSAodTggKilza2JfcHV0KHN1Yl9za2IsIG5TdWJmcmFtZV9MZW5ndGgpOworCQkJbWVtY3B5KGRhdGFfcHRyLCBza2ItPmRhdGEsIG5TdWJmcmFtZV9MZW5ndGgpOworCisJCQlzdWJfc2tiLT5kZXYgPSBpZWVlLT5kZXY7CisJCQlyeGItPnN1YmZyYW1lc1tyeGItPm5yX3N1YmZyYW1lcysrXSA9IHN1Yl9za2I7CisJCQlpZiAocnhiLT5ucl9zdWJmcmFtZXMgPj0gTUFYX1NVQkZSQU1FX0NPVU5UKSB7CisJCQkJUlRMTElCX0RFQlVHX1JYKCJQYXJzZVN1YmZyYW1lKCk6IFRvbyBtYW55ICIKKwkJCQkJCSJTdWJmcmFtZXMhIFBhY2tldHMgZHJvcHBlZCFcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJc2tiX3B1bGwoc2tiLCBuU3ViZnJhbWVfTGVuZ3RoKTsKKworCQkJaWYgKHNrYi0+bGVuICE9IDApIHsKKwkJCQluUGFkZGluZ19MZW5ndGggPSA0IC0gKChuU3ViZnJhbWVfTGVuZ3RoICsKKwkJCQkJCSAgRVRIRVJORVRfSEVBREVSX1NJWkUpICUgNCk7CisJCQkJaWYgKG5QYWRkaW5nX0xlbmd0aCA9PSA0KQorCQkJCQluUGFkZGluZ19MZW5ndGggPSAwOworCisJCQkJaWYgKHNrYi0+bGVuIDwgblBhZGRpbmdfTGVuZ3RoKQorCQkJCQlyZXR1cm4gMDsKKworCQkJCXNrYl9wdWxsKHNrYiwgblBhZGRpbmdfTGVuZ3RoKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiByeGItPm5yX3N1YmZyYW1lczsKKwl9Cit9CisKKworc3RhdGljIHNpemVfdCBydGxsaWJfcnhfZ2V0X2hkcmxlbihzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgIHN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKnJ4X3N0YXRzKQoreworCXN0cnVjdCBydGxsaWJfaGRyXzRhZGRyICpoZHIgPSAoc3RydWN0IHJ0bGxpYl9oZHJfNGFkZHIgKilza2ItPmRhdGE7CisJdTE2IGZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCXNpemVfdCBoZHJsZW4gPSAwOworCisJaGRybGVuID0gcnRsbGliX2dldF9oZHJsZW4oZmMpOworCWlmIChIVENDaGVjayhpZWVlLCBza2ItPmRhdGEpKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9JTkZPICIlczogZmluZCBIVENDb250cm9sIVxuIiwgX19mdW5jX18pOworCQloZHJsZW4gKz0gNDsKKwkJcnhfc3RhdHMtPmJDb250YWluSFRDID0gMTsKKwl9CisKKwkgaWYgKFJUTExJQl9RT1NfSEFTX1NFUShmYykpCisJCXJ4X3N0YXRzLT5iSXNRb3NEYXRhID0gMTsKKworCXJldHVybiBoZHJsZW47Cit9CisKK3N0YXRpYyBpbnQgcnRsbGliX3J4X2NoZWNrX2R1cGxpY2F0ZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsIHU4IG11bHRpY2FzdCkKK3sKKwlzdHJ1Y3QgcnRsbGliX2hkcl80YWRkciAqaGRyID0gKHN0cnVjdCBydGxsaWJfaGRyXzRhZGRyICopc2tiLT5kYXRhOworCXUxNiBmYywgc2M7CisJdTggZnJhZywgdHlwZSwgc3R5cGU7CisKKwlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKwl0eXBlID0gV0xBTl9GQ19HRVRfVFlQRShmYyk7CisJc3R5cGUgPSBXTEFOX0ZDX0dFVF9TVFlQRShmYyk7CisJc2MgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdGwpOworCWZyYWcgPSBXTEFOX0dFVF9TRVFfRlJBRyhzYyk7CisKKwlpZiAoKGllZWUtPnBIVEluZm8tPmJDdXJSeFJlb3JkZXJFbmFibGUgPT0gZmFsc2UpIHx8CisJCSFpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlIHx8CisJCSFJc0RhdGFGcmFtZShza2ItPmRhdGEpIHx8CisJCUlzTGVnYWN5RGF0YUZyYW1lKHNrYi0+ZGF0YSkpIHsKKwkJaWYgKCEoKHR5cGUgPT0gUlRMTElCX0ZUWVBFX01HTVQpICYmIChzdHlwZSA9PSBSVExMSUJfU1RZUEVfQkVBQ09OKSkpIHsKKwkJCWlmIChpc19kdXBsaWNhdGVfcGFja2V0KGllZWUsIGhkcikpCisJCQkJcmV0dXJuIC0xOworCQl9CisJfSBlbHNlIHsKKwkJc3RydWN0IHJ4X3RzX3JlY29yZCAqcFJ4VFMgPSBOVUxMOworCQlpZiAoR2V0VHMoaWVlZSwgKHN0cnVjdCB0c19jb21tb25faW5mbyAqKikgJnBSeFRTLCBoZHItPmFkZHIyLAorCQkJKHU4KUZyYW1lX1FvU1RJRCgodTggKikoc2tiLT5kYXRhKSksIFJYX0RJUiwgdHJ1ZSkpIHsKKwkJCWlmICgoZmMgJiAoMTw8MTEpKSAmJiAoZnJhZyA9PSBwUnhUUy0+UnhMYXN0RnJhZ051bSkgJiYKKwkJCSAgICAoV0xBTl9HRVRfU0VRX1NFUShzYykgPT0gcFJ4VFMtPlJ4TGFzdFNlcU51bSkpIHsKKwkJCQlyZXR1cm4gLTE7CisJCQl9IGVsc2UgeworCQkJCXBSeFRTLT5SeExhc3RGcmFnTnVtID0gZnJhZzsKKwkJCQlwUnhUUy0+UnhMYXN0U2VxTnVtID0gV0xBTl9HRVRfU0VRX1NFUShzYyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgIkVSUiEhJXMoKTogTm8gVFMhISBTa2lwIgorCQkJCSAgICAgIiB0aGUgY2hlY2shIVxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bGxpYl9yeF9leHRyYWN0X2FkZHIoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkJICAgc3RydWN0IHJ0bGxpYl9oZHJfNGFkZHIgKmhkciwgdTggKmRzdCwKKwkJCQkgICB1OCAqc3JjLCB1OCAqYnNzaWQpCit7CisJdTE2IGZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCisJc3dpdGNoIChmYyAmIChSVExMSUJfRkNUTF9GUk9NRFMgfCBSVExMSUJfRkNUTF9UT0RTKSkgeworCWNhc2UgUlRMTElCX0ZDVExfRlJPTURTOgorCQltZW1jcHkoZHN0LCBoZHItPmFkZHIxLCBFVEhfQUxFTik7CisJCW1lbWNweShzcmMsIGhkci0+YWRkcjMsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGJzc2lkLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7CisJCWJyZWFrOworCWNhc2UgUlRMTElCX0ZDVExfVE9EUzoKKwkJbWVtY3B5KGRzdCwgaGRyLT5hZGRyMywgRVRIX0FMRU4pOworCQltZW1jcHkoc3JjLCBoZHItPmFkZHIyLCBFVEhfQUxFTik7CisJCW1lbWNweShic3NpZCwgaGRyLT5hZGRyMSwgRVRIX0FMRU4pOworCQlicmVhazsKKwljYXNlIFJUTExJQl9GQ1RMX0ZST01EUyB8IFJUTExJQl9GQ1RMX1RPRFM6CisJCW1lbWNweShkc3QsIGhkci0+YWRkcjMsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNyYywgaGRyLT5hZGRyNCwgRVRIX0FMRU4pOworCQltZW1jcHkoYnNzaWQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCQlicmVhazsKKwljYXNlIDA6CisJCW1lbWNweShkc3QsIGhkci0+YWRkcjEsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNyYywgaGRyLT5hZGRyMiwgRVRIX0FMRU4pOworCQltZW1jcHkoYnNzaWQsIGhkci0+YWRkcjMsIEVUSF9BTEVOKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IHJ0bGxpYl9yeF9kYXRhX2ZpbHRlcihzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTE2IGZjLAorCQkJCSB1OCAqZHN0LCB1OCAqc3JjLCB1OCAqYnNzaWQsIHU4ICphZGRyMikKK3sKKwl1OCB6ZXJvX2FkZHJbRVRIX0FMRU5dID0gezB9OworCXU4IHR5cGUsIHN0eXBlOworCisJdHlwZSA9IFdMQU5fRkNfR0VUX1RZUEUoZmMpOworCXN0eXBlID0gV0xBTl9GQ19HRVRfU1RZUEUoZmMpOworCisJLyogRmlsdGVyIGZyYW1lcyBmcm9tIGRpZmZlcmVudCBCU1MgKi8KKwlpZiAoKChmYyAmIFJUTExJQl9GQ1RMX0RTVE9EUykgIT0gUlRMTElCX0ZDVExfRFNUT0RTKQorCQkmJiAoY29tcGFyZV9ldGhlcl9hZGRyKGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgYnNzaWQpICE9IDApCisJCSYmIG1lbWNtcChpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIHplcm9fYWRkciwgRVRIX0FMRU4pKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBGaWx0ZXIgcGFja2V0cyBzZW50IGJ5IGFuIFNUQSB0aGF0IHdpbGwgYmUgZm9yd2FyZGVkIGJ5IEFQICovCisJaWYgKGllZWUtPkludGVsUHJvbWlzY3VvdXNNb2RlSW5mby5iUHJvbWlzY3VvdXNPbiAgJiYKKwkJaWVlZS0+SW50ZWxQcm9taXNjdW91c01vZGVJbmZvLmJGaWx0ZXJTb3VyY2VTdGF0aW9uRnJhbWUpIHsKKwkJaWYgKChmYyAmIFJUTExJQl9GQ1RMX1RPRFMpICYmICEoZmMgJiBSVExMSUJfRkNUTF9GUk9NRFMpICYmCisJCQkoY29tcGFyZV9ldGhlcl9hZGRyKGRzdCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkKSAhPSAwKSAmJgorCQkJKGNvbXBhcmVfZXRoZXJfYWRkcihic3NpZCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkKSA9PSAwKSkgeworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJLyogTnVsbGZ1bmMgZnJhbWVzIG1heSBoYXZlIFBTLWJpdCBzZXQsIHNvIHRoZXkgbXVzdCBiZSBwYXNzZWQgdG8KKwkgKiBob3N0YXBfaGFuZGxlX3N0YV9yeCgpIGJlZm9yZSBiZWluZyBkcm9wcGVkIGhlcmUuICovCisJaWYgKCFpZWVlLT5JbnRlbFByb21pc2N1b3VzTW9kZUluZm8uYlByb21pc2N1b3VzT24pIHsKKwkJaWYgKHN0eXBlICE9IFJUTExJQl9TVFlQRV9EQVRBICYmCisJCSAgICBzdHlwZSAhPSBSVExMSUJfU1RZUEVfREFUQV9DRkFDSyAmJgorCQkgICAgc3R5cGUgIT0gUlRMTElCX1NUWVBFX0RBVEFfQ0ZQT0xMICYmCisJCSAgICBzdHlwZSAhPSBSVExMSUJfU1RZUEVfREFUQV9DRkFDS1BPTEwgJiYKKwkJICAgIHN0eXBlICE9IFJUTExJQl9TVFlQRV9RT1NfREFUQSkgeworCQkJaWYgKHN0eXBlICE9IFJUTExJQl9TVFlQRV9OVUxMRlVOQykKKwkJCQlSVExMSUJfREVCVUdfRFJPUCgKKwkJCQkJIlJYOiBkcm9wcGVkIGRhdGEgZnJhbWUgIgorCQkJCQkid2l0aCBubyBkYXRhICh0eXBlPTB4JTAyeCwgIgorCQkJCQkic3VidHlwZT0weCUwMngpXG4iLAorCQkJCQl0eXBlLCBzdHlwZSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlpZiAoaWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX01FU0gpIHsKKwkJLyogcGFja2V0cyBmcm9tIG91ciBhZGFwdGVyIGFyZSBkcm9wcGVkIChlY2hvKSAqLworCQlpZiAoIW1lbWNtcChzcmMsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSkKKwkJCXJldHVybiAtMTsKKworCQkvKiB7YnJvYWQsbXVsdGl9Y2FzdCBwYWNrZXRzIHRvIG91ciBCU1MgZ28gdGhyb3VnaCAqLworCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZHN0KSB8fCBpc19icm9hZGNhc3RfZXRoZXJfYWRkcihkc3QpKSB7CisJCQlpZiAobWVtY21wKGJzc2lkLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKSkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRsbGliX3J4X2dldF9jcnlwdChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBydGxsaWJfY3J5cHRfZGF0YSAqKmNyeXB0LCBzaXplX3QgaGRybGVuKQoreworCXN0cnVjdCBydGxsaWJfaGRyXzRhZGRyICpoZHIgPSAoc3RydWN0IHJ0bGxpYl9oZHJfNGFkZHIgKilza2ItPmRhdGE7CisJdTE2IGZjID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jdGwpOworCWludCBpZHggPSAwOworCisJaWYgKGllZWUtPmhvc3RfZGVjcnlwdCkgeworCQlpZiAoc2tiLT5sZW4gPj0gaGRybGVuICsgMykKKwkJCWlkeCA9IHNrYi0+ZGF0YVtoZHJsZW4gKyAzXSA+PiA2OworCisJCSpjcnlwdCA9IGllZWUtPmNyeXB0W2lkeF07CisJCS8qIGFsbG93IE5VTEwgZGVjcnlwdCB0byBpbmRpY2F0ZSBhbiBzdGF0aW9uIHNwZWNpZmljIG92ZXJyaWRlCisJCSAqIGZvciBkZWZhdWx0IGVuY3J5cHRpb24gKi8KKwkJaWYgKCpjcnlwdCAmJiAoKCpjcnlwdCktPm9wcyA9PSBOVUxMIHx8CisJCQkgICAgICAoKmNyeXB0KS0+b3BzLT5kZWNyeXB0X21wZHUgPT0gTlVMTCkpCisJCQkqY3J5cHQgPSBOVUxMOworCisJCWlmICghKmNyeXB0ICYmIChmYyAmIFJUTExJQl9GQ1RMX1dFUCkpIHsKKwkJCS8qIFRoaXMgc2VlbXMgdG8gYmUgdHJpZ2dlcmVkIGJ5IHNvbWUgKG11bHRpY2FzdD8pCisJCQkgKiBmcmFtZXMgZnJvbSBvdGhlciB0aGFuIGN1cnJlbnQgQlNTLCBzbyBqdXN0IGRyb3AgdGhlCisJCQkgKiBmcmFtZXMgc2lsZW50bHkgaW5zdGVhZCBvZiBmaWxsaW5nIHN5c3RlbSBsb2cgd2l0aAorCQkJICogdGhlc2UgcmVwb3J0cy4gKi8KKwkJCVJUTExJQl9ERUJVR19EUk9QKCJEZWNyeXB0aW9uIGZhaWxlZCAobm90IHNldCkiCisJCQkJCSAgICAgIiAoU0E9ICVwTSlcbiIsCisJCQkJCSAgICAgaGRyLT5hZGRyMik7CisJCQlpZWVlLT5pZWVlX3N0YXRzLnJ4X2Rpc2NhcmRzX3VuZGVjcnlwdGFibGUrKzsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0bGxpYl9yeF9kZWNyeXB0KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICBzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpyeF9zdGF0cywKKwkJICAgICAgc3RydWN0IHJ0bGxpYl9jcnlwdF9kYXRhICpjcnlwdCwgc2l6ZV90IGhkcmxlbikKK3sKKwlzdHJ1Y3QgcnRsbGliX2hkcl80YWRkciAqaGRyOworCWludCBrZXlpZHggPSAwOworCXUxNiBmYywgc2M7CisJdTggZnJhZzsKKworCWhkciA9IChzdHJ1Y3QgcnRsbGliX2hkcl80YWRkciAqKXNrYi0+ZGF0YTsKKwlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKwlzYyA9IGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0bCk7CisJZnJhZyA9IFdMQU5fR0VUX1NFUV9GUkFHKHNjKTsKKworCWlmICgoIXJ4X3N0YXRzLT5EZWNyeXB0ZWQpKQorCQlpZWVlLT5uZWVkX3N3X2VuYyA9IDE7CisJZWxzZQorCQlpZWVlLT5uZWVkX3N3X2VuYyA9IDA7CisKKwlrZXlpZHggPSBydGxsaWJfcnhfZnJhbWVfZGVjcnlwdChpZWVlLCBza2IsIGNyeXB0KTsKKwlpZiAoaWVlZS0+aG9zdF9kZWNyeXB0ICYmIChmYyAmIFJUTExJQl9GQ1RMX1dFUCkgJiYgKGtleWlkeCA8IDApKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzOiBkZWNyeXB0IGZyYW1lIGVycm9yXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtMTsKKwl9CisKKwloZHIgPSAoc3RydWN0IHJ0bGxpYl9oZHJfNGFkZHIgKikgc2tiLT5kYXRhOworCWlmICgoZnJhZyAhPSAwIHx8IChmYyAmIFJUTExJQl9GQ1RMX01PUkVGUkFHUykpKSB7CisJCWludCBmbGVuOworCQlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZ19za2IgPSBydGxsaWJfZnJhZ19jYWNoZV9nZXQoaWVlZSwgaGRyKTsKKwkJUlRMTElCX0RFQlVHX0ZSQUcoIlJ4IEZyYWdtZW50IHJlY2VpdmVkICgldSlcbiIsIGZyYWcpOworCisJCWlmICghZnJhZ19za2IpIHsKKwkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfUlggfCBSVExMSUJfRExfRlJBRywKKwkJCQkJIlJ4IGNhbm5vdCBnZXQgc2tiIGZyb20gZnJhZ21lbnQgIgorCQkJCQkiY2FjaGUgKG1vcmVmcmFnPSVkIHNlcT0ldSBmcmFnPSV1KVxuIiwKKwkJCQkJKGZjICYgUlRMTElCX0ZDVExfTU9SRUZSQUdTKSAhPSAwLAorCQkJCQlXTEFOX0dFVF9TRVFfU0VRKHNjKSwgZnJhZyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZmxlbiA9IHNrYi0+bGVuOworCQlpZiAoZnJhZyAhPSAwKQorCQkJZmxlbiAtPSBoZHJsZW47CisKKwkJaWYgKGZyYWdfc2tiLT50YWlsICsgZmxlbiA+IGZyYWdfc2tiLT5lbmQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBob3N0IGRlY3J5cHRlZCBhbmQgIgorCQkJICAgICAgICJyZWFzc2VtYmxlZCBmcmFtZSBkaWQgbm90IGZpdCBza2JcbiIsCisJCQkgICAgICAgX19mdW5jX18pOworCQkJcnRsbGliX2ZyYWdfY2FjaGVfaW52YWxpZGF0ZShpZWVlLCBoZHIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKGZyYWcgPT0gMCkgeworCQkJLyogY29weSBmaXJzdCBmcmFnbWVudCAoaW5jbHVkaW5nIGZ1bGwgaGVhZGVycykgaW50bworCQkJICogYmVnaW5uaW5nIG9mIHRoZSBmcmFnbWVudCBjYWNoZSBza2IgKi8KKwkJCW1lbWNweShza2JfcHV0KGZyYWdfc2tiLCBmbGVuKSwgc2tiLT5kYXRhLCBmbGVuKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGFwcGVuZCBmcmFtZSBwYXlsb2FkIHRvIHRoZSBlbmQgb2YgdGhlIGZyYWdtZW50CisJCQkgKiBjYWNoZSBza2IgKi8KKwkJCW1lbWNweShza2JfcHV0KGZyYWdfc2tiLCBmbGVuKSwgc2tiLT5kYXRhICsgaGRybGVuLAorCQkJICAgICAgIGZsZW4pOworCQl9CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXNrYiA9IE5VTEw7CisKKwkJaWYgKGZjICYgUlRMTElCX0ZDVExfTU9SRUZSQUdTKSB7CisJCQkvKiBtb3JlIGZyYWdtZW50cyBleHBlY3RlZCAtIGxlYXZlIHRoZSBza2IgaW4gZnJhZ21lbnQKKwkJCSAqIGNhY2hlIGZvciBub3c7IGl0IHdpbGwgYmUgZGVsaXZlcmVkIHRvIHVwcGVyIGxheWVycworCQkJICogYWZ0ZXIgYWxsIGZyYWdtZW50cyBoYXZlIGJlZW4gcmVjZWl2ZWQgKi8KKwkJCXJldHVybiAtMjsKKwkJfQorCisJCS8qIHRoaXMgd2FzIHRoZSBsYXN0IGZyYWdtZW50IGFuZCB0aGUgZnJhbWUgd2lsbCBiZQorCQkgKiBkZWxpdmVyZWQsIHNvIHJlbW92ZSBza2IgZnJvbSBmcmFnbWVudCBjYWNoZSAqLworCQlza2IgPSBmcmFnX3NrYjsKKwkJaGRyID0gKHN0cnVjdCBydGxsaWJfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKwkJcnRsbGliX2ZyYWdfY2FjaGVfaW52YWxpZGF0ZShpZWVlLCBoZHIpOworCX0KKworCS8qIHNrYjogaGRyICsgKHBvc3NpYmxlIHJlYXNzZW1ibGVkKSBmdWxsIE1TRFUgcGF5bG9hZDsgcG9zc2libHkgc3RpbGwKKwkgKiBlbmNyeXB0ZWQvYXV0aGVudGljYXRlZCAqLworCWlmIChpZWVlLT5ob3N0X2RlY3J5cHQgJiYgKGZjICYgUlRMTElCX0ZDVExfV0VQKSAmJgorCQlydGxsaWJfcnhfZnJhbWVfZGVjcnlwdF9tc2R1KGllZWUsIHNrYiwga2V5aWR4LCBjcnlwdCkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ID09PmRlY3J5cHQgbXNkdSBlcnJvclxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCisJaGRyID0gKHN0cnVjdCBydGxsaWJfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKKwlpZiAoY3J5cHQgJiYgIShmYyAmIFJUTExJQl9GQ1RMX1dFUCkgJiYgIWllZWUtPm9wZW5fd2VwKSB7CisJCWlmICgvKmllZWUtPmllZWU4MDJfMXggJiYqLworCQkgICAgcnRsbGliX2lzX2VhcG9sX2ZyYW1lKGllZWUsIHNrYiwgaGRybGVuKSkgeworCisJCQkvKiBwYXNzIHVuZW5jcnlwdGVkIEVBUE9MIGZyYW1lcyBldmVuIGlmIGVuY3J5cHRpb24gaXMKKwkJCSAqIGNvbmZpZ3VyZWQgKi8KKwkJCXN0cnVjdCBlYXBvbCAqZWFwID0gKHN0cnVjdCBlYXBvbCAqKShza2ItPmRhdGEgKworCQkJCTI0KTsKKwkJCVJUTExJQl9ERUJVR19FQVAoIlJYOiBJRUVFIDgwMi4xWCBFQVBPTCBmcmFtZTogJXNcbiIsCisJCQkJCQllYXBfZ2V0X3R5cGUoZWFwLT50eXBlKSk7CisJCX0gZWxzZSB7CisJCQlSVExMSUJfREVCVUdfRFJPUCgKKwkJCQkiZW5jcnlwdGlvbiBjb25maWd1cmVkLCBidXQgUlggIgorCQkJCSJmcmFtZSBub3QgZW5jcnlwdGVkIChTQT0gJXBNKVxuIiwKKwkJCQloZHItPmFkZHIyKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChjcnlwdCAmJiAhKGZjICYgUlRMTElCX0ZDVExfV0VQKSAmJgorCSAgICBydGxsaWJfaXNfZWFwb2xfZnJhbWUoaWVlZSwgc2tiLCBoZHJsZW4pKSB7CisJCQlzdHJ1Y3QgZWFwb2wgKmVhcCA9IChzdHJ1Y3QgZWFwb2wgKikoc2tiLT5kYXRhICsKKwkJCQkyNCk7CisJCQlSVExMSUJfREVCVUdfRUFQKCJSWDogSUVFRSA4MDIuMVggRUFQT0wgZnJhbWU6ICVzXG4iLAorCQkJCQkJZWFwX2dldF90eXBlKGVhcC0+dHlwZSkpOworCX0KKworCWlmIChjcnlwdCAmJiAhKGZjICYgUlRMTElCX0ZDVExfV0VQKSAmJiAhaWVlZS0+b3Blbl93ZXAgJiYKKwkgICAgIXJ0bGxpYl9pc19lYXBvbF9mcmFtZShpZWVlLCBza2IsIGhkcmxlbikpIHsKKwkJUlRMTElCX0RFQlVHX0RST1AoCisJCQkiZHJvcHBlZCB1bmVuY3J5cHRlZCBSWCBkYXRhICIKKwkJCSJmcmFtZSBmcm9tICVwTSIKKwkJCSIgKGRyb3BfdW5lbmNyeXB0ZWQ9MSlcbiIsCisJCQloZHItPmFkZHIyKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChydGxsaWJfaXNfZWFwb2xfZnJhbWUoaWVlZSwgc2tiLCBoZHJsZW4pKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJSWDogSUVFRTgwMi4xWCBFQVBPTCBmcmFtZSFcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bGxpYl9yeF9jaGVja19sZWF2ZV9scHMoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHU4IHVuaWNhc3QsIHU4IG5yX3N1YmZyYW1lcykKK3sKKwlpZiAodW5pY2FzdCkgeworCisJCWlmICgoaWVlZS0+c3RhdGUgPT0gUlRMTElCX0xJTktFRCkpIHsKKwkJCWlmICgoKGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJ4VW5pY2FzdE9rSW5QZXJpb2QgKworCQkJICAgIGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVR4T2tJblBlcmlvZCkgPiA4KSB8fAorCQkJICAgIChpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SeFVuaWNhc3RPa0luUGVyaW9kID4gMikpIHsKKwkJCQlpZiAoaWVlZS0+TGVpc3VyZVBTTGVhdmUpCisJCQkJCWllZWUtPkxlaXN1cmVQU0xlYXZlKGllZWUtPmRldik7CisJCQl9CisJCX0KKwl9CisJaWVlZS0+bGFzdF9yeF9wc190aW1lID0gamlmZmllczsKK30KKworc3RhdGljIHZvaWQgcnRsbGliX3J4X2luZGljYXRlX3BrdF9sZWdhY3koc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCXN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKnJ4X3N0YXRzLAorCQlzdHJ1Y3QgcnRsbGliX3J4YiAqcnhiLAorCQl1OCAqZHN0LAorCQl1OCAqc3JjKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CisJdTE2IGV0aGVydHlwZTsKKwlpbnQgaSA9IDA7CisKKwlpZiAocnhiID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJ4YiBpcyBOVUxMISFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcnhiLT5ucl9zdWJmcmFtZXM7IGkrKykgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc3ViX3NrYiA9IHJ4Yi0+c3ViZnJhbWVzW2ldOworCisJCWlmIChzdWJfc2tiKSB7CisJCQkvKiBjb252ZXJ0IGhkciArIHBvc3NpYmxlIExMQyBoZWFkZXJzIGludG8gRXRoZXJuZXQgaGVhZGVyICovCisJCQlldGhlcnR5cGUgPSAoc3ViX3NrYi0+ZGF0YVs2XSA8PCA4KSB8IHN1Yl9za2ItPmRhdGFbN107CisJCQlpZiAoc3ViX3NrYi0+bGVuID49IDggJiYKKwkJCQkoKG1lbWNtcChzdWJfc2tiLT5kYXRhLCByZmMxMDQyX2hlYWRlciwgU05BUF9TSVpFKSA9PSAwICYmCisJCQkJZXRoZXJ0eXBlICE9IEVUSF9QX0FBUlAgJiYgZXRoZXJ0eXBlICE9IEVUSF9QX0lQWCkgfHwKKwkJCQltZW1jbXAoc3ViX3NrYi0+ZGF0YSwgYnJpZGdlX3R1bm5lbF9oZWFkZXIsIFNOQVBfU0laRSkgPT0gMCkpIHsKKwkJCQkvKiByZW1vdmUgUkZDMTA0MiBvciBCcmlkZ2UtVHVubmVsIGVuY2Fwc3VsYXRpb24gYW5kCisJCQkJICogcmVwbGFjZSBFdGhlclR5cGUgKi8KKwkJCQlza2JfcHVsbChzdWJfc2tiLCBTTkFQX1NJWkUpOworCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIHNyYywgRVRIX0FMRU4pOworCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIGRzdCwgRVRIX0FMRU4pOworCQkJfSBlbHNlIHsKKwkJCQl1MTYgbGVuOworCQkJCS8qIExlYXZlIEV0aGVybmV0IGhlYWRlciBwYXJ0IG9mIGhkciBhbmQgZnVsbCBwYXlsb2FkICovCisJCQkJbGVuID0gaHRvbnMoc3ViX3NrYi0+bGVuKTsKKwkJCQltZW1jcHkoc2tiX3B1c2goc3ViX3NrYiwgMiksICZsZW4sIDIpOworCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIHNyYywgRVRIX0FMRU4pOworCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIGRzdCwgRVRIX0FMRU4pOworCQkJfQorCisJCQlpZWVlLT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlpZWVlLT5zdGF0cy5yeF9ieXRlcyArPSBzdWJfc2tiLT5sZW47CisKKwkJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkc3QpKQorCQkJCWllZWUtPnN0YXRzLm11bHRpY2FzdCsrOworCisJCQkvKiBJbmRpY2F0IHRoZSBwYWNrZXRzIHRvIHVwcGVyIGxheWVyICovCisJCQltZW1zZXQoc3ViX3NrYi0+Y2IsIDAsIHNpemVvZihzdWJfc2tiLT5jYikpOworCQkJc3ViX3NrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhzdWJfc2tiLCBkZXYpOworCQkJc3ViX3NrYi0+ZGV2ID0gZGV2OworCQkJc3ViX3NrYi0+ZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJCQlzdWJfc2tiLT5kZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHN1Yl9za2ItPmxlbjsKKwkJCXN1Yl9za2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7IC8qIDgwMi4xMSBjcmMgbm90IHN1ZmZpY2llbnQgKi8KKwkJCW5ldGlmX3J4KHN1Yl9za2IpOworCQl9CisJfQorCWtmcmVlKHJ4Yik7CisJcnhiID0gTlVMTDsKK30KKworc3RhdGljIGludCBydGxsaWJfcnhfSW5mcmFBZGhvYyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJIHN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKnJ4X3N0YXRzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpZWVlLT5kZXY7CisJc3RydWN0IHJ0bGxpYl9oZHJfNGFkZHIgKmhkciA9IChzdHJ1Y3QgcnRsbGliX2hkcl80YWRkciAqKXNrYi0+ZGF0YTsKKwlzdHJ1Y3QgcnRsbGliX2NyeXB0X2RhdGEgKmNyeXB0ID0gTlVMTDsKKwlzdHJ1Y3QgcnRsbGliX3J4YiAqcnhiID0gTlVMTDsKKwlzdHJ1Y3QgcnhfdHNfcmVjb3JkICpwVFMgPSBOVUxMOworCXUxNiBmYywgc2MsIFNlcU51bSA9IDA7CisJdTggdHlwZSwgc3R5cGUsIG11bHRpY2FzdCA9IDAsIHVuaWNhc3QgPSAwLCBucl9zdWJmcmFtZXMgPSAwLCBUSUQgPSAwOworCXU4IGRzdFtFVEhfQUxFTl0sIHNyY1tFVEhfQUxFTl0sIGJzc2lkW0VUSF9BTEVOXSA9IHswfSwgKnBheWxvYWQ7CisJc2l6ZV90IGhkcmxlbiA9IDA7CisJYm9vbCBiVG9PdGhlclNUQSA9IGZhbHNlOworCWludCByZXQgPSAwLCBpID0gMDsKKworCWhkciA9IChzdHJ1Y3QgcnRsbGliX2hkcl80YWRkciAqKXNrYi0+ZGF0YTsKKwlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKwl0eXBlID0gV0xBTl9GQ19HRVRfVFlQRShmYyk7CisJc3R5cGUgPSBXTEFOX0ZDX0dFVF9TVFlQRShmYyk7CisJc2MgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdGwpOworCisJLypGaWx0ZXIgcGt0IG5vdCB0byBtZSovCisJbXVsdGljYXN0ID0gaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSl8aXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSk7CisJdW5pY2FzdCA9ICFtdWx0aWNhc3Q7CisJaWYgKHVuaWNhc3QgJiYgKGNvbXBhcmVfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyLCBoZHItPmFkZHIxKSAhPSAwKSkgeworCQlpZiAoaWVlZS0+Yk5ldFByb21pc2N1b3VzTW9kZSkKKwkJCWJUb090aGVyU1RBID0gdHJ1ZTsKKwkJZWxzZQorCQkJZ290byByeF9kcm9wcGVkOworCX0KKworCS8qRmlsdGVyIHBrdCBoYXMgdG9vIHNtYWxsIGxlbmd0aCAqLworCWhkcmxlbiA9IHJ0bGxpYl9yeF9nZXRfaGRybGVuKGllZWUsIHNrYiwgcnhfc3RhdHMpOworCWlmIChza2ItPmxlbiA8IGhkcmxlbikgeworCQlwcmludGsoS0VSTl9JTkZPICIlcygpOkVSUiEhISBza2ItPmxlbiBpcyBzbWFsbGVyIHRoYW4gaGRybGVuXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisKKwkvKiBGaWx0ZXIgRHVwbGljYXRlIHBrdCAqLworCXJldCA9IHJ0bGxpYl9yeF9jaGVja19kdXBsaWNhdGUoaWVlZSwgc2tiLCBtdWx0aWNhc3QpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHJ4X2Ryb3BwZWQ7CisKKwkvKiBGaWx0ZXIgQ1RSTCBGcmFtZSAqLworCWlmICh0eXBlID09IFJUTExJQl9GVFlQRV9DVEwpCisJCWdvdG8gcnhfZHJvcHBlZDsKKworCS8qIEZpbHRlciBNR05UIEZyYW1lICovCisJaWYgKHR5cGUgPT0gUlRMTElCX0ZUWVBFX01HTVQpIHsKKwkJaWYgKGJUb090aGVyU1RBKQorCQkJZ290byByeF9kcm9wcGVkOworCQlpZiAocnRsbGliX3J4X2ZyYW1lX21nbXQoaWVlZSwgc2tiLCByeF9zdGF0cywgdHlwZSwgc3R5cGUpKQorCQkJZ290byByeF9kcm9wcGVkOworCQllbHNlCisJCQlnb3RvIHJ4X2V4aXQ7CisJfQorCisJLyogRmlsdGVyIFdBUEkgREFUQSBGcmFtZSAqLworCisJLyogVXBkYXRlIHN0YXRzdGljcyBmb3IgQVAgcm9hbWluZyAqLworCWlmICghYlRvT3RoZXJTVEEpIHsKKwkJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkRhdGFJblBlcmlvZCsrOworCQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SeE9rSW5QZXJpb2QrKzsKKwl9CisJZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKworCS8qIERhdGEgZnJhbWUgLSBleHRyYWN0IHNyYy9kc3QgYWRkcmVzc2VzICovCisJcnRsbGliX3J4X2V4dHJhY3RfYWRkcihpZWVlLCBoZHIsIGRzdCwgc3JjLCBic3NpZCk7CisKKwkvKiBGaWx0ZXIgRGF0YSBmcmFtZXMgKi8KKwlyZXQgPSBydGxsaWJfcnhfZGF0YV9maWx0ZXIoaWVlZSwgZmMsIGRzdCwgc3JjLCBic3NpZCwgaGRyLT5hZGRyMik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gcnhfZHJvcHBlZDsKKworCWlmIChza2ItPmxlbiA9PSBoZHJsZW4pCisJCWdvdG8gcnhfZHJvcHBlZDsKKworCS8qIFNlbmQgcHNwb2xsIGJhc2VkIG9uIG1vcmVkYXRhICovCisJaWYgKChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpICAmJiAoaWVlZS0+c3RhX3NsZWVwID09IExQU19JU19TTEVFUCkKKwkJJiYgKGllZWUtPnBvbGxpbmcpICYmICghYlRvT3RoZXJTVEEpKSB7CisJCWlmIChXTEFOX0ZDX01PUkVfREFUQShmYykpIHsKKwkJCS8qIG1vcmUgZGF0YSBiaXQgaXMgc2V0LCBsZXQncyByZXF1ZXN0IGEgbmV3IGZyYW1lIGZyb20gdGhlIEFQICovCisJCQlydGxsaWJfc3RhX3BzX3NlbmRfcHNwb2xsX2ZyYW1lKGllZWUpOworCQl9IGVsc2UgeworCQkJaWVlZS0+cG9sbGluZyA9ICBmYWxzZTsKKwkJfQorCX0KKworCS8qIEdldCBjcnlwdCBpZiBlbmNyeXB0ZWQgKi8KKwlyZXQgPSBydGxsaWJfcnhfZ2V0X2NyeXB0KGllZWUsIHNrYiwgJmNyeXB0LCBoZHJsZW4pOworCWlmIChyZXQgPT0gLTEpCisJCWdvdG8gcnhfZHJvcHBlZDsKKworCS8qIERlY3J5cHQgZGF0YSBmcmFtZSAoaW5jbHVkaW5nIHJlYXNzZW1ibGUpICovCisJcmV0ID0gcnRsbGliX3J4X2RlY3J5cHQoaWVlZSwgc2tiLCByeF9zdGF0cywgY3J5cHQsIGhkcmxlbik7CisJaWYgKHJldCA9PSAtMSkKKwkJZ290byByeF9kcm9wcGVkOworCWVsc2UgaWYgKHJldCA9PSAtMikKKwkJZ290byByeF9leGl0OworCisJLyogR2V0IFRTIGZvciBSeCBSZW9yZGVyICAqLworCWhkciA9IChzdHJ1Y3QgcnRsbGliX2hkcl80YWRkciAqKSBza2ItPmRhdGE7CisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUgJiYgSXNRb1NEYXRhRnJhbWUoc2tiLT5kYXRhKQorCQkmJiAhaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkgJiYgIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpCisJCSYmICghYlRvT3RoZXJTVEEpKSB7CisJCVRJRCA9IEZyYW1lX1FvU1RJRChza2ItPmRhdGEpOworCQlTZXFOdW0gPSBXTEFOX0dFVF9TRVFfU0VRKHNjKTsKKwkJR2V0VHMoaWVlZSwgKHN0cnVjdCB0c19jb21tb25faW5mbyAqKikgJnBUUywgaGRyLT5hZGRyMiwgVElELCBSWF9ESVIsIHRydWUpOworCQlpZiAoVElEICE9IDAgJiYgVElEICE9IDMpCisJCQlpZWVlLT5iaXNfYW55X25vbmJlcGt0cyA9IHRydWU7CisJfQorCisJLyogUGFyc2UgcnggZGF0YSBmcmFtZSAoRm9yIEFNU0RVKSAqLworCS8qIHNrYjogaGRyICsgKHBvc3NpYmxlIHJlYXNzZW1ibGVkKSBmdWxsIHBsYWludGV4dCBwYXlsb2FkICovCisJcGF5bG9hZCA9IHNrYi0+ZGF0YSArIGhkcmxlbjsKKwlyeGIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcnRsbGliX3J4YiksIEdGUF9BVE9NSUMpOworCWlmIChyeGIgPT0gTlVMTCkgeworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwKKwkJCSAgICAgIiVzKCk6IGttYWxsb2MgcnhiIGVycm9yXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisJLyogdG8gcGFyc2UgYW1zZHUgcGFja2V0cyAqLworCS8qIHFvcyBkYXRhIHBhY2tldHMgJiByZXNlcnZlZCBiaXQgaXMgMSAqLworCWlmIChwYXJzZV9zdWJmcmFtZShpZWVlLCBza2IsIHJ4X3N0YXRzLCByeGIsIHNyYywgZHN0KSA9PSAwKSB7CisJCS8qIG9ubHkgdG8gZnJlZSByeGIsIGFuZCBub3Qgc3VibWl0IHRoZSBwYWNrZXRzIHRvIHVwcGVyIGxheWVyICovCisJCWZvciAoaSA9IDA7IGkgPCByeGItPm5yX3N1YmZyYW1lczsgaSsrKQorCQkJZGV2X2tmcmVlX3NrYihyeGItPnN1YmZyYW1lc1tpXSk7CisJCWtmcmVlKHJ4Yik7CisJCXJ4YiA9IE5VTEw7CisJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisKKwkvKiBVcGRhdGUgV0FQSSBQTiAqLworCisJLyogQ2hlY2sgaWYgbGVhdmUgTFBTICovCisJaWYgKCFiVG9PdGhlclNUQSkgeworCQlpZiAoaWVlZS0+YklzQWdncmVnYXRlRnJhbWUpCisJCQlucl9zdWJmcmFtZXMgPSByeGItPm5yX3N1YmZyYW1lczsKKwkJZWxzZQorCQkJbnJfc3ViZnJhbWVzID0gMTsKKwkJaWYgKHVuaWNhc3QpCisJCQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SeFVuaWNhc3RPa0luUGVyaW9kICs9IG5yX3N1YmZyYW1lczsKKwkJcnRsbGliX3J4X2NoZWNrX2xlYXZlX2xwcyhpZWVlLCB1bmljYXN0LCBucl9zdWJmcmFtZXMpOworCX0KKworCS8qIEluZGljYXRlIHBhY2tldHMgdG8gdXBwZXIgbGF5ZXIgb3IgUnggUmVvcmRlciAqLworCWlmIChpZWVlLT5wSFRJbmZvLT5iQ3VyUnhSZW9yZGVyRW5hYmxlID09IGZhbHNlIHx8IHBUUyA9PSBOVUxMIHx8IGJUb090aGVyU1RBKQorCQlydGxsaWJfcnhfaW5kaWNhdGVfcGt0X2xlZ2FjeShpZWVlLCByeF9zdGF0cywgcnhiLCBkc3QsIHNyYyk7CisJZWxzZQorCQlSeFJlb3JkZXJJbmRpY2F0ZVBhY2tldChpZWVlLCByeGIsIHBUUywgU2VxTnVtKTsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKworIHJ4X2V4aXQ6CisJcmV0dXJuIDE7CisKKyByeF9kcm9wcGVkOgorCWlmIChyeGIgIT0gTlVMTCkgeworCQlrZnJlZShyeGIpOworCQlyeGIgPSBOVUxMOworCX0KKwlpZWVlLT5zdGF0cy5yeF9kcm9wcGVkKys7CisKKwkvKiBSZXR1cm5pbmcgMCBpbmRpY2F0ZXMgdG8gY2FsbGVyIHRoYXQgd2UgaGF2ZSBub3QgaGFuZGxlZCB0aGUgU0tCLS0KKwkgKiBzbyBpdCBpcyBzdGlsbCBhbGxvY2F0ZWQgYW5kIGNhbiBiZSB1c2VkIGFnYWluIGJ5IHVuZGVybHlpbmcKKwkgKiBoYXJkd2FyZSBhcyBhIERNQSB0YXJnZXQgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydGxsaWJfcnhfTWFzdGVyKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqcnhfc3RhdHMpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRsbGliX3J4X01vbml0b3Ioc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCSBzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpyeF9zdGF0cykKK3sKKwlzdHJ1Y3QgcnRsbGliX2hkcl80YWRkciAqaGRyID0gKHN0cnVjdCBydGxsaWJfaGRyXzRhZGRyICopc2tiLT5kYXRhOworCXUxNiBmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKKwlzaXplX3QgaGRybGVuID0gcnRsbGliX2dldF9oZHJsZW4oZmMpOworCisJaWYgKHNrYi0+bGVuIDwgaGRybGVuKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzKCk6RVJSISEhIHNrYi0+bGVuIGlzIHNtYWxsZXIgdGhhbiBoZHJsZW5cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKEhUQ0NoZWNrKGllZWUsIHNrYi0+ZGF0YSkpIHsKKwkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBGaW5kIEhUQ0NvbnRyb2whXG4iLCBfX2Z1bmNfXyk7CisJCWhkcmxlbiArPSA0OworCX0KKworCXJ0bGxpYl9tb25pdG9yX3J4KGllZWUsIHNrYiwgcnhfc3RhdHMsIGhkcmxlbik7CisJaWVlZS0+c3RhdHMucnhfcGFja2V0cysrOworCWllZWUtPnN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcnRsbGliX3J4X01lc2goc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCSBzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpyeF9zdGF0cykKK3sKKwlyZXR1cm4gMDsKK30KKworLyogQWxsIHJlY2VpdmVkIGZyYW1lcyBhcmUgc2VudCB0byB0aGlzIGZ1bmN0aW9uLiBAc2tiIGNvbnRhaW5zIHRoZSBmcmFtZSBpbgorICogSUVFRSA4MDIuMTEgZm9ybWF0LCBpLmUuLCBpbiB0aGUgZm9ybWF0IGl0IHdhcyBzZW50IG92ZXIgYWlyLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkuICovCitpbnQgcnRsbGliX3J4KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqcnhfc3RhdHMpCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoKE5VTEwgPT0gaWVlZSkgfHwgKE5VTEwgPT0gc2tiKSB8fCAoTlVMTCA9PSByeF9zdGF0cykpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IElucHV0IHBhcmFtZXRlcnMgTlVMTCFcbiIsIF9fZnVuY19fKTsKKwkJZ290byByeF9kcm9wcGVkOworCX0KKwlpZiAoc2tiLT5sZW4gPCAxMCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogU0tCIGxlbmd0aCA8IDEwXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gcnhfZHJvcHBlZDsKKwl9CisKKwlzd2l0Y2ggKGllZWUtPml3X21vZGUpIHsKKwljYXNlIElXX01PREVfQURIT0M6CisJY2FzZSBJV19NT0RFX0lORlJBOgorCQlyZXQgPSBydGxsaWJfcnhfSW5mcmFBZGhvYyhpZWVlLCBza2IsIHJ4X3N0YXRzKTsKKwkJYnJlYWs7CisJY2FzZSBJV19NT0RFX01BU1RFUjoKKwljYXNlIElXX01PREVfUkVQRUFUOgorCQlyZXQgPSBydGxsaWJfcnhfTWFzdGVyKGllZWUsIHNrYiwgcnhfc3RhdHMpOworCQlicmVhazsKKwljYXNlIElXX01PREVfTU9OSVRPUjoKKwkJcmV0ID0gcnRsbGliX3J4X01vbml0b3IoaWVlZSwgc2tiLCByeF9zdGF0cyk7CisJCWJyZWFrOworCWNhc2UgSVdfTU9ERV9NRVNIOgorCQlyZXQgPSBydGxsaWJfcnhfTWVzaChpZWVlLCBza2IsIHJ4X3N0YXRzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fSU5GTyIlczogRVJSIGl3IG1vZGUhISFcbiIsIF9fZnVuY19fKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKKworIHJ4X2Ryb3BwZWQ6CisJaWVlZS0+c3RhdHMucnhfZHJvcHBlZCsrOworCXJldHVybiAwOworfQorCitzdGF0aWMgdTggcW9zX291aVtRT1NfT1VJX0xFTl0gPSB7IDB4MDAsIDB4NTAsIDB4RjIgfTsKKworLyoKKyogTWFrZSB0aGVyIHN0cnVjdHVyZSB3ZSByZWFkIGZyb20gdGhlIGJlYWNvbiBwYWNrZXQgaGFzCisqIHRoZSByaWdodCB2YWx1ZXMKKyovCitzdGF0aWMgaW50IHJ0bGxpYl92ZXJpZnlfcW9zX2luZm8oc3RydWN0IHJ0bGxpYl9xb3NfaW5mb3JtYXRpb25fZWxlbWVudAorCQkJCSAgICAgKmluZm9fZWxlbWVudCwgaW50IHN1Yl90eXBlKQoreworCisJaWYgKGluZm9fZWxlbWVudC0+cXVpX3N1YnR5cGUgIT0gc3ViX3R5cGUpCisJCXJldHVybiAtMTsKKwlpZiAobWVtY21wKGluZm9fZWxlbWVudC0+cXVpLCBxb3Nfb3VpLCBRT1NfT1VJX0xFTikpCisJCXJldHVybiAtMTsKKwlpZiAoaW5mb19lbGVtZW50LT5xdWlfdHlwZSAhPSBRT1NfT1VJX1RZUEUpCisJCXJldHVybiAtMTsKKwlpZiAoaW5mb19lbGVtZW50LT52ZXJzaW9uICE9IFFPU19WRVJTSU9OXzEpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBQYXJzZSBhIFFvUyBwYXJhbWV0ZXIgZWxlbWVudAorICovCitzdGF0aWMgaW50IHJ0bGxpYl9yZWFkX3Fvc19wYXJhbV9lbGVtZW50KHN0cnVjdCBydGxsaWJfcW9zX3BhcmFtZXRlcl9pbmZvCisJCQkJCSAgICAqZWxlbWVudF9wYXJhbSwgc3RydWN0IHJ0bGxpYl9pbmZvX2VsZW1lbnQKKwkJCQkJICAgICppbmZvX2VsZW1lbnQpCit7CisJaW50IHJldCA9IDA7CisJdTE2IHNpemUgPSBzaXplb2Yoc3RydWN0IHJ0bGxpYl9xb3NfcGFyYW1ldGVyX2luZm8pIC0gMjsKKworCWlmICgoaW5mb19lbGVtZW50ID09IE5VTEwpIHx8IChlbGVtZW50X3BhcmFtID09IE5VTEwpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoaW5mb19lbGVtZW50LT5pZCA9PSBRT1NfRUxFTUVOVF9JRCAmJiBpbmZvX2VsZW1lbnQtPmxlbiA9PSBzaXplKSB7CisJCW1lbWNweShlbGVtZW50X3BhcmFtLT5pbmZvX2VsZW1lbnQucXVpLCBpbmZvX2VsZW1lbnQtPmRhdGEsCisJCSAgICAgICBpbmZvX2VsZW1lbnQtPmxlbik7CisJCWVsZW1lbnRfcGFyYW0tPmluZm9fZWxlbWVudC5lbGVtZW50SUQgPSBpbmZvX2VsZW1lbnQtPmlkOworCQllbGVtZW50X3BhcmFtLT5pbmZvX2VsZW1lbnQubGVuZ3RoID0gaW5mb19lbGVtZW50LT5sZW47CisJfSBlbHNlCisJCXJldCA9IC0xOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gcnRsbGliX3ZlcmlmeV9xb3NfaW5mbygmZWxlbWVudF9wYXJhbS0+aW5mb19lbGVtZW50LAorCQkJCQkJUU9TX09VSV9QQVJBTV9TVUJfVFlQRSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFBhcnNlIGEgUW9TIGluZm9ybWF0aW9uIGVsZW1lbnQKKyAqLworc3RhdGljIGludCBydGxsaWJfcmVhZF9xb3NfaW5mb19lbGVtZW50KHN0cnVjdAorCQkJCQkgICBydGxsaWJfcW9zX2luZm9ybWF0aW9uX2VsZW1lbnQKKwkJCQkJICAgKmVsZW1lbnRfaW5mbywgc3RydWN0IHJ0bGxpYl9pbmZvX2VsZW1lbnQKKwkJCQkJICAgKmluZm9fZWxlbWVudCkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1MTYgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcnRsbGliX3Fvc19pbmZvcm1hdGlvbl9lbGVtZW50KSAtIDI7CisKKwlpZiAoZWxlbWVudF9pbmZvID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlpZiAoaW5mb19lbGVtZW50ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmICgoaW5mb19lbGVtZW50LT5pZCA9PSBRT1NfRUxFTUVOVF9JRCkgJiYgKGluZm9fZWxlbWVudC0+bGVuID09IHNpemUpKSB7CisJCW1lbWNweShlbGVtZW50X2luZm8tPnF1aSwgaW5mb19lbGVtZW50LT5kYXRhLAorCQkgICAgICAgaW5mb19lbGVtZW50LT5sZW4pOworCQllbGVtZW50X2luZm8tPmVsZW1lbnRJRCA9IGluZm9fZWxlbWVudC0+aWQ7CisJCWVsZW1lbnRfaW5mby0+bGVuZ3RoID0gaW5mb19lbGVtZW50LT5sZW47CisJfSBlbHNlCisJCXJldCA9IC0xOworCisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBydGxsaWJfdmVyaWZ5X3Fvc19pbmZvKGVsZW1lbnRfaW5mbywKKwkJCQkJCVFPU19PVUlfSU5GT19TVUJfVFlQRSk7CisJcmV0dXJuIHJldDsKK30KKworCisvKgorICogV3JpdGUgUW9TIHBhcmFtZXRlcnMgZnJvbSB0aGUgYWMgcGFyYW1ldGVycy4KKyAqLworc3RhdGljIGludCBydGxsaWJfcW9zX2NvbnZlcnRfYWNfdG9fcGFyYW1ldGVycyhzdHJ1Y3QgcnRsbGliX3Fvc19wYXJhbWV0ZXJfaW5mbyAqcGFyYW1fZWxtLAorCQlzdHJ1Y3QgcnRsbGliX3Fvc19kYXRhICpxb3NfZGF0YSkKK3sKKwlzdHJ1Y3QgcnRsbGliX3Fvc19hY19wYXJhbWV0ZXIgKmFjX3BhcmFtczsKKwlzdHJ1Y3QgcnRsbGliX3Fvc19wYXJhbWV0ZXJzICpxb3NfcGFyYW0gPSAmKHFvc19kYXRhLT5wYXJhbWV0ZXJzKTsKKwlpbnQgcmMgPSAwOworCWludCBpOworCXU4IGFjaTsKKwl1OCBhY207CisKKwlxb3NfZGF0YS0+d21tX2FjbSA9IDA7CisJZm9yIChpID0gMDsgaSA8IFFPU19RVUVVRV9OVU07IGkrKykgeworCQlhY19wYXJhbXMgPSAmKHBhcmFtX2VsbS0+YWNfcGFyYW1zX3JlY29yZFtpXSk7CisKKwkJYWNpID0gKGFjX3BhcmFtcy0+YWNpX2FpZnNuICYgMHg2MCkgPj4gNTsKKwkJYWNtID0gKGFjX3BhcmFtcy0+YWNpX2FpZnNuICYgMHgxMCkgPj4gNDsKKworCQlpZiAoYWNpID49IFFPU19RVUVVRV9OVU0pCisJCQljb250aW51ZTsKKwkJc3dpdGNoIChhY2kpIHsKKwkJY2FzZSAxOgorCQkJLyogQklUKDApIHwgQklUKDMpICovCisJCQlpZiAoYWNtKQorCQkJCXFvc19kYXRhLT53bW1fYWNtIHw9ICgweDAxPDwwKXwoMHgwMTw8Myk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJLyogQklUKDQpIHwgQklUKDUpICovCisJCQlpZiAoYWNtKQorCQkJCXFvc19kYXRhLT53bW1fYWNtIHw9ICgweDAxPDw0KXwoMHgwMTw8NSk7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJLyogQklUKDYpIHwgQklUKDcpICovCisJCQlpZiAoYWNtKQorCQkJCXFvc19kYXRhLT53bW1fYWNtIHw9ICgweDAxPDw2KXwoMHgwMTw8Nyk7CisJCQlicmVhazsKKwkJY2FzZSAwOgorCQlkZWZhdWx0OgorCQkJLyogQklUKDEpIHwgQklUKDIpICovCisJCQlpZiAoYWNtKQorCQkJCXFvc19kYXRhLT53bW1fYWNtIHw9ICgweDAxPDwxKXwoMHgwMTw8Mik7CisJCQlicmVhazsKKwkJfQorCisJCXFvc19wYXJhbS0+YWlmc1thY2ldID0gKGFjX3BhcmFtcy0+YWNpX2FpZnNuKSAmIDB4MGY7CisKKwkJLyogV01NIHNwZWMgUC4xMTogVGhlIG1pbmltdW0gdmFsdWUgZm9yIEFJRlNOIHNoYWxsIGJlIDIgKi8KKwkJcW9zX3BhcmFtLT5haWZzW2FjaV0gPSAocW9zX3BhcmFtLT5haWZzW2FjaV0gPCAyKSA/IDIgOiBxb3NfcGFyYW0tPmFpZnNbYWNpXTsKKworCQlxb3NfcGFyYW0tPmN3X21pblthY2ldID0gYWNfcGFyYW1zLT5lY3dfbWluX21heCAmIDB4MEY7CisKKwkJcW9zX3BhcmFtLT5jd19tYXhbYWNpXSA9IChhY19wYXJhbXMtPmVjd19taW5fbWF4ICYgMHhGMCkgPj4gNDsKKworCQlxb3NfcGFyYW0tPmZsYWdbYWNpXSA9CisJCSAgICAoYWNfcGFyYW1zLT5hY2lfYWlmc24gJiAweDEwKSA/IDB4MDEgOiAweDAwOworCQlxb3NfcGFyYW0tPnR4X29wX2xpbWl0W2FjaV0gPSBsZTE2X3RvX2NwdShhY19wYXJhbXMtPnR4X29wX2xpbWl0KTsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKgorICogd2UgaGF2ZSBhIGdlbmVyaWMgZGF0YSBlbGVtZW50IHdoaWNoIGl0IG1heSBjb250YWluIFFvUyBpbmZvcm1hdGlvbiBvcgorICogcGFyYW1ldGVycyBlbGVtZW50LiBjaGVjayB0aGUgaW5mb3JtYXRpb24gZWxlbWVudCBsZW5ndGggdG8gZGVjaWRlCisgKiB3aGljaCB0eXBlIHRvIHJlYWQKKyAqLworc3RhdGljIGludCBydGxsaWJfcGFyc2VfcW9zX2luZm9fcGFyYW1fSUUoc3RydWN0IHJ0bGxpYl9pbmZvX2VsZW1lbnQKKwkJCQkJICAgICAqaW5mb19lbGVtZW50LAorCQkJCQkgICAgIHN0cnVjdCBydGxsaWJfbmV0d29yayAqbmV0d29yaykKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBydGxsaWJfcW9zX2luZm9ybWF0aW9uX2VsZW1lbnQgcW9zX2luZm9fZWxlbWVudDsKKworCXJjID0gcnRsbGliX3JlYWRfcW9zX2luZm9fZWxlbWVudCgmcW9zX2luZm9fZWxlbWVudCwgaW5mb19lbGVtZW50KTsKKworCWlmIChyYyA9PSAwKSB7CisJCW5ldHdvcmstPnFvc19kYXRhLnBhcmFtX2NvdW50ID0gcW9zX2luZm9fZWxlbWVudC5hY19pbmZvICYgMHgwRjsKKwkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19IQVNfUU9TX0lORk9STUFUSU9OOworCX0gZWxzZSB7CisJCXN0cnVjdCBydGxsaWJfcW9zX3BhcmFtZXRlcl9pbmZvIHBhcmFtX2VsZW1lbnQ7CisKKwkJcmMgPSBydGxsaWJfcmVhZF9xb3NfcGFyYW1fZWxlbWVudCgmcGFyYW1fZWxlbWVudCwKKwkJCQkJCSAgICAgIGluZm9fZWxlbWVudCk7CisJCWlmIChyYyA9PSAwKSB7CisJCQlydGxsaWJfcW9zX2NvbnZlcnRfYWNfdG9fcGFyYW1ldGVycygmcGFyYW1fZWxlbWVudCwKKwkJCQkJCQkgICAgICAgJihuZXR3b3JrLT5xb3NfZGF0YSkpOworCQkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19IQVNfUU9TX1BBUkFNRVRFUlM7CisJCQluZXR3b3JrLT5xb3NfZGF0YS5wYXJhbV9jb3VudCA9CisJCQkgICAgcGFyYW1fZWxlbWVudC5pbmZvX2VsZW1lbnQuYWNfaW5mbyAmIDB4MEY7CisJCX0KKwl9CisKKwlpZiAocmMgPT0gMCkgeworCQlSVExMSUJfREVCVUdfUU9TKCJRb1MgaXMgc3VwcG9ydGVkXG4iKTsKKwkJbmV0d29yay0+cW9zX2RhdGEuc3VwcG9ydGVkID0gMTsKKwl9CisJcmV0dXJuIHJjOworfQorCisjZGVmaW5lIE1GSUVfU1RSSU5HKHgpIGNhc2UgTUZJRV9UWVBFXyAjI3g6IHJldHVybiAjeAorCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2luZm9fZWxlbWVudF9zdHJpbmcodTE2IGlkKQoreworCXN3aXRjaCAoaWQpIHsKKwlNRklFX1NUUklORyhTU0lEKTsKKwlNRklFX1NUUklORyhSQVRFUyk7CisJTUZJRV9TVFJJTkcoRkhfU0VUKTsKKwlNRklFX1NUUklORyhEU19TRVQpOworCU1GSUVfU1RSSU5HKENGX1NFVCk7CisJTUZJRV9TVFJJTkcoVElNKTsKKwlNRklFX1NUUklORyhJQlNTX1NFVCk7CisJTUZJRV9TVFJJTkcoQ09VTlRSWSk7CisJTUZJRV9TVFJJTkcoSE9QX1BBUkFNUyk7CisJTUZJRV9TVFJJTkcoSE9QX1RBQkxFKTsKKwlNRklFX1NUUklORyhSRVFVRVNUKTsKKwlNRklFX1NUUklORyhDSEFMTEVOR0UpOworCU1GSUVfU1RSSU5HKFBPV0VSX0NPTlNUUkFJTlQpOworCU1GSUVfU1RSSU5HKFBPV0VSX0NBUEFCSUxJVFkpOworCU1GSUVfU1RSSU5HKFRQQ19SRVFVRVNUKTsKKwlNRklFX1NUUklORyhUUENfUkVQT1JUKTsKKwlNRklFX1NUUklORyhTVVBQX0NIQU5ORUxTKTsKKwlNRklFX1NUUklORyhDU0EpOworCU1GSUVfU1RSSU5HKE1FQVNVUkVfUkVRVUVTVCk7CisJTUZJRV9TVFJJTkcoTUVBU1VSRV9SRVBPUlQpOworCU1GSUVfU1RSSU5HKFFVSUVUKTsKKwlNRklFX1NUUklORyhJQlNTX0RGUyk7CisJTUZJRV9TVFJJTkcoUlNOKTsKKwlNRklFX1NUUklORyhSQVRFU19FWCk7CisJTUZJRV9TVFJJTkcoR0VORVJJQyk7CisJTUZJRV9TVFJJTkcoUU9TX1BBUkFNRVRFUik7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJVTktOT1dOIjsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydGxsaWJfZXh0cmFjdF9jb3VudHJ5X2llKAorCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCXN0cnVjdCBydGxsaWJfaW5mb19lbGVtZW50ICppbmZvX2VsZW1lbnQsCisJc3RydWN0IHJ0bGxpYl9uZXR3b3JrICpuZXR3b3JrLAorCXU4ICphZGRyMikKK3sKKwlpZiAoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkgeworCQlpZiAoaW5mb19lbGVtZW50LT5sZW4gIT0gMCkgeworCQkJbWVtY3B5KG5ldHdvcmstPkNvdW50cnlJZUJ1ZiwgaW5mb19lbGVtZW50LT5kYXRhLCBpbmZvX2VsZW1lbnQtPmxlbik7CisJCQluZXR3b3JrLT5Db3VudHJ5SWVMZW4gPSBpbmZvX2VsZW1lbnQtPmxlbjsKKworCQkJaWYgKCFJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKSB7CisJCQkJaWYgKChydGxsaWJfYWN0X3NjYW5uaW5nKGllZWUsIGZhbHNlKSA9PSB0cnVlKSAmJiAoaWVlZS0+Rmlyc3RJZV9JblNjYW4gPT0gMSkpCisJCQkJCXByaW50ayhLRVJOX0lORk8gIlJlY2VpdmVkIGJlYWNvbiBDb250cnlJRSwgU1NJRDogPCVzPlxuIiwgbmV0d29yay0+c3NpZCk7CisJCQkJRG90MTFkX1VwZGF0ZUNvdW50cnlJZShpZWVlLCBhZGRyMiwgaW5mb19lbGVtZW50LT5sZW4sIGluZm9fZWxlbWVudC0+ZGF0YSk7CisJCQl9CisJCX0KKworCQlpZiAoSVNfRVFVQUxfQ0lFX1NSQyhpZWVlLCBhZGRyMikpCisJCQlVUERBVEVfQ0lFX1dBVENIRE9HKGllZWUpOworCX0KKworfQorCitpbnQgcnRsbGliX3BhcnNlX2luZm9fcGFyYW0oc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCXN0cnVjdCBydGxsaWJfaW5mb19lbGVtZW50ICppbmZvX2VsZW1lbnQsCisJCXUxNiBsZW5ndGgsCisJCXN0cnVjdCBydGxsaWJfbmV0d29yayAqbmV0d29yaywKKwkJc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqc3RhdHMpCit7CisJdTggaTsKKwlzaG9ydCBvZmZzZXQ7CisJdTE2CXRtcF9odGNhcF9sZW4gPSAwOworCXUxNgl0bXBfaHRpbmZvX2xlbiA9IDA7CisJdTE2IGh0X3JlYWx0ZWtfYWdnX2xlbiA9IDA7CisJdTggIGh0X3JlYWx0ZWtfYWdnX2J1ZltNQVhfSUVfTEVOXTsKKwljaGFyIHJhdGVzX3N0cls2NF07CisJY2hhciAqcDsKKworCXdoaWxlIChsZW5ndGggPj0gc2l6ZW9mKCppbmZvX2VsZW1lbnQpKSB7CisJCWlmIChzaXplb2YoKmluZm9fZWxlbWVudCkgKyBpbmZvX2VsZW1lbnQtPmxlbiA+IGxlbmd0aCkgeworCQkJUlRMTElCX0RFQlVHX01HTVQoIkluZm8gZWxlbTogcGFyc2UgZmFpbGVkOiAiCisJCQkJCSAgICAgImluZm9fZWxlbWVudC0+bGVuICsgMiA+IGxlZnQgOiAiCisJCQkJCSAgICAgImluZm9fZWxlbWVudC0+bGVuKzI9JXpkIGxlZnQ9JWQsIGlkPSVkLlxuIiwKKwkJCQkJICAgICBpbmZvX2VsZW1lbnQtPmxlbiArCisJCQkJCSAgICAgc2l6ZW9mKCppbmZvX2VsZW1lbnQpLAorCQkJCQkgICAgIGxlbmd0aCwgaW5mb19lbGVtZW50LT5pZCk7CisJCQkvKiBXZSBzdG9wIHByb2Nlc3NpbmcgYnV0IGRvbid0IHJldHVybiBhbiBlcnJvciBoZXJlCisJCQkgKiBiZWNhdXNlIHNvbWUgbWlzYmVoYXZpb3VyIEFQcyBicmVhayB0aGlzIHJ1bGUuIGllLgorCQkJICogT3Jpbm9jbyBBUDEwMDAuICovCisJCQlicmVhazsKKwkJfQorCisJCXN3aXRjaCAoaW5mb19lbGVtZW50LT5pZCkgeworCQljYXNlIE1GSUVfVFlQRV9TU0lEOgorCQkJaWYgKHJ0bGxpYl9pc19lbXB0eV9lc3NpZChpbmZvX2VsZW1lbnQtPmRhdGEsCisJCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKSkgeworCQkJCW5ldHdvcmstPmZsYWdzIHw9IE5FVFdPUktfRU1QVFlfRVNTSUQ7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCW5ldHdvcmstPnNzaWRfbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuLAorCQkJCQkJKHU4KSBJV19FU1NJRF9NQVhfU0laRSk7CisJCQltZW1jcHkobmV0d29yay0+c3NpZCwgaW5mb19lbGVtZW50LT5kYXRhLCBuZXR3b3JrLT5zc2lkX2xlbik7CisJCQlpZiAobmV0d29yay0+c3NpZF9sZW4gPCBJV19FU1NJRF9NQVhfU0laRSkKKwkJCQltZW1zZXQobmV0d29yay0+c3NpZCArIG5ldHdvcmstPnNzaWRfbGVuLCAwLAorCQkJCSAgICAgICBJV19FU1NJRF9NQVhfU0laRSAtIG5ldHdvcmstPnNzaWRfbGVuKTsKKworCQkJUlRMTElCX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9TU0lEOiAnJXMnIGxlbj0lZC5cbiIsCisJCQkJCSAgICAgbmV0d29yay0+c3NpZCwgbmV0d29yay0+c3NpZF9sZW4pOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfUkFURVM6CisJCQlwID0gcmF0ZXNfc3RyOworCQkJbmV0d29yay0+cmF0ZXNfbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuLAorCQkJCQkJIE1BWF9SQVRFU19MRU5HVEgpOworCQkJZm9yIChpID0gMDsgaSA8IG5ldHdvcmstPnJhdGVzX2xlbjsgaSsrKSB7CisJCQkJbmV0d29yay0+cmF0ZXNbaV0gPSBpbmZvX2VsZW1lbnQtPmRhdGFbaV07CisJCQkJcCArPSBzbnByaW50ZihwLCBzaXplb2YocmF0ZXNfc3RyKSAtCisJCQkJCSAgICAgIChwIC0gcmF0ZXNfc3RyKSwgIiUwMlggIiwKKwkJCQkJICAgICAgbmV0d29yay0+cmF0ZXNbaV0pOworCQkJCWlmIChydGxsaWJfaXNfb2ZkbV9yYXRlCisJCQkJICAgIChpbmZvX2VsZW1lbnQtPmRhdGFbaV0pKSB7CisJCQkJCW5ldHdvcmstPmZsYWdzIHw9IE5FVFdPUktfSEFTX09GRE07CisJCQkJCWlmIChpbmZvX2VsZW1lbnQtPmRhdGFbaV0gJgorCQkJCQkgICAgUlRMTElCX0JBU0lDX1JBVEVfTUFTSykKKwkJCQkJCW5ldHdvcmstPmZsYWdzICY9CisJCQkJCQkgICAgfk5FVFdPUktfSEFTX0NDSzsKKwkJCQl9CisKKwkJCQlpZiAocnRsbGliX2lzX2Nja19yYXRlCisJCQkJICAgIChpbmZvX2VsZW1lbnQtPmRhdGFbaV0pKSB7CisJCQkJCW5ldHdvcmstPmZsYWdzIHw9IE5FVFdPUktfSEFTX0NDSzsKKwkJCQl9CisJCQl9CisKKwkJCVJUTExJQl9ERUJVR19NR01UKCJNRklFX1RZUEVfUkFURVM6ICclcycgKCVkKVxuIiwKKwkJCQkJICAgICByYXRlc19zdHIsIG5ldHdvcmstPnJhdGVzX2xlbik7CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9SQVRFU19FWDoKKwkJCXAgPSByYXRlc19zdHI7CisJCQluZXR3b3JrLT5yYXRlc19leF9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sCisJCQkJCQkgICAgTUFYX1JBVEVTX0VYX0xFTkdUSCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgbmV0d29yay0+cmF0ZXNfZXhfbGVuOyBpKyspIHsKKwkJCQluZXR3b3JrLT5yYXRlc19leFtpXSA9IGluZm9fZWxlbWVudC0+ZGF0YVtpXTsKKwkJCQlwICs9IHNucHJpbnRmKHAsIHNpemVvZihyYXRlc19zdHIpIC0KKwkJCQkJICAgICAgKHAgLSByYXRlc19zdHIpLCAiJTAyWCAiLAorCQkJCQkgICAgICBuZXR3b3JrLT5yYXRlc1tpXSk7CisJCQkJaWYgKHJ0bGxpYl9pc19vZmRtX3JhdGUKKwkJCQkgICAgKGluZm9fZWxlbWVudC0+ZGF0YVtpXSkpIHsKKwkJCQkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19IQVNfT0ZETTsKKwkJCQkJaWYgKGluZm9fZWxlbWVudC0+ZGF0YVtpXSAmCisJCQkJCSAgICBSVExMSUJfQkFTSUNfUkFURV9NQVNLKQorCQkJCQkJbmV0d29yay0+ZmxhZ3MgJj0KKwkJCQkJCSAgICB+TkVUV09SS19IQVNfQ0NLOworCQkJCX0KKwkJCX0KKworCQkJUlRMTElCX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9SQVRFU19FWDogJyVzJyAoJWQpXG4iLAorCQkJCQkgICAgIHJhdGVzX3N0ciwgbmV0d29yay0+cmF0ZXNfZXhfbGVuKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX0RTX1NFVDoKKwkJCVJUTExJQl9ERUJVR19NR01UKCJNRklFX1RZUEVfRFNfU0VUOiAlZFxuIiwKKwkJCQkJICAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMF0pOworCQkJbmV0d29yay0+Y2hhbm5lbCA9IGluZm9fZWxlbWVudC0+ZGF0YVswXTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX0ZIX1NFVDoKKwkJCVJUTExJQl9ERUJVR19NR01UKCJNRklFX1RZUEVfRkhfU0VUOiBpZ25vcmVkXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX0NGX1NFVDoKKwkJCVJUTExJQl9ERUJVR19NR01UKCJNRklFX1RZUEVfQ0ZfU0VUOiBpZ25vcmVkXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUZJRV9UWVBFX1RJTToKKwkJCWlmIChpbmZvX2VsZW1lbnQtPmxlbiA8IDQpCisJCQkJYnJlYWs7CisKKwkJCW5ldHdvcmstPnRpbS50aW1fY291bnQgPSBpbmZvX2VsZW1lbnQtPmRhdGFbMF07CisJCQluZXR3b3JrLT50aW0udGltX3BlcmlvZCA9IGluZm9fZWxlbWVudC0+ZGF0YVsxXTsKKworCQkJbmV0d29yay0+ZHRpbV9wZXJpb2QgPSBpbmZvX2VsZW1lbnQtPmRhdGFbMV07CisJCQlpZiAoaWVlZS0+c3RhdGUgIT0gUlRMTElCX0xJTktFRCkKKwkJCQlicmVhazsKKwkJCW5ldHdvcmstPmxhc3RfZHRpbV9zdGFfdGltZSA9IGppZmZpZXM7CisKKwkJCW5ldHdvcmstPmR0aW1fZGF0YSA9IFJUTExJQl9EVElNX1ZBTElEOworCisKKwkJCWlmIChpbmZvX2VsZW1lbnQtPmRhdGFbMl0gJiAxKQorCQkJCW5ldHdvcmstPmR0aW1fZGF0YSB8PSBSVExMSUJfRFRJTV9NQkNBU1Q7CisKKwkJCW9mZnNldCA9IChpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPj4gMSkqMjsKKworCisJCQlpZiAoaWVlZS0+YXNzb2NfaWQgPCA4Km9mZnNldCB8fAorCQkJICAgIGllZWUtPmFzc29jX2lkID4gOCoob2Zmc2V0ICsgaW5mb19lbGVtZW50LT5sZW4gLSAzKSkKKwkJCQlicmVhazsKKworCQkJb2Zmc2V0ID0gKGllZWUtPmFzc29jX2lkIC8gOCkgLSBvZmZzZXQ7CisJCQlpZiAoaW5mb19lbGVtZW50LT5kYXRhWzMgKyBvZmZzZXRdICYKKwkJCSAgICgxIDw8IChpZWVlLT5hc3NvY19pZCAlIDgpKSkKKwkJCQluZXR3b3JrLT5kdGltX2RhdGEgfD0gUlRMTElCX0RUSU1fVUNBU1Q7CisKKwkJCW5ldHdvcmstPmxpc3Rlbl9pbnRlcnZhbCA9IG5ldHdvcmstPmR0aW1fcGVyaW9kOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfRVJQOgorCQkJbmV0d29yay0+ZXJwX3ZhbHVlID0gaW5mb19lbGVtZW50LT5kYXRhWzBdOworCQkJbmV0d29yay0+ZmxhZ3MgfD0gTkVUV09SS19IQVNfRVJQX1ZBTFVFOworCQkJUlRMTElCX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9FUlBfU0VUOiAlZFxuIiwKKwkJCQkJICAgICBuZXR3b3JrLT5lcnBfdmFsdWUpOworCQkJYnJlYWs7CisJCWNhc2UgTUZJRV9UWVBFX0lCU1NfU0VUOgorCQkJbmV0d29yay0+YXRpbV93aW5kb3cgPSBpbmZvX2VsZW1lbnQtPmRhdGFbMF07CisJCQlSVExMSUJfREVCVUdfTUdNVCgiTUZJRV9UWVBFX0lCU1NfU0VUOiAlZFxuIiwKKwkJCQkJICAgICBuZXR3b3JrLT5hdGltX3dpbmRvdyk7CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9DSEFMTEVOR0U6CisJCQlSVExMSUJfREVCVUdfTUdNVCgiTUZJRV9UWVBFX0NIQUxMRU5HRTogaWdub3JlZFxuIik7CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9HRU5FUklDOgorCQkJUlRMTElCX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9HRU5FUklDOiAlZCBieXRlc1xuIiwKKwkJCQkJICAgICBpbmZvX2VsZW1lbnQtPmxlbik7CisJCQlpZiAoIXJ0bGxpYl9wYXJzZV9xb3NfaW5mb19wYXJhbV9JRShpbmZvX2VsZW1lbnQsCisJCQkJCQkJICAgICAgIG5ldHdvcmspKQorCQkJCWJyZWFrOworCQkJaWYgKGluZm9fZWxlbWVudC0+bGVuID49IDQgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDUwICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4ZjIgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbM10gPT0gMHgwMSkgeworCQkJCW5ldHdvcmstPndwYV9pZV9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4gKyAyLAorCQkJCQkJCSAgTUFYX1dQQV9JRV9MRU4pOworCQkJCW1lbWNweShuZXR3b3JrLT53cGFfaWUsIGluZm9fZWxlbWVudCwKKwkJCQkgICAgICAgbmV0d29yay0+d3BhX2llX2xlbik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaW5mb19lbGVtZW50LT5sZW4gPT0gNyAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4ZTAgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHg0YyAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDAxICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzRdID09IDB4MDIpCisJCQkJbmV0d29yay0+VHVyYm9fRW5hYmxlID0gMTsKKworCQkJaWYgKHRtcF9odGNhcF9sZW4gPT0gMCkgeworCQkJCWlmIChpbmZvX2VsZW1lbnQtPmxlbiA+PSA0ICYmCisJCQkJICAgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKwkJCQkgICBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHg5MCAmJgorCQkJCSAgIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDRjICYmCisJCQkJICAgaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDMzKSB7CisKKwkJCQkJCXRtcF9odGNhcF9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sICh1OClNQVhfSUVfTEVOKTsKKwkJCQkJCWlmICh0bXBfaHRjYXBfbGVuICE9IDApIHsKKwkJCQkJCQluZXR3b3JrLT5ic3NodC5iZEhUU3BlY1ZlciA9IEhUX1NQRUNfVkVSX0VXQzsKKwkJCQkJCQluZXR3b3JrLT5ic3NodC5iZEhUQ2FwTGVuID0gdG1wX2h0Y2FwX2xlbiA+IHNpemVvZihuZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmKSA/CisJCQkJCQkJCXNpemVvZihuZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmKSA6IHRtcF9odGNhcF9sZW47CisJCQkJCQkJbWVtY3B5KG5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWYsIGluZm9fZWxlbWVudC0+ZGF0YSwgbmV0d29yay0+YnNzaHQuYmRIVENhcExlbik7CisJCQkJCQl9CisJCQkJfQorCQkJCWlmICh0bXBfaHRjYXBfbGVuICE9IDApIHsKKwkJCQkJbmV0d29yay0+YnNzaHQuYmRTdXBwb3J0SFQgPSB0cnVlOworCQkJCQluZXR3b3JrLT5ic3NodC5iZEhUMVIgPSAoKCgoc3RydWN0IGh0X2NhcGFiX2VsZSAqKShuZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmKSktPk1DU1sxXSkgPT0gMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbmV0d29yay0+YnNzaHQuYmRTdXBwb3J0SFQgPSBmYWxzZTsKKwkJCQkJbmV0d29yay0+YnNzaHQuYmRIVDFSID0gZmFsc2U7CisJCQkJfQorCQkJfQorCisKKwkJCWlmICh0bXBfaHRpbmZvX2xlbiA9PSAwKSB7CisJCQkJaWYgKGluZm9fZWxlbWVudC0+bGVuID49IDQgJiYKKwkJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKwkJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4OTAgJiYKKwkJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4NGMgJiYKKwkJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDM0KSB7CisJCQkJCXRtcF9odGluZm9fbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuLCAodTgpTUFYX0lFX0xFTik7CisJCQkJCWlmICh0bXBfaHRpbmZvX2xlbiAhPSAwKSB7CisJCQkJCQluZXR3b3JrLT5ic3NodC5iZEhUU3BlY1ZlciA9IEhUX1NQRUNfVkVSX0VXQzsKKwkJCQkJCWlmICh0bXBfaHRpbmZvX2xlbikgeworCQkJCQkJCW5ldHdvcmstPmJzc2h0LmJkSFRJbmZvTGVuID0gdG1wX2h0aW5mb19sZW4gPiBzaXplb2YobmV0d29yay0+YnNzaHQuYmRIVEluZm9CdWYpID8KKwkJCQkJCQkJc2l6ZW9mKG5ldHdvcmstPmJzc2h0LmJkSFRJbmZvQnVmKSA6IHRtcF9odGluZm9fbGVuOworCQkJCQkJCW1lbWNweShuZXR3b3JrLT5ic3NodC5iZEhUSW5mb0J1ZiwgaW5mb19lbGVtZW50LT5kYXRhLCBuZXR3b3JrLT5ic3NodC5iZEhUSW5mb0xlbik7CisJCQkJCQl9CisKKwkJCQkJfQorCisJCQkJfQorCQkJfQorCisJCQlpZiAoaWVlZS0+YWdncmVnYXRpb24pIHsKKwkJCQlpZiAobmV0d29yay0+YnNzaHQuYmRTdXBwb3J0SFQpIHsKKwkJCQkJaWYgKGluZm9fZWxlbWVudC0+bGVuID49IDQgJiYKKwkJCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHhlMCAmJgorCQkJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4NGMgJiYKKwkJCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDAyKSB7CisJCQkJCQlodF9yZWFsdGVrX2FnZ19sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sICh1OClNQVhfSUVfTEVOKTsKKwkJCQkJCW1lbWNweShodF9yZWFsdGVrX2FnZ19idWYsIGluZm9fZWxlbWVudC0+ZGF0YSwgaW5mb19lbGVtZW50LT5sZW4pOworCQkJCQl9CisJCQkJCWlmIChodF9yZWFsdGVrX2FnZ19sZW4gPj0gNSkgeworCQkJCQkJbmV0d29yay0+cmVhbHRla19jYXBfZXhpdCA9IHRydWU7CisJCQkJCQluZXR3b3JrLT5ic3NodC5iZFJUMlJUQWdncmVnYXRpb24gPSB0cnVlOworCisJCQkJCQlpZiAoKGh0X3JlYWx0ZWtfYWdnX2J1Zls0XSA9PSAxKSAmJiAoaHRfcmVhbHRla19hZ2dfYnVmWzVdICYgMHgwMikpCisJCQkJCQkJbmV0d29yay0+YnNzaHQuYmRSVDJSVExvbmdTbG90VGltZSA9IHRydWU7CisKKwkJCQkJCWlmICgoaHRfcmVhbHRla19hZ2dfYnVmWzRdID09IDEpICYmIChodF9yZWFsdGVrX2FnZ19idWZbNV0gJiBSVF9IVF9DQVBfVVNFXzkyU0UpKQorCQkJCQkJCW5ldHdvcmstPmJzc2h0LlJUMlJUX0hUX01vZGUgfD0gUlRfSFRfQ0FQX1VTRV85MlNFOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChodF9yZWFsdGVrX2FnZ19sZW4gPj0gNSkgeworCQkJCQlpZiAoKGh0X3JlYWx0ZWtfYWdnX2J1Zls1XSAmIFJUX0hUX0NBUF9VU0VfU09GVEFQKSkKKwkJCQkJCW5ldHdvcmstPmJzc2h0LlJUMlJUX0hUX01vZGUgfD0gUlRfSFRfQ0FQX1VTRV9TT0ZUQVA7CisJCQkJfQorCQkJfQorCisJCQlpZiAoKGluZm9fZWxlbWVudC0+bGVuID49IDMgJiYKKwkJCSAgICAgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKwkJCSAgICAgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4MDUgJiYKKwkJCSAgICAgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4YjUpIHx8CisJCQkgICAgIChpbmZvX2VsZW1lbnQtPmxlbiA+PSAzICYmCisJCQkgICAgIGluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkgICAgIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDBhICYmCisJCQkgICAgIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweGY3KSB8fAorCQkJICAgICAoaW5mb19lbGVtZW50LT5sZW4gPj0gMyAmJgorCQkJICAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJICAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHgxMCAmJgorCQkJICAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHgxOCkpIHsKKwkJCQluZXR3b3JrLT5icm9hZGNvbV9jYXBfZXhpc3QgPSB0cnVlOworCQkJfQorCQkJaWYgKGluZm9fZWxlbWVudC0+bGVuID49IDMgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDBjICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4NDMpCisJCQkJbmV0d29yay0+cmFsaW5rX2NhcF9leGlzdCA9IHRydWU7CisJCQlpZiAoKGluZm9fZWxlbWVudC0+bGVuID49IDMgJiYKKwkJCSAgICAgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKwkJCSAgICAgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4MDMgJiYKKwkJCSAgICAgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4N2YpIHx8CisJCQkgICAgIChpbmZvX2VsZW1lbnQtPmxlbiA+PSAzICYmCisJCQkgICAgIGluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkgICAgIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDEzICYmCisJCQkgICAgIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDc0KSkKKwkJCQluZXR3b3JrLT5hdGhlcm9zX2NhcF9leGlzdCA9IHRydWU7CisKKwkJCWlmICgoaW5mb19lbGVtZW50LT5sZW4gPj0gMyAmJgorCQkJICAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJICAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHg1MCAmJgorCQkJICAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHg0MykpCisJCQkJbmV0d29yay0+bWFydmVsbF9jYXBfZXhpc3QgPSB0cnVlOworCQkJaWYgKGluZm9fZWxlbWVudC0+bGVuID49IDMgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDQwICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4OTYpCisJCQkJbmV0d29yay0+Y2lzY29fY2FwX2V4aXN0ID0gdHJ1ZTsKKworCisJCQlpZiAoaW5mb19lbGVtZW50LT5sZW4gPj0gMyAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4MGEgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHhmNSkKKwkJCQluZXR3b3JrLT5haXJnb19jYXBfZXhpc3QgPSB0cnVlOworCisJCQlpZiAoaW5mb19lbGVtZW50LT5sZW4gPiA0ICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHg0MCAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDk2ICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDEpIHsKKwkJCQlpZiAoaW5mb19lbGVtZW50LT5sZW4gPT0gNikgeworCQkJCQltZW1jcHkobmV0d29yay0+Q2N4Um1TdGF0ZSwgJmluZm9fZWxlbWVudFs0XSwgMik7CisJCQkJCWlmIChuZXR3b3JrLT5DY3hSbVN0YXRlWzBdICE9IDApCisJCQkJCQluZXR3b3JrLT5iQ2N4Um1FbmFibGUgPSB0cnVlOworCQkJCQllbHNlCisJCQkJCQluZXR3b3JrLT5iQ2N4Um1FbmFibGUgPSBmYWxzZTsKKwkJCQkJbmV0d29yay0+TUJzc2lkTWFzayA9IG5ldHdvcmstPkNjeFJtU3RhdGVbMV0gJiAweDA3OworCQkJCQlpZiAobmV0d29yay0+TUJzc2lkTWFzayAhPSAwKSB7CisJCQkJCQluZXR3b3JrLT5iTUJzc2lkVmFsaWQgPSB0cnVlOworCQkJCQkJbmV0d29yay0+TUJzc2lkTWFzayA9IDB4ZmYgPDwgKG5ldHdvcmstPk1Cc3NpZE1hc2spOworCQkJCQkJbWVtY3B5KG5ldHdvcmstPk1Cc3NpZCwgbmV0d29yay0+YnNzaWQsIEVUSF9BTEVOKTsKKwkJCQkJCW5ldHdvcmstPk1Cc3NpZFs1XSAmPSBuZXR3b3JrLT5NQnNzaWRNYXNrOworCQkJCQl9IGVsc2UgeworCQkJCQkJbmV0d29yay0+Yk1Cc3NpZFZhbGlkID0gZmFsc2U7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQluZXR3b3JrLT5iQ2N4Um1FbmFibGUgPSBmYWxzZTsKKwkJCQl9CisJCQl9CisJCQlpZiAoaW5mb19lbGVtZW50LT5sZW4gPiA0ICAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4NDAgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHg5NiAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDAzKSB7CisJCQkJaWYgKGluZm9fZWxlbWVudC0+bGVuID09IDUpIHsKKwkJCQkJbmV0d29yay0+YldpdGhDY3hWZXJOdW0gPSB0cnVlOworCQkJCQluZXR3b3JrLT5Cc3NDY3hWZXJOdW1iZXIgPSBpbmZvX2VsZW1lbnQtPmRhdGFbNF07CisJCQkJfSBlbHNlIHsKKwkJCQkJbmV0d29yay0+YldpdGhDY3hWZXJOdW0gPSBmYWxzZTsKKwkJCQkJbmV0d29yay0+QnNzQ2N4VmVyTnVtYmVyID0gMDsKKwkJCQl9CisJCQl9CisJCQlpZiAoaW5mb19lbGVtZW50LT5sZW4gPiA0ICAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVswXSA9PSAweDAwICYmCisJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4NTAgJiYKKwkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHhmMiAmJgorCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDA0KSB7CisJCQkJUlRMTElCX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9XWkM6ICVkIGJ5dGVzXG4iLAorCQkJCQkJICAgICBpbmZvX2VsZW1lbnQtPmxlbik7CisJCQkJbmV0d29yay0+d3pjX2llX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbisyLAorCQkJCQkJCSAgTUFYX1daQ19JRV9MRU4pOworCQkJCW1lbWNweShuZXR3b3JrLT53emNfaWUsIGluZm9fZWxlbWVudCwKKwkJCQkJCW5ldHdvcmstPnd6Y19pZV9sZW4pOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfUlNOOgorCQkJUlRMTElCX0RFQlVHX01HTVQoIk1GSUVfVFlQRV9SU046ICVkIGJ5dGVzXG4iLAorCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKKwkJCW5ldHdvcmstPnJzbl9pZV9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4gKyAyLAorCQkJCQkJICBNQVhfV1BBX0lFX0xFTik7CisJCQltZW1jcHkobmV0d29yay0+cnNuX2llLCBpbmZvX2VsZW1lbnQsCisJCQkgICAgICAgbmV0d29yay0+cnNuX2llX2xlbik7CisJCQlicmVhazsKKworCQljYXNlIE1GSUVfVFlQRV9IVF9DQVA6CisJCQlSVExMSUJfREVCVUdfU0NBTigiTUZJRV9UWVBFX0hUX0NBUDogJWQgYnl0ZXNcbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pOworCQkJdG1wX2h0Y2FwX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiwgKHU4KU1BWF9JRV9MRU4pOworCQkJaWYgKHRtcF9odGNhcF9sZW4gIT0gMCkgeworCQkJCW5ldHdvcmstPmJzc2h0LmJkSFRTcGVjVmVyID0gSFRfU1BFQ19WRVJfRVdDOworCQkJCW5ldHdvcmstPmJzc2h0LmJkSFRDYXBMZW4gPSB0bXBfaHRjYXBfbGVuID4gc2l6ZW9mKG5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWYpID8KKwkJCQkJc2l6ZW9mKG5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWYpIDogdG1wX2h0Y2FwX2xlbjsKKwkJCQltZW1jcHkobmV0d29yay0+YnNzaHQuYmRIVENhcEJ1ZiwKKwkJCQkgICAgICAgaW5mb19lbGVtZW50LT5kYXRhLAorCQkJCSAgICAgICBuZXR3b3JrLT5ic3NodC5iZEhUQ2FwTGVuKTsKKworCQkJCW5ldHdvcmstPmJzc2h0LmJkU3VwcG9ydEhUID0gdHJ1ZTsKKwkJCQluZXR3b3JrLT5ic3NodC5iZEhUMVIgPSAoKCgoc3RydWN0IGh0X2NhcGFiX2VsZSAqKQorCQkJCQkJCW5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWYpKS0+TUNTWzFdKSA9PSAwOworCisJCQkJbmV0d29yay0+YnNzaHQuYmRCYW5kV2lkdGggPSAoZW51bSBodF9jaGFubmVsX3dpZHRoKQorCQkJCQkJCSAgICAgKCgoc3RydWN0IGh0X2NhcGFiX2VsZSAqKQorCQkJCQkJCSAgICAgKG5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWYpKS0+Q2hsV2lkdGgpOworCQkJfSBlbHNlIHsKKwkJCQluZXR3b3JrLT5ic3NodC5iZFN1cHBvcnRIVCA9IGZhbHNlOworCQkJCW5ldHdvcmstPmJzc2h0LmJkSFQxUiA9IGZhbHNlOworCQkJCW5ldHdvcmstPmJzc2h0LmJkQmFuZFdpZHRoID0gSFRfQ0hBTk5FTF9XSURUSF8yMDsKKwkJCX0KKwkJCWJyZWFrOworCisKKwkJY2FzZSBNRklFX1RZUEVfSFRfSU5GTzoKKwkJCVJUTExJQl9ERUJVR19TQ0FOKCJNRklFX1RZUEVfSFRfSU5GTzogJWQgYnl0ZXNcbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pOworCQkJdG1wX2h0aW5mb19sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sICh1OClNQVhfSUVfTEVOKTsKKwkJCWlmICh0bXBfaHRpbmZvX2xlbikgeworCQkJCW5ldHdvcmstPmJzc2h0LmJkSFRTcGVjVmVyID0gSFRfU1BFQ19WRVJfSUVFRTsKKwkJCQluZXR3b3JrLT5ic3NodC5iZEhUSW5mb0xlbiA9IHRtcF9odGluZm9fbGVuID4KKwkJCQkJc2l6ZW9mKG5ldHdvcmstPmJzc2h0LmJkSFRJbmZvQnVmKSA/CisJCQkJCXNpemVvZihuZXR3b3JrLT5ic3NodC5iZEhUSW5mb0J1ZikgOgorCQkJCQl0bXBfaHRpbmZvX2xlbjsKKwkJCQltZW1jcHkobmV0d29yay0+YnNzaHQuYmRIVEluZm9CdWYsCisJCQkJICAgICAgIGluZm9fZWxlbWVudC0+ZGF0YSwKKwkJCQkgICAgICAgbmV0d29yay0+YnNzaHQuYmRIVEluZm9MZW4pOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfQUlST05FVDoKKwkJCVJUTExJQl9ERUJVR19TQ0FOKCJNRklFX1RZUEVfQUlST05FVDogJWQgYnl0ZXNcbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pOworCQkJaWYgKGluZm9fZWxlbWVudC0+bGVuID4gSUVfQ0lTQ09fRkxBR19QT1NJVElPTikgeworCQkJCW5ldHdvcmstPmJXaXRoQWlyb25ldElFID0gdHJ1ZTsKKworCQkJCWlmICgoaW5mb19lbGVtZW50LT5kYXRhW0lFX0NJU0NPX0ZMQUdfUE9TSVRJT05dCisJCQkJICAgICAmIFNVUFBPUlRfQ0tJUF9NSUMpIHx8CisJCQkJICAgICAoaW5mb19lbGVtZW50LT5kYXRhW0lFX0NJU0NPX0ZMQUdfUE9TSVRJT05dCisJCQkJICAgICAmIFNVUFBPUlRfQ0tJUF9QSykpCisJCQkJCW5ldHdvcmstPmJDa2lwU3VwcG9ydGVkID0gdHJ1ZTsKKwkJCQllbHNlCisJCQkJCW5ldHdvcmstPmJDa2lwU3VwcG9ydGVkID0gZmFsc2U7CisJCQl9IGVsc2UgeworCQkJCW5ldHdvcmstPmJXaXRoQWlyb25ldElFID0gZmFsc2U7CisJCQkJbmV0d29yay0+YkNraXBTdXBwb3J0ZWQgPSBmYWxzZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE1GSUVfVFlQRV9RT1NfUEFSQU1FVEVSOgorCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIlFvUyBFcnJvciBuZWVkIHRvIHBhcnNlIFFPU19QQVJBTUVURVIgSUVcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRklFX1RZUEVfQ09VTlRSWToKKwkJCVJUTExJQl9ERUJVR19TQ0FOKCJNRklFX1RZUEVfQ09VTlRSWTogJWQgYnl0ZXNcbiIsCisJCQkJCSAgICAgaW5mb19lbGVtZW50LT5sZW4pOworCQkJcnRsbGliX2V4dHJhY3RfY291bnRyeV9pZShpZWVlLCBpbmZvX2VsZW1lbnQsIG5ldHdvcmssCisJCQkJCQkgIG5ldHdvcmstPmJzc2lkKTsKKwkJCWJyZWFrOworLyogVE9ETyAqLworCQlkZWZhdWx0OgorCQkJUlRMTElCX0RFQlVHX01HTVQKKwkJCSAgICAoIlVuc3VwcG9ydGVkIGluZm8gZWxlbWVudDogJXMgKCVkKVxuIiwKKwkJCSAgICAgZ2V0X2luZm9fZWxlbWVudF9zdHJpbmcoaW5mb19lbGVtZW50LT5pZCksCisJCQkgICAgIGluZm9fZWxlbWVudC0+aWQpOworCQkJYnJlYWs7CisJCX0KKworCQlsZW5ndGggLT0gc2l6ZW9mKCppbmZvX2VsZW1lbnQpICsgaW5mb19lbGVtZW50LT5sZW47CisJCWluZm9fZWxlbWVudCA9CisJCSAgICAoc3RydWN0IHJ0bGxpYl9pbmZvX2VsZW1lbnQgKikmaW5mb19lbGVtZW50LT4KKwkJICAgIGRhdGFbaW5mb19lbGVtZW50LT5sZW5dOworCX0KKworCWlmICghbmV0d29yay0+YXRoZXJvc19jYXBfZXhpc3QgJiYgIW5ldHdvcmstPmJyb2FkY29tX2NhcF9leGlzdCAmJgorCSAgICAhbmV0d29yay0+Y2lzY29fY2FwX2V4aXN0ICYmICFuZXR3b3JrLT5yYWxpbmtfY2FwX2V4aXN0ICYmCisJICAgICFuZXR3b3JrLT5ic3NodC5iZFJUMlJUQWdncmVnYXRpb24pCisJCW5ldHdvcmstPnVua25vd25fY2FwX2V4aXN0ID0gdHJ1ZTsKKwllbHNlCisJCW5ldHdvcmstPnVua25vd25fY2FwX2V4aXN0ID0gZmFsc2U7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggcnRsbGliX1NpZ25hbFN0cmVuZ3RoVHJhbnNsYXRlKHU4ICBDdXJyU1MpCit7CisJdTggUmV0U1M7CisKKwlpZiAoQ3VyclNTID49IDcxICYmIEN1cnJTUyA8PSAxMDApCisJCVJldFNTID0gOTAgKyAoKEN1cnJTUyAtIDcwKSAvIDMpOworCWVsc2UgaWYgKEN1cnJTUyA+PSA0MSAmJiBDdXJyU1MgPD0gNzApCisJCVJldFNTID0gNzggKyAoKEN1cnJTUyAtIDQwKSAvIDMpOworCWVsc2UgaWYgKEN1cnJTUyA+PSAzMSAmJiBDdXJyU1MgPD0gNDApCisJCVJldFNTID0gNjYgKyAoQ3VyclNTIC0gMzApOworCWVsc2UgaWYgKEN1cnJTUyA+PSAyMSAmJiBDdXJyU1MgPD0gMzApCisJCVJldFNTID0gNTQgKyAoQ3VyclNTIC0gMjApOworCWVsc2UgaWYgKEN1cnJTUyA+PSA1ICYmIEN1cnJTUyA8PSAyMCkKKwkJUmV0U1MgPSA0MiArICgoKEN1cnJTUyAtIDUpICogMikgLyAzKTsKKwllbHNlIGlmIChDdXJyU1MgPT0gNCkKKwkJUmV0U1MgPSAzNjsKKwllbHNlIGlmIChDdXJyU1MgPT0gMykKKwkJUmV0U1MgPSAyNzsKKwllbHNlIGlmIChDdXJyU1MgPT0gMikKKwkJUmV0U1MgPSAxODsKKwllbHNlIGlmIChDdXJyU1MgPT0gMSkKKwkJUmV0U1MgPSA5OworCWVsc2UKKwkJUmV0U1MgPSBDdXJyU1M7CisKKwlyZXR1cm4gUmV0U1M7Cit9CisKK3N0YXRpYyBsb25nIHJ0bGxpYl90cmFuc2xhdGVfdG9kYm0odTggc2lnbmFsX3N0cmVuZ3RoX2luZGV4KQoreworCWxvbmcJc2lnbmFsX3Bvd2VyOworCisJc2lnbmFsX3Bvd2VyID0gKGxvbmcpKChzaWduYWxfc3RyZW5ndGhfaW5kZXggKyAxKSA+PiAxKTsKKwlzaWduYWxfcG93ZXIgLT0gOTU7CisKKwlyZXR1cm4gc2lnbmFsX3Bvd2VyOworfQorCitzdGF0aWMgaW5saW5lIGludCBydGxsaWJfbmV0d29ya19pbml0KAorCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCXN0cnVjdCBydGxsaWJfcHJvYmVfcmVzcG9uc2UgKmJlYWNvbiwKKwlzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKm5ldHdvcmssCisJc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqc3RhdHMpCit7CisKKwkvKgorCW5ldHdvcmstPnFvc19kYXRhLmFjdGl2ZSA9IDA7CisJbmV0d29yay0+cW9zX2RhdGEuc3VwcG9ydGVkID0gMDsKKwluZXR3b3JrLT5xb3NfZGF0YS5wYXJhbV9jb3VudCA9IDA7CisJbmV0d29yay0+cW9zX2RhdGEub2xkX3BhcmFtX2NvdW50ID0gMDsKKwkqLworCW1lbXNldCgmbmV0d29yay0+cW9zX2RhdGEsIDAsIHNpemVvZihzdHJ1Y3QgcnRsbGliX3Fvc19kYXRhKSk7CisKKwkvKiBQdWxsIG91dCBmaXhlZCBmaWVsZCBkYXRhICovCisJbWVtY3B5KG5ldHdvcmstPmJzc2lkLCBiZWFjb24tPmhlYWRlci5hZGRyMywgRVRIX0FMRU4pOworCW5ldHdvcmstPmNhcGFiaWxpdHkgPSBsZTE2X3RvX2NwdShiZWFjb24tPmNhcGFiaWxpdHkpOworCW5ldHdvcmstPmxhc3Rfc2Nhbm5lZCA9IGppZmZpZXM7CisJbmV0d29yay0+dGltZV9zdGFtcFswXSA9IGxlMzJfdG9fY3B1KGJlYWNvbi0+dGltZV9zdGFtcFswXSk7CisJbmV0d29yay0+dGltZV9zdGFtcFsxXSA9IGxlMzJfdG9fY3B1KGJlYWNvbi0+dGltZV9zdGFtcFsxXSk7CisJbmV0d29yay0+YmVhY29uX2ludGVydmFsID0gbGUzMl90b19jcHUoYmVhY29uLT5iZWFjb25faW50ZXJ2YWwpOworCS8qIFdoZXJlIHRvIHB1bGwgdGhpcz8gYmVhY29uLT5saXN0ZW5faW50ZXJ2YWw7Ki8KKwluZXR3b3JrLT5saXN0ZW5faW50ZXJ2YWwgPSAweDBBOworCW5ldHdvcmstPnJhdGVzX2xlbiA9IG5ldHdvcmstPnJhdGVzX2V4X2xlbiA9IDA7CisJbmV0d29yay0+bGFzdF9hc3NvY2lhdGUgPSAwOworCW5ldHdvcmstPnNzaWRfbGVuID0gMDsKKwluZXR3b3JrLT5oaWRkZW5fc3NpZF9sZW4gPSAwOworCW1lbXNldChuZXR3b3JrLT5oaWRkZW5fc3NpZCwgMCwgc2l6ZW9mKG5ldHdvcmstPmhpZGRlbl9zc2lkKSk7CisJbmV0d29yay0+ZmxhZ3MgPSAwOworCW5ldHdvcmstPmF0aW1fd2luZG93ID0gMDsKKwluZXR3b3JrLT5lcnBfdmFsdWUgPSAobmV0d29yay0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSA/CisJICAgIDB4MyA6IDB4MDsKKwluZXR3b3JrLT5iZXJwX2luZm9fdmFsaWQgPSBmYWxzZTsKKwluZXR3b3JrLT5icm9hZGNvbV9jYXBfZXhpc3QgPSBmYWxzZTsKKwluZXR3b3JrLT5yYWxpbmtfY2FwX2V4aXN0ID0gZmFsc2U7CisJbmV0d29yay0+YXRoZXJvc19jYXBfZXhpc3QgPSBmYWxzZTsKKwluZXR3b3JrLT5jaXNjb19jYXBfZXhpc3QgPSBmYWxzZTsKKwluZXR3b3JrLT51bmtub3duX2NhcF9leGlzdCA9IGZhbHNlOworCW5ldHdvcmstPnJlYWx0ZWtfY2FwX2V4aXQgPSBmYWxzZTsKKwluZXR3b3JrLT5tYXJ2ZWxsX2NhcF9leGlzdCA9IGZhbHNlOworCW5ldHdvcmstPmFpcmdvX2NhcF9leGlzdCA9IGZhbHNlOworCW5ldHdvcmstPlR1cmJvX0VuYWJsZSA9IDA7CisJbmV0d29yay0+U2lnbmFsU3RyZW5ndGggPSBzdGF0cy0+U2lnbmFsU3RyZW5ndGg7CisJbmV0d29yay0+UlNTSSA9IHN0YXRzLT5TaWduYWxTdHJlbmd0aDsKKwluZXR3b3JrLT5Db3VudHJ5SWVMZW4gPSAwOworCW1lbXNldChuZXR3b3JrLT5Db3VudHJ5SWVCdWYsIDAsIE1BWF9JRV9MRU4pOworCUhUSW5pdGlhbGl6ZUJzc0Rlc2MoJm5ldHdvcmstPmJzc2h0KTsKKwlpZiAoc3RhdHMtPmZyZXEgPT0gUlRMTElCXzUyR0haX0JBTkQpIHsKKwkJLyogZm9yIEEgYmFuZCAoTm8gRFMgaW5mbykgKi8KKwkJbmV0d29yay0+Y2hhbm5lbCA9IHN0YXRzLT5yZWNlaXZlZF9jaGFubmVsOworCX0gZWxzZQorCQluZXR3b3JrLT5mbGFncyB8PSBORVRXT1JLX0hBU19DQ0s7CisKKwluZXR3b3JrLT53cGFfaWVfbGVuID0gMDsKKwluZXR3b3JrLT5yc25faWVfbGVuID0gMDsKKwluZXR3b3JrLT53emNfaWVfbGVuID0gMDsKKworCWlmIChydGxsaWJfcGFyc2VfaW5mb19wYXJhbShpZWVlLAorCQkJYmVhY29uLT5pbmZvX2VsZW1lbnQsCisJCQkoc3RhdHMtPmxlbiAtIHNpemVvZigqYmVhY29uKSksCisJCQluZXR3b3JrLAorCQkJc3RhdHMpKQorCQlyZXR1cm4gMTsKKworCW5ldHdvcmstPm1vZGUgPSAwOworCWlmIChzdGF0cy0+ZnJlcSA9PSBSVExMSUJfNTJHSFpfQkFORCkKKwkJbmV0d29yay0+bW9kZSA9IElFRUVfQTsKKwllbHNlIHsKKwkJaWYgKG5ldHdvcmstPmZsYWdzICYgTkVUV09SS19IQVNfT0ZETSkKKwkJCW5ldHdvcmstPm1vZGUgfD0gSUVFRV9HOworCQlpZiAobmV0d29yay0+ZmxhZ3MgJiBORVRXT1JLX0hBU19DQ0spCisJCQluZXR3b3JrLT5tb2RlIHw9IElFRUVfQjsKKwl9CisKKwlpZiAobmV0d29yay0+bW9kZSA9PSAwKSB7CisJCVJUTExJQl9ERUJVR19TQ0FOKCJGaWx0ZXJlZCBvdXQgJyVzICglcE0pJyAiCisJCQkJICAgICAibmV0d29yay5cbiIsCisJCQkJICAgICBlc2NhcGVfZXNzaWQobmV0d29yay0+c3NpZCwKKwkJCQkJCSAgbmV0d29yay0+c3NpZF9sZW4pLAorCQkJCSAgICAgbmV0d29yay0+YnNzaWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAobmV0d29yay0+YnNzaHQuYmRTdXBwb3J0SFQpIHsKKwkJaWYgKG5ldHdvcmstPm1vZGUgPT0gSUVFRV9BKQorCQkJbmV0d29yay0+bW9kZSA9IElFRUVfTl81RzsKKwkJZWxzZSBpZiAobmV0d29yay0+bW9kZSAmIChJRUVFX0cgfCBJRUVFX0IpKQorCQkJbmV0d29yay0+bW9kZSA9IElFRUVfTl8yNEc7CisJfQorCWlmIChydGxsaWJfaXNfZW1wdHlfZXNzaWQobmV0d29yay0+c3NpZCwgbmV0d29yay0+c3NpZF9sZW4pKQorCQluZXR3b3JrLT5mbGFncyB8PSBORVRXT1JLX0VNUFRZX0VTU0lEOworCXN0YXRzLT5zaWduYWwgPSAzMCArIChzdGF0cy0+U2lnbmFsU3RyZW5ndGggKiA3MCkgLyAxMDA7CisJc3RhdHMtPm5vaXNlID0gcnRsbGliX3RyYW5zbGF0ZV90b2RibSgodTgpKDEwMC1zdGF0cy0+c2lnbmFsKSkgLSAyNTsKKworCW1lbWNweSgmbmV0d29yay0+c3RhdHMsIHN0YXRzLCBzaXplb2YobmV0d29yay0+c3RhdHMpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19zYW1lX25ldHdvcmsoc3RydWN0IHJ0bGxpYl9uZXR3b3JrICpzcmMsCisJCQkJICBzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKmRzdCwgdTggc3NpZGJyb2FkKQoreworCS8qIEEgbmV0d29yayBpcyBvbmx5IGEgZHVwbGljYXRlIGlmIHRoZSBjaGFubmVsLCBCU1NJRCwgRVNTSUQKKwkgKiBhbmQgdGhlIGNhcGFiaWxpdHkgZmllbGQgKGluIHBhcnRpY3VsYXIgSUJTUyBhbmQgQlNTKSBhbGwgbWF0Y2guCisJICogV2UgdHJlYXQgYWxsIDxoaWRkZW4+IHdpdGggdGhlIHNhbWUgQlNTSUQgYW5kIGNoYW5uZWwKKwkgKiBhcyBvbmUgbmV0d29yayAqLworCXJldHVybiAoKChzcmMtPnNzaWRfbGVuID09IGRzdC0+c3NpZF9sZW4pIHx8ICghc3NpZGJyb2FkKSkgJiYKKwkJKHNyYy0+Y2hhbm5lbCA9PSBkc3QtPmNoYW5uZWwpICYmCisJCSFtZW1jbXAoc3JjLT5ic3NpZCwgZHN0LT5ic3NpZCwgRVRIX0FMRU4pICYmCisJCSghbWVtY21wKHNyYy0+c3NpZCwgZHN0LT5zc2lkLCBzcmMtPnNzaWRfbGVuKSB8fAorCQkoIXNzaWRicm9hZCkpICYmCisJCSgoc3JjLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpID09CisJCShkc3QtPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfSUJTUykpICYmCisJCSgoc3JjLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0VTUykgPT0KKwkJKGRzdC0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9FU1MpKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfaWJzc19uZXR3b3JrKHN0cnVjdCBydGxsaWJfbmV0d29yayAqZHN0LAorCQkJCSAgc3RydWN0IHJ0bGxpYl9uZXR3b3JrICpzcmMpCit7CisJbWVtY3B5KCZkc3QtPnN0YXRzLCAmc3JjLT5zdGF0cywgc2l6ZW9mKHN0cnVjdCBydGxsaWJfcnhfc3RhdHMpKTsKKwlkc3QtPmxhc3Rfc2Nhbm5lZCA9IGppZmZpZXM7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9uZXR3b3JrKHN0cnVjdCBydGxsaWJfbmV0d29yayAqZHN0LAorCQkJCSAgc3RydWN0IHJ0bGxpYl9uZXR3b3JrICpzcmMpCit7CisJaW50IHFvc19hY3RpdmU7CisJdTggb2xkX3BhcmFtOworCisJbWVtY3B5KCZkc3QtPnN0YXRzLCAmc3JjLT5zdGF0cywgc2l6ZW9mKHN0cnVjdCBydGxsaWJfcnhfc3RhdHMpKTsKKwlkc3QtPmNhcGFiaWxpdHkgPSBzcmMtPmNhcGFiaWxpdHk7CisJbWVtY3B5KGRzdC0+cmF0ZXMsIHNyYy0+cmF0ZXMsIHNyYy0+cmF0ZXNfbGVuKTsKKwlkc3QtPnJhdGVzX2xlbiA9IHNyYy0+cmF0ZXNfbGVuOworCW1lbWNweShkc3QtPnJhdGVzX2V4LCBzcmMtPnJhdGVzX2V4LCBzcmMtPnJhdGVzX2V4X2xlbik7CisJZHN0LT5yYXRlc19leF9sZW4gPSBzcmMtPnJhdGVzX2V4X2xlbjsKKwlpZiAoc3JjLT5zc2lkX2xlbiA+IDApIHsKKwkJaWYgKGRzdC0+c3NpZF9sZW4gPT0gMCkgeworCQkJbWVtc2V0KGRzdC0+aGlkZGVuX3NzaWQsIDAsIHNpemVvZihkc3QtPmhpZGRlbl9zc2lkKSk7CisJCQlkc3QtPmhpZGRlbl9zc2lkX2xlbiA9IHNyYy0+c3NpZF9sZW47CisJCQltZW1jcHkoZHN0LT5oaWRkZW5fc3NpZCwgc3JjLT5zc2lkLCBzcmMtPnNzaWRfbGVuKTsKKwkJfSBlbHNlIHsKKwkJCW1lbXNldChkc3QtPnNzaWQsIDAsIGRzdC0+c3NpZF9sZW4pOworCQkJZHN0LT5zc2lkX2xlbiA9IHNyYy0+c3NpZF9sZW47CisJCQltZW1jcHkoZHN0LT5zc2lkLCBzcmMtPnNzaWQsIHNyYy0+c3NpZF9sZW4pOworCQl9CisJfQorCWRzdC0+bW9kZSA9IHNyYy0+bW9kZTsKKwlkc3QtPmZsYWdzID0gc3JjLT5mbGFnczsKKwlkc3QtPnRpbWVfc3RhbXBbMF0gPSBzcmMtPnRpbWVfc3RhbXBbMF07CisJZHN0LT50aW1lX3N0YW1wWzFdID0gc3JjLT50aW1lX3N0YW1wWzFdOworCWlmIChzcmMtPmZsYWdzICYgTkVUV09SS19IQVNfRVJQX1ZBTFVFKSB7CisJCWRzdC0+ZXJwX3ZhbHVlID0gc3JjLT5lcnBfdmFsdWU7CisJCWRzdC0+YmVycF9pbmZvX3ZhbGlkID0gc3JjLT5iZXJwX2luZm9fdmFsaWQgPSB0cnVlOworCX0KKwlkc3QtPmJlYWNvbl9pbnRlcnZhbCA9IHNyYy0+YmVhY29uX2ludGVydmFsOworCWRzdC0+bGlzdGVuX2ludGVydmFsID0gc3JjLT5saXN0ZW5faW50ZXJ2YWw7CisJZHN0LT5hdGltX3dpbmRvdyA9IHNyYy0+YXRpbV93aW5kb3c7CisJZHN0LT5kdGltX3BlcmlvZCA9IHNyYy0+ZHRpbV9wZXJpb2Q7CisJZHN0LT5kdGltX2RhdGEgPSBzcmMtPmR0aW1fZGF0YTsKKwlkc3QtPmxhc3RfZHRpbV9zdGFfdGltZSA9IHNyYy0+bGFzdF9kdGltX3N0YV90aW1lOworCW1lbWNweSgmZHN0LT50aW0sICZzcmMtPnRpbSwgc2l6ZW9mKHN0cnVjdCBydGxsaWJfdGltX3BhcmFtZXRlcnMpKTsKKworCWRzdC0+YnNzaHQuYmRTdXBwb3J0SFQgPSBzcmMtPmJzc2h0LmJkU3VwcG9ydEhUOworCWRzdC0+YnNzaHQuYmRSVDJSVEFnZ3JlZ2F0aW9uID0gc3JjLT5ic3NodC5iZFJUMlJUQWdncmVnYXRpb247CisJZHN0LT5ic3NodC5iZEhUQ2FwTGVuID0gc3JjLT5ic3NodC5iZEhUQ2FwTGVuOworCW1lbWNweShkc3QtPmJzc2h0LmJkSFRDYXBCdWYsIHNyYy0+YnNzaHQuYmRIVENhcEJ1ZiwKKwkgICAgICAgc3JjLT5ic3NodC5iZEhUQ2FwTGVuKTsKKwlkc3QtPmJzc2h0LmJkSFRJbmZvTGVuID0gc3JjLT5ic3NodC5iZEhUSW5mb0xlbjsKKwltZW1jcHkoZHN0LT5ic3NodC5iZEhUSW5mb0J1Ziwgc3JjLT5ic3NodC5iZEhUSW5mb0J1ZiwKKwkgICAgICAgc3JjLT5ic3NodC5iZEhUSW5mb0xlbik7CisJZHN0LT5ic3NodC5iZEhUU3BlY1ZlciA9IHNyYy0+YnNzaHQuYmRIVFNwZWNWZXI7CisJZHN0LT5ic3NodC5iZFJUMlJUTG9uZ1Nsb3RUaW1lID0gc3JjLT5ic3NodC5iZFJUMlJUTG9uZ1Nsb3RUaW1lOworCWRzdC0+YnJvYWRjb21fY2FwX2V4aXN0ID0gc3JjLT5icm9hZGNvbV9jYXBfZXhpc3Q7CisJZHN0LT5yYWxpbmtfY2FwX2V4aXN0ID0gc3JjLT5yYWxpbmtfY2FwX2V4aXN0OworCWRzdC0+YXRoZXJvc19jYXBfZXhpc3QgPSBzcmMtPmF0aGVyb3NfY2FwX2V4aXN0OworCWRzdC0+cmVhbHRla19jYXBfZXhpdCA9IHNyYy0+cmVhbHRla19jYXBfZXhpdDsKKwlkc3QtPm1hcnZlbGxfY2FwX2V4aXN0ID0gc3JjLT5tYXJ2ZWxsX2NhcF9leGlzdDsKKwlkc3QtPmNpc2NvX2NhcF9leGlzdCA9IHNyYy0+Y2lzY29fY2FwX2V4aXN0OworCWRzdC0+YWlyZ29fY2FwX2V4aXN0ID0gc3JjLT5haXJnb19jYXBfZXhpc3Q7CisJZHN0LT51bmtub3duX2NhcF9leGlzdCA9IHNyYy0+dW5rbm93bl9jYXBfZXhpc3Q7CisJbWVtY3B5KGRzdC0+d3BhX2llLCBzcmMtPndwYV9pZSwgc3JjLT53cGFfaWVfbGVuKTsKKwlkc3QtPndwYV9pZV9sZW4gPSBzcmMtPndwYV9pZV9sZW47CisJbWVtY3B5KGRzdC0+cnNuX2llLCBzcmMtPnJzbl9pZSwgc3JjLT5yc25faWVfbGVuKTsKKwlkc3QtPnJzbl9pZV9sZW4gPSBzcmMtPnJzbl9pZV9sZW47CisJbWVtY3B5KGRzdC0+d3pjX2llLCBzcmMtPnd6Y19pZSwgc3JjLT53emNfaWVfbGVuKTsKKwlkc3QtPnd6Y19pZV9sZW4gPSBzcmMtPnd6Y19pZV9sZW47CisKKwlkc3QtPmxhc3Rfc2Nhbm5lZCA9IGppZmZpZXM7CisJLyogcW9zIHJlbGF0ZWQgcGFyYW1ldGVycyAqLworCXFvc19hY3RpdmUgPSBkc3QtPnFvc19kYXRhLmFjdGl2ZTsKKwlvbGRfcGFyYW0gPSBkc3QtPnFvc19kYXRhLnBhcmFtX2NvdW50OworCWRzdC0+cW9zX2RhdGEuc3VwcG9ydGVkID0gc3JjLT5xb3NfZGF0YS5zdXBwb3J0ZWQ7CisJaWYgKGRzdC0+ZmxhZ3MgJiBORVRXT1JLX0hBU19RT1NfUEFSQU1FVEVSUykKKwkJbWVtY3B5KCZkc3QtPnFvc19kYXRhLCAmc3JjLT5xb3NfZGF0YSwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRsbGliX3Fvc19kYXRhKSk7CisJaWYgKGRzdC0+cW9zX2RhdGEuc3VwcG9ydGVkID09IDEpIHsKKwkJaWYgKGRzdC0+c3NpZF9sZW4pCisJCQlSVExMSUJfREVCVUdfUU9TCisJCQkJKCJRb1MgdGhlIG5ldHdvcmsgJXMgaXMgUW9TIHN1cHBvcnRlZFxuIiwKKwkJCQlkc3QtPnNzaWQpOworCQllbHNlCisJCQlSVExMSUJfREVCVUdfUU9TCisJCQkJKCJRb1MgdGhlIG5ldHdvcmsgaXMgUW9TIHN1cHBvcnRlZFxuIik7CisJfQorCWRzdC0+cW9zX2RhdGEuYWN0aXZlID0gcW9zX2FjdGl2ZTsKKwlkc3QtPnFvc19kYXRhLm9sZF9wYXJhbV9jb3VudCA9IG9sZF9wYXJhbTsKKworCS8qIGRzdC0+bGFzdF9hc3NvY2lhdGUgaXMgbm90IG92ZXJ3cml0dGVuICovCisJZHN0LT53bW1faW5mbyA9IHNyYy0+d21tX2luZm87CisJaWYgKHNyYy0+d21tX3BhcmFtWzBdLmFjX2FjaV9hY21fYWlmc24gfHwKKwkgICBzcmMtPndtbV9wYXJhbVsxXS5hY19hY2lfYWNtX2FpZnNuIHx8CisJICAgc3JjLT53bW1fcGFyYW1bMl0uYWNfYWNpX2FjbV9haWZzbiB8fAorCSAgIHNyYy0+d21tX3BhcmFtWzFdLmFjX2FjaV9hY21fYWlmc24pCisJCW1lbWNweShkc3QtPndtbV9wYXJhbSwgc3JjLT53bW1fcGFyYW0sIFdNRV9BQ19QUkFNX0xFTik7CisKKwlkc3QtPlNpZ25hbFN0cmVuZ3RoID0gc3JjLT5TaWduYWxTdHJlbmd0aDsKKwlkc3QtPlJTU0kgPSBzcmMtPlJTU0k7CisJZHN0LT5UdXJib19FbmFibGUgPSBzcmMtPlR1cmJvX0VuYWJsZTsKKworCWRzdC0+Q291bnRyeUllTGVuID0gc3JjLT5Db3VudHJ5SWVMZW47CisJbWVtY3B5KGRzdC0+Q291bnRyeUllQnVmLCBzcmMtPkNvdW50cnlJZUJ1Ziwgc3JjLT5Db3VudHJ5SWVMZW4pOworCisJZHN0LT5iV2l0aEFpcm9uZXRJRSA9IHNyYy0+YldpdGhBaXJvbmV0SUU7CisJZHN0LT5iQ2tpcFN1cHBvcnRlZCA9IHNyYy0+YkNraXBTdXBwb3J0ZWQ7CisJbWVtY3B5KGRzdC0+Q2N4Um1TdGF0ZSwgc3JjLT5DY3hSbVN0YXRlLCAyKTsKKwlkc3QtPmJDY3hSbUVuYWJsZSA9IHNyYy0+YkNjeFJtRW5hYmxlOworCWRzdC0+TUJzc2lkTWFzayA9IHNyYy0+TUJzc2lkTWFzazsKKwlkc3QtPmJNQnNzaWRWYWxpZCA9IHNyYy0+Yk1Cc3NpZFZhbGlkOworCW1lbWNweShkc3QtPk1Cc3NpZCwgc3JjLT5NQnNzaWQsIDYpOworCWRzdC0+YldpdGhDY3hWZXJOdW0gPSBzcmMtPmJXaXRoQ2N4VmVyTnVtOworCWRzdC0+QnNzQ2N4VmVyTnVtYmVyID0gc3JjLT5Cc3NDY3hWZXJOdW1iZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2JlYWNvbihfX2xlMTYgZmMpCit7CisJcmV0dXJuIChXTEFOX0ZDX0dFVF9TVFlQRShsZTE2X3RvX2NwdShmYykpID09IFJUTExJQl9TVFlQRV9CRUFDT04pOworfQorCitzdGF0aWMgaW50IElzUGFzc2l2ZUNoYW5uZWwoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKnJ0bGxpYiwgdTggY2hhbm5lbCkKK3sKKwlpZiAoTUFYX0NIQU5ORUxfTlVNQkVSIDwgY2hhbm5lbCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlcygpOiBJbnZhbGlkIENoYW5uZWxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHJ0bGxpYi0+YWN0aXZlX2NoYW5uZWxfbWFwW2NoYW5uZWxdID09IDIpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBJc0xlZ2FsQ2hhbm5lbChzdHJ1Y3QgcnRsbGliX2RldmljZSAqcnRsbGliLCB1OCBjaGFubmVsKQoreworCWlmIChNQVhfQ0hBTk5FTF9OVU1CRVIgPCBjaGFubmVsKSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzKCk6IEludmFsaWQgQ2hhbm5lbFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHJ0bGxpYi0+YWN0aXZlX2NoYW5uZWxfbWFwW2NoYW5uZWxdID4gMCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0bGxpYl9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlKAorCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCXN0cnVjdCBydGxsaWJfcHJvYmVfcmVzcG9uc2UgKmJlYWNvbiwKKwlzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpzdGF0cykKK3sKKwlzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKnRhcmdldDsKKwlzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKm9sZGVzdCA9IE5VTEw7CisJc3RydWN0IHJ0bGxpYl9pbmZvX2VsZW1lbnQgKmluZm9fZWxlbWVudCA9ICZiZWFjb24tPmluZm9fZWxlbWVudFswXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNob3J0IHJlbmV3OworCXN0cnVjdCBydGxsaWJfbmV0d29yayAqbmV0d29yayA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBydGxsaWJfbmV0d29yayksCisJCQkJCQkgR0ZQX0FUT01JQyk7CisKKwlpZiAoIW5ldHdvcmspCisJCXJldHVybjsKKworCVJUTExJQl9ERUJVR19TQ0FOKAorCQkiJyVzJyAoICVwTSApOiAlYyVjJWMlYyAlYyVjJWMlYy0lYyVjJWMlYyAlYyVjJWMlY1xuIiwKKwkJZXNjYXBlX2Vzc2lkKGluZm9fZWxlbWVudC0+ZGF0YSwgaW5mb19lbGVtZW50LT5sZW4pLAorCQliZWFjb24tPmhlYWRlci5hZGRyMywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGYpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGUpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGQpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGMpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGIpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweGEpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDkpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDgpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDcpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDYpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDUpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDQpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDMpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDIpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDEpKSA/ICcxJyA6ICcwJywKKwkJKGJlYWNvbi0+Y2FwYWJpbGl0eSAmICgxPDwweDApKSA/ICcxJyA6ICcwJyk7CisKKwlpZiAocnRsbGliX25ldHdvcmtfaW5pdChpZWVlLCBiZWFjb24sIG5ldHdvcmssIHN0YXRzKSkgeworCQlSVExMSUJfREVCVUdfU0NBTigiRHJvcHBlZCAnJXMnICggJXBNKSB2aWEgJXMuXG4iLAorCQkJCSAgZXNjYXBlX2Vzc2lkKGluZm9fZWxlbWVudC0+ZGF0YSwKKwkJCQkgIGluZm9fZWxlbWVudC0+bGVuKSwKKwkJCQkgIGJlYWNvbi0+aGVhZGVyLmFkZHIzLAorCQkJCSAgV0xBTl9GQ19HRVRfU1RZUEUoYmVhY29uLT5oZWFkZXIuZnJhbWVfY3RsKSA9PQorCQkJCSAgUlRMTElCX1NUWVBFX1BST0JFX1JFU1AgPworCQkJCSAgIlBST0JFIFJFU1BPTlNFIiA6ICJCRUFDT04iKTsKKwkJZ290byBmcmVlX25ldHdvcms7CisJfQorCisKKwlpZiAoIUlzTGVnYWxDaGFubmVsKGllZWUsIG5ldHdvcmstPmNoYW5uZWwpKQorCQlnb3RvIGZyZWVfbmV0d29yazsKKworCWlmIChXTEFOX0ZDX0dFVF9TVFlQRShiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpID09CisJICAgIFJUTExJQl9TVFlQRV9QUk9CRV9SRVNQKSB7CisJCWlmIChJc1Bhc3NpdmVDaGFubmVsKGllZWUsIG5ldHdvcmstPmNoYW5uZWwpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJHZXRTY2FuSW5mbygpOiBGb3IgR2xvYmFsIERvbWFpbiwgIgorCQkJICAgICAgICJmaWx0ZXIgcHJvYmUgcmVzcG9uc2UgYXQgY2hhbm5lbCglZCkuXG4iLAorCQkJICAgICAgIG5ldHdvcmstPmNoYW5uZWwpOworCQkJZ290byBmcmVlX25ldHdvcms7CisJCX0KKwl9CisKKwkvKiBUaGUgbmV0d29yayBwYXJzZWQgY29ycmVjdGx5IC0tIHNvIG5vdyB3ZSBzY2FuIG91ciBrbm93biBuZXR3b3JrcworCSAqIHRvIHNlZSBpZiB3ZSBjYW4gZmluZCBpdCBpbiBvdXIgbGlzdC4KKwkgKgorCSAqIE5PVEU6ICBUaGlzIHNlYXJjaCBpcyBkZWZpbml0ZWx5IG5vdCBvcHRpbWl6ZWQuICBPbmNlIGl0cyBkb2luZworCSAqCXRoZSAicmlnaHQgdGhpbmciIHdlJ2xsIG9wdGltaXplIGl0IGZvciBlZmZpY2llbmN5IGlmCisJICoJbmVjZXNzYXJ5ICovCisKKwkvKiBTZWFyY2ggZm9yIHRoaXMgZW50cnkgaW4gdGhlIGxpc3QgYW5kIHVwZGF0ZSBpdCBpZiBpdCBpcworCSAqIGFscmVhZHkgdGhlcmUuICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCWlmIChpc19zYW1lX25ldHdvcmsoJmllZWUtPmN1cnJlbnRfbmV0d29yaywgbmV0d29yaywKKwkgICAobmV0d29yay0+c3NpZF9sZW4gPyAxIDogMCkpKSB7CisJCXVwZGF0ZV9uZXR3b3JrKCZpZWVlLT5jdXJyZW50X25ldHdvcmssIG5ldHdvcmspOworCQlpZiAoKGllZWUtPmN1cnJlbnRfbmV0d29yay5tb2RlID09IElFRUVfTl8yNEcgfHwKKwkJICAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX0cpCisJCSAgICAgJiYgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlcnBfaW5mb192YWxpZCkgeworCQkJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5lcnBfdmFsdWUgJiBFUlBfVXNlUHJvdGVjdGlvbikKKwkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuYnVzZXByb3RlY3Rpb24gPSB0cnVlOworCQkJZWxzZQorCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5idXNlcHJvdGVjdGlvbiA9IGZhbHNlOworCQl9CisJCWlmIChpc19iZWFjb24oYmVhY29uLT5oZWFkZXIuZnJhbWVfY3RsKSkgeworCQkJaWYgKGllZWUtPnN0YXRlID49IFJUTExJQl9MSU5LRUQpCisJCQkJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkJjbkluUGVyaW9kKys7CisJCX0KKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0YXJnZXQsICZpZWVlLT5uZXR3b3JrX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGlzX3NhbWVfbmV0d29yayh0YXJnZXQsIG5ldHdvcmssCisJCSAgICh0YXJnZXQtPnNzaWRfbGVuID8gMSA6IDApKSkKKwkJCWJyZWFrOworCQlpZiAoKG9sZGVzdCA9PSBOVUxMKSB8fAorCQkgICAgKHRhcmdldC0+bGFzdF9zY2FubmVkIDwgb2xkZXN0LT5sYXN0X3NjYW5uZWQpKQorCQkJb2xkZXN0ID0gdGFyZ2V0OworCX0KKworCS8qIElmIHdlIGRpZG4ndCBmaW5kIGEgbWF0Y2gsIHRoZW4gZ2V0IGEgbmV3IG5ldHdvcmsgc2xvdCB0byBpbml0aWFsaXplCisJICogd2l0aCB0aGlzIGJlYWNvbidzIGluZm9ybWF0aW9uICovCisJaWYgKCZ0YXJnZXQtPmxpc3QgPT0gJmllZWUtPm5ldHdvcmtfbGlzdCkgeworCQlpZiAobGlzdF9lbXB0eSgmaWVlZS0+bmV0d29ya19mcmVlX2xpc3QpKSB7CisJCQkvKiBJZiB0aGVyZSBhcmUgbm8gbW9yZSBzbG90cywgZXhwaXJlIHRoZSBvbGRlc3QgKi8KKwkJCWxpc3RfZGVsKCZvbGRlc3QtPmxpc3QpOworCQkJdGFyZ2V0ID0gb2xkZXN0OworCQkJUlRMTElCX0RFQlVHX1NDQU4oIkV4cGlyZWQgJyVzJyAoICVwTSkgZnJvbSAiCisJCQkJCSAgICAgIm5ldHdvcmsgbGlzdC5cbiIsCisJCQkJCSAgICAgZXNjYXBlX2Vzc2lkKHRhcmdldC0+c3NpZCwKKwkJCQkJCQkgIHRhcmdldC0+c3NpZF9sZW4pLAorCQkJCQkgICAgIHRhcmdldC0+YnNzaWQpOworCQl9IGVsc2UgeworCQkJLyogT3RoZXJ3aXNlIGp1c3QgcHVsbCBmcm9tIHRoZSBmcmVlIGxpc3QgKi8KKwkJCXRhcmdldCA9IGxpc3RfZW50cnkoaWVlZS0+bmV0d29ya19mcmVlX2xpc3QubmV4dCwKKwkJCQkJICAgIHN0cnVjdCBydGxsaWJfbmV0d29yaywgbGlzdCk7CisJCQlsaXN0X2RlbChpZWVlLT5uZXR3b3JrX2ZyZWVfbGlzdC5uZXh0KTsKKwkJfQorCisKKwkJUlRMTElCX0RFQlVHX1NDQU4oIkFkZGluZyAnJXMnICggJXBNKSB2aWEgJXMuXG4iLAorCQkJCSAgZXNjYXBlX2Vzc2lkKG5ldHdvcmstPnNzaWQsCisJCQkJICBuZXR3b3JrLT5zc2lkX2xlbiksIG5ldHdvcmstPmJzc2lkLAorCQkJCSAgV0xBTl9GQ19HRVRfU1RZUEUoYmVhY29uLT5oZWFkZXIuZnJhbWVfY3RsKSA9PQorCQkJCSAgUlRMTElCX1NUWVBFX1BST0JFX1JFU1AgPworCQkJCSAgIlBST0JFIFJFU1BPTlNFIiA6ICJCRUFDT04iKTsKKwkJbWVtY3B5KHRhcmdldCwgbmV0d29yaywgc2l6ZW9mKCp0YXJnZXQpKTsKKwkJbGlzdF9hZGRfdGFpbCgmdGFyZ2V0LT5saXN0LCAmaWVlZS0+bmV0d29ya19saXN0KTsKKwkJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKQorCQkJcnRsbGliX3NvZnRtYWNfbmV3X25ldChpZWVlLCBuZXR3b3JrKTsKKwl9IGVsc2UgeworCQlSVExMSUJfREVCVUdfU0NBTigiVXBkYXRpbmcgJyVzJyAoICVwTSkgdmlhICVzLlxuIiwKKwkJCQkgIGVzY2FwZV9lc3NpZCh0YXJnZXQtPnNzaWQsCisJCQkJICB0YXJnZXQtPnNzaWRfbGVuKSwgdGFyZ2V0LT5ic3NpZCwKKwkJCQkgIFdMQU5fRkNfR0VUX1NUWVBFKGJlYWNvbi0+aGVhZGVyLmZyYW1lX2N0bCkgPT0KKwkJCQkgIFJUTExJQl9TVFlQRV9QUk9CRV9SRVNQID8KKwkJCQkgICJQUk9CRSBSRVNQT05TRSIgOiAiQkVBQ09OIik7CisKKwkJLyogd2UgaGF2ZSBhbiBlbnRyeSBhbmQgd2UgYXJlIGdvaW5nIHRvIHVwZGF0ZSBpdC4gQnV0IHRoaXMKKwkJICogIGVudHJ5IG1heSBiZSBhbHJlYWR5IGV4cGlyZWQuIEluIHRoaXMgY2FzZSB3ZSBkbyB0aGUgc2FtZQorCQkgKiBhcyB3ZSBmb3VuZCBhIG5ldyBuZXQgYW5kIGNhbGwgdGhlIG5ld19uZXQgaGFuZGxlcgorCQkgKi8KKwkJcmVuZXcgPSAhdGltZV9hZnRlcih0YXJnZXQtPmxhc3Rfc2Nhbm5lZCArIGllZWUtPnNjYW5fYWdlLAorCQkJCSAgICBqaWZmaWVzKTsKKwkJaWYgKCghdGFyZ2V0LT5zc2lkX2xlbikgJiYKKwkJICAgICgoKG5ldHdvcmstPnNzaWRfbGVuID4gMCkgJiYgKHRhcmdldC0+aGlkZGVuX3NzaWRfbGVuID09IDApKQorCQkgICAgfHwgKChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPT0gbmV0d29yay0+c3NpZF9sZW4pICYmCisJCSAgICAoc3RybmNtcChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgbmV0d29yay0+c3NpZCwKKwkJICAgIG5ldHdvcmstPnNzaWRfbGVuKSA9PSAwKSAmJgorCQkgICAgKGllZWUtPnN0YXRlID09IFJUTExJQl9OT0xJTkspKSkpCisJCQlyZW5ldyA9IDE7CisJCXVwZGF0ZV9uZXR3b3JrKHRhcmdldCwgbmV0d29yayk7CisJCWlmIChyZW5ldyAmJiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpKQorCQkJcnRsbGliX3NvZnRtYWNfbmV3X25ldChpZWVlLCBuZXR3b3JrKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJaWYgKGlzX2JlYWNvbihiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpICYmCisJICAgIGlzX3NhbWVfbmV0d29yaygmaWVlZS0+Y3VycmVudF9uZXR3b3JrLCBuZXR3b3JrLAorCSAgICAobmV0d29yay0+c3NpZF9sZW4gPyAxIDogMCkpICYmCisJICAgIChpZWVlLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEKSkgeworCQlpZiAoaWVlZS0+aGFuZGxlX2JlYWNvbiAhPSBOVUxMKQorCQkJaWVlZS0+aGFuZGxlX2JlYWNvbihpZWVlLT5kZXYsIGJlYWNvbiwKKwkJCQkJICAgICZpZWVlLT5jdXJyZW50X25ldHdvcmspOworCX0KK2ZyZWVfbmV0d29yazoKKwlrZnJlZShuZXR3b3JrKTsKKwlyZXR1cm47Cit9CisKK3ZvaWQgcnRsbGliX3J4X21ndChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICAgc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqc3RhdHMpCit7CisJc3RydWN0IHJ0bGxpYl9oZHJfNGFkZHIgKmhlYWRlciA9IChzdHJ1Y3QgcnRsbGliX2hkcl80YWRkciAqKXNrYi0+ZGF0YSA7CisKKwlpZiAoV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpICE9IFJUTExJQl9TVFlQRV9QUk9CRV9SRVNQICYmCisJICAgIFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSAhPSBSVExMSUJfU1RZUEVfQkVBQ09OKQorCQlpZWVlLT5sYXN0X3J4X3BzX3RpbWUgPSBqaWZmaWVzOworCisJc3dpdGNoIChXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkpIHsKKworCWNhc2UgUlRMTElCX1NUWVBFX0JFQUNPTjoKKwkJUlRMTElCX0RFQlVHX01HTVQoInJlY2VpdmVkIEJFQUNPTiAoJWQpXG4iLAorCQkJCSAgV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpKTsKKwkJUlRMTElCX0RFQlVHX1NDQU4oIkJlYWNvblxuIik7CisJCXJ0bGxpYl9wcm9jZXNzX3Byb2JlX3Jlc3BvbnNlKAorCQkJCWllZWUsIChzdHJ1Y3QgcnRsbGliX3Byb2JlX3Jlc3BvbnNlICopaGVhZGVyLAorCQkJCXN0YXRzKTsKKworCQlpZiAoaWVlZS0+c3RhX3NsZWVwIHx8IChpZWVlLT5wcyAhPSBSVExMSUJfUFNfRElTQUJMRUQgJiYKKwkJICAgIGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSAmJgorCQkgICAgaWVlZS0+c3RhdGUgPT0gUlRMTElCX0xJTktFRCkpCisJCQl0YXNrbGV0X3NjaGVkdWxlKCZpZWVlLT5wc190YXNrKTsKKworCQlicmVhazsKKworCWNhc2UgUlRMTElCX1NUWVBFX1BST0JFX1JFU1A6CisJCVJUTExJQl9ERUJVR19NR01UKCJyZWNlaXZlZCBQUk9CRSBSRVNQT05TRSAoJWQpXG4iLAorCQkJV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpKTsKKwkJUlRMTElCX0RFQlVHX1NDQU4oIlByb2JlIHJlc3BvbnNlXG4iKTsKKwkJcnRsbGliX3Byb2Nlc3NfcHJvYmVfcmVzcG9uc2UoaWVlZSwKKwkJCSAgICAgIChzdHJ1Y3QgcnRsbGliX3Byb2JlX3Jlc3BvbnNlICopaGVhZGVyLCBzdGF0cyk7CisJCWJyZWFrOworCWNhc2UgUlRMTElCX1NUWVBFX1BST0JFX1JFUToKKwkJUlRMTElCX0RFQlVHX01HTVQoInJlY2VpdmVkIFBST0JFIFJFU1FVRVNUICglZClcbiIsCisJCQkJICBXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkpOworCQlSVExMSUJfREVCVUdfU0NBTigiUHJvYmUgcmVxdWVzdFxuIik7CisJCWlmICgoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19QUk9CRVJTKSAmJgorCQkgICAgKChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MgfHwKKwkJICAgIGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpICYmCisJCSAgICBpZWVlLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEKSkKKwkJCXJ0bGxpYl9yeF9wcm9iZV9ycShpZWVlLCBza2IpOworCQlicmVhazsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3NvZnRtYWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfc29mdG1hYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MDg2ODUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3NvZnRtYWMuYwpAQCAtMCwwICsxLDM3NDEgQEAKKy8qIElFRUUgODAyLjExIFNvZnRNQUMgbGF5ZXIKKyAqIENvcHlyaWdodCAoYykgMjAwNSBBbmRyZWEgTWVyZWxsbyA8YW5kcmVhbXJsQHRpc2NhbGkuaXQ+CisgKgorICogTW9zdGx5IGV4dHJhY3RlZCBmcm9tIHRoZSBydGw4MTgwLXNhMjQwMCBkcml2ZXIgZm9yIHRoZQorICogaW4ta2VybmVsIGdlbmVyaWMgaWVlZTgwMi4xMSBzdGFjay4KKyAqCisgKiBGZXcgbGluZXMgbWlnaHQgYmUgc3RvbGVuIGZyb20gb3RoZXIgcGFydCBvZiB0aGUgcnRsbGliCisgKiBzdGFjay4gQ29weXJpZ2h0IHdobyBvd24gaXQncyBjb3B5cmlnaHQKKyAqCisgKiBXUEEgY29kZSBzdG9sZW4gZnJvbSB0aGUgaXB3MjIwMCBkcml2ZXIuCisgKiBDb3B5cmlnaHQgd2hvIG93biBpdCdzIGNvcHlyaWdodC4KKyAqCisgKiByZWxlYXNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworCisjaW5jbHVkZSAicnRsbGliLmgiCisjaW5jbHVkZSAicnRsX2NvcmUuaCIKKworI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlICJkb3QxMWQuaCIKKworc2hvcnQgcnRsbGliX2lzXzU0ZyhzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKm5ldCkKK3sKKwlyZXR1cm4gKG5ldC0+cmF0ZXNfZXhfbGVuID4gMCkgfHwgKG5ldC0+cmF0ZXNfbGVuID4gNCk7Cit9CisKK3Nob3J0IHJ0bGxpYl9pc19zaG9ydHNsb3Qoc3RydWN0IHJ0bGxpYl9uZXR3b3JrIG5ldCkKK3sKKwlyZXR1cm4gbmV0LmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVF9USU1FOworfQorCisvKiByZXR1cm5zIHRoZSB0b3RhbCBsZW5ndGggbmVlZGVkIGZvciBwbGVhY2luZyB0aGUgUkFURSBNRklFCisgKiB0YWcgYW5kIHRoZSBFWFRFTkRFRCBSQVRFIE1GSUUgdGFnIGlmIG5lZWRlZC4KKyAqIEl0IGVuY2x1ZGVzIHR3byBieXRlcyBwZXIgdGFnIGZvciB0aGUgdGFnIGl0c2VsZiBhbmQgaXRzIGxlbgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHJ0bGxpYl9NRklFX3JhdGVfbGVuKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQoreworCXVuc2lnbmVkIGludCByYXRlX2xlbiA9IDA7CisKKwlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIFJUTExJQl9DQ0tfTU9EVUxBVElPTikKKwkJcmF0ZV9sZW4gPSBSVExMSUJfQ0NLX1JBVEVfTEVOICsgMjsKKworCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgUlRMTElCX09GRE1fTU9EVUxBVElPTikKKworCQlyYXRlX2xlbiArPSBSVExMSUJfT0ZETV9SQVRFX0xFTiArIDI7CisKKwlyZXR1cm4gcmF0ZV9sZW47Cit9CisKKy8qIHBsZWFjZSB0aGUgTUZJRSByYXRlLCB0YWcgdG8gdGhlIG1lbW9yeSAoZG91YmxlKSBwb2luZWQuCisgKiBUaGVuIGl0IHVwZGF0ZXMgdGhlIHBvaW50ZXIgc28gdGhhdAorICogaXQgcG9pbnRzIGFmdGVyIHRoZSBuZXcgTUZJRSB0YWcgYWRkZWQuCisgKi8KK3N0YXRpYyB2b2lkIHJ0bGxpYl9NRklFX0JyYXRlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCAqKnRhZ19wKQoreworCXU4ICp0YWcgPSAqdGFnX3A7CisKKwlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIFJUTExJQl9DQ0tfTU9EVUxBVElPTikgeworCQkqdGFnKysgPSBNRklFX1RZUEVfUkFURVM7CisJCSp0YWcrKyA9IDQ7CisJCSp0YWcrKyA9IFJUTExJQl9CQVNJQ19SQVRFX01BU0sgfCBSVExMSUJfQ0NLX1JBVEVfMU1COworCQkqdGFnKysgPSBSVExMSUJfQkFTSUNfUkFURV9NQVNLIHwgUlRMTElCX0NDS19SQVRFXzJNQjsKKwkJKnRhZysrID0gUlRMTElCX0JBU0lDX1JBVEVfTUFTSyB8IFJUTExJQl9DQ0tfUkFURV81TUI7CisJCSp0YWcrKyA9IFJUTExJQl9CQVNJQ19SQVRFX01BU0sgfCBSVExMSUJfQ0NLX1JBVEVfMTFNQjsKKwl9CisKKwkvKiBXZSBtYXkgYWRkIGFuIG9wdGlvbiBmb3IgY3VzdG9tIHJhdGVzIHRoYXQgc3BlY2lmaWMgSFcKKwkgKiBtaWdodCBzdXBwb3J0ICovCisJKnRhZ19wID0gdGFnOworfQorCitzdGF0aWMgdm9pZCBydGxsaWJfTUZJRV9HcmF0ZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkKK3sKKwl1OCAqdGFnID0gKnRhZ19wOworCisJaWYgKGllZWUtPm1vZHVsYXRpb24gJiBSVExMSUJfT0ZETV9NT0RVTEFUSU9OKSB7CisJCSp0YWcrKyA9IE1GSUVfVFlQRV9SQVRFU19FWDsKKwkJKnRhZysrID0gODsKKwkJKnRhZysrID0gUlRMTElCX0JBU0lDX1JBVEVfTUFTSyB8IFJUTExJQl9PRkRNX1JBVEVfNk1COworCQkqdGFnKysgPSBSVExMSUJfQkFTSUNfUkFURV9NQVNLIHwgUlRMTElCX09GRE1fUkFURV85TUI7CisJCSp0YWcrKyA9IFJUTExJQl9CQVNJQ19SQVRFX01BU0sgfCBSVExMSUJfT0ZETV9SQVRFXzEyTUI7CisJCSp0YWcrKyA9IFJUTExJQl9CQVNJQ19SQVRFX01BU0sgfCBSVExMSUJfT0ZETV9SQVRFXzE4TUI7CisJCSp0YWcrKyA9IFJUTExJQl9CQVNJQ19SQVRFX01BU0sgfCBSVExMSUJfT0ZETV9SQVRFXzI0TUI7CisJCSp0YWcrKyA9IFJUTExJQl9CQVNJQ19SQVRFX01BU0sgfCBSVExMSUJfT0ZETV9SQVRFXzM2TUI7CisJCSp0YWcrKyA9IFJUTExJQl9CQVNJQ19SQVRFX01BU0sgfCBSVExMSUJfT0ZETV9SQVRFXzQ4TUI7CisJCSp0YWcrKyA9IFJUTExJQl9CQVNJQ19SQVRFX01BU0sgfCBSVExMSUJfT0ZETV9SQVRFXzU0TUI7CisJfQorCS8qIFdlIG1heSBhZGQgYW4gb3B0aW9uIGZvciBjdXN0b20gcmF0ZXMgdGhhdCBzcGVjaWZpYyBIVyBtaWdodAorCSAqIHN1cHBvcnQgKi8KKwkqdGFnX3AgPSB0YWc7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bGxpYl9XTU1fSW5mbyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkKK3sKKwl1OCAqdGFnID0gKnRhZ19wOworCisJKnRhZysrID0gTUZJRV9UWVBFX0dFTkVSSUM7CisJKnRhZysrID0gNzsKKwkqdGFnKysgPSAweDAwOworCSp0YWcrKyA9IDB4NTA7CisJKnRhZysrID0gMHhmMjsKKwkqdGFnKysgPSAweDAyOworCSp0YWcrKyA9IDB4MDA7CisJKnRhZysrID0gMHgwMTsKKwkqdGFnKysgPSBNQVhfU1BfTGVuOworCSp0YWdfcCA9IHRhZzsKK30KKwordm9pZCBydGxsaWJfVFVSQk9fSW5mbyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggKip0YWdfcCkKK3sKKwl1OCAqdGFnID0gKnRhZ19wOworCisJKnRhZysrID0gTUZJRV9UWVBFX0dFTkVSSUM7CisJKnRhZysrID0gNzsKKwkqdGFnKysgPSAweDAwOworCSp0YWcrKyA9IDB4ZTA7CisJKnRhZysrID0gMHg0YzsKKwkqdGFnKysgPSAweDAxOworCSp0YWcrKyA9IDB4MDI7CisJKnRhZysrID0gMHgxMTsKKwkqdGFnKysgPSAweDAwOworCisJKnRhZ19wID0gdGFnOworCXByaW50ayhLRVJOX0FMRVJUICJUaGlzIGlzIGVuYWJsZSB0dXJibyBtb2RlIElFIHByb2Nlc3NcbiIpOworfQorCitzdGF0aWMgdm9pZCBlbnF1ZXVlX21nbXQoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IG5oOworCW5oID0gKGllZWUtPm1nbXRfcXVldWVfaGVhZCArIDEpICUgTUdNVF9RVUVVRV9OVU07CisKKy8qCisgKiBpZiB0aGUgcXVldWUgaXMgZnVsbCBidXQgd2UgaGF2ZSBuZXdlciBmcmFtZXMgdGhlbgorICoganVzdCBvdmVyd3JpdGVzIHRoZSBvbGRlc3QuCisgKgorICogaWYgKG5oID09IGllZWUtPm1nbXRfcXVldWVfdGFpbCkKKyAqCQlyZXR1cm4gLTE7CisgKi8KKwlpZWVlLT5tZ210X3F1ZXVlX2hlYWQgPSBuaDsKKwlpZWVlLT5tZ210X3F1ZXVlX3JpbmdbbmhdID0gc2tiOworCit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqZGVxdWV1ZV9tZ210KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBza19idWZmICpyZXQ7CisKKwlpZiAoaWVlZS0+bWdtdF9xdWV1ZV90YWlsID09IGllZWUtPm1nbXRfcXVldWVfaGVhZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSBpZWVlLT5tZ210X3F1ZXVlX3JpbmdbaWVlZS0+bWdtdF9xdWV1ZV90YWlsXTsKKworCWllZWUtPm1nbXRfcXVldWVfdGFpbCA9CisJCShpZWVlLT5tZ210X3F1ZXVlX3RhaWwrMSkgJSBNR01UX1FVRVVFX05VTTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfbWdtdF9xdWV1ZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwlpZWVlLT5tZ210X3F1ZXVlX3RhaWwgPSBpZWVlLT5tZ210X3F1ZXVlX2hlYWQgPSAwOworfQorCisKK3U4CitNZ250UXVlcnlfVHhSYXRlRXhjbHVkZUNDS1JhdGVzKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQoreworCXUxNglpOworCXU4CVF1ZXJ5UmF0ZSA9IDA7CisJdTgJQmFzaWNSYXRlOworCisKKwlmb3IgKGkgPSAwOyBpIDwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2xlbjsgaSsrKSB7CisJCUJhc2ljUmF0ZSA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc1tpXSYweDdGOworCQlpZiAoIXJ0bGxpYl9pc19jY2tfcmF0ZShCYXNpY1JhdGUpKSB7CisJCQlpZiAoUXVlcnlSYXRlID09IDApIHsKKwkJCQlRdWVyeVJhdGUgPSBCYXNpY1JhdGU7CisJCQl9IGVsc2UgeworCQkJCWlmIChCYXNpY1JhdGUgPCBRdWVyeVJhdGUpCisJCQkJCVF1ZXJ5UmF0ZSA9IEJhc2ljUmF0ZTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChRdWVyeVJhdGUgPT0gMCkgeworCQlRdWVyeVJhdGUgPSAxMjsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiTm8gQmFzaWNSYXRlIGZvdW5kISFcbiIpOworCX0KKwlyZXR1cm4gUXVlcnlSYXRlOworfQorCit1OCBNZ250UXVlcnlfTWdudEZyYW1lVHhSYXRlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBydF9oaV90aHJvdWdocHV0ICpwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKwl1OCByYXRlOworCisJaWYgKHBIVEluZm8tPklPVEFjdGlvbiAmIEhUX0lPVF9BQ1RfTUdOVF9VU0VfQ0NLXzZNKQorCQlyYXRlID0gMHgwYzsKKwllbHNlCisJCXJhdGUgPSBpZWVlLT5iYXNpY19yYXRlICYgMHg3ZjsKKworCWlmIChyYXRlID09IDApIHsKKwkJaWYgKGllZWUtPm1vZGUgPT0gSUVFRV9BIHx8CisJCSAgIGllZWUtPm1vZGUgPT0gSUVFRV9OXzVHIHx8CisJCSAgIChpZWVlLT5tb2RlID09IElFRUVfTl8yNEcgJiYgIXBIVEluZm8tPmJDdXJTdXBwQ0NLKSkKKwkJCXJhdGUgPSAweDBjOworCQllbHNlCisJCQlyYXRlID0gMHgwMjsKKwl9CisKKwlyZXR1cm4gcmF0ZTsKK30KKworaW5saW5lIHZvaWQgc29mdG1hY19tZ210X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaG9ydCBzaW5nbGUgPSBpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRTsKKwlzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkciAgKmhlYWRlciA9CisJCShzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkciAgKikgc2tiLT5kYXRhOworCisJc3RydWN0IGNiX2Rlc2MgKnRjYl9kZXNjID0gKHN0cnVjdCBjYl9kZXNjICopKHNrYi0+Y2IgKyA4KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJLyogY2FsbGVkIHdpdGggMm5kIHBhcmFtIDAsIG5vIG1nbXQgbG9jayByZXF1aXJlZCAqLworCXJ0bGxpYl9zdGFfd2FrZXVwKGllZWUsIDApOworCisJaWYgKGhlYWRlci0+ZnJhbWVfY3RsID09IFJUTExJQl9TVFlQRV9CRUFDT04pCisJCXRjYl9kZXNjLT5xdWV1ZV9pbmRleCA9IEJFQUNPTl9RVUVVRTsKKwllbHNlCisJCXRjYl9kZXNjLT5xdWV1ZV9pbmRleCA9IE1HTlRfUVVFVUU7CisKKwlpZiAoaWVlZS0+ZGlzYWJsZV9tZ250X3F1ZXVlKQorCQl0Y2JfZGVzYy0+cXVldWVfaW5kZXggPSBISUdIX1FVRVVFOworCisJdGNiX2Rlc2MtPmRhdGFfcmF0ZSA9IE1nbnRRdWVyeV9NZ250RnJhbWVUeFJhdGUoaWVlZSk7CisJdGNiX2Rlc2MtPlJBVFJJbmRleCA9IDc7CisJdGNiX2Rlc2MtPmJUeERpc2FibGVSYXRlRmFsbEJhY2sgPSAxOworCXRjYl9kZXNjLT5iVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGUgPSAxOworCWlmIChzaW5nbGUpIHsKKwkJaWYgKGllZWUtPnF1ZXVlX3N0b3ApIHsKKwkJCWVucXVldWVfbWdtdChpZWVlLCBza2IpOworCQl9IGVsc2UgeworCQkJaGVhZGVyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF08PDQpOworCisJCQlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCQkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCQkJZWxzZQorCQkJCWllZWUtPnNlcV9jdHJsWzBdKys7CisKKwkJCS8qIGF2b2lkIHdhdGNoZG9nIHRyaWdnZXJzICovCisJCQlpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KHNrYiwgaWVlZS0+ZGV2LAorCQkJCQkJCSAgIGllZWUtPmJhc2ljX3JhdGUpOworCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MpOworCisJCWhlYWRlci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdIDw8IDQpOworCisJCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKKwkJZWxzZQorCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKworCQkvKiBjaGVjayB3ZXRoZXIgdGhlIG1hbmFnZWQgcGFja2V0IHF1ZXVlZCBncmVhdGVyIHRoYW4gNSAqLworCQlpZiAoIWllZWUtPmNoZWNrX25pY19lbm91Z2hfZGVzYyhpZWVlLT5kZXYsIHRjYl9kZXNjLT5xdWV1ZV9pbmRleCkgfHwKKwkJICAgIChza2JfcXVldWVfbGVuKCZpZWVlLT5za2Jfd2FpdFFbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSkgIT0gMCkgfHwKKwkJICAgIChpZWVlLT5xdWV1ZV9zdG9wKSkgeworCQkJLyogaW5zZXJ0IHRoZSBza2IgcGFja2V0IHRvIHRoZSBtYW5hZ2VtZW50IHF1ZXVlICovCisJCQkvKiBhcyBmb3IgdGhlIGNvbXBsZXRpb24gZnVuY3Rpb24sIGl0IGRvZXMgbm90IG5lZWQKKwkJCSAqIHRvIGNoZWNrIGl0IGFueSBtb3JlLgorCQkJICogKi8KKwkJCXByaW50ayhLRVJOX0lORk8gIiVzKCk6aW5zZXJ0IHRvIHdhaXRxdWV1ZSwgcXVldWVfaW5kZXgiCisJCQkgICAgICAgIjolZCFcbiIsIF9fZnVuY19fLCB0Y2JfZGVzYy0+cXVldWVfaW5kZXgpOworCQkJc2tiX3F1ZXVlX3RhaWwoJmllZWUtPnNrYl93YWl0UVt0Y2JfZGVzYy0+cXVldWVfaW5kZXhdLAorCQkJCSAgICAgICBza2IpOworCQl9IGVsc2UgeworCQkJaWVlZS0+c29mdG1hY19oYXJkX3N0YXJ0X3htaXQoc2tiLCBpZWVlLT5kZXYpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MpOworCX0KK30KKworaW5saW5lIHZvaWQgc29mdG1hY19wc19tZ210X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJc2hvcnQgc2luZ2xlID0gaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUU7CisJc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgICpoZWFkZXIgPQorCQkoc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgICopIHNrYi0+ZGF0YTsKKwl1MTYgZmMsIHR5cGUsIHN0eXBlOworCXN0cnVjdCBjYl9kZXNjICp0Y2JfZGVzYyA9IChzdHJ1Y3QgY2JfZGVzYyAqKShza2ItPmNiICsgOCk7CisKKwlmYyA9IGhlYWRlci0+ZnJhbWVfY3RsOworCXR5cGUgPSBXTEFOX0ZDX0dFVF9UWVBFKGZjKTsKKwlzdHlwZSA9IFdMQU5fRkNfR0VUX1NUWVBFKGZjKTsKKworCisJaWYgKHN0eXBlICE9IFJUTExJQl9TVFlQRV9QU1BPTEwpCisJCXRjYl9kZXNjLT5xdWV1ZV9pbmRleCA9IE1HTlRfUVVFVUU7CisJZWxzZQorCQl0Y2JfZGVzYy0+cXVldWVfaW5kZXggPSBISUdIX1FVRVVFOworCisJaWYgKGllZWUtPmRpc2FibGVfbWdudF9xdWV1ZSkKKwkJdGNiX2Rlc2MtPnF1ZXVlX2luZGV4ID0gSElHSF9RVUVVRTsKKworCisJdGNiX2Rlc2MtPmRhdGFfcmF0ZSA9IE1nbnRRdWVyeV9NZ250RnJhbWVUeFJhdGUoaWVlZSk7CisJdGNiX2Rlc2MtPlJBVFJJbmRleCA9IDc7CisJdGNiX2Rlc2MtPmJUeERpc2FibGVSYXRlRmFsbEJhY2sgPSAxOworCXRjYl9kZXNjLT5iVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGUgPSAxOworCWlmIChzaW5nbGUpIHsKKwkJaWYgKHR5cGUgIT0gUlRMTElCX0ZUWVBFX0NUTCkgeworCQkJaGVhZGVyLT5zZXFfY3RsID0gY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF0gPDwgNCk7CisKKwkJCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJCQlpZWVlLT5zZXFfY3RybFswXSA9IDA7CisJCQllbHNlCisJCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKworCQl9CisJCS8qIGF2b2lkIHdhdGNoZG9nIHRyaWdnZXJzICovCisJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoc2tiLCBpZWVlLT5kZXYsCisJCQkJCQkgICBpZWVlLT5iYXNpY19yYXRlKTsKKworCX0gZWxzZSB7CisJCWlmICh0eXBlICE9IFJUTExJQl9GVFlQRV9DVEwpIHsKKwkJCWhlYWRlci0+c2VxX2N0bCA9IGNwdV90b19sZTE2KGllZWUtPnNlcV9jdHJsWzBdIDw8IDQpOworCisJCQlpZiAoaWVlZS0+c2VxX2N0cmxbMF0gPT0gMHhGRkYpCisJCQkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCQkJZWxzZQorCQkJCWllZWUtPnNlcV9jdHJsWzBdKys7CisJCX0KKwkJaWVlZS0+c29mdG1hY19oYXJkX3N0YXJ0X3htaXQoc2tiLCBpZWVlLT5kZXYpOworCisJfQorfQorCitpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnJ0bGxpYl9wcm9iZV9yZXEoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgaW50IGxlbiwgcmF0ZV9sZW47CisJdTggKnRhZzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBydGxsaWJfcHJvYmVfcmVxdWVzdCAqcmVxOworCisJbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuOworCisJcmF0ZV9sZW4gPSBydGxsaWJfTUZJRV9yYXRlX2xlbihpZWVlKTsKKworCXNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBydGxsaWJfcHJvYmVfcmVxdWVzdCkgKworCQkJICAgIDIgKyBsZW4gKyByYXRlX2xlbiArIGllZWUtPnR4X2hlYWRyb29tKTsKKworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCXNrYl9yZXNlcnZlKHNrYiwgaWVlZS0+dHhfaGVhZHJvb20pOworCisJcmVxID0gKHN0cnVjdCBydGxsaWJfcHJvYmVfcmVxdWVzdCAqKSBza2JfcHV0KHNrYiwKKwkgICAgICBzaXplb2Yoc3RydWN0IHJ0bGxpYl9wcm9iZV9yZXF1ZXN0KSk7CisJcmVxLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoUlRMTElCX1NUWVBFX1BST0JFX1JFUSk7CisJcmVxLT5oZWFkZXIuZHVyYXRpb25faWQgPSAwOworCisJbWVtc2V0KHJlcS0+aGVhZGVyLmFkZHIxLCAweGZmLCBFVEhfQUxFTik7CisJbWVtY3B5KHJlcS0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtc2V0KHJlcS0+aGVhZGVyLmFkZHIzLCAweGZmLCBFVEhfQUxFTik7CisKKwl0YWcgPSAodTggKikgc2tiX3B1dChza2IsIGxlbiArIDIgKyByYXRlX2xlbik7CisKKwkqdGFnKysgPSBNRklFX1RZUEVfU1NJRDsKKwkqdGFnKysgPSBsZW47CisJbWVtY3B5KHRhZywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIGxlbik7CisJdGFnICs9IGxlbjsKKworCXJ0bGxpYl9NRklFX0JyYXRlKGllZWUsICZ0YWcpOworCXJ0bGxpYl9NRklFX0dyYXRlKGllZWUsICZ0YWcpOworCisJcmV0dXJuIHNrYjsKK30KKworc3RydWN0IHNrX2J1ZmYgKnJ0bGxpYl9nZXRfYmVhY29uXyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSk7CisKK3N0YXRpYyB2b2lkIHJ0bGxpYl9zZW5kX2JlYWNvbihzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWlmICghaWVlZS0+aWVlZV91cCkKKwkJcmV0dXJuOworCXNrYiA9IHJ0bGxpYl9nZXRfYmVhY29uXyhpZWVlKTsKKworCWlmIChza2IpIHsKKwkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy50eF9iZWFjb25zKys7CisJfQorCisJaWYgKGllZWUtPmJlYWNvbl90eGluZyAmJiBpZWVlLT5pZWVlX3VwKQorCQltb2RfdGltZXIoJmllZWUtPmJlYWNvbl90aW1lciwgamlmZmllcyArCisJCQkgIChNU0VDUyhpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsIC0gNSkpKTsKK30KKworCitzdGF0aWMgdm9pZCBydGxsaWJfc2VuZF9iZWFjb25fY2IodW5zaWduZWQgbG9uZyBfaWVlZSkKK3sKKwlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSA9CisJCShzdHJ1Y3QgcnRsbGliX2RldmljZSAqKSBfaWVlZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmJlYWNvbl9sb2NrLCBmbGFncyk7CisJcnRsbGliX3NlbmRfYmVhY29uKGllZWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmJlYWNvbl9sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBEZXNjcmlwdGlvbjoKKyAqCSAgICAgIEVuYWJsZSBuZXR3b3JrIG1vbml0b3IgbW9kZSwgYWxsIHJ4IHBhY2tldHMgd2lsbCBiZSByZWNlaXZlZC4KKyAqLwordm9pZCBydGxsaWJfRW5hYmxlTmV0TW9uaXRvck1vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJYm9vbCBiSW5pdFN0YXRlKQoreworCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXZfcnNsKGRldik7CisKKwlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT5FbnRlciBNb25pdG9yIE1vZGVcbiIpOworCisJaWVlZS0+QWxsb3dBbGxEZXN0QWRkckhhbmRsZXIoZGV2LCB0cnVlLCAhYkluaXRTdGF0ZSk7Cit9CisKKworLyoKKyAqICAgICAgRGVzY3JpcHRpb246CisgKgkgICAgICBEaXNhYmxlIG5ldHdvcmsgbmV0d29yayBtb25pdG9yIG1vZGUsIG9ubHkgcGFja2V0cyBkZXN0aW5hdGVkIHRvCisgKgkgICAgICB1cyB3aWxsIGJlIHJlY2VpdmVkLgorICovCit2b2lkIHJ0bGxpYl9EaXNhYmxlTmV0TW9uaXRvck1vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJYm9vbCBiSW5pdFN0YXRlKQoreworCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXZfcnNsKGRldik7CisKKwlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT5FeGl0IE1vbml0b3IgTW9kZVxuIik7CisKKwlpZWVlLT5BbGxvd0FsbERlc3RBZGRySGFuZGxlcihkZXYsIGZhbHNlLCAhYkluaXRTdGF0ZSk7Cit9CisKKworLyoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyBlbmFibGVzIHRoZSBzcGVjaWFsaXplZCBwcm9taXNjdW91cyBtb2RlIHJlcXVpcmVkIGJ5IEludGVsLgorICogSW4gdGhpcyBtb2RlLCBJbnRlbCBpbnRlbmRzIHRvIGhlYXIgdHJhZmZpY3MgZnJvbS90byBvdGhlciBTVEFzIGluIHRoZQorICogc2FtZSBCU1MuIFRoZXJlZm9yZSB3ZSBkb24ndCBoYXZlIHRvIGRpc2FibGUgY2hlY2tpbmcgQlNTSUQgYW5kIHdlIG9ubHkgbmVlZAorICogdG8gYWxsb3cgYWxsIGRlc3QuIEJVVDogaWYgd2UgZW5hYmxlIGNoZWNraW5nIEJTU0lEIHRoZW4gd2UgY2FuJ3QgcmVjdgorICogcGFja2V0cyBmcm9tIG90aGVyIFNUQS4KKyAqLwordm9pZCBydGxsaWJfRW5hYmxlSW50ZWxQcm9taXNjdW91c01vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJYm9vbCBiSW5pdFN0YXRlKQoreworCWJvb2wgYkZpbHRlck91dE5vbkFzc29jaWF0ZWRCU1NJRCA9IGZhbHNlOworCisJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUgPSBuZXRkZXZfcHJpdl9yc2woZGV2KTsKKworCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PkVudGVyIEludGVsIFByb21pc2N1b3VzIE1vZGVcbiIpOworCisJaWVlZS0+QWxsb3dBbGxEZXN0QWRkckhhbmRsZXIoZGV2LCB0cnVlLCAhYkluaXRTdGF0ZSk7CisJaWVlZS0+U2V0SHdSZWdIYW5kbGVyKGRldiwgSFdfVkFSX0NFQ0hLX0JTU0lELAorCQkJICAgICAodTggKikmYkZpbHRlck91dE5vbkFzc29jaWF0ZWRCU1NJRCk7CisKKwlpZWVlLT5iTmV0UHJvbWlzY3VvdXNNb2RlID0gdHJ1ZTsKK30KKworCisvKgorICogRGVzY3JpcHRpb246CisgKgkgICAgICBUaGlzIGRpc2FibGVzIHRoZSBzcGVjaWFsaXplZCBwcm9taXNjdW91cyBtb2RlIHJlcXVpcmVkIGJ5IEludGVsLgorICoJICAgICAgU2VlIE1nbnRFbmFibGVJbnRlbFByb21pc2N1b3VzTW9kZSBmb3IgZGV0YWlsLgorICovCit2b2lkIHJ0bGxpYl9EaXNhYmxlSW50ZWxQcm9taXNjdW91c01vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJYm9vbCBiSW5pdFN0YXRlKQoreworCWJvb2wgYkZpbHRlck91dE5vbkFzc29jaWF0ZWRCU1NJRCA9IHRydWU7CisKKwlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSA9IG5ldGRldl9wcml2X3JzbChkZXYpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT0+RXhpdCBJbnRlbCBQcm9taXNjdW91cyBNb2RlXG4iKTsKKworCWllZWUtPkFsbG93QWxsRGVzdEFkZHJIYW5kbGVyKGRldiwgZmFsc2UsICFiSW5pdFN0YXRlKTsKKwlpZWVlLT5TZXRId1JlZ0hhbmRsZXIoZGV2LCBIV19WQVJfQ0VDSEtfQlNTSUQsCisJCQkgICAgICh1OCAqKSZiRmlsdGVyT3V0Tm9uQXNzb2NpYXRlZEJTU0lEKTsKKworCWllZWUtPmJOZXRQcm9taXNjdW91c01vZGUgPSBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgcnRsbGliX3NlbmRfcHJvYmUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHU4IGlzX21lc2gpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlza2IgPSBydGxsaWJfcHJvYmVfcmVxKGllZWUpOworCWlmIChza2IpIHsKKwkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy50eF9wcm9iZV9ycSsrOworCX0KK30KKworCit2b2lkIHJ0bGxpYl9zZW5kX3Byb2JlX3JlcXVlc3RzKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCBpc19tZXNoKQoreworCWlmIChpZWVlLT5hY3RpdmVfc2NhbiAmJiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmCisJICAgIElFRUVfU09GVE1BQ19QUk9CRVJRKSkgeworCQlydGxsaWJfc2VuZF9wcm9iZShpZWVlLCAwKTsKKwkJcnRsbGliX3NlbmRfcHJvYmUoaWVlZSwgMCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBydGxsaWJfc29mdG1hY19oaW50MTFkX3dxKHZvaWQgKmRhdGEpCit7Cit9CisKK3ZvaWQgcnRsbGliX3VwZGF0ZV9hY3RpdmVfY2hhbl9tYXAoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJbWVtY3B5KGllZWUtPmFjdGl2ZV9jaGFubmVsX21hcCwgR0VUX0RPVDExRF9JTkZPKGllZWUpLT5jaGFubmVsX21hcCwKKwkgICAgICAgTUFYX0NIQU5ORUxfTlVNQkVSKzEpOworfQorCisvKiB0aGlzIHBlcmZvcm1zIHN5bmNybyBzY2FuIGJsb2NraW5nIHRoZSBjYWxsZXIgdW50aWwgYWxsIGNoYW5uZWxzCisgKiBpbiB0aGUgYWxsb3dlZCBjaGFubmVsIG1hcCBoYXMgYmVlbiBjaGVja2VkLgorICovCit2b2lkIHJ0bGxpYl9zb2Z0bWFjX3NjYW5fc3luY3JvKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCBpc19tZXNoKQoreworCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKwlzaG9ydCBjaCA9IDA7CisKKwlydGxsaWJfdXBkYXRlX2FjdGl2ZV9jaGFuX21hcChpZWVlKTsKKworCWllZWUtPmJlX3NjYW5faW5wcm9ncmVzcyA9IHRydWU7CisKKwlkb3duKCZpZWVlLT5zY2FuX3NlbSk7CisKKwl3aGlsZSAoMSkgeworCQlkbyB7CisJCQljaCsrOworCQkJaWYgKGNoID4gTUFYX0NIQU5ORUxfTlVNQkVSKQorCQkJCWdvdG8gb3V0OyAvKiBzY2FuIGNvbXBsZXRlZCAqLworCQl9IHdoaWxlICghaWVlZS0+YWN0aXZlX2NoYW5uZWxfbWFwW2NoXSk7CisKKwkJLyogdGhpcyBmdWN0aW9uIGNhbiBiZSBjYWxsZWQgaW4gdHdvIHNpdHVhdGlvbnMKKwkJICogMS0gV2UgaGF2ZSBzd2l0Y2hlZCB0byBhZC1ob2MgbW9kZSBhbmQgd2UgYXJlCisJCSAqICAgIHBlcmZvcm1pbmcgYSBjb21wbGV0ZSBzeW5jcm8gc2NhbiBiZWZvcmUgY29uY2x1ZGUKKwkJICogICAgdGhlcmUgYXJlIG5vIGludGVyZXN0aW5nIGNlbGwgYW5kIHRvIGNyZWF0ZSBhCisJCSAqICAgIG5ldyBvbmUuIEluIHRoaXMgY2FzZSB0aGUgbGluayBzdGF0ZSBpcworCQkgKiAgICBSVExMSUJfTk9MSU5LIHVudGlsIHdlIGZvdW5kIGFuIGludGVyZXN0aW5nIGNlbGwuCisJCSAqICAgIElmIHNvIHRoZSBpZWVlODAyMV9uZXdfbmV0LCBjYWxsZWQgYnkgdGhlIFJYIHBhdGgKKwkJICogICAgd2lsbCBzZXQgdGhlIHN0YXRlIHRvIFJUTExJQl9MSU5LRUQsIHNvIHdlIHN0b3AKKwkJICogICAgc2Nhbm5pbmcKKwkJICogMi0gV2UgYXJlIGxpbmtlZCBhbmQgdGhlIHJvb3QgdXNlcyBydW4gaXdsaXN0IHNjYW4uCisJCSAqICAgIFNvIHdlIHN3aXRjaCB0byBSVExMSUJfTElOS0VEX1NDQU5OSU5HIHRvIHJlbWVtYmVyCisJCSAqICAgIHRoYXQgd2UgYXJlIHN0aWxsIGxvZ2ljYWxseSBsaW5rZWQgKG5vdCBpbnRlcmVzdGVkIGluCisJCSAqICAgIG5ldyBuZXR3b3JrIGV2ZW50cywgZGVzcGl0ZSBmb3IgdXBkYXRpbmcgdGhlIG5ldCBsaXN0LAorCQkgKiAgICBidXQgd2UgYXJlIHRlbXBvcmFybHkgJ3VubGlua2VkJyBhcyB0aGUgZHJpdmVyIHNoYWxsCisJCSAqICAgIG5vdCBmaWx0ZXIgUlggZnJhbWVzIGFuZCB0aGUgY2hhbm5lbCBpcyBjaGFuZ2luZy4KKwkJICogU28gdGhlIG9ubHkgc2l0dWF0aW9uIGluIHdpdGNoIGFyZSBpbnRlcmVzdGVkIGlzIHRvIGNoZWNrCisJCSAqIGlmIHRoZSBzdGF0ZSBiZWNvbWUgTElOS0VEIGJlY2F1c2Ugb2YgdGhlICMxIHNpdHVhdGlvbgorCQkgKi8KKworCQlpZiAoaWVlZS0+c3RhdGUgPT0gUlRMTElCX0xJTktFRCkKKwkJCWdvdG8gb3V0OworCQlpZiAoaWVlZS0+c3luY19zY2FuX2h1cnJ5dXApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PT09PT5zeW5jX3NjYW5faHVycnl1cCBvdXRcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGNoKTsKKwkJaWYgKGllZWUtPmFjdGl2ZV9jaGFubmVsX21hcFtjaF0gPT0gMSkKKwkJCXJ0bGxpYl9zZW5kX3Byb2JlX3JlcXVlc3RzKGllZWUsIDApOworCisJCS8qIHRoaXMgcHJldmVudCBleGNlc3NpdmUgdGltZSB3YWl0IHdoZW4gd2UKKwkJICogbmVlZCB0byB3YWl0IGZvciBhIHN5bmNybyBzY2FuIHRvIGVuZC4uCisJCSAqLworCQltc2xlZXBfaW50ZXJydXB0aWJsZV9yc2woUlRMTElCX1NPRlRNQUNfU0NBTl9USU1FKTsKKwl9CitvdXQ6CisJaWVlZS0+YWN0c2Nhbm5pbmcgPSBmYWxzZTsKKwlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDA7CisKKwlpZiAoaWVlZS0+c3RhdGUgPj0gUlRMTElCX0xJTktFRCkgeworCQlpZiAoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKKwkJCURPVDExRF9TY2FuQ29tcGxldGUoaWVlZSk7CisJfQorCXVwKCZpZWVlLT5zY2FuX3NlbSk7CisKKwlpZWVlLT5iZV9zY2FuX2lucHJvZ3Jlc3MgPSBmYWxzZTsKKworCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwl3aXJlbGVzc19zZW5kX2V2ZW50KGllZWUtPmRldiwgU0lPQ0dJV1NDQU4sICZ3cnF1LCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgcnRsbGliX3NvZnRtYWNfc2Nhbl93cSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mX2R3b3JrX3JzbChkYXRhLAorCQkJCSAgICAgc3RydWN0IHJ0bGxpYl9kZXZpY2UsIHNvZnRtYWNfc2Nhbl93cSk7CisJdTggbGFzdF9jaGFubmVsID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWw7CisKKwlydGxsaWJfdXBkYXRlX2FjdGl2ZV9jaGFuX21hcChpZWVlKTsKKworCWlmICghaWVlZS0+aWVlZV91cCkKKwkJcmV0dXJuOworCWlmIChydGxsaWJfYWN0X3NjYW5uaW5nKGllZWUsIHRydWUpID09IHRydWUpCisJCXJldHVybjsKKworCWRvd24oJmllZWUtPnNjYW5fc2VtKTsKKworCWlmIChpZWVlLT5lUkZQb3dlclN0YXRlID09IGVSZk9mZikgeworCQlwcmludGsoS0VSTl9JTkZPICI9PT09PT0+JXMoKTpyZiBzdGF0ZSBpcyBlUmZPZmYsIHJldHVyblxuIiwKKwkJICAgICAgIF9fZnVuY19fKTsKKwkJZ290byBvdXQxOworCX0KKworCWRvIHsKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPQorCQkJKGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsICsgMSkgJQorCQkJTUFYX0NIQU5ORUxfTlVNQkVSOworCQlpZiAoaWVlZS0+c2Nhbl93YXRjaF9kb2crKyA+IE1BWF9DSEFOTkVMX05VTUJFUikgeworCQkJaWYgKCFpZWVlLT5hY3RpdmVfY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdKQorCQkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gNjsKKwkJCWdvdG8gb3V0OyAvKiBubyBnb29kIGNoYW5zICovCisJCX0KKwl9IHdoaWxlICghaWVlZS0+YWN0aXZlX2NoYW5uZWxfbWFwW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsXSk7CisKKwlpZiAoaWVlZS0+c2Nhbm5pbmdfY29udGludWUgPT0gMCkKKwkJZ290byBvdXQ7CisKKwlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKworCWlmIChpZWVlLT5hY3RpdmVfY2hhbm5lbF9tYXBbaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWxdID09IDEpCisJCXJ0bGxpYl9zZW5kX3Byb2JlX3JlcXVlc3RzKGllZWUsIDApOworCisJcXVldWVfZGVsYXllZF93b3JrX3JzbChpZWVlLT53cSwgJmllZWUtPnNvZnRtYWNfc2Nhbl93cSwKKwkJCSAgICAgICBNU0VDUyhSVExMSUJfU09GVE1BQ19TQ0FOX1RJTUUpKTsKKworCXVwKCZpZWVlLT5zY2FuX3NlbSk7CisJcmV0dXJuOworCitvdXQ6CisJaWYgKElTX0RPVDExRF9FTkFCTEUoaWVlZSkpCisJCURPVDExRF9TY2FuQ29tcGxldGUoaWVlZSk7CisJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSBsYXN0X2NoYW5uZWw7CisKK291dDE6CisJaWVlZS0+YWN0c2Nhbm5pbmcgPSBmYWxzZTsKKwlpZWVlLT5zY2FuX3dhdGNoX2RvZyA9IDA7CisJaWVlZS0+c2Nhbm5pbmdfY29udGludWUgPSAwOworCXVwKCZpZWVlLT5zY2FuX3NlbSk7Cit9CisKKworCitzdGF0aWMgdm9pZCBydGxsaWJfYmVhY29uc19zdGFydChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5iZWFjb25fbG9jaywgZmxhZ3MpOworCisJaWVlZS0+YmVhY29uX3R4aW5nID0gMTsKKwlydGxsaWJfc2VuZF9iZWFjb24oaWVlZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5iZWFjb25fbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBydGxsaWJfYmVhY29uc19zdG9wKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+YmVhY29uX2xvY2ssIGZsYWdzKTsKKworCWllZWUtPmJlYWNvbl90eGluZyA9IDA7CisJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmJlYWNvbl90aW1lcik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5iZWFjb25fbG9jaywgZmxhZ3MpOworCit9CisKKwordm9pZCBydGxsaWJfc3RvcF9zZW5kX2JlYWNvbnMoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJaWYgKGllZWUtPnN0b3Bfc2VuZF9iZWFjb25zKQorCQlpZWVlLT5zdG9wX3NlbmRfYmVhY29ucyhpZWVlLT5kZXYpOworCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0JFQUNPTlMpCisJCXJ0bGxpYl9iZWFjb25zX3N0b3AoaWVlZSk7Cit9CisKKwordm9pZCBydGxsaWJfc3RhcnRfc2VuZF9iZWFjb25zKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQoreworCWlmIChpZWVlLT5zdGFydF9zZW5kX2JlYWNvbnMpCisJCWllZWUtPnN0YXJ0X3NlbmRfYmVhY29ucyhpZWVlLT5kZXYpOworCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0JFQUNPTlMpCisJCXJ0bGxpYl9iZWFjb25zX3N0YXJ0KGllZWUpOworfQorCisKK3N0YXRpYyB2b2lkIHJ0bGxpYl9zb2Z0bWFjX3N0b3Bfc2NhbihzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwlkb3duKCZpZWVlLT5zY2FuX3NlbSk7CisJaWVlZS0+c2Nhbl93YXRjaF9kb2cgPSAwOworCWlmIChpZWVlLT5zY2FubmluZ19jb250aW51ZSA9PSAxKSB7CisJCWllZWUtPnNjYW5uaW5nX2NvbnRpbnVlID0gMDsKKwkJaWVlZS0+YWN0c2Nhbm5pbmcgPSAwOworCisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPnNvZnRtYWNfc2Nhbl93cSk7CisJfQorCisJdXAoJmllZWUtPnNjYW5fc2VtKTsKK30KKwordm9pZCBydGxsaWJfc3RvcF9zY2FuKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQoreworCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NDQU4pIHsKKwkJcnRsbGliX3NvZnRtYWNfc3RvcF9zY2FuKGllZWUpOworCX0gZWxzZSB7CisJCWlmIChpZWVlLT5ydGxsaWJfc3RvcF9od19zY2FuKQorCQkJaWVlZS0+cnRsbGliX3N0b3BfaHdfc2NhbihpZWVlLT5kZXYpOworCX0KK30KKwordm9pZCBydGxsaWJfc3RvcF9zY2FuX3N5bmNybyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TQ0FOKSB7CisJCQlpZWVlLT5zeW5jX3NjYW5faHVycnl1cCA9IDE7CisJfSBlbHNlIHsKKwkJaWYgKGllZWUtPnJ0bGxpYl9zdG9wX2h3X3NjYW4pCisJCQlpZWVlLT5ydGxsaWJfc3RvcF9od19zY2FuKGllZWUtPmRldik7CisJfQorfQorCitib29sIHJ0bGxpYl9hY3Rfc2Nhbm5pbmcoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIGJvb2wgc3luY19zY2FuKQoreworCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NDQU4pIHsKKwkJaWYgKHN5bmNfc2NhbikKKwkJCXJldHVybiBpZWVlLT5iZV9zY2FuX2lucHJvZ3Jlc3M7CisJCWVsc2UKKwkJCXJldHVybiBpZWVlLT5hY3RzY2FubmluZyB8fCBpZWVlLT5iZV9zY2FuX2lucHJvZ3Jlc3M7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJmllZWUtPnN0YXR1cyk7CisJfQorfQorCisvKiBjYWxsZWQgd2l0aCBpZWVlLT5sb2NrIGhlbGQgKi8KK3N0YXRpYyB2b2lkIHJ0bGxpYl9zdGFydF9zY2FuKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQoreworCVJUX1RSQUNFKENPTVBfREJHLCAiPT09PiVzKClcbiIsIF9fZnVuY19fKTsKKwlpZiAoaWVlZS0+cnRsbGliX2lwc19sZWF2ZV93cSAhPSBOVUxMKQorCQlpZWVlLT5ydGxsaWJfaXBzX2xlYXZlX3dxKGllZWUtPmRldik7CisKKwlpZiAoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkgeworCQlpZiAoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKKwkJCVJFU0VUX0NJRV9XQVRDSERPRyhpZWVlKTsKKwl9CisJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0NBTikgeworCQlpZiAoaWVlZS0+c2Nhbm5pbmdfY29udGludWUgPT0gMCkgeworCQkJaWVlZS0+YWN0c2Nhbm5pbmcgPSB0cnVlOworCQkJaWVlZS0+c2Nhbm5pbmdfY29udGludWUgPSAxOworCQkJcXVldWVfZGVsYXllZF93b3JrX3JzbChpZWVlLT53cSwKKwkJCQkJICAgICAgICZpZWVlLT5zb2Z0bWFjX3NjYW5fd3EsIDApOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGllZWUtPnJ0bGxpYl9zdGFydF9od19zY2FuKQorCQkJaWVlZS0+cnRsbGliX3N0YXJ0X2h3X3NjYW4oaWVlZS0+ZGV2KTsKKwl9Cit9CisKKy8qIGNhbGxlZCB3aXRoIHd4X3NlbSBoZWxkICovCit2b2lkIHJ0bGxpYl9zdGFydF9zY2FuX3N5bmNybyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggaXNfbWVzaCkKK3sKKwlpZiAoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkgeworCQlpZiAoSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKKwkJCVJFU0VUX0NJRV9XQVRDSERPRyhpZWVlKTsKKwl9CisJaWVlZS0+c3luY19zY2FuX2h1cnJ5dXAgPSAwOworCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NDQU4pIHsKKwkJcnRsbGliX3NvZnRtYWNfc2Nhbl9zeW5jcm8oaWVlZSwgaXNfbWVzaCk7CisJfSBlbHNlIHsKKwkJaWYgKGllZWUtPnJ0bGxpYl9zdGFydF9od19zY2FuKQorCQkJaWVlZS0+cnRsbGliX3N0YXJ0X2h3X3NjYW4oaWVlZS0+ZGV2KTsKKwl9Cit9CisKK2lubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqcnRsbGliX2F1dGhlbnRpY2F0aW9uX3JlcShzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKmJlYWNvbiwKKwlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgaW50IGNoYWxsZW5nZWxlbiwgdTggKmRhZGRyKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHJ0bGxpYl9hdXRoZW50aWNhdGlvbiAqYXV0aDsKKwlpbnQgIGxlbiA9IDA7CisJbGVuID0gc2l6ZW9mKHN0cnVjdCBydGxsaWJfYXV0aGVudGljYXRpb24pICsgY2hhbGxlbmdlbGVuICsKKwkJICAgICBpZWVlLT50eF9oZWFkcm9vbSArIDQ7CisJc2tiID0gZGV2X2FsbG9jX3NrYihsZW4pOworCisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJc2tiX3Jlc2VydmUoc2tiLCBpZWVlLT50eF9oZWFkcm9vbSk7CisKKwlhdXRoID0gKHN0cnVjdCBydGxsaWJfYXV0aGVudGljYXRpb24gKikKKwkJc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgcnRsbGliX2F1dGhlbnRpY2F0aW9uKSk7CisKKwlhdXRoLT5oZWFkZXIuZnJhbWVfY3RsID0gUlRMTElCX1NUWVBFX0FVVEg7CisJaWYgKGNoYWxsZW5nZWxlbikKKwkJYXV0aC0+aGVhZGVyLmZyYW1lX2N0bCB8PSBSVExMSUJfRkNUTF9XRVA7CisKKwlhdXRoLT5oZWFkZXIuZHVyYXRpb25faWQgPSAweDAxM2E7CisJbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMSwgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOworCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoYXV0aC0+aGVhZGVyLmFkZHIzLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7CisJaWYgKGllZWUtPmF1dGhfbW9kZSA9PSAwKQorCQlhdXRoLT5hbGdvcml0aG0gPSBXTEFOX0FVVEhfT1BFTjsKKwllbHNlIGlmIChpZWVlLT5hdXRoX21vZGUgPT0gMSkKKwkJYXV0aC0+YWxnb3JpdGhtID0gV0xBTl9BVVRIX1NIQVJFRF9LRVk7CisJZWxzZSBpZiAoaWVlZS0+YXV0aF9tb2RlID09IDIpCisJCWF1dGgtPmFsZ29yaXRobSA9IFdMQU5fQVVUSF9PUEVOOworCWF1dGgtPnRyYW5zYWN0aW9uID0gY3B1X3RvX2xlMTYoaWVlZS0+YXNzb2NpYXRlX3NlcSk7CisJaWVlZS0+YXNzb2NpYXRlX3NlcSsrOworCisJYXV0aC0+c3RhdHVzID0gY3B1X3RvX2xlMTYoV0xBTl9TVEFUVVNfU1VDQ0VTUyk7CisKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnJ0bGxpYl9wcm9iZV9yZXNwKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCAqZGVzdCkKK3sKKwl1OCAqdGFnOworCWludCBiZWFjb25fc2l6ZTsKKwlzdHJ1Y3QgcnRsbGliX3Byb2JlX3Jlc3BvbnNlICpiZWFjb25fYnVmOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCWludCBlbmNyeXB0OworCWludCBhdGltX2xlbiwgZXJwX2xlbjsKKwlzdHJ1Y3QgcnRsbGliX2NyeXB0X2RhdGEgKmNyeXB0OworCisJY2hhciAqc3NpZCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkOworCWludCBzc2lkX2xlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbjsKKwlpbnQgcmF0ZV9sZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfbGVuKzI7CisJaW50IHJhdGVfZXhfbGVuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4X2xlbjsKKwlpbnQgd3BhX2llX2xlbiA9IGllZWUtPndwYV9pZV9sZW47CisJdTggZXJwaW5mb19jb250ZW50ID0gMDsKKworCXU4ICp0bXBfaHRfY2FwX2J1ZiA9IE5VTEw7CisJdTggdG1wX2h0X2NhcF9sZW4gPSAwOworCXU4ICp0bXBfaHRfaW5mb19idWYgPSBOVUxMOworCXU4IHRtcF9odF9pbmZvX2xlbiA9IDA7CisJc3RydWN0IHJ0X2hpX3Rocm91Z2hwdXQgKnBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCXU4ICp0bXBfZ2VuZXJpY19pZV9idWYgPSBOVUxMOworCXU4IHRtcF9nZW5lcmljX2llX2xlbiA9IDA7CisKKwlpZiAocmF0ZV9leF9sZW4gPiAwKQorCQlyYXRlX2V4X2xlbiArPSAyOworCisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0lCU1MpCisJCWF0aW1fbGVuID0gNDsKKwllbHNlCisJCWF0aW1fbGVuID0gMDsKKworCWlmICgoaWVlZS0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0gSUVFRV9HKSB8fAorCSAgIChpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX05fMjRHICYmCisJICAgaWVlZS0+cEhUSW5mby0+YkN1clN1cHBDQ0spKSB7CisJCWVycF9sZW4gPSAzOworCQllcnBpbmZvX2NvbnRlbnQgPSAwOworCQlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJ1c2Vwcm90ZWN0aW9uKQorCQkJZXJwaW5mb19jb250ZW50IHw9IEVSUF9Vc2VQcm90ZWN0aW9uOworCX0gZWxzZQorCQllcnBfbGVuID0gMDsKKworCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKwllbmNyeXB0ID0gaWVlZS0+aG9zdF9lbmNyeXB0ICYmIGNyeXB0ICYmIGNyeXB0LT5vcHMgJiYKKwkJKCgwID09IHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCAiV0VQIikgfHwgd3BhX2llX2xlbikpOworCWlmIChpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCkgeworCQl0bXBfaHRfY2FwX2J1ZiA9ICh1OCAqKSAmKGllZWUtPnBIVEluZm8tPlNlbGZIVENhcCk7CisJCXRtcF9odF9jYXBfbGVuID0gc2l6ZW9mKGllZWUtPnBIVEluZm8tPlNlbGZIVENhcCk7CisJCXRtcF9odF9pbmZvX2J1ZiA9ICh1OCAqKSAmKGllZWUtPnBIVEluZm8tPlNlbGZIVEluZm8pOworCQl0bXBfaHRfaW5mb19sZW4gPSBzaXplb2YoaWVlZS0+cEhUSW5mby0+U2VsZkhUSW5mbyk7CisJCUhUQ29uc3RydWN0Q2FwYWJpbGl0eUVsZW1lbnQoaWVlZSwgdG1wX2h0X2NhcF9idWYsCisJCQkJCSAgICAgJnRtcF9odF9jYXBfbGVuLCBlbmNyeXB0LCBmYWxzZSk7CisJCUhUQ29uc3RydWN0SW5mb0VsZW1lbnQoaWVlZSwgdG1wX2h0X2luZm9fYnVmLCAmdG1wX2h0X2luZm9fbGVuLAorCQkJCSAgICAgICBlbmNyeXB0KTsKKworCQlpZiAocEhUSW5mby0+YlJlZ1JUMlJUQWdncmVnYXRpb24pIHsKKwkJCXRtcF9nZW5lcmljX2llX2J1ZiA9IGllZWUtPnBIVEluZm8tPnN6UlQyUlRBZ2dCdWZmZXI7CisJCQl0bXBfZ2VuZXJpY19pZV9sZW4gPQorCQkJCSBzaXplb2YoaWVlZS0+cEhUSW5mby0+c3pSVDJSVEFnZ0J1ZmZlcik7CisJCQlIVENvbnN0cnVjdFJUMlJUQWdnRWxlbWVudChpZWVlLCB0bXBfZ2VuZXJpY19pZV9idWYsCisJCQkJCQkgICAmdG1wX2dlbmVyaWNfaWVfbGVuKTsKKwkJfQorCX0KKworCWJlYWNvbl9zaXplID0gc2l6ZW9mKHN0cnVjdCBydGxsaWJfcHJvYmVfcmVzcG9uc2UpKzIrCisJCXNzaWRfbGVuICsgMyArIHJhdGVfbGVuICsgcmF0ZV9leF9sZW4gKyBhdGltX2xlbiArIGVycF9sZW4KKwkJKyB3cGFfaWVfbGVuICsgaWVlZS0+dHhfaGVhZHJvb207CisJc2tiID0gZGV2X2FsbG9jX3NrYihiZWFjb25fc2l6ZSk7CisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJc2tiX3Jlc2VydmUoc2tiLCBpZWVlLT50eF9oZWFkcm9vbSk7CisKKwliZWFjb25fYnVmID0gKHN0cnVjdCBydGxsaWJfcHJvYmVfcmVzcG9uc2UgKikgc2tiX3B1dChza2IsCisJCSAgICAgKGJlYWNvbl9zaXplIC0gaWVlZS0+dHhfaGVhZHJvb20pKTsKKwltZW1jcHkoYmVhY29uX2J1Zi0+aGVhZGVyLmFkZHIxLCBkZXN0LCBFVEhfQUxFTik7CisJbWVtY3B5KGJlYWNvbl9idWYtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShiZWFjb25fYnVmLT5oZWFkZXIuYWRkcjMsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCisJYmVhY29uX2J1Zi0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMDsKKwliZWFjb25fYnVmLT5iZWFjb25faW50ZXJ2YWwgPQorCQljcHVfdG9fbGUxNihpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsKTsKKwliZWFjb25fYnVmLT5jYXBhYmlsaXR5ID0KKwkJY3B1X3RvX2xlMTYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJgorCQlXTEFOX0NBUEFCSUxJVFlfSUJTUyk7CisJYmVhY29uX2J1Zi0+Y2FwYWJpbGl0eSB8PQorCQljcHVfdG9fbGUxNihpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSAmCisJCVdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSk7CisKKwlpZiAoaWVlZS0+c2hvcnRfc2xvdCAmJiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJgorCSAgICBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVF9USU1FKSkKKwkJY3B1X3RvX2xlMTYoKGJlYWNvbl9idWYtPmNhcGFiaWxpdHkgfD0KKwkJCQkgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1RfVElNRSkpOworCisJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZWVlLT50eF9rZXlpZHhdOworCWlmIChlbmNyeXB0KQorCQliZWFjb25fYnVmLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKTsKKworCisJYmVhY29uX2J1Zi0+aGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KFJUTExJQl9TVFlQRV9QUk9CRV9SRVNQKTsKKwliZWFjb25fYnVmLT5pbmZvX2VsZW1lbnRbMF0uaWQgPSBNRklFX1RZUEVfU1NJRDsKKwliZWFjb25fYnVmLT5pbmZvX2VsZW1lbnRbMF0ubGVuID0gc3NpZF9sZW47CisKKwl0YWcgPSAodTggKikgYmVhY29uX2J1Zi0+aW5mb19lbGVtZW50WzBdLmRhdGE7CisKKwltZW1jcHkodGFnLCBzc2lkLCBzc2lkX2xlbik7CisKKwl0YWcgKz0gc3NpZF9sZW47CisKKwkqKHRhZysrKSA9IE1GSUVfVFlQRV9SQVRFUzsKKwkqKHRhZysrKSA9IHJhdGVfbGVuLTI7CisJbWVtY3B5KHRhZywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzLCByYXRlX2xlbi0yKTsKKwl0YWcgKz0gcmF0ZV9sZW4tMjsKKworCSoodGFnKyspID0gTUZJRV9UWVBFX0RTX1NFVDsKKwkqKHRhZysrKSA9IDE7CisJKih0YWcrKykgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbDsKKworCWlmIChhdGltX2xlbikgeworCQl1MTYgdmFsMTY7CisJCSoodGFnKyspID0gTUZJRV9UWVBFX0lCU1NfU0VUOworCQkqKHRhZysrKSA9IDI7CisJCSB2YWwxNiA9IGNwdV90b19sZTE2KGllZWUtPmN1cnJlbnRfbmV0d29yay5hdGltX3dpbmRvdyk7CisJCW1lbWNweSgodTggKil0YWcsICh1OCAqKSZ2YWwxNiwgMik7CisJCXRhZyArPSAyOworCX0KKworCWlmIChlcnBfbGVuKSB7CisJCSoodGFnKyspID0gTUZJRV9UWVBFX0VSUDsKKwkJKih0YWcrKykgPSAxOworCQkqKHRhZysrKSA9IGVycGluZm9fY29udGVudDsKKwl9CisJaWYgKHJhdGVfZXhfbGVuKSB7CisJCSoodGFnKyspID0gTUZJRV9UWVBFX1JBVEVTX0VYOworCQkqKHRhZysrKSA9IHJhdGVfZXhfbGVuLTI7CisJCW1lbWNweSh0YWcsIGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leCwgcmF0ZV9leF9sZW4tMik7CisJCXRhZyArPSByYXRlX2V4X2xlbi0yOworCX0KKworCWlmICh3cGFfaWVfbGVuKSB7CisJCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpCisJCQltZW1jcHkoJmllZWUtPndwYV9pZVsxNF0sICZpZWVlLT53cGFfaWVbOF0sIDQpOworCQltZW1jcHkodGFnLCBpZWVlLT53cGFfaWUsIGllZWUtPndwYV9pZV9sZW4pOworCQl0YWcgKz0gaWVlZS0+d3BhX2llX2xlbjsKKwl9CisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpydGxsaWJfYXNzb2NfcmVzcChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggKmRlc3QpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1OCAqdGFnOworCisJc3RydWN0IHJ0bGxpYl9jcnlwdF9kYXRhICpjcnlwdDsKKwlzdHJ1Y3QgcnRsbGliX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICphc3NvYzsKKwlzaG9ydCBlbmNyeXB0OworCisJdW5zaWduZWQgaW50IHJhdGVfbGVuID0gcnRsbGliX01GSUVfcmF0ZV9sZW4oaWVlZSk7CisJaW50IGxlbiA9IHNpemVvZihzdHJ1Y3QgcnRsbGliX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKSArIHJhdGVfbGVuICsKKwkJICBpZWVlLT50eF9oZWFkcm9vbTsKKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCXNrYl9yZXNlcnZlKHNrYiwgaWVlZS0+dHhfaGVhZHJvb20pOworCisJYXNzb2MgPSAoc3RydWN0IHJ0bGxpYl9hc3NvY19yZXNwb25zZV9mcmFtZSAqKQorCQlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBydGxsaWJfYXNzb2NfcmVzcG9uc2VfZnJhbWUpKTsKKworCWFzc29jLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoUlRMTElCX1NUWVBFX0FTU09DX1JFU1ApOworCW1lbWNweShhc3NvYy0+aGVhZGVyLmFkZHIxLCBkZXN0LCBFVEhfQUxFTik7CisJbWVtY3B5KGFzc29jLT5oZWFkZXIuYWRkcjMsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoYXNzb2MtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCWFzc29jLT5jYXBhYmlsaXR5ID0gY3B1X3RvX2xlMTYoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUiA/CisJCVdMQU5fQ0FQQUJJTElUWV9FU1MgOiBXTEFOX0NBUEFCSUxJVFlfSUJTUyk7CisKKworCWlmIChpZWVlLT5zaG9ydF9zbG90KQorCQlhc3NvYy0+Y2FwYWJpbGl0eSB8PQorCQkJCSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVF9USU1FKTsKKworCWlmIChpZWVlLT5ob3N0X2VuY3J5cHQpCisJCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKwllbHNlCisJCWNyeXB0ID0gTlVMTDsKKworCWVuY3J5cHQgPSAoY3J5cHQgJiYgY3J5cHQtPm9wcyk7CisKKwlpZiAoZW5jcnlwdCkKKwkJYXNzb2MtPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpOworCisJYXNzb2MtPnN0YXR1cyA9IDA7CisJYXNzb2MtPmFpZCA9IGNwdV90b19sZTE2KGllZWUtPmFzc29jX2lkKTsKKwlpZiAoaWVlZS0+YXNzb2NfaWQgPT0gMHgyMDA3KQorCQlpZWVlLT5hc3NvY19pZCA9IDA7CisJZWxzZQorCQlpZWVlLT5hc3NvY19pZCsrOworCisJdGFnID0gKHU4ICopIHNrYl9wdXQoc2tiLCByYXRlX2xlbik7CisJcnRsbGliX01GSUVfQnJhdGUoaWVlZSwgJnRhZyk7CisJcnRsbGliX01GSUVfR3JhdGUoaWVlZSwgJnRhZyk7CisKKwlyZXR1cm4gc2tiOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnJ0bGxpYl9hdXRoX3Jlc3Aoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIGludCBzdGF0dXMsCisJCQkJIHU4ICpkZXN0KQoreworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCBydGxsaWJfYXV0aGVudGljYXRpb24gKmF1dGg7CisJaW50IGxlbiA9IGllZWUtPnR4X2hlYWRyb29tICsgc2l6ZW9mKHN0cnVjdCBydGxsaWJfYXV0aGVudGljYXRpb24pICsgMTsKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbik7CisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJc2tiLT5sZW4gPSBzaXplb2Yoc3RydWN0IHJ0bGxpYl9hdXRoZW50aWNhdGlvbik7CisKKwlza2JfcmVzZXJ2ZShza2IsIGllZWUtPnR4X2hlYWRyb29tKTsKKworCWF1dGggPSAoc3RydWN0IHJ0bGxpYl9hdXRoZW50aWNhdGlvbiAqKQorCQlza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBydGxsaWJfYXV0aGVudGljYXRpb24pKTsKKworCWF1dGgtPnN0YXR1cyA9IGNwdV90b19sZTE2KHN0YXR1cyk7CisJYXV0aC0+dHJhbnNhY3Rpb24gPSBjcHVfdG9fbGUxNigyKTsKKwlhdXRoLT5hbGdvcml0aG0gPSBjcHVfdG9fbGUxNihXTEFOX0FVVEhfT1BFTik7CisKKwltZW1jcHkoYXV0aC0+aGVhZGVyLmFkZHIzLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGF1dGgtPmhlYWRlci5hZGRyMiwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShhdXRoLT5oZWFkZXIuYWRkcjEsIGRlc3QsIEVUSF9BTEVOKTsKKwlhdXRoLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoUlRMTElCX1NUWVBFX0FVVEgpOworCXJldHVybiBza2I7CisKKworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnJ0bGxpYl9udWxsX2Z1bmMoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHNob3J0IHB3cikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBydGxsaWJfaGRyXzNhZGRyICpoZHI7CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkcikraWVlZS0+dHhfaGVhZHJvb20pOworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCXNrYl9yZXNlcnZlKHNrYiwgaWVlZS0+dHhfaGVhZHJvb20pOworCisJaGRyID0gKHN0cnVjdCBydGxsaWJfaGRyXzNhZGRyICopc2tiX3B1dChza2IsCisJICAgICAgc2l6ZW9mKHN0cnVjdCBydGxsaWJfaGRyXzNhZGRyKSk7CisKKwltZW1jcHkoaGRyLT5hZGRyMSwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KGhkci0+YWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoaGRyLT5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisKKwloZHItPmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KFJUTExJQl9GVFlQRV9EQVRBIHwKKwkJUlRMTElCX1NUWVBFX05VTExGVU5DIHwgUlRMTElCX0ZDVExfVE9EUyB8CisJCShwd3IgPyBSVExMSUJfRkNUTF9QTSA6IDApKTsKKworCXJldHVybiBza2I7CisKKworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnJ0bGxpYl9wc3BvbGxfZnVuYyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBydGxsaWJfcHNwb2xsX2hkciAqaGRyOworCisJc2tiID0gZGV2X2FsbG9jX3NrYihzaXplb2Yoc3RydWN0IHJ0bGxpYl9wc3BvbGxfaGRyKStpZWVlLT50eF9oZWFkcm9vbSk7CisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJc2tiX3Jlc2VydmUoc2tiLCBpZWVlLT50eF9oZWFkcm9vbSk7CisKKwloZHIgPSAoc3RydWN0IHJ0bGxpYl9wc3BvbGxfaGRyICopc2tiX3B1dChza2IsCisJICAgICAgc2l6ZW9mKHN0cnVjdCBydGxsaWJfcHNwb2xsX2hkcikpOworCisJbWVtY3B5KGhkci0+YnNzaWQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCW1lbWNweShoZHItPnRhLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisKKwloZHItPmFpZCA9IGNwdV90b19sZTE2KGllZWUtPmFzc29jX2lkIHwgMHhjMDAwKTsKKwloZHItPmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KFJUTExJQl9GVFlQRV9DVEwgfCBSVExMSUJfU1RZUEVfUFNQT0xMIHwKKwkJCSBSVExMSUJfRkNUTF9QTSk7CisKKwlyZXR1cm4gc2tiOworCit9CisKK3N0YXRpYyB2b2lkIHJ0bGxpYl9yZXNwX3RvX2Fzc29jX3JxKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCAqZGVzdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gcnRsbGliX2Fzc29jX3Jlc3AoaWVlZSwgZGVzdCk7CisKKwlpZiAoYnVmKQorCQlzb2Z0bWFjX21nbXRfeG1pdChidWYsIGllZWUpOworfQorCisKK3N0YXRpYyB2b2lkIHJ0bGxpYl9yZXNwX3RvX2F1dGgoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIGludCBzLCB1OCAqZGVzdCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gcnRsbGliX2F1dGhfcmVzcChpZWVlLCBzLCBkZXN0KTsKKworCWlmIChidWYpCisJCXNvZnRtYWNfbWdtdF94bWl0KGJ1ZiwgaWVlZSk7Cit9CisKKworc3RhdGljIHZvaWQgcnRsbGliX3Jlc3BfdG9fcHJvYmUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHU4ICpkZXN0KQoreworCisJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IHJ0bGxpYl9wcm9iZV9yZXNwKGllZWUsIGRlc3QpOworCWlmIChidWYpCisJCXNvZnRtYWNfbWdtdF94bWl0KGJ1ZiwgaWVlZSk7Cit9CisKKworaW5saW5lIGludCBTZWNJc0luUE1LSURMaXN0KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCAqYnNzaWQpCit7CisJaW50IGkgPSAwOworCisJZG8geworCQlpZiAoKGllZWUtPlBNS0lETGlzdFtpXS5iVXNlZCkgJiYKKwkJICAgKG1lbWNtcChpZWVlLT5QTUtJRExpc3RbaV0uQnNzaWQsIGJzc2lkLCBFVEhfQUxFTikgPT0gMCkpCisJCQlicmVhazsKKwkJZWxzZQorCQkJaSsrOworCX0gd2hpbGUgKGkgPCBOVU1fUE1LSURfQ0FDSEUpOworCisJaWYgKGkgPT0gTlVNX1BNS0lEX0NBQ0hFKQorCQlpID0gLTE7CisJcmV0dXJuIGk7Cit9CisKK2lubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqcnRsbGliX2Fzc29jaWF0aW9uX3JlcShzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKmJlYWNvbiwKKwkJCQkJICAgICAgc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgcnRsbGliX2Fzc29jX3JlcXVlc3RfZnJhbWUgKmhkcjsKKwl1OCAqdGFnLCAqaWVzOworCWludCBpOworCXU4ICpodF9jYXBfYnVmID0gTlVMTDsKKwl1OCBodF9jYXBfbGVuID0gMDsKKwl1OCAqcmVhbHRla19pZV9idWYgPSBOVUxMOworCXU4IHJlYWx0ZWtfaWVfbGVuID0gMDsKKwlpbnQgd3BhX2llX2xlbiA9IGllZWUtPndwYV9pZV9sZW47CisJaW50IHdwc19pZV9sZW4gPSBpZWVlLT53cHNfaWVfbGVuOworCXVuc2lnbmVkIGludCBja2lwX2llX2xlbiA9IDA7CisJdW5zaWduZWQgaW50IGNjeHJtX2llX2xlbiA9IDA7CisJdW5zaWduZWQgaW50IGN4dmVybnVtX2llX2xlbiA9IDA7CisJc3RydWN0IHJ0bGxpYl9jcnlwdF9kYXRhICpjcnlwdDsKKwlpbnQgZW5jcnlwdDsKKwlpbnQJUE1LQ2FjaGVJZHg7CisKKwl1bnNpZ25lZCBpbnQgcmF0ZV9sZW4gPSAoYmVhY29uLT5yYXRlc19sZW4gPworCQkJCShiZWFjb24tPnJhdGVzX2xlbiArIDIpIDogMCkgKworCQkJCShiZWFjb24tPnJhdGVzX2V4X2xlbiA/IChiZWFjb24tPnJhdGVzX2V4X2xlbikgKworCQkJCTIgOiAwKTsKKworCXVuc2lnbmVkIGludCB3bW1faW5mb19sZW4gPSBiZWFjb24tPnFvc19kYXRhLnN1cHBvcnRlZCA/IDkgOiAwOworCXVuc2lnbmVkIGludCB0dXJib19pbmZvX2xlbiA9IGJlYWNvbi0+VHVyYm9fRW5hYmxlID8gOSA6IDA7CisKKwlpbnQgbGVuID0gMDsKKwljcnlwdCA9IGllZWUtPmNyeXB0W2llZWUtPnR4X2tleWlkeF07CisJaWYgKGNyeXB0ICE9IE5VTEwpCisJCWVuY3J5cHQgPSBpZWVlLT5ob3N0X2VuY3J5cHQgJiYgY3J5cHQgJiYgY3J5cHQtPm9wcyAmJgorCQkJICAoKDAgPT0gc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJXRVAiKSB8fAorCQkJICB3cGFfaWVfbGVuKSk7CisJZWxzZQorCQllbmNyeXB0ID0gMDsKKworCWlmICgoaWVlZS0+cnRsbGliX2FwX3NlY190eXBlICYmCisJICAgIChpZWVlLT5ydGxsaWJfYXBfc2VjX3R5cGUoaWVlZSkgJiBTRUNfQUxHX1RLSVApKSB8fAorCSAgICAoaWVlZS0+YkZvcmNlZEJnTW9kZSA9PSB0cnVlKSkgeworCQlpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQgPSAwOworCQlpZWVlLT5tb2RlID0gV0lSRUxFU1NfTU9ERV9HOworCX0KKworCWlmIChpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCAmJiBpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQpIHsKKwkJaHRfY2FwX2J1ZiA9ICh1OCAqKSYoaWVlZS0+cEhUSW5mby0+U2VsZkhUQ2FwKTsKKwkJaHRfY2FwX2xlbiA9IHNpemVvZihpZWVlLT5wSFRJbmZvLT5TZWxmSFRDYXApOworCQlIVENvbnN0cnVjdENhcGFiaWxpdHlFbGVtZW50KGllZWUsIGh0X2NhcF9idWYsICZodF9jYXBfbGVuLAorCQkJCQkgICAgIGVuY3J5cHQsIHRydWUpOworCQlpZiAoaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRSVDJSVEFnZ3JlZ2F0aW9uKSB7CisJCQlyZWFsdGVrX2llX2J1ZiA9IGllZWUtPnBIVEluZm8tPnN6UlQyUlRBZ2dCdWZmZXI7CisJCQlyZWFsdGVrX2llX2xlbiA9CisJCQkJIHNpemVvZihpZWVlLT5wSFRJbmZvLT5zelJUMlJUQWdnQnVmZmVyKTsKKwkJCUhUQ29uc3RydWN0UlQyUlRBZ2dFbGVtZW50KGllZWUsIHJlYWx0ZWtfaWVfYnVmLAorCQkJCQkJICAgJnJlYWx0ZWtfaWVfbGVuKTsKKwkJfQorCX0KKworCWlmIChiZWFjb24tPmJDa2lwU3VwcG9ydGVkKQorCQlja2lwX2llX2xlbiA9IDMwKzI7CisJaWYgKGJlYWNvbi0+YkNjeFJtRW5hYmxlKQorCQljY3hybV9pZV9sZW4gPSA2KzI7CisJaWYgKGJlYWNvbi0+QnNzQ2N4VmVyTnVtYmVyID49IDIpCisJCWN4dmVybnVtX2llX2xlbiA9IDUrMjsKKworCVBNS0NhY2hlSWR4ID0gU2VjSXNJblBNS0lETGlzdChpZWVlLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQpOworCWlmIChQTUtDYWNoZUlkeCA+PSAwKSB7CisJCXdwYV9pZV9sZW4gKz0gMTg7CisJCXByaW50ayhLRVJOX0lORk8gIltQTUsgY2FjaGVdOiBXUEEyIElFIGxlbmd0aDogJXhcbiIsCisJCSAgICAgICB3cGFfaWVfbGVuKTsKKwl9CisJbGVuID0gc2l6ZW9mKHN0cnVjdCBydGxsaWJfYXNzb2NfcmVxdWVzdF9mcmFtZSkgKyAyCisJCSsgYmVhY29uLT5zc2lkX2xlbgorCQkrIHJhdGVfbGVuCisJCSsgd3BhX2llX2xlbgorCQkrIHdwc19pZV9sZW4KKwkJKyB3bW1faW5mb19sZW4KKwkJKyB0dXJib19pbmZvX2xlbgorCQkrIGh0X2NhcF9sZW4KKwkJKyByZWFsdGVrX2llX2xlbgorCQkrIGNraXBfaWVfbGVuCisJCSsgY2N4cm1faWVfbGVuCisJCSsgY3h2ZXJudW1faWVfbGVuCisJCSsgaWVlZS0+dHhfaGVhZHJvb207CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxlbik7CisKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwlza2JfcmVzZXJ2ZShza2IsIGllZWUtPnR4X2hlYWRyb29tKTsKKworCWhkciA9IChzdHJ1Y3QgcnRsbGliX2Fzc29jX3JlcXVlc3RfZnJhbWUgKikKKwkJc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgcnRsbGliX2Fzc29jX3JlcXVlc3RfZnJhbWUpICsgMik7CisKKworCWhkci0+aGVhZGVyLmZyYW1lX2N0bCA9IFJUTExJQl9TVFlQRV9BU1NPQ19SRVE7CisJaGRyLT5oZWFkZXIuZHVyYXRpb25faWQgPSAzNzsKKwltZW1jcHkoaGRyLT5oZWFkZXIuYWRkcjEsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsKKwltZW1jcHkoaGRyLT5oZWFkZXIuYWRkcjIsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoaGRyLT5oZWFkZXIuYWRkcjMsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsKKworCW1lbWNweShpZWVlLT5hcF9tYWNfYWRkciwgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOworCisJaGRyLT5jYXBhYmlsaXR5ID0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX0VTUyk7CisJaWYgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9QUklWQUNZKQorCQloZHItPmNhcGFiaWxpdHkgfD0gY3B1X3RvX2xlMTYoV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpOworCisJaWYgKGJlYWNvbi0+Y2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSkKKwkJaGRyLT5jYXBhYmlsaXR5IHw9IGNwdV90b19sZTE2KFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSk7CisKKwlpZiAoaWVlZS0+c2hvcnRfc2xvdCAmJgorCSAgIChiZWFjb24tPmNhcGFiaWxpdHkmV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1RfVElNRSkpCisJCWhkci0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfU0hPUlRfU0xPVF9USU1FKTsKKworCisJaGRyLT5saXN0ZW5faW50ZXJ2YWwgPSBiZWFjb24tPmxpc3Rlbl9pbnRlcnZhbDsKKworCWhkci0+aW5mb19lbGVtZW50WzBdLmlkID0gTUZJRV9UWVBFX1NTSUQ7CisKKwloZHItPmluZm9fZWxlbWVudFswXS5sZW4gPSBiZWFjb24tPnNzaWRfbGVuOworCXRhZyA9IHNrYl9wdXQoc2tiLCBiZWFjb24tPnNzaWRfbGVuKTsKKwltZW1jcHkodGFnLCBiZWFjb24tPnNzaWQsIGJlYWNvbi0+c3NpZF9sZW4pOworCisJdGFnID0gc2tiX3B1dChza2IsIHJhdGVfbGVuKTsKKworCWlmIChiZWFjb24tPnJhdGVzX2xlbikgeworCQkqdGFnKysgPSBNRklFX1RZUEVfUkFURVM7CisJCSp0YWcrKyA9IGJlYWNvbi0+cmF0ZXNfbGVuOworCQlmb3IgKGkgPSAwOyBpIDwgYmVhY29uLT5yYXRlc19sZW47IGkrKykKKwkJCSp0YWcrKyA9IGJlYWNvbi0+cmF0ZXNbaV07CisJfQorCisJaWYgKGJlYWNvbi0+cmF0ZXNfZXhfbGVuKSB7CisJCSp0YWcrKyA9IE1GSUVfVFlQRV9SQVRFU19FWDsKKwkJKnRhZysrID0gYmVhY29uLT5yYXRlc19leF9sZW47CisJCWZvciAoaSA9IDA7IGkgPCBiZWFjb24tPnJhdGVzX2V4X2xlbjsgaSsrKQorCQkJKnRhZysrID0gYmVhY29uLT5yYXRlc19leFtpXTsKKwl9CisKKwlpZiAoYmVhY29uLT5iQ2tpcFN1cHBvcnRlZCkgeworCQlzdGF0aWMgdTgJQWlyb25ldEllT3VpW10gPSB7MHgwMCwgMHgwMSwgMHg2Nn07CisJCXU4CUNjeEFpcm9uZXRCdWZbMzBdOworCQlzdHJ1Y3Qgb2N0ZXRfc3RyaW5nIG9zQ2N4QWlyb25ldElFOworCisJCW1lbXNldChDY3hBaXJvbmV0QnVmLCAwLCAzMCk7CisJCW9zQ2N4QWlyb25ldElFLk9jdGV0ID0gQ2N4QWlyb25ldEJ1ZjsKKwkJb3NDY3hBaXJvbmV0SUUuTGVuZ3RoID0gc2l6ZW9mKENjeEFpcm9uZXRCdWYpOworCQltZW1jcHkob3NDY3hBaXJvbmV0SUUuT2N0ZXQsIEFpcm9uZXRJZU91aSwKKwkJICAgICAgIHNpemVvZihBaXJvbmV0SWVPdWkpKTsKKworCQlvc0NjeEFpcm9uZXRJRS5PY3RldFtJRV9DSVNDT19GTEFHX1BPU0lUSU9OXSB8PQorCQkJCQkgKFNVUFBPUlRfQ0tJUF9QS3xTVVBQT1JUX0NLSVBfTUlDKTsKKwkJdGFnID0gc2tiX3B1dChza2IsIGNraXBfaWVfbGVuKTsKKwkJKnRhZysrID0gTUZJRV9UWVBFX0FJUk9ORVQ7CisJCSp0YWcrKyA9IG9zQ2N4QWlyb25ldElFLkxlbmd0aDsKKwkJbWVtY3B5KHRhZywgb3NDY3hBaXJvbmV0SUUuT2N0ZXQsIG9zQ2N4QWlyb25ldElFLkxlbmd0aCk7CisJCXRhZyArPSBvc0NjeEFpcm9uZXRJRS5MZW5ndGg7CisJfQorCisJaWYgKGJlYWNvbi0+YkNjeFJtRW5hYmxlKSB7CisJCXN0YXRpYyB1OCBDY3hSbUNhcEJ1ZltdID0gezB4MDAsIDB4NDAsIDB4OTYsIDB4MDEsIDB4MDEsIDB4MDB9OworCQlzdHJ1Y3Qgb2N0ZXRfc3RyaW5nIG9zQ2N4Um1DYXA7CisKKwkJb3NDY3hSbUNhcC5PY3RldCA9IENjeFJtQ2FwQnVmOworCQlvc0NjeFJtQ2FwLkxlbmd0aCA9IHNpemVvZihDY3hSbUNhcEJ1Zik7CisJCXRhZyA9IHNrYl9wdXQoc2tiLCBjY3hybV9pZV9sZW4pOworCQkqdGFnKysgPSBNRklFX1RZUEVfR0VORVJJQzsKKwkJKnRhZysrID0gb3NDY3hSbUNhcC5MZW5ndGg7CisJCW1lbWNweSh0YWcsIG9zQ2N4Um1DYXAuT2N0ZXQsIG9zQ2N4Um1DYXAuTGVuZ3RoKTsKKwkJdGFnICs9IG9zQ2N4Um1DYXAuTGVuZ3RoOworCX0KKworCWlmIChiZWFjb24tPkJzc0NjeFZlck51bWJlciA+PSAyKSB7CisJCXU4IENjeFZlck51bUJ1ZltdID0gezB4MDAsIDB4NDAsIDB4OTYsIDB4MDMsIDB4MDB9OworCQlzdHJ1Y3Qgb2N0ZXRfc3RyaW5nIG9zQ2N4VmVyTnVtOworCQlDY3hWZXJOdW1CdWZbNF0gPSBiZWFjb24tPkJzc0NjeFZlck51bWJlcjsKKwkJb3NDY3hWZXJOdW0uT2N0ZXQgPSBDY3hWZXJOdW1CdWY7CisJCW9zQ2N4VmVyTnVtLkxlbmd0aCA9IHNpemVvZihDY3hWZXJOdW1CdWYpOworCQl0YWcgPSBza2JfcHV0KHNrYiwgY3h2ZXJudW1faWVfbGVuKTsKKwkJKnRhZysrID0gTUZJRV9UWVBFX0dFTkVSSUM7CisJCSp0YWcrKyA9IG9zQ2N4VmVyTnVtLkxlbmd0aDsKKwkJbWVtY3B5KHRhZywgb3NDY3hWZXJOdW0uT2N0ZXQsIG9zQ2N4VmVyTnVtLkxlbmd0aCk7CisJCXRhZyArPSBvc0NjeFZlck51bS5MZW5ndGg7CisJfQorCWlmIChpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCAmJiBpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQpIHsKKwkJaWYgKGllZWUtPnBIVEluZm8tPmVQZWVySFRTcGVjVmVyICE9IEhUX1NQRUNfVkVSX0VXQykgeworCQkJdGFnID0gc2tiX3B1dChza2IsIGh0X2NhcF9sZW4pOworCQkJKnRhZysrID0gTUZJRV9UWVBFX0hUX0NBUDsKKwkJCSp0YWcrKyA9IGh0X2NhcF9sZW4gLSAyOworCQkJbWVtY3B5KHRhZywgaHRfY2FwX2J1ZiwgaHRfY2FwX2xlbiAtIDIpOworCQkJdGFnICs9IGh0X2NhcF9sZW4gLSAyOworCQl9CisJfQorCisJaWYgKHdwYV9pZV9sZW4pIHsKKwkJdGFnID0gc2tiX3B1dChza2IsIGllZWUtPndwYV9pZV9sZW4pOworCQltZW1jcHkodGFnLCBpZWVlLT53cGFfaWUsIGllZWUtPndwYV9pZV9sZW4pOworCisJCWlmIChQTUtDYWNoZUlkeCA+PSAwKSB7CisJCQl0YWcgPSBza2JfcHV0KHNrYiwgMTgpOworCQkJKnRhZyA9IDE7CisJCQkqKHRhZyArIDEpID0gMDsKKwkJCW1lbWNweSgodGFnICsgMiksICZpZWVlLT5QTUtJRExpc3RbUE1LQ2FjaGVJZHhdLlBNS0lELAorCQkJICAgICAgIDE2KTsKKwkJfQorCX0KKwlpZiAod21tX2luZm9fbGVuKSB7CisJCXRhZyA9IHNrYl9wdXQoc2tiLCB3bW1faW5mb19sZW4pOworCQlydGxsaWJfV01NX0luZm8oaWVlZSwgJnRhZyk7CisJfQorCisJaWYgKHdwc19pZV9sZW4gJiYgaWVlZS0+d3BzX2llKSB7CisJCXRhZyA9IHNrYl9wdXQoc2tiLCB3cHNfaWVfbGVuKTsKKwkJbWVtY3B5KHRhZywgaWVlZS0+d3BzX2llLCB3cHNfaWVfbGVuKTsKKwl9CisKKwl0YWcgPSBza2JfcHV0KHNrYiwgdHVyYm9faW5mb19sZW4pOworCWlmICh0dXJib19pbmZvX2xlbikKKwkJcnRsbGliX1RVUkJPX0luZm8oaWVlZSwgJnRhZyk7CisKKwlpZiAoaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgJiYgaWVlZS0+cEhUSW5mby0+YkVuYWJsZUhUKSB7CisJCWlmIChpZWVlLT5wSFRJbmZvLT5lUGVlckhUU3BlY1ZlciA9PSBIVF9TUEVDX1ZFUl9FV0MpIHsKKwkJCXRhZyA9IHNrYl9wdXQoc2tiLCBodF9jYXBfbGVuKTsKKwkJCSp0YWcrKyA9IE1GSUVfVFlQRV9HRU5FUklDOworCQkJKnRhZysrID0gaHRfY2FwX2xlbiAtIDI7CisJCQltZW1jcHkodGFnLCBodF9jYXBfYnVmLCBodF9jYXBfbGVuIC0gMik7CisJCQl0YWcgKz0gaHRfY2FwX2xlbiAtIDI7CisJCX0KKworCQlpZiAoaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRSVDJSVEFnZ3JlZ2F0aW9uKSB7CisJCQl0YWcgPSBza2JfcHV0KHNrYiwgcmVhbHRla19pZV9sZW4pOworCQkJKnRhZysrID0gTUZJRV9UWVBFX0dFTkVSSUM7CisJCQkqdGFnKysgPSByZWFsdGVrX2llX2xlbiAtIDI7CisJCQltZW1jcHkodGFnLCByZWFsdGVrX2llX2J1ZiwgcmVhbHRla19pZV9sZW4gLSAyKTsKKwkJfQorCX0KKworCWtmcmVlKGllZWUtPmFzc29jcmVxX2llcyk7CisJaWVlZS0+YXNzb2NyZXFfaWVzID0gTlVMTDsKKwlpZXMgPSAmKGhkci0+aW5mb19lbGVtZW50WzBdLmlkKTsKKwlpZWVlLT5hc3NvY3JlcV9pZXNfbGVuID0gKHNrYi0+ZGF0YSArIHNrYi0+bGVuKSAtIGllczsKKwlpZWVlLT5hc3NvY3JlcV9pZXMgPSBrbWFsbG9jKGllZWUtPmFzc29jcmVxX2llc19sZW4sIEdGUF9BVE9NSUMpOworCWlmIChpZWVlLT5hc3NvY3JlcV9pZXMpCisJCW1lbWNweShpZWVlLT5hc3NvY3JlcV9pZXMsIGllcywgaWVlZS0+YXNzb2NyZXFfaWVzX2xlbik7CisJZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIiVzKClXYXJuaW5nOiBjYW4ndCBhbGxvYyBtZW1vcnkgZm9yIGFzc29jcmVxIgorCQkgICAgICAgIl9pZXNcbiIsIF9fZnVuY19fKTsKKwkJaWVlZS0+YXNzb2NyZXFfaWVzX2xlbiA9IDA7CisJfQorCXJldHVybiBza2I7Cit9CisKK3ZvaWQgcnRsbGliX2Fzc29jaWF0ZV9hYm9ydChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWllZWUtPmFzc29jaWF0ZV9zZXErKzsKKworCS8qIGRvbid0IHNjYW4sIGFuZCBhdm9pZCB0byBoYXZlIHRoZSBSWCBwYXRoIHBvc3NpYmlseQorCSAqIHRyeSBhZ2FpbiB0byBhc3NvY2lhdGUuIEV2ZW4gZG8gbm90IHJlYWN0IHRvIEFVVEggb3IKKwkgKiBBU1NPQyByZXNwb25zZS4gSnVzdCB3YWl0IGZvciB0aGUgcmV0cnkgd3EgdG8gYmUgc2NoZWR1bGVkLgorCSAqIEhlcmUgd2Ugd2lsbCBjaGVjayBpZiB0aGVyZSBhcmUgZ29vZCBuZXRzIHRvIGFzc29jaWF0ZQorCSAqIHdpdGgsIHNvIHdlIHJldHJ5IG9yIGp1c3QgZ2V0IGJhY2sgdG8gTk9fTElOSyBhbmQgc2Nhbm5pbmcKKwkgKi8KKwlpZiAoaWVlZS0+c3RhdGUgPT0gUlRMTElCX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HKSB7CisJCVJUTExJQl9ERUJVR19NR01UKCJBdXRoZW50aWNhdGlvbiBmYWlsZWRcbiIpOworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLm5vX2F1dGhfcnMrKzsKKwl9IGVsc2UgeworCQlSVExMSUJfREVCVUdfTUdNVCgiQXNzb2NpYXRpb24gZmFpbGVkXG4iKTsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy5ub19hc3NfcnMrKzsKKwl9CisKKwlpZWVlLT5zdGF0ZSA9IFJUTExJQl9BU1NPQ0lBVElOR19SRVRSWTsKKworCXF1ZXVlX2RlbGF5ZWRfd29ya19yc2woaWVlZS0+d3EsICZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EsCisJCQkgICBSVExMSUJfU09GVE1BQ19BU1NPQ19SRVRSWV9USU1FKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcnRsbGliX2Fzc29jaWF0ZV9hYm9ydF9jYih1bnNpZ25lZCBsb25nIGRldikKK3sKKwlydGxsaWJfYXNzb2NpYXRlX2Fib3J0KChzdHJ1Y3QgcnRsbGliX2RldmljZSAqKSBkZXYpOworfQorCitzdGF0aWMgdm9pZCBydGxsaWJfYXNzb2NpYXRlX3N0ZXAxKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCAqIGRhZGRyKQoreworCXN0cnVjdCBydGxsaWJfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJUlRMTElCX0RFQlVHX01HTVQoIlN0b3BwaW5nIHNjYW5cbiIpOworCisJaWVlZS0+c29mdG1hY19zdGF0cy50eF9hdXRoX3JxKys7CisKKwlza2IgPSBydGxsaWJfYXV0aGVudGljYXRpb25fcmVxKGJlYWNvbiwgaWVlZSwgMCwgZGFkZHIpOworCisJaWYgKCFza2IpCisJCXJ0bGxpYl9hc3NvY2lhdGVfYWJvcnQoaWVlZSk7CisJZWxzZSB7CisJCWllZWUtPnN0YXRlID0gUlRMTElCX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HIDsKKwkJUlRMTElCX0RFQlVHX01HTVQoIlNlbmRpbmcgYXV0aGVudGljYXRpb24gcmVxdWVzdFxuIik7CisJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CisJCWlmICghdGltZXJfcGVuZGluZygmaWVlZS0+YXNzb2NpYXRlX3RpbWVyKSkgeworCQkJaWVlZS0+YXNzb2NpYXRlX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKEhaIC8gMik7CisJCQlhZGRfdGltZXIoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJ0bGxpYl9hdXRoX2NoYWxsZW5nZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggKmNoYWxsZW5nZSwgaW50IGNobGVuKQoreworCXU4ICpjOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHJ0bGxpYl9uZXR3b3JrICpiZWFjb24gPSAmaWVlZS0+Y3VycmVudF9uZXR3b3JrOworCisJaWVlZS0+YXNzb2NpYXRlX3NlcSsrOworCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfYXV0aF9ycSsrOworCisJc2tiID0gcnRsbGliX2F1dGhlbnRpY2F0aW9uX3JlcShiZWFjb24sIGllZWUsIGNobGVuICsgMiwgYmVhY29uLT5ic3NpZCk7CisKKwlpZiAoIXNrYikKKwkJcnRsbGliX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKKwllbHNlIHsKKwkJYyA9IHNrYl9wdXQoc2tiLCBjaGxlbisyKTsKKwkJKihjKyspID0gTUZJRV9UWVBFX0NIQUxMRU5HRTsKKwkJKihjKyspID0gY2hsZW47CisJCW1lbWNweShjLCBjaGFsbGVuZ2UsIGNobGVuKTsKKworCQlSVExMSUJfREVCVUdfTUdNVCgiU2VuZGluZyBhdXRoZW50aWNhdGlvbiBjaGFsbGVuZ2UgIgorCQkJCSAgInJlc3BvbnNlXG4iKTsKKworCQlydGxsaWJfZW5jcnlwdF9mcmFnbWVudChpZWVlLCBza2IsCisJCQkJCXNpemVvZihzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkcikpOworCisJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CisJCW1vZF90aW1lcigmaWVlZS0+YXNzb2NpYXRlX3RpbWVyLCBqaWZmaWVzICsgKEhaLzIpKTsKKwl9CisJa2ZyZWUoY2hhbGxlbmdlKTsKK30KKworc3RhdGljIHZvaWQgcnRsbGliX2Fzc29jaWF0ZV9zdGVwMihzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBydGxsaWJfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKKworCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOworCisJUlRMTElCX0RFQlVHX01HTVQoIlNlbmRpbmcgYXNzb2NpYXRpb24gcmVxdWVzdFxuIik7CisKKwlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X2Fzc19ycSsrOworCXNrYiA9IHJ0bGxpYl9hc3NvY2lhdGlvbl9yZXEoYmVhY29uLCBpZWVlKTsKKwlpZiAoIXNrYikKKwkJcnRsbGliX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKKwllbHNlIHsKKwkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKKwkJbW9kX3RpbWVyKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIsIGppZmZpZXMgKyAoSFovMikpOworCX0KK30KKworI2RlZmluZSBDQU5DRUxMRUQgIDIKK3N0YXRpYyB2b2lkIHJ0bGxpYl9hc3NvY2lhdGVfY29tcGxldGVfd3Eodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSA9IChzdHJ1Y3QgcnRsbGliX2RldmljZSAqKQorCQkJCSAgICAgY29udGFpbmVyX29mX3dvcmtfcnNsKGRhdGEsCisJCQkJICAgICBzdHJ1Y3QgcnRsbGliX2RldmljZSwKKwkJCQkgICAgIGFzc29jaWF0ZV9jb21wbGV0ZV93cSk7CisJc3RydWN0IHJ0X3B3cl9zYXZlX2N0cmwgKnBQU0MgPSAoc3RydWN0IHJ0X3B3cl9zYXZlX2N0cmwgKikKKwkJCQkJKCYoaWVlZS0+UG93ZXJTYXZlQ29udHJvbCkpOworCXByaW50ayhLRVJOX0lORk8gIkFzc29jaWF0ZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKKwlpZiAoaWVlZS0+aXNfc2lsZW50X3Jlc2V0ID09IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAibm9ybWFsIGFzc29jaWF0ZVxuIik7CisJCW5vdGlmeV93eF9hc3NvY19ldmVudChpZWVlKTsKKwl9CisKKwluZXRpZl9jYXJyaWVyX29uKGllZWUtPmRldik7CisJaWVlZS0+aXNfcm9hbWluZyA9IGZhbHNlOworCWlmIChydGxsaWJfaXNfNTRnKCZpZWVlLT5jdXJyZW50X25ldHdvcmspICYmCisJICAgKGllZWUtPm1vZHVsYXRpb24gJiBSVExMSUJfT0ZETV9NT0RVTEFUSU9OKSkgeworCQlpZWVlLT5yYXRlID0gMTA4OworCQlwcmludGsoS0VSTl9JTkZPIlVzaW5nIEcgcmF0ZXM6JWRcbiIsIGllZWUtPnJhdGUpOworCX0gZWxzZSB7CisJCWllZWUtPnJhdGUgPSAyMjsKKwkJaWVlZS0+U2V0V2lyZWxlc3NNb2RlKGllZWUtPmRldiwgSUVFRV9CKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBCIHJhdGVzOiVkXG4iLCBpZWVlLT5yYXRlKTsKKwl9CisJaWYgKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ICYmIGllZWUtPnBIVEluZm8tPmJFbmFibGVIVCkgeworCQlwcmludGsoS0VSTl9JTkZPICJTdWNjZXNzZnVsbHkgYXNzb2NpYXRlZCwgaHQgZW5hYmxlZFxuIik7CisJCUhUT25Bc3NvY1JzcChpZWVlKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJTdWNjZXNzZnVsbHkgYXNzb2NpYXRlZCwgaHQgbm90ICIKKwkJICAgICAgICJlbmFibGVkKCVkLCAlZClcbiIsCisJCSAgICAgICBpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCwKKwkJICAgICAgIGllZWUtPnBIVEluZm8tPmJFbmFibGVIVCk7CisJCW1lbXNldChpZWVlLT5kb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0LCAwLCAxNik7CisJfQorCWllZWUtPkxpbmtEZXRlY3RJbmZvLlNsb3ROdW0gPSAyICogKDEgKworCQkJCSAgICAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsIC8KKwkJCQkgICAgICAgNTAwKTsKKwlpZiAoaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkJjbkluUGVyaW9kID09IDAgfHwKKwkgICAgaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkRhdGFJblBlcmlvZCA9PSAwKSB7CisJCWllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZCY25JblBlcmlvZCA9IDE7CisJCWllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZEYXRhSW5QZXJpb2QgPSAxOworCX0KKwlwUFNDLT5McHNJZGxlQ291bnQgPSAwOworCWllZWUtPmxpbmtfY2hhbmdlKGllZWUtPmRldik7CisKKwlpZiAoaWVlZS0+aXNfc2lsZW50X3Jlc2V0ID09IDEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2lsZW50IHJlc2V0IGFzc29jaWF0ZVxuIik7CisJCWllZWUtPmlzX3NpbGVudF9yZXNldCA9IDA7CisJfQorCisJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCisJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKKworfQorCitzdGF0aWMgdm9pZCBydGxsaWJfc3RhX3NlbmRfYXNzb2NpbmZvKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQoreworfQorCitzdGF0aWMgdm9pZCBydGxsaWJfYXNzb2NpYXRlX2NvbXBsZXRlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQoreworCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOworCisJaWVlZS0+c3RhdGUgPSBSVExMSUJfTElOS0VEOworCXJ0bGxpYl9zdGFfc2VuZF9hc3NvY2luZm8oaWVlZSk7CisKKwlxdWV1ZV93b3JrX3JzbChpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9jb21wbGV0ZV93cSk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bGxpYl9hc3NvY2lhdGVfcHJvY2VkdXJlX3dxKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2ZfZHdvcmtfcnNsKGRhdGEsCisJCQkJICAgICBzdHJ1Y3QgcnRsbGliX2RldmljZSwKKwkJCQkgICAgIGFzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOworCXJ0bGxpYl9zdG9wX3NjYW5fc3luY3JvKGllZWUpOworCWlmIChpZWVlLT5ydGxsaWJfaXBzX2xlYXZlICE9IE5VTEwpCisJCWllZWUtPnJ0bGxpYl9pcHNfbGVhdmUoaWVlZS0+ZGV2KTsKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJaWYgKGllZWUtPmRhdGFfaGFyZF9zdG9wKQorCQlpZWVlLT5kYXRhX2hhcmRfc3RvcChpZWVlLT5kZXYpOworCisJcnRsbGliX3N0b3Bfc2NhbihpZWVlKTsKKwlSVF9UUkFDRShDT01QX0RCRywgIj09PT4lcygpLCBjaGFuOiVkXG4iLCBfX2Z1bmNfXywKKwkJIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKwlIVFNldENvbm5lY3RCd01vZGUoaWVlZSwgSFRfQ0hBTk5FTF9XSURUSF8yMCwgSFRfRVhUQ0hOTF9PRkZTRVRfTk9fRVhUKTsKKwlpZiAoaWVlZS0+ZVJGUG93ZXJTdGF0ZSA9PSBlUmZPZmYpIHsKKwkJUlRfVFJBQ0UoQ09NUF9EQkcsICI9PT09PT09PT09PT09PiVzKCk6UmYgc3RhdGUgaXMgZVJmT2ZmLCIKKwkJCSAiIHNjaGVkdWxlIGlwc2xlYXZlIHdxIGFnYWluLHJldHVyblxuIiwgX19mdW5jX18pOworCQlpZiAoaWVlZS0+cnRsbGliX2lwc19sZWF2ZV93cSAhPSBOVUxMKQorCQkJaWVlZS0+cnRsbGliX2lwc19sZWF2ZV93cShpZWVlLT5kZXYpOworCQl1cCgmaWVlZS0+d3hfc2VtKTsKKwkJcmV0dXJuOworCX0KKwlpZWVlLT5hc3NvY2lhdGVfc2VxID0gMTsKKworCXJ0bGxpYl9hc3NvY2lhdGVfc3RlcDEoaWVlZSwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkKTsKKworCXVwKCZpZWVlLT53eF9zZW0pOworfQorCitpbmxpbmUgdm9pZCBydGxsaWJfc29mdG1hY19uZXdfbmV0KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJCSAgIHN0cnVjdCBydGxsaWJfbmV0d29yayAqbmV0KQoreworCXU4IHRtcF9zc2lkW0lXX0VTU0lEX01BWF9TSVpFICsgMV07CisJaW50IHRtcF9zc2lkX2xlbiA9IDA7CisKKwlzaG9ydCBhcHNldCwgc3NpZHNldCwgc3NpZGJyb2FkLCBhcG1hdGNoLCBzc2lkbWF0Y2g7CisKKwkvKiB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBuZXcgbmV3IG9ubHkgaWYgd2UgYXJlIG5vdCBhc3NvY2lhdGVkCisJICogYW5kIHdlIGFyZSBub3QgYXNzb2NpYXRpbmcgLyBhdXRoZW50aWNhdGluZworCSAqLworCWlmIChpZWVlLT5zdGF0ZSAhPSBSVExMSUJfTk9MSU5LKQorCQlyZXR1cm47CisKKwlpZiAoKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgJiYgIShuZXQtPmNhcGFiaWxpdHkgJgorCSAgICBXTEFOX0NBUEFCSUxJVFlfRVNTKSkKKwkJcmV0dXJuOworCisJaWYgKChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpICYmICEobmV0LT5jYXBhYmlsaXR5ICYKKwkgICAgIFdMQU5fQ0FQQUJJTElUWV9JQlNTKSkKKwkJcmV0dXJuOworCisJaWYgKChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpICYmCisJICAgIChuZXQtPmNoYW5uZWwgPiBpZWVlLT5pYnNzX21heGpvaW5fY2hhbCkpCisJCXJldHVybjsKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBIHx8IGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgeworCQkvKiBpZiB0aGUgdXNlciBzcGVjaWZpZWQgdGhlIEFQIE1BQywgd2UgbmVlZCBhbHNvIHRoZSBlc3NpZAorCQkgKiBUaGlzIGNvdWxkIGJlIG9idGFpbmVkIGJ5IGJlYWNvbnMgb3IsIGlmIHRoZSBuZXR3b3JrIGRvZXMgbm90CisJCSAqIGJyb2FkY2FzdCBpdCwgaXQgY2FuIGJlIHB1dCBtYW51YWxseS4KKwkJICovCisJCWFwc2V0ID0gaWVlZS0+d2FwX3NldDsKKwkJc3NpZHNldCA9IGllZWUtPnNzaWRfc2V0OworCQlzc2lkYnJvYWQgPSAgIShuZXQtPnNzaWRfbGVuID09IDAgfHwgbmV0LT5zc2lkWzBdID09ICdcMCcpOworCQlhcG1hdGNoID0gKG1lbWNtcChpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIG5ldC0+YnNzaWQsCisJCQkJICBFVEhfQUxFTikgPT0gMCk7CisJCWlmICghc3NpZGJyb2FkKSB7CisJCQlzc2lkbWF0Y2ggPSAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09CisJCQkJICAgIG5ldC0+aGlkZGVuX3NzaWRfbGVuKSAmJgorCQkJCSAgICAoIXN0cm5jbXAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsCisJCQkJICAgIG5ldC0+aGlkZGVuX3NzaWQsIG5ldC0+aGlkZGVuX3NzaWRfbGVuKSk7CisJCQlpZiAobmV0LT5oaWRkZW5fc3NpZF9sZW4gPiAwKSB7CisJCQkJc3RybmNweShuZXQtPnNzaWQsIG5ldC0+aGlkZGVuX3NzaWQsCisJCQkJCW5ldC0+aGlkZGVuX3NzaWRfbGVuKTsKKwkJCQluZXQtPnNzaWRfbGVuID0gbmV0LT5oaWRkZW5fc3NpZF9sZW47CisJCQkJc3NpZGJyb2FkID0gMTsKKwkJCX0KKwkJfSBlbHNlCisJCQlzc2lkbWF0Y2ggPQorCQkJICAgKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9PSBuZXQtPnNzaWRfbGVuKSAmJgorCQkJICAgKCFzdHJuY21wKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBuZXQtPnNzaWQsCisJCQkgICBuZXQtPnNzaWRfbGVuKSk7CisKKwkJLyogaWYgdGhlIHVzZXIgc2V0IHRoZSBBUCBjaGVjayBpZiBtYXRjaC4KKwkJICogaWYgdGhlIG5ldHdvcmsgZG9lcyBub3QgYnJvYWRjYXN0IGVzc2lkIHdlIGNoZWNrIHRoZQorCQkgKgkgdXNlciBzdXBwbHllZCBBTlkgZXNzaWQKKwkJICogaWYgdGhlIG5ldHdvcmsgZG9lcyBicm9hZGNhc3QgYW5kIHRoZSB1c2VyIGRvZXMgbm90IHNldAorCQkgKgkgZXNzaWQgaXQgaXMgT0sKKwkJICogaWYgdGhlIG5ldHdvcmsgZG9lcyBicm9hZGNhc3QgYW5kIHRoZSB1c2VyIGRpZCBzZXQgZXNzaWQKKwkJICogY2hlY2sgaWYgZXNzaWQgbWF0Y2gKKwkJICogaWYgdGhlIGFwIGlzIG5vdCBzZXQsIGNoZWNrIHRoYXQgdGhlIHVzZXIgc2V0IHRoZSBic3NpZAorCQkgKiBhbmQgdGhlIG5ldHdvcmsgZG9lcyBicmFkY2FzdCBhbmQgdGhhdCB0aG9zZSB0d28gYnNzaWQgbWF0Y2gKKwkJICovCisJCWlmICgoYXBzZXQgJiYgYXBtYXRjaCAmJgorCQkgICAoKHNzaWRzZXQgJiYgc3NpZGJyb2FkICYmIHNzaWRtYXRjaCkgfHwKKwkJICAgKHNzaWRicm9hZCAmJiAhc3NpZHNldCkgfHwgKCFzc2lkYnJvYWQgJiYgc3NpZHNldCkpKSB8fAorCQkgICAoIWFwc2V0ICYmIHNzaWRzZXQgJiYgc3NpZGJyb2FkICYmIHNzaWRtYXRjaCkgfHwKKwkJICAgKGllZWUtPmlzX3JvYW1pbmcgJiYgc3NpZHNldCAmJiBzc2lkYnJvYWQgJiYgc3NpZG1hdGNoKSkgeworCQkJLyogaWYgdGhlIGVzc2lkIGlzIGhpZGRlbiByZXBsYWNlIGl0IHdpdGggdGhlCisJCQkqIGVzc2lkIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLgorCQkJKi8KKwkJCWlmICghc3NpZGJyb2FkKSB7CisJCQkJc3RybmNweSh0bXBfc3NpZCwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsCisJCQkJCUlXX0VTU0lEX01BWF9TSVpFKTsKKwkJCQl0bXBfc3NpZF9sZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW47CisJCQl9CisJCQltZW1jcHkoJmllZWUtPmN1cnJlbnRfbmV0d29yaywgbmV0LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgcnRsbGliX25ldHdvcmspKTsKKwkJCWlmICghc3NpZGJyb2FkKSB7CisJCQkJc3RybmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgdG1wX3NzaWQsCisJCQkJCUlXX0VTU0lEX01BWF9TSVpFKTsKKwkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPSB0bXBfc3NpZF9sZW47CisJCQl9CisJCQlwcmludGsoS0VSTl9JTkZPIkxpbmtpbmcgd2l0aCAlcyxjaGFubmVsOiVkLCBxb3M6JWQsICIKKwkJCSAgICAgICAibXlIVDolZCwgbmV0d29ya0hUOiVkLCBtb2RlOiV4IGN1cl9uZXQuZmxhZ3MiCisJCQkgICAgICAgIjoweCV4XG4iLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwKKwkJCSAgICAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCwKKwkJCSAgICAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuc3VwcG9ydGVkLAorCQkJICAgICAgIGllZWUtPnBIVEluZm8tPmJFbmFibGVIVCwKKwkJCSAgICAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaHQuYmRTdXBwb3J0SFQsCisJCQkgICAgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLm1vZGUsCisJCQkgICAgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmZsYWdzKTsKKworCQkJaWYgKChydGxsaWJfYWN0X3NjYW5uaW5nKGllZWUsIGZhbHNlKSkgJiYKKwkJCSAgICEoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TQ0FOKSkKKwkJCQlydGxsaWJfc3RvcF9zY2FuX3N5bmNybyhpZWVlKTsKKworCQkJaWVlZS0+aHdzY2FuX2NoX2JrID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWw7CisJCQlIVFJlc2V0SU9UU2V0dGluZyhpZWVlLT5wSFRJbmZvKTsKKwkJCWllZWUtPndtbV9hY20gPSAwOworCQkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgeworCQkJCS8qIEpvaW4gdGhlIG5ldHdvcmsgZm9yIHRoZSBmaXJzdCB0aW1lICovCisJCQkJaWVlZS0+QXNvY1JldHJ5Q291bnQgPSAwOworCQkJCWlmICgoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnN1cHBvcnRlZCA9PSAxKSAmJgorCQkJCSAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NodC5iZFN1cHBvcnRIVCkKKwkJCQkJSFRSZXNldFNlbGZBbmRTYXZlUGVlclNldHRpbmcoaWVlZSwKKwkJCQkJCSAmKGllZWUtPmN1cnJlbnRfbmV0d29yaykpOworCQkJCWVsc2UKKwkJCQkJaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPQorCQkJCQkJCQkgZmFsc2U7CisKKwkJCQlpZWVlLT5zdGF0ZSA9IFJUTExJQl9BU1NPQ0lBVElORzsKKwkJCQlpZiAoaWVlZS0+TGVkQ29udHJvbEhhbmRsZXIgIT0gTlVMTCkKKwkJCQkJaWVlZS0+TGVkQ29udHJvbEhhbmRsZXIoaWVlZS0+ZGV2LAorCQkJCQkJCSBMRURfQ1RMX1NUQVJUX1RPX0xJTkspOworCQkJCXF1ZXVlX2RlbGF5ZWRfd29ya19yc2woaWVlZS0+d3EsCisJCQkJCSAgICZpZWVlLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxLCAwKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHJ0bGxpYl9pc181NGcoJmllZWUtPmN1cnJlbnRfbmV0d29yaykgJiYKKwkJCQkJKGllZWUtPm1vZHVsYXRpb24gJiBSVExMSUJfT0ZETV9NT0RVTEFUSU9OKSkgeworCQkJCQlpZWVlLT5yYXRlID0gMTA4OworCQkJCQlpZWVlLT5TZXRXaXJlbGVzc01vZGUoaWVlZS0+ZGV2LCBJRUVFX0cpOworCQkJCQlwcmludGsoS0VSTl9JTkZPIlVzaW5nIEcgcmF0ZXNcbiIpOworCQkJCX0gZWxzZSB7CisJCQkJCWllZWUtPnJhdGUgPSAyMjsKKwkJCQkJaWVlZS0+U2V0V2lyZWxlc3NNb2RlKGllZWUtPmRldiwgSUVFRV9CKTsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBCIHJhdGVzXG4iKTsKKwkJCQl9CisJCQkJbWVtc2V0KGllZWUtPmRvdDExSFRPcGVyYXRpb25hbFJhdGVTZXQsIDAsIDE2KTsKKwkJCQlpZWVlLT5zdGF0ZSA9IFJUTExJQl9MSU5LRUQ7CisJCQl9CisJCX0KKwl9Cit9CisKK3ZvaWQgcnRsbGliX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKnRhcmdldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhcmdldCwgJmllZWUtPm5ldHdvcmtfbGlzdCwgbGlzdCkgeworCisJCS8qIGlmIHRoZSBzdGF0ZSBiZWNvbWUgZGlmZmVyZW50IHRoYXQgTk9MSU5LIG1lYW5zCisJCSAqIHdlIGhhZCBmb3VuZCB3aGF0IHdlIGFyZSBzZWFyY2hpbmcgZm9yCisJCSAqLworCisJCWlmIChpZWVlLT5zdGF0ZSAhPSBSVExMSUJfTk9MSU5LKQorCQkJYnJlYWs7CisKKwkJaWYgKGllZWUtPnNjYW5fYWdlID09IDAgfHwgdGltZV9hZnRlcih0YXJnZXQtPmxhc3Rfc2Nhbm5lZCArCisJCSAgICBpZWVlLT5zY2FuX2FnZSwgamlmZmllcykpCisJCQlydGxsaWJfc29mdG1hY19uZXdfbmV0KGllZWUsIHRhcmdldCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB1MTYgYXV0aF9wYXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCoqIGNoYWxsZW5nZSwgaW50ICpjaGxlbikKK3sKKwlzdHJ1Y3QgcnRsbGliX2F1dGhlbnRpY2F0aW9uICphOworCXU4ICp0OworCWlmIChza2ItPmxlbiA8ICAoc2l6ZW9mKHN0cnVjdCBydGxsaWJfYXV0aGVudGljYXRpb24pIC0KKwkgICAgc2l6ZW9mKHN0cnVjdCBydGxsaWJfaW5mb19lbGVtZW50KSkpIHsKKwkJUlRMTElCX0RFQlVHX01HTVQoImludmFsaWQgbGVuIGluIGF1dGggcmVzcDogJWRcbiIsIHNrYi0+bGVuKTsKKwkJcmV0dXJuIDB4Y2FmZTsKKwl9CisJKmNoYWxsZW5nZSA9IE5VTEw7CisJYSA9IChzdHJ1Y3QgcnRsbGliX2F1dGhlbnRpY2F0aW9uICopIHNrYi0+ZGF0YTsKKwlpZiAoc2tiLT5sZW4gPiAoc2l6ZW9mKHN0cnVjdCBydGxsaWJfYXV0aGVudGljYXRpb24pICsgMykpIHsKKwkJdCA9IHNrYi0+ZGF0YSArIHNpemVvZihzdHJ1Y3QgcnRsbGliX2F1dGhlbnRpY2F0aW9uKTsKKworCQlpZiAoKih0KyspID09IE1GSUVfVFlQRV9DSEFMTEVOR0UpIHsKKwkJCSpjaGxlbiA9ICoodCsrKTsKKwkJCSpjaGFsbGVuZ2UgPSBrbWFsbG9jKCpjaGxlbiwgR0ZQX0FUT01JQyk7CisJCQltZW1jcHkoKmNoYWxsZW5nZSwgdCwgKmNobGVuKTsJLypUT0RPIC0gY2hlY2sgaGVyZSovCisJCX0KKwl9CisJcmV0dXJuIGNwdV90b19sZTE2KGEtPnN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbnQgYXV0aF9ycV9wYXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqZGVzdCkKK3sKKwlzdHJ1Y3QgcnRsbGliX2F1dGhlbnRpY2F0aW9uICphOworCisJaWYgKHNrYi0+bGVuIDwgIChzaXplb2Yoc3RydWN0IHJ0bGxpYl9hdXRoZW50aWNhdGlvbikgLQorCSAgICBzaXplb2Yoc3RydWN0IHJ0bGxpYl9pbmZvX2VsZW1lbnQpKSkgeworCQlSVExMSUJfREVCVUdfTUdNVCgiaW52YWxpZCBsZW4gaW4gYXV0aCByZXF1ZXN0OiAlZFxuIiwKKwkJCQkgIHNrYi0+bGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKwlhID0gKHN0cnVjdCBydGxsaWJfYXV0aGVudGljYXRpb24gKikgc2tiLT5kYXRhOworCisJbWVtY3B5KGRlc3QsIGEtPmhlYWRlci5hZGRyMiwgRVRIX0FMRU4pOworCisJaWYgKGxlMTZfdG9fY3B1KGEtPmFsZ29yaXRobSkgIT0gV0xBTl9BVVRIX09QRU4pCisJCXJldHVybiAgV0xBTl9TVEFUVVNfTk9UX1NVUFBPUlRFRF9BVVRIX0FMRzsKKworCXJldHVybiBXTEFOX1NUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgc2hvcnQgcHJvYmVfcnFfcGFyc2Uoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgdTggKnNyYykKK3sKKwl1OCAqdGFnOworCXU4ICpza2JlbmQ7CisJdTggKnNzaWQgPSBOVUxMOworCXU4IHNzaWRsZW4gPSAwOworCXN0cnVjdCBydGxsaWJfaGRyXzNhZGRyICAgKmhlYWRlciA9CisJCShzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkciAgICopIHNrYi0+ZGF0YTsKKwlib29sIGJzc2lkX21hdGNoOworCisJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBydGxsaWJfaGRyXzNhZGRyKSkKKwkJcmV0dXJuIC0xOyAvKiBjb3JydXB0ZWQgKi8KKworCWJzc2lkX21hdGNoID0KKwkgIChtZW1jbXAoaGVhZGVyLT5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTikgIT0gMCkgJiYKKwkgIChtZW1jbXAoaGVhZGVyLT5hZGRyMywgIlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZiIsIEVUSF9BTEVOKSAhPSAwKTsKKwlpZiAoYnNzaWRfbWF0Y2gpCisJCXJldHVybiAtMTsKKworCW1lbWNweShzcmMsIGhlYWRlci0+YWRkcjIsIEVUSF9BTEVOKTsKKworCXNrYmVuZCA9ICh1OCAqKXNrYi0+ZGF0YSArIHNrYi0+bGVuOworCisJdGFnID0gc2tiLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBydGxsaWJfaGRyXzNhZGRyKTsKKworCXdoaWxlICh0YWcgKyAxIDwgc2tiZW5kKSB7CisJCWlmICgqdGFnID09IDApIHsKKwkJCXNzaWQgPSB0YWcgKyAyOworCQkJc3NpZGxlbiA9ICoodGFnICsgMSk7CisJCQlicmVhazsKKwkJfQorCQl0YWcrKzsgLyogcG9pbnQgdG8gdGhlIGxlbiBmaWVsZCAqLworCQl0YWcgPSB0YWcgKyAqKHRhZyk7IC8qIHBvaW50IHRvIHRoZSBsYXN0IGRhdGEgYnl0ZSBvZiB0aGUgdGFnICovCisJCXRhZysrOyAvKiBwb2ludCB0byB0aGUgbmV4dCB0YWcgKi8KKwl9CisKKwlpZiAoc3NpZGxlbiA9PSAwKQorCQlyZXR1cm4gMTsKKworCWlmICghc3NpZCkKKwkJcmV0dXJuIDE7IC8qIHNzaWQgbm90IGZvdW5kIGluIHRhZ2dlZCBwYXJhbSAqLworCisJcmV0dXJuICFzdHJuY21wKHNzaWQsIGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCBzc2lkbGVuKTsKK30KKworc3RhdGljIGludCBhc3NvY19ycV9wYXJzZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCAqZGVzdCkKK3sKKwlzdHJ1Y3QgcnRsbGliX2Fzc29jX3JlcXVlc3RfZnJhbWUgKmE7CisKKwlpZiAoc2tiLT5sZW4gPCAoc2l6ZW9mKHN0cnVjdCBydGxsaWJfYXNzb2NfcmVxdWVzdF9mcmFtZSkgLQorCQlzaXplb2Yoc3RydWN0IHJ0bGxpYl9pbmZvX2VsZW1lbnQpKSkgeworCisJCVJUTExJQl9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlcXVlc3Q6JWRcbiIsIHNrYi0+bGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWEgPSAoc3RydWN0IHJ0bGxpYl9hc3NvY19yZXF1ZXN0X2ZyYW1lICopIHNrYi0+ZGF0YTsKKworCW1lbWNweShkZXN0LCBhLT5oZWFkZXIuYWRkcjIsIEVUSF9BTEVOKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBhc3NvY19wYXJzZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgIGludCAqYWlkKQoreworCXN0cnVjdCBydGxsaWJfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKnJlc3BvbnNlX2hlYWQ7CisJdTE2IHN0YXR1c19jb2RlOworCisJaWYgKHNrYi0+bGVuIDwgIHNpemVvZihzdHJ1Y3QgcnRsbGliX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lKSkgeworCQlSVExMSUJfREVCVUdfTUdNVCgiaW52YWxpZCBsZW4gaW4gYXV0aCByZXNwOiAlZFxuIiwgc2tiLT5sZW4pOworCQlyZXR1cm4gMHhjYWZlOworCX0KKworCXJlc3BvbnNlX2hlYWQgPSAoc3RydWN0IHJ0bGxpYl9hc3NvY19yZXNwb25zZV9mcmFtZSAqKSBza2ItPmRhdGE7CisJKmFpZCA9IGxlMTZfdG9fY3B1KHJlc3BvbnNlX2hlYWQtPmFpZCkgJiAweDNmZmY7CisKKwlzdGF0dXNfY29kZSA9IGxlMTZfdG9fY3B1KHJlc3BvbnNlX2hlYWQtPnN0YXR1cyk7CisJaWYgKChzdGF0dXNfY29kZSA9PSBXTEFOX1NUQVRVU19BU1NPQ19ERU5JRURfUkFURVMgfHwKKwkgICBzdGF0dXNfY29kZSA9PSBXTEFOX1NUQVRVU19DQVBTX1VOU1VQUE9SVEVEKSAmJgorCSAgICgoaWVlZS0+bW9kZSA9PSBJRUVFX0cpICYmCisJICAgKGllZWUtPmN1cnJlbnRfbmV0d29yay5tb2RlID09IElFRUVfTl8yNEcpICYmCisJICAgKGllZWUtPkFzb2NSZXRyeUNvdW50KysgPCAoUlRfQVNPQ19SRVRSWV9MSU1JVC0xKSkpKSB7CisJCWllZWUtPnBIVEluZm8tPklPVEFjdGlvbiB8PSBIVF9JT1RfQUNUX1BVUkVfTl9NT0RFOworCX0gZWxzZSB7CisJCWllZWUtPkFzb2NSZXRyeUNvdW50ID0gMDsKKwl9CisKKwlyZXR1cm4gbGUxNl90b19jcHUocmVzcG9uc2VfaGVhZC0+c3RhdHVzKTsKK30KKwordm9pZCBydGxsaWJfcnhfcHJvYmVfcnEoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTggZGVzdFtFVEhfQUxFTl07CisJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9wcm9iZV9ycSsrOworCWlmIChwcm9iZV9ycV9wYXJzZShpZWVlLCBza2IsIGRlc3QpID4gMCkgeworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X3Byb2JlX3JzKys7CisJCXJ0bGxpYl9yZXNwX3RvX3Byb2JlKGllZWUsIGRlc3QpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0bGxpYl9yeF9hdXRoX3JxKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1OCBkZXN0W0VUSF9BTEVOXTsKKwlpbnQgc3RhdHVzOworCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXV0aF9ycSsrOworCisJc3RhdHVzID0gYXV0aF9ycV9wYXJzZShza2IsIGRlc3QpOworCWlmIChzdGF0dXMgIT0gLTEpCisJCXJ0bGxpYl9yZXNwX3RvX2F1dGgoaWVlZSwgc3RhdHVzLCBkZXN0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0bGxpYl9yeF9hc3NvY19ycShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCisJdTggZGVzdFtFVEhfQUxFTl07CisKKwlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2Fzc19ycSsrOworCWlmIChhc3NvY19ycV9wYXJzZShza2IsIGRlc3QpICE9IC0xKQorCQlydGxsaWJfcmVzcF90b19hc3NvY19ycShpZWVlLCBkZXN0KTsKKworCXByaW50ayhLRVJOX0lORk8iTmV3IGNsaWVudCBhc3NvY2lhdGVkOiAlcE1cbiIsIGRlc3QpOworfQorCit2b2lkIHJ0bGxpYl9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzaG9ydCBwd3IpCit7CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gcnRsbGliX251bGxfZnVuYyhpZWVlLCBwd3IpOworCisJaWYgKGJ1ZikKKwkJc29mdG1hY19wc19tZ210X3htaXQoYnVmLCBpZWVlKTsKK30KKwordm9pZCBydGxsaWJfc3RhX3BzX3NlbmRfcHNwb2xsX2ZyYW1lKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQoreworCXN0cnVjdCBza19idWZmICpidWYgPSBydGxsaWJfcHNwb2xsX2Z1bmMoaWVlZSk7CisKKwlpZiAoYnVmKQorCQlzb2Z0bWFjX3BzX21nbXRfeG1pdChidWYsIGllZWUpOworfQorCitzdGF0aWMgc2hvcnQgcnRsbGliX3N0YV9wc19zbGVlcChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTY0ICp0aW1lKQoreworCWludCB0aW1lb3V0ID0gaWVlZS0+cHNfdGltZW91dDsKKwl1OCBkdGltOworCXN0cnVjdCBydF9wd3Jfc2F2ZV9jdHJsICpwUFNDID0gKHN0cnVjdCBydF9wd3Jfc2F2ZV9jdHJsICopCisJCQkJCSgmKGllZWUtPlBvd2VyU2F2ZUNvbnRyb2wpKTsKKworCWlmIChpZWVlLT5MUFNEZWxheUNudCkgeworCQlpZWVlLT5MUFNEZWxheUNudC0tOworCQlyZXR1cm4gMDsKKwl9CisKKwlkdGltID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmR0aW1fZGF0YTsKKwlpZiAoIShkdGltICYgUlRMTElCX0RUSU1fVkFMSUQpKQorCQlyZXR1cm4gMDsKKwl0aW1lb3V0ID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbDsKKwlpZWVlLT5jdXJyZW50X25ldHdvcmsuZHRpbV9kYXRhID0gUlRMTElCX0RUSU1fSU5WQUxJRDsKKwkvKiB0aGVyZSdzIG5vIG5lZWQgdG8gbm9maXR5IEFQIHRoYXQgSSBmaW5kIHlvdSBidWZmZXJlZAorCSAqIHdpdGggYnJvYWRjYXN0IHBhY2tldCAqLworCWlmIChkdGltICYgKFJUTExJQl9EVElNX1VDQVNUICYgaWVlZS0+cHMpKQorCQlyZXR1cm4gMjsKKworCWlmICghdGltZV9hZnRlcihqaWZmaWVzLCBpZWVlLT5kZXYtPnRyYW5zX3N0YXJ0ICsgTVNFQ1ModGltZW91dCkpKQorCQlyZXR1cm4gMDsKKwlpZiAoIXRpbWVfYWZ0ZXIoamlmZmllcywgaWVlZS0+bGFzdF9yeF9wc190aW1lICsgTVNFQ1ModGltZW91dCkpKQorCQlyZXR1cm4gMDsKKwlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFKSAmJgorCSAgICAoaWVlZS0+bWdtdF9xdWV1ZV90YWlsICE9IGllZWUtPm1nbXRfcXVldWVfaGVhZCkpCisJCXJldHVybiAwOworCisJaWYgKHRpbWUpIHsKKwkJaWYgKGllZWUtPmJBd2FrZVBrdFNlbnQgPT0gdHJ1ZSkgeworCQkJcFBTQy0+TFBTQXdha2VJbnR2bCA9IDE7CisJCX0gZWxzZSB7CisJCQl1OAkJTWF4UGVyaW9kID0gMTsKKworCQkJaWYgKHBQU0MtPkxQU0F3YWtlSW50dmwgPT0gMCkKKwkJCQlwUFNDLT5MUFNBd2FrZUludHZsID0gMTsKKwkJCWlmIChwUFNDLT5SZWdNYXhMUFNBd2FrZUludHZsID09IDApCisJCQkJTWF4UGVyaW9kID0gMTsKKwkJCWVsc2UgaWYgKHBQU0MtPlJlZ01heExQU0F3YWtlSW50dmwgPT0gMHhGRikKKwkJCQlNYXhQZXJpb2QgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuZHRpbV9wZXJpb2Q7CisJCQllbHNlCisJCQkJTWF4UGVyaW9kID0gcFBTQy0+UmVnTWF4TFBTQXdha2VJbnR2bDsKKwkJCXBQU0MtPkxQU0F3YWtlSW50dmwgPSAocFBTQy0+TFBTQXdha2VJbnR2bCA+PQorCQkJCQkgICAgICAgTWF4UGVyaW9kKSA/IE1heFBlcmlvZCA6CisJCQkJCSAgICAgICAocFBTQy0+TFBTQXdha2VJbnR2bCArIDEpOworCQl9CisJCXsKKwkJCXU4IExQU0F3YWtlSW50dmxfdG1wID0gMDsKKwkJCXU4IHBlcmlvZCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5kdGltX3BlcmlvZDsKKwkJCXU4IGNvdW50ID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLnRpbS50aW1fY291bnQ7CisJCQlpZiAoY291bnQgPT0gMCkgeworCQkJCWlmIChwUFNDLT5MUFNBd2FrZUludHZsID4gcGVyaW9kKQorCQkJCQlMUFNBd2FrZUludHZsX3RtcCA9IHBlcmlvZCArCisJCQkJCQkgKHBQU0MtPkxQU0F3YWtlSW50dmwgLQorCQkJCQkJIHBlcmlvZCkgLQorCQkJCQkJICgocFBTQy0+TFBTQXdha2VJbnR2bC1wZXJpb2QpICUKKwkJCQkJCSBwZXJpb2QpOworCQkJCWVsc2UKKwkJCQkJTFBTQXdha2VJbnR2bF90bXAgPSBwUFNDLT5MUFNBd2FrZUludHZsOworCisJCQl9IGVsc2UgeworCQkJCWlmIChwUFNDLT5MUFNBd2FrZUludHZsID4KKwkJCQkgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnRpbS50aW1fY291bnQpCisJCQkJCUxQU0F3YWtlSW50dmxfdG1wID0gY291bnQgKworCQkJCQkocFBTQy0+TFBTQXdha2VJbnR2bCAtIGNvdW50KSAtCisJCQkJCSgocFBTQy0+TFBTQXdha2VJbnR2bC1jb3VudCklcGVyaW9kKTsKKwkJCQllbHNlCisJCQkJCUxQU0F3YWtlSW50dmxfdG1wID0gcFBTQy0+TFBTQXdha2VJbnR2bDsKKwkJCX0KKworCQkqdGltZSA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5sYXN0X2R0aW1fc3RhX3RpbWUKKwkJCSsgTVNFQ1MoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCAqCisJCQlMUFNBd2FrZUludHZsX3RtcCk7CisJfQorCX0KKworCXJldHVybiAxOworCisKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0bGxpYl9zdGFfcHMoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJdTY0IHRpbWU7CisJc2hvcnQgc2xlZXA7CisJdW5zaWduZWQgbG9uZyBmbGFncywgZmxhZ3MyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmICgoaWVlZS0+cHMgPT0gUlRMTElCX1BTX0RJU0FCTEVEIHx8CisJICAgICBpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgfHwKKwkgICAgIGllZWUtPnN0YXRlICE9IFJUTExJQl9MSU5LRUQpKSB7CisJCVJUX1RSQUNFKENPTVBfREJHLCAiPT09PT0+JXMoKTogbm8gbmVlZCB0byBwcyx3YWtlIHVwISEgIgorCQkJICJpZWVlLT5wcyBpcyAlZCwgaWVlZS0+aXdfbW9kZSBpcyAlZCwgaWVlZS0+c3RhdGUiCisJCQkgIiBpcyAlZFxuIiwgX19mdW5jX18sIGllZWUtPnBzLCBpZWVlLT5pd19tb2RlLAorCQkJICBpZWVlLT5zdGF0ZSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisJCXJ0bGxpYl9zdGFfd2FrZXVwKGllZWUsIDEpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKKwl9CisJc2xlZXAgPSBydGxsaWJfc3RhX3BzX3NsZWVwKGllZWUsICZ0aW1lKTsKKwkvKiAyIHdha2UsIDEgc2xlZXAsIDAgZG8gbm90aGluZyAqLworCWlmIChzbGVlcCA9PSAwKQorCQlnb3RvIG91dDsKKwlpZiAoc2xlZXAgPT0gMSkgeworCQlpZiAoaWVlZS0+c3RhX3NsZWVwID09IExQU19JU19TTEVFUCkgeworCQkJaWVlZS0+ZW50ZXJfc2xlZXBfc3RhdGUoaWVlZS0+ZGV2LCB0aW1lKTsKKwkJfSBlbHNlIGlmIChpZWVlLT5zdGFfc2xlZXAgPT0gTFBTX0lTX1dBS0UpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisKKwkJCWlmIChpZWVlLT5wc19pc19xdWV1ZV9lbXB0eShpZWVlLT5kZXYpKSB7CisJCQkJaWVlZS0+c3RhX3NsZWVwID0gTFBTX1dBSVRfTlVMTF9EQVRBX1NFTkQ7CisJCQkJaWVlZS0+YWNrX3R4X3RvX2llZWUgPSAxOworCQkJCXJ0bGxpYl9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIDEpOworCQkJCWllZWUtPnBzX3RpbWUgPSB0aW1lOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOworCisJCX0KKworCQlpZWVlLT5iQXdha2VQa3RTZW50ID0gZmFsc2U7CisKKwl9IGVsc2UgaWYgKHNsZWVwID09IDIpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKKworCQlydGxsaWJfc3RhX3dha2V1cChpZWVlLCAxKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5tZ210X3R4X2xvY2ssIGZsYWdzMik7CisJfQorCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCit9CisKK3ZvaWQgcnRsbGliX3N0YV93YWtldXAoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHNob3J0IG5sKQoreworCWlmIChpZWVlLT5zdGFfc2xlZXAgPT0gTFBTX0lTX1dBS0UpIHsKKwkJaWYgKG5sKSB7CisJCQlpZiAoaWVlZS0+cEhUSW5mby0+SU9UQWN0aW9uICYKKwkJCSAgICBIVF9JT1RfQUNUX05VTExfREFUQV9QT1dFUl9TQVZJTkcpIHsKKwkJCQlpZWVlLT5hY2tfdHhfdG9faWVlZSA9IDE7CisJCQkJcnRsbGliX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwgMCk7CisJCQl9IGVsc2UgeworCQkJCWllZWUtPmFja190eF90b19pZWVlID0gMTsKKwkJCQlydGxsaWJfc3RhX3BzX3NlbmRfcHNwb2xsX2ZyYW1lKGllZWUpOworCQkJfQorCQl9CisJCXJldHVybjsKKworCX0KKworCWlmIChpZWVlLT5zdGFfc2xlZXAgPT0gTFBTX0lTX1NMRUVQKQorCQlpZWVlLT5zdGFfd2FrZV91cChpZWVlLT5kZXYpOworCWlmIChubCkgeworCQlpZiAoaWVlZS0+cEhUSW5mby0+SU9UQWN0aW9uICYKKwkJICAgIEhUX0lPVF9BQ1RfTlVMTF9EQVRBX1BPV0VSX1NBVklORykgeworCQkJaWVlZS0+YWNrX3R4X3RvX2llZWUgPSAxOworCQkJcnRsbGliX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwgMCk7CisJCX0gZWxzZSB7CisJCQlpZWVlLT5hY2tfdHhfdG9faWVlZSA9IDE7CisJCQlpZWVlLT5wb2xsaW5nID0gdHJ1ZTsKKwkJCXJ0bGxpYl9zdGFfcHNfc2VuZF9wc3BvbGxfZnJhbWUoaWVlZSk7CisJCX0KKworCX0gZWxzZSB7CisJCWllZWUtPnN0YV9zbGVlcCA9IExQU19JU19XQUtFOworCQlpZWVlLT5wb2xsaW5nID0gZmFsc2U7CisJfQorfQorCit2b2lkIHJ0bGxpYl9wc190eF9hY2soc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHNob3J0IHN1Y2Nlc3MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncywgZmxhZ3MyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmIChpZWVlLT5zdGFfc2xlZXAgPT0gTFBTX1dBSVRfTlVMTF9EQVRBX1NFTkQpIHsKKwkJLyogTnVsbCBmcmFtZSB3aXRoIFBTIGJpdCBzZXQgKi8KKwkJaWYgKHN1Y2Nlc3MpIHsKKwkJCWllZWUtPnN0YV9zbGVlcCA9IExQU19JU19TTEVFUDsKKwkJCWllZWUtPmVudGVyX3NsZWVwX3N0YXRlKGllZWUtPmRldiwgaWVlZS0+cHNfdGltZSk7CisJCX0KKwkJLyogaWYgdGhlIGNhcmQgcmVwb3J0IG5vdCBzdWNjZXNzIHdlIGNhbid0IGJlIHN1cmUgdGhlIEFQCisJCSAqIGhhcyBub3QgUlhlZCBzbyB3ZSBjYW4ndCBhc3N1bWUgdGhlIEFQIGJlbGlldmUgdXMgYXdha2UKKwkJICovCisJfSBlbHNlIHsvKiAyMTExMjAwNSAtIHR4IGFnYWluIG51bGwgd2l0aG91dCBQUyBiaXQgaWYgbG9zdCAqLworCisJCWlmICgoaWVlZS0+c3RhX3NsZWVwID09IExQU19JU19XQUtFKSAmJiAhc3VjY2VzcykgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKKwkJCWlmIChpZWVlLT5wSFRJbmZvLT5JT1RBY3Rpb24gJgorCQkJICAgIEhUX0lPVF9BQ1RfTlVMTF9EQVRBX1BPV0VSX1NBVklORykKKwkJCQlydGxsaWJfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShpZWVlLCAwKTsKKwkJCWVsc2UKKwkJCQlydGxsaWJfc3RhX3BzX3NlbmRfcHNwb2xsX2ZyYW1lKGllZWUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcnRsbGliX3Byb2Nlc3NfYWN0aW9uKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBydGxsaWJfaGRyXzNhZGRyICpoZWFkZXIgPSAoc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgKikgc2tiLT5kYXRhOworCXU4ICphY3QgPSBydGxsaWJfZ2V0X3BheWxvYWQoKHN0cnVjdCBydGxsaWJfaGRyICopaGVhZGVyKTsKKwl1OCBjYXRlZ29yeSA9IDA7CisKKwlpZiAoYWN0ID09IE5VTEwpIHsKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICJlcnJvciB0byBnZXQgcGF5bG9hZCBvZiAiCisJCQkgICAgICJhY3Rpb24gZnJhbWVcbiIpOworCQlyZXR1cm47CisJfQorCisJY2F0ZWdvcnkgPSAqYWN0OworCWFjdCsrOworCXN3aXRjaCAoY2F0ZWdvcnkpIHsKKwljYXNlIEFDVF9DQVRfQkE6CisJCXN3aXRjaCAoKmFjdCkgeworCQljYXNlIEFDVF9BRERCQVJFUToKKwkJCXJ0bGxpYl9yeF9BRERCQVJlcShpZWVlLCBza2IpOworCQkJYnJlYWs7CisJCWNhc2UgQUNUX0FEREJBUlNQOgorCQkJcnRsbGliX3J4X0FEREJBUnNwKGllZWUsIHNrYik7CisJCQlicmVhazsKKwkJY2FzZSBBQ1RfREVMQkE6CisJCQlydGxsaWJfcnhfREVMQkEoaWVlZSwgc2tiKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm47Cit9CisKK2lubGluZSBpbnQgcnRsbGliX3J4X2Fzc29jX3Jlc3Aoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqcnhfc3RhdHMpCit7CisJdTE2IGVycmNvZGU7CisJaW50IGFpZDsKKwl1OCAqaWVzOworCXN0cnVjdCBydGxsaWJfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKmFzc29jX3Jlc3A7CisJc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgKmhlYWRlciA9IChzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkciAqKSBza2ItPmRhdGE7CisKKwlSVExMSUJfREVCVUdfTUdNVCgicmVjZWl2ZWQgW1JFXUFTU09DSUFUSU9OIFJFU1BPTlNFICglZClcbiIsCisJCQkgIFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSk7CisKKwlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKSAmJgorCSAgICAgaWVlZS0+c3RhdGUgPT0gUlRMTElCX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FURUQgJiYKKwkgICAgIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpKSB7CisJCWVycmNvZGUgPSBhc3NvY19wYXJzZShpZWVlLCBza2IsICZhaWQpOworCQlpZiAoMCA9PSBlcnJjb2RlKSB7CisJCQlzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKm5ldHdvcmsgPQorCQkJCSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnRsbGliX25ldHdvcmspLAorCQkJCSBHRlBfQVRPTUlDKTsKKworCQkJaWYgKCFuZXR3b3JrKQorCQkJCXJldHVybiAxOworCQkJbWVtc2V0KG5ldHdvcmssIDAsIHNpemVvZigqbmV0d29yaykpOworCQkJaWVlZS0+c3RhdGUgPSBSVExMSUJfTElOS0VEOworCQkJaWVlZS0+YXNzb2NfaWQgPSBhaWQ7CisJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2Fzc19vaysrOworCQkJLyogc3RhdGlvbiBzdXBwb3J0IHFvcyAqLworCQkJLyogTGV0IHRoZSByZWdpc3RlciBzZXR0aW5nIGRlZmF1bHQgd2l0aCBMZWdhY3kgc3RhdGlvbiAqLworCQkJYXNzb2NfcmVzcCA9IChzdHJ1Y3QgcnRsbGliX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICopc2tiLT5kYXRhOworCQkJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5zdXBwb3J0ZWQgPT0gMSkgeworCQkJCWlmIChydGxsaWJfcGFyc2VfaW5mb19wYXJhbShpZWVlLCBhc3NvY19yZXNwLT5pbmZvX2VsZW1lbnQsCisJCQkJCQkJcnhfc3RhdHMtPmxlbiAtIHNpemVvZigqYXNzb2NfcmVzcCksCisJCQkJCQkJbmV0d29yaywgcnhfc3RhdHMpKSB7CisJCQkJCWtmcmVlKG5ldHdvcmspOworCQkJCQlyZXR1cm4gMTsKKwkJCQl9IGVsc2UgeworCQkJCQltZW1jcHkoaWVlZS0+cEhUSW5mby0+UGVlckhUQ2FwQnVmLAorCQkJCQkgICAgICAgbmV0d29yay0+YnNzaHQuYmRIVENhcEJ1ZiwKKwkJCQkJICAgICAgIG5ldHdvcmstPmJzc2h0LmJkSFRDYXBMZW4pOworCQkJCQltZW1jcHkoaWVlZS0+cEhUSW5mby0+UGVlckhUSW5mb0J1ZiwKKwkJCQkJICAgICAgIG5ldHdvcmstPmJzc2h0LmJkSFRJbmZvQnVmLAorCQkJCQkgICAgICAgbmV0d29yay0+YnNzaHQuYmRIVEluZm9MZW4pOworCQkJCX0KKwkJCQlpZiAoaWVlZS0+aGFuZGxlX2Fzc29jX3Jlc3BvbnNlICE9IE5VTEwpCisJCQkJCWllZWUtPmhhbmRsZV9hc3NvY19yZXNwb25zZShpZWVlLT5kZXYsCisJCQkJCQkgKHN0cnVjdCBydGxsaWJfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKiloZWFkZXIsCisJCQkJCQkgbmV0d29yayk7CisJCQkJa2ZyZWUobmV0d29yayk7CisJCQl9CisKKwkJCWtmcmVlKGllZWUtPmFzc29jcmVzcF9pZXMpOworCQkJaWVlZS0+YXNzb2NyZXNwX2llcyA9IE5VTEw7CisJCQlpZXMgPSAmKGFzc29jX3Jlc3AtPmluZm9fZWxlbWVudFswXS5pZCk7CisJCQlpZWVlLT5hc3NvY3Jlc3BfaWVzX2xlbiA9IChza2ItPmRhdGEgKyBza2ItPmxlbikgLSBpZXM7CisJCQlpZWVlLT5hc3NvY3Jlc3BfaWVzID0ga21hbGxvYyhpZWVlLT5hc3NvY3Jlc3BfaWVzX2xlbiwKKwkJCQkJCSAgICAgIEdGUF9BVE9NSUMpOworCQkJaWYgKGllZWUtPmFzc29jcmVzcF9pZXMpCisJCQkJbWVtY3B5KGllZWUtPmFzc29jcmVzcF9pZXMsIGllcywKKwkJCQkgICAgICAgaWVlZS0+YXNzb2NyZXNwX2llc19sZW4pOworCQkJZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMoKVdhcm5pbmc6IGNhbid0IGFsbG9jICIKKwkJCQkgICAgICAgIm1lbW9yeSBmb3IgYXNzb2NyZXNwX2llc1xuIiwgX19mdW5jX18pOworCQkJCWllZWUtPmFzc29jcmVzcF9pZXNfbGVuID0gMDsKKwkJCX0KKwkJCXJ0bGxpYl9hc3NvY2lhdGVfY29tcGxldGUoaWVlZSk7CisJCX0gZWxzZSB7CisJCQkvKiBhaWQgY291bGQgbm90IGJlZW4gYWxsb2NhdGVkICovCisJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2Fzc19lcnIrKzsKKwkJCXByaW50ayhLRVJOX0lORk8gIkFzc29jaWF0aW9uIHJlc3BvbnNlIHN0YXR1cyBjb2RlIDB4JXhcbiIsCisJCQkJZXJyY29kZSk7CisJCQlSVExMSUJfREVCVUdfTUdNVCgKKwkJCQkiQXNzb2NpYXRpb24gcmVzcG9uc2Ugc3RhdHVzIGNvZGUgMHgleFxuIiwKKwkJCQllcnJjb2RlKTsKKwkJCWlmIChpZWVlLT5Bc29jUmV0cnlDb3VudCA8IFJUX0FTT0NfUkVUUllfTElNSVQpCisJCQkJcXVldWVfZGVsYXllZF93b3JrX3JzbChpZWVlLT53cSwKKwkJCQkJICZpZWVlLT5hc3NvY2lhdGVfcHJvY2VkdXJlX3dxLCAwKTsKKwkJCWVsc2UKKwkJCQlydGxsaWJfYXNzb2NpYXRlX2Fib3J0KGllZWUpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitpbmxpbmUgaW50IHJ0bGxpYl9yeF9hdXRoKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICBzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpyeF9zdGF0cykKK3sKKwl1MTYgZXJyY29kZTsKKwl1OCAqY2hhbGxlbmdlOworCWludCBjaGxlbiA9IDA7CisJYm9vbCBiU3VwcG9ydE5tb2RlID0gdHJ1ZSwgYkhhbGZTdXBwb3J0Tm1vZGUgPSBmYWxzZTsKKworCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSkgeworCQlpZiAoaWVlZS0+c3RhdGUgPT0gUlRMTElCX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HICYmCisJCSAgICAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSkgeworCQkJUlRMTElCX0RFQlVHX01HTVQoIlJlY2VpdmVkIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlIik7CisKKwkJCWVycmNvZGUgPSBhdXRoX3BhcnNlKHNrYiwgJmNoYWxsZW5nZSwgJmNobGVuKTsKKwkJCWlmICgwID09IGVycmNvZGUpIHsKKwkJCQlpZiAoaWVlZS0+b3Blbl93ZXAgfHwgIWNoYWxsZW5nZSkgeworCQkJCQlpZWVlLT5zdGF0ZSA9IFJUTExJQl9BU1NPQ0lBVElOR19BVVRIRU5USUNBVEVEOworCQkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2F1dGhfcnNfb2srKzsKKwkJCQkJaWYgKCEoaWVlZS0+cEhUSW5mby0+SU9UQWN0aW9uICYKKwkJCQkJICAgIEhUX0lPVF9BQ1RfUFVSRV9OX01PREUpKSB7CisJCQkJCQlpZiAoIWllZWUtPkdldE5tb2RlU3VwcG9ydEJ5U2VjQ2ZnKGllZWUtPmRldikpIHsKKwkJCQkJCQlpZiAoSXNIVEhhbGZObW9kZUFQcyhpZWVlKSkgeworCQkJCQkJCQliU3VwcG9ydE5tb2RlID0gdHJ1ZTsKKwkJCQkJCQkJYkhhbGZTdXBwb3J0Tm1vZGUgPSB0cnVlOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCWJTdXBwb3J0Tm1vZGUgPSBmYWxzZTsKKwkJCQkJCQkJYkhhbGZTdXBwb3J0Tm1vZGUgPSBmYWxzZTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJLyogRHVtbXkgd2lybGVzcyBtb2RlIHNldHRpbmcgdG8gYXZvaWQKKwkJCQkJICogZW5jcnlwdGlvbiBpc3N1ZSAqLworCQkJCQlpZiAoYlN1cHBvcnRObW9kZSkgeworCQkJCQkJaWVlZS0+U2V0V2lyZWxlc3NNb2RlKGllZWUtPmRldiwKKwkJCQkJCSAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5tb2RlKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8qVE9ETyovCisJCQkJCQlpZWVlLT5TZXRXaXJlbGVzc01vZGUoaWVlZS0+ZGV2LAorCQkJCQkJCQkgICAgICBJRUVFX0cpOworCQkJCQl9CisKKwkJCQkJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5tb2RlID09CisJCQkJCSAgICBJRUVFX05fMjRHICYmCisJCQkJCSAgICBiSGFsZlN1cHBvcnRObW9kZSA9PSB0cnVlKSB7CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICI9PT09PT0+ZW50ZXIgIgorCQkJCQkJICAgICAgICJoYWxmIE4gbW9kZVxuIik7CisJCQkJCQlpZWVlLT5iSGFsZldpcmVsZXNzTjI0R01vZGUgPQorCQkJCQkJCQkJIHRydWU7CisJCQkJCX0gZWxzZQorCQkJCQkJaWVlZS0+YkhhbGZXaXJlbGVzc04yNEdNb2RlID0KKwkJCQkJCQkJCSBmYWxzZTsKKworCQkJCQlydGxsaWJfYXNzb2NpYXRlX3N0ZXAyKGllZWUpOworCQkJCX0gZWxzZSB7CisJCQkJCXJ0bGxpYl9hdXRoX2NoYWxsZW5nZShpZWVlLCBjaGFsbGVuZ2UsCisJCQkJCQkJICAgICAgY2hsZW4pOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hdXRoX3JzX2VycisrOworCQkJCVJUTExJQl9ERUJVR19NR01UKCJBdXRoZW50aWNhdGlvbiByZXNwb3NlIgorCQkJCQkJICAiIHN0YXR1cyBjb2RlIDB4JXgiLCBlcnJjb2RlKTsKKworCQkJCXByaW50ayhLRVJOX0lORk8gIkF1dGhlbnRpY2F0aW9uIHJlc3Bvc2UgIgorCQkJCSAgICAgICAic3RhdHVzIGNvZGUgMHgleCIsIGVycmNvZGUpOworCQkJCXJ0bGxpYl9hc3NvY2lhdGVfYWJvcnQoaWVlZSk7CisJCQl9CisKKwkJfSBlbHNlIGlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7CisJCQlydGxsaWJfcnhfYXV0aF9ycShpZWVlLCBza2IpOworCQl9CisJfQorCXJldHVybiAwOworfQorCitpbmxpbmUgaW50IHJ0bGxpYl9yeF9kZWF1dGgoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgKmhlYWRlciA9IChzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkciAqKSBza2ItPmRhdGE7CisKKwlpZiAobWVtY21wKGhlYWRlci0+YWRkcjMsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pICE9IDApCisJCXJldHVybiAwOworCisJLyogRklYTUUgZm9yIG5vdyByZXBlYXQgYWxsIHRoZSBhc3NvY2lhdGlvbiBwcm9jZWR1cmUKKwkqIGJvdGggZm9yIGRpc2Fzc29jaWF0aW9uIGFuZCBkZWF1dGhlbnRpY2F0aW9uCisJKi8KKwlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKSAmJgorCSAgICBpZWVlLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEICYmCisJICAgIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpKSB7CisJCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PT0+cmVjZWl2ZWQgZGlzYXNzb2MvZGVhdXRoKCV4KSAiCisJCSAgICAgICAiZnJhbWUsIHJlYXNvbiBjb2RlOiV4XG4iLAorCQkgICAgICAgV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpLAorCQkgICAgICAgKChzdHJ1Y3QgcnRsbGliX2Rpc2Fzc29jICopc2tiLT5kYXRhKS0+cmVhc29uKTsKKwkJaWVlZS0+c3RhdGUgPSBSVExMSUJfQVNTT0NJQVRJTkc7CisJCWllZWUtPnNvZnRtYWNfc3RhdHMucmVhc3NvYysrOworCQlpZWVlLT5pc19yb2FtaW5nID0gdHJ1ZTsKKwkJaWVlZS0+TGlua0RldGVjdEluZm8uYkJ1c3lUcmFmZmljID0gZmFsc2U7CisJCXJ0bGxpYl9kaXNhc3NvY2lhdGUoaWVlZSk7CisJCVJlbW92ZVBlZXJUUyhpZWVlLCBoZWFkZXItPmFkZHIyKTsKKwkJaWYgKGllZWUtPkxlZENvbnRyb2xIYW5kbGVyICE9IE5VTEwpCisJCQlpZWVlLT5MZWRDb250cm9sSGFuZGxlcihpZWVlLT5kZXYsCisJCQkJCQlMRURfQ1RMX1NUQVJUX1RPX0xJTkspOworCisJCWlmICghKGllZWUtPnJ0bGxpYl9hcF9zZWNfdHlwZShpZWVlKSAmCisJCSAgICAoU0VDX0FMR19DQ01QfFNFQ19BTEdfVEtJUCkpKQorCQkJcXVldWVfZGVsYXllZF93b3JrX3JzbChpZWVlLT53cSwKKwkJCQkgICAgICAgJmllZWUtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EsIDUpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW5saW5lIGludCBydGxsaWJfcnhfZnJhbWVfc29mdG1hYyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgIHN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKnJ4X3N0YXRzLCB1MTYgdHlwZSwKKwkJCQkgICB1MTYgc3R5cGUpCit7CisJc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgKmhlYWRlciA9IChzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkciAqKSBza2ItPmRhdGE7CisKKwlpZiAoIWllZWUtPnByb3RvX3N0YXJ0ZWQpCisJCXJldHVybiAwOworCisJc3dpdGNoIChXTEFOX0ZDX0dFVF9TVFlQRShoZWFkZXItPmZyYW1lX2N0bCkpIHsKKwljYXNlIFJUTExJQl9TVFlQRV9BU1NPQ19SRVNQOgorCWNhc2UgUlRMTElCX1NUWVBFX1JFQVNTT0NfUkVTUDoKKwkJaWYgKHJ0bGxpYl9yeF9hc3NvY19yZXNwKGllZWUsIHNrYiwgcnhfc3RhdHMpID09IDEpCisJCQlyZXR1cm4gMTsKKwkJYnJlYWs7CisJY2FzZSBSVExMSUJfU1RZUEVfQVNTT0NfUkVROgorCWNhc2UgUlRMTElCX1NUWVBFX1JFQVNTT0NfUkVROgorCQlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKSAmJgorCQkgICAgIGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpCisJCQlydGxsaWJfcnhfYXNzb2NfcnEoaWVlZSwgc2tiKTsKKwkJYnJlYWs7CisJY2FzZSBSVExMSUJfU1RZUEVfQVVUSDoKKwkJcnRsbGliX3J4X2F1dGgoaWVlZSwgc2tiLCByeF9zdGF0cyk7CisJCWJyZWFrOworCWNhc2UgUlRMTElCX1NUWVBFX0RJU0FTU09DOgorCWNhc2UgUlRMTElCX1NUWVBFX0RFQVVUSDoKKwkJcnRsbGliX3J4X2RlYXV0aChpZWVlLCBza2IpOworCQlicmVhazsKKwljYXNlIFJUTExJQl9TVFlQRV9NQU5BR0VfQUNUOgorCQlydGxsaWJfcHJvY2Vzc19hY3Rpb24oaWVlZSwgc2tiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGZvbGxvd2luZyBhcmUgZm9yIGEgc2ltcGxpZXIgVFggcXVldWUgbWFuYWdlbWVudC4KKyAqIEluc3RlYWQgb2YgdXNpbmcgbmV0aWZfW3N0b3Avd2FrZV1fcXVldWUgdGhlIGRyaXZlcgorICogd2lsbCB1c2VzIHRoZXNlIHR3byBmdW5jdGlvbiAocGx1cyBhIHJlc2V0IG9uZSksIHRoYXQKKyAqIHdpbGwgaW50ZXJuYWxseSB1c2VzIHRoZSBrZXJuZWwgbmV0aWZfKiBhbmQgdGFrZXMKKyAqIGNhcmUgb2YgdGhlIGllZWU4MDIuMTEgZnJhZ21lbnRhdGlvbi4KKyAqIFNvIHRoZSBkcml2ZXIgcmVjZWl2ZXMgYSBmcmFnbWVudCBwZXIgdGltZSBhbmQgbWlnaHQKKyAqIGNhbGwgdGhlIHN0b3AgZnVuY3Rpb24gd2hlbiBpdCB3YW50IHdpdGhvdXQgdGFrZSBjYXJlCisgKiB0byBoYXZlIGVub3VnaHQgcm9vbSB0byBUWCBhbiBlbnRpcmUgcGFja2V0LgorICogVGhpcyBtaWdodCBiZSB1c2VmdWwgaWYgZWFjaCBmcmFnbWVudCBuZWVkIGl0J3Mgb3duCisgKiBkZXNjcmlwdG9yLCB0aHVzIGp1c3Qga2VlcCBhIHRvdGFsIGZyZWUgbWVtb3J5ID4gdGhhbgorICogdGhlIG1heCBmcmFnbWVudGF0aW9uIHRyZXNob2xkIGlzIG5vdCBlbm91Z2h0Li4gSWYgdGhlCisgKiBpZWVlODAyLjExIHN0YWNrIHBhc3NlZCBhIFRYQiBzdHJ1Y3QgdGhlbiB5b3UgbmVlZGVkCisgKiB0byBrZWVwIE4gZnJlZSBkZXNjcmlwdG9ycyB3aGVyZQorICogTiA9IE1BWF9QQUNLRVRfU0laRSAvIE1JTl9GUkFHX1RSRVNIT0xECisgKiBJbiB0aGlzIHdheSB5b3UgbmVlZCBqdXN0IG9uZSBhbmQgdGhlIDgwMi4xMSBzdGFjaworICogd2lsbCB0YWtlIGNhcmUgb2YgYnVmZmVyaW5nIGZyYWdtZW50cyBhbmQgcGFzcyB0aGVtIHRvCisgKiB0byB0aGUgZHJpdmVyIGxhdGVyLCB3aGVuIGl0IHdha2VzIHRoZSBxdWV1ZS4KKyAqLwordm9pZCBydGxsaWJfc29mdG1hY194bWl0KHN0cnVjdCBydGxsaWJfdHhiICp0eGIsIHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQoreworCisJdW5zaWduZWQgaW50IHF1ZXVlX2luZGV4ID0gdHhiLT5xdWV1ZV9pbmRleDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCAgaTsKKwlzdHJ1Y3QgY2JfZGVzYyAqdGNiX2Rlc2MgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgcXVldWVfbGVuID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwkvKiBjYWxsZWQgd2l0aCAybmQgcGFybSAwLCBubyB0eCBtZ210IGxvY2sgcmVxdWlyZWQgKi8KKwlydGxsaWJfc3RhX3dha2V1cChpZWVlLCAwKTsKKworCS8qIHVwZGF0ZSB0aGUgdHggc3RhdHVzICovCisJdGNiX2Rlc2MgPSAoc3RydWN0IGNiX2Rlc2MgKikodHhiLT5mcmFnbWVudHNbMF0tPmNiICsKKwkJICAgTUFYX0RFVl9BRERSX1NJWkUpOworCWlmICh0Y2JfZGVzYy0+Yk11bHRpY2FzdCkKKwkJaWVlZS0+c3RhdHMubXVsdGljYXN0Kys7CisKKwkvKiBpZiB4bWl0IGF2YWlsYWJsZSwganVzdCB4bWl0IGl0IGltbWVkaWF0ZWx5LCBlbHNlIGp1c3QgaW5zZXJ0IGl0IHRvCisJICogdGhlIHdhaXQgcXVldWUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdHhiLT5ucl9mcmFnczsgaSsrKSB7CisJCXF1ZXVlX2xlbiA9IHNrYl9xdWV1ZV9sZW4oJmllZWUtPnNrYl93YWl0UVtxdWV1ZV9pbmRleF0pOworCQlpZiAoKHF1ZXVlX2xlbiAgIT0gMCkgfHxcCisJCSAgICAoIWllZWUtPmNoZWNrX25pY19lbm91Z2hfZGVzYyhpZWVlLT5kZXYsIHF1ZXVlX2luZGV4KSkgfHwKKwkJICAgIChpZWVlLT5xdWV1ZV9zdG9wKSkgeworCQkJLyogaW5zZXJ0IHRoZSBza2IgcGFja2V0IHRvIHRoZSB3YWl0IHF1ZXVlICovCisJCQkvKiBhcyBmb3IgdGhlIGNvbXBsZXRpb24gZnVuY3Rpb24sIGl0IGRvZXMgbm90IG5lZWQKKwkJCSAqIHRvIGNoZWNrIGl0IGFueSBtb3JlLgorCQkJICogKi8KKwkJCWlmIChxdWV1ZV9sZW4gPCAyMDApCisJCQkJc2tiX3F1ZXVlX3RhaWwoJmllZWUtPnNrYl93YWl0UVtxdWV1ZV9pbmRleF0sCisJCQkJCSAgICAgICB0eGItPmZyYWdtZW50c1tpXSk7CisJCQllbHNlCisJCQkJa2ZyZWVfc2tiKHR4Yi0+ZnJhZ21lbnRzW2ldKTsKKwkJfSBlbHNlIHsKKwkJCWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQoCisJCQkJCXR4Yi0+ZnJhZ21lbnRzW2ldLAorCQkJCQlpZWVlLT5kZXYsIGllZWUtPnJhdGUpOworCQl9CisJfQorCisJcnRsbGliX3R4Yl9mcmVlKHR4Yik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKK30KKworLyogY2FsbGVkIHdpdGggaWVlZS0+bG9jayBhY3F1aXJlZCAqLworc3RhdGljIHZvaWQgcnRsbGliX3Jlc3VtZV90eChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSBpZWVlLT50eF9wZW5kaW5nLmZyYWc7IGkgPCBpZWVlLT50eF9wZW5kaW5nLnR4Yi0+bnJfZnJhZ3M7CisJICAgICBpKyspIHsKKworCQlpZiAoaWVlZS0+cXVldWVfc3RvcCkgeworCQkJaWVlZS0+dHhfcGVuZGluZy5mcmFnID0gaTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIHsKKworCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCgKKwkJCQlpZWVlLT50eF9wZW5kaW5nLnR4Yi0+ZnJhZ21lbnRzW2ldLAorCQkJCWllZWUtPmRldiwgaWVlZS0+cmF0ZSk7CisJCQlpZWVlLT5zdGF0cy50eF9wYWNrZXRzKys7CisJCX0KKwl9CisKKwlydGxsaWJfdHhiX2ZyZWUoaWVlZS0+dHhfcGVuZGluZy50eGIpOworCWllZWUtPnR4X3BlbmRpbmcudHhiID0gTlVMTDsKK30KKworCit2b2lkIHJ0bGxpYl9yZXNldF9xdWV1ZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwlpbml0X21nbXRfcXVldWUoaWVlZSk7CisJaWYgKGllZWUtPnR4X3BlbmRpbmcudHhiKSB7CisJCXJ0bGxpYl90eGJfZnJlZShpZWVlLT50eF9wZW5kaW5nLnR4Yik7CisJCWllZWUtPnR4X3BlbmRpbmcudHhiID0gTlVMTDsKKwl9CisJaWVlZS0+cXVldWVfc3RvcCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCit9CisKK3ZvaWQgcnRsbGliX3dha2VfcXVldWUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIgICpoZWFkZXI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCWlmICghaWVlZS0+cXVldWVfc3RvcCkKKwkJZ290byBleGl0OworCisJaWVlZS0+cXVldWVfc3RvcCA9IDA7CisKKwlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUpIHsKKwkJd2hpbGUgKCFpZWVlLT5xdWV1ZV9zdG9wICYmIChza2IgPSBkZXF1ZXVlX21nbXQoaWVlZSkpKSB7CisKKwkJCWhlYWRlciA9IChzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkciAgKikgc2tiLT5kYXRhOworCisJCQloZWFkZXItPnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXSA8PCA0KTsKKworCQkJaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQorCQkJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKKwkJCWVsc2UKKwkJCQlpZWVlLT5zZXFfY3RybFswXSsrOworCisJCQlpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KHNrYiwgaWVlZS0+ZGV2LAorCQkJCQkJCSAgIGllZWUtPmJhc2ljX3JhdGUpOworCQl9CisJfQorCWlmICghaWVlZS0+cXVldWVfc3RvcCAmJiBpZWVlLT50eF9wZW5kaW5nLnR4YikKKwkJcnRsbGliX3Jlc3VtZV90eChpZWVlKTsKKworCWlmICghaWVlZS0+cXVldWVfc3RvcCAmJiBuZXRpZl9xdWV1ZV9zdG9wcGVkKGllZWUtPmRldikpIHsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy5zd3R4YXdha2UrKzsKKwkJbmV0aWZfd2FrZV9xdWV1ZShpZWVlLT5kZXYpOworCX0KKworZXhpdDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7Cit9CisKKwordm9pZCBydGxsaWJfc3RvcF9xdWV1ZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKworCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChpZWVlLT5kZXYpKSB7CisJCW5ldGlmX3N0b3BfcXVldWUoaWVlZS0+ZGV2KTsKKwkJaWVlZS0+c29mdG1hY19zdGF0cy5zd3R4c3RvcCsrOworCX0KKwlpZWVlLT5xdWV1ZV9zdG9wID0gMTsKKworfQorCit2b2lkIHJ0bGxpYl9zdG9wX2FsbF9xdWV1ZXMoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGllZWUtPmRldi0+bnVtX3R4X3F1ZXVlczsgaSsrKQorCQluZXRkZXZfZ2V0X3R4X3F1ZXVlKGllZWUtPmRldiwgaSktPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhpZWVlLT5kZXYpOworfQorCit2b2lkIHJ0bGxpYl93YWtlX2FsbF9xdWV1ZXMoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJbmV0aWZfdHhfd2FrZV9hbGxfcXVldWVzKGllZWUtPmRldik7Cit9CisKK2lubGluZSB2b2lkIHJ0bGxpYl9yYW5kb21pemVfY2VsbChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKworCWdldF9yYW5kb21fYnl0ZXMoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CisKKwkvKiBhbiBJQlNTIGNlbGwgYWRkcmVzcyBtdXN0IGhhdmUgdGhlIHR3byBsZXNzIHNpZ25pZmljYW50CisJICogYml0cyBvZiB0aGUgZmlyc3QgYnl0ZSA9IDIKKwkgKi8KKwlpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWRbMF0gJj0gfjB4MDE7CisJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkWzBdIHw9IDB4MDI7Cit9CisKKy8qIGNhbGxlZCBpbiB1c2VyIGNvbnRleHQgb25seSAqLwordm9pZCBydGxsaWJfc3RhcnRfbWFzdGVyX2JzcyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwlpZWVlLT5hc3NvY19pZCA9IDE7CisKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IDApIHsKKwkJc3RybmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwKKwkJCVJUTExJQl9ERUZBVUxUX1RYX0VTU0lELAorCQkJSVdfRVNTSURfTUFYX1NJWkUpOworCisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9CisJCQkJIHN0cmxlbihSVExMSUJfREVGQVVMVF9UWF9FU1NJRCk7CisJCWllZWUtPnNzaWRfc2V0ID0gMTsKKwl9CisKKwltZW1jcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisKKwlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsKTsKKwlpZWVlLT5zdGF0ZSA9IFJUTExJQl9MSU5LRUQ7CisJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKKwlub3RpZnlfd3hfYXNzb2NfZXZlbnQoaWVlZSk7CisKKwlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKKwkJaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZShpZWVlLT5kZXYpOworCisJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOworfQorCitzdGF0aWMgdm9pZCBydGxsaWJfc3RhcnRfbW9uaXRvcl9tb2RlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQoreworCS8qIHJlc2V0IGhhcmR3YXJlIHN0YXR1cyAqLworCWlmIChpZWVlLT5yYXdfdHgpIHsKKwkJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCisJCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUtPmRldik7CisKKwkJbmV0aWZfY2Fycmllcl9vbihpZWVlLT5kZXYpOworCX0KK30KKworc3RhdGljIHZvaWQgcnRsbGliX3N0YXJ0X2lic3Nfd3Eodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZl9kd29ya19yc2woZGF0YSwKKwkJCQkgICAgIHN0cnVjdCBydGxsaWJfZGV2aWNlLCBzdGFydF9pYnNzX3dxKTsKKwkvKiBpd2NvbmZpZyBtb2RlIGFkLWhvYyB3aWxsIHNjaGVkdWxlIHRoaXMgYW5kIHJldHVybgorCSAqIG9uIHRoZSBvdGhlciBoYW5kIHRoaXMgd2lsbCBibG9jayBmdXJ0aGVyIGl3Y29uZmlnIFNFVAorCSAqIG9wZXJhdGlvbnMgYmVjYXVzZSBvZiB0aGUgd3hfc2VtIGhvbGQuCisJICogQW55d2F5IHNvbWUgbW9zdCBzZXQgb3BlcmF0aW9ucyBzZXQgYSBmbGFnIHRvIHNwZWVkLXVwCisJICogKGFib3J0KSB0aGlzIHdxICh3aGVuIHN5bmNybyBzY2FubmluZykgYmVmb3JlIHNsZWVwaW5nCisJICogb24gdGhlIHNlbWFwaG9yZQorCSAqLworCWlmICghaWVlZS0+cHJvdG9fc3RhcnRlZCkgeworCQlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT09b2ggZHJpdmVyIGRvd24gcmV0dXJuXG4iKTsKKwkJcmV0dXJuOworCX0KKwlkb3duKCZpZWVlLT53eF9zZW0pOworCisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9PSAwKSB7CisJCXN0cmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgUlRMTElCX0RFRkFVTFRfVFhfRVNTSUQpOworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPSBzdHJsZW4oUlRMTElCX0RFRkFVTFRfVFhfRVNTSUQpOworCQlpZWVlLT5zc2lkX3NldCA9IDE7CisJfQorCisJaWVlZS0+c3RhdGUgPSBSVExMSUJfTk9MSU5LOworCWllZWUtPm1vZGUgPSBJRUVFX0c7CisJLyogY2hlY2sgaWYgd2UgaGF2ZSB0aGlzIGNlbGwgaW4gb3VyIG5ldHdvcmsgbGlzdCAqLworCXJ0bGxpYl9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKGllZWUpOworCisKKwkvKiBpZiBub3QgdGhlbiB0aGUgc3RhdGUgaXMgbm90IGxpbmtlZC4gTWF5YmUgdGhlIHVzZXIgc3dpdGhjZWQgdG8KKwkgKiBhZC1ob2MgbW9kZSBqdXN0IGFmdGVyIGJlaW5nIGluIG1vbml0b3IgbW9kZSwgb3IganVzdCBhZnRlcgorCSAqIGJlaW5nIHZlcnkgZmV3IHRpbWUgaW4gbWFuYWdlZCBtb2RlIChzbyB0aGUgY2FyZCBoYXZlIGhhZCBubworCSAqIHRpbWUgdG8gc2NhbiBhbGwgdGhlIGNoYW5zLi4pIG9yIHdlIGhhdmUganVzdCBydW4gdXAgdGhlIGlmYWNlCisJICogYWZ0ZXIgc2V0dGluZyBhZC1ob2MgbW9kZS4gU28gd2UgaGF2ZSB0byBnaXZlIGFub3RoZXIgdHJ5Li4KKwkgKiBIZXJlLCBpbiBpYnNzIG1vZGUsIHNob3VsZCBiZSBzYWZlIHRvIGRvIHRoaXMgd2l0aG91dCBleHRyYSBjYXJlCisJICogKGluIGJzcyBtb2RlIHdlIGhhZCB0byBtYWtlIHN1cmUgbm8tb25lIHRyeWVkIHRvIGFzc29jaWF0ZSB3aGVuCisJICogd2UgaGFkIGp1c3QgY2hlY2tlZCB0aGUgaWVlZS0+c3RhdGUgYW5kIHdlIHdhcyBnb2luZyB0byBzdGFydCB0aGUKKwkgKiBzY2FuKSBiZWFjYXVzZSBpbiBpYnNzIG1vZGUgdGhlIHJ0bGxpYl9uZXdfbmV0IGZ1bmN0aW9uLCB3aGVuCisJICogZmluZHMgYSBnb29kIG5ldCwganVzdCBzZXQgdGhlIGllZWUtPnN0YXRlIHRvIFJUTExJQl9MSU5LRUQsCisJICogc28sIGF0IHdvcnN0LCB3ZSB3YXN0ZSBhIGJpdCBvZiB0aW1lIHRvIGluaXRpYXRlIGFuIHVubmVlZGVkIHN5bmNybworCSAqIHNjYW4sIHRoYXQgd2lsbCBzdG9wIGF0IHRoZSBmaXJzdCByb3VuZCBiZWNhdXNlIGl0IHNlZXMgdGhlIHN0YXRlCisJICogYXNzb2NpYXRlZC4KKwkgKi8KKwlpZiAoaWVlZS0+c3RhdGUgPT0gUlRMTElCX05PTElOSykKKwkJcnRsbGliX3N0YXJ0X3NjYW5fc3luY3JvKGllZWUsIDApOworCisJLyogdGhlIG5ldHdvcmsgZGVmaW5pdGl2ZWx5IGlzIG5vdCBoZXJlLi4gY3JlYXRlIGEgbmV3IGNlbGwgKi8KKwlpZiAoaWVlZS0+c3RhdGUgPT0gUlRMTElCX05PTElOSykgeworCQlwcmludGsoS0VSTl9JTkZPICJjcmVhdGluZyBuZXcgSUJTUyBjZWxsXG4iKTsKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPSBpZWVlLT5JYnNzU3RhcnRDaG5sOworCQlpZiAoIWllZWUtPndhcF9zZXQpCisJCQlydGxsaWJfcmFuZG9taXplX2NlbGwoaWVlZSk7CisKKwkJaWYgKGllZWUtPm1vZHVsYXRpb24gJiBSVExMSUJfQ0NLX01PRFVMQVRJT04pIHsKKworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2xlbiA9IDQ7CisKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc1swXSA9CisJCQkJIFJUTExJQl9CQVNJQ19SQVRFX01BU0sgfCBSVExMSUJfQ0NLX1JBVEVfMU1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzWzFdID0KKwkJCQkgUlRMTElCX0JBU0lDX1JBVEVfTUFTSyB8IFJUTExJQl9DQ0tfUkFURV8yTUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNbMl0gPQorCQkJCSBSVExMSUJfQkFTSUNfUkFURV9NQVNLIHwgUlRMTElCX0NDS19SQVRFXzVNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc1szXSA9CisJCQkJIFJUTExJQl9CQVNJQ19SQVRFX01BU0sgfCBSVExMSUJfQ0NLX1JBVEVfMTFNQjsKKworCQl9IGVsc2UKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19sZW4gPSAwOworCisJCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgUlRMTElCX09GRE1fTU9EVUxBVElPTikgeworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4X2xlbiA9IDg7CisKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFswXSA9CisJCQkJCQkgUlRMTElCX09GRE1fUkFURV82TUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbMV0gPQorCQkJCQkJIFJUTExJQl9PRkRNX1JBVEVfOU1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzJdID0KKwkJCQkJCSBSVExMSUJfT0ZETV9SQVRFXzEyTUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbM10gPQorCQkJCQkJIFJUTExJQl9PRkRNX1JBVEVfMThNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFs0XSA9CisJCQkJCQkgUlRMTElCX09GRE1fUkFURV8yNE1COworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4WzVdID0KKwkJCQkJCSBSVExMSUJfT0ZETV9SQVRFXzM2TUI7CisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucmF0ZXNfZXhbNl0gPQorCQkJCQkJIFJUTExJQl9PRkRNX1JBVEVfNDhNQjsKKwkJCWllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leFs3XSA9CisJCQkJCQkgUlRMTElCX09GRE1fUkFURV81NE1COworCisJCQlpZWVlLT5yYXRlID0gMTA4OworCQl9IGVsc2UgeworCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnJhdGVzX2V4X2xlbiA9IDA7CisJCQlpZWVlLT5yYXRlID0gMjI7CisJCX0KKworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuc3VwcG9ydGVkID0gMDsKKwkJaWVlZS0+U2V0V2lyZWxlc3NNb2RlKGllZWUtPmRldiwgSUVFRV9HKTsKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPSBpZWVlLT5tb2RlOworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuYXRpbV93aW5kb3cgPSAwOworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2FwYWJpbGl0eSA9IFdMQU5fQ0FQQUJJTElUWV9JQlNTOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIiVzKCk6IGllZWUtPm1vZGUgPSAlZFxuIiwgX19mdW5jX18sIGllZWUtPm1vZGUpOworCWlmICgoaWVlZS0+bW9kZSA9PSBJRUVFX05fMjRHKSB8fCAoaWVlZS0+bW9kZSA9PSBJRUVFX05fNUcpKQorCQlIVFVzZURlZmF1bHRTZXR0aW5nKGllZWUpOworCWVsc2UKKwkJaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPSBmYWxzZTsKKworCWllZWUtPlNldEh3UmVnSGFuZGxlcihpZWVlLT5kZXYsIEhXX1ZBUl9NRURJQV9TVEFUVVMsCisJCQkgICAgICAodTggKikoJmllZWUtPnN0YXRlKSk7CisKKwlpZWVlLT5zdGF0ZSA9IFJUTExJQl9MSU5LRUQ7CisJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKKworCUhUU2V0Q29ubmVjdEJ3TW9kZShpZWVlLCBIVF9DSEFOTkVMX1dJRFRIXzIwLCBIVF9FWFRDSE5MX09GRlNFVF9OT19FWFQpOworCWlmIChpZWVlLT5MZWRDb250cm9sSGFuZGxlciAhPSBOVUxMKQorCQlpZWVlLT5MZWRDb250cm9sSGFuZGxlcihpZWVlLT5kZXYsIExFRF9DVExfTElOSyk7CisKKwlydGxsaWJfc3RhcnRfc2VuZF9iZWFjb25zKGllZWUpOworCisJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOworCisJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCisJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKKworCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKKworCXVwKCZpZWVlLT53eF9zZW0pOworfQorCitpbmxpbmUgdm9pZCBydGxsaWJfc3RhcnRfaWJzcyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwlxdWV1ZV9kZWxheWVkX3dvcmtfcnNsKGllZWUtPndxLCAmaWVlZS0+c3RhcnRfaWJzc193cSwgTVNFQ1MoMTUwKSk7Cit9CisKKy8qIHRoaXMgaXMgY2FsbGVkIG9ubHkgaW4gdXNlciBjb250ZXh0LCB3aXRoIHd4X3NlbSBoZWxkICovCit2b2lkIHJ0bGxpYl9zdGFydF9ic3Moc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpZiAoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSAmJiAhSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkgeworCQlpZiAoIWllZWUtPmJHbG9iYWxEb21haW4pCisJCQlyZXR1cm47CisJfQorCS8qIGNoZWNrIGlmIHdlIGhhdmUgYWxyZWFkeSBmb3VuZCB0aGUgbmV0IHdlCisJICogYXJlIGludGVyZXN0ZWQgaW4gKGlmIGFueSkuCisJICogaWYgbm90ICh3ZSBhcmUgZGlzYXNzb2NpYXRlZCBhbmQgd2UgYXJlIG5vdAorCSAqIGluIGFzc29jaWF0aW5nIC8gYXV0aGVudGljYXRpbmcgcGhhc2UpIHN0YXJ0IHRoZSBiYWNrZ3JvdW5kIHNjYW5uaW5nLgorCSAqLworCXJ0bGxpYl9zb2Z0bWFjX2NoZWNrX2FsbF9uZXRzKGllZWUpOworCisJLyogZW5zdXJlIG5vLW9uZSBzdGFydCBhbiBhc3NvY2lhdGluZyBwcm9jZXNzICh0aHVzIHNldHRpbmcKKwkgKiB0aGUgaWVlZS0+c3RhdGUgdG8gcnRsbGliX0FTU09DSUFUSU5HKSB3aGlsZSB3ZQorCSAqIGhhdmUganVzdCBjaGVrZWQgaXQgYW5kIHdlIGFyZSBnb2luZyB0byBlbmFibGUgc2Nhbi4KKwkgKiBUaGUgcnRsbGliX25ld19uZXQgZnVuY3Rpb24gaXMgYWx3YXlzIGNhbGxlZCB3aXRoCisJICogbG9jayBoZWxkIChmcm9tIGJvdGggcnRsbGliX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMgYW5kCisJICogdGhlIHJ4IHBhdGgpLCBzbyB3ZSBjYW5ub3QgYmUgaW4gdGhlIG1pZGRsZSBvZiBzdWNoIGZ1bmN0aW9uCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmIChpZWVlLT5zdGF0ZSA9PSBSVExMSUJfTk9MSU5LKQorCQlydGxsaWJfc3RhcnRfc2NhbihpZWVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0bGxpYl9saW5rX2NoYW5nZV93cSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mX2R3b3JrX3JzbChkYXRhLAorCQkJCSAgICAgc3RydWN0IHJ0bGxpYl9kZXZpY2UsIGxpbmtfY2hhbmdlX3dxKTsKKwlpZWVlLT5saW5rX2NoYW5nZShpZWVlLT5kZXYpOworfQorLyogY2FsbGVkIG9ubHkgaW4gdXNlcnNwYWNlIGNvbnRleHQgKi8KK3ZvaWQgcnRsbGliX2Rpc2Fzc29jaWF0ZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwluZXRpZl9jYXJyaWVyX29mZihpZWVlLT5kZXYpOworCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFKQorCQkJcnRsbGliX3Jlc2V0X3F1ZXVlKGllZWUpOworCisJaWYgKGllZWUtPmRhdGFfaGFyZF9zdG9wKQorCQkJaWVlZS0+ZGF0YV9oYXJkX3N0b3AoaWVlZS0+ZGV2KTsKKwlpZiAoSVNfRE9UMTFEX0VOQUJMRShpZWVlKSkKKwkJRG90MTFkX1Jlc2V0KGllZWUpOworCWllZWUtPnN0YXRlID0gUlRMTElCX05PTElOSzsKKwlpZWVlLT5pc19zZXRfa2V5ID0gZmFsc2U7CisJaWVlZS0+d2FwX3NldCA9IDA7CisKKwlxdWV1ZV9kZWxheWVkX3dvcmtfcnNsKGllZWUtPndxLCAmaWVlZS0+bGlua19jaGFuZ2Vfd3EsIDApOworCisJbm90aWZ5X3d4X2Fzc29jX2V2ZW50KGllZWUpOworfQorCitzdGF0aWMgdm9pZCBydGxsaWJfYXNzb2NpYXRlX3JldHJ5X3dxKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUgPSBjb250YWluZXJfb2ZfZHdvcmtfcnNsKGRhdGEsCisJCQkJICAgICBzdHJ1Y3QgcnRsbGliX2RldmljZSwgYXNzb2NpYXRlX3JldHJ5X3dxKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKwlpZiAoIWllZWUtPnByb3RvX3N0YXJ0ZWQpCisJCWdvdG8gZXhpdDsKKworCWlmIChpZWVlLT5zdGF0ZSAhPSBSVExMSUJfQVNTT0NJQVRJTkdfUkVUUlkpCisJCWdvdG8gZXhpdDsKKworCS8qIHVudGlsIHdlIGRvIG5vdCBzZXQgdGhlIHN0YXRlIHRvIFJUTExJQl9OT0xJTksKKwkqIHRoZXJlIGFyZSBubyBwb3NzaWJpbGl0eSB0byBoYXZlIHNvbWVvbmUgZWxzZSB0cnlpbmcKKwkqIHRvIHN0YXJ0IGFuIGFzc29jaWF0aW9uIHByb2NkdXJlICh3ZSBnZXQgaGVyZSB3aXRoCisJKiBpZWVlLT5zdGF0ZSA9IFJUTExJQl9BU1NPQ0lBVElORykuCisJKiBXaGVuIHdlIHNldCB0aGUgc3RhdGUgdG8gUlRMTElCX05PTElOSyBpdCBpcyBwb3NzaWJsZQorCSogdGhhdCB0aGUgUlggcGF0aCBydW4gYW4gYXR0ZW1wdCB0byBhc3NvY2lhdGUsIGJ1dAorCSogYm90aCBydGxsaWJfc29mdG1hY19jaGVja19hbGxfbmV0cyBhbmQgdGhlCisJKiBSWCBwYXRoIHdvcmtzIHdpdGggaWVlZS0+bG9jayBoZWxkIHNvIHRoZXJlIGFyZSBubworCSogcHJvYmxlbXMuIElmIHdlIGFyZSBzdGlsbCBkaXNhc3NvY2lhdGVkIHRoZW4gc3RhcnQgYSBzY2FuLgorCSogdGhlIGxvY2sgaGVyZSBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIG5vIG9uZSB0cnkgdG8gc3RhcnQKKwkqIGFuIGFzc29jaWF0aW9uIHByb2NlZHVyZSB3aGVuIHdlIGhhdmUganVzdCBjaGVja2VkIHRoZQorCSogc3RhdGUgYW5kIHdlIGFyZSBnb2luZyB0byBzdGFydCB0aGUgc2Nhbi4KKwkqLworCWllZWUtPmJlaW5yZXRyeSA9IHRydWU7CisJaWVlZS0+c3RhdGUgPSBSVExMSUJfTk9MSU5LOworCisJcnRsbGliX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMoaWVlZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYgKGllZWUtPnN0YXRlID09IFJUTExJQl9OT0xJTkspCisJCXJ0bGxpYl9zdGFydF9zY2FuKGllZWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWllZWUtPmJlaW5yZXRyeSA9IGZhbHNlOworZXhpdDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKK30KKworc3RydWN0IHNrX2J1ZmYgKnJ0bGxpYl9nZXRfYmVhY29uXyhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwl1OCBicm9hZGNhc3RfYWRkcltdID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworCisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgcnRsbGliX3Byb2JlX3Jlc3BvbnNlICpiOworCXNrYiA9IHJ0bGxpYl9wcm9iZV9yZXNwKGllZWUsIGJyb2FkY2FzdF9hZGRyKTsKKworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCWIgPSAoc3RydWN0IHJ0bGxpYl9wcm9iZV9yZXNwb25zZSAqKSBza2ItPmRhdGE7CisJYi0+aGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KFJUTExJQl9TVFlQRV9CRUFDT04pOworCisJcmV0dXJuIHNrYjsKKworfQorCitzdHJ1Y3Qgc2tfYnVmZiAqcnRsbGliX2dldF9iZWFjb24oc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgcnRsbGliX3Byb2JlX3Jlc3BvbnNlICpiOworCisJc2tiID0gcnRsbGliX2dldF9iZWFjb25fKGllZWUpOworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCWIgPSAoc3RydWN0IHJ0bGxpYl9wcm9iZV9yZXNwb25zZSAqKSBza2ItPmRhdGE7CisJYi0+aGVhZGVyLnNlcV9jdGwgPSBjcHVfdG9fbGUxNihpZWVlLT5zZXFfY3RybFswXSA8PCA0KTsKKworCWlmIChpZWVlLT5zZXFfY3RybFswXSA9PSAweEZGRikKKwkJaWVlZS0+c2VxX2N0cmxbMF0gPSAwOworCWVsc2UKKwkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKworCXJldHVybiBza2I7Cit9CisKK3ZvaWQgcnRsbGliX3NvZnRtYWNfc3RvcF9wcm90b2NvbChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggbWVzaF9mbGFnLAorCQkJCSAgdTggc2h1dGRvd24pCit7CisJcnRsbGliX3N0b3Bfc2Nhbl9zeW5jcm8oaWVlZSk7CisJZG93bigmaWVlZS0+d3hfc2VtKTsKKwlydGxsaWJfc3RvcF9wcm90b2NvbChpZWVlLCBzaHV0ZG93bik7CisJdXAoJmllZWUtPnd4X3NlbSk7Cit9CisKKwordm9pZCBydGxsaWJfc3RvcF9wcm90b2NvbChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggc2h1dGRvd24pCit7CisJaWYgKCFpZWVlLT5wcm90b19zdGFydGVkKQorCQlyZXR1cm47CisKKwlpZiAoc2h1dGRvd24pIHsKKwkJaWVlZS0+cHJvdG9fc3RhcnRlZCA9IDA7CisJCWllZWUtPnByb3RvX3N0b3BwcGluZyA9IDE7CisJCWlmIChpZWVlLT5ydGxsaWJfaXBzX2xlYXZlICE9IE5VTEwpCisJCQlpZWVlLT5ydGxsaWJfaXBzX2xlYXZlKGllZWUtPmRldik7CisJfQorCisJcnRsbGliX3N0b3Bfc2VuZF9iZWFjb25zKGllZWUpOworCWRlbF90aW1lcl9zeW5jKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmllZWUtPmFzc29jaWF0ZV9yZXRyeV93cSk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+c3RhcnRfaWJzc193cSk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+bGlua19jaGFuZ2Vfd3EpOworCXJ0bGxpYl9zdG9wX3NjYW4oaWVlZSk7CisKKwlpZiAoaWVlZS0+c3RhdGUgPD0gUlRMTElCX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FURUQpCisJCWllZWUtPnN0YXRlID0gUlRMTElCX05PTElOSzsKKworCWlmIChpZWVlLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEKSB7CisJCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpCisJCQlTZW5kRGlzYXNzb2NpYXRpb24oaWVlZSwgMSwgZGVhdXRoX2x2X3NzKTsKKwkJcnRsbGliX2Rpc2Fzc29jaWF0ZShpZWVlKTsKKwl9CisKKwlpZiAoc2h1dGRvd24pIHsKKwkJUmVtb3ZlQWxsVFMoaWVlZSk7CisJCWllZWUtPnByb3RvX3N0b3BwcGluZyA9IDA7CisJfQorCWtmcmVlKGllZWUtPmFzc29jcmVxX2llcyk7CisJaWVlZS0+YXNzb2NyZXFfaWVzID0gTlVMTDsKKwlpZWVlLT5hc3NvY3JlcV9pZXNfbGVuID0gMDsKKwlrZnJlZShpZWVlLT5hc3NvY3Jlc3BfaWVzKTsKKwlpZWVlLT5hc3NvY3Jlc3BfaWVzID0gTlVMTDsKKwlpZWVlLT5hc3NvY3Jlc3BfaWVzX2xlbiA9IDA7Cit9CisKK3ZvaWQgcnRsbGliX3NvZnRtYWNfc3RhcnRfcHJvdG9jb2woc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHU4IG1lc2hfZmxhZykKK3sKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCXJ0bGxpYl9zdGFydF9wcm90b2NvbChpZWVlKTsKKwl1cCgmaWVlZS0+d3hfc2VtKTsKK30KKwordm9pZCBydGxsaWJfc3RhcnRfcHJvdG9jb2woc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJc2hvcnQgY2ggPSAwOworCWludCBpID0gMDsKKworCXJ0bGxpYl91cGRhdGVfYWN0aXZlX2NoYW5fbWFwKGllZWUpOworCisJaWYgKGllZWUtPnByb3RvX3N0YXJ0ZWQpCisJCXJldHVybjsKKworCWllZWUtPnByb3RvX3N0YXJ0ZWQgPSAxOworCisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID09IDApIHsKKwkJZG8geworCQkJY2grKzsKKwkJCWlmIChjaCA+IE1BWF9DSEFOTkVMX05VTUJFUikKKwkJCQlyZXR1cm47IC8qIG5vIGNoYW5uZWwgZm91bmQgKi8KKwkJfSB3aGlsZSAoIWllZWUtPmFjdGl2ZV9jaGFubmVsX21hcFtjaF0pOworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9IGNoOworCX0KKworCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsID09IDApCisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgPSAxMDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTc7IGkrKykgeworCQlpZWVlLT5sYXN0X3J4c2VxX251bVtpXSA9IC0xOworCQlpZWVlLT5sYXN0X3J4ZnJhZ19udW1baV0gPSAtMTsKKwkJaWVlZS0+bGFzdF9wYWNrZXRfdGltZVtpXSA9IDA7CisJfQorCisJaWYgKGllZWUtPlVwZGF0ZUJlYWNvbkludGVycnVwdEhhbmRsZXIpCisJCWllZWUtPlVwZGF0ZUJlYWNvbkludGVycnVwdEhhbmRsZXIoaWVlZS0+ZGV2LCBmYWxzZSk7CisKKwlpZWVlLT53bW1fYWNtID0gMDsKKwkvKiBpZiB0aGUgdXNlciBzZXQgdGhlIE1BQyBvZiB0aGUgYWQtaG9jIGNlbGwgYW5kIHRoZW4KKwkgKiBzd2l0Y2ggdG8gbWFuYWdlZCBtb2RlLCBzaGFsbCB3ZSAgbWFrZSBzdXJlIHRoYXQgYXNzb2NpYXRpb24KKwkgKiBhdHRlbXB0cyBkb2VzIG5vdCBmYWlsIGp1c3QgYmVjYXVzZSB0aGUgdXNlciBwcm92aWRlIHRoZSBlc3NpZAorCSAqIGFuZCB0aGUgbmljIGlzIHN0aWxsIGNoZWNraW5nIGZvciB0aGUgQVAgTUFDID8/CisJICovCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgeworCQlydGxsaWJfc3RhcnRfYnNzKGllZWUpOworCX0gZWxzZSBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7CisJCWlmIChpZWVlLT5VcGRhdGVCZWFjb25JbnRlcnJ1cHRIYW5kbGVyKQorCQkJaWVlZS0+VXBkYXRlQmVhY29uSW50ZXJydXB0SGFuZGxlcihpZWVlLT5kZXYsIHRydWUpOworCisJCXJ0bGxpYl9zdGFydF9pYnNzKGllZWUpOworCisJfSBlbHNlIGlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7CisJCXJ0bGxpYl9zdGFydF9tYXN0ZXJfYnNzKGllZWUpOworCX0gZWxzZSBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpIHsKKwkJcnRsbGliX3N0YXJ0X21vbml0b3JfbW9kZShpZWVlKTsKKwl9Cit9CisKK3ZvaWQgcnRsbGliX3NvZnRtYWNfaW5pdChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwlpbnQgaTsKKwltZW1zZXQoJmllZWUtPmN1cnJlbnRfbmV0d29yaywgMCwgc2l6ZW9mKHN0cnVjdCBydGxsaWJfbmV0d29yaykpOworCisJaWVlZS0+c3RhdGUgPSBSVExMSUJfTk9MSU5LOworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCWllZWUtPnNlcV9jdHJsW2ldID0gMDsKKwlpZWVlLT5wRG90MTFkSW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9kb3QxMWRfaW5mbyksIEdGUF9BVE9NSUMpOworCWlmICghaWVlZS0+cERvdDExZEluZm8pCisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiY2FuJ3QgYWxsb2MgbWVtb3J5IGZvciBET1QxMURcbiIpOworCW1lbXNldChpZWVlLT5wRG90MTFkSW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBydF9kb3QxMWRfaW5mbykpOworCWllZWUtPkxpbmtEZXRlY3RJbmZvLlNsb3RJbmRleCA9IDA7CisJaWVlZS0+TGlua0RldGVjdEluZm8uU2xvdE51bSA9IDI7CisJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkJjbkluUGVyaW9kID0gMDsKKwlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2RGF0YUluUGVyaW9kID0gMDsKKwlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1UeE9rSW5QZXJpb2QgPSAwOworCWllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJ4T2tJblBlcmlvZCA9IDA7CisJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUnhVbmljYXN0T2tJblBlcmlvZCA9IDA7CisJaWVlZS0+YklzQWdncmVnYXRlRnJhbWUgPSBmYWxzZTsKKwlpZWVlLT5hc3NvY19pZCA9IDA7CisJaWVlZS0+cXVldWVfc3RvcCA9IDA7CisJaWVlZS0+c2Nhbm5pbmdfY29udGludWUgPSAwOworCWllZWUtPnNvZnRtYWNfZmVhdHVyZXMgPSAwOworCWllZWUtPndhcF9zZXQgPSAwOworCWllZWUtPnNzaWRfc2V0ID0gMDsKKwlpZWVlLT5wcm90b19zdGFydGVkID0gMDsKKwlpZWVlLT5wcm90b19zdG9wcHBpbmcgPSAwOworCWllZWUtPmJhc2ljX3JhdGUgPSBSVExMSUJfREVGQVVMVF9CQVNJQ19SQVRFOworCWllZWUtPnJhdGUgPSAyMjsKKwlpZWVlLT5wcyA9IFJUTExJQl9QU19ESVNBQkxFRDsKKwlpZWVlLT5zdGFfc2xlZXAgPSBMUFNfSVNfV0FLRTsKKworCWllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXRbMF0gPSAweGZmOworCWllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXRbMV0gPSAweGZmOworCWllZWUtPlJlZ2RvdDExSFRPcGVyYXRpb25hbFJhdGVTZXRbNF0gPSAweDAxOworCisJaWVlZS0+UmVnZG90MTFUeEhUT3BlcmF0aW9uYWxSYXRlU2V0WzBdID0gMHhmZjsKKwlpZWVlLT5SZWdkb3QxMVR4SFRPcGVyYXRpb25hbFJhdGVTZXRbMV0gPSAweGZmOworCWllZWUtPlJlZ2RvdDExVHhIVE9wZXJhdGlvbmFsUmF0ZVNldFs0XSA9IDB4MDE7CisKKwlpZWVlLT5GaXJzdEllX0luU2NhbiA9IGZhbHNlOworCWllZWUtPmFjdHNjYW5uaW5nID0gZmFsc2U7CisJaWVlZS0+YmVpbnJldHJ5ID0gZmFsc2U7CisJaWVlZS0+aXNfc2V0X2tleSA9IGZhbHNlOworCWluaXRfbWdtdF9xdWV1ZShpZWVlKTsKKworCWllZWUtPnN0YV9lZGNhX3BhcmFtWzBdID0gMHgwMDAwQTQwMzsKKwlpZWVlLT5zdGFfZWRjYV9wYXJhbVsxXSA9IDB4MDAwMEE0Mjc7CisJaWVlZS0+c3RhX2VkY2FfcGFyYW1bMl0gPSAweDAwNUU0MzQyOworCWllZWUtPnN0YV9lZGNhX3BhcmFtWzNdID0gMHgwMDJGMzI2MjsKKwlpZWVlLT5hZ2dyZWdhdGlvbiA9IHRydWU7CisJaWVlZS0+ZW5hYmxlX3J4X2ltbV9CQSA9IDE7CisJaWVlZS0+dHhfcGVuZGluZy50eGIgPSBOVUxMOworCisJX3NldHVwX3RpbWVyKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIsCisJCSAgICBydGxsaWJfYXNzb2NpYXRlX2Fib3J0X2NiLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpIGllZWUpOworCisJX3NldHVwX3RpbWVyKCZpZWVlLT5iZWFjb25fdGltZXIsCisJCSAgICBydGxsaWJfc2VuZF9iZWFjb25fY2IsCisJCSAgICAodW5zaWduZWQgbG9uZykgaWVlZSk7CisKKworCWllZWUtPndxID0gY3JlYXRlX3dvcmtxdWV1ZShEUlZfTkFNRSk7CisKKwlJTklUX0RFTEFZRURfV09SS19SU0woJmllZWUtPmxpbmtfY2hhbmdlX3dxLAorCQkJICAgICAgKHZvaWQgKilydGxsaWJfbGlua19jaGFuZ2Vfd3EsIGllZWUpOworCUlOSVRfREVMQVlFRF9XT1JLX1JTTCgmaWVlZS0+c3RhcnRfaWJzc193cSwKKwkJCSAgICAgICh2b2lkICopcnRsbGliX3N0YXJ0X2lic3Nfd3EsIGllZWUpOworCUlOSVRfV09SS19SU0woJmllZWUtPmFzc29jaWF0ZV9jb21wbGV0ZV93cSwKKwkJICAgICAgKHZvaWQgKilydGxsaWJfYXNzb2NpYXRlX2NvbXBsZXRlX3dxLCBpZWVlKTsKKwlJTklUX0RFTEFZRURfV09SS19SU0woJmllZWUtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EsCisJCQkgICAgICAodm9pZCAqKXJ0bGxpYl9hc3NvY2lhdGVfcHJvY2VkdXJlX3dxLCBpZWVlKTsKKwlJTklUX0RFTEFZRURfV09SS19SU0woJmllZWUtPnNvZnRtYWNfc2Nhbl93cSwKKwkJCSAgICAgICh2b2lkICopcnRsbGliX3NvZnRtYWNfc2Nhbl93cSwgaWVlZSk7CisJSU5JVF9ERUxBWUVEX1dPUktfUlNMKCZpZWVlLT5zb2Z0bWFjX2hpbnQxMWRfd3EsCisJCQkgICAgICAodm9pZCAqKXJ0bGxpYl9zb2Z0bWFjX2hpbnQxMWRfd3EsIGllZWUpOworCUlOSVRfREVMQVlFRF9XT1JLX1JTTCgmaWVlZS0+YXNzb2NpYXRlX3JldHJ5X3dxLAorCQkJICAgICAgKHZvaWQgKilydGxsaWJfYXNzb2NpYXRlX3JldHJ5X3dxLCBpZWVlKTsKKwlJTklUX1dPUktfUlNMKCZpZWVlLT53eF9zeW5jX3NjYW5fd3EsICh2b2lkICopcnRsbGliX3d4X3N5bmNfc2Nhbl93cSwKKwkJICAgICAgaWVlZSk7CisKKwlzZW1hX2luaXQoJmllZWUtPnd4X3NlbSwgMSk7CisJc2VtYV9pbml0KCZpZWVlLT5zY2FuX3NlbSwgMSk7CisJc2VtYV9pbml0KCZpZWVlLT5pcHNfc2VtLCAxKTsKKworCXNwaW5fbG9ja19pbml0KCZpZWVlLT5tZ210X3R4X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZpZWVlLT5iZWFjb25fbG9jayk7CisKKwl0YXNrbGV0X2luaXQoJmllZWUtPnBzX3Rhc2ssCisJICAgICAodm9pZCgqKSh1bnNpZ25lZCBsb25nKSkgcnRsbGliX3N0YV9wcywKKwkgICAgICh1bnNpZ25lZCBsb25nKWllZWUpOworCit9CisKK3ZvaWQgcnRsbGliX3NvZnRtYWNfZnJlZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKK3sKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCWtmcmVlKGllZWUtPnBEb3QxMWRJbmZvKTsKKwlpZWVlLT5wRG90MTFkSW5mbyA9IE5VTEw7CisJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CisKKwljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EpOworCWRlc3Ryb3lfd29ya3F1ZXVlKGllZWUtPndxKTsKKwl1cCgmaWVlZS0+d3hfc2VtKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdGFydCBvZiBXUEEgY29kZS4JCQkJICAgICAgICAqCisgKiB0aGlzIGlzIHN0b2xlbiBmcm9tIHRoZSBpcHcyMjAwIGRyaXZlcgkgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdGF0aWMgaW50IHJ0bGxpYl93cGFfZW5hYmxlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBpbnQgdmFsdWUpCit7CisJLyogVGhpcyBpcyBjYWxsZWQgd2hlbiB3cGFfc3VwcGxpY2FudCBsb2FkcyBhbmQgY2xvc2VzIHRoZSBkcml2ZXIKKwkgKiBpbnRlcmZhY2UuICovCisJcHJpbnRrKEtFUk5fSU5GTyAiJXMgV1BBXG4iLCB2YWx1ZSA/ICJlbmFibGluZyIgOiAiZGlzYWJsaW5nIik7CisJaWVlZS0+d3BhX2VuYWJsZWQgPSB2YWx1ZTsKKwltZW1zZXQoaWVlZS0+YXBfbWFjX2FkZHIsIDAsIDYpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHJ0bGxpYl93cGFfYXNzb2NfZnJhbWUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIGNoYXIgKndwYV9pZSwKKwkJCQkgICBpbnQgd3BhX2llX2xlbikKK3sKKwkvKiBtYWtlIHN1cmUgV1BBIGlzIGVuYWJsZWQgKi8KKwlydGxsaWJfd3BhX2VuYWJsZShpZWVlLCAxKTsKKworCXJ0bGxpYl9kaXNhc3NvY2lhdGUoaWVlZSk7Cit9CisKKworc3RhdGljIGludCBydGxsaWJfd3BhX21sbWUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIGludCBjb21tYW5kLCBpbnQgcmVhc29uKQoreworCisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGNvbW1hbmQpIHsKKwljYXNlIElFRUVfTUxNRV9TVEFfREVBVVRIOgorCQlicmVhazsKKworCWNhc2UgSUVFRV9NTE1FX1NUQV9ESVNBU1NPQzoKKwkJcnRsbGliX2Rpc2Fzc29jaWF0ZShpZWVlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPICJVbmtub3duIE1MTUUgcmVxdWVzdDogJWRcbiIsIGNvbW1hbmQpOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgcnRsbGliX3dwYV9zZXRfd3BhX2llKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJICAgICAgc3RydWN0IGllZWVfcGFyYW0gKnBhcmFtLCBpbnQgcGxlbikKK3sKKwl1OCAqYnVmOworCisJaWYgKHBhcmFtLT51LndwYV9pZS5sZW4gPiBNQVhfV1BBX0lFX0xFTiB8fAorCSAgICAocGFyYW0tPnUud3BhX2llLmxlbiAmJiBwYXJhbS0+dS53cGFfaWUuZGF0YSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocGFyYW0tPnUud3BhX2llLmxlbikgeworCQlidWYgPSBrbWFsbG9jKHBhcmFtLT51LndwYV9pZS5sZW4sIEdGUF9LRVJORUwpOworCQlpZiAoYnVmID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQltZW1jcHkoYnVmLCBwYXJhbS0+dS53cGFfaWUuZGF0YSwgcGFyYW0tPnUud3BhX2llLmxlbik7CisJCWtmcmVlKGllZWUtPndwYV9pZSk7CisJCWllZWUtPndwYV9pZSA9IGJ1ZjsKKwkJaWVlZS0+d3BhX2llX2xlbiA9IHBhcmFtLT51LndwYV9pZS5sZW47CisJfSBlbHNlIHsKKwkJa2ZyZWUoaWVlZS0+d3BhX2llKTsKKwkJaWVlZS0+d3BhX2llID0gTlVMTDsKKwkJaWVlZS0+d3BhX2llX2xlbiA9IDA7CisJfQorCisJcnRsbGliX3dwYV9hc3NvY19mcmFtZShpZWVlLCBpZWVlLT53cGFfaWUsIGllZWUtPndwYV9pZV9sZW4pOworCXJldHVybiAwOworfQorCisjZGVmaW5lIEFVVEhfQUxHX09QRU5fU1lTVEVNCQkJMHgxCisjZGVmaW5lIEFVVEhfQUxHX1NIQVJFRF9LRVkJCQkweDIKKyNkZWZpbmUgQVVUSF9BTEdfTEVBUAkJCQkweDQKK3N0YXRpYyBpbnQgcnRsbGliX3dwYV9zZXRfYXV0aF9hbGdzKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBpbnQgdmFsdWUpCit7CisKKwlzdHJ1Y3QgcnRsbGliX3NlY3VyaXR5IHNlYyA9IHsKKwkJLmZsYWdzID0gU0VDX0FVVEhfTU9ERSwKKwl9OworCWludCByZXQgPSAwOworCisJaWYgKHZhbHVlICYgQVVUSF9BTEdfU0hBUkVEX0tFWSkgeworCQlzZWMuYXV0aF9tb2RlID0gV0xBTl9BVVRIX1NIQVJFRF9LRVk7CisJCWllZWUtPm9wZW5fd2VwID0gMDsKKwkJaWVlZS0+YXV0aF9tb2RlID0gMTsKKwl9IGVsc2UgaWYgKHZhbHVlICYgQVVUSF9BTEdfT1BFTl9TWVNURU0pIHsKKwkJc2VjLmF1dGhfbW9kZSA9IFdMQU5fQVVUSF9PUEVOOworCQlpZWVlLT5vcGVuX3dlcCA9IDE7CisJCWllZWUtPmF1dGhfbW9kZSA9IDA7CisJfSBlbHNlIGlmICh2YWx1ZSAmIEFVVEhfQUxHX0xFQVApIHsKKwkJc2VjLmF1dGhfbW9kZSA9IFdMQU5fQVVUSF9MRUFQICA+PiA2OworCQlpZWVlLT5vcGVuX3dlcCA9IDE7CisJCWllZWUtPmF1dGhfbW9kZSA9IDI7CisJfQorCisKKwlpZiAoaWVlZS0+c2V0X3NlY3VyaXR5KQorCQlpZWVlLT5zZXRfc2VjdXJpdHkoaWVlZS0+ZGV2LCAmc2VjKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnRsbGliX3dwYV9zZXRfcGFyYW0oc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHU4IG5hbWUsIHUzMiB2YWx1ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3dpdGNoIChuYW1lKSB7CisJY2FzZSBJRUVFX1BBUkFNX1dQQV9FTkFCTEVEOgorCQlyZXQgPSBydGxsaWJfd3BhX2VuYWJsZShpZWVlLCB2YWx1ZSk7CisJCWJyZWFrOworCisJY2FzZSBJRUVFX1BBUkFNX1RLSVBfQ09VTlRFUk1FQVNVUkVTOgorCQlpZWVlLT50a2lwX2NvdW50ZXJtZWFzdXJlcyA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2UgSUVFRV9QQVJBTV9EUk9QX1VORU5DUllQVEVEOgorCXsKKwkJLyogSEFDSzoKKwkJICoKKwkJICogd3BhX3N1cHBsaWNhbnQgY2FsbHMgc2V0X3dwYV9lbmFibGVkIHdoZW4gdGhlIGRyaXZlcgorCQkgKiBpcyBsb2FkZWQgYW5kIHVubG9hZGVkLCByZWdhcmRsZXNzIG9mIGlmIFdQQSBpcyBiZWluZworCQkgKiB1c2VkLiAgTm8gb3RoZXIgY2FsbHMgYXJlIG1hZGUgd2hpY2ggY2FuIGJlIHVzZWQgdG8KKwkJICogZGV0ZXJtaW5lIGlmIGVuY3J5cHRpb24gd2lsbCBiZSB1c2VkIG9yIG5vdCBwcmlvciB0bworCQkgKiBhc3NvY2lhdGlvbiBiZWluZyBleHBlY3RlZC4gIElmIGVuY3J5cHRpb24gaXMgbm90IGJlaW5nCisJCSAqIHVzZWQsIGRyb3BfdW5lbmNyeXB0ZWQgaXMgc2V0IHRvIGZhbHNlLCBlbHNlIHRydWUgLS0gd2UKKwkJICogY2FuIHVzZSB0aGlzIHRvIGRldGVybWluZSBpZiB0aGUgQ0FQX1BSSVZBQ1lfT04gYml0IHNob3VsZAorCQkgKiBiZSBzZXQuCisJCSAqLworCQlzdHJ1Y3QgcnRsbGliX3NlY3VyaXR5IHNlYyA9IHsKKwkJCS5mbGFncyA9IFNFQ19FTkFCTEVELAorCQkJLmVuYWJsZWQgPSB2YWx1ZSwKKwkJfTsKKwkJaWVlZS0+ZHJvcF91bmVuY3J5cHRlZCA9IHZhbHVlOworCQkvKiBXZSBvbmx5IGNoYW5nZSBTRUNfTEVWRUwgZm9yIG9wZW4gbW9kZS4gT3RoZXJzCisJCSAqIGFyZSBzZXQgYnkgaXB3X3dwYV9zZXRfZW5jcnlwdGlvbi4KKwkJICovCisJCWlmICghdmFsdWUpIHsKKwkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMDsKKwkJfSBlbHNlIHsKKwkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMTsKKwkJfQorCQlpZiAoaWVlZS0+c2V0X3NlY3VyaXR5KQorCQkJaWVlZS0+c2V0X3NlY3VyaXR5KGllZWUtPmRldiwgJnNlYyk7CisJCWJyZWFrOworCX0KKworCWNhc2UgSUVFRV9QQVJBTV9QUklWQUNZX0lOVk9LRUQ6CisJCWllZWUtPnByaXZhY3lfaW52b2tlZCA9IHZhbHVlOworCQlicmVhazsKKworCWNhc2UgSUVFRV9QQVJBTV9BVVRIX0FMR1M6CisJCXJldCA9IHJ0bGxpYl93cGFfc2V0X2F1dGhfYWxncyhpZWVlLCB2YWx1ZSk7CisJCWJyZWFrOworCisJY2FzZSBJRUVFX1BBUkFNX0lFRUVfODAyXzFYOgorCQlpZWVlLT5pZWVlODAyXzF4ID0gdmFsdWU7CisJCWJyZWFrOworCWNhc2UgSUVFRV9QQVJBTV9XUEFYX1NFTEVDVDoKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPndwYXhfc3VpdGxpc3RfbG9jaywgZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT53cGF4X3N1aXRsaXN0X2xvY2ssIGZsYWdzKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPICJVbmtub3duIFdQQSBwYXJhbTogJWRcbiIsIG5hbWUpOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBpbXBsZW1lbnRhdGlvbiBib3Jyb3dlZCBmcm9tIGhvc3RhcCBkcml2ZXIgKi8KK3N0YXRpYyBpbnQgcnRsbGliX3dwYV9zZXRfZW5jcnlwdGlvbihzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCQkgIHN0cnVjdCBpZWVlX3BhcmFtICpwYXJhbSwgaW50IHBhcmFtX2xlbiwKKwkJCQkgIHU4IGlzX21lc2gpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHJ0bGxpYl9jcnlwdG9fb3BzICpvcHM7CisJc3RydWN0IHJ0bGxpYl9jcnlwdF9kYXRhICoqY3J5cHQ7CisKKwlzdHJ1Y3QgcnRsbGliX3NlY3VyaXR5IHNlYyA9IHsKKwkJLmZsYWdzID0gMCwKKwl9OworCisJcGFyYW0tPnUuY3J5cHQuZXJyID0gMDsKKwlwYXJhbS0+dS5jcnlwdC5hbGdbSUVFRV9DUllQVF9BTEdfTkFNRV9MRU4gLSAxXSA9ICdcMCc7CisKKwlpZiAocGFyYW1fbGVuICE9CisJICAgIChpbnQpICgoY2hhciAqKSBwYXJhbS0+dS5jcnlwdC5rZXkgLSAoY2hhciAqKSBwYXJhbSkgKworCSAgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkxlbiBtaXNtYXRjaCAlZCwgJWRcbiIsIHBhcmFtX2xlbiwKKwkJCSAgICAgICBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChwYXJhbS0+c3RhX2FkZHJbMF0gPT0gMHhmZiAmJiBwYXJhbS0+c3RhX2FkZHJbMV0gPT0gMHhmZiAmJgorCSAgICBwYXJhbS0+c3RhX2FkZHJbMl0gPT0gMHhmZiAmJiBwYXJhbS0+c3RhX2FkZHJbM10gPT0gMHhmZiAmJgorCSAgICBwYXJhbS0+c3RhX2FkZHJbNF0gPT0gMHhmZiAmJiBwYXJhbS0+c3RhX2FkZHJbNV0gPT0gMHhmZikgeworCQlpZiAocGFyYW0tPnUuY3J5cHQuaWR4ID49IFdFUF9LRVlTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNyeXB0ID0gJmllZWUtPmNyeXB0W3BhcmFtLT51LmNyeXB0LmlkeF07CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJub25lIikgPT0gMCkgeworCQlpZiAoY3J5cHQpIHsKKwkJCXNlYy5lbmFibGVkID0gMDsKKwkJCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8wOworCQkJc2VjLmZsYWdzIHw9IFNFQ19FTkFCTEVEIHwgU0VDX0xFVkVMOworCQkJcnRsbGliX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGllZWUsIGNyeXB0KTsKKwkJfQorCQlnb3RvIGRvbmU7CisJfQorCXNlYy5lbmFibGVkID0gMTsKKwlzZWMuZmxhZ3MgfD0gU0VDX0VOQUJMRUQ7CisKKwkvKiBJUFcgSFcgY2Fubm90IGJ1aWxkIFRLSVAgTUlDLCBob3N0IGRlY3J5cHRpb24gc3RpbGwgbmVlZGVkLiAqLworCWlmICghKGllZWUtPmhvc3RfZW5jcnlwdCB8fCBpZWVlLT5ob3N0X2RlY3J5cHQpICYmCisJICAgIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJUS0lQIikpCisJCWdvdG8gc2tpcF9ob3N0X2NyeXB0OworCisJb3BzID0gcnRsbGliX2dldF9jcnlwdG9fb3BzKHBhcmFtLT51LmNyeXB0LmFsZyk7CisJaWYgKG9wcyA9PSBOVUxMICYmIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJXRVAiKSA9PSAwKSB7CisJCXJlcXVlc3RfbW9kdWxlKCJydGxsaWJfY3J5cHRfd2VwIik7CisJCW9wcyA9IHJ0bGxpYl9nZXRfY3J5cHRvX29wcyhwYXJhbS0+dS5jcnlwdC5hbGcpOworCX0gZWxzZSBpZiAob3BzID09IE5VTEwgJiYgc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIlRLSVAiKSA9PSAwKSB7CisJCXJlcXVlc3RfbW9kdWxlKCJydGxsaWJfY3J5cHRfdGtpcCIpOworCQlvcHMgPSBydGxsaWJfZ2V0X2NyeXB0b19vcHMocGFyYW0tPnUuY3J5cHQuYWxnKTsKKwl9IGVsc2UgaWYgKG9wcyA9PSBOVUxMICYmIHN0cmNtcChwYXJhbS0+dS5jcnlwdC5hbGcsICJDQ01QIikgPT0gMCkgeworCQlyZXF1ZXN0X21vZHVsZSgicnRsbGliX2NyeXB0X2NjbXAiKTsKKwkJb3BzID0gcnRsbGliX2dldF9jcnlwdG9fb3BzKHBhcmFtLT51LmNyeXB0LmFsZyk7CisJfQorCWlmIChvcHMgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9JTkZPICJ1bmtub3duIGNyeXB0byBhbGcgJyVzJ1xuIiwKKwkJICAgICAgIHBhcmFtLT51LmNyeXB0LmFsZyk7CisJCXBhcmFtLT51LmNyeXB0LmVyciA9IElFRUVfQ1JZUFRfRVJSX1VOS05PV05fQUxHOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCWlmICgqY3J5cHQgPT0gTlVMTCB8fCAoKmNyeXB0KS0+b3BzICE9IG9wcykgeworCQlzdHJ1Y3QgcnRsbGliX2NyeXB0X2RhdGEgKm5ld19jcnlwdDsKKworCQlydGxsaWJfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwgY3J5cHQpOworCisJCW5ld19jcnlwdCA9IChzdHJ1Y3QgcnRsbGliX2NyeXB0X2RhdGEgKikKKwkJCWttYWxsb2Moc2l6ZW9mKCpuZXdfY3J5cHQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKG5ld19jcnlwdCA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBkb25lOworCQl9CisJCW1lbXNldChuZXdfY3J5cHQsIDAsIHNpemVvZihzdHJ1Y3QgcnRsbGliX2NyeXB0X2RhdGEpKTsKKwkJbmV3X2NyeXB0LT5vcHMgPSBvcHM7CisJCWlmIChuZXdfY3J5cHQtPm9wcykKKwkJCW5ld19jcnlwdC0+cHJpdiA9CisJCQkJbmV3X2NyeXB0LT5vcHMtPmluaXQocGFyYW0tPnUuY3J5cHQuaWR4KTsKKworCQlpZiAobmV3X2NyeXB0LT5wcml2ID09IE5VTEwpIHsKKwkJCWtmcmVlKG5ld19jcnlwdCk7CisJCQlwYXJhbS0+dS5jcnlwdC5lcnIgPSBJRUVFX0NSWVBUX0VSUl9DUllQVF9JTklUX0ZBSUxFRDsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQkqY3J5cHQgPSBuZXdfY3J5cHQ7CisJfQorCisJaWYgKHBhcmFtLT51LmNyeXB0LmtleV9sZW4gPiAwICYmICgqY3J5cHQpLT5vcHMtPnNldF9rZXkgJiYKKwkgICAgKCpjcnlwdCktPm9wcy0+c2V0X2tleShwYXJhbS0+dS5jcnlwdC5rZXksCisJICAgIHBhcmFtLT51LmNyeXB0LmtleV9sZW4sIHBhcmFtLT51LmNyeXB0LnNlcSwKKwkgICAgKCpjcnlwdCktPnByaXYpIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICJrZXkgc2V0dGluZyBmYWlsZWRcbiIpOworCQlwYXJhbS0+dS5jcnlwdC5lcnIgPSBJRUVFX0NSWVBUX0VSUl9LRVlfU0VUX0ZBSUxFRDsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworIHNraXBfaG9zdF9jcnlwdDoKKwlpZiAocGFyYW0tPnUuY3J5cHQuc2V0X3R4KSB7CisJCWllZWUtPnR4X2tleWlkeCA9IHBhcmFtLT51LmNyeXB0LmlkeDsKKwkJc2VjLmFjdGl2ZV9rZXkgPSBwYXJhbS0+dS5jcnlwdC5pZHg7CisJCXNlYy5mbGFncyB8PSBTRUNfQUNUSVZFX0tFWTsKKwl9IGVsc2UKKwkJc2VjLmZsYWdzICY9IH5TRUNfQUNUSVZFX0tFWTsKKworCWlmIChwYXJhbS0+dS5jcnlwdC5hbGcgIT0gTlVMTCkgeworCQltZW1jcHkoc2VjLmtleXNbcGFyYW0tPnUuY3J5cHQuaWR4XSwKKwkJICAgICAgIHBhcmFtLT51LmNyeXB0LmtleSwKKwkJICAgICAgIHBhcmFtLT51LmNyeXB0LmtleV9sZW4pOworCQlzZWMua2V5X3NpemVzW3BhcmFtLT51LmNyeXB0LmlkeF0gPSBwYXJhbS0+dS5jcnlwdC5rZXlfbGVuOworCQlzZWMuZmxhZ3MgfD0gKDEgPDwgcGFyYW0tPnUuY3J5cHQuaWR4KTsKKworCQlpZiAoc3RyY21wKHBhcmFtLT51LmNyeXB0LmFsZywgIldFUCIpID09IDApIHsKKwkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiVEtJUCIpID09IDApIHsKKwkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMjsKKwkJfSBlbHNlIGlmIChzdHJjbXAocGFyYW0tPnUuY3J5cHQuYWxnLCAiQ0NNUCIpID09IDApIHsKKwkJCXNlYy5mbGFncyB8PSBTRUNfTEVWRUw7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMzsKKwkJfQorCX0KKyBkb25lOgorCWlmIChpZWVlLT5zZXRfc2VjdXJpdHkpCisJCWllZWUtPnNldF9zZWN1cml0eShpZWVlLT5kZXYsICZzZWMpOworCisJLyogRG8gbm90IHJlc2V0IHBvcnQgaWYgY2FyZCBpcyBpbiBNYW5hZ2VkIG1vZGUgc2luY2UgcmVzZXR0aW5nIHdpbGwKKwkgKiBnZW5lcmF0ZSBuZXcgSUVFRSA4MDIuMTEgYXV0aGVudGljYXRpb24gd2hpY2ggbWF5IGVuZCB1cCBpbiBsb29waW5nCisJICogd2l0aCBJRUVFIDgwMi4xWC4gIElmIHlvdXIgaGFyZHdhcmUgcmVxdWlyZXMgYSByZXNldCBhZnRlciBXRVAKKwkgKiBjb25maWd1cmF0aW9uIChmb3IgZXhhbXBsZS4uLiBQcmlzbTIpLCBpbXBsZW1lbnQgdGhlIHJlc2V0X3BvcnQgaW4KKwkgKiB0aGUgY2FsbGJhY2tzIHN0cnVjdHVyZXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSA4MDIuMTEgc3RhY2suICovCisJaWYgKGllZWUtPnJlc2V0X29uX2tleWNoYW5nZSAmJgorCSAgICBpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgJiYKKwkgICAgaWVlZS0+cmVzZXRfcG9ydCAmJgorCSAgICBpZWVlLT5yZXNldF9wb3J0KGllZWUtPmRldikpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAicmVzZXRfcG9ydCBmYWlsZWRcbiIpOworCQlwYXJhbS0+dS5jcnlwdC5lcnIgPSBJRUVFX0NSWVBUX0VSUl9DQVJEX0NPTkZfRkFJTEVEOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnJ0bGxpYl9kaXNhdXRoX3NrYihzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKmJlYWNvbiwKKwkJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHUxNiBhc1JzbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBydGxsaWJfZGlzYXV0aCAqZGlzYXV0aDsKKwlpbnQgbGVuID0gc2l6ZW9mKHN0cnVjdCBydGxsaWJfZGlzYXV0aCkgKyBpZWVlLT50eF9oZWFkcm9vbTsKKworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwlza2JfcmVzZXJ2ZShza2IsIGllZWUtPnR4X2hlYWRyb29tKTsKKworCWRpc2F1dGggPSAoc3RydWN0IHJ0bGxpYl9kaXNhdXRoICopIHNrYl9wdXQoc2tiLAorCQkgIHNpemVvZihzdHJ1Y3QgcnRsbGliX2Rpc2F1dGgpKTsKKwlkaXNhdXRoLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoUlRMTElCX1NUWVBFX0RFQVVUSCk7CisJZGlzYXV0aC0+aGVhZGVyLmR1cmF0aW9uX2lkID0gMDsKKworCW1lbWNweShkaXNhdXRoLT5oZWFkZXIuYWRkcjEsIGJlYWNvbi0+YnNzaWQsIEVUSF9BTEVOKTsKKwltZW1jcHkoZGlzYXV0aC0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGRpc2F1dGgtPmhlYWRlci5hZGRyMywgYmVhY29uLT5ic3NpZCwgRVRIX0FMRU4pOworCisJZGlzYXV0aC0+cmVhc29uID0gY3B1X3RvX2xlMTYoYXNSc24pOworCXJldHVybiBza2I7Cit9CisKK2lubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqcnRsbGliX2Rpc2Fzc29jaWF0ZV9za2Ioc3RydWN0IHJ0bGxpYl9uZXR3b3JrICpiZWFjb24sCisJCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1MTYgYXNSc24pCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgcnRsbGliX2Rpc2Fzc29jICpkaXNhc3M7CisJaW50IGxlbiA9IHNpemVvZihzdHJ1Y3QgcnRsbGliX2Rpc2Fzc29jKSArIGllZWUtPnR4X2hlYWRyb29tOworCXNrYiA9IGRldl9hbGxvY19za2IobGVuKTsKKworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCXNrYl9yZXNlcnZlKHNrYiwgaWVlZS0+dHhfaGVhZHJvb20pOworCisJZGlzYXNzID0gKHN0cnVjdCBydGxsaWJfZGlzYXNzb2MgKikgc2tiX3B1dChza2IsCisJCQkJCSBzaXplb2Yoc3RydWN0IHJ0bGxpYl9kaXNhc3NvYykpOworCWRpc2Fzcy0+aGVhZGVyLmZyYW1lX2N0bCA9IGNwdV90b19sZTE2KFJUTExJQl9TVFlQRV9ESVNBU1NPQyk7CisJZGlzYXNzLT5oZWFkZXIuZHVyYXRpb25faWQgPSAwOworCisJbWVtY3B5KGRpc2Fzcy0+aGVhZGVyLmFkZHIxLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KGRpc2Fzcy0+aGVhZGVyLmFkZHIyLCBpZWVlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGRpc2Fzcy0+aGVhZGVyLmFkZHIzLCBiZWFjb24tPmJzc2lkLCBFVEhfQUxFTik7CisKKwlkaXNhc3MtPnJlYXNvbiA9IGNwdV90b19sZTE2KGFzUnNuKTsKKwlyZXR1cm4gc2tiOworfQorCit2b2lkIFNlbmREaXNhc3NvY2lhdGlvbihzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgYm9vbCBkZWF1dGgsIHUxNiBhc1JzbikKK3sKKwlzdHJ1Y3QgcnRsbGliX25ldHdvcmsgKmJlYWNvbiA9ICZpZWVlLT5jdXJyZW50X25ldHdvcms7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWlmIChkZWF1dGgpCisJCXNrYiA9IHJ0bGxpYl9kaXNhdXRoX3NrYihiZWFjb24sIGllZWUsIGFzUnNuKTsKKwllbHNlCisJCXNrYiA9IHJ0bGxpYl9kaXNhc3NvY2lhdGVfc2tiKGJlYWNvbiwgaWVlZSwgYXNSc24pOworCisJaWYgKHNrYikKKwkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKK30KKwordTggcnRsbGliX2FwX3NlY190eXBlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKQoreworCXN0YXRpYyB1OCBjY21wX2llWzRdID0gezB4MDAsIDB4NTAsIDB4ZjIsIDB4MDR9OworCXN0YXRpYyB1OCBjY21wX3Jzbl9pZVs0XSA9IHsweDAwLCAweDBmLCAweGFjLCAweDA0fTsKKwlpbnQgd3BhX2llX2xlbiA9IGllZWUtPndwYV9pZV9sZW47CisJc3RydWN0IHJ0bGxpYl9jcnlwdF9kYXRhICpjcnlwdDsKKwlpbnQgZW5jcnlwdDsKKworCWNyeXB0ID0gaWVlZS0+Y3J5cHRbaWVlZS0+dHhfa2V5aWR4XTsKKwllbmNyeXB0ID0gKGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1kpCisJCSAgfHwgKGllZWUtPmhvc3RfZW5jcnlwdCAmJiBjcnlwdCAmJiBjcnlwdC0+b3BzICYmCisJCSAgKDAgPT0gc3RyY21wKGNyeXB0LT5vcHMtPm5hbWUsICJXRVAiKSkpOworCisJLyogc2ltcGx5IGp1ZGdlICAqLworCWlmIChlbmNyeXB0ICYmICh3cGFfaWVfbGVuID09IDApKSB7CisJCXJldHVybiBTRUNfQUxHX1dFUDsKKwl9IGVsc2UgaWYgKCh3cGFfaWVfbGVuICE9IDApKSB7CisJCWlmICgoKGllZWUtPndwYV9pZVswXSA9PSAweGRkKSAmJgorCQkgICAgKCFtZW1jbXAoJihpZWVlLT53cGFfaWVbMTRdKSwgY2NtcF9pZSwgNCkpKSB8fAorCQkgICAgKChpZWVlLT53cGFfaWVbMF0gPT0gMHgzMCkgJiYKKwkJICAgICghbWVtY21wKCZpZWVlLT53cGFfaWVbMTBdLCBjY21wX3Jzbl9pZSwgNCkpKSkKKwkJCXJldHVybiBTRUNfQUxHX0NDTVA7CisJCWVsc2UKKwkJCXJldHVybiBTRUNfQUxHX1RLSVA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIFNFQ19BTEdfTk9ORTsKKwl9Cit9CisKK2ludCBydGxsaWJfd3BhX3N1cHBsaWNhbnRfaW9jdGwoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19wb2ludCAqcCwKKwkJCQl1OCBpc19tZXNoKQoreworCXN0cnVjdCBpZWVlX3BhcmFtICpwYXJhbTsKKwlpbnQgcmV0ID0gMDsKKworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlpZiAocC0+bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBpZWVlX3BhcmFtKSB8fCAhcC0+cG9pbnRlcikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlwYXJhbSA9IGttYWxsb2MocC0+bGVuZ3RoLCBHRlBfS0VSTkVMKTsKKwlpZiAocGFyYW0gPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKHBhcmFtLCBwLT5wb2ludGVyLCBwLT5sZW5ndGgpKSB7CisJCWtmcmVlKHBhcmFtKTsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBvdXQ7CisJfQorCisJc3dpdGNoIChwYXJhbS0+Y21kKSB7CisJY2FzZSBJRUVFX0NNRF9TRVRfV1BBX1BBUkFNOgorCQlyZXQgPSBydGxsaWJfd3BhX3NldF9wYXJhbShpZWVlLCBwYXJhbS0+dS53cGFfcGFyYW0ubmFtZSwKKwkJCQkJcGFyYW0tPnUud3BhX3BhcmFtLnZhbHVlKTsKKwkJYnJlYWs7CisKKwljYXNlIElFRUVfQ01EX1NFVF9XUEFfSUU6CisJCXJldCA9IHJ0bGxpYl93cGFfc2V0X3dwYV9pZShpZWVlLCBwYXJhbSwgcC0+bGVuZ3RoKTsKKwkJYnJlYWs7CisKKwljYXNlIElFRUVfQ01EX1NFVF9FTkNSWVBUSU9OOgorCQlyZXQgPSBydGxsaWJfd3BhX3NldF9lbmNyeXB0aW9uKGllZWUsIHBhcmFtLCBwLT5sZW5ndGgsIDApOworCQlicmVhazsKKworCWNhc2UgSUVFRV9DTURfTUxNRToKKwkJcmV0ID0gcnRsbGliX3dwYV9tbG1lKGllZWUsIHBhcmFtLT51Lm1sbWUuY29tbWFuZCwKKwkJCQkgICBwYXJhbS0+dS5tbG1lLnJlYXNvbl9jb2RlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPICJVbmtub3duIFdQQSBzdXBwbGljYW50IHJlcXVlc3Q6ICVkXG4iLAorCQkgICAgICAgcGFyYW0tPmNtZCk7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKKwl9CisKKwlpZiAocmV0ID09IDAgJiYgY29weV90b191c2VyKHAtPnBvaW50ZXIsIHBhcmFtLCBwLT5sZW5ndGgpKQorCQlyZXQgPSAtRUZBVUxUOworCisJa2ZyZWUocGFyYW0pOworb3V0OgorCXVwKCZpZWVlLT53eF9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBydGxsaWJfTWdudERpc2Nvbm5lY3RJQlNTKHN0cnVjdCBydGxsaWJfZGV2aWNlICpydGxsaWIpCit7CisJdTgJT3BNb2RlOworCXU4CWk7CisJYm9vbAliRmlsdGVyT3V0Tm9uQXNzb2NpYXRlZEJTU0lEID0gZmFsc2U7CisKKwlydGxsaWItPnN0YXRlID0gUlRMTElCX05PTElOSzsKKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLmJzc2lkW2ldID0gMHg1NTsKKworCXJ0bGxpYi0+T3BNb2RlID0gUlRfT1BfTU9ERV9OT19MSU5LOworCXJ0bGxpYi0+U2V0SHdSZWdIYW5kbGVyKHJ0bGxpYi0+ZGV2LCBIV19WQVJfQlNTSUQsCisJCQkJcnRsbGliLT5jdXJyZW50X25ldHdvcmsuYnNzaWQpOworCU9wTW9kZSA9IFJUX09QX01PREVfTk9fTElOSzsKKwlydGxsaWItPlNldEh3UmVnSGFuZGxlcihydGxsaWItPmRldiwgSFdfVkFSX01FRElBX1NUQVRVUywgJk9wTW9kZSk7CisJcnRsbGliX3N0b3Bfc2VuZF9iZWFjb25zKHJ0bGxpYik7CisKKwliRmlsdGVyT3V0Tm9uQXNzb2NpYXRlZEJTU0lEID0gZmFsc2U7CisJcnRsbGliLT5TZXRId1JlZ0hhbmRsZXIocnRsbGliLT5kZXYsIEhXX1ZBUl9DRUNIS19CU1NJRCwKKwkJCQkodTggKikoJmJGaWx0ZXJPdXROb25Bc3NvY2lhdGVkQlNTSUQpKTsKKwlub3RpZnlfd3hfYXNzb2NfZXZlbnQocnRsbGliKTsKKworfQorCit2b2lkIHJ0bGxpYl9NbG1lRGlzYXNzb2NpYXRlUmVxdWVzdChzdHJ1Y3QgcnRsbGliX2RldmljZSAqcnRsbGliLCB1OCAqYXNTdGEsCisJCQkJICAgIHU4IGFzUnNuKQoreworCXU4IGk7CisJdTgJT3BNb2RlOworCisJUmVtb3ZlUGVlclRTKHJ0bGxpYiwgYXNTdGEpOworCisKKwlpZiAobWVtY3B5KHJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBhc1N0YSwgNikgPT0gTlVMTCkgeworCQlydGxsaWItPnN0YXRlID0gUlRMTElCX05PTElOSzsKKworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJcnRsbGliLT5jdXJyZW50X25ldHdvcmsuYnNzaWRbaV0gPSAweDIyOworCQlPcE1vZGUgPSBSVF9PUF9NT0RFX05PX0xJTks7CisJCXJ0bGxpYi0+T3BNb2RlID0gUlRfT1BfTU9ERV9OT19MSU5LOworCQlydGxsaWItPlNldEh3UmVnSGFuZGxlcihydGxsaWItPmRldiwgSFdfVkFSX01FRElBX1NUQVRVUywKKwkJCQkJKHU4ICopKCZPcE1vZGUpKTsKKwkJcnRsbGliX2Rpc2Fzc29jaWF0ZShydGxsaWIpOworCisJCXJ0bGxpYi0+U2V0SHdSZWdIYW5kbGVyKHJ0bGxpYi0+ZGV2LCBIV19WQVJfQlNTSUQsCisJCQkJCXJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLmJzc2lkKTsKKworCX0KKworfQorCit2b2lkCitydGxsaWJfTWdudERpc2Nvbm5lY3RBUCgKKwlzdHJ1Y3QgcnRsbGliX2RldmljZSAqcnRsbGliLAorCXU4IGFzUnNuCispCit7CisJYm9vbCBiRmlsdGVyT3V0Tm9uQXNzb2NpYXRlZEJTU0lEID0gZmFsc2U7CisKKwliRmlsdGVyT3V0Tm9uQXNzb2NpYXRlZEJTU0lEID0gZmFsc2U7CisJcnRsbGliLT5TZXRId1JlZ0hhbmRsZXIocnRsbGliLT5kZXYsIEhXX1ZBUl9DRUNIS19CU1NJRCwKKwkJCQkodTggKikoJmJGaWx0ZXJPdXROb25Bc3NvY2lhdGVkQlNTSUQpKTsKKwlydGxsaWJfTWxtZURpc2Fzc29jaWF0ZVJlcXVlc3QocnRsbGliLCBydGxsaWItPmN1cnJlbnRfbmV0d29yay5ic3NpZCwKKwkJCQkgICAgICAgYXNSc24pOworCisJcnRsbGliLT5zdGF0ZSA9IFJUTExJQl9OT0xJTks7Cit9CisKK2Jvb2wgcnRsbGliX01nbnREaXNjb25uZWN0KHN0cnVjdCBydGxsaWJfZGV2aWNlICpydGxsaWIsIHU4IGFzUnNuKQoreworCWlmIChydGxsaWItPnBzICE9IFJUTExJQl9QU19ESVNBQkxFRCkKKwkJcnRsbGliLT5zdGFfd2FrZV91cChydGxsaWItPmRldik7CisKKwlpZiAocnRsbGliLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEKSB7CisJCWlmIChydGxsaWItPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKKwkJCXJ0bGxpYl9NZ250RGlzY29ubmVjdElCU1MocnRsbGliKTsKKwkJaWYgKHJ0bGxpYi0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKQorCQkJcnRsbGliX01nbnREaXNjb25uZWN0QVAocnRsbGliLCBhc1Jzbik7CisKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBub3RpZnlfd3hfYXNzb2NfZXZlbnQoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJdW5pb24gaXdyZXFfZGF0YSB3cnF1OworCisJaWYgKGllZWUtPmNhbm5vdF9ub3RpZnkpCisJCXJldHVybjsKKworCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJaWYgKGllZWUtPnN0YXRlID09IFJUTExJQl9MSU5LRUQpCisJCW1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLAorCQkgICAgICAgRVRIX0FMRU4pOworCWVsc2UgeworCisJCXByaW50ayhLRVJOX0lORk8gIiVzKCk6IFRlbGwgdXNlciBzcGFjZSBkaXNjb25uZWN0ZWRcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOworCX0KKwl3aXJlbGVzc19zZW5kX2V2ZW50KGllZWUtPmRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3NvZnRtYWNfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfc29mdG1hY193eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOTg4ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3NvZnRtYWNfd3guYwpAQCAtMCwwICsxLDY0NSBAQAorLyogSUVFRSA4MDIuMTEgU29mdE1BQyBsYXllcgorICogQ29weXJpZ2h0IChjKSAyMDA1IEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKyAqCisgKiBNb3N0bHkgZXh0cmFjdGVkIGZyb20gdGhlIHJ0bDgxODAtc2EyNDAwIGRyaXZlciBmb3IgdGhlCisgKiBpbi1rZXJuZWwgZ2VuZXJpYyBpZWVlODAyLjExIHN0YWNrLgorICoKKyAqIFNvbWUgcGllY2VzIG9mIGNvZGUgbWlnaHQgYmUgc3RvbGVuIGZyb20gaXB3MjEwMCBkcml2ZXIKKyAqIGNvcHlyaWdodCBvZiB3aG8gb3duIGl0J3MgY29weXJpZ2h0IDstKQorICoKKyAqIFBTIHd4IGhhbmRsZXIgbW9zdGx5IHN0b2xlbiBmcm9tIGhvc3RhcCwgY29weXJpZ2h0IHdobworICogb3duIGl0J3MgY29weXJpZ2h0IDstKQorICoKKyAqIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwKKyAqLworCisKKyNpbmNsdWRlICJydGxsaWIuaCIKKyNpbmNsdWRlICJydGxfY29yZS5oIgorI2luY2x1ZGUgImRvdDExZC5oIgorLyogRklYTUU6IGFkZCBBIGZyZXFzICovCisKK2NvbnN0IGxvbmcgcnRsbGliX3dsYW5fZnJlcXVlbmNpZXNbXSA9IHsKKwkyNDEyLCAyNDE3LCAyNDIyLCAyNDI3LAorCTI0MzIsIDI0MzcsIDI0NDIsIDI0NDcsCisJMjQ1MiwgMjQ1NywgMjQ2MiwgMjQ2NywKKwkyNDcyLCAyNDg0Cit9OworCisKK2ludCBydGxsaWJfd3hfc2V0X2ZyZXEoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaXdfZnJlcSAqZndycSA9ICZ3cnF1LT5mcmVxOworCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpIHsKKwkJcmV0ID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogaWYgc2V0dGluZyBieSBmcmVxIGNvbnZlcnQgdG8gY2hhbm5lbCAqLworCWlmIChmd3JxLT5lID09IDEpIHsKKwkJaWYgKChmd3JxLT5tID49IChpbnQpIDIuNDEyZTggJiYKKwkJICAgICBmd3JxLT5tIDw9IChpbnQpIDIuNDg3ZTgpKSB7CisJCQlpbnQgZiA9IGZ3cnEtPm0gLyAxMDAwMDA7CisJCQlpbnQgYyA9IDA7CisKKwkJCXdoaWxlICgoYyA8IDE0KSAmJiAoZiAhPSBydGxsaWJfd2xhbl9mcmVxdWVuY2llc1tjXSkpCisJCQkJYysrOworCisJCQkvKiBoYWNrIHRvIGZhbGwgdGhyb3VnaCAqLworCQkJZndycS0+ZSA9IDA7CisJCQlmd3JxLT5tID0gYyArIDE7CisJCX0KKwl9CisKKwlpZiAoZndycS0+ZSA+IDAgfHwgZndycS0+bSA+IDE0IHx8IGZ3cnEtPm0gPCAxKSB7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dDsKKworCX0gZWxzZSB7IC8qIFNldCB0aGUgY2hhbm5lbCAqLworCisJCWlmIChpZWVlLT5hY3RpdmVfY2hhbm5lbF9tYXBbZndycS0+bV0gIT0gMSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID0gZndycS0+bTsKKwkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CisKKwkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyB8fAorCQkgICAgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikKKwkJCWlmIChpZWVlLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEKSB7CisJCQkJcnRsbGliX3N0b3Bfc2VuZF9iZWFjb25zKGllZWUpOworCQkJCXJ0bGxpYl9zdGFydF9zZW5kX2JlYWNvbnMoaWVlZSk7CisJCQl9CisJfQorCisJcmV0ID0gMDsKK291dDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisKK2ludCBydGxsaWJfd3hfZ2V0X2ZyZXEoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJc3RydWN0IGl3X2ZyZXEgKmZ3cnEgPSAmd3JxdS0+ZnJlcTsKKworCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9PSAwKQorCQlyZXR1cm4gLTE7CisJZndycS0+bSA9IHJ0bGxpYl93bGFuX2ZyZXF1ZW5jaWVzW2llZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsLTFdICoKKwkJICAxMDAwMDA7CisJZndycS0+ZSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydGxsaWJfd3hfZ2V0X3dhcChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCSAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl3cnF1LT5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKKwkJcmV0dXJuIC0xOworCisJLyogV2Ugd2FudCBhdm9pZCB0byBnaXZlIHRvIHRoZSB1c2VyIGluY29uc2lzdGVudCBpbmZvcyovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmIChpZWVlLT5zdGF0ZSAhPSBSVExMSUJfTElOS0VEICYmCisJCWllZWUtPnN0YXRlICE9IFJUTExJQl9MSU5LRURfU0NBTk5JTkcgJiYKKwkJaWVlZS0+d2FwX3NldCA9PSAwKQorCisJCW1lbXNldCh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKKwllbHNlCisJCW1lbWNweSh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsCisJCSAgICAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisKK2ludCBydGxsaWJfd3hfc2V0X3dhcChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJIHVuaW9uIGl3cmVxX2RhdGEgKmF3cnEsCisJCQkgY2hhciAqZXh0cmEpCit7CisKKwlpbnQgcmV0ID0gMDsKKwl1OCB6ZXJvW10gPSB7MCwgMCwgMCwgMCwgMCwgMH07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNob3J0IGlmdXAgPSBpZWVlLT5wcm90b19zdGFydGVkOworCXN0cnVjdCBzb2NrYWRkciAqdGVtcCA9IChzdHJ1Y3Qgc29ja2FkZHIgKilhd3JxOworCisJcnRsbGliX3N0b3Bfc2Nhbl9zeW5jcm8oaWVlZSk7CisKKwlkb3duKCZpZWVlLT53eF9zZW0pOworCS8qIHVzZSBpZmNvbmZpZyBodyBldGhlciAqLworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSB7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAodGVtcC0+c2FfZmFtaWx5ICE9IEFSUEhSRF9FVEhFUikgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobWVtY21wKHRlbXAtPnNhX2RhdGEsIHplcm8sIEVUSF9BTEVOKSA9PSAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJCW1lbWNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIHRlbXAtPnNhX2RhdGEsIEVUSF9BTEVOKTsKKwkJaWVlZS0+d2FwX3NldCA9IDA7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCisJaWYgKGlmdXApCisJCXJ0bGxpYl9zdG9wX3Byb3RvY29sKGllZWUsIHRydWUpOworCisJLyoganVzdCB0byBhdm9pZCB0byBnaXZlIGluY29uc2lzdGVudCBpbmZvcyBpbiB0aGUKKwkgKiBnZXQgd3ggbWV0aG9kLiBub3QgcmVhbGx5IG5lZWRlZCBvdGhlcndpc2UKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWVlZS0+Y2Fubm90X25vdGlmeSA9IGZhbHNlOworCW1lbWNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIHRlbXAtPnNhX2RhdGEsIEVUSF9BTEVOKTsKKwlpZWVlLT53YXBfc2V0ID0gKG1lbWNtcCh0ZW1wLT5zYV9kYXRhLCB6ZXJvLCBFVEhfQUxFTikgIT0gMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaWZ1cCkKKwkJcnRsbGliX3N0YXJ0X3Byb3RvY29sKGllZWUpOworb3V0OgorCXVwKCZpZWVlLT53eF9zZW0pOworCXJldHVybiByZXQ7Cit9CisKK2ludCBydGxsaWJfd3hfZ2V0X2Vzc2lkKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJaW50IGxlbiwgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCQlyZXR1cm4gLTE7CisKKwkvKiBXZSB3YW50IGF2b2lkIHRvIGdpdmUgdG8gdGhlIHVzZXIgaW5jb25zaXN0ZW50IGluZm9zKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkWzBdID09ICdcMCcgfHwKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IDApIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChpZWVlLT5zdGF0ZSAhPSBSVExMSUJfTElOS0VEICYmCisJCWllZWUtPnN0YXRlICE9IFJUTExJQl9MSU5LRURfU0NBTk5JTkcgJiYKKwkJaWVlZS0+c3NpZF9zZXQgPT0gMCkgeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCWxlbiA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbjsKKwl3cnF1LT5lc3NpZC5sZW5ndGggPSBsZW47CisJc3RybmNweShiLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgbGVuKTsKKwl3cnF1LT5lc3NpZC5mbGFncyA9IDE7CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworCit9CisKK2ludCBydGxsaWJfd3hfc2V0X3JhdGUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCisJdTMyIHRhcmdldF9yYXRlID0gd3JxdS0+Yml0cmF0ZS52YWx1ZTsKKworCWllZWUtPnJhdGUgPSB0YXJnZXRfcmF0ZS8xMDAwMDA7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydGxsaWJfd3hfZ2V0X3JhdGUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXUzMiB0bXBfcmF0ZSA9IDA7CisJdG1wX3JhdGUgPSBUeENvdW50VG9EYXRhUmF0ZShpZWVlLAorCQkJCSAgICAgaWVlZS0+c29mdG1hY19zdGF0cy5DdXJyZW50U2hvd1R4YXRlKTsKKwl3cnF1LT5iaXRyYXRlLnZhbHVlID0gdG1wX3JhdGUgKiA1MDAwMDA7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgcnRsbGliX3d4X3NldF9ydHMoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWlmICh3cnF1LT5ydHMuZGlzYWJsZWQgfHwgIXdycXUtPnJ0cy5maXhlZCkKKwkJaWVlZS0+cnRzID0gREVGQVVMVF9SVFNfVEhSRVNIT0xEOworCWVsc2UgeworCQlpZiAod3JxdS0+cnRzLnZhbHVlIDwgTUlOX1JUU19USFJFU0hPTEQgfHwKKwkJCQl3cnF1LT5ydHMudmFsdWUgPiBNQVhfUlRTX1RIUkVTSE9MRCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZWVlLT5ydHMgPSB3cnF1LT5ydHMudmFsdWU7CisJfQorCXJldHVybiAwOworfQorCitpbnQgcnRsbGliX3d4X2dldF9ydHMoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXdycXUtPnJ0cy52YWx1ZSA9IGllZWUtPnJ0czsKKwl3cnF1LT5ydHMuZml4ZWQgPSAwOwkvKiBubyBhdXRvIHNlbGVjdCAqLworCXdycXUtPnJ0cy5kaXNhYmxlZCA9ICh3cnF1LT5ydHMudmFsdWUgPT0gREVGQVVMVF9SVFNfVEhSRVNIT0xEKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0bGxpYl93eF9zZXRfbW9kZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlpbnQgc2V0X21vZGVfc3RhdHVzID0gMDsKKworCXJ0bGxpYl9zdG9wX3NjYW5fc3luY3JvKGllZWUpOworCWRvd24oJmllZWUtPnd4X3NlbSk7CisJc3dpdGNoICh3cnF1LT5tb2RlKSB7CisJY2FzZSBJV19NT0RFX01PTklUT1I6CisJY2FzZSBJV19NT0RFX0FESE9DOgorCWNhc2UgSVdfTU9ERV9JTkZSQToKKwkJYnJlYWs7CisJY2FzZSBJV19NT0RFX0FVVE86CisJCXdycXUtPm1vZGUgPSBJV19NT0RFX0lORlJBOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzZXRfbW9kZV9zdGF0dXMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAod3JxdS0+bW9kZSA9PSBpZWVlLT5pd19tb2RlKQorCQlnb3RvIG91dDsKKworCWlmICh3cnF1LT5tb2RlID09IElXX01PREVfTU9OSVRPUikgeworCQlpZWVlLT5kZXYtPnR5cGUgPSBBUlBIUkRfSUVFRTgwMjExOworCQlydGxsaWJfRW5hYmxlTmV0TW9uaXRvck1vZGUoaWVlZS0+ZGV2LCBmYWxzZSk7CisJfSBlbHNlIHsKKwkJaWVlZS0+ZGV2LT50eXBlID0gQVJQSFJEX0VUSEVSOworCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpCisJCQlydGxsaWJfRGlzYWJsZU5ldE1vbml0b3JNb2RlKGllZWUtPmRldiwgZmFsc2UpOworCX0KKworCWlmICghaWVlZS0+cHJvdG9fc3RhcnRlZCkgeworCQlpZWVlLT5pd19tb2RlID0gd3JxdS0+bW9kZTsKKwl9IGVsc2UgeworCQlydGxsaWJfc3RvcF9wcm90b2NvbChpZWVlLCB0cnVlKTsKKwkJaWVlZS0+aXdfbW9kZSA9IHdycXUtPm1vZGU7CisJCXJ0bGxpYl9zdGFydF9wcm90b2NvbChpZWVlKTsKKwl9CisKK291dDoKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKwlyZXR1cm4gc2V0X21vZGVfc3RhdHVzOworfQorCit2b2lkIHJ0bGxpYl93eF9zeW5jX3NjYW5fd3Eodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSA9IGNvbnRhaW5lcl9vZl93b3JrX3JzbChkYXRhLAorCQkJCSAgICAgc3RydWN0IHJ0bGxpYl9kZXZpY2UsIHd4X3N5bmNfc2Nhbl93cSk7CisJc2hvcnQgY2hhbjsKKwllbnVtIGh0X2V4dGNobmxfb2Zmc2V0IGNoYW5fb2Zmc2V0ID0gMDsKKwllbnVtIGh0X2NoYW5uZWxfd2lkdGggYmFuZHdpZHRoID0gMDsKKwlpbnQgYjQwTSA9IDA7CisJc3RhdGljIGludCBjb3VudDsKKworCWlmICghKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0NBTikpIHsKKwkJcnRsbGliX3N0YXJ0X3NjYW5fc3luY3JvKGllZWUsIDApOworCQlnb3RvIG91dDsKKwl9CisKKwljaGFuID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWw7CisKKwlpZiAoaWVlZS0+TGVpc3VyZVBTTGVhdmUpCisJCWllZWUtPkxlaXN1cmVQU0xlYXZlKGllZWUtPmRldik7CisJLyogbm90aWZ5IEFQIHRvIGJlIGluIFBTIG1vZGUgKi8KKwlydGxsaWJfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShpZWVlLCAxKTsKKwlydGxsaWJfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShpZWVlLCAxKTsKKworCXJ0bGxpYl9zdG9wX2FsbF9xdWV1ZXMoaWVlZSk7CisKKwlpZiAoaWVlZS0+ZGF0YV9oYXJkX3N0b3ApCisJCWllZWUtPmRhdGFfaGFyZF9zdG9wKGllZWUtPmRldik7CisJcnRsbGliX3N0b3Bfc2VuZF9iZWFjb25zKGllZWUpOworCWllZWUtPnN0YXRlID0gUlRMTElCX0xJTktFRF9TQ0FOTklORzsKKwlpZWVlLT5saW5rX2NoYW5nZShpZWVlLT5kZXYpOworCS8qIHdhaXQgZm9yIHBzIHBhY2tldCB0byBiZSBraWNrZWQgb3V0IHN1Y2Nlc3NmdWxseSAqLworCW1zbGVlcCg1MCk7CisKKwlpZiAoaWVlZS0+U2Nhbk9wZXJhdGlvbkJhY2t1cEhhbmRsZXIpCisJCWllZWUtPlNjYW5PcGVyYXRpb25CYWNrdXBIYW5kbGVyKGllZWUtPmRldiwgU0NBTl9PUFRfQkFDS1VQKTsKKworCWlmIChpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCAmJiBpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQgJiYKKwkgICAgaWVlZS0+cEhUSW5mby0+YkN1ckJXNDBNSHopIHsKKwkJYjQwTSA9IDE7CisJCWNoYW5fb2Zmc2V0ID0gaWVlZS0+cEhUSW5mby0+Q3VyU1RBRXh0Q2hubE9mZnNldDsKKwkJYmFuZHdpZHRoID0gKGVudW0gaHRfY2hhbm5lbF93aWR0aClpZWVlLT5wSFRJbmZvLT5iQ3VyQlc0ME1IejsKKwkJUlRfVFJBQ0UoQ09NUF9EQkcsICJTY2FuIGluIDQwTSwgZm9yY2UgdG8gMjBNIGZpcnN0OiVkLCAlZFxuIiwKKwkJCSBjaGFuX29mZnNldCwgYmFuZHdpZHRoKTsKKwkJaWVlZS0+U2V0QldNb2RlSGFuZGxlcihpZWVlLT5kZXYsIEhUX0NIQU5ORUxfV0lEVEhfMjAsCisJCQkJICAgICAgIEhUX0VYVENITkxfT0ZGU0VUX05PX0VYVCk7CisJfQorCisJcnRsbGliX3N0YXJ0X3NjYW5fc3luY3JvKGllZWUsIDApOworCisJaWYgKGI0ME0pIHsKKwkJUlRfVFJBQ0UoQ09NUF9EQkcsICJTY2FuIGluIDIwTSwgYmFjayB0byA0ME1cbiIpOworCQlpZiAoY2hhbl9vZmZzZXQgPT0gSFRfRVhUQ0hOTF9PRkZTRVRfVVBQRVIpCisJCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGNoYW4gKyAyKTsKKwkJZWxzZSBpZiAoY2hhbl9vZmZzZXQgPT0gSFRfRVhUQ0hOTF9PRkZTRVRfTE9XRVIpCisJCQlpZWVlLT5zZXRfY2hhbihpZWVlLT5kZXYsIGNoYW4gLSAyKTsKKwkJZWxzZQorCQkJaWVlZS0+c2V0X2NoYW4oaWVlZS0+ZGV2LCBjaGFuKTsKKwkJaWVlZS0+U2V0QldNb2RlSGFuZGxlcihpZWVlLT5kZXYsIGJhbmR3aWR0aCwgY2hhbl9vZmZzZXQpOworCX0gZWxzZSB7CisJCWllZWUtPnNldF9jaGFuKGllZWUtPmRldiwgY2hhbik7CisJfQorCisJaWYgKGllZWUtPlNjYW5PcGVyYXRpb25CYWNrdXBIYW5kbGVyKQorCQlpZWVlLT5TY2FuT3BlcmF0aW9uQmFja3VwSGFuZGxlcihpZWVlLT5kZXYsIFNDQU5fT1BUX1JFU1RPUkUpOworCisJaWVlZS0+c3RhdGUgPSBSVExMSUJfTElOS0VEOworCWllZWUtPmxpbmtfY2hhbmdlKGllZWUtPmRldik7CisKKwkvKiBOb3RpZnkgQVAgdGhhdCBJIHdha2UgdXAgYWdhaW4gKi8KKwlydGxsaWJfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShpZWVlLCAwKTsKKworCWlmIChpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2QmNuSW5QZXJpb2QgPT0gMCB8fAorCSAgICBpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2RGF0YUluUGVyaW9kID09IDApIHsKKwkJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkJjbkluUGVyaW9kID0gMTsKKwkJaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkRhdGFJblBlcmlvZCA9IDE7CisJfQorCisJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCisJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKKworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MgfHwgaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikKKwkJcnRsbGliX3N0YXJ0X3NlbmRfYmVhY29ucyhpZWVlKTsKKworCXJ0bGxpYl93YWtlX2FsbF9xdWV1ZXMoaWVlZSk7CisKKwljb3VudCA9IDA7CitvdXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisKK30KKworaW50IHJ0bGxpYl93eF9zZXRfc2NhbihzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqYikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IgfHwgIShpZWVlLT5wcm90b19zdGFydGVkKSkgeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGllZWUtPnN0YXRlID09IFJUTExJQl9MSU5LRUQpIHsKKwkJcXVldWVfd29ya19yc2woaWVlZS0+d3EsICZpZWVlLT53eF9zeW5jX3NjYW5fd3EpOworCQkvKiBpbnRlbnRpb25hbGx5IGZvcmdldCB0byB1cCBzZW0gKi8KKwkJcmV0dXJuIDA7CisJfQorCitvdXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IHJ0bGxpYl93eF9zZXRfZXNzaWQoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAorCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisKKwlpbnQgcmV0ID0gMCwgbGVuLCBpOworCXNob3J0IHByb3RvX3N0YXJ0ZWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJ0bGxpYl9zdG9wX3NjYW5fc3luY3JvKGllZWUpOworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlwcm90b19zdGFydGVkID0gaWVlZS0+cHJvdG9fc3RhcnRlZDsKKworCWxlbiA9ICh3cnF1LT5lc3NpZC5sZW5ndGggPCBJV19FU1NJRF9NQVhfU0laRSkgPyB3cnF1LT5lc3NpZC5sZW5ndGggOgorCSAgICAgICBJV19FU1NJRF9NQVhfU0laRTsKKworCWlmIChsZW4gPiBJV19FU1NJRF9NQVhfU0laRSkgeworCQlyZXQgPSAtRTJCSUc7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikgeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmIChleHRyYVtpXSA8IDApIHsKKwkJCXJldCA9IC0xOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAocHJvdG9fc3RhcnRlZCkKKwkJcnRsbGliX3N0b3BfcHJvdG9jb2woaWVlZSwgdHJ1ZSk7CisKKworCS8qIHRoaXMgaXMganVzdCB0byBiZSBzdXJlIHRoYXQgdGhlIEdFVCB3eCBjYWxsYmFjaworCSAqIGhhcyBjb25zaXN0ZW4gaW5mb3MuIG5vdCBuZWVkZWQgb3RoZXJ3aXNlCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmICh3cnF1LT5lc3NpZC5mbGFncyAmJiB3cnF1LT5lc3NpZC5sZW5ndGgpIHsKKwkJc3RybmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgZXh0cmEsIGxlbik7CisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IGxlbjsKKwkJaWVlZS0+Y2Fubm90X25vdGlmeSA9IGZhbHNlOworCQlpZWVlLT5zc2lkX3NldCA9IDE7CisJfSBlbHNlIHsKKwkJaWVlZS0+c3NpZF9zZXQgPSAwOworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZFswXSA9ICdcMCc7CisJCWllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWlmIChwcm90b19zdGFydGVkKQorCQlydGxsaWJfc3RhcnRfcHJvdG9jb2woaWVlZSk7CitvdXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworaW50IHJ0bGxpYl93eF9nZXRfbW9kZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKKwkJICAgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCit7CisJd3JxdS0+bW9kZSA9IGllZWUtPml3X21vZGU7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydGxsaWJfd3hfc2V0X3Jhd3R4KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCisJaW50ICpwYXJtcyA9IChpbnQgKilleHRyYTsKKwlpbnQgZW5hYmxlID0gKHBhcm1zWzBdID4gMCk7CisJc2hvcnQgcHJldiA9IGllZWUtPnJhd190eDsKKworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlpZiAoZW5hYmxlKQorCQlpZWVlLT5yYXdfdHggPSAxOworCWVsc2UKKwkJaWVlZS0+cmF3X3R4ID0gMDsKKworCXByaW50ayhLRVJOX0lORk8icmF3IFRYIGlzICVzXG4iLAorCSAgICAgIGllZWUtPnJhd190eCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKSB7CisJCWlmIChwcmV2ID09IDAgJiYgaWVlZS0+cmF3X3R4KSB7CisJCQlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKKwkJCQlpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKGllZWUtPmRldik7CisKKwkJCW5ldGlmX2NhcnJpZXJfb24oaWVlZS0+ZGV2KTsKKwkJfQorCisJCWlmIChwcmV2ICYmIGllZWUtPnJhd190eCA9PSAxKQorCQkJbmV0aWZfY2Fycmllcl9vZmYoaWVlZS0+ZGV2KTsKKwl9CisKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKworCXJldHVybiAwOworfQorCitpbnQgcnRsbGliX3d4X2dldF9uYW1lKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlzdHJjcHkod3JxdS0+bmFtZSwgIjgwMi4xMSIpOworCisJaWYgKGllZWUtPm1vZHVsYXRpb24gJiBSVExMSUJfQ0NLX01PRFVMQVRJT04pCisJCXN0cmNhdCh3cnF1LT5uYW1lLCAiYiIpOworCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgUlRMTElCX09GRE1fTU9EVUxBVElPTikKKwkJc3RyY2F0KHdycXUtPm5hbWUsICJnIik7CisJaWYgKGllZWUtPm1vZGUgJiAoSUVFRV9OXzI0RyB8IElFRUVfTl81RykpCisJCXN0cmNhdCh3cnF1LT5uYW1lLCAibiIpOworCXJldHVybiAwOworfQorCisKKy8qIHRoaXMgaXMgbW9zdGx5IHN0b2xlbiBmcm9tIGhvc3RhcCAqLworaW50IHJ0bGxpYl93eF9zZXRfcG93ZXIoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCWludCByZXQgPSAwOworCisJaWYgKCghaWVlZS0+c3RhX3dha2VfdXApIHx8CisJICAgICghaWVlZS0+ZW50ZXJfc2xlZXBfc3RhdGUpIHx8CisJICAgICghaWVlZS0+cHNfaXNfcXVldWVfZW1wdHkpKSB7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiJXMoKTogUFMgbW9kZSBpcyB0cnlpZWQgdG8gYmUgdXNlICIKKwkJCSAgICAgImJ1dCBkcml2ZXIgbWlzc2VkIGEgY2FsbGJhY2tcblxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCisJZG93bigmaWVlZS0+d3hfc2VtKTsKKworCWlmICh3cnF1LT5wb3dlci5kaXNhYmxlZCkgeworCQlSVF9UUkFDRShDT01QX0RCRywgIj09PT4lcygpOiBwb3dlciBkaXNhYmxlXG4iLCBfX2Z1bmNfXyk7CisJCWllZWUtPnBzID0gUlRMTElCX1BTX0RJU0FCTEVEOworCQlnb3RvIGV4aXQ7CisJfQorCWlmICh3cnF1LT5wb3dlci5mbGFncyAmIElXX1BPV0VSX1RJTUVPVVQpIHsKKwkJaWVlZS0+cHNfdGltZW91dCA9IHdycXUtPnBvd2VyLnZhbHVlIC8gMTAwMDsKKwkJUlRfVFJBQ0UoQ09NUF9EQkcsICI9PT0+JXMoKTpwc190aW1lb3V0IGlzICVkXG4iLCBfX2Z1bmNfXywKKwkJCSBpZWVlLT5wc190aW1lb3V0KTsKKwl9CisKKwlpZiAod3JxdS0+cG93ZXIuZmxhZ3MgJiBJV19QT1dFUl9QRVJJT0QpCisJCWllZWUtPnBzX3BlcmlvZCA9IHdycXUtPnBvd2VyLnZhbHVlIC8gMTAwMDsKKworCXN3aXRjaCAod3JxdS0+cG93ZXIuZmxhZ3MgJiBJV19QT1dFUl9NT0RFKSB7CisJY2FzZSBJV19QT1dFUl9VTklDQVNUX1I6CisJCWllZWUtPnBzID0gUlRMTElCX1BTX1VOSUNBU1Q7CisJCWJyZWFrOworCWNhc2UgSVdfUE9XRVJfTVVMVElDQVNUX1I6CisJCWllZWUtPnBzID0gUlRMTElCX1BTX01CQ0FTVDsKKwkJYnJlYWs7CisJY2FzZSBJV19QT1dFUl9BTExfUjoKKwkJaWVlZS0+cHMgPSBSVExMSUJfUFNfVU5JQ0FTVCB8IFJUTExJQl9QU19NQkNBU1Q7CisJCWJyZWFrOworCisJY2FzZSBJV19QT1dFUl9PTjoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisKKwl9CitleGl0OgorCXVwKCZpZWVlLT53eF9zZW0pOworCXJldHVybiByZXQ7CisKK30KKworLyogdGhpcyBpcyBzdG9sZW4gZnJvbSBob3N0YXAgKi8KK2ludCBydGxsaWJfd3hfZ2V0X3Bvd2VyKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlpZiAoaWVlZS0+cHMgPT0gUlRMTElCX1BTX0RJU0FCTEVEKSB7CisJCXdycXUtPnBvd2VyLmRpc2FibGVkID0gMTsKKwkJZ290byBleGl0OworCX0KKworCXdycXUtPnBvd2VyLmRpc2FibGVkID0gMDsKKworCWlmICgod3JxdS0+cG93ZXIuZmxhZ3MgJiBJV19QT1dFUl9UWVBFKSA9PSBJV19QT1dFUl9USU1FT1VUKSB7CisJCXdycXUtPnBvd2VyLmZsYWdzID0gSVdfUE9XRVJfVElNRU9VVDsKKwkJd3JxdS0+cG93ZXIudmFsdWUgPSBpZWVlLT5wc190aW1lb3V0ICogMTAwMDsKKwl9IGVsc2UgeworCQl3cnF1LT5wb3dlci5mbGFncyA9IElXX1BPV0VSX1BFUklPRDsKKwkJd3JxdS0+cG93ZXIudmFsdWUgPSBpZWVlLT5wc19wZXJpb2QgKiAxMDAwOworCX0KKworCWlmICgoaWVlZS0+cHMgJiAoUlRMTElCX1BTX01CQ0FTVCB8IFJUTExJQl9QU19VTklDQVNUKSkgPT0KKwkgICAgKFJUTExJQl9QU19NQkNBU1QgfCBSVExMSUJfUFNfVU5JQ0FTVCkpCisJCXdycXUtPnBvd2VyLmZsYWdzIHw9IElXX1BPV0VSX0FMTF9SOworCWVsc2UgaWYgKGllZWUtPnBzICYgUlRMTElCX1BTX01CQ0FTVCkKKwkJd3JxdS0+cG93ZXIuZmxhZ3MgfD0gSVdfUE9XRVJfTVVMVElDQVNUX1I7CisJZWxzZQorCQl3cnF1LT5wb3dlci5mbGFncyB8PSBJV19QT1dFUl9VTklDQVNUX1I7CisKK2V4aXQ6CisJdXAoJmllZWUtPnd4X3NlbSk7CisJcmV0dXJuIHJldDsKKworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl90eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl90eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZTgwMDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3R4LmMKQEAgLTAsMCArMSw5NjcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKworICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgZmlsZSBjYWxsZWQgTElDRU5TRS4KKworICBDb250YWN0IEluZm9ybWF0aW9uOgorICBKYW1lcyBQLiBLZXRyZW5vcyA8aXB3MjEwMC1hZG1pbkBsaW51eC5pbnRlbC5jb20+CisgIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgRmV3IG1vZGlmaWNhdGlvbnMgZm9yIFJlYWx0ZWsncyBXaS1GaSBkcml2ZXJzIGJ5CisgIEFuZHJlYSBNZXJlbGxvIDxhbmRyZWFtcmxAdGlzY2FsaS5pdD4KKworICBBIHNwZWNpYWwgdGhhbmtzIGdvZXMgdG8gUmVhbHRlayBmb3IgdGhlaXIgc3VwcG9ydCAhCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKworI2luY2x1ZGUgInJ0bGxpYi5oIgorCisvKgorCisKKzgwMi4xMSBEYXRhIEZyYW1lCisKKworODAyLjExIGZyYW1lX2NvbnRvcmwgZm9yIGRhdGEgZnJhbWVzIC0gMiBieXRlcworICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCitiaXRzIHwgMCAgfCAgMSAgfCAgMiAgfCAgMyAgfCAgNCAgfCAgNSAgfCAgNiAgfCAgNyAgfCAgOCAgfCAgOSAgfCAgYSAgfCAgYiAgfCAgYyAgfCAgZCAgfCAgZSAgIHwKKyAgICAgfC0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS0tfAordmFsICB8IDAgIHwgIDAgIHwgIDAgIHwgIDEgIHwgIHggIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDEgIHwgIDAgIHwgIHggIHwgIHggIHwgIHggIHwgIHggIHwgIHggICB8CisgICAgIHwtLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tLXwKK2Rlc2MgfCBeLXZlci1eICB8ICBedHlwZS1eICB8ICBeLS0tLS1zdWJ0eXBlLS0tLS1eICB8IHRvICB8ZnJvbSB8bW9yZSB8cmV0cnl8IHB3ciB8bW9yZSB8d2VwICAgfAorICAgICB8CSAgfAkgICB8IHg9MCBkYXRhLHg9MSBkYXRhK2FjayB8IERTICB8IERTICB8ZnJhZyB8ICAgICB8IG1nbSB8ZGF0YSB8ICAgICAgfAorICAgICAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisJCQkJCQkgICAgL1wKKwkJCQkJCSAgICB8Cis4MDIuMTEgRGF0YSBGcmFtZQkJCQkgICB8CisJICAgLC0tLS0tLS0tLSAnY3RybCcgZXhwYW5kcyB0byA+LS0tLS0tLS0tLS0nCisJICB8CisgICAgICAsLS0nLS0tLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCitCeXRlcyB8ICAyICAgfCAgMiAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgICA2ICAgIHwgIDIgICB8IDAuLjIzMTIgfCAgIDQgIHwKKyAgICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfAorRGVzYy4gfCBjdHJsIHwgZHVyYSB8ICBEQS9SQSAgfCAgIFRBICAgIHwgICAgU0EgICB8IFNlcXUgfCAgRnJhbWUgIHwgIGZjcyB8CisgICAgICB8ICAgICAgfCB0aW9uIHwgKEJTU0lEKSB8CSB8CSB8IGVuY2UgfCAgZGF0YSAgIHwgICAgICB8CisgICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CSB8LS0tLS0tJworVG90YWw6IDI4IG5vbi1kYXRhIGJ5dGVzCQkJCSBgLS0tLS4tLS0tJworCQkJCQkJCSAgICAgIHwKKyAgICAgICAuLSAnRnJhbWUgZGF0YScgZXhwYW5kcyB0byA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworICAgICAgIHwKKyAgICAgICBWCisgICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorQnl0ZXMgfCAgMSAgIHwgIDEgICB8ICAgIDEgICAgfCAgICAzICAgICB8ICAyICAgfCAgMC0yMzA0IHwKKyAgICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18CitEZXNjLiB8IFNOQVAgfCBTTkFQIHwgQ29udHJvbCB8RXRoIFR1bm5lbHwgVHlwZSB8IElQICAgICAgfAorICAgICAgfCBEU0FQIHwgU1NBUCB8CSB8CSAgfCAgICAgIHwgUGFja2V0ICB8CisgICAgICB8IDB4QUEgfCAweEFBIHwweDAzIChVSSl8MHgwMC0wMC1GOHwgICAgICB8CSB8CisgICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CSB8CitUb3RhbDogOCBub24tZGF0YSBieXRlcwkJCSBgLS0tLS4tLS0tJworCQkJCQkJICAgICB8CisgICAgICAgLi0gJ0lQIFBhY2tldCcgZXhwYW5kcywgaWYgV0VQIGVuYWJsZWQsIHRvIDwtLScKKyAgICAgICB8CisgICAgICAgVgorICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorQnl0ZXMgfCAgNCAgfCAgIDAtMjI5NiAgfCAgNCAgfAorICAgICAgfC0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tfAorRGVzYy4gfCBJViAgfCBFbmNyeXB0ZWQgfCBJQ1YgfAorICAgICAgfCAgICAgfCBJUCBQYWNrZXQgfCAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworVG90YWw6IDggbm9uLWRhdGEgYnl0ZXMKKworCis4MDIuMyBFdGhlcm5ldCBEYXRhIEZyYW1lCisKKyAgICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK0J5dGVzIHwgICA2ICAgfCAgIDYgICB8ICAyICAgfCAgVmFyaWFibGUgfCAgIDQgIHwKKyAgICAgIHwtLS0tLS0tfC0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLXwKK0Rlc2MuIHwgRGVzdC4gfCBTb3VyY2V8IFR5cGUgfCBJUCBQYWNrZXQgfCAgZmNzIHwKKyAgICAgIHwgIE1BQyAgfCAgTUFDICB8ICAgICAgfAkgICB8ICAgICAgfAorICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworVG90YWw6IDE4IG5vbi1kYXRhIGJ5dGVzCisKK0luIHRoZSBldmVudCB0aGF0IGZyYWdtZW50YXRpb24gaXMgcmVxdWlyZWQsIHRoZSBpbmNvbWluZyBwYXlsb2FkIGlzIHNwbGl0IGludG8KK04gcGFydHMgb2Ygc2l6ZSBpZWVlLT5mdHMuICBUaGUgZmlyc3QgZnJhZ21lbnQgY29udGFpbnMgdGhlIFNOQVAgaGVhZGVyIGFuZCB0aGUKK3JlbWFpbmluZyBwYWNrZXRzIGFyZSBqdXN0IGRhdGEuCisKK0lmIGVuY3J5cHRpb24gaXMgZW5hYmxlZCwgZWFjaCBmcmFnbWVudCBwYXlsb2FkIHNpemUgaXMgcmVkdWNlZCBieSBlbm91Z2ggc3BhY2UKK3RvIGFkZCB0aGUgcHJlZml4IGFuZCBwb3N0Zml4IChJViBhbmQgSUNWIHRvdGFsbGluZyA4IGJ5dGVzIGluIHRoZSBjYXNlIG9mIFdFUCkKK1NvIGlmIHlvdSBoYXZlIDE1MDAgYnl0ZXMgb2YgcGF5bG9hZCB3aXRoIGllZWUtPmZ0cyBzZXQgdG8gNTAwIHdpdGhvdXQKK2VuY3J5cHRpb24gaXQgd2lsbCB0YWtlIDMgZnJhbWVzLiAgV2l0aCBXRVAgaXQgd2lsbCB0YWtlIDQgZnJhbWVzIGFzIHRoZQorcGF5bG9hZCBvZiBlYWNoIGZyYW1lIGlzIHJlZHVjZWQgdG8gNDkyIGJ5dGVzLgorCisqIFNLQiB2aXN1YWxpemF0aW9uCisqCisqICAsLSBza2ItPmRhdGEKKyogfAorKiB8ICAgIEVUSEVSTkVUIEhFQURFUgksLTwtLSBQQVlMT0FECisqIHwJCQkgICB8ICAgICAxNCBieXRlcyBmcm9tIHNrYi0+ZGF0YQorKiB8ICAyIGJ5dGVzIGZvciBUeXBlIC0tPiAsVC4gfCAgICAgKHNpemVvZiBldGhoZHIpCisqIHwJCSAgICAgICB8IHwgfAorKiB8LC1EZXN0Li0tLiAsLS1TcmMuLS0tLiB8IHwgfAorKiB8ICA2IGJ5dGVzfCB8IDYgYnl0ZXMgfCB8IHwgfAorKiB2CSB8IHwJIHwgfCB8IHwKKyogMAkgfCB2ICAgICAgIDEgfCB2IHwgdgkgICAyCisqIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNQorKiAgICAgXiAgICAgfCBeCSB8IF4gfAorKiAgICAgfCAgICAgfCB8CSB8IHwgfAorKiAgICAgfCAgICAgfCB8CSB8IGBUJyA8LS0tLSAyIGJ5dGVzIGZvciBUeXBlCisqICAgICB8ICAgICB8IHwJIHwKKyogICAgIHwgICAgIHwgJy0tLVNOQVAtLScgPC0tLS0tLS0tIDYgYnl0ZXMgZm9yIFNOQVAKKyogICAgIHwgICAgIHwKKyogICAgIGAtSVYtLScgPC0tLS0tLS0tLS0tLS0tLS0tLS0tIDQgYnl0ZXMgZm9yIElWIChXRVApCisqCisqICAgICAgU05BUCBIRUFERVIKKyoKKyovCisKK3N0YXRpYyB1OCBQODAyXzFIX09VSVtQODAyMTFfT1VJX0xFTl0gPSB7IDB4MDAsIDB4MDAsIDB4ZjggfTsKK3N0YXRpYyB1OCBSRkMxMDQyX09VSVtQODAyMTFfT1VJX0xFTl0gPSB7IDB4MDAsIDB4MDAsIDB4MDAgfTsKKworaW5saW5lIGludCBydGxsaWJfcHV0X3NuYXAodTggKmRhdGEsIHUxNiBoX3Byb3RvKQoreworCXN0cnVjdCBydGxsaWJfc25hcF9oZHIgKnNuYXA7CisJdTggKm91aTsKKworCXNuYXAgPSAoc3RydWN0IHJ0bGxpYl9zbmFwX2hkciAqKWRhdGE7CisJc25hcC0+ZHNhcCA9IDB4YWE7CisJc25hcC0+c3NhcCA9IDB4YWE7CisJc25hcC0+Y3RybCA9IDB4MDM7CisKKwlpZiAoaF9wcm90byA9PSAweDgxMzcgfHwgaF9wcm90byA9PSAweDgwZjMpCisJCW91aSA9IFA4MDJfMUhfT1VJOworCWVsc2UKKwkJb3VpID0gUkZDMTA0Ml9PVUk7CisJc25hcC0+b3VpWzBdID0gb3VpWzBdOworCXNuYXAtPm91aVsxXSA9IG91aVsxXTsKKwlzbmFwLT5vdWlbMl0gPSBvdWlbMl07CisKKwkqKHUxNiAqKShkYXRhICsgU05BUF9TSVpFKSA9IGh0b25zKGhfcHJvdG8pOworCisJcmV0dXJuIFNOQVBfU0laRSArIHNpemVvZih1MTYpOworfQorCitpbnQgcnRsbGliX2VuY3J5cHRfZnJhZ21lbnQoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpmcmFnLAorCQkJICAgIGludCBoZHJfbGVuKQoreworCXN0cnVjdCBydGxsaWJfY3J5cHRfZGF0YSAqY3J5cHQgPSBOVUxMOworCWludCByZXM7CisKKwljcnlwdCA9IGllZWUtPmNyeXB0W2llZWUtPnR4X2tleWlkeF07CisKKwlpZiAoIShjcnlwdCAmJiBjcnlwdC0+b3BzKSkgeworCQlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT0+JXMoKSwgY3J5cHQgaXMgbnVsbFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLTE7CisJfQorCS8qIFRvIGVuY3J5cHQsIGZyYW1lIGZvcm1hdCBpczoKKwkgKiBJViAoNCBieXRlcyksIGNsZWFyIHBheWxvYWQgKGluY2x1ZGluZyBTTkFQKSwgSUNWICg0IGJ5dGVzKSAqLworCisJLyogSG9zdC1iYXNlZCBJRUVFIDgwMi4xMSBmcmFnbWVudGF0aW9uIGZvciBUWCBpcyBub3QgeWV0IHN1cHBvcnRlZCwgc28KKwkgKiBjYWxsIGJvdGggTVNEVSBhbmQgTVBEVSBlbmNyeXB0aW9uIGZ1bmN0aW9ucyBmcm9tIGhlcmUuICovCisJYXRvbWljX2luYygmY3J5cHQtPnJlZmNudCk7CisJcmVzID0gMDsKKwlpZiAoY3J5cHQtPm9wcy0+ZW5jcnlwdF9tc2R1KQorCQlyZXMgPSBjcnlwdC0+b3BzLT5lbmNyeXB0X21zZHUoZnJhZywgaGRyX2xlbiwgY3J5cHQtPnByaXYpOworCWlmIChyZXMgPT0gMCAmJiBjcnlwdC0+b3BzLT5lbmNyeXB0X21wZHUpCisJCXJlcyA9IGNyeXB0LT5vcHMtPmVuY3J5cHRfbXBkdShmcmFnLCBoZHJfbGVuLCBjcnlwdC0+cHJpdik7CisKKwlhdG9taWNfZGVjKCZjcnlwdC0+cmVmY250KTsKKwlpZiAocmVzIDwgMCkgeworCQlwcmludGsoS0VSTl9JTkZPICIlczogRW5jcnlwdGlvbiBmYWlsZWQ6IGxlbj0lZC5cbiIsCisJCSAgICAgICBpZWVlLT5kZXYtPm5hbWUsIGZyYWctPmxlbik7CisJCWllZWUtPmllZWVfc3RhdHMudHhfZGlzY2FyZHMrKzsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisKK3ZvaWQgcnRsbGliX3R4Yl9mcmVlKHN0cnVjdCBydGxsaWJfdHhiICp0eGIpCit7CisJaWYgKHVubGlrZWx5KCF0eGIpKQorCQlyZXR1cm47CisJa2ZyZWUodHhiKTsKK30KKworc3RhdGljIHN0cnVjdCBydGxsaWJfdHhiICpydGxsaWJfYWxsb2NfdHhiKGludCBucl9mcmFncywgaW50IHR4Yl9zaXplLAorCQkJCQkgICBnZnBfdCBnZnBfbWFzaykKK3sKKwlzdHJ1Y3QgcnRsbGliX3R4YiAqdHhiOworCWludCBpOworCXR4YiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBydGxsaWJfdHhiKSArIChzaXplb2YodTggKikgKiBucl9mcmFncyksCisJCSAgICAgIGdmcF9tYXNrKTsKKwlpZiAoIXR4YikKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQodHhiLCAwLCBzaXplb2Yoc3RydWN0IHJ0bGxpYl90eGIpKTsKKwl0eGItPm5yX2ZyYWdzID0gbnJfZnJhZ3M7CisJdHhiLT5mcmFnX3NpemUgPSB0eGJfc2l6ZTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9mcmFnczsgaSsrKSB7CisJCXR4Yi0+ZnJhZ21lbnRzW2ldID0gZGV2X2FsbG9jX3NrYih0eGJfc2l6ZSk7CisJCWlmICh1bmxpa2VseSghdHhiLT5mcmFnbWVudHNbaV0pKSB7CisJCQlpLS07CisJCQlicmVhazsKKwkJfQorCQltZW1zZXQodHhiLT5mcmFnbWVudHNbaV0tPmNiLCAwLCBzaXplb2YodHhiLT5mcmFnbWVudHNbaV0tPmNiKSk7CisJfQorCWlmICh1bmxpa2VseShpICE9IG5yX2ZyYWdzKSkgeworCQl3aGlsZSAoaSA+PSAwKQorCQkJZGV2X2tmcmVlX3NrYl9hbnkodHhiLT5mcmFnbWVudHNbaS0tXSk7CisJCWtmcmVlKHR4Yik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gdHhiOworfQorCitzdGF0aWMgaW50IHJ0bGxpYl9jbGFzc2lmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCBiSXNBbXNkdSkKK3sKKwlzdHJ1Y3QgZXRoaGRyICpldGg7CisJc3RydWN0IGlwaGRyICppcDsKKworCWV0aCA9IChzdHJ1Y3QgZXRoaGRyICopc2tiLT5kYXRhOworCWlmIChldGgtPmhfcHJvdG8gIT0gaHRvbnMoRVRIX1BfSVApKQorCQlyZXR1cm4gMDsKKworCVJUTExJQl9ERUJVR19EQVRBKFJUTExJQl9ETF9EQVRBLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlpcCA9IGlwX2hkcihza2IpOworCXN3aXRjaCAoaXAtPnRvcyAmIDB4ZmMpIHsKKwljYXNlIDB4MjA6CisJCXJldHVybiAyOworCWNhc2UgMHg0MDoKKwkJcmV0dXJuIDE7CisJY2FzZSAweDYwOgorCQlyZXR1cm4gMzsKKwljYXNlIDB4ODA6CisJCXJldHVybiA0OworCWNhc2UgMHhhMDoKKwkJcmV0dXJuIDU7CisJY2FzZSAweGMwOgorCQlyZXR1cm4gNjsKKwljYXNlIDB4ZTA6CisJCXJldHVybiA3OworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIHZvaWQgcnRsbGliX3R4X3F1ZXJ5X2FnZ19jYXAoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgIHN0cnVjdCBjYl9kZXNjICp0Y2JfZGVzYykKK3sKKwlzdHJ1Y3QgcnRfaGlfdGhyb3VnaHB1dCAqcEhUSW5mbyA9IGllZWUtPnBIVEluZm87CisJc3RydWN0IHR4X3RzX3JlY29yZCAqcFR4VHMgPSBOVUxMOworCXN0cnVjdCBydGxsaWJfaGRyXzFhZGRyKiBoZHIgPSAoc3RydWN0IHJ0bGxpYl9oZHJfMWFkZHIgKilza2ItPmRhdGE7CisKKwlpZiAocnRsbGliX2FjdF9zY2FubmluZyhpZWVlLCBmYWxzZSkpCisJCXJldHVybjsKKworCWlmICghcEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgfHwgIXBIVEluZm8tPmJFbmFibGVIVCkKKwkJcmV0dXJuOworCWlmICghSXNRb1NEYXRhRnJhbWUoc2tiLT5kYXRhKSkKKwkJcmV0dXJuOworCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSB8fAorCSAgICBpc19icm9hZGNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSkKKwkJcmV0dXJuOworCisJaWYgKHRjYl9kZXNjLT5iZGhjcCB8fCBpZWVlLT5DbnRBZnRlckxpbmsgPCAyKQorCQlyZXR1cm47CisKKwlpZiAocEhUSW5mby0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9UWF9OT19BR0dSRUdBVElPTikKKwkJcmV0dXJuOworCisJaWYgKCFpZWVlLT5HZXRObW9kZVN1cHBvcnRCeVNlY0NmZyhpZWVlLT5kZXYpKQorCQlyZXR1cm47CisJaWYgKHBIVEluZm8tPmJDdXJyZW50QU1QRFVFbmFibGUpIHsKKwkJaWYgKCFHZXRUcyhpZWVlLCAoc3RydWN0IHRzX2NvbW1vbl9pbmZvICoqKSgmcFR4VHMpLCBoZHItPmFkZHIxLAorCQkgICAgc2tiLT5wcmlvcml0eSwgVFhfRElSLCB0cnVlKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGNhbid0IGdldCBUU1xuIiwgX19mdW5jX18pOworCQkJcmV0dXJuOworCQl9CisJCWlmIChwVHhUcy0+VHhBZG1pdHRlZEJBUmVjb3JkLmJWYWxpZCA9PSBmYWxzZSkgeworCQkJaWYgKGllZWUtPndwYV9pZV9sZW4gJiYgKGllZWUtPnBhaXJ3aXNlX2tleV90eXBlID09CisJCQkgICAgS0VZX1RZUEVfTkEpKSB7CisJCQkJOworCQkJfSBlbHNlIGlmICh0Y2JfZGVzYy0+YmRoY3AgPT0gMSkgeworCQkJCTsKKwkJCX0gZWxzZSBpZiAoIXBUeFRzLT5iRGlzYWJsZV9BZGRCYSkgeworCQkJCVRzU3RhcnRBZGRCYVByb2Nlc3MoaWVlZSwgcFR4VHMpOworCQkJfQorCQkJZ290byBGT1JDRURfQUdHX1NFVFRJTkc7CisJCX0gZWxzZSBpZiAocFR4VHMtPmJVc2luZ0JhID09IGZhbHNlKSB7CisJCQlpZiAoU05fTEVTUyhwVHhUcy0+VHhBZG1pdHRlZEJBUmVjb3JkLkJhU3RhcnRTZXFDdHJsLmZpZWxkLlNlcU51bSwKKwkJCSAgIChwVHhUcy0+VHhDdXJTZXErMSklNDA5NikpCisJCQkJcFR4VHMtPmJVc2luZ0JhID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCQlnb3RvIEZPUkNFRF9BR0dfU0VUVElORzsKKwkJfQorCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSB7CisJCQl0Y2JfZGVzYy0+YkFNUERVRW5hYmxlID0gdHJ1ZTsKKwkJCXRjYl9kZXNjLT5hbXBkdV9mYWN0b3IgPSBwSFRJbmZvLT5DdXJyZW50QU1QRFVGYWN0b3I7CisJCQl0Y2JfZGVzYy0+YW1wZHVfZGVuc2l0eSA9IHBIVEluZm8tPkN1cnJlbnRNUERVRGVuc2l0eTsKKwkJfQorCX0KK0ZPUkNFRF9BR0dfU0VUVElORzoKKwlzd2l0Y2ggKHBIVEluZm8tPkZvcmNlZEFNUERVTW9kZSkgeworCWNhc2UgSFRfQUdHX0FVVE86CisJCWJyZWFrOworCisJY2FzZSBIVF9BR0dfRk9SQ0VfRU5BQkxFOgorCQl0Y2JfZGVzYy0+YkFNUERVRW5hYmxlID0gdHJ1ZTsKKwkJdGNiX2Rlc2MtPmFtcGR1X2RlbnNpdHkgPSBwSFRJbmZvLT5Gb3JjZWRNUERVRGVuc2l0eTsKKwkJdGNiX2Rlc2MtPmFtcGR1X2ZhY3RvciA9IHBIVEluZm8tPkZvcmNlZEFNUERVRmFjdG9yOworCQlicmVhazsKKworCWNhc2UgSFRfQUdHX0ZPUkNFX0RJU0FCTEU6CisJCXRjYl9kZXNjLT5iQU1QRFVFbmFibGUgPSBmYWxzZTsKKwkJdGNiX2Rlc2MtPmFtcGR1X2RlbnNpdHkgPSAwOworCQl0Y2JfZGVzYy0+YW1wZHVfZmFjdG9yID0gMDsKKwkJYnJlYWs7CisJfQorCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgcnRsbGliX3F1cmV5X1Nob3J0UHJlYW1ibGVNb2RlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJCQkgICBzdHJ1Y3QgY2JfZGVzYyAqdGNiX2Rlc2MpCit7CisJdGNiX2Rlc2MtPmJVc2VTaG9ydFByZWFtYmxlID0gZmFsc2U7CisJaWYgKHRjYl9kZXNjLT5kYXRhX3JhdGUgPT0gMikKKwkJcmV0dXJuOworCWVsc2UgaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYKKwkJIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9QUkVBTUJMRSkKKwkJdGNiX2Rlc2MtPmJVc2VTaG9ydFByZWFtYmxlID0gdHJ1ZTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHJ0bGxpYl9xdWVyeV9IVENhcFNob3J0R0koc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkJICAgICAgc3RydWN0IGNiX2Rlc2MgKnRjYl9kZXNjKQoreworCXN0cnVjdCBydF9oaV90aHJvdWdocHV0ICpwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKworCXRjYl9kZXNjLT5iVXNlU2hvcnRHSQkJPSBmYWxzZTsKKworCWlmICghcEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgfHwgIXBIVEluZm8tPmJFbmFibGVIVCkKKwkJcmV0dXJuOworCisJaWYgKHBIVEluZm8tPmJGb3JjZWRTaG9ydEdJKSB7CisJCXRjYl9kZXNjLT5iVXNlU2hvcnRHSSA9IHRydWU7CisJCXJldHVybjsKKwl9CisKKwlpZiAoKHBIVEluZm8tPmJDdXJCVzQwTUh6ID09IHRydWUpICYmIHBIVEluZm8tPmJDdXJTaG9ydEdJNDBNSHopCisJCXRjYl9kZXNjLT5iVXNlU2hvcnRHSSA9IHRydWU7CisJZWxzZSBpZiAoKHBIVEluZm8tPmJDdXJCVzQwTUh6ID09IGZhbHNlKSAmJiBwSFRJbmZvLT5iQ3VyU2hvcnRHSTIwTUh6KQorCQl0Y2JfZGVzYy0+YlVzZVNob3J0R0kgPSB0cnVlOworfQorCitzdGF0aWMgdm9pZCBydGxsaWJfcXVlcnlfQmFuZHdpZHRoTW9kZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKKwkJCQkgICAgICAgc3RydWN0IGNiX2Rlc2MgKnRjYl9kZXNjKQoreworCXN0cnVjdCBydF9oaV90aHJvdWdocHV0ICpwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKworCXRjYl9kZXNjLT5iUGFja2V0QlcgPSBmYWxzZTsKKworCWlmICghcEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgfHwgIXBIVEluZm8tPmJFbmFibGVIVCkKKwkJcmV0dXJuOworCisJaWYgKHRjYl9kZXNjLT5iTXVsdGljYXN0IHx8IHRjYl9kZXNjLT5iQnJvYWRjYXN0KQorCQlyZXR1cm47CisKKwlpZiAoKHRjYl9kZXNjLT5kYXRhX3JhdGUgJiAweDgwKSA9PSAwKQorCQlyZXR1cm47CisJaWYgKHBIVEluZm8tPmJDdXJCVzQwTUh6ICYmIHBIVEluZm8tPmJDdXJUeEJXNDBNSHogJiYKKwkgICAgIWllZWUtPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC5iZm9yY2VkX3R4MjBNaHopCisJCXRjYl9kZXNjLT5iUGFja2V0QlcgPSB0cnVlOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgcnRsbGliX3F1ZXJ5X3Byb3RlY3Rpb25tb2RlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJCQlzdHJ1Y3QgY2JfZGVzYyAqdGNiX2Rlc2MsCisJCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJdGNiX2Rlc2MtPmJSVFNTVEJDCQkJPSBmYWxzZTsKKwl0Y2JfZGVzYy0+YlJUU1VzZVNob3J0R0kJCT0gZmFsc2U7CisJdGNiX2Rlc2MtPmJDVFNFbmFibGUJCQk9IGZhbHNlOworCXRjYl9kZXNjLT5SVFNTQwkJCQk9IDA7CisJdGNiX2Rlc2MtPmJSVFNCVwkJCT0gZmFsc2U7CisKKwlpZiAodGNiX2Rlc2MtPmJCcm9hZGNhc3QgfHwgdGNiX2Rlc2MtPmJNdWx0aWNhc3QpCisJCXJldHVybjsKKworCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihza2ItPmRhdGErMTYpKQorCQlyZXR1cm47CisKKwlpZiAoaWVlZS0+bW9kZSA8IElFRUVfTl8yNEcpIHsKKwkJaWYgKHNrYi0+bGVuID4gaWVlZS0+cnRzKSB7CisJCQl0Y2JfZGVzYy0+YlJUU0VuYWJsZSA9IHRydWU7CisJCQl0Y2JfZGVzYy0+cnRzX3JhdGUgPSBNR05fMjRNOworCQl9IGVsc2UgaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5idXNlcHJvdGVjdGlvbikgeworCQkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgPSB0cnVlOworCQkJdGNiX2Rlc2MtPmJDVFNFbmFibGUgPSB0cnVlOworCQkJdGNiX2Rlc2MtPnJ0c19yYXRlID0gTUdOXzI0TTsKKwkJfQorCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJc3RydWN0IHJ0X2hpX3Rocm91Z2hwdXQgKnBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOworCQl3aGlsZSAodHJ1ZSkgeworCQkJaWYgKHBIVEluZm8tPklPVEFjdGlvbiAmIEhUX0lPVF9BQ1RfRk9SQ0VEX0NUUzJTRUxGKSB7CisJCQkJdGNiX2Rlc2MtPmJDVFNFbmFibGUJPSB0cnVlOworCQkJCXRjYl9kZXNjLT5ydHNfcmF0ZSAgPQlNR05fMjRNOworCQkJCXRjYl9kZXNjLT5iUlRTRW5hYmxlID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAocEhUSW5mby0+SU9UQWN0aW9uICYgKEhUX0lPVF9BQ1RfRk9SQ0VEX1JUUyB8CisJCQkJICAgSFRfSU9UX0FDVF9QVVJFX05fTU9ERSkpIHsKKwkJCQl0Y2JfZGVzYy0+YlJUU0VuYWJsZSA9IHRydWU7CisJCQkJdGNiX2Rlc2MtPnJ0c19yYXRlICA9CU1HTl8yNE07CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJ1c2Vwcm90ZWN0aW9uKSB7CisJCQkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgPSB0cnVlOworCQkJCXRjYl9kZXNjLT5iQ1RTRW5hYmxlID0gdHJ1ZTsKKwkJCQl0Y2JfZGVzYy0+cnRzX3JhdGUgPSBNR05fMjRNOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ICAmJiBwSFRJbmZvLT5iRW5hYmxlSFQpIHsKKwkJCQl1OCBIVE9wTW9kZSA9IHBIVEluZm8tPkN1cnJlbnRPcE1vZGU7CisJCQkJaWYgKChwSFRJbmZvLT5iQ3VyQlc0ME1IeiAmJiAoSFRPcE1vZGUgPT0gMiB8fAorCQkJCSAgICAgSFRPcE1vZGUgPT0gMykpIHx8CisJCQkJICAgICAoIXBIVEluZm8tPmJDdXJCVzQwTUh6ICYmIEhUT3BNb2RlID09IDMpKSB7CisJCQkJCXRjYl9kZXNjLT5ydHNfcmF0ZSA9IE1HTl8yNE07CisJCQkJCXRjYl9kZXNjLT5iUlRTRW5hYmxlID0gdHJ1ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKHNrYi0+bGVuID4gaWVlZS0+cnRzKSB7CisJCQkJdGNiX2Rlc2MtPnJ0c19yYXRlID0gTUdOXzI0TTsKKwkJCQl0Y2JfZGVzYy0+YlJUU0VuYWJsZSA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAodGNiX2Rlc2MtPmJBTVBEVUVuYWJsZSkgeworCQkJCXRjYl9kZXNjLT5ydHNfcmF0ZSA9IE1HTl8yNE07CisJCQkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWdvdG8gTk9fUFJPVEVDVElPTjsKKwkJfQorCX0KKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfUFJFQU1CTEUpCisJCXRjYl9kZXNjLT5iVXNlU2hvcnRQcmVhbWJsZSA9IHRydWU7CisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpCisJCQlnb3RvIE5PX1BST1RFQ1RJT047CisJcmV0dXJuOworTk9fUFJPVEVDVElPTjoKKwl0Y2JfZGVzYy0+YlJUU0VuYWJsZQk9IGZhbHNlOworCXRjYl9kZXNjLT5iQ1RTRW5hYmxlCT0gZmFsc2U7CisJdGNiX2Rlc2MtPnJ0c19yYXRlCT0gMDsKKwl0Y2JfZGVzYy0+UlRTU0MJCT0gMDsKKwl0Y2JfZGVzYy0+YlJUU0JXCT0gZmFsc2U7Cit9CisKKworc3RhdGljIHZvaWQgcnRsbGliX3R4cmF0ZV9zZWxlY3Rtb2RlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJCSAgICAgc3RydWN0IGNiX2Rlc2MgKnRjYl9kZXNjKQoreworCWlmIChpZWVlLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrKQorCQl0Y2JfZGVzYy0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjayA9IHRydWU7CisKKwlpZiAoaWVlZS0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlKQorCQl0Y2JfZGVzYy0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlID0gdHJ1ZTsKKwlpZiAoIXRjYl9kZXNjLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrIHx8CisJICAgICF0Y2JfZGVzYy0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlKSB7CisJCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEgfHwKKwkJICAgIGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykKKwkJCXRjYl9kZXNjLT5SQVRSSW5kZXggPSAwOworCX0KK30KKwordTE2IHJ0bGxpYl9xdWVyeV9zZXFudW0oc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCisJCQl1OCAqZHN0KQoreworCXUxNiBzZXFudW0gPSAwOworCisJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRzdCkgfHwgaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoZHN0KSkKKwkJcmV0dXJuIDA7CisJaWYgKElzUW9TRGF0YUZyYW1lKHNrYi0+ZGF0YSkpIHsKKwkJc3RydWN0IHR4X3RzX3JlY29yZCAqcFRTID0gTlVMTDsKKwkJaWYgKCFHZXRUcyhpZWVlLCAoc3RydWN0IHRzX2NvbW1vbl9pbmZvICoqKSgmcFRTKSwgZHN0LAorCQkgICAgc2tiLT5wcmlvcml0eSwgVFhfRElSLCB0cnVlKSkKKwkJCXJldHVybiAwOworCQlzZXFudW0gPSBwVFMtPlR4Q3VyU2VxOworCQlwVFMtPlR4Q3VyU2VxID0gKHBUUy0+VHhDdXJTZXErMSklNDA5NjsKKwkJcmV0dXJuIHNlcW51bTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd21lX2Rvd25ncmFkZV9hYyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN3aXRjaCAoc2tiLT5wcmlvcml0eSkgeworCWNhc2UgNjoKKwljYXNlIDc6CisJCXNrYi0+cHJpb3JpdHkgPSA1OyAvKiBWTyAtPiBWSSAqLworCQlyZXR1cm4gMDsKKwljYXNlIDQ6CisJY2FzZSA1OgorCQlza2ItPnByaW9yaXR5ID0gMzsgLyogVkkgLT4gQkUgKi8KKwkJcmV0dXJuIDA7CisJY2FzZSAwOgorCWNhc2UgMzoKKwkJc2tiLT5wcmlvcml0eSA9IDE7IC8qIEJFIC0+IEJLICovCisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9Cit9CisKK2ludCBydGxsaWJfeG1pdF9pbnRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gKHN0cnVjdCBydGxsaWJfZGV2aWNlICopCisJCQkJICAgICBuZXRkZXZfcHJpdl9yc2woZGV2KTsKKwlzdHJ1Y3QgcnRsbGliX3R4YiAqdHhiID0gTlVMTDsKKwlzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkcnFvcyAqZnJhZ19oZHI7CisJaW50IGksIGJ5dGVzX3Blcl9mcmFnLCBucl9mcmFncywgYnl0ZXNfbGFzdF9mcmFnLCBmcmFnX3NpemU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmaWVlZS0+c3RhdHM7CisJaW50IGV0aGVyX3R5cGUgPSAwLCBlbmNyeXB0OworCWludCBieXRlcywgZmMsIHFvc19jdGwgPSAwLCBoZHJfbGVuOworCXN0cnVjdCBza19idWZmICpza2JfZnJhZzsKKwlzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkcnFvcyBoZWFkZXIgPSB7IC8qIEVuc3VyZSB6ZXJvIGluaXRpYWxpemVkICovCisJCS5kdXJhdGlvbl9pZCA9IDAsCisJCS5zZXFfY3RsID0gMCwKKwkJLnFvc19jdGwgPSAwCisJfTsKKwl1OCBkZXN0W0VUSF9BTEVOXSwgc3JjW0VUSF9BTEVOXTsKKwlpbnQgcW9zX2FjdGl2ZWQgPSBpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlOworCXN0cnVjdCBydGxsaWJfY3J5cHRfZGF0YSAqY3J5cHQgPSBOVUxMOworCXN0cnVjdCBjYl9kZXNjICp0Y2JfZGVzYzsKKwl1OCBiSXNNdWx0aWNhc3QgPSBmYWxzZTsKKwl1OCBJc0Ftc2R1ID0gZmFsc2U7CisJYm9vbAliZGhjcCA9IGZhbHNlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCS8qIElmIHRoZXJlIGlzIG5vIGRyaXZlciBoYW5kbGVyIHRvIHRha2UgdGhlIFRYQiwgZG9udCcgYm90aGVyCisJICogY3JlYXRpbmcgaXQuLi4gKi8KKwlpZiAoKCFpZWVlLT5oYXJkX3N0YXJ0X3htaXQgJiYgIShpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYKKwkgICBJRUVFX1NPRlRNQUNfVFhfUVVFVUUpKSB8fAorCSAgICgoIWllZWUtPnNvZnRtYWNfZGF0YV9oYXJkX3N0YXJ0X3htaXQgJiYKKwkgICAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19UWF9RVUVVRSkpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogTm8geG1pdCBoYW5kbGVyLlxuIiwKKwkJICAgICAgIGllZWUtPmRldi0+bmFtZSk7CisJCWdvdG8gc3VjY2VzczsKKwl9CisKKworCWlmIChsaWtlbHkoaWVlZS0+cmF3X3R4ID09IDApKSB7CisJCWlmICh1bmxpa2VseShza2ItPmxlbiA8IFNOQVBfU0laRSArIHNpemVvZih1MTYpKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHNrYiB0b28gc21hbGwgKCVkKS5cbiIsCisJCQlpZWVlLT5kZXYtPm5hbWUsIHNrYi0+bGVuKTsKKwkJCWdvdG8gc3VjY2VzczsKKwkJfQorCQkvKiBTYXZlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzICovCisJCW1lbWNweShkZXN0LCBza2ItPmRhdGEsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHNyYywgc2tiLT5kYXRhK0VUSF9BTEVOLCBFVEhfQUxFTik7CisKKwkJbWVtc2V0KHNrYi0+Y2IsIDAsIHNpemVvZihza2ItPmNiKSk7CisJCWV0aGVyX3R5cGUgPSBudG9ocygoKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGEpLT5oX3Byb3RvKTsKKworCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpIHsKKwkJCXR4YiA9IHJ0bGxpYl9hbGxvY190eGIoMSwgc2tiLT5sZW4sIEdGUF9BVE9NSUMpOworCQkJaWYgKHVubGlrZWx5KCF0eGIpKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSAiCisJCQkJICAgICAgICJUWEJcbiIsCisJCQkJaWVlZS0+ZGV2LT5uYW1lKTsKKwkJCQlnb3RvIGZhaWxlZDsKKwkJCX0KKworCQkJdHhiLT5lbmNyeXB0ZWQgPSAwOworCQkJdHhiLT5wYXlsb2FkX3NpemUgPSBza2ItPmxlbjsKKwkJCW1lbWNweShza2JfcHV0KHR4Yi0+ZnJhZ21lbnRzWzBdLCBza2ItPmxlbiksIHNrYi0+ZGF0YSwKKwkJCSAgICAgICBza2ItPmxlbik7CisKKwkJCWdvdG8gc3VjY2VzczsKKwkJfQorCisJCWlmIChza2ItPmxlbiA+IDI4MikgeworCQkJaWYgKEVUSF9QX0lQID09IGV0aGVyX3R5cGUpIHsKKwkJCQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwID0gKHN0cnVjdCBpcGhkciAqKQorCQkJCQkoKHU4ICopc2tiLT5kYXRhKzE0KTsKKwkJCQlpZiAoSVBQUk9UT19VRFAgPT0gaXAtPnByb3RvY29sKSB7CisJCQkJCXN0cnVjdCB1ZHBoZHIgKnVkcDsKKworCQkJCQl1ZHAgPSAoc3RydWN0IHVkcGhkciAqKSgodTggKilpcCArCisJCQkJCSAgICAgIChpcC0+aWhsIDw8IDIpKTsKKwkJCQkJaWYgKCgoKCh1OCAqKXVkcClbMV0gPT0gNjgpICYmCisJCQkJCSAgICgoKHU4ICopdWRwKVszXSA9PSA2NykpIHx8CisJCQkJCSAgICgoKCh1OCAqKXVkcClbMV0gPT0gNjcpICYmCisJCQkJCSAgICgoKHU4ICopdWRwKVszXSA9PSA2OCkpKSB7CisJCQkJCQliZGhjcCA9IHRydWU7CisJCQkJCQlpZWVlLT5MUFNEZWxheUNudCA9IDIwMDsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSBpZiAoRVRIX1BfQVJQID09IGV0aGVyX3R5cGUpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT09PT09PT09PT5ESENQICIKKwkJCQkgICAgICAgIlByb3RvY29sIHN0YXJ0IHR4IEFSUCBwa3QhIVxuIik7CisJCQkJYmRoY3AgPSB0cnVlOworCQkJCWllZWUtPkxQU0RlbGF5Q250ID0KKwkJCQkJIGllZWUtPmN1cnJlbnRfbmV0d29yay50aW0udGltX2NvdW50OworCQkJfQorCQl9CisKKwkJc2tiLT5wcmlvcml0eSA9IHJ0bGxpYl9jbGFzc2lmeShza2IsIElzQW1zZHUpOworCQljcnlwdCA9IGllZWUtPmNyeXB0W2llZWUtPnR4X2tleWlkeF07CisJCWVuY3J5cHQgPSAhKGV0aGVyX3R5cGUgPT0gRVRIX1BfUEFFICYmIGllZWUtPmllZWU4MDJfMXgpICYmCisJCQlpZWVlLT5ob3N0X2VuY3J5cHQgJiYgY3J5cHQgJiYgY3J5cHQtPm9wczsKKwkJaWYgKCFlbmNyeXB0ICYmIGllZWUtPmllZWU4MDJfMXggJiYKKwkJICAgIGllZWUtPmRyb3BfdW5lbmNyeXB0ZWQgJiYgZXRoZXJfdHlwZSAhPSBFVEhfUF9QQUUpIHsKKwkJCXN0YXRzLT50eF9kcm9wcGVkKys7CisJCQlnb3RvIHN1Y2Nlc3M7CisJCX0KKwkJaWYgKGNyeXB0ICYmICFlbmNyeXB0ICYmIGV0aGVyX3R5cGUgPT0gRVRIX1BfUEFFKSB7CisJCQlzdHJ1Y3QgZWFwb2wgKmVhcCA9IChzdHJ1Y3QgZWFwb2wgKikoc2tiLT5kYXRhICsKKwkJCQlzaXplb2Yoc3RydWN0IGV0aGhkcikgLSBTTkFQX1NJWkUgLQorCQkJCXNpemVvZih1MTYpKTsKKwkJCVJUTExJQl9ERUJVR19FQVAoIlRYOiBJRUVFIDgwMi4xMSBFQVBPTCBmcmFtZTogJXNcbiIsCisJCQkJZWFwX2dldF90eXBlKGVhcC0+dHlwZSkpOworCQl9CisKKwkJLyogQWR2YW5jZSB0aGUgU0tCIHRvIHRoZSBzdGFydCBvZiB0aGUgcGF5bG9hZCAqLworCQlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgZXRoaGRyKSk7CisKKwkJLyogRGV0ZXJtaW5lIHRvdGFsIGFtb3VudCBvZiBzdG9yYWdlIHJlcXVpcmVkIGZvciBUWEIgcGFja2V0cyAqLworCQlieXRlcyA9IHNrYi0+bGVuICsgU05BUF9TSVpFICsgc2l6ZW9mKHUxNik7CisKKwkJaWYgKGVuY3J5cHQpCisJCQlmYyA9IFJUTExJQl9GVFlQRV9EQVRBIHwgUlRMTElCX0ZDVExfV0VQOworCQllbHNlCisJCQlmYyA9IFJUTExJQl9GVFlQRV9EQVRBOworCisJCWlmIChxb3NfYWN0aXZlZCkKKwkJCWZjIHw9IFJUTExJQl9TVFlQRV9RT1NfREFUQTsKKwkJZWxzZQorCQkJZmMgfD0gUlRMTElCX1NUWVBFX0RBVEE7CisKKwkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkgeworCQkJZmMgfD0gUlRMTElCX0ZDVExfVE9EUzsKKwkJCS8qIFRvIERTOiBBZGRyMSA9IEJTU0lELCBBZGRyMiA9IFNBLAorCQkJQWRkcjMgPSBEQSAqLworCQkJbWVtY3B5KCZoZWFkZXIuYWRkcjEsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwKKwkJCSAgICAgICBFVEhfQUxFTik7CisJCQltZW1jcHkoJmhlYWRlci5hZGRyMiwgJnNyYywgRVRIX0FMRU4pOworCQkJaWYgKElzQW1zZHUpCisJCQkJbWVtY3B5KCZoZWFkZXIuYWRkcjMsCisJCQkJICAgICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwgRVRIX0FMRU4pOworCQkJZWxzZQorCQkJCW1lbWNweSgmaGVhZGVyLmFkZHIzLCAmZGVzdCwgRVRIX0FMRU4pOworCQl9IGVsc2UgaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgeworCQkJLyogbm90IEZyb20vVG8gRFM6IEFkZHIxID0gREEsIEFkZHIyID0gU0EsCisJCQlBZGRyMyA9IEJTU0lEICovCisJCQltZW1jcHkoJmhlYWRlci5hZGRyMSwgZGVzdCwgRVRIX0FMRU4pOworCQkJbWVtY3B5KCZoZWFkZXIuYWRkcjIsIHNyYywgRVRIX0FMRU4pOworCQkJbWVtY3B5KCZoZWFkZXIuYWRkcjMsIGllZWUtPmN1cnJlbnRfbmV0d29yay5ic3NpZCwKKwkJCSAgICAgICBFVEhfQUxFTik7CisJCX0KKworCQliSXNNdWx0aWNhc3QgPSBpc19icm9hZGNhc3RfZXRoZXJfYWRkcihoZWFkZXIuYWRkcjEpIHx8CisJCQkgICAgICAgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGVhZGVyLmFkZHIxKTsKKworCQloZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoZmMpOworCisJCS8qIERldGVybWluZSBmcmFnbWVudGF0aW9uIHNpemUgYmFzZWQgb24gZGVzdGluYXRpb24gKG11bHRpY2FzdAorCQkqIGFuZCBicm9hZGNhc3QgYXJlIG5vdCBmcmFnbWVudGVkKSAqLworCQlpZiAoYklzTXVsdGljYXN0KSB7CisJCQlmcmFnX3NpemUgPSBNQVhfRlJBR19USFJFU0hPTEQ7CisJCQlxb3NfY3RsIHw9IFFPU19DVExfTk9UQ09OVEFJTl9BQ0s7CisJCX0gZWxzZSB7CisJCQlmcmFnX3NpemUgPSBpZWVlLT5mdHM7CisJCQlxb3NfY3RsID0gMDsKKwkJfQorCisJCWlmIChxb3NfYWN0aXZlZCkgeworCQkJaGRyX2xlbiA9IFJUTExJQl8zQUREUl9MRU4gKyAyOworCisJCS8qIGluIGNhc2Ugd2UgYXJlIGEgY2xpZW50IHZlcmlmeSBhY20gaXMgbm90IHNldCBmb3IgdGhpcyBhYyAqLworCQl3aGlsZSAodW5saWtlbHkoaWVlZS0+d21tX2FjbSAmICgweDAxIDw8IHNrYi0+cHJpb3JpdHkpKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAic2tiLT5wcmlvcml0eSA9ICV4XG4iLCBza2ItPnByaW9yaXR5KTsKKwkJCWlmICh3bWVfZG93bmdyYWRlX2FjKHNrYikpCisJCQkJYnJlYWs7CisJCQlwcmludGsoS0VSTl9JTkZPICJjb252ZXJ0ZWQgc2tiLT5wcmlvcml0eSA9ICV4XG4iLAorCQkJICAgICAgIHNrYi0+cHJpb3JpdHkpOworCQkgfQorCQkJcW9zX2N0bCB8PSBza2ItPnByaW9yaXR5OworCQkJaGVhZGVyLnFvc19jdGwgPSBjcHVfdG9fbGUxNihxb3NfY3RsICYgUlRMTElCX1FPU19USUQpOworCQl9IGVsc2UgeworCQkJaGRyX2xlbiA9IFJUTExJQl8zQUREUl9MRU47CisJCX0KKwkJLyogRGV0ZXJtaW5lIGFtb3VudCBvZiBwYXlsb2FkIHBlciBmcmFnbWVudC4gIFJlZ2FyZGxlc3Mgb2YgaWYKKwkJICogdGhpcyBzdGFjayBpcyBwcm92aWRpbmcgdGhlIGZ1bGwgODAyLjExIGhlYWRlciwgb25lIHdpbGwKKwkJICogZXZlbnR1YWxseSBiZSBhZmZpeGVkIHRvIHRoaXMgZnJhZ21lbnQgLS0gc28gd2UgbXVzdCBhY2NvdW50CisJCSAqIGZvciBpdCB3aGVuIGRldGVybWluaW5nIHRoZSBhbW91bnQgb2YgcGF5bG9hZCBzcGFjZS4gKi8KKwkJYnl0ZXNfcGVyX2ZyYWcgPSBmcmFnX3NpemUgLSBoZHJfbGVuOworCQlpZiAoaWVlZS0+Y29uZmlnICYKKwkJICAgKENGR19SVExMSUJfQ09NUFVURV9GQ1MgfCBDRkdfUlRMTElCX1JFU0VSVkVfRkNTKSkKKwkJCWJ5dGVzX3Blcl9mcmFnIC09IFJUTExJQl9GQ1NfTEVOOworCisJCS8qIEVhY2ggZnJhZ21lbnQgbWF5IG5lZWQgdG8gaGF2ZSByb29tIGZvciBlbmNyeXB0aW9uZworCQkgKiBwcmUvcG9zdGZpeCAqLworCQlpZiAoZW5jcnlwdCkgeworCQkJYnl0ZXNfcGVyX2ZyYWcgLT0gY3J5cHQtPm9wcy0+ZXh0cmFfcHJlZml4X2xlbiArCisJCQkJY3J5cHQtPm9wcy0+ZXh0cmFfcG9zdGZpeF9sZW47CisJCX0KKwkJLyogTnVtYmVyIG9mIGZyYWdtZW50cyBpcyB0aGUgdG90YWwgYnl0ZXNfcGVyX2ZyYWcgLworCQkqIHBheWxvYWRfcGVyX2ZyYWdtZW50ICovCisJCW5yX2ZyYWdzID0gYnl0ZXMgLyBieXRlc19wZXJfZnJhZzsKKwkJYnl0ZXNfbGFzdF9mcmFnID0gYnl0ZXMgJSBieXRlc19wZXJfZnJhZzsKKwkJaWYgKGJ5dGVzX2xhc3RfZnJhZykKKwkJCW5yX2ZyYWdzKys7CisJCWVsc2UKKwkJCWJ5dGVzX2xhc3RfZnJhZyA9IGJ5dGVzX3Blcl9mcmFnOworCisJCS8qIFdoZW4gd2UgYWxsb2NhdGUgdGhlIFRYQiB3ZSBhbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIHRoZQorCQkgKiByZXNlcnZlIGFuZCBmdWxsIGZyYWdtZW50IGJ5dGVzIChieXRlc19wZXJfZnJhZyBkb2Vzbid0CisJCSAqIGluY2x1ZGUgcHJlZml4LCBwb3N0Zml4LCBoZWFkZXIsIEZDUywgZXRjLikgKi8KKwkJdHhiID0gcnRsbGliX2FsbG9jX3R4Yihucl9mcmFncywgZnJhZ19zaXplICsKKwkJCQkgICAgICAgaWVlZS0+dHhfaGVhZHJvb20sIEdGUF9BVE9NSUMpOworCQlpZiAodW5saWtlbHkoIXR4YikpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgVFhCXG4iLAorCQkJaWVlZS0+ZGV2LT5uYW1lKTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisJCXR4Yi0+ZW5jcnlwdGVkID0gZW5jcnlwdDsKKwkJdHhiLT5wYXlsb2FkX3NpemUgPSBieXRlczsKKworCQlpZiAocW9zX2FjdGl2ZWQpCisJCQl0eGItPnF1ZXVlX2luZGV4ID0gVVAyQUMoc2tiLT5wcmlvcml0eSk7CisJCWVsc2UKKwkJCXR4Yi0+cXVldWVfaW5kZXggPSBXTUVfQUNfQkU7CisKKwkJZm9yIChpID0gMDsgaSA8IG5yX2ZyYWdzOyBpKyspIHsKKwkJCXNrYl9mcmFnID0gdHhiLT5mcmFnbWVudHNbaV07CisJCQl0Y2JfZGVzYyA9IChzdHJ1Y3QgY2JfZGVzYyAqKShza2JfZnJhZy0+Y2IgKworCQkJCSAgICBNQVhfREVWX0FERFJfU0laRSk7CisJCQlpZiAocW9zX2FjdGl2ZWQpIHsKKwkJCQlza2JfZnJhZy0+cHJpb3JpdHkgPSBza2ItPnByaW9yaXR5OworCQkJCXRjYl9kZXNjLT5xdWV1ZV9pbmRleCA9ICBVUDJBQyhza2ItPnByaW9yaXR5KTsKKwkJCX0gZWxzZSB7CisJCQkJc2tiX2ZyYWctPnByaW9yaXR5ID0gV01FX0FDX0JFOworCQkJCXRjYl9kZXNjLT5xdWV1ZV9pbmRleCA9IFdNRV9BQ19CRTsKKwkJCX0KKwkJCXNrYl9yZXNlcnZlKHNrYl9mcmFnLCBpZWVlLT50eF9oZWFkcm9vbSk7CisKKwkJCWlmIChlbmNyeXB0KSB7CisJCQkJaWYgKGllZWUtPmh3c2VjX2FjdGl2ZSkKKwkJCQkJdGNiX2Rlc2MtPmJId1NlYyA9IDE7CisJCQkJZWxzZQorCQkJCQl0Y2JfZGVzYy0+Ykh3U2VjID0gMDsKKwkJCQlza2JfcmVzZXJ2ZShza2JfZnJhZywKKwkJCQkJICAgIGNyeXB0LT5vcHMtPmV4dHJhX3ByZWZpeF9sZW4pOworCQkJfSBlbHNlIHsKKwkJCQl0Y2JfZGVzYy0+Ykh3U2VjID0gMDsKKwkJCX0KKwkJCWZyYWdfaGRyID0gKHN0cnVjdCBydGxsaWJfaGRyXzNhZGRycW9zICopCisJCQkJICAgc2tiX3B1dChza2JfZnJhZywgaGRyX2xlbik7CisJCQltZW1jcHkoZnJhZ19oZHIsICZoZWFkZXIsIGhkcl9sZW4pOworCisJCQkvKiBJZiB0aGlzIGlzIG5vdCB0aGUgbGFzdCBmcmFnbWVudCwgdGhlbiBhZGQgdGhlCisJCQkgKiBNT1JFRlJBR1MgYml0IHRvIHRoZSBmcmFtZSBjb250cm9sICovCisJCQlpZiAoaSAhPSBucl9mcmFncyAtIDEpIHsKKwkJCQlmcmFnX2hkci0+ZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoCisJCQkJCWZjIHwgUlRMTElCX0ZDVExfTU9SRUZSQUdTKTsKKwkJCQlieXRlcyA9IGJ5dGVzX3Blcl9mcmFnOworCisJCQl9IGVsc2UgeworCQkJCS8qIFRoZSBsYXN0IGZyYWdtZW50IGhhcyB0aGUgcmVtYWluaW5nIGxlbmd0aCAqLworCQkJCWJ5dGVzID0gYnl0ZXNfbGFzdF9mcmFnOworCQkJfQorCQkJaWYgKChxb3NfYWN0aXZlZCkgJiYgKCFiSXNNdWx0aWNhc3QpKSB7CisJCQkJZnJhZ19oZHItPnNlcV9jdGwgPQorCQkJCQkgcnRsbGliX3F1ZXJ5X3NlcW51bShpZWVlLCBza2JfZnJhZywKKwkJCQkJCQkgICAgIGhlYWRlci5hZGRyMSk7CisJCQkJZnJhZ19oZHItPnNlcV9jdGwgPQorCQkJCQkgY3B1X3RvX2xlMTYoZnJhZ19oZHItPnNlcV9jdGw8PDQgfCBpKTsKKwkJCX0gZWxzZSB7CisJCQkJZnJhZ19oZHItPnNlcV9jdGwgPQorCQkJCQkgY3B1X3RvX2xlMTYoaWVlZS0+c2VxX2N0cmxbMF08PDQgfCBpKTsKKwkJCX0KKwkJCS8qIFB1dCBhIFNOQVAgaGVhZGVyIG9uIHRoZSBmaXJzdCBmcmFnbWVudCAqLworCQkJaWYgKGkgPT0gMCkgeworCQkJCXJ0bGxpYl9wdXRfc25hcCgKKwkJCQkJc2tiX3B1dChza2JfZnJhZywgU05BUF9TSVpFICsKKwkJCQkJc2l6ZW9mKHUxNikpLCBldGhlcl90eXBlKTsKKwkJCQlieXRlcyAtPSBTTkFQX1NJWkUgKyBzaXplb2YodTE2KTsKKwkJCX0KKworCQkJbWVtY3B5KHNrYl9wdXQoc2tiX2ZyYWcsIGJ5dGVzKSwgc2tiLT5kYXRhLCBieXRlcyk7CisKKwkJCS8qIEFkdmFuY2UgdGhlIFNLQi4uLiAqLworCQkJc2tiX3B1bGwoc2tiLCBieXRlcyk7CisKKwkJCS8qIEVuY3J5cHRpb24gcm91dGluZSB3aWxsIG1vdmUgdGhlIGhlYWRlciBmb3J3YXJkIGluCisJCQkgKiBvcmRlciB0byBpbnNlcnQgdGhlIElWIGJldHdlZW4gdGhlIGhlYWRlciBhbmQgdGhlCisJCQkgKiBwYXlsb2FkICovCisJCQlpZiAoZW5jcnlwdCkKKwkJCQlydGxsaWJfZW5jcnlwdF9mcmFnbWVudChpZWVlLCBza2JfZnJhZywKKwkJCQkJCQloZHJfbGVuKTsKKwkJCWlmIChpZWVlLT5jb25maWcgJgorCQkJICAgKENGR19SVExMSUJfQ09NUFVURV9GQ1MgfCBDRkdfUlRMTElCX1JFU0VSVkVfRkNTKSkKKwkJCQlza2JfcHV0KHNrYl9mcmFnLCA0KTsKKwkJfQorCisJCWlmICgocW9zX2FjdGl2ZWQpICYmICghYklzTXVsdGljYXN0KSkgeworCQkJaWYgKGllZWUtPnNlcV9jdHJsW1VQMkFDKHNrYi0+cHJpb3JpdHkpICsgMV0gPT0gMHhGRkYpCisJCQkJaWVlZS0+c2VxX2N0cmxbVVAyQUMoc2tiLT5wcmlvcml0eSkgKyAxXSA9IDA7CisJCQllbHNlCisJCQkJaWVlZS0+c2VxX2N0cmxbVVAyQUMoc2tiLT5wcmlvcml0eSkgKyAxXSsrOworCQl9IGVsc2UgeworCQkJaWYgKGllZWUtPnNlcV9jdHJsWzBdID09IDB4RkZGKQorCQkJCWllZWUtPnNlcV9jdHJsWzBdID0gMDsKKwkJCWVsc2UKKwkJCQkJaWVlZS0+c2VxX2N0cmxbMF0rKzsKKwkJfQorCX0gZWxzZSB7CisJCWlmICh1bmxpa2VseShza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkcikpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc2tiIHRvbyBzbWFsbCAoJWQpLlxuIiwKKwkJCWllZWUtPmRldi0+bmFtZSwgc2tiLT5sZW4pOworCQkJZ290byBzdWNjZXNzOworCQl9CisKKwkJdHhiID0gcnRsbGliX2FsbG9jX3R4YigxLCBza2ItPmxlbiwgR0ZQX0FUT01JQyk7CisJCWlmICghdHhiKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGQgbm90IGFsbG9jYXRlIFRYQlxuIiwKKwkJCWllZWUtPmRldi0+bmFtZSk7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCisJCXR4Yi0+ZW5jcnlwdGVkID0gMDsKKwkJdHhiLT5wYXlsb2FkX3NpemUgPSBza2ItPmxlbjsKKwkJbWVtY3B5KHNrYl9wdXQodHhiLT5mcmFnbWVudHNbMF0sIHNrYi0+bGVuKSwgc2tiLT5kYXRhLAorCQkgICAgICAgc2tiLT5sZW4pOworCX0KKworIHN1Y2Nlc3M6CisJaWYgKHR4YikgeworCQlzdHJ1Y3QgY2JfZGVzYyAqdGNiX2Rlc2MgPSAoc3RydWN0IGNiX2Rlc2MgKikKKwkJCQkodHhiLT5mcmFnbWVudHNbMF0tPmNiICsgTUFYX0RFVl9BRERSX1NJWkUpOworCQl0Y2JfZGVzYy0+YlR4RW5hYmxlRndDYWxjRHVyID0gMTsKKwkJdGNiX2Rlc2MtPnByaW9yaXR5ID0gc2tiLT5wcmlvcml0eTsKKworCQlpZiAoZXRoZXJfdHlwZSA9PSBFVEhfUF9QQUUpIHsKKwkJCWlmIChpZWVlLT5wSFRJbmZvLT5JT1RBY3Rpb24gJgorCQkJICAgIEhUX0lPVF9BQ1RfV0FfSU9UX0Jyb2FkY29tKSB7CisJCQkJdGNiX2Rlc2MtPmRhdGFfcmF0ZSA9CisJCQkJCSBNZ250UXVlcnlfVHhSYXRlRXhjbHVkZUNDS1JhdGVzKGllZWUpOworCQkJCXRjYl9kZXNjLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrID0gZmFsc2U7CisJCQl9IGVsc2UgeworCQkJCXRjYl9kZXNjLT5kYXRhX3JhdGUgPSBpZWVlLT5iYXNpY19yYXRlOworCQkJCXRjYl9kZXNjLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrID0gMTsKKwkJCX0KKworCisJCQl0Y2JfZGVzYy0+UkFUUkluZGV4ID0gNzsKKwkJCXRjYl9kZXNjLT5iVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGUgPSAxOworCQl9IGVsc2UgeworCQkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhlYWRlci5hZGRyMSkpCisJCQkJdGNiX2Rlc2MtPmJNdWx0aWNhc3QgPSAxOworCQkJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGhlYWRlci5hZGRyMSkpCisJCQkJdGNiX2Rlc2MtPmJCcm9hZGNhc3QgPSAxOworCQkJcnRsbGliX3R4cmF0ZV9zZWxlY3Rtb2RlKGllZWUsIHRjYl9kZXNjKTsKKwkJCWlmICh0Y2JfZGVzYy0+Yk11bHRpY2FzdCB8fCAgdGNiX2Rlc2MtPmJCcm9hZGNhc3QpCisJCQkJdGNiX2Rlc2MtPmRhdGFfcmF0ZSA9IGllZWUtPmJhc2ljX3JhdGU7CisJCQllbHNlCisJCQkJdGNiX2Rlc2MtPmRhdGFfcmF0ZSA9IENVUlJFTlRfUkFURShpZWVlLT5tb2RlLAorCQkJCQlpZWVlLT5yYXRlLCBpZWVlLT5IVEN1cnJlbnRPcGVyYVJhdGUpOworCisJCQlpZiAoYmRoY3AgPT0gdHJ1ZSkgeworCQkJCWlmIChpZWVlLT5wSFRJbmZvLT5JT1RBY3Rpb24gJgorCQkJCSAgICBIVF9JT1RfQUNUX1dBX0lPVF9Ccm9hZGNvbSkgeworCQkJCQl0Y2JfZGVzYy0+ZGF0YV9yYXRlID0KKwkJCQkJICAgTWdudFF1ZXJ5X1R4UmF0ZUV4Y2x1ZGVDQ0tSYXRlcyhpZWVlKTsKKwkJCQkJdGNiX2Rlc2MtPmJUeERpc2FibGVSYXRlRmFsbEJhY2sgPSBmYWxzZTsKKwkJCQl9IGVsc2UgeworCQkJCQl0Y2JfZGVzYy0+ZGF0YV9yYXRlID0gTUdOXzFNOworCQkJCQl0Y2JfZGVzYy0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjayA9IDE7CisJCQkJfQorCisKKwkJCQl0Y2JfZGVzYy0+UkFUUkluZGV4ID0gNzsKKwkJCQl0Y2JfZGVzYy0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlID0gMTsKKwkJCQl0Y2JfZGVzYy0+YmRoY3AgPSAxOworCQkJfQorCisJCQlydGxsaWJfcXVyZXlfU2hvcnRQcmVhbWJsZU1vZGUoaWVlZSwgdGNiX2Rlc2MpOworCQkJcnRsbGliX3R4X3F1ZXJ5X2FnZ19jYXAoaWVlZSwgdHhiLT5mcmFnbWVudHNbMF0sCisJCQkJCQl0Y2JfZGVzYyk7CisJCQlydGxsaWJfcXVlcnlfSFRDYXBTaG9ydEdJKGllZWUsIHRjYl9kZXNjKTsKKwkJCXJ0bGxpYl9xdWVyeV9CYW5kd2lkdGhNb2RlKGllZWUsIHRjYl9kZXNjKTsKKwkJCXJ0bGxpYl9xdWVyeV9wcm90ZWN0aW9ubW9kZShpZWVlLCB0Y2JfZGVzYywKKwkJCQkJCSAgICB0eGItPmZyYWdtZW50c1swXSk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bG9jaywgZmxhZ3MpOworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJaWYgKHR4YikgeworCQlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19UWF9RVUVVRSkgeworCQkJZGV2LT5zdGF0cy50eF9wYWNrZXRzKys7CisJCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IHR4Yi0+cGF5bG9hZF9zaXplOworCQkJcnRsbGliX3NvZnRtYWNfeG1pdCh0eGIsIGllZWUpOworCQl9IGVsc2UgeworCQkJaWYgKCgqaWVlZS0+aGFyZF9zdGFydF94bWl0KSh0eGIsIGRldikgPT0gMCkgeworCQkJCXN0YXRzLT50eF9wYWNrZXRzKys7CisJCQkJc3RhdHMtPnR4X2J5dGVzICs9IHR4Yi0+cGF5bG9hZF9zaXplOworCQkJCXJldHVybiAwOworCQkJfQorCQkJcnRsbGliX3R4Yl9mcmVlKHR4Yik7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworIGZhaWxlZDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXN0YXRzLT50eF9lcnJvcnMrKzsKKwlyZXR1cm4gMTsKKworfQoraW50IHJ0bGxpYl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbWVtc2V0KHNrYi0+Y2IsIDAsIHNpemVvZihza2ItPmNiKSk7CisJcmV0dXJuIHJ0bGxpYl94bWl0X2ludGVyKHNrYiwgZGV2KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfd3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2VhNGE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl93eC5jCkBAIC0wLDAgKzEsODc2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgQ29weXJpZ2h0KGMpIDIwMDQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBiYXNlZCBvbiB0aGUgV0VQIGVuYWJsZW1lbnQgY29kZSBwcm92aWRlZCBieSB0aGUKKyAgSG9zdCBBUCBwcm9qZWN0IGhvc3RhcC1kcml2ZXJzIHYwLjEuMworICBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiwgU1NIIENvbW11bmljYXRpb25zIFNlY3VyaXR5IENvcnAgYW5kIEpvdW5pIE1hbGluZW4KKyAgPGprbWFsaW5lQGNjLmh1dC5maT4KKyAgQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIEpvdW5pIE1hbGluZW4gPGprbWFsaW5lQGNjLmh1dC5maT4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgorCisgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICBmaWxlIGNhbGxlZCBMSUNFTlNFLgorCisgIENvbnRhY3QgSW5mb3JtYXRpb246CisgIEphbWVzIFAuIEtldHJlbm9zIDxpcHcyMTAwLWFkbWluQGxpbnV4LmludGVsLmNvbT4KKyAgSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAicnRsbGliLmgiCitzdHJ1Y3QgbW9kZXNfdW5pdCB7CisJY2hhciAqbW9kZV9zdHJpbmc7CisJaW50IG1vZGVfc2l6ZTsKK307CitzdGF0aWMgc3RydWN0IG1vZGVzX3VuaXQgcnRsbGliX21vZGVzW10gPSB7CisJeyJhIiwgMX0sCisJeyJiIiwgMX0sCisJeyJnIiwgMX0sCisJeyI/IiwgMX0sCisJeyJOLTI0RyIsIDV9LAorCXsiTi01RyIsIDR9LAorfTsKKworI2RlZmluZSBNQVhfQ1VTVE9NX0xFTiA2NAorc3RhdGljIGlubGluZSBjaGFyICpydGw4MTl4X3RyYW5zbGF0ZV9zY2FuKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJCQkgICBjaGFyICpzdGFydCwgY2hhciAqc3RvcCwKKwkJCQkJICAgc3RydWN0IHJ0bGxpYl9uZXR3b3JrICpuZXR3b3JrLAorCQkJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvKQoreworCWNoYXIgY3VzdG9tW01BWF9DVVNUT01fTEVOXTsKKwljaGFyIHByb3RvX25hbWVbSUZOQU1TSVpdOworCWNoYXIgKnBuYW1lID0gcHJvdG9fbmFtZTsKKwljaGFyICpwOworCXN0cnVjdCBpd19ldmVudCBpd2U7CisJaW50IGksIGo7CisJdTE2IG1heF9yYXRlLCByYXRlOworCXN0YXRpYyB1OAlFV0MxMU5IVENhcFtdID0gezB4MDAsIDB4OTAsIDB4NGMsIDB4MzN9OworCisJLyogRmlyc3QgZW50cnkgKk1VU1QqIGJlIHRoZSBBUCBNQUMgYWRkcmVzcyAqLworCWl3ZS5jbWQgPSBTSU9DR0lXQVA7CisJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CisJbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgbmV0d29yay0+YnNzaWQsIEVUSF9BTEVOKTsKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50X3JzbChpbmZvLCBzdGFydCwgc3RvcCwKKwkJCQkJICZpd2UsIElXX0VWX0FERFJfTEVOKTsKKwkvKiBSZW1haW5pbmcgZW50cmllcyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgb3JkZXIgd2UgcHJvdmlkZSB0aGVtICovCisKKwkvKiBBZGQgdGhlIEVTU0lEICovCisJaXdlLmNtZCA9IFNJT0NHSVdFU1NJRDsKKwlpd2UudS5kYXRhLmZsYWdzID0gMTsKKwlpZiAobmV0d29yay0+c3NpZF9sZW4gPiAwKSB7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gbWluKG5ldHdvcmstPnNzaWRfbGVuLCAodTgpMzIpOworCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50X3JzbChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwKKwkJCQkJCSBuZXR3b3JrLT5zc2lkKTsKKwl9IGVsc2UgaWYgKG5ldHdvcmstPmhpZGRlbl9zc2lkX2xlbiA9PSAwKSB7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gc2l6ZW9mKCI8aGlkZGVuPiIpOworCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50X3JzbChpbmZvLCBzdGFydCwgc3RvcCwKKwkJCQkJCSAmaXdlLCAiPGhpZGRlbj4iKTsKKwl9IGVsc2UgeworCQlpd2UudS5kYXRhLmxlbmd0aCA9IG1pbihuZXR3b3JrLT5oaWRkZW5fc3NpZF9sZW4sICh1OCkzMik7CisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnRfcnNsKGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLAorCQkJCQkJIG5ldHdvcmstPmhpZGRlbl9zc2lkKTsKKwl9CisJLyogQWRkIHRoZSBwcm90b2NvbCBuYW1lICovCisJaXdlLmNtZCA9IFNJT0NHSVdOQU1FOworCWZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKHJ0bGxpYl9tb2Rlcykvc2l6ZW9mKHJ0bGxpYl9tb2Rlc1swXSkpOyBpKyspIHsKKwkJaWYgKG5ldHdvcmstPm1vZGUmKDE8PGkpKSB7CisJCQlzcHJpbnRmKHBuYW1lLCBydGxsaWJfbW9kZXNbaV0ubW9kZV9zdHJpbmcsCisJCQkJcnRsbGliX21vZGVzW2ldLm1vZGVfc2l6ZSk7CisJCQlwbmFtZSArPSBydGxsaWJfbW9kZXNbaV0ubW9kZV9zaXplOworCQl9CisJfQorCSpwbmFtZSA9ICdcMCc7CisJc25wcmludGYoaXdlLnUubmFtZSwgSUZOQU1TSVosICJJRUVFODAyLjExJXMiLCBwcm90b19uYW1lKTsKKwlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50X3JzbChpbmZvLCBzdGFydCwgc3RvcCwKKwkJCQkJICZpd2UsIElXX0VWX0NIQVJfTEVOKTsKKwkvKiBBZGQgbW9kZSAqLworCWl3ZS5jbWQgPSBTSU9DR0lXTU9ERTsKKwlpZiAobmV0d29yay0+Y2FwYWJpbGl0eSAmCisJICAgIChXTEFOX0NBUEFCSUxJVFlfRVNTIHwgV0xBTl9DQVBBQklMSVRZX0lCU1MpKSB7CisJCWlmIChuZXR3b3JrLT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0VTUykKKwkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX01BU1RFUjsKKwkJZWxzZQorCQkJaXdlLnUubW9kZSA9IElXX01PREVfQURIT0M7CisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnRfcnNsKGluZm8sIHN0YXJ0LCBzdG9wLAorCQkJCQkJICZpd2UsIElXX0VWX1VJTlRfTEVOKTsKKwl9CisKKwkvKiBBZGQgZnJlcXVlbmN5L2NoYW5uZWwgKi8KKwlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7CisvKglpd2UudS5mcmVxLm0gPSBydGxsaWJfZnJlcXVlbmN5KG5ldHdvcmstPmNoYW5uZWwsIG5ldHdvcmstPm1vZGUpOworCWl3ZS51LmZyZXEuZSA9IDM7ICovCisJaXdlLnUuZnJlcS5tID0gbmV0d29yay0+Y2hhbm5lbDsKKwlpd2UudS5mcmVxLmUgPSAwOworCWl3ZS51LmZyZXEuaSA9IDA7CisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudF9yc2woaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsCisJCQkJCSBJV19FVl9GUkVRX0xFTik7CisKKwkvKiBBZGQgZW5jcnlwdGlvbiBjYXBhYmlsaXR5ICovCisJaXdlLmNtZCA9IFNJT0NHSVdFTkNPREU7CisJaWYgKG5ldHdvcmstPmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSkKKwkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9FTkFCTEVEIHwgSVdfRU5DT0RFX05PS0VZOworCWVsc2UKKwkJaXdlLnUuZGF0YS5mbGFncyA9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwlpd2UudS5kYXRhLmxlbmd0aCA9IDA7CisJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludF9yc2woaW5mbywgc3RhcnQsIHN0b3AsCisJCQkJCSAmaXdlLCBuZXR3b3JrLT5zc2lkKTsKKwkvKiBBZGQgYmFzaWMgYW5kIGV4dGVuZGVkIHJhdGVzICovCisJbWF4X3JhdGUgPSAwOworCXAgPSBjdXN0b207CisJcCArPSBzbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiAtIChwIC0gY3VzdG9tKSwgIiBSYXRlcyAoTWIvcyk6ICIpOworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgbmV0d29yay0+cmF0ZXNfbGVuOykgeworCQlpZiAoaiA8IG5ldHdvcmstPnJhdGVzX2V4X2xlbiAmJgorCQkgICAgKChuZXR3b3JrLT5yYXRlc19leFtqXSAmIDB4N0YpIDwKKwkJICAgICAobmV0d29yay0+cmF0ZXNbaV0gJiAweDdGKSkpCisJCQlyYXRlID0gbmV0d29yay0+cmF0ZXNfZXhbaisrXSAmIDB4N0Y7CisJCWVsc2UKKwkJCXJhdGUgPSBuZXR3b3JrLT5yYXRlc1tpKytdICYgMHg3RjsKKwkJaWYgKHJhdGUgPiBtYXhfcmF0ZSkKKwkJCW1heF9yYXRlID0gcmF0ZTsKKwkJcCArPSBzbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiAtIChwIC0gY3VzdG9tKSwKKwkJCSAgICAgICIlZCVzICIsIHJhdGUgPj4gMSwgKHJhdGUgJiAxKSA/ICIuNSIgOiAiIik7CisJfQorCWZvciAoOyBqIDwgbmV0d29yay0+cmF0ZXNfZXhfbGVuOyBqKyspIHsKKwkJcmF0ZSA9IG5ldHdvcmstPnJhdGVzX2V4W2pdICYgMHg3RjsKKwkJcCArPSBzbnByaW50ZihwLCBNQVhfQ1VTVE9NX0xFTiAtIChwIC0gY3VzdG9tKSwKKwkJCSAgICAgICIlZCVzICIsIHJhdGUgPj4gMSwgKHJhdGUgJiAxKSA/ICIuNSIgOiAiIik7CisJCWlmIChyYXRlID4gbWF4X3JhdGUpCisJCQltYXhfcmF0ZSA9IHJhdGU7CisJfQorCisJaWYgKG5ldHdvcmstPm1vZGUgPj0gSUVFRV9OXzI0RykgeworCQlzdHJ1Y3QgaHRfY2FwYWJfZWxlICpodF9jYXAgPSBOVUxMOworCQlib29sIGlzNDBNID0gZmFsc2UsIGlzU2hvcnRHSSA9IGZhbHNlOworCQl1OCBtYXhfbWNzID0gMDsKKwkJaWYgKCFtZW1jbXAobmV0d29yay0+YnNzaHQuYmRIVENhcEJ1ZiwgRVdDMTFOSFRDYXAsIDQpKQorCQkJaHRfY2FwID0gKHN0cnVjdCBodF9jYXBhYl9lbGUgKikKKwkJCQkgJm5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWZbNF07CisJCWVsc2UKKwkJCWh0X2NhcCA9IChzdHJ1Y3QgaHRfY2FwYWJfZWxlICopCisJCQkJICZuZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmWzBdOworCQlpczQwTSA9IChodF9jYXAtPkNobFdpZHRoKSA/IDEgOiAwOworCQlpc1Nob3J0R0kgPSAoaHRfY2FwLT5DaGxXaWR0aCkgPworCQkJCSgoaHRfY2FwLT5TaG9ydEdJNDBNaHopID8gMSA6IDApIDoKKwkJCQkoKGh0X2NhcC0+U2hvcnRHSTIwTWh6KSA/IDEgOiAwKTsKKworCQltYXhfbWNzID0gSFRHZXRIaWdoZXN0TUNTUmF0ZShpZWVlLCBodF9jYXAtPk1DUywKKwkJCQkJICAgICAgTUNTX0ZJTFRFUl9BTEwpOworCQlyYXRlID0gTUNTX0RBVEFfUkFURVtpczQwTV1baXNTaG9ydEdJXVttYXhfbWNzICYgMHg3Zl07CisJCWlmIChyYXRlID4gbWF4X3JhdGUpCisJCQltYXhfcmF0ZSA9IHJhdGU7CisJfQorCWl3ZS5jbWQgPSBTSU9DR0lXUkFURTsKKwlpd2UudS5iaXRyYXRlLmZpeGVkID0gaXdlLnUuYml0cmF0ZS5kaXNhYmxlZCA9IDA7CisJaXdlLnUuYml0cmF0ZS52YWx1ZSA9IG1heF9yYXRlICogNTAwMDAwOworCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnRfcnNsKGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLAorCQkJCSAgICAgSVdfRVZfUEFSQU1fTEVOKTsKKwlpd2UuY21kID0gSVdFVkNVU1RPTTsKKwlpd2UudS5kYXRhLmxlbmd0aCA9IHAgLSBjdXN0b207CisJaWYgKGl3ZS51LmRhdGEubGVuZ3RoKQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50X3JzbChpbmZvLCBzdGFydCwgc3RvcCwKKwkJCQkJCSAmaXdlLCBjdXN0b20pOworCS8qIEFkZCBxdWFsaXR5IHN0YXRpc3RpY3MgKi8KKwkvKiBUT0RPOiBGaXggdGhlc2UgdmFsdWVzLi4uICovCisJaXdlLmNtZCA9IElXRVZRVUFMOworCWl3ZS51LnF1YWwucXVhbCA9IG5ldHdvcmstPnN0YXRzLnNpZ25hbDsKKwlpd2UudS5xdWFsLmxldmVsID0gbmV0d29yay0+c3RhdHMucnNzaTsKKwlpd2UudS5xdWFsLm5vaXNlID0gbmV0d29yay0+c3RhdHMubm9pc2U7CisJaXdlLnUucXVhbC51cGRhdGVkID0gbmV0d29yay0+c3RhdHMubWFzayAmIFJUTExJQl9TVEFUTUFTS19XRU1BU0s7CisJaWYgKCEobmV0d29yay0+c3RhdHMubWFzayAmIFJUTExJQl9TVEFUTUFTS19SU1NJKSkKKwkJaXdlLnUucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfTEVWRUxfSU5WQUxJRDsKKwlpZiAoIShuZXR3b3JrLT5zdGF0cy5tYXNrICYgUlRMTElCX1NUQVRNQVNLX05PSVNFKSkKKwkJaXdlLnUucXVhbC51cGRhdGVkIHw9IElXX1FVQUxfTk9JU0VfSU5WQUxJRDsKKwlpZiAoIShuZXR3b3JrLT5zdGF0cy5tYXNrICYgUlRMTElCX1NUQVRNQVNLX1NJR05BTCkpCisJCWl3ZS51LnF1YWwudXBkYXRlZCB8PSBJV19RVUFMX1FVQUxfSU5WQUxJRDsKKwlpd2UudS5xdWFsLnVwZGF0ZWQgPSA3OworCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnRfcnNsKGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLAorCQkJCQkgSVdfRVZfUVVBTF9MRU4pOworCisJaXdlLmNtZCA9IElXRVZDVVNUT007CisJcCA9IGN1c3RvbTsKKwlpd2UudS5kYXRhLmxlbmd0aCA9IHAgLSBjdXN0b207CisJaWYgKGl3ZS51LmRhdGEubGVuZ3RoKQorCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50X3JzbChpbmZvLCBzdGFydCwgc3RvcCwKKwkJCQkJCSAmaXdlLCBjdXN0b20pOworCisJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwlpZiAobmV0d29yay0+d3BhX2llX2xlbikgeworCQljaGFyIGJ1ZltNQVhfV1BBX0lFX0xFTl07CisJCW1lbWNweShidWYsIG5ldHdvcmstPndwYV9pZSwgbmV0d29yay0+d3BhX2llX2xlbik7CisJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gbmV0d29yay0+d3BhX2llX2xlbjsKKwkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludF9yc2woaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsIGJ1Zik7CisJfQorCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CisJaWYgKG5ldHdvcmstPnJzbl9pZV9sZW4pIHsKKwkJY2hhciBidWZbTUFYX1dQQV9JRV9MRU5dOworCQltZW1jcHkoYnVmLCBuZXR3b3JrLT5yc25faWUsIG5ldHdvcmstPnJzbl9pZV9sZW4pOworCQlpd2UuY21kID0gSVdFVkdFTklFOworCQlpd2UudS5kYXRhLmxlbmd0aCA9IG5ldHdvcmstPnJzbl9pZV9sZW47CisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnRfcnNsKGluZm8sIHN0YXJ0LCBzdG9wLCAmaXdlLCBidWYpOworCX0KKworCS8qIGFkZCBpbmZvIGZvciBXWkMgKi8KKwltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCWlmIChuZXR3b3JrLT53emNfaWVfbGVuKSB7CisJCWNoYXIgYnVmW01BWF9XWkNfSUVfTEVOXTsKKwkJbWVtY3B5KGJ1ZiwgbmV0d29yay0+d3pjX2llLCBuZXR3b3JrLT53emNfaWVfbGVuKTsKKwkJaXdlLmNtZCA9IElXRVZHRU5JRTsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSBuZXR3b3JrLT53emNfaWVfbGVuOworCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50X3JzbChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgYnVmKTsKKwl9CisKKwkvKiBBZGQgRVhUUkE6IEFnZSB0byBkaXNwbGF5IHNlY29uZHMgc2luY2UgbGFzdCBiZWFjb24vcHJvYmUgcmVzcG9uc2UKKwkgKiBmb3IgZ2l2ZW4gbmV0d29yay4gKi8KKwlpd2UuY21kID0gSVdFVkNVU1RPTTsKKwlwID0gY3VzdG9tOworCXAgKz0gc25wcmludGYocCwgTUFYX0NVU1RPTV9MRU4gLSAocCAtIGN1c3RvbSksCisJCSAgICAgICIgTGFzdCBiZWFjb246ICVsdW1zIGFnbyIsCisJCSAgICAgIChqaWZmaWVzIC0gbmV0d29yay0+bGFzdF9zY2FubmVkKSAvIChIWiAvIDEwMCkpOworCWl3ZS51LmRhdGEubGVuZ3RoID0gcCAtIGN1c3RvbTsKKwlpZiAoaXdlLnUuZGF0YS5sZW5ndGgpCisJCXN0YXJ0ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnRfcnNsKGluZm8sIHN0YXJ0LCBzdG9wLAorCQkJCQkJICZpd2UsIGN1c3RvbSk7CisKKwlyZXR1cm4gc3RhcnQ7Cit9CisKK2ludCBydGxsaWJfd3hfZ2V0X3NjYW4oc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQoreworCXN0cnVjdCBydGxsaWJfbmV0d29yayAqbmV0d29yazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY2hhciAqZXYgPSBleHRyYTsKKwljaGFyICpzdG9wID0gZXYgKyB3cnF1LT5kYXRhLmxlbmd0aDsKKwlpbnQgaSA9IDA7CisJaW50IGVyciA9IDA7CisJUlRMTElCX0RFQlVHX1dYKCJHZXR0aW5nIHNjYW5cbiIpOworCWRvd24oJmllZWUtPnd4X3NlbSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobmV0d29yaywgJmllZWUtPm5ldHdvcmtfbGlzdCwgbGlzdCkgeworCQlpKys7CisJCWlmICgoc3RvcCAtIGV2KSA8IDIwMCkgeworCQkJZXJyID0gLUUyQklHOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGllZWUtPnNjYW5fYWdlID09IDAgfHwKKwkJICAgIHRpbWVfYWZ0ZXIobmV0d29yay0+bGFzdF9zY2FubmVkICsgaWVlZS0+c2Nhbl9hZ2UsIGppZmZpZXMpKQorCQkJZXYgPSBydGw4MTl4X3RyYW5zbGF0ZV9zY2FuKGllZWUsIGV2LCBzdG9wLCBuZXR3b3JrLAorCQkJCQkJICAgIGluZm8pOworCQllbHNlCisJCQlSVExMSUJfREVCVUdfU0NBTigiTm90IHNob3dpbmcgbmV0d29yayAnJXMgKCIKKwkJCQkiICVwTSknIGR1ZSB0byBhZ2UgKCVsdW1zKS5cbiIsCisJCQkJZXNjYXBlX2Vzc2lkKG5ldHdvcmstPnNzaWQsCisJCQkJCSAgICAgbmV0d29yay0+c3NpZF9sZW4pLAorCQkJCW5ldHdvcmstPmJzc2lkLAorCQkJCShqaWZmaWVzIC0gbmV0d29yay0+bGFzdF9zY2FubmVkKSAvIChIWiAvIDEwMCkpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKKwl1cCgmaWVlZS0+d3hfc2VtKTsKKwl3cnF1LT5kYXRhLmxlbmd0aCA9IGV2IC0gIGV4dHJhOworCXdycXUtPmRhdGEuZmxhZ3MgPSAwOworCisJUlRMTElCX0RFQlVHX1dYKCJleGl0OiAlZCBuZXR3b3JrcyByZXR1cm5lZC5cbiIsIGkpOworCisJcmV0dXJuIGVycjsKK30KKworaW50IHJ0bGxpYl93eF9zZXRfZW5jb2RlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5YnVmKQoreworCXN0cnVjdCBpd19wb2ludCAqZXJxID0gJih3cnF1LT5lbmNvZGluZyk7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKwlzdHJ1Y3QgcnRsbGliX3NlY3VyaXR5IHNlYyA9IHsKKwkJLmZsYWdzID0gMAorCX07CisJaW50IGksIGtleSwga2V5X3Byb3ZpZGVkLCBsZW47CisJc3RydWN0IHJ0bGxpYl9jcnlwdF9kYXRhICoqY3J5cHQ7CisKKwlSVExMSUJfREVCVUdfV1goIlNFVF9FTkNPREVcbiIpOworCisJa2V5ID0gZXJxLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlpZiAoa2V5KSB7CisJCWlmIChrZXkgPiBXRVBfS0VZUykKKwkJCXJldHVybiAtRUlOVkFMOworCQlrZXktLTsKKwkJa2V5X3Byb3ZpZGVkID0gMTsKKwl9IGVsc2UgeworCQlrZXlfcHJvdmlkZWQgPSAwOworCQlrZXkgPSBpZWVlLT50eF9rZXlpZHg7CisJfQorCisJUlRMTElCX0RFQlVHX1dYKCJLZXk6ICVkIFslc11cbiIsIGtleSwga2V5X3Byb3ZpZGVkID8KKwkJCSAgICJwcm92aWRlZCIgOiAiZGVmYXVsdCIpOworCWNyeXB0ID0gJmllZWUtPmNyeXB0W2tleV07CisJaWYgKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKKwkJaWYgKGtleV9wcm92aWRlZCAmJiAqY3J5cHQpIHsKKwkJCVJUTExJQl9ERUJVR19XWCgiRGlzYWJsaW5nIGVuY3J5cHRpb24gb24ga2V5ICVkLlxuIiwKKwkJCQkJICAga2V5KTsKKwkJCXJ0bGxpYl9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7CisJCX0gZWxzZQorCQkJUlRMTElCX0RFQlVHX1dYKCJEaXNhYmxpbmcgZW5jcnlwdGlvbi5cbiIpOworCisJCS8qIENoZWNrIGFsbCB0aGUga2V5cyB0byBzZWUgaWYgYW55IGFyZSBzdGlsbCBjb25maWd1cmVkLAorCQkgKiBhbmQgaWYgbm8ga2V5IGluZGV4IHdhcyBwcm92aWRlZCwgZGUtaW5pdCB0aGVtIGFsbCAqLworCQlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVM7IGkrKykgeworCQkJaWYgKGllZWUtPmNyeXB0W2ldICE9IE5VTEwpIHsKKwkJCQlpZiAoa2V5X3Byb3ZpZGVkKQorCQkJCQlicmVhazsKKwkJCQlydGxsaWJfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwKKwkJCQkJCQkgICAgJmllZWUtPmNyeXB0W2ldKTsKKwkJCX0KKwkJfQorCisJCWlmIChpID09IFdFUF9LRVlTKSB7CisJCQlzZWMuZW5hYmxlZCA9IDA7CisJCQlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMDsKKwkJCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRCB8IFNFQ19MRVZFTDsKKwkJfQorCisJCWdvdG8gZG9uZTsKKwl9CisKKworCisJc2VjLmVuYWJsZWQgPSAxOworCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRDsKKworCWlmICgqY3J5cHQgIT0gTlVMTCAmJiAoKmNyeXB0KS0+b3BzICE9IE5VTEwgJiYKKwkgICAgc3RyY21wKCgqY3J5cHQpLT5vcHMtPm5hbWUsICJXRVAiKSAhPSAwKSB7CisJCS8qIGNoYW5naW5nIHRvIHVzZSBXRVA7IGRlaW5pdCBwcmV2aW91c2x5IHVzZWQgYWxnb3JpdGhtCisJCSAqIG9uIHRoaXMga2V5ICovCisJCXJ0bGxpYl9jcnlwdF9kZWxheWVkX2RlaW5pdChpZWVlLCBjcnlwdCk7CisJfQorCisJaWYgKCpjcnlwdCA9PSBOVUxMKSB7CisJCXN0cnVjdCBydGxsaWJfY3J5cHRfZGF0YSAqbmV3X2NyeXB0OworCisJCS8qIHRha2UgV0VQIGludG8gdXNlICovCisJCW5ld19jcnlwdCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBydGxsaWJfY3J5cHRfZGF0YSksCisJCQkJICAgIEdGUF9LRVJORUwpOworCQlpZiAobmV3X2NyeXB0ID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJbWVtc2V0KG5ld19jcnlwdCwgMCwgc2l6ZW9mKHN0cnVjdCBydGxsaWJfY3J5cHRfZGF0YSkpOworCQluZXdfY3J5cHQtPm9wcyA9IHJ0bGxpYl9nZXRfY3J5cHRvX29wcygiV0VQIik7CisJCWlmICghbmV3X2NyeXB0LT5vcHMpIHsKKwkJCXJlcXVlc3RfbW9kdWxlKCJydGxsaWJfY3J5cHRfd2VwIik7CisJCQluZXdfY3J5cHQtPm9wcyA9IHJ0bGxpYl9nZXRfY3J5cHRvX29wcygiV0VQIik7CisJCX0KKworCQlpZiAobmV3X2NyeXB0LT5vcHMpCisJCQluZXdfY3J5cHQtPnByaXYgPSBuZXdfY3J5cHQtPm9wcy0+aW5pdChrZXkpOworCisJCWlmICghbmV3X2NyeXB0LT5vcHMgfHwgIW5ld19jcnlwdC0+cHJpdikgeworCQkJa2ZyZWUobmV3X2NyeXB0KTsKKwkJCW5ld19jcnlwdCA9IE5VTEw7CisKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb3VsZCBub3QgaW5pdGlhbGl6ZSBXRVA6ICIKKwkJCSAgICAgICAibG9hZCBtb2R1bGUgcnRsbGliX2NyeXB0X3dlcFxuIiwKKwkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisJCSpjcnlwdCA9IG5ld19jcnlwdDsKKwl9CisKKwkvKiBJZiBhIG5ldyBrZXkgd2FzIHByb3ZpZGVkLCBzZXQgaXQgdXAgKi8KKwlpZiAoZXJxLT5sZW5ndGggPiAwKSB7CisJCWxlbiA9IGVycS0+bGVuZ3RoIDw9IDUgPyA1IDogMTM7CisJCW1lbWNweShzZWMua2V5c1trZXldLCBrZXlidWYsIGVycS0+bGVuZ3RoKTsKKwkJaWYgKGxlbiA+IGVycS0+bGVuZ3RoKQorCQkJbWVtc2V0KHNlYy5rZXlzW2tleV0gKyBlcnEtPmxlbmd0aCwgMCwKKwkJCSAgICAgICBsZW4gLSBlcnEtPmxlbmd0aCk7CisJCVJUTExJQl9ERUJVR19XWCgiU2V0dGluZyBrZXkgJWQgdG8gJyVzJyAoJWQ6JWQgYnl0ZXMpXG4iLAorCQkJCSAgIGtleSwgZXNjYXBlX2Vzc2lkKHNlYy5rZXlzW2tleV0sIGxlbiksCisJCQkJICAgZXJxLT5sZW5ndGgsIGxlbik7CisJCXNlYy5rZXlfc2l6ZXNba2V5XSA9IGxlbjsKKwkJKCpjcnlwdCktPm9wcy0+c2V0X2tleShzZWMua2V5c1trZXldLCBsZW4sIE5VTEwsCisJCQkJICAgICAgICgqY3J5cHQpLT5wcml2KTsKKwkJc2VjLmZsYWdzIHw9ICgxIDw8IGtleSk7CisJCS8qIFRoaXMgZW5zdXJlcyBhIGtleSB3aWxsIGJlIGFjdGl2YXRlZCBpZiBubyBrZXkgaXMKKwkJICogZXhwbGljaXRlbHkgc2V0ICovCisJCWlmIChrZXkgPT0gc2VjLmFjdGl2ZV9rZXkpCisJCQlzZWMuZmxhZ3MgfD0gU0VDX0FDVElWRV9LRVk7CisJCWllZWUtPnR4X2tleWlkeCA9IGtleTsKKworCX0gZWxzZSB7CisJCWxlbiA9ICgqY3J5cHQpLT5vcHMtPmdldF9rZXkoc2VjLmtleXNba2V5XSwgV0VQX0tFWV9MRU4sCisJCQkJCSAgICAgTlVMTCwgKCpjcnlwdCktPnByaXYpOworCQlpZiAobGVuID09IDApIHsKKwkJCS8qIFNldCBhIGRlZmF1bHQga2V5IG9mIGFsbCAwICovCisJCQlwcmludGsoS0VSTl9JTkZPICJTZXR0aW5nIGtleSAlZCB0byBhbGwgemVyby5cbiIsCisJCQkJCSAgIGtleSk7CisKKwkJCVJUTExJQl9ERUJVR19XWCgiU2V0dGluZyBrZXkgJWQgdG8gYWxsIHplcm8uXG4iLAorCQkJCQkgICBrZXkpOworCQkJbWVtc2V0KHNlYy5rZXlzW2tleV0sIDAsIDEzKTsKKwkJCSgqY3J5cHQpLT5vcHMtPnNldF9rZXkoc2VjLmtleXNba2V5XSwgMTMsIE5VTEwsCisJCQkJCSAgICAgICAoKmNyeXB0KS0+cHJpdik7CisJCQlzZWMua2V5X3NpemVzW2tleV0gPSAxMzsKKwkJCXNlYy5mbGFncyB8PSAoMSA8PCBrZXkpOworCQl9CisKKwkJLyogTm8ga2V5IGRhdGEgLSBqdXN0IHNldCB0aGUgZGVmYXVsdCBUWCBrZXkgaW5kZXggKi8KKwkJaWYgKGtleV9wcm92aWRlZCkgeworCQkJUlRMTElCX0RFQlVHX1dYKAorCQkJCSJTZXR0aW5nIGtleSAlZCB0byBkZWZhdWx0IFR4IGtleS5cbiIsIGtleSk7CisJCQlpZWVlLT50eF9rZXlpZHggPSBrZXk7CisJCQlzZWMuYWN0aXZlX2tleSA9IGtleTsKKwkJCXNlYy5mbGFncyB8PSBTRUNfQUNUSVZFX0tFWTsKKwkJfQorCX0KKyBkb25lOgorCWllZWUtPm9wZW5fd2VwID0gIShlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpOworCWllZWUtPmF1dGhfbW9kZSA9IGllZWUtPm9wZW5fd2VwID8gV0xBTl9BVVRIX09QRU4gOgorCQkJICBXTEFOX0FVVEhfU0hBUkVEX0tFWTsKKwlzZWMuYXV0aF9tb2RlID0gaWVlZS0+b3Blbl93ZXAgPyBXTEFOX0FVVEhfT1BFTiA6IFdMQU5fQVVUSF9TSEFSRURfS0VZOworCXNlYy5mbGFncyB8PSBTRUNfQVVUSF9NT0RFOworCVJUTExJQl9ERUJVR19XWCgiQXV0aDogJXNcbiIsIHNlYy5hdXRoX21vZGUgPT0gV0xBTl9BVVRIX09QRU4gPworCQkJICAgIk9QRU4iIDogIlNIQVJFRCBLRVkiKTsKKworCS8qIEZvciBub3cgd2UganVzdCBzdXBwb3J0IFdFUCwgc28gb25seSBzZXQgdGhhdCBzZWN1cml0eSBsZXZlbC4uLgorCSAqIFRPRE86IFdoZW4gV1BBIGlzIGFkZGVkIHRoaXMgaXMgb25lIHBsYWNlIHRoYXQgbmVlZHMgdG8gY2hhbmdlICovCisJc2VjLmZsYWdzIHw9IFNFQ19MRVZFTDsKKwlzZWMubGV2ZWwgPSBTRUNfTEVWRUxfMTsgLyogNDAgYW5kIDEwNCBiaXQgV0VQICovCisKKwlpZiAoaWVlZS0+c2V0X3NlY3VyaXR5KQorCQlpZWVlLT5zZXRfc2VjdXJpdHkoZGV2LCAmc2VjKTsKKworCS8qIERvIG5vdCByZXNldCBwb3J0IGlmIGNhcmQgaXMgaW4gTWFuYWdlZCBtb2RlIHNpbmNlIHJlc2V0dGluZyB3aWxsCisJICogZ2VuZXJhdGUgbmV3IElFRUUgODAyLjExIGF1dGhlbnRpY2F0aW9uIHdoaWNoIG1heSBlbmQgdXAgaW4gbG9vcGluZworCSAqIHdpdGggSUVFRSA4MDIuMVguICBJZiB5b3VyIGhhcmR3YXJlIHJlcXVpcmVzIGEgcmVzZXQgYWZ0ZXIgV0VQCisJICogY29uZmlndXJhdGlvbiAoZm9yIGV4YW1wbGUuLi4gUHJpc20yKSwgaW1wbGVtZW50IHRoZSByZXNldF9wb3J0IGluCisJICogdGhlIGNhbGxiYWNrcyBzdHJ1Y3R1cmVzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgODAyLjExIHN0YWNrLiAqLworCWlmIChpZWVlLT5yZXNldF9vbl9rZXljaGFuZ2UgJiYKKwkgICAgaWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBICYmCisJICAgIGllZWUtPnJlc2V0X3BvcnQgJiYgaWVlZS0+cmVzZXRfcG9ydChkZXYpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVzZXRfcG9ydCBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHJ0bGxpYl93eF9nZXRfZW5jb2RlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqa2V5YnVmKQoreworCXN0cnVjdCBpd19wb2ludCAqZXJxID0gJih3cnF1LT5lbmNvZGluZyk7CisJaW50IGxlbiwga2V5OworCXN0cnVjdCBydGxsaWJfY3J5cHRfZGF0YSAqY3J5cHQ7CisKKwlSVExMSUJfREVCVUdfV1goIkdFVF9FTkNPREVcbiIpOworCisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCQlyZXR1cm4gLTE7CisKKwlrZXkgPSBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCWlmIChrZXkpIHsKKwkJaWYgKGtleSA+IFdFUF9LRVlTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWtleS0tOworCX0gZWxzZSB7CisJCWtleSA9IGllZWUtPnR4X2tleWlkeDsKKwl9CisJY3J5cHQgPSBpZWVlLT5jcnlwdFtrZXldOworCisJZXJxLT5mbGFncyA9IGtleSArIDE7CisKKwlpZiAoY3J5cHQgPT0gTlVMTCB8fCBjcnlwdC0+b3BzID09IE5VTEwpIHsKKwkJZXJxLT5sZW5ndGggPSAwOworCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9ESVNBQkxFRDsKKwkJcmV0dXJuIDA7CisJfQorCWxlbiA9IGNyeXB0LT5vcHMtPmdldF9rZXkoa2V5YnVmLCBTQ01fS0VZX0xFTiwgTlVMTCwgY3J5cHQtPnByaXYpOworCWVycS0+bGVuZ3RoID0gKGxlbiA+PSAwID8gbGVuIDogMCk7CisKKwllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOworCisJaWYgKGllZWUtPm9wZW5fd2VwKQorCQllcnEtPmZsYWdzIHw9IElXX0VOQ09ERV9PUEVOOworCWVsc2UKKwkJZXJxLT5mbGFncyB8PSBJV19FTkNPREVfUkVTVFJJQ1RFRDsKKworCXJldHVybiAwOworfQorCitpbnQgcnRsbGliX3d4X3NldF9lbmNvZGVfZXh0KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGllZWUtPmRldjsKKwlzdHJ1Y3QgaXdfcG9pbnQgKmVuY29kaW5nID0gJndycXUtPmVuY29kaW5nOworCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilleHRyYTsKKwlpbnQgaSwgaWR4OworCWludCBncm91cF9rZXkgPSAwOworCWNvbnN0IGNoYXIgKmFsZywgKm1vZHVsZTsKKwlzdHJ1Y3QgcnRsbGliX2NyeXB0b19vcHMgKm9wczsKKwlzdHJ1Y3QgcnRsbGliX2NyeXB0X2RhdGEgKipjcnlwdDsKKworCXN0cnVjdCBydGxsaWJfc2VjdXJpdHkgc2VjID0geworCQkuZmxhZ3MgPSAwLAorCX07CisJaWR4ID0gZW5jb2RpbmctPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOworCWlmIChpZHgpIHsKKwkJaWYgKGlkeCA8IDEgfHwgaWR4ID4gV0VQX0tFWVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWR4LS07CisJfSBlbHNleworCQkJaWR4ID0gaWVlZS0+dHhfa2V5aWR4OworCX0KKwlpZiAoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkgeworCQljcnlwdCA9ICZpZWVlLT5jcnlwdFtpZHhdOworCQlncm91cF9rZXkgPSAxOworCX0gZWxzZSB7CisJCS8qIHNvbWUgQ2lzY28gQVBzIHVzZSBpZHg+MCBmb3IgdW5pY2FzdCBpbiBkeW5hbWljIFdFUCAqLworCQlpZiAoaWR4ICE9IDAgJiYgZXh0LT5hbGcgIT0gSVdfRU5DT0RFX0FMR19XRVApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkKKwkJCWNyeXB0ID0gJmllZWUtPmNyeXB0W2lkeF07CisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNlYy5mbGFncyB8PSBTRUNfRU5BQkxFRDsKKwlpZiAoKGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgfHwKKwkgICAgZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19OT05FKSB7CisJCWlmICgqY3J5cHQpCisJCQlydGxsaWJfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwgY3J5cHQpOworCisJCWZvciAoaSA9IDA7IGkgPCBXRVBfS0VZUzsgaSsrKSB7CisJCQlpZiAoaWVlZS0+Y3J5cHRbaV0gIT0gTlVMTCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA9PSBXRVBfS0VZUykgeworCQkJc2VjLmVuYWJsZWQgPSAwOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzA7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworCQl9CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzZWMuZW5hYmxlZCA9IDE7CisJc3dpdGNoIChleHQtPmFsZykgeworCWNhc2UgSVdfRU5DT0RFX0FMR19XRVA6CisJCWFsZyA9ICJXRVAiOworCQltb2R1bGUgPSAicnRsbGliX2NyeXB0X3dlcCI7CisJCWJyZWFrOworCWNhc2UgSVdfRU5DT0RFX0FMR19US0lQOgorCQlhbGcgPSAiVEtJUCI7CisJCW1vZHVsZSA9ICJydGxsaWJfY3J5cHRfdGtpcCI7CisJCWJyZWFrOworCWNhc2UgSVdfRU5DT0RFX0FMR19DQ01QOgorCQlhbGcgPSAiQ0NNUCI7CisJCW1vZHVsZSA9ICJydGxsaWJfY3J5cHRfY2NtcCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVJUTExJQl9ERUJVR19XWCgiJXM6IHVua25vd24gY3J5cHRvIGFsZyAlZFxuIiwKKwkJCQkgICBkZXYtPm5hbWUsIGV4dC0+YWxnKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKwlwcmludGsoS0VSTl9JTkZPICJhbGcgbmFtZTolc1xuIiwgYWxnKTsKKworCSBvcHMgPSBydGxsaWJfZ2V0X2NyeXB0b19vcHMoYWxnKTsKKwlpZiAob3BzID09IE5VTEwpIHsKKwkJY2hhciB0ZW1wYnVmWzEwMF07CisKKwkJbWVtc2V0KHRlbXBidWYsIDB4MDAsIDEwMCk7CisJCXNwcmludGYodGVtcGJ1ZiwgIiVzIiwgbW9kdWxlKTsKKwkJcmVxdWVzdF9tb2R1bGUoIiVzIiwgdGVtcGJ1Zik7CisJCW9wcyA9IHJ0bGxpYl9nZXRfY3J5cHRvX29wcyhhbGcpOworCX0KKwlpZiAob3BzID09IE5VTEwpIHsKKwkJUlRMTElCX0RFQlVHX1dYKCIlczogdW5rbm93biBjcnlwdG8gYWxnICVkXG4iLAorCQkJCSAgIGRldi0+bmFtZSwgZXh0LT5hbGcpOworCQlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT51bmtub3duIGNyeXB0byBhbGcgJWRcbiIsIGV4dC0+YWxnKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmICgqY3J5cHQgPT0gTlVMTCB8fCAoKmNyeXB0KS0+b3BzICE9IG9wcykgeworCQlzdHJ1Y3QgcnRsbGliX2NyeXB0X2RhdGEgKm5ld19jcnlwdDsKKworCQlydGxsaWJfY3J5cHRfZGVsYXllZF9kZWluaXQoaWVlZSwgY3J5cHQpOworCisJCW5ld19jcnlwdCA9IGt6YWxsb2Moc2l6ZW9mKCpuZXdfY3J5cHQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKG5ld19jcnlwdCA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBkb25lOworCQl9CisJCW5ld19jcnlwdC0+b3BzID0gb3BzOworCQlpZiAobmV3X2NyeXB0LT5vcHMpCisJCQluZXdfY3J5cHQtPnByaXYgPSBuZXdfY3J5cHQtPm9wcy0+aW5pdChpZHgpOworCisJCWlmIChuZXdfY3J5cHQtPnByaXYgPT0gTlVMTCkgeworCQkJa2ZyZWUobmV3X2NyeXB0KTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJKmNyeXB0ID0gbmV3X2NyeXB0OworCisJfQorCisJaWYgKGV4dC0+a2V5X2xlbiA+IDAgJiYgKCpjcnlwdCktPm9wcy0+c2V0X2tleSAmJgorCSAgICAoKmNyeXB0KS0+b3BzLT5zZXRfa2V5KGV4dC0+a2V5LCBleHQtPmtleV9sZW4sIGV4dC0+cnhfc2VxLAorCQkJCSAgICgqY3J5cHQpLT5wcml2KSA8IDApIHsKKwkJUlRMTElCX0RFQlVHX1dYKCIlczoga2V5IHNldHRpbmcgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOworCQlwcmludGsoS0VSTl9JTkZPICJrZXkgc2V0dGluZyBmYWlsZWRcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfU0VUX1RYX0tFWSkgeworCQlpZWVlLT50eF9rZXlpZHggPSBpZHg7CisJCXNlYy5hY3RpdmVfa2V5ID0gaWR4OworCQlzZWMuZmxhZ3MgfD0gU0VDX0FDVElWRV9LRVk7CisJfQorCWlmIChleHQtPmFsZyAhPSBJV19FTkNPREVfQUxHX05PTkUpIHsKKwkJc2VjLmtleV9zaXplc1tpZHhdID0gZXh0LT5rZXlfbGVuOworCQlzZWMuZmxhZ3MgfD0gKDEgPDwgaWR4KTsKKwkJaWYgKGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfV0VQKSB7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzE7CisJCX0gZWxzZSBpZiAoZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19US0lQKSB7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzI7CisJCX0gZWxzZSBpZiAoZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19DQ01QKSB7CisJCQlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOworCQkJc2VjLmxldmVsID0gU0VDX0xFVkVMXzM7CisJCX0KKwkJLyogRG9uJ3Qgc2V0IHNlYyBsZXZlbCBmb3IgZ3JvdXAga2V5cy4gKi8KKwkJaWYgKGdyb3VwX2tleSkKKwkJCXNlYy5mbGFncyAmPSB+U0VDX0xFVkVMOworCX0KK2RvbmU6CisJaWYgKGllZWUtPnNldF9zZWN1cml0eSkKKwkJaWVlZS0+c2V0X3NlY3VyaXR5KGllZWUtPmRldiwgJnNlYyk7CisKKwkgaWYgKGllZWUtPnJlc2V0X29uX2tleWNoYW5nZSAmJgorCSAgICBpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgJiYKKwkgICAgaWVlZS0+cmVzZXRfcG9ydCAmJiBpZWVlLT5yZXNldF9wb3J0KGRldikpIHsKKwkJUlRMTElCX0RFQlVHX1dYKCIlczogcmVzZXRfcG9ydCBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgcnRsbGliX3d4X2dldF9lbmNvZGVfZXh0KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAorCQkJICAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCit7CisJc3RydWN0IGl3X3BvaW50ICplbmNvZGluZyA9ICZ3cnF1LT5lbmNvZGluZzsKKwlzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqZXh0ID0gKHN0cnVjdCBpd19lbmNvZGVfZXh0ICopZXh0cmE7CisJc3RydWN0IHJ0bGxpYl9jcnlwdF9kYXRhICpjcnlwdDsKKwlpbnQgaWR4LCBtYXhfa2V5X2xlbjsKKworCW1heF9rZXlfbGVuID0gZW5jb2RpbmctPmxlbmd0aCAtIHNpemVvZigqZXh0KTsKKwlpZiAobWF4X2tleV9sZW4gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlkeCA9IGVuY29kaW5nLT5mbGFncyAmIElXX0VOQ09ERV9JTkRFWDsKKwlpZiAoaWR4KSB7CisJCWlmIChpZHggPCAxIHx8IGlkeCA+IFdFUF9LRVlTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlkeC0tOworCX0gZWxzZSB7CisJCWlkeCA9IGllZWUtPnR4X2tleWlkeDsKKwl9CisJaWYgKCEoZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX0dST1VQX0tFWSkgJiYKKwkgICAgKGV4dC0+YWxnICE9IElXX0VOQ09ERV9BTEdfV0VQKSkKKwkJaWYgKGlkeCAhPSAwIHx8IChpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwljcnlwdCA9IGllZWUtPmNyeXB0W2lkeF07CisKKwllbmNvZGluZy0+ZmxhZ3MgPSBpZHggKyAxOworCW1lbXNldChleHQsIDAsIHNpemVvZigqZXh0KSk7CisKKwlpZiAoY3J5cHQgPT0gTlVMTCB8fCBjcnlwdC0+b3BzID09IE5VTEwpIHsKKwkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX05PTkU7CisJCWV4dC0+a2V5X2xlbiA9IDA7CisJCWVuY29kaW5nLT5mbGFncyB8PSBJV19FTkNPREVfRElTQUJMRUQ7CisJfSBlbHNlIHsKKwkJaWYgKHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCAiV0VQIikgPT0gMCkKKwkJCWV4dC0+YWxnID0gSVdfRU5DT0RFX0FMR19XRVA7CisJCWVsc2UgaWYgKHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCAiVEtJUCIpKQorCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX1RLSVA7CisJCWVsc2UgaWYgKHN0cmNtcChjcnlwdC0+b3BzLT5uYW1lLCAiQ0NNUCIpKQorCQkJZXh0LT5hbGcgPSBJV19FTkNPREVfQUxHX0NDTVA7CisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCQlleHQtPmtleV9sZW4gPSBjcnlwdC0+b3BzLT5nZXRfa2V5KGV4dC0+a2V5LCBTQ01fS0VZX0xFTiwKKwkJCQkJCSAgIE5VTEwsIGNyeXB0LT5wcml2KTsKKwkJZW5jb2RpbmctPmZsYWdzIHw9IElXX0VOQ09ERV9FTkFCTEVEOworCQlpZiAoZXh0LT5rZXlfbGVuICYmCisJCSAgICAoZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19US0lQIHx8CisJCSAgICAgZXh0LT5hbGcgPT0gSVdfRU5DT0RFX0FMR19DQ01QKSkKKwkJCWV4dC0+ZXh0X2ZsYWdzIHw9IElXX0VOQ09ERV9FWFRfVFhfU0VRX1ZBTElEOworCisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBydGxsaWJfd3hfc2V0X21sbWUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwl1OCBpID0gMDsKKwlib29sIGRlYXV0aCA9IGZhbHNlOworCXN0cnVjdCBpd19tbG1lICptbG1lID0gKHN0cnVjdCBpd19tbG1lICopIGV4dHJhOworCisJaWYgKGllZWUtPnN0YXRlICE9IFJUTExJQl9MSU5LRUQpCisJCXJldHVybiAtRU5PTElOSzsKKworCWRvd24oJmllZWUtPnd4X3NlbSk7CisKKwlzd2l0Y2ggKG1sbWUtPmNtZCkgeworCWNhc2UgSVdfTUxNRV9ERUFVVEg6CisJCWRlYXV0aCA9IHRydWU7CisJCS8qIGxlYXZlIGJyZWFrIG91dCBpbnRlbnRpb25seSAqLworCisJY2FzZSBJV19NTE1FX0RJU0FTU09DOgorCQlpZiAoZGVhdXRoID09IHRydWUpCisJCQlwcmludGsoS0VSTl9JTkZPICJkaXNhdXRoIHBhY2tldCAhXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiZGlzIGFzc29jaWF0ZSBwYWNrZXQhXG4iKTsKKworCQlpZWVlLT5jYW5ub3Rfbm90aWZ5ID0gdHJ1ZTsKKworCQlTZW5kRGlzYXNzb2NpYXRpb24oaWVlZSwgZGVhdXRoLCBtbG1lLT5yZWFzb25fY29kZSk7CisJCXJ0bGxpYl9kaXNhc3NvY2lhdGUoaWVlZSk7CisKKwkJaWVlZS0+d2FwX3NldCA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWRbaV0gPSAweDU1OworCisJCWllZWUtPnNzaWRfc2V0ID0gMDsKKwkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRbMF0gPSAnXDAnOworCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl1cCgmaWVlZS0+d3hfc2VtKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCXVwKCZpZWVlLT53eF9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBydGxsaWJfd3hfc2V0X2F1dGgoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsCisJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgICBzdHJ1Y3QgaXdfcGFyYW0gKmRhdGEsIGNoYXIgKmV4dHJhKQoreworCXN3aXRjaCAoZGF0YS0+ZmxhZ3MgJiBJV19BVVRIX0lOREVYKSB7CisJY2FzZSBJV19BVVRIX1dQQV9WRVJTSU9OOgorCQlicmVhazsKKwljYXNlIElXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFOgorCWNhc2UgSVdfQVVUSF9DSVBIRVJfR1JPVVA6CisJY2FzZSBJV19BVVRIX0tFWV9NR01UOgorCQkvKgorCQkgKiBIb3N0IEFQIGRyaXZlciBkb2VzIG5vdCB1c2UgdGhlc2UgcGFyYW1ldGVycyBhbmQgYWxsb3dzCisJCSAqIHdwYV9zdXBwbGljYW50IHRvIGNvbnRyb2wgdGhlbSBpbnRlcm5hbGx5LgorCQkgKi8KKwkJYnJlYWs7CisJY2FzZSBJV19BVVRIX1RLSVBfQ09VTlRFUk1FQVNVUkVTOgorCQlpZWVlLT50a2lwX2NvdW50ZXJtZWFzdXJlcyA9IGRhdGEtPnZhbHVlOworCQlicmVhazsKKwljYXNlIElXX0FVVEhfRFJPUF9VTkVOQ1JZUFRFRDoKKwkJaWVlZS0+ZHJvcF91bmVuY3J5cHRlZCA9IGRhdGEtPnZhbHVlOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF84MDIxMV9BVVRIX0FMRzoKKwkJaWYgKGRhdGEtPnZhbHVlICYgSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSkgeworCQkJaWVlZS0+b3Blbl93ZXAgPSAwOworCQkJaWVlZS0+YXV0aF9tb2RlID0gMTsKKwkJfSBlbHNlIGlmIChkYXRhLT52YWx1ZSAmIElXX0FVVEhfQUxHX09QRU5fU1lTVEVNKSB7CisJCQlpZWVlLT5vcGVuX3dlcCA9IDE7CisJCQlpZWVlLT5hdXRoX21vZGUgPSAwOworCQl9IGVsc2UgaWYgKGRhdGEtPnZhbHVlICYgSVdfQVVUSF9BTEdfTEVBUCkgeworCQkJaWVlZS0+b3Blbl93ZXAgPSAxOworCQkJaWVlZS0+YXV0aF9tb2RlID0gMjsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwljYXNlIElXX0FVVEhfV1BBX0VOQUJMRUQ6CisJCWllZWUtPndwYV9lbmFibGVkID0gKGRhdGEtPnZhbHVlKSA/IDEgOiAwOworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9SWF9VTkVOQ1JZUFRFRF9FQVBPTDoKKwkJaWVlZS0+aWVlZTgwMl8xeCA9IGRhdGEtPnZhbHVlOworCQlicmVhazsKKwljYXNlIElXX0FVVEhfUFJJVkFDWV9JTlZPS0VEOgorCQlpZWVlLT5wcml2YWN5X2ludm9rZWQgPSBkYXRhLT52YWx1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHJ0bGxpYl93eF9zZXRfZ2VuX2llKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCAqaWUsIHNpemVfdCBsZW4pCit7CisJdTggKmJ1ZjsKKwl1OCBlaWQsIHdwc19vdWlbNF0gPSB7MHgwLCAweDUwLCAweGYyLCAweDA0fTsKKworCWlmIChsZW4gPiBNQVhfV1BBX0lFX0xFTiB8fCAobGVuICYmIGllID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChsZW4pIHsKKwkJZWlkID0gaWVbMF07CisJCWlmICgoZWlkID09IE1GSUVfVFlQRV9HRU5FUklDKSAmJiAoIW1lbWNtcCgmaWVbMl0sCisJCSAgICAgd3BzX291aSwgNCkpKSB7CisKKwkJCWllZWUtPndwc19pZV9sZW4gPSAobGVuIDwgTUFYX1daQ19JRV9MRU4pID8gKGxlbikgOgorCQkJCQkgICAoTUFYX1daQ19JRV9MRU4pOworCQkJYnVmID0ga21hbGxvYyhpZWVlLT53cHNfaWVfbGVuLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChidWYgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCW1lbWNweShidWYsIGllLCBpZWVlLT53cHNfaWVfbGVuKTsKKwkJCWllZWUtPndwc19pZSA9IGJ1ZjsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWllZWUtPndwc19pZV9sZW4gPSAwOworCWtmcmVlKGllZWUtPndwc19pZSk7CisJaWVlZS0+d3BzX2llID0gTlVMTDsKKwlpZiAobGVuKSB7CisJCWlmIChsZW4gIT0gaWVbMV0rMikKKwkJCXJldHVybiAtRUlOVkFMOworCQlidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmIChidWYgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQltZW1jcHkoYnVmLCBpZSwgbGVuKTsKKwkJa2ZyZWUoaWVlZS0+d3BhX2llKTsKKwkJaWVlZS0+d3BhX2llID0gYnVmOworCQlpZWVlLT53cGFfaWVfbGVuID0gbGVuOworCX0gZWxzZSB7CisJCWtmcmVlKGllZWUtPndwYV9pZSk7CisJCWllZWUtPndwYV9pZSA9IE5VTEw7CisJCWllZWUtPndwYV9pZV9sZW4gPSAwOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL01ha2VmaWxlCmluZGV4IDA3NzVjNTUuLjUxZWZmZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9NYWtlZmlsZQpAQCAtMSwyNSArMSw5IEBACiBOSUNfU0VMRUNUID0gUlRMODE5MlUKIAotS1ZFUiAgOj0gJChzaGVsbCB1bmFtZSAtcikKLU1PRERFU1RESVIgOj0gL2xpYi9tb2R1bGVzLyQoS1ZFUikva2VybmVsL2RyaXZlcnMvbmV0L3dpcmVsZXNzLyQoTklDX1NFTEVDVCkKLQotQ0MgPSBnY2MKLWlmbmVxICgkKHNoZWxsIHVuYW1lIC1yfGN1dCAtZC4gLWYxLDIpLCAyLjQpCiBjY2ZsYWdzLXkgOj0gLUkkKFRPUERJUikvZHJpdmVycy9uZXQvd2lyZWxlc3MKIGNjZmxhZ3MteSArPSAtTzIKIGNjZmxhZ3MteSArPSAtREpBQ0tTT05fTkVXXzgxODcgLURKQUNLU09OX05FV19SWAogCi0jaXQgd2lsbCBmYWlsIHRvIGNvbXBpbGUgaW4gc3VzZSBsaW51eCBlbnRlcnByaXNlIDEwIHNwMi4gVGhpcyBmbGFnIGlzIHRvIHNvbHZlIHRoaXMgcHJvYmxlbS4KLWlmZXEgKCQoc2hlbGwgdW5hbWUgLXIgfCBjdXQgLWQuIC1mMSwyLDMsNCksIDIuNi4xNi42MC0wKQotY2NmbGFncy15IDo9IC1ET1BFTlNVU0VfU0xFRAotZW5kaWYKLQotaWZlcSAoJChOSUNfU0VMRUNUKSxSVEw4MTkyVSkKLSNjY2ZsYWdzLXkgOj0gLURVU0JfVFhfRFJJVkVSX0FHR1JFR0FUSU9OX0VOQUJMRQotI2NjZmxhZ3MteSA6PSAtRFVTQl9SWF9BR0dSRUdBVElPTl9TVVBQT1JUCi1lbmRpZgotI2NjZmxhZ3MteSA6PSAtREpPSE5fTk9DUFkKLSNmbGFncyB0byBlbmFibGUgb3IgZGlzYmxlIDgwMjExRCBmZWF0dXJlCiBpZWVlODAyMTEtcnNsLW9ianMgOj0gaWVlZTgwMjExX3J4Lm8gXAogCQkgICAgICBpZWVlODAyMTFfc29mdG1hYy5vIFwKIAkJICAgICAgaWVlZTgwMjExX3R4Lm8gXApAQCAtNDIsOTYgKzI2LDMgQEAKIG9iai1tICs9aWVlZTgwMjExX2NyeXB0X3RraXAtcnNsLm8KIG9iai1tICs9aWVlZTgwMjExX2NyeXB0X2NjbXAtcnNsLm8KIAotS1NSQyA6PSAvbGliL21vZHVsZXMvJChLVkVSKS9idWlsZAotSU5TVEFMTF9QUkVGSVggOj0KLQotYWxsOiBtb2R1bGVzCi0KLW1vZHVsZXM6Ci0JJChNQUtFKSAtQyAkKEtTUkMpIE09JChQV0QpIENDPSQoQ0MpIG1vZHVsZXMKLQotaW5zdGFsbDogbW9kdWxlcwotCXJtIC1mciAkKE1PRERFU1RESVIpCi0JbWtkaXIgLXAgJChNT0RERVNURElSKQotCUBpbnN0YWxsIC1wIC1tIDY0NCBpZWVlODAyMTFfY3J5cHQtcnNsLmtvICQoTU9EREVTVERJUikKLQlAaW5zdGFsbCAtcCAtbSA2NDQgaWVlZTgwMjExX2NyeXB0X3dlcC1yc2wua28gJChNT0RERVNURElSKQotCUBpbnN0YWxsIC1wIC1tIDY0NCBpZWVlODAyMTFfY3J5cHRfdGtpcC1yc2wua28gJChNT0RERVNURElSKQotCUBpbnN0YWxsIC1wIC1tIDY0NCBpZWVlODAyMTFfY3J5cHRfY2NtcC1yc2wua28gJChNT0RERVNURElSKQotCUBpbnN0YWxsIC1wIC1tIDY0NCBpZWVlODAyMTEtcnNsLmtvICQoTU9EREVTVERJUikKLQlkZXBtb2QgLWEKLXVuaW5zdGFsbDoKLQlybSAtZnIgJChNT0RERVNURElSKQotCWRlcG1vZCAtYQotCi1lbHNlCi1MRCA6PSBsZAotS1NSQyA6PSAvbGliL21vZHVsZXMvJChLVkVSKS9idWlsZAotQ09ORklHX0ZJTEUgOj0gJChLU1JDKS9pbmNsdWRlL2xpbnV4L2F1dG9jb25mLmgKLQotQ0ZMQUdTICs9IC1ETElOVVggLURfX0tFUk5FTF9fIC1ETU9EVUxFIC1PMiAtcGlwZSAtV2FsbAotQ0ZMQUdTICs9IC1JJChLU1JDKS9pbmNsdWRlIC1JLgotI0tlcm5lbCAyLjQuMzEKLUNGTEFHUyArPSAtRE1PRFZFUlNJT05TIC1ERVhQT1JUX1NZTVRBQiAtaW5jbHVkZSAkKEtTUkMpL2luY2x1ZGUvbGludXgvbW9kdmVyc2lvbnMuaAotI0tlcm5lbCAyLjQuMjAKLSNDRkxBR1MgKz0gLURfX05PX1ZFUlNJT05fXyAtREVYUE9SVF9TWU1UQUIKLVNNUCA6PSAkKHNoZWxsICQoQ0MpICQoTU9EQ0ZMQUdTKSAtRSAtZE0gJChDT05GSUdfRklMRSkgfCBcCi0gICBncmVwIENPTkZJR19TTVAgfCBhd2sgJ3twcmludCAkJDN9JykKLWlmbmVxICgkKFNNUCksMSkKLSAgIFNNUCA6PSAwCi1lbmRpZgotaWZlcSAoJChTTVApLDEpCi0gICBDRkxBR1MgICAgKz0gLURfX1NNUF9fCi1lbmRpZgotCi0jQ0ZMQUdTICs9IC1ESk9ITl9OT0NQWQotCi1PQkpTIDo9ICR7cGF0c3Vic3QgJS5jLCAlLm8sICR7d2lsZGNhcmQgKi5jfX0KLWFsbDoke09CSlN9IGllZWU4MDIxMV9jcnlwdC1yc2wubyBtaWNoYWVsX21pYy1yc2wubyBhZXMtcnNsLm8gaWVlZTgwMjExX2NyeXB0X3dlcC1yc2wubyBpZWVlODAyMTFfY3J5cHRfdGtpcC1yc2wubyBpZWVlODAyMTFfY3J5cHRfY2NtcC1yc2wubyBjcnlwdG8tcnNsLm8gaWVlZTgwMjExLXJzbC5vCi0KLWllZWU4MDIxMV9jcnlwdC1yc2wubzogaWVlZTgwMjExX2NyeXB0Lm8KLQltdiAkXiAkQAotCi1taWNoYWVsX21pYy1yc2wubzogbWljaGFlbF9taWMubwotCW12ICReICRACi0KLWFlcy1yc2wubzogYWVzLm8KLQltdiAkXiAkQAotCi1pZWVlODAyMTFfY3J5cHRfd2VwLXJzbC5vOiBpZWVlODAyMTFfY3J5cHRfd2VwLm8KLQltdiAkXiAkQAotCi1pZWVlODAyMTFfY3J5cHRfdGtpcC1yc2wubzogaWVlZTgwMjExX2NyeXB0X3RraXAubwotCW12ICReICRACi0KLWllZWU4MDIxMV9jcnlwdF9jY21wLXJzbC5vOiBpZWVlODAyMTFfY3J5cHRfY2NtcC5vCi0JbXYgJF4gJEAKLQotY3J5cHRvLXJzbC5vOiBhcmM0Lm8gYXBpLm8gYXV0b2xvYWQubyBjaXBoZXIubyBjb21wcmVzcy5vIGRpZ2VzdC5vIHNjYXR0ZXJ3YWxrLm8gcHJvYy5vCi0JJChMRCkgLXIgJF4gLW8gJEAKLQotaWVlZTgwMjExLXJzbC5vOiBpZWVlODAyMTFfcngubyBpZWVlODAyMTFfdHgubyBpZWVlODAyMTFfd3gubyBpZWVlODAyMTFfbW9kdWxlLm8gaWVlZTgwMjExX3NvZnRtYWNfd3gubyBpZWVlODAyMTFfc29mdG1hYy5vIHJ0bDgxOXhfSFRQcm9jLm8gcnRsODE5eF9UU1Byb2MubyBydGw4MTl4X0JBUHJvYy5vIGRvdDExZC5vCi0JJChMRCkgLXIgJF4gLW8gJEAKLWluc3RhbGw6Ci0Jcm0gLWZyICQoTU9EREVTVERJUikKLQlta2RpciAtcCAkKE1PRERFU1RESVIpCi0JQGluc3RhbGwgLXAgLW0gNjQ0IGllZWU4MDIxMV9jcnlwdC1yc2wubyAkKE1PRERFU1RESVIpCi0JQGluc3RhbGwgLXAgLW0gNjQ0IGNyeXB0by1yc2wubyAkKE1PRERFU1RESVIpCi0JQGluc3RhbGwgLXAgLW0gNjQ0IG1pY2hhZWxfbWljLXJzbC5vICQoTU9EREVTVERJUikKLQlAaW5zdGFsbCAtcCAtbSA2NDQgYWVzLXJzbC5vICQoTU9EREVTVERJUikKLQlAaW5zdGFsbCAtcCAtbSA2NDQgaWVlZTgwMjExX2NyeXB0X3dlcC1yc2wubyAkKE1PRERFU1RESVIpCi0JQGluc3RhbGwgLXAgLW0gNjQ0IGllZWU4MDIxMV9jcnlwdF90a2lwLXJzbC5vICQoTU9EREVTVERJUikKLQlAaW5zdGFsbCAtcCAtbSA2NDQgaWVlZTgwMjExX2NyeXB0X2NjbXAtcnNsLm8gJChNT0RERVNURElSKQotCUBpbnN0YWxsIC1wIC1tIDY0NCBpZWVlODAyMTEtcnNsLm8gJChNT0RERVNURElSKQotCS9zYmluL2RlcG1vZCAtYSAke3NoZWxsIHVuYW1lIC1yfQotCi11bmluc3RhbGw6Ci0Jcm0gLWZyICQoTU9EREVTVERJUikKLQkvc2Jpbi9kZXBtb2QgLWEgJHtzaGVsbCB1bmFtZSAtcn0KLQotZW5kaWYKLQotLlBIT05ZOiBjbGVhbgotY2xlYW46Ci0Jcm0gLWZyICoubW9kLmMgKi5tb2QgKi5vIC4qLmNtZCAqLm1vZC4qICoua28gKi5vICp+Ci0Jcm0gLXJmIC50bXBfdmVyc2lvbnMKLQlybSAtcmYgTW9kdWxlLnN5bXZlcnMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY29tcHJlc3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvY29tcHJlc3MuYwppbmRleCA4NmMyM2M5Li41NDE2YWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2NvbXByZXNzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9jb21wcmVzcy5jCkBAIC0xMiwxMCArMTIsMTAgQEAKICAqCiAgKi8KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotLy8jaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisvKiNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4qLwogI2luY2x1ZGUgInJ0bF9jcnlwdG8uaCIKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTEuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExLmgKaW5kZXggNDYzY2MyNi4uMWMwYTFkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMS5oCkBAIC0yNDE2LDggKzI0MTYsOCBAQAogZXh0ZXJuIGludCBpZWVlODAyMTFfd3hfc2V0X2dlbl9pZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKmllLCBzaXplX3QgbGVuKTsKIAogLyogaWVlZTgwMjExX3NvZnRtYWMuYyAqLwotZXh0ZXJuIHNob3J0IGllZWU4MDIxMV9pc181NGcoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIG5ldCk7Ci1leHRlcm4gc2hvcnQgaWVlZTgwMjExX2lzX3Nob3J0c2xvdChzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmsgbmV0KTsKK2V4dGVybiBzaG9ydCBpZWVlODAyMTFfaXNfNTRnKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0KTsKK2V4dGVybiBzaG9ydCBpZWVlODAyMTFfaXNfc2hvcnRzbG90KGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0KTsKIGV4dGVybiBpbnQgaWVlZTgwMjExX3J4X2ZyYW1lX3NvZnRtYWMoc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXRzICpyeF9zdGF0cywgdTE2IHR5cGUsCiAJCQl1MTYgc3R5cGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCmluZGV4IGIwMGViMGUuLmMyYWI1ZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKQEAgLTMxLDE0ICszMSwxNCBAQAogCXsweDAwLDB4MEYsMHhBQywweDA1fSwgLy9XRVAtMTA0CiB9OwogCi1zaG9ydCBpZWVlODAyMTFfaXNfNTRnKHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayBuZXQpCitzaG9ydCBpZWVlODAyMTFfaXNfNTRnKGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqbmV0KQogewotCXJldHVybiAoKG5ldC5yYXRlc19leF9sZW4gPiAwKSB8fCAobmV0LnJhdGVzX2xlbiA+IDQpKTsKKwlyZXR1cm4gKG5ldC0+cmF0ZXNfZXhfbGVuID4gMCkgfHwgKG5ldC0+cmF0ZXNfbGVuID4gNCk7CiB9CiAKLXNob3J0IGllZWU4MDIxMV9pc19zaG9ydHNsb3Qoc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrIG5ldCkKK3Nob3J0IGllZWU4MDIxMV9pc19zaG9ydHNsb3QoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9uZXR3b3JrICpuZXQpCiB7Ci0JcmV0dXJuIChuZXQuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9TSE9SVF9TTE9UKTsKKwlyZXR1cm4gbmV0LT5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1NMT1Q7CiB9CiAKIC8qIHJldHVybnMgdGhlIHRvdGFsIGxlbmd0aCBuZWVkZWQgZm9yIHBsZWFjaW5nIHRoZSBSQVRFIE1GSUUKQEAgLTcxOCw3ICs3MTgsNyBAQAogCWVsc2UKIAkJYXRpbV9sZW4gPSAwOwogCi0JaWYoaWVlZTgwMjExX2lzXzU0ZyhpZWVlLT5jdXJyZW50X25ldHdvcmspKQorCWlmKGllZWU4MDIxMV9pc181NGcoJmllZWUtPmN1cnJlbnRfbmV0d29yaykpCiAJCWVycF9sZW4gPSAzOwogCWVsc2UKIAkJZXJwX2xlbiA9IDA7CkBAIC0xMzMzLDcgKzEzMzMsNyBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlLCBhc3NvY2lhdGVfY29tcGxldGVfd3EpOwogCXByaW50ayhLRVJOX0lORk8gIkFzc29jaWF0ZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKLQlpZihpZWVlODAyMTFfaXNfNTRnKGllZWUtPmN1cnJlbnRfbmV0d29yaykgJiYKKwlpZihpZWVlODAyMTFfaXNfNTRnKCZpZWVlLT5jdXJyZW50X25ldHdvcmspICYmCiAJCShpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX09GRE1fTU9EVUxBVElPTikpewogCiAJCWllZWUtPnJhdGUgPSAxMDg7CkBAIC0xNDg5LDcgKzE0ODksNyBAQAogCQkJCQlpZWVlLT5zdGF0ZSA9IElFRUU4MDIxMV9BU1NPQ0lBVElORzsKIAkJCQkJcXVldWVfd29yayhpZWVlLT53cSwgJmllZWUtPmFzc29jaWF0ZV9wcm9jZWR1cmVfd3EpOwogCQkJCX1lbHNlewotCQkJCQlpZihpZWVlODAyMTFfaXNfNTRnKGllZWUtPmN1cnJlbnRfbmV0d29yaykgJiYKKwkJCQkJaWYoaWVlZTgwMjExX2lzXzU0ZygmaWVlZS0+Y3VycmVudF9uZXR3b3JrKSAmJgogCQkJCQkJKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OKSl7CiAJCQkJCQlpZWVlLT5yYXRlID0gMTA4OwogCQkJCQkJaWVlZS0+U2V0V2lyZWxlc3NNb2RlKGllZWUtPmRldiwgSUVFRV9HKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9LY29uZmlnCmluZGV4IDA0MWUxZTguLmVhMzc0NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvS2NvbmZpZwpAQCAtMTYsNCArMTYsMTEgQEAKIAktLS1oZWxwLS0tCiAJVGhpcyBvcHRpb24gYWxsb3dzIHRoZSBSZWFsdGVrIFJUTDg3MTIgVVNCIGRldmljZSB0byBiZSBhbiBBY2Nlc3MgUG9pbnQuCiAKK2NvbmZpZyBSODcxMl9UWF9BR0dSCisJYm9vbCAiUmVhbHRlayBSVEw4NzEyVSBUcmFuc21pdCBBZ2dyZWdhdGlvbiBjb2RlIgorCWRlcGVuZHMgb24gUjg3MTJVICYmIEJST0tFTgorCWRlZmF1bHQgTgorCS0tLWhlbHAtLS0KKwlUaGlzIG9wdGlvbiBwcm92aWRlcyB0cmFuc21pdCBhZ2dyZWdhdGlvbiBmb3IgdGhlIFJlYWx0ZWsgUlRMODcxMiBVU0IgZGV2aWNlLgorCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2Jhc2ljX3R5cGVzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9iYXNpY190eXBlcy5oCmluZGV4IGEwNTM4YTguLjc1NjFiZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2Jhc2ljX3R5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvYmFzaWNfdHlwZXMuaApAQCAtMSwzICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBNb2RpZmljYXRpb25zIGZvciBpbmNsdXNpb24gaW50byB0aGUgTGludXggc3RhZ2luZyB0cmVlIGFyZQorICogQ29weXJpZ2h0KGMpIDIwMTAgTGFycnkgRmluZ2VyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246CisgKiBXTEFOIEZBRSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmbmRlZiBfX0JBU0lDX1RZUEVTX0hfXwogI2RlZmluZSBfX0JBU0lDX1RZUEVTX0hfXwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9iaWdfZW5kaWFuLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9iaWdfZW5kaWFuLmgKaW5kZXggODUxMmQxYi4uYjE2ZjhlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvYmlnX2VuZGlhbi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2JpZ19lbmRpYW4uaApAQCAtMSwzICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBNb2RpZmljYXRpb25zIGZvciBpbmNsdXNpb24gaW50byB0aGUgTGludXggc3RhZ2luZyB0cmVlIGFyZQorICogQ29weXJpZ2h0KGMpIDIwMTAgTGFycnkgRmluZ2VyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246CisgKiBXTEFOIEZBRSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmbmRlZiBfTElOVVhfQllURU9SREVSX0JJR19FTkRJQU5fSAogI2RlZmluZSBfTElOVVhfQllURU9SREVSX0JJR19FTkRJQU5fSAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9kcnZfdHlwZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2Rydl90eXBlcy5oCmluZGV4IDRmMzgwYTYuLjliNWQ3NzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2Rydl90eXBlcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2Rydl90eXBlcy5oCkBAIC0xLDMgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBMaW51eCBzdGFnaW5nIHRyZWUgYXJlCisgKiBDb3B5cmlnaHQoYykgMjAxMCBMYXJyeSBGaW5nZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjoKKyAqIFdMQU4gRkFFIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAJRm9yIHR5cGUgZGVmaW5lcyBhbmQgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5lcwpAQCAtMTE3LDYgKzE0MiwxMSBAQAogCXN0cnVjdCB1c2JfZGV2aWNlICpwdXNiZGV2OwogfTsKIAorLyoqCisgKiBzdHJ1Y3QgX2FkYXB0ZXIgLSB0aGUgbWFpbiBhZGFwdGVyIHN0cnVjdHVyZSBmb3IgdGhpcyBkZXZpY2UuCisgKgorICogYnVwOiBUcnVlIGluZGljYXRlcyB0aGF0IHRoZSBpbnRlcmZhY2UgaXMgVXAuCisgKi8KIHN0cnVjdCBfYWRhcHRlciB7CiAJc3RydWN0CWR2b2JqX3ByaXYgZHZvYmpwcml2OwogCXN0cnVjdAltbG1lX3ByaXYgbWxtZXByaXY7CkBAIC0xNTEsNiArMTgxLDkgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyBzdGF0czsKIAlzdHJ1Y3QgaXdfc3RhdGlzdGljcyBpd3N0YXRzOwogCWludCBwaWQ7IC8qcHJvY2VzcyBpZCBmcm9tIFVJKi8KKwlfd29ya2l0ZW0gd2tGaWx0ZXJSeEZGMDsKKwl1OCBibG5FbmFibGVSeEZGMEZpbHRlcjsKKwlzcGlubG9ja190IGxvY2tSeEZGMEZpbHRlcjsKIH07CiAKIHN0YXRpYyBpbmxpbmUgdTggKm15aWQoc3RydWN0IGVlcHJvbV9wcml2ICpwZWVwcml2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvZXRoZXJuZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2V0aGVybmV0LmgKaW5kZXggYmE4ZDc3Ny4uODgyZDYxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvZXRoZXJuZXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ldGhlcm5ldC5oCkBAIC0xLDMgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBMaW51eCBzdGFnaW5nIHRyZWUgYXJlCisgKiBDb3B5cmlnaHQoYykgMjAxMCBMYXJyeSBGaW5nZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjoKKyAqIFdMQU4gRkFFIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9fSU5DX0VUSEVSTkVUX0gKICNkZWZpbmUgX19JTkNfRVRIRVJORVRfSAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9nZW5lcmljLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9nZW5lcmljLmgKaW5kZXggNzQyNDI0Yi4uODg2OGM5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvZ2VuZXJpYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2dlbmVyaWMuaApAQCAtMSwzICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBNb2RpZmljYXRpb25zIGZvciBpbmNsdXNpb24gaW50byB0aGUgTGludXggc3RhZ2luZyB0cmVlIGFyZQorICogQ29weXJpZ2h0KGMpIDIwMTAgTGFycnkgRmluZ2VyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246CisgKiBXTEFOIEZBRSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmbmRlZiBfTElOVVhfQllURU9SREVSX0dFTkVSSUNfSAogI2RlZmluZSBfTElOVVhfQllURU9SREVSX0dFTkVSSUNfSAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9oYWxfaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvaGFsX2luaXQuYwppbmRleCAxNDExYzdiZi4uZDAwMjlhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvaGFsX2luaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9oYWxfaW5pdC5jCkBAIC0yOCw2ICsyOCwxMiBAQAogCiAjZGVmaW5lIF9IQUxfSU5JVF9DXwogCisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKICNpbmNsdWRlICJvc2RlcF9zZXJ2aWNlLmgiCiAjaW5jbHVkZSAiZHJ2X3R5cGVzLmgiCiAjaW5jbHVkZSAicnRsODcxeF9ieXRlb3JkZXIuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2llZWU4MDIxMS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvaWVlZTgwMjExLmMKaW5kZXggZjA2YWRkYy4uY2M2OGQ5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvaWVlZTgwMjExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvaWVlZTgwMjExLmMKQEAgLTE3MCwxNyArMTcwLDExIEBACiAJcmV0dXJuIGk7CiB9CiAKLWludCByODcxMl9nZW5lcmF0ZV9pZShzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdiwKLQkJICAgICAgc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlcikKK2ludCByODcxMl9nZW5lcmF0ZV9pZShzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ2lzdHJ5cHJpdikKIHsKIAlpbnQgc3ogPSAwLCByYXRlTGVuOwogCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwZGV2X25ldHdvcmsgPSAmcHJlZ2lzdHJ5cHJpdi0+ZGV2X25ldHdvcms7CiAJdTggKmllID0gcGRldl9uZXR3b3JrLT5JRXM7Ci0Jc3RydWN0IGllZWU4MDIxMV9odF9jYXAgaHRfY2FwaWU7Ci0Jc3RydWN0IGllZWU4MDIxMV9odF9hZGR0X2luZm8gaHRfYWRkdF9pbmZvOwotCXVuc2lnbmVkIGNoYXIgV01NX0lFW10gPSB7MHgwMCwgMHg1MCwgMHhmMiwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMH07Ci0Jc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKLQlzdHJ1Y3QgcW9zX3ByaXYgKnBxb3Nwcml2ID0gJnBtbG1lcHJpdi0+cW9zcHJpdjsKIAogCS8qdGltZXN0YW1wIHdpbGwgYmUgaW5zZXJ0ZWQgYnkgaGFyZHdhcmUqLwogCXN6ICs9IDg7CkBAIC0yMTksMzMgKzIxMyw2IEBACiAJLypJQlNTIFBhcmFtZXRlciBTZXQqLwogCWllID0gcjg3MTJfc2V0X2llKGllLCBfSUJTU19QQVJBX0lFXywgMiwKIAkJICAgICh1OCAqKSYocGRldl9uZXR3b3JrLT5Db25maWd1cmF0aW9uLkFUSU1XaW5kb3cpLCAmc3opOwotCWlmIChwcmVnaXN0cnlwcml2LT5odF9lbmFibGUgPT0gMSkgewotCQlpZiAocHFvc3ByaXYtPnFvc19vcHRpb24gPT0gMCkgewotCQkJaWUgPSByODcxMl9zZXRfaWUoaWUsIF9WRU5ET1JfU1BFQ0lGSUNfSUVfLAotCQkJCQkgICBfV01NX0lFX0xlbmd0aF8sIFdNTV9JRSwgJnN6KTsKLQkJCXBxb3Nwcml2LT5xb3Nfb3B0aW9uID0gMTsKLQkJfQotCQltZW1zZXQoJmh0X2NhcGllLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApKTsKLQkJaHRfY2FwaWUuY2FwX2luZm8gPSBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSCB8Ci0JCQkJICAgIElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwIHwKLQkJCQkgICAgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDAgfAotCQkJCSAgICBJRUVFODAyMTFfSFRfQ0FQX1RYX1NUQkMgfAotCQkJCSAgICBJRUVFODAyMTFfSFRfQ0FQX01BWF9BTVNEVSB8Ci0JCQkJICAgIElFRUU4MDIxMV9IVF9DQVBfRFNTU0NDSzQwOwotCQlodF9jYXBpZS5hbXBkdV9wYXJhbXNfaW5mbyA9IChJRUVFODAyMTFfSFRfQ0FQX0FNUERVX0ZBQ1RPUiAmCi0JCQkJMHgwMykgfCAoSUVFRTgwMjExX0hUX0NBUF9BTVBEVV9ERU5TSVRZICYgMHgwMCk7Ci0JCWllID0gcjg3MTJfc2V0X2llKGllLCBfSFRfQ0FQQUJJTElUWV9JRV8sCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSwKLQkJCSAgICAodW5zaWduZWQgY2hhciAqKSZodF9jYXBpZSwgJnN6KTsKLQkJLyphZGQgSFQgaW5mbyBpZSovCi0JCW1lbXNldCgmaHRfYWRkdF9pbmZvLCAwLAotCQkJc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfYWRkdF9pbmZvKSk7Ci0JCS8qbmVlZCB0byBhZGQgdGhlIEhUIGFkZGl0aW9uYWwgSUVzKi8KLQkJaHRfYWRkdF9pbmZvLmNvbnRyb2xfY2hhbiA9IHByZWdpc3RyeXByaXYtPmNoYW5uZWw7Ci0JCWllID0gcjg3MTJfc2V0X2llKGllLCBfSFRfQUREX0lORk9fSUVfLAotCQkJICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2FkZHRfaW5mbyksCi0JCQkgICAgKHVuc2lnbmVkIGNoYXIgKikmaHRfYWRkdF9pbmZvLCAmc3opOwotCX0KIAlyZXR1cm4gc3o7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2llZWU4MDIxMS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvaWVlZTgwMjExLmgKaW5kZXggZDYyYzZhYy4uM2MwMDkyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvaWVlZTgwMjExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvaWVlZTgwMjExLmgKQEAgLTEsMyArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGludG8gdGhlIExpbnV4IHN0YWdpbmcgdHJlZSBhcmUKKyAqIENvcHlyaWdodChjKSAyMDEwIExhcnJ5IEZpbmdlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOgorICogV0xBTiBGQUUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX19JRUVFODAyMTFfSAogI2RlZmluZSBfX0lFRUU4MDIxMV9ICiAKQEAgLTExMiw3ICsxMzcsNyBAQAogCXU4IG1hY1tFVEhfQUxFTl07CiAJdTE2IHNlcV9udW07CiAJdTE2IGZyYWdfbnVtOwotCXVuc2lnbmVkIGludCBwYWNrZXRfdGltZTsKKwl1bnNpZ25lZCBsb25nIHBhY2tldF90aW1lOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIH07CiAKQEAgLTY0NCw3ICs2NjksNiBAQAogI2RlZmluZSBDUkNfTEVOR1RIICAgICAgICAgICAgICAgICA0VQogCiAjZGVmaW5lIE1BWF9XUEFfSUVfTEVOIDEyOAotI2RlZmluZSBNQVhfV1BTX0lFX0xFTiA1MTIKIAogI2RlZmluZSBORVRXT1JLX0VNUFRZX0VTU0lEICgxPDwwKQogI2RlZmluZSBORVRXT1JLX0hBU19PRkRNICAgICgxPDwxKQpAQCAtNzY0LDggKzc4OCw3IEBACiBpbnQgcjg3MTJfZ2V0X3NlY19pZSh1OCAqaW5faWUsIHVpbnQgaW5fbGVuLCB1OCAqcnNuX2llLCB1MTYgKnJzbl9sZW4sCiAJCSAgICAgdTggKndwYV9pZSwgdTE2ICp3cGFfbGVuKTsKIGludCByODcxMl9nZXRfd3BzX2llKHU4ICppbl9pZSwgdWludCBpbl9sZW4sIHU4ICp3cHNfaWUsIHVpbnQgKndwc19pZWxlbik7Ci1pbnQgcjg3MTJfZ2VuZXJhdGVfaWUoc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYsCi0JCSAgICAgIHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIpOworaW50IHI4NzEyX2dlbmVyYXRlX2llKHN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2KTsKIHVpbnQgcjg3MTJfaXNfY2NrcmF0ZXNfaW5jbHVkZWQodTggKnJhdGUpOwogdWludCByODcxMl9pc19jY2tyYXRlc29ubHlfaW5jbHVkZWQodTggKnJhdGUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9pZl9ldGhlci5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvaWZfZXRoZXIuaAppbmRleCAwZTk3NTNiLi4yYmJlNTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9pZl9ldGhlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2lmX2V0aGVyLmgKQEAgLTEsMyArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGludG8gdGhlIExpbnV4IHN0YWdpbmcgdHJlZSBhcmUKKyAqIENvcHlyaWdodChjKSAyMDEwIExhcnJ5IEZpbmdlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOgorICogV0xBTiBGQUUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCiAgKiBJTkVUCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVENQL0lQIHByb3RvY29sIHN1aXRlIGZvciB0aGUgTElOVVgKICAqCQlvcGVyYXRpbmcgc3lzdGVtLiAgSU5FVCBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgIEJTRCBTb2NrZXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2xpdHRsZV9lbmRpYW4uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2xpdHRsZV9lbmRpYW4uaAppbmRleCAwMjQ4YzE0Li5jZDU3ZDZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9saXR0bGVfZW5kaWFuLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvbGl0dGxlX2VuZGlhbi5oCkBAIC0xLDMgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBMaW51eCBzdGFnaW5nIHRyZWUgYXJlCisgKiBDb3B5cmlnaHQoYykgMjAxMCBMYXJyeSBGaW5nZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjoKKyAqIFdMQU4gRkFFIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9MSU5VWF9CWVRFT1JERVJfTElUVExFX0VORElBTl9ICiAjZGVmaW5lIF9MSU5VWF9CWVRFT1JERVJfTElUVExFX0VORElBTl9ICiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL21sbWVfb3NkZXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL21sbWVfb3NkZXAuaAppbmRleCA5NjhlNzg3Li5hMjBmZTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9tbG1lX29zZGVwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvbWxtZV9vc2RlcC5oCkBAIC0xLDMgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBMaW51eCBzdGFnaW5nIHRyZWUgYXJlCisgKiBDb3B5cmlnaHQoYykgMjAxMCBMYXJyeSBGaW5nZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjoKKyAqIFdMQU4gRkFFIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmCV9fTUxNRV9PU0RFUF9IXwogI2RlZmluZSBfX01MTUVfT1NERVBfSF8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvbXBfY3VzdG9tX29pZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvbXBfY3VzdG9tX29pZC5oCmluZGV4IGE5ZTBiMzQuLjQwNTEwMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL21wX2N1c3RvbV9vaWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9tcF9jdXN0b21fb2lkLmgKQEAgLTEsMyArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGludG8gdGhlIExpbnV4IHN0YWdpbmcgdHJlZSBhcmUKKyAqIENvcHlyaWdodChjKSAyMDEwIExhcnJ5IEZpbmdlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOgorICogV0xBTiBGQUUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYJX19DVVNUT01fT0lEX0gKICNkZWZpbmUgX19DVVNUT01fT0lEX0gKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NfaW50ZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zX2ludGZzLmMKaW5kZXggM2YzOGU4ZS4uOWE3NWM2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NfaW50ZnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc19pbnRmcy5jCkBAIC0xNzcsNyArMTc3LDcgQEAKIAogc3RhdGljIGludCByODcxeF9uZXRfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2LCB2b2lkICpwKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopX25ldGRldl9wcml2KHBuZXRkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYocG5ldGRldik7CiAJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKIAogCWlmIChwYWRhcHRlci0+YnVwID09IGZhbHNlKQpAQCAtMTg3LDcgKzE4Nyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqcjg3MXhfbmV0X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldikKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBfbmV0ZGV2X3ByaXYocG5ldGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKikgbmV0ZGV2X3ByaXYocG5ldGRldik7CiAJc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJihwYWRhcHRlci0+eG1pdHByaXYpOwogCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICYocGFkYXB0ZXItPnJlY3Zwcml2KTsKIApAQCAtMjIxLDcgKzIyMSw3IEBACiAJCXN0cmNweShpZm5hbWUsICJ3bGFuJWQiKTsKIAkJZGV2X2FsbG9jX25hbWUocG5ldGRldiwgaWZuYW1lKTsKIAl9Ci0JcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIF9uZXRkZXZfcHJpdihwbmV0ZGV2KTsKKwlwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKikgbmV0ZGV2X3ByaXYocG5ldGRldik7CiAJcGFkYXB0ZXItPnBuZXRkZXYgPSBwbmV0ZGV2OwogCXByaW50ayhLRVJOX0lORk8gInI4NzEydTogcmVnaXN0ZXIgcnRsODcxMl9uZXRkZXZfb3BzIHRvIgogCSAgICAgICAiIG5ldGRldl9vcHNcbiIpOwpAQCAtMjYxLDcgKzI2MSw3IEBACiAJX3NldF90aW1lcigmcGFkYXB0ZXItPm1sbWVwcml2LndkZ190aW1lciwgMjAwMCk7CiB9CiAKLXN0YXRpYyB2b2lkIHN0b3BfZHJ2X3RpbWVycyhzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyKQordm9pZCByODcxMl9zdG9wX2Rydl90aW1lcnMoc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlcikKIHsKIAlfY2FuY2VsX3RpbWVyX2V4KCZwYWRhcHRlci0+bWxtZXByaXYuYXNzb2NfdGltZXIpOwogCV9jYW5jZWxfdGltZXJfZXgoJnBhZGFwdGVyLT5tbG1lcHJpdi5zaXRlc3VydmV5Y3RybC4KQEAgLTI4Niw2ICsyODYsOSBAQAogCXB4bWl0cHJpdi0+dmNzX3R5cGUgPSBwcmVnaXN0cnlwcml2LT52Y3NfdHlwZTsKIAlweG1pdHByaXYtPnJ0c190aHJlc2ggPSBwcmVnaXN0cnlwcml2LT5ydHNfdGhyZXNoOwogCXB4bWl0cHJpdi0+ZnJhZ19sZW4gPSBwcmVnaXN0cnlwcml2LT5mcmFnX3RocmVzaDsKKwkvKiBtbG1lX3ByaXYgKi8KKwkvKiBNYXliZSBzb21lZGF5IHdlIHNob3VsZCByZW5hbWUgdGhpcyB2YXJpYWJsZSB0byAiYWN0aXZlX21vZGUiKEplZmYpKi8KKwlwbWxtZXByaXYtPnBhc3NpdmVfbW9kZSA9IDE7IC8qIDE6IGFjdGl2ZSwgMDogcGFzc2l2ZS4gKi8KIAkvKmh0X3ByaXYqLwogCXsKIAkJaW50IGk7CkBAIC0zNDgsNyArMzUxLDcgQEAKIAlfcjg3MTJfZnJlZV9yZWN2X3ByaXYoJnBhZGFwdGVyLT5yZWN2cHJpdik7CiAJbXA4NzF4ZGVpbml0KHBhZGFwdGVyKTsKIAlpZiAocG5ldGRldikKLQkJb3NfZnJlZV9uZXRkZXYocG5ldGRldik7CisJCWZyZWVfbmV0ZGV2KHBuZXRkZXYpOwogCXJldHVybiBfU1VDQ0VTUzsKIH0KIApAQCAtMzc1LDkgKzM3OCwxNSBAQAogCXI4NzEyX2Z3X2NtZChwYWRhcHRlciwgaW50Y21kKTsKIH0KIAorLyoqCisgKgorICogVGhpcyBmdW5jdGlvbiBpbnRlbmRzIHRvIGhhbmRsZSB0aGUgYWN0aXZhdGlvbiBvZiBhbiBpbnRlcmZhY2UKKyAqIGkuZS4gd2hlbiBpdCBpcyBicm91Z2h0IFVwL0FjdGl2ZSBmcm9tIGEgRG93biBzdGF0ZS4KKyAqCisgKi8KIHN0YXRpYyBpbnQgbmV0ZGV2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKilfbmV0ZGV2X3ByaXYocG5ldGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihwbmV0ZGV2KTsKIAogCWlmIChwYWRhcHRlci0+YnVwID09IGZhbHNlKSB7CiAJCXBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9IGZhbHNlOwpAQCAtNDM0LDkgKzQ0MywxNSBAQAogCXJldHVybiAtMTsKIH0KIAorLyoqCisgKgorICogVGhpcyBmdW5jdGlvbiBpbnRlbmRzIHRvIGhhbmRsZSB0aGUgc2h1dGRvd24gb2YgYW4gaW50ZXJmYWNlCisgKiBpLmUuIHdoZW4gaXQgaXMgYnJvdWdodCBEb3duIGZyb20gYW4gVXAvQWN0aXZlIHN0YXRlLgorICoKKyAqLwogc3RhdGljIGludCBuZXRkZXZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXYpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKikgX25ldGRldl9wcml2KHBuZXRkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIG5ldGRldl9wcml2KHBuZXRkZXYpOwogCiAJLyogQ2xvc2UgTEVEKi8KIAlwYWRhcHRlci0+bGVkcHJpdi5MZWRDb250cm9sSGFuZGxlcihwYWRhcHRlciwgTEVEX0NUTF9QT1dFUl9PRkYpOwpAQCAtNDU2LDggKzQ3MSw4IEBACiAJcjg3MTJfZnJlZV9hc3NvY19yZXNvdXJjZXMocGFkYXB0ZXIpOwogCS8qczItNC4qLwogCXI4NzEyX2ZyZWVfbmV0d29ya19xdWV1ZShwYWRhcHRlcik7Ci0JLypTdG9wIGRyaXZlciBtbG1lIHJlbGF0aW9uIHRpbWVyKi8KLQlzdG9wX2Rydl90aW1lcnMocGFkYXB0ZXIpOworCS8qIFRoZSBpbnRlcmZhY2UgaXMgbm8gbG9uZ2VyIFVwOiAqLworCXBhZGFwdGVyLT5idXAgPSBmYWxzZTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfaW50Zi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfaW50Zi5oCmluZGV4IDNiYzIwMjUuLmFhMGVjNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zZGVwX2ludGYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9pbnRmLmgKQEAgLTEsMyArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGludG8gdGhlIExpbnV4IHN0YWdpbmcgdHJlZSBhcmUKKyAqIENvcHlyaWdodChjKSAyMDEwIExhcnJ5IEZpbmdlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOgorICogV0xBTiBGQUUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX19PU0RFUF9JTlRGX0hfCiAjZGVmaW5lIF9fT1NERVBfSU5URl9IXwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9zZXJ2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9zZXJ2aWNlLmgKaW5kZXggYzY4M2Q3Ni4uMWVlOTQzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfc2VydmljZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zZGVwX3NlcnZpY2UuaApAQCAtMSw0MCArMSw0NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGludG8gdGhlIExpbnV4IHN0YWdpbmcgdHJlZSBhcmUKKyAqIENvcHlyaWdodChjKSAyMDEwIExhcnJ5IEZpbmdlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOgorICogV0xBTiBGQUUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX19PU0RFUF9TRVJWSUNFX0hfCiAjZGVmaW5lIF9fT1NERVBfU0VSVklDRV9IXwogCiAjZGVmaW5lIF9TVUNDRVNTCTEKICNkZWZpbmUgX0ZBSUwJCTAKIAotI2luY2x1ZGUgImJhc2ljX3R5cGVzLmgiCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CS8qIE5lY2Vzc2FyeSBiZWNhdXNlIHdlIHVzZSB0aGUgcHJvYyBmcyAqLwotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgva3JlZi5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgotI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2NpcmNfYnVmLmg+Ci0jaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KLSNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgotI2luY2x1ZGUgImV0aGVybmV0LmgiCi0jaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLSNkZWZpbmUgICBfdXNiX2FsbG9jX3VyYih4LCB5KSAgICAgICB1c2JfYWxsb2NfdXJiKHgsIHkpCi0jZGVmaW5lICAgX3VzYl9zdWJtaXRfdXJiKHgsIHkpICAgICB1c2Jfc3VibWl0X3VyYih4LCB5KQorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4gICAgICAvKiBOZWNlc3NhcnkgYmVjYXVzZSB3ZSB1c2UgdGhlIHByb2MgZnMgKi8KKworI2luY2x1ZGUgImJhc2ljX3R5cGVzLmgiCiAKIHN0cnVjdAlfX3F1ZXVlCXsKIAlzdHJ1Y3QJbGlzdF9oZWFkCXF1ZXVlOwpAQCAtNDUsNyArNTIsNiBAQAogI2RlZmluZSBfYnVmZmVyIHVuc2lnbmVkIGNoYXIKICNkZWZpbmUgdGhyZWFkX2V4aXQoKSBjb21wbGV0ZV9hbmRfZXhpdChOVUxMLCAwKQogI2RlZmluZSBfd29ya2l0ZW0gc3RydWN0IHdvcmtfc3RydWN0Ci0jZGVmaW5lIE1TRUNTKHQpICAgICAgICAoSFogKiAoKHQpIC8gMTAwMCkgKyAoSFogKiAoKHQpICUgMTAwMCkpIC8gMTAwMCkKIAogI2RlZmluZSBfaW5pdF9xdWV1ZShwcXVldWUpCQkJCVwKIAlkbyB7CQkJCQkJXApAQCAtNTMsMTYgKzU5LDYgQEAKIAkJc3Bpbl9sb2NrX2luaXQoJigocHF1ZXVlKS0+bG9jaykpOwlcCiAJfSB3aGlsZSAoMCkKIAotc3RhdGljIGlubGluZSB2b2lkICpfbmV0ZGV2X3ByaXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gbmV0ZGV2X3ByaXYoZGV2KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG9zX2ZyZWVfbmV0ZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JZnJlZV9uZXRkZXYoZGV2KTsKLX0KLQogc3RhdGljIGlubGluZSBzdHJ1Y3QgbGlzdF9oZWFkICpnZXRfbmV4dChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQogewogCXJldHVybiBsaXN0LT5uZXh0OwpAQCAtMjAzLDcgKzE5OSw2IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0aHJlYWRfZW50ZXIodm9pZCAqY29udGV4dCkKIHsKLQlkYWVtb25pemUoIiVzIiwgIlJUS1RIUkVBRCIpOwogCWFsbG93X3NpZ25hbChTSUdURVJNKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcmVjdl9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcmVjdl9saW51eC5jCmluZGV4IDFmMDk0OWUuLjBlMjZkNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3JlY3ZfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9yZWN2X2xpbnV4LmMKQEAgLTI4LDExICsyOCwxNSBAQAogCiAjZGVmaW5lIF9SRUNWX09TREVQX0NfCiAKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKwogI2luY2x1ZGUgIm9zZGVwX3NlcnZpY2UuaCIKICNpbmNsdWRlICJkcnZfdHlwZXMuaCIKICNpbmNsdWRlICJ3aWZpLmgiCiAjaW5jbHVkZSAicmVjdl9vc2RlcC5oIgogI2luY2x1ZGUgIm9zZGVwX2ludGYuaCIKKyNpbmNsdWRlICJldGhlcm5ldC5oIgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgogI2luY2x1ZGUgInVzYl9vcHMuaCIKIAogLyppbml0IG9zIHJlbGF0ZWQgcmVzb3VyY2UgaW4gc3RydWN0IHJlY3ZfcHJpdiovCkBAIC01MSw3ICs1NSw3IEBACiAJaW50IHJlcyA9IF9TVUNDRVNTOwogCiAJcHJlY3ZidWYtPmlycF9wZW5kaW5nID0gZmFsc2U7Ci0JcHJlY3ZidWYtPnB1cmIgPSBfdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlwcmVjdmJ1Zi0+cHVyYiA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJaWYgKHByZWN2YnVmLT5wdXJiID09IE5VTEwpCiAJCXJlcyA9IF9GQUlMOwogCXByZWN2YnVmLT5wc2tiID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3JlY3Zfb3NkZXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3JlY3Zfb3NkZXAuaAppbmRleCA2MGE1NGRkLi5mNDM4NGVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9yZWN2X29zZGVwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcmVjdl9vc2RlcC5oCkBAIC0xLDMgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBMaW51eCBzdGFnaW5nIHRyZWUgYXJlCisgKiBDb3B5cmlnaHQoYykgMjAxMCBMYXJyeSBGaW5nZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjoKKyAqIFdMQU4gRkFFIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9fUkVDVl9PU0RFUF9IXwogI2RlZmluZSBfX1JFQ1ZfT1NERVBfSF8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9iaXRkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfYml0ZGVmLmgKaW5kZXggMzU2MTg0Zi4uYmZmNTdhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9iaXRkZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2JpdGRlZi5oCkBAIC0xLDMgKzEsMjQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKICNpZm5kZWYgX19SVEw4NzEyX0JJVERFRl9IX18KICNkZWZpbmUgX19SVEw4NzEyX0JJVERFRl9IX18KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfY21kLmMKaW5kZXggMjZjNjA1ZS4uOWY2ZWJjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9jbWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2NtZC5jCkBAIC0yOCw2ICsyOCwyNCBAQAogCiAjZGVmaW5lIF9SVEw4NzEyX0NNRF9DXwogCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva3JlZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KKyNpbmNsdWRlIDxsaW51eC9jaXJjX2J1Zi5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisKICNpbmNsdWRlICJvc2RlcF9zZXJ2aWNlLmgiCiAjaW5jbHVkZSAiZHJ2X3R5cGVzLmgiCiAjaW5jbHVkZSAicmVjdl9vc2RlcC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9jbWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfY21kLmgKaW5kZXggMTNlZjA2Mi4uNzY2YTY0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9jbWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2NtZC5oCkBAIC0xLDkgKzEsNDAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBMaW51eCBzdGFnaW5nIHRyZWUgYXJlCisgKiBDb3B5cmlnaHQoYykgMjAxMCBMYXJyeSBGaW5nZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjoKKyAqIFdMQU4gRkFFIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9fUlRMODcxMl9DTURfSF8KICNkZWZpbmUgX19SVEw4NzEyX0NNRF9IXwogCisjZGVmaW5lIENNRF9IRFJfU1ogICAgICA4CisKIHU4IHI4NzEyX2Z3X2NtZChzdHJ1Y3QgX2FkYXB0ZXIgKnBBZGFwdGVyLCB1MzIgY21kKTsKIHZvaWQgcjg3MTJfZndfY21kX2RhdGEoc3RydWN0IF9hZGFwdGVyICpwQWRhcHRlciwgdTMyICp2YWx1ZSwgdTggZmxhZyk7CiAKK3N0cnVjdCBjbWRfaGRyIHsKKwl1MzIgY21kX2R3MDsKKwl1MzIgY21kX2R3MTsKK307CiAKIGVudW0gcnRsODcxMl9oMmNfY21kIHsKIAlHRU5fQ01EX0NPREUoX1JlYWRfTUFDUkVHKSwJLyowKi8KQEAgLTcyLDYgKzEwMyw0MCBAQAogCUdFTl9DTURfQ09ERShfU2V0UG93ZXJUcmFja2luZyksCiAJR0VOX0NNRF9DT0RFKF9BTVNEVV9UT19BTVBEVSksIC8qNTcqLwogCUdFTl9DTURfQ09ERShfU2V0TWFjQWRkcmVzcyksIC8qNTgqLworCisJR0VOX0NNRF9DT0RFKF9EaXNjb25uZWN0Q3RybCksIC8qNTkqLworCUdFTl9DTURfQ09ERShfU2V0Q2hhbm5lbFBsYW4pLCAvKjYwKi8KKwlHRU5fQ01EX0NPREUoX0Rpc2Nvbm5lY3RDdHJsRXgpLCAvKjYxKi8KKworCS8qIFRvIGRvLCBtb2RpZnkgdGhlc2UgaDJjIGNtZCwgYWRkIG9yIGRlbGV0ZSAqLworCUdFTl9DTURfQ09ERShfR2V0SDJjTGJrKSAsCisKKwkvKiBXUFMgZXh0cmEgSUUgKi8KKwlHRU5fQ01EX0NPREUoX1NldFByb2JlUmVxRXh0cmFJRSkgLAorCUdFTl9DTURfQ09ERShfU2V0QXNzb2NSZXFFeHRyYUlFKSAsCisJR0VOX0NNRF9DT0RFKF9TZXRQcm9iZVJzcEV4dHJhSUUpICwKKwlHRU5fQ01EX0NPREUoX1NldEFzc29jUnNwRXh0cmFJRSkgLAorCisJLyogdGhlIGZvbGxvd2luZyBpcyBkcml2ZXIgd2lsbCBkbyAqLworCUdFTl9DTURfQ09ERShfR2V0Q3VyRGF0YVJhdGUpICwKKworCUdFTl9DTURfQ09ERShfR2V0VHhSZXRyeWNudCksICAvKiB0byByZWNvcmQgdGltZXMgdGhhdCBUeCByZXRyeSB0bworCQkJCQkqIHRyYW5zbW1pdCBwYWNrZXQgYWZ0ZXIgYXNzb2NpYXRpb24KKwkJCQkJKi8KKwlHRU5fQ01EX0NPREUoX0dldFJ4UmV0cnljbnQpLCAgLyogdG8gcmVjb3JkIHRvdGFsIG51bWJlciBvZiB0aGUKKwkJCQkJKiByZWNlaXZlZCBmcmFtZSB3aXRoIFJlVHJ5IGJpdCBzZXQgaW4KKwkJCQkJKiB0aGUgV0xBTiBoZWFkZXIKKwkJCQkJKi8KKworCUdFTl9DTURfQ09ERShfR2V0QkNOT0tjbnQpLAorCUdFTl9DTURfQ09ERShfR2V0QkNORVJSY250KSwKKwlHRU5fQ01EX0NPREUoX0dldEN1clR4UHdyTGV2ZWwpLAorCisJR0VOX0NNRF9DT0RFKF9TZXRESUcpLAorCUdFTl9DTURfQ09ERShfU2V0UkEpLAorCUdFTl9DTURfQ09ERShfU2V0UFQpLAorCUdFTl9DTURfQ09ERShfUmVhZFRTU0kpLAorCiAJTUFYX0gyQ0NNRAogfTsKIApAQCAtMTUxLDYgKzIxNiwyOCBAQAogCXtHRU5fQ01EX0NPREUoX1NldFBvd2VyVHJhY2tpbmcpLCBOVUxMfSwKIAl7R0VOX0NNRF9DT0RFKF9BTVNEVV9UT19BTVBEVSksIE5VTEx9LCAvKjU3Ki8KIAl7R0VOX0NNRF9DT0RFKF9TZXRNYWNBZGRyZXNzKSwgTlVMTH0sIC8qNTgqLworCisJe0dFTl9DTURfQ09ERShfRGlzY29ubmVjdEN0cmwpLCBOVUxMfSwgLyo1OSovCisJe0dFTl9DTURfQ09ERShfU2V0Q2hhbm5lbFBsYW4pLCBOVUxMfSwgLyo2MCovCisJe0dFTl9DTURfQ09ERShfRGlzY29ubmVjdEN0cmxFeCksIE5VTEx9LCAvKjYxKi8KKworCS8qIFRvIGRvLCBtb2RpZnkgdGhlc2UgaDJjIGNtZCwgYWRkIG9yIGRlbGV0ZSAqLworCXtHRU5fQ01EX0NPREUoX0dldEgyY0xiayksIE5VTEx9LAorCisJe19TZXRQcm9iZVJlcUV4dHJhSUVfQ01EXywgTlVMTH0sCisJe19TZXRBc3NvY1JlcUV4dHJhSUVfQ01EXywgTlVMTH0sCisJe19TZXRQcm9iZVJzcEV4dHJhSUVfQ01EXywgTlVMTH0sCisJe19TZXRBc3NvY1JzcEV4dHJhSUVfQ01EXywgTlVMTH0sCisJe19HZXRDdXJEYXRhUmF0ZV9DTURfLCBOVUxMfSwKKwl7X0dldFR4UmV0cnljbnRfQ01EXywgTlVMTH0sCisJe19HZXRSeFJldHJ5Y250X0NNRF8sIE5VTEx9LAorCXtfR2V0QkNOT0tjbnRfQ01EXywgTlVMTH0sCisJe19HZXRCQ05FUlJjbnRfQ01EXywgTlVMTH0sCisJe19HZXRDdXJUeFB3ckxldmVsX0NNRF8sIE5VTEx9LAorCXtfU2V0RElHX0NNRF8sIE5VTEx9LAorCXtfU2V0UkFfQ01EXywgTlVMTH0sCisJe19TZXRQVF9DTURfLCBOVUxMfSwKKwl7R0VOX0NNRF9DT0RFKF9SZWFkVFNTSSksICZyODcxMl9yZWFkdHNzaV9jbWRyc3BfY2FsbGJhY2t9CiB9OwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfY21kY3RybF9iaXRkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfY21kY3RybF9iaXRkZWYuaAppbmRleCA2YzQ5OTAzLi44ZGZmZTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2NtZGN0cmxfYml0ZGVmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9jbWRjdHJsX2JpdGRlZi5oCkBAIC0xLDMgKzEsMjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmbmRlZiBfX1JUTDg3MTJfQ01EQ1RSTF9CSVRERUZfSF9fCiAjZGVmaW5lIF9fUlRMODcxMl9DTURDVFJMX0JJVERFRl9IX18KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9jbWRjdHJsX3JlZ2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9jbWRjdHJsX3JlZ2RlZi5oCmluZGV4IDVkOWEzZjIuLjkzNzRmMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfY21kY3RybF9yZWdkZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2NtZGN0cmxfcmVnZGVmLmgKQEAgLTEsMyArMSwyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9fUlRMODcxMl9DTURDVFJMX1JFR0RFRl9IX18KICNkZWZpbmUgX19SVEw4NzEyX0NNRENUUkxfUkVHREVGX0hfXwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2RlYnVnY3RybF9iaXRkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZGVidWdjdHJsX2JpdGRlZi5oCmluZGV4IDdiMzRkNDAuLjhiZDQ4MzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZGVidWdjdHJsX2JpdGRlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZGVidWdjdHJsX2JpdGRlZi5oCkBAIC0xLDMgKzEsMjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmbmRlZiBfX1JUTDg3MTJfREVCVUdDVFJMX0JJVERFRl9IX18KICNkZWZpbmUgX19SVEw4NzEyX0RFQlVHQ1RSTF9CSVRERUZfSF9fCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZGVidWdjdHJsX3JlZ2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9kZWJ1Z2N0cmxfcmVnZGVmLmgKaW5kZXggMjdjYWQ3MS4uNDM2MzBiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9kZWJ1Z2N0cmxfcmVnZGVmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9kZWJ1Z2N0cmxfcmVnZGVmLmgKQEAgLTEsMyArMSwyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9fUlRMODcxMl9ERUJVR0NUUkxfUkVHREVGX0hfXwogI2RlZmluZSBfX1JUTDg3MTJfREVCVUdDVFJMX1JFR0RFRl9IX18KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9lZGNhc2V0dGluZ19iaXRkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZWRjYXNldHRpbmdfYml0ZGVmLmgKaW5kZXggYzY5YjFiNy4uMzJkYWI4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9lZGNhc2V0dGluZ19iaXRkZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2VkY2FzZXR0aW5nX2JpdGRlZi5oCkBAIC0xLDMgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBMaW51eCBzdGFnaW5nIHRyZWUgYXJlCisgKiBDb3B5cmlnaHQoYykgMjAxMCBMYXJyeSBGaW5nZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjoKKyAqIFdMQU4gRkFFIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9fUlRMODcxMl9FRENBU0VUVElOR19CSVRERUZfSF9fCiAjZGVmaW5lIF9fUlRMODcxMl9FRENBU0VUVElOR19CSVRERUZfSF9fCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZWRjYXNldHRpbmdfcmVnZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2VkY2FzZXR0aW5nX3JlZ2RlZi5oCmluZGV4IGRlM2QzZTIuLmQ5OTJjYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZWRjYXNldHRpbmdfcmVnZGVmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9lZGNhc2V0dGluZ19yZWdkZWYuaApAQCAtMSwzICsxLDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX19SVEw4NzEyX0VEQ0FTRVRUSU5HX1JFR0RFRl9IX18KICNkZWZpbmUgX19SVEw4NzEyX0VEQ0FTRVRUSU5HX1JFR0RFRl9IX18KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9lZnVzZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9lZnVzZS5jCmluZGV4IDFkYzEyYjcuLmIwOGU5YTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZWZ1c2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2VmdXNlLmMKQEAgLTMwNywyMSArMzA3LDI1IEBACiAJCQljb250aW51ZTsKIAkJfQogCQlmb3IgKGkgPSAwOyBpIDwgUEdQS0dfTUFYX1dPUkRTOyBpKyspIHsKLQkJCWlmIChCSVQoaSkgJiB3b3JkX2VuKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKCEoQklUKGkpICYgcGt0LndvcmRfZW4pKSB7Ci0JCQkJaWYgKGVmdXNlX29uZV9ieXRlX3JlYWQocGFkYXB0ZXIsIGFkZHIsCi0JCQkJICAgICZ2YWx1ZSkgPT0gdHJ1ZSkKLQkJCQkJcGt0LmRhdGFbaSoyXSA9IHZhbHVlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmIChlZnVzZV9vbmVfYnl0ZV9yZWFkKHBhZGFwdGVyLCBhZGRyICsgMSwKLQkJCQkgICAgJnZhbHVlKSA9PSB0cnVlKQotCQkJCQlwa3QuZGF0YVtpKjIgKyAxXSA9IHZhbHVlOwotCQkJCWVsc2UKLQkJCQkJcmV0dXJuIGZhbHNlOworCQkJaWYgKEJJVChpKSAmIHdvcmRfZW4pIHsKKwkJCQlpZiAoQklUKGkpICYgcGt0LndvcmRfZW4pIHsKKwkJCQkJaWYgKGVmdXNlX29uZV9ieXRlX3JlYWQoCisJCQkJCQkJcGFkYXB0ZXIsIGFkZHIsCisJCQkJCQkJJnZhbHVlKSA9PSB0cnVlKQorCQkJCQkJcGt0LmRhdGFbaSoyXSA9IHZhbHVlOworCQkJCQllbHNlCisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCWlmIChlZnVzZV9vbmVfYnl0ZV9yZWFkKAorCQkJCQkJCXBhZGFwdGVyLAorCQkJCQkJCWFkZHIgKyAxLAorCQkJCQkJCSZ2YWx1ZSkgPT0gdHJ1ZSkKKwkJCQkJCXBrdC5kYXRhW2kqMiArIDFdID0KKwkJCQkJCQl2YWx1ZTsKKwkJCQkJZWxzZQorCQkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCQlhZGRyICs9IDI7CiAJCQl9Ci0JCQlhZGRyICs9IDI7CiAJCX0KIAl9CiAJaWYgKGFkZHIgIT0gaGVhZGVyX2FkZHIpCkBAIC0zMjksMjYgKzMzMywyOSBAQAogCWFkZHIrKzsKIAkvKiBmaWxsIG9yaWdpbmFsIGRhdGEgKi8KIAlmb3IgKGkgPSAwOyBpIDwgUEdQS0dfTUFYX1dPUkRTOyBpKyspIHsKLQkJaWYgKEJJVChpKSAmIHBrdC53b3JkX2VuKQotCQkJY29udGludWU7Ci0JCWVmdXNlX29uZV9ieXRlX3dyaXRlKHBhZGFwdGVyLCBhZGRyLCBwa3QuZGF0YVtpKjJdKTsKLQkJZWZ1c2Vfb25lX2J5dGVfd3JpdGUocGFkYXB0ZXIsIGFkZHIrMSwgcGt0LmRhdGFbaSoyICsgMV0pOwotCQkvKiBhZGRpdGlvbmFsIGNoZWNrICovCi0JCWlmIChlZnVzZV9vbmVfYnl0ZV9yZWFkKHBhZGFwdGVyLCBhZGRyLCAmdmFsdWUpID09IGZhbHNlKQotCQkJcmV0ID0gZmFsc2U7Ci0JCWVsc2UgaWYgKHBrdC5kYXRhW2kqMl0gIT0gdmFsdWUpIHsKLQkJCXJldCA9IGZhbHNlOwotCQkJaWYgKDB4RkYgPT0gdmFsdWUpIC8qIHdyaXRlIGFnYWluICovCi0JCQkJZWZ1c2Vfb25lX2J5dGVfd3JpdGUocGFkYXB0ZXIsIGFkZHIsCi0JCQkJCQkgICAgIHBrdC5kYXRhW2kgKiAyXSk7Ci0JCX0KLQkJaWYgKGVmdXNlX29uZV9ieXRlX3JlYWQocGFkYXB0ZXIsIGFkZHIrMSwgJnZhbHVlKSA9PSBmYWxzZSkKLQkJCXJldCA9IGZhbHNlOwotCQllbHNlIGlmIChwa3QuZGF0YVtpKjIgKyAxXSAhPSB2YWx1ZSkgewotCQkJcmV0ID0gZmFsc2U7Ci0JCQlpZiAoMHhGRiA9PSB2YWx1ZSkgLyogd3JpdGUgYWdhaW4gKi8KLQkJCQllZnVzZV9vbmVfYnl0ZV93cml0ZShwYWRhcHRlciwgYWRkcisxLAotCQkJCQkJICAgICBwa3QuZGF0YVtpKjIgKyAxXSk7CisJCWlmIChCSVQoaSkgJiBwa3Qud29yZF9lbikgeworCQkJZWZ1c2Vfb25lX2J5dGVfd3JpdGUocGFkYXB0ZXIsIGFkZHIsIHBrdC5kYXRhW2kqMl0pOworCQkJZWZ1c2Vfb25lX2J5dGVfd3JpdGUocGFkYXB0ZXIsIGFkZHIrMSwKKwkJCQkJcGt0LmRhdGFbaSoyICsgMV0pOworCQkJLyogYWRkaXRpb25hbCBjaGVjayAqLworCQkJaWYgKGVmdXNlX29uZV9ieXRlX3JlYWQocGFkYXB0ZXIsIGFkZHIsICZ2YWx1ZSkKKwkJCQk9PSBmYWxzZSkKKwkJCQlyZXQgPSBmYWxzZTsKKwkJCWVsc2UgaWYgKHBrdC5kYXRhW2kqMl0gIT0gdmFsdWUpIHsKKwkJCQlyZXQgPSBmYWxzZTsKKwkJCQlpZiAoMHhGRiA9PSB2YWx1ZSkgLyogd3JpdGUgYWdhaW4gKi8KKwkJCQkJZWZ1c2Vfb25lX2J5dGVfd3JpdGUocGFkYXB0ZXIsIGFkZHIsCisJCQkJCQkJcGt0LmRhdGFbaSAqIDJdKTsKKwkJCX0KKwkJCWlmIChlZnVzZV9vbmVfYnl0ZV9yZWFkKHBhZGFwdGVyLCBhZGRyKzEsICZ2YWx1ZSkgPT0KKwkJCQlmYWxzZSkKKwkJCQlyZXQgPSBmYWxzZTsKKwkJCWVsc2UgaWYgKHBrdC5kYXRhW2kqMiArIDFdICE9IHZhbHVlKSB7CisJCQkJcmV0ID0gZmFsc2U7CisJCQkJaWYgKDB4RkYgPT0gdmFsdWUpIC8qIHdyaXRlIGFnYWluICovCisJCQkJCWVmdXNlX29uZV9ieXRlX3dyaXRlKHBhZGFwdGVyLCBhZGRyKzEsCisJCQkJCQkJcGt0LmRhdGFbaSoyICsgMV0pOworCQkJfQogCQl9CiAJCWFkZHIgKz0gMjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2V2ZW50LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2V2ZW50LmgKaW5kZXggMjczMTY5My4uM2Q3Zjc5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9ldmVudC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZXZlbnQuaApAQCAtMSwzICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBNb2RpZmljYXRpb25zIGZvciBpbmNsdXNpb24gaW50byB0aGUgTGludXggc3RhZ2luZyB0cmVlIGFyZQorICogQ29weXJpZ2h0KGMpIDIwMTAgTGFycnkgRmluZ2VyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246CisgKiBXTEFOIEZBRSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmbmRlZiBfUlRMODcxMl9FVkVOVF9IXwogI2RlZmluZSBfUlRMODcxMl9FVkVOVF9IXwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2ZpZm9jdHJsX2JpdGRlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9maWZvY3RybF9iaXRkZWYuaAppbmRleCBlNWRmMTlmLi5jNTY0ZGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2ZpZm9jdHJsX2JpdGRlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZmlmb2N0cmxfYml0ZGVmLmgKQEAgLTEsMyArMSwyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9fUlRMODcxMl9GSUZPQ1RSTF9CSVRERUZfSF9fCiAjZGVmaW5lIF9fUlRMODcxMl9GSUZPQ1RSTF9CSVRERUZfSF9fCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZmlmb2N0cmxfcmVnZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2ZpZm9jdHJsX3JlZ2RlZi5oCmluZGV4IGMyZTNhZjIuLjI5Yjg5YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZmlmb2N0cmxfcmVnZGVmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9maWZvY3RybF9yZWdkZWYuaApAQCAtMSwzICsxLDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX19SVEw4NzEyX0ZJRk9DVFJMX1JFR0RFRl9IX18KICNkZWZpbmUgX19SVEw4NzEyX0ZJRk9DVFJMX1JFR0RFRl9IX18KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9ncF9iaXRkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZ3BfYml0ZGVmLmgKaW5kZXggMzVjYTgwOS4uODg0YTgyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9ncF9iaXRkZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2dwX2JpdGRlZi5oCkBAIC0xLDMgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBMaW51eCBzdGFnaW5nIHRyZWUgYXJlCisgKiBDb3B5cmlnaHQoYykgMjAxMCBMYXJyeSBGaW5nZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjoKKyAqIFdMQU4gRkFFIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9fUlRMODcxMl9HUF9CSVRERUZfSF9fCiAjZGVmaW5lIF9fUlRMODcxMl9HUF9CSVRERUZfSF9fCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZ3BfcmVnZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2dwX3JlZ2RlZi5oCmluZGV4IDE3ZTcyYmQuLjhmYzY4ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfZ3BfcmVnZGVmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9ncF9yZWdkZWYuaApAQCAtMSwzICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBNb2RpZmljYXRpb25zIGZvciBpbmNsdXNpb24gaW50byB0aGUgTGludXggc3RhZ2luZyB0cmVlIGFyZQorICogQ29weXJpZ2h0KGMpIDIwMTAgTGFycnkgRmluZ2VyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246CisgKiBXTEFOIEZBRSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmbmRlZiBfX1JUTDg3MTJfR1BfUkVHREVGX0hfXwogI2RlZmluZSBfX1JUTDg3MTJfR1BfUkVHREVGX0hfXwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2hhbC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9oYWwuaAppbmRleCBjNjk2ZGQ4Li42NjVlNzE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2hhbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfaGFsLmgKQEAgLTEsMyArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGludG8gdGhlIExpbnV4IHN0YWdpbmcgdHJlZSBhcmUKKyAqIENvcHlyaWdodChjKSAyMDEwIExhcnJ5IEZpbmdlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOgorICogV0xBTiBGQUUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX19SVEw4NzEyX0hBTF9IX18KICNkZWZpbmUgX19SVEw4NzEyX0hBTF9IX18KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9pbnRlcnJ1cHRfYml0ZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2ludGVycnVwdF9iaXRkZWYuaAppbmRleCAwMmYyNDgwLi40OTU5OGMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2ludGVycnVwdF9iaXRkZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2ludGVycnVwdF9iaXRkZWYuaApAQCAtMSwzICsxLDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX19SVEw4NzEyX0lOVEVSUlVQVF9CSVRERUZfSF9fCiAjZGVmaW5lIF9fUlRMODcxMl9JTlRFUlJVUFRfQklUREVGX0hfXwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2xlZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9sZWQuYwppbmRleCBjYjE3NTFlLi5iYWM1NmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2xlZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfbGVkLmMKQEAgLTE3ODYsNyArMTc4Niw3IEBACiB7CiAJc3RydWN0IGxlZF9wcml2CSpsZWRwcml2ID0gJihwYWRhcHRlci0+bGVkcHJpdik7CiAKLQlpZiAobGVkcHJpdiA9PSBOVUxMIHx8IGxlZHByaXYtPmJSZWdVc2VMZWQgPT0gZmFsc2UpCisJaWYgKGxlZHByaXYtPmJSZWdVc2VMZWQgPT0gZmFsc2UpCiAJCXJldHVybjsKIAlzd2l0Y2ggKGxlZHByaXYtPkxlZFN0cmF0ZWd5KSB7CiAJY2FzZSBTV19MRURfTU9ERTA6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX21hY3NldHRpbmdfYml0ZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX21hY3NldHRpbmdfYml0ZGVmLmgKaW5kZXggNzQ4MDBjZC4uMjhlMGE3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9tYWNzZXR0aW5nX2JpdGRlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfbWFjc2V0dGluZ19iaXRkZWYuaApAQCAtMSwzICsxLDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX19SVEw4NzEyX01BQ1NFVFRJTkdfQklUREVGX0hfXwogI2RlZmluZSBfX1JUTDg3MTJfTUFDU0VUVElOR19CSVRERUZfSF9fCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfbWFjc2V0dGluZ19yZWdkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfbWFjc2V0dGluZ19yZWdkZWYuaAppbmRleCAwMGIwMDNiLi5jZWQwZGE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX21hY3NldHRpbmdfcmVnZGVmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9tYWNzZXR0aW5nX3JlZ2RlZi5oCkBAIC0xLDMgKzEsMjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmbmRlZiBfX1JUTDg3MTJfTUFDU0VUVElOR19SRUdERUZfSF9fCiAjZGVmaW5lIF9fUlRMODcxMl9NQUNTRVRUSU5HX1JFR0RFRl9IX18KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9wb3dlcnNhdmVfYml0ZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3Bvd2Vyc2F2ZV9iaXRkZWYuaAppbmRleCAwOTIyYThkLi44ZmM2ODk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3Bvd2Vyc2F2ZV9iaXRkZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3Bvd2Vyc2F2ZV9iaXRkZWYuaApAQCAtMSwzICsxLDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX19SVEw4NzEyX1BPV0VSU0FWRV9CSVRERUZfSF9fCiAjZGVmaW5lIF9fUlRMODcxMl9QT1dFUlNBVkVfQklUREVGX0hfXwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3Bvd2Vyc2F2ZV9yZWdkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcG93ZXJzYXZlX3JlZ2RlZi5oCmluZGV4IDcyOTI3ZGYuLjQ2MzJkZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcG93ZXJzYXZlX3JlZ2RlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcG93ZXJzYXZlX3JlZ2RlZi5oCkBAIC0xLDMgKzEsMjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmbmRlZiBfX1JUTDg3MTJfUE9XRVJTQVZFX1JFR0RFRl9IX18KICNkZWZpbmUgX19SVEw4NzEyX1BPV0VSU0FWRV9SRUdERUZfSF9fCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcmF0ZWN0cmxfYml0ZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3JhdGVjdHJsX2JpdGRlZi5oCmluZGV4IDg3MDQ4YjMuLjZkM2Q2ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcmF0ZWN0cmxfYml0ZGVmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yYXRlY3RybF9iaXRkZWYuaApAQCAtMSwzICsxLDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX19SVEw4NzEyX1JBVEVDVFJMX0JJVERFRl9IX18KICNkZWZpbmUgX19SVEw4NzEyX1JBVEVDVFJMX0JJVERFRl9IX18KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yYXRlY3RybF9yZWdkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcmF0ZWN0cmxfcmVnZGVmLmgKaW5kZXggMzFjODM2My4uNzNkZmMzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yYXRlY3RybF9yZWdkZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3JhdGVjdHJsX3JlZ2RlZi5oCkBAIC0xLDMgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBMaW51eCBzdGFnaW5nIHRyZWUgYXJlCisgKiBDb3B5cmlnaHQoYykgMjAxMCBMYXJyeSBGaW5nZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjoKKyAqIFdMQU4gRkFFIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9fUlRMODcxMl9SQVRFQ1RSTF9SRUdERUZfSF9fCiAjZGVmaW5lIF9fUlRMODcxMl9SQVRFQ1RSTF9SRUdERUZfSF9fCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcmVjdi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yZWN2LmMKaW5kZXggNjI1YThhMC4uNmQ2OTI2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yZWN2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yZWN2LmMKQEAgLTE5Miw3ICsxOTIsNyBAQAogCX0gZWxzZQogCQlwYXR0cmliLT50Y3BjaGtfdmFsaWQgPSAwOyAvKiBpbnZhbGlkICovCiAJcGF0dHJpYi0+bWNzX3JhdGUgPSAodTgpKChsZTMyX3RvX2NwdShwcnhzdGF0LT5yeGR3MykpICYgMHgzZik7Ci0JcGF0dHJpYi0+aHRjID0gKHU4KSgobGUzMl90b19jcHUocHJ4c3RhdC0+cnhkdzMpID4+IDYpICYgMHgxKTsKKwlwYXR0cmliLT5odGMgPSAodTgpKChsZTMyX3RvX2NwdShwcnhzdGF0LT5yeGR3MykgPj4gMTQpICYgMHgxKTsKIAkvKk9mZnNldCAxNiovCiAJLypPZmZzZXQgMjAqLwogCS8qcGh5X2luZm8qLwpAQCAtMjA3LDcgKzIwNyw3IEBACiAJCQkJICAgc3RydWN0ICBfX3F1ZXVlICpkZWZyYWdfcSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwbGlzdCwgKnBoZWFkOwotCXU4CXdsYW5oZHJfb2Zmc2V0OworCXU4CSpkYXRhLCB3bGFuaGRyX29mZnNldDsKIAl1OAljdXJmcmFnbnVtOwogCXN0cnVjdCByZWN2X2ZyYW1lX2hkciAqcGZoZHIsICpwbmZoZHI7CiAJdW5pb24gcmVjdl9mcmFtZSAqcHJmcmFtZSwgKnBuZXh0cmZyYW1lOwpAQCAtMjI0LDIyICsyMjQsMjUgQEAKIAkJLyp0aGUgZmlyc3QgZnJhZ21lbnQgbnVtYmVyIG11c3QgYmUgMAogCQkgKmZyZWUgdGhlIHdob2xlIHF1ZXVlKi8KIAkJcjg3MTJfZnJlZV9yZWN2ZnJhbWUocHJmcmFtZSwgcGZyZWVfcmVjdl9xdWV1ZSk7Ci0JCXByZnJhbWUgPSBOVUxMOwotCQlnb3RvIGV4aXQ7CisJCXI4NzEyX2ZyZWVfcmVjdmZyYW1lX3F1ZXVlKGRlZnJhZ19xLCBwZnJlZV9yZWN2X3F1ZXVlKTsKKwkJcmV0dXJuIE5VTEw7CiAJfQotCXBsaXN0ID0gZ2V0X25leHQocGhlYWQpOworCWN1cmZyYWdudW0rKzsKKwlwbGlzdCA9IGdldF9saXN0X2hlYWQoZGVmcmFnX3EpOworCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOworCWRhdGEgPSBnZXRfcmVjdmZyYW1lX2RhdGEocHJmcmFtZSk7CiAJd2hpbGUgKGVuZF9vZl9xdWV1ZV9zZWFyY2gocGhlYWQsIHBsaXN0KSA9PSBmYWxzZSkgewogCQlwbmV4dHJmcmFtZSA9IExJU1RfQ09OVEFJTk9SKHBsaXN0LCB1bmlvbiByZWN2X2ZyYW1lLCB1KTsKLQkJLypjaGVjayB0aGUgZnJhZ21lbnQgc2VxdWVuY2UgICgybmQgfm4gZnJhZ21lbnQgZnJhbWUpICovCiAJCXBuZmhkciA9ICZwbmV4dHJmcmFtZS0+dS5oZHI7Ci0JCWN1cmZyYWdudW0rKzsKKwkJLypjaGVjayB0aGUgZnJhZ21lbnQgc2VxdWVuY2UgICgybmQgfm4gZnJhZ21lbnQgZnJhbWUpICovCiAJCWlmIChjdXJmcmFnbnVtICE9IHBuZmhkci0+YXR0cmliLmZyYWdfbnVtKSB7CiAJCQkvKiB0aGUgZnJhZ21lbnQgbnVtYmVyIG11c3QgaW5jcmVhc2UgIChhZnRlciBkZWNhY2hlKQogCQkJICogcmVsZWFzZSB0aGUgZGVmcmFnX3EgJiBwcmZyYW1lICovCiAJCQlyODcxMl9mcmVlX3JlY3ZmcmFtZShwcmZyYW1lLCBwZnJlZV9yZWN2X3F1ZXVlKTsKLQkJCXByZnJhbWUgPSBOVUxMOwotCQkJZ290byBleGl0OworCQkJcjg3MTJfZnJlZV9yZWN2ZnJhbWVfcXVldWUoZGVmcmFnX3EsIHBmcmVlX3JlY3ZfcXVldWUpOworCQkJcmV0dXJuIE5VTEw7CiAJCX0KKwkJY3VyZnJhZ251bSsrOwogCQkvKiBjb3B5IHRoZSAybmR+biBmcmFnbWVudCBmcmFtZSdzIHBheWxvYWQgdG8gdGhlIGZpcnN0IGZyYWdtZW50CiAJCSAqIGdldCB0aGUgMm5kfmxhc3QgZnJhZ21lbnQgZnJhbWUncyBwYXlsb2FkICovCiAJCXdsYW5oZHJfb2Zmc2V0ID0gcG5maGRyLT5hdHRyaWIuaGRybGVuICsgcG5maGRyLT5hdHRyaWIuaXZfbGVuOwpAQCAtMjUyLDcgKzI1NSw2IEBACiAJCXBmaGRyLT5hdHRyaWIuaWN2X2xlbiA9IHBuZmhkci0+YXR0cmliLmljdl9sZW47CiAJCXBsaXN0ID0gZ2V0X25leHQocGxpc3QpOwogCX0KLWV4aXQ6CiAJLyogZnJlZSB0aGUgZGVmcmFnX3EgcXVldWUgYW5kIHJldHVybiB0aGUgcHJmcmFtZSAqLwogCXI4NzEyX2ZyZWVfcmVjdmZyYW1lX3F1ZXVlKGRlZnJhZ19xLCBwZnJlZV9yZWN2X3F1ZXVlKTsKIAlyZXR1cm4gcHJmcmFtZTsKQEAgLTEwNzQsNyArMTA3Niw3IEBACiAJCS8qIGZvciBmaXJzdCBmcmFnbWVudCBwYWNrZXQsIGRyaXZlciBuZWVkIGFsbG9jYXRlIDE1MzYgKwogCQkgKiBkcnZpbmZvX3N6ICsgUlhERVNDX1NJWkUgdG8gZGVmcmFnIHBhY2tldC4gKi8KIAkJaWYgKChtZiA9PSAxKSAmJiAoZnJhZyA9PSAwKSkKLQkJCWFsbG9jX3N6ID0gMTY1ODsKKwkJCWFsbG9jX3N6ID0gMTY1ODsvKjE2NTgrNj0xNjY0LCAxNjY0IGlzIDEyOCBhbGlnbm1lbnQuKi8KIAkJZWxzZQogCQkJYWxsb2Nfc3ogPSB0bXBfbGVuOwogCQkvKiAyIGlzIGZvciBJUCBoZWFkZXIgNCBieXRlcyBhbGlnbm1lbnQgaW4gUW9TIHBhY2tldCBjYXNlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yZWN2LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3JlY3YuaAppbmRleCBjNDg3NTdmLi44ZWZiZDFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3JlY3YuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3JlY3YuaApAQCAtMSwxMCArMSw0MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGludG8gdGhlIExpbnV4IHN0YWdpbmcgdHJlZSBhcmUKKyAqIENvcHlyaWdodChjKSAyMDEwIExhcnJ5IEZpbmdlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOgorICogV0xBTiBGQUUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX1JUTDg3MTJfUkVDVl9IXwogI2RlZmluZSBfUlRMODcxMl9SRUNWX0hfCiAKICNpbmNsdWRlICJvc2RlcF9zZXJ2aWNlLmgiCiAjaW5jbHVkZSAiZHJ2X3R5cGVzLmgiCiAKKy8qIFJlYWx0ZWsncyB2Mi42LjYgcmVkdWNlZCB0aGlzIHRvIDQuIEhvd2V2ZXIsIHVuZGVyIGhlYXZ5IG5ldHdvcmsgYW5kIENQVQorICogbG9hZHMsIGV2ZW4gOCByZWNlaXZlIGJ1ZmZlcnMgbWlnaHQgbm90IGJlIGVub3VnaDsgY3V0dGluZyBpdCB0byA0IHNlZW1lZAorICogdW53aXNlLgorICovCiAjZGVmaW5lIE5SX1JFQ1ZCVUZGICg4KQorCiAjZGVmaW5lIE5SX1BSRUFMTE9DX1JFQ1ZfU0tCICg4KQogI2RlZmluZSBSWERFU0NfU0laRQkyNAogI2RlZmluZSBSWERFU0NfT0ZGU0VUIFJYREVTQ19TSVpFCkBAIC0xMTUsNyArMTQ1LDYgQEAKIAl1bmlvbiB7CiAJCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAkJc3RydWN0IHJlY3ZfZnJhbWVfaGRyIGhkcjsKLQkJYWRkcl90IG1lbVtSRUNWRlJBTUVfSERSX0FMSUdOPj4yXTsKIAl9IHU7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3JlZ2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yZWdkZWYuaAppbmRleCA1YjBkZTJhLi5lN2JjYTU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3JlZ2RlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfcmVnZGVmLmgKQEAgLTEsMyArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGludG8gdGhlIExpbnV4IHN0YWdpbmcgdHJlZSBhcmUKKyAqIENvcHlyaWdodChjKSAyMDEwIExhcnJ5IEZpbmdlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOgorICogV0xBTiBGQUUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX19SVEw4NzEyX1JFR0RFRl9IX18KICNkZWZpbmUgX19SVEw4NzEyX1JFR0RFRl9IX18KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9zZWN1cml0eV9iaXRkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfc2VjdXJpdHlfYml0ZGVmLmgKaW5kZXggOGRmNGJmNC4uMDVkYWZhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9zZWN1cml0eV9iaXRkZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3NlY3VyaXR5X2JpdGRlZi5oCkBAIC0xLDMgKzEsMjIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmbmRlZiBfX1JUTDg3MTJfU0VDVVJJVFlfQklUREVGX0hfXwogI2RlZmluZSBfX1JUTDg3MTJfU0VDVVJJVFlfQklUREVGX0hfXwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3NwZWMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfc3BlYy5oCmluZGV4IDNmMTgxZWUuLmFmMTFiNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfc3BlYy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfc3BlYy5oCkBAIC0xLDMgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBMaW51eCBzdGFnaW5nIHRyZWUgYXJlCisgKiBDb3B5cmlnaHQoYykgMjAxMCBMYXJyeSBGaW5nZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjoKKyAqIFdMQU4gRkFFIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9fUlRMODcxMl9TUEVDX0hfXwogI2RlZmluZSBfX1JUTDg3MTJfU1BFQ19IX18KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9zeXNjZmdfYml0ZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3N5c2NmZ19iaXRkZWYuaAppbmRleCBkY2UxNWMyLi5lZWQwOWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3N5c2NmZ19iaXRkZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3N5c2NmZ19iaXRkZWYuaApAQCAtMSwzICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBNb2RpZmljYXRpb25zIGZvciBpbmNsdXNpb24gaW50byB0aGUgTGludXggc3RhZ2luZyB0cmVlIGFyZQorICogQ29weXJpZ2h0KGMpIDIwMTAgTGFycnkgRmluZ2VyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246CisgKiBXTEFOIEZBRSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmbmRlZiBfX1JUTDg3MTJfU1lTQ0ZHX0JJVERFRl9IX18KICNkZWZpbmUgX19SVEw4NzEyX1NZU0NGR19CSVRERUZfSF9fCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfc3lzY2ZnX3JlZ2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9zeXNjZmdfcmVnZGVmLmgKaW5kZXggNjg3ZTFiNy4uNzY3ZGZkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9zeXNjZmdfcmVnZGVmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9zeXNjZmdfcmVnZGVmLmgKQEAgLTEsMyArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGludG8gdGhlIExpbnV4IHN0YWdpbmcgdHJlZSBhcmUKKyAqIENvcHlyaWdodChjKSAyMDEwIExhcnJ5IEZpbmdlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOgorICogV0xBTiBGQUUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX19SVEw4NzEyX1NZU0NGR19SRUdERUZfSF9fCiAjZGVmaW5lIF9fUlRMODcxMl9TWVNDRkdfUkVHREVGX0hfXwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3RpbWVjdHJsX2JpdGRlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl90aW1lY3RybF9iaXRkZWYuaAppbmRleCAzMmNlOWZhLi43MjQ0MjE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3RpbWVjdHJsX2JpdGRlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfdGltZWN0cmxfYml0ZGVmLmgKQEAgLTEsMyArMSwyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9fUlRMODcxMl9USU1FQ1RSTF9CSVRERUZfSF9fCiAjZGVmaW5lIF9fUlRMODcxMl9USU1FQ1RSTF9CSVRERUZfSF9fCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfdGltZWN0cmxfcmVnZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3RpbWVjdHJsX3JlZ2RlZi5oCmluZGV4IDhhM2RkNTYuLjEwNjkxNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfdGltZWN0cmxfcmVnZGVmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl90aW1lY3RybF9yZWdkZWYuaApAQCAtMSwzICsxLDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX19SVEw4NzEyX1RJTUVDVFJMX1JFR0RFRl9IX18KICNkZWZpbmUgX19SVEw4NzEyX1RJTUVDVFJMX1JFR0RFRl9IX18KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl93bWFjX2JpdGRlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl93bWFjX2JpdGRlZi5oCmluZGV4IDZkM2JlMmEuLjYxYTM2MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfd21hY19iaXRkZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3dtYWNfYml0ZGVmLmgKQEAgLTEsMyArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGludG8gdGhlIExpbnV4IHN0YWdpbmcgdHJlZSBhcmUKKyAqIENvcHlyaWdodChjKSAyMDEwIExhcnJ5IEZpbmdlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOgorICogV0xBTiBGQUUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX19SVEw4NzEyX1dNQUNfQklUREVGX0hfXwogI2RlZmluZSBfX1JUTDg3MTJfV01BQ19CSVRERUZfSF9fCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfd21hY19yZWdkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfd21hY19yZWdkZWYuaAppbmRleCBhYzgwZGZiLi5kOWY4MzQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3dtYWNfcmVnZGVmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl93bWFjX3JlZ2RlZi5oCkBAIC0xLDMgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBMaW51eCBzdGFnaW5nIHRyZWUgYXJlCisgKiBDb3B5cmlnaHQoYykgMjAxMCBMYXJyeSBGaW5nZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjoKKyAqIFdMQU4gRkFFIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9fUlRMODcxMl9XTUFDX1JFR0RFRl9IX18KICNkZWZpbmUgX19SVEw4NzEyX1dNQUNfUkVHREVGX0hfXwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3htaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfeG1pdC5jCmluZGV4IDg4YTE1MDQuLjY5MzMzMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfeG1pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfeG1pdC5jCkBAIC0zNyw2ICszNyw3IEBACiAKIHN0YXRpYyB2b2lkIGR1bXBfeGZyYW1lKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsCiAJCQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSk7CitzdGF0aWMgdm9pZCB1cGRhdGVfdHhkZXNjKHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lLCB1aW50ICpwbWVtLCBpbnQgc3opOwogCiBzaW50IF9yODcxMl9pbml0X2h3X3R4cXVldWUoc3RydWN0IGh3X3R4cXVldWUgKnBod190eHF1ZXVlLCB1OCBhY190YWcpCiB7CkBAIC0yMzgsMTYgKzIzOSwxODAgQEAKIHZvaWQgcjg3MTJfZG9fcXVldWVfc2VsZWN0KHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsCiAJCQkgICBzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYikKIHsKLQl1OCBxc2VsID0gMDsKKwl1bnNpZ25lZCBpbnQgcXNlbCA9IDA7CiAJc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9iaiA9IChzdHJ1Y3QgZHZvYmpfcHJpdiAqKSZwYWRhcHRlci0+ZHZvYmpwcml2OwogCiAJaWYgKHBkdm9iai0+bnJfZW5kcG9pbnQgPT0gNikKLQkJcXNlbCA9IHBhdHRyaWItPnByaW9yaXR5OwotCWVsc2UgaWYgKHBkdm9iai0+bnJfZW5kcG9pbnQgPT0gNCkKLQkJcXNlbCA9IHBhdHRyaWItPnByaW9yaXR5OworCQlxc2VsID0gKHVuc2lnbmVkIGludCkgcGF0dHJpYi0+cHJpb3JpdHk7CisJZWxzZSBpZiAocGR2b2JqLT5ucl9lbmRwb2ludCA9PSA0KSB7CisJCXFzZWwgPSAodW5zaWduZWQgaW50KSBwYXR0cmliLT5wcmlvcml0eTsKKwkJaWYgKHFzZWwgPT0gMCB8fCBxc2VsID09IDMpCisJCQlxc2VsID0gMzsKKwkJZWxzZSBpZiAocXNlbCA9PSAxIHx8IHFzZWwgPT0gMikKKwkJCXFzZWwgPSAxOworCQllbHNlIGlmIChxc2VsID09IDQgfHwgcXNlbCA9PSA1KQorCQkJcXNlbCA9IDU7CisJCWVsc2UgaWYgKHFzZWwgPT0gNiB8fCBxc2VsID09IDcpCisJCQlxc2VsID0gNzsKKwkJZWxzZQorCQkJcXNlbCA9IDM7CisJfQogCXBhdHRyaWItPnFzZWwgPSBxc2VsOwogfQogCisjaWZkZWYgQ09ORklHX1I4NzEyX1RYX0FHR1IKK3U4IHI4NzEyX2NvbnN0cnVjdF90eGFnZ3JfY21kX2Rlc2Moc3RydWN0IHhtaXRfYnVmICpweG1pdGJ1ZikKK3sKKwlzdHJ1Y3QgdHhfZGVzYyAqcHR4X2Rlc2MgPSAoc3RydWN0IHR4X2Rlc2MgKilweG1pdGJ1Zi0+cGJ1ZjsKKworCS8qIEZpbGwgdXAgVHhDbWQgRGVzY3JpcHRvciBhY2NvcmRpbmcgYXMgVVNCIEZXIFR4IEFhZ2dyZWdhdGlvbiBpbmZvLiovCisJLyogZHcwICovCisJcHR4X2Rlc2MtPnR4ZHcwID0gY3B1X3RvX2xlMzIoQ01EX0hEUl9TWiYweGZmZmYpOworCXB0eF9kZXNjLT50eGR3MCB8PQorCQljcHVfdG9fbGUzMigoKFRYREVTQ19TSVpFK09GRlNFVF9TWik8PE9GRlNFVF9TSFQpJjB4MDBmZjAwMDApOworCXB0eF9kZXNjLT50eGR3MCB8PSBjcHVfdG9fbGUzMihPV04gfCBGU0cgfCBMU0cpOworCisJLyogZHcxICovCisJcHR4X2Rlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKCgweDEzPDxRU0VMX1NIVCkmMHgwMDAwMWYwMCk7CisKKwlyZXR1cm4gX1NVQ0NFU1M7Cit9CisKK3U4IHI4NzEyX2NvbnN0cnVjdF90eGFnZ3JfY21kX2hkcihzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmKQoreworCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lID0gKHN0cnVjdCB4bWl0X2ZyYW1lICopCisJCXB4bWl0YnVmLT5wcml2X2RhdGE7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IHB4bWl0ZnJhbWUtPnBhZGFwdGVyOworCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmKHBhZGFwdGVyLT5jbWRwcml2KTsKKwlzdHJ1Y3QgY21kX2hkciAqcGNtZF9oZHIgPSAoc3RydWN0IGNtZF9oZHIgICopCisJCShweG1pdGJ1Zi0+cGJ1ZiArIFRYREVTQ19TSVpFKTsKKworCS8qIEZpbGwgdXAgQ21kIEhlYWRlciBmb3IgVVNCIEZXIFR4IEFnZ3JlZ2F0aW9uLiovCisJLyogZHcwICovCisJcGNtZF9oZHItPmNtZF9kdzAgPSBjcHVfdG9fbGUzMigoR0VOX0NNRF9DT0RFKF9BTVNEVV9UT19BTVBEVSkgPDwgMTYpIHwKKwkJCQkJKHBjbWRwcml2LT5jbWRfc2VxIDw8IDI0KSk7CisJcGNtZHByaXYtPmNtZF9zZXErKzsKKworCXJldHVybiBfU1VDQ0VTUzsKK30KKwordTggcjg3MTJfYXBwZW5kX21wZHVfdW5pdChzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmLAorCQkJc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCit7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IHB4bWl0ZnJhbWUtPnBhZGFwdGVyOworCXN0cnVjdCB0eF9kZXNjICpwdHhfZGVzYyA9IChzdHJ1Y3QgdHhfZGVzYyAqKXB4bWl0YnVmLT5wYnVmOworCWludCBsYXN0X3R4Y21kc3ogPSAwOworCWludCBwYWRkaW5nX3N6ID0gMDsKKworCS8qIDgwMi4zLT44MDIuMTEgY29udmVydG9yICovCisJcjg3MTJfeG1pdGZyYW1lX2NvYWxlc2NlKHBhZGFwdGVyLCBweG1pdGZyYW1lLT5wa3QsIHB4bWl0ZnJhbWUpOworCS8qIGZyZWUgc2tiIHN0cnVjdCAqLworCXI4NzEyX3htaXRfY29tcGxldGUocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOworCWlmIChweG1pdGZyYW1lLT5hdHRyaWIuZXRoZXJfdHlwZSAhPSAweDA4MDYpIHsKKwkJaWYgKChweG1pdGZyYW1lLT5hdHRyaWIuZXRoZXJfdHlwZSAhPSAweDg4OGUpICYmCisJCQkocHhtaXRmcmFtZS0+YXR0cmliLmRoY3BfcGt0ICE9IDEpKSB7CisJCQlyODcxMl9pc3N1ZV9hZGRiYXJlcV9jbWQocGFkYXB0ZXIsCisJCQkJCXB4bWl0ZnJhbWUtPmF0dHJpYi5wcmlvcml0eSk7CisJCX0KKwl9CisJcHhtaXRmcmFtZS0+bGFzdFswXSA9IDE7CisJdXBkYXRlX3R4ZGVzYyhweG1pdGZyYW1lLCAodWludCAqKShweG1pdGZyYW1lLT5idWZfYWRkciksCisJCXB4bWl0ZnJhbWUtPmF0dHJpYi5sYXN0X3R4Y21kc3opOworCS8qcGFkZGluZyB6ZXJvICovCisJbGFzdF90eGNtZHN6ID0gcHhtaXRmcmFtZS0+YXR0cmliLmxhc3RfdHhjbWRzejsKKwlwYWRkaW5nX3N6ID0gKDggLSAobGFzdF90eGNtZHN6ICUgOCkpOworCWlmICgobGFzdF90eGNtZHN6ICUgOCkgIT0gMCkgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IHBhZGRpbmdfc3o7IGkrKykKKwkJCSoocHhtaXRmcmFtZS0+YnVmX2FkZHIrVFhERVNDX1NJWkUrbGFzdF90eGNtZHN6K2kpID0gMDsKKwl9CisJLyogQWRkIHRoZSBuZXcgbXBkdSdzIGxlbmd0aCAqLworCXB0eF9kZXNjLT50eGR3MCA9IGNwdV90b19sZTMyKChwdHhfZGVzYy0+dHhkdzAmMHhmZmZmMDAwMCkgfAorCQkoKHB0eF9kZXNjLT50eGR3MCYweDAwMDBmZmZmKSsKKwkJCSgoVFhERVNDX1NJWkUrbGFzdF90eGNtZHN6K3BhZGRpbmdfc3opJjB4MDAwMGZmZmYpKSk7CisKKwlyZXR1cm4gX1NVQ0NFU1M7Cit9CisKKwordTggcjg3MTJfeG1pdGZyYW1lX2FnZ3JfMXN0KHN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYsCisJCQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKK3sKKwkvKiBsaW51eCBjb21wbGV0ZSBjb250ZXh0IGRvZXNudCBuZWVkIHRvIHByb3RlY3QgKi8KKwlweG1pdGZyYW1lLT5weG1pdGJ1ZiA9IHB4bWl0YnVmOworCXB4bWl0YnVmLT5wcml2X2RhdGEgPSBweG1pdGZyYW1lOworCXB4bWl0ZnJhbWUtPnB4bWl0X3VyYlswXSA9IHB4bWl0YnVmLT5weG1pdF91cmJbMF07CisJLyogYnVmZmVyIGFkZHIgYXNzb2MgKi8KKwlweG1pdGZyYW1lLT5idWZfYWRkciA9IHB4bWl0YnVmLT5wYnVmK1RYREVTQ19TSVpFK0NNRF9IRFJfU1o7CisJLypSVEw4NzEyX0RNQV9IMkNDTUQgKi8KKwlyODcxMl9jb25zdHJ1Y3RfdHhhZ2dyX2NtZF9kZXNjKHB4bWl0YnVmKTsKKwlyODcxMl9jb25zdHJ1Y3RfdHhhZ2dyX2NtZF9oZHIocHhtaXRidWYpOworCWlmIChyODcxMl9hcHBlbmRfbXBkdV91bml0KHB4bWl0YnVmLCBweG1pdGZyYW1lKSA9PSBfU1VDQ0VTUykKKwkJcHhtaXRidWYtPmFnZ3JfbnIgPSAxOworCisJcmV0dXJuIF9TVUNDRVNTOworfQorCit1MTYgcjg3MTJfeG1pdGZyYW1lX2FnZ3JfbmV4dChzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmLAorCQkJc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCit7CisJcHhtaXRmcmFtZS0+cHhtaXRidWYgPSBweG1pdGJ1ZjsKKwlweG1pdGJ1Zi0+cHJpdl9kYXRhID0gcHhtaXRmcmFtZTsKKwlweG1pdGZyYW1lLT5weG1pdF91cmJbMF0gPSBweG1pdGJ1Zi0+cHhtaXRfdXJiWzBdOworCS8qIGJ1ZmZlciBhZGRyIGFzc29jICovCisJcHhtaXRmcmFtZS0+YnVmX2FkZHIgPSBweG1pdGJ1Zi0+cGJ1ZiArIFRYREVTQ19TSVpFICsKKwkJKCgoc3RydWN0IHR4X2Rlc2MgKilweG1pdGJ1Zi0+cGJ1ZiktPnR4ZHcwICYgMHgwMDAwZmZmZik7CisJaWYgKHI4NzEyX2FwcGVuZF9tcGR1X3VuaXQocHhtaXRidWYsIHB4bWl0ZnJhbWUpID09IF9TVUNDRVNTKSB7CisJCXI4NzEyX2ZyZWVfeG1pdGZyYW1lX2V4KCZweG1pdGZyYW1lLT5wYWRhcHRlci0+eG1pdHByaXYsCisJCQkJCXB4bWl0ZnJhbWUpOworCQlweG1pdGJ1Zi0+YWdncl9ucisrOworCX0KKworCXJldHVybiBUWERFU0NfU0laRSArCisJCSgoKHN0cnVjdCB0eF9kZXNjICopcHhtaXRidWYtPnBidWYpLT50eGR3MCAmIDB4MDAwMGZmZmYpOworfQorCit1OCByODcxMl9kdW1wX2FnZ3JfeGZyYW1lKHN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYsCisJCQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSkKK3sKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gcHhtaXRmcmFtZS0+cGFkYXB0ZXI7CisJc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9iaiA9IChzdHJ1Y3QgZHZvYmpfcHJpdiAqKSAmcGFkYXB0ZXItPmR2b2JqcHJpdjsKKwlzdHJ1Y3QgdHhfZGVzYyAqIHB0eGRlc2MgPSAoc3RydWN0IHR4X2Rlc2MgKilweG1pdGJ1Zi0+cGJ1ZjsKKwlzdHJ1Y3QgY21kX2hkciAqcGNtZF9oZHIgPSAoc3RydWN0IGNtZF9oZHIgKikKKwkJKHB4bWl0YnVmLT5wYnVmICsgVFhERVNDX1NJWkUpOworCXUxNiB0b3RhbF9sZW5ndGggPSAodTE2KSAocHR4ZGVzYy0+dHhkdzAgJiAweGZmZmYpOworCisJLyogdXNlIDFzdCB4bWl0ZnJhbWUgYXMgbWVkaWEgKi8KKwl4bWl0ZnJhbWVfeG1pdGJ1Zl9hdHRhY2gocHhtaXRmcmFtZSwgcHhtaXRidWYpOworCXBjbWRfaGRyLT5jbWRfZHcwID0gY3B1X3RvX2xlMzIoKCh0b3RhbF9sZW5ndGgtQ01EX0hEUl9TWikmMHgwMDAwZmZmZil8CisJCQkJCShwY21kX2hkci0+Y21kX2R3MCYweGZmZmYwMDAwKSk7CisKKwkvKiB1cmIgbGVuZ3RoIGluIGNtZF9kdzEgKi8KKwlwY21kX2hkci0+Y21kX2R3MSA9IGNwdV90b19sZTMyKChweG1pdGJ1Zi0+YWdncl9uciAmIDB4ZmYpfAorCQkJCQkoKHRvdGFsX2xlbmd0aCtUWERFU0NfU0laRSkgPDwgMTYpKTsKKwlweG1pdGZyYW1lLT5sYXN0WzBdID0gMTsKKwlweG1pdGZyYW1lLT5icGVuZGluZ1swXSA9IGZhbHNlOworCXB4bWl0ZnJhbWUtPm1lbV9hZGRyID0gcHhtaXRidWYtPnBidWY7CisKKwlpZiAoKHBkdm9iai0+aXNoaWdoc3BlZWQgJiYgKCh0b3RhbF9sZW5ndGgrVFhERVNDX1NJWkUpJTB4MjAwKSA9PSAwKSB8fAorCQkoKCFwZHZvYmotPmlzaGlnaHNwZWVkICYmCisJCQkoKHRvdGFsX2xlbmd0aCtUWERFU0NfU0laRSklMHg0MCkgPT0gMCkpKSB7CisJCXB0eGRlc2MtPnR4ZHcwIHw9IGNwdV90b19sZTMyCisJCQkoKChUWERFU0NfU0laRStPRkZTRVRfU1orOCk8PE9GRlNFVF9TSFQpJjB4MDBmZjAwMDApOworCQkvKjMyIGJ5dGVzIGZvciBUWCBEZXNjICsgOCBieXRlcyBwZW5kaW5nKi8KKwl9IGVsc2UgeworCQlwdHhkZXNjLT50eGR3MCB8PSBjcHVfdG9fbGUzMgorCQkJKCgoVFhERVNDX1NJWkUrT0ZGU0VUX1NaKTw8T0ZGU0VUX1NIVCkmMHgwMGZmMDAwMCk7CisJCS8qZGVmYXVsdCA9IDMyIGJ5dGVzIGZvciBUWCBEZXNjKi8KKwl9CisJcjg3MTJfd3JpdGVfcG9ydChweG1pdGZyYW1lLT5wYWRhcHRlciwgUlRMODcxMl9ETUFfSDJDQ01ELAorCQkJdG90YWxfbGVuZ3RoK1RYREVTQ19TSVpFLCAodTggKilweG1pdGZyYW1lKTsKKworCXJldHVybiBfU1VDQ0VTUzsKK30KKworI2VuZGlmCisKIHN0YXRpYyB2b2lkIHVwZGF0ZV90eGRlc2Moc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUsIHVpbnQgKnBtZW0sIGludCBzeikKIHsKIAl1aW50IHFzZWw7CkBAIC0yNTgsNiArNDIzLDkgQEAKIAlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZweG1pdGZyYW1lLT5hdHRyaWI7CiAJc3RydWN0IHR4X2Rlc2MgKnB0eGRlc2MgPSAoc3RydWN0IHR4X2Rlc2MgKilwbWVtOwogCXN0cnVjdCBkdm9ial9wcml2ICpwZHZvYmogPSAoc3RydWN0IGR2b2JqX3ByaXYgKikmcGFkYXB0ZXItPmR2b2JqcHJpdjsKKyNpZmRlZiBDT05GSUdfUjg3MTJfVFhfQUdHUgorCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAoc3RydWN0IGNtZF9wcml2ICopJnBhZGFwdGVyLT5jbWRwcml2OworI2VuZGlmCiAJdTggYmxuU2V0VHhEZXNjT2Zmc2V0OwogCXNpbnQgYm1jc3QgPSBJU19NQ0FTVChwYXR0cmliLT5yYSk7CiAJc3RydWN0IGh0X3ByaXYgKnBodHByaXYgPSAmcG1sbWVwcml2LT5odHByaXY7CkBAIC0yOTEsOCArNDU5LDQwIEBACiAJaWYgKHB4bWl0ZnJhbWUtPmZyYW1lX3RhZyA9PSBEQVRBX0ZSQU1FVEFHKSB7CiAJCS8qIG9mZnNldCA0ICovCiAJCXB0eGRlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyKChwYXR0cmliLT5tYWNfaWQpJjB4MWYpOworCisjaWZkZWYgQ09ORklHX1I4NzEyX1RYX0FHR1IKKwkJLyogZGlydHkgd29ya2Fyb3VuZCwgbmVlZCB0byBjaGVjayBpZiBpdCBpcyBhZ2dyIGNtZC4gKi8KKwkJaWYgKCh1OCAqKXBtZW0gIT0gKHU4ICopcHhtaXRmcmFtZS0+cHhtaXRidWYtPnBidWYpIHsKKwkJCXB0eGRlc2MtPnR4ZHcwIHw9IGNwdV90b19sZTMyCisJCQkJKCgweDMgPDwgVFlQRV9TSFQpJlRZUEVfTVNLKTsKKwkJCXFzZWwgPSAodWludCkocGF0dHJpYi0+cXNlbCAmIDB4MDAwMDAwMWYpOworCQkJaWYgKHFzZWwgPT0gMikKKwkJCQlxc2VsID0gMDsKKwkJCXB0eGRlc2MtPnR4ZHcxIHw9IGNwdV90b19sZTMyCisJCQkJKChxc2VsIDw8IFFTRUxfU0hUKSAmIDB4MDAwMDFmMDApOworCQkJcHR4ZGVzYy0+dHhkdzIgPSBjcHVfdG9fbGUzMgorCQkJCSgocXNlbCA8PCBSVFNfUkNfU0hUKSYweDAwMWYwMDAwKTsKKwkJCXB0eGRlc2MtPnR4ZHc2IHw9IGNwdV90b19sZTMyCisJCQkJKCgweDUgPDwgUlNWRDZfU0hUKSZSU1ZENl9NU0spOworCQl9IGVsc2UgeworCQkJcHR4ZGVzYy0+dHhkdzAgfD0gY3B1X3RvX2xlMzIKKwkJCQkoKDB4MyA8PCBUWVBFX1NIVCkmVFlQRV9NU0spOworCQkJcHR4ZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIKKwkJCQkoKDB4MTMgPDwgUVNFTF9TSFQpICYgMHgwMDAwMWYwMCk7CisJCQlxc2VsID0gKHVpbnQpKHBhdHRyaWItPnFzZWwgJiAweDAwMDAwMDFmKTsKKwkJCWlmIChxc2VsID09IDIpCisJCQkJcXNlbCA9IDA7CisJCQlwdHhkZXNjLT50eGR3MiA9IGNwdV90b19sZTMyCisJCQkJKChxc2VsIDw8IFJUU19SQ19TSFQpJjB4MDAwMWYwMDApOworCQkJcHR4ZGVzYy0+dHhkdzcgfD0gY3B1X3RvX2xlMzIKKwkJCQkocGNtZHByaXYtPmNtZF9zZXEgPDwgMjQpOworCQkJcGNtZHByaXYtPmNtZF9zZXErKzsKKwkJfQorCQlwYXR0cmliLT5xc2VsID0gMHgxMzsKKyNlbHNlCiAJCXFzZWwgPSAodWludCkocGF0dHJpYi0+cXNlbCAmIDB4MDAwMDAwMWYpOwogCQlwdHhkZXNjLT50eGR3MSB8PSBjcHVfdG9fbGUzMigocXNlbCA8PCBRU0VMX1NIVCkgJiAweDAwMDAxZjAwKTsKKyNlbmRpZgogCQlpZiAoIXBxb3Nwcml2LT5xb3Nfb3B0aW9uKQogCQkJcHR4ZGVzYy0+dHhkdzEgfD0gY3B1X3RvX2xlMzIoQklUKDE2KSk7LypOb24tUW9TKi8KIAkJaWYgKChwYXR0cmliLT5lbmNyeXB0ID4gMCkgJiYgIXBhdHRyaWItPmJzd2VuYykgewpAQCAtNDE0LDcgKzYxNCwxMSBAQAogCXN0cnVjdCBod194bWl0ICpwaHd4bWl0czsKIAlzaW50IGh3ZW50cnk7CiAJc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUgPSBOVUxMOworI2lmZGVmIENPTkZJR19SODcxMl9UWF9BR0dSCisJc3RydWN0IHhtaXRfZnJhbWUgKnAybmR4bWl0ZnJhbWUgPSBOVUxMOworI2Vsc2UKIAlpbnQgcmVzID0gX1NVQ0NFU1MsIHhjbnQgPSAwOworI2VuZGlmCiAKIAlwaHd4bWl0cyA9IHB4bWl0cHJpdi0+aHd4bWl0czsKIAlod2VudHJ5ID0gcHhtaXRwcml2LT5od3htaXRfZW50cnk7CkBAIC00MjIsMzIgKzYyNiw3NCBAQAogCQlweG1pdGJ1ZiA9IHI4NzEyX2FsbG9jX3htaXRidWYocHhtaXRwcml2KTsKIAkJaWYgKCFweG1pdGJ1ZikKIAkJCXJldHVybiBmYWxzZTsKKyNpZmRlZiBDT05GSUdfUjg3MTJfVFhfQUdHUgorCQlweG1pdGJ1Zi0+YWdncl9uciA9IDA7CisjZW5kaWYKIAl9Ci0JZG8gewotCQlweG1pdGZyYW1lID0gZGVxdWV1ZV94ZnJhbWVfZXgocHhtaXRwcml2LCBwaHd4bWl0cywgaHdlbnRyeSk7Ci0JCWlmIChweG1pdGZyYW1lKSB7Ci0JCQlweG1pdGZyYW1lLT5weG1pdGJ1ZiA9IHB4bWl0YnVmOwotCQkJcHhtaXRmcmFtZS0+cHhtaXRfdXJiWzBdID0gcHhtaXRidWYtPnB4bWl0X3VyYlswXTsKLQkJCXB4bWl0ZnJhbWUtPmJ1Zl9hZGRyID0gcHhtaXRidWYtPnBidWY7Ci0JCQlpZiAocHhtaXRmcmFtZS0+ZnJhbWVfdGFnID09IERBVEFfRlJBTUVUQUcpIHsKLQkJCQlpZiAocHhtaXRmcmFtZS0+YXR0cmliLnByaW9yaXR5IDw9IDE1KQotCQkJCQlyZXMgPSByODcxMl94bWl0ZnJhbWVfY29hbGVzY2UocGFkYXB0ZXIsCi0JCQkJCSAgICAgIHB4bWl0ZnJhbWUtPnBrdCwgcHhtaXRmcmFtZSk7Ci0JCQkJLyogYWx3YXlzIHJldHVybiBuZGlzX3BhY2tldCBhZnRlcgotCQkJCSAqICByODcxMl94bWl0ZnJhbWVfY29hbGVzY2UgKi8KLQkJCQlyODcxMl94bWl0X2NvbXBsZXRlKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsKLQkJCX0KLQkJCWlmIChyZXMgPT0gX1NVQ0NFU1MpCi0JCQkJZHVtcF94ZnJhbWUocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwotCQkJZWxzZQotCQkJCXI4NzEyX2ZyZWVfeG1pdGZyYW1lX2V4KHB4bWl0cHJpdiwgcHhtaXRmcmFtZSk7Ci0JCQl4Y250Kys7Ci0JCX0gZWxzZSB7CisJLyogMXN0IGZyYW1lIGRlcXVldWVkICovCisJcHhtaXRmcmFtZSA9IGRlcXVldWVfeGZyYW1lX2V4KHB4bWl0cHJpdiwgcGh3eG1pdHMsIGh3ZW50cnkpOworCS8qIG5lZWQgdG8gcmVtZW1iZXIgdGhlIDFzdCBmcmFtZSAqLworCWlmIChweG1pdGZyYW1lICE9IE5VTEwpIHsKKworI2lmZGVmIENPTkZJR19SODcxMl9UWF9BR0dSCisJCS8qIDEuIGRlcXVldWUgMm5kIGZyYW1lCisJCSAqIDIuIGFnZ3IgaWYgMm5kIHhmcmFtZSBpcyBkZXF1ZXVlZCwgZWxzZSBkdW1wIGRpcmVjdGx5CisJCSAqLworCQlpZiAoQUdHUl9OUl9ISUdIX0JPVU5EID4gMSkKKwkJCXAybmR4bWl0ZnJhbWUgPSBkZXF1ZXVlX3hmcmFtZV9leChweG1pdHByaXYsIHBod3htaXRzLAorCQkJCQkJCWh3ZW50cnkpOworCQlpZiAocHhtaXRmcmFtZS0+ZnJhbWVfdGFnICE9IERBVEFfRlJBTUVUQUcpIHsKIAkJCXI4NzEyX2ZyZWVfeG1pdGJ1ZihweG1pdHByaXYsIHB4bWl0YnVmKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQotCQlicmVhazsKLQl9IHdoaWxlICgwKTsKKwkJaWYgKHAybmR4bWl0ZnJhbWUgIT0gTlVMTCkKKwkJCWlmIChwMm5keG1pdGZyYW1lLT5mcmFtZV90YWcgIT0gREFUQV9GUkFNRVRBRykgeworCQkJCXI4NzEyX2ZyZWVfeG1pdGJ1ZihweG1pdHByaXYsIHB4bWl0YnVmKTsKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCXI4NzEyX3htaXRmcmFtZV9hZ2dyXzFzdChweG1pdGJ1ZiwgcHhtaXRmcmFtZSk7CisJCWlmIChwMm5keG1pdGZyYW1lICE9IE5VTEwpIHsKKwkJCXUxNiB0b3RhbF9sZW5ndGg7CisJCQl0b3RhbF9sZW5ndGggPSByODcxMl94bWl0ZnJhbWVfYWdncl9uZXh0KAorCQkJCXB4bWl0YnVmLCBwMm5keG1pdGZyYW1lKTsKKwkJCWRvIHsKKwkJCQlwMm5keG1pdGZyYW1lID0gZGVxdWV1ZV94ZnJhbWVfZXgoCisJCQkJCXB4bWl0cHJpdiwgcGh3eG1pdHMsIGh3ZW50cnkpOworCQkJCWlmIChwMm5keG1pdGZyYW1lICE9IE5VTEwpCisJCQkJCXRvdGFsX2xlbmd0aCA9CisJCQkJCQlyODcxMl94bWl0ZnJhbWVfYWdncl9uZXh0KAorCQkJCQkJCXB4bWl0YnVmLAorCQkJCQkJCXAybmR4bWl0ZnJhbWUpOworCQkJCWVsc2UKKwkJCQkJYnJlYWs7CisJCQl9IHdoaWxlICh0b3RhbF9sZW5ndGggPD0gMHgxODAwICYmCisJCQkJcHhtaXRidWYtPmFnZ3JfbnIgPD0gQUdHUl9OUl9ISUdIX0JPVU5EKTsKKwkJfQorCQlpZiAocHhtaXRidWYtPmFnZ3JfbnIgPiAwKQorCQkJcjg3MTJfZHVtcF9hZ2dyX3hmcmFtZShweG1pdGJ1ZiwgcHhtaXRmcmFtZSk7CisKKyNlbHNlCisKKwkJeG1pdGZyYW1lX3htaXRidWZfYXR0YWNoKHB4bWl0ZnJhbWUsIHB4bWl0YnVmKTsKKwkJaWYgKHB4bWl0ZnJhbWUtPmZyYW1lX3RhZyA9PSBEQVRBX0ZSQU1FVEFHKSB7CisJCQlpZiAocHhtaXRmcmFtZS0+YXR0cmliLnByaW9yaXR5IDw9IDE1KQorCQkJCXJlcyA9IHI4NzEyX3htaXRmcmFtZV9jb2FsZXNjZShwYWRhcHRlciwKKwkJCQkJcHhtaXRmcmFtZS0+cGt0LCBweG1pdGZyYW1lKTsKKwkJCS8qIGFsd2F5cyByZXR1cm4gbmRpc19wYWNrZXQgYWZ0ZXIKKwkJCSAqIHI4NzEyX3htaXRmcmFtZV9jb2FsZXNjZSAqLworCQkJcjg3MTJfeG1pdF9jb21wbGV0ZShwYWRhcHRlciwgcHhtaXRmcmFtZSk7CisJCX0KKwkJaWYgKHJlcyA9PSBfU1VDQ0VTUykKKwkJCWR1bXBfeGZyYW1lKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsKKwkJZWxzZQorCQkJcjg3MTJfZnJlZV94bWl0ZnJhbWVfZXgocHhtaXRwcml2LCBweG1pdGZyYW1lKTsKKwkJeGNudCsrOworI2VuZGlmCisKKwl9IGVsc2UgeyAvKiBweG1pdGZyYW1lID09IE5VTEwgJiYgcDJuZHhtaXRmcmFtZSA9PSBOVUxMICovCisJCXI4NzEyX2ZyZWVfeG1pdGJ1ZihweG1pdHByaXYsIHB4bWl0YnVmKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KIAlyZXR1cm4gdHJ1ZTsKIH0KIApAQCAtNDgxLDggKzcyNywxMyBAQAogCQlweG1pdGZyYW1lLT5tZW1fYWRkciA9IG1lbV9hZGRyOwogCQlweG1pdGZyYW1lLT5icGVuZGluZ1t0XSA9IGZhbHNlOwogCQlmZl9od2FkZHIgPSBnZXRfZmZfaHdhZGRyKHB4bWl0ZnJhbWUpOworI2lmZGVmIENPTkZJR19SODcxMl9UWF9BR0dSCisJCXI4NzEyX3dyaXRlX3BvcnQocGFkYXB0ZXIsIFJUTDg3MTJfRE1BX0gyQ0NNRCwgd19zeiwKKwkJCQkodW5zaWduZWQgY2hhciAqKXB4bWl0ZnJhbWUpOworI2Vsc2UKIAkJcjg3MTJfd3JpdGVfcG9ydChwYWRhcHRlciwgZmZfaHdhZGRyLCB3X3N6LAogCQkJICAgKHVuc2lnbmVkIGNoYXIgKilweG1pdGZyYW1lKTsKKyNlbmRpZgogCQltZW1fYWRkciArPSB3X3N6OwogCQltZW1fYWRkciA9ICh1OCAqKVJORDQoKChhZGRyX3QpKG1lbV9hZGRyKSkpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfeG1pdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl94bWl0LmgKaW5kZXggMTJhMDgwZi4uYjUwZTdhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl94bWl0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl94bWl0LmgKQEAgLTEsMyArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGludG8gdGhlIExpbnV4IHN0YWdpbmcgdHJlZSBhcmUKKyAqIENvcHlyaWdodChjKSAyMDEwIExhcnJ5IEZpbmdlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOgorICogV0xBTiBGQUUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX1JUTDg3MTJfWE1JVF9IXwogI2RlZmluZSBfUlRMODcxMl9YTUlUX0hfCiAKQEAgLTM5LDYgKzY0LDggQEAKICNkZWZpbmUgT1dOCUJJVCgzMSkKICNkZWZpbmUgRlNHCUJJVCgyNykKICNkZWZpbmUgTFNHCUJJVCgyNikKKyNkZWZpbmUgVFlQRV9TSFQgKDI0KQorI2RlZmluZSBUWVBFX01TSyAoMHgwMzAwMDAwMCkKIAogLypPRkZTRVQgNCovCiAjZGVmaW5lIFBLVF9PRkZTRVRfU1ogKDApCkBAIC00OSw2ICs3Niw3IEBACiAjZGVmaW5lIEJNQyBCSVQoNykKICNkZWZpbmUgQksgQklUKDMwKQogI2RlZmluZSBBR0dfRU4gQklUKDI5KQorI2RlZmluZSBSVFNfUkNfU0hUICgxNikKIAogLypPRkZTRVQgMTIqLwogI2RlZmluZSBTRVFfU0hUICgxNikKQEAgLTU4LDYgKzg2LDggQEAKIAogLypPRkZTRVQgMjAqLwogI2RlZmluZSBESVNGQiBCSVQoMTUpCisjZGVmaW5lIFJTVkQ2X01TSyAoMHgwMEUwMDAwMCkKKyNkZWZpbmUgUlNWRDZfU0hUICgyMSkKIAogc3RydWN0IHR4X2Rlc2MgewogCS8qRFdPUkQgMCovCkBAIC04Myw0ICsxMTMsMTEgQEAKIHZvaWQgcjg3MTJfZG9fcXVldWVfc2VsZWN0KHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsCiAJCQkgICBzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYik7CiAKKyNpZmRlZiBDT05GSUdfUjg3MTJfVFhfQUdHUgordTggcjg3MTJfeG1pdGZyYW1lX2FnZ3JfMXN0KHN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYsCisJCQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSk7Cit1OCByODcxMl9kdW1wX2FnZ3JfeGZyYW1lKHN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYsCisJCQlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSk7CisjZW5kaWYKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2J5dGVvcmRlci5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9ieXRlb3JkZXIuaAppbmRleCAwNzcwN2UyLi5iZDM3MDNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2J5dGVvcmRlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfYnl0ZW9yZGVyLmgKQEAgLTEsMyArMSwyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9SVEw4NzFYX0JZVEVPUkRFUl9IXwogI2RlZmluZSBfUlRMODcxWF9CWVRFT1JERVJfSF8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfY21kLmMKaW5kZXggYmE5Mjc2Mi4uZDc3Mzg4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9jbWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2NtZC5jCkBAIC0yOCw2ICsyOCwyNCBAQAogCiAjZGVmaW5lIF9SVEw4NzFYX0NNRF9DXwogCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva3JlZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KKyNpbmNsdWRlIDxsaW51eC9jaXJjX2J1Zi5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisKICNpbmNsdWRlICJvc2RlcF9zZXJ2aWNlLmgiCiAjaW5jbHVkZSAiZHJ2X3R5cGVzLmgiCiAjaW5jbHVkZSAicmVjdl9vc2RlcC5oIgpAQCAtMjIyLDcgKzI0MCw3IEBACiAJaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHN1cnZleVBhcmEsCiAJCQkJICAgR0VOX0NNRF9DT0RFKF9TaXRlU3VydmV5KSk7CiAJcHN1cnZleVBhcmEtPmJzc2xpbWl0ID0gY3B1X3RvX2xlMzIoNDgpOwotCXBzdXJ2ZXlQYXJhLT5wYXNzaXZlX21vZGUgPSBjcHVfdG9fbGUzMigxKTsKKwlwc3VydmV5UGFyYS0+cGFzc2l2ZV9tb2RlID0gY3B1X3RvX2xlMzIocG1sbWVwcml2LT5wYXNzaXZlX21vZGUpOwogCXBzdXJ2ZXlQYXJhLT5zc19zc2lkbGVuID0gMDsKIAltZW1zZXQocHN1cnZleVBhcmEtPnNzX3NzaWQsIDAsIElXX0VTU0lEX01BWF9TSVpFICsgMSk7CiAJaWYgKChwc3NpZCAhPSBOVUxMKSAmJiAocHNzaWQtPlNzaWRMZW5ndGgpKSB7CkBAIC0yMzMsNiArMjUxLDcgQEAKIAlyODcxMl9lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiAJX3NldF90aW1lcigmcG1sbWVwcml2LT5zY2FuX3RvX3RpbWVyLCBTQ0FOTklOR19USU1FT1VUKTsKIAlwYWRhcHRlci0+bGVkcHJpdi5MZWRDb250cm9sSGFuZGxlcihwYWRhcHRlciwgTEVEX0NUTF9TSVRFX1NVUlZFWSk7CisJcGFkYXB0ZXItPmJsbkVuYWJsZVJ4RkYwRmlsdGVyID0gMDsKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKQEAgLTI1OSw2ICsyNzgsMjggQEAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKK3U4IHI4NzEyX3NldF9jaHBsYW5fY21kKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsIGludCBjaHBsYW4pCit7CisJc3RydWN0IGNtZF9vYmogKnBoMmM7CisJc3RydWN0IFNldENoYW5uZWxQbGFuX3BhcmFtICpwc2V0Y2hwbGFucGFyYTsKKwlzdHJ1Y3QgY21kX3ByaXYgKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OworCisJcGgyYyA9IChzdHJ1Y3QgY21kX29iaiAqKV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSk7CisJaWYgKHBoMmMgPT0gTlVMTCkKKwkJcmV0dXJuIF9GQUlMOworCXBzZXRjaHBsYW5wYXJhID0gKHN0cnVjdCBTZXRDaGFubmVsUGxhbl9wYXJhbSAqKQorCQlfbWFsbG9jKHNpemVvZihzdHJ1Y3QgU2V0Q2hhbm5lbFBsYW5fcGFyYW0pKTsKKwlpZiAocHNldGNocGxhbnBhcmEgPT0gTlVMTCkgeworCQlrZnJlZSgodTggKikgcGgyYyk7CisJCXJldHVybiBfRkFJTDsKKwl9CisJaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHNldGNocGxhbnBhcmEsCisJCQkJR0VOX0NNRF9DT0RFKF9TZXRDaGFubmVsUGxhbikpOworCXBzZXRjaHBsYW5wYXJhLT5DaGFubmVsUGxhbiA9IGNocGxhbjsKKwlyODcxMl9lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CisJcmV0dXJuIF9TVUNDRVNTOworfQorCiB1OCByODcxMl9zZXRiYXNpY3JhdGVfY21kKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpyYXRlc2V0KQogewogCXN0cnVjdCBjbWRfb2JqICpwaDJjOwpAQCAtMjg1LDIwICszMjYsNjIgQEAKIHU4IHI4NzEyX3NldHB0bV9jbWQoc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciwgdTggdHlwZSkKIHsKIAlzdHJ1Y3QgY21kX29iagkJKnBoMmM7Ci0Jc3RydWN0IFBUX3BhcmFtCQkqcHB0cGFybTsKKwlzdHJ1Y3Qgd3JpdGVQVE1fcGFybQkqcHdyaXRlcHRtcGFybTsKIAlzdHJ1Y3QgY21kX3ByaXYJCSpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKIAogCXBoMmMgPSAoc3RydWN0IGNtZF9vYmogKilfbWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOwogCWlmIChwaDJjID09IE5VTEwpCiAJCXJldHVybiBfRkFJTDsKLQlwcHRwYXJtID0gKHN0cnVjdCBQVF9wYXJhbSAqKV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBQVF9wYXJhbSkpOwotCWlmIChwcHRwYXJtID09IE5VTEwpIHsKKwlwd3JpdGVwdG1wYXJtID0gKHN0cnVjdCB3cml0ZVBUTV9wYXJtICopCisJCV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCB3cml0ZVBUTV9wYXJtKSk7CisJaWYgKHB3cml0ZXB0bXBhcm0gPT0gTlVMTCkgewogCQlrZnJlZSgodTggKikgcGgyYyk7CiAJCXJldHVybiBfRkFJTDsKIAl9Ci0JaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHB0cGFybSwKLQkJCQkgICBHRU5fQ01EX0NPREUoX1NldFBvd2VyVHJhY2tpbmcpKTsKLQlwcHRwYXJtLT5QVF9FbiA9IHR5cGU7CisJaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHdyaXRlcHRtcGFybSwgR0VOX0NNRF9DT0RFKF9TZXRQVCkpOworCXB3cml0ZXB0bXBhcm0tPnR5cGUgPSB0eXBlOworCXI4NzEyX2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsKKwlyZXR1cm4gX1NVQ0NFU1M7Cit9CisKK3U4IHI4NzEyX3NldGZ3ZGlnX2NtZChzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCB0eXBlKQoreworCXN0cnVjdCBjbWRfb2JqICpwaDJjOworCXN0cnVjdCB3cml0ZVBUTV9wYXJtICpwd3JpdGVwdG1wYXJtOworCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmcGFkYXB0ZXItPmNtZHByaXY7CisKKwlwaDJjID0gKHN0cnVjdCBjbWRfb2JqICopX21hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKKwlpZiAocGgyYyA9PSBOVUxMKQorCQlyZXR1cm4gX0ZBSUw7CisJcHdyaXRlcHRtcGFybSA9IChzdHJ1Y3Qgd3JpdGVQVE1fcGFybSAqKQorCQlfbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2V0ZGlnX3Bhcm0pKTsKKwlpZiAocHdyaXRlcHRtcGFybSA9PSBOVUxMKSB7CisJCWtmcmVlKCh1OCAqKSBwaDJjKTsKKwkJcmV0dXJuIF9GQUlMOworCX0KKwlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwd3JpdGVwdG1wYXJtLCBHRU5fQ01EX0NPREUoX1NldERJRykpOworCXB3cml0ZXB0bXBhcm0tPnR5cGUgPSB0eXBlOworCXI4NzEyX2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsKKwlyZXR1cm4gX1NVQ0NFU1M7Cit9CisKK3U4IHI4NzEyX3NldGZ3cmFfY21kKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHR5cGUpCit7CisJc3RydWN0IGNtZF9vYmogKnBoMmM7CisJc3RydWN0IHdyaXRlUFRNX3Bhcm0gKnB3cml0ZXB0bXBhcm07CisJc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKKworCXBoMmMgPSAoc3RydWN0IGNtZF9vYmogKilfbWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOworCWlmIChwaDJjID09IE5VTEwpCisJCXJldHVybiBfRkFJTDsKKwlwd3JpdGVwdG1wYXJtID0gKHN0cnVjdCB3cml0ZVBUTV9wYXJtICopCisJCV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZXRyYV9wYXJtKSk7CisJaWYgKHB3cml0ZXB0bXBhcm0gPT0gTlVMTCkgeworCQlrZnJlZSgodTggKikgcGgyYyk7CisJCXJldHVybiBfRkFJTDsKKwl9CisJaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHdyaXRlcHRtcGFybSwgR0VOX0NNRF9DT0RFKF9TZXRSQSkpOworCXB3cml0ZXB0bXBhcm0tPnR5cGUgPSB0eXBlOwogCXI4NzEyX2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CkBAIC0zNTMsOCArNDM2LDE3IEBACiB2b2lkIHI4NzEyX2dldGJicmZyZWdfY21kcnNwX2NhbGxiYWNrKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsCiAJCQkJICAgICAgc3RydWN0IGNtZF9vYmogKnBjbWQpCiB7Ci0Ja2ZyZWUoKHVuc2lnbmVkIGNoYXIgKikgcGNtZC0+cGFybWJ1Zik7Ci0Ja2ZyZWUoKHVuc2lnbmVkIGNoYXIgKikgcGNtZCk7CisJa2ZyZWUocGNtZC0+cGFybWJ1Zik7CisJa2ZyZWUocGNtZCk7CisJcGFkYXB0ZXItPm1wcHJpdi53b3JrcGFyYW0uYmNvbXBsZXRlZCA9IHRydWU7Cit9CisKK3ZvaWQgcjg3MTJfcmVhZHRzc2lfY21kcnNwX2NhbGxiYWNrKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsCisJCQkJc3RydWN0IGNtZF9vYmogKnBjbWQpCit7CisJa2ZyZWUocGNtZC0+cGFybWJ1Zik7CisJa2ZyZWUocGNtZCk7CisKIAlwYWRhcHRlci0+bXBwcml2LndvcmtwYXJhbS5iY29tcGxldGVkID0gdHJ1ZTsKIH0KIApAQCAtNDg1LDEyICs1NzcsNiBAQAogCQkJCQkJJnBzZWNuZXR3b3JrLT5JRXNbMF0sCiAJCQkJCQlwbmV0d29yay0+bmV0d29yay5JRUxlbmd0aCwKIAkJCQkJCSZwc2VjbmV0d29yay0+SUVMZW5ndGgpOwotCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFKSkKLQkJCQlyODcxMl9hZGRfaHRfYWRkdF9pbmZvKHBhZGFwdGVyLAotCQkJCQkJJnBuZXR3b3JrLT5uZXR3b3JrLklFc1swXSwKLQkJCQkJCSZwc2VjbmV0d29yay0+SUVzWzBdLAotCQkJCQkJcG5ldHdvcmstPm5ldHdvcmsuSUVMZW5ndGgsCi0JCQkJCQkmcHNlY25ldHdvcmstPklFTGVuZ3RoKTsKIAkJfQogCX0KIAlwc2VjdXJpdHlwcml2LT5zdXBwbGljYW50X2llWzBdID0gKHU4KXBzZWNuZXR3b3JrLT5JRUxlbmd0aDsKQEAgLTY3NSw2ICs3NjEsMzMgQEAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKK3U4IHI4NzEyX2dldHRzc2lfY21kKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IG9mZnNldCwgdTggKnB2YWwpCit7CisJc3RydWN0IGNtZF9wcml2ICpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKKwlzdHJ1Y3QgY21kX29iaiAqcGgyYzsKKwlzdHJ1Y3QgcmVhZFRTU0lfcGFybSAqcHJkdHNzaXBhcm07CisKKwlwaDJjID0gKHN0cnVjdCBjbWRfb2JqICopX21hbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopKTsKKwlpZiAocGgyYyA9PSBOVUxMKQorCQlyZXR1cm4gX0ZBSUw7CisJcHJkdHNzaXBhcm0gPSAoc3RydWN0IHJlYWRUU1NJX3Bhcm0gKikKKwkJX21hbGxvYyhzaXplb2Yoc3RydWN0IHJlYWRUU1NJX3Bhcm0pKTsKKwlpZiAocHJkdHNzaXBhcm0gPT0gTlVMTCkgeworCQlrZnJlZSgodW5zaWduZWQgY2hhciAqKSBwaDJjKTsKKwkJcmV0dXJuIF9GQUlMOworCX0KKwlfaW5pdF9saXN0aGVhZCgmcGgyYy0+bGlzdCk7CisJcGgyYy0+Y21kY29kZSA9IEdFTl9DTURfQ09ERShfUmVhZFRTU0kpOworCXBoMmMtPnBhcm1idWYgPSAodW5zaWduZWQgY2hhciAqKXByZHRzc2lwYXJtOworCXBoMmMtPmNtZHN6ID0gc2l6ZW9mKHN0cnVjdCByZWFkVFNTSV9wYXJtKTsKKwlwaDJjLT5yc3AgPSBwdmFsOworCXBoMmMtPnJzcHN6ID0gc2l6ZW9mKHN0cnVjdCByZWFkVFNTSV9yc3ApOworCisJcHJkdHNzaXBhcm0tPm9mZnNldCA9IG9mZnNldDsKKwlyODcxMl9lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CisJcmV0dXJuIF9TVUNDRVNTOworfQorCiB1OCByODcxMl9zZXRNYWNBZGRyX2NtZChzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqbWFjX2FkZHIpCiB7CiAJc3RydWN0IGNtZF9wcml2CSpwY21kcHJpdiA9ICZwYWRhcHRlci0+Y21kcHJpdjsKQEAgLTkyMywzICsxMDM2LDMyIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1sbWVwcml2LT5sb2NrLCBpcnFMKTsKIAlyODcxMl9mcmVlX2NtZF9vYmoocGNtZCk7CiB9CisKK3U4IHI4NzEyX2Rpc2Nvbm5lY3RDdHJsRXhfY21kKHN0cnVjdCBfYWRhcHRlciAqYWRhcHRlciwgdTMyIGVuYWJsZURydkN0cmwsCisJCQl1MzIgdHJ5UGt0Q250LCB1MzIgdHJ5UGt0SW50ZXJ2YWwsIHUzMiBmaXJzdFN0YWdlVE8pCit7CisJc3RydWN0IGNtZF9vYmogKnBoMmM7CisJc3RydWN0IERpc2Nvbm5lY3RDdHJsRXhfcGFyYW0gKnBhcmFtOworCXN0cnVjdCBjbWRfcHJpdiAqcGNtZHByaXYgPSAmYWRhcHRlci0+Y21kcHJpdjsKKworCXBoMmMgPSAoc3RydWN0IGNtZF9vYmogKilfbWFsbG9jKHNpemVvZihzdHJ1Y3QgY21kX29iaikpOworCWlmIChwaDJjID09IE5VTEwpCisJCXJldHVybiBfRkFJTDsKKwlwYXJhbSA9IChzdHJ1Y3QgRGlzY29ubmVjdEN0cmxFeF9wYXJhbSAqKQorCQlfbWFsbG9jKHNpemVvZihzdHJ1Y3QgRGlzY29ubmVjdEN0cmxFeF9wYXJhbSkpOworCWlmIChwYXJhbSA9PSBOVUxMKSB7CisJCWtmcmVlKCh1bnNpZ25lZCBjaGFyICopIHBoMmMpOworCQlyZXR1cm4gX0ZBSUw7CisJfQorCW1lbXNldChwYXJhbSwgMCwgc2l6ZW9mKHN0cnVjdCBEaXNjb25uZWN0Q3RybEV4X3BhcmFtKSk7CisKKwlwYXJhbS0+RW5hYmxlRHJ2Q3RybCA9ICh1bnNpZ25lZCBjaGFyKWVuYWJsZURydkN0cmw7CisJcGFyYW0tPlRyeVBrdENudCA9ICh1bnNpZ25lZCBjaGFyKXRyeVBrdENudDsKKwlwYXJhbS0+VHJ5UGt0SW50ZXJ2YWwgPSAodW5zaWduZWQgY2hhcil0cnlQa3RJbnRlcnZhbDsKKwlwYXJhbS0+Rmlyc3RTdGFnZVRPID0gKHVuc2lnbmVkIGludClmaXJzdFN0YWdlVE87CisKKwlpbml0X2gyZndjbWRfd19wYXJtX25vX3JzcChwaDJjLCBwYXJhbSwKKwkJCQlHRU5fQ01EX0NPREUoX0Rpc2Nvbm5lY3RDdHJsRXgpKTsKKwlyODcxMl9lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CisJcmV0dXJuIF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9jbWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfY21kLmgKaW5kZXggZGNmMjU2ZC4uNzU3ZWJmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9jbWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2NtZC5oCkBAIC0xLDMgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBMaW51eCBzdGFnaW5nIHRyZWUgYXJlCisgKiBDb3B5cmlnaHQoYykgMjAxMCBMYXJyeSBGaW5nZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjoKKyAqIFdMQU4gRkFFIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9fUlRMODcxWF9DTURfSF8KICNkZWZpbmUgX19SVEw4NzFYX0NNRF9IXwogCkBAIC0yOTUsNiArMzIwLDM1IEBACiAJdTgJZGF0YXJhdGVzW051bVJhdGVzXTsKIH07CiAKK2VudW0gX1JUX0NIQU5ORUxfRE9NQUlOIHsKKwlSVF9DSEFOTkVMX0RPTUFJTl9GQ0MgPSAwLAorCVJUX0NIQU5ORUxfRE9NQUlOX0lDID0gMSwKKwlSVF9DSEFOTkVMX0RPTUFJTl9FVFNJID0gMiwKKwlSVF9DSEFOTkVMX0RPTUFJTl9TUEFJTiA9IDMsCisJUlRfQ0hBTk5FTF9ET01BSU5fRlJBTkNFID0gNCwKKwlSVF9DSEFOTkVMX0RPTUFJTl9NS0sgPSA1LAorCVJUX0NIQU5ORUxfRE9NQUlOX01LSzEgPSA2LAorCVJUX0NIQU5ORUxfRE9NQUlOX0lTUkFFTCA9IDcsCisJUlRfQ0hBTk5FTF9ET01BSU5fVEVMRUMgPSA4LAorCisJLyogQmUgY29tcGF0aWJsZSB3aXRoIG9sZCBjaGFubmVsIHBsYW4uIE5vIGdvb2QhICovCisJUlRfQ0hBTk5FTF9ET01BSU5fTUlDID0gOSwKKwlSVF9DSEFOTkVMX0RPTUFJTl9HTE9CQUxfRE9BTUlOID0gMTAsCisJUlRfQ0hBTk5FTF9ET01BSU5fV09STERfV0lERV8xMyA9IDExLAorCVJUX0NIQU5ORUxfRE9NQUlOX1RFTEVDX05FVEdFQVIgPSAxMiwKKworCVJUX0NIQU5ORUxfRE9NQUlOX05DQyA9IDEzLAorCVJUX0NIQU5ORUxfRE9NQUlOXzVHID0gMTQsCisJUlRfQ0hBTk5FTF9ET01BSU5fNUdfNDBNID0gMTUsCisgLyo9PT09PSBBZGQgbmV3IGNoYW5uZWwgcGxhbiBhYm92ZSB0aGlzIGxpbmU9PT09PT09PT09PT09PT0qLworCVJUX0NIQU5ORUxfRE9NQUlOX01BWCwKK307CisKKworc3RydWN0IFNldENoYW5uZWxQbGFuX3BhcmFtIHsKKwllbnVtIF9SVF9DSEFOTkVMX0RPTUFJTiBDaGFubmVsUGxhbjsKK307CisKIC8qCiBDYWxsZXIgTW9kZTogQW55CiAKQEAgLTM2Nyw2ICs0MjEsMTAgQEAKIAl1OAl2YWx1ZTsKIH07CiAKK3N0cnVjdCB3cml0ZVBUTV9wYXJtIHsKKwl1OAl0eXBlOworfTsKKwogc3RydWN0IHJlYWRSRl9wYXJtIHsKIAl1OAlvZmZzZXQ7CiB9OwpAQCAtNjQ2LDkgKzcwNCwxNCBAQAogCXUzMiBjdXJyX2NoOwogfTsKIAotLypIMkMgSGFuZGxlciBpbmRleDogNTYgKi8KLXN0cnVjdCBQVF9wYXJhbSB7Ci0JdTggUFRfRW47CisvKkgyQyBIYW5kbGVyIGluZGV4OiA2MSAqLworc3RydWN0IERpc2Nvbm5lY3RDdHJsRXhfcGFyYW0geworCS8qIE1BWFRJTUUgPSAoMiAqIEZpcnN0U3RhZ2VUTykgKyAoVHJ5UGt0Q250ICogVHJ5UGt0SW50ZXJ2YWwpICovCisJdW5zaWduZWQgY2hhciBFbmFibGVEcnZDdHJsOworCXVuc2lnbmVkIGNoYXIgVHJ5UGt0Q250OworCXVuc2lnbmVkIGNoYXIgVHJ5UGt0SW50ZXJ2YWw7IC8qIFVuaXQ6IG1zICovCisJdW5zaWduZWQgY2hhciByc3ZkOworCXVuc2lnbmVkIGludCAgRmlyc3RTdGFnZVRPOyAvKiBVbml0OiBtcyAqLwogfTsKIAogI2RlZmluZSBHRU5fQ01EX0NPREUoY21kKQljbWQgIyMgX0NNRF8KQEAgLTY4NCwxMyArNzQ3LDE3IEBACiB1OCByODcxMl9zZXRvcG1vZGVfY21kKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsCiAJCSBlbnVtIE5ESVNfODAyXzExX05FVFdPUktfSU5GUkFTVFJVQ1RVUkUgbmV0d29ya3R5cGUpOwogdTggcjg3MTJfc2V0ZGF0YXJhdGVfY21kKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICpyYXRlc2V0KTsKK3U4IHI4NzEyX3NldF9jaHBsYW5fY21kKHN0cnVjdCBfYWRhcHRlciAgKnBhZGFwdGVyLCBpbnQgY2hwbGFuKTsKIHU4IHI4NzEyX3NldGJhc2ljcmF0ZV9jbWQoc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciwgdTggKnJhdGVzZXQpOwogdTggcjg3MTJfZ2V0cmZyZWdfY21kKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IG9mZnNldCwgdTggKiBwdmFsKTsKIHU4IHI4NzEyX3NldHJmaW50ZnNfY21kKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IG1vZGUpOwogdTggcjg3MTJfc2V0cmZyZWdfY21kKHN0cnVjdCBfYWRhcHRlciAgKnBhZGFwdGVyLCB1OCBvZmZzZXQsIHUzMiB2YWwpOwogdTggcjg3MTJfc2V0cnR0YmxfY21kKHN0cnVjdCBfYWRhcHRlciAgKnBhZGFwdGVyLAogCQkgICAgICBzdHJ1Y3Qgc2V0cmF0YWJsZV9wYXJtICpwcmF0ZV90YWJsZSk7Cit1OCByODcxMl9nZXR0c3NpX2NtZChzdHJ1Y3QgX2FkYXB0ZXIgICpwYWRhcHRlciwgdTggb2Zmc2V0LCB1OCAqcHZhbCk7CiB1OCByODcxMl9zZXRwdG1fY21kKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHR5cGUpOwordTggcjg3MTJfc2V0ZndkaWdfY21kKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IHR5cGUpOwordTggcjg3MTJfc2V0ZndyYV9jbWQoc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciwgdTggdHlwZSk7CiB1OCByODcxMl9hZGRiYXJlcV9jbWQoc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciwgdTggdGlkKTsKIHU4IHI4NzEyX3dkZ193a19jbWQoc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlcik7CiB2b2lkIHI4NzEyX3N1cnZleV9jbWRfY2FsbGJhY2soc3RydWN0IF9hZGFwdGVyICAqcGFkYXB0ZXIsCkBAIC03MDMsMTAgKzc3MCwxNCBAQAogCQkJCSAgc3RydWN0IGNtZF9vYmogKnBjbWQpOwogdm9pZCByODcxMl9nZXRiYnJmcmVnX2NtZHJzcF9jYWxsYmFjayhzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyLAogCQkJCSAgICAgIHN0cnVjdCBjbWRfb2JqICpwY21kKTsKK3ZvaWQgcjg3MTJfcmVhZHRzc2lfY21kcnNwX2NhbGxiYWNrKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsCisJCQkJc3RydWN0IGNtZF9vYmogKnBjbWQpOwogdm9pZCByODcxMl9zZXRzdGFLZXlfY21kcnNwX2NhbGxiYWNrKHN0cnVjdCBfYWRhcHRlciAgKnBhZGFwdGVyLAogCQkJCSAgICAgc3RydWN0IGNtZF9vYmogKnBjbWQpOwogdm9pZCByODcxMl9zZXRhc3NvY3N0YV9jbWRyc3BfY2FsbGJhY2soc3RydWN0IF9hZGFwdGVyICAqcGFkYXB0ZXIsCiAJCQkJICAgICAgIHN0cnVjdCBjbWRfb2JqICpwY21kKTsKK3U4IHI4NzEyX2Rpc2Nvbm5lY3RDdHJsRXhfY21kKHN0cnVjdCBfYWRhcHRlciAqYWRhcHRlciwgdTMyIGVuYWJsZURydkN0cmwsCisJCQl1MzIgdHJ5UGt0Q250LCB1MzIgdHJ5UGt0SW50ZXJ2YWwsIHUzMiBmaXJzdFN0YWdlVE8pOwogCiBzdHJ1Y3QgX2NtZF9jYWxsYmFjayB7CiAJdTMyCWNtZF9jb2RlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9kZWJ1Zy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9kZWJ1Zy5oCmluZGV4IGMzOTJmZDkuLjc0NDY4YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfZGVidWcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2RlYnVnLmgKQEAgLTEsMyArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGludG8gdGhlIExpbnV4IHN0YWdpbmcgdHJlZSBhcmUKKyAqIENvcHlyaWdodChjKSAyMDEwIExhcnJ5IEZpbmdlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOgorICogV0xBTiBGQUUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX19SVEw4NzFYX0RFQlVHX0hfXwogI2RlZmluZSBfX1JUTDg3MVhfREVCVUdfSF9fCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfZWVwcm9tLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2VlcHJvbS5oCmluZGV4IGZiMTVmNWIuLjQ5NzI3NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfZWVwcm9tLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9lZXByb20uaApAQCAtMSwzICsxLDIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX19SVEw4NzFYX0VFUFJPTV9IX18KICNkZWZpbmUgX19SVEw4NzFYX0VFUFJPTV9IX18KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9ldmVudC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9ldmVudC5oCmluZGV4IDZjZTA2NzYuLmUwM2VlOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfZXZlbnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2V2ZW50LmgKQEAgLTEsMyArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGludG8gdGhlIExpbnV4IHN0YWdpbmcgdHJlZSBhcmUKKyAqIENvcHlyaWdodChjKSAyMDEwIExhcnJ5IEZpbmdlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOgorICogV0xBTiBGQUUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX1JUTDg3MXhfRVZFTlRfSF8KICNkZWZpbmUgX1JUTDg3MXhfRVZFTlRfSF8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9odC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9odC5oCmluZGV4IDYxMjIwM2QuLjQxODcyZDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaHQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2h0LmgKQEAgLTEsMyArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGludG8gdGhlIExpbnV4IHN0YWdpbmcgdHJlZSBhcmUKKyAqIENvcHlyaWdodChjKSAyMDEwIExhcnJ5IEZpbmdlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOgorICogV0xBTiBGQUUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX1JUTDg3MVhfSFRfSF8KICNkZWZpbmUgX1JUTDg3MVhfSFRfSF8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pby5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pby5oCmluZGV4IGI3MGNiMmIuLjg2MzA4YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW8uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvLmgKQEAgLTEsMyArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGludG8gdGhlIExpbnV4IHN0YWdpbmcgdHJlZSBhcmUKKyAqIENvcHlyaWdodChjKSAyMDEwIExhcnJ5IEZpbmdlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOgorICogV0xBTiBGQUUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX0lPX0hfCiAjZGVmaW5lIF9JT19IXwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsX2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsX2xpbnV4LmMKaW5kZXggNDBlNmI1Yy4uNTA3NTg0YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGxfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsX2xpbnV4LmMKQEAgLTM5LDggKzM5LDE3IEBACiAjaW5jbHVkZSAicnRsODcxeF9pb2N0bF9zZXQuaCIKICNpbmNsdWRlICJydGw4NzF4X21wX2lvY3RsLmgiCiAjaW5jbHVkZSAibWxtZV9vc2RlcC5oIgorI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAKLSNkZWZpbmUgUlRMX0lPQ1RMX1dQQV9TVVBQTElDQU5UCShTSU9DSVdGSVJTVFBSSVYgKyAzMCkKKyNkZWZpbmUgUlRMX0lPQ1RMX1dQQV9TVVBQTElDQU5UCShTSU9DSVdGSVJTVFBSSVYgKyAweDFFKQogCiAjZGVmaW5lIFNDQU5fSVRFTV9TSVpFIDc2OAogI2RlZmluZSBNQVhfQ1VTVE9NX0xFTiA2NApAQCAtMTYwLDEwICsxNjksNiBAQAogCXN0cnVjdCBpd19ldmVudCBpd2U7CiAJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKnBodF9jYXBpZTsKIAljaGFyICpjdXJyZW50X3ZhbDsKLQl1OCAqYnVmID0gKHU4ICopX21hbGxvYyhwbmV0d29yay0+bmV0d29yay5JRUxlbmd0aCAqIDIpOwotCXU4ICp3cGFfaWUgPSAodTggKilfbWFsbG9jKDI1NSk7Ci0JdTggKnJzbl9pZSA9ICh1OCAqKV9tYWxsb2MoMjU1KTsKLQl1OCAqd3BzX2llID0gKHU4ICopX21hbGxvYyhNQVhfV1BTX0lFX0xFTik7CiAJczggKnA7CiAJdTMyIGkgPSAwLCBodF9pZWxlbiA9IDA7CiAJdTE2CWNhcCwgaHRfY2FwID0gZmFsc2UsIG1jc19yYXRlOwpAQCAtMjgwLDYgKzI4NSw4IEBACiAJCXN0YXJ0ID0gY3VycmVudF92YWw7CiAJLyogcGFyc2luZyBXUEEvV1BBMiBJRSAqLwogCXsKKwkJdTggYnVmW01BWF9XUEFfSUVfTEVOXTsKKwkJdTggd3BhX2llWzI1NV0sIHJzbl9pZVsyNTVdOwogCQl1MTYgd3BhX2xlbiA9IDAsIHJzbl9sZW4gPSAwOwogCQlpbnQgbjsKIAkJc2ludCBvdXRfbGVuID0gMDsKQEAgLTMzMCw2ICszMzcsNyBAQAogCX0KIAogCXsgLyogcGFyc2luZyBXUFMgSUUgKi8KKwkJdTggd3BzX2llWzUxMl07CiAJCXVpbnQgd3BzX2llbGVuOwogCiAJCWlmIChyODcxMl9nZXRfd3BzX2llKHBuZXR3b3JrLT5uZXR3b3JrLklFcywKQEAgLTM1NCwxNiArMzYyLDEyIEBACiAJaXdlLnUucXVhbC5ub2lzZSA9IDA7IC8qIG5vaXNlIGxldmVsICovCiAJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOwogCS8qIGhvdyB0byB0cmFuc2xhdGUgcnNzaSB0byA/JSAqLwotCWtmcmVlKGJ1Zik7Ci0Ja2ZyZWUod3BhX2llKTsKLQlrZnJlZShyc25faWUpOwotCWtmcmVlKHdwc19pZSk7CiAJcmV0dXJuIHN0YXJ0OwogfQogCiBzdGF0aWMgaW50IHdwYV9zZXRfYXV0aF9hbGdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWx1ZSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBfbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBuZXRkZXZfcHJpdihkZXYpOwogCWludCByZXQgPSAwOwogCiAJaWYgKCh2YWx1ZSAmIEFVVEhfQUxHX1NIQVJFRF9LRVkpICYmICh2YWx1ZSAmIEFVVEhfQUxHX09QRU5fU1lTVEVNKSkgewpAQCAtMzk1LDcgKzM5OSw3IEBACiAJaW50IHJldCA9IDA7CiAJdTMyIHdlcF9rZXlfaWR4LCB3ZXBfa2V5X2xlbiA9IDA7CiAJc3RydWN0IE5ESVNfODAyXzExX1dFUAkgKnB3ZXAgPSBOVUxMOwotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopX25ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKIApAQCAtNTI2LDcgKzUzMCw3IEBACiAJCW1lbWNweShidWYsIHBpZSAsIGllbGVuKTsKIAkJcG9zID0gYnVmOwogCQlpZiAoaWVsZW4gPCBSU05fSEVBREVSX0xFTikgewotCQkJcmV0ICA9IC0xOworCQkJcmV0ICA9IC1FSU5WQUw7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAkJaWYgKHI4NzEyX3BhcnNlX3dwYV9pZShidWYsIGllbGVuLCAmZ3JvdXBfY2lwaGVyLApAQCAtNjM3LDcgKzY0MSw3IEBACiAJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopX25ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOwogCXUzMiBodF9pZWxlbiA9IDA7CiAJY2hhciAqcDsKIAl1OCBodF9jYXAgPSBmYWxzZTsKQEAgLTY5Myw3ICs2OTcsNyBAQAogCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKV9uZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXdfZnJlcSAqZndycSA9ICZ3cnF1LT5mcmVxOwogCWludCByYyA9IDA7CiAKQEAgLTcyNyw3ICs3MzEsNyBAQAogCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKV9uZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCBuZGlzX3dsYW5fYnNzaWRfZXggKnBjdXJfYnNzID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yazsKIApAQCAtNzM2LDggKzc0MCw5IEBACiAJCQkgICAgICAgcGN1cl9ic3MtPkNvbmZpZ3VyYXRpb24uRFNDb25maWctMV0gKiAxMDAwMDA7CiAJCXdycXUtPmZyZXEuZSA9IDE7CiAJCXdycXUtPmZyZXEuaSA9IHBjdXJfYnNzLT5Db25maWd1cmF0aW9uLkRTQ29uZmlnOwotCX0gZWxzZQotCQlyZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FTk9MSU5LOworCX0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNzQ1LDcgKzc1MCw3IEBACiAJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCiAJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKilfbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKW5ldGRldl9wcml2KGRldik7CiAJZW51bSBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFIG5ldHdvcmtUeXBlOwogCiAJc3dpdGNoICh3cnF1LT5tb2RlKSB7CkBAIC03NjgsMTUgKzc3MywxNSBAQAogCQlyODcxMl9zZXRvcG1vZGVfY21kKHBhZGFwdGVyLCBuZXR3b3JrVHlwZSk7CiAJZWxzZQogCQlyODcxMl9zZXRvcG1vZGVfY21kKHBhZGFwdGVyLCBOZGlzODAyXzExQXV0b1Vua25vd24pOwotCWlmICghcjg3MTJfc2V0XzgwMl8xMV9pbmZyYXN0cnVjdHVyZV9tb2RlKHBhZGFwdGVyLCBuZXR3b3JrVHlwZSkpCi0JCXJldHVybiAtMTsKKworCXI4NzEyX3NldF84MDJfMTFfaW5mcmFzdHJ1Y3R1cmVfbW9kZShwYWRhcHRlciwgbmV0d29ya1R5cGUpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHI4NzExX3d4X2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCiAJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKilfbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKW5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSA9PSB0cnVlKQpAQCAtNzk1LDcgKzgwMCw3IEBACiAJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCiAJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopX25ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7CiAJc3RydWN0IGl3X3Bta3NhICpwUE1LID0gKHN0cnVjdCBpd19wbWtzYSAqKSBleHRyYTsKIAl1OCBzdHJaZXJvTWFjQWRkcmVzc1tFVEhfQUxFTl0gPSB7MHgwMH07CkBAIC05NDksNiArOTU0LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgcjg3MTFfd3hfZ2V0X3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpOworCiBzdGF0aWMgaW50IHI4NzF4X3d4X3NldF9wcml2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCQl1bmlvbiBpd3JlcV9kYXRhICphd3JxLApAQCAtOTU2LDYgKzk2NSw3IEBACiB7CiAJaW50IHJldCA9IDAsIGxlbiA9IDA7CiAJY2hhciAqZXh0OworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpd19wb2ludCAqZHdycSA9IChzdHJ1Y3QgaXdfcG9pbnQgKilhd3JxOwogCiAJbGVuID0gZHdycS0+bGVuZ3RoOwpAQCAtOTY2LDYgKzk3Niw4NyBAQAogCQlrZnJlZShleHQpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CisKKwlpZiAoMCA9PSBzdHJjYXNlY21wKGV4dCwgIlJTU0kiKSkgeworCQkvKlJldHVybiByZWNlaXZlZCBzaWduYWwgc3RyZW5ndGggaW5kaWNhdG9yIGluIC1kYiBmb3IgKi8KKwkJLyogY3VycmVudCBBUCAqLworCQkvKjxzc2lkPiBSc3NpIHh4ICovCisJCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICYocGFkYXB0ZXItPm1sbWVwcml2KTsKKwkJc3RydWN0IHdsYW5fbmV0d29yayAqcGN1cl9uZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcms7CisJCS8qc3RhdGljIHU4IHh4eHg7ICovCisJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkgPT0gdHJ1ZSkgeworCQkJc3ByaW50ZihleHQsICIlcyByc3NpICVkIiwKKwkJCQlwY3VyX25ldHdvcmstPm5ldHdvcmsuU3NpZC5Tc2lkLAorCQkJCS8qKHh4eHg9eHh4eCsxMCkgKi8KKwkJCQkoKHBhZGFwdGVyLT5yZWN2cHJpdi5md19yc3NpKT4+MSktOTUKKwkJCQkvKnBjdXJfbmV0d29yay0+bmV0d29yay5Sc3NpICovCisJCQkJKTsKKwkJfSBlbHNlIHsKKwkJCXNwcmludGYoZXh0LCAiT0siKTsKKwkJfQorCX0gZWxzZSBpZiAoMCA9PSBzdHJjYXNlY21wKGV4dCwgIkxJTktTUEVFRCIpKSB7CisJCS8qUmV0dXJuIGxpbmsgc3BlZWQgaW4gTUJQUyAqLworCQkvKkxpbmtTcGVlZCB4eCAqLworCQl1bmlvbiBpd3JlcV9kYXRhIHdycWQ7CisJCWludCByZXRfaW5uZXI7CisJCWludCBtYnBzOworCisJCXJldF9pbm5lciA9IHI4NzExX3d4X2dldF9yYXRlKGRldiwgaW5mbywgJndycWQsIGV4dHJhKTsKKwkJaWYgKDAgIT0gcmV0X2lubmVyKQorCQkJbWJwcyA9IDA7CisJCWVsc2UKKwkJCW1icHMgPSB3cnFkLmJpdHJhdGUudmFsdWUgLyAxMDAwMDAwOworCQlzcHJpbnRmKGV4dCwgIkxJTktTUEVFRCAlZCIsIG1icHMpOworCX0gZWxzZSBpZiAoMCA9PSBzdHJjYXNlY21wKGV4dCwgIk1BQ0FERFIiKSkgeworCQkvKlJldHVybiBtYWMgYWRkcmVzcyBvZiB0aGUgc3RhdGlvbiAqLworCQkvKk1hY2FkZHIgPSB4eC54eC54eC54eC54eC54eCAqLworCQlzcHJpbnRmKGV4dCwKKwkJCSJNQUNBRERSID0gJTAyeC4lMDJ4LiUwMnguJTAyeC4lMDJ4LiUwMngiLAorCQkJKihkZXYtPmRldl9hZGRyKSwgKihkZXYtPmRldl9hZGRyKzEpLAorCQkJKihkZXYtPmRldl9hZGRyKzIpLCAqKGRldi0+ZGV2X2FkZHIrMyksCisJCQkqKGRldi0+ZGV2X2FkZHIrNCksICooZGV2LT5kZXZfYWRkcis1KSk7CisJfSBlbHNlIGlmICgwID09IHN0cmNhc2VjbXAoZXh0LCAiU0NBTi1BQ1RJVkUiKSkgeworCQkvKlNldCBzY2FuIHR5cGUgdG8gYWN0aXZlICovCisJCS8qT0sgaWYgc3VjY2Vzc2Z1bCAqLworCQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OworCQlwbWxtZXByaXYtPnBhc3NpdmVfbW9kZSA9IDE7CisJCXNwcmludGYoZXh0LCAiT0siKTsKKwl9IGVsc2UgaWYgKDAgPT0gc3RyY2FzZWNtcChleHQsICJTQ0FOLVBBU1NJVkUiKSkgeworCQkvKlNldCBzY2FuIHR5cGUgdG8gcGFzc2l2ZSAqLworCQkvKk9LIGlmIHN1Y2Nlc3NmdWwgKi8KKwkJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKKwkJcG1sbWVwcml2LT5wYXNzaXZlX21vZGUgPSAwOworCQlzcHJpbnRmKGV4dCwgIk9LIik7CisJfSBlbHNlIGlmICgwID09IHN0cm5jbXAoZXh0LCAiRENFLUUiLCA1KSkgeworCQkvKlNldCBzY2FuIHR5cGUgdG8gcGFzc2l2ZSAqLworCQkvKk9LIGlmIHN1Y2Nlc3NmdWwgKi8KKwkJcjg3MTJfZGlzY29ubmVjdEN0cmxFeF9jbWQocGFkYXB0ZXIKKwkJCSwgMSAvKnUzMiBlbmFibGVEcnZDdHJsICovCisJCQksIDUgLyp1MzIgdHJ5UGt0Q250ICovCisJCQksIDEwMCAvKnUzMiB0cnlQa3RJbnRlcnZhbCAqLworCQkJLCA1MDAwIC8qdTMyIGZpcnN0U3RhZ2VUTyAqLworCQkpOworCQlzcHJpbnRmKGV4dCwgIk9LIik7CisJfSBlbHNlIGlmICgwID09IHN0cm5jbXAoZXh0LCAiRENFLUQiLCA1KSkgeworCQkvKlNldCBzY2FuIHR5cGUgdG8gcGFzc2l2ZSAqLworCQkvKk9LIGlmIHN1Y2Nlc3NmdSAqLworCQlyODcxMl9kaXNjb25uZWN0Q3RybEV4X2NtZChwYWRhcHRlcgorCQkJLCAwIC8qdTMyIGVuYWJsZURydkN0cmwgKi8KKwkJCSwgNSAvKnUzMiB0cnlQa3RDbnQgKi8KKwkJCSwgMTAwIC8qdTMyIHRyeVBrdEludGVydmFsICovCisJCQksIDUwMDAgLyp1MzIgZmlyc3RTdGFnZVRPICovCisJCSk7CisJCXNwcmludGYoZXh0LCAiT0siKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPICJyODcxMnU6IHI4NzF4X3d4X3NldF9wcml2OiB1bmtub3duIENvbW1hbmQiCisJCSAgICAgICAiICVzLlxuIiwgZXh0KTsKKwkJZ290byBGUkVFX0VYVDsKKwl9CisJaWYgKGNvcHlfdG9fdXNlcihkd3JxLT5wb2ludGVyLCBleHQsCisJCQkJbWluKGR3cnEtPmxlbmd0aCwgKF9fdTE2KShzdHJsZW4oZXh0KSsxKSkpKQorCQlyZXQgPSAtRUZBVUxUOworCitGUkVFX0VYVDoKIAlrZnJlZShleHQpOwogCXJldHVybiByZXQ7CiB9CkBAIC05NzUsNiArMTA2NiwxMyBAQAogICogczIuIHNldF84MDJfMTFfYXV0aGVudGljYXRpb25fbW9kZSgpCiAgKiBzMy4gc2V0XzgwMl8xMV9lbmNyeXB0aW9uX21vZGUoKQogICogczQuIHNldF84MDJfMTFfYnNzaWQoKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaW50ZW5kcyB0byBoYW5kbGUgdGhlIFNldCBBUCBjb21tYW5kLCB3aGljaCBzcGVjaWZpZXMgdGhlCisgKiBNQUMjIG9mIGEgcHJlZmVycmVkIEFjY2VzcyBQb2ludC4KKyAqIEN1cnJlbnRseSwgdGhlIHJlcXVlc3QgY29tZXMgdmlhIFdpcmVsZXNzIEV4dGVuc2lvbnMnIFNJT0NTSVdBUCBpb2N0bC4KKyAqCisgKiBGb3IgdGhpcyBvcGVyYXRpb24gdG8gc3VjY2VlZCwgdGhlcmUgaXMgbm8gbmVlZCBmb3IgdGhlIGludGVyZmFjZSB0byBiZSBVcC4KKyAqCiAgKi8KIHN0YXRpYyBpbnQgcjg3MTFfd3hfc2V0X3dhcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCkBAIC05ODIsNyArMTA4MCw3IEBACiAJCQkgY2hhciAqZXh0cmEpCiB7CiAJaW50IHJldCA9IC1FSU5QUk9HUkVTUzsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBfbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0ICBfX3F1ZXVlICpxdWV1ZSA9ICZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWU7CiAJc3RydWN0IHNvY2thZGRyICp0ZW1wID0gKHN0cnVjdCBzb2NrYWRkciAqKWF3cnE7CkBAIC05OTIsMTAgKzEwOTAsOCBAQAogCXN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrID0gTlVMTDsKIAllbnVtIE5ESVNfODAyXzExX0FVVEhFTlRJQ0FUSU9OX01PREUJYXV0aG1vZGU7CiAKLQlpZiAocGFkYXB0ZXItPmJ1cCA9PSBmYWxzZSkKLQkJcmV0dXJuIC0xOwogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSkgPT0gdHJ1ZSkKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVCVVNZOwogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpID09IHRydWUpCiAJCXJldHVybiByZXQ7CiAJaWYgKHRlbXAtPnNhX2ZhbWlseSAhPSBBUlBIUkRfRVRIRVIpCkBAIC0xMDEyLDE2ICsxMTA4LDE1IEBACiAJCXBtbG1lcHJpdi0+cHNjYW5uZWQgPSBnZXRfbmV4dChwbWxtZXByaXYtPnBzY2FubmVkKTsKIAkJZHN0X2Jzc2lkID0gcG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzczsKIAkJaWYgKCFtZW1jbXAoZHN0X2Jzc2lkLCB0ZW1wLT5zYV9kYXRhLCBFVEhfQUxFTikpIHsKLQkJCWlmIChyODcxMl9zZXRfODAyXzExX2luZnJhc3RydWN0dXJlX21vZGUocGFkYXB0ZXIsCi0JCQkgICAgcG5ldHdvcmstPm5ldHdvcmsuSW5mcmFzdHJ1Y3R1cmVNb2RlKSA9PSBmYWxzZSkKLQkJCQlyZXQgPSAtMTsKKwkJCXI4NzEyX3NldF84MDJfMTFfaW5mcmFzdHJ1Y3R1cmVfbW9kZShwYWRhcHRlciwKKwkJCSAgICBwbmV0d29yay0+bmV0d29yay5JbmZyYXN0cnVjdHVyZU1vZGUpOwogCQkJYnJlYWs7CiAJCX0KIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPmxvY2ssIGlycUwpOwogCWlmICghcmV0KSB7CiAJCWlmICghcjg3MTJfc2V0XzgwMl8xMV9hdXRoZW50aWNhdGlvbl9tb2RlKHBhZGFwdGVyLCBhdXRobW9kZSkpCi0JCQlyZXQgPSAtMTsKKwkJCXJldCA9IC1FTk9NRU07CiAJCWVsc2UgewogCQkJaWYgKCFyODcxMl9zZXRfODAyXzExX2Jzc2lkKHBhZGFwdGVyLCB0ZW1wLT5zYV9kYXRhKSkKIAkJCQlyZXQgPSAtMTsKQEAgLTEwMzQsNyArMTEyOSw3IEBACiAJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKV9uZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCBuZGlzX3dsYW5fYnNzaWRfZXggKnBjdXJfYnNzID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yazsKIApAQCAtMTA1Myw3ICsxMTQ4LDcgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAl1MTYgcmVhc29uOwotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopX25ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpd19tbG1lICptbG1lID0gKHN0cnVjdCBpd19tbG1lICopIGV4dHJhOwogCiAJaWYgKG1sbWUgPT0gTlVMTCkKQEAgLTEwNzQsMTEgKzExNjksMTkgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKioKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGludGVuZHMgdG8gaGFuZGxlIHRoZSBTZXQgU2NhbiBjb21tYW5kLgorICogQ3VycmVudGx5LCB0aGUgcmVxdWVzdCBjb21lcyB2aWEgV2lyZWxlc3MgRXh0ZW5zaW9ucycgU0lPQ1NJV1NDQU4gaW9jdGwuCisgKgorICogRm9yIHRoaXMgb3BlcmF0aW9uIHRvIHN1Y2NlZWQsIHRoZSBpbnRlcmZhY2UgaXMgYnJvdWdodCBVcCBiZWZvcmVoYW5kLgorICoKKyAqLwogc3RhdGljIGludCByODcxMV93eF9zZXRfc2NhbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKIAkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopX25ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJdTggc3RhdHVzID0gdHJ1ZTsKIApAQCAtMTA4OCw3ICsxMTkxLDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAlpZiAocGFkYXB0ZXItPmJ1cCA9PSBmYWxzZSkKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVORVRET1dOOwogCWlmIChwYWRhcHRlci0+aHdfaW5pdF9jb21wbGV0ZWQgPT0gZmFsc2UpCiAJCXJldHVybiAtMTsKIAlpZiAoKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZfF9GV19VTkRFUl9MSU5LSU5HKSkgfHwKQEAgLTExMjYsNyArMTIyOSw3IEBACiAJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKIAkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKV9uZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCAgX19xdWV1ZSAqcXVldWUgPSAmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlOwogCXN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrID0gTlVMTDsKQEAgLTExNDEsNyArMTI0NCw3IEBACiAJd2hpbGUgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZfF9GV19VTkRFUl9MSU5LSU5HKSkgewogCQltc2xlZXAoMzApOwogCQljbnQrKzsKLQkJaWYgKGNudCA+IDEwMDApCisJCWlmIChjbnQgPiAxMDApCiAJCQlicmVhazsKIAl9CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlLT5sb2NrLCBpcnFMKTsKQEAgLTExNjksMTIgKzEyNzIsMTggQEAKICAqIHMyLiBzZXRfODAyXzExX2F1dGhlbnRpY2Fpb25fbW9kZSgpCiAgKiBzMy4gc2V0XzgwMl8xMV9lbmNyeXB0aW9uX21vZGUoKQogICogczQuIHNldF84MDJfMTFfc3NpZCgpCisgKgorICogVGhpcyBmdW5jdGlvbiBpbnRlbmRzIHRvIGhhbmRsZSB0aGUgU2V0IEVTU0lEIGNvbW1hbmQuCisgKiBDdXJyZW50bHksIHRoZSByZXF1ZXN0IGNvbWVzIHZpYSB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9ucycgU0lPQ1NJV0VTU0lEIGlvY3RsLgorICoKKyAqIEZvciB0aGlzIG9wZXJhdGlvbiB0byBzdWNjZWVkLCB0aGVyZSBpcyBubyBuZWVkIGZvciB0aGUgaW50ZXJmYWNlIHRvIGJlIFVwLgorICoKICAqLwogc3RhdGljIGludCByODcxMV93eF9zZXRfZXNzaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAogCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopX25ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0ICBfX3F1ZXVlICpxdWV1ZSA9ICZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWU7CiAJc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmsgPSBOVUxMOwpAQCAtMTE4NCwxMCArMTI5Myw4IEBACiAJc3RydWN0IGxpc3RfaGVhZCAqcGhlYWQ7CiAJdTMyIGxlbjsKIAotCWlmIChwYWRhcHRlci0+YnVwID09IGZhbHNlKQotCQlyZXR1cm4gLTE7CiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSkKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVCVVNZOwogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpKQogCQlyZXR1cm4gMDsKIAlpZiAod3JxdS0+ZXNzaWQubGVuZ3RoID4gSVdfRVNTSURfTUFYX1NJWkUpCkBAIC0xMjEyLDEwICsxMzE5LDIwIEBACiAJCQlpZiAoKCFtZW1jbXAoZHN0X3NzaWQsIHNyY19zc2lkLCBuZGlzX3NzaWQuU3NpZExlbmd0aCkpCiAJCQkgICAgJiYgKHBuZXR3b3JrLT5uZXR3b3JrLlNzaWQuU3NpZExlbmd0aCA9PQogCQkJICAgICBuZGlzX3NzaWQuU3NpZExlbmd0aCkpIHsKLQkJCQlpZiAoIXI4NzEyX3NldF84MDJfMTFfaW5mcmFzdHJ1Y3R1cmVfbW9kZSgKKwkJCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsCisJCQkJCQkJV0lGSV9BREhPQ19TVEFURSkpIHsKKwkJCQkJaWYgKHBuZXR3b3JrLT5uZXR3b3JrLgorCQkJCQkJSW5mcmFzdHJ1Y3R1cmVNb2RlCisJCQkJCQkhPQorCQkJCQkJcGFkYXB0ZXItPm1sbWVwcml2LgorCQkJCQkJY3VyX25ldHdvcmsubmV0d29yay4KKwkJCQkJCUluZnJhc3RydWN0dXJlTW9kZSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCXI4NzEyX3NldF84MDJfMTFfaW5mcmFzdHJ1Y3R1cmVfbW9kZSgKIAkJCQkgICAgIHBhZGFwdGVyLAotCQkJCSAgICAgcG5ldHdvcmstPm5ldHdvcmsuSW5mcmFzdHJ1Y3R1cmVNb2RlKSkKLQkJCQkJcmV0dXJuIC0xOworCQkJCSAgICAgcG5ldHdvcmstPm5ldHdvcmsuSW5mcmFzdHJ1Y3R1cmVNb2RlKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtMTIyOSw3ICsxMzQ2LDcgQEAKIAkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAogCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopX25ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0IG5kaXNfd2xhbl9ic3NpZF9leCAqcGN1cl9ic3MgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrOwogCXUzMiBsZW4sIHJldCA9IDA7CkBAIC0xMjM5LDggKzEzNTYsOSBAQAogCQl3cnF1LT5lc3NpZC5sZW5ndGggPSBsZW47CiAJCW1lbWNweShleHRyYSwgcGN1cl9ic3MtPlNzaWQuU3NpZCwgbGVuKTsKIAkJd3JxdS0+ZXNzaWQuZmxhZ3MgPSAxOwotCX0gZWxzZQotCQlyZXQgPSAtMTsKKwl9IGVsc2UgeworCQlyZXQgPSAtRU5PTElOSzsKKwl9CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTI0OCw3ICsxMzY2LDcgQEAKIAkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAogCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopX25ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOwogCXUzMiB0YXJnZXRfcmF0ZSA9IHdycXUtPmJpdHJhdGUudmFsdWU7CiAJdTMyIGZpeGVkID0gd3JxdS0+Yml0cmF0ZS5maXhlZDsKIAl1MzIgcmF0ZXZhbHVlID0gMDsKQEAgLTEzMTIsNyArMTQzMCw3IEBACiAJCQlkYXRhcmF0ZXNbaV0gPSAweGZmOwogCX0KIAlpZiAocjg3MTJfc2V0ZGF0YXJhdGVfY21kKHBhZGFwdGVyLCBkYXRhcmF0ZXMpICE9IF9TVUNDRVNTKQotCQlyZXQgPSAtMTsKKwkJcmV0ID0gLUVOT01FTTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMzIwLDEwICsxNDM4LDExIEBACiAJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopX25ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0IG5kaXNfd2xhbl9ic3NpZF9leCAqcGN1cl9ic3MgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrOwogCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpwaHRfY2FwaWU7CisJdW5zaWduZWQgY2hhciByZl90eXBlID0gcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5yZl9jb25maWc7CiAJaW50IGk7CiAJdTggKnA7CiAJdTE2IHJhdGUsIG1heF9yYXRlID0gMCwgaHRfY2FwID0gZmFsc2U7CkBAIC0xMzU2LDcgKzE0NzUsOSBAQAogCQkJaSsrOwogCQl9CiAJCWlmIChodF9jYXAgPT0gdHJ1ZSkgewotCQkJaWYgKG1jc19yYXRlICYgMHg4MDAwKSAvKiBNQ1MxNSAqLworCQkJaWYgKG1jc19yYXRlICYgMHg4MDAwIC8qIE1DUzE1ICovCisJCQkJJiYKKwkJCQlSVEw4NzEyX1JGXzJUMlIgPT0gcmZfdHlwZSkKIAkJCQltYXhfcmF0ZSA9IChid180ME1IeikgPyAoKHNob3J0X0dJKSA/IDMwMCA6CiAJCQkJCSAgICAyNzApIDogKChzaG9ydF9HSSkgPyAxNDQgOiAxMzApOwogCQkJZWxzZSBpZiAobWNzX3JhdGUgJiAweDAwODApIC8qIE1DUzcgKi8KQEAgLTEzNzEsNyArMTQ5Miw3IEBACiAJCQl3cnF1LT5iaXRyYXRlLnZhbHVlID0gbWF4X3JhdGUgKiA1MDAwMDA7CiAJCX0KIAl9IGVsc2UKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVOT0xJTks7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzNzksNyArMTUwMCw3IEBACiAJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKV9uZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXdycXUtPnJ0cy52YWx1ZSA9IHBhZGFwdGVyLT5yZWdpc3RyeXByaXYucnRzX3RocmVzaDsKIAl3cnF1LT5ydHMuZml4ZWQgPSAwOwkvKiBubyBhdXRvIHNlbGVjdCAqLwpAQCAtMTM5MCw3ICsxNTExLDcgQEAKIAkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopX25ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOwogCiAJaWYgKHdycXUtPmZyYWcuZGlzYWJsZWQpCiAJCXBhZGFwdGVyLT54bWl0cHJpdi5mcmFnX2xlbiA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKQEAgLTE0MDcsNyArMTUyOCw3IEBACiAJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBfbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBuZXRkZXZfcHJpdihkZXYpOwogCiAJd3JxdS0+ZnJhZy52YWx1ZSA9IHBhZGFwdGVyLT54bWl0cHJpdi5mcmFnX2xlbjsKIAl3cnF1LT5mcmFnLmZpeGVkID0gMDsJLyogbm8gYXV0byBzZWxlY3QgKi8KQEAgLTE0MzMsNyArMTU1NCw3IEBACiAJc3RydWN0IE5ESVNfODAyXzExX1dFUAkgd2VwOwogCWVudW0gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSBhdXRobW9kZTsKIAlzdHJ1Y3QgaXdfcG9pbnQgKmVycSA9ICYod3JxdS0+ZW5jb2RpbmcpOwotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIF9uZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIG5ldGRldl9wcml2KGRldik7CiAKIAlrZXkgPSBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOwogCW1lbXNldCgmd2VwLCAwLCBzaXplb2Yoc3RydWN0IE5ESVNfODAyXzExX1dFUCkpOwpAQCAtMTUyNyw3ICsxNjQ4LDcgQEAKIAkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXlidWYpCiB7CiAJdWludCBrZXksIHJldCA9IDA7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKikgX25ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKikgbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXdfcG9pbnQgKmVycSA9ICYod3JxdS0+ZW5jb2RpbmcpOwogCXN0cnVjdAltbG1lX3ByaXYJKnBtbG1lcHJpdiA9ICYocGFkYXB0ZXItPm1sbWVwcml2KTsKIApAQCAtMTU5OSw3ICsxNzIwLDcgQEAKIAkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopX25ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOwogCiAJcmV0dXJuIHI4NzF4X3NldF93cGFfaWUocGFkYXB0ZXIsIGV4dHJhLCB3cnF1LT5kYXRhLmxlbmd0aCk7CiB9CkBAIC0xNjA4LDcgKzE3MjksNyBAQAogCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKilfbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKW5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGl3X3BhcmFtICpwYXJhbSA9IChzdHJ1Y3QgaXdfcGFyYW0gKikmKHdycXUtPnBhcmFtKTsKIAlpbnQgcGFyYW1pZDsKIAlpbnQgcGFyYW12YWw7CkBAIC0xNzAxLDcgKzE4MjIsNyBAQAogCXBhcmFtX2xlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZV9wYXJhbSkgKyBwZXh0LT5rZXlfbGVuOwogCXBhcmFtID0gKHN0cnVjdCBpZWVlX3BhcmFtICopX21hbGxvYyhwYXJhbV9sZW4pOwogCWlmIChwYXJhbSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRU5PTUVNOwogCW1lbXNldChwYXJhbSwgMCwgcGFyYW1fbGVuKTsKIAlwYXJhbS0+Y21kID0gSUVFRV9DTURfU0VUX0VOQ1JZUFRJT047CiAJbWVtc2V0KHBhcmFtLT5zdGFfYWRkciwgMHhmZiwgRVRIX0FMRU4pOwpAQCAtMTcxOSw3ICsxODQwLDcgQEAKIAkJYWxnX25hbWUgPSAiQ0NNUCI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXN0cm5jcHkoKGNoYXIgKilwYXJhbS0+dS5jcnlwdC5hbGcsIGFsZ19uYW1lLCBJRUVFX0NSWVBUX0FMR19OQU1FX0xFTik7CiAJaWYgKHBleHQtPmV4dF9mbGFncyAmIElXX0VOQ09ERV9FWFRfR1JPVVBfS0VZKQpAQCAtMTc1NCw3ICsxODc1LDcgQEAKIAkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleWJ1ZikKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBfbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBuZXRkZXZfcHJpdihkZXYpOwogCXUzMiBhZGRyOwogCXUzMiBkYXRhMzI7CiAKQEAgLTE3NzEsNyArMTg5Miw3IEBACiAJCQkJIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkJIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmtleWJ1ZikKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBfbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBuZXRkZXZfcHJpdihkZXYpOwogCXUzMiBhZGRyOwogCXUzMiBkYXRhMzI7CiAKQEAgLTE3ODUsNyArMTkwNiw3IEBACiAJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCiAJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCiB7Ci0JcmV0dXJuIC0xOworCXJldHVybiAtRU5PU1lTOwogfQogCiBzdGF0aWMgaW50IHI4NzExX2RydmV4dF9oZGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTE3OTksNyArMTkyMCw3IEBACiAJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKV9uZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXdfcG9pbnQgKnAgPSAmd3JxdS0+ZGF0YTsKIAlzdHJ1Y3Qgb2lkX3Bhcl9wcml2IG9pZF9wYXI7CiAJc3RydWN0IG1wX2lvY3RsX2hhbmRsZXIgKnBoYW5kbGVyOwpAQCAtMTg4Miw3ICsyMDAzLDcgQEAKIAkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopX25ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0ICBfX3F1ZXVlICpxdWV1ZSA9ICZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWU7CiAJc3RydWN0IGl3X3BvaW50ICpwZGF0YSA9ICZ3cnF1LT5kYXRhOwpAQCAtMTk1Myw3ICsyMDc0LDcgQEAKIAkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIF9uZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGl3X3BvaW50ICpwZGF0YSA9ICZ3cnF1LT5kYXRhOwogCiAJaWYgKChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQpIHx8IChwZGF0YSA9PSBOVUxMKSkKQEAgLTE5NjMsMTEgKzIwODQsMzIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCByODcxeF9zZXRfY2hwbGFuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKKwkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpd19wb2ludCAqcGRhdGEgPSAmd3JxdS0+ZGF0YTsKKwlpbnQgY2hfcGxhbiA9IC0xOworCisJaWYgKChwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQpIHx8IChwZGF0YSA9PSBOVUxMKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCWNoX3BsYW4gPSAoaW50KSpleHRyYTsKKwlyODcxMl9zZXRfY2hwbGFuX2NtZChwYWRhcHRlciwgY2hfcGxhbik7CisKK2V4aXQ6CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IHI4NzF4X3dwc19zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCSAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopX25ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpd19wb2ludCAqcGRhdGEgPSAmd3JxdS0+ZGF0YTsKIAl1MzIgICB1MzJ3cHNfc3RhcnQgPSAwOwogCkBAIC0xOTkxLDcgKzIxMzMsNyBAQAogCiBzdGF0aWMgaW50IHdwYV9zZXRfcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggbmFtZSwgdTMyIHZhbHVlKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIF9uZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIG5ldGRldl9wcml2KGRldik7CiAKIAlzd2l0Y2ggKG5hbWUpIHsKIAljYXNlIElFRUVfUEFSQU1fV1BBX0VOQUJMRUQ6CkBAIC0yMDQ0LDcgKzIxODYsNyBAQAogCiBzdGF0aWMgaW50IHdwYV9tbG1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBjb21tYW5kLCB1MzIgcmVhc29uKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIF9uZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIG5ldGRldl9wcml2KGRldik7CiAKIAlzd2l0Y2ggKGNvbW1hbmQpIHsKIAljYXNlIElFRUVfTUxNRV9TVEFfREVBVVRIOgpAQCAtMjA2NSwxNiArMjIwNywxNyBAQAogewogCXN0cnVjdCBpZWVlX3BhcmFtICpwYXJhbTsKIAlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBfbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBuZXRkZXZfcHJpdihkZXYpOwogCiAJaWYgKHAtPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaWVlZV9wYXJhbSkgfHwgIXAtPnBvaW50ZXIpCiAJCXJldHVybiAtRUlOVkFMOwogCXBhcmFtID0gKHN0cnVjdCBpZWVlX3BhcmFtICopX21hbGxvYyhwLT5sZW5ndGgpOwogCWlmIChwYXJhbSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAoY29weV9mcm9tX3VzZXIocGFyYW0sIHAtPnBvaW50ZXIsIHAtPmxlbmd0aCkpCisJaWYgKGNvcHlfZnJvbV91c2VyKHBhcmFtLCBwLT5wb2ludGVyLCBwLT5sZW5ndGgpKSB7CiAJCWtmcmVlKCh1OCAqKXBhcmFtKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CisJfQogCXN3aXRjaCAocGFyYW0tPmNtZCkgewogCWNhc2UgSUVFRV9DTURfU0VUX1dQQV9QQVJBTToKIAkJcmV0ID0gd3BhX3NldF9wYXJhbShkZXYsIHBhcmFtLT51LndwYV9wYXJhbS5uYW1lLApAQCAtMjIwMSw2ICsyMzQ0LDEwIEBACiAJewogCQlTSU9DSVdGSVJTVFBSSVYgKyAweDYsCiAJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAid3BzX3N0YXJ0IgorCX0sCisJeworCQlTSU9DSVdGSVJTVFBSSVYgKyAweDcsCisJCUlXX1BSSVZfVFlQRV9JTlQgfCBJV19QUklWX1NJWkVfRklYRUQgfCAxLCAwLCAiY2hwbGFuIgogCX0KIH07CiAKQEAgLTIyMTEsMTIgKzIzNTgsMTMgQEAKIAlyODcxeF9tcF9pb2N0bF9oZGwsCiAJcjg3MXhfZ2V0X2FwX2luZm8sIC8qZm9yIE1NIERUViBwbGF0Zm9ybSovCiAJcjg3MXhfc2V0X3BpZCwKLQkgcjg3MXhfd3BzX3N0YXJ0LAorCXI4NzF4X3dwc19zdGFydCwKKwlyODcxeF9zZXRfY2hwbGFuCiB9OwogCiBzdGF0aWMgc3RydWN0IGl3X3N0YXRpc3RpY3MgKnI4NzF4X2dldF93aXJlbGVzc19zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIF9uZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGl3X3N0YXRpc3RpY3MgKnBpd3N0YXRzID0gJnBhZGFwdGVyLT5pd3N0YXRzOwogCWludCB0bXBfbGV2ZWwgPSAwOwogCWludCB0bXBfcXVhbCA9IDA7CkBAIC0yMjMyLDcgKzIzODAsMTMgQEAKIAkJdG1wX3F1YWwgPSBwYWRhcHRlci0+cmVjdnByaXYuc2lnbmFsOwogCQl0bXBfbm9pc2UgPSBwYWRhcHRlci0+cmVjdnByaXYubm9pc2U7CiAJCXBpd3N0YXRzLT5xdWFsLmxldmVsID0gdG1wX2xldmVsOwotCQlwaXdzdGF0cy0+cXVhbC5xdWFsID0gdG1wX3F1YWw7CisJCS8qcGl3c3RhdHMtPnF1YWwucXVhbCA9IHRtcF9xdWFsOworCQkgKiBUaGUgTmV0d29ya01hbmFnZXIgb2YgRmVkb3JhIDEwLCAxMyB3aWxsIHVzZSB0aGUgbGluaworCQkgKiBxdWFsaXR5IGZvciBpdHMgZGlzcGxheS4KKwkJICogU28sIHVzZSB0aGUgZndfcnNzaSBvbiBsaW5rIHF1YWxpdHkgdmFyaWFibGUgYmVjYXVzZQorCQkgKiBmd19yc3NpIHdpbGwgYmUgdXBkYXRlZCBwZXIgMiBzZWNvbmRzLgorCQkgKi8KKwkJcGl3c3RhdHMtPnF1YWwucXVhbCA9IHRtcF9sZXZlbDsKIAkJcGl3c3RhdHMtPnF1YWwubm9pc2UgPSB0bXBfbm9pc2U7CiAJfQogCXBpd3N0YXRzLT5xdWFsLnVwZGF0ZWQgPSBJV19RVUFMX0FMTF9VUERBVEVEOwpAQCAtMjI0Nyw1ICsyNDAxLDUgQEAKIAkubnVtX3ByaXZhdGUgPSBzaXplb2Yocjg3MTFfcHJpdmF0ZV9oYW5kbGVyKSAvIHNpemVvZihpd19oYW5kbGVyKSwKIAkubnVtX3ByaXZhdGVfYXJncyA9IHNpemVvZihyODcxMV9wcml2YXRlX2FyZ3MpIC8KIAkJCSAgICBzaXplb2Yoc3RydWN0IGl3X3ByaXZfYXJncyksCi0JLmdldF93aXJlbGVzc19zdGF0cyA9IHI4NzF4X2dldF93aXJlbGVzc19zdGF0cywKKwkuZ2V0X3dpcmVsZXNzX3N0YXRzID0gcjg3MXhfZ2V0X3dpcmVsZXNzX3N0YXRzCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bF9ydGwuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGxfcnRsLmgKaW5kZXggNGYxYWE4Ny4uM2JjY2VhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bF9ydGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsX3J0bC5oCkBAIC0xLDMgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBMaW51eCBzdGFnaW5nIHRyZWUgYXJlCisgKiBDb3B5cmlnaHQoYykgMjAxMCBMYXJyeSBGaW5nZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjoKKyAqIFdMQU4gRkFFIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9SVEw4NzFYX0lPQ1RMX1JUTF9ICiAjZGVmaW5lIF9SVEw4NzFYX0lPQ1RMX1JUTF9ICiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGxfc2V0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsX3NldC5jCmluZGV4IDg0ODZlYjEuLmZiMjliNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGxfc2V0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bF9zZXQuYwpAQCAtMjQzLDcgKzI0Myw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG1sbWVwcml2LT5sb2NrLCBpcnFMKTsKIH0KIAotdTggcjg3MTJfc2V0XzgwMl8xMV9pbmZyYXN0cnVjdHVyZV9tb2RlKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsCit2b2lkIHI4NzEyX3NldF84MDJfMTFfaW5mcmFzdHJ1Y3R1cmVfbW9kZShzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyLAogCWVudW0gTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSBuZXR3b3JrdHlwZSkKIHsKIAl1bnNpZ25lZCBsb25nIGlycUw7CkBAIC0yOTAsNyArMjkwLDYgQEAKIAkJfQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbWxtZXByaXYtPmxvY2ssIGlycUwpOwogCX0KLQlyZXR1cm4gdHJ1ZTsKIH0KIAogdTggcjg3MTJfc2V0XzgwMl8xMV9kaXNhc3NvY2lhdGUoc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGxfc2V0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsX3NldC5oCmluZGV4IDhkZmYyYjEuLjJjOTRjZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGxfc2V0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bF9zZXQuaApAQCAtMSwzICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBNb2RpZmljYXRpb25zIGZvciBpbmNsdXNpb24gaW50byB0aGUgTGludXggc3RhZ2luZyB0cmVlIGFyZQorICogQ29weXJpZ2h0KGMpIDIwMTAgTGFycnkgRmluZ2VyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246CisgKiBXTEFOIEZBRSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmbmRlZiBfX0lPQ1RMX1NFVF9ICiAjZGVmaW5lIF9fSU9DVExfU0VUX0gKIApAQCAtMjIsNyArNDcsNyBAQAogCiB1OCByODcxMl9zZXRfODAyXzExX2Jzc2lkX2xpc3Rfc2NhbihzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyKTsKIAotdTggcjg3MTJfc2V0XzgwMl8xMV9pbmZyYXN0cnVjdHVyZV9tb2RlKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsCit2b2lkIHI4NzEyX3NldF84MDJfMTFfaW5mcmFzdHJ1Y3R1cmVfbW9kZShzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyLAogCQkJZW51bSBORElTXzgwMl8xMV9ORVRXT1JLX0lORlJBU1RSVUNUVVJFIG5ldHdvcmt0eXBlKTsKIAogdm9pZCByODcxMl9zZXRfODAyXzExX3NzaWQoc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbGVkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2xlZC5oCmluZGV4IDgwODVlNWUuLjFhOTBjN2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbGVkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9sZWQuaApAQCAtMSwzICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBNb2RpZmljYXRpb25zIGZvciBpbmNsdXNpb24gaW50byB0aGUgTGludXggc3RhZ2luZyB0cmVlIGFyZQorICogQ29weXJpZ2h0KGMpIDIwMTAgTGFycnkgRmluZ2VyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246CisgKiBXTEFOIEZBRSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmbmRlZiBfX1JUTDg3MTJfTEVEX0gKICNkZWZpbmUgX19SVEw4NzEyX0xFRF9ICiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbWxtZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tbG1lLmMKaW5kZXggODY2NTU0ZC4uZWY4ZWI2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tbG1lLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tbG1lLmMKQEAgLTUyLDYgKzUyLDggQEAKIAlwbWxtZXByaXYtPmZ3X3N0YXRlID0gMDsKIAlwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcmsuSW5mcmFzdHJ1Y3R1cmVNb2RlID0KIAkJCQkgTmRpczgwMl8xMUF1dG9Vbmtub3duOworCS8qIE1heWJlIHNvbWVkYXkgd2Ugc2hvdWxkIHJlbmFtZSB0aGlzIHZhcmlhYmxlIHRvICJhY3RpdmVfbW9kZSIoSmVmZikqLworCXBtbG1lcHJpdi0+cGFzc2l2ZV9tb2RlID0gMTsgLyogMTogYWN0aXZlLCAwOiBwYXNzaXZlLiAqLwogCXNwaW5fbG9ja19pbml0KCYocG1sbWVwcml2LT5sb2NrKSk7CiAJc3Bpbl9sb2NrX2luaXQoJihwbWxtZXByaXYtPmxvY2syKSk7CiAJX2luaXRfcXVldWUoJihwbWxtZXByaXYtPmZyZWVfYnNzX3Bvb2wpKTsKQEAgLTQ4NSw2ICs0ODcsMTIgQEAKIAlpZiAoKHBzZWN1cml0eXByaXYtPlByaXZhY3lBbGdydGhtICE9IF9OT19QUklWQUNZXykgJiYKIAkJICAgIChwbmV0d29yay0+bmV0d29yay5Qcml2YWN5ID09IDApKQogCQlic2VsZWN0ZWQgPSBmYWxzZTsKKwlpZiAoY2hlY2tfZndzdGF0ZSgmYWRhcHRlci0+bWxtZXByaXYsIFdJRklfQURIT0NfU1RBVEUpID09IHRydWUpIHsKKwkJaWYgKHBuZXR3b3JrLT5uZXR3b3JrLkluZnJhc3RydWN0dXJlTW9kZSAhPQorCQkJYWRhcHRlci0+bWxtZXByaXYuY3VyX25ldHdvcmsubmV0d29yay4KKwkJCUluZnJhc3RydWN0dXJlTW9kZSkKKwkJCWJzZWxlY3RlZCA9IGZhbHNlOworCX0KIAlyZXR1cm4gYnNlbGVjdGVkOwogfQogCkBAIC02ODMsOSArNjkxLDExIEBACiB7CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAotCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBfRldfTElOS0VEKTsKLQlwYWRhcHRlci0+bGVkcHJpdi5MZWRDb250cm9sSGFuZGxlcihwYWRhcHRlciwgTEVEX0NUTF9OT19MSU5LKTsKLQlyODcxMl9vc19pbmRpY2F0ZV9kaXNjb25uZWN0KHBhZGFwdGVyKTsKKwlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUQpID09IHRydWUpIHsKKwkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19MSU5LRUQpOworCQlwYWRhcHRlci0+bGVkcHJpdi5MZWRDb250cm9sSGFuZGxlcihwYWRhcHRlciwgTEVEX0NUTF9OT19MSU5LKTsKKwkJcjg3MTJfb3NfaW5kaWNhdGVfZGlzY29ubmVjdChwYWRhcHRlcik7CisJfQogCWlmIChwYWRhcHRlci0+cHdyY3RybHByaXYucHdyX21vZGUgIT0KIAkgICAgcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5wb3dlcl9tZ250KSB7CiAJCV9jYW5jZWxfdGltZXJfZXgoJnBtbG1lcHJpdi0+ZGhjcF90aW1lcik7CkBAIC03MTgsOSArNzI4LDkgQEAKIAogCWlmIChzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkgPT0gNCAqIHNpemVvZih1MzIpKSB7CiAJCXBuZXR3b3JrID0gKHN0cnVjdCB3bGFuX25ldHdvcmsgKikKLQkJCSAgIF9tYWxsb2Moc2l6ZW9mKHN0cnVjdCB3bGFuX25ldHdvcmspKTsKKwkJCV9tYWxsb2Moc2l6ZW9mKHN0cnVjdCB3bGFuX25ldHdvcmspKTsKIAkJbWVtY3B5KCh1OCAqKXBuZXR3b3JrKzE2LCAodTggKilwYnVmICsgOCwKLQkJCSBzaXplb2Yoc3RydWN0IHdsYW5fbmV0d29yaykgLSAxNik7CisJCQlzaXplb2Yoc3RydWN0IHdsYW5fbmV0d29yaykgLSAxNik7CiAJfSBlbHNlCiAJCXBuZXR3b3JrID0gKHN0cnVjdCB3bGFuX25ldHdvcmsgKilwYnVmOwogCkBAIC0xMjcxLDEyICsxMjgxLDE2IEBACiAJCQlwc2VjdXJpdHlwcml2LT5EZWZLZXlba2V5aWRdLnNrZXksIGtleWxlbik7CiAJCWJyZWFrOwogCWNhc2UgX1RLSVBfOgorCQlpZiAoa2V5aWQgPCAxIHx8IGtleWlkID4gMikKKwkJCXJldHVybiBfRkFJTDsKIAkJa2V5bGVuID0gMTY7CiAJCW1lbWNweShwc2V0a2V5cGFybS0+a2V5LAogCQkJJnBzZWN1cml0eXByaXYtPlhHcnBLZXlba2V5aWQgLSAxXSwga2V5bGVuKTsKIAkJcHNldGtleXBhcm0tPmdycGtleSA9IDE7CiAJCWJyZWFrOwogCWNhc2UgX0FFU186CisJCWlmIChrZXlpZCA8IDEgfHwga2V5aWQgPiAyKQorCQkJcmV0dXJuIF9GQUlMOwogCQlrZXlsZW4gPSAxNjsKIAkJbWVtY3B5KHBzZXRrZXlwYXJtLT5rZXksCiAJCQkmcHNlY3VyaXR5cHJpdi0+WEdycEtleVtrZXlpZCAtIDFdLCBrZXlsZW4pOwpAQCAtMTY1Nyw3ICsxNjcxLDcgQEAKIAkvKiAxLiBTdXBwb3J0ZWQgcmF0ZXMKIAkgKiAyLiBJRQogCSAqLwotCXN6ID0gcjg3MTJfZ2VuZXJhdGVfaWUocHJlZ2lzdHJ5cHJpdiwgYWRhcHRlcik7CisJc3ogPSByODcxMl9nZW5lcmF0ZV9pZShwcmVnaXN0cnlwcml2KTsKIAlwZGV2X25ldHdvcmstPklFTGVuZ3RoID0gc3o7CiAJcGRldl9uZXR3b3JrLT5MZW5ndGggPSByODcxMl9nZXRfbmRpc193bGFuX2Jzc2lkX2V4X3N6KAogCQkJICAgICAgKHN0cnVjdCBuZGlzX3dsYW5fYnNzaWRfZXggKilwZGV2X25ldHdvcmspOwpAQCAtMTgwMiwzOSArMTgxNiwzIEBACiAJCX0KIAl9CiB9Ci0KLS8qdGhlIGZ1bmN0aW9uIGlzID49IHBhc3NpdmVfbGV2ZWwqLwotdW5zaWduZWQgaW50IHI4NzEyX2FkZF9odF9hZGR0X2luZm8oc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciwKLQkJCSAgICAgIHU4ICppbl9pZSwgdTggKm91dF9pZSwKLQkJCSAgICAgIHVpbnQgaW5fbGVuLCB1aW50ICpwb3V0X2xlbikKLXsKLQl1MzIgaWVsZW4sIG91dF9sZW4gPSAgMDsKLQl1bnNpZ25lZCBjaGFyICpwLCAqcGZyYW1lOwotCXN0cnVjdCBpZWVlODAyMTFfaHRfYWRkdF9pbmZvIGh0X2FkZHRfaW5mbzsKLQlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwotCXN0cnVjdCBodF9wcml2ICpwaHRwcml2ID0gJnBtbG1lcHJpdi0+aHRwcml2OwotCXN0cnVjdCByZWdpc3RyeV9wcml2ICpwcmVnaXN0cnlwcml2ID0gJnBhZGFwdGVyLT5yZWdpc3RyeXByaXY7Ci0Jb3V0X2xlbiA9ICpwb3V0X2xlbjsKLQotCWlmIChwcmVnaXN0cnlwcml2LT5odF9lbmFibGUgPT0gMSkgewotCQlwID0gcjg3MTJfZ2V0X2llKGluX2llKzEyLCBfSFRfQUREX0lORk9fSUVfLAotCQkJCSAmaWVsZW4sIGluX2xlbiAtIDEyKTsKLQkJaWYgKHAgJiYgKGllbGVuID4gMCkpIHsKLQkJCTsgLyogZHVtbXkgYnJhbmNoICovCi0JCX0gZWxzZSB7Ci0JCQlpZiAocCA9PSBOVUxMKSB7Ci0JCQkJaW50IHN6ID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfYWRkdF9pbmZvKTsKLQkJCQltZW1zZXQoJmh0X2FkZHRfaW5mbywgMCwgc3opOwotCQkJCS8qbmVlZCB0byBhZGQgdGhlIEhUIGFkZGl0aW9uYWwgSUVzKi8KLQkJCQlodF9hZGR0X2luZm8uY29udHJvbF9jaGFuID0KLQkJCQkJCXByZWdpc3RyeXByaXYtPmNoYW5uZWw7Ci0JCQkJcGZyYW1lID0gcjg3MTJfc2V0X2llKG91dF9pZSArIG91dF9sZW4sCi0JCQkJCQlfSFRfQUREX0lORk9fSUVfLAotCQkJCQkJc3osCi0JCQkJCQkodW5zaWduZWQgY2hhciAqKSZodF9hZGR0X2luZm8sCi0JCQkJCQlwb3V0X2xlbik7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIHBodHByaXYtPmh0X29wdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbWxtZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tbG1lLmgKaW5kZXggMjc5NDgwNC4uNzFjYTAxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tbG1lLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tbG1lLmgKQEAgLTEsMyArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGludG8gdGhlIExpbnV4IHN0YWdpbmcgdHJlZSBhcmUKKyAqIENvcHlyaWdodChjKSAyMDEwIExhcnJ5IEZpbmdlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOgorICogV0xBTiBGQUUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX19SVEw4NzFYX01MTUVfSF8KICNkZWZpbmUgX19SVEw4NzFYX01MTUVfSF8KIApAQCAtNzAsNiArOTUsNyBAQAogCXN0cnVjdCAgX19xdWV1ZSBzY2FubmVkX3F1ZXVlOwogCXU4ICpmcmVlX2Jzc19idWY7CiAJdW5zaWduZWQgbG9uZyBudW1fb2Zfc2Nhbm5lZDsKKwl1OCBwYXNzaXZlX21vZGU7IC8qYWRkIGZvciBBbmRyb2lkJ3MgU0NBTi1BQ1RJVkUvU0NBTi1QQVNTSVZFICovCiAJc3RydWN0IG5kaXNfODAyXzExX3NzaWQJYXNzb2Nfc3NpZDsKIAl1OCBhc3NvY19ic3NpZFs2XTsKIAlzdHJ1Y3Qgd2xhbl9uZXR3b3JrIGN1cl9uZXR3b3JrOwpAQCAtMjAxLDggKzIyNyw2IEBACiB1bnNpZ25lZCBpbnQgcjg3MTJfcmVzdHJ1Y3R1cmVfaHRfaWUoc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciwgdTggKmluX2llLAogCQkJCSAgICAgdTggKm91dF9pZSwgdWludCBpbl9sZW4sIHVpbnQgKnBvdXRfbGVuKTsKIHZvaWQgcjg3MTJfaXNzdWVfYWRkYmFyZXFfY21kKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsIGludCBwcmlvcml0eSk7Ci11bnNpZ25lZCBpbnQgcjg3MTJfYWRkX2h0X2FkZHRfaW5mbyhzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCAqaW5faWUsCi0JCQkJICAgIHU4ICpvdXRfaWUsIHVpbnQgaW5fbGVuLCB1aW50ICpwb3V0X2xlbik7CiBpbnQgcjg3MTJfaXNfc2FtZV9pYnNzKHN0cnVjdCBfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmspOwogCiAjZW5kaWYgLypfX1JUTDg3MVhfTUxNRV9IXyovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21wLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21wLmMKaW5kZXggNDFlMDBhMi4uNTYzOGQ1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbXAuYwpAQCAtMSwxOCArMSwyOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcnRsODcxeF9tcC5jCiAgKgotICogRGVzY3JpcHRpb24gOgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgotICogQXV0aG9yIDoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKgotICogSGlzdG9yeSA6CisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCiAgKgotICogQ29weXJpZ2h0IDIwMDcsIFJlYWx0ZWsgQ29ycC4KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCiAgKgotICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBpcyB0aGUgc29sZSBwcm9wZXJ0eSBvZiBSZWFsdGVrIENvcnAuIEl0IGNhbiBub3QgYmUKLSAqIGJlIHVzZWQsIGNvcGllZCBvciBtb2RpZmllZCB3aXRob3V0IHdyaXR0ZW4gcGVybWlzc2lvbiBmcm9tIFJlYWx0ZWsgQ29ycC4KKyAqIE1vZGlmaWNhdGlvbnMgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBMaW51eCBzdGFnaW5nIHRyZWUgYXJlCisgKiBDb3B5cmlnaHQoYykgMjAxMCBMYXJyeSBGaW5nZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqIENvbnRhY3QgaW5mb3JtYXRpb246CisgKiBXTEFOIEZBRSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2RlZmluZSBfUlRMODcxWF9NUF9DXwogCiAjaW5jbHVkZSAib3NkZXBfc2VydmljZS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcC5oCmluZGV4IDgwNWFiYTAuLjI1NWRjOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbXAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21wLmgKQEAgLTEsMyArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGludG8gdGhlIExpbnV4IHN0YWdpbmcgdHJlZSBhcmUKKyAqIENvcHlyaWdodChjKSAyMDEwIExhcnJ5IEZpbmdlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOgorICogV0xBTiBGQUUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX19SVEw4NzFYX01QX0hfCiAjZGVmaW5lIF9fUlRMODcxWF9NUF9IXwogCkBAIC0xMDEsNyArMTI2LDYgQEAKIAlzdHJ1Y3QgdXJiICpweG1pdF91cmJbOF07CiAJdTggYnBlbmRpbmdbOF07CiAJdTggbGFzdFs4XTsKLQl1aW50IG1lbVsoTUFYX01QX1hNSVRCVUZfU1ogPj4gMildOwogfTsKIAogc3RydWN0IG1wX3dpcGFyYW0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcF9pb2N0bC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcF9pb2N0bC5oCmluZGV4IDY3NzU5YzMuLjg1MDE0M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbXBfaW9jdGwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21wX2lvY3RsLmgKQEAgLTEsMyArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGludG8gdGhlIExpbnV4IHN0YWdpbmcgdHJlZSBhcmUKKyAqIENvcHlyaWdodChjKSAyMDEwIExhcnJ5IEZpbmdlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOgorICogV0xBTiBGQUUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX1JUTDg3MVhfTVBfSU9DVExfSAogI2RlZmluZSBfUlRMODcxWF9NUF9JT0NUTF9ICiAKQEAgLTMwNyw3ICszMzIsNiBAQAogCiBzdHJ1Y3QgbXBfeG1pdF9wYWNrZXQgewogCXVuc2lnbmVkIGludCBsZW47Ci0JdW5zaWduZWQgaW50IG1lbVtNQVhfTVBfWE1JVEJVRl9TWiA+PiAyXTsKIH07CiAKIHN0cnVjdCBwc21vZGVfcGFyYW0gewpAQCAtNDEwLDggKzQzNCw3IEBACiAJe3NpemVvZihzdHJ1Y3QgcHNtb2RlX3BhcmFtKSwgTlVMTCwgMH0sLyoxMyovCiAJe3NpemVvZihzdHJ1Y3QgZWVwcm9tX3J3X3BhcmFtKSwgTlVMTCwgMH0sLyoxNCovCiAJe3NpemVvZihzdHJ1Y3QgZWVwcm9tX3J3X3BhcmFtKSwgTlVMTCwgMH0sLyoxNSovCi0Je3NpemVvZih1OCksIG9pZF9ydF9wcm9fc2V0X3Bvd2VyX3RyYWNraW5nX2hkbCwKLQkJCSAgICAgT0lEX1JUX1BST19TRVRfUE9XRVJfVFJBQ0tJTkd9LC8qMTYqLworCXtzaXplb2YodW5zaWduZWQgY2hhciksIE5VTEwsIDB9LC8qMTYqLwogCXtzaXplb2YodTMyKSwgTlVMTCwgMH0sLyoxNyovCiAJe3NpemVvZih1MzIpLCBvaWRfcnRfcHJvX3NldF9jb250aW51b3VzX3R4X2hkbCwKIAkJCSAgICAgT0lEX1JUX1BST19TRVRfQ09OVElOVU9VU19UWH0sLyoxOCovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3B3cmN0cmwuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcHdyY3RybC5oCmluZGV4IDM0ZjA3NGEuLmI0MWNhMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcHdyY3RybC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcHdyY3RybC5oCkBAIC0xLDMgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBMaW51eCBzdGFnaW5nIHRyZWUgYXJlCisgKiBDb3B5cmlnaHQoYykgMjAxMCBMYXJyeSBGaW5nZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjoKKyAqIFdMQU4gRkFFIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9fUlRMODcxWF9QV1JDVFJMX0hfCiAjZGVmaW5lIF9fUlRMODcxWF9QV1JDVFJMX0hfCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcmVjdi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9yZWN2LmMKaW5kZXggYWVjODNkZC4uNzA2OWYwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9yZWN2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9yZWN2LmMKQEAgLTI4LDYgKzI4LDkgQEAKIAogI2RlZmluZSBfUlRMODcxWF9SRUNWX0NfCiAKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva21lbWxlYWsuaD4KKwogI2luY2x1ZGUgIm9zZGVwX3NlcnZpY2UuaCIKICNpbmNsdWRlICJkcnZfdHlwZXMuaCIKICNpbmNsdWRlICJyZWN2X29zZGVwLmgiCkBAIC03Myw2ICs3Niw3IEBACiAJCQkJCSAgIFJYRlJBTUVfQUxJR05fU1opOwogCWlmIChwcmVjdnByaXYtPnBhbGxvY2F0ZWRfZnJhbWVfYnVmID09IE5VTEwpCiAJCXJldHVybiBfRkFJTDsKKwlrbWVtbGVha19ub3RfbGVhayhwcmVjdnByaXYtPnBhbGxvY2F0ZWRfZnJhbWVfYnVmKTsKIAltZW1zZXQocHJlY3Zwcml2LT5wYWxsb2NhdGVkX2ZyYW1lX2J1ZiwgMCwgTlJfUkVDVkZSQU1FICoKIAkJc2l6ZW9mKHVuaW9uIHJlY3ZfZnJhbWUpICsgUlhGUkFNRV9BTElHTl9TWik7CiAJcHJlY3Zwcml2LT5wcmVjdl9mcmFtZV9idWYgPSBwcmVjdnByaXYtPnBhbGxvY2F0ZWRfZnJhbWVfYnVmICsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcmYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcmYuaAppbmRleCA2YzU0OTY2Li4xMzNlZDY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3JmLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9yZi5oCkBAIC0xLDMgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBMaW51eCBzdGFnaW5nIHRyZWUgYXJlCisgKiBDb3B5cmlnaHQoYykgMjAxMCBMYXJyeSBGaW5nZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjoKKyAqIFdMQU4gRkFFIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmCV9fUlRMODcxWF9SRl9IXwogI2RlZmluZSBfX1JUTDg3MVhfUkZfSF8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zZWN1cml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zZWN1cml0eS5jCmluZGV4IDY1MzIxYmUuLjdiOTI5MjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfc2VjdXJpdHkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3NlY3VyaXR5LmMKQEAgLTI4LDYgKzI4LDIxIEBACiAKICNkZWZpbmUgIF9SVEw4NzFYX1NFQ1VSSVRZX0NfCiAKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvY2lyY19idWYuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorCiAjaW5jbHVkZSAib3NkZXBfc2VydmljZS5oIgogI2luY2x1ZGUgImRydl90eXBlcy5oIgogI2luY2x1ZGUgIndpZmkuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfc2VjdXJpdHkuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfc2VjdXJpdHkuaAppbmRleCBiZmY3MWQyLi5hMTMzOTVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3NlY3VyaXR5LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zZWN1cml0eS5oCkBAIC0xLDMgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBMaW51eCBzdGFnaW5nIHRyZWUgYXJlCisgKiBDb3B5cmlnaHQoYykgMjAxMCBMYXJyeSBGaW5nZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjoKKyAqIFdMQU4gRkFFIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9fUlRMODcxWF9TRUNVUklUWV9IXwogI2RlZmluZSBfX1JUTDg3MVhfU0VDVVJJVFlfSF8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF93bGFuX3NtZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF93bGFuX3NtZS5oCmluZGV4IGQ5NzMzYWMuLjQ0OTI0ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfd2xhbl9zbWUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3dsYW5fc21lLmgKQEAgLTEsMyArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGludG8gdGhlIExpbnV4IHN0YWdpbmcgdHJlZSBhcmUKKyAqIENvcHlyaWdodChjKSAyMDEwIExhcnJ5IEZpbmdlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOgorICogV0xBTiBGQUUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX1JUTDg3MVhfV0xBTl9TTUVfSF8KICNkZWZpbmUgX1JUTDg3MVhfV0xBTl9TTUVfSF8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF94bWl0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3htaXQuYwppbmRleCBjY2YwODkxLi44YmJkZWU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3htaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3htaXQuYwpAQCAtMTUyLDExICsxNTIsMTIgQEAKIAkJcHhtaXRidWYrKzsKIAl9CiAJcHhtaXRwcml2LT5mcmVlX3htaXRidWZfY250ID0gTlJfWE1JVEJVRkY7CisJX2luaXRfd29ya2l0ZW0oJnBhZGFwdGVyLT53a0ZpbHRlclJ4RkYwLCByODcxMl9TZXRGaWx0ZXIsIHBhZGFwdGVyKTsKIAlhbGxvY19od3htaXRzKHBhZGFwdGVyKTsKIAlpbml0X2h3eG1pdHMocHhtaXRwcml2LT5od3htaXRzLCBweG1pdHByaXYtPmh3eG1pdF9lbnRyeSk7CiAJdGFza2xldF9pbml0KCZweG1pdHByaXYtPnhtaXRfdGFza2xldCwKLQkgICAgICh2b2lkKCopKGFkZHJfdCkpcjg3MTJfeG1pdF9iaCwKLQkgICAgIChhZGRyX3QpcGFkYXB0ZXIpOworCQkodm9pZCgqKSh1bnNpZ25lZCBsb25nKSlyODcxMl94bWl0X2JoLAorCQkodW5zaWduZWQgbG9uZylwYWRhcHRlcik7CiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCkBAIC02MTIsNyArNjEzLDcgQEAKIAlpZiAobWFrZV93bGFuaGRyKHBhZGFwdGVyLCBtZW1fc3RhcnQsIHBhdHRyaWIpID09IF9GQUlMKQogCQlyZXR1cm4gX0ZBSUw7CiAJX3I4NzEyX29wZW5fcGt0ZmlsZShwa3QsICZwa3RmaWxlKTsKLQlfcjg3MTJfcGt0ZmlsZV9yZWFkKCZwa3RmaWxlLCBOVUxMLCBwYXR0cmliLT5wa3RfaGRybGVuKTsKKwlfcjg3MTJfcGt0ZmlsZV9yZWFkKCZwa3RmaWxlLCBOVUxMLCAodWludCkgcGF0dHJpYi0+cGt0X2hkcmxlbik7CiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX01QX1NUQVRFKSA9PSB0cnVlKSB7CiAJCS8qIHRydW5jYXRlIFRYREVTQ19TSVpFIGJ5dGVzIHR4Y21kIGlmIGF0IG1wIG1vZGUgZm9yIDg3MXggKi8KIAkJaWYgKHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gMHg4NzEyKSB7CkBAIC04MjYsMTMgKzgyNywxNiBAQAogCXVuc2lnbmVkIGxvbmcgaXJxTDsKIAlzdHJ1Y3QgIF9fcXVldWUgKnBmcmVlX3htaXRfcXVldWUgPSAmcHhtaXRwcml2LT5mcmVlX3htaXRfcXVldWU7CiAJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IHB4bWl0cHJpdi0+YWRhcHRlcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcG5kaXNfcGt0ID0gTlVMTDsKIAogCWlmIChweG1pdGZyYW1lID09IE5VTEwpCiAJCXJldHVybjsKLQlpZiAocHhtaXRmcmFtZS0+cGt0KQotCQlyODcxMl94bWl0X2NvbXBsZXRlKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGZyZWVfeG1pdF9xdWV1ZS0+bG9jaywgaXJxTCk7CiAJbGlzdF9kZWxldGUoJnB4bWl0ZnJhbWUtPmxpc3QpOworCWlmIChweG1pdGZyYW1lLT5wa3QpIHsKKwkJcG5kaXNfcGt0ID0gcHhtaXRmcmFtZS0+cGt0OworCQlweG1pdGZyYW1lLT5wa3QgPSBOVUxMOworCX0KIAlsaXN0X2luc2VydF90YWlsKCZweG1pdGZyYW1lLT5saXN0LCBnZXRfbGlzdF9oZWFkKHBmcmVlX3htaXRfcXVldWUpKTsKIAlweG1pdHByaXYtPmZyZWVfeG1pdGZyYW1lX2NudCsrOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBmcmVlX3htaXRfcXVldWUtPmxvY2ssIGlycUwpOwpAQCAtMTAxMSw2ICsxMDE1LDE5IEBACiAJfQogfQogCit2b2lkIHhtaXRmcmFtZV94bWl0YnVmX2F0dGFjaChzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSwKKwkJCXN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYpCit7CisJLyogcHhtaXRidWYgYXR0YWNoIHRvIHB4bWl0ZnJhbWUgKi8KKwlweG1pdGZyYW1lLT5weG1pdGJ1ZiA9IHB4bWl0YnVmOworCS8qIHVyYiBhbmQgaXJwIGNvbm5lY3Rpb24gKi8KKwlweG1pdGZyYW1lLT5weG1pdF91cmJbMF0gPSBweG1pdGJ1Zi0+cHhtaXRfdXJiWzBdOworCS8qIGJ1ZmZlciBhZGRyIGFzc29jICovCisJcHhtaXRmcmFtZS0+YnVmX2FkZHIgPSBweG1pdGJ1Zi0+cGJ1ZjsKKwkvKiBweG1pdGZyYW1lIGF0dGFjaCB0byBweG1pdGJ1ZiAqLworCXB4bWl0YnVmLT5wcml2X2RhdGEgPSBweG1pdGZyYW1lOworfQorCiAvKgogICogdHhfYWN0aW9uID09IDAgPT0gbm8gZnJhbWVzIHRvIHRyYW5zbWl0CiAgKiB0eF9hY3Rpb24gPiAwID09PiB3ZSBoYXZlIGZyYW1lcyB0byB0cmFuc21pdApAQCAtMTA0Miw5ICsxMDU5LDcgQEAKIAl9IGVsc2UgeyAvKmR1bXAgcGFja2V0IGRpcmVjdGx5Ki8KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHhtaXRwcml2LT5sb2NrLCBpcnFMKTsKIAkJcmV0ID0gdHJ1ZTsKLQkJcHhtaXRmcmFtZS0+cHhtaXRidWYgPSBweG1pdGJ1ZjsKLQkJcHhtaXRmcmFtZS0+cHhtaXRfdXJiWzBdID0gcHhtaXRidWYtPnB4bWl0X3VyYlswXTsKLQkJcHhtaXRmcmFtZS0+YnVmX2FkZHIgPSBweG1pdGJ1Zi0+cGJ1ZjsKKwkJeG1pdGZyYW1lX3htaXRidWZfYXR0YWNoKHB4bWl0ZnJhbWUsIHB4bWl0YnVmKTsKIAkJcjg3MTJfeG1pdF9kaXJlY3QocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOwogCX0KIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF94bWl0LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3htaXQuaAppbmRleCBkZjEzZTY3Li5hMDM0YzBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3htaXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3htaXQuaApAQCAtMSwzICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBNb2RpZmljYXRpb25zIGZvciBpbmNsdXNpb24gaW50byB0aGUgTGludXggc3RhZ2luZyB0cmVlIGFyZQorICogQ29weXJpZ2h0KGMpIDIwMTAgTGFycnkgRmluZ2VyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246CisgKiBXTEFOIEZBRSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmbmRlZiBfUlRMODcxWF9YTUlUX0hfCiAjZGVmaW5lIF9SVEw4NzFYX1hNSVRfSF8KIApAQCAtNSw4ICszMCwxOSBAQAogI2luY2x1ZGUgImRydl90eXBlcy5oIgogI2luY2x1ZGUgInhtaXRfb3NkZXAuaCIKIAotI2RlZmluZSBNQVhfWE1JVEJVRl9TWgkoMjA0OCkKLSNkZWZpbmUgTlJfWE1JVEJVRkYJKDQpCisjaWZkZWYgQ09ORklHX1I4NzEyX1RYX0FHR1IKKyNkZWZpbmUgTUFYX1hNSVRCVUZfU1ogICgxNjM4NCkKKyNlbHNlCisjZGVmaW5lIE1BWF9YTUlUQlVGX1NaICAoMjA0OCkKKyNlbmRpZgorCisjZGVmaW5lIE5SX1hNSVRCVUZGICAgICAoNCkKKworI2lmZGVmIENPTkZJR19SODcxMl9UWF9BR0dSCisjZGVmaW5lIEFHR1JfTlJfSElHSF9CT1VORCAgICAgICg0KSAvKig4KSAqLworI2RlZmluZSBBR0dSX05SX0xPV19CT1VORCAgICAgICAoMikKKyNlbmRpZgorCiAjZGVmaW5lIFhNSVRCVUZfQUxJR05fU1ogNTEyCiAjZGVmaW5lIFRYX0dVQVJEX0JBTkQJCTUKICNkZWZpbmUgTUFYX05VTUJMS1MJCSgxKQpAQCAtNjgsOSArMTA0LDkgQEAKIAogCXUxNglzZXFudW07CiAJdTE2CWV0aGVyX3R5cGU7Ci0JdTMyCXBrdGxlbjsJCS8qIHRoZSBvcmlnaW5hbCA4MDIuMyBwa3QgcmF3X2RhdGEgbGVuCisJdTE2CXBrdGxlbjsJCS8qIHRoZSBvcmlnaW5hbCA4MDIuMyBwa3QgcmF3X2RhdGEgbGVuCiAJCQkJICogKG5vdCBpbmNsdWRlIGV0aGVyX2hkciBkYXRhKSAqLwotCXUzMglsYXN0X3R4Y21kc3o7CisJdTE2CWxhc3RfdHhjbWRzejsKIAogCXU4CXBrdF9oZHJsZW47CS8qdGhlIG9yaWdpbmFsIDgwMi4zIHBrdCBoZWFkZXIgbGVuKi8KIAl1OAloZHJsZW47CQkvKnRoZSBXTEFOIEhlYWRlciBMZW4qLwpAQCAtMTEwLDcgKzE0Niw5IEBACiAKIAl1OCAqcGFsbG9jYXRlZF9idWY7CiAJdTggKnBidWY7CisJdm9pZCAqcHJpdl9kYXRhOwogCXN0cnVjdCB1cmIgKnB4bWl0X3VyYls4XTsKKwl1MzIgYWdncl9ucjsKIH07CiAKIHN0cnVjdCB4bWl0X2ZyYW1lIHsKQEAgLTE5OCw2ICsyMzYsOSBAQAogCXN0cnVjdCBzZW1hcGhvcmUgdHhfcmV0ZXZ0Oy8qYWxsIHR4IHJldHVybiBldmVudDsqLwogCXU4CXR4aXJwX2NudDsKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgeG1pdF90YXNrbGV0OworCV93b3JraXRlbSB4bWl0X3BpcGU0X3Jlc2V0X3dpOworCV93b3JraXRlbSB4bWl0X3BpcGU2X3Jlc2V0X3dpOworCV93b3JraXRlbSB4bWl0X3BpcGVkX3Jlc2V0X3dpOwogCS8qcGVyIEFDIHBlbmRpbmcgaXJwKi8KIAlpbnQgYmVxX2NudDsKIAlpbnQgYmtxX2NudDsKQEAgLTI1NSw2ICsyOTYsOSBAQAogaW50IHI4NzEyX3htaXRfZGlyZWN0KHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKTsKIHZvaWQgcjg3MTJfeG1pdF9iaCh2b2lkICpwcml2KTsKIAordm9pZCB4bWl0ZnJhbWVfeG1pdGJ1Zl9hdHRhY2goc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUsCisJCQlzdHJ1Y3QgeG1pdF9idWYgKnB4bWl0YnVmKTsKKwogI2luY2x1ZGUgInJ0bDg3MTJfeG1pdC5oIgogCiAjZW5kaWYJLypfUlRMODcxWF9YTUlUX0hfKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3N0YV9pbmZvLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9zdGFfaW5mby5oCmluZGV4IDc5YWQxNTkuLjQ4ZDZhMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3N0YV9pbmZvLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvc3RhX2luZm8uaApAQCAtMSwzICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBNb2RpZmljYXRpb25zIGZvciBpbmNsdXNpb24gaW50byB0aGUgTGludXggc3RhZ2luZyB0cmVlIGFyZQorICogQ29weXJpZ2h0KGMpIDIwMTAgTGFycnkgRmluZ2VyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246CisgKiBXTEFOIEZBRSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmbmRlZiBfX1NUQV9JTkZPX0hfCiAjZGVmaW5lIF9fU1RBX0lORk9fSF8KIApAQCAtMzgsOCArNjMsOCBAQAogCXN0cnVjdCBzdGFfcmVjdl9wcml2IHN0YV9yZWN2cHJpdjsKIAl1aW50IHN0YXRlOwogCXVpbnQgYWlkOwotCXU4CW1hY19pZDsKLQl1OAlxb3Nfb3B0aW9uOworCXVpbnQJbWFjX2lkOworCXVpbnQJcW9zX29wdGlvbjsKIAl1OAlod2FkZHJbRVRIX0FMRU5dOwogCXVpbnQJaWVlZTgwMjF4X2Jsb2NrZWQ7CS8qMDogYWxsb3dlZCwgMTpibG9ja2VkICovCiAJdWludAlYUHJpdmFjeTsgLyphZXMsIHRraXAuLi4qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvc3dhYi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvc3dhYi5oCmluZGV4IDQ0NzA5YTkuLmYxMjc4MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3N3YWIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9zd2FiLmgKQEAgLTEsMyArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGludG8gdGhlIExpbnV4IHN0YWdpbmcgdHJlZSBhcmUKKyAqIENvcHlyaWdodChjKSAyMDEwIExhcnJ5IEZpbmdlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOgorICogV0xBTiBGQUUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX0xJTlVYX0JZVEVPUkRFUl9TV0FCX0gKICNkZWZpbmUgX0xJTlVYX0JZVEVPUkRFUl9TV0FCX0gKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX2ludGYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3VzYl9pbnRmLmMKaW5kZXggMjFjZTJhZi4uZmIyZTg5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX2ludGYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2JfaW50Zi5jCkBAIC0yOCw2ICsyOCw5IEBACiAKICNkZWZpbmUgX0hDSV9JTlRGX0NfCiAKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKwogI2luY2x1ZGUgIm9zZGVwX3NlcnZpY2UuaCIKICNpbmNsdWRlICJkcnZfdHlwZXMuaCIKICNpbmNsdWRlICJyZWN2X29zZGVwLmgiCkBAIC0zNjYsMjMgKzM2OSwyNSBAQAogCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBOVUxMOwogCXN0cnVjdCBkdm9ial9wcml2ICpwZHZvYmpwcml2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2OworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwogCiAJcHJpbnRrKEtFUk5fSU5GTyAicjg3MTJ1OiBEcml2ZXJWZXJzaW9uOiAlc1xuIiwgRFJWRVIpOwogCS8qIEluIHRoaXMgcHJvYmUgZnVuY3Rpb24sIE8uUy4gd2lsbCBwcm92aWRlIHRoZSB1c2IgaW50ZXJmYWNlIHBvaW50ZXIKIAkgKiB0byBkcml2ZXIuIFdlIGhhdmUgdG8gaW5jcmVhc2UgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgdXNiIGRldmljZQogCSAqIHN0cnVjdHVyZSBieSB1c2luZyB0aGUgdXNiX2dldF9kZXYgZnVuY3Rpb24uCiAJICovCi0JdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihwdXNiX2ludGYpKTsKKwl1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihwdXNiX2ludGYpOworCXVzYl9nZXRfZGV2KHVkZXYpOwogCXBpbnRmID0gcHVzYl9pbnRmOwogCS8qIHN0ZXAgMS4gKi8KIAlwbmV0ZGV2ID0gcjg3MTJfaW5pdF9uZXRkZXYoKTsKIAlpZiAoIXBuZXRkZXYpCiAJCWdvdG8gZXJyb3I7Ci0JcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopX25ldGRldl9wcml2KHBuZXRkZXYpOworCXBhZGFwdGVyID0gbmV0ZGV2X3ByaXYocG5ldGRldik7CiAJZGlzYWJsZV9odF9mb3Jfc3BlY19kZXZpZChwZGlkLCBwYWRhcHRlcik7CiAJcGR2b2JqcHJpdiA9ICZwYWRhcHRlci0+ZHZvYmpwcml2OwogCXBkdm9ianByaXYtPnBhZGFwdGVyID0gcGFkYXB0ZXI7Ci0JcGFkYXB0ZXItPmR2b2JqcHJpdi5wdXNiZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihwdXNiX2ludGYpOworCXBhZGFwdGVyLT5kdm9ianByaXYucHVzYmRldiA9IHVkZXY7CiAJdXNiX3NldF9pbnRmZGF0YShwdXNiX2ludGYsIHBuZXRkZXYpOwogCVNFVF9ORVRERVZfREVWKHBuZXRkZXYsICZwdXNiX2ludGYtPmRldik7CiAJLyogc3RlcCAyLiAqLwpAQCAtNTkyLDE0ICs1OTcsMTUgQEAKIAkvKiBzdGVwIDYuIFRlbGwgdGhlIG5ldHdvcmsgc3RhY2sgd2UgZXhpc3QgKi8KIAlpZiAocmVnaXN0ZXJfbmV0ZGV2KHBuZXRkZXYpICE9IDApCiAJCWdvdG8gZXJyb3I7CisJc3Bpbl9sb2NrX2luaXQoJnBhZGFwdGVyLT5sb2NrUnhGRjBGaWx0ZXIpOwogCXJldHVybiAwOwogZXJyb3I6Ci0JdXNiX3B1dF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihwdXNiX2ludGYpKTsKKwl1c2JfcHV0X2Rldih1ZGV2KTsKIAl1c2Jfc2V0X2ludGZkYXRhKHB1c2JfaW50ZiwgTlVMTCk7CiAJaWYgKHBhZGFwdGVyLT5kdm9ial9kZWluaXQgIT0gTlVMTCkKIAkJcGFkYXB0ZXItPmR2b2JqX2RlaW5pdChwYWRhcHRlcik7CiAJaWYgKHBuZXRkZXYpCi0JCW9zX2ZyZWVfbmV0ZGV2KHBuZXRkZXYpOworCQlmcmVlX25ldGRldihwbmV0ZGV2KTsKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIApAQCAtNjExLDYgKzYxNyw3IEBACiAJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KHBuZXRkZXYpOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihwdXNiX2ludGYpOwogCisJdXNiX3NldF9pbnRmZGF0YShwdXNiX2ludGYsIE5VTEwpOwogCWlmIChwYWRhcHRlcikgewogCQlpZiAoZHJ2cHJpdi5kcnZfcmVnaXN0ZXJlZCA9PSB0cnVlKQogCQkJcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgPSB0cnVlOwpAQCAtNjIwLDYgKzYyNyw4IEBACiAJCX0KIAkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKIAkJdWRlbGF5KDEpOworCQkvKlN0b3AgZHJpdmVyIG1sbWUgcmVsYXRpb24gdGltZXIgKi8KKwkJcjg3MTJfc3RvcF9kcnZfdGltZXJzKHBhZGFwdGVyKTsKIAkJcjg3MXhfZGV2X3VubG9hZChwYWRhcHRlcik7CiAJCXI4NzEyX2ZyZWVfZHJ2X3N3KHBhZGFwdGVyKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2Jfb3BzLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2Jfb3BzLmgKaW5kZXggZGMwNjExYS4uNzhlNzc1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX29wcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3VzYl9vcHMuaApAQCAtMSwzICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBNb2RpZmljYXRpb25zIGZvciBpbmNsdXNpb24gaW50byB0aGUgTGludXggc3RhZ2luZyB0cmVlIGFyZQorICogQ29weXJpZ2h0KGMpIDIwMTAgTGFycnkgRmluZ2VyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246CisgKiBXTEFOIEZBRSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmbmRlZiBfX1VTQl9PUFNfSF8KICNkZWZpbmUgX19VU0JfT1BTX0hfCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3VzYl9vcHNfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3VzYl9vcHNfbGludXguYwppbmRleCA3OTMzZWE0Li4yNGUxZWM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2Jfb3BzX2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX29wc19saW51eC5jCkBAIC0yOCw2ICsyOCw4IEBACiAKICNkZWZpbmUgX0hDSV9PUFNfT1NfQ18KIAorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCiAjaW5jbHVkZSAib3NkZXBfc2VydmljZS5oIgogI2luY2x1ZGUgImRydl90eXBlcy5oIgogI2luY2x1ZGUgIm9zZGVwX2ludGYuaCIKQEAgLTQ4LDcgKzUwLDcgQEAKIAogdWludCByODcxMl91c2JfaW5pdF9pbnRmX3ByaXYoc3RydWN0IGludGZfcHJpdiAqcGludGZwcml2KQogewotCXBpbnRmcHJpdi0+cGlvcndfdXJiID0gX3VzYl9hbGxvY191cmIoMCwgR0ZQX0FUT01JQyk7CisJcGludGZwcml2LT5waW9yd191cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9BVE9NSUMpOwogCWlmICghcGludGZwcml2LT5waW9yd191cmIpCiAJCXJldHVybiBfRkFJTDsKIAlzZW1hX2luaXQoJihwaW50ZnByaXYtPmlvX3JldGV2dCksIDApOwpAQCAtMTg3LDcgKzE4OSw3IEBACiAJdXNiX2ZpbGxfYnVsa191cmIocGlvcndfdXJiLCBwdXNiZCwgcGlwZSwKIAkJCSAgd21lbSwgY250LCB1c2Jfd3JpdGVfbWVtX2NvbXBsZXRlLAogCQkJICBwaW9fcXVldWUpOwotCXN0YXR1cyA9IF91c2Jfc3VibWl0X3VyYihwaW9yd191cmIsIEdGUF9BVE9NSUMpOworCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHBpb3J3X3VyYiwgR0ZQX0FUT01JQyk7CiAJX2Rvd25fc2VtYSgmcGludGZwcml2LT5pb19yZXRldnQpOwogfQogCkBAIC0zMDUsNyArMzA3LDcgQEAKIAkJCQkgIHByZWN2YnVmLT5wYnVmLCBNQVhfUkVDVkJVRl9TWiwKIAkJCQkgIHI4NzEyX3VzYl9yZWFkX3BvcnRfY29tcGxldGUsCiAJCQkJICBwcmVjdmJ1Zik7Ci0JCWVyciA9IF91c2Jfc3VibWl0X3VyYihwdXJiLCBHRlBfQVRPTUlDKTsKKwkJZXJyID0gdXNiX3N1Ym1pdF91cmIocHVyYiwgR0ZQX0FUT01JQyk7CiAJCWlmICgoZXJyKSAmJiAoZXJyICE9ICgtRVBFUk0pKSkKIAkJCXJldCA9IF9GQUlMOwogCX0gZWxzZQpAQCAtMzMyLDE3ICszMzQsMTYgQEAKIAlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKXByaXY7CiAJc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKIAotCXdoaWxlICgxKSB7Ci0JCWlmICgocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkID09IHRydWUpIHx8Ci0JCSAgICAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgPT0gdHJ1ZSkpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAicjg3MTJ1OiB4bWl0X2JoID0+IGJEcml2ZXJTdG9wcGVkIgotCQkJICAgICAgICIgb3IgYlN1cnByaXNlUmVtb3ZlZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCQlyZXQgPSByODcxMl94bWl0ZnJhbWVfY29tcGxldGUocGFkYXB0ZXIsIHB4bWl0cHJpdiwgTlVMTCk7Ci0JCWlmIChyZXQgPT0gZmFsc2UpCi0JCQlicmVhazsKKwlpZiAoKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9PSB0cnVlKSB8fAorCSAgICAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgPT0gdHJ1ZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyODcxMnU6IHhtaXRfYmggPT4gYkRyaXZlclN0b3BwZWQiCisJCSAgICAgICAiIG9yIGJTdXJwcmlzZVJlbW92ZWRcbiIpOworCQlyZXR1cm47CiAJfQorCXJldCA9IHI4NzEyX3htaXRmcmFtZV9jb21wbGV0ZShwYWRhcHRlciwgcHhtaXRwcml2LCBOVUxMKTsKKwlpZiAocmV0ID09IGZhbHNlKQorCQlyZXR1cm47CisJdGFza2xldF9oaV9zY2hlZHVsZSgmcHhtaXRwcml2LT54bWl0X3Rhc2tsZXQpOwogfQogCiBzdGF0aWMgdm9pZCB1c2Jfd3JpdGVfcG9ydF9jb21wbGV0ZShzdHJ1Y3QgdXJiICpwdXJiKQpAQCAtNDYyLDcgKzQ2Myw3IEBACiAJCQkgIHB4bWl0ZnJhbWUtPm1lbV9hZGRyLAogCQkJICBjbnQsIHVzYl93cml0ZV9wb3J0X2NvbXBsZXRlLAogCQkJICBweG1pdGZyYW1lKTsgLyogY29udGV4dCBpcyB4bWl0X2ZyYW1lICovCi0Jc3RhdHVzID0gX3VzYl9zdWJtaXRfdXJiKHB1cmIsIEdGUF9BVE9NSUMpOworCXN0YXR1cyA9IHVzYl9zdWJtaXRfdXJiKHB1cmIsIEdGUF9BVE9NSUMpOwogCWlmICghc3RhdHVzKQogCQlyZXQgPSBfU1VDQ0VTUzsKIAllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2Jfb3NpbnRmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2Jfb3NpbnRmLmgKaW5kZXggMGRhNmMxZC4uZDk1Nzk3YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3VzYl9vc2ludGYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2Jfb3NpbnRmLmgKQEAgLTEsMyArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGludG8gdGhlIExpbnV4IHN0YWdpbmcgdHJlZSBhcmUKKyAqIENvcHlyaWdodChjKSAyMDEwIExhcnJ5IEZpbmdlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOgorICogV0xBTiBGQUUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX19VU0JfT1NJTlRGX0gKICNkZWZpbmUgX19VU0JfT1NJTlRGX0gKIApAQCAtMTcsNiArNDIsNyBAQAogdm9pZCBydGw4NzF4X2ludGZfc3RvcChzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyKTsKIHZvaWQgcjg3MXhfZGV2X3VubG9hZChzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyKTsKIHZvaWQgcjg3MTJfc3RvcF9kcnZfdGhyZWFkcyhzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyKTsKK3ZvaWQgcjg3MTJfc3RvcF9kcnZfdGltZXJzKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIpOwogdTggcjg3MTJfaW5pdF9kcnZfc3coc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlcik7CiB1OCByODcxMl9mcmVlX2Rydl9zdyhzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyKTsKIHN0cnVjdCBuZXRfZGV2aWNlICpyODcxMl9pbml0X25ldGRldih2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3VzYl92ZW5kb3JfcmVxLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2JfdmVuZG9yX3JlcS5oCmluZGV4IGQzNWM1MzguLjgyMzM1YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3VzYl92ZW5kb3JfcmVxLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX3ZlbmRvcl9yZXEuaApAQCAtMSwzICsxLDI4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDcgLSAyMDEwIFJlYWx0ZWsgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBNb2RpZmljYXRpb25zIGZvciBpbmNsdXNpb24gaW50byB0aGUgTGludXggc3RhZ2luZyB0cmVlIGFyZQorICogQ29weXJpZ2h0KGMpIDIwMTAgTGFycnkgRmluZ2VyLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246CisgKiBXTEFOIEZBRSA8d2xhbmZhZUByZWFsdGVrLmNvbT4KKyAqIExhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmbmRlZiBfVVNCX1ZFTkRPUl9SRVFVRVNUX0hfCiAjZGVmaW5lIF9VU0JfVkVORE9SX1JFUVVFU1RfSF8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvd2lmaS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvd2lmaS5oCmluZGV4IDQyN2FiN2UuLjI3NzM5OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3dpZmkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi93aWZpLmgKQEAgLTEsMyArMSwyOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMCBSZWFsdGVrIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogTW9kaWZpY2F0aW9ucyBmb3IgaW5jbHVzaW9uIGludG8gdGhlIExpbnV4IHN0YWdpbmcgdHJlZSBhcmUKKyAqIENvcHlyaWdodChjKSAyMDEwIExhcnJ5IEZpbmdlci4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOgorICogV0xBTiBGQUUgPHdsYW5mYWVAcmVhbHRlay5jb20+CisgKiBMYXJyeSBGaW5nZXIgPExhcnJ5LkZpbmdlckBsd2Zpbmdlci5uZXQ+CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZm5kZWYgX1dJRklfSF8KICNkZWZpbmUgX1dJRklfSF8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvd2xhbl9ic3NkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3dsYW5fYnNzZGVmLmgKaW5kZXggMGQ5MGUxZi4uMmVhOGEzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvd2xhbl9ic3NkZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi93bGFuX2Jzc2RlZi5oCkBAIC0xLDMgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBMaW51eCBzdGFnaW5nIHRyZWUgYXJlCisgKiBDb3B5cmlnaHQoYykgMjAxMCBMYXJyeSBGaW5nZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjoKKyAqIFdMQU4gRkFFIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9fV0xBTl9CU1NERUZfSF9fCiAjZGVmaW5lIF9fV0xBTl9CU1NERUZfSF9fCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3htaXRfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3htaXRfbGludXguYwppbmRleCA3ZGVhOGI1Li5jOTcwMzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi94bWl0X2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIveG1pdF9saW51eC5jCkBAIC0yOCw2ICsyOCw4IEBACiAKICNkZWZpbmUgX1hNSVRfT1NERVBfQ18KIAorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorCiAjaW5jbHVkZSAib3NkZXBfc2VydmljZS5oIgogI2luY2x1ZGUgImRydl90eXBlcy5oIgogCkBAIC00Miw3ICs0NCw2IEBACiAKIHN0YXRpYyB1aW50IHJlbWFpbmRlcl9sZW4oc3RydWN0IHBrdF9maWxlICpwZmlsZSkKIHsKLQkvKiBLb3ZpY2g6IE5lZWQgdG8gZXh0ZW5kIHRoZSBidWZfbGVuIHRvIDY0IGJpdCA/KHVuc2lnbmVkIGxvbmcgbG9uZykgKi8KIAlyZXR1cm4gKHVpbnQpKHBmaWxlLT5idWZfbGVuIC0gKChhZGRyX3QpKHBmaWxlLT5jdXJfYWRkcikgLQogCSAgICAgICAoYWRkcl90KShwZmlsZS0+YnVmX3N0YXJ0KSkpOwogfQpAQCAtMTA3LDEzICsxMDgsMzMgQEAKIAlwYXR0cmliLT5zdWJ0eXBlID0gV0lGSV9RT1NfREFUQV9UWVBFOwogfQogCit2b2lkIHI4NzEyX1NldEZpbHRlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgX2FkYXB0ZXIsCisJCQkJCQl3a0ZpbHRlclJ4RkYwKTsKKwl1OCAgb2xkdmFsdWUgPSAweDAwLCBuZXd2YWx1ZSA9IDB4MDA7CisJdW5zaWduZWQgbG9uZyBpcnFMOworCisJb2xkdmFsdWUgPSByODcxMl9yZWFkOChwYWRhcHRlciwgMHgxMTcpOworCW5ld3ZhbHVlID0gb2xkdmFsdWUgJiAweGZlOworCXI4NzEyX3dyaXRlOChwYWRhcHRlciwgMHgxMTcsIG5ld3ZhbHVlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwYWRhcHRlci0+bG9ja1J4RkYwRmlsdGVyLCBpcnFMKTsKKwlwYWRhcHRlci0+YmxuRW5hYmxlUnhGRjBGaWx0ZXIgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhZGFwdGVyLT5sb2NrUnhGRjBGaWx0ZXIsIGlycUwpOworCWRvIHsKKwkJbXNsZWVwKDEwMCk7CisJfSB3aGlsZSAocGFkYXB0ZXItPmJsbkVuYWJsZVJ4RkYwRmlsdGVyID09IDEpOworCXI4NzEyX3dyaXRlOChwYWRhcHRlciwgMHgxMTcsIG9sZHZhbHVlKTsKK30KKwogaW50IHI4NzEyX3htaXRfcmVzb3VyY2VfYWxsb2Moc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciwKIAkJCSAgICAgIHN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYpCiB7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCXB4bWl0YnVmLT5weG1pdF91cmJbaV0gPSBfdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwkJcHhtaXRidWYtPnB4bWl0X3VyYltpXSA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAJCWlmIChweG1pdGJ1Zi0+cHhtaXRfdXJiW2ldID09IE5VTEwpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAicjg3MTJ1OiBweG1pdGJ1Zi0+cHhtaXRfdXJiW2ldIgogCQkJICAgICIgPT0gTlVMTCIpOwpAQCAtMTQ2LDcgKzE2Nyw3IEBACiBpbnQgcjg3MTJfeG1pdF9lbnRyeShfcGt0ICpwa3QsIHN0cnVjdCAgbmV0X2RldmljZSAqcG5ldGRldikKIHsKIAlzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSA9IE5VTEw7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKilfbmV0ZGV2X3ByaXYocG5ldGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihwbmV0ZGV2KTsKIAlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmKHBhZGFwdGVyLT54bWl0cHJpdik7CiAJaW50IHJldCA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3htaXRfb3NkZXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3htaXRfb3NkZXAuaAppbmRleCBjYTQzOTM3Li44ZWJhN2NhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi94bWl0X29zZGVwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIveG1pdF9vc2RlcC5oCkBAIC0xLDMgKzEsMjggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTAgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIE1vZGlmaWNhdGlvbnMgZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBMaW51eCBzdGFnaW5nIHRyZWUgYXJlCisgKiBDb3B5cmlnaHQoYykgMjAxMCBMYXJyeSBGaW5nZXIuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjoKKyAqIFdMQU4gRkFFIDx3bGFuZmFlQHJlYWx0ZWsuY29tPgorICogTGFycnkgRmluZ2VyIDxMYXJyeS5GaW5nZXJAbHdmaW5nZXIubmV0PgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZuZGVmIF9fWE1JVF9PU0RFUF9IXwogI2RlZmluZSBfX1hNSVRfT1NERVBfSF8KIApAQCAtMjIsNiArNDcsNyBAQAogc3RydWN0IHhtaXRfYnVmOwogCiBpbnQgcjg3MTJfeG1pdF9lbnRyeShfcGt0ICpwa3QsIHN0cnVjdCAgbmV0X2RldmljZSAqcG5ldGRldik7Cit2b2lkIHI4NzEyX1NldEZpbHRlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogaW50IHI4NzEyX3htaXRfcmVzb3VyY2VfYWxsb2Moc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciwKIAkJCSAgIHN0cnVjdCB4bWl0X2J1ZiAqcHhtaXRidWYpOwogdm9pZCByODcxMl94bWl0X3Jlc291cmNlX2ZyZWUoc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZDUyNmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9LY29uZmlnCkBAIC0wLDAgKzEsMTYgQEAKK2NvbmZpZyBSVFM1MTM5CisJdHJpc3RhdGUgIlJlYWx0ZWsgUlRTNTEzOSBVU0IgY2FyZCByZWFkZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFVTQiAmJiBTQ1NJCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBpbmNsdWRlIGRyaXZlciBjb2RlIHRvIHN1cHBvcnQgdGhlIFJlYWx0ZWsKKwkgIFJUUzUxMzkgVVNCIGNhcmQgcmVhZGVycy4KKworCSAgSWYgdGhpcyBkcml2ZXIgaXMgY29tcGlsZWQgYXMgYSBtb2R1bGUsIGl0IHdpbGwgYmUgbmFtZWQgcnRzNTEzOS4KKworY29uZmlnIFJUUzUxMzlfREVCVUcKKwlib29sICJSZWFsdGVrIFJUUzUxMzkgQ2FyZCBSZWFkZXIgdmVyYm9zZSBkZWJ1ZyIKKwlkZXBlbmRzIG9uIFJUUzUxMzkKKwloZWxwCisJICBTYXkgWSBoZXJlIGluIG9yZGVyIHRvIGhhdmUgdGhlIHJ0czUxMzkgY29kZSBnZW5lcmF0ZQorCSAgdmVyYm9zZSBkZWJ1Z2dpbmcgbWVzc2FnZXMuCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiODk1OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L01ha2VmaWxlCkBAIC0wLDAgKzEsMzcgQEAKKyMgRHJpdmVyIGZvciBSZWFsdGVrIFJUUzUxeHggVVNCIGNhcmQgcmVhZGVyCisjCisjIENvcHlyaWdodChjKSAyMDA5IFJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3JwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorIyBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisjIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworIyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIworIyBBdXRob3I6CisjICAgd3dhbmcgKHdlaV93YW5nQHJlYWxzaWwuY29tLmNuKQorIyAgIE5vLiA0NTAsIFNoZW5odSBSb2FkLCBTdXpob3UgSW5kdXN0cnkgUGFyaywgU3V6aG91LCBDaGluYQorIyBNYWludGFpbmVyOgorIyAgIEVkd2luIFJvbmcgKGVkd2luX3JvbmdAcmVhbHNpbC5jb20uY24pCisjICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisjCisjIE1ha2VmaWxlIGZvciB0aGUgUlRTNTF4eCBVU0IgQ2FyZCBSZWFkZXIgZHJpdmVycy4KKyMKKworVEFSR0VUX01PRFVMRSA6PSBydHM1MTM5CisKK0VYVFJBX0NGTEFHUyA6PSAtSWRyaXZlcnMvc2NzaSAtSSQoUFdEKQorCitvYmotbSArPSAkKFRBUkdFVF9NT0RVTEUpLm8KKworY29tbW9uLW9iaiA6PSBydHM1MXhfdHJhbnNwb3J0Lm8gcnRzNTF4X3Njc2kubyBydHM1MXhfZm9wLm8KKworJChUQVJHRVRfTU9EVUxFKS1vYmpzIDo9ICQoY29tbW9uLW9iaikgcnRzNTF4Lm8gcnRzNTF4X2NoaXAubyBydHM1MXhfY2FyZC5vIFwKKwkJeGQubyBzZC5vIG1zLm8gc2RfY3BybS5vIG1zX21nLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZGU3MjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9UT0RPCkBAIC0wLDAgKzEsNSBAQAorVE9ETzoKKy0gc3VwcG9ydCBtb3JlIFVTQiBjYXJkIHJlYWRlciBvZiBSZWFsdGVrIGZhbWlseQorLSB1c2Uga2VybmVsIGNvZGluZyBzdHlsZQorLSBjaGVja3BhdGNoLnBsIGZpeGVzCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L2RlYnVnLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZGVjMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9kZWJ1Zy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIERyaXZlciBmb3IgUmVhbHRlayBSVFM1MXh4IFVTQiBjYXJkIHJlYWRlcgorICogSGVhZGVyIGZpbGUKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOSBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogQXV0aG9yOgorICogICB3d2FuZyAod2VpX3dhbmdAcmVhbHNpbC5jb20uY24pCisgKiAgIE5vLiA0NTAsIFNoZW5odSBSb2FkLCBTdXpob3UgSW5kdXN0cnkgUGFyaywgU3V6aG91LCBDaGluYQorICogTWFpbnRhaW5lcjoKKyAqICAgRWR3aW4gUm9uZyAoZWR3aW5fcm9uZ0ByZWFsc2lsLmNvbS5jbikKKyAqICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisgKi8KKworI2lmbmRlZiBfX1JUUzUxWF9ERUJVR19ICisjZGVmaW5lIF9fUlRTNTFYX0RFQlVHX0gKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjZGVmaW5lIFJUUzUxWF9USVAgInJ0czUxeDogIgorCisjaWZkZWYgQ09ORklHX1JUUzUxMzlfREVCVUcKKyNkZWZpbmUgUlRTNTFYX0RFQlVHUCh4Li4uKSBwcmludGsoS0VSTl9ERUJVRyBSVFM1MVhfVElQIHgpCisjZGVmaW5lIFJUUzUxWF9ERUJVR1BOKHguLi4pIHByaW50ayhLRVJOX0RFQlVHIHgpCisjZGVmaW5lIFJUUzUxWF9ERUJVR1BYKHguLi4pIHByaW50ayh4KQorI2RlZmluZSBSVFM1MVhfREVCVUcoeCkgeAorI2Vsc2UKKyNkZWZpbmUgUlRTNTFYX0RFQlVHUCh4Li4uKQorI2RlZmluZSBSVFM1MVhfREVCVUdQTih4Li4uKQorI2RlZmluZSBSVFM1MVhfREVCVUdQWCh4Li4uKQorI2RlZmluZSBSVFM1MVhfREVCVUcoeCkKKyNlbmRpZgorCisjZW5kaWYgLyogX19SVFM1MVhfREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvbXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L21zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBlOTA3MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L21zLmMKQEAgLTAsMCArMSw0MTkxIEBACisvKiBEcml2ZXIgZm9yIFJlYWx0ZWsgUlRTNTF4eCBVU0IgY2FyZCByZWFkZXIKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOSBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogQXV0aG9yOgorICogICB3d2FuZyAod2VpX3dhbmdAcmVhbHNpbC5jb20uY24pCisgKiAgIE5vLiA0NTAsIFNoZW5odSBSb2FkLCBTdXpob3UgSW5kdXN0cnkgUGFyaywgU3V6aG91LCBDaGluYQorICogTWFpbnRhaW5lcjoKKyAqICAgRWR3aW4gUm9uZyAoZWR3aW5fcm9uZ0ByZWFsc2lsLmNvbS5jbikKKyAqICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInRyYWNlLmgiCisjaW5jbHVkZSAicnRzNTF4LmgiCisjaW5jbHVkZSAicnRzNTF4X3RyYW5zcG9ydC5oIgorI2luY2x1ZGUgInJ0czUxeF9zY3NpLmgiCisjaW5jbHVkZSAicnRzNTF4X2NhcmQuaCIKKyNpbmNsdWRlICJtcy5oIgorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNfc2V0X2Vycl9jb2RlKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggZXJyX2NvZGUpCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCisJbXNfY2FyZC0+ZXJyX2NvZGUgPSBlcnJfY29kZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXNfY2hlY2tfZXJyX2NvZGUoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCBlcnJfY29kZSkKK3sKKwlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7CisKKwlyZXR1cm4gKG1zX2NhcmQtPmVycl9jb2RlID09IGVycl9jb2RlKTsKK30KKworc3RhdGljIGludCBtc19wYXJzZV9lcnJfY29kZShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKK30KKworc3RhdGljIGludCBtc190cmFuc2Zlcl90cGMoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCB0cmFuc19tb2RlLCB1OCB0cGMsCisJCQkgICB1OCBjbnQsIHU4IGNmZykKK3sKKwlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7CisJaW50IHJldHZhbDsKKworCVJUUzUxWF9ERUJVR1AoIm1zX3RyYW5zZmVyX3RwYzogdHBjID0gMHgleFxuIiwgdHBjKTsKKworCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX1RQQywgMHhGRiwgdHBjKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19CWVRFX0NOVCwgMHhGRiwgY250KTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19UUkFOU19DRkcsIDB4RkYsIGNmZyk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9EQVRBX1NPVVJDRSwgMHgwMSwKKwkJICAgICAgIFBJTkdQT05HX0JVRkZFUik7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19UUkFOU0ZFUiwgMHhGRiwKKwkJICAgICAgIE1TX1RSQU5TRkVSX1NUQVJUIHwgdHJhbnNfbW9kZSk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgQ0hFQ0tfUkVHX0NNRCwgTVNfVFJBTlNGRVIsIE1TX1RSQU5TRkVSX0VORCwKKwkJICAgICAgIE1TX1RSQU5TRkVSX0VORCk7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIE1TX1RSQU5TX0NGRywgMCwgMCk7CisKKwlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DUiwgMTAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHZhbCA9IHJ0czUxeF9nZXRfcnNwKGNoaXAsIDIsIDUwMDApOworCWlmIChDSEVDS19NU19UUkFOU19GQUlMKGNoaXAsIHJldHZhbCkpIHsKKwkJcnRzNTF4X2NsZWFyX21zX2Vycm9yKGNoaXApOworCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfVE9fRVJST1IpOworCQlUUkFDRV9SRVQoY2hpcCwgbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCkpOworCX0KKworCWlmICghKHRwYyAmIDB4MDgpKSB7CS8qIFJlYWQgUGFja2V0ICovCisJCS8qIENoZWNrIENSQzE2ICYgUmVhZHkgVGltZW91dCAqLworCQlpZiAoY2hpcC0+cnNwX2J1ZlsxXSAmIE1TX0NSQzE2X0VSUikgeworCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0NSQzE2X0VSUk9SKTsKKwkJCVRSQUNFX1JFVChjaGlwLCBtc19wYXJzZV9lcnJfY29kZShjaGlwKSk7CisJCX0KKwl9IGVsc2UgeyAvKiBXcml0ZSBQYWNrZXQgKi8KKwkJaWYgKENIS19NU1BSTyhtc19jYXJkKSAmJiAhKGNoaXAtPnJzcF9idWZbMV0gJiAweDgwKSkgeworCQkJaWYgKGNoaXAtPnJzcF9idWZbMV0gJiAoTVNfSU5UX0VSUiB8IE1TX0lOVF9DTUROSykpIHsKKwkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQ01EX05LKTsKKwkJCQlUUkFDRV9SRVQoY2hpcCwgbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCkpOworCQkJfQorCQl9CisJfQorCisJLyogQ2hlY2sgVGltZW91dCBvZiBSZWFkeSBTaWduYWwgKi8KKwlpZiAoY2hpcC0+cnNwX2J1ZlsxXSAmIE1TX1JEWV9USU1FT1VUKSB7CisJCXJ0czUxeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKKwkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX1RPX0VSUk9SKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIG1zX3BhcnNlX2Vycl9jb2RlKGNoaXApKTsKKwl9CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2ludCBtc190cmFuc2Zlcl9kYXRhKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggdHJhbnNfbW9kZSwgdTggdHBjLAorCQkgICAgIHUxNiBzZWNfY250LCB1OCBjZmcsIGludCBtb2RlXzJrLCBpbnQgdXNlX3NnLCB2b2lkICpidWYsCisJCSAgICAgaW50IGJ1Zl9sZW4pCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCWludCByZXR2YWw7CisJdTggdmFsLCBlcnJfY29kZSA9IDAsIGZsYWcgPSAwOworCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcjsKKwl1bnNpZ25lZCBpbnQgcGlwZTsKKworCWlmICghYnVmIHx8ICFidWZfbGVuKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJaWYgKHRyYW5zX21vZGUgPT0gTVNfVE1fQVVUT19SRUFEKSB7CisJCXBpcGUgPSBSQ1ZfQlVMS19QSVBFKGNoaXApOworCQlkaXIgPSBETUFfRlJPTV9ERVZJQ0U7CisJCWZsYWcgPSBNT0RFX0NESVI7CisJCWVycl9jb2RlID0gTVNfRkxBU0hfUkVBRF9FUlJPUjsKKwl9IGVsc2UgaWYgKHRyYW5zX21vZGUgPT0gTVNfVE1fQVVUT19XUklURSkgeworCQlwaXBlID0gU05EX0JVTEtfUElQRShjaGlwKTsKKwkJZGlyID0gRE1BX1RPX0RFVklDRTsKKwkJZmxhZyA9IE1PREVfQ0RPUjsKKwkJZXJyX2NvZGUgPSBNU19GTEFTSF9XUklURV9FUlJPUjsKKwl9IGVsc2UgeworCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCX0KKworCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX1RQQywgMHhGRiwgdHBjKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19TRUNUT1JfQ05UX0gsIDB4RkYsCisJCSAgICAgICAodTgpIChzZWNfY250ID4+IDgpKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19TRUNUT1JfQ05UX0wsIDB4RkYsCisJCSAgICAgICAodTgpIHNlY19jbnQpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX1RSQU5TX0NGRywgMHhGRiwgY2ZnKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX0RBVEFfU09VUkNFLCAweDAxLAorCQkgICAgICAgUklOR19CVUZGRVIpOworCisJaWYgKG1vZGVfMmspCisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX0NGRywgTVNfMktfU0VDVE9SX01PREUsCisJCQkgICAgICAgTVNfMktfU0VDVE9SX01PREUpOworCWVsc2UKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfQ0ZHLCBNU18yS19TRUNUT1JfTU9ERSwKKwkJCSAgICAgICAwKTsKKworCXRyYW5zX2RtYV9lbmFibGUoZGlyLCBjaGlwLCBzZWNfY250ICogNTEyLCBETUFfNTEyKTsKKworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX1RSQU5TRkVSLCAweEZGLAorCQkgICAgICAgTVNfVFJBTlNGRVJfU1RBUlQgfCB0cmFuc19tb2RlKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBDSEVDS19SRUdfQ01ELCBNU19UUkFOU0ZFUiwgTVNfVFJBTlNGRVJfRU5ELAorCQkgICAgICAgTVNfVFJBTlNGRVJfRU5EKTsKKworCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBmbGFnIHwgU1RBR0VfTVNfU1RBVFVTLCAxMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcmV0dmFsID0KKwkgICAgcnRzNTF4X3RyYW5zZmVyX2RhdGFfcmNjKGNoaXAsIHBpcGUsIGJ1ZiwgYnVmX2xlbiwgdXNlX3NnLCBOVUxMLAorCQkJCSAgICAgMTUwMDAsIGZsYWcpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIGVycl9jb2RlKTsKKwkJcnRzNTF4X2NsZWFyX21zX2Vycm9yKGNoaXApOworCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwl9CisKKwlyZXR2YWwgPSBydHM1MXhfZ2V0X3JzcChjaGlwLCAzLCAxNTAwMCk7CisJaWYgKENIRUNLX01TX1RSQU5TX0ZBSUwoY2hpcCwgcmV0dmFsKSkgeworCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgZXJyX2NvZGUpOworCQlydHM1MXhfY2xlYXJfbXNfZXJyb3IoY2hpcCk7CisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJfQorCisJbXNfY2FyZC0+bGFzdF9yd19pbnQgPSB2YWwgPSBjaGlwLT5yc3BfYnVmWzFdOworCWlmICh2YWwgJiAoTVNfSU5UX0NNRE5LIHwgTVNfSU5UX0VSUiB8IE1TX0NSQzE2X0VSUiB8IE1TX1JEWV9USU1FT1VUKSkKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworaW50IG1zX3dyaXRlX2J5dGVzKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggdHBjLCB1OCBjbnQsIHU4IGNmZywgdTggKmRhdGEsCisJCSAgIGludCBkYXRhX2xlbikKK3sKKwlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7CisJaW50IHJldHZhbCwgaTsKKworCWlmICghZGF0YSB8fCAoZGF0YV9sZW4gPCBjbnQpKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0VSUk9SKTsKKworCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBQUEJVRl9CQVNFMiArIGksIDB4RkYsCisJCQkgICAgICAgZGF0YVtpXSk7CisJfQorCWlmIChjbnQgJSAyKQorCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBQUEJVRl9CQVNFMiArIGksCisJCQkJMHhGRiwgMHhGRik7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19UUEMsIDB4RkYsIHRwYyk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfQllURV9DTlQsIDB4RkYsIGNudCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfVFJBTlNfQ0ZHLCAweEZGLCBjZmcpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfREFUQV9TT1VSQ0UsIDB4MDEsCisJCSAgICAgICBQSU5HUE9OR19CVUZGRVIpOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfVFJBTlNGRVIsIDB4RkYsCisJCSAgICAgICBNU19UUkFOU0ZFUl9TVEFSVCB8IE1TX1RNX1dSSVRFX0JZVEVTKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBDSEVDS19SRUdfQ01ELCBNU19UUkFOU0ZFUiwgTVNfVFJBTlNGRVJfRU5ELAorCQkgICAgICAgTVNfVFJBTlNGRVJfRU5EKTsKKworCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0NSLCAxMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcmV0dmFsID0gcnRzNTF4X2dldF9yc3AoY2hpcCwgMSwgNTAwMCk7CisJaWYgKENIRUNLX01TX1RSQU5TX0ZBSUwoY2hpcCwgcmV0dmFsKSkgeworCQl1OCB2YWwgPSAwOworCisJCXJ0czUxeF9lcDBfcmVhZF9yZWdpc3RlcihjaGlwLCBNU19UUkFOU19DRkcsICZ2YWwpOworCQlSVFM1MVhfREVCVUdQKCJNU19UUkFOU19DRkc6IDB4JTAyeFxuIiwgdmFsKTsKKworCQlydHM1MXhfY2xlYXJfbXNfZXJyb3IoY2hpcCk7CisKKwkJaWYgKCEodHBjICYgMHgwOCkpIHsgLyogUmVhZCBQYWNrZXQgKi8KKwkJCS8qIENoZWNrIENSQzE2ICYgUmVhZHkgVGltZW91dCAqLworCQkJaWYgKHZhbCAmIE1TX0NSQzE2X0VSUikgeworCQkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19DUkMxNl9FUlJPUik7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIG1zX3BhcnNlX2Vycl9jb2RlKGNoaXApKTsKKwkJCX0KKwkJfSBlbHNlIHsgLyogV3JpdGUgUGFja2V0ICovCisJCQlpZiAoQ0hLX01TUFJPKG1zX2NhcmQpICYmICEodmFsICYgMHg4MCkpIHsKKwkJCQlpZiAodmFsICYgKE1TX0lOVF9FUlIgfCBNU19JTlRfQ01ETkspKSB7CisJCQkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19DTURfTkspOworCQkJCQlUUkFDRV9SRVQoY2hpcCwKKwkJCQkJCSAgbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCkpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIENoZWNrIFRpbWVvdXQgb2YgUmVhZHkgU2lnbmFsICovCisJCWlmICh2YWwgJiBNU19SRFlfVElNRU9VVCkgeworCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX1RPX0VSUk9SKTsKKwkJCVRSQUNFX1JFVChjaGlwLCBtc19wYXJzZV9lcnJfY29kZShjaGlwKSk7CisJCX0KKworCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfVE9fRVJST1IpOworCQlUUkFDRV9SRVQoY2hpcCwgbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCkpOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworaW50IG1zX3JlYWRfYnl0ZXMoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCB0cGMsIHU4IGNudCwgdTggY2ZnLCB1OCAqZGF0YSwKKwkJICBpbnQgZGF0YV9sZW4pCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCWludCByZXR2YWwsIGk7CisKKwlpZiAoIWRhdGEpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRVJST1IpOworCisJcnRzNTF4X2luaXRfY21kKGNoaXApOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfVFBDLCAweEZGLCB0cGMpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX0JZVEVfQ05ULCAweEZGLCBjbnQpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX1RSQU5TX0NGRywgMHhGRiwgY2ZnKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX0RBVEFfU09VUkNFLCAweDAxLAorCQkgICAgICAgUElOR1BPTkdfQlVGRkVSKTsKKworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX1RSQU5TRkVSLCAweEZGLAorCQkgICAgICAgTVNfVFJBTlNGRVJfU1RBUlQgfCBNU19UTV9SRUFEX0JZVEVTKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBDSEVDS19SRUdfQ01ELCBNU19UUkFOU0ZFUiwgTVNfVFJBTlNGRVJfRU5ELAorCQkgICAgICAgTVNfVFJBTlNGRVJfRU5EKTsKKworCWZvciAoaSA9IDA7IGkgPCBkYXRhX2xlbiAtIDE7IGkrKykKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCBQUEJVRl9CQVNFMiArIGksIDAsIDApOworCisJaWYgKGRhdGFfbGVuICUgMikKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCBQUEJVRl9CQVNFMiArIGRhdGFfbGVuLCAwLAorCQkJICAgICAgIDApOworCWVsc2UKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCBQUEJVRl9CQVNFMiArIGRhdGFfbGVuIC0gMSwKKwkJCSAgICAgICAwLCAwKTsKKworCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0NSLCAxMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcmV0dmFsID0gcnRzNTF4X2dldF9yc3AoY2hpcCwgZGF0YV9sZW4gKyAxLCA1MDAwKTsKKwlpZiAoQ0hFQ0tfTVNfVFJBTlNfRkFJTChjaGlwLCByZXR2YWwpKSB7CisJCXU4IHZhbCA9IDA7CisKKwkJcnRzNTF4X2VwMF9yZWFkX3JlZ2lzdGVyKGNoaXAsIE1TX1RSQU5TX0NGRywgJnZhbCk7CisJCVJUUzUxWF9ERUJVR1AoIk1TX1RSQU5TX0NGRzogMHglMDJ4XG4iLCB2YWwpOworCisJCXJ0czUxeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKKworCQlpZiAoISh0cGMgJiAweDA4KSkgeyAvKiBSZWFkIFBhY2tldCAqLworCQkJLyogQ2hlY2sgQ1JDMTYgJiBSZWFkeSBUaW1lb3V0ICovCisJCQlpZiAodmFsICYgTVNfQ1JDMTZfRVJSKSB7CisJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0NSQzE2X0VSUk9SKTsKKwkJCQlUUkFDRV9SRVQoY2hpcCwgbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCkpOworCQkJfQorCQl9IGVsc2UgeyAvKiBXcml0ZSBQYWNrZXQgKi8KKwkJCWlmIChDSEtfTVNQUk8obXNfY2FyZCkgJiYgISh2YWwgJiAweDgwKSkgeworCQkJCWlmICh2YWwgJiAoTVNfSU5UX0VSUiB8IE1TX0lOVF9DTUROSykpIHsKKwkJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0NNRF9OSyk7CisJCQkJCVRSQUNFX1JFVChjaGlwLAorCQkJCQkJICBtc19wYXJzZV9lcnJfY29kZShjaGlwKSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyogQ2hlY2sgVGltZW91dCBvZiBSZWFkeSBTaWduYWwgKi8KKwkJaWYgKHZhbCAmIE1TX1JEWV9USU1FT1VUKSB7CisJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfVE9fRVJST1IpOworCQkJVFJBQ0VfUkVUKGNoaXAsIG1zX3BhcnNlX2Vycl9jb2RlKGNoaXApKTsKKwkJfQorCisJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19UT19FUlJPUik7CisJCVRSQUNFX1JFVChjaGlwLCBtc19wYXJzZV9lcnJfY29kZShjaGlwKSk7CisJfQorCisJcnRzNTF4X3JlYWRfcnNwX2J1ZihjaGlwLCAxLCBkYXRhLCBkYXRhX2xlbik7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2ludCBtc19zZXRfcndfcmVnX2FkZHIoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLAorCQkgICAgICAgdTggcmVhZF9zdGFydCwgdTggcmVhZF9jbnQsIHU4IHdyaXRlX3N0YXJ0LCB1OCB3cml0ZV9jbnQpCit7CisJaW50IHJldHZhbCwgaTsKKwl1OCBkYXRhWzRdOworCisJZGF0YVswXSA9IHJlYWRfc3RhcnQ7CisJZGF0YVsxXSA9IHJlYWRfY250OworCWRhdGFbMl0gPSB3cml0ZV9zdGFydDsKKwlkYXRhWzNdID0gd3JpdGVfY250OworCisJZm9yIChpID0gMDsgaSA8IE1TX01BWF9SRVRSWV9DT1VOVDsgaSsrKSB7CisJCXJldHZhbCA9CisJCSAgICBtc193cml0ZV9ieXRlcyhjaGlwLCBTRVRfUldfUkVHX0FEUlMsIDQsIE5PX1dBSVRfSU5ULCBkYXRhLAorCQkJCSAgIDQpOworCQlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKQorCQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworCQlydHM1MXhfY2xlYXJfbXNfZXJyb3IoY2hpcCk7CisJfQorCisJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKK30KKworc3RhdGljIGludCBtc19zZW5kX2NtZChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IGNtZCwgdTggY2ZnKQoreworCXU4IGRhdGFbMl07CisKKwlkYXRhWzBdID0gY21kOworCWRhdGFbMV0gPSAwOworCisJcmV0dXJuIG1zX3dyaXRlX2J5dGVzKGNoaXAsIFBST19TRVRfQ01ELCAxLCBjZmcsIGRhdGEsIDEpOworfQorCitzdGF0aWMgaW50IG1zX3NldF9jbWQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLAorCQkgICAgICB1OCByZWFkX3N0YXJ0LCB1OCByZWFkX2NvdW50LAorCQkgICAgICB1OCB3cml0ZV9zdGFydCwgdTggd3JpdGVfY291bnQsCisJCSAgICAgIHU4IGNtZCwgdTggY2ZnLCB1OCAqZGF0YSwgaW50IGRhdGFfbGVuLCB1OCAqaW50X3N0YXQpCit7CisJaW50IHJldHZhbCwgaTsKKwl1OCB2YWw7CisKKwlpZiAoIWRhdGEgfHwgKGRhdGFfbGVuIDw9IDApIHx8IChkYXRhX2xlbiA+IDEyOCkpIHsKKwkJUlRTNTFYX0RFQlVHUCgibXNfc2V0X2NtZCAoZGF0YV9sZW4gPSAlZClcbiIsIGRhdGFfbGVuKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwl9CisKKwlyZXR2YWwgPQorCSAgICBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgcmVhZF9zdGFydCwgcmVhZF9jb3VudCwgd3JpdGVfc3RhcnQsCisJCQkgICAgICAgd3JpdGVfY291bnQpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJZm9yIChpID0gMDsgaSA8IE1TX01BWF9SRVRSWV9DT1VOVDsgaSsrKSB7CisJCXJldHZhbCA9CisJCSAgICBtc193cml0ZV9ieXRlcyhjaGlwLCBXUklURV9SRUcsIHdyaXRlX2NvdW50LCBOT19XQUlUX0lOVCwKKwkJCQkgICBkYXRhLCBkYXRhX2xlbik7CisJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKKworCWZvciAoaSA9IDA7IGkgPCBNU19NQVhfUkVUUllfQ09VTlQ7IGkrKykgeworCQlyZXR2YWwgPSBtc19zZW5kX2NtZChjaGlwLCBjbWQsIFdBSVRfSU5UKTsKKwkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBNU19NQVhfUkVUUllfQ09VTlQpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJLyogR0VUX0lOVCBSZWdpc3RlciAqLworCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19OT19FUlJPUik7CisJcmV0dmFsID0gbXNfcmVhZF9ieXRlcyhjaGlwLCBHRVRfSU5ULCAxLCBOT19XQUlUX0lOVCwgJnZhbCwgMSk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlpZiAoaW50X3N0YXQpCisJCSppbnRfc3RhdCA9IHZhbDsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworI2lmZGVmIE1TX1NQRUVEVVAKK3N0YXRpYyBpbnQgbXNfYXV0b19zZXRfY21kKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwKKwkJCSAgIHU4IHJlYWRfc3RhcnQsIHU4IHJlYWRfY291bnQsCisJCQkgICB1OCB3cml0ZV9zdGFydCwgdTggd3JpdGVfY291bnQsCisJCQkgICB1OCBjbWQsIHU4IGNmZywgdTggKmRhdGEsIGludCBkYXRhX2xlbiwKKwkJCSAgIHU4ICppbnRfc3RhdCkKK3sKKwlpbnQgcmV0dmFsOworCWludCBpOworCisJaWYgKCFkYXRhIHx8IChkYXRhX2xlbiA8PSAwKSB8fCAoZGF0YV9sZW4gPiAxMjgpKSB7CisJCVJUUzUxWF9ERUJVR1AoIm1zX2F1dG9fc2V0X2NtZCAoZGF0YV9sZW4gPSAlZClcbiIsIGRhdGFfbGVuKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwl9CisKKwlydHM1MXhfaW5pdF9jbWQoY2hpcCk7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19SRUFEX1NUQVJULCAweEZGLCByZWFkX3N0YXJ0KTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19SRUFEX0NPVU5ULCAweEZGLCByZWFkX2NvdW50KTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19XUklURV9TVEFSVCwgMHhGRiwgd3JpdGVfc3RhcnQpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX1dSSVRFX0NPVU5ULCAweEZGLCB3cml0ZV9jb3VudCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfQ09NTUFORCwgMHhGRiwgY21kKTsKKworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX1RSQU5TX0NGRywgMHhGRiwgY2ZnKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX0RBVEFfU09VUkNFLCAweDAxLAorCQkgICAgICAgUElOR1BPTkdfQlVGRkVSKTsKKworCWZvciAoaSA9IDA7IGkgPCBkYXRhX2xlbjsgaSsrKSB7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFBQQlVGX0JBU0UyICsgaSwgMHhGRiwKKwkJCSAgICAgICBkYXRhW2ldKTsKKwl9CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19UUkFOU0ZFUiwgMHhGRiwKKwkJICAgICAgIE1TX1RSQU5TRkVSX1NUQVJUIHwgTVNfVE1fU0VUX0NNRCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgQ0hFQ0tfUkVHX0NNRCwgTVNfVFJBTlNGRVIsIE1TX1RSQU5TRkVSX0VORCwKKwkJICAgICAgIE1TX1RSQU5TRkVSX0VORCk7CisKKwlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DUiB8IFNUQUdFX01TX1NUQVRVUywgMTAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHZhbCA9IHJ0czUxeF9nZXRfcnNwKGNoaXAsIDMsIDUwMDApOworCisJaWYgKENIRUNLX01TX1RSQU5TX0ZBSUwoY2hpcCwgcmV0dmFsKSkgeworCQlydHM1MXhfY2xlYXJfbXNfZXJyb3IoY2hpcCk7CisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJfQorCisJaWYgKGludF9zdGF0KQorCQkqaW50X3N0YXQgPSBjaGlwLT5yc3BfYnVmWzJdOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgbXNfc2V0X2luaXRfcGFyYShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCWludCByZXR2YWw7CisKKwlpZiAoQ0hLX0hHOEJJVChtc19jYXJkKSkgeworCQlpZiAoY2hpcC0+YXNpY19jb2RlKQorCQkJbXNfY2FyZC0+bXNfY2xvY2sgPSBjaGlwLT5vcHRpb24uYXNpY19tc19oZ19jbGs7CisJCWVsc2UKKwkJCW1zX2NhcmQtPm1zX2Nsb2NrID0gY2hpcC0+b3B0aW9uLmZwZ2FfbXNfaGdfY2xrOworCX0gZWxzZSBpZiAoQ0hLX01TUFJPKG1zX2NhcmQpIHx8IENIS19NUzRCSVQobXNfY2FyZCkpIHsKKwkJaWYgKGNoaXAtPmFzaWNfY29kZSkKKwkJCW1zX2NhcmQtPm1zX2Nsb2NrID0gY2hpcC0+b3B0aW9uLmFzaWNfbXNfNGJpdF9jbGs7CisJCWVsc2UKKwkJCW1zX2NhcmQtPm1zX2Nsb2NrID0gY2hpcC0+b3B0aW9uLmZwZ2FfbXNfNGJpdF9jbGs7CisJfSBlbHNlIHsKKwkJaWYgKGNoaXAtPmFzaWNfY29kZSkKKwkJCW1zX2NhcmQtPm1zX2Nsb2NrID0gMzg7CisJCWVsc2UKKwkJCW1zX2NhcmQtPm1zX2Nsb2NrID0gQ0xLXzQwOworCX0KKworCXJldHZhbCA9IHN3aXRjaF9jbG9jayhjaGlwLCBtc19jYXJkLT5tc19jbG9jayk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlyZXR2YWwgPSBydHM1MXhfc2VsZWN0X2NhcmQoY2hpcCwgTVNfQ0FSRCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2ludCBtc19zd2l0Y2hfY2xvY2soc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gcnRzNTF4X3NlbGVjdF9jYXJkKGNoaXAsIE1TX0NBUkQpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcmV0dmFsID0gc3dpdGNoX2Nsb2NrKGNoaXAsIG1zX2NhcmQtPm1zX2Nsb2NrKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgbXNfcHVsbF9jdGxfZGlzYWJsZShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJaWYgKENIRUNLX1BLRyhjaGlwLCBMUUZQNDgpKSB7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEwxLCAweEZGLCAweDU1KTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDIsIDB4RkYsIDB4NTUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMMywgMHhGRiwgMHg5NSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEw0LCAweEZGLCAweDU1KTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDUsIDB4RkYsIDB4NTUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMNiwgMHhGRiwgMHhBNSk7CisJfSBlbHNlIHsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDEsIDB4RkYsIDB4NjUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMMiwgMHhGRiwgMHg1NSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEwzLCAweEZGLCAweDk1KTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDQsIDB4RkYsIDB4NTUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMNSwgMHhGRiwgMHg1Nik7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEw2LCAweEZGLCAweDU5KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1zX3B1bGxfY3RsX2VuYWJsZShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJaWYgKENIRUNLX1BLRyhjaGlwLCBMUUZQNDgpKSB7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEwxLCAweEZGLCAweDU1KTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDIsIDB4RkYsIDB4NTUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMMywgMHhGRiwgMHg5NSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEw0LCAweEZGLCAweDU1KTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDUsIDB4RkYsIDB4NTUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMNiwgMHhGRiwgMHhBNSk7CisJfSBlbHNlIHsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDEsIDB4RkYsIDB4NjUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMMiwgMHhGRiwgMHg1NSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEwzLCAweEZGLCAweDk1KTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDQsIDB4RkYsIDB4NTUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMNSwgMHhGRiwgMHg1NSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEw2LCAweEZGLCAweDU5KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbXNfcHJlcGFyZV9yZXNldChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCWludCByZXR2YWw7CisKKwltc19jYXJkLT5tc190eXBlID0gMDsKKwltc19jYXJkLT5jaGVja19tc19mbG93ID0gMDsKKwltc19jYXJkLT5zd2l0Y2hfOGJpdF9mYWlsID0gMDsKKwltc19jYXJkLT5kZWxheV93cml0ZS5kZWxheV93cml0ZV9mbGFnID0gMDsKKworCW1zX2NhcmQtPnByb191bmRlcl9mb3JtYXR0aW5nID0gMDsKKworCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCWlmIChjaGlwLT5hc2ljX2NvZGUpIHsKKwkJbXNfcHVsbF9jdGxfZW5hYmxlKGNoaXApOworCX0gZWxzZSB7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIEZQR0FfUFVMTF9DVEwsCisJCQkgICAgICAgRlBHQV9NU19QVUxMX0NUTF9CSVQgfCAweDIwLCAwKTsKKwl9CisJLyogVHJpLXN0YXRlIE1TIG91dHB1dCAqLworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfT0UsIE1TX09VVFBVVF9FTiwgMCk7CisKKwlpZiAoIWNoaXAtPm9wdGlvbi5GVDJfZmFzdF9tb2RlKSB7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFdSX0NUTCwgUE9XRVJfTUFTSywKKwkJCSAgICAgICBQT1dFUl9PRkYpOworCX0KKworCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0MsIDEwMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlpZiAoIWNoaXAtPm9wdGlvbi5GVDJfZmFzdF9tb2RlKSB7CisJCXdhaXRfdGltZW91dCgyNTApOworCisJCWNhcmRfcG93ZXJfb24oY2hpcCwgTVNfQ0FSRCk7CisJCXdhaXRfdGltZW91dCgxNTApOworCisjaWZkZWYgU1VQUE9SVF9PQ1AKKwkJcnRzNTF4X2dldF9jYXJkX3N0YXR1cyhjaGlwLCAmKGNoaXAtPmNhcmRfc3RhdHVzKSk7CisJCS8qIGdldCBPQ1Agc3RhdHVzICovCisJCWNoaXAtPm9jcF9zdGF0ID0gKGNoaXAtPmNhcmRfc3RhdHVzID4+IDQpICYgMHgwMzsKKworCQlpZiAoY2hpcC0+b2NwX3N0YXQgJiAoTVNfT0NQX05PVyB8IE1TX09DUF9FVkVSKSkgeworCQkJUlRTNTFYX0RFQlVHUCgiT3ZlciBjdXJyZW50LCBPQ1BTVEFUIGlzIDB4JXhcbiIsCisJCQkJICAgICAgIGNoaXAtPm9jcF9zdGF0KTsKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCX0KKyNlbmRpZgorCX0KKworCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCS8qIEVuYWJsZSBNUyBPdXRwdXQgKi8KKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX09FLCBNU19PVVRQVVRfRU4sCisJCSAgICAgICBNU19PVVRQVVRfRU4pOworCisJLyogUmVzZXQgUmVnaXN0ZXJzICovCisJaWYgKGNoaXAtPmFzaWNfY29kZSkKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfQ0ZHLCAweEZGLAorCQkJICAgICAgIFNBTVBMRV9USU1FX1JJU0lORyB8IFBVU0hfVElNRV9ERUZBVUxUIHwKKwkJCSAgICAgICBOT19FWFRFTkRfVE9HR0xFIHwgTVNfQlVTX1dJRFRIXzEpOworCWVsc2UKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfQ0ZHLCAweEZGLAorCQkJICAgICAgIFNBTVBMRV9USU1FX0ZBTExJTkcgfCBQVVNIX1RJTUVfREVGQVVMVCB8CisJCQkgICAgICAgTk9fRVhURU5EX1RPR0dMRSB8IE1TX0JVU19XSURUSF8xKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19UUkFOU19DRkcsIDB4RkYsCisJCSAgICAgICBOT19XQUlUX0lOVCB8IE5PX0FVVE9fUkVBRF9JTlRfUkVHKTsKKworCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0MsIDEwMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlyZXR1cm4gbXNfc2V0X2luaXRfcGFyYShjaGlwKTsKK30KKworc3RhdGljIGludCBtc19pZGVudGlmeV9tZWRpYV90eXBlKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgaW50IHN3aXRjaF84Yml0X2J1cykKK3sKKwlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7CisJaW50IHJldHZhbCwgaTsKKwl1OCB2YWw7CisKKwlyZXR2YWwgPSBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgUHJvX1N0YXR1c1JlZywgNiwgU3lzdGVtUGFybSwgMSk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwkvKiBHZXQgUmVnaXN0ZXIgZm9ybSBNUy1QUk8gY2FyZCAqLworCWZvciAoaSA9IDA7IGkgPCBNU19NQVhfUkVUUllfQ09VTlQ7IGkrKykgeworCQlyZXR2YWwgPQorCQkgICAgbXNfdHJhbnNmZXJfdHBjKGNoaXAsIE1TX1RNX1JFQURfQllURVMsIFJFQURfUkVHLCA2LAorCQkJCSAgICBOT19XQUlUX0lOVCk7CisJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJUlRTNTFYX1JFQURfUkVHKGNoaXAsIFBQQlVGX0JBU0UyICsgMiwgJnZhbCk7CisJUlRTNTFYX0RFQlVHUCgiVHlwZSByZWdpc3RlcjogMHgleFxuIiwgdmFsKTsKKwlpZiAodmFsICE9IDB4MDEpIHsKKwkJaWYgKHZhbCAhPSAweDAyKQorCQkJbXNfY2FyZC0+Y2hlY2tfbXNfZmxvdyA9IDE7CisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJfQorCS8qIENhdGVnb3J5IFJlZ2lzdGVyICovCisJUlRTNTFYX1JFQURfUkVHKGNoaXAsIFBQQlVGX0JBU0UyICsgNCwgJnZhbCk7CisJUlRTNTFYX0RFQlVHUCgiQ2F0ZWdvcnkgcmVnaXN0ZXI6IDB4JXhcbiIsIHZhbCk7CisJaWYgKHZhbCAhPSAwKSB7CisJCW1zX2NhcmQtPmNoZWNrX21zX2Zsb3cgPSAxOworCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCX0KKwkvKiBDbGFzcyBSZWdpc3RlciAqLworCVJUUzUxWF9SRUFEX1JFRyhjaGlwLCBQUEJVRl9CQVNFMiArIDUsICZ2YWwpOworCVJUUzUxWF9ERUJVR1AoIkNsYXNzIHJlZ2lzdGVyOiAweCV4XG4iLCB2YWwpOworCWlmICh2YWwgPT0gMCkgeworCQlSVFM1MVhfUkVBRF9SRUcoY2hpcCwgUFBCVUZfQkFTRTIsICZ2YWwpOworCQlpZiAodmFsICYgV1JUX1BSVENUKQorCQkJY2hpcC0+Y2FyZF93cCB8PSBNU19DQVJEOworCQllbHNlCisJCQljaGlwLT5jYXJkX3dwICY9IH5NU19DQVJEOworCX0gZWxzZSBpZiAoKHZhbCA9PSAweDAxKSB8fCAodmFsID09IDB4MDIpIHx8ICh2YWwgPT0gMHgwMykpIHsKKwkJY2hpcC0+Y2FyZF93cCB8PSBNU19DQVJEOworCX0gZWxzZSB7CisJCW1zX2NhcmQtPmNoZWNrX21zX2Zsb3cgPSAxOworCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCX0KKworCW1zX2NhcmQtPm1zX3R5cGUgfD0gVFlQRV9NU1BSTzsKKworCS8qIENoZWNrIE1TUHJvLUhHIENhcmQsIHVzZSBJRiBNb2RlIFJlZ2lzdGVyIHRvIGRpc3Rpbmd1aXNoICovCisJUlRTNTFYX1JFQURfUkVHKGNoaXAsIFBQQlVGX0JBU0UyICsgMywgJnZhbCk7CisJUlRTNTFYX0RFQlVHUCgiSUYgTW9kZSByZWdpc3RlcjogMHgleFxuIiwgdmFsKTsKKwlpZiAodmFsID09IDApIHsKKwkJbXNfY2FyZC0+bXNfdHlwZSAmPSAweDBGOworCX0gZWxzZSBpZiAodmFsID09IDcpIHsKKwkJaWYgKHN3aXRjaF84Yml0X2J1cykKKwkJCW1zX2NhcmQtPm1zX3R5cGUgfD0gTVNfSEc7CisJCWVsc2UKKwkJCW1zX2NhcmQtPm1zX3R5cGUgJj0gMHgwRjsKKwl9IGVsc2UgeworCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCX0KKworCS8qIGVuZCBQcm9jZWR1cmUgdG8gaWRlbnRpZnkgTWVkaWEgVHlwZSAqLworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtc19jb25maXJtX2NwdV9zdGFydHVwKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlpbnQgcmV0dmFsLCBpLCBrOworCXU4IHZhbDsKKworCS8qIENvbmZpcm0gQ1BVIFN0YXJ0VXAgKi8KKwlrID0gMDsKKwlkbyB7CisJCWlmIChtb25pdG9yX2NhcmRfY2QoY2hpcCwgTVNfQ0FSRCkgPT0gQ0RfTk9UX0VYSVNUKQorCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgTVNfTUFYX1JFVFJZX0NPVU5UOyBpKyspIHsKKwkJCXJldHZhbCA9CisJCQkgICAgbXNfcmVhZF9ieXRlcyhjaGlwLCBHRVRfSU5ULCAxLCBOT19XQUlUX0lOVCwgJnZhbCwKKwkJCQkJICAxKTsKKwkJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKQorCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKworCQlpZiAoayA+IDEwMCkKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWsrKzsKKwkJd2FpdF90aW1lb3V0KDEwMCk7CisJfSB3aGlsZSAoISh2YWwgJiBJTlRfUkVHX0NFRCkpOworCisJZm9yIChpID0gMDsgaSA8IE1TX01BWF9SRVRSWV9DT1VOVDsgaSsrKSB7CisJCXJldHZhbCA9IG1zX3JlYWRfYnl0ZXMoY2hpcCwgR0VUX0lOVCwgMSwgTk9fV0FJVF9JTlQsICZ2YWwsIDEpOworCQlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKQorCQkJYnJlYWs7CisJfQorCWlmIChpID09IE1TX01BWF9SRVRSWV9DT1VOVCkKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKworCWlmICh2YWwgJiBJTlRfUkVHX0VSUikgeworCQlpZiAodmFsICYgSU5UX1JFR19DTUROSykgewkvKiBDTUROSyA9IDEgKi8KKwkJCWNoaXAtPmNhcmRfd3AgfD0gKE1TX0NBUkQpOworCQl9IGVsc2UgewkvKiBDTUROSyA9IDAgKi8KKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCX0KKwl9CisJLyotLSAgZW5kIGNvbmZpcm0gQ1BVIHN0YXJ0dXAgKi8KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtc19zd2l0Y2hfcGFyYWxsZWxfYnVzKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlpbnQgcmV0dmFsLCBpOworCXU4IGRhdGFbMl07CisKKwlkYXRhWzBdID0gUEFSQUxMRUxfNEJJVF9JRjsKKwlkYXRhWzFdID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgTVNfTUFYX1JFVFJZX0NPVU5UOyBpKyspIHsKKwkJcmV0dmFsID0KKwkJICAgIG1zX3dyaXRlX2J5dGVzKGNoaXAsIFdSSVRFX1JFRywgMSwgTk9fV0FJVF9JTlQsIGRhdGEsIDIpOworCQlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKQorCQkJYnJlYWs7CisJfQorCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1zX3N3aXRjaF84Yml0X2J1cyhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCWludCByZXR2YWwsIGk7CisJdTggZGF0YVsyXTsKKworCWRhdGFbMF0gPSBQQVJBTExFTF84QklUX0lGOworCWRhdGFbMV0gPSAwOworCWZvciAoaSA9IDA7IGkgPCBNU19NQVhfUkVUUllfQ09VTlQ7IGkrKykgeworCQlyZXR2YWwgPQorCQkgICAgbXNfd3JpdGVfYnl0ZXMoY2hpcCwgV1JJVEVfUkVHLCAxLCBOT19XQUlUX0lOVCwgZGF0YSwgMik7CisJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlicmVhazsKKwl9CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKworCVJUUzUxWF9XUklURV9SRUcoY2hpcCwgTVNfQ0ZHLCAweDk4LAorCQkJIE1TX0JVU19XSURUSF84IHwgU0FNUExFX1RJTUVfRkFMTElORyk7CisJbXNfY2FyZC0+bXNfdHlwZSB8PSBNU184QklUOworCisJcmV0dmFsID0gbXNfc2V0X2luaXRfcGFyYShjaGlwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCWZvciAoaSA9IDA7IGkgPCBNU19NQVhfUkVUUllfQ09VTlQ7IGkrKykgeworCQlyZXR2YWwgPQorCQkgICAgbXNfdHJhbnNmZXJfdHBjKGNoaXAsIE1TX1RNX1JFQURfQllURVMsIEdFVF9JTlQsIDEsCisJCQkJICAgIE5PX1dBSVRfSU5UKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtc19wcm9fcmVzZXRfZmxvdyhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIGludCBzd2l0Y2hfOGJpdF9idXMpCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCWludCByZXR2YWwsIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXJldHZhbCA9IG1zX3ByZXBhcmVfcmVzZXQoY2hpcCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCQlyZXR2YWwgPSBtc19pZGVudGlmeV9tZWRpYV90eXBlKGNoaXAsIHN3aXRjaF84Yml0X2J1cyk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCQlyZXR2YWwgPSBtc19jb25maXJtX2NwdV9zdGFydHVwKGNoaXApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwkJcmV0dmFsID0gbXNfc3dpdGNoX3BhcmFsbGVsX2J1cyhjaGlwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJaWYgKG1vbml0b3JfY2FyZF9jZChjaGlwLCBNU19DQVJEKSA9PSBDRF9OT1RfRVhJU1QpCisJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCVJUUzUxWF9XUklURV9SRUcoY2hpcCwgTVNfQ0ZHLCAweDE4LCBNU19CVVNfV0lEVEhfNCk7CisKKwlSVFM1MVhfV1JJVEVfUkVHKGNoaXAsIE1TX0NGRywgUFVTSF9USU1FX09ERCwgUFVTSF9USU1FX09ERCk7CisKKwlyZXR2YWwgPSBtc19zZXRfaW5pdF9wYXJhKGNoaXApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJaWYgKENIS19NU0hHKG1zX2NhcmQpICYmIHN3aXRjaF84Yml0X2J1cykgeworCQlyZXR2YWwgPSBtc19zd2l0Y2hfOGJpdF9idXMoY2hpcCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCW1zX2NhcmQtPnN3aXRjaF84Yml0X2ZhaWwgPSAxOworCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCX0KKwl9CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKKyNpZmRlZiBYQ19QT1dFUkNMQVNTCitzdGF0aWMgaW50IG1zeGNfY2hhbmdlX3Bvd2VyKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggbW9kZSkKK3sKKwlpbnQgcmV0dmFsOworCXU4IGJ1Zls2XTsKKworCW1zX2NsZWFudXBfd29yayhjaGlwKTsKKworCS8qIFNldCBQYXJhbWV0ZXIgUmVnaXN0ZXIgKi8KKwlyZXR2YWwgPSBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgMCwgMCwgUHJvX0RhdGFDb3VudDEsIDYpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJYnVmWzBdID0gMDsKKwlidWZbMV0gPSBtb2RlOworCWJ1ZlsyXSA9IDA7CisJYnVmWzNdID0gMDsKKwlidWZbNF0gPSAwOworCWJ1Zls1XSA9IDA7CisKKwlyZXR2YWwgPSBtc193cml0ZV9ieXRlcyhjaGlwLCBQUk9fV1JJVEVfUkVHLCA2LCBOT19XQUlUX0lOVCwgYnVmLCA2KTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHZhbCA9IG1zX3NlbmRfY21kKGNoaXAsIFhDX0NIR19QT1dFUiwgV0FJVF9JTlQpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJUlRTNTFYX1JFQURfUkVHKGNoaXAsIE1TX1RSQU5TX0NGRywgYnVmKTsKKwlpZiAoYnVmWzBdICYgKE1TX0lOVF9DTUROSyB8IE1TX0lOVF9FUlIpKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgbXNfcmVhZF9hdHRyaWJ1dGVfaW5mbyhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCWludCByZXR2YWwsIGk7CisJdTggdmFsLCAqYnVmLCBjbGFzc19jb2RlLCBkZXZpY2VfdHlwZSwgc3ViX2NsYXNzLCBkYXRhWzE2XTsKKwl1MTYgdG90YWxfYmxrID0gMCwgYmxrX3NpemUgPSAwOworI2lmZGVmIFNVUFBPUlRfTVNYQworCXUzMiB4Y190b3RhbF9ibGsgPSAwLCB4Y19ibGtfc2l6ZSA9IDA7CisjZW5kaWYKKwl1MzIgc3lzX2luZm9fYWRkciA9IDAsIHN5c19pbmZvX3NpemU7CisjaWZkZWYgU1VQUE9SVF9QQ0dMXzFQMTgKKwl1MzIgbW9kZWxfbmFtZV9hZGRyID0gMCwgbW9kZWxfbmFtZV9zaXplOworCWludCBmb3VuZF9zeXNfaW5mbyA9IDAsIGZvdW5kX21vZGVsX25hbWUgPSAwOworI2VuZGlmCisKKwlyZXR2YWwgPSBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgUHJvX0ludFJlZywgMiwgUHJvX1N5c3RlbVBhcm0sIDcpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJaWYgKENIS19NUzhCSVQobXNfY2FyZCkpCisJCWRhdGFbMF0gPSBQQVJBTExFTF84QklUX0lGOworCWVsc2UKKwkJZGF0YVswXSA9IFBBUkFMTEVMXzRCSVRfSUY7CisJZGF0YVsxXSA9IDA7CisKKwlkYXRhWzJdID0gMHg0MDsKKwlkYXRhWzNdID0gMDsKKwlkYXRhWzRdID0gMDsKKwlkYXRhWzVdID0gMDsKKwkvKiBTdGFydCBhZGRyZXNzIDAgKi8KKwlkYXRhWzZdID0gMDsKKwlkYXRhWzddID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNU19NQVhfUkVUUllfQ09VTlQ7IGkrKykgeworCQlyZXR2YWwgPQorCQkgICAgbXNfd3JpdGVfYnl0ZXMoY2hpcCwgUFJPX1dSSVRFX1JFRywgNywgTk9fV0FJVF9JTlQsIGRhdGEsCisJCQkJICAgOCk7CisJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlicmVhazsKKwl9CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlidWYgPSBrbWFsbG9jKDY0ICogNTEyLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfTk9NRU0pOworCisJZm9yIChpID0gMDsgaSA8IE1TX01BWF9SRVRSWV9DT1VOVDsgaSsrKSB7CisJCXJldHZhbCA9IG1zX3NlbmRfY21kKGNoaXAsIFBST19SRUFEX0FUUkIsIFdBSVRfSU5UKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCWNvbnRpbnVlOworCisJCXJldHZhbCA9IHJ0czUxeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIE1TX1RSQU5TX0NGRywgJnZhbCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWtmcmVlKGJ1Zik7CisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQl9CisJCWlmICghKHZhbCAmIE1TX0lOVF9CUkVRKSkgeworCQkJa2ZyZWUoYnVmKTsKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCX0KKworCQlyZXR2YWwgPQorCQkgICAgbXNfdHJhbnNmZXJfZGF0YShjaGlwLCBNU19UTV9BVVRPX1JFQUQsIFBST19SRUFEX0xPTkdfREFUQSwKKwkJCQkgICAgIDB4NDAsIFdBSVRfSU5ULCAwLCAwLCBidWYsIDY0ICogNTEyKTsKKwkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKKwkJCWJyZWFrOworCQllbHNlCisJCQlydHM1MXhfY2xlYXJfbXNfZXJyb3IoY2hpcCk7CisJfQorCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJa2ZyZWUoYnVmKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJfQorCisJaSA9IDA7CisJZG8geworCQlyZXR2YWwgPSBydHM1MXhfcmVhZF9yZWdpc3RlcihjaGlwLCBNU19UUkFOU19DRkcsICZ2YWwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlrZnJlZShidWYpOworCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCX0KKworCQlpZiAoKHZhbCAmIE1TX0lOVF9DRUQpIHx8ICEodmFsICYgTVNfSU5UX0JSRVEpKQorCQkJYnJlYWs7CisKKwkJcmV0dmFsID0KKwkJICAgIG1zX3RyYW5zZmVyX3RwYyhjaGlwLCBNU19UTV9OT1JNQUxfUkVBRCwgUFJPX1JFQURfTE9OR19EQVRBLAorCQkJCSAgICAwLCBXQUlUX0lOVCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWtmcmVlKGJ1Zik7CisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkJfQorCisJCWkrKzsKKwl9IHdoaWxlIChpIDwgMTAyNCk7CisKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCWtmcmVlKGJ1Zik7CisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKworCWlmICgoYnVmWzBdICE9IDB4YTUpICYmIChidWZbMV0gIT0gMHhjMykpIHsKKwkJLyogU2lnbmF0dXJlIGNvZGUgaXMgd3JvbmcgKi8KKwkJa2ZyZWUoYnVmKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwl9CisKKwlpZiAoKGJ1Zls0XSA8IDEpIHx8IChidWZbNF0gPiAxMikpIHsKKwkJa2ZyZWUoYnVmKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgYnVmWzRdOyBpKyspIHsKKwkJaW50IGN1cl9hZGRyX29mZiA9IDE2ICsgaSAqIDEyOworCisjaWZkZWYgU1VQUE9SVF9NU1hDCisJCWlmICgoYnVmW2N1cl9hZGRyX29mZiArIDhdID09IDB4MTApCisJCSAgICB8fCAoYnVmW2N1cl9hZGRyX29mZiArIDhdID09IDB4MTMpKSB7CisjZWxzZQorCQlpZiAoYnVmW2N1cl9hZGRyX29mZiArIDhdID09IDB4MTApIHsKKyNlbmRpZgorCQkJc3lzX2luZm9fYWRkciA9ICgodTMyKSBidWZbY3VyX2FkZHJfb2ZmICsgMF0gPDwgMjQpIHwKKwkJCSAgICAoKHUzMikgYnVmW2N1cl9hZGRyX29mZiArIDFdIDw8IDE2KSB8CisJCQkgICAgKCh1MzIpIGJ1ZltjdXJfYWRkcl9vZmYgKyAyXSA8PCA4KSB8CisJCQkgICAgYnVmW2N1cl9hZGRyX29mZiArIDNdOworCQkJc3lzX2luZm9fc2l6ZSA9CisJCQkgICAgKCh1MzIpIGJ1ZltjdXJfYWRkcl9vZmYgKyA0XSA8PCAyNCkgfAorCQkJICAgICgodTMyKSBidWZbY3VyX2FkZHJfb2ZmICsgNV0gPDwgMTYpIHwKKwkJCSAgICAoKHUzMikgYnVmW2N1cl9hZGRyX29mZiArIDZdIDw8IDgpIHwKKwkJCSAgICBidWZbY3VyX2FkZHJfb2ZmICsgN107CisJCQlSVFM1MVhfREVCVUdQKCJzeXNfaW5mb19hZGRyID0gMHgleCwiCisJCQkJCSJzeXNfaW5mb19zaXplID0gMHgleFxuIiwKKwkJCQkJCXN5c19pbmZvX2FkZHIsIHN5c19pbmZvX3NpemUpOworCQkJaWYgKHN5c19pbmZvX3NpemUgIT0gOTYpIHsKKwkJCQlrZnJlZShidWYpOworCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQl9CisJCQlpZiAoc3lzX2luZm9fYWRkciA8IDB4MUEwKSB7CisJCQkJa2ZyZWUoYnVmKTsKKwkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJfQorCQkJaWYgKChzeXNfaW5mb19zaXplICsgc3lzX2luZm9fYWRkcikgPiAweDgwMDApIHsKKwkJCQlrZnJlZShidWYpOworCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQl9CisjaWZkZWYgU1VQUE9SVF9NU1hDCisJCQlpZiAoYnVmW2N1cl9hZGRyX29mZiArIDhdID09IDB4MTMpCisJCQkJbXNfY2FyZC0+bXNfdHlwZSB8PSBNU19YQzsKKyNlbmRpZgorI2lmZGVmIFNVUFBPUlRfUENHTF8xUDE4CisJCQlmb3VuZF9zeXNfaW5mbyA9IDE7CisjZWxzZQorCQkJYnJlYWs7CisjZW5kaWYKKwkJfQorI2lmZGVmIFNVUFBPUlRfUENHTF8xUDE4CisJCWlmIChidWZbY3VyX2FkZHJfb2ZmICsgOF0gPT0gMHgxNSkgeworCQkJbW9kZWxfbmFtZV9hZGRyID0gKCh1MzIpIGJ1ZltjdXJfYWRkcl9vZmYgKyAwXSA8PCAyNCkgfAorCQkJICAgICgodTMyKSBidWZbY3VyX2FkZHJfb2ZmICsgMV0gPDwgMTYpIHwKKwkJCSAgICAoKHUzMikgYnVmW2N1cl9hZGRyX29mZiArIDJdIDw8IDgpIHwKKwkJCSAgICBidWZbY3VyX2FkZHJfb2ZmICsgM107CisJCQltb2RlbF9uYW1lX3NpemUgPQorCQkJICAgICgodTMyKSBidWZbY3VyX2FkZHJfb2ZmICsgNF0gPDwgMjQpIHwKKwkJCSAgICAoKHUzMikgYnVmW2N1cl9hZGRyX29mZiArIDVdIDw8IDE2KSB8CisJCQkgICAgKCh1MzIpIGJ1ZltjdXJfYWRkcl9vZmYgKyA2XSA8PCA4KSB8CisJCQkgICAgYnVmW2N1cl9hZGRyX29mZiArIDddOworCQkJUlRTNTFYX0RFQlVHUCgibW9kZWxfbmFtZV9hZGRyID0gMHgleCwiCisJCQkJCSJtb2RlbF9uYW1lX3NpemUgPSAweCV4XG4iLAorCQkJCQltb2RlbF9uYW1lX2FkZHIsIG1vZGVsX25hbWVfc2l6ZSk7CisJCQlpZiAobW9kZWxfbmFtZV9zaXplICE9IDQ4KSB7CisJCQkJa2ZyZWUoYnVmKTsKKwkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJfQorCQkJaWYgKG1vZGVsX25hbWVfYWRkciA8IDB4MUEwKSB7CisJCQkJa2ZyZWUoYnVmKTsKKwkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJfQorCQkJaWYgKChtb2RlbF9uYW1lX3NpemUgKyBtb2RlbF9uYW1lX2FkZHIpID4gMHg4MDAwKSB7CisJCQkJa2ZyZWUoYnVmKTsKKwkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJfQorCisJCQlmb3VuZF9tb2RlbF9uYW1lID0gMTsKKwkJfQorCisJCWlmIChmb3VuZF9zeXNfaW5mbyAmJiBmb3VuZF9tb2RlbF9uYW1lKQorCQkJYnJlYWs7CisjZW5kaWYKKwl9CisKKwlpZiAoaSA9PSBidWZbNF0pIHsKKwkJa2ZyZWUoYnVmKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwl9CisKKwljbGFzc19jb2RlID0gYnVmW3N5c19pbmZvX2FkZHIgKyAwXTsKKwlkZXZpY2VfdHlwZSA9IGJ1ZltzeXNfaW5mb19hZGRyICsgNTZdOworCXN1Yl9jbGFzcyA9IGJ1ZltzeXNfaW5mb19hZGRyICsgNDZdOworI2lmZGVmIFNVUFBPUlRfTVNYQworCWlmIChDSEtfTVNYQyhtc19jYXJkKSkgeworCQl4Y190b3RhbF9ibGsgPSAoKHUzMikgYnVmW3N5c19pbmZvX2FkZHIgKyA2XSA8PCAyNCkgfAorCQkgICAgKCh1MzIpIGJ1ZltzeXNfaW5mb19hZGRyICsgN10gPDwgMTYpIHwKKwkJICAgICgodTMyKSBidWZbc3lzX2luZm9fYWRkciArIDhdIDw8IDgpIHwKKwkJICAgIGJ1ZltzeXNfaW5mb19hZGRyICsgOV07CisJCXhjX2Jsa19zaXplID0gKCh1MzIpIGJ1ZltzeXNfaW5mb19hZGRyICsgMzJdIDw8IDI0KSB8CisJCSAgICAoKHUzMikgYnVmW3N5c19pbmZvX2FkZHIgKyAzM10gPDwgMTYpIHwKKwkJICAgICgodTMyKSBidWZbc3lzX2luZm9fYWRkciArIDM0XSA8PCA4KSB8CisJCSAgICBidWZbc3lzX2luZm9fYWRkciArIDM1XTsKKwkJUlRTNTFYX0RFQlVHUCgieGNfdG90YWxfYmxrID0gMHgleCwgeGNfYmxrX3NpemUgPSAweCV4XG4iLAorCQkJICAgICAgIHhjX3RvdGFsX2JsaywgeGNfYmxrX3NpemUpOworCX0gZWxzZSB7CisJCXRvdGFsX2JsayA9CisJCSAgICAoKHUxNikgYnVmW3N5c19pbmZvX2FkZHIgKyA2XSA8PCA4KSB8IGJ1ZltzeXNfaW5mb19hZGRyICsKKwkJCQkJCQkgICAgICA3XTsKKwkJYmxrX3NpemUgPQorCQkgICAgKCh1MTYpIGJ1ZltzeXNfaW5mb19hZGRyICsgMl0gPDwgOCkgfCBidWZbc3lzX2luZm9fYWRkciArCisJCQkJCQkJICAgICAgM107CisJCVJUUzUxWF9ERUJVR1AoInRvdGFsX2JsayA9IDB4JXgsIGJsa19zaXplID0gMHgleFxuIiwgdG90YWxfYmxrLAorCQkJICAgICAgIGJsa19zaXplKTsKKwl9CisjZWxzZQorCXRvdGFsX2JsayA9CisJICAgICgodTE2KSBidWZbc3lzX2luZm9fYWRkciArIDZdIDw8IDgpIHwgYnVmW3N5c19pbmZvX2FkZHIgKyA3XTsKKwlibGtfc2l6ZSA9ICgodTE2KSBidWZbc3lzX2luZm9fYWRkciArIDJdIDw8IDgpIHwgYnVmW3N5c19pbmZvX2FkZHIgKyAzXTsKKwlSVFM1MVhfREVCVUdQKCJ0b3RhbF9ibGsgPSAweCV4LCBibGtfc2l6ZSA9IDB4JXhcbiIsIHRvdGFsX2JsaywKKwkJICAgICAgIGJsa19zaXplKTsKKyNlbmRpZgorCisJUlRTNTFYX0RFQlVHUCgiY2xhc3NfY29kZSA9IDB4JXgsIGRldmljZV90eXBlID0gMHgleCwiCisJCQkic3ViX2NsYXNzID0gMHgleFxuIiwKKwkJCQljbGFzc19jb2RlLCBkZXZpY2VfdHlwZSwgc3ViX2NsYXNzKTsKKworCW1lbWNweShtc19jYXJkLT5yYXdfc3lzX2luZm8sIGJ1ZiArIHN5c19pbmZvX2FkZHIsIDk2KTsKKyNpZmRlZiBTVVBQT1JUX1BDR0xfMVAxOAorCW1lbWNweShtc19jYXJkLT5yYXdfbW9kZWxfbmFtZSwgYnVmICsgbW9kZWxfbmFtZV9hZGRyLCA0OCk7CisjZW5kaWYKKworCWtmcmVlKGJ1Zik7CisKKwkvKiBDb25maXJtIFN5c3RlbSBJbmZvcm1hdGlvbiAqLworI2lmZGVmIFNVUFBPUlRfTVNYQworCWlmIChDSEtfTVNYQyhtc19jYXJkKSkgeworCQlpZiAoY2xhc3NfY29kZSAhPSAweDAzKQorCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwl9IGVsc2UgeworCQlpZiAoY2xhc3NfY29kZSAhPSAweDAyKQorCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwl9CisjZWxzZQorCWlmIChjbGFzc19jb2RlICE9IDB4MDIpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisjZW5kaWYKKworCWlmIChkZXZpY2VfdHlwZSAhPSAweDAwKSB7CisJCWlmICgoZGV2aWNlX3R5cGUgPT0gMHgwMSkgfHwgKGRldmljZV90eXBlID09IDB4MDIpCisJCSAgICB8fCAoZGV2aWNlX3R5cGUgPT0gMHgwMykpCisJCQljaGlwLT5jYXJkX3dwIHw9IE1TX0NBUkQ7CisJCWVsc2UKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJfQorCWlmIChzdWJfY2xhc3MgJiAweEMwKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJUlRTNTFYX0RFQlVHUCgiY2xhc3NfY29kZTogMHgleCwgZGV2aWNlX3R5cGU6IDB4JXgsIHN1Yl9jbGFzczogMHgleFxuIiwKKwkJICAgICAgIGNsYXNzX2NvZGUsIGRldmljZV90eXBlLCBzdWJfY2xhc3MpOworCisjaWZkZWYgU1VQUE9SVF9NU1hDCisJaWYgKENIS19NU1hDKG1zX2NhcmQpKSB7CisJCWNoaXAtPmNhcGFjaXR5W2NoaXAtPmNhcmQybHVuW01TX0NBUkRdXSA9IG1zX2NhcmQtPmNhcGFjaXR5ID0KKwkJICAgIHhjX3RvdGFsX2JsayAqIHhjX2Jsa19zaXplOworCX0gZWxzZSB7CisJCWNoaXAtPmNhcGFjaXR5W2NoaXAtPmNhcmQybHVuW01TX0NBUkRdXSA9IG1zX2NhcmQtPmNhcGFjaXR5ID0KKwkJICAgIHRvdGFsX2JsayAqIGJsa19zaXplOworCX0KKyNlbHNlCisJY2hpcC0+Y2FwYWNpdHlbY2hpcC0+Y2FyZDJsdW5bTVNfQ0FSRF1dID0gbXNfY2FyZC0+Y2FwYWNpdHkgPQorCSAgICB0b3RhbF9ibGsgKiBibGtfc2l6ZTsKKyNlbmRpZgorCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCisjaWZkZWYgU1VQUE9SVF9NQUdJQ19HQVRFCitpbnQgbWdfc2V0X3RwY19wYXJhX3N1YihzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIGludCB0eXBlLCB1OCBtZ19lbnRyeV9udW0pOworI2VuZGlmCisKK3N0YXRpYyBpbnQgcmVzZXRfbXNfcHJvKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7CisJaW50IHJldHZhbDsKKyNpZmRlZiBYQ19QT1dFUkNMQVNTCisJdTggY2hhbmdlX3Bvd2VyX2NsYXNzID0gMjsKKyNlbmRpZgorCisjaWZkZWYgWENfUE9XRVJDTEFTUworUmV0cnk6CisjZW5kaWYKKwlyZXR2YWwgPSBtc19wcm9fcmVzZXRfZmxvdyhjaGlwLCAxKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCWlmIChtc19jYXJkLT5zd2l0Y2hfOGJpdF9mYWlsKSB7CisJCQlyZXR2YWwgPSBtc19wcm9fcmVzZXRfZmxvdyhjaGlwLCAwKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCX0gZWxzZSB7CisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkJfQorCX0KKworCXJldHZhbCA9IG1zX3JlYWRfYXR0cmlidXRlX2luZm8oY2hpcCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisjaWZkZWYgWENfUE9XRVJDTEFTUworCWlmIChDSEtfSEc4QklUKG1zX2NhcmQpKQorCQljaGFuZ2VfcG93ZXJfY2xhc3MgPSAwOworCisJaWYgKGNoYW5nZV9wb3dlcl9jbGFzcyAmJiBDSEtfTVNYQyhtc19jYXJkKSkgeworCQl1OCBwb3dlcl9jbGFzc19tb2RlID0gKG1zX2NhcmQtPnJhd19zeXNfaW5mb1s0Nl0gJiAweDE4KSA+PiAzOworCQlSVFM1MVhfREVCVUdQKCJwb3dlcl9jbGFzc19tb2RlID0gMHgleCIsIHBvd2VyX2NsYXNzX21vZGUpOworCQlpZiAoY2hhbmdlX3Bvd2VyX2NsYXNzID4gcG93ZXJfY2xhc3NfbW9kZSkKKwkJCWNoYW5nZV9wb3dlcl9jbGFzcyA9IHBvd2VyX2NsYXNzX21vZGU7CisJCWlmIChjaGFuZ2VfcG93ZXJfY2xhc3MpIHsKKwkJCXJldHZhbCA9IG1zeGNfY2hhbmdlX3Bvd2VyKGNoaXAsIGNoYW5nZV9wb3dlcl9jbGFzcyk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJY2hhbmdlX3Bvd2VyX2NsYXNzLS07CisJCQkJZ290byBSZXRyeTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisjaWZkZWYgU1VQUE9SVF9NQUdJQ19HQVRFCisJcmV0dmFsID0gbWdfc2V0X3RwY19wYXJhX3N1YihjaGlwLCAwLCAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKyNlbmRpZgorCisJaWYgKENIS19IRzhCSVQobXNfY2FyZCkpCisJCWNoaXAtPmNhcmRfYnVzX3dpZHRoW2NoaXAtPmNhcmQybHVuW01TX0NBUkRdXSA9IDg7CisJZWxzZQorCQljaGlwLT5jYXJkX2J1c193aWR0aFtjaGlwLT5jYXJkMmx1bltNU19DQVJEXV0gPSA0OworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1zX3JlYWRfc3RhdHVzX3JlZyhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJaW50IHJldHZhbDsKKwl1OCB2YWxbMl07CisKKwlyZXR2YWwgPSBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgU3RhdHVzUmVnMCwgMiwgMCwgMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlyZXR2YWwgPSBtc19yZWFkX2J5dGVzKGNoaXAsIFJFQURfUkVHLCAyLCBOT19XQUlUX0lOVCwgdmFsLCAyKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwlpZiAodmFsWzFdICYgKFNUU19VQ0RUIHwgU1RTX1VDRVggfCBTVFNfVUNGRykpIHsKKwkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0ZMQVNIX1JFQURfRVJST1IpOworCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtc19jaGVja19ib290X2Jsb2NrKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTE2IGJsb2NrX2FkZHIpCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCWludCByZXR2YWw7CisJdTggZXh0cmFbTVNfRVhUUkFfU0laRV0sIGRhdGFbMTBdLCB2YWwgPSAwOworCisJaWYgKENIS19NUzRCSVQobXNfY2FyZCkpIHsKKwkJLyogUGFyYWxsZWwgaW50ZXJmYWNlICovCisJCWRhdGFbMF0gPSAweDg4OworCX0gZWxzZSB7CisJCS8qIFNlcmlhbCBpbnRlcmZhY2UgKi8KKwkJZGF0YVswXSA9IDB4ODA7CisJfQorCS8qIEJsb2NrIEFkZHJlc3MgKi8KKwlkYXRhWzFdID0gMDsKKwlkYXRhWzJdID0gKHU4KSAoYmxvY2tfYWRkciA+PiA4KTsKKwlkYXRhWzNdID0gKHU4KSBibG9ja19hZGRyOworCS8qIFBhZ2UgTnVtYmVyCisJICogRXh0cmEgZGF0YSBhY2Nlc3MgbW9kZSAqLworCWRhdGFbNF0gPSAweDQwOworCWRhdGFbNV0gPSAwOworCisJcmV0dmFsID0gbXNfc2V0X2NtZChjaGlwLCBPdmVyd3JpdGVGbGFnLCBNU19FWFRSQV9TSVpFLCBTeXN0ZW1QYXJtLCA2LAorCQkJICAgIEJMT0NLX1JFQUQsIFdBSVRfSU5ULCBkYXRhLCA2LCAmdmFsKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCWlmICh2YWwgJiBJTlRfUkVHX0NNRE5LKSB7CisJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19DTURfTkspOworCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCX0KKwlpZiAodmFsICYgSU5UX1JFR19DRUQpIHsKKwkJaWYgKHZhbCAmIElOVF9SRUdfRVJSKSB7CisJCQlyZXR2YWwgPSBtc19yZWFkX3N0YXR1c19yZWcoY2hpcCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCQkJcmV0dmFsID0KKwkJCSAgICBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgT3ZlcndyaXRlRmxhZywKKwkJCQkJICAgICAgIE1TX0VYVFJBX1NJWkUsIFN5c3RlbVBhcm0sIDYpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkJfQorCX0KKworCXJldHZhbCA9CisJICAgIG1zX3JlYWRfYnl0ZXMoY2hpcCwgUkVBRF9SRUcsIE1TX0VYVFJBX1NJWkUsIE5PX1dBSVRfSU5ULCBleHRyYSwKKwkJCSAgTVNfRVhUUkFfU0laRSk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlpZiAoIShleHRyYVswXSAmIEJMT0NLX09LKSB8fCAoZXh0cmFbMV0gJiBOT1RfQk9PVF9CTE9DSykpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbXNfcmVhZF9leHRyYV9kYXRhKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwKKwkJCSAgICAgIHUxNiBibG9ja19hZGRyLCB1OCBwYWdlX251bSwgdTggKmJ1ZiwKKwkJCSAgICAgIGludCBidWZfbGVuKQoreworCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKwlpbnQgcmV0dmFsOworCXU4IHZhbCA9IDAsIGRhdGFbMTBdOworCisJaWYgKENIS19NUzRCSVQobXNfY2FyZCkpIHsKKwkJLyogUGFyYWxsZWwgaW50ZXJmYWNlICovCisJCWRhdGFbMF0gPSAweDg4OworCX0gZWxzZSB7CisJCS8qIFNlcmlhbCBpbnRlcmZhY2UgKi8KKwkJZGF0YVswXSA9IDB4ODA7CisJfQorCS8qIEJsb2NrIEFkZHJlc3MgKi8KKwlkYXRhWzFdID0gMDsKKwlkYXRhWzJdID0gKHU4KSAoYmxvY2tfYWRkciA+PiA4KTsKKwlkYXRhWzNdID0gKHU4KSBibG9ja19hZGRyOworCS8qIFBhZ2UgTnVtYmVyCisJICogRXh0cmEgZGF0YSBhY2Nlc3MgbW9kZSAqLworCWRhdGFbNF0gPSAweDQwOworCWRhdGFbNV0gPSBwYWdlX251bTsKKworI2lmZGVmIE1TX1NQRUVEVVAKKwlyZXR2YWwgPQorCSAgICBtc19hdXRvX3NldF9jbWQoY2hpcCwgT3ZlcndyaXRlRmxhZywgTVNfRVhUUkFfU0laRSwgU3lzdGVtUGFybSwgNiwKKwkJCSAgICBCTE9DS19SRUFELCBXQUlUX0lOVCwgZGF0YSwgNiwgJnZhbCk7CisjZWxzZQorCXJldHZhbCA9IG1zX3NldF9jbWQoY2hpcCwgT3ZlcndyaXRlRmxhZywgTVNfRVhUUkFfU0laRSwgU3lzdGVtUGFybSwgNiwKKwkJCSAgICBCTE9DS19SRUFELCBXQUlUX0lOVCwgZGF0YSwgNiwgJnZhbCk7CisjZW5kaWYKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCWlmICh2YWwgJiBJTlRfUkVHX0NNRE5LKSB7CisJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19DTURfTkspOworCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCX0KKwlpZiAodmFsICYgSU5UX1JFR19DRUQpIHsKKwkJaWYgKHZhbCAmIElOVF9SRUdfRVJSKSB7CisJCQlyZXR2YWwgPSBtc19yZWFkX3N0YXR1c19yZWcoY2hpcCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCQkJcmV0dmFsID0KKwkJCSAgICBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgT3ZlcndyaXRlRmxhZywKKwkJCQkJICAgICAgIE1TX0VYVFJBX1NJWkUsIFN5c3RlbVBhcm0sIDYpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkJfQorCX0KKworCXJldHZhbCA9CisJICAgIG1zX3JlYWRfYnl0ZXMoY2hpcCwgUkVBRF9SRUcsIE1TX0VYVFJBX1NJWkUsIE5PX1dBSVRfSU5ULCBkYXRhLAorCQkJICBNU19FWFRSQV9TSVpFKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCWlmIChidWYgJiYgYnVmX2xlbikgeworCQlpZiAoYnVmX2xlbiA+IE1TX0VYVFJBX1NJWkUpCisJCQlidWZfbGVuID0gTVNfRVhUUkFfU0laRTsKKwkJbWVtY3B5KGJ1ZiwgZGF0YSwgYnVmX2xlbik7CisJfQorCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1zX3dyaXRlX2V4dHJhX2RhdGEoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLAorCQkJICAgICAgIHUxNiBibG9ja19hZGRyLCB1OCBwYWdlX251bSwgdTggKmJ1ZiwKKwkJCSAgICAgICBpbnQgYnVmX2xlbikKK3sKKwlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7CisJaW50IHJldHZhbCwgaTsKKwl1OCB2YWwgPSAwLCBkYXRhWzE2XTsKKworCWlmICghYnVmIHx8IChidWZfbGVuIDwgTVNfRVhUUkFfU0laRSkpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJLyogV3JpdGUgUkVHICovCisJaWYgKENIS19NUzRCSVQobXNfY2FyZCkpIHsKKwkJLyogUGFyYWxsZWwgaW50ZXJmYWNlICovCisJCWRhdGFbMF0gPSAweDg4OworCX0gZWxzZSB7CisJCS8qIFNlcmlhbCBpbnRlcmZhY2UgKi8KKwkJZGF0YVswXSA9IDB4ODA7CisJfQorCS8qIEJsb2NrIEFkZHJlc3MgKi8KKwlkYXRhWzFdID0gMDsKKwlkYXRhWzJdID0gKHU4KSAoYmxvY2tfYWRkciA+PiA4KTsKKwlkYXRhWzNdID0gKHU4KSBibG9ja19hZGRyOworCS8qIFBhZ2UgTnVtYmVyCisJICogRXh0cmEgZGF0YSBhY2Nlc3MgbW9kZSAqLworCWRhdGFbNF0gPSAweDQwOworCWRhdGFbNV0gPSBwYWdlX251bTsKKworCWZvciAoaSA9IDY7IGkgPCBNU19FWFRSQV9TSVpFICsgNjsgaSsrKQorCQlkYXRhW2ldID0gYnVmW2kgLSA2XTsKKworI2lmZGVmIE1TX1NQRUVEVVAKKwlyZXR2YWwgPQorCSAgICBtc19hdXRvX3NldF9jbWQoY2hpcCwgT3ZlcndyaXRlRmxhZywgTVNfRVhUUkFfU0laRSwgU3lzdGVtUGFybSwKKwkJCSAgICA2ICsgTVNfRVhUUkFfU0laRSwgQkxPQ0tfV1JJVEUsIFdBSVRfSU5ULCBkYXRhLCAxNiwKKwkJCSAgICAmdmFsKTsKKyNlbHNlCisJcmV0dmFsID0KKwkgICAgbXNfc2V0X2NtZChjaGlwLCBPdmVyd3JpdGVGbGFnLCBNU19FWFRSQV9TSVpFLCBTeXN0ZW1QYXJtLAorCQkgICAgICAgNiArIE1TX0VYVFJBX1NJWkUsIEJMT0NLX1dSSVRFLCBXQUlUX0lOVCwgZGF0YSwgMTYsCisJCSAgICAgICAmdmFsKTsKKyNlbmRpZgorCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJaWYgKHZhbCAmIElOVF9SRUdfQ01ETkspIHsKKwkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0NNRF9OSyk7CisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJfQorCWlmICh2YWwgJiBJTlRfUkVHX0NFRCkgeworCQlpZiAodmFsICYgSU5UX1JFR19FUlIpIHsKKwkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19GTEFTSF9XUklURV9FUlJPUik7CisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQl9CisJfQorCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IG1zX3JlYWRfcGFnZShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHUxNiBibG9ja19hZGRyLCB1OCBwYWdlX251bSkKK3sKKwlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7CisJaW50IHJldHZhbDsKKwl1OCB2YWwgPSAwLCBkYXRhWzZdOworCisJaWYgKENIS19NUzRCSVQobXNfY2FyZCkpIHsKKwkJLyogUGFyYWxsZWwgaW50ZXJmYWNlICovCisJCWRhdGFbMF0gPSAweDg4OworCX0gZWxzZSB7CisJCS8qIFNlcmlhbCBpbnRlcmZhY2UgKi8KKwkJZGF0YVswXSA9IDB4ODA7CisJfQorCS8qIEJsb2NrIEFkZHJlc3MgKi8KKwlkYXRhWzFdID0gMDsKKwlkYXRhWzJdID0gKHU4KSAoYmxvY2tfYWRkciA+PiA4KTsKKwlkYXRhWzNdID0gKHU4KSBibG9ja19hZGRyOworCS8qIFBhZ2UgTnVtYmVyCisJICogU2luZ2xlIHBhZ2UgYWNjZXNzIG1vZGUgKi8KKwlkYXRhWzRdID0gMHgyMDsKKwlkYXRhWzVdID0gcGFnZV9udW07CisKKwlyZXR2YWwgPSBtc19zZXRfY21kKGNoaXAsIE92ZXJ3cml0ZUZsYWcsIE1TX0VYVFJBX1NJWkUsIFN5c3RlbVBhcm0sIDYsCisJCQkgICAgQkxPQ0tfUkVBRCwgV0FJVF9JTlQsIGRhdGEsIDYsICZ2YWwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJaWYgKHZhbCAmIElOVF9SRUdfQ01ETkspIHsKKwkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0NNRF9OSyk7CisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJfQorCisJaWYgKHZhbCAmIElOVF9SRUdfQ0VEKSB7CisJCWlmICh2YWwgJiBJTlRfUkVHX0VSUikgeworCQkJaWYgKCEodmFsICYgSU5UX1JFR19CUkVRKSkgeworCQkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19GTEFTSF9SRUFEX0VSUk9SKTsKKwkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJfQorCQkJcmV0dmFsID0gbXNfcmVhZF9zdGF0dXNfcmVnKGNoaXApOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfRkxBU0hfV1JJVEVfRVJST1IpOworCQl9IGVsc2UgeworCQkJaWYgKCEodmFsICYgSU5UX1JFR19CUkVRKSkgeworCQkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19CUkVRX0VSUk9SKTsKKwkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJfQorCQl9CisJfQorCisJcmV0dmFsID0KKwkgICAgbXNfdHJhbnNmZXJfdHBjKGNoaXAsIE1TX1RNX05PUk1BTF9SRUFELCBSRUFEX1BBR0VfREFUQSwgMCwKKwkJCSAgICBOT19XQUlUX0lOVCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJaWYgKG1zX2NoZWNrX2Vycl9jb2RlKGNoaXAsIE1TX0ZMQVNIX1dSSVRFX0VSUk9SKSkKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtc19zZXRfYmFkX2Jsb2NrKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTE2IHBoeV9ibGspCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCWludCByZXR2YWw7CisJdTggdmFsID0gMCwgZGF0YVs4XSwgZXh0cmFbTVNfRVhUUkFfU0laRV07CisKKwlyZXR2YWwgPSBtc19yZWFkX2V4dHJhX2RhdGEoY2hpcCwgcGh5X2JsaywgMCwgZXh0cmEsIE1TX0VYVFJBX1NJWkUpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKKworCWlmIChDSEtfTVM0QklUKG1zX2NhcmQpKSB7CisJCS8qIFBhcmFsbGVsIGludGVyZmFjZSAqLworCQlkYXRhWzBdID0gMHg4ODsKKwl9IGVsc2UgeworCQkvKiBTZXJpYWwgaW50ZXJmYWNlICovCisJCWRhdGFbMF0gPSAweDgwOworCX0KKwkvKiBCbG9jayBBZGRyZXNzICovCisJZGF0YVsxXSA9IDA7CisJZGF0YVsyXSA9ICh1OCkgKHBoeV9ibGsgPj4gOCk7CisJZGF0YVszXSA9ICh1OCkgcGh5X2JsazsKKwlkYXRhWzRdID0gMHg4MDsKKwlkYXRhWzVdID0gMDsKKwlkYXRhWzZdID0gZXh0cmFbMF0gJiAweDdGOworCWRhdGFbN10gPSAweEZGOworCisjaWZkZWYgTVNfU1BFRURVUAorCXJldHZhbCA9IG1zX3NldF9jbWQoY2hpcCwgT3ZlcndyaXRlRmxhZywgTVNfRVhUUkFfU0laRSwgU3lzdGVtUGFybSwgNywKKwkJCSAgICBCTE9DS19XUklURSwgV0FJVF9JTlQsIGRhdGEsIDcsICZ2YWwpOworI2Vsc2UKKwlyZXR2YWwgPSBtc19zZXRfY21kKGNoaXAsIE92ZXJ3cml0ZUZsYWcsIE1TX0VYVFJBX1NJWkUsIFN5c3RlbVBhcm0sIDcsCisJCQkgICAgQkxPQ0tfV1JJVEUsIFdBSVRfSU5ULCBkYXRhLCA3LCAmdmFsKTsKKyNlbmRpZgorCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJaWYgKHZhbCAmIElOVF9SRUdfQ01ETkspIHsKKwkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0NNRF9OSyk7CisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJfQorCisJaWYgKHZhbCAmIElOVF9SRUdfQ0VEKSB7CisJCWlmICh2YWwgJiBJTlRfUkVHX0VSUikgeworCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0ZMQVNIX1dSSVRFX0VSUk9SKTsKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCX0KKwl9CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbXNfZXJhc2VfYmxvY2soc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1MTYgcGh5X2JsaykKK3sKKwlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7CisJaW50IHJldHZhbCwgaSA9IDA7CisJdTggdmFsID0gMCwgZGF0YVs2XTsKKworCXJldHZhbCA9CisJICAgIG1zX3NldF9yd19yZWdfYWRkcihjaGlwLCBPdmVyd3JpdGVGbGFnLCBNU19FWFRSQV9TSVpFLCBTeXN0ZW1QYXJtLAorCQkJICAgICAgIDYpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKKworCWlmIChDSEtfTVM0QklUKG1zX2NhcmQpKSB7CisJCS8qIFBhcmFsbGVsIGludGVyZmFjZSAqLworCQlkYXRhWzBdID0gMHg4ODsKKwl9IGVsc2UgeworCQkvKiBTZXJpYWwgaW50ZXJmYWNlICovCisJCWRhdGFbMF0gPSAweDgwOworCX0KKwkvKiBCbG9jayBBZGRyZXNzICovCisJZGF0YVsxXSA9IDA7CisJZGF0YVsyXSA9ICh1OCkgKHBoeV9ibGsgPj4gOCk7CisJZGF0YVszXSA9ICh1OCkgcGh5X2JsazsKKwlkYXRhWzRdID0gMDsKKwlkYXRhWzVdID0gMDsKKworRVJBU0VfUlRZOgorI2lmZGVmIE1TX1NQRUVEVVAKKwlyZXR2YWwgPQorCSAgICBtc19hdXRvX3NldF9jbWQoY2hpcCwgT3ZlcndyaXRlRmxhZywgTVNfRVhUUkFfU0laRSwgU3lzdGVtUGFybSwgNiwKKwkJCSAgICBCTE9DS19FUkFTRSwgV0FJVF9JTlQsIGRhdGEsIDYsICZ2YWwpOworI2Vsc2UKKwlyZXR2YWwgPSBtc19zZXRfY21kKGNoaXAsIE92ZXJ3cml0ZUZsYWcsIE1TX0VYVFJBX1NJWkUsIFN5c3RlbVBhcm0sIDYsCisJCQkgICAgQkxPQ0tfRVJBU0UsIFdBSVRfSU5ULCBkYXRhLCA2LCAmdmFsKTsKKyNlbmRpZgorCisJaWYgKHZhbCAmIElOVF9SRUdfQ01ETkspIHsKKwkJaWYgKGkgPCAzKSB7CisJCQlpKys7CisJCQlnb3RvIEVSQVNFX1JUWTsKKwkJfQorCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQ01EX05LKTsKKwkJbXNfc2V0X2JhZF9ibG9jayhjaGlwLCBwaHlfYmxrKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwl9CisKKwlpZiAodmFsICYgSU5UX1JFR19DRUQpIHsKKwkJaWYgKHZhbCAmIElOVF9SRUdfRVJSKSB7CisJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfRkxBU0hfV1JJVEVfRVJST1IpOworCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJfQorCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgbXNfc2V0X3BhZ2Vfc3RhdHVzKHUxNiBsb2dfYmxrLCB1OCB0eXBlLCB1OCAqZXh0cmEsIGludCBleHRyYV9sZW4pCit7CisJaWYgKCFleHRyYSB8fCAoZXh0cmFfbGVuIDwgTVNfRVhUUkFfU0laRSkpCisJCXJldHVybjsKKworCW1lbXNldChleHRyYSwgMHhGRiwgTVNfRVhUUkFfU0laRSk7CisKKwlpZiAodHlwZSA9PSBzZXRQU19ORykKKwkJZXh0cmFbMF0gPSAweEI4OworCWVsc2UKKwkJZXh0cmFbMF0gPSAweDk4OworCisJZXh0cmFbMl0gPSAodTgpIChsb2dfYmxrID4+IDgpOworCWV4dHJhWzNdID0gKHU4KSBsb2dfYmxrOworfQorCitzdGF0aWMgaW50IG1zX2luaXRfcGFnZShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHUxNiBwaHlfYmxrLCB1MTYgbG9nX2JsaywKKwkJCXU4IHN0YXJ0X3BhZ2UsIHU4IGVuZF9wYWdlKQoreworCWludCByZXR2YWw7CisJdTggZXh0cmFbTVNfRVhUUkFfU0laRV0sIGk7CisKKwltZW1zZXQoZXh0cmEsIDB4ZmYsIE1TX0VYVFJBX1NJWkUpOworCisJZXh0cmFbMF0gPSAweGY4OyAvKiBCbG9jaywgcGFnZSBPSywgZGF0YSBlcmFzZWQgKi8KKwlleHRyYVsxXSA9IDB4ZmY7CisJZXh0cmFbMl0gPSAodTgpIChsb2dfYmxrID4+IDgpOworCWV4dHJhWzNdID0gKHU4KSBsb2dfYmxrOworCisJZm9yIChpID0gc3RhcnRfcGFnZTsgaSA8IGVuZF9wYWdlOyBpKyspIHsKKwkJaWYgKG1vbml0b3JfY2FyZF9jZChjaGlwLCBNU19DQVJEKSA9PSBDRF9OT1RfRVhJU1QpCisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJCXJldHZhbCA9CisJCSAgICBtc193cml0ZV9leHRyYV9kYXRhKGNoaXAsIHBoeV9ibGssIGksIGV4dHJhLCBNU19FWFRSQV9TSVpFKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtc19jb3B5X3BhZ2Uoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1MTYgb2xkX2JsaywgdTE2IG5ld19ibGssCisJCQl1MTYgbG9nX2JsaywgdTggc3RhcnRfcGFnZSwgdTggZW5kX3BhZ2UpCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCWludCByZXR2YWwsIHJ0eV9jbnQsIHVuY29ycmVjdF9mbGFnID0gMDsKKwl1OCBleHRyYVtNU19FWFRSQV9TSVpFXSwgdmFsLCBpLCBqLCBkYXRhWzE2XTsKKworCVJUUzUxWF9ERUJVR1AoIkNvcHkgcGFnZSBmcm9tIDB4JXggdG8gMHgleCwgbG9naWNhbCBibG9jayBpcyAweCV4XG4iLAorCQkgICAgICAgb2xkX2JsaywgbmV3X2JsaywgbG9nX2Jsayk7CisJUlRTNTFYX0RFQlVHUCgic3RhcnRfcGFnZSA9ICVkLCBlbmRfcGFnZSA9ICVkXG4iLCBzdGFydF9wYWdlLAorCQkgICAgICAgZW5kX3BhZ2UpOworCisJcmV0dmFsID0gbXNfcmVhZF9leHRyYV9kYXRhKGNoaXAsIG5ld19ibGssIDAsIGV4dHJhLCBNU19FWFRSQV9TSVpFKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHZhbCA9IG1zX3JlYWRfc3RhdHVzX3JlZyhjaGlwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCVJUUzUxWF9SRUFEX1JFRyhjaGlwLCBQUEJVRl9CQVNFMiwgJnZhbCk7CisKKwlpZiAodmFsICYgQlVGX0ZVTEwpIHsKKwkJLyogQ2xlYXIgQnVmZmVyICovCisJCXJldHZhbCA9IG1zX3NlbmRfY21kKGNoaXAsIENMRUFSX0JVRiwgV0FJVF9JTlQpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCS8qIEdFVF9JTlQgUmVnaXN0ZXIgKi8KKwkJcmV0dmFsID0gbXNfcmVhZF9ieXRlcyhjaGlwLCBHRVRfSU5ULCAxLCBOT19XQUlUX0lOVCwgJnZhbCwgMSk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCQlpZiAoISh2YWwgJiBJTlRfUkVHX0NFRCkpIHsKKwkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19GTEFTSF9XUklURV9FUlJPUik7CisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQl9CisJfQorCisJZm9yIChpID0gc3RhcnRfcGFnZTsgaSA8IGVuZF9wYWdlOyBpKyspIHsKKwkJaWYgKG1vbml0b3JfY2FyZF9jZChjaGlwLCBNU19DQVJEKSA9PSBDRF9OT1RfRVhJU1QpCisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJCW1zX3JlYWRfZXh0cmFfZGF0YShjaGlwLCBvbGRfYmxrLCBpLCBleHRyYSwgTVNfRVhUUkFfU0laRSk7CisKKwkJcmV0dmFsID0KKwkJICAgIG1zX3NldF9yd19yZWdfYWRkcihjaGlwLCBPdmVyd3JpdGVGbGFnLCBNU19FWFRSQV9TSVpFLAorCQkJCSAgICAgICBTeXN0ZW1QYXJtLCA2KTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCQkvKiBXcml0ZSBSRUcgKi8KKwkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKKworCQlpZiAoQ0hLX01TNEJJVChtc19jYXJkKSkgeworCQkJLyogUGFyYWxsZWwgaW50ZXJmYWNlICovCisJCQlkYXRhWzBdID0gMHg4ODsKKwkJfSBlbHNlIHsKKwkJCS8qIFNlcmlhbCBpbnRlcmZhY2UgKi8KKwkJCWRhdGFbMF0gPSAweDgwOworCQl9CisJCS8qIEJsb2NrIEFkZHJlc3MgKi8KKwkJZGF0YVsxXSA9IDA7CisJCWRhdGFbMl0gPSAodTgpIChvbGRfYmxrID4+IDgpOworCQlkYXRhWzNdID0gKHU4KSBvbGRfYmxrOworCQlkYXRhWzRdID0gMHgyMDsKKwkJZGF0YVs1XSA9IGk7CisKKwkJcmV0dmFsID0KKwkJICAgIG1zX3dyaXRlX2J5dGVzKGNoaXAsIFdSSVRFX1JFRywgNiwgTk9fV0FJVF9JTlQsIGRhdGEsIDYpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwkJcmV0dmFsID0gbXNfc2VuZF9jbWQoY2hpcCwgQkxPQ0tfUkVBRCwgV0FJVF9JTlQpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKKwkJcmV0dmFsID0gbXNfcmVhZF9ieXRlcyhjaGlwLCBHRVRfSU5ULCAxLCBOT19XQUlUX0lOVCwgJnZhbCwgMSk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCQlpZiAodmFsICYgSU5UX1JFR19DTUROSykgeworCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0NNRF9OSyk7CisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQl9CisKKwkJaWYgKHZhbCAmIElOVF9SRUdfQ0VEKSB7CisJCQlpZiAodmFsICYgSU5UX1JFR19FUlIpIHsKKwkJCQlyZXR2YWwgPSBtc19yZWFkX3N0YXR1c19yZWcoY2hpcCk7CisJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCQl1bmNvcnJlY3RfZmxhZyA9IDE7CisJCQkJCVJUUzUxWF9ERUJVR1AoIlVuY29ycmVjdGFibGUiCisJCQkJCQkJCSJlcnJvclxuIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJdW5jb3JyZWN0X2ZsYWcgPSAwOworCQkJCX0KKworCQkJCXJldHZhbCA9CisJCQkJICAgIG1zX3RyYW5zZmVyX3RwYyhjaGlwLCBNU19UTV9OT1JNQUxfUkVBRCwKKwkJCQkJUkVBRF9QQUdFX0RBVEEsIDAsIE5PX1dBSVRfSU5UKTsKKwkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkJCQlpZiAodW5jb3JyZWN0X2ZsYWcpIHsKKwkJCQkJbXNfc2V0X3BhZ2Vfc3RhdHVzKGxvZ19ibGssIHNldFBTX05HLAorCQkJCQkJZXh0cmEsIE1TX0VYVFJBX1NJWkUpOworCQkJCQlpZiAoaSA9PSAwKQorCQkJCQkJZXh0cmFbMF0gJj0gMHhFRjsKKwkJCQkJbXNfd3JpdGVfZXh0cmFfZGF0YShjaGlwLCBvbGRfYmxrLCBpLAorCQkJCQkJCSAgICBleHRyYSwKKwkJCQkJCQkgICAgTVNfRVhUUkFfU0laRSk7CisJCQkJCVJUUzUxWF9ERUJVR1AoInBhZ2UgJWQgOiIKKwkJCQkJCQkiZXh0cmFbMF0gPSAweCV4XG4iLAorCQkJCQkJCWksIGV4dHJhWzBdKTsKKwkJCQkJTVNfU0VUX0JBRF9CTE9DS19GTEcobXNfY2FyZCk7CisKKwkJCQkJbXNfc2V0X3BhZ2Vfc3RhdHVzKGxvZ19ibGssIHNldFBTX0Vycm9yLAorCQkJCQkJCWV4dHJhLCBNU19FWFRSQV9TSVpFKTsKKwkJCQkJbXNfd3JpdGVfZXh0cmFfZGF0YShjaGlwLCBuZXdfYmxrLCBpLAorCQkJCQkJZXh0cmEsIE1TX0VYVFJBX1NJWkUpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlmb3IgKHJ0eV9jbnQgPSAwOyBydHlfY250IDwgTVNfTUFYX1JFVFJZX0NPVU5UOworCQkJCSAgICAgcnR5X2NudCsrKSB7CisJCQkJCXJldHZhbCA9CisJCQkJCSAgICBtc190cmFuc2Zlcl90cGMoY2hpcCwKKwkJCQkJCQkgICAgTVNfVE1fTk9STUFMX1dSSVRFLAorCQkJCQkJCSAgICBXUklURV9QQUdFX0RBVEEsIDAsCisJCQkJCQkJICAgIE5PX1dBSVRfSU5UKTsKKwkJCQkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAocnR5X2NudCA9PSBNU19NQVhfUkVUUllfQ09VTlQpCisJCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQl9CisKKwkJCWlmICghKHZhbCAmIElOVF9SRUdfQlJFUSkpIHsKKwkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQlJFUV9FUlJPUik7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCX0KKwkJfQorCisJCXJldHZhbCA9IG1zX3NldF9yd19yZWdfYWRkcihjaGlwLCBPdmVyd3JpdGVGbGFnLAorCQkJCQkgICAgTVNfRVhUUkFfU0laRSwgU3lzdGVtUGFybSwKKwkJCQkJICAgICg2ICsgTVNfRVhUUkFfU0laRSkpOworCisJCS8qIFdyaXRlIFJFRyAqLworCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfTk9fRVJST1IpOworCisJCWlmIChDSEtfTVM0QklUKG1zX2NhcmQpKSB7CisJCQkvKiBQYXJhbGxlbCBpbnRlcmZhY2UgKi8KKwkJCWRhdGFbMF0gPSAweDg4OworCQl9IGVsc2UgeworCQkJLyogU2VyaWFsIGludGVyZmFjZSAqLworCQkJZGF0YVswXSA9IDB4ODA7CisJCX0KKwkJLyogQmxvY2sgQWRkcmVzcyAqLworCQlkYXRhWzFdID0gMDsKKwkJZGF0YVsyXSA9ICh1OCkgKG5ld19ibGsgPj4gOCk7CisJCWRhdGFbM10gPSAodTgpIG5ld19ibGs7CisJCWRhdGFbNF0gPSAweDIwOworCQlkYXRhWzVdID0gaTsKKworCQkvKiBmb3IgTVMgY2hlY2sgcHJvY2VkdXJlICovCisJCWlmICgoZXh0cmFbMF0gJiAweDYwKSAhPSAweDYwKQorCQkJZGF0YVs2XSA9IGV4dHJhWzBdOworCQllbHNlCisJCQlkYXRhWzZdID0gMHhGODsKKworCQlkYXRhWzYgKyAxXSA9IDB4RkY7CisJCWRhdGFbNiArIDJdID0gKHU4KSAobG9nX2JsayA+PiA4KTsKKwkJZGF0YVs2ICsgM10gPSAodTgpIGxvZ19ibGs7CisKKwkJZm9yIChqID0gNDsgaiA8PSBNU19FWFRSQV9TSVpFOyBqKyspCisJCQlkYXRhWzYgKyBqXSA9IDB4RkY7CisKKwkJcmV0dmFsID0KKwkJICAgIG1zX3dyaXRlX2J5dGVzKGNoaXAsIFdSSVRFX1JFRywgKDYgKyBNU19FWFRSQV9TSVpFKSwKKwkJCQkgICBOT19XQUlUX0lOVCwgZGF0YSwgMTYpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwkJcmV0dmFsID0gbXNfc2VuZF9jbWQoY2hpcCwgQkxPQ0tfV1JJVEUsIFdBSVRfSU5UKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCQkvKiBHRVRfSU5UIFJlZ2lzdGVyICovCisJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19OT19FUlJPUik7CisJCXJldHZhbCA9IG1zX3JlYWRfYnl0ZXMoY2hpcCwgR0VUX0lOVCwgMSwgTk9fV0FJVF9JTlQsICZ2YWwsIDEpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwkJaWYgKHZhbCAmIElOVF9SRUdfQ01ETkspIHsKKwkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19DTURfTkspOworCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJfQorCisJCWlmICh2YWwgJiBJTlRfUkVHX0NFRCkgeworCQkJaWYgKHZhbCAmIElOVF9SRUdfRVJSKSB7CisJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0ZMQVNIX1dSSVRFX0VSUk9SKTsKKwkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJfQorCQl9CisKKwkJaWYgKGkgPT0gMCkgeworCQkJcmV0dmFsID0KKwkJCSAgICBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgT3ZlcndyaXRlRmxhZywKKwkJCQkJICAgICAgIE1TX0VYVFJBX1NJWkUsIFN5c3RlbVBhcm0sIDcpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKKworCQkJaWYgKENIS19NUzRCSVQobXNfY2FyZCkpIHsKKwkJCQkvKiBQYXJhbGxlbCBpbnRlcmZhY2UgKi8KKwkJCQlkYXRhWzBdID0gMHg4ODsKKwkJCX0gZWxzZSB7CisJCQkJLyogU2VyaWFsIGludGVyZmFjZSAqLworCQkJCWRhdGFbMF0gPSAweDgwOworCQkJfQorCQkJLyogQmxvY2sgQWRkcmVzcyAqLworCQkJZGF0YVsxXSA9IDA7CisJCQlkYXRhWzJdID0gKHU4KSAob2xkX2JsayA+PiA4KTsKKwkJCWRhdGFbM10gPSAodTgpIG9sZF9ibGs7CisJCQlkYXRhWzRdID0gMHg4MDsKKwkJCWRhdGFbNV0gPSAwOworCQkJZGF0YVs2XSA9IDB4RUY7CisJCQlkYXRhWzddID0gMHhGRjsKKworCQkJcmV0dmFsID0KKwkJCSAgICBtc193cml0ZV9ieXRlcyhjaGlwLCBXUklURV9SRUcsIDcsIE5PX1dBSVRfSU5ULAorCQkJCQkgICBkYXRhLCA4KTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwkJCXJldHZhbCA9IG1zX3NlbmRfY21kKGNoaXAsIEJMT0NLX1dSSVRFLCBXQUlUX0lOVCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfTk9fRVJST1IpOworCQkJcmV0dmFsID0KKwkJCSAgICBtc19yZWFkX2J5dGVzKGNoaXAsIEdFVF9JTlQsIDEsIE5PX1dBSVRfSU5ULCAmdmFsLAorCQkJCQkgIDEpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCQkJaWYgKHZhbCAmIElOVF9SRUdfQ01ETkspIHsKKwkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQ01EX05LKTsKKwkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJfQorCisJCQlpZiAodmFsICYgSU5UX1JFR19DRUQpIHsKKwkJCQlpZiAodmFsICYgSU5UX1JFR19FUlIpIHsKKwkJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsCisJCQkJCQkJTVNfRkxBU0hfV1JJVEVfRVJST1IpOworCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworI2lmZGVmIE1TX1NQRUVEVVAKK3N0YXRpYyBpbnQgbXNfYXV0b19jb3B5X3BhZ2Uoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1MTYgb2xkX2JsaywgdTE2IG5ld19ibGssCisJCQkgICAgIHUxNiBsb2dfYmxrLCB1OCBzdGFydF9wYWdlLCB1OCBlbmRfcGFnZSkKK3sKKwlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7CisJaW50IHJldHZhbDsKKwl1OCBwYWdlX2xlbiwgYnVzX3dpZHRoLCB2YWwgPSAwOworCXU4IGV4dHJhW01TX0VYVFJBX1NJWkVdOworCisJUlRTNTFYX0RFQlVHUCgiQXV0byBjb3B5IHBhZ2UgZnJvbSAweCV4IHRvIDB4JXgsIgorCQkJCSJsb2dpY2FsIGJsb2NrIGlzIDB4JXhcbiIsCisJCQkJb2xkX2JsaywgbmV3X2JsaywgbG9nX2Jsayk7CisJUlRTNTFYX0RFQlVHUCgic3RhcnRfcGFnZSA9ICVkLCBlbmRfcGFnZSA9ICVkXG4iLCBzdGFydF9wYWdlLAorCQkgICAgICAgZW5kX3BhZ2UpOworCisJcGFnZV9sZW4gPSBlbmRfcGFnZSAtIHN0YXJ0X3BhZ2U7CisKKwlyZXR2YWwgPSBtc19yZWFkX2V4dHJhX2RhdGEoY2hpcCwgbmV3X2JsaywgMCwgZXh0cmEsIE1TX0VYVFJBX1NJWkUpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcmV0dmFsID0gbXNfcmVhZF9zdGF0dXNfcmVnKGNoaXApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJUlRTNTFYX1JFQURfUkVHKGNoaXAsIFBQQlVGX0JBU0UyLCAmdmFsKTsKKworCWlmICh2YWwgJiBCVUZfRlVMTCkgeworCQlyZXR2YWwgPSBtc19zZW5kX2NtZChjaGlwLCBDTEVBUl9CVUYsIFdBSVRfSU5UKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJCXJldHZhbCA9IG1zX3JlYWRfYnl0ZXMoY2hpcCwgR0VUX0lOVCwgMSwgTk9fV0FJVF9JTlQsICZ2YWwsIDEpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwkJaWYgKCEodmFsICYgSU5UX1JFR19DRUQpKSB7CisJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfRkxBU0hfV1JJVEVfRVJST1IpOworCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJfQorCX0KKworCWlmIChDSEtfTVM0QklUKG1zX2NhcmQpKSB7CisJCS8qIFBhcmFsbGVsIGludGVyZmFjZSAqLworCQlidXNfd2lkdGggPSAweDg4OworCX0gZWxzZSB7CisJCS8qIFNlcmlhbCBpbnRlcmZhY2UgKi8KKwkJYnVzX3dpZHRoID0gMHg4MDsKKwl9CisKKwlydHM1MXhfaW5pdF9jbWQoY2hpcCk7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19PTERfQkxPQ0tfMCwgMHhGRiwgKHU4KSBvbGRfYmxrKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19PTERfQkxPQ0tfMSwgMHhGRiwKKwkJICAgICAgICh1OCkgKG9sZF9ibGsgPj4gOCkpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX05FV19CTE9DS18wLCAweEZGLCAodTgpIG5ld19ibGspOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX05FV19CTE9DS18xLCAweEZGLAorCQkgICAgICAgKHU4KSAobmV3X2JsayA+PiA4KSk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfTE9HX0JMT0NLXzAsIDB4RkYsICh1OCkgbG9nX2Jsayk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfTE9HX0JMT0NLXzEsIDB4RkYsCisJCSAgICAgICAodTgpIChsb2dfYmxrID4+IDgpKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19QQUdFX1NUQVJULCAweEZGLCBzdGFydF9wYWdlKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19QQUdFX0xFTkdUSCwgMHhGRiwgcGFnZV9sZW4pOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX0JVU19XSURUSCwgMHhGRiwgYnVzX3dpZHRoKTsKKworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX1RSQU5TRkVSLCAweEZGLAorCQkgICAgICAgTVNfVFJBTlNGRVJfU1RBUlQgfCBNU19UTV9DT1BZX1BBR0UpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIENIRUNLX1JFR19DTUQsIE1TX1RSQU5TRkVSLCBNU19UUkFOU0ZFUl9FTkQsCisJCSAgICAgICBNU19UUkFOU0ZFUl9FTkQpOworCisJcmV0dmFsID0gcnRzNTF4X3NlbmRfY21kKGNoaXAsIE1PREVfQ1IsIDEwMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHM1MXhfY2xlYXJfbXNfZXJyb3IoY2hpcCk7CisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKworCXJldHZhbCA9IHJ0czUxeF9nZXRfcnNwKGNoaXAsIDEsIDUwMDApOworCisJaWYgKENIRUNLX01TX1RSQU5TX0ZBSUwoY2hpcCwgcmV0dmFsKSkgeworCQlydHM1MXhfY2xlYXJfbXNfZXJyb3IoY2hpcCk7CisJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1RJTUVET1VUKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCVRSQUNFX0dPVE8oY2hpcCwgRmFpbCk7CisJfQorCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworCitGYWlsOgorCXJldHZhbCA9IG1zX2VyYXNlX2Jsb2NrKGNoaXAsIG5ld19ibGspOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcmV0dmFsID0KKwkgICAgbXNfY29weV9wYWdlKGNoaXAsIG9sZF9ibGssIG5ld19ibGssIGxvZ19ibGssIHN0YXJ0X3BhZ2UsIGVuZF9wYWdlKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHJlc2V0X21zKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7CisJaW50IHJldHZhbDsKKwl1MTYgaSwgcmVnX2FkZHIsIGJsb2NrX3NpemU7CisJdTggdmFsLCBqLCAqcHRyOworI2lmbmRlZiBTVVBQT1JUX01BR0lDX0dBVEUKKwl1MTYgZWJsb2NrX2NudDsKKyNlbmRpZgorCisJcmV0dmFsID0gbXNfcHJlcGFyZV9yZXNldChjaGlwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCW1zX2NhcmQtPm1zX3R5cGUgfD0gVFlQRV9NUzsKKworCXJldHZhbCA9IG1zX3NlbmRfY21kKGNoaXAsIE1TX1JFU0VULCBOT19XQUlUX0lOVCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlyZXR2YWwgPSBtc19yZWFkX3N0YXR1c19yZWcoY2hpcCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlSVFM1MVhfUkVBRF9SRUcoY2hpcCwgUFBCVUZfQkFTRTIsICZ2YWwpOworCWlmICh2YWwgJiBXUlRfUFJUQ1QpCisJCWNoaXAtPmNhcmRfd3AgfD0gTVNfQ0FSRDsKKwllbHNlCisJCWNoaXAtPmNhcmRfd3AgJj0gfk1TX0NBUkQ7CisKKwlpID0gMDsKKworUkVfU0VBUkNIOgorCS8qIFNlYXJjaCBGb3IgQm9vdCBCbG9jayAqLworCXdoaWxlIChpIDwgKE1BWF9ERUZFQ1RJVkVfQkxPQ0sgKyAyKSkgeworCQlpZiAobW9uaXRvcl9jYXJkX2NkKGNoaXAsIE1TX0NBUkQpID09IENEX05PVF9FWElTVCkKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwkJcmV0dmFsID0gbXNfY2hlY2tfYm9vdF9ibG9jayhjaGlwLCBpKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJaSsrOworCQkJY29udGludWU7CisJCX0KKworCQltc19jYXJkLT5ib290X2Jsb2NrID0gaTsKKwkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gKE1BWF9ERUZFQ1RJVkVfQkxPQ0sgKyAyKSkgeworCQlSVFM1MVhfREVCVUdQKCJObyBib290IGJsb2NrIGZvdW5kISIpOworCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCX0KKwlmb3IgKGogPSAwOyBqIDwgMzsgaisrKSB7CisJCXJldHZhbCA9IG1zX3JlYWRfcGFnZShjaGlwLCBtc19jYXJkLT5ib290X2Jsb2NrLCBqKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJaWYgKG1zX2NoZWNrX2Vycl9jb2RlKGNoaXAsIE1TX0ZMQVNIX1dSSVRFX0VSUk9SKSkgeworCQkJCWkgPSBtc19jYXJkLT5ib290X2Jsb2NrICsgMTsKKwkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfTk9fRVJST1IpOworCQkJCWdvdG8gUkVfU0VBUkNIOworCQkJfQorCQl9CisJfQorCisJLyogUmVhZCBib290IGJsb2NrIGNvbnRlbnRzICovCisJcmV0dmFsID0gbXNfcmVhZF9wYWdlKGNoaXAsIG1zX2NhcmQtPmJvb3RfYmxvY2ssIDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCS8qIFJlYWQgTVMgc3lzdGVtIGluZm9ybWF0aW9uIGFzIHN5c19pbmZvICovCisJcmV0dmFsID0KKwkgICAgcnRzNTF4X3NlcV9yZWFkX3JlZ2lzdGVyKGNoaXAsIFBQQlVGX0JBU0UyICsgMHgxQTAsIDk2LAorCQkJCSAgICAgbXNfY2FyZC0+cmF3X3N5c19pbmZvKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkvKiBSZWFkIHVzZWZ1bCBibG9jayBjb250ZW50cyAqLworCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgSEVBREVSX0lEMCwgMCwgMCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCBIRUFERVJfSUQxLCAwLCAwKTsKKworCWZvciAocmVnX2FkZHIgPSBESVNBQkxFRF9CTE9DSzA7IHJlZ19hZGRyIDw9IERJU0FCTEVEX0JMT0NLMzsKKwkgICAgIHJlZ19hZGRyKyspIHsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCByZWdfYWRkciwgMCwgMCk7CisJfQorCisJZm9yIChyZWdfYWRkciA9IEJMT0NLX1NJWkVfMDsgcmVnX2FkZHIgPD0gUEFHRV9TSVpFXzE7IHJlZ19hZGRyKyspCisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgcmVnX2FkZHIsIDAsIDApOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCBNU19EZXZpY2VfVHlwZSwgMCwgMCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCBNU180Yml0X1N1cHBvcnQsIDAsIDApOworCisJcmV0dmFsID0gcnRzNTF4X3NlbmRfY21kKGNoaXAsIE1PREVfQ1IsIDEwMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlyZXR2YWwgPSBydHM1MXhfZ2V0X3JzcChjaGlwLCAxNiwgMTAwKTsKKworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcHRyID0gcnRzNTF4X2dldF9yc3BfZGF0YShjaGlwKTsKKworCVJUUzUxWF9ERUJVR1AoIkJvb3QgYmxvY2sgZGF0YTpcbiIpOworCVJUUzUxWF9EVU1QKHB0ciwgMTYpOworCisJaWYgKHB0clswXSAhPSAweDAwIHx8IHB0clsxXSAhPSAweDAxKSB7CisJCWkgPSBtc19jYXJkLT5ib290X2Jsb2NrICsgMTsKKwkJZ290byBSRV9TRUFSQ0g7CisJfQorCWlmIChwdHJbMTJdICE9IDB4MDIgfHwgcHRyWzEzXSAhPSAweDAwKSB7CisJCWkgPSBtc19jYXJkLT5ib290X2Jsb2NrICsgMTsKKwkJZ290byBSRV9TRUFSQ0g7CisJfQorCWlmICgocHRyWzE0XSA9PSAxKSB8fCAocHRyWzE0XSA9PSAzKSkKKwkJY2hpcC0+Y2FyZF93cCB8PSBNU19DQVJEOworCWJsb2NrX3NpemUgPSAoKHUxNikgcHRyWzZdIDw8IDgpIHwgcHRyWzddOworCWlmIChibG9ja19zaXplID09IDB4MDAxMCkgeworCQltc19jYXJkLT5ibG9ja19zaGlmdCA9IDU7CisJCW1zX2NhcmQtPnBhZ2Vfb2ZmID0gMHgxRjsKKwl9IGVsc2UgaWYgKGJsb2NrX3NpemUgPT0gMHgwMDA4KSB7CisJCW1zX2NhcmQtPmJsb2NrX3NoaWZ0ID0gNDsKKwkJbXNfY2FyZC0+cGFnZV9vZmYgPSAweDBGOworCX0KKwltc19jYXJkLT50b3RhbF9ibG9jayA9ICgodTE2KSBwdHJbOF0gPDwgOCkgfCBwdHJbOV07CisKKyNpZmRlZiBTVVBQT1JUX01BR0lDX0dBVEUKKwlqID0gcHRyWzEwXTsKKworCWlmIChtc19jYXJkLT5ibG9ja19zaGlmdCA9PSA0KSB7CisJCWlmIChqIDwgMikKKwkJCW1zX2NhcmQtPmNhcGFjaXR5ID0gMHgxRUUwOworCQllbHNlCisJCQltc19jYXJkLT5jYXBhY2l0eSA9IDB4M0RFMDsKKwl9IGVsc2UgeworCQlpZiAoaiA8IDUpCisJCQltc19jYXJkLT5jYXBhY2l0eSA9IDB4N0JDMDsKKwkJZWxzZSBpZiAoaiA8IDB4QSkKKwkJCW1zX2NhcmQtPmNhcGFjaXR5ID0gMHhGN0MwOworCQllbHNlIGlmIChqIDwgMHgxMSkKKwkJCW1zX2NhcmQtPmNhcGFjaXR5ID0gMHgxRUY4MDsKKwkJZWxzZQorCQkJbXNfY2FyZC0+Y2FwYWNpdHkgPSAweDNERjAwOworCX0KKyNlbHNlCisJZWJsb2NrX2NudCA9ICgodTE2KSBwdHJbMTBdIDw8IDgpIHwgcHRyWzExXTsKKworCW1zX2NhcmQtPmNhcGFjaXR5ID0gKCh1MzIpIGVibG9ja19jbnQgLSAyKSA8PCBtc19jYXJkLT5ibG9ja19zaGlmdDsKKyNlbmRpZgorCisJY2hpcC0+Y2FwYWNpdHlbY2hpcC0+Y2FyZDJsdW5bTVNfQ0FSRF1dID0gbXNfY2FyZC0+Y2FwYWNpdHk7CisKKwlpZiAocHRyWzE1XSkgeworCQlyZXR2YWwgPSBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgMCwgMCwgU3lzdGVtUGFybSwgMSk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlSVFM1MVhfV1JJVEVfUkVHKGNoaXAsIFBQQlVGX0JBU0UyLCAweEZGLCAweDg4KTsKKwkJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBQUEJVRl9CQVNFMiArIDEsIDB4RkYsIDApOworCisJCXJldHZhbCA9CisJCSAgICBtc190cmFuc2Zlcl90cGMoY2hpcCwgTVNfVE1fV1JJVEVfQllURVMsIFdSSVRFX1JFRywgMSwKKwkJCQkgICAgTk9fV0FJVF9JTlQpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBNU19DRkcsIDB4NTggfCBNU19OT19DSEVDS19JTlQsCisJCQkJIE1TX0JVU19XSURUSF80IHwgUFVTSF9USU1FX09ERCB8CisJCQkJIE1TX05PX0NIRUNLX0lOVCk7CisKKwkJbXNfY2FyZC0+bXNfdHlwZSB8PSBNU180QklUOworCX0KKworCWlmIChDSEtfTVM0QklUKG1zX2NhcmQpKQorCQljaGlwLT5jYXJkX2J1c193aWR0aFtjaGlwLT5jYXJkMmx1bltNU19DQVJEXV0gPSA0OworCWVsc2UKKwkJY2hpcC0+Y2FyZF9idXNfd2lkdGhbY2hpcC0+Y2FyZDJsdW5bTVNfQ0FSRF1dID0gMTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtc19pbml0X2wycF90Ymwoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKwlpbnQgc2l6ZSwgaSwgc2VnX25vLCByZXR2YWw7CisJdTE2IGRlZmVjdF9ibG9jaywgcmVnX2FkZHI7CisJdTggdmFsMSwgdmFsMjsKKworCW1zX2NhcmQtPnNlZ21lbnRfY250ID0gbXNfY2FyZC0+dG90YWxfYmxvY2sgPj4gOTsKKwlSVFM1MVhfREVCVUdQKCJtc19jYXJkLT5zZWdtZW50X2NudCA9ICVkXG4iLCBtc19jYXJkLT5zZWdtZW50X2NudCk7CisKKwlzaXplID0gbXNfY2FyZC0+c2VnbWVudF9jbnQgKiBzaXplb2Yoc3RydWN0IHpvbmVfZW50cnkpOworCW1zX2NhcmQtPnNlZ21lbnQgPSB2bWFsbG9jKHNpemUpOworCWlmIChtc19jYXJkLT5zZWdtZW50ID09IE5VTEwpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJbWVtc2V0KG1zX2NhcmQtPnNlZ21lbnQsIDAsIHNpemUpOworCisJcmV0dmFsID0gbXNfcmVhZF9wYWdlKGNoaXAsIG1zX2NhcmQtPmJvb3RfYmxvY2ssIDEpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX0dPVE8oY2hpcCwgSU5JVF9GQUlMKTsKKworCXJlZ19hZGRyID0gUFBCVUZfQkFTRTI7CisJZm9yIChpID0gMDsgaSA8ICgoKG1zX2NhcmQtPnRvdGFsX2Jsb2NrID4+IDkpICogMTApICsgMSk7IGkrKykgeworCQlyZXR2YWwgPSBydHM1MXhfcmVhZF9yZWdpc3RlcihjaGlwLCByZWdfYWRkcisrLCAmdmFsMSk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9HT1RPKGNoaXAsIElOSVRfRkFJTCk7CisJCXJldHZhbCA9IHJ0czUxeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIHJlZ19hZGRyKyssICZ2YWwyKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX0dPVE8oY2hpcCwgSU5JVF9GQUlMKTsKKworCQlkZWZlY3RfYmxvY2sgPSAoKHUxNikgdmFsMSA8PCA4KSB8IHZhbDI7CisJCWlmIChkZWZlY3RfYmxvY2sgPT0gMHhGRkZGKQorCQkJYnJlYWs7CisJCXNlZ19ubyA9IGRlZmVjdF9ibG9jayAvIDUxMjsKKwkJbXNfY2FyZC0+c2VnbWVudFtzZWdfbm9dLmRlZmVjdF9saXN0W21zX2NhcmQtPnNlZ21lbnRbc2VnX25vXS4KKwkJCQkJCSAgICAgZGlzYWJsZV9jb3VudCsrXSA9CisJCSAgICBkZWZlY3RfYmxvY2s7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1zX2NhcmQtPnNlZ21lbnRfY250OyBpKyspIHsKKwkJbXNfY2FyZC0+c2VnbWVudFtpXS5idWlsZF9mbGFnID0gMDsKKwkJbXNfY2FyZC0+c2VnbWVudFtpXS5sMnBfdGFibGUgPSBOVUxMOworCQltc19jYXJkLT5zZWdtZW50W2ldLmZyZWVfdGFibGUgPSBOVUxMOworCQltc19jYXJkLT5zZWdtZW50W2ldLmdldF9pbmRleCA9IDA7CisJCW1zX2NhcmQtPnNlZ21lbnRbaV0uc2V0X2luZGV4ID0gMDsKKwkJbXNfY2FyZC0+c2VnbWVudFtpXS51bnVzZWRfYmxrX2NudCA9IDA7CisKKwkJUlRTNTFYX0RFQlVHUCgiZGVmZWN0aXZlIGJsb2NrIGNvdW50IG9mIHNlZ21lbnQgJWQgaXMgJWRcbiIsCisJCQkgICAgICAgaSwgbXNfY2FyZC0+c2VnbWVudFtpXS5kaXNhYmxlX2NvdW50KTsKKwl9CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CisKK0lOSVRfRkFJTDoKKwlpZiAobXNfY2FyZC0+c2VnbWVudCkgeworCQl2ZnJlZShtc19jYXJkLT5zZWdtZW50KTsKKwkJbXNfY2FyZC0+c2VnbWVudCA9IE5VTEw7CisJfQorCisJcmV0dXJuIFNUQVRVU19GQUlMOworfQorCitzdGF0aWMgdTE2IG1zX2dldF9sMnBfdGJsKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgaW50IHNlZ19ubywgdTE2IGxvZ19vZmYpCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCXN0cnVjdCB6b25lX2VudHJ5ICpzZWdtZW50OworCisJaWYgKG1zX2NhcmQtPnNlZ21lbnQgPT0gTlVMTCkKKwkJcmV0dXJuIDB4RkZGRjsKKworCXNlZ21lbnQgPSAmKG1zX2NhcmQtPnNlZ21lbnRbc2VnX25vXSk7CisKKwlpZiAoc2VnbWVudC0+bDJwX3RhYmxlKQorCQlyZXR1cm4gc2VnbWVudC0+bDJwX3RhYmxlW2xvZ19vZmZdOworCisJcmV0dXJuIDB4RkZGRjsKK30KKworc3RhdGljIHZvaWQgbXNfc2V0X2wycF90Ymwoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCBpbnQgc2VnX25vLCB1MTYgbG9nX29mZiwKKwkJCSAgIHUxNiBwaHlfYmxrKQoreworCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKwlzdHJ1Y3Qgem9uZV9lbnRyeSAqc2VnbWVudDsKKworCWlmIChtc19jYXJkLT5zZWdtZW50ID09IE5VTEwpCisJCXJldHVybjsKKworCXNlZ21lbnQgPSAmKG1zX2NhcmQtPnNlZ21lbnRbc2VnX25vXSk7CisJaWYgKHNlZ21lbnQtPmwycF90YWJsZSkKKwkJc2VnbWVudC0+bDJwX3RhYmxlW2xvZ19vZmZdID0gcGh5X2JsazsKK30KKworc3RhdGljIHZvaWQgbXNfc2V0X3VudXNlZF9ibG9jayhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHUxNiBwaHlfYmxrKQoreworCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKwlzdHJ1Y3Qgem9uZV9lbnRyeSAqc2VnbWVudDsKKwlpbnQgc2VnX25vOworCisJc2VnX25vID0gKGludClwaHlfYmxrID4+IDk7CisJc2VnbWVudCA9ICYobXNfY2FyZC0+c2VnbWVudFtzZWdfbm9dKTsKKworCXNlZ21lbnQtPmZyZWVfdGFibGVbc2VnbWVudC0+c2V0X2luZGV4KytdID0gcGh5X2JsazsKKwlpZiAoc2VnbWVudC0+c2V0X2luZGV4ID49IE1TX0ZSRUVfVEFCTEVfQ05UKQorCQlzZWdtZW50LT5zZXRfaW5kZXggPSAwOworCXNlZ21lbnQtPnVudXNlZF9ibGtfY250Kys7Cit9CisKK3N0YXRpYyB1MTYgbXNfZ2V0X3VudXNlZF9ibG9jayhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIGludCBzZWdfbm8pCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCXN0cnVjdCB6b25lX2VudHJ5ICpzZWdtZW50OworCXUxNiBwaHlfYmxrOworCisJc2VnbWVudCA9ICYobXNfY2FyZC0+c2VnbWVudFtzZWdfbm9dKTsKKworCWlmIChzZWdtZW50LT51bnVzZWRfYmxrX2NudCA8PSAwKQorCQlyZXR1cm4gMHhGRkZGOworCisJcGh5X2JsayA9IHNlZ21lbnQtPmZyZWVfdGFibGVbc2VnbWVudC0+Z2V0X2luZGV4XTsKKwlzZWdtZW50LT5mcmVlX3RhYmxlW3NlZ21lbnQtPmdldF9pbmRleCsrXSA9IDB4RkZGRjsKKwlpZiAoc2VnbWVudC0+Z2V0X2luZGV4ID49IE1TX0ZSRUVfVEFCTEVfQ05UKQorCQlzZWdtZW50LT5nZXRfaW5kZXggPSAwOworCXNlZ21lbnQtPnVudXNlZF9ibGtfY250LS07CisKKwlyZXR1cm4gcGh5X2JsazsKK30KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG1zX3N0YXJ0X2lkeFtdID0geworCTAsIDQ5NCwgOTkwLCAxNDg2LCAxOTgyLCAyNDc4LCAyOTc0LCAzNDcwLAorCTM5NjYsIDQ0NjIsIDQ5NTgsIDU0NTQsIDU5NTAsIDY0NDYsIDY5NDIsIDc0MzgsIDc5MzQKK307CisKK3N0YXRpYyBpbnQgbXNfYXJiaXRyYXRlX2wycChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHUxNiBwaHlfYmxrLCB1MTYgbG9nX29mZiwKKwkJCSAgICB1OCB1czEsIHU4IHVzMikKK3sKKwlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7CisJc3RydWN0IHpvbmVfZW50cnkgKnNlZ21lbnQ7CisJaW50IHNlZ19ubzsKKwl1MTYgdG1wX2JsazsKKworCXNlZ19ubyA9IChpbnQpcGh5X2JsayA+PiA5OworCXNlZ21lbnQgPSAmKG1zX2NhcmQtPnNlZ21lbnRbc2VnX25vXSk7CisJdG1wX2JsayA9IHNlZ21lbnQtPmwycF90YWJsZVtsb2dfb2ZmXTsKKworCWlmICh1czEgIT0gdXMyKSB7CisJCWlmICh1czEgPT0gMCkgeworCQkJaWYgKCEoY2hpcC0+Y2FyZF93cCAmIE1TX0NBUkQpKQorCQkJCW1zX2VyYXNlX2Jsb2NrKGNoaXAsIHRtcF9ibGspOworCQkJbXNfc2V0X3VudXNlZF9ibG9jayhjaGlwLCB0bXBfYmxrKTsKKwkJCXNlZ21lbnQtPmwycF90YWJsZVtsb2dfb2ZmXSA9IHBoeV9ibGs7CisJCX0gZWxzZSB7CisJCQlpZiAoIShjaGlwLT5jYXJkX3dwICYgTVNfQ0FSRCkpCisJCQkJbXNfZXJhc2VfYmxvY2soY2hpcCwgcGh5X2Jsayk7CisJCQltc19zZXRfdW51c2VkX2Jsb2NrKGNoaXAsIHBoeV9ibGspOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHBoeV9ibGsgPCB0bXBfYmxrKSB7CisJCQlpZiAoIShjaGlwLT5jYXJkX3dwICYgTVNfQ0FSRCkpCisJCQkJbXNfZXJhc2VfYmxvY2soY2hpcCwgcGh5X2Jsayk7CisJCQltc19zZXRfdW51c2VkX2Jsb2NrKGNoaXAsIHBoeV9ibGspOworCQl9IGVsc2UgeworCQkJaWYgKCEoY2hpcC0+Y2FyZF93cCAmIE1TX0NBUkQpKQorCQkJCW1zX2VyYXNlX2Jsb2NrKGNoaXAsIHRtcF9ibGspOworCQkJbXNfc2V0X3VudXNlZF9ibG9jayhjaGlwLCB0bXBfYmxrKTsKKwkJCXNlZ21lbnQtPmwycF90YWJsZVtsb2dfb2ZmXSA9IHBoeV9ibGs7CisJCX0KKwl9CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbXNfYnVpbGRfbDJwX3RibChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIGludCBzZWdfbm8pCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCXN0cnVjdCB6b25lX2VudHJ5ICpzZWdtZW50OworCWludCByZXR2YWwsIHRhYmxlX3NpemUsIGRpc2FibGVfY250LCBkZWZlY3RfZmxhZywgaTsKKwl1MTYgc3RhcnQsIGVuZCwgcGh5X2JsaywgbG9nX2JsaywgdG1wX2JsazsKKwl1OCBleHRyYVtNU19FWFRSQV9TSVpFXSwgdXMxLCB1czI7CisKKwlSVFM1MVhfREVCVUdQKCJtc19idWlsZF9sMnBfdGJsOiAlZFxuIiwgc2VnX25vKTsKKworCWlmIChtc19jYXJkLT5zZWdtZW50ID09IE5VTEwpIHsKKwkJcmV0dmFsID0gbXNfaW5pdF9sMnBfdGJsKGNoaXApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJfQorCisJaWYgKG1zX2NhcmQtPnNlZ21lbnRbc2VnX25vXS5idWlsZF9mbGFnKSB7CisJCVJUUzUxWF9ERUJVR1AoImwycCB0YWJsZSBvZiBzZWdtZW50ICVkIGhhcyBiZWVuIGJ1aWx0XG4iLAorCQkJICAgICAgIHNlZ19ubyk7CisJCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwlpZiAoc2VnX25vID09IDApCisJCXRhYmxlX3NpemUgPSA0OTQ7CisJZWxzZQorCQl0YWJsZV9zaXplID0gNDk2OworCisJc2VnbWVudCA9ICYobXNfY2FyZC0+c2VnbWVudFtzZWdfbm9dKTsKKworCWlmIChzZWdtZW50LT5sMnBfdGFibGUgPT0gTlVMTCkgeworCQlzZWdtZW50LT5sMnBfdGFibGUgPSB2bWFsbG9jKHRhYmxlX3NpemUgKiAyKTsKKwkJaWYgKHNlZ21lbnQtPmwycF90YWJsZSA9PSBOVUxMKQorCQkJVFJBQ0VfR09UTyhjaGlwLCBCVUlMRF9GQUlMKTsKKwl9CisJbWVtc2V0KCh1OCAqKSAoc2VnbWVudC0+bDJwX3RhYmxlKSwgMHhmZiwgdGFibGVfc2l6ZSAqIDIpOworCisJaWYgKHNlZ21lbnQtPmZyZWVfdGFibGUgPT0gTlVMTCkgeworCQlzZWdtZW50LT5mcmVlX3RhYmxlID0gdm1hbGxvYyhNU19GUkVFX1RBQkxFX0NOVCAqIDIpOworCQlpZiAoc2VnbWVudC0+ZnJlZV90YWJsZSA9PSBOVUxMKQorCQkJVFJBQ0VfR09UTyhjaGlwLCBCVUlMRF9GQUlMKTsKKwl9CisJbWVtc2V0KCh1OCAqKSAoc2VnbWVudC0+ZnJlZV90YWJsZSksIDB4ZmYsIE1TX0ZSRUVfVEFCTEVfQ05UICogMik7CisKKwlzdGFydCA9ICh1MTYpIHNlZ19ubyA8PCA5OworCWVuZCA9ICh1MTYpIChzZWdfbm8gKyAxKSA8PCA5OworCisJZGlzYWJsZV9jbnQgPSBzZWdtZW50LT5kaXNhYmxlX2NvdW50OworCisJc2VnbWVudC0+Z2V0X2luZGV4ID0gc2VnbWVudC0+c2V0X2luZGV4ID0gMDsKKwlzZWdtZW50LT51bnVzZWRfYmxrX2NudCA9IDA7CisKKwlmb3IgKHBoeV9ibGsgPSBzdGFydDsgcGh5X2JsayA8IGVuZDsgcGh5X2JsaysrKSB7CisJCWlmIChkaXNhYmxlX2NudCkgeworCQkJZGVmZWN0X2ZsYWcgPSAwOworCQkJZm9yIChpID0gMDsgaSA8IHNlZ21lbnQtPmRpc2FibGVfY291bnQ7IGkrKykgeworCQkJCWlmIChwaHlfYmxrID09IHNlZ21lbnQtPmRlZmVjdF9saXN0W2ldKSB7CisJCQkJCWRlZmVjdF9mbGFnID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJaWYgKGRlZmVjdF9mbGFnKSB7CisJCQkJZGlzYWJsZV9jbnQtLTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCXJldHZhbCA9CisJCSAgICBtc19yZWFkX2V4dHJhX2RhdGEoY2hpcCwgcGh5X2JsaywgMCwgZXh0cmEsIE1TX0VYVFJBX1NJWkUpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlSVFM1MVhfREVCVUdQKCJyZWFkIGV4dHJhIGRhdGEgZmFpbFxuIik7CisJCQltc19zZXRfYmFkX2Jsb2NrKGNoaXAsIHBoeV9ibGspOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc2VnX25vID09IG1zX2NhcmQtPnNlZ21lbnRfY250IC0gMSkgeworCQkJaWYgKCEoZXh0cmFbMV0gJiBOT1RfVFJBTlNMQVRJT05fVEFCTEUpKSB7CisJCQkJaWYgKCEoY2hpcC0+Y2FyZF93cCAmIE1TX0NBUkQpKSB7CisJCQkJCXJldHZhbCA9IG1zX2VyYXNlX2Jsb2NrKGNoaXAsIHBoeV9ibGspOworCQkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJCQkJY29udGludWU7CisJCQkJCWV4dHJhWzJdID0gMHhmZjsKKwkJCQkJZXh0cmFbM10gPSAweGZmOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmICghKGV4dHJhWzBdICYgQkxPQ0tfT0spKQorCQkJY29udGludWU7CisJCWlmICghKGV4dHJhWzFdICYgTk9UX0JPT1RfQkxPQ0spKQorCQkJY29udGludWU7CisJCWlmICgoZXh0cmFbMF0gJiBQQUdFX09LKSAhPSBQQUdFX09LKQorCQkJY29udGludWU7CisKKwkJbG9nX2JsayA9ICgodTE2KSBleHRyYVsyXSA8PCA4KSB8IGV4dHJhWzNdOworCisJCWlmIChsb2dfYmxrID09IDB4RkZGRikgeworCQkJaWYgKCEoY2hpcC0+Y2FyZF93cCAmIE1TX0NBUkQpKSB7CisJCQkJcmV0dmFsID0gbXNfZXJhc2VfYmxvY2soY2hpcCwgcGh5X2Jsayk7CisJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCQkJY29udGludWU7CisJCQl9CisJCQltc19zZXRfdW51c2VkX2Jsb2NrKGNoaXAsIHBoeV9ibGspOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoKGxvZ19ibGsgPCBtc19zdGFydF9pZHhbc2VnX25vXSkgfHwKKwkJICAgIChsb2dfYmxrID49IG1zX3N0YXJ0X2lkeFtzZWdfbm8gKyAxXSkpIHsKKwkJCWlmICghKGNoaXAtPmNhcmRfd3AgJiBNU19DQVJEKSkgeworCQkJCXJldHZhbCA9IG1zX2VyYXNlX2Jsb2NrKGNoaXAsIHBoeV9ibGspOworCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbXNfc2V0X3VudXNlZF9ibG9jayhjaGlwLCBwaHlfYmxrKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHNlZ21lbnQtPmwycF90YWJsZVtsb2dfYmxrIC0gbXNfc3RhcnRfaWR4W3NlZ19ub11dID09CisJCSAgICAweEZGRkYpIHsKKwkJCXNlZ21lbnQtPmwycF90YWJsZVtsb2dfYmxrIC0gbXNfc3RhcnRfaWR4W3NlZ19ub11dID0KKwkJCSAgICBwaHlfYmxrOworCQkJY29udGludWU7CisJCX0KKworCQl1czEgPSBleHRyYVswXSAmIDB4MTA7CisJCXRtcF9ibGsgPSBzZWdtZW50LT5sMnBfdGFibGVbbG9nX2JsayAtIG1zX3N0YXJ0X2lkeFtzZWdfbm9dXTsKKwkJcmV0dmFsID0KKwkJICAgIG1zX3JlYWRfZXh0cmFfZGF0YShjaGlwLCB0bXBfYmxrLCAwLCBleHRyYSwgTVNfRVhUUkFfU0laRSk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQljb250aW51ZTsKKwkJdXMyID0gZXh0cmFbMF0gJiAweDEwOworCisJCSh2b2lkKW1zX2FyYml0cmF0ZV9sMnAoY2hpcCwgcGh5X2JsaywKKwkJCQkgICAgICAgbG9nX2JsayAtIG1zX3N0YXJ0X2lkeFtzZWdfbm9dLCB1czEsCisJCQkJICAgICAgIHVzMik7CisJCWNvbnRpbnVlOworCX0KKworCXNlZ21lbnQtPmJ1aWxkX2ZsYWcgPSAxOworCisJUlRTNTFYX0RFQlVHUCgidW51c2VkIGJsb2NrIGNvdW50OiAlZFxuIiwgc2VnbWVudC0+dW51c2VkX2Jsa19jbnQpOworCisJaWYgKHNlZ19ubyA9PSBtc19jYXJkLT5zZWdtZW50X2NudCAtIDEpIHsKKwkJaWYgKHNlZ21lbnQtPnVudXNlZF9ibGtfY250IDwgMikKKwkJCWNoaXAtPmNhcmRfd3AgfD0gTVNfQ0FSRDsKKwl9IGVsc2UgeworCQlpZiAoc2VnbWVudC0+dW51c2VkX2Jsa19jbnQgPCAxKQorCQkJY2hpcC0+Y2FyZF93cCB8PSBNU19DQVJEOworCX0KKworCWlmIChjaGlwLT5jYXJkX3dwICYgTVNfQ0FSRCkKKwkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworCisJZm9yIChsb2dfYmxrID0gbXNfc3RhcnRfaWR4W3NlZ19ub107IGxvZ19ibGsgPCBtc19zdGFydF9pZHhbc2VnX25vICsgMV07CisJICAgICBsb2dfYmxrKyspIHsKKwkJaWYgKHNlZ21lbnQtPmwycF90YWJsZVtsb2dfYmxrIC0gbXNfc3RhcnRfaWR4W3NlZ19ub11dID09CisJCSAgICAweEZGRkYpIHsKKwkJCXBoeV9ibGsgPSBtc19nZXRfdW51c2VkX2Jsb2NrKGNoaXAsIHNlZ19ubyk7CisJCQlpZiAocGh5X2JsayA9PSAweEZGRkYpIHsKKwkJCQljaGlwLT5jYXJkX3dwIHw9IE1TX0NBUkQ7CisJCQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworCQkJfQorCQkJcmV0dmFsID0gbXNfaW5pdF9wYWdlKGNoaXAsIHBoeV9ibGssIGxvZ19ibGssIDAsIDEpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCQlUUkFDRV9HT1RPKGNoaXAsIEJVSUxEX0ZBSUwpOworCQkJc2VnbWVudC0+bDJwX3RhYmxlW2xvZ19ibGsgLSBtc19zdGFydF9pZHhbc2VnX25vXV0gPQorCQkJICAgIHBoeV9ibGs7CisJCQlpZiAoc2VnX25vID09IG1zX2NhcmQtPnNlZ21lbnRfY250IC0gMSkgeworCQkJCWlmIChzZWdtZW50LT51bnVzZWRfYmxrX2NudCA8IDIpIHsKKwkJCQkJY2hpcC0+Y2FyZF93cCB8PSBNU19DQVJEOworCQkJCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoc2VnbWVudC0+dW51c2VkX2Jsa19jbnQgPCAxKSB7CisJCQkJCWNoaXAtPmNhcmRfd3AgfD0gTVNfQ0FSRDsKKwkJCQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmIChzZWdfbm8gPT0gMCkgeworCQlmb3IgKGxvZ19ibGsgPSAwOyBsb2dfYmxrIDwgNDk0OyBsb2dfYmxrKyspIHsKKwkJCXRtcF9ibGsgPSBzZWdtZW50LT5sMnBfdGFibGVbbG9nX2Jsa107CisJCQlpZiAodG1wX2JsayA8IG1zX2NhcmQtPmJvb3RfYmxvY2spIHsKKwkJCQlSVFM1MVhfREVCVUdQKCJCb290IGJsb2NrIGlzIG5vdCB0aGUgZmlyc3QiCisJCQkJCQkJIm5vcm1hbCBibG9jay5cbiIpOworCisJCQkJaWYgKGNoaXAtPmNhcmRfd3AgJiBNU19DQVJEKQorCQkJCQlicmVhazsKKworCQkJCXBoeV9ibGsgPSBtc19nZXRfdW51c2VkX2Jsb2NrKGNoaXAsIDApOworI2lmZGVmIE1TX1NQRUVEVVAKKwkJCQlyZXR2YWwgPQorCQkJCSAgICBtc19hdXRvX2NvcHlfcGFnZShjaGlwLCB0bXBfYmxrLCBwaHlfYmxrLAorCQkJCQkJICAgICAgbG9nX2JsaywgMCwKKwkJCQkJCSAgICAgIG1zX2NhcmQtPnBhZ2Vfb2ZmICsgMSk7CisjZWxzZQorCQkJCXJldHZhbCA9IG1zX2NvcHlfcGFnZShjaGlwLCB0bXBfYmxrLCBwaHlfYmxrLAorCQkJCQkJICAgICAgbG9nX2JsaywgMCwKKwkJCQkJCSAgICAgIG1zX2NhcmQtPnBhZ2Vfb2ZmICsgMSk7CisjZW5kaWYKKwkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCQkJCXNlZ21lbnQtPmwycF90YWJsZVtsb2dfYmxrXSA9IHBoeV9ibGs7CisKKwkJCQlyZXR2YWwgPSBtc19zZXRfYmFkX2Jsb2NrKGNoaXAsIHRtcF9ibGspOworCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworCitCVUlMRF9GQUlMOgorCXNlZ21lbnQtPmJ1aWxkX2ZsYWcgPSAwOworCWlmIChzZWdtZW50LT5sMnBfdGFibGUpIHsKKwkJdmZyZWUoc2VnbWVudC0+bDJwX3RhYmxlKTsKKwkJc2VnbWVudC0+bDJwX3RhYmxlID0gTlVMTDsKKwl9CisJaWYgKHNlZ21lbnQtPmZyZWVfdGFibGUpIHsKKwkJdmZyZWUoc2VnbWVudC0+ZnJlZV90YWJsZSk7CisJCXNlZ21lbnQtPmZyZWVfdGFibGUgPSBOVUxMOworCX0KKworCXJldHVybiBTVEFUVVNfRkFJTDsKK30KKworaW50IHJlc2V0X21zX2NhcmQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKwlpbnQgcmV0dmFsOworCisJbWVtc2V0KG1zX2NhcmQsIDAsIHNpemVvZihzdHJ1Y3QgbXNfaW5mbykpOworCisJZW5hYmxlX2NhcmRfY2xvY2soY2hpcCwgTVNfQ0FSRCk7CisKKwlyZXR2YWwgPSBydHM1MXhfc2VsZWN0X2NhcmQoY2hpcCwgTVNfQ0FSRCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwltc19jYXJkLT5tc190eXBlID0gMDsKKwltc19jYXJkLT5sYXN0X3J3X2ludCA9IDA7CisKKwlyZXR2YWwgPSByZXNldF9tc19wcm8oY2hpcCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlpZiAobXNfY2FyZC0+Y2hlY2tfbXNfZmxvdykgeworCQkJcmV0dmFsID0gcmVzZXRfbXMoY2hpcCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJaWYgKGNoaXAtPm9wdGlvbi5yZXNldF9vcl9yd19mYWlsX3NldF9wYWRfZHJpdmUpIHsKKwkJCQkJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsCisJCQkJCQlDQVJEX0RSSVZFX1NFTCwgU0QyMF9EUklWRV9NQVNLLAorCQkJCQkJRFJJVkVfOG1BKTsKKwkJCQl9CisJCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoY2hpcC0+b3B0aW9uLnJlc2V0X29yX3J3X2ZhaWxfc2V0X3BhZF9kcml2ZSkgeworCQkJCXJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0RSSVZFX1NFTCwKKwkJCQkJCSAgICAgIFNEMjBfRFJJVkVfTUFTSywKKwkJCQkJCSAgICAgIERSSVZFXzhtQSk7CisJCQl9CisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkJfQorCX0KKworCXJldHZhbCA9IG1zX3NldF9pbml0X3BhcmEoY2hpcCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlpZiAoIUNIS19NU1BSTyhtc19jYXJkKSkgeworCQlyZXR2YWwgPSBtc19idWlsZF9sMnBfdGJsKGNoaXAsIG1zX2NhcmQtPnRvdGFsX2Jsb2NrIC8gNTEyIC0gMSk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwl9CisKKwlSVFM1MVhfREVCVUdQKCJtc19jYXJkLT5tc190eXBlID0gMHgleFxuIiwgbXNfY2FyZC0+bXNfdHlwZSk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbXNwcm9fc2V0X3J3X2NtZChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHUzMiBzdGFydF9zZWMsCisJCQkgICAgdTE2IHNlY19jbnQsIHU4IGNtZCkKK3sKKwlpbnQgcmV0dmFsLCBpOworCXU4IGRhdGFbOF07CisKKwlkYXRhWzBdID0gY21kOworCWRhdGFbMV0gPSAodTgpIChzZWNfY250ID4+IDgpOworCWRhdGFbMl0gPSAodTgpIHNlY19jbnQ7CisJZGF0YVszXSA9ICh1OCkgKHN0YXJ0X3NlYyA+PiAyNCk7CisJZGF0YVs0XSA9ICh1OCkgKHN0YXJ0X3NlYyA+PiAxNik7CisJZGF0YVs1XSA9ICh1OCkgKHN0YXJ0X3NlYyA+PiA4KTsKKwlkYXRhWzZdID0gKHU4KSBzdGFydF9zZWM7CisJZGF0YVs3XSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVNfTUFYX1JFVFJZX0NPVU5UOyBpKyspIHsKKwkJcmV0dmFsID0KKwkJICAgIG1zX3dyaXRlX2J5dGVzKGNoaXAsIFBST19FWF9TRVRfQ01ELCA3LCBXQUlUX0lOVCwgZGF0YSwgOCk7CisJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCit2b2lkIG1zcHJvX3N0b3Bfc2VxX21vZGUoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKwlpbnQgcmV0dmFsOworCisJaWYgKG1zX2NhcmQtPnNlcV9tb2RlKSB7CisJCXJldHZhbCA9IG1zX3N3aXRjaF9jbG9jayhjaGlwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCXJldHVybjsKKworCQltc19jYXJkLT5zZXFfbW9kZSA9IDA7CisJCW1zX2NhcmQtPnRvdGFsX3NlY19jbnQgPSAwOworCQltc19jYXJkLT5sYXN0X3J3X2ludCA9IDA7CisJCW1zX3NlbmRfY21kKGNoaXAsIFBST19TVE9QLCBXQUlUX0lOVCk7CisKKwkJcnRzNTF4X2VwMF93cml0ZV9yZWdpc3RlcihjaGlwLCBNQ19GSUZPX0NUTCwgRklGT19GTFVTSCwKKwkJCQkJICBGSUZPX0ZMVVNIKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1zX2F1dG9fdHVuZV9jbG9jayhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCWludCByZXR2YWw7CisKKwlpZiAoY2hpcC0+YXNpY19jb2RlKSB7CisJCWlmIChtc19jYXJkLT5tc19jbG9jayA+IDMwKQorCQkJbXNfY2FyZC0+bXNfY2xvY2sgLT0gMjA7CisJfSBlbHNlIHsKKwkJaWYgKG1zX2NhcmQtPm1zX2Nsb2NrID09IENMS184MCkKKwkJCW1zX2NhcmQtPm1zX2Nsb2NrID0gQ0xLXzYwOworCQllbHNlIGlmIChtc19jYXJkLT5tc19jbG9jayA9PSBDTEtfNjApCisJCQltc19jYXJkLT5tc19jbG9jayA9IENMS180MDsKKwl9CisKKwlyZXR2YWwgPSBtc19zd2l0Y2hfY2xvY2soY2hpcCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbXNwcm9fcndfbXVsdGlfc2VjdG9yKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwKKwkJCQkgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1MzIgc3RhcnRfc2VjdG9yLAorCQkJCSB1MTYgc2VjdG9yX2NudCkKK3sKKwlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7CisJaW50IHJldHZhbCwgbW9kZV8yayA9IDA7CisJdTE2IGNvdW50OworCXU4IHZhbCwgdHJhbnNfbW9kZSwgcndfdHBjLCByd19jbWQ7CisKKwltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfTk9fRVJST1IpOworCisJbXNfY2FyZC0+Y291bnRlciA9IDA7CisKKwlpZiAoQ0hLX01TSEcobXNfY2FyZCkpIHsKKwkJaWYgKChzdGFydF9zZWN0b3IgJSA0KSB8fCAoc2VjdG9yX2NudCAlIDQpKSB7CisJCQlpZiAoc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKKwkJCQlyd190cGMgPSBQUk9fUkVBRF9MT05HX0RBVEE7CisJCQkJcndfY21kID0gUFJPX1JFQURfREFUQTsKKwkJCX0gZWxzZSB7CisJCQkJcndfdHBjID0gUFJPX1dSSVRFX0xPTkdfREFUQTsKKwkJCQlyd19jbWQgPSBQUk9fV1JJVEVfREFUQTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChzcmItPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkgeworCQkJCXJ3X3RwYyA9IFBST19SRUFEX1FVQURfREFUQTsKKwkJCQlyd19jbWQgPSBQUk9fUkVBRF8yS19EQVRBOworCQkJfSBlbHNlIHsKKwkJCQlyd190cGMgPSBQUk9fV1JJVEVfUVVBRF9EQVRBOworCQkJCXJ3X2NtZCA9IFBST19XUklURV8yS19EQVRBOworCQkJfQorCQkJbW9kZV8yayA9IDE7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKKwkJCXJ3X3RwYyA9IFBST19SRUFEX0xPTkdfREFUQTsKKwkJCXJ3X2NtZCA9IFBST19SRUFEX0RBVEE7CisJCX0gZWxzZSB7CisJCQlyd190cGMgPSBQUk9fV1JJVEVfTE9OR19EQVRBOworCQkJcndfY21kID0gUFJPX1dSSVRFX0RBVEE7CisJCX0KKwl9CisKKwlyZXR2YWwgPSBtc19zd2l0Y2hfY2xvY2soY2hpcCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlpZiAoc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpCisJCXRyYW5zX21vZGUgPSBNU19UTV9BVVRPX1JFQUQ7CisJZWxzZQorCQl0cmFuc19tb2RlID0gTVNfVE1fQVVUT19XUklURTsKKworCXZhbCA9IG1zX2NhcmQtPmxhc3RfcndfaW50OworCisJaWYgKG1zX2NhcmQtPnNlcV9tb2RlKSB7CisJCWlmICgobXNfY2FyZC0+cHJlX2RpciAhPSBzcmItPnNjX2RhdGFfZGlyZWN0aW9uKQorCQkgICAgfHwgKChtc19jYXJkLT5wcmVfc2VjX2FkZHIgKyBtc19jYXJkLT5wcmVfc2VjX2NudCkgIT0KKwkJCXN0YXJ0X3NlY3RvcikKKwkJICAgIHx8IChtb2RlXzJrICYmIChtc19jYXJkLT5zZXFfbW9kZSAmIE1PREVfNTEyX1NFUSkpCisJCSAgICB8fCAoIW1vZGVfMmsgJiYgKG1zX2NhcmQtPnNlcV9tb2RlICYgTU9ERV8yS19TRVEpKQorCQkgICAgfHwgISh2YWwgJiBNU19JTlRfQlJFUSkKKwkJICAgIHx8ICgobXNfY2FyZC0+dG90YWxfc2VjX2NudCArIHNlY3Rvcl9jbnQpID4gMHhGRTAwKSkgeworCQkJbXNfY2FyZC0+c2VxX21vZGUgPSAwOworCQkJbXNfY2FyZC0+dG90YWxfc2VjX2NudCA9IDA7CisJCQltc19jYXJkLT5sYXN0X3J3X2ludCA9IDA7CisJCQlpZiAodmFsICYgTVNfSU5UX0JSRVEpIHsKKwkJCQlyZXR2YWwgPSBtc19zZW5kX2NtZChjaGlwLCBQUk9fU1RPUCwgV0FJVF9JTlQpOworCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJCQkJcnRzNTF4X2VwMF93cml0ZV9yZWdpc3RlcihjaGlwLCBNQ19GSUZPX0NUTCwKKwkJCQkJRklGT19GTFVTSCwgRklGT19GTFVTSCk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIW1zX2NhcmQtPnNlcV9tb2RlKSB7CisJCW1zX2NhcmQtPnRvdGFsX3NlY19jbnQgPSAwOworCQlpZiAoc2VjdG9yX2NudCA+PSAweDgwKSB7CisJCQlpZiAoKG1zX2NhcmQtPmNhcGFjaXR5IC0gc3RhcnRfc2VjdG9yKSA+IDB4RkUwMCkKKwkJCQljb3VudCA9IDB4RkUwMDsKKwkJCWVsc2UKKwkJCQljb3VudCA9CisJCQkJICAgICh1MTYpIChtc19jYXJkLT5jYXBhY2l0eSAtIHN0YXJ0X3NlY3Rvcik7CisJCQlpZiAoY291bnQgPiBzZWN0b3JfY250KSB7CisJCQkJaWYgKG1vZGVfMmspCisJCQkJCW1zX2NhcmQtPnNlcV9tb2RlIHw9IE1PREVfMktfU0VROworCQkJCWVsc2UKKwkJCQkJbXNfY2FyZC0+c2VxX21vZGUgfD0gTU9ERV81MTJfU0VROworCQkJfQorCQl9IGVsc2UgeworCQkJY291bnQgPSBzZWN0b3JfY250OworCQl9CisJCXJldHZhbCA9IG1zcHJvX3NldF9yd19jbWQoY2hpcCwgc3RhcnRfc2VjdG9yLCBjb3VudCwgcndfY21kKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJbXNfY2FyZC0+c2VxX21vZGUgPSAwOworCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCX0KKwl9CisKKwlyZXR2YWwgPQorCSAgICBtc190cmFuc2Zlcl9kYXRhKGNoaXAsIHRyYW5zX21vZGUsIHJ3X3RwYywgc2VjdG9yX2NudCwgV0FJVF9JTlQsCisJCQkgICAgIG1vZGVfMmssIHNjc2lfc2dfY291bnQoc3JiKSwgc2NzaV9zZ2xpc3Qoc3JiKSwKKwkJCSAgICAgc2NzaV9idWZmbGVuKHNyYikpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJbXNfY2FyZC0+c2VxX21vZGUgPSAwOworCQlydHM1MXhfZXAwX3JlYWRfcmVnaXN0ZXIoY2hpcCwgTVNfVFJBTlNfQ0ZHLCAmdmFsKTsKKwkJcnRzNTF4X2NsZWFyX21zX2Vycm9yKGNoaXApOworCQlpZiAodmFsICYgTVNfSU5UX0JSRVEpCisJCQltc19zZW5kX2NtZChjaGlwLCBQUk9fU1RPUCwgV0FJVF9JTlQpOworCQlpZiAodmFsICYgKE1TX0NSQzE2X0VSUiB8IE1TX1JEWV9USU1FT1VUKSkgeworCQkJUlRTNTFYX0RFQlVHUCgiTVNQcm8gQ1JDIGVycm9yLCB0dW5lIGNsb2NrIVxuIik7CisJCQltc19hdXRvX3R1bmVfY2xvY2soY2hpcCk7CisJCX0KKworCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwl9CisKKwltc19jYXJkLT5wcmVfc2VjX2FkZHIgPSBzdGFydF9zZWN0b3I7CisJbXNfY2FyZC0+cHJlX3NlY19jbnQgPSBzZWN0b3JfY250OworCW1zX2NhcmQtPnByZV9kaXIgPSBzcmItPnNjX2RhdGFfZGlyZWN0aW9uOworCW1zX2NhcmQtPnRvdGFsX3NlY19jbnQgKz0gc2VjdG9yX2NudDsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtc3Byb19yZWFkX2Zvcm1hdF9wcm9ncmVzcyhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsCisJCQkJICAgICAgY29uc3QgaW50IHNob3J0X2RhdGFfbGVuKQoreworCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKwlpbnQgcmV0dmFsLCBpOworCXUzMiB0b3RhbF9wcm9ncmVzcywgY3VyX3Byb2dyZXNzOworCXU4IGNudCwgdG1wOworCXU4IGRhdGFbOF07CisKKwltc19jYXJkLT5mb3JtYXRfc3RhdHVzID0gRk9STUFUX0ZBSUw7CisKKwlyZXR2YWwgPSBtc19zd2l0Y2hfY2xvY2soY2hpcCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlSVFM1MVhfUkVBRF9SRUcoY2hpcCwgTVNfVFJBTlNfQ0ZHLCAmdG1wKTsKKworCWlmICgodG1wICYgKE1TX0lOVF9DRUQgfCBNU19JTlRfQ01ETksgfCBNU19JTlRfRVJSKSkgPT0gTVNfSU5UX0NFRCkgeworCQltc19jYXJkLT5mb3JtYXRfc3RhdHVzID0gRk9STUFUX1NVQ0NFU1M7CisJCW1zX2NhcmQtPnByb191bmRlcl9mb3JtYXR0aW5nID0gMDsKKwkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworCX0KKwlpZiAoIQorCSAgICAoKHRtcCAmIChNU19JTlRfQlJFUSB8IE1TX0lOVF9DRUQgfCBNU19JTlRfQ01ETksgfCBNU19JTlRfRVJSKSkgPT0KKwkgICAgIE1TX0lOVF9CUkVRKSkgeworCQltc19jYXJkLT5wcm9fdW5kZXJfZm9ybWF0dGluZyA9IDA7CisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJfQorCisJaWYgKHNob3J0X2RhdGFfbGVuID49IDI1NikKKwkJY250ID0gMDsKKwllbHNlCisJCWNudCA9ICh1OCkgc2hvcnRfZGF0YV9sZW47CisKKwlyZXR2YWwgPQorCSAgICBtc19yZWFkX2J5dGVzKGNoaXAsIFBST19SRUFEX1NIT1JUX0RBVEEsIGNudCwgV0FJVF9JTlQsIGRhdGEsIDgpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJdG90YWxfcHJvZ3Jlc3MgPQorCSAgICAoZGF0YVswXSA8PCAyNCkgfCAoZGF0YVsxXSA8PCAxNikgfCAoZGF0YVsyXSA8PCA4KSB8IGRhdGFbM107CisJY3VyX3Byb2dyZXNzID0KKwkgICAgKGRhdGFbNF0gPDwgMjQpIHwgKGRhdGFbNV0gPDwgMTYpIHwgKGRhdGFbNl0gPDwgOCkgfCBkYXRhWzddOworCisJUlRTNTFYX0RFQlVHUCgidG90YWxfcHJvZ3Jlc3MgPSAlZCwgY3VyX3Byb2dyZXNzID0gJWRcbiIsCisJCSAgICAgICB0b3RhbF9wcm9ncmVzcywgY3VyX3Byb2dyZXNzKTsKKworCWlmICh0b3RhbF9wcm9ncmVzcyA9PSAwKSB7CisJCW1zX2NhcmQtPnByb2dyZXNzID0gMDsKKwl9IGVsc2UgeworCQl1NjQgdWxsdG1wID0gKHU2NCkgY3VyX3Byb2dyZXNzICogKHU2NCkgNjU1MzU7CisJCWRvX2Rpdih1bGx0bXAsIHRvdGFsX3Byb2dyZXNzKTsKKwkJbXNfY2FyZC0+cHJvZ3Jlc3MgPSAodTE2KSB1bGx0bXA7CisJfQorCVJUUzUxWF9ERUJVR1AoInByb2dyZXNzID0gJWRcbiIsIG1zX2NhcmQtPnByb2dyZXNzKTsKKworCWZvciAoaSA9IDA7IGkgPCAyNTAwOyBpKyspIHsKKwkJUlRTNTFYX1JFQURfUkVHKGNoaXAsIE1TX1RSQU5TX0NGRywgJnRtcCk7CisJCWlmICh0bXAgJgorCQkgICAgKE1TX0lOVF9DRUQgfCBNU19JTlRfQ01ETksgfCBNU19JTlRfQlJFUSB8IE1TX0lOVF9FUlIpKQorCQkJYnJlYWs7CisKKwkJd2FpdF90aW1lb3V0KDEpOworCX0KKworCWlmIChpID09IDI1MDApCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwlSVFM1MVhfREVCVUdQKCJNU1BybyBmb3JtYXQgdG1wOiVkXG4iLCB0bXApOworCisJaWYgKHRtcCAmIChNU19JTlRfQ01ETksgfCBNU19JTlRfRVJSKSkKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAodG1wICYgTVNfSU5UX0NFRCkgeworCQltc19jYXJkLT5mb3JtYXRfc3RhdHVzID0gRk9STUFUX1NVQ0NFU1M7CisJCW1zX2NhcmQtPnByb191bmRlcl9mb3JtYXR0aW5nID0gMDsKKwl9IGVsc2UgaWYgKHRtcCAmIE1TX0lOVF9CUkVRKSB7CisJCW1zX2NhcmQtPmZvcm1hdF9zdGF0dXMgPSBGT1JNQVRfSU5fUFJPR1JFU1M7CisJfSBlbHNlIHsKKwkJbXNfY2FyZC0+Zm9ybWF0X3N0YXR1cyA9IEZPUk1BVF9GQUlMOworCQltc19jYXJkLT5wcm9fdW5kZXJfZm9ybWF0dGluZyA9IDA7CisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJfQorCisJUlRTNTFYX0RFQlVHUCgiTVNQcm8gZm9ybWF0IGZvcm1hdF9zdGF0dXM6JWRcbiIsCisJCSAgICAgICBtc19jYXJkLT5mb3JtYXRfc3RhdHVzKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKwordm9pZCBtc3Byb19wb2xsaW5nX2Zvcm1hdF9zdGF0dXMoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKwlpbnQgaTsKKworCWlmIChtc19jYXJkLT5wcm9fdW5kZXJfZm9ybWF0dGluZykgeworCQlmb3IgKGkgPSAwOyBpIDwgNjU1MzU7IGkrKykgeworCQkJbXNwcm9fcmVhZF9mb3JtYXRfcHJvZ3Jlc3MoY2hpcCwgTVNfU0hPUlRfREFUQV9MRU4pOworCQkJaWYgKG1zX2NhcmQtPmZvcm1hdF9zdGF0dXMgIT0gRk9STUFUX0lOX1BST0dSRVNTKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuOworfQorCit2b2lkIG1zcHJvX2Zvcm1hdF9zZW5zZShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBsdW4pCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCisJaWYgKENIS19GT1JNQVRfU1RBVFVTKG1zX2NhcmQsIEZPUk1BVF9TVUNDRVNTKSkgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTk9fU0VOU0UpOworCQltc19jYXJkLT5wcm9fdW5kZXJfZm9ybWF0dGluZyA9IDA7CisJCW1zX2NhcmQtPnByb2dyZXNzID0gMDsKKwl9IGVsc2UgaWYgKENIS19GT1JNQVRfU1RBVFVTKG1zX2NhcmQsIEZPUk1BVF9JTl9QUk9HUkVTUykpIHsKKwkJc2V0X3NlbnNlX2RhdGEoY2hpcCwgbHVuLCBDVVJfRVJSLCAweDAyLCAwLCAweDA0LCAweDA0LAorCQkJICAgICAgIDAsICh1MTYpIChtc19jYXJkLT5wcm9ncmVzcykpOworCX0gZWxzZSB7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9GT1JNQVRfQ01EX0ZBSUxFRCk7CisJCW1zX2NhcmQtPnByb191bmRlcl9mb3JtYXR0aW5nID0gMDsKKwkJbXNfY2FyZC0+cHJvZ3Jlc3MgPSAwOworCX0KK30KKworaW50IG1zcHJvX2Zvcm1hdChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwKKwkJIGludCBzaG9ydF9kYXRhX2xlbiwgaW50IHF1aWNrX2Zvcm1hdCkKK3sKKwlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7CisJaW50IHJldHZhbCwgaTsKKwl1OCBidWZbOF0sIHRtcDsKKwl1MTYgcGFyYTsKKworCXJldHZhbCA9IG1zX3N3aXRjaF9jbG9jayhjaGlwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHZhbCA9IG1zX3NldF9yd19yZWdfYWRkcihjaGlwLCAweDAwLCAweDAwLCBQcm9fVFBDUGFybSwgMHgwMSk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwltZW1zZXQoYnVmLCAwLCAyKTsKKwlzd2l0Y2ggKHNob3J0X2RhdGFfbGVuKSB7CisJY2FzZSAzMjoKKwkJYnVmWzBdID0gMDsKKwkJYnJlYWs7CisJY2FzZSA2NDoKKwkJYnVmWzBdID0gMTsKKwkJYnJlYWs7CisJY2FzZSAxMjg6CisJCWJ1ZlswXSA9IDI7CisJCWJyZWFrOworCWNhc2UgMjU2OgorCWRlZmF1bHQ6CisJCWJ1ZlswXSA9IDM7CisJCWJyZWFrOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBNU19NQVhfUkVUUllfQ09VTlQ7IGkrKykgeworCQlyZXR2YWwgPQorCQkgICAgbXNfd3JpdGVfYnl0ZXMoY2hpcCwgUFJPX1dSSVRFX1JFRywgMSwgTk9fV0FJVF9JTlQsIGJ1ZiwgMik7CisJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCS8qIEZvcm1hdCBjb21tYW5kICovCisJaWYgKHF1aWNrX2Zvcm1hdCkKKwkJcGFyYSA9IDB4MDAwMDsKKwllbHNlCisJCXBhcmEgPSAweDAwMDE7CisJcmV0dmFsID0gbXNwcm9fc2V0X3J3X2NtZChjaGlwLCAwLCBwYXJhLCBQUk9fRk9STUFUKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkvKiBDaGVjayBJTlQgKi8KKwlSVFM1MVhfUkVBRF9SRUcoY2hpcCwgTVNfVFJBTlNfQ0ZHLCAmdG1wKTsKKwlpZiAodG1wICYgKE1TX0lOVF9DTUROSyB8IE1TX0lOVF9FUlIpKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJaWYgKCh0bXAgJiAoTVNfSU5UX0JSRVEgfCBNU19JTlRfQ0VEKSkgPT0gTVNfSU5UX0JSRVEpIHsKKwkJbXNfY2FyZC0+cHJvX3VuZGVyX2Zvcm1hdHRpbmcgPSAxOworCQltc19jYXJkLT5wcm9ncmVzcyA9IDA7CisJCW1zX2NhcmQtPmZvcm1hdF9zdGF0dXMgPSBGT1JNQVRfSU5fUFJPR1JFU1M7CisJCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwlpZiAodG1wICYgTVNfSU5UX0NFRCkgeworCQltc19jYXJkLT5wcm9fdW5kZXJfZm9ybWF0dGluZyA9IDA7CisJCW1zX2NhcmQtPnByb2dyZXNzID0gMDsKKwkJbXNfY2FyZC0+Zm9ybWF0X3N0YXR1cyA9IEZPUk1BVF9TVUNDRVNTOworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLCBTRU5TRV9UWVBFX05PX1NFTlNFKTsKKwkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworCX0KKworCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7Cit9CisKKyNpZmRlZiBNU19TUEVFRFVQCitzdGF0aWMgaW50IG1zX3JlYWRfbXVsdGlwbGVfcGFnZXMoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1MTYgcGh5X2JsaywKKwkJCQkgIHUxNiBsb2dfYmxrLCB1OCBzdGFydF9wYWdlLCB1OCBlbmRfcGFnZSwKKwkJCQkgIHU4ICpidWYsIHZvaWQgKipwdHIsIHVuc2lnbmVkIGludCAqb2Zmc2V0KQoreworCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKwlpbnQgcmV0dmFsOworCWludCBzZW5kX2Jsa2VuZDsKKwl1OCBleHRyYVtNU19FWFRSQV9TSVpFXSwgdmFsMSwgdmFsMiwgZGF0YVs2XTsKKwl1OCBwYWdlX2NudCA9IGVuZF9wYWdlIC0gc3RhcnRfcGFnZSwgcGFnZV9hZGRyLCBzZWNfY250OworCisJaWYgKGVuZF9wYWdlICE9IChtc19jYXJkLT5wYWdlX29mZiArIDEpKQorCQlzZW5kX2Jsa2VuZCA9IDE7CisJZWxzZQorCQlzZW5kX2Jsa2VuZCA9IDA7CisKKwlyZXR2YWwgPQorCSAgICBtc19yZWFkX2V4dHJhX2RhdGEoY2hpcCwgcGh5X2Jsaywgc3RhcnRfcGFnZSwgZXh0cmEsIE1TX0VYVFJBX1NJWkUpOworCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaWYgKChleHRyYVsxXSAmIDB4MzApICE9IDB4MzApIHsKKwkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19GTEFTSF9SRUFEX0VSUk9SKTsKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCX0KKwl9CisKKwlpZiAoQ0hLX01TNEJJVChtc19jYXJkKSkgeworCQkvKiBQYXJhbGxlbCBpbnRlcmZhY2UgKi8KKwkJZGF0YVswXSA9IDB4ODg7CisJfSBlbHNlIHsKKwkJLyogU2VyaWFsIGludGVyZmFjZSAqLworCQlkYXRhWzBdID0gMHg4MDsKKwl9CisJLyogQmxvY2sgQWRkcmVzcyAqLworCWRhdGFbMV0gPSAwOworCWRhdGFbMl0gPSAodTgpIChwaHlfYmxrID4+IDgpOworCWRhdGFbM10gPSAodTgpIHBoeV9ibGs7CisJLyogUGFnZSBOdW1iZXIKKwkgKiBFeHRyYSBkYXRhIGFjY2VzcyBtb2RlICovCisJZGF0YVs0XSA9IDA7CisJZGF0YVs1XSA9IHN0YXJ0X3BhZ2U7CisKKwlyZXR2YWwgPQorCSAgICBtc19hdXRvX3NldF9jbWQoY2hpcCwgT3ZlcndyaXRlRmxhZywgTVNfRVhUUkFfU0laRSwgU3lzdGVtUGFybSwgNiwKKwkJCSAgICBCTE9DS19SRUFELCBXQUlUX0lOVCwgZGF0YSwgNiwgJnZhbDEpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcnRzNTF4X2luaXRfY21kKGNoaXApOworCisJaWYgKHNlbmRfYmxrZW5kKQorCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19CTEtFTkQsIFNFVF9CTEtFTkQsCisJCQkgICAgICAgU0VUX0JMS0VORCk7CisJZWxzZQorCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19CTEtFTkQsIFNFVF9CTEtFTkQsIDApOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX1RSQU5TX0NGRywgV0FJVF9JTlQsCisJCSAgICAgICBOT19XQUlUX0lOVCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfU0VDVE9SX0NOVF9MLCAweEZGLAorCQkgICAgICAgKHU4KSBwYWdlX2NudCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfU0VDVE9SX0NOVF9ILCAweEZGLCAwKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19UUEMsIDB4RkYsIFJFQURfUEFHRV9EQVRBKTsKKworCXRyYW5zX2RtYV9lbmFibGUoRE1BX0ZST01fREVWSUNFLCBjaGlwLCA1MTIgKiBwYWdlX2NudCwgRE1BXzUxMik7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19UUkFOU0ZFUiwgMHhGRiwKKwkJICAgICAgIE1TX1RSQU5TRkVSX1NUQVJUIHwgTVNfVE1fTVVMVElfUkVBRCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgQ0hFQ0tfUkVHX0NNRCwgTVNfVFJBTlNGRVIsIE1TX1RSQU5TRkVSX0VORCwKKwkJICAgICAgIE1TX1RSQU5TRkVSX0VORCk7CisKKwlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DRElSIHwgU1RBR0VfTVNfU1RBVFVTLCAxMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcmV0dmFsID0KKwkgICAgcnRzNTF4X3RyYW5zZmVyX2RhdGFfcGFydGlhbChjaGlwLCBSQ1ZfQlVMS19QSVBFKGNoaXApLCAodm9pZCAqKWJ1ZiwKKwkJCQkJIHB0ciwgb2Zmc2V0LCA1MTIgKiBwYWdlX2NudCwKKwkJCQkJIHNjc2lfc2dfY291bnQoY2hpcC0+c3JiKSwgTlVMTCwgMjAwMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHM1MXhfY2xlYXJfbXNfZXJyb3IoY2hpcCk7CisJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1RJTUVET1VUKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCVRSQUNFX0dPVE8oY2hpcCwgRmFpbCk7CisJfQorCXJldHZhbCA9IHJ0czUxeF9nZXRfcnNwKGNoaXAsIDMsIDIwMCk7CisJaWYgKENIRUNLX01TX1RSQU5TX0ZBSUwoY2hpcCwgcmV0dmFsKSkgeworCQlydHM1MXhfY2xlYXJfbXNfZXJyb3IoY2hpcCk7CisJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1RJTUVET1VUKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCVRSQUNFX0dPVE8oY2hpcCwgRmFpbCk7CisJfQorCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworCitGYWlsOgorCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgTVNfU0VDVE9SX0NOVF9MLCAwLCAwKTsKKworCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0NSIHwgU1RBR0VfTVNfU1RBVFVTLCAxMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcmV0dmFsID0gcnRzNTF4X2dldF9yc3AoY2hpcCwgMywgMjAwKTsKKworCWlmIChDSEVDS19NU19UUkFOU19GQUlMKGNoaXAsIHJldHZhbCkpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwlzZWNfY250ID0gY2hpcC0+cnNwX2J1ZlswXTsKKwlSVFM1MVhfREVCVUdQKCIlZCBwYWdlcyBuZWVkIGJlIHRyYXNmZXJyZWQsICVkIHBhZ2VzIHJlbWFpbmVkXG4iLAorCQkgICAgICAgKGludClwYWdlX2NudCwgKGludClzZWNfY250KTsKKwlwYWdlX2FkZHIgPSBzdGFydF9wYWdlICsgKHBhZ2VfY250IC0gc2VjX2NudCk7CisKKwlpZiAoQ0hLX01TNEJJVChtc19jYXJkKSkgeworCQl2YWwxID0gY2hpcC0+cnNwX2J1ZlsxXTsKKwkJUlRTNTFYX0RFQlVHUCgiTVNfVFJBTlNfQ0ZHOiAweCV4XG4iLCB2YWwxKTsKKwl9IGVsc2UgeworCQl2YWwxID0gMDsKKwl9CisKKwl2YWwyID0gY2hpcC0+cnNwX2J1ZlsyXTsKKwlSVFM1MVhfREVCVUdQKCJHRVRfSU5UOiAweCV4XG4iLCB2YWwyKTsKKworCWlmICgodmFsMSAmIElOVF9DTUROSykgfHwgKHZhbDIgJiBJTlRfUkVHX0NNRE5LKSkgeworCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQ01EX05LKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwl9CisKKwlpZiAoKHZhbDEgJiBJTlRfRVJSKSB8fCAodmFsMiAmIElOVF9SRUdfRVJSKSkgeworCQlpZiAoKHZhbDEgJiBJTlRfQlJFUSkgfHwgKHZhbDIgJiBJTlRfUkVHX0JSRVEpKSB7CisJCQlyZXR2YWwgPSBtc19yZWFkX3N0YXR1c19yZWcoY2hpcCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJaWYgKCEoY2hpcC0+Y2FyZF93cCAmIE1TX0NBUkQpKSB7CisJCQkJCXJlc2V0X21zKGNoaXApOworCQkJCQltc19zZXRfcGFnZV9zdGF0dXMobG9nX2Jsaywgc2V0UFNfTkcsCisJCQkJCQlleHRyYSwgTVNfRVhUUkFfU0laRSk7CisJCQkJCW1zX3dyaXRlX2V4dHJhX2RhdGEoY2hpcCwgcGh5X2JsaywKKwkJCQkJCXBhZ2VfYWRkciwgZXh0cmEsCisJCQkJCQlNU19FWFRSQV9TSVpFKTsKKwkJCQl9CisJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0ZMQVNIX1JFQURfRVJST1IpOworCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfRkxBU0hfUkVBRF9FUlJPUik7CisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKENIS19NUzRCSVQobXNfY2FyZCkpIHsKKwkJCWlmICghKHZhbDEgJiBJTlRfQlJFUSkgJiYgISh2YWwyICYgSU5UX1JFR19CUkVRKSkgeworCQkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19CUkVRX0VSUk9SKTsKKwkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCEodmFsMiAmIElOVF9SRUdfQlJFUSkpIHsKKwkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQlJFUV9FUlJPUik7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCX0KKwkJfQorCX0KKworCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7Cit9CisKK3N0YXRpYyBpbnQgbXNfd3JpdGVfbXVsdGlwbGVfcGFnZXMoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1MTYgb2xkX2JsaywKKwkJCQkgICB1MTYgbmV3X2JsaywgdTE2IGxvZ19ibGssIHU4IHN0YXJ0X3BhZ2UsCisJCQkJICAgdTggZW5kX3BhZ2UsIHU4ICpidWYsIHZvaWQgKipwdHIsCisJCQkJICAgdW5zaWduZWQgaW50ICpvZmZzZXQpCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCWludCByZXR2YWwsIGk7CisJaW50IHNlbmRfYmxrZW5kOworCXU4IHZhbCwgZGF0YVsxNl07CisJdTggcGFnZV9jbnQgPSBlbmRfcGFnZSAtIHN0YXJ0X3BhZ2U7CisKKwlpZiAoKGVuZF9wYWdlID09IChtc19jYXJkLT5wYWdlX29mZiArIDEpKSB8fCAocGFnZV9jbnQgPT0gMSkpCisJCXNlbmRfYmxrZW5kID0gMDsKKwllbHNlCisJCXNlbmRfYmxrZW5kID0gMTsKKworCWlmICghc3RhcnRfcGFnZSkgeworCQlpZiAoQ0hLX01TNEJJVChtc19jYXJkKSkgeworCQkJLyogUGFyYWxsZWwgaW50ZXJmYWNlICovCisJCQlkYXRhWzBdID0gMHg4ODsKKwkJfSBlbHNlIHsKKwkJCS8qIFNlcmlhbCBpbnRlcmZhY2UgKi8KKwkJCWRhdGFbMF0gPSAweDgwOworCQl9CisJCS8qIEJsb2NrIEFkZHJlc3MgKi8KKwkJZGF0YVsxXSA9IDA7CisJCWRhdGFbMl0gPSAodTgpIChvbGRfYmxrID4+IDgpOworCQlkYXRhWzNdID0gKHU4KSBvbGRfYmxrOworCQlkYXRhWzRdID0gMHg4MDsKKwkJZGF0YVs1XSA9IDA7CisJCWRhdGFbNl0gPSAweEVGOworCQlkYXRhWzddID0gMHhGRjsKKworCQlyZXR2YWwgPQorCQkgICAgbXNfYXV0b19zZXRfY21kKGNoaXAsIE92ZXJ3cml0ZUZsYWcsIE1TX0VYVFJBX1NJWkUsCisJCQkJICAgIFN5c3RlbVBhcm0sIDcsIEJMT0NLX1dSSVRFLCBXQUlUX0lOVCwgZGF0YSwKKwkJCQkgICAgNywgJnZhbCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwl9CisKKwlyZXR2YWwgPQorCSAgICBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgT3ZlcndyaXRlRmxhZywgTVNfRVhUUkFfU0laRSwgU3lzdGVtUGFybSwKKwkJCSAgICAgICAoNiArIE1TX0VYVFJBX1NJWkUpKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19OT19FUlJPUik7CisKKwlpZiAoQ0hLX01TNEJJVChtc19jYXJkKSkgeworCQkvKiBQYXJhbGxlbCBpbnRlcmZhY2UgKi8KKwkJZGF0YVswXSA9IDB4ODg7CisJfSBlbHNlIHsKKwkJLyogU2VyaWFsIGludGVyZmFjZSAqLworCQlkYXRhWzBdID0gMHg4MDsKKwl9CisJLyogQmxvY2sgQWRkcmVzcyAqLworCWRhdGFbMV0gPSAwOworCWRhdGFbMl0gPSAodTgpIChuZXdfYmxrID4+IDgpOworCWRhdGFbM10gPSAodTgpIG5ld19ibGs7CisJLyogUGFnZSBOdW1iZXIKKwkgKiBFeHRyYSBkYXRhIGFjY2VzcyBtb2RlICovCisJaWYgKHBhZ2VfY250ID09IDEpIHsKKwkJLyogU2luZ2xlIHBhZ2UgYWNjZXNzIG1vZGUgKi8KKwkJZGF0YVs0XSA9IDB4MjA7CisJfSBlbHNlIHsKKwkJLyogQmxvY2sgYWNjZXNzIG1vZGUgKi8KKwkJZGF0YVs0XSA9IDA7CisJfQorCWRhdGFbNV0gPSBzdGFydF9wYWdlOworCWRhdGFbNl0gPSAweEY4OworCWRhdGFbN10gPSAweEZGOworCWRhdGFbOF0gPSAodTgpIChsb2dfYmxrID4+IDgpOworCWRhdGFbOV0gPSAodTgpIGxvZ19ibGs7CisKKwlmb3IgKGkgPSAweDBBOyBpIDwgMHgxMDsgaSsrKSB7CisJCS8qIEVDQyAqLworCQlkYXRhW2ldID0gMHhGRjsKKwl9CisKKwlyZXR2YWwgPQorCSAgICBtc19hdXRvX3NldF9jbWQoY2hpcCwgT3ZlcndyaXRlRmxhZywgTVNfRVhUUkFfU0laRSwgU3lzdGVtUGFybSwKKwkJCSAgICAoNiArIE1TX0VYVFJBX1NJWkUpLCBCTE9DS19XUklURSwgV0FJVF9JTlQsIGRhdGEsCisJCQkgICAgMTYsICZ2YWwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcnRzNTF4X2luaXRfY21kKGNoaXApOworCisJaWYgKHNlbmRfYmxrZW5kKQorCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19CTEtFTkQsIFNFVF9CTEtFTkQsCisJCQkgICAgICAgU0VUX0JMS0VORCk7CisJZWxzZQorCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19CTEtFTkQsIFNFVF9CTEtFTkQsIDApOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX1RSQU5TX0NGRywgV0FJVF9JTlQsCisJCSAgICAgICBOT19XQUlUX0lOVCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfU0VDVE9SX0NOVF9MLCAweEZGLAorCQkgICAgICAgKHU4KSBwYWdlX2NudCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfU0VDVE9SX0NOVF9ILCAweEZGLCAwKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19UUEMsIDB4RkYsIFdSSVRFX1BBR0VfREFUQSk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9EQVRBX1NPVVJDRSwgMHgwMSwKKwkJICAgICAgIFJJTkdfQlVGRkVSKTsKKworCXRyYW5zX2RtYV9lbmFibGUoRE1BX1RPX0RFVklDRSwgY2hpcCwgNTEyICogcGFnZV9jbnQsIERNQV81MTIpOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfVFJBTlNGRVIsIDB4RkYsCisJCSAgICAgICBNU19UUkFOU0ZFUl9TVEFSVCB8IE1TX1RNX01VTFRJX1dSSVRFKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBDSEVDS19SRUdfQ01ELCBNU19UUkFOU0ZFUiwgTVNfVFJBTlNGRVJfRU5ELAorCQkgICAgICAgTVNfVFJBTlNGRVJfRU5EKTsKKworCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0NET1IgfCBTVEFHRV9NU19TVEFUVVMsIDEwMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlyZXR2YWwgPQorCSAgICBydHM1MXhfdHJhbnNmZXJfZGF0YV9wYXJ0aWFsKGNoaXAsIFNORF9CVUxLX1BJUEUoY2hpcCksICh2b2lkICopYnVmLAorCQkJCQkgcHRyLCBvZmZzZXQsIDUxMiAqIHBhZ2VfY250LAorCQkJCQkgc2NzaV9zZ19jb3VudChjaGlwLT5zcmIpLCBOVUxMLCAyMDAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0czUxeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJfQorCisJcmV0dmFsID0gcnRzNTF4X2dldF9yc3AoY2hpcCwgMywgMjAwMCk7CisKKworCWlmIChDSEVDS19NU19UUkFOU19GQUlMKGNoaXAsIHJldHZhbCkpIHsKKwkJcnRzNTF4X2NsZWFyX21zX2Vycm9yKGNoaXApOworCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworI2Vsc2UKKworc3RhdGljIGludCBtc19yZWFkX211bHRpcGxlX3BhZ2VzKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTE2IHBoeV9ibGssCisJCQkJICB1MTYgbG9nX2JsaywgdTggc3RhcnRfcGFnZSwgdTggZW5kX3BhZ2UsCisJCQkJICB1OCAqYnVmLCB2b2lkICoqcHRyLCB1bnNpZ25lZCBpbnQgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7CisJaW50IHJldHZhbCwgaTsKKwl1OCBleHRyYVtNU19FWFRSQV9TSVpFXSwgcGFnZV9hZGRyLCB2YWwsIHRyYW5zX2NmZywgZGF0YVs2XTsKKworCXJldHZhbCA9CisJICAgIG1zX3JlYWRfZXh0cmFfZGF0YShjaGlwLCBwaHlfYmxrLCBzdGFydF9wYWdlLCBleHRyYSwgTVNfRVhUUkFfU0laRSk7CisJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykgeworCQlpZiAoKGV4dHJhWzFdICYgMHgzMCkgIT0gMHgzMCkgeworCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0ZMQVNIX1JFQURfRVJST1IpOworCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJfQorCX0KKworCXJldHZhbCA9CisJICAgIG1zX3NldF9yd19yZWdfYWRkcihjaGlwLCBPdmVyd3JpdGVGbGFnLCBNU19FWFRSQV9TSVpFLCBTeXN0ZW1QYXJtLAorCQkJICAgICAgIDYpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCS8qIFdyaXRlIFJFRyAqLworCWlmIChDSEtfTVM0QklUKG1zX2NhcmQpKSB7CisJCS8qIFBhcmFsbGVsIGludGVyZmFjZSAqLworCQlkYXRhWzBdID0gMHg4ODsKKwl9IGVsc2UgeworCQkvKiBTZXJpYWwgaW50ZXJmYWNlICovCisJCWRhdGFbMF0gPSAweDgwOworCX0KKwkvKiBCbG9jayBBZGRyZXNzICovCisJZGF0YVsxXSA9IDA7CisJZGF0YVsyXSA9ICh1OCkgKHBoeV9ibGsgPj4gOCk7CisJZGF0YVszXSA9ICh1OCkgcGh5X2JsazsKKwkvKiBQYWdlIE51bWJlcgorCSAqIEV4dHJhIGRhdGEgYWNjZXNzIG1vZGUgKi8KKwlkYXRhWzRdID0gMDsKKwlkYXRhWzVdID0gc3RhcnRfcGFnZTsKKworCWZvciAoaSA9IDA7IGkgPCBNU19NQVhfUkVUUllfQ09VTlQ7IGkrKykgeworCQlyZXR2YWwgPQorCQkgICAgbXNfd3JpdGVfYnl0ZXMoY2hpcCwgV1JJVEVfUkVHLCA2LCBOT19XQUlUX0lOVCwgZGF0YSwgNik7CisJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKKworCXJldHZhbCA9IG1zX3NlbmRfY21kKGNoaXAsIEJMT0NLX1JFQUQsIFdBSVRfSU5UKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCWZvciAocGFnZV9hZGRyID0gc3RhcnRfcGFnZTsgcGFnZV9hZGRyIDwgZW5kX3BhZ2U7IHBhZ2VfYWRkcisrKSB7CisJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19OT19FUlJPUik7CisKKwkJaWYgKG1vbml0b3JfY2FyZF9jZChjaGlwLCBNU19DQVJEKSA9PSBDRF9OT1RfRVhJU1QpIHsKKwkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19OT19DQVJEKTsKKwkJCWNoaXAtPmNhcmRfZXhpc3QgJj0gfk1TX0NBUkQ7CisJCQljaGlwLT5jYXJkX3JlYWR5ICY9IH5NU19DQVJEOworCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJfQorCQkvKiBHRVRfSU5UIFJlZ2lzdGVyICovCisJCXJldHZhbCA9IG1zX3JlYWRfYnl0ZXMoY2hpcCwgR0VUX0lOVCwgMSwgTk9fV0FJVF9JTlQsICZ2YWwsIDEpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCWlmICh2YWwgJiBJTlRfUkVHX0NNRE5LKSB7CisJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQ01EX05LKTsKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCX0KKwkJaWYgKHZhbCAmIElOVF9SRUdfRVJSKSB7CisJCQlpZiAodmFsICYgSU5UX1JFR19CUkVRKSB7CisJCQkJcmV0dmFsID0gbXNfcmVhZF9zdGF0dXNfcmVnKGNoaXApOworCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQkJaWYgKCEoY2hpcC0+Y2FyZF93cCAmIE1TX0NBUkQpKSB7CisJCQkJCQlyZXNldF9tcyhjaGlwKTsKKwkJCQkJCW1zX3NldF9wYWdlX3N0YXR1cyhsb2dfYmxrLAorCQkJCQkJCXNldFBTX05HLCBleHRyYSwKKwkJCQkJCQlNU19FWFRSQV9TSVpFKTsKKwkJCQkJCW1zX3dyaXRlX2V4dHJhX2RhdGEoY2hpcCwKKwkJCQkJCQlwaHlfYmxrLCBwYWdlX2FkZHIsCisJCQkJCQkJZXh0cmEsIE1TX0VYVFJBX1NJWkUpOworCQkJCQl9CisJCQkJCW1zX3NldF9lcnJfY29kZShjaGlwLAorCQkJCQkJCU1TX0ZMQVNIX1JFQURfRVJST1IpOworCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0ZMQVNIX1JFQURfRVJST1IpOworCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoISh2YWwgJiBJTlRfUkVHX0JSRVEpKSB7CisJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0JSRVFfRVJST1IpOworCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQl9CisJCX0KKworCQlpZiAocGFnZV9hZGRyID09IChlbmRfcGFnZSAtIDEpKSB7CisJCQlpZiAoISh2YWwgJiBJTlRfUkVHX0NFRCkpIHsKKwkJCQlyZXR2YWwgPSBtc19zZW5kX2NtZChjaGlwLCBCTE9DS19FTkQsIFdBSVRfSU5UKTsKKwkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkJCX0KKwkJCXJldHZhbCA9CisJCQkgICAgbXNfcmVhZF9ieXRlcyhjaGlwLCBHRVRfSU5ULCAxLCBOT19XQUlUX0lOVCwgJnZhbCwKKwkJCQkJICAxKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCQlpZiAoISh2YWwgJiBJTlRfUkVHX0NFRCkpIHsKKwkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfRkxBU0hfUkVBRF9FUlJPUik7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCX0KKworCQkJdHJhbnNfY2ZnID0gTk9fV0FJVF9JTlQ7CisJCX0gZWxzZSB7CisJCQl0cmFuc19jZmcgPSBXQUlUX0lOVDsKKwkJfQorCisJCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19UUEMsIDB4RkYsCisJCQkgICAgICAgUkVBRF9QQUdFX0RBVEEpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19UUkFOU19DRkcsIDB4RkYsCisJCQkgICAgICAgdHJhbnNfY2ZnKTsKKworCQl0cmFuc19kbWFfZW5hYmxlKERNQV9GUk9NX0RFVklDRSwgY2hpcCwgNTEyLCBETUFfNTEyKTsKKworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNU19UUkFOU0ZFUiwgMHhGRiwKKwkJCSAgICAgICBNU19UUkFOU0ZFUl9TVEFSVCB8IE1TX1RNX05PUk1BTF9SRUFEKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgQ0hFQ0tfUkVHX0NNRCwgTVNfVFJBTlNGRVIsCisJCQkgICAgICAgTVNfVFJBTlNGRVJfRU5ELCBNU19UUkFOU0ZFUl9FTkQpOworCisJCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0NESVIsIDEwMCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCQlyZXR2YWwgPQorCQkgICAgcnRzNTF4X3RyYW5zZmVyX2RhdGFfcGFydGlhbChjaGlwLCBSQ1ZfQlVMS19QSVBFKGNoaXApLAorCQkJCQkJICh2b2lkICopYnVmLCBwdHIsIG9mZnNldCwgNTEyLAorCQkJCQkJIHNjc2lfc2dfY291bnQoY2hpcC0+c3JiKSwgTlVMTCwKKwkJCQkJCSAyMDAwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJaWYgKHJldHZhbCA9PSBTVEFUVVNfVElNRURPVVQpIHsKKwkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfVE9fRVJST1IpOworCQkJCXJ0czUxeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKKwkJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkJCX0KKworCQkJcmV0dmFsID0KKwkJCSAgICBydHM1MXhfZXAwX3JlYWRfcmVnaXN0ZXIoY2hpcCwgTVNfVFJBTlNfQ0ZHLCAmdmFsKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfVE9fRVJST1IpOworCQkJCXJ0czUxeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKKwkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJfQorCQkJaWYgKHZhbCAmIChNU19DUkMxNl9FUlIgfCBNU19SRFlfVElNRU9VVCkpIHsKKwkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQ1JDMTZfRVJST1IpOworCQkJCXJ0czUxeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKKwkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJfQorCQl9CisKKwkJcmV0dmFsID0gcnRzNTF4X2dldF9yc3AoY2hpcCwgMSwgMjAwMCk7CisJCWlmIChDSEVDS19NU19UUkFOU19GQUlMKGNoaXAsIHJldHZhbCkpIHsKKwkJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1RJTUVET1VUKSB7CisJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX1RPX0VSUk9SKTsKKwkJCQlydHM1MXhfY2xlYXJfbXNfZXJyb3IoY2hpcCk7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCQl9CisKKwkJCXJldHZhbCA9CisJCQkgICAgcnRzNTF4X2VwMF9yZWFkX3JlZ2lzdGVyKGNoaXAsIE1TX1RSQU5TX0NGRywgJnZhbCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX1RPX0VSUk9SKTsKKwkJCQlydHM1MXhfY2xlYXJfbXNfZXJyb3IoY2hpcCk7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCQl9CisJCQlpZiAodmFsICYgKE1TX0NSQzE2X0VSUiB8IE1TX1JEWV9USU1FT1VUKSkgeworCQkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19DUkMxNl9FUlJPUik7CisJCQkJcnRzNTF4X2NsZWFyX21zX2Vycm9yKGNoaXApOworCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbXNfd3JpdGVfbXVsdGlwbGVfcGFnZXMoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1MTYgb2xkX2JsaywKKwkJCQkgICB1MTYgbmV3X2JsaywgdTE2IGxvZ19ibGssIHU4IHN0YXJ0X3BhZ2UsCisJCQkJICAgdTggZW5kX3BhZ2UsIHU4ICpidWYsIHZvaWQgKipwdHIsCisJCQkJICAgdW5zaWduZWQgaW50ICpvZmZzZXQpCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCWludCByZXR2YWwsIGk7CisJdTggcGFnZV9hZGRyLCB2YWwsIGRhdGFbMTZdOworCisJaWYgKCFzdGFydF9wYWdlKSB7CisJCXJldHZhbCA9CisJCSAgICBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgT3ZlcndyaXRlRmxhZywgTVNfRVhUUkFfU0laRSwKKwkJCQkgICAgICAgU3lzdGVtUGFybSwgNyk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCQlpZiAoQ0hLX01TNEJJVChtc19jYXJkKSkgeworCQkJLyogUGFyYWxsZWwgaW50ZXJmYWNlICovCisJCQlkYXRhWzBdID0gMHg4ODsKKwkJfSBlbHNlIHsKKwkJCS8qIFNlcmlhbCBpbnRlcmZhY2UgKi8KKwkJCWRhdGFbMF0gPSAweDgwOworCQl9CisJCS8qIEJsb2NrIEFkZHJlc3MgKi8KKwkJZGF0YVsxXSA9IDA7CisJCWRhdGFbMl0gPSAodTgpIChvbGRfYmxrID4+IDgpOworCQlkYXRhWzNdID0gKHU4KSBvbGRfYmxrOworCQlkYXRhWzRdID0gMHg4MDsKKwkJZGF0YVs1XSA9IDA7CisJCWRhdGFbNl0gPSAweEVGOworCQlkYXRhWzddID0gMHhGRjsKKworCQlyZXR2YWwgPQorCQkgICAgbXNfd3JpdGVfYnl0ZXMoY2hpcCwgV1JJVEVfUkVHLCA3LCBOT19XQUlUX0lOVCwgZGF0YSwgOCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCQlyZXR2YWwgPSBtc19zZW5kX2NtZChjaGlwLCBCTE9DS19XUklURSwgV0FJVF9JTlQpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCS8qIEdFVF9JTlQgUmVnaXN0ZXIgKi8KKwkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKKwkJcmV0dmFsID0KKwkJICAgIG1zX3RyYW5zZmVyX3RwYyhjaGlwLCBNU19UTV9SRUFEX0JZVEVTLCBHRVRfSU5ULCAxLAorCQkJCSAgICBOT19XQUlUX0lOVCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwl9CisKKwlyZXR2YWwgPQorCSAgICBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgT3ZlcndyaXRlRmxhZywgTVNfRVhUUkFfU0laRSwgU3lzdGVtUGFybSwKKwkJCSAgICAgICAoNiArIE1TX0VYVFJBX1NJWkUpKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19OT19FUlJPUik7CisKKwlpZiAoQ0hLX01TNEJJVChtc19jYXJkKSkgeworCQkvKiBQYXJhbGxlbCBpbnRlcmZhY2UgKi8KKwkJZGF0YVswXSA9IDB4ODg7CisJfSBlbHNlIHsKKwkJLyogU2VyaWFsIGludGVyZmFjZSAqLworCQlkYXRhWzBdID0gMHg4MDsKKwl9CisJLyogQmxvY2sgQWRkcmVzcyAqLworCWRhdGFbMV0gPSAwOworCWRhdGFbMl0gPSAodTgpIChuZXdfYmxrID4+IDgpOworCWRhdGFbM10gPSAodTgpIG5ld19ibGs7CisJLyogUGFnZSBOdW1iZXIKKwkgKiBFeHRyYSBkYXRhIGFjY2VzcyBtb2RlICovCisJaWYgKChlbmRfcGFnZSAtIHN0YXJ0X3BhZ2UpID09IDEpIHsKKwkJLyogU2luZ2xlIHBhZ2UgYWNjZXNzIG1vZGUgKi8KKwkJZGF0YVs0XSA9IDB4MjA7CisJfSBlbHNlIHsKKwkJLyogQmxvY2sgYWNjZXNzIG1vZGUgKi8KKwkJZGF0YVs0XSA9IDA7CisJfQorCWRhdGFbNV0gPSBzdGFydF9wYWdlOworCWRhdGFbNl0gPSAweEY4OworCWRhdGFbN10gPSAweEZGOworCWRhdGFbOF0gPSAodTgpIChsb2dfYmxrID4+IDgpOworCWRhdGFbOV0gPSAodTgpIGxvZ19ibGs7CisKKwlmb3IgKGkgPSAweDBBOyBpIDwgMHgxMDsgaSsrKSB7CisJCS8qIEVDQyAqLworCQlkYXRhW2ldID0gMHhGRjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTVNfTUFYX1JFVFJZX0NPVU5UOyBpKyspIHsKKwkJcmV0dmFsID0KKwkJICAgIG1zX3dyaXRlX2J5dGVzKGNoaXAsIFdSSVRFX1JFRywgNiArIE1TX0VYVFJBX1NJWkUsCisJCQkJICAgTk9fV0FJVF9JTlQsIGRhdGEsIDE2KTsKKwkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBNU19NQVhfUkVUUllfQ09VTlQpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVNfTUFYX1JFVFJZX0NPVU5UOyBpKyspIHsKKwkJcmV0dmFsID0gbXNfc2VuZF9jbWQoY2hpcCwgQkxPQ0tfV1JJVEUsIFdBSVRfSU5UKTsKKwkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBNU19NQVhfUkVUUllfQ09VTlQpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJLyogR0VUX0lOVCBSZWdpc3RlciAqLworCXJldHZhbCA9IG1zX3JlYWRfYnl0ZXMoY2hpcCwgR0VUX0lOVCwgMSwgTk9fV0FJVF9JTlQsICZ2YWwsIDEpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJZm9yIChwYWdlX2FkZHIgPSBzdGFydF9wYWdlOyBwYWdlX2FkZHIgPCBlbmRfcGFnZTsgcGFnZV9hZGRyKyspIHsKKwkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKKworCQlpZiAobW9uaXRvcl9jYXJkX2NkKGNoaXAsIE1TX0NBUkQpID09IENEX05PVF9FWElTVCkgeworCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0NBUkQpOworCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJfQorCisJCWlmICh2YWwgJiBJTlRfUkVHX0NNRE5LKSB7CisJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQ01EX05LKTsKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCX0KKwkJaWYgKHZhbCAmIElOVF9SRUdfRVJSKSB7CisJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfRkxBU0hfV1JJVEVfRVJST1IpOworCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJfQorCQlpZiAoISh2YWwgJiBJTlRfUkVHX0JSRVEpKSB7CisJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQlJFUV9FUlJPUik7CisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQl9CisKKwkJdWRlbGF5KDMwKTsKKworCQlydHM1MXhfaW5pdF9jbWQoY2hpcCk7CisKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfVFBDLCAweEZGLAorCQkJICAgICAgIFdSSVRFX1BBR0VfREFUQSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX1RSQU5TX0NGRywgMHhGRiwKKwkJCSAgICAgICBXQUlUX0lOVCk7CisKKwkJdHJhbnNfZG1hX2VuYWJsZShETUFfVE9fREVWSUNFLCBjaGlwLCA1MTIsIERNQV81MTIpOworCisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX1RSQU5TRkVSLCAweEZGLAorCQkJICAgICAgIE1TX1RSQU5TRkVSX1NUQVJUIHwgTVNfVE1fTk9STUFMX1dSSVRFKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgQ0hFQ0tfUkVHX0NNRCwgTVNfVFJBTlNGRVIsCisJCQkgICAgICAgTVNfVFJBTlNGRVJfRU5ELCBNU19UUkFOU0ZFUl9FTkQpOworCisJCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0NET1IsIDEwMCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCQlyZXR2YWwgPQorCQkgICAgcnRzNTF4X3RyYW5zZmVyX2RhdGFfcGFydGlhbChjaGlwLCBTTkRfQlVMS19QSVBFKGNoaXApLAorCQkJCQkJICh2b2lkICopYnVmLCBwdHIsIG9mZnNldCwgNTEyLAorCQkJCQkJIHNjc2lfc2dfY291bnQoY2hpcC0+c3JiKSwgTlVMTCwKKwkJCQkJCSAyMDAwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX1RPX0VSUk9SKTsKKwkJCXJ0czUxeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKKworCQkJaWYgKHJldHZhbCA9PSBTVEFUVVNfVElNRURPVVQpCisJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19USU1FRE9VVCk7CisJCQllbHNlCisJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJfQorCisJCXJldHZhbCA9IHJ0czUxeF9nZXRfcnNwKGNoaXAsIDEsIDIwMDApOworCQlpZiAoQ0hFQ0tfTVNfVFJBTlNfRkFJTChjaGlwLCByZXR2YWwpKSB7CisJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfVE9fRVJST1IpOworCQkJcnRzNTF4X2NsZWFyX21zX2Vycm9yKGNoaXApOworCisJCQlpZiAocmV0dmFsID09IFNUQVRVU19USU1FRE9VVCkKKwkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX1RJTUVET1VUKTsKKwkJCWVsc2UKKwkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQl9CisJCS8qIEdFVF9JTlQgUmVnaXN0ZXIgKi8KKwkJcmV0dmFsID0gbXNfcmVhZF9ieXRlcyhjaGlwLCBHRVRfSU5ULCAxLCBOT19XQUlUX0lOVCwgJnZhbCwgMSk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCQlpZiAoKGVuZF9wYWdlIC0gc3RhcnRfcGFnZSkgPT0gMSkgeworCQkJaWYgKCEodmFsICYgSU5UX1JFR19DRUQpKSB7CisJCQkJLyogQ29tbWFuZCBjYW4gbm90IGJlIGV4ZWN1dGVkICovCisJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0ZMQVNIX1dSSVRFX0VSUk9SKTsKKwkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHBhZ2VfYWRkciA9PSAoZW5kX3BhZ2UgLSAxKSkgeworCQkJCWlmICghKHZhbCAmIElOVF9SRUdfQ0VEKSkgeworCQkJCQlyZXR2YWwgPQorCQkJCQkgICAgbXNfc2VuZF9jbWQoY2hpcCwgQkxPQ0tfRU5ELAorCQkJCQkJCVdBSVRfSU5UKTsKKwkJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCQkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCQkJCX0KKwkJCQkvKiBHRVRfSU5UIFJlZ2lzdGVyICovCisJCQkJcmV0dmFsID0KKwkJCQkgICAgbXNfcmVhZF9ieXRlcyhjaGlwLCBHRVRfSU5ULCAxLCBOT19XQUlUX0lOVCwKKwkJCQkJCSAgJnZhbCwgMSk7CisJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCQl9CisKKwkJCWlmICgocGFnZV9hZGRyID09IChlbmRfcGFnZSAtIDEpKQorCQkJICAgIHx8IChwYWdlX2FkZHIgPT0gbXNfY2FyZC0+cGFnZV9vZmYpKSB7CisJCQkJaWYgKCEodmFsICYgSU5UX1JFR19DRUQpKSB7CisJCQkJCW1zX3NldF9lcnJfY29kZShjaGlwLAorCQkJCQkJCU1TX0ZMQVNIX1dSSVRFX0VSUk9SKTsKKwkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBtc19maW5pc2hfd3JpdGUoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1MTYgb2xkX2JsaywgdTE2IG5ld19ibGssCisJCQkgICB1MTYgbG9nX2JsaywgdTggcGFnZV9vZmYpCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCWludCByZXR2YWwsIHNlZ19ubzsKKworI2lmZGVmIE1TX1NQRUVEVVAKKwlyZXR2YWwgPSBtc19hdXRvX2NvcHlfcGFnZShjaGlwLCBvbGRfYmxrLCBuZXdfYmxrLCBsb2dfYmxrLAorCQkJCSAgIHBhZ2Vfb2ZmLCBtc19jYXJkLT5wYWdlX29mZiArIDEpOworI2Vsc2UKKwlyZXR2YWwgPSBtc19jb3B5X3BhZ2UoY2hpcCwgb2xkX2JsaywgbmV3X2JsaywgbG9nX2JsaywKKwkJCSAgICAgIHBhZ2Vfb2ZmLCBtc19jYXJkLT5wYWdlX29mZiArIDEpOworI2VuZGlmCisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlzZWdfbm8gPSBvbGRfYmxrID4+IDk7CisKKwlpZiAoTVNfVFNUX0JBRF9CTE9DS19GTEcobXNfY2FyZCkpIHsKKwkJTVNfQ0xSX0JBRF9CTE9DS19GTEcobXNfY2FyZCk7CisJCW1zX3NldF9iYWRfYmxvY2soY2hpcCwgb2xkX2Jsayk7CisJfSBlbHNlIHsKKwkJcmV0dmFsID0gbXNfZXJhc2VfYmxvY2soY2hpcCwgb2xkX2Jsayk7CisJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCisJCQltc19zZXRfdW51c2VkX2Jsb2NrKGNoaXAsIG9sZF9ibGspOworCX0KKworCW1zX3NldF9sMnBfdGJsKGNoaXAsIHNlZ19ubywgbG9nX2JsayAtIG1zX3N0YXJ0X2lkeFtzZWdfbm9dLCBuZXdfYmxrKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtc19wcmVwYXJlX3dyaXRlKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTE2IG9sZF9ibGssIHUxNiBuZXdfYmxrLAorCQkJICAgIHUxNiBsb2dfYmxrLCB1OCBzdGFydF9wYWdlKQoreworCWludCByZXR2YWw7CisKKwlpZiAoc3RhcnRfcGFnZSkgeworI2lmZGVmIE1TX1NQRUVEVVAKKwkJcmV0dmFsID0KKwkJICAgIG1zX2F1dG9fY29weV9wYWdlKGNoaXAsIG9sZF9ibGssIG5ld19ibGssIGxvZ19ibGssIDAsCisJCQkJICAgICAgc3RhcnRfcGFnZSk7CisjZWxzZQorCQlyZXR2YWwgPQorCQkgICAgbXNfY29weV9wYWdlKGNoaXAsIG9sZF9ibGssIG5ld19ibGssIGxvZ19ibGssIDAsCisJCQkJIHN0YXJ0X3BhZ2UpOworI2VuZGlmCisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwl9CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2ludCBtc19kZWxheV93cml0ZShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCXN0cnVjdCBtc19kZWxheV93cml0ZV90YWcgKmRlbGF5X3dyaXRlID0gJihtc19jYXJkLT5kZWxheV93cml0ZSk7CisJaW50IHJldHZhbDsKKworCWlmIChkZWxheV93cml0ZS0+ZGVsYXlfd3JpdGVfZmxhZykgeworCQlyZXR2YWwgPSBtc19zZXRfaW5pdF9wYXJhKGNoaXApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwkJZGVsYXlfd3JpdGUtPmRlbGF5X3dyaXRlX2ZsYWcgPSAwOworCQlyZXR2YWwgPSBtc19maW5pc2hfd3JpdGUoY2hpcCwKKwkJCQkJIGRlbGF5X3dyaXRlLT5vbGRfcGh5YmxvY2ssCisJCQkJCSBkZWxheV93cml0ZS0+bmV3X3BoeWJsb2NrLAorCQkJCQkgZGVsYXlfd3JpdGUtPmxvZ2Jsb2NrLAorCQkJCQkgZGVsYXlfd3JpdGUtPnBhZ2VvZmYpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJfQorCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXNfcndfZmFpbChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlpZiAoc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpCisJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksCisJCQkgICAgICAgU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOworCWVsc2UKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwgU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOworfQorCitzdGF0aWMgaW50IG1zX3J3X211bHRpX3NlY3RvcihzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwKKwkJCSAgICAgIHUzMiBzdGFydF9zZWN0b3IsIHUxNiBzZWN0b3JfY250KQoreworCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKwl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKKwlpbnQgcmV0dmFsLCBzZWdfbm87CisJdW5zaWduZWQgaW50IG9mZnNldCA9IDA7CisJdTE2IG9sZF9ibGsgPSAwLCBuZXdfYmxrID0gMCwgbG9nX2JsaywgdG90YWxfc2VjX2NudCA9IHNlY3Rvcl9jbnQ7CisJdTggc3RhcnRfcGFnZSwgZW5kX3BhZ2UgPSAwLCBwYWdlX2NudDsKKwl1OCAqYnVmOworCXZvaWQgKnB0ciA9IE5VTEw7CisJc3RydWN0IG1zX2RlbGF5X3dyaXRlX3RhZyAqZGVsYXlfd3JpdGUgPSAmKG1zX2NhcmQtPmRlbGF5X3dyaXRlKTsKKworCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19OT19FUlJPUik7CisKKwltc19jYXJkLT5jb3VudGVyID0gMDsKKworCWJ1ZiA9ICh1OCAqKSBzY3NpX3NnbGlzdChzcmIpOworCisJcmV0dmFsID0gbXNfc3dpdGNoX2Nsb2NrKGNoaXApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJbXNfcndfZmFpbChzcmIsIGNoaXApOworCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwl9CisKKwlsb2dfYmxrID0gKHUxNikgKHN0YXJ0X3NlY3RvciA+PiBtc19jYXJkLT5ibG9ja19zaGlmdCk7CisJc3RhcnRfcGFnZSA9ICh1OCkgKHN0YXJ0X3NlY3RvciAmIG1zX2NhcmQtPnBhZ2Vfb2ZmKTsKKworCWZvciAoc2VnX25vID0gMDsgc2VnX25vIDwgc2l6ZW9mKG1zX3N0YXJ0X2lkeCkgLyAyOyBzZWdfbm8rKykgeworCQlpZiAobG9nX2JsayA8IG1zX3N0YXJ0X2lkeFtzZWdfbm8gKyAxXSkKKwkJCWJyZWFrOworCX0KKworCWlmIChtc19jYXJkLT5zZWdtZW50W3NlZ19ub10uYnVpbGRfZmxhZyA9PSAwKSB7CisJCXJldHZhbCA9IG1zX2J1aWxkX2wycF90YmwoY2hpcCwgc2VnX25vKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJY2hpcC0+Y2FyZF9mYWlsIHw9IE1TX0NBUkQ7CisJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOworCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCX0KKwl9CisKKwlpZiAoc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CisJCWlmIChkZWxheV93cml0ZS0+ZGVsYXlfd3JpdGVfZmxhZyAmJgorCQkgICAgKGRlbGF5X3dyaXRlLT5sb2dibG9jayA9PSBsb2dfYmxrKSAmJgorCQkgICAgKHN0YXJ0X3BhZ2UgPiBkZWxheV93cml0ZS0+cGFnZW9mZikpIHsKKwkJCWRlbGF5X3dyaXRlLT5kZWxheV93cml0ZV9mbGFnID0gMDsKKyNpZmRlZiBNU19TUEVFRFVQCisJCQlyZXR2YWwgPSBtc19hdXRvX2NvcHlfcGFnZShjaGlwLAorCQkJCQkJICAgZGVsYXlfd3JpdGUtPm9sZF9waHlibG9jaywKKwkJCQkJCSAgIGRlbGF5X3dyaXRlLT5uZXdfcGh5YmxvY2ssCisJCQkJCQkgICBsb2dfYmxrLAorCQkJCQkJICAgZGVsYXlfd3JpdGUtPnBhZ2VvZmYsCisJCQkJCQkgICBzdGFydF9wYWdlKTsKKyNlbHNlCisJCQlyZXR2YWwgPSBtc19jb3B5X3BhZ2UoY2hpcCwKKwkJCQkJICAgICAgZGVsYXlfd3JpdGUtPm9sZF9waHlibG9jaywKKwkJCQkJICAgICAgZGVsYXlfd3JpdGUtPm5ld19waHlibG9jaywKKwkJCQkJICAgICAgbG9nX2JsaywgZGVsYXlfd3JpdGUtPnBhZ2VvZmYsCisJCQkJCSAgICAgIHN0YXJ0X3BhZ2UpOworI2VuZGlmCisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCQkgICAgICAgU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOworCQkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCQkJfQorCQkJb2xkX2JsayA9IGRlbGF5X3dyaXRlLT5vbGRfcGh5YmxvY2s7CisJCQluZXdfYmxrID0gZGVsYXlfd3JpdGUtPm5ld19waHlibG9jazsKKwkJfSBlbHNlIGlmIChkZWxheV93cml0ZS0+ZGVsYXlfd3JpdGVfZmxhZyAmJgorCQkJICAgKGRlbGF5X3dyaXRlLT5sb2dibG9jayA9PSBsb2dfYmxrKSAmJgorCQkJICAgKHN0YXJ0X3BhZ2UgPT0gZGVsYXlfd3JpdGUtPnBhZ2VvZmYpKSB7CisJCQlkZWxheV93cml0ZS0+ZGVsYXlfd3JpdGVfZmxhZyA9IDA7CisJCQlvbGRfYmxrID0gZGVsYXlfd3JpdGUtPm9sZF9waHlibG9jazsKKwkJCW5ld19ibGsgPSBkZWxheV93cml0ZS0+bmV3X3BoeWJsb2NrOworCQl9IGVsc2UgeworCQkJcmV0dmFsID0gbXNfZGVsYXlfd3JpdGUoY2hpcCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCQkgICAgICAgU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOworCQkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCQkJfQorCQkJb2xkX2JsayA9CisJCQkgICAgbXNfZ2V0X2wycF90YmwoY2hpcCwgc2VnX25vLAorCQkJCQkgICBsb2dfYmxrIC0gbXNfc3RhcnRfaWR4W3NlZ19ub10pOworCQkJbmV3X2JsayA9IG1zX2dldF91bnVzZWRfYmxvY2soY2hpcCwgc2VnX25vKTsKKwkJCWlmICgob2xkX2JsayA9PSAweEZGRkYpIHx8IChuZXdfYmxrID09IDB4RkZGRikpIHsKKwkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCisJCQkJCSAgICAgICBTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCX0KKworCQkJcmV0dmFsID0KKwkJCSAgICBtc19wcmVwYXJlX3dyaXRlKGNoaXAsIG9sZF9ibGssIG5ld19ibGssIGxvZ19ibGssCisJCQkJCSAgICAgc3RhcnRfcGFnZSk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJaWYgKG1vbml0b3JfY2FyZF9jZChjaGlwLCBNU19DQVJEKSA9PQorCQkJCSAgICBDRF9OT1RfRVhJU1QpIHsKKwkJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCQkJU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CisJCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJfQorCisJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCQkgICAgICAgU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOworCQkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcmV0dmFsID0gbXNfZGVsYXlfd3JpdGUoY2hpcCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWlmIChtb25pdG9yX2NhcmRfY2QoY2hpcCwgTVNfQ0FSRCkgPT0gQ0RfTk9UX0VYSVNUKSB7CisJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCQkgICAgICAgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCX0KKworCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCSAgICAgICBTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7CisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkJfQorCQlvbGRfYmxrID0KKwkJICAgIG1zX2dldF9sMnBfdGJsKGNoaXAsIHNlZ19ubywKKwkJCQkgICBsb2dfYmxrIC0gbXNfc3RhcnRfaWR4W3NlZ19ub10pOworCQlpZiAob2xkX2JsayA9PSAweEZGRkYpIHsKKwkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKKwkJCQkgICAgICAgU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOworCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJfQorCX0KKworCVJUUzUxWF9ERUJVR1AoInNlZ19ubyA9ICVkLCBvbGRfYmxrID0gMHgleCwgbmV3X2JsayA9IDB4JXhcbiIsIHNlZ19ubywKKwkJICAgICAgIG9sZF9ibGssIG5ld19ibGspOworCisJd2hpbGUgKHRvdGFsX3NlY19jbnQpIHsKKwkJaWYgKChzdGFydF9wYWdlICsgdG90YWxfc2VjX2NudCkgPiAobXNfY2FyZC0+cGFnZV9vZmYgKyAxKSkKKwkJCWVuZF9wYWdlID0gbXNfY2FyZC0+cGFnZV9vZmYgKyAxOworCQllbHNlCisJCQllbmRfcGFnZSA9IHN0YXJ0X3BhZ2UgKyAodTgpIHRvdGFsX3NlY19jbnQ7CisJCXBhZ2VfY250ID0gZW5kX3BhZ2UgLSBzdGFydF9wYWdlOworCisJCVJUUzUxWF9ERUJVR1AoInN0YXJ0X3BhZ2UgPSAlZCwgZW5kX3BhZ2UgPSAlZCwiCisJCQkJCSJwYWdlX2NudCA9ICVkXG4iLAorCQkJCQlzdGFydF9wYWdlLCBlbmRfcGFnZSwgcGFnZV9jbnQpOworCisJCWlmIChzcmItPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkKKwkJCXJldHZhbCA9IG1zX3JlYWRfbXVsdGlwbGVfcGFnZXMoY2hpcCwKKwkJCQkJCQlvbGRfYmxrLCBsb2dfYmxrLAorCQkJCQkJCXN0YXJ0X3BhZ2UsIGVuZF9wYWdlLAorCQkJCQkJCWJ1ZiwgJnB0ciwgJm9mZnNldCk7CisJCWVsc2UKKwkJCXJldHZhbCA9IG1zX3dyaXRlX211bHRpcGxlX3BhZ2VzKGNoaXAsIG9sZF9ibGssCisJCQkJCQkJIG5ld19ibGssIGxvZ19ibGssCisJCQkJCQkJIHN0YXJ0X3BhZ2UsIGVuZF9wYWdlLAorCQkJCQkJCSBidWYsICZwdHIsICZvZmZzZXQpOworCisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWlmIChtb25pdG9yX2NhcmRfY2QoY2hpcCwgTVNfQ0FSRCkgPT0gQ0RfTk9UX0VYSVNUKSB7CisJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCQkgICAgICAgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCX0KKworCQkJbXNfcndfZmFpbChzcmIsIGNoaXApOworCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCX0KKwkJLyogVXBkYXRlIEwyUCB0YWJsZSBpZiBuZWVkICovCisJCWlmIChzcmItPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpIHsKKwkJCWlmIChlbmRfcGFnZSA9PSAobXNfY2FyZC0+cGFnZV9vZmYgKyAxKSkgeworCQkJCXJldHZhbCA9IG1zX2VyYXNlX2Jsb2NrKGNoaXAsIG9sZF9ibGspOworCQkJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJCW1zX3NldF91bnVzZWRfYmxvY2soY2hpcCwgb2xkX2Jsayk7CisJCQkJbXNfc2V0X2wycF90YmwoY2hpcCwgc2VnX25vLAorCQkJCQkgICAgICAgbG9nX2JsayAtIG1zX3N0YXJ0X2lkeFtzZWdfbm9dLAorCQkJCQkgICAgICAgbmV3X2Jsayk7CisJCQl9CisJCX0KKworCQl0b3RhbF9zZWNfY250IC09IHBhZ2VfY250OworCisJCWlmICh0b3RhbF9zZWNfY250ID09IDApCisJCQlicmVhazsKKworCQlsb2dfYmxrKys7CisKKwkJZm9yIChzZWdfbm8gPSAwOyBzZWdfbm8gPCBzaXplb2YobXNfc3RhcnRfaWR4KSAvIDI7IHNlZ19ubysrKSB7CisJCQlpZiAobG9nX2JsayA8IG1zX3N0YXJ0X2lkeFtzZWdfbm8gKyAxXSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChtc19jYXJkLT5zZWdtZW50W3NlZ19ub10uYnVpbGRfZmxhZyA9PSAwKSB7CisJCQlyZXR2YWwgPSBtc19idWlsZF9sMnBfdGJsKGNoaXAsIHNlZ19ubyk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJY2hpcC0+Y2FyZF9mYWlsIHw9IE1TX0NBUkQ7CisJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCQkgICAgICAgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCQl9CisJCX0KKworCQlvbGRfYmxrID0KKwkJICAgIG1zX2dldF9sMnBfdGJsKGNoaXAsIHNlZ19ubywKKwkJCQkgICBsb2dfYmxrIC0gbXNfc3RhcnRfaWR4W3NlZ19ub10pOworCQlpZiAob2xkX2JsayA9PSAweEZGRkYpIHsKKwkJCW1zX3J3X2ZhaWwoc3JiLCBjaGlwKTsKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCX0KKworCQlpZiAoc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CisJCQluZXdfYmxrID0gbXNfZ2V0X3VudXNlZF9ibG9jayhjaGlwLCBzZWdfbm8pOworCQkJaWYgKG5ld19ibGsgPT0gMHhGRkZGKSB7CisJCQkJbXNfcndfZmFpbChzcmIsIGNoaXApOworCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQl9CisJCX0KKworCQlSVFM1MVhfREVCVUdQKCJzZWdfbm8gPSAlZCwgb2xkX2JsayA9IDB4JXgsIG5ld19ibGsgPSAweCV4XG4iLAorCQkJICAgICAgIHNlZ19ubywgb2xkX2JsaywgbmV3X2Jsayk7CisKKwkJc3RhcnRfcGFnZSA9IDA7CisJfQorCisJaWYgKHNyYi0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkgeworCQlpZiAoZW5kX3BhZ2UgPCAobXNfY2FyZC0+cGFnZV9vZmYgKyAxKSkgeworCQkJZGVsYXlfd3JpdGUtPmRlbGF5X3dyaXRlX2ZsYWcgPSAxOworCQkJZGVsYXlfd3JpdGUtPm9sZF9waHlibG9jayA9IG9sZF9ibGs7CisJCQlkZWxheV93cml0ZS0+bmV3X3BoeWJsb2NrID0gbmV3X2JsazsKKwkJCWRlbGF5X3dyaXRlLT5sb2dibG9jayA9IGxvZ19ibGs7CisJCQlkZWxheV93cml0ZS0+cGFnZW9mZiA9IGVuZF9wYWdlOworCQl9CisJfQorCisJc2NzaV9zZXRfcmVzaWQoc3JiLCAwKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworaW50IG1zX3J3KHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1MzIgc3RhcnRfc2VjdG9yLAorCSAgdTE2IHNlY3Rvcl9jbnQpCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCWludCByZXR2YWw7CisKKwlpZiAoQ0hLX01TUFJPKG1zX2NhcmQpKQorCQlyZXR2YWwgPQorCQkgICAgbXNwcm9fcndfbXVsdGlfc2VjdG9yKHNyYiwgY2hpcCwgc3RhcnRfc2VjdG9yLCBzZWN0b3JfY250KTsKKwllbHNlCisJCXJldHZhbCA9CisJCSAgICBtc19yd19tdWx0aV9zZWN0b3Ioc3JiLCBjaGlwLCBzdGFydF9zZWN0b3IsIHNlY3Rvcl9jbnQpOworCisJcmV0dXJuIHJldHZhbDsKK30KKwordm9pZCBtc19mcmVlX2wycF90Ymwoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKwlpbnQgaSA9IDA7CisKKwlpZiAobXNfY2FyZC0+c2VnbWVudCAhPSBOVUxMKSB7CisJCWZvciAoaSA9IDA7IGkgPCBtc19jYXJkLT5zZWdtZW50X2NudDsgaSsrKSB7CisJCQlpZiAobXNfY2FyZC0+c2VnbWVudFtpXS5sMnBfdGFibGUgIT0gTlVMTCkgeworCQkJCXZmcmVlKG1zX2NhcmQtPnNlZ21lbnRbaV0ubDJwX3RhYmxlKTsKKwkJCQltc19jYXJkLT5zZWdtZW50W2ldLmwycF90YWJsZSA9IE5VTEw7CisJCQl9CisJCQlpZiAobXNfY2FyZC0+c2VnbWVudFtpXS5mcmVlX3RhYmxlICE9IE5VTEwpIHsKKwkJCQl2ZnJlZShtc19jYXJkLT5zZWdtZW50W2ldLmZyZWVfdGFibGUpOworCQkJCW1zX2NhcmQtPnNlZ21lbnRbaV0uZnJlZV90YWJsZSA9IE5VTEw7CisJCQl9CisJCX0KKwkJdmZyZWUobXNfY2FyZC0+c2VnbWVudCk7CisJCW1zX2NhcmQtPnNlZ21lbnQgPSBOVUxMOworCX0KK30KKwordm9pZCBtc19jbGVhbnVwX3dvcmsoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKworCWlmIChDSEtfTVNQUk8obXNfY2FyZCkpIHsKKwkJaWYgKG1zX2NhcmQtPnNlcV9tb2RlKSB7CisJCQlSVFM1MVhfREVCVUdQKCJNUyBQcm86IHN0b3AgdHJhbnNtaXNzaW9uXG4iKTsKKwkJCW1zcHJvX3N0b3Bfc2VxX21vZGUoY2hpcCk7CisJCQltc19jYXJkLT5jb3VudGVyID0gMDsKKwkJfQorCQlpZiAoQ0hLX01TSEcobXNfY2FyZCkpIHsKKwkJCXU4IHZhbHVlOworCQkJcnRzNTF4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgTVNfQ0ZHLCAmdmFsdWUpOworCQkJaWYgKHZhbHVlICYgTVNfMktfU0VDVE9SX01PREUpCisJCQkJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIE1TX0NGRywKKwkJCQkJCSAgICAgIE1TXzJLX1NFQ1RPUl9NT0RFLCAweDAwKTsKKwkJfQorCX0gZWxzZSBpZiAoKCFDSEtfTVNQUk8obXNfY2FyZCkpCisJCSAgICYmIG1zX2NhcmQtPmRlbGF5X3dyaXRlLmRlbGF5X3dyaXRlX2ZsYWcpIHsKKwkJUlRTNTFYX0RFQlVHUCgiTVM6IGRlbGF5IHdyaXRlXG4iKTsKKwkJbXNfZGVsYXlfd3JpdGUoY2hpcCk7CisJCW1zX2NhcmQtPmNvdW50ZXIgPSAwOworCX0KK30KKworaW50IG1zX3Bvd2VyX29mZl9jYXJkM3YzKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlpbnQgcmV0dmFsOworCisJcnRzNTF4X2luaXRfY21kKGNoaXApOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9DTEtfRU4sIE1TX0NMS19FTiwgMCk7CisJaWYgKGNoaXAtPmFzaWNfY29kZSkKKwkJbXNfcHVsbF9jdGxfZGlzYWJsZShjaGlwKTsKKwllbHNlCisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIEZQR0FfUFVMTF9DVEwsCisJCQkgICAgICAgRlBHQV9NU19QVUxMX0NUTF9CSVQgfCAweDIwLAorCQkJICAgICAgIEZQR0FfTVNfUFVMTF9DVExfQklUKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX09FLCBNU19PVVRQVVRfRU4sIDApOworCWlmICghY2hpcC0+b3B0aW9uLkZUMl9mYXN0X21vZGUpIHsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QV1JfQ1RMLCBQT1dFUl9NQVNLLAorCQkJICAgICAgIFBPV0VSX09GRik7CisJfQorCisJcmV0dmFsID0gcnRzNTF4X3NlbmRfY21kKGNoaXAsIE1PREVfQywgMTAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworaW50IHJlbGVhc2VfbXNfY2FyZChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCWludCByZXR2YWw7CisKKwlSVFM1MVhfREVCVUdQKCJyZWxlYXNlX21zX2NhcmRcbiIpOworCisJbXNfY2FyZC0+ZGVsYXlfd3JpdGUuZGVsYXlfd3JpdGVfZmxhZyA9IDA7CisJbXNfY2FyZC0+cHJvX3VuZGVyX2Zvcm1hdHRpbmcgPSAwOworCisJY2hpcC0+Y2FyZF9yZWFkeSAmPSB+TVNfQ0FSRDsKKwljaGlwLT5jYXJkX2ZhaWwgJj0gfk1TX0NBUkQ7CisJY2hpcC0+Y2FyZF93cCAmPSB+TVNfQ0FSRDsKKworCW1zX2ZyZWVfbDJwX3RibChjaGlwKTsKKworCXJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRlNNX0VELCBIV19DTURfU1RPUCwgSFdfQ01EX1NUT1ApOworCisJbWVtc2V0KG1zX2NhcmQtPnJhd19zeXNfaW5mbywgMCwgOTYpOworI2lmZGVmIFNVUFBPUlRfUENHTF8xUDE4CisJbWVtc2V0KG1zX2NhcmQtPnJhd19tb2RlbF9uYW1lLCAwLCA0OCk7CisjZW5kaWYKKworCXJldHZhbCA9IG1zX3Bvd2VyX29mZl9jYXJkM3YzKGNoaXApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvbXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L21zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlkNDZkMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L21zLmgKQEAgLTAsMCArMSwyNjMgQEAKKy8qIERyaXZlciBmb3IgUmVhbHRlayBSVFM1MXh4IFVTQiBjYXJkIHJlYWRlcgorICogSGVhZGVyIGZpbGUKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOSBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogQXV0aG9yOgorICogICB3d2FuZyAod2VpX3dhbmdAcmVhbHNpbC5jb20uY24pCisgKiAgIE5vLiA0NTAsIFNoZW5odSBSb2FkLCBTdXpob3UgSW5kdXN0cnkgUGFyaywgU3V6aG91LCBDaGluYQorICogTWFpbnRhaW5lcjoKKyAqICAgRWR3aW4gUm9uZyAoZWR3aW5fcm9uZ0ByZWFsc2lsLmNvbS5jbikKKyAqICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisgKi8KKworI2lmbmRlZiBfX1JUUzUxWF9NU19ICisjZGVmaW5lIF9fUlRTNTFYX01TX0gKKworI2luY2x1ZGUgInJ0czUxeF9jaGlwLmgiCisKKyNkZWZpbmUJTVNfTUFYX1JFVFJZX0NPVU5UCQkzCisKKyNkZWZpbmUJTVNfRVhUUkFfU0laRQkJCTB4OQorCisjZGVmaW5lCVdSVF9QUlRDVAkJCTB4MDEKKworLyogRXJyb3IgQ29kZSAqLworI2RlZmluZQlNU19OT19FUlJPUgkJCQkweDAwCisjZGVmaW5lCU1TX0NSQzE2X0VSUk9SCQkJCTB4ODAKKyNkZWZpbmUJTVNfVE9fRVJST1IJCQkJMHg0MAorI2RlZmluZQlNU19OT19DQVJECQkJCTB4MjAKKyNkZWZpbmUJTVNfTk9fTUVNT1JZCQkJCTB4MTAKKyNkZWZpbmUJTVNfQ01EX05LCQkJCTB4MDgKKyNkZWZpbmUJTVNfRkxBU0hfUkVBRF9FUlJPUgkJCTB4MDQKKyNkZWZpbmUJTVNfRkxBU0hfV1JJVEVfRVJST1IJCQkweDAyCisjZGVmaW5lCU1TX0JSRVFfRVJST1IJCQkJMHgwMQorI2RlZmluZQlNU19OT1RfRk9VTkQJCQkJMHgwMworCisvKiBUcmFuc2ZlciBQcm90b2NvbCBDb21tYW5kICovCisjZGVmaW5lIFJFQURfUEFHRV9EQVRBCQkJCTB4MDIKKyNkZWZpbmUgUkVBRF9SRUcJCQkJMHgwNAorI2RlZmluZQlHRVRfSU5UCQkJCQkweDA3CisjZGVmaW5lIFdSSVRFX1BBR0VfREFUQQkJCQkweDBECisjZGVmaW5lIFdSSVRFX1JFRwkJCQkweDBCCisjZGVmaW5lIFNFVF9SV19SRUdfQURSUwkJCQkweDA4CisjZGVmaW5lIFNFVF9DTUQJCQkJCTB4MEUKKworI2RlZmluZQlQUk9fUkVBRF9MT05HX0RBVEEJCQkweDAyCisjZGVmaW5lCVBST19SRUFEX1NIT1JUX0RBVEEJCQkweDAzCisjZGVmaW5lIFBST19SRUFEX1JFRwkJCQkweDA0CisjZGVmaW5lCVBST19SRUFEX1FVQURfREFUQQkJCTB4MDUKKyNkZWZpbmUgUFJPX0dFVF9JTlQJCQkJMHgwNworI2RlZmluZQlQUk9fV1JJVEVfTE9OR19EQVRBCQkJMHgwRAorI2RlZmluZQlQUk9fV1JJVEVfU0hPUlRfREFUQQkJCTB4MEMKKyNkZWZpbmUJUFJPX1dSSVRFX1FVQURfREFUQQkJCTB4MEEKKyNkZWZpbmUgUFJPX1dSSVRFX1JFRwkJCQkweDBCCisjZGVmaW5lIFBST19TRVRfUldfUkVHX0FEUlMJCQkweDA4CisjZGVmaW5lIFBST19TRVRfQ01ECQkJCTB4MEUKKyNkZWZpbmUgUFJPX0VYX1NFVF9DTUQJCQkJMHgwOQorCisjaWZkZWYgU1VQUE9SVF9NQUdJQ19HQVRFCisjZGVmaW5lIE1HX0dFVF9JRAkJMHg0MAorI2RlZmluZSBNR19TRVRfTElECQkweDQxCisjZGVmaW5lIE1HX0dFVF9MRUtCCQkweDQyCisjZGVmaW5lIE1HX1NFVF9SRAkJMHg0MworI2RlZmluZSBNR19NQUtFX1JNUwkJMHg0NAorI2RlZmluZSBNR19NQUtFX0tTRQkJMHg0NQorI2RlZmluZSBNR19TRVRfSUJECQkweDQ2CisjZGVmaW5lIE1HX0dFVF9JQkQJCTB4NDcKKyNlbmRpZgorCisjaWZkZWYgWENfUE9XRVJDTEFTUworI2RlZmluZSBYQ19DSEdfUE9XRVIJCTB4MTYKKyNlbmRpZgorCisvKiArKyBDTUQgb3ZlciBNZW1vcnkgU3RpY2sgKi8KKy8qICBGbGFzaCBDTUQgKi8KKyNkZWZpbmUgQkxPQ0tfUkVBRAkJMHhBQQorI2RlZmluZQlCTE9DS19XUklURQkJMHg1NQorI2RlZmluZSBCTE9DS19FTkQJCTB4MzMKKyNkZWZpbmUgQkxPQ0tfRVJBU0UJCTB4OTkKKyNkZWZpbmUgRkxBU0hfU1RPUAkJMHhDQworCisvKiAgRnVuY3Rpb24gQ01EICovCisjZGVmaW5lIFNMRUVQCQkJMHg1QQorI2RlZmluZSBDTEVBUl9CVUYJCTB4QzMKKyNkZWZpbmUgTVNfUkVTRVQJCTB4M0MKKy8qIC0tIENNRCBvdmVyIE1lbW9yeSBTdGljayAqLworCisvKiArKyBDTUQgb3ZlciBNZW1vcnkgU3RpY2sgUHJvICovCisvKiAgRmxhc2ggQ01EICovCisjZGVmaW5lIFBST19SRUFEX0RBVEEJCTB4MjAKKyNkZWZpbmUJUFJPX1dSSVRFX0RBVEEJCTB4MjEKKyNkZWZpbmUgUFJPX1JFQURfQVRSQgkJMHgyNAorI2RlZmluZSBQUk9fU1RPUAkJMHgyNQorI2RlZmluZSBQUk9fRVJBU0UJCTB4MjYKKyNkZWZpbmUJUFJPX1JFQURfMktfREFUQQkweDI3CisjZGVmaW5lCVBST19XUklURV8yS19EQVRBCTB4MjgKKworLyogIEZ1bmN0aW9uIENNRCAqLworI2RlZmluZSBQUk9fRk9STUFUCQkweDEwCisjZGVmaW5lIFBST19TTEVFUAkJMHgxMQorLyogLS0gQ01EIG92ZXIgTWVtb3J5IFN0aWNrIFBybyAqLworCisvKiAgcmVnaXN0ZXIgaW5zaWRlIG1lbW9yeSBzdGljayAqLworI2RlZmluZQlJbnRSZWcJCQkweDAxCisjZGVmaW5lIFN0YXR1c1JlZzAJCTB4MDIKKyNkZWZpbmUgU3RhdHVzUmVnMQkJMHgwMworCisjZGVmaW5lIFN5c3RlbVBhcm0JCTB4MTAKKyNkZWZpbmUgQmxvY2tBZHJzCQkweDExCisjZGVmaW5lIENNRFBhcm0JCQkweDE0CisjZGVmaW5lIFBhZ2VBZHJzCQkweDE1CisKKyNkZWZpbmUgT3ZlcndyaXRlRmxhZwkJMHgxNgorI2RlZmluZSBNYW5hZ2VtZW5GbGFnCQkweDE3CisjZGVmaW5lIExvZ2ljYWxBZHJzCQkweDE4CisjZGVmaW5lIFJlc2VydmVBcmVhCQkweDFBCisKKy8qICByZWdpc3RlciBpbnNpZGUgbWVtb3J5IHBybyAqLworI2RlZmluZQlQcm9fSW50UmVnCQkweDAxCisjZGVmaW5lIFByb19TdGF0dXNSZWcJCTB4MDIKKyNkZWZpbmUgUHJvX1R5cGVSZWcJCTB4MDQKKyNkZWZpbmUJUHJvX0lGTW9kZVJlZwkJMHgwNQorI2RlZmluZSBQcm9fQ2F0YWdvcnlSZWcJCTB4MDYKKyNkZWZpbmUgUHJvX0NsYXNzUmVnCQkweDA3CisKKyNkZWZpbmUgUHJvX1N5c3RlbVBhcm0JCTB4MTAKKyNkZWZpbmUgUHJvX0RhdGFDb3VudDEJCTB4MTEKKyNkZWZpbmUgUHJvX0RhdGFDb3VudDAJCTB4MTIKKyNkZWZpbmUgUHJvX0RhdGFBZGRyMwkJMHgxMworI2RlZmluZSBQcm9fRGF0YUFkZHIyCQkweDE0CisjZGVmaW5lIFByb19EYXRhQWRkcjEJCTB4MTUKKyNkZWZpbmUgUHJvX0RhdGFBZGRyMAkJMHgxNgorCisjZGVmaW5lIFByb19UUENQYXJtCQkweDE3CisjZGVmaW5lIFByb19DTURQYXJtCQkweDE4CisKKy8qICBkZWZpbmUgZm9yIElOVCBSZWdpc3RlciAqLworI2RlZmluZQlJTlRfUkVHX0NFRAkJMHg4MAorI2RlZmluZQlJTlRfUkVHX0VSUgkJMHg0MAorI2RlZmluZQlJTlRfUkVHX0JSRVEJCTB4MjAKKyNkZWZpbmUJSU5UX1JFR19DTUROSwkJMHgwMQorCisvKiAgSU5UIHNpZ25hbCAqLworI2RlZmluZQlJTlRfQ0VECQkJMHgwMQorI2RlZmluZQlJTlRfRVJSCQkJMHgwMgorI2RlZmluZQlJTlRfQlJFUQkJMHgwNAorI2RlZmluZQlJTlRfQ01ETksJCTB4MDgKKworLyogIGRlZmluZSBmb3IgT3ZlcndyaXRlRmxhZyBSZWdpc3RlciAqLworI2RlZmluZQlCTE9DS19CT09UCQkweEMwCisjZGVmaW5lCUJMT0NLX09LCQkweDgwCisjZGVmaW5lCVBBR0VfT0sJCQkweDYwCisjZGVmaW5lCURBVEFfQ09NUEwJCTB4MTAKKworLyogIGRlZmluZSBmb3IgTWFuYWdlbWVuRmxhZyBSZWdpc3RlciAqLworI2RlZmluZQlOT1RfQk9PVF9CTE9DSwkJMHg0CisjZGVmaW5lCU5PVF9UUkFOU0xBVElPTl9UQUJMRQkweDgKKworLyogIEhlYWRlciAqLworI2RlZmluZQlIRUFERVJfSUQwCQkoUFBCVUZfQkFTRTIpCQkJLyogMCAqLworI2RlZmluZQlIRUFERVJfSUQxCQkoUFBCVUZfQkFTRTIgKyAxKQkJLyogMSAqLworLyogIFN5c3RlbSBFbnRyeSAqLworI2RlZmluZQlESVNBQkxFRF9CTE9DSzAJCShQUEJVRl9CQVNFMiArIDB4MTcwICsgNCkJLyogMiAqLworI2RlZmluZQlESVNBQkxFRF9CTE9DSzEJCShQUEJVRl9CQVNFMiArIDB4MTcwICsgNSkJLyogMyAqLworI2RlZmluZQlESVNBQkxFRF9CTE9DSzIJCShQUEJVRl9CQVNFMiArIDB4MTcwICsgNikJLyogNCAqLworI2RlZmluZQlESVNBQkxFRF9CTE9DSzMJCShQUEJVRl9CQVNFMiArIDB4MTcwICsgNykJLyogNSAqLworLyogIEJvb3QgJiBBdHRyaWJ1dGUgSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUJQkxPQ0tfU0laRV8wCQkoUFBCVUZfQkFTRTIgKyAweDFhMCArIDIpCS8qIDYgKi8KKyNkZWZpbmUJQkxPQ0tfU0laRV8xCQkoUFBCVUZfQkFTRTIgKyAweDFhMCArIDMpCS8qIDcgKi8KKyNkZWZpbmUJQkxPQ0tfQ09VTlRfMAkJKFBQQlVGX0JBU0UyICsgMHgxYTAgKyA0KQkvKiA4ICovCisjZGVmaW5lCUJMT0NLX0NPVU5UXzEJCShQUEJVRl9CQVNFMiArIDB4MWEwICsgNSkJLyogOSAqLworI2RlZmluZQlFQkxPQ0tfQ09VTlRfMAkJKFBQQlVGX0JBU0UyICsgMHgxYTAgKyA2KQkvKiAxMCAqLworI2RlZmluZQlFQkxPQ0tfQ09VTlRfMQkJKFBQQlVGX0JBU0UyICsgMHgxYTAgKyA3KQkvKiAxMSAqLworI2RlZmluZQlQQUdFX1NJWkVfMAkJKFBQQlVGX0JBU0UyICsgMHgxYTAgKyA4KQkvKiAxMiAqLworI2RlZmluZQlQQUdFX1NJWkVfMQkJKFBQQlVGX0JBU0UyICsgMHgxYTAgKyA5KQkvKiAxMyAqLworCisvKiBqb2V5IDIwMDQtMDgtMDcgZm9yIE1TIGNoZWNrIFByb2NlZHVyZSAqLworI2RlZmluZSBNU19EZXZpY2VfVHlwZQkoUFBCVUZfQkFTRTIgKyAweDFEOCkJLyogMTQgKi8KKy8qIGVuZCAqLworCisvKiBqb2V5IDIwMDQtMDUtMDMgKi8KKyNkZWZpbmUJTVNfNGJpdF9TdXBwb3J0CShQUEJVRl9CQVNFMiArIDB4MUQzKQkvKiAxNSAqLworLyogZW5kICovCisKKyNkZWZpbmUgc2V0UFNfTkcJMQorI2RlZmluZSBzZXRQU19FcnJvcgkwCisKKy8qICBkZWZpbmUgZm9yIFByb19TeXN0ZW1QYXJtIFJlZ2lzdGVyICovCisjZGVmaW5lCVBBUkFMTEVMXzhCSVRfSUYJMHg0MAorI2RlZmluZQlQQVJBTExFTF80QklUX0lGCTB4MDAKKyNkZWZpbmUJU0VSSUFMX0lGCQkweDgwCisKKy8qICBkZWZpbmUgZm9yIFN0YXR1c1JlZzAgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQlVGX0ZVTEwJMHgxMAorI2RlZmluZSBCVUZfRU1QVFkJMHgyMAorCisvKiAgZGVmaW5lIGZvciBTdGF0dXNSZWcxIFJlZ2lzdGVyICovCisjZGVmaW5lCU1FRElBX0JVU1kJMHg4MAorI2RlZmluZQlGTEFTSF9CVVNZCTB4NDAKKyNkZWZpbmUJREFUQV9FUlJPUgkweDIwCisjZGVmaW5lCVNUU19VQ0RUCTB4MTAKKyNkZWZpbmUJRVhUUkFfRVJST1IJMHgwOAorI2RlZmluZQlTVFNfVUNFWAkweDA0CisjZGVmaW5lCUZMQUdfRVJST1IJMHgwMgorI2RlZmluZQlTVFNfVUNGRwkweDAxCisKKyNkZWZpbmUgTVNfU0hPUlRfREFUQV9MRU4JMzIKKworI2RlZmluZSBGT1JNQVRfU1VDQ0VTUwkJMAorI2RlZmluZSBGT1JNQVRfRkFJTAkJMQorI2RlZmluZSBGT1JNQVRfSU5fUFJPR1JFU1MJMgorCisjZGVmaW5lCU1TX1NFVF9CQURfQkxPQ0tfRkxHKG1zX2NhcmQpCSgobXNfY2FyZCktPm11bHRpX2ZsYWcgfD0gMHg4MCkKKyNkZWZpbmUgTVNfQ0xSX0JBRF9CTE9DS19GTEcobXNfY2FyZCkJKChtc19jYXJkKS0+bXVsdGlfZmxhZyAmPSAweDdGKQorI2RlZmluZSBNU19UU1RfQkFEX0JMT0NLX0ZMRyhtc19jYXJkKQkoKG1zX2NhcmQpLT5tdWx0aV9mbGFnICYgMHg4MCkKKworI2RlZmluZSBDSEVDS19NU19UUkFOU19GQUlMKGNoaXAsIHJldHZhbCkJXAorCSgoKHJldHZhbCkgIT0gU1RBVFVTX1NVQ0NFU1MpIHx8IFwKKwkoY2hpcC0+cnNwX2J1ZlswXSAmIE1TX1RSQU5TRkVSX0VSUikpCisKK3ZvaWQgbXNwcm9fcG9sbGluZ19mb3JtYXRfc3RhdHVzKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7Cit2b2lkIG1zcHJvX2Zvcm1hdF9zZW5zZShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBsdW4pOworCit2b2lkIG1zcHJvX3N0b3Bfc2VxX21vZGUoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKTsKK2ludCByZXNldF9tc19jYXJkKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7CitpbnQgbXNfcncoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHUzMiBzdGFydF9zZWN0b3IsCisJICB1MTYgc2VjdG9yX2NudCk7CitpbnQgbXNwcm9fZm9ybWF0KHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLAorCQkgaW50IHNob3J0X2RhdGFfbGVuLCBpbnQgcXVpY2tfZm9ybWF0KTsKK3ZvaWQgbXNfZnJlZV9sMnBfdGJsKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7Cit2b2lkIG1zX2NsZWFudXBfd29yayhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApOworaW50IG1zX3Bvd2VyX29mZl9jYXJkM3YzKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7CitpbnQgcmVsZWFzZV9tc19jYXJkKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7CitpbnQgbXNfZGVsYXlfd3JpdGUoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKTsKKworI2lmZGVmIFNVUFBPUlRfTUFHSUNfR0FURQorCitpbnQgbXNfc3dpdGNoX2Nsb2NrKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7CitpbnQgbXNfd3JpdGVfYnl0ZXMoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCB0cGMsIHU4IGNudCwgdTggY2ZnLCB1OCAqIGRhdGEsCisJCSAgIGludCBkYXRhX2xlbik7CitpbnQgbXNfcmVhZF9ieXRlcyhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IHRwYywgdTggY250LCB1OCBjZmcsIHU4ICogZGF0YSwKKwkJICBpbnQgZGF0YV9sZW4pOworaW50IG1zX3NldF9yd19yZWdfYWRkcihzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IHJlYWRfc3RhcnQsIHU4IHJlYWRfY250LAorCQkgICAgICAgdTggd3JpdGVfc3RhcnQsIHU4IHdyaXRlX2NudCk7CitpbnQgbXNfdHJhbnNmZXJfZGF0YShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IHRyYW5zX21vZGUsIHU4IHRwYywKKwkJICAgICB1MTYgc2VjX2NudCwgdTggY2ZnLCBpbnQgbW9kZV8yaywgaW50IHVzZV9zZywgdm9pZCAqYnVmLAorCQkgICAgIGludCBidWZfbGVuKTsKKyNlbmRpZgorCisjZW5kaWYgLyogX19SVFM1MVhfTVNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvbXNfbWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L21zX21nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0YjUyMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L21zX21nLmMKQEAgLTAsMCArMSw2NDIgQEAKKy8qIERyaXZlciBmb3IgUmVhbHRlayBSVFM1MXh4IFVTQiBjYXJkIHJlYWRlcgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5IFJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3JwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBBdXRob3I6CisgKiAgIHd3YW5nICh3ZWlfd2FuZ0ByZWFsc2lsLmNvbS5jbikKKyAqICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisgKiBNYWludGFpbmVyOgorICogICBFZHdpbiBSb25nIChlZHdpbl9yb25nQHJlYWxzaWwuY29tLmNuKQorICogICBOby4gNDUwLCBTaGVuaHUgUm9hZCwgU3V6aG91IEluZHVzdHJ5IFBhcmssIFN1emhvdSwgQ2hpbmEKKyAqLworCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ0cmFjZS5oIgorI2luY2x1ZGUgInJ0czUxeC5oIgorI2luY2x1ZGUgInJ0czUxeF90cmFuc3BvcnQuaCIKKyNpbmNsdWRlICJydHM1MXhfc2NzaS5oIgorI2luY2x1ZGUgInJ0czUxeF9jYXJkLmgiCisjaW5jbHVkZSAibXMuaCIKKworI2lmZGVmIFNVUFBPUlRfTUFHSUNfR0FURQorCitpbnQgbWdfY2hlY2tfaW50X2Vycm9yKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwl1OCB2YWx1ZTsKKworCXJ0czUxeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIE1TX1RSQU5TX0NGRywgJnZhbHVlKTsKKwlpZiAodmFsdWUgJiAoSU5UX0VSUiB8IElOVF9DTUROSykpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbWdfc2VuZF9leF9jbWQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCBjbWQsIHU4IGVudHJ5X251bSkKK3sKKwlpbnQgcmV0dmFsLCBpOworCXU4IGRhdGFbOF07CisKKwlkYXRhWzBdID0gY21kOworCWRhdGFbMV0gPSAwOworCWRhdGFbMl0gPSAwOworCWRhdGFbM10gPSAwOworCWRhdGFbNF0gPSAwOworCWRhdGFbNV0gPSAwOworCWRhdGFbNl0gPSBlbnRyeV9udW07CisJZGF0YVs3XSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVNfTUFYX1JFVFJZX0NPVU5UOyBpKyspIHsKKwkJcmV0dmFsID0KKwkJICAgIG1zX3dyaXRlX2J5dGVzKGNoaXAsIFBST19FWF9TRVRfQ01ELCA3LCBXQUlUX0lOVCwgZGF0YSwgOCk7CisJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCXJldHZhbCA9IG1nX2NoZWNrX2ludF9lcnJvcihjaGlwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitpbnQgbWdfc2V0X3RwY19wYXJhX3N1YihzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIGludCB0eXBlLCB1OCBtZ19lbnRyeV9udW0pCit7CisJaW50IHJldHZhbDsKKwl1OCBidWZbNl07CisKKwlSVFM1MVhfREVCVUdQKCItLSVzLS1cbiIsIF9fZnVuY19fKTsKKworCWlmICh0eXBlID09IDApCisJCXJldHZhbCA9IG1zX3NldF9yd19yZWdfYWRkcihjaGlwLCAwLCAwLCBQcm9fVFBDUGFybSwgMSk7CisJZWxzZQorCQlyZXR2YWwgPSBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgMCwgMCwgUHJvX0RhdGFDb3VudDEsIDYpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJYnVmWzBdID0gMDsKKwlidWZbMV0gPSAwOworCWlmICh0eXBlID09IDEpIHsKKwkJYnVmWzJdID0gMDsKKwkJYnVmWzNdID0gMDsKKwkJYnVmWzRdID0gMDsKKwkJYnVmWzVdID0gbWdfZW50cnlfbnVtOworCX0KKwlyZXR2YWwgPQorCSAgICBtc193cml0ZV9ieXRlcyhjaGlwLCBQUk9fV1JJVEVfUkVHLCAodHlwZSA9PSAwKSA/IDEgOiA2LAorCQkJICAgTk9fV0FJVF9JTlQsIGJ1ZiwgNik7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKKy8qKgorICAqIEdldCBNYWdjaUdhdGUgSUQgYW5kIHNldCBMZWFmIElEIHRvIG1lZGl1bS4KKworICAqIEFmdGVyIHJlY2VpdmluZyB0aGlzIFNDU0kgY29tbWFuZCwgYWRhcHRlciBzaGFsbCBmdWxmaWxsIDIgdGFza3MKKyAgKiBiZWxvdyBpbiBvcmRlcjoKKyAgKiAxLiBzZW5kIEdFVF9JRCBUUEMgY29tbWFuZCB0byBnZXQgTWFnaWNHYXRlIElEIGFuZCBob2xkIGl0IHRpbGwKKyAgKiBSZXNwb25zZSZjaGFsbGVuZ2UgQ01ELgorICAqIDIuIHNlbmQgU0VUX0lEIFRQQyBjb21tYW5kIHRvIG1lZGl1bSB3aXRoIExlYWYgSUQgcmVsZWFzZWQgYnkgaG9zdAorICAqIGluIHRoaXMgU0NTSSBDTUQuCisgICovCitpbnQgbWdfc2V0X2xlYWZfaWQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJaW50IHJldHZhbDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKKwl1OCBidWYxWzMyXSwgYnVmMlsxMl07CisKKwlSVFM1MVhfREVCVUdQKCItLSVzLS1cbiIsIF9fZnVuY19fKTsKKworCWlmIChzY3NpX2J1ZmZsZW4oc3JiKSA8IDEyKSB7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7CisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJfQorCW1zX2NsZWFudXBfd29yayhjaGlwKTsKKworCXJldHZhbCA9IG1zX3N3aXRjaF9jbG9jayhjaGlwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHZhbCA9IG1nX3NlbmRfZXhfY21kKGNoaXAsIE1HX1NFVF9MSUQsIDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0tFWV9GQUlMX05PVF9FU1RBQik7CisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKworCW1lbXNldChidWYxLCAwLCAzMik7CisJcnRzNTF4X2dldF94ZmVyX2J1ZihidWYyLCBtaW4oMTIsIChpbnQpc2NzaV9idWZmbGVuKHNyYikpLCBzcmIpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWJ1ZjFbOCArIGldID0gYnVmMls0ICsgaV07CisJcmV0dmFsID0KKwkgICAgbXNfd3JpdGVfYnl0ZXMoY2hpcCwgUFJPX1dSSVRFX1NIT1JUX0RBVEEsIDMyLCBXQUlUX0lOVCwgYnVmMSwgMzIpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0tFWV9GQUlMX05PVF9FU1RBQik7CisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKwlyZXR2YWwgPSBtZ19jaGVja19pbnRfZXJyb3IoY2hpcCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfS0VZX0ZBSUxfTk9UX0VTVEFCKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJfQorCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCisvKioKKyAgKiBTZW5kIExvY2FsIEVLQiB0byBob3N0LgorCisgICogQWZ0ZXIgcmVjZWl2aW5nIHRoaXMgU0NTSSBjb21tYW5kLCBhZGFwdGVyIHNoYWxsIHJlYWQgdGhlIGRpdmlkZWQKKyAgKiBkYXRhKDE1MzYgYnl0ZXMgdG90YWxseSkgZnJvbSBtZWRpdW0gYnkgdXNpbmcgUkVBRF9MT05HX0RBVEEgVFBDCisgICogZm9yIDMgdGltZXMsIGFuZCByZXBvcnQgZGF0YSB0byBob3N0IHdpdGggZGF0YS1sZW5ndGggaXMgMTA1MiBieXRlcy4KKyAgKi8KK2ludCBtZ19nZXRfbG9jYWxfRUtCKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCWludCByZXR2YWwgPSBTVEFUVVNfRkFJTDsKKwlpbnQgYnVmZmxlbjsKKwl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKKwl1OCAqYnVmID0gTlVMTDsKKworCVJUUzUxWF9ERUJVR1AoIi0tJXMtLVxuIiwgX19mdW5jX18pOworCisJbXNfY2xlYW51cF93b3JrKGNoaXApOworCisJcmV0dmFsID0gbXNfc3dpdGNoX2Nsb2NrKGNoaXApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJYnVmID0ga21hbGxvYygxNTQwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19OT01FTSk7CisKKwlidWZbMF0gPSAweDA0OworCWJ1ZlsxXSA9IDB4MUE7CisJYnVmWzJdID0gMHgwMDsKKwlidWZbM10gPSAweDAwOworCisJcmV0dmFsID0gbWdfc2VuZF9leF9jbWQoY2hpcCwgTUdfR0VUX0xFS0IsIDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0tFWV9GQUlMX05PVF9BVVRIRU4pOworCQlUUkFDRV9HT1RPKGNoaXAsIEdldEVLQkZpbmlzaCk7CisJfQorCisJcmV0dmFsID0gbXNfdHJhbnNmZXJfZGF0YShjaGlwLCBNU19UTV9BVVRPX1JFQUQsIFBST19SRUFEX0xPTkdfREFUQSwKKwkJCQkgIDMsIFdBSVRfSU5ULCAwLCAwLCBidWYgKyA0LCAxNTM2KTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19LRVlfRkFJTF9OT1RfQVVUSEVOKTsKKwkJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfU1RPUCwgTVNfU1RPUCB8IE1TX0NMUl9FUlIsCisJCQkJICAgICAgTVNfU1RPUCB8IE1TX0NMUl9FUlIpOworCQlUUkFDRV9HT1RPKGNoaXAsIEdldEVLQkZpbmlzaCk7CisJfQorCXJldHZhbCA9IG1nX2NoZWNrX2ludF9lcnJvcihjaGlwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19LRVlfRkFJTF9OT1RfQVVUSEVOKTsKKwkJVFJBQ0VfR09UTyhjaGlwLCBHZXRFS0JGaW5pc2gpOworCX0KKworCWJ1ZmZsZW4gPSBtaW4oMTA1MiwgKGludClzY3NpX2J1ZmZsZW4oc3JiKSk7CisJcnRzNTF4X3NldF94ZmVyX2J1ZihidWYsIGJ1ZmZsZW4sIHNyYik7CisKK0dldEVLQkZpbmlzaDoKKwlrZnJlZShidWYpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICAqIFNlbmQgY2hhbGxlbmdlKGhvc3QpIHRvIG1lZGl1bS4KKworICAqIEFmdGVyIHJlY2VpdmluZyB0aGlzIFNDU0kgY29tbWFuZCwgYWRhcHRlciBzaGFsbCBzZXF1ZW50aWFsbHkgaXNzdWVzCisgICogVFBDIGNvbW1hbmRzIHRvIHRoZSBtZWRpdW0gZm9yIHdyaXRpbmcgOC1ieXRlcyBkYXRhIGFzIGNoYWxsZW5nZQorICAqIGJ5IGhvc3Qgd2l0aGluIGEgc2hvcnQgZGF0YSBwYWNrZXQuCisgICovCitpbnQgbWdfY2hnKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKwlpbnQgcmV0dmFsOworCWludCBidWZmbGVuOworCWludCBpOworCXVuc2lnbmVkIGludCBsdW4gPSBTQ1NJX0xVTihzcmIpOworCXU4IGJ1ZlszMl0sIHRtcDsKKworCVJUUzUxWF9ERUJVR1AoIi0tJXMtLVxuIiwgX19mdW5jX18pOworCisJbXNfY2xlYW51cF93b3JrKGNoaXApOworCisJcmV0dmFsID0gbXNfc3dpdGNoX2Nsb2NrKGNoaXApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcmV0dmFsID0gbWdfc2VuZF9leF9jbWQoY2hpcCwgTUdfR0VUX0lELCAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19JTkNPTVBBVElCTEVfTUVESVVNKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJfQorCisJcmV0dmFsID0KKwkgICAgbXNfcmVhZF9ieXRlcyhjaGlwLCBQUk9fUkVBRF9TSE9SVF9EQVRBLCAzMiwgV0FJVF9JTlQsIGJ1ZiwgMzIpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0lOQ09NUEFUSUJMRV9NRURJVU0pOworCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwl9CisJcmV0dmFsID0gbWdfY2hlY2tfaW50X2Vycm9yKGNoaXApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0lOQ09NUEFUSUJMRV9NRURJVU0pOworCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwl9CisKKwltZW1jcHkobXNfY2FyZC0+bWFnaWNfZ2F0ZV9pZCwgYnVmLCAxNik7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjUwMDsgaSsrKSB7CisJCVJUUzUxWF9SRUFEX1JFRyhjaGlwLCBNU19UUkFOU19DRkcsICZ0bXApOworCQlpZiAodG1wICYKKwkJICAgIChNU19JTlRfQ0VEIHwgTVNfSU5UX0NNRE5LIHwgTVNfSU5UX0JSRVEgfCBNU19JTlRfRVJSKSkKKwkJCWJyZWFrOworCisJCXdhaXRfdGltZW91dCgxKTsKKwl9CisKKwlpZiAoaSA9PSAyNTAwKSB7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19JTkNPTVBBVElCTEVfTUVESVVNKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwl9CisKKwlyZXR2YWwgPSBtZ19zZW5kX2V4X2NtZChjaGlwLCBNR19TRVRfUkQsIDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0lOQ09NUEFUSUJMRV9NRURJVU0pOworCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwl9CisKKwlidWZmbGVuID0gbWluKDEyLCAoaW50KXNjc2lfYnVmZmxlbihzcmIpKTsKKwlydHM1MXhfZ2V0X3hmZXJfYnVmKGJ1ZiwgYnVmZmxlbiwgc3JiKTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWJ1ZltpXSA9IGJ1Zls0ICsgaV07CisJZm9yIChpID0gMDsgaSA8IDI0OyBpKyspCisJCWJ1Zls4ICsgaV0gPSAwOworCXJldHZhbCA9CisJICAgIG1zX3dyaXRlX2J5dGVzKGNoaXAsIFBST19XUklURV9TSE9SVF9EQVRBLCAzMiwgV0FJVF9JTlQsIGJ1ZiwgMzIpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0lOQ09NUEFUSUJMRV9NRURJVU0pOworCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwl9CisJcmV0dmFsID0gbWdfY2hlY2tfaW50X2Vycm9yKGNoaXApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0lOQ09NUEFUSUJMRV9NRURJVU0pOworCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwl9CisKKwltc19jYXJkLT5tZ19hdXRoID0gMDsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgICogU2VuZCBSZXNwb25zZSBhbmQgQ2hhbGxlbmdlIGRhdGEgIHRvIGhvc3QuCisKKyAgKiBBZnRlciByZWNlaXZpbmcgdGhpcyBTQ1NJIGNvbW1hbmQsIGFkYXB0ZXIgc2hhbGwgY29tbXVuaWNhdGVzIHdpdGgKKyAgKiB0aGUgbWVkaXVtLCBnZXQgcGFyYW1ldGVycyhIUmQsIFJtcywgTWFnaWNHYXRlSUQpIGJ5IHVzaW5nIFJFQURfU0hPUlRfREFUQQorICAqIFRQQyBhbmQgc2VuZCB0aGUgZGF0YSB0byBob3N0IGFjY29yZGluZyB0byBjZXJ0YWluIGZvcm1hdCByZXF1aXJlZCBieQorICAqIE1HLVIgc3BlY2lmaWNhdGlvbi4KKyAgKiBUaGUgcGFyZW1ldGVyIE1hZ2ljR2F0ZUlEIGlzIHRoZSBvbmUgdGhhdCBhZGFwdGVyIGhhcyBvYnRhaW5lZCBmcm9tCisgICogdGhlIG1lZGl1bSBieSBUUEMgY29tbWFuZHMgaW4gU2V0IExlYWYgSUQgY29tbWFuZCBwaGFzZSBwcmV2aW91c2x5LgorICAqLworaW50IG1nX2dldF9yc3BfY2hnKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKwlpbnQgcmV0dmFsLCBpOworCWludCBidWZmbGVuOworCXVuc2lnbmVkIGludCBsdW4gPSBTQ1NJX0xVTihzcmIpOworCXU4IGJ1ZjFbMzJdLCBidWYyWzM2XSwgdG1wOworCisJUlRTNTFYX0RFQlVHUCgiLS0lcy0tXG4iLCBfX2Z1bmNfXyk7CisKKwltc19jbGVhbnVwX3dvcmsoY2hpcCk7CisKKwlyZXR2YWwgPSBtc19zd2l0Y2hfY2xvY2soY2hpcCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlyZXR2YWwgPSBtZ19zZW5kX2V4X2NtZChjaGlwLCBNR19NQUtFX1JNUywgMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfS0VZX0ZBSUxfTk9UX0FVVEhFTik7CisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKworCXJldHZhbCA9CisJICAgIG1zX3JlYWRfYnl0ZXMoY2hpcCwgUFJPX1JFQURfU0hPUlRfREFUQSwgMzIsIFdBSVRfSU5ULCBidWYxLCAzMik7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfS0VZX0ZBSUxfTk9UX0FVVEhFTik7CisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKwlyZXR2YWwgPSBtZ19jaGVja19pbnRfZXJyb3IoY2hpcCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfS0VZX0ZBSUxfTk9UX0FVVEhFTik7CisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKworCWJ1ZjJbMF0gPSAweDAwOworCWJ1ZjJbMV0gPSAweDIyOworCWJ1ZjJbMl0gPSAweDAwOworCWJ1ZjJbM10gPSAweDAwOworCisJbWVtY3B5KGJ1ZjIgKyA0LCBtc19jYXJkLT5tYWdpY19nYXRlX2lkLCAxNik7CisJbWVtY3B5KGJ1ZjIgKyAyMCwgYnVmMSwgMTYpOworCisJYnVmZmxlbiA9IG1pbigzNiwgKGludClzY3NpX2J1ZmZsZW4oc3JiKSk7CisJcnRzNTF4X3NldF94ZmVyX2J1ZihidWYyLCBidWZmbGVuLCBzcmIpOworCisJZm9yIChpID0gMDsgaSA8IDI1MDA7IGkrKykgeworCQlSVFM1MVhfUkVBRF9SRUcoY2hpcCwgTVNfVFJBTlNfQ0ZHLCAmdG1wKTsKKwkJaWYgKHRtcCAmIChNU19JTlRfQ0VEIHwgTVNfSU5UX0NNRE5LIHwKKwkJCQlNU19JTlRfQlJFUSB8IE1TX0lOVF9FUlIpKQorCQkJYnJlYWs7CisKKwkJd2FpdF90aW1lb3V0KDEpOworCX0KKworCWlmIChpID09IDI1MDApIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0tFWV9GQUlMX05PVF9BVVRIRU4pOworCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworLyoqCisgICogU2VuZCByZXNwb25zZShob3N0KSB0byBtZWRpdW0uCisKKyAgKiBBZnRlciByZWNlaXZpbmcgdGhpcyBTQ1NJIGNvbW1hbmQsIGFkYXB0ZXIgc2hhbGwgc2VxdWVudGlhbGx5CisgICogaXNzdWVzIFRQQyBjb21tYW5kcyB0byB0aGUgbWVkaXVtIGZvciB3cml0aW5nIDgtYnl0ZXMgZGF0YSBhcworICAqIGNoYWxsZW5nZSBieSBob3N0IHdpdGhpbiBhIHNob3J0IGRhdGEgcGFja2V0LgorICAqLworaW50IG1nX3JzcChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7CisJaW50IHJldHZhbDsKKwlpbnQgaTsKKwlpbnQgYnVmZmxlbjsKKwl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKKwl1OCBidWZbMzJdOworCisJUlRTNTFYX0RFQlVHUCgiLS0lcy0tXG4iLCBfX2Z1bmNfXyk7CisKKwltc19jbGVhbnVwX3dvcmsoY2hpcCk7CisKKwlyZXR2YWwgPSBtc19zd2l0Y2hfY2xvY2soY2hpcCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlyZXR2YWwgPSBtZ19zZW5kX2V4X2NtZChjaGlwLCBNR19NQUtFX0tTRSwgMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfS0VZX0ZBSUxfTk9UX0FVVEhFTik7CisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKworCWJ1ZmZsZW4gPSBtaW4oMTIsIChpbnQpc2NzaV9idWZmbGVuKHNyYikpOworCXJ0czUxeF9nZXRfeGZlcl9idWYoYnVmLCBidWZmbGVuLCBzcmIpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJYnVmW2ldID0gYnVmWzQgKyBpXTsKKwlmb3IgKGkgPSAwOyBpIDwgMjQ7IGkrKykKKwkJYnVmWzggKyBpXSA9IDA7CisJcmV0dmFsID0KKwkgICAgbXNfd3JpdGVfYnl0ZXMoY2hpcCwgUFJPX1dSSVRFX1NIT1JUX0RBVEEsIDMyLCBXQUlUX0lOVCwgYnVmLCAzMik7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfS0VZX0ZBSUxfTk9UX0FVVEhFTik7CisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKwlyZXR2YWwgPSBtZ19jaGVja19pbnRfZXJyb3IoY2hpcCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfS0VZX0ZBSUxfTk9UX0FVVEhFTik7CisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKworCW1zX2NhcmQtPm1nX2F1dGggPSAxOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCisvKiogKiBTZW5kIElDViBkYXRhIHRvIGhvc3QuCisKKyAgKiBBZnRlciByZWNlaXZpbmcgdGhpcyBTQ1NJIGNvbW1hbmQsIGFkYXB0ZXIgc2hhbGwgcmVhZCB0aGUgZGl2aWRlZAorICAqIGRhdGEoMTAyNCBieXRlcyB0b3RhbGx5KSBmcm9tIG1lZGl1bSBieSB1c2luZyBSRUFEX0xPTkdfREFUQSBUUEMKKyAgKiBmb3IgMiB0aW1lcywgYW5kIHJlcG9ydCBkYXRhIHRvIGhvc3Qgd2l0aCBkYXRhLWxlbmd0aCBpcyAxMDI4IGJ5dGVzLgorICAqCisgICogU2luY2UgdGhlIGV4dHJhIDQgYnl0ZXMgZGF0YSBpcyBqdXN0IG9ubHkgYSBwcmVmaXggdG8gb3JpZ2luYWwgZGF0YQorICAqIHRoYXQgcmVhZCBmcm9tIG1lZGl1bSwgc28gdGhhdCB0aGUgNC1ieXRlIGRhdGEgcHVzaGVkIGludG8gUmluZyBidWZmZXIKKyAgKiBwcmVjZWRlcyBkYXRhIHRyYW1zaW5zc2lvbiBmcm9tIG1lZGl1bSB0byBSaW5nIGJ1ZmZlciBieSBETUEgbWVjaGFuaXNpbQorICAqIGluIG9yZGVyIHRvIGdldCBtYXhpbXVtIHBlcmZvcm1hbmNlIGFuZCBtaW5pbXVtIGNvZGUgc2l6ZSBzaW11bHRhbmVvdXNseS4KKyAgKi8KK2ludCBtZ19nZXRfSUNWKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKwlpbnQgcmV0dmFsOworCWludCBidWZmbGVuOworCXVuc2lnbmVkIGludCBsdW4gPSBTQ1NJX0xVTihzcmIpOworCXU4ICpidWYgPSBOVUxMOworCisJUlRTNTFYX0RFQlVHUCgiLS0lcy0tXG4iLCBfX2Z1bmNfXyk7CisKKwltc19jbGVhbnVwX3dvcmsoY2hpcCk7CisKKwlyZXR2YWwgPSBtc19zd2l0Y2hfY2xvY2soY2hpcCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlidWYgPSBrbWFsbG9jKDEwMjgsIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX05PTUVNKTsKKworCWJ1ZlswXSA9IDB4MDQ7CisJYnVmWzFdID0gMHgwMjsKKwlidWZbMl0gPSAweDAwOworCWJ1ZlszXSA9IDB4MDA7CisKKwlyZXR2YWwgPSBtZ19zZW5kX2V4X2NtZChjaGlwLCBNR19HRVRfSUJELCBtc19jYXJkLT5tZ19lbnRyeV9udW0pOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7CisJCVRSQUNFX0dPVE8oY2hpcCwgR2V0SUNWRmluaXNoKTsKKwl9CisKKwlyZXR2YWwgPSBtc190cmFuc2Zlcl9kYXRhKGNoaXAsIE1TX1RNX0FVVE9fUkVBRCwgUFJPX1JFQURfTE9OR19EQVRBLAorCQkJCSAgMiwgV0FJVF9JTlQsIDAsIDAsIGJ1ZiArIDQsIDEwMjQpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7CisJCXJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1NUT1AsIE1TX1NUT1AgfCBNU19DTFJfRVJSLAorCQkJCSAgICAgIE1TX1NUT1AgfCBNU19DTFJfRVJSKTsKKwkJVFJBQ0VfR09UTyhjaGlwLCBHZXRJQ1ZGaW5pc2gpOworCX0KKwlyZXR2YWwgPSBtZ19jaGVja19pbnRfZXJyb3IoY2hpcCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfVU5SRUNPVkVSX1JFQURfRVJSKTsKKwkJVFJBQ0VfR09UTyhjaGlwLCBHZXRJQ1ZGaW5pc2gpOworCX0KKworCWJ1ZmZsZW4gPSBtaW4oMTAyOCwgKGludClzY3NpX2J1ZmZsZW4oc3JiKSk7CisJcnRzNTF4X3NldF94ZmVyX2J1ZihidWYsIGJ1ZmZsZW4sIHNyYik7CisKK0dldElDVkZpbmlzaDoKKwlrZnJlZShidWYpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICAqIFNlbmQgSUNWIGRhdGEgdG8gbWVkaXVtLgorCisgICogQWZ0ZXIgcmVjZWl2aW5nIHRoaXMgU0NTSSBjb21tYW5kLCBhZGFwdGVyIHNoYWxsIHJlY2VpdmUgMTAyOCBieXRlcworICAqIGFuZCB3cml0ZSB0aGUgbGF0ZXIgMTAyNCBieXRlcyB0byBtZWRpdW0gYnkgV1JJVEVfTE9OR19EQVRBIFRQQworICAqIGNvbnNlY3V0aXZlbHkuCisgICoKKyAgKiBTaW5jZSB0aGUgZmlyc3QgNC1ieXRlcyBkYXRhIGlzIGp1c3Qgb25seSBhIHByZWZpeCB0byBvcmlnaW5hbCBkYXRhCisgICogdGhhdCBzZW50IGJ5IGhvc3QsIGFuZCBpdCBzaG91bGQgYmUgc2tpcHBlZCBieSBzaGlmdGluZyBETUEgcG9pbnRlcgorICAqIGJlZm9yZSB3cml0aW5nIDEwMjQgYnl0ZXMgdG8gbWVkaXVtLgorICAqLworaW50IG1nX3NldF9JQ1Yoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCWludCByZXR2YWw7CisJaW50IGJ1ZmZsZW47CisjaWZkZWYgTUdfU0VUX0lDVl9TTE9XCisJaW50IGk7CisjZW5kaWYKKwl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKKwl1OCAqYnVmID0gTlVMTDsKKworCVJUUzUxWF9ERUJVR1AoIi0tJXMtLVxuIiwgX19mdW5jX18pOworCisJbXNfY2xlYW51cF93b3JrKGNoaXApOworCisJcmV0dmFsID0gbXNfc3dpdGNoX2Nsb2NrKGNoaXApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJYnVmID0ga21hbGxvYygxMDI4LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19OT01FTSk7CisKKwlidWZmbGVuID0gbWluKDEwMjgsIChpbnQpc2NzaV9idWZmbGVuKHNyYikpOworCXJ0czUxeF9nZXRfeGZlcl9idWYoYnVmLCBidWZmbGVuLCBzcmIpOworCisJcmV0dmFsID0gbWdfc2VuZF9leF9jbWQoY2hpcCwgTUdfU0VUX0lCRCwgbXNfY2FyZC0+bWdfZW50cnlfbnVtKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCWlmIChtc19jYXJkLT5tZ19hdXRoID09IDApIHsKKwkJCWlmICgoYnVmWzVdICYgMHhDMCkgIT0gMCkKKwkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCisJCQkJCVNFTlNFX1RZUEVfTUdfS0VZX0ZBSUxfTk9UX0VTVEFCKTsKKwkJCWVsc2UKKwkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCisJCQkJCVNFTlNFX1RZUEVfTUdfV1JJVEVfRVJSKTsKKwkJfSBlbHNlIHsKKwkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19XUklURV9FUlIpOworCQl9CisJCVRSQUNFX0dPVE8oY2hpcCwgU2V0SUNWRmluaXNoKTsKKwl9CisKKyNpZmRlZiBNR19TRVRfSUNWX1NMT1cKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXVkZWxheSg1MCk7CisKKwkJcnRzNTF4X2luaXRfY21kKGNoaXApOworCisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1TX1RQQywgMHhGRiwKKwkJCSAgICAgICBQUk9fV1JJVEVfTE9OR19EQVRBKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfVFJBTlNfQ0ZHLCAweEZGLAorCQkJICAgICAgIFdBSVRfSU5UKTsKKworCQl0cmFuc19kbWFfZW5hYmxlKERNQV9UT19ERVZJQ0UsIGNoaXAsIDUxMiwgRE1BXzUxMik7CisKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTVNfVFJBTlNGRVIsIDB4RkYsCisJCQkgICAgICAgTVNfVFJBTlNGRVJfU1RBUlQgfCBNU19UTV9OT1JNQUxfV1JJVEUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBDSEVDS19SRUdfQ01ELCBNU19UUkFOU0ZFUiwKKwkJCSAgICAgICBNU19UUkFOU0ZFUl9FTkQsIE1TX1RSQU5TRkVSX0VORCk7CisKKwkJcmV0dmFsID0gcnRzNTF4X3NlbmRfY21kKGNoaXAsIE1PREVfQ0RPUiwgMTAwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX1dSSVRFX0VSUik7CisJCQlUUkFDRV9HT1RPKGNoaXAsIFNldElDVkZpbmlzaCk7CisJCX0KKworCQlyZXR2YWwgPSBydHM1MXhfdHJhbnNmZXJfZGF0YV9yY2MoY2hpcCwgU05EX0JVTEtfUElQRShjaGlwKSwKKwkJCQkJCSAgYnVmICsgNCArIGkgKiA1MTIsIDUxMiwgMCwKKwkJCQkJCSAgTlVMTCwgMzAwMCwgU1RBR0VfRE8pOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHM1MXhfY2xlYXJfbXNfZXJyb3IoY2hpcCk7CisJCQlpZiAobXNfY2FyZC0+bWdfYXV0aCA9PSAwKSB7CisJCQkJaWYgKChidWZbNV0gJiAweEMwKSAhPSAwKQorCQkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCisJCQkJCQlTRU5TRV9UWVBFX01HX0tFWV9GQUlMX05PVF9FU1RBQik7CisJCQkJZWxzZQorCQkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCisJCQkJCQlTRU5TRV9UWVBFX01HX1dSSVRFX0VSUik7CisJCQl9IGVsc2UgeworCQkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKKwkJCQkJICAgICAgIFNFTlNFX1RZUEVfTUdfV1JJVEVfRVJSKTsKKwkJCX0KKwkJCXJldHZhbCA9IFNUQVRVU19GQUlMOworCQkJVFJBQ0VfR09UTyhjaGlwLCBTZXRJQ1ZGaW5pc2gpOworCQl9CisKKwkJcmV0dmFsID0gcnRzNTF4X2dldF9yc3AoY2hpcCwgMSwgMzAwMCk7CisJCWlmIChDSEVDS19NU19UUkFOU19GQUlMKGNoaXAsIHJldHZhbCkKKwkJICAgIHx8IG1nX2NoZWNrX2ludF9lcnJvcihjaGlwKSkgeworCQkJcnRzNTF4X2NsZWFyX21zX2Vycm9yKGNoaXApOworCQkJaWYgKG1zX2NhcmQtPm1nX2F1dGggPT0gMCkgeworCQkJCWlmICgoYnVmWzVdICYgMHhDMCkgIT0gMCkKKwkJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCQkJU0VOU0VfVFlQRV9NR19LRVlfRkFJTF9OT1RfRVNUQUIpOworCQkJCWVsc2UKKwkJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCQkJU0VOU0VfVFlQRV9NR19XUklURV9FUlIpOworCQkJfSBlbHNlIHsKKwkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCisJCQkJCSAgICAgICBTRU5TRV9UWVBFX01HX1dSSVRFX0VSUik7CisJCQl9CisJCQlyZXR2YWwgPSBTVEFUVVNfRkFJTDsKKwkJCVRSQUNFX0dPVE8oY2hpcCwgU2V0SUNWRmluaXNoKTsKKwkJfQorCX0KKyNlbHNlCisJcmV0dmFsID0gbXNfdHJhbnNmZXJfZGF0YShjaGlwLCBNU19UTV9BVVRPX1dSSVRFLCBQUk9fV1JJVEVfTE9OR19EQVRBLAorCQkJCSAgMiwgV0FJVF9JTlQsIDAsIDAsIGJ1ZiArIDQsIDEwMjQpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzNTF4X2NsZWFyX21zX2Vycm9yKGNoaXApOworCQlpZiAobXNfY2FyZC0+bWdfYXV0aCA9PSAwKSB7CisJCQlpZiAoKGJ1Zls1XSAmIDB4QzApICE9IDApCisJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCQlTRU5TRV9UWVBFX01HX0tFWV9GQUlMX05PVF9FU1RBQik7CisJCQllbHNlCisJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCQlTRU5TRV9UWVBFX01HX1dSSVRFX0VSUik7CisJCX0gZWxzZSB7CisJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfV1JJVEVfRVJSKTsKKwkJfQorCQlUUkFDRV9HT1RPKGNoaXAsIFNldElDVkZpbmlzaCk7CisJfQorI2VuZGlmCisKK1NldElDVkZpbmlzaDoKKwlrZnJlZShidWYpOworCXJldHVybiByZXR2YWw7Cit9CisKKyNlbmRpZiAvKiBTVVBQT1JUX01BR0lDX0dBVEUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L21zX21nLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9tc19tZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyY2E1NTAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9tc19tZy5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qIERyaXZlciBmb3IgUmVhbHRlayBSVFM1MXh4IFVTQiBjYXJkIHJlYWRlcgorICogSGVhZGVyIGZpbGUKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOSBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogQXV0aG9yOgorICogICB3d2FuZyAod2VpX3dhbmdAcmVhbHNpbC5jb20uY24pCisgKiAgIE5vLiA0NTAsIFNoZW5odSBSb2FkLCBTdXpob3UgSW5kdXN0cnkgUGFyaywgU3V6aG91LCBDaGluYQorICogTWFpbnRhaW5lcjoKKyAqICAgRWR3aW4gUm9uZyAoZWR3aW5fcm9uZ0ByZWFsc2lsLmNvbS5jbikKKyAqICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisgKi8KKworI2lmbmRlZiBfX1JUUzUxWF9NU19NR19ICisjZGVmaW5lIF9fUlRTNTFYX01TX01HX0gKKworI2luY2x1ZGUgInJ0czUxeF9jaGlwLmgiCisjaW5jbHVkZSAibXMuaCIKKworaW50IG1nX3NldF9sZWFmX2lkKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKTsKK2ludCBtZ19nZXRfbG9jYWxfRUtCKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKTsKK2ludCBtZ19jaGcoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApOworaW50IG1nX2dldF9yc3BfY2hnKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKTsKK2ludCBtZ19yc3Aoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApOworaW50IG1nX2dldF9JQ1Yoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApOworaW50IG1nX3NldF9JQ1Yoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApOworCisjZW5kaWYgLyogX19SVFM1MVhfTVNfTUdfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWNlZTZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4LmMKQEAgLTAsMCArMSw5NjcgQEAKKy8qIERyaXZlciBmb3IgUmVhbHRlayBSVFM1MXh4IFVTQiBjYXJkIHJlYWRlcgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5IFJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3JwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBBdXRob3I6CisgKiAgIHd3YW5nICh3ZWlfd2FuZ0ByZWFsc2lsLmNvbS5jbikKKyAqICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisgKiBNYWludGFpbmVyOgorICogICBFZHdpbiBSb25nIChlZHdpbl9yb25nQHJlYWxzaWwuY29tLmNuKQorICogICBOby4gNDUwLCBTaGVuaHUgUm9hZCwgU3V6aG91IEluZHVzdHJ5IFBhcmssIFN1emhvdSwgQ2hpbmEKKyAqLworCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpbmZvLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2VoLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAibXMuaCIKKyNpbmNsdWRlICJydHM1MXguaCIKKyNpbmNsdWRlICJydHM1MXhfY2hpcC5oIgorI2luY2x1ZGUgInJ0czUxeF9jYXJkLmgiCisjaW5jbHVkZSAicnRzNTF4X3Njc2kuaCIKKyNpbmNsdWRlICJydHM1MXhfdHJhbnNwb3J0LmgiCisjaW5jbHVkZSAicnRzNTF4X2ZvcC5oIgorCitNT0RVTEVfREVTQ1JJUFRJT04oUlRTNTFYX0RFU0MpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJJVkVSX1ZFUlNJT04pOworCisjaWZkZWYgU0NTSV9TQ0FOX0RFTEFZCitzdGF0aWMgdW5zaWduZWQgaW50IGRlbGF5X3VzZSA9IDU7Cittb2R1bGVfcGFyYW0oZGVsYXlfdXNlLCB1aW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRlbGF5X3VzZSwgInNlY29uZHMgdG8gZGVsYXkgYmVmb3JlIHVzaW5nIGEgbmV3IGRldmljZSIpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgYXV0b19kZWxpbmtfZW47Cittb2R1bGVfcGFyYW0oYXV0b19kZWxpbmtfZW4sIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhhdXRvX2RlbGlua19lbiwgImVuYWJsZSBhdXRvIGRlbGluayIpOworCitzdGF0aWMgaW50IHNzX2VuOworbW9kdWxlX3BhcmFtKHNzX2VuLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0Moc3NfZW4sICJlbmFibGUgc2VsZWN0aXZlIHN1c3BlbmQiKTsKKworc3RhdGljIGludCBzc19kZWxheSA9IDUwOworbW9kdWxlX3BhcmFtKHNzX2RlbGF5LCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0Moc3NfZGVsYXksCisJCSAic2Vjb25kcyB0byBkZWxheSBiZWZvcmUgZW50ZXJpbmcgc2VsZWN0aXZlIHN1c3BlbmQiKTsKKworc3RhdGljIGludCBuZWVkc19yZW1vdGVfd2FrZXVwOworbW9kdWxlX3BhcmFtKG5lZWRzX3JlbW90ZV93YWtldXAsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhuZWVkc19yZW1vdGVfd2FrZXVwLCAic3Mgc3RhdGUgbmVlZHMgcmVtb3RlIHdha2V1cCBzdXBwb3J0ZWQiKTsKKworI2lmZGVmIFNVUFBPUlRfRklMRV9PUAorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnRzNTF4X2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLnJlYWQgPSBydHM1MXhfcmVhZCwKKwkud3JpdGUgPSBydHM1MXhfd3JpdGUsCisJLnVubG9ja2VkX2lvY3RsID0gcnRzNTF4X2lvY3RsLAorCS5vcGVuID0gcnRzNTF4X29wZW4sCisJLnJlbGVhc2UgPSBydHM1MXhfcmVsZWFzZSwKK307CisKKy8qCisgKiB1c2IgY2xhc3MgZHJpdmVyIGluZm8gaW4gb3JkZXIgdG8gZ2V0IGEgbWlub3IgbnVtYmVyIGZyb20gdGhlIHVzYiBjb3JlLAorICogYW5kIHRvIGhhdmUgdGhlIGRldmljZSByZWdpc3RlcmVkIHdpdGggdGhlIGRyaXZlciBjb3JlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2NsYXNzX2RyaXZlciBydHM1MXhfY2xhc3MgPSB7CisJLm5hbWUgPSAicnRzNTF4JWQiLAorCS5mb3BzID0gJnJ0czUxeF9mb3BzLAorCS5taW5vcl9iYXNlID0gMTkyLAorfTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BNCQkvKiBNaW5pbWFsIHN1cHBvcnQgZm9yIHN1c3BlbmQgYW5kIHJlc3VtZSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgdXNiX2F1dG9wbV9lbmFibGUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJYXRvbWljX3NldCgmaW50Zi0+cG1fdXNhZ2VfY250LCAxKTsKKwl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoaW50Zik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1c2JfYXV0b3BtX2Rpc2FibGUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJYXRvbWljX3NldCgmaW50Zi0+cG1fdXNhZ2VfY250LCAwKTsKKwl1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UoaW50Zik7Cit9CisKK3ZvaWQgcnRzNTF4X3RyeV90b19lbnRlcl9zcyhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJUlRTNTFYX0RFQlVHUCgiUmVhZHkgdG8gZW50ZXIgU1Mgc3RhdGVcbiIpOworCXVzYl9hdXRvcG1fZW5hYmxlKGNoaXAtPnVzYi0+cHVzYl9pbnRmKTsKK30KKwordm9pZCBydHM1MXhfdHJ5X3RvX2V4aXRfc3Moc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCVJUUzUxWF9ERUJVR1AoIkV4aXQgZnJvbSBTUyBzdGF0ZVxuIik7CisJdXNiX2F1dG9wbV9kaXNhYmxlKGNoaXAtPnVzYi0+cHVzYl9pbnRmKTsKK30KKworaW50IHJ0czUxeF9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCit7CisJc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwID0gdXNiX2dldF9pbnRmZGF0YShpZmFjZSk7CisKKwlSVFM1MVhfREVCVUdQKCIlcywgbWVzc2FnZS5ldmVudCA9IDB4JXhcbiIsIF9fZnVuY19fLCBtZXNzYWdlLmV2ZW50KTsKKworCS8qIFdhaXQgdW50aWwgbm8gY29tbWFuZCBpcyBydW5uaW5nICovCisJbXV0ZXhfbG9jaygmY2hpcC0+dXNiLT5kZXZfbXV0ZXgpOworCisJY2hpcC0+ZmFrZV9jYXJkX3JlYWR5ID0gY2hpcC0+Y2FyZF9yZWFkeTsKKwlydHM1MXhfZG9fYmVmb3JlX3Bvd2VyX2Rvd24oY2hpcCk7CisKKwlpZiAobWVzc2FnZS5ldmVudCA9PSBQTV9FVkVOVF9BVVRPX1NVU1BFTkQpIHsKKwkJUlRTNTFYX0RFQlVHUCgiRW50ZXIgU1Mgc3RhdGUiKTsKKwkJY2hpcC0+cmVzdW1lX2Zyb21fc2NzaSA9IDA7CisJCVJUUzUxWF9TRVRfU1RBVChjaGlwLCBTVEFUX1NTKTsKKwl9IGVsc2UgeworCQlSVFM1MVhfREVCVUdQKCJFbnRlciBTVVNQRU5EIHN0YXRlIik7CisJCVJUUzUxWF9TRVRfU1RBVChjaGlwLCBTVEFUX1NVU1BFTkQpOworCX0KKworCS8qIFdoZW4gcnVudGltZSBQTSBpcyB3b3JraW5nLCB3ZSdsbCBzZXQgYSBmbGFnIHRvIGluZGljYXRlCisJICogd2hldGhlciB3ZSBzaG91bGQgYXV0b3Jlc3VtZSB3aGVuIGEgU0NTSSByZXF1ZXN0IGFycml2ZXMuICovCisKKwltdXRleF91bmxvY2soJmNoaXAtPnVzYi0+ZGV2X211dGV4KTsKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0czUxeF9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlKQoreworCXN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCA9IHVzYl9nZXRfaW50ZmRhdGEoaWZhY2UpOworCisJUlRTNTFYX0RFQlVHUCgiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmICghUlRTNTFYX0NIS19TVEFUKGNoaXAsIFNUQVRfU1MpIHx8ICFjaGlwLT5yZXN1bWVfZnJvbV9zY3NpKSB7CisJCW11dGV4X2xvY2soJmNoaXAtPnVzYi0+ZGV2X211dGV4KTsKKworCQlpZiAoY2hpcC0+b3B0aW9uLnNzX2VuKSB7CisJCQlpZiAoR0VUX1BNX1VTQUdFX0NOVChjaGlwKSA8PSAwKSB7CisJCQkJLyogUmVtb3RlIHdha2UgdXAsIGluY3JlYXNlIHBtX3VzYWdlX2NudCAqLworCQkJCVJUUzUxWF9ERUJVR1AoIkluY3IgcG1fdXNhZ2VfY250XG4iKTsKKwkJCQlTRVRfUE1fVVNBR0VfQ05UKGNoaXAsIDEpOworCQkJfQorCQl9CisKKwkJUlRTNTFYX1NFVF9TVEFUKGNoaXAsIFNUQVRfUlVOKTsKKworCQlydHM1MXhfaW5pdF9jaGlwKGNoaXApOworCQlydHM1MXhfaW5pdF9jYXJkcyhjaGlwKTsKKworCQltdXRleF91bmxvY2soJmNoaXAtPnVzYi0+ZGV2X211dGV4KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHJ0czUxeF9yZXNldF9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlKQoreworCXN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCA9IHVzYl9nZXRfaW50ZmRhdGEoaWZhY2UpOworCisJUlRTNTFYX0RFQlVHUCgiJXNcbiIsIF9fZnVuY19fKTsKKworCW11dGV4X2xvY2soJmNoaXAtPnVzYi0+ZGV2X211dGV4KTsKKworCVJUUzUxWF9TRVRfU1RBVChjaGlwLCBTVEFUX1JVTik7CisKKwlpZiAoY2hpcC0+b3B0aW9uLnNzX2VuKQorCQlTRVRfUE1fVVNBR0VfQ05UKGNoaXAsIDEpOworCisJcnRzNTF4X2luaXRfY2hpcChjaGlwKTsKKwlydHM1MXhfaW5pdF9jYXJkcyhjaGlwKTsKKworCW11dGV4X3VubG9jaygmY2hpcC0+dXNiLT5kZXZfbXV0ZXgpOworCisJLyogRklYTUU6IE5vdGlmeSB0aGUgc3ViZHJpdmVycyB0aGF0IHRoZXkgbmVlZCB0byByZWluaXRpYWxpemUKKwkgKiB0aGUgZGV2aWNlICovCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlIC8qIENPTkZJR19QTSAqLworCit2b2lkIHJ0czUxeF90cnlfdG9fZW50ZXJfc3Moc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworfQorCit2b2lkIHJ0czUxeF90cnlfdG9fZXhpdF9zcyhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworLyoKKyAqIFRoZSBuZXh0IHR3byByb3V0aW5lcyBnZXQgY2FsbGVkIGp1c3QgYmVmb3JlIGFuZCBqdXN0IGFmdGVyCisgKiBhIFVTQiBwb3J0IHJlc2V0LCB3aGV0aGVyIGZyb20gdGhpcyBkcml2ZXIgb3IgYSBkaWZmZXJlbnQgb25lLgorICovCisKK2ludCBydHM1MXhfcHJlX3Jlc2V0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSkKK3sKKwlzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAgPSB1c2JfZ2V0X2ludGZkYXRhKGlmYWNlKTsKKworCVJUUzUxWF9ERUJVR1AoIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBNYWtlIHN1cmUgbm8gY29tbWFuZCBydW5zIGR1cmluZyB0aGUgcmVzZXQgKi8KKwltdXRleF9sb2NrKCZjaGlwLT51c2ItPmRldl9tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBydHM1MXhfcG9zdF9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaWZhY2UpCit7CisJc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwID0gdXNiX2dldF9pbnRmZGF0YShpZmFjZSk7CisKKwlSVFM1MVhfREVCVUdQKCIlc1xuIiwgX19mdW5jX18pOworCisJLyogUmVwb3J0IHRoZSByZXNldCB0byB0aGUgU0NTSSBjb3JlICovCisJLyogdXNiX3N0b3JfcmVwb3J0X2J1c19yZXNldCh1cyk7ICovCisKKwkvKiBGSVhNRTogTm90aWZ5IHRoZSBzdWJkcml2ZXJzIHRoYXQgdGhleSBuZWVkIHRvIHJlaW5pdGlhbGl6ZQorCSAqIHRoZSBkZXZpY2UgKi8KKworCW11dGV4X3VubG9jaygmY2hpcC0+dXNiLT5kZXZfbXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0czUxeF9jb250cm9sX3RocmVhZCh2b2lkICpfX2NoaXApCit7CisJc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwID0gKHN0cnVjdCBydHM1MXhfY2hpcCAqKV9fY2hpcDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcnRzNTF4X3RvX2hvc3QoY2hpcCk7CisKKwlmb3IgKDs7KSB7CisJCWlmICh3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJmNoaXAtPnVzYi0+Y21uZF9yZWFkeSkpCisJCQlicmVhazsKKworCQlpZiAodGVzdF9iaXQoRkxJRFhfRElTQ09OTkVDVElORywgJmNoaXAtPnVzYi0+ZGZsYWdzKSkgeworCQkJUlRTNTFYX0RFQlVHUCgiLS0gZXhpdGluZyBmcm9tIHJ0czUxeC1jb250cm9sXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogbG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzICovCisJCW11dGV4X2xvY2soJihjaGlwLT51c2ItPmRldl9tdXRleCkpOworCisJCS8qIGxvY2sgYWNjZXNzIHRvIHRoZSBzdGF0ZSAqLworCQlzY3NpX2xvY2soaG9zdCk7CisKKwkJLyogV2hlbiB3ZSBhcmUgY2FsbGVkIHdpdGggbm8gY29tbWFuZCBwZW5kaW5nLCB3ZSdyZSBkb25lICovCisJCWlmIChjaGlwLT5zcmIgPT0gTlVMTCkgeworCQkJc2NzaV91bmxvY2soaG9zdCk7CisJCQltdXRleF91bmxvY2soJmNoaXAtPnVzYi0+ZGV2X211dGV4KTsKKwkJCVJUUzUxWF9ERUJVR1AoIi0tIGV4aXRpbmcgZnJvbSBjb250cm9sIHRocmVhZFxuIik7CisJCQlicmVhazsKKwkJfQorCisJCS8qIGhhcyB0aGUgY29tbWFuZCB0aW1lZCBvdXQgKmFscmVhZHkqID8gKi8KKwkJaWYgKHRlc3RfYml0KEZMSURYX1RJTUVEX09VVCwgJmNoaXAtPnVzYi0+ZGZsYWdzKSkgeworCQkJY2hpcC0+c3JiLT5yZXN1bHQgPSBESURfQUJPUlQgPDwgMTY7CisJCQlnb3RvIFNraXBGb3JBYm9ydDsKKwkJfQorCisJCXNjc2lfdW5sb2NrKGhvc3QpOworCisJCS8qIHJlamVjdCB0aGUgY29tbWFuZCBpZiB0aGUgZGlyZWN0aW9uIGluZGljYXRvcgorCQkgKiBpcyBVTktOT1dOCisJCSAqLworCQlpZiAoY2hpcC0+c3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfQklESVJFQ1RJT05BTCkgeworCQkJUlRTNTFYX0RFQlVHUCgiVU5LTk9XTiBkYXRhIGRpcmVjdGlvblxuIik7CisJCQljaGlwLT5zcmItPnJlc3VsdCA9IERJRF9FUlJPUiA8PCAxNjsKKwkJfQorCisJCS8qIHJlamVjdCBpZiB0YXJnZXQgIT0gMCBvciBpZiBMVU4gaXMgaGlnaGVyIHRoYW4KKwkJICogdGhlIG1heGltdW0ga25vd24gTFVOCisJCSAqLworCQllbHNlIGlmIChjaGlwLT5zcmItPmRldmljZS0+aWQpIHsKKwkJCVJUUzUxWF9ERUJVR1AoIkJhZCB0YXJnZXQgbnVtYmVyICglZDolZClcbiIsCisJCQkJICAgICAgIGNoaXAtPnNyYi0+ZGV2aWNlLT5pZCwKKwkJCQkgICAgICAgY2hpcC0+c3JiLT5kZXZpY2UtPmx1bik7CisJCQljaGlwLT5zcmItPnJlc3VsdCA9IERJRF9CQURfVEFSR0VUIDw8IDE2OworCQl9CisKKwkJZWxzZSBpZiAoY2hpcC0+c3JiLT5kZXZpY2UtPmx1biA+IGNoaXAtPm1heF9sdW4pIHsKKwkJCVJUUzUxWF9ERUJVR1AoIkJhZCBMVU4gKCVkOiVkKVxuIiwKKwkJCQkgICAgICAgY2hpcC0+c3JiLT5kZXZpY2UtPmlkLAorCQkJCSAgICAgICBjaGlwLT5zcmItPmRldmljZS0+bHVuKTsKKwkJCWNoaXAtPnNyYi0+cmVzdWx0ID0gRElEX0JBRF9UQVJHRVQgPDwgMTY7CisJCX0KKworCQkvKiB3ZSd2ZSBnb3QgYSBjb21tYW5kLCBsZXQncyBkbyBpdCEgKi8KKwkJZWxzZSB7CisJCQlSVFM1MVhfREVCVUcoc2NzaV9zaG93X2NvbW1hbmQoY2hpcC0+c3JiKSk7CisJCQlydHM1MXhfaW52b2tlX3RyYW5zcG9ydChjaGlwLT5zcmIsIGNoaXApOworCQl9CisKKwkJLyogbG9jayBhY2Nlc3MgdG8gdGhlIHN0YXRlICovCisJCXNjc2lfbG9jayhob3N0KTsKKworCQkvKiBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIGlzIGRvbmUgKi8KKwkJaWYgKGNoaXAtPnNyYi0+cmVzdWx0ICE9IERJRF9BQk9SVCA8PCAxNikKKwkJCWNoaXAtPnNyYi0+c2NzaV9kb25lKGNoaXAtPnNyYik7CisJCWVsc2UKK1NraXBGb3JBYm9ydCA6CisJCQlSVFM1MVhfREVCVUdQKCJzY3NpIGNvbW1hbmQgYWJvcnRlZFxuIik7CisKKwkJLyogSWYgYW4gYWJvcnQgcmVxdWVzdCB3YXMgcmVjZWl2ZWQgd2UgbmVlZCB0byBzaWduYWwgdGhhdAorCQkgKiB0aGUgYWJvcnQgaGFzIGZpbmlzaGVkLiAgVGhlIHByb3BlciB0ZXN0IGZvciB0aGlzIGlzCisJCSAqIHRoZSBUSU1FRF9PVVQgZmxhZywgbm90IHNyYi0+cmVzdWx0ID09IERJRF9BQk9SVCwgYmVjYXVzZQorCQkgKiB0aGUgdGltZW91dCBtaWdodCBoYXZlIG9jY3VycmVkIGFmdGVyIHRoZSBjb21tYW5kIGhhZAorCQkgKiBhbHJlYWR5IGNvbXBsZXRlZCB3aXRoIGEgZGlmZmVyZW50IHJlc3VsdCBjb2RlLiAqLworCQlpZiAodGVzdF9iaXQoRkxJRFhfVElNRURfT1VULCAmY2hpcC0+dXNiLT5kZmxhZ3MpKSB7CisJCQljb21wbGV0ZSgmKGNoaXAtPnVzYi0+bm90aWZ5KSk7CisKKwkJCS8qIEFsbG93IFVTQiB0cmFuc2ZlcnMgdG8gcmVzdW1lICovCisJCQljbGVhcl9iaXQoRkxJRFhfQUJPUlRJTkcsICZjaGlwLT51c2ItPmRmbGFncyk7CisJCQljbGVhcl9iaXQoRkxJRFhfVElNRURfT1VULCAmY2hpcC0+dXNiLT5kZmxhZ3MpOworCQl9CisKKwkJLyogZmluaXNoZWQgd29ya2luZyBvbiB0aGlzIGNvbW1hbmQgKi8KKwkJY2hpcC0+c3JiID0gTlVMTDsKKwkJc2NzaV91bmxvY2soaG9zdCk7CisKKwkJLyogdW5sb2NrIHRoZSBkZXZpY2UgcG9pbnRlcnMgKi8KKwkJbXV0ZXhfdW5sb2NrKCZjaGlwLT51c2ItPmRldl9tdXRleCk7CisJfQkJCS8qIGZvciAoOzspICovCisKKwljb21wbGV0ZSgmY2hpcC0+dXNiLT5jb250cm9sX2V4aXQpOworCisJLyogV2FpdCB1bnRpbCB3ZSBhcmUgdG9sZCB0byBzdG9wICovCisvKglmb3IgKDs7KSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCisJCQlicmVhazsKKwkJc2NoZWR1bGUoKTsKKwl9CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOyovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRzNTF4X3BvbGxpbmdfdGhyZWFkKHZvaWQgKl9fY2hpcCkKK3sKKwlzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAgPSAoc3RydWN0IHJ0czUxeF9jaGlwICopX19jaGlwOworCisjaWZkZWYgU0NTSV9TQ0FOX0RFTEFZCisJLyogV2FpdCB1bnRpbCBTQ1NJIHNjYW4gZmluaXNoZWQgKi8KKwl3YWl0X3RpbWVvdXQoKGRlbGF5X3VzZSArIDUpICogSFopOworI2VuZGlmCisKKwlmb3IgKDs7KSB7CisJCXdhaXRfdGltZW91dChQT0xMSU5HX0lOVEVSVkFMKTsKKworCQkvKiBpZiB0aGUgZGV2aWNlIGhhcyBkaXNjb25uZWN0ZWQsIHdlIGFyZSBmcmVlIHRvIGV4aXQgKi8KKwkJaWYgKHRlc3RfYml0KEZMSURYX0RJU0NPTk5FQ1RJTkcsICZjaGlwLT51c2ItPmRmbGFncykpIHsKKwkJCVJUUzUxWF9ERUJVR1AoIi0tIGV4aXRpbmcgZnJvbSBydHM1MXgtcG9sbGluZ1xuIik7CisJCQlicmVhazsKKwkJfQorCisJCS8qIGlmIHRoZSBkZXZpY2UgaGFzIGRpc2Nvbm5lY3RlZCwgd2UgYXJlIGZyZWUgdG8gZXhpdCAqLworCQkvKiBpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJTdG9wIHBvbGxpbmcgdGhyZWFkIVxuIik7CisJCQlicmVhazsKKwkJfSAqLworCisjaWZkZWYgQ09ORklHX1BNCisJCWlmIChSVFM1MVhfQ0hLX1NUQVQoY2hpcCwgU1RBVF9TUykgfHwKKwkJICAgIFJUUzUxWF9DSEtfU1RBVChjaGlwLCBTVEFUX1NTX1BSRSkgfHwKKwkJICAgIFJUUzUxWF9DSEtfU1RBVChjaGlwLCBTVEFUX1NVU1BFTkQpKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChzc19lbikgeworCQkJaWYgKFJUUzUxWF9DSEtfU1RBVChjaGlwLCBTVEFUX0lETEUpKSB7CisJCQkJaWYgKGNoaXAtPnNzX2NvdW50ZXIgPAorCQkJCSAgICAoc3NfZGVsYXkgKiAxMDAwIC8gUE9MTElOR19JTlRFUlZBTCkpIHsKKwkJCQkJY2hpcC0+c3NfY291bnRlcisrOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIFByZXBhcmUgU1Mgc3RhdGUgKi8KKwkJCQkJUlRTNTFYX1NFVF9TVEFUKGNoaXAsIFNUQVRfU1NfUFJFKTsKKwkJCQkJcnRzNTF4X3RyeV90b19lbnRlcl9zcyhjaGlwKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQljaGlwLT5zc19jb3VudGVyID0gMDsKKwkJCX0KKwkJfQorI2VuZGlmCisKKwkJbXNwcm9fcG9sbGluZ19mb3JtYXRfc3RhdHVzKGNoaXApOworCisJCS8qIGxvY2sgdGhlIGRldmljZSBwb2ludGVycyAqLworCQltdXRleF9sb2NrKCYoY2hpcC0+dXNiLT5kZXZfbXV0ZXgpKTsKKworCQlydHM1MXhfcG9sbGluZ19mdW5jKGNoaXApOworCisJCS8qIHVubG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzICovCisJCW11dGV4X3VubG9jaygmY2hpcC0+dXNiLT5kZXZfbXV0ZXgpOworCX0JCQkvKiBmb3IgKDs7KSAqLworCisJY29tcGxldGUoJmNoaXAtPnVzYi0+cG9sbGluZ19leGl0KTsKKworCS8qIFdhaXQgdW50aWwgd2UgYXJlIHRvbGQgdG8gc3RvcCAqLworCS8qIGZvciAoOzspIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJYnJlYWs7CisJCXNjaGVkdWxlKCk7CisJCX0KKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7ICovCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBTQ1NJX1NDQU5fREVMQVkKKy8qIFRocmVhZCB0byBjYXJyeSBvdXQgZGVsYXllZCBTQ1NJLWRldmljZSBzY2FubmluZyAqLworc3RhdGljIGludCBydHM1MXhfc2Nhbl90aHJlYWQodm9pZCAqX19jaGlwKQoreworCXN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCA9IChzdHJ1Y3QgcnRzNTF4X2NoaXAgKilfX2NoaXA7CisKKwlwcmludGsoS0VSTl9ERUJVRworCSAgICAgICAicnRzNTF4OiBkZXZpY2UgZm91bmQgYXQgJWRcbiIsIGNoaXAtPnVzYi0+cHVzYl9kZXYtPmRldm51bSk7CisKKwlzZXRfZnJlZXphYmxlKCk7CisJLyogV2FpdCBmb3IgdGhlIHRpbWVvdXQgdG8gZXhwaXJlIG9yIGZvciBhIGRpc2Nvbm5lY3QgKi8KKwlpZiAoZGVsYXlfdXNlID4gMCkgeworCQlwcmludGsoS0VSTl9ERUJVRyAicnRzNTF4OiB3YWl0aW5nIGZvciBkZXZpY2UgIgorCQkgICAgICAgInRvIHNldHRsZSBiZWZvcmUgc2Nhbm5pbmdcbiIpOworCQl3YWl0X2V2ZW50X2ZyZWV6YWJsZV90aW1lb3V0KGNoaXAtPnVzYi0+ZGVsYXlfd2FpdCwKKwkJCQkJICAgICB0ZXN0X2JpdChGTElEWF9ET05UX1NDQU4sCisJCQkJCQkgICAgICAmY2hpcC0+dXNiLT5kZmxhZ3MpLAorCQkJCQkgICAgIGRlbGF5X3VzZSAqIEhaKTsKKwl9CisKKwkvKiBJZiB0aGUgZGV2aWNlIGlzIHN0aWxsIGNvbm5lY3RlZCwgcGVyZm9ybSB0aGUgc2Nhbm5pbmcgKi8KKwlpZiAoIXRlc3RfYml0KEZMSURYX0RPTlRfU0NBTiwgJmNoaXAtPnVzYi0+ZGZsYWdzKSkgeworCQlzY3NpX3NjYW5faG9zdChydHM1MXhfdG9faG9zdChjaGlwKSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJydHM1MXg6IGRldmljZSBzY2FuIGNvbXBsZXRlXG4iKTsKKworCQkvKiBTaG91bGQgd2UgdW5iaW5kIGlmIG5vIGRldmljZXMgd2VyZSBkZXRlY3RlZD8gKi8KKwl9CisKKwljb21wbGV0ZV9hbmRfZXhpdCgmY2hpcC0+dXNiLT5zY2FubmluZ19kb25lLCAwKTsKK30KKyNlbmRpZgorCisvKiBBc3NvY2lhdGUgb3VyIHByaXZhdGUgZGF0YSB3aXRoIHRoZSBVU0IgZGV2aWNlICovCitzdGF0aWMgaW50IGFzc29jaWF0ZV9kZXYoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCBzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgcnRzNTF4X3VzYiAqcnRzNTF4ID0gY2hpcC0+dXNiOworI2lmZGVmIFNVUFBPUlRfRklMRV9PUAorCWludCByZXR2YWw7CisjZW5kaWYKKworCS8qIEZpbGwgaW4gdGhlIGRldmljZS1yZWxhdGVkIGZpZWxkcyAqLworCXJ0czUxeC0+cHVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXJ0czUxeC0+cHVzYl9pbnRmID0gaW50ZjsKKwlydHM1MXgtPmlmbnVtID0gaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcjsKKwlSVFM1MVhfREVCVUdQKCJWZW5kb3I6IDB4JTA0eCwgUHJvZHVjdDogMHglMDR4LCBSZXZpc2lvbjogMHglMDR4XG4iLAorCQkgICAgICAgbGUxNl90b19jcHUocnRzNTF4LT5wdXNiX2Rldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCisJCSAgICAgICBsZTE2X3RvX2NwdShydHM1MXgtPnB1c2JfZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCksCisJCSAgICAgICBsZTE2X3RvX2NwdShydHM1MXgtPnB1c2JfZGV2LT5kZXNjcmlwdG9yLmJjZERldmljZSkpOworCVJUUzUxWF9ERUJVR1AoIkludGVyZmFjZSBTdWJjbGFzczogMHglMDJ4LCBQcm90b2NvbDogMHglMDJ4XG4iLAorCQkgICAgICAgaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZVN1YkNsYXNzLAorCQkgICAgICAgaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZVByb3RvY29sKTsKKworCS8qIFN0b3JlIG91ciBwcml2YXRlIGRhdGEgaW4gdGhlIGludGVyZmFjZSAqLworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgY2hpcCk7CisKKyNpZmRlZiBTVVBQT1JUX0ZJTEVfT1AKKwkvKiB3ZSBjYW4gcmVnaXN0ZXIgdGhlIGRldmljZSBub3csIGFzIGl0IGlzIHJlYWR5ICovCisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyX2RldihpbnRmLCAmcnRzNTF4X2NsYXNzKTsKKwlpZiAocmV0dmFsKSB7CisJCS8qIHNvbWV0aGluZyBwcmV2ZW50ZWQgdXMgZnJvbSByZWdpc3RlcmluZyB0aGlzIGRyaXZlciAqLworCQlSVFM1MVhfREVCVUdQKCJOb3QgYWJsZSB0byBnZXQgYSBtaW5vciBmb3IgdGhpcyBkZXZpY2UuIik7CisJCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKyNlbmRpZgorCisJLyogQWxsb2NhdGUgdGhlIGRldmljZS1yZWxhdGVkIERNQS1tYXBwZWQgYnVmZmVycyAqLworCXJ0czUxeC0+Y3IgPSB1c2JfYnVmZmVyX2FsbG9jKHJ0czUxeC0+cHVzYl9kZXYsIHNpemVvZigqcnRzNTF4LT5jciksCisJCQkJICAgICAgR0ZQX0tFUk5FTCwgJnJ0czUxeC0+Y3JfZG1hKTsKKwlpZiAoIXJ0czUxeC0+Y3IpIHsKKwkJUlRTNTFYX0RFQlVHUCgidXNiX2N0cmxyZXF1ZXN0IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcnRzNTF4LT5pb2J1ZiA9IHVzYl9idWZmZXJfYWxsb2MocnRzNTF4LT5wdXNiX2RldiwgUlRTNTFYX0lPQlVGX1NJWkUsCisJCQkJCSBHRlBfS0VSTkVMLCAmcnRzNTF4LT5pb2J1Zl9kbWEpOworCWlmICghcnRzNTF4LT5pb2J1ZikgeworCQlSVFM1MVhfREVCVUdQKCJJL08gYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBydHM1MXhfaW5pdF9vcHRpb25zKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3QgcnRzNTF4X29wdGlvbiAqb3B0aW9uID0gJihjaGlwLT5vcHRpb24pOworCisJb3B0aW9uLT5sZWRfYmxpbmtfc3BlZWQgPSA3OworCW9wdGlvbi0+bXNwcm9fZm9ybWF0dGVyX2VuYWJsZSA9IDE7CisKKwlvcHRpb24tPmZwZ2Ffc2Rfc2RyMTA0X2NsayA9IENMS18xMDA7CisJb3B0aW9uLT5mcGdhX3NkX3NkcjUwX2NsayA9IENMS18xMDA7CisJb3B0aW9uLT5mcGdhX3NkX2RkcjUwX2NsayA9IENMS18xMDA7CisJb3B0aW9uLT5mcGdhX3NkX2hzX2NsayA9IENMS18xMDA7CisJb3B0aW9uLT5mcGdhX21tY181Mm1fY2xrID0gQ0xLXzgwOworCW9wdGlvbi0+ZnBnYV9tc19oZ19jbGsgPSBDTEtfODA7CisJb3B0aW9uLT5mcGdhX21zXzRiaXRfY2xrID0gQ0xLXzgwOworCisJb3B0aW9uLT5hc2ljX3NkX3NkcjEwNF9jbGsgPSA5ODsKKwlvcHRpb24tPmFzaWNfc2Rfc2RyNTBfY2xrID0gOTg7CisJb3B0aW9uLT5hc2ljX3NkX2RkcjUwX2NsayA9IDk4OworCW9wdGlvbi0+YXNpY19zZF9oc19jbGsgPSA5NzsKKwlvcHRpb24tPmFzaWNfbW1jXzUybV9jbGsgPSA5NTsKKwlvcHRpb24tPmFzaWNfbXNfaGdfY2xrID0gMTE2OworCW9wdGlvbi0+YXNpY19tc180Yml0X2NsayA9IDc3OworCisJb3B0aW9uLT5zZF9kZHJfdHhfcGhhc2UgPSAwOworCW9wdGlvbi0+bW1jX2Rkcl90eF9waGFzZSA9IDE7CisKKwlvcHRpb24tPnNkX3NwZWVkX3ByaW9yID0gMDsKKwlvcHRpb24tPnNkX2N0bCA9CisJICAgIFNEX1BVU0hfUE9JTlRfQVVUTyB8IFNEX1NBTVBMRV9QT0lOVF9BVVRPIHwgU1VQUE9SVF9VSFM1MF9NTUM0NDsKKworCW9wdGlvbi0+c3NfZW4gPSBzc19lbjsKKwlvcHRpb24tPnNzX2RlbGF5ID0gc3NfZGVsYXk7CisJb3B0aW9uLT5uZWVkc19yZW1vdGVfd2FrZXVwID0gbmVlZHNfcmVtb3RlX3dha2V1cDsKKworCW9wdGlvbi0+YXV0b19kZWxpbmtfZW4gPSBhdXRvX2RlbGlua19lbjsKKworCW9wdGlvbi0+RlQyX2Zhc3RfbW9kZSA9IDA7CisJb3B0aW9uLT5wd3JfZGVsYXkgPSA4MDA7CisJb3B0aW9uLT54ZF9yd19zdGVwID0gMDsKKwlvcHRpb24tPkQzMzE4X29mZl9kZWxheSA9IDUwOworCW9wdGlvbi0+ZGVsaW5rX2RlbGF5ID0gMTAwOworCW9wdGlvbi0+cnRzNTEyOV9EMzMxOF9vZmZfZW5hYmxlID0gMDsKKwlvcHRpb24tPnNkMjBfcGFkX2RyaXZlID0gMDsKKwlvcHRpb24tPnJlc2V0X29yX3J3X2ZhaWxfc2V0X3BhZF9kcml2ZSA9IDE7CisJb3B0aW9uLT5yY2NfZmFpbF9mbGFnID0gMDsKKwlvcHRpb24tPnJjY19idWdfZml4X2VuID0gMTsKKwlvcHRpb24tPmRlYm91bmNlX251bSA9IDI7CisJb3B0aW9uLT5wb2xsaW5nX3RpbWUgPSAxMDA7CisJb3B0aW9uLT5sZWRfdG9nZ2xlX2ludGVydmFsID0gNjsKKwlvcHRpb24tPnhkX3J3bl9zdGVwID0gMDsKKwlvcHRpb24tPnNkX3NlbmRfc3RhdHVzX2VuID0gMDsKKwlvcHRpb24tPnNkcjUwX3R4X3BoYXNlID0gMHgwMTsKKwlvcHRpb24tPnNkcjUwX3J4X3BoYXNlID0gMHgwNTsKKwlvcHRpb24tPmRkcjUwX3R4X3BoYXNlID0gMHgwOTsKKwlvcHRpb24tPmRkcjUwX3J4X3BoYXNlID0gMHgwNjsKKwlvcHRpb24tPnNkcjUwX3BoYXNlX3NlbCA9IDA7CisJb3B0aW9uLT5zZDMwX3BhZF9kcml2ZSA9IDE7CisJb3B0aW9uLT5tc19lcnJyZWdfZml4ID0gMDsKKwlvcHRpb24tPnJlc2V0X21tY19maXJzdCA9IDA7CisJb3B0aW9uLT5zcGVlZF9tbWMgPSAxOworCW9wdGlvbi0+bGVkX2Fsd2F5c19vbiA9IDA7Cit9CisKKy8qIEdldCB0aGUgcGlwZSBzZXR0aW5ncyAqLworc3RhdGljIGludCBnZXRfcGlwZXMoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBydHM1MXhfdXNiICpydHM1MXggPSBjaGlwLT51c2I7CisJc3RydWN0IHVzYl9ob3N0X2ludGVyZmFjZSAqYWx0c2V0dGluZyA9CisJICAgIHJ0czUxeC0+cHVzYl9pbnRmLT5jdXJfYWx0c2V0dGluZzsKKwlpbnQgaTsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfaW4gPSBOVUxMOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfb3V0ID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX2ludCA9IE5VTEw7CisKKwkvKgorCSAqIEZpbmQgdGhlIGZpcnN0IGVuZHBvaW50IG9mIGVhY2ggdHlwZSB3ZSBuZWVkLgorCSAqIFdlIGFyZSBleHBlY3RpbmcgYSBtaW5pbXVtIG9mIDIgZW5kcG9pbnRzIC0gaW4gYW5kIG91dCAoYnVsaykuCisJICogQW4gb3B0aW9uYWwgaW50ZXJydXB0LWluIGlzIE9LIChuZWNlc3NhcnkgZm9yIENCSSBwcm90b2NvbCkuCisJICogV2Ugd2lsbCBpZ25vcmUgYW55IG90aGVycy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYWx0c2V0dGluZy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyBpKyspIHsKKwkJZXAgPSAmYWx0c2V0dGluZy0+ZW5kcG9pbnRbaV0uZGVzYzsKKworCQlpZiAodXNiX2VuZHBvaW50X3hmZXJfYnVsayhlcCkpIHsKKwkJCWlmICh1c2JfZW5kcG9pbnRfZGlyX2luKGVwKSkgeworCQkJCWlmICghZXBfaW4pCisJCQkJCWVwX2luID0gZXA7CisJCQl9IGVsc2UgeworCQkJCWlmICghZXBfb3V0KQorCQkJCQllcF9vdXQgPSBlcDsKKwkJCX0KKwkJfQorCisJCWVsc2UgaWYgKHVzYl9lbmRwb2ludF9pc19pbnRfaW4oZXApKSB7CisJCQlpZiAoIWVwX2ludCkKKwkJCQllcF9pbnQgPSBlcDsKKwkJfQorCX0KKworCWlmICghZXBfaW4gfHwgIWVwX291dCkgeworCQlSVFM1MVhfREVCVUdQKCJFbmRwb2ludCBzYW5pdHkgY2hlY2sgZmFpbGVkISIKKwkJCQkJIlJlamVjdGluZyBkZXYuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogQ2FsY3VsYXRlIGFuZCBzdG9yZSB0aGUgcGlwZSB2YWx1ZXMgKi8KKwlydHM1MXgtPnNlbmRfY3RybF9waXBlID0gdXNiX3NuZGN0cmxwaXBlKHJ0czUxeC0+cHVzYl9kZXYsIDApOworCXJ0czUxeC0+cmVjdl9jdHJsX3BpcGUgPSB1c2JfcmN2Y3RybHBpcGUocnRzNTF4LT5wdXNiX2RldiwgMCk7CisJcnRzNTF4LT5zZW5kX2J1bGtfcGlwZSA9IHVzYl9zbmRidWxrcGlwZShydHM1MXgtPnB1c2JfZGV2LAorCQkJCQkJIHVzYl9lbmRwb2ludF9udW0oZXBfb3V0KSk7CisJcnRzNTF4LT5yZWN2X2J1bGtfcGlwZSA9IHVzYl9yY3ZidWxrcGlwZShydHM1MXgtPnB1c2JfZGV2LAorCQkJCQkJIHVzYl9lbmRwb2ludF9udW0oZXBfaW4pKTsKKwlpZiAoZXBfaW50KSB7CisJCXJ0czUxeC0+cmVjdl9pbnRyX3BpcGUgPSB1c2JfcmN2aW50cGlwZShydHM1MXgtPnB1c2JfZGV2LAorCQkJCQkJCXVzYl9lbmRwb2ludF9udW0KKwkJCQkJCQkoZXBfaW50KSk7CisJCXJ0czUxeC0+ZXBfYkludGVydmFsID0gZXBfaW50LT5iSW50ZXJ2YWw7CisJfQorCXJldHVybiAwOworfQorCisvKiBJbml0aWFsaXplIGFsbCB0aGUgZHluYW1pYyByZXNvdXJjZXMgd2UgbmVlZCAqLworc3RhdGljIGludCBydHM1MXhfYWNxdWlyZV9yZXNvdXJjZXMoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBydHM1MXhfdXNiICpydHM1MXggPSBjaGlwLT51c2I7CisJaW50IHJldHZhbDsKKworCXJ0czUxeC0+Y3VycmVudF91cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghcnRzNTF4LT5jdXJyZW50X3VyYikgeworCQlSVFM1MVhfREVCVUdQKCJVUkIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlydHM1MXgtPmludHJfdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJ0czUxeC0+aW50cl91cmIpIHsKKwkJUlRTNTFYX0RFQlVHUCgiVVJCIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY2hpcC0+Y21kX2J1ZiA9IGNoaXAtPnJzcF9idWYgPSBydHM1MXgtPmlvYnVmOworCisJcnRzNTF4X2luaXRfb3B0aW9ucyhjaGlwKTsKKworCS8qIEluaXQgcnRzNTF4eCBkZXZpY2UgKi8KKwlyZXR2YWwgPSBydHM1MXhfaW5pdF9jaGlwKGNoaXApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlbGVhc2UgYWxsIG91ciBkeW5hbWljIHJlc291cmNlcyAqLworc3RhdGljIHZvaWQgcnRzNTF4X3JlbGVhc2VfcmVzb3VyY2VzKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlSVFM1MVhfREVCVUdQKCItLSAlc1xuIiwgX19mdW5jX18pOworCisJLyogVGVsbCB0aGUgY29udHJvbCB0aHJlYWQgdG8gZXhpdC4gIFRoZSBTQ1NJIGhvc3QgbXVzdAorCSAqIGFscmVhZHkgaGF2ZSBiZWVuIHJlbW92ZWQgYW5kIHRoZSBESVNDT05ORUNUSU5HIGZsYWcgc2V0CisJICogc28gdGhhdCB3ZSB3b24ndCBhY2NlcHQgYW55IG1vcmUgY29tbWFuZHMuCisJICovCisJUlRTNTFYX0RFQlVHUCgiLS0gc2VuZGluZyBleGl0IGNvbW1hbmQgdG8gdGhyZWFkXG4iKTsKKwljb21wbGV0ZSgmY2hpcC0+dXNiLT5jbW5kX3JlYWR5KTsKKwlpZiAoY2hpcC0+dXNiLT5jdGxfdGhyZWFkKQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjaGlwLT51c2ItPmNvbnRyb2xfZXhpdCk7CisJCS8qIGt0aHJlYWRfc3RvcChjaGlwLT51c2ItPmN0bF90aHJlYWQpOyAqLworCWlmIChjaGlwLT51c2ItPnBvbGxpbmdfdGhyZWFkKQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjaGlwLT51c2ItPnBvbGxpbmdfZXhpdCk7CisKKwkvKiBpZiAoY2hpcC0+dXNiLT5wb2xsaW5nX3RocmVhZCkKKwkJa3RocmVhZF9zdG9wKGNoaXAtPnVzYi0+cG9sbGluZ190aHJlYWQpOyAqLworCisJd2FpdF90aW1lb3V0KDIwMCk7CisKKwkvKiBSZWxlYXNlIHJ0czUxeHggZGV2aWNlIGhlcmUgKi8KKwlydHM1MXhfcmVsZWFzZV9jaGlwKGNoaXApOworCisJdXNiX2ZyZWVfdXJiKGNoaXAtPnVzYi0+Y3VycmVudF91cmIpOworCXVzYl9mcmVlX3VyYihjaGlwLT51c2ItPmludHJfdXJiKTsKK30KKworLyogRGlzc29jaWF0ZSBmcm9tIHRoZSBVU0IgZGV2aWNlICovCitzdGF0aWMgdm9pZCBkaXNzb2NpYXRlX2RldihzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJc3RydWN0IHJ0czUxeF91c2IgKnJ0czUxeCA9IGNoaXAtPnVzYjsKKworCVJUUzUxWF9ERUJVR1AoIi0tICVzXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBGcmVlIHRoZSBkZXZpY2UtcmVsYXRlZCBETUEtbWFwcGVkIGJ1ZmZlcnMgKi8KKwlpZiAocnRzNTF4LT5jcikKKwkJdXNiX2J1ZmZlcl9mcmVlKHJ0czUxeC0+cHVzYl9kZXYsIHNpemVvZigqcnRzNTF4LT5jciksCisJCQkJcnRzNTF4LT5jciwgcnRzNTF4LT5jcl9kbWEpOworCWlmIChydHM1MXgtPmlvYnVmKQorCQl1c2JfYnVmZmVyX2ZyZWUocnRzNTF4LT5wdXNiX2RldiwgUlRTNTFYX0lPQlVGX1NJWkUsCisJCQkJcnRzNTF4LT5pb2J1ZiwgcnRzNTF4LT5pb2J1Zl9kbWEpOworCisJLyogUmVtb3ZlIG91ciBwcml2YXRlIGRhdGEgZnJvbSB0aGUgaW50ZXJmYWNlICovCisJdXNiX3NldF9pbnRmZGF0YShydHM1MXgtPnB1c2JfaW50ZiwgTlVMTCk7CisKKyNpZmRlZiBTVVBQT1JUX0ZJTEVfT1AKKwkvKiBnaXZlIGJhY2sgb3VyIG1pbm9yICovCisJdXNiX2RlcmVnaXN0ZXJfZGV2KHJ0czUxeC0+cHVzYl9pbnRmLCAmcnRzNTF4X2NsYXNzKTsKKyNlbmRpZgorCisJa2ZyZWUocnRzNTF4KTsKKwljaGlwLT51c2IgPSBOVUxMOworfQorCisvKiBGaXJzdCBzdGFnZSBvZiBkaXNjb25uZWN0IHByb2Nlc3Npbmc6IHN0b3AgU0NTSSBzY2FubmluZywKKyAqIHJlbW92ZSB0aGUgaG9zdCwgYW5kIHN0b3AgYWNjZXB0aW5nIG5ldyBjb21tYW5kcworICovCitzdGF0aWMgdm9pZCBxdWllc2NlX2FuZF9yZW1vdmVfaG9zdChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJc3RydWN0IHJ0czUxeF91c2IgKnJ0czUxeCA9IGNoaXAtPnVzYjsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0ID0gcnRzNTF4X3RvX2hvc3QoY2hpcCk7CisKKwkvKiBJZiB0aGUgZGV2aWNlIGlzIHJlYWxseSBnb25lLCBjdXQgc2hvcnQgcmVzZXQgZGVsYXlzICovCisJaWYgKHJ0czUxeC0+cHVzYl9kZXYtPnN0YXRlID09IFVTQl9TVEFURV9OT1RBVFRBQ0hFRCkKKwkJc2V0X2JpdChGTElEWF9ESVNDT05ORUNUSU5HLCAmcnRzNTF4LT5kZmxhZ3MpOworCisjaWZkZWYgU0NTSV9TQ0FOX0RFTEFZCisJLyogUHJldmVudCBTQ1NJLXNjYW5uaW5nIChpZiBpdCBoYXNuJ3Qgc3RhcnRlZCB5ZXQpCisJICogYW5kIHdhaXQgZm9yIHRoZSBTQ1NJLXNjYW5uaW5nIHRocmVhZCB0byBzdG9wLgorCSAqLworCXNldF9iaXQoRkxJRFhfRE9OVF9TQ0FOLCAmcnRzNTF4LT5kZmxhZ3MpOworCXdha2VfdXAoJnJ0czUxeC0+ZGVsYXlfd2FpdCk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmcnRzNTF4LT5zY2FubmluZ19kb25lKTsKKyNlbmRpZgorCisJLyogUmVtb3ZpbmcgdGhlIGhvc3Qgd2lsbCBwZXJmb3JtIGFuIG9yZGVybHkgc2h1dGRvd246IGNhY2hlcworCSAqIHN5bmNocm9uaXplZCwgZGlza3Mgc3B1biBkb3duLCBldGMuCisJICovCisJc2NzaV9yZW1vdmVfaG9zdChob3N0KTsKKworCS8qIFByZXZlbnQgYW55IG5ldyBjb21tYW5kcyBmcm9tIGJlaW5nIGFjY2VwdGVkIGFuZCBjdXQgc2hvcnQKKwkgKiByZXNldCBkZWxheXMuCisJICovCisJc2NzaV9sb2NrKGhvc3QpOworCXNldF9iaXQoRkxJRFhfRElTQ09OTkVDVElORywgJnJ0czUxeC0+ZGZsYWdzKTsKKwlzY3NpX3VubG9jayhob3N0KTsKKyNpZmRlZiBTQ1NJX1NDQU5fREVMQVkKKwl3YWtlX3VwKCZydHM1MXgtPmRlbGF5X3dhaXQpOworI2VuZGlmCit9CisKKy8qIFNlY29uZCBzdGFnZSBvZiBkaXNjb25uZWN0IHByb2Nlc3Npbmc6IGRlYWxsb2NhdGUgYWxsIHJlc291cmNlcyAqLworc3RhdGljIHZvaWQgcmVsZWFzZV9ldmVyeXRoaW5nKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlydHM1MXhfcmVsZWFzZV9yZXNvdXJjZXMoY2hpcCk7CisJZGlzc29jaWF0ZV9kZXYoY2hpcCk7CisKKwkvKiBEcm9wIG91ciByZWZlcmVuY2UgdG8gdGhlIGhvc3Q7IHRoZSBTQ1NJIGNvcmUgd2lsbCBmcmVlIGl0CisJICogKGFuZCAiY2hpcCIgYWxvbmcgd2l0aCBpdCkgd2hlbiB0aGUgcmVmY291bnQgYmVjb21lcyAwLiAqLworCXNjc2lfaG9zdF9wdXQocnRzNTF4X3RvX2hvc3QoY2hpcCkpOworfQorCitzdGF0aWMgaW50IHJ0czUxeF9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0OworCXN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcDsKKwlzdHJ1Y3QgcnRzNTF4X3VzYiAqcnRzNTF4OworCWludCByZXN1bHQ7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0aDsKKworCVJUUzUxWF9ERUJVR1AoIiVzIGRldGVjdGVkXG4iLCBSVFM1MVhfTkFNRSk7CisKKwlydHM1MXggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnRzNTF4X3VzYiksIEdGUF9LRVJORUwpOworCWlmICghcnRzNTF4KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUlRTNTFYX1RJUAorCQkgICAgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBydHM1MXhfdXNiXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyoKKwkgKiBBc2sgdGhlIFNDU0kgbGF5ZXIgdG8gYWxsb2NhdGUgYSBob3N0IHN0cnVjdHVyZSwgd2l0aCBleHRyYQorCSAqIHNwYWNlIGF0IHRoZSBlbmQgZm9yIG91ciBwcml2YXRlIHVzX2RhdGEgc3RydWN0dXJlLgorCSAqLworCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2MoJnJ0czUxeF9ob3N0X3RlbXBsYXRlLCBzaXplb2YoKmNoaXApKTsKKwlpZiAoIWhvc3QpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBSVFM1MVhfVElQCisJCSAgICAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIHRoZSBzY3NpIGhvc3RcbiIpOworCQlrZnJlZShydHM1MXgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKgorCSAqIEFsbG93IDE2LWJ5dGUgQ0RCcyBhbmQgdGh1cyA+IDJUQgorCSAqLworCWhvc3QtPm1heF9jbWRfbGVuID0gMTY7CisJY2hpcCA9IGhvc3RfdG9fcnRzNTF4KGhvc3QpOworCW1lbXNldChjaGlwLCAwLCBzaXplb2Yoc3RydWN0IHJ0czUxeF9jaGlwKSk7CisKKwljaGlwLT52ZW5kb3JfaWQgPSBpZC0+aWRWZW5kb3I7CisJY2hpcC0+cHJvZHVjdF9pZCA9IGlkLT5pZFByb2R1Y3Q7CisKKwltdXRleF9pbml0KCYocnRzNTF4LT5kZXZfbXV0ZXgpKTsKKwlpbml0X2NvbXBsZXRpb24oJnJ0czUxeC0+Y21uZF9yZWFkeSk7CisJaW5pdF9jb21wbGV0aW9uKCZydHM1MXgtPmNvbnRyb2xfZXhpdCk7CisJaW5pdF9jb21wbGV0aW9uKCZydHM1MXgtPnBvbGxpbmdfZXhpdCk7CisJaW5pdF9jb21wbGV0aW9uKCYocnRzNTF4LT5ub3RpZnkpKTsKKyNpZmRlZiBTQ1NJX1NDQU5fREVMQVkKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZydHM1MXgtPmRlbGF5X3dhaXQpOworCWluaXRfY29tcGxldGlvbigmcnRzNTF4LT5zY2FubmluZ19kb25lKTsKKyNlbmRpZgorCisJY2hpcC0+dXNiID0gcnRzNTF4OworCisJLyogQXNzb2NpYXRlIHRoZSB1c19kYXRhIHN0cnVjdHVyZSB3aXRoIHRoZSBVU0IgZGV2aWNlICovCisJcmVzdWx0ID0gYXNzb2NpYXRlX2RldihjaGlwLCBpbnRmKTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIEJhZERldmljZTsKKworCS8qIEZpbmQgdGhlIGVuZHBvaW50cyBhbmQgY2FsY3VsYXRlIHBpcGUgdmFsdWVzICovCisJcmVzdWx0ID0gZ2V0X3BpcGVzKGNoaXApOworCWlmIChyZXN1bHQpCisJCWdvdG8gQmFkRGV2aWNlOworCisJLyogQWNxdWlyZSBhbGwgdGhlIG90aGVyIHJlc291cmNlcyBhbmQgYWRkIHRoZSBob3N0ICovCisJcmVzdWx0ID0gcnRzNTF4X2FjcXVpcmVfcmVzb3VyY2VzKGNoaXApOworCWlmIChyZXN1bHQpCisJCWdvdG8gQmFkRGV2aWNlOworCisJLyogU3RhcnQgdXAgb3VyIGNvbnRyb2wgdGhyZWFkICovCisJdGggPSBrdGhyZWFkX3J1bihydHM1MXhfY29udHJvbF90aHJlYWQsIGNoaXAsIFJUUzUxWF9DVExfVEhSRUFEKTsKKwlpZiAoSVNfRVJSKHRoKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFJUUzUxWF9USVAKKwkJICAgICAgICJVbmFibGUgdG8gc3RhcnQgY29udHJvbCB0aHJlYWRcbiIpOworCQlyZXN1bHQgPSBQVFJfRVJSKHRoKTsKKwkJZ290byBCYWREZXZpY2U7CisJfQorCXJ0czUxeC0+Y3RsX3RocmVhZCA9IHRoOworCisJcmVzdWx0ID0gc2NzaV9hZGRfaG9zdChydHM1MXhfdG9faG9zdChjaGlwKSwgJnJ0czUxeC0+cHVzYl9pbnRmLT5kZXYpOworCWlmIChyZXN1bHQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBSVFM1MVhfVElQICJVbmFibGUgdG8gYWRkIHRoZSBzY3NpIGhvc3RcbiIpOworCQlnb3RvIEJhZERldmljZTsKKwl9CisjaWZkZWYgU0NTSV9TQ0FOX0RFTEFZCisJLyogU3RhcnQgdXAgdGhlIHRocmVhZCBmb3IgZGVsYXllZCBTQ1NJLWRldmljZSBzY2FubmluZyAqLworCXRoID0ga3RocmVhZF9jcmVhdGUocnRzNTF4X3NjYW5fdGhyZWFkLCBjaGlwLCBSVFM1MVhfU0NBTl9USFJFQUQpOworCWlmIChJU19FUlIodGgpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUlRTNTFYX1RJUAorCQkgICAgICAgIlVuYWJsZSB0byBzdGFydCB0aGUgZGV2aWNlLXNjYW5uaW5nIHRocmVhZFxuIik7CisJCWNvbXBsZXRlKCZydHM1MXgtPnNjYW5uaW5nX2RvbmUpOworCQlxdWllc2NlX2FuZF9yZW1vdmVfaG9zdChjaGlwKTsKKwkJcmVzdWx0ID0gUFRSX0VSUih0aCk7CisJCWdvdG8gQmFkRGV2aWNlOworCX0KKworCXdha2VfdXBfcHJvY2Vzcyh0aCk7CisjZWxzZQorCXNjc2lfc2Nhbl9ob3N0KHJ0czUxeF90b19ob3N0KGNoaXApKTsKKyNlbmRpZgorCisJLyogU3RhcnQgdXAgb3VyIHBvbGxpbmcgdGhyZWFkICovCisJdGggPSBrdGhyZWFkX3J1bihydHM1MXhfcG9sbGluZ190aHJlYWQsIGNoaXAsIFJUUzUxWF9QT0xMSU5HX1RIUkVBRCk7CisJaWYgKElTX0VSUih0aCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBSVFM1MVhfVElQCisJCSAgICAgICAiVW5hYmxlIHRvIHN0YXJ0IHBvbGxpbmcgdGhyZWFkXG4iKTsKKwkJcmVzdWx0ID0gUFRSX0VSUih0aCk7CisJCWdvdG8gQmFkRGV2aWNlOworCX0KKwlydHM1MXgtPnBvbGxpbmdfdGhyZWFkID0gdGg7CisKKyNpZmRlZiBDT05GSUdfUE0KKwlpZiAoc3NfZW4pIHsKKwkJcnRzNTF4LT5wdXNiX2ludGYtPm5lZWRzX3JlbW90ZV93YWtldXAgPSBuZWVkc19yZW1vdGVfd2FrZXVwOworCQlTRVRfUE1fVVNBR0VfQ05UKGNoaXAsIDEpOworCQlSVFM1MVhfREVCVUdQKCJwbV91c2FnZV9jbnQgPSAlZFxuIiwgR0VUX1BNX1VTQUdFX0NOVChjaGlwKSk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKKworCS8qIFdlIGNvbWUgaGVyZSBpZiB0aGVyZSBhcmUgYW55IHByb2JsZW1zICovCitCYWREZXZpY2U6CisJUlRTNTFYX0RFQlVHUCgicnRzNTF4X3Byb2JlKCkgZmFpbGVkXG4iKTsKKwlyZWxlYXNlX2V2ZXJ5dGhpbmcoY2hpcCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgcnRzNTF4X2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwID0gKHN0cnVjdCBydHM1MXhfY2hpcCAqKXVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CisKKwlSVFM1MVhfREVCVUdQKCJydHM1MXhfZGlzY29ubmVjdCgpIGNhbGxlZFxuIik7CisJcXVpZXNjZV9hbmRfcmVtb3ZlX2hvc3QoY2hpcCk7CisJcmVsZWFzZV9ldmVyeXRoaW5nKGNoaXApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEluaXRpYWxpemF0aW9uIGFuZCByZWdpc3RyYXRpb24KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IHVzYl9kZXZpY2VfaWQgcnRzNTEzOV91c2JfaWRzW10gPSB7CisJe1VTQl9ERVZJQ0UoMHgwQkRBLCAweDAxMzkpfSwKKwl7VVNCX0RFVklDRSgweDBCREEsIDB4MDEyOSl9LAorCXt9CQkJLyogVGVybWluYXRpbmcgZW50cnkgKi8KK307CitFWFBPUlRfU1lNQk9MX0dQTChydHM1MTM5X3VzYl9pZHMpOworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgcnRzNTEzOV91c2JfaWRzKTsKKworc3RydWN0IHVzYl9kcml2ZXIgcnRzNTF4X2RyaXZlciA9IHsKKwkubmFtZSA9IFJUUzUxWF9OQU1FLAorCS5wcm9iZSA9IHJ0czUxeF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IHJ0czUxeF9kaXNjb25uZWN0LAorCS5zdXNwZW5kID0gcnRzNTF4X3N1c3BlbmQsCisJLnJlc3VtZSA9IHJ0czUxeF9yZXN1bWUsCisJLnJlc2V0X3Jlc3VtZSA9IHJ0czUxeF9yZXNldF9yZXN1bWUsCisJLnByZV9yZXNldCA9IHJ0czUxeF9wcmVfcmVzZXQsCisJLnBvc3RfcmVzZXQgPSBydHM1MXhfcG9zdF9yZXNldCwKKwkuaWRfdGFibGUgPSBydHM1MTM5X3VzYl9pZHMsCisJLnNvZnRfdW5iaW5kID0gMSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHJ0czUxeF9pbml0KHZvaWQpCit7CisJaW50IHJldHZhbDsKKworCXByaW50ayhLRVJOX0lORk8gIkluaXRpYWxpemluZyAlcyBVU0IgY2FyZCByZWFkZXIgZHJpdmVyLi4uXG4iLAorCSAgICAgICBSVFM1MVhfTkFNRSk7CisKKwkvKiByZWdpc3RlciB0aGUgZHJpdmVyLCByZXR1cm4gdXNiX3JlZ2lzdGVyIHJldHVybiBjb2RlIGlmIGVycm9yICovCisJcmV0dmFsID0gdXNiX3JlZ2lzdGVyKCZydHM1MXhfZHJpdmVyKTsKKwlpZiAocmV0dmFsID09IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkgICAgICAgIlJlYWx0ZWsgJXMgVVNCIGNhcmQgcmVhZGVyIHN1cHBvcnQgcmVnaXN0ZXJlZC5cbiIsCisJCSAgICAgICBSVFM1MVhfTkFNRSk7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBydHM1MXhfZXhpdCh2b2lkKQoreworCVJUUzUxWF9ERUJVR1AoInJ0czUxeF9leGl0KCkgY2FsbGVkXG4iKTsKKworCS8qIERlcmVnaXN0ZXIgdGhlIGRyaXZlcgorCSAqIFRoaXMgd2lsbCBjYXVzZSBkaXNjb25uZWN0KCkgdG8gYmUgY2FsbGVkIGZvciBlYWNoCisJICogYXR0YWNoZWQgdW5pdAorCSAqLworCVJUUzUxWF9ERUJVR1AoIi0tIGNhbGxpbmcgdXNiX2RlcmVnaXN0ZXIoKVxuIik7CisJdXNiX2RlcmVnaXN0ZXIoJnJ0czUxeF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChydHM1MXhfaW5pdCk7Cittb2R1bGVfZXhpdChydHM1MXhfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXguaCBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MTVkNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXguaApAQCAtMCwwICsxLDIwNSBAQAorLyogRHJpdmVyIGZvciBSZWFsdGVrIFJUUzUxeHggVVNCIGNhcmQgcmVhZGVyCisgKiBIZWFkZXIgZmlsZQorICoKKyAqIENvcHlyaWdodChjKSAyMDA5IFJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3JwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBBdXRob3I6CisgKiAgIHd3YW5nICh3ZWlfd2FuZ0ByZWFsc2lsLmNvbS5jbikKKyAqICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisgKiBNYWludGFpbmVyOgorICogICBFZHdpbiBSb25nIChlZHdpbl9yb25nQHJlYWxzaWwuY29tLmNuKQorICogICBOby4gNDUwLCBTaGVuaHUgUm9hZCwgU3V6aG91IEluZHVzdHJ5IFBhcmssIFN1emhvdSwgQ2hpbmEKKyAqLworCisjaWZuZGVmIF9fUlRTNTFYX0gKKyNkZWZpbmUgX19SVFM1MVhfSAorCisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiX3VzdWFsLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aW5mby5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JCSJ2MS4wNCIKKworI2RlZmluZSBSVFM1MVhfREVTQwkJIlJlYWx0ZWsgUlRTNTEzOS8yOSBVU0IgY2FyZCByZWFkZXIgZHJpdmVyIgorI2RlZmluZSBSVFM1MVhfTkFNRQkJInJ0czUxMzkiCisjZGVmaW5lIFJUUzUxWF9DVExfVEhSRUFECSJydHM1MTM5LWNvbnRyb2wiCisjZGVmaW5lIFJUUzUxWF9TQ0FOX1RIUkVBRAkicnRzNTEzOS1zY2FuIgorI2RlZmluZSBSVFM1MVhfUE9MTElOR19USFJFQUQJInJ0czUxMzktcG9sbGluZyIKKworI2RlZmluZSBQT0xMSU5HX0lOX1RIUkVBRAorLyogI2RlZmluZSBTQ1NJX1NDQU5fREVMQVkgKi8KKyNkZWZpbmUgU1VQUE9SVF9GSUxFX09QCisKKyNkZWZpbmUgd2FpdF90aW1lb3V0X3godGFza19zdGF0ZSwgbXNlY3MpCVwKK2RvIHsJCQkJCQlcCisJc2V0X2N1cnJlbnRfc3RhdGUoKHRhc2tfc3RhdGUpKTsJXAorCXNjaGVkdWxlX3RpbWVvdXQoKG1zZWNzKSAqIEhaIC8gMTAwMCk7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgd2FpdF90aW1lb3V0KG1zZWNzKQl3YWl0X3RpbWVvdXRfeChUQVNLX0lOVEVSUlVQVElCTEUsIChtc2VjcykpCisKKyNkZWZpbmUgU0NTSV9MVU4oc3JiKQkJKChzcmIpLT5kZXZpY2UtPmx1bikKKworLyogU2l6ZSBvZiB0aGUgRE1BLW1hcHBlZCBJL08gYnVmZmVyICovCisjZGVmaW5lIFJUUzUxWF9JT0JVRl9TSVpFCTEwMjQKKy8qIFNpemUgb2YgdGhlIGF1dG9zZW5zZSBkYXRhIGJ1ZmZlciAqLworI2RlZmluZSBSVFM1MVhfU0VOU0VfU0laRQkxOAorCisvKiBEeW5hbWljIGJpdGZsYWcgZGVmaW5pdGlvbnMgKGRmbGFncyk6IHVzZWQgaW4gc2V0X2JpdCgpIGV0Yy4gKi8KKyNkZWZpbmUgRkxJRFhfVVJCX0FDVElWRQkwCS8qIGN1cnJlbnRfdXJiIGlzIGluIHVzZSAgICAqLworI2RlZmluZSBGTElEWF9TR19BQ1RJVkUJCTEJLyogY3VycmVudF9zZyBpcyBpbiB1c2UgICAgICovCisjZGVmaW5lIEZMSURYX0FCT1JUSU5HCQkyCS8qIGFib3J0IGlzIGluIHByb2dyZXNzICAgICAqLworI2RlZmluZSBGTElEWF9ESVNDT05ORUNUSU5HCTMJLyogZGlzY29ubmVjdCBpbiBwcm9ncmVzcyAgICovCisjZGVmaW5lIEZMSURYX1JFU0VUVElORwkJNAkvKiBkZXZpY2UgcmVzZXQgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgRkxJRFhfVElNRURfT1VUCQk1CS8qIFNDU0kgbWlkbGF5ZXIgdGltZWQgb3V0ICAqLworI2RlZmluZSBGTElEWF9ET05UX1NDQU4JCTYJLyogZG9uJ3Qgc2NhbiAoZGlzY29ubmVjdCkgICovCisKK3N0cnVjdCBydHM1MXhfY2hpcDsKKworc3RydWN0IHJ0czUxeF91c2IgeworCS8qIFRoZSBkZXZpY2Ugd2UncmUgd29ya2luZyB3aXRoCisJICogSXQncyBpbXBvcnRhbnQgdG8gbm90ZToKKwkgKiAgICAobykgeW91IG11c3QgaG9sZCBkZXZfbXV0ZXggdG8gY2hhbmdlIHB1c2JfZGV2CisJICovCisJc3RydWN0IG11dGV4IGRldl9tdXRleDsJLyogcHJvdGVjdCBwdXNiX2RldiAqLworCXN0cnVjdCB1c2JfZGV2aWNlICpwdXNiX2RldjsJLyogdGhpcyB1c2JfZGV2aWNlICovCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKnB1c2JfaW50ZjsJLyogdGhpcyBpbnRlcmZhY2UgKi8KKworCXVuc2lnbmVkIGxvbmcgZGZsYWdzOwkvKiBkeW5hbWljIGF0b21pYyBiaXRmbGFncyAqLworCisJdW5zaWduZWQgaW50IHNlbmRfYnVsa19waXBlOwkvKiBjYWNoZWQgcGlwZSB2YWx1ZXMgKi8KKwl1bnNpZ25lZCBpbnQgcmVjdl9idWxrX3BpcGU7CisJdW5zaWduZWQgaW50IHNlbmRfY3RybF9waXBlOworCXVuc2lnbmVkIGludCByZWN2X2N0cmxfcGlwZTsKKwl1bnNpZ25lZCBpbnQgcmVjdl9pbnRyX3BpcGU7CisKKwl1OCBpZm51bTsJCS8qIGludGVyZmFjZSBudW1iZXIgICAqLworCXU4IGVwX2JJbnRlcnZhbDsJLyogaW50ZXJydXB0IGludGVydmFsICovCisKKwkvKiBjb250cm9sIGFuZCBidWxrIGNvbW11bmljYXRpb25zIGRhdGEgKi8KKwlzdHJ1Y3QgdXJiICpjdXJyZW50X3VyYjsJLyogVVNCIHJlcXVlc3RzICAgICAgICAgKi8KKwlzdHJ1Y3QgdXJiICppbnRyX3VyYjsJLyogSW50ZXJydXB0IFVTQiByZXF1ZXN0ICovCisJc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3I7CS8qIGNvbnRyb2wgcmVxdWVzdHMgICAgICovCisJc3RydWN0IHVzYl9zZ19yZXF1ZXN0IGN1cnJlbnRfc2c7CS8qIHNjYXR0ZXItZ2F0aGVyIHJlcS4gICovCisJdW5zaWduZWQgY2hhciAqaW9idWY7CS8qIEkvTyBidWZmZXIgICAgICAgICAgICovCisJZG1hX2FkZHJfdCBjcl9kbWE7CS8qIGJ1ZmZlciBETUEgYWRkcmVzc2VzICovCisJZG1hX2FkZHJfdCBpb2J1Zl9kbWE7CisJc3RydWN0IHRhc2tfc3RydWN0ICpjdGxfdGhyZWFkOwkvKiB0aGUgY29udHJvbCB0aHJlYWQgICAqLworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcG9sbGluZ190aHJlYWQ7CS8qIHRoZSBwb2xsaW5nIHRocmVhZCAgICovCisKKwkvKiBtdXR1YWwgZXhjbHVzaW9uIGFuZCBzeW5jaHJvbml6YXRpb24gc3RydWN0dXJlcyAqLworCXN0cnVjdCBjb21wbGV0aW9uIGNtbmRfcmVhZHk7CS8qIHRvIHNsZWVwIHRocmVhZCBvbiAgICAgICovCisJc3RydWN0IGNvbXBsZXRpb24gY29udHJvbF9leGl0OwkvKiBjb250cm9sIHRocmVhZCBleGl0ICAgICAqLworCXN0cnVjdCBjb21wbGV0aW9uIHBvbGxpbmdfZXhpdDsJLyogcG9sbGluZyB0aHJlYWQgZXhpdCAgICAgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiBub3RpZnk7CS8qIHRocmVhZCBiZWdpbi9lbmQgICAgICAgICovCisjaWZkZWYgU0NTSV9TQ0FOX0RFTEFZCisJd2FpdF9xdWV1ZV9oZWFkX3QgZGVsYXlfd2FpdDsJLyogd2FpdCBkdXJpbmcgc2NhbiwgcmVzZXQgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbiBzY2FubmluZ19kb25lOwkvKiB3YWl0IGZvciBzY2FuIHRocmVhZCAgICAqLworI2VuZGlmCit9OworCitleHRlcm4gc3RydWN0IHVzYl9kcml2ZXIgcnRzNTF4X2RyaXZlcjsKKworc3RhdGljIGlubGluZSB2b2lkIGdldF9jdXJyZW50X3RpbWUodTggKnRpbWV2YWxfYnVmLCBpbnQgYnVmX2xlbikKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKworCWlmICghdGltZXZhbF9idWYgfHwgKGJ1Zl9sZW4gPCA4KSkKKwkJcmV0dXJuOworCisJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisKKwl0aW1ldmFsX2J1ZlswXSA9ICh1OCkgKHR2LnR2X3NlYyA+PiAyNCk7CisJdGltZXZhbF9idWZbMV0gPSAodTgpICh0di50dl9zZWMgPj4gMTYpOworCXRpbWV2YWxfYnVmWzJdID0gKHU4KSAodHYudHZfc2VjID4+IDgpOworCXRpbWV2YWxfYnVmWzNdID0gKHU4KSAodHYudHZfc2VjKTsKKwl0aW1ldmFsX2J1Zls0XSA9ICh1OCkgKHR2LnR2X3VzZWMgPj4gMjQpOworCXRpbWV2YWxfYnVmWzVdID0gKHU4KSAodHYudHZfdXNlYyA+PiAxNik7CisJdGltZXZhbF9idWZbNl0gPSAodTgpICh0di50dl91c2VjID4+IDgpOworCXRpbWV2YWxfYnVmWzddID0gKHU4KSAodHYudHZfdXNlYyk7Cit9CisKKyNkZWZpbmUgU05EX0NUUkxfUElQRShjaGlwKQkoKGNoaXApLT51c2ItPnNlbmRfY3RybF9waXBlKQorI2RlZmluZSBSQ1ZfQ1RSTF9QSVBFKGNoaXApCSgoY2hpcCktPnVzYi0+cmVjdl9jdHJsX3BpcGUpCisjZGVmaW5lIFNORF9CVUxLX1BJUEUoY2hpcCkJKChjaGlwKS0+dXNiLT5zZW5kX2J1bGtfcGlwZSkKKyNkZWZpbmUgUkNWX0JVTEtfUElQRShjaGlwKQkoKGNoaXApLT51c2ItPnJlY3ZfYnVsa19waXBlKQorI2RlZmluZSBSQ1ZfSU5UUl9QSVBFKGNoaXApCSgoY2hpcCktPnVzYi0+cmVjdl9pbnRyX3BpcGUpCisKKy8qIFRoZSBzY3NpX2xvY2soKSBhbmQgc2NzaV91bmxvY2soKSBtYWNyb3MgcHJvdGVjdCB0aGUgc21fc3RhdGUgYW5kIHRoZQorICogc2luZ2xlIHF1ZXVlIGVsZW1lbnQgc3JiIGZvciB3cml0ZSBhY2Nlc3MgKi8KKyNkZWZpbmUgc2NzaV91bmxvY2soaG9zdCkJc3Bpbl91bmxvY2tfaXJxKGhvc3QtPmhvc3RfbG9jaykKKyNkZWZpbmUgc2NzaV9sb2NrKGhvc3QpCQlzcGluX2xvY2tfaXJxKGhvc3QtPmhvc3RfbG9jaykKKworI2RlZmluZSBHRVRfUE1fVVNBR0VfQ05UKGNoaXApCVwKKwlhdG9taWNfcmVhZCgmKChjaGlwKS0+dXNiLT5wdXNiX2ludGYtPnBtX3VzYWdlX2NudCkpCisjZGVmaW5lIFNFVF9QTV9VU0FHRV9DTlQoY2hpcCwgY250KQlcCisJYXRvbWljX3NldCgmKChjaGlwKS0+dXNiLT5wdXNiX2ludGYtPnBtX3VzYWdlX2NudCksIChjbnQpKQorCisvKiBDb21wYXRpYmxlIG1hY3JvcyB3aGlsZSB3ZSBzd2l0Y2ggb3ZlciAqLworc3RhdGljIGlubGluZSB2b2lkICp1c2JfYnVmZmVyX2FsbG9jKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJCSAgICAgZ2ZwX3QgbWVtX2ZsYWdzLCBkbWFfYWRkcl90ICpkbWEpCit7CisJcmV0dXJuIHVzYl9hbGxvY19jb2hlcmVudChkZXYsIHNpemUsIG1lbV9mbGFncywgZG1hKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVzYl9idWZmZXJfZnJlZShzdHJ1Y3QgdXNiX2RldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCQkgICB2b2lkICphZGRyLCBkbWFfYWRkcl90IGRtYSkKK3sKKwlyZXR1cm4gdXNiX2ZyZWVfY29oZXJlbnQoZGV2LCBzaXplLCBhZGRyLCBkbWEpOworfQorCisvKiBDb252ZXJ0IGJldHdlZW4gdXNfZGF0YSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgU2NzaV9Ib3N0ICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBTY3NpX0hvc3QgKnJ0czUxeF90b19ob3N0KHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKCh2b2lkICopY2hpcCwgc3RydWN0IFNjc2lfSG9zdCwgaG9zdGRhdGEpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBydHM1MXhfY2hpcCAqaG9zdF90b19ydHM1MXgoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBydHM1MXhfY2hpcCAqKShob3N0LT5ob3N0ZGF0YSk7Cit9CisKKy8qIHN0cnVjdCBzY3NpX2NtbmQgdHJhbnNmZXIgYnVmZmVyIGFjY2VzcyB1dGlsaXRpZXMgKi8KK2VudW0geGZlcl9idWZfZGlyIHsgVE9fWEZFUl9CVUYsIEZST01fWEZFUl9CVUYgfTsKKworLyogR2VuZXJhbCByb3V0aW5lcyBwcm92aWRlZCBieSB0aGUgdXNiLXN0b3JhZ2Ugc3RhbmRhcmQgY29yZSAqLworI2lmZGVmIENPTkZJR19QTQordm9pZCBydHM1MXhfdHJ5X3RvX2VudGVyX3NzKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7Cit2b2lkIHJ0czUxeF90cnlfdG9fZXhpdF9zcyhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApOworaW50IHJ0czUxeF9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpOworaW50IHJ0czUxeF9yZXN1bWUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmlmYWNlKTsKK2ludCBydHM1MXhfcmVzZXRfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSk7CisjZWxzZQorI2RlZmluZSBydHM1MXhfc3VzcGVuZAkJTlVMTAorI2RlZmluZSBydHM1MXhfcmVzdW1lCQlOVUxMCisjZGVmaW5lIHJ0czUxeF9yZXNldF9yZXN1bWUJTlVMTAorI2VuZGlmCisKK2V4dGVybiBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHJ0czUxeF9ob3N0X3RlbXBsYXRlOworCisjZW5kaWYgLyogX19SVFM1MVhfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X2NhcmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF9jYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI0YTg0NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF9jYXJkLmMKQEAgLTAsMCArMSw5ODYgQEAKKy8qIERyaXZlciBmb3IgUmVhbHRlayBSVFM1MXh4IFVTQiBjYXJkIHJlYWRlcgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5IFJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3JwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBBdXRob3I6CisgKiAgIHd3YW5nICh3ZWlfd2FuZ0ByZWFsc2lsLmNvbS5jbikKKyAqICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisgKiBNYWludGFpbmVyOgorICogICBFZHdpbiBSb25nIChlZHdpbl9yb25nQHJlYWxzaWwuY29tLmNuKQorICogICBOby4gNDUwLCBTaGVuaHUgUm9hZCwgU3V6aG91IEluZHVzdHJ5IFBhcmssIFN1emhvdSwgQ2hpbmEKKyAqLworCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInJ0czUxeC5oIgorI2luY2x1ZGUgInJ0czUxeF9jaGlwLmgiCisjaW5jbHVkZSAicnRzNTF4X2NhcmQuaCIKKyNpbmNsdWRlICJydHM1MXhfdHJhbnNwb3J0LmgiCisjaW5jbHVkZSAicnRzNTF4X3N5cy5oIgorI2luY2x1ZGUgInhkLmgiCisjaW5jbHVkZSAic2QuaCIKKyNpbmNsdWRlICJtcy5oIgorCit2b2lkIGRvX3JlbWFpbmluZ193b3JrKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CisJc3RydWN0IHhkX2luZm8gKnhkX2NhcmQgPSAmKGNoaXAtPnhkX2NhcmQpOworCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKworCWlmIChjaGlwLT5jYXJkX3JlYWR5ICYgU0RfQ0FSRCkgeworCQlpZiAoc2RfY2FyZC0+c2VxX21vZGUpIHsKKwkJCVJUUzUxWF9TRVRfU1RBVChjaGlwLCBTVEFUX1JVTik7CisJCQlzZF9jYXJkLT5jb3VudGVyKys7CisJCX0gZWxzZSB7CisJCQlzZF9jYXJkLT5jb3VudGVyID0gMDsKKwkJfQorCX0KKworCWlmIChjaGlwLT5jYXJkX3JlYWR5ICYgWERfQ0FSRCkgeworCQlpZiAoeGRfY2FyZC0+ZGVsYXlfd3JpdGUuZGVsYXlfd3JpdGVfZmxhZykgeworCQkJUlRTNTFYX1NFVF9TVEFUKGNoaXAsIFNUQVRfUlVOKTsKKwkJCXhkX2NhcmQtPmNvdW50ZXIrKzsKKwkJfSBlbHNlIHsKKwkJCXhkX2NhcmQtPmNvdW50ZXIgPSAwOworCQl9CisJfQorCisJaWYgKGNoaXAtPmNhcmRfcmVhZHkgJiBNU19DQVJEKSB7CisJCWlmIChDSEtfTVNQUk8obXNfY2FyZCkpIHsKKwkJCWlmIChtc19jYXJkLT5zZXFfbW9kZSkgeworCQkJCVJUUzUxWF9TRVRfU1RBVChjaGlwLCBTVEFUX1JVTik7CisJCQkJbXNfY2FyZC0+Y291bnRlcisrOworCQkJfSBlbHNlIHsKKwkJCQltc19jYXJkLT5jb3VudGVyID0gMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChtc19jYXJkLT5kZWxheV93cml0ZS5kZWxheV93cml0ZV9mbGFnKSB7CisJCQkJUlRTNTFYX1NFVF9TVEFUKGNoaXAsIFNUQVRfUlVOKTsKKwkJCQltc19jYXJkLT5jb3VudGVyKys7CisJCQl9IGVsc2UgeworCQkJCW1zX2NhcmQtPmNvdW50ZXIgPSAwOworCQkJfQorCQl9CisJfQorCisJaWYgKHNkX2NhcmQtPmNvdW50ZXIgPiBQT0xMSU5HX1dBSVRfQ05UKQorCQlzZF9jbGVhbnVwX3dvcmsoY2hpcCk7CisKKwlpZiAoeGRfY2FyZC0+Y291bnRlciA+IFBPTExJTkdfV0FJVF9DTlQpCisJCXhkX2NsZWFudXBfd29yayhjaGlwKTsKKworCWlmIChtc19jYXJkLT5jb3VudGVyID4gUE9MTElOR19XQUlUX0NOVCkKKwkJbXNfY2xlYW51cF93b3JrKGNoaXApOworfQorCit2b2lkIGRvX3Jlc2V0X3hkX2NhcmQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCWludCByZXR2YWw7CisKKwlpZiAoY2hpcC0+Y2FyZDJsdW5bWERfQ0FSRF0gPj0gTUFYX0FMTE9XRURfTFVOX0NOVCkKKwkJcmV0dXJuOworCisJcmV0dmFsID0gcmVzZXRfeGRfY2FyZChjaGlwKTsKKwlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKSB7CisJCWNoaXAtPmNhcmRfcmVhZHkgfD0gWERfQ0FSRDsKKwkJY2hpcC0+Y2FyZF9mYWlsICY9IH5YRF9DQVJEOworCQljaGlwLT5yd19jYXJkW2NoaXAtPmNhcmQybHVuW1hEX0NBUkRdXSA9IHhkX3J3OworCX0gZWxzZSB7CisJCWNoaXAtPmNhcmRfcmVhZHkgJj0gflhEX0NBUkQ7CisJCWNoaXAtPmNhcmRfZmFpbCB8PSBYRF9DQVJEOworCQljaGlwLT5jYXBhY2l0eVtjaGlwLT5jYXJkMmx1bltYRF9DQVJEXV0gPSAwOworCQljaGlwLT5yd19jYXJkW2NoaXAtPmNhcmQybHVuW1hEX0NBUkRdXSA9IE5VTEw7CisKKwkJcnRzNTF4X2luaXRfY21kKGNoaXApOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX09FLCBYRF9PVVRQVVRfRU4sIDApOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BXUl9DVEwsIFBPV0VSX01BU0ssCisJCQkgICAgICAgUE9XRVJfT0ZGKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9DTEtfRU4sIFhEX0NMS19FTiwgMCk7CisJCXJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0MsIDEwMCk7CisJfQorfQorCit2b2lkIGRvX3Jlc2V0X3NkX2NhcmQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCWludCByZXR2YWw7CisKKwlpZiAoY2hpcC0+Y2FyZDJsdW5bU0RfQ0FSRF0gPj0gTUFYX0FMTE9XRURfTFVOX0NOVCkKKwkJcmV0dXJuOworCisJcmV0dmFsID0gcmVzZXRfc2RfY2FyZChjaGlwKTsKKwlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKSB7CisJCWNoaXAtPmNhcmRfcmVhZHkgfD0gU0RfQ0FSRDsKKwkJY2hpcC0+Y2FyZF9mYWlsICY9IH5TRF9DQVJEOworCQljaGlwLT5yd19jYXJkW2NoaXAtPmNhcmQybHVuW1NEX0NBUkRdXSA9IHNkX3J3OworCX0gZWxzZSB7CisJCWNoaXAtPmNhcmRfcmVhZHkgJj0gflNEX0NBUkQ7CisJCWNoaXAtPmNhcmRfZmFpbCB8PSBTRF9DQVJEOworCQljaGlwLT5jYXBhY2l0eVtjaGlwLT5jYXJkMmx1bltTRF9DQVJEXV0gPSAwOworCQljaGlwLT5yd19jYXJkW2NoaXAtPmNhcmQybHVuW1NEX0NBUkRdXSA9IE5VTEw7CisKKwkJcnRzNTF4X2luaXRfY21kKGNoaXApOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX09FLCBTRF9PVVRQVVRfRU4sIDApOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BXUl9DVEwsIFBPV0VSX01BU0ssCisJCQkgICAgICAgUE9XRVJfT0ZGKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9DTEtfRU4sIFNEX0NMS19FTiwgMCk7CisJCXJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0MsIDEwMCk7CisJfQorfQorCit2b2lkIGRvX3Jlc2V0X21zX2NhcmQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCWludCByZXR2YWw7CisKKwlpZiAoY2hpcC0+Y2FyZDJsdW5bTVNfQ0FSRF0gPj0gTUFYX0FMTE9XRURfTFVOX0NOVCkKKwkJcmV0dXJuOworCisJcmV0dmFsID0gcmVzZXRfbXNfY2FyZChjaGlwKTsKKwlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKSB7CisJCWNoaXAtPmNhcmRfcmVhZHkgfD0gTVNfQ0FSRDsKKwkJY2hpcC0+Y2FyZF9mYWlsICY9IH5NU19DQVJEOworCQljaGlwLT5yd19jYXJkW2NoaXAtPmNhcmQybHVuW01TX0NBUkRdXSA9IG1zX3J3OworCX0gZWxzZSB7CisJCWNoaXAtPmNhcmRfcmVhZHkgJj0gfk1TX0NBUkQ7CisJCWNoaXAtPmNhcmRfZmFpbCB8PSBNU19DQVJEOworCQljaGlwLT5jYXBhY2l0eVtjaGlwLT5jYXJkMmx1bltNU19DQVJEXV0gPSAwOworCQljaGlwLT5yd19jYXJkW2NoaXAtPmNhcmQybHVuW01TX0NBUkRdXSA9IE5VTEw7CisKKwkJcnRzNTF4X2luaXRfY21kKGNoaXApOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX09FLCBNU19PVVRQVVRfRU4sIDApOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BXUl9DVEwsIFBPV0VSX01BU0ssCisJCQkgICAgICAgUE9XRVJfT0ZGKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9DTEtfRU4sIE1TX0NMS19FTiwgMCk7CisJCXJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0MsIDEwMCk7CisJfQorfQorCit2b2lkIGNhcmRfY2RfZGVib3VuY2Uoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCAqbmVlZF9yZXNldCwKKwkJICAgICAgdTggKm5lZWRfcmVsZWFzZSkKK3sKKwlpbnQgcmV0dmFsOworCXU4IHJlbGVhc2VfbWFwID0gMCwgcmVzZXRfbWFwID0gMDsKKwl1OCB2YWx1ZTsKKworCXJldHZhbCA9IHJ0czUxeF9nZXRfY2FyZF9zdGF0dXMoY2hpcCwgJihjaGlwLT5jYXJkX3N0YXR1cykpOworI2lmZGVmIFNVUFBPUlRfT0NQCisJY2hpcC0+b2NwX3N0YXQgPSAoY2hpcC0+Y2FyZF9zdGF0dXMgPj4gNCkgJiAweDAzOworI2VuZGlmCisKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlnb3RvIEV4aXRfRGVib3VuY2U7CisKKwlpZiAoY2hpcC0+Y2FyZF9leGlzdCkgeworCQlydHM1MXhfY2xlYXJfc3RhcnRfdGltZShjaGlwKTsKKwkJcmV0dmFsID0gcnRzNTF4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9JTlRfUEVORCwgJnZhbHVlKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzNTF4X2VwMF93cml0ZV9yZWdpc3RlcihjaGlwLCBNQ19GSUZPX0NUTCwgRklGT19GTFVTSCwKKwkJCQkJCSAgRklGT19GTFVTSCk7CisJCQlydHM1MXhfZXAwX3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNGU01fRUQsIDB4ZjgsIDB4ZjgpOworCQkJdmFsdWUgPSAwOworCQl9CisKKwkJaWYgKGNoaXAtPmNhcmRfZXhpc3QgJiBYRF9DQVJEKSB7CisJCQlpZiAoIShjaGlwLT5jYXJkX3N0YXR1cyAmIFhEX0NEKSkKKwkJCQlyZWxlYXNlX21hcCB8PSBYRF9DQVJEOworCQl9IGVsc2UgaWYgKGNoaXAtPmNhcmRfZXhpc3QgJiBTRF9DQVJEKSB7CisJCQkvKiBpZiAoIShjaGlwLT5jYXJkX3N0YXR1cyAmIFNEX0NEKSkgeyAqLworCQkJaWYgKCEoY2hpcC0+Y2FyZF9zdGF0dXMgJiBTRF9DRCkgfHwgKHZhbHVlICYgU0RfSU5UKSkKKwkJCQlyZWxlYXNlX21hcCB8PSBTRF9DQVJEOworCQl9IGVsc2UgaWYgKGNoaXAtPmNhcmRfZXhpc3QgJiBNU19DQVJEKSB7CisJCQkvKiBpZiAoIShjaGlwLT5jYXJkX3N0YXR1cyAmIE1TX0NEKSkgeyAqLworCQkJaWYgKCEoY2hpcC0+Y2FyZF9zdGF0dXMgJiBNU19DRCkgfHwgKHZhbHVlICYgTVNfSU5UKSkKKwkJCQlyZWxlYXNlX21hcCB8PSBNU19DQVJEOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGNoaXAtPmNhcmRfc3RhdHVzICYgWERfQ0QpIHsKKwkJCXJ0czUxeF9jbGVhcl9zdGFydF90aW1lKGNoaXApOworCQkJcmVzZXRfbWFwIHw9IFhEX0NBUkQ7CisJCX0gZWxzZSBpZiAoY2hpcC0+Y2FyZF9zdGF0dXMgJiBTRF9DRCkgeworCQkJcnRzNTF4X2NsZWFyX3N0YXJ0X3RpbWUoY2hpcCk7CisJCQlyZXNldF9tYXAgfD0gU0RfQ0FSRDsKKwkJfSBlbHNlIGlmIChjaGlwLT5jYXJkX3N0YXR1cyAmIE1TX0NEKSB7CisJCQlydHM1MXhfY2xlYXJfc3RhcnRfdGltZShjaGlwKTsKKwkJCXJlc2V0X21hcCB8PSBNU19DQVJEOworCQl9IGVsc2UgeworCQkJaWYgKHJ0czUxeF9jaGVja19zdGFydF90aW1lKGNoaXApKQorCQkJCXJ0czUxeF9zZXRfc3RhcnRfdGltZShjaGlwKTsKKwkJfQorCX0KKworCWlmIChDSEVDS19QS0coY2hpcCwgUUZOMjQpICYmIHJlc2V0X21hcCkgeworCQlpZiAoY2hpcC0+Y2FyZF9leGlzdCAmIFhEX0NBUkQpIHsKKwkJCXJlc2V0X21hcCA9IDA7CisJCQlnb3RvIEV4aXRfRGVib3VuY2U7CisJCX0KKwl9CisKKwlpZiAocmVzZXRfbWFwKSB7CisJCWludCB4ZF9jbnQgPSAwLCBzZF9jbnQgPSAwLCBtc19jbnQgPSAwOworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgKGNoaXAtPm9wdGlvbi5kZWJvdW5jZV9udW0pOyBpKyspIHsKKwkJCXJldHZhbCA9CisJCQkgICAgcnRzNTF4X2dldF9jYXJkX3N0YXR1cyhjaGlwLCAmKGNoaXAtPmNhcmRfc3RhdHVzKSk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcmVzZXRfbWFwID0gcmVsZWFzZV9tYXAgPSAwOworCQkJCWdvdG8gRXhpdF9EZWJvdW5jZTsKKwkJCX0KKwkJCWlmIChjaGlwLT5jYXJkX3N0YXR1cyAmIFhEX0NEKQorCQkJCXhkX2NudCsrOworCQkJZWxzZQorCQkJCXhkX2NudCA9IDA7CisJCQlpZiAoY2hpcC0+Y2FyZF9zdGF0dXMgJiBTRF9DRCkKKwkJCQlzZF9jbnQrKzsKKwkJCWVsc2UKKwkJCQlzZF9jbnQgPSAwOworCQkJaWYgKGNoaXAtPmNhcmRfc3RhdHVzICYgTVNfQ0QpCisJCQkJbXNfY250Kys7CisJCQllbHNlCisJCQkJbXNfY250ID0gMDsKKwkJCXdhaXRfdGltZW91dCgzMCk7CisJCX0KKworCQlyZXNldF9tYXAgPSAwOworCQlpZiAoIShjaGlwLT5jYXJkX2V4aXN0ICYgWERfQ0FSRCkKKwkJICAgICYmICh4ZF9jbnQgPiAoY2hpcC0+b3B0aW9uLmRlYm91bmNlX251bSAtIDEpKSkgeworCQkJcmVzZXRfbWFwIHw9IFhEX0NBUkQ7CisJCX0KKwkJaWYgKCEoY2hpcC0+Y2FyZF9leGlzdCAmIFNEX0NBUkQpCisJCSAgICAmJiAoc2RfY250ID4gKGNoaXAtPm9wdGlvbi5kZWJvdW5jZV9udW0gLSAxKSkpIHsKKwkJCXJlc2V0X21hcCB8PSBTRF9DQVJEOworCQl9CisJCWlmICghKGNoaXAtPmNhcmRfZXhpc3QgJiBNU19DQVJEKQorCQkgICAgJiYgKG1zX2NudCA+IChjaGlwLT5vcHRpb24uZGVib3VuY2VfbnVtIC0gMSkpKSB7CisJCQlyZXNldF9tYXAgfD0gTVNfQ0FSRDsKKwkJfQorCX0KKwlydHM1MXhfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9JTlRfUEVORCwgWERfSU5UIHwgTVNfSU5UIHwgU0RfSU5ULAorCQkJICAgICAgWERfSU5UIHwgTVNfSU5UIHwgU0RfSU5UKTsKKworRXhpdF9EZWJvdW5jZToKKwlpZiAobmVlZF9yZXNldCkKKwkJKm5lZWRfcmVzZXQgPSByZXNldF9tYXA7CisJaWYgKG5lZWRfcmVsZWFzZSkKKwkJKm5lZWRfcmVsZWFzZSA9IHJlbGVhc2VfbWFwOworfQorCit2b2lkIHJ0czUxeF9pbml0X2NhcmRzKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwl1OCBuZWVkX3Jlc2V0ID0gMCwgbmVlZF9yZWxlYXNlID0gMDsKKworCWNhcmRfY2RfZGVib3VuY2UoY2hpcCwgJm5lZWRfcmVzZXQsICZuZWVkX3JlbGVhc2UpOworCisJaWYgKG5lZWRfcmVsZWFzZSkgeworCQlSVFM1MVhfREVCVUdQKCJuZWVkX3JlbGVhc2UgPSAweCV4XG4iLCBuZWVkX3JlbGVhc2UpOworCisJCXJ0czUxeF9wcmVwYXJlX3J1bihjaGlwKTsKKwkJUlRTNTFYX1NFVF9TVEFUKGNoaXAsIFNUQVRfUlVOKTsKKworI2lmZGVmIFNVUFBPUlRfT0NQCisJCWlmIChjaGlwLT5vY3Bfc3RhdCAmIChNU19PQ1BfTk9XIHwgTVNfT0NQX0VWRVIpKSB7CisJCQlydHM1MXhfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgT0NQQ1RMLCBNU19PQ1BfQ0xFQVIsCisJCQkJCSAgICAgIE1TX09DUF9DTEVBUik7CisJCQljaGlwLT5vY3Bfc3RhdCA9IDA7CisJCQlSVFM1MVhfREVCVUdQKCJDbGVhciBPQ1Agc3RhdHVzLlxuIik7CisJCX0KKyNlbmRpZgorCisJCWlmIChuZWVkX3JlbGVhc2UgJiBYRF9DQVJEKSB7CisJCQljaGlwLT5jYXJkX2V4aXN0ICY9IH5YRF9DQVJEOworCQkJY2hpcC0+Y2FyZF9lamVjdGVkID0gMDsKKwkJCWlmIChjaGlwLT5jYXJkX3JlYWR5ICYgWERfQ0FSRCkgeworCQkJCXJlbGVhc2VfeGRfY2FyZChjaGlwKTsKKwkJCQljaGlwLT5yd19jYXJkW2NoaXAtPmNhcmQybHVuW1hEX0NBUkRdXSA9IE5VTEw7CisJCQkJY2xlYXJfYml0KGNoaXAtPmNhcmQybHVuW1hEX0NBUkRdLAorCQkJCQkgICYoY2hpcC0+bHVuX21jKSk7CisJCQl9CisJCX0KKworCQlpZiAobmVlZF9yZWxlYXNlICYgU0RfQ0FSRCkgeworCQkJY2hpcC0+Y2FyZF9leGlzdCAmPSB+U0RfQ0FSRDsKKwkJCWNoaXAtPmNhcmRfZWplY3RlZCA9IDA7CisJCQlpZiAoY2hpcC0+Y2FyZF9yZWFkeSAmIFNEX0NBUkQpIHsKKwkJCQlyZWxlYXNlX3NkX2NhcmQoY2hpcCk7CisJCQkJY2hpcC0+cndfY2FyZFtjaGlwLT5jYXJkMmx1bltTRF9DQVJEXV0gPSBOVUxMOworCQkJCWNsZWFyX2JpdChjaGlwLT5jYXJkMmx1bltTRF9DQVJEXSwKKwkJCQkJICAmKGNoaXAtPmx1bl9tYykpOworCQkJfQorCQl9CisKKwkJaWYgKG5lZWRfcmVsZWFzZSAmIE1TX0NBUkQpIHsKKwkJCWNoaXAtPmNhcmRfZXhpc3QgJj0gfk1TX0NBUkQ7CisJCQljaGlwLT5jYXJkX2VqZWN0ZWQgPSAwOworCQkJaWYgKGNoaXAtPmNhcmRfcmVhZHkgJiBNU19DQVJEKSB7CisJCQkJcmVsZWFzZV9tc19jYXJkKGNoaXApOworCQkJCWNoaXAtPnJ3X2NhcmRbY2hpcC0+Y2FyZDJsdW5bTVNfQ0FSRF1dID0gTlVMTDsKKwkJCQljbGVhcl9iaXQoY2hpcC0+Y2FyZDJsdW5bTVNfQ0FSRF0sCisJCQkJCSAgJihjaGlwLT5sdW5fbWMpKTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChuZWVkX3Jlc2V0ICYmICFjaGlwLT5jYXJkX3JlYWR5KSB7CisJCVJUUzUxWF9ERUJVR1AoIm5lZWRfcmVzZXQgPSAweCV4XG4iLCBuZWVkX3Jlc2V0KTsKKworCQlydHM1MXhfcHJlcGFyZV9ydW4oY2hpcCk7CisJCVJUUzUxWF9TRVRfU1RBVChjaGlwLCBTVEFUX1JVTik7CisKKwkJaWYgKG5lZWRfcmVzZXQgJiBYRF9DQVJEKSB7CisJCQljaGlwLT5jYXJkX2V4aXN0IHw9IFhEX0NBUkQ7CisJCQlkb19yZXNldF94ZF9jYXJkKGNoaXApOworCQl9IGVsc2UgaWYgKG5lZWRfcmVzZXQgJiBTRF9DQVJEKSB7CisJCQljaGlwLT5jYXJkX2V4aXN0IHw9IFNEX0NBUkQ7CisJCQlkb19yZXNldF9zZF9jYXJkKGNoaXApOworCQl9IGVsc2UgaWYgKG5lZWRfcmVzZXQgJiBNU19DQVJEKSB7CisJCQljaGlwLT5jYXJkX2V4aXN0IHw9IE1TX0NBUkQ7CisJCQlkb19yZXNldF9tc19jYXJkKGNoaXApOworCQl9CisJfQorfQorCit2b2lkIHJ0czUxeF9yZWxlYXNlX2NhcmRzKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlpZiAoY2hpcC0+Y2FyZF9yZWFkeSAmIFNEX0NBUkQpIHsKKwkJc2RfY2xlYW51cF93b3JrKGNoaXApOworCQlyZWxlYXNlX3NkX2NhcmQoY2hpcCk7CisJCWNoaXAtPmNhcmRfcmVhZHkgJj0gflNEX0NBUkQ7CisJfQorCisJaWYgKGNoaXAtPmNhcmRfcmVhZHkgJiBYRF9DQVJEKSB7CisJCXhkX2NsZWFudXBfd29yayhjaGlwKTsKKwkJcmVsZWFzZV94ZF9jYXJkKGNoaXApOworCQljaGlwLT5jYXJkX3JlYWR5ICY9IH5YRF9DQVJEOworCX0KKworCWlmIChjaGlwLT5jYXJkX3JlYWR5ICYgTVNfQ0FSRCkgeworCQltc19jbGVhbnVwX3dvcmsoY2hpcCk7CisJCXJlbGVhc2VfbXNfY2FyZChjaGlwKTsKKwkJY2hpcC0+Y2FyZF9yZWFkeSAmPSB+TVNfQ0FSRDsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggZG91YmxlX2RlcHRoKHU4IGRlcHRoKQoreworCXJldHVybiAoKGRlcHRoID4gMSkgPyAoZGVwdGggLSAxKSA6IGRlcHRoKTsKK30KKworaW50IHN3aXRjaF9zc2NfY2xvY2soc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCBpbnQgY2xrKQoreworCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKwlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7CisJaW50IHJldHZhbDsKKwl1OCBOID0gKHU4KSAoY2xrIC0gMiksIG1pbl9OLCBtYXhfTjsKKwl1OCBtY3VfY250LCBkaXYsIG1heF9kaXYsIHNzY19kZXB0aDsKKwlpbnQgc2RfdnBjbGtfcGhhc2VfcmVzZXQgPSAwOworCisJaWYgKGNoaXAtPmN1cl9jbGsgPT0gY2xrKQorCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CisKKwltaW5fTiA9IDYwOworCW1heF9OID0gMTIwOworCW1heF9kaXYgPSBDTEtfRElWXzQ7CisKKwlSVFM1MVhfREVCVUdQKCJTd2l0Y2ggU1NDIGNsb2NrIHRvICVkTUh6XG4iLCBjbGspOworCisJaWYgKChjbGsgPD0gMikgfHwgKE4gPiBtYXhfTikpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwltY3VfY250ID0gKHU4KSAoNjAgLyBjbGsgKyAzKTsKKwlpZiAobWN1X2NudCA+IDE1KQorCQltY3VfY250ID0gMTU7CisJLyogVG8gbWFrZSBzdXJlIHRoYXQgdGhlIFNTQyBjbG9jayBkaXZfbiBpcworCSAqIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiBtaW5fTiAqLworCWRpdiA9IENMS19ESVZfMTsKKwl3aGlsZSAoKE4gPCBtaW5fTikgJiYgKGRpdiA8IG1heF9kaXYpKSB7CisJCU4gPSAoTiArIDIpICogMiAtIDI7CisJCWRpdisrOworCX0KKwlSVFM1MVhfREVCVUdQKCJOID0gJWQsIGRpdiA9ICVkXG4iLCBOLCBkaXYpOworCisJaWYgKGNoaXAtPm9wdGlvbi5zc2NfZW4pIHsKKwkJaWYgKGNoaXAtPmN1cl9jYXJkID09IFNEX0NBUkQpIHsKKwkJCWlmIChDSEtfU0RfU0RSMTA0KHNkX2NhcmQpKSB7CisJCQkJc3NjX2RlcHRoID0gY2hpcC0+b3B0aW9uLnNzY19kZXB0aF9zZF9zZHIxMDQ7CisJCQl9IGVsc2UgaWYgKENIS19TRF9TRFI1MChzZF9jYXJkKSkgeworCQkJCXNzY19kZXB0aCA9IGNoaXAtPm9wdGlvbi5zc2NfZGVwdGhfc2Rfc2RyNTA7CisJCQl9IGVsc2UgaWYgKENIS19TRF9ERFI1MChzZF9jYXJkKSkgeworCQkJCXNzY19kZXB0aCA9CisJCQkJICAgIGRvdWJsZV9kZXB0aChjaGlwLT5vcHRpb24uCisJCQkJCQkgc3NjX2RlcHRoX3NkX2RkcjUwKTsKKwkJCX0gZWxzZSBpZiAoQ0hLX1NEX0hTKHNkX2NhcmQpKSB7CisJCQkJc3NjX2RlcHRoID0KKwkJCQkgICAgZG91YmxlX2RlcHRoKGNoaXAtPm9wdGlvbi5zc2NfZGVwdGhfc2RfaHMpOworCQkJfSBlbHNlIGlmIChDSEtfTU1DXzUyTShzZF9jYXJkKQorCQkJCSAgIHx8IENIS19NTUNfRERSNTIoc2RfY2FyZCkpIHsKKwkJCQlzc2NfZGVwdGggPQorCQkJCSAgICBkb3VibGVfZGVwdGgoY2hpcC0+b3B0aW9uLgorCQkJCQkJIHNzY19kZXB0aF9tbWNfNTJtKTsKKwkJCX0gZWxzZSB7CisJCQkJc3NjX2RlcHRoID0KKwkJCQkgICAgZG91YmxlX2RlcHRoKGNoaXAtPm9wdGlvbi4KKwkJCQkJCSBzc2NfZGVwdGhfbG93X3NwZWVkKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChjaGlwLT5jdXJfY2FyZCA9PSBNU19DQVJEKSB7CisJCQlpZiAoQ0hLX01TUFJPKG1zX2NhcmQpKSB7CisJCQkJaWYgKENIS19IRzhCSVQobXNfY2FyZCkpIHsKKwkJCQkJc3NjX2RlcHRoID0KKwkJCQkJICAgIGRvdWJsZV9kZXB0aChjaGlwLT5vcHRpb24uCisJCQkJCQkJIHNzY19kZXB0aF9tc19oZyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3NjX2RlcHRoID0KKwkJCQkJICAgIGRvdWJsZV9kZXB0aChjaGlwLT5vcHRpb24uCisJCQkJCQkJIHNzY19kZXB0aF9tc180Yml0KTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChDSEtfTVM0QklUKG1zX2NhcmQpKSB7CisJCQkJCXNzY19kZXB0aCA9CisJCQkJCSAgICBkb3VibGVfZGVwdGgoY2hpcC0+b3B0aW9uLgorCQkJCQkJCSBzc2NfZGVwdGhfbXNfNGJpdCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3NjX2RlcHRoID0KKwkJCQkJICAgIGRvdWJsZV9kZXB0aChjaGlwLT5vcHRpb24uCisJCQkJCQkJIHNzY19kZXB0aF9sb3dfc3BlZWQpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNzY19kZXB0aCA9CisJCQkgICAgZG91YmxlX2RlcHRoKGNoaXAtPm9wdGlvbi5zc2NfZGVwdGhfbG93X3NwZWVkKTsKKwkJfQorCisJCWlmIChzc2NfZGVwdGgpIHsKKwkJCWlmIChkaXYgPT0gQ0xLX0RJVl8yKSB7CisJCQkJLyogSWYgY2xvY2sgZGl2aWRlZCBieSAyLCBzc2MgZGVwdGggbXVzdAorCQkJCSAqIGJlIG11bHRpcGxpZWQgYnkgMiAqLworCQkJCWlmIChzc2NfZGVwdGggPiAxKQorCQkJCQlzc2NfZGVwdGggLT0gMTsKKwkJCQllbHNlCisJCQkJCXNzY19kZXB0aCA9IFNTQ19ERVBUSF8yTTsKKwkJCX0gZWxzZSBpZiAoZGl2ID09IENMS19ESVZfNCkgeworCQkJCS8qIElmIGNsb2NrIGRpdmlkZWQgYnkgNCwgc3NjIGRlcHRoIG11c3QKKwkJCQkgKiBiZSBtdWx0aXBsaWVkIGJ5IDQgKi8KKwkJCQlpZiAoc3NjX2RlcHRoID4gMikKKwkJCQkJc3NjX2RlcHRoIC09IDI7CisJCQkJZWxzZQorCQkJCQlzc2NfZGVwdGggPSBTU0NfREVQVEhfMk07CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBEaXNhYmxlIFNTQyAqLworCQlzc2NfZGVwdGggPSAwOworCX0KKworCVJUUzUxWF9ERUJVR1AoInNzY19kZXB0aCA9ICVkXG4iLCBzc2NfZGVwdGgpOworCisJcnRzNTF4X2luaXRfY21kKGNoaXApOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENMS19ESVYsIENMS19DSEFOR0UsIENMS19DSEFOR0UpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENMS19ESVYsIDB4M0YsCisJCSAgICAgICAoZGl2IDw8IDQpIHwgbWN1X2NudCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU1NDX0NUTDEsIFNTQ19SU1RCLCAwKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTU0NfQ1RMMiwgU1NDX0RFUFRIX01BU0ssCisJCSAgICAgICBzc2NfZGVwdGgpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNTQ19ESVZfTl8wLCAweEZGLCBOKTsKKwlpZiAoc2RfdnBjbGtfcGhhc2VfcmVzZXQpIHsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfVlBDTEswX0NUTCwKKwkJCSAgICAgICBQSEFTRV9OT1RfUkVTRVQsIDApOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9WUENMSzBfQ1RMLAorCQkJICAgICAgIFBIQVNFX05PVF9SRVNFVCwgUEhBU0VfTk9UX1JFU0VUKTsKKwl9CisKKwlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DLCAyMDAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwlpZiAoY2hpcC0+b3B0aW9uLnNzY19lbiAmJiBzc2NfZGVwdGgpCisJCXJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTU0NfQ1RMMSwgMHhmZiwgMHhEMCk7CisJZWxzZQorCQlydHM1MXhfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU1NDX0NUTDEsIDB4ZmYsIDB4NTApOworCXVkZWxheSgxMDApOworCVJUUzUxWF9XUklURV9SRUcoY2hpcCwgQ0xLX0RJViwgQ0xLX0NIQU5HRSwgMCk7CisKKwljaGlwLT5jdXJfY2xrID0gY2xrOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitpbnQgc3dpdGNoX25vcm1hbF9jbG9jayhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIGludCBjbGspCit7CisJaW50IHJldHZhbDsKKwl1OCBzZWwsIGRpdiwgbWN1X2NudDsKKwlpbnQgc2RfdnBjbGtfcGhhc2VfcmVzZXQgPSAwOworCisJaWYgKGNoaXAtPmN1cl9jbGsgPT0gY2xrKQorCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CisKKwlpZiAoY2hpcC0+Y3VyX2NhcmQgPT0gU0RfQ0FSRCkgeworCQlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CisJCWlmIChDSEtfU0QzMF9TUEVFRChzZF9jYXJkKSB8fCBDSEtfTU1DX0REUjUyKHNkX2NhcmQpKQorCQkJc2RfdnBjbGtfcGhhc2VfcmVzZXQgPSAxOworCX0KKworCXN3aXRjaCAoY2xrKSB7CisJY2FzZSBDTEtfMjA6CisJCVJUUzUxWF9ERUJVR1AoIlN3aXRjaCBjbG9jayB0byAyME1IelxuIik7CisJCXNlbCA9IFNTQ184MDsKKwkJZGl2ID0gQ0xLX0RJVl80OworCQltY3VfY250ID0gNTsKKwkJYnJlYWs7CisKKwljYXNlIENMS18zMDoKKwkJUlRTNTFYX0RFQlVHUCgiU3dpdGNoIGNsb2NrIHRvIDMwTUh6XG4iKTsKKwkJc2VsID0gU1NDXzYwOworCQlkaXYgPSBDTEtfRElWXzI7CisJCW1jdV9jbnQgPSA0OworCQlicmVhazsKKworCWNhc2UgQ0xLXzQwOgorCQlSVFM1MVhfREVCVUdQKCJTd2l0Y2ggY2xvY2sgdG8gNDBNSHpcbiIpOworCQlzZWwgPSBTU0NfODA7CisJCWRpdiA9IENMS19ESVZfMjsKKwkJbWN1X2NudCA9IDM7CisJCWJyZWFrOworCisJY2FzZSBDTEtfNTA6CisJCVJUUzUxWF9ERUJVR1AoIlN3aXRjaCBjbG9jayB0byA1ME1IelxuIik7CisJCXNlbCA9IFNTQ18xMDA7CisJCWRpdiA9IENMS19ESVZfMjsKKwkJbWN1X2NudCA9IDM7CisJCWJyZWFrOworCisJY2FzZSBDTEtfNjA6CisJCVJUUzUxWF9ERUJVR1AoIlN3aXRjaCBjbG9jayB0byA2ME1IelxuIik7CisJCXNlbCA9IFNTQ182MDsKKwkJZGl2ID0gQ0xLX0RJVl8xOworCQltY3VfY250ID0gMzsKKwkJYnJlYWs7CisKKwljYXNlIENMS184MDoKKwkJUlRTNTFYX0RFQlVHUCgiU3dpdGNoIGNsb2NrIHRvIDgwTUh6XG4iKTsKKwkJc2VsID0gU1NDXzgwOworCQlkaXYgPSBDTEtfRElWXzE7CisJCW1jdV9jbnQgPSAyOworCQlicmVhazsKKworCWNhc2UgQ0xLXzEwMDoKKwkJUlRTNTFYX0RFQlVHUCgiU3dpdGNoIGNsb2NrIHRvIDEwME1IelxuIik7CisJCXNlbCA9IFNTQ18xMDA7CisJCWRpdiA9IENMS19ESVZfMTsKKwkJbWN1X2NudCA9IDI7CisJCWJyZWFrOworCisJLyogY2FzZSBDTEtfMTIwOgorCQlSVFM1MVhfREVCVUdQKCJTd2l0Y2ggY2xvY2sgdG8gMTIwTUh6XG4iKTsKKwkJc2VsID0gU1NDXzEyMDsKKwkJZGl2ID0gQ0xLX0RJVl8xOworCQltY3VfY250ID0gMjsKKwkJYnJlYWs7CisKKwljYXNlIENMS18xNTA6CisJCVJUUzUxWF9ERUJVR1AoIlN3aXRjaCBjbG9jayB0byAxNTBNSHpcbiIpOworCQlzZWwgPSBTU0NfMTUwOworCQlkaXYgPSBDTEtfRElWXzE7CisJCW1jdV9jbnQgPSAyOworCQlicmVhazsgKi8KKworCWRlZmF1bHQ6CisJCVJUUzUxWF9ERUJVR1AoIlRyeSB0byBzd2l0Y2ggdG8gYW4gaWxsZWdhbCBjbG9jayAoJWQpXG4iLAorCQkJICAgICAgIGNsayk7CisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJfQorCisJaWYgKCFzZF92cGNsa19waGFzZV9yZXNldCkgeworCQlydHM1MXhfaW5pdF9jbWQoY2hpcCk7CisKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0xLX0RJViwgQ0xLX0NIQU5HRSwKKwkJCSAgICAgICBDTEtfQ0hBTkdFKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0xLX0RJViwgMHgzRiwKKwkJCSAgICAgICAoZGl2IDw8IDQpIHwgbWN1X2NudCk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNTQ19DTEtfRlBHQV9TRUwsIDB4RkYsCisJCQkgICAgICAgc2VsKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0xLX0RJViwgQ0xLX0NIQU5HRSwgMCk7CisKKwkJcmV0dmFsID0gcnRzNTF4X3NlbmRfY21kKGNoaXAsIE1PREVfQywgMTAwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0gZWxzZSB7CisJCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDTEtfRElWLCBDTEtfQ0hBTkdFLAorCQkJICAgICAgIENMS19DSEFOR0UpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9WUENMSzBfQ1RMLAorCQkJICAgICAgIFBIQVNFX05PVF9SRVNFVCwgMCk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX1ZQQ0xLMV9DVEwsCisJCQkgICAgICAgUEhBU0VfTk9UX1JFU0VULCAwKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0xLX0RJViwgMHgzRiwKKwkJCSAgICAgICAoZGl2IDw8IDQpIHwgbWN1X2NudCk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNTQ19DTEtfRlBHQV9TRUwsIDB4RkYsCisJCQkgICAgICAgc2VsKTsKKworCQlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DLCAxMDApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwkJdWRlbGF5KDIwMCk7CisKKwkJcnRzNTF4X2luaXRfY21kKGNoaXApOworCisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX1ZQQ0xLMF9DVEwsCisJCQkgICAgICAgUEhBU0VfTk9UX1JFU0VULCBQSEFTRV9OT1RfUkVTRVQpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9WUENMSzFfQ1RMLAorCQkJICAgICAgIFBIQVNFX05PVF9SRVNFVCwgUEhBU0VfTk9UX1JFU0VUKTsKKworCQlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DLCAxMDApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwkJdWRlbGF5KDIwMCk7CisKKwkJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBDTEtfRElWLCBDTEtfQ0hBTkdFLCAwKTsKKwl9CisKKwljaGlwLT5jdXJfY2xrID0gY2xrOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitpbnQgY2FyZF9ydyhzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTMyIHNlY19hZGRyLAorCSAgICB1MTYgc2VjX2NudCkKK3sKKwlpbnQgcmV0dmFsOworCXVuc2lnbmVkIGludCBsdW4gPSBTQ1NJX0xVTihzcmIpOworCWludCBpOworCisJaWYgKGNoaXAtPnJ3X2NhcmRbbHVuXSA9PSBOVUxMKQorCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisKKwlSVFM1MVhfREVCVUdQKCIlcyBjYXJkLCBzZWN0b3IgYWRkcjogMHgleCwgc2VjdG9yIGNudDogJWRcbiIsCisJCSAgICAgICAoc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PQorCQkJRE1BX1RPX0RFVklDRSkgPyAiV3JpdGUiIDogIlJlYWQiLCBzZWNfYWRkciwgc2VjX2NudCk7CisKKwljaGlwLT5yd19uZWVkX3JldHJ5ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXJldHZhbCA9IGNoaXAtPnJ3X2NhcmRbbHVuXSAoc3JiLCBjaGlwLCBzZWNfYWRkciwgc2VjX2NudCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCUNBVENIX1RSSUdHRVIoY2hpcCk7CisJCQlpZiAoY2hpcC0+b3B0aW9uLnJlc2V0X29yX3J3X2ZhaWxfc2V0X3BhZF9kcml2ZSkgeworCQkJCXJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0RSSVZFX1NFTCwKKwkJCQkJCSAgICAgIFNEMjBfRFJJVkVfTUFTSywKKwkJCQkJCSAgICAgIERSSVZFXzhtQSk7CisJCQl9CisJCX0KKworCQlpZiAoIWNoaXAtPnJ3X25lZWRfcmV0cnkpCisJCQlicmVhazsKKworCQlSVFM1MVhfREVCVUdQKCJSZXRyeSBSVywgKGkgPSAlZFxuKSIsIGkpOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKK3U4IGdldF9sdW5fY2FyZChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBsdW4pCit7CisJaWYgKChjaGlwLT5jYXJkX3JlYWR5ICYgY2hpcC0+bHVuMmNhcmRbbHVuXSkgPT0gWERfQ0FSRCkKKwkJcmV0dXJuICh1OCkgWERfQ0FSRDsKKwllbHNlIGlmICgoY2hpcC0+Y2FyZF9yZWFkeSAmIGNoaXAtPmx1bjJjYXJkW2x1bl0pID09IFNEX0NBUkQpCisJCXJldHVybiAodTgpIFNEX0NBUkQ7CisJZWxzZSBpZiAoKGNoaXAtPmNhcmRfcmVhZHkgJiBjaGlwLT5sdW4yY2FyZFtsdW5dKSA9PSBNU19DQVJEKQorCQlyZXR1cm4gKHU4KSBNU19DQVJEOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjYXJkX3NoYXJlX21vZGUoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCBpbnQgY2FyZCkKK3sKKwl1OCB2YWx1ZTsKKworCWlmIChjYXJkID09IFNEX0NBUkQpCisJCXZhbHVlID0gQ0FSRF9TSEFSRV9TRDsKKwllbHNlIGlmIChjYXJkID09IE1TX0NBUkQpCisJCXZhbHVlID0gQ0FSRF9TSEFSRV9NUzsKKwllbHNlIGlmIChjYXJkID09IFhEX0NBUkQpCisJCXZhbHVlID0gQ0FSRF9TSEFSRV9YRDsKKwllbHNlCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwlSVFM1MVhfV1JJVEVfUkVHKGNoaXAsIENBUkRfU0hBUkVfTU9ERSwgQ0FSRF9TSEFSRV9NQVNLLCB2YWx1ZSk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2ludCBydHM1MXhfc2VsZWN0X2NhcmQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCBpbnQgY2FyZCkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKGNoaXAtPmN1cl9jYXJkICE9IGNhcmQpIHsKKwkJdTggbW9kOworCisJCWlmIChjYXJkID09IFNEX0NBUkQpCisJCQltb2QgPSBTRF9NT0RfU0VMOworCQllbHNlIGlmIChjYXJkID09IE1TX0NBUkQpCisJCQltb2QgPSBNU19NT0RfU0VMOworCQllbHNlIGlmIChjYXJkID09IFhEX0NBUkQpCisJCQltb2QgPSBYRF9NT0RfU0VMOworCQllbHNlCisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlSVFM1MVhfV1JJVEVfUkVHKGNoaXAsIENBUkRfU0VMRUNULCAweDA3LCBtb2QpOworCQljaGlwLT5jdXJfY2FyZCA9IGNhcmQ7CisKKwkJcmV0dmFsID0gY2FyZF9zaGFyZV9tb2RlKGNoaXAsIGNhcmQpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJfQorCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCit2b2lkIGVqZWN0X2NhcmQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgbHVuKQoreworCVJUUzUxWF9ERUJVR1AoImVqZWN0IGNhcmRcbiIpOworCVJUUzUxWF9TRVRfU1RBVChjaGlwLCBTVEFUX1JVTik7CisJZG9fcmVtYWluaW5nX3dvcmsoY2hpcCk7CisKKwlpZiAoKGNoaXAtPmNhcmRfcmVhZHkgJiBjaGlwLT5sdW4yY2FyZFtsdW5dKSA9PSBTRF9DQVJEKSB7CisJCXJlbGVhc2Vfc2RfY2FyZChjaGlwKTsKKwkJY2hpcC0+Y2FyZF9lamVjdGVkIHw9IFNEX0NBUkQ7CisJCWNoaXAtPmNhcmRfcmVhZHkgJj0gflNEX0NBUkQ7CisJCWNoaXAtPmNhcGFjaXR5W2x1bl0gPSAwOworCX0gZWxzZSBpZiAoKGNoaXAtPmNhcmRfcmVhZHkgJiBjaGlwLT5sdW4yY2FyZFtsdW5dKSA9PSBYRF9DQVJEKSB7CisJCXJlbGVhc2VfeGRfY2FyZChjaGlwKTsKKwkJY2hpcC0+Y2FyZF9lamVjdGVkIHw9IFhEX0NBUkQ7CisJCWNoaXAtPmNhcmRfcmVhZHkgJj0gflhEX0NBUkQ7CisJCWNoaXAtPmNhcGFjaXR5W2x1bl0gPSAwOworCX0gZWxzZSBpZiAoKGNoaXAtPmNhcmRfcmVhZHkgJiBjaGlwLT5sdW4yY2FyZFtsdW5dKSA9PSBNU19DQVJEKSB7CisJCXJlbGVhc2VfbXNfY2FyZChjaGlwKTsKKwkJY2hpcC0+Y2FyZF9lamVjdGVkIHw9IE1TX0NBUkQ7CisJCWNoaXAtPmNhcmRfcmVhZHkgJj0gfk1TX0NBUkQ7CisJCWNoaXAtPmNhcGFjaXR5W2x1bl0gPSAwOworCX0KKwlydHM1MXhfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9JTlRfUEVORCwgWERfSU5UIHwgTVNfSU5UIHwgU0RfSU5ULAorCQkJICAgICAgWERfSU5UIHwgTVNfSU5UIHwgU0RfSU5UKTsKK30KKwordm9pZCB0cmFuc19kbWFfZW5hYmxlKGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLAorCQkgICAgICB1MzIgYnl0ZV9jbnQsIHU4IHBhY2tfc2l6ZSkKK3sKKwlpZiAocGFja19zaXplID4gRE1BXzEwMjQpCisJCXBhY2tfc2l6ZSA9IERNQV81MTI7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX0RBVEFfU09VUkNFLCAweDAxLAorCQkgICAgICAgUklOR19CVUZGRVIpOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTUNfRE1BX1RDMywgMHhGRiwKKwkJICAgICAgICh1OCkgKGJ5dGVfY250ID4+IDI0KSk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTUNfRE1BX1RDMiwgMHhGRiwKKwkJICAgICAgICh1OCkgKGJ5dGVfY250ID4+IDE2KSk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTUNfRE1BX1RDMSwgMHhGRiwKKwkJICAgICAgICh1OCkgKGJ5dGVfY250ID4+IDgpKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBNQ19ETUFfVEMwLCAweEZGLCAodTgpIGJ5dGVfY250KTsKKworCWlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFKSB7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIE1DX0RNQV9DVEwsCisJCQkgICAgICAgMHgwMyB8IERNQV9QQUNLX1NJWkVfTUFTSywKKwkJCSAgICAgICBETUFfRElSX0ZST01fQ0FSRCB8IERNQV9FTiB8IHBhY2tfc2l6ZSk7CisJfSBlbHNlIHsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgTUNfRE1BX0NUTCwKKwkJCSAgICAgICAweDAzIHwgRE1BX1BBQ0tfU0laRV9NQVNLLAorCQkJICAgICAgIERNQV9ESVJfVE9fQ0FSRCB8IERNQV9FTiB8IHBhY2tfc2l6ZSk7CisJfQorfQorCitpbnQgZW5hYmxlX2NhcmRfY2xvY2soc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCBjYXJkKQoreworCXU4IGNsa19lbiA9IDA7CisKKwlpZiAoY2FyZCAmIFhEX0NBUkQpCisJCWNsa19lbiB8PSBYRF9DTEtfRU47CisJaWYgKGNhcmQgJiBTRF9DQVJEKQorCQljbGtfZW4gfD0gU0RfQ0xLX0VOOworCWlmIChjYXJkICYgTVNfQ0FSRCkKKwkJY2xrX2VuIHw9IE1TX0NMS19FTjsKKworCVJUUzUxWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9DTEtfRU4sIGNsa19lbiwgY2xrX2VuKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworaW50IGRpc2FibGVfY2FyZF9jbG9jayhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IGNhcmQpCit7CisJdTggY2xrX2VuID0gMDsKKworCWlmIChjYXJkICYgWERfQ0FSRCkKKwkJY2xrX2VuIHw9IFhEX0NMS19FTjsKKwlpZiAoY2FyZCAmIFNEX0NBUkQpCisJCWNsa19lbiB8PSBTRF9DTEtfRU47CisJaWYgKGNhcmQgJiBNU19DQVJEKQorCQljbGtfZW4gfD0gTVNfQ0xLX0VOOworCisJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX0NMS19FTiwgY2xrX2VuLCAwKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworaW50IGNhcmRfcG93ZXJfb24oc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCBjYXJkKQoreworCXU4IG1hc2ssIHZhbDEsIHZhbDI7CisKKwltYXNrID0gUE9XRVJfTUFTSzsKKwl2YWwxID0gUEFSVElBTF9QT1dFUl9PTjsKKwl2YWwyID0gUE9XRVJfT047CisKKyNpZmRlZiBTRF9YRF9JT19GT0xMT1dfUFdSCisJaWYgKChjYXJkID09IFNEX0NBUkQpIHx8IChjYXJkID09IFhEX0NBUkQpKSB7CisJCVJUUzUxWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QV1JfQ1RMLCBtYXNrIHwgTERPMzMxOF9QV1JfTUFTSywKKwkJCQkgdmFsMSB8IExET19TVVNQRU5EKTsKKwkJLyogUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BXUl9DVEwsCisJCQkJTERPMzMxOF9QV1JfTUFTSywgTERPX1NVU1BFTkQpOyAqLworCX0KKwkvKiBlbHNlIGlmKGNhcmQ9PVhEX0NBUkQpCisJeworCQlSVFM1MVhfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFdSX0NUTCwKKwkJCW1hc2t8TERPMzMxOF9QV1JfTUFTSywgdmFsMXxMRE9fU1VTUEVORCk7CisJCS8vUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BXUl9DVEwsCisJCS8vCUxETzMzMThfUFdSX01BU0ssIExET19TVVNQRU5EKTsKKwl9ICovCisJZWxzZSB7CisjZW5kaWYKKwkJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BXUl9DVEwsIG1hc2ssIHZhbDEpOworI2lmZGVmIFNEX1hEX0lPX0ZPTExPV19QV1IKKwl9CisjZW5kaWYKKwl1ZGVsYXkoY2hpcC0+b3B0aW9uLnB3cl9kZWxheSk7CisJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BXUl9DVEwsIG1hc2ssIHZhbDIpOworI2lmZGVmIFNEX1hEX0lPX0ZPTExPV19QV1IKKwlpZiAoY2FyZCA9PSBTRF9DQVJEKSB7CisJCXJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BXUl9DVEwsIExETzMzMThfUFdSX01BU0ssCisJCQkJICAgICAgTERPX09OKTsKKwl9CisjZW5kaWYKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworaW50IGNhcmRfcG93ZXJfb2ZmKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggY2FyZCkKK3sKKwl1OCBtYXNrLCB2YWw7CisKKwltYXNrID0gUE9XRVJfTUFTSzsKKwl2YWwgPSBQT1dFUl9PRkY7CisJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BXUl9DVEwsIG1hc2ssIHZhbCk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2ludCBtb25pdG9yX2NhcmRfY2Qoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCBjYXJkKQoreworCWludCByZXR2YWw7CisJdTggY2FyZF9jZFszMl0gPSB7IDAgfTsKKworCWNhcmRfY2RbU0RfQ0FSRF0gPSBTRF9DRDsKKwljYXJkX2NkW1hEX0NBUkRdID0gWERfQ0Q7CisJY2FyZF9jZFtNU19DQVJEXSA9IE1TX0NEOworCisJcmV0dmFsID0gcnRzNTF4X2dldF9jYXJkX3N0YXR1cyhjaGlwLCAmKGNoaXAtPmNhcmRfc3RhdHVzKSk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJcmV0dXJuIENEX05PVF9FWElTVDsKKworCWlmIChjaGlwLT5jYXJkX3N0YXR1cyAmIGNhcmRfY2RbY2FyZF0pCisJCXJldHVybiBDRF9FWElTVDsKKworCXJldHVybiBDRF9OT1RfRVhJU1Q7Cit9CisKK2ludCB0b2dnbGVfZ3BpbyhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IGdwaW8pCit7CisJaW50IHJldHZhbDsKKwl1OCB0ZW1wX3JlZzsKKwl1OCBncGlvX291dHB1dFs0XSA9IHsKKwkJMHgwMSwKKwl9OworCXU4IGdwaW9fb2VbNF0gPSB7CisJCTB4MDIsCisJfTsKKwlpZiAoY2hpcC0+cnRzNTE3OSkgeworCQlyZXR2YWwgPSBydHM1MXhfZXAwX3JlYWRfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9HUElPLCAmdGVtcF9yZWcpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJdGVtcF9yZWcgXj0gZ3Bpb19vZVtncGlvXTsKKwkJdGVtcF9yZWcgJj0gMHhmZTsgLyogYml0IDAgYWx3YXlzIHNldCAwICovCisJCXJldHZhbCA9CisJCSAgICBydHM1MXhfZXAwX3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfR1BJTywgMHgwMywgdGVtcF9yZWcpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwl9IGVsc2UgeworCQlyZXR2YWwgPSBydHM1MXhfZXAwX3JlYWRfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9HUElPLCAmdGVtcF9yZWcpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJdGVtcF9yZWcgXj0gZ3Bpb19vdXRwdXRbZ3Bpb107CisJCXJldHZhbCA9CisJCSAgICBydHM1MXhfZXAwX3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfR1BJTywgMHhGRiwKKwkJCQkJICAgICAgdGVtcF9yZWcgfCBncGlvX29lW2dwaW9dKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJfQorCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitpbnQgdHVybl9vbl9sZWQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCBncGlvKQoreworCWludCByZXR2YWw7CisJdTggZ3Bpb19vZVs0XSA9IHsKKwkJMHgwMiwKKwl9OworCXU4IGdwaW9fbWFza1s0XSA9IHsKKwkJMHgwMywKKwl9OworCisJcmV0dmFsID0KKwkgICAgcnRzNTF4X2VwMF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0dQSU8sIGdwaW9fbWFza1tncGlvXSwKKwkJCQkgICAgICBncGlvX29lW2dwaW9dKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitpbnQgdHVybl9vZmZfbGVkKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggZ3BpbykKK3sKKwlpbnQgcmV0dmFsOworCXU4IGdwaW9fb3V0cHV0WzRdID0geworCQkweDAxLAorCX07CisJdTggZ3Bpb19vZVs0XSA9IHsKKwkJMHgwMiwKKwl9OworCXU4IGdwaW9fbWFza1s0XSA9IHsKKwkJMHgwMywKKwl9OworCisJcmV0dmFsID0KKwkgICAgcnRzNTF4X2VwMF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0dQSU8sIGdwaW9fbWFza1tncGlvXSwKKwkJCQkgICAgICBncGlvX29lW2dwaW9dIHwgZ3Bpb19vdXRwdXRbZ3Bpb10pOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfY2FyZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X2NhcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzNjMWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X2NhcmQuaApAQCAtMCwwICsxLDg4MSBAQAorLyogRHJpdmVyIGZvciBSZWFsdGVrIFJUUzUxeHggVVNCIGNhcmQgcmVhZGVyCisgKiBIZWFkZXIgZmlsZQorICoKKyAqIENvcHlyaWdodChjKSAyMDA5IFJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3JwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBBdXRob3I6CisgKiAgIHd3YW5nICh3ZWlfd2FuZ0ByZWFsc2lsLmNvbS5jbikKKyAqICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisgKiBNYWludGFpbmVyOgorICogICBFZHdpbiBSb25nIChlZHdpbl9yb25nQHJlYWxzaWwuY29tLmNuKQorICogICBOby4gNDUwLCBTaGVuaHUgUm9hZCwgU3V6aG91IEluZHVzdHJ5IFBhcmssIFN1emhvdSwgQ2hpbmEKKyAqLworCisjaWZuZGVmIF9fUlRTNTFYX0NBUkRfSAorI2RlZmluZSBfX1JUUzUxWF9DQVJEX0gKKworI2luY2x1ZGUgInJ0czUxeF9jaGlwLmgiCisKKy8qIFJlZ2lzdGVyIGJpdCBkZWZpbml0aW9uICovCisKKy8qIENhcmQgUG93ZXIgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBQT1dFUl9PRkYJCQkweDAzCisjZGVmaW5lIFBBUlRJQUxfUE9XRVJfT04JCTB4MDIKKyNkZWZpbmUgUE9XRVJfT04JCQkweDAwCisjZGVmaW5lIFBPV0VSX01BU0sJCQkweDAzCisjZGVmaW5lIExETzMzMThfUFdSX01BU0sJCTB4MEMKKyNkZWZpbmUgTERPX09OCQkJCTB4MDAKKyNkZWZpbmUgTERPX1NVU1BFTkQJCQkweDA4CisjZGVmaW5lIExET19PRkYJCQkJMHgwQworI2RlZmluZSBEVjMzMThfQVVUT19QV1JfT0ZGCQkweDEwCisjZGVmaW5lIEZPUkNFX0xET19QT1dFUkIJMHg2MAorCisvKiBDYXJkIE91dHB1dCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWERfT1VUUFVUX0VOCQkJMHgwMgorI2RlZmluZSBTRF9PVVRQVVRfRU4JCQkweDA0CisjZGVmaW5lIE1TX09VVFBVVF9FTgkJCTB4MDgKKworLyogU3lzdGVtIENsb2NrIENvbnRyb2wgUmVnaXN0ZXIgKi8KKworLyogU3lzdGVtIENsb2NrIERpdmlkZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ0xLX0NIQU5HRQkJCTB4ODAKKyNkZWZpbmUgQ0xLX0RJVl8xCQkJMHgwMAorI2RlZmluZSBDTEtfRElWXzIJCQkweDAxCisjZGVmaW5lIENMS19ESVZfNAkJCTB4MDIKKyNkZWZpbmUgQ0xLX0RJVl84CQkJMHgwMworCisvKiBTeXN0ZW0gQ2xvY2sgU2VsZWN0IFJlZ2lzdGVyICovCisjZGVmaW5lIFNTQ182MAkJCQkwCisjZGVmaW5lIFNTQ184MAkJCQkxCisjZGVmaW5lIFNTQ18xMDAJCQkJMgorI2RlZmluZSBTU0NfMTIwCQkJCTMKKyNkZWZpbmUgU1NDXzE1MAkJCQk0CisKKy8qIENhcmQgQ2xvY2sgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIFhEX0NMS19FTgkJCTB4MDIKKyNkZWZpbmUgU0RfQ0xLX0VOCQkJMHgwNAorI2RlZmluZSBNU19DTEtfRU4JCQkweDA4CisKKy8qIENhcmQgU2VsZWN0IFJlZ2lzdGVyICovCisjZGVmaW5lIFhEX01PRF9TRUwJCQkxCisjZGVmaW5lIFNEX01PRF9TRUwJCQkyCisjZGVmaW5lIE1TX01PRF9TRUwJCQkzCisKKy8qIENhcmQgVHJhbnNmZXIgUmVzZXQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWERfU1RPUAkJCQkweDAyCisjZGVmaW5lIFNEX1NUT1AJCQkJMHgwNAorI2RlZmluZSBNU19TVE9QCQkJCTB4MDgKKyNkZWZpbmUgWERfQ0xSX0VSUgkJCTB4MjAKKyNkZWZpbmUgU0RfQ0xSX0VSUgkJCTB4NDAKKyNkZWZpbmUgTVNfQ0xSX0VSUgkJCTB4ODAKKworLyogU0QzMF9kcml2ZV9zZWwgKi8KKyNkZWZpbmUgU0QzMF9EUklWRV9NQVNLCTB4MDcKKworLyogQ0FSRF9EUklWRV9TRUwgKi8KKyNkZWZpbmUgU0QyMF9EUklWRV9NQVNLCTB4MDMKKyNkZWZpbmUgRFJJVkVfNG1BCQkJMHgwMAorI2RlZmluZSBEUklWRV84bUEJCQkweDAxCisjZGVmaW5lIERSSVZFXzEybUEJCQkweDAyCisKKy8qIEZQR0FfUFVMTF9DVEwgKi8KKyNkZWZpbmUgRlBHQV9NU19QVUxMX0NUTF9FTgkJMHhFRgorI2RlZmluZSBGUEdBX1NEX1BVTExfQ1RMX0VOCQkweEY3CisjZGVmaW5lIEZQR0FfWERfUFVMTF9DVExfRU4xCQkweEZFCisjZGVmaW5lIEZQR0FfWERfUFVMTF9DVExfRU4yCQkweEZECisjZGVmaW5lIEZQR0FfWERfUFVMTF9DVExfRU4zCQkweEZCCisKKyNkZWZpbmUgRlBHQV9NU19QVUxMX0NUTF9CSVQJCTB4MTAKKyNkZWZpbmUgRlBHQV9TRF9QVUxMX0NUTF9CSVQJCTB4MDgKKworLyogQ2FyZCBEYXRhIFNvdXJjZSBSZWdpc3RlciAqLworI2RlZmluZSBQSU5HUE9OR19CVUZGRVIJCQkweDAxCisjZGVmaW5lIFJJTkdfQlVGRkVSCQkJMHgwMAorCisvKiBTRlNNX0VEICovCisjZGVmaW5lIEhXX0NNRF9TVE9QCQkJMHg4MAorI2RlZmluZSBDTFJfU1RBR0VfU1RBTEwJCQkweDA4CisjZGVmaW5lIENBUkRfRVJSCQkJCTB4MTAKKworLyogQ0FSRF9TSEFSRV9NT0RFICovCisjZGVmaW5lCUNBUkRfU0hBUkVfTFFGUDQ4CQkweDA0CisjZGVmaW5lCUNBUkRfU0hBUkVfUUZOMjQJCTB4MDAKKyNkZWZpbmUgQ0FSRF9TSEFSRV9MUUZQX1NFTAkJMHgwNAorI2RlZmluZQlDQVJEX1NIQVJFX1hECQkJMHgwMAorI2RlZmluZQlDQVJEX1NIQVJFX1NECQkJMHgwMQorI2RlZmluZQlDQVJEX1NIQVJFX01TCQkJMHgwMgorI2RlZmluZSBDQVJEX1NIQVJFX01BU0sJCQkweDAzCisKKy8qIENBUkRfQVVUT19CTElOSyAqLworI2RlZmluZSBCTElOS19FTkFCTEUJCQkweDA4CisjZGVmaW5lIEJMSU5LX1NQRUVEX01BU0sJCTB4MDcKKworLyogQ0FSRF9HUElPICovCisjZGVmaW5lIEdQSU9fT0UJCQkJMHgwMgorI2RlZmluZSBHUElPX09VVFBVVAkJCTB4MDEKKworLyogQ0FSRF9DTEtfU09VUkNFICovCisjZGVmaW5lIENSQ19GSVhfQ0xLCQkJKDB4MDAgPDwgMCkKKyNkZWZpbmUgQ1JDX1ZBUl9DTEswCQkJKDB4MDEgPDwgMCkKKyNkZWZpbmUgQ1JDX1ZBUl9DTEsxCQkJKDB4MDIgPDwgMCkKKyNkZWZpbmUgU0QzMF9GSVhfQ0xLCQkJKDB4MDAgPDwgMikKKyNkZWZpbmUgU0QzMF9WQVJfQ0xLMAkJCSgweDAxIDw8IDIpCisjZGVmaW5lIFNEMzBfVkFSX0NMSzEJCQkoMHgwMiA8PCAyKQorI2RlZmluZSBTQU1QTEVfRklYX0NMSwkJCSgweDAwIDw8IDQpCisjZGVmaW5lIFNBTVBMRV9WQVJfQ0xLMAkJCSgweDAxIDw8IDQpCisjZGVmaW5lIFNBTVBMRV9WQVJfQ0xLMQkJCSgweDAyIDw8IDQpCisKKy8qIERDTV9EUlBfQ1RMICovCisjZGVmaW5lIERDTV9SRVNFVAkJCTB4MDgKKyNkZWZpbmUgRENNX0xPQ0tFRAkJCTB4MDQKKyNkZWZpbmUgRENNXzIwOE0JCQkweDAwCisjZGVmaW5lIERDTV9UWAkJCSAgICAgICAgMHgwMQorI2RlZmluZSBEQ01fUlgJCQkgICAgICAgIDB4MDIKKworLyogRENNX0RSUF9UUklHICovCisjZGVmaW5lIERSUF9TVEFSVAkJCTB4ODAKKyNkZWZpbmUgRFJQX0RPTkUJCQkweDQwCisKKy8qIERDTV9EUlBfQ0ZHICovCisjZGVmaW5lIERSUF9XUklURQkJCTB4ODAKKyNkZWZpbmUgRFJQX1JFQUQJCQkweDAwCisjZGVmaW5lIERDTV9XUklURV9BRERSRVNTXzUwCQkweDUwCisjZGVmaW5lIERDTV9XUklURV9BRERSRVNTXzUxCQkweDUxCisjZGVmaW5lIERDTV9SRUFEX0FERFJFU1NfMDAJCTB4MDAKKyNkZWZpbmUgRENNX1JFQURfQUREUkVTU181MQkJMHg1MQorCisvKiBIV19WRVJTSU9OICovCisjZGVmaW5lIEZQR0FfVkVSCQkJMHg4MAorI2RlZmluZSBIV19WRVJfTUFTSwkJCTB4MEYKKworLyogQ0RfREVHTElUQ0hfRU4gKi8KKyNkZWZpbmUgRElTQUJMRV9TRF9DRAkJCTB4MDgKKyNkZWZpbmUgRElTQUJMRV9NU19DRAkJCTB4MTAKKyNkZWZpbmUgRElTQUJMRV9YRF9DRAkJCTB4MjAKKyNkZWZpbmUgU0RfQ0RfREVHTElUQ0hfRU4JCTB4MDEKKyNkZWZpbmUgTVNfQ0RfREVHTElUQ0hfRU4JCTB4MDIKKyNkZWZpbmUgWERfQ0RfREVHTElUQ0hfRU4JCTB4MDQKKworLyogT0NQQ1RMICovCisjZGVmaW5lIENBUkRfT0NfREVURUNUX0VOCQkweDA4CisjZGVmaW5lIENBUkRfT0NfQ0xSCQkJMHgwMQorCisvKiBDQVJEX0RNQTFfQ1RMICovCisjZGVmaW5lIEVYVEVORF9ETUExX0FTWU5DX1NJR05BTAkweDAyCisKKy8qIEhTX1VTQl9TVEFUICovCisjZGVmaW5lIFVTQl9ISV9TUEVFRAkJCTB4MDEKKworLyogQ0ZHX01PREVfMSAqLworI2RlZmluZSBSVFM1MTc5CQkJCTB4MDIKKworLyogU1lTX0RVTU1ZMCAqLworI2RlZmluZSBOWUVUX0VOCQkJCTB4MDEKKyNkZWZpbmUgTllFVF9NU0FLCQkJMHgwMQorCisvKiBTU0NfQ1RMMSAqLworI2RlZmluZSBTU0NfUlNUQgkJCTB4ODAKKyNkZWZpbmUgU1NDXzhYX0VOCQkJMHg0MAorI2RlZmluZSBTU0NfRklYX0ZSQUMJCQkweDIwCisjZGVmaW5lIFNTQ19TRUxfMU0JCQkweDAwCisjZGVmaW5lIFNTQ19TRUxfMk0JCQkweDA4CisjZGVmaW5lIFNTQ19TRUxfNE0JCQkweDEwCisjZGVmaW5lIFNTQ19TRUxfOE0JCQkweDE4CisKKy8qIFNTQ19DVEwyICovCisjZGVmaW5lIFNTQ19ERVBUSF9NQVNLCQkJMHgwMworI2RlZmluZSBTU0NfREVQVEhfRElTQUxCRQkJMHgwMAorI2RlZmluZSBTU0NfREVQVEhfMk0JCQkweDAxCisjZGVmaW5lIFNTQ19ERVBUSF8xTQkJCTB4MDIKKyNkZWZpbmUgU1NDX0RFUFRIXzUxMksJCQkweDAzCisKKy8qIExET19QT1dFUl9DRkcgKi8KKyNkZWZpbmUgVFVORV9TRDE4X01BU0sJCQkweDFDCisjZGVmaW5lIFRVTkVfU0QxOF8xVjcJCQkweDAwCisjZGVmaW5lIFRVTkVfU0QxOF8xVjgJCQkoMHgwMSA8PCAyKQorI2RlZmluZSBUVU5FX1NEMThfMVY5CQkJKDB4MDIgPDwgMikKKyNkZWZpbmUgVFVORV9TRDE4XzJWMAkJCSgweDAzIDw8IDIpCisjZGVmaW5lIFRVTkVfU0QxOF8yVjcJCQkoMHgwNCA8PCAyKQorI2RlZmluZSBUVU5FX1NEMThfMlY4CQkJKDB4MDUgPDwgMikKKyNkZWZpbmUgVFVORV9TRDE4XzJWOQkJCSgweDA2IDw8IDIpCisjZGVmaW5lIFRVTkVfU0QxOF8zVjMJCQkoMHgwNyA8PCAyKQorCisvKiBYRF9DUF9XQUlUVElNRSAqLworI2RlZmluZSBXQUlUXzFGCQkJCTB4MDAKKyNkZWZpbmUgV0FJVF8zRgkJCQkweDAxCisjZGVmaW5lIFdBSVRfN0YJCQkJMHgwMgorI2RlZmluZSBXQUlUX0ZGCQkJCTB4MDMKKworLyogWERfSU5JVCAqLworI2RlZmluZQlYRF9QV1JfT0ZGX0RFTEFZMAkJMHgwMAorI2RlZmluZQlYRF9QV1JfT0ZGX0RFTEFZMQkJMHgwMgorI2RlZmluZQlYRF9QV1JfT0ZGX0RFTEFZMgkJMHgwNAorI2RlZmluZQlYRF9QV1JfT0ZGX0RFTEFZMwkJMHgwNgorI2RlZmluZQlYRF9BVVRPX1BXUl9PRkZfRU4JCTB4RjcKKyNkZWZpbmUJWERfTk9fQVVUT19QV1JfT0ZGCQkweDA4CisKKy8qIFhEX0RUQ1RMICovCisvKiBYRF9DQVRDVEwgKi8KKyNkZWZpbmUJWERfVElNRV9SV05fMQkJCTB4MDAKKyNkZWZpbmUJWERfVElNRV9SV05fU1RFUAkJMHgyMAorI2RlZmluZQlYRF9USU1FX1JXXzEJCQkweDAwCisjZGVmaW5lCVhEX1RJTUVfUldfU1RFUAkJCTB4MDQKKyNkZWZpbmUJWERfVElNRV9TRVRVUF8xCQkJMHgwMAorI2RlZmluZQlYRF9USU1FX1NFVFVQX1NURVAJCTB4MDEKKworLyogWERfQ1RMICovCisjZGVmaW5lCVhEX0VDQzJfVU5DT1JSRUNUQUJMRQkJMHg4MAorI2RlZmluZQlYRF9FQ0MyX0VSUk9SCQkJMHg0MAorI2RlZmluZQlYRF9FQ0MxX1VOQ09SUkVDVEFCTEUJCTB4MjAKKyNkZWZpbmUJWERfRUNDMV9FUlJPUgkJCTB4MTAKKyNkZWZpbmUJWERfUkRZCQkJCTB4MDQKKyNkZWZpbmUJWERfQ0VfRU4JCQkweEZECisjZGVmaW5lCVhEX0NFX0RJU0VOCQkJMHgwMgorI2RlZmluZQlYRF9XUF9FTgkJCTB4RkUKKyNkZWZpbmUJWERfV1BfRElTRU4JCQkweDAxCisKKy8qIFhEX1RSQU5TRkVSICovCisjZGVmaW5lCVhEX1RSQU5TRkVSX1NUQVJUCQkweDgwCisjZGVmaW5lCVhEX1RSQU5TRkVSX0VORAkJCTB4NDAKKyNkZWZpbmUJWERfUFBCX0VNUFRZCQkJMHgyMAorI2RlZmluZQlYRF9FUlIJCQkJMHgxMAorI2RlZmluZQlYRF9SRVNFVAkJCTB4MDAKKyNkZWZpbmUJWERfRVJBU0UJCQkweDAxCisjZGVmaW5lCVhEX1JFQURfU1RBVFVTCQkJMHgwMgorI2RlZmluZQlYRF9SRUFEX0lECQkJMHgwMworI2RlZmluZQlYRF9SRUFEX1JFRFVOREFOVAkJMHgwNAorI2RlZmluZQlYRF9SRUFEX1BBR0VTCQkJMHgwNQorI2RlZmluZQlYRF9TRVRfQ01ECQkJMHgwNgorI2RlZmluZQlYRF9OT1JNQUxfUkVBRAkJCTB4MDcKKyNkZWZpbmUJWERfV1JJVEVfUEFHRVMJCQkweDA4CisjZGVmaW5lCVhEX05PUk1BTF9XUklURQkJCTB4MDkKKyNkZWZpbmUJWERfV1JJVEVfUkVEVU5EQU5UCQkweDBBCisjZGVmaW5lCVhEX1NFVF9BRERSCQkJMHgwQgorI2RlZmluZSBYRF9DT1BZX1BBR0VTCQkJMHgwQworCisvKiBYRF9DRkcgKi8KKyNkZWZpbmUJWERfUFBCX1RPX1NJRQkJCTB4ODAKKyNkZWZpbmUJWERfVE9fUFBCX09OTFkJCQkweDAwCisjZGVmaW5lCVhEX0JBX1RSQU5TRk9STQkJCTB4NDAKKyNkZWZpbmUJWERfQkFfTk9fVFJBTlNGT1JNCQkweDAwCisjZGVmaW5lCVhEX05PX0NBTENfRUNDCQkJMHgyMAorI2RlZmluZQlYRF9DQUxDX0VDQwkJCTB4MDAKKyNkZWZpbmUJWERfSUdOT1JFX0VDQwkJCTB4MTAKKyNkZWZpbmUJWERfQ0hFQ0tfRUNDCQkJMHgwMAorI2RlZmluZQlYRF9ESVJFQ1RfVE9fUkIJCQkweDA4CisjZGVmaW5lIFhEX0FERFJfTUFTSwkJCTB4MDcKKyNkZWZpbmUJWERfQUREUl9MRU5HVEhfMAkJMHgwMAorI2RlZmluZQlYRF9BRERSX0xFTkdUSF8xCQkweDAxCisjZGVmaW5lCVhEX0FERFJfTEVOR1RIXzIJCTB4MDIKKyNkZWZpbmUJWERfQUREUl9MRU5HVEhfMwkJMHgwMworI2RlZmluZQlYRF9BRERSX0xFTkdUSF80CQkweDA0CisKKy8qIFhEX1BBR0VfU1RBVFVTICovCisjZGVmaW5lCVhEX0dQRwkJCQkweEZGCisjZGVmaW5lCVhEX0JQRwkJCQkweDAwCisKKy8qIFhEX0JMT0NLX1NUQVRVUyAqLworI2RlZmluZQlYRF9HQkxLCQkJCTB4RkYKKyNkZWZpbmUJWERfTEFURVJfQkJMSwkJCTB4RjAKKworLyogWERfUEFSSVRZICovCisjZGVmaW5lCVhEX0VDQzJfQUxMMQkJCTB4ODAKKyNkZWZpbmUJWERfRUNDMV9BTEwxCQkJMHg0MAorI2RlZmluZQlYRF9CQTJfQUxMMAkJCTB4MjAKKyNkZWZpbmUJWERfQkExX0FMTDAJCQkweDEwCisjZGVmaW5lCVhEX0JBMV9CQTJfRVFMCQkJMHgwNAorI2RlZmluZQlYRF9CQTJfVkFMSUQJCQkweDAyCisjZGVmaW5lCVhEX0JBMV9WQUxJRAkJCTB4MDEKKworLyogWERfQ0hLX0RBVEFfU1RBVFVTICovCisjZGVmaW5lCVhEX1BHU1RTX1pFUk9CSVRfT1ZFUjQJCTB4MDAKKyNkZWZpbmUJWERfUEdTVFNfTk9UX0ZGCQkJMHgwMgorI2RlZmluZQlYRF9BVVRPX0NIS19EQVRBX1NUQVRVUwkJMHgwMQorCisvKiBTRF9DRkcxICovCisjZGVmaW5lIFNEX0NMS19ESVZJREVfMAkJCTB4MDAKKyNkZWZpbmUJU0RfQ0xLX0RJVklERV8yNTYJCTB4QzAKKyNkZWZpbmUJU0RfQ0xLX0RJVklERV8xMjgJCTB4ODAKKyNkZWZpbmUgU0RfQ0xLX0RJVklERV9NQVNLCQkweEMwCisjZGVmaW5lCVNEX0JVU19XSURUSF8xCQkJMHgwMAorI2RlZmluZQlTRF9CVVNfV0lEVEhfNAkJCTB4MDEKKyNkZWZpbmUJU0RfQlVTX1dJRFRIXzgJCQkweDAyCisjZGVmaW5lCVNEX0FTWU5DX0ZJRk9fUlNUCQkweDEwCisjZGVmaW5lCVNEXzIwX01PREUJCQkweDAwCisjZGVmaW5lCVNEX0REUl9NT0RFCQkJMHgwNAorI2RlZmluZQlTRF8zMF9NT0RFCQkJMHgwOAorCisvKiBTRF9DRkcyICovCisjZGVmaW5lCVNEX0NBTENVTEFURV9DUkM3CQkweDAwCisjZGVmaW5lCVNEX05PX0NBTENVTEFURV9DUkM3CQkweDgwCisjZGVmaW5lCVNEX0NIRUNLX0NSQzE2CQkJMHgwMAorI2RlZmluZQlTRF9OT19DSEVDS19DUkMxNgkJMHg0MAorI2RlZmluZSBTRF9XQUlUX0NSQ19UT19FTgkJMHgyMAorI2RlZmluZQlTRF9XQUlUX0JVU1lfRU5ECQkweDA4CisjZGVmaW5lCVNEX05PX1dBSVRfQlVTWV9FTkQJCTB4MDAKKyNkZWZpbmUJU0RfQ0hFQ0tfQ1JDNwkJCTB4MDAKKyNkZWZpbmUJU0RfTk9fQ0hFQ0tfQ1JDNwkJMHgwNAorI2RlZmluZQlTRF9SU1BfTEVOXzAJCQkweDAwCisjZGVmaW5lCVNEX1JTUF9MRU5fNgkJCTB4MDEKKyNkZWZpbmUJU0RfUlNQX0xFTl8xNwkJCTB4MDIKKy8qIFNEL01NQyBSZXNwb25zZSBUeXBlIERlZmluaXRpb24gKi8KKy8qIFNEX0NBTENVTEFURV9DUkM3LCBTRF9DSEVDS19DUkMxNiwKKyAqIFNEX05PX1dBSVRfQlVTWV9FTkQsIFNEX05PX0NIRUNLX0NSQzcsCisgKiBTRF9SU1BfTEVOXzAgKi8KKyNkZWZpbmUJU0RfUlNQX1RZUEVfUjAJCQkweDA0CisvKiBTRF9DQUxDVUxBVEVfQ1JDNywgU0RfQ0hFQ0tfQ1JDMTYsCisgKiBTRF9OT19XQUlUX0JVU1lfRU5ELCBTRF9DSEVDS19DUkM3LAorICogU0RfUlNQX0xFTl82ICovCisjZGVmaW5lCVNEX1JTUF9UWVBFX1IxCQkJMHgwMQorLyogU0RfQ0FMQ1VMQVRFX0NSQzcsIFNEX0NIRUNLX0NSQzE2LAorICogU0RfV0FJVF9CVVNZX0VORCwgU0RfQ0hFQ0tfQ1JDNywKKyAqIFNEX1JTUF9MRU5fNiAqLworI2RlZmluZQlTRF9SU1BfVFlQRV9SMWIJCQkweDA5CisvKiBTRF9DQUxDVUxBVEVfQ1JDNywgU0RfQ0hFQ0tfQ1JDMTYsCisgKiBTRF9OT19XQUlUX0JVU1lfRU5ELCBTRF9DSEVDS19DUkM3LAorICogU0RfUlNQX0xFTl8xNyAqLworI2RlZmluZQlTRF9SU1BfVFlQRV9SMgkJCTB4MDIKKy8qIFNEX0NBTENVTEFURV9DUkM3LCBTRF9DSEVDS19DUkMxNiwKKyAqIFNEX05PX1dBSVRfQlVTWV9FTkQsIFNEX05PX0NIRUNLX0NSQzcsCisgKiBTRF9SU1BfTEVOXzYgKi8KKyNkZWZpbmUJU0RfUlNQX1RZUEVfUjMJCQkweDA1CisvKiBTRF9DQUxDVUxBVEVfQ1JDNywgU0RfQ0hFQ0tfQ1JDMTYsCisgKiBTRF9OT19XQUlUX0JVU1lfRU5ELCBTRF9OT19DSEVDS19DUkM3LAorICogU0RfUlNQX0xFTl82ICovCisjZGVmaW5lCVNEX1JTUF9UWVBFX1I0CQkJMHgwNQorLyogU0RfQ0FMQ1VMQVRFX0NSQzcsIFNEX0NIRUNLX0NSQzE2LAorICogU0RfTk9fV0FJVF9CVVNZX0VORCwgU0RfQ0hFQ0tfQ1JDNywKKyAqIFNEX1JTUF9MRU5fNiAqLworI2RlZmluZQlTRF9SU1BfVFlQRV9SNQkJCTB4MDEKKy8qIFNEX0NBTENVTEFURV9DUkM3LCBTRF9DSEVDS19DUkMxNiwKKyAqIFNEX05PX1dBSVRfQlVTWV9FTkQsIFNEX0NIRUNLX0NSQzcsCisgKiBTRF9SU1BfTEVOXzYgKi8KKyNkZWZpbmUJU0RfUlNQX1RZUEVfUjYJCQkweDAxCisvKiBTRF9DQUxDVUxBVEVfQ1JDNywgU0RfQ0hFQ0tfQ1JDMTYsCisgKiBTRF9OT19XQUlUX0JVU1lfRU5ELCBTRF9DSEVDS19DUkM3LAorICogU0RfUlNQX0xFTl82ICAqLworI2RlZmluZQlTRF9SU1BfVFlQRV9SNwkJCTB4MDEKKworLyogU0RfQ0ZHMyAqLworI2RlZmluZQlTRF9SU1BfODBDTEtfVElNRU9VVF9FTgkJMHgwMQorCisvKiBTRF9TVEFUMSAqLworI2RlZmluZQlTRF9DUkM3X0VSUgkJCTB4ODAKKyNkZWZpbmUJU0RfQ1JDMTZfRVJSCQkJMHg0MAorI2RlZmluZQlTRF9DUkNfV1JJVEVfRVJSCQkweDIwCisjZGVmaW5lCVNEX0NSQ19XUklURV9FUlJfTUFTSwkJMHgxQworI2RlZmluZQlHRVRfQ1JDX1RJTUVfT1VUCQkweDAyCisjZGVmaW5lCVNEX1RVTklOR19DT01QQVJFX0VSUgkJMHgwMQorCisvKiBTRF9TVEFUMiAqLworI2RlZmluZQlTRF9SU1BfODBDTEtfVElNRU9VVAkJMHgwMQorCisvKiBTRF9CVVNfU1RBVCAqLworI2RlZmluZQlTRF9DTEtfVE9HR0xFX0VOCQkweDgwCisjZGVmaW5lCVNEX0NMS19GT1JDRV9TVE9QCSAgICAgICAgMHg0MAorI2RlZmluZQlTRF9EQVQzX1NUQVRVUwkJICAgICAgICAweDEwCisjZGVmaW5lCVNEX0RBVDJfU1RBVFVTCQkgICAgICAgIDB4MDgKKyNkZWZpbmUJU0RfREFUMV9TVEFUVVMJCSAgICAgICAgMHgwNAorI2RlZmluZQlTRF9EQVQwX1NUQVRVUwkJICAgICAgICAweDAyCisjZGVmaW5lCVNEX0NNRF9TVEFUVVMJCQkweDAxCisKKy8qIFNEX1BBRF9DVEwgKi8KKyNkZWZpbmUJU0RfSU9fVVNJTkdfMVY4CQkgICAgICAgIDB4ODAKKyNkZWZpbmUJU0RfSU9fVVNJTkdfM1YzCQkgICAgICAgIDB4N0YKKyNkZWZpbmUJVFlQRV9BX0RSSVZJTkcJCSAgICAgICAgMHgwMAorI2RlZmluZQlUWVBFX0JfRFJJVklORwkJCTB4MDEKKyNkZWZpbmUJVFlQRV9DX0RSSVZJTkcJCQkweDAyCisjZGVmaW5lCVRZUEVfRF9EUklWSU5HCQkgICAgICAgIDB4MDMKKworLyogU0RfU0FNUExFX1BPSU5UX0NUTCAqLworI2RlZmluZQlERFJfRklYX1JYX0RBVAkJCTB4MDAKKyNkZWZpbmUJRERSX1ZBUl9SWF9EQVQJCQkweDgwCisjZGVmaW5lCUREUl9GSVhfUlhfREFUX0VER0UJCTB4MDAKKyNkZWZpbmUJRERSX0ZJWF9SWF9EQVRfMTRfREVMQVkJCTB4NDAKKyNkZWZpbmUJRERSX0ZJWF9SWF9DTUQJCQkweDAwCisjZGVmaW5lCUREUl9WQVJfUlhfQ01ECQkJMHgyMAorI2RlZmluZQlERFJfRklYX1JYX0NNRF9QT1NfRURHRQkJMHgwMAorI2RlZmluZQlERFJfRklYX1JYX0NNRF8xNF9ERUxBWQkJMHgxMAorI2RlZmluZQlTRDIwX1JYX1BPU19FREdFCQkweDAwCisjZGVmaW5lCVNEMjBfUlhfMTRfREVMQVkJCTB4MDgKKyNkZWZpbmUgU0QyMF9SWF9TRUxfTUFTSwkJMHgwOAorCisvKiBTRF9QVVNIX1BPSU5UX0NUTCAqLworI2RlZmluZQlERFJfRklYX1RYX0NNRF9EQVQJCTB4MDAKKyNkZWZpbmUJRERSX1ZBUl9UWF9DTURfREFUCQkweDgwCisjZGVmaW5lCUREUl9GSVhfVFhfREFUXzE0X1RTVQkJMHgwMAorI2RlZmluZQlERFJfRklYX1RYX0RBVF8xMl9UU1UJCTB4NDAKKyNkZWZpbmUJRERSX0ZJWF9UWF9DTURfTkVHX0VER0UJCTB4MDAKKyNkZWZpbmUJRERSX0ZJWF9UWF9DTURfMTRfQUhFQUQJCTB4MjAKKyNkZWZpbmUJU0QyMF9UWF9ORUdfRURHRQkJMHgwMAorI2RlZmluZQlTRDIwX1RYXzE0X0FIRUFECQkweDEwCisjZGVmaW5lIFNEMjBfVFhfU0VMX01BU0sJCTB4MTAKKyNkZWZpbmUJRERSX1ZBUl9TRENMS19QT0xfU1dBUAkJMHgwMQorCisvKiBTRF9UUkFOU0ZFUiAqLworI2RlZmluZQlTRF9UUkFOU0ZFUl9TVEFSVAkJMHg4MAorI2RlZmluZQlTRF9UUkFOU0ZFUl9FTkQJCQkweDQwCisjZGVmaW5lIFNEX1NUQVRfSURMRQkJCTB4MjAKKyNkZWZpbmUJU0RfVFJBTlNGRVJfRVJSCQkJMHgxMAorLyogU0QgVHJhbnNmZXIgTW9kZSBkZWZpbml0aW9uICovCisjZGVmaW5lCVNEX1RNX05PUk1BTF9XUklURQkJMHgwMAorI2RlZmluZQlTRF9UTV9BVVRPX1dSSVRFXzMJCTB4MDEKKyNkZWZpbmUJU0RfVE1fQVVUT19XUklURV80CQkweDAyCisjZGVmaW5lCVNEX1RNX0FVVE9fUkVBRF8zCQkweDA1CisjZGVmaW5lCVNEX1RNX0FVVE9fUkVBRF80CQkweDA2CisjZGVmaW5lCVNEX1RNX0NNRF9SU1AJCQkweDA4CisjZGVmaW5lCVNEX1RNX0FVVE9fV1JJVEVfMQkJMHgwOQorI2RlZmluZQlTRF9UTV9BVVRPX1dSSVRFXzIJCTB4MEEKKyNkZWZpbmUJU0RfVE1fTk9STUFMX1JFQUQJCTB4MEMKKyNkZWZpbmUJU0RfVE1fQVVUT19SRUFEXzEJCTB4MEQKKyNkZWZpbmUJU0RfVE1fQVVUT19SRUFEXzIJCTB4MEUKKyNkZWZpbmUJU0RfVE1fQVVUT19UVU5JTkcJCTB4MEYKKworLyogU0RfVlBUWF9DVEwgLyBTRF9WUFJYX0NUTCAqLworI2RlZmluZSBQSEFTRV9DSEFOR0UJCQkweDgwCisjZGVmaW5lIFBIQVNFX05PVF9SRVNFVAkJCTB4NDAKKworLyogU0RfRENNUFNfVFhfQ1RMIC8gU0RfRENNUFNfUlhfQ1RMICovCisjZGVmaW5lIERDTVBTX0NIQU5HRQkJCTB4ODAKKyNkZWZpbmUgRENNUFNfQ0hBTkdFX0RPTkUJCTB4NDAKKyNkZWZpbmUgRENNUFNfRVJST1IJCQkweDIwCisjZGVmaW5lIERDTVBTX0NVUlJFTlRfUEhBU0UJCTB4MUYKKworLyogU0RfQ01EX1NUQVRFICovCisjZGVmaW5lIFNEX0NNRF9JRExFCQkJMHg4MAorCisvKiBTRF9EQVRBX1NUQVRFICovCisjZGVmaW5lIFNEX0RBVEFfSURMRQkJCTB4ODAKKworLyogTVNfQkxLRU5EICovCisjZGVmaW5lIFNFVF9CTEtFTkQJCQkweDAxCisKKy8qIE1TX0NGRyAqLworI2RlZmluZQlTQU1QTEVfVElNRV9SSVNJTkcJCTB4MDAKKyNkZWZpbmUJU0FNUExFX1RJTUVfRkFMTElORwkJMHg4MAorI2RlZmluZQlQVVNIX1RJTUVfREVGQVVMVAkJMHgwMAorI2RlZmluZQlQVVNIX1RJTUVfT0RECQkJMHg0MAorI2RlZmluZQlOT19FWFRFTkRfVE9HR0xFCQkweDAwCisjZGVmaW5lCUVYVEVORF9UT0dHTEVfQ0hLCQkweDIwCisjZGVmaW5lCU1TX0JVU19XSURUSF8xCQkJMHgwMAorI2RlZmluZQlNU19CVVNfV0lEVEhfNAkJCTB4MTAKKyNkZWZpbmUJTVNfQlVTX1dJRFRIXzgJCQkweDE4CisjZGVmaW5lCU1TXzJLX1NFQ1RPUl9NT0RFCQkweDA0CisjZGVmaW5lCU1TXzUxMl9TRUNUT1JfTU9ERQkJMHgwMAorI2RlZmluZQlNU19UT0dHTEVfVElNRU9VVF9FTgkJMHgwMAorI2RlZmluZQlNU19UT0dHTEVfVElNRU9VVF9ESVNFTgkJMHgwMQorI2RlZmluZSBNU19OT19DSEVDS19JTlQJCQkweDAyCisKKy8qIE1TX1RSQU5TX0NGRyAqLworI2RlZmluZQlXQUlUX0lOVAkJCTB4ODAKKyNkZWZpbmUJTk9fV0FJVF9JTlQJCQkweDAwCisjZGVmaW5lCU5PX0FVVE9fUkVBRF9JTlRfUkVHCQkweDAwCisjZGVmaW5lCUFVVE9fUkVBRF9JTlRfUkVHCQkweDQwCisjZGVmaW5lCU1TX0NSQzE2X0VSUgkJCTB4MjAKKyNkZWZpbmUJTVNfUkRZX1RJTUVPVVQJCQkweDEwCisjZGVmaW5lCU1TX0lOVF9DTUROSwkJCTB4MDgKKyNkZWZpbmUJTVNfSU5UX0JSRVEJCQkweDA0CisjZGVmaW5lCU1TX0lOVF9FUlIJCQkweDAyCisjZGVmaW5lCU1TX0lOVF9DRUQJCQkweDAxCisKKy8qIE1TX1RSQU5TRkVSICovCisjZGVmaW5lCU1TX1RSQU5TRkVSX1NUQVJUCQkweDgwCisjZGVmaW5lCU1TX1RSQU5TRkVSX0VORAkJCTB4NDAKKyNkZWZpbmUJTVNfVFJBTlNGRVJfRVJSCQkJMHgyMAorI2RlZmluZQlNU19CU19TVEFURQkJCTB4MTAKKyNkZWZpbmUJTVNfVE1fUkVBRF9CWVRFUwkJMHgwMAorI2RlZmluZQlNU19UTV9OT1JNQUxfUkVBRAkJMHgwMQorI2RlZmluZQlNU19UTV9XUklURV9CWVRFUwkJMHgwNAorI2RlZmluZQlNU19UTV9OT1JNQUxfV1JJVEUJCTB4MDUKKyNkZWZpbmUJTVNfVE1fQVVUT19SRUFECQkJMHgwOAorI2RlZmluZQlNU19UTV9BVVRPX1dSSVRFCQkweDBDCisjZGVmaW5lIE1TX1RNX1NFVF9DTUQJCQkweDA2CisjZGVmaW5lIE1TX1RNX0NPUFlfUEFHRQkJCTB4MDcKKyNkZWZpbmUgTVNfVE1fTVVMVElfUkVBRAkJMHgwMgorI2RlZmluZSBNU19UTV9NVUxUSV9XUklURQkJMHgwMworCisvKiBNQ19ETUFfQ1RMICovCisjZGVmaW5lIERNQV9UQ19FUV8wCQkJMHg4MAorI2RlZmluZSBETUFfRElSX1RPX0NBUkQJCQkweDAwCisjZGVmaW5lIERNQV9ESVJfRlJPTV9DQVJECQkweDAyCisjZGVmaW5lIERNQV9FTgkJCQkweDAxCisjZGVmaW5lIERNQV8xMjgJCQkJKDAgPDwgMikKKyNkZWZpbmUgRE1BXzI1NgkJCQkoMSA8PCAyKQorI2RlZmluZSBETUFfNTEyCQkJCSgyIDw8IDIpCisjZGVmaW5lIERNQV8xMDI0CQkJKDMgPDwgMikKKyNkZWZpbmUgRE1BX1BBQ0tfU0laRV9NQVNLCQkweDBDCisKKy8qIENBUkRfSU5UX1BFTkQgKi8KKyNkZWZpbmUgWERfSU5UCQkJCTB4MTAKKyNkZWZpbmUgTVNfSU5UCQkJCTB4MDgKKyNkZWZpbmUgU0RfSU5UCQkJCTB4MDQKKworLyogTUNfRklGT19DVEwgKi8KKyNkZWZpbmUgRklGT19GTFVTSAkJCTB4MDEKKworLyogQVVUT19ERUxJTktfRU4gKi8KKyNkZWZpbmUgQVVUT19ERUxJTksJCQkweDAyCisjZGVmaW5lIEZPUkNFX0RFTElOSwkJCTB4MDEKKworLyogTUNfRE1BX1JTVCAqLworI2RlZmluZSBETUFfUkVTRVQgIDB4MDEKKworI2RlZmluZSBTU0NfUE9XRVJfTUFTSwkJCTB4MDEKKyNkZWZpbmUgU1NDX1BPV0VSX0RPV04JCQkweDAxCisjZGVmaW5lIFNTQ19QT1dFUl9PTgkJCTB4MDAKKworLyogT0NQQ1RMICovCisjZGVmaW5lIE1TX09DUF9ERVRFQ1RfRU4JCTB4MDgKKyNkZWZpbmUJTVNfT0NQX0lOVF9FTgkJCTB4MDQKKyNkZWZpbmUJTVNfT0NQX0lOVF9DTFIJCQkweDAyCisjZGVmaW5lCU1TX09DUF9DTEVBUgkJCTB4MDEKKworLyogT0NQU1RBVCAqLworI2RlZmluZSBNU19PQ1BfREVURUNUCQkJMHg4MAorI2RlZmluZSBNU19PQ1BfTk9XCQkJMHgwMgorI2RlZmluZSBNU19PQ1BfRVZFUgkJCTB4MDEKKworLyogTUNfRklGT19TVEFUICovCisjZGVmaW5lIEZJRk9fRlVMTAkJMHgwMQorI2RlZmluZSBGSUZPX0VNUFRZCQkweDAyCisKKy8qIFJDQ1RMICovCisjZGVmaW5lIFVfSFdfQ01EX0VOX01BU0sJCTB4MDIKKyNkZWZpbmUgVV9IV19DTURfRU4JCQkweDAyCisjZGVmaW5lIFVfSFdfQ01EX0RJUwkJCTB4MDAKKworLyogUmVnaXN0ZXIgYWRkcmVzcyAqLworI2RlZmluZSBGUERDVEwJCQkJMHhGQzAwCisjZGVmaW5lIFNTQ19ESVZfTl8wCQkJMHhGQzA3CisjZGVmaW5lIFNTQ19DVEwxCQkJMHhGQzA5CisjZGVmaW5lIFNTQ19DVEwyCQkJMHhGQzBBCisjZGVmaW5lIENGR19NT0RFXzEJCTB4RkMwRgorI2RlZmluZSBSQ0NUTAkJCTB4RkMxNAorI2RlZmluZSBTWVNfRFVNTVkwCQkJMHhGQzMwCisjZGVmaW5lIFhEX0NQX1dBSVRUSU1FCQkJMHhGRDAwCisjZGVmaW5lIFhEX0NQX1BBR0VMRU4JCQkweEZEMDEKKyNkZWZpbmUgWERfQ1BfUkVBREFERFIwCQkJMHhGRDAyCisjZGVmaW5lIFhEX0NQX1JFQURBRERSMQkJCTB4RkQwMworI2RlZmluZSBYRF9DUF9SRUFEQUREUjIJCQkweEZEMDQKKyNkZWZpbmUgWERfQ1BfUkVBREFERFIzCQkJMHhGRDA1CisjZGVmaW5lIFhEX0NQX1JFQURBRERSNAkJCTB4RkQwNgorI2RlZmluZSBYRF9DUF9XUklURUFERFIwCQkweEZEMDcKKyNkZWZpbmUgWERfQ1BfV1JJVEVBRERSMQkJMHhGRDA4CisjZGVmaW5lIFhEX0NQX1dSSVRFQUREUjIJCTB4RkQwOQorI2RlZmluZSBYRF9DUF9XUklURUFERFIzCQkweEZEMEEKKyNkZWZpbmUgWERfQ1BfV1JJVEVBRERSNAkJMHhGRDBCCisjZGVmaW5lIFhEX0lOSVQJCQkJMHhGRDEwCisjZGVmaW5lIFhEX0RUQ1RMCQkJMHhGRDExCisjZGVmaW5lIFhEX0NUTAkJCQkweEZEMTIKKyNkZWZpbmUgWERfVFJBTlNGRVIJCQkweEZEMTMKKyNkZWZpbmUgWERfQ0ZHCQkJCTB4RkQxNAorI2RlZmluZSBYRF9BRERSRVNTMAkJCTB4RkQxNQorI2RlZmluZSBYRF9BRERSRVNTMQkJCTB4RkQxNgorI2RlZmluZSBYRF9BRERSRVNTMgkJCTB4RkQxNworI2RlZmluZSBYRF9BRERSRVNTMwkJCTB4RkQxOAorI2RlZmluZSBYRF9BRERSRVNTNAkJCTB4RkQxOQorI2RlZmluZSBYRF9EQVQJCQkJMHhGRDFBCisjZGVmaW5lIFhEX1BBR0VfQ05UCQkJMHhGRDFCCisjZGVmaW5lIFhEX1BBR0VfU1RBVFVTCQkJMHhGRDFDCisjZGVmaW5lIFhEX0JMT0NLX1NUQVRVUwkJCTB4RkQxRAorI2RlZmluZSBYRF9CTE9DS19BRERSMV9MCQkweEZEMUUKKyNkZWZpbmUgWERfQkxPQ0tfQUREUjFfSAkJMHhGRDFGCisjZGVmaW5lIFhEX0JMT0NLX0FERFIyX0wJCTB4RkQyMAorI2RlZmluZSBYRF9CTE9DS19BRERSMl9ICQkweEZEMjEKKyNkZWZpbmUgWERfQllURV9DTlRfTAkJCTB4RkQyMgorI2RlZmluZSBYRF9CWVRFX0NOVF9ICQkJMHhGRDIzCisjZGVmaW5lCVhEX1BBUklUWQkJCTB4RkQyNAorI2RlZmluZSBYRF9FQ0NfQklUMQkJCTB4RkQyNQorI2RlZmluZSBYRF9FQ0NfQllURTEJCQkweEZEMjYKKyNkZWZpbmUgWERfRUNDX0JJVDIJCQkweEZEMjcKKyNkZWZpbmUgWERfRUNDX0JZVEUyCQkJMHhGRDI4CisjZGVmaW5lIFhEX1JFU0VSVkVEMAkJCTB4RkQyOQorI2RlZmluZSBYRF9SRVNFUlZFRDEJCQkweEZEMkEKKyNkZWZpbmUgWERfUkVTRVJWRUQyCQkJMHhGRDJCCisjZGVmaW5lIFhEX1JFU0VSVkVEMwkJCTB4RkQyQworI2RlZmluZSBYRF9DSEtfREFUQV9TVEFUVVMJCTB4RkQyRAorI2RlZmluZSBYRF9DQVRDVEwJCQkweEZEMkUKKworI2RlZmluZSBNU19CTEtFTkQJCQkweEZEMzAKKyNkZWZpbmUgTVNfUkVBRF9TVEFSVAkJCTB4RkQzMQorI2RlZmluZSBNU19SRUFEX0NPVU5UCQkJMHhGRDMyCisjZGVmaW5lIE1TX1dSSVRFX1NUQVJUCQkJMHhGRDMzCisjZGVmaW5lIE1TX1dSSVRFX0NPVU5UCQkJMHhGRDM0CisjZGVmaW5lIE1TX0NPTU1BTkQJCQkweEZEMzUKKyNkZWZpbmUgTVNfT0xEX0JMT0NLXzAJCQkweEZEMzYKKyNkZWZpbmUgTVNfT0xEX0JMT0NLXzEJCQkweEZEMzcKKyNkZWZpbmUgTVNfTkVXX0JMT0NLXzAJCQkweEZEMzgKKyNkZWZpbmUgTVNfTkVXX0JMT0NLXzEJCQkweEZEMzkKKyNkZWZpbmUgTVNfTE9HX0JMT0NLXzAJCQkweEZEM0EKKyNkZWZpbmUgTVNfTE9HX0JMT0NLXzEJCQkweEZEM0IKKyNkZWZpbmUgTVNfQlVTX1dJRFRICQkJMHhGRDNDCisjZGVmaW5lIE1TX1BBR0VfU1RBUlQJCQkweEZEM0QKKyNkZWZpbmUgTVNfUEFHRV9MRU5HVEgJCQkweEZEM0UKKyNkZWZpbmUgTVNfQ0ZHCQkJCTB4RkQ0MAorI2RlZmluZSBNU19UUEMJCQkJMHhGRDQxCisjZGVmaW5lIE1TX1RSQU5TX0NGRwkJCTB4RkQ0MgorI2RlZmluZSBNU19UUkFOU0ZFUgkJCTB4RkQ0MworI2RlZmluZSBNU19JTlRfUkVHCQkJMHhGRDQ0CisjZGVmaW5lIE1TX0JZVEVfQ05UCQkJMHhGRDQ1CisjZGVmaW5lIE1TX1NFQ1RPUl9DTlRfTAkJCTB4RkQ0NgorI2RlZmluZSBNU19TRUNUT1JfQ05UX0gJCQkweEZENDcKKyNkZWZpbmUgTVNfREJVU19ICQkJMHhGRDQ4CisKKyNkZWZpbmUgQ0FSRF9ETUExX0NUTAkJCTB4RkQ1QworI2RlZmluZSBDQVJEX1BVTExfQ1RMMQkJCTB4RkQ2MAorI2RlZmluZSBDQVJEX1BVTExfQ1RMMgkJCTB4RkQ2MQorI2RlZmluZSBDQVJEX1BVTExfQ1RMMwkJCTB4RkQ2MgorI2RlZmluZSBDQVJEX1BVTExfQ1RMNAkJCTB4RkQ2MworI2RlZmluZSBDQVJEX1BVTExfQ1RMNQkJCTB4RkQ2NAorI2RlZmluZSBDQVJEX1BVTExfQ1RMNgkJCTB4RkQ2NQorI2RlZmluZSBDQVJEX0VYSVNUCQkJCTB4RkQ2RgorI2RlZmluZSBDQVJEX0lOVF9QRU5ECQkJMHhGRDcxCisKKyNkZWZpbmUgTERPX1BPV0VSX0NGRwkJCTB4RkQ3QgorCisjZGVmaW5lIFNEX0NGRzEJCQkJMHhGREEwCisjZGVmaW5lIFNEX0NGRzIJCQkJMHhGREExCisjZGVmaW5lIFNEX0NGRzMJCQkJMHhGREEyCisjZGVmaW5lIFNEX1NUQVQxCQkJMHhGREEzCisjZGVmaW5lIFNEX1NUQVQyCQkJMHhGREE0CisjZGVmaW5lIFNEX0JVU19TVEFUCQkJMHhGREE1CisjZGVmaW5lIFNEX1BBRF9DVEwJCQkweEZEQTYKKyNkZWZpbmUgU0RfU0FNUExFX1BPSU5UX0NUTAkJMHhGREE3CisjZGVmaW5lIFNEX1BVU0hfUE9JTlRfQ1RMCQkweEZEQTgKKyNkZWZpbmUgU0RfQ01EMAkJCQkweEZEQTkKKyNkZWZpbmUgU0RfQ01EMQkJCQkweEZEQUEKKyNkZWZpbmUgU0RfQ01EMgkJCQkweEZEQUIKKyNkZWZpbmUgU0RfQ01EMwkJCQkweEZEQUMKKyNkZWZpbmUgU0RfQ01ENAkJCQkweEZEQUQKKyNkZWZpbmUgU0RfQ01ENQkJCQkweEZEQUUKKyNkZWZpbmUgU0RfQllURV9DTlRfTAkJCTB4RkRBRgorI2RlZmluZSBTRF9CWVRFX0NOVF9ICQkJMHhGREIwCisjZGVmaW5lIFNEX0JMT0NLX0NOVF9MCQkJMHhGREIxCisjZGVmaW5lIFNEX0JMT0NLX0NOVF9ICQkJMHhGREIyCisjZGVmaW5lIFNEX1RSQU5TRkVSCQkJMHhGREIzCisjZGVmaW5lIFNEX0NNRF9TVEFURQkJCTB4RkRCNQorI2RlZmluZSBTRF9EQVRBX1NUQVRFCQkJMHhGREI2CisjZGVmaW5lIFNEX1ZQQ0xLMF9DVEwJCQkweEZDMkEKKyNkZWZpbmUgU0RfVlBDTEsxX0NUTAkJCTB4RkMyQgorI2RlZmluZSBTRF9EQ01QUzBfQ1RMCQkJMHhGQzJDCisjZGVmaW5lIFNEX0RDTVBTMV9DVEwJCQkweEZDMkQKKworI2RlZmluZSBDQVJEX0RNQTFfQ1RMCQkJMHhGRDVDCisKKyNkZWZpbmUgSFdfVkVSU0lPTgkJCTB4RkMwMQorCisjZGVmaW5lIFNTQ19DTEtfRlBHQV9TRUwJCTB4RkMwMgorI2RlZmluZSBDTEtfRElWCQkJCTB4RkMwMworI2RlZmluZSBTRlNNX0VECQkJCTB4RkMwNAorCisjZGVmaW5lIENEX0RFR0xJVENIX1dJRFRICQkweEZDMjAKKyNkZWZpbmUgQ0RfREVHTElUQ0hfRU4JCQkweEZDMjEKKyNkZWZpbmUgQVVUT19ERUxJTktfRU4JCQkweEZDMjMKKworI2RlZmluZSBGUEdBX1BVTExfQ1RMCQkJMHhGQzFECisjZGVmaW5lIENBUkRfQ0xLX1NPVVJDRQkJCTB4RkMyRQorCisjZGVmaW5lIENBUkRfU0hBUkVfTU9ERQkJCTB4RkQ1MQorI2RlZmluZSBDQVJEX0RSSVZFX1NFTAkJCTB4RkQ1MgorI2RlZmluZSBDQVJEX1NUT1AJCQkweEZENTMKKyNkZWZpbmUgQ0FSRF9PRQkJCQkweEZENTQKKyNkZWZpbmUgQ0FSRF9BVVRPX0JMSU5LCQkJMHhGRDU1CisjZGVmaW5lIENBUkRfR1BJTwkJCTB4RkQ1NgorI2RlZmluZSBTRDMwX0RSSVZFX1NFTAkJMHhGRDU3CisKKyNkZWZpbmUgQ0FSRF9EQVRBX1NPVVJDRQkJMHhGRDVECisjZGVmaW5lIENBUkRfU0VMRUNUCQkJMHhGRDVFCisKKyNkZWZpbmUgQ0FSRF9DTEtfRU4JCQkweEZENzkKKyNkZWZpbmUgQ0FSRF9QV1JfQ1RMCQkJMHhGRDdBCisKKyNkZWZpbmUgT0NQQ1RMCQkJCTB4RkQ4MAorI2RlZmluZSBPQ1BQQVJBMQkJCTB4RkQ4MQorI2RlZmluZSBPQ1BQQVJBMgkJCTB4RkQ4MgorI2RlZmluZSBPQ1BTVEFUCQkJCTB4RkQ4MworCisjZGVmaW5lIEhTX1VTQl9TVEFUCQkJMHhGRTAxCisjZGVmaW5lIEhTX1ZDT05UUk9MCQkJMHhGRTI2CisjZGVmaW5lIEhTX1ZTVEFJTgkJCTB4RkUyNworI2RlZmluZSBIU19WTE9BRE0JCQkweEZFMjgKKyNkZWZpbmUgSFNfVlNUQU9VVAkJCTB4RkUyOQorCisjZGVmaW5lIE1DX0lSUQkJCQkweEZGMDAKKyNkZWZpbmUgTUNfSVJRRU4JCQkweEZGMDEKKyNkZWZpbmUgTUNfRklGT19DVEwJCQkweEZGMDIKKyNkZWZpbmUgTUNfRklGT19CQzAJCQkweEZGMDMKKyNkZWZpbmUgTUNfRklGT19CQzEJCQkweEZGMDQKKyNkZWZpbmUgTUNfRklGT19TVEFUCQkJMHhGRjA1CisjZGVmaW5lIE1DX0ZJRk9fTU9ERQkJCTB4RkYwNgorI2RlZmluZSBNQ19GSUZPX1JEX1BUUjAJCTB4RkYwNworI2RlZmluZSBNQ19GSUZPX1JEX1BUUjEJCTB4RkYwOAorI2RlZmluZSBNQ19ETUFfQ1RMCQkJMHhGRjEwCisjZGVmaW5lIE1DX0RNQV9UQzAJCQkweEZGMTEKKyNkZWZpbmUgTUNfRE1BX1RDMQkJCTB4RkYxMgorI2RlZmluZSBNQ19ETUFfVEMyCQkJMHhGRjEzCisjZGVmaW5lIE1DX0RNQV9UQzMJCQkweEZGMTQKKyNkZWZpbmUgTUNfRE1BX1JTVAkJCTB4RkYxNQorCisvKiBNZW1vcnkgbWFwcGluZyAqLworI2RlZmluZSBSQlVGX1NJWkVfTUFTSwkJMHhGQkZGCisjZGVmaW5lIFJCVUZfQkFTRQkJCTB4RjAwMAorI2RlZmluZSBQUEJVRl9CQVNFMQkJCTB4RjgwMAorI2RlZmluZSBQUEJVRl9CQVNFMgkJCTB4RkEwMAorCisvKiBpbnQgbW9uaXRvcl9jYXJkX2NkICovCisjZGVmaW5lIENEX0VYSVNUCQkJMAorI2RlZmluZSBDRF9OT1RfRVhJU1QJCQkxCisKKyNkZWZpbmUgREVCT1VOQ0VfQ05UCQkJNQorCitpbnQgbW9uaXRvcl9jYXJkX2NkKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggY2FyZCk7CisKK3ZvaWQgZG9fcmVtYWluaW5nX3dvcmsoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKTsKK3ZvaWQgZG9fcmVzZXRfeGRfY2FyZChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApOwordm9pZCBkb19yZXNldF9zZF9jYXJkKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7Cit2b2lkIGRvX3Jlc2V0X21zX2NhcmQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKTsKK3ZvaWQgcnRzNTF4X2luaXRfY2FyZHMoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKTsKK3ZvaWQgcnRzNTF4X3JlbGVhc2VfY2FyZHMoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKTsKK2ludCBzd2l0Y2hfc3NjX2Nsb2NrKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgaW50IGNsayk7CitpbnQgc3dpdGNoX25vcm1hbF9jbG9jayhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIGludCBjbGspOworaW50IGNhcmRfcncoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHUzMiBzZWNfYWRkciwKKwkgICAgdTE2IHNlY19jbnQpOwordTggZ2V0X2x1bl9jYXJkKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IGx1bik7CitpbnQgY2FyZF9zaGFyZV9tb2RlKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgaW50IGNhcmQpOworaW50IHJ0czUxeF9zZWxlY3RfY2FyZChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIGludCBjYXJkKTsKK3ZvaWQgZWplY3RfY2FyZChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBsdW4pOwordm9pZCB0cmFuc19kbWFfZW5hYmxlKGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLAorCQkgICAgICB1MzIgYnl0ZV9jbnQsIHU4IHBhY2tfc2l6ZSk7CitpbnQgZW5hYmxlX2NhcmRfY2xvY2soc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCBjYXJkKTsKK2ludCBkaXNhYmxlX2NhcmRfY2xvY2soc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCBjYXJkKTsKK2ludCBjYXJkX3Bvd2VyX29uKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggY2FyZCk7CitpbnQgY2FyZF9wb3dlcl9vZmYoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCBjYXJkKTsKK2ludCB0b2dnbGVfZ3BpbyhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IGdwaW8pOworaW50IHR1cm5fb25fbGVkKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggZ3Bpbyk7CitpbnQgdHVybl9vZmZfbGVkKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggZ3Bpbyk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX2NhcmRfcmVhZHkoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgbHVuKQoreworCWlmIChjaGlwLT5jYXJkX3JlYWR5ICYgY2hpcC0+bHVuMmNhcmRbbHVuXSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfY2FyZF9leGlzdChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBsdW4pCit7CisJaWYgKGNoaXAtPmNhcmRfZXhpc3QgJiBjaGlwLT5sdW4yY2FyZFtsdW5dKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjaGVja19jYXJkX3dwKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IGx1bikKK3sKKwlpZiAoY2hpcC0+Y2FyZF93cCAmIGNoaXAtPmx1bjJjYXJkW2x1bl0pCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX2NhcmRfZmFpbChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBsdW4pCit7CisJaWYgKGNoaXAtPmNhcmRfZmFpbCAmIGNoaXAtPmx1bjJjYXJkW2x1bl0pCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX2NhcmRfZWplY3RlZChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBsdW4pCit7CisJaWYgKGNoaXAtPmNhcmRfZWplY3RlZCAmIGNoaXAtPmx1bjJjYXJkW2x1bl0pCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX2Zha2VfY2FyZF9yZWFkeShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsCisJCQkJCXVuc2lnbmVkIGludCBsdW4pCit7CisJaWYgKGNoaXAtPmZha2VfY2FyZF9yZWFkeSAmIGNoaXAtPmx1bjJjYXJkW2x1bl0pCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggZ2V0X2x1bjJjYXJkKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IGx1bikKK3sKKwlyZXR1cm4gY2hpcC0+bHVuMmNhcmRbbHVuXTsKK30KKworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfbHVuX21jKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IGx1bikKK3sKKwlyZXR1cm4gQ0hLX0JJVChjaGlwLT5sdW5fbWMsIGx1bik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbHVuX21jKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IGx1bikKK3sKKwlTRVRfQklUKGNoaXAtPmx1bl9tYywgbHVuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX2x1bl9tYyhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBsdW4pCit7CisJQ0xSX0JJVChjaGlwLT5sdW5fbWMsIGx1bik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHN3aXRjaF9jbG9jayhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIGludCBjbGspCit7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAoY2hpcC0+YXNpY19jb2RlKQorCQlyZXR2YWwgPSBzd2l0Y2hfc3NjX2Nsb2NrKGNoaXAsIGNsayk7CisJZWxzZQorCQlyZXR2YWwgPSBzd2l0Y2hfbm9ybWFsX2Nsb2NrKGNoaXAsIGNsayk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRzNTF4X2NsZWFyX3hkX2Vycm9yKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlydHM1MXhfZXAwX3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfU1RPUCwKKwkJCQkgIFhEX1NUT1AgfCBYRF9DTFJfRVJSLCBYRF9TVE9QIHwgWERfQ0xSX0VSUik7CisKKwlydHM1MXhfZXAwX3dyaXRlX3JlZ2lzdGVyKGNoaXAsIE1DX0ZJRk9fQ1RMLCBGSUZPX0ZMVVNILCBGSUZPX0ZMVVNIKTsKKwlydHM1MXhfZXAwX3dyaXRlX3JlZ2lzdGVyKGNoaXAsIE1DX0RNQV9SU1QsIERNQV9SRVNFVCwgRE1BX1JFU0VUKTsKKwlydHM1MXhfZXAwX3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNGU01fRUQsIDB4ZjgsIDB4ZjgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRzNTF4X2NsZWFyX3NkX2Vycm9yKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlydHM1MXhfZXAwX3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfU1RPUCwKKwkJCQkgIFNEX1NUT1AgfCBTRF9DTFJfRVJSLCBTRF9TVE9QIHwgU0RfQ0xSX0VSUik7CisKKwlydHM1MXhfZXAwX3dyaXRlX3JlZ2lzdGVyKGNoaXAsIE1DX0ZJRk9fQ1RMLCBGSUZPX0ZMVVNILCBGSUZPX0ZMVVNIKTsKKwlydHM1MXhfZXAwX3dyaXRlX3JlZ2lzdGVyKGNoaXAsIE1DX0RNQV9SU1QsIERNQV9SRVNFVCwgRE1BX1JFU0VUKTsKKwlydHM1MXhfZXAwX3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNGU01fRUQsIDB4ZjgsIDB4ZjgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcnRzNTF4X2NsZWFyX21zX2Vycm9yKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlydHM1MXhfZXAwX3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfU1RPUCwKKwkJCQkgIE1TX1NUT1AgfCBNU19DTFJfRVJSLCBNU19TVE9QIHwgTVNfQ0xSX0VSUik7CisKKwlydHM1MXhfZXAwX3dyaXRlX3JlZ2lzdGVyKGNoaXAsIE1DX0ZJRk9fQ1RMLCBGSUZPX0ZMVVNILCBGSUZPX0ZMVVNIKTsKKwlydHM1MXhfZXAwX3dyaXRlX3JlZ2lzdGVyKGNoaXAsIE1DX0RNQV9SU1QsIERNQV9SRVNFVCwgRE1BX1JFU0VUKTsKKwlydHM1MXhfZXAwX3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNGU01fRUQsIDB4ZjgsIDB4ZjgpOworfQorCisjZW5kaWYgLyogX19SVFM1MVhfQ0FSRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfY2hpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X2NoaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGMwZDAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X2NoaXAuYwpAQCAtMCwwICsxLDExNjcgQEAKKy8qIERyaXZlciBmb3IgUmVhbHRlayBSVFM1MXh4IFVTQiBjYXJkIHJlYWRlcgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5IFJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3JwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBBdXRob3I6CisgKiAgIHd3YW5nICh3ZWlfd2FuZ0ByZWFsc2lsLmNvbS5jbikKKyAqICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisgKiBNYWludGFpbmVyOgorICogICBFZHdpbiBSb25nIChlZHdpbl9yb25nQHJlYWxzaWwuY29tLmNuKQorICogICBOby4gNDUwLCBTaGVuaHUgUm9hZCwgU3V6aG91IEluZHVzdHJ5IFBhcmssIFN1emhvdSwgQ2hpbmEKKyAqLworCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInRyYWNlLmgiCisjaW5jbHVkZSAicnRzNTF4LmgiCisjaW5jbHVkZSAicnRzNTF4X2NoaXAuaCIKKyNpbmNsdWRlICJydHM1MXhfY2FyZC5oIgorI2luY2x1ZGUgInJ0czUxeF90cmFuc3BvcnQuaCIKKyNpbmNsdWRlICJydHM1MXhfc3lzLmgiCisjaW5jbHVkZSAieGQuaCIKKyNpbmNsdWRlICJtcy5oIgorI2luY2x1ZGUgInNkLmgiCisKK3N0YXRpYyBpbnQgY2hlY2tfc2Rfc3BlZWRfcHJpb3IodTMyIHNkX3NwZWVkX3ByaW9yKQoreworCWludCBpLCBmYWtlX3BhcmEgPSAwOworCisJLyogQ2hlY2sgdGhlIGxlZ2FsaXR5IG9mIHNkX3NwZWVkX3ByaW9yICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQl1OCB0bXAgPSAodTgpIChzZF9zcGVlZF9wcmlvciA+PiAoaSAqIDgpKTsKKwkJaWYgKCh0bXAgPCAweDAxKSB8fCAodG1wID4gMHgwNCkpIHsKKwkJCWZha2VfcGFyYSA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAhZmFrZV9wYXJhOworfQorCitpbnQgcnRzNTF4X3Jlc2V0X2NoaXAoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCWludCByZXR2YWw7CisKKwlpZiAoQ0hFQ0tfUEtHKGNoaXAsIExRRlA0OCkpIHsKKwkJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BXUl9DVEwsIExETzMzMThfUFdSX01BU0ssCisJCQkJIExET19TVVNQRU5EKTsKKwkJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BXUl9DVEwsIEZPUkNFX0xET19QT1dFUkIsCisJCQkJIEZPUkNFX0xET19QT1dFUkIpOworCQlSVFM1MVhfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEwxLCAweDMwLCAweDEwKTsKKwkJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BVTExfQ1RMNSwgMHgwMywgMHgwMSk7CisJCVJUUzUxWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QVUxMX0NUTDYsIDB4MEMsIDB4MDQpOworCX0KKwlpZiAoY2hpcC0+YXNpY19jb2RlKSB7CisJCVJUUzUxWF9XUklURV9SRUcoY2hpcCwgU1lTX0RVTU1ZMCwgTllFVF9NU0FLLCBOWUVUX0VOKTsKKwkJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBDRF9ERUdMSVRDSF9XSURUSCwgMHhGRiwgMHgwOCk7CisJCXJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDRF9ERUdMSVRDSF9FTiwgWERfQ0RfREVHTElUQ0hfRU4sCisJCQkJICAgICAgMHgwMCk7CisJCXJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRDMwX0RSSVZFX1NFTCwgU0QzMF9EUklWRV9NQVNLLAorCQkJCSAgICAgIGNoaXAtPm9wdGlvbi5zZDMwX3BhZF9kcml2ZSk7CisJCXJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0RSSVZFX1NFTCwgU0QyMF9EUklWRV9NQVNLLAorCQkJCSAgICAgIGNoaXAtPm9wdGlvbi5zZDIwX3BhZF9kcml2ZSk7CisJCWlmIChjaGlwLT5ydHM1MTc5KQorCQkJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEw1LCAweDAzLCAweDAxKTsKKwkJaWYgKCFjaGlwLT5vcHRpb24ud3dfZW5hYmxlKSB7CisJCQlpZiAoQ0hFQ0tfUEtHKGNoaXAsIExRRlA0OCkpIHsKKwkJCQlydHM1MXhfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDMsCisJCQkJCQkgICAgICAweDgwLCAweDgwKTsKKwkJCQlydHM1MXhfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDYsCisJCQkJCQkgICAgICAweGYwLCAweEEwKTsKKwkJCX0gZWxzZSB7CisJCQkJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEwxLAorCQkJCQkJICAgICAgMHgzMCwgMHgyMCk7CisJCQkJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEwzLAorCQkJCQkJICAgICAgMHg4MCwgMHg4MCk7CisJCQkJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEw2LAorCQkJCQkJICAgICAgMHgwYywgMHgwOCk7CisJCQl9CisJCX0KKwl9CisJaWYgKGNoaXAtPm9wdGlvbi5zZF9jdGwgJiBTVVBQT1JUX1VIUzUwX01NQzQ0KSB7CisJCVNFVF9VSFM1MChjaGlwKTsKKwkJUlRTNTFYX0RFQlVHUCgib3B0aW9uIGVuYWJsZSBVSFM1MCZNTUM0NCxzZF9jdGw6MHgleFxuIiwKKwkJCWNoaXAtPm9wdGlvbi5zZF9jdGwpOworCX0gZWxzZSB7CisJCS8qIGlmKENIRUNLX1BJRChjaGlwLCAweDAxMzkpJiZDSEVDS19QS0coY2hpcCwgTFFGUDQ4KSkgKi8KKwkJaWYgKChDSEVDS19QSUQoY2hpcCwgMHgwMTM5KSAmJiBDSEVDS19QS0coY2hpcCwgTFFGUDQ4KSkKKwkJICAgIHx8IGNoaXAtPnJ0czUxNzkpIHsKKwkJCVNFVF9VSFM1MChjaGlwKTsKKwkJCVJUUzUxWF9ERUJVR1AoIlBJRCBlbmFibGUgVUhTNTAmTU1DNDRcbiIpOworCQl9IGVsc2UgeworCQkJQ0xFQVJfVUhTNTAoY2hpcCk7CisJCQlSVFM1MVhfREVCVUdQKCJQSUQgZGlzYWJsZSBVSFM1MCZNTUM0NFxuIik7CisJCX0KKwl9CisKKwlpZiAoY2hpcC0+b3B0aW9uLm1zX2VycnJlZ19maXggJiYgKGNoaXAtPmljX3ZlcnNpb24gPiAxKSkKKwkJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIDB4RkQ0RCwgMHgwMSwgMHgwMSk7CisJcmV0dmFsID0gcnRzNTF4X3dyaXRlX3BoeV9yZWdpc3RlcihjaGlwLCAweEMyLCAweDdDKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCS8qIEdQSU8gT0UgKi8KKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX0dQSU8sIEdQSU9fT0UsIEdQSU9fT0UpOworI2lmZGVmIExFRF9BVVRPX0JMSU5LCisJLyogTEVEIGF1dG9ibGluayAqLworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfQVVUT19CTElOSywKKwkJICAgICAgIEJMSU5LX0VOQUJMRSB8IEJMSU5LX1NQRUVEX01BU0ssCisJCSAgICAgICBCTElOS19FTkFCTEUgfCBjaGlwLT5vcHRpb24ubGVkX2JsaW5rX3NwZWVkKTsKKyNlbmRpZgorCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfRE1BMV9DVEwsCisJCSAgICAgICBFWFRFTkRfRE1BMV9BU1lOQ19TSUdOQUwsIEVYVEVORF9ETUExX0FTWU5DX1NJR05BTCk7CisKKwlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DLCAxMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworI2lmZGVmIFNVUFBPUlRfT0NQCisJaWYgKGNoaXAtPmFzaWNfY29kZSkgeworCQlydHM1MXhfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgT0NQQ1RMLCBNU19PQ1BfREVURUNUX0VOLAorCQkJCSAgICAgIE1TX09DUF9ERVRFQ1RfRU4pOworCQlSVFM1MVhfREVCVUdQKCJFbmFibGUgT0NQIGRldGVjdCFcbiIpOworCX0KKyNlbmRpZgorCWlmIChjaGlwLT5vcHRpb24uRlQyX2Zhc3RfbW9kZSkgeworCQljYXJkX3Bvd2VyX29uKGNoaXAsIFNEX0NBUkQgfCBNU19DQVJEIHwgWERfQ0FSRCk7CisJCXdhaXRfdGltZW91dCgxMCk7CisJfQorCXJ0czUxeF9jbGVhcl9zdGFydF90aW1lKGNoaXApOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitpbnQgcnRzNTF4X2luaXRfY2hpcChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJaW50IHJldHZhbDsKKwl1OCB2YWw7CisKKwljaGlwLT5tYXhfbHVuID0gMDsKKwljaGlwLT5jdXJfY2xrID0gMDsKKwljaGlwLT5jdXJfY2FyZCA9IDA7CisKKwljaGlwLT5jYXJkMmx1bltYRF9DQVJEXSA9IDA7CisJY2hpcC0+Y2FyZDJsdW5bU0RfQ0FSRF0gPSAwOworCWNoaXAtPmNhcmQybHVuW01TX0NBUkRdID0gMDsKKwljaGlwLT5jYXJkX2VqZWN0ZWQgPSAwOworCisJY2hpcC0+bHVuMmNhcmRbMF0gPSBYRF9DQVJEIHwgU0RfQ0FSRCB8IE1TX0NBUkQ7CisjaWYgMAorCWNoaXAtPm9wdGlvbi5zZHI1MF90eF9waGFzZSA9IDB4MDE7CisJY2hpcC0+b3B0aW9uLnNkcjUwX3J4X3BoYXNlID0gMHgwNTsKKwljaGlwLT5vcHRpb24uZGRyNTBfdHhfcGhhc2UgPSAweDA5OworCWNoaXAtPm9wdGlvbi5kZHI1MF9yeF9waGFzZSA9IDB4MDY7IC8qIGFkZCBmb3IgZGVidWcgKi8KKyNlbmRpZgorI2lmZGVmIENMT1NFX1NTQ19QT1dFUgorCXJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBGUERDVEwsIFNTQ19QT1dFUl9NQVNLLCBTU0NfUE9XRVJfT04pOworCXVkZWxheSgxMDApOworCXJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDTEtfRElWLCBDTEtfQ0hBTkdFLCAweDAwKTsKKyNlbmRpZgorCVJUUzUxWF9TRVRfU1RBVChjaGlwLCBTVEFUX1JVTik7CisKKwlSVFM1MVhfUkVBRF9SRUcoY2hpcCwgSFdfVkVSU0lPTiwgJnZhbCk7CisJaWYgKCh2YWwgJiAweDBmKSA+PSAyKQorCQljaGlwLT5vcHRpb24ucmNjX2J1Z19maXhfZW4gPSAwOworCVJUUzUxWF9ERUJVR1AoInJjYyBidWcgZml4IGVuYWJsZTolZFxuIiwgY2hpcC0+b3B0aW9uLnJjY19idWdfZml4X2VuKTsKKwlSVFM1MVhfREVCVUdQKCJIV19WRVJTSU9OOiAweCV4XG4iLCB2YWwpOworCWlmICh2YWwgJiBGUEdBX1ZFUikgeworCQljaGlwLT5hc2ljX2NvZGUgPSAwOworCQlSVFM1MVhfREVCVUdQKCJGUEdBIVxuIik7CisJfSBlbHNlIHsKKwkJY2hpcC0+YXNpY19jb2RlID0gMTsKKwkJUlRTNTFYX0RFQlVHUCgiQVNJQyFcbiIpOworCX0KKwljaGlwLT5pY192ZXJzaW9uID0gdmFsICYgSFdfVkVSX01BU0s7CisKKwlpZiAoIWNoZWNrX3NkX3NwZWVkX3ByaW9yKGNoaXAtPm9wdGlvbi5zZF9zcGVlZF9wcmlvcikpCisJCWNoaXAtPm9wdGlvbi5zZF9zcGVlZF9wcmlvciA9IDB4MDEwMjA0MDM7CisJUlRTNTFYX0RFQlVHUCgic2Rfc3BlZWRfcHJpb3IgPSAweCUwOHhcbiIsCisJCSAgICAgICBjaGlwLT5vcHRpb24uc2Rfc3BlZWRfcHJpb3IpOworCisJUlRTNTFYX1JFQURfUkVHKGNoaXAsIENBUkRfU0hBUkVfTU9ERSwgJnZhbCk7CisJaWYgKHZhbCAmIENBUkRfU0hBUkVfTFFGUF9TRUwpIHsKKwkJY2hpcC0+cGFja2FnZSA9IExRRlA0ODsKKwkJUlRTNTFYX0RFQlVHUCgiUGFja2FnZTogTFFGUDQ4XG4iKTsKKwl9IGVsc2UgeworCQljaGlwLT5wYWNrYWdlID0gUUZOMjQ7CisJCVJUUzUxWF9ERUJVR1AoIlBhY2thZ2U6IFFGTjI0XG4iKTsKKwl9CisKKwlSVFM1MVhfUkVBRF9SRUcoY2hpcCwgSFNfVVNCX1NUQVQsICZ2YWwpOworCWlmICh2YWwgJiBVU0JfSElfU1BFRUQpIHsKKwkJY2hpcC0+dXNiX3NwZWVkID0gVVNCXzIwOworCQlSVFM1MVhfREVCVUdQKCJVU0IgSGlnaCBTcGVlZFxuIik7CisJfSBlbHNlIHsKKwkJY2hpcC0+dXNiX3NwZWVkID0gVVNCXzExOworCQlSVFM1MVhfREVCVUdQKCJVU0IgRnVsbCBTcGVlZFxuIik7CisJfQorCisJUlRTNTFYX1JFQURfUkVHKGNoaXAsIENGR19NT0RFXzEsICZ2YWwpOworCWlmICh2YWwgJiBSVFM1MTc5KSB7CisJCWNoaXAtPnJ0czUxNzkgPSAxOworCQlSVFM1MVhfREVCVUdQKCJkZXZpY2UgaXMgcnRzNTE3OVxuIik7CisJfSBlbHNlIHsKKwkJY2hpcC0+cnRzNTE3OSA9IDA7CisJfQorCisJcmV0dmFsID0gcnRzNTF4X3Jlc2V0X2NoaXAoY2hpcCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworaW50IHJ0czUxeF9yZWxlYXNlX2NoaXAoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXhkX2ZyZWVfbDJwX3RibChjaGlwKTsKKwltc19mcmVlX2wycF90YmwoY2hpcCk7CisJY2hpcC0+Y2FyZF9yZWFkeSA9IDA7CisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCisjaWZuZGVmIExFRF9BVVRPX0JMSU5LCitzdGF0aWMgaW5saW5lIHZvaWQgcnRzNTF4X2JsaW5rX2xlZChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJLyogUmVhZC9Xcml0ZSAqLworCWlmIChjaGlwLT5jYXJkX3JlYWR5KSB7CisJCWlmIChjaGlwLT5sZWRfdG9nZ2xlX2NvdW50ZXIgPAorCQkJCWNoaXAtPm9wdGlvbi5sZWRfdG9nZ2xlX2ludGVydmFsKSB7CisJCQljaGlwLT5sZWRfdG9nZ2xlX2NvdW50ZXIrKzsKKwkJfSBlbHNlIHsKKwkJCWNoaXAtPmxlZF90b2dnbGVfY291bnRlciA9IDA7CisJCQl0b2dnbGVfZ3BpbyhjaGlwLCBMRURfR1BJTyk7CisJCX0KKwl9Cit9CisjZW5kaWYKKworaW50IHJ0czUxeF9jaGVja19zdGFydF90aW1lKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCBydHM1MXhfc2V0X3N0YXJ0X3RpbWUoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworfQorCit2b2lkIHJ0czUxeF9jbGVhcl9zdGFydF90aW1lKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKK30KKworc3RhdGljIHZvaWQgcnRzNTF4X2F1dG9fZGVsaW5rX2NtZChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIEFVVE9fREVMSU5LX0VOLAorCQkJQVVUT19ERUxJTkssIEFVVE9fREVMSU5LKTsKK30KKworc3RhdGljIHZvaWQgcnRzNTF4X2F1dG9fZGVsaW5rX2ZvcmNlX2NtZChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIEFVVE9fREVMSU5LX0VOLAorCQkJQVVUT19ERUxJTksgfCBGT1JDRV9ERUxJTkssCisJCQlBVVRPX0RFTElOSyB8IEZPUkNFX0RFTElOSyk7Cit9CisKKyNpZmRlZiBVU0lOR19QT0xMSU5HX0NZQ0xFX0RFTElOSworLyogdXNpbmcgcG9sbGluZyBjeWNsZSBhcyBkZWxpbmsgdGltZSAqLworc3RhdGljIHZvaWQgcnRzNTF4X2F1dG9fZGVsaW5rX3BvbGxpbmdfY3ljbGUoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCWlmIChjaGlwLT5hdXRvX2RlbGlua19jb3VudGVyIDw9CisJCQljaGlwLT5vcHRpb24uZGVsaW5rX2RlbGF5ICogMikgeworCQlpZiAoY2hpcC0+YXV0b19kZWxpbmtfY291bnRlciA9PQorCQkgICAgY2hpcC0+b3B0aW9uLmRlbGlua19kZWxheSkgeworCQkJY2xlYXJfZmlyc3RfaW5zdGFsbF9tYXJrKGNoaXApOworCQkJaWYgKGNoaXAtPmNhcmRfZXhpc3QpIHsKKwkJCQkvKiBGYWxzZSBjYXJkICovCisJCQkJaWYgKCFjaGlwLT5jYXJkX2VqZWN0ZWQpIHsKKwkJCQkJLyogaWYgY2FyZCBpcyBub3QgZWplY3RlZCBvciBzYWZlbHkKKwkJCQkJICogcmVtb3ZlLHRoZW4gZG8gZm9yY2UgZGVsaW5rICovCisJCQkJCVJUUzUxWF9ERUJVR1AoIkZhbHNlIGNhcmQgaW5zZXJ0ZWQsIgorCQkJCQkJCSJkbyBmb3JjZSBkZWxpbmtcbiIpOworCQkJCQlydHM1MXhfYXV0b19kZWxpbmtfZm9yY2VfY21kKGNoaXApOworCQkJCQljaGlwLT5hdXRvX2RlbGlua19jb3VudGVyID0KKwkJCQkJICAgIGNoaXAtPm9wdGlvbi5kZWxpbmtfZGVsYXkgKiAyICsgMTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCVJUUzUxWF9ERUJVR1AoIk5vIGNhcmQgaW5zZXJ0ZWQsIGRvIGRlbGlua1xuIik7CisJCQkJLyogcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFdSX0NUTCwKKwkJCQkJCURWMzMxOF9BVVRPX1BXUl9PRkYsIDApOyAqLworCQkJCXJ0czUxeF9hdXRvX2RlbGlua19jbWQoY2hpcCk7CisJCQl9CisJCX0KKwkJaWYgKGNoaXAtPmF1dG9fZGVsaW5rX2NvdW50ZXIgPT0KKwkJICAgIGNoaXAtPm9wdGlvbi5kZWxpbmtfZGVsYXkgKiAyKSB7CisJCQlSVFM1MVhfREVCVUdQKCJUcnkgdG8gZG8gZm9yY2UgZGVsaW5rXG4iKTsKKwkJCXJ0czUxeF9hdXRvX2RlbGlua19mb3JjZV9jbWQoY2hpcCk7CisJCX0KKwkJY2hpcC0+YXV0b19kZWxpbmtfY291bnRlcisrOworCX0KK30KKworc3RhdGljIHZvaWQgcnRzNTF4X2F1dG9fZGVsaW5rKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlydHM1MXhfYXV0b19kZWxpbmtfcG9sbGluZ19jeWNsZShjaGlwKTsKK30KKyNlbHNlCisvKiBzb21lIG9mIGNhbGxlZCBmdW5jcyBhcmUgbm90IGltcGxlbWVudGVkLCBzbyBjb21tZW50IGl0IG91dCAqLworI2lmIDAKKy8qIHVzaW5nIHByZWNpc2UgdGltZSBhcyBkZWxpbmsgdGltZSAqLworc3RhdGljIHZvaWQgcnRzNTF4X2F1dG9fZGVsaW5rX3ByZWNpc2VfdGltZShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJaW50IHJldHZhbHVlID0gMDsKKworCXJldHZhbHVlID0gcnRzNTF4X2dldF9jYXJkX3N0YXR1cyhjaGlwLCAmY2hpcC0+Y2FyZF9zdGF0dXMpOworCS8qIGdldCBjYXJkIENEIHN0YXR1cyBzdWNjZXNzIGFuZCBjYXJkIENEIG5vdCBleGlzdCwKKwkgKiB0aGVuIGNoZWNrIHdoZXRoZXIgZGVsaW5rICovCisJaWYgKChyZXR2YWx1ZSA9PSBTVEFUVVNfU1VDQ0VTUykKKwkgICAgJiYgKCEoY2hpcC0+Y2FyZF9zdGF0dXMgJiAoU0RfQ0QgfCBNU19DRCB8IFhEX0NEKSkpKSB7CisJCWlmIChydHM1MXhfY291bnRfZGVsaW5rX3RpbWUoY2hpcCkgPj0KKwkJICAgIGNoaXAtPm9wdGlvbi5kZWxpbmtfZGVsYXkpIHsKKwkJCWNsZWFyX2ZpcnN0X2luc3RhbGxfbWFyayhjaGlwKTsKKwkJCVJUUzUxWF9ERUJVR1AoIk5vIGNhcmQgaW5zZXJ0ZWQsIGRvIGRlbGlua1xuIik7CisJCQkvKiBzYW5nZHkyMDEwLTA1LTE3OmRpc2FibGUgYmVjYXVzZSB0aGVyZSBpcyBlcnJvcgorCQkJICogYWZ0ZXIgU1NDIGNsb2NrIGNsb3NlZCBhbmQgY2FyZCBwb3dlcgorCQkJICogaGFzIGJlZW4gY2xvc2VkIGJlZm9yZSAqLworCQkJLyogcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFdSX0NUTCwKKwkJCQkJRFYzMzE4X0FVVE9fUFdSX09GRiwgMCk7ICovCisJCQlydHM1MXhfYXV0b19kZWxpbmtfY21kKGNoaXApOworCX0KKwkvKiBjYXJkIENEIGV4aXN0IGFuZCBub3QgcmVhZHksIHRoZW4gZG8gZm9yY2UgZGVsaW5rICovCisJaWYgKChyZXR2YWx1ZSA9PSBTVEFUVVNfU1VDQ0VTUykKKwkgICAgJiYgKGNoaXAtPmNhcmRfc3RhdHVzICYgKFNEX0NEIHwgTVNfQ0QgfCBYRF9DRCkpKSB7CisJCS8qIGlmIGNhcmQgaXMgbm90IGVqZWN0ZWQgb3Igc2FmZWx5IHJlbW92ZSwKKwkJICogdGhlbiBkbyBmb3JjZSBkZWxpbmsgKi8KKwkJaWYgKCFjaGlwLT5jYXJkX2VqZWN0ZWQpIHsKKwkJCS8qIHNhbmdkeTIwMTAtMTEtMTY6cG9sbGluZyBhdCBsZWFzdCAyIGN5Y2xlcworCQkJICogdGhlbiBkbyBmb3JjZSBkZWxpbmsgZm9yIGNhcmQgbWF5IGZvcmNlIGRlbGluaworCQkJICogaWYgY2FyZCBpcyBleHRyYWN0ZWQgYW5kIGluc2VydCBxdWlja2x5CisJCQkgKiBhZnRlciByZWFkeS4gKi8KKwkJCWlmIChjaGlwLT5hdXRvX2RlbGlua19jb3VudGVyID4gMSkgeworCQkJCWlmIChydHM1MXhfY291bnRfZGVsaW5rX3RpbWUoY2hpcCkgPgorCQkJCSAgICBjaGlwLT5vcHRpb24uZGVsaW5rX2RlbGF5ICogMikgeworCQkJCQlSVFM1MVhfREVCVUdQKCJUcnkgdG8gZG8gZm9yY2UiCisJCQkJCQkJImRlbGlua1xuIik7CisJCQkJCXJ0czUxeF9hdXRvX2RlbGlua19mb3JjZV9jbWQoY2hpcCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWNoaXAtPmF1dG9fZGVsaW5rX2NvdW50ZXIrKzsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBydHM1MXhfYXV0b19kZWxpbmtfcHJlY2lzZV90aW1lKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBydHM1MXhfYXV0b19kZWxpbmsoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXJ0czUxeF9hdXRvX2RlbGlua19wcmVjaXNlX3RpbWUoY2hpcCk7Cit9CisjZW5kaWYKKwordm9pZCBydHM1MXhfcG9sbGluZ19mdW5jKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKyNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKKwlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CisKKwlpZiAoc2RfY2FyZC0+c2RfZXJhc2Vfc3RhdHVzKSB7CisJCWlmIChjaGlwLT5jYXJkX2V4aXN0ICYgU0RfQ0FSRCkgeworCQkJdTggdmFsOworCQkJcnRzNTF4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgU0RfQlVTX1NUQVQsICZ2YWwpOworCQkJaWYgKHZhbCAmIFNEX0RBVDBfU1RBVFVTKSB7CisJCQkJLyogRXJhc2UgY29tcGxldGVkICovCisJCQkJc2RfY2FyZC0+c2RfZXJhc2Vfc3RhdHVzID0gU0RfTk9UX0VSQVNFOworCQkJCXNkX2NhcmQtPnNkX2xvY2tfbm90aWZ5ID0gMTsKKworCQkJCS8qIFNEIGNhcmQgc2hvdWxkIGJlIHJlaW5pdGVkLAorCQkJCSAqIHNvIHdlIHJlbGVhc2UgaXQgaGVyZS4gKi8KKwkJCQlzZF9jbGVhbnVwX3dvcmsoY2hpcCk7CisJCQkJcmVsZWFzZV9zZF9jYXJkKGNoaXApOworCQkJCWNoaXAtPmNhcmRfcmVhZHkgJj0gflNEX0NBUkQ7CisJCQkJY2hpcC0+Y2FyZF9leGlzdCAmPSB+U0RfQ0FSRDsKKwkJCQljaGlwLT5yd19jYXJkW2NoaXAtPmNhcmQybHVuW1NEX0NBUkRdXSA9IE5VTEw7CisJCQkJY2xlYXJfYml0KGNoaXAtPmNhcmQybHVuW1NEX0NBUkRdLAorCQkJCQkgICYoY2hpcC0+bHVuX21jKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzZF9jYXJkLT5zZF9lcmFzZV9zdGF0dXMgPSBTRF9OT1RfRVJBU0U7CisJCX0KKwl9CisjZW5kaWYKKworCXJ0czUxeF9pbml0X2NhcmRzKGNoaXApOworCisjaWZkZWYgU1VQUE9SVF9PQ1AKKwkvKiBpZiBPQ1AgaGFwcGVuIGFuZCBjYXJkIGV4aXN0LCB0aGVuIGNsb3NlIGNhcmQgT0UgKi8KKwlpZiAoKGNoaXAtPm9jcF9zdGF0ICYgKE1TX09DUF9OT1cgfCBNU19PQ1BfRVZFUikpICYmCisJCQkoY2hpcC0+Y2FyZF9leGlzdCkpIHsKKworCQlydHM1MXhfcHJlcGFyZV9ydW4oY2hpcCk7CisKKwkJaWYgKGNoaXAtPmNhcmRfZXhpc3QgJiBTRF9DQVJEKQorCQkJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfT0UsIFNEX09VVFBVVF9FTiwgMCk7CisJCWVsc2UgaWYgKGNoaXAtPmNhcmRfZXhpc3QgJiBNU19DQVJEKQorCQkJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfT0UsIE1TX09VVFBVVF9FTiwgMCk7CisJCWVsc2UgaWYgKGNoaXAtPmNhcmRfZXhpc3QgJiBYRF9DQVJEKQorCQkJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfT0UsIFhEX09VVFBVVF9FTiwgMCk7CisJfQorI2VuZGlmCisKKwlpZiAoY2hpcC0+aWRsZV9jb3VudGVyIDwgSURMRV9NQVhfQ09VTlQpIHsKKwkJY2hpcC0+aWRsZV9jb3VudGVyKys7CisJfSBlbHNlIHsKKwkJaWYgKCFSVFM1MVhfQ0hLX1NUQVQoY2hpcCwgU1RBVF9JRExFKSkgeworCQkJUlRTNTFYX0RFQlVHUCgiSWRsZSBzdGF0ZSFcbiIpOworCQkJUlRTNTFYX1NFVF9TVEFUKGNoaXAsIFNUQVRfSURMRSk7CisjaWZuZGVmIExFRF9BVVRPX0JMSU5LCisJCQljaGlwLT5sZWRfdG9nZ2xlX2NvdW50ZXIgPSAwOworI2VuZGlmCisJCQkvKiBJZGxlIHN0YXRlLCB0dXJuIG9mZiBMRUQKKwkJCSAqIHRvIHJlZHVjZSBwb3dlciBjb25zdW1wdGlvbiAqLworCQkJaWYgKGNoaXAtPm9wdGlvbi5sZWRfYWx3YXlzX29uCisJCQkgICAgJiYgKGNoaXAtPmNhcmRfZXhpc3QgJgorCQkJCShTRF9DQVJEIHwgTVNfQ0FSRCB8IFhEX0NBUkQpKQorCQkJICAgICYmICghY2hpcC0+Y2FyZF9lamVjdGVkKSkgeworCQkJCXR1cm5fb25fbGVkKGNoaXAsIExFRF9HUElPKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGNoaXAtPnJ0czUxNzkpIHsKKwkJCQkJcnRzNTF4X2VwMF93cml0ZV9yZWdpc3RlcihjaGlwLAorCQkJCQkJCQkgIENBUkRfR1BJTywKKwkJCQkJCQkJICAweDAzLCAweDAwKTsKKwkJCQl9IGVsc2UgeworCQkJCQl0dXJuX29mZl9sZWQoY2hpcCwgTEVEX0dQSU8pOworCQkJCX0KKworCQkJfQorCisjaWZkZWYgQ0xPU0VfU1NDX1BPV0VSCisJCQlpZiAoIWNoaXAtPmNhcmRfcmVhZHkpIHsKKwkJCQlydHM1MXhfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0xLX0RJViwgQ0xLX0NIQU5HRSwKKwkJCQkJCSAgICAgIENMS19DSEFOR0UpOworCQkJCXJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBGUERDVEwsCisJCQkJCQkgICAgICBTU0NfUE9XRVJfTUFTSywKKwkJCQkJCSAgICAgIFNTQ19QT1dFUl9ET1dOKTsKKwkJCQlSVFM1MVhfREVCVUdQKCJDbG9zZSBTU0MgY2xvY2sgcG93ZXIhXG4iKTsKKwkJCX0KKyNlbmRpZgorCQl9CisJfQorCisJc3dpdGNoIChSVFM1MVhfR0VUX1NUQVQoY2hpcCkpIHsKKwljYXNlIFNUQVRfUlVOOgorI2lmbmRlZiBMRURfQVVUT19CTElOSworCQlydHM1MXhfYmxpbmtfbGVkKGNoaXApOworI2VuZGlmCisJCWRvX3JlbWFpbmluZ193b3JrKGNoaXApOworCQlicmVhazsKKworCWNhc2UgU1RBVF9JRExFOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWlmIChjaGlwLT5vcHRpb24uYXV0b19kZWxpbmtfZW4gJiYgIWNoaXAtPmNhcmRfcmVhZHkpIHsKKwkJcnRzNTF4X2F1dG9fZGVsaW5rKGNoaXApOworCX0gZWxzZSB7CisJCWNoaXAtPmF1dG9fZGVsaW5rX2NvdW50ZXIgPSAwOworCQlydHM1MXhfY2xlYXJfc3RhcnRfdGltZShjaGlwKTsKKwl9Cit9CisKK3ZvaWQgcnRzNTF4X2FkZF9jbWQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLAorCQkgICAgdTggY21kX3R5cGUsIHUxNiByZWdfYWRkciwgdTggbWFzaywgdTggZGF0YSkKK3sKKwlpbnQgaTsKKworCWlmIChjaGlwLT5jbWRfaWR4IDwgKChDTURfQlVGX0xFTiAtIENNRF9PRkZTRVQpIC8gNCkpIHsKKwkJaSA9IENNRF9PRkZTRVQgKyBjaGlwLT5jbWRfaWR4ICogNDsKKwkJY2hpcC0+Y21kX2J1ZltpKytdID0KKwkJICAgICgoY21kX3R5cGUgJiAweDAzKSA8PCA2KSB8ICh1OCkgKChyZWdfYWRkciA+PiA4KSAmIDB4M0YpOworCQljaGlwLT5jbWRfYnVmW2krK10gPSAodTgpIHJlZ19hZGRyOworCQljaGlwLT5jbWRfYnVmW2krK10gPSBtYXNrOworCQljaGlwLT5jbWRfYnVmW2krK10gPSBkYXRhOworCQljaGlwLT5jbWRfaWR4Kys7CisJfQorfQorCitpbnQgcnRzNTF4X3NlbmRfY21kKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggZmxhZywgaW50IHRpbWVvdXQpCit7CisJaW50IHJlc3VsdDsKKworCWNoaXAtPmNtZF9idWZbQ05UX0hdID0gKHU4KSAoY2hpcC0+Y21kX2lkeCA+PiA4KTsKKwljaGlwLT5jbWRfYnVmW0NOVF9MXSA9ICh1OCkgKGNoaXAtPmNtZF9pZHgpOworCWNoaXAtPmNtZF9idWZbU1RBR0VfRkxBR10gPSBmbGFnOworCisJcmVzdWx0ID0gcnRzNTF4X3RyYW5zZmVyX2RhdGFfcmNjKGNoaXAsIFNORF9CVUxLX1BJUEUoY2hpcCksCisJCQkJCSAgKHZvaWQgKikoY2hpcC0+Y21kX2J1ZiksCisJCQkJCSAgY2hpcC0+Y21kX2lkeCAqIDQgKyBDTURfT0ZGU0VULAorCQkJCQkgIDAsIE5VTEwsIHRpbWVvdXQsIE1PREVfQyk7CisJaWYgKHJlc3VsdCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJlc3VsdCk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2ludCBydHM1MXhfZ2V0X3JzcChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIGludCByc3BfbGVuLCBpbnQgdGltZW91dCkKK3sKKwlpbnQgcmVzdWx0OworCisJaWYgKHJzcF9sZW4gPD0gMCkKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19FUlJPUik7CisJLyogcnNwX2xlbiBtdXN0IGFsaWduZWQgdG8gZHdvcmQgKi8KKwlpZiAocnNwX2xlbiAlIDQpCisJCXJzcF9sZW4gKz0gKDQgLSByc3BfbGVuICUgNCk7CisKKwlyZXN1bHQgPSBydHM1MXhfdHJhbnNmZXJfZGF0YV9yY2MoY2hpcCwgUkNWX0JVTEtfUElQRShjaGlwKSwKKwkJCQkJICAodm9pZCAqKWNoaXAtPnJzcF9idWYsIHJzcF9sZW4sCisJCQkJCSAgMCwgTlVMTCwgdGltZW91dCwgU1RBR0VfUik7CisJaWYgKHJlc3VsdCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJlc3VsdCk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2ludCBydHM1MXhfZ2V0X2NhcmRfc3RhdHVzKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTE2ICogc3RhdHVzKQoreworCWludCByZXR2YWw7CisJdTE2IHZhbDsKKworI2lmZGVmIEdFVF9DQVJEX1NUQVRVU19VU0lOR19FUEMKKwlyZXR2YWwgPSBydHM1MXhfZ2V0X2VwY19zdGF0dXMoY2hpcCwgJnZhbCk7CisKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKyNlbHNlCisJcmV0dmFsID0gcnRzNTF4X2N0cmxfdHJhbnNmZXIoY2hpcCwgUkNWX0NUUkxfUElQRShjaGlwKSwgMHgwMiwgMHhDMCwKKwkJCQkgICAgICAwLCAwLCAmdmFsLCAyLCAxMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworI2VuZGlmCisKKwlpZiAoc3RhdHVzKQorCQkqc3RhdHVzID0gdmFsOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitpbnQgcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTE2IGFkZHIsIHU4IG1hc2ssIHU4IGRhdGEpCit7CisJaW50IHJldHZhbDsKKworCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBhZGRyLCBtYXNrLCBkYXRhKTsKKwlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DLCAxMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2ludCBydHM1MXhfcmVhZF9yZWdpc3RlcihzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHUxNiBhZGRyLCB1OCAqIGRhdGEpCit7CisJaW50IHJldHZhbDsKKworCWlmIChkYXRhKQorCQkqZGF0YSA9IDA7CisJcnRzNTF4X2luaXRfY21kKGNoaXApOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgYWRkciwgMCwgMCk7CisJcmV0dmFsID0gcnRzNTF4X3NlbmRfY21kKGNoaXAsIE1PREVfQ1IsIDEwMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKworCXJldHZhbCA9IHJ0czUxeF9nZXRfcnNwKGNoaXAsIDEsIDEwMCk7CisKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJaWYgKGRhdGEpCisJCSpkYXRhID0gY2hpcC0+cnNwX2J1ZlswXTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworaW50IHJ0czUxeF9lcDBfd3JpdGVfcmVnaXN0ZXIoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1MTYgYWRkciwgdTggbWFzaywKKwkJCSAgICAgIHU4IGRhdGEpCit7CisJaW50IHJldHZhbDsKKwl1MTYgdmFsdWUgPSAwLCBpbmRleCA9IDA7CisKKwl2YWx1ZSB8PSAodTE2KSAoMyAmIDB4MDMpIDw8IDE0OworCXZhbHVlIHw9ICh1MTYpIChhZGRyICYgMHgzRkZGKTsKKwlpbmRleCB8PSAodTE2KSBtYXNrIDw8IDg7CisJaW5kZXggfD0gKHUxNikgZGF0YTsKKworCXJldHZhbCA9IHJ0czUxeF9jdHJsX3RyYW5zZmVyKGNoaXAsIFNORF9DVFJMX1BJUEUoY2hpcCksIDB4MDAsIDB4NDAsCisJCQkJICAgICAgY3B1X3RvX2JlMTYodmFsdWUpLCBjcHVfdG9fYmUxNihpbmRleCksCisJCQkJICAgICAgTlVMTCwgMCwgMTAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworaW50IHJ0czUxeF9lcDBfcmVhZF9yZWdpc3RlcihzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHUxNiBhZGRyLCB1OCAqIGRhdGEpCit7CisJaW50IHJldHZhbDsKKwl1MTYgdmFsdWUgPSAwOworCXU4IHZhbDsKKworCWlmIChkYXRhKQorCQkqZGF0YSA9IDA7CisKKwl2YWx1ZSB8PSAodTE2KSAoMiAmIDB4MDMpIDw8IDE0OworCXZhbHVlIHw9ICh1MTYpIChhZGRyICYgMHgzRkZGKTsKKworCXJldHZhbCA9IHJ0czUxeF9jdHJsX3RyYW5zZmVyKGNoaXAsIFJDVl9DVFJMX1BJUEUoY2hpcCksIDB4MDAsIDB4QzAsCisJCQkJICAgICAgY3B1X3RvX2JlMTYodmFsdWUpLCAwLCAmdmFsLCAxLCAxMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJaWYgKGRhdGEpCisJCSpkYXRhID0gdmFsOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitpbnQgcnRzNTF4X3NlcV93cml0ZV9yZWdpc3RlcihzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHUxNiBhZGRyLCB1MTYgbGVuLAorCQkJICAgICAgdTggKmRhdGEpCit7CisJaW50IHJlc3VsdDsKKwl1MTYgY21kX2xlbiA9IGxlbiArIDEyOworCisJaWYgKCFkYXRhKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0VSUk9SKTsKKworCWNtZF9sZW4gPSAoY21kX2xlbiA8PSBDTURfQlVGX0xFTikgPyBjbWRfbGVuIDogQ01EX0JVRl9MRU47CisKKwkvKiBjbWRfbGVuIG11c3QgYWxpZ25lZCB0byBkd29yZCAqLworCWlmIChjbWRfbGVuICUgNCkKKwkJY21kX2xlbiArPSAoNCAtIGNtZF9sZW4gJSA0KTsKKworCWNoaXAtPmNtZF9idWZbMF0gPSAnUic7CisJY2hpcC0+Y21kX2J1ZlsxXSA9ICdUJzsKKwljaGlwLT5jbWRfYnVmWzJdID0gJ0MnOworCWNoaXAtPmNtZF9idWZbM10gPSAnUic7CisJY2hpcC0+Y21kX2J1ZltQQUNLRVRfVFlQRV0gPSBTRVFfV1JJVEU7CisJY2hpcC0+Y21kX2J1Zls1XSA9ICh1OCkgKGxlbiA+PiA4KTsKKwljaGlwLT5jbWRfYnVmWzZdID0gKHU4KSBsZW47CisJY2hpcC0+Y21kX2J1ZltTVEFHRV9GTEFHXSA9IDA7CisJY2hpcC0+Y21kX2J1Zls4XSA9ICh1OCkgKGFkZHIgPj4gOCk7CisJY2hpcC0+Y21kX2J1Zls5XSA9ICh1OCkgYWRkcjsKKworCW1lbWNweShjaGlwLT5jbWRfYnVmICsgMTIsIGRhdGEsIGxlbik7CisKKwlyZXN1bHQgPSBydHM1MXhfdHJhbnNmZXJfZGF0YV9yY2MoY2hpcCwgU05EX0JVTEtfUElQRShjaGlwKSwKKwkJCQkJICAodm9pZCAqKShjaGlwLT5jbWRfYnVmKSwgY21kX2xlbiwgMCwKKwkJCQkJICBOVUxMLCAxMDAsIE1PREVfQyk7CisJaWYgKHJlc3VsdCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJlc3VsdCk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2ludCBydHM1MXhfc2VxX3JlYWRfcmVnaXN0ZXIoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1MTYgYWRkciwgdTE2IGxlbiwKKwkJCSAgICAgdTggKmRhdGEpCit7CisJaW50IHJlc3VsdDsKKwl1MTYgcnNwX2xlbjsKKworCWlmICghZGF0YSkKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19FUlJPUik7CisJLyogcnNwX2xlbiBtdXN0IGFsaWduZWQgdG8gZHdvcmQgKi8KKwlpZiAobGVuICUgNCkKKwkJcnNwX2xlbiA9IGxlbiArICg0IC0gbGVuICUgNCk7CisJZWxzZQorCQlyc3BfbGVuID0gbGVuOworCisJY2hpcC0+Y21kX2J1ZlswXSA9ICdSJzsKKwljaGlwLT5jbWRfYnVmWzFdID0gJ1QnOworCWNoaXAtPmNtZF9idWZbMl0gPSAnQyc7CisJY2hpcC0+Y21kX2J1ZlszXSA9ICdSJzsKKwljaGlwLT5jbWRfYnVmW1BBQ0tFVF9UWVBFXSA9IFNFUV9SRUFEOworCWNoaXAtPmNtZF9idWZbNV0gPSAodTgpIChyc3BfbGVuID4+IDgpOworCWNoaXAtPmNtZF9idWZbNl0gPSAodTgpIHJzcF9sZW47CisJY2hpcC0+Y21kX2J1ZltTVEFHRV9GTEFHXSA9IFNUQUdFX1I7CisJY2hpcC0+Y21kX2J1Zls4XSA9ICh1OCkgKGFkZHIgPj4gOCk7CisJY2hpcC0+Y21kX2J1Zls5XSA9ICh1OCkgYWRkcjsKKworCXJlc3VsdCA9IHJ0czUxeF90cmFuc2Zlcl9kYXRhX3JjYyhjaGlwLCBTTkRfQlVMS19QSVBFKGNoaXApLAorCQkJCQkgICh2b2lkICopKGNoaXAtPmNtZF9idWYpLCAxMiwgMCwgTlVMTCwKKwkJCQkJICAxMDAsIE1PREVfQyk7CisJaWYgKHJlc3VsdCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJlc3VsdCk7CisKKwlyZXN1bHQgPSBydHM1MXhfdHJhbnNmZXJfZGF0YV9yY2MoY2hpcCwgUkNWX0JVTEtfUElQRShjaGlwKSwKKwkJCQkJICAodm9pZCAqKWRhdGEsIHJzcF9sZW4sIDAsIE5VTEwsIDEwMCwKKwkJCQkJICBTVEFHRV9ESSk7CisJaWYgKHJlc3VsdCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJlc3VsdCk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2ludCBydHM1MXhfcmVhZF9wcGJ1ZihzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4ICogYnVmLCBpbnQgYnVmX2xlbikKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKCFidWYpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRVJST1IpOworCisJcmV0dmFsID0KKwkgICAgcnRzNTF4X3NlcV9yZWFkX3JlZ2lzdGVyKGNoaXAsIFBQQlVGX0JBU0UyLCAodTE2KSBidWZfbGVuLCBidWYpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitpbnQgcnRzNTF4X3dyaXRlX3BwYnVmKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggKiBidWYsIGludCBidWZfbGVuKQoreworCWludCByZXR2YWw7CisKKwlpZiAoIWJ1ZikKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19FUlJPUik7CisKKwlyZXR2YWwgPQorCSAgICBydHM1MXhfc2VxX3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFBQQlVGX0JBU0UyLCAodTE2KSBidWZfbGVuLCBidWYpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitpbnQgcnRzNTF4X3dyaXRlX3BoeV9yZWdpc3RlcihzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IGFkZHIsIHU4IHZhbCkKK3sKKwlpbnQgcmV0dmFsOworCisJUlRTNTFYX0RFQlVHUCgiV3JpdGUgMHgleCB0byBwaHkgcmVnaXN0ZXIgMHgleFxuIiwgdmFsLCBhZGRyKTsKKworCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIEhTX1ZTVEFJTiwgMHhGRiwgdmFsKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBIU19WQ09OVFJPTCwgMHhGRiwgYWRkciAmIDB4MEYpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIEhTX1ZMT0FETSwgMHhGRiwgMHgwMCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgSFNfVkxPQURNLCAweEZGLCAweDAwKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBIU19WTE9BRE0sIDB4RkYsIDB4MDEpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIEhTX1ZDT05UUk9MLCAweEZGLAorCQkgICAgICAgKGFkZHIgPj4gNCkgJiAweDBGKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBIU19WTE9BRE0sIDB4RkYsIDB4MDApOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIEhTX1ZMT0FETSwgMHhGRiwgMHgwMCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgSFNfVkxPQURNLCAweEZGLCAweDAxKTsKKworCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0MsIDEwMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2ludCBydHM1MXhfcmVhZF9waHlfcmVnaXN0ZXIoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCBhZGRyLCB1OCAqIHZhbCkKK3sKKwlpbnQgcmV0dmFsOworCisJUlRTNTFYX0RFQlVHUCgiUmVhZCBmcm9tIHBoeSByZWdpc3RlciAweCV4XG4iLCBhZGRyKTsKKworCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIEhTX1ZDT05UUk9MLCAweEZGLCAweDA3KTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBIU19WTE9BRE0sIDB4RkYsIDB4MDApOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIEhTX1ZMT0FETSwgMHhGRiwgMHgwMCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgSFNfVkxPQURNLCAweEZGLCAweDAxKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBIU19WQ09OVFJPTCwgMHhGRiwKKwkJICAgICAgIChhZGRyID4+IDQpICYgMHgwRik7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgSFNfVkxPQURNLCAweEZGLCAweDAwKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBIU19WTE9BRE0sIDB4RkYsIDB4MDApOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIEhTX1ZMT0FETSwgMHhGRiwgMHgwMSk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgSFNfVkNPTlRST0wsIDB4RkYsIGFkZHIgJiAweDBGKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBIU19WTE9BRE0sIDB4RkYsIDB4MDApOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIEhTX1ZMT0FETSwgMHhGRiwgMHgwMCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgSFNfVkxPQURNLCAweEZGLCAweDAxKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIEhTX1ZTVEFPVVQsIDAsIDApOworCisJcmV0dmFsID0gcnRzNTF4X3NlbmRfY21kKGNoaXAsIE1PREVfQ1IsIDEwMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlyZXR2YWwgPSBydHM1MXhfZ2V0X3JzcChjaGlwLCAxLCAxMDApOworCisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlpZiAodmFsKQorCQkqdmFsID0gY2hpcC0+cnNwX2J1ZlswXTsKKworCVJUUzUxWF9ERUJVR1AoIlJldHVybiB2YWx1ZTogMHgleFxuIiwgY2hpcC0+cnNwX2J1ZlswXSk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3ZvaWQgcnRzNTF4X2RvX2JlZm9yZV9wb3dlcl9kb3duKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlSVFM1MVhfREVCVUdQKCJydHM1MXhfZG9fYmVmb3JlX3Bvd2VyX2Rvd25cbiIpOworCisJcnRzNTF4X3ByZXBhcmVfcnVuKGNoaXApOworCisJcnRzNTF4X3JlbGVhc2VfY2FyZHMoY2hpcCk7CisJaWYgKGNoaXAtPnJ0czUxNzkpCisJCXJ0czUxeF9lcDBfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9HUElPLCAweDAzLCAweDAwKTsKKwllbHNlCisJCXR1cm5fb2ZmX2xlZChjaGlwLCBMRURfR1BJTyk7CisKKwljaGlwLT5jdXJfY2xrID0gMDsKKwljaGlwLT5jYXJkX2V4aXN0ID0gMDsKKwljaGlwLT5jdXJfY2FyZCA9IDA7CisJaWYgKGNoaXAtPmFzaWNfY29kZSAmJiAhY2hpcC0+b3B0aW9uLnd3X2VuYWJsZSkgeworCQlpZiAoQ0hFQ0tfUEtHKGNoaXAsIExRRlA0OCkpIHsKKwkJCXJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BVTExfQ1RMMywgMHg4MCwgMHgwMCk7CisJCQlydHM1MXhfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDYsIDB4ZjAsIDB4NTApOworCQl9IGVsc2UgeworCQkJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEwxLCAweDMwLCAweDEwKTsKKwkJCXJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BVTExfQ1RMMywgMHg4MCwgMHgwMCk7CisJCQlydHM1MXhfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDYsIDB4MGMsIDB4MDQpOworCQl9CisJfQorCWlmIChDSEVDS19QS0coY2hpcCwgTFFGUDQ4KSkKKwkJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFdSX0NUTCwgTERPMzMxOF9QV1JfTUFTSywKKwkJCQkgICAgICBMRE9fT0ZGKTsKK30KKwordm9pZCBydHM1MXhfY2xlYXJfaHdfZXJyb3Ioc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXJ0czUxeF9lcDBfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0ZTTV9FRCwgMHhmOCwgMHhmOCk7Cit9CisKK3ZvaWQgcnRzNTF4X3ByZXBhcmVfcnVuKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKyNpZmRlZiBDTE9TRV9TU0NfUE9XRVIKKwlpZiAoUlRTNTFYX0NIS19TVEFUKGNoaXAsIFNUQVRfSURMRSkgJiYgKCFjaGlwLT5jYXJkX3JlYWR5KSkgeworCQlydHM1MXhfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgRlBEQ1RMLCBTU0NfUE9XRVJfTUFTSywKKwkJCQkgICAgICBTU0NfUE9XRVJfT04pOworCQl1ZGVsYXkoMTAwKTsKKwkJUlRTNTFYX0RFQlVHUCgiT3BlbiBTU0MgY2xvY2sgcG93ZXIuXG4iKTsKKworCQlydHM1MXhfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0xLX0RJViwgQ0xLX0NIQU5HRSwgMHgwMCk7CisJfQorI2VuZGlmCisjaWYgMAorCWlmIChjaGlwLT5vcHRpb24uc3NfZW4gJiYgUlRTNTFYX0NIS19TVEFUKGNoaXAsIFNUQVRfU1MpKSB7CisJCXJ0czUxeF90cnlfdG9fZXhpdF9zcyhjaGlwKTsKKwkJd2FpdF90aW1lb3V0KDEwMCk7CisJCXJ0czUxeF9pbml0X2NoaXAoY2hpcCk7CisJCXJ0czUxeF9pbml0X2NhcmRzKGNoaXApOworCX0KKworCVJUUzUxWF9TRVRfU1RBVChjaGlwLCBTVEFUX1JVTik7CisjZW5kaWYKK30KKworI2lmZGVmIF9NU0dfVFJBQ0UKK3ZvaWQgcnRzNTF4X3RyYWNlX21zZyhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGNsZWFyKQoreworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKwlpbnQgaSwgbXNnX2NudDsKKworCWlmICghYnVmKQorCQlyZXR1cm47CisKKwlwdHIgPSBidWY7CisKKwlpZiAoY2hpcC0+dHJhY2VfbXNnW2NoaXAtPm1zZ19pZHhdLnZhbGlkKQorCQltc2dfY250ID0gVFJBQ0VfSVRFTV9DTlQ7CisJZWxzZQorCQltc2dfY250ID0gY2hpcC0+bXNnX2lkeDsKKwkqKHB0cisrKSA9ICh1OCkgKG1zZ19jbnQgPj4gMjQpOworCSoocHRyKyspID0gKHU4KSAobXNnX2NudCA+PiAxNik7CisJKihwdHIrKykgPSAodTgpIChtc2dfY250ID4+IDgpOworCSoocHRyKyspID0gKHU4KSBtc2dfY250OworCVJUUzUxWF9ERUJVR1AoIlRyYWNlIG1lc3NhZ2UgY291bnQgaXMgJWRcbiIsIG1zZ19jbnQpOworCisJZm9yIChpID0gMTsgaSA8PSBtc2dfY250OyBpKyspIHsKKwkJaW50IGosIGlkeDsKKworCQlpZHggPSBjaGlwLT5tc2dfaWR4IC0gaTsKKwkJaWYgKGlkeCA8IDApCisJCQlpZHggKz0gVFJBQ0VfSVRFTV9DTlQ7CisKKwkJKihwdHIrKykgPSAodTgpIChjaGlwLT50cmFjZV9tc2dbaWR4XS5saW5lID4+IDgpOworCQkqKHB0cisrKSA9ICh1OCkgKGNoaXAtPnRyYWNlX21zZ1tpZHhdLmxpbmUpOworCQlmb3IgKGogPSAwOyBqIDwgTVNHX0ZVTkNfTEVOOyBqKyspCisJCQkqKHB0cisrKSA9IGNoaXAtPnRyYWNlX21zZ1tpZHhdLmZ1bmNbal07CisJCWZvciAoaiA9IDA7IGogPCBNU0dfRklMRV9MRU47IGorKykKKwkJCSoocHRyKyspID0gY2hpcC0+dHJhY2VfbXNnW2lkeF0uZmlsZVtqXTsKKwkJZm9yIChqID0gMDsgaiA8IFRJTUVfVkFMX0xFTjsgaisrKQorCQkJKihwdHIrKykgPSBjaGlwLT50cmFjZV9tc2dbaWR4XS50aW1ldmFsX2J1ZltqXTsKKwl9CisKKwlpZiAoY2xlYXIpIHsKKwkJY2hpcC0+bXNnX2lkeCA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBUUkFDRV9JVEVNX0NOVDsgaSsrKQorCQkJY2hpcC0+dHJhY2VfbXNnW2ldLnZhbGlkID0gMDsKKwl9Cit9CisjZW5kaWYKKwordm9pZCBydHM1MXhfcHBfc3RhdHVzKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IGx1biwgdTggKiBzdGF0dXMsCisJCSAgICAgIHU4IHN0YXR1c19sZW4pCit7CisJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOworCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKwl1OCBjYXJkID0gZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bik7CisjaWZkZWYgU1VQUE9SVF9PQworCXU4IG9jX25vd19tYXNrID0gMCwgb2NfZXZlcl9tYXNrID0gMDsKKyNlbmRpZgorCisJaWYgKCFzdGF0dXMgfHwgKHN0YXR1c19sZW4gPCAzMikpCisJCXJldHVybjsKKwkvKiBJQyBWZXJzaW9uICovCisJc3RhdHVzWzBdID0gKHU4KSBSVFM1MVhfR0VUX1BJRChjaGlwKTsKKwlzdGF0dXNbMV0gPSAodTgpIChjaGlwLT5pY192ZXJzaW9uKTsKKworCS8qIEF1dG8gZGVsaW5rIG1vZGUgKi8KKwlpZiAoY2hpcC0+b3B0aW9uLmF1dG9fZGVsaW5rX2VuKQorCQlzdGF0dXNbMl0gPSAweDEwOworCWVsc2UKKwkJc3RhdHVzWzJdID0gMHgwMDsKKworCS8qIFNwZWMgdmVyc2lvbiAqLworCXN0YXR1c1szXSA9IDIwOworCXN0YXR1c1s0XSA9IDEwOworCXN0YXR1c1s1XSA9IDA1OworCXN0YXR1c1s2XSA9IDIxOworCisJLyogQ2FyZCBXUCAqLworCWlmIChjaGlwLT5jYXJkX3dwKQorCQlzdGF0dXNbN10gPSAweDIwOworCWVsc2UKKwkJc3RhdHVzWzddID0gMHgwMDsKKworI2lmZGVmIFNVUFBPUlRfT0MKKwkvKiBPdmVyIGN1cnJlbnQgc3RhdHVzICovCisJc3RhdHVzWzhdID0gMDsKKwlvY19ub3dfbWFzayA9IE1TX09DUF9OT1c7CisJb2NfZXZlcl9tYXNrID0gTVNfT0NQX0VWRVI7CisKKwlpZiAoY2hpcC0+b2NwX3N0YXQgJiBvY19ub3dfbWFzaykKKwkJc3RhdHVzWzhdIHw9IDB4MDI7CisJaWYgKGNoaXAtPm9jcF9zdGF0ICYgb2NfZXZlcl9tYXNrKQorCQlzdGF0dXNbOF0gfD0gMHgwMTsKKyNlbmRpZgorCisJaWYgKGNhcmQgPT0gU0RfQ0FSRCkgeworCQlpZiAoQ0hLX1NEKHNkX2NhcmQpKSB7CisJCQlpZiAoQ0hLX1NEX0hDWEMoc2RfY2FyZCkpIHsKKwkJCQlpZiAoc2RfY2FyZC0+Y2FwYWNpdHkgPiAweDQwMDAwMDApCisJCQkJCS8qIFNEWEMgKi8KKwkJCQkJc3RhdHVzWzB4MEVdID0gMHgwMjsKKwkJCQllbHNlIC8qIFNESEMgKi8KKwkJCQkJc3RhdHVzWzB4MEVdID0gMHgwMTsKKwkJCX0gZWxzZSB7IC8qIFNEU0MgKi8KKwkJCQlzdGF0dXNbMHgwRV0gPSAweDAwOworCQkJfQorCisJCQlpZiAoQ0hLX1NEX1NEUjEwNChzZF9jYXJkKSkKKwkJCQlzdGF0dXNbMHgwRl0gPSAweDAzOworCQkJZWxzZSBpZiAoQ0hLX1NEX0REUjUwKHNkX2NhcmQpKQorCQkJCXN0YXR1c1sweDBGXSA9IDB4MDQ7CisJCQllbHNlIGlmIChDSEtfU0RfU0RSNTAoc2RfY2FyZCkpCisJCQkJc3RhdHVzWzB4MEZdID0gMHgwMjsKKwkJCWVsc2UgaWYgKENIS19TRF9IUyhzZF9jYXJkKSkKKwkJCQlzdGF0dXNbMHgwRl0gPSAweDAxOworCQkJZWxzZQorCQkJCXN0YXR1c1sweDBGXSA9IDB4MDA7IC8qIE5vcm1hbCBzcGVlZCAqLworCQl9IGVsc2UgeworCQkJaWYgKENIS19NTUNfU0VDVE9SX01PREUoc2RfY2FyZCkpCisJCQkJc3RhdHVzWzB4MEVdID0gMHgwMTsgLyogSGlnaCBjYXBhY2l0eSAqLworCQkJZWxzZQorCQkJCXN0YXR1c1sweDBFXSA9IDB4MDA7IC8qIE5vcm1hbCBjYXBhY2l0eSAqLworCisJCQlpZiAoQ0hLX01NQ19ERFI1MihzZF9jYXJkKSkKKwkJCQlzdGF0dXNbMHgwRl0gPSAweDAzOyAvKiBERFIgNTJNICovCisJCQllbHNlIGlmIChDSEtfTU1DXzUyTShzZF9jYXJkKSkKKwkJCQlzdGF0dXNbMHgwRl0gPSAweDAyOyAvKiBTRFIgNTJNICovCisJCQllbHNlIGlmIChDSEtfTU1DXzI2TShzZF9jYXJkKSkKKwkJCQlzdGF0dXNbMHgwRl0gPSAweDAxOyAvKiBTRFIgMjZNICovCisJCQllbHNlCisJCQkJc3RhdHVzWzB4MEZdID0gMHgwMDsgLyogTm9ybWFsIHNwZWVkICovCisJCX0KKwl9IGVsc2UgaWYgKGNhcmQgPT0gTVNfQ0FSRCkgeworCQlpZiAoQ0hLX01TUFJPKG1zX2NhcmQpKSB7CisJCQlpZiAoQ0hLX01TWEMobXNfY2FyZCkpCisJCQkJc3RhdHVzWzB4MEVdID0gMHgwMTsgLyogWEMgKi8KKwkJCWVsc2UKKwkJCQlzdGF0dXNbMHgwRV0gPSAweDAwOworCisJCQlpZiAoQ0hLX0hHOEJJVChtc19jYXJkKSkKKwkJCQlzdGF0dXNbMHgwRl0gPSAweDAxOworCQkJZWxzZQorCQkJCXN0YXR1c1sweDBGXSA9IDB4MDA7CisJCX0KKwl9CisjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCisJLyogU0QgTG9jay9VbmxvY2sgKi8KKwlpZiAoY2FyZCA9PSBTRF9DQVJEKSB7CisJCXN0YXR1c1sweDE3XSA9IDB4ODA7CisJCWlmIChzZF9jYXJkLT5zZF9lcmFzZV9zdGF0dXMpCisJCQlzdGF0dXNbMHgxN10gfD0gMHgwMTsgLyogVW5kZXIgZXJhc2luZyAqLworCQlpZiAoc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgJiBTRF9MT0NLRUQpIHsKKwkJCXN0YXR1c1sweDE3XSB8PSAweDAyOyAvKiBMb2NrZWQgKi8KKwkJCXN0YXR1c1sweDA3XSB8PSAweDQwOyAvKiBSZWFkIHByb3RlY3RlZCAqLworCQl9CisJCWlmIChzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyAmIFNEX1BXRF9FWElTVCkKKwkJCXN0YXR1c1sweDE3XSB8PSAweDA0OyAvKiBDb250YWluIFBXRCAqLworCX0gZWxzZSB7CisJCXN0YXR1c1sweDE3XSA9IDB4MDA7CisJfQorCisJUlRTNTFYX0RFQlVHUCgic3RhdHVzWzB4MTddID0gMHgleFxuIiwgc3RhdHVzWzB4MTddKTsKKyNlbmRpZgorCisJLyogRnVuY3Rpb24gMAorCSAqIFN1cHBvcnQgTWFnaWMgR2F0ZSwgQ1BSTSBhbmQgUGh5UmVnaXN0ZXIgUi9XICovCisJc3RhdHVzWzB4MThdID0gMHg4QTsKKworCS8qIEZ1bmN0aW9uIDIKKwkgKiBTdXBwb3J0IE9DIExVTiBzdGF0dXMgJiBXUCBMVU4gc3RhdHVzICovCisJc3RhdHVzWzB4MUFdID0gMHgyODsKKworCS8qIEZ1bmN0aW9uIDcgKi8KKyNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKKwkvKiBTdXBwb3J0IFNEIExvY2svVW5sb2NrICovCisJc3RhdHVzWzB4MUZdID0gMHgwMTsKKyNlbmRpZgorCisJLyogRnVuY3Rpb24gMgorCSAqIFN1cHBvcnQgT0MgTFVOIHN0YXR1cyAmIFdQIExVTiBzdGF0dXMgKi8KKwlzdGF0dXNbMHgxQV0gPSAweDI4OworfQorCit2b2lkIHJ0czUxeF9yZWFkX3N0YXR1cyhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBsdW4sCisJCQl1OCAqcnRzNTF4X3N0YXR1cywgdTggc3RhdHVzX2xlbikKK3sKKwlpZiAoIXJ0czUxeF9zdGF0dXMgfHwgKHN0YXR1c19sZW4gPCAxNikpCisJCXJldHVybjsKKwkvKiBWSUQgKi8KKwlydHM1MXhfc3RhdHVzWzBdID0gKHU4KSAoUlRTNTFYX0dFVF9WSUQoY2hpcCkgPj4gOCk7CisJcnRzNTF4X3N0YXR1c1sxXSA9ICh1OCkgUlRTNTFYX0dFVF9WSUQoY2hpcCk7CisKKwkvKiBQSUQgKi8KKwlydHM1MXhfc3RhdHVzWzJdID0gKHU4KSAoUlRTNTFYX0dFVF9QSUQoY2hpcCkgPj4gOCk7CisJcnRzNTF4X3N0YXR1c1szXSA9ICh1OCkgUlRTNTFYX0dFVF9QSUQoY2hpcCk7CisKKwkvKiBnYkxVTiAqLworCXJ0czUxeF9zdGF0dXNbNF0gPSAodTgpIGx1bjsKKworCS8qIEx1biBDYXJkIE51bWJlciAqLworCWlmIChjaGlwLT5jYXJkX2V4aXN0KSB7CisJCWlmIChjaGlwLT5jYXJkX2V4aXN0ICYgWERfQ0FSRCkKKwkJCXJ0czUxeF9zdGF0dXNbNV0gPSA0OyAvKiB4RCBDYXJkICovCisJCWVsc2UgaWYgKGNoaXAtPmNhcmRfZXhpc3QgJiBTRF9DQVJEKQorCQkJcnRzNTF4X3N0YXR1c1s1XSA9IDI7IC8qIFNEIENhcmQgKi8KKwkJZWxzZSBpZiAoY2hpcC0+Y2FyZF9leGlzdCAmIE1TX0NBUkQpCisJCQlydHM1MXhfc3RhdHVzWzVdID0gMzsgLyogTVMgQ2FyZCAqLworCQllbHNlCisJCQlydHM1MXhfc3RhdHVzWzVdID0gNzsgLyogTXVsdGkgKi8KKwl9IGVsc2UgeworCQlydHM1MXhfc3RhdHVzWzVdID0gNzsJLyogTXVsdGkgKi8KKwl9CisKKwkvKiBUb3RhbCBMVU5zICovCisJcnRzNTF4X3N0YXR1c1s2XSA9IDE7CisKKwkvKiBJQyBWZXJzaW9uICovCisJcnRzNTF4X3N0YXR1c1s3XSA9ICh1OCkgUlRTNTFYX0dFVF9QSUQoY2hpcCk7CisJcnRzNTF4X3N0YXR1c1s4XSA9IGNoaXAtPmljX3ZlcnNpb247CisKKwkvKiBQaHlzaWNhbCBFeGlzdCAqLworCWlmIChjaGVja19jYXJkX2V4aXN0KGNoaXAsIGx1bikpCisJCXJ0czUxeF9zdGF0dXNbOV0gPSAxOworCWVsc2UKKwkJcnRzNTF4X3N0YXR1c1s5XSA9IDA7CisKKwkvKiBNdWx0aSBGbGFnICovCisJcnRzNTF4X3N0YXR1c1sxMF0gPSAxOworCisJLyogTFVOIFZhbGlkIE1hcCAqLworCXJ0czUxeF9zdGF0dXNbMTFdID0gWERfQ0FSRCB8IFNEX0NBUkQgfCBNU19DQVJEOworCisJLyogTG9naWNhbCBFeGlzdCAqLworCWlmIChjaGVja19jYXJkX3JlYWR5KGNoaXAsIGx1bikpCisJCXJ0czUxeF9zdGF0dXNbMTJdID0gMTsKKwllbHNlCisJCXJ0czUxeF9zdGF0dXNbMTJdID0gMDsKKworCS8qIERldGFpbGVkIFR5cGUgKi8KKwlpZiAoZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bikgPT0gWERfQ0FSRCkgeworCQlydHM1MXhfc3RhdHVzWzEzXSA9IDB4NDA7CisJfSBlbHNlIGlmIChnZXRfbHVuX2NhcmQoY2hpcCwgbHVuKSA9PSBTRF9DQVJEKSB7CisJCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKworCQlydHM1MXhfc3RhdHVzWzEzXSA9IDB4MjA7CisJCWlmIChDSEtfU0Qoc2RfY2FyZCkpIHsKKwkJCWlmIChDSEtfU0RfSENYQyhzZF9jYXJkKSkKKwkJCQlydHM1MXhfc3RhdHVzWzEzXSB8PSAweDA0OyAvKiBIaSBjYXBhY2l0eSBTRCAqLworCQkJaWYgKENIS19TRF9IUyhzZF9jYXJkKSkKKwkJCQlydHM1MXhfc3RhdHVzWzEzXSB8PSAweDAyOyAvKiBIaSBzcGVlZCBTRCAqLworCQl9IGVsc2UgeworCQkJcnRzNTF4X3N0YXR1c1sxM10gfD0gMHgwODsgLyogTU1DIGNhcmQgKi8KKwkJCWlmIChDSEtfTU1DXzUyTShzZF9jYXJkKSkKKwkJCQlydHM1MXhfc3RhdHVzWzEzXSB8PSAweDAyOyAvKiBIaSBzcGVlZCAqLworCQkJaWYgKENIS19NTUNfU0VDVE9SX01PREUoc2RfY2FyZCkpCisJCQkJcnRzNTF4X3N0YXR1c1sxM10gfD0gMHgwNDsgLyogSGkgY2FwYWNpdHkgKi8KKwkJfQorCX0gZWxzZSBpZiAoZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bikgPT0gTVNfQ0FSRCkgeworCQlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7CisKKwkJaWYgKENIS19NU1BSTyhtc19jYXJkKSkgeworCQkJcnRzNTF4X3N0YXR1c1sxM10gPSAweDM4OyAvKiBNUyBQcm8gKi8KKwkJCWlmIChDSEtfSEc4QklUKG1zX2NhcmQpKQorCQkJCXJ0czUxeF9zdGF0dXNbMTNdIHw9IDB4MDQ7IC8qIEhHICovCisjaWZkZWYgU1VQUE9SVF9NU1hDCisJCQlpZiAoQ0hLX01TWEMobXNfY2FyZCkpCisJCQkJcnRzNTF4X3N0YXR1c1sxM10gfD0gMHgwMTsgLyogTVNYQyAqLworI2VuZGlmCisJCX0gZWxzZSB7CisJCQlydHM1MXhfc3RhdHVzWzEzXSA9IDB4MzA7CisJCX0KKwl9IGVsc2UgeworCQlydHM1MXhfc3RhdHVzWzEzXSA9IDB4NzA7CisJfQorLyogU3VwcG9ydCBPQywgYXV0byBkZWxpbmssIHZlbmRvciByL3csIGdldCBidXMgd2lkdGggKi8KKwlydHM1MXhfc3RhdHVzWzE0XSA9IDB4Nzg7CisKKwlydHM1MXhfc3RhdHVzWzE1XSA9IDB4ODI7Cit9CisKK2ludCBydHM1MXhfdHJhbnNmZXJfZGF0YV9yY2Moc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgcGlwZSwKKwkJCSAgICAgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgdXNlX3NnLAorCQkJICAgICB1bnNpZ25lZCBpbnQgKmFjdF9sZW4sIGludCB0aW1lb3V0LCB1OCBzdGFnZV9mbGFnKQoreworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPQorCSAgICBydHM1MXhfdHJhbnNmZXJfZGF0YShjaGlwLCBwaXBlLCBidWYsIGxlbiwgdXNlX3NnLCBhY3RfbGVuLAorCQkJCSB0aW1lb3V0KTsKKworCXJldHVybiByZXR2YWw7CisKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF9jaGlwLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfY2hpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMWVjZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfY2hpcC5oCkBAIC0wLDAgKzEsOTA0IEBACisvKiBEcml2ZXIgZm9yIFJlYWx0ZWsgUlRTNTF4eCBVU0IgY2FyZCByZWFkZXIKKyAqIEhlYWRlciBmaWxlCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDkgUmVhbHRlayBTZW1pY29uZHVjdG9yIENvcnAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIEF1dGhvcjoKKyAqICAgd3dhbmcgKHdlaV93YW5nQHJlYWxzaWwuY29tLmNuKQorICogICBOby4gNDUwLCBTaGVuaHUgUm9hZCwgU3V6aG91IEluZHVzdHJ5IFBhcmssIFN1emhvdSwgQ2hpbmEKKyAqIE1haW50YWluZXI6CisgKiAgIEVkd2luIFJvbmcgKGVkd2luX3JvbmdAcmVhbHNpbC5jb20uY24pCisgKiAgIE5vLiA0NTAsIFNoZW5odSBSb2FkLCBTdXpob3UgSW5kdXN0cnkgUGFyaywgU3V6aG91LCBDaGluYQorICovCisKKyNpZm5kZWYgX19SVFM1MVhfQ0hJUF9ICisjZGVmaW5lIF9fUlRTNTFYX0NISVBfSAorCisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiX3VzdWFsLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworI2luY2x1ZGUgInRyYWNlLmgiCisKKyNkZWZpbmUgU1VQUE9SVF9DUFJNCisjZGVmaW5lIFNVUFBPUlRfTUFHSUNfR0FURQorI2RlZmluZSBTVVBQT1JUX01TWEMKKy8qICNkZWZpbmUgTEVEX0FVVE9fQkxJTksgKi8KKworLyogeyB3d2FuZywgMjAxMC0wNy0yNgorICogQWRkIHN1cHBvcnQgZm9yIFNEIGxvY2svdW5sb2NrICovCisvKiAjZGVmaW5lIFNVUFBPUlRfU0RfTE9DSyAqLworLyogfSB3d2FuZywgMjAxMC0wNy0yNiAqLworCisjaWZkZWYgU1VQUE9SVF9NQUdJQ19HQQorLyogVXNpbmcgTk9STUFMX1dSSVRFIGluc3RlYWQgb2YgQVVUT19XUklURSB0byBzZXQgSUNWVEUgKi8KKyNkZWZpbmUgTUdfU0VUX0lDVl9TTE9XCisjZW5kaWYKKworI2lmZGVmIFNVUFBPUlRfTVNYQworI2RlZmluZSBYQ19QT1dFUkNMQVNTCisjZGVmaW5lIFNVUFBPUlRfUENHTF8xUDE4CisjZW5kaWYKKworI2RlZmluZSBHRVRfQ0FSRF9TVEFUVVNfVVNJTkdfRVBDCisKKyNkZWZpbmUgQ0xPU0VfU1NDX1BPV0VSCisKKyNkZWZpbmUgU1VQUE9SVF9PQ1AKKworI2RlZmluZSBNU19TUEVFRFVQCisvKiAjZGVmaW5lIFhEX1NQRUVEVVAgKi8KKworI2RlZmluZSBTRF9YRF9JT19GT0xMT1dfUFdSCisKKyNkZWZpbmUgU0RfTlIJCTIKKyNkZWZpbmUgTVNfTlIJCTMKKyNkZWZpbmUgWERfTlIJCTQKKyNkZWZpbmUgU0RfQ0FSRAkJKDEgPDwgU0RfTlIpCisjZGVmaW5lIE1TX0NBUkQJCSgxIDw8IE1TX05SKQorI2RlZmluZSBYRF9DQVJECQkoMSA8PCBYRF9OUikKKworI2RlZmluZSBTRF9DRAkJMHgwMQorI2RlZmluZSBNU19DRAkJMHgwMgorI2RlZmluZSBYRF9DRAkJMHgwNAorI2RlZmluZSBTRF9XUAkJMHgwOAorCisjZGVmaW5lIE1BWF9BTExPV0VEX0xVTl9DTlQJOAorI2RlZmluZSBDTURfQlVGX0xFTgkJMTAyNAorI2RlZmluZSBSU1BfQlVGX0xFTgkJMTAyNAorI2RlZmluZSBQT0xMSU5HX0lOVEVSVkFMCTUwCS8qIDUwbXMgKi8KKworI2RlZmluZSBYRF9GUkVFX1RBQkxFX0NOVAkxMjAwCisjZGVmaW5lIE1TX0ZSRUVfVEFCTEVfQ05UCTUxMgorCisvKiBCaXQgT3BlcmF0aW9uICovCisjZGVmaW5lIFNFVF9CSVQoZGF0YSwgaWR4KQkoKGRhdGEpIHw9IDEgPDwgKGlkeCkpCisjZGVmaW5lIENMUl9CSVQoZGF0YSwgaWR4KQkoKGRhdGEpICY9IH4oMSA8PCAoaWR4KSkpCisjZGVmaW5lIENIS19CSVQoZGF0YSwgaWR4KQkoKGRhdGEpICYgKDEgPDwgKGlkeCkpKQorCisvKiBDb21tYW5kIHR5cGUgKi8KKyNkZWZpbmUgUkVBRF9SRUdfQ01ECQkwCisjZGVmaW5lIFdSSVRFX1JFR19DTUQJCTEKKyNkZWZpbmUgQ0hFQ0tfUkVHX0NNRAkJMgorCisjZGVmaW5lIFBBQ0tFVF9UWVBFCQk0CisjZGVmaW5lIENOVF9ICQkJNQorI2RlZmluZSBDTlRfTAkJCTYKKyNkZWZpbmUgU1RBR0VfRkxBRwkJNworI2RlZmluZSBDTURfT0ZGU0VUCQk4CisKKy8qIFBhY2tldCB0eXBlICovCisjZGVmaW5lIEJBVENIX0NNRAkJMAorI2RlZmluZSBTRVFfUkVBRAkJMQorI2RlZmluZSBTRVFfV1JJVEUJCTIKKworLyogU3RhZ2UgZmxhZyAqLworI2RlZmluZSBTVEFHRV9SCQkJMHgwMQorI2RlZmluZSBTVEFHRV9ESQkJMHgwMgorI2RlZmluZSBTVEFHRV9ETwkJMHgwNAorLyogUmV0dXJuIE1TX1RSQU5TX0NGRywgR0VUX0lOVCAqLworI2RlZmluZSBTVEFHRV9NU19TVEFUVVMJCTB4MDgKKy8qIFJldHVybiBYRF9DRkcsIFhEX0NUTCwgWERfUEFHRV9TVEFUVVMgKi8KKyNkZWZpbmUgU1RBR0VfWERfU1RBVFVTCQkweDEwCisvKiBDb21tYW5kIHN0YWdlIG1vZGUgKi8KKyNkZWZpbmUgTU9ERV9DCQkJMHgwMAorI2RlZmluZSBNT0RFX0NSCQkJKFNUQUdFX1IpCisjZGVmaW5lIE1PREVfQ0RJUgkJKFNUQUdFX1IgfCBTVEFHRV9ESSkKKyNkZWZpbmUgTU9ERV9DRE9SCQkoU1RBR0VfUiB8IFNUQUdFX0RPKQorCisvKiBGdW5jdGlvbiByZXR1cm4gY29kZSAqLworI2lmbmRlZiBTVEFUVVNfU1VDQ0VTUworI2RlZmluZSBTVEFUVVNfU1VDQ0VTUwkJMAorI2VuZGlmCisKKyNkZWZpbmUgU1RBVFVTX0ZBSUwJCTEKKyNkZWZpbmUgU1RBVFVTX1JFQURfRkFJTAkyCisjZGVmaW5lIFNUQVRVU19XUklURV9GQUlMCTMKKyNkZWZpbmUgU1RBVFVTX1RJTUVET1VUCQk0CisjZGVmaW5lIFNUQVRVU19OT01FTQkJNQorI2RlZmluZSBTVEFUVVNfVFJBTlNfU0hPUlQJNgorI2RlZmluZSBTVEFUVVNfVFJBTlNfTE9ORwk3CisjZGVmaW5lIFNUQVRVU19TVEFMTEVECQk4CisjZGVmaW5lIFNUQVRVU19FUlJPUgkJMTAKKworI2RlZmluZSBJRExFX01BWF9DT1VOVAkJMTAKKyNkZWZpbmUgUE9MTElOR19XQUlUX0NOVAkxCisjZGVmaW5lIERFTElOS19ERUxBWQkJMTAwCisjZGVmaW5lIExFRF9UT0dHTEVfSU5URVJWQUwJNgorI2RlZmluZSBMRURfR1BJTwkJMAorCisvKiBwYWNrYWdlICovCisjZGVmaW5lIFFGTjI0CQkJMAorI2RlZmluZSBMUUZQNDgJCQkxCisKKyNkZWZpbmUgVVNCXzExCQkJMAorI2RlZmluZSBVU0JfMjAJCQkxCisKKy8qCisgKiBUcmFuc3BvcnQgcmV0dXJuIGNvZGVzCisgKi8KKy8qIFRyYW5zcG9ydCBnb29kLCBjb21tYW5kIGdvb2QgKi8KKyNkZWZpbmUgVFJBTlNQT1JUX0dPT0QJCTAKKy8qIFRyYW5zcG9ydCBnb29kLCBjb21tYW5kIGZhaWxlZCAqLworI2RlZmluZSBUUkFOU1BPUlRfRkFJTEVECTEKKy8qIENvbW1hbmQgZmFpbGVkLCBubyBhdXRvLXNlbnNlICovCisjZGVmaW5lIFRSQU5TUE9SVF9OT19TRU5TRQkyCisvKiBUcmFuc3BvcnQgYmFkIChpLmUuIGRldmljZSBkZWFkKSAqLworI2RlZmluZSBUUkFOU1BPUlRfRVJST1IJCTMKKworLyogU3VwcG9ydGVkIENsb2NrICovCitlbnVtIGNhcmRfY2xvY2sgeyBDTEtfMjAgPSAxLCBDTEtfMzAsIENMS180MCwgQ0xLXzUwLCBDTEtfNjAsIENMS184MCwgQ0xLXzEwMCB9OworCisjaWZkZWYgX01TR19UUkFDRQorCisjZGVmaW5lIFRSQUNFX0lURU1fQ05UCQk2NAorCitzdHJ1Y3QgdHJhY2VfbXNnX3QgeworCXUxNiBsaW5lOworI2RlZmluZSBNU0dfRlVOQ19MRU4gNjQKKwljaGFyIGZ1bmNbTVNHX0ZVTkNfTEVOXTsKKyNkZWZpbmUgTVNHX0ZJTEVfTEVOIDMyCisJY2hhciBmaWxlW01TR19GSUxFX0xFTl07CisjZGVmaW5lIFRJTUVfVkFMX0xFTiAxNgorCXU4IHRpbWV2YWxfYnVmW1RJTUVfVkFMX0xFTl07CisJdTggdmFsaWQ7Cit9OworCisjZW5kaWYgLyogX01TR19UUkFDRSAqLworCisvKiBTaXplIG9mIHRoZSBhdXRvc2Vuc2UgZGF0YSBidWZmZXIgKi8KKyNkZWZpbmUgU0VOU0VfU0laRQkJMTgKKworLyogU2Vuc2UgdHlwZSAqLworI2RlZmluZQlTRU5TRV9UWVBFX05PX1NFTlNFCQkJCTAKKyNkZWZpbmUJU0VOU0VfVFlQRV9NRURJQV9DSEFOR0UJCQkJMQorI2RlZmluZQlTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UCQkJMgorI2RlZmluZQlTRU5TRV9UWVBFX01FRElBX0xCQV9PVkVSX1JBTkdFCQkJMworI2RlZmluZQlTRU5TRV9UWVBFX01FRElBX0xVTl9OT1RfU1VQUE9SVAkJNAorI2RlZmluZQlTRU5TRV9UWVBFX01FRElBX1dSSVRFX1BST1RFQ1QJCQk1CisjZGVmaW5lCVNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQJCTYKKyNkZWZpbmUJU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIJCTcKKyNkZWZpbmUJU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIJCQk4CisjZGVmaW5lIFNFTlNFX1RZUEVfRk9STUFUX0lOX1BST0dSRVNTCQkJOQorI2RlZmluZSBTRU5TRV9UWVBFX0ZPUk1BVF9DTURfRkFJTEVECQkJMTAKKyNpZmRlZiBTVVBQT1JUX01BR0lDX0dBVEUKKy8qIENPUFkgUFJPVEVDVElPTiBLRVkgRVhDSEFOR0UgRkFJTFVSRSAtIEtFWSBOT1QgRVNUQUJMSVNIRUQgKi8KKyNkZWZpbmUgU0VOU0VfVFlQRV9NR19LRVlfRkFJTF9OT1RfRVNUQUIJCTB4MGIKKy8qIENPUFkgUFJPVEVDVElPTiBLRVkgRVhDSEFOR0UgRkFJTFVSRSAtIEFVVEhFTlRJQ0FUSU9OIEZBSUxVUkUgKi8KKyNkZWZpbmUgU0VOU0VfVFlQRV9NR19LRVlfRkFJTF9OT1RfQVVUSEVOCQkweDBjCisvKiBJTkNPTVBBVElCTEUgTUVESVVNIElOU1RBTExFRCAqLworI2RlZmluZSBTRU5TRV9UWVBFX01HX0lOQ09NUEFUSUJMRV9NRURJVU0JCTB4MGQKKy8qIFdSSVRFIEVSUk9SICovCisjZGVmaW5lIFNFTlNFX1RZUEVfTUdfV1JJVEVfRVJSCQkJCTB4MGUKKyNlbmRpZgorI2lmZGVmIFNVUFBPUlRfU0RfTE9DSworLyogRk9SIExvY2tlZCBTRCBjYXJkICovCisjZGVmaW5lIFNFTlNFX1RZUEVfTUVESUFfUkVBRF9GT1JCSURERU4JCQkweDEwCisjZW5kaWYKKworLyotLS0tIHNlbnNlIGtleSAtLS0tKi8KKyNkZWZpbmUgSUxJICAgICAgICAgICAgICAgICAgICAgMHgyMAkvKiBJTEkgYml0IGlzIG9uICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIE5PX1NFTlNFICAgICAgICAgICAgICAgIDB4MDAJLyogbm90IGV4aXN0IHNlbnNlIGtleSAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUkVDT1ZFUl9FUlIgICAgICAgICAgICAgMHgwMQkvKiBUYXJnZXQvTG9naWNhbCB1bml0IGlzIHJlY292ZXJkICAqLworI2RlZmluZSBOT1RfUkVBRFkgICAgICAgICAgICAgICAweDAyCS8qIExvZ2ljYWwgdW5pdCBpcyBub3QgcmVhZHkgICAgICAgICovCisjZGVmaW5lIE1FRElBX0VSUiAgICAgICAgICAgICAgIDB4MDMJLyogbWVkaXVtL2RhdGEgZXJyb3IgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFSRFdBUkVfRVJSICAgICAgICAgICAgMHgwNAkvKiBoYXJkd2FyZSBlcnJvciAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBJTEdBTF9SRVEgICAgICAgICAgICAgICAweDA1CS8qIENEQi9wYXJhbWV0ZXIvaWRlbnRpZnkgbXNnIGVycm9yICovCisjZGVmaW5lIFVOSVRfQVRURU5USU9OICAgICAgICAgIDB4MDYJLyogdW5pdCBhdHRlbnRpb24gY29uZGl0aW9uIG9jY3VyICAgKi8KKyNkZWZpbmUgREFUX1BSVENUICAgICAgICAgICAgICAgMHgwNwkvKiByZWFkL3dyaXRlIGlzIGRlc2FibGUgICAgICAgICAgICAqLworI2RlZmluZSBCTE5DX0NISyAgICAgICAgICAgICAgICAweDA4CS8qIGZpbmQgYmxhbmsvRE9GIGluIHJlYWQgICAgICAgICAgICovCisJCQkJCS8qIHdyaXRlIHRvIHVuYmxhbmsgYXJlYSAgICAgICAgICAgICovCisjZGVmaW5lIENQWV9BQlJUICAgICAgICAgICAgICAgIDB4MGEJLyogQ29weS9Db21wYXJlL0NvcHkmVmVyaWZ5IGlsbGdhbCAgKi8KKyNkZWZpbmUgQUJSVF9DTUQgICAgICAgICAgICAgICAgMHgwYgkvKiBUYXJnZXQgbWFrZSB0aGUgY29tbWFuZCBpbiBlcnJvciAqLworI2RlZmluZSBFUVVBTCAgICAgICAgICAgICAgICAgICAweDBjCS8qIFNlYXJjaCBEYXRhIGVuZCB3aXRoIEVxdWFsICAgICAgICovCisjZGVmaW5lIFZMTV9PVlJGTFcgICAgICAgICAgICAgIDB4MGQJLyogU29tZSBkYXRhIGFyZSBsZWZ0IGluIGJ1ZmZlciAgICAgKi8KKyNkZWZpbmUgTUlTQ01QICAgICAgICAgICAgICAgICAgMHgwZQkvKiBmaW5kIGluZXF1YWxpdHkgICAgICAgICAgICAgICAgICAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgU0VOU0VfREFUQQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0tIHZhbGlkIC0tLS0qLworI2RlZmluZSBTRU5TRV9WQUxJRCAgICAgICAgICAgICAweDgwCS8qIFNlbnNlIGRhdGEgaXMgdmFsaWQgYXMgU0NTSTIgICAgICovCisjZGVmaW5lIFNFTlNFX0lOVkFMSUQgICAgICAgICAgIDB4MDAJLyogU2Vuc2UgZGF0YSBpcyBpbnZhbGlkIGFzIFNDU0kyICAgKi8KKworLyotLS0tIGVycm9yIGNvZGUgLS0tLSovCisjZGVmaW5lIENVUl9FUlIgICAgICAgICAgICAgICAgIDB4NzAJLyogY3VycmVudCBlcnJvciAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgREVGX0VSUiAgICAgICAgICAgICAgICAgMHg3MQkvKiBzcGVjaWZpYyBjb21tYW5kIGVycm9yICAgICAgICAgICAqLworCisvKi0tLS0gc2Vuc2Uga2V5IEluZm9tYXRpb24gLS0tLSovCisjZGVmaW5lIFNOU0tFWUlORk9fTEVOICAgICAgICAgIDMJLyogbGVuZ3RoIG9mIHNlbnNlIGtleSBpbmZvbWF0aW9uICAgKi8KKworI2RlZmluZSBTS1NWICAgICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIENEQl9JTExFR0FMICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgREFUX0lMTEVHQUwgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBCUFYgICAgICAgICAgICAgICAgICAgICAweDA4CisjZGVmaW5lIEJJVF9JTExFR0FMMCAgICAgICAgICAgIDAJLyogYml0MCBpcyBpbGxlZ2FsICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklUX0lMTEVHQUwxICAgICAgICAgICAgMQkvKiBiaXQxIGlzIGlsbGVnYWwgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSVRfSUxMRUdBTDIgICAgICAgICAgICAyCS8qIGJpdDIgaXMgaWxsZWdhbCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJVF9JTExFR0FMMyAgICAgICAgICAgIDMJLyogYml0MyBpcyBpbGxlZ2FsICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklUX0lMTEVHQUw0ICAgICAgICAgICAgNAkvKiBiaXQ0IGlzIGlsbGVnYWwgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBCSVRfSUxMRUdBTDUgICAgICAgICAgICA1CS8qIGJpdDUgaXMgaWxsZWdhbCAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEJJVF9JTExFR0FMNiAgICAgICAgICAgIDYJLyogYml0NiBpcyBpbGxlZ2FsICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQklUX0lMTEVHQUw3ICAgICAgICAgICAgNwkvKiBiaXQ3IGlzIGlsbGVnYWwgICAgICAgICAgICAgICAgICAqLworCisvKi0tLS0gQVNDIC0tLS0qLworI2RlZmluZSBBU0NfTk9fSU5GTyAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFTQ19NSVNDTVAgICAgICAgICAgICAgIDB4MWQKKyNkZWZpbmUgQVNDX0lOVkxEX0NEQiAgICAgICAgICAgMHgyNAorI2RlZmluZSBBU0NfSU5WTERfUEFSQSAgICAgICAgICAweDI2CisjZGVmaW5lIEFTQ19MVV9OT1RfUkVBRFkJMHgwNAorI2RlZmluZSBBU0NfV1JJVEVfRVJSICAgICAgICAgICAweDBjCisjZGVmaW5lIEFTQ19SRUFEX0VSUiAgICAgICAgICAgIDB4MTEKKyNkZWZpbmUgQVNDX0xPQURfRUpDVF9FUlIgICAgICAgMHg1MworI2RlZmluZQlBU0NfTUVESUFfTk9UX1BSRVNFTlQJMHgzQQorI2RlZmluZQlBU0NfTUVESUFfQ0hBTkdFRAkweDI4CisjZGVmaW5lCUFTQ19NRURJQV9JTl9QUk9DRVNTCTB4MDQKKyNkZWZpbmUJQVNDX1dSSVRFX1BST1RFQ1QJMHgyNworI2RlZmluZSBBU0NfTFVOX05PVF9TVVBQT1JURUQJMHgyNQorCisvKi0tLS0gQVNRQyAtLS0tKi8KKyNkZWZpbmUgQVNDUV9OT19JTkZPICAgICAgICAgICAgMHgwMAorI2RlZmluZQlBU0NRX01FRElBX0lOX1BST0NFU1MJMHgwMQorI2RlZmluZSBBU0NRX01JU0NNUCAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFTQ1FfSU5WTERfQ0RCICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQVNDUV9JTlZMRF9QQVJBICAgICAgICAgMHgwMgorI2RlZmluZSBBU0NRX0xVX05PVF9SRUFEWQkweDAyCisjZGVmaW5lIEFTQ1FfV1JJVEVfRVJSICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQVNDUV9SRUFEX0VSUiAgICAgICAgICAgMHgwMAorI2RlZmluZSBBU0NRX0xPQURfRUpDVF9FUlIgICAgICAweDAwCisjZGVmaW5lCUFTQ1FfV1JJVEVfUFJPVEVDVAkweDAwCisKK3N0cnVjdCBzZW5zZV9kYXRhX3QgeworCXVuc2lnbmVkIGNoYXIgZXJyX2NvZGU7CS8qIGVycm9yIGNvZGUgKi8KKwkvKiBiaXQ3IDogdmFsaWQgICAgICAgICAgICAgICAgICAgICovCisJLyogICAoMSA6IFNDU0kyKSAgICAgICAgICAgICAgICAgICAgKi8KKwkvKiAgICgwIDogVmVuZG9yIHNwZWNpZmljKSAgICAgICAgICAqLworCS8qIGJpdDYtMCA6IGVycm9yIGNvZGUgICAgICAgICAgICAgKi8KKwkvKiAgKDB4NzAgOiBjdXJyZW50IGVycm9yKSAgICAgICAgICAqLworCS8qICAoMHg3MSA6IHNwZWNpZmljIGNvbW1hbmQgZXJyb3IpICovCisJdW5zaWduZWQgY2hhciBzZWdfbm87CS8qIHNlZ21lbnQgTm8uICAgICAgICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgY2hhciBzZW5zZV9rZXk7CS8qIGJ5dGU1IDogSUxJICAgICAgICAgICAgICAgICAgICAgICovCisJLyogYml0My0wIDogc2Vuc2Uga2V5ICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGNoYXIgaW5mb1s0XTsJLyogaW5mb21hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyIGFkX3NlbnNlX2xlbjsJLyogYWRkaXRpb25hbCBzZW5zZSBkYXRhIGxlbmd0aCAgICAgKi8KKwl1bnNpZ25lZCBjaGFyIGNtZF9pbmZvWzRdOwkvKiBjb21tYW5kIHNwZWNpZmljIGluZm9tYXRpb24gICAgICAqLworCXVuc2lnbmVkIGNoYXIgYXNjOwkvKiBBU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXVuc2lnbmVkIGNoYXIgYXNjcTsJLyogQVNDUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyIHJmdTsJLyogRlJVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyIHNuc19rZXlfaW5mb1szXTsJLyogc2Vuc2Uga2V5IHNwZWNpZmljIGluZm9tYXRpb24gICAgKi8KK307CisKKy8qIHNkX2N0bCBiaXQgbWFwICovCisvKiBTRCBwdXNoIHBvaW50IGNvbnRyb2wsIGJpdCAwLCAxICovCisjZGVmaW5lIFNEX1BVU0hfUE9JTlRfQ1RMX01BU0sJCTB4MDMKKyNkZWZpbmUgU0RfUFVTSF9QT0lOVF9ERUxBWQkJMHgwMQorI2RlZmluZSBTRF9QVVNIX1BPSU5UX0FVVE8JCTB4MDIKKy8qIFNEIHNhbXBsZSBwb2ludCBjb250cm9sLCBiaXQgMiwgMyAqLworI2RlZmluZSBTRF9TQU1QTEVfUE9JTlRfQ1RMX01BU0sJMHgwQworI2RlZmluZSBTRF9TQU1QTEVfUE9JTlRfREVMQVkJCTB4MDQKKyNkZWZpbmUgU0RfU0FNUExFX1BPSU5UX0FVVE8JCTB4MDgKKy8qIFNEIEREUiBUeCBwaGFzZSBzZXQgYnkgdXNlciwgYml0IDQgKi8KKyNkZWZpbmUgU0RfRERSX1RYX1BIQVNFX1NFVF9CWV9VU0VSCTB4MTAKKy8qIE1NQyBERFIgVHggcGhhc2Ugc2V0IGJ5IHVzZXIsIGJpdCA1ICovCisjZGVmaW5lIE1NQ19ERFJfVFhfUEhBU0VfU0VUX0JZX1VTRVIJMHgyMAorLyogU3VwcG9ydCBNTUMgRERSIG1vZGUsIGJpdCA2ICovCisvKiNkZWZpbmUgU1VQUE9SVF9NTUNfRERSX01PREUgICAgICAgICAgMHg0MCAqLworI2RlZmluZSBTVVBQT1JUX1VIUzUwX01NQzQ0CQkweDQwCisKK3N0cnVjdCBydHM1MXhfb3B0aW9uIHsKKwl1OCBsZWRfYmxpbmtfc3BlZWQ7CisKKwlpbnQgbXNwcm9fZm9ybWF0dGVyX2VuYWJsZTsKKworCS8qIGNhcmQgY2xvY2sgZXhwZWN0ZWQgYnkgdXNlciBmb3IgZnBnYSBwbGF0Zm9ybSAqLworCWludCBmcGdhX3NkX3NkcjEwNF9jbGs7CisJaW50IGZwZ2Ffc2RfZGRyNTBfY2xrOworCWludCBmcGdhX3NkX3NkcjUwX2NsazsKKwlpbnQgZnBnYV9zZF9oc19jbGs7CisJaW50IGZwZ2FfbW1jXzUybV9jbGs7CisJaW50IGZwZ2FfbXNfaGdfY2xrOworCWludCBmcGdhX21zXzRiaXRfY2xrOworCisJLyogY2FyZCBjbG9jayBleHBlY3RlZCBieSB1c2VyIGZvciBhc2ljIHBsYXRmb3JtICovCisJaW50IGFzaWNfc2Rfc2RyMTA0X2NsazsKKwlpbnQgYXNpY19zZF9kZHI1MF9jbGs7CisJaW50IGFzaWNfc2Rfc2RyNTBfY2xrOworCWludCBhc2ljX3NkX2hzX2NsazsKKwlpbnQgYXNpY19tbWNfNTJtX2NsazsKKwlpbnQgYXNpY19tc19oZ19jbGs7CisJaW50IGFzaWNfbXNfNGJpdF9jbGs7CisKKwl1OCBzc2NfZGVwdGhfc2Rfc2RyMTA0OwkvKiBzdyAqLworCXU4IHNzY19kZXB0aF9zZF9kZHI1MDsJLyogc3cgKi8KKwl1OCBzc2NfZGVwdGhfc2Rfc2RyNTA7CS8qIHN3ICovCisJdTggc3NjX2RlcHRoX3NkX2hzOwkvKiBzdyAqLworCXU4IHNzY19kZXB0aF9tbWNfNTJtOwkvKiBzdyAqLworCXU4IHNzY19kZXB0aF9tc19oZzsJLyogc3cgKi8KKwl1OCBzc2NfZGVwdGhfbXNfNGJpdDsJLyogc3cgKi8KKwl1OCBzc2NfZGVwdGhfbG93X3NwZWVkOwkvKiBzdyAqLworCisJLyogU0QvTU1DIFR4IHBoYXNlICovCisJaW50IHNkX2Rkcl90eF9waGFzZTsJLyogRW5hYmxlZCBieSBiaXQgNCBvZiBzZF9jdGwgKi8KKwlpbnQgbW1jX2Rkcl90eF9waGFzZTsJLyogRW5hYmxlZCBieSBiaXQgNSBvZiBzZF9jdGwgKi8KKworCS8qIHByaW9yaXR5IG9mIGNob29zaW5nIHNkIHNwZWVkIGZ1bmNpdG9uICovCisJdTMyIHNkX3NwZWVkX3ByaW9yOworCisJLyogc2QgY2FyZCBjb250cm9sICovCisJdTMyIHNkX2N0bDsKKworCS8qIEVuYWJsZSBTZWxlY3RpdmUgU3VzcGVuZCAqLworCWludCBzc19lbjsKKwkvKiBJbnRlcnZhbCB0byBlbnRlciBTUyBmcm9tIElETEUgc3RhdGUgKHNlY29uZCkgKi8KKwlpbnQgc3NfZGVsYXk7CisJaW50IG5lZWRzX3JlbW90ZV93YWtldXA7CisJdTggd3dfZW5hYmxlOwkvKiBzYW5nZHkyMDEwLTA4LTAzOmFkZCBmb3IgcmVtb3RlIHdha2V1cCAqLworCisJLyogRW5hYmxlIFNTQyBjbG9jayAqLworCWludCBzc2NfZW47CisKKwlpbnQgYXV0b19kZWxpbmtfZW47CisKKwkvKiBzYW5nZHkyMDEwLTA3LTEzOmFkZCBGVDIgZmFzdCBtb2RlICovCisJaW50IEZUMl9mYXN0X21vZGU7CisJLyogc2FuZ2R5MjAxMC0wNy0xNToKKwkgKiBhZGQgZm9yIGNvbmZpZyBkZWxheSBiZXR3ZWVuIDEvNCBQTU9TIGFuZCAzLzQgUE1PUyAqLworCWludCBwd3JfZGVsYXk7CisKKwlpbnQgeGRfcndfc3RlcDsJCS8qIGFkZCB0byB0dW5lIHhkIHRSUCAqLworCWludCBEMzMxOF9vZmZfZGVsYXk7CS8qIGFkZCB0byB0dW5lIEQzMzE4IG9mZiBkZWxheSB0aW1lICovCisJaW50IGRlbGlua19kZWxheTsJLyogYWRkIHRvIHR1bmUgZGVsaW5rIGRlbGF5IHRpbWUgKi8KKwkvKiBhZGQgZm9yIHJ0czUxMjkgdG8gZW5hYmxlL2Rpc2FibGUgRDMzMTggb2ZmICovCisJdTggcnRzNTEyOV9EMzMxOF9vZmZfZW5hYmxlOworCXU4IHNkMjBfcGFkX2RyaXZlOwkvKiBhZGQgdG8gY29uZmlnIFNEMjAgUEFEIGRyaXZlICovCisJdTggc2QzMF9wYWRfZHJpdmU7CS8qIGFkZCB0byBjb25maWcgU0QzMCBwYWQgZHJpdmUgKi8KKwkvKmlmIHJlc2V0IG9yIHJ3IGZhaWwsdGhlbiBzZXQgU0QyMCBwYWQgZHJpdmUgYWdhaW4gKi8KKwl1OCByZXNldF9vcl9yd19mYWlsX3NldF9wYWRfZHJpdmU7CisKKwl1OCByY2NfZmFpbF9mbGFnOwkvKiBhZGQgdG8gaW5kaWNhdGUgd2hldGhlciByY2MgYnVnIGhhcHBlbiAqLworCXU4IHJjY19idWdfZml4X2VuOwkvKiBpZiBzZXQsdGhlbiBzdXBwb3J0IGZpeGluZyByY2MgYnVnICovCisJdTggZGVib3VuY2VfbnVtOwkvKiBkZWJvdW5jZSBudW1iZXIgKi8KKwlpbnQgcG9sbGluZ190aW1lOwkvKiBwb2xsaW5nIGRlbGF5IHRpbWUgKi8KKwl1OCBsZWRfdG9nZ2xlX2ludGVydmFsOwkvKiB1c2VkIHRvIGNvbnRyb2wgbGVkIHRvZ2dsZSBzcGVlZCAqLworCWludCB4ZF9yd25fc3RlcDsKKwl1OCBzZF9zZW5kX3N0YXR1c19lbjsKKwkvKiB1c2VkIHRvIHN0b3JlIGRlZmF1bHQgcGhhc2Ugd2hpY2ggaXMKKwkgKiB1c2VkIHdoZW4gcGhhc2UgdHVuZSBhbGwgcGFzcy4gKi8KKwl1OCBkZHI1MF90eF9waGFzZTsKKwl1OCBkZHI1MF9yeF9waGFzZTsKKwl1OCBzZHI1MF90eF9waGFzZTsKKwl1OCBzZHI1MF9yeF9waGFzZTsKKwkvKiB1c2VkIHRvIGVuYWJsZSBzZWxlY3Qgc2RyNTAgdHggcGhhc2UgYWNjb3JkaW5nIHRvICBwcm9wb3J0aW9uLiAqLworCXU4IHNkcjUwX3BoYXNlX3NlbDsKKwl1OCBtc19lcnJyZWdfZml4OworCXU4IHJlc2V0X21tY19maXJzdDsKKwl1OCBzcGVlZF9tbWM7CQkvKiB3aGVuIHNldCwgdGhlbiB0cnkgQ01ENTUgb25seSB0d2ljZSAqLworCXU4IGxlZF9hbHdheXNfb247CS8qIGlmIHNldCwgdGhlbiBsZWQgYWx3YXlzIG9uIHdoZW4gY2FyZCBleGlzdCAqLworCXU4IGR2MThfdm9sdGFnZTsJLyogYWRkIHRvIHR1bmUgZHYxOCB2b2x0YWdlICovCit9OworCisjZGVmaW5lIE1TX0ZPUk1BVFRFUl9FTkFCTEVEKGNoaXApCSgoY2hpcCktPm9wdGlvbi5tc3Byb19mb3JtYXR0ZXJfZW5hYmxlKQorCitzdHJ1Y3QgcnRzNTF4X2NoaXA7CisKK3R5cGVkZWYgaW50ICgqY2FyZF9yd19mdW5jKSAoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsCisJCQkgICAgIHUzMiBzZWNfYWRkciwgdTE2IHNlY19jbnQpOworCisvKiBGb3IgTVMgQ2FyZCAqLworI2RlZmluZSAgICBNQVhfREVGRUNUSVZFX0JMT0NLICAgICAxMAorCitzdHJ1Y3Qgem9uZV9lbnRyeSB7CisJdTE2ICpsMnBfdGFibGU7CisJdTE2ICpmcmVlX3RhYmxlOworCXUxNiBkZWZlY3RfbGlzdFtNQVhfREVGRUNUSVZFX0JMT0NLXTsJLyogRm9yIE1TIGNhcmQgb25seSAqLworCWludCBzZXRfaW5kZXg7CisJaW50IGdldF9pbmRleDsKKwlpbnQgdW51c2VkX2Jsa19jbnQ7CisJaW50IGRpc2FibGVfY291bnQ7CisJLyogVG8gaW5kaWNhdGUgd2hldGhlciB0aGUgTDJQIHRhYmxlIG9mIHRoaXMgem9uZSBoYXMgYmVlbiBidWlsdC4gKi8KKwlpbnQgYnVpbGRfZmxhZzsKK307CisKK3N0cnVjdCB4ZF9kZWxheV93cml0ZV90YWcgeworCXUzMiBvbGRfcGh5YmxvY2s7CisJdTMyIG5ld19waHlibG9jazsKKwl1MzIgbG9nYmxvY2s7CisJdTggcGFnZW9mZjsKKwl1OCBkZWxheV93cml0ZV9mbGFnOworfTsKKworc3RydWN0IHhkX2luZm8geworCXU4IG1ha2VyX2NvZGU7CisJdTggZGV2aWNlX2NvZGU7CisJdTggYmxvY2tfc2hpZnQ7CisJdTggcGFnZV9vZmY7CisJdTggYWRkcl9jeWNsZTsKKwl1MTYgY2lzX2Jsb2NrOworCXU4IG11bHRpX2ZsYWc7CisJdTggZXJyX2NvZGU7CisJdTMyIGNhcGFjaXR5OworCisJc3RydWN0IHpvbmVfZW50cnkgKnpvbmU7CisJaW50IHpvbmVfY250OworCisJc3RydWN0IHhkX2RlbGF5X3dyaXRlX3RhZyBkZWxheV93cml0ZTsKKworCWludCBjb3VudGVyOworCisJaW50IHhkX2Nsb2NrOworfTsKKworI2RlZmluZSBUWVBFX1NECQkJMHgwMDAwCisjZGVmaW5lIFRZUEVfTU1DCQkweDAwMDEKKworLyogVFlQRV9TRCAqLworI2RlZmluZSBTRF9IUwkJCTB4MDEwMAorI2RlZmluZSBTRF9TRFI1MAkJMHgwMjAwCisjZGVmaW5lIFNEX0REUjUwCQkweDA0MDAKKyNkZWZpbmUgU0RfU0RSMTA0CQkweDA4MDAKKyNkZWZpbmUgU0RfSENYQwkJCTB4MTAwMAorCisvKiBUWVBFX01NQyAqLworI2RlZmluZSBNTUNfMjZNCQkJMHgwMTAwCisjZGVmaW5lIE1NQ181Mk0JCQkweDAyMDAKKyNkZWZpbmUgTU1DXzRCSVQJCTB4MDQwMAorI2RlZmluZSBNTUNfOEJJVAkJMHgwODAwCisjZGVmaW5lIE1NQ19TRUNUT1JfTU9ERQkJMHgxMDAwCisjZGVmaW5lIE1NQ19ERFI1MgkJMHgyMDAwCisKKy8qIFNEIGNhcmQgKi8KKyNkZWZpbmUgQ0hLX1NEKHNkX2NhcmQpCQkJKCgoc2RfY2FyZCktPnNkX3R5cGUgJiAweEZGKSA9PSBUWVBFX1NEKQorI2RlZmluZSBDSEtfU0RfSFMoc2RfY2FyZCkJXAorCShDSEtfU0Qoc2RfY2FyZCkgJiYgKChzZF9jYXJkKS0+c2RfdHlwZSAmIFNEX0hTKSkKKyNkZWZpbmUgQ0hLX1NEX1NEUjUwKHNkX2NhcmQpCQlcCisJKENIS19TRChzZF9jYXJkKSAmJiAoKHNkX2NhcmQpLT5zZF90eXBlICYgU0RfU0RSNTApKQorI2RlZmluZSBDSEtfU0RfRERSNTAoc2RfY2FyZCkJXAorCShDSEtfU0Qoc2RfY2FyZCkgJiYgKChzZF9jYXJkKS0+c2RfdHlwZSAmIFNEX0REUjUwKSkKKyNkZWZpbmUgQ0hLX1NEX1NEUjEwNChzZF9jYXJkKQlcCisJKENIS19TRChzZF9jYXJkKSAmJiAoKHNkX2NhcmQpLT5zZF90eXBlICYgU0RfU0RSMTA0KSkKKyNkZWZpbmUgQ0hLX1NEX0hDWEMoc2RfY2FyZCkJXAorCShDSEtfU0Qoc2RfY2FyZCkgJiYgKChzZF9jYXJkKS0+c2RfdHlwZSAmIFNEX0hDWEMpKQorI2RlZmluZSBDSEtfU0QzMF9TUEVFRChzZF9jYXJkKQlcCisJKENIS19TRF9TRFI1MChzZF9jYXJkKSB8fCBDSEtfU0RfRERSNTAoc2RfY2FyZCkgfHxcCisJIENIS19TRF9TRFIxMDQoc2RfY2FyZCkpCisKKyNkZWZpbmUgU0VUX1NEKHNkX2NhcmQpCQkJKChzZF9jYXJkKS0+c2RfdHlwZSA9IFRZUEVfU0QpCisjZGVmaW5lIFNFVF9TRF9IUyhzZF9jYXJkKQkJKChzZF9jYXJkKS0+c2RfdHlwZSB8PSBTRF9IUykKKyNkZWZpbmUgU0VUX1NEX1NEUjUwKHNkX2NhcmQpCQkoKHNkX2NhcmQpLT5zZF90eXBlIHw9IFNEX1NEUjUwKQorI2RlZmluZSBTRVRfU0RfRERSNTAoc2RfY2FyZCkJCSgoc2RfY2FyZCktPnNkX3R5cGUgfD0gU0RfRERSNTApCisjZGVmaW5lIFNFVF9TRF9TRFIxMDQoc2RfY2FyZCkJCSgoc2RfY2FyZCktPnNkX3R5cGUgfD0gU0RfU0RSMTA0KQorI2RlZmluZSBTRVRfU0RfSENYQyhzZF9jYXJkKQkJKChzZF9jYXJkKS0+c2RfdHlwZSB8PSBTRF9IQ1hDKQorCisjZGVmaW5lIENMUl9TRF9IUyhzZF9jYXJkKQkJKChzZF9jYXJkKS0+c2RfdHlwZSAmPSB+U0RfSFMpCisjZGVmaW5lIENMUl9TRF9TRFI1MChzZF9jYXJkKQkJKChzZF9jYXJkKS0+c2RfdHlwZSAmPSB+U0RfU0RSNTApCisjZGVmaW5lIENMUl9TRF9ERFI1MChzZF9jYXJkKQkJKChzZF9jYXJkKS0+c2RfdHlwZSAmPSB+U0RfRERSNTApCisjZGVmaW5lIENMUl9TRF9TRFIxMDQoc2RfY2FyZCkJCSgoc2RfY2FyZCktPnNkX3R5cGUgJj0gflNEX1NEUjEwNCkKKyNkZWZpbmUgQ0xSX1NEX0hDWEMoc2RfY2FyZCkJCSgoc2RfY2FyZCktPnNkX3R5cGUgJj0gflNEX0hDWEMpCisjZGVmaW5lIENMUl9TRDMwX1NQRUVEKHNkX2NhcmQpCVwKKwkoKHNkX2NhcmQpLT5zZF90eXBlICY9IH4oU0RfU0RSNTB8U0RfRERSNTB8U0RfU0RSMTA0KSkKKworLyogTU1DIGNhcmQgKi8KKyNkZWZpbmUgQ0hLX01NQyhzZF9jYXJkKQlcCisJKCgoc2RfY2FyZCktPnNkX3R5cGUgJiAweEZGKSA9PSBUWVBFX01NQykKKyNkZWZpbmUgQ0hLX01NQ18yNk0oc2RfY2FyZCkJXAorCShDSEtfTU1DKHNkX2NhcmQpICYmICgoc2RfY2FyZCktPnNkX3R5cGUgJiBNTUNfMjZNKSkKKyNkZWZpbmUgQ0hLX01NQ181Mk0oc2RfY2FyZCkJXAorCShDSEtfTU1DKHNkX2NhcmQpICYmICgoc2RfY2FyZCktPnNkX3R5cGUgJiBNTUNfNTJNKSkKKyNkZWZpbmUgQ0hLX01NQ180QklUKHNkX2NhcmQpCVwKKwkoQ0hLX01NQyhzZF9jYXJkKSAmJiAoKHNkX2NhcmQpLT5zZF90eXBlICYgTU1DXzRCSVQpKQorI2RlZmluZSBDSEtfTU1DXzhCSVQoc2RfY2FyZCkJXAorCShDSEtfTU1DKHNkX2NhcmQpICYmICgoc2RfY2FyZCktPnNkX3R5cGUgJiBNTUNfOEJJVCkpCisjZGVmaW5lIENIS19NTUNfU0VDVE9SX01PREUoc2RfY2FyZClcCisJKENIS19NTUMoc2RfY2FyZCkgJiYgKChzZF9jYXJkKS0+c2RfdHlwZSAmIE1NQ19TRUNUT1JfTU9ERSkpCisjZGVmaW5lIENIS19NTUNfRERSNTIoc2RfY2FyZCkJXAorCShDSEtfTU1DKHNkX2NhcmQpICYmICgoc2RfY2FyZCktPnNkX3R5cGUgJiBNTUNfRERSNTIpKQorCisjZGVmaW5lIFNFVF9NTUMoc2RfY2FyZCkJCSgoc2RfY2FyZCktPnNkX3R5cGUgPSBUWVBFX01NQykKKyNkZWZpbmUgU0VUX01NQ18yNk0oc2RfY2FyZCkJCSgoc2RfY2FyZCktPnNkX3R5cGUgfD0gTU1DXzI2TSkKKyNkZWZpbmUgU0VUX01NQ181Mk0oc2RfY2FyZCkJCSgoc2RfY2FyZCktPnNkX3R5cGUgfD0gTU1DXzUyTSkKKyNkZWZpbmUgU0VUX01NQ180QklUKHNkX2NhcmQpCQkoKHNkX2NhcmQpLT5zZF90eXBlIHw9IE1NQ180QklUKQorI2RlZmluZSBTRVRfTU1DXzhCSVQoc2RfY2FyZCkJCSgoc2RfY2FyZCktPnNkX3R5cGUgfD0gTU1DXzhCSVQpCisjZGVmaW5lIFNFVF9NTUNfU0VDVE9SX01PREUoc2RfY2FyZCkJKChzZF9jYXJkKS0+c2RfdHlwZSB8PSBNTUNfU0VDVE9SX01PREUpCisjZGVmaW5lIFNFVF9NTUNfRERSNTIoc2RfY2FyZCkJCSgoc2RfY2FyZCktPnNkX3R5cGUgfD0gTU1DX0REUjUyKQorCisjZGVmaW5lIENMUl9NTUNfMjZNKHNkX2NhcmQpCQkoKHNkX2NhcmQpLT5zZF90eXBlICY9IH5NTUNfMjZNKQorI2RlZmluZSBDTFJfTU1DXzUyTShzZF9jYXJkKQkJKChzZF9jYXJkKS0+c2RfdHlwZSAmPSB+TU1DXzUyTSkKKyNkZWZpbmUgQ0xSX01NQ180QklUKHNkX2NhcmQpCQkoKHNkX2NhcmQpLT5zZF90eXBlICY9IH5NTUNfNEJJVCkKKyNkZWZpbmUgQ0xSX01NQ184QklUKHNkX2NhcmQpCQkoKHNkX2NhcmQpLT5zZF90eXBlICY9IH5NTUNfOEJJVCkKKyNkZWZpbmUgQ0xSX01NQ19TRUNUT1JfTU9ERShzZF9jYXJkKQkoKHNkX2NhcmQpLT5zZF90eXBlICY9IH5NTUNfU0VDVE9SX01PREUpCisjZGVmaW5lIENMUl9NTUNfRERSNTIoc2RfY2FyZCkJCSgoc2RfY2FyZCktPnNkX3R5cGUgJj0gfk1NQ19ERFI1MikKKworI2RlZmluZSBDSEtfTU1DX0hTKHNkX2NhcmQpCVwKKwkoQ0hLX01NQ181Mk0oc2RfY2FyZCkgJiYgQ0hLX01NQ18yNk0oc2RfY2FyZCkpCisjZGVmaW5lIENMUl9NTUNfSFMoc2RfY2FyZCkJCQlcCitkbyB7CQkJCQkJXAorCUNMUl9NTUNfRERSNTIoc2RfY2FyZCk7CQkJXAorCUNMUl9NTUNfNTJNKHNkX2NhcmQpOwkJCVwKKwlDTFJfTU1DXzI2TShzZF9jYXJkKTsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNEX1NVUFBPUlRfQ0xBU1NfVEVOCQkweDAxCisjZGVmaW5lIFNEX1NVUFBPUlRfMVY4CQkJMHgwMgorCisjZGVmaW5lIFNEX1NFVF9DTEFTU19URU4oc2RfY2FyZCkJXAorCSgoc2RfY2FyZCktPnNkX3NldHRpbmcgfD0gU0RfU1VQUE9SVF9DTEFTU19URU4pCisjZGVmaW5lIFNEX0NIS19DTEFTU19URU4oc2RfY2FyZCkJXAorCSgoc2RfY2FyZCktPnNkX3NldHRpbmcgJiBTRF9TVVBQT1JUX0NMQVNTX1RFTikKKyNkZWZpbmUgU0RfQ0xSX0NMQVNTX1RFTihzZF9jYXJkKQlcCisJKChzZF9jYXJkKS0+c2Rfc2V0dGluZyAmPSB+U0RfU1VQUE9SVF9DTEFTU19URU4pCisjZGVmaW5lIFNEX1NFVF8xVjgoc2RfY2FyZCkJCVwKKwkoKHNkX2NhcmQpLT5zZF9zZXR0aW5nIHw9IFNEX1NVUFBPUlRfMVY4KQorI2RlZmluZSBTRF9DSEtfMVY4KHNkX2NhcmQpCQlcCisJKChzZF9jYXJkKS0+c2Rfc2V0dGluZyAmIFNEX1NVUFBPUlRfMVY4KQorI2RlZmluZSBTRF9DTFJfMVY4KHNkX2NhcmQpCQlcCisJKChzZF9jYXJkKS0+c2Rfc2V0dGluZyAmPSB+U0RfU1VQUE9SVF8xVjgpCisjZGVmaW5lIENMUl9SRVRSWV9TRDIwX01PREUoc2RfY2FyZCkJCVwKKwkoKHNkX2NhcmQpLT5yZXRyeV9TRDIwX21vZGUgPSAwKQorI2RlZmluZSBTRVRfUkVUUllfU0QyMF9NT0RFKHNkX2NhcmQpCQlcCisJKChzZF9jYXJkKS0+cmV0cnlfU0QyMF9tb2RlID0gMSkKKyNkZWZpbmUgQ0hLX1JFVFJZX1NEMjBfTU9ERShzZF9jYXJkKQkJXAorCSgoc2RfY2FyZCktPnJldHJ5X1NEMjBfbW9kZSA9PSAxKQorCitzdHJ1Y3Qgc2RfaW5mbyB7CisJdTE2IHNkX3R5cGU7CisJdTggZXJyX2NvZGU7CisJdTggc2RfZGF0YV9idWZfcmVhZHk7CisJdTMyIHNkX2FkZHI7CisJdTMyIGNhcGFjaXR5OworCisJdTggcmF3X2NzZFsxNl07CisJdTggcmF3X3Njcls4XTsKKworCS8qIFNlcXVlbnRpYWwgUlcgKi8KKwlpbnQgc2VxX21vZGU7CisJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gcHJlX2RpcjsKKwl1MzIgcHJlX3NlY19hZGRyOworCXUxNiBwcmVfc2VjX2NudDsKKworCWludCBjb3VudGVyOworCisJaW50IHNkX2Nsb2NrOworCisjaWZkZWYgU1VQUE9SVF9DUFJNCisJaW50IHNkX3Bhc3NfdGhydV9lbjsKKwlpbnQgcHJlX2NtZF9lcnI7CisJdTggbGFzdF9yc3BfdHlwZTsKKwl1OCByc3BbMTddOworI2VuZGlmCisKKwl1OCBmdW5jX2dyb3VwMV9tYXNrOworCXU4IGZ1bmNfZ3JvdXAyX21hc2s7CisJdTggZnVuY19ncm91cDNfbWFzazsKKwl1OCBmdW5jX2dyb3VwNF9tYXNrOworCisJdTggc2Rfc3dpdGNoX2ZhaWw7CisJdTggc2RfcmVhZF9waGFzZTsKKwl1OCByZXRyeV9TRDIwX21vZGU7CS8qIHNhbmdkeTIwMTAtMDYtMTAgKi8KKwl1OCBzZF9yZXNldF9mYWlsOwkvKiBzYW5nZHkyMDEwLTA3LTAxICovCisJdTggc2Rfc2VuZF9zdGF0dXNfZW47CisKKyNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKKwl1OCBzZF9sb2NrX3N0YXR1czsKKwl1OCBzZF9lcmFzZV9zdGF0dXM7CisJdTggc2RfbG9ja19ub3RpZnk7CisjZW5kaWYKK307CisKKyNkZWZpbmUgTU9ERV81MTJfU0VRCQkweDAxCisjZGVmaW5lIE1PREVfMktfU0VRCQkweDAyCisKKyNkZWZpbmUgVFlQRV9NUwkJCTB4MDAwMAorI2RlZmluZSBUWVBFX01TUFJPCQkweDAwMDEKKworI2RlZmluZSBNU180QklUCQkJMHgwMTAwCisjZGVmaW5lIE1TXzhCSVQJCQkweDAyMDAKKyNkZWZpbmUgTVNfSEcJCQkweDA0MDAKKyNkZWZpbmUgTVNfWEMJCQkweDA4MDAKKworI2RlZmluZSBIRzhCSVQJCQkoTVNfSEcgfCBNU184QklUKQorCisjZGVmaW5lIENIS19NU1BSTyhtc19jYXJkKQlcCisJKCgobXNfY2FyZCktPm1zX3R5cGUgJiAweEZGKSA9PSBUWVBFX01TUFJPKQorI2RlZmluZSBDSEtfSEc4QklUKG1zX2NhcmQpCVwKKwkoQ0hLX01TUFJPKG1zX2NhcmQpICYmICgoKG1zX2NhcmQpLT5tc190eXBlICYgSEc4QklUKSA9PSBIRzhCSVQpKQorI2RlZmluZSBDSEtfTVNYQyhtc19jYXJkKQlcCisJKENIS19NU1BSTyhtc19jYXJkKSAmJiAoKG1zX2NhcmQpLT5tc190eXBlICYgTVNfWEMpKQorI2RlZmluZSBDSEtfTVNIRyhtc19jYXJkKQlcCisJKENIS19NU1BSTyhtc19jYXJkKSAmJiAoKG1zX2NhcmQpLT5tc190eXBlICYgTVNfSEcpKQorCisjZGVmaW5lIENIS19NUzhCSVQobXNfY2FyZCkJKCgobXNfY2FyZCktPm1zX3R5cGUgJiBNU184QklUKSkKKyNkZWZpbmUgQ0hLX01TNEJJVChtc19jYXJkKQkoKChtc19jYXJkKS0+bXNfdHlwZSAmIE1TXzRCSVQpKQorCitzdHJ1Y3QgbXNfZGVsYXlfd3JpdGVfdGFnIHsKKwl1MTYgb2xkX3BoeWJsb2NrOworCXUxNiBuZXdfcGh5YmxvY2s7CisJdTE2IGxvZ2Jsb2NrOworCXU4IHBhZ2VvZmY7CisJdTggZGVsYXlfd3JpdGVfZmxhZzsKK307CisKK3N0cnVjdCBtc19pbmZvIHsKKwl1MTYgbXNfdHlwZTsKKwl1OCBibG9ja19zaGlmdDsKKwl1OCBwYWdlX29mZjsKKwl1MTYgdG90YWxfYmxvY2s7CisJdTE2IGJvb3RfYmxvY2s7CisJdTMyIGNhcGFjaXR5OworCisJdTggY2hlY2tfbXNfZmxvdzsKKwl1OCBzd2l0Y2hfOGJpdF9mYWlsOworCXU4IGVycl9jb2RlOworCisJc3RydWN0IHpvbmVfZW50cnkgKnNlZ21lbnQ7CisJaW50IHNlZ21lbnRfY250OworCisJaW50IHByb191bmRlcl9mb3JtYXR0aW5nOworCWludCBmb3JtYXRfc3RhdHVzOworCXUxNiBwcm9ncmVzczsKKwl1OCByYXdfc3lzX2luZm9bOTZdOworI2lmZGVmIFNVUFBPUlRfUENHTF8xUDE4CisJdTggcmF3X21vZGVsX25hbWVbNDhdOworI2VuZGlmCisKKwl1OCBtdWx0aV9mbGFnOworCisJLyogU2VxdWVudGlhbCBSVyAqLworCXU4IHNlcV9tb2RlOworCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIHByZV9kaXI7CisJdTMyIHByZV9zZWNfYWRkcjsKKwl1MTYgcHJlX3NlY19jbnQ7CisJdTMyIHRvdGFsX3NlY19jbnQ7CisJdTggbGFzdF9yd19pbnQ7CisKKwlzdHJ1Y3QgbXNfZGVsYXlfd3JpdGVfdGFnIGRlbGF5X3dyaXRlOworCisJaW50IGNvdW50ZXI7CisKKwlpbnQgbXNfY2xvY2s7CisKKyNpZmRlZiBTVVBQT1JUX01BR0lDX0dBVEUKKwl1OCBtYWdpY19nYXRlX2lkWzE2XTsKKwl1OCBtZ19lbnRyeV9udW07CisJaW50IG1nX2F1dGg7CQkvKiBmbGFnIHRvIGluZGljYXRlIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3MgKi8KKyNlbmRpZgorfTsKKworI2RlZmluZSBQUk9fVU5ERVJfRk9STUFUVElORyhtc19jYXJkKQkJXAorCSgobXNfY2FyZCktPnByb191bmRlcl9mb3JtYXR0aW5nKQorI2RlZmluZSBTRVRfRk9STUFUX1NUQVRVUyhtc19jYXJkLCBzdGF0dXMpCVwKKwkoKG1zX2NhcmQpLT5mb3JtYXRfc3RhdHVzID0gKHN0YXR1cykpCisjZGVmaW5lIENIS19GT1JNQVRfU1RBVFVTKG1zX2NhcmQsIHN0YXR1cykJXAorCSgobXNfY2FyZCktPmZvcm1hdF9zdGF0dXMgPT0gKHN0YXR1cykpCisKK3N0cnVjdCBzY3NpX2NtbmQ7CisKK2VudW0gQ0hJUF9TVEFUIHsgU1RBVF9JTklULCBTVEFUX0lETEUsIFNUQVRfUlVOLCBTVEFUX1NTX1BSRSwgU1RBVF9TUywKKwkgICAgU1RBVF9TVVNQRU5EIH07CisKK3N0cnVjdCBydHM1MXhfY2hpcCB7CisJdTE2IHZlbmRvcl9pZDsKKwl1MTYgcHJvZHVjdF9pZDsKKwljaGFyIG1heF9sdW47CisKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzcmI7CisJc3RydWN0IHNlbnNlX2RhdGFfdCBzZW5zZV9idWZmZXJbTUFYX0FMTE9XRURfTFVOX0NOVF07CisKKyNpZm5kZWYgTEVEX0FVVE9fQkxJTksKKwlpbnQgbGVkX3RvZ2dsZV9jb3VudGVyOworI2VuZGlmCisJaW50IHNzX2NvdW50ZXI7CisJaW50IGlkbGVfY291bnRlcjsKKwlpbnQgYXV0b19kZWxpbmtfY291bnRlcjsKKwllbnVtIENISVBfU1RBVCBjaGlwX3N0YXQ7CisKKwlpbnQgcmVzdW1lX2Zyb21fc2NzaTsKKworCS8qIENhcmQgaW5mb3JtYXRpb24gKi8KKwlzdHJ1Y3QgeGRfaW5mbyB4ZF9jYXJkOworCXN0cnVjdCBzZF9pbmZvIHNkX2NhcmQ7CisJc3RydWN0IG1zX2luZm8gbXNfY2FyZDsKKworCWludCBjdXJfY2xrOwkJLyogY3VycmVudCBjYXJkIGNsb2NrICovCisJaW50IGN1cl9jYXJkOwkJLyogQ3VycmVudCBjYXJkIG1vZHVsZSAqLworCisJdTggY2FyZF9leGlzdDsJCS8qIGNhcmQgZXhpc3QgYml0IG1hcCAocGh5c2ljYWwgZXhpc3QpICovCisJdTggY2FyZF9yZWFkeTsJCS8qIGNhcmQgcmVhZHkgYml0IG1hcCAocmVzZXQgc3VjY2Vzc2Z1bGx5KSAqLworCXU4IGNhcmRfZmFpbDsJCS8qIGNhcmQgcmVzZXQgZmFpbCBiaXQgbWFwICovCisJdTggY2FyZF9lamVjdGVkOwkvKiBjYXJkIGVqZWN0ZWQgYml0IG1hcCAqLworCXU4IGNhcmRfd3A7CQkvKiBjYXJkIHdyaXRlIHByb3RlY3RlZCBiaXQgbWFwICovCisKKwl1OCBmYWtlX2NhcmRfcmVhZHk7CisJLyogZmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIGFuc3dlciBNZWRpYUNoYW5nZSAqLworCXVuc2lnbmVkIGxvbmcgbHVuX21jOworCisJLyogY2FyZCBidXMgd2lkdGggKi8KKwl1OCBjYXJkX2J1c193aWR0aFtNQVhfQUxMT1dFRF9MVU5fQ05UXTsKKwkvKiBjYXJkIGNhcGFjaXR5ICovCisJdTMyIGNhcGFjaXR5W01BWF9BTExPV0VEX0xVTl9DTlRdOworCisJLyogcmVhZC93cml0ZSBjYXJkIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKwljYXJkX3J3X2Z1bmMgcndfY2FyZFtNQVhfQUxMT1dFRF9MVU5fQ05UXTsKKwkvKiByZWFkL3dyaXRlIGNhcGFjaXR5LCB1c2VkIGZvciBHUElPIFRvZ2dsZSAqLworCXUzMiByd19jYXBbTUFYX0FMTE9XRURfTFVOX0NOVF07CisJLyogY2FyZCB0byBsdW4gbWFwcGluZyB0YWJsZSAqLworCXU4IGNhcmQybHVuWzMyXTsKKwkvKiBsdW4gdG8gY2FyZCBtYXBwaW5nIHRhYmxlICovCisJdTggbHVuMmNhcmRbTUFYX0FMTE9XRURfTFVOX0NOVF07CisKKyNpZmRlZiBfTVNHX1RSQUNFCisJc3RydWN0IHRyYWNlX21zZ190IHRyYWNlX21zZ1tUUkFDRV9JVEVNX0NOVF07CisJaW50IG1zZ19pZHg7CisjZW5kaWYKKworCWludCByd19uZWVkX3JldHJ5OworCisJLyogQVNJQyBvciBGUEdBICovCisJaW50IGFzaWNfY29kZTsKKworCS8qIFFGTjI0IG9yIExRRlA0OCAqLworCWludCBwYWNrYWdlOworCisJLyogRnVsbCBTcGVlZCBvciBIaWdoIFNwZWVkICovCisJaW50IHVzYl9zcGVlZDsKKworCS8qc2FuZ2R5OmVuYWJsZSBvciBkaXNhYmxlIFVIUzUwIGFuZCBNTUM0LjQgKi8KKwlpbnQgdWhzNTBfbW1jNDRfZW47CisKKwl1OCBpY192ZXJzaW9uOworCisJLyogQ29tbWFuZCBidWZmZXIgKi8KKwl1OCAqY21kX2J1ZjsKKwl1bnNpZ25lZCBpbnQgY21kX2lkeDsKKwkvKiBSZXNwb25zZSBidWZmZXIgKi8KKwl1OCAqcnNwX2J1ZjsKKworCXUxNiBjYXJkX3N0YXR1czsKKworI2lmZGVmIFNVUFBPUlRfT0NQCisJdTE2IG9jcF9zdGF0OworI2VuZGlmCisKKwlzdHJ1Y3QgcnRzNTF4X29wdGlvbiBvcHRpb247CisJc3RydWN0IHJ0czUxeF91c2IgKnVzYjsKKworCXU4IHJjY19yZWFkX3Jlc3BvbnNlOworCWludCByZXNldF9uZWVkX3JldHJ5OworCXU4IHJ0czUxNzk7Cit9OworCisjZGVmaW5lIFVIUzUwX0VOIDB4MDAwMQorI2RlZmluZSBVSFM1MF9ESVMgMHgwMDAwCisjZGVmaW5lIFNFVF9VSFM1MChjaGlwKSAgICgoY2hpcCktPnVoczUwX21tYzQ0X2VuID0gVUhTNTBfRU4pCisjZGVmaW5lIENMRUFSX1VIUzUwKGNoaXApICAoKGNoaXApLT51aHM1MF9tbWM0NF9lbiA9IFVIUzUwX0RJUykKKyNkZWZpbmUgQ0hFQ0tfVUhTNTAoY2hpcCkgICgoKGNoaXApLT51aHM1MF9tbWM0NF9lbiYweGZmKSA9PSBVSFM1MF9FTikKKworI2RlZmluZSBSVFM1MVhfR0VUX1ZJRChjaGlwKQkJKChjaGlwKS0+dmVuZG9yX2lkKQorI2RlZmluZSBSVFM1MVhfR0VUX1BJRChjaGlwKQkJKChjaGlwKS0+cHJvZHVjdF9pZCkKKworI2RlZmluZSBSVFM1MVhfU0VUX1NUQVQoY2hpcCwgc3RhdCkJCQlcCitkbyB7CQkJCQkJCVwKKwlpZiAoKHN0YXQpICE9IFNUQVRfSURMRSkgewkJCVwKKwkJKGNoaXApLT5pZGxlX2NvdW50ZXIgPSAwOwkJXAorCX0JCQkJCQlcCisJKGNoaXApLT5jaGlwX3N0YXQgPSAoZW51bSBDSElQX1NUQVQpKHN0YXQpOwlcCit9IHdoaWxlICgwKQorI2RlZmluZSBSVFM1MVhfQ0hLX1NUQVQoY2hpcCwgc3RhdCkJKChjaGlwKS0+Y2hpcF9zdGF0ID09IChzdGF0KSkKKyNkZWZpbmUgUlRTNTFYX0dFVF9TVEFUKGNoaXApCQkoKGNoaXApLT5jaGlwX3N0YXQpCisKKyNkZWZpbmUgQ0hFQ0tfUElEKGNoaXAsIHBpZCkJCShSVFM1MVhfR0VUX1BJRChjaGlwKSA9PSAocGlkKSkKKyNkZWZpbmUgQ0hFQ0tfUEtHKGNoaXAsIHBrZykJCSgoY2hpcCktPnBhY2thZ2UgPT0gKHBrZykpCisjZGVmaW5lIENIRUNLX1VTQihjaGlwLCBzcGVlZCkJCSgoY2hpcCktPnVzYl9zcGVlZCA9PSAoc3BlZWQpKQorCitpbnQgcnRzNTF4X3Jlc2V0X2NoaXAoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKTsKK2ludCBydHM1MXhfaW5pdF9jaGlwKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7CitpbnQgcnRzNTF4X3JlbGVhc2VfY2hpcChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApOwordm9pZCBydHM1MXhfcG9sbGluZ19mdW5jKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydHM1MXhfaW5pdF9jbWQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCWNoaXAtPmNtZF9pZHggPSAwOworCWNoaXAtPmNtZF9idWZbMF0gPSAnUic7CisJY2hpcC0+Y21kX2J1ZlsxXSA9ICdUJzsKKwljaGlwLT5jbWRfYnVmWzJdID0gJ0MnOworCWNoaXAtPmNtZF9idWZbM10gPSAnUic7CisJY2hpcC0+Y21kX2J1ZltQQUNLRVRfVFlQRV0gPSBCQVRDSF9DTUQ7Cit9CisKK3ZvaWQgcnRzNTF4X2FkZF9jbWQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLAorCQkgICAgdTggY21kX3R5cGUsIHUxNiByZWdfYWRkciwgdTggbWFzaywgdTggZGF0YSk7CitpbnQgcnRzNTF4X3NlbmRfY21kKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggZmxhZywgaW50IHRpbWVvdXQpOworaW50IHJ0czUxeF9nZXRfcnNwKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgaW50IHJzcF9sZW4sIGludCB0aW1lb3V0KTsKKworc3RhdGljIGlubGluZSB2b2lkIHJ0czUxeF9yZWFkX3JzcF9idWYoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCBpbnQgb2Zmc2V0LAorCQkJCSAgICAgICB1OCAqYnVmLCBpbnQgYnVmX2xlbikKK3sKKwltZW1jcHkoYnVmLCBjaGlwLT5yc3BfYnVmICsgb2Zmc2V0LCBidWZfbGVuKTsKK30KKworc3RhdGljIGlubGluZSB1OCAqcnRzNTF4X2dldF9yc3BfZGF0YShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJcmV0dXJuIGNoaXAtPnJzcF9idWY7Cit9CisKK2ludCBydHM1MXhfZ2V0X2NhcmRfc3RhdHVzKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTE2ICogc3RhdHVzKTsKK2ludCBydHM1MXhfd3JpdGVfcmVnaXN0ZXIoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1MTYgYWRkciwgdTggbWFzaywgdTggZGF0YSk7CitpbnQgcnRzNTF4X3JlYWRfcmVnaXN0ZXIoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1MTYgYWRkciwgdTggKiBkYXRhKTsKK2ludCBydHM1MXhfZXAwX3dyaXRlX3JlZ2lzdGVyKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTE2IGFkZHIsIHU4IG1hc2ssCisJCQkgICAgICB1OCBkYXRhKTsKK2ludCBydHM1MXhfZXAwX3JlYWRfcmVnaXN0ZXIoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1MTYgYWRkciwgdTggKiBkYXRhKTsKK2ludCBydHM1MXhfc2VxX3dyaXRlX3JlZ2lzdGVyKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTE2IGFkZHIsIHUxNiBsZW4sCisJCQkgICAgICB1OCAqZGF0YSk7CitpbnQgcnRzNTF4X3NlcV9yZWFkX3JlZ2lzdGVyKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTE2IGFkZHIsIHUxNiBsZW4sCisJCQkgICAgIHU4ICpkYXRhKTsKK2ludCBydHM1MXhfcmVhZF9wcGJ1ZihzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4ICpidWYsIGludCBidWZfbGVuKTsKK2ludCBydHM1MXhfd3JpdGVfcHBidWYoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCAqYnVmLCBpbnQgYnVmX2xlbik7CitpbnQgcnRzNTF4X3dyaXRlX3BoeV9yZWdpc3RlcihzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IGFkZHIsIHU4IHZhbCk7CitpbnQgcnRzNTF4X3JlYWRfcGh5X3JlZ2lzdGVyKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggYWRkciwgdTggKnZhbCk7Cit2b2lkIHJ0czUxeF9kb19iZWZvcmVfcG93ZXJfZG93bihzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApOwordm9pZCBydHM1MXhfY2xlYXJfaHdfZXJyb3Ioc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKTsKK3ZvaWQgcnRzNTF4X3ByZXBhcmVfcnVuKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7Cit2b2lkIHJ0czUxeF90cmFjZV9tc2coc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBjbGVhcik7Cit2b2lkIHJ0czUxeF9wcF9zdGF0dXMoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgbHVuLCB1OCAqc3RhdHVzLAorCQkgICAgICB1OCBzdGF0dXNfbGVuKTsKK3ZvaWQgcnRzNTF4X3JlYWRfc3RhdHVzKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IGx1biwKKwkJCXU4ICpydHM1MXhfc3RhdHVzLCB1OCBzdGF0dXNfbGVuKTsKK2ludCBydHM1MXhfdHJhbnNmZXJfZGF0YV9yY2Moc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgcGlwZSwKKwkJCSAgICAgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgdXNlX3NnLAorCQkJICAgICB1bnNpZ25lZCBpbnQgKmFjdF9sZW4sIGludCB0aW1lb3V0LCB1OCBzdGFnZV9mbGFnKTsKKworI2RlZmluZSBSVFM1MVhfV1JJVEVfUkVHKGNoaXAsIGFkZHIsIG1hc2ssIGRhdGEpCVwKK2RvIHsJCQkJCQkJXAorCWludCBfcmV0dmFsID0gcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKChjaGlwKSwJXAorCQkJKGFkZHIpLCAobWFzayksIChkYXRhKSk7CVwKKwlpZiAoX3JldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewkJXAorCQlUUkFDRV9SRVQoKGNoaXApLCBfcmV0dmFsKTsJCVwKKwl9CQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBSVFM1MVhfUkVBRF9SRUcoY2hpcCwgYWRkciwgZGF0YSkJCVwKK2RvIHsJCQkJCQkJXAorCWludCBfcmV0dmFsID0gcnRzNTF4X3JlYWRfcmVnaXN0ZXIoKGNoaXApLAlcCisJCQkoYWRkciksIChkYXRhKSk7CQlcCisJaWYgKF9yZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsJCVwKKwkJVFJBQ0VfUkVUKChjaGlwKSwgX3JldHZhbCk7CQlcCisJfQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNlbmRpZiAvKiBfX1JUUzUxWF9DSElQX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF9mb3AuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF9mb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWFlYmI2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X2ZvcC5jCkBAIC0wLDAgKzEsMjk4IEBACisvKiBEcml2ZXIgZm9yIFJlYWx0ZWsgUlRTNTF4eCBVU0IgY2FyZCByZWFkZXIKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOSBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogQXV0aG9yOgorICogICB3d2FuZyAod2VpX3dhbmdAcmVhbHNpbC5jb20uY24pCisgKiAgIE5vLiA0NTAsIFNoZW5odSBSb2FkLCBTdXpob3UgSW5kdXN0cnkgUGFyaywgU3V6aG91LCBDaGluYQorICogTWFpbnRhaW5lcjoKKyAqICAgRWR3aW4gUm9uZyAoZWR3aW5fcm9uZ0ByZWFsc2lsLmNvbS5jbikKKyAqICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisgKi8KKworI2luY2x1ZGUgInJ0czUxeC5oIgorCisjaWZkZWYgU1VQUE9SVF9GSUxFX09QCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAicnRzNTF4X2NoaXAuaCIKKyNpbmNsdWRlICJydHM1MXhfY2FyZC5oIgorI2luY2x1ZGUgInJ0czUxeF9mb3AuaCIKKyNpbmNsdWRlICJzZF9jcHJtLmgiCisjaW5jbHVkZSAicnRzNTF4LmgiCisKKyNkZWZpbmUgUlRTNTEzOV9JT0NfTUFHSUMJCTB4MzkKKworI2RlZmluZSBSVFM1MTM5X0lPQ19TRF9ESVJFQ1QJCV9JT1dSKFJUUzUxMzlfSU9DX01BR0lDLCAweEEwLCBpbnQpCisjZGVmaW5lIFJUUzUxMzlfSU9DX1NEX0dFVF9SU1AJCV9JT1dSKFJUUzUxMzlfSU9DX01BR0lDLCAweEExLCBpbnQpCisKK3N0YXRpYyBpbnQgcnRzNTF4X3NkX2RpcmVjdF9jbW5kKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwKKwkJCQkgc3RydWN0IHNkX2RpcmVjdF9jbW5kICpjbW5kKQoreworCWludCByZXR2YWw7CisJdTggZGlyLCBjbWQxMiwgc3RhbmRieSwgYWNtZCwgY21kX2lkeCwgcnNwX2NvZGU7CisJdTggKmJ1ZjsKKwl1MzIgYXJnLCBsZW47CisKKwlkaXIgPSAoY21uZC0+Y21uZFswXSA+PiAzKSAmIDB4MDM7CisJY21kMTIgPSAoY21uZC0+Y21uZFswXSA+PiAyKSAmIDB4MDE7CisJc3RhbmRieSA9IChjbW5kLT5jbW5kWzBdID4+IDEpICYgMHgwMTsKKwlhY21kID0gY21uZC0+Y21uZFswXSAmIDB4MDE7CisJY21kX2lkeCA9IGNtbmQtPmNtbmRbMV07CisJYXJnID0gKCh1MzIpIChjbW5kLT5jbW5kWzJdKSA8PCAyNCkgfCAoKHUzMikgKGNtbmQtPmNtbmRbM10pIDw8IDE2KSB8CisJICAgICgodTMyKSAoY21uZC0+Y21uZFs0XSkgPDwgOCkgfCBjbW5kLT5jbW5kWzVdOworCWxlbiA9CisJICAgICgodTMyKSAoY21uZC0+Y21uZFs2XSkgPDwgMTYpIHwgKCh1MzIpIChjbW5kLT5jbW5kWzddKSA8PCA4KSB8CisJICAgIGNtbmQtPmNtbmRbOF07CisJcnNwX2NvZGUgPSBjbW5kLT5jbW5kWzldOworCisJaWYgKGRpcikgeworCQlpZiAoIWNtbmQtPmJ1ZiB8fCAoY21uZC0+YnVmX2xlbiA8IGxlbikpCisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCX0KKworCXN3aXRjaCAoZGlyKSB7CisJY2FzZSAwOgorCQkvKiBObyBkYXRhICovCisJCXJldHZhbCA9IGV4dF9zZF9leGVjdXRlX25vX2RhdGEoY2hpcCwgY2hpcC0+Y2FyZDJsdW5bU0RfQ0FSRF0sCisJCQkJCQljbWRfaWR4LCBzdGFuZGJ5LCBhY21kLAorCQkJCQkJcnNwX2NvZGUsIGFyZyk7CisJCWlmIChyZXR2YWwgIT0gVFJBTlNQT1JUX0dPT0QpCisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlicmVhazsKKworCWNhc2UgMToKKwkJLyogUmVhZCBmcm9tIGNhcmQgKi8KKwkJYnVmID0ga21hbGxvYyhjbW5kLT5idWZfbGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFidWYpCisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX05PTUVNKTsKKworCQlyZXR2YWwgPSBleHRfc2RfZXhlY3V0ZV9yZWFkX2RhdGEoY2hpcCwgY2hpcC0+Y2FyZDJsdW5bU0RfQ0FSRF0sCisJCQkJCQkgIGNtZF9pZHgsIGNtZDEyLCBzdGFuZGJ5LCBhY21kLAorCQkJCQkJICByc3BfY29kZSwgYXJnLCBsZW4sIGJ1ZiwKKwkJCQkJCSAgY21uZC0+YnVmX2xlbiwgMCk7CisJCWlmIChyZXR2YWwgIT0gVFJBTlNQT1JUX0dPT0QpIHsKKwkJCWtmcmVlKGJ1Zik7CisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQl9CisKKwkJcmV0dmFsID0KKwkJICAgIGNvcHlfdG9fdXNlcigodm9pZCAqKWNtbmQtPmJ1ZiwgKHZvaWQgKilidWYsIGNtbmQtPmJ1Zl9sZW4pOworCQlpZiAocmV0dmFsKSB7CisJCQlrZnJlZShidWYpOworCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19OT01FTSk7CisJCX0KKworCQlrZnJlZShidWYpOworCQlicmVhazsKKworCWNhc2UgMjoKKwkJLyogV3JpdGUgdG8gY2FyZCAqLworCQlidWYgPSBrbWFsbG9jKGNtbmQtPmJ1Zl9sZW4sIEdGUF9LRVJORUwpOworCQlpZiAoIWJ1ZikKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfTk9NRU0pOworCisJCXJldHZhbCA9CisJCSAgICBjb3B5X2Zyb21fdXNlcigodm9pZCAqKWJ1ZiwgKHZvaWQgKiljbW5kLT5idWYsCisJCQkJICAgY21uZC0+YnVmX2xlbik7CisJCWlmIChyZXR2YWwpIHsKKwkJCWtmcmVlKGJ1Zik7CisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX05PTUVNKTsKKwkJfQorCisJCXJldHZhbCA9CisJCSAgICBleHRfc2RfZXhlY3V0ZV93cml0ZV9kYXRhKGNoaXAsIGNoaXAtPmNhcmQybHVuW1NEX0NBUkRdLAorCQkJCQkgICAgICBjbWRfaWR4LCBjbWQxMiwgc3RhbmRieSwgYWNtZCwKKwkJCQkJICAgICAgcnNwX2NvZGUsIGFyZywgbGVuLCBidWYsCisJCQkJCSAgICAgIGNtbmQtPmJ1Zl9sZW4sIDApOworCQlpZiAocmV0dmFsICE9IFRSQU5TUE9SVF9HT09EKSB7CisJCQlrZnJlZShidWYpOworCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJfQorCisJCWtmcmVlKGJ1Zik7CisKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBydHM1MXhfc2RfZ2V0X3JzcChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHN0cnVjdCBzZF9yc3AgKnJzcCkKK3sKKwlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CisJaW50IGNvdW50ID0gMCwgcmV0dmFsOworCisJaWYgKHNkX2NhcmQtPnByZV9jbWRfZXJyKSB7CisJCXNkX2NhcmQtPnByZV9jbWRfZXJyID0gMDsKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwl9CisKKwlpZiAoc2RfY2FyZC0+bGFzdF9yc3BfdHlwZSA9PSBTRF9SU1BfVFlQRV9SMCkKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwllbHNlIGlmIChzZF9jYXJkLT5sYXN0X3JzcF90eXBlID09IFNEX1JTUF9UWVBFX1IyKQorCQljb3VudCA9IChyc3AtPnJzcF9sZW4gPCAxNykgPyByc3AtPnJzcF9sZW4gOiAxNzsKKwllbHNlCisJCWNvdW50ID0gKHJzcC0+cnNwX2xlbiA8IDYpID8gcnNwLT5yc3BfbGVuIDogNjsKKworCXJldHZhbCA9IGNvcHlfdG9fdXNlcigodm9pZCAqKXJzcC0+cnNwLCAodm9pZCAqKXNkX2NhcmQtPnJzcCwgY291bnQpOworCWlmIChyZXR2YWwpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfTk9NRU0pOworCisJUlRTNTFYX0RFQlVHUCgiUmVzcG9uc2UgbGVuZ3RoOiAlZFxuIiwgY291bnQpOworCVJUUzUxWF9ERUJVR1AoIlJlc3BvbnNlOiAweCV4IDB4JXggMHgleCAweCV4XG4iLAorCQkgICAgICAgc2RfY2FyZC0+cnNwWzBdLCBzZF9jYXJkLT5yc3BbMV0sIHNkX2NhcmQtPnJzcFsyXSwKKwkJICAgICAgIHNkX2NhcmQtPnJzcFszXSk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2ludCBydHM1MXhfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXA7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKKwlpbnQgc3VibWlub3I7CisJaW50IHJldHZhbCA9IDA7CisKKwlzdWJtaW5vciA9IGltaW5vcihpbm9kZSk7CisKKwlpbnRlcmZhY2UgPSB1c2JfZmluZF9pbnRlcmZhY2UoJnJ0czUxeF9kcml2ZXIsIHN1Ym1pbm9yKTsKKwlpZiAoIWludGVyZmFjZSkgeworCQlSVFM1MVhfREVCVUdQKCIlcyAtIGVycm9yLCBjYW4ndCBmaW5kIGRldmljZSBmb3IgbWlub3IgJWRcbiIsCisJCQkgICAgICAgX19mdW5jX18sIHN1Ym1pbm9yKTsKKwkJcmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBleGl0OworCX0KKworCWNoaXAgPSAoc3RydWN0IHJ0czUxeF9jaGlwICopdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCWlmICghY2hpcCkgeworCQlSVFM1MVhfREVCVUdQKCJDYW4ndCBmaW5kIGNoaXBcbiIpOworCQlyZXR2YWwgPSAtRU5PREVWOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogSW5jcmVhc2Ugb3VyIHJlZmVyZW5jZSB0byB0aGUgaG9zdCAqLworCXNjc2lfaG9zdF9nZXQocnRzNTF4X3RvX2hvc3QoY2hpcCkpOworCisJLyogbG9jayB0aGUgZGV2aWNlIHBvaW50ZXJzICovCisJbXV0ZXhfbG9jaygmKGNoaXAtPnVzYi0+ZGV2X211dGV4KSk7CisKKwkvKiBzYXZlIG91ciBvYmplY3QgaW4gdGhlIGZpbGUncyBwcml2YXRlIHN0cnVjdHVyZSAqLworCWZpbHAtPnByaXZhdGVfZGF0YSA9IGNoaXA7CisKKwkvKiB1bmxvY2sgdGhlIGRldmljZSBwb2ludGVycyAqLworCW11dGV4X3VubG9jaygmY2hpcC0+dXNiLT5kZXZfbXV0ZXgpOworCitleGl0OgorCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBydHM1MXhfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXA7CisKKwljaGlwID0gKHN0cnVjdCBydHM1MXhfY2hpcCAqKWZpbHAtPnByaXZhdGVfZGF0YTsKKwlpZiAoY2hpcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIERyb3Agb3VyIHJlZmVyZW5jZSB0byB0aGUgaG9zdDsgdGhlIFNDU0kgY29yZSB3aWxsIGZyZWUgaXQKKwkgKiAoYW5kICJjaGlwIiBhbG9uZyB3aXRoIGl0KSB3aGVuIHRoZSByZWZjb3VudCBiZWNvbWVzIDAuICovCisJc2NzaV9ob3N0X3B1dChydHM1MXhfdG9faG9zdChjaGlwKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3NpemVfdCBydHM1MXhfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQkgICAgbG9mZl90ICpmX3BvcykKK3sKKwlyZXR1cm4gMDsKK30KKworc3NpemVfdCBydHM1MXhfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkJICAgICBsb2ZmX3QgKmZfcG9zKQoreworCXJldHVybiAwOworfQorCisjaWYgMCAvKiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAzNikgKi8KK2ludCBydHM1MXhfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCSB1bnNpZ25lZCBsb25nIGFyZykKKyNlbHNlCitsb25nIHJ0czUxeF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCisjZW5kaWYKK3sKKwlzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXA7CisJc3RydWN0IHNkX2RpcmVjdF9jbW5kIGNtbmQ7CisJc3RydWN0IHNkX3JzcCByc3A7CisJaW50IHJldHZhbCA9IDA7CisKKwljaGlwID0gKHN0cnVjdCBydHM1MXhfY2hpcCAqKWZpbHAtPnByaXZhdGVfZGF0YTsKKwlpZiAoY2hpcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIGxvY2sgdGhlIGRldmljZSBwb2ludGVycyAqLworCW11dGV4X2xvY2soJihjaGlwLT51c2ItPmRldl9tdXRleCkpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFJUUzUxMzlfSU9DX1NEX0RJUkVDVDoKKwkJcmV0dmFsID0KKwkJICAgIGNvcHlfZnJvbV91c2VyKCh2b2lkICopJmNtbmQsICh2b2lkICopYXJnLAorCQkJCSAgIHNpemVvZihzdHJ1Y3Qgc2RfZGlyZWN0X2NtbmQpKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcmV0dmFsID0gLUVOT01FTTsKKwkJCVRSQUNFX0dPVE8oY2hpcCwgZXhpdCk7CisJCX0KKwkJcmV0dmFsID0gcnRzNTF4X3NkX2RpcmVjdF9jbW5kKGNoaXAsICZjbW5kKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcmV0dmFsID0gLUVJTzsKKwkJCVRSQUNFX0dPVE8oY2hpcCwgZXhpdCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFJUUzUxMzlfSU9DX1NEX0dFVF9SU1A6CisJCXJldHZhbCA9CisJCSAgICBjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZyc3AsICh2b2lkICopYXJnLAorCQkJCSAgIHNpemVvZihzdHJ1Y3Qgc2RfcnNwKSk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQlUUkFDRV9HT1RPKGNoaXAsIGV4aXQpOworCQl9CisJCXJldHZhbCA9IHJ0czUxeF9zZF9nZXRfcnNwKGNoaXAsICZyc3ApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlyZXR2YWwgPSAtRUlPOworCQkJVFJBQ0VfR09UTyhjaGlwLCBleGl0KTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworZXhpdDoKKwkvKiB1bmxvY2sgdGhlIGRldmljZSBwb2ludGVycyAqLworCW11dGV4X3VubG9jaygmY2hpcC0+dXNiLT5kZXZfbXV0ZXgpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfZm9wLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfZm9wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1M2Y1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF9mb3AuaApAQCAtMCwwICsxLDYyIEBACisvKiBEcml2ZXIgZm9yIFJlYWx0ZWsgUlRTNTF4eCBVU0IgY2FyZCByZWFkZXIKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOSBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogQXV0aG9yOgorICogICB3d2FuZyAod2VpX3dhbmdAcmVhbHNpbC5jb20uY24pCisgKiAgIE5vLiA0NTAsIFNoZW5odSBSb2FkLCBTdXpob3UgSW5kdXN0cnkgUGFyaywgU3V6aG91LCBDaGluYQorICogTWFpbnRhaW5lcjoKKyAqICAgRWR3aW4gUm9uZyAoZWR3aW5fcm9uZ0ByZWFsc2lsLmNvbS5jbikKKyAqICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisgKi8KKworI2lmbmRlZiBfX1JUUzUxWF9GT1BfSAorI2RlZmluZSBfX1JUUzUxWF9GT1BfSAorCisjaW5jbHVkZSAicnRzNTF4LmgiCisKKyNpZmRlZiBTVVBQT1JUX0ZJTEVfT1AKKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IHNkX2RpcmVjdF9jbW5kIHsKKwl1OCBjbW5kWzEyXTsKKwl2b2lkICpidWY7CisJaW50IGJ1Zl9sZW47Cit9OworCitzdHJ1Y3Qgc2RfcnNwIHsKKwl2b2lkICpyc3A7CisJaW50IHJzcF9sZW47Cit9OworCitpbnQgcnRzNTF4X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApOworaW50IHJ0czUxeF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKK3NzaXplX3QgcnRzNTF4X3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkJICAgIGxvZmZfdCAqZl9wb3MpOworc3NpemVfdCBydHM1MXhfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQsCisJCSAgICAgbG9mZl90ICpmX3Bvcyk7CisjaWYgMCAvKiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAzNikgKi8KK2ludCBydHM1MXhfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCSB1bnNpZ25lZCBsb25nIGFyZyk7CisjZWxzZQorbG9uZyBydHM1MXhfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKyNlbmRpZgorCisjZW5kaWYKKworI2VuZGlmIC8qIF9fUlRTNTFYX0ZPUF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfc2NzaS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X3Njc2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjMyZjllCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X3Njc2kuYwpAQCAtMCwwICsxLDIyMzQgQEAKKy8qIERyaXZlciBmb3IgUmVhbHRlayBSVFM1MXh4IFVTQiBjYXJkIHJlYWRlcgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5IFJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3JwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBBdXRob3I6CisgKiAgIHd3YW5nICh3ZWlfd2FuZ0ByZWFsc2lsLmNvbS5jbikKKyAqICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisgKiBNYWludGFpbmVyOgorICogICBFZHdpbiBSb25nIChlZHdpbl9yb25nQHJlYWxzaWwuY29tLmNuKQorICogICBOby4gNDUwLCBTaGVuaHUgUm9hZCwgU3V6aG91IEluZHVzdHJ5IFBhcmssIFN1emhvdSwgQ2hpbmEKKyAqLworCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9laC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KKworI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAicnRzNTF4LmgiCisjaW5jbHVkZSAicnRzNTF4X2NoaXAuaCIKKyNpbmNsdWRlICJydHM1MXhfc2NzaS5oIgorI2luY2x1ZGUgInJ0czUxeF9jYXJkLmgiCisjaW5jbHVkZSAicnRzNTF4X3RyYW5zcG9ydC5oIgorI2luY2x1ZGUgInJ0czUxeF9zeXMuaCIKKyNpbmNsdWRlICJzZF9jcHJtLmgiCisjaW5jbHVkZSAibXNfbWcuaCIKKyNpbmNsdWRlICJ0cmFjZS5oIgorCit2b2lkIHNjc2lfc2hvd19jb21tYW5kKHN0cnVjdCBzY3NpX2NtbmQgKnNyYikKK3sKKwljaGFyICp3aGF0ID0gTlVMTDsKKwlpbnQgaSwgdW5rbm93bl9jbWQgPSAwOworCisJc3dpdGNoIChzcmItPmNtbmRbMF0pIHsKKwljYXNlIFRFU1RfVU5JVF9SRUFEWToKKwkJd2hhdCA9IChjaGFyICopIlRFU1RfVU5JVF9SRUFEWSI7CisJCWJyZWFrOworCWNhc2UgUkVaRVJPX1VOSVQ6CisJCXdoYXQgPSAoY2hhciAqKSJSRVpFUk9fVU5JVCI7CisJCWJyZWFrOworCWNhc2UgUkVRVUVTVF9TRU5TRToKKwkJd2hhdCA9IChjaGFyICopIlJFUVVFU1RfU0VOU0UiOworCQlicmVhazsKKwljYXNlIEZPUk1BVF9VTklUOgorCQl3aGF0ID0gKGNoYXIgKikiRk9STUFUX1VOSVQiOworCQlicmVhazsKKwljYXNlIFJFQURfQkxPQ0tfTElNSVRTOgorCQl3aGF0ID0gKGNoYXIgKikiUkVBRF9CTE9DS19MSU1JVFMiOworCQlicmVhazsKKwljYXNlIDB4MDc6CisJCXdoYXQgPSAoY2hhciAqKSJSRUFTU0lHTl9CTE9DS1MiOworCQlicmVhazsKKwljYXNlIFJFQURfNjoKKwkJd2hhdCA9IChjaGFyICopIlJFQURfNiI7CisJCWJyZWFrOworCWNhc2UgV1JJVEVfNjoKKwkJd2hhdCA9IChjaGFyICopIldSSVRFXzYiOworCQlicmVhazsKKwljYXNlIFNFRUtfNjoKKwkJd2hhdCA9IChjaGFyICopIlNFRUtfNiI7CisJCWJyZWFrOworCWNhc2UgUkVBRF9SRVZFUlNFOgorCQl3aGF0ID0gKGNoYXIgKikiUkVBRF9SRVZFUlNFIjsKKwkJYnJlYWs7CisJY2FzZSBXUklURV9GSUxFTUFSS1M6CisJCXdoYXQgPSAoY2hhciAqKSJXUklURV9GSUxFTUFSS1MiOworCQlicmVhazsKKwljYXNlIFNQQUNFOgorCQl3aGF0ID0gKGNoYXIgKikiU1BBQ0UiOworCQlicmVhazsKKwljYXNlIElOUVVJUlk6CisJCXdoYXQgPSAoY2hhciAqKSJJTlFVSVJZIjsKKwkJYnJlYWs7CisJY2FzZSBSRUNPVkVSX0JVRkZFUkVEX0RBVEE6CisJCXdoYXQgPSAoY2hhciAqKSJSRUNPVkVSX0JVRkZFUkVEX0RBVEEiOworCQlicmVhazsKKwljYXNlIE1PREVfU0VMRUNUOgorCQl3aGF0ID0gKGNoYXIgKikiTU9ERV9TRUxFQ1QiOworCQlicmVhazsKKwljYXNlIFJFU0VSVkU6CisJCXdoYXQgPSAoY2hhciAqKSJSRVNFUlZFIjsKKwkJYnJlYWs7CisJY2FzZSBSRUxFQVNFOgorCQl3aGF0ID0gKGNoYXIgKikiUkVMRUFTRSI7CisJCWJyZWFrOworCWNhc2UgQ09QWToKKwkJd2hhdCA9IChjaGFyICopIkNPUFkiOworCQlicmVhazsKKwljYXNlIEVSQVNFOgorCQl3aGF0ID0gKGNoYXIgKikiRVJBU0UiOworCQlicmVhazsKKwljYXNlIE1PREVfU0VOU0U6CisJCXdoYXQgPSAoY2hhciAqKSJNT0RFX1NFTlNFIjsKKwkJYnJlYWs7CisJY2FzZSBTVEFSVF9TVE9QOgorCQl3aGF0ID0gKGNoYXIgKikiU1RBUlRfU1RPUCI7CisJCWJyZWFrOworCWNhc2UgUkVDRUlWRV9ESUFHTk9TVElDOgorCQl3aGF0ID0gKGNoYXIgKikiUkVDRUlWRV9ESUFHTk9TVElDIjsKKwkJYnJlYWs7CisJY2FzZSBTRU5EX0RJQUdOT1NUSUM6CisJCXdoYXQgPSAoY2hhciAqKSJTRU5EX0RJQUdOT1NUSUMiOworCQlicmVhazsKKwljYXNlIEFMTE9XX01FRElVTV9SRU1PVkFMOgorCQl3aGF0ID0gKGNoYXIgKikiQUxMT1dfTUVESVVNX1JFTU9WQUwiOworCQlicmVhazsKKwljYXNlIFNFVF9XSU5ET1c6CisJCXdoYXQgPSAoY2hhciAqKSJTRVRfV0lORE9XIjsKKwkJYnJlYWs7CisJY2FzZSBSRUFEX0NBUEFDSVRZOgorCQl3aGF0ID0gKGNoYXIgKikiUkVBRF9DQVBBQ0lUWSI7CisJCWJyZWFrOworCWNhc2UgUkVBRF8xMDoKKwkJd2hhdCA9IChjaGFyICopIlJFQURfMTAiOworCQlicmVhazsKKwljYXNlIFdSSVRFXzEwOgorCQl3aGF0ID0gKGNoYXIgKikiV1JJVEVfMTAiOworCQlicmVhazsKKwljYXNlIFNFRUtfMTA6CisJCXdoYXQgPSAoY2hhciAqKSJTRUVLXzEwIjsKKwkJYnJlYWs7CisJY2FzZSBXUklURV9WRVJJRlk6CisJCXdoYXQgPSAoY2hhciAqKSJXUklURV9WRVJJRlkiOworCQlicmVhazsKKwljYXNlIFZFUklGWToKKwkJd2hhdCA9IChjaGFyICopIlZFUklGWSI7CisJCWJyZWFrOworCWNhc2UgU0VBUkNIX0hJR0g6CisJCXdoYXQgPSAoY2hhciAqKSJTRUFSQ0hfSElHSCI7CisJCWJyZWFrOworCWNhc2UgU0VBUkNIX0VRVUFMOgorCQl3aGF0ID0gKGNoYXIgKikiU0VBUkNIX0VRVUFMIjsKKwkJYnJlYWs7CisJY2FzZSBTRUFSQ0hfTE9XOgorCQl3aGF0ID0gKGNoYXIgKikiU0VBUkNIX0xPVyI7CisJCWJyZWFrOworCWNhc2UgU0VUX0xJTUlUUzoKKwkJd2hhdCA9IChjaGFyICopIlNFVF9MSU1JVFMiOworCQlicmVhazsKKwljYXNlIFJFQURfUE9TSVRJT046CisJCXdoYXQgPSAoY2hhciAqKSJSRUFEX1BPU0lUSU9OIjsKKwkJYnJlYWs7CisJY2FzZSBTWU5DSFJPTklaRV9DQUNIRToKKwkJd2hhdCA9IChjaGFyICopIlNZTkNIUk9OSVpFX0NBQ0hFIjsKKwkJYnJlYWs7CisJY2FzZSBMT0NLX1VOTE9DS19DQUNIRToKKwkJd2hhdCA9IChjaGFyICopIkxPQ0tfVU5MT0NLX0NBQ0hFIjsKKwkJYnJlYWs7CisJY2FzZSBSRUFEX0RFRkVDVF9EQVRBOgorCQl3aGF0ID0gKGNoYXIgKikiUkVBRF9ERUZFQ1RfREFUQSI7CisJCWJyZWFrOworCWNhc2UgTUVESVVNX1NDQU46CisJCXdoYXQgPSAoY2hhciAqKSJNRURJVU1fU0NBTiI7CisJCWJyZWFrOworCWNhc2UgQ09NUEFSRToKKwkJd2hhdCA9IChjaGFyICopIkNPTVBBUkUiOworCQlicmVhazsKKwljYXNlIENPUFlfVkVSSUZZOgorCQl3aGF0ID0gKGNoYXIgKikiQ09QWV9WRVJJRlkiOworCQlicmVhazsKKwljYXNlIFdSSVRFX0JVRkZFUjoKKwkJd2hhdCA9IChjaGFyICopIldSSVRFX0JVRkZFUiI7CisJCWJyZWFrOworCWNhc2UgUkVBRF9CVUZGRVI6CisJCXdoYXQgPSAoY2hhciAqKSJSRUFEX0JVRkZFUiI7CisJCWJyZWFrOworCWNhc2UgVVBEQVRFX0JMT0NLOgorCQl3aGF0ID0gKGNoYXIgKikiVVBEQVRFX0JMT0NLIjsKKwkJYnJlYWs7CisJY2FzZSBSRUFEX0xPTkc6CisJCXdoYXQgPSAoY2hhciAqKSJSRUFEX0xPTkciOworCQlicmVhazsKKwljYXNlIFdSSVRFX0xPTkc6CisJCXdoYXQgPSAoY2hhciAqKSJXUklURV9MT05HIjsKKwkJYnJlYWs7CisJY2FzZSBDSEFOR0VfREVGSU5JVElPTjoKKwkJd2hhdCA9IChjaGFyICopIkNIQU5HRV9ERUZJTklUSU9OIjsKKwkJYnJlYWs7CisJY2FzZSBXUklURV9TQU1FOgorCQl3aGF0ID0gKGNoYXIgKikiV1JJVEVfU0FNRSI7CisJCWJyZWFrOworCWNhc2UgR1BDTURfUkVBRF9TVUJDSEFOTkVMOgorCQl3aGF0ID0gKGNoYXIgKikiUkVBRCBTVUJDSEFOTkVMIjsKKwkJYnJlYWs7CisJY2FzZSBSRUFEX1RPQzoKKwkJd2hhdCA9IChjaGFyICopIlJFQURfVE9DIjsKKwkJYnJlYWs7CisJY2FzZSBHUENNRF9SRUFEX0hFQURFUjoKKwkJd2hhdCA9IChjaGFyICopIlJFQUQgSEVBREVSIjsKKwkJYnJlYWs7CisJY2FzZSBHUENNRF9QTEFZX0FVRElPXzEwOgorCQl3aGF0ID0gKGNoYXIgKikiUExBWSBBVURJTyAoMTApIjsKKwkJYnJlYWs7CisJY2FzZSBHUENNRF9QTEFZX0FVRElPX01TRjoKKwkJd2hhdCA9IChjaGFyICopIlBMQVkgQVVESU8gTVNGIjsKKwkJYnJlYWs7CisJY2FzZSBHUENNRF9HRVRfRVZFTlRfU1RBVFVTX05PVElGSUNBVElPTjoKKwkJd2hhdCA9IChjaGFyICopIkdFVCBFVkVOVC9TVEFUVVMgTk9USUZJQ0FUSU9OIjsKKwkJYnJlYWs7CisJY2FzZSBHUENNRF9QQVVTRV9SRVNVTUU6CisJCXdoYXQgPSAoY2hhciAqKSJQQVVTRS9SRVNVTUUiOworCQlicmVhazsKKwljYXNlIExPR19TRUxFQ1Q6CisJCXdoYXQgPSAoY2hhciAqKSJMT0dfU0VMRUNUIjsKKwkJYnJlYWs7CisJY2FzZSBMT0dfU0VOU0U6CisJCXdoYXQgPSAoY2hhciAqKSJMT0dfU0VOU0UiOworCQlicmVhazsKKwljYXNlIEdQQ01EX1NUT1BfUExBWV9TQ0FOOgorCQl3aGF0ID0gKGNoYXIgKikiU1RPUCBQTEFZL1NDQU4iOworCQlicmVhazsKKwljYXNlIEdQQ01EX1JFQURfRElTQ19JTkZPOgorCQl3aGF0ID0gKGNoYXIgKikiUkVBRCBESVNDIElORk9STUFUSU9OIjsKKwkJYnJlYWs7CisJY2FzZSBHUENNRF9SRUFEX1RSQUNLX1JaT05FX0lORk86CisJCXdoYXQgPSAoY2hhciAqKSJSRUFEIFRSQUNLIElORk9STUFUSU9OIjsKKwkJYnJlYWs7CisJY2FzZSBHUENNRF9SRVNFUlZFX1JaT05FX1RSQUNLOgorCQl3aGF0ID0gKGNoYXIgKikiUkVTRVJWRSBUUkFDSyI7CisJCWJyZWFrOworCWNhc2UgR1BDTURfU0VORF9PUEM6CisJCXdoYXQgPSAoY2hhciAqKSJTRU5EIE9QQyI7CisJCWJyZWFrOworCWNhc2UgTU9ERV9TRUxFQ1RfMTA6CisJCXdoYXQgPSAoY2hhciAqKSJNT0RFX1NFTEVDVF8xMCI7CisJCWJyZWFrOworCWNhc2UgR1BDTURfUkVQQUlSX1JaT05FX1RSQUNLOgorCQl3aGF0ID0gKGNoYXIgKikiUkVQQUlSIFRSQUNLIjsKKwkJYnJlYWs7CisJY2FzZSAweDU5OgorCQl3aGF0ID0gKGNoYXIgKikiUkVBRCBNQVNURVIgQ1VFIjsKKwkJYnJlYWs7CisJY2FzZSBNT0RFX1NFTlNFXzEwOgorCQl3aGF0ID0gKGNoYXIgKikiTU9ERV9TRU5TRV8xMCI7CisJCWJyZWFrOworCWNhc2UgR1BDTURfQ0xPU0VfVFJBQ0s6CisJCXdoYXQgPSAoY2hhciAqKSJDTE9TRSBUUkFDSy9TRVNTSU9OIjsKKwkJYnJlYWs7CisJY2FzZSAweDVDOgorCQl3aGF0ID0gKGNoYXIgKikiUkVBRCBCVUZGRVIgQ0FQQUNJVFkiOworCQlicmVhazsKKwljYXNlIDB4NUQ6CisJCXdoYXQgPSAoY2hhciAqKSJTRU5EIENVRSBTSEVFVCI7CisJCWJyZWFrOworCWNhc2UgR1BDTURfQkxBTks6CisJCXdoYXQgPSAoY2hhciAqKSJCTEFOSyI7CisJCWJyZWFrOworCWNhc2UgUkVQT1JUX0xVTlM6CisJCXdoYXQgPSAoY2hhciAqKSJSRVBPUlQgTFVOUyI7CisJCWJyZWFrOworCWNhc2UgTU9WRV9NRURJVU06CisJCXdoYXQgPSAoY2hhciAqKSJNT1ZFX01FRElVTSBvciBQTEFZIEFVRElPICgxMikiOworCQlicmVhazsKKwljYXNlIFJFQURfMTI6CisJCXdoYXQgPSAoY2hhciAqKSJSRUFEXzEyIjsKKwkJYnJlYWs7CisJY2FzZSBXUklURV8xMjoKKwkJd2hhdCA9IChjaGFyICopIldSSVRFXzEyIjsKKwkJYnJlYWs7CisJY2FzZSBXUklURV9WRVJJRllfMTI6CisJCXdoYXQgPSAoY2hhciAqKSJXUklURV9WRVJJRllfMTIiOworCQlicmVhazsKKwljYXNlIFNFQVJDSF9ISUdIXzEyOgorCQl3aGF0ID0gKGNoYXIgKikiU0VBUkNIX0hJR0hfMTIiOworCQlicmVhazsKKwljYXNlIFNFQVJDSF9FUVVBTF8xMjoKKwkJd2hhdCA9IChjaGFyICopIlNFQVJDSF9FUVVBTF8xMiI7CisJCWJyZWFrOworCWNhc2UgU0VBUkNIX0xPV18xMjoKKwkJd2hhdCA9IChjaGFyICopIlNFQVJDSF9MT1dfMTIiOworCQlicmVhazsKKwljYXNlIFNFTkRfVk9MVU1FX1RBRzoKKwkJd2hhdCA9IChjaGFyICopIlNFTkRfVk9MVU1FX1RBRyI7CisJCWJyZWFrOworCWNhc2UgUkVBRF9FTEVNRU5UX1NUQVRVUzoKKwkJd2hhdCA9IChjaGFyICopIlJFQURfRUxFTUVOVF9TVEFUVVMiOworCQlicmVhazsKKwljYXNlIEdQQ01EX1JFQURfQ0RfTVNGOgorCQl3aGF0ID0gKGNoYXIgKikiUkVBRCBDRCBNU0YiOworCQlicmVhazsKKwljYXNlIEdQQ01EX1NDQU46CisJCXdoYXQgPSAoY2hhciAqKSJTQ0FOIjsKKwkJYnJlYWs7CisJY2FzZSBHUENNRF9TRVRfU1BFRUQ6CisJCXdoYXQgPSAoY2hhciAqKSJTRVQgQ0QgU1BFRUQiOworCQlicmVhazsKKwljYXNlIEdQQ01EX01FQ0hBTklTTV9TVEFUVVM6CisJCXdoYXQgPSAoY2hhciAqKSJNRUNIQU5JU00gU1RBVFVTIjsKKwkJYnJlYWs7CisJY2FzZSBHUENNRF9SRUFEX0NEOgorCQl3aGF0ID0gKGNoYXIgKikiUkVBRCBDRCI7CisJCWJyZWFrOworCWNhc2UgMHhFMToKKwkJd2hhdCA9IChjaGFyICopIldSSVRFIENPTlRJTlVFIjsKKwkJYnJlYWs7CisJY2FzZSBXUklURV9MT05HXzI6CisJCXdoYXQgPSAoY2hhciAqKSJXUklURV9MT05HXzIiOworCQlicmVhazsKKwljYXNlIFZFTkRPUl9DTU5EOgorCQl3aGF0ID0gKGNoYXIgKikiUmVhbHRlaydzIHZlbmRvciBjb21tYW5kIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJd2hhdCA9IChjaGFyICopIih1bmtub3duIGNvbW1hbmQpIjsKKwkJdW5rbm93bl9jbWQgPSAxOworCQlicmVhazsKKwl9CisKKwlpZiAoc3JiLT5jbW5kWzBdICE9IFRFU1RfVU5JVF9SRUFEWSkKKwkJUlRTNTFYX0RFQlVHUCgiQ29tbWFuZCAlcyAoJWQgYnl0ZXMpXG4iLCB3aGF0LCBzcmItPmNtZF9sZW4pOworCWlmICh1bmtub3duX2NtZCkgeworCQlSVFM1MVhfREVCVUdQKCIiKTsKKwkJZm9yIChpID0gMDsgaSA8IHNyYi0+Y21kX2xlbiAmJiBpIDwgMTY7IGkrKykKKwkJCVJUUzUxWF9ERUJVR1BOKCIgJTAyeCIsIHNyYi0+Y21uZFtpXSk7CisJCVJUUzUxWF9ERUJVR1BOKCJcbiIpOworCX0KK30KKwordm9pZCBzZXRfc2Vuc2VfdHlwZShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBsdW4sIGludCBzZW5zZV90eXBlKQoreworCXN3aXRjaCAoc2Vuc2VfdHlwZSkgeworCWNhc2UgU0VOU0VfVFlQRV9NRURJQV9DSEFOR0U6CisJCXNldF9zZW5zZV9kYXRhKGNoaXAsIGx1biwgQ1VSX0VSUiwgMHgwNiwgMCwgMHgyOCwgMCwgMCwgMCk7CisJCWJyZWFrOworCisJY2FzZSBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UOgorCQlzZXRfc2Vuc2VfZGF0YShjaGlwLCBsdW4sIENVUl9FUlIsIDB4MDIsIDAsIDB4M0EsIDAsIDAsIDApOworCQlicmVhazsKKworCWNhc2UgU0VOU0VfVFlQRV9NRURJQV9MQkFfT1ZFUl9SQU5HRToKKwkJc2V0X3NlbnNlX2RhdGEoY2hpcCwgbHVuLCBDVVJfRVJSLCAweDA1LCAwLCAweDIxLCAwLCAwLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIFNFTlNFX1RZUEVfTUVESUFfTFVOX05PVF9TVVBQT1JUOgorCQlzZXRfc2Vuc2VfZGF0YShjaGlwLCBsdW4sIENVUl9FUlIsIDB4MDUsIDAsIDB4MjUsIDAsIDAsIDApOworCQlicmVhazsKKworCWNhc2UgU0VOU0VfVFlQRV9NRURJQV9XUklURV9QUk9URUNUOgorCQlzZXRfc2Vuc2VfZGF0YShjaGlwLCBsdW4sIENVUl9FUlIsIDB4MDcsIDAsIDB4MjcsIDAsIDAsIDApOworCQlicmVhazsKKworCWNhc2UgU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlI6CisJCXNldF9zZW5zZV9kYXRhKGNoaXAsIGx1biwgQ1VSX0VSUiwgMHgwMywgMCwgMHgxMSwgMCwgMCwgMCk7CisJCWJyZWFrOworCisJY2FzZSBTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUjoKKwkJc2V0X3NlbnNlX2RhdGEoY2hpcCwgbHVuLCBDVVJfRVJSLCAweDAzLCAwLCAweDBDLCAweDAyLCAwLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQ6CisJCXNldF9zZW5zZV9kYXRhKGNoaXAsIGx1biwgQ1VSX0VSUiwgSUxHQUxfUkVRLCAwLAorCQkJICAgICAgIEFTQ19JTlZMRF9DREIsIEFTQ1FfSU5WTERfQ0RCLCBDREJfSUxMRUdBTCwgMSk7CisJCWJyZWFrOworCisJY2FzZSBTRU5TRV9UWVBFX0ZPUk1BVF9JTl9QUk9HUkVTUzoKKwkJc2V0X3NlbnNlX2RhdGEoY2hpcCwgbHVuLCBDVVJfRVJSLCAweDAyLCAwLCAweDA0LCAweDA0LCAwLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIFNFTlNFX1RZUEVfRk9STUFUX0NNRF9GQUlMRUQ6CisJCXNldF9zZW5zZV9kYXRhKGNoaXAsIGx1biwgQ1VSX0VSUiwgMHgwMywgMCwgMHgzMSwgMHgwMSwgMCwgMCk7CisJCWJyZWFrOworCisjaWZkZWYgU1VQUE9SVF9NQUdJQ19HQVRFCisJY2FzZSBTRU5TRV9UWVBFX01HX0tFWV9GQUlMX05PVF9FU1RBQjoKKwkJc2V0X3NlbnNlX2RhdGEoY2hpcCwgbHVuLCBDVVJfRVJSLCAweDA1LCAwLCAweDZGLCAweDAyLCAwLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIFNFTlNFX1RZUEVfTUdfS0VZX0ZBSUxfTk9UX0FVVEhFTjoKKwkJc2V0X3NlbnNlX2RhdGEoY2hpcCwgbHVuLCBDVVJfRVJSLCAweDA1LCAwLCAweDZGLCAweDAwLCAwLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIFNFTlNFX1RZUEVfTUdfSU5DT01QQVRJQkxFX01FRElVTToKKwkJc2V0X3NlbnNlX2RhdGEoY2hpcCwgbHVuLCBDVVJfRVJSLCAweDAyLCAwLCAweDMwLCAweDAwLCAwLCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIFNFTlNFX1RZUEVfTUdfV1JJVEVfRVJSOgorCQlzZXRfc2Vuc2VfZGF0YShjaGlwLCBsdW4sIENVUl9FUlIsIDB4MDMsIDAsIDB4MEMsIDB4MDAsIDAsIDApOworCQlicmVhazsKKyNlbmRpZgorCisjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCisJY2FzZSBTRU5TRV9UWVBFX01FRElBX1JFQURfRk9SQklEREVOOgorCQlzZXRfc2Vuc2VfZGF0YShjaGlwLCBsdW4sIENVUl9FUlIsIDB4MDcsIDAsIDB4MTEsIDB4MTMsIDAsIDApOworCQlicmVhazsKKyNlbmRpZgorCisJY2FzZSBTRU5TRV9UWVBFX05PX1NFTlNFOgorCWRlZmF1bHQ6CisJCXNldF9zZW5zZV9kYXRhKGNoaXAsIGx1biwgQ1VSX0VSUiwgMCwgMCwgMCwgMCwgMCwgMCk7CisJCWJyZWFrOworCX0KK30KKwordm9pZCBzZXRfc2Vuc2VfZGF0YShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBsdW4sIHU4IGVycl9jb2RlLAorCQkgICAgdTggc2Vuc2Vfa2V5LCB1MzIgaW5mbywgdTggYXNjLCB1OCBhc2NxLCB1OCBzbnNfa2V5X2luZm8wLAorCQkgICAgdTE2IHNuc19rZXlfaW5mbzEpCit7CisJc3RydWN0IHNlbnNlX2RhdGFfdCAqc2Vuc2UgPSAmKGNoaXAtPnNlbnNlX2J1ZmZlcltsdW5dKTsKKworCXNlbnNlLT5lcnJfY29kZSA9IGVycl9jb2RlOworCXNlbnNlLT5zZW5zZV9rZXkgPSBzZW5zZV9rZXk7CisJc2Vuc2UtPmluZm9bMF0gPSAodTgpIChpbmZvID4+IDI0KTsKKwlzZW5zZS0+aW5mb1sxXSA9ICh1OCkgKGluZm8gPj4gMTYpOworCXNlbnNlLT5pbmZvWzJdID0gKHU4KSAoaW5mbyA+PiA4KTsKKwlzZW5zZS0+aW5mb1szXSA9ICh1OCkgaW5mbzsKKworCXNlbnNlLT5hZF9zZW5zZV9sZW4gPSBzaXplb2Yoc3RydWN0IHNlbnNlX2RhdGFfdCkgLSA4OworCXNlbnNlLT5hc2MgPSBhc2M7CisJc2Vuc2UtPmFzY3EgPSBhc2NxOworCWlmIChzbnNfa2V5X2luZm8wICE9IDApIHsKKwkJc2Vuc2UtPnNuc19rZXlfaW5mb1swXSA9IFNLU1YgfCBzbnNfa2V5X2luZm8wOworCQlzZW5zZS0+c25zX2tleV9pbmZvWzFdID0gKHNuc19rZXlfaW5mbzEgJiAweGYwKSA+PiA4OworCQlzZW5zZS0+c25zX2tleV9pbmZvWzJdID0gc25zX2tleV9pbmZvMSAmIDB4MGY7CisJfQorfQorCitzdGF0aWMgaW50IHRlc3RfdW5pdF9yZWFkeShzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKKworCXJ0czUxeF9pbml0X2NhcmRzKGNoaXApOworCisJaWYgKCFjaGVja19jYXJkX3JlYWR5KGNoaXAsIGx1bikpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CisJfQorCisJaWYgKCFjaGVja19sdW5fbWMoY2hpcCwgbHVuKSkgeworCQlzZXRfbHVuX21jKGNoaXAsIGx1bik7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9DSEFOR0UpOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKKwl9CisjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCisJaWYgKGdldF9sdW5fY2FyZChjaGlwLCBTQ1NJX0xVTihzcmIpKSA9PSBTRF9DQVJEKSB7CisJCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKwkJaWYgKHNkX2NhcmQtPnNkX2xvY2tfbm90aWZ5KSB7CisJCQlzZF9jYXJkLT5zZF9sb2NrX25vdGlmeSA9IDA7CisJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfQ0hBTkdFKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOworCQl9IGVsc2UgaWYgKHNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzICYgU0RfTE9DS0VEKSB7CisJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCisJCQkJICAgICAgIFNFTlNFX1RZUEVfTUVESUFfUkVBRF9GT1JCSURERU4pOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CisJCX0KKwl9CisjZW5kaWYKKworCXJldHVybiBUUkFOU1BPUlRfR09PRDsKK30KKwordW5zaWduZWQgY2hhciBmb3JtYXR0ZXJfaW5xdWlyeV9zdHJbMjBdID0geworCSdNJywgJ0UnLCAnTScsICdPJywgJ1InLCAnWScsICdTJywgJ1QnLCAnSScsICdDJywgJ0snLAorCSctJywgJ00nLCAnRycsCQkvKiBCeXRlWzQ3OjQ5XSAqLworCTB4MEIsCQkJLyogQnl0ZVs1MF06IE1HLCBNUywgTVNQcm8sIE1TWEMgKi8KKwkweDAwLAkJCS8qIEJ5dGVbNTFdOiBDYXRlZ29yeSBTcGVjaWZpYyBDb21tYW5kcyAqLworCTB4MDAsCQkJLyogQnl0ZVs1Ml06IEFjY2VzcyBDb250cm9sIGFuZCBmZWF0dXJlICovCisJMHgyMCwgMHgyMCwgMHgyMCwJLyogQnl0ZVs1Mzo1NV0gKi8KK307CisKK3N0YXRpYyBpbnQgaW5xdWlyeShzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKKwljaGFyICppbnF1aXJ5X2RlZmF1bHQgPSAoY2hhciAqKSJHZW5lcmljLXhEL1NEL00uUy4gICAgICAxLjAwICI7CisJY2hhciAqaW5xdWlyeV9zdHJpbmc7CisJdW5zaWduZWQgY2hhciBzZW5kYnl0ZXM7CisJdW5zaWduZWQgY2hhciAqYnVmOworCXU4IGNhcmQgPSBnZXRfbHVuX2NhcmQoY2hpcCwgbHVuKTsKKwlpbnQgcHJvX2Zvcm1hdHRlcl9mbGFnID0gMDsKKwl1bnNpZ25lZCBjaGFyIGlucXVpcnlfYnVmW10gPSB7CisJCVFVTElGSVJFIHwgRFJDVF9BQ0NFU1NfREVWLAorCQlSTUJfRElTQyB8IDB4MEQsCisJCTB4MDAsCisJCTB4MDEsCisJCTB4MWYsCisJCTB4MDIsCisJCTAsCisJCVJFTF9BRFIgfCBXQlVTXzMyIHwgV0JVU18xNiB8IFNZTkMgfCBMSU5LRUQgfCBDTURfUVVFIHwgU0ZUX1JFLAorCX07CisKKwlpbnF1aXJ5X3N0cmluZyA9IGlucXVpcnlfZGVmYXVsdDsKKworCWJ1ZiA9IHZtYWxsb2Moc2NzaV9idWZmbGVuKHNyYikpOworCWlmIChidWYgPT0gTlVMTCkKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisKKwlpZiAoTVNfRk9STUFUVEVSX0VOQUJMRUQoY2hpcCkgJiYgKGdldF9sdW4yY2FyZChjaGlwLCBsdW4pICYgTVNfQ0FSRCkpIHsKKwkJaWYgKCFjYXJkIHx8IChjYXJkID09IE1TX0NBUkQpKQorCQkJcHJvX2Zvcm1hdHRlcl9mbGFnID0gMTsKKwl9CisKKwlpZiAocHJvX2Zvcm1hdHRlcl9mbGFnKSB7CisJCWlmIChzY3NpX2J1ZmZsZW4oc3JiKSA8IDU2KQorCQkJc2VuZGJ5dGVzID0gKHVuc2lnbmVkIGNoYXIpKHNjc2lfYnVmZmxlbihzcmIpKTsKKwkJZWxzZQorCQkJc2VuZGJ5dGVzID0gNTY7CisJfSBlbHNlIHsKKwkJaWYgKHNjc2lfYnVmZmxlbihzcmIpIDwgMzYpCisJCQlzZW5kYnl0ZXMgPSAodW5zaWduZWQgY2hhcikoc2NzaV9idWZmbGVuKHNyYikpOworCQllbHNlCisJCQlzZW5kYnl0ZXMgPSAzNjsKKwl9CisKKwlpZiAoc2VuZGJ5dGVzID4gOCkgeworCQltZW1jcHkoYnVmLCBpbnF1aXJ5X2J1ZiwgOCk7CisJCW1lbWNweShidWYgKyA4LCBpbnF1aXJ5X3N0cmluZywgc2VuZGJ5dGVzIC0gOCk7CisJCWlmIChwcm9fZm9ybWF0dGVyX2ZsYWcpCisJCQlidWZbNF0gPSAweDMzOwkvKiBBZGRpdGlvbmFsIExlbmd0aCAqLworCX0gZWxzZSB7CisJCW1lbWNweShidWYsIGlucXVpcnlfYnVmLCBzZW5kYnl0ZXMpOworCX0KKworCWlmIChwcm9fZm9ybWF0dGVyX2ZsYWcpIHsKKwkJaWYgKHNlbmRieXRlcyA+IDM2KQorCQkJbWVtY3B5KGJ1ZiArIDM2LCBmb3JtYXR0ZXJfaW5xdWlyeV9zdHIsIHNlbmRieXRlcyAtIDM2KTsKKwl9CisKKwlzY3NpX3NldF9yZXNpZChzcmIsIDApOworCisJcnRzNTF4X3NldF94ZmVyX2J1ZihidWYsIHNjc2lfYnVmZmxlbihzcmIpLCBzcmIpOworCXZmcmVlKGJ1Zik7CisKKwlyZXR1cm4gVFJBTlNQT1JUX0dPT0Q7Cit9CisKK3N0YXRpYyBpbnQgc3RhcnRfc3RvcF91bml0KHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXVuc2lnbmVkIGludCBsdW4gPSBTQ1NJX0xVTihzcmIpOworCisJc2NzaV9zZXRfcmVzaWQoc3JiLCBzY3NpX2J1ZmZsZW4oc3JiKSk7CisKKwlpZiAoc3JiLT5jbW5kWzFdID09IDEpCisJCXJldHVybiBUUkFOU1BPUlRfR09PRDsKKworCXN3aXRjaCAoc3JiLT5jbW5kWzB4NF0pIHsKKwljYXNlIFNUT1BfTUVESVVNOgorCQkvKiBNZWRpYSBkaXNhYmxlZCAqLworCQlyZXR1cm4gVFJBTlNQT1JUX0dPT0Q7CisKKwljYXNlIFVOTE9BRF9NRURJVU06CisJCS8qIE1lZGlhIHNoYWxsIGJlIHVubG9hZCAqLworCQlpZiAoY2hlY2tfY2FyZF9yZWFkeShjaGlwLCBsdW4pKQorCQkJZWplY3RfY2FyZChjaGlwLCBsdW4pOworCQlyZXR1cm4gVFJBTlNQT1JUX0dPT0Q7CisKKwljYXNlIE1BS0VfTUVESVVNX1JFQURZOgorCWNhc2UgTE9BRF9NRURJVU06CisJCWlmIChjaGVja19jYXJkX3JlYWR5KGNoaXAsIGx1bikpIHsKKwkJCXJldHVybiBUUkFOU1BPUlRfR09PRDsKKwkJfSBlbHNlIHsKKwkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CisJCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCX0KKworCQlicmVhazsKKwl9CisKKwlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKK30KKworc3RhdGljIGludCBhbGxvd19tZWRpdW1fcmVtb3ZhbChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlpbnQgcHJldmVudDsKKworCXByZXZlbnQgPSBzcmItPmNtbmRbNF0gJiAweDE7CisKKwlzY3NpX3NldF9yZXNpZChzcmIsIDApOworCisJaWYgKHByZXZlbnQpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKKwkJCSAgICAgICBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKworCXJldHVybiBUUkFOU1BPUlRfR09PRDsKK30KKworc3RhdGljIHZvaWQgbXNfbW9kZV9zZW5zZShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IGNtZCwKKwkJCSAgaW50IGx1biwgdTggKmJ1ZiwgaW50IGJ1Zl9sZW4pCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCWludCBzeXNfaW5mb19vZmZzZXQ7CisJaW50IGRhdGFfc2l6ZSA9IGJ1Zl9sZW47CisJaW50IHN1cHBvcnRfZm9ybWF0ID0gMDsKKwlpbnQgaSA9IDA7CisKKwlpZiAoY21kID09IE1PREVfU0VOU0UpIHsKKwkJc3lzX2luZm9fb2Zmc2V0ID0gODsKKwkJaWYgKGRhdGFfc2l6ZSA+IDB4NjgpCisJCQlkYXRhX3NpemUgPSAweDY4OworCQlidWZbaSsrXSA9IDB4Njc7CS8qIE1vZGUgRGF0YSBMZW5ndGggKi8KKwl9IGVsc2UgeworCQlzeXNfaW5mb19vZmZzZXQgPSAxMjsKKwkJaWYgKGRhdGFfc2l6ZSA+IDB4NkMpCisJCQlkYXRhX3NpemUgPSAweDZDOworCQlidWZbaSsrXSA9IDB4MDA7CS8qIE1vZGUgRGF0YSBMZW5ndGggKE1TQikgKi8KKwkJYnVmW2krK10gPSAweDZBOwkvKiBNb2RlIERhdGEgTGVuZ3RoIChMU0IpICovCisJfQorCisJLyogTWVkaXVtIFR5cGUgQ29kZSAqLworCWlmIChjaGVja19jYXJkX3JlYWR5KGNoaXAsIGx1bikpIHsKKwkJaWYgKENIS19NU1hDKG1zX2NhcmQpKSB7CisJCQlzdXBwb3J0X2Zvcm1hdCA9IDE7CisJCQlidWZbaSsrXSA9IDB4NDA7CisJCX0gZWxzZSBpZiAoQ0hLX01TUFJPKG1zX2NhcmQpKSB7CisJCQlzdXBwb3J0X2Zvcm1hdCA9IDE7CisJCQlidWZbaSsrXSA9IDB4MjA7CisJCX0gZWxzZSB7CisJCQlidWZbaSsrXSA9IDB4MTA7CisJCX0KKworCQkvKiBXUCAqLworCQlpZiAoY2hlY2tfY2FyZF93cChjaGlwLCBsdW4pKQorCQkJYnVmW2krK10gPSAweDgwOworCQllbHNlCisJCQlidWZbaSsrXSA9IDB4MDA7CisJfSBlbHNlIHsKKwkJYnVmW2krK10gPSAweDAwOwkvKiBNZWRpYVR5cGUgKi8KKwkJYnVmW2krK10gPSAweDAwOwkvKiBXUCAqLworCX0KKworCWJ1ZltpKytdID0gMHgwMDsJLyogUmVzZXJ2ZWQgKi8KKworCWlmIChjbWQgPT0gTU9ERV9TRU5TRV8xMCkgeworCQlidWZbaSsrXSA9IDB4MDA7CS8qIFJlc2VydmVkICovCisJCWJ1ZltpKytdID0gMHgwMDsJLyogQmxvY2sgZGVzY3JpcHRvciBsZW5ndGgoTVNCKSAqLworCQlidWZbaSsrXSA9IDB4MDA7CS8qIEJsb2NrIGRlc2NyaXB0b3IgbGVuZ3RoKExTQikgKi8KKworCQkvKiBUaGUgRm9sbG93aW5nIERhdGEgaXMgdGhlIGNvbnRlbnQgb2YgIlBhZ2UgMHgyMCIgKi8KKwkJaWYgKGRhdGFfc2l6ZSA+PSA5KQorCQkJYnVmW2krK10gPSAweDIwOwkvKiBQYWdlIENvZGUgKi8KKwkJaWYgKGRhdGFfc2l6ZSA+PSAxMCkKKwkJCWJ1ZltpKytdID0gMHg2MjsJLyogUGFnZSBMZW5ndGggKi8KKwkJaWYgKGRhdGFfc2l6ZSA+PSAxMSkKKwkJCWJ1ZltpKytdID0gMHgwMDsJLyogTm8gQWNjZXNzIENvbnRyb2wgKi8KKwkJaWYgKGRhdGFfc2l6ZSA+PSAxMikgeworCQkJaWYgKHN1cHBvcnRfZm9ybWF0KQorCQkJCWJ1ZltpKytdID0gMHhDMDsJLyogU0YsIFNHTSAqLworCQkJZWxzZQorCQkJCWJ1ZltpKytdID0gMHgwMDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFRoZSBGb2xsb3dpbmcgRGF0YSBpcyB0aGUgY29udGVudCBvZiAiUGFnZSAweDIwIiAqLworCQlpZiAoZGF0YV9zaXplID49IDUpCisJCQlidWZbaSsrXSA9IDB4MjA7CS8qIFBhZ2UgQ29kZSAqLworCQlpZiAoZGF0YV9zaXplID49IDYpCisJCQlidWZbaSsrXSA9IDB4NjI7CS8qIFBhZ2UgTGVuZ3RoICovCisJCWlmIChkYXRhX3NpemUgPj0gNykKKwkJCWJ1ZltpKytdID0gMHgwMDsJLyogTm8gQWNjZXNzIENvbnRyb2wgKi8KKwkJaWYgKGRhdGFfc2l6ZSA+PSA4KSB7CisJCQlpZiAoc3VwcG9ydF9mb3JtYXQpCisJCQkJYnVmW2krK10gPSAweEMwOwkvKiBTRiwgU0dNICovCisJCQllbHNlCisJCQkJYnVmW2krK10gPSAweDAwOworCQl9CisJfQorCisJaWYgKGRhdGFfc2l6ZSA+IHN5c19pbmZvX29mZnNldCkgeworCQkvKiA5NiBCeXRlcyBBdHRyaWJ1dGUgRGF0YSAqLworCQlpbnQgbGVuID0gZGF0YV9zaXplIC0gc3lzX2luZm9fb2Zmc2V0OworCQlsZW4gPSAobGVuIDwgOTYpID8gbGVuIDogOTY7CisKKwkJbWVtY3B5KGJ1ZiArIHN5c19pbmZvX29mZnNldCwgbXNfY2FyZC0+cmF3X3N5c19pbmZvLCBsZW4pOworCX0KK30KKworc3RhdGljIGludCBtb2RlX3NlbnNlKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXVuc2lnbmVkIGludCBsdW4gPSBTQ1NJX0xVTihzcmIpOworCXVuc2lnbmVkIGludCBkYXRhU2l6ZTsKKwlpbnQgc3RhdHVzOworCWludCBwcm9fZm9ybWF0dGVyX2ZsYWc7CisJdW5zaWduZWQgY2hhciBwYWdlQ29kZSwgKmJ1ZjsKKwl1OCBjYXJkID0gZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bik7CisKKwlpZiAoIWNoZWNrX2NhcmRfcmVhZHkoY2hpcCwgbHVuKSkgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOworCQlzY3NpX3NldF9yZXNpZChzcmIsIHNjc2lfYnVmZmxlbihzcmIpKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKworCXByb19mb3JtYXR0ZXJfZmxhZyA9IDA7CisJZGF0YVNpemUgPSA4OworCS8qIEluIENvbWJvIG1vZGUsIGRldmljZSByZXNwb25zZXMgTW9kZVNlbnNlIGNvbW1hbmQgYXMgYSBNUyBMVU4KKwkgKiB3aGVuIG5vIGNhcmQgaXMgaW5zZXJ0ZWQgKi8KKwlpZiAoKGdldF9sdW4yY2FyZChjaGlwLCBsdW4pICYgTVNfQ0FSRCkpIHsKKwkJaWYgKCFjYXJkIHx8IChjYXJkID09IE1TX0NBUkQpKSB7CisJCQlkYXRhU2l6ZSA9IDEwODsKKwkJCWlmIChjaGlwLT5vcHRpb24ubXNwcm9fZm9ybWF0dGVyX2VuYWJsZSkKKwkJCQlwcm9fZm9ybWF0dGVyX2ZsYWcgPSAxOworCQl9CisJfQorCisJYnVmID0ga21hbGxvYyhkYXRhU2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKworCXBhZ2VDb2RlID0gc3JiLT5jbW5kWzJdICYgMHgzZjsKKworCWlmICgocGFnZUNvZGUgPT0gMHgzRikgfHwgKHBhZ2VDb2RlID09IDB4MUMpIHx8CisJICAgIChwYWdlQ29kZSA9PSAweDAwKSB8fCAocHJvX2Zvcm1hdHRlcl9mbGFnICYmIChwYWdlQ29kZSA9PSAweDIwKSkpIHsKKwkJaWYgKHNyYi0+Y21uZFswXSA9PSBNT0RFX1NFTlNFKSB7CisJCQlpZiAoKHBhZ2VDb2RlID09IDB4M0YpIHx8IChwYWdlQ29kZSA9PSAweDIwKSkgeworCQkJCW1zX21vZGVfc2Vuc2UoY2hpcCwgc3JiLT5jbW5kWzBdLCBsdW4sIGJ1ZiwKKwkJCQkJICAgICAgZGF0YVNpemUpOworCQkJfSBlbHNlIHsKKwkJCQlkYXRhU2l6ZSA9IDQ7CisJCQkJYnVmWzBdID0gMHgwMzsKKwkJCQlidWZbMV0gPSAweDAwOworCQkJCWlmIChjaGVja19jYXJkX3dwKGNoaXAsIGx1bikpCisJCQkJCWJ1ZlsyXSA9IDB4ODA7CisJCQkJZWxzZQorCQkJCWJ1ZlszXSA9IDB4MDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoKHBhZ2VDb2RlID09IDB4M0YpIHx8IChwYWdlQ29kZSA9PSAweDIwKSkgeworCQkJCW1zX21vZGVfc2Vuc2UoY2hpcCwgc3JiLT5jbW5kWzBdLCBsdW4sIGJ1ZiwKKwkJCQkJICAgICAgZGF0YVNpemUpOworCQkJfSBlbHNlIHsKKwkJCQlkYXRhU2l6ZSA9IDg7CisJCQkJYnVmWzBdID0gMHgwMDsKKwkJCQlidWZbMV0gPSAweDA2OworCQkJCWJ1ZlsyXSA9IDB4MDA7CisJCQkJaWYgKGNoZWNrX2NhcmRfd3AoY2hpcCwgbHVuKSkKKwkJCQkJYnVmWzNdID0gMHg4MDsKKwkJCQllbHNlCisJCQkJCWJ1ZlszXSA9IDB4MDA7CisJCQkJYnVmWzRdID0gMHgwMDsKKwkJCQlidWZbNV0gPSAweDAwOworCQkJCWJ1Zls2XSA9IDB4MDA7CisJCQkJYnVmWzddID0gMHgwMDsKKwkJCX0KKwkJfQorCQlzdGF0dXMgPSBUUkFOU1BPUlRfR09PRDsKKwl9IGVsc2UgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOworCQlzY3NpX3NldF9yZXNpZChzcmIsIHNjc2lfYnVmZmxlbihzcmIpKTsKKwkJc3RhdHVzID0gVFJBTlNQT1JUX0ZBSUxFRDsKKwl9CisKKwlpZiAoc3RhdHVzID09IFRSQU5TUE9SVF9HT09EKSB7CisJCXVuc2lnbmVkIGludCBsZW4gPSBtaW4oc2NzaV9idWZmbGVuKHNyYiksIGRhdGFTaXplKTsKKwkJcnRzNTF4X3NldF94ZmVyX2J1ZihidWYsIGxlbiwgc3JiKTsKKwkJc2NzaV9zZXRfcmVzaWQoc3JiLCBzY3NpX2J1ZmZsZW4oc3JiKSAtIGxlbik7CisJfQorCWtmcmVlKGJ1Zik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHJlcXVlc3Rfc2Vuc2Uoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJc3RydWN0IHNlbnNlX2RhdGFfdCAqc2Vuc2U7CisJdW5zaWduZWQgaW50IGx1biA9IFNDU0lfTFVOKHNyYik7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCXVuc2lnbmVkIGNoYXIgKnRtcCwgKmJ1ZjsKKworCXNlbnNlID0gJihjaGlwLT5zZW5zZV9idWZmZXJbbHVuXSk7CisKKwlpZiAoKGdldF9sdW5fY2FyZChjaGlwLCBsdW4pID09IE1TX0NBUkQpCisJICAgICYmIFBST19VTkRFUl9GT1JNQVRUSU5HKG1zX2NhcmQpKSB7CisJCW1zcHJvX2Zvcm1hdF9zZW5zZShjaGlwLCBsdW4pOworCX0KKworCWJ1ZiA9IHZtYWxsb2Moc2NzaV9idWZmbGVuKHNyYikpOworCWlmIChidWYgPT0gTlVMTCkKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisKKwl0bXAgPSAodW5zaWduZWQgY2hhciAqKXNlbnNlOworCW1lbWNweShidWYsIHRtcCwgc2NzaV9idWZmbGVuKHNyYikpOworCisJcnRzNTF4X3NldF94ZmVyX2J1ZihidWYsIHNjc2lfYnVmZmxlbihzcmIpLCBzcmIpOworCXZmcmVlKGJ1Zik7CisKKwlzY3NpX3NldF9yZXNpZChzcmIsIDApOworCS8qIFJlc2V0IFNlbnNlIERhdGEgKi8KKwlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTk9fU0VOU0UpOworCXJldHVybiBUUkFOU1BPUlRfR09PRDsKK30KKworc3RhdGljIGludCByZWFkX3dyaXRlKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworI2lmZGVmIFNVUFBPUlRfU0RfTE9DSworCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKyNlbmRpZgorCXVuc2lnbmVkIGludCBsdW4gPSBTQ1NJX0xVTihzcmIpOworCWludCByZXR2YWw7CisJdTMyIHN0YXJ0X3NlYzsKKwl1MTYgc2VjX2NudDsKKworCWlmICghY2hlY2tfY2FyZF9yZWFkeShjaGlwLCBsdW4pIHx8IChjaGlwLT5jYXBhY2l0eVtsdW5dID09IDApKSB7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CisJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwl9CisKKwlpZiAoIWNoZWNrX2x1bl9tYyhjaGlwLCBsdW4pKSB7CisJCXNldF9sdW5fbWMoY2hpcCwgbHVuKTsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0NIQU5HRSk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOworCX0KKworCXJ0czUxeF9wcmVwYXJlX3J1bihjaGlwKTsKKwlSVFM1MVhfU0VUX1NUQVQoY2hpcCwgU1RBVF9SVU4pOworCisjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCisJaWYgKHNkX2NhcmQtPnNkX2VyYXNlX3N0YXR1cykgeworCQkvKiBBY2Nlc3NpbmcgdG8gYW55IGNhcmQgaXMgZm9yYmlkZGVuCisJCSAqIHVudGlsIHRoZSBlcmFzZSBwcm9jZWR1cmUgb2YgU0QgaXMgY29tcGxldGVkICovCisJCVJUUzUxWF9ERUJVR1AoIlNEIGNhcmQgYmVpbmcgZXJhc2VkIVxuIik7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9SRUFEX0ZPUkJJRERFTik7CisJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwl9CisKKwlpZiAoZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bikgPT0gU0RfQ0FSRCkgeworCQlpZiAoc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgJiBTRF9MT0NLRUQpIHsKKwkJCVJUUzUxWF9ERUJVR1AoIlNEIGNhcmQgbG9ja2VkIVxuIik7CisJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCisJCQkJICAgICAgIFNFTlNFX1RZUEVfTUVESUFfUkVBRF9GT1JCSURERU4pOworCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAoKHNyYi0+Y21uZFswXSA9PSBSRUFEXzEwKSB8fCAoc3JiLT5jbW5kWzBdID09IFdSSVRFXzEwKSkgeworCQlzdGFydF9zZWMgPQorCQkgICAgKCh1MzIpIHNyYi0+Y21uZFsyXSA8PCAyNCkgfAorCQkgICAgKCh1MzIpIHNyYi0+Y21uZFszXSA8PCAxNikgfAorCQkgICAgKCh1MzIpIHNyYi0+Y21uZFs0XSA8PCA4KSB8CisJCSAgICAoKHUzMikgc3JiLT5jbW5kWzVdKTsKKwkJc2VjX2NudCA9ICgodTE2KSAoc3JiLT5jbW5kWzddKSA8PCA4KSB8IHNyYi0+Y21uZFs4XTsKKwl9IGVsc2UgaWYgKChzcmItPmNtbmRbMF0gPT0gUkVBRF82KSB8fCAoc3JiLT5jbW5kWzBdID09IFdSSVRFXzYpKSB7CisJCXN0YXJ0X3NlYyA9ICgodTMyKSAoc3JiLT5jbW5kWzFdICYgMHgxRikgPDwgMTYpIHwKKwkJICAgICgodTMyKSBzcmItPmNtbmRbMl0gPDwgOCkgfCAoKHUzMikgc3JiLT5jbW5kWzNdKTsKKwkJc2VjX2NudCA9IHNyYi0+Y21uZFs0XTsKKwl9IGVsc2UgaWYgKChzcmItPmNtbmRbMF0gPT0gVkVORE9SX0NNTkQpICYmCisJCQkoc3JiLT5jbW5kWzFdID09IFNDU0lfQVBQX0NNRCkgJiYKKwkJCSgoc3JiLT5jbW5kWzJdID09IFBQX1JFQUQxMCkgfHwKKwkJCSAoc3JiLT5jbW5kWzJdID09IFBQX1dSSVRFMTApKSkgeworCQlzdGFydF9zZWMgPSAoKHUzMikgc3JiLT5jbW5kWzRdIDw8IDI0KSB8CisJCQkoKHUzMikgc3JiLT5jbW5kWzVdIDw8IDE2KSB8CisJCQkoKHUzMikgc3JiLT5jbW5kWzZdIDw8IDgpIHwKKwkJCSgodTMyKSBzcmItPmNtbmRbN10pOworCQlzZWNfY250ID0gKCh1MTYpIChzcmItPmNtbmRbOV0pIDw8IDgpIHwgc3JiLT5jbW5kWzEwXTsKKwl9IGVsc2UgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOworCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJfQorCisJaWYgKChzdGFydF9zZWMgPiBjaGlwLT5jYXBhY2l0eVtsdW5dKSB8fAorCSAgICAoKHN0YXJ0X3NlYyArIHNlY19jbnQpID4gY2hpcC0+Y2FwYWNpdHlbbHVuXSkpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0xCQV9PVkVSX1JBTkdFKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKworCWlmIChzZWNfY250ID09IDApIHsKKwkJc2NzaV9zZXRfcmVzaWQoc3JiLCAwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9HT09EOworCX0KKworCWlmICgoc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKQorCSAgICAmJiBjaGVja19jYXJkX3dwKGNoaXAsIGx1bikpIHsKKwkJUlRTNTFYX0RFQlVHUCgiV3JpdGUgcHJvdGVjdGVkIGNhcmQhXG4iKTsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX1dSSVRFX1BST1RFQ1QpOworCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJfQorCisJcmV0dmFsID0gY2FyZF9ydyhzcmIsIGNoaXAsIHN0YXJ0X3NlYywgc2VjX2NudCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworI2lmIDAKKwkJaWYgKGNoaXAtPm5lZWRfcmVsZWFzZSAmIGNoaXAtPmx1bjJjYXJkW2x1bl0pIHsKKwkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CisJCX0gZWxzZSB7CisjZW5kaWYKKwkJaWYgKHNyYi0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSB7CisJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCisJCQkJICAgICAgIFNFTlNFX1RZUEVfTUVESUFfVU5SRUNPVkVSX1JFQURfRVJSKTsKKwkJfSBlbHNlIHsKKwkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOworCQl9CisjaWYgMAorCQl9CisjZW5kaWYKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKworCXNjc2lfc2V0X3Jlc2lkKHNyYiwgMCk7CisKKwlyZXR1cm4gVFJBTlNQT1JUX0dPT0Q7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9mb3JtYXRfY2FwYWNpdHkoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJdW5zaWduZWQgY2hhciAqYnVmOworCXVuc2lnbmVkIGludCBsdW4gPSBTQ1NJX0xVTihzcmIpOworCXVuc2lnbmVkIGludCBidWZfbGVuOworCXU4IGNhcmQgPSBnZXRfbHVuX2NhcmQoY2hpcCwgbHVuKTsKKwlpbnQgZGVzY19jbnQ7CisJaW50IGkgPSAwOworCisJaWYgKCFjaGVja19jYXJkX3JlYWR5KGNoaXAsIGx1bikpIHsKKwkJaWYgKCFjaGlwLT5vcHRpb24ubXNwcm9fZm9ybWF0dGVyX2VuYWJsZSkgeworCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKKwkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJfQorCX0KKworCWJ1Zl9sZW4gPSAoc2NzaV9idWZmbGVuKHNyYikgPiAxMikgPyAweDE0IDogMTI7CisKKwlidWYgPSBrbWFsbG9jKGJ1Zl9sZW4sIEdGUF9LRVJORUwpOworCWlmIChidWYgPT0gTlVMTCkKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisKKwlidWZbaSsrXSA9IDA7CisJYnVmW2krK10gPSAwOworCWJ1ZltpKytdID0gMDsKKworCS8qIENhcGFjaXR5IExpc3QgTGVuZ3RoICovCisJaWYgKChidWZfbGVuID4gMTIpICYmIGNoaXAtPm9wdGlvbi5tc3Byb19mb3JtYXR0ZXJfZW5hYmxlICYmCisJICAgIChjaGlwLT5sdW4yY2FyZFtsdW5dICYgTVNfQ0FSRCkgJiYgKCFjYXJkIHx8IChjYXJkID09IE1TX0NBUkQpKSkgeworCQlidWZbaSsrXSA9IDB4MTA7CisJCWRlc2NfY250ID0gMjsKKwl9IGVsc2UgeworCQlidWZbaSsrXSA9IDB4MDg7CisJCWRlc2NfY250ID0gMTsKKwl9CisKKwl3aGlsZSAoZGVzY19jbnQpIHsKKwkJaWYgKGNoZWNrX2NhcmRfcmVhZHkoY2hpcCwgbHVuKSkgeworCQkJYnVmW2krK10gPSAodW5zaWduZWQgY2hhcikoKGNoaXAtPmNhcGFjaXR5W2x1bl0pID4+IDI0KTsKKwkJCWJ1ZltpKytdID0gKHVuc2lnbmVkIGNoYXIpKChjaGlwLT5jYXBhY2l0eVtsdW5dKSA+PiAxNik7CisJCQlidWZbaSsrXSA9ICh1bnNpZ25lZCBjaGFyKSgoY2hpcC0+Y2FwYWNpdHlbbHVuXSkgPj4gOCk7CisJCQlidWZbaSsrXSA9ICh1bnNpZ25lZCBjaGFyKShjaGlwLT5jYXBhY2l0eVtsdW5dKTsKKworCQkJaWYgKGRlc2NfY250ID09IDIpCisJCQkJLyogQnl0ZVs4XTogRGVzY3JpcHRvciBUeXBlOiBGb3JtYXR0ZWQgbWVkaXVtICovCisJCQkJYnVmW2krK10gPSAyOworCQkJZWxzZQorCQkJCWJ1ZltpKytdID0gMDsJLyogQnl0ZVsxNl0gKi8KKwkJfSBlbHNlIHsKKwkJCWJ1ZltpKytdID0gMHhGRjsKKwkJCWJ1ZltpKytdID0gMHhGRjsKKwkJCWJ1ZltpKytdID0gMHhGRjsKKwkJCWJ1ZltpKytdID0gMHhGRjsKKworCQkJaWYgKGRlc2NfY250ID09IDIpCisJCQkJLyogQnl0ZVs4XTogRGVzY3JpcHRvciBUeXBlOiBObyBtZWRpdW0gKi8KKwkJCQlidWZbaSsrXSA9IDM7CisJCQllbHNlCisJCQkJYnVmW2krK10gPSAwOwkvKkJ5dGVbMTZdICovCisJCX0KKworCQlidWZbaSsrXSA9IDB4MDA7CisJCWJ1ZltpKytdID0gMHgwMjsKKwkJYnVmW2krK10gPSAweDAwOworCisJCWRlc2NfY250LS07CisJfQorCisJYnVmX2xlbiA9IG1pbihzY3NpX2J1ZmZsZW4oc3JiKSwgYnVmX2xlbik7CisJcnRzNTF4X3NldF94ZmVyX2J1ZihidWYsIGJ1Zl9sZW4sIHNyYik7CisJa2ZyZWUoYnVmKTsKKworCXNjc2lfc2V0X3Jlc2lkKHNyYiwgc2NzaV9idWZmbGVuKHNyYikgLSBidWZfbGVuKTsKKworCXJldHVybiBUUkFOU1BPUlRfR09PRDsKK30KKworc3RhdGljIGludCByZWFkX2NhcGFjaXR5KHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKKworCWlmICghY2hlY2tfY2FyZF9yZWFkeShjaGlwLCBsdW4pKSB7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CisJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwl9CisKKwlpZiAoIWNoZWNrX2x1bl9tYyhjaGlwLCBsdW4pKSB7CisJCXNldF9sdW5fbWMoY2hpcCwgbHVuKTsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0NIQU5HRSk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOworCX0KKworCWJ1ZiA9IGttYWxsb2MoOCwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKworCWJ1ZlswXSA9ICh1bnNpZ25lZCBjaGFyKSgoY2hpcC0+Y2FwYWNpdHlbbHVuXSAtIDEpID4+IDI0KTsKKwlidWZbMV0gPSAodW5zaWduZWQgY2hhcikoKGNoaXAtPmNhcGFjaXR5W2x1bl0gLSAxKSA+PiAxNik7CisJYnVmWzJdID0gKHVuc2lnbmVkIGNoYXIpKChjaGlwLT5jYXBhY2l0eVtsdW5dIC0gMSkgPj4gOCk7CisJYnVmWzNdID0gKHVuc2lnbmVkIGNoYXIpKGNoaXAtPmNhcGFjaXR5W2x1bl0gLSAxKTsKKworCWJ1Zls0XSA9IDB4MDA7CisJYnVmWzVdID0gMHgwMDsKKwlidWZbNl0gPSAweDAyOworCWJ1Zls3XSA9IDB4MDA7CisKKwlydHM1MXhfc2V0X3hmZXJfYnVmKGJ1Ziwgc2NzaV9idWZmbGVuKHNyYiksIHNyYik7CisJa2ZyZWUoYnVmKTsKKworCXNjc2lfc2V0X3Jlc2lkKHNyYiwgMCk7CisKKwlyZXR1cm4gVFJBTlNQT1JUX0dPT0Q7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2Rldl9zdGF0dXMoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJdW5zaWduZWQgaW50IGx1biA9IFNDU0lfTFVOKHNyYik7CisJdW5zaWduZWQgaW50IGJ1Zl9sZW47CisJdTggc3RhdHVzWzMyXSA9IHsgMCB9OworCisJcnRzNTF4X3BwX3N0YXR1cyhjaGlwLCBsdW4sIHN0YXR1cywgMzIpOworCisJYnVmX2xlbiA9IG1pbihzY3NpX2J1ZmZsZW4oc3JiKSwgKHVuc2lnbmVkIGludClzaXplb2Yoc3RhdHVzKSk7CisJcnRzNTF4X3NldF94ZmVyX2J1ZihzdGF0dXMsIGJ1Zl9sZW4sIHNyYik7CisJc2NzaV9zZXRfcmVzaWQoc3JiLCBzY3NpX2J1ZmZsZW4oc3JiKSAtIGJ1Zl9sZW4pOworCisJcmV0dXJuIFRSQU5TUE9SVF9HT09EOworfQorCitzdGF0aWMgaW50IHJlYWRfc3RhdHVzKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXU4IHJ0czUxeF9zdGF0dXNbMTZdOworCXVuc2lnbmVkIGludCBidWZfbGVuOworCXVuc2lnbmVkIGludCBsdW4gPSBTQ1NJX0xVTihzcmIpOworCisJcnRzNTF4X3JlYWRfc3RhdHVzKGNoaXAsIGx1biwgcnRzNTF4X3N0YXR1cywgMTYpOworCisJYnVmX2xlbiA9IG1pbihzY3NpX2J1ZmZsZW4oc3JiKSwgKHVuc2lnbmVkIGludClzaXplb2YocnRzNTF4X3N0YXR1cykpOworCXJ0czUxeF9zZXRfeGZlcl9idWYocnRzNTF4X3N0YXR1cywgYnVmX2xlbiwgc3JiKTsKKwlzY3NpX3NldF9yZXNpZChzcmIsIHNjc2lfYnVmZmxlbihzcmIpIC0gYnVmX2xlbik7CisKKwlyZXR1cm4gVFJBTlNQT1JUX0dPT0Q7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9tZW0oc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJdW5zaWduZWQgaW50IGx1biA9IFNDU0lfTFVOKHNyYik7CisJdW5zaWduZWQgc2hvcnQgYWRkciwgbGVuLCBpOworCWludCByZXR2YWw7CisJdTggKmJ1ZjsKKworCXJ0czUxeF9wcmVwYXJlX3J1bihjaGlwKTsKKwlSVFM1MVhfU0VUX1NUQVQoY2hpcCwgU1RBVF9SVU4pOworCisJYWRkciA9ICgodTE2KSBzcmItPmNtbmRbMl0gPDwgOCkgfCBzcmItPmNtbmRbM107CisJbGVuID0gKCh1MTYpIHNyYi0+Y21uZFs0XSA8PCA4KSB8IHNyYi0+Y21uZFs1XTsKKworCWlmIChhZGRyIDwgMHhlMDAwKSB7CisJCVJUUzUxWF9ERUJVR1AoImZpbHRlciFhZGRyPTB4JXhcbiIsIGFkZHIpOworCQlyZXR1cm4gVFJBTlNQT1JUX0dPT0Q7CisJfQorCisJYnVmID0gdm1hbGxvYyhsZW4pOworCWlmICghYnVmKQorCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlyZXR2YWwgPSBydHM1MXhfZXAwX3JlYWRfcmVnaXN0ZXIoY2hpcCwgYWRkciArIGksIGJ1ZiArIGkpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQl2ZnJlZShidWYpOworCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCSAgICAgICBTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7CisJCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCX0KKwl9CisKKwlsZW4gPSAodW5zaWduZWQgc2hvcnQpbWluKHNjc2lfYnVmZmxlbihzcmIpLCAodW5zaWduZWQgaW50KWxlbik7CisJcnRzNTF4X3NldF94ZmVyX2J1ZihidWYsIGxlbiwgc3JiKTsKKwlzY3NpX3NldF9yZXNpZChzcmIsIHNjc2lfYnVmZmxlbihzcmIpIC0gbGVuKTsKKworCXZmcmVlKGJ1Zik7CisKKwlyZXR1cm4gVFJBTlNQT1JUX0dPT0Q7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfbWVtKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXVuc2lnbmVkIGludCBsdW4gPSBTQ1NJX0xVTihzcmIpOworCXVuc2lnbmVkIHNob3J0IGFkZHIsIGxlbiwgaTsKKwlpbnQgcmV0dmFsOworCXU4ICpidWY7CisKKwlydHM1MXhfcHJlcGFyZV9ydW4oY2hpcCk7CisJUlRTNTFYX1NFVF9TVEFUKGNoaXAsIFNUQVRfUlVOKTsKKworCWFkZHIgPSAoKHUxNikgc3JiLT5jbW5kWzJdIDw8IDgpIHwgc3JiLT5jbW5kWzNdOworCWxlbiA9ICgodTE2KSBzcmItPmNtbmRbNF0gPDwgOCkgfCBzcmItPmNtbmRbNV07CisKKwlpZiAoYWRkciA8IDB4ZTAwMCkgeworCQlSVFM1MVhfREVCVUdQKCJmaWx0ZXIhYWRkcj0weCV4XG4iLCBhZGRyKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9HT09EOworCX0KKworCWxlbiA9ICh1bnNpZ25lZCBzaG9ydCltaW4oc2NzaV9idWZmbGVuKHNyYiksICh1bnNpZ25lZCBpbnQpbGVuKTsKKwlidWYgPSB2bWFsbG9jKGxlbik7CisJaWYgKCFidWYpCisJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCisJcnRzNTF4X2dldF94ZmVyX2J1ZihidWYsIGxlbiwgc3JiKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlyZXR2YWwgPQorCQkgICAgcnRzNTF4X2VwMF93cml0ZV9yZWdpc3RlcihjaGlwLCBhZGRyICsgaSwgMHhGRiwgYnVmW2ldKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJdmZyZWUoYnVmKTsKKwkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOworCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQl9CisJfQorCisJdmZyZWUoYnVmKTsKKwlzY3NpX3NldF9yZXNpZChzcmIsIHNjc2lfYnVmZmxlbihzcmIpIC0gbGVuKTsKKworCXJldHVybiBUUkFOU1BPUlRfR09PRDsKK30KKworc3RhdGljIGludCBnZXRfc2RfY3NkKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKwl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKKworCWlmICghY2hlY2tfY2FyZF9yZWFkeShjaGlwLCBsdW4pKSB7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CisJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwl9CisKKwlpZiAoZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bikgIT0gU0RfQ0FSRCkgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfVU5SRUNPVkVSX1JFQURfRVJSKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKworCXNjc2lfc2V0X3Jlc2lkKHNyYiwgMCk7CisJcnRzNTF4X3NldF94ZmVyX2J1ZihzZF9jYXJkLT5yYXdfY3NkLCBzY3NpX2J1ZmZsZW4oc3JiKSwgc3JiKTsKKworCXJldHVybiBUUkFOU1BPUlRfR09PRDsKK30KKworc3RhdGljIGludCByZWFkX3BoeV9yZWdpc3RlcihzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlpbnQgcmV0dmFsOworCXU4IGFkZHIsIGxlbiwgaTsKKwl1OCAqYnVmOworCisJcnRzNTF4X3ByZXBhcmVfcnVuKGNoaXApOworCVJUUzUxWF9TRVRfU1RBVChjaGlwLCBTVEFUX1JVTik7CisKKwlhZGRyID0gc3JiLT5jbW5kWzVdOworCWxlbiA9IHNyYi0+Y21uZFs3XTsKKworCWlmIChsZW4pIHsKKwkJYnVmID0gdm1hbGxvYyhsZW4pOworCQlpZiAoIWJ1ZikKKwkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQkJcmV0dmFsID0KKwkJCSAgICBydHM1MXhfcmVhZF9waHlfcmVnaXN0ZXIoY2hpcCwgYWRkciArIGksIGJ1ZiArIGkpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCXZmcmVlKGJ1Zik7CisJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKKwkJCQkJU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOworCQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCX0KKwkJfQorCisJCWxlbiA9IG1pbihzY3NpX2J1ZmZsZW4oc3JiKSwgKHVuc2lnbmVkIGludClsZW4pOworCQlydHM1MXhfc2V0X3hmZXJfYnVmKGJ1ZiwgbGVuLCBzcmIpOworCQlzY3NpX3NldF9yZXNpZChzcmIsIHNjc2lfYnVmZmxlbihzcmIpIC0gbGVuKTsKKworCQl2ZnJlZShidWYpOworCX0KKworCXJldHVybiBUUkFOU1BPUlRfR09PRDsKK30KKworc3RhdGljIGludCB3cml0ZV9waHlfcmVnaXN0ZXIoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJaW50IHJldHZhbDsKKwl1OCBhZGRyLCBsZW4sIGk7CisJdTggKmJ1ZjsKKworCXJ0czUxeF9wcmVwYXJlX3J1bihjaGlwKTsKKwlSVFM1MVhfU0VUX1NUQVQoY2hpcCwgU1RBVF9SVU4pOworCisJYWRkciA9IHNyYi0+Y21uZFs1XTsKKwlsZW4gPSBzcmItPmNtbmRbN107CisKKwlpZiAobGVuKSB7CisJCWxlbiA9IG1pbihzY3NpX2J1ZmZsZW4oc3JiKSwgKHVuc2lnbmVkIGludClsZW4pOworCisJCWJ1ZiA9IHZtYWxsb2MobGVuKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisKKwkJcnRzNTF4X2dldF94ZmVyX2J1ZihidWYsIGxlbiwgc3JiKTsKKwkJc2NzaV9zZXRfcmVzaWQoc3JiLCBzY3NpX2J1ZmZsZW4oc3JiKSAtIGxlbik7CisKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCQlyZXR2YWwgPQorCQkJICAgIHJ0czUxeF93cml0ZV9waHlfcmVnaXN0ZXIoY2hpcCwgYWRkciArIGksIGJ1ZltpXSk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJdmZyZWUoYnVmKTsKKwkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLAorCQkJCQkgICAgICAgU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOworCQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCX0KKwkJfQorCisJCXZmcmVlKGJ1Zik7CisJfQorCisJcmV0dXJuIFRSQU5TUE9SVF9HT09EOworfQorCitzdGF0aWMgaW50IGdldF9jYXJkX2J1c193aWR0aChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKKwl1OCBjYXJkLCBidXNfd2lkdGg7CisKKwlpZiAoIWNoZWNrX2NhcmRfcmVhZHkoY2hpcCwgbHVuKSkgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOworCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJfQorCisJY2FyZCA9IGdldF9sdW5fY2FyZChjaGlwLCBsdW4pOworCWlmICgoY2FyZCA9PSBTRF9DQVJEKSB8fCAoY2FyZCA9PSBNU19DQVJEKSkgeworCQlidXNfd2lkdGggPSBjaGlwLT5jYXJkX2J1c193aWR0aFtsdW5dOworCX0gZWxzZSB7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOworCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJfQorCisJc2NzaV9zZXRfcmVzaWQoc3JiLCAwKTsKKwlydHM1MXhfc2V0X3hmZXJfYnVmKCZidXNfd2lkdGgsIHNjc2lfYnVmZmxlbihzcmIpLCBzcmIpOworCisJcmV0dXJuIFRSQU5TUE9SVF9HT09EOworfQorCisjaWZkZWYgX01TR19UUkFDRQorc3RhdGljIGludCB0cmFjZV9tc2dfY21kKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IE5VTEw7CisJdTggY2xlYXI7CisJdW5zaWduZWQgaW50IGJ1Zl9sZW47CisKKwlidWZfbGVuID0KKwkgICAgNCArCisJICAgICgoMiArIE1TR19GVU5DX0xFTiArIE1TR19GSUxFX0xFTiArIFRJTUVfVkFMX0xFTikgKiBUUkFDRV9JVEVNX0NOVCk7CisKKwlpZiAoKHNjc2lfYnVmZmxlbihzcmIpIDwgYnVmX2xlbikgfHwgKHNjc2lfc2dsaXN0KHNyYikgPT0gTlVMTCkpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKKwkJCSAgICAgICBTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7CisJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwl9CisKKwljbGVhciA9IHNyYi0+Y21uZFsyXTsKKworCWJ1ZiA9IHZtYWxsb2Moc2NzaV9idWZmbGVuKHNyYikpOworCWlmIChidWYgPT0gTlVMTCkKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisKKwlydHM1MXhfdHJhY2VfbXNnKGNoaXAsIGJ1ZiwgY2xlYXIpOworCisJcnRzNTF4X3NldF94ZmVyX2J1ZihidWYsIHNjc2lfYnVmZmxlbihzcmIpLCBzcmIpOworCXZmcmVlKGJ1Zik7CisKKwlzY3NpX3NldF9yZXNpZChzcmIsIDApOworCXJldHVybiBUUkFOU1BPUlRfR09PRDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHJ3X21lbV9jbWRfYnVmKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCWludCByZXR2YWwgPSBTVEFUVVNfU1VDQ0VTUzsKKwl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKKwl1OCBjbWRfdHlwZSwgbWFzaywgdmFsdWUsIGlkeCwgbW9kZSwgbGVuOworCXUxNiBhZGRyOworCXUzMiB0aW1lb3V0OworCisJcnRzNTF4X3ByZXBhcmVfcnVuKGNoaXApOworCVJUUzUxWF9TRVRfU1RBVChjaGlwLCBTVEFUX1JVTik7CisKKwlzd2l0Y2ggKHNyYi0+Y21uZFszXSkgeworCWNhc2UgSU5JVF9CQVRDSENNRDoKKwkJcnRzNTF4X2luaXRfY21kKGNoaXApOworCQlicmVhazsKKworCWNhc2UgQUREX0JBVENIQ01EOgorCQljbWRfdHlwZSA9IHNyYi0+Y21uZFs0XTsKKwkJaWYgKGNtZF90eXBlID4gMikgeworCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCSAgICAgICBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKKwkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJfQorCQlhZGRyID0gKHNyYi0+Y21uZFs1XSA8PCA4KSB8IHNyYi0+Y21uZFs2XTsKKwkJbWFzayA9IHNyYi0+Y21uZFs3XTsKKwkJdmFsdWUgPSBzcmItPmNtbmRbOF07CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIGNtZF90eXBlLCBhZGRyLCBtYXNrLCB2YWx1ZSk7CisJCWJyZWFrOworCisJY2FzZSBTRU5EX0JBVENIQ01EOgorCQltb2RlID0gc3JiLT5jbW5kWzRdOworCQlsZW4gPSBzcmItPmNtbmRbNV07CisJCXRpbWVvdXQgPQorCQkgICAgKCh1MzIpIHNyYi0+Y21uZFs2XSA8PCAyNCkgfCAoKHUzMikgc3JiLT4KKwkJCQkJCSAgY21uZFs3XSA8PCAxNikgfCAoKHUzMikgc3JiLT4KKwkJCQkJCQkJICAgIGNtbmRbOF0gPDwKKwkJCQkJCQkJICAgIDgpIHwgKCh1MzIpCisJCQkJCQkJCQkgIHNyYi0+CisJCQkJCQkJCQkgIGNtbmQKKwkJCQkJCQkJCSAgWzldKTsKKwkJcmV0dmFsID0gcnRzNTF4X3NlbmRfY21kKGNoaXAsIG1vZGUsIDEwMDApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKKwkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJfQorCQlpZiAobW9kZSAmIFNUQUdFX1IpIHsKKwkJCXJldHZhbCA9IHJ0czUxeF9nZXRfcnNwKGNoaXAsIGxlbiwgdGltZW91dCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCQlTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBHRVRfQkFUQ0hSU1A6CisJCWlkeCA9IHNyYi0+Y21uZFs0XTsKKwkJdmFsdWUgPSBjaGlwLT5yc3BfYnVmW2lkeF07CisJCWlmIChzY3NpX2J1ZmZsZW4oc3JiKSA8IDEpIHsKKwkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKKwkJCQkgICAgICAgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7CisJCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCX0KKwkJcnRzNTF4X3NldF94ZmVyX2J1ZigmdmFsdWUsIDEsIHNyYik7CisJCXNjc2lfc2V0X3Jlc2lkKHNyYiwgMCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7CisJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwl9CisKKwlyZXR1cm4gVFJBTlNQT1JUX0dPT0Q7Cit9CisKK3N0YXRpYyBpbnQgc3VpdF9jbWQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJaW50IHJlc3VsdDsKKworCXN3aXRjaCAoc3JiLT5jbW5kWzNdKSB7CisJY2FzZSBJTklUX0JBVENIQ01EOgorCWNhc2UgQUREX0JBVENIQ01EOgorCWNhc2UgU0VORF9CQVRDSENNRDoKKwljYXNlIEdFVF9CQVRDSFJTUDoKKwkJcmVzdWx0ID0gcndfbWVtX2NtZF9idWYoc3JiLCBjaGlwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVzdWx0ID0gVFJBTlNQT1JUX0VSUk9SOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgYXBwX2NtZChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlpbnQgcmVzdWx0OworCisJc3dpdGNoIChzcmItPmNtbmRbMl0pIHsKKwljYXNlIFBQX1JFQUQxMDoKKwljYXNlIFBQX1dSSVRFMTA6CisJCXJlc3VsdCA9IHJlYWRfd3JpdGUoc3JiLCBjaGlwKTsKKwkJYnJlYWs7CisKKwljYXNlIFNVSVRfQ01EOgorCQlyZXN1bHQgPSBzdWl0X2NtZChzcmIsIGNoaXApOworCQlicmVhazsKKworCWNhc2UgUkVBRF9QSFk6CisJCXJlc3VsdCA9IHJlYWRfcGh5X3JlZ2lzdGVyKHNyYiwgY2hpcCk7CisJCWJyZWFrOworCisJY2FzZSBXUklURV9QSFk6CisJCXJlc3VsdCA9IHdyaXRlX3BoeV9yZWdpc3RlcihzcmIsIGNoaXApOworCQlicmVhazsKKworCWNhc2UgR0VUX0RFVl9TVEFUVVM6CisJCXJlc3VsdCA9IGdldF9kZXZfc3RhdHVzKHNyYiwgY2hpcCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKKwkJCSAgICAgICBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgdmVuZG9yX2NtbmQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJaW50IHJlc3VsdCA9IFRSQU5TUE9SVF9HT09EOworCisJc3dpdGNoIChzcmItPmNtbmRbMV0pIHsKKwljYXNlIFJFQURfU1RBVFVTOgorCQlyZXN1bHQgPSByZWFkX3N0YXR1cyhzcmIsIGNoaXApOworCQlicmVhazsKKworCWNhc2UgUkVBRF9NRU06CisJCXJlc3VsdCA9IHJlYWRfbWVtKHNyYiwgY2hpcCk7CisJCWJyZWFrOworCisJY2FzZSBXUklURV9NRU06CisJCXJlc3VsdCA9IHdyaXRlX21lbShzcmIsIGNoaXApOworCQlicmVhazsKKworCWNhc2UgR0VUX0JVU19XSURUSDoKKwkJcmVzdWx0ID0gZ2V0X2NhcmRfYnVzX3dpZHRoKHNyYiwgY2hpcCk7CisJCWJyZWFrOworCisJY2FzZSBHRVRfU0RfQ1NEOgorCQlyZXN1bHQgPSBnZXRfc2RfY3NkKHNyYiwgY2hpcCk7CisJCWJyZWFrOworCisjaWZkZWYgX01TR19UUkFDRQorCWNhc2UgVFJBQ0VfTVNHOgorCQlyZXN1bHQgPSB0cmFjZV9tc2dfY21kKHNyYiwgY2hpcCk7CisJCWJyZWFrOworI2VuZGlmCisKKwljYXNlIFNDU0lfQVBQX0NNRDoKKwkJcmVzdWx0ID0gYXBwX2NtZChzcmIsIGNoaXApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksCisJCQkgICAgICAgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7CisJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IG1zX2Zvcm1hdF9jbW5kKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKwl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKKwlpbnQgcmV0dmFsLCBxdWlja19mb3JtYXQ7CisKKwlpZiAoZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bikgIT0gTVNfQ0FSRCkgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTFVOX05PVF9TVVBQT1JUKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKworCWlmICgoc3JiLT5jbW5kWzNdICE9IDB4NEQpIHx8IChzcmItPmNtbmRbNF0gIT0gMHg0NykKKwkgICAgfHwgKHNyYi0+Y21uZFs1XSAhPSAweDY2KSB8fCAoc3JiLT5jbW5kWzZdICE9IDB4NkQpCisJICAgIHx8IChzcmItPmNtbmRbN10gIT0gMHg3NCkpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKworCWlmIChzcmItPmNtbmRbOF0gJiAweDAxKQorCQlxdWlja19mb3JtYXQgPSAwOworCWVsc2UKKwkJcXVpY2tfZm9ybWF0ID0gMTsKKworCWlmICghKGNoaXAtPmNhcmRfcmVhZHkgJiBNU19DQVJEKSkgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOworCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJfQorCisJaWYgKGNoaXAtPmNhcmRfd3AgJiBNU19DQVJEKSB7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9XUklURV9QUk9URUNUKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKworCWlmICghQ0hLX01TUFJPKG1zX2NhcmQpKSB7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9MVU5fTk9UX1NVUFBPUlQpOworCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJfQorCisJcnRzNTF4X3ByZXBhcmVfcnVuKGNoaXApOworCVJUUzUxWF9TRVRfU1RBVChjaGlwLCBTVEFUX1JVTik7CisKKwlyZXR2YWwgPSBtc3Byb19mb3JtYXQoc3JiLCBjaGlwLCBNU19TSE9SVF9EQVRBX0xFTiwgcXVpY2tfZm9ybWF0KTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9GT1JNQVRfQ01EX0ZBSUxFRCk7CisJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwl9CisKKwlzY3NpX3NldF9yZXNpZChzcmIsIDApOworCXJldHVybiBUUkFOU1BPUlRfR09PRDsKK30KKworI2lmZGVmIFNVUFBPUlRfUENHTF8xUDE4CitpbnQgZ2V0X21zX2luZm9ybWF0aW9uKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKwl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKKwl1OCBkZXZfaW5mb19pZCwgZGF0YV9sZW47CisJdTggKmJ1ZjsKKwl1bnNpZ25lZCBpbnQgYnVmX2xlbjsKKwlpbnQgaTsKKworCWlmICghY2hlY2tfY2FyZF9yZWFkeShjaGlwLCBsdW4pKSB7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CisJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwl9CisJaWYgKChnZXRfbHVuX2NhcmQoY2hpcCwgbHVuKSAhPSBNU19DQVJEKSkgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTFVOX05PVF9TVVBQT1JUKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKworCWlmICgoc3JiLT5jbW5kWzJdICE9IDB4QjApIHx8IChzcmItPmNtbmRbNF0gIT0gMHg0RCkgfHwKKwkgICAgKHNyYi0+Y21uZFs1XSAhPSAweDUzKSB8fCAoc3JiLT5jbW5kWzZdICE9IDB4NDkpIHx8CisJICAgIChzcmItPmNtbmRbN10gIT0gMHg0NCkpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKworCWRldl9pbmZvX2lkID0gc3JiLT5jbW5kWzNdOworCWlmICgoQ0hLX01TWEMobXNfY2FyZCkgJiYgKGRldl9pbmZvX2lkID09IDB4MTApKSB8fAorCSAgICAoIUNIS19NU1hDKG1zX2NhcmQpICYmIChkZXZfaW5mb19pZCA9PSAweDEzKSkgfHwKKwkgICAgIUNIS19NU1BSTyhtc19jYXJkKSkgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOworCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJfQorCisJaWYgKGRldl9pbmZvX2lkID09IDB4MTUpCisJCWJ1Zl9sZW4gPSBkYXRhX2xlbiA9IDB4M0E7CisJZWxzZQorCQlidWZfbGVuID0gZGF0YV9sZW4gPSAweDZBOworCisJYnVmID0ga21hbGxvYyhidWZfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisKKwlpID0gMDsKKwkvKiBHRVQgTWVtb3J5IFN0aWNrIE1lZGlhIEluZm9ybWF0aW9uIFJlc3BvbnNlIEhlYWRlciAqLworCWJ1ZltpKytdID0gMHgwMDsJLyogRGF0YSBsZW5ndGggTVNCICovCisJYnVmW2krK10gPSBkYXRhX2xlbjsJLyogRGF0YSBsZW5ndGggTFNCICovCisJLyogRGV2aWNlIEluZm9ybWF0aW9uIFR5cGUgQ29kZSAqLworCWlmIChDSEtfTVNYQyhtc19jYXJkKSkKKwkJYnVmW2krK10gPSAweDAzOworCWVsc2UKKwkJYnVmW2krK10gPSAweDAyOworCS8qIFNHTSBiaXQgKi8KKwlidWZbaSsrXSA9IDB4MDE7CisJLyogUmVzZXJ2ZWQgKi8KKwlidWZbaSsrXSA9IDB4MDA7CisJYnVmW2krK10gPSAweDAwOworCWJ1ZltpKytdID0gMHgwMDsKKwkvKiBOdW1iZXIgb2YgRGV2aWNlIEluZm9ybWF0aW9uICovCisJYnVmW2krK10gPSAweDAxOworCisJLyogIERldmljZSBJbmZvcm1hdGlvbiBCb2R5CisJICogIERldmljZSBJbmZvcm1hdGlvbiBJRCBOdW1iZXIgKi8KKwlidWZbaSsrXSA9IGRldl9pbmZvX2lkOworCS8qIERldmljZSBJbmZvcm1hdGlvbiBMZW5ndGggKi8KKwlpZiAoZGV2X2luZm9faWQgPT0gMHgxNSkKKwkJZGF0YV9sZW4gPSAweDMxOworCWVsc2UKKwkJZGF0YV9sZW4gPSAweDYxOworCWJ1ZltpKytdID0gMHgwMDsJLyogRGF0YSBsZW5ndGggTVNCICovCisJYnVmW2krK10gPSBkYXRhX2xlbjsJLyogRGF0YSBsZW5ndGggTFNCICovCisJLyogVmFsaWQgQml0ICovCisJYnVmW2krK10gPSAweDgwOworCWlmICgoZGV2X2luZm9faWQgPT0gMHgxMCkgfHwgKGRldl9pbmZvX2lkID09IDB4MTMpKSB7CisJCS8qIFN5c3RlbSBJbmZvcm1hdGlvbiAqLworCQltZW1jcHkoYnVmICsgaSwgbXNfY2FyZC0+cmF3X3N5c19pbmZvLCA5Nik7CisJfSBlbHNlIHsKKwkJLyogTW9kZWwgTmFtZSAqLworCQltZW1jcHkoYnVmICsgaSwgbXNfY2FyZC0+cmF3X21vZGVsX25hbWUsIDQ4KTsKKwl9CisKKwlydHM1MXhfc2V0X3hmZXJfYnVmKGJ1ZiwgYnVmX2xlbiwgc3JiKTsKKworCWlmIChkZXZfaW5mb19pZCA9PSAweDE1KQorCQlzY3NpX3NldF9yZXNpZChzcmIsIHNjc2lfYnVmZmxlbihzcmIpIC0gMHgzQyk7CisJZWxzZQorCQlzY3NpX3NldF9yZXNpZChzcmIsIHNjc2lfYnVmZmxlbihzcmIpIC0gMHg2Qyk7CisKKwlrZnJlZShidWYpOworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IG1zX3NwX2NtbmQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJaW50IHJldHZhbCA9IFRSQU5TUE9SVF9FUlJPUjsKKworCWlmIChzcmItPmNtbmRbMl0gPT0gTVNfRk9STUFUKQorCQlyZXR2YWwgPSBtc19mb3JtYXRfY21uZChzcmIsIGNoaXApOworI2lmZGVmIFNVUFBPUlRfUENHTF8xUDE4CisJZWxzZSBpZiAoc3JiLT5jbW5kWzJdID09IEdFVF9NU19JTkZPUk1BVElPTikKKwkJcmV0dmFsID0gZ2V0X21zX2luZm9ybWF0aW9uKHNyYiwgY2hpcCk7CisjZW5kaWYKKworCXJldHVybiByZXR2YWw7Cit9CisKKyNpZmRlZiBTVVBQT1JUX0NQUk0KK3N0YXRpYyBpbnQgc2RfZXh0ZW50aW9uX2NtbmQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJdW5zaWduZWQgaW50IGx1biA9IFNDU0lfTFVOKHNyYik7CisJaW50IHJlc3VsdDsKKworCXJ0czUxeF9wcmVwYXJlX3J1bihjaGlwKTsKKwlSVFM1MVhfU0VUX1NUQVQoY2hpcCwgU1RBVF9SVU4pOworCisJc2RfY2xlYW51cF93b3JrKGNoaXApOworCisJaWYgKCFjaGVja19jYXJkX3JlYWR5KGNoaXAsIGx1bikpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKwlpZiAoKGdldF9sdW5fY2FyZChjaGlwLCBsdW4pICE9IFNEX0NBUkQpKSB7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9MVU5fTk9UX1NVUFBPUlQpOworCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJfQorCisJc3dpdGNoIChzcmItPmNtbmRbMF0pIHsKKwljYXNlIFNEX1BBU1NfVEhSVV9NT0RFOgorCQlyZXN1bHQgPSBzZF9wYXNzX3RocnVfbW9kZShzcmIsIGNoaXApOworCQlicmVhazsKKworCWNhc2UgU0RfRVhFQ1VURV9OT19EQVRBOgorCQlyZXN1bHQgPSBzZF9leGVjdXRlX25vX2RhdGEoc3JiLCBjaGlwKTsKKwkJYnJlYWs7CisKKwljYXNlIFNEX0VYRUNVVEVfUkVBRDoKKwkJcmVzdWx0ID0gc2RfZXhlY3V0ZV9yZWFkX2RhdGEoc3JiLCBjaGlwKTsKKwkJYnJlYWs7CisKKwljYXNlIFNEX0VYRUNVVEVfV1JJVEU6CisJCXJlc3VsdCA9IHNkX2V4ZWN1dGVfd3JpdGVfZGF0YShzcmIsIGNoaXApOworCQlicmVhazsKKworCWNhc2UgU0RfR0VUX1JTUDoKKwkJcmVzdWx0ID0gc2RfZ2V0X2NtZF9yc3Aoc3JiLCBjaGlwKTsKKwkJYnJlYWs7CisKKwljYXNlIFNEX0hXX1JTVDoKKwkJcmVzdWx0ID0gc2RfaHdfcnN0KHNyYiwgY2hpcCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKKworI2lmZGVmIFNVUFBPUlRfTUFHSUNfR0FURQoraW50IG1nX3JlcG9ydF9rZXkoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCXVuc2lnbmVkIGludCBsdW4gPSBTQ1NJX0xVTihzcmIpOworCWludCByZXR2YWw7CisJdTgga2V5X2Zvcm1hdDsKKworCXJ0czUxeF9wcmVwYXJlX3J1bihjaGlwKTsKKwlSVFM1MVhfU0VUX1NUQVQoY2hpcCwgU1RBVF9SVU4pOworCisJbXNfY2xlYW51cF93b3JrKGNoaXApOworCisJaWYgKCFjaGVja19jYXJkX3JlYWR5KGNoaXAsIGx1bikpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKwlpZiAoKGdldF9sdW5fY2FyZChjaGlwLCBsdW4pICE9IE1TX0NBUkQpKSB7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9MVU5fTk9UX1NVUFBPUlQpOworCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJfQorCisJaWYgKHNyYi0+Y21uZFs3XSAhPSBLQ19NR19SX1BSTykgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOworCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJfQorCisJaWYgKCFDSEtfTVNQUk8obXNfY2FyZCkpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0lOQ09NUEFUSUJMRV9NRURJVU0pOworCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJfQorCisJa2V5X2Zvcm1hdCA9IHNyYi0+Y21uZFsxMF0gJiAweDNGOworCisJc3dpdGNoIChrZXlfZm9ybWF0KSB7CisJY2FzZSBLRl9HRVRfTE9DX0VLQjoKKwkJaWYgKChzY3NpX2J1ZmZsZW4oc3JiKSA9PSAweDQxQykgJiYKKwkJICAgIChzcmItPmNtbmRbOF0gPT0gMHgwNCkgJiYgKHNyYi0+Y21uZFs5XSA9PSAweDFDKSkgeworCQkJcmV0dmFsID0gbWdfZ2V0X2xvY2FsX0VLQihzcmIsIGNoaXApOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCX0gZWxzZSB7CisJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCisJCQkJICAgICAgIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOworCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBLRl9SU1BfQ0hHOgorCQlpZiAoKHNjc2lfYnVmZmxlbihzcmIpID09IDB4MjQpICYmCisJCSAgICAoc3JiLT5jbW5kWzhdID09IDB4MDApICYmIChzcmItPmNtbmRbOV0gPT0gMHgyNCkpIHsKKwkJCXJldHZhbCA9IG1nX2dldF9yc3BfY2hnKHNyYiwgY2hpcCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJfSBlbHNlIHsKKwkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKKwkJCQkgICAgICAgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7CisJCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEtGX0dFVF9JQ1Y6CisJCW1zX2NhcmQtPm1nX2VudHJ5X251bSA9IHNyYi0+Y21uZFs1XTsKKwkJaWYgKChzY3NpX2J1ZmZsZW4oc3JiKSA9PSAweDQwNCkgJiYKKwkJICAgIChzcmItPmNtbmRbOF0gPT0gMHgwNCkgJiYKKwkJICAgIChzcmItPmNtbmRbOV0gPT0gMHgwNCkgJiYKKwkJICAgIChzcmItPmNtbmRbMl0gPT0gMHgwMCkgJiYKKwkJICAgIChzcmItPmNtbmRbM10gPT0gMHgwMCkgJiYKKwkJICAgIChzcmItPmNtbmRbNF0gPT0gMHgwMCkgJiYgKHNyYi0+Y21uZFs1XSA8IDMyKSkgeworCQkJcmV0dmFsID0gbWdfZ2V0X0lDVihzcmIsIGNoaXApOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCX0gZWxzZSB7CisJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCisJCQkJICAgICAgIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOworCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKworCXNjc2lfc2V0X3Jlc2lkKHNyYiwgMCk7CisJcmV0dXJuIFRSQU5TUE9SVF9HT09EOworfQorCitpbnQgbWdfc2VuZF9rZXkoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOworCXVuc2lnbmVkIGludCBsdW4gPSBTQ1NJX0xVTihzcmIpOworCWludCByZXR2YWw7CisJdTgga2V5X2Zvcm1hdDsKKworCXJ0czUxeF9wcmVwYXJlX3J1bihjaGlwKTsKKwlSVFM1MVhfU0VUX1NUQVQoY2hpcCwgU1RBVF9SVU4pOworCisJbXNfY2xlYW51cF93b3JrKGNoaXApOworCisJaWYgKCFjaGVja19jYXJkX3JlYWR5KGNoaXAsIGx1bikpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKwlpZiAoY2hlY2tfY2FyZF93cChjaGlwLCBsdW4pKSB7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9XUklURV9QUk9URUNUKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKwlpZiAoKGdldF9sdW5fY2FyZChjaGlwLCBsdW4pICE9IE1TX0NBUkQpKSB7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9MVU5fTk9UX1NVUFBPUlQpOworCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJfQorCisJaWYgKHNyYi0+Y21uZFs3XSAhPSBLQ19NR19SX1BSTykgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOworCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJfQorCisJaWYgKCFDSEtfTVNQUk8obXNfY2FyZCkpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0lOQ09NUEFUSUJMRV9NRURJVU0pOworCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJfQorCisJa2V5X2Zvcm1hdCA9IHNyYi0+Y21uZFsxMF0gJiAweDNGOworCisJc3dpdGNoIChrZXlfZm9ybWF0KSB7CisJY2FzZSBLRl9TRVRfTEVBRl9JRDoKKwkJaWYgKChzY3NpX2J1ZmZsZW4oc3JiKSA9PSAweDBDKSAmJgorCQkgICAgKHNyYi0+Y21uZFs4XSA9PSAweDAwKSAmJiAoc3JiLT5jbW5kWzldID09IDB4MEMpKSB7CisJCQlyZXR2YWwgPSBtZ19zZXRfbGVhZl9pZChzcmIsIGNoaXApOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCX0gZWxzZSB7CisJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCisJCQkJICAgICAgIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOworCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBLRl9DSEdfSE9TVDoKKwkJaWYgKChzY3NpX2J1ZmZsZW4oc3JiKSA9PSAweDBDKSAmJgorCQkgICAgKHNyYi0+Y21uZFs4XSA9PSAweDAwKSAmJiAoc3JiLT5jbW5kWzldID09IDB4MEMpKSB7CisJCQlyZXR2YWwgPSBtZ19jaGcoc3JiLCBjaGlwKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQl9IGVsc2UgeworCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCSAgICAgICBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKKwkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgS0ZfUlNQX0hPU1Q6CisJCWlmICgoc2NzaV9idWZmbGVuKHNyYikgPT0gMHgwQykgJiYKKwkJICAgIChzcmItPmNtbmRbOF0gPT0gMHgwMCkgJiYgKHNyYi0+Y21uZFs5XSA9PSAweDBDKSkgeworCQkJcmV0dmFsID0gbWdfcnNwKHNyYiwgY2hpcCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJfSBlbHNlIHsKKwkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKKwkJCQkgICAgICAgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7CisJCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEtGX1NFVF9JQ1Y6CisJCW1zX2NhcmQtPm1nX2VudHJ5X251bSA9IHNyYi0+Y21uZFs1XTsKKwkJaWYgKChzY3NpX2J1ZmZsZW4oc3JiKSA9PSAweDQwNCkgJiYKKwkJICAgIChzcmItPmNtbmRbOF0gPT0gMHgwNCkgJiYKKwkJICAgIChzcmItPmNtbmRbOV0gPT0gMHgwNCkgJiYKKwkJICAgIChzcmItPmNtbmRbMl0gPT0gMHgwMCkgJiYKKwkJICAgIChzcmItPmNtbmRbM10gPT0gMHgwMCkgJiYKKwkJICAgIChzcmItPmNtbmRbNF0gPT0gMHgwMCkgJiYgKHNyYi0+Y21uZFs1XSA8IDMyKSkgeworCQkJcmV0dmFsID0gbWdfc2V0X0lDVihzcmIsIGNoaXApOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCX0gZWxzZSB7CisJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCisJCQkJICAgICAgIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOworCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKworCXNjc2lfc2V0X3Jlc2lkKHNyYiwgMCk7CisJcmV0dXJuIFRSQU5TUE9SVF9HT09EOworfQorI2VuZGlmCisKK2ludCBydHM1MXhfc2NzaV9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworI2lmZGVmIFNVUFBPUlRfU0RfTE9DSworCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKyNlbmRpZgorCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKKwl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKKwlpbnQgcmVzdWx0ID0gVFJBTlNQT1JUX0dPT0Q7CisKKyNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKKwlpZiAoc2RfY2FyZC0+c2RfZXJhc2Vfc3RhdHVzKSB7CisJCS8qIEJsb2NrIGFsbCBTQ1NJIGNvbW1hbmQgZXhjZXB0IGZvciBSRVFVRVNUX1NFTlNFCisJCSAqIGFuZCByc19wcHN0YXR1cyAqLworCQlpZiAoIQorCQkgICAgKChzcmItPmNtbmRbMF0gPT0gVkVORE9SX0NNTkQpCisJCSAgICAgJiYgKHNyYi0+Y21uZFsxXSA9PSBTQ1NJX0FQUF9DTUQpCisJCSAgICAgJiYgKHNyYi0+Y21uZFsyXSA9PSBHRVRfREVWX1NUQVRVUykpCisJCSAgICAmJiAoc3JiLT5jbW5kWzBdICE9IFJFUVVFU1RfU0VOU0UpKSB7CisJCQkvKiBMb2dpY2FsIFVuaXQgTm90IFJlYWR5IEZvcm1hdCBpbiBQcm9ncmVzcyAqLworCQkJc2V0X3NlbnNlX2RhdGEoY2hpcCwgbHVuLCBDVVJfRVJSLCAweDAyLCAwLCAweDA0LCAweDA0LAorCQkJCSAgICAgICAwLCAwKTsKKwkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKChnZXRfbHVuX2NhcmQoY2hpcCwgbHVuKSA9PSBNU19DQVJEKSAmJgorCSAgICAobXNfY2FyZC0+Zm9ybWF0X3N0YXR1cyA9PSBGT1JNQVRfSU5fUFJPR1JFU1MpKSB7CisJCWlmICgoc3JiLT5jbW5kWzBdICE9IFJFUVVFU1RfU0VOU0UpCisJCSAgICAmJiAoc3JiLT5jbW5kWzBdICE9IElOUVVJUlkpKSB7CisJCQkvKiBMb2dpY2FsIFVuaXQgTm90IFJlYWR5IEZvcm1hdCBpbiBQcm9ncmVzcyAqLworCQkJc2V0X3NlbnNlX2RhdGEoY2hpcCwgbHVuLCBDVVJfRVJSLCAweDAyLCAwLCAweDA0LCAweDA0LAorCQkJCSAgICAgICAwLCAodTE2KSAobXNfY2FyZC0+cHJvZ3Jlc3MpKTsKKwkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJfQorCX0KKworCXN3aXRjaCAoc3JiLT5jbW5kWzBdKSB7CisJY2FzZSBSRUFEXzEwOgorCWNhc2UgV1JJVEVfMTA6CisJY2FzZSBSRUFEXzY6CisJY2FzZSBXUklURV82OgorCQlyZXN1bHQgPSByZWFkX3dyaXRlKHNyYiwgY2hpcCk7CisJCWJyZWFrOworCisJY2FzZSBURVNUX1VOSVRfUkVBRFk6CisJCXJlc3VsdCA9IHRlc3RfdW5pdF9yZWFkeShzcmIsIGNoaXApOworCQlicmVhazsKKworCWNhc2UgSU5RVUlSWToKKwkJcmVzdWx0ID0gaW5xdWlyeShzcmIsIGNoaXApOworCQlicmVhazsKKworCWNhc2UgUkVBRF9DQVBBQ0lUWToKKwkJcmVzdWx0ID0gcmVhZF9jYXBhY2l0eShzcmIsIGNoaXApOworCQlicmVhazsKKworCWNhc2UgU1RBUlRfU1RPUDoKKwkJcmVzdWx0ID0gc3RhcnRfc3RvcF91bml0KHNyYiwgY2hpcCk7CisJCWJyZWFrOworCisJY2FzZSBBTExPV19NRURJVU1fUkVNT1ZBTDoKKwkJcmVzdWx0ID0gYWxsb3dfbWVkaXVtX3JlbW92YWwoc3JiLCBjaGlwKTsKKwkJYnJlYWs7CisKKwljYXNlIFJFUVVFU1RfU0VOU0U6CisJCXJlc3VsdCA9IHJlcXVlc3Rfc2Vuc2Uoc3JiLCBjaGlwKTsKKwkJYnJlYWs7CisKKwljYXNlIE1PREVfU0VOU0U6CisJY2FzZSBNT0RFX1NFTlNFXzEwOgorCQlyZXN1bHQgPSBtb2RlX3NlbnNlKHNyYiwgY2hpcCk7CisJCWJyZWFrOworCisJY2FzZSAweDIzOgorCQlyZXN1bHQgPSByZWFkX2Zvcm1hdF9jYXBhY2l0eShzcmIsIGNoaXApOworCQlicmVhazsKKworCWNhc2UgVkVORE9SX0NNTkQ6CisJCXJlc3VsdCA9IHZlbmRvcl9jbW5kKHNyYiwgY2hpcCk7CisJCWJyZWFrOworCisJY2FzZSBNU19TUF9DTU5EOgorCQlyZXN1bHQgPSBtc19zcF9jbW5kKHNyYiwgY2hpcCk7CisJCWJyZWFrOworCisjaWZkZWYgU1VQUE9SVF9DUFJNCisJY2FzZSBTRF9QQVNTX1RIUlVfTU9ERToKKwljYXNlIFNEX0VYRUNVVEVfTk9fREFUQToKKwljYXNlIFNEX0VYRUNVVEVfUkVBRDoKKwljYXNlIFNEX0VYRUNVVEVfV1JJVEU6CisJY2FzZSBTRF9HRVRfUlNQOgorCWNhc2UgU0RfSFdfUlNUOgorCQlyZXN1bHQgPSBzZF9leHRlbnRpb25fY21uZChzcmIsIGNoaXApOworCQlicmVhazsKKyNlbmRpZgorCisjaWZkZWYgU1VQUE9SVF9NQUdJQ19HQVRFCisJY2FzZSBDTURfTVNQUk9fTUdfUktFWToKKwkJcmVzdWx0ID0gbWdfcmVwb3J0X2tleShzcmIsIGNoaXApOworCQlicmVhazsKKworCWNhc2UgQ01EX01TUFJPX01HX1NLRVk6CisJCXJlc3VsdCA9IG1nX3NlbmRfa2V5KHNyYiwgY2hpcCk7CisJCWJyZWFrOworI2VuZGlmCisKKwljYXNlIEZPUk1BVF9VTklUOgorCWNhc2UgTU9ERV9TRUxFQ1Q6CisJY2FzZSBWRVJJRlk6CisJCXJlc3VsdCA9IFRSQU5TUE9SVF9HT09EOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7CisJCXJlc3VsdCA9IFRSQU5TUE9SVF9GQUlMRUQ7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBIb3N0IGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjb25zdCBjaGFyICpob3N0X2luZm8oc3RydWN0IFNjc2lfSG9zdCAqaG9zdCkKK3sKKwlyZXR1cm4gIlNDU0kgZW11bGF0aW9uIGZvciBSVFM1MXh4IFVTQiBkcml2ZXItYmFzZWQgY2FyZCByZWFkZXIiOworfQorCitpbnQgc2xhdmVfYWxsb2Moc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCS8qCisJICogU2V0IHRoZSBJTlFVSVJZIHRyYW5zZmVyIGxlbmd0aCB0byAzNi4gIFdlIGRvbid0IHVzZSBhbnkgb2YKKwkgKiB0aGUgZXh0cmEgZGF0YSBhbmQgbWFueSBkZXZpY2VzIGNob2tlIGlmIGFza2VkIGZvciBtb3JlIG9yCisJICogbGVzcyB0aGFuIDM2IGJ5dGVzLgorCSAqLworCXNkZXYtPmlucXVpcnlfbGVuID0gMzY7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzbGF2ZV9jb25maWd1cmUoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQoreworCS8qIFNjYXR0ZXItZ2F0aGVyIGJ1ZmZlcnMgKGFsbCBidXQgdGhlIGxhc3QpIG11c3QgaGF2ZSBhIGxlbmd0aAorCSAqIGRpdmlzaWJsZSBieSB0aGUgYnVsayBtYXhwYWNrZXQgc2l6ZS4gIE90aGVyd2lzZSBhIGRhdGEgcGFja2V0CisJICogd291bGQgZW5kIHVwIGJlaW5nIHNob3J0LCBjYXVzaW5nIGEgcHJlbWF0dXJlIGVuZCB0byB0aGUgZGF0YQorCSAqIHRyYW5zZmVyLiAgU2luY2UgaGlnaC1zcGVlZCBidWxrIHBpcGVzIGhhdmUgYSBtYXhwYWNrZXQgc2l6ZQorCSAqIG9mIDUxMiwgd2UnbGwgdXNlIHRoYXQgYXMgdGhlIHNjc2kgZGV2aWNlIHF1ZXVlJ3MgRE1BIGFsaWdubWVudAorCSAqIG1hc2suICBHdWFyYW50ZWVpbmcgcHJvcGVyIGFsaWdubWVudCBvZiB0aGUgZmlyc3QgYnVmZmVyIHdpbGwKKwkgKiBoYXZlIHRoZSBkZXNpcmVkIGVmZmVjdCBiZWNhdXNlLCBleGNlcHQgYXQgdGhlIGJlZ2lubmluZyBhbmQKKwkgKiB0aGUgZW5kLCBzY2F0dGVyLWdhdGhlciBidWZmZXJzIGZvbGxvdyBwYWdlIGJvdW5kYXJpZXMuICovCisJYmxrX3F1ZXVlX2RtYV9hbGlnbm1lbnQoc2Rldi0+cmVxdWVzdF9xdWV1ZSwgKDUxMiAtIDEpKTsKKworCS8qIFNldCB0aGUgU0NTSSBsZXZlbCB0byBhdCBsZWFzdCAyLiAgV2UnbGwgbGVhdmUgaXQgYXQgMyBpZiB0aGF0J3MKKwkgKiB3aGF0IGlzIG9yaWdpbmFsbHkgcmVwb3J0ZWQuICBXZSBuZWVkIHRoaXMgdG8gYXZvaWQgY29uZnVzaW5nCisJICogdGhlIFNDU0kgbGF5ZXIgd2l0aCBkZXZpY2VzIHRoYXQgcmVwb3J0IDAgb3IgMSwgYnV0IG5lZWQgMTAtYnl0ZQorCSAqIGNvbW1hbmRzIChhbGEgQVRBUEkgZGV2aWNlcyBiZWhpbmQgY2VydGFpbiBicmlkZ2VzLCBvciBkZXZpY2VzCisJICogd2hpY2ggc2ltcGx5IGhhdmUgYnJva2VuIElOUVVJUlkgZGF0YSkuCisJICoKKwkgKiBOT1RFOiBUaGlzIG1lYW5zIC9kZXYvc2cgcHJvZ3JhbXMgKGFsYSBjZHJlY29yZCkgd2lsbCBnZXQgdGhlCisJICogYWN0dWFsIGluZm9ybWF0aW9uLiAgVGhpcyBzZWVtcyB0byBiZSB0aGUgcHJlZmVyZW5jZSBmb3IKKwkgKiBwcm9ncmFtcyBsaWtlIHRoYXQuCisJICoKKwkgKiBOT1RFOiBUaGlzIGFsc28gbWVhbnMgdGhhdCAvcHJvYy9zY3NpL3Njc2kgYW5kIHN5c2ZzIG1heSByZXBvcnQKKwkgKiB0aGUgYWN0dWFsIHZhbHVlIG9yIHRoZSBtb2RpZmllZCBvbmUsIGRlcGVuZGluZyBvbiB3aGVyZSB0aGUKKwkgKiBkYXRhIGNvbWVzIGZyb20uCisJICovCisJaWYgKHNkZXYtPnNjc2lfbGV2ZWwgPCBTQ1NJXzIpCisJCXNkZXYtPnNjc2lfbGV2ZWwgPSBzZGV2LT5zZGV2X3RhcmdldC0+c2NzaV9sZXZlbCA9IFNDU0lfMjsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIC9wcm9jL3Njc2kvIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiB3ZSB1c2UgdGhpcyBtYWNybyB0byBoZWxwIHVzIHdyaXRlIGludG8gdGhlIGJ1ZmZlciAqLworI3VuZGVmIFNQUklOVEYKKyNkZWZpbmUgU1BSSU5URihhcmdzLi4uKSBcCisJZG8geyBpZiAocG9zIDwgYnVmZmVyK2xlbmd0aCkgcG9zICs9IHNwcmludGYocG9zLCAjIyBhcmdzKTsgfSB3aGlsZSAoMCkKKworaW50IHByb2NfaW5mbyhzdHJ1Y3QgU2NzaV9Ib3N0ICpob3N0LCBjaGFyICpidWZmZXIsCisJICAgICAgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBpbm91dCkKK3sKKwljaGFyICpwb3MgPSBidWZmZXI7CisKKwkvKiBpZiBzb21lb25lIGlzIHNlbmRpbmcgdXMgZGF0YSwganVzdCB0aHJvdyBpdCBhd2F5ICovCisJaWYgKGlub3V0KQorCQlyZXR1cm4gbGVuZ3RoOworCisJLyogcHJpbnQgdGhlIGNvbnRyb2xsZXIgbmFtZSAqLworCVNQUklOVEYoIiAgIEhvc3Qgc2NzaSVkOiAlc1xuIiwgaG9zdC0+aG9zdF9ubywgUlRTNTFYX05BTUUpOworCisJLyogcHJpbnQgcHJvZHVjdCwgdmVuZG9yLCBhbmQgZHJpdmVyIHZlcnNpb24gc3RyaW5ncyAqLworCVNQUklOVEYoIiAgICAgICBWZW5kb3I6IFJlYWx0ZWsgQ29ycC5cbiIpOworCVNQUklOVEYoIiAgICAgIFByb2R1Y3Q6IFJUUzUxeHggVVNCIENhcmQgUmVhZGVyXG4iKTsKKwlTUFJJTlRGKCIgICAgICBWZXJzaW9uOiAlc1xuIiwgRFJJVkVSX1ZFUlNJT04pOworCVNQUklOVEYoIiAgICAgICAgQnVpbGQ6ICVzXG4iLCBfX1RJTUVfXyk7CisKKwkvKgorCSAqIENhbGN1bGF0ZSBzdGFydCBvZiBuZXh0IGJ1ZmZlciwgYW5kIHJldHVybiB2YWx1ZS4KKwkgKi8KKwkqc3RhcnQgPSBidWZmZXIgKyBvZmZzZXQ7CisKKwlpZiAoKHBvcyAtIGJ1ZmZlcikgPCBvZmZzZXQpCisJCXJldHVybiAwOworCWVsc2UgaWYgKChwb3MgLSBidWZmZXIgLSBvZmZzZXQpIDwgbGVuZ3RoKQorCQlyZXR1cm4gcG9zIC0gYnVmZmVyIC0gb2Zmc2V0OworCWVsc2UKKwkJcmV0dXJuIGxlbmd0aDsKK30KKworLyogcXVldWUgYSBjb21tYW5kICovCisvKiBUaGlzIGlzIGFsd2F5cyBjYWxsZWQgd2l0aCBzY3NpX2xvY2soaG9zdCkgaGVsZCAqLworaW50IHF1ZXVlY29tbWFuZF9sY2soc3RydWN0IHNjc2lfY21uZCAqc3JiLCB2b2lkICgqZG9uZSkgKHN0cnVjdCBzY3NpX2NtbmQgKikpCit7CisJc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwID0gaG9zdF90b19ydHM1MXgoc3JiLT5kZXZpY2UtPmhvc3QpOworCisJLyogY2hlY2sgZm9yIHN0YXRlLXRyYW5zaXRpb24gZXJyb3JzICovCisJaWYgKGNoaXAtPnNyYiAhPSBOVUxMKSB7CisJCVJUUzUxWF9ERUJVR1AoIkVycm9yIGluICVzOiBjaGlwLT5zcmIgPSAlcFxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywgY2hpcC0+c3JiKTsKKwkJcmV0dXJuIFNDU0lfTUxRVUVVRV9IT1NUX0JVU1k7CisJfQorCisJLyogZmFpbCB0aGUgY29tbWFuZCBpZiB3ZSBhcmUgZGlzY29ubmVjdGluZyAqLworCWlmICh0ZXN0X2JpdChGTElEWF9ESVNDT05ORUNUSU5HLCAmY2hpcC0+dXNiLT5kZmxhZ3MpKSB7CisJCVJUUzUxWF9ERUJVR1AoIkZhaWwgY29tbWFuZCBkdXJpbmcgZGlzY29ubmVjdFxuIik7CisJCXNyYi0+cmVzdWx0ID0gRElEX05PX0NPTk5FQ1QgPDwgMTY7CisJCWRvbmUoc3JiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZW5xdWV1ZSB0aGUgY29tbWFuZCBhbmQgd2FrZSB1cCB0aGUgY29udHJvbCB0aHJlYWQgKi8KKwlzcmItPnNjc2lfZG9uZSA9IGRvbmU7CisJY2hpcC0+c3JiID0gc3JiOworCWNvbXBsZXRlKCZjaGlwLT51c2ItPmNtbmRfcmVhZHkpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZiAwIC8qIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDM3KSAqLworaW50IHF1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHZvaWQgKCpkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKSkKK3sKKwlyZXR1cm4gcXVldWVjb21tYW5kX2xjayhzcmIsIGRvbmUpOworfQorI2Vsc2UKK0RFRl9TQ1NJX1FDTUQocXVldWVjb21tYW5kKQorI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEVycm9yIGhhbmRsaW5nIGZ1bmN0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogQ29tbWFuZCB0aW1lb3V0IGFuZCBhYm9ydCAqLworaW50IGNvbW1hbmRfYWJvcnQoc3RydWN0IHNjc2lfY21uZCAqc3JiKQoreworCXN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCA9IGhvc3RfdG9fcnRzNTF4KHNyYi0+ZGV2aWNlLT5ob3N0KTsKKworCVJUUzUxWF9ERUJVR1AoIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOworCisJLyogdXMtPnNyYiB0b2dldGhlciB3aXRoIHRoZSBUSU1FRF9PVVQsIFJFU0VUVElORywgYW5kIEFCT1JUSU5HCisJICogYml0cyBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBob3N0IGxvY2suICovCisJc2NzaV9sb2NrKHJ0czUxeF90b19ob3N0KGNoaXApKTsKKworCS8qIElzIHRoaXMgY29tbWFuZCBzdGlsbCBhY3RpdmU/ICovCisJaWYgKGNoaXAtPnNyYiAhPSBzcmIpIHsKKwkJc2NzaV91bmxvY2socnRzNTF4X3RvX2hvc3QoY2hpcCkpOworCQlSVFM1MVhfREVCVUdQKCItLSBub3RoaW5nIHRvIGFib3J0XG4iKTsKKwkJcmV0dXJuIEZBSUxFRDsKKwl9CisKKwkvKiBTZXQgdGhlIFRJTUVEX09VVCBiaXQuICBBbHNvIHNldCB0aGUgQUJPUlRJTkcgYml0LCBidXQgb25seSBpZgorCSAqIGEgZGV2aWNlIHJlc2V0IGlzbid0IGFscmVhZHkgaW4gcHJvZ3Jlc3MgKHRvIGF2b2lkIGludGVyZmVyaW5nCisJICogd2l0aCB0aGUgcmVzZXQpLiAgTm90ZSB0aGF0IHdlIG11c3QgcmV0YWluIHRoZSBob3N0IGxvY2sgd2hpbGUKKwkgKiBjYWxsaW5nIHVzYl9zdG9yX3N0b3BfdHJhbnNwb3J0KCk7IG90aGVyd2lzZSBpdCBtaWdodCBpbnRlcmZlcmUKKwkgKiB3aXRoIGFuIGF1dG8tcmVzZXQgdGhhdCBiZWdpbnMgYXMgc29vbiBhcyB3ZSByZWxlYXNlIHRoZSBsb2NrLiAqLworCXNldF9iaXQoRkxJRFhfVElNRURfT1VULCAmY2hpcC0+dXNiLT5kZmxhZ3MpOworCWlmICghdGVzdF9iaXQoRkxJRFhfUkVTRVRUSU5HLCAmY2hpcC0+dXNiLT5kZmxhZ3MpKSB7CisJCXNldF9iaXQoRkxJRFhfQUJPUlRJTkcsICZjaGlwLT51c2ItPmRmbGFncyk7CisJCS8qIHJ0czUxeF9zdG9wX3RyYW5zcG9ydCh1cyk7ICovCisJfQorCXNjc2lfdW5sb2NrKHJ0czUxeF90b19ob3N0KGNoaXApKTsKKworCS8qIFdhaXQgZm9yIHRoZSBhYm9ydGVkIGNvbW1hbmQgdG8gZmluaXNoICovCisJd2FpdF9mb3JfY29tcGxldGlvbigmY2hpcC0+dXNiLT5ub3RpZnkpOworCXJldHVybiBTVUNDRVNTOworfQorCisvKiBUaGlzIGludm9rZXMgdGhlIHRyYW5zcG9ydCByZXNldCBtZWNoYW5pc20gdG8gcmVzZXQgdGhlIHN0YXRlIG9mIHRoZQorICogZGV2aWNlICovCitpbnQgZGV2aWNlX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKnNyYikKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKworCVJUUzUxWF9ERUJVR1AoIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIHJlc3VsdCA8IDAgPyBGQUlMRUQgOiBTVUNDRVNTOworfQorCisvKiBTaW11bGF0ZSBhIFNDU0kgYnVzIHJlc2V0IGJ5IHJlc2V0dGluZyB0aGUgZGV2aWNlJ3MgVVNCIHBvcnQuICovCitpbnQgYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKnNyYikKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKworCVJUUzUxWF9ERUJVR1AoIiVzIGNhbGxlZFxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIHJlc3VsdCA8IDAgPyBGQUlMRUQgOiBTVUNDRVNTOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqcnRzNTEzOV9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpCit7CisJcmV0dXJuICJTQ1NJIGVtdWxhdGlvbiBmb3IgUlRTNTEzOSBVU0IgY2FyZCByZWFkZXIiOworfQorCitzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlIHJ0czUxeF9ob3N0X3RlbXBsYXRlID0geworCS8qIGJhc2ljIHVzZXJsYW5kIGludGVyZmFjZSBzdHVmZiAqLworCS5uYW1lID0gUlRTNTFYX05BTUUsCisJLnByb2NfbmFtZSA9IFJUUzUxWF9OQU1FLAorCS5wcm9jX2luZm8gPSBwcm9jX2luZm8sCisJLmluZm8gPSBydHM1MTM5X2luZm8sCisKKwkvKiBjb21tYW5kIGludGVyZmFjZSAtLSBxdWV1ZWQgb25seSAqLworCS5xdWV1ZWNvbW1hbmQgPSBxdWV1ZWNvbW1hbmQsCisKKwkvKiBlcnJvciBhbmQgYWJvcnQgaGFuZGxlcnMgKi8KKwkuZWhfYWJvcnRfaGFuZGxlciA9IGNvbW1hbmRfYWJvcnQsCisJLmVoX2RldmljZV9yZXNldF9oYW5kbGVyID0gZGV2aWNlX3Jlc2V0LAorCS5laF9idXNfcmVzZXRfaGFuZGxlciA9IGJ1c19yZXNldCwKKworCS8qIHF1ZXVlIGNvbW1hbmRzIG9ubHksIG9ubHkgb25lIGNvbW1hbmQgcGVyIExVTiAqLworCS5jYW5fcXVldWUgPSAxLAorCS5jbWRfcGVyX2x1biA9IDEsCisKKwkvKiB1bmtub3duIGluaXRpYXRvciBpZCAqLworCS50aGlzX2lkID0gLTEsCisKKwkuc2xhdmVfYWxsb2MgPSBzbGF2ZV9hbGxvYywKKwkuc2xhdmVfY29uZmlndXJlID0gc2xhdmVfY29uZmlndXJlLAorCisJLyogbG90cyBvZiBzZyBzZWdtZW50cyBjYW4gYmUgaGFuZGxlZCAqLworCS5zZ190YWJsZXNpemUgPSBTR19BTEwsCisKKwkvKiBsaW1pdCB0aGUgdG90YWwgc2l6ZSBvZiBhIHRyYW5zZmVyIHRvIDEyMCBLQiAqLworCS5tYXhfc2VjdG9ycyA9IDI0MCwKKworCS8qIG1lcmdlIGNvbW1hbmRzLi4uIHRoaXMgc2VlbXMgdG8gaGVscCBwZXJmb3JtYW5jZSwgYnV0CisJICogcGVyaW9kaWNhbGx5IHNvbWVvbmUgc2hvdWxkIHRlc3QgdG8gc2VlIHdoaWNoIHNldHRpbmcgaXMgbW9yZQorCSAqIG9wdGltYWwuCisJICovCisJLnVzZV9jbHVzdGVyaW5nID0gMSwKKworCS8qIGVtdWxhdGVkIEhCQSAqLworCS5lbXVsYXRlZCA9IDEsCisKKwkvKiB3ZSBkbyBvdXIgb3duIGRlbGF5IGFmdGVyIGEgZGV2aWNlIG9yIGJ1cyByZXNldCAqLworCS5za2lwX3NldHRsZV9kZWxheSA9IDEsCisKKwkvKiBzeXNmcyBkZXZpY2UgYXR0cmlidXRlcyAqLworCS8qIC5zZGV2X2F0dHJzID0gc3lzZnNfZGV2aWNlX2F0dHJfbGlzdCwgKi8KKworCS8qIG1vZHVsZSBtYW5hZ2VtZW50ICovCisJLm1vZHVsZSA9IFRISVNfTU9EVUxFCit9OworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS9ydHM1MXhfc2NzaS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X3Njc2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYThjYTA2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X3Njc2kuaApAQCAtMCwwICsxLDE2MiBAQAorLyogRHJpdmVyIGZvciBSZWFsdGVrIFJUUzUxeHggVVNCIGNhcmQgcmVhZGVyCisgKiBIZWFkZXIgZmlsZQorICoKKyAqIENvcHlyaWdodChjKSAyMDA5IFJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3JwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBBdXRob3I6CisgKiAgIHd3YW5nICh3ZWlfd2FuZ0ByZWFsc2lsLmNvbS5jbikKKyAqICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisgKiBNYWludGFpbmVyOgorICogICBFZHdpbiBSb25nIChlZHdpbl9yb25nQHJlYWxzaWwuY29tLmNuKQorICogICBOby4gNDUwLCBTaGVuaHUgUm9hZCwgU3V6aG91IEluZHVzdHJ5IFBhcmssIFN1emhvdSwgQ2hpbmEKKyAqLworCisjaWZuZGVmIF9fUlRTNTFYX1NDU0lfSAorI2RlZmluZSBfX1JUUzUxWF9TQ1NJX0gKKworI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYl91c3VhbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV9ob3N0Lmg+CisKKyNpbmNsdWRlICJydHM1MXhfY2hpcC5oIgorCisjZGVmaW5lIE1TX1NQX0NNTkQJCTB4RkEKKyNkZWZpbmUgTVNfRk9STUFUCQkweEEwCisjZGVmaW5lIEdFVF9NU19JTkZPUk1BVElPTgkweEIwCisKKyNkZWZpbmUgVkVORE9SX0NNTkQJCTB4RjAKKworI2RlZmluZSBSRUFEX1NUQVRVUwkJMHgwOQorCisjZGVmaW5lIFJFQURfTUVNCQkweDBECisjZGVmaW5lIFdSSVRFX01FTQkJMHgwRQorI2RlZmluZSBHRVRfQlVTX1dJRFRICQkweDEzCisjZGVmaW5lIEdFVF9TRF9DU0QJCTB4MTQKKyNkZWZpbmUgVE9HR0xFX0dQSU8JCTB4MTUKKyNkZWZpbmUgVFJBQ0VfTVNHCQkweDE4CisKKyNkZWZpbmUgU0NTSV9BUFBfQ01ECQkweDEwCisKKyNkZWZpbmUgUFBfUkVBRDEwCQkweDFBCisjZGVmaW5lIFBQX1dSSVRFMTAJCTB4MEEKKyNkZWZpbmUgUkVBRF9IT1NUX1JFRwkJMHgxRAorI2RlZmluZSBXUklURV9IT1NUX1JFRwkJMHgwRAorI2RlZmluZSBTRVRfVkFSCQkJMHgwNQorI2RlZmluZSBHRVRfVkFSCQkJMHgxNQorI2RlZmluZSBETUFfUkVBRAkJMHgxNgorI2RlZmluZSBETUFfV1JJVEUJCTB4MDYKKyNkZWZpbmUgR0VUX0RFVl9TVEFUVVMJCTB4MTAKKyNkZWZpbmUgU0VUX0NISVBfTU9ERQkJMHgyNworI2RlZmluZSBTVUlUX0NNRAkJMHhFMAorI2RlZmluZSBXUklURV9QSFkJCTB4MDcKKyNkZWZpbmUgUkVBRF9QSFkJCTB4MTcKKworI2RlZmluZSBJTklUX0JBVENIQ01ECQkweDQxCisjZGVmaW5lIEFERF9CQVRDSENNRAkJMHg0MgorI2RlZmluZSBTRU5EX0JBVENIQ01ECQkweDQzCisjZGVmaW5lIEdFVF9CQVRDSFJTUAkJMHg0NAorCisjaWZkZWYgU1VQUE9SVF9DUFJNCisvKiBTRCBQYXNzIFRocm91Z2ggQ29tbWFuZCBFeHRlbnRpb24gKi8KKyNkZWZpbmUgU0RfUEFTU19USFJVX01PREUJMHhEMAorI2RlZmluZSBTRF9FWEVDVVRFX05PX0RBVEEJMHhEMQorI2RlZmluZSBTRF9FWEVDVVRFX1JFQUQJCTB4RDIKKyNkZWZpbmUgU0RfRVhFQ1VURV9XUklURQkweEQzCisjZGVmaW5lIFNEX0dFVF9SU1AJCTB4RDQKKyNkZWZpbmUgU0RfSFdfUlNUCQkweEQ2CisjZW5kaWYKKworI2lmZGVmIFNVUFBPUlRfTUFHSUNfR0FURQorI2RlZmluZSBDTURfTVNQUk9fTUdfUktFWQkweEE0CS8qIFJlcG9ydCBLZXkgQ29tbWFuZCAqLworI2RlZmluZSBDTURfTVNQUk9fTUdfU0tFWQkweEEzCS8qIFNlbmQgS2V5IENvbW1hbmQgKi8KKworLyogQ0JXQ0IgZmllbGQ6IGtleSBjbGFzcyAqLworI2RlZmluZSBLQ19NR19SX1BSTwkJMHhCRQkvKiBNRy1SIFBSTyAqLworCisvKiBDQldDQiBmaWVsZDoga2V5IGZvcm1hdCAqLworI2RlZmluZSBLRl9TRVRfTEVBRl9JRAkJMHgzMQkvKiBTZXQgTGVhZiBJRCAqLworI2RlZmluZSBLRl9HRVRfTE9DX0VLQgkJMHgzMgkvKiBHZXQgTG9jYWwgRUtCICovCisjZGVmaW5lIEtGX0NIR19IT1NUCQkweDMzCS8qIENoYWxsZW5nZSAoaG9zdCkgKi8KKyNkZWZpbmUgS0ZfUlNQX0NIRwkJMHgzNAkvKiBSZXNwb25zZSBhbmQgQ2hhbGxlbmdlIChkZXZpY2UpICAqLworI2RlZmluZSBLRl9SU1BfSE9TVAkJMHgzNQkvKiBSZXNwb25zZSAoaG9zdCkgKi8KKyNkZWZpbmUgS0ZfR0VUX0lDVgkJMHgzNgkvKiBHZXQgSUNWICovCisjZGVmaW5lIEtGX1NFVF9JQ1YJCTB4MzcJLyogU1NldCBJQ1YgKi8KKyNlbmRpZgorCitzdHJ1Y3QgcnRzNTF4X2NoaXA7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTdGFydC1TdG9wLVVuaXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgU1RPUF9NRURJVU0JCQkweDAwCS8qIGFjY2VzcyBkaXNhYmxlICovCisjZGVmaW5lIE1BS0VfTUVESVVNX1JFQURZCQkweDAxCS8qIGFjY2VzcyBlbmFibGUgKi8KKyNkZWZpbmUgVU5MT0FEX01FRElVTQkJCTB4MDIJLyogdW5sb2FkICovCisjZGVmaW5lIExPQURfTUVESVVNCQkJMHgwMwkvKiBsb2FkICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTVEFOREFSRF9JTlFVSVJZCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjZGVmaW5lIFFVTElGSVJFICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQUVOQ19GTkMgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBUUk1MX0lPUCAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFJFTF9BRFIgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgV0JVU18zMiAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBXQlVTXzE2ICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFNZTkMgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgTElOS0VEICAgICAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBDTURfUVVFICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFNGVF9SRSAgICAgICAgICAgICAgICAgIDB4MDAKKworI2RlZmluZSBWRU5fSURfTEVOICAgICAgICAgICAgICA4CS8qIFZlbmRvciBJRCBMZW5ndGggICAgICAgICAqLworI2RlZmluZSBQUkRDVF9JRF9MRU4gICAgICAgICAgICAxNgkvKiBQcm9kdWN0IElEIExlbmd0aCAgICAgICAgKi8KKyNkZWZpbmUgUFJEQ1RfUkVWX0xFTiAgICAgICAgICAgNAkvKiBQcm9kdWN0IExPVCBMZW5ndGggICAgICAgKi8KKworI2RlZmluZSBEUkNUX0FDQ0VTU19ERVYgICAgICAgICAweDAwCS8qIERpcmVjdCBBY2Nlc3MgRGV2aWNlICAgICAgICAgICAgICovCisjZGVmaW5lIFJNQl9ESVNDICAgICAgICAgICAgICAgIDB4ODAJLyogVGhlIERldmljZSBpcyBSZW1vdmFibGUgICAgICAgICAgKi8KKyNkZWZpbmUgQU5TSV9TQ1NJMiAgICAgICAgICAgICAgMHgwMgkvKiBCYXNlZCBvbiBBTlNJLVNDU0kyICAgICAgICAgICAgICAqLworCisjZGVmaW5lIFNDU0kgICAgICAgICAgICAgICAgICAgIDB4MDAJLyogSW50ZXJmYWNlIElEICAgICAgICAgICAgICAgICAgICAgKi8KKwordm9pZCBzY3NpX3Nob3dfY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIpOwordm9pZCBzZXRfc2Vuc2VfdHlwZShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBsdW4sIGludCBzZW5zZV90eXBlKTsKK3ZvaWQgc2V0X3NlbnNlX2RhdGEoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgbHVuLCB1OCBlcnJfY29kZSwKKwkJICAgIHU4IHNlbnNlX2tleSwgdTMyIGluZm8sIHU4IGFzYywgdTggYXNjcSwgdTggc25zX2tleV9pbmZvMCwKKwkJICAgIHUxNiBzbnNfa2V5X2luZm8xKTsKKworaW50IHJ0czUxeF9zY3NpX2hhbmRsZXIoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApOworCitzdHJ1Y3QgU2NzaV9Ib3N0Oworc3RydWN0IHNjc2lfZGV2aWNlOworc3RydWN0IHNjc2lfY21uZDsKKworY29uc3QgY2hhciAqaG9zdF9pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QpOworaW50IHNsYXZlX2FsbG9jKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldik7CitpbnQgc2xhdmVfY29uZmlndXJlKHN0cnVjdCBzY3NpX2RldmljZSAqc2Rldik7CitpbnQgcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwKKwkgICAgICBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGlub3V0KTsKKyNpZiAwIC8qIExJTlVYX1ZFUlNJT05fQ09ERSA8IEtFUk5FTF9WRVJTSU9OKDIsIDYsIDM3KSAqLworaW50IHF1ZXVlY29tbWFuZChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHZvaWQgKCpkb25lKSAoc3RydWN0IHNjc2lfY21uZCAqKSk7CisjZWxzZQoraW50IHF1ZXVlY29tbWFuZChzdHJ1Y3QgU2NzaV9Ib3N0ICosIHN0cnVjdCBzY3NpX2NtbmQgKik7CisjZW5kaWYKK2ludCBjb21tYW5kX2Fib3J0KHN0cnVjdCBzY3NpX2NtbmQgKnNyYik7CitpbnQgZGV2aWNlX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKnNyYik7CitpbnQgYnVzX3Jlc2V0KHN0cnVjdCBzY3NpX2NtbmQgKnNyYik7CisKKyNlbmRpZiAvKiBfX1JUUzUxWF9TQ1NJX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF9zeXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF9zeXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDljZDM0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X3N5cy5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qIERyaXZlciBmb3IgUmVhbHRlayBVU0IgUlRTNTF4eCBjYXJkIHJlYWRlcgorICogSGVhZGVyIGZpbGUKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOSBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogQXV0aG9yOgorICogICB3d2FuZyAod2VpX3dhbmdAcmVhbHNpbC5jb20uY24pCisgKiAgIE5vLiA0NTAsIFNoZW5odSBSb2FkLCBTdXpob3UgSW5kdXN0cnkgUGFyaywgU3V6aG91LCBDaGluYQorICogTWFpbnRhaW5lcjoKKyAqICAgRWR3aW4gUm9uZyAoZWR3aW5fcm9uZ0ByZWFsc2lsLmNvbS5jbikKKyAqICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisgKi8KKworI2lmbmRlZiBfX1JUUzUxWF9TWVNfSAorI2RlZmluZSBfX1JUUzUxWF9TWVNfSAorCisjaW5jbHVkZSAicnRzNTF4LmgiCisjaW5jbHVkZSAicnRzNTF4X2NoaXAuaCIKKyNpbmNsdWRlICJydHM1MXhfY2FyZC5oIgorCisjZGVmaW5lIFVTSU5HX1BPTExJTkdfQ1lDTEVfREVMSU5LCisKK2V4dGVybiBpbnQgIHJ0czUxeF9jaGVja19zdGFydF90aW1lKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7CitleHRlcm4gdm9pZCBydHM1MXhfc2V0X3N0YXJ0X3RpbWUoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKTsKK2V4dGVybiB2b2lkIHJ0czUxeF9jbGVhcl9zdGFydF90aW1lKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7CisKKy8qIHR5cGVkZWYgZG1hX2FkZHJfdCBVTE9OR19QVFI7ICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBydHM1MXhfcmVzZXRfZGV0ZWN0ZWRfY2FyZHMoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworLyogICAgICBydHM1MXhfcmVzZXRfY2FyZHMoY2hpcCk7ICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9maXJzdF9pbnN0YWxsX21hcmsoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworfQorCit2b2lkIHJ0czUxeF9lbnRlcl9zcyhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApOwordm9pZCBydHM1MXhfZXhpdF9zcyhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApOworCisjZW5kaWYgLyogX19SVFM1MVhfU1lTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF90cmFuc3BvcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF90cmFuc3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTE0NjdhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X3RyYW5zcG9ydC5jCkBAIC0wLDAgKzEsMTAwMCBAQAorLyogRHJpdmVyIGZvciBSZWFsdGVrIFJUUzUxeHggVVNCIGNhcmQgcmVhZGVyCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDkgUmVhbHRlayBTZW1pY29uZHVjdG9yIENvcnAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIEF1dGhvcjoKKyAqICAgd3dhbmcgKHdlaV93YW5nQHJlYWxzaWwuY29tLmNuKQorICogICBOby4gNDUwLCBTaGVuaHUgUm9hZCwgU3V6aG91IEluZHVzdHJ5IFBhcmssIFN1emhvdSwgQ2hpbmEKKyAqIE1haW50YWluZXI6CisgKiAgIEVkd2luIFJvbmcgKGVkd2luX3JvbmdAcmVhbHNpbC5jb20uY24pCisgKiAgIE5vLiA0NTAsIFNoZW5odSBSb2FkLCBTdXpob3UgSW5kdXN0cnkgUGFyaywgU3V6aG91LCBDaGluYQorICovCisKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxzY3NpL3Njc2kuaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KKyNpbmNsdWRlIDxzY3NpL3Njc2lfZGV2aWNlLmg+CisKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInJ0czUxeC5oIgorI2luY2x1ZGUgInJ0czUxeF9jaGlwLmgiCisjaW5jbHVkZSAicnRzNTF4X2NhcmQuaCIKKyNpbmNsdWRlICJydHM1MXhfc2NzaS5oIgorI2luY2x1ZGUgInJ0czUxeF90cmFuc3BvcnQuaCIKKyNpbmNsdWRlICJ0cmFjZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNjYXR0ZXItZ2F0aGVyIHRyYW5zZmVyIGJ1ZmZlciBhY2Nlc3Mgcm91dGluZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ29weSBhIGJ1ZmZlciBvZiBsZW5ndGggYnVmbGVuIHRvL2Zyb20gdGhlIHNyYidzIHRyYW5zZmVyIGJ1ZmZlci4KKyAqIFVwZGF0ZSB0aGUgKipzZ3B0ciBhbmQgKm9mZnNldCB2YXJpYWJsZXMgc28gdGhhdCB0aGUgbmV4dCBjb3B5IHdpbGwKKyAqIHBpY2sgdXAgZnJvbSB3aGVyZSB0aGlzIG9uZSBsZWZ0IG9mZi4KKyAqLworCit1bnNpZ25lZCBpbnQgcnRzNTF4X2FjY2Vzc19zZ2xpc3QodW5zaWduZWQgY2hhciAqYnVmZmVyLAorCQkJCSAgdW5zaWduZWQgaW50IGJ1Zmxlbiwgdm9pZCAqc2dsaXN0LAorCQkJCSAgdm9pZCAqKnNncHRyLCB1bnNpZ25lZCBpbnQgKm9mZnNldCwKKwkJCQkgIGVudW0geGZlcl9idWZfZGlyIGRpcikKK3sKKwl1bnNpZ25lZCBpbnQgY250OworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSAoc3RydWN0IHNjYXR0ZXJsaXN0ICopKnNncHRyOworCisJLyogV2UgaGF2ZSB0byBnbyB0aHJvdWdoIHRoZSBsaXN0IG9uZSBlbnRyeQorCSAqIGF0IGEgdGltZS4gIEVhY2ggcy1nIGVudHJ5IGNvbnRhaW5zIHNvbWUgbnVtYmVyIG9mIHBhZ2VzLCBhbmQKKwkgKiBlYWNoIHBhZ2UgaGFzIHRvIGJlIGttYXAoKSdlZCBzZXBhcmF0ZWx5LiAgSWYgdGhlIHBhZ2UgaXMgYWxyZWFkeQorCSAqIGluIGtlcm5lbC1hZGRyZXNzYWJsZSBtZW1vcnkgdGhlbiBrbWFwKCkgd2lsbCByZXR1cm4gaXRzIGFkZHJlc3MuCisJICogSWYgdGhlIHBhZ2UgaXMgbm90IGRpcmVjdGx5IGFjY2Vzc2libGUgLS0gc3VjaCBhcyBhIHVzZXIgYnVmZmVyCisJICogbG9jYXRlZCBpbiBoaWdoIG1lbW9yeSAtLSB0aGVuIGttYXAoKSB3aWxsIG1hcCBpdCB0byBhIHRlbXBvcmFyeQorCSAqIHBvc2l0aW9uIGluIHRoZSBrZXJuZWwncyB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UuCisJICovCisKKwlpZiAoIXNnKQorCQlzZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilzZ2xpc3Q7CisKKwkvKiBUaGlzIGxvb3AgaGFuZGxlcyBhIHNpbmdsZSBzLWcgbGlzdCBlbnRyeSwgd2hpY2ggbWF5CisJICogaW5jbHVkZSBtdWx0aXBsZSBwYWdlcy4gIEZpbmQgdGhlIGluaXRpYWwgcGFnZSBzdHJ1Y3R1cmUKKwkgKiBhbmQgdGhlIHN0YXJ0aW5nIG9mZnNldCB3aXRoaW4gdGhlIHBhZ2UsIGFuZCB1cGRhdGUKKwkgKiB0aGUgKm9mZnNldCBhbmQgKipzZ3B0ciB2YWx1ZXMgZm9yIHRoZSBuZXh0IGxvb3AuCisJICovCisJY250ID0gMDsKKwl3aGlsZSAoY250IDwgYnVmbGVuICYmIHNnKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gc2dfcGFnZShzZykgKworCQkgICAgKChzZy0+b2Zmc2V0ICsgKm9mZnNldCkgPj4gUEFHRV9TSElGVCk7CisJCXVuc2lnbmVkIGludCBwb2ZmID0gKHNnLT5vZmZzZXQgKyAqb2Zmc2V0KSAmIChQQUdFX1NJWkUgLSAxKTsKKwkJdW5zaWduZWQgaW50IHNnbGVuID0gc2ctPmxlbmd0aCAtICpvZmZzZXQ7CisKKwkJaWYgKHNnbGVuID4gYnVmbGVuIC0gY250KSB7CisKKwkJCS8qIFRyYW5zZmVyIGVuZHMgd2l0aGluIHRoaXMgcy1nIGVudHJ5ICovCisJCQlzZ2xlbiA9IGJ1ZmxlbiAtIGNudDsKKwkJCSpvZmZzZXQgKz0gc2dsZW47CisJCX0gZWxzZSB7CisKKwkJCS8qIFRyYW5zZmVyIGNvbnRpbnVlcyB0byBuZXh0IHMtZyBlbnRyeSAqLworCQkJKm9mZnNldCA9IDA7CisJCQlzZyA9IHNnX25leHQoc2cpOworCQl9CisKKwkJLyogVHJhbnNmZXIgdGhlIGRhdGEgZm9yIGFsbCB0aGUgcGFnZXMgaW4gdGhpcworCQkgKiBzLWcgZW50cnkuICBGb3IgZWFjaCBwYWdlOiBjYWxsIGttYXAoKSwgZG8gdGhlCisJCSAqIHRyYW5zZmVyLCBhbmQgY2FsbCBrdW5tYXAoKSBpbW1lZGlhdGVseSBhZnRlci4gKi8KKwkJd2hpbGUgKHNnbGVuID4gMCkgeworCQkJdW5zaWduZWQgaW50IHBsZW4gPSBtaW4oc2dsZW4sICh1bnNpZ25lZCBpbnQpCisJCQkJCQlQQUdFX1NJWkUgLSBwb2ZmKTsKKwkJCXVuc2lnbmVkIGNoYXIgKnB0ciA9IGttYXAocGFnZSk7CisKKwkJCWlmIChkaXIgPT0gVE9fWEZFUl9CVUYpCisJCQkJbWVtY3B5KHB0ciArIHBvZmYsIGJ1ZmZlciArIGNudCwgcGxlbik7CisJCQllbHNlCisJCQkJbWVtY3B5KGJ1ZmZlciArIGNudCwgcHRyICsgcG9mZiwgcGxlbik7CisJCQlrdW5tYXAocGFnZSk7CisKKwkJCS8qIFN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgcGFnZSAqLworCQkJcG9mZiA9IDA7CisJCQkrK3BhZ2U7CisJCQljbnQgKz0gcGxlbjsKKwkJCXNnbGVuIC09IHBsZW47CisJCX0KKwl9CisJKnNncHRyID0gc2c7CisKKwkvKiBSZXR1cm4gdGhlIGFtb3VudCBhY3R1YWxseSB0cmFuc2ZlcnJlZCAqLworCXJldHVybiBjbnQ7Cit9CisKK3Vuc2lnbmVkIGludCBydHM1MXhfYWNjZXNzX3hmZXJfYnVmKHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKKwkJCQkgICAgdW5zaWduZWQgaW50IGJ1Zmxlbiwgc3RydWN0IHNjc2lfY21uZCAqc3JiLAorCQkJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKipzZ3B0ciwKKwkJCQkgICAgdW5zaWduZWQgaW50ICpvZmZzZXQsIGVudW0geGZlcl9idWZfZGlyIGRpcikKK3sKKwlyZXR1cm4gcnRzNTF4X2FjY2Vzc19zZ2xpc3QoYnVmZmVyLCBidWZsZW4sICh2b2lkICopc2NzaV9zZ2xpc3Qoc3JiKSwKKwkJCQkgICAgKHZvaWQgKiopc2dwdHIsIG9mZnNldCwgZGlyKTsKK30KKworLyogU3RvcmUgdGhlIGNvbnRlbnRzIG9mIGJ1ZmZlciBpbnRvIHNyYidzIHRyYW5zZmVyIGJ1ZmZlciBhbmQgc2V0IHRoZQorICogU0NTSSByZXNpZHVlLgorICovCit2b2lkIHJ0czUxeF9zZXRfeGZlcl9idWYodW5zaWduZWQgY2hhciAqYnVmZmVyLAorCQkJIHVuc2lnbmVkIGludCBidWZsZW4sIHN0cnVjdCBzY3NpX2NtbmQgKnNyYikKK3sKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gTlVMTDsKKworCWJ1ZmxlbiA9IG1pbihidWZsZW4sIHNjc2lfYnVmZmxlbihzcmIpKTsKKwlidWZsZW4gPSBydHM1MXhfYWNjZXNzX3hmZXJfYnVmKGJ1ZmZlciwgYnVmbGVuLCBzcmIsICZzZywgJm9mZnNldCwKKwkJCQkJVE9fWEZFUl9CVUYpOworCWlmIChidWZsZW4gPCBzY3NpX2J1ZmZsZW4oc3JiKSkKKwkJc2NzaV9zZXRfcmVzaWQoc3JiLCBzY3NpX2J1ZmZsZW4oc3JiKSAtIGJ1Zmxlbik7Cit9CisKK3ZvaWQgcnRzNTF4X2dldF94ZmVyX2J1Zih1bnNpZ25lZCBjaGFyICpidWZmZXIsCisJCQkgdW5zaWduZWQgaW50IGJ1Zmxlbiwgc3RydWN0IHNjc2lfY21uZCAqc3JiKQoreworCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBOVUxMOworCisJYnVmbGVuID0gbWluKGJ1Zmxlbiwgc2NzaV9idWZmbGVuKHNyYikpOworCWJ1ZmxlbiA9IHJ0czUxeF9hY2Nlc3NfeGZlcl9idWYoYnVmZmVyLCBidWZsZW4sIHNyYiwgJnNnLCAmb2Zmc2V0LAorCQkJCQlGUk9NX1hGRVJfQlVGKTsKKwlpZiAoYnVmbGVuIDwgc2NzaV9idWZmbGVuKHNyYikpCisJCXNjc2lfc2V0X3Jlc2lkKHNyYiwgc2NzaV9idWZmbGVuKHNyYikgLSBidWZsZW4pOworfQorCisvKiBUaGlzIGlzIHRoZSBjb21wbGV0aW9uIGhhbmRsZXIgd2hpY2ggd2lsbCB3YWtlIHVzIHVwIHdoZW4gYW4gVVJCCisgKiBjb21wbGV0ZXMuCisgKi8KK3N0YXRpYyB2b2lkIHVyYl9kb25lX2NvbXBsZXRpb24oc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCBjb21wbGV0aW9uICp1cmJfZG9uZV9wdHIgPSB1cmItPmNvbnRleHQ7CisKKwlpZiAodXJiX2RvbmVfcHRyKQorCQljb21wbGV0ZSh1cmJfZG9uZV9wdHIpOworfQorCisvKiBUaGlzIGlzIHRoZSBjb21tb24gcGFydCBvZiB0aGUgVVJCIG1lc3NhZ2Ugc3VibWlzc2lvbiBjb2RlCisgKgorICogQWxsIFVSQnMgZnJvbSB0aGUgZHJpdmVyIGludm9sdmVkIGluIGhhbmRsaW5nIGEgcXVldWVkIHNjc2kKKyAqIGNvbW1hbmQgX211c3RfIHBhc3MgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uIChvciBzb21ldGhpbmcgbGlrZSBpdCkgZm9yIHRoZQorICogYWJvcnQgbWVjaGFuaXNtcyB0byB3b3JrIHByb3Blcmx5LgorICovCitzdGF0aWMgaW50IHJ0czUxeF9tc2dfY29tbW9uKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgc3RydWN0IHVyYiAqdXJiLAorCQkJICAgICBpbnQgdGltZW91dCkKK3sKKwlzdHJ1Y3QgcnRzNTF4X3VzYiAqcnRzNTF4ID0gY2hpcC0+dXNiOworCXN0cnVjdCBjb21wbGV0aW9uIHVyYl9kb25lOworCWxvbmcgdGltZWxlZnQ7CisJaW50IHN0YXR1czsKKworCS8qIGRvbid0IHN1Ym1pdCBVUkJzIGR1cmluZyBhYm9ydCBwcm9jZXNzaW5nICovCisJaWYgKHRlc3RfYml0KEZMSURYX0FCT1JUSU5HLCAmcnRzNTF4LT5kZmxhZ3MpKQorCQlUUkFDRV9SRVQoY2hpcCwgLUVJTyk7CisKKwkvKiBzZXQgdXAgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgd2FrZXVwIHN5c3RlbSAqLworCWluaXRfY29tcGxldGlvbigmdXJiX2RvbmUpOworCisJLyogZmlsbCB0aGUgY29tbW9uIGZpZWxkcyBpbiB0aGUgVVJCICovCisJdXJiLT5jb250ZXh0ID0gJnVyYl9kb25lOworCXVyYi0+YWN0dWFsX2xlbmd0aCA9IDA7CisJdXJiLT5lcnJvcl9jb3VudCA9IDA7CisJdXJiLT5zdGF0dXMgPSAwOworCisJLyogd2UgYXNzdW1lIHRoYXQgaWYgdHJhbnNmZXJfYnVmZmVyIGlzbid0IHVzLT5pb2J1ZiB0aGVuIGl0CisJICogaGFzbid0IGJlZW4gbWFwcGVkIGZvciBETUEuICBZZXMsIHRoaXMgaXMgY2x1bmt5LCBidXQgaXQncworCSAqIGVhc2llciB0aGFuIGFsd2F5cyBoYXZpbmcgdGhlIGNhbGxlciB0ZWxsIHVzIHdoZXRoZXIgdGhlCisJICogdHJhbnNmZXIgYnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gbWFwcGVkLiAqLworCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfTk9fU0VUVVBfRE1BX01BUDsKKwlpZiAodXJiLT50cmFuc2Zlcl9idWZmZXIgPT0gcnRzNTF4LT5pb2J1ZikgeworCQl1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOworCQl1cmItPnRyYW5zZmVyX2RtYSA9IHJ0czUxeC0+aW9idWZfZG1hOworCX0KKwl1cmItPnNldHVwX2RtYSA9IHJ0czUxeC0+Y3JfZG1hOworCisJLyogc3VibWl0IHRoZSBVUkIgKi8KKwlzdGF0dXMgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9OT0lPKTsKKwlpZiAoc3RhdHVzKSB7CisJCS8qIHNvbWV0aGluZyB3ZW50IHdyb25nICovCisJCVRSQUNFX1JFVChjaGlwLCBzdGF0dXMpOworCX0KKworCS8qIHNpbmNlIHRoZSBVUkIgaGFzIGJlZW4gc3VibWl0dGVkIHN1Y2Nlc3NmdWxseSwgaXQncyBub3cgb2theQorCSAqIHRvIGNhbmNlbCBpdCAqLworCXNldF9iaXQoRkxJRFhfVVJCX0FDVElWRSwgJnJ0czUxeC0+ZGZsYWdzKTsKKworCS8qIGRpZCBhbiBhYm9ydCBvY2N1ciBkdXJpbmcgdGhlIHN1Ym1pc3Npb24/ICovCisJaWYgKHRlc3RfYml0KEZMSURYX0FCT1JUSU5HLCAmcnRzNTF4LT5kZmxhZ3MpKSB7CisKKwkJLyogY2FuY2VsIHRoZSBVUkIsIGlmIGl0IGhhc24ndCBiZWVuIGNhbmNlbGxlZCBhbHJlYWR5ICovCisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRkxJRFhfVVJCX0FDVElWRSwgJnJ0czUxeC0+ZGZsYWdzKSkgeworCQkJUlRTNTFYX0RFQlVHUCgiLS0gY2FuY2VsbGluZyBVUkJcbiIpOworCQkJdXNiX3VubGlua191cmIodXJiKTsKKwkJfQorCX0KKworCS8qIHdhaXQgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBVUkIgKi8KKwl0aW1lbGVmdCA9CisJICAgIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0KCZ1cmJfZG9uZSwKKwkJCQkJCSAgICAgICh0aW1lb3V0ICogSFogLworCQkJCQkJICAgICAgIDEwMDApID8gOgorCQkJCQkJICAgICAgTUFYX1NDSEVEVUxFX1RJTUVPVVQpOworCisJY2xlYXJfYml0KEZMSURYX1VSQl9BQ1RJVkUsICZydHM1MXgtPmRmbGFncyk7CisKKwlpZiAodGltZWxlZnQgPD0gMCkgeworCQlSVFM1MVhfREVCVUdQKCIlcyAtLSBjYW5jZWxsaW5nIFVSQlxuIiwKKwkJCSAgICAgICB0aW1lbGVmdCA9PSAwID8gIlRpbWVvdXQiIDogIlNpZ25hbCIpOworCQl1c2Jfa2lsbF91cmIodXJiKTsKKwkJaWYgKHRpbWVsZWZ0ID09IDApCisJCQlzdGF0dXMgPSAtRVRJTUVET1VUOworCQllbHNlCisJCQlzdGF0dXMgPSAtRUlOVFI7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gdXJiLT5zdGF0dXM7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEludGVycHJldCB0aGUgcmVzdWx0cyBvZiBhIFVSQiB0cmFuc2ZlcgorICovCitzdGF0aWMgaW50IGludGVycHJldF91cmJfcmVzdWx0KHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IHBpcGUsCisJCQkJdW5zaWduZWQgaW50IGxlbmd0aCwgaW50IHJlc3VsdCwKKwkJCQl1bnNpZ25lZCBpbnQgcGFydGlhbCkKK3sKKwlpbnQgcmV0dmFsID0gU1RBVFVTX1NVQ0NFU1M7CisKKwkvKiBSVFM1MVhfREVCVUdQKCJTdGF0dXMgY29kZSAlZDsgdHJhbnNmZXJyZWQgJXUvJXVcbiIsCisJCQkJcmVzdWx0LCBwYXJ0aWFsLCBsZW5ndGgpOyAqLworCXN3aXRjaCAocmVzdWx0KSB7CisJCS8qIG5vIGVycm9yIGNvZGU7IGRpZCB3ZSBzZW5kIGFsbCB0aGUgZGF0YT8gKi8KKwljYXNlIDA6CisJCWlmIChwYXJ0aWFsICE9IGxlbmd0aCkgeworCQkJUlRTNTFYX0RFQlVHUCgiLS0gc2hvcnQgdHJhbnNmZXJcbiIpOworCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19UUkFOU19TSE9SVCk7CisJCX0KKwkJLyogUlRTNTFYX0RFQlVHUCgiLS0gdHJhbnNmZXIgY29tcGxldGVcbiIpOyAqLworCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CisJCS8qIHN0YWxsZWQgKi8KKwljYXNlIC1FUElQRToKKwkJLyogZm9yIGNvbnRyb2wgZW5kcG9pbnRzLCAodXNlZCBieSBDQltJXSkgYSBzdGFsbCBpbmRpY2F0ZXMKKwkJICogYSBmYWlsZWQgY29tbWFuZCAqLworCQlpZiAodXNiX3BpcGVjb250cm9sKHBpcGUpKSB7CisJCQlSVFM1MVhfREVCVUdQKCItLSBzdGFsbCBvbiBjb250cm9sIHBpcGVcbiIpOworCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19TVEFMTEVEKTsKKwkJfQorCQkvKiBmb3Igb3RoZXIgc29ydHMgb2YgZW5kcG9pbnQsIGNsZWFyIHRoZSBzdGFsbCAqLworCQlSVFM1MVhfREVCVUdQKCJjbGVhcmluZyBlbmRwb2ludCBoYWx0IGZvciBwaXBlIDB4JXhcbiIsIHBpcGUpOworCQlpZiAocnRzNTF4X2NsZWFyX2hhbHQoY2hpcCwgcGlwZSkgPCAwKQorCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19FUlJPUik7CisJCXJldHZhbCA9IFNUQVRVU19TVEFMTEVEOworCQlUUkFDRV9HT1RPKGNoaXAsIEV4aXQpOworCisJCS8qIGJhYmJsZSAtIHRoZSBkZXZpY2UgdHJpZWQgdG8gc2VuZCBtb3JlIHRoYW4KKwkJICogd2Ugd2FudGVkIHRvIHJlYWQgKi8KKwljYXNlIC1FT1ZFUkZMT1c6CisJCVJUUzUxWF9ERUJVR1AoIi0tIGJhYmJsZVxuIik7CisJCXJldHZhbCA9IFNUQVRVU19UUkFOU19MT05HOworCQlUUkFDRV9HT1RPKGNoaXAsIEV4aXQpOworCisJCS8qIHRoZSB0cmFuc2ZlciB3YXMgY2FuY2VsbGVkIGJ5IGFib3J0LAorCQkgKiBkaXNjb25uZWN0LCBvciB0aW1lb3V0ICovCisJY2FzZSAtRUNPTk5SRVNFVDoKKwkJUlRTNTFYX0RFQlVHUCgiLS0gdHJhbnNmZXIgY2FuY2VsbGVkXG4iKTsKKwkJcmV0dmFsID0gU1RBVFVTX0VSUk9SOworCQlUUkFDRV9HT1RPKGNoaXAsIEV4aXQpOworCisJCS8qIHNob3J0IHNjYXR0ZXItZ2F0aGVyIHJlYWQgdHJhbnNmZXIgKi8KKwljYXNlIC1FUkVNT1RFSU86CisJCVJUUzUxWF9ERUJVR1AoIi0tIHNob3J0IHJlYWQgdHJhbnNmZXJcbiIpOworCQlyZXR2YWwgPSBTVEFUVVNfVFJBTlNfU0hPUlQ7CisJCVRSQUNFX0dPVE8oY2hpcCwgRXhpdCk7CisKKwkJLyogYWJvcnQgb3IgZGlzY29ubmVjdCBpbiBwcm9ncmVzcyAqLworCWNhc2UgLUVJTzoKKwkJUlRTNTFYX0RFQlVHUCgiLS0gYWJvcnQgb3IgZGlzY29ubmVjdCBpbiBwcm9ncmVzc1xuIik7CisJCXJldHZhbCA9IFNUQVRVU19FUlJPUjsKKwkJVFJBQ0VfR09UTyhjaGlwLCBFeGl0KTsKKworCWNhc2UgLUVUSU1FRE9VVDoKKwkJUlRTNTFYX0RFQlVHUCgiLS0gdGltZSBvdXRcbiIpOworCQlyZXR2YWwgPSBTVEFUVVNfVElNRURPVVQ7CisJCVRSQUNFX0dPVE8oY2hpcCwgRXhpdCk7CisKKwkJLyogdGhlIGNhdGNoLWFsbCBlcnJvciBjYXNlICovCisJZGVmYXVsdDoKKwkJUlRTNTFYX0RFQlVHUCgiLS0gdW5rbm93biBlcnJvclxuIik7CisJCXJldHZhbCA9IFNUQVRVU19FUlJPUjsKKwkJVFJBQ0VfR09UTyhjaGlwLCBFeGl0KTsKKwl9CisKK0V4aXQ6CisJaWYgKChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpICYmICF1c2JfcGlwZWNvbnRyb2wocGlwZSkpCisJCXJ0czUxeF9jbGVhcl9od19lcnJvcihjaGlwKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBydHM1MXhfY3RybF90cmFuc2ZlcihzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBwaXBlLAorCQkJIHU4IHJlcXVlc3QsIHU4IHJlcXVlc3R0eXBlLCB1MTYgdmFsdWUsIHUxNiBpbmRleCwKKwkJCSB2b2lkICpkYXRhLCB1MTYgc2l6ZSwgaW50IHRpbWVvdXQpCit7CisJc3RydWN0IHJ0czUxeF91c2IgKnJ0czUxeCA9IGNoaXAtPnVzYjsKKwlpbnQgcmVzdWx0OworCisJUlRTNTFYX0RFQlVHUCgiJXM6IHJxPSUwMnggcnF0eXBlPSUwMnggdmFsdWU9JTA0eCBpbmRleD0lMDJ4IGxlbj0ldVxuIiwKKwkJICAgICAgIF9fZnVuY19fLCByZXF1ZXN0LCByZXF1ZXN0dHlwZSwgdmFsdWUsIGluZGV4LCBzaXplKTsKKworCS8qIGZpbGwgaW4gdGhlIGRldnJlcXVlc3Qgc3RydWN0dXJlICovCisJcnRzNTF4LT5jci0+YlJlcXVlc3RUeXBlID0gcmVxdWVzdHR5cGU7CisJcnRzNTF4LT5jci0+YlJlcXVlc3QgPSByZXF1ZXN0OworCXJ0czUxeC0+Y3ItPndWYWx1ZSA9IGNwdV90b19sZTE2KHZhbHVlKTsKKwlydHM1MXgtPmNyLT53SW5kZXggPSBjcHVfdG9fbGUxNihpbmRleCk7CisJcnRzNTF4LT5jci0+d0xlbmd0aCA9IGNwdV90b19sZTE2KHNpemUpOworCisJLyogZmlsbCBhbmQgc3VibWl0IHRoZSBVUkIgKi8KKwl1c2JfZmlsbF9jb250cm9sX3VyYihydHM1MXgtPmN1cnJlbnRfdXJiLCBydHM1MXgtPnB1c2JfZGV2LCBwaXBlLAorCQkJICAgICAodW5zaWduZWQgY2hhciAqKXJ0czUxeC0+Y3IsIGRhdGEsIHNpemUsCisJCQkgICAgIHVyYl9kb25lX2NvbXBsZXRpb24sIE5VTEwpOworCXJlc3VsdCA9IHJ0czUxeF9tc2dfY29tbW9uKGNoaXAsIHJ0czUxeC0+Y3VycmVudF91cmIsIHRpbWVvdXQpOworCisJcmV0dXJuIGludGVycHJldF91cmJfcmVzdWx0KGNoaXAsIHBpcGUsIHNpemUsIHJlc3VsdCwKKwkJCQkgICAgcnRzNTF4LT5jdXJyZW50X3VyYi0+YWN0dWFsX2xlbmd0aCk7Cit9CisKK2ludCBydHM1MXhfY2xlYXJfaGFsdChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBwaXBlKQoreworCWludCByZXN1bHQ7CisJaW50IGVuZHAgPSB1c2JfcGlwZWVuZHBvaW50KHBpcGUpOworCisJaWYgKHVzYl9waXBlaW4ocGlwZSkpCisJCWVuZHAgfD0gVVNCX0RJUl9JTjsKKworCXJlc3VsdCA9IHJ0czUxeF9jdHJsX3RyYW5zZmVyKGNoaXAsIFNORF9DVFJMX1BJUEUoY2hpcCksCisJCQkJICAgICAgVVNCX1JFUV9DTEVBUl9GRUFUVVJFLCBVU0JfUkVDSVBfRU5EUE9JTlQsCisJCQkJICAgICAgVVNCX0VORFBPSU5UX0hBTFQsIGVuZHAsIE5VTEwsIDAsIDMwMDApOworCWlmIChyZXN1bHQgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwl1c2JfcmVzZXRfZW5kcG9pbnQoY2hpcC0+dXNiLT5wdXNiX2RldiwgZW5kcCk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2ludCBydHM1MXhfcmVzZXRfcGlwZShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIGNoYXIgcGlwZSkKK3sKKwlyZXR1cm4gcnRzNTF4X2NsZWFyX2hhbHQoY2hpcCwgcGlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJ0czUxeF9zZ19jbGVhbihzdHJ1Y3QgdXNiX3NnX3JlcXVlc3QgKmlvKQoreworCWlmIChpby0+dXJicykgeworCQl3aGlsZSAoaW8tPmVudHJpZXMtLSkKKwkJCXVzYl9mcmVlX3VyYihpby0+dXJic1tpby0+ZW50cmllc10pOworCQlrZnJlZShpby0+dXJicyk7CisJCWlvLT51cmJzID0gTlVMTDsKKwl9CisjaWYgMCAvKiBMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLCA2LCAzNSkgKi8KKwlpZiAoaW8tPmRldi0+ZGV2LmRtYV9tYXNrICE9IE5VTEwpCisJCXVzYl9idWZmZXJfdW5tYXBfc2coaW8tPmRldiwgdXNiX3BpcGVpbihpby0+cGlwZSksCisJCQkJICAgIGlvLT5zZywgaW8tPm5lbnRzKTsKKyNlbmRpZgorCWlvLT5kZXYgPSBOVUxMOworfQorI2lmIDAKK3N0YXRpYyB2b2lkIHJ0czUxeF9zZ19jb21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHVzYl9zZ19yZXF1ZXN0ICppbyA9IHVyYi0+Y29udGV4dDsKKwlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CisKKwlzcGluX2xvY2soJmlvLT5sb2NrKTsKKworCS8qIEluIDIuNSB3ZSByZXF1aXJlIGhjZHMnIGVuZHBvaW50IHF1ZXVlcyBub3QgdG8gcHJvZ3Jlc3MgYWZ0ZXIgZmF1bHQKKwkqIHJlcG9ydHMsIHVudGlsIHRoZSBjb21wbGV0aW9uIGNhbGxiYWNrICh0aGlzISkgcmV0dXJucy4gIFRoYXQgbGV0cworCSogZGV2aWNlIGRyaXZlciBjb2RlIChsaWtlIHRoaXMgcm91dGluZSkgdW5saW5rIHF1ZXVlZCB1cmJzIGZpcnN0LAorCSogaWYgaXQgbmVlZHMgdG8sIHNpbmNlIHRoZSBIQyB3b24ndCB3b3JrIG9uIHRoZW0gYXQgYWxsLiAgU28gaXQncworCSogbm90IHBvc3NpYmxlIGZvciBwYWdlIE4rMSB0byBvdmVyd3JpdGUgcGFnZSBOLCBhbmQgc28gb24uCisJKgorCSogVGhhdCdzIG9ubHkgZm9yICJoYXJkIiBmYXVsdHM7ICJzb2Z0IiBmYXVsdHMgKHVubGlua3MpIHNvbWV0aW1lcworCSogY29tcGxldGUgYmVmb3JlIHRoZSBIQ0QgY2FuIGdldCByZXF1ZXN0cyBhd2F5IGZyb20gaGFyZHdhcmUsCisJKiB0aG91Z2ggbmV2ZXIgZHVyaW5nIGNsZWFudXAgYWZ0ZXIgYSBoYXJkIGZhdWx0LgorCSovCisJaWYgKGlvLT5zdGF0dXMKKwkJJiYgKGlvLT5zdGF0dXMgIT0gLUVDT05OUkVTRVQKKwkJfHwgc3RhdHVzICE9IC1FQ09OTlJFU0VUKQorCQkmJiB1cmItPmFjdHVhbF9sZW5ndGgpIHsKKwkJCWRldl9lcnIoaW8tPmRldi0+YnVzLT5jb250cm9sbGVyLAorCQkJCSJkZXYgJXMgZXAlZCVzIHNjYXR0ZXJsaXN0IGVycm9yICVkLyVkXG4iLAorCQkJCWlvLT5kZXYtPmRldnBhdGgsCisJCQkJdXNiX2VuZHBvaW50X251bSgmdXJiLT5lcC0+ZGVzYyksCisJCQkJdXNiX3VyYl9kaXJfaW4odXJiKSA/ICJpbiIgOiAib3V0IiwKKwkJCQlzdGF0dXMsIGlvLT5zdGF0dXMpOworCQkJLyogQlVHICgpOyAqLworCX0KKworCWlmIChpby0+c3RhdHVzID09IDAgJiYgc3RhdHVzICYmIHN0YXR1cyAhPSAtRUNPTk5SRVNFVCkgeworCQlpbnQgaSwgZm91bmQsIHJldHZhbDsKKworCQlpby0+c3RhdHVzID0gc3RhdHVzOworCisJCS8qIHRoZSBwcmV2aW91cyB1cmJzLCBhbmQgdGhpcyBvbmUsIGNvbXBsZXRlZCBhbHJlYWR5LgorCQkqIHVubGluayBwZW5kaW5nIHVyYnMgc28gdGhleSB3b24ndCByeC90eCBiYWQgZGF0YS4KKwkJKiBjYXJlZnVsOiB1bmxpbmsgY2FuIHNvbWV0aW1lcyBiZSBzeW5jaHJvbm91cy4uLgorCQkqLworCQlzcGluX3VubG9jaygmaW8tPmxvY2spOworCQlmb3IgKGkgPSAwLCBmb3VuZCA9IDA7IGkgPCBpby0+ZW50cmllczsgaSsrKSB7CisJCQlpZiAoIWlvLT51cmJzW2ldIHx8ICFpby0+dXJic1tpXS0+ZGV2KQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGZvdW5kKSB7CisJCQkJcmV0dmFsID0gdXNiX3VubGlua191cmIoaW8tPnVyYnNbaV0pOworCQkJCWlmIChyZXR2YWwgIT0gLUVJTlBST0dSRVNTICYmCisJCQkJCXJldHZhbCAhPSAtRU5PREVWICYmCisJCQkJCXJldHZhbCAhPSAtRUJVU1kpCisJCQkJCWRldl9lcnIoJmlvLT5kZXYtPmRldiwKKwkJCQkJCSIlcywgdW5saW5rIC0tPiAlZFxuIiwKKwkJCQkJCV9fZnVuY19fLCByZXR2YWwpOworCQkJfSBlbHNlIGlmICh1cmIgPT0gaW8tPnVyYnNbaV0pCisJCQkJZm91bmQgPSAxOworCQl9CisJCXNwaW5fbG9jaygmaW8tPmxvY2spOworCX0KKwl1cmItPmRldiA9IE5VTEw7CisKKwkvKiBvbiB0aGUgbGFzdCBjb21wbGV0aW9uLCBzaWduYWwgdXNiX3NnX3dhaXQoKSAqLworCWlvLT5ieXRlcyArPSB1cmItPmFjdHVhbF9sZW5ndGg7CisJaW8tPmNvdW50LS07CisJaWYgKCFpby0+Y291bnQpCisJCWNvbXBsZXRlKCZpby0+Y29tcGxldGUpOworCisJc3Bpbl91bmxvY2soJmlvLT5sb2NrKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBwb3J0ZWQgZnJvbSB1c2Jfc2dfaW5pdCwgd2hpY2ggY2FuIHRyYW5zZmVyCisgKiBzZyBsaXN0IHBhcnRpYWxseSAqLworaW50IHJ0czUxeF9zZ19pbml0X3BhcnRpYWwoc3RydWN0IHVzYl9zZ19yZXF1ZXN0ICppbywgc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKKwl1bnNpZ25lZCBwaXBlLCB1bnNpZ25lZCBwZXJpb2QsIHZvaWQgKmJ1Ziwgc3RydWN0IHNjYXR0ZXJsaXN0ICoqc2dwdHIsCisJdW5zaWduZWQgaW50ICpvZmZzZXQsIGludCBuZW50cywgc2l6ZV90IGxlbmd0aCwgZ2ZwX3QgbWVtX2ZsYWdzKQoreworCWludCBpOworCWludCB1cmJfZmxhZ3M7CisJaW50IGRtYTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gKnNncHRyLCAqZmlyc3Rfc2c7CisKKwlmaXJzdF9zZyA9IChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKilidWY7CisJaWYgKCFzZykKKwkJc2cgPSBmaXJzdF9zZzsKKworCWlmICghaW8gfHwgIWRldiB8fCAhc2cKKwkJfHwgdXNiX3BpcGVjb250cm9sKHBpcGUpCisJCXx8IHVzYl9waXBlaXNvYyhwaXBlKQorCQl8fCAobmVudHMgPD0gMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2luaXQoJmlvLT5sb2NrKTsKKwlpby0+ZGV2ID0gZGV2OworCWlvLT5waXBlID0gcGlwZTsKKwlpby0+c2cgPSBmaXJzdF9zZzsgIC8qIHVzZWQgYnkgdW5tYXAgKi8KKwlpby0+bmVudHMgPSBuZW50czsKKworCVJUUzUxWF9ERUJVR1AoIkJlZm9yZSBtYXAsIHNnIGFkZHJlc3M6IDB4JXhcbiIsICh1bnNpZ25lZCBpbnQpc2cpOworCVJUUzUxWF9ERUJVR1AoIkJlZm9yZSBtYXAsIGRldiBhZGRyZXNzOiAweCV4XG4iLCAodW5zaWduZWQgaW50KWRldik7CisKKwkvKiBub3QgYWxsIGhvc3QgY29udHJvbGxlcnMgdXNlIERNQSAobGlrZSB0aGUgbWFpbnN0cmVhbSBwY2kgb25lcyk7CisJKiB0aGV5IGNhbiB1c2UgUElPIChzbDgxMSkgb3IgYmUgc29mdHdhcmUgb3ZlciBhbm90aGVyIHRyYW5zcG9ydC4KKwkqLworCWRtYSA9IChkZXYtPmRldi5kbWFfbWFzayAhPSBOVUxMKTsKKwlpZiAoZG1hKSB7CisJCS8qIG1hcCB0aGUgd2hvbGUgc2cgbGlzdCwgYmVjYXVzZSBoZXJlIHdlIG9ubHkga25vdyB0aGUKKwkJICogdG90YWwgbmVudHMgKi8KKwkJaW8tPmVudHJpZXMgPSB1c2JfYnVmZmVyX21hcF9zZyhkZXYsIHVzYl9waXBlaW4ocGlwZSksCisJCWZpcnN0X3NnLCBuZW50cyk7CisJfSBlbHNlIHsKKwkJaW8tPmVudHJpZXMgPSBuZW50czsKKwl9CisKKwkvKiBpbml0aWFsaXplIGFsbCB0aGUgdXJicyB3ZSdsbCB1c2UgKi8KKwlpZiAoaW8tPmVudHJpZXMgPD0gMCkKKwkJcmV0dXJuIGlvLT5lbnRyaWVzOworCisJaW8tPnVyYnMgPSBrbWFsbG9jKGlvLT5lbnRyaWVzICogc2l6ZW9mICppby0+dXJicywgbWVtX2ZsYWdzKTsKKwlpZiAoIWlvLT51cmJzKQorCQlnb3RvIG5vbWVtOworCisJdXJiX2ZsYWdzID0gVVJCX05PX0lOVEVSUlVQVDsKKwlpZiAoZG1hKQorCQl1cmJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisJaWYgKHVzYl9waXBlaW4ocGlwZSkpCisJCXVyYl9mbGFncyB8PSBVUkJfU0hPUlRfTk9UX09LOworCisJUlRTNTFYX0RFQlVHUCgiaW8tPmVudHJpZXMgPSAlZFxuIiwgaW8tPmVudHJpZXMpOworCisJZm9yIChpID0gMDsgKHNnICE9IE5VTEwpICYmIChsZW5ndGggPiAwKTsgaSsrKSB7CisJCXVuc2lnbmVkIGxlbjsKKworCQlSVFM1MVhfREVCVUdQKCJzZyBhZGRyZXNzOiAweCV4XG4iLCAodW5zaWduZWQgaW50KXNnKTsKKwkJUlRTNTFYX0RFQlVHUCgibGVuZ3RoID0gJWQsICpvZmZzZXQgPSAlZFxuIiwgbGVuZ3RoLCAqb2Zmc2V0KTsKKworCQlpby0+dXJic1tpXSA9IHVzYl9hbGxvY191cmIoMCwgbWVtX2ZsYWdzKTsKKwkJaWYgKCFpby0+dXJic1tpXSkgeworCQkJaW8tPmVudHJpZXMgPSBpOworCQkJZ290byBub21lbTsKKwkJfQorCisJCWlvLT51cmJzW2ldLT5kZXYgPSBOVUxMOworCQlpby0+dXJic1tpXS0+cGlwZSA9IHBpcGU7CisJCWlvLT51cmJzW2ldLT5pbnRlcnZhbCA9IHBlcmlvZDsKKwkJaW8tPnVyYnNbaV0tPnRyYW5zZmVyX2ZsYWdzID0gdXJiX2ZsYWdzOworCisJCWlvLT51cmJzW2ldLT5jb21wbGV0ZSA9IHJ0czUxeF9zZ19jb21wbGV0ZTsKKwkJaW8tPnVyYnNbaV0tPmNvbnRleHQgPSBpbzsKKworCQlpZiAoZG1hKSB7CisJCQlpby0+dXJic1tpXS0+dHJhbnNmZXJfZG1hID0KKwkJCQlzZ19kbWFfYWRkcmVzcyhzZykgKyAqb2Zmc2V0OworCQkJbGVuID0gc2dfZG1hX2xlbihzZykgLSAqb2Zmc2V0OworCQkJaW8tPnVyYnNbaV0tPnRyYW5zZmVyX2J1ZmZlciA9IE5VTEw7CisJCQlSVFM1MVhfREVCVUdQKCIgLS0gc2cgZW50cnkgZG1hIGxlbmd0aCA9ICVkXG4iLAorCQkJCQkJc2dfZG1hX2xlbihzZykpOworCQl9IGVsc2UgeworCQkJLyogaGMgbWF5IHVzZSBfb25seV8gdHJhbnNmZXJfYnVmZmVyICovCisJCQlpby0+dXJic1tpXS0+dHJhbnNmZXJfYnVmZmVyID0gc2dfdmlydChzZykgKyAqb2Zmc2V0OworCQkJbGVuID0gc2ctPmxlbmd0aCAtICpvZmZzZXQ7CisJCQlSVFM1MVhfREVCVUdQKCIgLS0gc2cgZW50cnkgbGVuZ3RoID0gJWRcbiIsCisJCQkJCQlzZy0+bGVuZ3RoKTsKKwkJfQorCisJCWlmIChsZW5ndGggPj0gbGVuKSB7CisJCQkqb2Zmc2V0ID0gMDsKKwkJCWlvLT51cmJzW2ldLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gbGVuOworCQkJbGVuZ3RoIC09IGxlbjsKKwkJCXNnID0gc2dfbmV4dChzZyk7CisJCX0gZWxzZSB7CisJCQkqb2Zmc2V0ICs9IGxlbmd0aDsKKwkJCWlvLT51cmJzW2ldLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gbGVuZ3RoOworCQkJbGVuZ3RoID0gMDsKKwkJfQorCQlpZiAobGVuZ3RoID09IDApCisJCQlpby0+ZW50cmllcyA9IGkgKyAxOworI2lmIDAKKwkJaWYgKGxlbmd0aCkgeworCQkJbGVuID0gbWluX3QodW5zaWduZWQsIGxlbiwgbGVuZ3RoKTsKKwkJCWxlbmd0aCAtPSBsZW47CisJCQlpZiAobGVuZ3RoID09IDApIHsKKwkJCQlpby0+ZW50cmllcyA9IGkgKyAxOworCQkJCSpvZmZzZXQgKz0gbGVuOworCQkJfSBlbHNlIHsKKwkJCQkqb2Zmc2V0ID0gMDsKKwkJCX0KKwkJfQorI2VuZGlmCisJfQorCVJUUzUxWF9ERUJVR1AoIkluICVzLCB1cmIgY291bnQ6ICVkXG4iLCBfX2Z1bmNfXywgaSk7CisJaW8tPnVyYnNbLS1pXS0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9OT19JTlRFUlJVUFQ7CisKKwlSVFM1MVhfREVCVUdQKCJzZyBhZGRyZXNzIHN0b3JlZCBpbiBzZ3B0cjogMHgleFxuIiwgKHVuc2lnbmVkIGludClzZyk7CisJKnNncHRyID0gc2c7CisKKwkvKiB0cmFuc2FjdGlvbiBzdGF0ZSAqLworCWlvLT5jb3VudCA9IGlvLT5lbnRyaWVzOworCWlvLT5zdGF0dXMgPSAwOworCWlvLT5ieXRlcyA9IDA7CisJaW5pdF9jb21wbGV0aW9uKCZpby0+Y29tcGxldGUpOworCXJldHVybiAwOworCitub21lbToKKwlydHM1MXhfc2dfY2xlYW4oaW8pOworCXJldHVybiAtRU5PTUVNOworfQorI2VuZGlmCitpbnQgcnRzNTF4X3NnX2luaXQoc3RydWN0IHVzYl9zZ19yZXF1ZXN0ICppbywgc3RydWN0IHVzYl9kZXZpY2UgKmRldiwKKwkJICAgdW5zaWduZWQgcGlwZSwgdW5zaWduZWQgcGVyaW9kLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAorCQkgICBpbnQgbmVudHMsIHNpemVfdCBsZW5ndGgsIGdmcF90IG1lbV9mbGFncykKK3sKKwlyZXR1cm4gdXNiX3NnX2luaXQoaW8sIGRldiwgcGlwZSwgcGVyaW9kLCBzZywgbmVudHMsIGxlbmd0aCwgbWVtX2ZsYWdzKTsKK30KKworaW50IHJ0czUxeF9zZ193YWl0KHN0cnVjdCB1c2Jfc2dfcmVxdWVzdCAqaW8sIGludCB0aW1lb3V0KQoreworCWxvbmcgdGltZWxlZnQ7CisJaW50IGk7CisJaW50IGVudHJpZXMgPSBpby0+ZW50cmllczsKKworCS8qIHF1ZXVlIHRoZSB1cmJzLiAgKi8KKwlzcGluX2xvY2tfaXJxKCZpby0+bG9jayk7CisJaSA9IDA7CisJd2hpbGUgKGkgPCBlbnRyaWVzICYmICFpby0+c3RhdHVzKSB7CisJCWludCByZXR2YWw7CisKKwkJaW8tPnVyYnNbaV0tPmRldiA9IGlvLT5kZXY7CisJCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKGlvLT51cmJzW2ldLCBHRlBfQVRPTUlDKTsKKworCQkvKiBhZnRlciB3ZSBzdWJtaXQsIGxldCBjb21wbGV0aW9ucyBvciBjYW5jZWxhdGlvbnMgZmlyZTsKKwkJICogd2UgaGFuZHNoYWtlIHVzaW5nIGlvLT5zdGF0dXMuCisJCSAqLworCQlzcGluX3VubG9ja19pcnEoJmlvLT5sb2NrKTsKKwkJc3dpdGNoIChyZXR2YWwpIHsKKwkJCS8qIG1heWJlIHdlIHJldHJ5aW5nIHdpbGwgcmVjb3ZlciAqLworCQljYXNlIC1FTlhJTzoJLyogaGMgZGlkbid0IHF1ZXVlIHRoaXMgb25lICovCisJCWNhc2UgLUVBR0FJTjoKKwkJY2FzZSAtRU5PTUVNOgorCQkJaW8tPnVyYnNbaV0tPmRldiA9IE5VTEw7CisJCQlyZXR2YWwgPSAwOworCQkJeWllbGQoKTsKKwkJCWJyZWFrOworCisJCQkvKiBubyBlcnJvcj8gY29udGludWUgaW1tZWRpYXRlbHkuCisJCQkgKgorCQkJICogTk9URTogdG8gd29yayBiZXR0ZXIgd2l0aCBVSENJICg0SyBJL08gYnVmZmVyIG1heQorCQkJICogbmVlZCAzSyBvZiBURHMpIGl0IG1heSBiZSBnb29kIHRvIGxpbWl0IGhvdyBtYW55CisJCQkgKiBVUkJzIGFyZSBxdWV1ZWQgYXQgb25jZTsgTiBtaWxsaXNlY29uZHM/CisJCQkgKi8KKwkJY2FzZSAwOgorCQkJKytpOworCQkJY3B1X3JlbGF4KCk7CisJCQlicmVhazsKKworCQkJLyogZmFpbCBhbnkgdW5jb21wbGV0ZWQgdXJicyAqLworCQlkZWZhdWx0OgorCQkJaW8tPnVyYnNbaV0tPmRldiA9IE5VTEw7CisJCQlpby0+dXJic1tpXS0+c3RhdHVzID0gcmV0dmFsOworCQkJZGV2X2RiZygmaW8tPmRldi0+ZGV2LCAiJXMsIHN1Ym1pdCAtLT4gJWRcbiIsCisJCQkJX19mdW5jX18sIHJldHZhbCk7CisJCQl1c2Jfc2dfY2FuY2VsKGlvKTsKKwkJfQorCQlzcGluX2xvY2tfaXJxKCZpby0+bG9jayk7CisJCWlmIChyZXR2YWwgJiYgKGlvLT5zdGF0dXMgPT0gMCB8fCBpby0+c3RhdHVzID09IC1FQ09OTlJFU0VUKSkKKwkJCWlvLT5zdGF0dXMgPSByZXR2YWw7CisJfQorCWlvLT5jb3VudCAtPSBlbnRyaWVzIC0gaTsKKwlpZiAoaW8tPmNvdW50ID09IDApCisJCWNvbXBsZXRlKCZpby0+Y29tcGxldGUpOworCXNwaW5fdW5sb2NrX2lycSgmaW8tPmxvY2spOworCisJdGltZWxlZnQgPQorCSAgICB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmaW8tPmNvbXBsZXRlLAorCQkJCQkJICAgICAgKHRpbWVvdXQgKiBIWiAvCisJCQkJCQkgICAgICAgMTAwMCkgPyA6CisJCQkJCQkgICAgICBNQVhfU0NIRURVTEVfVElNRU9VVCk7CisJaWYgKHRpbWVsZWZ0IDw9IDApIHsKKwkJUlRTNTFYX0RFQlVHUCgiJXMgLS0gY2FuY2VsbGluZyBTRyByZXF1ZXN0XG4iLAorCQkJICAgICAgIHRpbWVsZWZ0ID09IDAgPyAiVGltZW91dCIgOiAiU2lnbmFsIik7CisJCXVzYl9zZ19jYW5jZWwoaW8pOworCQlpZiAodGltZWxlZnQgPT0gMCkKKwkJCWlvLT5zdGF0dXMgPSAtRVRJTUVET1VUOworCQllbHNlCisJCQlpby0+c3RhdHVzID0gLUVJTlRSOworCX0KKworCXJ0czUxeF9zZ19jbGVhbihpbyk7CisJcmV0dXJuIGlvLT5zdGF0dXM7Cit9CisKKy8qCisgKiBUcmFuc2ZlciBhIHNjYXR0ZXItZ2F0aGVyIGxpc3QgdmlhIGJ1bGsgdHJhbnNmZXIKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgYmFzaWNhbGx5IHRoZSBzYW1lIHRoaW5nIGFzIHVzYl9zdG9yX2J1bGtfdHJhbnNmZXJfYnVmKCkKKyAqIGFib3ZlLCBidXQgaXQgdXNlcyB0aGUgdXNiY29yZSBzY2F0dGVyLWdhdGhlciBsaWJyYXJ5LgorICovCitzdGF0aWMgaW50IHJ0czUxeF9idWxrX3RyYW5zZmVyX3NnbGlzdChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBwaXBlLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbnVtX3NnLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmFjdF9sZW4sIGludCB0aW1lb3V0KQoreworCWludCByZXN1bHQ7CisKKwkvKiBkb24ndCBzdWJtaXQgcy1nIHJlcXVlc3RzIGR1cmluZyBhYm9ydCBwcm9jZXNzaW5nICovCisJaWYgKHRlc3RfYml0KEZMSURYX0FCT1JUSU5HLCAmY2hpcC0+dXNiLT5kZmxhZ3MpKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0VSUk9SKTsKKworCS8qIGluaXRpYWxpemUgdGhlIHNjYXR0ZXItZ2F0aGVyIHJlcXVlc3QgYmxvY2sgKi8KKwlSVFM1MVhfREVCVUdQKCIlczogeGZlciAldSBieXRlcywgJWQgZW50cmllc1xuIiwgX19mdW5jX18sCisJCSAgICAgICBsZW5ndGgsIG51bV9zZyk7CisJcmVzdWx0ID0KKwkgICAgcnRzNTF4X3NnX2luaXQoJmNoaXAtPnVzYi0+Y3VycmVudF9zZywgY2hpcC0+dXNiLT5wdXNiX2RldiwgcGlwZSwgMCwKKwkJCSAgIHNnLCBudW1fc2csIGxlbmd0aCwgR0ZQX05PSU8pOworCWlmIChyZXN1bHQpIHsKKwkJUlRTNTFYX0RFQlVHUCgicnRzNTF4X3NnX2luaXQgcmV0dXJuZWQgJWRcbiIsIHJlc3VsdCk7CisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRVJST1IpOworCX0KKworCS8qIHNpbmNlIHRoZSBibG9jayBoYXMgYmVlbiBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHksIGl0J3Mgbm93CisJICogb2theSB0byBjYW5jZWwgaXQgKi8KKwlzZXRfYml0KEZMSURYX1NHX0FDVElWRSwgJmNoaXAtPnVzYi0+ZGZsYWdzKTsKKworCS8qIGRpZCBhbiBhYm9ydCBvY2N1ciBkdXJpbmcgdGhlIHN1Ym1pc3Npb24/ICovCisJaWYgKHRlc3RfYml0KEZMSURYX0FCT1JUSU5HLCAmY2hpcC0+dXNiLT5kZmxhZ3MpKSB7CisKKwkJLyogY2FuY2VsIHRoZSByZXF1ZXN0LCBpZiBpdCBoYXNuJ3QgYmVlbiBjYW5jZWxsZWQgYWxyZWFkeSAqLworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEZMSURYX1NHX0FDVElWRSwgJmNoaXAtPnVzYi0+ZGZsYWdzKSkgeworCQkJUlRTNTFYX0RFQlVHUCgiLS0gY2FuY2VsbGluZyBzZyByZXF1ZXN0XG4iKTsKKwkJCXVzYl9zZ19jYW5jZWwoJmNoaXAtPnVzYi0+Y3VycmVudF9zZyk7CisJCX0KKwl9CisKKwkvKiB3YWl0IGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgdHJhbnNmZXIgKi8KKwlyZXN1bHQgPSBydHM1MXhfc2dfd2FpdCgmY2hpcC0+dXNiLT5jdXJyZW50X3NnLCB0aW1lb3V0KTsKKworCWNsZWFyX2JpdChGTElEWF9TR19BQ1RJVkUsICZjaGlwLT51c2ItPmRmbGFncyk7CisKKwkvKiByZXN1bHQgPSB1cy0+Y3VycmVudF9zZy5zdGF0dXM7ICovCisJaWYgKGFjdF9sZW4pCisJCSphY3RfbGVuID0gY2hpcC0+dXNiLT5jdXJyZW50X3NnLmJ5dGVzOworCXJldHVybiBpbnRlcnByZXRfdXJiX3Jlc3VsdChjaGlwLCBwaXBlLCBsZW5ndGgsIHJlc3VsdCwKKwkJCQkgICAgY2hpcC0+dXNiLT5jdXJyZW50X3NnLmJ5dGVzKTsKK30KKyNpZiAwCitzdGF0aWMgaW50IHJ0czUxeF9idWxrX3RyYW5zZmVyX3NnbGlzdF9wYXJ0aWFsKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwKKwkJdW5zaWduZWQgaW50IHBpcGUsIHZvaWQgKmJ1Ziwgc3RydWN0IHNjYXR0ZXJsaXN0ICoqc2dwdHIsCisJCXVuc2lnbmVkIGludCAqb2Zmc2V0LCBpbnQgbnVtX3NnLCB1bnNpZ25lZCBpbnQgbGVuZ3RoLAorCQl1bnNpZ25lZCBpbnQgKmFjdF9sZW4sIGludCB0aW1lb3V0KQoreworCWludCByZXN1bHQ7CisKKwkvKiBkb24ndCBzdWJtaXQgcy1nIHJlcXVlc3RzIGR1cmluZyBhYm9ydCBwcm9jZXNzaW5nICovCisJaWYgKHRlc3RfYml0KEZMSURYX0FCT1JUSU5HLCAmY2hpcC0+dXNiLT5kZmxhZ3MpKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0VSUk9SKTsKKworCS8qIGluaXRpYWxpemUgdGhlIHNjYXR0ZXItZ2F0aGVyIHJlcXVlc3QgYmxvY2sgKi8KKwlSVFM1MVhfREVCVUdQKCIlczogeGZlciAldSBieXRlcywgJWQgZW50cmllc1xuIiwgX19mdW5jX18sCisJCQlsZW5ndGgsIG51bV9zZyk7CisJcmVzdWx0ID0gcnRzNTF4X3NnX2luaXRfcGFydGlhbCgmY2hpcC0+dXNiLT5jdXJyZW50X3NnLAorCQkJY2hpcC0+dXNiLT5wdXNiX2RldiwgcGlwZSwgMCwgYnVmLCBzZ3B0ciwgb2Zmc2V0LAorCQkJbnVtX3NnLCBsZW5ndGgsIEdGUF9OT0lPKTsKKwlpZiAocmVzdWx0KSB7CisJCVJUUzUxWF9ERUJVR1AoInJ0czUxeF9zZ19pbml0X3BhcnRpYWwgcmV0dXJuZWQgJWRcbiIsIHJlc3VsdCk7CisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRVJST1IpOworCX0KKworCS8qIHNpbmNlIHRoZSBibG9jayBoYXMgYmVlbiBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHksIGl0J3Mgbm93CisJICogb2theSB0byBjYW5jZWwgaXQgKi8KKwlzZXRfYml0KEZMSURYX1NHX0FDVElWRSwgJmNoaXAtPnVzYi0+ZGZsYWdzKTsKKworCS8qIGRpZCBhbiBhYm9ydCBvY2N1ciBkdXJpbmcgdGhlIHN1Ym1pc3Npb24/ICovCisJaWYgKHRlc3RfYml0KEZMSURYX0FCT1JUSU5HLCAmY2hpcC0+dXNiLT5kZmxhZ3MpKSB7CisKKwkJLyogY2FuY2VsIHRoZSByZXF1ZXN0LCBpZiBpdCBoYXNuJ3QgYmVlbiBjYW5jZWxsZWQgYWxyZWFkeSAqLworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEZMSURYX1NHX0FDVElWRSwgJmNoaXAtPnVzYi0+ZGZsYWdzKSkgeworCQkJUlRTNTFYX0RFQlVHUCgiLS0gY2FuY2VsbGluZyBzZyByZXF1ZXN0XG4iKTsKKwkJCXVzYl9zZ19jYW5jZWwoJmNoaXAtPnVzYi0+Y3VycmVudF9zZyk7CisJCX0KKwl9CisKKwkvKiB3YWl0IGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGUgdHJhbnNmZXIgKi8KKwlyZXN1bHQgPSBydHM1MXhfc2dfd2FpdCgmY2hpcC0+dXNiLT5jdXJyZW50X3NnLCB0aW1lb3V0KTsKKworCWNsZWFyX2JpdChGTElEWF9TR19BQ1RJVkUsICZjaGlwLT51c2ItPmRmbGFncyk7CisKKwkvKiByZXN1bHQgPSB1cy0+Y3VycmVudF9zZy5zdGF0dXM7ICovCisJaWYgKGFjdF9sZW4pCisJCSphY3RfbGVuID0gY2hpcC0+dXNiLT5jdXJyZW50X3NnLmJ5dGVzOworCXJldHVybiBpbnRlcnByZXRfdXJiX3Jlc3VsdChjaGlwLCBwaXBlLCBsZW5ndGgsIHJlc3VsdCwKKwkJY2hpcC0+dXNiLT5jdXJyZW50X3NnLmJ5dGVzKTsKK30KKyNlbmRpZgoraW50IHJ0czUxeF9idWxrX3RyYW5zZmVyX2J1ZihzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBwaXBlLAorCQkJICAgICB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW5ndGgsCisJCQkgICAgIHVuc2lnbmVkIGludCAqYWN0X2xlbiwgaW50IHRpbWVvdXQpCit7CisJaW50IHJlc3VsdDsKKworCS8qIGZpbGwgYW5kIHN1Ym1pdCB0aGUgVVJCICovCisJdXNiX2ZpbGxfYnVsa191cmIoY2hpcC0+dXNiLT5jdXJyZW50X3VyYiwgY2hpcC0+dXNiLT5wdXNiX2RldiwgcGlwZSwKKwkJCSAgYnVmLCBsZW5ndGgsIHVyYl9kb25lX2NvbXBsZXRpb24sIE5VTEwpOworCXJlc3VsdCA9IHJ0czUxeF9tc2dfY29tbW9uKGNoaXAsIGNoaXAtPnVzYi0+Y3VycmVudF91cmIsIHRpbWVvdXQpOworCisJLyogc3RvcmUgdGhlIGFjdHVhbCBsZW5ndGggb2YgdGhlIGRhdGEgdHJhbnNmZXJyZWQgKi8KKwlpZiAoYWN0X2xlbikKKwkJKmFjdF9sZW4gPSBjaGlwLT51c2ItPmN1cnJlbnRfdXJiLT5hY3R1YWxfbGVuZ3RoOworCXJldHVybiBpbnRlcnByZXRfdXJiX3Jlc3VsdChjaGlwLCBwaXBlLCBsZW5ndGgsIHJlc3VsdCwKKwkJCQkgICAgY2hpcC0+dXNiLT5jdXJyZW50X3VyYi0+YWN0dWFsX2xlbmd0aCk7Cit9CisKK2ludCBydHM1MXhfdHJhbnNmZXJfZGF0YShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBwaXBlLAorCQkJIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbiwgaW50IHVzZV9zZywKKwkJCSB1bnNpZ25lZCBpbnQgKmFjdF9sZW4sIGludCB0aW1lb3V0KQoreworCWludCByZXN1bHQ7CisKKwlpZiAodGltZW91dCA8IDYwMCkKKwkJdGltZW91dCA9IDYwMDsKKworCWlmICh1c2Vfc2cpIHsKKwkJcmVzdWx0ID0KKwkJICAgIHJ0czUxeF9idWxrX3RyYW5zZmVyX3NnbGlzdChjaGlwLCBwaXBlLAorCQkJCQkJKHN0cnVjdCBzY2F0dGVybGlzdCAqKWJ1ZiwKKwkJCQkJCXVzZV9zZywgbGVuLCBhY3RfbGVuLCB0aW1lb3V0KTsKKwl9IGVsc2UgeworCQlyZXN1bHQgPQorCQkgICAgcnRzNTF4X2J1bGtfdHJhbnNmZXJfYnVmKGNoaXAsIHBpcGUsIGJ1ZiwgbGVuLCBhY3RfbGVuLAorCQkJCQkgICAgIHRpbWVvdXQpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBydHM1MXhfdHJhbnNmZXJfZGF0YV9wYXJ0aWFsKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IHBpcGUsCisJCQkJIHZvaWQgKmJ1Ziwgdm9pZCAqKnB0ciwgdW5zaWduZWQgaW50ICpvZmZzZXQsCisJCQkJIHVuc2lnbmVkIGludCBsZW4sIGludCB1c2Vfc2csCisJCQkJIHVuc2lnbmVkIGludCAqYWN0X2xlbiwgaW50IHRpbWVvdXQpCit7CisJaW50IHJlc3VsdDsKKworCWlmICh0aW1lb3V0IDwgNjAwKQorCQl0aW1lb3V0ID0gNjAwOworCisJaWYgKHVzZV9zZykgeworCQl2b2lkICp0bXBfYnVmID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCQlpZiAoIXRtcF9idWYpCisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX05PTUVNKTsKKworCQlpZiAodXNiX3BpcGVvdXQocGlwZSkpIHsKKwkJCXJ0czUxeF9hY2Nlc3Nfc2dsaXN0KHRtcF9idWYsIGxlbiwgYnVmLCBwdHIsIG9mZnNldCwKKwkJCQkJICAgICBGUk9NX1hGRVJfQlVGKTsKKwkJfQorCQlyZXN1bHQgPQorCQkgICAgcnRzNTF4X2J1bGtfdHJhbnNmZXJfYnVmKGNoaXAsIHBpcGUsIHRtcF9idWYsIGxlbiwgYWN0X2xlbiwKKwkJCQkJICAgICB0aW1lb3V0KTsKKwkJaWYgKHJlc3VsdCA9PSBTVEFUVVNfU1VDQ0VTUykgeworCQkJaWYgKHVzYl9waXBlaW4ocGlwZSkpIHsKKwkJCQlydHM1MXhfYWNjZXNzX3NnbGlzdCh0bXBfYnVmLCBsZW4sIGJ1ZiwgcHRyLAorCQkJCQkJICAgICBvZmZzZXQsIFRPX1hGRVJfQlVGKTsKKwkJCX0KKwkJfQorCisJCWtmcmVlKHRtcF9idWYpOworI2lmIDAKKwkJcmVzdWx0ID0gcnRzNTF4X2J1bGtfdHJhbnNmZXJfc2dsaXN0X3BhcnRpYWwoY2hpcCwgcGlwZSwgYnVmLAorCQkJCQkoc3RydWN0IHNjYXR0ZXJsaXN0ICoqKXB0ciwgb2Zmc2V0LAorCQkJCQl1c2Vfc2csIGxlbiwgYWN0X2xlbiwgdGltZW91dCk7CisjZW5kaWYKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBpbnQgc3RlcCA9IDA7CisJCWlmIChvZmZzZXQpCisJCQlzdGVwID0gKm9mZnNldDsKKwkJcmVzdWx0ID0KKwkJICAgIHJ0czUxeF9idWxrX3RyYW5zZmVyX2J1ZihjaGlwLCBwaXBlLCBidWYgKyBzdGVwLCBsZW4sCisJCQkJCSAgICAgYWN0X2xlbiwgdGltZW91dCk7CisJCWlmIChhY3RfbGVuKQorCQkJc3RlcCArPSAqYWN0X2xlbjsKKwkJZWxzZQorCQkJc3RlcCArPSBsZW47CisJCWlmIChvZmZzZXQpCisJCQkqb2Zmc2V0ID0gc3RlcDsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgcnRzNTF4X2dldF9lcGNfc3RhdHVzKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTE2ICogc3RhdHVzKQoreworCXVuc2lnbmVkIGludCBwaXBlID0gUkNWX0lOVFJfUElQRShjaGlwKTsKKwlzdHJ1Y3QgdXNiX2hvc3RfZW5kcG9pbnQgKmVwOworCXN0cnVjdCBjb21wbGV0aW9uIHVyYl9kb25lOworCWludCByZXN1bHQ7CisKKwlpZiAoIXN0YXR1cykKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19FUlJPUik7CisKKwkvKiBzZXQgdXAgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgd2FrZXVwIHN5c3RlbSAqLworCWluaXRfY29tcGxldGlvbigmdXJiX2RvbmUpOworCisJZXAgPSBjaGlwLT51c2ItPnB1c2JfZGV2LT5lcF9pblt1c2JfcGlwZWVuZHBvaW50KHBpcGUpXTsKKworCS8qIGZpbGwgYW5kIHN1Ym1pdCB0aGUgVVJCICovCisJLyogV2Ugc2V0IGludGVydmFsIHRvIDEgaGVyZSwgc28gdGhlIHBvbGxpbmcgaW50ZXJ2YWwgaXMgY29udHJvbGxlZAorCSAqIGJ5IG91ciBwb2xsaW5nIHRocmVhZCAqLworCXVzYl9maWxsX2ludF91cmIoY2hpcC0+dXNiLT5pbnRyX3VyYiwgY2hpcC0+dXNiLT5wdXNiX2RldiwgcGlwZSwKKwkJCSBzdGF0dXMsIDIsIHVyYl9kb25lX2NvbXBsZXRpb24sICZ1cmJfZG9uZSwgMSk7CisKKwlyZXN1bHQgPSBydHM1MXhfbXNnX2NvbW1vbihjaGlwLCBjaGlwLT51c2ItPmludHJfdXJiLCA1MCk7CisKKwlyZXR1cm4gaW50ZXJwcmV0X3VyYl9yZXN1bHQoY2hpcCwgcGlwZSwgMiwgcmVzdWx0LAorCQkJCSAgICBjaGlwLT51c2ItPmludHJfdXJiLT5hY3R1YWxfbGVuZ3RoKTsKK30KKwordTggbWVkaWFfbm90X3ByZXNlbnRbXSA9IHsKKwkweDcwLCAwLCAweDAyLCAwLCAwLCAwLCAwLCAxMCwgMCwgMCwgMCwgMCwgMHgzQSwgMCwgMCwgMCwgMCwgMCB9OwordTggaW52YWxpZF9jbWRfZmllbGRbXSA9IHsKKwkweDcwLCAwLCAweDA1LCAwLCAwLCAwLCAwLCAxMCwgMCwgMCwgMCwgMCwgMHgyNCwgMCwgMCwgMCwgMCwgMCB9OworCit2b2lkIHJ0czUxeF9pbnZva2VfdHJhbnNwb3J0KHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCWludCByZXN1bHQ7CisKKyNpZmRlZiBDT05GSUdfUE0KKwlpZiAoY2hpcC0+b3B0aW9uLnNzX2VuKSB7CisJCWlmIChzcmItPmNtbmRbMF0gPT0gVEVTVF9VTklUX1JFQURZKSB7CisJCQlpZiAoUlRTNTFYX0NIS19TVEFUKGNoaXAsIFNUQVRfU1MpKSB7CisJCQkJaWYgKGNoZWNrX2Zha2VfY2FyZF9yZWFkeShjaGlwLAorCQkJCQkJCVNDU0lfTFVOKHNyYikpKSB7CisJCQkJCXNyYi0+cmVzdWx0ID0gU0FNX1NUQVRfR09PRDsKKwkJCQl9IGVsc2UgeworCQkJCQlzcmItPnJlc3VsdCA9IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKwkJCQkJbWVtY3B5KHNyYi0+c2Vuc2VfYnVmZmVyLAorCQkJCQkgICAgICAgbWVkaWFfbm90X3ByZXNlbnQsIFNFTlNFX1NJWkUpOworCQkJCX0KKwkJCQlyZXR1cm47CisJCQl9CisJCX0gZWxzZSBpZiAoc3JiLT5jbW5kWzBdID09IEFMTE9XX01FRElVTV9SRU1PVkFMKSB7CisJCQlpZiAoUlRTNTFYX0NIS19TVEFUKGNoaXAsIFNUQVRfU1MpKSB7CisJCQkJaW50IHByZXZlbnQgPSBzcmItPmNtbmRbNF0gJiAweDE7CisKKwkJCQlpZiAocHJldmVudCkgeworCQkJCQlzcmItPnJlc3VsdCA9IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKKwkJCQkJbWVtY3B5KHNyYi0+c2Vuc2VfYnVmZmVyLAorCQkJCQkgICAgICAgaW52YWxpZF9jbWRfZmllbGQsIFNFTlNFX1NJWkUpOworCQkJCX0gZWxzZSB7CisJCQkJCXNyYi0+cmVzdWx0ID0gU0FNX1NUQVRfR09PRDsKKwkJCQl9CisJCQkJcmV0dXJuOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKFJUUzUxWF9DSEtfU1RBVChjaGlwLCBTVEFUX1NTKQorCQkJICAgIHx8IFJUUzUxWF9DSEtfU1RBVChjaGlwLCBTVEFUX1NTX1BSRSkpIHsKKwkJCQkvKiBXYWtlIHVwIGRldmljZSAqLworCQkJCVJUUzUxWF9ERUJVR1AoIlRyeSB0byB3YWtlIHVwIGRldmljZVxuIik7CisJCQkJY2hpcC0+cmVzdW1lX2Zyb21fc2NzaSA9IDE7CisKKwkJCQlydHM1MXhfdHJ5X3RvX2V4aXRfc3MoY2hpcCk7CisKKwkJCQlpZiAoUlRTNTFYX0NIS19TVEFUKGNoaXAsIFNUQVRfU1MpKSB7CisJCQkJCXdhaXRfdGltZW91dCgzMDAwKTsKKworCQkJCQlydHM1MXhfaW5pdF9jaGlwKGNoaXApOworCQkJCQlydHM1MXhfaW5pdF9jYXJkcyhjaGlwKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKworCXJlc3VsdCA9IHJ0czUxeF9zY3NpX2hhbmRsZXIoc3JiLCBjaGlwKTsKKworCS8qIGlmIHRoZXJlIGlzIGEgdHJhbnNwb3J0IGVycm9yLCByZXNldCBhbmQgZG9uJ3QgYXV0by1zZW5zZSAqLworCWlmIChyZXN1bHQgPT0gVFJBTlNQT1JUX0VSUk9SKSB7CisJCVJUUzUxWF9ERUJVR1AoIi0tIHRyYW5zcG9ydCBpbmRpY2F0ZXMgZXJyb3IsIHJlc2V0dGluZ1xuIik7CisJCXNyYi0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OworCQlnb3RvIEhhbmRsZV9FcnJvcnM7CisJfQorCisJc3JiLT5yZXN1bHQgPSBTQU1fU1RBVF9HT09EOworCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGEgZmFpbHVyZSwgd2UncmUgZ29pbmcgdG8gZG8gYSBSRVFVRVNUX1NFTlNFCisJICogYXV0b21hdGljYWxseS4gIE5vdGUgdGhhdCB3ZSBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYSBjb21tYW5kCisJICogImZhaWx1cmUiIGFuZCBhbiAiZXJyb3IiIGluIHRoZSB0cmFuc3BvcnQgbWVjaGFuaXNtLgorCSAqLworCWlmIChyZXN1bHQgPT0gVFJBTlNQT1JUX0ZBSUxFRCkgeworCQkvKiBzZXQgdGhlIHJlc3VsdCBzbyB0aGUgaGlnaGVyIGxheWVycyBleHBlY3QgdGhpcyBkYXRhICovCisJCXNyYi0+cmVzdWx0ID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCQltZW1jcHkoc3JiLT5zZW5zZV9idWZmZXIsCisJCSAgICAgICAodW5zaWduZWQgY2hhciAqKSYoY2hpcC0+c2Vuc2VfYnVmZmVyW1NDU0lfTFVOKHNyYildKSwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc2Vuc2VfZGF0YV90KSk7CisJfQorCisJcmV0dXJuOworCisJLyogRXJyb3IgYW5kIGFib3J0IHByb2Nlc3Npbmc6IHRyeSB0byByZXN5bmNocm9uaXplIHdpdGggdGhlIGRldmljZQorCSAqIGJ5IGlzc3VpbmcgYSBwb3J0IHJlc2V0LiAgSWYgdGhhdCBmYWlscywgdHJ5IGEgY2xhc3Mtc3BlY2lmaWMKKwkgKiBkZXZpY2UgcmVzZXQuICovCitIYW5kbGVfRXJyb3JzOgorCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF90cmFuc3BvcnQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3J0czUxeF90cmFuc3BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2FhODdmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvcnRzNTF4X3RyYW5zcG9ydC5oCkBAIC0wLDAgKzEsODAgQEAKKy8qIERyaXZlciBmb3IgUmVhbHRlayBSVFM1MXh4IFVTQiBjYXJkIHJlYWRlcgorICogSGVhZGVyIGZpbGUKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOSBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogQXV0aG9yOgorICogICB3d2FuZyAod2VpX3dhbmdAcmVhbHNpbC5jb20uY24pCisgKiAgIE5vLiA0NTAsIFNoZW5odSBSb2FkLCBTdXpob3UgSW5kdXN0cnkgUGFyaywgU3V6aG91LCBDaGluYQorICogTWFpbnRhaW5lcjoKKyAqICAgRWR3aW4gUm9uZyAoZWR3aW5fcm9uZ0ByZWFsc2lsLmNvbS5jbikKKyAqICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisgKi8KKworI2lmbmRlZiBfX1JUUzUxWF9UUkFOU1BPUlRfSAorI2RlZmluZSBfX1JUUzUxWF9UUkFOU1BPUlRfSAorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorCisjaW5jbHVkZSAicnRzNTF4LmgiCisjaW5jbHVkZSAicnRzNTF4X2NoaXAuaCIKKworI2lmIDEgLyogTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiwgNiwgMzQpICovCisjZGVmaW5lIFVSQl9OT19TRVRVUF9ETUFfTUFQCQkwCisjZW5kaWYKKwordW5zaWduZWQgaW50IHJ0czUxeF9hY2Nlc3Nfc2dsaXN0KHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwKKwkJCQkgIHVuc2lnbmVkIGludCBidWZsZW4sIHZvaWQgKnNnbGlzdCwKKwkJCQkgIHZvaWQgKipzZ3B0ciwgdW5zaWduZWQgaW50ICpvZmZzZXQsCisJCQkJICBlbnVtIHhmZXJfYnVmX2RpciBkaXIpOwordW5zaWduZWQgaW50IHJ0czUxeF9hY2Nlc3NfeGZlcl9idWYodW5zaWduZWQgY2hhciAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgYnVmbGVuLAorCQkJCSAgICBzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsCisJCQkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqKnNncHRyLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKm9mZnNldCwKKwkJCQkgICAgZW51bSB4ZmVyX2J1Zl9kaXIgZGlyKTsKK3ZvaWQgcnRzNTF4X3NldF94ZmVyX2J1Zih1bnNpZ25lZCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGludCBidWZsZW4sCisJCQkgc3RydWN0IHNjc2lfY21uZCAqc3JiKTsKK3ZvaWQgcnRzNTF4X2dldF94ZmVyX2J1Zih1bnNpZ25lZCBjaGFyICpidWZmZXIsIHVuc2lnbmVkIGludCBidWZsZW4sCisJCQkgc3RydWN0IHNjc2lfY21uZCAqc3JiKTsKKworaW50IHJ0czUxeF9jdHJsX3RyYW5zZmVyKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IHBpcGUsCisJCQkgdTggcmVxdWVzdCwgdTggcmVxdWVzdHR5cGUsIHUxNiB2YWx1ZSwgdTE2IGluZGV4LAorCQkJIHZvaWQgKmRhdGEsIHUxNiBzaXplLCBpbnQgdGltZW91dCk7CitpbnQgcnRzNTF4X2NsZWFyX2hhbHQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgcGlwZSk7CitpbnQgcnRzNTF4X3RyYW5zZmVyX2RhdGEoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgcGlwZSwKKwkJCSB2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4sIGludCB1c2Vfc2csCisJCQkgdW5zaWduZWQgaW50ICphY3RfbGVuLCBpbnQgdGltZW91dCk7CitpbnQgcnRzNTF4X3RyYW5zZmVyX2RhdGFfcGFydGlhbChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBwaXBlLAorCQkJCSB2b2lkICpidWYsIHZvaWQgKipwdHIsIHVuc2lnbmVkIGludCAqb2Zmc2V0LAorCQkJCSB1bnNpZ25lZCBpbnQgbGVuLCBpbnQgdXNlX3NnLAorCQkJCSB1bnNpZ25lZCBpbnQgKmFjdF9sZW4sIGludCB0aW1lb3V0KTsKKworLyogd2hpY2hQaXBlOgorICogMDogYnVsayBpbiBwaXBlCisgKiAxOiBidWxrIG91dCBwaXBlCisgKiAyOiBpbnRyICBpbiBwaXBlICovCitpbnQgcnRzNTF4X3Jlc2V0X3BpcGUoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCBjaGFyIHBpcGUpOworCisjaWZuZGVmIFBPTExJTkdfSU5fVEhSRUFECitpbnQgcnRzNTF4X3N0YXJ0X2VwY190cmFuc2ZlcihzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApOwordm9pZCBydHM1MXhfY2FuY2VsX2VwY190cmFuc2ZlcihzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApOworI2VuZGlmCisKK2ludCBydHM1MXhfZ2V0X2VwY19zdGF0dXMoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1MTYgKiBzdGF0dXMpOwordm9pZCBydHM1MXhfaW52b2tlX3RyYW5zcG9ydChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7CisKKyNlbmRpZiAvKiBfX1JUUzUxWF9UUkFOU1BPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvc2QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3NkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVkZDJmOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3NkLmMKQEAgLTAsMCArMSwzNDAwIEBACisvKiBEcml2ZXIgZm9yIFJlYWx0ZWsgUlRTNTF4eCBVU0IgY2FyZCByZWFkZXIKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOSBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogQXV0aG9yOgorICogICB3d2FuZyAod2VpX3dhbmdAcmVhbHNpbC5jb20uY24pCisgKiAgIE5vLiA0NTAsIFNoZW5odSBSb2FkLCBTdXpob3UgSW5kdXN0cnkgUGFyaywgU3V6aG91LCBDaGluYQorICogTWFpbnRhaW5lcjoKKyAqICAgRWR3aW4gUm9uZyAoZWR3aW5fcm9uZ0ByZWFsc2lsLmNvbS5jbikKKyAqICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ0cmFjZS5oIgorI2luY2x1ZGUgInJ0czUxeC5oIgorI2luY2x1ZGUgInJ0czUxeF90cmFuc3BvcnQuaCIKKyNpbmNsdWRlICJydHM1MXhfc2NzaS5oIgorI2luY2x1ZGUgInJ0czUxeF9jYXJkLmgiCisjaW5jbHVkZSAic2QuaCIKKworc3RhdGljIGlubGluZSB2b2lkIHNkX3NldF9yZXNldF9mYWlsKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggZXJyX2NvZGUpCit7CisJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOworCisJc2RfY2FyZC0+c2RfcmVzZXRfZmFpbCB8PSBlcnJfY29kZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNkX2NsZWFyX3Jlc2V0X2ZhaWwoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKworCXNkX2NhcmQtPnNkX3Jlc2V0X2ZhaWwgPSAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzZF9jaGVja19yZXNldF9mYWlsKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggZXJyX2NvZGUpCit7CisJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOworCisJcmV0dXJuIHNkX2NhcmQtPnNkX3Jlc2V0X2ZhaWwgJiBlcnJfY29kZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNkX3NldF9lcnJfY29kZShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IGVycl9jb2RlKQoreworCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKworCXNkX2NhcmQtPmVycl9jb2RlIHw9IGVycl9jb2RlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2RfY2xyX2Vycl9jb2RlKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CisKKwlzZF9jYXJkLT5lcnJfY29kZSA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNkX2NoZWNrX2Vycl9jb2RlKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggZXJyX2NvZGUpCit7CisJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOworCisJcmV0dXJuIHNkX2NhcmQtPmVycl9jb2RlICYgZXJyX2NvZGU7Cit9CisKK3N0YXRpYyBpbnQgc2RfcGFyc2VfZXJyX2NvZGUoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7Cit9CisKK2ludCBzZF9jaGVja19kYXRhMF9zdGF0dXMoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCWludCByZXR2YWw7CisJdTggc3RhdDsKKworCXJldHZhbCA9IHJ0czUxeF9lcDBfcmVhZF9yZWdpc3RlcihjaGlwLCBTRF9CVVNfU1RBVCwgJnN0YXQpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCWlmICghKHN0YXQgJiBTRF9EQVQwX1NUQVRVUykpIHsKKwkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX0JVU1kpOworCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzZF9zZW5kX2NtZF9nZXRfcnNwKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggY21kX2lkeCwKKwkJCSAgICAgICB1MzIgYXJnLCB1OCByc3BfdHlwZSwgdTggKnJzcCwgaW50IHJzcF9sZW4pCit7CisJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOworCWludCByZXR2YWw7CisJaW50IHRpbWVvdXQgPSA1MDsKKwl1MTYgcmVnX2FkZHI7CisJdTggYnVmWzE3XSwgc3RhdDsKKwlpbnQgbGVuID0gMjsKKwlpbnQgcnR5X2NudCA9IDA7CisKKwlzZF9jbHJfZXJyX2NvZGUoY2hpcCk7CisKKwlSVFM1MVhfREVCVUdQKCJTRC9NTUMgQ01EICVkLCBhcmcgPSAweCUwOHhcbiIsIGNtZF9pZHgsIGFyZyk7CisKKwlpZiAocnNwX3R5cGUgPT0gU0RfUlNQX1RZUEVfUjFiKQorCQl0aW1lb3V0ID0gMzAwMDsKKworUlRZX1NFTkRfQ01EOgorCisJcnRzNTF4X2luaXRfY21kKGNoaXApOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQ01EMCwgMHhGRiwgMHg0MCB8IGNtZF9pZHgpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0NNRDEsIDB4RkYsICh1OCkgKGFyZyA+PiAyNCkpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0NNRDIsIDB4RkYsICh1OCkgKGFyZyA+PiAxNikpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0NNRDMsIDB4RkYsICh1OCkgKGFyZyA+PiA4KSk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQ01ENCwgMHhGRiwgKHU4KSBhcmcpOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQ0ZHMiwgMHhGRiwgcnNwX3R5cGUpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfREFUQV9TT1VSQ0UsIDB4MDEsCisJCSAgICAgICBQSU5HUE9OR19CVUZGRVIpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX1RSQU5TRkVSLCAweEZGLAorCQkgICAgICAgU0RfVE1fQ01EX1JTUCB8IFNEX1RSQU5TRkVSX1NUQVJUKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBDSEVDS19SRUdfQ01ELCBTRF9UUkFOU0ZFUiwKKwkJICAgICAgIFNEX1RSQU5TRkVSX0VORCB8IFNEX1NUQVRfSURMRSwKKwkJICAgICAgIFNEX1RSQU5TRkVSX0VORCB8IFNEX1NUQVRfSURMRSk7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIFNEX1NUQVQxLCAwLCAwKTsKKworCWlmIChDSEVDS19VU0IoY2hpcCwgVVNCXzIwKSkgeworCQlpZiAocnNwX3R5cGUgPT0gU0RfUlNQX1RZUEVfUjIpIHsKKwkJCS8qIFJlYWQgZGF0YSBmcm9tIHBpbmctcG9uZyBidWZmZXIgKi8KKwkJCWZvciAocmVnX2FkZHIgPSBQUEJVRl9CQVNFMjsKKwkJCSAgICAgcmVnX2FkZHIgPCBQUEJVRl9CQVNFMiArIDE2OyByZWdfYWRkcisrKSB7CisJCQkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCByZWdfYWRkciwgMCwKKwkJCQkJICAgICAgIDApOworCQkJfQorCQkJbGVuID0gMTg7CisJCX0gZWxzZSBpZiAocnNwX3R5cGUgIT0gU0RfUlNQX1RZUEVfUjApIHsKKwkJCS8qIFJlYWQgZGF0YSBmcm9tIFNEX0NNRHggcmVnaXN0ZXJzICovCisJCQlmb3IgKHJlZ19hZGRyID0gU0RfQ01EMDsgcmVnX2FkZHIgPD0gU0RfQ01ENDsKKwkJCSAgICAgcmVnX2FkZHIrKykgeworCQkJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgcmVnX2FkZHIsIDAsCisJCQkJCSAgICAgICAwKTsKKwkJCX0KKwkJCWxlbiA9IDc7CisJCX0gZWxzZSB7CisJCQlsZW4gPSAyOworCQl9CisJfSBlbHNlIHsKKwkJbGVuID0gMjsKKwl9CisKKwlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DUiwgMTAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHZhbCA9IHJ0czUxeF9nZXRfcnNwKGNoaXAsIGxlbiwgdGltZW91dCk7CisKKwlpZiAoQ0hFQ0tfU0RfVFJBTlNfRkFJTChjaGlwLCByZXR2YWwpKSB7CisJCXU4IHZhbDsKKworCQlydHM1MXhfZXAwX3JlYWRfcmVnaXN0ZXIoY2hpcCwgU0RfU1RBVDEsICZ2YWwpOworCQlSVFM1MVhfREVCVUdQKCJTRF9TVEFUMTogMHgleFxuIiwgdmFsKTsKKworCQlydHM1MXhfZXAwX3JlYWRfcmVnaXN0ZXIoY2hpcCwgU0RfU1RBVDIsICZ2YWwpOworCQlSVFM1MVhfREVCVUdQKCJTRF9TVEFUMjogMHgleFxuIiwgdmFsKTsKKworCQlpZiAodmFsICYgU0RfUlNQXzgwQ0xLX1RJTUVPVVQpCisJCQlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfUlNQX1RJTUVPVVQpOworCisJCXJ0czUxeF9lcDBfcmVhZF9yZWdpc3RlcihjaGlwLCBTRF9CVVNfU1RBVCwgJnZhbCk7CisJCVJUUzUxWF9ERUJVR1AoIlNEX0JVU19TVEFUOiAweCV4XG4iLCB2YWwpOworCisJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1RJTUVET1VUKSB7CisJCQlpZiAocnNwX3R5cGUgJiBTRF9XQUlUX0JVU1lfRU5EKSB7CisJCQkJcmV0dmFsID0gc2RfY2hlY2tfZGF0YTBfc3RhdHVzKGNoaXApOworCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCQkJfSBlbHNlIHsKKwkJCQlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfVE9fRVJSKTsKKwkJCX0KKwkJfQorCQlydHM1MXhfY2xlYXJfc2RfZXJyb3IoY2hpcCk7CisKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwl9CisKKwlpZiAocnNwX3R5cGUgPT0gU0RfUlNQX1RZUEVfUjApCisJCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKKworCWlmIChDSEVDS19VU0IoY2hpcCwgVVNCXzIwKSkgeworCQlydHM1MXhfcmVhZF9yc3BfYnVmKGNoaXAsIDIsIGJ1ZiwgbGVuIC0gMik7CisJfSBlbHNlIHsKKwkJaWYgKHJzcF90eXBlID09IFNEX1JTUF9UWVBFX1IyKSB7CisJCQlyZWdfYWRkciA9IFBQQlVGX0JBU0UyOworCQkJbGVuID0gMTY7CisJCX0gZWxzZSB7CisJCQlyZWdfYWRkciA9IFNEX0NNRDA7CisJCQlsZW4gPSA1OworCQl9CisJCXJldHZhbCA9IHJ0czUxeF9zZXFfcmVhZF9yZWdpc3RlcihjaGlwLCByZWdfYWRkciwKKwkJCQkJCSAgICAgKHVuc2lnbmVkIHNob3J0KWxlbiwgYnVmKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKwlzdGF0ID0gY2hpcC0+cnNwX2J1ZlsxXTsKKworCS8qIENoZWNrIChTdGFydCxUcmFuc21pc3Npb24pIGJpdCBvZiBSZXNwb25zZSAqLworCWlmICgoYnVmWzBdICYgMHhDMCkgIT0gMCkgeworCQlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfU1RTX0VSUik7CisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJfQorCS8qIENoZWNrIENSQzcgKi8KKwlpZiAoIShyc3BfdHlwZSAmIFNEX05PX0NIRUNLX0NSQzcpKSB7CisJCWlmIChzdGF0ICYgU0RfQ1JDN19FUlIpIHsKKwkJCWlmIChjbWRfaWR4ID09IFdSSVRFX01VTFRJUExFX0JMT0NLKSB7CisJCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX0NSQ19FUlIpOworCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQl9CisJCQlpZiAocnR5X2NudCA8IFNEX01BWF9SRVRSWV9DT1VOVCkgeworCQkJCXdhaXRfdGltZW91dCgyMCk7CisJCQkJcnR5X2NudCsrOworCQkJCWdvdG8gUlRZX1NFTkRfQ01EOworCQkJfSBlbHNlIHsKKwkJCQlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfQ1JDX0VSUik7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCX0KKwkJfQorCX0KKwkvKiBDaGVjayBTdGF0dXMgKi8KKwlpZiAoKHJzcF90eXBlID09IFNEX1JTUF9UWVBFX1IxKSB8fCAocnNwX3R5cGUgPT0gU0RfUlNQX1RZUEVfUjFiKSkgeworCQlpZiAoKGNtZF9pZHggIT0gU0VORF9SRUxBVElWRV9BRERSKQorCQkgICAgJiYgKGNtZF9pZHggIT0gU0VORF9JRl9DT05EKSkgeworCQkJaWYgKGNtZF9pZHggIT0gU1RPUF9UUkFOU01JU1NJT04pIHsKKwkJCQlpZiAoYnVmWzFdICYgMHg4MCkKKwkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCX0KKyNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKKwkJCS8qIGV4Y2x1ZGUgYml0MjUgQ0FSRF9JU19MT0NLRUQgKi8KKwkJCWlmIChidWZbMV0gJiAweDdEKSB7CisjZWxzZQorCQkJaWYgKGJ1ZlsxXSAmIDB4N0YpIHsKKyNlbmRpZgorCQkJCVJUUzUxWF9ERUJVR1AoImJ1ZlsxXTogMHglMDJ4XG4iLCBidWZbMV0pOworCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQl9CisJCQlpZiAoYnVmWzJdICYgMHhGRikgeworCQkJCVJUUzUxWF9ERUJVR1AoImJ1ZlsyXTogMHglMDJ4XG4iLCBidWZbMl0pOworCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQl9CisJCQlpZiAoYnVmWzNdICYgMHg4MCkgeworCQkJCVJUUzUxWF9ERUJVR1AoImJ1ZlszXTogMHglMDJ4XG4iLCBidWZbM10pOworCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQl9CisJCQlpZiAoYnVmWzNdICYgMHgwMSkgeworCQkJCS8qIEdldCAiUkVBRFlfRk9SX0RBVEEiIGJpdCAqLworCQkJCXNkX2NhcmQtPnNkX2RhdGFfYnVmX3JlYWR5ID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJc2RfY2FyZC0+c2RfZGF0YV9idWZfcmVhZHkgPSAwOworCQkJfQorCQl9CisJfQorCisJaWYgKHJzcCAmJiByc3BfbGVuKQorCQltZW1jcHkocnNwLCBidWYsIHJzcF9sZW4pOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2RfcHJpbnRfZGVidWdfcmVnKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKyNpZmRlZiBDT05GSUdfUlRTNTEzOV9ERUJVRworCXU4IHZhbCA9IDA7CisKKwlydHM1MXhfZXAwX3JlYWRfcmVnaXN0ZXIoY2hpcCwgU0RfU1RBVDEsICZ2YWwpOworCVJUUzUxWF9ERUJVR1AoIlNEX1NUQVQxOiAweCV4XG4iLCB2YWwpOworCXJ0czUxeF9lcDBfcmVhZF9yZWdpc3RlcihjaGlwLCBTRF9TVEFUMiwgJnZhbCk7CisJUlRTNTFYX0RFQlVHUCgiU0RfU1RBVDI6IDB4JXhcbiIsIHZhbCk7CisJcnRzNTF4X2VwMF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFNEX0JVU19TVEFULCAmdmFsKTsKKwlSVFM1MVhfREVCVUdQKCJTRF9CVVNfU1RBVDogMHgleFxuIiwgdmFsKTsKKyNlbmRpZgorfQorCitpbnQgc2RfcmVhZF9kYXRhKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggdHJhbnNfbW9kZSwgdTggKmNtZCwgaW50IGNtZF9sZW4sCisJCSB1MTYgYnl0ZV9jbnQsIHUxNiBibGtfY250LCB1OCBidXNfd2lkdGgsIHU4ICpidWYsIGludCBidWZfbGVuLAorCQkgaW50IHRpbWVvdXQpCit7CisJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOworCWludCByZXR2YWw7CisJaW50IGk7CisKKwlzZF9jbHJfZXJyX2NvZGUoY2hpcCk7CisKKwlpZiAoIWJ1ZikKKwkJYnVmX2xlbiA9IDA7CisKKwlpZiAoYnVmX2xlbiA+IDUxMikKKwkJLyogVGhpcyBmdW5jdGlvbiBjYW4ndCByZWFkIGRhdGEgbW9yZSB0aGFuIG9uZSBwYWdlICovCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwlydHM1MXhfaW5pdF9jbWQoY2hpcCk7CisKKwlpZiAoY21kX2xlbikgeworCQlSVFM1MVhfREVCVUdQKCJTRC9NTUMgQ01EICVkXG4iLCBjbWRbMF0gLSAweDQwKTsKKwkJZm9yIChpID0gMDsgaSA8IChjbWRfbGVuIDwgNiA/IGNtZF9sZW4gOiA2KTsgaSsrKSB7CisJCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9DTUQwICsgaSwgMHhGRiwKKwkJCQkgICAgICAgY21kW2ldKTsKKwkJfQorCX0KKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9CWVRFX0NOVF9MLCAweEZGLCAodTgpIGJ5dGVfY250KTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9CWVRFX0NOVF9ILCAweEZGLAorCQkgICAgICAgKHU4KSAoYnl0ZV9jbnQgPj4gOCkpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0JMT0NLX0NOVF9MLCAweEZGLCAodTgpIGJsa19jbnQpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0JMT0NLX0NOVF9ILCAweEZGLAorCQkgICAgICAgKHU4KSAoYmxrX2NudCA+PiA4KSk7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9DRkcxLCAweDAzLCBidXNfd2lkdGgpOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQ0ZHMiwgMHhGRiwKKwkJICAgICAgIFNEX0NBTENVTEFURV9DUkM3IHwgU0RfQ0hFQ0tfQ1JDMTYgfCBTRF9OT19XQUlUX0JVU1lfRU5ECisJCSAgICAgICB8IFNEX0NIRUNLX0NSQzcgfCBTRF9SU1BfTEVOXzYpOworCWlmICh0cmFuc19tb2RlICE9IFNEX1RNX0FVVE9fVFVOSU5HKSB7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfREFUQV9TT1VSQ0UsIDB4MDEsCisJCQkgICAgICAgUElOR1BPTkdfQlVGRkVSKTsKKwl9CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfVFJBTlNGRVIsIDB4RkYsCisJCSAgICAgICB0cmFuc19tb2RlIHwgU0RfVFJBTlNGRVJfU1RBUlQpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIENIRUNLX1JFR19DTUQsIFNEX1RSQU5TRkVSLCBTRF9UUkFOU0ZFUl9FTkQsCisJCSAgICAgICBTRF9UUkFOU0ZFUl9FTkQpOworCisJcmV0dmFsID0gcnRzNTF4X3NlbmRfY21kKGNoaXAsIE1PREVfQ1IsIDEwMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlyZXR2YWwgPSBydHM1MXhfZ2V0X3JzcChjaGlwLCAxLCB0aW1lb3V0KTsKKworCWlmIChDSEVDS19TRF9UUkFOU19GQUlMKGNoaXAsIHJldHZhbCkpIHsKKwkJc2RfcHJpbnRfZGVidWdfcmVnKGNoaXApOworCQlpZiAocmV0dmFsID09IFNUQVRVU19USU1FRE9VVCkgeworCQkJc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRU5EX1NUQVRVUywgc2RfY2FyZC0+c2RfYWRkciwKKwkJCQkJICAgIFNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwKTsKKwkJfQorCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJfQorCisJaWYgKGJ1ZiAmJiBidWZfbGVuKSB7CisJCXJldHZhbCA9IHJ0czUxeF9yZWFkX3BwYnVmKGNoaXAsIGJ1ZiwgYnVmX2xlbik7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwl9CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgc2Rfd3JpdGVfZGF0YShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IHRyYW5zX21vZGUsCisJCQkgdTggKmNtZCwgaW50IGNtZF9sZW4sIHUxNiBieXRlX2NudCwgdTE2IGJsa19jbnQsCisJCQkgdTggYnVzX3dpZHRoLCB1OCAqYnVmLCBpbnQgYnVmX2xlbiwgaW50IHRpbWVvdXQpCit7CisJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOworCWludCByZXR2YWw7CisJaW50IGk7CisKKwlzZF9jbHJfZXJyX2NvZGUoY2hpcCk7CisKKwlpZiAoIWJ1ZikKKwkJYnVmX2xlbiA9IDA7CisKKwkvKiBUaGlzIGZ1bmN0aW9uIGNhbid0IHdyaXRlIGRhdGEgbW9yZSB0aGFuIG9uZSBwYWdlICovCisJaWYgKGJ1Zl9sZW4gPiA1MTIpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwlpZiAoYnVmICYmIGJ1Zl9sZW4pIHsKKwkJcmV0dmFsID0gcnRzNTF4X3dyaXRlX3BwYnVmKGNoaXAsIGJ1ZiwgYnVmX2xlbik7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwl9CisKKwlydHM1MXhfaW5pdF9jbWQoY2hpcCk7CisKKwlpZiAoY21kX2xlbikgeworCQlSVFM1MVhfREVCVUdQKCJTRC9NTUMgQ01EICVkXG4iLCBjbWRbMF0gLSAweDQwKTsKKwkJZm9yIChpID0gMDsgaSA8IChjbWRfbGVuIDwgNiA/IGNtZF9sZW4gOiA2KTsgaSsrKSB7CisJCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9DTUQwICsgaSwgMHhGRiwKKwkJCQkgICAgICAgY21kW2ldKTsKKwkJfQorCX0KKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9CWVRFX0NOVF9MLCAweEZGLCAodTgpIGJ5dGVfY250KTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9CWVRFX0NOVF9ILCAweEZGLAorCQkgICAgICAgKHU4KSAoYnl0ZV9jbnQgPj4gOCkpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0JMT0NLX0NOVF9MLCAweEZGLCAodTgpIGJsa19jbnQpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0JMT0NLX0NOVF9ILCAweEZGLAorCQkgICAgICAgKHU4KSAoYmxrX2NudCA+PiA4KSk7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9DRkcxLCAweDAzLCBidXNfd2lkdGgpOworCisJaWYgKGNtZF9sZW4pIHsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQ0ZHMiwgMHhGRiwKKwkJCSAgICAgICBTRF9DQUxDVUxBVEVfQ1JDNyB8IFNEX0NIRUNLX0NSQzE2IHwKKwkJCSAgICAgICBTRF9XQUlUX0JVU1lfRU5EIHwgU0RfQ0hFQ0tfQ1JDNyB8IFNEX1JTUF9MRU5fNik7CisKKwl9IGVsc2UgeworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9DRkcyLCAweEZGLAorCQkJICAgICAgIFNEX0NBTENVTEFURV9DUkM3IHwgU0RfQ0hFQ0tfQ1JDMTYgfAorCQkJICAgICAgIFNEX05PX1dBSVRfQlVTWV9FTkQgfCBTRF9DSEVDS19DUkM3IHwKKwkJCSAgICAgICBTRF9SU1BfTEVOXzYpOworCX0KKworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX1RSQU5TRkVSLCAweEZGLAorCQkgICAgICAgdHJhbnNfbW9kZSB8IFNEX1RSQU5TRkVSX1NUQVJUKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBDSEVDS19SRUdfQ01ELCBTRF9UUkFOU0ZFUiwgU0RfVFJBTlNGRVJfRU5ELAorCQkgICAgICAgU0RfVFJBTlNGRVJfRU5EKTsKKworCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0NSLCAxMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcmV0dmFsID0gcnRzNTF4X2dldF9yc3AoY2hpcCwgMSwgdGltZW91dCk7CisKKwlpZiAoQ0hFQ0tfU0RfVFJBTlNfRkFJTChjaGlwLCByZXR2YWwpKSB7CisJCXNkX3ByaW50X2RlYnVnX3JlZyhjaGlwKTsKKworCQlpZiAocmV0dmFsID09IFNUQVRVU19USU1FRE9VVCkKKwkJCXNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VORF9TVEFUVVMsIHNkX2NhcmQtPnNkX2FkZHIsCisJCQkJCSAgICBTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7CisKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwl9CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgc2RfY2hlY2tfY3NkKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgY2hhciBjaGVja193cCkKK3sKKwlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CisJaW50IHJldHZhbDsKKwlpbnQgaTsKKwl1OCBjc2RfdmVyLCB0cmFuc19zcGVlZDsKKwl1OCByc3BbMTZdOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlpZiAobW9uaXRvcl9jYXJkX2NkKGNoaXAsIFNEX0NBUkQpID09IENEX05PVF9FWElTVCkgeworCQkJc2Rfc2V0X3Jlc2V0X2ZhaWwoY2hpcCwgU0RfUkVTRVRfRkFJTCk7CisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQl9CisKKwkJcmV0dmFsID0KKwkJICAgIHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VORF9DU0QsIHNkX2NhcmQtPnNkX2FkZHIsCisJCQkJCVNEX1JTUF9UWVBFX1IyLCByc3AsIDE2KTsKKwkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKKwkJCWJyZWFrOworCX0KKworCWlmIChpID09IDYpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJbWVtY3B5KHNkX2NhcmQtPnJhd19jc2QsIHJzcCArIDEsIDE1KTsKKwkvKiBHZXQgQ1JDNyAqLworCVJUUzUxWF9SRUFEX1JFRyhjaGlwLCBTRF9DTUQ1LCBzZF9jYXJkLT5yYXdfY3NkICsgMTUpOworCisJUlRTNTFYX0RFQlVHUCgiQ1NEIFJlc3BvbnNlOlxuIik7CisJUlRTNTFYX0RVTVAocnNwLCAxNik7CisKKwkvKiBHZXQgQ1NEIFZlcnNpb24gKi8KKwljc2RfdmVyID0gKHJzcFsxXSAmIDB4YzApID4+IDY7CisJUlRTNTFYX0RFQlVHUCgiY3NkX3ZlciA9ICVkXG4iLCBjc2RfdmVyKTsKKworCXRyYW5zX3NwZWVkID0gcnNwWzRdOworCWlmICgodHJhbnNfc3BlZWQgJiAweDA3KSA9PSAweDAyKSB7CS8qIDEwTWJpdHMvcyAqLworCQlpZiAoKHRyYW5zX3NwZWVkICYgMHhmOCkgPj0gMHgzMCkgewkvKiA+MjVNYml0cy9zICovCisJCQlpZiAoY2hpcC0+YXNpY19jb2RlKQorCQkJCXNkX2NhcmQtPnNkX2Nsb2NrID0gNDY7CisJCQllbHNlCisJCQkJc2RfY2FyZC0+c2RfY2xvY2sgPSBDTEtfNTA7CisJCX0gZWxzZSBpZiAoKHRyYW5zX3NwZWVkICYgMHhmOCkgPT0gMHgyOCkgeyAvKiAyME1iaXRzL3MgKi8KKwkJCWlmIChjaGlwLT5hc2ljX2NvZGUpCisJCQkJc2RfY2FyZC0+c2RfY2xvY2sgPSAzOTsKKwkJCWVsc2UKKwkJCQlzZF9jYXJkLT5zZF9jbG9jayA9IENMS180MDsKKwkJfSBlbHNlIGlmICgodHJhbnNfc3BlZWQgJiAweGY4KSA9PSAweDIwKSB7IC8qIDE1TWJpdHMvcyAqLworCQkJaWYgKGNoaXAtPmFzaWNfY29kZSkKKwkJCQlzZF9jYXJkLT5zZF9jbG9jayA9IDI5OworCQkJZWxzZQorCQkJCXNkX2NhcmQtPnNkX2Nsb2NrID0gQ0xLXzMwOworCQl9IGVsc2UgaWYgKCh0cmFuc19zcGVlZCAmIDB4ZjgpID49IDB4MTApIHsgLyogMTJNYml0cy9zICovCisJCQlpZiAoY2hpcC0+YXNpY19jb2RlKQorCQkJCXNkX2NhcmQtPnNkX2Nsb2NrID0gMjM7CisJCQllbHNlCisJCQkJc2RfY2FyZC0+c2RfY2xvY2sgPSBDTEtfMjA7CisJCX0gZWxzZSBpZiAoKHRyYW5zX3NwZWVkICYgMHgwOCkgPj0gMHgwOCkgeyAvKiAxME1iaXRzL3MgKi8KKwkJCWlmIChjaGlwLT5hc2ljX2NvZGUpCisJCQkJc2RfY2FyZC0+c2RfY2xvY2sgPSAxOTsKKwkJCWVsc2UKKwkJCQlzZF9jYXJkLT5zZF9jbG9jayA9IENMS18yMDsKKwkJfSAvKmVsc2UgeyAqLworCQkJLypJZiB0aGlzICx0aGVuIHNsb3cgY2FyZCB3aWxsIHVzZSAzME0gY2xvY2sgKi8KKwkJCS8qIFRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7ICovCisJCS8qIH0gKi8KKwl9CisJLyplbHNlIHsKKwkgICBUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCSAgIH0gKi8KKwlpZiAoQ0hLX01NQ19TRUNUT1JfTU9ERShzZF9jYXJkKSkgeworCQlzZF9jYXJkLT5jYXBhY2l0eSA9IDA7CisJfSBlbHNlIHsKKwkJLyogRm9yIEhpZ2gtQ2FwYWNpdHkgQ2FyZCwgQ1NEX1NUUlVDVFVSRSBhbHdheXMgYmUgIjB4MSIgKi8KKwkJaWYgKCghQ0hLX1NEX0hDWEMoc2RfY2FyZCkpIHx8IChjc2RfdmVyID09IDApKSB7CisJCQkvKiBDYWxjdWxhdGUgdG90YWwgc2VjdG9yIGFjY29yZGluZyB0byBDX1NJWkUsCisJCQkgKiBDX1NJWkVfTVVMVCAmIFJFQURfQkxfTEVOICovCisJCQl1OCBibGtfc2l6ZSwgY19zaXplX211bHQ7CisJCQl1MTYgY19zaXplOworCQkJLyogR2V0IFJFQURfQkxfTEVOICovCisJCQlibGtfc2l6ZSA9IHJzcFs2XSAmIDB4MEY7CisJCQkvKiBHZXQgQ19TSVpFICovCisJCQljX3NpemUgPSAoKHUxNikgKHJzcFs3XSAmIDB4MDMpIDw8IDEwKQorCQkJICAgICsgKCh1MTYpIHJzcFs4XSA8PCAyKQorCQkJICAgICsgKCh1MTYpIChyc3BbOV0gJiAweEMwKSA+PiA2KTsKKwkJCS8qIEdldCBDX1NJWkVfTVVMICovCisJCQljX3NpemVfbXVsdCA9ICh1OCkgKChyc3BbMTBdICYgMHgwMykgPDwgMSk7CisJCQljX3NpemVfbXVsdCArPSAocnNwWzExXSAmIDB4ODApID4+IDc7CisJCQkvKiBDYWxjdWxhdGUgdG90YWwgQ2FwYWNpdHkgICovCisJCQlzZF9jYXJkLT5jYXBhY2l0eSA9CisJCQkgICAgKCgodTMyKSAoY19zaXplICsgMSkpICoKKwkJCSAgICAgKDEgPDwgKGNfc2l6ZV9tdWx0ICsgMikpKSA8PCAoYmxrX3NpemUgLSA5KTsKKwkJfSBlbHNlIHsKKwkJCS8qIEhpZ2ggQ2FwYWNpdHkgQ2FyZCBhbmQgVXNlIENTRDIuMCBWZXJzaW9uICovCisJCQl1MzIgdG90YWxfc2VjdG9yID0gMDsKKwkJCXRvdGFsX3NlY3RvciA9ICgoKHUzMikgcnNwWzhdICYgMHgzZikgPDwgMTYpIHwKKwkJCSAgICAoKHUzMikgcnNwWzldIDw8IDgpIHwgKHUzMikgcnNwWzEwXTsKKwkJCS8qIFRvdGFsIENhcGFjaXR5PSAoQ19TSVpFKzEpICoKKwkJCSAqIDUxMksgQnl0ZSA9IChDX1NJWkUrMSlLIFNlY3RvciwxSyA9IDEwMjQgQnl0ZXMgKi8KKwkJCXNkX2NhcmQtPmNhcGFjaXR5ID0gKHRvdGFsX3NlY3RvciArIDEpIDw8IDEwOworCQl9CisJfQorCisJLyogV2UgbmVlZCBjaGVjayBXcml0ZS1Qcm90ZWN0ZWQgU3RhdHVzIGJ5IEZpZWxkIFBFUk0gV1Agb3IgVEVNUCBXUCAqLworCWlmIChjaGVja193cCkgeworCQlpZiAocnNwWzE1XSAmIDB4MzApCisJCQljaGlwLT5jYXJkX3dwIHw9IFNEX0NBUkQ7CisJCVJUUzUxWF9ERUJVR1AoIkNTRCBXUCBTdGF0dXM6IDB4JXhcbiIsIHJzcFsxNV0pOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzZF9zZXRfc2FtcGxlX3B1c2hfdGltaW5nKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CisJaW50IHJldHZhbDsKKworCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCWlmIChDSEtfU0RfU0RSMTA0KHNkX2NhcmQpIHx8IENIS19TRF9TRFI1MChzZF9jYXJkKSkgeworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9DRkcxLAorCQkJICAgICAgIDB4MEMgfCBTRF9BU1lOQ19GSUZPX1JTVCwKKwkJCSAgICAgICBTRF8zMF9NT0RFIHwgU0RfQVNZTkNfRklGT19SU1QpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX0NMS19TT1VSQ0UsIDB4RkYsCisJCQkgICAgICAgQ1JDX1ZBUl9DTEswIHwgU0QzMF9GSVhfQ0xLIHwgU0FNUExFX1ZBUl9DTEsxKTsKKwl9IGVsc2UgaWYgKENIS19TRF9ERFI1MChzZF9jYXJkKSB8fCBDSEtfTU1DX0REUjUyKHNkX2NhcmQpKSB7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0NGRzEsCisJCQkgICAgICAgMHgwQyB8IFNEX0FTWU5DX0ZJRk9fUlNULAorCQkJICAgICAgIFNEX0REUl9NT0RFIHwgU0RfQVNZTkNfRklGT19SU1QpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX0NMS19TT1VSQ0UsIDB4RkYsCisJCQkgICAgICAgQ1JDX1ZBUl9DTEswIHwgU0QzMF9GSVhfQ0xLIHwgU0FNUExFX1ZBUl9DTEsxKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfUFVTSF9QT0lOVF9DVEwsCisJCQkgICAgICAgRERSX1ZBUl9UWF9DTURfREFULCBERFJfVkFSX1RYX0NNRF9EQVQpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9TQU1QTEVfUE9JTlRfQ1RMLAorCQkJICAgICAgIEREUl9WQVJfUlhfREFUIHwgRERSX1ZBUl9SWF9DTUQsCisJCQkgICAgICAgRERSX1ZBUl9SWF9EQVQgfCBERFJfVkFSX1JYX0NNRCk7CisJfSBlbHNlIHsKKwkJdTggdmFsID0gMDsKKworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9DRkcxLCAweDBDLCBTRF8yMF9NT0RFKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9DTEtfU09VUkNFLCAweEZGLAorCQkJICAgICAgIENSQ19GSVhfQ0xLIHwgU0QzMF9WQVJfQ0xLMCB8IFNBTVBMRV9WQVJfQ0xLMSk7CisKKwkJaWYgKChjaGlwLT5vcHRpb24uc2RfY3RsICYgU0RfUFVTSF9QT0lOVF9DVExfTUFTSykgPT0KKwkJICAgIFNEX1BVU0hfUE9JTlRfQVVUTykgeworCQkJdmFsID0gU0QyMF9UWF9ORUdfRURHRTsKKwkJfSBlbHNlIGlmICgoY2hpcC0+b3B0aW9uLnNkX2N0bCAmIFNEX1BVU0hfUE9JTlRfQ1RMX01BU0spID09CisJCQkgICBTRF9QVVNIX1BPSU5UX0RFTEFZKSB7CisJCQl2YWwgPSBTRDIwX1RYXzE0X0FIRUFEOworCQl9IGVsc2UgeworCQkJdmFsID0gU0QyMF9UWF9ORUdfRURHRTsKKwkJfQorCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9QVVNIX1BPSU5UX0NUTCwKKwkJCSAgICAgICBTRDIwX1RYX1NFTF9NQVNLLCB2YWwpOworCisJCWlmICgoY2hpcC0+b3B0aW9uLnNkX2N0bCAmIFNEX1NBTVBMRV9QT0lOVF9DVExfTUFTSykgPT0KKwkJICAgIFNEX1NBTVBMRV9QT0lOVF9BVVRPKSB7CisJCQlpZiAoY2hpcC0+YXNpY19jb2RlKSB7CisJCQkJaWYgKENIS19TRF9IUyhzZF9jYXJkKSB8fCBDSEtfTU1DXzUyTShzZF9jYXJkKSkKKwkJCQkJdmFsID0gU0QyMF9SWF8xNF9ERUxBWTsKKwkJCQllbHNlCisJCQkJCXZhbCA9IFNEMjBfUlhfUE9TX0VER0U7CisJCQl9IGVsc2UgeworCQkJCXZhbCA9IFNEMjBfUlhfMTRfREVMQVk7CisJCQl9CisJCX0gZWxzZSBpZiAoKGNoaXAtPm9wdGlvbi5zZF9jdGwgJiBTRF9TQU1QTEVfUE9JTlRfQ1RMX01BU0spID09CisJCQkgICBTRF9TQU1QTEVfUE9JTlRfREVMQVkpIHsKKwkJCXZhbCA9IFNEMjBfUlhfMTRfREVMQVk7CisJCX0gZWxzZSB7CisJCQl2YWwgPSBTRDIwX1JYX1BPU19FREdFOworCQl9CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX1NBTVBMRV9QT0lOVF9DVEwsCisJCQkgICAgICAgU0QyMF9SWF9TRUxfTUFTSywgdmFsKTsKKwl9CisKKwlpZiAoQ0hLX01NQ19ERFI1MihzZF9jYXJkKSAmJiBDSEtfTU1DXzhCSVQoc2RfY2FyZCkpIHsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9ETUExX0NUTCwKKwkJCSAgICAgICBFWFRFTkRfRE1BMV9BU1lOQ19TSUdOQUwsIDApOworCX0KKworCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0MsIDEwMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIHNkX2Nob29zZV9wcm9wZXJfY2xvY2soc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKworCWlmIChDSEtfU0RfU0RSMTA0KHNkX2NhcmQpKSB7CisJCWlmIChjaGlwLT5hc2ljX2NvZGUpCisJCQlzZF9jYXJkLT5zZF9jbG9jayA9IGNoaXAtPm9wdGlvbi5hc2ljX3NkX3NkcjEwNF9jbGs7CisJCWVsc2UKKwkJCXNkX2NhcmQtPnNkX2Nsb2NrID0gY2hpcC0+b3B0aW9uLmZwZ2Ffc2Rfc2RyMTA0X2NsazsKKwl9IGVsc2UgaWYgKENIS19TRF9ERFI1MChzZF9jYXJkKSkgeworCQlpZiAoY2hpcC0+YXNpY19jb2RlKQorCQkJc2RfY2FyZC0+c2RfY2xvY2sgPSBjaGlwLT5vcHRpb24uYXNpY19zZF9kZHI1MF9jbGs7CisJCWVsc2UKKwkJCXNkX2NhcmQtPnNkX2Nsb2NrID0gY2hpcC0+b3B0aW9uLmZwZ2Ffc2RfZGRyNTBfY2xrOworCX0gZWxzZSBpZiAoQ0hLX1NEX1NEUjUwKHNkX2NhcmQpKSB7CisJCWlmIChjaGlwLT5hc2ljX2NvZGUpCisJCQlzZF9jYXJkLT5zZF9jbG9jayA9IGNoaXAtPm9wdGlvbi5hc2ljX3NkX3NkcjUwX2NsazsKKwkJZWxzZQorCQkJc2RfY2FyZC0+c2RfY2xvY2sgPSBjaGlwLT5vcHRpb24uZnBnYV9zZF9zZHI1MF9jbGs7CisJfSBlbHNlIGlmIChDSEtfU0RfSFMoc2RfY2FyZCkpIHsKKwkJaWYgKGNoaXAtPmFzaWNfY29kZSkKKwkJCXNkX2NhcmQtPnNkX2Nsb2NrID0gY2hpcC0+b3B0aW9uLmFzaWNfc2RfaHNfY2xrOworCQllbHNlCisJCQlzZF9jYXJkLT5zZF9jbG9jayA9IGNoaXAtPm9wdGlvbi5mcGdhX3NkX2hzX2NsazsKKwl9IGVsc2UgaWYgKENIS19NTUNfNTJNKHNkX2NhcmQpIHx8IENIS19NTUNfRERSNTIoc2RfY2FyZCkpIHsKKwkJaWYgKGNoaXAtPmFzaWNfY29kZSkKKwkJCXNkX2NhcmQtPnNkX2Nsb2NrID0gY2hpcC0+b3B0aW9uLmFzaWNfbW1jXzUybV9jbGs7CisJCWVsc2UKKwkJCXNkX2NhcmQtPnNkX2Nsb2NrID0gY2hpcC0+b3B0aW9uLmZwZ2FfbW1jXzUybV9jbGs7CisJfSBlbHNlIGlmIChDSEtfTU1DXzI2TShzZF9jYXJkKSkgeworCQlpZiAoY2hpcC0+YXNpY19jb2RlKSB7CisJCQlzZF9jYXJkLT5zZF9jbG9jayA9IDQ2OworCQkJUlRTNTFYX0RFQlVHUCgiU2V0IE1NQyBjbG9jayB0byAyMi41TUh6XG4iKTsKKwkJfSBlbHNlIHsKKwkJCXNkX2NhcmQtPnNkX2Nsb2NrID0gQ0xLXzUwOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHNkX3NldF9pbml0X3BhcmEoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gc2Rfc2V0X3NhbXBsZV9wdXNoX3RpbWluZyhjaGlwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXNkX2Nob29zZV9wcm9wZXJfY2xvY2soY2hpcCk7CisKKwlyZXR2YWwgPSBzd2l0Y2hfY2xvY2soY2hpcCwgc2RfY2FyZC0+c2RfY2xvY2spOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitpbnQgc2Rfc2VsZWN0X2NhcmQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCBpbnQgc2VsZWN0KQoreworCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKwlpbnQgcmV0dmFsOworCXU4IGNtZF9pZHgsIGNtZF90eXBlOworCXUzMiBhZGRyOworCisJaWYgKHNlbGVjdCkgeworCQljbWRfaWR4ID0gU0VMRUNUX0NBUkQ7CisJCWNtZF90eXBlID0gU0RfUlNQX1RZUEVfUjE7CisJCWFkZHIgPSBzZF9jYXJkLT5zZF9hZGRyOworCX0gZWxzZSB7CisJCWNtZF9pZHggPSBERVNFTEVDVF9DQVJEOworCQljbWRfdHlwZSA9IFNEX1JTUF9UWVBFX1IwOworCQlhZGRyID0gMDsKKwl9CisKKwlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIGNtZF9pZHgsIGFkZHIsIGNtZF90eXBlLCBOVUxMLCAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworI2lmZGVmIFNVUFBPUlRfU0RfTE9DSworaW50IHNkX3VwZGF0ZV9sb2NrX3N0YXR1cyhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOworCWludCByZXR2YWw7CisJdTggcnNwWzVdOworCisJcmV0dmFsID0KKwkgICAgc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRU5EX1NUQVRVUywgc2RfY2FyZC0+c2RfYWRkciwKKwkJCQlTRF9SU1BfVFlQRV9SMSwgcnNwLCA1KTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJaWYgKHJzcFsxXSAmIDB4MDIpCisJCXNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzIHw9IFNEX0xPQ0tFRDsKKwllbHNlCisJCXNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzICY9IH5TRF9MT0NLRUQ7CisKKwlSVFM1MVhfREVCVUdQKCJzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyA9IDB4JXhcbiIsCisJCSAgICAgICBzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyk7CisKKwlpZiAocnNwWzFdICYgMHgwMSkgeworCQkvKiBMT0NLX1VOTE9DS19GQUlMRUQgKi8KKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwl9CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworaW50IHNkX3dhaXRfY3VycmVudHN0YXRlX2RhdGFyZWFkeShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IHN0YXRlY2hrLAorCQkJCSAgIHU4IHJkeWNoaywgdTE2IHBvbGxpbmdjbnQpCit7CisJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOworCWludCByZXR2YWw7CisJdTggcnNwWzVdOworCXUxNiBpOworCisJZm9yIChpID0gMDsgaSA8IHBvbGxpbmdjbnQ7IGkrKykgeworCisJCXJldHZhbCA9CisJCSAgICBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFTkRfU1RBVFVTLCBzZF9jYXJkLT5zZF9hZGRyLAorCQkJCQlTRF9SU1BfVFlQRV9SMSwgcnNwLCA1KTsKKwkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykgeworCQkJaWYgKCgocnNwWzNdICYgMHgxRSkgPT0gc3RhdGVjaGspCisJCQkgICAgJiYgKChyc3BbM10gJiAweDAxKSA9PSByZHljaGspKSB7CisJCQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworCQkJfQorCQl9IGVsc2UgeworCQkJcnRzNTF4X2NsZWFyX3NkX2Vycm9yKGNoaXApOworCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJfQorCX0KKworCXJldHVybiBTVEFUVVNfVElNRURPVVQ7Cit9CisKK3N0YXRpYyBpbnQgc2Rfdm9sdGFnZV9zd2l0Y2goc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCWludCByZXR2YWw7CisJdTggc3RhdDsKKworCVJUUzUxWF9XUklURV9SRUcoY2hpcCwgU0RfQlVTX1NUQVQsCisJCQkgU0RfQ0xLX1RPR0dMRV9FTiB8IFNEX0NMS19GT1JDRV9TVE9QLAorCQkJIFNEX0NMS19UT0dHTEVfRU4pOworCisJcmV0dmFsID0KKwkgICAgc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBWT0xUQUdFX1NXSVRDSCwgMCwgU0RfUlNQX1RZUEVfUjEsIE5VTEwsCisJCQkJMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlSVFM1MVhfUkVBRF9SRUcoY2hpcCwgU0RfQlVTX1NUQVQsICZzdGF0KTsKKwlpZiAoc3RhdCAmIChTRF9DTURfU1RBVFVTIHwgU0RfREFUM19TVEFUVVMgfCBTRF9EQVQyX1NUQVRVUyB8CisJCSAgICBTRF9EQVQxX1NUQVRVUyB8IFNEX0RBVDBfU1RBVFVTKSkKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKworCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9CVVNfU1RBVCwgMHhGRiwKKwkJICAgICAgIFNEX0NMS19GT1JDRV9TVE9QKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9QQURfQ1RMLCBTRF9JT19VU0lOR18xVjgsCisJCSAgICAgICBTRF9JT19VU0lOR18xVjgpOworCWlmIChjaGlwLT5hc2ljX2NvZGUpCisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIExET19QT1dFUl9DRkcsCisJCQkgICAgICAgVFVORV9TRDE4X01BU0ssIFRVTkVfU0QxOF8xVjgpOworCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0MsIDEwMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwl3YWl0X3RpbWVvdXQoY2hpcC0+b3B0aW9uLkQzMzE4X29mZl9kZWxheSk7CisKKwlSVFM1MVhfV1JJVEVfUkVHKGNoaXAsIFNEX0JVU19TVEFULCAweEZGLCBTRF9DTEtfVE9HR0xFX0VOKTsKKwl3YWl0X3RpbWVvdXQoMTApOworCisJUlRTNTFYX1JFQURfUkVHKGNoaXAsIFNEX0JVU19TVEFULCAmc3RhdCk7CisJaWYgKChzdGF0ICYgKFNEX0NNRF9TVEFUVVMgfCBTRF9EQVQzX1NUQVRVUyB8IFNEX0RBVDJfU1RBVFVTIHwKKwkJICAgICBTRF9EQVQxX1NUQVRVUyB8IFNEX0RBVDBfU1RBVFVTKSkgIT0KKwkgICAgKFNEX0NNRF9TVEFUVVMgfCBTRF9EQVQzX1NUQVRVUyB8IFNEX0RBVDJfU1RBVFVTIHwKKwkgICAgIFNEX0RBVDFfU1RBVFVTIHwgU0RfREFUMF9TVEFUVVMpKSB7CisJCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQlVTX1NUQVQsIDB4RkYsCisJCQkgICAgICAgU0RfQ0xLX0ZPUkNFX1NUT1ApOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX0NMS19FTiwgMHhGRiwgMCk7CisJCXJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0MsIDEwMCk7CisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJfQorCVJUUzUxWF9XUklURV9SRUcoY2hpcCwgU0RfQlVTX1NUQVQsCisJCQkgU0RfQ0xLX1RPR0dMRV9FTiB8IFNEX0NMS19GT1JDRV9TVE9QLCAwKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzZF9jaGFuZ2VfcGhhc2Uoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCBzYW1wbGVfcG9pbnQsCisJCQkgICB1OCB0dW5lX2RpcikKK3sKKwl1MTYgU0RfVlBfQ1RMLCBTRF9EQ01QU19DVEw7CisJdTggdmFsOworCWludCByZXR2YWw7CisKKwlSVFM1MVhfREVCVUdQKCJzZF9jaGFuZ2VfcGhhc2UgKHNhbXBsZV9wb2ludCA9ICVkLCB0dW5lX2RpciA9ICVkKVxuIiwKKwkJICAgICAgIHNhbXBsZV9wb2ludCwgdHVuZV9kaXIpOworCisJaWYgKHR1bmVfZGlyID09IFRVTkVfUlgpIHsKKwkJU0RfVlBfQ1RMID0gU0RfVlBDTEsxX0NUTDsKKwkJU0RfRENNUFNfQ1RMID0gU0RfRENNUFMxX0NUTDsKKwl9IGVsc2UgeworCQlTRF9WUF9DVEwgPSBTRF9WUENMSzBfQ1RMOworCQlTRF9EQ01QU19DVEwgPSBTRF9EQ01QUzBfQ1RMOworCX0KKworCWlmIChjaGlwLT5hc2ljX2NvZGUpIHsKKwkJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBDTEtfRElWLCBDTEtfQ0hBTkdFLCBDTEtfQ0hBTkdFKTsKKwkJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBTRF9WUF9DVEwsIDB4MUYsIHNhbXBsZV9wb2ludCk7CisJCVJUUzUxWF9XUklURV9SRUcoY2hpcCwgU0RfVlBDTEswX0NUTCwgUEhBU0VfTk9UX1JFU0VULCAwKTsKKwkJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBTRF9WUENMSzBfQ1RMLCBQSEFTRV9OT1RfUkVTRVQsCisJCQkJIFBIQVNFX05PVF9SRVNFVCk7CisJCVJUUzUxWF9XUklURV9SRUcoY2hpcCwgQ0xLX0RJViwgQ0xLX0NIQU5HRSwgMCk7CisJfSBlbHNlIHsKKyNpZmRlZiBDT05GSUdfUlRTNTEzOV9ERUJVRworCQlSVFM1MVhfUkVBRF9SRUcoY2hpcCwgU0RfVlBfQ1RMLCAmdmFsKTsKKwkJUlRTNTFYX0RFQlVHUCgiU0RfVlBfQ1RMOiAweCV4XG4iLCB2YWwpOworCQlSVFM1MVhfUkVBRF9SRUcoY2hpcCwgU0RfRENNUFNfQ1RMLCAmdmFsKTsKKwkJUlRTNTFYX0RFQlVHUCgiU0RfRENNUFNfQ1RMOiAweCV4XG4iLCB2YWwpOworI2VuZGlmCisKKwkJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBDTEtfRElWLCBDTEtfQ0hBTkdFLCBDTEtfQ0hBTkdFKTsKKwkJdWRlbGF5KDEwMCk7CisJCVJUUzUxWF9XUklURV9SRUcoY2hpcCwgU0RfVlBfQ1RMLCAweEZGLAorCQkJCSBQSEFTRV9OT1RfUkVTRVQgfCBzYW1wbGVfcG9pbnQpOworCQl1ZGVsYXkoMjAwKTsKKworCQlydHM1MXhfaW5pdF9jbWQoY2hpcCk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0RDTVBTX0NUTCwgRENNUFNfQ0hBTkdFLAorCQkJICAgICAgIERDTVBTX0NIQU5HRSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIENIRUNLX1JFR19DTUQsIFNEX0RDTVBTX0NUTCwKKwkJCSAgICAgICBEQ01QU19DSEFOR0VfRE9ORSwgRENNUFNfQ0hBTkdFX0RPTkUpOworCQlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DUiwgMTAwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX0dPVE8oY2hpcCwgRmFpbCk7CisKKwkJcmV0dmFsID0gcnRzNTF4X2dldF9yc3AoY2hpcCwgMSwgNTAwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX0dPVE8oY2hpcCwgRmFpbCk7CisKKwkJdmFsID0gY2hpcC0+cnNwX2J1ZlswXTsKKwkJaWYgKHZhbCAmIERDTVBTX0VSUk9SKQorCQkJVFJBQ0VfR09UTyhjaGlwLCBGYWlsKTsKKwkJaWYgKCh2YWwgJiBEQ01QU19DVVJSRU5UX1BIQVNFKSAhPSBzYW1wbGVfcG9pbnQpCisJCQlUUkFDRV9HT1RPKGNoaXAsIEZhaWwpOworCQlSVFM1MVhfV1JJVEVfUkVHKGNoaXAsIFNEX0RDTVBTX0NUTCwgRENNUFNfQ0hBTkdFLCAwKTsKKwkJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBDTEtfRElWLCBDTEtfQ0hBTkdFLCAwKTsKKwkJdWRlbGF5KDEwMCk7CisJfQorCisJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBTRF9DRkcxLCBTRF9BU1lOQ19GSUZPX1JTVCwgMCk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CisKK0ZhaWw6CisjaWZkZWYgQ09ORklHX1JUUzUxMzlfREVCVUcKKwlydHM1MXhfZXAwX3JlYWRfcmVnaXN0ZXIoY2hpcCwgU0RfVlBfQ1RMLCAmdmFsKTsKKwlSVFM1MVhfREVCVUdQKCJTRF9WUF9DVEw6IDB4JXhcbiIsIHZhbCk7CisJcnRzNTF4X2VwMF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFNEX0RDTVBTX0NUTCwgJnZhbCk7CisJUlRTNTFYX0RFQlVHUCgiU0RfRENNUFNfQ1RMOiAweCV4XG4iLCB2YWwpOworI2VuZGlmCisKKwlSVFM1MVhfV1JJVEVfUkVHKGNoaXAsIFNEX0RDTVBTX0NUTCwgRENNUFNfQ0hBTkdFLCAwKTsKKwlSVFM1MVhfV1JJVEVfUkVHKGNoaXAsIFNEX1ZQX0NUTCwgUEhBU0VfQ0hBTkdFLCAwKTsKKwl3YWl0X3RpbWVvdXQoMTApOworCisJcmV0dXJuIFNUQVRVU19GQUlMOworfQorCitzdGF0aWMgaW50IHNkX2NoZWNrX3NwZWMoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCBidXNfd2lkdGgpCit7CisJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOworCWludCByZXR2YWw7CisJdTggY21kWzVdLCBidWZbOF07CisKKwlyZXR2YWwgPQorCSAgICBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEFQUF9DTUQsIHNkX2NhcmQtPnNkX2FkZHIsIFNEX1JTUF9UWVBFX1IxLAorCQkJCU5VTEwsIDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwljbWRbMF0gPSAweDQwIHwgU0VORF9TQ1I7CisJY21kWzFdID0gMDsKKwljbWRbMl0gPSAwOworCWNtZFszXSA9IDA7CisJY21kWzRdID0gMDsKKworCXJldHZhbCA9CisJICAgIHNkX3JlYWRfZGF0YShjaGlwLCBTRF9UTV9OT1JNQUxfUkVBRCwgY21kLCA1LCA4LCAxLCBidXNfd2lkdGgsIGJ1ZiwKKwkJCSA4LCAyNTApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzNTF4X2NsZWFyX3NkX2Vycm9yKGNoaXApOworCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwl9CisKKwltZW1jcHkoc2RfY2FyZC0+cmF3X3NjciwgYnVmLCA4KTsKKworCWlmICgoYnVmWzBdICYgMHgwRikgPT0gMCkKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzZF9xdWVyeV9zd2l0Y2hfcmVzdWx0KHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggZnVuY19ncm91cCwKKwkJCQkgIHU4IGZ1bmNfdG9fc3dpdGNoLCB1OCAqYnVmLCBpbnQgYnVmX2xlbikKK3sKKwl1OCBzdXBwb3J0X21hc2sgPSAwLCBxdWVyeV9zd2l0Y2ggPSAwLCBzd2l0Y2hfYnVzeSA9IDA7CisJaW50IHN1cHBvcnRfb2Zmc2V0ID0gMCwgcXVlcnlfc3dpdGNoX29mZnNldCA9IDAsIGNoZWNrX2J1c3lfb2Zmc2V0ID0gMDsKKworCWlmIChmdW5jX2dyb3VwID09IFNEX0ZVTkNfR1JPVVBfMSkgeworCQlzdXBwb3J0X29mZnNldCA9IEZVTkNUSU9OX0dST1VQMV9TVVBQT1JUX09GRlNFVDsKKwkJcXVlcnlfc3dpdGNoX29mZnNldCA9IEZVTkNUSU9OX0dST1VQMV9RVUVSWV9TV0lUQ0hfT0ZGU0VUOworCQljaGVja19idXN5X29mZnNldCA9IEZVTkNUSU9OX0dST1VQMV9DSEVDS19CVVNZX09GRlNFVDsKKworCQlzd2l0Y2ggKGZ1bmNfdG9fc3dpdGNoKSB7CisJCWNhc2UgSFNfU1VQUE9SVDoKKwkJCXN1cHBvcnRfbWFzayA9IEhTX1NVUFBPUlRfTUFTSzsKKwkJCXF1ZXJ5X3N3aXRjaCA9IEhTX1FVRVJZX1NXSVRDSF9PSzsKKwkJCXN3aXRjaF9idXN5ID0gSFNfU1dJVENIX0JVU1k7CisJCQlicmVhazsKKworCQljYXNlIFNEUjUwX1NVUFBPUlQ6CisJCQlzdXBwb3J0X21hc2sgPSBTRFI1MF9TVVBQT1JUX01BU0s7CisJCQlxdWVyeV9zd2l0Y2ggPSBTRFI1MF9RVUVSWV9TV0lUQ0hfT0s7CisJCQlzd2l0Y2hfYnVzeSA9IFNEUjUwX1NXSVRDSF9CVVNZOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRFIxMDRfU1VQUE9SVDoKKwkJCXN1cHBvcnRfbWFzayA9IFNEUjEwNF9TVVBQT1JUX01BU0s7CisJCQlxdWVyeV9zd2l0Y2ggPSBTRFIxMDRfUVVFUllfU1dJVENIX09LOworCQkJc3dpdGNoX2J1c3kgPSBTRFIxMDRfU1dJVENIX0JVU1k7CisJCQlicmVhazsKKworCQljYXNlIEREUjUwX1NVUFBPUlQ6CisJCQlzdXBwb3J0X21hc2sgPSBERFI1MF9TVVBQT1JUX01BU0s7CisJCQlxdWVyeV9zd2l0Y2ggPSBERFI1MF9RVUVSWV9TV0lUQ0hfT0s7CisJCQlzd2l0Y2hfYnVzeSA9IEREUjUwX1NXSVRDSF9CVVNZOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCX0KKwl9IGVsc2UgaWYgKGZ1bmNfZ3JvdXAgPT0gU0RfRlVOQ19HUk9VUF8zKSB7CisJCXN1cHBvcnRfb2Zmc2V0ID0gRlVOQ1RJT05fR1JPVVAzX1NVUFBPUlRfT0ZGU0VUOworCQlxdWVyeV9zd2l0Y2hfb2Zmc2V0ID0gRlVOQ1RJT05fR1JPVVAzX1FVRVJZX1NXSVRDSF9PRkZTRVQ7CisJCWNoZWNrX2J1c3lfb2Zmc2V0ID0gRlVOQ1RJT05fR1JPVVAzX0NIRUNLX0JVU1lfT0ZGU0VUOworCisJCXN3aXRjaCAoZnVuY190b19zd2l0Y2gpIHsKKwkJY2FzZSBEUklWSU5HX1RZUEVfQToKKwkJCXN1cHBvcnRfbWFzayA9IERSSVZJTkdfVFlQRV9BX01BU0s7CisJCQlxdWVyeV9zd2l0Y2ggPSBUWVBFX0FfUVVFUllfU1dJVENIX09LOworCQkJc3dpdGNoX2J1c3kgPSBUWVBFX0FfU1dJVENIX0JVU1k7CisJCQlicmVhazsKKworCQljYXNlIERSSVZJTkdfVFlQRV9DOgorCQkJc3VwcG9ydF9tYXNrID0gRFJJVklOR19UWVBFX0NfTUFTSzsKKwkJCXF1ZXJ5X3N3aXRjaCA9IFRZUEVfQ19RVUVSWV9TV0lUQ0hfT0s7CisJCQlzd2l0Y2hfYnVzeSA9IFRZUEVfQ19TV0lUQ0hfQlVTWTsKKwkJCWJyZWFrOworCisJCWNhc2UgRFJJVklOR19UWVBFX0Q6CisJCQlzdXBwb3J0X21hc2sgPSBEUklWSU5HX1RZUEVfRF9NQVNLOworCQkJcXVlcnlfc3dpdGNoID0gVFlQRV9EX1FVRVJZX1NXSVRDSF9PSzsKKwkJCXN3aXRjaF9idXN5ID0gVFlQRV9EX1NXSVRDSF9CVVNZOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCX0KKwl9IGVsc2UgaWYgKGZ1bmNfZ3JvdXAgPT0gU0RfRlVOQ19HUk9VUF80KSB7CisJCXN1cHBvcnRfb2Zmc2V0ID0gRlVOQ1RJT05fR1JPVVA0X1NVUFBPUlRfT0ZGU0VUOworCQlxdWVyeV9zd2l0Y2hfb2Zmc2V0ID0gRlVOQ1RJT05fR1JPVVA0X1FVRVJZX1NXSVRDSF9PRkZTRVQ7CisJCWNoZWNrX2J1c3lfb2Zmc2V0ID0gRlVOQ1RJT05fR1JPVVA0X0NIRUNLX0JVU1lfT0ZGU0VUOworCisJCXN3aXRjaCAoZnVuY190b19zd2l0Y2gpIHsKKwkJY2FzZSBDVVJSRU5UX0xJTUlUXzQwMDoKKwkJCXN1cHBvcnRfbWFzayA9IENVUlJFTlRfTElNSVRfNDAwX01BU0s7CisJCQlxdWVyeV9zd2l0Y2ggPSBDVVJSRU5UX0xJTUlUXzQwMF9RVUVSWV9TV0lUQ0hfT0s7CisJCQlzd2l0Y2hfYnVzeSA9IENVUlJFTlRfTElNSVRfNDAwX1NXSVRDSF9CVVNZOworCQkJYnJlYWs7CisKKwkJY2FzZSBDVVJSRU5UX0xJTUlUXzYwMDoKKwkJCXN1cHBvcnRfbWFzayA9IENVUlJFTlRfTElNSVRfNjAwX01BU0s7CisJCQlxdWVyeV9zd2l0Y2ggPSBDVVJSRU5UX0xJTUlUXzYwMF9RVUVSWV9TV0lUQ0hfT0s7CisJCQlzd2l0Y2hfYnVzeSA9IENVUlJFTlRfTElNSVRfNjAwX1NXSVRDSF9CVVNZOworCQkJYnJlYWs7CisKKwkJY2FzZSBDVVJSRU5UX0xJTUlUXzgwMDoKKwkJCXN1cHBvcnRfbWFzayA9IENVUlJFTlRfTElNSVRfODAwX01BU0s7CisJCQlxdWVyeV9zd2l0Y2ggPSBDVVJSRU5UX0xJTUlUXzgwMF9RVUVSWV9TV0lUQ0hfT0s7CisJCQlzd2l0Y2hfYnVzeSA9IENVUlJFTlRfTElNSVRfODAwX1NXSVRDSF9CVVNZOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCX0KKwl9IGVsc2UgeworCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCX0KKworCWlmIChmdW5jX2dyb3VwID09IFNEX0ZVTkNfR1JPVVBfNCkKKwkJYnVmW3F1ZXJ5X3N3aXRjaF9vZmZzZXRdID0KKwkJICAgIChidWZbcXVlcnlfc3dpdGNoX29mZnNldF0gJiAweGYwKSA+PiA0OworCWlmICghKGJ1ZltzdXBwb3J0X29mZnNldF0gJiBzdXBwb3J0X21hc2spIHx8CisJICAgICgoYnVmW3F1ZXJ5X3N3aXRjaF9vZmZzZXRdICYgMHgwRikgIT0gcXVlcnlfc3dpdGNoKSkKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKworCWlmICgoYnVmW0RBVEFfU1RSVUNUVVJFX1ZFUl9PRkZTRVRdID09IDB4MDEpICYmCisJICAgICgoYnVmW2NoZWNrX2J1c3lfb2Zmc2V0XSAmIHN3aXRjaF9idXN5KSA9PSBzd2l0Y2hfYnVzeSkpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgc2RfY2hlY2tfc3dpdGNoX21vZGUoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCBtb2RlLAorCQkJCXU4IGZ1bmNfZ3JvdXAsIHU4IGZ1bmNfdG9fc3dpdGNoLCB1OCBidXNfd2lkdGgpCit7CisJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOworCWludCByZXR2YWw7CisJdTggY21kWzVdLCBidWZbNjRdOworCisJUlRTNTFYX0RFQlVHUCgic2RfY2hlY2tfc3dpdGNoX21vZGUgKG1vZGUgPSAlZCwgZnVuY19ncm91cCA9ICVkLCIKKwkJImZ1bmNfdG9fc3dpdGNoID0gJWQpXG4iLCBtb2RlLCBmdW5jX2dyb3VwLCBmdW5jX3RvX3N3aXRjaCk7CisKKwljbWRbMF0gPSAweDQwIHwgU1dJVENIOworCWNtZFsxXSA9IG1vZGU7CisKKwlpZiAoZnVuY19ncm91cCA9PSBTRF9GVU5DX0dST1VQXzEpIHsKKwkJY21kWzJdID0gMHhGRjsKKwkJY21kWzNdID0gMHhGRjsKKwkJY21kWzRdID0gMHhGMCArIGZ1bmNfdG9fc3dpdGNoOworCX0gZWxzZSBpZiAoZnVuY19ncm91cCA9PSBTRF9GVU5DX0dST1VQXzMpIHsKKwkJY21kWzJdID0gMHhGRjsKKwkJY21kWzNdID0gMHhGMCArIGZ1bmNfdG9fc3dpdGNoOworCQljbWRbNF0gPSAweEZGOworCX0gZWxzZSBpZiAoZnVuY19ncm91cCA9PSBTRF9GVU5DX0dST1VQXzQpIHsKKwkJY21kWzJdID0gMHhGRjsKKwkJY21kWzNdID0gMHgwRiArIChmdW5jX3RvX3N3aXRjaCA8PCA0KTsKKwkJY21kWzRdID0gMHhGRjsKKwl9IGVsc2UgeworCQljbWRbMV0gPSBTRF9DSEVDS19NT0RFOworCQljbWRbMl0gPSAweEZGOworCQljbWRbM10gPSAweEZGOworCQljbWRbNF0gPSAweEZGOworCX0KKworCXJldHZhbCA9CisJICAgIHNkX3JlYWRfZGF0YShjaGlwLCBTRF9UTV9OT1JNQUxfUkVBRCwgY21kLCA1LCA2NCwgMSwgYnVzX3dpZHRoLCBidWYsCisJCQkgNjQsIDI1MCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHM1MXhfY2xlYXJfc2RfZXJyb3IoY2hpcCk7CisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKworCWlmIChmdW5jX2dyb3VwID09IE5PX0FSR1VNRU5UKSB7CisJCXNkX2NhcmQtPmZ1bmNfZ3JvdXAxX21hc2sgPSBidWZbMHgwRF07CisJCXNkX2NhcmQtPmZ1bmNfZ3JvdXAyX21hc2sgPSBidWZbMHgwQl07CisJCXNkX2NhcmQtPmZ1bmNfZ3JvdXAzX21hc2sgPSBidWZbMHgwOV07CisJCXNkX2NhcmQtPmZ1bmNfZ3JvdXA0X21hc2sgPSBidWZbMHgwN107CisKKwkJUlRTNTFYX0RFQlVHUCgiZnVuY19ncm91cDFfbWFzayA9IDB4JTAyeFxuIiwgYnVmWzB4MERdKTsKKwkJUlRTNTFYX0RFQlVHUCgiZnVuY19ncm91cDJfbWFzayA9IDB4JTAyeFxuIiwgYnVmWzB4MEJdKTsKKwkJUlRTNTFYX0RFQlVHUCgiZnVuY19ncm91cDNfbWFzayA9IDB4JTAyeFxuIiwgYnVmWzB4MDldKTsKKwkJUlRTNTFYX0RFQlVHUCgiZnVuY19ncm91cDRfbWFzayA9IDB4JTAyeFxuIiwgYnVmWzB4MDddKTsKKwl9IGVsc2UgeworCQlpZiAoKGJ1ZlswXSA9PSAwKSAmJiAoYnVmWzFdID09IDApKQorCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcmV0dmFsID0KKwkJICAgIHNkX3F1ZXJ5X3N3aXRjaF9yZXN1bHQoY2hpcCwgZnVuY19ncm91cCwgZnVuY190b19zd2l0Y2gsCisJCQkJCSAgIGJ1ZiwgNjQpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJfQorCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IHNkX2NoZWNrX3N3aXRjaChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsCisJCQkgICB1OCBmdW5jX2dyb3VwLCB1OCBmdW5jX3RvX3N3aXRjaCwgdTggYnVzX3dpZHRoKQoreworCWludCByZXR2YWw7CisJaW50IGk7CisJaW50IHN3aXRjaF9nb29kID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJaWYgKG1vbml0b3JfY2FyZF9jZChjaGlwLCBTRF9DQVJEKSA9PSBDRF9OT1RfRVhJU1QpIHsKKwkJCXNkX3NldF9yZXNldF9mYWlsKGNoaXAsIFNEX1JFU0VUX0ZBSUwpOworCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJfQorCisJCXJldHZhbCA9IHNkX2NoZWNrX3N3aXRjaF9tb2RlKGNoaXAsIFNEX0NIRUNLX01PREUsIGZ1bmNfZ3JvdXAsCisJCQkJCSAgICAgIGZ1bmNfdG9fc3dpdGNoLCBidXNfd2lkdGgpOworCQlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKSB7CisJCQl1OCBzdGF0OworCisJCQlyZXR2YWwgPSBzZF9jaGVja19zd2l0Y2hfbW9kZShjaGlwLCBTRF9TV0lUQ0hfTU9ERSwKKwkJCQkJZnVuY19ncm91cCwgZnVuY190b19zd2l0Y2gsIGJ1c193aWR0aCk7CisJCQlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJc3dpdGNoX2dvb2QgPSAxOworCQkJCWJyZWFrOworCQkJfQorCisJCQlSVFM1MVhfUkVBRF9SRUcoY2hpcCwgU0RfU1RBVDEsICZzdGF0KTsKKworCQkJaWYgKHN0YXQgJiBTRF9DUkMxNl9FUlIpIHsKKwkJCQlSVFM1MVhfREVCVUdQKCJTRCBDUkMxNiBlcnJvciB3aGVuIHN3aXRjaGluZyIKKwkJCQkJCQkibW9kZVxuIik7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCX0KKwkJfQorCisJCXdhaXRfdGltZW91dCgyMCk7CisJfQorCisJaWYgKCFzd2l0Y2hfZ29vZCkKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzZF9zd2l0Y2hfZnVuY3Rpb24oc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCBidXNfd2lkdGgpCit7CisJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOworCWludCByZXR2YWw7CisJaW50IGk7CisJdTggZnVuY190b19zd2l0Y2ggPSAwOworCisJLyogR2V0IHN1cHBvcnRlZCBmdW5jdGlvbnMgKi8KKwlyZXR2YWwgPSBzZF9jaGVja19zd2l0Y2hfbW9kZShjaGlwLCBTRF9DSEVDS19NT0RFLAorCQkJCSAgICAgIE5PX0FSR1VNRU5ULCBOT19BUkdVTUVOVCwgYnVzX3dpZHRoKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXNkX2NhcmQtPmZ1bmNfZ3JvdXAxX21hc2sgJj0gfihzZF9jYXJkLT5zZF9zd2l0Y2hfZmFpbCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXN3aXRjaCAoKHU4KSAoY2hpcC0+b3B0aW9uLnNkX3NwZWVkX3ByaW9yID4+IChpICogOCkpKSB7CisJCWNhc2UgRERSNTBfU1VQUE9SVDoKKwkJCWlmICgoc2RfY2FyZC0+ZnVuY19ncm91cDFfbWFzayAmIEREUjUwX1NVUFBPUlRfTUFTSykKKwkJCSAgICAmJiAoQ0hFQ0tfVUhTNTAoY2hpcCkpKQorCQkJCWZ1bmNfdG9fc3dpdGNoID0gRERSNTBfU1VQUE9SVDsKKwkJCWJyZWFrOworCisJCWNhc2UgU0RSNTBfU1VQUE9SVDoKKwkJCWlmICgoc2RfY2FyZC0+ZnVuY19ncm91cDFfbWFzayAmIFNEUjUwX1NVUFBPUlRfTUFTSykKKwkJCSAgICAmJiAoQ0hFQ0tfVUhTNTAoY2hpcCkpKQorCQkJCWZ1bmNfdG9fc3dpdGNoID0gU0RSNTBfU1VQUE9SVDsKKwkJCWJyZWFrOworCisJCWNhc2UgSFNfU1VQUE9SVDoKKwkJCWlmIChzZF9jYXJkLT5mdW5jX2dyb3VwMV9tYXNrICYgSFNfU1VQUE9SVF9NQVNLKQorCQkJCWZ1bmNfdG9fc3dpdGNoID0gSFNfU1VQUE9SVDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChmdW5jX3RvX3N3aXRjaCkKKwkJCWJyZWFrOworCX0KKwlSVFM1MVhfREVCVUdQKCJTRF9GVU5DX0dST1VQXzE6IGZ1bmNfdG9fc3dpdGNoID0gMHglMDJ4IiwKKwkJICAgICAgIGZ1bmNfdG9fc3dpdGNoKTsKKworI2lmZGVmIFNVUFBPUlRfU0RfTE9DSworCWlmICgoc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgJiBTRF9TRFJfUlNUKQorCSAgICAmJiAoRERSNTBfU1VQUE9SVCA9PSBmdW5jX3RvX3N3aXRjaCkKKwkgICAgJiYgKHNkX2NhcmQtPmZ1bmNfZ3JvdXAxX21hc2sgJiBTRFI1MF9TVVBQT1JUX01BU0spKSB7CisJCWZ1bmNfdG9fc3dpdGNoID0gU0RSNTBfU1VQUE9SVDsKKwkJUlRTNTFYX0RFQlVHUCgiVXNpbmcgU0RSNTAgaW5zdGVhZCBvZiBERFI1MCBmb3IgU0QgTG9ja1xuIik7CisJfQorI2VuZGlmCisKKwlpZiAoZnVuY190b19zd2l0Y2gpIHsKKwkJcmV0dmFsID0KKwkJICAgIHNkX2NoZWNrX3N3aXRjaChjaGlwLCBTRF9GVU5DX0dST1VQXzEsIGZ1bmNfdG9fc3dpdGNoLAorCQkJCSAgICBidXNfd2lkdGgpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlpZiAoZnVuY190b19zd2l0Y2ggPT0gU0RSMTA0X1NVUFBPUlQpCisJCQkJc2RfY2FyZC0+c2Rfc3dpdGNoX2ZhaWwgPSBTRFIxMDRfU1VQUE9SVF9NQVNLOworCQkJZWxzZSBpZiAoZnVuY190b19zd2l0Y2ggPT0gRERSNTBfU1VQUE9SVCkKKwkJCQlzZF9jYXJkLT5zZF9zd2l0Y2hfZmFpbCA9IEREUjUwX1NVUFBPUlRfTUFTSzsKKwkJCWVsc2UgaWYgKGZ1bmNfdG9fc3dpdGNoID09IFNEUjUwX1NVUFBPUlQpCisJCQkJc2RfY2FyZC0+c2Rfc3dpdGNoX2ZhaWwgPSBTRFI1MF9TVVBQT1JUX01BU0s7CisJCQllbHNlIGlmIChmdW5jX3RvX3N3aXRjaCA9PSBIU19TVVBQT1JUKQorCQkJCXNkX2NhcmQtPnNkX3N3aXRjaF9mYWlsID0gSFNfU1VQUE9SVF9NQVNLOworCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkJfQorCisJCWlmIChmdW5jX3RvX3N3aXRjaCA9PSBTRFIxMDRfU1VQUE9SVCkKKwkJCVNFVF9TRF9TRFIxMDQoc2RfY2FyZCk7CisJCWVsc2UgaWYgKGZ1bmNfdG9fc3dpdGNoID09IEREUjUwX1NVUFBPUlQpCisJCQlTRVRfU0RfRERSNTAoc2RfY2FyZCk7CisJCWVsc2UgaWYgKGZ1bmNfdG9fc3dpdGNoID09IFNEUjUwX1NVUFBPUlQpCisJCQlTRVRfU0RfU0RSNTAoc2RfY2FyZCk7CisJCWVsc2UKKwkJCVNFVF9TRF9IUyhzZF9jYXJkKTsKKwl9CisKKwlpZiAoQ0hLX1NEX0REUjUwKHNkX2NhcmQpKQorCQlSVFM1MVhfV1JJVEVfUkVHKGNoaXAsIFNEX0NGRzEsIDB4MEMsIFNEX0REUl9NT0RFKTsKKworCWZ1bmNfdG9fc3dpdGNoID0gMDsKKwlpZiAoc2RfY2FyZC0+ZnVuY19ncm91cDRfbWFzayAmIENVUlJFTlRfTElNSVRfNDAwX01BU0spCisJCWZ1bmNfdG9fc3dpdGNoID0gQ1VSUkVOVF9MSU1JVF80MDA7CisKKwlpZiAoZnVuY190b19zd2l0Y2gpIHsKKwkJUlRTNTFYX0RFQlVHUCgiVHJ5IHRvIHN3aXRjaCBjdXJyZW50X2xpbWl0XzQwMFxuIik7CisJCXJldHZhbCA9CisJCSAgICBzZF9jaGVja19zd2l0Y2goY2hpcCwgU0RfRlVOQ19HUk9VUF80LCBmdW5jX3RvX3N3aXRjaCwKKwkJCQkgICAgYnVzX3dpZHRoKTsKKwkJUlRTNTFYX0RFQlVHUCgiU3dpdGNoIGN1cnJlbnRfbGltaXRfNDAwIHN0YXR1czogKCVkKVxuIiwKKwkJCSAgICAgICByZXR2YWwpOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzZF93YWl0X2RhdGFfaWRsZShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJaW50IHJldHZhbCA9IFNUQVRVU19USU1FRE9VVDsKKwlpbnQgaTsKKwl1OCB2YWwgPSAwOworCisJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisJCXJldHZhbCA9IHJ0czUxeF9lcDBfcmVhZF9yZWdpc3RlcihjaGlwLCBTRF9EQVRBX1NUQVRFLCAmdmFsKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmICh2YWwgJiBTRF9EQVRBX0lETEUpIHsKKwkJCXJldHZhbCA9IFNUQVRVU19TVUNDRVNTOworCQkJYnJlYWs7CisJCX0KKwkJdWRlbGF5KDEwMCk7CisJfQorCVJUUzUxWF9ERUJVR1AoIlNEX0RBVEFfU1RBVEU6IDB4JTAyeFxuIiwgdmFsKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgc2Rfc2RyX3R1bmluZ19yeF9jbWQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCBzYW1wbGVfcG9pbnQpCit7CisJaW50IHJldHZhbDsKKwl1OCBjbWRbNV07CisKKwlyZXR2YWwgPSBzZF9jaGFuZ2VfcGhhc2UoY2hpcCwgc2FtcGxlX3BvaW50LCBUVU5FX1JYKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCWNtZFswXSA9IDB4NDAgfCBTRU5EX1RVTklOR19QQVRURVJOOworCWNtZFsxXSA9IDA7CisJY21kWzJdID0gMDsKKwljbWRbM10gPSAwOworCWNtZFs0XSA9IDA7CisKKwlyZXR2YWwgPSBzZF9yZWFkX2RhdGEoY2hpcCwgU0RfVE1fQVVUT19UVU5JTkcsCisJCQkgICAgICBjbWQsIDUsIDB4NDAsIDEsIFNEX0JVU19XSURUSF80LCBOVUxMLCAwLCAxMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJLyogV2FpdCB0aWxsIFNEIERBVEEgSURMRSAqLworCQkodm9pZClzZF93YWl0X2RhdGFfaWRsZShjaGlwKTsKKworCQlydHM1MXhfY2xlYXJfc2RfZXJyb3IoY2hpcCk7CisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJfQorCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IHNkX2Rkcl90dW5pbmdfcnhfY21kKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggc2FtcGxlX3BvaW50KQoreworCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKwlpbnQgcmV0dmFsOworCXU4IGNtZFs1XTsKKworCXJldHZhbCA9IHNkX2NoYW5nZV9waGFzZShjaGlwLCBzYW1wbGVfcG9pbnQsIFRVTkVfUlgpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJUlRTNTFYX0RFQlVHUCgic2QgZGRyIHR1bmluZyByeFxuIik7CisKKwlyZXR2YWwgPQorCSAgICBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEFQUF9DTUQsIHNkX2NhcmQtPnNkX2FkZHIsIFNEX1JTUF9UWVBFX1IxLAorCQkJCU5VTEwsIDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJY21kWzBdID0gMHg0MCB8IFNEX1NUQVRVUzsKKwljbWRbMV0gPSAwOworCWNtZFsyXSA9IDA7CisJY21kWzNdID0gMDsKKwljbWRbNF0gPSAwOworCisJcmV0dmFsID0gc2RfcmVhZF9kYXRhKGNoaXAsIFNEX1RNX05PUk1BTF9SRUFELAorCQkJICAgICAgY21kLCA1LCA2NCwgMSwgU0RfQlVTX1dJRFRIXzQsIE5VTEwsIDAsIDEwMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkvKiBXYWl0IHRpbGwgU0QgREFUQSBJRExFICovCisJCSh2b2lkKXNkX3dhaXRfZGF0YV9pZGxlKGNoaXApOworCisJCXJ0czUxeF9jbGVhcl9zZF9lcnJvcihjaGlwKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwl9CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbW1jX2Rkcl90dW5uaW5nX3J4X2NtZChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IHNhbXBsZV9wb2ludCkKK3sKKwlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CisJaW50IHJldHZhbDsKKwl1OCBjbWRbNV0sIGJ1c193aWR0aDsKKworCWlmIChDSEtfTU1DXzhCSVQoc2RfY2FyZCkpCisJCWJ1c193aWR0aCA9IFNEX0JVU19XSURUSF84OworCWVsc2UgaWYgKENIS19NTUNfNEJJVChzZF9jYXJkKSkKKwkJYnVzX3dpZHRoID0gU0RfQlVTX1dJRFRIXzQ7CisJZWxzZQorCQlidXNfd2lkdGggPSBTRF9CVVNfV0lEVEhfMTsKKworCXJldHZhbCA9IHNkX2NoYW5nZV9waGFzZShjaGlwLCBzYW1wbGVfcG9pbnQsIFRVTkVfUlgpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJUlRTNTFYX0RFQlVHUCgibW1jIGRkciB0dW5pbmcgcnhcbiIpOworCisJY21kWzBdID0gMHg0MCB8IFNFTkRfRVhUX0NTRDsKKwljbWRbMV0gPSAwOworCWNtZFsyXSA9IDA7CisJY21kWzNdID0gMDsKKwljbWRbNF0gPSAwOworCisJcmV0dmFsID0gc2RfcmVhZF9kYXRhKGNoaXAsIFNEX1RNX05PUk1BTF9SRUFELAorCQkJICAgICAgY21kLCA1LCAweDIwMCwgMSwgYnVzX3dpZHRoLCBOVUxMLCAwLCAxMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJLyogV2FpdCB0aWxsIFNEIERBVEEgSURMRSAqLworCQkodm9pZClzZF93YWl0X2RhdGFfaWRsZShjaGlwKTsKKworCQlydHM1MXhfY2xlYXJfc2RfZXJyb3IoY2hpcCk7CisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJfQorCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IHNkX3Nkcl90dW5pbmdfdHhfY21kKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggc2FtcGxlX3BvaW50KQoreworCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gc2RfY2hhbmdlX3BoYXNlKGNoaXAsIHNhbXBsZV9wb2ludCwgVFVORV9UWCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlSVFM1MVhfV1JJVEVfUkVHKGNoaXAsIFNEX0NGRzMsIFNEX1JTUF84MENMS19USU1FT1VUX0VOLAorCQkJIFNEX1JTUF84MENMS19USU1FT1VUX0VOKTsKKworCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VORF9TVEFUVVMsIHNkX2NhcmQtPnNkX2FkZHIsCisJCQkJICAgICBTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlpZiAoc2RfY2hlY2tfZXJyX2NvZGUoY2hpcCwgU0RfUlNQX1RJTUVPVVQpKSB7CisJCQkvKiBUdW5uaW5nIFRYIGZhaWwgKi8KKwkJCXJ0czUxeF9lcDBfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfQ0ZHMywKKwkJCQkJCSAgU0RfUlNQXzgwQ0xLX1RJTUVPVVRfRU4sIDApOworCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJfQorCX0KKworCVJUUzUxWF9XUklURV9SRUcoY2hpcCwgU0RfQ0ZHMywgU0RfUlNQXzgwQ0xLX1RJTUVPVVRfRU4sIDApOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IHNkX2Rkcl90dW5pbmdfdHhfY21kKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggc2FtcGxlX3BvaW50KQoreworCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKwlpbnQgcmV0dmFsOworCXU4IGNtZFs1XSwgYnVzX3dpZHRoOworCisJcmV0dmFsID0gc2RfY2hhbmdlX3BoYXNlKGNoaXAsIHNhbXBsZV9wb2ludCwgVFVORV9UWCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlpZiAoQ0hLX1NEKHNkX2NhcmQpKSB7CisJCWJ1c193aWR0aCA9IFNEX0JVU19XSURUSF80OworCX0gZWxzZSB7CisJCWlmIChDSEtfTU1DXzhCSVQoc2RfY2FyZCkpCisJCQlidXNfd2lkdGggPSBTRF9CVVNfV0lEVEhfODsKKwkJZWxzZSBpZiAoQ0hLX01NQ180QklUKHNkX2NhcmQpKQorCQkJYnVzX3dpZHRoID0gU0RfQlVTX1dJRFRIXzQ7CisJCWVsc2UKKwkJCWJ1c193aWR0aCA9IFNEX0JVU19XSURUSF8xOworCX0KKwlyZXR2YWwgPSBzZF93YWl0X2N1cnJlbnRzdGF0ZV9kYXRhcmVhZHkoY2hpcCwgMHgwOCwgMSwgMjApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwlSVFM1MVhfV1JJVEVfUkVHKGNoaXAsIFNEX0NGRzMsIFNEX1JTUF84MENMS19USU1FT1VUX0VOLAorCQkJIFNEX1JTUF84MENMS19USU1FT1VUX0VOKTsKKworCWNtZFswXSA9IDB4NDAgfCBQUk9HUkFNX0NTRDsKKwljbWRbMV0gPSAwOworCWNtZFsyXSA9IDA7CisJY21kWzNdID0gMDsKKwljbWRbNF0gPSAwOworCisJcmV0dmFsID0gc2Rfd3JpdGVfZGF0YShjaGlwLCBTRF9UTV9BVVRPX1dSSVRFXzIsCisJCQljbWQsIDUsIDE2LCAxLCBidXNfd2lkdGgsIHNkX2NhcmQtPnJhd19jc2QsIDE2LCAxMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzNTF4X2NsZWFyX3NkX2Vycm9yKGNoaXApOworCQkvKiBUdW5uaW5nIFRYIGZhaWwgKi8KKwkJcnRzNTF4X2VwMF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9DRkczLAorCQkJCQkgIFNEX1JTUF84MENMS19USU1FT1VUX0VOLCAwKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwl9CisKKwlSVFM1MVhfV1JJVEVfUkVHKGNoaXAsIFNEX0NGRzMsIFNEX1JTUF84MENMS19USU1FT1VUX0VOLCAwKTsKKworCXNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VORF9TVEFUVVMsIHNkX2NhcmQtPnNkX2FkZHIsIFNEX1JTUF9UWVBFX1IxLAorCQkJICAgIE5VTEwsIDApOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgdTggc2Rfc2VhcmNoX2ZpbmFsX3BoYXNlKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTMyIHBoYXNlX21hcCwKKwkJCQl1OCB0dW5lX2RpcikKK3sKKwlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CisJc3RydWN0IHRpbWluZ19waGFzZV9wYXRoIHBhdGhbTUFYX1BIQVNFICsgMV07CisJaW50IGksIGosIGNvbnRfcGF0aF9jbnQ7CisJaW50IG5ld19ibG9jaywgbWF4X2xlbjsKKwl1OCBmaW5hbF9waGFzZSA9IDB4RkY7CisJaW50IGZpbmFsX3BhdGhfaWR4OworCisJaWYgKHBoYXNlX21hcCA9PSAweGZmZmYpIHsKKwkJaWYgKENIS19TRF9ERFI1MChzZF9jYXJkKSkgeworCQkJaWYgKHR1bmVfZGlyID09IFRVTkVfVFgpCisJCQkJZmluYWxfcGhhc2UgPSBjaGlwLT5vcHRpb24uZGRyNTBfdHhfcGhhc2U7CisJCQllbHNlCisJCQkJZmluYWxfcGhhc2UgPSBjaGlwLT5vcHRpb24uZGRyNTBfcnhfcGhhc2U7CisJCQlSVFM1MVhfREVCVUdQKCJERFI1MCB0dW5pbmcgZGlyOiVkIGFsbCBwYXNzLCIKKwkJCQkJInNvIHNlbGVjdCBkZWZhdWx0IHBoYXNlOjB4JXguXG4iLAorCQkJCQl0dW5lX2RpciwgZmluYWxfcGhhc2UpOworCQl9IGVsc2UgeworCQkJaWYgKHR1bmVfZGlyID09IFRVTkVfVFgpCisJCQkJZmluYWxfcGhhc2UgPSBjaGlwLT5vcHRpb24uc2RyNTBfdHhfcGhhc2U7CisJCQllbHNlCisJCQkJZmluYWxfcGhhc2UgPSBjaGlwLT5vcHRpb24uc2RyNTBfcnhfcGhhc2U7CisJCQlSVFM1MVhfREVCVUdQKCJTRFI1MCB0dW5pbmcgZGlyOiVkIGFsbCBwYXNzLCIKKwkJCQkJInNvIHNlbGVjdCBkZWZhdWx0IHBoYXNlOjB4JXguXG4iLAorCQkJCQl0dW5lX2RpciwgZmluYWxfcGhhc2UpOworCQl9CisJCWdvdG8gU2VhcmNoX0ZpbmlzaDsKKwl9CisKKwljb250X3BhdGhfY250ID0gMDsKKwluZXdfYmxvY2sgPSAxOworCWogPSAwOworCWZvciAoaSA9IDA7IGkgPCBNQVhfUEhBU0UgKyAxOyBpKyspIHsKKwkJaWYgKHBoYXNlX21hcCAmICgxIDw8IGkpKSB7CisJCQlpZiAobmV3X2Jsb2NrKSB7CisJCQkJbmV3X2Jsb2NrID0gMDsKKwkJCQlqID0gY29udF9wYXRoX2NudCsrOworCQkJCXBhdGhbal0uc3RhcnQgPSBpOworCQkJCXBhdGhbal0uZW5kID0gaTsKKwkJCX0gZWxzZSB7CisJCQkJcGF0aFtqXS5lbmQgPSBpOworCQkJfQorCQl9IGVsc2UgeworCQkJbmV3X2Jsb2NrID0gMTsKKwkJCWlmIChjb250X3BhdGhfY250KSB7CisJCQkJaW50IGlkeCA9IGNvbnRfcGF0aF9jbnQgLSAxOworCQkJCXBhdGhbaWR4XS5sZW4gPQorCQkJCSAgICBwYXRoW2lkeF0uZW5kIC0gcGF0aFtpZHhdLnN0YXJ0ICsgMTsKKwkJCQlwYXRoW2lkeF0ubWlkID0KKwkJCQkgICAgcGF0aFtpZHhdLnN0YXJ0ICsgcGF0aFtpZHhdLmxlbiAvIDI7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoY29udF9wYXRoX2NudCA9PSAwKSB7CisJCVJUUzUxWF9ERUJVR1AoIk5vIGNvbnRpbnVvdXMgcGhhc2UgcGF0aFxuIik7CisJCWdvdG8gU2VhcmNoX0ZpbmlzaDsKKwl9IGVsc2UgeworCQlpbnQgaWR4ID0gY29udF9wYXRoX2NudCAtIDE7CisJCXBhdGhbaWR4XS5sZW4gPSBwYXRoW2lkeF0uZW5kIC0gcGF0aFtpZHhdLnN0YXJ0ICsgMTsKKwkJcGF0aFtpZHhdLm1pZCA9IHBhdGhbaWR4XS5zdGFydCArIHBhdGhbaWR4XS5sZW4gLyAyOworCX0KKworCWlmICgocGF0aFswXS5zdGFydCA9PSAwKSAmJgorCQkJKHBhdGhbY29udF9wYXRoX2NudCAtIDFdLmVuZCA9PSBNQVhfUEhBU0UpKSB7CisJCXBhdGhbMF0uc3RhcnQgPSBwYXRoW2NvbnRfcGF0aF9jbnQgLSAxXS5zdGFydCAtIE1BWF9QSEFTRSAtIDE7CisJCXBhdGhbMF0ubGVuICs9IHBhdGhbY29udF9wYXRoX2NudCAtIDFdLmxlbjsKKwkJcGF0aFswXS5taWQgPSBwYXRoWzBdLnN0YXJ0ICsgcGF0aFswXS5sZW4gLyAyOworCQlpZiAocGF0aFswXS5taWQgPCAwKQorCQkJcGF0aFswXS5taWQgKz0gTUFYX1BIQVNFICsgMTsKKwkJY29udF9wYXRoX2NudC0tOworCX0KKwltYXhfbGVuID0gMDsKKwlmaW5hbF9waGFzZSA9IDA7CisJZmluYWxfcGF0aF9pZHggPSAwOworCWZvciAoaSA9IDA7IGkgPCBjb250X3BhdGhfY250OyBpKyspIHsKKwkJaWYgKHBhdGhbaV0ubGVuID4gbWF4X2xlbikgeworCQkJbWF4X2xlbiA9IHBhdGhbaV0ubGVuOworCQkJZmluYWxfcGhhc2UgPSAodTgpIHBhdGhbaV0ubWlkOworCQkJZmluYWxfcGF0aF9pZHggPSBpOworCQl9CisKKwkJUlRTNTFYX0RFQlVHUCgicGF0aFslZF0uc3RhcnQgPSAlZFxuIiwgaSwgcGF0aFtpXS5zdGFydCk7CisJCVJUUzUxWF9ERUJVR1AoInBhdGhbJWRdLmVuZCA9ICVkXG4iLCBpLCBwYXRoW2ldLmVuZCk7CisJCVJUUzUxWF9ERUJVR1AoInBhdGhbJWRdLmxlbiA9ICVkXG4iLCBpLCBwYXRoW2ldLmxlbik7CisJCVJUUzUxWF9ERUJVR1AoInBhdGhbJWRdLm1pZCA9ICVkXG4iLCBpLCBwYXRoW2ldLm1pZCk7CisJCVJUUzUxWF9ERUJVR1AoIlxuIik7CisJfQorCisJaWYgKCh0dW5lX2RpciA9PSBUVU5FX1RYKSAmJiAoQ0hLX1NEX1NEUjUwKHNkX2NhcmQpKQorCSAgICAmJiBjaGlwLT5vcHRpb24uc2RyNTBfcGhhc2Vfc2VsKSB7CisJCWlmIChtYXhfbGVuID4gNikgeworCQkJaW50IHRlbXBfbWlkID0gKG1heF9sZW4gLSA2KSAvIDI7CisJCQlpbnQgdGVtcF9maW5hbF9waGFzZSA9CisJCQkgICAgcGF0aFtmaW5hbF9wYXRoX2lkeF0uZW5kIC0gKG1heF9sZW4gLQorCQkJCQkJCSgzICsgdGVtcF9taWQpKTsKKworCQkJaWYgKHRlbXBfZmluYWxfcGhhc2UgPCAwKQorCQkJCWZpbmFsX3BoYXNlID0gdGVtcF9maW5hbF9waGFzZSArIE1BWF9QSEFTRSArIDE7CisJCQllbHNlCisJCQkJZmluYWxfcGhhc2UgPSAodTgpIHRlbXBfZmluYWxfcGhhc2U7CisJCX0KKwl9CisKK1NlYXJjaF9GaW5pc2g6CisJUlRTNTFYX0RFQlVHUCgiRmluYWwgY2hvb3NlbiBwaGFzZTogJWRcbiIsIGZpbmFsX3BoYXNlKTsKKwlyZXR1cm4gZmluYWxfcGhhc2U7Cit9CisKK3N0YXRpYyBpbnQgc2RfdHVuaW5nX3J4KHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CisJaW50IHJldHZhbDsKKwlpbnQgaSwgajsKKwl1MzIgcmF3X3BoYXNlX21hcFszXSwgcGhhc2VfbWFwOworCXU4IGZpbmFsX3BoYXNlOworCWludCAoKnR1bmluZ19jbWQpIChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IHNhbXBsZV9wb2ludCk7CisKKwlpZiAoQ0hLX1NEKHNkX2NhcmQpKSB7CisJCWlmIChDSEtfU0RfRERSNTAoc2RfY2FyZCkpCisJCQl0dW5pbmdfY21kID0gc2RfZGRyX3R1bmluZ19yeF9jbWQ7CisJCWVsc2UKKwkJCXR1bmluZ19jbWQgPSBzZF9zZHJfdHVuaW5nX3J4X2NtZDsKKwl9IGVsc2UgeworCQlpZiAoQ0hLX01NQ19ERFI1MihzZF9jYXJkKSkKKwkJCXR1bmluZ19jbWQgPSBtbWNfZGRyX3R1bm5pbmdfcnhfY21kOworCQllbHNlCisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJcmF3X3BoYXNlX21hcFtpXSA9IDA7CisJCWZvciAoaiA9IE1BWF9QSEFTRTsgaiA+PSAwOyBqLS0pIHsKKwkJCWlmIChtb25pdG9yX2NhcmRfY2QoY2hpcCwgU0RfQ0FSRCkgPT0gQ0RfTk9UX0VYSVNUKSB7CisJCQkJc2Rfc2V0X3Jlc2V0X2ZhaWwoY2hpcCwgU0RfUkVTRVRfRkFJTCk7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCX0KKworCQkJcmV0dmFsID0gdHVuaW5nX2NtZChjaGlwLCAodTgpIGopOworCQkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKKwkJCQlyYXdfcGhhc2VfbWFwW2ldIHw9IDEgPDwgajsKKwkJCWVsc2UKKwkJCQlSVFM1MVhfREVCVUdQKCJUdW5pbmcgcGhhc2UgJWQgZmFpbFxuIiwgaik7CisJCX0KKwl9CisKKwlwaGFzZV9tYXAgPSByYXdfcGhhc2VfbWFwWzBdICYgcmF3X3BoYXNlX21hcFsxXSAmIHJhd19waGFzZV9tYXBbMl07CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJUlRTNTFYX0RFQlVHUCgiUlggcmF3X3BoYXNlX21hcFslZF0gPSAweCUwNHhcbiIsIGksCisJCQkgICAgICAgcmF3X3BoYXNlX21hcFtpXSk7CisJUlRTNTFYX0RFQlVHUCgiUlggcGhhc2VfbWFwID0gMHglMDR4XG4iLCBwaGFzZV9tYXApOworCisJZmluYWxfcGhhc2UgPSBzZF9zZWFyY2hfZmluYWxfcGhhc2UoY2hpcCwgcGhhc2VfbWFwLCBUVU5FX1JYKTsKKwlpZiAoZmluYWxfcGhhc2UgPT0gMHhGRikKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKworCXJldHZhbCA9IHR1bmluZ19jbWQoY2hpcCwgZmluYWxfcGhhc2UpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IHNkX2Rkcl9wcmVfdHVuaW5nX3R4KHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CisJaW50IHJldHZhbDsKKwl1OCBpOworCXU4IHByZV90dW5lX3R4X3BoYXNlOworCXUzMiBwcmVfdHVuZV9waGFzZV9tYXA7CisKKwlSVFM1MVhfV1JJVEVfUkVHKGNoaXAsIFNEX0NGRzMsIFNEX1JTUF84MENMS19USU1FT1VUX0VOLAorCQkJIFNEX1JTUF84MENMS19USU1FT1VUX0VOKTsKKworCXByZV90dW5lX3R4X3BoYXNlID0gMHhGRjsKKwlwcmVfdHVuZV9waGFzZV9tYXAgPSAweDAwMDA7CisJZm9yIChpID0gMDsgaSA8IE1BWF9QSEFTRSArIDE7IGkrKykgeworCQlpZiAobW9uaXRvcl9jYXJkX2NkKGNoaXAsIFNEX0NBUkQpID09IENEX05PVF9FWElTVCkgeworCQkJc2Rfc2V0X3Jlc2V0X2ZhaWwoY2hpcCwgU0RfUkVTRVRfRkFJTCk7CisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQl9CisKKwkJcmV0dmFsID0gc2RfY2hhbmdlX3BoYXNlKGNoaXAsICh1OCkgaSwgVFVORV9UWCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCQlyZXR2YWwgPQorCQkgICAgc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRU5EX1NUQVRVUywgc2RfY2FyZC0+c2RfYWRkciwKKwkJCQkJU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDApOworCQlpZiAoKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKKwkJICAgIHx8ICFzZF9jaGVja19lcnJfY29kZShjaGlwLCBTRF9SU1BfVElNRU9VVCkpCisJCQlwcmVfdHVuZV9waGFzZV9tYXAgfD0gKHUzMikgMSA8PCBpOworCX0KKworCVJUUzUxWF9XUklURV9SRUcoY2hpcCwgU0RfQ0ZHMywgU0RfUlNQXzgwQ0xLX1RJTUVPVVRfRU4sIDApOworCisJcHJlX3R1bmVfdHhfcGhhc2UgPQorCSAgICBzZF9zZWFyY2hfZmluYWxfcGhhc2UoY2hpcCwgcHJlX3R1bmVfcGhhc2VfbWFwLCBUVU5FX1RYKTsKKwlpZiAocHJlX3R1bmVfdHhfcGhhc2UgPT0gMHhGRikKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKworCXNkX2NoYW5nZV9waGFzZShjaGlwLCBwcmVfdHVuZV90eF9waGFzZSwgVFVORV9UWCk7CisJUlRTNTFYX0RFQlVHUCgiRERSIFRYIHByZSB0dW5lIHBoYXNlOiAlZFxuIiwgKGludClwcmVfdHVuZV90eF9waGFzZSk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgc2RfdHVuaW5nX3R4KHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CisJaW50IHJldHZhbDsKKwlpbnQgaSwgajsKKwl1MzIgcmF3X3BoYXNlX21hcFszXSwgcGhhc2VfbWFwOworCXU4IGZpbmFsX3BoYXNlOworCWludCAoKnR1bmluZ19jbWQpIChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IHNhbXBsZV9wb2ludCk7CisKKwlpZiAoQ0hLX1NEKHNkX2NhcmQpKSB7CisJCWlmIChDSEtfU0RfRERSNTAoc2RfY2FyZCkpCisJCQl0dW5pbmdfY21kID0gc2RfZGRyX3R1bmluZ190eF9jbWQ7CisJCWVsc2UKKwkJCXR1bmluZ19jbWQgPSBzZF9zZHJfdHVuaW5nX3R4X2NtZDsKKwl9IGVsc2UgeworCQlpZiAoQ0hLX01NQ19ERFI1MihzZF9jYXJkKSkKKwkJCXR1bmluZ19jbWQgPSBzZF9kZHJfdHVuaW5nX3R4X2NtZDsKKwkJZWxzZQorCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXJhd19waGFzZV9tYXBbaV0gPSAwOworCQlmb3IgKGogPSBNQVhfUEhBU0U7IGogPj0gMDsgai0tKSB7CisJCQlpZiAobW9uaXRvcl9jYXJkX2NkKGNoaXAsIFNEX0NBUkQpID09IENEX05PVF9FWElTVCkgeworCQkJCXNkX3NldF9yZXNldF9mYWlsKGNoaXAsIFNEX1JFU0VUX0ZBSUwpOworCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQl9CisKKwkJCXJldHZhbCA9IHR1bmluZ19jbWQoY2hpcCwgKHU4KSBqKTsKKwkJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJcmF3X3BoYXNlX21hcFtpXSB8PSAxIDw8IGo7CisJCQllbHNlCisJCQkJUlRTNTFYX0RFQlVHUCgiVHVuaW5nIHBoYXNlICVkIGZhaWxcbiIsIGopOworCQl9CisJfQorCisJcGhhc2VfbWFwID0gcmF3X3BoYXNlX21hcFswXSAmIHJhd19waGFzZV9tYXBbMV0gJiByYXdfcGhhc2VfbWFwWzJdOworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCVJUUzUxWF9ERUJVR1AoIlRYIHJhd19waGFzZV9tYXBbJWRdID0gMHglMDR4XG4iLCBpLAorCQkJICAgICAgIHJhd19waGFzZV9tYXBbaV0pOworCVJUUzUxWF9ERUJVR1AoIlRYIHBoYXNlX21hcCA9IDB4JTA0eFxuIiwgcGhhc2VfbWFwKTsKKworCWZpbmFsX3BoYXNlID0gc2Rfc2VhcmNoX2ZpbmFsX3BoYXNlKGNoaXAsIHBoYXNlX21hcCwgVFVORV9UWCk7CisJaWYgKGZpbmFsX3BoYXNlID09IDB4RkYpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwlyZXR2YWwgPSB0dW5pbmdfY21kKGNoaXAsIGZpbmFsX3BoYXNlKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzZF9zZHJfdHVuaW5nKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gc2RfdHVuaW5nX3R4KGNoaXApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcmV0dmFsID0gc2RfdHVuaW5nX3J4KGNoaXApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IHNkX2Rkcl90dW5pbmcoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCWludCByZXR2YWw7CisKKwlpZiAoIShjaGlwLT5vcHRpb24uc2RfY3RsICYgU0RfRERSX1RYX1BIQVNFX1NFVF9CWV9VU0VSKSkgeworCQlyZXR2YWwgPSBzZF9kZHJfcHJlX3R1bmluZ190eChjaGlwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0gZWxzZSB7CisJCXJldHZhbCA9CisJCSAgICBzZF9jaGFuZ2VfcGhhc2UoY2hpcCwgKHU4KSBjaGlwLT5vcHRpb24uc2RfZGRyX3R4X3BoYXNlLAorCQkJCSAgICBUVU5FX1RYKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKworCXJldHZhbCA9IHNkX3R1bmluZ19yeChjaGlwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCWlmICghKGNoaXAtPm9wdGlvbi5zZF9jdGwgJiBTRF9ERFJfVFhfUEhBU0VfU0VUX0JZX1VTRVIpKSB7CisJCXJldHZhbCA9IHNkX3R1bmluZ190eChjaGlwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBtbWNfZGRyX3R1bmluZyhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJaW50IHJldHZhbDsKKworCWlmICghKGNoaXAtPm9wdGlvbi5zZF9jdGwgJiBNTUNfRERSX1RYX1BIQVNFX1NFVF9CWV9VU0VSKSkgeworCQlyZXR2YWwgPSBzZF9kZHJfcHJlX3R1bmluZ190eChjaGlwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0gZWxzZSB7CisJCXJldHZhbCA9CisJCSAgICBzZF9jaGFuZ2VfcGhhc2UoY2hpcCwgKHU4KSBjaGlwLT5vcHRpb24ubW1jX2Rkcl90eF9waGFzZSwKKwkJCQkgICAgVFVORV9UWCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwl9CisKKwlyZXR2YWwgPSBzZF90dW5pbmdfcngoY2hpcCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlpZiAoIShjaGlwLT5vcHRpb24uc2RfY3RsICYgTU1DX0REUl9UWF9QSEFTRV9TRVRfQllfVVNFUikpIHsKKwkJcmV0dmFsID0gc2RfdHVuaW5nX3R4KGNoaXApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJfQorCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitpbnQgc2Rfc3dpdGNoX2Nsb2NrKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CisJaW50IHJldHZhbDsKKwlpbnQgcmVfdHVuaW5nID0gMDsKKworCXJldHZhbCA9IHJ0czUxeF9zZWxlY3RfY2FyZChjaGlwLCBTRF9DQVJEKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCWlmIChDSEtfU0QzMF9TUEVFRChzZF9jYXJkKSB8fCBDSEtfTU1DX0REUjUyKHNkX2NhcmQpKSB7CisJCWlmIChzZF9jYXJkLT5zZF9jbG9jayAhPSBjaGlwLT5jdXJfY2xrKQorCQkJcmVfdHVuaW5nID0gMTsKKwl9CisKKwlyZXR2YWwgPSBzd2l0Y2hfY2xvY2soY2hpcCwgc2RfY2FyZC0+c2RfY2xvY2spOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJaWYgKHJlX3R1bmluZykgeworCQlpZiAoQ0hLX1NEKHNkX2NhcmQpKSB7CisJCQlpZiAoQ0hLX1NEX0REUjUwKHNkX2NhcmQpKQorCQkJCXJldHZhbCA9IHNkX2Rkcl90dW5pbmcoY2hpcCk7CisJCQllbHNlCisJCQkJcmV0dmFsID0gc2Rfc2RyX3R1bmluZyhjaGlwKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChDSEtfTU1DX0REUjUyKHNkX2NhcmQpKQorCQkJCXJldHZhbCA9IG1tY19kZHJfdHVuaW5nKGNoaXApOworCQl9CisKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzZF9wcmVwYXJlX3Jlc2V0KHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CisJaW50IHJldHZhbDsKKworCWlmIChjaGlwLT5hc2ljX2NvZGUpCisJCXNkX2NhcmQtPnNkX2Nsb2NrID0gMjk7CisJZWxzZQorCQlzZF9jYXJkLT5zZF9jbG9jayA9IENMS18zMDsKKworCS8qIFNldCBTRCBDbG9ja3MgKi8KKwlyZXR2YWwgPSBzZF9zZXRfaW5pdF9wYXJhKGNoaXApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcnRzNTF4X2luaXRfY21kKGNoaXApOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQ0ZHMSwgMHhGRiwKKwkJICAgICAgIFNEX0NMS19ESVZJREVfMTI4IHwgU0RfMjBfTU9ERSB8IFNEX0JVU19XSURUSF8xKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9TQU1QTEVfUE9JTlRfQ1RMLCAweEZGLAorCQkgICAgICAgU0QyMF9SWF9QT1NfRURHRSk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfUFVTSF9QT0lOVF9DVEwsIDB4RkYsIDApOworCisJcmV0dmFsID0gcnRzNTF4X3NlbmRfY21kKGNoaXAsIE1PREVfQywgMTAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHZhbCA9IHJ0czUxeF9zZWxlY3RfY2FyZChjaGlwLCBTRF9DQVJEKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgc2RfcHVsbF9jdGxfZGlzYWJsZShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJaWYgKENIRUNLX1BLRyhjaGlwLCBMUUZQNDgpKSB7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEwxLCAweEZGLCAweDU1KTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDIsIDB4RkYsIDB4NTUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMMywgMHhGRiwgMHg5NSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEw0LCAweEZGLCAweDU1KTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDUsIDB4RkYsIDB4NTUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMNiwgMHhGRiwgMHhBNSk7CisJfSBlbHNlIHsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDEsIDB4RkYsIDB4NjUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMMiwgMHhGRiwgMHg1NSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEwzLCAweEZGLCAweDk1KTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDQsIDB4RkYsIDB4NTUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMNSwgMHhGRiwgMHg1Nik7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEw2LCAweEZGLCAweDU5KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNkX3B1bGxfY3RsX2VuYWJsZShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJaWYgKENIRUNLX1BLRyhjaGlwLCBMUUZQNDgpKSB7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEwxLCAweEZGLCAweEFBKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDIsIDB4RkYsIDB4QUEpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMMywgMHhGRiwgMHhBOSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEw0LCAweEZGLCAweDU1KTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDUsIDB4RkYsIDB4NTUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMNiwgMHhGRiwgMHhBNSk7CisJfSBlbHNlIHsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDEsIDB4RkYsIDB4QTUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMMiwgMHhGRiwgMHg5QSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEwzLCAweEZGLCAweEE1KTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDQsIDB4RkYsIDB4OUEpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMNSwgMHhGRiwgMHg2NSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEw2LCAweEZGLCAweDVBKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2RfaW5pdF9wb3dlcihzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJaW50IHJldHZhbDsKKworCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFdSX0NUTCwgTERPMzMxOF9QV1JfTUFTSywKKwkJICAgICAgIExET19PTik7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfUEFEX0NUTCwgU0RfSU9fVVNJTkdfMVY4LAorCQkgICAgICAgU0RfSU9fVVNJTkdfM1YzKTsKKwlpZiAoY2hpcC0+YXNpY19jb2RlKQorCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBMRE9fUE9XRVJfQ0ZHLAorCQkJICAgICAgIFRVTkVfU0QxOF9NQVNLLCBUVU5FX1NEMThfM1YzKTsKKwlpZiAoY2hpcC0+YXNpY19jb2RlKQorCQlzZF9wdWxsX2N0bF9kaXNhYmxlKGNoaXApOworCWVsc2UKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgRlBHQV9QVUxMX0NUTCwKKwkJCSAgICAgICBGUEdBX1NEX1BVTExfQ1RMX0JJVCB8IDB4MjAsCisJCQkgICAgICAgRlBHQV9TRF9QVUxMX0NUTF9CSVQpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfT0UsIFNEX09VVFBVVF9FTiwgMCk7CisJaWYgKCFjaGlwLT5vcHRpb24uRlQyX2Zhc3RfbW9kZSkKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QV1JfQ1RMLCBQT1dFUl9NQVNLLAorCQkJICAgICAgIFBPV0VSX09GRik7CisKKwlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DLCAxMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCWlmICghY2hpcC0+b3B0aW9uLkZUMl9mYXN0X21vZGUpIHsKKyNpZmRlZiBTRF9YRF9JT19GT0xMT1dfUFdSCisJCWlmIChDSEVDS19QS0coY2hpcCwgTFFGUDQ4KQorCQkgICAgfHwgY2hpcC0+b3B0aW9uLnJ0czUxMjlfRDMzMThfb2ZmX2VuYWJsZSkKKwkJCXJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BXUl9DVEwsCisJCQkJCUxET19PRkYsIExET19PRkYpOworI2VuZGlmCisJCXdhaXRfdGltZW91dCgyNTApOworCisjaWZkZWYgU0RfWERfSU9fRk9MTE9XX1BXUgorCQlpZiAoQ0hFQ0tfUEtHKGNoaXAsIExRRlA0OCkKKwkJICAgIHx8IGNoaXAtPm9wdGlvbi5ydHM1MTI5X0QzMzE4X29mZl9lbmFibGUpIHsKKwkJCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKwkJCWlmIChjaGlwLT5hc2ljX2NvZGUpCisJCQkJc2RfcHVsbF9jdGxfZW5hYmxlKGNoaXApOworCQkJZWxzZQorCQkJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsCisJCQkJCSAgICAgICBGUEdBX1BVTExfQ1RMLAorCQkJCQkgICAgICAgRlBHQV9TRF9QVUxMX0NUTF9CSVQgfCAweDIwLCAwKTsKKwkJCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0MsIDEwMCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCQl9IGVsc2UgeworCQkJaWYgKGNoaXAtPmFzaWNfY29kZSkKKwkJCQlydHM1MXhfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDYsCisJCQkJCQkgICAgICAweDAzLCAweDAwKTsKKwkJfQorI2VuZGlmCisKKwkJLyogUG93ZXIgb24gY2FyZCAqLworCQlyZXR2YWwgPSBjYXJkX3Bvd2VyX29uKGNoaXAsIFNEX0NBUkQpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwkJd2FpdF90aW1lb3V0KDI2MCk7CisKKyNpZmRlZiBTVVBQT1JUX09DUAorCQlydHM1MXhfZ2V0X2NhcmRfc3RhdHVzKGNoaXAsICYoY2hpcC0+Y2FyZF9zdGF0dXMpKTsKKwkJY2hpcC0+b2NwX3N0YXQgPSAoY2hpcC0+Y2FyZF9zdGF0dXMgPj4gNCkgJiAweDAzOworCisJCWlmIChjaGlwLT5vY3Bfc3RhdCAmIChNU19PQ1BfTk9XIHwgTVNfT0NQX0VWRVIpKSB7CisJCQlSVFM1MVhfREVCVUdQKCJPdmVyIGN1cnJlbnQsIE9DUFNUQVQgaXMgMHgleFxuIiwKKwkJCQkgICAgICAgY2hpcC0+b2NwX3N0YXQpOworCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJfQorI2VuZGlmCisJfQorCisJcnRzNTF4X2luaXRfY21kKGNoaXApOworCWlmIChjaGlwLT5hc2ljX2NvZGUpIHsKKwkJc2RfcHVsbF9jdGxfZW5hYmxlKGNoaXApOworCX0gZWxzZSB7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIEZQR0FfUFVMTF9DVEwsCisJCQkgICAgICAgRlBHQV9TRF9QVUxMX0NUTF9CSVQgfCAweDIwLCAwKTsKKwl9CisJcmV0dmFsID0gcnRzNTF4X3NlbmRfY21kKGNoaXAsIE1PREVfQywgMTAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKyNpZmRlZiBTRF9YRF9JT19GT0xMT1dfUFdSCisJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfSU5UX1BFTkQsIFhEX0lOVCB8IE1TX0lOVCB8IFNEX0lOVCwKKwkJCSAgICAgIFhEX0lOVCB8IE1TX0lOVCB8IFNEX0lOVCk7CisjZW5kaWYKKworCVJUUzUxWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9PRSwgU0RfT1VUUFVUX0VOLCBTRF9PVVRQVVRfRU4pOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IHNkX2R1bW15X2Nsb2NrKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlSVFM1MVhfV1JJVEVfUkVHKGNoaXAsIFNEX0JVU19TVEFULCBTRF9DTEtfVE9HR0xFX0VOLCBTRF9DTEtfVE9HR0xFX0VOKTsKKwl3YWl0X3RpbWVvdXQoNSk7CisJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBTRF9CVVNfU1RBVCwgU0RfQ0xLX1RPR0dMRV9FTiwgMHgwMCk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2ludCByZXNldF9zZChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOworCWludCByZXR2YWwsIGkgPSAwLCBqID0gMCwgayA9IDAsIGhpX2NhcF9mbG93ID0gMDsKKwlpbnQgc2RfZG9udF9zd2l0Y2ggPSAwOworCWludCBzdXBwb3J0XzF2OCA9IDA7CisJdTggcnNwWzE2XTsKKwl1OCBzd2l0Y2hfYnVzX3dpZHRoOworCXUzMiB2b2x0YWdlID0gMDsKKwl1OCBjbWRbNV0sIGJ1Zls2NF07CisJdTE2IHNkX2NhcmRfdHlwZTsKKworCVNFVF9TRChzZF9jYXJkKTsKKwlDTFJfUkVUUllfU0QyMF9NT0RFKHNkX2NhcmQpOworU3dpdGNoX0ZhaWw6CisJaSA9IDA7CisJaiA9IDA7CisJayA9IDA7CisJaGlfY2FwX2Zsb3cgPSAwOworCXN1cHBvcnRfMXY4ID0gMDsKKyNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKKwlpZiAoc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgJiBTRF9VTkxPQ0tfUE9XX09OKQorCQlnb3RvIFNEX1VOTE9DS19FTlRSWTsKKyNlbmRpZgorCisJcmV0dmFsID0gc2RfcHJlcGFyZV9yZXNldChjaGlwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXNkX2R1bW15X2Nsb2NrKGNoaXApOworCisJLyogU3RhcnQgSW5pdGlhbGl6YXRpb24gUHJvY2VzcyBvZiBTRCBDYXJkICovCitSVFlfU0RfUlNUOgorCXJldHZhbCA9CisJICAgIHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgR09fSURMRV9TVEFURSwgMCwgU0RfUlNQX1RZUEVfUjAsIE5VTEwsCisJCQkJMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwl3YWl0X3RpbWVvdXQoMjApOworCisJcmV0dmFsID0KKwkgICAgc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRU5EX0lGX0NPTkQsIDB4MDAwMDAxQUEsIFNEX1JTUF9UWVBFX1I3LAorCQkJCXJzcCwgNSk7CisJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykgeworCQlpZiAoKHJzcFs0XSA9PSAweEFBKSAmJiAoKHJzcFszXSAmIDB4MGYpID09IDB4MDEpKSB7CisJCQloaV9jYXBfZmxvdyA9IDE7CisJCQlpZiAoQ0hLX1JFVFJZX1NEMjBfTU9ERShzZF9jYXJkKSkgeworCQkJCXZvbHRhZ2UgPQorCQkJCSAgICBTVVBQT1JUX1ZPTFRBR0UgfAorCQkJCSAgICBTVVBQT1JUX0hJR0hfQU5EX0VYVEVOREVEX0NBUEFDSVRZOworCQkJfSBlbHNlIHsKKwkJCQl2b2x0YWdlID0KKwkJCQkgICAgU1VQUE9SVF9WT0xUQUdFIHwKKwkJCQkgICAgU1VQUE9SVF9ISUdIX0FORF9FWFRFTkRFRF9DQVBBQ0lUWSB8CisJCQkJICAgIFNVUFBPUlRfTUFYX1BPV0VSX1BFUk1BTkNFIHwgU1VQUE9SVF8xVjg7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIWhpX2NhcF9mbG93KSB7CisJCXZvbHRhZ2UgPSBTVVBQT1JUX1ZPTFRBR0U7CisKKwkJcmV0dmFsID0KKwkJICAgIHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgR09fSURMRV9TVEFURSwgMCwgU0RfUlNQX1RZUEVfUjAsCisJCQkJCU5VTEwsIDApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCXdhaXRfdGltZW91dCgyMCk7CisJfQorCisJLyogQUNNRDQxICovCisJZG8geworCQl7CisJCQl1OCB0ZW1wID0gMDsKKwkJCXJ0czUxeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIENBUkRfSU5UX1BFTkQsICZ0ZW1wKTsKKwkJCVJUUzUxWF9ERUJVR1AoIkNBUkRfSU5UX1BFTkQ6JXhcbiIsIHRlbXApOworCQkJaWYgKHRlbXAgJiBTRF9JTlQpIHsKKwkJCQljaGlwLT5yZXNldF9uZWVkX3JldHJ5ID0gMTsKKwkJCQlydHM1MXhfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9JTlRfUEVORCwKKwkJCQkJCSAgICAgIFhEX0lOVCB8IFNEX0lOVCB8IE1TX0lOVCwKKwkJCQkJCSAgICAgIFhEX0lOVCB8IFNEX0lOVCB8IE1TX0lOVCk7CisJCQkJc2Rfc2V0X3Jlc2V0X2ZhaWwoY2hpcCwgU0RfUkVTRVRfRkFJTCk7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCX0KKwkJfQorCitSVFlfQ01ENTU6CisJCXJldHZhbCA9CisJCSAgICBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEFQUF9DTUQsIDAsIFNEX1JTUF9UWVBFX1IxLCBOVUxMLAorCQkJCQkwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJaWYgKG1vbml0b3JfY2FyZF9jZChjaGlwLCBTRF9DQVJEKSA9PSBDRF9OT1RfRVhJU1QpIHsKKwkJCQlzZF9zZXRfcmVzZXRfZmFpbChjaGlwLCBTRF9SRVNFVF9GQUlMKTsKKwkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJfQorCisJCQlqKys7CisJCQlpZiAoY2hpcC0+b3B0aW9uLnNwZWVkX21tYykgeworCQkJCWlmIChqIDwgMikKKwkJCQkJZ290byBSVFlfQ01ENTU7CisJCQkJZWxzZQorCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoaiA8IDMpCisJCQkJCWdvdG8gUlRZX1NEX1JTVDsKKwkJCQllbHNlCisJCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQl9CisJCX0KKworCQlyZXR2YWwgPQorCQkgICAgc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRF9BUFBfT1BfQ09ORCwgdm9sdGFnZSwKKwkJCQkJU0RfUlNQX1RZUEVfUjMsIHJzcCwgNSk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWsrKzsKKwkJCWlmIChrIDwgMykKKwkJCQlnb3RvIFJUWV9TRF9SU1Q7CisJCQllbHNlCisJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJfQorCisJCWkrKzsKKwkJd2FpdF90aW1lb3V0KDIwKTsKKwl9IHdoaWxlICghKHJzcFsxXSAmIDB4ODApICYmIChpIDwgMjU1KSk7IC8qIE5vdCBjb21wbGV0ZSBwb3dlciBvbiAqLworCisJaWYgKGkgPT0gMjU1KSB7CisJCS8qIFRpbWUgb3V0ICovCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJfQorCisJaWYgKGhpX2NhcF9mbG93KSB7CisJCWlmIChyc3BbMV0gJiAweDQwKQorCQkJU0VUX1NEX0hDWEMoc2RfY2FyZCk7CisJCWVsc2UKKwkJCUNMUl9TRF9IQ1hDKHNkX2NhcmQpOworCQlpZiAoIUNIS19SRVRSWV9TRDIwX01PREUoc2RfY2FyZCkpIHsKKwkJCWlmICgoQ0hLX1NEX0hDWEMoc2RfY2FyZCkpICYmIChDSEVDS19VSFM1MChjaGlwKSkpIHsKKwkJCQlzdXBwb3J0XzF2OCA9IChyc3BbMV0gJiAweDAxKSA/IDEgOiAwOworCQkJCVJUUzUxWF9ERUJVR1AoInN1cHBvcnRfMXY4ID0gJWRcbiIsCisJCQkJCSAgICAgICBzdXBwb3J0XzF2OCk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlDTFJfU0RfSENYQyhzZF9jYXJkKTsKKwkJc3VwcG9ydF8xdjggPSAwOworCX0KKworCS8qIENNRDExOiBTd2l0Y2ggVm9sdGFnZSAqLworCWlmIChzdXBwb3J0XzF2OCAmJiBDSEVDS19VSFM1MChjaGlwKQorCSAgICAmJiAhKCgodTgpIGNoaXAtPm9wdGlvbi5zZF9zcGVlZF9wcmlvciAmIFNEUjEwNF9TVVBQT1JUKSA9PQorCQkgSFNfU1VQUE9SVCkpIHsKKwkJcmV0dmFsID0gc2Rfdm9sdGFnZV9zd2l0Y2goY2hpcCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCVNFVF9SRVRSWV9TRDIwX01PREUoc2RfY2FyZCk7CisJCQlzZF9pbml0X3Bvd2VyKGNoaXApOworCQkJUlRTNTFYX0RFQlVHUCgiMS44diBzd2l0Y2ggZmFpbFxuIik7CisJCQlnb3RvIFN3aXRjaF9GYWlsOworCQl9CisJfQorCisJLyogQ01EIDIgKi8KKwlyZXR2YWwgPQorCSAgICBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEFMTF9TRU5EX0NJRCwgMCwgU0RfUlNQX1RZUEVfUjIsIE5VTEwsIDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJLyogQ01EIDMgKi8KKwlyZXR2YWwgPQorCSAgICBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFTkRfUkVMQVRJVkVfQUREUiwgMCwgU0RfUlNQX1RZUEVfUjYsCisJCQkJcnNwLCA1KTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXNkX2NhcmQtPnNkX2FkZHIgPSAodTMyKSByc3BbMV0gPDwgMjQ7CisJc2RfY2FyZC0+c2RfYWRkciArPSAodTMyKSByc3BbMl0gPDwgMTY7CisKKwkvKiBHZXQgQ1NEIHJlZ2lzdGVyIGZvciBDYWxjdWxhdGluZyBUaW1pbmcsQ2FwYWNpdHksCisJICogQ2hlY2sgQ1NEIHRvIGRldGVybWFpbmUgYXMgaWYgdGhpcyBpcyB0aGUgU0QgUk9NIGNhcmQgKi8KKwlyZXR2YWwgPSBzZF9jaGVja19jc2QoY2hpcCwgMSk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJLyogU2VsZWN0IFNEIGNhcmQgKi8KKwlyZXR2YWwgPSBzZF9zZWxlY3RfY2FyZChjaGlwLCAxKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKyNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKK1NEX1VOTE9DS19FTlRSWToKKwkvKiBHZXQgU0QgbG9jayBzdGF0dXMgKi8KKwlyZXR2YWwgPSBzZF91cGRhdGVfbG9ja19zdGF0dXMoY2hpcCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKworCWlmIChzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyAmIFNEX0xPQ0tFRCkgeworCQlzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyB8PSAoU0RfTE9DS18xQklUX01PREUgfCBTRF9QV0RfRVhJU1QpOworCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CisJfSBlbHNlIGlmICghKHNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzICYgU0RfVU5MT0NLX1BPV19PTikpIHsKKwkJc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgJj0gflNEX1BXRF9FWElTVDsKKwl9CisjZW5kaWYKKworCS8qIEFDTUQ0MiAqLworCXJldHZhbCA9CisJICAgIHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgQVBQX0NNRCwgc2RfY2FyZC0+c2RfYWRkciwgU0RfUlNQX1RZUEVfUjEsCisJCQkJTlVMTCwgMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlyZXR2YWwgPQorCSAgICBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFVF9DTFJfQ0FSRF9ERVRFQ1QsIDAsIFNEX1JTUF9UWVBFX1IxLAorCQkJCU5VTEwsIDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJaWYgKHN1cHBvcnRfMXY4KSB7CisJCS8qIEFDTUQ2ICovCisJCXJldHZhbCA9CisJCSAgICBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEFQUF9DTUQsIHNkX2NhcmQtPnNkX2FkZHIsCisJCQkJCVNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCQkvKiBFbmFibGUgNCBiaXQgZGF0YSBidXMgKi8KKwkJcmV0dmFsID0KKwkJICAgIHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VUX0JVU19XSURUSCwgMiwgU0RfUlNQX1RZUEVfUjEsCisJCQkJCU5VTEwsIDApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCXN3aXRjaF9idXNfd2lkdGggPSBTRF9CVVNfV0lEVEhfNDsKKwl9IGVsc2UgeworCQlzd2l0Y2hfYnVzX3dpZHRoID0gU0RfQlVTX1dJRFRIXzE7CisJfQorCisJLyogU2V0IGJsb2NrIGxlbmd0aCA1MTIgYnl0ZXMgZm9yIGFsbCBibG9jayBjb21tYW5kcyAqLworCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VUX0JMT0NLTEVOLAorCQkJMHgyMDAsIFNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCVJUUzUxWF9XUklURV9SRUcoY2hpcCwgU0RfQ0ZHMSwgU0RfQ0xLX0RJVklERV9NQVNLLCBTRF9DTEtfRElWSURFXzApOworCisJaWYgKCEoc2RfY2FyZC0+cmF3X2NzZFs0XSAmIDB4NDApKSB7CisJCXNkX2RvbnRfc3dpdGNoID0gMTsKKwkJUlRTNTFYX0RFQlVHUCgiTm90IHN1cHBvcnQgY2xhc3MgdGVuXG4iKTsKKwl9CisKKwlpZiAoIXNkX2RvbnRfc3dpdGNoKSB7CisJCS8qIENoZWNrIHRoZSBjYXJkIHdoZXRoZXIgZmxvdyBTRDEuMSBzcGVjIG9yIGhpZ2hlciAqLworCQlyZXR2YWwgPSBzZF9jaGVja19zcGVjKGNoaXAsIHN3aXRjaF9idXNfd2lkdGgpOworCQlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKSB7CisJCQlyZXR2YWwgPSBzZF9zd2l0Y2hfZnVuY3Rpb24oY2hpcCwgc3dpdGNoX2J1c193aWR0aCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJaWYgKChzZF9jYXJkLT5zZF9zd2l0Y2hfZmFpbCA9PQorCQkJCSAgICAgU0RSMTA0X1NVUFBPUlRfTUFTSykKKwkJCQkgICAgfHwgKHNkX2NhcmQtPnNkX3N3aXRjaF9mYWlsID09CisJCQkJCUREUjUwX1NVUFBPUlRfTUFTSykKKwkJCQkgICAgfHwgKHNkX2NhcmQtPnNkX3N3aXRjaF9mYWlsID09CisJCQkJCSAgICBTRFI1MF9TVVBQT1JUX01BU0spKSB7CisJCQkJCXNkX2luaXRfcG93ZXIoY2hpcCk7CisJCQkJCVNFVF9SRVRSWV9TRDIwX01PREUoc2RfY2FyZCk7CisJCQkJfSBlbHNlIGlmIChzZF9jYXJkLT5zZF9zd2l0Y2hfZmFpbCA9PQorCQkJCQkJSFNfU1VQUE9SVF9NQVNLKSB7CisJCQkJCXNkX2RvbnRfc3dpdGNoID0gMTsKKwkJCQl9CisJCQkJZ290byBTd2l0Y2hfRmFpbDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChzdXBwb3J0XzF2OCkgeworCQkJCVNFVF9SRVRSWV9TRDIwX01PREUoc2RfY2FyZCk7CisJCQkJc2RfaW5pdF9wb3dlcihjaGlwKTsKKwkJCQlzZF9kb250X3N3aXRjaCA9IDE7CisKKwkJCQlnb3RvIFN3aXRjaF9GYWlsOworCQkJfQorCQl9CisJfQorCisJaWYgKCFzdXBwb3J0XzF2OCkgeworCQkvKiBBQ01ENiAqLworCQlyZXR2YWwgPQorCQkgICAgc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBBUFBfQ01ELCBzZF9jYXJkLT5zZF9hZGRyLAorCQkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkJLyogRW5hYmxlIDQgYml0IGRhdGEgYnVzICovCisJCXJldHZhbCA9CisJCSAgICBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFVF9CVVNfV0lEVEgsIDIsIFNEX1JTUF9UWVBFX1IxLAorCQkJCQlOVUxMLCAwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKyNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKKwkvKiBjbGVhciAxIGJpdCBtb2RlIHN0YXR1cyAqLworCXNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzICY9IH5TRF9MT0NLXzFCSVRfTU9ERTsKKyNlbmRpZgorCisJaWYgKENIS19TRDMwX1NQRUVEKHNkX2NhcmQpKSB7CisJCXJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRDMwX0RSSVZFX1NFTCwgU0QzMF9EUklWRV9NQVNLLAorCQkJCSAgICAgIDB4MDMpOworCisJCXJldHZhbCA9IHNkX3NldF9pbml0X3BhcmEoY2hpcCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCQlpZiAoQ0hLX1NEX0REUjUwKHNkX2NhcmQpKQorCQkJcmV0dmFsID0gc2RfZGRyX3R1bmluZyhjaGlwKTsKKwkJZWxzZQorCQkJcmV0dmFsID0gc2Rfc2RyX3R1bmluZyhjaGlwKTsKKworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlTRVRfUkVUUllfU0QyMF9NT0RFKHNkX2NhcmQpOworCQkJUlRTNTFYX0RFQlVHUCgidHVuaW5nIHBoYXNlIGZhaWwsZ290byBTRDIwIG1vZGVcbiIpOworCQkJc2RfaW5pdF9wb3dlcihjaGlwKTsKKwkJCUNMUl9TRDMwX1NQRUVEKHNkX2NhcmQpOworCQkJZ290byBTd2l0Y2hfRmFpbDsKKwkJfQorCQlpZiAoU1RBVFVTX1NVQ0NFU1MgPT0KKwkJICAgIHNkX3dhaXRfY3VycmVudHN0YXRlX2RhdGFyZWFkeShjaGlwLCAweDA4LCAxLCAyMCkpIHsKKwkJCWNtZFswXSA9IDB4NDAgfCBSRUFEX1NJTkdMRV9CTE9DSzsKKwkJCWNtZFsxXSA9IDB4MDA7CisJCQljbWRbMl0gPSAweDAwOworCQkJY21kWzNdID0gMHgwMDsKKwkJCWNtZFs0XSA9IDB4MDA7CisJCQlyZXR2YWwgPQorCQkJICAgIHNkX3JlYWRfZGF0YShjaGlwLCBTRF9UTV9OT1JNQUxfUkVBRCwgY21kLCA1LCA1MTIsCisJCQkJCSAxLCBTRF9CVVNfV0lEVEhfNCwgTlVMTCwgMCwgNjAwKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlTRVRfUkVUUllfU0QyMF9NT0RFKHNkX2NhcmQpOworCQkJCVJUUzUxWF9ERUJVR1AoInJlYWQgbGJhMCBmYWlsLCIKKwkJCQkJCQkiZ290byBTRDIwIG1vZGVcbiIpOworCQkJCXNkX2luaXRfcG93ZXIoY2hpcCk7CisJCQkJQ0xSX1NEMzBfU1BFRUQoc2RfY2FyZCk7CisJCQkJZ290byBTd2l0Y2hfRmFpbDsKKwkJCX0KKwkJfQorCX0KKwlzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFTkRfU1RBVFVTLCBzZF9jYXJkLT5zZF9hZGRyLCBTRF9SU1BfVFlQRV9SMSwKKwkJCSAgICBOVUxMLCAwKTsKKworCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgQVBQX0NNRCwgc2RfY2FyZC0+c2RfYWRkciwKKwkJCVNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwKTsKKwlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKSB7CisJCWludCByZXQ7CisJCWNtZFswXSA9IDB4NDAgfCBTRU5EX1NUQVRVUzsKKwkJY21kWzFdID0gMHgwMDsKKwkJY21kWzJdID0gMHgwMDsKKwkJY21kWzNdID0gMHgwMDsKKwkJY21kWzRdID0gMHgwMDsKKwkJcmV0ID0KKwkJICAgIHNkX3JlYWRfZGF0YShjaGlwLCBTRF9UTV9OT1JNQUxfUkVBRCwgY21kLCA1LCA2NCwgMSwKKwkJCQkgU0RfQlVTX1dJRFRIXzQsIGJ1ZiwgNjQsIDYwMCk7CisJCWlmIChyZXQgPT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXNkX2NhcmRfdHlwZSA9ICgodTE2KSBidWZbMl0gPDwgOCkgfCAodTE2KSBidWZbM107CisJCQlSVFM1MVhfREVCVUdQKCJzZF9jYXJkX3R5cGU6MHglNHhcbiIsIHNkX2NhcmRfdHlwZSk7CisJCQlpZiAoKHNkX2NhcmRfdHlwZSA9PSAweDAwMDEpCisJCQkgICAgfHwgKHNkX2NhcmRfdHlwZSA9PSAweDAwMDIpKQorCQkJCWNoaXAtPmNhcmRfd3AgfD0gU0RfQ0FSRDsKKwkJfSBlbHNlIHsKKwkJCXJ0czUxeF9jbGVhcl9zZF9lcnJvcihjaGlwKTsKKwkJCXNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VORF9TVEFUVVMsIHNkX2NhcmQtPnNkX2FkZHIsCisJCQkJCSAgICBTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7CisJCX0KKwl9IGVsc2UgeworCQlydHM1MXhfY2xlYXJfc2RfZXJyb3IoY2hpcCk7CisJCXNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VORF9TVEFUVVMsIHNkX2NhcmQtPnNkX2FkZHIsCisJCQkJICAgIFNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwKTsKKwl9CisKKwkvKiBDaGVjayBTRCBNYWNoYW5pY2FsIFdyaXRlLVByb3RlY3QgU3dpdGNoICovCisJcmV0dmFsID0gcnRzNTF4X2dldF9jYXJkX3N0YXR1cyhjaGlwLCAmKGNoaXAtPmNhcmRfc3RhdHVzKSk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJaWYgKGNoaXAtPmNhcmRfc3RhdHVzICYgU0RfV1ApCisJCWNoaXAtPmNhcmRfd3AgfD0gU0RfQ0FSRDsKKworCWNoaXAtPmNhcmRfYnVzX3dpZHRoW2NoaXAtPmNhcmQybHVuW1NEX0NBUkRdXSA9IDQ7CisKKyNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKKwlpZiAoc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgJiBTRF9VTkxPQ0tfUE9XX09OKSB7CisJCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9CTE9DS19DTlRfSCwgMHhGRiwgMHgwMik7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0JMT0NLX0NOVF9MLCAweEZGLCAweDAwKTsKKworCQlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DLCAxMDApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgbW1jX3Rlc3Rfc3dpdGNoX2J1cyhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IHdpZHRoKQoreworCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKwlpbnQgcmV0dmFsOworCXU4IGJ1Zls4XSA9IHsgMCB9LCBidXNfd2lkdGg7CisJdTE2IGJ5dGVfY250OworCWludCBsZW47CisKKwlyZXR2YWwgPQorCSAgICBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEJVU1RFU1RfVywgMCwgU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJaWYgKHdpZHRoID09IE1NQ184QklUX0JVUykgeworCQlidWZbMF0gPSAweDU1OworCQlidWZbMV0gPSAweEFBOworCQlsZW4gPSA4OworCQlieXRlX2NudCA9IDg7CisJCWJ1c193aWR0aCA9IFNEX0JVU19XSURUSF84OworCX0gZWxzZSB7CisJCWJ1ZlswXSA9IDB4NUE7CisJCWxlbiA9IDQ7CisJCWJ5dGVfY250ID0gNDsKKwkJYnVzX3dpZHRoID0gU0RfQlVTX1dJRFRIXzQ7CisJfQorCisJcmV0dmFsID0gc2Rfd3JpdGVfZGF0YShjaGlwLCBTRF9UTV9BVVRPX1dSSVRFXzMsCisJCQkgICAgICAgTlVMTCwgMCwgYnl0ZV9jbnQsIDEsIGJ1c193aWR0aCwgYnVmLCBsZW4sIDEwMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQl1OCB2YWwxID0gMCwgdmFsMiA9IDA7CisJCXJ0czUxeF9lcDBfcmVhZF9yZWdpc3RlcihjaGlwLCBTRF9TVEFUMSwgJnZhbDEpOworCQlydHM1MXhfZXAwX3JlYWRfcmVnaXN0ZXIoY2hpcCwgU0RfU1RBVDIsICZ2YWwyKTsKKwkJcnRzNTF4X2NsZWFyX3NkX2Vycm9yKGNoaXApOworCQlpZiAoKHZhbDEgJiAweEUwKSB8fCB2YWwyKQorCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwl9CisJUlRTNTFYX0RFQlVHUCgiU0QvTU1DIENNRCAlZFxuIiwgQlVTVEVTVF9SKTsKKworCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCS8qIENNRDE0ICovCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQ01EMCwgMHhGRiwgMHg0MCB8IEJVU1RFU1RfUik7CisKKwlpZiAod2lkdGggPT0gTU1DXzhCSVRfQlVTKQorCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9CWVRFX0NOVF9MLCAweEZGLCAweDA4KTsKKwllbHNlCisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0JZVEVfQ05UX0wsIDB4RkYsIDB4MDQpOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQkxPQ0tfQ05UX0wsIDB4RkYsIDEpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0JMT0NLX0NOVF9ILCAweEZGLCAwKTsKKworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0NGRzIsIDB4RkYsCisJCSAgICAgICBTRF9DQUxDVUxBVEVfQ1JDNyB8IFNEX05PX0NIRUNLX0NSQzE2IHwKKwkJICAgICAgIFNEX05PX1dBSVRfQlVTWV9FTkQgfCBTRF9DSEVDS19DUkM3IHwgU0RfUlNQX0xFTl82KTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX0RBVEFfU09VUkNFLCAweDAxLAorCQkgICAgICAgUElOR1BPTkdfQlVGRkVSKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9UUkFOU0ZFUiwgMHhGRiwKKwkJICAgICAgIFNEX1RNX05PUk1BTF9SRUFEIHwgU0RfVFJBTlNGRVJfU1RBUlQpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIENIRUNLX1JFR19DTUQsIFNEX1RSQU5TRkVSLCBTRF9UUkFOU0ZFUl9FTkQsCisJCSAgICAgICBTRF9UUkFOU0ZFUl9FTkQpOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCBQUEJVRl9CQVNFMiwgMCwgMCk7CisJaWYgKHdpZHRoID09IE1NQ184QklUX0JVUykgeworCQlsZW4gPSAzOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIFBQQlVGX0JBU0UyICsgMSwgMCwgMCk7CisJfSBlbHNlIHsKKwkJbGVuID0gMjsKKwl9CisKKwlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DUiwgMTAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHZhbCA9IHJ0czUxeF9nZXRfcnNwKGNoaXAsIGxlbiwgMTAwKTsKKwlpZiAoQ0hFQ0tfU0RfVFJBTlNfRkFJTChjaGlwLCByZXR2YWwpKSB7CisJCXJ0czUxeF9jbGVhcl9zZF9lcnJvcihjaGlwKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwl9CisKKwlydHM1MXhfcmVhZF9yc3BfYnVmKGNoaXAsIDEsIGJ1ZiwgMik7CisKKwlpZiAod2lkdGggPT0gTU1DXzhCSVRfQlVTKSB7CisJCVJUUzUxWF9ERUJVR1AoIkJVU1RFU1RfUiBbOGJpdHNdOiAweCUwMnggMHglMDJ4XG4iLAorCQkJCQlidWZbMF0sIGJ1ZlsxXSk7CisJCWlmICgoYnVmWzBdID09IDB4QUEpICYmIChidWZbMV0gPT0gMHg1NSkpIHsKKwkJCXU4IHJzcFs1XTsKKwkJCXUzMiBhcmc7CisKKwkJCWlmIChDSEtfTU1DX0REUjUyKHNkX2NhcmQpKQorCQkJCWFyZyA9IDB4MDNCNzA2MDA7CisJCQllbHNlCisJCQkJYXJnID0gMHgwM0I3MDIwMDsKKwkJCS8qIFN3aXRjaCBNTUMgdG8gIDgtYml0IG1vZGUgKi8KKwkJCXJldHZhbCA9CisJCQkgICAgc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTV0lUQ0gsIGFyZywKKwkJCQkJCVNEX1JTUF9UWVBFX1IxYiwgcnNwLCA1KTsKKwkJCWlmICgocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKQorCQkJICAgICYmICEocnNwWzRdICYgTU1DX1NXSVRDSF9FUlIpKQorCQkJCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKKwkJfQorCX0gZWxzZSB7CisJCVJUUzUxWF9ERUJVR1AoIkJVU1RFU1RfUiBbNGJpdHNdOiAweCUwMnhcbiIsIGJ1ZlswXSk7CisJCWlmIChidWZbMF0gPT0gMHhBNSkgeworCQkJdTggcnNwWzVdOworCQkJdTMyIGFyZzsKKworCQkJaWYgKENIS19NTUNfRERSNTIoc2RfY2FyZCkpCisJCQkJYXJnID0gMHgwM0I3MDUwMDsKKwkJCWVsc2UKKwkJCQlhcmcgPSAweDAzQjcwMTAwOworCQkJLyogU3dpdGNoIE1NQyB0byAgNC1iaXQgbW9kZSAqLworCQkJcmV0dmFsID0KKwkJCSAgICBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNXSVRDSCwgYXJnLAorCQkJCQkJU0RfUlNQX1RZUEVfUjFiLCByc3AsIDUpOworCQkJaWYgKChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkgICAgJiYgIShyc3BbNF0gJiBNTUNfU1dJVENIX0VSUikpCisJCQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworCQl9CisJfQorCisJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKK30KKworc3RhdGljIGludCBtbWNfc3dpdGNoX3RpbWluZ19idXMoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKwlpbnQgcmV0dmFsOworCXU4IGNhcmRfdHlwZSwgY2FyZF90eXBlX21hc2sgPSAwOworCXU4IGJ1Zls2XTsKKworCUNMUl9NTUNfSFMoc2RfY2FyZCk7CisKKwlSVFM1MVhfREVCVUdQKCJTRC9NTUMgQ01EICVkXG4iLCBTRU5EX0VYVF9DU0QpOworCisJcnRzNTF4X2luaXRfY21kKGNoaXApOworCisJLyogU0VORF9FWFRfQ1NEIGNvbW1hbmQgKi8KKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9DTUQwLCAweEZGLAorCQkJMHg0MCB8IFNFTkRfRVhUX0NTRCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQ01EMSwgMHhGRiwgMCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQ01EMiwgMHhGRiwgMCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQ01EMywgMHhGRiwgMCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQ01ENCwgMHhGRiwgMCk7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9CWVRFX0NOVF9MLCAweEZGLCAwKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9CWVRFX0NOVF9ILCAweEZGLCAyKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9CTE9DS19DTlRfTCwgMHhGRiwgMSk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQkxPQ0tfQ05UX0gsIDB4RkYsIDApOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQ0ZHMiwgMHhGRiwKKwkJICAgICAgIFNEX0NBTENVTEFURV9DUkM3IHwgU0RfQ0hFQ0tfQ1JDMTYgfCBTRF9OT19XQUlUX0JVU1lfRU5ECisJCSAgICAgICB8IFNEX0NIRUNLX0NSQzcgfCBTRF9SU1BfTEVOXzYpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfREFUQV9TT1VSQ0UsIDB4MDEsCisJCSAgICAgICBQSU5HUE9OR19CVUZGRVIpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX1RSQU5TRkVSLCAweEZGLAorCQkgICAgICAgU0RfVE1fTk9STUFMX1JFQUQgfCBTRF9UUkFOU0ZFUl9TVEFSVCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgQ0hFQ0tfUkVHX0NNRCwgU0RfVFJBTlNGRVIsIFNEX1RSQU5TRkVSX0VORCwKKwkJICAgICAgIFNEX1RSQU5TRkVSX0VORCk7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIFBQQlVGX0JBU0UyICsgMTk2LCAweEZGLCAwKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIFBQQlVGX0JBU0UyICsgMjEyLCAweEZGLCAwKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIFBQQlVGX0JBU0UyICsgMjEzLCAweEZGLCAwKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIFBQQlVGX0JBU0UyICsgMjE0LCAweEZGLCAwKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIFBQQlVGX0JBU0UyICsgMjE1LCAweEZGLCAwKTsKKworCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0NSLCAxMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcmV0dmFsID0gcnRzNTF4X2dldF9yc3AoY2hpcCwgNiwgMTAwMCk7CisKKwlpZiAoQ0hFQ0tfU0RfVFJBTlNfRkFJTChjaGlwLCByZXR2YWwpKSB7CisJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1RJTUVET1VUKSB7CisJCQlydHM1MXhfY2xlYXJfc2RfZXJyb3IoY2hpcCk7CisJCQlzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFTkRfU1RBVFVTLCBzZF9jYXJkLT5zZF9hZGRyLAorCQkJCQkgICAgU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDApOworCQl9CisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJfQorCisJcnRzNTF4X3JlYWRfcnNwX2J1ZihjaGlwLCAwLCBidWYsIDYpOworCisJaWYgKGJ1ZlswXSAmIFNEX1RSQU5TRkVSX0VSUikgeworCQlzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFTkRfU1RBVFVTLCBzZF9jYXJkLT5zZF9hZGRyLAorCQkJCSAgICBTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7CisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJfQorCWlmIChDSEtfTU1DX1NFQ1RPUl9NT0RFKHNkX2NhcmQpKQorCQlzZF9jYXJkLT5jYXBhY2l0eSA9CisJCSAgICAoKHUzMikgYnVmWzVdIDw8IDI0KSB8ICgodTMyKSBidWZbNF0gPDwgMTYpIHwKKwkJICAgICgodTMyKSBidWZbM10gPDwgOCkgfCAoKHUzMikgYnVmWzJdKTsKKyNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKKwlpZiAoIShzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyAmIFNEX1NEUl9SU1QpICYmIENIRUNLX1VIUzUwKGNoaXApKQorCQljYXJkX3R5cGVfbWFzayA9IDB4MDc7CisJZWxzZQorCQljYXJkX3R5cGVfbWFzayA9IDB4MDM7CisjZWxzZQorCWlmIChDSEVDS19VSFM1MChjaGlwKSkKKwkJY2FyZF90eXBlX21hc2sgPSAweDA3OworCWVsc2UKKwkJY2FyZF90eXBlX21hc2sgPSAweDAzOworI2VuZGlmCisKKwljYXJkX3R5cGUgPSBidWZbMV0gJiBjYXJkX3R5cGVfbWFzazsKKwlpZiAoY2FyZF90eXBlKSB7CisJCS8qIENBUkQgVFlQRSBGSUVMRCA9IEREUjUyTUh6LCA1Mk1IeiBvciAyNk1IeiAqLworCQl1OCByc3BbNV07CisKKwkJaWYgKGNhcmRfdHlwZSAmIDB4MDQpCisJCQlTRVRfTU1DX0REUjUyKHNkX2NhcmQpOworCQllbHNlIGlmIChjYXJkX3R5cGUgJiAweDAyKQorCQkJU0VUX01NQ181Mk0oc2RfY2FyZCk7CisJCWVsc2UKKwkJCVNFVF9NTUNfMjZNKHNkX2NhcmQpOworCisJCXJldHZhbCA9CisJCSAgICBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNXSVRDSCwgMHgwM0I5MDEwMCwKKwkJCQkJU0RfUlNQX1RZUEVfUjFiLCByc3AsIDUpOworCQlpZiAoKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgfHwgKHJzcFs0XSAmIE1NQ19TV0lUQ0hfRVJSKSkKKwkJCUNMUl9NTUNfSFMoc2RfY2FyZCk7CisJfQorCXNkX2Nob29zZV9wcm9wZXJfY2xvY2soY2hpcCk7CisJcmV0dmFsID0gc3dpdGNoX2Nsb2NrKGNoaXAsIHNkX2NhcmQtPnNkX2Nsb2NrKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCS8qIFRlc3QgQnVzIFByb2NlZHVyZSAqLworCWlmIChtbWNfdGVzdF9zd2l0Y2hfYnVzKGNoaXAsIE1NQ184QklUX0JVUykgPT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJU0VUX01NQ184QklUKHNkX2NhcmQpOworCQljaGlwLT5jYXJkX2J1c193aWR0aFtjaGlwLT5jYXJkMmx1bltTRF9DQVJEXV0gPSA4OworI2lmZGVmIFNVUFBPUlRfU0RfTE9DSworCQlzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyAmPSB+U0RfTE9DS18xQklUX01PREU7CisjZW5kaWYKKwl9IGVsc2UgaWYgKG1tY190ZXN0X3N3aXRjaF9idXMoY2hpcCwgTU1DXzRCSVRfQlVTKSA9PSBTVEFUVVNfU1VDQ0VTUykgeworCQlTRVRfTU1DXzRCSVQoc2RfY2FyZCk7CisJCWNoaXAtPmNhcmRfYnVzX3dpZHRoW2NoaXAtPmNhcmQybHVuW1NEX0NBUkRdXSA9IDQ7CisjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCisJCXNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzICY9IH5TRF9MT0NLXzFCSVRfTU9ERTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCUNMUl9NTUNfOEJJVChzZF9jYXJkKTsKKwkJQ0xSX01NQ180QklUKHNkX2NhcmQpOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCByZXNldF9tbWMoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKwlpbnQgcmV0dmFsLCBpID0gMCwgaiA9IDAsIGsgPSAwOworCXU4IHJzcFsxNl07CisJdTggc3BlY192ZXIgPSAwOworCXU4IGNoYW5nZV90b19kZHI1MiA9IDE7CisJdTggY21kWzVdOworCisjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCisJaWYgKHNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzICYgU0RfVU5MT0NLX1BPV19PTikKKwkJZ290byBNTUNfVU5MT0NLX0VOVFJZOworI2VuZGlmCisKK01NQ19ERFJfRkFJTDoKKworCXJldHZhbCA9IHNkX3ByZXBhcmVfcmVzZXQoY2hpcCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlTRVRfTU1DKHNkX2NhcmQpOworCitSVFlfTU1DX1JTVDoKKwlyZXR2YWwgPQorCSAgICBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEdPX0lETEVfU1RBVEUsIDAsIFNEX1JTUF9UWVBFX1IwLCBOVUxMLAorCQkJCTApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJZG8geworCQl7CisJCQl1OCB0ZW1wID0gMDsKKwkJCXJ0czUxeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIENBUkRfSU5UX1BFTkQsICZ0ZW1wKTsKKwkJCWlmICh0ZW1wICYgU0RfSU5UKSB7CisJCQkJY2hpcC0+cmVzZXRfbmVlZF9yZXRyeSA9IDE7CisJCQkJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfSU5UX1BFTkQsCisJCQkJCQkgICAgICBYRF9JTlQgfCBTRF9JTlQgfCBNU19JTlQsCisJCQkJCQkgICAgICBYRF9JTlQgfCBTRF9JTlQgfCBNU19JTlQpOworCQkJCXNkX3NldF9yZXNldF9mYWlsKGNoaXAsIE1NQ19SRVNFVF9GQUlMKTsKKwkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJfQorCQl9CisKKwkJLyogQ01EICAxICovCisJCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VORF9PUF9DT05ELAorCQkJCQkgICAgIChTVVBQT1JUX1ZPTFRBR0UgfCAweDQwMDAwMDAwKSwKKwkJCQkJICAgICBTRF9SU1BfVFlQRV9SMywgcnNwLCA1KTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJaWYgKG1vbml0b3JfY2FyZF9jZChjaGlwLCBTRF9DQVJEKSA9PSBDRF9OT1RfRVhJU1QpIHsKKwkJCQlzZF9zZXRfcmVzZXRfZmFpbChjaGlwLCBNTUNfUkVTRVRfRkFJTCk7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCX0KKworCQkJaWYgKHNkX2NoZWNrX2Vycl9jb2RlKGNoaXAsIFNEX0JVU1kpCisJCQkgICAgfHwgc2RfY2hlY2tfZXJyX2NvZGUoY2hpcCwgU0RfVE9fRVJSKSkgeworCQkJCWsrKzsKKwkJCQlpZiAoayA8IDIwKSB7CisJCQkJCXNkX2Nscl9lcnJfY29kZShjaGlwKTsKKwkJCQkJZ290byBSVFlfTU1DX1JTVDsKKwkJCQl9IGVsc2UgeworCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaisrOworCQkJCWlmIChqIDwgMTAwKSB7CisJCQkJCXNkX2Nscl9lcnJfY29kZShjaGlwKTsKKwkJCQkJZ290byBSVFlfTU1DX1JTVDsKKwkJCQl9IGVsc2UgeworCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXdhaXRfdGltZW91dCgyMCk7CisJCWkrKzsKKwl9IHdoaWxlICghKHJzcFsxXSAmIDB4ODApICYmIChpIDwgMTAwKSk7IC8qIE5vdCBjb21wbGV0ZSBwb3dlciBvbiAqLworCisJaWYgKGkgPT0gMTAwKSB7CisJCS8qIFRpbWUgb3V0ICovCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJfQorCisJaWYgKChyc3BbMV0gJiAweDYwKSA9PSAweDQwKQorCQlTRVRfTU1DX1NFQ1RPUl9NT0RFKHNkX2NhcmQpOworCWVsc2UKKwkJQ0xSX01NQ19TRUNUT1JfTU9ERShzZF9jYXJkKTsKKworCS8qIENNRCAyICovCisJcmV0dmFsID0KKwkgICAgc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBBTExfU0VORF9DSUQsIDAsIFNEX1JTUF9UWVBFX1IyLCBOVUxMLCAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCS8qIENNRCAzICovCisJc2RfY2FyZC0+c2RfYWRkciA9IDB4MDAxMDAwMDA7CisJcmV0dmFsID0KKwkgICAgc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRVRfUkVMQVRJVkVfQUREUiwgc2RfY2FyZC0+c2RfYWRkciwKKwkJCQlTRF9SU1BfVFlQRV9SNiwgcnNwLCA1KTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCS8qIEdldCBDU0QgcmVnaXN0ZXIgZm9yIENhbGN1bGF0aW5nIFRpbWluZyxDYXBhY2l0eQorCSAqIENoZWNrIENTRCB0byBkZXRlcm1haW5lIGFzIGlmIHRoaXMgaXMgdGhlIFNEIFJPTSBjYXJkICovCisJcmV0dmFsID0gc2RfY2hlY2tfY3NkKGNoaXAsIDEpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCS8qIEdldCBNTUMgU3BlY19WZXIgaW4gdGhlIENTRCByZWdpc3RlciAqLworCXNwZWNfdmVyID0gKHNkX2NhcmQtPnJhd19jc2RbMF0gJiAweDNDKSA+PiAyOworCisJLyogU2VsZWN0IE1NQyBjYXJkICovCisJcmV0dmFsID0gc2Rfc2VsZWN0X2NhcmQoY2hpcCwgMSk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwkvKiBTZXQgYmxvY2sgbGVuZ3RoIDUxMiBieXRlcyBmb3IgYWxsIGJsb2NrIGNvbW1hbmRzICovCisJcmV0dmFsID0KKwkgICAgc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRVRfQkxPQ0tMRU4sIDB4MjAwLCBTRF9SU1BfVFlQRV9SMSwgTlVMTCwKKwkJCQkwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKyNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKK01NQ19VTkxPQ0tfRU5UUlk6CisJLyogR2V0IFNEIGxvY2sgc3RhdHVzICovCisJcmV0dmFsID0gc2RfdXBkYXRlX2xvY2tfc3RhdHVzKGNoaXApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisjZW5kaWYKKworCVJUUzUxWF9XUklURV9SRUcoY2hpcCwgU0RfQ0ZHMSwgU0RfQ0xLX0RJVklERV9NQVNLLCBTRF9DTEtfRElWSURFXzApOworCisJaWYgKGNoaXAtPmljX3ZlcnNpb24gPCAyKQorCQlydHM1MXhfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0QzMF9EUklWRV9TRUwsIFNEMzBfRFJJVkVfTUFTSywKKwkJCQkgICAgICAweDAyKTsKKwlydHM1MXhfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9EUklWRV9TRUwsIFNEMjBfRFJJVkVfTUFTSywgRFJJVkVfOG1BKTsKKworCWNoaXAtPmNhcmRfYnVzX3dpZHRoW2NoaXAtPmNhcmQybHVuW1NEX0NBUkRdXSA9IDE7CisJaWYgKHNwZWNfdmVyID09IDQpIHsKKwkJLyogTU1DIDQueCBDYXJkcyAqLworCQkodm9pZCltbWNfc3dpdGNoX3RpbWluZ19idXMoY2hpcCk7CisJfQorCisJaWYgKENIS19NTUNfU0VDVE9SX01PREUoc2RfY2FyZCkgJiYgKHNkX2NhcmQtPmNhcGFjaXR5ID09IDApKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJaWYgKENIS19NTUNfRERSNTIoc2RfY2FyZCkgJiYgY2hhbmdlX3RvX2RkcjUyKSB7CisJCS8qIENhcmQgaXMgZXh0cmFjdGVkIHdoaWxlIGlkZW50aWZ5aW5nICovCisJCWlmIChtb25pdG9yX2NhcmRfY2QoY2hpcCwgU0RfQ0FSRCkgPT0gQ0RfTk9UX0VYSVNUKQorCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKworCQlyZXR2YWwgPSBzZF9zZXRfaW5pdF9wYXJhKGNoaXApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlDTFJfTU1DX0REUjUyKHNkX2NhcmQpOworCQkJc2RfaW5pdF9wb3dlcihjaGlwKTsKKwkJCWNoYW5nZV90b19kZHI1MiA9IDA7CisJCQlnb3RvIE1NQ19ERFJfRkFJTDsKKwkJfQorCisJCXJldHZhbCA9IG1tY19kZHJfdHVuaW5nKGNoaXApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlDTFJfTU1DX0REUjUyKHNkX2NhcmQpOworCQkJc2RfaW5pdF9wb3dlcihjaGlwKTsKKwkJCWNoYW5nZV90b19kZHI1MiA9IDA7CisJCQlnb3RvIE1NQ19ERFJfRkFJTDsKKwkJfQorCisJCWlmIChTVEFUVVNfU1VDQ0VTUyA9PQorCQkgICAgc2Rfd2FpdF9jdXJyZW50c3RhdGVfZGF0YXJlYWR5KGNoaXAsIDB4MDgsIDEsIDIwKSkgeworCQkJY21kWzBdID0gMHg0MCB8IFJFQURfU0lOR0xFX0JMT0NLOworCQkJY21kWzFdID0gMHgwMDsKKwkJCWNtZFsyXSA9IDB4MDA7CisJCQljbWRbM10gPSAweDAwOworCQkJY21kWzRdID0gMHgwMDsKKwkJCWlmIChDSEtfTU1DXzhCSVQoc2RfY2FyZCkpIHsKKwkJCQlyZXR2YWwgPQorCQkJCSAgICBzZF9yZWFkX2RhdGEoY2hpcCwgU0RfVE1fTk9STUFMX1JFQUQsIGNtZCwKKwkJCQkJCSA1LCA1MTIsIDEsIFNEX0JVU19XSURUSF84LAorCQkJCQkJIE5VTEwsIDAsIDYwMCk7CisJCQl9IGVsc2UgaWYgKENIS19NTUNfNEJJVChzZF9jYXJkKSkgeworCQkJCXJldHZhbCA9CisJCQkJICAgIHNkX3JlYWRfZGF0YShjaGlwLCBTRF9UTV9OT1JNQUxfUkVBRCwgY21kLAorCQkJCQkJIDUsIDUxMiwgMSwgU0RfQlVTX1dJRFRIXzQsCisJCQkJCQkgTlVMTCwgMCwgNjAwKTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dmFsID0KKwkJCQkgICAgc2RfcmVhZF9kYXRhKGNoaXAsIFNEX1RNX05PUk1BTF9SRUFELCBjbWQsCisJCQkJCQkgNSwgNTEyLCAxLCBTRF9CVVNfV0lEVEhfMSwKKwkJCQkJCSBOVUxMLCAwLCA2MDApOworCQkJfQorCisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJQ0xSX01NQ19ERFI1MihzZF9jYXJkKTsKKwkJCQljaGFuZ2VfdG9fZGRyNTIgPSAwOworCQkJCVJUUzUxWF9ERUJVR1AoInJlYWQgbGJhMCBmYWlsLCIKKwkJCQkJCQkiZ290byBTRDIwIG1vZGVcbiIpOworCQkJCXNkX2luaXRfcG93ZXIoY2hpcCk7CisJCQkJZ290byBNTUNfRERSX0ZBSUw7CisJCQl9CisJCX0KKwl9CisjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCisJaWYgKHNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzICYgU0RfVU5MT0NLX1BPV19PTikgeworCQlydHM1MXhfaW5pdF9jbWQoY2hpcCk7CisKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQkxPQ0tfQ05UX0gsIDB4RkYsIDB4MDIpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9CTE9DS19DTlRfTCwgMHhGRiwgMHgwMCk7CisKKwkJcmV0dmFsID0gcnRzNTF4X3NlbmRfY21kKGNoaXAsIE1PREVfQywgMTAwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKyNlbmRpZgorCisJcmV0dmFsID0gcnRzNTF4X2dldF9jYXJkX3N0YXR1cyhjaGlwLCAmKGNoaXAtPmNhcmRfc3RhdHVzKSk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJaWYgKGNoaXAtPmNhcmRfc3RhdHVzICYgU0RfV1ApCisJCWNoaXAtPmNhcmRfd3AgfD0gU0RfQ0FSRDsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworaW50IHJlc2V0X3NkX2NhcmQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKwlpbnQgcmV0dmFsOworCWludCBpOworCisJbWVtc2V0KHNkX2NhcmQsIDAsIHNpemVvZihzdHJ1Y3Qgc2RfaW5mbykpOworCisJLyogSW5pdCB2YXJpYWJsZXMgKi8KKwlzZF9jYXJkLT5zZF90eXBlID0gMDsKKwlzZF9jYXJkLT5zZXFfbW9kZSA9IDA7CisJc2RfY2FyZC0+c2RfZGF0YV9idWZfcmVhZHkgPSAwOworCXNkX2NhcmQtPmNhcGFjaXR5ID0gMDsKKwlzZF9jYXJkLT5zZF9zd2l0Y2hfZmFpbCA9IDA7CisKKyNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKKwlzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyA9IDA7CisJc2RfY2FyZC0+c2RfZXJhc2Vfc3RhdHVzID0gMDsKKyNlbmRpZgorCisJc2RfY2xlYXJfcmVzZXRfZmFpbChjaGlwKTsKKwllbmFibGVfY2FyZF9jbG9jayhjaGlwLCBTRF9DQVJEKTsKKworCXNkX2luaXRfcG93ZXIoY2hpcCk7CisKKwljaGlwLT5yZXNldF9uZWVkX3JldHJ5ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWlmICghY2hpcC0+b3B0aW9uLnJlc2V0X21tY19maXJzdCkgeyAvKiByZXNldCBzZCBmaXJzdCAqLworCQkJcmV0dmFsID0gcmVzZXRfc2QoY2hpcCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJLyogU3dpdGNoIFNEIGJ1cyB0byAzVjMgc2lnbmFsICovCisJCQkJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBTRF9QQURfQ1RMLAorCQkJCQkJIFNEX0lPX1VTSU5HXzFWOCwgMCk7CisJCQkJaWYgKHNkX2NoZWNrX3Jlc2V0X2ZhaWwoY2hpcCwgU0RfUkVTRVRfRkFJTCkpCisJCQkJCXNkX2NsZWFyX3Jlc2V0X2ZhaWwoY2hpcCk7CisJCQkJZWxzZQorCQkJCQlyZXR2YWwgPSByZXNldF9tbWMoY2hpcCk7CisJCQl9CisJCX0gZWxzZSB7IC8qIHJlc2V0IE1NQyBmaXJzdCAqLworCQkJcmV0dmFsID0gcmVzZXRfbW1jKGNoaXApOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCWlmIChzZF9jaGVja19yZXNldF9mYWlsKGNoaXAsIE1NQ19SRVNFVF9GQUlMKSkgeworCQkJCQlzZF9jbGVhcl9yZXNldF9mYWlsKGNoaXApOworCQkJCX0gZWxzZSB7CisJCQkJCXJldHZhbCA9IHJlc2V0X3NkKGNoaXApOworCQkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJCQkvKiBTd2l0Y2ggU0QgYnVzIHRvCisJCQkJCQkgKiAzVjMgc2lnbmFsICovCisJCQkJCQlSVFM1MVhfV1JJVEVfUkVHKGNoaXAsCisJCQkJCQkJU0RfUEFEX0NUTCwKKwkJCQkJCQlTRF9JT19VU0lOR18xVjgsIDApOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpIHx8ICghY2hpcC0+cmVzZXRfbmVlZF9yZXRyeSkpIHsKKwkJCS8qIGlmIHJlc2V0IHN1Y2Nlc3Mgb3IgZG9uJ3QgbmVlZCByZXRyeSx0aGVuIGJyZWFrICovCisJCQlicmVhazsKKwkJfQorCQlpZiAobW9uaXRvcl9jYXJkX2NkKGNoaXAsIFNEX0NBUkQpID09IENEX05PVF9FWElTVCkgeworCQkJLyogY2FyZCBpcyBleHRyYWN0ZWQgKi8KKwkJCWJyZWFrOworCQl9CisJCVJUUzUxWF9ERUJVR1AoInJldHJ5IHJlc2V0IHNkIGNhcmQsJWRcbiIsIGkpOworCQljaGlwLT5yZXNldF9uZWVkX3JldHJ5ID0gMDsKKwl9CisKKwlzZF9jbGVhcl9yZXNldF9mYWlsKGNoaXApOworCWNoaXAtPnJlc2V0X25lZWRfcmV0cnkgPSAwOworCisJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHM1MXhfaW5pdF9jbWQoY2hpcCk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0NGRzEsIFNEX0NMS19ESVZJREVfTUFTSywKKwkJCSAgICAgICBTRF9DTEtfRElWSURFXzApOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9CWVRFX0NOVF9MLCAweEZGLCAwKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQllURV9DTlRfSCwgMHhGRiwgMik7CisJCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0MsIDEwMCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwl9IGVsc2UgeworCQljaGlwLT5jYXBhY2l0eVtjaGlwLT5jYXJkMmx1bltTRF9DQVJEXV0gPSBzZF9jYXJkLT5jYXBhY2l0eSA9IDA7CisJCWlmIChjaGlwLT5vcHRpb24ucmVzZXRfb3JfcndfZmFpbF9zZXRfcGFkX2RyaXZlKSB7CisJCQlydHM1MXhfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9EUklWRV9TRUwsCisJCQkJCSAgICAgIFNEMjBfRFJJVkVfTUFTSywgRFJJVkVfOG1BKTsKKwkJfQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCX0KKworCWNoaXAtPmNhcGFjaXR5W2NoaXAtPmNhcmQybHVuW1NEX0NBUkRdXSA9IHNkX2NhcmQtPmNhcGFjaXR5OworCisJaWYgKGNoaXAtPm9wdGlvbi5zZF9zZW5kX3N0YXR1c19lbikgeworCQlzZF9jYXJkLT5zZF9zZW5kX3N0YXR1c19lbiA9IDE7CisJfSBlbHNlIHsKKwkJaWYgKHNkX2NhcmQtPmNhcGFjaXR5ID4gMHgyMDAwMCkgeyAvKiA2NE1CICovCisJCQlzZF9jYXJkLT5zZF9zZW5kX3N0YXR1c19lbiA9IDA7CisJCX0gZWxzZSB7CisJCQlzZF9jYXJkLT5zZF9zZW5kX3N0YXR1c19lbiA9IDE7CisJCX0KKwl9CisJUlRTNTFYX0RFQlVHUCgic2RfY2FyZC0+c2Rfc2VuZF9zdGF0dXMgPSAlZFxuIiwKKwkJICAgICAgIHNkX2NhcmQtPnNkX3NlbmRfc3RhdHVzX2VuKTsKKworCXJldHZhbCA9IHNkX3NldF9pbml0X3BhcmEoY2hpcCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlSVFM1MVhfREVCVUdQKCJzZF9jYXJkLT5zZF90eXBlID0gMHgleFxuIiwgc2RfY2FyZC0+c2RfdHlwZSk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKKyNkZWZpbmUgV0FJVF9EQVRBX1JFQURZX1JUWV9DTlQJCTI1NQorCitzdGF0aWMgaW50IHdhaXRfZGF0YV9idWZfcmVhZHkoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKwlpbnQgaSwgcmV0dmFsOworCisJZm9yIChpID0gMDsgaSA8IFdBSVRfREFUQV9SRUFEWV9SVFlfQ05UOyBpKyspIHsKKwkJaWYgKG1vbml0b3JfY2FyZF9jZChjaGlwLCBTRF9DQVJEKSA9PSBDRF9OT1RfRVhJU1QpCisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJCXNkX2NhcmQtPnNkX2RhdGFfYnVmX3JlYWR5ID0gMDsKKworCQlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFTkRfU1RBVFVTLAorCQkJCQkgICAgIHNkX2NhcmQtPnNkX2FkZHIsIFNEX1JTUF9UWVBFX1IxLAorCQkJCQkgICAgIE5VTEwsIDApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwkJaWYgKHNkX2NhcmQtPnNkX2RhdGFfYnVmX3JlYWR5KQorCQkJcmV0dXJuIHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VORF9TVEFUVVMsCisJCQkJCQkgICBzZF9jYXJkLT5zZF9hZGRyLAorCQkJCQkJICAgU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDApOworCX0KKworCXNkX3NldF9lcnJfY29kZShjaGlwLCBTRF9UT19FUlIpOworCisJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKK30KKwordm9pZCBzZF9zdG9wX3NlcV9tb2RlKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CisJaW50IHJldHZhbDsKKworCWlmIChzZF9jYXJkLT5zZXFfbW9kZSkgeworCQlyZXR2YWwgPSBzZF9zd2l0Y2hfY2xvY2soY2hpcCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlyZXR1cm47CisKKwkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTVE9QX1RSQU5TTUlTU0lPTiwgMCwKKwkJCQkJICAgICBTRF9SU1BfVFlQRV9SMWIsIE5VTEwsIDApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX1NUU19FUlIpOworCQlzZF9jYXJkLT5zZXFfbW9kZSA9IDA7CisKKwkJcnRzNTF4X2VwMF93cml0ZV9yZWdpc3RlcihjaGlwLCBNQ19GSUZPX0NUTCwgRklGT19GTFVTSCwKKwkJCQkJICBGSUZPX0ZMVVNIKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNkX2F1dG9fdHVuZV9jbG9jayhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOworCWludCByZXR2YWw7CisKKwlpZiAoY2hpcC0+YXNpY19jb2RlKSB7CisJCWlmIChzZF9jYXJkLT5zZF9jbG9jayA+IDMwKQorCQkJc2RfY2FyZC0+c2RfY2xvY2sgLT0gMjA7CisJfSBlbHNlIHsKKwkJaWYgKHNkX2NhcmQtPnNkX2Nsb2NrID09IENMS18xMDApCisJCQlzZF9jYXJkLT5zZF9jbG9jayA9IENMS184MDsKKwkJZWxzZSBpZiAoc2RfY2FyZC0+c2RfY2xvY2sgPT0gQ0xLXzgwKQorCQkJc2RfY2FyZC0+c2RfY2xvY2sgPSBDTEtfNjA7CisJCWVsc2UgaWYgKHNkX2NhcmQtPnNkX2Nsb2NrID09IENMS182MCkKKwkJCXNkX2NhcmQtPnNkX2Nsb2NrID0gQ0xLXzUwOworCX0KKworCXJldHZhbCA9IHNkX3N3aXRjaF9jbG9jayhjaGlwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworaW50IHNkX3J3KHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1MzIgc3RhcnRfc2VjdG9yLAorCSAgdTE2IHNlY3Rvcl9jbnQpCit7CisJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOworCXUzMiBkYXRhX2FkZHI7CisJaW50IHJldHZhbDsKKwl1OCBmbGFnOworCXVuc2lnbmVkIGludCBwaXBlOworCXU4IHN0YWdlZmxhZzsKKworCXNkX2NhcmQtPmNvdW50ZXIgPSAwOworCisJaWYgKCFDSEtfU0RfSENYQyhzZF9jYXJkKSAmJiAhQ0hLX01NQ19TRUNUT1JfTU9ERShzZF9jYXJkKSkKKwkJZGF0YV9hZGRyID0gc3RhcnRfc2VjdG9yIDw8IDk7CisJZWxzZQorCQlkYXRhX2FkZHIgPSBzdGFydF9zZWN0b3I7CisKKwlSVFM1MVhfREVCVUdQKCJzZF9ydywgZGF0YV9hZGRyID0gMHgleFxuIiwgZGF0YV9hZGRyKTsKKworCXNkX2Nscl9lcnJfY29kZShjaGlwKTsKKworCXJldHZhbCA9IHNkX3N3aXRjaF9jbG9jayhjaGlwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCWlmIChzZF9jYXJkLT5zZXFfbW9kZSAmJiAoKHNkX2NhcmQtPnByZV9kaXIgIT0gc3JiLT5zY19kYXRhX2RpcmVjdGlvbikKKwkJCQkgIHx8CisJCQkJICAoKHNkX2NhcmQtPnByZV9zZWNfYWRkciArCisJCQkJICAgIHNkX2NhcmQtPnByZV9zZWNfY250KSAhPSBzdGFydF9zZWN0b3IpKSkgeworCQlpZiAoKHNkX2NhcmQtPnByZV9kaXIgPT0gRE1BX0ZST01fREVWSUNFKQorCQkgICAgJiYgIUNIS19TRDMwX1NQRUVEKHNkX2NhcmQpCisJCSAgICAmJiAhQ0hLX1NEX0hTKHNkX2NhcmQpCisJCSAgICAmJiAhQ0hLX01NQ19IUyhzZF9jYXJkKQorCQkgICAgJiYgc2RfY2FyZC0+c2Rfc2VuZF9zdGF0dXNfZW4pIHsKKwkJCXNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VORF9TVEFUVVMsCisJCQkJCSAgICBzZF9jYXJkLT5zZF9hZGRyLCBTRF9SU1BfVFlQRV9SMSwKKwkJCQkJICAgIE5VTEwsIDApOworCQl9CisKKwkJcmV0dmFsID0KKwkJICAgIHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU1RPUF9UUkFOU01JU1NJT04sIDAsCisJCQkJCVNEX1JTUF9UWVBFX1IxYiwgTlVMTCwgMCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXNkX3NldF9lcnJfY29kZShjaGlwLCBTRF9TVFNfRVJSKTsKKwkJCVRSQUNFX1JFVChjaGlwLCBzZF9wYXJzZV9lcnJfY29kZShjaGlwKSk7CisJCX0KKworCQlzZF9jYXJkLT5zZXFfbW9kZSA9IDA7CisKKwkJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBNQ19GSUZPX0NUTCwgRklGT19GTFVTSCwgRklGT19GTFVTSCk7CisKKwkJaWYgKCFDSEtfU0QzMF9TUEVFRChzZF9jYXJkKQorCQkgICAgJiYgIUNIS19TRF9IUyhzZF9jYXJkKQorCQkgICAgJiYgIUNIS19NTUNfSFMoc2RfY2FyZCkKKwkJICAgICYmIHNkX2NhcmQtPnNkX3NlbmRfc3RhdHVzX2VuKSB7CisJCQkvKiByYW5kb20gcncsIHNvIHByZV9zZWNfY250IDwgMHg4MCAqLworCQkJc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRU5EX1NUQVRVUywKKwkJCQkJICAgIHNkX2NhcmQtPnNkX2FkZHIsIFNEX1JTUF9UWVBFX1IxLAorCQkJCQkgICAgTlVMTCwgMCk7CisJCX0KKwl9CisKKwlydHM1MXhfaW5pdF9jbWQoY2hpcCk7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9CWVRFX0NOVF9MLCAweEZGLCAweDAwKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9CWVRFX0NOVF9ILCAweEZGLCAweDAyKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9CTE9DS19DTlRfTCwgMHhGRiwKKwkJICAgICAgICh1OCkgc2VjdG9yX2NudCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQkxPQ0tfQ05UX0gsIDB4RkYsCisJCSAgICAgICAodTgpIChzZWN0b3JfY250ID4+IDgpKTsKKworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfREFUQV9TT1VSQ0UsIDB4MDEsCisJCSAgICAgICBSSU5HX0JVRkZFUik7CisKKwlpZiAoQ0hLX01NQ184QklUKHNkX2NhcmQpKQorCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9DRkcxLCAweDAzLAorCQkJICAgICAgIFNEX0JVU19XSURUSF84KTsKKwllbHNlIGlmIChDSEtfTU1DXzRCSVQoc2RfY2FyZCkgfHwgQ0hLX1NEKHNkX2NhcmQpKQorCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9DRkcxLCAweDAzLAorCQkJICAgICAgIFNEX0JVU19XSURUSF80KTsKKwllbHNlCisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0NGRzEsIDB4MDMsCisJCQkgICAgICAgU0RfQlVTX1dJRFRIXzEpOworCisJaWYgKHNkX2NhcmQtPnNlcV9tb2RlKSB7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0NGRzIsIDB4RkYsCisJCQkgICAgICAgU0RfTk9fQ0FMQ1VMQVRFX0NSQzcgfCBTRF9DSEVDS19DUkMxNiB8CisJCQkgICAgICAgU0RfTk9fV0FJVF9CVVNZX0VORCB8IFNEX05PX0NIRUNLX0NSQzcgfAorCQkJICAgICAgIFNEX1JTUF9MRU5fMCk7CisKKwkJdHJhbnNfZG1hX2VuYWJsZShzcmItPnNjX2RhdGFfZGlyZWN0aW9uLCBjaGlwLCBzZWN0b3JfY250ICogNTEyLAorCQkJCSBETUFfNTEyKTsKKworCQlpZiAoc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKKwkJCWZsYWcgPSBNT0RFX0NESVI7CisJCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9UUkFOU0ZFUiwgMHhGRiwKKwkJCQkgICAgICAgU0RfVE1fQVVUT19SRUFEXzMgfCBTRF9UUkFOU0ZFUl9TVEFSVCk7CisJCX0gZWxzZSB7CisJCQlmbGFnID0gTU9ERV9DRE9SOworCQkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfVFJBTlNGRVIsIDB4RkYsCisJCQkJICAgICAgIFNEX1RNX0FVVE9fV1JJVEVfMyB8IFNEX1RSQU5TRkVSX1NUQVJUKTsKKwkJfQorCisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIENIRUNLX1JFR19DTUQsIFNEX1RSQU5TRkVSLAorCQkJICAgICAgIFNEX1RSQU5TRkVSX0VORCwgU0RfVFJBTlNGRVJfRU5EKTsKKworCQlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgZmxhZywgMTAwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0gZWxzZSB7CisJCWlmIChzcmItPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkgeworCQkJUlRTNTFYX0RFQlVHUCgiU0QvTU1DIENNRCAlZFxuIiwgUkVBRF9NVUxUSVBMRV9CTE9DSyk7CisJCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9DTUQwLCAweEZGLAorCQkJCSAgICAgICAweDQwIHwgUkVBRF9NVUxUSVBMRV9CTE9DSyk7CisJCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9DTUQxLCAweEZGLAorCQkJCSAgICAgICAodTgpIChkYXRhX2FkZHIgPj4gMjQpKTsKKwkJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0NNRDIsIDB4RkYsCisJCQkJICAgICAgICh1OCkgKGRhdGFfYWRkciA+PiAxNikpOworCQkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQ01EMywgMHhGRiwKKwkJCQkgICAgICAgKHU4KSAoZGF0YV9hZGRyID4+IDgpKTsKKwkJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0NNRDQsIDB4RkYsCisJCQkJICAgICAgICh1OCkgZGF0YV9hZGRyKTsKKworCQkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQ0ZHMiwgMHhGRiwKKwkJCQkgICAgICAgU0RfQ0FMQ1VMQVRFX0NSQzcgfCBTRF9DSEVDS19DUkMxNiB8CisJCQkJICAgICAgIFNEX05PX1dBSVRfQlVTWV9FTkQgfCBTRF9DSEVDS19DUkM3IHwKKwkJCQkgICAgICAgU0RfUlNQX0xFTl82KTsKKworCQkJdHJhbnNfZG1hX2VuYWJsZShzcmItPnNjX2RhdGFfZGlyZWN0aW9uLCBjaGlwLAorCQkJCQkgc2VjdG9yX2NudCAqIDUxMiwgRE1BXzUxMik7CisKKwkJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX1RSQU5TRkVSLCAweEZGLAorCQkJCSAgICAgICBTRF9UTV9BVVRPX1JFQURfMiB8IFNEX1RSQU5TRkVSX1NUQVJUKTsKKwkJCXJ0czUxeF9hZGRfY21kKGNoaXAsIENIRUNLX1JFR19DTUQsIFNEX1RSQU5TRkVSLAorCQkJCSAgICAgICBTRF9UUkFOU0ZFUl9FTkQsIFNEX1RSQU5TRkVSX0VORCk7CisKKwkJCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0NESVIsIDEwMCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCQl9IGVsc2UgeworCQkJcmV0dmFsID0gcnRzNTF4X3NlbmRfY21kKGNoaXAsIE1PREVfQywgNTApOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCXJ0czUxeF9jbGVhcl9zZF9lcnJvcihjaGlwKTsKKworCQkJCXNkX3NldF9lcnJfY29kZShjaGlwLCBTRF9UT19FUlIpOworCQkJCVRSQUNFX1JFVChjaGlwLCBzZF9wYXJzZV9lcnJfY29kZShjaGlwKSk7CisJCQl9CisKKwkJCXJldHZhbCA9IHdhaXRfZGF0YV9idWZfcmVhZHkoY2hpcCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX1RPX0VSUik7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIHNkX3BhcnNlX2Vycl9jb2RlKGNoaXApKTsKKwkJCX0KKworCQkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBXUklURV9NVUxUSVBMRV9CTE9DSywKKwkJCQkJCSAgICAgZGF0YV9hZGRyLCBTRF9SU1BfVFlQRV9SMSwKKwkJCQkJCSAgICAgTlVMTCwgMCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX0NSQ19FUlIpOworCQkJCVRSQUNFX1JFVChjaGlwLCBzZF9wYXJzZV9lcnJfY29kZShjaGlwKSk7CisJCQl9CisKKwkJCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCQkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQ0ZHMiwgMHhGRiwKKwkJCQkgICAgICAgU0RfTk9fQ0FMQ1VMQVRFX0NSQzcgfCBTRF9DSEVDS19DUkMxNiB8CisJCQkJICAgICAgIFNEX05PX1dBSVRfQlVTWV9FTkQgfCBTRF9OT19DSEVDS19DUkM3IHwKKwkJCQkgICAgICAgU0RfUlNQX0xFTl8wKTsKKworCQkJdHJhbnNfZG1hX2VuYWJsZShzcmItPnNjX2RhdGFfZGlyZWN0aW9uLCBjaGlwLAorCQkJCQkgc2VjdG9yX2NudCAqIDUxMiwgRE1BXzUxMik7CisKKwkJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX1RSQU5TRkVSLCAweEZGLAorCQkJCSAgICAgICBTRF9UTV9BVVRPX1dSSVRFXzMgfCBTRF9UUkFOU0ZFUl9TVEFSVCk7CisJCQlydHM1MXhfYWRkX2NtZChjaGlwLCBDSEVDS19SRUdfQ01ELCBTRF9UUkFOU0ZFUiwKKwkJCQkgICAgICAgU0RfVFJBTlNGRVJfRU5ELCBTRF9UUkFOU0ZFUl9FTkQpOworCisJCQlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DRE9SLCAxMDApOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkJfQorCisJCXNkX2NhcmQtPnNlcV9tb2RlID0gMTsKKwl9CisKKwlpZiAoc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKKwkJcGlwZSA9IFJDVl9CVUxLX1BJUEUoY2hpcCk7CisJCXN0YWdlZmxhZyA9IFNUQUdFX0RJOworCX0gZWxzZSB7CisJCXBpcGUgPSBTTkRfQlVMS19QSVBFKGNoaXApOworCQlzdGFnZWZsYWcgPSBTVEFHRV9ETzsKKwl9CisKKwlyZXR2YWwgPQorCSAgICBydHM1MXhfdHJhbnNmZXJfZGF0YV9yY2MoY2hpcCwgcGlwZSwgc2NzaV9zZ2xpc3Qoc3JiKSwKKwkJCQkgICAgIHNjc2lfYnVmZmxlbihzcmIpLCBzY3NpX3NnX2NvdW50KHNyYiksCisJCQkJICAgICBOVUxMLCAxMDAwMCwgc3RhZ2VmbGFnKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXU4IHN0YXQgPSAwOworCQlpbnQgZXJyID0gcmV0dmFsOworCisJCXNkX3ByaW50X2RlYnVnX3JlZyhjaGlwKTsKKworCQlydHM1MXhfZXAwX3JlYWRfcmVnaXN0ZXIoY2hpcCwgU0RfU1RBVDEsICZzdGF0KTsKKwkJUlRTNTFYX0RFQlVHUCgiU0RfU1RBVDE6IDB4JXhcbiIsIHN0YXQpOworCisJCXJ0czUxeF9jbGVhcl9zZF9lcnJvcihjaGlwKTsKKworCQlyZXR2YWwgPQorCQkgICAgc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTVE9QX1RSQU5TTUlTU0lPTiwgMCwKKwkJCQkJU0RfUlNQX1RZUEVfUjFiLCBOVUxMLCAwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX1NUU19FUlIpOworCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCX0KKworCQlpZiAoc3RhdCAmIChTRF9DUkM3X0VSUiB8IFNEX0NSQzE2X0VSUiB8IFNEX0NSQ19XUklURV9FUlIpKSB7CisJCQlSVFM1MVhfREVCVUdQKCJTRCBDUkMgZXJyb3IsIHR1bmUgY2xvY2shXG4iKTsKKwkJCXNkX2F1dG9fdHVuZV9jbG9jayhjaGlwKTsKKwkJfQorCisJCXNkX2NhcmQtPnNlcV9tb2RlID0gMDsKKworCQlUUkFDRV9SRVQoY2hpcCwgZXJyKTsKKwl9CisJcmV0dmFsID0gcnRzNTF4X2dldF9yc3AoY2hpcCwgMSwgMjAwMCk7CisJaWYgKENIRUNLX1NEX1RSQU5TX0ZBSUwoY2hpcCwgcmV0dmFsKSkgeworCQlydHM1MXhfY2xlYXJfc2RfZXJyb3IoY2hpcCk7CisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJfQorCisJc2RfY2FyZC0+cHJlX3NlY19hZGRyID0gc3RhcnRfc2VjdG9yOworCXNkX2NhcmQtPnByZV9zZWNfY250ID0gc2VjdG9yX2NudDsKKwlzZF9jYXJkLT5wcmVfZGlyID0gc3JiLT5zY19kYXRhX2RpcmVjdGlvbjsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKwordm9pZCBzZF9jbGVhbnVwX3dvcmsoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKworCWlmIChzZF9jYXJkLT5zZXFfbW9kZSkgeworCQlSVFM1MVhfREVCVUdQKCJTRDogc3RvcCB0cmFuc21pc3Npb25cbiIpOworCQlzZF9zdG9wX3NlcV9tb2RlKGNoaXApOworCQlzZF9jYXJkLT5jb3VudGVyID0gMDsKKwl9Cit9CisKK2lubGluZSB2b2lkIHNkX2ZpbGxfcG93ZXJfb2ZmX2NhcmQzdjMoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfQ0xLX0VOLCBTRF9DTEtfRU4sIDApOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9PRSwgU0RfT1VUUFVUX0VOLCAwKTsKKwlpZiAoIWNoaXAtPm9wdGlvbi5GVDJfZmFzdF9tb2RlKSB7CisjaWZkZWYgU0RfWERfSU9fRk9MTE9XX1BXUgorCQlpZiAoQ0hFQ0tfUEtHKGNoaXAsIExRRlA0OCkKKwkJICAgIHx8IGNoaXAtPm9wdGlvbi5ydHM1MTI5X0QzMzE4X29mZl9lbmFibGUpCisJCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BXUl9DVEwsCisJCQkJICAgICAgIFBPV0VSX01BU0sgfCBMRE9fT0ZGLAorCQkJCSAgICAgICBQT1dFUl9PRkYgfCBMRE9fT0ZGKTsKKwkJZWxzZQorCQkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QV1JfQ1RMLAorCQkJCSAgICAgICBQT1dFUl9NQVNLLCBQT1dFUl9PRkYpOworI2Vsc2UKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QV1JfQ1RMLCBQT1dFUl9NQVNLLAorCQkJICAgICAgIFBPV0VSX09GRik7CisjZW5kaWYKKwl9Cit9CisKK2ludCBzZF9wb3dlcl9vZmZfY2FyZDN2MyhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJaW50IHJldHZhbDsKKworCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCXNkX2ZpbGxfcG93ZXJfb2ZmX2NhcmQzdjMoY2hpcCk7CisKKwlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DLCAxMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworI2lmZGVmIFNEX1hEX0lPX0ZPTExPV19QV1IKKwlpZiAoIWNoaXAtPm9wdGlvbi5GVDJfZmFzdF9tb2RlKQorCQl3YWl0X3RpbWVvdXQoY2hpcC0+b3B0aW9uLkQzMzE4X29mZl9kZWxheSk7CisjZW5kaWYKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworaW50IHJlbGVhc2Vfc2RfY2FyZChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOworCWludCByZXR2YWw7CisKKwlSVFM1MVhfREVCVUdQKCJlbGVhc2Vfc2RfY2FyZFxuIik7CisKKwljaGlwLT5jYXJkX3JlYWR5ICY9IH5TRF9DQVJEOworCWNoaXAtPmNhcmRfZmFpbCAmPSB+U0RfQ0FSRDsKKwljaGlwLT5jYXJkX3dwICY9IH5TRF9DQVJEOworCisjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCisJc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgPSAwOworCXNkX2NhcmQtPnNkX2VyYXNlX3N0YXR1cyA9IDA7CisjZW5kaWYKKworCW1lbXNldChzZF9jYXJkLT5yYXdfY3NkLCAwLCAxNik7CisJbWVtc2V0KHNkX2NhcmQtPnJhd19zY3IsIDAsIDgpOworCisJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNGU01fRUQsIEhXX0NNRF9TVE9QLCBIV19DTURfU1RPUCk7CisJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX1BBRF9DVEwsIFNEX0lPX1VTSU5HXzFWOCwgMCk7CisJaWYgKENIRUNLX1BLRyhjaGlwLCBMUUZQNDgpIHx8IGNoaXAtPm9wdGlvbi5ydHM1MTI5X0QzMzE4X29mZl9lbmFibGUpCisJCXNkX3Bvd2VyX29mZl9jYXJkM3YzKGNoaXApOworCisJcnRzNTF4X2luaXRfY21kKGNoaXApOworCWlmICghKENIRUNLX1BLRyhjaGlwLCBMUUZQNDgpIHx8IGNoaXAtPm9wdGlvbi5ydHM1MTI5X0QzMzE4X29mZl9lbmFibGUpKQorCQlzZF9maWxsX3Bvd2VyX29mZl9jYXJkM3YzKGNoaXApOworCisJaWYgKGNoaXAtPmFzaWNfY29kZSkKKwkJc2RfcHVsbF9jdGxfZGlzYWJsZShjaGlwKTsKKwllbHNlCisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIEZQR0FfUFVMTF9DVEwsCisJCQkgICAgICAgRlBHQV9TRF9QVUxMX0NUTF9CSVQgfCAweDIwLAorCQkJICAgICAgIEZQR0FfU0RfUFVMTF9DVExfQklUKTsKKworCS8qIFN3aXRjaCBMRE8zMzE4IHRvIDMuM1YgKi8KKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBMRE9fUE9XRVJfQ0ZHLCBUVU5FX1NEMThfTUFTSywKKwkJICAgICAgIFRVTkVfU0QxOF8zVjMpOworCisJaWYgKENIS19NTUNfRERSNTIoc2RfY2FyZCkgJiYgQ0hLX01NQ184QklUKHNkX2NhcmQpKQorCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX0RNQTFfQ1RMLAorCQkJICAgICAgIEVYVEVORF9ETUExX0FTWU5DX1NJR05BTCwKKwkJCSAgICAgICBFWFRFTkRfRE1BMV9BU1lOQ19TSUdOQUwpOworCWlmIChDSEtfU0QzMF9TUEVFRChzZF9jYXJkKSB8fCBDSEtfTU1DKHNkX2NhcmQpKQorCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRDMwX0RSSVZFX1NFTCwKKwkJCSAgICAgICBTRDMwX0RSSVZFX01BU0ssIGNoaXAtPm9wdGlvbi5zZDMwX3BhZF9kcml2ZSk7CisJLyogU3VzcGVuZCBMRE8zMzE4ICovCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QV1JfQ1RMLCBMRE8zMzE4X1BXUl9NQVNLLAorCQkgICAgICAgTERPX1NVU1BFTkQpOworCisJcmV0dmFsID0gcnRzNTF4X3NlbmRfY21kKGNoaXAsIE1PREVfQywgMTAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwl3YWl0X3RpbWVvdXQoMjApOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvc2QuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3NkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwNWVkYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3NkLmgKQEAgLTAsMCArMSwzMDQgQEAKKy8qIERyaXZlciBmb3IgUmVhbHRlayBSVFM1MXh4IFVTQiBjYXJkIHJlYWRlcgorICogSGVhZGVyIGZpbGUKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOSBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogQXV0aG9yOgorICogICB3d2FuZyAod2VpX3dhbmdAcmVhbHNpbC5jb20uY24pCisgKiAgIE5vLiA0NTAsIFNoZW5odSBSb2FkLCBTdXpob3UgSW5kdXN0cnkgUGFyaywgU3V6aG91LCBDaGluYQorICogTWFpbnRhaW5lcjoKKyAqICAgRWR3aW4gUm9uZyAoZWR3aW5fcm9uZ0ByZWFsc2lsLmNvbS5jbikKKyAqICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisgKi8KKworI2lmbmRlZiBfX1JUUzUxWF9TRF9ICisjZGVmaW5lIF9fUlRTNTFYX1NEX0gKKworI2luY2x1ZGUgInJ0czUxeF9jaGlwLmgiCisKKyNkZWZpbmUgU0RfTUFYX1JFVFJZX0NPVU5UCTMKKworI2RlZmluZSBTVVBQT1JUX1ZPTFRBR0UJMHgwMDNDMDAwMAorCisjZGVmaW5lIFNEX1JFU0VUX0ZBSUwJMHgwMQorI2RlZmluZSBNTUNfUkVTRVRfRkFJTCAgMHgwMgorCisvKiBFcnJvciBDb2RlICovCisjZGVmaW5lCVNEX05PX0VSUk9SCQkweDAKKyNkZWZpbmUJU0RfQ1JDX0VSUgkJMHg4MAorI2RlZmluZQlTRF9UT19FUlIJCTB4NDAKKyNkZWZpbmUJU0RfTk9fQ0FSRAkJMHgyMAorI2RlZmluZSBTRF9CVVNZCQkJMHgxMAorI2RlZmluZQlTRF9TVFNfRVJSCQkweDA4CisjZGVmaW5lIFNEX1JTUF9USU1FT1VUCQkweDA0CisKKy8qIE1NQy9TRCBDb21tYW5kIEluZGV4ICovCisvKiBCYXNpYyBjb21tYW5kIChjbGFzcyAwKSAqLworI2RlZmluZSBHT19JRExFX1NUQVRFCQkwCisjZGVmaW5lCVNFTkRfT1BfQ09ORAkJMSAvKiByZXNlcnZlZCBmb3IgU0QgKi8KKyNkZWZpbmUJQUxMX1NFTkRfQ0lECQkyCisjZGVmaW5lCVNFVF9SRUxBVElWRV9BRERSCTMKKyNkZWZpbmUJU0VORF9SRUxBVElWRV9BRERSCTMKKyNkZWZpbmUJU0VUX0RTUgkJCTQKKyNkZWZpbmUgSU9fU0VORF9PUF9DT05ECQk1CisjZGVmaW5lCVNXSVRDSAkJCTYKKyNkZWZpbmUJU0VMRUNUX0NBUkQJCTcKKyNkZWZpbmUJREVTRUxFQ1RfQ0FSRAkJNworLyogQ01EOCBpcyAiU0VORF9FWFRfQ1NEIiBmb3IgTU1DNC54IFNwZWMKKyAqIHdoaWxlIGlzICJTRU5EX0lGX0NPTkQiIGZvciBTRCAyLjAgKi8KKyNkZWZpbmUJU0VORF9FWFRfQ1NECQk4CisjZGVmaW5lCVNFTkRfSUZfQ09ORAkJOAorLyogZW5kICAqLworI2RlZmluZQlTRU5EX0NTRAkJOQorI2RlZmluZQlTRU5EX0NJRAkJMTAKKyNkZWZpbmUJVk9MVEFHRV9TV0lUQ0gJCTExCisjZGVmaW5lCVJFQURfREFUX1VUSUxfU1RPUAkxMSAvKiByZXNlcnZlZCBmb3IgU0QgKi8KKyNkZWZpbmUJU1RPUF9UUkFOU01JU1NJT04JMTIKKyNkZWZpbmUJU0VORF9TVEFUVVMJCTEzCisjZGVmaW5lCUdPX0lOQUNUSVZFX1NUQVRFCTE1CisKKy8qIEJsb2NrIG9yaWVudGVkIHJlYWQgY29tbWFuZHMgKGNsYXNzIDIpICovCisjZGVmaW5lCVNFVF9CTE9DS0xFTgkJMTYKKyNkZWZpbmUJUkVBRF9TSU5HTEVfQkxPQ0sJMTcKKyNkZWZpbmUJUkVBRF9NVUxUSVBMRV9CTE9DSwkxOAorI2RlZmluZQlTRU5EX1RVTklOR19QQVRURVJOCTE5CisKKy8qIEJ1cyBXaWR0aCBUZXN0ICovCisjZGVmaW5lCUJVU1RFU1RfUgkJMTQKKyNkZWZpbmUJQlVTVEVTVF9XCQkxOQorLyogZW5kICovCisKKy8qIEJsb2NrIG9yaWVudGVkIHdyaXRlIGNvbW1hbmRzIChjbGFzcyA0KSAqLworI2RlZmluZQlXUklURV9CTE9DSwkJMjQKKyNkZWZpbmUJV1JJVEVfTVVMVElQTEVfQkxPQ0sJMjUKKyNkZWZpbmUJUFJPR1JBTV9DU0QJCTI3CisKKy8qIEVyYXNlIGNvbW1hbmRzICovCisjZGVmaW5lCUVSQVNFX1dSX0JMS19TVEFSVAkzMgorI2RlZmluZQlFUkFTRV9XUl9CTEtfRU5ECTMzCisjZGVmaW5lCUVSQVNFX0NNRAkJMzgKKworLyogQmxvY2sgT3JpZW50ZWQgV3JpdGUgUHJvdGVjdGlvbiBDb21tYW5kcyAqLworI2RlZmluZSBMT0NLX1VOTE9DSwkJNDIKKworI2RlZmluZQlJT19SV19ESVJFQ1QJCTUyCisKKy8qIEFwcGxpY2F0aW9uIHNwZWNpZmljIGNvbW1hbmRzIChjbGFzcyA4KSAqLworI2RlZmluZQlBUFBfQ01ECQkJNTUKKyNkZWZpbmUJR0VOX0NNRAkJCTU2CisKKy8qIFNEIEFwcGxpY2F0aW9uIGNvbW1hbmQgSW5kZXggKi8KKyNkZWZpbmUJU0VUX0JVU19XSURUSAkJCTYKKyNkZWZpbmUJU0RfU1RBVFVTCQkJMTMKKyNkZWZpbmUJU0VORF9OVU1fV1JfQkxPQ0tTCQkyMgorI2RlZmluZQlTRVRfV1JfQkxLX0VSQVNFX0NPVU5UCQkyMworI2RlZmluZQlTRF9BUFBfT1BfQ09ORAkJCTQxCisjZGVmaW5lCVNFVF9DTFJfQ0FSRF9ERVRFQ1QJCTQyCisjZGVmaW5lCVNFTkRfU0NSCQkJNTEKKworLyogU0QgVElNRU9VVCBmdW5jdGlvbiByZXR1cm4gZXJyb3IgKi8KKyNkZWZpbmUJU0RfUkVBRF9DT01QTEVURQkweDAwCisjZGVmaW5lCVNEX1JFQURfVE8JCTB4MDEKKyNkZWZpbmUJU0RfUkVBRF9BRFZFTkNFCQkweDAyCisKKy8qIFNEIHYxLjEgQ01ENiBTV0lUQ0ggZnVuY3Rpb24gKi8KKyNkZWZpbmUJU0RfQ0hFQ0tfTU9ERQkJMHgwMAorI2RlZmluZQlTRF9TV0lUQ0hfTU9ERQkJMHg4MAorI2RlZmluZQlTRF9GVU5DX0dST1VQXzEJCTB4MDEKKyNkZWZpbmUJU0RfRlVOQ19HUk9VUF8yCQkweDAyCisjZGVmaW5lCVNEX0ZVTkNfR1JPVVBfMwkJMHgwMworI2RlZmluZQlTRF9GVU5DX0dST1VQXzQJCTB4MDQKKyNkZWZpbmUJU0RfQ0hFQ0tfU1BFQ19WMV8xCTB4RkYKKworLyogU0QgQ29tbWFuZCBBcmd1bWVudCAqLworI2RlZmluZQlOT19BUkdVTUVOVAkgICAgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lCUNIRUNLX1BBVFRFUk4JCQkJMHgwMDAwMDBBQQorI2RlZmluZQlWT0xUQUdFX1NVUFBMWV9SQU5HRQkJCTB4MDAwMDAxMDAgLyogMi43fjMuNlYgKi8KKyNkZWZpbmUJU1VQUE9SVF9ISUdIX0FORF9FWFRFTkRFRF9DQVBBQ0lUWQkweDQwMDAwMDAwCisjZGVmaW5lCVNVUFBPUlRfTUFYX1BPV0VSX1BFUk1BTkNFCSAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZQlTVVBQT1JUXzFWOAkgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCisKKy8qIFN3aXRjaCBDb21tYW5kIEVycm9yIENvZGUgKi8KKyNkZWZpbmUJU1dUSUNIX05PX0VSUgkgIDB4MDAKKyNkZWZpbmUJQ0FSRF9OT1RfRVhJU1QJICAweDAxCisjZGVmaW5lCVNQRUNfTk9UX1NVUFBPUlQgIDB4MDIKKyNkZWZpbmUJQ0hFQ0tfTU9ERV9FUlIJICAweDAzCisjZGVmaW5lCUNIRUNLX05PVF9SRUFEWQkgIDB4MDQKKyNkZWZpbmUJU1dJVENIX0NSQ19FUlIJICAweDA1CisjZGVmaW5lCVNXSVRDSF9NT0RFX0VSUgkgIDB4MDYKKyNkZWZpbmUJU1dJVENIX1BBU1MJICAweDA3CisKKyNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKKy8qIENNRDQyIFBhcmFtZXRlciAqLworI2RlZmluZSBTRF9FUkFTRQkJMHgwOAorI2RlZmluZSBTRF9MT0NLCQkJMHgwNAorI2RlZmluZSBTRF9VTkxPQ0sJCTB4MDAKKyNkZWZpbmUgU0RfQ0xSX1BXRAkJMHgwMgorI2RlZmluZSBTRF9TRVRfUFdECQkweDAxCisKKyNkZWZpbmUgU0RfUFdEX0xFTgkJMHgxMAorCisvKiBTRCBsb2NrIHVubG9jayBTdGF0dXMgKi8KKyNkZWZpbmUgU0RfTE9DS0VECQkweDgwCS8qIEdsb2JhbCBsb2NrIHN0YXR1cyAqLworI2RlZmluZSBTRF9MT0NLXzFCSVRfTU9ERQkweDQwIC8qKi8KKyNkZWZpbmUgU0RfUFdEX0VYSVNUCQkweDIwCisjZGVmaW5lIFNEX1VOTE9DS19QT1dfT04JMHgwMSAvKiovCisjZGVmaW5lIFNEX1NEUl9SU1QJCTB4MDIgLyogUmVzZXQgU0QzMCBjYXJkIHdpdGggY3VycmVudCBERFIgbW9kZSB0byBTRFIgbW9kZS4gKi8KKy8qIGdfYnlTREVyYXNlU3RhdHVzICovCisjZGVmaW5lIFNEX05PVF9FUkFTRQkJMHgwMAorI2RlZmluZSBTRF9VTkRFUl9FUkFTSU5HCTB4MDEKKyNkZWZpbmUgU0RfQ09NUExFVEVfRVJBU0UJMHgwMgorLyogU0RfUlcgRkFJTCBzdGF0dXMgKi8KKyNkZWZpbmUgU0RfUldfRk9SQklEREVOCQkweDBGCS8qIHJlYWQvd3JpdGUgaXMgZm9yYmlkZGVuIChTRCBjYXJkKSAgKi8KKyNlbmRpZgorLyogRnVuY3Rpb24gR3JvdXAgRGVmaW5pdGlvbiAqLworLyogRnVuY3Rpb24gR3JvdXAgMSAqLworI2RlZmluZQlIU19TVVBQT1JUCQkJMHgwMQorI2RlZmluZQlTRFI1MF9TVVBQT1JUCQkJMHgwMgorI2RlZmluZQlTRFIxMDRfU1VQUE9SVAkJCTB4MDMKKyNkZWZpbmUJRERSNTBfU1VQUE9SVAkJCTB4MDQKKyNkZWZpbmUJSFNfU1VQUE9SVF9NQVNLCQkJMHgwMgorI2RlZmluZQlTRFI1MF9TVVBQT1JUX01BU0sJCTB4MDQKKyNkZWZpbmUJU0RSMTA0X1NVUFBPUlRfTUFTSwkJMHgwOAorI2RlZmluZQlERFI1MF9TVVBQT1JUX01BU0sJCTB4MTAKKyNkZWZpbmUJSFNfUVVFUllfU1dJVENIX09LCQkweDAxCisjZGVmaW5lCVNEUjUwX1FVRVJZX1NXSVRDSF9PSwkJMHgwMgorI2RlZmluZQlTRFIxMDRfUVVFUllfU1dJVENIX09LCQkweDAzCisjZGVmaW5lCUREUjUwX1FVRVJZX1NXSVRDSF9PSwkJMHgwNAorI2RlZmluZQlIU19TV0lUQ0hfQlVTWQkJCTB4MDIKKyNkZWZpbmUJU0RSNTBfU1dJVENIX0JVU1kJCTB4MDQKKyNkZWZpbmUJU0RSMTA0X1NXSVRDSF9CVVNZCQkweDA4CisjZGVmaW5lCUREUjUwX1NXSVRDSF9CVVNZCQkweDEwCisjZGVmaW5lCUZVTkNUSU9OX0dST1VQMV9TVVBQT1JUX09GRlNFVCAgICAgICAweDBECisjZGVmaW5lIEZVTkNUSU9OX0dST1VQMV9RVUVSWV9TV0lUQ0hfT0ZGU0VUICAweDEwCisjZGVmaW5lIEZVTkNUSU9OX0dST1VQMV9DSEVDS19CVVNZX09GRlNFVCAgICAweDFECisvKiBGdW5jdGlvbiBHcm91cCAzICovCisjZGVmaW5lCURSSVZJTkdfVFlQRV9BCSAgICAgICAgMHgwMQorI2RlZmluZQlEUklWSU5HX1RZUEVfQgkJICAgIDB4MDAKKyNkZWZpbmUJRFJJVklOR19UWVBFX0MJCSAgICAweDAyCisjZGVmaW5lCURSSVZJTkdfVFlQRV9ECSAgICAgICAgMHgwMworI2RlZmluZQlEUklWSU5HX1RZUEVfQV9NQVNLCSAgICAweDAyCisjZGVmaW5lCURSSVZJTkdfVFlQRV9CX01BU0sJICAgIDB4MDEKKyNkZWZpbmUJRFJJVklOR19UWVBFX0NfTUFTSwkgICAgMHgwNAorI2RlZmluZQlEUklWSU5HX1RZUEVfRF9NQVNLCSAgICAweDA4CisjZGVmaW5lCVRZUEVfQV9RVUVSWV9TV0lUQ0hfT0sJMHgwMQorI2RlZmluZQlUWVBFX0JfUVVFUllfU1dJVENIX09LCTB4MDAKKyNkZWZpbmUJVFlQRV9DX1FVRVJZX1NXSVRDSF9PSyAgMHgwMgorI2RlZmluZQlUWVBFX0RfUVVFUllfU1dJVENIX09LICAweDAzCisjZGVmaW5lCVRZUEVfQV9TV0lUQ0hfQlVTWQkgICAgMHgwMgorI2RlZmluZQlUWVBFX0JfU1dJVENIX0JVU1kJICAgIDB4MDEKKyNkZWZpbmUJVFlQRV9DX1NXSVRDSF9CVVNZICAgICAgMHgwNAorI2RlZmluZQlUWVBFX0RfU1dJVENIX0JVU1kgICAgICAweDA4CisjZGVmaW5lCUZVTkNUSU9OX0dST1VQM19TVVBQT1JUX09GRlNFVCAgICAgICAweDA5CisjZGVmaW5lIEZVTkNUSU9OX0dST1VQM19RVUVSWV9TV0lUQ0hfT0ZGU0VUICAweDBGCisjZGVmaW5lIEZVTkNUSU9OX0dST1VQM19DSEVDS19CVVNZX09GRlNFVCAgICAweDE5CisvKiBGdW5jdGlvbiBHcm91cCA0ICovCisjZGVmaW5lCUNVUlJFTlRfTElNSVRfMjAwCSAgICAweDAwCisjZGVmaW5lCUNVUlJFTlRfTElNSVRfNDAwCSAgICAweDAxCisjZGVmaW5lCUNVUlJFTlRfTElNSVRfNjAwCSAgICAweDAyCisjZGVmaW5lCUNVUlJFTlRfTElNSVRfODAwCSAgICAweDAzCisjZGVmaW5lCUNVUlJFTlRfTElNSVRfMjAwX01BU0sJMHgwMQorI2RlZmluZQlDVVJSRU5UX0xJTUlUXzQwMF9NQVNLCTB4MDIKKyNkZWZpbmUJQ1VSUkVOVF9MSU1JVF82MDBfTUFTSwkweDA0CisjZGVmaW5lCUNVUlJFTlRfTElNSVRfODAwX01BU0sJMHgwOAorI2RlZmluZQlDVVJSRU5UX0xJTUlUXzIwMF9RVUVSWV9TV0lUQ0hfT0sgICAgMHgwMAorI2RlZmluZQlDVVJSRU5UX0xJTUlUXzQwMF9RVUVSWV9TV0lUQ0hfT0sgICAgMHgwMQorI2RlZmluZQlDVVJSRU5UX0xJTUlUXzYwMF9RVUVSWV9TV0lUQ0hfT0sgICAgMHgwMgorI2RlZmluZQlDVVJSRU5UX0xJTUlUXzgwMF9RVUVSWV9TV0lUQ0hfT0sgICAgMHgwMworI2RlZmluZQlDVVJSRU5UX0xJTUlUXzIwMF9TV0lUQ0hfQlVTWSAgICAgICAgMHgwMQorI2RlZmluZQlDVVJSRU5UX0xJTUlUXzQwMF9TV0lUQ0hfQlVTWQkgICAgIDB4MDIKKyNkZWZpbmUJQ1VSUkVOVF9MSU1JVF82MDBfU1dJVENIX0JVU1kgICAgICAgIDB4MDQKKyNkZWZpbmUJQ1VSUkVOVF9MSU1JVF84MDBfU1dJVENIX0JVU1kgICAgICAgIDB4MDgKKyNkZWZpbmUJRlVOQ1RJT05fR1JPVVA0X1NVUFBPUlRfT0ZGU0VUICAgICAgIDB4MDcKKyNkZWZpbmUgRlVOQ1RJT05fR1JPVVA0X1FVRVJZX1NXSVRDSF9PRkZTRVQgIDB4MEYKKyNkZWZpbmUgRlVOQ1RJT05fR1JPVVA0X0NIRUNLX0JVU1lfT0ZGU0VUICAgIDB4MTcKKy8qIFN3aXRjaCBGdW5jdGlvbiBTdGF0dXMgT2Zmc2V0ICovCisjZGVmaW5lCURBVEFfU1RSVUNUVVJFX1ZFUl9PRkZTRVQgICAweDExIC8qIFRoZSBoaWdoIG9mZnNldCAqLworI2RlZmluZSBNQVhfUEhBU0UJCTE1CisvKiAjZGVmaW5lICAgICAgVE9UQUxfUkVBRF9QSEFTRSAgICAweDIwICovCisvKiAjZGVmaW5lICAgICAgVE9UQUxfV1JJVEVfUEhBU0UgICAgMHgyMCAqLworLyogTU1DIHY0LjAgKi8KKy8qICNkZWZpbmUgTU1DXzUyTUhaX1NQRUVEICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgKi8KKy8qICNkZWZpbmUgTU1DXzI2TUhaX1NQRUVEICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgKi8KKyNkZWZpbmUgTU1DXzhCSVRfQlVTCQkJMHgwMDEwCisjZGVmaW5lIE1NQ180QklUX0JVUwkJCTB4MDAyMAorLyogI2RlZmluZSBNTUNfU0VDVE9SX01PREUgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAqLworI2RlZmluZSBNTUNfU1dJVENIX0VSUgkJCTB4ODAKKy8qIFR1bmluZyBkaXJlY3Rpb24gUlggb3IgVFggKi8KKyNkZWZpbmUgVFVORV9UWCAgICAweDAwCisjZGVmaW5lIFRVTkVfUlgJICAgMHgwMQorLyogRm9yIENoYW5nZV9EQ01fRnJlcU1vZGUgRnVuY3Rpb24gKi8KKyNkZWZpbmUgQ0hBTkdFX1RYICAweDAwCisjZGVmaW5lIENIQU5HRV9SWCAgMHgwMQorI2RlZmluZSBEQ01fSElHSF9GUkVRVUVOQ1lfTU9ERSAgMHgwMAorI2RlZmluZSBEQ01fTE9XX0ZSRVFVRU5DWV9NT0RFICAgMHgwMQorI2RlZmluZSBEQ01fSElHSF9GUkVRVUVOQ1lfTU9ERV9TRVQgIDB4MEMKKyNkZWZpbmUgRENNX0xvd19GUkVRVUVOQ1lfTU9ERV9TRVQgICAweDAwCisvKiBGb3IgQ2hhbmdlX0ZQR0FfU1NDQ2xvY2sgRnVuY3Rpb24gKi8KKyNkZWZpbmUgTVVMVElQTFlfQllfMSAgICAweDAwCisjZGVmaW5lIE1VTFRJUExZX0JZXzIgICAgMHgwMQorI2RlZmluZSBNVUxUSVBMWV9CWV8zICAgIDB4MDIKKyNkZWZpbmUgTVVMVElQTFlfQllfNCAgICAweDAzCisjZGVmaW5lIE1VTFRJUExZX0JZXzUgICAgMHgwNAorI2RlZmluZSBNVUxUSVBMWV9CWV82ICAgIDB4MDUKKyNkZWZpbmUgTVVMVElQTFlfQllfNyAgICAweDA2CisjZGVmaW5lIE1VTFRJUExZX0JZXzggICAgMHgwNworI2RlZmluZSBNVUxUSVBMWV9CWV85ICAgIDB4MDgKKyNkZWZpbmUgTVVMVElQTFlfQllfMTAgICAweDA5CisjZGVmaW5lIERJVklERV9CWV8yICAgICAgMHgwMQorI2RlZmluZSBESVZJREVfQllfMyAgICAgIDB4MDIKKyNkZWZpbmUgRElWSURFX0JZXzQgICAgICAweDAzCisjZGVmaW5lIERJVklERV9CWV81ICAgICAgMHgwNAorI2RlZmluZSBESVZJREVfQllfNiAgICAgIDB4MDUKKyNkZWZpbmUgRElWSURFX0JZXzcgICAgICAweDA2CisjZGVmaW5lIERJVklERV9CWV84ICAgICAgMHgwNworI2RlZmluZSBESVZJREVfQllfOSAgICAgIDB4MDgKKyNkZWZpbmUgRElWSURFX0JZXzEwICAgICAweDA5CisjZGVmaW5lIENIRUNLX1NEX1RSQU5TX0ZBSUwoY2hpcCwgcmV0dmFsKQlcCisJKCgocmV0dmFsKSAhPSBTVEFUVVNfU1VDQ0VTUykgfHwgXAorCQkJKGNoaXAtPnJzcF9idWZbMF0gJiBTRF9UUkFOU0ZFUl9FUlIpKQorLyogU0QgVHVuaW5nIERhdGEgU3RydWN0dXJlICovCisvKiBSZWNvcmQgY29udGludW91cyB0aW1pbmcgcGhhc2UgcGF0aCAqLworc3RydWN0IHRpbWluZ19waGFzZV9wYXRoIHsKKwlpbnQgc3RhcnQ7CisJaW50IGVuZDsKKwlpbnQgbWlkOworCWludCBsZW47Cit9OworCitpbnQgc2Rfc2VsZWN0X2NhcmQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCBpbnQgc2VsZWN0KTsKK2ludCByZXNldF9zZF9jYXJkKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7CitpbnQgc2Rfc3dpdGNoX2Nsb2NrKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7Cit2b2lkIHNkX3N0b3Bfc2VxX21vZGUoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKTsKK2ludCBzZF9ydyhzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTMyIHN0YXJ0X3NlY3RvciwKKwkgIHUxNiBzZWN0b3JfY250KTsKK3ZvaWQgc2RfY2xlYW51cF93b3JrKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7CitpbnQgc2RfcG93ZXJfb2ZmX2NhcmQzdjMoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKTsKK2ludCByZWxlYXNlX3NkX2NhcmQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKTsKKworI2lmZGVmIFNVUFBPUlRfU0RfTE9DSworaW50IHNkX3VwZGF0ZV9sb2NrX3N0YXR1cyhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApOworI2VuZGlmCisKKyNpZmRlZiBTVVBQT1JUX0NQUk0KK2V4dGVybiBpbnQgcmVzZXRfc2Qoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKTsKK2V4dGVybiBpbnQgc2RfY2hlY2tfZGF0YTBfc3RhdHVzKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7CitleHRlcm4gaW50IHNkX3JlYWRfZGF0YShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IHRyYW5zX21vZGUsIHU4ICpjbWQsCisJCWludCBjbWRfbGVuLCB1MTYgYnl0ZV9jbnQsIHUxNiBibGtfY250LCB1OCBidXNfd2lkdGgsCisJCXU4ICpidWYsIGludCBidWZfbGVuLCBpbnQgdGltZW91dCk7CisjZW5kaWYKKworI2VuZGlmIC8qIF9fUlRTNTFYX1NEX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3NkX2Nwcm0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3NkX2Nwcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDdjZDQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvc2RfY3BybS5jCkBAIC0wLDAgKzEsMTIxNSBAQAorLyogRHJpdmVyIGZvciBSZWFsdGVrIFJUUzUxeHggVVNCIGNhcmQgcmVhZGVyCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDkgUmVhbHRlayBTZW1pY29uZHVjdG9yIENvcnAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIEF1dGhvcjoKKyAqICAgd3dhbmcgKHdlaV93YW5nQHJlYWxzaWwuY29tLmNuKQorICogICBOby4gNDUwLCBTaGVuaHUgUm9hZCwgU3V6aG91IEluZHVzdHJ5IFBhcmssIFN1emhvdSwgQ2hpbmEKKyAqIE1haW50YWluZXI6CisgKiAgIEVkd2luIFJvbmcgKGVkd2luX3JvbmdAcmVhbHNpbC5jb20uY24pCisgKiAgIE5vLiA0NTAsIFNoZW5odSBSb2FkLCBTdXpob3UgSW5kdXN0cnkgUGFyaywgU3V6aG91LCBDaGluYQorICovCisKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInRyYWNlLmgiCisjaW5jbHVkZSAicnRzNTF4LmgiCisjaW5jbHVkZSAicnRzNTF4X3RyYW5zcG9ydC5oIgorI2luY2x1ZGUgInJ0czUxeF9zY3NpLmgiCisjaW5jbHVkZSAicnRzNTF4X2NhcmQuaCIKKyNpbmNsdWRlICJydHM1MXhfY2hpcC5oIgorI2luY2x1ZGUgInNkLmgiCisKKyNpZmRlZiBTVVBQT1JUX0NQUk0KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X3JzcF90eXBlKHU4IHJzcF9jb2RlLCB1OCAqcnNwX3R5cGUsIGludCAqcnNwX2xlbikKK3sKKwlpZiAoIXJzcF90eXBlIHx8ICFyc3BfbGVuKQorCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisKKwlzd2l0Y2ggKHJzcF9jb2RlKSB7CisJY2FzZSAweDAzOgorCQkqcnNwX3R5cGUgPSBTRF9SU1BfVFlQRV9SMDsgLyogbm8gcmVzcG9uc2UgKi8KKwkJKnJzcF9sZW4gPSAwOworCQlicmVhazsKKworCWNhc2UgMHgwNDoKKwkJKnJzcF90eXBlID0gU0RfUlNQX1RZUEVfUjE7IC8qIFIxLFI2KCxSNCxSNSkgKi8KKwkJKnJzcF9sZW4gPSA2OworCQlicmVhazsKKworCWNhc2UgMHgwNToKKwkJKnJzcF90eXBlID0gU0RfUlNQX1RZUEVfUjFiOwkvKiBSMWIgKi8KKwkJKnJzcF9sZW4gPSA2OworCQlicmVhazsKKworCWNhc2UgMHgwNjoKKwkJKnJzcF90eXBlID0gU0RfUlNQX1RZUEVfUjI7CS8qIFIyICovCisJCSpyc3BfbGVuID0gMTc7CisJCWJyZWFrOworCisJY2FzZSAweDA3OgorCQkqcnNwX3R5cGUgPSBTRF9SU1BfVFlQRV9SMzsJLyogUjMgKi8KKwkJKnJzcF9sZW4gPSA2OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2ludCBzb2Z0X3Jlc2V0X3NkX2NhcmQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXJldHVybiByZXNldF9zZChjaGlwKTsKK30KKworaW50IGV4dF9zZF9zZW5kX2NtZF9nZXRfcnNwKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggY21kX2lkeCwKKwkJCSAgICB1MzIgYXJnLCB1OCByc3BfdHlwZSwgdTggKnJzcCwgaW50IHJzcF9sZW4sCisJCQkgICAgaW50IHNwZWNpYWxfY2hlY2spCit7CisJaW50IHJldHZhbDsKKwlpbnQgdGltZW91dCA9IDUwOworCXUxNiByZWdfYWRkcjsKKwl1OCBidWZbMTddLCBzdGF0OworCWludCBsZW4gPSAyOworCWludCBydHlfY250ID0gMDsKKworCVJUUzUxWF9ERUJVR1AoIkVYVCBTRC9NTUMgQ01EICVkXG4iLCBjbWRfaWR4KTsKKworCWlmIChyc3BfdHlwZSA9PSBTRF9SU1BfVFlQRV9SMWIpCisJCXRpbWVvdXQgPSAzMDAwOworCitSVFlfU0VORF9DTUQ6CisKKwlydHM1MXhfaW5pdF9jbWQoY2hpcCk7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9DTUQwLCAweEZGLCAweDQwIHwgY21kX2lkeCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQ01EMSwgMHhGRiwgKHU4KSAoYXJnID4+IDI0KSk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQ01EMiwgMHhGRiwgKHU4KSAoYXJnID4+IDE2KSk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQ01EMywgMHhGRiwgKHU4KSAoYXJnID4+IDgpKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9DTUQ0LCAweEZGLCAodTgpIGFyZyk7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9DRkcyLCAweEZGLCByc3BfdHlwZSk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9EQVRBX1NPVVJDRSwKKwkJICAgICAgIDB4MDEsIFBJTkdQT05HX0JVRkZFUik7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfVFJBTlNGRVIsCisJCSAgICAgICAweEZGLCBTRF9UTV9DTURfUlNQIHwgU0RfVFJBTlNGRVJfU1RBUlQpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIENIRUNLX1JFR19DTUQsIFNEX1RSQU5TRkVSLCBTRF9UUkFOU0ZFUl9FTkQsCisJCSAgICAgICBTRF9UUkFOU0ZFUl9FTkQpOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCBTRF9TVEFUMSwgMCwgMCk7CisKKwlpZiAoQ0hFQ0tfVVNCKGNoaXAsIFVTQl8yMCkpIHsKKwkJaWYgKHJzcF90eXBlID09IFNEX1JTUF9UWVBFX1IyKSB7CisJCQlmb3IgKHJlZ19hZGRyID0gUFBCVUZfQkFTRTI7CisJCQkgICAgIHJlZ19hZGRyIDwgUFBCVUZfQkFTRTIgKyAxNjsgcmVnX2FkZHIrKykgeworCQkJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgcmVnX2FkZHIsIDAsCisJCQkJCSAgICAgICAwKTsKKwkJCX0KKwkJCWxlbiA9IDE5OworCQl9IGVsc2UgaWYgKHJzcF90eXBlICE9IFNEX1JTUF9UWVBFX1IwKSB7CisJCQkvKiBSZWFkIGRhdGEgZnJvbSBTRF9DTUR4IHJlZ2lzdGVycyAqLworCQkJZm9yIChyZWdfYWRkciA9IFNEX0NNRDA7IHJlZ19hZGRyIDw9IFNEX0NNRDQ7CisJCQkgICAgIHJlZ19hZGRyKyspIHsKKwkJCQlydHM1MXhfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIHJlZ19hZGRyLCAwLAorCQkJCQkgICAgICAgMCk7CisJCQl9CisJCQlsZW4gPSA4OworCQl9IGVsc2UgeworCQkJbGVuID0gMzsKKwkJfQorCQlydHM1MXhfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIFNEX0NNRDUsIDAsIDApOworCX0gZWxzZSB7CisJCWxlbiA9IDI7CisJfQorCisJcmV0dmFsID0gcnRzNTF4X3NlbmRfY21kKGNoaXAsIE1PREVfQ1IsIDEwMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlyZXR2YWwgPSBydHM1MXhfZ2V0X3JzcChjaGlwLCBsZW4sIHRpbWVvdXQpOworCisJaWYgKENIRUNLX1NEX1RSQU5TX0ZBSUwoY2hpcCwgcmV0dmFsKSkgeworCQlydHM1MXhfY2xlYXJfc2RfZXJyb3IoY2hpcCk7CisKKwkJaWYgKHJldHZhbCA9PSBTVEFUVVNfVElNRURPVVQpIHsKKwkJCWlmIChyc3BfdHlwZSAmIFNEX1dBSVRfQlVTWV9FTkQpIHsKKwkJCQlyZXR2YWwgPSBzZF9jaGVja19kYXRhMF9zdGF0dXMoY2hpcCk7CisJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCQl9CisJCX0KKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwl9CisKKwlpZiAocnNwX3R5cGUgPT0gU0RfUlNQX1RZUEVfUjApCisJCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKKworCWlmIChDSEVDS19VU0IoY2hpcCwgVVNCXzIwKSkgeworCQlydHM1MXhfcmVhZF9yc3BfYnVmKGNoaXAsIDIsIGJ1ZiwgbGVuIC0gMik7CisJfSBlbHNlIHsKKwkJaWYgKHJzcF90eXBlID09IFNEX1JTUF9UWVBFX1IyKSB7CisJCQlyZWdfYWRkciA9IFBQQlVGX0JBU0UyOworCQkJbGVuID0gMTY7CisJCX0gZWxzZSB7CisJCQlyZWdfYWRkciA9IFNEX0NNRDA7CisJCQlsZW4gPSA1OworCQl9CisJCXJldHZhbCA9CisJCSAgICBydHM1MXhfc2VxX3JlYWRfcmVnaXN0ZXIoY2hpcCwgcmVnX2FkZHIsCisJCQkJCQkgICAgICh1bnNpZ25lZCBzaG9ydClsZW4sIGJ1Zik7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkJUlRTNTFYX1JFQURfUkVHKGNoaXAsIFNEX0NNRDUsIGJ1ZiArIGxlbik7CisJfQorCXN0YXQgPSBjaGlwLT5yc3BfYnVmWzFdOworCisJaWYgKChidWZbMF0gJiAweEMwKSAhPSAwKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJaWYgKCEocnNwX3R5cGUgJiBTRF9OT19DSEVDS19DUkM3KSkgeworCQlpZiAoc3RhdCAmIFNEX0NSQzdfRVJSKSB7CisJCQlpZiAoY21kX2lkeCA9PSBXUklURV9NVUxUSVBMRV9CTE9DSykKKwkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJaWYgKHJ0eV9jbnQgPCBTRF9NQVhfUkVUUllfQ09VTlQpIHsKKwkJCQl3YWl0X3RpbWVvdXQoMjApOworCQkJCXJ0eV9jbnQrKzsKKwkJCQlnb3RvIFJUWV9TRU5EX0NNRDsKKwkJCX0gZWxzZSB7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCX0KKwkJfQorCX0KKworCWlmICgoY21kX2lkeCA9PSBTRUxFQ1RfQ0FSRCkgfHwgKGNtZF9pZHggPT0gQVBQX0NNRCkgfHwKKwkgICAgKGNtZF9pZHggPT0gU0VORF9TVEFUVVMpIHx8IChjbWRfaWR4ID09IFNUT1BfVFJBTlNNSVNTSU9OKSkgeworCQlpZiAoKGNtZF9pZHggIT0gU1RPUF9UUkFOU01JU1NJT04pICYmIChzcGVjaWFsX2NoZWNrID09IDApKSB7CisJCQlpZiAoYnVmWzFdICYgMHg4MCkKKwkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQl9CisjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCisJCWlmIChidWZbMV0gJiAweDdEKSB7CisjZWxzZQorCQlpZiAoYnVmWzFdICYgMHg3RikgeworI2VuZGlmCisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQl9CisJCWlmIChidWZbMl0gJiAweEY4KQorCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKworCQlpZiAoY21kX2lkeCA9PSBTRUxFQ1RfQ0FSRCkgeworCQkJaWYgKHJzcF90eXBlID09IFNEX1JTUF9UWVBFX1IyKSB7CisJCQkJaWYgKChidWZbM10gJiAweDFFKSAhPSAweDA0KQorCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJfSBlbHNlIGlmIChyc3BfdHlwZSA9PSBTRF9SU1BfVFlQRV9SMikgeworCQkJCWlmICgoYnVmWzNdICYgMHgxRSkgIT0gMHgwMykKKwkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChyc3AgJiYgcnNwX2xlbikKKwkJbWVtY3B5KHJzcCwgYnVmLCByc3BfbGVuKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworaW50IGV4dF9zZF9nZXRfcnNwKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgaW50IGxlbiwgdTggKiByc3AsIHU4IHJzcF90eXBlKQoreworCWludCByZXR2YWwsIHJzcF9sZW47CisJdTE2IHJlZ19hZGRyOworCisJaWYgKHJzcF90eXBlID09IFNEX1JTUF9UWVBFX1IwKQorCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CisKKwlydHM1MXhfaW5pdF9jbWQoY2hpcCk7CisKKwlpZiAocnNwX3R5cGUgPT0gU0RfUlNQX1RZUEVfUjIpIHsKKwkJZm9yIChyZWdfYWRkciA9IFBQQlVGX0JBU0UyOyByZWdfYWRkciA8IFBQQlVGX0JBU0UyICsgMTY7CisJCSAgICAgcmVnX2FkZHIrKykgeworCQkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCByZWdfYWRkciwgMHhGRiwgMCk7CisJCX0KKwkJcnNwX2xlbiA9IDE3OworCX0gZWxzZSBpZiAocnNwX3R5cGUgIT0gU0RfUlNQX1RZUEVfUjApIHsKKwkJZm9yIChyZWdfYWRkciA9IFNEX0NNRDA7IHJlZ19hZGRyIDw9IFNEX0NNRDQ7IHJlZ19hZGRyKyspCisJCQlydHM1MXhfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIHJlZ19hZGRyLCAweEZGLCAwKTsKKwkJcnNwX2xlbiA9IDY7CisJfQorCXJ0czUxeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgU0RfQ01ENSwgMHhGRiwgMCk7CisKKwlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DUiwgMTAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHZhbCA9IHJ0czUxeF9nZXRfcnNwKGNoaXAsIHJzcF9sZW4sIDEwMCk7CisKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCWlmIChyc3ApIHsKKwkJaW50IG1pbl9sZW4gPSAocnNwX2xlbiA8IGxlbikgPyByc3BfbGVuIDogbGVuOworCisJCW1lbWNweShyc3AsIHJ0czUxeF9nZXRfcnNwX2RhdGEoY2hpcCksIG1pbl9sZW4pOworCisJCVJUUzUxWF9ERUJVR1AoIm1pbl9sZW4gPSAlZFxuIiwgbWluX2xlbik7CisJCVJUUzUxWF9ERUJVR1AoIlJlc3BvbnNlIGluIGNtZCBidWY6IDB4JXggMHgleCAweCV4IDB4JXhcbiIsCisJCQkgICAgICAgcnNwWzBdLCByc3BbMV0sIHJzcFsyXSwgcnNwWzNdKTsKKwl9CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2ludCBleHRfc2RfZXhlY3V0ZV9ub19kYXRhKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IGx1biwKKwkJCSAgIHU4IGNtZF9pZHgsIHU4IHN0YW5kYnksIHU4IGFjbWQsIHU4IHJzcF9jb2RlLAorCQkJICAgdTMyIGFyZykKK3sKKwlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CisJaW50IHJldHZhbCwgcnNwX2xlbjsKKwl1OCByc3BfdHlwZTsKKworCXJldHZhbCA9IHNkX3N3aXRjaF9jbG9jayhjaGlwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisKKwlpZiAoc2RfY2FyZC0+cHJlX2NtZF9lcnIpIHsKKwkJc2RfY2FyZC0+cHJlX2NtZF9lcnIgPSAwOworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfQ0hBTkdFKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKwlyZXR2YWwgPSBnZXRfcnNwX3R5cGUocnNwX2NvZGUsICZyc3BfdHlwZSwgJnJzcF9sZW4pOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKwlzZF9jYXJkLT5sYXN0X3JzcF90eXBlID0gcnNwX3R5cGU7CisKKwlyZXR2YWwgPSBzZF9zd2l0Y2hfY2xvY2soY2hpcCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworI2lmZGVmIFNVUFBPUlRfU0RfTE9DSworCWlmICgoc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgJiBTRF9MT0NLXzFCSVRfTU9ERSkgPT0gMCkgeworCQlpZiAoQ0hLX01NQ184QklUKHNkX2NhcmQpKSB7CisJCQlyZXR2YWwgPQorCQkJICAgIHJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9DRkcxLCAweDAzLAorCQkJCQkJICBTRF9CVVNfV0lEVEhfOCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJfSBlbHNlIGlmIChDSEtfU0Qoc2RfY2FyZCkgfHwgQ0hLX01NQ180QklUKHNkX2NhcmQpKSB7CisJCQlyZXR2YWwgPQorCQkJICAgIHJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9DRkcxLCAweDAzLAorCQkJCQkJICBTRF9CVVNfV0lEVEhfNCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJfQorCX0KKyNlbHNlCisJLyogU2V0IEgvVyBTRC9NTUMgQnVzIFdpZHRoICovCisJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX0NGRzEsIDB4MDMsIFNEX0JVU19XSURUSF80KTsKKyNlbmRpZgorCisJaWYgKHN0YW5kYnkpIHsKKwkJcmV0dmFsID0gc2Rfc2VsZWN0X2NhcmQoY2hpcCwgMCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfQ21kX0ZhaWxlZCk7CisJfQorCisJaWYgKGFjbWQpIHsKKwkJcmV0dmFsID0KKwkJICAgIGV4dF9zZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEFQUF9DTUQsIHNkX2NhcmQtPnNkX2FkZHIsCisJCQkJCSAgICBTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCwgMCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfQ21kX0ZhaWxlZCk7CisJfQorCisJcmV0dmFsID0gZXh0X3NkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgY21kX2lkeCwgYXJnLCByc3BfdHlwZSwKKwkJCQkJIHNkX2NhcmQtPnJzcCwgcnNwX2xlbiwgMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX0NtZF9GYWlsZWQpOworCisJaWYgKHN0YW5kYnkpIHsKKwkJcmV0dmFsID0gc2Rfc2VsZWN0X2NhcmQoY2hpcCwgMSk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfQ21kX0ZhaWxlZCk7CisJfQorI2lmZGVmIFNVUFBPUlRfU0RfTE9DSworCS8qIEdldCBTRCBsb2NrIHN0YXR1cyAqLworCXJldHZhbCA9IHNkX3VwZGF0ZV9sb2NrX3N0YXR1cyhjaGlwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfQ21kX0ZhaWxlZCk7CisjZW5kaWYKKworCXJldHVybiBUUkFOU1BPUlRfR09PRDsKKworU0RfRXhlY3V0ZV9DbWRfRmFpbGVkOgorCXNkX2NhcmQtPnByZV9jbWRfZXJyID0gMTsKKwlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTk9fU0VOU0UpOworCXJlbGVhc2Vfc2RfY2FyZChjaGlwKTsKKwlkb19yZXNldF9zZF9jYXJkKGNoaXApOworCWlmICghKGNoaXAtPmNhcmRfcmVhZHkgJiBTRF9DQVJEKSkKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKKworCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKK30KKworaW50IGV4dF9zZF9leGVjdXRlX3JlYWRfZGF0YShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBsdW4sCisJCQkgICAgIHU4IGNtZF9pZHgsIHU4IGNtZDEyLCB1OCBzdGFuZGJ5LAorCQkJICAgICB1OCBhY21kLCB1OCByc3BfY29kZSwgdTMyIGFyZywgdTMyIGRhdGFfbGVuLAorCQkJICAgICB2b2lkICpkYXRhX2J1ZiwgdW5zaWduZWQgaW50IGJ1Zl9sZW4sIGludCB1c2Vfc2cpCit7CisJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOworCWludCByZXR2YWwsIHJzcF9sZW4sIGk7CisJaW50IGNtZDEzX2NoZWNrYml0ID0gMCwgcmVhZF9lcnIgPSAwOworCXU4IHJzcF90eXBlLCBidXNfd2lkdGg7CisKKwlpZiAoc2RfY2FyZC0+cHJlX2NtZF9lcnIpIHsKKwkJc2RfY2FyZC0+cHJlX2NtZF9lcnIgPSAwOworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfQ0hBTkdFKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKworCXJldHZhbCA9IHNkX3N3aXRjaF9jbG9jayhjaGlwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCXJldHZhbCA9IGdldF9yc3BfdHlwZShyc3BfY29kZSwgJnJzcF90eXBlLCAmcnNwX2xlbik7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOworCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJfQorCXNkX2NhcmQtPmxhc3RfcnNwX3R5cGUgPSByc3BfdHlwZTsKKworCXJldHZhbCA9IHNkX3N3aXRjaF9jbG9jayhjaGlwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCisJaWYgKChzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyAmIFNEX0xPQ0tfMUJJVF9NT0RFKSA9PSAwKSB7CisJCWlmIChDSEtfTU1DXzhCSVQoc2RfY2FyZCkpCisJCQlidXNfd2lkdGggPSBTRF9CVVNfV0lEVEhfODsKKwkJZWxzZSBpZiAoQ0hLX1NEKHNkX2NhcmQpIHx8IENIS19NTUNfNEJJVChzZF9jYXJkKSkKKwkJCWJ1c193aWR0aCA9IFNEX0JVU19XSURUSF80OworCQllbHNlCisJCQlidXNfd2lkdGggPSBTRF9CVVNfV0lEVEhfMTsKKwl9IGVsc2UgeworCQlidXNfd2lkdGggPSBTRF9CVVNfV0lEVEhfNDsKKwl9CisJUlRTNTFYX0RFQlVHUCgiYnVzX3dpZHRoID0gJWRcbiIsIGJ1c193aWR0aCk7CisjZWxzZQorCWJ1c193aWR0aCA9IFNEX0JVU19XSURUSF80OworI2VuZGlmCisKKwlpZiAoZGF0YV9sZW4gPCA1MTIpIHsKKwkJcmV0dmFsID0gZXh0X3NkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VUX0JMT0NLTEVOLCBkYXRhX2xlbiwKKwkJCQkJCSBTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCwgMCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfUmVhZF9DbWRfRmFpbGVkKTsKKwl9CisKKwlpZiAoc3RhbmRieSkgeworCQlyZXR2YWwgPSBzZF9zZWxlY3RfY2FyZChjaGlwLCAwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9SZWFkX0NtZF9GYWlsZWQpOworCX0KKworCWlmIChhY21kKSB7CisJCXJldHZhbCA9CisJCSAgICBleHRfc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBBUFBfQ01ELCBzZF9jYXJkLT5zZF9hZGRyLAorCQkJCQkgICAgU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDAsIDApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZCk7CisJfQorCisJaWYgKGRhdGFfbGVuIDw9IDUxMikgeworCQlpbnQgbWluX2xlbjsKKwkJdTggKmJ1ZjsKKwkJdTE2IGJ5dGVfY250LCBibGtfY250OworCQl1OCBjbWRbNV07CisJCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwOworCQl2b2lkICpzZyA9IE5VTEw7CisKKwkJYnl0ZV9jbnQgPSAodTE2KSAoZGF0YV9sZW4gJiAweDNGRik7CisJCWJsa19jbnQgPSAxOworCisJCWNtZFswXSA9IDB4NDAgfCBjbWRfaWR4OworCQljbWRbMV0gPSAodTgpIChhcmcgPj4gMjQpOworCQljbWRbMl0gPSAodTgpIChhcmcgPj4gMTYpOworCQljbWRbM10gPSAodTgpIChhcmcgPj4gOCk7CisJCWNtZFs0XSA9ICh1OCkgYXJnOworCisJCWJ1ZiA9IGttYWxsb2MoZGF0YV9sZW4sIEdGUF9LRVJORUwpOworCQlpZiAoYnVmID09IE5VTEwpCisJCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKworCQlyZXR2YWwgPSBzZF9yZWFkX2RhdGEoY2hpcCwgU0RfVE1fTk9STUFMX1JFQUQsIGNtZCwgNSwgYnl0ZV9jbnQsCisJCQkJICAgICAgYmxrX2NudCwgYnVzX3dpZHRoLCBidWYsIGRhdGFfbGVuLCAyMDAwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcmVhZF9lcnIgPSAxOworCQkJa2ZyZWUoYnVmKTsKKwkJCXJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1NUT1AsCisJCQkJCSAgICAgIFNEX1NUT1AgfCBTRF9DTFJfRVJSLAorCQkJCQkgICAgICBTRF9TVE9QIHwgU0RfQ0xSX0VSUik7CisJCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfUmVhZF9DbWRfRmFpbGVkKTsKKwkJfQorCisJCW1pbl9sZW4gPSBtaW4oZGF0YV9sZW4sIGJ1Zl9sZW4pOworCQlpZiAodXNlX3NnKQorCQkJcnRzNTF4X2FjY2Vzc19zZ2xpc3QoYnVmLCBtaW5fbGVuLCAodm9pZCAqKWRhdGFfYnVmLAorCQkJCQkgICAgICZzZywgJm9mZnNldCwgVE9fWEZFUl9CVUYpOworCQllbHNlCisJCQltZW1jcHkoZGF0YV9idWYsIGJ1ZiwgbWluX2xlbik7CisKKwkJa2ZyZWUoYnVmKTsKKwl9IGVsc2UgaWYgKCEoZGF0YV9sZW4gJiAweDFGRikpIHsKKwkJcnRzNTF4X2luaXRfY21kKGNoaXApOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9CWVRFX0NOVF9ILCAweEZGLCAweDAyKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQllURV9DTlRfTCwgMHhGRiwgMHgwMCk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0JMT0NLX0NOVF9ILAorCQkJICAgICAgIDB4RkYsICh1OCkgKGRhdGFfbGVuID4+IDE3KSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0JMT0NLX0NOVF9MLAorCQkJICAgICAgIDB4RkYsICh1OCkgKChkYXRhX2xlbiAmIDB4MDAwMUZFMDApID4+IDkpKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQ01EMCwgMHhGRiwKKwkJCSAgICAgICAweDQwIHwgY21kX2lkeCk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0NNRDEsIDB4RkYsCisJCQkgICAgICAgKHU4KSAoYXJnID4+IDI0KSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0NNRDIsIDB4RkYsCisJCQkgICAgICAgKHU4KSAoYXJnID4+IDE2KSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0NNRDMsIDB4RkYsCisJCQkgICAgICAgKHU4KSAoYXJnID4+IDgpKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQ01ENCwgMHhGRiwgKHU4KSBhcmcpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9DRkcxLCAweDAzLCBidXNfd2lkdGgpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9DRkcyLCAweEZGLCByc3BfdHlwZSk7CisJCXRyYW5zX2RtYV9lbmFibGUoRE1BX0ZST01fREVWSUNFLCBjaGlwLCBkYXRhX2xlbiwgRE1BXzUxMik7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX1RSQU5TRkVSLCAweEZGLAorCQkJICAgICAgIFNEX1RNX0FVVE9fUkVBRF8yIHwgU0RfVFJBTlNGRVJfU1RBUlQpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBDSEVDS19SRUdfQ01ELCBTRF9UUkFOU0ZFUiwKKwkJCSAgICAgICBTRF9UUkFOU0ZFUl9FTkQsIFNEX1RSQU5TRkVSX0VORCk7CisJCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0NESVIsIDEwMCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJlYWRfZXJyID0gMTsKKwkJCXJ0czUxeF9lcDBfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9TVE9QLAorCQkJCQkJICBTRF9TVE9QIHwgU0RfQ0xSX0VSUiwKKwkJCQkJCSAgU0RfU1RPUCB8IFNEX0NMUl9FUlIpOworCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZCk7CisJCX0KKworCQlyZXR2YWwgPQorCQkgICAgcnRzNTF4X3RyYW5zZmVyX2RhdGFfcmNjKGNoaXAsIFJDVl9CVUxLX1BJUEUoY2hpcCksCisJCQkJCSAgICAgZGF0YV9idWYsIGJ1Zl9sZW4sIHVzZV9zZywgTlVMTCwKKwkJCQkJICAgICAxMDAwMCwgU1RBR0VfREkpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlyZWFkX2VyciA9IDE7CisJCQlydHM1MXhfZXAwX3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfU1RPUCwKKwkJCQkJCSAgU0RfU1RPUCB8IFNEX0NMUl9FUlIsCisJCQkJCQkgIFNEX1NUT1AgfCBTRF9DTFJfRVJSKTsKKwkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9SZWFkX0NtZF9GYWlsZWQpOworCQl9CisJCXJldHZhbCA9IHJ0czUxeF9nZXRfcnNwKGNoaXAsIDEsIDUwMCk7CisJCWlmIChDSEVDS19TRF9UUkFOU19GQUlMKGNoaXAsIHJldHZhbCkpIHsKKwkJCXJlYWRfZXJyID0gMTsKKwkJCXJ0czUxeF9lcDBfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9TVE9QLAorCQkJCQkJICBTRF9TVE9QIHwgU0RfQ0xSX0VSUiwKKwkJCQkJCSAgU0RfU1RPUCB8IFNEX0NMUl9FUlIpOworCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZCk7CisJCX0KKwl9IGVsc2UgeworCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfUmVhZF9DbWRfRmFpbGVkKTsKKwl9CisKKwlyZXR2YWwgPSBleHRfc2RfZ2V0X3JzcChjaGlwLCByc3BfbGVuLCBzZF9jYXJkLT5yc3AsIHJzcF90eXBlKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfUmVhZF9DbWRfRmFpbGVkKTsKKworCWlmIChzdGFuZGJ5KSB7CisJCXJldHZhbCA9IHNkX3NlbGVjdF9jYXJkKGNoaXAsIDEpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZCk7CisJfQorCisJaWYgKGNtZDEyKSB7CisJCXJldHZhbCA9IGV4dF9zZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNUT1BfVFJBTlNNSVNTSU9OLAorCQkJCQkJIDAsIFNEX1JTUF9UWVBFX1IxYiwgTlVMTCwgMCwKKwkJCQkJCSAwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9SZWFkX0NtZF9GYWlsZWQpOworCX0KKworCWlmIChkYXRhX2xlbiA8IDUxMikgeworCQlyZXR2YWwgPSBleHRfc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRVRfQkxPQ0tMRU4sIDB4MjAwLAorCQkJCQkJIFNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwLCAwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9SZWFkX0NtZF9GYWlsZWQpOworCisJCXJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9CWVRFX0NOVF9ILCAweEZGLCAweDAyKTsKKwkJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX0JZVEVfQ05UX0wsIDB4RkYsIDB4MDApOworCX0KKworCWlmIChzdGFuZGJ5IHx8IGNtZDEyKQorCQljbWQxM19jaGVja2JpdCA9IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXJldHZhbCA9CisJCSAgICBleHRfc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRU5EX1NUQVRVUywgc2RfY2FyZC0+c2RfYWRkciwKKwkJCQkJICAgIFNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwLAorCQkJCQkgICAgY21kMTNfY2hlY2tiaXQpOworCQlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKQorCQkJYnJlYWs7CisJfQorCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9SZWFkX0NtZF9GYWlsZWQpOworCisJcmV0dXJuIFRSQU5TUE9SVF9HT09EOworCitTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZDoKKwlzZF9jYXJkLT5wcmVfY21kX2VyciA9IDE7CisJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX05PX1NFTlNFKTsKKwlpZiAocmVhZF9lcnIpCisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOworCXJlbGVhc2Vfc2RfY2FyZChjaGlwKTsKKwlkb19yZXNldF9zZF9jYXJkKGNoaXApOworCWlmICghKGNoaXAtPmNhcmRfcmVhZHkgJiBTRF9DQVJEKSkKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKKworCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKK30KKworaW50IGV4dF9zZF9leGVjdXRlX3dyaXRlX2RhdGEoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1bnNpZ25lZCBpbnQgbHVuLAorCQkJICAgICAgdTggY21kX2lkeCwgdTggY21kMTIsIHU4IHN0YW5kYnksIHU4IGFjbWQsCisJCQkgICAgICB1OCByc3BfY29kZSwgdTMyIGFyZywgdTMyIGRhdGFfbGVuLAorCQkJICAgICAgdm9pZCAqZGF0YV9idWYsIHVuc2lnbmVkIGludCBidWZfbGVuLCBpbnQgdXNlX3NnKQoreworCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKwlpbnQgcmV0dmFsLCByc3BfbGVuOworCWludCBjbWQxM19jaGVja2JpdCA9IDAsIHdyaXRlX2VyciA9IDA7CisJdTggcnNwX3R5cGU7CisJdTMyIGk7CisjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCisJaW50IGxvY2tfY21kX2ZhaWwgPSAwOworCXU4IHNkX2xvY2tfc3RhdGUgPSAwOworCXU4IGxvY2tfY21kX3R5cGUgPSAwOworI2VuZGlmCisKKwlpZiAoc2RfY2FyZC0+cHJlX2NtZF9lcnIpIHsKKwkJc2RfY2FyZC0+cHJlX2NtZF9lcnIgPSAwOworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfQ0hBTkdFKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKworCXJldHZhbCA9IHNkX3N3aXRjaF9jbG9jayhjaGlwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworI2lmZGVmIFNVUFBPUlRfU0RfTE9DSworCWlmIChjbWRfaWR4ID09IExPQ0tfVU5MT0NLKSB7CisJCXNkX2xvY2tfc3RhdGUgPSBzZF9jYXJkLT5zZF9sb2NrX3N0YXR1czsKKwkJc2RfbG9ja19zdGF0ZSAmPSBTRF9MT0NLRUQ7CisJfQorI2VuZGlmCisKKwlyZXR2YWwgPSBnZXRfcnNwX3R5cGUocnNwX2NvZGUsICZyc3BfdHlwZSwgJnJzcF9sZW4pOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKwlzZF9jYXJkLT5sYXN0X3JzcF90eXBlID0gcnNwX3R5cGU7CisKKwlyZXR2YWwgPSBzZF9zd2l0Y2hfY2xvY2soY2hpcCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworI2lmZGVmIFNVUFBPUlRfU0RfTE9DSworCWlmICgoc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgJiBTRF9MT0NLXzFCSVRfTU9ERSkgPT0gMCkgeworCQlpZiAoQ0hLX01NQ184QklUKHNkX2NhcmQpKSB7CisJCQlyZXR2YWwgPQorCQkJICAgIHJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9DRkcxLCAweDAzLAorCQkJCQkJICBTRF9CVVNfV0lEVEhfOCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJfSBlbHNlIGlmIChDSEtfU0Qoc2RfY2FyZCkgfHwgQ0hLX01NQ180QklUKHNkX2NhcmQpKSB7CisJCQlyZXR2YWwgPQorCQkJICAgIHJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9DRkcxLCAweDAzLAorCQkJCQkJICBTRF9CVVNfV0lEVEhfNCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJfQorCX0KKyNlbHNlCisJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX0NGRzEsIDB4MDMsIFNEX0JVU19XSURUSF80KTsKKyNlbmRpZgorCisJaWYgKGRhdGFfbGVuIDwgNTEyKSB7CisJCXJldHZhbCA9IGV4dF9zZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFVF9CTE9DS0xFTiwgZGF0YV9sZW4sCisJCQkJCQkgU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDAsIDApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQpOworCX0KKworCWlmIChzdGFuZGJ5KSB7CisJCXJldHZhbCA9IHNkX3NlbGVjdF9jYXJkKGNoaXAsIDApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQpOworCX0KKworCWlmIChhY21kKSB7CisJCXJldHZhbCA9CisJCSAgICBleHRfc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBBUFBfQ01ELCBzZF9jYXJkLT5zZF9hZGRyLAorCQkJCQkgICAgU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDAsIDApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQpOworCX0KKworCXJldHZhbCA9IGV4dF9zZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIGNtZF9pZHgsIGFyZywgcnNwX3R5cGUsCisJCQkJCSBzZF9jYXJkLT5yc3AsIHJzcF9sZW4sIDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkKTsKKworCWlmIChkYXRhX2xlbiA8PSA1MTIpIHsKKwkJdTggKmJ1ZjsKKwkJdW5zaWduZWQgaW50IG9mZnNldCA9IDA7CisJCXZvaWQgKnNnID0gTlVMTDsKKworCQlidWYgPSBrbWFsbG9jKGRhdGFfbGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisKKwkJaWYgKHVzZV9zZykKKwkJCXJ0czUxeF9hY2Nlc3Nfc2dsaXN0KGJ1ZiwgZGF0YV9sZW4sICh2b2lkICopZGF0YV9idWYsCisJCQkJCSAgICAgJnNnLCAmb2Zmc2V0LCBGUk9NX1hGRVJfQlVGKTsKKwkJZWxzZQorCQkJbWVtY3B5KGJ1ZiwgZGF0YV9idWYsIGRhdGFfbGVuKTsKKworI2lmZGVmIFNVUFBPUlRfU0RfTE9DSworCQlpZiAoY21kX2lkeCA9PSBMT0NLX1VOTE9DSykKKwkJCWxvY2tfY21kX3R5cGUgPSBidWZbMF0gJiAweDBGOworI2VuZGlmCisKKwkJaWYgKGRhdGFfbGVuID4gMjU2KSB7CisJCQlydHM1MXhfaW5pdF9jbWQoY2hpcCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELAorCQkJCQkgICAgICAgKHUxNikgKFBQQlVGX0JBU0UyICsgaSksIDB4RkYsCisJCQkJCSAgICAgICBidWZbaV0pOworCQkJfQorCQkJcmV0dmFsID0gcnRzNTF4X3NlbmRfY21kKGNoaXAsIE1PREVfQywgMjUwKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlrZnJlZShidWYpOworCQkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkKTsKKwkJCX0KKworCQkJcnRzNTF4X2luaXRfY21kKGNoaXApOworCQkJZm9yIChpID0gMjU2OyBpIDwgZGF0YV9sZW47IGkrKykgeworCQkJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsCisJCQkJCSAgICAgICAodTE2KSAoUFBCVUZfQkFTRTIgKyBpKSwgMHhGRiwKKwkJCQkJICAgICAgIGJ1ZltpXSk7CisJCQl9CisJCQlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DLCAyNTApOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCWtmcmVlKGJ1Zik7CisJCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQpOworCQkJfQorCQl9IGVsc2UgeworCQkJcnRzNTF4X2luaXRfY21kKGNoaXApOworCQkJZm9yIChpID0gMDsgaSA8IGRhdGFfbGVuOyBpKyspIHsKKwkJCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELAorCQkJCQkgICAgICAgKHUxNikgKFBQQlVGX0JBU0UyICsgaSksIDB4RkYsCisJCQkJCSAgICAgICBidWZbaV0pOworCQkJfQorCQkJcmV0dmFsID0gcnRzNTF4X3NlbmRfY21kKGNoaXAsIE1PREVfQywgMjUwKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlrZnJlZShidWYpOworCQkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkKTsKKwkJCX0KKwkJfQorCisJCWtmcmVlKGJ1Zik7CisKKwkJcnRzNTF4X2luaXRfY21kKGNoaXApOworCisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0JZVEVfQ05UX0gsIDB4RkYsCisJCQkgICAgICAgKHU4KSAoKGRhdGFfbGVuID4+IDgpICYgMHgwMykpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9CWVRFX0NOVF9MLCAweEZGLAorCQkJICAgICAgICh1OCkgZGF0YV9sZW4pOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9CTE9DS19DTlRfSCwgMHhGRiwgMHgwMCk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0JMT0NLX0NOVF9MLCAweEZGLCAweDAxKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9EQVRBX1NPVVJDRSwgMHgwMSwKKwkJCSAgICAgICBQSU5HUE9OR19CVUZGRVIpOworCisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX1RSQU5TRkVSLCAweEZGLAorCQkJICAgICAgIFNEX1RNX0FVVE9fV1JJVEVfMyB8IFNEX1RSQU5TRkVSX1NUQVJUKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgQ0hFQ0tfUkVHX0NNRCwgU0RfVFJBTlNGRVIsCisJCQkgICAgICAgU0RfVFJBTlNGRVJfRU5ELCBTRF9UUkFOU0ZFUl9FTkQpOworCisJCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0NSLCAxMDApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQpOworCisJCXJldHZhbCA9IHJ0czUxeF9nZXRfcnNwKGNoaXAsIDEsIDI1MCk7CisJCWlmIChDSEVDS19TRF9UUkFOU19GQUlMKGNoaXAsIHJldHZhbCkpCisJCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZCk7CisJfSBlbHNlIGlmICghKGRhdGFfbGVuICYgMHgxRkYpKSB7CisJCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9CWVRFX0NOVF9ILCAweEZGLCAweDAyKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgU0RfQllURV9DTlRfTCwgMHhGRiwgMHgwMCk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0JMT0NLX0NOVF9ILAorCQkJICAgICAgIDB4RkYsICh1OCkgKGRhdGFfbGVuID4+IDE3KSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFNEX0JMT0NLX0NOVF9MLAorCQkJICAgICAgIDB4RkYsICh1OCkgKChkYXRhX2xlbiAmIDB4MDAwMUZFMDApID4+IDkpKTsKKworCQl0cmFuc19kbWFfZW5hYmxlKERNQV9UT19ERVZJQ0UsIGNoaXAsIGRhdGFfbGVuLCBETUFfNTEyKTsKKworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBTRF9UUkFOU0ZFUiwgMHhGRiwKKwkJCSAgICAgICBTRF9UTV9BVVRPX1dSSVRFXzMgfCBTRF9UUkFOU0ZFUl9TVEFSVCk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIENIRUNLX1JFR19DTUQsIFNEX1RSQU5TRkVSLAorCQkJICAgICAgIFNEX1RSQU5TRkVSX0VORCwgU0RfVFJBTlNGRVJfRU5EKTsKKworCQlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DRE9SLCAxMDApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQpOworCisJCXJldHZhbCA9CisJCSAgICBydHM1MXhfdHJhbnNmZXJfZGF0YV9yY2MoY2hpcCwgU05EX0JVTEtfUElQRShjaGlwKSwKKwkJCQkJICAgICBkYXRhX2J1ZiwgYnVmX2xlbiwgdXNlX3NnLCBOVUxMLAorCQkJCQkgICAgIDEwMDAwLCBTVEFHRV9ETyk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZCk7CisKKwkJcmV0dmFsID0gcnRzNTF4X2dldF9yc3AoY2hpcCwgMSwgMTAwMDApOworCQlpZiAoQ0hFQ0tfU0RfVFJBTlNfRkFJTChjaGlwLCByZXR2YWwpKQorCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQpOworCisJfSBlbHNlIHsKKwkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQpOworCX0KKworCWlmIChyZXR2YWwgPCAwKSB7CisJCXdyaXRlX2VyciA9IDE7CisJCXJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1NUT1AsIFNEX1NUT1AgfCBTRF9DTFJfRVJSLAorCQkJCSAgICAgIFNEX1NUT1AgfCBTRF9DTFJfRVJSKTsKKwkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQpOworCX0KKyNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKKwlpZiAoY21kX2lkeCA9PSBMT0NLX1VOTE9DSykgeworCQlpZiAobG9ja19jbWRfdHlwZSA9PSBTRF9FUkFTRSkgeworCQkJc2RfY2FyZC0+c2RfZXJhc2Vfc3RhdHVzID0gU0RfVU5ERVJfRVJBU0lORzsKKwkJCXNjc2lfc2V0X3Jlc2lkKHNyYiwgMCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0dPT0Q7CisJCX0KKworCQlydHM1MXhfaW5pdF9jbWQoY2hpcCk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIENIRUNLX1JFR19DTUQsIFNEX0JVU19TVEFULCBTRF9EQVQwX1NUQVRVUywKKwkJCSAgICAgICBTRF9EQVQwX1NUQVRVUyk7CisJCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0NSLCAyNTApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQpOworCQlydHM1MXhfZ2V0X3JzcChjaGlwLCAxLCAyMDApOyAvKiBEb24ndCBjYXJlIHJldHVybiB2YWx1ZSAqLworCisJCXJldHZhbCA9IHNkX3VwZGF0ZV9sb2NrX3N0YXR1cyhjaGlwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJUlRTNTFYX0RFQlVHUCgiTG9jayBjb21tYW5kIGZhaWwhXG4iKTsKKwkJCWxvY2tfY21kX2ZhaWwgPSAxOworCQl9CisJfQorI2VuZGlmIC8qIFNVUFBPUlRfU0RfTE9DSyAqLworCisJaWYgKHN0YW5kYnkpIHsKKwkJcmV0dmFsID0gc2Rfc2VsZWN0X2NhcmQoY2hpcCwgMSk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZCk7CisJfQorCisJaWYgKGNtZDEyKSB7CisJCXJldHZhbCA9IGV4dF9zZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNUT1BfVFJBTlNNSVNTSU9OLAorCQkJCQkJIDAsIFNEX1JTUF9UWVBFX1IxYiwgTlVMTCwgMCwKKwkJCQkJCSAwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkKTsKKwl9CisKKwlpZiAoZGF0YV9sZW4gPCA1MTIpIHsKKwkJcmV0dmFsID0gZXh0X3NkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VUX0JMT0NLTEVOLCAweDIwMCwKKwkJCQkJCSBTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCwgMCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZCk7CisKKwkJcnRzNTF4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX0JZVEVfQ05UX0gsIDB4RkYsIDB4MDIpOworCQlydHM1MXhfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfQllURV9DTlRfTCwgMHhGRiwgMHgwMCk7CisJfQorCisJaWYgKGNtZDEyIHx8IHN0YW5kYnkpIHsKKwkJLyogVGhlcmUgaXMgQ01ENyBvciBDTUQxMiBzZW50IGJlZm9yZSBDTUQxMyAqLworCQljbWQxM19jaGVja2JpdCA9IDE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlyZXR2YWwgPQorCQkgICAgZXh0X3NkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VORF9TVEFUVVMsIHNkX2NhcmQtPnNkX2FkZHIsCisJCQkJCSAgICBTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCwKKwkJCQkJICAgIGNtZDEzX2NoZWNrYml0KTsKKwkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKKwkJCWJyZWFrOworCX0KKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZCk7CisjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCisJaWYgKGNtZF9pZHggPT0gTE9DS19VTkxPQ0spIHsKKwkJaWYgKCFsb2NrX2NtZF9mYWlsKSB7CisJCQlSVFM1MVhfREVCVUdQKCJsb2NrX2NtZF90eXBlID0gMHgleFxuIiwKKwkJCQkgICAgICAgbG9ja19jbWRfdHlwZSk7CisJCQlpZiAobG9ja19jbWRfdHlwZSAmIFNEX0NMUl9QV0QpCisJCQkJc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgJj0gflNEX1BXRF9FWElTVDsKKwkJCWlmIChsb2NrX2NtZF90eXBlICYgU0RfU0VUX1BXRCkKKwkJCQlzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyB8PSBTRF9QV0RfRVhJU1Q7CisJCX0KKworCQlSVFM1MVhfREVCVUdQKCJzZF9sb2NrX3N0YXRlID0gMHgleCwiCisJCQkJInNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzID0gMHgleFxuIiwKKwkJCQlzZF9sb2NrX3N0YXRlLCBzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyk7CisJCWlmIChzZF9sb2NrX3N0YXRlIF4gKHNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzICYgU0RfTE9DS0VEKSkgeworCQkJc2RfY2FyZC0+c2RfbG9ja19ub3RpZnkgPSAxOworCQkJaWYgKHNkX2xvY2tfc3RhdGUpIHsKKwkJCQlpZiAoc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgJgorCQkJCQkJU0RfTE9DS18xQklUX01PREUpIHsKKwkJCQkJc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgfD0KKwkJCQkJICAgIChTRF9VTkxPQ0tfUE9XX09OIHwgU0RfU0RSX1JTVCk7CisJCQkJCWlmIChDSEtfU0Qoc2RfY2FyZCkpIHsKKwkJCQkJCXJldHZhbCA9IHJlc2V0X3NkKGNoaXApOworCQkJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCQkJCXNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzCisJCQkJCQkJJj0gfihTRF9VTkxPQ0tfUE9XX09OIHwKKwkJCQkJCQkgICAgICBTRF9TRFJfUlNUKTsKKwkJCQkJCQlUUkFDRV9HT1RPKGNoaXAsCisJCQkJCQkJCSAgIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZCk7CisJCQkJCQl9CisJCQkJCX0KKworCQkJCQlzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyAmPQorCQkJCQkgICAgfihTRF9VTkxPQ0tfUE9XX09OIHwgU0RfU0RSX1JTVCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYgKGxvY2tfY21kX2ZhaWwpIHsKKwkJc2NzaV9zZXRfcmVzaWQoc3JiLCAwKTsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX05PX1NFTlNFKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKyNlbmRpZiAvKiBTVVBQT1JUX1NEX0xPQ0sgKi8KKworCXJldHVybiBUUkFOU1BPUlRfR09PRDsKKworU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkOgorCXNkX2NhcmQtPnByZV9jbWRfZXJyID0gMTsKKwlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTk9fU0VOU0UpOworCWlmICh3cml0ZV9lcnIpCisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOworCXJlbGVhc2Vfc2RfY2FyZChjaGlwKTsKKwlkb19yZXNldF9zZF9jYXJkKGNoaXApOworCWlmICghKGNoaXAtPmNhcmRfcmVhZHkgJiBTRF9DQVJEKSkKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKKworCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKK30KKworaW50IHNkX3Bhc3NfdGhydV9tb2RlKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKwl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKKwlpbnQgbGVuOworCXU4IGJ1ZlsxOF0gPSB7CisJCTB4MDAsCisJCTB4MDAsCisJCTB4MDAsCisJCTB4MEUsCisJCTB4MDAsCQkvKiBWZXJzaW9uIE51bWJlciAqLworCQkweDAwLAkJLyogV1AgfCBNZWRpYSBUeXBlICovCisJCTB4MDAsCQkvKiBSQ0EgKExvdyBieXRlKSAqLworCQkweDAwLAkJLyogUkNBIChIaWdoIGJ5dGUpICovCisJCTB4NTMsCQkvKiAnUycgKi8KKwkJMHg0NCwJCS8qICdEJyAqLworCQkweDIwLAkJLyogJyAnICovCisJCTB4NDMsCQkvKiAnQycgKi8KKwkJMHg2MSwJCS8qICdhJyAqLworCQkweDcyLAkJLyogJ3InICovCisJCTB4NjQsCQkvKiAnZCcgKi8KKwkJMHgwMCwJCS8qIE1heCBMVU4gTnVtYmVyICovCisJCTB4MDAsCisJCTB4MDAsCisJfTsKKworCXNkX2NhcmQtPnByZV9jbWRfZXJyID0gMDsKKworCWlmICghKENIS19CSVQoY2hpcC0+bHVuX21jLCBsdW4pKSkgeworCQlTRVRfQklUKGNoaXAtPmx1bl9tYywgbHVuKTsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0NIQU5HRSk7CisJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwl9CisKKwlpZiAoKDB4NTMgIT0gc3JiLT5jbW5kWzJdKSB8fCAoMHg0NCAhPSBzcmItPmNtbmRbM10pCisJICAgIHx8ICgweDIwICE9IHNyYi0+Y21uZFs0XSkgfHwgKDB4NDMgIT0gc3JiLT5jbW5kWzVdKQorCSAgICB8fCAoMHg2MSAhPSBzcmItPmNtbmRbNl0pIHx8ICgweDcyICE9IHNyYi0+Y21uZFs3XSkKKwkgICAgfHwgKDB4NjQgIT0gc3JiLT5jbW5kWzhdKSkgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOworCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJfQorCisJc3dpdGNoIChzcmItPmNtbmRbMV0gJiAweDBGKSB7CisJY2FzZSAwOgorCQlzZF9jYXJkLT5zZF9wYXNzX3RocnVfZW4gPSAwOworCQlicmVhazsKKworCWNhc2UgMToKKwkJc2RfY2FyZC0+c2RfcGFzc190aHJ1X2VuID0gMTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOworCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJfQorCisJLyogMHgwMTpTRCBNZW1vcnkgQ2FyZDsgMHgwMjpPdGhlciBNZWRpYTsgMHgwMzpJbGxlZ2FsIE1lZGlhOyAqLworCWJ1Zls1XSA9ICgxID09IENIS19TRChzZF9jYXJkKSkgPyAweDAxIDogMHgwMjsKKwlpZiAoY2hpcC0+Y2FyZF93cCAmIFNEX0NBUkQpCisJCWJ1Zls1XSB8PSAweDgwOworCisJYnVmWzZdID0gKHU4KSAoc2RfY2FyZC0+c2RfYWRkciA+PiAxNik7CisJYnVmWzddID0gKHU4KSAoc2RfY2FyZC0+c2RfYWRkciA+PiAyNCk7CisKKwlidWZbMTVdID0gY2hpcC0+bWF4X2x1bjsKKworCWxlbiA9IG1pbigxOCwgKGludClzY3NpX2J1ZmZsZW4oc3JiKSk7CisJcnRzNTF4X3NldF94ZmVyX2J1ZihidWYsIGxlbiwgc3JiKTsKKworCXJldHVybiBUUkFOU1BPUlRfR09PRDsKK30KKworaW50IHNkX2V4ZWN1dGVfbm9fZGF0YShzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CisJdW5zaWduZWQgaW50IGx1biA9IFNDU0lfTFVOKHNyYik7CisJaW50IHJldHZhbDsKKwl1OCBjbWRfaWR4LCByc3BfY29kZTsKKwl1OCBzdGFuZGJ5ID0gMCwgYWNtZCA9IDA7CisJdTMyIGFyZzsKKworCWlmICghc2RfY2FyZC0+c2RfcGFzc190aHJ1X2VuKSB7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7CisJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwl9CisKKwljbWRfaWR4ID0gc3JiLT5jbW5kWzJdICYgMHgzRjsKKwlpZiAoc3JiLT5jbW5kWzFdICYgMHgwMikKKwkJc3RhbmRieSA9IDE7CisJaWYgKHNyYi0+Y21uZFsxXSAmIDB4MDEpCisJCWFjbWQgPSAxOworCisJYXJnID0gKCh1MzIpIHNyYi0+Y21uZFszXSA8PCAyNCkgfCAoKHUzMikgc3JiLT5jbW5kWzRdIDw8IDE2KSB8CisJICAgICgodTMyKSBzcmItPmNtbmRbNV0gPDwgOCkgfCBzcmItPmNtbmRbNl07CisKKwlyc3BfY29kZSA9IHNyYi0+Y21uZFsxMF07CisKKwlyZXR2YWwgPQorCSAgICBleHRfc2RfZXhlY3V0ZV9ub19kYXRhKGNoaXAsIGx1biwgY21kX2lkeCwgc3RhbmRieSwgYWNtZCwgcnNwX2NvZGUsCisJCQkJICAgYXJnKTsKKwlzY3NpX3NldF9yZXNpZChzcmIsIDApOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBzZF9leGVjdXRlX3JlYWRfZGF0YShzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKKwl1OCBjbWRfaWR4LCByc3BfY29kZSwgc2VuZF9jbWQxMiA9IDAsIHN0YW5kYnkgPSAwLCBhY21kID0gMDsKKwl1MzIgYXJnLCBkYXRhX2xlbjsKKworCWlmICghc2RfY2FyZC0+c2RfcGFzc190aHJ1X2VuKSB7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7CisJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwl9CisKKwljbWRfaWR4ID0gc3JiLT5jbW5kWzJdICYgMHgzRjsKKwlpZiAoc3JiLT5jbW5kWzFdICYgMHgwNCkKKwkJc2VuZF9jbWQxMiA9IDE7CisJaWYgKHNyYi0+Y21uZFsxXSAmIDB4MDIpCisJCXN0YW5kYnkgPSAxOworCWlmIChzcmItPmNtbmRbMV0gJiAweDAxKQorCQlhY21kID0gMTsKKworCWFyZyA9ICgodTMyKSBzcmItPmNtbmRbM10gPDwgMjQpIHwgKCh1MzIpIHNyYi0+Y21uZFs0XSA8PCAxNikgfAorCSAgICAoKHUzMikgc3JiLT5jbW5kWzVdIDw8IDgpIHwgc3JiLT5jbW5kWzZdOworCisJZGF0YV9sZW4gPQorCSAgICAoKHUzMikgc3JiLT5jbW5kWzddIDw8IDE2KSB8ICgodTMyKSBzcmItPmNtbmRbOF0gPDwgOCkgfAorCSAgICBzcmItPmNtbmRbOV07CisJcnNwX2NvZGUgPSBzcmItPmNtbmRbMTBdOworCisJcmV0dmFsID0KKwkgICAgZXh0X3NkX2V4ZWN1dGVfcmVhZF9kYXRhKGNoaXAsIGx1biwgY21kX2lkeCwgc2VuZF9jbWQxMiwgc3RhbmRieSwKKwkJCQkgICAgIGFjbWQsIHJzcF9jb2RlLCBhcmcsIGRhdGFfbGVuLAorCQkJCSAgICAgc2NzaV9zZ2xpc3Qoc3JiKSwgc2NzaV9idWZmbGVuKHNyYiksCisJCQkJICAgICBzY3NpX3NnX2NvdW50KHNyYikpOworCXNjc2lfc2V0X3Jlc2lkKHNyYiwgMCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IHNkX2V4ZWN1dGVfd3JpdGVfZGF0YShzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKKwl1OCBjbWRfaWR4LCByc3BfY29kZSwgc2VuZF9jbWQxMiA9IDAsIHN0YW5kYnkgPSAwLCBhY21kID0gMDsKKwl1MzIgZGF0YV9sZW4sIGFyZzsKKworCWlmICghc2RfY2FyZC0+c2RfcGFzc190aHJ1X2VuKSB7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7CisJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwl9CisKKwljbWRfaWR4ID0gc3JiLT5jbW5kWzJdICYgMHgzRjsKKwlpZiAoc3JiLT5jbW5kWzFdICYgMHgwNCkKKwkJc2VuZF9jbWQxMiA9IDE7CisJaWYgKHNyYi0+Y21uZFsxXSAmIDB4MDIpCisJCXN0YW5kYnkgPSAxOworCWlmIChzcmItPmNtbmRbMV0gJiAweDAxKQorCQlhY21kID0gMTsKKworCWRhdGFfbGVuID0KKwkgICAgKCh1MzIpIHNyYi0+Y21uZFs3XSA8PCAxNikgfCAoKHUzMikgc3JiLT5jbW5kWzhdIDw8IDgpIHwKKwkgICAgc3JiLT5jbW5kWzldOworCWFyZyA9CisJICAgICgodTMyKSBzcmItPmNtbmRbM10gPDwgMjQpIHwgKCh1MzIpIHNyYi0+Y21uZFs0XSA8PCAxNikgfAorCSAgICAoKHUzMikgc3JiLT5jbW5kWzVdIDw8IDgpIHwgc3JiLT5jbW5kWzZdOworCXJzcF9jb2RlID0gc3JiLT5jbW5kWzEwXTsKKworCXJldHZhbCA9CisJICAgIGV4dF9zZF9leGVjdXRlX3dyaXRlX2RhdGEoY2hpcCwgbHVuLCBjbWRfaWR4LCBzZW5kX2NtZDEyLCBzdGFuZGJ5LAorCQkJCSAgICAgIGFjbWQsIHJzcF9jb2RlLCBhcmcsIGRhdGFfbGVuLAorCQkJCSAgICAgIHNjc2lfc2dsaXN0KHNyYiksIHNjc2lfYnVmZmxlbihzcmIpLAorCQkJCSAgICAgIHNjc2lfc2dfY291bnQoc3JiKSk7CisJc2NzaV9zZXRfcmVzaWQoc3JiLCAwKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgc2RfZ2V0X2NtZF9yc3Aoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOworCXVuc2lnbmVkIGludCBsdW4gPSBTQ1NJX0xVTihzcmIpOworCWludCBjb3VudDsKKwl1MTYgZGF0YV9sZW47CisKKwlpZiAoIXNkX2NhcmQtPnNkX3Bhc3NfdGhydV9lbikgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOworCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJfQorCisJaWYgKHNkX2NhcmQtPnByZV9jbWRfZXJyKSB7CisJCXNkX2NhcmQtPnByZV9jbWRfZXJyID0gMDsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0NIQU5HRSk7CisJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwl9CisKKwlkYXRhX2xlbiA9ICgodTE2KSBzcmItPmNtbmRbN10gPDwgOCkgfCBzcmItPmNtbmRbOF07CisKKwlpZiAoc2RfY2FyZC0+bGFzdF9yc3BfdHlwZSA9PSBTRF9SU1BfVFlQRV9SMCkgeworCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOworCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJfSBlbHNlIGlmIChzZF9jYXJkLT5sYXN0X3JzcF90eXBlID09IFNEX1JTUF9UWVBFX1IyKSB7CisJCWNvdW50ID0gKGRhdGFfbGVuIDwgMTcpID8gZGF0YV9sZW4gOiAxNzsKKwl9IGVsc2UgeworCQljb3VudCA9IChkYXRhX2xlbiA8IDYpID8gZGF0YV9sZW4gOiA2OworCX0KKwlydHM1MXhfc2V0X3hmZXJfYnVmKHNkX2NhcmQtPnJzcCwgY291bnQsIHNyYik7CisKKwlSVFM1MVhfREVCVUdQKCJSZXNwb25zZSBsZW5ndGg6ICVkXG4iLCBkYXRhX2xlbik7CisJUlRTNTFYX0RFQlVHUCgiUmVzcG9uc2U6IDB4JXggMHgleCAweCV4IDB4JXhcbiIsCisJCSAgICAgICBzZF9jYXJkLT5yc3BbMF0sIHNkX2NhcmQtPnJzcFsxXSwgc2RfY2FyZC0+cnNwWzJdLAorCQkgICAgICAgc2RfY2FyZC0+cnNwWzNdKTsKKworCXNjc2lfc2V0X3Jlc2lkKHNyYiwgMCk7CisJcmV0dXJuIFRSQU5TUE9SVF9HT09EOworfQorCitpbnQgc2RfaHdfcnN0KHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKKwl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKKwlpbnQgcmV0dmFsOworCisJaWYgKCFzZF9jYXJkLT5zZF9wYXNzX3RocnVfZW4pIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKworCWlmIChzZF9jYXJkLT5wcmVfY21kX2VycikgeworCQlzZF9jYXJkLT5wcmVfY21kX2VyciA9IDA7CisJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9DSEFOR0UpOworCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJfQorCisJaWYgKCgweDUzICE9IHNyYi0+Y21uZFsyXSkgfHwgKDB4NDQgIT0gc3JiLT5jbW5kWzNdKQorCSAgICB8fCAoMHgyMCAhPSBzcmItPmNtbmRbNF0pIHx8ICgweDQzICE9IHNyYi0+Y21uZFs1XSkKKwkgICAgfHwgKDB4NjEgIT0gc3JiLT5jbW5kWzZdKSB8fCAoMHg3MiAhPSBzcmItPmNtbmRbN10pCisJICAgIHx8ICgweDY0ICE9IHNyYi0+Y21uZFs4XSkpIHsKKwkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCX0KKworCXN3aXRjaCAoc3JiLT5jbW5kWzFdICYgMHgwRikgeworCWNhc2UgMDoKKwkJLyogU0QgQ2FyZCBQb3dlciBPZmYgLT4gT04gYW5kIEluaXRpYWxpemF0aW9uICovCisjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCisJCWlmICgweDY0ID09IHNyYi0+Y21uZFs5XSkgeworCQkJLyogQ29tbWFuZCBNb2RlICovCisJCQlzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyB8PSBTRF9TRFJfUlNUOworCQl9CisjZW5kaWYgLyogU1VQUE9SVF9TRF9MT0NLICovCisJCXJldHZhbCA9IHJlc2V0X3NkX2NhcmQoY2hpcCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKyNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKKwkJCXNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzICY9IH5TRF9TRFJfUlNUOworI2VuZGlmCisJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOworCQkJc2RfY2FyZC0+cHJlX2NtZF9lcnIgPSAxOworCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQl9CisjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCisJCXNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzICY9IH5TRF9TRFJfUlNUOworI2VuZGlmCisJCWJyZWFrOworCisJY2FzZSAxOgorCQkvKiByZXNldCBDTUQoQ01EMCkgYW5kIEluaXRpYWxpemF0aW9uCisJCSAqICh3aXRob3V0IFNEIENhcmQgUG93ZXIgT2ZmIC0+IE9OKSAqLworCQlyZXR2YWwgPSBzb2Z0X3Jlc2V0X3NkX2NhcmQoY2hpcCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CisJCQlzZF9jYXJkLT5wcmVfY21kX2VyciA9IDE7CisJCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOworCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJfQorCisJc2NzaV9zZXRfcmVzaWQoc3JiLCAwKTsKKwlyZXR1cm4gVFJBTlNQT1JUX0dPT0Q7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3NkX2Nwcm0uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3NkX2Nwcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWUyNjNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvc2RfY3BybS5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qIERyaXZlciBmb3IgUmVhbHRlayBSVFM1MXh4IFVTQiBjYXJkIHJlYWRlcgorICogSGVhZGVyIGZpbGUKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOSBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogQXV0aG9yOgorICogICB3d2FuZyAod2VpX3dhbmdAcmVhbHNpbC5jb20uY24pCisgKiAgIE5vLiA0NTAsIFNoZW5odSBSb2FkLCBTdXpob3UgSW5kdXN0cnkgUGFyaywgU3V6aG91LCBDaGluYQorICogTWFpbnRhaW5lcjoKKyAqICAgRWR3aW4gUm9uZyAoZWR3aW5fcm9uZ0ByZWFsc2lsLmNvbS5jbikKKyAqICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisgKi8KKworI2lmbmRlZiBfX1JUUzUxWF9TRF9DUFJNX0gKKyNkZWZpbmUgX19SVFM1MVhfU0RfQ1BSTV9ICisKKyNpbmNsdWRlICJydHM1MXhfY2hpcC5oIgorI2luY2x1ZGUgInNkLmgiCisKKyNpZmRlZiBTVVBQT1JUX0NQUk0KK2ludCBleHRfc2RfZXhlY3V0ZV9ub19kYXRhKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IGx1biwKKwkJCSAgIHU4IGNtZF9pZHgsIHU4IHN0YW5kYnksIHU4IGFjbWQsIHU4IHJzcF9jb2RlLAorCQkJICAgdTMyIGFyZyk7CitpbnQgZXh0X3NkX2V4ZWN1dGVfcmVhZF9kYXRhKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IGx1biwKKwkJCSAgICAgdTggY21kX2lkeCwgdTggY21kMTIsIHU4IHN0YW5kYnksIHU4IGFjbWQsCisJCQkgICAgIHU4IHJzcF9jb2RlLCB1MzIgYXJnLCB1MzIgZGF0YV9sZW4sIHZvaWQgKmRhdGFfYnVmLAorCQkJICAgICB1bnNpZ25lZCBpbnQgYnVmX2xlbiwgaW50IHVzZV9zZyk7CitpbnQgZXh0X3NkX2V4ZWN1dGVfd3JpdGVfZGF0YShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBsdW4sCisJCQkgICAgICB1OCBjbWRfaWR4LCB1OCBjbWQxMiwgdTggc3RhbmRieSwgdTggYWNtZCwKKwkJCSAgICAgIHU4IHJzcF9jb2RlLCB1MzIgYXJnLCB1MzIgZGF0YV9sZW4sCisJCQkgICAgICB2b2lkICpkYXRhX2J1ZiwgdW5zaWduZWQgaW50IGJ1Zl9sZW4sIGludCB1c2Vfc2cpOworCitpbnQgc2RfcGFzc190aHJ1X21vZGUoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApOworaW50IHNkX2V4ZWN1dGVfbm9fZGF0YShzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7CitpbnQgc2RfZXhlY3V0ZV9yZWFkX2RhdGEoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApOworaW50IHNkX2V4ZWN1dGVfd3JpdGVfZGF0YShzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7CitpbnQgc2RfZ2V0X2NtZF9yc3Aoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApOworaW50IHNkX2h3X3JzdChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7CisjZW5kaWYKKworI2VuZGlmIC8qIF9fUlRTNTFYX1NEX0NQUk1fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkvdHJhY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3RyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU4NGI4YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3RyYWNlLmgKQEAgLTAsMCArMSwxMzcgQEAKKy8qIERyaXZlciBmb3IgUmVhbHRlayBSVFM1MXh4IFVTQiBjYXJkIHJlYWRlcgorICogSGVhZGVyIGZpbGUKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOSBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogQXV0aG9yOgorICogICB3d2FuZyAod2VpX3dhbmdAcmVhbHNpbC5jb20uY24pCisgKiAgIE5vLiA0NTAsIFNoZW5odSBSb2FkLCBTdXpob3UgSW5kdXN0cnkgUGFyaywgU3V6aG91LCBDaGluYQorICogTWFpbnRhaW5lcjoKKyAqICAgRWR3aW4gUm9uZyAoZWR3aW5fcm9uZ0ByZWFsc2lsLmNvbS5jbikKKyAqICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisgKi8KKworI2lmbmRlZiBfX1JUUzUxWF9UUkFDRV9ICisjZGVmaW5lIF9fUlRTNTFYX1RSQUNFX0gKKworI2luY2x1ZGUgImRlYnVnLmgiCisKKyNkZWZpbmUgX01TR19UUkFDRQorCisjaWZkZWYgX01TR19UUkFDRQorc3RhdGljIGlubGluZSBjaGFyICpmaWxlbmFtZShjaGFyICpwYXRoKQoreworCWNoYXIgKnB0cjsKKworCWlmIChwYXRoID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcHRyID0gcGF0aDsKKworCXdoaWxlICgqcHRyICE9ICdcMCcpIHsKKwkJaWYgKCgqcHRyID09ICdcXCcpIHx8ICgqcHRyID09ICcvJykpCisJCQlwYXRoID0gcHRyICsgMTsKKwkJcHRyKys7CisJfQorCisJcmV0dXJuIHBhdGg7Cit9CisKKyNkZWZpbmUgVFJBQ0VfUkVUKGNoaXAsIHJldCkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWNoYXIgKl9maWxlID0gZmlsZW5hbWUoKGNoYXIgKilfX0ZJTEVfXyk7CQkJXAorCVJUUzUxWF9ERUJVR1AoIlslc11bJXNdOlslZF1cbiIsIF9maWxlLCBfX2Z1bmNfXywgX19MSU5FX18pOwlcCisJKGNoaXApLT50cmFjZV9tc2dbKGNoaXApLT5tc2dfaWR4XS5saW5lID0gKHUxNikoX19MSU5FX18pOwlcCisJc3RybmNweSgoY2hpcCktPnRyYWNlX21zZ1soY2hpcCktPm1zZ19pZHhdLmZ1bmMsCQlcCisJCQlfX2Z1bmNfXywgTVNHX0ZVTkNfTEVOLTEpOwkJCVwKKwlzdHJuY3B5KChjaGlwKS0+dHJhY2VfbXNnWyhjaGlwKS0+bXNnX2lkeF0uZmlsZSwJCVwKKwkJCV9maWxlLCBNU0dfRklMRV9MRU4tMSk7CQkJCVwKKwlnZXRfY3VycmVudF90aW1lKChjaGlwKS0+dHJhY2VfbXNnWyhjaGlwKS0+bXNnX2lkeF0udGltZXZhbF9idWYsXAorCQkJVElNRV9WQUxfTEVOKTsJXAorCShjaGlwKS0+dHJhY2VfbXNnWyhjaGlwKS0+bXNnX2lkeF0udmFsaWQgPSAxOwkJCVwKKwkoY2hpcCktPm1zZ19pZHgrKzsJCQkJCQlcCisJaWYgKChjaGlwKS0+bXNnX2lkeCA+PSBUUkFDRV9JVEVNX0NOVCkgewkJCVwKKwkJKGNoaXApLT5tc2dfaWR4ID0gMDsJCQkJCVwKKwl9CQkJCQkJCQlcCisJcmV0dXJuIHJldDsJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUUkFDRV9HT1RPKGNoaXAsIGxhYmVsKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJY2hhciAqX2ZpbGUgPSBmaWxlbmFtZSgoY2hhciAqKV9fRklMRV9fKTsJCQlcCisJUlRTNTFYX0RFQlVHUCgiWyVzXVslc106WyVkXVxuIiwgX2ZpbGUsIF9fZnVuY19fLCBfX0xJTkVfXyk7CVwKKwkoY2hpcCktPnRyYWNlX21zZ1soY2hpcCktPm1zZ19pZHhdLmxpbmUgPSAodTE2KShfX0xJTkVfXyk7CVwKKwlzdHJuY3B5KChjaGlwKS0+dHJhY2VfbXNnWyhjaGlwKS0+bXNnX2lkeF0uZnVuYywJCVwKKwkJCV9fZnVuY19fLCBNU0dfRlVOQ19MRU4tMSk7CQkJXAorCXN0cm5jcHkoKGNoaXApLT50cmFjZV9tc2dbKGNoaXApLT5tc2dfaWR4XS5maWxlLAkJXAorCQkJX2ZpbGUsIE1TR19GSUxFX0xFTi0xKTsJCQkJXAorCWdldF9jdXJyZW50X3RpbWUoKGNoaXApLT50cmFjZV9tc2dbKGNoaXApLT5tc2dfaWR4XS50aW1ldmFsX2J1ZixcCisJCQlUSU1FX1ZBTF9MRU4pOwkJCQkJXAorCShjaGlwKS0+dHJhY2VfbXNnWyhjaGlwKS0+bXNnX2lkeF0udmFsaWQgPSAxOwkJCVwKKwkoY2hpcCktPm1zZ19pZHgrKzsJCQkJCQlcCisJaWYgKChjaGlwKS0+bXNnX2lkeCA+PSBUUkFDRV9JVEVNX0NOVCkgewkJCVwKKwkJKGNoaXApLT5tc2dfaWR4ID0gMDsJCQkJCVwKKwl9CQkJCQkJCQlcCisJZ290byBsYWJlbDsJCQkJCQkJXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIFRSQUNFX1JFVChjaGlwLCByZXQpCXJldHVybiAocmV0KQorI2RlZmluZSBUUkFDRV9HT1RPKGNoaXAsIGxhYmVsKQlnb3RvIGxhYmVsCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19SVFM1MTM5X0RFQlVHCitzdGF0aWMgaW5saW5lIHZvaWQgcnRzNTF4X2R1bXAodTggKmJ1ZiwgaW50IGJ1Zl9sZW4pCit7CisJaW50IGk7CisJdTggdG1wWzE2XSA9IHsgMCB9OworCXU4ICpfcHRyID0gYnVmOworCisJZm9yIChpID0gMDsgaSA8ICgoYnVmX2xlbikgLyAxNik7IGkrKykgeworCQlSVFM1MVhfREVCVUdQKCIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggIgorCQkJICAgICAgICIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQkgICAgICAgX3B0clswXSwgX3B0clsxXSwgX3B0clsyXSwgX3B0clszXSwgX3B0cls0XSwKKwkJCSAgICAgICBfcHRyWzVdLCBfcHRyWzZdLCBfcHRyWzddLCBfcHRyWzhdLCBfcHRyWzldLAorCQkJICAgICAgIF9wdHJbMTBdLCBfcHRyWzExXSwgX3B0clsxMl0sIF9wdHJbMTNdLCBfcHRyWzE0XSwKKwkJCSAgICAgICBfcHRyWzE1XSk7CisJCV9wdHIgKz0gMTY7CisJfQorCWlmICgoYnVmX2xlbikgJSAxNikgeworCQltZW1jcHkodG1wLCBfcHRyLCAoYnVmX2xlbikgJSAxNik7CisJCV9wdHIgPSB0bXA7CisJCVJUUzUxWF9ERUJVR1AoIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAiCisJCQkgICAgICAgIiUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCSAgICAgICBfcHRyWzBdLCBfcHRyWzFdLCBfcHRyWzJdLCBfcHRyWzNdLCBfcHRyWzRdLAorCQkJICAgICAgIF9wdHJbNV0sIF9wdHJbNl0sIF9wdHJbN10sIF9wdHJbOF0sIF9wdHJbOV0sCisJCQkgICAgICAgX3B0clsxMF0sIF9wdHJbMTFdLCBfcHRyWzEyXSwgX3B0clsxM10sIF9wdHJbMTRdLAorCQkJICAgICAgIF9wdHJbMTVdKTsKKwl9Cit9CisKKyNkZWZpbmUgUlRTNTFYX0RVTVAoYnVmLCBidWZfbGVuKQlcCisJCXJ0czUxeF9kdW1wKCh1OCAqKShidWYpLCAoYnVmX2xlbikpCisKKyNkZWZpbmUgQ0FUQ0hfVFJJR0dFUihjaGlwKQkJCQkJXAorZG8gewkJCQkJCQkJXAorCXJ0czUxeF9lcDBfd3JpdGVfcmVnaXN0ZXIoKGNoaXApLCAweEZDMzEsIDB4MDEsIDB4MDEpOwlcCisJUlRTNTFYX0RFQlVHUCgiQ2F0Y2ggdHJpZ2dlciFcbiIpOwkJCVwKK30gd2hpbGUgKDApCisKKyNlbHNlCisjZGVmaW5lIFJUUzUxWF9EVU1QKGJ1ZiwgYnVmX2xlbikKKyNkZWZpbmUgQ0FUQ0hfVFJJR0dFUihjaGlwKQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1JUUzUxWF9UUkFDRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTEzOS94ZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkveGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODIwNjA1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkveGQuYwpAQCAtMCwwICsxLDIyNTUgQEAKKy8qIERyaXZlciBmb3IgUmVhbHRlayBSVFM1MXh4IFVTQiBjYXJkIHJlYWRlcgorICoKKyAqIENvcHlyaWdodChjKSAyMDA5IFJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3JwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBBdXRob3I6CisgKiAgIHd3YW5nICh3ZWlfd2FuZ0ByZWFsc2lsLmNvbS5jbikKKyAqICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisgKiBNYWludGFpbmVyOgorICogICBFZHdpbiBSb25nIChlZHdpbl9yb25nQHJlYWxzaWwuY29tLmNuKQorICogICBOby4gNDUwLCBTaGVuaHUgUm9hZCwgU3V6aG91IEluZHVzdHJ5IFBhcmssIFN1emhvdSwgQ2hpbmEKKyAqLworCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ0cmFjZS5oIgorI2luY2x1ZGUgInJ0czUxeC5oIgorI2luY2x1ZGUgInJ0czUxeF90cmFuc3BvcnQuaCIKKyNpbmNsdWRlICJydHM1MXhfc2NzaS5oIgorI2luY2x1ZGUgInJ0czUxeF9jYXJkLmgiCisjaW5jbHVkZSAieGQuaCIKKworc3RhdGljIGludCB4ZF9idWlsZF9sMnBfdGJsKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgaW50IHpvbmVfbm8pOworc3RhdGljIGludCB4ZF9pbml0X3BhZ2Uoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1MzIgcGh5X2JsaywgdTE2IGxvZ29mZiwKKwkJCXU4IHN0YXJ0X3BhZ2UsIHU4IGVuZF9wYWdlKTsKKworc3RhdGljIGlubGluZSB2b2lkIHhkX3NldF9lcnJfY29kZShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHU4IGVycl9jb2RlKQoreworCXN0cnVjdCB4ZF9pbmZvICp4ZF9jYXJkID0gJihjaGlwLT54ZF9jYXJkKTsKKworCXhkX2NhcmQtPmVycl9jb2RlID0gZXJyX2NvZGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHhkX2NoZWNrX2Vycl9jb2RlKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTggZXJyX2NvZGUpCit7CisJc3RydWN0IHhkX2luZm8gKnhkX2NhcmQgPSAmKGNoaXAtPnhkX2NhcmQpOworCisJcmV0dXJuICh4ZF9jYXJkLT5lcnJfY29kZSA9PSBlcnJfY29kZSk7Cit9CisKK3N0YXRpYyBpbnQgeGRfc2V0X2luaXRfcGFyYShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJc3RydWN0IHhkX2luZm8gKnhkX2NhcmQgPSAmKGNoaXAtPnhkX2NhcmQpOworCWludCByZXR2YWw7CisKKwlpZiAoY2hpcC0+YXNpY19jb2RlKQorCQl4ZF9jYXJkLT54ZF9jbG9jayA9IDQ3OworCWVsc2UKKwkJeGRfY2FyZC0+eGRfY2xvY2sgPSBDTEtfNTA7CisKKwlyZXR2YWwgPSBzd2l0Y2hfY2xvY2soY2hpcCwgeGRfY2FyZC0+eGRfY2xvY2spOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IHhkX3N3aXRjaF9jbG9jayhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJc3RydWN0IHhkX2luZm8gKnhkX2NhcmQgPSAmKGNoaXAtPnhkX2NhcmQpOworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBydHM1MXhfc2VsZWN0X2NhcmQoY2hpcCwgWERfQ0FSRCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlyZXR2YWwgPSBzd2l0Y2hfY2xvY2soY2hpcCwgeGRfY2FyZC0+eGRfY2xvY2spOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IHhkX3JlYWRfaWQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCBpZF9jbWQsIHU4ICppZF9idWYsCisJCSAgICAgIHU4IGJ1Zl9sZW4pCit7CisJaW50IHJldHZhbCwgaTsKKworCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX0RBVCwgMHhGRiwgaWRfY21kKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9UUkFOU0ZFUiwgMHhGRiwKKwkJICAgICAgIFhEX1RSQU5TRkVSX1NUQVJUIHwgWERfUkVBRF9JRCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgQ0hFQ0tfUkVHX0NNRCwgWERfVFJBTlNGRVIsIFhEX1RSQU5TRkVSX0VORCwKKwkJICAgICAgIFhEX1RSQU5TRkVSX0VORCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgKHUxNikgKFhEX0FERFJFU1MxICsgaSksIDAsCisJCQkgICAgICAgMCk7CisJfQorCisJcmV0dmFsID0gcnRzNTF4X3NlbmRfY21kKGNoaXAsIE1PREVfQ1IsIDIwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHZhbCA9IHJ0czUxeF9nZXRfcnNwKGNoaXAsIDUsIDIwKTsKKworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzNTF4X2NsZWFyX3hkX2Vycm9yKGNoaXApOworCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwl9CisKKwlpZiAoaWRfYnVmICYmIGJ1Zl9sZW4pIHsKKwkJaWYgKGJ1Zl9sZW4gPiA0KQorCQkJYnVmX2xlbiA9IDQ7CisJCXJ0czUxeF9yZWFkX3JzcF9idWYoY2hpcCwgMSwgaWRfYnVmLCBidWZfbGVuKTsKKwl9CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIHhkX2Fzc2lnbl9waHlfYWRkcihzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHUzMiBhZGRyLCB1OCBtb2RlKQoreworCXN0cnVjdCB4ZF9pbmZvICp4ZF9jYXJkID0gJihjaGlwLT54ZF9jYXJkKTsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgWERfUldfQUREUjoKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfQUREUkVTUzAsIDB4RkYsIDApOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9BRERSRVNTMSwgMHhGRiwKKwkJCSAgICAgICAodTgpIGFkZHIpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9BRERSRVNTMiwgMHhGRiwKKwkJCSAgICAgICAodTgpIChhZGRyID4+IDgpKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfQUREUkVTUzMsIDB4RkYsCisJCQkgICAgICAgKHU4KSAoYWRkciA+PiAxNikpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9DRkcsIDB4RkYsCisJCQkgICAgICAgeGRfY2FyZC0+YWRkcl9jeWNsZSB8IFhEX0NBTENfRUNDIHwKKwkJCSAgICAgICBYRF9CQV9OT19UUkFOU0ZPUk0pOworCQlicmVhazsKKworCWNhc2UgWERfRVJBU0VfQUREUjoKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfQUREUkVTUzAsIDB4RkYsCisJCQkgICAgICAgKHU4KSBhZGRyKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfQUREUkVTUzEsIDB4RkYsCisJCQkgICAgICAgKHU4KSAoYWRkciA+PiA4KSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX0FERFJFU1MyLCAweEZGLAorCQkJICAgICAgICh1OCkgKGFkZHIgPj4gMTYpKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfQ0ZHLCAweEZGLAorCQkJICAgICAgICh4ZF9jYXJkLT5hZGRyX2N5Y2xlIC0gMSkgfAorCQkJICAgICAgIFhEX0NBTENfRUNDIHwgWERfQkFfTk9fVFJBTlNGT1JNKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgeGRfcmVhZF9yZWR1bmRhbnQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1MzIgcGFnZV9hZGRyLCB1OCAqYnVmLAorCQkJICAgICBpbnQgYnVmX2xlbikKK3sKKwlpbnQgcmV0dmFsLCBpOworCisJcnRzNTF4X2luaXRfY21kKGNoaXApOworCisJeGRfYXNzaWduX3BoeV9hZGRyKGNoaXAsIHBhZ2VfYWRkciwgWERfUldfQUREUik7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9UUkFOU0ZFUiwgMHhGRiwKKwkJICAgICAgIFhEX1RSQU5TRkVSX1NUQVJUIHwgWERfUkVBRF9SRURVTkRBTlQpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIENIRUNLX1JFR19DTUQsIFhEX1RSQU5TRkVSLCBYRF9UUkFOU0ZFUl9FTkQsCisJCSAgICAgICBYRF9UUkFOU0ZFUl9FTkQpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsICh1MTYpIChYRF9QQUdFX1NUQVRVUyArIGkpLAorCQkJICAgICAgIDAsIDApOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgKHUxNikgKFhEX1JFU0VSVkVEMCArIGkpLCAwLAorCQkJICAgICAgIDApOworCX0KKwlydHM1MXhfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIFhEX1BBUklUWSwgMCwgMCk7CisKKwlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DUiwgMTAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHZhbCA9IHJ0czUxeF9nZXRfcnNwKGNoaXAsIDExLCA1MDApOworCisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHM1MXhfY2xlYXJfeGRfZXJyb3IoY2hpcCk7CisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKworCWlmIChidWYgJiYgYnVmX2xlbikgeworCQlpZiAoYnVmX2xlbiA+IDExKQorCQkJYnVmX2xlbiA9IDExOworCQlydHM1MXhfcmVhZF9yc3BfYnVmKGNoaXAsIDEsIGJ1ZiwgYnVmX2xlbik7CisJfQorCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IHhkX3JlYWRfZGF0YV9mcm9tX3BwYihzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIGludCBvZmZzZXQsIHU4ICpidWYsCisJCQkJIGludCBidWZfbGVuKQoreworCWludCByZXR2YWwsIGk7CisKKwlpZiAoIWJ1ZiB8fCAoYnVmX2xlbiA8PSAwKSkKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKworCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCWZvciAoaSA9IDA7IGkgPCBidWZfbGVuOyBpKyspIHsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCBQUEJVRl9CQVNFMiArIG9mZnNldCArIGksIDAsCisJCQkgICAgICAgMCk7CisJfQorCisJcmV0dmFsID0gcnRzNTF4X3NlbmRfY21kKGNoaXAsIE1PREVfQ1IsIDEwMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlyZXR2YWwgPSBydHM1MXhfZ2V0X3JzcChjaGlwLCBidWZfbGVuLCAyMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcnRzNTF4X3JlYWRfcnNwX2J1ZihjaGlwLCAwLCBidWYsIGJ1Zl9sZW4pOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IHhkX3JlYWRfY2lzKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTMyIHBhZ2VfYWRkciwgdTggKmJ1ZiwKKwkJICAgICAgIGludCBidWZfbGVuKQoreworCWludCByZXR2YWw7CisJdTggcmVnOworCisJaWYgKCFidWYgfHwgKGJ1Zl9sZW4gPCAxMCkpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwlydHM1MXhfaW5pdF9jbWQoY2hpcCk7CisKKwl4ZF9hc3NpZ25fcGh5X2FkZHIoY2hpcCwgcGFnZV9hZGRyLCBYRF9SV19BRERSKTsKKworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfREFUQV9TT1VSQ0UsIDB4MDEsCisJCSAgICAgICBQSU5HUE9OR19CVUZGRVIpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX1BBR0VfQ05ULCAweEZGLCAxKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9DSEtfREFUQV9TVEFUVVMsCisJCSAgICAgICBYRF9BVVRPX0NIS19EQVRBX1NUQVRVUywgWERfQVVUT19DSEtfREFUQV9TVEFUVVMpOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfVFJBTlNGRVIsIDB4RkYsCisJCSAgICAgICBYRF9UUkFOU0ZFUl9TVEFSVCB8IFhEX1JFQURfUEFHRVMpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIENIRUNLX1JFR19DTUQsIFhEX1RSQU5TRkVSLAorCQkgICAgICAgWERfVFJBTlNGRVJfRU5EIHwgWERfUFBCX0VNUFRZLAorCQkgICAgICAgWERfVFJBTlNGRVJfRU5EIHwgWERfUFBCX0VNUFRZKTsKKworCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0NSLCAxMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJcmV0dmFsID0gcnRzNTF4X2dldF9yc3AoY2hpcCwgMSwgNTAwKTsKKwlpZiAocmV0dmFsID09IFNUQVRVU19USU1FRE9VVCkgeworCQlydHM1MXhfY2xlYXJfeGRfZXJyb3IoY2hpcCk7CisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKworCVJUUzUxWF9SRUFEX1JFRyhjaGlwLCBYRF9QQUdFX1NUQVRVUywgJnJlZyk7CisJaWYgKHJlZyAhPSBYRF9HUEcpIHsKKwkJcnRzNTF4X2NsZWFyX3hkX2Vycm9yKGNoaXApOworCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCX0KKworCVJUUzUxWF9SRUFEX1JFRyhjaGlwLCBYRF9DVEwsICZyZWcpOworCisJaWYgKCEocmVnICYgWERfRUNDMV9FUlJPUikgfHwgIShyZWcgJiBYRF9FQ0MxX1VOQ09SUkVDVEFCTEUpKSB7CisJCXJldHZhbCA9IHhkX3JlYWRfZGF0YV9mcm9tX3BwYihjaGlwLCAwLCBidWYsIGJ1Zl9sZW4pOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCWlmIChyZWcgJiBYRF9FQ0MxX0VSUk9SKSB7CS8qIGNvcnJlY3RhYmxlIGVycm9yICovCisJCQl1OCBlY2NfYml0LCBlY2NfYnl0ZTsKKworCQkJUlRTNTFYX1JFQURfUkVHKGNoaXAsIFhEX0VDQ19CSVQxLCAmZWNjX2JpdCk7CisJCQlSVFM1MVhfUkVBRF9SRUcoY2hpcCwgWERfRUNDX0JZVEUxLCAmZWNjX2J5dGUpOworCisJCQlSVFM1MVhfREVCVUdQKCJFQ0NfQklUMSA9IDB4JXgsIEVDQ19CWVRFMSA9IDB4JXhcbiIsCisJCQkJICAgICAgIGVjY19iaXQsIGVjY19ieXRlKTsKKwkJCWlmIChlY2NfYnl0ZSA8IGJ1Zl9sZW4pIHsKKwkJCQlSVFM1MVhfREVCVUdQKCJCZWZvcmUgY29ycmVjdDogMHgleFxuIiwKKwkJCQkJICAgICAgIGJ1ZltlY2NfYnl0ZV0pOworCQkJCWJ1ZltlY2NfYnl0ZV0gXj0gKDEgPDwgZWNjX2JpdCk7CisJCQkJUlRTNTFYX0RFQlVHUCgiQWZ0ZXIgY29ycmVjdDogMHgleFxuIiwKKwkJCQkJICAgICAgIGJ1ZltlY2NfYnl0ZV0pOworCQkJfQorCQl9CisJfSBlbHNlIGlmICghKHJlZyAmIFhEX0VDQzJfRVJST1IpIHx8ICEocmVnICYgWERfRUNDMl9VTkNPUlJFQ1RBQkxFKSkgeworCQlSVFM1MVhfV1JJVEVfUkVHKGNoaXAsIENBUkRfU1RPUCwgWERfU1RPUCB8IFhEX0NMUl9FUlIsCisJCQkJIFhEX1NUT1AgfCBYRF9DTFJfRVJSKTsKKworCQlyZXR2YWwgPSB4ZF9yZWFkX2RhdGFfZnJvbV9wcGIoY2hpcCwgMjU2LCBidWYsIGJ1Zl9sZW4pOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCWlmIChyZWcgJiBYRF9FQ0MyX0VSUk9SKSB7CisJCQl1OCBlY2NfYml0LCBlY2NfYnl0ZTsKKworCQkJUlRTNTFYX1JFQURfUkVHKGNoaXAsIFhEX0VDQ19CSVQyLCAmZWNjX2JpdCk7CisJCQlSVFM1MVhfUkVBRF9SRUcoY2hpcCwgWERfRUNDX0JZVEUyLCAmZWNjX2J5dGUpOworCisJCQlSVFM1MVhfREVCVUdQKCJFQ0NfQklUMiA9IDB4JXgsIEVDQ19CWVRFMiA9IDB4JXhcbiIsCisJCQkJICAgICAgIGVjY19iaXQsIGVjY19ieXRlKTsKKwkJCWlmIChlY2NfYnl0ZSA8IGJ1Zl9sZW4pIHsKKwkJCQlSVFM1MVhfREVCVUdQKCJCZWZvcmUgY29ycmVjdDogMHgleFxuIiwKKwkJCQkJICAgICAgIGJ1ZltlY2NfYnl0ZV0pOworCQkJCWJ1ZltlY2NfYnl0ZV0gXj0gKDEgPDwgZWNjX2JpdCk7CisJCQkJUlRTNTFYX0RFQlVHUCgiQWZ0ZXIgY29ycmVjdDogMHgleFxuIiwKKwkJCQkJICAgICAgIGJ1ZltlY2NfYnl0ZV0pOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcnRzNTF4X2NsZWFyX3hkX2Vycm9yKGNoaXApOworCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgeGRfcHVsbF9jdGxfZGlzYWJsZShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJaWYgKENIRUNLX1BLRyhjaGlwLCBMUUZQNDgpKSB7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEwxLCAweEZGLCAweDU1KTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDIsIDB4RkYsIDB4NTUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMMywgMHhGRiwgMHg5NSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEw0LCAweEZGLCAweDU1KTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDUsIDB4RkYsIDB4NTUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMNiwgMHhGRiwgMHhBNSk7CisJfSBlbHNlIHsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDEsIDB4RkYsIDB4NjUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMMiwgMHhGRiwgMHg1NSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEwzLCAweEZGLCAweDk1KTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDQsIDB4RkYsIDB4NTUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMNSwgMHhGRiwgMHg1Nik7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEw2LCAweEZGLCAweDU5KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHhkX3B1bGxfY3RsX2VuYWJsZShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJaWYgKENIRUNLX1BLRyhjaGlwLCBMUUZQNDgpKSB7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEwxLCAweEZGLCAweEFBKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDIsIDB4RkYsIDB4NTUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMMywgMHhGRiwgMHg5NSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEw0LCAweEZGLCAweDU1KTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDUsIDB4RkYsIDB4NTUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMNiwgMHhGRiwgMHhBNSk7CisJfSBlbHNlIHsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDEsIDB4RkYsIDB4QTUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMMiwgMHhGRiwgMHg1OSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEwzLCAweEZGLCAweDk1KTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QVUxMX0NUTDQsIDB4RkYsIDB4NTUpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BVTExfQ1RMNSwgMHhGRiwgMHg1NSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFVMTF9DVEw2LCAweEZGLCAweDU5KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmVzZXRfeGQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCB4ZF9pbmZvICp4ZF9jYXJkID0gJihjaGlwLT54ZF9jYXJkKTsKKwlpbnQgcmV0dmFsLCBpLCBqOworCXU4IGlkX2J1Zls0XSwgcmVkdW50WzExXTsKKworCXJldHZhbCA9IHJ0czUxeF9zZWxlY3RfY2FyZChjaGlwLCBYRF9DQVJEKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJcnRzNTF4X2luaXRfY21kKGNoaXApOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfQ0hLX0RBVEFfU1RBVFVTLCAweEZGLAorCQkgICAgICAgWERfUEdTVFNfTk9UX0ZGKTsKKwlpZiAoY2hpcC0+YXNpY19jb2RlKQorCQl4ZF9wdWxsX2N0bF9kaXNhYmxlKGNoaXApOworCWVsc2UKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgRlBHQV9QVUxMX0NUTCwgMHhGRiwKKwkJCSAgICAgICAoRlBHQV9YRF9QVUxMX0NUTF9FTjEgJiBGUEdBX1hEX1BVTExfQ1RMX0VOMykpOworCisJaWYgKCFjaGlwLT5vcHRpb24uRlQyX2Zhc3RfbW9kZSkgeworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9JTklULCBYRF9OT19BVVRPX1BXUl9PRkYsCisJCQkgICAgICAgMCk7CisJCWlmIChDSEVDS19QS0coY2hpcCwgTFFGUDQ4KSB8fAorCQkJCWNoaXAtPm9wdGlvbi5ydHM1MTI5X0QzMzE4X29mZl9lbmFibGUpIHsKKwkJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFdSX0NUTCwKKwkJCQkgICAgICAgRFYzMzE4X0FVVE9fUFdSX09GRiwKKwkJCQkgICAgICAgRFYzMzE4X0FVVE9fUFdSX09GRik7CisJCX0KKwl9CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9PRSwgWERfT1VUUFVUX0VOLCAwKTsKKwlpZiAoIWNoaXAtPm9wdGlvbi5GVDJfZmFzdF9tb2RlKSB7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFdSX0NUTCwgUE9XRVJfTUFTSywKKwkJCSAgICAgICBQT1dFUl9PRkYpOworCX0KKworCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0MsIDEwMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJaWYgKCFjaGlwLT5vcHRpb24uRlQyX2Zhc3RfbW9kZSkgeworI2lmZGVmIFNEX1hEX0lPX0ZPTExPV19QV1IKKwkJaWYgKENIRUNLX1BLRyhjaGlwLCBMUUZQNDgpCisJCSAgICB8fCBjaGlwLT5vcHRpb24ucnRzNTEyOV9EMzMxOF9vZmZfZW5hYmxlKSB7CisJCQlydHM1MXhfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QV1JfQ1RMLAorCQkJCQlMRE9fT0ZGLCBMRE9fT0ZGKTsKKwkJfQorI2VuZGlmCisKKwkJd2FpdF90aW1lb3V0KDI1MCk7CisKKyNpZmRlZiBTRF9YRF9JT19GT0xMT1dfUFdSCisJCWlmIChDSEVDS19QS0coY2hpcCwgTFFGUDQ4KQorCQkgICAgfHwgY2hpcC0+b3B0aW9uLnJ0czUxMjlfRDMzMThfb2ZmX2VuYWJsZSkgeworCQkJcnRzNTF4X2luaXRfY21kKGNoaXApOworCQkJaWYgKGNoaXAtPmFzaWNfY29kZSkgeworCQkJCXhkX3B1bGxfY3RsX2VuYWJsZShjaGlwKTsKKwkJCX0gZWxzZSB7CisJCQkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwKKwkJCQkJRlBHQV9QVUxMX0NUTCwgMHhGRiwKKwkJCQkJKEZQR0FfWERfUFVMTF9DVExfRU4xICYKKwkJCQkJCUZQR0FfWERfUFVMTF9DVExfRU4yKSk7CisJCQl9CisJCQlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DLCAxMDApOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQl9CisjZW5kaWYKKworCQlyZXR2YWwgPSBjYXJkX3Bvd2VyX29uKGNoaXAsIFhEX0NBUkQpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisjaWZkZWYgU1VQUE9SVF9PQ1AKKwkJd2FpdF90aW1lb3V0KDUwKTsKKwkJcnRzNTF4X2dldF9jYXJkX3N0YXR1cyhjaGlwLCAmKGNoaXAtPmNhcmRfc3RhdHVzKSk7CisJCWNoaXAtPm9jcF9zdGF0ID0gKGNoaXAtPmNhcmRfc3RhdHVzID4+IDQpICYgMHgwMzsKKworCQlpZiAoY2hpcC0+b2NwX3N0YXQgJiAoTVNfT0NQX05PVyB8IE1TX09DUF9FVkVSKSkgeworCQkJUlRTNTFYX0RFQlVHUCgiT3ZlciBjdXJyZW50LCBPQ1BTVEFUIGlzIDB4JXhcbiIsCisJCQkJICAgICAgIGNoaXAtPm9jcF9zdGF0KTsKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCX0KKyNlbmRpZgorCX0KKworCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCWlmIChjaGlwLT5hc2ljX2NvZGUpCisJCXhkX3B1bGxfY3RsX2VuYWJsZShjaGlwKTsKKwllbHNlCisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIEZQR0FfUFVMTF9DVEwsIDB4RkYsCisJCQkgICAgICAgKEZQR0FfWERfUFVMTF9DVExfRU4xICYgRlBHQV9YRF9QVUxMX0NUTF9FTjIpKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX09FLCBYRF9PVVRQVVRfRU4sCisJCSAgICAgICBYRF9PVVRQVVRfRU4pOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX0NUTCwgWERfQ0VfRElTRU4sIFhEX0NFX0RJU0VOKTsKKworCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0MsIDEwMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKworCWlmICghY2hpcC0+b3B0aW9uLkZUMl9mYXN0X21vZGUpCisJCXdhaXRfdGltZW91dCgyMDApOworCisJcmV0dmFsID0geGRfc2V0X2luaXRfcGFyYShjaGlwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCS8qIFJlYWQgSUQgdG8gY2hlY2sgaWYgdGhlIHRpbWluZyBzZXR0aW5nIGlzIHJpZ2h0ICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQl1OCB4ZF9kYXQsIHhkX2N0bDsKKworCQlpZiAobW9uaXRvcl9jYXJkX2NkKGNoaXAsIFhEX0NBUkQpID09IENEX05PVF9FWElTVCkKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwkJcnRzNTF4X2luaXRfY21kKGNoaXApOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9EVENUTCwgMHhGRiwKKwkJCVhEX1RJTUVfU0VUVVBfU1RFUCAqIDMgKyBYRF9USU1FX1JXX1NURVAgKgorCQkJKDIgKyBpICsgY2hpcC0+b3B0aW9uLnhkX3J3X3N0ZXApCisJCQkrIFhEX1RJTUVfUldOX1NURVAgKiAoaSArIGNoaXAtPm9wdGlvbi54ZF9yd25fc3RlcCkpOworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9DQVRDVEwsIDB4RkYsCisJCQlYRF9USU1FX1NFVFVQX1NURVAgKiAzICsgWERfVElNRV9SV19TVEVQICogKDQgKworCQkJaSkgKyBYRF9USU1FX1JXTl9TVEVQICogKDMgKyBpKSk7CisKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfVFJBTlNGRVIsIDB4RkYsCisJCQkgICAgICAgWERfVFJBTlNGRVJfU1RBUlQgfCBYRF9SRVNFVCk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIENIRUNLX1JFR19DTUQsIFhEX1RSQU5TRkVSLAorCQkJICAgICAgIFhEX1RSQU5TRkVSX0VORCwgWERfVFJBTlNGRVJfRU5EKTsKKworCQlydHM1MXhfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIFhEX0RBVCwgMCwgMCk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgWERfQ1RMLCAwLCAwKTsKKworCQlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DUiwgMTAwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzNTF4X2NsZWFyX3hkX2Vycm9yKGNoaXApOworCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCX0KKworCQlyZXR2YWwgPSBydHM1MXhfZ2V0X3JzcChjaGlwLCAzLCAxMDApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHM1MXhfY2xlYXJfeGRfZXJyb3IoY2hpcCk7CisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkJfQorCisJCXhkX2RhdCA9IGNoaXAtPnJzcF9idWZbMV07CisJCXhkX2N0bCA9IGNoaXAtPnJzcF9idWZbMl07CisJCVJUUzUxWF9ERUJVR1AoIlhEX0RBVDogMHgleCwgWERfQ1RMOiAweCV4XG4iLCB4ZF9kYXQsIHhkX2N0bCk7CisKKwkJaWYgKCgoeGRfZGF0ICYgUkVBRFlfRkxBRykgIT0gUkVBRFlfU1RBVEUpCisJCSAgICB8fCAhKHhkX2N0bCAmIFhEX1JEWSkpCisJCQljb250aW51ZTsKKworCQlyZXR2YWwgPSB4ZF9yZWFkX2lkKGNoaXAsIFJFQURfSUQsIGlkX2J1ZiwgNCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCQlSVFM1MVhfREVCVUdQKCJSRUFEX0lEOiAweCV4IDB4JXggMHgleCAweCV4XG4iLAorCQkJICAgICAgIGlkX2J1ZlswXSwgaWRfYnVmWzFdLCBpZF9idWZbMl0sIGlkX2J1ZlszXSk7CisKKwkJeGRfY2FyZC0+ZGV2aWNlX2NvZGUgPSBpZF9idWZbMV07CisKKwkJc3dpdGNoICh4ZF9jYXJkLT5kZXZpY2VfY29kZSkgeworCQljYXNlIFhEXzRNX1g4XzUxMl8xOgorCQljYXNlIFhEXzRNX1g4XzUxMl8yOgorCQkJeGRfY2FyZC0+YmxvY2tfc2hpZnQgPSA0OwkvKiAxNiBwYWdlcyBwZXIgYmxvY2sgKi8KKwkJCXhkX2NhcmQtPnBhZ2Vfb2ZmID0gMHgwRjsKKwkJCXhkX2NhcmQtPmFkZHJfY3ljbGUgPSAzOworCQkJeGRfY2FyZC0+em9uZV9jbnQgPSAxOworCQkJeGRfY2FyZC0+Y2FwYWNpdHkgPSA4MDAwOwkvKiA1MDAgKiAyIF4gNCAqLworCQkJWERfU0VUXzRNQih4ZF9jYXJkKTsKKwkJCWJyZWFrOworCQljYXNlIFhEXzhNX1g4XzUxMjoKKwkJCXhkX2NhcmQtPmJsb2NrX3NoaWZ0ID0gNDsKKwkJCXhkX2NhcmQtPnBhZ2Vfb2ZmID0gMHgwRjsKKwkJCXhkX2NhcmQtPmFkZHJfY3ljbGUgPSAzOworCQkJeGRfY2FyZC0+em9uZV9jbnQgPSAxOworCQkJeGRfY2FyZC0+Y2FwYWNpdHkgPSAxNjAwMDsJLyogMTAwMCAqIDIgXiA0ICovCisJCQlicmVhazsKKwkJY2FzZSBYRF8xNk1fWDhfNTEyOgorCQkJWERfUEFHRV81MTIoeGRfY2FyZCk7CS8qIDMyIHBhZ2VzIHBlciBibG9jayAqLworCQkJeGRfY2FyZC0+YWRkcl9jeWNsZSA9IDM7CisJCQl4ZF9jYXJkLT56b25lX2NudCA9IDE7CisJCQl4ZF9jYXJkLT5jYXBhY2l0eSA9IDMyMDAwOwkvKiAxMDAwICogMiBeIDUgKi8KKwkJCWJyZWFrOworCQljYXNlIFhEXzMyTV9YOF81MTI6CisJCQlYRF9QQUdFXzUxMih4ZF9jYXJkKTsKKwkJCXhkX2NhcmQtPmFkZHJfY3ljbGUgPSAzOworCQkJeGRfY2FyZC0+em9uZV9jbnQgPSAyOworCQkJeGRfY2FyZC0+Y2FwYWNpdHkgPSA2NDAwMDsJLyogMjAwMCAqIDIgXiA1ICovCisJCQlicmVhazsKKwkJY2FzZSBYRF82NE1fWDhfNTEyOgorCQkJWERfUEFHRV81MTIoeGRfY2FyZCk7CisJCQl4ZF9jYXJkLT5hZGRyX2N5Y2xlID0gNDsKKwkJCXhkX2NhcmQtPnpvbmVfY250ID0gNDsKKwkJCXhkX2NhcmQtPmNhcGFjaXR5ID0gMTI4MDAwOwkvKiA0MDAwICogMiBeIDUgKi8KKwkJCWJyZWFrOworCQljYXNlIFhEXzEyOE1fWDhfNTEyOgorCQkJWERfUEFHRV81MTIoeGRfY2FyZCk7CisJCQl4ZF9jYXJkLT5hZGRyX2N5Y2xlID0gNDsKKwkJCXhkX2NhcmQtPnpvbmVfY250ID0gODsKKwkJCXhkX2NhcmQtPmNhcGFjaXR5ID0gMjU2MDAwOwkvKiA4MDAwICogMiBeIDUgKi8KKwkJCWJyZWFrOworCQljYXNlIFhEXzI1Nk1fWDhfNTEyOgorCQkJWERfUEFHRV81MTIoeGRfY2FyZCk7CisJCQl4ZF9jYXJkLT5hZGRyX2N5Y2xlID0gNDsKKwkJCXhkX2NhcmQtPnpvbmVfY250ID0gMTY7CisJCQl4ZF9jYXJkLT5jYXBhY2l0eSA9IDUxMjAwMDsJLyogMTYwMDAgKiAyIF4gNSAqLworCQkJYnJlYWs7CisJCWNhc2UgWERfNTEyTV9YODoKKwkJCVhEX1BBR0VfNTEyKHhkX2NhcmQpOworCQkJeGRfY2FyZC0+YWRkcl9jeWNsZSA9IDQ7CisJCQl4ZF9jYXJkLT56b25lX2NudCA9IDMyOworCQkJeGRfY2FyZC0+Y2FwYWNpdHkgPSAxMDI0MDAwOwkvKiAzMjAwMCAqIDIgXiA1ICovCisJCQlicmVhazsKKwkJY2FzZSB4RF8xR19YOF81MTI6CisJCQlYRF9QQUdFXzUxMih4ZF9jYXJkKTsKKwkJCXhkX2NhcmQtPmFkZHJfY3ljbGUgPSA0OworCQkJeGRfY2FyZC0+em9uZV9jbnQgPSA2NDsKKwkJCXhkX2NhcmQtPmNhcGFjaXR5ID0gMjA0ODAwMDsJLyogNjQwMDAgKiAyIF4gNSAqLworCQkJYnJlYWs7CisJCWNhc2UgeERfMkdfWDhfNTEyOgorCQkJWERfUEFHRV81MTIoeGRfY2FyZCk7CisJCQl4ZF9jYXJkLT5hZGRyX2N5Y2xlID0gNDsKKwkJCXhkX2NhcmQtPnpvbmVfY250ID0gMTI4OworCQkJeGRfY2FyZC0+Y2FwYWNpdHkgPSA0MDk2MDAwOwkvKiAxMjgwMDAgKiAyIF4gNSAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIENvbmZpcm0gdGltaW5nIHNldHRpbmcgKi8KKwkJZm9yIChqID0gMDsgaiA8IDEwOyBqKyspIHsKKwkJCXJldHZhbCA9IHhkX3JlYWRfaWQoY2hpcCwgUkVBRF9JRCwgaWRfYnVmLCA0KTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwkJCWlmIChpZF9idWZbMV0gIT0geGRfY2FyZC0+ZGV2aWNlX2NvZGUpCisJCQkJYnJlYWs7CisJCX0KKworCQkvKiBDdXJyZW50IHRpbWluZyBwYXNzICovCisJCWlmIChqID09IDEwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPT0gNCkgeworCQl4ZF9jYXJkLT5ibG9ja19zaGlmdCA9IDA7CisJCXhkX2NhcmQtPnBhZ2Vfb2ZmID0gMDsKKwkJeGRfY2FyZC0+YWRkcl9jeWNsZSA9IDA7CisJCXhkX2NhcmQtPmNhcGFjaXR5ID0gMDsKKworCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCX0KKworCXJldHZhbCA9IHhkX3JlYWRfaWQoY2hpcCwgUkVBRF94RF9JRCwgaWRfYnVmLCA0KTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwlSVFM1MVhfREVCVUdQKCJSRUFEX3hEX0lEOiAweCV4IDB4JXggMHgleCAweCV4XG4iLAorCQkgICAgICAgaWRfYnVmWzBdLCBpZF9idWZbMV0sIGlkX2J1ZlsyXSwgaWRfYnVmWzNdKTsKKwlpZiAoaWRfYnVmWzJdICE9IFhEX0lEX0NPREUpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwkvKiBTZWFyY2ggQ0lTIGJsb2NrICovCisJZm9yIChpID0gMDsgaSA8IDI0OyBpKyspIHsKKwkJdTMyIHBhZ2VfYWRkcjsKKworCQlpZiAobW9uaXRvcl9jYXJkX2NkKGNoaXAsIFhEX0NBUkQpID09IENEX05PVF9FWElTVCkKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwkJcGFnZV9hZGRyID0gKHUzMikgaSA8PCB4ZF9jYXJkLT5ibG9ja19zaGlmdDsKKworCQlmb3IgKGogPSAwOyBqIDwgMzsgaisrKSB7CisJCQlyZXR2YWwgPSB4ZF9yZWFkX3JlZHVuZGFudChjaGlwLCBwYWdlX2FkZHIsIHJlZHVudCwgMTEpOworCQkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaiA9PSAzKQorCQkJY29udGludWU7CisKKwkJaWYgKHJlZHVudFtCTE9DS19TVEFUVVNdICE9IFhEX0dCTEspCisJCQljb250aW51ZTsKKworCQlqID0gMDsKKwkJLyogQ2hlY2sgcGFnZSBzdGF0dXMgKi8KKwkJaWYgKHJlZHVudFtQQUdFX1NUQVRVU10gIT0gWERfR1BHKSB7CisJCQlmb3IgKGogPSAxOyBqIDw9IDg7IGorKykgeworCQkJCXJldHZhbCA9CisJCQkJICAgIHhkX3JlYWRfcmVkdW5kYW50KGNoaXAsIHBhZ2VfYWRkciArIGosCisJCQkJCQkgICAgICByZWR1bnQsIDExKTsKKwkJCQlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJCWlmIChyZWR1bnRbUEFHRV9TVEFUVVNdID09IFhEX0dQRykKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKGogPT0gOSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmICgocmVkdW50W0JMT0NLX1NUQVRVU10gPT0gWERfR0JMSykKKwkJICAgICYmIChyZWR1bnRbUEFSSVRZXSAmIFhEX0JBMV9BTEwwKSkgeworCQkJdTggYnVmWzEwXTsKKworCQkJcGFnZV9hZGRyICs9IGo7CisKKwkJCXJldHZhbCA9IHhkX3JlYWRfY2lzKGNoaXAsIHBhZ2VfYWRkciwgYnVmLCAxMCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJCQlpZiAoKGJ1ZlswXSA9PSAweDAxKSAmJiAoYnVmWzFdID09IDB4MDMpCisJCQkgICAgJiYgKGJ1ZlsyXSA9PSAweEQ5KQorCQkJICAgICYmIChidWZbM10gPT0gMHgwMSkgJiYgKGJ1Zls0XSA9PSAweEZGKQorCQkJICAgICYmIChidWZbNV0gPT0gMHgxOCkgJiYgKGJ1Zls2XSA9PSAweDAyKQorCQkJICAgICYmIChidWZbN10gPT0gMHhERikgJiYgKGJ1Zls4XSA9PSAweDAxKQorCQkJICAgICYmIChidWZbOV0gPT0gMHgyMCkpIHsKKwkJCQl4ZF9jYXJkLT5jaXNfYmxvY2sgPSAodTE2KSBpOworCQkJfQorCQl9CisKKwkJYnJlYWs7CisJfQorCisJUlRTNTFYX0RFQlVHUCgiQ0lTIGJsb2NrOiAweCV4XG4iLCB4ZF9jYXJkLT5jaXNfYmxvY2spOworCWlmICh4ZF9jYXJkLT5jaXNfYmxvY2sgPT0gMHhGRkZGKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJY2hpcC0+Y2FwYWNpdHlbY2hpcC0+Y2FyZDJsdW5bWERfQ0FSRF1dID0geGRfY2FyZC0+Y2FwYWNpdHk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgeGRfY2hlY2tfZGF0YV9ibGFuayh1OCAqcmVkdW50KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQlpZiAocmVkdW50W1BBR0VfU1RBVFVTICsgaV0gIT0gMHhGRikKKwkJCXJldHVybiAwOworCX0KKworCWlmICgocmVkdW50W1BBUklUWV0gJiAoWERfRUNDMV9BTEwxIHwgWERfRUNDMl9BTEwxKSkgIT0KKwkgICAgKFhEX0VDQzFfQUxMMSB8IFhEX0VDQzJfQUxMMSkpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAocmVkdW50W1JFU0VSVkVEMCArIGldICE9IDB4RkYpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHUxNiB4ZF9sb2FkX2xvZ19ibG9ja19hZGRyKHU4ICpyZWR1bnQpCit7CisJdTE2IGFkZHIgPSAweEZGRkY7CisKKwlpZiAocmVkdW50W1BBUklUWV0gJiBYRF9CQTFfQkEyX0VRTCkKKwkJYWRkciA9CisJCSAgICAoKHUxNikgcmVkdW50W0JMT0NLX0FERFIxX0hdIDw8IDgpIHwgcmVkdW50W0JMT0NLX0FERFIxX0xdOworCWVsc2UgaWYgKHJlZHVudFtQQVJJVFldICYgWERfQkExX1ZBTElEKQorCQlhZGRyID0KKwkJICAgICgodTE2KSByZWR1bnRbQkxPQ0tfQUREUjFfSF0gPDwgOCkgfCByZWR1bnRbQkxPQ0tfQUREUjFfTF07CisJZWxzZSBpZiAocmVkdW50W1BBUklUWV0gJiBYRF9CQTJfVkFMSUQpCisJCWFkZHIgPQorCQkgICAgKCh1MTYpIHJlZHVudFtCTE9DS19BRERSMl9IXSA8PCA4KSB8IHJlZHVudFtCTE9DS19BRERSMl9MXTsKKworCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgaW50IHhkX2luaXRfbDJwX3RibChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJc3RydWN0IHhkX2luZm8gKnhkX2NhcmQgPSAmKGNoaXAtPnhkX2NhcmQpOworCWludCBzaXplLCBpOworCisJUlRTNTFYX0RFQlVHUCgieGRfaW5pdF9sMnBfdGJsOiB6b25lX2NudCA9ICVkXG4iLCB4ZF9jYXJkLT56b25lX2NudCk7CisKKwlpZiAoeGRfY2FyZC0+em9uZV9jbnQgPCAxKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJc2l6ZSA9IHhkX2NhcmQtPnpvbmVfY250ICogc2l6ZW9mKHN0cnVjdCB6b25lX2VudHJ5KTsKKwlSVFM1MVhfREVCVUdQKCJCdWZmZXIgc2l6ZSBmb3IgbDJwIHRhYmxlIGlzICVkXG4iLCBzaXplKTsKKworCXhkX2NhcmQtPnpvbmUgPSB2bWFsbG9jKHNpemUpOworCWlmICgheGRfY2FyZC0+em9uZSkKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19OT01FTSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgeGRfY2FyZC0+em9uZV9jbnQ7IGkrKykgeworCQl4ZF9jYXJkLT56b25lW2ldLmJ1aWxkX2ZsYWcgPSAwOworCQl4ZF9jYXJkLT56b25lW2ldLmwycF90YWJsZSA9IE5VTEw7CisJCXhkX2NhcmQtPnpvbmVbaV0uZnJlZV90YWJsZSA9IE5VTEw7CisJCXhkX2NhcmQtPnpvbmVbaV0uZ2V0X2luZGV4ID0gMDsKKwkJeGRfY2FyZC0+em9uZVtpXS5zZXRfaW5kZXggPSAwOworCQl4ZF9jYXJkLT56b25lW2ldLnVudXNlZF9ibGtfY250ID0gMDsKKwl9CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX3pvbmUoc3RydWN0IHpvbmVfZW50cnkgKnpvbmUpCit7CisJUlRTNTFYX0RFQlVHUCgiZnJlZV96b25lXG4iKTsKKwlpZiAoIXpvbmUpCisJCXJldHVybjsKKwl6b25lLT5idWlsZF9mbGFnID0gMDsKKwl6b25lLT5zZXRfaW5kZXggPSAwOworCXpvbmUtPmdldF9pbmRleCA9IDA7CisJem9uZS0+dW51c2VkX2Jsa19jbnQgPSAwOworCWlmICh6b25lLT5sMnBfdGFibGUpIHsKKwkJdmZyZWUoem9uZS0+bDJwX3RhYmxlKTsKKwkJem9uZS0+bDJwX3RhYmxlID0gTlVMTDsKKwl9CisJaWYgKHpvbmUtPmZyZWVfdGFibGUpIHsKKwkJdmZyZWUoem9uZS0+ZnJlZV90YWJsZSk7CisJCXpvbmUtPmZyZWVfdGFibGUgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgeGRfc2V0X3VudXNlZF9ibG9jayhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHUzMiBwaHlfYmxrKQoreworCXN0cnVjdCB4ZF9pbmZvICp4ZF9jYXJkID0gJihjaGlwLT54ZF9jYXJkKTsKKwlzdHJ1Y3Qgem9uZV9lbnRyeSAqem9uZTsKKwlpbnQgem9uZV9ubzsKKworCXpvbmVfbm8gPSAoaW50KXBoeV9ibGsgPj4gMTA7CisJaWYgKHpvbmVfbm8gPj0geGRfY2FyZC0+em9uZV9jbnQpIHsKKwkJUlRTNTFYX0RFQlVHUCgiU2V0IHVudXNlZCBibG9jayB0byBpbnZhbGlkIHpvbmUiCisJCQkJCSIoem9uZV9ubyA9ICVkLCB6b25lX2NudCA9ICVkKVxuIiwKKwkJCQkJem9uZV9ubywgeGRfY2FyZC0+em9uZV9jbnQpOworCQlyZXR1cm47CisJfQorCXpvbmUgPSAmKHhkX2NhcmQtPnpvbmVbem9uZV9ub10pOworCisJaWYgKHpvbmUtPmZyZWVfdGFibGUgPT0gTlVMTCkgeworCQlpZiAoeGRfYnVpbGRfbDJwX3RibChjaGlwLCB6b25lX25vKSAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCXJldHVybjsKKwl9CisKKwlpZiAoKHpvbmUtPnNldF9pbmRleCA+PSBYRF9GUkVFX1RBQkxFX0NOVCkKKwkgICAgfHwgKHpvbmUtPnNldF9pbmRleCA8IDApKSB7CisJCWZyZWVfem9uZSh6b25lKTsKKwkJUlRTNTFYX0RFQlVHUCgiU2V0IHVudXNlZCBibG9jayBmYWlsLCBpbnZhbGlkIHNldF9pbmRleFxuIik7CisJCXJldHVybjsKKwl9CisKKwlSVFM1MVhfREVCVUdQKCJTZXQgdW51c2VkIGJsb2NrIHRvIGluZGV4ICVkXG4iLCB6b25lLT5zZXRfaW5kZXgpOworCisJem9uZS0+ZnJlZV90YWJsZVt6b25lLT5zZXRfaW5kZXgrK10gPSAodTE2KSAocGh5X2JsayAmIDB4M2ZmKTsKKwlpZiAoem9uZS0+c2V0X2luZGV4ID49IFhEX0ZSRUVfVEFCTEVfQ05UKQorCQl6b25lLT5zZXRfaW5kZXggPSAwOworCXpvbmUtPnVudXNlZF9ibGtfY250Kys7Cit9CisKK3N0YXRpYyB1MzIgeGRfZ2V0X3VudXNlZF9ibG9jayhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIGludCB6b25lX25vKQoreworCXN0cnVjdCB4ZF9pbmZvICp4ZF9jYXJkID0gJihjaGlwLT54ZF9jYXJkKTsKKwlzdHJ1Y3Qgem9uZV9lbnRyeSAqem9uZTsKKwl1MzIgcGh5X2JsazsKKworCWlmICh6b25lX25vID49IHhkX2NhcmQtPnpvbmVfY250KSB7CisJCVJUUzUxWF9ERUJVR1AoIkdldCB1bnVzZWQgYmxvY2sgZnJvbSBpbnZhbGlkIHpvbmUiCisJCQkJCSIoem9uZV9ubyA9ICVkLCB6b25lX2NudCA9ICVkKVxuIiwKKwkJCQkJem9uZV9ubywgeGRfY2FyZC0+em9uZV9jbnQpOworCQlUUkFDRV9SRVQoY2hpcCwgQkxLX05PVF9GT1VORCk7CisJfQorCXpvbmUgPSAmKHhkX2NhcmQtPnpvbmVbem9uZV9ub10pOworCisJaWYgKCh6b25lLT51bnVzZWRfYmxrX2NudCA9PSAwKSB8fAorCQkJKHpvbmUtPnNldF9pbmRleCA9PSB6b25lLT5nZXRfaW5kZXgpKSB7CisJCWZyZWVfem9uZSh6b25lKTsKKwkJUlRTNTFYX0RFQlVHUCgiR2V0IHVudXNlZCBibG9jayBmYWlsLCIKKwkJCQkJIm5vIHVudXNlZCBibG9jayBhdmFpbGFibGVcbiIpOworCQlUUkFDRV9SRVQoY2hpcCwgQkxLX05PVF9GT1VORCk7CisJfQorCWlmICgoem9uZS0+Z2V0X2luZGV4ID49IFhEX0ZSRUVfVEFCTEVfQ05UKSB8fCAoem9uZS0+Z2V0X2luZGV4IDwgMCkpIHsKKwkJZnJlZV96b25lKHpvbmUpOworCQlSVFM1MVhfREVCVUdQKCJHZXQgdW51c2VkIGJsb2NrIGZhaWwsIGludmFsaWQgZ2V0X2luZGV4XG4iKTsKKwkJVFJBQ0VfUkVUKGNoaXAsIEJMS19OT1RfRk9VTkQpOworCX0KKworCVJUUzUxWF9ERUJVR1AoIkdldCB1bnVzZWQgYmxvY2sgZnJvbSBpbmRleCAlZFxuIiwgem9uZS0+Z2V0X2luZGV4KTsKKworCXBoeV9ibGsgPSB6b25lLT5mcmVlX3RhYmxlW3pvbmUtPmdldF9pbmRleF07CisJem9uZS0+ZnJlZV90YWJsZVt6b25lLT5nZXRfaW5kZXgrK10gPSAweEZGRkY7CisJaWYgKHpvbmUtPmdldF9pbmRleCA+PSBYRF9GUkVFX1RBQkxFX0NOVCkKKwkJem9uZS0+Z2V0X2luZGV4ID0gMDsKKwl6b25lLT51bnVzZWRfYmxrX2NudC0tOworCisJcGh5X2JsayArPSAoKHUzMikgKHpvbmVfbm8pIDw8IDEwKTsKKwlyZXR1cm4gcGh5X2JsazsKK30KKworc3RhdGljIHZvaWQgeGRfc2V0X2wycF90Ymwoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCBpbnQgem9uZV9ubywgdTE2IGxvZ19vZmYsCisJCQkgICB1MTYgcGh5X29mZikKK3sKKwlzdHJ1Y3QgeGRfaW5mbyAqeGRfY2FyZCA9ICYoY2hpcC0+eGRfY2FyZCk7CisJc3RydWN0IHpvbmVfZW50cnkgKnpvbmU7CisKKwl6b25lID0gJih4ZF9jYXJkLT56b25lW3pvbmVfbm9dKTsKKwl6b25lLT5sMnBfdGFibGVbbG9nX29mZl0gPSBwaHlfb2ZmOworfQorCitzdGF0aWMgdTMyIHhkX2dldF9sMnBfdGJsKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgaW50IHpvbmVfbm8sIHUxNiBsb2dfb2ZmKQoreworCXN0cnVjdCB4ZF9pbmZvICp4ZF9jYXJkID0gJihjaGlwLT54ZF9jYXJkKTsKKwlzdHJ1Y3Qgem9uZV9lbnRyeSAqem9uZTsKKwlpbnQgcmV0dmFsOworCisJem9uZSA9ICYoeGRfY2FyZC0+em9uZVt6b25lX25vXSk7CisJaWYgKHpvbmUtPmwycF90YWJsZVtsb2dfb2ZmXSA9PSAweEZGRkYpIHsKKwkJdTMyIHBoeV9ibGsgPSAwOworCQlpbnQgaTsKKworCQlyZXR2YWwgPSB4ZF9kZWxheV93cml0ZShjaGlwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJUlRTNTFYX0RFQlVHUCgiSW4geGRfZ2V0X2wycF90YmwsIgorCQkJCQkJImRlbGF5IHdyaXRlIGZhaWwhXG4iKTsKKwkJCVRSQUNFX1JFVChjaGlwLCBCTEtfTk9UX0ZPVU5EKTsKKwkJfQorCisJCWlmICh6b25lLT51bnVzZWRfYmxrX2NudCA8PSAwKSB7CisJCQlSVFM1MVhfREVCVUdQKCJObyB1bnVzZWQgYmxvY2shXG4iKTsKKwkJCVRSQUNFX1JFVChjaGlwLCBCTEtfTk9UX0ZPVU5EKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCB6b25lLT51bnVzZWRfYmxrX2NudDsgaSsrKSB7CisJCQlwaHlfYmxrID0geGRfZ2V0X3VudXNlZF9ibG9jayhjaGlwLCB6b25lX25vKTsKKwkJCWlmIChwaHlfYmxrID09IEJMS19OT1RfRk9VTkQpIHsKKwkJCQlSVFM1MVhfREVCVUdQKCJObyB1bnVzZWQgYmxvY2sgYXZhaWxhYmxlIVxuIik7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIEJMS19OT1RfRk9VTkQpOworCQkJfQorCisJCQlyZXR2YWwgPQorCQkJICAgIHhkX2luaXRfcGFnZShjaGlwLCBwaHlfYmxrLCBsb2dfb2ZmLCAwLAorCQkJCQkgeGRfY2FyZC0+cGFnZV9vZmYgKyAxKTsKKwkJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGkgPj0gem9uZS0+dW51c2VkX2Jsa19jbnQpIHsKKwkJCVJUUzUxWF9ERUJVR1AoIk5vIGdvb2QgdW51c2VkIGJsb2NrIGF2YWlsYWJsZSFcbiIpOworCQkJVFJBQ0VfUkVUKGNoaXAsIEJMS19OT1RfRk9VTkQpOworCQl9CisKKwkJeGRfc2V0X2wycF90YmwoY2hpcCwgem9uZV9ubywgbG9nX29mZiwgKHUxNikgKHBoeV9ibGsgJiAweDNGRikpOworCQlyZXR1cm4gcGh5X2JsazsKKwl9CisKKwlyZXR1cm4gKHUzMikgem9uZS0+bDJwX3RhYmxlW2xvZ19vZmZdICsgKCh1MzIpICh6b25lX25vKSA8PCAxMCk7Cit9CisKK2ludCByZXNldF94ZF9jYXJkKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3QgeGRfaW5mbyAqeGRfY2FyZCA9ICYoY2hpcC0+eGRfY2FyZCk7CisJaW50IHJldHZhbDsKKworCW1lbXNldCh4ZF9jYXJkLCAwLCBzaXplb2Yoc3RydWN0IHhkX2luZm8pKTsKKworCXhkX2NhcmQtPmJsb2NrX3NoaWZ0ID0gMDsKKwl4ZF9jYXJkLT5wYWdlX29mZiA9IDA7CisJeGRfY2FyZC0+YWRkcl9jeWNsZSA9IDA7CisJeGRfY2FyZC0+Y2FwYWNpdHkgPSAwOworCXhkX2NhcmQtPnpvbmVfY250ID0gMDsKKwl4ZF9jYXJkLT5jaXNfYmxvY2sgPSAweEZGRkY7CisJeGRfY2FyZC0+ZGVsYXlfd3JpdGUuZGVsYXlfd3JpdGVfZmxhZyA9IDA7CisKKwllbmFibGVfY2FyZF9jbG9jayhjaGlwLCBYRF9DQVJEKTsKKworCXJldHZhbCA9IHJlc2V0X3hkKGNoaXApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJaWYgKGNoaXAtPm9wdGlvbi5yZXNldF9vcl9yd19mYWlsX3NldF9wYWRfZHJpdmUpIHsKKwkJCXJ0czUxeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0RSSVZFX1NFTCwKKwkJCQkJICAgICAgU0QyMF9EUklWRV9NQVNLLCBEUklWRV84bUEpOworCQl9CisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKworCXJldHZhbCA9IHhkX2luaXRfbDJwX3RibChjaGlwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCB4ZF9tYXJrX2JhZF9ibG9jayhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIHUzMiBwaHlfYmxrKQoreworCXN0cnVjdCB4ZF9pbmZvICp4ZF9jYXJkID0gJihjaGlwLT54ZF9jYXJkKTsKKwlpbnQgcmV0dmFsOworCXUzMiBwYWdlX2FkZHI7CisJdTggcmVnID0gMDsKKworCVJUUzUxWF9ERUJVR1AoIm1hcmsgYmxvY2sgMHgleCBhcyBiYWQgYmxvY2tcbiIsIHBoeV9ibGspOworCisJaWYgKHBoeV9ibGsgPT0gQkxLX05PVF9GT1VORCkKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKworCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX1BBR0VfU1RBVFVTLCAweEZGLCBYRF9HUEcpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX0JMT0NLX1NUQVRVUywgMHhGRiwKKwkJICAgICAgIFhEX0xBVEVSX0JCTEspOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX0JMT0NLX0FERFIxX0gsIDB4RkYsIDB4RkYpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX0JMT0NLX0FERFIxX0wsIDB4RkYsIDB4RkYpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX0JMT0NLX0FERFIyX0gsIDB4RkYsIDB4RkYpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX0JMT0NLX0FERFIyX0wsIDB4RkYsIDB4RkYpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX1JFU0VSVkVEMCwgMHhGRiwgMHhGRik7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfUkVTRVJWRUQxLCAweEZGLCAweEZGKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9SRVNFUlZFRDIsIDB4RkYsIDB4RkYpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX1JFU0VSVkVEMywgMHhGRiwgMHhGRik7CisKKwlwYWdlX2FkZHIgPSBwaHlfYmxrIDw8IHhkX2NhcmQtPmJsb2NrX3NoaWZ0OworCisJeGRfYXNzaWduX3BoeV9hZGRyKGNoaXAsIHBhZ2VfYWRkciwgWERfUldfQUREUik7CisKKwkvKiBTcGVjaWZ5IHBhZ2UgY291bnQgKi8KKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9QQUdFX0NOVCwgMHhGRiwKKwkJICAgICAgIHhkX2NhcmQtPnBhZ2Vfb2ZmICsgMSk7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9UUkFOU0ZFUiwgMHhGRiwKKwkJICAgICAgIFhEX1RSQU5TRkVSX1NUQVJUIHwgWERfV1JJVEVfUkVEVU5EQU5UKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBDSEVDS19SRUdfQ01ELCBYRF9UUkFOU0ZFUiwgWERfVFJBTlNGRVJfRU5ELAorCQkgICAgICAgWERfVFJBTlNGRVJfRU5EKTsKKworCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0NSLCAxMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwlyZXR2YWwgPSBydHM1MXhfZ2V0X3JzcChjaGlwLCAxLCAxMDApOworCisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHM1MXhfY2xlYXJfeGRfZXJyb3IoY2hpcCk7CisJCXJ0czUxeF9lcDBfcmVhZF9yZWdpc3RlcihjaGlwLCBYRF9EQVQsICZyZWcpOworCQlpZiAocmVnICYgUFJPR1JBTV9FUlJPUikKKwkJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9QUkdfRVJST1IpOworCQllbHNlCisJCQl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfVE9fRVJST1IpOworCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCB4ZF9pbml0X3BhZ2Uoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1MzIgcGh5X2JsaywgdTE2IGxvZ29mZiwKKwkJCXU4IHN0YXJ0X3BhZ2UsIHU4IGVuZF9wYWdlKQoreworCXN0cnVjdCB4ZF9pbmZvICp4ZF9jYXJkID0gJihjaGlwLT54ZF9jYXJkKTsKKwlpbnQgcmV0dmFsOworCXUzMiBwYWdlX2FkZHI7CisJdTggcmVnID0gMDsKKworCVJUUzUxWF9ERUJVR1AoIkluaXQgYmxvY2sgMHgleFxuIiwgcGh5X2Jsayk7CisKKwlpZiAoc3RhcnRfcGFnZSA+IGVuZF9wYWdlKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChwaHlfYmxrID09IEJMS19OT1RfRk9VTkQpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwlydHM1MXhfaW5pdF9jbWQoY2hpcCk7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9QQUdFX1NUQVRVUywgMHhGRiwgMHhGRik7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfQkxPQ0tfU1RBVFVTLCAweEZGLCAweEZGKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9CTE9DS19BRERSMV9ILCAweEZGLAorCQkgICAgICAgKHU4KSAobG9nb2ZmID4+IDgpKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9CTE9DS19BRERSMV9MLCAweEZGLAorCQkgICAgICAgKHU4KSBsb2dvZmYpOworCisJcGFnZV9hZGRyID0gKHBoeV9ibGsgPDwgeGRfY2FyZC0+YmxvY2tfc2hpZnQpICsgc3RhcnRfcGFnZTsKKworCXhkX2Fzc2lnbl9waHlfYWRkcihjaGlwLCBwYWdlX2FkZHIsIFhEX1JXX0FERFIpOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfQ0ZHLCBYRF9CQV9UUkFOU0ZPUk0sCisJCSAgICAgICBYRF9CQV9UUkFOU0ZPUk0pOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfUEFHRV9DTlQsIDB4RkYsCisJCSAgICAgICAoZW5kX3BhZ2UgLSBzdGFydF9wYWdlKSk7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9UUkFOU0ZFUiwgMHhGRiwKKwkJICAgICAgIFhEX1RSQU5TRkVSX1NUQVJUIHwgWERfV1JJVEVfUkVEVU5EQU5UKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBDSEVDS19SRUdfQ01ELCBYRF9UUkFOU0ZFUiwgWERfVFJBTlNGRVJfRU5ELAorCQkgICAgICAgWERfVFJBTlNGRVJfRU5EKTsKKworCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0NSLCAxMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwlyZXR2YWwgPSBydHM1MXhfZ2V0X3JzcChjaGlwLCAxLCA1MDApOworCisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHM1MXhfY2xlYXJfeGRfZXJyb3IoY2hpcCk7CisJCXJ0czUxeF9lcDBfcmVhZF9yZWdpc3RlcihjaGlwLCBYRF9EQVQsICZyZWcpOworCQlpZiAocmVnICYgUFJPR1JBTV9FUlJPUikgeworCQkJeGRfbWFya19iYWRfYmxvY2soY2hpcCwgcGh5X2Jsayk7CisJCQl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfUFJHX0VSUk9SKTsKKwkJfSBlbHNlIHsKKwkJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9UT19FUlJPUik7CisJCX0KKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwl9CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgeGRfY29weV9wYWdlKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwKKwkJCXUzMiBvbGRfYmxrLCB1MzIgbmV3X2JsaywgdTggc3RhcnRfcGFnZSwgdTggZW5kX3BhZ2UpCit7CisJc3RydWN0IHhkX2luZm8gKnhkX2NhcmQgPSAmKGNoaXAtPnhkX2NhcmQpOworCXUzMiBvbGRfcGFnZSwgbmV3X3BhZ2U7CisJdTggaSwgcmVnID0gMDsKKwlpbnQgcmV0dmFsOworCisJUlRTNTFYX0RFQlVHUCgiQ29weSBwYWdlIGZyb20gYmxvY2sgMHgleCB0byBibG9jayAweCV4XG4iLCBvbGRfYmxrLAorCQkgICAgICAgbmV3X2Jsayk7CisKKwlpZiAoc3RhcnRfcGFnZSA+IGVuZF9wYWdlKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJaWYgKChvbGRfYmxrID09IEJMS19OT1RfRk9VTkQpIHx8IChuZXdfYmxrID09IEJMS19OT1RfRk9VTkQpKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJb2xkX3BhZ2UgPSAob2xkX2JsayA8PCB4ZF9jYXJkLT5ibG9ja19zaGlmdCkgKyBzdGFydF9wYWdlOworCW5ld19wYWdlID0gKG5ld19ibGsgPDwgeGRfY2FyZC0+YmxvY2tfc2hpZnQpICsgc3RhcnRfcGFnZTsKKworCVhEX0NMUl9CQURfTkVXQkxLKHhkX2NhcmQpOworCisJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX0RBVEFfU09VUkNFLCAweDAxLCBQSU5HUE9OR19CVUZGRVIpOworCisJZm9yIChpID0gc3RhcnRfcGFnZTsgaSA8IGVuZF9wYWdlOyBpKyspIHsKKwkJaWYgKG1vbml0b3JfY2FyZF9jZChjaGlwLCBYRF9DQVJEKSA9PSBDRF9OT1RfRVhJU1QpIHsKKwkJCVJUUzUxWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9TVE9QLCBYRF9TVE9QIHwgWERfQ0xSX0VSUiwKKwkJCQkJIFhEX1NUT1AgfCBYRF9DTFJfRVJSKTsKKwkJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9OT19DQVJEKTsKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCX0KKworCQlydHM1MXhfaW5pdF9jbWQoY2hpcCk7CisKKwkJeGRfYXNzaWduX3BoeV9hZGRyKGNoaXAsIG9sZF9wYWdlLCBYRF9SV19BRERSKTsKKworCQkvKiBTaW5nbGUgcGFnZSByZWFkICovCisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX1BBR0VfQ05ULCAweEZGLCAxKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfQ0hLX0RBVEFfU1RBVFVTLAorCQkJICAgICAgIFhEX0FVVE9fQ0hLX0RBVEFfU1RBVFVTLCAwKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfVFJBTlNGRVIsIDB4RkYsCisJCQkgICAgICAgWERfVFJBTlNGRVJfU1RBUlQgfCBYRF9SRUFEX1BBR0VTKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgQ0hFQ0tfUkVHX0NNRCwgWERfVFJBTlNGRVIsCisJCQkgICAgICAgWERfVFJBTlNGRVJfRU5ELCBYRF9UUkFOU0ZFUl9FTkQpOworCisJCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0NSIHwgU1RBR0VfWERfU1RBVFVTLCAxMDApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwkJcmV0dmFsID0gcnRzNTF4X2dldF9yc3AoY2hpcCwgNCwgNTAwKTsKKwkJaWYgKChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHx8CisJCSAgICAoY2hpcC0+cnNwX2J1ZlsyXSAmIChYRF9FQ0MxX0VSUk9SIHwgWERfRUNDMl9FUlJPUikpKSB7CisJCQlydHM1MXhfY2xlYXJfeGRfZXJyb3IoY2hpcCk7CisJCQlyZWcgPSAwOworCQkJcnRzNTF4X2VwMF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFhEX0NUTCwgJnJlZyk7CisJCQlpZiAocmVnICYgKFhEX0VDQzFfRVJST1IgfCBYRF9FQ0MyX0VSUk9SKSkgeworCQkJCXdhaXRfdGltZW91dCgxMDApOworCisJCQkJaWYgKG1vbml0b3JfY2FyZF9jZChjaGlwLCBYRF9DQVJEKSA9PQorCQkJCSAgICBDRF9OT1RfRVhJU1QpIHsKKwkJCQkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX05PX0NBUkQpOworCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCX0KKworCQkJCWlmICgoKHJlZyAmCisJCQkJICAgICAgKFhEX0VDQzFfRVJST1IgfCBYRF9FQ0MxX1VOQ09SUkVDVEFCTEUpKQorCQkJCSAgICAgPT0gKFhEX0VDQzFfRVJST1IgfCBYRF9FQ0MxX1VOQ09SUkVDVEFCTEUpKQorCQkJCSAgICB8fCAoKHJlZyAmIChYRF9FQ0MyX0VSUk9SIHwKKwkJCQkJWERfRUNDMl9VTkNPUlJFQ1RBQkxFKSkgPT0KKwkJCQkgICAgIChYRF9FQ0MyX0VSUk9SIHwgWERfRUNDMl9VTkNPUlJFQ1RBQkxFKSkpIHsKKwkJCQkJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBYRF9QQUdFX1NUQVRVUywKKwkJCQkJCQkgMHhGRiwgWERfQlBHKTsKKwkJCQkJUlRTNTFYX1dSSVRFX1JFRyhjaGlwLCBYRF9CTE9DS19TVEFUVVMsCisJCQkJCQkJIDB4RkYsIFhEX0dCTEspOworCQkJCQlYRF9TRVRfQkFEX09MREJMSyh4ZF9jYXJkKTsKKwkJCQkJUlRTNTFYX0RFQlVHUCgib2xkIGJsb2NrIDB4JXgiCisJCQkJCQkiZWNjIGVycm9yXG4iLCBvbGRfYmxrKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9UT19FUlJPUik7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCX0KKwkJfQorCQlpZiAoWERfQ0hLX0JBRF9PTERCTEsoeGRfY2FyZCkpCisJCQlydHM1MXhfY2xlYXJfeGRfZXJyb3IoY2hpcCk7CisKKwkJcnRzNTF4X2luaXRfY21kKGNoaXApOworCisJCXhkX2Fzc2lnbl9waHlfYWRkcihjaGlwLCBuZXdfcGFnZSwgWERfUldfQUREUik7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX1BBR0VfQ05ULCAweEZGLCAxKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfVFJBTlNGRVIsIDB4RkYsCisJCQkgICAgICAgWERfVFJBTlNGRVJfU1RBUlQgfCBYRF9XUklURV9QQUdFUyk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIENIRUNLX1JFR19DTUQsIFhEX1RSQU5TRkVSLAorCQkJICAgICAgIFhEX1RSQU5TRkVSX0VORCwgWERfVFJBTlNGRVJfRU5EKTsKKworCQlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DUiwgMTAwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJCXJldHZhbCA9IHJ0czUxeF9nZXRfcnNwKGNoaXAsIDEsIDMwMCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0czUxeF9jbGVhcl94ZF9lcnJvcihjaGlwKTsKKwkJCXJlZyA9IDA7CisJCQlydHM1MXhfZXAwX3JlYWRfcmVnaXN0ZXIoY2hpcCwgWERfREFULCAmcmVnKTsKKwkJCWlmIChyZWcgJiBQUk9HUkFNX0VSUk9SKSB7CisJCQkJeGRfbWFya19iYWRfYmxvY2soY2hpcCwgbmV3X2Jsayk7CisJCQkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX1BSR19FUlJPUik7CisJCQkJWERfU0VUX0JBRF9ORVdCTEsoeGRfY2FyZCk7CisJCQl9IGVsc2UgeworCQkJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9UT19FUlJPUik7CisJCQl9CisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkJfQorCisJCW9sZF9wYWdlKys7CisJCW5ld19wYWdlKys7CisJfQorCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCisjaWZkZWYgWERfU1BFRURVUAorc3RhdGljIGludCB4ZF9hdXRvX2NvcHlfcGFnZShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsCisJCQkgICAgIHUzMiBvbGRfYmxrLCB1MzIgbmV3X2JsaywKKwkJCSAgICAgdTggc3RhcnRfcGFnZSwgdTggZW5kX3BhZ2UpCit7CisJc3RydWN0IHhkX2luZm8gKnhkX2NhcmQgPSAmKGNoaXAtPnhkX2NhcmQpOworCXUzMiBvbGRfcGFnZSwgbmV3X3BhZ2U7CisJaW50IHJldHZhbDsKKwl1OCBwYWdlX2NvdW50OworCisJUlRTNTFYX0RFQlVHUCgiQXV0byBjb3B5IHBhZ2UgZnJvbSBibG9jayAweCV4IHRvIGJsb2NrIDB4JXhcbiIsCisJCSAgICAgICBvbGRfYmxrLCBuZXdfYmxrKTsKKworCWlmIChzdGFydF9wYWdlID4gZW5kX3BhZ2UpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwlwYWdlX2NvdW50ID0gZW5kX3BhZ2UgLSBzdGFydF9wYWdlOworCisJaWYgKChvbGRfYmxrID09IEJMS19OT1RfRk9VTkQpIHx8IChuZXdfYmxrID09IEJMS19OT1RfRk9VTkQpKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJb2xkX3BhZ2UgPSAob2xkX2JsayA8PCB4ZF9jYXJkLT5ibG9ja19zaGlmdCkgKyBzdGFydF9wYWdlOworCW5ld19wYWdlID0gKG5ld19ibGsgPDwgeGRfY2FyZC0+YmxvY2tfc2hpZnQpICsgc3RhcnRfcGFnZTsKKworCVhEX0NMUl9CQURfTkVXQkxLKHhkX2NhcmQpOworCisJcnRzNTF4X2luaXRfY21kKGNoaXApOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfQ1BfV0FJVFRJTUUsIDB4MDMsIFdBSVRfRkYpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX0NQX1BBR0VMRU4sIDB4RkYsIHBhZ2VfY291bnQpOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfQ1BfUkVBREFERFIwLCAweEZGLCAwKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9DUF9SRUFEQUREUjEsIDB4RkYsCisJCSAgICAgICAodTgpIG9sZF9wYWdlKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9DUF9SRUFEQUREUjIsIDB4RkYsCisJCSAgICAgICAodTgpIChvbGRfcGFnZSA+PiA4KSk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfQ1BfUkVBREFERFIzLCAweEZGLAorCQkgICAgICAgKHU4KSAob2xkX3BhZ2UgPj4gMTYpKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9DUF9SRUFEQUREUjQsIDB4RkYsIDApOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfQ1BfV1JJVEVBRERSMCwgMHhGRiwgMCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfQ1BfV1JJVEVBRERSMSwgMHhGRiwKKwkJICAgICAgICh1OCkgbmV3X3BhZ2UpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX0NQX1dSSVRFQUREUjIsIDB4RkYsCisJCSAgICAgICAodTgpIChuZXdfcGFnZSA+PiA4KSk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfQ1BfV1JJVEVBRERSMywgMHhGRiwKKwkJICAgICAgICh1OCkgKG5ld19wYWdlID4+IDE2KSk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfQ1BfV1JJVEVBRERSNCwgMHhGRiwgMCk7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX0RBVEFfU09VUkNFLCAweDAxLAorCQkgICAgICAgUElOR1BPTkdfQlVGRkVSKTsKKworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX0NGRywKKwkJICAgICAgIFhEX0JBX1RSQU5TRk9STSB8IFhEX0FERFJfTUFTSywgMCB8IHhkX2NhcmQtPmFkZHJfY3ljbGUpOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfQ0hLX0RBVEFfU1RBVFVTLAorCQkgICAgICAgWERfQVVUT19DSEtfREFUQV9TVEFUVVMsIDApOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX1RSQU5TRkVSLCAweEZGLAorCQkgICAgICAgWERfVFJBTlNGRVJfU1RBUlQgfCBYRF9DT1BZX1BBR0VTKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBDSEVDS19SRUdfQ01ELCBYRF9UUkFOU0ZFUiwgWERfVFJBTlNGRVJfRU5ELAorCQkgICAgICAgWERfVFJBTlNGRVJfRU5EKTsKKworCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0NSLCAxMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzNTF4X2NsZWFyX3hkX2Vycm9yKGNoaXApOworCQlUUkFDRV9HT1RPKGNoaXAsIENvcHlfRmFpbCk7CisJfQorCisJcmV0dmFsID0gcnRzNTF4X2dldF9yc3AoY2hpcCwgMSwgODAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0czUxeF9jbGVhcl94ZF9lcnJvcihjaGlwKTsKKwkJVFJBQ0VfR09UTyhjaGlwLCBDb3B5X0ZhaWwpOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKKworQ29weV9GYWlsOgorCXJldHZhbCA9IHhkX2NvcHlfcGFnZShjaGlwLCBvbGRfYmxrLCBuZXdfYmxrLCBzdGFydF9wYWdlLCBlbmRfcGFnZSk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworc3RhdGljIGludCB4ZF9yZXNldF9jbWQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCWludCByZXR2YWw7CisJdTggeGRfZGF0LCB4ZF9jdGw7CisKKwlydHM1MXhfaW5pdF9jbWQoY2hpcCk7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9UUkFOU0ZFUiwgMHhGRiwKKwkJICAgICAgIFhEX1RSQU5TRkVSX1NUQVJUIHwgWERfUkVTRVQpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIENIRUNLX1JFR19DTUQsIFhEX1RSQU5TRkVSLCBYRF9UUkFOU0ZFUl9FTkQsCisJCSAgICAgICBYRF9UUkFOU0ZFUl9FTkQpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgWERfREFULCAwLCAwKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIFhEX0NUTCwgMCwgMCk7CisKKwlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DUiwgMTAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHZhbCA9IHJ0czUxeF9nZXRfcnNwKGNoaXAsIDMsIDEwMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHM1MXhfY2xlYXJfeGRfZXJyb3IoY2hpcCk7CisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKworCXhkX2RhdCA9IGNoaXAtPnJzcF9idWZbMV07CisJeGRfY3RsID0gY2hpcC0+cnNwX2J1ZlsyXTsKKwlpZiAoKCh4ZF9kYXQgJiBSRUFEWV9GTEFHKSA9PSBSRUFEWV9TVEFURSkgJiYgKHhkX2N0bCAmIFhEX1JEWSkpCisJCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKKworCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7Cit9CisKK3N0YXRpYyBpbnQgeGRfZXJhc2VfYmxvY2soc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1MzIgcGh5X2JsaykKK3sKKwlzdHJ1Y3QgeGRfaW5mbyAqeGRfY2FyZCA9ICYoY2hpcC0+eGRfY2FyZCk7CisJdTMyIHBhZ2VfYWRkcjsKKwl1OCByZWcgPSAwLCB4ZF9kYXQ7CisJaW50IGksIHJldHZhbDsKKworCWlmIChwaHlfYmxrID09IEJMS19OT1RfRk9VTkQpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwlwYWdlX2FkZHIgPSBwaHlfYmxrIDw8IHhkX2NhcmQtPmJsb2NrX3NoaWZ0OworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlydHM1MXhfaW5pdF9jbWQoY2hpcCk7CisKKwkJeGRfYXNzaWduX3BoeV9hZGRyKGNoaXAsIHBhZ2VfYWRkciwgWERfRVJBU0VfQUREUik7CisKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfVFJBTlNGRVIsIDB4RkYsCisJCQkgICAgICAgWERfVFJBTlNGRVJfU1RBUlQgfCBYRF9FUkFTRSk7CisJCXJ0czUxeF9hZGRfY21kKGNoaXAsIENIRUNLX1JFR19DTUQsIFhEX1RSQU5TRkVSLAorCQkJICAgICAgIFhEX1RSQU5TRkVSX0VORCwgWERfVFJBTlNGRVJfRU5EKTsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCBYRF9EQVQsIDAsIDApOworCisJCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0NSLCAxMDApOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwkJcmV0dmFsID0gcnRzNTF4X2dldF9yc3AoY2hpcCwgMiwgMzAwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzNTF4X2NsZWFyX3hkX2Vycm9yKGNoaXApOworCQkJcnRzNTF4X2VwMF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFhEX0RBVCwgJnJlZyk7CisJCQlpZiAocmVnICYgUFJPR1JBTV9FUlJPUikgeworCQkJCXhkX21hcmtfYmFkX2Jsb2NrKGNoaXAsIHBoeV9ibGspOworCQkJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9QUkdfRVJST1IpOworCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQl9IGVsc2UgeworCQkJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9FUkFTRV9GQUlMKTsKKwkJCX0KKwkJCXJldHZhbCA9IHhkX3Jlc2V0X2NtZChjaGlwKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCQljb250aW51ZTsKKwkJfQorCQl4ZF9kYXQgPSBjaGlwLT5yc3BfYnVmWzFdOworCQlpZiAoeGRfZGF0ICYgUFJPR1JBTV9FUlJPUikgeworCQkJeGRfbWFya19iYWRfYmxvY2soY2hpcCwgcGh5X2Jsayk7CisJCQl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfUFJHX0VSUk9SKTsKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCX0KKworCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CisJfQorCisJeGRfbWFya19iYWRfYmxvY2soY2hpcCwgcGh5X2Jsayk7CisJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX0VSQVNFX0ZBSUwpOworCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7Cit9CisKK3N0YXRpYyBpbnQgeGRfYnVpbGRfbDJwX3RibChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsIGludCB6b25lX25vKQoreworCXN0cnVjdCB4ZF9pbmZvICp4ZF9jYXJkID0gJihjaGlwLT54ZF9jYXJkKTsKKwlzdHJ1Y3Qgem9uZV9lbnRyeSAqem9uZTsKKwlpbnQgcmV0dmFsOworCXUzMiBzdGFydCwgZW5kLCBpOworCXUxNiBtYXhfbG9nb2ZmLCBjdXJfZnN0X3BhZ2VfbG9nb2ZmLCBjdXJfbHN0X3BhZ2VfbG9nb2ZmLAorCSAgICBlbnRfbHN0X3BhZ2VfbG9nb2ZmOworCXU4IHJlZHVudFsxMV07CisKKwlSVFM1MVhfREVCVUdQKCJ4ZF9idWlsZF9sMnBfdGJsOiAlZFxuIiwgem9uZV9ubyk7CisKKwlpZiAoeGRfY2FyZC0+em9uZSA9PSBOVUxMKSB7CisJCXJldHZhbCA9IHhkX2luaXRfbDJwX3RibChjaGlwKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKworCWlmICh4ZF9jYXJkLT56b25lW3pvbmVfbm9dLmJ1aWxkX2ZsYWcpIHsKKwkJUlRTNTFYX0RFQlVHUCgibDJwIHRhYmxlIG9mIHpvbmUgJWQgaGFzIGJlZW4gYnVpbHRcbiIsCisJCQkgICAgICAgem9uZV9ubyk7CisJCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKKwl9CisKKwl6b25lID0gJih4ZF9jYXJkLT56b25lW3pvbmVfbm9dKTsKKworCWlmICh6b25lLT5sMnBfdGFibGUgPT0gTlVMTCkgeworCQl6b25lLT5sMnBfdGFibGUgPSB2bWFsbG9jKDIwMDApOworCQlpZiAoem9uZS0+bDJwX3RhYmxlID09IE5VTEwpCisJCQlUUkFDRV9HT1RPKGNoaXAsIEJ1aWxkX0ZhaWwpOworCX0KKwltZW1zZXQoKHU4ICopICh6b25lLT5sMnBfdGFibGUpLCAweGZmLCAyMDAwKTsKKworCWlmICh6b25lLT5mcmVlX3RhYmxlID09IE5VTEwpIHsKKwkJem9uZS0+ZnJlZV90YWJsZSA9IHZtYWxsb2MoWERfRlJFRV9UQUJMRV9DTlQgKiAyKTsKKwkJaWYgKHpvbmUtPmZyZWVfdGFibGUgPT0gTlVMTCkKKwkJCVRSQUNFX0dPVE8oY2hpcCwgQnVpbGRfRmFpbCk7CisJfQorCW1lbXNldCgodTggKikgKHpvbmUtPmZyZWVfdGFibGUpLCAweGZmLCBYRF9GUkVFX1RBQkxFX0NOVCAqIDIpOworCisJaWYgKHpvbmVfbm8gPT0gMCkgeworCQlpZiAoeGRfY2FyZC0+Y2lzX2Jsb2NrID09IDB4RkZGRikKKwkJCXN0YXJ0ID0gMDsKKwkJZWxzZQorCQkJc3RhcnQgPSB4ZF9jYXJkLT5jaXNfYmxvY2sgKyAxOworCQlpZiAoWERfQ0hLXzRNQih4ZF9jYXJkKSkgeworCQkJZW5kID0gMHgyMDA7CisJCQltYXhfbG9nb2ZmID0gNDk5OworCQl9IGVsc2UgeworCQkJZW5kID0gMHg0MDA7CisJCQltYXhfbG9nb2ZmID0gOTk5OworCQl9CisJfSBlbHNlIHsKKwkJc3RhcnQgPSAodTMyKSAoem9uZV9ubykgPDwgMTA7CisJCWVuZCA9ICh1MzIpICh6b25lX25vICsgMSkgPDwgMTA7CisJCW1heF9sb2dvZmYgPSA5OTk7CisJfQorCisJUlRTNTFYX0RFQlVHUCgic3RhcnQgYmxvY2sgMHgleCwgZW5kIGJsb2NrIDB4JXhcbiIsIHN0YXJ0LCBlbmQpOworCisJem9uZS0+c2V0X2luZGV4ID0gem9uZS0+Z2V0X2luZGV4ID0gMDsKKwl6b25lLT51bnVzZWRfYmxrX2NudCA9IDA7CisKKwlmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CisJCXUzMiBwYWdlX2FkZHIgPSBpIDw8IHhkX2NhcmQtPmJsb2NrX3NoaWZ0OworCQl1MzIgcGh5X2Jsb2NrOworCisJCXJldHZhbCA9IHhkX3JlYWRfcmVkdW5kYW50KGNoaXAsIHBhZ2VfYWRkciwgcmVkdW50LCAxMSk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQljb250aW51ZTsKKworCQlpZiAocmVkdW50W0JMT0NLX1NUQVRVU10gIT0gMHhGRikgeworCQkJUlRTNTFYX0RFQlVHUCgiYmFkIGJsb2NrXG4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHhkX2NoZWNrX2RhdGFfYmxhbmsocmVkdW50KSkgeworCQkJUlRTNTFYX0RFQlVHUCgiYmxhbmsgYmxvY2tcbiIpOworCQkJeGRfc2V0X3VudXNlZF9ibG9jayhjaGlwLCBpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJY3VyX2ZzdF9wYWdlX2xvZ29mZiA9IHhkX2xvYWRfbG9nX2Jsb2NrX2FkZHIocmVkdW50KTsKKwkJaWYgKChjdXJfZnN0X3BhZ2VfbG9nb2ZmID09IDB4RkZGRikKKwkJICAgIHx8IChjdXJfZnN0X3BhZ2VfbG9nb2ZmID4gbWF4X2xvZ29mZikpIHsKKwkJCXJldHZhbCA9IHhkX2VyYXNlX2Jsb2NrKGNoaXAsIGkpOworCQkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKKwkJCQl4ZF9zZXRfdW51c2VkX2Jsb2NrKGNoaXAsIGkpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCh6b25lX25vID09IDApICYmIChjdXJfZnN0X3BhZ2VfbG9nb2ZmID09IDApCisJCSAgICAmJiAocmVkdW50W1BBR0VfU1RBVFVTXSAhPSBYRF9HUEcpKQorCQkJWERfU0VUX01CUl9GQUlMKHhkX2NhcmQpOworCisJCWlmICh6b25lLT5sMnBfdGFibGVbY3VyX2ZzdF9wYWdlX2xvZ29mZl0gPT0gMHhGRkZGKSB7CisJCQl6b25lLT5sMnBfdGFibGVbY3VyX2ZzdF9wYWdlX2xvZ29mZl0gPQorCQkJICAgICh1MTYpIChpICYgMHgzRkYpOworCQkJY29udGludWU7CisJCX0KKworCQlwaHlfYmxvY2sgPQorCQkgICAgem9uZS0+bDJwX3RhYmxlW2N1cl9mc3RfcGFnZV9sb2dvZmZdICsKKwkJICAgICgodTMyKSAoKHpvbmVfbm8pIDw8IDEwKSk7CisKKwkJcGFnZV9hZGRyID0gKChpICsgMSkgPDwgeGRfY2FyZC0+YmxvY2tfc2hpZnQpIC0gMTsKKworCQlyZXR2YWwgPSB4ZF9yZWFkX3JlZHVuZGFudChjaGlwLCBwYWdlX2FkZHIsIHJlZHVudCwgMTEpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJY29udGludWU7CisKKwkJY3VyX2xzdF9wYWdlX2xvZ29mZiA9IHhkX2xvYWRfbG9nX2Jsb2NrX2FkZHIocmVkdW50KTsKKwkJaWYgKGN1cl9sc3RfcGFnZV9sb2dvZmYgPT0gY3VyX2ZzdF9wYWdlX2xvZ29mZikgeworCQkJaW50IG07CisKKwkJCXBhZ2VfYWRkciA9CisJCQkgICAgKChwaHlfYmxvY2sgKyAxKSA8PCB4ZF9jYXJkLT5ibG9ja19zaGlmdCkgLSAxOworCisJCQlmb3IgKG0gPSAwOyBtIDwgMzsgbSsrKSB7CisJCQkJcmV0dmFsID0KKwkJCQkgICAgeGRfcmVhZF9yZWR1bmRhbnQoY2hpcCwgcGFnZV9hZGRyLCByZWR1bnQsCisJCQkJCQkgICAgICAxMSk7CisJCQkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChtID09IDMpIHsKKwkJCQl6b25lLT5sMnBfdGFibGVbY3VyX2ZzdF9wYWdlX2xvZ29mZl0gPQorCQkJCSAgICAodTE2KSAoaSAmIDB4M0ZGKTsKKwkJCQlyZXR2YWwgPSB4ZF9lcmFzZV9ibG9jayhjaGlwLCBwaHlfYmxvY2spOworCQkJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJCXhkX3NldF91bnVzZWRfYmxvY2soY2hpcCwgcGh5X2Jsb2NrKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZW50X2xzdF9wYWdlX2xvZ29mZiA9IHhkX2xvYWRfbG9nX2Jsb2NrX2FkZHIocmVkdW50KTsKKwkJCWlmIChlbnRfbHN0X3BhZ2VfbG9nb2ZmICE9IGN1cl9mc3RfcGFnZV9sb2dvZmYpIHsKKwkJCQl6b25lLT5sMnBfdGFibGVbY3VyX2ZzdF9wYWdlX2xvZ29mZl0gPQorCQkJCSAgICAodTE2KSAoaSAmIDB4M0ZGKTsKKwkJCQlyZXR2YWwgPSB4ZF9lcmFzZV9ibG9jayhjaGlwLCBwaHlfYmxvY2spOworCQkJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJCXhkX3NldF91bnVzZWRfYmxvY2soY2hpcCwgcGh5X2Jsb2NrKTsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJcmV0dmFsID0geGRfZXJhc2VfYmxvY2soY2hpcCwgaSk7CisJCQkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKKwkJCQkJeGRfc2V0X3VudXNlZF9ibG9jayhjaGlwLCBpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldHZhbCA9IHhkX2VyYXNlX2Jsb2NrKGNoaXAsIGkpOworCQkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKKwkJCQl4ZF9zZXRfdW51c2VkX2Jsb2NrKGNoaXAsIGkpOworCQl9CisJfQorCisJaWYgKFhEX0NIS180TUIoeGRfY2FyZCkpCisJCWVuZCA9IDUwMDsKKwllbHNlCisJCWVuZCA9IDEwMDA7CisKKwlpID0gMDsKKwlmb3IgKHN0YXJ0ID0gMDsgc3RhcnQgPCBlbmQ7IHN0YXJ0KyspIHsKKwkJaWYgKHpvbmUtPmwycF90YWJsZVtzdGFydF0gPT0gMHhGRkZGKQorCQkJaSsrOworCX0KKworCVJUUzUxWF9ERUJVR1AoIkJsb2NrIGNvdW50ICVkLCBpbnZhbGlkIEwyUCBlbnRyeSAlZFxuIiwgZW5kLCBpKTsKKwlSVFM1MVhfREVCVUdQKCJUb3RhbCB1bnVzZWQgYmxvY2s6ICVkXG4iLCB6b25lLT51bnVzZWRfYmxrX2NudCk7CisKKwlpZiAoKHpvbmUtPnVudXNlZF9ibGtfY250IC0gaSkgPCAxKQorCQljaGlwLT5jYXJkX3dwIHw9IFhEX0NBUkQ7CisKKwl6b25lLT5idWlsZF9mbGFnID0gMTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKKworQnVpbGRfRmFpbDoKKwlpZiAoem9uZS0+bDJwX3RhYmxlKSB7CisJCXZmcmVlKHpvbmUtPmwycF90YWJsZSk7CisJCXpvbmUtPmwycF90YWJsZSA9IE5VTEw7CisJfQorCWlmICh6b25lLT5mcmVlX3RhYmxlKSB7CisJCXZmcmVlKHpvbmUtPmZyZWVfdGFibGUpOworCQl6b25lLT5mcmVlX3RhYmxlID0gTlVMTDsKKwl9CisKKwlyZXR1cm4gU1RBVFVTX0ZBSUw7Cit9CisKK3N0YXRpYyBpbnQgeGRfc2VuZF9jbWQoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLCB1OCBjbWQpCit7CisJaW50IHJldHZhbDsKKworCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX0RBVCwgMHhGRiwgY21kKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9UUkFOU0ZFUiwgMHhGRiwKKwkJICAgICAgIFhEX1RSQU5TRkVSX1NUQVJUIHwgWERfU0VUX0NNRCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgQ0hFQ0tfUkVHX0NNRCwgWERfVFJBTlNGRVIsIFhEX1RSQU5TRkVSX0VORCwKKwkJICAgICAgIFhEX1RSQU5TRkVSX0VORCk7CisKKwlyZXR2YWwgPSBydHM1MXhfc2VuZF9jbWQoY2hpcCwgTU9ERV9DUiwgMTAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHZhbCA9IHJ0czUxeF9nZXRfcnNwKGNoaXAsIDEsIDIwMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHM1MXhfY2xlYXJfeGRfZXJyb3IoY2hpcCk7CisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCX0KKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCB4ZF9yZWFkX211bHRpcGxlX3BhZ2VzKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTMyIHBoeV9ibGssCisJCQkJICB1MzIgbG9nX2JsaywgdTggc3RhcnRfcGFnZSwgdTggZW5kX3BhZ2UsCisJCQkJICB1OCAqYnVmLCB2b2lkICoqcHRyLCB1bnNpZ25lZCBpbnQgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgeGRfaW5mbyAqeGRfY2FyZCA9ICYoY2hpcC0+eGRfY2FyZCk7CisJdTMyIHBhZ2VfYWRkciwgbmV3X2JsazsKKwl1MTYgbG9nX29mZjsKKwl1OCByZWdfdmFsLCBwYWdlX2NudDsKKwlpbnQgem9uZV9ubywgcmV0dmFsLCBpOworCisJaWYgKHN0YXJ0X3BhZ2UgPiBlbmRfcGFnZSkKKwkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKworCXBhZ2VfY250ID0gZW5kX3BhZ2UgLSBzdGFydF9wYWdlOworCXpvbmVfbm8gPSAoaW50KShsb2dfYmxrIC8gMTAwMCk7CisJbG9nX29mZiA9ICh1MTYpIChsb2dfYmxrICUgMTAwMCk7CisKKwlpZiAoKHBoeV9ibGsgJiAweDNGRikgPT0gMHgzRkYpIHsKKwkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCQlwYWdlX2FkZHIgPSAoKHUzMikgaSkgPDwgeGRfY2FyZC0+YmxvY2tfc2hpZnQ7CisKKwkJCXJldHZhbCA9IHhkX3JlYWRfcmVkdW5kYW50KGNoaXAsIHBhZ2VfYWRkciwgTlVMTCwgMCk7CisJCQlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKQorCQkJCWJyZWFrOworCisJCQlpZiAobW9uaXRvcl9jYXJkX2NkKGNoaXAsIFhEX0NBUkQpID09IENEX05PVF9FWElTVCkgeworCQkJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9OT19DQVJEKTsKKwkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJfQorCQl9CisJfQorCisJcGFnZV9hZGRyID0gKHBoeV9ibGsgPDwgeGRfY2FyZC0+YmxvY2tfc2hpZnQpICsgc3RhcnRfcGFnZTsKKworCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCXhkX2Fzc2lnbl9waHlfYWRkcihjaGlwLCBwYWdlX2FkZHIsIFhEX1JXX0FERFIpOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfQ0ZHLCBYRF9QUEJfVE9fU0lFLAorCQkgICAgICAgWERfUFBCX1RPX1NJRSk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9EQVRBX1NPVVJDRSwgMHgwMSwKKwkJICAgICAgIFJJTkdfQlVGRkVSKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9QQUdFX0NOVCwgMHhGRiwgcGFnZV9jbnQpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX0NIS19EQVRBX1NUQVRVUywKKwkJICAgICAgIFhEX0FVVE9fQ0hLX0RBVEFfU1RBVFVTLCBYRF9BVVRPX0NIS19EQVRBX1NUQVRVUyk7CisKKwl0cmFuc19kbWFfZW5hYmxlKGNoaXAtPnNyYi0+c2NfZGF0YV9kaXJlY3Rpb24sIGNoaXAsIHBhZ2VfY250ICogNTEyLAorCQkJIERNQV81MTIpOworCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfVFJBTlNGRVIsIDB4RkYsCisJCSAgICAgICBYRF9UUkFOU0ZFUl9TVEFSVCB8IFhEX1JFQURfUEFHRVMpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIENIRUNLX1JFR19DTUQsIFhEX1RSQU5TRkVSLAorCQkgICAgICAgWERfVFJBTlNGRVJfRU5EIHwgWERfUFBCX0VNUFRZLAorCQkgICAgICAgWERfVFJBTlNGRVJfRU5EIHwgWERfUFBCX0VNUFRZKTsKKworCXJldHZhbCA9IHJ0czUxeF9zZW5kX2NtZChjaGlwLCBNT0RFX0NESVIsIDEwMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlyZXR2YWwgPQorCSAgICBydHM1MXhfdHJhbnNmZXJfZGF0YV9wYXJ0aWFsKGNoaXAsIFJDVl9CVUxLX1BJUEUoY2hpcCksICh2b2lkICopYnVmLAorCQkJCQkgcHRyLCBvZmZzZXQsIHBhZ2VfY250ICogNTEyLAorCQkJCQkgc2NzaV9zZ19jb3VudChjaGlwLT5zcmIpLCBOVUxMLCAyMDAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0czUxeF9jbGVhcl94ZF9lcnJvcihjaGlwKTsKKworCQlpZiAocmV0dmFsID09IFNUQVRVU19USU1FRE9VVCkgeworCQkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX1RPX0VSUk9SKTsKKwkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCQl9IGVsc2UgeworCQkJVFJBQ0VfR09UTyhjaGlwLCBGYWlsKTsKKwkJfQorCX0KKwlyZXR2YWwgPSBydHM1MXhfZ2V0X3JzcChjaGlwLCAxLCAyMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzNTF4X2NsZWFyX3hkX2Vycm9yKGNoaXApOworCisJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1RJTUVET1VUKSB7CisJCQl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfVE9fRVJST1IpOworCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCX0gZWxzZSB7CisJCQlUUkFDRV9HT1RPKGNoaXAsIEZhaWwpOworCQl9CisJfQorCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworCitGYWlsOgorCXJ0czUxeF9lcDBfcmVhZF9yZWdpc3RlcihjaGlwLCBYRF9QQUdFX1NUQVRVUywgJnJlZ192YWwpOworCVJUUzUxWF9ERUJVR1AoIlhEX1BBR0VfU1RBVFVTOiAweCV4XG4iLCByZWdfdmFsKTsKKworCWlmIChyZWdfdmFsICE9IFhEX0dQRykKKwkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX1BSR19FUlJPUik7CisKKwlydHM1MXhfZXAwX3JlYWRfcmVnaXN0ZXIoY2hpcCwgWERfQ1RMLCAmcmVnX3ZhbCk7CisJUlRTNTFYX0RFQlVHUCgiWERfQ1RMOiAweCV4XG4iLCByZWdfdmFsKTsKKworCS8qIEhhbmRsZSB1bmNvcnJlY3RhYmxlIEVDQyBlcnJvciAqLworCWlmICgoKHJlZ192YWwgJiAoWERfRUNDMV9FUlJPUiB8IFhEX0VDQzFfVU5DT1JSRUNUQUJMRSkpCisJICAgICA9PSAoWERfRUNDMV9FUlJPUiB8IFhEX0VDQzFfVU5DT1JSRUNUQUJMRSkpCisJICAgIHx8ICgocmVnX3ZhbCAmIChYRF9FQ0MyX0VSUk9SIHwgWERfRUNDMl9VTkNPUlJFQ1RBQkxFKSkKKwkJPT0gKFhEX0VDQzJfRVJST1IgfCBYRF9FQ0MyX1VOQ09SUkVDVEFCTEUpKSkgeworCQl3YWl0X3RpbWVvdXQoMTAwKTsKKworCQlpZiAobW9uaXRvcl9jYXJkX2NkKGNoaXAsIFhEX0NBUkQpID09IENEX05PVF9FWElTVCkgeworCQkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX05PX0NBUkQpOworCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJfQorCisJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9FQ0NfRVJST1IpOworCisJCW5ld19ibGsgPSB4ZF9nZXRfdW51c2VkX2Jsb2NrKGNoaXAsIHpvbmVfbm8pOworCQlpZiAobmV3X2JsayA9PSBOT19ORVdfQkxLKSB7CisJCQlYRF9DTFJfQkFEX09MREJMSyh4ZF9jYXJkKTsKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCX0KKyNpZmRlZiBYRF9TUEVFRFVQCisJCXJldHZhbCA9CisJCSAgICB4ZF9hdXRvX2NvcHlfcGFnZShjaGlwLCBwaHlfYmxrLCBuZXdfYmxrLCAwLAorCQkJCSAgICAgIHhkX2NhcmQtPnBhZ2Vfb2ZmICsgMSk7CisjZWxzZQorCQlyZXR2YWwgPQorCQkgICAgeGRfY29weV9wYWdlKGNoaXAsIHBoeV9ibGssIG5ld19ibGssIDAsCisJCQkJIHhkX2NhcmQtPnBhZ2Vfb2ZmICsgMSk7CisjZW5kaWYKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJaWYgKCFYRF9DSEtfQkFEX05FV0JMSyh4ZF9jYXJkKSkgeworCQkJCXJldHZhbCA9IHhkX2VyYXNlX2Jsb2NrKGNoaXAsIG5ld19ibGspOworCQkJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJCXhkX3NldF91bnVzZWRfYmxvY2soY2hpcCwgbmV3X2Jsayk7CisJCQl9IGVsc2UgeworCQkJCVhEX0NMUl9CQURfTkVXQkxLKHhkX2NhcmQpOworCQkJfQorCQkJWERfQ0xSX0JBRF9PTERCTEsoeGRfY2FyZCk7CisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQl9CisJCXhkX3NldF9sMnBfdGJsKGNoaXAsIHpvbmVfbm8sIGxvZ19vZmYsICh1MTYpIChuZXdfYmxrICYgMHgzRkYpKTsKKwkJeGRfZXJhc2VfYmxvY2soY2hpcCwgcGh5X2Jsayk7CisJCXhkX21hcmtfYmFkX2Jsb2NrKGNoaXAsIHBoeV9ibGspOworCQlYRF9DTFJfQkFEX09MREJMSyh4ZF9jYXJkKTsKKwl9CisKKwlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworfQorCitzdGF0aWMgaW50IHhkX2ZpbmlzaF93cml0ZShzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXAsCisJCQkgICB1MzIgb2xkX2JsaywgdTMyIG5ld19ibGssIHUzMiBsb2dfYmxrLCB1OCBwYWdlX29mZikKK3sKKwlzdHJ1Y3QgeGRfaW5mbyAqeGRfY2FyZCA9ICYoY2hpcC0+eGRfY2FyZCk7CisJaW50IHJldHZhbCwgem9uZV9ubzsKKwl1MTYgbG9nX29mZjsKKworCVJUUzUxWF9ERUJVR1AoInhkX2ZpbmlzaF93cml0ZSwgb2xkX2JsayA9IDB4JXgsIG5ld19ibGsgPSAweCV4LCIKKwkJCQkibG9nX2JsayA9IDB4JXhcbiIsIG9sZF9ibGssIG5ld19ibGssIGxvZ19ibGspOworCisJaWYgKHBhZ2Vfb2ZmID4geGRfY2FyZC0+cGFnZV9vZmYpCisJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisKKwl6b25lX25vID0gKGludCkobG9nX2JsayAvIDEwMDApOworCWxvZ19vZmYgPSAodTE2KSAobG9nX2JsayAlIDEwMDApOworCisJaWYgKG9sZF9ibGsgPT0gQkxLX05PVF9GT1VORCkgeworCQlyZXR2YWwgPSB4ZF9pbml0X3BhZ2UoY2hpcCwgbmV3X2JsaywgbG9nX29mZiwKKwkJCQkgICAgICBwYWdlX29mZiwgeGRfY2FyZC0+cGFnZV9vZmYgKyAxKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcmV0dmFsID0geGRfZXJhc2VfYmxvY2soY2hpcCwgbmV3X2Jsayk7CisJCQlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKQorCQkJCXhkX3NldF91bnVzZWRfYmxvY2soY2hpcCwgbmV3X2Jsayk7CisJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQl9CisJfSBlbHNlIHsKKyNpZmRlZiBYRF9TUEVFRFVQCisJCXJldHZhbCA9IHhkX2F1dG9fY29weV9wYWdlKGNoaXAsIG9sZF9ibGssIG5ld19ibGssCisJCQkJCSAgIHBhZ2Vfb2ZmLCB4ZF9jYXJkLT5wYWdlX29mZiArIDEpOworI2Vsc2UKKwkJcmV0dmFsID0geGRfY29weV9wYWdlKGNoaXAsIG9sZF9ibGssIG5ld19ibGssCisJCQkJICAgICAgcGFnZV9vZmYsIHhkX2NhcmQtPnBhZ2Vfb2ZmICsgMSk7CisjZW5kaWYKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJaWYgKCFYRF9DSEtfQkFEX05FV0JMSyh4ZF9jYXJkKSkgeworCQkJCXJldHZhbCA9IHhkX2VyYXNlX2Jsb2NrKGNoaXAsIG5ld19ibGspOworCQkJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCisJCQkJCXhkX3NldF91bnVzZWRfYmxvY2soY2hpcCwgbmV3X2Jsayk7CisJCQl9CisJCQlYRF9DTFJfQkFEX05FV0JMSyh4ZF9jYXJkKTsKKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCX0KKworCQlyZXR2YWwgPSB4ZF9lcmFzZV9ibG9jayhjaGlwLCBvbGRfYmxrKTsKKwkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykgeworCQkJaWYgKFhEX0NIS19CQURfT0xEQkxLKHhkX2NhcmQpKSB7CisJCQkJeGRfbWFya19iYWRfYmxvY2soY2hpcCwgb2xkX2Jsayk7CisJCQkJWERfQ0xSX0JBRF9PTERCTEsoeGRfY2FyZCk7CisJCQl9IGVsc2UgeworCQkJCS8qIEFkZCBzb3VyY2UgYmxvY2sgdG8gdW51c2VkIGJsb2NrICovCisJCQkJeGRfc2V0X3VudXNlZF9ibG9jayhjaGlwLCBvbGRfYmxrKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9OT19FUlJPUik7CisJCQlYRF9DTFJfQkFEX09MREJMSyh4ZF9jYXJkKTsKKwkJfQorCX0KKworCS8qIEFkZCB0YXJnZXQgYmxvY2sgdG8gTDJQIHRhYmxlICovCisJeGRfc2V0X2wycF90YmwoY2hpcCwgem9uZV9ubywgbG9nX29mZiwgKHUxNikgKG5ld19ibGsgJiAweDNGRikpOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IHhkX3ByZXBhcmVfd3JpdGUoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwLAorCQkJICAgIHUzMiBvbGRfYmxrLCB1MzIgbmV3X2JsaywgdTMyIGxvZ19ibGssIHU4IHBhZ2Vfb2ZmKQoreworCWludCByZXR2YWw7CisKKwlSVFM1MVhfREVCVUdQKCJ4ZF9wcmVwYXJlX3dyaXRlLCBvbGRfYmxrID0gMHgleCwgbmV3X2JsayA9IDB4JXgsIgorCQkJCSJsb2dfYmxrID0gMHgleCwgcGFnZV9vZmYgPSAlZFxuIiwKKwkJCQlvbGRfYmxrLCBuZXdfYmxrLCBsb2dfYmxrLCAoaW50KXBhZ2Vfb2ZmKTsKKworCWlmIChwYWdlX29mZikgeworI2lmZGVmIFhEX1NQRUVEVVAKKwkJcmV0dmFsID0geGRfYXV0b19jb3B5X3BhZ2UoY2hpcCwgb2xkX2JsaywgbmV3X2JsaywgMCwgcGFnZV9vZmYpOworI2Vsc2UKKwkJcmV0dmFsID0geGRfY29weV9wYWdlKGNoaXAsIG9sZF9ibGssIG5ld19ibGssIDAsIHBhZ2Vfb2ZmKTsKKyNlbmRpZgorCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJfQorCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQorCitzdGF0aWMgaW50IHhkX3dyaXRlX211bHRpcGxlX3BhZ2VzKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTMyIG9sZF9ibGssCisJCQkJICAgdTMyIG5ld19ibGssIHUzMiBsb2dfYmxrLCB1OCBzdGFydF9wYWdlLAorCQkJCSAgIHU4IGVuZF9wYWdlLCB1OCAqYnVmLCB2b2lkICoqcHRyLAorCQkJCSAgIHVuc2lnbmVkIGludCAqb2Zmc2V0KQoreworCXN0cnVjdCB4ZF9pbmZvICp4ZF9jYXJkID0gJihjaGlwLT54ZF9jYXJkKTsKKwl1MzIgcGFnZV9hZGRyOworCWludCB6b25lX25vLCByZXR2YWw7CisJdTE2IGxvZ19vZmY7CisJdTggcGFnZV9jbnQsIHJlZ192YWw7CisKKwlSVFM1MVhfREVCVUdQKCJ4ZF93cml0ZV9tdWx0aXBsZV9wYWdlcywgb2xkX2JsayA9IDB4JXgsIgorCQkJCSJuZXdfYmxrID0gMHgleCwgbG9nX2JsayA9IDB4JXhcbiIsCisJCQkJb2xkX2JsaywgbmV3X2JsaywgbG9nX2Jsayk7CisKKwlpZiAoc3RhcnRfcGFnZSA+IGVuZF9wYWdlKQorCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCisJcGFnZV9jbnQgPSBlbmRfcGFnZSAtIHN0YXJ0X3BhZ2U7CisJem9uZV9ubyA9IChpbnQpKGxvZ19ibGsgLyAxMDAwKTsKKwlsb2dfb2ZmID0gKHUxNikgKGxvZ19ibGsgJSAxMDAwKTsKKworCXBhZ2VfYWRkciA9IChuZXdfYmxrIDw8IHhkX2NhcmQtPmJsb2NrX3NoaWZ0KSArIHN0YXJ0X3BhZ2U7CisKKwkvKiBTZW5kIGluZGV4IGNvbW1hbmQgKi8KKwlyZXR2YWwgPSB4ZF9zZW5kX2NtZChjaGlwLCBSRUFEMV8xKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJ0czUxeF9pbml0X2NtZChjaGlwKTsKKworCS8qIFByZXBhcmUgcmVkdW5kYW50IGZpZWxkICovCisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfQkxPQ0tfQUREUjFfSCwgMHhGRiwKKwkJICAgICAgICh1OCkgKGxvZ19vZmYgPj4gOCkpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX0JMT0NLX0FERFIxX0wsIDB4RkYsCisJCSAgICAgICAodTgpIGxvZ19vZmYpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX0JMT0NLX1NUQVRVUywgMHhGRiwgWERfR0JMSyk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfUEFHRV9TVEFUVVMsIDB4RkYsIFhEX0dQRyk7CisKKwl4ZF9hc3NpZ25fcGh5X2FkZHIoY2hpcCwgcGFnZV9hZGRyLCBYRF9SV19BRERSKTsKKworCS8qIFRyYW5zZm9ybSB0aGUgYmxvY2sgYWRkcmVzcyBieSBoYXJkd2FyZSAqLworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX0NGRywgWERfQkFfVFJBTlNGT1JNLAorCQkgICAgICAgWERfQkFfVFJBTlNGT1JNKTsKKworCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIFhEX1BBR0VfQ05ULCAweEZGLCBwYWdlX2NudCk7CisJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9EQVRBX1NPVVJDRSwgMHgwMSwKKwkJICAgICAgIFJJTkdfQlVGRkVSKTsKKworCXRyYW5zX2RtYV9lbmFibGUoY2hpcC0+c3JiLT5zY19kYXRhX2RpcmVjdGlvbiwgY2hpcCwgcGFnZV9jbnQgKiA1MTIsCisJCQkgRE1BXzUxMik7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBYRF9UUkFOU0ZFUiwgMHhGRiwKKwkJICAgICAgIFhEX1RSQU5TRkVSX1NUQVJUIHwgWERfV1JJVEVfUEFHRVMpOworCXJ0czUxeF9hZGRfY21kKGNoaXAsIENIRUNLX1JFR19DTUQsIFhEX1RSQU5TRkVSLCBYRF9UUkFOU0ZFUl9FTkQsCisJCSAgICAgICBYRF9UUkFOU0ZFUl9FTkQpOworCisJcmV0dmFsID0gcnRzNTF4X3NlbmRfY21kKGNoaXAsIE1PREVfQ0RPUiwgMTAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHZhbCA9CisJICAgIHJ0czUxeF90cmFuc2Zlcl9kYXRhX3BhcnRpYWwoY2hpcCwgU05EX0JVTEtfUElQRShjaGlwKSwgKHZvaWQgKilidWYsCisJCQkJCSBwdHIsIG9mZnNldCwgcGFnZV9jbnQgKiA1MTIsCisJCQkJCSBzY3NpX3NnX2NvdW50KGNoaXAtPnNyYiksIE5VTEwsIDIwMDApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzNTF4X2NsZWFyX3hkX2Vycm9yKGNoaXApOworCisJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1RJTUVET1VUKSB7CisJCQl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfVE9fRVJST1IpOworCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCX0gZWxzZSB7CisJCQlUUkFDRV9HT1RPKGNoaXAsIEZhaWwpOworCQl9CisJfQorCXJldHZhbCA9IHJ0czUxeF9nZXRfcnNwKGNoaXAsIDEsIDIwMCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHM1MXhfY2xlYXJfeGRfZXJyb3IoY2hpcCk7CisKKwkJaWYgKHJldHZhbCA9PSBTVEFUVVNfVElNRURPVVQpIHsKKwkJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9UT19FUlJPUik7CisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkJfSBlbHNlIHsKKwkJCVRSQUNFX0dPVE8oY2hpcCwgRmFpbCk7CisJCX0KKwl9CisKKwlpZiAoZW5kX3BhZ2UgPT0gKHhkX2NhcmQtPnBhZ2Vfb2ZmICsgMSkpIHsKKwkJeGRfY2FyZC0+ZGVsYXlfd3JpdGUuZGVsYXlfd3JpdGVfZmxhZyA9IDA7CisKKwkJaWYgKG9sZF9ibGsgIT0gQkxLX05PVF9GT1VORCkgeworCQkJcmV0dmFsID0geGRfZXJhc2VfYmxvY2soY2hpcCwgb2xkX2Jsayk7CisJCQlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJaWYgKFhEX0NIS19CQURfT0xEQkxLKHhkX2NhcmQpKSB7CisJCQkJCXhkX21hcmtfYmFkX2Jsb2NrKGNoaXAsIG9sZF9ibGspOworCQkJCQlYRF9DTFJfQkFEX09MREJMSyh4ZF9jYXJkKTsKKwkJCQl9IGVsc2UgeworCQkJCQl4ZF9zZXRfdW51c2VkX2Jsb2NrKGNoaXAsIG9sZF9ibGspOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX05PX0VSUk9SKTsKKwkJCQlYRF9DTFJfQkFEX09MREJMSyh4ZF9jYXJkKTsKKwkJCX0KKwkJfQorCQl4ZF9zZXRfbDJwX3RibChjaGlwLCB6b25lX25vLCBsb2dfb2ZmLCAodTE2KSAobmV3X2JsayAmIDB4M0ZGKSk7CisJfQorCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworCitGYWlsOgorCXJ0czUxeF9lcDBfcmVhZF9yZWdpc3RlcihjaGlwLCBYRF9EQVQsICZyZWdfdmFsKTsKKwlSVFM1MVhfREVCVUdQKCJYRF9EQVQ6IDB4JXhcbiIsIHJlZ192YWwpOworCisJaWYgKHJlZ192YWwgJiBQUk9HUkFNX0VSUk9SKSB7CisJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9QUkdfRVJST1IpOworCQl4ZF9tYXJrX2JhZF9ibG9jayhjaGlwLCBuZXdfYmxrKTsKKwl9CisKKwlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworfQorCitpbnQgeGRfZGVsYXlfd3JpdGUoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCXN0cnVjdCB4ZF9pbmZvICp4ZF9jYXJkID0gJihjaGlwLT54ZF9jYXJkKTsKKwlzdHJ1Y3QgeGRfZGVsYXlfd3JpdGVfdGFnICpkZWxheV93cml0ZSA9ICYoeGRfY2FyZC0+ZGVsYXlfd3JpdGUpOworCWludCByZXR2YWw7CisKKwlpZiAoZGVsYXlfd3JpdGUtPmRlbGF5X3dyaXRlX2ZsYWcpIHsKKwkJUlRTNTFYX0RFQlVHUCgieGRfZGVsYXlfd3JpdGVcbiIpOworCQlyZXR2YWwgPSB4ZF9zd2l0Y2hfY2xvY2soY2hpcCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCQlkZWxheV93cml0ZS0+ZGVsYXlfd3JpdGVfZmxhZyA9IDA7CisJCXJldHZhbCA9IHhkX2ZpbmlzaF93cml0ZShjaGlwLAorCQkJCQkgZGVsYXlfd3JpdGUtPm9sZF9waHlibG9jaywKKwkJCQkJIGRlbGF5X3dyaXRlLT5uZXdfcGh5YmxvY2ssCisJCQkJCSBkZWxheV93cml0ZS0+bG9nYmxvY2ssCisJCQkJCSBkZWxheV93cml0ZS0+cGFnZW9mZik7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwl9CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK2ludCB4ZF9ydyhzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTMyIHN0YXJ0X3NlY3RvciwKKwkgIHUxNiBzZWN0b3JfY250KQoreworCXN0cnVjdCB4ZF9pbmZvICp4ZF9jYXJkID0gJihjaGlwLT54ZF9jYXJkKTsKKwl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKKwlzdHJ1Y3QgeGRfZGVsYXlfd3JpdGVfdGFnICpkZWxheV93cml0ZSA9ICYoeGRfY2FyZC0+ZGVsYXlfd3JpdGUpOworCWludCByZXR2YWwsIHpvbmVfbm87CisJdTMyIGxvZ19ibGssIG9sZF9ibGsgPSAwLCBuZXdfYmxrID0gMDsKKwl1MTYgbG9nX29mZiwgdG90YWxfc2VjX2NudCA9IHNlY3Rvcl9jbnQ7CisJdTggc3RhcnRfcGFnZSwgZW5kX3BhZ2UgPSAwLCBwYWdlX2NudDsKKwl1OCAqYnVmOworCXZvaWQgKnB0ciA9IE5VTEw7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IDA7CisKKwl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfTk9fRVJST1IpOworCisJeGRfY2FyZC0+Y291bnRlciA9IDA7CisKKwlSVFM1MVhfREVCVUdQKCJ4ZF9ydzogc2NzaV9idWZmbGVuID0gJWQsIHNjc2lfc2dfY291bnQgPSAlZFxuIiwKKwkJICAgICAgIHNjc2lfYnVmZmxlbihzcmIpLCBzY3NpX3NnX2NvdW50KHNyYikpOworCVJUUzUxWF9ERUJVR1AoIkRhdGEgZGlyZWN0aW9uOiAlc1xuIiwKKwkJICAgICAgIChzcmItPnNjX2RhdGFfZGlyZWN0aW9uID09CisJCQlETUFfVE9fREVWSUNFKSA/ICJ3cml0ZSIgOiAicmVhZCIpOworCisJYnVmID0gKHU4ICopIHNjc2lfc2dsaXN0KHNyYik7CisKKwlyZXR2YWwgPSB4ZF9zd2l0Y2hfY2xvY2soY2hpcCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisKKwlsb2dfYmxrID0gc3RhcnRfc2VjdG9yID4+IHhkX2NhcmQtPmJsb2NrX3NoaWZ0OworCXN0YXJ0X3BhZ2UgPSAodTgpIHN0YXJ0X3NlY3RvciAmIHhkX2NhcmQtPnBhZ2Vfb2ZmOworCXpvbmVfbm8gPSAoaW50KShsb2dfYmxrIC8gMTAwMCk7CisJbG9nX29mZiA9ICh1MTYpIChsb2dfYmxrICUgMTAwMCk7CisKKwlSVFM1MVhfREVCVUdQKCJsb2dfYmxrID0gMHgleFxuIiwgbG9nX2Jsayk7CisKKwlpZiAoeGRfY2FyZC0+em9uZVt6b25lX25vXS5idWlsZF9mbGFnID09IDApIHsKKwkJcmV0dmFsID0geGRfYnVpbGRfbDJwX3RibChjaGlwLCB6b25lX25vKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJY2hpcC0+Y2FyZF9mYWlsIHw9IFhEX0NBUkQ7CisJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOworCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCX0KKwl9CisKKwlpZiAoc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CisJCWlmIChkZWxheV93cml0ZS0+ZGVsYXlfd3JpdGVfZmxhZyAmJgorCQkgICAgKGRlbGF5X3dyaXRlLT5sb2dibG9jayA9PSBsb2dfYmxrKSAmJgorCQkgICAgKHN0YXJ0X3BhZ2UgPiBkZWxheV93cml0ZS0+cGFnZW9mZikpIHsKKwkJCWRlbGF5X3dyaXRlLT5kZWxheV93cml0ZV9mbGFnID0gMDsKKwkJCWlmIChkZWxheV93cml0ZS0+b2xkX3BoeWJsb2NrICE9IEJMS19OT1RfRk9VTkQpIHsKKyNpZmRlZiBYRF9TUEVFRFVQCisJCQkJcmV0dmFsID0geGRfYXV0b19jb3B5X3BhZ2UoY2hpcCwKKwkJCQkJZGVsYXlfd3JpdGUtPm9sZF9waHlibG9jaywKKwkJCQkJZGVsYXlfd3JpdGUtPm5ld19waHlibG9jaywKKwkJCQkJZGVsYXlfd3JpdGUtPnBhZ2VvZmYsIHN0YXJ0X3BhZ2UpOworI2Vsc2UKKwkJCQlyZXR2YWwgPSB4ZF9jb3B5X3BhZ2UoY2hpcCwKKwkJCQkJCSAgICAgIGRlbGF5X3dyaXRlLT5vbGRfcGh5YmxvY2ssCisJCQkJCQkgICAgICBkZWxheV93cml0ZS0+bmV3X3BoeWJsb2NrLAorCQkJCQkJICAgICAgZGVsYXlfd3JpdGUtPnBhZ2VvZmYsCisJCQkJCQkgICAgICBzdGFydF9wYWdlKTsKKyNlbmRpZgorCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCQkJU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOworCQkJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkJCQl9CisJCQl9CisJCQlvbGRfYmxrID0gZGVsYXlfd3JpdGUtPm9sZF9waHlibG9jazsKKwkJCW5ld19ibGsgPSBkZWxheV93cml0ZS0+bmV3X3BoeWJsb2NrOworCQl9IGVsc2UgaWYgKGRlbGF5X3dyaXRlLT5kZWxheV93cml0ZV9mbGFnICYmCisJCQkgICAoZGVsYXlfd3JpdGUtPmxvZ2Jsb2NrID09IGxvZ19ibGspICYmCisJCQkgICAoc3RhcnRfcGFnZSA9PSBkZWxheV93cml0ZS0+cGFnZW9mZikpIHsKKwkJCWRlbGF5X3dyaXRlLT5kZWxheV93cml0ZV9mbGFnID0gMDsKKwkJCW9sZF9ibGsgPSBkZWxheV93cml0ZS0+b2xkX3BoeWJsb2NrOworCQkJbmV3X2JsayA9IGRlbGF5X3dyaXRlLT5uZXdfcGh5YmxvY2s7CisJCX0gZWxzZSB7CisJCQlyZXR2YWwgPSB4ZF9kZWxheV93cml0ZShjaGlwKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCisJCQkJCSAgICAgICBTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCQl9CisJCQlvbGRfYmxrID0geGRfZ2V0X2wycF90YmwoY2hpcCwgem9uZV9ubywgbG9nX29mZik7CisJCQluZXdfYmxrID0geGRfZ2V0X3VudXNlZF9ibG9jayhjaGlwLCB6b25lX25vKTsKKwkJCWlmICgob2xkX2JsayA9PSBCTEtfTk9UX0ZPVU5EKQorCQkJICAgIHx8IChuZXdfYmxrID09IEJMS19OT1RfRk9VTkQpKSB7CisJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCQkgICAgICAgU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOworCQkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCQkJfQorCisJCQlyZXR2YWwgPQorCQkJICAgIHhkX3ByZXBhcmVfd3JpdGUoY2hpcCwgb2xkX2JsaywgbmV3X2JsaywgbG9nX2JsaywKKwkJCQkJICAgICBzdGFydF9wYWdlKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlpZiAobW9uaXRvcl9jYXJkX2NkKGNoaXAsIFhEX0NBUkQpID09CisJCQkJICAgIENEX05PVF9FWElTVCkgeworCQkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCisJCQkJCQlTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKKwkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQl9CisJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCQkgICAgICAgU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOworCQkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJcmV0dmFsID0geGRfZGVsYXlfd3JpdGUoY2hpcCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWlmIChtb25pdG9yX2NhcmRfY2QoY2hpcCwgWERfQ0FSRCkgPT0gQ0RfTk9UX0VYSVNUKSB7CisJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCQkgICAgICAgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCX0KKwkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKKwkJCQkgICAgICAgU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOworCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCX0KKworCQlvbGRfYmxrID0geGRfZ2V0X2wycF90YmwoY2hpcCwgem9uZV9ubywgbG9nX29mZik7CisJCWlmIChvbGRfYmxrID09IEJMS19OT1RfRk9VTkQpIHsKKwkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKKwkJCQkgICAgICAgU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOworCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJfQorCX0KKworCVJUUzUxWF9ERUJVR1AoIm9sZF9ibGsgPSAweCV4XG4iLCBvbGRfYmxrKTsKKwlpZiAoc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKQorCQlSVFM1MVhfREVCVUdQKCJuZXdfYmxrID0gMHgleFxuIiwgbmV3X2Jsayk7CisKKwl3aGlsZSAodG90YWxfc2VjX2NudCkgeworCQlpZiAoKHN0YXJ0X3BhZ2UgKyB0b3RhbF9zZWNfY250KSA+ICh4ZF9jYXJkLT5wYWdlX29mZiArIDEpKQorCQkJZW5kX3BhZ2UgPSB4ZF9jYXJkLT5wYWdlX29mZiArIDE7CisJCWVsc2UKKwkJCWVuZF9wYWdlID0gc3RhcnRfcGFnZSArICh1OCkgdG90YWxfc2VjX2NudDsKKwkJcGFnZV9jbnQgPSBlbmRfcGFnZSAtIHN0YXJ0X3BhZ2U7CisJCWlmIChzcmItPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkgeworCQkJcmV0dmFsID0geGRfcmVhZF9tdWx0aXBsZV9wYWdlcyhjaGlwLCBvbGRfYmxrLCBsb2dfYmxrLAorCQkJCQkJCXN0YXJ0X3BhZ2UsIGVuZF9wYWdlLAorCQkJCQkJCWJ1ZiwgJnB0ciwgJm9mZnNldCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCQlTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldHZhbCA9CisJCQkgICAgeGRfd3JpdGVfbXVsdGlwbGVfcGFnZXMoY2hpcCwgb2xkX2JsaywgbmV3X2JsaywKKwkJCQkJCSAgICBsb2dfYmxrLCBzdGFydF9wYWdlLAorCQkJCQkJICAgIGVuZF9wYWdlLCBidWYsICZwdHIsCisJCQkJCQkgICAgJm9mZnNldCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCQkgICAgICAgU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOworCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQl9CisJCX0KKworCQl0b3RhbF9zZWNfY250IC09IHBhZ2VfY250OworCisJCWlmICh0b3RhbF9zZWNfY250ID09IDApCisJCQlicmVhazsKKworCQlsb2dfYmxrKys7CisJCXpvbmVfbm8gPSAoaW50KShsb2dfYmxrIC8gMTAwMCk7CisJCWxvZ19vZmYgPSAodTE2KSAobG9nX2JsayAlIDEwMDApOworCisJCWlmICh4ZF9jYXJkLT56b25lW3pvbmVfbm9dLmJ1aWxkX2ZsYWcgPT0gMCkgeworCQkJcmV0dmFsID0geGRfYnVpbGRfbDJwX3RibChjaGlwLCB6b25lX25vKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQljaGlwLT5jYXJkX2ZhaWwgfD0gWERfQ0FSRDsKKwkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCisJCQkJCSAgICAgICBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKKwkJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkJCX0KKwkJfQorCisJCW9sZF9ibGsgPSB4ZF9nZXRfbDJwX3RibChjaGlwLCB6b25lX25vLCBsb2dfb2ZmKTsKKwkJaWYgKG9sZF9ibGsgPT0gQkxLX05PVF9GT1VORCkgeworCQkJaWYgKHNyYi0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSB7CisJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAorCQkJCQlTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7CisJCQl9IGVsc2UgeworCQkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKKwkJCQkJICAgICAgIFNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKKwkJCX0KKwkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCX0KKworCQlpZiAoc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSB7CisJCQluZXdfYmxrID0geGRfZ2V0X3VudXNlZF9ibG9jayhjaGlwLCB6b25lX25vKTsKKwkJCWlmIChuZXdfYmxrID09IEJMS19OT1RfRk9VTkQpIHsKKwkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCisJCQkJCSAgICAgICBTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7CisJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCX0KKwkJfQorCisJCXN0YXJ0X3BhZ2UgPSAwOworCX0KKworCWlmICgoc3JiLT5zY19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKSAmJgorCSAgICAoZW5kX3BhZ2UgIT0gKHhkX2NhcmQtPnBhZ2Vfb2ZmICsgMSkpKSB7CisJCWRlbGF5X3dyaXRlLT5kZWxheV93cml0ZV9mbGFnID0gMTsKKwkJZGVsYXlfd3JpdGUtPm9sZF9waHlibG9jayA9IG9sZF9ibGs7CisJCWRlbGF5X3dyaXRlLT5uZXdfcGh5YmxvY2sgPSBuZXdfYmxrOworCQlkZWxheV93cml0ZS0+bG9nYmxvY2sgPSBsb2dfYmxrOworCQlkZWxheV93cml0ZS0+cGFnZW9mZiA9IGVuZF9wYWdlOworCX0KKworCXNjc2lfc2V0X3Jlc2lkKHNyYiwgMCk7CisKKwlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7Cit9CisKK3ZvaWQgeGRfZnJlZV9sMnBfdGJsKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3QgeGRfaW5mbyAqeGRfY2FyZCA9ICYoY2hpcC0+eGRfY2FyZCk7CisJaW50IGkgPSAwOworCisJaWYgKHhkX2NhcmQtPnpvbmUgIT0gTlVMTCkgeworCQlmb3IgKGkgPSAwOyBpIDwgeGRfY2FyZC0+em9uZV9jbnQ7IGkrKykgeworCQkJaWYgKHhkX2NhcmQtPnpvbmVbaV0ubDJwX3RhYmxlICE9IE5VTEwpIHsKKwkJCQl2ZnJlZSh4ZF9jYXJkLT56b25lW2ldLmwycF90YWJsZSk7CisJCQkJeGRfY2FyZC0+em9uZVtpXS5sMnBfdGFibGUgPSBOVUxMOworCQkJfQorCQkJaWYgKHhkX2NhcmQtPnpvbmVbaV0uZnJlZV90YWJsZSAhPSBOVUxMKSB7CisJCQkJdmZyZWUoeGRfY2FyZC0+em9uZVtpXS5mcmVlX3RhYmxlKTsKKwkJCQl4ZF9jYXJkLT56b25lW2ldLmZyZWVfdGFibGUgPSBOVUxMOworCQkJfQorCQl9CisJCXZmcmVlKHhkX2NhcmQtPnpvbmUpOworCQl4ZF9jYXJkLT56b25lID0gTlVMTDsKKwl9Cit9CisKK3ZvaWQgeGRfY2xlYW51cF93b3JrKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3QgeGRfaW5mbyAqeGRfY2FyZCA9ICYoY2hpcC0+eGRfY2FyZCk7CisKKwlpZiAoeGRfY2FyZC0+ZGVsYXlfd3JpdGUuZGVsYXlfd3JpdGVfZmxhZykgeworCQlSVFM1MVhfREVCVUdQKCJ4RDogZGVsYXkgd3JpdGVcbiIpOworCQl4ZF9kZWxheV93cml0ZShjaGlwKTsKKwkJeGRfY2FyZC0+Y291bnRlciA9IDA7CisJfQorfQorCitpbnQgeGRfcG93ZXJfb2ZmX2NhcmQzdjMoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKQoreworCWludCByZXR2YWw7CisKKwlydHM1MXhfaW5pdF9jbWQoY2hpcCk7CisKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX0NMS19FTiwgWERfQ0xLX0VOLCAwKTsKKworCWlmIChjaGlwLT5hc2ljX2NvZGUpCisJCXhkX3B1bGxfY3RsX2Rpc2FibGUoY2hpcCk7CisJZWxzZQorCQlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBGUEdBX1BVTExfQ1RMLCAweEZGLCAweERGKTsKKwlydHM1MXhfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX09FLCBYRF9PVVRQVVRfRU4sIDApOworCWlmICghY2hpcC0+b3B0aW9uLkZUMl9mYXN0X21vZGUpIHsKKwkJcnRzNTF4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgQ0FSRF9QV1JfQ1RMLCBQT1dFUl9NQVNLLAorCQkJICAgICAgIFBPV0VSX09GRik7CisJCWlmIChDSEVDS19QS0coY2hpcCwgTFFGUDQ4KQorCQkgICAgfHwgY2hpcC0+b3B0aW9uLnJ0czUxMjlfRDMzMThfb2ZmX2VuYWJsZSkKKwkJCXJ0czUxeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFdSX0NUTCwKKwkJCQkgICAgICAgRFYzMzE4X0FVVE9fUFdSX09GRiwgMCk7CisJfQorCisJcmV0dmFsID0gcnRzNTF4X3NlbmRfY21kKGNoaXAsIE1PREVfQywgMTAwKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQorCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKworCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKK30KKworaW50IHJlbGVhc2VfeGRfY2FyZChzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApCit7CisJc3RydWN0IHhkX2luZm8gKnhkX2NhcmQgPSAmKGNoaXAtPnhkX2NhcmQpOworCWludCByZXR2YWw7CisKKwlSVFM1MVhfREVCVUdQKCJlbGVhc2VfeGRfY2FyZFxuIik7CisKKwljaGlwLT5jYXJkX3JlYWR5ICY9IH5YRF9DQVJEOworCWNoaXAtPmNhcmRfZmFpbCAmPSB+WERfQ0FSRDsKKwljaGlwLT5jYXJkX3dwICY9IH5YRF9DQVJEOworCisJeGRfY2FyZC0+ZGVsYXlfd3JpdGUuZGVsYXlfd3JpdGVfZmxhZyA9IDA7CisKKwl4ZF9mcmVlX2wycF90YmwoY2hpcCk7CisKKwlydHM1MXhfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0ZTTV9FRCwgSFdfQ01EX1NUT1AsIEhXX0NNRF9TVE9QKTsKKworCXJldHZhbCA9IHhkX3Bvd2VyX29mZl9jYXJkM3YzKGNoaXApOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCisJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCisJaWYgKGNoaXAtPmFzaWNfY29kZSAmJiBDSEVDS19QS0coY2hpcCwgUUZOMjQpKQorCQl3YWl0X3RpbWVvdXQoMjApOworCisJcmV0dXJuIFNUQVRVU19TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUxMzkveGQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3hkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2OTU5MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MTM5L3hkLmgKQEAgLTAsMCArMSwxOTMgQEAKKy8qIERyaXZlciBmb3IgUmVhbHRlayBSVFM1MXh4IFVTQiBjYXJkIHJlYWRlcgorICogSGVhZGVyIGZpbGUKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOSBSZWFsdGVrIFNlbWljb25kdWN0b3IgQ29ycC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgorICogQXV0aG9yOgorICogICB3d2FuZyAod2VpX3dhbmdAcmVhbHNpbC5jb20uY24pCisgKiAgIE5vLiA0NTAsIFNoZW5odSBSb2FkLCBTdXpob3UgSW5kdXN0cnkgUGFyaywgU3V6aG91LCBDaGluYQorICogTWFpbnRhaW5lcjoKKyAqICAgRWR3aW4gUm9uZyAoZWR3aW5fcm9uZ0ByZWFsc2lsLmNvbS5jbikKKyAqICAgTm8uIDQ1MCwgU2hlbmh1IFJvYWQsIFN1emhvdSBJbmR1c3RyeSBQYXJrLCBTdXpob3UsIENoaW5hCisgKi8KKworI2lmbmRlZiBfX1JUUzUxWF9YRF9ICisjZGVmaW5lIF9fUlRTNTFYX1hEX0gKKworLyogRXJyb3IgQ29kZXMgKi8KKyNkZWZpbmUJWERfTk9fRVJST1IJCQkweDAwCisjZGVmaW5lCVhEX05PX01FTU9SWQkJCTB4ODAKKyNkZWZpbmUJWERfUFJHX0VSUk9SCQkJMHg0MAorI2RlZmluZQlYRF9OT19DQVJECQkJMHgyMAorI2RlZmluZQlYRF9SRUFEX0ZBSUwJCQkweDEwCisjZGVmaW5lCVhEX0VSQVNFX0ZBSUwJCQkweDA4CisjZGVmaW5lCVhEX1dSSVRFX0ZBSUwJCQkweDA0CisjZGVmaW5lCVhEX0VDQ19FUlJPUgkJCTB4MDIKKyNkZWZpbmUJWERfVE9fRVJST1IJCQkweDAxCisKKy8qIFhEIENvbW1hbmRzICovCisjZGVmaW5lCVJFQUQxXzEJCQkJMHgwMAorI2RlZmluZQlSRUFEMV8yCQkJCTB4MDEKKyNkZWZpbmUJUkVBRDIJCQkJMHg1MAorI2RlZmluZSBSRUFEX0lECQkJCTB4OTAKKyNkZWZpbmUgUkVTRVQJCQkJMHhmZgorI2RlZmluZSBQQUdFX1BSR18xCQkJMHg4MAorI2RlZmluZSBQQUdFX1BSR18yCQkJMHgxMAorI2RlZmluZQlCTEtfRVJBU0VfMQkJCTB4NjAKKyNkZWZpbmUJQkxLX0VSQVNFXzIJCQkweEQwCisjZGVmaW5lIFJFQURfU1RTCQkJMHg3MAorI2RlZmluZSBSRUFEX3hEX0lECQkJMHg5QQorI2RlZmluZQlDT1BZX0JBQ0tfNTEyCQkJMHg4QQorI2RlZmluZQlDT1BZX0JBQ0tfMksJCQkweDg1CisjZGVmaW5lCVJFQUQxXzFfMgkJCTB4MzAKKyNkZWZpbmUJUkVBRDFfMV8zCQkJMHgzNQorI2RlZmluZQlDSEdfREFUX09VVF8xCQkJMHgwNQorI2RlZmluZSBSRE1fREFUX09VVF8xCQkJMHgwNQorI2RlZmluZQlDSEdfREFUX09VVF8yCQkJMHhFMAorI2RlZmluZSBSRE1fREFUX09VVF8yCQkJMHhFMAorI2RlZmluZQlDSEdfREFUX09VVF8yCQkJMHhFMAorI2RlZmluZQlDSEdfREFUX0lOXzEJCQkweDg1CisjZGVmaW5lCUNBQ0hFX1BSRwkJCTB4MTUKKworLyogUmVkdW5kYW50IEFyZWEgUmVsYXRlZCAqLworI2RlZmluZSBYRF9FWFRSQV9TSVpFCQkJMHgxMAorI2RlZmluZSBYRF8yS19FWFRSQV9TSVpFCQkweDQwCisKKy8qIERlZmluZSBmb3IgWEQgU3RhdHVzICAqLworI2RlZmluZQlOT1RfV1JJVEVfUFJPVEVDVEVECQkweDgwCisjZGVmaW5lCVJFQURZX1NUQVRFCQkJMHg0MAorI2RlZmluZQlQUk9HUkFNX0VSUk9SCQkJMHgwMQorI2RlZmluZQlQUk9HUkFNX0VSUk9SX05fMQkJMHgwMgorI2RlZmluZQlJTlRFUk5BTF9SRUFEWQkJCTB4MjAKKyNkZWZpbmUJUkVBRFlfRkxBRwkJCTB4NUYKKworLyogRGVmaW5lIGZvciBkZXZpY2UgY29kZSAqLworI2RlZmluZQlYRF84TV9YOF81MTIJCQkweEU2CisjZGVmaW5lCVhEXzE2TV9YOF81MTIJCQkweDczCisjZGVmaW5lCVhEXzMyTV9YOF81MTIJCQkweDc1CisjZGVmaW5lCVhEXzY0TV9YOF81MTIJCQkweDc2CisjZGVmaW5lCVhEXzEyOE1fWDhfNTEyCQkJMHg3OQorI2RlZmluZQlYRF8yNTZNX1g4XzUxMgkJCTB4NzEKKyNkZWZpbmUJWERfMTI4TV9YOF8yMDQ4CQkJMHhGMQorI2RlZmluZQlYRF8yNTZNX1g4XzIwNDgJCQkweERBCisjZGVmaW5lCVhEXzUxMk1fWDgJCQkweERDCisjZGVmaW5lCVhEXzEyOE1fWDE2XzIwNDgJCTB4QzEKKyNkZWZpbmUJWERfNE1fWDhfNTEyXzEJCQkweEUzCisjZGVmaW5lCVhEXzRNX1g4XzUxMl8yCQkJMHhFNQorI2RlZmluZQl4RF8xR19YOF81MTIJCQkweEQzCisjZGVmaW5lCXhEXzJHX1g4XzUxMgkJCTB4RDUKKworI2RlZmluZQlYRF9JRF9DT0RFCQkJMHhCNQorCisjZGVmaW5lCVZFTkRPUl9CTE9DSwkJCTB4RUZGRgorI2RlZmluZQlDSVNfQkxPQ0sJCQkweERGRkYKKworI2RlZmluZQlCTEtfTk9UX0ZPVU5ECQkJMHhGRkZGRkZGRgorCisjZGVmaW5lCU5PX05FV19CTEsJCQkweEZGRkZGRkZGCisKKyNkZWZpbmUJUEFHRV9DT1JSRUNUQUJMRQkJMHgwCisjZGVmaW5lCVBBR0VfTk9UQ09SUkVDVEFCTEUJCTB4MQorCisjZGVmaW5lCU5PX09GRlNFVAkJCTB4MAorI2RlZmluZQlXSVRIX09GRlNFVAkJCTB4MQorCisjZGVmaW5lCVNlY3RfUGVyX1BhZ2UJCQk0CisjZGVmaW5lCVhEX0FERFJfTU9ERV8yQwkJCVhEX0FERFJfTU9ERV8yQQorCisjZGVmaW5lIFpPTkUwX0JBRF9CTE9DSwkJCTIzCisjZGVmaW5lIE5PVF9aT05FMF9CQURfQkxPQ0sJCTI0CisKKy8qIEFzc2lnbiBhZGRyZXNzIG1vZGUgKi8KKyNkZWZpbmUJWERfUldfQUREUgkJCTB4MDEKKyNkZWZpbmUJWERfRVJBU0VfQUREUgkJCTB4MDIKKworLyogTWFjcm8gRGVmaW5pdGlvbiAqLworI2RlZmluZQlYRF9QQUdFXzUxMih4ZF9jYXJkKQkJXAorCWRvIHsJXAorCQkoeGRfY2FyZCktPmJsb2NrX3NoaWZ0ID0gNTsJXAorCQkoeGRfY2FyZCktPnBhZ2Vfb2ZmID0gMHgxRjsJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUJWERfU0VUX0JBRF9ORVdCTEsoeGRfY2FyZCkJKCh4ZF9jYXJkKS0+bXVsdGlfZmxhZyB8PSAweDAxKQorI2RlZmluZQlYRF9DTFJfQkFEX05FV0JMSyh4ZF9jYXJkKQkoKHhkX2NhcmQpLT5tdWx0aV9mbGFnICY9IH4weDAxKQorI2RlZmluZQlYRF9DSEtfQkFEX05FV0JMSyh4ZF9jYXJkKQkoKHhkX2NhcmQpLT5tdWx0aV9mbGFnICYgMHgwMSkKKworI2RlZmluZQlYRF9TRVRfQkFEX09MREJMSyh4ZF9jYXJkKQkoKHhkX2NhcmQpLT5tdWx0aV9mbGFnIHw9IDB4MDIpCisjZGVmaW5lCVhEX0NMUl9CQURfT0xEQkxLKHhkX2NhcmQpCSgoeGRfY2FyZCktPm11bHRpX2ZsYWcgJj0gfjB4MDIpCisjZGVmaW5lCVhEX0NIS19CQURfT0xEQkxLKHhkX2NhcmQpCSgoeGRfY2FyZCktPm11bHRpX2ZsYWcgJiAweDAyKQorCisjZGVmaW5lCVhEX1NFVF9NQlJfRkFJTCh4ZF9jYXJkKQkoKHhkX2NhcmQpLT5tdWx0aV9mbGFnIHw9IDB4MDQpCisjZGVmaW5lCVhEX0NMUl9NQlJfRkFJTCh4ZF9jYXJkKQkoKHhkX2NhcmQpLT5tdWx0aV9mbGFnICY9IH4weDA0KQorI2RlZmluZQlYRF9DSEtfTUJSX0ZBSUwoeGRfY2FyZCkJKCh4ZF9jYXJkKS0+bXVsdGlfZmxhZyAmIDB4MDQpCisKKyNkZWZpbmUJWERfU0VUX0VDQ19GTERfRVJSKHhkX2NhcmQpCSgoeGRfY2FyZCktPm11bHRpX2ZsYWcgfD0gMHgwOCkKKyNkZWZpbmUJWERfQ0xSX0VDQ19GTERfRVJSKHhkX2NhcmQpCSgoeGRfY2FyZCktPm11bHRpX2ZsYWcgJj0gfjB4MDgpCisjZGVmaW5lCVhEX0NIS19FQ0NfRkxEX0VSUih4ZF9jYXJkKQkoKHhkX2NhcmQpLT5tdWx0aV9mbGFnICYgMHgwOCkKKworI2RlZmluZQlYRF9TRVRfNE1CKHhkX2NhcmQpCQkoKHhkX2NhcmQpLT5tdWx0aV9mbGFnIHw9IDB4MTApCisjZGVmaW5lCVhEX0NMUl80TUIoeGRfY2FyZCkJCSgoeGRfY2FyZCktPm11bHRpX2ZsYWcgJj0gfjB4MTApCisjZGVmaW5lCVhEX0NIS180TUIoeGRfY2FyZCkJCSgoeGRfY2FyZCktPm11bHRpX2ZsYWcgJiAweDEwKQorCisjZGVmaW5lCVhEX1NFVF9FQ0NfRVJSKHhkX2NhcmQpCQkoKHhkX2NhcmQpLT5tdWx0aV9mbGFnIHw9IDB4NDApCisjZGVmaW5lCVhEX0NMUl9FQ0NfRVJSKHhkX2NhcmQpCQkoKHhkX2NhcmQpLT5tdWx0aV9mbGFnICY9IH4weDQwKQorI2RlZmluZQlYRF9DSEtfRUNDX0VSUih4ZF9jYXJkKQkJKCh4ZF9jYXJkKS0+bXVsdGlfZmxhZyAmIDB4NDApCisKKy8qIE9mZnNldCBpbiB4RCByZWR1bmRhbnQgYnVmZmVyICovCisjZGVmaW5lIFBBR0VfU1RBVFVTCQkwCisjZGVmaW5lIEJMT0NLX1NUQVRVUwkJMQorI2RlZmluZSBCTE9DS19BRERSMV9MCQkyCisjZGVmaW5lIEJMT0NLX0FERFIxX0gJCTMKKyNkZWZpbmUgQkxPQ0tfQUREUjJfTAkJNAorI2RlZmluZSBCTE9DS19BRERSMl9ICQk1CisjZGVmaW5lIFJFU0VSVkVEMAkJNgorI2RlZmluZSBSRVNFUlZFRDEJCTcKKyNkZWZpbmUgUkVTRVJWRUQyCQk4CisjZGVmaW5lIFJFU0VSVkVEMwkJOQorI2RlZmluZSBQQVJJVFkJCQkxMAorCisvKiBGb3IgQ0lTIGJsb2NrICovCisjZGVmaW5lCUNJUzBfMAkJCTAKKyNkZWZpbmUJQ0lTMF8xCQkJMQorI2RlZmluZQlDSVMwXzIJCQkyCisjZGVmaW5lCUNJUzBfMwkJCTMKKyNkZWZpbmUJQ0lTMF80CQkJNAorI2RlZmluZQlDSVMwXzUJCQk1CisjZGVmaW5lCUNJUzBfNgkJCTYKKyNkZWZpbmUJQ0lTMF83CQkJNworI2RlZmluZQlDSVMwXzgJCQk4CisjZGVmaW5lCUNJUzBfOQkJCTkKKyNkZWZpbmUJQ0lTMV8wCQkJMjU2CisjZGVmaW5lCUNJUzFfMQkJCSgyNTYgKyAxKQorI2RlZmluZQlDSVMxXzIJCQkoMjU2ICsgMikKKyNkZWZpbmUJQ0lTMV8zCQkJKDI1NiArIDMpCisjZGVmaW5lCUNJUzFfNAkJCSgyNTYgKyA0KQorI2RlZmluZQlDSVMxXzUJCQkoMjU2ICsgNSkKKyNkZWZpbmUJQ0lTMV82CQkJKDI1NiArIDYpCisjZGVmaW5lCUNJUzFfNwkJCSgyNTYgKyA3KQorI2RlZmluZQlDSVMxXzgJCQkoMjU2ICsgOCkKKyNkZWZpbmUJQ0lTMV85CQkJKDI1NiArIDkpCisKK2ludCByZXNldF94ZF9jYXJkKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7CitpbnQgeGRfZGVsYXlfd3JpdGUoc3RydWN0IHJ0czUxeF9jaGlwICpjaGlwKTsKK2ludCB4ZF9ydyhzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCwgdTMyIHN0YXJ0X3NlY3RvciwKKwkgIHUxNiBzZWN0b3JfY250KTsKK3ZvaWQgeGRfZnJlZV9sMnBfdGJsKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7Cit2b2lkIHhkX2NsZWFudXBfd29yayhzdHJ1Y3QgcnRzNTF4X2NoaXAgKmNoaXApOworaW50IHhkX3Bvd2VyX29mZl9jYXJkM3YzKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7CitpbnQgcmVsZWFzZV94ZF9jYXJkKHN0cnVjdCBydHM1MXhfY2hpcCAqY2hpcCk7CisKKyNlbmRpZiAvKiBfX1JUUzUxWF9YRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzX3BzdG9yL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3J0c19wc3Rvci9NYWtlZmlsZQppbmRleCA2MTYwOWFlLi40MjUzM2QzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzX3BzdG9yL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHNfcHN0b3IvTWFrZWZpbGUKQEAgLTEsNCArMSw0IEBACi1FWFRSQV9DRkxBR1MJOj0gLUlkcml2ZXJzL3Njc2kKK2NjZmxhZ3MgOj0gLUlkcml2ZXJzL3Njc2kKIAogb2JqLSQoQ09ORklHX1JUU19QU1RPUikJOj0gcnRzX3BzdG9yLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0c19wc3Rvci9ydHN4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzX3BzdG9yL3J0c3guYwppbmRleCAxNmM3M2ZiLi40ODBiMGVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzX3BzdG9yL3J0c3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzX3BzdG9yL3J0c3guYwpAQCAtMzYsNyArMzYsNyBAQAogI2luY2x1ZGUgInNkLmgiCiAjaW5jbHVkZSAieGQuaCIKIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAJCSJ2MS4xMCIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYxLjEwIgogCiBNT0RVTEVfREVTQ1JJUFRJT04oIlJlYWx0ZWsgUENJLUV4cHJlc3MgY2FyZCByZWFkZXIgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CkBAIC03Nyw3ICs3Nyw3IEBACiAJcmV0dXJuICJTQ1NJIGVtdWxhdGlvbiBmb3IgUENJLUV4cHJlc3MgTWFzcyBTdG9yYWdlIGRldmljZXMiOwogfQogCi1zdGF0aWMgaW50IHNsYXZlX2FsbG9jIChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYpCitzdGF0aWMgaW50IHNsYXZlX2FsbG9jKHN0cnVjdCBzY3NpX2RldmljZSAqc2RldikKIHsKIAkvKgogCSAqIFNldCB0aGUgSU5RVUlSWSB0cmFuc2ZlciBsZW5ndGggdG8gMzYuICBXZSBkb24ndCB1c2UgYW55IG9mCkBAIC0xMzAsNyArMTMwLDcgQEAKICNkZWZpbmUgU1BSSU5URihhcmdzLi4uKSBcCiAJZG8geyBpZiAocG9zIDwgYnVmZmVyK2xlbmd0aCkgcG9zICs9IHNwcmludGYocG9zLCAjIyBhcmdzKTsgfSB3aGlsZSAoMCkKIAotc3RhdGljIGludCBwcm9jX2luZm8gKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwKK3N0YXRpYyBpbnQgcHJvY19pbmZvKHN0cnVjdCBTY3NpX0hvc3QgKmhvc3QsIGNoYXIgKmJ1ZmZlciwKIAkJY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBpbm91dCkKIHsKIAljaGFyICpwb3MgPSBidWZmZXI7CkBAIC01MDYsMTMgKzUwNiwxNSBAQAogCQkgKi8KIAkJZWxzZSBpZiAoY2hpcC0+c3JiLT5kZXZpY2UtPmlkKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIkJhZCB0YXJnZXQgbnVtYmVyICglZDolZClcbiIsCi0JCQkJICBjaGlwLT5zcmItPmRldmljZS0+aWQsIGNoaXAtPnNyYi0+ZGV2aWNlLT5sdW4pOworCQkJCWNoaXAtPnNyYi0+ZGV2aWNlLT5pZCwKKwkJCQljaGlwLT5zcmItPmRldmljZS0+bHVuKTsKIAkJCWNoaXAtPnNyYi0+cmVzdWx0ID0gRElEX0JBRF9UQVJHRVQgPDwgMTY7CiAJCX0KIAogCQllbHNlIGlmIChjaGlwLT5zcmItPmRldmljZS0+bHVuID4gY2hpcC0+bWF4X2x1bikgewogCQkJcHJpbnRrKEtFUk5fRVJSICJCYWQgTFVOICglZDolZClcbiIsCi0JCQkJICBjaGlwLT5zcmItPmRldmljZS0+aWQsIGNoaXAtPnNyYi0+ZGV2aWNlLT5sdW4pOworCQkJCWNoaXAtPnNyYi0+ZGV2aWNlLT5pZCwKKwkJCQljaGlwLT5zcmItPmRldmljZS0+bHVuKTsKIAkJCWNoaXAtPnNyYi0+cmVzdWx0ID0gRElEX0JBRF9UQVJHRVQgPDwgMTY7CiAJCX0KIApAQCAtNjI1LDI2ICs2MjcsMjMgQEAKIAlpbnQgcmV0dmFsOwogCXUzMiBzdGF0dXM7CiAKLQlpZiAoZGV2KSB7CisJaWYgKGRldikKIAkJY2hpcCA9IGRldi0+Y2hpcDsKLQl9IGVsc2UgeworCWVsc2UKIAkJcmV0dXJuIElSUV9OT05FOwotCX0KIAotCWlmICghY2hpcCkgeworCWlmICghY2hpcCkKIAkJcmV0dXJuIElSUV9OT05FOwotCX0KIAogCXNwaW5fbG9jaygmZGV2LT5yZWdfbG9jayk7CiAKIAlyZXR2YWwgPSBydHN4X3ByZV9oYW5kbGVfaW50ZXJydXB0KGNoaXApOwogCWlmIChyZXR2YWwgPT0gU1RBVFVTX0ZBSUwpIHsKIAkJc3Bpbl91bmxvY2soJmRldi0+cmVnX2xvY2spOwotCQlpZiAoY2hpcC0+aW50X3JlZyA9PSAweEZGRkZGRkZGKSB7CisJCWlmIChjaGlwLT5pbnRfcmVnID09IDB4RkZGRkZGRkYpCiAJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JCX0gZWxzZSB7CisJCWVsc2UKIAkJCXJldHVybiBJUlFfTk9ORTsKLQkJfQogCX0KIAogCXN0YXR1cyA9IGNoaXAtPmludF9yZWc7CkBAIC02NjEsOSArNjYwLDggQEAKIAogCWlmIChzdGF0dXMgJiAoTkVFRF9DT01QTEVURV9JTlQgfCBERUxJTktfSU5UKSkgewogCQlpZiAoc3RhdHVzICYgKFRSQU5TX0ZBSUxfSU5UIHwgREVMSU5LX0lOVCkpIHsKLQkJCWlmIChzdGF0dXMgJiBERUxJTktfSU5UKSB7CisJCQlpZiAoc3RhdHVzICYgREVMSU5LX0lOVCkKIAkJCQlSVFNYX1NFVF9ERUxJTksoY2hpcCk7Ci0JCQl9CiAJCQlkZXYtPnRyYW5zX3Jlc3VsdCA9IFRSQU5TX1JFU1VMVF9GQUlMOwogCQkJaWYgKGRldi0+ZG9uZSkKIAkJCQljb21wbGV0ZShkZXYtPmRvbmUpOwpAQCAtODQ0LDcgKzg0Miw5IEBACiAJY2hpcC0+c3NjX2VuID0gMTsKIAljaGlwLT5zZF9zcGVlZF9wcmlvciA9IDB4MDEwNDAyMDM7CiAJY2hpcC0+c2RfY3VycmVudF9wcmlvciA9IDB4MDAwMTAyMDM7Ci0JY2hpcC0+c2RfY3RsID0gU0RfUFVTSF9QT0lOVF9BVVRPIHwgU0RfU0FNUExFX1BPSU5UX0FVVE8gfCBTVVBQT1JUX01NQ19ERFJfTU9ERTsKKwljaGlwLT5zZF9jdGwgPSBTRF9QVVNIX1BPSU5UX0FVVE8gfAorCQkgICAgICAgU0RfU0FNUExFX1BPSU5UX0FVVE8gfAorCQkgICAgICAgU1VQUE9SVF9NTUNfRERSX01PREU7CiAJY2hpcC0+c2RfZGRyX3R4X3BoYXNlID0gMDsKIAljaGlwLT5tbWNfZGRyX3R4X3BoYXNlID0gMTsKIAljaGlwLT5zZF9kZWZhdWx0X3R4X3BoYXNlID0gMTU7CkBAIC04OTYsNyArODk2LDggQEAKIAljaGlwLT5zM19wd3Jfb2ZmX2RlbGF5ID0gMTAwMDsKIH0KIAotc3RhdGljIGludCBfX2RldmluaXQgcnRzeF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpLCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQorc3RhdGljIGludCBfX2RldmluaXQgcnRzeF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpLAorCQkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCiB7CiAJc3RydWN0IFNjc2lfSG9zdCAqaG9zdDsKIAlzdHJ1Y3QgcnRzeF9kZXYgKmRldjsKQEAgLTkxMyw3ICs5MTQsOCBAQAogCiAJZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwY2ksIENSX0RSSVZFUl9OQU1FKTsKIAlpZiAoZXJyIDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIlBDSSByZXF1ZXN0IHJlZ2lvbnMgZm9yICVzIGZhaWxlZCFcbiIsIENSX0RSSVZFUl9OQU1FKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJQQ0kgcmVxdWVzdCByZWdpb25zIGZvciAlcyBmYWlsZWQhXG4iLAorCQkgICAgICAgQ1JfRFJJVkVSX05BTUUpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC05MzQsOSArOTM2LDggQEAKIAltZW1zZXQoZGV2LCAwLCBzaXplb2Yoc3RydWN0IHJ0c3hfZGV2KSk7CiAKIAlkZXYtPmNoaXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcnRzeF9jaGlwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRldi0+Y2hpcCA9PSBOVUxMKSB7CisJaWYgKGRldi0+Y2hpcCA9PSBOVUxMKQogCQlnb3RvIGVycm91dDsKLQl9CiAKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT5yZWdfbG9jayk7CiAJbXV0ZXhfaW5pdCgmKGRldi0+ZGV2X211dGV4KSk7CkBAIC05NTAsNyArOTUxLDggQEAKIAlkZXYtPnBjaSA9IHBjaTsKIAlkZXYtPmlycSA9IC0xOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiUmVzb3VyY2UgbGVuZ3RoOiAweCV4XG4iLCAodW5zaWduZWQgaW50KXBjaV9yZXNvdXJjZV9sZW4ocGNpLCAwKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiUmVzb3VyY2UgbGVuZ3RoOiAweCV4XG4iLAorCSAgICAgICAodW5zaWduZWQgaW50KXBjaV9yZXNvdXJjZV9sZW4ocGNpLCAwKSk7CiAJZGV2LT5hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaSwgMCk7CiAJZGV2LT5yZW1hcF9hZGRyID0gaW9yZW1hcF9ub2NhY2hlKGRldi0+YWRkciwgcGNpX3Jlc291cmNlX2xlbihwY2ksIDApKTsKIAlpZiAoZGV2LT5yZW1hcF9hZGRyID09IE5VTEwpIHsKQEAgLTk1OSw5ICs5NjEsMTIgQEAKIAkJZ290byBlcnJvdXQ7CiAJfQogCi0JLyogVXNpbmcgInVuc2lnbmVkIGxvbmciIGNhc3QgaGVyZSB0byBlbGltaW5hdGUgZ2NjIHdhcm5pbmcgaW4gNjQtYml0IHN5c3RlbSAqLworCS8qCisJICogVXNpbmcgInVuc2lnbmVkIGxvbmciIGNhc3QgaGVyZSB0byBlbGltaW5hdGUgZ2NjIHdhcm5pbmcgaW4KKwkgKiA2NC1iaXQgc3lzdGVtCisJICovCiAJcHJpbnRrKEtFUk5fSU5GTyAiT3JpZ2luYWwgYWRkcmVzczogMHglbHgsIHJlbWFwcGVkIGFkZHJlc3M6IDB4JWx4XG4iLAotCQkJKHVuc2lnbmVkIGxvbmcpKGRldi0+YWRkciksICh1bnNpZ25lZCBsb25nKShkZXYtPnJlbWFwX2FkZHIpKTsKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpKGRldi0+YWRkciksICh1bnNpZ25lZCBsb25nKShkZXYtPnJlbWFwX2FkZHIpKTsKIAogCWRldi0+cnRzeF9yZXN2X2J1ZiA9IGRtYV9hbGxvY19jb2hlcmVudCgmKHBjaS0+ZGV2KSwgUlRTWF9SRVNWX0JVRl9MRU4sCiAJCQkmKGRldi0+cnRzeF9yZXN2X2J1Zl9hZGRyKSwgR0ZQX0tFUk5FTCk7CkBAIC05NzMsNyArOTc4LDggQEAKIAlkZXYtPmNoaXAtPmhvc3RfY21kc19wdHIgPSBkZXYtPnJ0c3hfcmVzdl9idWY7CiAJZGV2LT5jaGlwLT5ob3N0X2NtZHNfYWRkciA9IGRldi0+cnRzeF9yZXN2X2J1Zl9hZGRyOwogCWRldi0+Y2hpcC0+aG9zdF9zZ190YmxfcHRyID0gZGV2LT5ydHN4X3Jlc3ZfYnVmICsgSE9TVF9DTURTX0JVRl9MRU47Ci0JZGV2LT5jaGlwLT5ob3N0X3NnX3RibF9hZGRyID0gZGV2LT5ydHN4X3Jlc3ZfYnVmX2FkZHIgKyBIT1NUX0NNRFNfQlVGX0xFTjsKKwlkZXYtPmNoaXAtPmhvc3Rfc2dfdGJsX2FkZHIgPSBkZXYtPnJ0c3hfcmVzdl9idWZfYWRkciArCisJCQkJICAgICAgSE9TVF9DTURTX0JVRl9MRU47CiAKIAlkZXYtPmNoaXAtPnJ0c3ggPSBkZXY7CiAKQEAgLTEwNTgsMTAgKzEwNjQsMTAgQEAKIH0KIAogLyogUENJIElEcyAqLwotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHJ0c3hfaWRzW10gPSB7Ci0JeyAweDEwRUMsIDB4NTIwOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX09USEVSUyA8PCAxNiwgMHhGRjAwMDAgfSwKLQl7IDB4MTBFQywgMHg1MjA5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQ0xBU1NfT1RIRVJTIDw8IDE2LCAweEZGMDAwMCB9LAotCXsgMHgxMEVDLCAweDUyODgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9DTEFTU19PVEhFUlMgPDwgMTYsIDB4RkYwMDAwIH0sCitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUocnRzeF9pZHMpID0geworCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1JFQUxURUssIDB4NTIwOCksIFBDSV9DTEFTU19PVEhFUlMgPDwgMTYsIDB4RkYwMDAwIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfUkVBTFRFSywgMHg1MjA5KSwgUENJX0NMQVNTX09USEVSUyA8PCAxNiwgMHhGRjAwMDAgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9SRUFMVEVLLCAweDUyODgpLCBQQ0lfQ0xBU1NfT1RIRVJTIDw8IDE2LCAweEZGMDAwMCB9LAogCXsgMCwgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHNfcHN0b3IvcnRzeC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0c19wc3Rvci9ydHN4LmgKaW5kZXggODZlNDdjMi4uMWFiNDJmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0c19wc3Rvci9ydHN4LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0c19wc3Rvci9ydHN4LmgKQEAgLTI0LDggKzI0LDggQEAKICNpZm5kZWYgX19SRUFMVEVLX1JUU1hfSAogI2RlZmluZSBfX1JFQUxURUtfUlRTWF9ICiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtODAsNyArODAsNyBAQAogCiAjZGVmaW5lIHdhaXRfdGltZW91dF94KHRhc2tfc3RhdGUsIG1zZWNzKQkJXAogZG8gewkJCQkJCQlcCi0JCXNldF9jdXJyZW50X3N0YXRlKCh0YXNrX3N0YXRlKSk7IAlcCisJCXNldF9jdXJyZW50X3N0YXRlKCh0YXNrX3N0YXRlKSk7CVwKIAkJc2NoZWR1bGVfdGltZW91dCgobXNlY3MpICogSFogLyAxMDAwKTsJXAogfSB3aGlsZSAoMCkKICNkZWZpbmUgd2FpdF90aW1lb3V0KG1zZWNzKQl3YWl0X3RpbWVvdXRfeChUQVNLX0lOVEVSUlVQVElCTEUsIChtc2VjcykpCkBAIC0xMDIsMTIgKzEwMiwxMiBAQAogc3RydWN0IHJ0c3hfY2hpcDsKIAogc3RydWN0IHJ0c3hfZGV2IHsKLQlzdHJ1Y3QgcGNpX2RldiAJCSpwY2k7CisJc3RydWN0IHBjaV9kZXYgKnBjaTsKIAogCS8qIHBjaSByZXNvdXJjZXMgKi8KIAl1bnNpZ25lZCBsb25nIAkJYWRkcjsKIAl2b2lkIF9faW9tZW0gCQkqcmVtYXBfYWRkcjsKLQlpbnQgCQkJaXJxOworCWludCBpcnE7CiAKIAkvKiBsb2NrcyAqLwogCXNwaW5sb2NrX3QgCQlyZWdfbG9jazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHNfcHN0b3IvcnRzeF9zY3NpLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzX3BzdG9yL3J0c3hfc2NzaS5jCmluZGV4IDdkZTFmYWUuLmYyZTU4NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHNfcHN0b3IvcnRzeF9zY3NpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0c19wc3Rvci9ydHN4X3Njc2kuYwpAQCAtMjczMCw3ICsyNzMwLDcgQEAKIAkJYnVmX2xlbiA9IGRhdGFfbGVuID0gMHg2QTsKIAl9CiAKLQlidWYgPSAodTggKilrbWFsbG9jKGJ1Zl9sZW4sIEdGUF9LRVJORUwpOworCWJ1ZiA9IGttYWxsb2MoYnVmX2xlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpIHsKIAkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0c19wc3Rvci9zZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0c19wc3Rvci9zZC5jCmluZGV4IDhkYjE0ZGQuLmFhYjY5MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHNfcHN0b3Ivc2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzX3BzdG9yL3NkLmMKQEAgLTMxMzQsNDEgKzMxMzQsNDAgQEAKIAogCWlmIChjaGlwLT5zZF9jdGwgJiBSRVNFVF9NTUNfRklSU1QpIHsKIAkJcmV0dmFsID0gcmVzZXRfbW1jKGNoaXApOwotCQlpZiAoKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgJiYgIXNkX2NoZWNrX2Vycl9jb2RlKGNoaXAsIFNEX05PX0NBUkQpKSB7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCWlmIChzZF9jaGVja19lcnJfY29kZShjaGlwLCBTRF9OT19DQVJEKSkKKwkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCiAJCQlyZXR2YWwgPSByZXNldF9zZChjaGlwKTsKIAkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCQlpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTIwOSkpIHsKLQkJCQkJcmV0dmFsID0gc2RfY2hhbmdlX2Jhbmtfdm9sdGFnZShjaGlwLCBTRF9JT18zVjMpOwotCQkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOwotCQkJCQl9Ci0JCQkJfQorCQkJCWlmIChDSEVDS19QSUQoY2hpcCwgMHg1MjA5KSkKKwkJCQkJc2RfY2hhbmdlX2Jhbmtfdm9sdGFnZShjaGlwLCBTRF9JT18zVjMpOworCisJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKIAkJCX0KIAkJfQogCX0gZWxzZSB7CiAJCXJldHZhbCA9IHJlc2V0X3NkKGNoaXApOwogCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQlpZiAoc2RfY2hlY2tfZXJyX2NvZGUoY2hpcCwgU0RfTk9fQ0FSRCkpIHsKKwkJCWlmIChzZF9jaGVja19lcnJfY29kZShjaGlwLCBTRF9OT19DQVJEKSkKIAkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOwotCQkJfQogCiAJCQlpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTIwOSkpIHsKIAkJCQlyZXR2YWwgPSBzZF9jaGFuZ2VfYmFua192b2x0YWdlKGNoaXAsIFNEX0lPXzNWMyk7Ci0JCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCiAJCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7Ci0JCQkJfQogCQkJfQogCi0JCQlpZiAoIWNoaXAtPnNkX2lvKSB7CisJCQlpZiAoY2hpcC0+c2RfaW8pIHsKKwkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJfSBlbHNlIHsKIAkJCQlyZXR2YWwgPSByZXNldF9tbWMoY2hpcCk7CisJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKKwkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKIAkJCX0KIAkJfQogCX0KIAotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKLQl9Ci0KIAlyZXR2YWwgPSBzZF9zZXRfY2xvY2tfZGl2aWRlcihjaGlwLCBTRF9DTEtfRElWSURFXzApOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKQEAgLTQxMzksNyArNDEzOCw3IEBACiAJCWNtZFszXSA9IHNyYi0+Y21uZFs1XTsKIAkJY21kWzRdID0gc3JiLT5jbW5kWzZdOwogCi0JCWJ1ZiA9ICh1OCAqKWttYWxsb2MoZGF0YV9sZW4sIEdGUF9LRVJORUwpOworCQlidWYgPSBrbWFsbG9jKGRhdGFfbGVuLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGJ1ZiA9PSBOVUxMKSB7CiAJCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKIAkJfQpAQCAtNDM4NSw3ICs0Mzg0LDcgQEAKIAkJdTE2IGk7CiAJCXU4ICpidWY7CiAKLQkJYnVmID0gKHU4ICopa21hbGxvYyhkYXRhX2xlbiwgR0ZQX0tFUk5FTCk7CisJCWJ1ZiA9IGttYWxsb2MoZGF0YV9sZW4sIEdGUF9LRVJORUwpOwogCQlpZiAoYnVmID09IE5VTEwpIHsKIAkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzX3BzdG9yL3NwaS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0c19wc3Rvci9zcGkuYwppbmRleCBjODAzYmE2Li42YjM2Y2M1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzX3BzdG9yL3NwaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHNfcHN0b3Ivc3BpLmMKQEAgLTQ2Myw3ICs0NjMsNyBAQAogCX0KIAogCWlmIChsZW4pIHsKLQkJYnVmID0gKHU4ICopa21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCQlidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CiAJCWlmICghYnVmKQogCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19FUlJPUik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zZXAvc2VwX2RyaXZlci5jIGIvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfZHJpdmVyLmMKaW5kZXggYmY3Mjg2ZS4uOGFjM2ZhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfZHJpdmVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NlcC9zZXBfZHJpdmVyLmMKQEAgLTI0MjAsMTEgKzI0MjAsMTIgQEAKIAkJCQkoc2VwLT5waWRfZG9pbmdfdHJhbnNhY3Rpb24gIT0gMCkpIHsKIAkJZGV2X2RiZygmc2VwLT5wZGV2LT5kZXYsICJpb2N0bCBwaWQgaXMgbm90IG93bmVyXG4iKTsKIAkJZXJyb3IgPSAtRUFDQ0VTOwotCQlnb3RvIGVuZF9mdW5jdGlvbjsKIAl9Ci0KIAltdXRleF91bmxvY2soJnNlcC0+c2VwX211dGV4KTsKIAorCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCiAJaWYgKF9JT0NfVFlQRShjbWQpICE9IFNFUF9JT0NfTUFHSUNfTlVNQkVSKQogCQlyZXR1cm4gLUVOT1RUWTsKIApAQCAtMjQ2MSw3ICsyNDYyLDYgQEAKIAkJYnJlYWs7CiAJfQogCi1lbmRfZnVuY3Rpb246CiAJbXV0ZXhfdW5sb2NrKCZzZXAtPmlvY3RsX211dGV4KTsKIAlyZXR1cm4gZXJyb3I7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2VycXRfdXNiMi9zZXJxdF91c2IyLmMgYi9kcml2ZXJzL3N0YWdpbmcvc2VycXRfdXNiMi9zZXJxdF91c2IyLmMKaW5kZXggMTJmNWViYS4uYzQ0ZTQxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NlcnF0X3VzYjIvc2VycXRfdXNiMi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zZXJxdF91c2IyL3NlcnF0X3VzYjIuYwpAQCAtMjQsNyArMjQsNiBAQAogI2RlZmluZSBEUklWRVJfREVTQyAiUXVhdGVjaCBVU0IgdG8gU2VyaWFsIERyaXZlciIKIAogI2RlZmluZQlVU0JfVkVORE9SX0lEX1FVQVRFQ0gJCQkweDA2MWQJLyogUXVhdGVjaCBWSUQgKi8KLSNkZWZpbmUgUVVBVEVDSF9TU1UxMDAJMHhDMDIwCS8qIFNTVTEwMCAqLwogI2RlZmluZSBRVUFURUNIX1NTVTIwMAkweEMwMzAJLyogU1NVMjAwICovCiAjZGVmaW5lIFFVQVRFQ0hfRFNVMTAwCTB4QzA0MAkvKiBEU1UxMDAgKi8KICNkZWZpbmUgUVVBVEVDSF9EU1UyMDAJMHhDMDUwCS8qIERTVTIwMCAqLwpAQCAtMTI3LDcgKzEyNiw2IEBACiAjZGVmaW5lIFJTMjMyX01PREUgICAgICAgICAgMHgwMAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgc2VycXRfaWRfdGFibGVbXSA9IHsKLQl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1FVQVRFQ0gsIFFVQVRFQ0hfU1NVMTAwKX0sCiAJe1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9RVUFURUNILCBRVUFURUNIX1NTVTIwMCl9LAogCXtVU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfUVVBVEVDSCwgUVVBVEVDSF9EU1UxMDApfSwKIAl7VVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1FVQVRFQ0gsIFFVQVRFQ0hfRFNVMjAwKX0sCkBAIC0xOTAsNyArMTg4LDcgQEAKIAogCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQ7CS8qIG93bmVyIG9mIHRoaXMgb2JqZWN0ICovCiAJc3RydWN0IHF0X2dldF9kZXZpY2VfZGF0YSBEZXZpY2VEYXRhOwotCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKIAlib29sIHJlYWRfdXJiX2J1c3k7CiAJaW50IFJ4SG9sZGluZzsKIAlpbnQgUmVhZEJ1bGtTdG9wcGVkOwpAQCAtNzQ1LDcgKzc0Myw3IEBACiAJCQl9CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQotCQlzcGluX2xvY2tfaW5pdCgmcXRfcG9ydC0+bG9jayk7CisJCW11dGV4X2luaXQoJnF0X3BvcnQtPmxvY2spOwogCiAJCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0LCBxdF9wb3J0KTsKIApAQCAtNzc1LDcgKzc3Myw2IEBACiAJfQogCiAJc3dpdGNoIChzZXJpYWwtPmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpIHsKLQljYXNlIFFVQVRFQ0hfU1NVMTAwOgogCWNhc2UgUVVBVEVDSF9EU1UxMDA6CiAJY2FzZSBRVUFURUNIX1FTVTEwMDoKIAljYXNlIFFVQVRFQ0hfRVNVMTAwQToKQEAgLTExNjAsNyArMTE1Nyw2IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbDsKIAlzdHJ1Y3QgcXVhdGVjaF9wb3J0ICpxdF9wb3J0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpbnQgcmV0dmFsID0gLUVJTlZBTDsKIApAQCAtMTE3Niw3ICsxMTcyLDcgQEAKIAogCXF0X3BvcnQgPSBxdF9nZXRfcG9ydF9wcml2YXRlKHBvcnQpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnF0X3BvcnQtPmxvY2ssIGZsYWdzKTsKKwltdXRleF9sb2NrKCZxdF9wb3J0LT5sb2NrKTsKIAogCWRiZygiJXMgLSBwb3J0ICVkXG4iLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIApAQCAtMTE4NSw3ICsxMTgxLDcgQEAKIAkJCXJldHZhbCA9IHBvcnQtPmJ1bGtfb3V0X3NpemU7CiAJfQogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXRfcG9ydC0+bG9jaywgZmxhZ3MpOworCW11dGV4X3VubG9jaygmcXRfcG9ydC0+bG9jayk7CiAJcmV0dXJuIHJldHZhbDsKIAogfQpAQCAtMTM1OCw3ICsxMzU0LDYgQEAKIAlzdHJ1Y3QgcXVhdGVjaF9wb3J0ICpxdF9wb3J0OwogCXUxNiBpbmRleCwgb25vZmY7CiAJdW5zaWduZWQgaW50IHJlc3VsdDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaW5kZXggPSB0dHktPmluZGV4IC0gc2VyaWFsLT5taW5vcjsKIApAQCAtMTM2OSw3ICsxMzY0LDcgQEAKIAllbHNlCiAJCW9ub2ZmID0gMDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZxdF9wb3J0LT5sb2NrLCBmbGFncyk7CisJbXV0ZXhfbG9jaygmcXRfcG9ydC0+bG9jayk7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZFxuIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKQEAgLTEzNzcsNyArMTM3Miw3IEBACiAJICAgIHVzYl9jb250cm9sX21zZyhzZXJpYWwtPmRldiwgdXNiX3NuZGN0cmxwaXBlKHNlcmlhbC0+ZGV2LCAwKSwKIAkJCSAgICBRVF9CUkVBS19DT05UUk9MLCAweDQwLCBvbm9mZiwgaW5kZXgsIE5VTEwsIDAsIDMwMCk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdF9wb3J0LT5sb2NrLCBmbGFncyk7CisJbXV0ZXhfdW5sb2NrKCZxdF9wb3J0LT5sb2NrKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgcXRfcmVhbF90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LApAQCAtMTQ2NiwyMSArMTQ2MSwyMCBAQAogCXN0cnVjdCB1c2Jfc2VyaWFsICpzZXJpYWwgPSBnZXRfdXNiX3NlcmlhbChwb3J0LCBfX2Z1bmNfXyk7CiAJc3RydWN0IHF1YXRlY2hfcG9ydCAqcXRfcG9ydCA9IHF0X2dldF9wb3J0X3ByaXZhdGUocG9ydCk7CiAJaW50IHJldHZhbCA9IC1FTk9ERVY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWRiZygiSW4gJXNcbiIsIF9fZnVuY19fKTsKIAogCWlmICghc2VyaWFsKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZxdF9wb3J0LT5sb2NrLCBmbGFncyk7CisJbXV0ZXhfbG9jaygmcXRfcG9ydC0+bG9jayk7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZFxuIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAJZGJnKCIlcyAtIHBvcnQtPlJ4SG9sZGluZyA9ICVkXG4iLCBfX2Z1bmNfXywgcXRfcG9ydC0+UnhIb2xkaW5nKTsKIAogCXJldHZhbCA9IHF0X3JlYWxfdGlvY21nZXQodHR5LCBwb3J0LCBzZXJpYWwpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXRfcG9ydC0+bG9jaywgZmxhZ3MpOworCW11dGV4X3VubG9jaygmcXRfcG9ydC0+bG9jayk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMTQ5MSw3ICsxNDg1LDYgQEAKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAlzdHJ1Y3QgdXNiX3NlcmlhbCAqc2VyaWFsID0gZ2V0X3VzYl9zZXJpYWwocG9ydCwgX19mdW5jX18pOwogCXN0cnVjdCBxdWF0ZWNoX3BvcnQgKnF0X3BvcnQgPSBxdF9nZXRfcG9ydF9wcml2YXRlKHBvcnQpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldHZhbCA9IC1FTk9ERVY7CiAKIAlkYmcoIkluICVzXG4iLCBfX2Z1bmNfXyk7CkBAIC0xNDk5LDE0ICsxNDkyLDE0IEBACiAJaWYgKCFzZXJpYWwpCiAJCXJldHVybiAtRU5PREVWOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnF0X3BvcnQtPmxvY2ssIGZsYWdzKTsKKwltdXRleF9sb2NrKCZxdF9wb3J0LT5sb2NrKTsKIAogCWRiZygiJXMgLSBwb3J0ICVkXG4iLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIAlkYmcoIiVzIC0gcXRfcG9ydC0+UnhIb2xkaW5nID0gJWRcbiIsIF9fZnVuY19fLCBxdF9wb3J0LT5SeEhvbGRpbmcpOwogCiAJcmV0dmFsID0gcXRfcmVhbF90aW9jbXNldCh0dHksIHBvcnQsIHNlcmlhbCwgc2V0KTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnF0X3BvcnQtPmxvY2ssIGZsYWdzKTsKKwltdXRleF91bmxvY2soJnF0X3BvcnQtPmxvY2spOwogCXJldHVybiByZXR2YWw7CiB9CiAKQEAgLTE1MTUsNyArMTUwOCw2IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IGdldF91c2Jfc2VyaWFsKHBvcnQsIF9fZnVuY19fKTsKIAlzdHJ1Y3QgcXVhdGVjaF9wb3J0ICpxdF9wb3J0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlkYmcoIiVzIC0gcG9ydCAlZFxuIiwgX19mdW5jX18sIHBvcnQtPm51bWJlcik7CiAKQEAgLTE1MjQsMTMgKzE1MTYsMTMgQEAKIAogCXF0X3BvcnQgPSBxdF9nZXRfcG9ydF9wcml2YXRlKHBvcnQpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnF0X3BvcnQtPmxvY2ssIGZsYWdzKTsKKwltdXRleF9sb2NrKCZxdF9wb3J0LT5sb2NrKTsKIAogCS8qIHBhc3Mgb24gdG8gdGhlIGRyaXZlciBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb24gKi8KIAlxdF9wb3J0LT5SeEhvbGRpbmcgPSAxOwogCWRiZygiJXMgLSBwb3J0LT5SeEhvbGRpbmcgPSAxXG4iLCBfX2Z1bmNfXyk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdF9wb3J0LT5sb2NrLCBmbGFncyk7CisJbXV0ZXhfdW5sb2NrKCZxdF9wb3J0LT5sb2NrKTsKIAlyZXR1cm47CiB9CiAKQEAgLTE1MzksNyArMTUzMSw2IEBACiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAJc3RydWN0IHVzYl9zZXJpYWwgKnNlcmlhbCA9IGdldF91c2Jfc2VyaWFsKHBvcnQsIF9fZnVuY19fKTsKIAlzdHJ1Y3QgcXVhdGVjaF9wb3J0ICpxdF9wb3J0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IHJlc3VsdDsKIAogCWlmICghc2VyaWFsKQpAQCAtMTU0Nyw3ICsxNTM4LDcgQEAKIAogCXF0X3BvcnQgPSBxdF9nZXRfcG9ydF9wcml2YXRlKHBvcnQpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnF0X3BvcnQtPmxvY2ssIGZsYWdzKTsKKwltdXRleF9sb2NrKCZxdF9wb3J0LT5sb2NrKTsKIAogCWRiZygiJXMgLSBwb3J0ICVkXG4iLCBfX2Z1bmNfXywgcG9ydC0+bnVtYmVyKTsKIApAQCAtMTU3Myw3ICsxNTY0LDcgQEAKIAkJCQkgICAgX19mdW5jX18sIHJlc3VsdCk7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXRfcG9ydC0+bG9jaywgZmxhZ3MpOworCW11dGV4X3VubG9jaygmcXRfcG9ydC0+bG9jayk7CiAJcmV0dXJuOwogCiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203eHgvc210Y2ZiLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203eHgvc210Y2ZiLmMKaW5kZXggYTE2NGZjNC4uMzlkYmYzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4L3NtdGNmYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTd4eC9zbXRjZmIuYwpAQCAtMzUsMTEgKzM1LDEzIEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjcmVlbl9pbmZvLmg+CiAKICNpZmRlZiBDT05GSUdfUE0KICNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2VuZGlmCiAKICNpbmNsdWRlICJzbXRjZmIuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2Zmc3BvcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVjdHJhL2Zmc3BvcnQuYwppbmRleCA1MDY1NDdiLi44NmQ1NTZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlY3RyYS9mZnNwb3J0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWN0cmEvZmZzcG9ydC5jCkBAIC0yMjcsMTkgKzIyNywxMiBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YoaW5mbykpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWJ1ZiA9IGttYWxsb2MoSWRlbnRpZnlEZXZpY2VEYXRhLlBhZ2VEYXRhU2l6ZSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFidWYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpb2N0bF93cml0ZV9wYWdlX2RhdGE6ICIKLQkJICAgICAgICJmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgKHZvaWQgX191c2VyICopaW5mby5kYXRhLAotCQkJICAgSWRlbnRpZnlEZXZpY2VEYXRhLlBhZ2VEYXRhU2l6ZSkpIHsKKwlidWYgPSBtZW1kdXBfdXNlcigodm9pZCBfX3VzZXIgKilpbmZvLmRhdGEsCisJCQkgIElkZW50aWZ5RGV2aWNlRGF0YS5QYWdlRGF0YVNpemUpOworCWlmIChJU19FUlIoYnVmKSkgewogCQlwcmludGsoS0VSTl9FUlIgImlvY3RsX3dyaXRlX3BhZ2VfZGF0YTogIgogCQkgICAgICAgImZhaWxlZCB0byBjb3B5IHVzZXIgZGF0YVxuIik7Ci0JCWtmcmVlKGJ1Zik7Ci0JCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gUFRSX0VSUihidWYpOwogCX0KIAogCW11dGV4X2xvY2soJnNwZWN0cmFfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3RlX3JtaTQvc3luYXB0aWNzX2kyY19ybWk0LmMgYi9kcml2ZXJzL3N0YWdpbmcvc3RlX3JtaTQvc3luYXB0aWNzX2kyY19ybWk0LmMKaW5kZXggMzZmNGNiNy4uMTE3MjhhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3N0ZV9ybWk0L3N5bmFwdGljc19pMmNfcm1pNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zdGVfcm1pNC9zeW5hcHRpY3NfaTJjX3JtaTQuYwpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgInN5bmFwdGljc19pMmNfcm1pNC5oIgogCiAvKiBUT0RPOiBmb3IgbXVsdGlwbGUgZGV2aWNlIHN1cHBvcnQgd2lsbCBuZWVkIGEgcGVyLWRldmljZSBtdXRleCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2dlbi9naC5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2dlbi9naC5jCmluZGV4IGNkNzI1MDMuLjYwYWE3YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9nZW4vZ2guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvZ2VuL2doLmMKQEAgLTU1LDcgKzU1LDcgQEAKIAloYXNoX3RhYi0+bWF0Y2ggPSBtYXRjaDsKIAloYXNoX3RhYi0+ZGVsZXRlID0gZGVsZXRlID09IE5VTEwgPyBub29wIDogZGVsZXRlOwogCi0JaGFzaF90YWItPmJ1Y2tldHMgPSAoc3RydWN0IGVsZW1lbnQgKiopCisJaGFzaF90YWItPmJ1Y2tldHMgPQogCSAgICBremFsbG9jKHNpemVvZihzdHJ1Y3QgZWxlbWVudCAqKSAqIG1heF9idWNrZXQsIEdGUF9LRVJORUwpOwogCWlmIChoYXNoX3RhYi0+YnVja2V0cyA9PSBOVUxMKSB7CiAJCWdoX2RlbGV0ZShoYXNoX3RhYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaHcvaHdfbW11LmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvaHcvaHdfbW11LmMKaW5kZXggYzIxNGRmOS4uOGE5M2Q1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2h3L2h3X21tdS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ody9od19tbXUuYwpAQCAtNTU4LDUgKzU1OCw1IEBACiAKIHZvaWQgaHdfbW11X3RsYl9mbHVzaF9hbGwoY29uc3Qgdm9pZCBfX2lvbWVtICpiYXNlKQogewotCV9fcmF3X3dyaXRlYigxLCBiYXNlICsgTU1VX0dGTFVTSCk7CisJX19yYXdfd3JpdGVsKDEsIGJhc2UgKyBNTVVfR0ZMVVNIKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViLmggYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yi5oCmluZGV4IDEzMmFkYzUuLmQ0MDczNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWIuaApAQCAtMTcsNiArMTcsOSBAQAogICogVVNBLgogICovCiAKKyNpZm5kZWYgX19VU0JJUF9TVFVCX0gKKyNkZWZpbmUgX19VU0JJUF9TVFVCX0gKKwogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KQEAgLTEwNiwzICsxMDksNSBAQAogCQkJICAgICBfX3UzMiBzdGF0dXMpOwogdm9pZCBzdHViX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYik7CiBpbnQgc3R1Yl90eF9sb29wKHZvaWQgKmRhdGEpOworCisjZW5kaWYgLyogX19VU0JJUF9TVFVCX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX2Rldi5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfZGV2LmMKaW5kZXggZmNlMjJmMi4uNTVjMGI1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfZGV2LmMKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgInVzYmlwX2NvbW1vbi5oIgogI2luY2x1ZGUgInN0dWIuaCIKQEAgLTUyNCwxMSArNTI1LDExIEBACiAJfQogfQogCi0vKiAKKy8qCiAgKiBQcmVzZW5jZSBvZiBwcmVfcmVzZXQgYW5kIHBvc3RfcmVzZXQgcHJldmVudHMgdGhlIGRyaXZlciBmcm9tIGJlaW5nIHVuYm91bmQKICAqIHdoZW4gdGhlIGRldmljZSBpcyBiZWluZyByZXNldAogICovCi0gCisKIGludCBzdHViX3ByZV9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZXJmYWNlKQogewogCWRldl9kYmcoJmludGVyZmFjZS0+ZGV2LCAicHJlX3Jlc2V0XG4iKTsKQEAgLTU0OCw0ICs1NDksNCBAQAogCS5pZF90YWJsZQk9IHN0dWJfdGFibGUsCiAJLnByZV9yZXNldAk9IHN0dWJfcHJlX3Jlc2V0LAogCS5wb3N0X3Jlc2V0CT0gc3R1Yl9wb3N0X3Jlc2V0LAotIH07Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfbWFpbi5jCmluZGV4IGEzNDI0OWEuLjJkNjMxNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX21haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9tYWluLmMKQEAgLTE4LDYgKzE4LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlICJ1c2JpcF9jb21tb24uaCIKICNpbmNsdWRlICJzdHViLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9yeC5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3N0dWJfcnguYwppbmRleCA1MzhmYjllLi42YjRlM2UxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvc3R1Yl9yeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC9zdHViX3J4LmMKQEAgLTE3NSwxMiArMTc1LDExIEBACiAJZGV2X2luZm8oJnVyYi0+ZGV2LT5kZXYsICJ1c2JfcXVldWVfcmVzZXRfZGV2aWNlXG4iKTsKIAogCS8qCi0JICogV2l0aCB0aGUgaW1wbGVtZW50YXRpb24gb2YgcHJlX3Jlc2V0IGFuZCBwb3N0X3Jlc2V0IHRoZSBkcml2ZXIgbm8gCisJICogV2l0aCB0aGUgaW1wbGVtZW50YXRpb24gb2YgcHJlX3Jlc2V0IGFuZCBwb3N0X3Jlc2V0IHRoZSBkcml2ZXIgbm8KIAkgKiBsb25nZXIgdW5iaW5kcy4gVGhpcyBhbGxvd3MgdGhlIHVzZSBvZiBzeW5jaHJvbm91cyByZXNldC4KIAkgKi8KIAotCWlmICh1c2JfbG9ja19kZXZpY2VfZm9yX3Jlc2V0KHNkZXYtPnVkZXYsIHNkZXYtPmludGVyZmFjZSk8MCkKLQl7CisJaWYgKHVzYl9sb2NrX2RldmljZV9mb3JfcmVzZXQoc2Rldi0+dWRldiwgc2Rldi0+aW50ZXJmYWNlKSA8IDApIHsKIAkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgImNvdWxkIG5vdCBvYnRhaW4gbG9jayB0byByZXNldCBkZXZpY2VcbiIpOwogCQlyZXR1cm4gMDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfY29tbW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfY29tbW9uLmgKaW5kZXggMDc0YWM0Mi4uYmUyMTYxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzYmlwX2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2JpcF9jb21tb24uaApAQCAtMTI2LDEyICsxMjYsMTIgQEAKICAqCiAgKi8KICNkZWZpbmUgVVNCSVBfQ01EX1NVQk1JVAkweDAwMDEKLSNkZWZpbmUgVVNCSVBfUkVUX1NVQk1JVAkweDAwMDIKLSNkZWZpbmUgVVNCSVBfQ01EX1VOTElOSwkweDAwMDMKKyNkZWZpbmUgVVNCSVBfQ01EX1VOTElOSwkweDAwMDIKKyNkZWZpbmUgVVNCSVBfUkVUX1NVQk1JVAkweDAwMDMKICNkZWZpbmUgVVNCSVBfUkVUX1VOTElOSwkweDAwMDQKIAotI2RlZmluZSBVU0JJUF9ESVJfSU4JMHgwMAotI2RlZmluZSBVU0JJUF9ESVJfT1VUCTB4MDEKKyNkZWZpbmUgVVNCSVBfRElSX09VVAkweDAwCisjZGVmaW5lIFVTQklQX0RJUl9JTgkweDAxCiAKIC8qKgogICogc3RydWN0IHVzYmlwX2hlYWRlcl9iYXNpYyAtIGRhdGEgcGVydGluZW50IHRvIGV2ZXJ5IHJlcXVlc3QKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2JpcF9wcm90b2NvbC50eHQgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfcHJvdG9jb2wudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMTAyMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNiaXBfcHJvdG9jb2wudHh0CkBAIC0wLDAgKzEsMzU4IEBACitQUkVMSU1JTkFSWSBEUkFGVCwgTUFZIENPTlRBSU4gTUlTVEFLRVMhCisyOCBKdW4gMjAxMQorCitUaGUgVVNCL0lQIHByb3RvY29sIGZvbGxvd3MgYSBzZXJ2ZXIvY2xpZW50IGFyY2hpdGVjdHVyZS4gVGhlIHNlcnZlciBleHBvcnRzIHRoZQorVVNCIGRldmljZXMgYW5kIHRoZSBjbGllbnRzIGltcG9ydHMgdGhlbS4gVGhlIGRldmljZSBkcml2ZXIgZm9yIHRoZSBleHBvcnRlZAorVVNCIGRldmljZSBydW5zIG9uIHRoZSBjbGllbnQgbWFjaGluZS4KKworVGhlIGNsaWVudCBtYXkgYXNrIGZvciB0aGUgbGlzdCBvZiB0aGUgZXhwb3J0ZWQgVVNCIGRldmljZXMuIFRvIGdldCB0aGUgbGlzdCB0aGUKK2NsaWVudCBvcGVucyBhIFRDUC9JUCBjb25uZWN0aW9uIHRvd2FyZHMgdGhlIHNlcnZlciwgYW5kIHNlbmRzIGFuIE9QX1JFUV9ERVZMSVNUCitwYWNrZXQgb24gdG9wIG9mIHRoZSBUQ1AvSVAgY29ubmVjdGlvbiAoc28gdGhlIGFjdHVhbCBPUF9SRVFfREVWTElTVCBtYXkgYmUgc2VudAoraW4gb25lIG9yIG1vcmUgcGllY2VzIGF0IHRoZSBsb3cgbGV2ZWwgdHJhbnNwb3J0IGxheWVyKS4gVGhlIHNlcnZlciBzZW5kcyBiYWNrCit0aGUgT1BfUkVQX0RFVkxJU1QgcGFja2V0IHdoaWNoIGxpc3RzIHRoZSBleHBvcnRlZCBVU0IgZGV2aWNlcy4gRmluYWxseSB0aGUKK1RDUC9JUCBjb25uZWN0aW9uIGlzIGNsb3NlZC4KKworIHZpcnR1YWwgaG9zdCBjb250cm9sbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNiIGhvc3QKKyAgICAgICJjbGllbnQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2ZXIiCisgIChpbXBvcnRzIFVTQiBkZXZpY2VzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4cG9ydHMgVVNCIGRldmljZXMpCisgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIE9QX1JFUV9ERVZMSVNUICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiB8CisgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIE9QX1JFUF9ERVZMSVNUICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgfCA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CisgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisKK09uY2UgdGhlIGNsaWVudCBrbm93cyB0aGUgbGlzdCBvZiBleHBvcnRlZCBVU0IgZGV2aWNlcyBpdCBtYXkgZGVjaWRlIHRvIHVzZSBvbmUKK29mIHRoZW0uIEZpcnN0IHRoZSBjbGllbnQgb3BlbnMgYSBUQ1AvSVAgY29ubmVjdGlvbiB0b3dhcmRzIHRoZSBzZXJ2ZXIgYW5kCitzZW5kcyBhbiBPUF9SRVFfSU1QT1JUIHBhY2tldC4gVGhlIHNlcnZlciByZXBsaWVzIHdpdGggT1BfUkVQX0lNUE9SVC4gSWYgdGhlCitpbXBvcnQgd2FzIHN1Y2Nlc3NmdWwgdGhlIFRDUC9JUCBjb25uZWN0aW9uIHJlbWFpbnMgb3BlbiBhbmQgd2lsbCBiZSB1c2VkCit0byB0cmFzZmVyIHRoZSBVUkIgdHJhZmZpYyBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuIFRoZSBjbGllbnQgbWF5CitzZW5kIHR3byB0eXBlcyBvZiBwYWNrZXRzOiB0aGUgVVNCSVBfQ01EX1NVQk1JVCB0byBzdWJtaXQgYW4gVVJCLCBhbmQKK1VTQklQX0NNRF9VTkxJTksgdG8gdW5saW5rIGEgcHJldmlvdXNseSBzdWJtaXR0ZWQgVVJCLiBUaGUgYW5zd2VycyBvZiB0aGUKK3NlcnZlciBtYXkgYmUgVVNCSVBfUkVUX1NVQk1JVCBhbmQgVVNCSVBfUkVUX1VOTElOSyByZXNwZWN0aXZlbHkuCisKKyB2aXJ0dWFsIGhvc3QgY29udHJvbGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYiBob3N0CisgICAgICAiY2xpZW50IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VydmVyIgorICAoaW1wb3J0cyBVU0IgZGV2aWNlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHBvcnRzIFVTQiBkZXZpY2VzKQorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICBPUF9SRVFfSU1QT1JUICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gfAorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICBPUF9SRVBfSU1QT1JUICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgICAgICAgICAgICBVU0JJUF9DTURfU1VCTUlUKHNlcW51bSA9IG4pICAgICAgICAgfAorICAgICAgICAgIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gfAorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgICAgICAgICAgICBVU0JJUF9SRVRfU1VCTUlUKHNlcW51bSA9IG4pICAgICAgICAgfAorICAgICAgICAgIHwgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgICAgICAgICAgICBVU0JJUF9DTURfU1VCTUlUKHNlcW51bSA9IG0pICAgICAgICAgfAorICAgICAgICAgIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gfAorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgICAgICAgICAgICBVU0JJUF9DTURfU1VCTUlUKHNlcW51bSA9IG0rMSkgICAgICAgfAorICAgICAgICAgIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gfAorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgICAgICAgICAgICBVU0JJUF9DTURfU1VCTUlUKHNlcW51bSA9IG0rMikgICAgICAgfAorICAgICAgICAgIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gfAorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgICAgICAgICAgICBVU0JJUF9SRVRfU1VCTUlUKHNlcW51bSA9IG0pICAgICAgICAgfAorICAgICAgICAgIHwgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgICAgICAgICAgICBVU0JJUF9DTURfU1VCTUlUKHNlcW51bSA9IG0rMykgICAgICAgfAorICAgICAgICAgIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gfAorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgICAgICAgICAgICBVU0JJUF9SRVRfU1VCTUlUKHNlcW51bSA9IG0rMSkgICAgICAgfAorICAgICAgICAgIHwgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgICAgICAgICAgICBVU0JJUF9DTURfU1VCTUlUKHNlcW51bSA9IG0rNCkgICAgICAgfAorICAgICAgICAgIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gfAorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgICAgICAgICAgICBVU0JJUF9SRVRfU1VCTUlUKHNlcW51bSA9IG0rMikgICAgICAgfAorICAgICAgICAgIHwgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICA6ICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgICAgICAgICAgICAgICBVU0JJUF9DTURfVU5MSU5LICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gfAorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgICAgICAgICAgICAgICBVU0JJUF9SRVRfVU5MSU5LICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgIHwgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCitUaGUgZmllbGRzIGFyZSBpbiBuZXR3b3JrIChiaWcgZW5kaWFuKSBieXRlIG9yZGVyIG1lYW5pbmcgdGhhdCB0aGUgbW9zdCBzaWduaWZpY2FudAorYnl0ZSAoTVNCKSBpcyBzdG9yZWQgYXQgdGhlIGxvd2VzdCBhZGRyZXNzLgorCisKK09QX1JFUV9ERVZMSVNUOiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBleHBvcnRlZCBVU0IgZGV2aWNlcy4KKworIE9mZnNldCAgICB8IExlbmd0aCB8IFZhbHVlICAgICAgfCBEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDAgICAgICAgICB8IDIgICAgICB8IDB4MDEwMCAgICAgfCBCaW5hcnktY29kZWQgZGVjaW1hbCBVU0JJUCB2ZXJzaW9uIG51bWJlcjogdjEuMC4wCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMiAgICAgICAgIHwgMiAgICAgIHwgMHg4MDA1ICAgICB8IENvbW1hbmQgY29kZTogUmV0cmlldmUgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgVVNCCisgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgICB8ICAgZGV2aWNlcy4KKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyA0ICAgICAgICAgfCA0ICAgICAgfCAweDAwMDAwMDAwIHwgU3RhdHVzOiB1bnVzZWQsIHNoYWxsIGJlIHNldCB0byAwCisKK09QX1JFUF9ERVZMSVNUOiBSZXBseSB3aXRoIHRoZSBsaXN0IG9mIGV4cG9ydGVkIFVTQiBkZXZpY2VzLgorCisgT2Zmc2V0ICAgIHwgTGVuZ3RoIHwgVmFsdWUgICAgICB8IERlc2NyaXB0aW9uCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMCAgICAgICAgIHwgMiAgICAgIHwgMHgwMTAwICAgICB8IEJpbmFyeS1jb2RlZCBkZWNpbWFsIFVTQklQIHZlcnNpb24gbnVtYmVyOiB2MS4wLjAuCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMiAgICAgICAgIHwgMiAgICAgIHwgMHgwMDA1ICAgICB8IFJlcGx5IGNvZGU6IFRoZSBsaXN0IG9mIGV4cG9ydGVkIFVTQiBkZXZpY2VzLgorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDQgICAgICAgICB8IDQgICAgICB8IDB4MDAwMDAwMDAgfCBTdGF0dXM6IDAgZm9yIE9LCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgOCAgICAgICAgIHwgNCAgICAgIHwgbiAgICAgICAgICB8IE51bWJlciBvZiBleHBvcnRlZCBkZXZpY2VzOiAwIG1lYW5zIG5vIGV4cG9ydGVkCisgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgICB8ICAgZGV2aWNlcy4KKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAweDBDICAgICAgfCAgICAgICAgfCAgICAgICAgICAgIHwgRnJvbSBub3cgb24gdGhlIGV4cG9ydGVkIG4gZGV2aWNlcyBhcmUgZGVzY3JpYmVkLAorICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgfCAgIGlmIGFueS4gSWYgbm8gZGV2aWNlcyBhcmUgZXhwb3J0ZWQgdGhlIG1lc3NhZ2UKKyAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgIHwgICBlbmRzIHdpdGggdGhlIHByZXZpb3VzICJudW1iZXIgb2YgZXhwb3J0ZWQKKyAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgIHwgICBkZXZpY2VzIiBmaWVsZC4KKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgfCAyNTYgICAgfCAgICAgICAgICAgIHwgcGF0aDogUGF0aCBvZiB0aGUgZGV2aWNlIG9uIHRoZSBob3N0IGV4cG9ydGluZyB0aGUKKyAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgIHwgICBVU0IgZGV2aWNlLCBzdHJpbmcgY2xvc2VkIHdpdGggemVybyBieXRlLCBlLmcuCisgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgICB8ICAgIi9zeXMvZGV2aWNlcy9wY2kwMDAwOjAwLzAwMDA6MDA6MWQuMS91c2IzLzMtMiIKKyAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgIHwgICBUaGUgdW51c2VkIGJ5dGVzIHNoYWxsIGJlIGZpbGxlZCB3aXRoIHplcm8KKyAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgIHwgICBieXRlcy4KKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAweDEwQyAgICAgfCAzMiAgICAgfCAgICAgICAgICAgIHwgYnVzaWQ6IEJ1cyBJRCBvZiB0aGUgZXhwb3J0ZWQgZGV2aWNlLCBzdHJpbmcKKyAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgIHwgICBjbG9zZWQgd2l0aCB6ZXJvIGJ5dGUsIGUuZy4gIjMtMiIuIFRoZSB1bnVzZWQKKyAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgIHwgICBieXRlcyBzaGFsbCBiZSBmaWxsZWQgd2l0aCB6ZXJvIGJ5dGVzLgorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDB4MTJDICAgICB8IDQgICAgICB8ICAgICAgICAgICAgfCBidXNudW0KKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAweDEzMCAgICAgfCA0ICAgICAgfCAgICAgICAgICAgIHwgZGV2bnVtCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMHgxMzQgICAgIHwgNCAgICAgIHwgICAgICAgICAgICB8IHNwZWVkCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMHgxMzggICAgIHwgMiAgICAgIHwgICAgICAgICAgICB8IGlkVmVuZG9yCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMHgxM0EgICAgIHwgMiAgICAgIHwgICAgICAgICAgICB8IGlkUHJvZHVjdAorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDB4MTNDICAgICB8IDIgICAgICB8ICAgICAgICAgICAgfCBiY2REZXZpY2UKKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAweDEzRSAgICAgfCAxICAgICAgfCAgICAgICAgICAgIHwgYkRldmljZUNsYXNzCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMHgxM0YgICAgIHwgMSAgICAgIHwgICAgICAgICAgICB8IGJEZXZpY2VTdWJDbGFzcworLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDB4MTQwICAgICB8IDEgICAgICB8ICAgICAgICAgICAgfCBiRGV2aWNlUHJvdG9jb2wKKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAweDE0MSAgICAgfCAxICAgICAgfCAgICAgICAgICAgIHwgYkNvbmZpZ3VyYXRpb25WYWx1ZQorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDB4MTQyICAgICB8IDEgICAgICB8ICAgICAgICAgICAgfCBiTnVtQ29uZmlndXJhdGlvbnMKKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAweDE0MyAgICAgfCAxICAgICAgfCAgICAgICAgICAgIHwgYk51bUludGVyZmFjZXMKKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAweDE0NCAgICAgfCAgICAgICAgfCBtXzAgICAgICAgIHwgRnJvbSBub3cgb24gZWFjaCBpbnRlcmZhY2UgaXMgZGVzY3JpYmVkLCBhbGwKKyAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgIHwgICB0b2dldGhlciBiTnVtSW50ZXJmYWNlcyB0aW1lcywgd2l0aCB0aGUKKyAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgIHwgICB0aGUgZm9sbG93aW5nIDQgZmllbGRzOgorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICB8IDEgICAgICB8ICAgICAgICAgICAgfCBiSW50ZXJmYWNlQ2xhc3MKKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAweDE0NSAgICAgfCAxICAgICAgfCAgICAgICAgICAgIHwgYkludGVyZmFjZVN1YkNsYXNzCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMHgxNDYgICAgIHwgMSAgICAgIHwgICAgICAgICAgICB8IGJJbnRlcmZhY2VQcm90b2NvbAorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDB4MTQ3ICAgICB8IDEgICAgICB8ICAgICAgICAgICAgfCBwYWRkaW5nIGJ5dGUgZm9yIGFsaWdubWVudCwgc2hhbGwgYmUgc2V0IHRvIHplcm8KKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAweEMgKyAgICAgfCAgICAgICAgfCAgICAgICAgICAgIHwgVGhlIHNlY29uZCBleHBvcnRlZCBVU0IgZGV2aWNlIHN0YXJ0cyBhdCBpPTEKKyBpKjB4MTM4ICsgfCAgICAgICAgfCAgICAgICAgICAgIHwgd2l0aCB0aGUgYnVzaWQgZmllbGQuCisgbV8oaS0xKSo0IHwgICAgICAgIHwgICAgICAgICAgICB8CisKK09QX1JFUV9JTVBPUlQ6IFJlcXVlc3QgdG8gaW1wb3J0IChhdHRhY2gpIGEgcmVtb3RlIFVTQiBkZXZpY2UuCisKKyBPZmZzZXQgICAgfCBMZW5ndGggfCBWYWx1ZSAgICAgIHwgRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAwICAgICAgICAgfCAyICAgICAgfCAweDAxMDAgICAgIHwgQmluYXJ5LWNvZGVkIGRlY2ltYWwgVVNCSVAgdmVyc2lvbiBudW1iZXI6IHYxLjAuMAorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDIgICAgICAgICB8IDIgICAgICB8IDB4ODAwMyAgICAgfCBDb21tYW5kIGNvZGU6IGltcG9ydCBhIHJlbW90ZSBVU0IgZGV2aWNlLgorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDQgICAgICAgICB8IDQgICAgICB8IDB4MDAwMDAwMDAgfCBTdGF0dXM6IHVudXNlZCwgc2hhbGwgYmUgc2V0IHRvIDAKKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyA4ICAgICAgICAgfCAzMiAgICAgfCAgICAgICAgICAgIHwgYnVzaWQ6IHRoZSBidXNpZCBvZiB0aGUgZXhwb3J0ZWQgZGV2aWNlIG9uIHRoZQorICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgfCAgIHJlbW90ZSBob3N0LiBUaGUgcG9zc2libGUgdmFsdWVzIGFyZSB0YWtlbgorICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgfCAgIGZyb20gdGhlIG1lc3NhZ2UgZmllbGQgT1BfUkVQX0RFVkxJU1QuYnVzaWQuCisgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgICB8ICAgQSBzdHJpbmcgY2xvc2VkIHdpdGggemVybywgdGhlIHVudXNlZCBieXRlcworICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgfCAgIHNoYWxsIGJlIGZpbGxlZCB3aXRoIHplcm9zLgorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitPUF9SRVBfSU1QT1JUOiBSZXBseSB0byBpbXBvcnQgKGF0dGFjaCkgYSByZW1vdGUgVVNCIGRldmljZS4KKworIE9mZnNldCAgICB8IExlbmd0aCB8IFZhbHVlICAgICAgfCBEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDAgICAgICAgICB8IDIgICAgICB8IDB4MDEwMCAgICAgfCBCaW5hcnktY29kZWQgZGVjaW1hbCBVU0JJUCB2ZXJzaW9uIG51bWJlcjogdjEuMC4wCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMiAgICAgICAgIHwgMiAgICAgIHwgMHgwMDAzICAgICB8IFJlcGx5IGNvZGU6IFJlcGx5IHRvIGltcG9ydC4KKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyA0ICAgICAgICAgfCA0ICAgICAgfCAweDAwMDAwMDAwIHwgU3RhdHVzOiAwIGZvciBPSworICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgIDEgZm9yIGVycm9yCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgOCAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgICB8IEZyb20gbm93IG9uIGNvbWVzIHRoZSBkZXRhaWxzIG9mIHRoZSBpbXBvcnRlZAorICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgfCAgIGRldmljZSwgaWYgdGhlIHByZXZpb3VzIHN0YXR1cyBmaWVsZCB3YXMgT0sgKDApLAorICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgfCAgIG90aGVyd2lzZSB0aGUgcmVwbHkgZW5kcyB3aXRoIHRoZSBzdGF0dXMgZmllbGQuCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgIHwgMjU2ICAgIHwgICAgICAgICAgICB8IHBhdGg6IFBhdGggb2YgdGhlIGRldmljZSBvbiB0aGUgaG9zdCBleHBvcnRpbmcgdGhlCisgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgICB8ICAgVVNCIGRldmljZSwgc3RyaW5nIGNsb3NlZCB3aXRoIHplcm8gYnl0ZSwgZS5nLgorICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgfCAgICIvc3lzL2RldmljZXMvcGNpMDAwMDowMC8wMDAwOjAwOjFkLjEvdXNiMy8zLTIiCisgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgICB8ICAgVGhlIHVudXNlZCBieXRlcyBzaGFsbCBiZSBmaWxsZWQgd2l0aCB6ZXJvCisgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgICB8ICAgYnl0ZXMuCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMHgxMDggICAgIHwgMzIgICAgIHwgICAgICAgICAgICB8IGJ1c2lkOiBCdXMgSUQgb2YgdGhlIGV4cG9ydGVkIGRldmljZSwgc3RyaW5nCisgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgICB8ICAgY2xvc2VkIHdpdGggemVybyBieXRlLCBlLmcuICIzLTIiLiBUaGUgdW51c2VkCisgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgICB8ICAgYnl0ZXMgc2hhbGwgYmUgZmlsbGVkIHdpdGggemVybyBieXRlcy4KKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAweDEyOCAgICAgfCA0ICAgICAgfCAgICAgICAgICAgIHwgYnVzbnVtCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMHgxMkMgICAgIHwgNCAgICAgIHwgICAgICAgICAgICB8IGRldm51bQorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDB4MTMwICAgICB8IDQgICAgICB8ICAgICAgICAgICAgfCBzcGVlZAorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDB4MTM0ICAgICB8IDIgICAgICB8ICAgICAgICAgICAgfCBpZFZlbmRvcgorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDB4MTM2ICAgICB8IDIgICAgICB8ICAgICAgICAgICAgfCBpZFByb2R1Y3QKKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAweDEzOCAgICAgfCAyICAgICAgfCAgICAgICAgICAgIHwgYmNkRGV2aWNlCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMHgxMzkgICAgIHwgMSAgICAgIHwgICAgICAgICAgICB8IGJEZXZpY2VDbGFzcworLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDB4MTNBICAgICB8IDEgICAgICB8ICAgICAgICAgICAgfCBiRGV2aWNlU3ViQ2xhc3MKKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAweDEzQiAgICAgfCAxICAgICAgfCAgICAgICAgICAgIHwgYkRldmljZVByb3RvY29sCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMHgxM0MgICAgIHwgMSAgICAgIHwgICAgICAgICAgICB8IGJDb25maWd1cmF0aW9uVmFsdWUKKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAweDEzRCAgICAgfCAxICAgICAgfCAgICAgICAgICAgIHwgYk51bUNvbmZpZ3VyYXRpb25zCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMHgxM0UgICAgIHwgMSAgICAgIHwgICAgICAgICAgICB8IGJOdW1JbnRlcmZhY2VzCisKK1VTQklQX0NNRF9TVUJNSVQ6IFN1Ym1pdCBhbiBVUkIKKworIE9mZnNldCAgICB8IExlbmd0aCB8IFZhbHVlICAgICAgfCBEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDAgICAgICAgICB8IDQgICAgICB8IDB4MDAwMDAwMDEgfCBjb21tYW5kOiBTdWJtaXQgYW4gVVJCCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgNCAgICAgICAgIHwgNCAgICAgIHwgICAgICAgICAgICB8IHNlcW51bTogdGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgVVJCIHRvIHN1Ym1pdAorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDggICAgICAgICB8IDQgICAgICB8ICAgICAgICAgICAgfCBkZXZpZAorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDB4QyAgICAgICB8IDQgICAgICB8ICAgICAgICAgICAgfCBkaXJlY3Rpb246IDA6IFVTQklQX0RJUl9PVVQKKyAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAxOiBVU0JJUF9ESVJfSU4KKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAweDEwICAgICAgfCA0ICAgICAgfCAgICAgICAgICAgIHwgZXA6IGVuZHBvaW50IG51bWJlciwgcG9zc2libGUgdmFsdWVzIGFyZTogMC4uLjE1CistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMHgxNCAgICAgIHwgNCAgICAgIHwgICAgICAgICAgICB8IHRyYW5zZmVyX2ZsYWdzOiBwb3NzaWJsZSB2YWx1ZXMgZGVwZW5kIG9uIHRoZQorICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgfCAgIFVSQiB0cmFuc2ZlciB0eXBlLCBzZWUgYmVsb3cKKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAweDE4ICAgICAgfCA0ICAgICAgfCAgICAgICAgICAgIHwgdHJhbnNmZXJfYnVmZmVyX2xlbmd0aAorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDB4MUMgICAgICB8IDQgICAgICB8ICAgICAgICAgICAgfCBzdGFydF9mcmFtZTogc3BlY2lmeSB0aGUgc2VsZWN0ZWQgZnJhbWUgdG8KKyAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgIHwgICB0cmFuc21pdCBhbiBJU08gZnJhbWUsIGlnbm9yZWQgaWYgVVJCX0lTT19BU0FQCisgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgICB8ICAgaXMgc3BlY2lmaWVkIGF0IHRyYW5zZmVyX2ZsYWdzCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMHgyMCAgICAgIHwgNCAgICAgIHwgICAgICAgICAgICB8IG51bWJlcl9vZl9wYWNrZXRzOiBudW1iZXIgb2YgSVNPIHBhY2tldHMKKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAweDI0ICAgICAgfCA0ICAgICAgfCAgICAgICAgICAgIHwgaW50ZXJ2YWw6IG1heGltdW0gdGltZSBmb3IgdGhlIHJlcXVlc3Qgb24gdGhlCisgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgICB8ICAgc2VydmVyLXNpZGUgaG9zdCBjb250cm9sbGVyCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMHgyOCAgICAgIHwgOCAgICAgIHwgICAgICAgICAgICB8IHNldHVwOiBkYXRhIGJ5dGVzIGZvciBVU0Igc2V0dXAsIGZpbGxlZCB3aXRoCisgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgICB8ICAgemVyb3MgaWYgbm90IHVzZWQKKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAweDMwICAgICAgfCAgICAgICAgfCAgICAgICAgICAgIHwgVVJCIGRhdGEuIEZvciBJU08gdHJhbnNmZXJzIHRoZSBwYWRkaW5nIGJldHdlZW4KKyAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgIHwgICBlYWNoIElTTyBwYWNrZXRzIGlzIG5vdCB0cmFuc21pdHRlZC4KKworCisgIEFsbG93ZWQgdHJhbnNmZXJfZmxhZ3MgIHwgdmFsdWUgICAgICB8IGNvbnRyb2wgfCBpbnRlcnJ1cHQgfCBidWxrICAgICB8IGlzb2Nocm9ub3VzCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLQorICBVUkJfU0hPUlRfTk9UX09LICAgICAgICB8IDB4MDAwMDAwMDEgfCBvbmx5IGluIHwgb25seSBpbiAgIHwgb25seSBpbiAgfCBubworICBVUkJfSVNPX0FTQVAgICAgICAgICAgICB8IDB4MDAwMDAwMDIgfCBubyAgICAgIHwgbm8gICAgICAgIHwgbm8gICAgICAgfCB5ZXMKKyAgVVJCX05PX1RSQU5TRkVSX0RNQV9NQVAgfCAweDAwMDAwMDA0IHwgeWVzICAgICB8IHllcyAgICAgICB8IHllcyAgICAgIHwgeWVzCisgIFVSQl9OT19GU0JSICAgICAgICAgICAgIHwgMHgwMDAwMDAyMCB8IHllcyAgICAgfCBubyAgICAgICAgfCBubyAgICAgICB8IG5vCisgIFVSQl9aRVJPX1BBQ0tFVCAgICAgICAgIHwgMHgwMDAwMDA0MCB8IG5vICAgICAgfCBubyAgICAgICAgfCBvbmx5IG91dCB8IG5vCisgIFVSQl9OT19JTlRFUlJVUFQgICAgICAgIHwgMHgwMDAwMDA4MCB8IHllcyAgICAgfCB5ZXMgICAgICAgfCB5ZXMgICAgICB8IHllcworICBVUkJfRlJFRV9CVUZGRVIgICAgICAgICB8IDB4MDAwMDAxMDAgfCB5ZXMgICAgIHwgeWVzICAgICAgIHwgeWVzICAgICAgfCB5ZXMKKyAgVVJCX0RJUl9NQVNLICAgICAgICAgICAgfCAweDAwMDAwMjAwIHwgeWVzICAgICB8IHllcyAgICAgICB8IHllcyAgICAgIHwgeWVzCisKKworVVNCSVBfUkVUX1NVQk1JVDogUmVwbHkgZm9yIHN1Ym1pdHRpbmcgYW4gVVJCCisKKyBPZmZzZXQgICAgfCBMZW5ndGggfCBWYWx1ZSAgICAgIHwgRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAwICAgICAgICAgfCA0ICAgICAgfCAweDAwMDAwMDAzIHwgY29tbWFuZAorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDQgICAgICAgICB8IDQgICAgICB8ICAgICAgICAgICAgfCBzZXFudW06IFVSQiBzZXF1ZW5jZSBudW1iZXIKKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyA4ICAgICAgICAgfCA0ICAgICAgfCAgICAgICAgICAgIHwgZGV2aWQKKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAweEMgICAgICAgfCA0ICAgICAgfCAgICAgICAgICAgIHwgZGlyZWN0aW9uOiAwOiBVU0JJUF9ESVJfT1VUCisgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgMTogVVNCSVBfRElSX0lOCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMHgxMCAgICAgIHwgNCAgICAgIHwgICAgICAgICAgICB8IGVwOiBlbmRwb2ludCBudW1iZXIKKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAweDE0ICAgICAgfCA0ICAgICAgfCAgICAgICAgICAgIHwgc3RhdHVzOiB6ZXJvIGZvciBzdWNjZXNzZnVsIFVSQiB0cmFuc2FjdGlvbiwKKyAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgIHwgICBvdGhlcndpc2Ugc29tZSBraW5kIG9mIGVycm9yIGhhcHBlbmVkLgorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDB4MTggICAgICB8IDQgICAgICB8IG4gICAgICAgICAgfCBhY3R1YWxfbGVuZ3RoOiBudW1iZXIgb2YgVVJCIGRhdGEgYnl0ZXMKKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAweDFDICAgICAgfCA0ICAgICAgfCAgICAgICAgICAgIHwgc3RhcnRfZnJhbWU6IGZvciBhbiBJU08gZnJhbWUgdGhlIGFjdHVhbGx5CisgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgICB8ICAgc2VsZWN0ZWQgZnJhbWUgZm9yIHRyYW5zbWl0LgorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDB4MjAgICAgICB8IDQgICAgICB8ICAgICAgICAgICAgfCBudW1iZXJfb2ZfcGFja2V0cworLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDB4MjQgICAgICB8IDQgICAgICB8ICAgICAgICAgICAgfCBlcnJvcl9jb3VudAorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDB4MjggICAgICB8IDggICAgICB8ICAgICAgICAgICAgfCBzZXR1cDogZGF0YSBieXRlcyBmb3IgVVNCIHNldHVwLCBmaWxsZWQgd2l0aAorICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgfCAgIHplcm9zIGlmIG5vdCB1c2VkCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMHgzMCAgICAgIHwgbiAgICAgIHwgICAgICAgICAgICB8IFVSQiBkYXRhIGJ5dGVzLiBGb3IgSVNPIHRyYW5zZmVycyB0aGUgcGFkZGluZworICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgfCAgIGJldHdlZW4gZWFjaCBJU08gcGFja2V0cyBpcyBub3QgdHJhbnNtaXR0ZWQuCisKK1VTQklQX0NNRF9VTkxJTks6IFVubGluayBhbiBVUkIKKworIE9mZnNldCAgICB8IExlbmd0aCB8IFZhbHVlICAgICAgfCBEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDAgICAgICAgICB8IDQgICAgICB8IDB4MDAwMDAwMDIgfCBjb21tYW5kOiBVUkIgdW5saW5rIGNvbW1hbmQKKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyA0ICAgICAgICAgfCA0ICAgICAgfCAgICAgICAgICAgIHwgc2VxbnVtOiBVUkIgc2VxdWVuY2UgbnVtYmVyIHRvIHVubGluazogRklYTUU6IGlzIHRoaXMgc28/CistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgOCAgICAgICAgIHwgNCAgICAgIHwgICAgICAgICAgICB8IGRldmlkCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMHhDICAgICAgIHwgNCAgICAgIHwgICAgICAgICAgICB8IGRpcmVjdGlvbjogMDogVVNCSVBfRElSX09VVAorICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgIDE6IFVTQklQX0RJUl9JTgorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDB4MTAgICAgICB8IDQgICAgICB8ICAgICAgICAgICAgfCBlcDogZW5kcG9pbnQgbnVtYmVyOiB6ZXJvCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMHgxNCAgICAgIHwgNCAgICAgIHwgICAgICAgICAgICB8IHNlcW51bTogdGhlIFVSQiBzZXF1ZW5jZSBudW1iZXIgZ2l2ZW4gcHJldmlvdXNseQorICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgfCAgIGF0IFVTQklQX0NNRF9TVUJNSVQuc2VxbnVtIGZpZWxkCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMHgzMCAgICAgIHwgbiAgICAgIHwgICAgICAgICAgICB8IFVSQiBkYXRhIGJ5dGVzLiBGb3IgSVNPIHRyYW5zZmVycyB0aGUgcGFkZGluZworICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgfCAgIGJldHdlZW4gZWFjaCBJU08gcGFja2V0cyBpcyBub3QgdHJhbnNtaXR0ZWQuCisKK1VTQklQX1JFVF9VTkxJTks6IFJlcGx5IGZvciBVUkIgdW5saW5rCisKKyBPZmZzZXQgICAgfCBMZW5ndGggfCBWYWx1ZSAgICAgIHwgRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAwICAgICAgICAgfCA0ICAgICAgfCAweDAwMDAwMDA0IHwgY29tbWFuZDogcmVwbHkgZm9yIHRoZSBVUkIgdW5saW5rIGNvbW1hbmQKKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyA0ICAgICAgICAgfCA0ICAgICAgfCAgICAgICAgICAgIHwgc2VxbnVtOiB0aGUgdW5saW5rZWQgVVJCIHNlcXVlbmNlIG51bWJlcgorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDggICAgICAgICB8IDQgICAgICB8ICAgICAgICAgICAgfCBkZXZpZAorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDB4QyAgICAgICB8IDQgICAgICB8ICAgICAgICAgICAgfCBkaXJlY3Rpb246IDA6IFVTQklQX0RJUl9PVVQKKyAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAxOiBVU0JJUF9ESVJfSU4KKy0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAweDEwICAgICAgfCA0ICAgICAgfCAgICAgICAgICAgIHwgZXA6IGVuZHBvaW50IG51bWJlcgorLS0tLS0tLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIDB4MTQgICAgICB8IDQgICAgICB8ICAgICAgICAgICAgfCBzdGF0dXM6IFRoaXMgaXMgdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUKKyAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgIHwgICB1cmItPnN0YXR1cyBpbiB0aGUgVVJCIGNvbXBsZXRpdGlvbiBoYW5kbGVyLgorICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgfCAgIEZJWE1FOiBhIGJldHRlciBleHBsYW5hdGlvbiBuZWVkZWQuCistLS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMHgzMCAgICAgIHwgbiAgICAgIHwgICAgICAgICAgICB8IFVSQiBkYXRhIGJ5dGVzLiBGb3IgSVNPIHRyYW5zZmVycyB0aGUgcGFkZGluZworICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgfCAgIGJldHdlZW4gZWFjaCBJU08gcGFja2V0cyBpcyBub3QgdHJhbnNtaXR0ZWQuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy92aGNpX2RyaXZlci5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9saWJzcmMvdmhjaV9kcml2ZXIuYwppbmRleCBhYmJjMjg1Li4yNjk3ODc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL2xpYnNyYy92aGNpX2RyaXZlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2UvbGlic3JjL3ZoY2lfZHJpdmVyLmMKQEAgLTEzMyw3ICsxMzMsNyBAQAogCQkJICAgICBzdHJsZW4odmhjaV9kcml2ZXItPmhjX2RldmljZS0+cGF0aCkpKSB7CiAJCQkvKiBmb3VuZCB1c2JpcCBkZXZpY2UgKi8KIAkJCXVzYmlwX2NkZXYgPSBjYWxsb2MoMSwgc2l6ZW9mKCp1c2JpcF9jZGV2KSk7Ci0JCQlpZiAoIWNkZXYpIHsKKwkJCWlmICghdXNiaXBfY2RldikgewogCQkJCWRiZygiY2FsbG9jIGZhaWxlZCIpOwogCQkJCXJldHVybiAtMTsKIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3VzYmlwX2F0dGFjaC5jIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfYXR0YWNoLmMKaW5kZXggYjc4ODVhMi4uYmRmNjFjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfYXR0YWNoLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXNiaXBfYXR0YWNoLmMKQEAgLTUxLDcgKzUxLDkgQEAKIAljaGFyIGJ1ZmZbTUFYX0JVRkYrMV07CiAJaW50IHJldDsKIAotCW1rZGlyKFZIQ0lfU1RBVEVfUEFUSCwgMDcwMCk7CisJcmV0ID0gbWtkaXIoVkhDSV9TVEFURV9QQVRILCAwNzAwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC0xOwogCiAJc25wcmludGYocGF0aCwgUEFUSF9NQVgsIFZIQ0lfU1RBVEVfUEFUSCIvcG9ydCVkIiwgcmhwb3J0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXRpbHMuaCBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC91c2Vyc3BhY2Uvc3JjL3V0aWxzLmgKaW5kZXggZmRjYjE0ZC4uNTkxNmZkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3VzZXJzcGFjZS9zcmMvdXRpbHMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdXNlcnNwYWNlL3NyYy91dGlscy5oCkBAIC0yMiwzICsyMiw0IEBACiBpbnQgbW9kaWZ5X21hdGNoX2J1c2lkKGNoYXIgKmJ1c2lkLCBpbnQgYWRkKTsKIAogI2VuZGlmIC8qIF9fVVRJTFNfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaS5oIGIvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2kuaAppbmRleCA3MWE1ODZlLi44OGIzMjk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpLmgKQEAgLTgsNiArOCw5IEBACiAgKgogICovCiAKKyNpZm5kZWYgX19VU0JJUF9WSENJX0gKKyNkZWZpbmUgX19VU0JJUF9WSENJX0gKKwogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgpAQCAtMTI5LDMgKzEzMiw1IEBACiB7CiAJcmV0dXJuIHZoY2lfdG9faGNkKHZoY2kpLT5zZWxmLmNvbnRyb2xsZXI7CiB9CisKKyNlbmRpZiAvKiBfX1VTQklQX1ZIQ0lfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5jIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV9jYTkxY3g0Mi5jCmluZGV4IDUxMjJjMTMuLjBlNGZlYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfY2E5MWN4NDIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX2NhOTFjeDQyLmMKQEAgLTE1MDAsNiArMTUwMCwyOCBAQAogCiB9CiAKK3ZvaWQgKmNhOTFjeDQyX2FsbG9jX2NvbnNpc3RlbnQoc3RydWN0IGRldmljZSAqcGFyZW50LCBzaXplX3Qgc2l6ZSwKKwlkbWFfYWRkcl90ICpkbWEpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisKKwkvKiBGaW5kIHBjaV9kZXYgY29udGFpbmVyIG9mIGRldiAqLworCXBkZXYgPSBjb250YWluZXJfb2YocGFyZW50LCBzdHJ1Y3QgcGNpX2RldiwgZGV2KTsKKworCXJldHVybiBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplLCBkbWEpOworfQorCit2b2lkIGNhOTFjeDQyX2ZyZWVfY29uc2lzdGVudChzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIHNpemVfdCBzaXplLCB2b2lkICp2YWRkciwKKwlkbWFfYWRkcl90IGRtYSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKworCS8qIEZpbmQgcGNpX2RldiBjb250YWluZXIgb2YgZGV2ICovCisJcGRldiA9IGNvbnRhaW5lcl9vZihwYXJlbnQsIHN0cnVjdCBwY2lfZGV2LCBkZXYpOworCisJcGNpX2ZyZWVfY29uc2lzdGVudChwZGV2LCBzaXplLCB2YWRkciwgZG1hKTsKK30KKwogc3RhdGljIGludCBfX2luaXQgY2E5MWN4NDJfaW5pdCh2b2lkKQogewogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZjYTkxY3g0Ml9kcml2ZXIpOwpAQCAtMTc2OSw2ICsxNzkxLDggQEAKIAljYTkxY3g0Ml9icmlkZ2UtPmxtX2F0dGFjaCA9IGNhOTFjeDQyX2xtX2F0dGFjaDsKIAljYTkxY3g0Ml9icmlkZ2UtPmxtX2RldGFjaCA9IGNhOTFjeDQyX2xtX2RldGFjaDsKIAljYTkxY3g0Ml9icmlkZ2UtPnNsb3RfZ2V0ID0gY2E5MWN4NDJfc2xvdF9nZXQ7CisJY2E5MWN4NDJfYnJpZGdlLT5hbGxvY19jb25zaXN0ZW50ID0gY2E5MWN4NDJfYWxsb2NfY29uc2lzdGVudDsKKwljYTkxY3g0Ml9icmlkZ2UtPmZyZWVfY29uc2lzdGVudCA9IGNhOTFjeDQyX2ZyZWVfY29uc2lzdGVudDsKIAogCWRhdGEgPSBpb3JlYWQzMihjYTkxY3g0Ml9kZXZpY2UtPmJhc2UgKyBNSVNDX0NUTCk7CiAJZGV2X2luZm8oJnBkZXYtPmRldiwgIkJvYXJkIGlzJXMgdGhlIFZNRSBzeXN0ZW0gY29udHJvbGxlclxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmMgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2JyaWRnZXMvdm1lX3RzaTE0OC5jCmluZGV4IDljNTM5NTEuLjZjMTE2N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYwpAQCAtMjExNCw2ICsyMTE0LDI4IEBACiAJcmV0dXJuIChpbnQpc2xvdDsKIH0KIAordm9pZCAqdHNpMTQ4X2FsbG9jX2NvbnNpc3RlbnQoc3RydWN0IGRldmljZSAqcGFyZW50LCBzaXplX3Qgc2l6ZSwKKwlkbWFfYWRkcl90ICpkbWEpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisKKwkvKiBGaW5kIHBjaV9kZXYgY29udGFpbmVyIG9mIGRldiAqLworCXBkZXYgPSBjb250YWluZXJfb2YocGFyZW50LCBzdHJ1Y3QgcGNpX2RldiwgZGV2KTsKKworCXJldHVybiBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplLCBkbWEpOworfQorCit2b2lkIHRzaTE0OF9mcmVlX2NvbnNpc3RlbnQoc3RydWN0IGRldmljZSAqcGFyZW50LCBzaXplX3Qgc2l6ZSwgdm9pZCAqdmFkZHIsCisJZG1hX2FkZHJfdCBkbWEpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisKKwkvKiBGaW5kIHBjaV9kZXYgY29udGFpbmVyIG9mIGRldiAqLworCXBkZXYgPSBjb250YWluZXJfb2YocGFyZW50LCBzdHJ1Y3QgcGNpX2RldiwgZGV2KTsKKworCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZSwgdmFkZHIsIGRtYSk7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IHRzaTE0OF9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnRzaTE0OF9kcml2ZXIpOwpAQCAtMjQ0Myw2ICsyNDY1LDggQEAKIAl0c2kxNDhfYnJpZGdlLT5sbV9hdHRhY2ggPSB0c2kxNDhfbG1fYXR0YWNoOwogCXRzaTE0OF9icmlkZ2UtPmxtX2RldGFjaCA9IHRzaTE0OF9sbV9kZXRhY2g7CiAJdHNpMTQ4X2JyaWRnZS0+c2xvdF9nZXQgPSB0c2kxNDhfc2xvdF9nZXQ7CisJdHNpMTQ4X2JyaWRnZS0+YWxsb2NfY29uc2lzdGVudCA9IHRzaTE0OF9hbGxvY19jb25zaXN0ZW50OworCXRzaTE0OF9icmlkZ2UtPmZyZWVfY29uc2lzdGVudCA9IHRzaTE0OF9mcmVlX2NvbnNpc3RlbnQ7CiAKIAlkYXRhID0gaW9yZWFkMzJiZSh0c2kxNDhfZGV2aWNlLT5iYXNlICsgVFNJMTQ4X0xDU1JfVlNUQVQpOwogCWRldl9pbmZvKCZwZGV2LT5kZXYsICJCb2FyZCBpcyVzIHRoZSBWTUUgc3lzdGVtIGNvbnRyb2xsZXJcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3VzZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfdXNlci5jCmluZGV4IDkxZDJjYzcuLjdkY2QxNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfdXNlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfdXNlci5jCkBAIC00Myw3ICs0Myw3IEBACiBzdGF0aWMgREVGSU5FX01VVEVYKHZtZV91c2VyX211dGV4KTsKIHN0YXRpYyBjb25zdCBjaGFyIGRyaXZlcl9uYW1lW10gPSAidm1lX3VzZXIiOwogCi1zdGF0aWMgaW50IGJ1c1tVU0VSX0JVU19NQVhdOworc3RhdGljIGludCBidXNbVk1FX1VTRVJfQlVTX01BWF07CiBzdGF0aWMgdW5zaWduZWQgaW50IGJ1c19udW07CiAKIC8qIEN1cnJlbnRseSBEb2N1bWVudGF0aW9uL2RldmljZXMudHh0IGRlZmluZXMgdGhlIGZvbGxvd2luZyBmb3IgVk1FOgpAQCAtMTE2LDcgKzExNiw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2RldiAqdm1lX3VzZXJfY2RldjsJCS8qIENoYXJhY3RlciBkZXZpY2UgKi8KIHN0YXRpYyBzdHJ1Y3QgY2xhc3MgKnZtZV91c2VyX3N5c2ZzX2NsYXNzOwkvKiBTeXNmcyBjbGFzcyAqLwotc3RhdGljIHN0cnVjdCBkZXZpY2UgKnZtZV91c2VyX2JyaWRnZTsJCS8qIFBvaW50ZXIgdG8gYnJpZGdlIGRldmljZSAqLworc3RhdGljIHN0cnVjdCB2bWVfZGV2ICp2bWVfdXNlcl9icmlkZ2U7CQkvKiBQb2ludGVyIHRvIHVzZXIgZGV2aWNlICovCiAKIAogc3RhdGljIGNvbnN0IGludCB0eXBlW1ZNRV9ERVZTXSA9IHsJTUFTVEVSX01JTk9SLAlNQVNURVJfTUlOT1IsCkBAIC0xMzUsOCArMTM1LDkgQEAKIHN0YXRpYyBsb2ZmX3Qgdm1lX3VzZXJfbGxzZWVrKHN0cnVjdCBmaWxlICosIGxvZmZfdCwgaW50KTsKIHN0YXRpYyBsb25nIHZtZV91c2VyX3VubG9ja2VkX2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHZtZV91c2VyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKiwgaW50LCBpbnQpOwotc3RhdGljIGludCBfX2RldmV4aXQgdm1lX3VzZXJfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKiwgaW50LCBpbnQpOworc3RhdGljIGludCB2bWVfdXNlcl9tYXRjaChzdHJ1Y3Qgdm1lX2RldiAqKTsKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZtZV91c2VyX3Byb2JlKHN0cnVjdCB2bWVfZGV2ICopOworc3RhdGljIGludCBfX2RldmV4aXQgdm1lX3VzZXJfcmVtb3ZlKHN0cnVjdCB2bWVfZGV2ICopOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2bWVfdXNlcl9mb3BzID0gewogCS5vcGVuID0gdm1lX3VzZXJfb3BlbiwKQEAgLTYyMCw2ICs2MjEsNyBAQAogCiBzdGF0aWMgc3RydWN0IHZtZV9kcml2ZXIgdm1lX3VzZXJfZHJpdmVyID0gewogCS5uYW1lID0gZHJpdmVyX25hbWUsCisJLm1hdGNoID0gdm1lX3VzZXJfbWF0Y2gsCiAJLnByb2JlID0gdm1lX3VzZXJfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHZtZV91c2VyX3JlbW92ZSksCiB9OwpAQCAtNjI4LDggKzYzMCw2IEBACiBzdGF0aWMgaW50IF9faW5pdCB2bWVfdXNlcl9pbml0KHZvaWQpCiB7CiAJaW50IHJldHZhbCA9IDA7Ci0JaW50IGk7Ci0Jc3RydWN0IHZtZV9kZXZpY2VfaWQgKmlkczsKIAogCXByaW50ayhLRVJOX0lORk8gIlZNRSBVc2VyIFNwYWNlIEFjY2VzcyBEcml2ZXJcbiIpOwogCkBAIC02NDMsNTYgKzY0Myw0MiBAQAogCS8qIExldCdzIHN0YXJ0IGJ5IHN1cHBvcnRpbmcgb25lIGJ1cywgd2UgY2FuIHN1cHBvcnQgbW9yZSB0aGFuIG9uZQogCSAqIGluIGZ1dHVyZSByZXZpc2lvbnMgaWYgdGhhdCBldmVyIGJlY29tZXMgbmVjZXNzYXJ5LgogCSAqLwotCWlmIChidXNfbnVtID4gVVNFUl9CVVNfTUFYKSB7CisJaWYgKGJ1c19udW0gPiBWTUVfVVNFUl9CVVNfTUFYKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IERyaXZlciBvbmx5IGFibGUgdG8gaGFuZGxlICVkIGJ1c2VzXG4iLAotCQkJZHJpdmVyX25hbWUsIFVTRVJfQlVTX01BWCk7Ci0JCWJ1c19udW0gPSBVU0VSX0JVU19NQVg7CisJCQlkcml2ZXJfbmFtZSwgVk1FX1VTRVJfQlVTX01BWCk7CisJCWJ1c19udW0gPSBWTUVfVVNFUl9CVVNfTUFYOwogCX0KIAotCi0JLyogRHluYW1pY2FsbHkgY3JlYXRlIHRoZSBiaW5kIHRhYmxlIGJhc2VkIG9uIG1vZHVsZSBwYXJhbWV0ZXJzICovCi0JaWRzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZtZV9kZXZpY2VfaWQpICogKGJ1c19udW0gKyAxKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGlkcyA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBJRCB0YWJsZVxuIiwKLQkJCWRyaXZlcl9uYW1lKTsKLQkJcmV0dmFsID0gLUVOT01FTTsKLQkJZ290byBlcnJfaWQ7Ci0JfQotCi0JbWVtc2V0KGlkcywgMCwgKHNpemVvZihzdHJ1Y3Qgdm1lX2RldmljZV9pZCkgKiAoYnVzX251bSArIDEpKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYnVzX251bTsgaSsrKSB7Ci0JCWlkc1tpXS5idXMgPSBidXNbaV07Ci0JCS8qCi0JCSAqIFdlIHJlZ2lzdGVyIHRoZSBkcml2ZXIgYWdhaW5zdCB0aGUgc2xvdCBvY2N1cGllZCBieSAqdGhpcyoKLQkJICogY2FyZCwgc2luY2UgaXQncyByZWFsbHkgYSBsb3cgbGV2ZWwgd2F5IG9mIGNvbnRyb2xsaW5nCi0JCSAqIHRoZSBWTUUgYnJpZGdlCi0JCSAqLwotCQlpZHNbaV0uc2xvdCA9IFZNRV9TTE9UX0NVUlJFTlQ7Ci0JfQotCi0Jdm1lX3VzZXJfZHJpdmVyLmJpbmRfdGFibGUgPSBpZHM7Ci0KLQlyZXR2YWwgPSB2bWVfcmVnaXN0ZXJfZHJpdmVyKCZ2bWVfdXNlcl9kcml2ZXIpOworCS8qCisJICogSGVyZSB3ZSBqdXN0IHJlZ2lzdGVyIHRoZSBtYXhpbXVtIG51bWJlciBvZiBkZXZpY2VzIHdlIGNhbiBhbmQKKwkgKiBsZWF2ZSB2bWVfdXNlcl9tYXRjaCgpIHRvIGFsbG93IG9ubHkgMSB0byBnbyB0aHJvdWdoIHRvIHByb2JlKCkuCisJICogVGhpcyB3YXksIGlmIHdlIGxhdGVyIHdhbnQgdG8gYWxsb3cgbXVsdGlwbGUgdXNlciBhY2Nlc3MgZGV2aWNlcywKKwkgKiB3ZSBqdXN0IGNoYW5nZSB0aGUgY29kZSBpbiB2bWVfdXNlcl9tYXRjaCgpLgorCSAqLworCXJldHZhbCA9IHZtZV9yZWdpc3Rlcl9kcml2ZXIoJnZtZV91c2VyX2RyaXZlciwgVk1FX01BWF9TTE9UUyk7CiAJaWYgKHJldHZhbCAhPSAwKQogCQlnb3RvIGVycl9yZWc7CiAKIAlyZXR1cm4gcmV0dmFsOwogCiBlcnJfcmVnOgotCWtmcmVlKGlkcyk7Ci1lcnJfaWQ6CiBlcnJfbm9jYXJkOgogCXJldHVybiByZXR2YWw7CiB9CiAKK3N0YXRpYyBpbnQgdm1lX3VzZXJfbWF0Y2goc3RydWN0IHZtZV9kZXYgKnZkZXYpCit7CisJaWYgKHZkZXYtPm51bSA+PSBWTUVfVVNFUl9CVVNfTUFYKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKwogLyoKICAqIEluIHRoaXMgc2ltcGxlIGFjY2VzcyBkcml2ZXIsIHRoZSBvbGQgYmVoYXZpb3VyIGlzIGJlaW5nIHByZXNlcnZlZCBhcyBtdWNoCiAgKiBhcyBwcmFjdGljYWwuIFdlIHdpbGwgdGhlcmVmb3JlIHJlc2VydmUgdGhlIGJ1ZmZlcnMgYW5kIHJlcXVlc3QgdGhlIGltYWdlcwogICogaGVyZSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gZG8gaXQgbGF0ZXIuCiAgKi8KLXN0YXRpYyBpbnQgX19kZXZpbml0IHZtZV91c2VyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGN1cl9idXMsCi0JaW50IGN1cl9zbG90KQorc3RhdGljIGludCBfX2RldmluaXQgdm1lX3VzZXJfcHJvYmUoc3RydWN0IHZtZV9kZXYgKnZkZXYpCiB7CiAJaW50IGksIGVycjsKIAljaGFyIG5hbWVbMTJdOwpAQCAtNzA0LDcgKzY5MCw3IEBACiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX2RldjsKIAl9Ci0Jdm1lX3VzZXJfYnJpZGdlID0gZGV2OworCXZtZV91c2VyX2JyaWRnZSA9IHZkZXY7CiAKIAkvKiBJbml0aWFsaXNlIGRlc2NyaXB0b3JzICovCiAJZm9yIChpID0gMDsgaSA8IFZNRV9ERVZTOyBpKyspIHsKQEAgLTg2Nyw4ICs4NTMsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZleGl0IHZtZV91c2VyX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBjdXJfYnVzLAotCWludCBjdXJfc2xvdCkKK3N0YXRpYyBpbnQgX19kZXZleGl0IHZtZV91c2VyX3JlbW92ZShzdHJ1Y3Qgdm1lX2RldiAqZGV2KQogewogCWludCBpOwogCkBAIC05MDAsOCArODg1LDYgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCB2bWVfdXNlcl9leGl0KHZvaWQpCiB7CiAJdm1lX3VucmVnaXN0ZXJfZHJpdmVyKCZ2bWVfdXNlcl9kcml2ZXIpOwotCi0Ja2ZyZWUodm1lX3VzZXJfZHJpdmVyLmJpbmRfdGFibGUpOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfdXNlci5oIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmgKaW5kZXggMjRiZjRlNS4uZDg1YTFlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmgKQEAgLTEsNyArMSw3IEBACiAjaWZuZGVmIF9WTUVfVVNFUl9IXwogI2RlZmluZSBfVk1FX1VTRVJfSF8KIAotI2RlZmluZSBVU0VSX0JVU19NQVggICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFZNRV9VU0VSX0JVU19NQVgJMQogCiAvKgogICogVk1FYnVzIE1hc3RlciBXaW5kb3cgQ29uZmlndXJhdGlvbiBTdHJ1Y3R1cmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lLmMgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZS5jCmluZGV4IGMwNzhjZTMuLmIwNGI0NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWUuYwpAQCAtMzQsMjAgKzM0LDE3IEBACiAjaW5jbHVkZSAidm1lLmgiCiAjaW5jbHVkZSAidm1lX2JyaWRnZS5oIgogCi0vKiBCaXRtYXNrIGFuZCBtdXRleCB0byBrZWVwIHRyYWNrIG9mIGJyaWRnZSBudW1iZXJzICovCisvKiBCaXRtYXNrIGFuZCBsaXN0IG9mIHJlZ2lzdGVyZWQgYnVzZXMgYm90aCBwcm90ZWN0ZWQgYnkgY29tbW9uIG11dGV4ICovCiBzdGF0aWMgdW5zaWduZWQgaW50IHZtZV9idXNfbnVtYmVyczsKLXN0YXRpYyBERUZJTkVfTVVURVgodm1lX2J1c19udW1fbXR4KTsKK3N0YXRpYyBMSVNUX0hFQUQodm1lX2J1c19saXN0KTsKK3N0YXRpYyBERUZJTkVfTVVURVgodm1lX2J1c2VzX2xvY2spOwogCiBzdGF0aWMgdm9pZCBfX2V4aXQgdm1lX2V4aXQodm9pZCk7CiBzdGF0aWMgaW50IF9faW5pdCB2bWVfaW5pdCh2b2lkKTsKIAotCi0vKgotICogRmluZCB0aGUgYnJpZGdlIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIGRldmljZSByZXNvdXJjZQotICovCi1zdGF0aWMgc3RydWN0IHZtZV9icmlkZ2UgKmRldl90b19icmlkZ2Uoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHN0cnVjdCB2bWVfZGV2ICpkZXZfdG9fdm1lX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIGRldi0+cGxhdGZvcm1fZGF0YTsKKwlyZXR1cm4gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHZtZV9kZXYsIGRldik7CiB9CiAKIC8qCkBAIC04MywxNSArODAsMTEgQEAKIC8qCiAgKiBBbGxvY2F0ZSBhIGNvbnRpZ3VvdXMgYmxvY2sgb2YgbWVtb3J5IGZvciB1c2UgYnkgdGhlIGRyaXZlci4gVGhpcyBpcyB1c2VkIHRvCiAgKiBjcmVhdGUgdGhlIGJ1ZmZlcnMgZm9yIHRoZSBzbGF2ZSB3aW5kb3dzLgotICoKLSAqIFhYWCBWTUUgYnJpZGdlcyBjb3VsZCBiZSBhdmFpbGFibGUgb24gYnVzZXMgb3RoZXIgdGhhbiBQQ0kuIEF0IHRoZSBtb21tZW50Ci0gKiAgICAgdGhpcyBmcmFtZXdvcmsgb25seSBzdXBwb3J0cyBQQ0kgZGV2aWNlcy4KICAqLwogdm9pZCAqdm1lX2FsbG9jX2NvbnNpc3RlbnQoc3RydWN0IHZtZV9yZXNvdXJjZSAqcmVzb3VyY2UsIHNpemVfdCBzaXplLAogCWRtYV9hZGRyX3QgKmRtYSkKIHsKIAlzdHJ1Y3Qgdm1lX2JyaWRnZSAqYnJpZGdlOwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCiAJaWYgKHJlc291cmNlID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJObyByZXNvdXJjZVxuIik7CkBAIC0xMDQsMjggKzk3LDI5IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCS8qIEZpbmQgcGNpX2RldiBjb250YWluZXIgb2YgZGV2ICovCiAJaWYgKGJyaWRnZS0+cGFyZW50ID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJEZXYgZW50cnkgTlVMTFxuIik7CisJCXByaW50ayhLRVJOX0VSUiAiRGV2IGVudHJ5IE5VTEwgZm9yIgorCQkJIiBicmlkZ2UgJXNcbiIsIGJyaWRnZS0+bmFtZSk7CiAJCXJldHVybiBOVUxMOwogCX0KLQlwZGV2ID0gY29udGFpbmVyX29mKGJyaWRnZS0+cGFyZW50LCBzdHJ1Y3QgcGNpX2RldiwgZGV2KTsKIAotCXJldHVybiBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplLCBkbWEpOworCWlmIChicmlkZ2UtPmFsbG9jX2NvbnNpc3RlbnQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImFsbG9jX2NvbnNpc3RlbnQgbm90IHN1cHBvcnRlZCBieSIKKwkJCSIgYnJpZGdlICVzXG4iLCBicmlkZ2UtPm5hbWUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gYnJpZGdlLT5hbGxvY19jb25zaXN0ZW50KGJyaWRnZS0+cGFyZW50LCBzaXplLCBkbWEpOwogfQogRVhQT1JUX1NZTUJPTCh2bWVfYWxsb2NfY29uc2lzdGVudCk7CiAKIC8qCiAgKiBGcmVlIHByZXZpb3VzbHkgYWxsb2NhdGVkIGNvbnRpZ3VvdXMgYmxvY2sgb2YgbWVtb3J5LgotICoKLSAqIFhYWCBWTUUgYnJpZGdlcyBjb3VsZCBiZSBhdmFpbGFibGUgb24gYnVzZXMgb3RoZXIgdGhhbiBQQ0kuIEF0IHRoZSBtb21tZW50Ci0gKiAgICAgdGhpcyBmcmFtZXdvcmsgb25seSBzdXBwb3J0cyBQQ0kgZGV2aWNlcy4KICAqLwogdm9pZCB2bWVfZnJlZV9jb25zaXN0ZW50KHN0cnVjdCB2bWVfcmVzb3VyY2UgKnJlc291cmNlLCBzaXplX3Qgc2l6ZSwKIAl2b2lkICp2YWRkciwgZG1hX2FkZHJfdCBkbWEpCiB7CiAJc3RydWN0IHZtZV9icmlkZ2UgKmJyaWRnZTsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAogCWlmIChyZXNvdXJjZSA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiTm8gcmVzb3VyY2VcbiIpOwpAQCAtMTM4LDEwICsxMzIsMTkgQEAKIAkJcmV0dXJuOwogCX0KIAotCS8qIEZpbmQgcGNpX2RldiBjb250YWluZXIgb2YgZGV2ICovCi0JcGRldiA9IGNvbnRhaW5lcl9vZihicmlkZ2UtPnBhcmVudCwgc3RydWN0IHBjaV9kZXYsIGRldik7CisJaWYgKGJyaWRnZS0+cGFyZW50ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJEZXYgZW50cnkgTlVMTCBmb3IiCisJCQkiIGJyaWRnZSAlc1xuIiwgYnJpZGdlLT5uYW1lKTsKKwkJcmV0dXJuOworCX0KIAotCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZSwgdmFkZHIsIGRtYSk7CisJaWYgKGJyaWRnZS0+ZnJlZV9jb25zaXN0ZW50ID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJmcmVlX2NvbnNpc3RlbnQgbm90IHN1cHBvcnRlZCBieSIKKwkJCSIgYnJpZGdlICVzXG4iLCBicmlkZ2UtPm5hbWUpOworCQlyZXR1cm47CisJfQorCisJYnJpZGdlLT5mcmVlX2NvbnNpc3RlbnQoYnJpZGdlLT5wYXJlbnQsIHNpemUsIHZhZGRyLCBkbWEpOwogfQogRVhQT1JUX1NZTUJPTCh2bWVfZnJlZV9jb25zaXN0ZW50KTsKIApAQCAtMjI5LDcgKzIzMiw3IEBACiAgKiBSZXF1ZXN0IGEgc2xhdmUgaW1hZ2Ugd2l0aCBzcGVjaWZpYyBhdHRyaWJ1dGVzLCByZXR1cm4gc29tZSB1bmlxdWUKICAqIGlkZW50aWZpZXIuCiAgKi8KLXN0cnVjdCB2bWVfcmVzb3VyY2UgKnZtZV9zbGF2ZV9yZXF1ZXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKK3N0cnVjdCB2bWVfcmVzb3VyY2UgKnZtZV9zbGF2ZV9yZXF1ZXN0KHN0cnVjdCB2bWVfZGV2ICp2ZGV2LAogCXZtZV9hZGRyZXNzX3QgYWRkcmVzcywgdm1lX2N5Y2xlX3QgY3ljbGUpCiB7CiAJc3RydWN0IHZtZV9icmlkZ2UgKmJyaWRnZTsKQEAgLTIzOCw3ICsyNDEsNyBAQAogCXN0cnVjdCB2bWVfc2xhdmVfcmVzb3VyY2UgKnNsYXZlX2ltYWdlID0gTlVMTDsKIAlzdHJ1Y3Qgdm1lX3Jlc291cmNlICpyZXNvdXJjZSA9IE5VTEw7CiAKLQlicmlkZ2UgPSBkZXZfdG9fYnJpZGdlKGRldik7CisJYnJpZGdlID0gdmRldi0+YnJpZGdlOwogCWlmIChicmlkZ2UgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IGZpbmQgVk1FIGJ1c1xuIik7CiAJCWdvdG8gZXJyX2J1czsKQEAgLTM4NSw3ICszODgsNyBAQAogICogUmVxdWVzdCBhIG1hc3RlciBpbWFnZSB3aXRoIHNwZWNpZmljIGF0dHJpYnV0ZXMsIHJldHVybiBzb21lIHVuaXF1ZQogICogaWRlbnRpZmllci4KICAqLwotc3RydWN0IHZtZV9yZXNvdXJjZSAqdm1lX21hc3Rlcl9yZXF1ZXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKK3N0cnVjdCB2bWVfcmVzb3VyY2UgKnZtZV9tYXN0ZXJfcmVxdWVzdChzdHJ1Y3Qgdm1lX2RldiAqdmRldiwKIAl2bWVfYWRkcmVzc190IGFkZHJlc3MsIHZtZV9jeWNsZV90IGN5Y2xlLCB2bWVfd2lkdGhfdCBkd2lkdGgpCiB7CiAJc3RydWN0IHZtZV9icmlkZ2UgKmJyaWRnZTsKQEAgLTM5NCw3ICszOTcsNyBAQAogCXN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICptYXN0ZXJfaW1hZ2UgPSBOVUxMOwogCXN0cnVjdCB2bWVfcmVzb3VyY2UgKnJlc291cmNlID0gTlVMTDsKIAotCWJyaWRnZSA9IGRldl90b19icmlkZ2UoZGV2KTsKKwlicmlkZ2UgPSB2ZGV2LT5icmlkZ2U7CiAJaWYgKGJyaWRnZSA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZmluZCBWTUUgYnVzXG4iKTsKIAkJZ290byBlcnJfYnVzOwpAQCAtNjQzLDcgKzY0Niw4IEBACiAgKiBSZXF1ZXN0IGEgRE1BIGNvbnRyb2xsZXIgd2l0aCBzcGVjaWZpYyBhdHRyaWJ1dGVzLCByZXR1cm4gc29tZSB1bmlxdWUKICAqIGlkZW50aWZpZXIuCiAgKi8KLXN0cnVjdCB2bWVfcmVzb3VyY2UgKnZtZV9kbWFfcmVxdWVzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZtZV9kbWFfcm91dGVfdCByb3V0ZSkKK3N0cnVjdCB2bWVfcmVzb3VyY2UgKnZtZV9kbWFfcmVxdWVzdChzdHJ1Y3Qgdm1lX2RldiAqdmRldiwKKwl2bWVfZG1hX3JvdXRlX3Qgcm91dGUpCiB7CiAJc3RydWN0IHZtZV9icmlkZ2UgKmJyaWRnZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpkbWFfcG9zID0gTlVMTDsKQEAgLTY1NCw3ICs2NTgsNyBAQAogCS8qIFhYWCBOb3QgY2hlY2tpbmcgcmVzb3VyY2UgYXR0cmlidXRlcyAqLwogCXByaW50ayhLRVJOX0VSUiAiTm8gVk1FIHJlc291cmNlIEF0dHJpYnV0ZSB0ZXN0cyBkb25lXG4iKTsKIAotCWJyaWRnZSA9IGRldl90b19icmlkZ2UoZGV2KTsKKwlicmlkZ2UgPSB2ZGV2LT5icmlkZ2U7CiAJaWYgKGJyaWRnZSA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZmluZCBWTUUgYnVzXG4iKTsKIAkJZ290byBlcnJfYnVzOwpAQCAtOTg3LDEzICs5OTEsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0wodm1lX2lycV9oYW5kbGVyKTsKIAotaW50IHZtZV9pcnFfcmVxdWVzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBsZXZlbCwgaW50IHN0YXRpZCwKK2ludCB2bWVfaXJxX3JlcXVlc3Qoc3RydWN0IHZtZV9kZXYgKnZkZXYsIGludCBsZXZlbCwgaW50IHN0YXRpZCwKIAl2b2lkICgqY2FsbGJhY2spKGludCwgaW50LCB2b2lkICopLAogCXZvaWQgKnByaXZfZGF0YSkKIHsKIAlzdHJ1Y3Qgdm1lX2JyaWRnZSAqYnJpZGdlOwogCi0JYnJpZGdlID0gZGV2X3RvX2JyaWRnZShkZXYpOworCWJyaWRnZSA9IHZkZXYtPmJyaWRnZTsKIAlpZiAoYnJpZGdlID09IE5VTEwpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBmaW5kIFZNRSBidXNcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEwMzAsMTEgKzEwMzQsMTEgQEAKIH0KIEVYUE9SVF9TWU1CT0wodm1lX2lycV9yZXF1ZXN0KTsKIAotdm9pZCB2bWVfaXJxX2ZyZWUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbGV2ZWwsIGludCBzdGF0aWQpCit2b2lkIHZtZV9pcnFfZnJlZShzdHJ1Y3Qgdm1lX2RldiAqdmRldiwgaW50IGxldmVsLCBpbnQgc3RhdGlkKQogewogCXN0cnVjdCB2bWVfYnJpZGdlICpicmlkZ2U7CiAKLQlicmlkZ2UgPSBkZXZfdG9fYnJpZGdlKGRldik7CisJYnJpZGdlID0gdmRldi0+YnJpZGdlOwogCWlmIChicmlkZ2UgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IGZpbmQgVk1FIGJ1c1xuIik7CiAJCXJldHVybjsKQEAgLTEwNjUsMTEgKzEwNjksMTEgQEAKIH0KIEVYUE9SVF9TWU1CT0wodm1lX2lycV9mcmVlKTsKIAotaW50IHZtZV9pcnFfZ2VuZXJhdGUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgbGV2ZWwsIGludCBzdGF0aWQpCitpbnQgdm1lX2lycV9nZW5lcmF0ZShzdHJ1Y3Qgdm1lX2RldiAqdmRldiwgaW50IGxldmVsLCBpbnQgc3RhdGlkKQogewogCXN0cnVjdCB2bWVfYnJpZGdlICpicmlkZ2U7CiAKLQlicmlkZ2UgPSBkZXZfdG9fYnJpZGdlKGRldik7CisJYnJpZGdlID0gdmRldi0+YnJpZGdlOwogCWlmIChicmlkZ2UgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IGZpbmQgVk1FIGJ1c1xuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTA5Miw3ICsxMDk2LDcgQEAKIC8qCiAgKiBSZXF1ZXN0IHRoZSBsb2NhdGlvbiBtb25pdG9yLCByZXR1cm4gcmVzb3VyY2Ugb3IgTlVMTAogICovCi1zdHJ1Y3Qgdm1lX3Jlc291cmNlICp2bWVfbG1fcmVxdWVzdChzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdHJ1Y3Qgdm1lX3Jlc291cmNlICp2bWVfbG1fcmVxdWVzdChzdHJ1Y3Qgdm1lX2RldiAqdmRldikKIHsKIAlzdHJ1Y3Qgdm1lX2JyaWRnZSAqYnJpZGdlOwogCXN0cnVjdCBsaXN0X2hlYWQgKmxtX3BvcyA9IE5VTEw7CkBAIC0xMTAwLDcgKzExMDQsNyBAQAogCXN0cnVjdCB2bWVfbG1fcmVzb3VyY2UgKmxtID0gTlVMTDsKIAlzdHJ1Y3Qgdm1lX3Jlc291cmNlICpyZXNvdXJjZSA9IE5VTEw7CiAKLQlicmlkZ2UgPSBkZXZfdG9fYnJpZGdlKGRldik7CisJYnJpZGdlID0gdmRldi0+YnJpZGdlOwogCWlmIChicmlkZ2UgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IGZpbmQgVk1FIGJ1c1xuIik7CiAJCWdvdG8gZXJyX2J1czsKQEAgLTEyODEsMTEgKzEyODUsMTEgQEAKIH0KIEVYUE9SVF9TWU1CT0wodm1lX2xtX2ZyZWUpOwogCi1pbnQgdm1lX3Nsb3RfZ2V0KHN0cnVjdCBkZXZpY2UgKmJ1cykKK2ludCB2bWVfc2xvdF9nZXQoc3RydWN0IHZtZV9kZXYgKnZkZXYpCiB7CiAJc3RydWN0IHZtZV9icmlkZ2UgKmJyaWRnZTsKIAotCWJyaWRnZSA9IGRldl90b19icmlkZ2UoYnVzKTsKKwlicmlkZ2UgPSB2ZGV2LT5icmlkZ2U7CiAJaWYgKGJyaWRnZSA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQ2FuJ3QgZmluZCBWTUUgYnVzXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMzAzLDIwNyArMTMwNywyMTIgQEAKIAogLyogLSBCcmlkZ2UgUmVnaXN0cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IHZtZV9hbGxvY19idXNfbnVtKHZvaWQpCitzdGF0aWMgaW50IHZtZV9hZGRfYnVzKHN0cnVjdCB2bWVfYnJpZGdlICpicmlkZ2UpCiB7CiAJaW50IGk7CisJaW50IHJldCA9IC0xOwogCi0JbXV0ZXhfbG9jaygmdm1lX2J1c19udW1fbXR4KTsKKwltdXRleF9sb2NrKCZ2bWVfYnVzZXNfbG9jayk7CiAJZm9yIChpID0gMDsgaSA8IHNpemVvZih2bWVfYnVzX251bWJlcnMpICogODsgaSsrKSB7Ci0JCWlmICgoKHZtZV9idXNfbnVtYmVycyA+PiBpKSAmIDB4MSkgPT0gMCkgewotCQkJdm1lX2J1c19udW1iZXJzIHw9ICgweDEgPDwgaSk7CisJCWlmICgodm1lX2J1c19udW1iZXJzICYgKDEgPDwgaSkpID09IDApIHsKKwkJCXZtZV9idXNfbnVtYmVycyB8PSAoMSA8PCBpKTsKKwkJCWJyaWRnZS0+bnVtID0gaTsKKwkJCUlOSVRfTElTVF9IRUFEKCZicmlkZ2UtPmRldmljZXMpOworCQkJbGlzdF9hZGRfdGFpbCgmYnJpZGdlLT5idXNfbGlzdCwgJnZtZV9idXNfbGlzdCk7CisJCQlyZXQgPSAwOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JbXV0ZXhfdW5sb2NrKCZ2bWVfYnVzX251bV9tdHgpOworCW11dGV4X3VubG9jaygmdm1lX2J1c2VzX2xvY2spOwogCi0JcmV0dXJuIGk7CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgdm1lX2ZyZWVfYnVzX251bShpbnQgYnVzKQorc3RhdGljIHZvaWQgdm1lX3JlbW92ZV9idXMoc3RydWN0IHZtZV9icmlkZ2UgKmJyaWRnZSkKIHsKLQltdXRleF9sb2NrKCZ2bWVfYnVzX251bV9tdHgpOwotCXZtZV9idXNfbnVtYmVycyAmPSB+KDB4MSA8PCBidXMpOwotCW11dGV4X3VubG9jaygmdm1lX2J1c19udW1fbXR4KTsKKwlzdHJ1Y3Qgdm1lX2RldiAqdmRldjsKKwlzdHJ1Y3Qgdm1lX2RldiAqdG1wOworCisJbXV0ZXhfbG9jaygmdm1lX2J1c2VzX2xvY2spOworCXZtZV9idXNfbnVtYmVycyAmPSB+KDEgPDwgYnJpZGdlLT5udW0pOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2ZGV2LCB0bXAsICZicmlkZ2UtPmRldmljZXMsIGJyaWRnZV9saXN0KSB7CisJCWxpc3RfZGVsKCZ2ZGV2LT5kcnZfbGlzdCk7CisJCWxpc3RfZGVsKCZ2ZGV2LT5icmlkZ2VfbGlzdCk7CisJCWRldmljZV91bnJlZ2lzdGVyKCZ2ZGV2LT5kZXYpOworCX0KKwlsaXN0X2RlbCgmYnJpZGdlLT5idXNfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZ2bWVfYnVzZXNfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHZtZV9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJa2ZyZWUoZGV2X3RvX3ZtZV9kZXYoZGV2KSk7CiB9CiAKIGludCB2bWVfcmVnaXN0ZXJfYnJpZGdlKHN0cnVjdCB2bWVfYnJpZGdlICpicmlkZ2UpCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCWludCByZXR2YWw7Ci0JaW50IGk7Ci0KLQlicmlkZ2UtPm51bSA9IHZtZV9hbGxvY19idXNfbnVtKCk7Ci0KLQkvKiBUaGlzIGNyZWF0ZXMgMzIgdm1lICJzbG90IiBkZXZpY2VzLiBUaGlzIGVxdWF0ZXMgdG8gYSBzbG90IGZvciBlYWNoCi0JICogSUQgYXZhaWxhYmxlIGluIGEgc3lzdGVtIGNvbmZvcm1pbmcgdG8gdGhlIEFOU0kvVklUQSAxLTE5OTQKLQkgKiBzcGVjaWZpY2F0aW9uLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBWTUVfU0xPVFNfTUFYOyBpKyspIHsKLQkJZGV2ID0gJmJyaWRnZS0+ZGV2W2ldOwotCQltZW1zZXQoZGV2LCAwLCBzaXplb2Yoc3RydWN0IGRldmljZSkpOwotCi0JCWRldi0+cGFyZW50ID0gYnJpZGdlLT5wYXJlbnQ7Ci0JCWRldi0+YnVzID0gJnZtZV9idXNfdHlwZTsKLQkJLyoKLQkJICogV2Ugc2F2ZSBhIHBvaW50ZXIgdG8gdGhlIGJyaWRnZSBpbiBwbGF0Zm9ybV9kYXRhIHNvIHRoYXQgd2UKLQkJICogY2FuIGdldCB0byBpdCBsYXRlci4gV2Uga2VlcCBkcml2ZXJfZGF0YSBmb3IgdXNlIGJ5IHRoZQotCQkgKiBkcml2ZXIgdGhhdCBiaW5kcyBhZ2FpbnN0IHRoZSBzbG90Ci0JCSAqLwotCQlkZXYtPnBsYXRmb3JtX2RhdGEgPSBicmlkZ2U7Ci0JCWRldl9zZXRfbmFtZShkZXYsICJ2bWUtJXguJXgiLCBicmlkZ2UtPm51bSwgaSArIDEpOwotCi0JCXJldHZhbCA9IGRldmljZV9yZWdpc3RlcihkZXYpOwotCQlpZiAocmV0dmFsKQotCQkJZ290byBlcnJfcmVnOwotCX0KLQotCXJldHVybiByZXR2YWw7Ci0KLWVycl9yZWc6Ci0Jd2hpbGUgKC0taSA+PSAwKSB7Ci0JCWRldiA9ICZicmlkZ2UtPmRldltpXTsKLQkJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKLQl9Ci0Jdm1lX2ZyZWVfYnVzX251bShicmlkZ2UtPm51bSk7Ci0JcmV0dXJuIHJldHZhbDsKKwlyZXR1cm4gdm1lX2FkZF9idXMoYnJpZGdlKTsKIH0KIEVYUE9SVF9TWU1CT0wodm1lX3JlZ2lzdGVyX2JyaWRnZSk7CiAKIHZvaWQgdm1lX3VucmVnaXN0ZXJfYnJpZGdlKHN0cnVjdCB2bWVfYnJpZGdlICpicmlkZ2UpCiB7Ci0JaW50IGk7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCi0KLQlmb3IgKGkgPSAwOyBpIDwgVk1FX1NMT1RTX01BWDsgaSsrKSB7Ci0JCWRldiA9ICZicmlkZ2UtPmRldltpXTsKLQkJZGV2aWNlX3VucmVnaXN0ZXIoZGV2KTsKLQl9Ci0Jdm1lX2ZyZWVfYnVzX251bShicmlkZ2UtPm51bSk7CisJdm1lX3JlbW92ZV9idXMoYnJpZGdlKTsKIH0KIEVYUE9SVF9TWU1CT0wodm1lX3VucmVnaXN0ZXJfYnJpZGdlKTsKIAotCiAvKiAtIERyaXZlciBSZWdpc3RyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLWludCB2bWVfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB2bWVfZHJpdmVyICpkcnYpCitzdGF0aWMgaW50IF9fdm1lX3JlZ2lzdGVyX2RyaXZlcl9idXMoc3RydWN0IHZtZV9kcml2ZXIgKmRydiwKKwlzdHJ1Y3Qgdm1lX2JyaWRnZSAqYnJpZGdlLCB1bnNpZ25lZCBpbnQgbmRldnMpCiB7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3Qgdm1lX2RldiAqdmRldjsKKwlzdHJ1Y3Qgdm1lX2RldiAqdG1wOworCisJZm9yIChpID0gMDsgaSA8IG5kZXZzOyBpKyspIHsKKwkJdmRldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2bWVfZGV2KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghdmRldikgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyX2RldmFsbG9jOworCQl9CisJCXZkZXYtPm51bSA9IGk7CisJCXZkZXYtPmJyaWRnZSA9IGJyaWRnZTsKKwkJdmRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBkcnY7CisJCXZkZXYtPmRldi5yZWxlYXNlID0gdm1lX2Rldl9yZWxlYXNlOworCQl2ZGV2LT5kZXYucGFyZW50ID0gYnJpZGdlLT5wYXJlbnQ7CisJCXZkZXYtPmRldi5idXMgPSAmdm1lX2J1c190eXBlOworCQlkZXZfc2V0X25hbWUoJnZkZXYtPmRldiwgIiVzLiV1LSV1IiwgZHJ2LT5uYW1lLCBicmlkZ2UtPm51bSwKKwkJCXZkZXYtPm51bSk7CisKKwkJZXJyID0gZGV2aWNlX3JlZ2lzdGVyKCZ2ZGV2LT5kZXYpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfcmVnOworCisJCWlmICh2ZGV2LT5kZXYucGxhdGZvcm1fZGF0YSkgeworCQkJbGlzdF9hZGRfdGFpbCgmdmRldi0+ZHJ2X2xpc3QsICZkcnYtPmRldmljZXMpOworCQkJbGlzdF9hZGRfdGFpbCgmdmRldi0+YnJpZGdlX2xpc3QsICZicmlkZ2UtPmRldmljZXMpOworCQl9IGVsc2UKKwkJCWRldmljZV91bnJlZ2lzdGVyKCZ2ZGV2LT5kZXYpOworCX0KKwlyZXR1cm4gMDsKKworZXJyX3JlZzoKKwlrZnJlZSh2ZGV2KTsKK2Vycl9kZXZhbGxvYzoKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodmRldiwgdG1wLCAmZHJ2LT5kZXZpY2VzLCBkcnZfbGlzdCkgeworCQlsaXN0X2RlbCgmdmRldi0+ZHJ2X2xpc3QpOworCQlsaXN0X2RlbCgmdmRldi0+YnJpZGdlX2xpc3QpOworCQlkZXZpY2VfdW5yZWdpc3RlcigmdmRldi0+ZGV2KTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX3ZtZV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHZtZV9kcml2ZXIgKmRydiwgdW5zaWduZWQgaW50IG5kZXZzKQoreworCXN0cnVjdCB2bWVfYnJpZGdlICpicmlkZ2U7CisJaW50IGVyciA9IDA7CisKKwltdXRleF9sb2NrKCZ2bWVfYnVzZXNfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShicmlkZ2UsICZ2bWVfYnVzX2xpc3QsIGJ1c19saXN0KSB7CisJCS8qCisJCSAqIFRoaXMgY2Fubm90IGNhdXNlIHRyb3VibGUgYXMgd2UgYWxyZWFkeSBoYXZlIHZtZV9idXNlc19sb2NrCisJCSAqIGFuZCBpZiB0aGUgYnJpZGdlIGlzIHJlbW92ZWQsIGl0IHdpbGwgaGF2ZSB0byBnbyB0aHJvdWdoCisJCSAqIHZtZV91bnJlZ2lzdGVyX2JyaWRnZSgpIHRvIGRvIGl0ICh3aGljaCBjYWxscyByZW1vdmUoKSBvbgorCQkgKiB0aGUgYnJpZGdlIHdoaWNoIGluIHR1cm4gdHJpZXMgdG8gYWNxdWlyZSB2bWVfYnVzZXNfbG9jayBhbmQKKwkJICogd2lsbCBoYXZlIHRvIHdhaXQpLiBUaGUgcHJvYmUoKSBjYWxsZWQgYWZ0ZXIgZGV2aWNlCisJCSAqIHJlZ2lzdHJhdGlvbiBpbiBfX3ZtZV9yZWdpc3Rlcl9kcml2ZXIgYmVsb3cgd2lsbCBhbHNvIGZhaWwKKwkJICogYXMgdGhlIGJyaWRnZSBpcyBiZWluZyByZW1vdmVkIChzaW5jZSB0aGUgcHJvYmUoKSBjYWxscworCQkgKiB2bWVfYnJpZGdlX2dldCgpKS4KKwkJICovCisJCWVyciA9IF9fdm1lX3JlZ2lzdGVyX2RyaXZlcl9idXMoZHJ2LCBicmlkZ2UsIG5kZXZzKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCX0KKwltdXRleF91bmxvY2soJnZtZV9idXNlc19sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgdm1lX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3Qgdm1lX2RyaXZlciAqZHJ2LCB1bnNpZ25lZCBpbnQgbmRldnMpCit7CisJaW50IGVycjsKKwogCWRydi0+ZHJpdmVyLm5hbWUgPSBkcnYtPm5hbWU7CiAJZHJ2LT5kcml2ZXIuYnVzID0gJnZtZV9idXNfdHlwZTsKKwlJTklUX0xJU1RfSEVBRCgmZHJ2LT5kZXZpY2VzKTsKIAotCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKKwllcnIgPSBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gX192bWVfcmVnaXN0ZXJfZHJpdmVyKGRydiwgbmRldnMpOworCWlmIChlcnIpCisJCWRyaXZlcl91bnJlZ2lzdGVyKCZkcnYtPmRyaXZlcik7CisKKwlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTCh2bWVfcmVnaXN0ZXJfZHJpdmVyKTsKIAogdm9pZCB2bWVfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHZtZV9kcml2ZXIgKmRydikKIHsKKwlzdHJ1Y3Qgdm1lX2RldiAqZGV2LCAqZGV2X3RtcDsKKworCW11dGV4X2xvY2soJnZtZV9idXNlc19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2LCBkZXZfdG1wLCAmZHJ2LT5kZXZpY2VzLCBkcnZfbGlzdCkgeworCQlsaXN0X2RlbCgmZGV2LT5kcnZfbGlzdCk7CisJCWxpc3RfZGVsKCZkZXYtPmJyaWRnZV9saXN0KTsKKwkJZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+ZGV2KTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ2bWVfYnVzZXNfbG9jayk7CisKIAlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5kcml2ZXIpOwogfQogRVhQT1JUX1NZTUJPTCh2bWVfdW5yZWdpc3Rlcl9kcml2ZXIpOwogCiAvKiAtIEJ1cyBSZWdpc3RyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBpbnQgdm1lX2NhbGNfc2xvdChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHZtZV9icmlkZ2UgKmJyaWRnZTsKLQlpbnQgbnVtOwotCi0JYnJpZGdlID0gZGV2X3RvX2JyaWRnZShkZXYpOwotCi0JLyogRGV0ZXJtaW5lIHNsb3QgbnVtYmVyICovCi0JbnVtID0gMDsKLQl3aGlsZSAobnVtIDwgVk1FX1NMT1RTX01BWCkgewotCQlpZiAoJmJyaWRnZS0+ZGV2W251bV0gPT0gZGV2KQotCQkJYnJlYWs7Ci0KLQkJbnVtKys7Ci0JfQotCWlmIChudW0gPT0gVk1FX1NMT1RTX01BWCkgewotCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBpZGVudGlmeSBzbG90XG4iKTsKLQkJbnVtID0gMDsKLQkJZ290byBlcnJfZGV2OwotCX0KLQludW0rKzsKLQotZXJyX2RldjoKLQlyZXR1cm4gbnVtOwotfQotCi1zdGF0aWMgc3RydWN0IHZtZV9kcml2ZXIgKmRldl90b192bWVfZHJpdmVyKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlpZiAoZGV2LT5kcml2ZXIgPT0gTlVMTCkKLQkJcHJpbnRrKEtFUk5fRVJSICJCdWdnZXIgZGV2LT5kcml2ZXIgaXMgTlVMTFxuIik7Ci0KLQlyZXR1cm4gY29udGFpbmVyX29mKGRldi0+ZHJpdmVyLCBzdHJ1Y3Qgdm1lX2RyaXZlciwgZHJpdmVyKTsKLX0KLQogc3RhdGljIGludCB2bWVfYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKIHsKLQlzdHJ1Y3Qgdm1lX2JyaWRnZSAqYnJpZGdlOwotCXN0cnVjdCB2bWVfZHJpdmVyICpkcml2ZXI7Ci0JaW50IGksIG51bTsKKwlzdHJ1Y3Qgdm1lX2RyaXZlciAqdm1lX2RydjsKIAotCWJyaWRnZSA9IGRldl90b19icmlkZ2UoZGV2KTsKLQlkcml2ZXIgPSBjb250YWluZXJfb2YoZHJ2LCBzdHJ1Y3Qgdm1lX2RyaXZlciwgZHJpdmVyKTsKKwl2bWVfZHJ2ID0gY29udGFpbmVyX29mKGRydiwgc3RydWN0IHZtZV9kcml2ZXIsIGRyaXZlcik7CiAKLQludW0gPSB2bWVfY2FsY19zbG90KGRldik7Ci0JaWYgKCFudW0pCi0JCWdvdG8gZXJyX2RldjsKKwlpZiAoZGV2LT5wbGF0Zm9ybV9kYXRhID09IHZtZV9kcnYpIHsKKwkJc3RydWN0IHZtZV9kZXYgKnZkZXYgPSBkZXZfdG9fdm1lX2RldihkZXYpOwogCi0JaWYgKGRyaXZlci0+YmluZF90YWJsZSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoZGV2LCAiQmluZCB0YWJsZSBOVUxMXG4iKTsKLQkJZ290byBlcnJfdGFibGU7CisJCWlmICh2bWVfZHJ2LT5tYXRjaCAmJiB2bWVfZHJ2LT5tYXRjaCh2ZGV2KSkKKwkJCXJldHVybiAxOworCisJCWRldi0+cGxhdGZvcm1fZGF0YSA9IE5VTEw7CiAJfQotCi0JaSA9IDA7Ci0Jd2hpbGUgKChkcml2ZXItPmJpbmRfdGFibGVbaV0uYnVzICE9IDApIHx8Ci0JCShkcml2ZXItPmJpbmRfdGFibGVbaV0uc2xvdCAhPSAwKSkgewotCi0JCWlmIChicmlkZ2UtPm51bSA9PSBkcml2ZXItPmJpbmRfdGFibGVbaV0uYnVzKSB7Ci0JCQlpZiAobnVtID09IGRyaXZlci0+YmluZF90YWJsZVtpXS5zbG90KQotCQkJCXJldHVybiAxOwotCi0JCQlpZiAoZHJpdmVyLT5iaW5kX3RhYmxlW2ldLnNsb3QgPT0gVk1FX1NMT1RfQUxMKQotCQkJCXJldHVybiAxOwotCi0JCQlpZiAoKGRyaXZlci0+YmluZF90YWJsZVtpXS5zbG90ID09IFZNRV9TTE9UX0NVUlJFTlQpICYmCi0JCQkJKG51bSA9PSB2bWVfc2xvdF9nZXQoZGV2KSkpCi0JCQkJcmV0dXJuIDE7Ci0JCX0KLQkJaSsrOwotCX0KLQotZXJyX2RldjoKLWVycl90YWJsZToKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB2bWVfYnVzX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgdm1lX2JyaWRnZSAqYnJpZGdlOwotCXN0cnVjdCB2bWVfZHJpdmVyICpkcml2ZXI7CiAJaW50IHJldHZhbCA9IC1FTk9ERVY7CisJc3RydWN0IHZtZV9kcml2ZXIgKmRyaXZlcjsKKwlzdHJ1Y3Qgdm1lX2RldiAqdmRldiA9IGRldl90b192bWVfZGV2KGRldik7CiAKLQlkcml2ZXIgPSBkZXZfdG9fdm1lX2RyaXZlcihkZXYpOwotCWJyaWRnZSA9IGRldl90b19icmlkZ2UoZGV2KTsKKwlkcml2ZXIgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CiAKIAlpZiAoZHJpdmVyLT5wcm9iZSAhPSBOVUxMKQotCQlyZXR2YWwgPSBkcml2ZXItPnByb2JlKGRldiwgYnJpZGdlLT5udW0sIHZtZV9jYWxjX3Nsb3QoZGV2KSk7CisJCXJldHZhbCA9IGRyaXZlci0+cHJvYmUodmRldik7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQogCiBzdGF0aWMgaW50IHZtZV9idXNfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgdm1lX2JyaWRnZSAqYnJpZGdlOwotCXN0cnVjdCB2bWVfZHJpdmVyICpkcml2ZXI7CiAJaW50IHJldHZhbCA9IC1FTk9ERVY7CisJc3RydWN0IHZtZV9kcml2ZXIgKmRyaXZlcjsKKwlzdHJ1Y3Qgdm1lX2RldiAqdmRldiA9IGRldl90b192bWVfZGV2KGRldik7CiAKLQlkcml2ZXIgPSBkZXZfdG9fdm1lX2RyaXZlcihkZXYpOwotCWJyaWRnZSA9IGRldl90b19icmlkZ2UoZGV2KTsKKwlkcml2ZXIgPSBkZXYtPnBsYXRmb3JtX2RhdGE7CiAKIAlpZiAoZHJpdmVyLT5yZW1vdmUgIT0gTlVMTCkKLQkJcmV0dmFsID0gZHJpdmVyLT5yZW1vdmUoZGV2LCBicmlkZ2UtPm51bSwgdm1lX2NhbGNfc2xvdChkZXYpKTsKKwkJcmV0dmFsID0gZHJpdmVyLT5yZW1vdmUodmRldik7CiAKIAlyZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWUuaCBiL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lLmgKaW5kZXggNDE1NWQ4Yy4uZTM4MjhiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZS5oCkBAIC04OCwyMiArODgsMzggQEAKIAogZXh0ZXJuIHN0cnVjdCBidXNfdHlwZSB2bWVfYnVzX3R5cGU7CiAKKy8qIFZNRV9NQVhfQlJJREdFUyBjb21lcyBmcm9tIHRoZSB0eXBlIG9mIHZtZV9idXNfbnVtYmVycyAqLworI2RlZmluZSBWTUVfTUFYX0JSSURHRVMJCShzaXplb2YodW5zaWduZWQgaW50KSo4KQorI2RlZmluZSBWTUVfTUFYX1NMT1RTCQkzMgorCiAjZGVmaW5lIFZNRV9TTE9UX0NVUlJFTlQJLTEKICNkZWZpbmUgVk1FX1NMT1RfQUxMCQktMgogCi1zdHJ1Y3Qgdm1lX2RldmljZV9pZCB7Ci0JaW50IGJ1czsKLQlpbnQgc2xvdDsKKy8qKgorICogU3RydWN0dXJlIHJlcHJlc2VudGluZyBhIFZNRSBkZXZpY2UKKyAqIEBpZDogVGhlIElEIG9mIHRoZSBkZXZpY2UgKGN1cnJlbnRseSB0aGUgYnVzIGFuZCBzbG90IG51bWJlcikKKyAqIEBicmlkZ2U6IFBvaW50ZXIgdG8gdGhlIGJyaWRnZSBkZXZpY2UgdGhpcyBkZXZpY2UgaXMgb24KKyAqIEBkZXY6IEludGVybmFsIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBkcnZfbGlzdDogTGlzdCBvZiBkZXZpY2VzIChwZXIgZHJpdmVyKQorICogQGJyaWRnZV9saXN0OiBMaXN0IG9mIGRldmljZXMgKHBlciBicmlkZ2UpCisgKi8KK3N0cnVjdCB2bWVfZGV2IHsKKwlpbnQgbnVtOworCXN0cnVjdCB2bWVfYnJpZGdlICpicmlkZ2U7CisJc3RydWN0IGRldmljZSBkZXY7CisJc3RydWN0IGxpc3RfaGVhZCBkcnZfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJyaWRnZV9saXN0OwogfTsKIAogc3RydWN0IHZtZV9kcml2ZXIgewogCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKIAljb25zdCBjaGFyICpuYW1lOwotCWNvbnN0IHN0cnVjdCB2bWVfZGV2aWNlX2lkICpiaW5kX3RhYmxlOwotCWludCAoKnByb2JlKSAgKHN0cnVjdCBkZXZpY2UgKiwgaW50LCBpbnQpOwotCWludCAoKnJlbW92ZSkgKHN0cnVjdCBkZXZpY2UgKiwgaW50LCBpbnQpOwotCXZvaWQgKCpzaHV0ZG93bikgKHZvaWQpOwotCXN0cnVjdCBkZXZpY2VfZHJpdmVyICAgIGRyaXZlcjsKKwlpbnQgKCptYXRjaCkoc3RydWN0IHZtZV9kZXYgKik7CisJaW50ICgqcHJvYmUpKHN0cnVjdCB2bWVfZGV2ICopOworCWludCAoKnJlbW92ZSkoc3RydWN0IHZtZV9kZXYgKik7CisJdm9pZCAoKnNodXRkb3duKSh2b2lkKTsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkcml2ZXI7CisJc3RydWN0IGxpc3RfaGVhZCBkZXZpY2VzOwogfTsKIAogdm9pZCAqdm1lX2FsbG9jX2NvbnNpc3RlbnQoc3RydWN0IHZtZV9yZXNvdXJjZSAqLCBzaXplX3QsIGRtYV9hZGRyX3QgKik7CkBAIC0xMTIsNyArMTI4LDcgQEAKIAogc2l6ZV90IHZtZV9nZXRfc2l6ZShzdHJ1Y3Qgdm1lX3Jlc291cmNlICopOwogCi1zdHJ1Y3Qgdm1lX3Jlc291cmNlICp2bWVfc2xhdmVfcmVxdWVzdChzdHJ1Y3QgZGV2aWNlICosIHZtZV9hZGRyZXNzX3QsCitzdHJ1Y3Qgdm1lX3Jlc291cmNlICp2bWVfc2xhdmVfcmVxdWVzdChzdHJ1Y3Qgdm1lX2RldiAqLCB2bWVfYWRkcmVzc190LAogCXZtZV9jeWNsZV90KTsKIGludCB2bWVfc2xhdmVfc2V0KHN0cnVjdCB2bWVfcmVzb3VyY2UgKiwgaW50LCB1bnNpZ25lZCBsb25nIGxvbmcsCiAJdW5zaWduZWQgbG9uZyBsb25nLCBkbWFfYWRkcl90LCB2bWVfYWRkcmVzc190LCB2bWVfY3ljbGVfdCk7CkBAIC0xMjAsNyArMTM2LDcgQEAKIAl1bnNpZ25lZCBsb25nIGxvbmcgKiwgZG1hX2FkZHJfdCAqLCB2bWVfYWRkcmVzc190ICosIHZtZV9jeWNsZV90ICopOwogdm9pZCB2bWVfc2xhdmVfZnJlZShzdHJ1Y3Qgdm1lX3Jlc291cmNlICopOwogCi1zdHJ1Y3Qgdm1lX3Jlc291cmNlICp2bWVfbWFzdGVyX3JlcXVlc3Qoc3RydWN0IGRldmljZSAqLCB2bWVfYWRkcmVzc190LAorc3RydWN0IHZtZV9yZXNvdXJjZSAqdm1lX21hc3Rlcl9yZXF1ZXN0KHN0cnVjdCB2bWVfZGV2ICosIHZtZV9hZGRyZXNzX3QsCiAJdm1lX2N5Y2xlX3QsIHZtZV93aWR0aF90KTsKIGludCB2bWVfbWFzdGVyX3NldChzdHJ1Y3Qgdm1lX3Jlc291cmNlICosIGludCwgdW5zaWduZWQgbG9uZyBsb25nLAogCXVuc2lnbmVkIGxvbmcgbG9uZywgdm1lX2FkZHJlc3NfdCwgdm1lX2N5Y2xlX3QsIHZtZV93aWR0aF90KTsKQEAgLTEzMiw3ICsxNDgsNyBAQAogCXVuc2lnbmVkIGludCwgbG9mZl90KTsKIHZvaWQgdm1lX21hc3Rlcl9mcmVlKHN0cnVjdCB2bWVfcmVzb3VyY2UgKik7CiAKLXN0cnVjdCB2bWVfcmVzb3VyY2UgKnZtZV9kbWFfcmVxdWVzdChzdHJ1Y3QgZGV2aWNlICosIHZtZV9kbWFfcm91dGVfdCk7CitzdHJ1Y3Qgdm1lX3Jlc291cmNlICp2bWVfZG1hX3JlcXVlc3Qoc3RydWN0IHZtZV9kZXYgKiwgdm1lX2RtYV9yb3V0ZV90KTsKIHN0cnVjdCB2bWVfZG1hX2xpc3QgKnZtZV9uZXdfZG1hX2xpc3Qoc3RydWN0IHZtZV9yZXNvdXJjZSAqKTsKIHN0cnVjdCB2bWVfZG1hX2F0dHIgKnZtZV9kbWFfcGF0dGVybl9hdHRyaWJ1dGUodTMyLCB2bWVfcGF0dGVybl90KTsKIHN0cnVjdCB2bWVfZG1hX2F0dHIgKnZtZV9kbWFfcGNpX2F0dHJpYnV0ZShkbWFfYWRkcl90KTsKQEAgLTE0NSwxMiArMTYxLDEyIEBACiBpbnQgdm1lX2RtYV9saXN0X2ZyZWUoc3RydWN0IHZtZV9kbWFfbGlzdCAqKTsKIGludCB2bWVfZG1hX2ZyZWUoc3RydWN0IHZtZV9yZXNvdXJjZSAqKTsKIAotaW50IHZtZV9pcnFfcmVxdWVzdChzdHJ1Y3QgZGV2aWNlICosIGludCwgaW50LAoraW50IHZtZV9pcnFfcmVxdWVzdChzdHJ1Y3Qgdm1lX2RldiAqLCBpbnQsIGludCwKIAl2b2lkICgqY2FsbGJhY2spKGludCwgaW50LCB2b2lkICopLCB2b2lkICopOwotdm9pZCB2bWVfaXJxX2ZyZWUoc3RydWN0IGRldmljZSAqLCBpbnQsIGludCk7Ci1pbnQgdm1lX2lycV9nZW5lcmF0ZShzdHJ1Y3QgZGV2aWNlICosIGludCwgaW50KTsKK3ZvaWQgdm1lX2lycV9mcmVlKHN0cnVjdCB2bWVfZGV2ICosIGludCwgaW50KTsKK2ludCB2bWVfaXJxX2dlbmVyYXRlKHN0cnVjdCB2bWVfZGV2ICosIGludCwgaW50KTsKIAotc3RydWN0IHZtZV9yZXNvdXJjZSAqIHZtZV9sbV9yZXF1ZXN0KHN0cnVjdCBkZXZpY2UgKik7CitzdHJ1Y3Qgdm1lX3Jlc291cmNlICogdm1lX2xtX3JlcXVlc3Qoc3RydWN0IHZtZV9kZXYgKik7CiBpbnQgdm1lX2xtX2NvdW50KHN0cnVjdCB2bWVfcmVzb3VyY2UgKik7CiBpbnQgdm1lX2xtX3NldChzdHJ1Y3Qgdm1lX3Jlc291cmNlICosIHVuc2lnbmVkIGxvbmcgbG9uZywgdm1lX2FkZHJlc3NfdCwKIAl2bWVfY3ljbGVfdCk7CkBAIC0xNjAsOSArMTc2LDkgQEAKIGludCB2bWVfbG1fZGV0YWNoKHN0cnVjdCB2bWVfcmVzb3VyY2UgKiwgaW50KTsKIHZvaWQgdm1lX2xtX2ZyZWUoc3RydWN0IHZtZV9yZXNvdXJjZSAqKTsKIAotaW50IHZtZV9zbG90X2dldChzdHJ1Y3QgZGV2aWNlICopOworaW50IHZtZV9zbG90X2dldChzdHJ1Y3Qgdm1lX2RldiAqKTsKIAotaW50IHZtZV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHZtZV9kcml2ZXIgKik7CitpbnQgdm1lX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3Qgdm1lX2RyaXZlciAqLCB1bnNpZ25lZCBpbnQpOwogdm9pZCB2bWVfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHZtZV9kcml2ZXIgKik7CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWVfYXBpLnR4dCBiL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lX2FwaS50eHQKaW5kZXggNDkxMGU5Mi4uZThmZjIxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS92bWVfYXBpLnR4dAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZV9hcGkudHh0CkBAIC0xOCwzNyArMTgsNDkgQEAKIAogCXN0cnVjdCB2bWVfZHJpdmVyIHsKIAkJc3RydWN0IGxpc3RfaGVhZCBub2RlOwotCQljaGFyICpuYW1lOwotCQljb25zdCBzdHJ1Y3Qgdm1lX2RldmljZV9pZCAqYmluZF90YWJsZTsKLQkJaW50ICgqcHJvYmUpICAoc3RydWN0IGRldmljZSAqLCBpbnQsIGludCk7Ci0JCWludCAoKnJlbW92ZSkgKHN0cnVjdCBkZXZpY2UgKiwgaW50LCBpbnQpOwotCQl2b2lkICgqc2h1dGRvd24pICh2b2lkKTsKLQkJc3RydWN0IGRldmljZV9kcml2ZXIgICAgZHJpdmVyOworCQljb25zdCBjaGFyICpuYW1lOworCQlpbnQgKCptYXRjaCkoc3RydWN0IHZtZV9kZXYgKik7CisJCWludCAoKnByb2JlKShzdHJ1Y3Qgdm1lX2RldiAqKTsKKwkJaW50ICgqcmVtb3ZlKShzdHJ1Y3Qgdm1lX2RldiAqKTsKKwkJdm9pZCAoKnNodXRkb3duKSh2b2lkKTsKKwkJc3RydWN0IGRldmljZV9kcml2ZXIgZHJpdmVyOworCQlzdHJ1Y3QgbGlzdF9oZWFkIGRldmljZXM7CisJCXVuc2lnbmVkIGludCBuZGV2OwogCX07CiAKLUF0IHRoZSBtaW5pbXVtLCB0aGUgJy5uYW1lJywgJy5wcm9iZScgYW5kICcuYmluZF90YWJsZScgZWxlbWVudHMgb2YgdGhpcwotc3RydWN0dXJlIHNob3VsZCBiZSBjb3JyZWN0bHkgc2V0LiBUaGUgJy5uYW1lJyBlbGVtZW50IGlzIGEgcG9pbnRlciB0byBhIHN0cmluZwotaG9sZGluZyB0aGUgZGV2aWNlIGRyaXZlcidzIG5hbWUuIFRoZSAnLnByb2JlJyBlbGVtZW50IHNob3VsZCBjb250YWluIGEgcG9pbnRlcgotdG8gdGhlIHByb2JlIHJvdXRpbmUuCitBdCB0aGUgbWluaW11bSwgdGhlICcubmFtZScsICcubWF0Y2gnIGFuZCAnLnByb2JlJyBlbGVtZW50cyBvZiB0aGlzIHN0cnVjdHVyZQorc2hvdWxkIGJlIGNvcnJlY3RseSBzZXQuIFRoZSAnLm5hbWUnIGVsZW1lbnQgaXMgYSBwb2ludGVyIHRvIGEgc3RyaW5nIGhvbGRpbmcKK3RoZSBkZXZpY2UgZHJpdmVyJ3MgbmFtZS4KIAotVGhlIGFyZ3VtZW50cyBvZiB0aGUgcHJvYmUgcm91dGluZSBhcmUgYXMgZm9sbG93czoKK1RoZSAnLm1hdGNoJyBmdW5jdGlvbiBhbGxvd3MgY29udHJvbGxpbmcgdGhlIG51bWJlciBvZiBkZXZpY2VzIHRoYXQgbmVlZCB0bworYmUgcmVnaXN0ZXJlZC4gVGhlIG1hdGNoIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gMSBpZiBhIGRldmljZSBzaG91bGQgYmUKK3Byb2JlZCBhbmQgMCBvdGhlcndpc2UuIFRoaXMgZXhhbXBsZSBtYXRjaCBmdW5jdGlvbiAoZnJvbSB2bWVfdXNlci5jKSBsaW1pdHMKK3RoZSBudW1iZXIgb2YgZGV2aWNlcyBwcm9iZWQgdG8gb25lOgogCi0JcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgYnVzLCBpbnQgc2xvdCk7CisJI2RlZmluZSBVU0VSX0JVU19NQVgJMQorCS4uLgorCXN0YXRpYyBpbnQgdm1lX3VzZXJfbWF0Y2goc3RydWN0IHZtZV9kZXYgKnZkZXYpCisJeworCQlpZiAodmRldi0+aWQubnVtID49IFVTRVJfQlVTX01BWCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gMTsKKwl9CiAKLVRoZSAnLmJpbmRfdGFibGUnIGlzIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiB0eXBlICd2bWVfZGV2aWNlX2lkJzoKK1RoZSAnLnByb2JlJyBlbGVtZW50IHNob3VsZCBjb250YWluIGEgcG9pbnRlciB0byB0aGUgcHJvYmUgcm91dGluZS4gVGhlCitwcm9iZSByb3V0aW5lIGlzIHBhc3NlZCBhICdzdHJ1Y3Qgdm1lX2RldicgcG9pbnRlciBhcyBhbiBhcmd1bWVudC4gVGhlCisnc3RydWN0IHZtZV9kZXYnIHN0cnVjdHVyZSBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmc6CiAKLQlzdHJ1Y3Qgdm1lX2RldmljZV9pZCB7Ci0JCWludCBidXM7Ci0JCWludCBzbG90OworCXN0cnVjdCB2bWVfZGV2IHsKKwkJaW50IG51bTsKKwkJc3RydWN0IHZtZV9icmlkZ2UgKmJyaWRnZTsKKwkJc3RydWN0IGRldmljZSBkZXY7CisJCXN0cnVjdCBsaXN0X2hlYWQgZHJ2X2xpc3Q7CisJCXN0cnVjdCBsaXN0X2hlYWQgYnJpZGdlX2xpc3Q7CiAJfTsKIAotRWFjaCBzdHJ1Y3R1cmUgaW4gdGhpcyBhcnJheSBzaG91bGQgcHJvdmlkZSBhIGJ1cyBhbmQgc2xvdCBudW1iZXIgd2hlcmUgdGhlIGNvcmUKLXNob3VsZCBwcm9iZSwgdXNpbmcgdGhlIGRyaXZlcidzIHByb2JlIHJvdXRpbmUsIGZvciBhIGRldmljZSBvbiB0aGUgc3BlY2lmaWVkCi1WTUUgYnVzLgotCi1UaGUgVk1FIHN1YnN5c3RlbSBzdXBwb3J0cyBhIHNpbmdsZSBWTUUgZHJpdmVyIHBlciAnc2xvdCcuIFRoZXJlIGFyZSBjb25zaWRlcmVkCi10byBiZSAzMiBzbG90cyBwZXIgYnVzLCBvbmUgZm9yIGVhY2ggc2xvdC1JRCBhcyBkZWZpbmVkIGluIHRoZSBBTlNJL1ZJVEEgMS0xOTk0Ci1zcGVjaWZpY2F0aW9uIGFuZCBhcmUgYW5hbG9naW91cyB0byB0aGUgcGh5c2ljYWwgc2xvdHMgb24gdGhlIFZNRSBiYWNrcGxhbmUuCitIZXJlLCB0aGUgJ251bScgZmllbGQgcmVmZXJzIHRvIHRoZSBzZXF1ZW50aWFsIGRldmljZSBJRCBmb3IgdGhpcyBzcGVjaWZpYworZHJpdmVyLiBUaGUgYnJpZGdlIG51bWJlciAob3IgYnVzIG51bWJlcikgY2FuIGJlIGFjY2Vzc2VkIHVzaW5nCitkZXYtPmJyaWRnZS0+bnVtLgogCiBBIGZ1bmN0aW9uIGlzIGFsc28gcHJvdmlkZWQgdG8gdW5yZWdpc3RlciB0aGUgZHJpdmVyIGZyb20gdGhlIFZNRSBjb3JlIGFuZCBpcwogdXN1YWxseSBjYWxsZWQgZnJvbSB0aGUgZGV2aWNlIGRyaXZlcidzIGV4aXQgcm91dGluZToKQEAgLTU5LDkgKzcxLDExIEBACiBSZXNvdXJjZSBtYW5hZ2VtZW50CiA9PT09PT09PT09PT09PT09PT09CiAKLU9uY2UgYSBkcml2ZXIgaGFzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgVk1FIGNvcmUgdGhlIHByb3ZpZGVkIHByb2JlIHJvdXRpbmUgd2lsbAotYmUgY2FsbGVkIGZvciBlYWNoIG9mIHRoZSBidXMvc2xvdCBjb21iaW5hdGlvbiB0aGF0IGJlY29tZXMgdmFsaWQgYXMgVk1FIGJ1c2VzCi1hcmUgdGhlbXNlbHZlcyByZWdpc3RlcmVkLiAgVGhlIHByb2JlIHJvdXRpbmUgaXMgcGFzc2VkIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlcworT25jZSBhIGRyaXZlciBoYXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBWTUUgY29yZSB0aGUgcHJvdmlkZWQgbWF0Y2ggcm91dGluZSB3aWxsCitiZSBjYWxsZWQgdGhlIG51bWJlciBvZiB0aW1lcyBzcGVjaWZpZWQgZHVyaW5nIHRoZSByZWdpc3RyYXRpb24uIElmIGEgbWF0Y2gKK3N1Y2NlZWRzLCBhIG5vbi16ZXJvIHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZC4gQSB6ZXJvIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMKK2ZhaWx1cmUuIEZvciBhbGwgc3VjY2Vzc2Z1bCBtYXRjaGVzLCB0aGUgcHJvYmUgcm91dGluZSBvZiB0aGUgY29ycmVzcG9uZGluZworZHJpdmVyIGlzIGNhbGxlZC4gVGhlIHByb2JlIHJvdXRpbmUgaXMgcGFzc2VkIGEgcG9pbnRlciB0byB0aGUgZGV2aWNlcwogZGV2aWNlIHN0cnVjdHVyZS4gVGhpcyBwb2ludGVyIHNob3VsZCBiZSBzYXZlZCwgaXQgd2lsbCBiZSByZXF1aXJlZCBmb3IKIHJlcXVlc3RpbmcgVk1FIHJlc291cmNlcy4KIApAQCAtNzEsMTMgKzg1LDEzIEBACiBkcml2ZXIgYWxsb3dzIGEgcmVzb3VyY2UgdG8gYmUgYXNzaWduZWQgYmFzZWQgb24gdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZXMgb2YgdGhlCiBkcml2ZXIgaW4gcXVlc3Rpb246CiAKLQlzdHJ1Y3Qgdm1lX3Jlc291cmNlICogdm1lX21hc3Rlcl9yZXF1ZXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3Qgdm1lX3Jlc291cmNlICogdm1lX21hc3Rlcl9yZXF1ZXN0KHN0cnVjdCB2bWVfZGV2ICpkZXYsCiAJCXZtZV9hZGRyZXNzX3QgYXNwYWNlLCB2bWVfY3ljbGVfdCBjeWNsZSwgdm1lX3dpZHRoX3Qgd2lkdGgpOwogCi0Jc3RydWN0IHZtZV9yZXNvdXJjZSAqIHZtZV9zbGF2ZV9yZXF1ZXN0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3Qgdm1lX3Jlc291cmNlICogdm1lX3NsYXZlX3JlcXVlc3Qoc3RydWN0IHZtZV9kZXYgKmRldiwKIAkJdm1lX2FkZHJlc3NfdCBhc3BhY2UsIHZtZV9jeWNsZV90IGN5Y2xlKTsKIAotCXN0cnVjdCB2bWVfcmVzb3VyY2UgKnZtZV9kbWFfcmVxdWVzdChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJc3RydWN0IHZtZV9yZXNvdXJjZSAqdm1lX2RtYV9yZXF1ZXN0KHN0cnVjdCB2bWVfZGV2ICpkZXYsCiAJCXZtZV9kbWFfcm91dGVfdCByb3V0ZSk7CiAKIEZvciBzbGF2ZSB3aW5kb3dzIHRoZXNlIGF0dHJpYnV0ZXMgYXJlIHNwbGl0IGludG8gdGhvc2Ugb2YgdHlwZSAndm1lX2FkZHJlc3NfdCcKQEAgLTMwMSwxMCArMzE1LDEwIEBACiBjYWxsYmFjayBmdW5jdGlvbi4gQSB2b2lkIHBvaW50ZXIgcGFyYW1ldGVyIGlzIHByb3ZpZGVkLCB0aGUgdmFsdWUgb2Ygd2hpY2ggaXMKIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24sIHRoZSB1c2Ugb2YgdGhpcyBwb2ludGVyIGlzIHVzZXIgdW5kZWZpbmVkOgogCi0JaW50IHZtZV9pcnFfcmVxdWVzdChzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBsZXZlbCwgaW50IHN0YXRpZCwKKwlpbnQgdm1lX2lycV9yZXF1ZXN0KHN0cnVjdCB2bWVfZGV2ICpkZXYsIGludCBsZXZlbCwgaW50IHN0YXRpZCwKIAkJdm9pZCAoKmNhbGxiYWNrKShpbnQsIGludCwgdm9pZCAqKSwgdm9pZCAqcHJpdik7CiAKLQl2b2lkIHZtZV9pcnFfZnJlZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBsZXZlbCwgaW50IHN0YXRpZCk7CisJdm9pZCB2bWVfaXJxX2ZyZWUoc3RydWN0IHZtZV9kZXYgKmRldiwgaW50IGxldmVsLCBpbnQgc3RhdGlkKTsKIAogVGhlIGNhbGxiYWNrIHBhcmFtZXRlcnMgYXJlIGFzIGZvbGxvd3MuIENhcmUgbXVzdCBiZSB0YWtlbiBpbiB3cml0aW5nIGEgY2FsbGJhY2sKIGZ1bmN0aW9uLCBjYWxsYmFjayBmdW5jdGlvbnMgcnVuIGluIGludGVycnVwdCBjb250ZXh0OgpAQCAtMzE4LDcgKzMzMiw3IEBACiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgVk1FIGludGVycnVwdCBhdCBhIGdpdmVuIFZNRQogbGV2ZWwgYW5kIFZNRSBzdGF0dXMgSUQ6CiAKLQlpbnQgdm1lX2lycV9nZW5lcmF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBsZXZlbCwgaW50IHN0YXRpZCk7CisJaW50IHZtZV9pcnFfZ2VuZXJhdGUoc3RydWN0IHZtZV9kZXYgKmRldiwgaW50IGxldmVsLCBpbnQgc3RhdGlkKTsKIAogCiBMb2NhdGlvbiBtb25pdG9ycwpAQCAtMzM0LDcgKzM0OCw3IEBACiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgdG8gcmVxdWVzdCB0aGUgdXNlIG9mIGEgYmxvY2sgb2YgbG9jYXRpb24KIG1vbml0b3JzIGFuZCB0byBmcmVlIHRoZW0gYWZ0ZXIgdGhleSBhcmUgbm8gbG9uZ2VyIHJlcXVpcmVkOgogCi0Jc3RydWN0IHZtZV9yZXNvdXJjZSAqIHZtZV9sbV9yZXF1ZXN0KHN0cnVjdCBkZXZpY2UgKmRldik7CisJc3RydWN0IHZtZV9yZXNvdXJjZSAqIHZtZV9sbV9yZXF1ZXN0KHN0cnVjdCB2bWVfZGV2ICpkZXYpOwogCiAJdm9pZCB2bWVfbG1fZnJlZShzdHJ1Y3Qgdm1lX3Jlc291cmNlICogcmVzKTsKIApAQCAtMzgwLDQgKzM5NCw0IEBACiAKIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2xvdCBJRCBvZiB0aGUgcHJvdmlkZWQgYnJpZGdlLgogCi0JaW50IHZtZV9zbG90X2dldChzdHJ1Y3QgZGV2aWNlICpkZXYpOworCWludCB2bWVfc2xvdF9nZXQoc3RydWN0IHZtZV9kZXYgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdm1lL3ZtZV9icmlkZ2UuaCBiL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lX2JyaWRnZS5oCmluZGV4IDRjNmVjMzEuLmMyZGVkYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lX2JyaWRnZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvdm1lX2JyaWRnZS5oCkBAIC0yLDcgKzIsNiBAQAogI2RlZmluZSBfVk1FX0JSSURHRV9IXwogCiAjZGVmaW5lIFZNRV9DUkNTUl9CVUZfU0laRSAoNTA4KjEwMjQpCi0jZGVmaW5lIFZNRV9TTE9UU19NQVggMzIKIC8qCiAgKiBSZXNvdXJjZSBzdHJ1Y3R1cmVzCiAgKi8KQEAgLTk4LDggKzk3LDYgQEAKIC8qIFRoaXMgc3RydWN0dXJlIHN0b3JlcyBhbGwgdGhlIGluZm9ybWF0aW9uIGFib3V0IG9uZSBicmlkZ2UKICAqIFRoZSBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBieSB0aGUgZHJpdmVyIGFuZCBvbmUgaW5zdGFuY2UKICAqIG9mIHRoZSBzdHJ1Y3R1cmUgc2hvdWxkIGJlIHByZXNlbnQgZm9yIGVhY2ggVk1FIGNoaXAgcHJlc2VudCBpbiB0aGUgc3lzdGVtLgotICoKLSAqIEN1cnJlbnRseSB3ZSBhc3N1bWUgdGhhdCBhbGwgY2hpcHMgYXJlIFBDSS1iYXNlZAogICovCiBzdHJ1Y3Qgdm1lX2JyaWRnZSB7CiAJY2hhciBuYW1lW1ZNRU5BTVNJWl07CkBAIC0xMTAsMTQgKzEwNywxMiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbG1fcmVzb3VyY2VzOwogCiAJc3RydWN0IGxpc3RfaGVhZCB2bWVfZXJyb3JzOwkvKiBMaXN0IGZvciBlcnJvcnMgZ2VuZXJhdGVkIG9uIFZNRSAqLworCXN0cnVjdCBsaXN0X2hlYWQgZGV2aWNlczsJLyogTGlzdCBvZiBkZXZpY2VzIG9uIHRoaXMgYnJpZGdlICovCiAKIAkvKiBCcmlkZ2UgSW5mbyAtIFhYWCBNb3ZlIHRvIHByaXZhdGUgc3RydWN0dXJlPyAqLwotCXN0cnVjdCBkZXZpY2UgKnBhcmVudDsJLyogR2VuZXJpYyBkZXZpY2Ugc3RydWN0IChwZGV2LT5kZXYgZm9yIFBDSSkgKi8KKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQ7CS8qIFBhcmVudCBkZXZpY2UgKGVnLiBwZGV2LT5kZXYgZm9yIFBDSSkgKi8KIAl2b2lkICpkcml2ZXJfcHJpdjsJLyogUHJpdmF0ZSBwb2ludGVyIGZvciB0aGUgYnJpZGdlIGRyaXZlciAqLwotCi0Jc3RydWN0IGRldmljZSBkZXZbVk1FX1NMT1RTX01BWF07CS8qIERldmljZSByZWdpc3RlcmVkIHdpdGgKLQkJCQkJCSAqIGRldmljZSBtb2RlbCBvbiBWTUUgYnVzCi0JCQkJCQkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGJ1c19saXN0OyAvKiBsaXN0IG9mIFZNRSBidXNlcyAqLwogCiAJLyogSW50ZXJydXB0IGNhbGxiYWNrcyAqLwogCXN0cnVjdCB2bWVfaXJxIGlycVs3XTsKQEAgLTE2NSw2ICsxNjAsMTIgQEAKIAogCS8qIENSL0NTUiBzcGFjZSBmdW5jdGlvbnMgKi8KIAlpbnQgKCpzbG90X2dldCkgKHN0cnVjdCB2bWVfYnJpZGdlICopOworCisJLyogQnJpZGdlIHBhcmVudCBpbnRlcmZhY2UgKi8KKwl2b2lkICooKmFsbG9jX2NvbnNpc3RlbnQpKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCWRtYV9hZGRyX3QgKmRtYSk7CisJdm9pZCAoKmZyZWVfY29uc2lzdGVudCkoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJdm9pZCAqdmFkZHIsIGRtYV9hZGRyX3QgZG1hKTsKIH07CiAKIHZvaWQgdm1lX2lycV9oYW5kbGVyKHN0cnVjdCB2bWVfYnJpZGdlICosIGludCwgaW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvSUVFRTExaC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9JRUVFMTFoLmMKaW5kZXggZTA3ZWJkNS4uY2Y3MzY0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9JRUVFMTFoLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9JRUVFMTFoLmMKQEAgLTQxLDUyICs0MSw1MiBAQAogI2luY2x1ZGUgImNoYW5uZWwuaCIKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIFN0YXRpYyBEZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQgICAgICAgICAgbXNnbGV2ZWwgICAgICAgICAgICAgICAgPU1TR19MRVZFTF9JTkZPOworc3RhdGljIGludCAgICAgICAgICBtc2dsZXZlbCAgICAgICAgICAgICAgICA9IE1TR19MRVZFTF9JTkZPOwogCiAjcHJhZ21hIHBhY2soMSkKIAogdHlwZWRlZiBzdHJ1Y3QgX1dMQU5fRlJBTUVfQUNUSU9OIHsKLSAgICBXTEFOXzgwMjExSERSX0EzICAgIEhlYWRlcjsKLSAgICB1bnNpZ25lZCBjaGFyIGJ5Q2F0ZWdvcnk7Ci0gICAgdW5zaWduZWQgY2hhciBieUFjdGlvbjsKLSAgICB1bnNpZ25lZCBjaGFyIGFieVZhcnNbMV07CisJV0xBTl84MDIxMUhEUl9BMyAgICBIZWFkZXI7CisJdW5zaWduZWQgY2hhciBieUNhdGVnb3J5OworCXVuc2lnbmVkIGNoYXIgYnlBY3Rpb247CisJdW5zaWduZWQgY2hhciBhYnlWYXJzWzFdOwogfSBXTEFOX0ZSQU1FX0FDVElPTiwgKlBXTEFOX0ZSQU1FX0FDVElPTjsKIAogdHlwZWRlZiBzdHJ1Y3QgX1dMQU5fRlJBTUVfTVNSUkVRIHsKLSAgICBXTEFOXzgwMjExSERSX0EzICAgIEhlYWRlcjsKLSAgICB1bnNpZ25lZCBjaGFyIGJ5Q2F0ZWdvcnk7Ci0gICAgdW5zaWduZWQgY2hhciBieUFjdGlvbjsKLSAgICB1bnNpZ25lZCBjaGFyIGJ5RGlhbG9nVG9rZW47Ci0gICAgV0xBTl9JRV9NRUFTVVJFX1JFUSBzTVNSUmVxRUlEc1sxXTsKKwlXTEFOXzgwMjExSERSX0EzICAgIEhlYWRlcjsKKwl1bnNpZ25lZCBjaGFyIGJ5Q2F0ZWdvcnk7CisJdW5zaWduZWQgY2hhciBieUFjdGlvbjsKKwl1bnNpZ25lZCBjaGFyIGJ5RGlhbG9nVG9rZW47CisJV0xBTl9JRV9NRUFTVVJFX1JFUSBzTVNSUmVxRUlEc1sxXTsKIH0gV0xBTl9GUkFNRV9NU1JSRVEsICpQV0xBTl9GUkFNRV9NU1JSRVE7CiAKIHR5cGVkZWYgc3RydWN0IF9XTEFOX0ZSQU1FX01TUlJFUCB7Ci0gICAgV0xBTl84MDIxMUhEUl9BMyAgICBIZWFkZXI7Ci0gICAgdW5zaWduZWQgY2hhciBieUNhdGVnb3J5OwotICAgIHVuc2lnbmVkIGNoYXIgYnlBY3Rpb247Ci0gICAgdW5zaWduZWQgY2hhciBieURpYWxvZ1Rva2VuOwotICAgIFdMQU5fSUVfTUVBU1VSRV9SRVAgc01TUlJlcEVJRHNbMV07CisJV0xBTl84MDIxMUhEUl9BMyAgICBIZWFkZXI7CisJdW5zaWduZWQgY2hhciBieUNhdGVnb3J5OworCXVuc2lnbmVkIGNoYXIgYnlBY3Rpb247CisJdW5zaWduZWQgY2hhciBieURpYWxvZ1Rva2VuOworCVdMQU5fSUVfTUVBU1VSRV9SRVAgc01TUlJlcEVJRHNbMV07CiB9IFdMQU5fRlJBTUVfTVNSUkVQLCAqUFdMQU5fRlJBTUVfTVNSUkVQOwogCiB0eXBlZGVmIHN0cnVjdCBfV0xBTl9GUkFNRV9UUENSRVEgewotICAgIFdMQU5fODAyMTFIRFJfQTMgICAgSGVhZGVyOwotICAgIHVuc2lnbmVkIGNoYXIgYnlDYXRlZ29yeTsKLSAgICB1bnNpZ25lZCBjaGFyIGJ5QWN0aW9uOwotICAgIHVuc2lnbmVkIGNoYXIgYnlEaWFsb2dUb2tlbjsKLSAgICBXTEFOX0lFX1RQQ19SRVEgICAgIHNUUENSZXFFSURzOworCVdMQU5fODAyMTFIRFJfQTMgICAgSGVhZGVyOworCXVuc2lnbmVkIGNoYXIgYnlDYXRlZ29yeTsKKwl1bnNpZ25lZCBjaGFyIGJ5QWN0aW9uOworCXVuc2lnbmVkIGNoYXIgYnlEaWFsb2dUb2tlbjsKKwlXTEFOX0lFX1RQQ19SRVEgICAgIHNUUENSZXFFSURzOwogfSBXTEFOX0ZSQU1FX1RQQ1JFUSwgKlBXTEFOX0ZSQU1FX1RQQ1JFUTsKIAogdHlwZWRlZiBzdHJ1Y3QgX1dMQU5fRlJBTUVfVFBDUkVQIHsKLSAgICBXTEFOXzgwMjExSERSX0EzICAgIEhlYWRlcjsKLSAgICB1bnNpZ25lZCBjaGFyIGJ5Q2F0ZWdvcnk7Ci0gICAgdW5zaWduZWQgY2hhciBieUFjdGlvbjsKLSAgICB1bnNpZ25lZCBjaGFyIGJ5RGlhbG9nVG9rZW47Ci0gICAgV0xBTl9JRV9UUENfUkVQICAgICBzVFBDUmVwRUlEczsKKwlXTEFOXzgwMjExSERSX0EzICAgIEhlYWRlcjsKKwl1bnNpZ25lZCBjaGFyIGJ5Q2F0ZWdvcnk7CisJdW5zaWduZWQgY2hhciBieUFjdGlvbjsKKwl1bnNpZ25lZCBjaGFyIGJ5RGlhbG9nVG9rZW47CisJV0xBTl9JRV9UUENfUkVQICAgICBzVFBDUmVwRUlEczsKIH0gV0xBTl9GUkFNRV9UUENSRVAsICpQV0xBTl9GUkFNRV9UUENSRVA7CiAKICNwcmFnbWEgcGFjaygpCiAKLS8vIGFjdGlvbiBmaWVsZCByZWZlcmVuY2UgaWVlZSA4MDIuMTFoIFRhYmxlIDIwZQorLyogYWN0aW9uIGZpZWxkIHJlZmVyZW5jZSBpZWVlIDgwMi4xMWggVGFibGUgMjBlICovCiAjZGVmaW5lIEFDVElPTl9NU1JSRVEgICAgICAgMAogI2RlZmluZSBBQ1RJT05fTVNSUkVQICAgICAgIDEKICNkZWZpbmUgQUNUSU9OX1RQQ1JFUSAgICAgICAyCkBAIC0xMDEsODQgKzEwMSwxMDAgQEAKIHN0YXRpYyBib29sIHNfYlJ4TVNSUmVxKFBTTWdtdE9iamVjdCBwTWdtdCwgUFdMQU5fRlJBTUVfTVNSUkVRIHBNU1JSZXEsCiAJCXVuc2lnbmVkIGludCB1TGVuZ3RoKQogewotICAgIHNpemVfdCAgICB1TnVtT2ZFSURzID0gMDsKLSAgICBib29sIGJSZXN1bHQgPSB0cnVlOworCXNpemVfdCAgICB1TnVtT2ZFSURzID0gMDsKKwlib29sIGJSZXN1bHQgPSB0cnVlOwogCi0gICAgaWYgKHVMZW5ndGggPD0gV0xBTl9BM0ZSX01BWExFTikgewotICAgICAgICBtZW1jcHkocE1nbXQtPmFieUN1cnJlbnRNU1JSZXEsIHBNU1JSZXEsIHVMZW5ndGgpOwotICAgIH0KLSAgICB1TnVtT2ZFSURzID0gKCh1TGVuZ3RoIC0gb2Zmc2V0b2YoV0xBTl9GUkFNRV9NU1JSRVEsIHNNU1JSZXFFSURzKSkvIChzaXplb2YoV0xBTl9JRV9NRUFTVVJFX1JFUSkpKTsKLSAgICBwTWdtdC0+cEN1cnJNZWFzdXJlRUlEUmVwID0gJigoKFBXTEFOX0ZSQU1FX01TUlJFUCkgKHBNZ210LT5hYnlDdXJyZW50TVNSUmVwKSktPnNNU1JSZXBFSURzWzBdKTsKLSAgICBwTWdtdC0+dUxlbmd0aE9mUmVwRUlEcyA9IDA7Ci0gICAgYlJlc3VsdCA9IENBUkRiU3RhcnRNZWFzdXJlKHBNZ210LT5wQWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChQV0xBTl9GUkFNRV9NU1JSRVEpIChwTWdtdC0+YWJ5Q3VycmVudE1TUlJlcSkpLT5zTVNSUmVxRUlEcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdU51bU9mRUlEcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHJldHVybiAoYlJlc3VsdCk7CisJaWYgKHVMZW5ndGggPD0gV0xBTl9BM0ZSX01BWExFTikKKwkJbWVtY3B5KHBNZ210LT5hYnlDdXJyZW50TVNSUmVxLCBwTVNSUmVxLCB1TGVuZ3RoKTsKKwl1TnVtT2ZFSURzID0gKCh1TGVuZ3RoIC0gb2Zmc2V0b2YoV0xBTl9GUkFNRV9NU1JSRVEsCisJCQlzTVNSUmVxRUlEcykpLworCQkJKHNpemVvZihXTEFOX0lFX01FQVNVUkVfUkVRKSkpOworCXBNZ210LT5wQ3Vyck1lYXN1cmVFSURSZXAgPSAmKCgoUFdMQU5fRlJBTUVfTVNSUkVQKQorCQkJKHBNZ210LT5hYnlDdXJyZW50TVNSUmVwKSktPnNNU1JSZXBFSURzWzBdKTsKKwlwTWdtdC0+dUxlbmd0aE9mUmVwRUlEcyA9IDA7CisJYlJlc3VsdCA9IENBUkRiU3RhcnRNZWFzdXJlKHBNZ210LT5wQWRhcHRlciwKKwkJCQkoKFBXTEFOX0ZSQU1FX01TUlJFUSkKKwkJCQkocE1nbXQtPmFieUN1cnJlbnRNU1JSZXEpKS0+c01TUlJlcUVJRHMsCisJCQkJdU51bU9mRUlEcworCQkJCSk7CisJcmV0dXJuIGJSZXN1bHQ7CiB9CiAKIAotc3RhdGljIGJvb2wgc19iUnhUUENSZXEoUFNNZ210T2JqZWN0IHBNZ210LCBQV0xBTl9GUkFNRV9UUENSRVEgcFRQQ1JlcSwgdW5zaWduZWQgY2hhciBieVJhdGUsIHVuc2lnbmVkIGNoYXIgYnlSU1NJKQorc3RhdGljIGJvb2wgc19iUnhUUENSZXEoUFNNZ210T2JqZWN0IHBNZ210LAorCQkJUFdMQU5fRlJBTUVfVFBDUkVRIHBUUENSZXEsCisJCQl1bnNpZ25lZCBjaGFyIGJ5UmF0ZSwKKwkJCXVuc2lnbmVkIGNoYXIgYnlSU1NJKQogewotICAgIFBXTEFOX0ZSQU1FX1RQQ1JFUCAgcEZyYW1lOwotICAgIFBTVHhNZ210UGFja2V0ICAgICAgcFR4UGFja2V0ID0gTlVMTDsKKwlQV0xBTl9GUkFNRV9UUENSRVAgIHBGcmFtZTsKKwlQU1R4TWdtdFBhY2tldCAgICAgIHBUeFBhY2tldCA9IE5VTEw7CiAKKwlwVHhQYWNrZXQgPSAoUFNUeE1nbXRQYWNrZXQpcE1nbXQtPnBieU1nbXRQYWNrZXRQb29sOworCW1lbXNldChwVHhQYWNrZXQsIDAsIHNpemVvZihTVHhNZ210UGFja2V0KSArIFdMQU5fQTNGUl9NQVhMRU4pOworCXBUeFBhY2tldC0+cDgwMjExSGVhZGVyID0gKFBVV0xBTl84MDIxMUhEUikoKHVuc2lnbmVkIGNoYXIgKilwVHhQYWNrZXQgKworc2l6ZW9mKFNUeE1nbXRQYWNrZXQpKTsKIAotICAgIHBUeFBhY2tldCA9IChQU1R4TWdtdFBhY2tldClwTWdtdC0+cGJ5TWdtdFBhY2tldFBvb2w7Ci0gICAgbWVtc2V0KHBUeFBhY2tldCwgMCwgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpICsgV0xBTl9BM0ZSX01BWExFTik7Ci0gICAgcFR4UGFja2V0LT5wODAyMTFIZWFkZXIgPSAoUFVXTEFOXzgwMjExSERSKSgodW5zaWduZWQgY2hhciAqKXBUeFBhY2tldCArIHNpemVvZihTVHhNZ210UGFja2V0KSk7CisJcEZyYW1lID0gKFBXTEFOX0ZSQU1FX1RQQ1JFUCkoKHVuc2lnbmVkIGNoYXIgKilwVHhQYWNrZXQgKworc2l6ZW9mKFNUeE1nbXRQYWNrZXQpKTsKIAotICAgIHBGcmFtZSA9IChQV0xBTl9GUkFNRV9UUENSRVApKCh1bnNpZ25lZCBjaGFyICopcFR4UGFja2V0ICsgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpKTsKKwlwRnJhbWUtPkhlYWRlci53RnJhbWVDdGwgPSAoV0xBTl9TRVRfRkNfRlRZUEUoV0xBTl9GVFlQRV9NR01UKSB8CisJCQkJV0xBTl9TRVRfRkNfRlNUWVBFKFdMQU5fRlNUWVBFX0FDVElPTikKKwkJCQkpOwogCi0gICAgcEZyYW1lLT5IZWFkZXIud0ZyYW1lQ3RsID0gKCAgIFdMQU5fU0VUX0ZDX0ZUWVBFKFdMQU5fRlRZUEVfTUdNVCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTl9TRVRfRkNfRlNUWVBFKFdMQU5fRlNUWVBFX0FDVElPTikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKwltZW1jcHkocEZyYW1lLT5IZWFkZXIuYWJ5QWRkcjEsCisJCXBUUENSZXEtPkhlYWRlci5hYnlBZGRyMiwKKwkJV0xBTl9BRERSX0xFTik7CisJbWVtY3B5KHBGcmFtZS0+SGVhZGVyLmFieUFkZHIyLAorCQlDQVJEcEdldEN1cnJlbnRBZGRyZXNzKHBNZ210LT5wQWRhcHRlciksCisJCVdMQU5fQUREUl9MRU4pOworCW1lbWNweShwRnJhbWUtPkhlYWRlci5hYnlBZGRyMywKKwkJcE1nbXQtPmFieUN1cnJCU1NJRCwKKwkJV0xBTl9CU1NJRF9MRU4pOwogCi0gICAgbWVtY3B5KCBwRnJhbWUtPkhlYWRlci5hYnlBZGRyMSwgcFRQQ1JlcS0+SGVhZGVyLmFieUFkZHIyLCBXTEFOX0FERFJfTEVOKTsKLSAgICBtZW1jcHkoIHBGcmFtZS0+SGVhZGVyLmFieUFkZHIyLCBDQVJEcEdldEN1cnJlbnRBZGRyZXNzKHBNZ210LT5wQWRhcHRlciksIFdMQU5fQUREUl9MRU4pOwotICAgIG1lbWNweSggcEZyYW1lLT5IZWFkZXIuYWJ5QWRkcjMsIHBNZ210LT5hYnlDdXJyQlNTSUQsIFdMQU5fQlNTSURfTEVOKTsKKwlwRnJhbWUtPmJ5Q2F0ZWdvcnkgPSAwOworCXBGcmFtZS0+YnlBY3Rpb24gPSAzOworCXBGcmFtZS0+YnlEaWFsb2dUb2tlbiA9ICgoUFdMQU5fRlJBTUVfTVNSUkVRKQorKHBNZ210LT5hYnlDdXJyZW50TVNSUmVxKSktPmJ5RGlhbG9nVG9rZW47CiAKLSAgICBwRnJhbWUtPmJ5Q2F0ZWdvcnkgPSAwOwotICAgIHBGcmFtZS0+YnlBY3Rpb24gPSAzOwotICAgIHBGcmFtZS0+YnlEaWFsb2dUb2tlbiA9ICgoUFdMQU5fRlJBTUVfTVNSUkVRKSAocE1nbXQtPmFieUN1cnJlbnRNU1JSZXEpKS0+YnlEaWFsb2dUb2tlbjsKKwlwRnJhbWUtPnNUUENSZXBFSURzLmJ5RWxlbWVudElEID0gV0xBTl9FSURfVFBDX1JFUDsKKwlwRnJhbWUtPnNUUENSZXBFSURzLmxlbiA9IDI7CisJcEZyYW1lLT5zVFBDUmVwRUlEcy5ieVR4UG93ZXIgPSBDQVJEYnlHZXRUcmFuc21pdFBvd2VyKHBNZ210LT5wQWRhcHRlcik7CisJc3dpdGNoIChieVJhdGUpIHsKKwljYXNlIFJBVEVfNTRNOgorCQlwRnJhbWUtPnNUUENSZXBFSURzLmJ5TGlua01hcmdpbiA9IDY1IC0gYnlSU1NJOworCQlicmVhazsKKwljYXNlIFJBVEVfNDhNOgorCQlwRnJhbWUtPnNUUENSZXBFSURzLmJ5TGlua01hcmdpbiA9IDY2IC0gYnlSU1NJOworCQlicmVhazsKKwljYXNlIFJBVEVfMzZNOgorCQlwRnJhbWUtPnNUUENSZXBFSURzLmJ5TGlua01hcmdpbiA9IDcwIC0gYnlSU1NJOworCQlicmVhazsKKwljYXNlIFJBVEVfMjRNOgorCQlwRnJhbWUtPnNUUENSZXBFSURzLmJ5TGlua01hcmdpbiA9IDc0IC0gYnlSU1NJOworCQlicmVhazsKKwljYXNlIFJBVEVfMThNOgorCQlwRnJhbWUtPnNUUENSZXBFSURzLmJ5TGlua01hcmdpbiA9IDc3IC0gYnlSU1NJOworCQlicmVhazsKKwljYXNlIFJBVEVfMTJNOgorCQlwRnJhbWUtPnNUUENSZXBFSURzLmJ5TGlua01hcmdpbiA9IDc5IC0gYnlSU1NJOworCQlicmVhazsKKwljYXNlIFJBVEVfOU06CisJCXBGcmFtZS0+c1RQQ1JlcEVJRHMuYnlMaW5rTWFyZ2luID0gODEgLSBieVJTU0k7CisJCWJyZWFrOworCWNhc2UgUkFURV82TToKKwlkZWZhdWx0OgorCQlwRnJhbWUtPnNUUENSZXBFSURzLmJ5TGlua01hcmdpbiA9IDgyIC0gYnlSU1NJOworCQlicmVhazsKK30KIAotICAgIHBGcmFtZS0+c1RQQ1JlcEVJRHMuYnlFbGVtZW50SUQgPSBXTEFOX0VJRF9UUENfUkVQOwotICAgIHBGcmFtZS0+c1RQQ1JlcEVJRHMubGVuID0gMjsKLSAgICBwRnJhbWUtPnNUUENSZXBFSURzLmJ5VHhQb3dlciA9IENBUkRieUdldFRyYW5zbWl0UG93ZXIocE1nbXQtPnBBZGFwdGVyKTsKLSAgICBzd2l0Y2ggKGJ5UmF0ZSkgewotICAgICAgICBjYXNlIFJBVEVfNTRNOgotICAgICAgICAgICAgcEZyYW1lLT5zVFBDUmVwRUlEcy5ieUxpbmtNYXJnaW4gPSA2NSAtIGJ5UlNTSTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJBVEVfNDhNOgotICAgICAgICAgICAgcEZyYW1lLT5zVFBDUmVwRUlEcy5ieUxpbmtNYXJnaW4gPSA2NiAtIGJ5UlNTSTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJBVEVfMzZNOgotICAgICAgICAgICAgcEZyYW1lLT5zVFBDUmVwRUlEcy5ieUxpbmtNYXJnaW4gPSA3MCAtIGJ5UlNTSTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJBVEVfMjRNOgotICAgICAgICAgICAgcEZyYW1lLT5zVFBDUmVwRUlEcy5ieUxpbmtNYXJnaW4gPSA3NCAtIGJ5UlNTSTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJBVEVfMThNOgotICAgICAgICAgICAgcEZyYW1lLT5zVFBDUmVwRUlEcy5ieUxpbmtNYXJnaW4gPSA3NyAtIGJ5UlNTSTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJBVEVfMTJNOgotICAgICAgICAgICAgcEZyYW1lLT5zVFBDUmVwRUlEcy5ieUxpbmtNYXJnaW4gPSA3OSAtIGJ5UlNTSTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJBVEVfOU06Ci0gICAgICAgICAgICBwRnJhbWUtPnNUUENSZXBFSURzLmJ5TGlua01hcmdpbiA9IDgxIC0gYnlSU1NJOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkFURV82TToKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHBGcmFtZS0+c1RQQ1JlcEVJRHMuYnlMaW5rTWFyZ2luID0gODIgLSBieVJTU0k7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBwVHhQYWNrZXQtPmNiTVBEVUxlbiA9IHNpemVvZihXTEFOX0ZSQU1FX1RQQ1JFUCk7Ci0gICAgcFR4UGFja2V0LT5jYlBheWxvYWRMZW4gPSBzaXplb2YoV0xBTl9GUkFNRV9UUENSRVApIC0gV0xBTl9IRFJfQUREUjNfTEVOOwotICAgIGlmIChjc01nbXRfeG1pdChwTWdtdC0+cEFkYXB0ZXIsIHBUeFBhY2tldCkgIT0gQ01EX1NUQVRVU19QRU5ESU5HKQotICAgICAgICByZXR1cm4gKGZhbHNlKTsKLSAgICByZXR1cm4gKHRydWUpOwotLy8gICAgcmV0dXJuIChDQVJEYlNlbmRQYWNrZXQocE1nbXQtPnBBZGFwdGVyLCBwRnJhbWUsIFBLVF9UWVBFXzgwMl8xMV9NTkcsIHNpemVvZihXTEFOX0ZSQU1FX1RQQ1JFUCkpKTsKKwlwVHhQYWNrZXQtPmNiTVBEVUxlbiA9IHNpemVvZihXTEFOX0ZSQU1FX1RQQ1JFUCk7CisJcFR4UGFja2V0LT5jYlBheWxvYWRMZW4gPSBzaXplb2YoV0xBTl9GUkFNRV9UUENSRVApIC0KK1dMQU5fSERSX0FERFIzX0xFTjsKKwlpZiAoY3NNZ210X3htaXQocE1nbXQtPnBBZGFwdGVyLCBwVHhQYWNrZXQpICE9IENNRF9TVEFUVVNfUEVORElORykKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworLyogICAgcmV0dXJuIChDQVJEYlNlbmRQYWNrZXQocE1nbXQtPnBBZGFwdGVyLCBwRnJhbWUsIFBLVF9UWVBFXzgwMl8xMV9NTkcsCitzaXplb2YoV0xBTl9GUkFNRV9UUENSRVApKSk7ICovCiAKIH0KIApAQCAtMjA0LDEwMiArMjIwLDExMCBAQAogICoKIC0qLwogYm9vbAotSUVFRTExaGJNZ3JSeEFjdGlvbiAoCi0gICAgdm9pZCAqcE1nbXRIYW5kbGUsCi0gICAgdm9pZCAqcFJ4UGFja2V0Ci0gICAgKQorSUVFRTExaGJNZ3JSeEFjdGlvbih2b2lkICpwTWdtdEhhbmRsZSwgdm9pZCAqcFJ4UGFja2V0KQogewotICAgIFBTTWdtdE9iamVjdCAgICAgICAgICAgIHBNZ210ID0gKFBTTWdtdE9iamVjdCkgcE1nbXRIYW5kbGU7Ci0gICAgUFdMQU5fRlJBTUVfQUNUSU9OICAgICAgcEFjdGlvbiA9IE5VTEw7Ci0gICAgdW5zaWduZWQgaW50IHVMZW5ndGggPSAwOwotICAgIFBXTEFOX0lFX0NIX1NXICAgICAgICAgIHBDaGFubmVsU3dpdGNoID0gTlVMTDsKKwlQU01nbXRPYmplY3QgICAgICAgICAgICBwTWdtdCA9IChQU01nbXRPYmplY3QpIHBNZ210SGFuZGxlOworCVBXTEFOX0ZSQU1FX0FDVElPTiAgICAgIHBBY3Rpb24gPSBOVUxMOworCXVuc2lnbmVkIGludCB1TGVuZ3RoID0gMDsKKwlQV0xBTl9JRV9DSF9TVyAgICAgICAgICBwQ2hhbm5lbFN3aXRjaCA9IE5VTEw7CiAKKwkvKiBkZWNvZGUgdGhlIGZyYW1lICovCisJdUxlbmd0aCA9ICgoUFNSeE1nbXRQYWNrZXQpcFJ4UGFja2V0KS0+Y2JNUERVTGVuOworCWlmICh1TGVuZ3RoID4gV0xBTl9BM0ZSX01BWExFTikKKwkJcmV0dXJuIGZhbHNlOwogCi0gICAgLy8gZGVjb2RlIHRoZSBmcmFtZQotICAgIHVMZW5ndGggPSAoKFBTUnhNZ210UGFja2V0KXBSeFBhY2tldCktPmNiTVBEVUxlbjsKLSAgICBpZiAodUxlbmd0aCA+IFdMQU5fQTNGUl9NQVhMRU4pIHsKLSAgICAgICAgcmV0dXJuIChmYWxzZSk7Ci0gICAgfQorCXBBY3Rpb24gPSAoUFdMQU5fRlJBTUVfQUNUSU9OKQorKCgoUFNSeE1nbXRQYWNrZXQpcFJ4UGFja2V0KS0+cDgwMjExSGVhZGVyKTsKIAorCWlmIChwQWN0aW9uLT5ieUNhdGVnb3J5ID09IDApIHsKKwkJc3dpdGNoIChwQWN0aW9uLT5ieUFjdGlvbikgeworCQljYXNlIEFDVElPTl9NU1JSRVE6CisJCQlyZXR1cm4gc19iUnhNU1JSZXEocE1nbXQsCisJCQkJCShQV0xBTl9GUkFNRV9NU1JSRVEpCisJCQkJCXBBY3Rpb24sCisJCQkJCXVMZW5ndGgpOworCQkJYnJlYWs7CisJCWNhc2UgQUNUSU9OX01TUlJFUDoKKwkJCWJyZWFrOworCQljYXNlIEFDVElPTl9UUENSRVE6CisJCQlyZXR1cm4gc19iUnhUUENSZXEocE1nbXQsCisJCQkJKFBXTEFOX0ZSQU1FX1RQQ1JFUSkgcEFjdGlvbiwKKwkJCQkoKFBTUnhNZ210UGFja2V0KXBSeFBhY2tldCktPmJ5UnhSYXRlLAorCQkJCSh1bnNpZ25lZCBjaGFyKQorCQkJCSgoUFNSeE1nbXRQYWNrZXQpcFJ4UGFja2V0KS0+dVJTU0kpOworCQkJYnJlYWs7CisJCWNhc2UgQUNUSU9OX1RQQ1JFUDoKKwkJCWJyZWFrOworCQljYXNlIEFDVElPTl9DSFNXOgorCQkJcENoYW5uZWxTd2l0Y2ggPSAoUFdMQU5fSUVfQ0hfU1cpIChwQWN0aW9uLT5hYnlWYXJzKTsKKwkJCWlmICgocENoYW5uZWxTd2l0Y2gtPmJ5RWxlbWVudElEID09IFdMQU5fRUlEX0NIX1NXSVRDSCkKKwkJCSYmIChwQ2hhbm5lbFN3aXRjaC0+bGVuID09IDMpKSB7CisJCQkJLyogdmFsaWQgZWxlbWVudCBpZCAqLworCQkJCUNBUkRiQ2hhbm5lbFN3aXRjaChwTWdtdC0+cEFkYXB0ZXIsCisJCQkJcENoYW5uZWxTd2l0Y2gtPmJ5TW9kZSwKKwkJCQlnZXRfY2hhbm5lbF9tYXBwaW5nKHBNZ210LT5wQWRhcHRlciwKKwkJCQlwQ2hhbm5lbFN3aXRjaC0+YnlDaGFubmVsLAorCQkJCXBNZ210LT5lQ3VycmVudFBIWU1vZGUpLAorCQkJCXBDaGFubmVsU3dpdGNoLT5ieUNvdW50KTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsCisJCQkJS0VSTl9JTkZPIlVua25vd24gQWN0aW9uID0gJWRcbiIsCisJCQkJcEFjdGlvbi0+YnlBY3Rpb24pOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iVW5rbm93biBDYXRlZ29yeSA9ICVkXG4iLAorcEFjdGlvbi0+YnlDYXRlZ29yeSk7CisJcEFjdGlvbi0+YnlDYXRlZ29yeSB8PSAweDgwOwogCi0gICAgcEFjdGlvbiA9IChQV0xBTl9GUkFNRV9BQ1RJT04pICgoKFBTUnhNZ210UGFja2V0KXBSeFBhY2tldCktPnA4MDIxMUhlYWRlcik7Ci0KLSAgICBpZiAocEFjdGlvbi0+YnlDYXRlZ29yeSA9PSAwKSB7Ci0gICAgICAgIHN3aXRjaCAocEFjdGlvbi0+YnlBY3Rpb24pIHsKLSAgICAgICAgICAgIGNhc2UgQUNUSU9OX01TUlJFUToKLSAgICAgICAgICAgICAgICByZXR1cm4gKHNfYlJ4TVNSUmVxKHBNZ210LCAoUFdMQU5fRlJBTUVfTVNSUkVRKSBwQWN0aW9uLCB1TGVuZ3RoKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFDVElPTl9NU1JSRVA6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFDVElPTl9UUENSRVE6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChzX2JSeFRQQ1JlcShwTWdtdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQV0xBTl9GUkFNRV9UUENSRVEpIHBBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKFBTUnhNZ210UGFja2V0KXBSeFBhY2tldCktPmJ5UnhSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpICgoUFNSeE1nbXRQYWNrZXQpcFJ4UGFja2V0KS0+dVJTU0kpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQUNUSU9OX1RQQ1JFUDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQUNUSU9OX0NIU1c6Ci0gICAgICAgICAgICAgICAgcENoYW5uZWxTd2l0Y2ggPSAoUFdMQU5fSUVfQ0hfU1cpIChwQWN0aW9uLT5hYnlWYXJzKTsKLSAgICAgICAgICAgICAgICBpZiAoKHBDaGFubmVsU3dpdGNoLT5ieUVsZW1lbnRJRCA9PSBXTEFOX0VJRF9DSF9TV0lUQ0gpICYmCi0gICAgICAgICAgICAgICAgICAgIChwQ2hhbm5lbFN3aXRjaC0+bGVuID09IDMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHZhbGlkIGVsZW1lbnQgaWQKLSAgICAgICAgICAgICAgICAgICAgQ0FSRGJDaGFubmVsU3dpdGNoKCBwTWdtdC0+cEFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYW5uZWxTd2l0Y2gtPmJ5TW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfY2hhbm5lbF9tYXBwaW5nKHBNZ210LT5wQWRhcHRlciwgcENoYW5uZWxTd2l0Y2gtPmJ5Q2hhbm5lbCwgcE1nbXQtPmVDdXJyZW50UEhZTW9kZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoYW5uZWxTd2l0Y2gtPmJ5Q291bnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJVbmtub3duIEFjdGlvbiA9ICVkXG4iLCBwQWN0aW9uLT5ieUFjdGlvbik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIlVua25vd24gQ2F0ZWdvcnkgPSAlZFxuIiwgcEFjdGlvbi0+YnlDYXRlZ29yeSk7Ci0gICAgICAgIHBBY3Rpb24tPmJ5Q2F0ZWdvcnkgfD0gMHg4MDsKLQotICAgICAgIC8vcmV0dXJuIChDQVJEYlNlbmRQYWNrZXQocE1nbXQtPnBBZGFwdGVyLCBwQWN0aW9uLCBQS1RfVFlQRV84MDJfMTFfTU5HLCB1TGVuZ3RoKSk7Ci0gICAgICAgIHJldHVybiAodHJ1ZSk7Ci0gICAgfQotICAgIHJldHVybiAodHJ1ZSk7CisJLypyZXR1cm4gKENBUkRiU2VuZFBhY2tldChwTWdtdC0+cEFkYXB0ZXIsIHBBY3Rpb24sIFBLVF9UWVBFXzgwMl8xMV9NTkcsCit1TGVuZ3RoKSk7Ki8KKwlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIHRydWU7CiB9CiAKIAotYm9vbCBJRUVFMTFoYk1TUlJlcFR4ICgKLSAgICB2b2lkICpwTWdtdEhhbmRsZQotICAgICkKK2Jvb2wgSUVFRTExaGJNU1JSZXBUeCh2b2lkICpwTWdtdEhhbmRsZSkKIHsKLSAgICBQU01nbXRPYmplY3QgICAgICAgICAgICBwTWdtdCA9IChQU01nbXRPYmplY3QpIHBNZ210SGFuZGxlOwotICAgIFBXTEFOX0ZSQU1FX01TUlJFUCAgICAgIHBNU1JSZXAgPSAoUFdMQU5fRlJBTUVfTVNSUkVQKSAocE1nbXQtPmFieUN1cnJlbnRNU1JSZXAgKyBzaXplb2YoU1R4TWdtdFBhY2tldCkpOwotICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgdUxlbmd0aCA9IDA7Ci0gICAgUFNUeE1nbXRQYWNrZXQgICAgICAgICAgcFR4UGFja2V0ID0gTlVMTDsKKwlQU01nbXRPYmplY3QgICAgICAgICAgICBwTWdtdCA9IChQU01nbXRPYmplY3QpIHBNZ210SGFuZGxlOworCVBXTEFOX0ZSQU1FX01TUlJFUCAgICAgIHBNU1JSZXAgPSAoUFdMQU5fRlJBTUVfTVNSUkVQKQorKHBNZ210LT5hYnlDdXJyZW50TVNSUmVwICsgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpKTsKKwlzaXplX3QgICAgICAgICAgICAgICAgICAgIHVMZW5ndGggPSAwOworCVBTVHhNZ210UGFja2V0ICAgICAgICAgIHBUeFBhY2tldCA9IE5VTEw7CiAKLSAgICBwVHhQYWNrZXQgPSAoUFNUeE1nbXRQYWNrZXQpcE1nbXQtPmFieUN1cnJlbnRNU1JSZXA7Ci0gICAgbWVtc2V0KHBUeFBhY2tldCwgMCwgc2l6ZW9mKFNUeE1nbXRQYWNrZXQpICsgV0xBTl9BM0ZSX01BWExFTik7Ci0gICAgcFR4UGFja2V0LT5wODAyMTFIZWFkZXIgPSAoUFVXTEFOXzgwMjExSERSKSgodW5zaWduZWQgY2hhciAqKXBUeFBhY2tldCArIHNpemVvZihTVHhNZ210UGFja2V0KSk7CisJcFR4UGFja2V0ID0gKFBTVHhNZ210UGFja2V0KXBNZ210LT5hYnlDdXJyZW50TVNSUmVwOworCW1lbXNldChwVHhQYWNrZXQsIDAsIHNpemVvZihTVHhNZ210UGFja2V0KSArIFdMQU5fQTNGUl9NQVhMRU4pOworCXBUeFBhY2tldC0+cDgwMjExSGVhZGVyID0gKFBVV0xBTl84MDIxMUhEUikoKHVuc2lnbmVkIGNoYXIgKilwVHhQYWNrZXQgKworc2l6ZW9mKFNUeE1nbXRQYWNrZXQpKTsKIAorCXBNU1JSZXAtPkhlYWRlci53RnJhbWVDdGwgPSAoV0xBTl9TRVRfRkNfRlRZUEUoV0xBTl9GVFlQRV9NR01UKSB8CisJCQkJV0xBTl9TRVRfRkNfRlNUWVBFKFdMQU5fRlNUWVBFX0FDVElPTikKKwkJCQkpOwogCi0gICAgcE1TUlJlcC0+SGVhZGVyLndGcmFtZUN0bCA9ICggICBXTEFOX1NFVF9GQ19GVFlQRShXTEFOX0ZUWVBFX01HTVQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdMQU5fU0VUX0ZDX0ZTVFlQRShXTEFOX0ZTVFlQRV9BQ1RJT04pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisJbWVtY3B5KHBNU1JSZXAtPkhlYWRlci5hYnlBZGRyMSwgKChQV0xBTl9GUkFNRV9NU1JSRVEpCisJCShwTWdtdC0+YWJ5Q3VycmVudE1TUlJlcSkpLT5IZWFkZXIuYWJ5QWRkcjIsIFdMQU5fQUREUl9MRU4pOworCW1lbWNweShwTVNSUmVwLT5IZWFkZXIuYWJ5QWRkcjIsCisJCUNBUkRwR2V0Q3VycmVudEFkZHJlc3MocE1nbXQtPnBBZGFwdGVyKSwgV0xBTl9BRERSX0xFTik7CisJbWVtY3B5KHBNU1JSZXAtPkhlYWRlci5hYnlBZGRyMywgcE1nbXQtPmFieUN1cnJCU1NJRCwgV0xBTl9CU1NJRF9MRU4pOwogCi0gICAgbWVtY3B5KCBwTVNSUmVwLT5IZWFkZXIuYWJ5QWRkcjEsICgoUFdMQU5fRlJBTUVfTVNSUkVRKSAocE1nbXQtPmFieUN1cnJlbnRNU1JSZXEpKS0+SGVhZGVyLmFieUFkZHIyLCBXTEFOX0FERFJfTEVOKTsKLSAgICBtZW1jcHkoIHBNU1JSZXAtPkhlYWRlci5hYnlBZGRyMiwgQ0FSRHBHZXRDdXJyZW50QWRkcmVzcyhwTWdtdC0+cEFkYXB0ZXIpLCBXTEFOX0FERFJfTEVOKTsKLSAgICBtZW1jcHkoIHBNU1JSZXAtPkhlYWRlci5hYnlBZGRyMywgcE1nbXQtPmFieUN1cnJCU1NJRCwgV0xBTl9CU1NJRF9MRU4pOworCXBNU1JSZXAtPmJ5Q2F0ZWdvcnkgPSAwOworCXBNU1JSZXAtPmJ5QWN0aW9uID0gMTsKKwlwTVNSUmVwLT5ieURpYWxvZ1Rva2VuID0gKChQV0xBTl9GUkFNRV9NU1JSRVEpCisJCShwTWdtdC0+YWJ5Q3VycmVudE1TUlJlcSkpLT5ieURpYWxvZ1Rva2VuOwogCi0gICAgcE1TUlJlcC0+YnlDYXRlZ29yeSA9IDA7Ci0gICAgcE1TUlJlcC0+YnlBY3Rpb24gPSAxOwotICAgIHBNU1JSZXAtPmJ5RGlhbG9nVG9rZW4gPSAoKFBXTEFOX0ZSQU1FX01TUlJFUSkgKHBNZ210LT5hYnlDdXJyZW50TVNSUmVxKSktPmJ5RGlhbG9nVG9rZW47CisJdUxlbmd0aCA9IHBNZ210LT51TGVuZ3RoT2ZSZXBFSURzICsgb2Zmc2V0b2YoV0xBTl9GUkFNRV9NU1JSRVAsCisJCQkJCQkgICAgIHNNU1JSZXBFSURzKTsKIAotICAgIHVMZW5ndGggPSBwTWdtdC0+dUxlbmd0aE9mUmVwRUlEcyArIG9mZnNldG9mKFdMQU5fRlJBTUVfTVNSUkVQLCBzTVNSUmVwRUlEcyk7Ci0KLSAgICBwVHhQYWNrZXQtPmNiTVBEVUxlbiA9IHVMZW5ndGg7Ci0gICAgcFR4UGFja2V0LT5jYlBheWxvYWRMZW4gPSB1TGVuZ3RoIC0gV0xBTl9IRFJfQUREUjNfTEVOOwotICAgIGlmIChjc01nbXRfeG1pdChwTWdtdC0+cEFkYXB0ZXIsIHBUeFBhY2tldCkgIT0gQ01EX1NUQVRVU19QRU5ESU5HKQotICAgICAgICByZXR1cm4gKGZhbHNlKTsKLSAgICByZXR1cm4gKHRydWUpOwotLy8gICAgcmV0dXJuIChDQVJEYlNlbmRQYWNrZXQocE1nbXQtPnBBZGFwdGVyLCBwTVNSUmVwLCBQS1RfVFlQRV84MDJfMTFfTU5HLCB1TGVuZ3RoKSk7CisJcFR4UGFja2V0LT5jYk1QRFVMZW4gPSB1TGVuZ3RoOworCXBUeFBhY2tldC0+Y2JQYXlsb2FkTGVuID0gdUxlbmd0aCAtIFdMQU5fSERSX0FERFIzX0xFTjsKKwlpZiAoY3NNZ210X3htaXQocE1nbXQtPnBBZGFwdGVyLCBwVHhQYWNrZXQpICE9IENNRF9TVEFUVVNfUEVORElORykKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiB0cnVlOworLyogICAgcmV0dXJuIChDQVJEYlNlbmRQYWNrZXQocE1nbXQtPnBBZGFwdGVyLCBwTVNSUmVwLCBQS1RfVFlQRV84MDJfMTFfTU5HLAordUxlbmd0aCkpOyAqLwogCiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlX21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlX21haW4uYwppbmRleCA4Y2I5MTE2Li5kOGRkNzg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RldmljZV9tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kZXZpY2VfbWFpbi5jCkBAIC04MTUsMTQgKzgxNSw4IEBACiAgICAgICAgICAgICBwTWdtdC0+ZVNjYW5UeXBlID0gV01BQ19TQ0FOX1BBU1NJVkU7CiAgICAgLy8gZ2V0IFBlcm1hbmVudCBuZXR3b3JrIGFkZHJlc3MKICAgICBTUk9NdlJlYWRFdGhlckFkZHJlc3MocERldmljZS0+UG9ydE9mZnNldCwgcERldmljZS0+YWJ5Q3VycmVudE5ldEFkZHIpOwotICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iTmV0d29yayBhZGRyZXNzID0gJTAyeC0lMDJ4LSUwMng9JTAyeC0lMDJ4LSUwMnhcbiIsCi0gICAgICAgIHBEZXZpY2UtPmFieUN1cnJlbnROZXRBZGRyWzBdLAotICAgICAgICBwRGV2aWNlLT5hYnlDdXJyZW50TmV0QWRkclsxXSwKLSAgICAgICAgcERldmljZS0+YWJ5Q3VycmVudE5ldEFkZHJbMl0sCi0gICAgICAgIHBEZXZpY2UtPmFieUN1cnJlbnROZXRBZGRyWzNdLAotICAgICAgICBwRGV2aWNlLT5hYnlDdXJyZW50TmV0QWRkcls0XSwKLSAgICAgICAgcERldmljZS0+YWJ5Q3VycmVudE5ldEFkZHJbNV0pOwotCisJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJOZXR3b3JrIGFkZHJlc3MgPSAlcE1cbiIsCisJCXBEZXZpY2UtPmFieUN1cnJlbnROZXRBZGRyKTsKIAogICAgIC8vIHJlc2V0IFR4IHBvaW50ZXIKICAgICBDQVJEdlNhZmVSZXNldFJ4KHBEZXZpY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kcGMuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZHBjLmMKaW5kZXggY2YwZGVhYy4uYzBmYWI0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kcGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RwYy5jCkBAIC0xMTA3LDMwICsxMTA3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RhdHVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJkcGM6IHNlbmQgdk1nckRlQXV0aGVuQmVnaW5TdGEgM1xuIik7Ci0gICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkJTU0lEOiUwMngtJTAyeC0lMDJ4PSUwMngtJTAyeC0lMDJ4IFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDgwMl8xMUhlYWRlci0+YWJ5QWRkcjNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA4MDJfMTFIZWFkZXItPmFieUFkZHIzWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwODAyXzExSGVhZGVyLT5hYnlBZGRyM1syXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDgwMl8xMUhlYWRlci0+YWJ5QWRkcjNbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA4MDJfMTFIZWFkZXItPmFieUFkZHIzWzRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwODAyXzExSGVhZGVyLT5hYnlBZGRyM1s1XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkFERFIyOiUwMngtJTAyeC0lMDJ4PSUwMngtJTAyeC0lMDJ4IFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDgwMl8xMUhlYWRlci0+YWJ5QWRkcjJbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA4MDJfMTFIZWFkZXItPmFieUFkZHIyWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwODAyXzExSGVhZGVyLT5hYnlBZGRyMlsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDgwMl8xMUhlYWRlci0+YWJ5QWRkcjJbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA4MDJfMTFIZWFkZXItPmFieUFkZHIyWzRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwODAyXzExSGVhZGVyLT5hYnlBZGRyMls1XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkFERFIxOiUwMngtJTAyeC0lMDJ4PSUwMngtJTAyeC0lMDJ4IFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDgwMl8xMUhlYWRlci0+YWJ5QWRkcjFbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA4MDJfMTFIZWFkZXItPmFieUFkZHIxWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwODAyXzExSGVhZGVyLT5hYnlBZGRyMVsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDgwMl8xMUhlYWRlci0+YWJ5QWRkcjFbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA4MDJfMTFIZWFkZXItPmFieUFkZHIxWzRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwODAyXzExSGVhZGVyLT5hYnlBZGRyMVs1XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJCU1NJRDolcE1cbiIsCisJCQkJcDgwMl8xMUhlYWRlci0+YWJ5QWRkcjMpOworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiQUREUjI6JXBNXG4iLAorCQkJCXA4MDJfMTFIZWFkZXItPmFieUFkZHIyKTsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkFERFIxOiVwTVxuIiwKKwkJCQlwODAyXzExSGVhZGVyLT5hYnlBZGRyMSk7CiAgICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gImRwYzogd0ZyYW1lQ3RsPSAleFxuIiwgcDgwMl8xMUhlYWRlci0+d0ZyYW1lQ3RsICk7CiAgICAgICAgICAgICAgICAgICAgIFZOU3ZJblBvcnRCKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX1JDUiwgJihwRGV2aWNlLT5ieVJ4TW9kZSkpOwogICAgICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJkcGM6cERldmljZS0+YnlSeE1vZGUgPSAleFxuIiwgcERldmljZS0+YnlSeE1vZGUgKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvaW9jdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvaW9jdGwuYwppbmRleCA4Y2Y4OGMzLi40MzJhMjA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2lvY3RsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9pb2N0bC5jCkBAIC0zOCw3MTUgKzM4LDYxNyBAQAogI2luY2x1ZGUgIndwYWN0bC5oIgogI2luY2x1ZGUgInJmLmgiCiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBTdGF0aWMgRGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBTdGF0aWMgQ2xhc3NlcyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBTdGF0aWMgVmFyaWFibGVzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vL3N0YXRpYyBpbnQgICAgICAgICAgbXNnbGV2ZWwgICAgICAgICAgICAgICAgPU1TR19MRVZFTF9ERUJVRzsKLXN0YXRpYyBpbnQgICAgICAgICAgbXNnbGV2ZWwgICAgICAgICAgICAgICAgPU1TR19MRVZFTF9JTkZPOworc3RhdGljIGludCBtc2dsZXZlbCA9IE1TR19MRVZFTF9JTkZPOwogCiAjaWZkZWYgV1BBX1NNX1RyYW5zdGF0dXMKLSAgICBTV1BBUmVzdWx0IHdwYV9SZXN1bHQ7CisJU1dQQVJlc3VsdCB3cGFfUmVzdWx0OwogI2VuZGlmCiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBTdGF0aWMgRnVuY3Rpb25zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgVmFyaWFibGVzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWludCBwcml2YXRlX2lvY3RsKFBTRGV2aWNlIHBEZXZpY2UsIHN0cnVjdCBpZnJlcSAqcnEpIHsKLQotCVBTQ21kUmVxdWVzdCAgICAgICAgcFJlcSA9IChQU0NtZFJlcXVlc3QpcnE7Ci0gICAgUFNNZ210T2JqZWN0ICAgICAgICBwTWdtdCA9IHBEZXZpY2UtPnBNZ210OwotCWludCAJCSAgICAgICAgcmVzdWx0ID0gMDsKLSAgICBQV0xBTl9JRV9TU0lEICAgICAgIHBJdGVtU1NJRDsKLSAgICBTQ21kQlNTSm9pbiAgICAgICAgIHNKb2luQ21kOwotICAgIFNDbWRab25lVHlwZVNldCAgc1pvbmVUeXBlQ21kOwotICAgIFNDbWRTY2FuICAgICAgICAgICAgc1NjYW5DbWQ7Ci0gICAgU0NtZFN0YXJ0QVAgICAgICAgICBzU3RhcnRBUENtZDsKLSAgICBTQ21kU2V0V0VQICAgICAgICAgIHNXRVBDbWQ7Ci0gICAgU0NtZFZhbHVlICAgICAgICAgICBzVmFsdWU7Ci0gICAgU0JTU0lETGlzdCAgICAgICAgICBzTGlzdDsKLSAgICBTTm9kZUxpc3QgICAgICAgICAgIHNOb2RlTGlzdDsKLSAgICBQU0JTU0lETGlzdCAgICAgICAgIHBMaXN0OwotICAgIFBTTm9kZUxpc3QgICAgICAgICAgcE5vZGVMaXN0OwotICAgIHVuc2lnbmVkIGludCBjYkxpc3RDb3VudDsKLSAgICBQS25vd25CU1MgICAgICAgICAgIHBCU1M7Ci0gICAgUEtub3duTm9kZURCICAgICAgICBwTm9kZTsKLSAgICB1bnNpZ25lZCBpbnQgaWksIGpqOwotICAgIFNDbWRMaW5rU3RhdHVzICAgICAgc0xpbmtTdGF0dXM7Ci0gICAgdW5zaWduZWQgY2hhciBhYnlTdXBwUmF0ZXNbXSA9IHtXTEFOX0VJRF9TVVBQX1JBVEVTLCA0LCAweDAyLCAweDA0LCAweDBCLCAweDE2fTsKLSAgICB1bnNpZ25lZCBjaGFyIGFieU51bGxBZGRyW10gPSB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07Ci0gICAgdW5zaWduZWQgbG9uZyBkd0tleUluZGV4PSAwOwotICAgIHVuc2lnbmVkIGNoYXIgYWJ5U2NhblNTSURbV0xBTl9JRUhEUl9MRU4gKyBXTEFOX1NTSURfTUFYTEVOICsgMV07Ci0gICAgbG9uZyAgICAgICAgICAgICAgICBsZEJtOwotCi0gICAgcFJlcS0+d1Jlc3VsdCA9IDA7Ci0KLSAgICBzd2l0Y2ggKHBSZXEtPndDbWRDb2RlKSB7Ci0KLSAgICBjYXNlIFdMQU5fQ01EX0JTU19TQ0FOOgotCi0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIldMQU5fQ01EX0JTU19TQ0FOLi5iZWdpbiBcbiIpOwotICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJnNTY2FuQ21kLCBwUmVxLT5kYXRhLCBzaXplb2YoU0NtZFNjYW4pKSkgewotCQkJcmVzdWx0ID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLSAgICAgICAgcEl0ZW1TU0lEID0gKFBXTEFOX0lFX1NTSUQpc1NjYW5DbWQuc3NpZDsKLSAgICAgICAgaWYgKHBJdGVtU1NJRC0+bGVuICE9IDApIHsKLSAgICAgICAgICAgIG1lbXNldChhYnlTY2FuU1NJRCwgMCwgV0xBTl9JRUhEUl9MRU4gKyBXTEFOX1NTSURfTUFYTEVOICsgMSk7Ci0gICAgICAgICAgICBtZW1jcHkoYWJ5U2NhblNTSUQsIHBJdGVtU1NJRCwgcEl0ZW1TU0lELT5sZW4gKyBXTEFOX0lFSERSX0xFTik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocERldmljZS0+Yk1BQ1N1c3BlbmQgPT0gdHJ1ZSkgewotICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmJSYWRpb09mZiA9PSB0cnVlKQotICAgICAgICAgICAgICAgIENBUkRiUmFkaW9Qb3dlck9uKHBEZXZpY2UpOwotICAgICAgICAgICAgdk1nclRpbWVySW5pdChwRGV2aWNlKTsKLSAgICAgICAgICAgIE1BQ3ZJbnRFbmFibGUocERldmljZS0+UG9ydE9mZnNldCwgSU1SX01BU0tfVkFMVUUpOwotICAgICAgICAgICAgYWRkX3RpbWVyKCZwTWdtdC0+c1RpbWVyU2Vjb25kQ2FsbGJhY2spOwotICAgICAgICAgICAgcERldmljZS0+Yk1BQ1N1c3BlbmQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBzcGluX2xvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLSAgICAgICAgaWYgKG1lbWNtcChwTWdtdC0+YWJ5Q3VyckJTU0lELCAmYWJ5TnVsbEFkZHJbMF0sIDYpID09IDApCi0gICAgICAgICAgICBCU1N2Q2xlYXJCU1NMaXN0KCh2b2lkICopcERldmljZSwgZmFsc2UpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBCU1N2Q2xlYXJCU1NMaXN0KCh2b2lkICopcERldmljZSwgcERldmljZS0+YkxpbmtQYXNzKTsKLQotICAgICAgICBpZiAocEl0ZW1TU0lELT5sZW4gIT0gMCkKLSAgICAgICAgICAgIGJTY2hlZHVsZUNvbW1hbmQoKHZvaWQgKikgcERldmljZSwgV0xBTl9DTURfQlNTSURfU0NBTiwgYWJ5U2NhblNTSUQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBiU2NoZWR1bGVDb21tYW5kKCh2b2lkICopIHBEZXZpY2UsIFdMQU5fQ01EX0JTU0lEX1NDQU4sIE5VTEwpOwotICAgICAgICBzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgV0xBTl9DTURfWk9ORVRZUEVfU0VUOgotCS8vbWlrZSBhZGQgOmNhbm4ndCBzdXBwb3J0LgotICAgICAgICAgICByZXN1bHQ9LUVPUE5PVFNVUFA7Ci0JICBicmVhazsKLQotICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJnNab25lVHlwZUNtZCwgcFJlcS0+ZGF0YSwgc2l6ZW9mKFNDbWRab25lVHlwZVNldCkpKSB7Ci0JCQlyZXN1bHQgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotICAgICAgICAgIGlmKHNab25lVHlwZUNtZC5iV3JpdGU9PXRydWUpIHsKLQkgIC8vLy8vL3dyaXRlIHpvbmV0eXBlCi0gICAgICAgICAgICAgICAgaWYoc1pvbmVUeXBlQ21kLlpvbmVUeXBlID09IFpvbmVUeXBlX1VTQSkgewotICAgICAgICAgICAgICAgICAgLy9zZXQgdG8gVVNBCi0gICAgICAgICAgICAgICAgICAgcHJpbnRrKCJzZXRfWm9uZVR5cGU6VVNBXG4iKTsKLQkJfQotICAgICAgICAgICAgICAgIGVsc2UgaWYoc1pvbmVUeXBlQ21kLlpvbmVUeXBlID09IFpvbmVUeXBlX0phcGFuKSB7Ci0gICAgICAgICAgICAgICAgICAvL3NldCB0byBKYXBhbgotICAgICAgICAgICAgICAgICAgcHJpbnRrKCJzZXRfWm9uZVR5cGU6SmFwYW5cbiIpOwotCQl9Ci0JICAgICAgIGVsc2UgaWYoc1pvbmVUeXBlQ21kLlpvbmVUeXBlID09IFpvbmVUeXBlX0V1cm9wZSkgewotICAgICAgICAgICAgICAgICAgLy9zZXQgdG8gRXVyb3BlCi0gICAgICAgICAgICAgICAgICBwcmludGsoInNldF9ab25lVHlwZTpFdXJvcGVcbiIpOwotCQl9Ci0gICAgICAgICAgICB9Ci0JZWxzZSB7Ci0gICAgICAgICAgLy8vLy8vL3JlYWQgem9uZXR5cGUKLQkgIHVuc2lnbmVkIGNoYXIgem9uZXR5cGU9MDsKLQotCi0gICAgICAgICAgIGlmKHpvbmV0eXBlID09IDB4MDApICB7IC8vVVNBCi0gICAgICAgICAgICAgc1pvbmVUeXBlQ21kLlpvbmVUeXBlID0gWm9uZVR5cGVfVVNBOwotICAgICAgICAgICB9Ci0JIGVsc2UgaWYoem9uZXR5cGUgPT0gMHgwMSkgeyAvL0phcGFuCi0gICAgICAgICAgICAgc1pvbmVUeXBlQ21kLlpvbmVUeXBlID0gWm9uZVR5cGVfSmFwYW47Ci0JICB9Ci0JIGVsc2UgaWYoem9uZXR5cGUgPT0gMHgwMikgeyAvL0V1cm9wZQotICAgICAgICAgICAgIHNab25lVHlwZUNtZC5ab25lVHlwZSA9IFpvbmVUeXBlX0V1cm9wZTsKLQkgfQotCSBlbHNlIHsgLy9Vbmtub3duIFpvbmVUeXBlCi0JICAgICAgICBwcmludGsoIkVycm9yOlpvbmVUeXBlWyV4XSBVbmtub3duID8/P1xuIix6b25ldHlwZSk7Ci0JICAgICAgICAgcmVzdWx0ID0gLUVGQVVMVDsKLQkJYnJlYWs7Ci0JIH0KLQkgICBpZiAoY29weV90b191c2VyKHBSZXEtPmRhdGEsICZzWm9uZVR5cGVDbWQsIHNpemVvZihTQ21kWm9uZVR5cGVTZXQpKSkgewotCQkJcmVzdWx0ID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JICAgICBicmVhazsKLQotICAgIGNhc2UgV0xBTl9DTURfQlNTX0pPSU46Ci0KLSAgICAgICAgaWYgKHBEZXZpY2UtPmJNQUNTdXNwZW5kID09IHRydWUpIHsKLSAgICAgICAgICAgIGlmIChwRGV2aWNlLT5iUmFkaW9PZmYgPT0gdHJ1ZSkKLSAgICAgICAgICAgICAgICBDQVJEYlJhZGlvUG93ZXJPbihwRGV2aWNlKTsKLSAgICAgICAgICAgIHZNZ3JUaW1lckluaXQocERldmljZSk7Ci0gICAgICAgICAgICBNQUN2SW50RW5hYmxlKHBEZXZpY2UtPlBvcnRPZmZzZXQsIElNUl9NQVNLX1ZBTFVFKTsKLSAgICAgICAgICAgIGFkZF90aW1lcigmcE1nbXQtPnNUaW1lclNlY29uZENhbGxiYWNrKTsKLSAgICAgICAgICAgIHBEZXZpY2UtPmJNQUNTdXNwZW5kID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJnNKb2luQ21kLCBwUmVxLT5kYXRhLCBzaXplb2YoU0NtZEJTU0pvaW4pKSkgewotCQkJcmVzdWx0ID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLSAgICAgICAgcEl0ZW1TU0lEID0gKFBXTEFOX0lFX1NTSUQpc0pvaW5DbWQuc3NpZDsKLSAgICAgICAgbWVtc2V0KHBNZ210LT5hYnlEZXNpcmVTU0lELCAwLCBXTEFOX0lFSERSX0xFTiArIFdMQU5fU1NJRF9NQVhMRU4gKyAxKTsKLQkJbWVtY3B5KHBNZ210LT5hYnlEZXNpcmVTU0lELCBwSXRlbVNTSUQsIHBJdGVtU1NJRC0+bGVuICsgV0xBTl9JRUhEUl9MRU4pOwotCSAgICBpZiAoc0pvaW5DbWQud0JTU1R5cGUgPT0gQURIT0MpIHsKLQkgICAgICAgIHBNZ210LT5lQ29uZmlnTW9kZSA9IFdNQUNfQ09ORklHX0lCU1NfU1RBOwotCSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiaW9jdCBzZXQgdG8gYWRob2MgbW9kZVxuIik7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JICAgICAgICBwTWdtdC0+ZUNvbmZpZ01vZGUgPSBXTUFDX0NPTkZJR19FU1NfU1RBOwotCSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiaW9jdCBzZXQgdG8gU1RBIG1vZGVcbiIpOwotCSAgICB9Ci0JICAgIGlmIChzSm9pbkNtZC5iUFNFbmFibGUgPT0gdHJ1ZSkgewotICAgICAgICAgICAgcERldmljZS0+ZVBTTW9kZSA9IFdNQUNfUE9XRVJfRkFTVDsKLS8vICAgICAgICAgICAgcERldmljZS0+ZVBTTW9kZSA9IFdNQUNfUE9XRVJfTUFYOwotICAgICAgICAgICAgcE1nbXQtPndMaXN0ZW5JbnRlcnZhbCA9IDI7Ci0gICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJQb3dlciBTYXZpbmcgT25cbiIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcERldmljZS0+ZVBTTW9kZSA9IFdNQUNfUE9XRVJfQ0FNOwotICAgICAgICAgICAgcE1nbXQtPndMaXN0ZW5JbnRlcnZhbCA9IDE7Ci0gICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJQb3dlciBTYXZpbmcgT2ZmIFxuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc0pvaW5DbWQuYlNoYXJlS2V5QXV0aCA9PSB0cnVlKXsKLSAgICAgICAgICAgIHBNZ210LT5iU2hhcmVLZXlBbGdvcml0aG0gPSB0cnVlOwotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiU2hhcmUgS2V5IFxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwTWdtdC0+YlNoYXJlS2V5QWxnb3JpdGhtID0gZmFsc2U7Ci0gICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJPcGVuIFN5c3RlbSBcbiIpOwotICAgICAgICB9Ci0JICAgIHBEZXZpY2UtPnVDaGFubmVsID0gc0pvaW5DbWQudUNoYW5uZWw7Ci0gICAgICAgIG5ldGlmX3N0b3BfcXVldWUocERldmljZS0+ZGV2KTsKLSAgICAgICAgc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0gICAgICAgIHBNZ210LT5lQ3VyclN0YXRlID0gV01BQ19TVEFURV9JRExFOwotICAgICAgICBiU2NoZWR1bGVDb21tYW5kKCh2b2lkICopIHBEZXZpY2UsIFdMQU5fQ01EX0JTU0lEX1NDQU4sIHBNZ210LT5hYnlEZXNpcmVTU0lEKTsKLSAgICAgICAgYlNjaGVkdWxlQ29tbWFuZCgodm9pZCAqKSBwRGV2aWNlLCBXTEFOX0NNRF9TU0lELCBOVUxMKTsKLSAgICAgICAgc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFdMQU5fQ01EX1NFVF9XRVA6Ci0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIldMQU5fQ01EX1NFVF9XRVAgS2V5LiBcbiIpOwotICAgICAgICBtZW1zZXQoJnNXRVBDbWQsIDAgLHNpemVvZihTQ21kU2V0V0VQKSk7Ci0gICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmc1dFUENtZCwgcFJlcS0+ZGF0YSwgc2l6ZW9mKFNDbWRTZXRXRVApKSkgewotCQkJcmVzdWx0ID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0JICAgIGlmIChzV0VQQ21kLmJFbmFibGVXZXAgIT0gdHJ1ZSkgewotICAgICAgICAgICAgcERldmljZS0+YkVuY3J5cHRpb25FbmFibGUgPSBmYWxzZTsKLSAgICAgICAgICAgIHBEZXZpY2UtPmVFbmNyeXB0aW9uU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKLSAgICAgICAgICAgIE1BQ3ZEaXNhYmxlRGVmYXVsdEtleShwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIldFUCBmdW5jdGlvbiBkaXNhYmxlLiBcbiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBXTEFOX1dFUF9OS0VZUzsgaWkgKyspIHsKLSAgICAgICAgICAgIGlmIChzV0VQQ21kLmJXZXBLZXlBdmFpbGFibGVbaWldKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlpID09IHNXRVBDbWQuYnlLZXlJbmRleCkKLQkvLzIwMDYtMTEyMy0wMiw8TW9kaWZ5PiBieSBFaW5zbkxpdQotCS8vRXZhbHVhdGUgdGhlICJkd0tleUluZGV4IiBlcnJvcgotCS8vICBkd0tleUluZGV4IHw9ICgxIDw8IDMxKTsKLQkgIGR3S2V5SW5kZXggPWlpfCgxIDw8IDMxKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGR3S2V5SW5kZXggPSBpaTsKLQotICAgICAgICAgICAgICAgIEtleWJTZXREZWZhdWx0S2V5KCYocERldmljZS0+c0tleSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0tleUluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1dFUENtZC5hdVdlcEtleUxlbmd0aFtpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKikmc1dFUENtZC5hYnlXZXBLZXlbaWldWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX0NUTF9XRVAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5Qb3J0T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERldmljZS0+YnlMb2NhbElEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwRGV2aWNlLT5ieUtleUluZGV4ID0gc1dFUENtZC5ieUtleUluZGV4OwotICAgICAgICBwRGV2aWNlLT5iVHJhbnNtaXRLZXkgPSB0cnVlOwotICAgICAgICBwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSA9IHRydWU7Ci0gICAgICAgIHBEZXZpY2UtPmVFbmNyeXB0aW9uU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKLQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgV0xBTl9DTURfR0VUX0xJTks6Ci0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIldMQU5fQ01EX0dFVF9MSU5LIHN0YXR1cy4gXG4iKTsKLQotICAgICAgICBtZW1zZXQoc0xpbmtTdGF0dXMuYWJ5U1NJRCwgMCAsIFdMQU5fU1NJRF9NQVhMRU4gKyAxKTsKLQotICAgICAgICBpZiAocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfSUJTU19TVEEpCi0gICAgICAgICAgICBzTGlua1N0YXR1cy53QlNTVHlwZSA9IEFESE9DOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzTGlua1N0YXR1cy53QlNTVHlwZSA9IElORlJBOwotCi0gICAgICAgIGlmIChwTWdtdC0+ZUN1cnJTdGF0ZSA9PSBXTUFDX1NUQVRFX0pPSU5URUQpCi0gICAgICAgICAgICBzTGlua1N0YXR1cy5ieVN0YXRlID0gQURIT0NfSk9JTlRFRDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc0xpbmtTdGF0dXMuYnlTdGF0ZSA9IEFESE9DX1NUQVJURUQ7Ci0KLSAgICAgICAgc0xpbmtTdGF0dXMudUNoYW5uZWwgPSBwTWdtdC0+dUN1cnJDaGFubmVsOwotICAgICAgICBpZiAocERldmljZS0+YkxpbmtQYXNzID09IHRydWUpIHsKLSAgICAgICAgICAgIHNMaW5rU3RhdHVzLmJMaW5rID0gdHJ1ZTsKLSAJCSAgICBwSXRlbVNTSUQgPSAoUFdMQU5fSUVfU1NJRClwTWdtdC0+YWJ5Q3VyclNTSUQ7Ci0JCSAgICBtZW1jcHkoc0xpbmtTdGF0dXMuYWJ5U1NJRCwgcEl0ZW1TU0lELT5hYnlTU0lELCBwSXRlbVNTSUQtPmxlbik7Ci0JCSAgICBtZW1jcHkoc0xpbmtTdGF0dXMuYWJ5QlNTSUQsIHBNZ210LT5hYnlDdXJyQlNTSUQsIFdMQU5fQlNTSURfTEVOKTsKLQkJICAgIHNMaW5rU3RhdHVzLnVMaW5rUmF0ZSA9IHBNZ210LT5zTm9kZURCVGFibGVbMF0ud1R4RGF0YVJhdGU7Ci0gICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiBMaW5rIFN1Y2Nlc3MgISBcbiIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgc0xpbmtTdGF0dXMuYkxpbmsgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29weV90b191c2VyKHBSZXEtPmRhdGEsICZzTGlua1N0YXR1cywgc2l6ZW9mKFNDbWRMaW5rU3RhdHVzKSkpIHsKLQkJCXJlc3VsdCA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBXTEFOX0NNRF9HRVRfTElTVExFTjoKLQkJY2JMaXN0Q291bnQgPSAwOwotCQlwQlNTID0gJihwTWdtdC0+c0JTU0xpc3RbMF0pOwotICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBNQVhfQlNTX05VTTsgaWkrKykgewotICAgICAgICAgICAgcEJTUyA9ICYocE1nbXQtPnNCU1NMaXN0W2lpXSk7Ci0gICAgICAgICAgICBpZiAoIXBCU1MtPmJBY3RpdmUpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBjYkxpc3RDb3VudCsrOwotICAgICAgICB9Ci0gICAgICAgIHNMaXN0LnVJdGVtID0gY2JMaXN0Q291bnQ7Ci0gICAgICAgIGlmIChjb3B5X3RvX3VzZXIocFJlcS0+ZGF0YSwgJnNMaXN0LCBzaXplb2YoU0JTU0lETGlzdCkpKSB7Ci0JCQlyZXN1bHQgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLSAgICAgICAgcFJlcS0+d1Jlc3VsdCA9IDA7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBXTEFOX0NNRF9HRVRfTElTVDoKLSAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZzTGlzdCwgcFJlcS0+ZGF0YSwgc2l6ZW9mKFNCU1NJRExpc3QpKSkgewotCQkJcmVzdWx0ID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0gICAgICAgIHBMaXN0ID0gKFBTQlNTSURMaXN0KWttYWxsb2Moc2l6ZW9mKFNCU1NJRExpc3QpICsgKHNMaXN0LnVJdGVtICogc2l6ZW9mKFNCU1NJREl0ZW0pKSwgKGludClHRlBfQVRPTUlDKTsKLSAgICAgICAgaWYgKHBMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IC1FTk9NRU07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCQlwTGlzdC0+dUl0ZW0gPSBzTGlzdC51SXRlbTsKLQkJcEJTUyA9ICYocE1nbXQtPnNCU1NMaXN0WzBdKTsKLSAgICAgICAgZm9yIChpaSA9IDAsIGpqID0gMDsgamogPCBNQVhfQlNTX05VTSA7IGpqKyspIHsKLSAgICAgICAgICAgIHBCU1MgPSAmKHBNZ210LT5zQlNTTGlzdFtqal0pOwotICAgICAgICAgICAgaWYgKHBCU1MtPmJBY3RpdmUpIHsKLSAgICAJCSAgICBwTGlzdC0+c0JTU0lETGlzdFtpaV0udUNoYW5uZWwgPSBwQlNTLT51Q2hhbm5lbDsKLSAgICAJCSAgICBwTGlzdC0+c0JTU0lETGlzdFtpaV0ud0JlYWNvbkludGVydmFsID0gcEJTUy0+d0JlYWNvbkludGVydmFsOwotICAgIAkJICAgIHBMaXN0LT5zQlNTSURMaXN0W2lpXS53Q2FwSW5mbyA9IHBCU1MtPndDYXBJbmZvOwotLy8gICAgCQkgICAgcExpc3QtPnNCU1NJRExpc3RbaWldLnVSU1NJID0gcEJTUy0+dVJTU0k7Ci0gICAgCQkgICAgUkZ2UlNTSVRvZEJtKHBEZXZpY2UsICh1bnNpZ25lZCBjaGFyKShwQlNTLT51UlNTSSksICZsZEJtKTsKLSAgICAJCSAgICBwTGlzdC0+c0JTU0lETGlzdFtpaV0udVJTU0kgPSAodW5zaWduZWQgaW50KWxkQm07Ci0gICAgCQkgICAgbWVtY3B5KHBMaXN0LT5zQlNTSURMaXN0W2lpXS5hYnlCU1NJRCwgcEJTUy0+YWJ5QlNTSUQsIFdMQU5fQlNTSURfTEVOKTsKLSAgICAJCSAgICBwSXRlbVNTSUQgPSAoUFdMQU5fSUVfU1NJRClwQlNTLT5hYnlTU0lEOwotICAgIAkJICAgIG1lbXNldChwTGlzdC0+c0JTU0lETGlzdFtpaV0uYWJ5U1NJRCwgMCwgV0xBTl9TU0lEX01BWExFTiArIDEpOwotICAgIAkJICAgIG1lbWNweShwTGlzdC0+c0JTU0lETGlzdFtpaV0uYWJ5U1NJRCwgcEl0ZW1TU0lELT5hYnlTU0lELCBwSXRlbVNTSUQtPmxlbik7Ci0gICAgICAgICAgICAgICAgaWYgKFdMQU5fR0VUX0NBUF9JTkZPX0VTUyhwQlNTLT53Q2FwSW5mbykpIHsKLSAgICAJCSAgICAgICAgcExpc3QtPnNCU1NJRExpc3RbaWldLmJ5TmV0VHlwZSA9IElORlJBOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAJCSAgICAgICAgcExpc3QtPnNCU1NJRExpc3RbaWldLmJ5TmV0VHlwZSA9IEFESE9DOwotICAgIAkJICAgIH0KLSAgICAJCSAgICBpZiAoV0xBTl9HRVRfQ0FQX0lORk9fUFJJVkFDWShwQlNTLT53Q2FwSW5mbykpIHsKLSAgICAJCSAgICAgICAgcExpc3QtPnNCU1NJRExpc3RbaWldLmJXRVBPbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgIAkJICAgICAgICBwTGlzdC0+c0JTU0lETGlzdFtpaV0uYldFUE9uID0gZmFsc2U7Ci0gICAgCQkgICAgfQotICAgIAkJICAgIGlpICsrOwotICAgIAkJICAgIGlmIChpaSA+PSBwTGlzdC0+dUl0ZW0pCi0gICAgCQkgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihwUmVxLT5kYXRhLCBwTGlzdCwgc2l6ZW9mKFNCU1NJRExpc3QpICsgKHNMaXN0LnVJdGVtICogc2l6ZW9mKFNCU1NJREl0ZW0pKSkpIHsKLQkJCXJlc3VsdCA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotICAgICAgICBrZnJlZShwTGlzdCk7Ci0gICAgICAgIHBSZXEtPndSZXN1bHQgPSAwOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgV0xBTl9DTURfR0VUX01JQjoKLSAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihwUmVxLT5kYXRhLCAmKHBEZXZpY2UtPnM4MDJfMTFDb3VudGVyKSwgc2l6ZW9mKFNEb3QxMU1JQkNvdW50KSkpIHsKLQkJCXJlc3VsdCA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgV0xBTl9DTURfR0VUX1NUQVQ6Ci0gICAgICAgIGlmIChjb3B5X3RvX3VzZXIocFJlcS0+ZGF0YSwgJihwRGV2aWNlLT5zY1N0YXRpc3RpYyksIHNpemVvZihTU3RhdENvdW50ZXIpKSkgewotCQkJcmVzdWx0ID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgV0xBTl9DTURfU1RPUF9NQUM6Ci0KLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfU1RPUF9NQUNcbiIpOwotICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKHBEZXZpY2UtPmRldik7Ci0KLSAgICAgICAgc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0gICAgICAgIGlmIChwRGV2aWNlLT5iUmFkaW9PZmYgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIENBUkRiUmFkaW9Qb3dlck9mZihwRGV2aWNlKTsKLSAgICAgICAgfQotICAgICAgICBwRGV2aWNlLT5iTGlua1Bhc3MgPSBmYWxzZTsKLSAgICAgICAgbWVtc2V0KHBNZ210LT5hYnlDdXJyQlNTSUQsIDAsIDYpOwotICAgICAgICBwTWdtdC0+ZUN1cnJTdGF0ZSA9IFdNQUNfU1RBVEVfSURMRTsKLSAgICAgICAgZGVsX3RpbWVyKCZwRGV2aWNlLT5zVGltZXJDb21tYW5kKTsKLSAgICAgICAgZGVsX3RpbWVyKCZwTWdtdC0+c1RpbWVyU2Vjb25kQ2FsbGJhY2spOwotICAgICAgICBwRGV2aWNlLT5iQ21kUnVubmluZyA9IGZhbHNlOwotICAgICAgICBwRGV2aWNlLT5iTUFDU3VzcGVuZCA9IHRydWU7Ci0gICAgICAgIE1BQ3ZJbnREaXNhYmxlKHBEZXZpY2UtPlBvcnRPZmZzZXQpOwotICAgICAgICBzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBXTEFOX0NNRF9TVEFSVF9NQUM6Ci0KLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfU1RBUlRfTUFDXG4iKTsKLQotICAgICAgICBpZiAocERldmljZS0+Yk1BQ1N1c3BlbmQgPT0gdHJ1ZSkgewotICAgICAgICAgICAgaWYgKHBEZXZpY2UtPmJSYWRpb09mZiA9PSB0cnVlKQotICAgICAgICAgICAgICAgIENBUkRiUmFkaW9Qb3dlck9uKHBEZXZpY2UpOwotICAgICAgICAgICAgdk1nclRpbWVySW5pdChwRGV2aWNlKTsKLSAgICAgICAgICAgIE1BQ3ZJbnRFbmFibGUocERldmljZS0+UG9ydE9mZnNldCwgSU1SX01BU0tfVkFMVUUpOwotICAgICAgICAgICAgYWRkX3RpbWVyKCZwTWdtdC0+c1RpbWVyU2Vjb25kQ2FsbGJhY2spOwotICAgICAgICAgICAgcERldmljZS0+Yk1BQ1N1c3BlbmQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgV0xBTl9DTURfU0VUX0hPU1RBUEQ6Ci0KLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfU0VUX0hPU1RBUERcbiIpOwotCi0gICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmc1ZhbHVlLCBwUmVxLT5kYXRhLCBzaXplb2YoU0NtZFZhbHVlKSkpIHsKLQkJCXJlc3VsdCA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoc1ZhbHVlLmR3VmFsdWUgPT0gMSkgewotICAgICAgICAgICAgaWYgKHZ0NjY1NV9ob3N0YXBfc2V0X2hvc3RhcGQocERldmljZSwgMSwgMSkgPT0gMCl7Ci0gICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiRW5hYmxlIEhPU1RBUFxuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLQkJCSAgICByZXN1bHQgPSAtRUZBVUxUOwotCQkJICAgIGJyZWFrOwotCQkJfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdnQ2NjU1X2hvc3RhcF9zZXRfaG9zdGFwZChwRGV2aWNlLCAwLCAxKTsKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkRpc2FibGUgSE9TVEFQXG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBXTEFOX0NNRF9TRVRfSE9TVEFQRF9TVEE6Ci0KLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfU0VUX0hPU1RBUERfU1RBXG4iKTsKLQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFdMQU5fQ01EX1NFVF84MDJfMVg6Ci0KLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfU0VUXzgwMl8xWFxuIik7Ci0gICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmc1ZhbHVlLCBwUmVxLT5kYXRhLCBzaXplb2YoU0NtZFZhbHVlKSkpIHsKLQkJCXJlc3VsdCA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChzVmFsdWUuZHdWYWx1ZSA9PSAxKSB7Ci0gICAgICAgICAgICBwRGV2aWNlLT5iRW5hYmxlODAyMXggPSB0cnVlOwotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiRW5hYmxlIDgwMi4xeFxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwRGV2aWNlLT5iRW5hYmxlODAyMXggPSBmYWxzZTsKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkRpc2FibGUgODAyLjF4XG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIFdMQU5fQ01EX1NFVF9IT1NUX1dFUDoKLQotICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJXTEFOX0NNRF9TRVRfSE9TVF9XRVBcbiIpOwotICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJnNWYWx1ZSwgcFJlcS0+ZGF0YSwgc2l6ZW9mKFNDbWRWYWx1ZSkpKSB7Ci0JCQlyZXN1bHQgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoc1ZhbHVlLmR3VmFsdWUgPT0gMSkgewotICAgICAgICAgICAgcERldmljZS0+YkVuYWJsZUhvc3RXRVAgPSB0cnVlOwotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiRW5hYmxlIEhvc3RXRVBcbiIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcERldmljZS0+YkVuYWJsZUhvc3RXRVAgPSBmYWxzZTsKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkRpc2FibGUgSG9zdFdFUFxuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgV0xBTl9DTURfU0VUX1dQQToKLSAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIldMQU5fQ01EX1NFVF9XUEFcbiIpOwotCi0gICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmc1ZhbHVlLCBwUmVxLT5kYXRhLCBzaXplb2YoU0NtZFZhbHVlKSkpIHsKLQkJCXJlc3VsdCA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoc1ZhbHVlLmR3VmFsdWUgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAidXAgd3BhZGV2XG4iKTsKLQkJICAgbWVtY3B5KHBEZXZpY2UtPndwYWRldi0+ZGV2X2FkZHIsIHBEZXZpY2UtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKLQkJICAgcERldmljZS0+YldQQURFVlVwID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gImNsb3NlIHdwYWRldlxuIik7Ci0JICAgcERldmljZS0+YldQQURFVlVwID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgV0xBTl9DTURfQVBfU1RBUlQ6Ci0KLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfQVBfU1RBUlRcbiIpOwotICAgICAgICBpZiAocERldmljZS0+YlJhZGlvT2ZmID09IHRydWUpIHsKLSAgICAgICAgICAgIENBUkRiUmFkaW9Qb3dlck9uKHBEZXZpY2UpOwotICAgICAgICAgICAgdk1nclRpbWVySW5pdChwRGV2aWNlKTsKLSAgICAgICAgICAgIE1BQ3ZJbnRFbmFibGUocERldmljZS0+UG9ydE9mZnNldCwgSU1SX01BU0tfVkFMVUUpOwotICAgICAgICAgICAgYWRkX3RpbWVyKCZwTWdtdC0+c1RpbWVyU2Vjb25kQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmc1N0YXJ0QVBDbWQsIHBSZXEtPmRhdGEsIHNpemVvZihTQ21kU3RhcnRBUCkpKSB7Ci0JCQlyZXN1bHQgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCSAgICBpZiAoc1N0YXJ0QVBDbWQud0JTU1R5cGUgPT0gQVApIHsKLQkgICAgICAgIHBNZ210LT5lQ29uZmlnTW9kZSA9IFdNQUNfQ09ORklHX0FQOwotCSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiaW9jdCBzZXQgdG8gQVAgbW9kZVxuIik7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJpb2N0IEJTUyB0eXBlIG5vdCBzZXQgdG8gQVAgbW9kZVxuIik7Ci0JCQlyZXN1bHQgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JICAgIH0KLQotCi0JICAgIGlmIChzU3RhcnRBUENtZC53QkJQVHlwZSA9PSBQSFk4MDIxMWcpIHsKLSAgICAgICAgICAgIHBNZ210LT5ieUFQQkJUeXBlID0gUEhZX1RZUEVfMTFHOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHNTdGFydEFQQ21kLndCQlBUeXBlID09IFBIWTgwMjExYSkgewotICAgICAgICAgICAgICAgICBwTWdtdC0+YnlBUEJCVHlwZSA9IFBIWV9UWVBFXzExQTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHBNZ210LT5ieUFQQkJUeXBlID0gUEhZX1RZUEVfMTFCOwotICAgICAgICB9Ci0KLSAgICAgICAgcEl0ZW1TU0lEID0gKFBXTEFOX0lFX1NTSUQpc1N0YXJ0QVBDbWQuc3NpZDsKLSAgICAgICAgbWVtc2V0KHBNZ210LT5hYnlEZXNpcmVTU0lELCAwLCBXTEFOX0lFSERSX0xFTiArIFdMQU5fU1NJRF9NQVhMRU4gKyAxKTsKLQkJbWVtY3B5KHBNZ210LT5hYnlEZXNpcmVTU0lELCBwSXRlbVNTSUQsIHBJdGVtU1NJRC0+bGVuICsgV0xBTl9JRUhEUl9MRU4pOwotCi0JICAgIGlmICgoc1N0YXJ0QVBDbWQudUNoYW5uZWwgPiAwKSYmKHNTdGFydEFQQ21kLnVDaGFubmVsIDw9IDE0KSkKLQkgICAgICAgIHBEZXZpY2UtPnVDaGFubmVsID0gc1N0YXJ0QVBDbWQudUNoYW5uZWw7Ci0KLQkgICAgaWYgKChzU3RhcnRBUENtZC51QmVhY29uSW50ID49IDIwKSAmJiAoc1N0YXJ0QVBDbWQudUJlYWNvbkludCA8PSAxMDAwKSkKLSAgICAgICAgICAgIHBNZ210LT53SUJTU0JlYWNvblBlcmlvZCA9IHNTdGFydEFQQ21kLnVCZWFjb25JbnQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBNZ210LT53SUJTU0JlYWNvblBlcmlvZCA9IDEwMDsKLQotICAgICAgICBpZiAoc1N0YXJ0QVBDbWQuYlNoYXJlS2V5QXV0aCA9PSB0cnVlKXsKLSAgICAgICAgICAgIHBNZ210LT5iU2hhcmVLZXlBbGdvcml0aG0gPSB0cnVlOwotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiU2hhcmUgS2V5IFxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwTWdtdC0+YlNoYXJlS2V5QWxnb3JpdGhtID0gZmFsc2U7Ci0gICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJPcGVuIFN5c3RlbSBcbiIpOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweShwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlcywgYWJ5U3VwcFJhdGVzLCA2KTsKLQotICAgICAgICBpZiAoc1N0YXJ0QVBDbWQuYnlCYXNpY1JhdGUgJiBCSVQzKSB7Ci0gICAgICAgICAgICBwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlc1syXSB8PSBCSVQ3OwotICAgICAgICAgICAgcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbM10gfD0gQklUNzsKLSAgICAgICAgICAgIHBNZ210LT5hYnlJQlNTU3VwcFJhdGVzWzRdIHw9IEJJVDc7Ci0gICAgICAgICAgICBwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlc1s1XSB8PSBCSVQ3OwotICAgICAgICB9ZWxzZSBpZiAoc1N0YXJ0QVBDbWQuYnlCYXNpY1JhdGUgJiBCSVQyKSB7Ci0gICAgICAgICAgICAgcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbMl0gfD0gQklUNzsKLSAgICAgICAgICAgICBwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlc1szXSB8PSBCSVQ3OwotICAgICAgICAgICAgIHBNZ210LT5hYnlJQlNTU3VwcFJhdGVzWzRdIHw9IEJJVDc7Ci0gICAgICAgIH1lbHNlIGlmIChzU3RhcnRBUENtZC5ieUJhc2ljUmF0ZSAmIEJJVDEpIHsKLSAgICAgICAgICAgICBwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlc1syXSB8PSBCSVQ3OwotICAgICAgICAgICAgIHBNZ210LT5hYnlJQlNTU3VwcFJhdGVzWzNdIHw9IEJJVDc7Ci0gICAgICAgIH1lbHNlIGlmIChzU3RhcnRBUENtZC5ieUJhc2ljUmF0ZSAmIEJJVDEpIHsKLSAgICAgICAgICAgICBwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlc1syXSB8PSBCSVQ3OwotICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICAvL2RlZmF1bHQgMSwyTQotICAgICAgICAgICAgIHBNZ210LT5hYnlJQlNTU3VwcFJhdGVzWzJdIHw9IEJJVDc7Ci0gICAgICAgICAgICAgcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbM10gfD0gQklUNzsKLSAgICAgICAgfQotCi0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIlN1cHBvcnQgUmF0ZT0gJXggJXggJXggJXhcbiIsCi0gICAgICAgICAgICAgICAgcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbMl0sCi0gICAgICAgICAgICAgICAgcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbM10sCi0gICAgICAgICAgICAgICAgcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbNF0sCi0gICAgICAgICAgICAgICAgcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbNV0KLSAgICAgICAgICAgICAgICApOwotCi0gICAgICAgIG5ldGlmX3N0b3BfcXVldWUocERldmljZS0+ZGV2KTsKLSAgICAgICAgc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0gICAgICAgIGJTY2hlZHVsZUNvbW1hbmQoKHZvaWQgKilwRGV2aWNlLCBXTEFOX0NNRF9SVU5fQVAsIE5VTEwpOwotICAgICAgICBzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgV0xBTl9DTURfR0VUX05PREVfQ05UOgotCi0JCWNiTGlzdENvdW50ID0gMDsKLQkJcE5vZGUgPSAmKHBNZ210LT5zTm9kZURCVGFibGVbMF0pOwotICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCAoTUFYX05PREVfTlVNICsgMSk7IGlpKyspIHsKLSAgICAgICAgICAgIHBOb2RlID0gJihwTWdtdC0+c05vZGVEQlRhYmxlW2lpXSk7Ci0gICAgICAgICAgICBpZiAoIXBOb2RlLT5iQWN0aXZlKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgY2JMaXN0Q291bnQrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHNOb2RlTGlzdC51SXRlbSA9IGNiTGlzdENvdW50OwotICAgICAgICBpZiAoY29weV90b191c2VyKHBSZXEtPmRhdGEsICZzTm9kZUxpc3QsIHNpemVvZihTTm9kZUxpc3QpKSkgewotCQkJcmVzdWx0ID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0gICAgICAgIHBSZXEtPndSZXN1bHQgPSAwOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgV0xBTl9DTURfR0VUX05PREVfTElTVDoKLQotICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJnNOb2RlTGlzdCwgcFJlcS0+ZGF0YSwgc2l6ZW9mKFNOb2RlTGlzdCkpKSB7Ci0JCQlyZXN1bHQgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLSAgICAgICAgcE5vZGVMaXN0ID0gKFBTTm9kZUxpc3Qpa21hbGxvYyhzaXplb2YoU05vZGVMaXN0KSArIChzTm9kZUxpc3QudUl0ZW0gKiBzaXplb2YoU05vZGVJdGVtKSksIChpbnQpR0ZQX0FUT01JQyk7Ci0gICAgICAgIGlmIChwTm9kZUxpc3QgPT0gTlVMTCkgewotICAgICAgICAgICAgcmVzdWx0ID0gLUVOT01FTTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0JCXBOb2RlTGlzdC0+dUl0ZW0gPSBzTm9kZUxpc3QudUl0ZW07Ci0JCXBOb2RlID0gJihwTWdtdC0+c05vZGVEQlRhYmxlWzBdKTsKLSAgICAgICAgZm9yIChpaSA9IDAsIGpqID0gMDsgaWkgPCAoTUFYX05PREVfTlVNICsgMSk7IGlpKyspIHsKLSAgICAgICAgICAgIHBOb2RlID0gJihwTWdtdC0+c05vZGVEQlRhYmxlW2lpXSk7Ci0gICAgICAgICAgICBpZiAocE5vZGUtPmJBY3RpdmUpIHsKLSAgICAJCSAgICBwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0ud0FJRCA9IHBOb2RlLT53QUlEOwotICAgIAkJICAgIG1lbWNweShwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0uYWJ5TUFDQWRkciwgcE5vZGUtPmFieU1BQ0FkZHIsIFdMQU5fQUREUl9MRU4pOwotICAgIAkJICAgIHBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS53VHhEYXRhUmF0ZSA9IHBOb2RlLT53VHhEYXRhUmF0ZTsKLSAgICAJCSAgICBwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0ud0luQWN0aXZlQ291bnQgPSAodW5zaWduZWQgc2hvcnQpcE5vZGUtPnVJbkFjdGl2ZUNvdW50OwotICAgIAkJICAgIHBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS53RW5RdWV1ZUNudCA9ICh1bnNpZ25lZCBzaG9ydClwTm9kZS0+d0VuUXVldWVDbnQ7Ci0gICAgCQkgICAgcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLndGbGFncyA9ICh1bnNpZ25lZCBzaG9ydClwTm9kZS0+ZHdGbGFnczsKLSAgICAJCSAgICBwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0uYlBXQml0T24gPSBwTm9kZS0+YlBTRW5hYmxlOwotICAgIAkJICAgIHBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS5ieUtleUluZGV4ID0gcE5vZGUtPmJ5S2V5SW5kZXg7Ci0gICAgCQkgICAgcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLndXZXBLZXlMZW5ndGggPSBwTm9kZS0+dVdlcEtleUxlbmd0aDsKLSAgICAJCSAgICBtZW1jcHkoJihwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0uYWJ5V2VwS2V5WzBdKSwgJihwTm9kZS0+YWJ5V2VwS2V5WzBdKSwgV0VQX0tFWU1BWExFTik7Ci0gICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAia2V5PSAlMi4yWDolMi4yWDolMi4yWDolMi4yWDolMi4yWFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0uYWJ5V2VwS2V5WzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS5hYnlXZXBLZXlbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLmFieVdlcEtleVsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0uYWJ5V2VwS2V5WzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS5hYnlXZXBLZXlbNF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgCQkgICAgcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLmJJc0luRmFsbGJhY2sgPSBwTm9kZS0+YklzSW5GYWxsYmFjazsKLSAgICAJCSAgICBwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0udVR4RmFpbHVyZXMgPSBwTm9kZS0+dVR4RmFpbHVyZXM7Ci0gICAgCQkgICAgcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLnVUeEF0dGVtcHRzID0gcE5vZGUtPnVUeEF0dGVtcHRzOwotICAgIAkJICAgIHBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS53RmFpbHVyZVJhdGlvID0gKHVuc2lnbmVkIHNob3J0KXBOb2RlLT51RmFpbHVyZVJhdGlvOwotICAgIAkJICAgIGpqICsrOwotICAgIAkJICAgIGlmIChqaiA+PSBwTm9kZUxpc3QtPnVJdGVtKQotICAgIAkJICAgICAgICBicmVhazsKLSAgICAJCX0KLQkJfQotICAgICAgICBpZiAoY29weV90b191c2VyKHBSZXEtPmRhdGEsIHBOb2RlTGlzdCwgc2l6ZW9mKFNOb2RlTGlzdCkgKyAoc05vZGVMaXN0LnVJdGVtICogc2l6ZW9mKFNOb2RlSXRlbSkpKSkgewotCQkJcmVzdWx0ID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0gICAgICAgIGtmcmVlKHBOb2RlTGlzdCk7Ci0gICAgICAgIHBSZXEtPndSZXN1bHQgPSAwOwotICAgICAgICBicmVhazsKLQotI2lmZGVmIFdQQV9TTV9UcmFuc3RhdHVzCi0gICAgY2FzZSAweEZGOgotICAgICAgICBtZW1zZXQod3BhX1Jlc3VsdC5pZm5hbWUsMCxzaXplb2Yod3BhX1Jlc3VsdC5pZm5hbWUpKTsKLQkgICAgd3BhX1Jlc3VsdC5wcm90byA9IDA7Ci0JICAgIHdwYV9SZXN1bHQua2V5X21nbXQgPSAwOwotCSAgICB3cGFfUmVzdWx0LmVhcF90eXBlID0gMDsKLQkgICAgd3BhX1Jlc3VsdC5hdXRoZW50aWNhdGVkID0gZmFsc2U7Ci0JICAgICAgcERldmljZS0+ZldQQV9BdXRoZW5lZCA9IGZhbHNlOwotICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJndwYV9SZXN1bHQsIHBSZXEtPmRhdGEsIHNpemVvZih3cGFfUmVzdWx0KSkpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi1pZih3cGFfUmVzdWx0LmF1dGhlbnRpY2F0ZWQ9PXRydWUpIHsKLSAgICNpZmRlZiBTbmRFdnRfVG9BUEkKLSAgIHsKLSAgICAgdW5pb24gaXdyZXFfZGF0YSAgICAgIHdycXU7Ci0KLSAgICAgcEl0ZW1TU0lEID0gKFBXTEFOX0lFX1NTSUQpcE1nbXQtPmFieUN1cnJTU0lEOwotCi0gICAgIG1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKLSAgICAgd3JxdS5kYXRhLmZsYWdzID0gUlRfV1BBQ09OTkVDVEVEX0VWRU5UX0ZMQUc7Ci0gICAgIHdycXUuZGF0YS5sZW5ndGggPXBJdGVtU1NJRC0+bGVuOwotICAgICB3aXJlbGVzc19zZW5kX2V2ZW50KHBEZXZpY2UtPmRldiwgSVdFVkNVU1RPTSwgJndycXUsIHBJdGVtU1NJRC0+YWJ5U1NJRCk7Ci0gICB9Ci0gICAjZW5kaWYKLSAgICAgICAgIHBEZXZpY2UtPmZXUEFfQXV0aGVuZWQgPSB0cnVlOyAgICAgICAgICAgLy9pcyBzdWNjZXNzZnVsIHBlZXIgdG8gd3BhX1Jlc3VsdC5hdXRoZW50aWNhdGVkPwotfQotCi0gICAgICAgIC8vcHJpbnRrKCJnZXQgcHJpdmF0ZSB3cGFfc3VwcGxpY2FudCBhbm5vdW5jZSBXUEEgU01cbiIpOwotCS8vcHJpbnRrKCJ3cGEtLT5pZm5hbWU9JXNcbiIsd3BhX1Jlc3VsdC5pZm5hbWUpOwotCS8vcHJpbnRrKCJ3cGEtLT5wcm90bz0lZFxuIix3cGFfUmVzdWx0LnByb3RvKTsKLQkvL3ByaW50aygid3BhLS0+a2V5LW1nbXQ9JWRcbiIsd3BhX1Jlc3VsdC5rZXlfbWdtdCk7Ci0JLy9wcmludGsoIndwYS0tPmVhcF90eXBlPSVkXG4iLHdwYV9SZXN1bHQuZWFwX3R5cGUpOwotCS8vcHJpbnRrKCJ3cGEtLT5hdXRoZW50aWNhdGVkIGlzICVzXG4iLCh3cGFfUmVzdWx0LmF1dGhlbnRpY2F0ZWQ9PXRydWUpPyJ0cnVlIjoiZmFsc2UiKTsKK2ludCBwcml2YXRlX2lvY3RsKFBTRGV2aWNlIHBEZXZpY2UsIHN0cnVjdCBpZnJlcSAqcnEpCit7CisJUFNDbWRSZXF1ZXN0CXBSZXEgPSAoUFNDbWRSZXF1ZXN0KXJxOworCVBTTWdtdE9iamVjdAlwTWdtdCA9IHBEZXZpY2UtPnBNZ210OworCWludAkJcmVzdWx0ID0gMDsKKwlQV0xBTl9JRV9TU0lECXBJdGVtU1NJRDsKKwlTQ21kQlNTSm9pbglzSm9pbkNtZDsKKwlTQ21kWm9uZVR5cGVTZXQJc1pvbmVUeXBlQ21kOworCVNDbWRTY2FuCXNTY2FuQ21kOworCVNDbWRTdGFydEFQCXNTdGFydEFQQ21kOworCVNDbWRTZXRXRVAJc1dFUENtZDsKKwlTQ21kVmFsdWUJc1ZhbHVlOworCVNCU1NJRExpc3QJc0xpc3Q7CisJU05vZGVMaXN0CXNOb2RlTGlzdDsKKwlQU0JTU0lETGlzdAlwTGlzdDsKKwlQU05vZGVMaXN0CXBOb2RlTGlzdDsKKwl1bnNpZ25lZCBpbnQJY2JMaXN0Q291bnQ7CisJUEtub3duQlNTCXBCU1M7CisJUEtub3duTm9kZURCCXBOb2RlOworCXVuc2lnbmVkIGludAlpaSwgamo7CisJU0NtZExpbmtTdGF0dXMJc0xpbmtTdGF0dXM7CisJdW5zaWduZWQgY2hhcglhYnlTdXBwUmF0ZXNbXSA9IHtXTEFOX0VJRF9TVVBQX1JBVEVTLCA0LCAweDAyLCAweDA0LCAweDBCLCAweDE2fTsKKwl1bnNpZ25lZCBjaGFyCWFieU51bGxBZGRyW10gPSB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH07CisJdW5zaWduZWQgbG9uZwlkd0tleUluZGV4ID0gMDsKKwl1bnNpZ25lZCBjaGFyCWFieVNjYW5TU0lEW1dMQU5fSUVIRFJfTEVOICsgV0xBTl9TU0lEX01BWExFTiArIDFdOworCWxvbmcJCWxkQm07CiAKIAlwUmVxLT53UmVzdWx0ID0gMDsKLSAgICAgICAgYnJlYWs7CisKKwlzd2l0Y2ggKHBSZXEtPndDbWRDb2RlKSB7CisJY2FzZSBXTEFOX0NNRF9CU1NfU0NBTjoKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfQlNTX1NDQU4uLmJlZ2luXG4iKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzU2NhbkNtZCwgcFJlcS0+ZGF0YSwgc2l6ZW9mKFNDbWRTY2FuKSkpIHsKKwkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCXBJdGVtU1NJRCA9IChQV0xBTl9JRV9TU0lEKXNTY2FuQ21kLnNzaWQ7CisJCWlmIChwSXRlbVNTSUQtPmxlbiA+IFdMQU5fU1NJRF9NQVhMRU4gKyAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChwSXRlbVNTSUQtPmxlbiAhPSAwKSB7CisJCQltZW1zZXQoYWJ5U2NhblNTSUQsIDAsIFdMQU5fSUVIRFJfTEVOICsgV0xBTl9TU0lEX01BWExFTiArIDEpOworCQkJbWVtY3B5KGFieVNjYW5TU0lELCBwSXRlbVNTSUQsIHBJdGVtU1NJRC0+bGVuICsgV0xBTl9JRUhEUl9MRU4pOworCQl9CisKKwkJaWYgKHBEZXZpY2UtPmJNQUNTdXNwZW5kID09IHRydWUpIHsKKwkJCWlmIChwRGV2aWNlLT5iUmFkaW9PZmYgPT0gdHJ1ZSkKKwkJCQlDQVJEYlJhZGlvUG93ZXJPbihwRGV2aWNlKTsKKwkJCXZNZ3JUaW1lckluaXQocERldmljZSk7CisJCQlNQUN2SW50RW5hYmxlKHBEZXZpY2UtPlBvcnRPZmZzZXQsIElNUl9NQVNLX1ZBTFVFKTsKKwkJCWFkZF90aW1lcigmcE1nbXQtPnNUaW1lclNlY29uZENhbGxiYWNrKTsKKwkJCXBEZXZpY2UtPmJNQUNTdXNwZW5kID0gZmFsc2U7CisJCX0KKwkJc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7CisJCWlmIChtZW1jbXAocE1nbXQtPmFieUN1cnJCU1NJRCwgJmFieU51bGxBZGRyWzBdLCA2KSA9PSAwKQorCQkJQlNTdkNsZWFyQlNTTGlzdCgodm9pZCAqKXBEZXZpY2UsIGZhbHNlKTsKKwkJZWxzZQorCQkJQlNTdkNsZWFyQlNTTGlzdCgodm9pZCAqKXBEZXZpY2UsIHBEZXZpY2UtPmJMaW5rUGFzcyk7CisKKwkJaWYgKHBJdGVtU1NJRC0+bGVuICE9IDApCisJCQliU2NoZWR1bGVDb21tYW5kKCh2b2lkICopIHBEZXZpY2UsIFdMQU5fQ01EX0JTU0lEX1NDQU4sIGFieVNjYW5TU0lEKTsKKwkJZWxzZQorCQkJYlNjaGVkdWxlQ29tbWFuZCgodm9pZCAqKSBwRGV2aWNlLCBXTEFOX0NNRF9CU1NJRF9TQ0FOLCBOVUxMKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fQ01EX1pPTkVUWVBFX1NFVDoKKwkJLyogbWlrZSBhZGQgOmNhbm4ndCBzdXBwb3J0LiAqLworCQlyZXN1bHQgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzWm9uZVR5cGVDbWQsIHBSZXEtPmRhdGEsIHNpemVvZihTQ21kWm9uZVR5cGVTZXQpKSkgeworCQkJcmVzdWx0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHNab25lVHlwZUNtZC5iV3JpdGUgPT0gdHJ1ZSkgeworCQkJLyogd3JpdGUgem9uZXR5cGUgKi8KKwkJCWlmIChzWm9uZVR5cGVDbWQuWm9uZVR5cGUgPT0gWm9uZVR5cGVfVVNBKSB7CisJCQkJLyogc2V0IHRvIFVTQSAqLworCQkJCXByaW50aygic2V0X1pvbmVUeXBlOlVTQVxuIik7CisJCQl9IGVsc2UgaWYgKHNab25lVHlwZUNtZC5ab25lVHlwZSA9PSBab25lVHlwZV9KYXBhbikgeworCQkJCS8qIHNldCB0byBKYXBhbiAqLworCQkJCXByaW50aygic2V0X1pvbmVUeXBlOkphcGFuXG4iKTsKKwkJCX0gZWxzZSBpZiAoc1pvbmVUeXBlQ21kLlpvbmVUeXBlID09IFpvbmVUeXBlX0V1cm9wZSkgeworCQkJCS8qIHNldCB0byBFdXJvcGUgKi8KKwkJCQlwcmludGsoInNldF9ab25lVHlwZTpFdXJvcGVcbiIpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogcmVhZCB6b25ldHlwZSAqLworCQkJdW5zaWduZWQgY2hhciB6b25ldHlwZSA9IDA7CisKKwkJCWlmICh6b25ldHlwZSA9PSAweDAwKSB7CQkvKiBVU0EgKi8KKwkJCQlzWm9uZVR5cGVDbWQuWm9uZVR5cGUgPSBab25lVHlwZV9VU0E7CisJCQl9IGVsc2UgaWYgKHpvbmV0eXBlID09IDB4MDEpIHsJLyogSmFwYW4gKi8KKwkJCQlzWm9uZVR5cGVDbWQuWm9uZVR5cGUgPSBab25lVHlwZV9KYXBhbjsKKwkJCX0gZWxzZSBpZiAoem9uZXR5cGUgPT0gMHgwMikgewkvKiBFdXJvcGUgKi8KKwkJCQlzWm9uZVR5cGVDbWQuWm9uZVR5cGUgPSBab25lVHlwZV9FdXJvcGU7CisJCQl9IGVsc2UgewkJCS8qIFVua25vd24gWm9uZVR5cGUgKi8KKwkJCQlwcmludGsoIkVycm9yOlpvbmVUeXBlWyV4XSBVbmtub3duID8/P1xuIiwgem9uZXR5cGUpOworCQkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoY29weV90b191c2VyKHBSZXEtPmRhdGEsICZzWm9uZVR5cGVDbWQsIHNpemVvZihTQ21kWm9uZVR5cGVTZXQpKSkgeworCQkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fQ01EX0JTU19KT0lOOgorCQlpZiAocERldmljZS0+Yk1BQ1N1c3BlbmQgPT0gdHJ1ZSkgeworCQkJaWYgKHBEZXZpY2UtPmJSYWRpb09mZiA9PSB0cnVlKQorCQkJCUNBUkRiUmFkaW9Qb3dlck9uKHBEZXZpY2UpOworCQkJdk1nclRpbWVySW5pdChwRGV2aWNlKTsKKwkJCU1BQ3ZJbnRFbmFibGUocERldmljZS0+UG9ydE9mZnNldCwgSU1SX01BU0tfVkFMVUUpOworCQkJYWRkX3RpbWVyKCZwTWdtdC0+c1RpbWVyU2Vjb25kQ2FsbGJhY2spOworCQkJcERldmljZS0+Yk1BQ1N1c3BlbmQgPSBmYWxzZTsKKwkJfQorCisJCWlmIChjb3B5X2Zyb21fdXNlcigmc0pvaW5DbWQsIHBSZXEtPmRhdGEsIHNpemVvZihTQ21kQlNTSm9pbikpKSB7CisJCQlyZXN1bHQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlwSXRlbVNTSUQgPSAoUFdMQU5fSUVfU1NJRClzSm9pbkNtZC5zc2lkOworCQlpZiAocEl0ZW1TU0lELT5sZW4gPiBXTEFOX1NTSURfTUFYTEVOICsgMSkKKwkJCXJldHVybiAtRUlOVkFMOworCQltZW1zZXQocE1nbXQtPmFieURlc2lyZVNTSUQsIDAsIFdMQU5fSUVIRFJfTEVOICsgV0xBTl9TU0lEX01BWExFTiArIDEpOworCQltZW1jcHkocE1nbXQtPmFieURlc2lyZVNTSUQsIHBJdGVtU1NJRCwgcEl0ZW1TU0lELT5sZW4gKyBXTEFOX0lFSERSX0xFTik7CisJCWlmIChzSm9pbkNtZC53QlNTVHlwZSA9PSBBREhPQykgeworCQkJcE1nbXQtPmVDb25maWdNb2RlID0gV01BQ19DT05GSUdfSUJTU19TVEE7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJpb2N0IHNldCB0byBhZGhvYyBtb2RlXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXBNZ210LT5lQ29uZmlnTW9kZSA9IFdNQUNfQ09ORklHX0VTU19TVEE7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJpb2N0IHNldCB0byBTVEEgbW9kZVxuIik7CisJCX0KKwkJaWYgKHNKb2luQ21kLmJQU0VuYWJsZSA9PSB0cnVlKSB7CisJCQlwRGV2aWNlLT5lUFNNb2RlID0gV01BQ19QT1dFUl9GQVNUOworCQkJcE1nbXQtPndMaXN0ZW5JbnRlcnZhbCA9IDI7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJQb3dlciBTYXZpbmcgT25cbiIpOworCQl9IGVsc2UgeworCQkJcERldmljZS0+ZVBTTW9kZSA9IFdNQUNfUE9XRVJfQ0FNOworCQkJcE1nbXQtPndMaXN0ZW5JbnRlcnZhbCA9IDE7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJQb3dlciBTYXZpbmcgT2ZmXG4iKTsKKwkJfQorCisJCWlmIChzSm9pbkNtZC5iU2hhcmVLZXlBdXRoID09IHRydWUpIHsKKwkJCXBNZ210LT5iU2hhcmVLZXlBbGdvcml0aG0gPSB0cnVlOworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiU2hhcmUgS2V5XG4iKTsKKwkJfSBlbHNlIHsKKwkJCXBNZ210LT5iU2hhcmVLZXlBbGdvcml0aG0gPSBmYWxzZTsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIk9wZW4gU3lzdGVtXG4iKTsKKwkJfQorCQlwRGV2aWNlLT51Q2hhbm5lbCA9IHNKb2luQ21kLnVDaGFubmVsOworCQluZXRpZl9zdG9wX3F1ZXVlKHBEZXZpY2UtPmRldik7CisJCXNwaW5fbG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOworCQlwTWdtdC0+ZUN1cnJTdGF0ZSA9IFdNQUNfU1RBVEVfSURMRTsKKwkJYlNjaGVkdWxlQ29tbWFuZCgodm9pZCAqKSBwRGV2aWNlLCBXTEFOX0NNRF9CU1NJRF9TQ0FOLCBwTWdtdC0+YWJ5RGVzaXJlU1NJRCk7CisJCWJTY2hlZHVsZUNvbW1hbmQoKHZvaWQgKikgcERldmljZSwgV0xBTl9DTURfU1NJRCwgTlVMTCk7CisJCXNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7CisJCWJyZWFrOworCisJY2FzZSBXTEFOX0NNRF9TRVRfV0VQOgorCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJXTEFOX0NNRF9TRVRfV0VQIEtleS5cbiIpOworCQltZW1zZXQoJnNXRVBDbWQsIDAsIHNpemVvZihTQ21kU2V0V0VQKSk7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc1dFUENtZCwgcFJlcS0+ZGF0YSwgc2l6ZW9mKFNDbWRTZXRXRVApKSkgeworCQkJcmVzdWx0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzV0VQQ21kLmJFbmFibGVXZXAgIT0gdHJ1ZSkgeworCQkJcERldmljZS0+YkVuY3J5cHRpb25FbmFibGUgPSBmYWxzZTsKKwkJCXBEZXZpY2UtPmVFbmNyeXB0aW9uU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb25EaXNhYmxlZDsKKwkJCU1BQ3ZEaXNhYmxlRGVmYXVsdEtleShwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIldFUCBmdW5jdGlvbiBkaXNhYmxlLlxuIik7CisJCQlicmVhazsKKwkJfQorCisJCWZvciAoaWkgPSAwOyBpaSA8IFdMQU5fV0VQX05LRVlTOyBpaSsrKSB7CisJCQlpZiAoc1dFUENtZC5iV2VwS2V5QXZhaWxhYmxlW2lpXSkgeworCQkJCWlmIChpaSA9PSBzV0VQQ21kLmJ5S2V5SW5kZXgpCisJCQkJCWR3S2V5SW5kZXggPSBpaSB8ICgxIDw8IDMxKTsKKwkJCQllbHNlCisJCQkJCWR3S2V5SW5kZXggPSBpaTsKKworCQkJCUtleWJTZXREZWZhdWx0S2V5KCYocERldmljZS0+c0tleSksCisJCQkJCQkgIGR3S2V5SW5kZXgsCisJCQkJCQkgIHNXRVBDbWQuYXVXZXBLZXlMZW5ndGhbaWldLAorCQkJCQkJICBOVUxMLAorCQkJCQkJICAodW5zaWduZWQgY2hhciAqKSZzV0VQQ21kLmFieVdlcEtleVtpaV1bMF0sCisJCQkJCQkgIEtFWV9DVExfV0VQLAorCQkJCQkJICBwRGV2aWNlLT5Qb3J0T2Zmc2V0LAorCQkJCQkJICBwRGV2aWNlLT5ieUxvY2FsSUQpOworCQkJfQorCQl9CisJCXBEZXZpY2UtPmJ5S2V5SW5kZXggPSBzV0VQQ21kLmJ5S2V5SW5kZXg7CisJCXBEZXZpY2UtPmJUcmFuc21pdEtleSA9IHRydWU7CisJCXBEZXZpY2UtPmJFbmNyeXB0aW9uRW5hYmxlID0gdHJ1ZTsKKwkJcERldmljZS0+ZUVuY3J5cHRpb25TdGF0dXMgPSBOZGlzODAyXzExRW5jcnlwdGlvbjFFbmFibGVkOworCQlicmVhazsKKworCWNhc2UgV0xBTl9DTURfR0VUX0xJTks6CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIldMQU5fQ01EX0dFVF9MSU5LIHN0YXR1cy5cbiIpOworCisJCW1lbXNldChzTGlua1N0YXR1cy5hYnlTU0lELCAwICwgV0xBTl9TU0lEX01BWExFTiArIDEpOworCisJCWlmIChwTWdtdC0+ZUN1cnJNb2RlID09IFdNQUNfTU9ERV9JQlNTX1NUQSkKKwkJCXNMaW5rU3RhdHVzLndCU1NUeXBlID0gQURIT0M7CisJCWVsc2UKKwkJCXNMaW5rU3RhdHVzLndCU1NUeXBlID0gSU5GUkE7CisKKwkJaWYgKHBNZ210LT5lQ3VyclN0YXRlID09IFdNQUNfU1RBVEVfSk9JTlRFRCkKKwkJCXNMaW5rU3RhdHVzLmJ5U3RhdGUgPSBBREhPQ19KT0lOVEVEOworCQllbHNlCisJCQlzTGlua1N0YXR1cy5ieVN0YXRlID0gQURIT0NfU1RBUlRFRDsKKworCQlzTGlua1N0YXR1cy51Q2hhbm5lbCA9IHBNZ210LT51Q3VyckNoYW5uZWw7CisJCWlmIChwRGV2aWNlLT5iTGlua1Bhc3MgPT0gdHJ1ZSkgeworCQkJc0xpbmtTdGF0dXMuYkxpbmsgPSB0cnVlOworCQkJcEl0ZW1TU0lEID0gKFBXTEFOX0lFX1NTSUQpcE1nbXQtPmFieUN1cnJTU0lEOworCQkJbWVtY3B5KHNMaW5rU3RhdHVzLmFieVNTSUQsIHBJdGVtU1NJRC0+YWJ5U1NJRCwgcEl0ZW1TU0lELT5sZW4pOworCQkJbWVtY3B5KHNMaW5rU3RhdHVzLmFieUJTU0lELCBwTWdtdC0+YWJ5Q3VyckJTU0lELCBXTEFOX0JTU0lEX0xFTik7CisJCQlzTGlua1N0YXR1cy51TGlua1JhdGUgPSBwTWdtdC0+c05vZGVEQlRhYmxlWzBdLndUeERhdGFSYXRlOworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyIgTGluayBTdWNjZXNzIVxuIik7CisJCX0gZWxzZSB7CisJCQlzTGlua1N0YXR1cy5iTGluayA9IGZhbHNlOworCQkJc0xpbmtTdGF0dXMudUxpbmtSYXRlID0gMDsKKwkJfQorCQlpZiAoY29weV90b191c2VyKHBSZXEtPmRhdGEsICZzTGlua1N0YXR1cywgc2l6ZW9mKFNDbWRMaW5rU3RhdHVzKSkpIHsKKwkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgV0xBTl9DTURfR0VUX0xJU1RMRU46CisJCWNiTGlzdENvdW50ID0gMDsKKwkJcEJTUyA9ICYocE1nbXQtPnNCU1NMaXN0WzBdKTsKKwkJZm9yIChpaSA9IDA7IGlpIDwgTUFYX0JTU19OVU07IGlpKyspIHsKKwkJCXBCU1MgPSAmKHBNZ210LT5zQlNTTGlzdFtpaV0pOworCQkJaWYgKCFwQlNTLT5iQWN0aXZlKQorCQkJCWNvbnRpbnVlOworCQkJY2JMaXN0Q291bnQrKzsKKwkJfQorCQlzTGlzdC51SXRlbSA9IGNiTGlzdENvdW50OworCQlpZiAoY29weV90b191c2VyKHBSZXEtPmRhdGEsICZzTGlzdCwgc2l6ZW9mKFNCU1NJRExpc3QpKSkgeworCQkJcmVzdWx0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXBSZXEtPndSZXN1bHQgPSAwOworCQlicmVhazsKKworCWNhc2UgV0xBTl9DTURfR0VUX0xJU1Q6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc0xpc3QsIHBSZXEtPmRhdGEsIHNpemVvZihTQlNTSURMaXN0KSkpIHsKKwkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlwTGlzdCA9IChQU0JTU0lETGlzdClrbWFsbG9jKHNpemVvZihTQlNTSURMaXN0KSArIChzTGlzdC51SXRlbSAqIHNpemVvZihTQlNTSURJdGVtKSksIChpbnQpR0ZQX0FUT01JQyk7CisJCWlmIChwTGlzdCA9PSBOVUxMKSB7CisJCQlyZXN1bHQgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKwkJcExpc3QtPnVJdGVtID0gc0xpc3QudUl0ZW07CisJCXBCU1MgPSAmKHBNZ210LT5zQlNTTGlzdFswXSk7CisJCWZvciAoaWkgPSAwLCBqaiA9IDA7IGpqIDwgTUFYX0JTU19OVU0gOyBqaisrKSB7CisJCQlwQlNTID0gJihwTWdtdC0+c0JTU0xpc3RbampdKTsKKwkJCWlmIChwQlNTLT5iQWN0aXZlKSB7CisJCQkJcExpc3QtPnNCU1NJRExpc3RbaWldLnVDaGFubmVsID0gcEJTUy0+dUNoYW5uZWw7CisJCQkJcExpc3QtPnNCU1NJRExpc3RbaWldLndCZWFjb25JbnRlcnZhbCA9IHBCU1MtPndCZWFjb25JbnRlcnZhbDsKKwkJCQlwTGlzdC0+c0JTU0lETGlzdFtpaV0ud0NhcEluZm8gPSBwQlNTLT53Q2FwSW5mbzsKKwkJCQkvKiBwTGlzdC0+c0JTU0lETGlzdFtpaV0udVJTU0kgPSBwQlNTLT51UlNTSTsgKi8KKwkJCQlSRnZSU1NJVG9kQm0ocERldmljZSwgKHVuc2lnbmVkIGNoYXIpKHBCU1MtPnVSU1NJKSwgJmxkQm0pOworCQkJCXBMaXN0LT5zQlNTSURMaXN0W2lpXS51UlNTSSA9ICh1bnNpZ25lZCBpbnQpbGRCbTsKKwkJCQltZW1jcHkocExpc3QtPnNCU1NJRExpc3RbaWldLmFieUJTU0lELCBwQlNTLT5hYnlCU1NJRCwgV0xBTl9CU1NJRF9MRU4pOworCQkJCXBJdGVtU1NJRCA9IChQV0xBTl9JRV9TU0lEKXBCU1MtPmFieVNTSUQ7CisJCQkJbWVtc2V0KHBMaXN0LT5zQlNTSURMaXN0W2lpXS5hYnlTU0lELCAwLCBXTEFOX1NTSURfTUFYTEVOICsgMSk7CisJCQkJbWVtY3B5KHBMaXN0LT5zQlNTSURMaXN0W2lpXS5hYnlTU0lELCBwSXRlbVNTSUQtPmFieVNTSUQsIHBJdGVtU1NJRC0+bGVuKTsKKwkJCQlpZiAoV0xBTl9HRVRfQ0FQX0lORk9fRVNTKHBCU1MtPndDYXBJbmZvKSkgeworCQkJCQlwTGlzdC0+c0JTU0lETGlzdFtpaV0uYnlOZXRUeXBlID0gSU5GUkE7CisJCQkJfSBlbHNlIHsKKwkJCQkJcExpc3QtPnNCU1NJRExpc3RbaWldLmJ5TmV0VHlwZSA9IEFESE9DOworCQkJCX0KKwkJCQlpZiAoV0xBTl9HRVRfQ0FQX0lORk9fUFJJVkFDWShwQlNTLT53Q2FwSW5mbykpIHsKKwkJCQkJcExpc3QtPnNCU1NJRExpc3RbaWldLmJXRVBPbiA9IHRydWU7CisJCQkJfSBlbHNlIHsKKwkJCQkJcExpc3QtPnNCU1NJRExpc3RbaWldLmJXRVBPbiA9IGZhbHNlOworCQkJCX0KKwkJCQlpaSsrOworCQkJCWlmIChpaSA+PSBwTGlzdC0+dUl0ZW0pCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKGNvcHlfdG9fdXNlcihwUmVxLT5kYXRhLCBwTGlzdCwgc2l6ZW9mKFNCU1NJRExpc3QpICsgKHNMaXN0LnVJdGVtICogc2l6ZW9mKFNCU1NJREl0ZW0pKSkpIHsKKwkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlrZnJlZShwTGlzdCk7CisJCXBSZXEtPndSZXN1bHQgPSAwOworCQlicmVhazsKKworCWNhc2UgV0xBTl9DTURfR0VUX01JQjoKKwkJaWYgKGNvcHlfdG9fdXNlcihwUmVxLT5kYXRhLCAmKHBEZXZpY2UtPnM4MDJfMTFDb3VudGVyKSwgc2l6ZW9mKFNEb3QxMU1JQkNvdW50KSkpIHsKKwkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKworCWNhc2UgV0xBTl9DTURfR0VUX1NUQVQ6CisJCWlmIChjb3B5X3RvX3VzZXIocFJlcS0+ZGF0YSwgJihwRGV2aWNlLT5zY1N0YXRpc3RpYyksIHNpemVvZihTU3RhdENvdW50ZXIpKSkgeworCQkJcmVzdWx0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBXTEFOX0NNRF9TVE9QX01BQzoKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfU1RPUF9NQUNcbiIpOworCQluZXRpZl9zdG9wX3F1ZXVlKHBEZXZpY2UtPmRldik7CisKKwkJc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7CisJCWlmIChwRGV2aWNlLT5iUmFkaW9PZmYgPT0gZmFsc2UpIHsKKwkJCUNBUkRiUmFkaW9Qb3dlck9mZihwRGV2aWNlKTsKKwkJfQorCQlwRGV2aWNlLT5iTGlua1Bhc3MgPSBmYWxzZTsKKwkJbWVtc2V0KHBNZ210LT5hYnlDdXJyQlNTSUQsIDAsIDYpOworCQlwTWdtdC0+ZUN1cnJTdGF0ZSA9IFdNQUNfU1RBVEVfSURMRTsKKwkJZGVsX3RpbWVyKCZwRGV2aWNlLT5zVGltZXJDb21tYW5kKTsKKwkJZGVsX3RpbWVyKCZwTWdtdC0+c1RpbWVyU2Vjb25kQ2FsbGJhY2spOworCQlwRGV2aWNlLT5iQ21kUnVubmluZyA9IGZhbHNlOworCQlwRGV2aWNlLT5iTUFDU3VzcGVuZCA9IHRydWU7CisJCU1BQ3ZJbnREaXNhYmxlKHBEZXZpY2UtPlBvcnRPZmZzZXQpOworCQlzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOworCQlicmVhazsKKworCWNhc2UgV0xBTl9DTURfU1RBUlRfTUFDOgorCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJXTEFOX0NNRF9TVEFSVF9NQUNcbiIpOworCisJCWlmIChwRGV2aWNlLT5iTUFDU3VzcGVuZCA9PSB0cnVlKSB7CisJCQlpZiAocERldmljZS0+YlJhZGlvT2ZmID09IHRydWUpCisJCQkJQ0FSRGJSYWRpb1Bvd2VyT24ocERldmljZSk7CisJCQl2TWdyVGltZXJJbml0KHBEZXZpY2UpOworCQkJTUFDdkludEVuYWJsZShwRGV2aWNlLT5Qb3J0T2Zmc2V0LCBJTVJfTUFTS19WQUxVRSk7CisJCQlhZGRfdGltZXIoJnBNZ210LT5zVGltZXJTZWNvbmRDYWxsYmFjayk7CisJCQlwRGV2aWNlLT5iTUFDU3VzcGVuZCA9IGZhbHNlOworCQl9CisJCWJyZWFrOworCisJY2FzZSBXTEFOX0NNRF9TRVRfSE9TVEFQRDoKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfU0VUX0hPU1RBUERcbiIpOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmc1ZhbHVlLCBwUmVxLT5kYXRhLCBzaXplb2YoU0NtZFZhbHVlKSkpIHsKKwkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlpZiAoc1ZhbHVlLmR3VmFsdWUgPT0gMSkgeworCQkJaWYgKHZ0NjY1NV9ob3N0YXBfc2V0X2hvc3RhcGQocERldmljZSwgMSwgMSkgPT0gMCkgeworCQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkVuYWJsZSBIT1NUQVBcbiIpOworCQkJfSBlbHNlIHsKKwkJCQlyZXN1bHQgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJdnQ2NjU1X2hvc3RhcF9zZXRfaG9zdGFwZChwRGV2aWNlLCAwLCAxKTsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkRpc2FibGUgSE9TVEFQXG4iKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgV0xBTl9DTURfU0VUX0hPU1RBUERfU1RBOgorCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJXTEFOX0NNRF9TRVRfSE9TVEFQRF9TVEFcbiIpOworCQlicmVhazsKKworCWNhc2UgV0xBTl9DTURfU0VUXzgwMl8xWDoKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfU0VUXzgwMl8xWFxuIik7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc1ZhbHVlLCBwUmVxLT5kYXRhLCBzaXplb2YoU0NtZFZhbHVlKSkpIHsKKwkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzVmFsdWUuZHdWYWx1ZSA9PSAxKSB7CisJCQlwRGV2aWNlLT5iRW5hYmxlODAyMXggPSB0cnVlOworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiRW5hYmxlIDgwMi4xeFxuIik7CisJCX0gZWxzZSB7CisJCQlwRGV2aWNlLT5iRW5hYmxlODAyMXggPSBmYWxzZTsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkRpc2FibGUgODAyLjF4XG4iKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgV0xBTl9DTURfU0VUX0hPU1RfV0VQOgorCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJXTEFOX0NNRF9TRVRfSE9TVF9XRVBcbiIpOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnNWYWx1ZSwgcFJlcS0+ZGF0YSwgc2l6ZW9mKFNDbWRWYWx1ZSkpKSB7CisJCQlyZXN1bHQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc1ZhbHVlLmR3VmFsdWUgPT0gMSkgeworCQkJcERldmljZS0+YkVuYWJsZUhvc3RXRVAgPSB0cnVlOworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiRW5hYmxlIEhvc3RXRVBcbiIpOworCQl9IGVsc2UgeworCQkJcERldmljZS0+YkVuYWJsZUhvc3RXRVAgPSBmYWxzZTsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkRpc2FibGUgSG9zdFdFUFxuIik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fQ01EX1NFVF9XUEE6CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIldMQU5fQ01EX1NFVF9XUEFcbiIpOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmc1ZhbHVlLCBwUmVxLT5kYXRhLCBzaXplb2YoU0NtZFZhbHVlKSkpIHsKKwkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlpZiAoc1ZhbHVlLmR3VmFsdWUgPT0gMSkgeworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAidXAgd3BhZGV2XG4iKTsKKwkJCW1lbWNweShwRGV2aWNlLT53cGFkZXYtPmRldl9hZGRyLCBwRGV2aWNlLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJCQlwRGV2aWNlLT5iV1BBREVWVXAgPSB0cnVlOworCQl9IGVsc2UgeworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiY2xvc2Ugd3BhZGV2XG4iKTsKKwkJCXBEZXZpY2UtPmJXUEFERVZVcCA9IGZhbHNlOworCQl9CisJCWJyZWFrOworCisJY2FzZSBXTEFOX0NNRF9BUF9TVEFSVDoKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfQVBfU1RBUlRcbiIpOworCQlpZiAocERldmljZS0+YlJhZGlvT2ZmID09IHRydWUpIHsKKwkJCUNBUkRiUmFkaW9Qb3dlck9uKHBEZXZpY2UpOworCQkJdk1nclRpbWVySW5pdChwRGV2aWNlKTsKKwkJCU1BQ3ZJbnRFbmFibGUocERldmljZS0+UG9ydE9mZnNldCwgSU1SX01BU0tfVkFMVUUpOworCQkJYWRkX3RpbWVyKCZwTWdtdC0+c1RpbWVyU2Vjb25kQ2FsbGJhY2spOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc1N0YXJ0QVBDbWQsIHBSZXEtPmRhdGEsIHNpemVvZihTQ21kU3RhcnRBUCkpKSB7CisJCQlyZXN1bHQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc1N0YXJ0QVBDbWQud0JTU1R5cGUgPT0gQVApIHsKKwkJCXBNZ210LT5lQ29uZmlnTW9kZSA9IFdNQUNfQ09ORklHX0FQOworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiaW9jdCBzZXQgdG8gQVAgbW9kZVxuIik7CisJCX0gZWxzZSB7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJpb2N0IEJTUyB0eXBlIG5vdCBzZXQgdG8gQVAgbW9kZVxuIik7CisJCQlyZXN1bHQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc1N0YXJ0QVBDbWQud0JCUFR5cGUgPT0gUEhZODAyMTFnKSB7CisJCQlwTWdtdC0+YnlBUEJCVHlwZSA9IFBIWV9UWVBFXzExRzsKKwkJfSBlbHNlIGlmIChzU3RhcnRBUENtZC53QkJQVHlwZSA9PSBQSFk4MDIxMWEpIHsKKwkJCXBNZ210LT5ieUFQQkJUeXBlID0gUEhZX1RZUEVfMTFBOworCQl9IGVsc2UgeworCQkJcE1nbXQtPmJ5QVBCQlR5cGUgPSBQSFlfVFlQRV8xMUI7CisJCX0KKworCQlwSXRlbVNTSUQgPSAoUFdMQU5fSUVfU1NJRClzU3RhcnRBUENtZC5zc2lkOworCQlpZiAocEl0ZW1TU0lELT5sZW4gPiBXTEFOX1NTSURfTUFYTEVOICsgMSkKKwkJCXJldHVybiAtRUlOVkFMOworCQltZW1zZXQocE1nbXQtPmFieURlc2lyZVNTSUQsIDAsIFdMQU5fSUVIRFJfTEVOICsgV0xBTl9TU0lEX01BWExFTiArIDEpOworCQltZW1jcHkocE1nbXQtPmFieURlc2lyZVNTSUQsIHBJdGVtU1NJRCwgcEl0ZW1TU0lELT5sZW4gKyBXTEFOX0lFSERSX0xFTik7CisKKwkJaWYgKChzU3RhcnRBUENtZC51Q2hhbm5lbCA+IDApICYmIChzU3RhcnRBUENtZC51Q2hhbm5lbCA8PSAxNCkpCisJCQlwRGV2aWNlLT51Q2hhbm5lbCA9IHNTdGFydEFQQ21kLnVDaGFubmVsOworCisJCWlmICgoc1N0YXJ0QVBDbWQudUJlYWNvbkludCA+PSAyMCkgJiYgKHNTdGFydEFQQ21kLnVCZWFjb25JbnQgPD0gMTAwMCkpCisJCQlwTWdtdC0+d0lCU1NCZWFjb25QZXJpb2QgPSBzU3RhcnRBUENtZC51QmVhY29uSW50OworCQllbHNlCisJCQlwTWdtdC0+d0lCU1NCZWFjb25QZXJpb2QgPSAxMDA7CisKKwkJaWYgKHNTdGFydEFQQ21kLmJTaGFyZUtleUF1dGggPT0gdHJ1ZSkgeworCQkJcE1nbXQtPmJTaGFyZUtleUFsZ29yaXRobSA9IHRydWU7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJTaGFyZSBLZXlcbiIpOworCQl9IGVsc2UgeworCQkJcE1nbXQtPmJTaGFyZUtleUFsZ29yaXRobSA9IGZhbHNlOworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiT3BlbiBTeXN0ZW1cbiIpOworCQl9CisJCW1lbWNweShwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlcywgYWJ5U3VwcFJhdGVzLCA2KTsKKworCQlpZiAoc1N0YXJ0QVBDbWQuYnlCYXNpY1JhdGUgJiBCSVQzKSB7CisJCQlwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlc1syXSB8PSBCSVQ3OworCQkJcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbM10gfD0gQklUNzsKKwkJCXBNZ210LT5hYnlJQlNTU3VwcFJhdGVzWzRdIHw9IEJJVDc7CisJCQlwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlc1s1XSB8PSBCSVQ3OworCQl9IGVsc2UgaWYgKHNTdGFydEFQQ21kLmJ5QmFzaWNSYXRlICYgQklUMikgeworCQkJcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbMl0gfD0gQklUNzsKKwkJCXBNZ210LT5hYnlJQlNTU3VwcFJhdGVzWzNdIHw9IEJJVDc7CisJCQlwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlc1s0XSB8PSBCSVQ3OworCQl9IGVsc2UgaWYgKHNTdGFydEFQQ21kLmJ5QmFzaWNSYXRlICYgQklUMSkgeworCQkJcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbMl0gfD0gQklUNzsKKwkJCXBNZ210LT5hYnlJQlNTU3VwcFJhdGVzWzNdIHw9IEJJVDc7CisJCX0gZWxzZSBpZiAoc1N0YXJ0QVBDbWQuYnlCYXNpY1JhdGUgJiBCSVQxKSB7CisJCQlwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlc1syXSB8PSBCSVQ3OworCQl9IGVsc2UgeworCQkJLyogZGVmYXVsdCAxLDJNICovCisJCQlwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlc1syXSB8PSBCSVQ3OworCQkJcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbM10gfD0gQklUNzsKKwkJfQorCisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIlN1cHBvcnQgUmF0ZT0gJXggJXggJXggJXhcbiIsCisJCQlwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlc1syXSwKKwkJCXBNZ210LT5hYnlJQlNTU3VwcFJhdGVzWzNdLAorCQkJcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbNF0sCisJCQlwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlc1s1XSk7CisKKwkJbmV0aWZfc3RvcF9xdWV1ZShwRGV2aWNlLT5kZXYpOworCQlzcGluX2xvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKKwkJYlNjaGVkdWxlQ29tbWFuZCgodm9pZCAqKXBEZXZpY2UsIFdMQU5fQ01EX1JVTl9BUCwgTlVMTCk7CisJCXNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7CisJCWJyZWFrOworCisJY2FzZSBXTEFOX0NNRF9HRVRfTk9ERV9DTlQ6CisJCWNiTGlzdENvdW50ID0gMDsKKwkJcE5vZGUgPSAmKHBNZ210LT5zTm9kZURCVGFibGVbMF0pOworCQlmb3IgKGlpID0gMDsgaWkgPCAoTUFYX05PREVfTlVNICsgMSk7IGlpKyspIHsKKwkJCXBOb2RlID0gJihwTWdtdC0+c05vZGVEQlRhYmxlW2lpXSk7CisJCQlpZiAoIXBOb2RlLT5iQWN0aXZlKQorCQkJCWNvbnRpbnVlOworCQkJY2JMaXN0Q291bnQrKzsKKwkJfQorCisJCXNOb2RlTGlzdC51SXRlbSA9IGNiTGlzdENvdW50OworCQlpZiAoY29weV90b191c2VyKHBSZXEtPmRhdGEsICZzTm9kZUxpc3QsIHNpemVvZihTTm9kZUxpc3QpKSkgeworCQkJcmVzdWx0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXBSZXEtPndSZXN1bHQgPSAwOworCQlicmVhazsKKworCWNhc2UgV0xBTl9DTURfR0VUX05PREVfTElTVDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzTm9kZUxpc3QsIHBSZXEtPmRhdGEsIHNpemVvZihTTm9kZUxpc3QpKSkgeworCQkJcmVzdWx0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXBOb2RlTGlzdCA9IChQU05vZGVMaXN0KWttYWxsb2Moc2l6ZW9mKFNOb2RlTGlzdCkgKyAoc05vZGVMaXN0LnVJdGVtICogc2l6ZW9mKFNOb2RlSXRlbSkpLCAoaW50KUdGUF9BVE9NSUMpOworCQlpZiAocE5vZGVMaXN0ID09IE5VTEwpIHsKKwkJCXJlc3VsdCA9IC1FTk9NRU07CisJCQlicmVhazsKKwkJfQorCQlwTm9kZUxpc3QtPnVJdGVtID0gc05vZGVMaXN0LnVJdGVtOworCQlwTm9kZSA9ICYocE1nbXQtPnNOb2RlREJUYWJsZVswXSk7CisJCWZvciAoaWkgPSAwLCBqaiA9IDA7IGlpIDwgKE1BWF9OT0RFX05VTSArIDEpOyBpaSsrKSB7CisJCQlwTm9kZSA9ICYocE1nbXQtPnNOb2RlREJUYWJsZVtpaV0pOworCQkJaWYgKHBOb2RlLT5iQWN0aXZlKSB7CisJCQkJcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLndBSUQgPSBwTm9kZS0+d0FJRDsKKwkJCQltZW1jcHkocE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLmFieU1BQ0FkZHIsIHBOb2RlLT5hYnlNQUNBZGRyLCBXTEFOX0FERFJfTEVOKTsKKwkJCQlwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0ud1R4RGF0YVJhdGUgPSBwTm9kZS0+d1R4RGF0YVJhdGU7CisJCQkJcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLndJbkFjdGl2ZUNvdW50ID0gKHVuc2lnbmVkIHNob3J0KXBOb2RlLT51SW5BY3RpdmVDb3VudDsKKwkJCQlwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0ud0VuUXVldWVDbnQgPSAodW5zaWduZWQgc2hvcnQpcE5vZGUtPndFblF1ZXVlQ250OworCQkJCXBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS53RmxhZ3MgPSAodW5zaWduZWQgc2hvcnQpcE5vZGUtPmR3RmxhZ3M7CisJCQkJcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLmJQV0JpdE9uID0gcE5vZGUtPmJQU0VuYWJsZTsKKwkJCQlwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0uYnlLZXlJbmRleCA9IHBOb2RlLT5ieUtleUluZGV4OworCQkJCXBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS53V2VwS2V5TGVuZ3RoID0gcE5vZGUtPnVXZXBLZXlMZW5ndGg7CisJCQkJbWVtY3B5KCYocE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLmFieVdlcEtleVswXSksICYocE5vZGUtPmFieVdlcEtleVswXSksIFdFUF9LRVlNQVhMRU4pOworCQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gImtleT0gJTIuMlg6JTIuMlg6JTIuMlg6JTIuMlg6JTIuMlhcbiIsCisJCQkJCXBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS5hYnlXZXBLZXlbMF0sCisJCQkJCXBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS5hYnlXZXBLZXlbMV0sCisJCQkJCXBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS5hYnlXZXBLZXlbMl0sCisJCQkJCXBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS5hYnlXZXBLZXlbM10sCisJCQkJCXBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS5hYnlXZXBLZXlbNF0pOworCQkJCXBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS5iSXNJbkZhbGxiYWNrID0gcE5vZGUtPmJJc0luRmFsbGJhY2s7CisJCQkJcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLnVUeEZhaWx1cmVzID0gcE5vZGUtPnVUeEZhaWx1cmVzOworCQkJCXBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS51VHhBdHRlbXB0cyA9IHBOb2RlLT51VHhBdHRlbXB0czsKKwkJCQlwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0ud0ZhaWx1cmVSYXRpbyA9ICh1bnNpZ25lZCBzaG9ydClwTm9kZS0+dUZhaWx1cmVSYXRpbzsKKwkJCQlqaisrOworCQkJCWlmIChqaiA+PSBwTm9kZUxpc3QtPnVJdGVtKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoY29weV90b191c2VyKHBSZXEtPmRhdGEsIHBOb2RlTGlzdCwgc2l6ZW9mKFNOb2RlTGlzdCkgKyAoc05vZGVMaXN0LnVJdGVtICogc2l6ZW9mKFNOb2RlSXRlbSkpKSkgeworCQkJcmVzdWx0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWtmcmVlKHBOb2RlTGlzdCk7CisJCXBSZXEtPndSZXN1bHQgPSAwOworCQlicmVhazsKKworI2lmZGVmIFdQQV9TTV9UcmFuc3RhdHVzCisJY2FzZSAweEZGOgorCQltZW1zZXQod3BhX1Jlc3VsdC5pZm5hbWUsIDAsIHNpemVvZih3cGFfUmVzdWx0LmlmbmFtZSkpOworCQl3cGFfUmVzdWx0LnByb3RvID0gMDsKKwkJd3BhX1Jlc3VsdC5rZXlfbWdtdCA9IDA7CisJCXdwYV9SZXN1bHQuZWFwX3R5cGUgPSAwOworCQl3cGFfUmVzdWx0LmF1dGhlbnRpY2F0ZWQgPSBmYWxzZTsKKwkJcERldmljZS0+ZldQQV9BdXRoZW5lZCA9IGZhbHNlOworCQlpZiAoY29weV9mcm9tX3VzZXIoJndwYV9SZXN1bHQsIHBSZXEtPmRhdGEsIHNpemVvZih3cGFfUmVzdWx0KSkpIHsKKwkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmICh3cGFfUmVzdWx0LmF1dGhlbnRpY2F0ZWQgPT0gdHJ1ZSkgeworI2lmZGVmIFNuZEV2dF9Ub0FQSQorCQkJeworCQkJCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKKworCQkJCXBJdGVtU1NJRCA9IChQV0xBTl9JRV9TU0lEKXBNZ210LT5hYnlDdXJyU1NJRDsKKworCQkJCW1lbXNldCgmd3JxdSwgMCwgc2l6ZW9mKHdycXUpKTsKKwkJCQl3cnF1LmRhdGEuZmxhZ3MgPSBSVF9XUEFDT05ORUNURURfRVZFTlRfRkxBRzsKKwkJCQl3cnF1LmRhdGEubGVuZ3RoID0gcEl0ZW1TU0lELT5sZW47CisJCQkJd2lyZWxlc3Nfc2VuZF9ldmVudChwRGV2aWNlLT5kZXYsIElXRVZDVVNUT00sICZ3cnF1LCBwSXRlbVNTSUQtPmFieVNTSUQpOworCQkJfQorI2VuZGlmCisJCQlwRGV2aWNlLT5mV1BBX0F1dGhlbmVkID0gdHJ1ZTsgLyogaXMgc3VjY2Vzc2Z1bCBwZWVyIHRvIHdwYV9SZXN1bHQuYXV0aGVudGljYXRlZD8gKi8KKwkJfQorCQlwUmVxLT53UmVzdWx0ID0gMDsKKwkJYnJlYWs7CiAjZW5kaWYKIAotICAgIGRlZmF1bHQ6Ci0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIlByaXZhdGUgY29tbWFuZCBub3Qgc3VwcG9ydC4uXG4iKTsKLSAgICB9CisJZGVmYXVsdDoKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiUHJpdmF0ZSBjb21tYW5kIG5vdCBzdXBwb3J0Li5cbiIpOworCX0KIAotICAgIHJldHVybiByZXN1bHQ7CisJcmV0dXJuIHJlc3VsdDsKIH0KLQotLyoKLXZvaWQKLXZDb25maWdXRVBLZXkgKAotICAgIFBTRGV2aWNlIHBEZXZpY2UsCi0gICAgdW5zaWduZWQgbG9uZyBkd0tleUluZGV4LAotICAgIHVuc2lnbmVkIGNoYXIgKnBieUtleSwKLSAgICB1bnNpZ25lZCBsb25nIHVLZXlMZW5ndGgKLSAgICApCi17Ci0gICAgaW50IGlpOwotCi0KLSAgICBtZW1zZXQoJnBEZXZpY2UtPmFieVdlcEtleVtkd0tleUluZGV4XVswXSwgMCwgV0xBTl9XRVBNQVhfS0VZTEVOKTsKLSAgICBtZW1jcHkoJnBEZXZpY2UtPmFieVdlcEtleVtkd0tleUluZGV4XVswXSwgcGJ5S2V5LCB1S2V5TGVuZ3RoKTsKLQotICAgIHBEZXZpY2UtPmJXZXBLZXlBdmFpbGFibGVbZHdLZXlJbmRleF0gPSB0cnVlOwotICAgIHBEZXZpY2UtPmF1V2VwS2V5TGVuZ3RoW2R3S2V5SW5kZXhdID0gdUtleUxlbmd0aDsKLQotICAgIE1BQ3ZTZXREZWZhdWx0S2V5RW50cnkocERldmljZS0+UG9ydE9mZnNldCwgdUtleUxlbmd0aCwgZHdLZXlJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nICopICYocERldmljZS0+YWJ5V2VwS2V5W2R3S2V5SW5kZXhdWzBdKSwgcERldmljZS0+YnlMb2NhbElEKTsKLQotICAgIGlmIChwRGV2aWNlLT5lRW5jcnlwdGlvblN0YXR1cyA8IE5kaXM4MDJfMTFFbmNyeXB0aW9uTm90U3VwcG9ydGVkKSB7Ci0gICAgICAgIGZvcihpaT0wOyBpaTxNQVhfR1JPVVBfS0VZOyBpaSsrKSB7Ci0gICAgICAgICAgICBpZiAoKHBEZXZpY2UtPmJXZXBLZXlBdmFpbGFibGVbaWldID09IHRydWUpICYmCi0gICAgICAgICAgICAgICAgKHBEZXZpY2UtPmF1V2VwS2V5TGVuZ3RoW2lpXSA9PSBXTEFOX1dFUDIzMl9LRVlMRU4pKSB7Ci0gICAgICAgICAgICAgICAgcERldmljZS0+dUN1cnJlbnRXRVBNb2RlID0gVFhfV0VQX1NXMjMyOwotICAgICAgICAgICAgICAgIE1BQ3ZEaXNhYmxlRGVmYXVsdEtleShwRGV2aWNlLT5Qb3J0T2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoKGlpID09IE1BWF9HUk9VUF9LRVkpICYmCi0gICAgICAgICAgICAocERldmljZS0+ZUVuY3J5cHRpb25TdGF0dXMgPCBOZGlzODAyXzExRW5jcnlwdGlvbk5vdFN1cHBvcnRlZCkpIHsKLSAgICAgICAgICAgIE1BQ3ZFbmFibGVEZWZhdWx0S2V5KHBEZXZpY2UtPlBvcnRPZmZzZXQsIHBEZXZpY2UtPmJ5TG9jYWxJRCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0qLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93bWdyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dtZ3IuYwppbmRleCBhYjI4OWMzLi5jNDZkNTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dtZ3IuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dtZ3IuYwpAQCAtMjUyMSwxNCArMjUyMSw4IEBACiAgICAgaWYgKHBNZ210LT5lQ3Vyck1vZGUgPT0gV01BQ19NT0RFX0VTU19BUCkgewogICAgICAgICAvLyBBUCBtb2RlIEJTU0lEID0gTUFDIGFkZHIKICAgICAgICAgbWVtY3B5KHBNZ210LT5hYnlDdXJyQlNTSUQsIHBNZ210LT5hYnlNQUNBZGRyLCBXTEFOX0FERFJfTEVOKTsKLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfSU5GTywgS0VSTl9JTkZPIkFQIGJlYWNvbiBjcmVhdGVkIEJTU0lEOiUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4IFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzBdLAotICAgICAgICAgICAgICAgICAgICAgIHBNZ210LT5hYnlDdXJyQlNTSURbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPmFieUN1cnJCU1NJRFsyXSwKLSAgICAgICAgICAgICAgICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzNdLAotICAgICAgICAgICAgICAgICAgICAgIHBNZ210LT5hYnlDdXJyQlNTSURbNF0sCi0gICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPmFieUN1cnJCU1NJRFs1XQotICAgICAgICAgICAgICAgICAgICApOworCURCR19QUlQoTVNHX0xFVkVMX0lORk8sIEtFUk5fSU5GTyJBUCBiZWFjb24gY3JlYXRlZCBCU1NJRDolcE1cbiIsCisJCXBNZ210LT5hYnlDdXJyQlNTSUQpOwogICAgIH0KIAogICAgIGlmIChwTWdtdC0+ZUN1cnJNb2RlID09IFdNQUNfTU9ERV9JQlNTX1NUQSkgewpAQCAtMjU1MCwxNCArMjU0NCw4IEBACiAgICAgICAgIHBNZ210LT5hYnlDdXJyQlNTSURbMF0gfD0gSUVFRV9BRERSX1VOSVZFUlNBTDsKIAogCi0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0lORk8sIEtFUk5fSU5GTyJBZGhvYyBiZWFjb24gY3JlYXRlZCBic3NpZDolMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeCBcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPmFieUN1cnJCU1NJRFswXSwKLSAgICAgICAgICAgICAgICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzFdLAotICAgICAgICAgICAgICAgICAgICAgIHBNZ210LT5hYnlDdXJyQlNTSURbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPmFieUN1cnJCU1NJRFszXSwKLSAgICAgICAgICAgICAgICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzRdLAotICAgICAgICAgICAgICAgICAgICAgIHBNZ210LT5hYnlDdXJyQlNTSURbNV0KLSAgICAgICAgICAgICAgICAgICAgKTsKKwlEQkdfUFJUKE1TR19MRVZFTF9JTkZPLCBLRVJOX0lORk8iQWRob2MgYmVhY29uIGNyZWF0ZWQgYnNzaWQ6JXBNXG4iLAorCQlwTWdtdC0+YWJ5Q3VyckJTU0lEKTsKICAgICB9CiAKICAgICAvLyBTZXQgQ2FwYWJpbGl0eSBJbmZvCkBAIC0yODg3LDE0ICsyODc1LDggQEAKIC8vICAgICAgICAgICAgcERldmljZS0+YkxpbmtQYXNzID0gdHJ1ZTsKIC8vICAgICAgICAgICAgbWVtY3B5KHBEZXZpY2UtPmFieUJTU0lELCBwQ3Vyci0+YWJ5QlNTSUQsIFdMQU5fQlNTSURfTEVOKTsKIAotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJKb2luIElCU1Mgb2s6JTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMnggXG4iLAotICAgICAgICAgICAgICAgICAgcE1nbXQtPmFieUN1cnJCU1NJRFswXSwKLSAgICAgICAgICAgICAgICAgIHBNZ210LT5hYnlDdXJyQlNTSURbMV0sCi0gICAgICAgICAgICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzJdLAotICAgICAgICAgICAgICAgICAgcE1nbXQtPmFieUN1cnJCU1NJRFszXSwKLSAgICAgICAgICAgICAgICAgIHBNZ210LT5hYnlDdXJyQlNTSURbNF0sCi0gICAgICAgICAgICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzVdCi0gICAgICAgICAgICAgICAgKTsKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJKb2luIElCU1Mgb2s6JXBNXG4iLAorCQkJcE1nbXQtPmFieUN1cnJCU1NJRCk7CiAgICAgICAgICAgICAvLyBQcmVhbWJsZSB0eXBlIGF1dG8tc3dpdGNoOiBpZiBBUCBjYW4gcmVjZWl2ZSBzaG9ydC1wcmVhbWJsZSBjYXAsCiAgICAgICAgICAgICAvLyBhbmQgaWYgcmVnaXN0cnkgc2V0dGluZyBpcyBzaG9ydCBwcmVhbWJsZSB3ZSBjYW4gdHVybiBvbiB0b28uCiAKQEAgLTI5ODQsMTMgKzI5NjYsOCBAQAogCiAgICAgTUFDdlJlYWRCU1NJREFkZHJlc3MocERldmljZS0+UG9ydE9mZnNldCwgcE1nbXQtPmFieUN1cnJCU1NJRCk7CiAKLSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJTeW5jOnNldCBDdXJyQlNTSUQgYWRkcmVzcyA9ICUwMngtJTAyeC0lMDJ4PSUwMngtJTAyeC0lMDJ4XG4iLAotICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzBdLAotICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzFdLAotICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzJdLAotICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzNdLAotICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzRdLAotICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzVdKTsKKwlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJTeW5jOnNldCBDdXJyQlNTSUQgYWRkcmVzcyA9ICIKKwkJIiVwTVxuIiwgcE1nbXQtPmFieUN1cnJCU1NJRCk7CiAKICAgICBpZiAocEN1cnItPmVOZXR3b3JrVHlwZUluVXNlID09IFBIWV9UWVBFXzExQSkgewogICAgICAgICBpZiAoKHBNZ210LT5lQ29uZmlnUEhZTW9kZSA9PSBQSFlfVFlQRV8xMUEpIHx8CkBAIC00NDYyLDE0ICs0NDM5LDggQEAKICAgICAgICAgc0ZyYW1lLnBCdWYgPSAodW5zaWduZWQgY2hhciAqKXBSeFBhY2tldC0+cDgwMjExSGVhZGVyOwogICAgICAgICB2TWdyRGVjb2RlUHJvYmVSZXF1ZXN0KCZzRnJhbWUpOwogLyoKLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiUHJvYmUgcmVxdWVzdCByeDpNQUMgYWRkcjolMDJ4LSUwMngtJTAyeD0lMDJ4LSUwMngtJTAyeCBcbiIsCi0gICAgICAgICAgICAgICAgICBzRnJhbWUucEhkci0+c0EzLmFieUFkZHIyWzBdLAotICAgICAgICAgICAgICAgICAgc0ZyYW1lLnBIZHItPnNBMy5hYnlBZGRyMlsxXSwKLSAgICAgICAgICAgICAgICAgIHNGcmFtZS5wSGRyLT5zQTMuYWJ5QWRkcjJbMl0sCi0gICAgICAgICAgICAgICAgICBzRnJhbWUucEhkci0+c0EzLmFieUFkZHIyWzNdLAotICAgICAgICAgICAgICAgICAgc0ZyYW1lLnBIZHItPnNBMy5hYnlBZGRyMls0XSwKLSAgICAgICAgICAgICAgICAgIHNGcmFtZS5wSGRyLT5zQTMuYWJ5QWRkcjJbNV0KLSAgICAgICAgICAgICAgICApOworCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIlByb2JlIHJlcXVlc3Qgcng6TUFDIGFkZHI6JXBNXG4iLAorCQlzRnJhbWUucEhkci0+c0EzLmFieUFkZHIyKTsKICovCiAgICAgICAgIGlmIChzRnJhbWUucFNTSUQtPmxlbiAhPSAwKSB7CiAgICAgICAgICAgICBpZiAoc0ZyYW1lLnBTU0lELT5sZW4gIT0gKChQV0xBTl9JRV9TU0lEKXBNZ210LT5hYnlDdXJyU1NJRCktPmxlbikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3BhY3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3dwYWN0bC5jCmluZGV4IGEwZjk5NGUuLjczMmJhODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvd3BhY3RsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS93cGFjdGwuYwpAQCAtMjEzLDcgKzIxMyw5IEBACiAJaW50IHV1LCBpaTsKIAogCi0JaWYgKHBhcmFtLT51LndwYV9rZXkuYWxnX25hbWUgPiBXUEFfQUxHX0NDTVApCisJaWYgKHBhcmFtLT51LndwYV9rZXkuYWxnX25hbWUgPiBXUEFfQUxHX0NDTVAgfHwKKwkJCXBhcmFtLT51LndwYV9rZXkua2V5X2xlbiA+PSBNQVhfS0VZX0xFTiB8fAorCQkJcGFyYW0tPnUud3BhX2tleS5zZXFfbGVuID49IE1BWF9LRVlfTEVOKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gInBhcmFtLT51LndwYV9rZXkuYWxnX25hbWUgPSAlZCBcbiIsIHBhcmFtLT51LndwYV9rZXkuYWxnX25hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kcGMuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZHBjLmMKaW5kZXggY2I4MTdjZS4uYzBlZGY5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9kcGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2RwYy5jCkBAIC0xMTA5LDMwICsxMTA5LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU3RhdHVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJkcGM6IHNlbmQgdk1nckRlQXV0aGVuQmVnaW5TdGEgM1xuIik7Ci0gICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkJTU0lEOiUwMngtJTAyeC0lMDJ4PSUwMngtJTAyeC0lMDJ4IFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDgwMl8xMUhlYWRlci0+YWJ5QWRkcjNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA4MDJfMTFIZWFkZXItPmFieUFkZHIzWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwODAyXzExSGVhZGVyLT5hYnlBZGRyM1syXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDgwMl8xMUhlYWRlci0+YWJ5QWRkcjNbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA4MDJfMTFIZWFkZXItPmFieUFkZHIzWzRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwODAyXzExSGVhZGVyLT5hYnlBZGRyM1s1XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkFERFIyOiUwMngtJTAyeC0lMDJ4PSUwMngtJTAyeC0lMDJ4IFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDgwMl8xMUhlYWRlci0+YWJ5QWRkcjJbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA4MDJfMTFIZWFkZXItPmFieUFkZHIyWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwODAyXzExSGVhZGVyLT5hYnlBZGRyMlsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDgwMl8xMUhlYWRlci0+YWJ5QWRkcjJbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA4MDJfMTFIZWFkZXItPmFieUFkZHIyWzRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwODAyXzExSGVhZGVyLT5hYnlBZGRyMls1XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkFERFIxOiUwMngtJTAyeC0lMDJ4PSUwMngtJTAyeC0lMDJ4IFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDgwMl8xMUhlYWRlci0+YWJ5QWRkcjFbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA4MDJfMTFIZWFkZXItPmFieUFkZHIxWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwODAyXzExSGVhZGVyLT5hYnlBZGRyMVsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDgwMl8xMUhlYWRlci0+YWJ5QWRkcjFbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHA4MDJfMTFIZWFkZXItPmFieUFkZHIxWzRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwODAyXzExSGVhZGVyLT5hYnlBZGRyMVs1XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJCU1NJRDolcE1cbiIsCisJCQkJcDgwMl8xMUhlYWRlci0+YWJ5QWRkcjMpOworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiQUREUjI6JXBNXG4iLAorCQkJCXA4MDJfMTFIZWFkZXItPmFieUFkZHIyKTsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkFERFIxOiVwTVxuIiwKKwkJCQlwODAyXzExSGVhZGVyLT5hYnlBZGRyMSk7CiAgICAgICAgICAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gImRwYzogd0ZyYW1lQ3RsPSAleFxuIiwgcDgwMl8xMUhlYWRlci0+d0ZyYW1lQ3RsICk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pb2N0bC5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9pb2N0bC5jCmluZGV4IGNmZTljOTUuLjQ5MzkwMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvaW9jdGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2lvY3RsLmMKQEAgLTQwLDY2NSArNDAsNjAzIEBACiAjaW5jbHVkZSAicm5kaXMuaCIKICNpbmNsdWRlICJyZi5oIgogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIERlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworU1dQQVJlc3VsdCB3cGFfUmVzdWx0Oworc3RhdGljIGludCBtc2dsZXZlbCA9IE1TR19MRVZFTF9JTkZPOwogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIENsYXNzZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworaW50IHByaXZhdGVfaW9jdGwoUFNEZXZpY2UgcERldmljZSwgc3RydWN0IGlmcmVxICpycSkKK3sKIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIFN0YXRpYyBWYXJpYWJsZXMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8vc3RhdGljIGludCAgICAgICAgICBtc2dsZXZlbCAgICAgICAgICAgICAgICA9TVNHX0xFVkVMX0RFQlVHOwotc3RhdGljIGludCAgICAgICAgICBtc2dsZXZlbCAgICAgICAgICAgICAgICA9TVNHX0xFVkVMX0lORk87Ci0KLSAgICBTV1BBUmVzdWx0IHdwYV9SZXN1bHQ7Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBTdGF0aWMgRnVuY3Rpb25zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBFeHBvcnQgVmFyaWFibGVzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLWludCBwcml2YXRlX2lvY3RsKFBTRGV2aWNlIHBEZXZpY2UsIHN0cnVjdCBpZnJlcSAqcnEpIHsKLQotCVBTQ21kUmVxdWVzdCAgICAgICAgcFJlcSA9IChQU0NtZFJlcXVlc3QpcnE7Ci0gICAgUFNNZ210T2JqZWN0ICAgICAgICBwTWdtdCA9ICYocERldmljZS0+c01nbXRPYmopOwotCWludCAJCSAgICAgICAgcmVzdWx0ID0gMDsKLSAgICBQV0xBTl9JRV9TU0lEICAgICAgIHBJdGVtU1NJRDsKLSAgICBTQ21kQlNTSm9pbiAgICAgICAgIHNKb2luQ21kOwotICAgIFNDbWRab25lVHlwZVNldCBzWm9uZVR5cGVDbWQ7Ci0gICAgU0NtZFNjYW4gICAgICAgICAgICBzU2NhbkNtZDsKLSAgICBTQ21kU3RhcnRBUCAgICAgICAgIHNTdGFydEFQQ21kOwotICAgIFNDbWRTZXRXRVAgICAgICAgICAgc1dFUENtZDsKLSAgICBTQ21kVmFsdWUgICAgICAgICAgIHNWYWx1ZTsKLSAgICBTQlNTSURMaXN0ICAgICAgICAgIHNMaXN0OwotICAgIFNOb2RlTGlzdCAgICAgICAgICAgc05vZGVMaXN0OwotICAgIFBTQlNTSURMaXN0ICAgICAgICAgcExpc3Q7Ci0gICAgUFNOb2RlTGlzdCAgICAgICAgICBwTm9kZUxpc3Q7Ci0gICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgIGNiTGlzdENvdW50OwotICAgIFBLbm93bkJTUyAgICAgICAgICAgcEJTUzsKLSAgICBQS25vd25Ob2RlREIgICAgICAgIHBOb2RlOwotICAgIHVuc2lnbmVkIGludCAgICAgICAgICAgICAgICBpaSwgamo7Ci0gICAgU0NtZExpbmtTdGF0dXMgICAgICBzTGlua1N0YXR1czsKLSAgICBCWVRFICAgICAgICAgICAgICAgIGFieVN1cHBSYXRlc1tdID0ge1dMQU5fRUlEX1NVUFBfUkFURVMsIDQsIDB4MDIsIDB4MDQsIDB4MEIsIDB4MTZ9OwotICAgIEJZVEUgICAgICAgICAgICAgICAgYWJ5TnVsbEFkZHJbXSA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKLSAgICBEV09SRCAgICAgICAgICAgICAgIGR3S2V5SW5kZXg9IDA7Ci0gICAgQllURSAgICAgICAgICAgICAgICBhYnlTY2FuU1NJRFtXTEFOX0lFSERSX0xFTiArIFdMQU5fU1NJRF9NQVhMRU4gKyAxXTsKLSAgICBzaWduZWQgbG9uZyAgICAgICAgICAgICAgICBsZEJtOwotCi0gICAgcFJlcS0+d1Jlc3VsdCA9IDA7Ci0KLSAgICBzd2l0Y2gocFJlcS0+d0NtZENvZGUpIHsKLQotICAgIGNhc2UgV0xBTl9DTURfQlNTX1NDQU46Ci0KLSAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZzU2NhbkNtZCwgcFJlcS0+ZGF0YSwgc2l6ZW9mKFNDbWRTY2FuKSkpIHsKLQkJCXJlc3VsdCA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0gICAgICAgIHBJdGVtU1NJRCA9IChQV0xBTl9JRV9TU0lEKXNTY2FuQ21kLnNzaWQ7Ci0gICAgICAgIGlmIChwSXRlbVNTSUQtPmxlbiAhPSAwKSB7Ci0gICAgICAgICAgICBtZW1zZXQoYWJ5U2NhblNTSUQsIDAsIFdMQU5fSUVIRFJfTEVOICsgV0xBTl9TU0lEX01BWExFTiArIDEpOwotICAgICAgICAgICAgbWVtY3B5KGFieVNjYW5TU0lELCBwSXRlbVNTSUQsIHBJdGVtU1NJRC0+bGVuICsgV0xBTl9JRUhEUl9MRU4pOwotICAgICAgICB9Ci0gICAgICAgIHNwaW5fbG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotCi0JaWYgKG1lbWNtcChwTWdtdC0+YWJ5Q3VyckJTU0lELCAmYWJ5TnVsbEFkZHJbMF0sIDYpID09IDApCi0JCUJTU3ZDbGVhckJTU0xpc3QoKHZvaWQgKikgcERldmljZSwgRkFMU0UpOwotCWVsc2UKLQkJQlNTdkNsZWFyQlNTTGlzdCgodm9pZCAqKSBwRGV2aWNlLCBwRGV2aWNlLT5iTGlua1Bhc3MpOwotCi0JREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfQlNTX1NDQU4uLmJlZ2luXG4iKTsKLQotCWlmIChwSXRlbVNTSUQtPmxlbiAhPSAwKQotCQliU2NoZWR1bGVDb21tYW5kKCh2b2lkICopIHBEZXZpY2UsCi0JCQkJIFdMQU5fQ01EX0JTU0lEX1NDQU4sCi0JCQkJIGFieVNjYW5TU0lEKTsKLQllbHNlCi0JCWJTY2hlZHVsZUNvbW1hbmQoKHZvaWQgKikgcERldmljZSwgV0xBTl9DTURfQlNTSURfU0NBTiwgTlVMTCk7Ci0KLSAgICAgICAgc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFdMQU5fQ01EX1pPTkVUWVBFX1NFVDoKLQkvL21pa2UgYWRkIDpjYW5uJ3Qgc3VwcG9ydC4KLSAgICAgICAgICAgcmVzdWx0PS1FT1BOT1RTVVBQOwotCSAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZzWm9uZVR5cGVDbWQsIHBSZXEtPmRhdGEsIHNpemVvZihTQ21kWm9uZVR5cGVTZXQpKSkgewotCQkJcmVzdWx0ID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLSAgICAgICAgICBpZihzWm9uZVR5cGVDbWQuYldyaXRlPT1UUlVFKSB7Ci0JICAvLy8vLy93cml0ZSB6b25ldHlwZQotICAgICAgICAgICAgICAgIGlmKHNab25lVHlwZUNtZC5ab25lVHlwZSA9PSBab25lVHlwZV9VU0EpIHsKLSAgICAgICAgICAgICAgICAgIC8vc2V0IHRvIFVTQQotICAgICAgICAgICAgICAgICAgIHByaW50aygic2V0X1pvbmVUeXBlOlVTQVxuIik7Ci0JCX0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKHNab25lVHlwZUNtZC5ab25lVHlwZSA9PSBab25lVHlwZV9KYXBhbikgewotICAgICAgICAgICAgICAgICAgLy9zZXQgdG8gSmFwYW4KLSAgICAgICAgICAgICAgICAgIHByaW50aygic2V0X1pvbmVUeXBlOkphcGFuXG4iKTsKLQkJfQotCSAgICAgICBlbHNlIGlmKHNab25lVHlwZUNtZC5ab25lVHlwZSA9PSBab25lVHlwZV9FdXJvcGUpIHsKLSAgICAgICAgICAgICAgICAgIC8vc2V0IHRvIEV1cm9wZQotICAgICAgICAgICAgICAgICAgcHJpbnRrKCJzZXRfWm9uZVR5cGU6RXVyb3BlXG4iKTsKLQkJfQotICAgICAgICAgICAgfQotCWVsc2UgewotICAgICAgICAgIC8vLy8vLy9yZWFkIHpvbmV0eXBlCi0JICBCWVRFICAgICAgICAgICAgICAgICAgICAgICB6b25ldHlwZT0wOwotCi0KLSAgICAgICAgICAgaWYoem9uZXR5cGUgPT0gMHgwMCkgIHsgLy9VU0EKLSAgICAgICAgICAgICBzWm9uZVR5cGVDbWQuWm9uZVR5cGUgPSBab25lVHlwZV9VU0E7Ci0gICAgICAgICAgIH0KLQkgZWxzZSBpZih6b25ldHlwZSA9PSAweDAxKSB7IC8vSmFwYW4KLSAgICAgICAgICAgICBzWm9uZVR5cGVDbWQuWm9uZVR5cGUgPSBab25lVHlwZV9KYXBhbjsKLQkgIH0KLQkgZWxzZSBpZih6b25ldHlwZSA9PSAweDAyKSB7IC8vRXVyb3BlCi0gICAgICAgICAgICAgc1pvbmVUeXBlQ21kLlpvbmVUeXBlID0gWm9uZVR5cGVfRXVyb3BlOwotCSB9Ci0JIGVsc2UgeyAvL1Vua25vd24gWm9uZVR5cGUKLQkgICAgICAgIHByaW50aygiRXJyb3I6Wm9uZVR5cGVbJXhdIFVua25vd24gPz8/XG4iLHpvbmV0eXBlKTsKLQkgICAgICAgICByZXN1bHQgPSAtRUZBVUxUOwotCQlicmVhazsKLQkgfQotCSAgIGlmIChjb3B5X3RvX3VzZXIocFJlcS0+ZGF0YSwgJnNab25lVHlwZUNtZCwgc2l6ZW9mKFNDbWRab25lVHlwZVNldCkpKSB7Ci0JCQlyZXN1bHQgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkgICAgIGJyZWFrOwotCi0gICAgY2FzZSBXTEFOX0NNRF9CU1NfSk9JTjoKLQotICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJnNKb2luQ21kLCBwUmVxLT5kYXRhLCBzaXplb2YoU0NtZEJTU0pvaW4pKSkgewotCQkJcmVzdWx0ID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0KLSAgICAgICAgcEl0ZW1TU0lEID0gKFBXTEFOX0lFX1NTSUQpc0pvaW5DbWQuc3NpZDsKLSAgICAgICAgbWVtc2V0KHBNZ210LT5hYnlEZXNpcmVTU0lELCAwLCBXTEFOX0lFSERSX0xFTiArIFdMQU5fU1NJRF9NQVhMRU4gKyAxKTsKLQkJbWVtY3B5KHBNZ210LT5hYnlEZXNpcmVTU0lELCBwSXRlbVNTSUQsIHBJdGVtU1NJRC0+bGVuICsgV0xBTl9JRUhEUl9MRU4pOwotCSAgICBpZiAoc0pvaW5DbWQud0JTU1R5cGUgPT0gQURIT0MpIHsKLQkgICAgICAgIHBNZ210LT5lQ29uZmlnTW9kZSA9IFdNQUNfQ09ORklHX0lCU1NfU1RBOwotCSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiaW9jdCBzZXQgdG8gYWRob2MgbW9kZVxuIik7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JICAgICAgICBwTWdtdC0+ZUNvbmZpZ01vZGUgPSBXTUFDX0NPTkZJR19FU1NfU1RBOwotCSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiaW9jdCBzZXQgdG8gU1RBIG1vZGVcbiIpOwotCSAgICB9Ci0JICAgIGlmIChzSm9pbkNtZC5iUFNFbmFibGUgPT0gVFJVRSkgewotICAgICAgICAgICAgcERldmljZS0+ZVBTTW9kZSA9IFdNQUNfUE9XRVJfRkFTVDsKLS8vICAgICAgICAgICAgcERldmljZS0+ZVBTTW9kZSA9IFdNQUNfUE9XRVJfTUFYOwotICAgICAgICAgICAgcE1nbXQtPndMaXN0ZW5JbnRlcnZhbCA9IDI7Ci0gICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJQb3dlciBTYXZpbmcgT25cbiIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcERldmljZS0+ZVBTTW9kZSA9IFdNQUNfUE9XRVJfQ0FNOwotICAgICAgICAgICAgcE1nbXQtPndMaXN0ZW5JbnRlcnZhbCA9IDE7Ci0gICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJQb3dlciBTYXZpbmcgT2ZmIFxuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc0pvaW5DbWQuYlNoYXJlS2V5QXV0aCA9PSBUUlVFKXsKLSAgICAgICAgICAgIHBNZ210LT5iU2hhcmVLZXlBbGdvcml0aG0gPSBUUlVFOwotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiU2hhcmUgS2V5IFxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwTWdtdC0+YlNoYXJlS2V5QWxnb3JpdGhtID0gRkFMU0U7Ci0gICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJPcGVuIFN5c3RlbSBcbiIpOwotICAgICAgICB9Ci0JICAgIHBEZXZpY2UtPnVDaGFubmVsID0gc0pvaW5DbWQudUNoYW5uZWw7Ci0gICAgICAgIG5ldGlmX3N0b3BfcXVldWUocERldmljZS0+ZGV2KTsKLSAgICAgICAgc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0gICAgICAgIHBNZ210LT5lQ3VyclN0YXRlID0gV01BQ19TVEFURV9JRExFOwotCWJTY2hlZHVsZUNvbW1hbmQoKHZvaWQgKikgcERldmljZSwKLQkJCSBXTEFOX0NNRF9CU1NJRF9TQ0FOLAotCQkJIHBNZ210LT5hYnlEZXNpcmVTU0lEKTsKLQliU2NoZWR1bGVDb21tYW5kKCh2b2lkICopIHBEZXZpY2UsIFdMQU5fQ01EX1NTSUQsIE5VTEwpOwotICAgICAgICBzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgV0xBTl9DTURfU0VUX1dFUDoKLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfU0VUX1dFUCBLZXkuIFxuIik7Ci0gICAgICAgIG1lbXNldCgmc1dFUENtZCwgMCAsc2l6ZW9mKFNDbWRTZXRXRVApKTsKLSAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZzV0VQQ21kLCBwUmVxLT5kYXRhLCBzaXplb2YoU0NtZFNldFdFUCkpKSB7Ci0JCQlyZXN1bHQgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQkgICAgaWYgKHNXRVBDbWQuYkVuYWJsZVdlcCAhPSBUUlVFKSB7Ci0JICAgICAgICBpbnQgdXU7Ci0KLSAgICAgICAgICAgIHBEZXZpY2UtPmJFbmNyeXB0aW9uRW5hYmxlID0gRkFMU0U7Ci0gICAgICAgICAgICBwRGV2aWNlLT5lRW5jcnlwdGlvblN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7Ci0gICAgICAgICAgICBzcGluX2xvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKLQkgICAgZm9yICh1dSA9IDA7IHV1IDwgTUFYX0tFWV9UQUJMRTsgdXUrKykKLQkJTUFDdkRpc2FibGVLZXlFbnRyeShwRGV2aWNlLCB1dSk7Ci0gICAgICAgICAgICBzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotCSAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJXRVAgZnVuY3Rpb24gZGlzYWJsZS5cbiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBXTEFOX1dFUF9OS0VZUzsgaWkgKyspIHsKLSAgICAgICAgICAgIGlmIChzV0VQQ21kLmJXZXBLZXlBdmFpbGFibGVbaWldKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlpID09IHNXRVBDbWQuYnlLZXlJbmRleCkKLS8vMjAwNi0xMjA3LTAxPE1vZGlmeT5ieSBFaW5zbiBMaXUKLS8vCQkgICAgZHdLZXlJbmRleHw9ICgxIDw8IDMxKTsKLSAgICAgICAgICAgICAgICAgICAgZHdLZXlJbmRleD1paXwoMSA8PCAzMSk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBkd0tleUluZGV4ID0gaWk7Ci0gICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0gICAgICAgICAgICAgICAgS2V5YlNldERlZmF1bHRLZXkoICBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwRGV2aWNlLT5zS2V5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3S2V5SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzV0VQQ21kLmF1V2VwS2V5TGVuZ3RoW2lpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUEJZVEUpJnNXRVBDbWQuYWJ5V2VwS2V5W2lpXVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9DVExfV0VQCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwRGV2aWNlLT5ieUtleUluZGV4ID0gc1dFUENtZC5ieUtleUluZGV4OwotICAgICAgICBwRGV2aWNlLT5iVHJhbnNtaXRLZXkgPSBUUlVFOwotICAgICAgICBwRGV2aWNlLT5iRW5jcnlwdGlvbkVuYWJsZSA9IFRSVUU7Ci0gICAgICAgIHBEZXZpY2UtPmVFbmNyeXB0aW9uU3RhdHVzID0gTmRpczgwMl8xMUVuY3J5cHRpb24xRW5hYmxlZDsKLQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgV0xBTl9DTURfR0VUX0xJTks6Ci0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIldMQU5fQ01EX0dFVF9MSU5LIHN0YXR1cy4gXG4iKTsKLQotICAgICAgICBtZW1zZXQoc0xpbmtTdGF0dXMuYWJ5U1NJRCwgMCAsIFdMQU5fU1NJRF9NQVhMRU4gKyAxKTsKLQotICAgICAgICBpZiAocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfSUJTU19TVEEpCi0gICAgICAgICAgICBzTGlua1N0YXR1cy53QlNTVHlwZSA9IEFESE9DOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzTGlua1N0YXR1cy53QlNTVHlwZSA9IElORlJBOwotCi0gICAgICAgIGlmIChwTWdtdC0+ZUN1cnJTdGF0ZSA9PSBXTUFDX1NUQVRFX0pPSU5URUQpCi0gICAgICAgICAgICBzTGlua1N0YXR1cy5ieVN0YXRlID0gQURIT0NfSk9JTlRFRDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc0xpbmtTdGF0dXMuYnlTdGF0ZSA9IEFESE9DX1NUQVJURUQ7Ci0KLSAgICAgICAgc0xpbmtTdGF0dXMudUNoYW5uZWwgPSBwTWdtdC0+dUN1cnJDaGFubmVsOwotICAgICAgICBpZiAocERldmljZS0+YkxpbmtQYXNzID09IFRSVUUpIHsKLSAgICAgICAgICAgIHNMaW5rU3RhdHVzLmJMaW5rID0gVFJVRTsKLSAJCSAgICBwSXRlbVNTSUQgPSAoUFdMQU5fSUVfU1NJRClwTWdtdC0+YWJ5Q3VyclNTSUQ7Ci0JCSAgICBtZW1jcHkoc0xpbmtTdGF0dXMuYWJ5U1NJRCwgcEl0ZW1TU0lELT5hYnlTU0lELCBwSXRlbVNTSUQtPmxlbik7Ci0JCSAgICBtZW1jcHkoc0xpbmtTdGF0dXMuYWJ5QlNTSUQsIHBNZ210LT5hYnlDdXJyQlNTSUQsIFdMQU5fQlNTSURfTEVOKTsKLQkJICAgIHNMaW5rU3RhdHVzLnVMaW5rUmF0ZSA9IHBNZ210LT5zTm9kZURCVGFibGVbMF0ud1R4RGF0YVJhdGU7Ci0gICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPIiBMaW5rIFN1Y2Nlc3MgISBcbiIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgc0xpbmtTdGF0dXMuYkxpbmsgPSBGQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29weV90b191c2VyKHBSZXEtPmRhdGEsICZzTGlua1N0YXR1cywgc2l6ZW9mKFNDbWRMaW5rU3RhdHVzKSkpIHsKLQkJCXJlc3VsdCA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBXTEFOX0NNRF9HRVRfTElTVExFTjoKLQkJY2JMaXN0Q291bnQgPSAwOwotCQlwQlNTID0gJihwTWdtdC0+c0JTU0xpc3RbMF0pOwotICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCBNQVhfQlNTX05VTTsgaWkrKykgewotICAgICAgICAgICAgcEJTUyA9ICYocE1nbXQtPnNCU1NMaXN0W2lpXSk7Ci0gICAgICAgICAgICBpZiAoIXBCU1MtPmJBY3RpdmUpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBjYkxpc3RDb3VudCsrOwotICAgICAgICB9Ci0gICAgICAgIHNMaXN0LnVJdGVtID0gY2JMaXN0Q291bnQ7Ci0gICAgICAgIGlmIChjb3B5X3RvX3VzZXIocFJlcS0+ZGF0YSwgJnNMaXN0LCBzaXplb2YoU0JTU0lETGlzdCkpKSB7Ci0JCQlyZXN1bHQgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLSAgICAgICAgcFJlcS0+d1Jlc3VsdCA9IDA7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBXTEFOX0NNRF9HRVRfTElTVDoKLSAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZzTGlzdCwgcFJlcS0+ZGF0YSwgc2l6ZW9mKFNCU1NJRExpc3QpKSkgewotCQkJcmVzdWx0ID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0gICAgICAgIHBMaXN0ID0gKFBTQlNTSURMaXN0KWttYWxsb2Moc2l6ZW9mKFNCU1NJRExpc3QpICsgKHNMaXN0LnVJdGVtICogc2l6ZW9mKFNCU1NJREl0ZW0pKSwgKGludClHRlBfQVRPTUlDKTsKLSAgICAgICAgaWYgKHBMaXN0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IC1FTk9NRU07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCQlwTGlzdC0+dUl0ZW0gPSBzTGlzdC51SXRlbTsKLQkJcEJTUyA9ICYocE1nbXQtPnNCU1NMaXN0WzBdKTsKLSAgICAgICAgZm9yIChpaSA9IDAsIGpqID0gMDsgamogPCBNQVhfQlNTX05VTSA7IGpqKyspIHsKLSAgICAgICAgICAgIHBCU1MgPSAmKHBNZ210LT5zQlNTTGlzdFtqal0pOwotICAgICAgICAgICAgaWYgKHBCU1MtPmJBY3RpdmUpIHsKLSAgICAJCSAgICBwTGlzdC0+c0JTU0lETGlzdFtpaV0udUNoYW5uZWwgPSBwQlNTLT51Q2hhbm5lbDsKLSAgICAJCSAgICBwTGlzdC0+c0JTU0lETGlzdFtpaV0ud0JlYWNvbkludGVydmFsID0gcEJTUy0+d0JlYWNvbkludGVydmFsOwotICAgIAkJICAgIHBMaXN0LT5zQlNTSURMaXN0W2lpXS53Q2FwSW5mbyA9IHBCU1MtPndDYXBJbmZvOwotICAgIAkJICAgIFJGdlJTU0lUb2RCbShwRGV2aWNlLCAoQllURSkocEJTUy0+dVJTU0kpLCAmbGRCbSk7Ci0JCSAgICBwTGlzdC0+c0JTU0lETGlzdFtpaV0udVJTU0kgPSAodW5zaWduZWQgaW50KSBsZEJtOwotLy8gICAgCQkgICAgcExpc3QtPnNCU1NJRExpc3RbaWldLnVSU1NJID0gcEJTUy0+dVJTU0k7Ci0gICAgCQkgICAgbWVtY3B5KHBMaXN0LT5zQlNTSURMaXN0W2lpXS5hYnlCU1NJRCwgcEJTUy0+YWJ5QlNTSUQsIFdMQU5fQlNTSURfTEVOKTsKLSAgICAJCSAgICBwSXRlbVNTSUQgPSAoUFdMQU5fSUVfU1NJRClwQlNTLT5hYnlTU0lEOwotICAgIAkJICAgIG1lbXNldChwTGlzdC0+c0JTU0lETGlzdFtpaV0uYWJ5U1NJRCwgMCwgV0xBTl9TU0lEX01BWExFTiArIDEpOwotICAgIAkJICAgIG1lbWNweShwTGlzdC0+c0JTU0lETGlzdFtpaV0uYWJ5U1NJRCwgcEl0ZW1TU0lELT5hYnlTU0lELCBwSXRlbVNTSUQtPmxlbik7Ci0gICAgICAgICAgICAgICAgaWYgKFdMQU5fR0VUX0NBUF9JTkZPX0VTUyhwQlNTLT53Q2FwSW5mbykpIHsKLSAgICAJCSAgICAgICAgcExpc3QtPnNCU1NJRExpc3RbaWldLmJ5TmV0VHlwZSA9IElORlJBOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAJCSAgICAgICAgcExpc3QtPnNCU1NJRExpc3RbaWldLmJ5TmV0VHlwZSA9IEFESE9DOwotICAgIAkJICAgIH0KLSAgICAJCSAgICBpZiAoV0xBTl9HRVRfQ0FQX0lORk9fUFJJVkFDWShwQlNTLT53Q2FwSW5mbykpIHsKLSAgICAJCSAgICAgICAgcExpc3QtPnNCU1NJRExpc3RbaWldLmJXRVBPbiA9IFRSVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgIAkJICAgICAgICBwTGlzdC0+c0JTU0lETGlzdFtpaV0uYldFUE9uID0gRkFMU0U7Ci0gICAgCQkgICAgfQotICAgIAkJICAgIGlpICsrOwotICAgIAkJICAgIGlmIChpaSA+PSBwTGlzdC0+dUl0ZW0pCi0gICAgCQkgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihwUmVxLT5kYXRhLCBwTGlzdCwgc2l6ZW9mKFNCU1NJRExpc3QpICsgKHNMaXN0LnVJdGVtICogc2l6ZW9mKFNCU1NJREl0ZW0pKSkpIHsKLQkJCXJlc3VsdCA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotICAgICAgICBrZnJlZShwTGlzdCk7Ci0gICAgICAgIHBSZXEtPndSZXN1bHQgPSAwOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgV0xBTl9DTURfR0VUX01JQjoKLSAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihwUmVxLT5kYXRhLCAmKHBEZXZpY2UtPnM4MDJfMTFDb3VudGVyKSwgc2l6ZW9mKFNEb3QxMU1JQkNvdW50KSkpIHsKLQkJCXJlc3VsdCA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgV0xBTl9DTURfR0VUX1NUQVQ6Ci0gICAgICAgIGlmIChjb3B5X3RvX3VzZXIocFJlcS0+ZGF0YSwgJihwRGV2aWNlLT5zY1N0YXRpc3RpYyksIHNpemVvZihTU3RhdENvdW50ZXIpKSkgewotCQkJcmVzdWx0ID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgV0xBTl9DTURfU1RPUF9NQUM6Ci0KLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfU1RPUF9NQUNcbiIpOwotICAgICAgICAvLyBUb2RvIHh4eHh4eAotICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKHBEZXZpY2UtPmRldik7Ci0gICAgICAgIHNwaW5fbG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotICAgICAgICBpZiAocERldmljZS0+YlJhZGlvT2ZmID09IEZBTFNFKSB7Ci0gICAgICAgICAgICBDQVJEYlJhZGlvUG93ZXJPZmYocERldmljZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcERldmljZS0+YkxpbmtQYXNzID0gRkFMU0U7Ci0gICAgICAgIENvbnRyb2x2TWFza0J5dGUocERldmljZSxNRVNTQUdFX1JFUVVFU1RfTUFDUkVHLE1BQ19SRUdfUEFQRURFTEFZLExFRFNUU19TVFMsTEVEU1RTX1NMT1cpOwotICAgICAgICBtZW1zZXQocE1nbXQtPmFieUN1cnJCU1NJRCwgMCwgNik7Ci0gICAgICAgIHBNZ210LT5lQ3VyclN0YXRlID0gV01BQ19TVEFURV9JRExFOwotLy8gICAgICAgIGRlbF90aW1lcigmcERldmljZS0+c1RpbWVyQ29tbWFuZCk7Ci0vLyAgICAgICAgZGVsX3RpbWVyKCZwTWdtdC0+c1RpbWVyU2Vjb25kQ2FsbGJhY2spOwotICAgICAgICBwRGV2aWNlLT5iQ21kUnVubmluZyA9IEZBTFNFOwotICAgICAgICBzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBXTEFOX0NNRF9TVEFSVF9NQUM6Ci0KLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfU1RBUlRfTUFDXG4iKTsKLSAgICAgICAgLy8gVG9kbyB4eHh4eHh4Ci0gICAgICAgIGlmIChwRGV2aWNlLT5iUmFkaW9PZmYgPT0gVFJVRSkKLSAgICAgICAgICAgIENBUkRiUmFkaW9Qb3dlck9uKHBEZXZpY2UpOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgV0xBTl9DTURfU0VUX0hPU1RBUEQ6Ci0KLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfU0VUX0hPU1RBUERcbiIpOwotCi0gICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmc1ZhbHVlLCBwUmVxLT5kYXRhLCBzaXplb2YoU0NtZFZhbHVlKSkpIHsKLQkJCXJlc3VsdCA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoc1ZhbHVlLmR3VmFsdWUgPT0gMSkgewotICAgICAgICAgICAgaWYgKHZ0NjY1Nl9ob3N0YXBfc2V0X2hvc3RhcGQocERldmljZSwgMSwgMSkgPT0gMCl7Ci0gICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiRW5hYmxlIEhPU1RBUFxuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLQkJCSAgICByZXN1bHQgPSAtRUZBVUxUOwotCQkJICAgIGJyZWFrOwotCQkJfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdnQ2NjU2X2hvc3RhcF9zZXRfaG9zdGFwZChwRGV2aWNlLCAwLCAxKTsKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkRpc2FibGUgSE9TVEFQXG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBXTEFOX0NNRF9TRVRfSE9TVEFQRF9TVEE6Ci0KLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfU0VUX0hPU1RBUERfU1RBXG4iKTsKLQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFdMQU5fQ01EX1NFVF84MDJfMVg6Ci0KLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfU0VUXzgwMl8xWFxuIik7Ci0gICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmc1ZhbHVlLCBwUmVxLT5kYXRhLCBzaXplb2YoU0NtZFZhbHVlKSkpIHsKLQkJCXJlc3VsdCA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChzVmFsdWUuZHdWYWx1ZSA9PSAxKSB7Ci0gICAgICAgICAgICBwRGV2aWNlLT5iRW5hYmxlODAyMXggPSBUUlVFOwotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiRW5hYmxlIDgwMi4xeFxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwRGV2aWNlLT5iRW5hYmxlODAyMXggPSBGQUxTRTsKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkRpc2FibGUgODAyLjF4XG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotCi0KLSAgICBjYXNlIFdMQU5fQ01EX1NFVF9IT1NUX1dFUDoKLQotICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJXTEFOX0NNRF9TRVRfSE9TVF9XRVBcbiIpOwotICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJnNWYWx1ZSwgcFJlcS0+ZGF0YSwgc2l6ZW9mKFNDbWRWYWx1ZSkpKSB7Ci0JCQlyZXN1bHQgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoc1ZhbHVlLmR3VmFsdWUgPT0gMSkgewotICAgICAgICAgICAgcERldmljZS0+YkVuYWJsZUhvc3RXRVAgPSBUUlVFOwotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiRW5hYmxlIEhvc3RXRVBcbiIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgcERldmljZS0+YkVuYWJsZUhvc3RXRVAgPSBGQUxTRTsKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkRpc2FibGUgSG9zdFdFUFxuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgV0xBTl9DTURfU0VUX1dQQToKLSAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIldMQU5fQ01EX1NFVF9XUEFcbiIpOwotCi0gICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmc1ZhbHVlLCBwUmVxLT5kYXRhLCBzaXplb2YoU0NtZFZhbHVlKSkpIHsKLQkJCXJlc3VsdCA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoc1ZhbHVlLmR3VmFsdWUgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAidXAgd3BhZGV2XG4iKTsKLQkJICAgbWVtY3B5KHBEZXZpY2UtPndwYWRldi0+ZGV2X2FkZHIsCi0JCQkgIHBEZXZpY2UtPmRldi0+ZGV2X2FkZHIsCi0JCQkgIEVUSF9BTEVOKTsKLQkJICAgcERldmljZS0+YldQQURFVlVwID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gImNsb3NlIHdwYWRldlxuIik7Ci0JICAgcERldmljZS0+YldQQURFVlVwID0gRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgV0xBTl9DTURfQVBfU1RBUlQ6Ci0KLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfQVBfU1RBUlRcbiIpOwotICAgICAgICBpZiAocERldmljZS0+YlJhZGlvT2ZmID09IFRSVUUpIHsKLSAgICAgICAgICAgIENBUkRiUmFkaW9Qb3dlck9uKHBEZXZpY2UpOwotICAgICAgICAgICAgYWRkX3RpbWVyKCZwTWdtdC0+c1RpbWVyU2Vjb25kQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcigmc1N0YXJ0QVBDbWQsIHBSZXEtPmRhdGEsIHNpemVvZihTQ21kU3RhcnRBUCkpKSB7Ci0JCQlyZXN1bHQgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLQotCSAgICBpZiAoc1N0YXJ0QVBDbWQud0JTU1R5cGUgPT0gQVApIHsKLQkgICAgICAgIHBNZ210LT5lQ29uZmlnTW9kZSA9IFdNQUNfQ09ORklHX0FQOwotCSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiaW9jdCBzZXQgdG8gQVAgbW9kZVxuIik7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJpb2N0IEJTUyB0eXBlIG5vdCBzZXQgdG8gQVAgbW9kZVxuIik7Ci0JCQlyZXN1bHQgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JICAgIH0KLQotCi0JICAgIGlmIChzU3RhcnRBUENtZC53QkJQVHlwZSA9PSBQSFk4MDIxMWcpIHsKLSAgICAgICAgICAgIHBNZ210LT5ieUFQQkJUeXBlID0gUEhZX1RZUEVfMTFHOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHNTdGFydEFQQ21kLndCQlBUeXBlID09IFBIWTgwMjExYSkgewotICAgICAgICAgICAgICAgICBwTWdtdC0+YnlBUEJCVHlwZSA9IFBIWV9UWVBFXzExQTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHBNZ210LT5ieUFQQkJUeXBlID0gUEhZX1RZUEVfMTFCOwotICAgICAgICB9Ci0KLSAgICAgICAgcEl0ZW1TU0lEID0gKFBXTEFOX0lFX1NTSUQpc1N0YXJ0QVBDbWQuc3NpZDsKLSAgICAgICAgbWVtc2V0KHBNZ210LT5hYnlEZXNpcmVTU0lELCAwLCBXTEFOX0lFSERSX0xFTiArIFdMQU5fU1NJRF9NQVhMRU4gKyAxKTsKLQkJbWVtY3B5KHBNZ210LT5hYnlEZXNpcmVTU0lELCBwSXRlbVNTSUQsIHBJdGVtU1NJRC0+bGVuICsgV0xBTl9JRUhEUl9MRU4pOwotCi0JICAgIGlmICgoc1N0YXJ0QVBDbWQudUNoYW5uZWwgPiAwKSYmKHNTdGFydEFQQ21kLnVDaGFubmVsIDw9IDE0KSkKLQkgICAgICAgIHBEZXZpY2UtPnVDaGFubmVsID0gc1N0YXJ0QVBDbWQudUNoYW5uZWw7Ci0KLQkgICAgaWYgKChzU3RhcnRBUENtZC51QmVhY29uSW50ID49IDIwKSAmJiAoc1N0YXJ0QVBDbWQudUJlYWNvbkludCA8PSAxMDAwKSkKLSAgICAgICAgICAgIHBNZ210LT53SUJTU0JlYWNvblBlcmlvZCA9IHNTdGFydEFQQ21kLnVCZWFjb25JbnQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBNZ210LT53SUJTU0JlYWNvblBlcmlvZCA9IDEwMDsKLQotICAgICAgICBpZiAoc1N0YXJ0QVBDbWQuYlNoYXJlS2V5QXV0aCA9PSBUUlVFKXsKLSAgICAgICAgICAgIHBNZ210LT5iU2hhcmVLZXlBbGdvcml0aG0gPSBUUlVFOwotICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiU2hhcmUgS2V5IFxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBwTWdtdC0+YlNoYXJlS2V5QWxnb3JpdGhtID0gRkFMU0U7Ci0gICAgICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJPcGVuIFN5c3RlbSBcbiIpOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweShwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlcywgYWJ5U3VwcFJhdGVzLCA2KTsKLQotICAgICAgICBpZiAoc1N0YXJ0QVBDbWQuYnlCYXNpY1JhdGUgJiBCSVQzKSB7Ci0gICAgICAgICAgICBwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlc1syXSB8PSBCSVQ3OwotICAgICAgICAgICAgcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbM10gfD0gQklUNzsKLSAgICAgICAgICAgIHBNZ210LT5hYnlJQlNTU3VwcFJhdGVzWzRdIHw9IEJJVDc7Ci0gICAgICAgICAgICBwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlc1s1XSB8PSBCSVQ3OwotICAgICAgICB9ZWxzZSBpZiAoc1N0YXJ0QVBDbWQuYnlCYXNpY1JhdGUgJiBCSVQyKSB7Ci0gICAgICAgICAgICAgcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbMl0gfD0gQklUNzsKLSAgICAgICAgICAgICBwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlc1szXSB8PSBCSVQ3OwotICAgICAgICAgICAgIHBNZ210LT5hYnlJQlNTU3VwcFJhdGVzWzRdIHw9IEJJVDc7Ci0gICAgICAgIH1lbHNlIGlmIChzU3RhcnRBUENtZC5ieUJhc2ljUmF0ZSAmIEJJVDEpIHsKLSAgICAgICAgICAgICBwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlc1syXSB8PSBCSVQ3OwotICAgICAgICAgICAgIHBNZ210LT5hYnlJQlNTU3VwcFJhdGVzWzNdIHw9IEJJVDc7Ci0gICAgICAgIH1lbHNlIGlmIChzU3RhcnRBUENtZC5ieUJhc2ljUmF0ZSAmIEJJVDEpIHsKLSAgICAgICAgICAgICBwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlc1syXSB8PSBCSVQ3OwotICAgICAgICB9ZWxzZSB7Ci0gICAgICAgICAgICAvL2RlZmF1bHQgMSwyTQotICAgICAgICAgICAgIHBNZ210LT5hYnlJQlNTU3VwcFJhdGVzWzJdIHw9IEJJVDc7Ci0gICAgICAgICAgICAgcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbM10gfD0gQklUNzsKLSAgICAgICAgfQotCi0gICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIlN1cHBvcnQgUmF0ZT0gJXggJXggJXggJXhcbiIsCi0gICAgICAgICAgICAgICAgcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbMl0sCi0gICAgICAgICAgICAgICAgcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbM10sCi0gICAgICAgICAgICAgICAgcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbNF0sCi0gICAgICAgICAgICAgICAgcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbNV0KLSAgICAgICAgICAgICAgICApOwotCi0gICAgICAgIG5ldGlmX3N0b3BfcXVldWUocERldmljZS0+ZGV2KTsKLSAgICAgICAgc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7Ci0JYlNjaGVkdWxlQ29tbWFuZCgodm9pZCAqKSBwRGV2aWNlLCBXTEFOX0NNRF9SVU5fQVAsIE5VTEwpOwotICAgICAgICBzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgV0xBTl9DTURfR0VUX05PREVfQ05UOgotCi0JCWNiTGlzdENvdW50ID0gMDsKLQkJcE5vZGUgPSAmKHBNZ210LT5zTm9kZURCVGFibGVbMF0pOwotICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCAoTUFYX05PREVfTlVNICsgMSk7IGlpKyspIHsKLSAgICAgICAgICAgIHBOb2RlID0gJihwTWdtdC0+c05vZGVEQlRhYmxlW2lpXSk7Ci0gICAgICAgICAgICBpZiAoIXBOb2RlLT5iQWN0aXZlKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgY2JMaXN0Q291bnQrKzsKLSAgICAgICAgfQotCi0gICAgICAgIHNOb2RlTGlzdC51SXRlbSA9IGNiTGlzdENvdW50OwotICAgICAgICBpZiAoY29weV90b191c2VyKHBSZXEtPmRhdGEsICZzTm9kZUxpc3QsIHNpemVvZihTTm9kZUxpc3QpKSkgewotCQkJcmVzdWx0ID0gLUVGQVVMVDsKLQkJCWJyZWFrOwotCQl9Ci0gICAgICAgIHBSZXEtPndSZXN1bHQgPSAwOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgV0xBTl9DTURfR0VUX05PREVfTElTVDoKLQotICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJnNOb2RlTGlzdCwgcFJlcS0+ZGF0YSwgc2l6ZW9mKFNOb2RlTGlzdCkpKSB7Ci0JCQlyZXN1bHQgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLSAgICAgICAgcE5vZGVMaXN0ID0gKFBTTm9kZUxpc3Qpa21hbGxvYyhzaXplb2YoU05vZGVMaXN0KSArIChzTm9kZUxpc3QudUl0ZW0gKiBzaXplb2YoU05vZGVJdGVtKSksIChpbnQpR0ZQX0FUT01JQyk7Ci0gICAgICAgIGlmIChwTm9kZUxpc3QgPT0gTlVMTCkgewotICAgICAgICAgICAgcmVzdWx0ID0gLUVOT01FTTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0JCXBOb2RlTGlzdC0+dUl0ZW0gPSBzTm9kZUxpc3QudUl0ZW07Ci0JCXBOb2RlID0gJihwTWdtdC0+c05vZGVEQlRhYmxlWzBdKTsKLSAgICAgICAgZm9yIChpaSA9IDAsIGpqID0gMDsgaWkgPCAoTUFYX05PREVfTlVNICsgMSk7IGlpKyspIHsKLSAgICAgICAgICAgIHBOb2RlID0gJihwTWdtdC0+c05vZGVEQlRhYmxlW2lpXSk7Ci0gICAgICAgICAgICBpZiAocE5vZGUtPmJBY3RpdmUpIHsKLSAgICAJCSAgICBwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0ud0FJRCA9IHBOb2RlLT53QUlEOwotICAgIAkJICAgIG1lbWNweShwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0uYWJ5TUFDQWRkciwgcE5vZGUtPmFieU1BQ0FkZHIsIFdMQU5fQUREUl9MRU4pOwotICAgIAkJICAgIHBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS53VHhEYXRhUmF0ZSA9IHBOb2RlLT53VHhEYXRhUmF0ZTsKLSAgICAJCSAgICBwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0ud0luQWN0aXZlQ291bnQgPSAoV09SRClwTm9kZS0+dUluQWN0aXZlQ291bnQ7Ci0gICAgCQkgICAgcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLndFblF1ZXVlQ250ID0gKFdPUkQpcE5vZGUtPndFblF1ZXVlQ250OwotICAgIAkJICAgIHBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS53RmxhZ3MgPSAoV09SRClwTm9kZS0+ZHdGbGFnczsKLSAgICAJCSAgICBwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0uYlBXQml0T24gPSBwTm9kZS0+YlBTRW5hYmxlOwotICAgIAkJICAgIHBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS5ieUtleUluZGV4ID0gcE5vZGUtPmJ5S2V5SW5kZXg7Ci0gICAgCQkgICAgcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLndXZXBLZXlMZW5ndGggPSBwTm9kZS0+dVdlcEtleUxlbmd0aDsKLSAgICAJCSAgICBtZW1jcHkoJihwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0uYWJ5V2VwS2V5WzBdKSwgJihwTm9kZS0+YWJ5V2VwS2V5WzBdKSwgV0VQX0tFWU1BWExFTik7Ci0gICAgICAgICAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAia2V5PSAlMi4yWDolMi4yWDolMi4yWDolMi4yWDolMi4yWFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0uYWJ5V2VwS2V5WzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS5hYnlXZXBLZXlbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLmFieVdlcEtleVsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0uYWJ5V2VwS2V5WzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS5hYnlXZXBLZXlbNF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgCQkgICAgcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLmJJc0luRmFsbGJhY2sgPSBwTm9kZS0+YklzSW5GYWxsYmFjazsKLSAgICAJCSAgICBwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0udVR4RmFpbHVyZXMgPSBwTm9kZS0+dVR4RmFpbHVyZXM7Ci0gICAgCQkgICAgcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLnVUeEF0dGVtcHRzID0gcE5vZGUtPnVUeEF0dGVtcHRzOwotICAgIAkJICAgIHBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS53RmFpbHVyZVJhdGlvID0gKFdPUkQpcE5vZGUtPnVGYWlsdXJlUmF0aW87Ci0gICAgCQkgICAgamogKys7Ci0gICAgCQkgICAgaWYgKGpqID49IHBOb2RlTGlzdC0+dUl0ZW0pCi0gICAgCQkgICAgICAgIGJyZWFrOwotICAgIAkJfQotCQl9Ci0gICAgICAgIGlmIChjb3B5X3RvX3VzZXIocFJlcS0+ZGF0YSwgcE5vZGVMaXN0LCBzaXplb2YoU05vZGVMaXN0KSArIChzTm9kZUxpc3QudUl0ZW0gKiBzaXplb2YoU05vZGVJdGVtKSkpKSB7Ci0JCQlyZXN1bHQgPSAtRUZBVUxUOwotCQkJYnJlYWs7Ci0JCX0KLSAgICAgICAga2ZyZWUocE5vZGVMaXN0KTsKLSAgICAgICAgcFJlcS0+d1Jlc3VsdCA9IDA7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAweEZGOgotICAgICAgICBtZW1zZXQod3BhX1Jlc3VsdC5pZm5hbWUsMCxzaXplb2Yod3BhX1Jlc3VsdC5pZm5hbWUpKTsKLQkgICAgd3BhX1Jlc3VsdC5wcm90byA9IDA7Ci0JICAgIHdwYV9SZXN1bHQua2V5X21nbXQgPSAwOwotCSAgICB3cGFfUmVzdWx0LmVhcF90eXBlID0gMDsKLQkgICAgd3BhX1Jlc3VsdC5hdXRoZW50aWNhdGVkID0gRkFMU0U7Ci0JICAgICAgcERldmljZS0+ZldQQV9BdXRoZW5lZCA9IEZBTFNFOwotICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJndwYV9SZXN1bHQsIHBSZXEtPmRhdGEsIHNpemVvZih3cGFfUmVzdWx0KSkpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IC1FRkFVTFQ7Ci0JCQlicmVhazsKLQkJfQotLy9EYXZpZFdhbmcgIGZvciBzb21lIEFQIG1heWJlIGdvb2QgYXV0aGVudGljYXRlCi0gICBpZih3cGFfUmVzdWx0LmtleV9tZ210PT0weDIwKQotICAgICAgcE1nbXQtPkNpc2NvX2Nja20gPTE7Ci0gICAgZWxzZQotICAgIHBNZ210LT5DaXNjb19jY2ttID0wOwotCi0KLWlmKHdwYV9SZXN1bHQuYXV0aGVudGljYXRlZD09VFJVRSkgewotICAgewotICAgICB1bmlvbiBpd3JlcV9kYXRhICAgICAgd3JxdTsKLQotICAgICBwSXRlbVNTSUQgPSAoUFdMQU5fSUVfU1NJRClwTWdtdC0+YWJ5Q3VyclNTSUQ7Ci0KLSAgICAgbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOwotICAgICB3cnF1LmRhdGEuZmxhZ3MgPSBSVF9XUEFDT05ORUNURURfRVZFTlRfRkxBRzsKLSAgICAgd3JxdS5kYXRhLmxlbmd0aCA9cEl0ZW1TU0lELT5sZW47Ci0gICAgIHdpcmVsZXNzX3NlbmRfZXZlbnQocERldmljZS0+ZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgcEl0ZW1TU0lELT5hYnlTU0lEKTsKLSAgIH0KLSAgICAgICAgIHBEZXZpY2UtPmZXUEFfQXV0aGVuZWQgPSBUUlVFOyAgICAgICAgICAgLy9pcyBzdWNjZXNzZnVsIHBlZXIgdG8gd3BhX1Jlc3VsdC5hdXRoZW50aWNhdGVkPwotfQotCi0gICAgICAgIC8vcHJpbnRrKCJnZXQgcHJpdmF0ZSB3cGFfc3VwcGxpY2FudCBhbm5vdW5jZSBXUEEgU01cbiIpOwotCS8vcHJpbnRrKCJ3cGEtLT5pZm5hbWU9JXNcbiIsd3BhX1Jlc3VsdC5pZm5hbWUpOwotCS8vcHJpbnRrKCJ3cGEtLT5wcm90bz0lZFxuIix3cGFfUmVzdWx0LnByb3RvKTsKLQkvL3ByaW50aygid3BhLS0+a2V5LW1nbXQ9JWRcbiIsd3BhX1Jlc3VsdC5rZXlfbWdtdCk7Ci0JLy9wcmludGsoIndwYS0tPmVhcF90eXBlPSVkXG4iLHdwYV9SZXN1bHQuZWFwX3R5cGUpOwotCS8vcHJpbnRrKCJ3cGEtLT5hdXRoZW50aWNhdGVkIGlzICVzXG4iLCh3cGFfUmVzdWx0LmF1dGhlbnRpY2F0ZWQ9PVRSVUUpPyJUUlVFIjoiRkFMU0UiKTsKKwlQU0NtZFJlcXVlc3QJcFJlcSA9IChQU0NtZFJlcXVlc3QpcnE7CisJUFNNZ210T2JqZWN0CXBNZ210ID0gJihwRGV2aWNlLT5zTWdtdE9iaik7CisJaW50CQlyZXN1bHQgPSAwOworCVBXTEFOX0lFX1NTSUQJcEl0ZW1TU0lEOworCVNDbWRCU1NKb2luCXNKb2luQ21kOworCVNDbWRab25lVHlwZVNldAlzWm9uZVR5cGVDbWQ7CisJU0NtZFNjYW4Jc1NjYW5DbWQ7CisJU0NtZFN0YXJ0QVAJc1N0YXJ0QVBDbWQ7CisJU0NtZFNldFdFUAlzV0VQQ21kOworCVNDbWRWYWx1ZQlzVmFsdWU7CisJU0JTU0lETGlzdAlzTGlzdDsKKwlTTm9kZUxpc3QJc05vZGVMaXN0OworCVBTQlNTSURMaXN0CXBMaXN0OworCVBTTm9kZUxpc3QJcE5vZGVMaXN0OworCXVuc2lnbmVkIGludAljYkxpc3RDb3VudDsKKwlQS25vd25CU1MJcEJTUzsKKwlQS25vd25Ob2RlREIJcE5vZGU7CisJdW5zaWduZWQgaW50CWlpLCBqajsKKwlTQ21kTGlua1N0YXR1cwlzTGlua1N0YXR1czsKKwlCWVRFCQlhYnlTdXBwUmF0ZXNbXSA9IHtXTEFOX0VJRF9TVVBQX1JBVEVTLCA0LCAweDAyLCAweDA0LCAweDBCLCAweDE2fTsKKwlCWVRFCQlhYnlOdWxsQWRkcltdID0gezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9OworCURXT1JECQlkd0tleUluZGV4ID0gMDsKKwlCWVRFCQlhYnlTY2FuU1NJRFtXTEFOX0lFSERSX0xFTiArIFdMQU5fU1NJRF9NQVhMRU4gKyAxXTsKKwlzaWduZWQgbG9uZwlsZEJtOwogCiAJcFJlcS0+d1Jlc3VsdCA9IDA7Ci0gICAgICAgIGJyZWFrOwogCi0gICAgZGVmYXVsdDoKLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiUHJpdmF0ZSBjb21tYW5kIG5vdCBzdXBwb3J0Li5cbiIpOwotICAgIH0KKwlzd2l0Y2ggKHBSZXEtPndDbWRDb2RlKSB7CisJY2FzZSBXTEFOX0NNRF9CU1NfU0NBTjoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzU2NhbkNtZCwgcFJlcS0+ZGF0YSwgc2l6ZW9mKFNDbWRTY2FuKSkpIHsKKwkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQogCi0gICAgcmV0dXJuIHJlc3VsdDsKKwkJcEl0ZW1TU0lEID0gKFBXTEFOX0lFX1NTSUQpc1NjYW5DbWQuc3NpZDsKKwkJaWYgKHBJdGVtU1NJRC0+bGVuID4gV0xBTl9TU0lEX01BWExFTiArIDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHBJdGVtU1NJRC0+bGVuICE9IDApIHsKKwkJCW1lbXNldChhYnlTY2FuU1NJRCwgMCwgV0xBTl9JRUhEUl9MRU4gKyBXTEFOX1NTSURfTUFYTEVOICsgMSk7CisJCQltZW1jcHkoYWJ5U2NhblNTSUQsIHBJdGVtU1NJRCwgcEl0ZW1TU0lELT5sZW4gKyBXTEFOX0lFSERSX0xFTik7CisJCX0KKwkJc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7CisKKwkJaWYgKG1lbWNtcChwTWdtdC0+YWJ5Q3VyckJTU0lELCAmYWJ5TnVsbEFkZHJbMF0sIDYpID09IDApCisJCQlCU1N2Q2xlYXJCU1NMaXN0KCh2b2lkICopcERldmljZSwgRkFMU0UpOworCQllbHNlCisJCQlCU1N2Q2xlYXJCU1NMaXN0KCh2b2lkICopcERldmljZSwgcERldmljZS0+YkxpbmtQYXNzKTsKKworCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJXTEFOX0NNRF9CU1NfU0NBTi4uYmVnaW5cbiIpOworCisJCWlmIChwSXRlbVNTSUQtPmxlbiAhPSAwKQorCQkJYlNjaGVkdWxlQ29tbWFuZCgodm9pZCAqKXBEZXZpY2UsCisJCQkJCSBXTEFOX0NNRF9CU1NJRF9TQ0FOLAorCQkJCQkgYWJ5U2NhblNTSUQpOworCQllbHNlCisJCQliU2NoZWR1bGVDb21tYW5kKCh2b2lkICopIHBEZXZpY2UsIFdMQU5fQ01EX0JTU0lEX1NDQU4sIE5VTEwpOworCisJCXNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7CisJCWJyZWFrOworCisJY2FzZSBXTEFOX0NNRF9aT05FVFlQRV9TRVQ6CisJCXJlc3VsdCA9IC1FT1BOT1RTVVBQOworCQlicmVhazsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnNab25lVHlwZUNtZCwgcFJlcS0+ZGF0YSwgc2l6ZW9mKFNDbWRab25lVHlwZVNldCkpKSB7CisJCQlyZXN1bHQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc1pvbmVUeXBlQ21kLmJXcml0ZSA9PSBUUlVFKSB7CisJCQkvKiB3cml0ZSB6b25ldHlwZSAqLworCQkJaWYgKHNab25lVHlwZUNtZC5ab25lVHlwZSA9PSBab25lVHlwZV9VU0EpIHsKKwkJCQkvKiBzZXQgdG8gVVNBICovCisJCQkJcHJpbnRrKCJzZXRfWm9uZVR5cGU6VVNBXG4iKTsKKwkJCX0gZWxzZSBpZiAoc1pvbmVUeXBlQ21kLlpvbmVUeXBlID09IFpvbmVUeXBlX0phcGFuKSB7CisJCQkJLyogc2V0IHRvIEphcGFuICovCisJCQkJcHJpbnRrKCJzZXRfWm9uZVR5cGU6SmFwYW5cbiIpOworCQkJfSBlbHNlIGlmIChzWm9uZVR5cGVDbWQuWm9uZVR5cGUgPT0gWm9uZVR5cGVfRXVyb3BlKSB7CisJCQkJLyogc2V0IHRvIEV1cm9wZSAqLworCQkJCXByaW50aygic2V0X1pvbmVUeXBlOkV1cm9wZVxuIik7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiByZWFkIHpvbmV0eXBlICovCisJCQlCWVRFIHpvbmV0eXBlID0gMDsKKworCQkJaWYgKHpvbmV0eXBlID09IDB4MDApIHsgICAgICAgIC8qIFVTQSAqLworCQkJCXNab25lVHlwZUNtZC5ab25lVHlwZSA9IFpvbmVUeXBlX1VTQTsKKwkJCX0gZWxzZSBpZiAoem9uZXR5cGUgPT0gMHgwMSkgeyAvKiBKYXBhbiAqLworCQkJCXNab25lVHlwZUNtZC5ab25lVHlwZSA9IFpvbmVUeXBlX0phcGFuOworCQkJfSBlbHNlIGlmICh6b25ldHlwZSA9PSAweDAyKSB7IC8qIEV1cm9wZSAqLworCQkJCXNab25lVHlwZUNtZC5ab25lVHlwZSA9IFpvbmVUeXBlX0V1cm9wZTsKKwkJCX0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBVbmtub3duIFpvbmVUeXBlICovCisJCQkJcHJpbnRrKCJFcnJvcjpab25lVHlwZVsleF0gVW5rbm93biA/Pz9cbiIsIHpvbmV0eXBlKTsKKwkJCQlyZXN1bHQgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoY29weV90b191c2VyKHBSZXEtPmRhdGEsICZzWm9uZVR5cGVDbWQsCisJCQkJCQlzaXplb2YoU0NtZFpvbmVUeXBlU2V0KSkpIHsKKwkJCQlyZXN1bHQgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgV0xBTl9DTURfQlNTX0pPSU46CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc0pvaW5DbWQsIHBSZXEtPmRhdGEsIHNpemVvZihTQ21kQlNTSm9pbikpKSB7CisJCQlyZXN1bHQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlwSXRlbVNTSUQgPSAoUFdMQU5fSUVfU1NJRClzSm9pbkNtZC5zc2lkOworCQlpZiAocEl0ZW1TU0lELT5sZW4gPiBXTEFOX1NTSURfTUFYTEVOICsgMSkKKwkJCXJldHVybiAtRUlOVkFMOworCQltZW1zZXQocE1nbXQtPmFieURlc2lyZVNTSUQsIDAsIFdMQU5fSUVIRFJfTEVOICsgV0xBTl9TU0lEX01BWExFTiArIDEpOworCQltZW1jcHkocE1nbXQtPmFieURlc2lyZVNTSUQsIHBJdGVtU1NJRCwgcEl0ZW1TU0lELT5sZW4gKyBXTEFOX0lFSERSX0xFTik7CisJCWlmIChzSm9pbkNtZC53QlNTVHlwZSA9PSBBREhPQykgeworCQkJcE1nbXQtPmVDb25maWdNb2RlID0gV01BQ19DT05GSUdfSUJTU19TVEE7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJpb2N0IHNldCB0byBhZGhvYyBtb2RlXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXBNZ210LT5lQ29uZmlnTW9kZSA9IFdNQUNfQ09ORklHX0VTU19TVEE7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJpb2N0IHNldCB0byBTVEEgbW9kZVxuIik7CisJCX0KKwkJaWYgKHNKb2luQ21kLmJQU0VuYWJsZSA9PSBUUlVFKSB7CisJCQlwRGV2aWNlLT5lUFNNb2RlID0gV01BQ19QT1dFUl9GQVNUOworCQkJcE1nbXQtPndMaXN0ZW5JbnRlcnZhbCA9IDI7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJQb3dlciBTYXZpbmcgT25cbiIpOworCQl9IGVsc2UgeworCQkJcERldmljZS0+ZVBTTW9kZSA9IFdNQUNfUE9XRVJfQ0FNOworCQkJcE1nbXQtPndMaXN0ZW5JbnRlcnZhbCA9IDE7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJQb3dlciBTYXZpbmcgT2ZmXG4iKTsKKwkJfQorCisJCWlmIChzSm9pbkNtZC5iU2hhcmVLZXlBdXRoID09IFRSVUUpIHsKKwkJCXBNZ210LT5iU2hhcmVLZXlBbGdvcml0aG0gPSBUUlVFOworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiU2hhcmUgS2V5XG4iKTsKKwkJfSBlbHNlIHsKKwkJCXBNZ210LT5iU2hhcmVLZXlBbGdvcml0aG0gPSBGQUxTRTsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIk9wZW4gU3lzdGVtXG4iKTsKKwkJfQorCisJCXBEZXZpY2UtPnVDaGFubmVsID0gc0pvaW5DbWQudUNoYW5uZWw7CisJCW5ldGlmX3N0b3BfcXVldWUocERldmljZS0+ZGV2KTsKKwkJc3Bpbl9sb2NrX2lycSgmcERldmljZS0+bG9jayk7CisJCXBNZ210LT5lQ3VyclN0YXRlID0gV01BQ19TVEFURV9JRExFOworCQliU2NoZWR1bGVDb21tYW5kKCh2b2lkICopIHBEZXZpY2UsCisJCQkJIFdMQU5fQ01EX0JTU0lEX1NDQU4sCisJCQkJIHBNZ210LT5hYnlEZXNpcmVTU0lEKTsKKwkJYlNjaGVkdWxlQ29tbWFuZCgodm9pZCAqKSBwRGV2aWNlLCBXTEFOX0NNRF9TU0lELCBOVUxMKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fQ01EX1NFVF9XRVA6CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIldMQU5fQ01EX1NFVF9XRVAgS2V5LlxuIik7CisJCW1lbXNldCgmc1dFUENtZCwgMCwgc2l6ZW9mKFNDbWRTZXRXRVApKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzV0VQQ21kLCBwUmVxLT5kYXRhLCBzaXplb2YoU0NtZFNldFdFUCkpKSB7CisJCQlyZXN1bHQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHNXRVBDbWQuYkVuYWJsZVdlcCAhPSBUUlVFKSB7CisJCQlpbnQgdXU7CisKKwkJCXBEZXZpY2UtPmJFbmNyeXB0aW9uRW5hYmxlID0gRkFMU0U7CisJCQlwRGV2aWNlLT5lRW5jcnlwdGlvblN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uRGlzYWJsZWQ7CisJCQlzcGluX2xvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKKwkJCWZvciAodXUgPSAwOyB1dSA8IE1BWF9LRVlfVEFCTEU7IHV1KyspCisJCQkJTUFDdkRpc2FibGVLZXlFbnRyeShwRGV2aWNlLCB1dSk7CisJCQlzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0VQIGZ1bmN0aW9uIGRpc2FibGUuXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZm9yIChpaSA9IDA7IGlpIDwgV0xBTl9XRVBfTktFWVM7IGlpKyspIHsKKwkJCWlmIChzV0VQQ21kLmJXZXBLZXlBdmFpbGFibGVbaWldKSB7CisJCQkJaWYgKGlpID09IHNXRVBDbWQuYnlLZXlJbmRleCkKKwkJCQkJZHdLZXlJbmRleCA9IGlpIHwgKDEgPDwgMzEpOworCQkJCWVsc2UKKwkJCQkJZHdLZXlJbmRleCA9IGlpOworCQkJCXNwaW5fbG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOworCQkJCUtleWJTZXREZWZhdWx0S2V5KHBEZXZpY2UsICYocERldmljZS0+c0tleSksCisJCQkJCQkgIGR3S2V5SW5kZXgsCisJCQkJCQkgIHNXRVBDbWQuYXVXZXBLZXlMZW5ndGhbaWldLAorCQkJCQkJICBOVUxMLAorCQkJCQkJICAoUEJZVEUpJnNXRVBDbWQuYWJ5V2VwS2V5W2lpXVswXSwKKwkJCQkJCSAgS0VZX0NUTF9XRVApOworCQkJCXNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7CisJCQl9CisJCX0KKwkJcERldmljZS0+YnlLZXlJbmRleCA9IHNXRVBDbWQuYnlLZXlJbmRleDsKKwkJcERldmljZS0+YlRyYW5zbWl0S2V5ID0gVFJVRTsKKwkJcERldmljZS0+YkVuY3J5cHRpb25FbmFibGUgPSBUUlVFOworCQlwRGV2aWNlLT5lRW5jcnlwdGlvblN0YXR1cyA9IE5kaXM4MDJfMTFFbmNyeXB0aW9uMUVuYWJsZWQ7CisJCWJyZWFrOworCisJY2FzZSBXTEFOX0NNRF9HRVRfTElOSzoKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfR0VUX0xJTksgc3RhdHVzLlxuIik7CisKKwkJbWVtc2V0KHNMaW5rU3RhdHVzLmFieVNTSUQsIDAsIFdMQU5fU1NJRF9NQVhMRU4gKyAxKTsKKworCQlpZiAocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfSUJTU19TVEEpCisJCQlzTGlua1N0YXR1cy53QlNTVHlwZSA9IEFESE9DOworCQllbHNlCisJCQlzTGlua1N0YXR1cy53QlNTVHlwZSA9IElORlJBOworCisJCWlmIChwTWdtdC0+ZUN1cnJTdGF0ZSA9PSBXTUFDX1NUQVRFX0pPSU5URUQpCisJCQlzTGlua1N0YXR1cy5ieVN0YXRlID0gQURIT0NfSk9JTlRFRDsKKwkJZWxzZQorCQkJc0xpbmtTdGF0dXMuYnlTdGF0ZSA9IEFESE9DX1NUQVJURUQ7CisKKwkJc0xpbmtTdGF0dXMudUNoYW5uZWwgPSBwTWdtdC0+dUN1cnJDaGFubmVsOworCQlpZiAocERldmljZS0+YkxpbmtQYXNzID09IFRSVUUpIHsKKwkJCXNMaW5rU3RhdHVzLmJMaW5rID0gVFJVRTsKKwkJCXBJdGVtU1NJRCA9IChQV0xBTl9JRV9TU0lEKXBNZ210LT5hYnlDdXJyU1NJRDsKKwkJCW1lbWNweShzTGlua1N0YXR1cy5hYnlTU0lELCBwSXRlbVNTSUQtPmFieVNTSUQsIHBJdGVtU1NJRC0+bGVuKTsKKwkJCW1lbWNweShzTGlua1N0YXR1cy5hYnlCU1NJRCwgcE1nbXQtPmFieUN1cnJCU1NJRCwgV0xBTl9CU1NJRF9MRU4pOworCQkJc0xpbmtTdGF0dXMudUxpbmtSYXRlID0gcE1nbXQtPnNOb2RlREJUYWJsZVswXS53VHhEYXRhUmF0ZTsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkxpbmsgU3VjY2VzcyFcbiIpOworCQl9IGVsc2UgeworCQkJc0xpbmtTdGF0dXMuYkxpbmsgPSBGQUxTRTsKKwkJCXNMaW5rU3RhdHVzLnVMaW5rUmF0ZSA9IDA7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihwUmVxLT5kYXRhLCAmc0xpbmtTdGF0dXMsCisJCQkJCXNpemVvZihTQ21kTGlua1N0YXR1cykpKSB7CisJCQlyZXN1bHQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fQ01EX0dFVF9MSVNUTEVOOgorCQljYkxpc3RDb3VudCA9IDA7CisJCXBCU1MgPSAmKHBNZ210LT5zQlNTTGlzdFswXSk7CisJCWZvciAoaWkgPSAwOyBpaSA8IE1BWF9CU1NfTlVNOyBpaSsrKSB7CisJCQlwQlNTID0gJihwTWdtdC0+c0JTU0xpc3RbaWldKTsKKwkJCWlmICghcEJTUy0+YkFjdGl2ZSkKKwkJCQljb250aW51ZTsKKwkJCWNiTGlzdENvdW50Kys7CisJCX0KKwkJc0xpc3QudUl0ZW0gPSBjYkxpc3RDb3VudDsKKwkJaWYgKGNvcHlfdG9fdXNlcihwUmVxLT5kYXRhLCAmc0xpc3QsIHNpemVvZihTQlNTSURMaXN0KSkpIHsKKwkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlwUmVxLT53UmVzdWx0ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fQ01EX0dFVF9MSVNUOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnNMaXN0LCBwUmVxLT5kYXRhLCBzaXplb2YoU0JTU0lETGlzdCkpKSB7CisJCQlyZXN1bHQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJcExpc3QgPSAoUFNCU1NJRExpc3Qpa21hbGxvYyhzaXplb2YoU0JTU0lETGlzdCkgKyAoc0xpc3QudUl0ZW0gKiBzaXplb2YoU0JTU0lESXRlbSkpLCAoaW50KUdGUF9BVE9NSUMpOworCQlpZiAocExpc3QgPT0gTlVMTCkgeworCQkJcmVzdWx0ID0gLUVOT01FTTsKKwkJCWJyZWFrOworCQl9CisJCXBMaXN0LT51SXRlbSA9IHNMaXN0LnVJdGVtOworCQlwQlNTID0gJihwTWdtdC0+c0JTU0xpc3RbMF0pOworCQlmb3IgKGlpID0gMCwgamogPSAwOyBqaiA8IE1BWF9CU1NfTlVNIDsgamorKykgeworCQkJcEJTUyA9ICYocE1nbXQtPnNCU1NMaXN0W2pqXSk7CisJCQlpZiAocEJTUy0+YkFjdGl2ZSkgeworCQkJCXBMaXN0LT5zQlNTSURMaXN0W2lpXS51Q2hhbm5lbCA9IHBCU1MtPnVDaGFubmVsOworCQkJCXBMaXN0LT5zQlNTSURMaXN0W2lpXS53QmVhY29uSW50ZXJ2YWwgPSBwQlNTLT53QmVhY29uSW50ZXJ2YWw7CisJCQkJcExpc3QtPnNCU1NJRExpc3RbaWldLndDYXBJbmZvID0gcEJTUy0+d0NhcEluZm87CisJCQkJUkZ2UlNTSVRvZEJtKHBEZXZpY2UsIChCWVRFKShwQlNTLT51UlNTSSksICZsZEJtKTsKKwkJCQlwTGlzdC0+c0JTU0lETGlzdFtpaV0udVJTU0kgPSAodW5zaWduZWQgaW50KSBsZEJtOworCQkJCS8qIHBMaXN0LT5zQlNTSURMaXN0W2lpXS51UlNTSSA9IHBCU1MtPnVSU1NJOyAqLworCQkJCW1lbWNweShwTGlzdC0+c0JTU0lETGlzdFtpaV0uYWJ5QlNTSUQsIHBCU1MtPmFieUJTU0lELCBXTEFOX0JTU0lEX0xFTik7CisJCQkJcEl0ZW1TU0lEID0gKFBXTEFOX0lFX1NTSUQpcEJTUy0+YWJ5U1NJRDsKKwkJCQltZW1zZXQocExpc3QtPnNCU1NJRExpc3RbaWldLmFieVNTSUQsIDAsIFdMQU5fU1NJRF9NQVhMRU4gKyAxKTsKKwkJCQltZW1jcHkocExpc3QtPnNCU1NJRExpc3RbaWldLmFieVNTSUQsIHBJdGVtU1NJRC0+YWJ5U1NJRCwgcEl0ZW1TU0lELT5sZW4pOworCQkJCWlmIChXTEFOX0dFVF9DQVBfSU5GT19FU1MocEJTUy0+d0NhcEluZm8pKSB7CisJCQkJCXBMaXN0LT5zQlNTSURMaXN0W2lpXS5ieU5ldFR5cGUgPSBJTkZSQTsKKwkJCQl9IGVsc2UgeworCQkJCQlwTGlzdC0+c0JTU0lETGlzdFtpaV0uYnlOZXRUeXBlID0gQURIT0M7CisJCQkJfQorCQkJCWlmIChXTEFOX0dFVF9DQVBfSU5GT19QUklWQUNZKHBCU1MtPndDYXBJbmZvKSkgeworCQkJCQlwTGlzdC0+c0JTU0lETGlzdFtpaV0uYldFUE9uID0gVFJVRTsKKwkJCQl9IGVsc2UgeworCQkJCQlwTGlzdC0+c0JTU0lETGlzdFtpaV0uYldFUE9uID0gRkFMU0U7CisJCQkJfQorCQkJCWlpKys7CisJCQkJaWYgKGlpID49IHBMaXN0LT51SXRlbSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoY29weV90b191c2VyKHBSZXEtPmRhdGEsIHBMaXN0LCBzaXplb2YoU0JTU0lETGlzdCkgKyAoc0xpc3QudUl0ZW0gKiBzaXplb2YoU0JTU0lESXRlbSkpKSkgeworCQkJcmVzdWx0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWtmcmVlKHBMaXN0KTsKKwkJcFJlcS0+d1Jlc3VsdCA9IDA7CisJCWJyZWFrOworCisJY2FzZSBXTEFOX0NNRF9HRVRfTUlCOgorCQlpZiAoY29weV90b191c2VyKHBSZXEtPmRhdGEsICYocERldmljZS0+czgwMl8xMUNvdW50ZXIpLCBzaXplb2YoU0RvdDExTUlCQ291bnQpKSkgeworCQkJcmVzdWx0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCisJY2FzZSBXTEFOX0NNRF9HRVRfU1RBVDoKKwkJaWYgKGNvcHlfdG9fdXNlcihwUmVxLT5kYXRhLCAmKHBEZXZpY2UtPnNjU3RhdGlzdGljKSwgc2l6ZW9mKFNTdGF0Q291bnRlcikpKSB7CisJCQlyZXN1bHQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBXTEFOX0NNRF9TVE9QX01BQzoKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfU1RPUF9NQUNcbiIpOworCQkvKiBUb2RvIHh4eHh4eCAqLworCQluZXRpZl9zdG9wX3F1ZXVlKHBEZXZpY2UtPmRldik7CisJCXNwaW5fbG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOworCQlpZiAocERldmljZS0+YlJhZGlvT2ZmID09IEZBTFNFKSB7CisJCQlDQVJEYlJhZGlvUG93ZXJPZmYocERldmljZSk7CisJCX0KKwkJcERldmljZS0+YkxpbmtQYXNzID0gRkFMU0U7CisJCUNvbnRyb2x2TWFza0J5dGUocERldmljZSwgTUVTU0FHRV9SRVFVRVNUX01BQ1JFRywgTUFDX1JFR19QQVBFREVMQVksIExFRFNUU19TVFMsIExFRFNUU19TTE9XKTsKKwkJbWVtc2V0KHBNZ210LT5hYnlDdXJyQlNTSUQsIDAsIDYpOworCQlwTWdtdC0+ZUN1cnJTdGF0ZSA9IFdNQUNfU1RBVEVfSURMRTsKKwkJLyogZGVsX3RpbWVyKCZwRGV2aWNlLT5zVGltZXJDb21tYW5kKTsgKi8KKwkJLyogZGVsX3RpbWVyKCZwTWdtdC0+c1RpbWVyU2Vjb25kQ2FsbGJhY2spOyAqLworCQlwRGV2aWNlLT5iQ21kUnVubmluZyA9IEZBTFNFOworCQlzcGluX3VubG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOworCQlicmVhazsKKworCWNhc2UgV0xBTl9DTURfU1RBUlRfTUFDOgorCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJXTEFOX0NNRF9TVEFSVF9NQUNcbiIpOworCQkvKiBUb2RvIHh4eHh4eHggKi8KKwkJaWYgKHBEZXZpY2UtPmJSYWRpb09mZiA9PSBUUlVFKQorCQkJQ0FSRGJSYWRpb1Bvd2VyT24ocERldmljZSk7CisJCWJyZWFrOworCisJY2FzZSBXTEFOX0NNRF9TRVRfSE9TVEFQRDoKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfU0VUX0hPU1RBUERcbiIpOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmc1ZhbHVlLCBwUmVxLT5kYXRhLCBzaXplb2YoU0NtZFZhbHVlKSkpIHsKKwkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlpZiAoc1ZhbHVlLmR3VmFsdWUgPT0gMSkgeworCQkJaWYgKHZ0NjY1Nl9ob3N0YXBfc2V0X2hvc3RhcGQocERldmljZSwgMSwgMSkgPT0gMCkgeworCQkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkVuYWJsZSBIT1NUQVBcbiIpOworCQkJfSBlbHNlIHsKKwkJCQlyZXN1bHQgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJdnQ2NjU2X2hvc3RhcF9zZXRfaG9zdGFwZChwRGV2aWNlLCAwLCAxKTsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkRpc2FibGUgSE9TVEFQXG4iKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgV0xBTl9DTURfU0VUX0hPU1RBUERfU1RBOgorCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJXTEFOX0NNRF9TRVRfSE9TVEFQRF9TVEFcbiIpOworCQlicmVhazsKKworCWNhc2UgV0xBTl9DTURfU0VUXzgwMl8xWDoKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiV0xBTl9DTURfU0VUXzgwMl8xWFxuIik7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmc1ZhbHVlLCBwUmVxLT5kYXRhLCBzaXplb2YoU0NtZFZhbHVlKSkpIHsKKwkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzVmFsdWUuZHdWYWx1ZSA9PSAxKSB7CisJCQlwRGV2aWNlLT5iRW5hYmxlODAyMXggPSBUUlVFOworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiRW5hYmxlIDgwMi4xeFxuIik7CisJCX0gZWxzZSB7CisJCQlwRGV2aWNlLT5iRW5hYmxlODAyMXggPSBGQUxTRTsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkRpc2FibGUgODAyLjF4XG4iKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgV0xBTl9DTURfU0VUX0hPU1RfV0VQOgorCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJXTEFOX0NNRF9TRVRfSE9TVF9XRVBcbiIpOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnNWYWx1ZSwgcFJlcS0+ZGF0YSwgc2l6ZW9mKFNDbWRWYWx1ZSkpKSB7CisJCQlyZXN1bHQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc1ZhbHVlLmR3VmFsdWUgPT0gMSkgeworCQkJcERldmljZS0+YkVuYWJsZUhvc3RXRVAgPSBUUlVFOworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiRW5hYmxlIEhvc3RXRVBcbiIpOworCQl9IGVsc2UgeworCQkJcERldmljZS0+YkVuYWJsZUhvc3RXRVAgPSBGQUxTRTsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIkRpc2FibGUgSG9zdFdFUFxuIik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fQ01EX1NFVF9XUEE6CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIldMQU5fQ01EX1NFVF9XUEFcbiIpOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmc1ZhbHVlLCBwUmVxLT5kYXRhLCBzaXplb2YoU0NtZFZhbHVlKSkpIHsKKwkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlpZiAoc1ZhbHVlLmR3VmFsdWUgPT0gMSkgeworCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAidXAgd3BhZGV2XG4iKTsKKwkJCW1lbWNweShwRGV2aWNlLT53cGFkZXYtPmRldl9hZGRyLCBwRGV2aWNlLT5kZXYtPmRldl9hZGRyLAorCQkJICAgICAgIEVUSF9BTEVOKTsKKwkJCXBEZXZpY2UtPmJXUEFERVZVcCA9IFRSVUU7CisJCX0gZWxzZSB7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJjbG9zZSB3cGFkZXZcbiIpOworCQkJcERldmljZS0+YldQQURFVlVwID0gRkFMU0U7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fQ01EX0FQX1NUQVJUOgorCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJXTEFOX0NNRF9BUF9TVEFSVFxuIik7CisJCWlmIChwRGV2aWNlLT5iUmFkaW9PZmYgPT0gVFJVRSkgeworCQkJQ0FSRGJSYWRpb1Bvd2VyT24ocERldmljZSk7CisJCQlhZGRfdGltZXIoJnBNZ210LT5zVGltZXJTZWNvbmRDYWxsYmFjayk7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZzU3RhcnRBUENtZCwgcFJlcS0+ZGF0YSwgc2l6ZW9mKFNDbWRTdGFydEFQKSkpIHsKKwkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzU3RhcnRBUENtZC53QlNTVHlwZSA9PSBBUCkgeworCQkJcE1nbXQtPmVDb25maWdNb2RlID0gV01BQ19DT05GSUdfQVA7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJpb2N0IHNldCB0byBBUCBtb2RlXG4iKTsKKwkJfSBlbHNlIHsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gImlvY3QgQlNTIHR5cGUgbm90IHNldCB0byBBUCBtb2RlXG4iKTsKKwkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzU3RhcnRBUENtZC53QkJQVHlwZSA9PSBQSFk4MDIxMWcpIHsKKwkJCXBNZ210LT5ieUFQQkJUeXBlID0gUEhZX1RZUEVfMTFHOworCQl9IGVsc2UgaWYgKHNTdGFydEFQQ21kLndCQlBUeXBlID09IFBIWTgwMjExYSkgeworCQkJcE1nbXQtPmJ5QVBCQlR5cGUgPSBQSFlfVFlQRV8xMUE7CisJCX0gZWxzZSB7CisJCQlwTWdtdC0+YnlBUEJCVHlwZSA9IFBIWV9UWVBFXzExQjsKKwkJfQorCisJCXBJdGVtU1NJRCA9IChQV0xBTl9JRV9TU0lEKXNTdGFydEFQQ21kLnNzaWQ7CisJCWlmIChwSXRlbVNTSUQtPmxlbiA+IFdMQU5fU1NJRF9NQVhMRU4gKyAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW1lbXNldChwTWdtdC0+YWJ5RGVzaXJlU1NJRCwgMCwgV0xBTl9JRUhEUl9MRU4gKyBXTEFOX1NTSURfTUFYTEVOICsgMSk7CisJCW1lbWNweShwTWdtdC0+YWJ5RGVzaXJlU1NJRCwgcEl0ZW1TU0lELCBwSXRlbVNTSUQtPmxlbiArIFdMQU5fSUVIRFJfTEVOKTsKKworCQlpZiAoKHNTdGFydEFQQ21kLnVDaGFubmVsID4gMCkgJiYgKHNTdGFydEFQQ21kLnVDaGFubmVsIDw9IDE0KSkKKwkJCXBEZXZpY2UtPnVDaGFubmVsID0gc1N0YXJ0QVBDbWQudUNoYW5uZWw7CisKKwkJaWYgKChzU3RhcnRBUENtZC51QmVhY29uSW50ID49IDIwKSAmJiAoc1N0YXJ0QVBDbWQudUJlYWNvbkludCA8PSAxMDAwKSkKKwkJCXBNZ210LT53SUJTU0JlYWNvblBlcmlvZCA9IHNTdGFydEFQQ21kLnVCZWFjb25JbnQ7CisJCWVsc2UKKwkJCXBNZ210LT53SUJTU0JlYWNvblBlcmlvZCA9IDEwMDsKKworCQlpZiAoc1N0YXJ0QVBDbWQuYlNoYXJlS2V5QXV0aCA9PSBUUlVFKSB7CisJCQlwTWdtdC0+YlNoYXJlS2V5QWxnb3JpdGhtID0gVFJVRTsKKwkJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIlNoYXJlIEtleVxuIik7CisJCX0gZWxzZSB7CisJCQlwTWdtdC0+YlNoYXJlS2V5QWxnb3JpdGhtID0gRkFMU0U7CisJCQlEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJPcGVuIFN5c3RlbVxuIik7CisJCX0KKwkJbWVtY3B5KHBNZ210LT5hYnlJQlNTU3VwcFJhdGVzLCBhYnlTdXBwUmF0ZXMsIDYpOworCisJCWlmIChzU3RhcnRBUENtZC5ieUJhc2ljUmF0ZSAmIEJJVDMpIHsKKwkJCXBNZ210LT5hYnlJQlNTU3VwcFJhdGVzWzJdIHw9IEJJVDc7CisJCQlwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlc1szXSB8PSBCSVQ3OworCQkJcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbNF0gfD0gQklUNzsKKwkJCXBNZ210LT5hYnlJQlNTU3VwcFJhdGVzWzVdIHw9IEJJVDc7CisJCX0gZWxzZSBpZiAoc1N0YXJ0QVBDbWQuYnlCYXNpY1JhdGUgJiBCSVQyKSB7CisJCQlwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlc1syXSB8PSBCSVQ3OworCQkJcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbM10gfD0gQklUNzsKKwkJCXBNZ210LT5hYnlJQlNTU3VwcFJhdGVzWzRdIHw9IEJJVDc7CisJCX0gZWxzZSBpZiAoc1N0YXJ0QVBDbWQuYnlCYXNpY1JhdGUgJiBCSVQxKSB7CisJCQlwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlc1syXSB8PSBCSVQ3OworCQkJcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbM10gfD0gQklUNzsKKwkJfSBlbHNlIGlmIChzU3RhcnRBUENtZC5ieUJhc2ljUmF0ZSAmIEJJVDEpIHsKKwkJCXBNZ210LT5hYnlJQlNTU3VwcFJhdGVzWzJdIHw9IEJJVDc7CisJCX0gZWxzZSB7CisJCQkvKiBkZWZhdWx0IDEsMk0gKi8KKwkJCXBNZ210LT5hYnlJQlNTU3VwcFJhdGVzWzJdIHw9IEJJVDc7CisJCQlwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlc1szXSB8PSBCSVQ3OworCQl9CisKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiU3VwcG9ydCBSYXRlPSAleCAleCAleCAleFxuIiwKKwkJCXBNZ210LT5hYnlJQlNTU3VwcFJhdGVzWzJdLAorCQkJcE1nbXQtPmFieUlCU1NTdXBwUmF0ZXNbM10sCisJCQlwTWdtdC0+YWJ5SUJTU1N1cHBSYXRlc1s0XSwKKwkJCXBNZ210LT5hYnlJQlNTU3VwcFJhdGVzWzVdKTsKKworCQluZXRpZl9zdG9wX3F1ZXVlKHBEZXZpY2UtPmRldik7CisJCXNwaW5fbG9ja19pcnEoJnBEZXZpY2UtPmxvY2spOworCQliU2NoZWR1bGVDb21tYW5kKCh2b2lkICopcERldmljZSwgV0xBTl9DTURfUlVOX0FQLCBOVUxMKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fQ01EX0dFVF9OT0RFX0NOVDoKKwkJY2JMaXN0Q291bnQgPSAwOworCQlwTm9kZSA9ICYocE1nbXQtPnNOb2RlREJUYWJsZVswXSk7CisJCWZvciAoaWkgPSAwOyBpaSA8IChNQVhfTk9ERV9OVU0gKyAxKTsgaWkrKykgeworCQkJcE5vZGUgPSAmKHBNZ210LT5zTm9kZURCVGFibGVbaWldKTsKKwkJCWlmICghcE5vZGUtPmJBY3RpdmUpCisJCQkJY29udGludWU7CisJCQljYkxpc3RDb3VudCsrOworCQl9CisKKwkJc05vZGVMaXN0LnVJdGVtID0gY2JMaXN0Q291bnQ7CisJCWlmIChjb3B5X3RvX3VzZXIocFJlcS0+ZGF0YSwgJnNOb2RlTGlzdCwgc2l6ZW9mKFNOb2RlTGlzdCkpKSB7CisJCQlyZXN1bHQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJcFJlcS0+d1Jlc3VsdCA9IDA7CisJCWJyZWFrOworCisJY2FzZSBXTEFOX0NNRF9HRVRfTk9ERV9MSVNUOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnNOb2RlTGlzdCwgcFJlcS0+ZGF0YSwgc2l6ZW9mKFNOb2RlTGlzdCkpKSB7CisJCQlyZXN1bHQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJcE5vZGVMaXN0ID0gKFBTTm9kZUxpc3Qpa21hbGxvYyhzaXplb2YoU05vZGVMaXN0KSArIChzTm9kZUxpc3QudUl0ZW0gKiBzaXplb2YoU05vZGVJdGVtKSksIChpbnQpR0ZQX0FUT01JQyk7CisJCWlmIChwTm9kZUxpc3QgPT0gTlVMTCkgeworCQkJcmVzdWx0ID0gLUVOT01FTTsKKwkJCWJyZWFrOworCQl9CisJCXBOb2RlTGlzdC0+dUl0ZW0gPSBzTm9kZUxpc3QudUl0ZW07CisJCXBOb2RlID0gJihwTWdtdC0+c05vZGVEQlRhYmxlWzBdKTsKKwkJZm9yIChpaSA9IDAsIGpqID0gMDsgaWkgPCAoTUFYX05PREVfTlVNICsgMSk7IGlpKyspIHsKKwkJCXBOb2RlID0gJihwTWdtdC0+c05vZGVEQlRhYmxlW2lpXSk7CisJCQlpZiAocE5vZGUtPmJBY3RpdmUpIHsKKwkJCQlwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0ud0FJRCA9IHBOb2RlLT53QUlEOworCQkJCW1lbWNweShwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0uYWJ5TUFDQWRkciwgcE5vZGUtPmFieU1BQ0FkZHIsIFdMQU5fQUREUl9MRU4pOworCQkJCXBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS53VHhEYXRhUmF0ZSA9IHBOb2RlLT53VHhEYXRhUmF0ZTsKKwkJCQlwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0ud0luQWN0aXZlQ291bnQgPSAoV09SRClwTm9kZS0+dUluQWN0aXZlQ291bnQ7CisJCQkJcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLndFblF1ZXVlQ250ID0gKFdPUkQpcE5vZGUtPndFblF1ZXVlQ250OworCQkJCXBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS53RmxhZ3MgPSAoV09SRClwTm9kZS0+ZHdGbGFnczsKKwkJCQlwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0uYlBXQml0T24gPSBwTm9kZS0+YlBTRW5hYmxlOworCQkJCXBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS5ieUtleUluZGV4ID0gcE5vZGUtPmJ5S2V5SW5kZXg7CisJCQkJcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLndXZXBLZXlMZW5ndGggPSBwTm9kZS0+dVdlcEtleUxlbmd0aDsKKwkJCQltZW1jcHkoJihwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0uYWJ5V2VwS2V5WzBdKSwgJihwTm9kZS0+YWJ5V2VwS2V5WzBdKSwgV0VQX0tFWU1BWExFTik7CisJCQkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAia2V5PSAlMi4yWDolMi4yWDolMi4yWDolMi4yWDolMi4yWFxuIiwKKwkJCQkJcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLmFieVdlcEtleVswXSwKKwkJCQkJcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLmFieVdlcEtleVsxXSwKKwkJCQkJcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLmFieVdlcEtleVsyXSwKKwkJCQkJcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLmFieVdlcEtleVszXSwKKwkJCQkJcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLmFieVdlcEtleVs0XSk7CisJCQkJcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLmJJc0luRmFsbGJhY2sgPSBwTm9kZS0+YklzSW5GYWxsYmFjazsKKwkJCQlwTm9kZUxpc3QtPnNOb2RlTGlzdFtqal0udVR4RmFpbHVyZXMgPSBwTm9kZS0+dVR4RmFpbHVyZXM7CisJCQkJcE5vZGVMaXN0LT5zTm9kZUxpc3RbampdLnVUeEF0dGVtcHRzID0gcE5vZGUtPnVUeEF0dGVtcHRzOworCQkJCXBOb2RlTGlzdC0+c05vZGVMaXN0W2pqXS53RmFpbHVyZVJhdGlvID0gKFdPUkQpcE5vZGUtPnVGYWlsdXJlUmF0aW87CisJCQkJamorKzsKKwkJCQlpZiAoamogPj0gcE5vZGVMaXN0LT51SXRlbSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihwUmVxLT5kYXRhLCBwTm9kZUxpc3QsIHNpemVvZihTTm9kZUxpc3QpICsgKHNOb2RlTGlzdC51SXRlbSAqIHNpemVvZihTTm9kZUl0ZW0pKSkpIHsKKwkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlrZnJlZShwTm9kZUxpc3QpOworCQlwUmVxLT53UmVzdWx0ID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIDB4RkY6CisJCW1lbXNldCh3cGFfUmVzdWx0LmlmbmFtZSwgMCwgc2l6ZW9mKHdwYV9SZXN1bHQuaWZuYW1lKSk7CisJCXdwYV9SZXN1bHQucHJvdG8gPSAwOworCQl3cGFfUmVzdWx0LmtleV9tZ210ID0gMDsKKwkJd3BhX1Jlc3VsdC5lYXBfdHlwZSA9IDA7CisJCXdwYV9SZXN1bHQuYXV0aGVudGljYXRlZCA9IEZBTFNFOworCQlwRGV2aWNlLT5mV1BBX0F1dGhlbmVkID0gRkFMU0U7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmd3BhX1Jlc3VsdCwgcFJlcS0+ZGF0YSwgc2l6ZW9mKHdwYV9SZXN1bHQpKSkgeworCQkJcmVzdWx0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCS8qIGZvciBzb21lIEFQIG1heWJlIGdvb2QgYXV0aGVudGljYXRlICovCisJCWlmICh3cGFfUmVzdWx0LmtleV9tZ210ID09IDB4MjApCisJCQlwTWdtdC0+Q2lzY29fY2NrbSA9IDE7CisJCWVsc2UKKwkJCXBNZ210LT5DaXNjb19jY2ttID0gMDsKKworCQlpZiAod3BhX1Jlc3VsdC5hdXRoZW50aWNhdGVkID09IFRSVUUpIHsKKwkJCXsKKwkJCQl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CisKKwkJCQlwSXRlbVNTSUQgPSAoUFdMQU5fSUVfU1NJRClwTWdtdC0+YWJ5Q3VyclNTSUQ7CisJCQkJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOworCQkJCXdycXUuZGF0YS5mbGFncyA9IFJUX1dQQUNPTk5FQ1RFRF9FVkVOVF9GTEFHOworCQkJCXdycXUuZGF0YS5sZW5ndGggPSBwSXRlbVNTSUQtPmxlbjsKKwkJCQl3aXJlbGVzc19zZW5kX2V2ZW50KHBEZXZpY2UtPmRldiwgSVdFVkNVU1RPTSwgJndycXUsIHBJdGVtU1NJRC0+YWJ5U1NJRCk7CisJCQl9CisKKwkJCXBEZXZpY2UtPmZXUEFfQXV0aGVuZWQgPSBUUlVFOyAvKiBpcyBzdWNjZXNzZnVsIHBlZXIgdG8gd3BhX1Jlc3VsdC5hdXRoZW50aWNhdGVkPyAqLworCQl9CisKKwkJcFJlcS0+d1Jlc3VsdCA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiUHJpdmF0ZSBjb21tYW5kIG5vdCBzdXBwb3J0Li5cbiIpOworCX0KKworCXJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMKaW5kZXggMWZmMzk0MC4uMjc1MjFiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWluX3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFpbl91c2IuYwpAQCAtNjExLDE3ICs2MTEsMTAgQEAKIAogICAgICAgICAvLyBpZiBleGlzdCBTVyBuZXR3b3JrIGFkZHJlc3MsIHVzZSBTVyBuZXR3b3JrIGFkZHJlc3MuCiAKLSAgICAgICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJOZXR3b3JrIGFkZHJlc3MgPSAlMDJ4LSUwMngtJTAyeD0lMDJ4LSUwMngtJTAyeFxuIiwKLSAgICAgICAgICAgIHBEZXZpY2UtPmFieUN1cnJlbnROZXRBZGRyWzBdLAotICAgICAgICAgICAgcERldmljZS0+YWJ5Q3VycmVudE5ldEFkZHJbMV0sCi0gICAgICAgICAgICBwRGV2aWNlLT5hYnlDdXJyZW50TmV0QWRkclsyXSwKLSAgICAgICAgICAgIHBEZXZpY2UtPmFieUN1cnJlbnROZXRBZGRyWzNdLAotICAgICAgICAgICAgcERldmljZS0+YWJ5Q3VycmVudE5ldEFkZHJbNF0sCi0gICAgICAgICAgICBwRGV2aWNlLT5hYnlDdXJyZW50TmV0QWRkcls1XSk7CisJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyJOZXR3b3JrIGFkZHJlc3MgPSAlcE1cbiIsCisJCXBEZXZpY2UtPmFieUN1cnJlbnROZXRBZGRyKTsKICAgICB9CiAKLQotCiAgICAgLy8gU2V0IEJCIGFuZCBwYWNrZXQgdHlwZSBhdCB0aGUgc2FtZSB0aW1lLgogICAgIC8vIFNldCBTaG9ydCBTbG90IFRpbWUsIHhJRlMsIGFuZCBSU1BJTkYuCiAgICAgaWYgKHBEZXZpY2UtPmJ5QkJUeXBlID09IEJCX1RZUEVfMTFBKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3dtZ3IuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd21nci5jCmluZGV4IGQ2Nzc0OGYuLmYwOGUyZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd21nci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd21nci5jCkBAIC0yNDc3LDE0ICsyNDc3LDggQEAKICAgICBpZiAocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfRVNTX0FQKSB7CiAgICAgICAgIC8vIEFQIG1vZGUgQlNTSUQgPSBNQUMgYWRkcgogICAgICAgICBtZW1jcHkocE1nbXQtPmFieUN1cnJCU1NJRCwgcE1nbXQtPmFieU1BQ0FkZHIsIFdMQU5fQUREUl9MRU4pOwotICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9JTkZPLCBLRVJOX0lORk8iQVAgYmVhY29uIGNyZWF0ZWQgQlNTSUQ6JTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMnggXG4iLAotICAgICAgICAgICAgICAgICAgICAgIHBNZ210LT5hYnlDdXJyQlNTSURbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPmFieUN1cnJCU1NJRFsxXSwKLSAgICAgICAgICAgICAgICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzJdLAotICAgICAgICAgICAgICAgICAgICAgIHBNZ210LT5hYnlDdXJyQlNTSURbM10sCi0gICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPmFieUN1cnJCU1NJRFs0XSwKLSAgICAgICAgICAgICAgICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzVdCi0gICAgICAgICAgICAgICAgICAgICk7CisJCURCR19QUlQoTVNHX0xFVkVMX0lORk8sIEtFUk5fSU5GTyJBUCBiZWFjb24gY3JlYXRlZCBCU1NJRDoiCisJCQkiJXBNXG4iLCBwTWdtdC0+YWJ5Q3VyckJTU0lEKTsKICAgICB9CiAKICAgICBpZiAocE1nbXQtPmVDdXJyTW9kZSA9PSBXTUFDX01PREVfSUJTU19TVEEpIHsKQEAgLTI1MDYsMTQgKzI1MDAsOCBAQAogICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzBdIHw9IElFRUVfQUREUl9VTklWRVJTQUw7CiAKIAotICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9JTkZPLCBLRVJOX0lORk8iQWRob2MgYmVhY29uIGNyZWF0ZWQgYnNzaWQ6JTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMnggXG4iLAotICAgICAgICAgICAgICAgICAgICAgIHBNZ210LT5hYnlDdXJyQlNTSURbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPmFieUN1cnJCU1NJRFsxXSwKLSAgICAgICAgICAgICAgICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzJdLAotICAgICAgICAgICAgICAgICAgICAgIHBNZ210LT5hYnlDdXJyQlNTSURbM10sCi0gICAgICAgICAgICAgICAgICAgICAgcE1nbXQtPmFieUN1cnJCU1NJRFs0XSwKLSAgICAgICAgICAgICAgICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzVdCi0gICAgICAgICAgICAgICAgICAgICk7CisJCURCR19QUlQoTVNHX0xFVkVMX0lORk8sIEtFUk5fSU5GTyJBZGhvYyBiZWFjb24gY3JlYXRlZCBic3NpZDoiCisJCQkiJXBNXG4iLCBwTWdtdC0+YWJ5Q3VyckJTU0lEKTsKICAgICB9CiAKICAgICAvLyBzZXQgQlNTSUQgZmlsdGVyCkBAIC0yODc4LDE0ICsyODY2LDggQEAKICAgICAgICAgICAgIENvbnRyb2x2TWFza0J5dGUocERldmljZSxNRVNTQUdFX1JFUVVFU1RfTUFDUkVHLE1BQ19SRUdfUEFQRURFTEFZLExFRFNUU19TVFMsTEVEU1RTX0lOVEVSKTsKICAgICAgICAgICAgIG1lbWNweShwRGV2aWNlLT5hYnlCU1NJRCwgcEN1cnItPmFieUJTU0lELCBXTEFOX0JTU0lEX0xFTik7CiAKLSAgICAgICAgICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iSm9pbiBJQlNTIG9rOiUwMngtJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4IFxuIiwKLSAgICAgICAgICAgICAgICAgIHBNZ210LT5hYnlDdXJyQlNTSURbMF0sCi0gICAgICAgICAgICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzFdLAotICAgICAgICAgICAgICAgICAgcE1nbXQtPmFieUN1cnJCU1NJRFsyXSwKLSAgICAgICAgICAgICAgICAgIHBNZ210LT5hYnlDdXJyQlNTSURbM10sCi0gICAgICAgICAgICAgICAgICBwTWdtdC0+YWJ5Q3VyckJTU0lEWzRdLAotICAgICAgICAgICAgICAgICAgcE1nbXQtPmFieUN1cnJCU1NJRFs1XQotICAgICAgICAgICAgICAgICk7CisJCURCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8iSm9pbiBJQlNTIG9rOiVwTVxuIiwKKwkJCXBNZ210LT5hYnlDdXJyQlNTSUQpOwogICAgICAgICAgICAgLy8gUHJlYW1ibGUgdHlwZSBhdXRvLXN3aXRjaDogaWYgQVAgY2FuIHJlY2VpdmUgc2hvcnQtcHJlYW1ibGUgY2FwLAogICAgICAgICAgICAgLy8gYW5kIGlmIHJlZ2lzdHJ5IHNldHRpbmcgaXMgc2hvcnQgcHJlYW1ibGUgd2UgY2FuIHR1cm4gb24gdG9vLgogCkBAIC0yOTgzLDEzICsyOTY1LDggQEAKIAogICAgIG1lbWNweShwTWdtdC0+YWJ5Q3VyckJTU0lELCBwQ3Vyci0+YWJ5QlNTSUQsIDYpOwogCi0gICAgREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiU3luYzpzZXQgQ3VyckJTU0lEIGFkZHJlc3MgPSAlMDJ4LSUwMngtJTAyeD0lMDJ4LSUwMngtJTAyeFxuIiwKLSAgICAgICAgcE1nbXQtPmFieUN1cnJCU1NJRFswXSwKLSAgICAgICAgcE1nbXQtPmFieUN1cnJCU1NJRFsxXSwKLSAgICAgICAgcE1nbXQtPmFieUN1cnJCU1NJRFsyXSwKLSAgICAgICAgcE1nbXQtPmFieUN1cnJCU1NJRFszXSwKLSAgICAgICAgcE1nbXQtPmFieUN1cnJCU1NJRFs0XSwKLSAgICAgICAgcE1nbXQtPmFieUN1cnJCU1NJRFs1XSk7CisJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiU3luYzpzZXQgQ3VyckJTU0lEIGFkZHJlc3MgPSAiCisJCSIlcE1cbiIsIHBNZ210LT5hYnlDdXJyQlNTSUQpOwogCiAgICAgaWYgKHBDdXJyLT5lTmV0d29ya1R5cGVJblVzZSA9PSBQSFlfVFlQRV8xMUEpIHsKICAgICAgICAgaWYgKChwRGV2aWNlLT5lQ29uZmlnUEhZTW9kZSA9PSBQSFlfVFlQRV8xMUEpIHx8CkBAIC00MzM0LDE0ICs0MzExLDggQEAKICAgICAgICAgc0ZyYW1lLnBCdWYgPSAoUEJZVEUpcFJ4UGFja2V0LT5wODAyMTFIZWFkZXI7CiAgICAgICAgIHZNZ3JEZWNvZGVQcm9iZVJlcXVlc3QoJnNGcmFtZSk7CiAvKgotICAgICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJQcm9iZSByZXF1ZXN0IHJ4Ok1BQyBhZGRyOiUwMngtJTAyeC0lMDJ4PSUwMngtJTAyeC0lMDJ4IFxuIiwKLSAgICAgICAgICAgICAgICAgIHNGcmFtZS5wSGRyLT5zQTMuYWJ5QWRkcjJbMF0sCi0gICAgICAgICAgICAgICAgICBzRnJhbWUucEhkci0+c0EzLmFieUFkZHIyWzFdLAotICAgICAgICAgICAgICAgICAgc0ZyYW1lLnBIZHItPnNBMy5hYnlBZGRyMlsyXSwKLSAgICAgICAgICAgICAgICAgIHNGcmFtZS5wSGRyLT5zQTMuYWJ5QWRkcjJbM10sCi0gICAgICAgICAgICAgICAgICBzRnJhbWUucEhkci0+c0EzLmFieUFkZHIyWzRdLAotICAgICAgICAgICAgICAgICAgc0ZyYW1lLnBIZHItPnNBMy5hYnlBZGRyMls1XQotICAgICAgICAgICAgICAgICk7CisJREJHX1BSVChNU0dfTEVWRUxfREVCVUcsIEtFUk5fSU5GTyAiUHJvYmUgcmVxdWVzdCByeDpNQUMgYWRkcjolcE1cbiIsCisJCXNGcmFtZS5wSGRyLT5zQTMuYWJ5QWRkcjIpOwogKi8KICAgICAgICAgaWYgKHNGcmFtZS5wU1NJRC0+bGVuICE9IDApIHsKICAgICAgICAgICAgIGlmIChzRnJhbWUucFNTSUQtPmxlbiAhPSAoKFBXTEFOX0lFX1NTSUQpcE1nbXQtPmFieUN1cnJTU0lEKS0+bGVuKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93cGFjdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvd3BhY3RsLmMKaW5kZXggOTIxNmRmMC4uMmZhNGY4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni93cGFjdGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3dwYWN0bC5jCkBAIC0yMjksNiArMjI5LDkgQEAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKKwlpZiAocGFyYW0tPnUud3BhX2tleS5rZXkgJiYgcGFyYW0tPnUud3BhX2tleS5rZXlfbGVuID4gc2l6ZW9mKGFieUtleSkpCisJCXJldHVybiAtRUlOVkFMOworCiAgICAgc3Bpbl91bmxvY2tfaXJxKCZwRGV2aWNlLT5sb2NrKTsKICAgICBpZihwYXJhbS0+dS53cGFfa2V5LmtleSAmJiBmY3Bma2VybmVsKSB7CiAgICAgICAgbWVtY3B5KCZhYnlLZXlbMF0sIHBhcmFtLT51LndwYV9rZXkua2V5LCBwYXJhbS0+dS53cGFfa2V5LmtleV9sZW4pOwpAQCAtMjY5LDYgKzI3MiwxMCBAQAogICAgICAgICByZXR1cm4gcmV0OwogCX0KIAorCisJaWYgKHBhcmFtLT51LndwYV9rZXkuc2VxICYmIHBhcmFtLT51LndwYV9rZXkuc2VxX2xlbiA+IHNpemVvZihhYnlTZXEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogICAgIHNwaW5fdW5sb2NrX2lycSgmcERldmljZS0+bG9jayk7CiAgICAgICAgIGlmKHBhcmFtLT51LndwYV9rZXkuc2VxICYmIGZjcGZrZXJuZWwpIHsKICAgICAgICAgICAgbWVtY3B5KCZhYnlTZXFbMF0sIHBhcmFtLT51LndwYV9rZXkuc2VxLCBwYXJhbS0+dS53cGFfa2V5LnNlcV9sZW4pOwpAQCAtNzcyLDkgKzc3OSwxNCBAQAogICAgIERCR19QUlQoTVNHX0xFVkVMX0RFQlVHLCBLRVJOX0lORk8gIndwYV9pZV9sZW4gPSAlZFxuIiwgcGFyYW0tPnUud3BhX2Fzc29jaWF0ZS53cGFfaWVfbGVuKTsKICAgICBEQkdfUFJUKE1TR19MRVZFTF9ERUJVRywgS0VSTl9JTkZPICJSb2FtaW5nIGRCbSA9ICVkXG4iLCBwYXJhbS0+dS53cGFfYXNzb2NpYXRlLnJvYW1fZGJtKTsgIC8vRGF2aWR3YW5nCiAKLQlpZiAocGFyYW0tPnUud3BhX2Fzc29jaWF0ZS53cGFfaWUgJiYKLQkgICAgY29weV9mcm9tX3VzZXIoJmFieVdQQUlFWzBdLCBwYXJhbS0+dS53cGFfYXNzb2NpYXRlLndwYV9pZSwgcGFyYW0tPnUud3BhX2Fzc29jaWF0ZS53cGFfaWVfbGVuKSkKLQkgICAgcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBhcmFtLT51LndwYV9hc3NvY2lhdGUud3BhX2llKSB7CisJCWlmIChwYXJhbS0+dS53cGFfYXNzb2NpYXRlLndwYV9pZV9sZW4gPiBzaXplb2YoYWJ5V1BBSUUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZhYnlXUEFJRVswXSwgcGFyYW0tPnUud3BhX2Fzc29jaWF0ZS53cGFfaWUsCisJCQkJCXBhcmFtLT51LndwYV9hc3NvY2lhdGUud3BhX2llX2xlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CiAKIAlpZiAocGFyYW0tPnUud3BhX2Fzc29jaWF0ZS5tb2RlID09IDEpCiAJICAgIHBNZ210LT5lQ29uZmlnTW9kZSA9IFdNQUNfQ09ORklHX0lCU1NfU1RBOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dpbmJvbmQvcGh5X2NhbGlicmF0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uYwppbmRleCBjNWEwN2ZiLi43N2EzZmZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2luYm9uZC9waHlfY2FsaWJyYXRpb24uYwpAQCAtMjQsNyArMjQsNyBAQAogCiAjZGVmaW5lIEFHX0NPTlNUICAgICAgICAwLjYwNzI1MjkzNTAKICNkZWZpbmUgRklYRUQoWCkgICAgICAgICgoczMyKSgoWCkgKiAzMjc2OC4wKSkKLSNkZWZpbmUgREVHMlJBRChYKSAgICAgIDAuMDE3NDUzICogKFgpCisjZGVmaW5lIERFRzJSQUQoWCkgICAgICAoMC4wMTc0NTMgKiAoWCkpCiAKIHN0YXRpYyBjb25zdCBzMzIgQW5nbGVzW10gPSB7CiAJRklYRUQoREVHMlJBRCg0NS4wKSksICAgICBGSVhFRChERUcyUkFEKDI2LjU2NSkpLCAgIEZJWEVEKERFRzJSQUQoMTQuMDM2MikpLApAQCAtNTEsNyArNTEsNyBAQAogCWlmICgoZGF0YSAmIEJJVCgxMikpICE9IDApCiAJCXZhbCB8PSAweEZGRkZGMDAwOwogCi0JcmV0dXJuICgoczMyKSB2YWwpOworCXJldHVybiAoczMyKSB2YWw7CiB9CiAKIHUzMiBfczMyX3RvX3MxMyhzMzIgZGF0YSkKQEAgLTE4NCw3ICsxODQsNyBAQAogCWVsc2UKIAkJbiAtPSA1OwogCi0JcmV0dXJuIChuLzEwKTsKKwlyZXR1cm4gbi8xMDsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00NTUsNyArNDU1LDcgQEAKIAlwaHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDExLCAoMTE8PDI0KXwweDE5MDFENik7CiAJLyogMHgwNSAweDI0QzYwQSAgOyAwOTMxOCAgOyBDYWxpYnJhdGlvbiAoNmMpLiBzZXR0aW5nIFRYLVZHQSBnYWluOiBUWEdDSD0yICYgR1BLPTExMCAtLT4gdG8gYmUgb3B0aW1pemVkICovCiAJcGh5X3NldF9yZl9kYXRhKHBod19kYXRhLCA1LCAoNTw8MjQpfDB4MjRDNDhBKTsKLSAgICAgICAgLyogMHgwNiAweDA2ODgwQyAgOyAwMUEyMCAgOyBDYWxpYnJhdGlvbiAoNmQpLiBSWEdDSD0wMDsgUlhHQ0w9MTAwIDAwMCAoUlhWR0E9MzIpIC0tPiB0byBiZSBvcHRpbWl6ZWQgKi8KKwkvKiAweDA2IDB4MDY4ODBDICA7IDAxQTIwICA7IENhbGlicmF0aW9uICg2ZCkuIFJYR0NIPTAwOyBSWEdDTD0xMDAgMDAwIChSWFZHQT0zMikgLS0+IHRvIGJlIG9wdGltaXplZCAqLwogCXBoeV9zZXRfcmZfZGF0YShwaHdfZGF0YSwgNiwgKDY8PDI0KXwweDA2ODkwQyk7CiAJLyogMHgwMCAweEZERjFDMCAgOyAzRjdDNyAgOyBDYWxpYnJhdGlvbiAoNmUpLiB0dXJuIG9uIElRIGltYmFsYW5jZS9UZXN0IG1vZGUgKi8KIAlwaHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDAsICgwPDwyNCl8MHhGREYxQzApOwpAQCAtNTc3LDcgKzU3Nyw3IEBACiAJcGh5X3NldF9yZl9kYXRhKHBod19kYXRhLCAxMSwgKDExPDwyNCl8MHgxOTAxRDYpOwogCS8qIDB4MDUgMHgyNEM2MEEgIDsgMDkzMTggIDsgQ2FsaWJyYXRpb24gKDZjKS4gc2V0dGluZyBUWC1WR0EgZ2FpbjogVFhHQ0g9MiAmIEdQSz0xMTAgLS0+IHRvIGJlIG9wdGltaXplZCAqLwogCXBoeV9zZXRfcmZfZGF0YShwaHdfZGF0YSwgNSwgKDU8PDI0KXwweDI0QzQ4QSk7Ci0gICAgICAgIC8qIDB4MDYgMHgwNjg4MEMgIDsgMDFBMjAgIDsgQ2FsaWJyYXRpb24gKDZkKS4gUlhHQ0g9MDA7IFJYR0NMPTEwMCAwMDAgKFJYVkdBPTMyKSAtLT4gdG8gYmUgb3B0aW1pemVkICovCisJLyogMHgwNiAweDA2ODgwQyAgOyAwMUEyMCAgOyBDYWxpYnJhdGlvbiAoNmQpLiBSWEdDSD0wMDsgUlhHQ0w9MTAwIDAwMCAoUlhWR0E9MzIpIC0tPiB0byBiZSBvcHRpbWl6ZWQgKi8KIAlwaHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDYsICg2PDwyNCl8MHgwNjg5MEMpOwogCS8qIDB4MDAgMHhGREYxQzAgIDsgM0Y3QzcgIDsgQ2FsaWJyYXRpb24gKDZlKS4gdHVybiBvbiBJUSBpbWJhbGFuY2UvVGVzdCBtb2RlICovCiAJcGh5X3NldF9yZl9kYXRhKHBod19kYXRhLCAwLCAoMDw8MjQpfDB4RkRGMUMwKTsKQEAgLTk3NCw3ICs5NzQsNyBAQAogCXBoeV9zZXRfcmZfZGF0YShwaHdfZGF0YSwgMTEsICgxMTw8MjQpfDB4MTlCREQ2KTsgLyogMjAwNjA2MTIuMS5hIDB4MTkwNUQ2KTsgKi8KIAkvKiAweDA1IDB4MjRDNjBBICA7IDA5MzE4ICA7IENhbGlicmF0aW9uICg2YykuIHNldHRpbmcgVFgtVkdBIGdhaW46IFRYR0NIPTIgJiBHUEs9MTEwIC0tPiB0byBiZSBvcHRpbWl6ZWQgKi8KIAlwaHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDUsICg1PDwyNCl8MHgyNEM2MEEpOyAvKiAweDI0QzYwQSAoaGlnaCB0ZW1wZXJhdHVyZSkgKi8KLSAgICAgICAgLyogMHgwNiAweDA2ODgwQyAgOyAwMUEyMCAgOyBDYWxpYnJhdGlvbiAoNmQpLiBSWEdDSD0wMDsgUlhHQ0w9MTAwIDAwMCAoUlhWR0E9MzIpIC0tPiB0byBiZSBvcHRpbWl6ZWQgKi8KKwkvKiAweDA2IDB4MDY4ODBDICA7IDAxQTIwICA7IENhbGlicmF0aW9uICg2ZCkuIFJYR0NIPTAwOyBSWEdDTD0xMDAgMDAwIChSWFZHQT0zMikgLS0+IHRvIGJlIG9wdGltaXplZCAqLwogCXBoeV9zZXRfcmZfZGF0YShwaHdfZGF0YSwgNiwgKDY8PDI0KXwweDM0ODgwQyk7IC8qIDIwMDYwNjEyLjEuYSAweDA2ODkwQyk7ICovCiAJLyogMHgwMCAweEZERjFDMCAgOyAzRjdDNyAgOyBDYWxpYnJhdGlvbiAoNmUpLiB0dXJuIG9uIElRIGltYmFsYW5jZS9UZXN0IG1vZGUgKi8KIAlwaHlfc2V0X3JmX2RhdGEocGh3X2RhdGEsIDAsICgwPDwyNCl8MHhGREYxQzApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9NYWtlZmlsZQppbmRleCBlNjA0ZWJkLi4zMWUxZDg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9NYWtlZmlsZQpAQCAtMTEsMTEgKzExLDkgQEAKICMKICMgIElmIHlvdSB3YW50IHRvIGJ1aWxkIEFQIHN1cHBvcnQgKHVudGVzdGVkKSwgY29tbWVudCBvdXQgLURTVEFfT05MWQogCi1JTlNUQUxMRElSIDo9IC9saWIvbW9kdWxlcy8kKHNoZWxsIHVuYW1lIC1yKS9rZXJuZWwvZHJpdmVycy9uZXQvd2lyZWxlc3MKIGNjZmxhZ3MteSA6PSAtSSQoS0VSTkVMRElSKS9pbmNsdWRlCiBjY2ZsYWdzLXkgKz0gLUkkKHNyYykgXAogCQktREJVU19QQ01DSUEgXAotCQktRFVTRV9XUEEgXAogCQktRFVTRV9XRVhUIFwKIAkJLURTVEFfT05MWSBcCiAJCS1EV1ZMQU5fNDkgXApAQCAtMzksOSArMzcsNiBAQAogZW5kaWYKIGVuZGlmCiAKLSMgSWYgS0VSTkVMUkVMRUFTRSBpcyBkZWZpbmVkLCB3ZSd2ZSBiZWVuIGludm9rZWQgZnJvbSB0aGUKLSMga2VybmVsIGJ1aWxkIHN5c3RlbSBhbmQgY2FuIHVzZSBpdHMgbGFuZ3VhZ2UuCi1pZm5lcSAoJChLRVJORUxSRUxFQVNFKSwpCiAKIG9iai1tCQkrPSAkKFdMTkFNRSkubwogCkBAIC01OCwyNCArNTMsMyBAQAogCQlkaGYubwogCiAkKFdMTkFNRSktJChDT05GSUdfU1lTRlMpCSs9IHdsX3N5c2ZzLm8KLQotIyBPdGhlcndpc2Ugd2Ugd2VyZSBjYWxsZWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tbWFuZAotIyBsaW5lOyBpbnZva2UgdGhlIGtlcm5lbCBidWlsZCBzeXN0ZW0uCi1lbHNlCi0JS0VSTkVMRElSID89IC9saWIvbW9kdWxlcy8kKHNoZWxsIHVuYW1lIC1yKS9idWlsZAotCVBXRCA6PSAkKHNoZWxsIHB3ZCkKLQotZGVmYXVsdDoKLQkkKE1BS0UpIC1DICQoS0VSTkVMRElSKSBNPSQoUFdEKSBtb2R1bGVzCi1lbmRpZgotCi1jbGVhbjoKLQlybSAtZnIgKi5vICoua28gKi5tb2QuYyAqLm1vZC5vIC4qLiouY21kIE1vZHVsZS5zeW12ZXJzIFwKLQkJTW9kdWxlLm1hcmtlcnMgbW9kdWxlcy5vcmRlciAudG1wX3ZlcnNpb25zCi0KLWluc3RhbGw6IGRlZmF1bHQKLQktcm1tb2QgJChXTE5BTUUpCi0JaW5zdGFsbCAtZCAkKElOU1RBTExESVIpCi0JaW5zdGFsbCAtbSAwNjQ0IC1vIHJvb3QgLWcgcm9vdCAkKFdMTkFNRSkua28gJChJTlNUQUxMRElSKQotCS9zYmluL2RlcG1vZCAtYXEKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2RlYnVnLmgKaW5kZXggMmMzZGQxNC4uOGQ1ZGRkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvZGVidWcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9kZWJ1Zy5oCkBAIC0xMjksMTEgKzEyOSwxNSBAQAogI2RlZmluZSBfTEVBVkVfU1RSICAgICAgICAgICI8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8IgogCiAKLSNkZWZpbmUgX0RCR19FTlRFUihBKSAgICAgICBEQkdfUFJJTlQoIiVzOiUuKnM6JXNcbiIsIERCR19OQU1FKEEpLCArK0RCR19MRVZFTChBKSwgX0VOVEVSX1NUUiwgX19GVU5DX18pCi0jZGVmaW5lIF9EQkdfTEVBVkUoQSkgICAgICAgREJHX1BSSU5UKCIlczolLipzOiVzXG4iLCBEQkdfTkFNRShBKSwgREJHX0xFVkVMKEEpLS0sIF9MRUFWRV9TVFIsIF9fRlVOQ19fKQorI2RlZmluZSBfREJHX0VOVEVSKEEpCQkJCQkJXAorCURCR19QUklOVCgiJXM6JS4qczolc1xuIiwgREJHX05BTUUoQSksICsrREJHX0xFVkVMKEEpLAlcCisJCSAgX0VOVEVSX1NUUiwgX19mdW5jX18pCisjZGVmaW5lIF9EQkdfTEVBVkUoQSkJCQkJCQlcCisJREJHX1BSSU5UKCIlczolLipzOiVzXG4iLCBEQkdfTkFNRShBKSwgREJHX0xFVkVMKEEpLS0sCVwKKwkJICBfTEVBVkVfU1RSLCBfX2Z1bmNfXykKIAogCi0jZGVmaW5lIERCR19GVU5DKEYpICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKl9fRlVOQ19fID0gRjsKKyNkZWZpbmUgREJHX0ZVTkMoRikKIAogI2RlZmluZSBEQkdfRU5URVIoQSkgICAgICAgIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RSQUNFX09OKSBcCiAJCQkJX0RCR19FTlRFUihBKTsgfQpAQCAtMTQ1LDI5ICsxNDksMzMgQEAKIAkJCQlEQkdfUFJJTlQoIiAgJXMgLS0gIkYiXG4iLCBOLCBTKTsgfQogCiAKLSNkZWZpbmUgREJHX0VSUk9SKEEsIFMuLi4pICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfRVJST1JfT04pIHtcCi0JCQkJREJHX1BSSU5UKCIlczpFUlJPUjolcyAiLCBEQkdfTkFNRShBKSwgX19GVU5DX18pO1wKLQkJCQlEQkdfUFJJTlRDKFMpOyBcCi0JCQkJREJHX1RSQVA7IFwKLQkJCQl9IFwKLQkJCQl9CisjZGVmaW5lIERCR19FUlJPUihBLCBTLi4uKSBkbyB7CQkJCQkJXAorCQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX0VSUk9SX09OKSB7CQkJXAorCQkJREJHX1BSSU5UKCIlczpFUlJPUjolcyAiLCBEQkdfTkFNRShBKSwgX19mdW5jX18pOyBcCisJCQlEQkdfUFJJTlRDKFMpOwkJCQkJXAorCQkJREJHX1RSQVA7CQkJCQlcCisJCX0gfSB3aGlsZSAoMCkKIAogCi0jZGVmaW5lIERCR19XQVJOSU5HKEEsIFMuLi4pIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1dBUk5JTkdfT04pIHtcCi0JCQkJREJHX1BSSU5UKCIlczpXQVJOSU5HOiVzICIsIERCR19OQU1FKEEpLCBfX0ZVTkNfXyk7XAotCQkJCURCR19QUklOVEMoUyk7IH0gfQorI2RlZmluZSBEQkdfV0FSTklORyhBLCBTLi4uKSBkbyB7CQkJCQlcCisJCWlmIChEQkdfRkxBR1MoQSkgJiBEQkdfV0FSTklOR19PTikgewkJCVwKKwkJCURCR19QUklOVCgiJXM6V0FSTklORzolcyAiLCBEQkdfTkFNRShBKSwgX19mdW5jX18pOyBcCisJCQlEQkdfUFJJTlRDKFMpOwkJCQkJXAorCQl9IH0gd2hpbGUgKDApCiAKIAotI2RlZmluZSBEQkdfTk9USUNFKEEsIFMuLi4pICB7aWYgKERCR19GTEFHUyhBKSAmIERCR19OT1RJQ0VfT04pIHtcCi0JCQkJREJHX1BSSU5UKCIlczpOT1RJQ0U6JXMgIiwgREJHX05BTUUoQSksIF9fRlVOQ19fKTtcCi0JCQkJREJHX1BSSU5UQyhTKTsgXAotCQkJCX0gXAotCQkJCX0KKyNkZWZpbmUgREJHX05PVElDRShBLCBTLi4uKSAgZG8gewkJCQkJXAorCQlpZiAoREJHX0ZMQUdTKEEpICYgREJHX05PVElDRV9PTikgewkJCVwKKwkJCURCR19QUklOVCgiJXM6Tk9USUNFOiVzICIsIERCR19OQU1FKEEpLCBfX2Z1bmNfXyk7IFwKKwkJCURCR19QUklOVEMoUyk7CQkJCQlcCisJCX0gfSB3aGlsZSAoMCkKIAogCi0jZGVmaW5lIERCR19UUkFDRShBLCBTLi4uKSAgIGRvIHtpZiAoREJHX0ZMQUdTKEEpICYgREJHX1RSQUNFX09OKSB7XAotCQkJCURCR19QUklOVCgiJXM6JXMgIiwgREJHX05BTUUoQSksIF9fRlVOQ19fKTtcCi0JCQkJREJHX1BSSU5UQyhTKTsgfSB9IHdoaWxlICgwKQorI2RlZmluZSBEQkdfVFJBQ0UoQSwgUy4uLikgICBkbyB7IFwKKwkJaWYgKERCR19GTEFHUyhBKSAmIERCR19UUkFDRV9PTikgewkJCVwKKwkJCURCR19QUklOVCgiJXM6JXMgIiwgREJHX05BTUUoQSksIF9fZnVuY19fKTsJXAorCQkJREJHX1BSSU5UQyhTKTsJCQkJCVwKKwkJfSB9IHdoaWxlICgwKQogCiAKICNkZWZpbmUgREJHX1JYKEEsIFMuLi4pICAgICAge2lmIChEQkdfRkxBR1MoQSkgJiBEQkdfUlhfT04pIHtcCkBAIC0xODEsMTMgKzE4OSwxMiBAQAogCQkJCURCR19QUklOVChTKTsgfSB9CiAKIAotI2RlZmluZSBEQkdfQVNTRVJUKEMpCQl7IFwKLQkJCQlpZiAoIShDKSkge1wKLQkJCQkJREJHX1BSSU5UKCJBU1NFUlQoJXMpIC0tICVzIyVkICglcylcbiIsIFwKLQkJCQkJI0MsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DX18pOyBcCi0JCQkJCURCR19UUkFQOyBcCi0JCQkJCX0gXAotCQkJCQl9CisjZGVmaW5lIERCR19BU1NFUlQoQykgZG8geyBcCisJCWlmICghKEMpKSB7CQkJCQkJXAorCQkJREJHX1BSSU5UKCJBU1NFUlQoJXMpIC0tICVzIyVkICglcylcbiIsCQlcCisJCQkJICAjQywgX19GSUxFX18sIF9fTElORV9fLCBfX2Z1bmNfXyk7CVwKKwkJCURCR19UUkFQOwkJCQkJXAorCQl9IH0gd2hpbGUgKDApCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBjaGFyICAgICAgICAgICAqZGJnTmFtZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvaGNmLmMKaW5kZXggYTczMzE3ZS4uN2RjMTc2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvaGNmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvaGNmLmMKQEAgLTEsOTcgKzEsOTYgQEAKLS8vICAgdmltOnR3PTExMDp0cz00OgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGSUxFICAgOglIQ0YuQwotKgotKiBEQVRFICAgIDoJJERhdGU6IDIwMDQvMDgvMDUgMTE6NDc6MTAgJCAgICRSZXZpc2lvbjogMS4xMCAkCi0qIE9yaWdpbmFsOgkyMDA0LzA2LzAyIDEwOjIyOjIyICAgIFJldmlzaW9uOiAxLjg1ICAgICAgVGFnOiBoY2Y3X3QyMDA0MDYwMl8wMQotKiBPcmlnaW5hbDoJMjAwNC8wNC8xNSAwOToyNDo0MSAgICBSZXZpc2lvbjogMS42MyAgICAgIFRhZzogaGNmN190N18yMDA0MDQxNV8wMQotKiBPcmlnaW5hbDoJMjAwNC8wNC8xMyAxNDoyMjo0NCAgICBSZXZpc2lvbjogMS42MiAgICAgIFRhZzogdDdfMjAwNDA0MTNfMDEKLSogT3JpZ2luYWw6CTIwMDQvMDQvMDEgMTU6MzI6NTUgICAgUmV2aXNpb246IDEuNTkgICAgICBUYWc6IHQ3XzIwMDQwNDAxXzAxCi0qIE9yaWdpbmFsOgkyMDA0LzAzLzEwIDE1OjM5OjI3ICAgIFJldmlzaW9uOiAxLjU1ICAgICAgVGFnOiB0MjAwNDAzMTBfMDEKLSogT3JpZ2luYWw6CTIwMDQvMDMvMDQgMTE6MDM6MzcgICAgUmV2aXNpb246IDEuNTMgICAgICBUYWc6IHQyMDA0MDMwNF8wMQotKiBPcmlnaW5hbDoJMjAwNC8wMy8wMiAxNDo1MToyMSAgICBSZXZpc2lvbjogMS41MCAgICAgIFRhZzogdDIwMDQwMzAyXzAzCi0qIE9yaWdpbmFsOgkyMDA0LzAyLzI0IDEzOjAwOjI3ICAgIFJldmlzaW9uOiAxLjQzICAgICAgVGFnOiB0MjAwNDAyMjRfMDEKLSogT3JpZ2luYWw6CTIwMDQvMDIvMTkgMTA6NTc6MjUgICAgUmV2aXNpb246IDEuMzkgICAgICBUYWc6IHQyMDA0MDIxOV8wMQotKgotKiBBVVRIT1IgOglOaWNvIFZhbHN0ZXIKLSoKLSogU1BFQ0lGSUNBVElPTjogLi4uLi4uLi4KLSoKLSogREVTQ1JJUFRJT04gOglIQ0YgUm91dGluZXMgZm9yIEhlcm1lcy1JSSAoY2FsbGFibGUgdmlhIHRoZSBXaXJlbGVzcyBDb25uZWN0aW9uIEkvRiBvciBXQ0kpCi0qCQkJCUxvY2FsIFN1cHBvcnQgUm91dGluZXMgZm9yIGFib3ZlIHByb2NlZHVyZXMKLSoKLSoJCQlDdXN0b21pemFibGUgdmlhIEhDRkNGRy5ILCB3aGljaCBpcyBpbmNsdWRlZCBieSBIQ0YuSAotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKgotKiBTT0ZUV0FSRSBMSUNFTlNFCi0qCi0qIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAotKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCi0qIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KLSogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgotKgotKiBDT1BZUklHSFQgqSAxOTk0IC0gMTk5NQlieSBBVCZULgkJCQlBbGwgUmlnaHRzIFJlc2VydmVkCi0qIENPUFlSSUdIVCCpIDE5OTYgLSAyMDAwIGJ5IEx1Y2VudCBUZWNobm9sb2dpZXMuCUFsbCBSaWdodHMgUmVzZXJ2ZWQKLSogQ09QWVJJR0hUIKkgMjAwMSAtIDIwMDQJYnkgQWdlcmUgU3lzdGVtcyBJbmMuCUFsbCBSaWdodHMgUmVzZXJ2ZWQKLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotKgotKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwotKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwotKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgotKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSoKLSogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKLSogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0qICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotKgotKiBEaXNjbGFpbWVyCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAotKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0qIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKLSogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KLSogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0qIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKLSogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLSogREFNQUdFLgotKgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoKKyAqIEZJTEUgICA6ICBIQ0YuQworICoKKyAqIERBVEUgICAgOiAkRGF0ZTogMjAwNC8wOC8wNSAxMTo0NzoxMCAkICAgJFJldmlzaW9uOiAxLjEwICQKKyAqIE9yaWdpbmFsOiAyMDA0LzA2LzAyIDEwOjIyOjIyICAgIFJldmlzaW9uOiAxLjg1ICAgICAgVGFnOiBoY2Y3X3QyMDA0MDYwMl8wMQorICogT3JpZ2luYWw6IDIwMDQvMDQvMTUgMDk6MjQ6NDEgICAgUmV2aXNpb246IDEuNjMgICAgICBUYWc6IGhjZjdfdDdfMjAwNDA0MTVfMDEKKyAqIE9yaWdpbmFsOiAyMDA0LzA0LzEzIDE0OjIyOjQ0ICAgIFJldmlzaW9uOiAxLjYyICAgICAgVGFnOiB0N18yMDA0MDQxM18wMQorICogT3JpZ2luYWw6IDIwMDQvMDQvMDEgMTU6MzI6NTUgICAgUmV2aXNpb246IDEuNTkgICAgICBUYWc6IHQ3XzIwMDQwNDAxXzAxCisgKiBPcmlnaW5hbDogMjAwNC8wMy8xMCAxNTozOToyNyAgICBSZXZpc2lvbjogMS41NSAgICAgIFRhZzogdDIwMDQwMzEwXzAxCisgKiBPcmlnaW5hbDogMjAwNC8wMy8wNCAxMTowMzozNyAgICBSZXZpc2lvbjogMS41MyAgICAgIFRhZzogdDIwMDQwMzA0XzAxCisgKiBPcmlnaW5hbDogMjAwNC8wMy8wMiAxNDo1MToyMSAgICBSZXZpc2lvbjogMS41MCAgICAgIFRhZzogdDIwMDQwMzAyXzAzCisgKiBPcmlnaW5hbDogMjAwNC8wMi8yNCAxMzowMDoyNyAgICBSZXZpc2lvbjogMS40MyAgICAgIFRhZzogdDIwMDQwMjI0XzAxCisgKiBPcmlnaW5hbDogMjAwNC8wMi8xOSAxMDo1NzoyNSAgICBSZXZpc2lvbjogMS4zOSAgICAgIFRhZzogdDIwMDQwMjE5XzAxCisgKgorICogQVVUSE9SIDogIE5pY28gVmFsc3RlcgorICoKKyAqIFNQRUNJRklDQVRJT046IC4uLi4uLi4uCisgKgorICogREVTQ1JJUFRJT04gOiBIQ0YgUm91dGluZXMgZm9yIEhlcm1lcy1JSSAoY2FsbGFibGUgdmlhIHRoZSBXaXJlbGVzcyBDb25uZWN0aW9uIEkvRiBvciBXQ0kpCisgKiAgICAgICAgICAgICAgIExvY2FsIFN1cHBvcnQgUm91dGluZXMgZm9yIGFib3ZlIHByb2NlZHVyZXMKKyAqCisgKiAgICAgICAgICAgQ3VzdG9taXphYmxlIHZpYSBIQ0ZDRkcuSCwgd2hpY2ggaXMgaW5jbHVkZWQgYnkgSENGLkgKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ09QWVJJR0hUIKkgMTk5NCAtIDE5OTUgICBieSBBVCZULiAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiBDT1BZUklHSFQgqSAxOTk2IC0gMjAwMCBieSBMdWNlbnQgVGVjaG5vbG9naWVzLiAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqIENPUFlSSUdIVCCpIDIwMDEgLSAyMDA0ICAgYnkgQWdlcmUgU3lzdGVtcyBJbmMuICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qKgotKiogSW1wbGVtZW50YXRpb24gTm90ZXMKLSoqCi0qIC0JYSBsZWFkaW5nIG1hcmtlciBvZiAvLyEgaXMgdXNlZC4gVGhlIHB1cnBvc2Ugb2Ygc3VjaCBhIHNlcXVlbmNlIGlzIHRvIGhlbHAgdG8gdW5kZXJzdGFuZCB0aGUgZmxvdwotKglBbiBleGFtcGxlIGlzOgkvLyFyYyA9IEhDRl9TVUNDRVNTOwotKglpZiB0aGlzIGlzIHN1cGVyZmx1b3VzIGJlY2F1c2UgcmMgaXMgYWxyZWFkeSBndWFyYW50ZWVkIHRvIGJlIDAgYnV0IGl0IHNob3dzIHRvIHRoZSAobWFpbnRlbmFuY2UpCi0qCXByb2dyYW1tZXIgaXQgaXMgYW4gaW50ZW50aW9uYWwgb21pc3Npb24gYXQgdGhlIHBsYWNlIHdoZXJlIHNvbWVvbmUgY291bGQgY29uc2lkZXIgaXQgbW9zdCBhcHByb3ByaWF0ZSBhdAotKglmaXJzdCBnbGFuY2UKLSogLQl1c2luZyBuZWFyIHBvaW50ZXJzIGluIGEgbW9kZWwgd2hlcmUgc3MhPWRzIGlzIGFuIGludml0YXRpb24gZm9yIGRpc2FzdGVyLCBzbyBiZSBhd2FyZSBvZiBob3cgeW91IHNwZWNpZnkKLSoJeW91ciBtb2RlbCBhbmQgaG93IHlvdSBkZWZpbmUgdmFyaWFibGVzIHdoaWNoIGFyZSB1c2VkIGF0IGludGVycnVwdCB0aW1lCi0qIC0JcmVtZW1iZXIgdGhhdCBzaWduIGV4dGVuc2lvbiBvbiAzMiBiaXQgcGxhdGZvcm1zIG1heSBjYXVzZSBwcm9ibGVtcyB1bmxlc3MgY29kZSBpcyBjYXJlZnVsbHkgY29uc3RydWN0ZWQsCi0qCWUuZy4gdXNlICIoaGNmXzE2KX5mb28iIHJhdGhlciB0aGFuICJ+Zm9vIgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqCisgKiogSW1wbGVtZW50YXRpb24gTm90ZXMKKyAqKgorICogLSBhIGxlYWRpbmcgbWFya2VyIG9mIC8vISBpcyB1c2VkLiBUaGUgcHVycG9zZSBvZiBzdWNoIGEgc2VxdWVuY2UgaXMgdG8gaGVscCB0byB1bmRlcnN0YW5kIHRoZSBmbG93CisgKiAgIEFuIGV4YW1wbGUgaXM6ICAvLyFyYyA9IEhDRl9TVUNDRVNTOworICogICBpZiB0aGlzIGlzIHN1cGVyZmx1b3VzIGJlY2F1c2UgcmMgaXMgYWxyZWFkeSBndWFyYW50ZWVkIHRvIGJlIDAgYnV0IGl0IHNob3dzIHRvIHRoZSAobWFpbnRlbmFuY2UpCisgKiAgIHByb2dyYW1tZXIgaXQgaXMgYW4gaW50ZW50aW9uYWwgb21pc3Npb24gYXQgdGhlIHBsYWNlIHdoZXJlIHNvbWVvbmUgY291bGQgY29uc2lkZXIgaXQgbW9zdCBhcHByb3ByaWF0ZSBhdAorICogICBmaXJzdCBnbGFuY2UKKyAqIC0gdXNpbmcgbmVhciBwb2ludGVycyBpbiBhIG1vZGVsIHdoZXJlIHNzIT1kcyBpcyBhbiBpbnZpdGF0aW9uIGZvciBkaXNhc3Rlciwgc28gYmUgYXdhcmUgb2YgaG93IHlvdSBzcGVjaWZ5CisgKiAgIHlvdXIgbW9kZWwgYW5kIGhvdyB5b3UgZGVmaW5lIHZhcmlhYmxlcyB3aGljaCBhcmUgdXNlZCBhdCBpbnRlcnJ1cHQgdGltZQorICogLSByZW1lbWJlciB0aGF0IHNpZ24gZXh0ZW5zaW9uIG9uIDMyIGJpdCBwbGF0Zm9ybXMgbWF5IGNhdXNlIHByb2JsZW1zIHVubGVzcyBjb2RlIGlzIGNhcmVmdWxseSBjb25zdHJ1Y3RlZCwKKyAqICAgZS5nLiB1c2UgIihoY2ZfMTYpfmZvbyIgcmF0aGVyIHRoYW4gIn5mb28iCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2luY2x1ZGUgImhjZi5oIgkJCQkvLyBIQ0YgYW5kIE1TRiBjb21tb24gaW5jbHVkZSBmaWxlCi0jaW5jbHVkZSAiaGNmZGVmLmgiCQkJCS8vIEhDRiBzcGVjaWZpYyBpbmNsdWRlIGZpbGUKLSNpbmNsdWRlICJtbWQuaCIJCQkJLy8gTW9yZU1vZHVsYXJEcml2ZXIgY29tbW9uIGluY2x1ZGUgZmlsZQorI2luY2x1ZGUgImhjZi5oIiAgICAgICAgICAgICAgICAvLyBIQ0YgYW5kIE1TRiBjb21tb24gaW5jbHVkZSBmaWxlCisjaW5jbHVkZSAiaGNmZGVmLmgiICAgICAgICAgICAgIC8vIEhDRiBzcGVjaWZpYyBpbmNsdWRlIGZpbGUKKyNpbmNsdWRlICJtbWQuaCIgICAgICAgICAgICAgICAgLy8gTW9yZU1vZHVsYXJEcml2ZXIgY29tbW9uIGluY2x1ZGUgZmlsZQogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogCiAjaWYgISBkZWZpbmVkIG9mZnNldG9mCkBAIC0xMDIsNTYgKzEwMSw1MiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgUFJPVE9UWVBFUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotSENGX1NUQVRJQyBpbnQJCQljbWRfZXhlKCBJRkJQIGlmYnAsIGhjZl8xNiBjbWRfY29kZSwgaGNmXzE2IHBhcl8wICk7Ci1IQ0ZfU1RBVElDIGludAkJCWluaXQoIElGQlAgaWZicCApOwotSENGX1NUQVRJQyBpbnQJCQlwdXRfaW5mbyggSUZCUCBpZmJwLCBMVFZQIGx0dnAgKTsKLSNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX01CCi1IQ0ZfU1RBVElDIGludAkJCXB1dF9pbmZvX21iKCBJRkJQIGlmYnAsIENGR19NQl9JTkZPX1NUUkNUIEZBUiAqIGx0dnAgKTsKLSNlbmRpZiAvLyBIQ0ZfRVhUX01CCitIQ0ZfU1RBVElDIGludCAgICAgICAgICBjbWRfZXhlKCBJRkJQIGlmYnAsIGhjZl8xNiBjbWRfY29kZSwgaGNmXzE2IHBhcl8wICk7CitIQ0ZfU1RBVElDIGludCAgICAgICAgICBpbml0KCBJRkJQIGlmYnAgKTsKK0hDRl9TVEFUSUMgaW50ICAgICAgICAgIHB1dF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cCApOworSENGX1NUQVRJQyBpbnQgICAgICAgICAgcHV0X2luZm9fbWIoIElGQlAgaWZicCwgQ0ZHX01CX0lORk9fU1RSQ1QgRkFSICogbHR2cCApOwogI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKLUhDRl9TVEFUSUMgdm9pZAkJCWNhbGNfbWljKCBoY2ZfMzIqIHAsIGhjZl8zMiBNICk7Ci12b2lkIAkJCQkJY2FsY19taWNfcnhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICk7Ci12b2lkIAkJCQkJY2FsY19taWNfdHhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICk7Ci1IQ0ZfU1RBVElDIGludAkJCWNoZWNrX21pYyggSUZCUCBpZmJwICk7CitIQ0ZfU1RBVElDIHZvaWQgICAgICAgICBjYWxjX21pYyggaGNmXzMyKiBwLCBoY2ZfMzIgTSApOwordm9pZCAgICAgICAgICAgICAgICAgICAgY2FsY19taWNfcnhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICk7Cit2b2lkICAgICAgICAgICAgICAgICAgICBjYWxjX21pY190eF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIHAsIGludCBsZW4gKTsKK0hDRl9TVEFUSUMgaW50ICAgICAgICAgIGNoZWNrX21pYyggSUZCUCBpZmJwICk7CiAjZW5kaWYgLy8gSENGX1RZUEVfV1BBCiAKLUhDRl9TVEFUSUMgdm9pZAkJCWNhbGlicmF0ZSggSUZCUCBpZmJwICk7Ci1IQ0ZfU1RBVElDIGludAkJCWNtZF9jbXBsKCBJRkJQIGlmYnAgKTsKLUhDRl9TVEFUSUMgaGNmXzE2CQlnZXRfZmlkKCBJRkJQIGlmYnAgKTsKLUhDRl9TVEFUSUMgdm9pZAkJCWlzcl9pbmZvKCBJRkJQIGlmYnAgKTsKK0hDRl9TVEFUSUMgdm9pZCAgICAgICAgIGNhbGlicmF0ZSggSUZCUCBpZmJwICk7CitIQ0ZfU1RBVElDIGludCAgICAgICAgICBjbWRfY21wbCggSUZCUCBpZmJwICk7CitIQ0ZfU1RBVElDIGhjZl8xNiAgICAgICBnZXRfZmlkKCBJRkJQIGlmYnAgKTsKK0hDRl9TVEFUSUMgdm9pZCAgICAgICAgIGlzcl9pbmZvKCBJRkJQIGlmYnAgKTsKICNpZiBIQ0ZfRE1BCi1IQ0ZfU1RBVElDIERFU0NfU1RSQ1QqCWdldF9mcmFtZV9sc3QoSUZCUCBpZmJwLCBpbnQgdHhfcnhfZmxhZyk7CitIQ0ZfU1RBVElDIERFU0NfU1RSQ1QqICBnZXRfZnJhbWVfbHN0KElGQlAgaWZicCwgaW50IHR4X3J4X2ZsYWcpOwogI2VuZGlmIC8vIEhDRl9ETUEKLUhDRl9TVEFUSUMgdm9pZAkJCWdldF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIGludCBsZW4gQkVfUEFSKCBpbnQgd29yZF9sZW4gKSApOwkvL2NoYXIqLCBieXRlIGNvdW50ICh1c3VhbGx5IGV2ZW4pCitIQ0ZfU1RBVElDIHZvaWQgICAgICAgICBnZXRfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCBpbnQgbGVuIEJFX1BBUiggaW50IHdvcmRfbGVuICkgKTsgICAvL2NoYXIqLCBieXRlIGNvdW50ICh1c3VhbGx5IGV2ZW4pCiAjaWYgSENGX0RNQQotSENGX1NUQVRJQyB2b2lkCQkJcHV0X2ZyYW1lX2xzdCggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgaW50IHR4X3J4X2ZsYWcgKTsKK0hDRl9TVEFUSUMgdm9pZCAgICAgICAgIHB1dF9mcmFtZV9sc3QoIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AsIGludCB0eF9yeF9mbGFnICk7CiAjZW5kaWYgLy8gSENGX0RNQQotSENGX1NUQVRJQyB2b2lkCQkJcHV0X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgaW50IGxlbiBCRV9QQVIoIGludCB3b3JkX2xlbiApICk7Ci1IQ0ZfU1RBVElDIHZvaWQJCQlwdXRfZnJhZ19maW5hbGl6ZSggSUZCUCBpZmJwICk7Ci1IQ0ZfU1RBVElDIGludAkJCXNldHVwX2JhcCggSUZCUCBpZmJwLCBoY2ZfMTYgZmlkLCBpbnQgb2Zmc2V0LCBpbnQgdHlwZSApOworSENGX1NUQVRJQyB2b2lkICAgICAgICAgcHV0X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgYnVmcCwgaW50IGxlbiBCRV9QQVIoIGludCB3b3JkX2xlbiApICk7CitIQ0ZfU1RBVElDIHZvaWQgICAgICAgICBwdXRfZnJhZ19maW5hbGl6ZSggSUZCUCBpZmJwICk7CitIQ0ZfU1RBVElDIGludCAgICAgICAgICBzZXR1cF9iYXAoIElGQlAgaWZicCwgaGNmXzE2IGZpZCwgaW50IG9mZnNldCwgaW50IHR5cGUgKTsKICNpZiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX1BSSU5URgogc3RhdGljIGludCBmd19wcmludGYoSUZCUCBpZmJwLCBDRkdfRldfUFJJTlRGX1NUUkNUIEZBUiAqbHR2cCk7CiAjZW5kaWYgLy8gSENGX0FTU0VSVF9QUklOVEYKIAotSENGX1NUQVRJQyBpbnQJCQlkb3dubG9hZCggSUZCUCBpZmJwLCBDRkdfUFJPR19TVFJDVCBGQVIgKmx0dnAgKTsKLSNpZiAoSENGX0VOQ0FQKSAmIEhDRl9FTkMKLUhDRl9TVEFUSUMgaGNmXzgJCWhjZl9lbmNhcCggd2NpX2J1ZnAgdHlwZSApOwotI2VuZGlmIC8vIEhDRl9FTkNBUAotSENGX1NUQVRJQyBoY2ZfOAkJbnVsbF9hZGRyWzRdID0geyAwLCAwLCAwLCAwIH07Ci0jaWYgISBkZWZpbmVkIElOX1BPUlRfV09SRAkJCS8vcmVwbGFjZSBJL08gTWFjcm9zIHdpdGggbG9nZ2luZyBmYWNpbGl0eQorSENGX1NUQVRJQyBpbnQgICAgICAgICAgZG93bmxvYWQoIElGQlAgaWZicCwgQ0ZHX1BST0dfU1RSQ1QgRkFSICpsdHZwICk7CitIQ0ZfU1RBVElDIGhjZl84ICAgICAgICBoY2ZfZW5jYXAoIHdjaV9idWZwIHR5cGUgKTsKK0hDRl9TVEFUSUMgaGNmXzggICAgICAgIG51bGxfYWRkcls0XSA9IHsgMCwgMCwgMCwgMCB9OworI2lmICEgZGVmaW5lZCBJTl9QT1JUX1dPUkQgICAgICAgICAgLy9yZXBsYWNlIEkvTyBNYWNyb3Mgd2l0aCBsb2dnaW5nIGZhY2lsaXR5CiBleHRlcm4gRklMRSAqbG9nX2ZpbGU7CiAKLSNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJaW5fcG9ydF93b3JkKCAoaGNmX2lvKShwb3J0KSApCisjZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KSAgICAgICAgICBpbl9wb3J0X3dvcmQoIChoY2ZfaW8pKHBvcnQpICkKIAogc3RhdGljIGhjZl8xNiBpbl9wb3J0X3dvcmQoIGhjZl9pbyBwb3J0ICkgewotaGNmXzE2IGkgPSAoaGNmXzE2KV9pbnB3KCBwb3J0ICk7CisJaGNmXzE2IGkgPSAoaGNmXzE2KV9pbnB3KCBwb3J0ICk7CiAJaWYgKCBsb2dfZmlsZSApIHsKIAkJZnByaW50ZiggbG9nX2ZpbGUsICJcblIgJTIuMnggJTQuNHgiLCAocG9ydCkmMHhGRiwgaSk7CiAJfQogCXJldHVybiBpOwogfSAvLyBpbl9wb3J0X3dvcmQKIAotI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQlvdXRfcG9ydF93b3JkKCAoaGNmX2lvKShwb3J0KSwgKGhjZl8xNikodmFsdWUpICkKKyNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkgIG91dF9wb3J0X3dvcmQoIChoY2ZfaW8pKHBvcnQpLCAoaGNmXzE2KSh2YWx1ZSkgKQogCiBzdGF0aWMgdm9pZCBvdXRfcG9ydF93b3JkKCBoY2ZfaW8gcG9ydCwgaGNmXzE2IHZhbHVlICkgewogCV9vdXRwdyggcG9ydCwgdmFsdWUgKTsKQEAgLTE2MCwxMiArMTU1LDEyIEBACiAJfQogfQogCi12b2lkIElOX1BPUlRfU1RSSU5HXzMyKCBoY2ZfaW8gcHJ0LCBoY2ZfMzIgRkFSICogZHN0LCBpbnQgbikJewordm9pZCBJTl9QT1JUX1NUUklOR18zMiggaGNmX2lvIHBydCwgaGNmXzMyIEZBUiAqIGRzdCwgaW50IG4pICAgIHsKIAlpbnQgaSA9IDA7CiAJaGNmXzE2IEZBUiAqIHA7CiAJaWYgKCBsb2dfZmlsZSApIHsKIAkJZnByaW50ZiggbG9nX2ZpbGUsICJcbnJlYWQgc3RyaW5nXzMyIGxlbmd0aCAlMDR4ICglMDRkKSBhdCBwb3J0ICUwMi4yeCB0byBhZGRyICVscCIsCi0JCQkJIChoY2ZfMTYpbiwgKGhjZl8xNiluLCAoaGNmXzE2KShwcnQpJjB4RkYsIGRzdCk7CisJCQkgKGhjZl8xNiluLCAoaGNmXzE2KW4sIChoY2ZfMTYpKHBydCkmMHhGRiwgZHN0KTsKIAl9CiAJd2hpbGUgKCBuLS0gKSB7CiAJCXAgPSAoaGNmXzE2IEZBUiAqKWRzdDsKQEAgLTE3OCwxMiArMTczLDEyIEBACiAJfQogfSAvLyBJTl9QT1JUX1NUUklOR18zMgogCi12b2lkIElOX1BPUlRfU1RSSU5HXzhfMTYoIGhjZl9pbyBwcnQsIGhjZl84IEZBUiAqIGRzdCwgaW50IG4pIHsJLy9hbHNvIGhhbmRsZXMgYnl0ZSBhbGlnbm1lbnQgcHJvYmxlbXMKLQloY2ZfMTYgRkFSICogcCA9IChoY2ZfMTYgRkFSICopZHN0OwkJCQkJCQkvL3RoaXMgbmVlZHMgbW9yZSBlbGFib3JhdGUgY29kZSBpbiBub24teDg2IHBsYXRmb3Jtcwordm9pZCBJTl9QT1JUX1NUUklOR184XzE2KCBoY2ZfaW8gcHJ0LCBoY2ZfOCBGQVIgKiBkc3QsIGludCBuKSB7IC8vYWxzbyBoYW5kbGVzIGJ5dGUgYWxpZ25tZW50IHByb2JsZW1zCisJaGNmXzE2IEZBUiAqIHAgPSAoaGNmXzE2IEZBUiAqKWRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIG5lZWRzIG1vcmUgZWxhYm9yYXRlIGNvZGUgaW4gbm9uLXg4NiBwbGF0Zm9ybXMKIAlpbnQgaSA9IDA7CiAJaWYgKCBsb2dfZmlsZSApIHsKIAkJZnByaW50ZiggbG9nX2ZpbGUsICJcbnJlYWQgc3RyaW5nXzE2IGxlbmd0aCAlMDR4ICglMDRkKSBhdCBwb3J0ICUwMi4yeCB0byBhZGRyICVscCIsCi0JCQkJIChoY2ZfMTYpbiwgKGhjZl8xNiluLCAoaGNmXzE2KShwcnQpJjB4RkYsIGRzdCApOworCQkJIChoY2ZfMTYpbiwgKGhjZl8xNiluLCAoaGNmXzE2KShwcnQpJjB4RkYsIGRzdCApOwogCX0KIAl3aGlsZSAoIG4tLSApIHsKIAkJKnAgPShoY2ZfMTYpX2lucHcoIHBydCk7CkBAIC0xOTgsMTIgKzE5MywxMiBAQAogCX0KIH0gLy8gSU5fUE9SVF9TVFJJTkdfOF8xNgogCi12b2lkIE9VVF9QT1JUX1NUUklOR18zMiggaGNmX2lvIHBydCwgaGNmXzMyIEZBUiAqIHNyYywgaW50IG4pCXsKK3ZvaWQgT1VUX1BPUlRfU1RSSU5HXzMyKCBoY2ZfaW8gcHJ0LCBoY2ZfMzIgRkFSICogc3JjLCBpbnQgbikgICB7CiAJaW50IGkgPSAwOwogCWhjZl8xNiBGQVIgKiBwOwogCWlmICggbG9nX2ZpbGUgKSB7CiAJCWZwcmludGYoIGxvZ19maWxlLCAiXG53cml0ZSBzdHJpbmdfMzIgbGVuZ3RoICUwNHggKCUwNGQpIGF0IHBvcnQgJTAyLjJ4IiwKLQkJCQkgKGhjZl8xNiluLCAoaGNmXzE2KW4sIChoY2ZfMTYpKHBydCkmMHhGRik7CisJCQkgKGhjZl8xNiluLCAoaGNmXzE2KW4sIChoY2ZfMTYpKHBydCkmMHhGRik7CiAJfQogCXdoaWxlICggbi0tICkgewogCQlwID0gKGhjZl8xNiBGQVIgKilzcmM7CkBAIC0yMTYsOCArMjExLDggQEAKIAl9CiB9IC8vIE9VVF9QT1JUX1NUUklOR18zMgogCi12b2lkIE9VVF9QT1JUX1NUUklOR184XzE2KCBoY2ZfaW8gcHJ0LCBoY2ZfOCBGQVIgKiBzcmMsIGludCBuKQl7CS8vYWxzbyBoYW5kbGVzIGJ5dGUgYWxpZ25tZW50IHByb2JsZW1zCi0JaGNmXzE2IEZBUiAqIHAgPSAoaGNmXzE2IEZBUiAqKXNyYzsJCQkJCQkJCS8vdGhpcyBuZWVkcyBtb3JlIGVsYWJvcmF0ZSBjb2RlIGluIG5vbi14ODYgcGxhdGZvcm1zCit2b2lkIE9VVF9QT1JUX1NUUklOR184XzE2KCBoY2ZfaW8gcHJ0LCBoY2ZfOCBGQVIgKiBzcmMsIGludCBuKSAgeyAgIC8vYWxzbyBoYW5kbGVzIGJ5dGUgYWxpZ25tZW50IHByb2JsZW1zCisJaGNmXzE2IEZBUiAqIHAgPSAoaGNmXzE2IEZBUiAqKXNyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBuZWVkcyBtb3JlIGVsYWJvcmF0ZSBjb2RlIGluIG5vbi14ODYgcGxhdGZvcm1zCiAJaW50IGkgPSAwOwogCWlmICggbG9nX2ZpbGUgKSB7CiAJCWZwcmludGYoIGxvZ19maWxlLCAiXG53cml0ZSBzdHJpbmdfMTYgbGVuZ3RoICUwNHggKCUwNGQpIGF0IHBvcnQgJTA0eCIsIG4sIG4sIChoY2ZfMTYpcHJ0KTsKQEAgLTIzOCwyNyArMjMzLDI1IEBACiAjZW5kaWYgLy8gSU5fUE9SVF9XT1JECiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRCBBIFQgQSAgICBEIEUgRiBJIE4gSSBUIEkgTyBOIFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEQgQSBUIEEgICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWYgSENGX0FTU0VSVAotSUZCUCBCQVNFRCBhc3NlcnRfaWZicCA9IE5VTEw7CQkJLy90byBtYWtlIGFzc2VydHMgZWFzaWx5IHdvcmsgdW5kZXIgTU1EIGFuZCBESEYKK0lGQlAgQkFTRUQgYXNzZXJ0X2lmYnAgPSBOVUxMOyAgICAgICAgICAvL3RvIG1ha2UgYXNzZXJ0cyBlYXNpbHkgd29yayB1bmRlciBNTUQgYW5kIERIRgogI2VuZGlmIC8vIEhDRl9BU1NFUlQKIAotI2lmIEhDRl9FTkNBUAogLyogU05BUCBoZWFkZXIgdG8gYmUgaW5zZXJ0ZWQgaW4gRXRoZXJuZXQtSUkgZnJhbWVzICovCi1IQ0ZfU1RBVElDICBoY2ZfOCBCQVNFRCBzbmFwX2hlYWRlcltdID0geyAweEFBLCAweEFBLCAweDAzLCAweDAwLCAweDAwLAkvLzUgYnl0ZXMgc2lnbmF0dXJlICsKLQkJCQkJCQkJCQkgIDAgfTsJCQkJCQkJLy8xIGJ5dGUgcHJvdG9jb2wgaWRlbnRpZmllcgotI2VuZGlmIC8vIEhDRl9FTkNBUAorSENGX1NUQVRJQyAgaGNmXzggQkFTRUQgc25hcF9oZWFkZXJbXSA9IHsgMHhBQSwgMHhBQSwgMHgwMywgMHgwMCwgMHgwMCwgLy81IGJ5dGVzIHNpZ25hdHVyZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAvLzEgYnl0ZSBwcm90b2NvbCBpZGVudGlmaWVyCiAKICNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCi1IQ0ZfU1RBVElDIGhjZl84IEJBU0VEIG1pY19wYWRbOF0gPSB7IDB4NUEsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsJCS8vTUlDIHBhZGRpbmcgb2YgbWVzc2FnZQorSENGX1NUQVRJQyBoY2ZfOCBCQVNFRCBtaWNfcGFkWzhdID0geyAweDVBLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07ICAgICAgLy9NSUMgcGFkZGluZyBvZiBtZXNzYWdlCiAjZW5kaWYgLy8gSENGX1RZUEVfV1BBCiAKICNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQKIENGR19JREVOVElUWV9TVFJDVCBCQVNFRCBjZmdfZHJ2X2lkZW50aXR5ID0gewotCXNpemVvZihjZmdfZHJ2X2lkZW50aXR5KS9zaXplb2YoaGNmXzE2KSAtIDEsCS8vbGVuZ3RoIG9mIFJJRAotCUNGR19EUlZfSURFTlRJVFksCQkJLy8gKDB4MDgyNikKKwlzaXplb2YoY2ZnX2Rydl9pZGVudGl0eSkvc2l6ZW9mKGhjZl8xNikgLSAxLCAgICAvL2xlbmd0aCBvZiBSSUQKKwlDRkdfRFJWX0lERU5USVRZLCAgICAgICAgICAgLy8gKDB4MDgyNikKIAlNU0ZfQ09NUE9ORU5UX0lELAogCU1TRl9DT01QT05FTlRfVkFSLAogCU1TRl9DT01QT05FTlRfTUFKT1JfVkVSLApAQCAtMjY2LDE4NiArMjU5LDE4NiBAQAogfSA7CiAKIENGR19SQU5HRVNfU1RSQ1QgQkFTRUQgY2ZnX2Rydl9zdXBfcmFuZ2UgPSB7Ci0Jc2l6ZW9mKGNmZ19kcnZfc3VwX3JhbmdlKS9zaXplb2YoaGNmXzE2KSAtIDEsCS8vbGVuZ3RoIG9mIFJJRAotCUNGR19EUlZfU1VQX1JBTkdFLAkJCS8vICgweDA4MjcpCisJc2l6ZW9mKGNmZ19kcnZfc3VwX3JhbmdlKS9zaXplb2YoaGNmXzE2KSAtIDEsICAgLy9sZW5ndGggb2YgUklECisJQ0ZHX0RSVl9TVVBfUkFOR0UsICAgICAgICAgIC8vICgweDA4MjcpCiAKIAlDT01QX1JPTEVfU1VQTCwKIAlDT01QX0lEX0RVSSwKLQl7ewlEVUlfQ09NUEFUX1ZBUiwKLQkJRFVJX0NPTVBBVF9CT1QsCi0JCURVSV9DT01QQVRfVE9QCisJe3sgIERVSV9DT01QQVRfVkFSLAorCSAgICBEVUlfQ09NUEFUX0JPVCwKKwkgICAgRFVJX0NPTVBBVF9UT1AKIAl9fQogfSA7CiAKIHN0cnVjdCBDRkdfUkFOR0UzX1NUUkNUIEJBU0VEIGNmZ19kcnZfYWN0X3Jhbmdlc19wcmkgPSB7Ci0Jc2l6ZW9mKGNmZ19kcnZfYWN0X3Jhbmdlc19wcmkpL3NpemVvZihoY2ZfMTYpIC0gMSwJLy9sZW5ndGggb2YgUklECi0JQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSSwJCS8vICgweDA4MjgpCisJc2l6ZW9mKGNmZ19kcnZfYWN0X3Jhbmdlc19wcmkpL3NpemVvZihoY2ZfMTYpIC0gMSwgIC8vbGVuZ3RoIG9mIFJJRAorCUNGR19EUlZfQUNUX1JBTkdFU19QUkksICAgICAvLyAoMHgwODI4KQogCiAJQ09NUF9ST0xFX0FDVCwKIAlDT01QX0lEX1BSSSwKIAl7Ci0JIHsgMCwgMCwgMCB9LCAJCQkJCQkJLy8gSENGX1BSSV9WQVJfMSBub3Qgc3VwcG9ydGVkIGJ5IEhDRiA3Ci0JIHsgMCwgMCwgMCB9LCAJCQkJCQkJLy8gSENGX1BSSV9WQVJfMiBub3Qgc3VwcG9ydGVkIGJ5IEhDRiA3Ci0JIHsJMywJCQkJCQkJCQkvL3Zhcl9yZWNbMl0gLSBWYXJpYW50IG51bWJlcgotCQlDRkdfRFJWX0FDVF9SQU5HRVNfUFJJXzNfQk9UVE9NLAkJLy8JCSAtIEJvdHRvbSBDb21wYXRpYmlsaXR5Ci0JCUNGR19EUlZfQUNUX1JBTkdFU19QUklfM19UT1AJCQkvLwkJIC0gVG9wIENvbXBhdGliaWxpdHkKLQkgfQorCQl7IDAsIDAsIDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIQ0ZfUFJJX1ZBUl8xIG5vdCBzdXBwb3J0ZWQgYnkgSENGIDcKKwkJeyAwLCAwLCAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSENGX1BSSV9WQVJfMiBub3Qgc3VwcG9ydGVkIGJ5IEhDRiA3CisJCXsgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX3JlY1syXSAtIFZhcmlhbnQgbnVtYmVyCisJCSAgIENGR19EUlZfQUNUX1JBTkdFU19QUklfM19CT1RUT00sICAgICAgICAvLyAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CisJCSAgIENGR19EUlZfQUNUX1JBTkdFU19QUklfM19UT1AgICAgICAgICAgICAvLyAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CisJCX0KIAl9CiB9IDsKIAogCiBzdHJ1Y3QgQ0ZHX1JBTkdFNF9TVFJDVCBCQVNFRCBjZmdfZHJ2X2FjdF9yYW5nZXNfc3RhID0gewotCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfc3RhKS9zaXplb2YoaGNmXzE2KSAtIDEsCS8vbGVuZ3RoIG9mIFJJRAotCUNGR19EUlZfQUNUX1JBTkdFU19TVEEsCQkvLyAoMHgwODI5KQorCXNpemVvZihjZmdfZHJ2X2FjdF9yYW5nZXNfc3RhKS9zaXplb2YoaGNmXzE2KSAtIDEsICAvL2xlbmd0aCBvZiBSSUQKKwlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBLCAgICAgLy8gKDB4MDgyOSkKIAogCUNPTVBfUk9MRV9BQ1QsCiAJQ09NUF9JRF9TVEEsCiAJewogI2lmIGRlZmluZWQgSENGX1NUQV9WQVJfMQotCSB7CTEsCQkJCQkJCQkJLy92YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKLQkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8xX0JPVFRPTSwJCS8vCQkgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQotCQlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzFfVE9QCQkJLy8JCSAtIFRvcCBDb21wYXRpYmlsaXR5Ci0JIH0sCisJCXsgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCisJCSAgIENGR19EUlZfQUNUX1JBTkdFU19TVEFfMV9CT1RUT00sICAgICAgICAvLyAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CisJCSAgIENGR19EUlZfQUNUX1JBTkdFU19TVEFfMV9UT1AgICAgICAgICAgICAvLyAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CisJCX0sCiAjZWxzZQotCSB7IDAsIDAsIDAgfSwKKwkJeyAwLCAwLCAwIH0sCiAjZW5kaWYgLy8gSENGX1NUQV9WQVJfMQogI2lmIGRlZmluZWQgSENGX1NUQV9WQVJfMgotCSB7CTIsCQkJCQkJCQkJLy92YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKLQkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX0JPVFRPTSwJCS8vCQkgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQotCQlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzJfVE9QCQkJLy8JCSAtIFRvcCBDb21wYXRpYmlsaXR5Ci0JIH0sCisJCXsgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCisJCSAgIENGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9CT1RUT00sICAgICAgICAvLyAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CisJCSAgIENGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9UT1AgICAgICAgICAgICAvLyAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CisJCX0sCiAjZWxzZQotCSB7IDAsIDAsIDAgfSwKKwkJeyAwLCAwLCAwIH0sCiAjZW5kaWYgLy8gSENGX1NUQV9WQVJfMgogLy8gRm9yIE5hdGl2ZV9VU0IgKE5vdCB1c2VkISkKICNpZiBkZWZpbmVkIEhDRl9TVEFfVkFSXzMKLQkgewkzLAkJCQkJCQkJCS8vdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCi0JCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfM19CT1RUT00sCQkvLwkJIC0gQm90dG9tIENvbXBhdGliaWxpdHkKLQkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8zX1RPUAkJCS8vCQkgLSBUb3AgQ29tcGF0aWJpbGl0eQotCSB9LAorCQl7ICAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgorCQkgICBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzNfQk9UVE9NLCAgICAgICAgLy8gICAgICAgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQorCQkgICBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzNfVE9QICAgICAgICAgICAgLy8gICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQorCQl9LAogI2Vsc2UKLQkgeyAwLCAwLCAwIH0sCisJCXsgMCwgMCwgMCB9LAogI2VuZGlmIC8vIEhDRl9TVEFfVkFSXzMKIC8vIFdhcnAKICNpZiBkZWZpbmVkIEhDRl9TVEFfVkFSXzQKLQkgewk0LAkJCQkJCQkJCS8vdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCi0JCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfNF9CT1RUT00sCQkvLyAgICAgICAgICAgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQotCQlDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzRfVE9QCQkJLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKLQkgfQorCQl7ICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgorCQkgICBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzRfQk9UVE9NLCAgICAgICAgLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKKwkJICAgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV80X1RPUCAgICAgICAgICAgIC8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CisJCX0KICNlbHNlCi0JIHsgMCwgMCwgMCB9CisJCXsgMCwgMCwgMCB9CiAjZW5kaWYgLy8gSENGX1NUQV9WQVJfNAogCX0KIH0gOwogCiAKIHN0cnVjdCBDRkdfUkFOR0U2X1NUUkNUIEJBU0VEIGNmZ19kcnZfYWN0X3Jhbmdlc19oc2kgPSB7Ci0Jc2l6ZW9mKGNmZ19kcnZfYWN0X3Jhbmdlc19oc2kpL3NpemVvZihoY2ZfMTYpIC0gMSwJLy9sZW5ndGggb2YgUklECi0JQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSSwJCS8vICgweDA4MkEpCisJc2l6ZW9mKGNmZ19kcnZfYWN0X3Jhbmdlc19oc2kpL3NpemVvZihoY2ZfMTYpIC0gMSwgIC8vbGVuZ3RoIG9mIFJJRAorCUNGR19EUlZfQUNUX1JBTkdFU19IU0ksICAgICAvLyAoMHgwODJBKQogCUNPTVBfUk9MRV9BQ1QsCiAJQ09NUF9JRF9IU0ksCiAJewotI2lmIGRlZmluZWQgSENGX0hTSV9WQVJfMAkJCQkJLy8gQ29udHJvbGxlZCBkZXBsb3ltZW50Ci0JIHsJMCwJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKLQkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV8wX0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5Ci0JCUNGR19EUlZfQUNUX1JBTkdFU19IU0lfMF9UT1AJCQkvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQotCSB9LAorI2lmIGRlZmluZWQgSENGX0hTSV9WQVJfMCAgICAgICAgICAgICAgICAgICAvLyBDb250cm9sbGVkIGRlcGxveW1lbnQKKwkJeyAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCisJCSAgIENGR19EUlZfQUNUX1JBTkdFU19IU0lfMF9CT1RUT00sICAgICAgICAvLyAgICAgICAgICAgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQorCQkgICBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzBfVE9QICAgICAgICAgICAgLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKKwkJfSwKICNlbHNlCi0JIHsgMCwgMCwgMCB9LAorCQl7IDAsIDAsIDAgfSwKICNlbmRpZiAvLyBIQ0ZfSFNJX1ZBUl8wCi0JIHsgMCwgMCwgMCB9LCAJCQkJCQkJLy8gSENGX0hTSV9WQVJfMSBub3Qgc3VwcG9ydGVkIGJ5IEhDRiA3Ci0JIHsgMCwgMCwgMCB9LCAJCQkJCQkJLy8gSENGX0hTSV9WQVJfMiBub3Qgc3VwcG9ydGVkIGJ5IEhDRiA3Ci0JIHsgMCwgMCwgMCB9LCAJCQkJCQkJLy8gSENGX0hTSV9WQVJfMyBub3Qgc3VwcG9ydGVkIGJ5IEhDRiA3Ci0jaWYgZGVmaW5lZCBIQ0ZfSFNJX1ZBUl80CQkJCQkvLyBIZXJtZXMtSUkgYWxsIHR5cGVzCi0JIHsJNCwJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKLQkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV80X0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5Ci0JCUNGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9UT1AJCQkvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQotCSB9LAorCQl7IDAsIDAsIDAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIQ0ZfSFNJX1ZBUl8xIG5vdCBzdXBwb3J0ZWQgYnkgSENGIDcKKwkJeyAwLCAwLCAwIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSENGX0hTSV9WQVJfMiBub3Qgc3VwcG9ydGVkIGJ5IEhDRiA3CisJCXsgMCwgMCwgMCB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhDRl9IU0lfVkFSXzMgbm90IHN1cHBvcnRlZCBieSBIQ0YgNworI2lmIGRlZmluZWQgSENGX0hTSV9WQVJfNCAgICAgICAgICAgICAgICAgICAvLyBIZXJtZXMtSUkgYWxsIHR5cGVzCisJCXsgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgorCQkgICBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzRfQk9UVE9NLCAgICAgICAgLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKKwkJICAgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV80X1RPUCAgICAgICAgICAgIC8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CisJCX0sCiAjZWxzZQotCSB7IDAsIDAsIDAgfSwKKwkJeyAwLCAwLCAwIH0sCiAjZW5kaWYgLy8gSENGX0hTSV9WQVJfNAotI2lmIGRlZmluZWQgSENGX0hTSV9WQVJfNQkJCQkJLy8gV0FSUCBIZXJtZXMtMi41Ci0JIHsJNSwJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKLQkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV81X0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5Ci0JCUNGR19EUlZfQUNUX1JBTkdFU19IU0lfNV9UT1AJCQkvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQotCSB9CisjaWYgZGVmaW5lZCBIQ0ZfSFNJX1ZBUl81ICAgICAgICAgICAgICAgICAgIC8vIFdBUlAgSGVybWVzLTIuNQorCQl7ICA1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKKwkJICAgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV81X0JPVFRPTSwgICAgICAgIC8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CisJCSAgIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNV9UT1AgICAgICAgICAgICAvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQorCQl9CiAjZWxzZQotCSB7IDAsIDAsIDAgfQorCQl7IDAsIDAsIDAgfQogI2VuZGlmIC8vIEhDRl9IU0lfVkFSXzUKIAl9CiB9IDsKIAogCiBDRkdfUkFOR0U0X1NUUkNUIEJBU0VEIGNmZ19kcnZfYWN0X3Jhbmdlc19hcGYgPSB7Ci0Jc2l6ZW9mKGNmZ19kcnZfYWN0X3Jhbmdlc19hcGYpL3NpemVvZihoY2ZfMTYpIC0gMSwJLy9sZW5ndGggb2YgUklECi0JQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRiwJCS8vICgweDA4MkIpCisJc2l6ZW9mKGNmZ19kcnZfYWN0X3Jhbmdlc19hcGYpL3NpemVvZihoY2ZfMTYpIC0gMSwgIC8vbGVuZ3RoIG9mIFJJRAorCUNGR19EUlZfQUNUX1JBTkdFU19BUEYsICAgICAvLyAoMHgwODJCKQogCiAJQ09NUF9ST0xFX0FDVCwKIAlDT01QX0lEX0FQRiwKIAl7Ci0jaWYgZGVmaW5lZCBIQ0ZfQVBGX1ZBUl8xCQkJCS8vKEZha2UpIEhlcm1lcy1JCi0JIHsJMSwJCQkJCQkJCQkvL3Zhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgotCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzFfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKLQkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8xX1RPUAkJCS8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5Ci0JIH0sCisjaWYgZGVmaW5lZCBIQ0ZfQVBGX1ZBUl8xICAgICAgICAgICAgICAgLy8oRmFrZSkgSGVybWVzLUkKKwkJeyAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKKwkJICAgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8xX0JPVFRPTSwgICAgICAgIC8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CisJCSAgIENGR19EUlZfQUNUX1JBTkdFU19BUEZfMV9UT1AgICAgICAgICAgICAvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQorCQl9LAogI2Vsc2UKLQkgeyAwLCAwLCAwIH0sCisJCXsgMCwgMCwgMCB9LAogI2VuZGlmIC8vIEhDRl9BUEZfVkFSXzEKLSNpZiBkZWZpbmVkIEhDRl9BUEZfVkFSXzIJCQkJLy9IZXJtZXMtSUkKLQkgewkyLAkJCQkJCQkJCS8vIHZhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgotCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkKLQkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX1RPUAkJCS8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5Ci0JIH0sCisjaWYgZGVmaW5lZCBIQ0ZfQVBGX1ZBUl8yICAgICAgICAgICAgICAgLy9IZXJtZXMtSUkKKwkJeyAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFyX3JlY1sxXSAtIFZhcmlhbnQgbnVtYmVyCisJCSAgIENGR19EUlZfQUNUX1JBTkdFU19BUEZfMl9CT1RUT00sICAgICAgICAvLyAgICAgICAgICAgLSBCb3R0b20gQ29tcGF0aWJpbGl0eQorCQkgICBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfVE9QICAgICAgICAgICAgLy8gICAgICAgICAgIC0gVG9wIENvbXBhdGliaWxpdHkKKwkJfSwKICNlbHNlCi0JIHsgMCwgMCwgMCB9LAorCQl7IDAsIDAsIDAgfSwKICNlbmRpZiAvLyBIQ0ZfQVBGX1ZBUl8yCi0jaWYgZGVmaW5lZCBIQ0ZfQVBGX1ZBUl8zCQkJCQkJLy8gTmF0aXZlX1VTQgotCSB7CTMsCQkJCQkJCQkJCS8vIHZhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgotCQlDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzNfQk9UVE9NLAkJLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkJISEhISFzZWUgbm90ZSBiZWxvdyEhISEhISEKLQkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8zX1RPUAkJCS8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5Ci0JIH0sCisjaWYgZGVmaW5lZCBIQ0ZfQVBGX1ZBUl8zICAgICAgICAgICAgICAgICAgICAgICAvLyBOYXRpdmVfVVNCCisJCXsgIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKKwkJICAgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8zX0JPVFRPTSwgICAgICAgIC8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5ICEhISEhc2VlIG5vdGUgYmVsb3chISEhISEhCisJCSAgIENGR19EUlZfQUNUX1JBTkdFU19BUEZfM19UT1AgICAgICAgICAgICAvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQorCQl9LAogI2Vsc2UKLQkgeyAwLCAwLCAwIH0sCisJCXsgMCwgMCwgMCB9LAogI2VuZGlmIC8vIEhDRl9BUEZfVkFSXzMKLSNpZiBkZWZpbmVkIEhDRl9BUEZfVkFSXzQJCQkJCQkvLyBXQVJQIEhlcm1lcyAyLjUKLQkgewk0LAkJCQkJCQkJCQkvLyB2YXJfcmVjWzFdIC0gVmFyaWFudCBudW1iZXIKLQkJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl80X0JPVFRPTSwJCS8vICAgICAgICAgICAtIEJvdHRvbSBDb21wYXRpYmlsaXR5CSEhISEhc2VlIG5vdGUgYmVsb3chISEhISEhCi0JCUNGR19EUlZfQUNUX1JBTkdFU19BUEZfNF9UT1AJCQkvLyAgICAgICAgICAgLSBUb3AgQ29tcGF0aWJpbGl0eQotCSB9CisjaWYgZGVmaW5lZCBIQ0ZfQVBGX1ZBUl80ICAgICAgICAgICAgICAgICAgICAgICAvLyBXQVJQIEhlcm1lcyAyLjUKKwkJeyAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhcl9yZWNbMV0gLSBWYXJpYW50IG51bWJlcgorCQkgICBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzRfQk9UVE9NLCAgICAgICAgLy8gICAgICAgICAgIC0gQm90dG9tIENvbXBhdGliaWxpdHkgISEhISFzZWUgbm90ZSBiZWxvdyEhISEhISEKKwkJICAgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl80X1RPUCAgICAgICAgICAgIC8vICAgICAgICAgICAtIFRvcCBDb21wYXRpYmlsaXR5CisJCX0KICNlbHNlCi0JIHsgMCwgMCwgMCB9CisJCXsgMCwgMCwgMCB9CiAjZW5kaWYgLy8gSENGX0FQRl9WQVJfNAogCX0KIH0gOwogI2RlZmluZSBIQ0ZfVkVSU0lPTiAgVEVYVCggIkhDRiRSZXZpc2lvbjogMS4xMCAkIiApCiAKIHN0YXRpYyBzdHJ1Y3QgLypDRkdfSENGX09QVF9TVFJDVCovIHsKLQloY2ZfMTYJbGVuOwkJCQkJLy9sZW5ndGggb2YgY2ZnX2hjZl9vcHQgc3RydWN0Ci0JaGNmXzE2CXR5cDsJCQkJCS8vdHlwZSAweDA4MkMKLQloY2ZfMTYJIHYwOwkJCQkJCS8vb2Zmc2V0IEhDRl9WRVJTSU9OCi0JaGNmXzE2CSB2MTsJCQkJCQkvLyBNU0ZfQ09NUE9ORU5UX0lECi0JaGNmXzE2CSB2MjsJCQkJCQkvLyBIQ0ZfQUxJR04KLQloY2ZfMTYJIHYzOwkJCQkJCS8vIEhDRl9BU1NFUlQKLQloY2ZfMTYJIHY0OwkJCQkJCS8vIEhDRl9CSUdfRU5ESUFOCi0JaGNmXzE2CSB2NTsJCQkJCQkvLyAvKiBIQ0ZfRExWIHwgSENGX0RMTlYgKi8KLQloY2ZfMTYJIHY2OwkJCQkJCS8vIEhDRl9ETUEKLQloY2ZfMTYJIHY3OwkJCQkJCS8vIEhDRl9FTkNBUAotCWhjZl8xNgkgdjg7CQkJCQkJLy8gSENGX0VYVAotCWhjZl8xNgkgdjk7CQkJCQkJLy8gSENGX0lOVF9PTgotCWhjZl8xNgl2MTA7CQkJCQkJLy8gSENGX0lPCi0JaGNmXzE2CXYxMTsJCQkJCQkvLyBIQ0ZfTEVHQUNZCi0JaGNmXzE2CXYxMjsJCQkJCQkvLyBIQ0ZfTUFYX0xUVgotCWhjZl8xNgl2MTM7CQkJCQkJLy8gSENGX1BST1RfVElNRQotCWhjZl8xNgl2MTQ7CQkJCQkJLy8gSENGX1NMRUVQCi0JaGNmXzE2CXYxNTsJCQkJCQkvLyBIQ0ZfVEFMTElFUwotCWhjZl8xNgl2MTY7CQkJCQkJLy8gSENGX1RZUEUKLQloY2ZfMTYJdjE3OwkJCQkJCS8vIEhDRl9OSUNfVEFMX0NOVAotCWhjZl8xNgl2MTg7CQkJCQkJLy8gSENGX0hDRl9UQUxfQ05UCi0JaGNmXzE2CXYxOTsJCQkJCQkvLyBvZmZzZXQgdGFsbGllcwotCVRDSEFSCXZhbFtzaXplb2YoSENGX1ZFUlNJT04pXTsKKwloY2ZfMTYgIGxlbjsgICAgICAgICAgICAgICAgICAgIC8vbGVuZ3RoIG9mIGNmZ19oY2Zfb3B0IHN0cnVjdAorCWhjZl8xNiAgdHlwOyAgICAgICAgICAgICAgICAgICAgLy90eXBlIDB4MDgyQworCWhjZl8xNiAgIHYwOyAgICAgICAgICAgICAgICAgICAgICAgIC8vb2Zmc2V0IEhDRl9WRVJTSU9OCisJaGNmXzE2ICAgdjE7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gTVNGX0NPTVBPTkVOVF9JRAorCWhjZl8xNiAgIHYyOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhDRl9BTElHTgorCWhjZl8xNiAgIHYzOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhDRl9BU1NFUlQKKwloY2ZfMTYgICB2NDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBIQ0ZfQklHX0VORElBTgorCWhjZl8xNiAgIHY1OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIC8qIEhDRl9ETFYgfCBIQ0ZfRExOViAqLworCWhjZl8xNiAgIHY2OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhDRl9ETUEKKwloY2ZfMTYgICB2NzsgICAgICAgICAgICAgICAgICAgICAgICAvLyBIQ0ZfRU5DQVAKKwloY2ZfMTYgICB2ODsgICAgICAgICAgICAgICAgICAgICAgICAvLyBIQ0ZfRVhUCisJaGNmXzE2ICAgdjk7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSENGX0lOVF9PTgorCWhjZl8xNiAgdjEwOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhDRl9JTworCWhjZl8xNiAgdjExOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhDRl9MRUdBQ1kKKwloY2ZfMTYgIHYxMjsgICAgICAgICAgICAgICAgICAgICAgICAvLyBIQ0ZfTUFYX0xUVgorCWhjZl8xNiAgdjEzOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhDRl9QUk9UX1RJTUUKKwloY2ZfMTYgIHYxNDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBIQ0ZfU0xFRVAKKwloY2ZfMTYgIHYxNTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBIQ0ZfVEFMTElFUworCWhjZl8xNiAgdjE2OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhDRl9UWVBFCisJaGNmXzE2ICB2MTc7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSENGX05JQ19UQUxfQ05UCisJaGNmXzE2ICB2MTg7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSENGX0hDRl9UQUxfQ05UCisJaGNmXzE2ICB2MTk7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IHRhbGxpZXMKKwljaGFyICAgIHZhbFtzaXplb2YoSENGX1ZFUlNJT04pXTsKIH0gQkFTRUQgY2ZnX2hjZl9vcHQgPSB7CiAJc2l6ZW9mKGNmZ19oY2Zfb3B0KS9zaXplb2YoaGNmXzE2KSAtMSwKLQlDRkdfSENGX09QVCwJCQkJLy8gKDB4MDgyQykKKwlDRkdfSENGX09QVCwgICAgICAgICAgICAgICAgLy8gKDB4MDgyQykKIAkoIHNpemVvZihjZmdfaGNmX29wdCkgLSBzaXplb2YoSENGX1ZFUlNJT04pIC0gNCApL3NpemVvZihoY2ZfMTYpLAogI2lmIGRlZmluZWQgTVNGX0NPTVBPTkVOVF9JRAogCU1TRl9DT01QT05FTlRfSUQsCkBAIC00NTUsNyArNDQ4LDcgQEAKIAlIQ0ZfQUxJR04sCiAJSENGX0FTU0VSVCwKIAlIQ0ZfQklHX0VORElBTiwKLQkwLAkJCQkJCQkJCS8vIC8qIEhDRl9ETFYgfCBIQ0ZfRExOViovLAorCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC8qIEhDRl9ETFYgfCBIQ0ZfRExOViovLAogCUhDRl9ETUEsCiAJSENGX0VOQ0FQLAogCUhDRl9FWFQsCkBAIC00NzgsMjE4ICs0NzEsMTk5IEBACiB9OyAvLyBjZmdfaGNmX29wdAogI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQKIAotI2lmIGRlZmluZWQgSENGX1RBTExJRVNfRVhUUkEKLQlyZXBsYWNlZCBieSBIQ0ZfRVhUX1RBTExJRVNfRlcgOwotI2VuZGlmIC8vIEhDRl9UQUxMSUVTX0VYVFJBCi0KLSNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQgfHwgKEhDRl9FWFQpICYgSENGX0VYVF9NQgotI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKIEhDRl9TVEFUSUMgTFRWX1NUUkNUIEJBU0VEIGNmZ19udWxsID0geyAxLCBDRkdfTlVMTCwgezB9IH07Ci0jZW5kaWYgLy8gSENGX0VYVF9NQgorCiBIQ0ZfU1RBVElDIGhjZl8xNiogQkFTRUQgeHh4eFsgXSA9IHsKLSNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX01CCi0JJmNmZ19udWxsLmxlbiwJCQkJCQkJLy9DRkdfTlVMTAkJCQkJCTB4MDgyMAotI2VuZGlmIC8vIEhDRl9FWFRfTUIKKwkmY2ZnX251bGwubGVuLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy9DRkdfTlVMTCAgICAgICAgICAgICAgICAgICAgICAweDA4MjAKICNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQKLQkmY2ZnX2Rydl9pZGVudGl0eS5sZW4sCQkJCQkvL0NGR19EUlZfSURFTlRJVFkgICAgICAgICAgICAgIDB4MDgyNgotCSZjZmdfZHJ2X3N1cF9yYW5nZS5sZW4sCQkJCQkvL0NGR19EUlZfU1VQX1JBTkdFICAgICAgICAgICAgIDB4MDgyNwotCSZjZmdfZHJ2X2FjdF9yYW5nZXNfcHJpLmxlbiwJCQkvL0NGR19EUlZfQUNUX1JBTkdFU19QUkkgICAgICAgIDB4MDgyOAotCSZjZmdfZHJ2X2FjdF9yYW5nZXNfc3RhLmxlbiwJCQkvL0NGR19EUlZfQUNUX1JBTkdFU19TVEEJCTB4MDgyOQotCSZjZmdfZHJ2X2FjdF9yYW5nZXNfaHNpLmxlbiwJCQkvL0NGR19EUlZfQUNUX1JBTkdFU19IU0kJCTB4MDgyQQotCSZjZmdfZHJ2X2FjdF9yYW5nZXNfYXBmLmxlbiwJCQkvL0NGR19EUlZfQUNUX1JBTkdFU19BUEYJCTB4MDgyQgotCSZjZmdfaGNmX29wdC5sZW4sCQkJCQkJLy9DRkdfSENGX09QVAkJCQkJMHgwODJDCi0JTlVMTCwJCQkJCQkJCQkvL0lGQl9QUklJZGVudGl0eSBwbGFjZWhvbGRlcgkweEZEMDIKLQlOVUxMLAkJCQkJCQkJCS8vSUZCX1BSSVN1cCBwbGFjZWhvbGRlcgkJMHhGRDAzCisJJmNmZ19kcnZfaWRlbnRpdHkubGVuLCAgICAgICAgICAgICAgICAgIC8vQ0ZHX0RSVl9JREVOVElUWSAgICAgICAgICAgICAgMHgwODI2CisJJmNmZ19kcnZfc3VwX3JhbmdlLmxlbiwgICAgICAgICAgICAgICAgIC8vQ0ZHX0RSVl9TVVBfUkFOR0UgICAgICAgICAgICAgMHgwODI3CisJJmNmZ19kcnZfYWN0X3Jhbmdlc19wcmkubGVuLCAgICAgICAgICAgIC8vQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSSAgICAgICAgMHgwODI4CisJJmNmZ19kcnZfYWN0X3Jhbmdlc19zdGEubGVuLCAgICAgICAgICAgIC8vQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQSAgICAgICAgMHgwODI5CisJJmNmZ19kcnZfYWN0X3Jhbmdlc19oc2kubGVuLCAgICAgICAgICAgIC8vQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSSAgICAgICAgMHgwODJBCisJJmNmZ19kcnZfYWN0X3Jhbmdlc19hcGYubGVuLCAgICAgICAgICAgIC8vQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRiAgICAgICAgMHgwODJCCisJJmNmZ19oY2Zfb3B0LmxlbiwgICAgICAgICAgICAgICAgICAgICAgIC8vQ0ZHX0hDRl9PUFQgICAgICAgICAgICAgICAgICAgMHgwODJDCisJTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSUZCX1BSSUlkZW50aXR5IHBsYWNlaG9sZGVyICAgMHhGRDAyCisJTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSUZCX1BSSVN1cCBwbGFjZWhvbGRlciAgICAgICAgMHhGRDAzCiAjZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAotCU5VTEwJCQkJCQkJCQkvL2VuZHNlbnRpbmVsCi0gIH07Ci0jZGVmaW5lIHh4eHhfUFJJX0lERU5USVRZX09GRlNFVAkoQVJSQVlfU0laRSh4eHh4KSAtIDMpCi0KLSNlbmRpZiAvLyBNU0ZfQ09NUE9ORU5UX0lEIC8gSENGX0VYVF9NQgorCU5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2VuZHNlbnRpbmVsCit9OworI2RlZmluZSB4eHh4X1BSSV9JREVOVElUWV9PRkZTRVQgICAgKEFSUkFZX1NJWkUoeHh4eCkgLSAzKQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqIFQgTyBQICAgTCBFIFYgRSBMICAgSCBDIEYgICBSIE8gVSBUIEkgTiBFIFMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKiBUIE8gUCAgIEwgRSBWIEUgTCAgIEggQyBGICAgUiBPIFUgVCBJIE4gRSBTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWYgKEhDRl9ETF9PTkxZKSA9PSAwCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qLk1PRFVMRQkJaW50IGhjZl9hY3Rpb24oIElGQlAgaWZicCwgaGNmXzE2IGFjdGlvbiApCi0qLlBVUlBPU0UJCUNoYW5nZXMgdGhlIHJ1bi10aW1lIENhcmQgYmVoYXZpb3IuCi0qCQkJCVBlcmZvcm1zIE1pc2NlbGxhbnVvdXMgYWN0aW9ucy4KLSoKLSouQVJHVU1FTlRTCi0qCWlmYnAJCQkJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawotKglhY3Rpb24JCQkJCW51bWJlciBpZGVudGlmeWluZyB0aGUgdHlwZSBvZiBjaGFuZ2UKLSoJIC0gSENGX0FDVF9DQ1hfT0ZGCQlkaXNhYmxlIENLSVAKLSoJIC0gSENGX0FDVF9DQ1hfT04JCWVuYWJsZSBDS0lQCi0qCSAtIEhDRl9BQ1RfSU5UX0ZPUkNFX09OCWVuYWJsZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBieSBXYXZlTEFOIE5JQwotKgkgLSBIQ0ZfQUNUX0lOVF9PRkYJCWRpc2FibGUgaW50ZXJydXB0IGdlbmVyYXRpb24gYnkgV2F2ZUxBTiBOSUMKLSoJIC0gSENGX0FDVF9JTlRfT04JCWNvbXBlbnNhdGUgMSBIQ0ZfQUNUX0lOVF9PRkYsIGVuYWJsZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBpZiBiYWxhbmNlIHJlYWNoZWQKLSoJIC0gSENGX0FDVF9QUlNfU0NBTgkJSGVybWVzIFByb2JlIFJlc3BvbnMgU2NhbiAoRjEwMikgY29tbWFuZAotKgkgLSBIQ0ZfQUNUX1JYX0FDSwkJYWNrbm93bGVkZ2Ugbm9uLURNQSByZWNlaXZlciB0byBIZXJtZXMKLSoJIC0gSENGX0FDVF9TQ0FOCQkJSGVybWVzIElucXVpcmUgU2NhbiAoRjEwMSkgY29tbWFuZCAobm9uLVdBUlAgb25seSkKLSoJIC0gSENGX0FDVF9TTEVFUAkJRERTIFNsZWVwIHJlcXVlc3QKLSoJIC0gSENGX0FDVF9UQUxMSUVTCQlIZXJtZXMgSW5xdWlyZSBUYWxsaWVzIChGMTAwKSBjb21tYW5kCi0qCi0qLlJFVFVSTlMKLSoJSENGX1NVQ0NFU1MJCQkJYWxsIChpbmNsdWRpbmcgaW52YWxpZCkKLSoJSENGX0lOVF9QRU5ESU5HCQkJSENGX0FDVF9JTlRfT0ZGLCBpbnRlcnJ1cHQgcGVuZGluZwotKglIQ0ZfRVJSX05PX05JQwkJCUhDRl9BQ1RfSU5UX09GRiwgTklDIHByZXNlbmNlIGNoZWNrIGZhaWxzCi0qCi0qLkNPTkRJVElPTlMKLSogRXhjZXB0IGZvciBoY2ZfYWN0aW9uIHdpdGggSENGX0FDVF9JTlRfRk9SQ0VfT04gb3IgSENGX0FDVF9JTlRfT0ZGIGFzIHBhcmFtZXRlciBvciBoY2ZfY29ubmVjdCB3aXRoIGFuIEkvTwotKiBhZGRyZXNzIChpLmUuIG5vdCBIQ0ZfRElTQ09OTkVDVCksIGFsbCBoY2YtZnVuY3Rpb24gY2FsbHMgTVVTVCBiZSBwcmVjZWRlZCBieSBhIGNhbGwgb2YgaGNmX2FjdGlvbiB3aXRoCi0qIEhDRl9BQ1RfSU5UX09GRiBhcyBwYXJhbWV0ZXIuCi0qIE5vdGUgdGhhdCBoY2ZfY29ubmVjdCBkZWZhdWx0cyB0byBOSUMgaW50ZXJydXB0IGRpc2FibGVkIG1vZGUsIGkuZS4gYXMgaWYgaGNmX2FjdGlvbiggSENGX0FDVF9JTlRfT0ZGICkKLSogd2FzIGNhbGxlZC4KLSoKLSouREVTQ1JJUFRJT04KLSogaGNmX2FjdGlvbiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG1vZGUgY2hhbmdpbmcgYWN0aW9uLWNvZGUgcGFpcnMgdGhhdCBhcmUgYW50b255bXMKLSoJIC0gSENGX0FDVF9DQ1hfT0ZGIC8gSENGX0FDVF9DQ1hfT04KLSoJIC0gSENGX0FDVF9JTlRfW0ZPUkNFX11PTiAvIEhDRl9BQ1RfSU5UX09GRgotKgotKiBBZGRpdGlvbmFsbHkgaGNmX2FjdGlvbiBjYW4gc3RhcnQgdGhlIGZvbGxvd2luZyBhY3Rpb25zIGluIHRoZSBOSUM6Ci0qCSAtIEhDRl9BQ1RfUFJTX1NDQU4KLSoJIC0gSENGX0FDVF9SWF9BQ0sKLSoJIC0gSENGX0FDVF9TQ0FOCi0qCSAtIEhDRl9BQ1RfU0xFRVAKLSoJIC0gSENGX0FDVF9UQUxMSUVTCi0qCi0qIG8gSENGX0FDVF9JTlRfT0ZGOiBTZXRzIE5JQyBJbnRlcnJ1cHRzIG1vZGUgRGlzYWJsZWQuCi0qIFRoaXMgY29tbWFuZCwgYW5kIHRoZSBhc3NvY2lhdGVkIFtGb3JjZV0gRW5hYmxlIE5JQyBpbnRlcnJ1cHRzIGNvbW1hbmQsIGFyZSBvbmx5IGF2YWlsYWJsZSBpZiB0aGUgSENGX0lOVF9PTgotKiBjb21waWxlIHRpbWUgb3B0aW9uIGlzIG5vdCBzZXQgYXQgMHgwMDAwLgotKgotKiBvIEhDRl9BQ1RfSU5UX09OOiBTZXRzIE5JQyBJbnRlcnJ1cHRzIG1vZGUgRW5hYmxlZC4KLSogRW5hYmxlIE5JQyBJbnRlcnJ1cHRzLCBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZiBwcmVjZWRpbmcgRGlzYWJsZSBOSUMgSW50ZXJydXB0IGNhbGxzLgotKgotKiBvIEhDRl9BQ1RfSU5UX0ZPUkNFX09OOiBGb3JjZSBOSUMgSW50ZXJydXB0cyBtb2RlIEVuYWJsZWQuCi0qIFNldHMgTklDIEludGVycnVwdHMgbW9kZSBFbmFibGVkLCByZWdhcmRsZXNzIG9mZiB0aGUgbnVtYmVyIG9mIHByZWNlZGluZyBEaXNhYmxlIE5JQyBJbnRlcnJ1cHQgY2FsbHMuCi0qCi0qIFRoZSBkaXNhYmxpbmcgYW5kIGVuYWJsaW5nIG9mIGludGVycnVwdHMgYXJlIGFudG9ueW1zLgotKiBUaGVzZSBhY3Rpb25zIG11c3QgYmUgYmFsYW5jZWQuCi0qIEZvciBlYWNoICJkaXNhYmxlIGludGVycnVwdHMiIHRoZXJlIG11c3QgYmUgYSBtYXRjaGluZyAiZW5hYmxlIGludGVycnVwdHMiLgotKiBUaGUgZGlzYWJsZSBpbnRlcnJ1cHRzIG1heSBiZSBleGVjdXRlZCBtdWx0aXBsZSB0aW1lcyBpbiBhIHJvdyB3aXRob3V0IGludGVydmVuaW5nIGVuYWJsZSBpbnRlcnJ1cHRzLCBpbgotKiBvdGhlciB3b3JkcywgdGhlIGRpc2FibGUgaW50ZXJydXB0cyBtYXkgYmUgbmVzdGVkLgotKiBUaGUgaW50ZXJydXB0IGdlbmVyYXRpb24gbWVjaGFuaXNtIGlzIGRpc2FibGVkIGF0IHRoZSBmaXJzdCBjYWxsIHdpdGggSENGX0FDVF9JTlRfT0ZGLgotKiBUaGUgaW50ZXJydXB0IGdlbmVyYXRpb24gbWVjaGFuaXNtIGlzIHJlLWVuYWJsZWQgd2hlbiB0aGUgbnVtYmVyIG9mIGNhbGxzIHdpdGggSENGX0FDVF9JTlRfT04gbWF0Y2hlcyB0aGUKLSogbnVtYmVyIG9mIGNhbGxzIHdpdGggSU5UX09GRi4KLSoKLSogSXQgaXMgbm90IGFsbG93ZWQgdG8gaGF2ZSBtb3JlIEVuYWJsZSBOSUMgSW50ZXJydXB0cyBjYWxscyB0aGFuIERpc2FibGUgTklDIEludGVycnVwdHMgY2FsbHMuCi0qIFRoZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBtZWNoYW5pc20gaXMgaW5pdGlhbGx5IChpLmUuIGFmdGVyIGhjZl9jb25uZWN0KSBkaXNhYmxlZC4KLSogQW4gTVNGIGJhc2VkIG9uIGEgaW50ZXJydXB0IHN0cmF0ZWd5IG11c3QgY2FsbCBoY2ZfYWN0aW9uIHdpdGggSU5UX09OIGluIGl0cyBpbml0aWFsaXphdGlvbiBsb2dpYy4KLSoKLSohCVRoZSBJTlRfT0ZGL0lOVF9PTiBob3VzZWtlZXBpbmcgaXMgaW5pdGlhbGl6ZWQgYXQgMHgwMDAwIGJ5IGhjZl9jb25uZWN0LCBjYXVzaW5nIHRoZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbgotKgltZWNoYW5pc20gdG8gYmUgZGlzYWJsZWQgYXQgZmlyc3QuIFRoaXMgc3VpdHMgTVNGIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGEgcG9sbGluZyBzdHJhdGVneS4KLSoKLSogbyBIQ0ZfQUNUX0NDWF9PRkYgLyBIQ0ZfQUNUX0NDWF9PTgotKiEhIFRoaXMgY2FuIHVzZSBzb21lIG1vcmUgZXhwbGFuYXRpb247PwotKiBEaXNhYmxlcyBhbmQgRW5hYmxlcyBzdXBwb3J0IGluIHRoZSBIQ0YgcnVudGltZSBjb2RlIGZvciB0aGUgQ0NYIGZlYXR1cmUuIEVhY2ggdGltZSBvbmUgb2YgdGhlc2UgYWN0aW9uCi0qIGNvZGVzIGlzIHVzZWQsIHRoZSBlZmZlY3RzIG9mIHRoZSBwcmVjZWRpbmcgdXNlIGNlYXNlLgotKgotKiBvIEhDRl9BQ1RfU0xFRVA6IEluaXRpYXRlcyB0aGUgRGlzY29ubmVjdGVkIERlZXBTbGVlcCBwcm9jZXNzCi0qIFRoaXMgY29tbWFuZCBpcyBvbmx5IGF2YWlsYWJsZSBpZiB0aGUgSENGX0REUyBjb21waWxlIHRpbWUgb3B0aW9uIGlzIHNldC4gSXQgdHJpZ2dlcnMgdGhlIEYvVyB0byBzdGFydCB0aGUKLSogc2xlZXAgaGFuZHNoYWtpbmcuIFJlZ2FyZGxlc3Mgd2hldGhlciB0aGUgSG9zdCBpbml0aWF0ZXMgYSBEaXNjb25uZWN0ZWQgRGVlcFNsZWVwIChERFMpIG9yIHRoZSBGL1cgaW5pdGlhdGVzCi0qIGEgQ29ubmVjdGVkIERlZXBTbGVlcCAoQ0RTKSwgdGhlIEhvc3QtRi9XIHNsZWVwIGhhbmRzaGFraW5nIGlzIGNvbXBsZXRlZCB3aGVuIHRoZSBOSUMgSW50ZXJydXB0cyBtb2RlIGlzCi0qIGVuYWJsZWQgKGJ5IG1lYW5zIG9mIHRoZSBiYWxhbmNpbmcgSENGX0FDVF9JTlRfT04pLCBpLmUuIGF0IHRoYXQgbW9tZW50IHRoZSBGL1cgcmVhbGx5IGdvZXMgaW50byBzbGVlcCBtb2RlLgotKiBUaGUgRi9XIGlzIHdva2VudXAgYnkgdGhlIEhDRiB3aGVuIHRoZSBOSUMgSW50ZXJydXB0cyBtb2RlIGFyZSBkaXNhYmxlZCwgaS5lLiBhdCB0aGUgZmlyc3QgSENGX0FDVF9JTlRfT0ZGCi0qIGFmdGVyIGdvaW5nIGludG8gc2xlZXAuCi0qCi0qIFRoZSBmb2xsb3dpbmcgTWlzY2VsbGFudW91cyBhY3Rpb25zIGFyZSBkZWZpbmVkOgotKgotKiBvIEhDRl9BQ1RfUlhfQUNLOiBSZWNlaXZlciBBY2tub3dsZWRnZW1lbnQgKG5vbi1ETUEsIG5vbi1VU0IgbW9kZSBvbmx5KQotKiBBY2tpbmcgdGhlIHJlY2VpdmVyLCBmcmVlcyB0aGUgTklDIG1lbW9yeSB1c2VkIHRvIGhvbGQgdGhlIFJ4IGZyYW1lIGFuZCBhbGxvd3MgdGhlIEYvVyB0bwotKiByZXBvcnQgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgbmV4dCBSeCBmcmFtZS4KLSogSWYgdGhlIE1TRiBkb2VzIG5vdCBuZWVkIGFjY2VzcyAoYW55IGxvbmdlcikgdG8gdGhlIGN1cnJlbnQgZnJhbWUsIGUuZy4gYmVjYXVzZSBpdCBpcyByZWplY3RlZCBiYXNlZCBvbiB0aGUKLSogbG9vayBhaGVhZCBvciBjb3BpZWQgdG8gYW5vdGhlciBidWZmZXIsIHRoZSByZWNlaXZlciBtYXkgYmUgYWNrZWQuIEFja2luZyBlYXJsaWVyIGlzIGFzc3VtZWQgdG8gaGF2ZSB0aGUKLSogcG90ZW50aWFsIG9mIGltcHJvdmluZyB0aGUgcGVyZm9ybWFuY2UuCi0qIElmIHRoZSBNU0YgZG9lcyBub3QgZXhwbGl0bHkgYWNrIHRlIHJlY2VpdmVyLCB0aGUgYWNraW5nIGlzIGRvbmUgaW1wbGljaXRseSBpZjoKLSogLSB0aGUgcmVjZWl2ZWQgZnJhbWUgZml0cyBpbiB0aGUgbG9vayBhaGVhZCBidWZmZXIsIGJ5IHRoZSBoY2Zfc2VydmljZV9uaWMgY2FsbCB0aGF0IHJlcG9ydGVkIHRoZSBSeCBmcmFtZQotKiAtIGlmIG5vdCBpbiB0aGUgYWJvdmUgc3RlcCwgYnkgaGNmX3Jjdl9tc2cgKGFzc3VtaW5nIGhjZl9yY3ZfbXNnIGlzIGNhbGxlZCkKLSogLSBpZiBuZWl0aGVyIG9mIHRoZSBhYm92ZSBpbXBsaWNpdCBhY2tzIG5vciBhbiBleHBsaWNpdCBhY2sgYnkgdGhlIE1TRiwgYnkgdGhlIGZpcnN0IGhjZl9zZXJ2aWNlX25pYyBhZnRlcgotKgl0aGUgaGNmX3NlcnZpY2VfbmljIHRoYXQgcmVwb3J0ZWQgdGhlIFJ4IGZyYW1lLgotKiBOb3RlOiBJZiBhbiBSeCBmcmFtZSBpcyBhbHJlYWR5IGFja2VkLCBhbiBleHBsaWNpdCBBQ0sgYnkgdGhlIE1TRiBhY3RzIGFzIGEgTm9PcGVyYXRpb24uCi0qCi0qIG8gSENGX0FDVF9UQUxMSUVTOiBJbnF1aXJlIFRhbGxpZXMgY29tbWFuZAotKiBUaGlzIGNvbW1hbmQgaXMgb25seSBvcGVyYXRpb25hbCBpZiB0aGUgRi9XIGlzIGVuYWJsZWQuCi0qIFRoZSBJbnF1aXJlIFRhbGxpZXMgY29tbWFuZCByZXF1ZXN0cyB0aGUgRi9XIHRvIHByb3ZpZGUgaXRzIGN1cnJlbnQgc2V0IG9mIHRhbGxpZXMuCi0qIFNlZSBhbHNvIGhjZl9nZXRfaW5mbyB3aXRoIENGR19UQUxMSUVTIGFzIHBhcmFtZXRlci4KLSoKLSogbyBIQ0ZfQUNUX1BSU19TQ0FOOiBJbnF1aXJlIFByb2JlIFJlc3BvbnMgU2NhbiBjb21tYW5kCi0qIFRoaXMgY29tbWFuZCBpcyBvbmx5IG9wZXJhdGlvbmFsIGlmIHRoZSBGL1cgaXMgZW5hYmxlZC4KLSogVGhlIFByb2JlIFJlc3BvbnMgU2NhbiBjb21tYW5kIHN0YXJ0cyBhIHNjYW4gc2VxdWVuY2UuCi0qIFRoZSBIQ0YgcHV0cyB0aGUgcmVzdWx0IG9mIHRoaXMgYWN0aW9uIGluIGFuIE1TRiBkZWZpbmVkIGJ1ZmZlciAoc2VlIENGR19SSURfTE9HX1NUUkNUKS4KLSoKLSogbyBIQ0ZfQUNUX1NDQU46IElucXVpcmUgU2NhbiBjb21tYW5kCi0qIFRoaXMgY29tbWFuZCBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgSElJIEYvVyAoaS5lLiBwcmUtV0FSUCkgYW5kIGl0IGlzIG9wZXJhdGlvbmFsIGlmIHRoZSBGL1cgaXMgZW5hYmxlZC4KLSogVGhlIElucXVpcmUgU2NhbiBjb21tYW5kIHN0YXJ0cyBhIHNjYW4gc2VxdWVuY2UuCi0qIFRoZSBIQ0YgcHV0cyB0aGUgcmVzdWx0IG9mIHRoaXMgYWN0aW9uIGluIGFuIE1TRiBkZWZpbmVkIGJ1ZmZlciAoc2VlIENGR19SSURfTE9HX1NUUkNUKS4KLSoKLSogQXNzZXJ0IGZhaWxzIGlmCi0qIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgotKiAtIE5JQyBpbnRlcnJ1cHRzIGFyZSBub3QgZGlzYWJsZWQgd2hpbGUgcmVxdWlyZWQgYnkgcGFyYW1ldGVyIGFjdGlvbi4KLSogLSBhbiBpbnZhbGlkIGNvZGUgaXMgc3BlY2lmaWVkIGluIHBhcmFtZXRlciBhY3Rpb24uCi0qIC0gSENGX0FDVF9JTlRfT04gY29tbWFuZHMgb3V0bnVtYmVyIHRoZSBIQ0ZfQUNUX0lOVF9PRkYgY29tbWFuZHMuCi0qIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbiBhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yCi0qCW11bHRpLXRocmVhZGluZwotKgotKiAtIFNpbmNlIHRoZSBIQ0YgZG9lcyBub3QgbWFpbnRhaW4gc3RhdHVzIGluZm9ybWF0aW9uIHJlbGF0aXZlIHRvIHRoZSBGL1cgZW5hYmxlZCBzdGF0ZSwgaXQgaXMgbm90IGFzc2VydGVkCi0qCXdoZXRoZXIgSENGX0FDVF9TQ0FOLCBIQ0ZfQUNUX1BSU19TQ0FOIG9yIEhDRl9BQ1RfVEFMTElFUyBhcmUgb25seSB1c2VkIHdoaWxlIEYvVyBpcyBlbmFibGVkLgotKgotKi5ESUFHUkFNCi0qIDA6IFRoZSBhc3NlcnQgZW1iZWRkZWQgaW4gSENGTE9HRU5UUlkgY2hlY2tzIGFnYWluc3QgcmUtZW50cmFuY3kuIFJlLWVudHJhbmN5IGNvdWxkIGJlIGNhdXNlZCBieSBhIE1TRiBsb2dpYwotKglhdCB0YXNrLWxldmVsIGNhbGxpbmcgaGNmX2Z1bmN0aW9ucyB3aXRob3V0IHNoaWVsZGluZyB3aXRoIEhDRl9BQ1RfT04vX09GRi4gSG93ZXZlciB0aGUgSENGX0FDVF9JTlRfT0ZGCi0qCWFjdGlvbiBpdHNlbGYgY2FuIHBlciBkZWZpbml0aW9uIG5vdCBiZSBwcm90ZWN0ZWQgdGhpcyB3YXkuIEJhc2VkIG9uIGNvZGUgaW5zcGVjdGlvbiwgaXQgY2FuIGJlIGNvbmNsdWRlZCwKLSoJdGhhdCB0aGVyZSBpcyBubyByZS1lbnRyYW5jeSBQUk9CTEVNIGluIHRoaXMgcGFydGljdWxhciBmbG93LiBJdCBkb2VzIG5vdCBzZWVtIHdvcnRoIHRoZSB0cm91YmxlIHRvCi0qCWV4cGxpY2l0bHkgY2hlY2sgZm9yIHRoaXMgY29uZGl0aW9uIChhbHRob3VnaCB0aGVyZSB3YXMgYSByZXBvcnQgb2YgYW4gTVNGIHdoaWNoIHJhbiBpbnRvIHRoaXMgYXNzZXJ0LgotKiAyOklGQl9JbnRPZmZDbnQgaXMgdXNlZCB0byBiYWxhbmNlIHRoZSBJTlRfT0ZGIGFuZCBJTlRfT04gY2FsbHMuICBEaXNhYmxpbmcgb2YgdGhlIGludGVycnVwdHMgaXMgYWNoaWV2ZWQgYnkKLSoJd3JpdGluZyBhIHplcm8gdG8gdGhlIEhlcm1lcyBJbnRFbiByZWdpc3Rlci4gIEluIGEgc2hhcmVkIGludGVycnVwdCBlbnZpcm9ubWVudCAoZS5nLiB0aGUgbWluaS1QQ0kgTkRJUwotKglkcml2ZXIpIGl0IGlzIGNvbnNpZGVyZWQgbW9yZSBjb3JyZWN0IHRvIHJldHVybiB0aGUgc3RhdHVzIEhDRl9JTlRfUEVORElORyBpZiBhbmQgb25seSBpZiwgdGhlIGN1cnJlbnQKLSoJaW52b2NhdGlvbiBvZiBoY2Zfc2VydmljZV9uaWMgaXMgKGFwcGFyZW50bHkpIGNhbGxlZCBpbiB0aGUgSVNSIHdoZW4gdGhlIElTUiB3YXMgYWN0aXZhdGVkIGFzIHJlc3VsdCBvZiBhCi0qCWNoYW5nZSBpbiBIUkVHX0VWX1NUQVQgbWF0Y2hpbmcgYSBiaXQgaW4gSFJFR19JTlRfRU4sIGkuZS4gbm90IGlmIGludm9rZWQgYXMgcmVzdWx0IG9mIGFub3RoZXIgZGV2aWNlCi0qCWdlbmVyYXRpbmcgYW4gaW50ZXJydXB0IG9uIHRoZSBzaGFyZWQgaW50ZXJydXB0IGxpbmUuCi0qCU5vdGUgMTogaXQgaGFzIGJlZW4gb2JzZXJ2ZWQgdGhhdCB1bmRlciBjZXJ0YWluIGFkdmVyc2UgY29uZGl0aW9ucyBvbiBjZXJ0YWluIHBsYXRmb3JtcyB0aGUgd3JpdGluZyBvZgotKglIUkVHX0lOVF9FTiBjYW4gYXBwYXJlbnRseSBmYWlsLCB0aGVyZWZvciBpdCBpcyBwYXJhbW91bnQgdGhhdCBIUkVHX0lOVF9FTiBpcyB3cml0dGVuIGFnYWluIHdpdGggMCBmb3IKLSoJZWFjaCBhbmQgZXZlcnkgY2FsbCB0byBIQ0ZfQUNUX0lOVF9PRkYuCi0qCU5vdGUgMjogaXQgaGFzIGJlZW4gb2JzZXJ2ZWQgdGhhdCB1bmRlciBjZXJ0YWluIEgvVyAmIFMvVyBhcmNoaXRlY3R1cmVzIHRoaXMgbG9naWMgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMKLSoJbm8gTklDIGF0IGFsbC4gVG8gY2F0ZXIgZm9yIHRoaXMsIHRoZSB2YWx1ZSBvZiBIUkVHX0lOVF9FTiBpcyB2YWxpZGF0ZWQuIElmIHRoZSB1bnVzZWQgYml0IDB4MDEwMCBpcyBzZXQsCi0qCWl0IGlzIGFzc3VtZWQgdGhlcmUgaXMgbm8gTklDLgotKglOb3RlIDM6IER1cmluZyB0aGUgZG93bmxvYWQgcHJvY2Vzcywgc29tZSB2ZXJzaW9ucyBvZiB0aGUgRi9XIHJlc2V0IEhSRUdfU1dfMCwgaGVuY2UgY2hlY2tpbmcgdGhpcwotKglyZWdpc3RlciBmb3IgSENGX01BR0lDICh0aGUgY2xhc3NpY2FsIE5JQyBwcmVzZW5jZSB0ZXN0KSB3aGVuIEhDRl9BQ1RfSU5UX09GRiBpcyBjYWxsZWQgZHVlIHRvIGFub3RoZXIKLSoJY2FyZCBpbnRlcnJ1cHRpbmcgdmlhIGEgc2hhcmVkIElSUSBkdXJpbmcgYSBkb3dubG9hZCwgZmFpbHMuCi0qNDoJVGhlIGNvbnN0cnVjdGlvbiAiaWYgKCBpZmJwLT5JRkJfSW50T2ZmQ250LS0gPT0gMCApIiBpcyBvcHRpbWFsIChpbiB0aGUgc2Vuc2Ugb2Ygc2hvcnRlc3QvcXVpY2tlc3QKLSoJcGF0aCBpbiBlcnJvciBmcmVlIGZsb3dzKSBidXQgTk9UIGZhaWwgc2FmZSBpbiBjYXNlIG9mIHRvbyBtYW55IElOVF9PTiBpbnZvY2F0aW9ucyBjb21wYXJlZCB0byBJTlRfT0ZGKS4KLSoJRW5hYmxpbmcgb2YgdGhlIGludGVycnVwdHMgaXMgYWNoaWV2ZWQgYnkgd3JpdGluZyB0aGUgSGVybWVzIEludEVuIHJlZ2lzdGVyLgotKgkgLSBJZiB0aGUgSENGIGlzIGluIERlZnVuY3QgbW9kZSwgdGhlIGludGVycnVwdHMgc3RheSBkaXNhYmxlZC4KLSoJIC0gVW5kZXIgIm5vcm1hbCIgY29uZGl0aW9ucywgdGhlIEhDRiBpcyBvbmx5IGludGVyZXN0ZWQgaW4gSW5mbyBFdmVudHMsIFJ4IEV2ZW50cyBhbmQgTm90aWZ5IEV2ZW50cy4KLSoJIC0gV2hlbiB0aGUgSENGIGlzIG91dCBvZiBUeC9Ob3RpZnkgcmVzb3VyY2VzLCB0aGUgSENGIGlzIGFsc28gaW50ZXJlc3RlZCBpbiBBbGxvYyBFdmVudHMuCi0qCSAtIHZpYSBIQ0ZfRVhULCB0aGUgTVNGIHByb2dyYW1tZXIgY2FuIGFsc28gcmVxdWVzdCBIUkVHX0VWX1RJQ0sgYW5kL29yIEhSRUdfRVZfVFhfRVhDIGludGVycnVwdHMuCi0qCUZvciBETUEgb3BlcmF0aW9uLCB0aGUgRE1BIGhhcmR3YXJlIGhhbmRsZXMgdGhlIGFsbG9jIGV2ZW50cy4gVGhlIERNQSBlbmdpbmUgd2lsbCBnZW5lcmF0ZSBhICdUeERtYURvbmUnCi0qCWV2ZW50IGFzIHNvb24gYXMgaXQgaGFzIHB1bXBlZCBhIGZyYW1lIGZyb20gaG9zdCByYW0gaW50byBOSUMtUkFNIChub3RlIHRoYXQgdGhlIGZyYW1lIGRvZXMgbm90IGhhdmUgdG8gYmUKLSoJdHJhbnNtaXR0ZWQgdGhlbiksIGFuZCBhICdSeERtYURvbmUnIGV2ZW50IGFzIHNvb24gYXMgYSByZWNlaXZlZCBmcmFtZSBoYXMgYmVlbiBwdW1wZWQgZnJvbSBOSUMtUkFNIGludG8KLSoJaG9zdCByYW0uICBOb3RlIHRoYXQgdGhlICdhbGxvYycgZXZlbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBldmVudC1tYXNrLCBiZWNhdXNlIHRoZSBETUEgZW5naW5lIHdpbGwKLSoJcmVhY3QgdG8gYW5kIGFja25vd2xlZGdlIHRoaXMgZXZlbnQuCi0qNjoJYWNrIHRoZSAib2xkIiBSeC1ldmVudC4gU2VlICJSeCBCdWZmZXIgZnJlZSBzdHJhdGVneSIgaW4gaGNmX3NlcnZpY2VfbmljIGFib3ZlIGZvciBtb3JlIGV4cGxhbmF0aW9uLgotKglJRkJfUnhGSUQgYW5kIElGQl9SeExlbiBtdXN0IGJlIGNsZWFyZWQgdG8gYnJpbmcgYm90aCB0aGUgaW50ZXJuYWwgSENGIGhvdXNlIGtlZXBpbmcgYW5kIHRoZSBpbmZvcm1hdGlvbgotKglzdXBwbGllZCB0byB0aGUgTVNGIGluIHRoZSBzdGF0ZSAibm8gZnJhbWUgcmVjZWl2ZWQiLgotKjg6CVRoZSBIQ0ZfQUNUX1NDQU4sIEhDRl9BQ1RfUFJTX1NDQU4gYW5kIEhDRl9BQ1RfVEFMTElFUyBhY3Rpdml0eSBhcmUgbWVyZ2VkIGJ5ICJjbGV2ZXIiIGFsZ2VicmFpYwotKgltYW5pcHVsYXRpb25zIG9mIHRoZSBSSUQtdmFsdWVzIGFuZCBhY3Rpb24gY29kZXMsIHNvIGZvcmVnb2luZyByb2J1c3RuZXNzIGFnYWluc3QgbWlncmF0aW9uIHByb2JsZW1zIGZvcgotKgllYXNlIG9mIGltcGxlbWVudGF0aW9uLiBUaGUgYXNzdW1wdGlvbnMgYWJvdXQgbnVtZXJpY2FsIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBDRkdfVEFMTElFUyBldGMgYW5kCi0qCUhDRl9BQ1RfVEFMTElFUyBldGMgYXJlIGNoZWNrZWQgYnkgdGhlICIjaWYiIHN0YXRlbWVudHMganVzdCBwcmlvciB0byB0aGUgYm9keSBvZiB0aGlzIHJvdXRpbmUsIHJlc3VsdGluZwotKglpbjogZXJyICJtYWludGVuYW5jZSIgZHVyaW5nIGNvbXBpbGF0aW9uIGlmIHRoZSBhc3N1bXB0aW9ucyBhcmUgbm8gbG9uZ2VyIG1ldC4gVGhlIHdyaXRpbmcgb2YgSFJFR19QQVJBTV8xCi0qCXdpdGggMHgzRkZGIGluIGNhc2Ugb2YgYW4gUFJTIHNjYW4sIGlzIGEga2x1ZGdlIHRvIGdldCBhcm91bmQgbGFjayBvZiBzcGVjaWZpY2F0aW9uLCBoZW5jZSBkaWZmZXJlbnQKLSoJaW1wbGVtZW50YXRpb24gaW4gRi9XIGFuZCBIb3N0LgotKglXaGVuIHRoZXJlIGlzIG5vIE5JQyBSQU0gYXZhaWxhYmxlLCBzb21lIHZlcnNpb25zIG9mIHRoZSBIZXJtZXMgRi9XIGRvIHJlcG9ydCAweDdGMDAgYXMgZXJyb3IgaW4gdGhlCi0qCVJlc3VsdCBmaWVsZCBvZiB0aGUgU3RhdHVzIHJlZ2lzdGVyIGFuZCBzb21lIEYvVyB2ZXJzaW9ucyBkb24ndC4gVG8gbWFzayB0aGlzIGRpZmZlcmVuY2UgdG8gdGhlIE1TRiBhbGwKLSoJcmV0dXJuIGNvZGVzIG9mIHRoZSBIZXJtZXMgYXJlIGlnbm9yZWQgKCJiZXN0IiBhbmQgIm1vc3Qgc2ltcGxlIiBzb2x1dGlvbiB0byB0aGVzZSB0eXBlcyBvZiBhbmFsb21pZXMgd2l0aAotKglhbiBhY2NlcHRhYmxlIGxvc3MgZHVlIHRvIGlnbm9yaW5nIGFsbCBlcnJvciBzaXR1YXRpb25zIGFzIHdlbGwpLgotKglUaGUgIk5vIGlucXVpcmUgc3BhY2UiIGlzIHJlcG9ydGVkIHZpYSB0aGUgSGVybWVzIHRhbGxpZXMuCi0qMzA6IGRvIG5vdCBIQ0ZBU1NFUlQoIHJjLCByYyApIHNpbmNlIHJjID09IEhDRl9JTlRfUEVORElORyBpcyBubyBlcnJvcgotKgotKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqCisgKi5NT0RVTEUgICAgICAgIGludCBoY2ZfYWN0aW9uKCBJRkJQIGlmYnAsIGhjZl8xNiBhY3Rpb24gKQorICouUFVSUE9TRSAgICAgICBDaGFuZ2VzIHRoZSBydW4tdGltZSBDYXJkIGJlaGF2aW9yLgorICogICAgICAgICAgICAgICBQZXJmb3JtcyBNaXNjZWxsYW51b3VzIGFjdGlvbnMuCisgKgorICouQVJHVU1FTlRTCisgKiAgIGlmYnAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworICogICBhY3Rpb24gICAgICAgICAgICAgICAgICBudW1iZXIgaWRlbnRpZnlpbmcgdGhlIHR5cGUgb2YgY2hhbmdlCisgKiAgICAtIEhDRl9BQ1RfSU5UX0ZPUkNFX09OIGVuYWJsZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBieSBXYXZlTEFOIE5JQworICogICAgLSBIQ0ZfQUNUX0lOVF9PRkYgICAgICBkaXNhYmxlIGludGVycnVwdCBnZW5lcmF0aW9uIGJ5IFdhdmVMQU4gTklDCisgKiAgICAtIEhDRl9BQ1RfSU5UX09OICAgICAgIGNvbXBlbnNhdGUgMSBIQ0ZfQUNUX0lOVF9PRkYsIGVuYWJsZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBpZiBiYWxhbmNlIHJlYWNoZWQKKyAqICAgIC0gSENGX0FDVF9QUlNfU0NBTiAgICAgSGVybWVzIFByb2JlIFJlc3BvbnMgU2NhbiAoRjEwMikgY29tbWFuZAorICogICAgLSBIQ0ZfQUNUX1JYX0FDSyAgICAgICBhY2tub3dsZWRnZSBub24tRE1BIHJlY2VpdmVyIHRvIEhlcm1lcworICogICAgLSBIQ0ZfQUNUX1NDQU4gICAgICAgICBIZXJtZXMgSW5xdWlyZSBTY2FuIChGMTAxKSBjb21tYW5kIChub24tV0FSUCBvbmx5KQorICogICAgLSBIQ0ZfQUNUX1NMRUVQICAgICAgICBERFMgU2xlZXAgcmVxdWVzdAorICogICAgLSBIQ0ZfQUNUX1RBTExJRVMgICAgICBIZXJtZXMgSW5xdWlyZSBUYWxsaWVzIChGMTAwKSBjb21tYW5kCisgKgorICouUkVUVVJOUworICogICBIQ0ZfU1VDQ0VTUyAgICAgICAgICAgICBhbGwgKGluY2x1ZGluZyBpbnZhbGlkKQorICogICBIQ0ZfSU5UX1BFTkRJTkcgICAgICAgICBIQ0ZfQUNUX0lOVF9PRkYsIGludGVycnVwdCBwZW5kaW5nCisgKiAgIEhDRl9FUlJfTk9fTklDICAgICAgICAgIEhDRl9BQ1RfSU5UX09GRiwgTklDIHByZXNlbmNlIGNoZWNrIGZhaWxzCisgKgorICouQ09ORElUSU9OUworICogRXhjZXB0IGZvciBoY2ZfYWN0aW9uIHdpdGggSENGX0FDVF9JTlRfRk9SQ0VfT04gb3IgSENGX0FDVF9JTlRfT0ZGIGFzIHBhcmFtZXRlciBvciBoY2ZfY29ubmVjdCB3aXRoIGFuIEkvTworICogYWRkcmVzcyAoaS5lLiBub3QgSENGX0RJU0NPTk5FQ1QpLCBhbGwgaGNmLWZ1bmN0aW9uIGNhbGxzIE1VU1QgYmUgcHJlY2VkZWQgYnkgYSBjYWxsIG9mIGhjZl9hY3Rpb24gd2l0aAorICogSENGX0FDVF9JTlRfT0ZGIGFzIHBhcmFtZXRlci4KKyAqIE5vdGUgdGhhdCBoY2ZfY29ubmVjdCBkZWZhdWx0cyB0byBOSUMgaW50ZXJydXB0IGRpc2FibGVkIG1vZGUsIGkuZS4gYXMgaWYgaGNmX2FjdGlvbiggSENGX0FDVF9JTlRfT0ZGICkKKyAqIHdhcyBjYWxsZWQuCisgKgorICouREVTQ1JJUFRJT04KKyAqIGhjZl9hY3Rpb24gc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBtb2RlIGNoYW5naW5nIGFjdGlvbi1jb2RlIHBhaXJzIHRoYXQgYXJlIGFudG9ueW1zCisgKiAgICAtIEhDRl9BQ1RfSU5UX1tGT1JDRV9dT04gLyBIQ0ZfQUNUX0lOVF9PRkYKKyAqCisgKiBBZGRpdGlvbmFsbHkgaGNmX2FjdGlvbiBjYW4gc3RhcnQgdGhlIGZvbGxvd2luZyBhY3Rpb25zIGluIHRoZSBOSUM6CisgKiAgICAtIEhDRl9BQ1RfUFJTX1NDQU4KKyAqICAgIC0gSENGX0FDVF9SWF9BQ0sKKyAqICAgIC0gSENGX0FDVF9TQ0FOCisgKiAgICAtIEhDRl9BQ1RfU0xFRVAKKyAqICAgIC0gSENGX0FDVF9UQUxMSUVTCisgKgorICogbyBIQ0ZfQUNUX0lOVF9PRkY6IFNldHMgTklDIEludGVycnVwdHMgbW9kZSBEaXNhYmxlZC4KKyAqIFRoaXMgY29tbWFuZCwgYW5kIHRoZSBhc3NvY2lhdGVkIFtGb3JjZV0gRW5hYmxlIE5JQyBpbnRlcnJ1cHRzIGNvbW1hbmQsIGFyZSBvbmx5IGF2YWlsYWJsZSBpZiB0aGUgSENGX0lOVF9PTgorICogY29tcGlsZSB0aW1lIG9wdGlvbiBpcyBub3Qgc2V0IGF0IDB4MDAwMC4KKyAqCisgKiBvIEhDRl9BQ1RfSU5UX09OOiBTZXRzIE5JQyBJbnRlcnJ1cHRzIG1vZGUgRW5hYmxlZC4KKyAqIEVuYWJsZSBOSUMgSW50ZXJydXB0cywgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgcHJlY2VkaW5nIERpc2FibGUgTklDIEludGVycnVwdCBjYWxscy4KKyAqCisgKiBvIEhDRl9BQ1RfSU5UX0ZPUkNFX09OOiBGb3JjZSBOSUMgSW50ZXJydXB0cyBtb2RlIEVuYWJsZWQuCisgKiBTZXRzIE5JQyBJbnRlcnJ1cHRzIG1vZGUgRW5hYmxlZCwgcmVnYXJkbGVzcyBvZmYgdGhlIG51bWJlciBvZiBwcmVjZWRpbmcgRGlzYWJsZSBOSUMgSW50ZXJydXB0IGNhbGxzLgorICoKKyAqIFRoZSBkaXNhYmxpbmcgYW5kIGVuYWJsaW5nIG9mIGludGVycnVwdHMgYXJlIGFudG9ueW1zLgorICogVGhlc2UgYWN0aW9ucyBtdXN0IGJlIGJhbGFuY2VkLgorICogRm9yIGVhY2ggImRpc2FibGUgaW50ZXJydXB0cyIgdGhlcmUgbXVzdCBiZSBhIG1hdGNoaW5nICJlbmFibGUgaW50ZXJydXB0cyIuCisgKiBUaGUgZGlzYWJsZSBpbnRlcnJ1cHRzIG1heSBiZSBleGVjdXRlZCBtdWx0aXBsZSB0aW1lcyBpbiBhIHJvdyB3aXRob3V0IGludGVydmVuaW5nIGVuYWJsZSBpbnRlcnJ1cHRzLCBpbgorICogb3RoZXIgd29yZHMsIHRoZSBkaXNhYmxlIGludGVycnVwdHMgbWF5IGJlIG5lc3RlZC4KKyAqIFRoZSBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiBtZWNoYW5pc20gaXMgZGlzYWJsZWQgYXQgdGhlIGZpcnN0IGNhbGwgd2l0aCBIQ0ZfQUNUX0lOVF9PRkYuCisgKiBUaGUgaW50ZXJydXB0IGdlbmVyYXRpb24gbWVjaGFuaXNtIGlzIHJlLWVuYWJsZWQgd2hlbiB0aGUgbnVtYmVyIG9mIGNhbGxzIHdpdGggSENGX0FDVF9JTlRfT04gbWF0Y2hlcyB0aGUKKyAqIG51bWJlciBvZiBjYWxscyB3aXRoIElOVF9PRkYuCisgKgorICogSXQgaXMgbm90IGFsbG93ZWQgdG8gaGF2ZSBtb3JlIEVuYWJsZSBOSUMgSW50ZXJydXB0cyBjYWxscyB0aGFuIERpc2FibGUgTklDIEludGVycnVwdHMgY2FsbHMuCisgKiBUaGUgaW50ZXJydXB0IGdlbmVyYXRpb24gbWVjaGFuaXNtIGlzIGluaXRpYWxseSAoaS5lLiBhZnRlciBoY2ZfY29ubmVjdCkgZGlzYWJsZWQuCisgKiBBbiBNU0YgYmFzZWQgb24gYSBpbnRlcnJ1cHQgc3RyYXRlZ3kgbXVzdCBjYWxsIGhjZl9hY3Rpb24gd2l0aCBJTlRfT04gaW4gaXRzIGluaXRpYWxpemF0aW9uIGxvZ2ljLgorICoKKyAqISAgVGhlIElOVF9PRkYvSU5UX09OIGhvdXNla2VlcGluZyBpcyBpbml0aWFsaXplZCBhdCAweDAwMDAgYnkgaGNmX2Nvbm5lY3QsIGNhdXNpbmcgdGhlIGludGVycnVwdCBnZW5lcmF0aW9uCisgKiAgIG1lY2hhbmlzbSB0byBiZSBkaXNhYmxlZCBhdCBmaXJzdC4gVGhpcyBzdWl0cyBNU0YgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gYSBwb2xsaW5nIHN0cmF0ZWd5LgorICoKKyAqIG8gSENGX0FDVF9TTEVFUDogSW5pdGlhdGVzIHRoZSBEaXNjb25uZWN0ZWQgRGVlcFNsZWVwIHByb2Nlc3MKKyAqIFRoaXMgY29tbWFuZCBpcyBvbmx5IGF2YWlsYWJsZSBpZiB0aGUgSENGX0REUyBjb21waWxlIHRpbWUgb3B0aW9uIGlzIHNldC4gSXQgdHJpZ2dlcnMgdGhlIEYvVyB0byBzdGFydCB0aGUKKyAqIHNsZWVwIGhhbmRzaGFraW5nLiBSZWdhcmRsZXNzIHdoZXRoZXIgdGhlIEhvc3QgaW5pdGlhdGVzIGEgRGlzY29ubmVjdGVkIERlZXBTbGVlcCAoRERTKSBvciB0aGUgRi9XIGluaXRpYXRlcworICogYSBDb25uZWN0ZWQgRGVlcFNsZWVwIChDRFMpLCB0aGUgSG9zdC1GL1cgc2xlZXAgaGFuZHNoYWtpbmcgaXMgY29tcGxldGVkIHdoZW4gdGhlIE5JQyBJbnRlcnJ1cHRzIG1vZGUgaXMKKyAqIGVuYWJsZWQgKGJ5IG1lYW5zIG9mIHRoZSBiYWxhbmNpbmcgSENGX0FDVF9JTlRfT04pLCBpLmUuIGF0IHRoYXQgbW9tZW50IHRoZSBGL1cgcmVhbGx5IGdvZXMgaW50byBzbGVlcCBtb2RlLgorICogVGhlIEYvVyBpcyB3b2tlbnVwIGJ5IHRoZSBIQ0Ygd2hlbiB0aGUgTklDIEludGVycnVwdHMgbW9kZSBhcmUgZGlzYWJsZWQsIGkuZS4gYXQgdGhlIGZpcnN0IEhDRl9BQ1RfSU5UX09GRgorICogYWZ0ZXIgZ29pbmcgaW50byBzbGVlcC4KKyAqCisgKiBUaGUgZm9sbG93aW5nIE1pc2NlbGxhbnVvdXMgYWN0aW9ucyBhcmUgZGVmaW5lZDoKKyAqCisgKiBvIEhDRl9BQ1RfUlhfQUNLOiBSZWNlaXZlciBBY2tub3dsZWRnZW1lbnQgKG5vbi1ETUEsIG5vbi1VU0IgbW9kZSBvbmx5KQorICogQWNraW5nIHRoZSByZWNlaXZlciwgZnJlZXMgdGhlIE5JQyBtZW1vcnkgdXNlZCB0byBob2xkIHRoZSBSeCBmcmFtZSBhbmQgYWxsb3dzIHRoZSBGL1cgdG8KKyAqIHJlcG9ydCB0aGUgZXhpc3RlbmNlIG9mIHRoZSBuZXh0IFJ4IGZyYW1lLgorICogSWYgdGhlIE1TRiBkb2VzIG5vdCBuZWVkIGFjY2VzcyAoYW55IGxvbmdlcikgdG8gdGhlIGN1cnJlbnQgZnJhbWUsIGUuZy4gYmVjYXVzZSBpdCBpcyByZWplY3RlZCBiYXNlZCBvbiB0aGUKKyAqIGxvb2sgYWhlYWQgb3IgY29waWVkIHRvIGFub3RoZXIgYnVmZmVyLCB0aGUgcmVjZWl2ZXIgbWF5IGJlIGFja2VkLiBBY2tpbmcgZWFybGllciBpcyBhc3N1bWVkIHRvIGhhdmUgdGhlCisgKiBwb3RlbnRpYWwgb2YgaW1wcm92aW5nIHRoZSBwZXJmb3JtYW5jZS4KKyAqIElmIHRoZSBNU0YgZG9lcyBub3QgZXhwbGl0bHkgYWNrIHRlIHJlY2VpdmVyLCB0aGUgYWNraW5nIGlzIGRvbmUgaW1wbGljaXRseSBpZjoKKyAqIC0gdGhlIHJlY2VpdmVkIGZyYW1lIGZpdHMgaW4gdGhlIGxvb2sgYWhlYWQgYnVmZmVyLCBieSB0aGUgaGNmX3NlcnZpY2VfbmljIGNhbGwgdGhhdCByZXBvcnRlZCB0aGUgUnggZnJhbWUKKyAqIC0gaWYgbm90IGluIHRoZSBhYm92ZSBzdGVwLCBieSBoY2ZfcmN2X21zZyAoYXNzdW1pbmcgaGNmX3Jjdl9tc2cgaXMgY2FsbGVkKQorICogLSBpZiBuZWl0aGVyIG9mIHRoZSBhYm92ZSBpbXBsaWNpdCBhY2tzIG5vciBhbiBleHBsaWNpdCBhY2sgYnkgdGhlIE1TRiwgYnkgdGhlIGZpcnN0IGhjZl9zZXJ2aWNlX25pYyBhZnRlcgorICogICB0aGUgaGNmX3NlcnZpY2VfbmljIHRoYXQgcmVwb3J0ZWQgdGhlIFJ4IGZyYW1lLgorICogTm90ZTogSWYgYW4gUnggZnJhbWUgaXMgYWxyZWFkeSBhY2tlZCwgYW4gZXhwbGljaXQgQUNLIGJ5IHRoZSBNU0YgYWN0cyBhcyBhIE5vT3BlcmF0aW9uLgorICoKKyAqIG8gSENGX0FDVF9UQUxMSUVTOiBJbnF1aXJlIFRhbGxpZXMgY29tbWFuZAorICogVGhpcyBjb21tYW5kIGlzIG9ubHkgb3BlcmF0aW9uYWwgaWYgdGhlIEYvVyBpcyBlbmFibGVkLgorICogVGhlIElucXVpcmUgVGFsbGllcyBjb21tYW5kIHJlcXVlc3RzIHRoZSBGL1cgdG8gcHJvdmlkZSBpdHMgY3VycmVudCBzZXQgb2YgdGFsbGllcy4KKyAqIFNlZSBhbHNvIGhjZl9nZXRfaW5mbyB3aXRoIENGR19UQUxMSUVTIGFzIHBhcmFtZXRlci4KKyAqCisgKiBvIEhDRl9BQ1RfUFJTX1NDQU46IElucXVpcmUgUHJvYmUgUmVzcG9ucyBTY2FuIGNvbW1hbmQKKyAqIFRoaXMgY29tbWFuZCBpcyBvbmx5IG9wZXJhdGlvbmFsIGlmIHRoZSBGL1cgaXMgZW5hYmxlZC4KKyAqIFRoZSBQcm9iZSBSZXNwb25zIFNjYW4gY29tbWFuZCBzdGFydHMgYSBzY2FuIHNlcXVlbmNlLgorICogVGhlIEhDRiBwdXRzIHRoZSByZXN1bHQgb2YgdGhpcyBhY3Rpb24gaW4gYW4gTVNGIGRlZmluZWQgYnVmZmVyIChzZWUgQ0ZHX1JJRF9MT0dfU1RSQ1QpLgorICoKKyAqIG8gSENGX0FDVF9TQ0FOOiBJbnF1aXJlIFNjYW4gY29tbWFuZAorICogVGhpcyBjb21tYW5kIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBISUkgRi9XIChpLmUuIHByZS1XQVJQKSBhbmQgaXQgaXMgb3BlcmF0aW9uYWwgaWYgdGhlIEYvVyBpcyBlbmFibGVkLgorICogVGhlIElucXVpcmUgU2NhbiBjb21tYW5kIHN0YXJ0cyBhIHNjYW4gc2VxdWVuY2UuCisgKiBUaGUgSENGIHB1dHMgdGhlIHJlc3VsdCBvZiB0aGlzIGFjdGlvbiBpbiBhbiBNU0YgZGVmaW5lZCBidWZmZXIgKHNlZSBDRkdfUklEX0xPR19TVFJDVCkuCisgKgorICogQXNzZXJ0IGZhaWxzIGlmCisgKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KKyAqIC0gTklDIGludGVycnVwdHMgYXJlIG5vdCBkaXNhYmxlZCB3aGlsZSByZXF1aXJlZCBieSBwYXJhbWV0ZXIgYWN0aW9uLgorICogLSBhbiBpbnZhbGlkIGNvZGUgaXMgc3BlY2lmaWVkIGluIHBhcmFtZXRlciBhY3Rpb24uCisgKiAtIEhDRl9BQ1RfSU5UX09OIGNvbW1hbmRzIG91dG51bWJlciB0aGUgSENGX0FDVF9JTlRfT0ZGIGNvbW1hbmRzLgorICogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBhZGVxdWF0ZSBwcm90ZWN0aW9uIGFnYWluc3QgTklDIGludGVycnVwdHMgb3IKKyAqICAgbXVsdGktdGhyZWFkaW5nCisgKgorICogLSBTaW5jZSB0aGUgSENGIGRvZXMgbm90IG1haW50YWluIHN0YXR1cyBpbmZvcm1hdGlvbiByZWxhdGl2ZSB0byB0aGUgRi9XIGVuYWJsZWQgc3RhdGUsIGl0IGlzIG5vdCBhc3NlcnRlZAorICogICB3aGV0aGVyIEhDRl9BQ1RfU0NBTiwgSENGX0FDVF9QUlNfU0NBTiBvciBIQ0ZfQUNUX1RBTExJRVMgYXJlIG9ubHkgdXNlZCB3aGlsZSBGL1cgaXMgZW5hYmxlZC4KKyAqCisgKi5ESUFHUkFNCisgKiAwOiBUaGUgYXNzZXJ0IGVtYmVkZGVkIGluIEhDRkxPR0VOVFJZIGNoZWNrcyBhZ2FpbnN0IHJlLWVudHJhbmN5LiBSZS1lbnRyYW5jeSBjb3VsZCBiZSBjYXVzZWQgYnkgYSBNU0YgbG9naWMKKyAqICAgYXQgdGFzay1sZXZlbCBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBzaGllbGRpbmcgd2l0aCBIQ0ZfQUNUX09OL19PRkYuIEhvd2V2ZXIgdGhlIEhDRl9BQ1RfSU5UX09GRgorICogICBhY3Rpb24gaXRzZWxmIGNhbiBwZXIgZGVmaW5pdGlvbiBub3QgYmUgcHJvdGVjdGVkIHRoaXMgd2F5LiBCYXNlZCBvbiBjb2RlIGluc3BlY3Rpb24sIGl0IGNhbiBiZSBjb25jbHVkZWQsCisgKiAgIHRoYXQgdGhlcmUgaXMgbm8gcmUtZW50cmFuY3kgUFJPQkxFTSBpbiB0aGlzIHBhcnRpY3VsYXIgZmxvdy4gSXQgZG9lcyBub3Qgc2VlbSB3b3J0aCB0aGUgdHJvdWJsZSB0bworICogICBleHBsaWNpdGx5IGNoZWNrIGZvciB0aGlzIGNvbmRpdGlvbiAoYWx0aG91Z2ggdGhlcmUgd2FzIGEgcmVwb3J0IG9mIGFuIE1TRiB3aGljaCByYW4gaW50byB0aGlzIGFzc2VydC4KKyAqIDI6SUZCX0ludE9mZkNudCBpcyB1c2VkIHRvIGJhbGFuY2UgdGhlIElOVF9PRkYgYW5kIElOVF9PTiBjYWxscy4gIERpc2FibGluZyBvZiB0aGUgaW50ZXJydXB0cyBpcyBhY2hpZXZlZCBieQorICogICB3cml0aW5nIGEgemVybyB0byB0aGUgSGVybWVzIEludEVuIHJlZ2lzdGVyLiAgSW4gYSBzaGFyZWQgaW50ZXJydXB0IGVudmlyb25tZW50IChlLmcuIHRoZSBtaW5pLVBDSSBORElTCisgKiAgIGRyaXZlcikgaXQgaXMgY29uc2lkZXJlZCBtb3JlIGNvcnJlY3QgdG8gcmV0dXJuIHRoZSBzdGF0dXMgSENGX0lOVF9QRU5ESU5HIGlmIGFuZCBvbmx5IGlmLCB0aGUgY3VycmVudAorICogICBpbnZvY2F0aW9uIG9mIGhjZl9zZXJ2aWNlX25pYyBpcyAoYXBwYXJlbnRseSkgY2FsbGVkIGluIHRoZSBJU1Igd2hlbiB0aGUgSVNSIHdhcyBhY3RpdmF0ZWQgYXMgcmVzdWx0IG9mIGEKKyAqICAgY2hhbmdlIGluIEhSRUdfRVZfU1RBVCBtYXRjaGluZyBhIGJpdCBpbiBIUkVHX0lOVF9FTiwgaS5lLiBub3QgaWYgaW52b2tlZCBhcyByZXN1bHQgb2YgYW5vdGhlciBkZXZpY2UKKyAqICAgZ2VuZXJhdGluZyBhbiBpbnRlcnJ1cHQgb24gdGhlIHNoYXJlZCBpbnRlcnJ1cHQgbGluZS4KKyAqICAgTm90ZSAxOiBpdCBoYXMgYmVlbiBvYnNlcnZlZCB0aGF0IHVuZGVyIGNlcnRhaW4gYWR2ZXJzZSBjb25kaXRpb25zIG9uIGNlcnRhaW4gcGxhdGZvcm1zIHRoZSB3cml0aW5nIG9mCisgKiAgIEhSRUdfSU5UX0VOIGNhbiBhcHBhcmVudGx5IGZhaWwsIHRoZXJlZm9yIGl0IGlzIHBhcmFtb3VudCB0aGF0IEhSRUdfSU5UX0VOIGlzIHdyaXR0ZW4gYWdhaW4gd2l0aCAwIGZvcgorICogICBlYWNoIGFuZCBldmVyeSBjYWxsIHRvIEhDRl9BQ1RfSU5UX09GRi4KKyAqICAgTm90ZSAyOiBpdCBoYXMgYmVlbiBvYnNlcnZlZCB0aGF0IHVuZGVyIGNlcnRhaW4gSC9XICYgUy9XIGFyY2hpdGVjdHVyZXMgdGhpcyBsb2dpYyBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcworICogICBubyBOSUMgYXQgYWxsLiBUbyBjYXRlciBmb3IgdGhpcywgdGhlIHZhbHVlIG9mIEhSRUdfSU5UX0VOIGlzIHZhbGlkYXRlZC4gSWYgdGhlIHVudXNlZCBiaXQgMHgwMTAwIGlzIHNldCwKKyAqICAgaXQgaXMgYXNzdW1lZCB0aGVyZSBpcyBubyBOSUMuCisgKiAgIE5vdGUgMzogRHVyaW5nIHRoZSBkb3dubG9hZCBwcm9jZXNzLCBzb21lIHZlcnNpb25zIG9mIHRoZSBGL1cgcmVzZXQgSFJFR19TV18wLCBoZW5jZSBjaGVja2luZyB0aGlzCisgKiAgIHJlZ2lzdGVyIGZvciBIQ0ZfTUFHSUMgKHRoZSBjbGFzc2ljYWwgTklDIHByZXNlbmNlIHRlc3QpIHdoZW4gSENGX0FDVF9JTlRfT0ZGIGlzIGNhbGxlZCBkdWUgdG8gYW5vdGhlcgorICogICBjYXJkIGludGVycnVwdGluZyB2aWEgYSBzaGFyZWQgSVJRIGR1cmluZyBhIGRvd25sb2FkLCBmYWlscy4KKyAqNDogVGhlIGNvbnN0cnVjdGlvbiAiaWYgKCBpZmJwLT5JRkJfSW50T2ZmQ250LS0gPT0gMCApIiBpcyBvcHRpbWFsIChpbiB0aGUgc2Vuc2Ugb2Ygc2hvcnRlc3QvcXVpY2tlc3QKKyAqICAgcGF0aCBpbiBlcnJvciBmcmVlIGZsb3dzKSBidXQgTk9UIGZhaWwgc2FmZSBpbiBjYXNlIG9mIHRvbyBtYW55IElOVF9PTiBpbnZvY2F0aW9ucyBjb21wYXJlZCB0byBJTlRfT0ZGKS4KKyAqICAgRW5hYmxpbmcgb2YgdGhlIGludGVycnVwdHMgaXMgYWNoaWV2ZWQgYnkgd3JpdGluZyB0aGUgSGVybWVzIEludEVuIHJlZ2lzdGVyLgorICogICAgLSBJZiB0aGUgSENGIGlzIGluIERlZnVuY3QgbW9kZSwgdGhlIGludGVycnVwdHMgc3RheSBkaXNhYmxlZC4KKyAqICAgIC0gVW5kZXIgIm5vcm1hbCIgY29uZGl0aW9ucywgdGhlIEhDRiBpcyBvbmx5IGludGVyZXN0ZWQgaW4gSW5mbyBFdmVudHMsIFJ4IEV2ZW50cyBhbmQgTm90aWZ5IEV2ZW50cy4KKyAqICAgIC0gV2hlbiB0aGUgSENGIGlzIG91dCBvZiBUeC9Ob3RpZnkgcmVzb3VyY2VzLCB0aGUgSENGIGlzIGFsc28gaW50ZXJlc3RlZCBpbiBBbGxvYyBFdmVudHMuCisgKiAgICAtIHZpYSBIQ0ZfRVhULCB0aGUgTVNGIHByb2dyYW1tZXIgY2FuIGFsc28gcmVxdWVzdCBIUkVHX0VWX1RJQ0sgYW5kL29yIEhSRUdfRVZfVFhfRVhDIGludGVycnVwdHMuCisgKiAgIEZvciBETUEgb3BlcmF0aW9uLCB0aGUgRE1BIGhhcmR3YXJlIGhhbmRsZXMgdGhlIGFsbG9jIGV2ZW50cy4gVGhlIERNQSBlbmdpbmUgd2lsbCBnZW5lcmF0ZSBhICdUeERtYURvbmUnCisgKiAgIGV2ZW50IGFzIHNvb24gYXMgaXQgaGFzIHB1bXBlZCBhIGZyYW1lIGZyb20gaG9zdCByYW0gaW50byBOSUMtUkFNIChub3RlIHRoYXQgdGhlIGZyYW1lIGRvZXMgbm90IGhhdmUgdG8gYmUKKyAqICAgdHJhbnNtaXR0ZWQgdGhlbiksIGFuZCBhICdSeERtYURvbmUnIGV2ZW50IGFzIHNvb24gYXMgYSByZWNlaXZlZCBmcmFtZSBoYXMgYmVlbiBwdW1wZWQgZnJvbSBOSUMtUkFNIGludG8KKyAqICAgaG9zdCByYW0uICBOb3RlIHRoYXQgdGhlICdhbGxvYycgZXZlbnQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBldmVudC1tYXNrLCBiZWNhdXNlIHRoZSBETUEgZW5naW5lIHdpbGwKKyAqICAgcmVhY3QgdG8gYW5kIGFja25vd2xlZGdlIHRoaXMgZXZlbnQuCisgKjY6IGFjayB0aGUgIm9sZCIgUngtZXZlbnQuIFNlZSAiUnggQnVmZmVyIGZyZWUgc3RyYXRlZ3kiIGluIGhjZl9zZXJ2aWNlX25pYyBhYm92ZSBmb3IgbW9yZSBleHBsYW5hdGlvbi4KKyAqICAgSUZCX1J4RklEIGFuZCBJRkJfUnhMZW4gbXVzdCBiZSBjbGVhcmVkIHRvIGJyaW5nIGJvdGggdGhlIGludGVybmFsIEhDRiBob3VzZSBrZWVwaW5nIGFuZCB0aGUgaW5mb3JtYXRpb24KKyAqICAgc3VwcGxpZWQgdG8gdGhlIE1TRiBpbiB0aGUgc3RhdGUgIm5vIGZyYW1lIHJlY2VpdmVkIi4KKyAqODogVGhlIEhDRl9BQ1RfU0NBTiwgSENGX0FDVF9QUlNfU0NBTiBhbmQgSENGX0FDVF9UQUxMSUVTIGFjdGl2aXR5IGFyZSBtZXJnZWQgYnkgImNsZXZlciIgYWxnZWJyYWljCisgKiAgIG1hbmlwdWxhdGlvbnMgb2YgdGhlIFJJRC12YWx1ZXMgYW5kIGFjdGlvbiBjb2Rlcywgc28gZm9yZWdvaW5nIHJvYnVzdG5lc3MgYWdhaW5zdCBtaWdyYXRpb24gcHJvYmxlbXMgZm9yCisgKiAgIGVhc2Ugb2YgaW1wbGVtZW50YXRpb24uIFRoZSBhc3N1bXB0aW9ucyBhYm91dCBudW1lcmljYWwgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIENGR19UQUxMSUVTIGV0YyBhbmQKKyAqICAgSENGX0FDVF9UQUxMSUVTIGV0YyBhcmUgY2hlY2tlZCBieSB0aGUgIiNpZiIgc3RhdGVtZW50cyBqdXN0IHByaW9yIHRvIHRoZSBib2R5IG9mIHRoaXMgcm91dGluZSwgcmVzdWx0aW5nCisgKiAgIGluOiBlcnIgIm1haW50ZW5hbmNlIiBkdXJpbmcgY29tcGlsYXRpb24gaWYgdGhlIGFzc3VtcHRpb25zIGFyZSBubyBsb25nZXIgbWV0LiBUaGUgd3JpdGluZyBvZiBIUkVHX1BBUkFNXzEKKyAqICAgd2l0aCAweDNGRkYgaW4gY2FzZSBvZiBhbiBQUlMgc2NhbiwgaXMgYSBrbHVkZ2UgdG8gZ2V0IGFyb3VuZCBsYWNrIG9mIHNwZWNpZmljYXRpb24sIGhlbmNlIGRpZmZlcmVudAorICogICBpbXBsZW1lbnRhdGlvbiBpbiBGL1cgYW5kIEhvc3QuCisgKiAgIFdoZW4gdGhlcmUgaXMgbm8gTklDIFJBTSBhdmFpbGFibGUsIHNvbWUgdmVyc2lvbnMgb2YgdGhlIEhlcm1lcyBGL1cgZG8gcmVwb3J0IDB4N0YwMCBhcyBlcnJvciBpbiB0aGUKKyAqICAgUmVzdWx0IGZpZWxkIG9mIHRoZSBTdGF0dXMgcmVnaXN0ZXIgYW5kIHNvbWUgRi9XIHZlcnNpb25zIGRvbid0LiBUbyBtYXNrIHRoaXMgZGlmZmVyZW5jZSB0byB0aGUgTVNGIGFsbAorICogICByZXR1cm4gY29kZXMgb2YgdGhlIEhlcm1lcyBhcmUgaWdub3JlZCAoImJlc3QiIGFuZCAibW9zdCBzaW1wbGUiIHNvbHV0aW9uIHRvIHRoZXNlIHR5cGVzIG9mIGFuYWxvbWllcyB3aXRoCisgKiAgIGFuIGFjY2VwdGFibGUgbG9zcyBkdWUgdG8gaWdub3JpbmcgYWxsIGVycm9yIHNpdHVhdGlvbnMgYXMgd2VsbCkuCisgKiAgIFRoZSAiTm8gaW5xdWlyZSBzcGFjZSIgaXMgcmVwb3J0ZWQgdmlhIHRoZSBIZXJtZXMgdGFsbGllcy4KKyAqMzA6IGRvIG5vdCBIQ0ZBU1NFUlQoIHJjLCByYyApIHNpbmNlIHJjID09IEhDRl9JTlRfUEVORElORyBpcyBubyBlcnJvcgorICoKKyAqLkVORERPQyAgICAgICAgICAgICAgICBFTkQgRE9DVU1FTlRBVElPTgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfSElJNSApID09IDAKICNpZiBDRkdfU0NBTiAhPSBDRkdfVEFMTElFUyAtIEhDRl9BQ1RfVEFMTElFUyArIEhDRl9BQ1RfU0NBTgogZXJyOiAibWFpbnRlbmFuY2UiIGFwcGFyZW50bHkgaW52aW9sYXRlZCB0aGUgdW5kZXJseWluZyBhc3N1bXB0aW9uIGFib3V0IHRoZSBudW1lcmljYWwgdmFsdWVzIG9mIHRoZXNlIG1hY3JvcwpAQCAtNzAxLDQzICs2NzUsNDMgQEAKIGludAogaGNmX2FjdGlvbiggSUZCUCBpZmJwLCBoY2ZfMTYgYWN0aW9uICkKIHsKLWludAlyYyA9IEhDRl9TVUNDRVNTOworCWludCByYyA9IEhDRl9TVUNDRVNTOwogCi0JSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKQorCUhDRkFTU0VSVCggaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQywgaWZicC0+SUZCX01hZ2ljICk7CiAjaWYgSENGX0lOVF9PTgotCUhDRkxPR0VOVFJZKCBhY3Rpb24gPT0gSENGX0FDVF9JTlRfRk9SQ0VfT04gPyBIQ0ZfVFJBQ0VfQUNUSU9OX0tMVURHRSA6IEhDRl9UUkFDRV9BQ1RJT04sIGFjdGlvbiApCQkJCQkJCQkJCQkJCQkvKiAwICovCisJSENGTE9HRU5UUlkoIGFjdGlvbiA9PSBIQ0ZfQUNUX0lOVF9GT1JDRV9PTiA/IEhDRl9UUkFDRV9BQ1RJT05fS0xVREdFIDogSENGX1RSQUNFX0FDVElPTiwgYWN0aW9uICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMCAqLwogI2lmIChIQ0ZfU0xFRVApCiAJSENGQVNTRVJUKCBpZmJwLT5JRkJfSW50T2ZmQ250ICE9IDB4RkZGRSB8fCBhY3Rpb24gPT0gSENGX0FDVF9JTlRfT0ZGLAotCQkJICAgTUVSR0VfMiggYWN0aW9uLCBpZmJwLT5JRkJfSW50T2ZmQ250ICkgKQorCQkgICBNRVJHRV8yKCBhY3Rpb24sIGlmYnAtPklGQl9JbnRPZmZDbnQgKSApOwogI2Vsc2UKLQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgIT0gMHhGRkZFLCBhY3Rpb24gKQorCUhDRkFTU0VSVCggaWZicC0+SUZCX0ludE9mZkNudCAhPSAweEZGRkUsIGFjdGlvbiApOwogI2VuZGlmIC8vIEhDRl9TTEVFUAogCUhDRkFTU0VSVCggaWZicC0+SUZCX0ludE9mZkNudCAhPSAweEZGRkYgfHwKLQkJCSAgIGFjdGlvbiA9PSBIQ0ZfQUNUX0lOVF9PRkYgfHwgYWN0aW9uID09IEhDRl9BQ1RfSU5UX0ZPUkNFX09OLCAgYWN0aW9uICkKKwkJICAgYWN0aW9uID09IEhDRl9BQ1RfSU5UX09GRiB8fCBhY3Rpb24gPT0gSENGX0FDVF9JTlRfRk9SQ0VfT04sICBhY3Rpb24gKTsKIAlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgPD0gMTYgfHwgaWZicC0+SUZCX0ludE9mZkNudCA+PSAweEZGRkUsCi0JCQkgICBNRVJHRV8yKCBhY3Rpb24sIGlmYnAtPklGQl9JbnRPZmZDbnQgKSApCS8vbmVzdGluZyBtb3JlIHRoYW4gMTYgZGVlcCBzZWVtcyB1bnJlYXNvbmFibGUKKwkJICAgTUVSR0VfMiggYWN0aW9uLCBpZmJwLT5JRkJfSW50T2ZmQ250ICkgKTsgLy9uZXN0aW5nIG1vcmUgdGhhbiAxNiBkZWVwIHNlZW1zIHVucmVhc29uYWJsZQogI2VuZGlmIC8vIEhDRl9JTlRfT04KIAogCXN3aXRjaCAoYWN0aW9uKSB7CiAjaWYgSENGX0lOVF9PTgotaGNmXzE2CWk7Ci0JICBjYXNlIEhDRl9BQ1RfSU5UX09GRjoJCQkJCQkvLyBEaXNhYmxlIEludGVycnVwdCBnZW5lcmF0aW9uCisJCWhjZl8xNiAgaTsKKwljYXNlIEhDRl9BQ1RfSU5UX09GRjogICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIEludGVycnVwdCBnZW5lcmF0aW9uCiAjaWYgSENGX1NMRUVQCi0JCWlmICggaWZicC0+SUZCX0ludE9mZkNudCA9PSAweEZGRkUgKSB7CS8vIFdha2VVcCB0ZXN0CTs/dGllIHRoaXMgdG8gdGhlICJuZXciIHN1cGVyLUxpbmtTdGF0Ci0JCQlpZmJwLT5JRkJfSW50T2ZmQ250Kys7CQkJCQkJLy8gcmVzdG9yZSBjb252ZW50aW9uYWwgSS9GCi0JCQlPUFcoSFJFR19JTywgSFJFR19JT19XQUtFVVBfQVNZTkMgKTsJCS8vIHNldCB3YWtldXAgYml0Ci0JCQlPUFcoSFJFR19JTywgSFJFR19JT19XQUtFVVBfQVNZTkMgKTsJCS8vIHNldCB3YWtldXAgYml0IHRvIGNvdW50ZXJhY3QgdGhlIGNsZWFyaW5nIGJ5IEYvVworCQlpZiAoIGlmYnAtPklGQl9JbnRPZmZDbnQgPT0gMHhGRkZFICkgeyAgLy8gV2FrZVVwIHRlc3QgIDs/dGllIHRoaXMgdG8gdGhlICJuZXciIHN1cGVyLUxpbmtTdGF0CisJCQlpZmJwLT5JRkJfSW50T2ZmQ250Kys7ICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgY29udmVudGlvbmFsIEkvRgorCQkJT1BXKEhSRUdfSU8sIEhSRUdfSU9fV0FLRVVQX0FTWU5DICk7ICAgICAgICAvLyBzZXQgd2FrZXVwIGJpdAorCQkJT1BXKEhSRUdfSU8sIEhSRUdfSU9fV0FLRVVQX0FTWU5DICk7ICAgICAgICAvLyBzZXQgd2FrZXVwIGJpdCB0byBjb3VudGVyYWN0IHRoZSBjbGVhcmluZyBieSBGL1cKIAkJCS8vIDgwMCB1cyBsYXRlbmN5IGJlZm9yZSBGVyBzd2l0Y2hlcyB0byBoaWdoIHBvd2VyCi0JCQlNU0ZfV0FJVCg4MDApOwkJCQkJCQkJLy8gTVNGLWRlZmluZWQgZnVuY3Rpb24gdG8gd2FpdCBuIG1pY3Jvc2Vjb25kcy4KLS8vT09SCQlpZiAoIGlmYnAtPklGQl9EU0xpbmtTdGF0ICYgQ0ZHX0xJTktfU1RBVF9EU19PT1IgKSB7IC8vIE91dE9mUmFuZ2UKLS8vCQkJCXByaW50ayggIjw1PkFDVF9JTlRfT0ZGOiBEZWVwc2xlZXAgcGhhc2UgdGVybWluYXRlZCwgZW5hYmxlIGFuZCBnbyB0byBBd2FpdENvbm5lY3Rpb25cbiIgKTsJCS8vOz9yZW1vdmUgbWUgMSBkYXkKKwkJCU1TRl9XQUlUKDgwMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTVNGLWRlZmluZWQgZnVuY3Rpb24gdG8gd2FpdCBuIG1pY3Jvc2Vjb25kcy4KKy8vT09SCQkJaWYgKCBpZmJwLT5JRkJfRFNMaW5rU3RhdCAmIENGR19MSU5LX1NUQVRfRFNfT09SICkgeyAvLyBPdXRPZlJhbmdlCisvLwkJCQlwcmludGsoICI8NT5BQ1RfSU5UX09GRjogRGVlcHNsZWVwIHBoYXNlIHRlcm1pbmF0ZWQsIGVuYWJsZSBhbmQgZ28gdG8gQXdhaXRDb25uZWN0aW9uXG4iICk7ICAgICAvLzs/cmVtb3ZlIG1lIDEgZGF5CiAvLwkJCQloY2ZfY250bCggaWZicCwgSENGX0NOVExfRU5BQkxFICk7CiAvLwkJCX0KLS8vCQkJaWZicC0+SUZCX0RTTGlua1N0YXQgJj0gfiggQ0ZHX0xJTktfU1RBVF9EU19JUiB8IENGR19MSU5LX1NUQVRfRFNfT09SKTsJLy9jbGVhciBJUi9PT1Igc3RhdGUKKy8vCQkJaWZicC0+SUZCX0RTTGlua1N0YXQgJj0gfiggQ0ZHX0xJTktfU1RBVF9EU19JUiB8IENGR19MSU5LX1NUQVRfRFNfT09SKTsgLy9jbGVhciBJUi9PT1Igc3RhdGUKIAkJfQogI2VuZGlmIC8vIEhDRl9TTEVFUAotLyoyKi8JaWZicC0+SUZCX0ludE9mZkNudCsrOwotLy8hICAgICByYyA9IDA7CisJLyoyKi8gICBpZmJwLT5JRkJfSW50T2ZmQ250Kys7CisvLyEJCXJjID0gMDsKIAkJaSA9IElQVyggSFJFR19JTlRfRU4gKTsKIAkJT1BXKCBIUkVHX0lOVF9FTiwgMCApOwogCQlpZiAoIGkgJiAweDEwMDAgKSB7CkBAIC03NDksMjI3ICs3MjMsMjE5IEBACiAJCX0KIAkJYnJlYWs7CiAKLQkgIGNhc2UgSENGX0FDVF9JTlRfRk9SQ0VfT046CQkJCS8vIEVuZm9yY2UgRW5hYmxlIEludGVycnVwdCBnZW5lcmF0aW9uCisJY2FzZSBIQ0ZfQUNUX0lOVF9GT1JDRV9PTjogICAgICAgICAgICAgICAgLy8gRW5mb3JjZSBFbmFibGUgSW50ZXJydXB0IGdlbmVyYXRpb24KIAkJaWZicC0+SUZCX0ludE9mZkNudCA9IDA7CiAJCS8vRmFsbCB0aHJvdWdoIGluIEhDRl9BQ1RfSU5UX09OCiAKLQkgIGNhc2UgSENGX0FDVF9JTlRfT046CQkJCQkJLy8gRW5hYmxlIEludGVycnVwdCBnZW5lcmF0aW9uCi0vKjQqLwlpZiAoIGlmYnAtPklGQl9JbnRPZmZDbnQtLSA9PSAwICYmIGlmYnAtPklGQl9DYXJkU3RhdCA9PSAwICkgewotCQkJCQkJCQkJCQkJLy9kZXRlcm1pbmUgSW50ZXJydXB0IEV2ZW50IG1hc2sKKwljYXNlIEhDRl9BQ1RfSU5UX09OOiAgICAgICAgICAgICAgICAgICAgICAvLyBFbmFibGUgSW50ZXJydXB0IGdlbmVyYXRpb24KKwkvKjQqLyAgIGlmICggaWZicC0+SUZCX0ludE9mZkNudC0tID09IDAgJiYgaWZicC0+SUZCX0NhcmRTdGF0ID09IDAgKSB7CisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZGV0ZXJtaW5lIEludGVycnVwdCBFdmVudCBtYXNrCiAjaWYgSENGX0RNQQogCQkJaWYgKCBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEgKSB7Ci0JCQkJaSA9IEhSRUdfRVZfSU5GTyB8IEhSRUdfRVZfUkRNQUQgfCBIUkVHX0VWX1RETUFEIHwgSFJFR19FVl9UWF9FWFQ7CS8vbWFzayB3aGVuIERNQSBhY3RpdmUKKwkJCQlpID0gSFJFR19FVl9JTkZPIHwgSFJFR19FVl9SRE1BRCB8IEhSRUdfRVZfVERNQUQgfCBIUkVHX0VWX1RYX0VYVDsgIC8vbWFzayB3aGVuIERNQSBhY3RpdmUKIAkJCX0gZWxzZQogI2VuZGlmIC8vIEhDRl9ETUEKIAkJCXsKLQkJCQlpID0gSFJFR19FVl9JTkZPIHwgSFJFR19FVl9SWCB8IEhSRUdfRVZfVFhfRVhUOwkJCQkJCS8vbWFzayB3aGVuIERNQSBub3QgYWN0aXZlCisJCQkJaSA9IEhSRUdfRVZfSU5GTyB8IEhSRUdfRVZfUlggfCBIUkVHX0VWX1RYX0VYVDsgICAgICAgICAgICAgICAgICAgICAvL21hc2sgd2hlbiBETUEgbm90IGFjdGl2ZQogCQkJCWlmICggaWZicC0+SUZCX1JzY0luZCA9PSAwICkgewotCQkJCQlpIHw9IEhSRUdfRVZfQUxMT0M7CQkJCQkJCQkJCQkJLy9tYXNrIHdoZW4gbm8gVHhGSUQgYXZhaWxhYmxlCisJCQkJCWkgfD0gSFJFR19FVl9BTExPQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbWFzayB3aGVuIG5vIFR4RklEIGF2YWlsYWJsZQogCQkJCX0KIAkJCX0KICNpZiBIQ0ZfU0xFRVAKIAkJCWlmICggKCBJUFcoSFJFR19FVl9TVEFUKSAmICggaSB8IEhSRUdfRVZfU0xFRVBfUkVRICkgKSA9PSBIUkVHX0VWX1NMRUVQX1JFUSApIHsKIAkJCQkvLyBmaXJtd2FyZSBpbmRpY2F0ZXMgaXQgd291bGQgbGlrZSB0byBnbyBpbnRvIHNsZWVwIG1vZHVzCiAJCQkJLy8gb25seSBhY2tub3dsZWRnZSB0aGlzIHJlcXVlc3QgaWYgbm8gb3RoZXIgZXZlbnRzIHRoYXQgY2FuIGNhdXNlIGFuIGludGVycnVwdCBhcmUgcGVuZGluZwotCQkJCWlmYnAtPklGQl9JbnRPZmZDbnQtLTsJCQkvL2JlY29tZXMgMHhGRkZFCi0gICAgICAgICAgICAJT1BXKCBIUkVHX0lOVF9FTiwgaSB8IEhSRUdfRVZfVElDSyApOworCQkJCWlmYnAtPklGQl9JbnRPZmZDbnQtLTsgICAgICAgICAgLy9iZWNvbWVzIDB4RkZGRQorCQkJCU9QVyggSFJFR19JTlRfRU4sIGkgfCBIUkVHX0VWX1RJQ0sgKTsKIAkJCQlPUFcoIEhSRUdfRVZfQUNLLCBIUkVHX0VWX1NMRUVQX1JFUSB8IEhSRUdfRVZfVElDSyB8IEhSRUdfRVZfQUNLX1JFR19SRUFEWSApOwogCQkJfSBlbHNlCiAjZW5kaWYgLy8gSENGX1NMRUVQCiAJCQl7Ci0gICAgICAgICAgICAJT1BXKCBIUkVHX0lOVF9FTiwgaSB8IEhSRUdfRVZfU0xFRVBfUkVRICk7CisJCQkJT1BXKCBIUkVHX0lOVF9FTiwgaSB8IEhSRUdfRVZfU0xFRVBfUkVRICk7CiAJCQl9CiAJCX0KIAkJYnJlYWs7CiAjZW5kaWYgLy8gSENGX0lOVF9PTgogCiAjaWYgKEhDRl9TTEVFUCkgJiBIQ0ZfRERTCi0JICBjYXNlIEhDRl9BQ1RfU0xFRVA6CQkJCQkJLy8gRERTIFNsZWVwIHJlcXVlc3QKKwljYXNlIEhDRl9BQ1RfU0xFRVA6ICAgICAgICAgICAgICAgICAgICAgICAvLyBERFMgU2xlZXAgcmVxdWVzdAogCQloY2ZfY250bCggaWZicCwgSENGX0NOVExfRElTQUJMRSApOwogCQljbWRfZXhlKCBpZmJwLCBIQ01EX1NMRUVQLCAwICk7CiAJCWJyZWFrOwotLy8gCSAgY2FzZSBIQ0ZfQUNUX1dBS0VVUDoJCQkJCQkvLyBERFMgV2FrZXVwIHJlcXVlc3QKLS8vIAkJSENGQVNTRVJUKCBpZmJwLT5JRkJfSW50T2ZmQ250ID09IDB4RkZGRSwgaWZicC0+SUZCX0ludE9mZkNudCApCi0vLyAJCWlmYnAtPklGQl9JbnRPZmZDbnQrKzsJCQkJCS8vIHJlc3RvcmUgY29udmVudGlvbmFsIEkvRgotLy8gCQlPUFcoIEhSRUdfSU8sIEhSRUdfSU9fV0FLRVVQX0FTWU5DICk7Ci0vLyAJCU1TRl9XQUlUKDgwMCk7CQkJCQkJCS8vIE1TRi1kZWZpbmVkIGZ1bmN0aW9uIHRvIHdhaXQgbiBtaWNyb3NlY29uZHMuCi0vLyAJCXJjID0gaGNmX2FjdGlvbiggaWZicCwgSENGX0FDVF9JTlRfT0ZGICk7CS8qYm9ndXMsIElGQl9JbnRPZmZDbnQgPT0gMHhGRkZGLCBzbyBpZiB5b3UgY2FyZWZ1bGx5IGxvb2sKLS8vIAkJCQkJCQkJCQkJCQkgKmF0IHRoZSAjaWYgSENGX0REUyBzdGF0ZW1lbnRzLCBIQ0ZfQUNUX0lOVF9PRkYgaXMgZW1wdHkKLS8vIAkJCQkJCQkJCQkJCQkgKmZvciBERFMuICJNdWNoIiBiZXR0ZXIgd291bGQgYmUgdG8gbWVyZ2UgdGhlIGZsb3dzIGZvcgotLy8gCQkJCQkJCQkJCQkJCSAqRERTIGFuZCBERUVQX1NMRUVQCi0vLyAJCQkJCQkJCQkJCQkJICovCi0vLyAJCWJyZWFrOworLy8JY2FzZSBIQ0ZfQUNUX1dBS0VVUDogICAgICAgICAgICAgICAgICAgICAgLy8gRERTIFdha2V1cCByZXF1ZXN0CisvLwkJSENGQVNTRVJUKCBpZmJwLT5JRkJfSW50T2ZmQ250ID09IDB4RkZGRSwgaWZicC0+SUZCX0ludE9mZkNudCApOworLy8JCWlmYnAtPklGQl9JbnRPZmZDbnQrKzsgICAgICAgICAgICAgICAgICAvLyByZXN0b3JlIGNvbnZlbnRpb25hbCBJL0YKKy8vCQlPUFcoIEhSRUdfSU8sIEhSRUdfSU9fV0FLRVVQX0FTWU5DICk7CisvLwkJTVNGX1dBSVQoODAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1TRi1kZWZpbmVkIGZ1bmN0aW9uIHRvIHdhaXQgbiBtaWNyb3NlY29uZHMuCisvLwkJcmMgPSBoY2ZfYWN0aW9uKCBpZmJwLCBIQ0ZfQUNUX0lOVF9PRkYgKTsgICAvKmJvZ3VzLCBJRkJfSW50T2ZmQ250ID09IDB4RkZGRiwgc28gaWYgeW91IGNhcmVmdWxseSBsb29rCisvLwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmF0IHRoZSAjaWYgSENGX0REUyBzdGF0ZW1lbnRzLCBIQ0ZfQUNUX0lOVF9PRkYgaXMgZW1wdHkKKy8vCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZm9yIEREUy4gIk11Y2giIGJldHRlciB3b3VsZCBiZSB0byBtZXJnZSB0aGUgZmxvd3MgZm9yCisvLwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkREUyBhbmQgREVFUF9TTEVFUAorLy8JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvLwkJYnJlYWs7CiAjZW5kaWYgLy8gSENGX0REUwogCi0jaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWAotCSAgY2FzZSBIQ0ZfQUNUX0NDWF9PTjoJCQkJCQkvLyBlbmFibGUgQ0tJUAotCSAgY2FzZSBIQ0ZfQUNUX0NDWF9PRkY6CQkJCQkJLy8gZGlzYWJsZSBDS0lQCi0JCWlmYnAtPklGQl9DS0lQU3RhdCA9IGFjdGlvbjsKLQkJYnJlYWs7Ci0jZW5kaWYgLy8gSENGX1RZUEVfQ0NYCi0KLQkgIGNhc2UgSENGX0FDVF9SWF9BQ0s6CQkJCQkJLy9SZWNlaXZlciBBQ0sKLS8qNiovCWlmICggaWZicC0+SUZCX1J4RklEICkgeworCWNhc2UgSENGX0FDVF9SWF9BQ0s6ICAgICAgICAgICAgICAgICAgICAgIC8vUmVjZWl2ZXIgQUNLCisJLyo2Ki8gICBpZiAoIGlmYnAtPklGQl9SeEZJRCApIHsKIAkJCURBV0FfQUNLKCBIUkVHX0VWX1JYICk7CiAJCX0KIAkJaWZicC0+SUZCX1J4RklEID0gaWZicC0+SUZCX1J4TGVuID0gMDsKIAkJYnJlYWs7CiAKLS8qOCovIGNhc2UJSENGX0FDVF9QUlNfU0NBTjoJCQkJCS8vIEhlcm1lcyBQUlMgU2NhbiAoRjEwMikKKyAgLyo4Ki8gY2FzZSAgSENGX0FDVF9QUlNfU0NBTjogICAgICAgICAgICAgICAgICAgLy8gSGVybWVzIFBSUyBTY2FuIChGMTAyKQogCQlPUFcoIEhSRUdfUEFSQU1fMSwgMHgzRkZGICk7Ci0JCQkvL0ZhbGwgdGhyb3VnaCBpbiBIQ0ZfQUNUX1RBTExJRVMKLQkgIGNhc2UgSENGX0FDVF9UQUxMSUVTOgkJCQkJCS8vIEhlcm1lcyBJbnF1aXJlIFRhbGxpZXMgKEYxMDApCisJCS8vRmFsbCB0aHJvdWdoIGluIEhDRl9BQ1RfVEFMTElFUworCWNhc2UgSENGX0FDVF9UQUxMSUVTOiAgICAgICAgICAgICAgICAgICAgIC8vIEhlcm1lcyBJbnF1aXJlIFRhbGxpZXMgKEYxMDApCiAjaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfSElJNSApID09IDAKLQkgIGNhc2UgSENGX0FDVF9TQ0FOOgkJCQkJCS8vIEhlcm1lcyBJbnF1aXJlIFNjYW4gKEYxMDEpCisJY2FzZSBIQ0ZfQUNUX1NDQU46ICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVybWVzIElucXVpcmUgU2NhbiAoRjEwMSkKICNlbmRpZiAvLyBIQ0ZfVFlQRV9ISUk1CiAJCS8qISEgdGhlIGFzc3VtcHRpb25zIGFib3V0IG51bWVyaWNhbCByZWxhdGlvbnNoaXBzIGJldHdlZW4gQ0ZHX1RBTExJRVMgZXRjIGFuZCBIQ0ZfQUNUX1RBTExJRVMgZXRjCi0JCSAqICAgYXJlIGNoZWNrZWQgYnkgI2lmIHN0YXRlbWVudHMganVzdCBwcmlvciB0byB0aGlzIHJvdXRpbmUgcmVzdWx0aW5nIGluOiBlcnIgIm1haW50ZW5hbmNlIgkqLworCQkgKiAgIGFyZSBjaGVja2VkIGJ5ICNpZiBzdGF0ZW1lbnRzIGp1c3QgcHJpb3IgdG8gdGhpcyByb3V0aW5lIHJlc3VsdGluZyBpbjogZXJyICJtYWludGVuYW5jZSIgICAqLwogCQljbWRfZXhlKCBpZmJwLCBIQ01EX0lOUVVJUkUsIGFjdGlvbiAtIEhDRl9BQ1RfVEFMTElFUyArIENGR19UQUxMSUVTICk7CiAJCWJyZWFrOwogCi0JICBkZWZhdWx0OgotCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgYWN0aW9uICkKKwlkZWZhdWx0OgorCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgYWN0aW9uICk7CiAJCWJyZWFrOwogCX0KLQkvLyEgZG8gbm90IEhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjICkJCQkJCQkJCQkJCQkJCS8qIDMwKi8KLQlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfQUNUSU9OICkKKwkvLyEgZG8gbm90IEhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMzAqLworCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9BQ1RJT04gKTsKIAlyZXR1cm4gcmM7CiB9IC8vIGhjZl9hY3Rpb24KLSNlbmRpZiAvLyBIQ0ZfRExfT05MWQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSouTU9EVUxFCQlpbnQgaGNmX2NudGwoIElGQlAgaWZicCwgaGNmXzE2IGNtZCApCi0qLlBVUlBPU0UJCUNvbm5lY3Qgb3IgZGlzY29ubmVjdCBhIHNwZWNpZmljIHBvcnQgdG8gYSBzcGVjaWZpYyBuZXR3b3JrLgotKiEhICA7Pz8/Pz8/Pz8/Pz8/Pz8/PyBjb250aW51ZSBuZWVkcyBtb3JlIGV4cGxhbmF0aW9uCi0qCQkJCXJlY292ZXJzIGJ5IG1lYW5zIG9mICJjb250aW51ZSIgd2hlbiB0aGUgY29ubmVjdCBwcm9jZXNzIGluIENDWCBtb2RlIGZhaWxzCi0qCQkJCUVuYWJsZXMgb3IgZGlzYWJsZXMgZGF0YSB0cmFuc21pc3Npb24gYW5kIHJlY2VwdGlvbiBmb3IgdGhlIE5JQy4KLSoJCQkJQWN0aXZhdGVzIHN0YXRpYyBOSUMgY29uZmlndXJhdGlvbiBmb3IgYSBzcGVjaWZpYyBwb3J0IGF0IGNvbm5lY3QuCi0qCQkJCUFjdGl2YXRlcyBzdGF0aWMgY29uZmlndXJhdGlvbiBmb3IgYWxsIHBvcnRzIGF0IGVuYWJsZS4KLSoKLSouQVJHVU1FTlRTCi0qCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawotKgljbWQJCQkweDAwMUY6CUhlcm1lcyBjb21tYW5kIChkaXNhYmxlLCBlbmFibGUsIGNvbm5lY3QsIGRpc2Nvbm5lY3QsIGNvbnRpbnVlKQotKgkJCQkJSENGX0NOVExfRU5BQkxFCQlFbmFibGUKLSoJCQkJCUhDRl9DTlRMX0RJU0FCTEUgICAgRGlzYWJsZQotKgkJCQkJSENGX0NOVExfQ09OVElOVUUJQ29udGludWUKLSoJCQkJCUhDRl9DTlRMX0NPTk5FQ1QgICAgQ29ubmVjdAotKgkJCQkJSENGX0NOVExfRElTQ09OTkVDVCBEaXNjb25uZWN0Ci0qCQkJCTB4MDEwMDogY29tbWFuZCBxdWFsaWZpZXIgKGNvbnRpbnVlKQotKgkJCQkJSENNRF9SRVRSWQkJCXJldHJ5IGZsYWcKLSoJCQkJMHgwNzAwOiAgcG9ydCBudW1iZXIgKGNvbm5lY3QvZGlzY29ubmVjdCkKLSoJCQkJCUhDRl9QT1JUXzAgICAgICAgICAgTUFDIFBvcnQgMAotKgkJCQkJSENGX1BPUlRfMSAgICAgICAgICBNQUMgUG9ydCAxCi0qCQkJCQlIQ0ZfUE9SVF8yICAgICAgICAgIE1BQyBQb3J0IDIKLSoJCQkJCUhDRl9QT1JUXzMgICAgICAgICAgTUFDIFBvcnQgMwotKgkJCQkJSENGX1BPUlRfNCAgICAgICAgICBNQUMgUG9ydCA0Ci0qCQkJCQlIQ0ZfUE9SVF81ICAgICAgICAgIE1BQyBQb3J0IDUKLSoJCQkJCUhDRl9QT1JUXzYgICAgICAgICAgTUFDIFBvcnQgNgotKgotKi5SRVRVUk5TCi0qCUhDRl9TVUNDRVNTCi0qISEJdmlhIGNtZF9leGUKLSoJSENGX0VSUl9OT19OSUMKLSoJSENGX0VSUl9ERUZVTkNUXy4uLgotKglIQ0ZfRVJSX1RJTUVfT1VUCi0qCi0qLkRFU0NSSVBUSU9OCi0qIFRoZSBwYXJhbWV0ZXIgY21kIGNvbnRhaW5zIGEgbnVtYmVyIG9mIHN1YmZpZWxkcy4KLSogVGhlIGFjdHVhbCB2YWx1ZSBmb3IgY21kIGlzIGNyZWF0ZWQgYnkgbG9naWNhbCBvci1pbmcgdGhlIGFwcHJvcHJpYXRlIG1uZW1vbmljcyBmb3IgdGhlIHN1YmZpZWxkcy4KLSogVGhlIGZpZWxkIDB4MDAxRiBjb250YWlucyB0aGUgY29tbWFuZCBjb2RlCi0qICAtIEhDRl9DTlRMX0VOQUJMRQotKiAgLSBIQ0ZfQ05UTF9ESVNBQkxFCi0qICAtIEhDRl9DTlRMX0NPTk5FQ1QKLSogIC0gSENGX0NOVExfRElTQ09OTkVDVAotKiAgLSBIQ0ZfQ05UTF9DT05USU5VRQotKgotKiBGb3IgSENGX0NOVExfQ09OVElOVUUsIHRoZSBmaWVsZCAweDAxMDAgY29udGFpbnMgdGhlIHJldHJ5IGZsYWcgSENNRF9SRVRSWS4KLSogRm9yIEhDRl9DTlRMX0NPTk5FQ1QgYW5kIEhDRl9DTlRMX0RJU0NPTk5FQ1QsIHRoZSBmaWVsZCAweDA3MDAgY29udGFpbnMgdGhlIHBvcnQgbnVtYmVyIGFzIEhDRl9QT1JUXyMuCi0qIEZvciBTdGF0aW9uIGFzIHdlbGwgYXMgQWNjZXNzUG9pbnQgRi9XLCBNQUMgUG9ydCAwIGlzIHRoZSAibm9ybWFsIiBjb21tdW5pY2F0aW9uIGNoYW5uZWwuCi0qIEZvciBBY2Nlc3NQb2ludCBGL1csIE1BQyBQb3J0IDEgdGhyb3VnaCA2IGNvbnRyb2wgdGhlIFdEUyBsaW5rcy4KLSoKLSogTm90ZSB0aGF0IGRlc3BpdGUgdGhlIG5hbWVzIEhDRl9DTlRMX0RJU0FCTEUgYW5kIEhDRl9DTlRMX0VOQUJMRSwgaGNmX2NudGwgZG9lcyBub3QgaW5mbHVlbmNlIHRoZSBOSUMKLSogSW50ZXJydXB0cyBtb2RlLgotKgotKiBUaGUgQ29ubmVjdCBpcyB1c2VkIGJ5IHRoZSBNU0YgdG8gYnJpbmcgYSBwYXJ0aWN1bGFyIHBvcnQgaW4gYW4gaW5hY3RpdmUgc3RhdGUgYXMgZmFyIGFzIGRhdGEgdHJhbnNtaXNzaW9uCi0qIGFuZCByZWNlcHRpb24gYXJlIGNvbmNlcm5lZC4KLSogV2hlbiBhIHBhcnRpY3VsYXIgcG9ydCBpcyBkaXNjb25uZWN0ZWQ6Ci0qIC0gdGhlIEYvVyBkaXNhYmxlcyB0aGUgcmVjZWl2ZXIgZm9yIHRoYXQgcG9ydC4KLSogLSB0aGUgRi9XIGlnbm9yZXMgc2VuZCBjb21tYW5kcyBmb3IgdGhhdCBwb3J0LgotKiAtIGFsbCBmcmFtZXMgKFJlY2VpdmUgYXMgd2VsbCBhcyBwZW5kaW5nIFRyYW5zbWl0KSBmb3IgdGhhdCBwb3J0IG9uIHRoZSBOSUMgYXJlIGRpc2NhcmRlZC4KLSoKLSogV2hlbiB0aGUgTklDIGlzIGRpc2FibGVkLCBhYm92ZSBsaXN0IGFwcGxpZXMgdG8gYWxsIHBvcnRzLCBpLmUuIHRoZSByZXN1bHQgaXMgbGlrZSBhbGwgcG9ydHMgYXJlCi0qIGRpc2Nvbm5lY3RlZC4KLSoKLSogV2hlbiBhIHBhcnRpY3VsYXIgcG9ydCBpcyBjb25uZWN0ZWQ6Ci0qIC0gdGhlIEYvVyBlZmZlY3R1YXRlcyB0aGUgc3RhdGljIGNvbmZpZ3VyYXRpb24gZm9yIHRoYXQgcG9ydC4KLSogLSBlbmFibGVzIHRoZSByZWNlaXZlciBmb3IgdGhhdCBwb3J0LgotKiAtIGFjY2VwdHMgc2VuZCBjb21tYW5kcyBmb3IgdGhhdCBwb3J0LgotKgotKiBFbmFibGluZyBoYXMgdGhlIGZvbGxvd2luZyBlZmZlY3RzOgotKiAtIHRoZSBGL1cgZWZmZWN0dWF0ZXMgdGhlIHN0YXRpYyBjb25maWd1cmF0aW9uIGZvciBhbGwgcG9ydHMuCi0qCVRoZSBGL1cgb25seSB1cGRhdGVzIGl0cyBzdGF0aWMgY29uZmlndXJhdGlvbiBhdCBhIHRyYW5zaXRpb24gZnJvbSBkaXNhYmxlZCB0byBlbmFibGVkIG9yIGZyb20KLSoJZGlzY29ubmVjdGVkIHRvIGNvbm5lY3RlZC4KLSoJSW4gb3JkZXIgdG8gZW5mb3JjZSB0aGUgc3RhdGljIGNvbmZpZ3VyYXRpb24sIHRoZSBNU0YgbXVzdCBhc3N1cmUgdGhhdCBzdWNoIGEgdHJhbnNpdGlvbiB0YWtlcyBwbGFjZS4KLSoJRHVlIHRvIHN1Y2ggYSBkaXNhYmxlL2VuYWJsZSBvciBkaXNjb25uZWN0L2Nvbm5lY3Qgc2VxdWVuY2UsIFJ4L1R4IGZyYW1lcyBtYXkgYmUgbG9zdCwgaW4gb3RoZXIgd29yZHMsCi0qCWNvbmZpZ3VyYXRpb24gbWF5IGltcGFjdCBjb21tdW5pY2F0aW9uLgotKiAtIFRoZSBETUEgRW5naW5lIChpZiBhcHBsaWNhYmxlKSBpcyBlbmFibGVkLgotKiBOb3RlIHRoYXQgdGhlIEVuYWJsZSBGdW5jdGlvbiBieSBpdHNlbGYgb25seSBlbmFibGVzIGRhdGEgdHJhbnNtaXNzaW9uIGFuZCByZWNlcHRpb24sIGl0Ci0qIGRvZXMgbm90IGVuYWJsZSB0aGUgSW50ZXJydXB0IEdlbmVyYXRpb24gbWVjaGFuaXNtLiBUaGlzIGlzIGRvbmUgYnkgaGNmX2FjdGlvbi4KLSoKLSogRGlzYWJsaW5nIGhhcyB0aGUgZm9sbG93aW5nIGVmZmVjdHM6Ci0qISEgIDs/Pz8/P2lzIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50IHJlYWxseSB0cnVlCi0qIC0gaXQgYWN0cyBhcyBhIGRpc2Nvbm5lY3Qgb24gYWxsIHBvcnRzLgotKiAtIFRoZSBETUEgRW5naW5lIChpZiBhcHBsaWNhYmxlKSBpcyBkaXNhYmxlZC4KLSoKLSogRm9yIGltcGFjdCBvZiB0aGUgZGlzYWJsZSBjb21tYW5kIG9uIHRoZSBiZWhhdmlvciBvZiBoY2ZfZG1hX3R4L3J4X2dldCBzZWUgdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb25zLgotKgotKiBBbHRob3VnaCB0aGUgRW5hYmxlL0Rpc2FibGUgYW5kIENvbm5lY3QvRGlzY29ubmVjdCBhcmUgYW50b255bXMsIHRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uIG9uIHRoZWlyIHNlcXVlbmNpbmcsCi0qIGluIG90aGVyIHdvcmRzLCB0aGV5IG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgaW4gYXJiaXRyYXJ5IHNlcXVlbmNlIHdpdGhvdXQgYmVpbmcgcGFpcmVkIG9yIGJhbGFuY2VkLgotKiBFYWNoIHRpbWUgb25lIG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyBjYWxsZWQsIHRoZSBlZmZlY3RzIG9mIHRoZSBwcmVjZWRpbmcgY2FsbHMgY2Vhc2UuCi0qCi0qIEFzc2VydCBmYWlscyBpZgotKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KLSogLSBOSUMgaW50ZXJydXB0cyBhcmUgbm90IGRpc2FibGVkLgotKiAtIEEgY29tbWFuZCBvdGhlciB0aGFuIENvbnRpbnVlLCBFbmFibGUsIERpc2FibGUsIENvbm5lY3Qgb3IgRGlzY29ubmVjdCBpcyBnaXZlbi4KLSogLSBBbiBpbnZhbGlkIGNvbWJpbmF0aW9uIG9mIHRoZSBzdWJmaWVsZHMgaXMgZ2l2ZW4gb3IgYSBiaXQgb3V0c2lkZSB0aGUgc3ViZmllbGRzIGlzIGdpdmVuLgotKiAtIGFueSByZXR1cm4gY29kZSBiZXNpZGVzIEhDRl9TVUNDRVNTLgotKiAtIHJlZW50cmFuY3ksIG1heSBiZSAgY2F1c2VkIGJ5IGNhbGxpbmcgYSBoY2ZfZnVuY3Rpb24gd2l0aG91dCBhZGVxdWF0ZSBwcm90ZWN0aW9uIGFnYWluc3QgTklDIGludGVycnVwdHMgb3IKLSoJbXVsdGktdGhyZWFkaW5nCi0qCi0qLkRJQUdSQU0KLSoJaGNmX2NudGwgdGFrZXMgc3VjY2Vzc2l2ZWx5IHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKLSoyOglJZiB0aGUgSENGIGlzIGluIERlZnVuY3QgbW9kZSBvciBpbmNvbXBhdGlibGUgd2l0aCB0aGUgUHJpbWFyeSBvciBTdGF0aW9uIFN1cHBsaWVyIGluIHRoZSBIZXJtZXMsCi0qCWhjZl9jbnRsKCkgcmV0dXJucyBpbW1lZGlhdGVseSB3aXRoIEhDRl9FUlJfTk9fTklDOz8gYXMgc3RhdHVzLgotKjg6CXdoZW4gdGhlIHBvcnQgaXMgZGlzYWJsZWQsIHRoZSBETUEgZW5naW5lIG5lZWRzIHRvIGJlIGRlLWFjdGl2YXRlZCwgc28gdGhlIGhvc3QgY2FuIHNhZmVseSByZWNsYWltIHR4Ci0qCXBhY2tldHMgZnJvbSB0aGUgdHggZGVzY3JpcHRvciBjaGFpbi4KLSoKLSouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKgorICouTU9EVUxFICAgICAgICBpbnQgaGNmX2NudGwoIElGQlAgaWZicCwgaGNmXzE2IGNtZCApCisgKi5QVVJQT1NFICAgICAgIENvbm5lY3Qgb3IgZGlzY29ubmVjdCBhIHNwZWNpZmljIHBvcnQgdG8gYSBzcGVjaWZpYyBuZXR3b3JrLgorICohISAgOz8/Pz8/Pz8/Pz8/Pz8/Pz8gY29udGludWUgbmVlZHMgbW9yZSBleHBsYW5hdGlvbgorICogICAgICAgICAgICAgICByZWNvdmVycyBieSBtZWFucyBvZiAiY29udGludWUiIHdoZW4gdGhlIGNvbm5lY3QgcHJvY2VzcyBpbiBDQ1ggbW9kZSBmYWlscworICogICAgICAgICAgICAgICBFbmFibGVzIG9yIGRpc2FibGVzIGRhdGEgdHJhbnNtaXNzaW9uIGFuZCByZWNlcHRpb24gZm9yIHRoZSBOSUMuCisgKiAgICAgICAgICAgICAgIEFjdGl2YXRlcyBzdGF0aWMgTklDIGNvbmZpZ3VyYXRpb24gZm9yIGEgc3BlY2lmaWMgcG9ydCBhdCBjb25uZWN0LgorICogICAgICAgICAgICAgICBBY3RpdmF0ZXMgc3RhdGljIGNvbmZpZ3VyYXRpb24gZm9yIGFsbCBwb3J0cyBhdCBlbmFibGUuCisgKgorICouQVJHVU1FTlRTCisgKiAgIGlmYnAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworICogICBjbWQgICAgICAgICAweDAwMUY6IEhlcm1lcyBjb21tYW5kIChkaXNhYmxlLCBlbmFibGUsIGNvbm5lY3QsIGRpc2Nvbm5lY3QsIGNvbnRpbnVlKQorICogICAgICAgICAgICAgICAgICAgSENGX0NOVExfRU5BQkxFICAgICBFbmFibGUKKyAqICAgICAgICAgICAgICAgICAgIEhDRl9DTlRMX0RJU0FCTEUgICAgRGlzYWJsZQorICogICAgICAgICAgICAgICAgICAgSENGX0NOVExfQ09OVElOVUUgICBDb250aW51ZQorICogICAgICAgICAgICAgICAgICAgSENGX0NOVExfQ09OTkVDVCAgICBDb25uZWN0CisgKiAgICAgICAgICAgICAgICAgICBIQ0ZfQ05UTF9ESVNDT05ORUNUIERpc2Nvbm5lY3QKKyAqICAgICAgICAgICAgICAgMHgwMTAwOiBjb21tYW5kIHF1YWxpZmllciAoY29udGludWUpCisgKiAgICAgICAgICAgICAgICAgICBIQ01EX1JFVFJZICAgICAgICAgIHJldHJ5IGZsYWcKKyAqICAgICAgICAgICAgICAgMHgwNzAwOiAgcG9ydCBudW1iZXIgKGNvbm5lY3QvZGlzY29ubmVjdCkKKyAqICAgICAgICAgICAgICAgICAgIEhDRl9QT1JUXzAgICAgICAgICAgTUFDIFBvcnQgMAorICogICAgICAgICAgICAgICAgICAgSENGX1BPUlRfMSAgICAgICAgICBNQUMgUG9ydCAxCisgKiAgICAgICAgICAgICAgICAgICBIQ0ZfUE9SVF8yICAgICAgICAgIE1BQyBQb3J0IDIKKyAqICAgICAgICAgICAgICAgICAgIEhDRl9QT1JUXzMgICAgICAgICAgTUFDIFBvcnQgMworICogICAgICAgICAgICAgICAgICAgSENGX1BPUlRfNCAgICAgICAgICBNQUMgUG9ydCA0CisgKiAgICAgICAgICAgICAgICAgICBIQ0ZfUE9SVF81ICAgICAgICAgIE1BQyBQb3J0IDUKKyAqICAgICAgICAgICAgICAgICAgIEhDRl9QT1JUXzYgICAgICAgICAgTUFDIFBvcnQgNgorICoKKyAqLlJFVFVSTlMKKyAqICAgSENGX1NVQ0NFU1MKKyAqISEgdmlhIGNtZF9leGUKKyAqICAgSENGX0VSUl9OT19OSUMKKyAqICAgSENGX0VSUl9ERUZVTkNUXy4uLgorICogICBIQ0ZfRVJSX1RJTUVfT1VUCisgKgorICouREVTQ1JJUFRJT04KKyAqIFRoZSBwYXJhbWV0ZXIgY21kIGNvbnRhaW5zIGEgbnVtYmVyIG9mIHN1YmZpZWxkcy4KKyAqIFRoZSBhY3R1YWwgdmFsdWUgZm9yIGNtZCBpcyBjcmVhdGVkIGJ5IGxvZ2ljYWwgb3ItaW5nIHRoZSBhcHByb3ByaWF0ZSBtbmVtb25pY3MgZm9yIHRoZSBzdWJmaWVsZHMuCisgKiBUaGUgZmllbGQgMHgwMDFGIGNvbnRhaW5zIHRoZSBjb21tYW5kIGNvZGUKKyAqICAtIEhDRl9DTlRMX0VOQUJMRQorICogIC0gSENGX0NOVExfRElTQUJMRQorICogIC0gSENGX0NOVExfQ09OTkVDVAorICogIC0gSENGX0NOVExfRElTQ09OTkVDVAorICogIC0gSENGX0NOVExfQ09OVElOVUUKKyAqCisgKiBGb3IgSENGX0NOVExfQ09OVElOVUUsIHRoZSBmaWVsZCAweDAxMDAgY29udGFpbnMgdGhlIHJldHJ5IGZsYWcgSENNRF9SRVRSWS4KKyAqIEZvciBIQ0ZfQ05UTF9DT05ORUNUIGFuZCBIQ0ZfQ05UTF9ESVNDT05ORUNULCB0aGUgZmllbGQgMHgwNzAwIGNvbnRhaW5zIHRoZSBwb3J0IG51bWJlciBhcyBIQ0ZfUE9SVF8jLgorICogRm9yIFN0YXRpb24gYXMgd2VsbCBhcyBBY2Nlc3NQb2ludCBGL1csIE1BQyBQb3J0IDAgaXMgdGhlICJub3JtYWwiIGNvbW11bmljYXRpb24gY2hhbm5lbC4KKyAqIEZvciBBY2Nlc3NQb2ludCBGL1csIE1BQyBQb3J0IDEgdGhyb3VnaCA2IGNvbnRyb2wgdGhlIFdEUyBsaW5rcy4KKyAqCisgKiBOb3RlIHRoYXQgZGVzcGl0ZSB0aGUgbmFtZXMgSENGX0NOVExfRElTQUJMRSBhbmQgSENGX0NOVExfRU5BQkxFLCBoY2ZfY250bCBkb2VzIG5vdCBpbmZsdWVuY2UgdGhlIE5JQworICogSW50ZXJydXB0cyBtb2RlLgorICoKKyAqIFRoZSBDb25uZWN0IGlzIHVzZWQgYnkgdGhlIE1TRiB0byBicmluZyBhIHBhcnRpY3VsYXIgcG9ydCBpbiBhbiBpbmFjdGl2ZSBzdGF0ZSBhcyBmYXIgYXMgZGF0YSB0cmFuc21pc3Npb24KKyAqIGFuZCByZWNlcHRpb24gYXJlIGNvbmNlcm5lZC4KKyAqIFdoZW4gYSBwYXJ0aWN1bGFyIHBvcnQgaXMgZGlzY29ubmVjdGVkOgorICogLSB0aGUgRi9XIGRpc2FibGVzIHRoZSByZWNlaXZlciBmb3IgdGhhdCBwb3J0LgorICogLSB0aGUgRi9XIGlnbm9yZXMgc2VuZCBjb21tYW5kcyBmb3IgdGhhdCBwb3J0LgorICogLSBhbGwgZnJhbWVzIChSZWNlaXZlIGFzIHdlbGwgYXMgcGVuZGluZyBUcmFuc21pdCkgZm9yIHRoYXQgcG9ydCBvbiB0aGUgTklDIGFyZSBkaXNjYXJkZWQuCisgKgorICogV2hlbiB0aGUgTklDIGlzIGRpc2FibGVkLCBhYm92ZSBsaXN0IGFwcGxpZXMgdG8gYWxsIHBvcnRzLCBpLmUuIHRoZSByZXN1bHQgaXMgbGlrZSBhbGwgcG9ydHMgYXJlCisgKiBkaXNjb25uZWN0ZWQuCisgKgorICogV2hlbiBhIHBhcnRpY3VsYXIgcG9ydCBpcyBjb25uZWN0ZWQ6CisgKiAtIHRoZSBGL1cgZWZmZWN0dWF0ZXMgdGhlIHN0YXRpYyBjb25maWd1cmF0aW9uIGZvciB0aGF0IHBvcnQuCisgKiAtIGVuYWJsZXMgdGhlIHJlY2VpdmVyIGZvciB0aGF0IHBvcnQuCisgKiAtIGFjY2VwdHMgc2VuZCBjb21tYW5kcyBmb3IgdGhhdCBwb3J0LgorICoKKyAqIEVuYWJsaW5nIGhhcyB0aGUgZm9sbG93aW5nIGVmZmVjdHM6CisgKiAtIHRoZSBGL1cgZWZmZWN0dWF0ZXMgdGhlIHN0YXRpYyBjb25maWd1cmF0aW9uIGZvciBhbGwgcG9ydHMuCisgKiAgIFRoZSBGL1cgb25seSB1cGRhdGVzIGl0cyBzdGF0aWMgY29uZmlndXJhdGlvbiBhdCBhIHRyYW5zaXRpb24gZnJvbSBkaXNhYmxlZCB0byBlbmFibGVkIG9yIGZyb20KKyAqICAgZGlzY29ubmVjdGVkIHRvIGNvbm5lY3RlZC4KKyAqICAgSW4gb3JkZXIgdG8gZW5mb3JjZSB0aGUgc3RhdGljIGNvbmZpZ3VyYXRpb24sIHRoZSBNU0YgbXVzdCBhc3N1cmUgdGhhdCBzdWNoIGEgdHJhbnNpdGlvbiB0YWtlcyBwbGFjZS4KKyAqICAgRHVlIHRvIHN1Y2ggYSBkaXNhYmxlL2VuYWJsZSBvciBkaXNjb25uZWN0L2Nvbm5lY3Qgc2VxdWVuY2UsIFJ4L1R4IGZyYW1lcyBtYXkgYmUgbG9zdCwgaW4gb3RoZXIgd29yZHMsCisgKiAgIGNvbmZpZ3VyYXRpb24gbWF5IGltcGFjdCBjb21tdW5pY2F0aW9uLgorICogLSBUaGUgRE1BIEVuZ2luZSAoaWYgYXBwbGljYWJsZSkgaXMgZW5hYmxlZC4KKyAqIE5vdGUgdGhhdCB0aGUgRW5hYmxlIEZ1bmN0aW9uIGJ5IGl0c2VsZiBvbmx5IGVuYWJsZXMgZGF0YSB0cmFuc21pc3Npb24gYW5kIHJlY2VwdGlvbiwgaXQKKyAqIGRvZXMgbm90IGVuYWJsZSB0aGUgSW50ZXJydXB0IEdlbmVyYXRpb24gbWVjaGFuaXNtLiBUaGlzIGlzIGRvbmUgYnkgaGNmX2FjdGlvbi4KKyAqCisgKiBEaXNhYmxpbmcgaGFzIHRoZSBmb2xsb3dpbmcgZWZmZWN0czoKKyAqISEgIDs/Pz8/P2lzIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50IHJlYWxseSB0cnVlCisgKiAtIGl0IGFjdHMgYXMgYSBkaXNjb25uZWN0IG9uIGFsbCBwb3J0cy4KKyAqIC0gVGhlIERNQSBFbmdpbmUgKGlmIGFwcGxpY2FibGUpIGlzIGRpc2FibGVkLgorICoKKyAqIEZvciBpbXBhY3Qgb2YgdGhlIGRpc2FibGUgY29tbWFuZCBvbiB0aGUgYmVoYXZpb3Igb2YgaGNmX2RtYV90eC9yeF9nZXQgc2VlIHRoZSBhcHByb3ByaWF0ZSBzZWN0aW9ucy4KKyAqCisgKiBBbHRob3VnaCB0aGUgRW5hYmxlL0Rpc2FibGUgYW5kIENvbm5lY3QvRGlzY29ubmVjdCBhcmUgYW50b255bXMsIHRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uIG9uIHRoZWlyIHNlcXVlbmNpbmcsCisgKiBpbiBvdGhlciB3b3JkcywgdGhleSBtYXkgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGluIGFyYml0cmFyeSBzZXF1ZW5jZSB3aXRob3V0IGJlaW5nIHBhaXJlZCBvciBiYWxhbmNlZC4KKyAqIEVhY2ggdGltZSBvbmUgb2YgdGhlc2UgZnVuY3Rpb25zIGlzIGNhbGxlZCwgdGhlIGVmZmVjdHMgb2YgdGhlIHByZWNlZGluZyBjYWxscyBjZWFzZS4KKyAqCisgKiBBc3NlcnQgZmFpbHMgaWYKKyAqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgorICogLSBOSUMgaW50ZXJydXB0cyBhcmUgbm90IGRpc2FibGVkLgorICogLSBBIGNvbW1hbmQgb3RoZXIgdGhhbiBDb250aW51ZSwgRW5hYmxlLCBEaXNhYmxlLCBDb25uZWN0IG9yIERpc2Nvbm5lY3QgaXMgZ2l2ZW4uCisgKiAtIEFuIGludmFsaWQgY29tYmluYXRpb24gb2YgdGhlIHN1YmZpZWxkcyBpcyBnaXZlbiBvciBhIGJpdCBvdXRzaWRlIHRoZSBzdWJmaWVsZHMgaXMgZ2l2ZW4uCisgKiAtIGFueSByZXR1cm4gY29kZSBiZXNpZGVzIEhDRl9TVUNDRVNTLgorICogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGEgaGNmX2Z1bmN0aW9uIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbiBhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yCisgKiAgIG11bHRpLXRocmVhZGluZworICoKKyAqLkRJQUdSQU0KKyAqICAgaGNmX2NudGwgdGFrZXMgc3VjY2Vzc2l2ZWx5IHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKKyAqMjogSWYgdGhlIEhDRiBpcyBpbiBEZWZ1bmN0IG1vZGUgb3IgaW5jb21wYXRpYmxlIHdpdGggdGhlIFByaW1hcnkgb3IgU3RhdGlvbiBTdXBwbGllciBpbiB0aGUgSGVybWVzLAorICogICBoY2ZfY250bCgpIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aCBIQ0ZfRVJSX05PX05JQzs/IGFzIHN0YXR1cy4KKyAqODogd2hlbiB0aGUgcG9ydCBpcyBkaXNhYmxlZCwgdGhlIERNQSBlbmdpbmUgbmVlZHMgdG8gYmUgZGUtYWN0aXZhdGVkLCBzbyB0aGUgaG9zdCBjYW4gc2FmZWx5IHJlY2xhaW0gdHgKKyAqICAgcGFja2V0cyBmcm9tIHRoZSB0eCBkZXNjcmlwdG9yIGNoYWluLgorICoKKyAqLkVORERPQyAgICAgICAgICAgICAgICBFTkQgRE9DVU1FTlRBVElPTgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbnQKIGhjZl9jbnRsKCBJRkJQIGlmYnAsIGhjZl8xNiBjbWQgKQogewotaW50CXJjID0gSENGX0VSUl9JTkNPTVBfRlc7CisJaW50IHJjID0gSENGX0VSUl9JTkNPTVBfRlc7CiAjaWYgSENGX0FTU0VSVAotewlpbnQgeCA9IGNtZCAmIEhDTURfQ01EX0NPREU7Ci0JaWYgKCB4ID09IEhDRl9DTlRMX0NPTlRJTlVFICkgeCAmPSB+SENNRF9SRVRSWTsKLQllbHNlIGlmICggKHggPT0gSENNRF9ESVNBQkxFIHx8IHggPT0gSENNRF9FTkFCTEUpICYmIGlmYnAtPklGQl9GV0lkZW50aXR5LmNvbXBfaWQgPT0gQ09NUF9JRF9GV19BUCApIHsKLQkJeCAmPSB+SEZTX1RYX0NOVExfUE9SVDsKKwl7ICAgaW50IHggPSBjbWQgJiBIQ01EX0NNRF9DT0RFOworCQlpZiAoIHggPT0gSENGX0NOVExfQ09OVElOVUUgKSB4ICY9IH5IQ01EX1JFVFJZOworCQllbHNlIGlmICggKHggPT0gSENNRF9ESVNBQkxFIHx8IHggPT0gSENNRF9FTkFCTEUpICYmIGlmYnAtPklGQl9GV0lkZW50aXR5LmNvbXBfaWQgPT0gQ09NUF9JRF9GV19BUCApIHsKKwkJCXggJj0gfkhGU19UWF9DTlRMX1BPUlQ7CisJCX0KKwkJSENGQVNTRVJUKCB4PT1IQ0ZfQ05UTF9FTkFCTEUgIHx8IHg9PUhDRl9DTlRMX0RJU0FCTEUgICAgfHwgSENGX0NOVExfQ09OVElOVUUgfHwKKwkJCSAgIHg9PUhDRl9DTlRMX0NPTk5FQ1QgfHwgeD09SENGX0NOVExfRElTQ09OTkVDVCwgY21kICk7CiAJfQotCUhDRkFTU0VSVCggeD09SENGX0NOVExfRU5BQkxFICB8fCB4PT1IQ0ZfQ05UTF9ESVNBQkxFICAgIHx8IEhDRl9DTlRMX0NPTlRJTlVFIHx8Ci0JCQkgICB4PT1IQ0ZfQ05UTF9DT05ORUNUIHx8IHg9PUhDRl9DTlRMX0RJU0NPTk5FQ1QsIGNtZCApCi19CiAjZW5kaWYgLy8gSENGX0FTU0VSVAogLy8gI2lmIChIQ0ZfU0xFRVApICYgSENGX0REUwotLy8gCUhDRkFTU0VSVCggaWZicC0+SUZCX0ludE9mZkNudCAhPSAweEZGRkUsIGNtZCApCisvLwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgIT0gMHhGRkZFLCBjbWQgKTsKIC8vICNlbmRpZiAvLyBIQ0ZfRERTCi0JSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9DTlRMLCBjbWQgKQotCWlmICggaWZicC0+SUZCX0NhcmRTdGF0ID09IDAgKSB7CQkJCQkJCQkJCQkJCQkJCSAvKjIqLwotLyo2Ki8JcmMgPSBjbWRfZXhlKCBpZmJwLCBjbWQsIDAgKTsKKwlIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0NOVEwsIGNtZCApOworCWlmICggaWZicC0+SUZCX0NhcmRTdGF0ID09IDAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjIqLworCS8qNiovICAgcmMgPSBjbWRfZXhlKCBpZmJwLCBjbWQsIDAgKTsKICNpZiAoSENGX1NMRUVQKSAmIEhDRl9ERFMKLQkJaWZicC0+SUZCX1RpY2tDbnQgPSAwOwkJCQkvL3N0YXJ0IDIgc2Vjb25kIHBlcmlvZCAod2l0aCAxIHRpY2sgdW5jZXJ0YW50eSkKKwkJaWZicC0+SUZCX1RpY2tDbnQgPSAwOyAgICAgICAgICAgICAgLy9zdGFydCAyIHNlY29uZCBwZXJpb2QgKHdpdGggMSB0aWNrIHVuY2VydGFudHkpCiAjZW5kaWYgLy8gSENGX0REUwogCX0KICNpZiBIQ0ZfRE1BCkBAIC05ODAsNyArOTQ2LDcgQEAKIAkJaGNmX2lvIGlvX3BvcnQgPSBpZmJwLT5JRkJfSU9CYXNlOwogCQlERVNDX1NUUkNUICpwOwogCQlpZiAoIGNtZCA9PSBIQ0ZfQ05UTF9ESVNBQkxFIHx8IGNtZCA9PSBIQ0ZfQ05UTF9FTkFCTEUgKSB7Ci0JCQlPVVRfUE9SVF9EV09SRCggKGlvX3BvcnQgKyBIUkVHX0RNQV9DVFJMKSwgRE1BX0NUUkxTVEFUX1JFU0VUKTsJCQkJCQkvKjgqLworCQkJT1VUX1BPUlRfRFdPUkQoIChpb19wb3J0ICsgSFJFR19ETUFfQ1RSTCksIERNQV9DVFJMU1RBVF9SRVNFVCk7ICAgICAgICAgICAgICAgICAgICAgLyo4Ki8KIAkJCWlmYnAtPklGQl9DbnRsT3B0ICY9IH5ETUFfRU5BQkxFRDsKIAkJfQogCQlpZiAoIGNtZCA9PSBIQ0ZfQ05UTF9FTkFCTEUgKSB7CkBAIC05ODksMTIgKzk1NSwxMiBAQAogCQkJICogYXMgYWRkaXRpb25hbCBiZW5lZmljaWFyeSBzaWRlIGVmZmVjdCwgdGhlIFNPUCBhbmQgRU9QIGJpdHMgd2lsbCBhbHNvIGJlIGNsZWFyZWQKIAkJCSAqLwogCQkJaWZicC0+SUZCX0NudGxPcHQgfD0gRE1BX0VOQUJMRUQ7Ci0JCQlIQ0ZBU1NFUlQoIE5UX0FTU0VSVCwgTkVWRVJfVEVTVEVEICkKKwkJCUhDRkFTU0VSVCggTlRfQVNTRVJULCBORVZFUl9URVNURUQgKTsKIAkJCS8vIG1ha2UgdGhlIGVudGlyZSByeCBkZXNjcmlwdG9yIGNoYWluIERNQS1vd25lZCwgc28gdGhlIERNQSBlbmdpbmUgY2FuIChyZS0pdXNlIGl0LgogCQkJcCA9IGlmYnAtPklGQl9GaXJzdERlc2NbRE1BX1JYXTsKIAkJCWlmIChwICE9IE5VTEwpIHsgICAvLzs/IFRoaW5rIHRoaXMgb3ZlciBhZ2FpbiBpbiB0aGUgbGlnaHQgb2YgdGhlIG5ldyBjaGFpbmluZyBzdHJhdGVneQotCQkJCWlmICggMSApIAl7IC8vYmVnaW4gYWx0ZXJuYXRpdmUKLQkJCQkJSENGQVNTRVJUKCBOVF9BU1NFUlQsIE5FVkVSX1RFU1RFRCApCisJCQkJaWYgKCAxICkgICAgeyAvL2JlZ2luIGFsdGVybmF0aXZlCisJCQkJCUhDRkFTU0VSVCggTlRfQVNTRVJULCBORVZFUl9URVNURUQgKTsKIAkJCQkJcHV0X2ZyYW1lX2xzdCggaWZicCwgaWZicC0+SUZCX0ZpcnN0RGVzY1tETUFfUlhdLCBETUFfUlggKTsKIAkJCQkJaWYgKCBpZmJwLT5JRkJfRmlyc3REZXNjW0RNQV9SWF0gKSB7CiAJCQkJCQlwdXRfZnJhbWVfbHN0KCBpZmJwLCBpZmJwLT5JRkJfRmlyc3REZXNjW0RNQV9SWF0tPm5leHRfZGVzY19hZGRyLCBETUFfUlggKTsKQEAgLTEwMTMsMTQ3ICs5NzksMTQ3IEBACiAJCX0KIAl9CiAjZW5kaWYgLy8gSENGX0RNQQotCUhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjICkKLQlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfQ05UTCApCisJSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKTsKKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfQ05UTCApOwogCXJldHVybiByYzsKIH0gLy8gaGNmX2NudGwKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qLk1PRFVMRQkJaW50IGhjZl9jb25uZWN0KCBJRkJQIGlmYnAsIGhjZl9pbyBpb19iYXNlICkKLSouUFVSUE9TRQkJR3JhbnRzIGFjY2VzcyByaWdodCBmb3IgdGhlIEhDRiB0byB0aGUgSUZCLgotKgkJCQlJbml0aWFsaXplcyBDYXJkIGFuZCBIQ0YgaG91c2VrZWVwaW5nLgotKgotKi5BUkdVTUVOVFMKLSoJaWZicAkJKG5lYXIpIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawotKglpb19iYXNlCQlub24tVVNCOiBJL08gQmFzZSBhZGRyZXNzIG9mIHRoZSBOSUMgKGNvbm5lY3QpCi0qCQkJCW5vbi1VU0I6IEhDRl9ESVNDT05ORUNUCi0qCQkJCVVTQjoJIEhDRl9DT05ORUNULCBIQ0ZfRElTQ09OTkVDVAotKgotKi5SRVRVUk5TCi0qCUhDRl9TVUNDRVNTCi0qCUhDRl9FUlJfSU5DT01QX1BSSQotKglIQ0ZfRVJSX0lOQ09NUF9GVwotKglIQ0ZfRVJSX0RFRlVOQ1RfQ01EX1NFUQotKiEhCUhDRl9FUlJfTk9fTklDIHJlYWxseSByZXR1cm5lZCA7PwotKglIQ0ZfRVJSX05PX05JQwotKglIQ0ZfRVJSX1RJTUVfT1VUCi0qCi0qCU1TRi1hY2Nlc3NpYmxlIGZpZWxkcyBvZiBSZXN1bHQgQmxvY2s6Ci0qCUlGQl9JT0Jhc2UJCQkJZW50cnkgcGFyYW1ldGVyIGlvX2Jhc2UKLSoJSUZCX0lPUmFuZ2UJCQkJSFJFR19JT19SQU5HRSAoMHg0MC8weDgwKQotKglJRkJfVmVyc2lvbgkJCQl2ZXJzaW9uIG9mIHRoZSBJRkIgbGF5b3V0Ci0qCUlGQl9GV0lkZW50aXR5CQkJQ0ZHX0ZXX0lERU5USVRZX1NUUkNULCBzcGVjaWZpZXMgdGhlIGlkZW50aXR5IG9mIHRoZQotKgkJCQkJCQkicnVubmluZyIgRi9XLCBpLmUuIHRlcnRpYXJ5IEYvVyB1bmRlciBub3JtYWwgY29uZGl0aW9ucwotKglJRkJfRldTdXAJCQkJQ0ZHX1NVUF9SQU5HRV9TVFJDVCwgc3BlY2lmaWVzIHRoZSBzdXBwbGllciByYW5nZSBvZgotKgkJCQkJCQl0aGUgInJ1bm5pbmciIEYvVywgaS5lLiB0ZXJ0aWFyeSBGL1cgdW5kZXIgbm9ybWFsIGNvbmRpdGlvbnMKLSoJSUZCX0hTSVN1cAkJCQlDRkdfU1VQX1JBTkdFX1NUUkNULCBzcGVjaWZpZXMgdGhlIEhXL1NXIEkvRiByYW5nZSBvZiB0aGUgTklDCi0qCUlGQl9QUklJZGVudGl0eQkJCUNGR19QUklfSURFTlRJVFlfU1RSQ1QsIHNwZWNpZmllcyB0aGUgSWRlbnRpdHkgb2YgdGhlIFByaW1hcnkgRi9XCi0qCUlGQl9QUklTdXAJCQkJQ0ZHX1NVUF9SQU5HRV9TVFJDVCwgc3BlY2lmaWVzIHRoZSBzdXBwbGllciByYW5nZSBvZiB0aGUgUHJpbWFyeSBGL1cKLSoJYWxsIG90aGVyCQkJCWFsbCBNU0YgYWNjZXNzaWJsZSBmaWVsZHMsIHdoaWNoIGFyZSBub3Qgc3BlY2lmaWVkIGFib3ZlLCBhcmUgemVyby1maWxsZWQKLSoKLSouQ09ORElUSU9OUwotKiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIE1TRiB0byBhc3N1cmUgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBJL08gQmFzZSBhZGRyZXNzLgotKgotKiBOb3RlOiBoY2ZfY29ubmVjdCBkZWZhdWx0cyB0byBOSUMgaW50ZXJydXB0IGRpc2FibGVkIG1vZGUsIGkuZS4gYXMgaWYgaGNmX2FjdGlvbiggSENGX0FDVF9JTlRfT0ZGICkKLSogd2FzIGNhbGxlZC4KLSoKLSouREVTQ1JJUFRJT04KLSogaGNmX2Nvbm5lY3QgcGFzc2VzIHRoZSBNU0YtZGVmaW5lZCBsb2NhdGlvbiBvZiB0aGUgSUZCIHRvIHRoZSBIQ0YgYW5kIGdyYW50cyBvciByZXZva2VzIGFjY2VzcyByaWdodCBmb3IgdGhlCi0qIEhDRiB0byB0aGUgSUZCLiBSZXZva2luZyBpcyBkb25lIGJ5IHNwZWNpZnlpbmcgSENGX0RJU0NPTk5FQ1QgcmF0aGVyIHRoYW4gYW4gSS9PIGFkZHJlc3MgZm9yIHRoZSBwYXJhbWV0ZXIKLSogaW9fYmFzZS4gIEV2ZXJ5IGNhbGwgb2YgaGNmX2Nvbm5lY3QgaW4gImNvbm5lY3QiIG1vZGUsIG11c3QgZXZlbnR1YWxseSBiZSBmb2xsb3dlZCBieSBhIGNhbGwgb2YgaGNmX2Nvbm5lY3QKLSogaW4gImRpc2Nvbm5lY3QiIG1vZGUuIENsYWxsaW5nIGhjZl9jb25uZWN0IGluICJjb25uZWN0Ii8iZGlzY29ubmVjdCIgbW9kZSBjYW4gbm90IGJlIG5lc3RlZC4KLSogVGhlIElGQiBhZGRyZXNzIG11c3QgYmUgdXNlZCBhcyBhIGhhbmRsZSB3aXRoIGFsbCBzdWJzZXF1ZW50IEhDRi1mdW5jdGlvbiBjYWxscyBhbmQgdGhlIEhDRiB1c2VzIHRoZSBJRkIKLSogYWRkcmVzcyBhcyBhIGhhbmRsZSB3aGVuIGl0IHBlcmZvcm1zIGEgY2FsbChiYWNrKSBvZiBhbiBNU0YtZnVuY3Rpb24gKGkuZS4gbXNmX2Fzc2VydCkuCi0qCi0qIE5vdGUgdGhhdCBub3Qgb25seSB0aGUgTVNGIGFjY2Vzc2libGUgZmllbGRzIGFyZSBjbGVhcmVkLCBidXQgYWxzbyBhbGwgaW50ZXJuYWwgaG91c2VrZWVwaW5nCi0qIGluZm9ybWF0aW9uIGlzIHJlLWluaXRpYWxpemVkLgotKiBUaGlzIGltcGxpZXMgdGhhdCBhbGwgc2V0dGluZ3Mgd2hpY2ggYXJlIGRvbmUgdmlhIGhjZl9hY3Rpb24gYW5kIGhjZl9wdXRfaW5mbyAoZS5nLiBDRkdfTUJfQVNTRVJULCBDRkdfUkVHX01CLAotKiBDRkdfUkVHX0lORk9fTE9HKSBtdXN0IGJlIGRvbmUgYWdhaW4uIFRoZSBvbmx5IGZpZWxkIHdoaWNoIGlzIG5vdCBjbGVhcmVkLCBpcyBJRkJfTVNGU3VwLgotKgotKiBJZiBIQ0ZfSU5UX09OIGlzIHNlbGVjdGVkIGFzIGNvbXBpbGUgb3B0aW9uLCBOSUMgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQuCi0qCi0qIEFzc2VydCBmYWlscyBpZgotKiAtIGlmYnAgaXMgbm90IHByb3Blcmx5IGFsaWduZWQgKCByZWYgY2hhcHRlciBIQ0ZfQUxJR04gaW4gNC4xLjEpCi0qIC0gSS9PIEJhc2UgQWRkcmVzcyBpcyBub3QgYSBtdWx0aXBsZSBvZiAweDQwIChub3RlOiAweDAwMDAgaXMgZXhwbGljaXRseSBhbGxvd2VkKS4KLSoKLSouRElBR1JBTQotKgotKjA6CVRocm91Z2hvdXQgaGNmX2Nvbm5lY3QgeW91IG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlIGNvbm5lY3QgZnJvbSB0aGUgZGlzY29ubmVjdCBjYXNlLCB3aGljaCByZXF1aXJlcwotKglzb21lIGF0dGVudGlvbiBhYm91dCB3aGF0IHRvIHVzZSBhcyAiSS9PIiBhZGRyZXNzIHdoZW4gZm9yIHdoaWNoIHB1cnBvc2UuCi0qMjoKLSoyYTogUmVzZXQgSC1JSSBieSB0b2dnbGluZyByZXNldCBiaXQgaW4gSU8tcmVnaXN0ZXIgb24gYW5kIG9mZi4KLSoJVGhlIEhDRl9UWVBFX1BSRUxPQURFRCBjYXRlcnMgZm9yIHRoZSBET1MgZW52aXJvbm1lbnQgd2hlcmUgSC1JSSBpcyBsb2FkZWQgYnkgYSBzZXBhcmF0ZSBwcm9ncmFtIHRvCi0qCW92ZXJjb21lIHRoZSA2NGsgc2l6ZSBsaW1pdCBwb3NlZCBvbiBET1MgZHJpdmVycy4KLSoJVGhlIG1hY3JvIE9QVyBpcyBub3QgeWV0IHVzZWFibGUgYmVjYXVzZSB0aGUgSUZCX0lPQmFzZSBmaWVsZCBpcyBub3Qgc2V0LgotKglOb3RlIDE6IGhvcGVmdWxseSB0aGUgY2xlYXJpbmcgYW5kIGluaXRpYWxpemluZyBvZiB0aGUgSUZCIChzZWUgYmVsb3cpIGFjdHMgYXMgYSBkZWxheSB3aGljaCBtZWV0cyB0aGUKLSoJc3BlY2lmaWNhdGlvbiBmb3IgUy9XIHJlc2V0Ci0qCU5vdGUgMjogaXQgdHVybnMgb3V0IHRoYXQgb24gc29tZSBIL1cgY29uc3RlbGxhdGlvbnMsIHRoZSBjbG9jayB0byBhY2Nlc3MgdGhlIEVFUHJvbSBpcyBub3QgbG93ZXJlZAotKgl0byBhbiBhcHByb3ByaWF0ZSBmcmVxdWVuY3kgYnkgSFJFR19JT19TUkVTRVQuIEJ5IGdpdmluZyBhbiBIQ01EX0lOSSBmaXJzdCwgdGhpcyBwcm9ibGVtIGlzIHdvcmtlZCBhcm91bmQuCi0qMmI6IEV4cGVyaW1lbnRhbGx5IGl0IGlzIGRldGVybWluZWQgb3ZlciBhIHdpZGUgcmFuZ2Ugb2YgRi9XIHZlcnNpb25zIHRoYXQgd2FpdGluZyBmb3IgdGhlIGZvciBDbWQgYml0IGluCi0qCUV2IHJlZ2lzdGVyIGdpdmVzIGEgd29ya2FibGUgc3RyYXRlZ3kuIFRoZSBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiBkb2VzIG5vdCBnaXZlIG11Y2ggY2x1ZXMuCi0qNDoJY2xlYXIgYW5kIGluaXRpYWxpemUgdGhlIElGQgotKglUaGUgSENGIGhvdXNlIGtlZXBpbmcgaW5mbyBpcyBkZXNpZ25lZCBzdWNoIHRoYXQgemVybyBpcyB0aGUgYXBwcm9wcmlhdGUgaW5pdGlhbCB2YWx1ZSBmb3IgYXMgbXVjaCBhcwotKglmZWFzaWJsZSBJRkItaXRlbXMuCi0qCVRoZSByZWFkYWJsZSBmaWVsZHMgbWVudGlvbmVkIGluIHRoZSBkZXNjcmlwdGlvbiBzZWN0aW9uIGFuZCBzb21lIEhDRiBzcGVjaWZpYyBmaWVsZHMgYXJlIGdpdmVuIHRoZWlyCi0qCWFjdHVhbCB2YWx1ZS4KLSoJSUZCX1RpY2tJbmkgaXMgaW5pdGlhbGl6ZWQgYXQgYmVzdCBndWVzcyBiZWZvcmUgY2FsaWJyYXRpb24KLSoJSGNmX2Nvbm5lY3QgZGVmYXVsdHMgdG8gIm5vIGludGVycnVwdCBnZW5lcmF0aW9uIiAoaW1wbGljaXRseSBhY2hpZXZlZCBieSB0aGUgemVyby1maWxsaW5nKS4KLSo2OglSZWdpc3RlciBjb21waWxlLXRpbWUgbGlua2VkIE1TRiBSb3V0aW5lIGFuZCBzZXQgZGVmYXVsdCBmaWx0ZXIgbGV2ZWwKLSoJY2FzdCBuZWVkZWQgdG8gZ2V0IGFyb3VuZCB0aGUgIm5lYXIiIHByb2JsZW0gaW4gRE9TIENPTSBtb2RlbAotKgllciBDMjQ0Njogbm8gY29udmVyc2lvbiBmcm9tIHZvaWQgKF9fbmVhciBfX2NkZWNsICopKHVuc2lnbmVkIGNoYXIgX19mYXIgKix1bnNpZ25lZCBpbnQsdW5zaWduZWQgc2hvcnQsaW50KQotKgkJCQkJCQl0byAgIHZvaWQgKF9fZmFyICBfX2NkZWNsICopKHVuc2lnbmVkIGNoYXIgX19mYXIgKix1bnNpZ25lZCBpbnQsdW5zaWduZWQgc2hvcnQsaW50KQotKjg6CUlmIGEgY29tbWFuZCBpcyBhcHBhcmVudGx5IHN0aWxsIGFjdGl2ZSAoYXMgaW5kaWNhdGVkIGJ5IHRoZSBCdXN5IGJpdCBpbiBDbWQgcmVnaXN0ZXIpIHRoaXMgbWF5IGluZGljYXRlIGEKLSoJYmxvY2tlZCBjbWQgcGlwZSBsaW5lLiAgVG8gdW5ibG9jayB0aGUgZm9sbG93aW5nIGFjdGlvbnMgYXJlIGRvbmU6Ci0qCSAtIEFjayBldmVyeXRoaW5nCi0qCSAtIFdhaXQgZm9yIEJ1c3kgYml0IGRyb3AgIGluIENtZCByZWdpc3RlcgotKgkgLSBXYWl0IGZvciBDbWQgIGJpdCByYWlzZSBpbiBFdiAgcmVnaXN0ZXIKLSoJVGhlIHR3byB3YWl0cyBhcmUgY29tYmluZWQgaW4gYSBzaW5nbGUgSENGX1dBSVRfV0hJTEUgdG8gb3B0aW1pemUgbWVtb3J5IHNpemUuIElmIGVpdGhlciBvZiB0aGVzZSB3YWl0cwotKglmYWlsIChwcm90X2NudCBiZWNvbWVzIDApLCB0aGVuIHNvbWV0aGluZyBpcyBzZXJpb3VzIHdyb25nLiBSYXRoZXIgdGhhbiBQQU5JQ0ssIHRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlCi0qCW5leHQgY21kX2V4ZSB3aWxsIGZhaWwsIGNhdXNpbmcgdGhlIEhDRiB0byBnbyBpbnRvIERFRlVOQ1QgbW9kZQotKjEwOglBY2sgZXZlcnl0aGluZyB0byB1bmJsb2NrIGEgKHBvc3NpYmx5IGJsb2NrZWQpIGNtZCBwaXBlIGxpbmUKLSoJTm90ZSAxOiBpdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IGFuIEFsbG9jIGV2ZW50IGlzIHBlbmRpbmcgYW5kIHZlcnkgd2VsbCBwb3NzaWJsZSB0aGF0IGEgKFNlbmQpIENtZCBldmVudCBpcwotKglwZW5kaW5nIG9uIG5vbi1pbml0aWFsIGNhbGxzCi0qCU5vdGUgMjogaXQgaXMgYXNzdW1lZCB0aGF0IHRoaXMgc3RyYXRlZ3kgdGFrZXMgYXdheSB0aGUgbmVlZCB0byBhY2sgZXZlcnkgY29uY2VpdmFibGUgZXZlbnQgYWZ0ZXIgYW4KLSoJSGVybWVzIEluaXRpYWxpemUKLSoxMjoJT25seSBILUlJIE5FRURTIHRoZSBIZXJtZXMgSW5pdGlhbGl6ZSBjb21tYW5kLiBEdWUgdG8gdGhlIGRpZmZlcmVudCBzZW1hbnRpY3MgZm9yIEgtSSBhbmQgSC1JSQotKglJbml0aWFsaXplIGNvbW1hbmQsIGluaXQoKSBkb2VzIG5vdCAoYW5kIGNhbiBub3QsIHNpbmNlIGl0IGlzIGNhbGxlZCBlLmcuIGFmdGVyIGEgZG93bmxvYWQpIGV4ZWN1dGUgdGhlCi0qCUhlcm1lcyBJbml0aWFsaXplIGNvbW1hbmQuIEV4ZWN1dGluZyB0aGUgSGVybWVzIEluaXRpYWxpemUgY29tbWFuZCBmb3IgSC1JIHdvdWxkIG5vdCBoYXJtIGJ1dCBub3QgZG8KLSoJYW55dGhpbmcgdXNlZnVsIGVpdGhlciwgc28gaXQgaXMgc2tpcHBlZC4KLSoJVGhlIHJldHVybiBzdGF0dXMgb2YgY21kX2V4ZSBpcyBpZ25vcmVkLiBJdCBpcyBhc3N1bWVkIHRoYXQgaWYgY21kX2V4ZSBmYWlscywgaW5pdCBmYWlscyB0b28KLSoxNDoJdXNlIGlvX2Jhc2UgYXMgYSBmbGFnIHRvIG1lcmdlIGhjZl9jb25uZWN0IGFuZCBoY2ZfZGlzY29ubmVjdCBpbnRvIDEgcm91dGluZQotKgl0aGUgY2FsbCB0byBpbml0IGFuZCBpdHMgc3Vic2VxdWVudCBjYWxsIG9mIGNtZF9leGUgd2lsbCByZXR1cm4gSENGX0VSUl9OT19OSUMgaWYgYXBwcm9wcmlhdGUuIFRoaXMgc3RhdHVzCi0qCWlzIChiYWRseSkgbmVlZGVkIGJ5IHNvbWUgbGVnYWN5IGNvbWJpbmF0aW9uIG9mIE5UNCBhbmQgY2FyZCBzZXJ2aWNlcyB3aGljaCBkbyBub3QgeWllbGQgYW4gSS9PIGFkZHJlc3MgaW4KLSoJdGltZS4KLSoKLSouTk9USUNFCi0qCU9uIHBsYXRmb3JtcyB3aGVyZSB0aGUgTlVMTC1wb2ludGVyIGlzIG5vdCBhIGJpdC1wYXR0ZXJuIG9mIGFsbCB6ZXJvcywgdGhlIHplcm8tZmlsbGluZyBvZiB0aGUgSUZCIHJlc3VsdHMKLSoJaW4gYW4gaW5jb3JyZWN0IGluaXRpYWxpemF0aW9uIG9mIHBvaW50ZXJzLgotKglUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1haWxCb3ggbWFuaXB1bGF0aW9uIGluIHB1dF9tYl9pbmZvIHByb3RlY3RzIGFnYWluc3QgdGhlIGFic2VuY2Ugb2YgYSBNYWlsQm94Ci0qCWJhc2VkIG9uIElGQl9NQlNpemUsIElGQl9NQldwIGFuZCBpZmJwLT5JRkJfTUJScC4gVGhpcyBoYXMgcmFtaWZpY2F0aW9ucyBvbiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlCi0qCU1haWxCb3ggdmlhIGhjZl9wdXRfaW5mbyB3aXRoIHRoZSBDRkdfUkVHX01CIHR5cGUsIGJ1dCBpdCBwcmV2ZW50cyBkZXBlbmRlbmN5IG9uIHRoZSAiTlVMTC0ibmVzcyBvZgotKglJRkJfTUJwLgotKgotKi5OT1RJQ0UKLSoJVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHByb2JsZW1zIHdoZW4gYXNzZXJ0aW5nIGFuZCBsb2dnaW5nIGhjZl9jb25uZWN0LCBlLmcuCi0qCSAtIEFzc2VydGluZyBvbiByZS1lbnRyYW5jeSBvZiBoY2ZfY29ubmVjdCBieSBtZWFucyBvZgotKgkgIkhDRkFTU0VSVCggKGlmYnAtPklGQl9Bc3NlcnRUcmFjZSAmIEhDRl9BU1NFUlRfQ09OTkVDVCkgPT0gMCwgMCApIiBpcyBub3QgdXNlZnVsIGJlY2F1c2UgSUZCIGNvbnRlbnRzCi0qCSBhcmUgdW5kZWZpbmVkCi0qCSAtIEFzc2VydGluZyBiZWZvcmUgdGhlIElGQiBpcyBjbGVhcmVkIHdpbGwgY2F1c2UgbWRkX2Fzc2VydCgpIHRvIGludGVycHJldCB0aGUgZ2FyYmFnZSBpbiBJRkJfQXNzZXJ0UnRuCi0qCSBhcyBhIHJvdXRpbmUgYWRkcmVzcwotKglUaGVyZWZvcmUgSENGVFJBQ0Ugbm9yIEhDRkxPR0VOVFJZIGlzIGNhbGxlZCBieSBoY2ZfY29ubmVjdC4KLSouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKgorICouTU9EVUxFICAgICAgICBpbnQgaGNmX2Nvbm5lY3QoIElGQlAgaWZicCwgaGNmX2lvIGlvX2Jhc2UgKQorICouUFVSUE9TRSAgICAgICBHcmFudHMgYWNjZXNzIHJpZ2h0IGZvciB0aGUgSENGIHRvIHRoZSBJRkIuCisgKiAgICAgICAgICAgICAgIEluaXRpYWxpemVzIENhcmQgYW5kIEhDRiBob3VzZWtlZXBpbmcuCisgKgorICouQVJHVU1FTlRTCisgKiAgIGlmYnAgICAgICAgIChuZWFyKSBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyAqICAgaW9fYmFzZSAgICAgbm9uLVVTQjogSS9PIEJhc2UgYWRkcmVzcyBvZiB0aGUgTklDIChjb25uZWN0KQorICogICAgICAgICAgICAgICBub24tVVNCOiBIQ0ZfRElTQ09OTkVDVAorICogICAgICAgICAgICAgICBVU0I6ICAgICBIQ0ZfQ09OTkVDVCwgSENGX0RJU0NPTk5FQ1QKKyAqCisgKi5SRVRVUk5TCisgKiAgIEhDRl9TVUNDRVNTCisgKiAgIEhDRl9FUlJfSU5DT01QX1BSSQorICogICBIQ0ZfRVJSX0lOQ09NUF9GVworICogICBIQ0ZfRVJSX0RFRlVOQ1RfQ01EX1NFUQorICohISBIQ0ZfRVJSX05PX05JQyByZWFsbHkgcmV0dXJuZWQgOz8KKyAqICAgSENGX0VSUl9OT19OSUMKKyAqICAgSENGX0VSUl9USU1FX09VVAorICoKKyAqICAgTVNGLWFjY2Vzc2libGUgZmllbGRzIG9mIFJlc3VsdCBCbG9jazoKKyAqICAgSUZCX0lPQmFzZSAgICAgICAgICAgICAgZW50cnkgcGFyYW1ldGVyIGlvX2Jhc2UKKyAqICAgSUZCX0lPUmFuZ2UgICAgICAgICAgICAgSFJFR19JT19SQU5HRSAoMHg0MC8weDgwKQorICogICBJRkJfVmVyc2lvbiAgICAgICAgICAgICB2ZXJzaW9uIG9mIHRoZSBJRkIgbGF5b3V0CisgKiAgIElGQl9GV0lkZW50aXR5ICAgICAgICAgIENGR19GV19JREVOVElUWV9TVFJDVCwgc3BlY2lmaWVzIHRoZSBpZGVudGl0eSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ1bm5pbmciIEYvVywgaS5lLiB0ZXJ0aWFyeSBGL1cgdW5kZXIgbm9ybWFsIGNvbmRpdGlvbnMKKyAqICAgSUZCX0ZXU3VwICAgICAgICAgICAgICAgQ0ZHX1NVUF9SQU5HRV9TVFJDVCwgc3BlY2lmaWVzIHRoZSBzdXBwbGllciByYW5nZSBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgInJ1bm5pbmciIEYvVywgaS5lLiB0ZXJ0aWFyeSBGL1cgdW5kZXIgbm9ybWFsIGNvbmRpdGlvbnMKKyAqICAgSUZCX0hTSVN1cCAgICAgICAgICAgICAgQ0ZHX1NVUF9SQU5HRV9TVFJDVCwgc3BlY2lmaWVzIHRoZSBIVy9TVyBJL0YgcmFuZ2Ugb2YgdGhlIE5JQworICogICBJRkJfUFJJSWRlbnRpdHkgICAgICAgICBDRkdfUFJJX0lERU5USVRZX1NUUkNULCBzcGVjaWZpZXMgdGhlIElkZW50aXR5IG9mIHRoZSBQcmltYXJ5IEYvVworICogICBJRkJfUFJJU3VwICAgICAgICAgICAgICBDRkdfU1VQX1JBTkdFX1NUUkNULCBzcGVjaWZpZXMgdGhlIHN1cHBsaWVyIHJhbmdlIG9mIHRoZSBQcmltYXJ5IEYvVworICogICBhbGwgb3RoZXIgICAgICAgICAgICAgICBhbGwgTVNGIGFjY2Vzc2libGUgZmllbGRzLCB3aGljaCBhcmUgbm90IHNwZWNpZmllZCBhYm92ZSwgYXJlIHplcm8tZmlsbGVkCisgKgorICouQ09ORElUSU9OUworICogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBNU0YgdG8gYXNzdXJlIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgSS9PIEJhc2UgYWRkcmVzcy4KKyAqCisgKiBOb3RlOiBoY2ZfY29ubmVjdCBkZWZhdWx0cyB0byBOSUMgaW50ZXJydXB0IGRpc2FibGVkIG1vZGUsIGkuZS4gYXMgaWYgaGNmX2FjdGlvbiggSENGX0FDVF9JTlRfT0ZGICkKKyAqIHdhcyBjYWxsZWQuCisgKgorICouREVTQ1JJUFRJT04KKyAqIGhjZl9jb25uZWN0IHBhc3NlcyB0aGUgTVNGLWRlZmluZWQgbG9jYXRpb24gb2YgdGhlIElGQiB0byB0aGUgSENGIGFuZCBncmFudHMgb3IgcmV2b2tlcyBhY2Nlc3MgcmlnaHQgZm9yIHRoZQorICogSENGIHRvIHRoZSBJRkIuIFJldm9raW5nIGlzIGRvbmUgYnkgc3BlY2lmeWluZyBIQ0ZfRElTQ09OTkVDVCByYXRoZXIgdGhhbiBhbiBJL08gYWRkcmVzcyBmb3IgdGhlIHBhcmFtZXRlcgorICogaW9fYmFzZS4gIEV2ZXJ5IGNhbGwgb2YgaGNmX2Nvbm5lY3QgaW4gImNvbm5lY3QiIG1vZGUsIG11c3QgZXZlbnR1YWxseSBiZSBmb2xsb3dlZCBieSBhIGNhbGwgb2YgaGNmX2Nvbm5lY3QKKyAqIGluICJkaXNjb25uZWN0IiBtb2RlLiBDbGFsbGluZyBoY2ZfY29ubmVjdCBpbiAiY29ubmVjdCIvImRpc2Nvbm5lY3QiIG1vZGUgY2FuIG5vdCBiZSBuZXN0ZWQuCisgKiBUaGUgSUZCIGFkZHJlc3MgbXVzdCBiZSB1c2VkIGFzIGEgaGFuZGxlIHdpdGggYWxsIHN1YnNlcXVlbnQgSENGLWZ1bmN0aW9uIGNhbGxzIGFuZCB0aGUgSENGIHVzZXMgdGhlIElGQgorICogYWRkcmVzcyBhcyBhIGhhbmRsZSB3aGVuIGl0IHBlcmZvcm1zIGEgY2FsbChiYWNrKSBvZiBhbiBNU0YtZnVuY3Rpb24gKGkuZS4gbXNmX2Fzc2VydCkuCisgKgorICogTm90ZSB0aGF0IG5vdCBvbmx5IHRoZSBNU0YgYWNjZXNzaWJsZSBmaWVsZHMgYXJlIGNsZWFyZWQsIGJ1dCBhbHNvIGFsbCBpbnRlcm5hbCBob3VzZWtlZXBpbmcKKyAqIGluZm9ybWF0aW9uIGlzIHJlLWluaXRpYWxpemVkLgorICogVGhpcyBpbXBsaWVzIHRoYXQgYWxsIHNldHRpbmdzIHdoaWNoIGFyZSBkb25lIHZpYSBoY2ZfYWN0aW9uIGFuZCBoY2ZfcHV0X2luZm8gKGUuZy4gQ0ZHX01CX0FTU0VSVCwgQ0ZHX1JFR19NQiwKKyAqIENGR19SRUdfSU5GT19MT0cpIG11c3QgYmUgZG9uZSBhZ2Fpbi4gVGhlIG9ubHkgZmllbGQgd2hpY2ggaXMgbm90IGNsZWFyZWQsIGlzIElGQl9NU0ZTdXAuCisgKgorICogSWYgSENGX0lOVF9PTiBpcyBzZWxlY3RlZCBhcyBjb21waWxlIG9wdGlvbiwgTklDIGludGVycnVwdHMgYXJlIGRpc2FibGVkLgorICoKKyAqIEFzc2VydCBmYWlscyBpZgorICogLSBpZmJwIGlzIG5vdCBwcm9wZXJseSBhbGlnbmVkICggcmVmIGNoYXB0ZXIgSENGX0FMSUdOIGluIDQuMS4xKQorICogLSBJL08gQmFzZSBBZGRyZXNzIGlzIG5vdCBhIG11bHRpcGxlIG9mIDB4NDAgKG5vdGU6IDB4MDAwMCBpcyBleHBsaWNpdGx5IGFsbG93ZWQpLgorICoKKyAqLkRJQUdSQU0KKyAqCisgKjA6IFRocm91Z2hvdXQgaGNmX2Nvbm5lY3QgeW91IG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlIGNvbm5lY3QgZnJvbSB0aGUgZGlzY29ubmVjdCBjYXNlLCB3aGljaCByZXF1aXJlcworICogICBzb21lIGF0dGVudGlvbiBhYm91dCB3aGF0IHRvIHVzZSBhcyAiSS9PIiBhZGRyZXNzIHdoZW4gZm9yIHdoaWNoIHB1cnBvc2UuCisgKjI6CisgKjJhOiBSZXNldCBILUlJIGJ5IHRvZ2dsaW5nIHJlc2V0IGJpdCBpbiBJTy1yZWdpc3RlciBvbiBhbmQgb2ZmLgorICogICBUaGUgSENGX1RZUEVfUFJFTE9BREVEIGNhdGVycyBmb3IgdGhlIERPUyBlbnZpcm9ubWVudCB3aGVyZSBILUlJIGlzIGxvYWRlZCBieSBhIHNlcGFyYXRlIHByb2dyYW0gdG8KKyAqICAgb3ZlcmNvbWUgdGhlIDY0ayBzaXplIGxpbWl0IHBvc2VkIG9uIERPUyBkcml2ZXJzLgorICogICBUaGUgbWFjcm8gT1BXIGlzIG5vdCB5ZXQgdXNlYWJsZSBiZWNhdXNlIHRoZSBJRkJfSU9CYXNlIGZpZWxkIGlzIG5vdCBzZXQuCisgKiAgIE5vdGUgMTogaG9wZWZ1bGx5IHRoZSBjbGVhcmluZyBhbmQgaW5pdGlhbGl6aW5nIG9mIHRoZSBJRkIgKHNlZSBiZWxvdykgYWN0cyBhcyBhIGRlbGF5IHdoaWNoIG1lZXRzIHRoZQorICogICBzcGVjaWZpY2F0aW9uIGZvciBTL1cgcmVzZXQKKyAqICAgTm90ZSAyOiBpdCB0dXJucyBvdXQgdGhhdCBvbiBzb21lIEgvVyBjb25zdGVsbGF0aW9ucywgdGhlIGNsb2NrIHRvIGFjY2VzcyB0aGUgRUVQcm9tIGlzIG5vdCBsb3dlcmVkCisgKiAgIHRvIGFuIGFwcHJvcHJpYXRlIGZyZXF1ZW5jeSBieSBIUkVHX0lPX1NSRVNFVC4gQnkgZ2l2aW5nIGFuIEhDTURfSU5JIGZpcnN0LCB0aGlzIHByb2JsZW0gaXMgd29ya2VkIGFyb3VuZC4KKyAqMmI6IEV4cGVyaW1lbnRhbGx5IGl0IGlzIGRldGVybWluZWQgb3ZlciBhIHdpZGUgcmFuZ2Ugb2YgRi9XIHZlcnNpb25zIHRoYXQgd2FpdGluZyBmb3IgdGhlIGZvciBDbWQgYml0IGluCisgKiAgIEV2IHJlZ2lzdGVyIGdpdmVzIGEgd29ya2FibGUgc3RyYXRlZ3kuIFRoZSBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiBkb2VzIG5vdCBnaXZlIG11Y2ggY2x1ZXMuCisgKjQ6IGNsZWFyIGFuZCBpbml0aWFsaXplIHRoZSBJRkIKKyAqICAgVGhlIEhDRiBob3VzZSBrZWVwaW5nIGluZm8gaXMgZGVzaWduZWQgc3VjaCB0aGF0IHplcm8gaXMgdGhlIGFwcHJvcHJpYXRlIGluaXRpYWwgdmFsdWUgZm9yIGFzIG11Y2ggYXMKKyAqICAgZmVhc2libGUgSUZCLWl0ZW1zLgorICogICBUaGUgcmVhZGFibGUgZmllbGRzIG1lbnRpb25lZCBpbiB0aGUgZGVzY3JpcHRpb24gc2VjdGlvbiBhbmQgc29tZSBIQ0Ygc3BlY2lmaWMgZmllbGRzIGFyZSBnaXZlbiB0aGVpcgorICogICBhY3R1YWwgdmFsdWUuCisgKiAgIElGQl9UaWNrSW5pIGlzIGluaXRpYWxpemVkIGF0IGJlc3QgZ3Vlc3MgYmVmb3JlIGNhbGlicmF0aW9uCisgKiAgIEhjZl9jb25uZWN0IGRlZmF1bHRzIHRvICJubyBpbnRlcnJ1cHQgZ2VuZXJhdGlvbiIgKGltcGxpY2l0bHkgYWNoaWV2ZWQgYnkgdGhlIHplcm8tZmlsbGluZykuCisgKjY6IFJlZ2lzdGVyIGNvbXBpbGUtdGltZSBsaW5rZWQgTVNGIFJvdXRpbmUgYW5kIHNldCBkZWZhdWx0IGZpbHRlciBsZXZlbAorICogICBjYXN0IG5lZWRlZCB0byBnZXQgYXJvdW5kIHRoZSAibmVhciIgcHJvYmxlbSBpbiBET1MgQ09NIG1vZGVsCisgKiAgIGVyIEMyNDQ2OiBubyBjb252ZXJzaW9uIGZyb20gdm9pZCAoX19uZWFyIF9fY2RlY2wgKikodW5zaWduZWQgY2hhciBfX2ZhciAqLHVuc2lnbmVkIGludCx1bnNpZ25lZCBzaG9ydCxpbnQpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvICAgdm9pZCAoX19mYXIgIF9fY2RlY2wgKikodW5zaWduZWQgY2hhciBfX2ZhciAqLHVuc2lnbmVkIGludCx1bnNpZ25lZCBzaG9ydCxpbnQpCisgKjg6IElmIGEgY29tbWFuZCBpcyBhcHBhcmVudGx5IHN0aWxsIGFjdGl2ZSAoYXMgaW5kaWNhdGVkIGJ5IHRoZSBCdXN5IGJpdCBpbiBDbWQgcmVnaXN0ZXIpIHRoaXMgbWF5IGluZGljYXRlIGEKKyAqICAgYmxvY2tlZCBjbWQgcGlwZSBsaW5lLiAgVG8gdW5ibG9jayB0aGUgZm9sbG93aW5nIGFjdGlvbnMgYXJlIGRvbmU6CisgKiAgICAtIEFjayBldmVyeXRoaW5nCisgKiAgICAtIFdhaXQgZm9yIEJ1c3kgYml0IGRyb3AgIGluIENtZCByZWdpc3RlcgorICogICAgLSBXYWl0IGZvciBDbWQgIGJpdCByYWlzZSBpbiBFdiAgcmVnaXN0ZXIKKyAqICAgVGhlIHR3byB3YWl0cyBhcmUgY29tYmluZWQgaW4gYSBzaW5nbGUgSENGX1dBSVRfV0hJTEUgdG8gb3B0aW1pemUgbWVtb3J5IHNpemUuIElmIGVpdGhlciBvZiB0aGVzZSB3YWl0cworICogICBmYWlsIChwcm90X2NudCBiZWNvbWVzIDApLCB0aGVuIHNvbWV0aGluZyBpcyBzZXJpb3VzIHdyb25nLiBSYXRoZXIgdGhhbiBQQU5JQ0ssIHRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlCisgKiAgIG5leHQgY21kX2V4ZSB3aWxsIGZhaWwsIGNhdXNpbmcgdGhlIEhDRiB0byBnbyBpbnRvIERFRlVOQ1QgbW9kZQorICoxMDogICAgQWNrIGV2ZXJ5dGhpbmcgdG8gdW5ibG9jayBhIChwb3NzaWJseSBibG9ja2VkKSBjbWQgcGlwZSBsaW5lCisgKiAgIE5vdGUgMTogaXQgaXMgdmVyeSBsaWtlbHkgdGhhdCBhbiBBbGxvYyBldmVudCBpcyBwZW5kaW5nIGFuZCB2ZXJ5IHdlbGwgcG9zc2libGUgdGhhdCBhIChTZW5kKSBDbWQgZXZlbnQgaXMKKyAqICAgcGVuZGluZyBvbiBub24taW5pdGlhbCBjYWxscworICogICBOb3RlIDI6IGl0IGlzIGFzc3VtZWQgdGhhdCB0aGlzIHN0cmF0ZWd5IHRha2VzIGF3YXkgdGhlIG5lZWQgdG8gYWNrIGV2ZXJ5IGNvbmNlaXZhYmxlIGV2ZW50IGFmdGVyIGFuCisgKiAgIEhlcm1lcyBJbml0aWFsaXplCisgKjEyOiAgICBPbmx5IEgtSUkgTkVFRFMgdGhlIEhlcm1lcyBJbml0aWFsaXplIGNvbW1hbmQuIER1ZSB0byB0aGUgZGlmZmVyZW50IHNlbWFudGljcyBmb3IgSC1JIGFuZCBILUlJCisgKiAgIEluaXRpYWxpemUgY29tbWFuZCwgaW5pdCgpIGRvZXMgbm90IChhbmQgY2FuIG5vdCwgc2luY2UgaXQgaXMgY2FsbGVkIGUuZy4gYWZ0ZXIgYSBkb3dubG9hZCkgZXhlY3V0ZSB0aGUKKyAqICAgSGVybWVzIEluaXRpYWxpemUgY29tbWFuZC4gRXhlY3V0aW5nIHRoZSBIZXJtZXMgSW5pdGlhbGl6ZSBjb21tYW5kIGZvciBILUkgd291bGQgbm90IGhhcm0gYnV0IG5vdCBkbworICogICBhbnl0aGluZyB1c2VmdWwgZWl0aGVyLCBzbyBpdCBpcyBza2lwcGVkLgorICogICBUaGUgcmV0dXJuIHN0YXR1cyBvZiBjbWRfZXhlIGlzIGlnbm9yZWQuIEl0IGlzIGFzc3VtZWQgdGhhdCBpZiBjbWRfZXhlIGZhaWxzLCBpbml0IGZhaWxzIHRvbworICoxNDogICAgdXNlIGlvX2Jhc2UgYXMgYSBmbGFnIHRvIG1lcmdlIGhjZl9jb25uZWN0IGFuZCBoY2ZfZGlzY29ubmVjdCBpbnRvIDEgcm91dGluZQorICogICB0aGUgY2FsbCB0byBpbml0IGFuZCBpdHMgc3Vic2VxdWVudCBjYWxsIG9mIGNtZF9leGUgd2lsbCByZXR1cm4gSENGX0VSUl9OT19OSUMgaWYgYXBwcm9wcmlhdGUuIFRoaXMgc3RhdHVzCisgKiAgIGlzIChiYWRseSkgbmVlZGVkIGJ5IHNvbWUgbGVnYWN5IGNvbWJpbmF0aW9uIG9mIE5UNCBhbmQgY2FyZCBzZXJ2aWNlcyB3aGljaCBkbyBub3QgeWllbGQgYW4gSS9PIGFkZHJlc3MgaW4KKyAqICAgdGltZS4KKyAqCisgKi5OT1RJQ0UKKyAqICAgT24gcGxhdGZvcm1zIHdoZXJlIHRoZSBOVUxMLXBvaW50ZXIgaXMgbm90IGEgYml0LXBhdHRlcm4gb2YgYWxsIHplcm9zLCB0aGUgemVyby1maWxsaW5nIG9mIHRoZSBJRkIgcmVzdWx0cworICogICBpbiBhbiBpbmNvcnJlY3QgaW5pdGlhbGl6YXRpb24gb2YgcG9pbnRlcnMuCisgKiAgIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTWFpbEJveCBtYW5pcHVsYXRpb24gaW4gcHV0X21iX2luZm8gcHJvdGVjdHMgYWdhaW5zdCB0aGUgYWJzZW5jZSBvZiBhIE1haWxCb3gKKyAqICAgYmFzZWQgb24gSUZCX01CU2l6ZSwgSUZCX01CV3AgYW5kIGlmYnAtPklGQl9NQlJwLiBUaGlzIGhhcyByYW1pZmljYXRpb25zIG9uIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUKKyAqICAgTWFpbEJveCB2aWEgaGNmX3B1dF9pbmZvIHdpdGggdGhlIENGR19SRUdfTUIgdHlwZSwgYnV0IGl0IHByZXZlbnRzIGRlcGVuZGVuY3kgb24gdGhlICJOVUxMLSJuZXNzIG9mCisgKiAgIElGQl9NQnAuCisgKgorICouTk9USUNFCisgKiAgIFRoZXJlIGFyZSBhIG51bWJlciBvZiBwcm9ibGVtcyB3aGVuIGFzc2VydGluZyBhbmQgbG9nZ2luZyBoY2ZfY29ubmVjdCwgZS5nLgorICogICAgLSBBc3NlcnRpbmcgb24gcmUtZW50cmFuY3kgb2YgaGNmX2Nvbm5lY3QgYnkgbWVhbnMgb2YKKyAqICAgICJIQ0ZBU1NFUlQoIChpZmJwLT5JRkJfQXNzZXJ0VHJhY2UgJiBIQ0ZfQVNTRVJUX0NPTk5FQ1QpID09IDAsIDAgKSIgaXMgbm90IHVzZWZ1bCBiZWNhdXNlIElGQiBjb250ZW50cworICogICAgYXJlIHVuZGVmaW5lZAorICogICAgLSBBc3NlcnRpbmcgYmVmb3JlIHRoZSBJRkIgaXMgY2xlYXJlZCB3aWxsIGNhdXNlIG1kZF9hc3NlcnQoKSB0byBpbnRlcnByZXQgdGhlIGdhcmJhZ2UgaW4gSUZCX0Fzc2VydFJ0bgorICogICAgYXMgYSByb3V0aW5lIGFkZHJlc3MKKyAqICAgVGhlcmVmb3JlIEhDRlRSQUNFIG5vciBIQ0ZMT0dFTlRSWSBpcyBjYWxsZWQgYnkgaGNmX2Nvbm5lY3QuCisgKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogaW50CiBoY2ZfY29ubmVjdCggSUZCUCBpZmJwLCBoY2ZfaW8gaW9fYmFzZSApCiB7Ci1pbnQJCQlyYyA9IEhDRl9TVUNDRVNTOwotaGNmX2lvCQlpb19hZGRyOwotaGNmXzMyCQlwcm90X2NudDsKLWhjZl84CQkqcTsKLUxUVl9TVFJDVAl4OworCWludCAgICAgICAgIHJjID0gSENGX1NVQ0NFU1M7CisJaGNmX2lvICAgICAgaW9fYWRkcjsKKwloY2ZfMzIgICAgICBwcm90X2NudDsKKwloY2ZfOCAgICAgICAqcTsKKwlMVFZfU1RSQ1QgICB4OwogI2lmIEhDRl9BU1NFUlQKIAloY2ZfMTYgeGEgPSBpZmJwLT5JRkJfRldJZGVudGl0eS50eXA7CiAJLyogaXMgYXNzdW1lZCB0byBjYXVzZSBhbiBhc3NlcnQgbGF0ZXIgb24gaWYgaGNmX2Nvbm5lY3QgaXMgY2FsbGVkIHdpdGhvdXQgaW50ZXJ2ZW5pbmcgaGNmX2Rpc2Nvbm5lY3QuCkBAIC0xMTYzLDUxICsxMTI5LDUxIEBACiAJICovCiAjZW5kaWYgLy8gSENGX0FTU0VSVAogCi0JaWYgKCBpb19iYXNlID09IEhDRl9ESVNDT05ORUNUICkgewkJCQkJLy9kaXNjb25uZWN0CisJaWYgKCBpb19iYXNlID09IEhDRl9ESVNDT05ORUNUICkgeyAgICAgICAgICAgICAgICAgIC8vZGlzY29ubmVjdAogCQlpb19hZGRyID0gaWZicC0+SUZCX0lPQmFzZTsKLQkJT1BXKCBIUkVHX0lOVF9FTiwgMCApOwkJLy87P3dvcmthcm91bmQgYWdhaW5zdCBkeWluZyBGL1cgb24gc3Vic2VxdWVudCBoY2ZfY29ubmVjdCBjYWxscwotCX0gZWxzZSB7CQkJCQkJCQkJCQkvL2Nvbm5lY3QJCQkJCQkJCS8qIDAgKi8KKwkJT1BXKCBIUkVHX0lOVF9FTiwgMCApOyAgICAgIC8vOz93b3JrYXJvdW5kIGFnYWluc3QgZHlpbmcgRi9XIG9uIHN1YnNlcXVlbnQgaGNmX2Nvbm5lY3QgY2FsbHMKKwl9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25uZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAgKi8KIAkJaW9fYWRkciA9IGlvX2Jhc2U7CiAJfQogCiAjaWYgMCAvLzs/IGlmIGEgc3Vic2VxdWVudCBoY2ZfY29ubmVjdCBpcyBwcmVjZWRlZCBieSBhbiBoY2ZfZGlzY29ubmVjdCB0aGUgd2FrZXVwIGlzIG5vdCBuZWVkZWQgISEKICNpZiBIQ0ZfU0xFRVAKLSAgICBPVVRfUE9SVF9XT1JEKCAuLi4uLitIUkVHX0lPLCBIUkVHX0lPX1dBS0VVUF9BU1lOQyApOyAJICAgIC8vT1BXIG5vdCB5ZXQgdXNlYWJsZQotCU1TRl9XQUlUKDgwMCk7CQkJCQkJCQkvLyBNU0YtZGVmaW5lZCBmdW5jdGlvbiB0byB3YWl0IG4gbWljcm9zZWNvbmRzLgorCU9VVF9QT1JUX1dPUkQoIC4uLi4uK0hSRUdfSU8sIEhSRUdfSU9fV0FLRVVQX0FTWU5DICk7ICAgICAgIC8vT1BXIG5vdCB5ZXQgdXNlYWJsZQorCU1TRl9XQUlUKDgwMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTVNGLWRlZmluZWQgZnVuY3Rpb24gdG8gd2FpdCBuIG1pY3Jvc2Vjb25kcy4KIAlub3RlIHRoYXQgTVNGX1dBSVQgdXNlcyBub3QgeWV0IGRlZmluZWQhISEhIElGQl9JT0Jhc2UgYW5kIElGQl9UaWNrSW5pICh2aWEgUFJPVF9DTlRfSU5JKQogCXNvIGJlIGNhcmVmdWwgaWYgdGhpcyBjb2RlIGlzIHJlc3RvcmVkCiAjZW5kaWYgLy8gSENGX1NMRUVQCiAjZW5kaWYgLy8gMAogCi0jaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfUFJFTE9BREVEICkgPT0gMAkvL3N3aXRjaCBjbG9jayBiYWNrIGZvciBTRUVQUk9NIGFjY2VzcyAgISEhCi0JT1VUX1BPUlRfV09SRCggaW9fYWRkciArIEhSRUdfQ01ELCBIQ01EX0lOSSApOyAgCSAgICAvL09QVyBub3QgeWV0IHVzZWFibGUKKyNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9QUkVMT0FERUQgKSA9PSAwICAgIC8vc3dpdGNoIGNsb2NrIGJhY2sgZm9yIFNFRVBST00gYWNjZXNzICAhISEKKwlPVVRfUE9SVF9XT1JEKCBpb19hZGRyICsgSFJFR19DTUQsIEhDTURfSU5JICk7ICAgICAgICAgIC8vT1BXIG5vdCB5ZXQgdXNlYWJsZQogCXByb3RfY250ID0gSU5JX1RJQ0tfSU5JOwogCUhDRl9XQUlUX1dISUxFKCAoSU5fUE9SVF9XT1JEKCBpb19hZGRyICsgIEhSRUdfRVZfU1RBVCkgJiBIUkVHX0VWX0NNRCkgPT0gMCApOwotCU9VVF9QT1JUX1dPUkQoIChpb19hZGRyICsgSFJFR19JTyksIEhSRUdfSU9fU1JFU0VUICk7CS8vT1BXIG5vdCB5ZXQgdXNlYWJsZQkJCQkJLyogMmEqLworCU9VVF9QT1JUX1dPUkQoIChpb19hZGRyICsgSFJFR19JTyksIEhSRUdfSU9fU1JFU0VUICk7ICAgLy9PUFcgbm90IHlldCB1c2VhYmxlICAgICAgICAgICAgICAgICAgIC8qIDJhKi8KICNlbmRpZiAvLyBIQ0ZfVFlQRV9QUkVMT0FERUQKLQlmb3IgKCBxID0gKGhjZl84KikoJmlmYnAtPklGQl9NYWdpYyk7IHEgPiAoaGNmXzgqKWlmYnA7ICotLXEgPSAwICkgLypOT1AqLzsJCQkJCQkvKiA0ICovCi0JaWZicC0+SUZCX01hZ2ljCQk9IEhDRl9NQUdJQzsKLQlpZmJwLT5JRkJfVmVyc2lvbgk9IElGQl9WRVJTSU9OOworCWZvciAoIHEgPSAoaGNmXzgqKSgmaWZicC0+SUZCX01hZ2ljKTsgcSA+IChoY2ZfOCopaWZicDsgKi0tcSA9IDAgKSAvKk5PUCovOyAgICAgICAgICAgICAgICAgICAgIC8qIDQgKi8KKwlpZmJwLT5JRkJfTWFnaWMgICAgID0gSENGX01BR0lDOworCWlmYnAtPklGQl9WZXJzaW9uICAgPSBJRkJfVkVSU0lPTjsKICNpZiBkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQgLy9hIG5ldyBJRkIgZGVtb25zdHJhdGVzIGhvdyBkaXJ0eSB0aGUgc29sdXRpb24gaXMKLQl4eHh4W3h4eHhfUFJJX0lERU5USVRZX09GRlNFVF0gPSBOVUxMOwkJLy9JRkJfUFJJSWRlbnRpdHkgcGxhY2Vob2xkZXIJMHhGRDAyCi0JeHh4eFt4eHh4X1BSSV9JREVOVElUWV9PRkZTRVQrMV0gPSBOVUxMOwkvL0lGQl9QUklTdXAgcGxhY2Vob2xkZXIJCTB4RkQwMworCXh4eHhbeHh4eF9QUklfSURFTlRJVFlfT0ZGU0VUXSA9IE5VTEw7ICAgICAgLy9JRkJfUFJJSWRlbnRpdHkgcGxhY2Vob2xkZXIgICAweEZEMDIKKwl4eHh4W3h4eHhfUFJJX0lERU5USVRZX09GRlNFVCsxXSA9IE5VTEw7ICAgIC8vSUZCX1BSSVN1cCBwbGFjZWhvbGRlciAgICAgICAgMHhGRDAzCiAjZW5kaWYgLy8gTVNGX0NPTVBPTkVOVF9JRAogI2lmIChIQ0ZfVEFMTElFUykgJiAoIEhDRl9UQUxMSUVTX05JQyB8IEhDRl9UQUxMSUVTX0hDRiApCi0JaWZicC0+SUZCX1RhbGx5TGVuID0gMSArIDIgKiAoSENGX05JQ19UQUxfQ05UICsgSENGX0hDRl9UQUxfQ05UKTsJLy9jb252ZXJ0ICMgb2YgVGFsbGllcyB0byBMIHZhbHVlIGZvciBMVFYKLQlpZmJwLT5JRkJfVGFsbHlUeXAgPSBDRkdfVEFMTElFUzsJCQkvL0lGQl9UYWxseVR5cDogc2V0IFQgdmFsdWUKKwlpZmJwLT5JRkJfVGFsbHlMZW4gPSAxICsgMiAqIChIQ0ZfTklDX1RBTF9DTlQgKyBIQ0ZfSENGX1RBTF9DTlQpOyAgIC8vY29udmVydCAjIG9mIFRhbGxpZXMgdG8gTCB2YWx1ZSBmb3IgTFRWCisJaWZicC0+SUZCX1RhbGx5VHlwID0gQ0ZHX1RBTExJRVM7ICAgICAgICAgICAvL0lGQl9UYWxseVR5cDogc2V0IFQgdmFsdWUKICNlbmRpZiAvLyBIQ0ZfVEFMTElFU19OSUMgLyBIQ0ZfVEFMTElFU19IQ0YKLQlpZmJwLT5JRkJfSU9CYXNlCT0gaW9fYWRkcjsJCQkJLy9zZXQgSU9fQmFzZSBhc2FwLCBzbyBhc3NlcnRzIHZpYSBIUkVHX1NXXzIgZG9uJ3QgaGFybQotCWlmYnAtPklGQl9JT1JhbmdlCT0gSFJFR19JT19SQU5HRTsKLQlpZmJwLT5JRkJfQ250bE9wdAk9IFVTRV8xNkJJVDsKKwlpZmJwLT5JRkJfSU9CYXNlICAgID0gaW9fYWRkcjsgICAgICAgICAgICAgIC8vc2V0IElPX0Jhc2UgYXNhcCwgc28gYXNzZXJ0cyB2aWEgSFJFR19TV18yIGRvbid0IGhhcm0KKwlpZmJwLT5JRkJfSU9SYW5nZSAgID0gSFJFR19JT19SQU5HRTsKKwlpZmJwLT5JRkJfQ250bE9wdCAgID0gVVNFXzE2QklUOwogI2lmIEhDRl9BU1NFUlQKIAlhc3NlcnRfaWZicCA9IGlmYnA7CiAJaWZicC0+SUZCX0Fzc2VydEx2bCA9IDE7CiAjaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9MTktfTVNGX1JUTgogCWlmICggaW9fYmFzZSAhPSBIQ0ZfRElTQ09OTkVDVCApIHsKLQkJaWZicC0+SUZCX0Fzc2VydFJ0biA9IChNU0ZfQVNTRVJUX1JUTlApbXNmX2Fzc2VydDsJCQkJCQkJCQkJCS8qIDYgKi8KKwkJaWZicC0+SUZCX0Fzc2VydFJ0biA9IChNU0ZfQVNTRVJUX1JUTlApbXNmX2Fzc2VydDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2ICovCiAJfQogI2VuZGlmIC8vIEhDRl9BU1NFUlRfTE5LX01TRl9SVE4KLSNpZiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX01CCQkJCS8vYnVpbGQgdGhlIHN0cnVjdHVyZSB0byBwYXNzIHRoZSBhc3NlcnQgaW5mbyB0byBoY2ZfcHV0X2luZm8KKyNpZiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX01CICAgICAgICAgICAgICAgIC8vYnVpbGQgdGhlIHN0cnVjdHVyZSB0byBwYXNzIHRoZSBhc3NlcnQgaW5mbyB0byBoY2ZfcHV0X2luZm8KIAlpZmJwLT5JRkJfQXNzZXJ0U3RyY3QubGVuID0gc2l6ZW9mKGlmYnAtPklGQl9Bc3NlcnRTdHJjdCkvc2l6ZW9mKGhjZl8xNikgLSAxOwogCWlmYnAtPklGQl9Bc3NlcnRTdHJjdC50eXAgPSBDRkdfTUJfSU5GTzsKIAlpZmJwLT5JRkJfQXNzZXJ0U3RyY3QuYmFzZV90eXAgPSBDRkdfTUJfQVNTRVJUOwpAQCAtMTIxNywzNCArMTE4MywzNCBAQAogCWlmYnAtPklGQl9Bc3NlcnRTdHJjdC5mcmFnX2J1ZlswXS5mcmFnX2FkZHIgPSAmaWZicC0+SUZCX0Fzc2VydExpbmU7CiAjZW5kaWYgLy8gSENGX0FTU0VSVF9NQgogI2VuZGlmIC8vIEhDRl9BU1NFUlQKLQlJRl9QUk9UX1RJTUUoIHByb3RfY250ID0gaWZicC0+SUZCX1RpY2tJbmkgPSBJTklfVElDS19JTkk7ICkKKwlJRl9QUk9UX1RJTUUoIHByb3RfY250ID0gaWZicC0+SUZCX1RpY2tJbmkgPSBJTklfVElDS19JTkkgKTsKICNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9QUkVMT0FERUQgKSA9PSAwCiAJLy8hISBObyBhc3NlcnRzIGJlZm9yZSBSZXNldC1iaXQgaW4gSFJFR19JTyBpcyBjbGVhcmVkCi0JT1BXKCBIUkVHX0lPLCAweDAwMDAgKTsJCQkJCQkvL09QVyB1c2VhYmxlCQkJCQkJCQkJCS8qIDJiKi8KKwlPUFcoIEhSRUdfSU8sIDB4MDAwMCApOyAgICAgICAgICAgICAgICAgICAgIC8vT1BXIHVzZWFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyYiovCiAJSENGX1dBSVRfV0hJTEUoIChJUFcoIEhSRUdfRVZfU1RBVCkgJiBIUkVHX0VWX0NNRCkgPT0gMCApOwotCUlGX1BST1RfVElNRSggSENGQVNTRVJUKCBwcm90X2NudCwgSVBXKCBIUkVHX0VWX1NUQVQpICkgKQotCUlGX1BST1RfVElNRSggaWYgKCBwcm90X2NudCApIHByb3RfY250ID0gaWZicC0+SUZCX1RpY2tJbmk7ICkKKwlJRl9QUk9UX1RJTUUoIEhDRkFTU0VSVCggcHJvdF9jbnQsIElQVyggSFJFR19FVl9TVEFUKSApICk7CisJSUZfUFJPVF9USU1FKCBpZiAoIHByb3RfY250ICkgcHJvdF9jbnQgPSBpZmJwLT5JRkJfVGlja0luaSApOwogI2VuZGlmIC8vIEhDRl9UWVBFX1BSRUxPQURFRAogCS8vISEgTm8gYXNzZXJ0cyBiZWZvcmUgUmVzZXQtYml0IGluIEhSRUdfSU8gaXMgY2xlYXJlZAotCUhDRkFTU0VSVCggRE9fQVNTRVJULCBNRVJHRV8yKCBIQ0ZfQVNTRVJULCAweENBRjAgKQkpIC8vanVzdCB0byBwcm9vZiB0aGF0IHRoZSBjb21wbGV0ZSBhc3NlcnQgbWFjaGluZXJ5IGlzIHdvcmtpbmcKLQlIQ0ZBU1NFUlQoIHhhICE9IENGR19GV19JREVOVElUWSwgMCApCQkvLyBhc3NlcnQgaWYgaGNmX2Nvbm5lY3QgaXMgY2FsbGVkIHdpdGhvdXQgaW50ZXJ2ZW5pbmcgaGNmX2Rpc2Nvbm5lY3QuCi0JSENGQVNTRVJUKCAoKGhjZl8zMikodm9pZCopaWZicCAmIChIQ0ZfQUxJR04tMSkgKSA9PSAwLCAoaGNmXzMyKSh2b2lkKilpZmJwICkKLQlIQ0ZBU1NFUlQoIChpb19hZGRyICYgMHgwMDNGKSA9PSAwLCBpb19hZGRyICkKLQkJCQkJCQkJCQkJCS8vaWYgQnVzeSBiaXQgaW4gQ21kIHJlZ2lzdGVyCi0JaWYgKElQVyggSFJFR19DTUQgKSAmIEhDTURfQlVTWSApIHsJCQkJCQkJCQkJCQkJCQkJLyogOCAqLwotCQkJCQkJCQkJCQkJLy8uICBBY2sgYWxsIHRvIHVuYmxvY2sgYSAocG9zc2libHkpIGJsb2NrZWQgY21kIHBpcGUgbGluZQorCUhDRkFTU0VSVCggRE9fQVNTRVJULCBNRVJHRV8yKCBIQ0ZfQVNTRVJULCAweENBRjAgKSApOyAvL2p1c3QgdG8gcHJvb2YgdGhhdCB0aGUgY29tcGxldGUgYXNzZXJ0IG1hY2hpbmVyeSBpcyB3b3JraW5nCisJSENGQVNTRVJUKCB4YSAhPSBDRkdfRldfSURFTlRJVFksIDAgKTsgICAgICAgLy8gYXNzZXJ0IGlmIGhjZl9jb25uZWN0IGlzIGNhbGxlZCB3aXRob3V0IGludGVydmVuaW5nIGhjZl9kaXNjb25uZWN0LgorCUhDRkFTU0VSVCggKChoY2ZfMzIpKHZvaWQqKWlmYnAgJiAoSENGX0FMSUdOLTEpICkgPT0gMCwgKGhjZl8zMikodm9pZCopaWZicCApOworCUhDRkFTU0VSVCggKGlvX2FkZHIgJiAweDAwM0YpID09IDAsIGlvX2FkZHIgKTsKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiBCdXN5IGJpdCBpbiBDbWQgcmVnaXN0ZXIKKwlpZiAoSVBXKCBIUkVHX0NNRCApICYgSENNRF9CVVNZICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4ICovCisJCS8vLiAgQWNrIGFsbCB0byB1bmJsb2NrIGEgKHBvc3NpYmx5KSBibG9ja2VkIGNtZCBwaXBlIGxpbmUKIAkJT1BXKCBIUkVHX0VWX0FDSywgfkhSRUdfRVZfU0xFRVBfUkVRICk7Ci0JCQkJCQkJCQkJCQkvLy4gIFdhaXQgZm9yIEJ1c3kgYml0IGRyb3AgIGluIENtZCByZWdpc3RlcgotCQkJCQkJCQkJCQkJLy8uICBXYWl0IGZvciBDbWQgIGJpdCByYWlzZSBpbiBFdiAgcmVnaXN0ZXIKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIFdhaXQgZm9yIEJ1c3kgYml0IGRyb3AgIGluIENtZCByZWdpc3RlcgorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgV2FpdCBmb3IgQ21kICBiaXQgcmFpc2UgaW4gRXYgIHJlZ2lzdGVyCiAJCUhDRl9XQUlUX1dISUxFKCAoIElQVyggSFJFR19DTUQgKSAmIEhDTURfQlVTWSApICYmIChJUFcoIEhSRUdfRVZfU1RBVCkgJiBIUkVHX0VWX0NNRCkgPT0gMCApOwotCQlJRl9QUk9UX1RJTUUoIEhDRkFTU0VSVCggcHJvdF9jbnQsIElQVyggSFJFR19FVl9TVEFUKSApICkgLyogaWYgcHJvdF9jbnQgPT0gMCwgY21kX2V4ZSB3aWxsIGZhaWwsIGNhdXNpbmcgREVGVU5DVCAqLworCQlJRl9QUk9UX1RJTUUoIEhDRkFTU0VSVCggcHJvdF9jbnQsIElQVyggSFJFR19FVl9TVEFUKSApICk7IC8qIGlmIHByb3RfY250ID09IDAsIGNtZF9leGUgd2lsbCBmYWlsLCBjYXVzaW5nIERFRlVOQ1QgKi8KIAl9CiAJT1BXKCBIUkVHX0VWX0FDSywgfkhSRUdfRVZfU0xFRVBfUkVRICk7Ci0jaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfUFJFTE9BREVEICkgPT0gMAkJCQkJCQkJCQkJCQkJLyoxMiovCisjaWYgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfUFJFTE9BREVEICkgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoxMiovCiAJKHZvaWQpY21kX2V4ZSggaWZicCwgSENNRF9JTkksIDAgKTsKICNlbmRpZiAvLyBIQ0ZfVFlQRV9QUkVMT0FERUQKLWlmICggaW9fYmFzZSAhPSBIQ0ZfRElTQ09OTkVDVCApIHsKLQkJcmMgPSBpbml0KCBpZmJwICk7CQkJCQkJCQkJCQkJCQkJCQkJCS8qMTQqLworCWlmICggaW9fYmFzZSAhPSBIQ0ZfRElTQ09OTkVDVCApIHsKKwkJcmMgPSBpbml0KCBpZmJwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjE0Ki8KIAkJaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHsKIAkJCXgubGVuID0gMjsKIAkJCXgudHlwID0gQ0ZHX05JQ19CVVNfVFlQRTsKQEAgLTEyNTMsMTAgKzEyMTksMTAgQEAKIAkJCS8vQ0ZHX05JQ19CVVNfVFlQRSBub3Qgc3VwcG9ydGVkIC0+IGRlZmF1bHQgMzIgYml0cy9ETUEsIE1TRiBoYXMgdG8gb3ZlcnJ1bGUgdmlhIENGR19DTlRMX09QVAogCQkJaWYgKCB4LmxlbiA9PSAwIHx8IHgudmFsWzBdID09IDB4MDAwMiB8fCB4LnZhbFswXSA9PSAweDAwMDMgKSB7CiAjaWYgKEhDRl9JTykgJiBIQ0ZfSU9fMzJCSVRTCi0JCQkJaWZicC0+SUZCX0NudGxPcHQgJj0gflVTRV8xNkJJVDsJCQkvL3Jlc2V0IFVTRV8xNkJJVAorCQkJCWlmYnAtPklGQl9DbnRsT3B0ICY9IH5VU0VfMTZCSVQ7ICAgICAgICAgICAgLy9yZXNldCBVU0VfMTZCSVQKICNlbmRpZiAvLyBIQ0ZfSU9fMzJCSVRTCiAjaWYgSENGX0RNQQotCQkJCWlmYnAtPklGQl9DbnRsT3B0IHw9IFVTRV9ETUE7CQkJCS8vU0VUIERNQQorCQkJCWlmYnAtPklGQl9DbnRsT3B0IHw9IFVTRV9ETUE7ICAgICAgICAgICAgICAgLy9TRVQgRE1BCiAjZWxzZQogCQkJCWlmYnAtPklGQl9JT1JhbmdlID0gMHg0MCAvKmkucy5vLiBIUkVHX0lPX1JBTkdFKi87CiAjZW5kaWYgLy8gSENGX0RNQQpAQCAtMTI2NCwxODggKzEyMzAsMTg4IEBACiAJCX0KIAl9IGVsc2UgSENGQVNTRVJUKCAgKCBpZmJwLT5JRkJfTWFnaWMgXj0gSENGX01BR0lDICkgPT0gMCwgaWZicC0+SUZCX01hZ2ljICkgLypOT1AqLzsKIAkvKiBvZiBhYm92ZSBIQ0ZBU1NFUlQgb25seSB0aGUgc2lkZSBlZmZlY3QgaXMgbmVlZGVkLCBOT1AgaW4gY2FzZSBIQ0ZBU1NFUlQgaXMgZHVtbXkgKi8KLQlpZmJwLT5JRkJfSU9CYXNlID0gaW9fYmFzZTsJCQkJCQkJCQkJCQkJCQkJCQkvKiAwKi8KKwlpZmJwLT5JRkJfSU9CYXNlID0gaW9fYmFzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwKi8KIAlyZXR1cm4gcmM7CiB9IC8vIGhjZl9jb25uZWN0CiAKICNpZiBIQ0ZfRE1BCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIEZ1bmN0aW9uIGdldF9mcmFtZV9sc3QKLSogIC0gcmVzb2x2ZSB0aGUgImxhc3QgaG9zdC1vd25lZCBkZXNjcmlwdG9yIiBwcm9ibGVtcyB3aGVuIGEgZGVzY3JpcHRvciBsaXN0IGlzIHJlY2xhaW1lZCBieSB0aGUgTVNGLgotKgotKiBUaGUgRnJhbWVMaXN0IHRvIGJlIHJlY2xhaW1lZCBhcyB3ZWxsIGFzIHRoZSBEZXNjcmlwdG9yTGlzdCBhbHdheXMgc3RhcnQgaW4gSUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXQotKiBhbmQgdGhpcyBpcyBhbHdheXMgdGhlICJjdXJyZW50IiBERUxXQSBEZXNjcmlwdG9yLgotKgotKiBJZiBhIEZyYW1lTGlzdCBpcyBhdmFpbGFibGUsIHRoZSBsYXN0IGRlc2NyaXB0b3Igb2YgdGhlIEZyYW1lTGlzdCB0byB0dXJuZWQgaW50byBhIG5ldyBERUxXQSBEZXNjcmlwdG9yOgotKiAgLSBhIGNvcHkgaXMgbWFkZSBmcm9tIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgbGFzdCBkZXNjcmlwdG9yIG9mIHRoZSBGcmFtZUxpc3QgaW50byB0aGUgY3VycmVudAotKgkgREVMV0EgRGVzY3JpcHRvcgotKiAgLSB0aGUgcmVtYWluZGVyIG9mIHRoZSBEZXNjcmlwdG9yTGlzdCBpcyBkZXRhY2hlZCBmcm9tIHRoZSBjb3B5IGJ5IHNldHRpbmcgdGhlIG5leHRfZGVzY19hZGRyIGF0IE5VTEwKLSogIC0gdGhlIERNQSBjb250cm9sIGJpdHMgb2YgdGhlIGNvcHkgYXJlIGNsZWFyZWQgdG8gZG8gbm90IGNvbmZ1c2UgdGhlIE1TRgotKiAgLSB0aGUgY29weSBvZiB0aGUgbGFzdCBkZXNjcmlwdG9yIChpLmUuIHRoZSAib2xkIiBERUxXQSBEZXNjcmlwdG9yKSBpcyBjaGFpbmVkIHRvIHRoZSBwcmV2IERlc2NyaXB0b3IKLSoJIG9mIHRoZSBGcmFtZUxpc3QsIHRodXMgcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBsYXN0IERlc2NyaXB0b3Igb2YgdGhlIEZyYW1lTGlzdC4KLSogIC0gSUZCX0ZpcnN0RGVzYyBpcyBjaGFuZ2VkIHRvIHRoZSBhZGRyZXNzIG9mIHRoYXQgcmVwbGFjZWQgKG9yaWdpbmFsKSBsYXN0IGRlc2NyaXB0b3Igb2YgdGhlIEZyYW1lTGlzdCwKLSoJIGkuZS4gdGhlICJuZXciIERFTFdBIERlc2NyaXB0b3IuCi0qCi0qIFRoaXMgZnVuY3Rpb24gbWFrZXMgYSBjb3B5IG9mIHRoYXQgbGFzdCBob3N0LW93bmVkIGRlc2NyaXB0b3IsIHNvIHRoZSBNU0Ygd2lsbCBnZXQgYSBjb3B5IG9mIHRoZSBkZXNjcmlwdG9yLgotKiBPbiB0b3Agb2YgdGhhdCwgaXQgYWRqdXN0cyBETUEgcmVsYXRlZCBmaWVsZHMgaW4gdGhlIElGQiBzdHJ1Y3R1cmUuCi0JLy8gcGVyZm9ybSBhIGNvcHlpbmctc2NoZW1lIHRvIGNpcmN1bXZlbnQgdGhlICdsYXN0IGhvc3Qgb3duZWQgZGVzY3JpcHRvciBjYW5ub3QgYmUgcmVjbGFpbWVkJyBsaW1pdGF0aW9uIGltcG9zZWQgYnkgSDIuNSdzIERNQSBoYXJkd2FyZSBkZXNpZ24KLQkvLyBhICdyZWNsYWltIGRlc2NyaXB0b3InIHNob3VsZCBiZSBhdmFpbGFibGUgaW4gdGhlIEhDRjoKLSoKLSogUmV0dXJuczogYWRkcmVzcyBvZiB0aGUgZmlyc3QgZGVzY3JpcHRvciBvZiB0aGUgRnJhbWVMaXN0Ci0qCisgKiBGdW5jdGlvbiBnZXRfZnJhbWVfbHN0CisgKiAgLSByZXNvbHZlIHRoZSAibGFzdCBob3N0LW93bmVkIGRlc2NyaXB0b3IiIHByb2JsZW1zIHdoZW4gYSBkZXNjcmlwdG9yIGxpc3QgaXMgcmVjbGFpbWVkIGJ5IHRoZSBNU0YuCisgKgorICogVGhlIEZyYW1lTGlzdCB0byBiZSByZWNsYWltZWQgYXMgd2VsbCBhcyB0aGUgRGVzY3JpcHRvckxpc3QgYWx3YXlzIHN0YXJ0IGluIElGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10KKyAqIGFuZCB0aGlzIGlzIGFsd2F5cyB0aGUgImN1cnJlbnQiIERFTFdBIERlc2NyaXB0b3IuCisgKgorICogSWYgYSBGcmFtZUxpc3QgaXMgYXZhaWxhYmxlLCB0aGUgbGFzdCBkZXNjcmlwdG9yIG9mIHRoZSBGcmFtZUxpc3QgdG8gdHVybmVkIGludG8gYSBuZXcgREVMV0EgRGVzY3JpcHRvcjoKKyAqICAtIGEgY29weSBpcyBtYWRlIGZyb20gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBsYXN0IGRlc2NyaXB0b3Igb2YgdGhlIEZyYW1lTGlzdCBpbnRvIHRoZSBjdXJyZW50CisgKiAgICBERUxXQSBEZXNjcmlwdG9yCisgKiAgLSB0aGUgcmVtYWluZGVyIG9mIHRoZSBEZXNjcmlwdG9yTGlzdCBpcyBkZXRhY2hlZCBmcm9tIHRoZSBjb3B5IGJ5IHNldHRpbmcgdGhlIG5leHRfZGVzY19hZGRyIGF0IE5VTEwKKyAqICAtIHRoZSBETUEgY29udHJvbCBiaXRzIG9mIHRoZSBjb3B5IGFyZSBjbGVhcmVkIHRvIGRvIG5vdCBjb25mdXNlIHRoZSBNU0YKKyAqICAtIHRoZSBjb3B5IG9mIHRoZSBsYXN0IGRlc2NyaXB0b3IgKGkuZS4gdGhlICJvbGQiIERFTFdBIERlc2NyaXB0b3IpIGlzIGNoYWluZWQgdG8gdGhlIHByZXYgRGVzY3JpcHRvcgorICogICAgb2YgdGhlIEZyYW1lTGlzdCwgdGh1cyByZXBsYWNpbmcgdGhlIG9yaWdpbmFsIGxhc3QgRGVzY3JpcHRvciBvZiB0aGUgRnJhbWVMaXN0LgorICogIC0gSUZCX0ZpcnN0RGVzYyBpcyBjaGFuZ2VkIHRvIHRoZSBhZGRyZXNzIG9mIHRoYXQgcmVwbGFjZWQgKG9yaWdpbmFsKSBsYXN0IGRlc2NyaXB0b3Igb2YgdGhlIEZyYW1lTGlzdCwKKyAqICAgIGkuZS4gdGhlICJuZXciIERFTFdBIERlc2NyaXB0b3IuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYWtlcyBhIGNvcHkgb2YgdGhhdCBsYXN0IGhvc3Qtb3duZWQgZGVzY3JpcHRvciwgc28gdGhlIE1TRiB3aWxsIGdldCBhIGNvcHkgb2YgdGhlIGRlc2NyaXB0b3IuCisgKiBPbiB0b3Agb2YgdGhhdCwgaXQgYWRqdXN0cyBETUEgcmVsYXRlZCBmaWVsZHMgaW4gdGhlIElGQiBzdHJ1Y3R1cmUuCisgLy8gcGVyZm9ybSBhIGNvcHlpbmctc2NoZW1lIHRvIGNpcmN1bXZlbnQgdGhlICdsYXN0IGhvc3Qgb3duZWQgZGVzY3JpcHRvciBjYW5ub3QgYmUgcmVjbGFpbWVkJyBsaW1pdGF0aW9uIGltcG9zZWQgYnkgSDIuNSdzIERNQSBoYXJkd2FyZSBkZXNpZ24KKyAvLyBhICdyZWNsYWltIGRlc2NyaXB0b3InIHNob3VsZCBiZSBhdmFpbGFibGUgaW4gdGhlIEhDRjoKKyAqCisgKiBSZXR1cm5zOiBhZGRyZXNzIG9mIHRoZSBmaXJzdCBkZXNjcmlwdG9yIG9mIHRoZSBGcmFtZUxpc3QKKyAqCiAgODogQmUgY2FyZWZ1bCBvbmNlIHlvdSBzdGFydCByZS1vcmRlcmluZyB0aGUgc3RlcHMgaW4gdGhlIGNvcHkgcHJvY2VzcywgdGhhdCBpdCBzdGlsbCB3b3JrcyBmb3IgY2FzZXMKLSogCW9mIEZyYW1lTGlzdHMgb2YgMSwgMiBhbmQgbW9yZSB0aGFuIDIgZGVzY3JpcHRvcnMKLSoKLSogSW5wdXQgcGFyYW1ldGVyczoKLSogdHhfcnhfZmxhZyAgICAgIDogc3BlY2lmaWVzICd0cmFuc21pdCcgb3IgJ3JlY2VpdmUnIGRlc2NyaXB0b3IuCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKiAgIG9mIEZyYW1lTGlzdHMgb2YgMSwgMiBhbmQgbW9yZSB0aGFuIDIgZGVzY3JpcHRvcnMKKyAqCisgKiBJbnB1dCBwYXJhbWV0ZXJzOgorICogdHhfcnhfZmxhZyAgICAgIDogc3BlY2lmaWVzICd0cmFuc21pdCcgb3IgJ3JlY2VpdmUnIGRlc2NyaXB0b3IuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIEhDRl9TVEFUSUMgREVTQ19TVFJDVCoKIGdldF9mcmFtZV9sc3QoIElGQlAgaWZicCwgaW50IHR4X3J4X2ZsYWcgKQogewogCi1ERVNDX1NUUkNUICpoZWFkID0gaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXTsKLURFU0NfU1RSQ1QgKmNvcHksICpwLCAqcHJldjsKKwlERVNDX1NUUkNUICpoZWFkID0gaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXTsKKwlERVNDX1NUUkNUICpjb3B5LCAqcCwgKnByZXY7CiAKLQlIQ0ZBU1NFUlQoIHR4X3J4X2ZsYWcgPT0gRE1BX1JYIHx8IHR4X3J4X2ZsYWcgPT0gRE1BX1RYLCB0eF9yeF9mbGFnICkKLQkJCQkJCQkJLy9pZiBGcmFtZUxpc3QKKwlIQ0ZBU1NFUlQoIHR4X3J4X2ZsYWcgPT0gRE1BX1JYIHx8IHR4X3J4X2ZsYWcgPT0gRE1BX1RYLCB0eF9yeF9mbGFnICk7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgRnJhbWVMaXN0CiAJaWYgKCBoZWFkICkgewotCQkJCQkJCQkvLy4gIHNlYXJjaCBmb3IgbGFzdCBkZXNjcmlwdG9yIG9mIGZpcnN0IEZyYW1lTGlzdAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgc2VhcmNoIGZvciBsYXN0IGRlc2NyaXB0b3Igb2YgZmlyc3QgRnJhbWVMaXN0CiAJCXAgPSBwcmV2ID0gaGVhZDsKIAkJd2hpbGUgKCAoIHAtPkJVRl9TSVpFICYgREVTQ19FT1AgKSA9PSAwICYmIHAtPm5leHRfZGVzY19hZGRyICkgewotCQkJaWYgKCAoIGlmYnAtPklGQl9DbnRsT3B0ICYgRE1BX0VOQUJMRUQgKSA9PSAwICkgewkvL2NsZWFyIGNvbnRyb2wgYml0cyB3aGVuIGRpc2FibGVkCisJCQlpZiAoICggaWZicC0+SUZCX0NudGxPcHQgJiBETUFfRU5BQkxFRCApID09IDAgKSB7ICAgLy9jbGVhciBjb250cm9sIGJpdHMgd2hlbiBkaXNhYmxlZAogCQkJCXAtPkJVRl9DTlQgJj0gREVTQ19DTlRfTUFTSzsKIAkJCX0KIAkJCXByZXYgPSBwOwogCQkJcCA9IHAtPm5leHRfZGVzY19hZGRyOwogCQl9Ci0JCQkJCQkJCS8vLiAgaWYgRE1BIGVuYWJsZWQKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIGlmIERNQSBlbmFibGVkCiAJCWlmICggaWZicC0+SUZCX0NudGxPcHQgJiBETUFfRU5BQkxFRCApIHsKLQkJCQkJCQkJLy8uICAuICBpZiBsYXN0IGRlc2NyaXB0b3Igb2YgRnJhbWVMaXN0IGlzIERNQSBvd25lZAotCQkJCQkJCQkvLy4gIC4gIG9yIGlmIEZyYW1lTGlzdCBpcyBzaW5nbGUgKERFTFdBKSBEZXNjcmlwdG9yCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIGlmIGxhc3QgZGVzY3JpcHRvciBvZiBGcmFtZUxpc3QgaXMgRE1BIG93bmVkCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIG9yIGlmIEZyYW1lTGlzdCBpcyBzaW5nbGUgKERFTFdBKSBEZXNjcmlwdG9yCiAJCQlpZiAoIHAtPkJVRl9DTlQgJiBERVNDX0RNQV9PV05FRCB8fCBoZWFkLT5uZXh0X2Rlc2NfYWRkciA9PSBOVUxMICkgewotCQkJCQkJCQkvLy4gIC4gIC4gIHJlZnVzZSB0byByZXR1cm4gRnJhbWVMaXN0IHRvIGNhbGxlcgorCQkJCSAgICAgICAgICAgICAgICAvLy4gIC4gIC4gIHJlZnVzZSB0byByZXR1cm4gRnJhbWVMaXN0IHRvIGNhbGxlcgogCQkJCWhlYWQgPSBOVUxMOwogCQkJfQogCQl9CiAJfQotCQkJCQkJCQkvL2lmIHJldHVybmFibGUgRnJhbWVMaXN0IGZvdW5kCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgcmV0dXJuYWJsZSBGcmFtZUxpc3QgZm91bmQKIAlpZiAoIGhlYWQgKSB7Ci0JCQkJCQkJCS8vLiAgaWYgRnJhbWVMaXN0IGlzIHNpbmdsZSAoREVMV0EpIERlc2NyaXB0b3IgKGltcGxpZXMgRE1BIGRpc2FibGVkKQotIAkJaWYgKCBoZWFkLT5uZXh0X2Rlc2NfYWRkciA9PSBOVUxMICkgewotCQkJCQkJCQkvLy4gIC4gIGNsZWFyIERlc2NyaXB0b3JMaXN0CisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICBpZiBGcmFtZUxpc3QgaXMgc2luZ2xlIChERUxXQSkgRGVzY3JpcHRvciAoaW1wbGllcyBETUEgZGlzYWJsZWQpCisJCWlmICggaGVhZC0+bmV4dF9kZXNjX2FkZHIgPT0gTlVMTCApIHsKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgY2xlYXIgRGVzY3JpcHRvckxpc3QKIAkJCS8qOz9pZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10gPSovIGlmYnAtPklGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10gPSBOVUxMOwotCQkJCQkJCQkvLy4gIGVsc2UKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgZWxzZQogCQl9IGVsc2UgewotCQkJCQkJCQkvLy4gIC4gIHN0cmlwIGhhcmR3YXJlLXJlbGF0ZWQgYml0cyBmcm9tIGxhc3QgZGVzY3JpcHRvcgotCQkJCQkJCQkvLy4gIC4gIHJlbW92ZSBERUxXQSBEZXNjcmlwdG9yIGZyb20gaGVhZCBvZiBEZXNjcmlwdG9yTGlzdAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICBzdHJpcCBoYXJkd2FyZS1yZWxhdGVkIGJpdHMgZnJvbSBsYXN0IGRlc2NyaXB0b3IKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgcmVtb3ZlIERFTFdBIERlc2NyaXB0b3IgZnJvbSBoZWFkIG9mIERlc2NyaXB0b3JMaXN0CiAJCQljb3B5ID0gaGVhZDsKLQkgCQloZWFkID0gaGVhZC0+bmV4dF9kZXNjX2FkZHI7Ci0JCQkJCQkJCS8vLiAgIC4gIGV4Y2hhbmdlIGZpcnN0IChDb25maW5lZCkgYW5kIGxhc3QgKHBvc3NpYmx5IGltcHJpc29uZWQpIERlc2NyaXB0b3IKKwkJCWhlYWQgPSBoZWFkLT5uZXh0X2Rlc2NfYWRkcjsKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgIC4gIGV4Y2hhbmdlIGZpcnN0IChDb25maW5lZCkgYW5kIGxhc3QgKHBvc3NpYmx5IGltcHJpc29uZWQpIERlc2NyaXB0b3IKIAkJCWNvcHktPmJ1Zl9waHlzX2FkZHIgPSBwLT5idWZfcGh5c19hZGRyOwogCQkJY29weS0+YnVmX2FkZHIgPSBwLT5idWZfYWRkcjsKLQkJCWNvcHktPkJVRl9TSVpFID0gcC0+QlVGX1NJWkUgJj0gREVTQ19DTlRfTUFTSzsJLy9nZXQgcmlkIG9mIERFU0NfRU9QIGFuZCBwb3NzaWJseSBERVNDX1NPUAotCQkJY29weS0+QlVGX0NOVCA9IHAtPkJVRl9DTlQgJj0gREVTQ19DTlRfTUFTSzsJLy9nZXQgcmlkIG9mIERFU0NfRE1BX09XTkVECisJCQljb3B5LT5CVUZfU0laRSA9IHAtPkJVRl9TSVpFICY9IERFU0NfQ05UX01BU0s7ICAvL2dldCByaWQgb2YgREVTQ19FT1AgYW5kIHBvc3NpYmx5IERFU0NfU09QCisJCQljb3B5LT5CVUZfQ05UID0gcC0+QlVGX0NOVCAmPSBERVNDX0NOVF9NQVNLOyAgICAvL2dldCByaWQgb2YgREVTQ19ETUFfT1dORUQKICNpZiAoSENGX0VYVCkgJiBIQ0ZfREVTQ19TVFJDVF9FWFQKIAkJCWNvcHktPkRFU0NfTVNGU3VwID0gcC0+REVTQ19NU0ZTdXA7CiAjZW5kaWYgLy8gSENGX0RFU0NfU1RSQ1RfRVhUCi0JCQkJCQkJCS8vLiAgLiAgdHVybiBpbnRvIGEgREVMV0EgRGVzY3JpcHRvcgorCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICB0dXJuIGludG8gYSBERUxXQSBEZXNjcmlwdG9yCiAJCQlwLT5idWZfYWRkciA9IE5VTEw7Ci0JCQkJCQkJCS8vLiAgLiAgY2hhaW4gY29weSB0byBwcmV2CQkJCQkJCQkJCQkvKiA4Ki8KKwkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgY2hhaW4gY29weSB0byBwcmV2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOCovCiAJCQlwcmV2LT5uZXh0X2Rlc2NfYWRkciA9IGNvcHk7Ci0JCQkJCQkJCS8vLiAgLiAgZGV0YWNoIHJlbWFpbmRlciBvZiB0aGUgRGVzY3JpcHRvckxpc3QgZnJvbSBGcmFtZUxpc3QKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgZGV0YWNoIHJlbWFpbmRlciBvZiB0aGUgRGVzY3JpcHRvckxpc3QgZnJvbSBGcmFtZUxpc3QKIAkJCWNvcHktPm5leHRfZGVzY19hZGRyID0gTlVMTDsKIAkJCWNvcHktPm5leHRfZGVzY19waHlzX2FkZHIgPSAweERFQUQwMDAwOyAvLyEganVzdCB0byBiZSBuaWNlLCBub3QgcmVhbGx5IG5lZWRlZAotCQkJCQkJCQkvLy4gIC4gIHNhdmUgdGhlIG5ldyBzdGFydCAoaS5lLiBERUxXQSBEZXNjcmlwdG9yKSBpbiBJRkJfRmlyc3REZXNjCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIHNhdmUgdGhlIG5ldyBzdGFydCAoaS5lLiBERUxXQSBEZXNjcmlwdG9yKSBpbiBJRkJfRmlyc3REZXNjCiAJCQlpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddID0gcDsKIAkJfQotCQkJCQkJCQkvLy4gIHN0cmlwIERFU0NfU09QIGZyb20gZmlyc3QgZGVzY3JpcHRvcgorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgc3RyaXAgREVTQ19TT1AgZnJvbSBmaXJzdCBkZXNjcmlwdG9yCiAJCWhlYWQtPkJVRl9TSVpFICY9IERFU0NfQ05UX01BU0s7CiAJCS8vaGVhZC0+QlVGX0NOVCAmPSBERVNDX0NOVF9NQVNLOyAgZ2V0IHJpZCBvZiBERVNDX0RNQV9PV05FRAogCQloZWFkLT5uZXh0X2Rlc2NfcGh5c19hZGRyID0gMHhERUFEMDAwMDsgLy8hIGp1c3QgdG8gYmUgbmljZSwgbm90IHJlYWxseSBuZWVkZWQKIAl9Ci0JCQkJCQkJCS8vcmV0dXJuIHRoZSBqdXN0IGRldGFjaGVkIEZyYW1lTGlzdCAoaWYgYW55KQorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JldHVybiB0aGUganVzdCBkZXRhY2hlZCBGcmFtZUxpc3QgKGlmIGFueSkKIAlyZXR1cm4gaGVhZDsKIH0gLy8gZ2V0X2ZyYW1lX2xzdAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogRnVuY3Rpb24gcHV0X2ZyYW1lX2xzdAotKgotKiBUaGlzIGZ1bmN0aW9uCi0qCi0qIFJldHVybnM6IGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGRlc2NyaXB0b3Igb2YgdGhlIEZyYW1lTGlzdAotKgotKiBJbnB1dCBwYXJhbWV0ZXJzOgotKiB0eF9yeF9mbGFnICAgICAgOiBzcGVjaWZpZXMgJ3RyYW5zbWl0JyBvciAncmVjZWl2ZScgZGVzY3JpcHRvci4KLSoKLSogVGhlIGZvbGxvd2luZyBsaXN0IHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCBoY2ZfZG1hX3R4L3J4X3B1dCwgaW4gb3JkZXIgdG8gZ2V0IHRoZW0gaW4gdGhlIFdDSS1zcGVjICEhISEKLSogQXNzZXJ0IGZhaWxzIGlmCi0qIC0JRE1BIGlzIG5vdCBlbmFibGVkCi0qIC0JZGVzY3JpcHRvciBsaXN0IGlzIE5VTEwKLSogLQlhIGRlc2NyaXB0b3IgaW4gdGhlIGRlc2NyaXB0b3IgbGlzdCBpcyBub3QgZG91YmxlIHdvcmQgYWxpZ25lZAotKiAtCWEgY291bnQgb2Ygc2l6ZSBmaWVsZCBvZiBhIGRlc2NyaXB0b3IgY29udGFpbnMgY29udHJvbCBiaXRzLCBpLmUuIGJpdHMgaW4gdGhlIGhpZ2ggb3JkZXIgbmliYmxlLgotKiAtCXRoZSBERUxXQSBkZXNjcmlwdG9yIGlzIG5vdCBhICJzaW5nbGV0b24iIERlc2NyaXB0b3JMaXN0LgotKiAtCXRoZSBERUxXQSBkZXNjcmlwdG9yIGlzIG5vdCB0aGUgZmlyc3QgRGVzY3JpcHRvciBzdXBwbGllZAotKiAtCWEgbm9uX0RNQSBkZXNjcmlwdG9yIGlzIHN1cHBsaWVkIGJlZm9yZSB0aGUgREVMV0EgRGVzY3JpcHRvciBpcyBzdXBwbGllZAotKiAtCVBvc3NpYmx5IG1vcmUgY2hlY2tzIGNvdWxkIGJlIGFkZGVkICEhISEhISEhISEhISEKKyAqIEZ1bmN0aW9uIHB1dF9mcmFtZV9sc3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uCisgKgorICogUmV0dXJuczogYWRkcmVzcyBvZiB0aGUgZmlyc3QgZGVzY3JpcHRvciBvZiB0aGUgRnJhbWVMaXN0CisgKgorICogSW5wdXQgcGFyYW1ldGVyczoKKyAqIHR4X3J4X2ZsYWcgICAgICA6IHNwZWNpZmllcyAndHJhbnNtaXQnIG9yICdyZWNlaXZlJyBkZXNjcmlwdG9yLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgbGlzdCBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggaGNmX2RtYV90eC9yeF9wdXQsIGluIG9yZGVyIHRvIGdldCB0aGVtIGluIHRoZSBXQ0ktc3BlYyAhISEhCisgKiBBc3NlcnQgZmFpbHMgaWYKKyAqIC0gRE1BIGlzIG5vdCBlbmFibGVkCisgKiAtIGRlc2NyaXB0b3IgbGlzdCBpcyBOVUxMCisgKiAtIGEgZGVzY3JpcHRvciBpbiB0aGUgZGVzY3JpcHRvciBsaXN0IGlzIG5vdCBkb3VibGUgd29yZCBhbGlnbmVkCisgKiAtIGEgY291bnQgb2Ygc2l6ZSBmaWVsZCBvZiBhIGRlc2NyaXB0b3IgY29udGFpbnMgY29udHJvbCBiaXRzLCBpLmUuIGJpdHMgaW4gdGhlIGhpZ2ggb3JkZXIgbmliYmxlLgorICogLSB0aGUgREVMV0EgZGVzY3JpcHRvciBpcyBub3QgYSAic2luZ2xldG9uIiBEZXNjcmlwdG9yTGlzdC4KKyAqIC0gdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IHRoZSBmaXJzdCBEZXNjcmlwdG9yIHN1cHBsaWVkCisgKiAtIGEgbm9uX0RNQSBkZXNjcmlwdG9yIGlzIHN1cHBsaWVkIGJlZm9yZSB0aGUgREVMV0EgRGVzY3JpcHRvciBpcyBzdXBwbGllZAorICogLSBQb3NzaWJseSBtb3JlIGNoZWNrcyBjb3VsZCBiZSBhZGRlZCAhISEhISEhISEhISEhCiAKLSouTk9USUNFCi0qIFRoZSBhc3NlcnRzIG1hcmtlZCB3aXRoICpzYyogYXJlIHJlYWxseSBzYW5pdHkgY2hlY2tzIGZvciB0aGUgSENGLCB0aGV5IGNhbiAoc3VwcG9zZWRseSkgbm90IGJlIGluZmx1ZW5jZWQKLSogYnkgaW5jb3JyZWN0IE1TRiBiZWhhdmlvcgorICouTk9USUNFCisgKiBUaGUgYXNzZXJ0cyBtYXJrZWQgd2l0aCAqc2MqIGFyZSByZWFsbHkgc2FuaXR5IGNoZWNrcyBmb3IgdGhlIEhDRiwgdGhleSBjYW4gKHN1cHBvc2VkbHkpIG5vdCBiZSBpbmZsdWVuY2VkCisgKiBieSBpbmNvcnJlY3QgTVNGIGJlaGF2aW9yCiAKLQkJLy8gVGhlIE1TRiBpcyByZXF1aXJlZCB0byBzdXBwbHkgdGhlIEhDRiB3aXRoIGEgc2luZ2xlIGRlc2NyaXB0b3IgZm9yIE1TRiB0eCByZWNsYWltIHB1cnBvc2VzLgotCQkvLyBUaGlzICdyZWNsYWltIGRlc2NyaXB0b3InIGNhbiBiZSByZWNvZ25pemVkIGJ5IHRoZSBmYWN0IHRoYXQgaXRzIGJ1Zl9hZGRyIGZpZWxkIGlzIHplcm8uCi0JKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JKiBBbHRob3VnaCBub3QgcmVxdWlyZWQgZnJvbSBhIGhhcmR3YXJlIHBlcnNwZWN0aXZlOgotCSogLSBtYWtlIGVhY2ggZGVzY3JpcHRvciBpbiB0aGlzIHJ4LWNoYWluIERNQS1vd25lZC4KLQkqIC0gQWxzbyBzZXQgdGhlIGNvdW50IHRvIHplcm8uIEVPUCBhbmQgU09QIGJpdHMgYXJlIGFsc28gY2xlYXJlZC4KLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgLy8gVGhlIE1TRiBpcyByZXF1aXJlZCB0byBzdXBwbHkgdGhlIEhDRiB3aXRoIGEgc2luZ2xlIGRlc2NyaXB0b3IgZm9yIE1TRiB0eCByZWNsYWltIHB1cnBvc2VzLgorIC8vIFRoaXMgJ3JlY2xhaW0gZGVzY3JpcHRvcicgY2FuIGJlIHJlY29nbml6ZWQgYnkgdGhlIGZhY3QgdGhhdCBpdHMgYnVmX2FkZHIgZmllbGQgaXMgemVyby4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFsdGhvdWdoIG5vdCByZXF1aXJlZCBmcm9tIGEgaGFyZHdhcmUgcGVyc3BlY3RpdmU6CisgKiAtIG1ha2UgZWFjaCBkZXNjcmlwdG9yIGluIHRoaXMgcngtY2hhaW4gRE1BLW93bmVkLgorICogLSBBbHNvIHNldCB0aGUgY291bnQgdG8gemVyby4gRU9QIGFuZCBTT1AgYml0cyBhcmUgYWxzbyBjbGVhcmVkLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIEhDRl9TVEFUSUMgdm9pZAogcHV0X2ZyYW1lX2xzdCggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgaW50IHR4X3J4X2ZsYWcgKQogewotCURFU0NfU1RSQ1QJKnAgPSBkZXNjcDsKKwlERVNDX1NUUkNUICAqcCA9IGRlc2NwOwogCWhjZl8xNiBwb3J0OwogCi0JSENGQVNTRVJUKCBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEsIGlmYnAtPklGQl9DbnRsT3B0KSAvL29ubHkgaGNmX2RtYV90eF9wdXQgbXVzdCBhbHNvIGJlIERNQV9FTkFCTEVECi0JSENGQVNTRVJUKCB0eF9yeF9mbGFnID09IERNQV9SWCB8fCB0eF9yeF9mbGFnID09IERNQV9UWCwgdHhfcnhfZmxhZyApCi0JSENGQVNTRVJUKCBwICwgMCApCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEsIGlmYnAtPklGQl9DbnRsT3B0KTsgLy9vbmx5IGhjZl9kbWFfdHhfcHV0IG11c3QgYWxzbyBiZSBETUFfRU5BQkxFRAorCUhDRkFTU0VSVCggdHhfcnhfZmxhZyA9PSBETUFfUlggfHwgdHhfcnhfZmxhZyA9PSBETUFfVFgsIHR4X3J4X2ZsYWcgKTsKKwlIQ0ZBU1NFUlQoIHAgLCAwICk7CiAKIAl3aGlsZSAoIHAgKSB7Ci0JCUhDRkFTU0VSVCggKChoY2ZfMzIpcCAmIDMgKSA9PSAwLCAoaGNmXzMyKXAgKQotCQlIQ0ZBU1NFUlQoIChwLT5CVUZfQ05UICYgfkRFU0NfQ05UX01BU0spID09IDAsIHAtPkJVRl9DTlQgKQotCQlIQ0ZBU1NFUlQoIChwLT5CVUZfU0laRSAmIH5ERVNDX0NOVF9NQVNLKSA9PSAwLCBwLT5CVUZfU0laRSApCi0JCXAtPkJVRl9TSVpFICY9IERFU0NfQ05UX01BU0s7CQkJCQkvLyEhdGhpcyBTSE9VTEQgYmUgc3VwZXJmbHVvdXMgaW4gY2FzZSBvZiBjb3JyZWN0IE1TRgotCQlwLT5CVUZfQ05UICY9IHR4X3J4X2ZsYWcgPT0gRE1BX1JYID8gMCA6IERFU0NfQ05UX01BU0s7CS8vISF0aGlzIFNIT1VMRCBiZSBzdXBlcmZsdW91cyBpbiBjYXNlIG9mIGNvcnJlY3QgTVNGCisJCUhDRkFTU0VSVCggKChoY2ZfMzIpcCAmIDMgKSA9PSAwLCAoaGNmXzMyKXAgKTsKKwkJSENGQVNTRVJUKCAocC0+QlVGX0NOVCAmIH5ERVNDX0NOVF9NQVNLKSA9PSAwLCBwLT5CVUZfQ05UICk7CisJCUhDRkFTU0VSVCggKHAtPkJVRl9TSVpFICYgfkRFU0NfQ05UX01BU0spID09IDAsIHAtPkJVRl9TSVpFICk7CisJCXAtPkJVRl9TSVpFICY9IERFU0NfQ05UX01BU0s7ICAgICAgICAgICAgICAgICAgIC8vISF0aGlzIFNIT1VMRCBiZSBzdXBlcmZsdW91cyBpbiBjYXNlIG9mIGNvcnJlY3QgTVNGCisJCXAtPkJVRl9DTlQgJj0gdHhfcnhfZmxhZyA9PSBETUFfUlggPyAwIDogREVTQ19DTlRfTUFTSzsgLy8hIXRoaXMgU0hPVUxEIGJlIHN1cGVyZmx1b3VzIGluIGNhc2Ugb2YgY29ycmVjdCBNU0YKIAkJcC0+QlVGX0NOVCB8PSBERVNDX0RNQV9PV05FRDsKIAkJaWYgKCBwLT5uZXh0X2Rlc2NfYWRkciApIHsKLS8vCQkJSENGQVNTRVJUKCBwLT5idWZfYWRkciAmJiBwLT5idWZfcGh5c19hZGRyICAmJiBwLT5CVUZfU0laRSAmJiArLy0gcC0+QlVGX1NJWkUsIC4uLiApCi0JCQlIQ0ZBU1NFUlQoIHAtPm5leHRfZGVzY19hZGRyLT5kZXNjX3BoeXNfYWRkciwgKGhjZl8zMilwLT5uZXh0X2Rlc2NfYWRkciApCisvLwkJCUhDRkFTU0VSVCggcC0+YnVmX2FkZHIgJiYgcC0+YnVmX3BoeXNfYWRkciAgJiYgcC0+QlVGX1NJWkUgJiYgKy8tIHAtPkJVRl9TSVpFLCAuLi4gKTsKKwkJCUhDRkFTU0VSVCggcC0+bmV4dF9kZXNjX2FkZHItPmRlc2NfcGh5c19hZGRyLCAoaGNmXzMyKXAtPm5leHRfZGVzY19hZGRyICk7CiAJCQlwLT5uZXh0X2Rlc2NfcGh5c19hZGRyID0gcC0+bmV4dF9kZXNjX2FkZHItPmRlc2NfcGh5c19hZGRyOwotCQl9IGVsc2UgewkJCQkJCQkJCS8vCisJCX0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KIAkJCXAtPm5leHRfZGVzY19waHlzX2FkZHIgPSAwOwotCQkJaWYgKCBwLT5idWZfYWRkciA9PSBOVUxMICkgewkJCS8vIERFTFdBIERlc2NyaXB0b3IKLQkJCQlIQ0ZBU1NFUlQoIGRlc2NwID09IHAsIChoY2ZfMzIpZGVzY3AgKQkvL3NpbmdsZXRvbiBEZXNjcmlwdG9yTGlzdAotCQkJCUhDRkFTU0VSVCggaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSA9PSBOVUxMLCAoaGNmXzMyKWlmYnAtPklGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10pCi0JCQkJSENGQVNTRVJUKCBpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10gPT0gTlVMTCwgKGhjZl8zMilpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10pCisJCQlpZiAoIHAtPmJ1Zl9hZGRyID09IE5VTEwgKSB7ICAgICAgICAgICAgLy8gREVMV0EgRGVzY3JpcHRvcgorCQkJCUhDRkFTU0VSVCggZGVzY3AgPT0gcCwgKGhjZl8zMilkZXNjcCApOyAgLy9zaW5nbGV0b24gRGVzY3JpcHRvckxpc3QKKwkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10gPT0gTlVMTCwgKGhjZl8zMilpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddKTsKKwkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSA9PSBOVUxMLCAoaGNmXzMyKWlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSk7CiAJCQkJZGVzY3AtPkJVRl9DTlQgPSAwOyAvLyY9IH5ERVNDX0RNQV9PV05FRDsKIAkJCQlpZmJwLT5JRkJfRmlyc3REZXNjW3R4X3J4X2ZsYWddID0gZGVzY3A7CiAvLyBwYXJ0IG9mIGFsdGVybmF0aXZlIGlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSA9IGlmYnAtPklGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10gPSBkZXNjcDsKLQkJCQkJCQkJCQkJCQkvLyBpZiAicmVjeWNsaW5nIiBhIEZyYW1lTGlzdAotCQkJCQkJCQkJCQkJCS8vIChlLmcuIGNhbGxlZCBmcm9tIGhjZl9jbnRsKCBIQ0ZfQ05UTF9FTkFCTEUgKQotCQkJCQkJCQkJCQkJCS8vIC4gIHByZXBhcmUgZm9yIGFjdGl2YXRpb24gRE1BIGNvbnRyb2xsZXIKKwkJCQkgICAgICAgICAgICAgICAgLy8gaWYgInJlY3ljbGluZyIgYSBGcmFtZUxpc3QKKwkJCQkgICAgICAgICAgICAgICAgLy8gKGUuZy4gY2FsbGVkIGZyb20gaGNmX2NudGwoIEhDRl9DTlRMX0VOQUJMRSApCisJCQkJICAgICAgICAgICAgICAgIC8vIC4gIHByZXBhcmUgZm9yIGFjdGl2YXRpb24gRE1BIGNvbnRyb2xsZXIKIC8vIHBhcnQgb2YgYWx0ZXJuYXRpdmUgZGVzY3AgPSBkZXNjcC0+bmV4dF9kZXNjX2FkZHI7Ci0JCQl9IGVsc2UgewkJCQkJCQkJLy9hICJyZWFsIiBGcmFtZUxpc3QsIGhhbmQgaXQgb3ZlciB0byB0aGUgRE1BIGVuZ2luZQotCQkJCUhDRkFTU0VSVCggaWZicC0+SUZCX0ZpcnN0RGVzY1t0eF9yeF9mbGFnXSwgKGhjZl8zMilkZXNjcCApCi0JCQkJSENGQVNTRVJUKCBpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10sIChoY2ZfMzIpZGVzY3AgKQorCQkJfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYSAicmVhbCIgRnJhbWVMaXN0LCBoYW5kIGl0IG92ZXIgdG8gdGhlIERNQSBlbmdpbmUKKwkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9GaXJzdERlc2NbdHhfcnhfZmxhZ10sIChoY2ZfMzIpZGVzY3AgKTsKKwkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXSwgKGhjZl8zMilkZXNjcCApOwogCQkJCUhDRkFTU0VSVCggaWZicC0+SUZCX0xhc3REZXNjW3R4X3J4X2ZsYWddLT5uZXh0X2Rlc2NfYWRkciA9PSBOVUxMLAotCQkJCQkJICAgKGhjZl8zMilpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10tPm5leHRfZGVzY19hZGRyKQorCQkJCQkgICAoaGNmXzMyKWlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXS0+bmV4dF9kZXNjX2FkZHIpOwogLy8JCQkJcC0+YnVmX2NudGwuY250bF9zdGF0IHw9IERFU0NfRE1BX09XTkVEOwogCQkJCWlmYnAtPklGQl9MYXN0RGVzY1t0eF9yeF9mbGFnXS0+bmV4dF9kZXNjX2FkZHIgPSBkZXNjcDsKIAkJCQlpZmJwLT5JRkJfTGFzdERlc2NbdHhfcnhfZmxhZ10tPm5leHRfZGVzY19waHlzX2FkZHIgPSBkZXNjcC0+ZGVzY19waHlzX2FkZHI7CiAJCQkJcG9ydCA9IEhSRUdfUlhETUFfUFRSMzI7CiAJCQkJaWYgKCB0eF9yeF9mbGFnICkgewotCQkJCQlwLT5CVUZfU0laRSB8PSBERVNDX0VPUDsJLy8gcCBwb2ludHMgYXQgdGhlIGxhc3QgZGVzY3JpcHRvciBpbiB0aGUgY2FsbGVyLXN1cHBsaWVkIGRlc2NyaXB0b3IgY2hhaW4KKwkJCQkJcC0+QlVGX1NJWkUgfD0gREVTQ19FT1A7ICAgIC8vIHAgcG9pbnRzIGF0IHRoZSBsYXN0IGRlc2NyaXB0b3IgaW4gdGhlIGNhbGxlci1zdXBwbGllZCBkZXNjcmlwdG9yIGNoYWluCiAJCQkJCWRlc2NwLT5CVUZfU0laRSB8PSBERVNDX1NPUDsKIAkJCQkJcG9ydCA9IEhSRUdfVFhETUFfUFRSMzI7CiAJCQkJfQpAQCAtMTQ1OSw3OSArMTQyNSw3NSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSouTU9EVUxFCQlERVNDX1NUUkNUKiBoY2ZfZG1hX3J4X2dldCggSUZCUCBpZmJwICkKLSouUFVSUE9TRQkJZGVjYXBzdWxhdGUgYSBtZXNzYWdlIGFuZCBwcm92aWRlcyB0aGF0IG1lc3NhZ2UgdG8gdGhlIE1TRi4KLSoJCQkJcmVjbGFpbSBhbGwgZGVzY3JpcHRvcnMgaW4gdGhlIHJ4IGRlc2NyaXB0b3IgY2hhaW4uCi0qCi0qLkFSR1VNRU5UUwotKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKLSoKLSouUkVUVVJOUwotKglwb2ludGVyIHRvIGEgRnJhbWVMaXN0Ci0qCi0qLkRFU0NSSVBUSU9OCi0qIGhjZl9kbWFfcnhfZ2V0IGlzIGludGVuZGVkIHRvICByZXR1cm4gYSByZWNlaXZlZCBmcmFtZSB3aGVuIHN1Y2ggYSBmcmFtZSBpcyBkZXBvc2l0ZWQgaW4gSG9zdCBtZW1vcnkgYnkgdGhlCi0qIERNQSBlbmdpbmUuIEluIGFkZGl0aW9uIGhjZl9kbWFfcnhfZ2V0IGNhbiBiZSB1c2VkIHRvIHJlY2xhaW0gYWxsIGRlc2NyaXB0b3JzIGluIHRoZSByeCBkZXNjcmlwdG9yIGNoYWluCi0qIHdoZW4gdGhlIERNQSBFbmdpbmUgaXMgZGlzYWJsZWQsIGUuZy4gYXMgcGFydCBvZiBhIGRyaXZlciB1bmxvYWRpbmcgc3RyYXRlZ3kuCi0qIGhjZl9kbWFfcnhfZ2V0IG11c3QgYmUgY2FsbGVkIHJlcGVhdGVkbHkgYnkgdGhlIE1TRiB3aGVuIGhjZl9zZXJ2aWNlX25pYyBzaWduYWxzIGF2YWlsYWJpbGl0eSBvZiBhIHJ4IGZyYW1lCi0qIHRocm91Z2ggdGhlIEhSRUdfRVZfUkRNQUQgZmxhZyBvZiBJRkJfRG1hUGFja2V0cy4gVGhlIGNhbGxpbmcgbXVzdCBzdG9wIHdoZW4gYSBOVUxMIHBvaW50ZXIgaXMgcmV0dXJuZWQsIGF0Ci0qIHdoaWNoIHRpbWUgdGhlIEhSRUdfRVZfUkRNQUQgZmxhZyBpcyBhbHNvIGNsZWFyZWQgYnkgdGhlIEhDRiB0byBhcm0gdGhlIG1lY2hhbmlzbSBmb3IgdGhlIG5leHQgZnJhbWUKLSogcmVjZXB0aW9uLgotKiBSZWdhcmRsZXNzIHdoZXRoZXIgdGhlIERNQSBFbmdpbmUgaXMgY3VycmVudGx5IGVuYWJsZWQgKGFzIGNvbnRyb2xsZWQgdmlhIGhjZl9jbnRsKSwgaWYgdGhlIERNQSBjb250cm9sbGVyCi0qIGRlcG9zaXRlZCBhbiBSeC1mcmFtZSBpbiB0aGUgUngtRGVzY3JpcHRvckxpc3QsIHRoaXMgZnJhbWUgaXMgZGV0YWNoZWQgZnJvbSB0aGUgUngtRGVzY3JpcHRvckxpc3QsCi0qIHRyYW5zZm9ybWVkIGludG8gYSBGcmFtZUxpc3QgKGkuZS4gIHVwZGF0aW5nIHRoZSBob3VzZWtlZXBpbmcgZmllbGRzIGluIHRoZSBkZXNjcmlwdG9ycykgYW5kIHJldHVybmVkIHRvIHRoZQotKiBjYWxsZXIuCi0qIElmIG5vIHN1Y2ggUngtZnJhbWUgaXMgYXZhaWxhYmxlIGluIHRoZSBSeC1EZXNjcmlwdG9yTGlzdCwgdGhlIGJlaGF2aW9yIG9mIGhjZl9kbWFfcnhfZ2V0IGRlcGVuZHMgb24gdGhlCi0qIHN0YXR1cyBvZiB0aGUgRE1BIEVuZ2luZS4KLSogSWYgdGhlIERNQSBFbmdpbmUgaXMgZW5hYmxlZCwgYSBOVUxMIHBvaW50ZXIgaXMgcmV0dXJuZWQuCi0qIElmIHRoZSBETUEgRW5naW5lIGlzIGRpc2FibGVkLCB0aGUgZm9sbG93aW5nIHN0cmF0ZWd5IGlzIHVzZWQ6Ci0qIC0gdGhlIGNvbXBsZXRlIFJ4LURlc2NyaXB0b3JMaXN0IGlzIHJldHVybmVkLiBUaGUgREVMV0EgRGVzY3JpcHRvciBpcyBub3QgcGFydCBvZiB0aGUgUngtRGVzY3JpcHRvckxpc3QuCi0qIC0gSWYgdGhlcmUgaXMgbm8gUngtRGVzY3JpcHRvckxpc3QsIHRoZSBERUxXQSBEZXNjcmlwdG9yIGlzIHJldHVybmVkLgotKiAtIElmIHRoZXJlIGlzIG5vIERFTFdBIERlc2NyaXB0b3IsIGEgTlVMTCBwb2ludGVyIGlzIHJldHVybmVkLgotKgotKiBJZiB0aGUgTVNGIHBlcmZvcm1zIGFuIGRpc2FibGUvZW5hYmxlIHNlcXVlbmNlIHdpdGhvdXQgZXhoYXVzdGluZyB0aGUgUngtRGVzY3JpcHRvckxpc3QgYXMgZGVzY3JpYmVkIGFib3ZlLAotKiB0aGUgZW5hYmxlIGNvbW1hbmQgd2lsbCByZXNldCBhbGwgaG91c2Uga2VlcGluZyBpbmZvcm1hdGlvbiwgaS5lLiBhbHJlYWR5IHJlY2VpdmVkIGJ1dCBub3QgeWV0IGJ5IHRoZSBNU0YKLSogcmV0cmlldmVkIGZyYW1lcyBhcmUgbG9zdCBhbmQgdGhlIG5leHQgZnJhbWUgd2lsbCBiZSByZWNlaXZlZCBzdGFydGluZyB3aXRoIHRoZSBvbGRlc3QgZGVzY3JpcHRvci4KLSoKLSogVGhlIEhDRiBjYW4gYmUgdXNlZCBpbiAyIGZhc2hpb25zOiB3aXRoIGFuZCB3aXRob3V0IGRlY2Fwc3VsYXRpb24gZm9yIGRhdGEgdHJhbnNmZXIuCi0qIFRoaXMgaXMgY29udHJvbGxlZCBhdCBjb21waWxlIHRpbWUgYnkgdGhlIEhDRl9FTkMgYml0IG9mIHRoZSBIQ0ZfRU5DQVAgc3lzdGVtIGNvbnN0YW50LgotKiBJZiBhcHByb3ByaWF0ZSwgZGVjYXBzdWxhdGlvbiBpcyBkb25lIGJ5IG1vdmluZyBzb21lIGRhdGEgaW5zaWRlIHRoZSBidWZmZXJzIGFuZCB1cGRhdGluZyB0aGUgZGVzY3JpcHRvcnMKLSogYWNjb3JkaW5nbHkuCi0qISEgOz8/Pz8/d2hlcmUgZGlkIEkgZGVzY3JpYmUgd2h5IGEgc2ltcGxlIG1hbmlwdWxhdGlvbiB3aXRoIHRoZSBjb3VudCB2YWx1ZXMgZG9lcyBub3Qgc3VmZmljZT8KLSoKLSouRElBR1JBTQotKgotKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqCisgKi5NT0RVTEUgICAgICAgIERFU0NfU1RSQ1QqIGhjZl9kbWFfcnhfZ2V0KCBJRkJQIGlmYnAgKQorICouUFVSUE9TRSAgICAgICBkZWNhcHN1bGF0ZSBhIG1lc3NhZ2UgYW5kIHByb3ZpZGVzIHRoYXQgbWVzc2FnZSB0byB0aGUgTVNGLgorICogICAgICAgICAgICAgICByZWNsYWltIGFsbCBkZXNjcmlwdG9ycyBpbiB0aGUgcnggZGVzY3JpcHRvciBjaGFpbi4KKyAqCisgKi5BUkdVTUVOVFMKKyAqICAgaWZicCAgICAgICAgYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisgKgorICouUkVUVVJOUworICogICBwb2ludGVyIHRvIGEgRnJhbWVMaXN0CisgKgorICouREVTQ1JJUFRJT04KKyAqIGhjZl9kbWFfcnhfZ2V0IGlzIGludGVuZGVkIHRvICByZXR1cm4gYSByZWNlaXZlZCBmcmFtZSB3aGVuIHN1Y2ggYSBmcmFtZSBpcyBkZXBvc2l0ZWQgaW4gSG9zdCBtZW1vcnkgYnkgdGhlCisgKiBETUEgZW5naW5lLiBJbiBhZGRpdGlvbiBoY2ZfZG1hX3J4X2dldCBjYW4gYmUgdXNlZCB0byByZWNsYWltIGFsbCBkZXNjcmlwdG9ycyBpbiB0aGUgcnggZGVzY3JpcHRvciBjaGFpbgorICogd2hlbiB0aGUgRE1BIEVuZ2luZSBpcyBkaXNhYmxlZCwgZS5nLiBhcyBwYXJ0IG9mIGEgZHJpdmVyIHVubG9hZGluZyBzdHJhdGVneS4KKyAqIGhjZl9kbWFfcnhfZ2V0IG11c3QgYmUgY2FsbGVkIHJlcGVhdGVkbHkgYnkgdGhlIE1TRiB3aGVuIGhjZl9zZXJ2aWNlX25pYyBzaWduYWxzIGF2YWlsYWJpbGl0eSBvZiBhIHJ4IGZyYW1lCisgKiB0aHJvdWdoIHRoZSBIUkVHX0VWX1JETUFEIGZsYWcgb2YgSUZCX0RtYVBhY2tldHMuIFRoZSBjYWxsaW5nIG11c3Qgc3RvcCB3aGVuIGEgTlVMTCBwb2ludGVyIGlzIHJldHVybmVkLCBhdAorICogd2hpY2ggdGltZSB0aGUgSFJFR19FVl9SRE1BRCBmbGFnIGlzIGFsc28gY2xlYXJlZCBieSB0aGUgSENGIHRvIGFybSB0aGUgbWVjaGFuaXNtIGZvciB0aGUgbmV4dCBmcmFtZQorICogcmVjZXB0aW9uLgorICogUmVnYXJkbGVzcyB3aGV0aGVyIHRoZSBETUEgRW5naW5lIGlzIGN1cnJlbnRseSBlbmFibGVkIChhcyBjb250cm9sbGVkIHZpYSBoY2ZfY250bCksIGlmIHRoZSBETUEgY29udHJvbGxlcgorICogZGVwb3NpdGVkIGFuIFJ4LWZyYW1lIGluIHRoZSBSeC1EZXNjcmlwdG9yTGlzdCwgdGhpcyBmcmFtZSBpcyBkZXRhY2hlZCBmcm9tIHRoZSBSeC1EZXNjcmlwdG9yTGlzdCwKKyAqIHRyYW5zZm9ybWVkIGludG8gYSBGcmFtZUxpc3QgKGkuZS4gIHVwZGF0aW5nIHRoZSBob3VzZWtlZXBpbmcgZmllbGRzIGluIHRoZSBkZXNjcmlwdG9ycykgYW5kIHJldHVybmVkIHRvIHRoZQorICogY2FsbGVyLgorICogSWYgbm8gc3VjaCBSeC1mcmFtZSBpcyBhdmFpbGFibGUgaW4gdGhlIFJ4LURlc2NyaXB0b3JMaXN0LCB0aGUgYmVoYXZpb3Igb2YgaGNmX2RtYV9yeF9nZXQgZGVwZW5kcyBvbiB0aGUKKyAqIHN0YXR1cyBvZiB0aGUgRE1BIEVuZ2luZS4KKyAqIElmIHRoZSBETUEgRW5naW5lIGlzIGVuYWJsZWQsIGEgTlVMTCBwb2ludGVyIGlzIHJldHVybmVkLgorICogSWYgdGhlIERNQSBFbmdpbmUgaXMgZGlzYWJsZWQsIHRoZSBmb2xsb3dpbmcgc3RyYXRlZ3kgaXMgdXNlZDoKKyAqIC0gdGhlIGNvbXBsZXRlIFJ4LURlc2NyaXB0b3JMaXN0IGlzIHJldHVybmVkLiBUaGUgREVMV0EgRGVzY3JpcHRvciBpcyBub3QgcGFydCBvZiB0aGUgUngtRGVzY3JpcHRvckxpc3QuCisgKiAtIElmIHRoZXJlIGlzIG5vIFJ4LURlc2NyaXB0b3JMaXN0LCB0aGUgREVMV0EgRGVzY3JpcHRvciBpcyByZXR1cm5lZC4KKyAqIC0gSWYgdGhlcmUgaXMgbm8gREVMV0EgRGVzY3JpcHRvciwgYSBOVUxMIHBvaW50ZXIgaXMgcmV0dXJuZWQuCisgKgorICogSWYgdGhlIE1TRiBwZXJmb3JtcyBhbiBkaXNhYmxlL2VuYWJsZSBzZXF1ZW5jZSB3aXRob3V0IGV4aGF1c3RpbmcgdGhlIFJ4LURlc2NyaXB0b3JMaXN0IGFzIGRlc2NyaWJlZCBhYm92ZSwKKyAqIHRoZSBlbmFibGUgY29tbWFuZCB3aWxsIHJlc2V0IGFsbCBob3VzZSBrZWVwaW5nIGluZm9ybWF0aW9uLCBpLmUuIGFscmVhZHkgcmVjZWl2ZWQgYnV0IG5vdCB5ZXQgYnkgdGhlIE1TRgorICogcmV0cmlldmVkIGZyYW1lcyBhcmUgbG9zdCBhbmQgdGhlIG5leHQgZnJhbWUgd2lsbCBiZSByZWNlaXZlZCBzdGFydGluZyB3aXRoIHRoZSBvbGRlc3QgZGVzY3JpcHRvci4KKyAqCisgKiBUaGUgSENGIGNhbiBiZSB1c2VkIGluIDIgZmFzaGlvbnM6IHdpdGggYW5kIHdpdGhvdXQgZGVjYXBzdWxhdGlvbiBmb3IgZGF0YSB0cmFuc2Zlci4KKyAqIFRoaXMgaXMgY29udHJvbGxlZCBhdCBjb21waWxlIHRpbWUgYnkgdGhlIEhDRl9FTkMgYml0IG9mIHRoZSBIQ0ZfRU5DQVAgc3lzdGVtIGNvbnN0YW50LgorICogSWYgYXBwcm9wcmlhdGUsIGRlY2Fwc3VsYXRpb24gaXMgZG9uZSBieSBtb3Zpbmcgc29tZSBkYXRhIGluc2lkZSB0aGUgYnVmZmVycyBhbmQgdXBkYXRpbmcgdGhlIGRlc2NyaXB0b3JzCisgKiBhY2NvcmRpbmdseS4KKyAqISEgOz8/Pz8/d2hlcmUgZGlkIEkgZGVzY3JpYmUgd2h5IGEgc2ltcGxlIG1hbmlwdWxhdGlvbiB3aXRoIHRoZSBjb3VudCB2YWx1ZXMgZG9lcyBub3Qgc3VmZmljZT8KKyAqCisgKi5ESUFHUkFNCisgKgorICouRU5ERE9DICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogREVTQ19TVFJDVCoKIGhjZl9kbWFfcnhfZ2V0IChJRkJQIGlmYnApCiB7Ci1ERVNDX1NUUkNUICpkZXNjcDsJLy8gcG9pbnRlciB0byBzdGFydCBvZiBGcmFtZUxpc3QKKwlERVNDX1NUUkNUICpkZXNjcDsgIC8vIHBvaW50ZXIgdG8gc3RhcnQgb2YgRnJhbWVMaXN0CiAKIAlkZXNjcCA9IGdldF9mcmFtZV9sc3QoIGlmYnAsIERNQV9SWCApOwotCWlmICggZGVzY3AgJiYgZGVzY3AtPmJ1Zl9hZGRyICkgIC8vIWJlIGF3YXJlIG9mIHRoZSBtaXNzaW5nIGN1cmx5IGJyYWNrZXQKKwlpZiAoIGRlc2NwICYmIGRlc2NwLT5idWZfYWRkciApIHsKIAotCQkJCQkJCQkJCQkvL3NraXAgZGVjYXBzdWxhdGlvbiBhdCBjb25maW5lZCBkZXNjcmlwdG9yCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9za2lwIGRlY2Fwc3VsYXRpb24gYXQgY29uZmluZWQgZGVzY3JpcHRvcgogI2lmIChIQ0ZfRU5DQVApID09IEhDRl9FTkMKLSNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYCi0JaWYgKCBpZmJwLT5JRkJfQ0tJUFN0YXQgPT0gSENGX0FDVF9DQ1hfT0ZGICkKLSNlbmRpZiAvLyBIQ0ZfVFlQRV9DQ1gKLSAgICB7Ci1pbnQgaTsKLURFU0NfU1RSQ1QgKnAgPSBkZXNjcC0+bmV4dF9kZXNjX2FkZHI7CS8vcG9pbnRlciB0byAybmQgZGVzY3JpcHRvciBvZiBmcmFtZQotCQlIQ0ZBU1NFUlQocCwgMCkKKwkJaW50IGk7CisJCURFU0NfU1RSQ1QgKnAgPSBkZXNjcC0+bmV4dF9kZXNjX2FkZHI7ICAvL3BvaW50ZXIgdG8gMm5kIGRlc2NyaXB0b3Igb2YgZnJhbWUKKwkJSENGQVNTRVJUKHAsIDApOwogCQkvLyBUaGUgMm5kIGRlc2NyaXB0b3IgY29udGFpbnMgKG1heWJlKSBhIFNOQVAgaGVhZGVyIHBsdXMgcGFydCBvciB3aG9sZSBvZiB0aGUgcGF5bG9hZC4KIAkJLy9kZXRlcm1pbmUgZGVjYXBzdWxhdGlvbiBzdWItZmxhZyBpbiBSeEZTCiAJCWkgPSAqKHdjaV9yZWNvcmRwKSZkZXNjcC0+YnVmX2FkZHJbSEZTX1NUQVRdICYgKCBIRlNfU1RBVF9NU0dfVFlQRSB8IEhGU19TVEFUX0VSUiApOwogCQlpZiAoIGkgPT0gSEZTX1NUQVRfVFVOTkVMIHx8Ci0JCQkgKCBpID09IEhGU19TVEFUXzEwNDIgJiYgaGNmX2VuY2FwKCAod2NpX2J1ZnApJnAtPmJ1Zl9hZGRyW0hDRl9EQVNBX1NJWkVdICkgIT0gRU5DX1RVTk5FTCApKSB7CisJCSAgICAgKCBpID09IEhGU19TVEFUXzEwNDIgJiYgaGNmX2VuY2FwKCAod2NpX2J1ZnApJnAtPmJ1Zl9hZGRyW0hDRl9EQVNBX1NJWkVdICkgIT0gRU5DX1RVTk5FTCApKSB7CiAJCQkvLyBUaGUgMm5kIGRlc2NyaXB0b3IgY29udGFpbnMgYSBTTkFQIGhlYWRlciBwbHVzIHBhcnQgb3Igd2hvbGUgb2YgdGhlIHBheWxvYWQuCi0JCQlIQ0ZBU1NFUlQoIHAtPkJVRl9DTlQgPT0gKHAtPmJ1Zl9hZGRyWzVdICsgKHAtPmJ1Zl9hZGRyWzRdPDw4KSArIDIqNiArIDIgLSA4KSwgcC0+QlVGX0NOVCApCisJCQlIQ0ZBU1NFUlQoIHAtPkJVRl9DTlQgPT0gKHAtPmJ1Zl9hZGRyWzVdICsgKHAtPmJ1Zl9hZGRyWzRdPDw4KSArIDIqNiArIDIgLSA4KSwgcC0+QlVGX0NOVCApOwogCQkJLy8gcGVyZm9ybSBkZWNhcHN1bGF0aW9uCi0JCQlIQ0ZBU1NFUlQocC0+QlVGX1NJWkUgPj04LCBwLT5CVUZfU0laRSkKKwkJCUhDRkFTU0VSVChwLT5CVUZfU0laRSA+PTgsIHAtPkJVRl9TSVpFKTsKIAkJCS8vIG1vdmUgU0FbMjo1XSBpbiB0aGUgc2Vjb25kIGJ1ZmZlciB0byByZXBsYWNlIHBhcnQgb2YgdGhlIFNOQVAgaGVhZGVyCiAJCQlmb3IgKCBpPTM7IGkgPj0gMDsgaS0tKSBwLT5idWZfYWRkcltpKzhdID0gcC0+YnVmX2FkZHJbaV07CiAJCQkvLyBjb3B5IERBWzA6NV0sIFNBWzA6MV0gZnJvbSBmaXJzdCBidWZmZXIgdG8gc2Vjb25kIGJ1ZmZlcgpAQCAtMTU0Miw1MzIgKzE1MDQsNDk0IEBACiAJfQogI2VuZGlmIC8vIEhDRl9FTkMKIAlpZiAoIGRlc2NwID09IE5VTEwgKSBpZmJwLT5JRkJfRG1hUGFja2V0cyAmPSAoaGNmXzE2KX5IUkVHX0VWX1JETUFEOyAgLy87P2NvdWxkIGJlIGludGVncmF0ZWQgaW50byBnZXRfZnJhbWVfbHN0Ci0JSENGTE9HRVhJVCggSENGX1RSQUNFX0RNQV9SWF9HRVQgKQorCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9ETUFfUlhfR0VUICk7CiAJcmV0dXJuIGRlc2NwOwogfSAvLyBoY2ZfZG1hX3J4X2dldAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSouTU9EVUxFCQl2b2lkIGhjZl9kbWFfcnhfcHV0KCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwICkKLSouUFVSUE9TRQkJc3VwcGx5IGJ1ZmZlcnMgZm9yIHJlY2VpdmUgcHVycG9zZXMuCi0qCQkJCXN1cHBseSB0aGUgUngtREVMV0EgZGVzY3JpcHRvci4KLSoKLSouQVJHVU1FTlRTCi0qCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawotKglkZXNjcAkJYWRkcmVzcyBvZiBhIERlc2NyaXB0b3JMaXN0Ci0qCi0qLlJFVFVSTlMJCU4uQS4KLSoKLSouREVTQ1JJUFRJT04KLSogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIE1TRiB0byBzdXBwbHkgdGhlIEhDRiB3aXRoIG5ldy9tb3JlIGJ1ZmZlcnMgZm9yIHJlY2VpdmUgcHVycG9zZXMuCi0qIFRoZSBIQ0YgY2FuIGJlIHVzZWQgaW4gMiBmYXNoaW9uczogd2l0aCBhbmQgd2l0aG91dCBlbmNhcHN1bGF0aW9uIGZvciBkYXRhIHRyYW5zZmVyLgotKiBUaGlzIGlzIGNvbnRyb2xsZWQgYXQgY29tcGlsZSB0aW1lIGJ5IHRoZSBIQ0ZfRU5DIGJpdCBvZiB0aGUgSENGX0VOQ0FQIHN5c3RlbSBjb25zdGFudC4KLSogQXMgYSBjb25zZXF1ZW5jZSwgc29tZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFwcGx5IHRvIHRoZSBudW1iZXIgb2YgZGVzY3JpcHRvciBhbmQgdGhlIGJ1ZmZlcnMgYXNzb2NpYXRlZAotKiB3aXRoIHRoZSBmaXJzdCAyIGRlc2NyaXB0b3JzLiBJbmRlcGVuZGVudCBvZiB0aGUgZW5jYXBzdWxhdGlvbiBmZWF0dXJlLCB0aGUgQ09VTlQgZmllbGRzIGFyZSBpZ25vcmVkLgotKiBBIHNwZWNpYWwgY2FzZSBpcyB0aGUgc3VwcGx5aW5nIG9mIHRoZSBERUxXQSBkZXNjcmlwdG9yLCB3aGljaCBtdXN0IGJlIHN1cHBsaWVkIGFzIHRoZSBmaXJzdCBkZXNjcmlwdG9yLgotKgotKiBBc3NlcnQgZmFpbHMgaWYKLSogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCi0qIC0gTklDIGludGVycnVwdHMgYXJlIG5vdCBkaXNhYmxlZCB3aGlsZSByZXF1aXJlZCBieSBwYXJhbWV0ZXIgYWN0aW9uLgotKiAtIGluIGNhc2UgZGVjYXBzdWxhdGlvbiBieSB0aGUgSENGIGlzIHNlbGVjdGVkOgotKgkgIC0JVGhlIGZpcnN0IGRhdGFidWZmZXIgZG9lcyBub3QgaGF2ZSB0aGUgZXhhY3Qgc2l6ZSBjb3JyZXNwb25kaW5nIHdpdGggdGhlIFJ4RlMgdXAgdG8gdGhlIDgwMi4zIERlc3RBZGRyCi0qCQlmaWVsZCAoPT0gMjkgd29yZHMpLgotKgkgIC0JVGhlIEZyYW1lTGlzdCBkb2VzIG5vdCBjb25zaXN0cyBvZiBhdCBsZWFzdCAyIERlc2NyaXB0b3JzLgotKgkgIC0JVGhlIHNlY29uZCBkYXRhYnVmZmVyIGRvZXMgbm90IGhhdmUgdGhlIG1pbmltdW0gc2l6ZSBvZiA4IGJ5dGVzLgotKiEhIFRoZSAybmQgcGFydCBvZiB0aGUgbGlzdCBvZiBhc3NlcnRzIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCBwdXRfZnJhbWVfbHN0LCBpbiBvcmRlciB0byBnZXQKLSohISB0aGVtIGluIHRoZSBXQ0ktc3BlYyAhISEhCi0qIC0gRE1BIGlzIG5vdCBlbmFibGVkCi0qIC0gZGVzY3JpcHRvciBsaXN0IGlzIE5VTEwKLSogLSBhIGRlc2NyaXB0b3IgaW4gdGhlIGRlc2NyaXB0b3IgbGlzdCBpcyBub3QgZG91YmxlIHdvcmQgYWxpZ25lZAotKiAtIGEgY291bnQgb2Ygc2l6ZSBmaWVsZCBvZiBhIGRlc2NyaXB0b3IgY29udGFpbnMgY29udHJvbCBiaXRzLCBpLmUuIGJpdHMgaW4gdGhlIGhpZ2ggb3JkZXIgbmliYmxlLgotKiAtIHRoZSBERUxXQSBkZXNjcmlwdG9yIGlzIG5vdCBhICJzaW5nbGV0b24iIERlc2NyaXB0b3JMaXN0LgotKiAtIHRoZSBERUxXQSBkZXNjcmlwdG9yIGlzIG5vdCB0aGUgZmlyc3QgRGVzY3JpcHRvciBzdXBwbGllZAotKiAtIGEgbm9uX0RNQSBkZXNjcmlwdG9yIGlzIHN1cHBsaWVkIGJlZm9yZSB0aGUgREVMV0EgRGVzY3JpcHRvciBpcyBzdXBwbGllZAotKiEhIC0gUG9zc2libHkgbW9yZSBjaGVja3MgY291bGQgYmUgYWRkZWQgISEhISEhISEhISEhIQotKgotKi5ESUFHUkFNCi0qCi0qCi0qLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoKKyAqLk1PRFVMRSAgICAgICAgdm9pZCBoY2ZfZG1hX3J4X3B1dCggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCApCisgKi5QVVJQT1NFICAgICAgIHN1cHBseSBidWZmZXJzIGZvciByZWNlaXZlIHB1cnBvc2VzLgorICogICAgICAgICAgICAgICBzdXBwbHkgdGhlIFJ4LURFTFdBIGRlc2NyaXB0b3IuCisgKgorICouQVJHVU1FTlRTCisgKiAgIGlmYnAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworICogICBkZXNjcCAgICAgICBhZGRyZXNzIG9mIGEgRGVzY3JpcHRvckxpc3QKKyAqCisgKi5SRVRVUk5TICAgICAgIE4uQS4KKyAqCisgKi5ERVNDUklQVElPTgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIE1TRiB0byBzdXBwbHkgdGhlIEhDRiB3aXRoIG5ldy9tb3JlIGJ1ZmZlcnMgZm9yIHJlY2VpdmUgcHVycG9zZXMuCisgKiBUaGUgSENGIGNhbiBiZSB1c2VkIGluIDIgZmFzaGlvbnM6IHdpdGggYW5kIHdpdGhvdXQgZW5jYXBzdWxhdGlvbiBmb3IgZGF0YSB0cmFuc2Zlci4KKyAqIFRoaXMgaXMgY29udHJvbGxlZCBhdCBjb21waWxlIHRpbWUgYnkgdGhlIEhDRl9FTkMgYml0IG9mIHRoZSBIQ0ZfRU5DQVAgc3lzdGVtIGNvbnN0YW50LgorICogQXMgYSBjb25zZXF1ZW5jZSwgc29tZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIGFwcGx5IHRvIHRoZSBudW1iZXIgb2YgZGVzY3JpcHRvciBhbmQgdGhlIGJ1ZmZlcnMgYXNzb2NpYXRlZAorICogd2l0aCB0aGUgZmlyc3QgMiBkZXNjcmlwdG9ycy4gSW5kZXBlbmRlbnQgb2YgdGhlIGVuY2Fwc3VsYXRpb24gZmVhdHVyZSwgdGhlIENPVU5UIGZpZWxkcyBhcmUgaWdub3JlZC4KKyAqIEEgc3BlY2lhbCBjYXNlIGlzIHRoZSBzdXBwbHlpbmcgb2YgdGhlIERFTFdBIGRlc2NyaXB0b3IsIHdoaWNoIG11c3QgYmUgc3VwcGxpZWQgYXMgdGhlIGZpcnN0IGRlc2NyaXB0b3IuCisgKgorICogQXNzZXJ0IGZhaWxzIGlmCisgKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KKyAqIC0gTklDIGludGVycnVwdHMgYXJlIG5vdCBkaXNhYmxlZCB3aGlsZSByZXF1aXJlZCBieSBwYXJhbWV0ZXIgYWN0aW9uLgorICogLSBpbiBjYXNlIGRlY2Fwc3VsYXRpb24gYnkgdGhlIEhDRiBpcyBzZWxlY3RlZDoKKyAqICAgICAtIFRoZSBmaXJzdCBkYXRhYnVmZmVyIGRvZXMgbm90IGhhdmUgdGhlIGV4YWN0IHNpemUgY29ycmVzcG9uZGluZyB3aXRoIHRoZSBSeEZTIHVwIHRvIHRoZSA4MDIuMyBEZXN0QWRkcgorICogICAgICAgZmllbGQgKD09IDI5IHdvcmRzKS4KKyAqICAgICAtIFRoZSBGcmFtZUxpc3QgZG9lcyBub3QgY29uc2lzdHMgb2YgYXQgbGVhc3QgMiBEZXNjcmlwdG9ycy4KKyAqICAgICAtIFRoZSBzZWNvbmQgZGF0YWJ1ZmZlciBkb2VzIG5vdCBoYXZlIHRoZSBtaW5pbXVtIHNpemUgb2YgOCBieXRlcy4KKyAqISEgVGhlIDJuZCBwYXJ0IG9mIHRoZSBsaXN0IG9mIGFzc2VydHMgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHB1dF9mcmFtZV9sc3QsIGluIG9yZGVyIHRvIGdldAorICohISB0aGVtIGluIHRoZSBXQ0ktc3BlYyAhISEhCisgKiAtIERNQSBpcyBub3QgZW5hYmxlZAorICogLSBkZXNjcmlwdG9yIGxpc3QgaXMgTlVMTAorICogLSBhIGRlc2NyaXB0b3IgaW4gdGhlIGRlc2NyaXB0b3IgbGlzdCBpcyBub3QgZG91YmxlIHdvcmQgYWxpZ25lZAorICogLSBhIGNvdW50IG9mIHNpemUgZmllbGQgb2YgYSBkZXNjcmlwdG9yIGNvbnRhaW5zIGNvbnRyb2wgYml0cywgaS5lLiBiaXRzIGluIHRoZSBoaWdoIG9yZGVyIG5pYmJsZS4KKyAqIC0gdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IGEgInNpbmdsZXRvbiIgRGVzY3JpcHRvckxpc3QuCisgKiAtIHRoZSBERUxXQSBkZXNjcmlwdG9yIGlzIG5vdCB0aGUgZmlyc3QgRGVzY3JpcHRvciBzdXBwbGllZAorICogLSBhIG5vbl9ETUEgZGVzY3JpcHRvciBpcyBzdXBwbGllZCBiZWZvcmUgdGhlIERFTFdBIERlc2NyaXB0b3IgaXMgc3VwcGxpZWQKKyAqISEgLSBQb3NzaWJseSBtb3JlIGNoZWNrcyBjb3VsZCBiZSBhZGRlZCAhISEhISEhISEhISEhCisgKgorICouRElBR1JBTQorICoKKyAqCisgKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZAogaGNmX2RtYV9yeF9wdXQoIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AgKQogewogCi0JSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9ETUFfUlhfUFVULCAweERBMDEgKQotCUhDRkFTU0VSVCggaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQywgaWZicC0+SUZCX01hZ2ljICkKLQlIQ0ZBU1NFUlRfSU5UCisJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9ETUFfUlhfUFVULCAweERBMDEgKTsKKwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApOworCUhDRkFTU0VSVF9JTlQ7CiAKIAlwdXRfZnJhbWVfbHN0KCBpZmJwLCBkZXNjcCwgRE1BX1JYICk7CiAjaWYgSENGX0FTU0VSVCAmJiAoSENGX0VOQ0FQKSA9PSBIQ0ZfRU5DCiAJaWYgKCBkZXNjcC0+YnVmX2FkZHIgKSB7Ci0JCUhDRkFTU0VSVCggZGVzY3AtPkJVRl9TSVpFID09IEhDRl9ETUFfUlhfQlVGMV9TSVpFLCBkZXNjcC0+QlVGX1NJWkUgKQotCQlIQ0ZBU1NFUlQoIGRlc2NwLT5uZXh0X2Rlc2NfYWRkciwgMCApIC8vIGZpcnN0IGRlc2NyaXB0b3Igc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGFub3RoZXIgZGVzY3JpcHRvcgorCQlIQ0ZBU1NFUlQoIGRlc2NwLT5CVUZfU0laRSA9PSBIQ0ZfRE1BX1JYX0JVRjFfU0laRSwgZGVzY3AtPkJVRl9TSVpFICk7CisJCUhDRkFTU0VSVCggZGVzY3AtPm5leHRfZGVzY19hZGRyLCAwICk7IC8vIGZpcnN0IGRlc2NyaXB0b3Igc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGFub3RoZXIgZGVzY3JpcHRvcgogCQkvLyBUaGUgc2Vjb25kIERCIGlzIGZvciBTTkFQIGFuZCBwYXlsb2FkIHB1cnBvc2VzLiBJdCBzaG91bGQgYmUgYSBtaW5pbXVtIG9mIDEyIGJ5dGVzIGluIHNpemUuCi0JCUhDRkFTU0VSVCggZGVzY3AtPm5leHRfZGVzY19hZGRyLT5CVUZfU0laRSA+PSAxMiwgZGVzY3AtPm5leHRfZGVzY19hZGRyLT5CVUZfU0laRSApCisJCUhDRkFTU0VSVCggZGVzY3AtPm5leHRfZGVzY19hZGRyLT5CVUZfU0laRSA+PSAxMiwgZGVzY3AtPm5leHRfZGVzY19hZGRyLT5CVUZfU0laRSApOwogCX0KICNlbmRpZiAvLyBIQ0ZBU1NFUlQgLyBIQ0ZfRU5DCi0JSENGTE9HRVhJVCggSENGX1RSQUNFX0RNQV9SWF9QVVQgKQorCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9ETUFfUlhfUFVUICk7CiB9IC8vIGhjZl9kbWFfcnhfcHV0CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKi5NT0RVTEUJCURFU0NfU1RSQ1QqIGhjZl9kbWFfdHhfZ2V0KCBJRkJQIGlmYnAgKQotKi5QVVJQT1NFCQlETUEgbW9kZTogcmVjbGFpbXMgYW5kIGRlY2Fwc3VsYXRlcyBwYWNrZXRzIGluIHRoZSB0eCBkZXNjcmlwdG9yIGNoYWluIGlmOgotKgkJCQkgLSBBIFR4IHBhY2tldCBoYXMgYmVlbiBjb3BpZWQgZnJvbSBob3N0LVJBTSBpbnRvIE5JQy1SQU0gYnkgdGhlIERNQSBlbmdpbmUKLSoJCQkJIC0gVGhlIEhlcm1lcy9ETUFlbmdpbmUgaGF2ZSBiZWVuIGRpc2FibGVkCi0qCi0qLkFSR1VNRU5UUwotKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKLSoKLSouUkVUVVJOUwotKglwb2ludGVyIHRvIGEgcmVjbGFpbWVkIFR4IHBhY2tldC4KLSoKLSouREVTQ1JJUFRJT04KLSogaW1wYWN0IG9mIHRoZSBkaXNhYmxlIGNvbW1hbmQ6Ci0qIFdoZW4gYSBub24tZW1wdHkgcG9vbCBvZiBUeCBkZXNjcmlwdG9ycyBleGlzdHMgKGNyZWF0ZWQgYnkgbWVhbnMgb2YgaGNmX2RtYV9wdXRfdHgpLCB0aGUgTVNGCi0qIGlzIHN1cHBvc2VkIHRvIGVtcHR5IHRoYXQgcG9vbCBieSBtZWFucyBvZiBoY2ZfZG1hX3R4X2dldCBjYWxscyBhZnRlciB0aGUgZGlzYWJsZSBpbiBhbgotKiBkaXNhYmxlL2VuYWJsZSBzZXF1ZW5jZS4KLSoKLSouRElBR1JBTQotKgotKi5OT1RJQ0UKLSoKLSouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKgorICouTU9EVUxFICAgICAgICBERVNDX1NUUkNUKiBoY2ZfZG1hX3R4X2dldCggSUZCUCBpZmJwICkKKyAqLlBVUlBPU0UgICAgICAgRE1BIG1vZGU6IHJlY2xhaW1zIGFuZCBkZWNhcHN1bGF0ZXMgcGFja2V0cyBpbiB0aGUgdHggZGVzY3JpcHRvciBjaGFpbiBpZjoKKyAqICAgICAgICAgICAgICAgIC0gQSBUeCBwYWNrZXQgaGFzIGJlZW4gY29waWVkIGZyb20gaG9zdC1SQU0gaW50byBOSUMtUkFNIGJ5IHRoZSBETUEgZW5naW5lCisgKiAgICAgICAgICAgICAgICAtIFRoZSBIZXJtZXMvRE1BZW5naW5lIGhhdmUgYmVlbiBkaXNhYmxlZAorICoKKyAqLkFSR1VNRU5UUworICogICBpZmJwICAgICAgICBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyAqCisgKi5SRVRVUk5TCisgKiAgIHBvaW50ZXIgdG8gYSByZWNsYWltZWQgVHggcGFja2V0LgorICoKKyAqLkRFU0NSSVBUSU9OCisgKiBpbXBhY3Qgb2YgdGhlIGRpc2FibGUgY29tbWFuZDoKKyAqIFdoZW4gYSBub24tZW1wdHkgcG9vbCBvZiBUeCBkZXNjcmlwdG9ycyBleGlzdHMgKGNyZWF0ZWQgYnkgbWVhbnMgb2YgaGNmX2RtYV9wdXRfdHgpLCB0aGUgTVNGCisgKiBpcyBzdXBwb3NlZCB0byBlbXB0eSB0aGF0IHBvb2wgYnkgbWVhbnMgb2YgaGNmX2RtYV90eF9nZXQgY2FsbHMgYWZ0ZXIgdGhlIGRpc2FibGUgaW4gYW4KKyAqIGRpc2FibGUvZW5hYmxlIHNlcXVlbmNlLgorICoKKyAqLkRJQUdSQU0KKyAqCisgKi5OT1RJQ0UKKyAqCisgKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogREVTQ19TVFJDVCoKIGhjZl9kbWFfdHhfZ2V0KCBJRkJQIGlmYnAgKQogewotREVTQ19TVFJDVCAqZGVzY3A7CS8vIHBvaW50ZXIgdG8gc3RhcnQgb2YgRnJhbWVMaXN0CisJREVTQ19TVFJDVCAqZGVzY3A7ICAvLyBwb2ludGVyIHRvIHN0YXJ0IG9mIEZyYW1lTGlzdAogCiAJZGVzY3AgPSBnZXRfZnJhbWVfbHN0KCBpZmJwLCBETUFfVFggKTsKLQlpZiAoIGRlc2NwICYmIGRlc2NwLT5idWZfYWRkciApICAvLyFiZSBhd2FyZSBvZiB0aGUgbWlzc2luZyBjdXJseSBicmFja2V0Ci0JCQkJCQkJCQkJCS8vc2tpcCBkZWNhcHN1bGF0aW9uIGF0IGNvbmZpbmVkIGRlc2NyaXB0b3IKKwlpZiAoIGRlc2NwICYmIGRlc2NwLT5idWZfYWRkciApIHsKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3NraXAgZGVjYXBzdWxhdGlvbiBhdCBjb25maW5lZCBkZXNjcmlwdG9yCiAjaWYgKEhDRl9FTkNBUCkgPT0gSENGX0VOQwotCQlpZiAoICggZGVzY3AtPkJVRl9DTlQgPT0gSEZTX1RZUEUgKQotI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9DQ1gKLQkJCSB8fCAoIGRlc2NwLT5CVUZfQ05UID09IEhGU19EQVQgKQotI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAotCQkpIHsgLy8gcGVyZm9ybSBkZWNhcHN1bGF0aW9uIGlmIG5lZWRlZAorCQlpZiAoICggZGVzY3AtPkJVRl9DTlQgPT0gSEZTX1RZUEUgKSkgeworCQkJLy8gcGVyZm9ybSBkZWNhcHN1bGF0aW9uIGlmIG5lZWRlZAogCQkJZGVzY3AtPm5leHRfZGVzY19hZGRyLT5idWZfcGh5c19hZGRyIC09IEhDRl9EQVNBX1NJWkU7Ci0JCQlkZXNjcC0+bmV4dF9kZXNjX2FkZHItPkJVRl9DTlQgCQkgKz0gSENGX0RBU0FfU0laRTsKKwkJCWRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+QlVGX0NOVCAgICAgICArPSBIQ0ZfREFTQV9TSVpFOwogCQl9CiAjZW5kaWYgLy8gSENGX0VOQworCX0KIAlpZiAoIGRlc2NwID09IE5VTEwgKSB7ICAvLzs/Y291bGQgYmUgaW50ZWdyYXRlZCBpbnRvIGdldF9mcmFtZV9sc3QKIAkJaWZicC0+SUZCX0RtYVBhY2tldHMgJj0gKGhjZl8xNil+SFJFR19FVl9URE1BRDsKIAl9Ci0JSENGTE9HRVhJVCggSENGX1RSQUNFX0RNQV9UWF9HRVQgKQorCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9ETUFfVFhfR0VUICk7CiAJcmV0dXJuIGRlc2NwOwogfSAvLyBoY2ZfZG1hX3R4X2dldAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSouTU9EVUxFCQl2b2lkIGhjZl9kbWFfdHhfcHV0KCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCBoY2ZfMTYgdHhfY250bCApCi0qLlBVUlBPU0UJCXB1dHMgYSBwYWNrZXQgaW4gdGhlIFR4IERNQSBxdWV1ZSBpbiBob3N0IHJhbSBhbmQga2lja3Mgb2ZmIHRoZSBUeERtYSBlbmdpbmUuCi0qCQkJCXN1cHBseSB0aGUgVHgtREVMV0EgZGVzY3JpcHRvci4KLSoKLSouQVJHVU1FTlRTCi0qCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawotKglkZXNjcAkJYWRkcmVzcyBvZiBUeCBEZXNjcmlwdG9yIENoYWluIChpLmUuIGEgc2luZ2xlIFR4IGZyYW1lKQotKgl0eF9jbnRsCQlpbmRpY2F0ZXMgTUFDLXBvcnQgYW5kIChIZXJtZXMpIG9wdGlvbnMKLSoKLSouUkVUVVJOUwkJTi5BLgotKgotKi5ERVNDUklQVElPTgotKiBUaGUgSENGIGNhbiBiZSB1c2VkIGluIDIgZmFzaGlvbnM6IHdpdGggYW5kIHdpdGhvdXQgZW5jYXBzdWxhdGlvbiBmb3IgZGF0YSB0cmFuc2Zlci4KLSogVGhpcyBpcyBjb250cm9sbGVkIGF0IGNvbXBpbGUgdGltZSBieSB0aGUgSENGX0VOQyBiaXQgb2YgdGhlIEhDRl9FTkNBUCBzeXN0ZW0gY29uc3RhbnQuCi0qCi0qIFJlZ2FyZGxlc3Mgb2YgdGhlIEhDRl9FTkNBUCBzeXN0ZW0gY29uc3RhbnQsIHRoZSBkZXNjcmlwdG9yIGxpc3QgY3JlYXRlZCB0byBkZXNjcmliZSB0aGUgZnJhbWUgdG8gYmUKLSogdHJhbnNtaXR0ZWQsIG11c3Qgc3VwcGx5IHNwYWNlIHRvIGNvbnRhaW4gdGhlIDgwMi4xMSBoZWFkZXIsIHByZWNlZGluZyB0aGUgYWN0dWFsIGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkLgotKiBCYXNpY2FsbHksIHRoaXMgb25seSBzdXBwbGllcyB3b3JraW5nIHN0b3JhZ2UgdG8gdGhlIEhDRiB3aGljaCBwYXNzZXMgdGhpcyBvbiB0byB0aGUgRE1BIGVuZ2luZS4KLSogQXMgYSBjb25zZXF1ZW5jZSB0aGUgY29udGVudHMgb2YgdGhpcyBzcGFjZSBkbyBub3QgbWF0dGVyLgotKiBOZXZlcnRoZWxlc3MgQlVGX0NOVCBtdXN0IHRha2UgaW4gYWNjb3VudCB0aGlzIHN0b3JhZ2UuCi0qIFRoaXMgd29ya2luZyBzcGFjZSB0byBjb250YWluIHRoZSA4MDIuMTEgaGVhZGVyIG1heSBub3QgYmUgZnJhZ21lbnRlZCwgdGhlIGZpcnN0IGJ1ZmZlciBtdXN0IGJlCi0qIHN1ZmZpY2llbnRseSBsYXJnZSB0byBjb250YWluIGF0IGxlYXN0IHRoZSA4MDIuMTEgaGVhZGVyLCBpLmUuIEhGU19BRERSX0RFU1QgKDI5IHdvcmRzIG9yIDB4M0EgYnl0ZXMpLgotKiBUaGlzIHdheSwgdGhlIEhDRiBjYW4gc2ltcGx5LCByZWdhcmRsZXNzIHdoZXRoZXIgb3Igbm90IHRoZSBIQ0YgZW5jYXBzdWxhdGVzIHRoZSBmcmFtZSwgd3JpdGUgdGhlIHBhcmFtZXRlcgotKiB0eF9jbnRsIGF0IG9mZnNldCAweDM2IChIRlNfVFhfQ05UTCkgaW4gdGhlIGZpcnN0IGJ1ZmZlci4KLSogTm90ZSB0aGF0IGl0IGlzIGFsbG93ZWQgdG8gaGF2ZSBwYXJ0IG9yIGFsbCBvZiB0aGUgYWN0dWFsIGZyYW1lIHJlcHJlc2VudGVkIGJ5IHRoZSBmaXJzdCBkZXNjcmlwdG9yIGFzIGxvbmcKLSogYXMgdGhlIHJlcXVpcmVtZW50IGZvciBzdG9yYWdlIGZvciB0aGUgODAyLjExIGhlYWRlciBpcyBtZXQsIGkuZS4gdGhlIDgwMi4zIGZyYW1lIHN0YXJ0cyBhdCBvZmZzZXQKLSogSEZTX0FERFJfREVTVC4KLSogRXhjZXB0IGZvciB0aGUgQXNzZXJ0IG9uIHRoZSAxc3QgYnVmZmVyIGluIGNhc2Ugb2YgRW5jYXBzdWFsdGlvbiwgdGhlIFNJWkUgZmllbGRzIGFyZSBpZ25vcmVkLgotKgotKiBJbiBjYXNlIHRoZSBlbmNhcHN1bGF0aW9uIGZlYXR1cmUgaXMgY29tcGlsZWQgaW4sIHRoZXJlIGFyZSB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzLgotKiBvIFRoZSBCVUZfQ05UIG9mIHRoZSBmaXJzdCBidWZmZXIgY2hhbmdlcyBmcm9tIGEgbWluaW11bSBvZiAweDNBIGJ5dGVzIHRvIGV4YWN0bHkgMHgzQSwgaS5lLiB0aGUgd29ya3NwYWNlCi0qCXRvIHN0b3JlIHRoZSA4MDIuMTEgaGVhZGVyCi0qIG8gVGhlIEJVRl9TSVpFIG9mIHRoZSBmaXJzdCBidWZmZXIgaXMgYXQgbGVhc3QgdGhlIHNwYWNlIG5lZWRlZCB0byBzdG9yZSB0aGUKLSoJLSA4MDIuMTEgaGVhZGVyICgyOSB3b3JkcykKLSoJLSA4MDIuMyBoZWFkZXIsIGkuZS4gMTIgYnl0ZXMgYWRkcmVzc2luZyBpbmZvcm1hdGlvbiBhbmQgMiBieXRlcyBsZW5ndGggZmllbGQKLSoJLSA2IGJ5dGVzIFNOQVAtaGVhZGVyCi0qICAgVGhpcyByZXN1bHRzIGluIDM5IHdvcmRzIG9yIDB4NEUgYnl0ZXMgb3IgSEZTX1RZUEUuCi0qICAgTm90ZSB0aGF0IGlmIHRoZSBCVUZfU0laRSBpcyBsYXJnZXIgdGhhbiAweDRFLCB0aGlzIHN1cnBsdXMgaXMgbm90IHVzZWQuCi0qIG8gVGhlIGFjdHVhbCBmcmFtZSBiZWdpbnMgaW4gdGhlIDJuZCBkZXNjcmlwdG9yICh3aGljaCBpcyBhbHJlYWR5IGltcGxpZWQgYnkgdGhlIEJVRl9DTlQgPT0gMHgzQSByZXF1aXJlbWVudCkgYW5kIHRoZSBhc3NvY2lhdGVkIGJ1ZmZlciBjb250YWlucyBhdCBsZWFzdCB0aGUgODAyLjMgaGVhZGVyLCBpLmUuIHRoZSAxNCBieXRlcyByZXByZXNlbnRpbmcgYWRkcmVzc2luZyBpbmZvcm1hdGlvbiBhbmQgbGVuZ3RoL3R5cGUgZmllbGQKLSoKLSogICBXaGVuIHRoZSBIQ0YgZG9lcyBub3QgZW5jYXBzdWxhdGVzIChpLmUuIGxlbmd0aC90eXBlIGZpZWxkIDw9IDE1MDApLCAgbm8gY2hhbmdlcyBhcmUgbWFkZSB0byBkZXNjcmlwdG9ycwotKiAgIG9yIGJ1ZmZlcnMuCi0qCi0qICAgV2hlbiB0aGUgSENGIGFjdHVhbGx5IGVuY2Fwc3VsYXRlcyAoaS5lLiBsZW5ndGgvdHlwZSBmaWVsZCA+IDE1MDApLCBpdCBzdWNjZXNzaXZlbHkgd3JpdGVzLCBzdGFydGluZyBhdAotKiAgIG9mZnNldCBIRlNfQUREUl9ERVNUICgweDNBKSBpbiB0aGUgZmlyc3QgYnVmZmVyOgotKiAgICAgLSB0aGUgODAyLjMgYWRkcmVzc2luZyBpbmZvcm1hdGlvbiwgY29waWVkIGZyb20gdGhlIGJlZ2luIG9mIHRoZSBzZWNvbmQgYnVmZmVyCi0qICAgICAtIHRoZSBmcmFtZSBsZW5ndGgsIGRlcml2ZWQgZnJvbSB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBpbmRpdmlkdWFsIGZyYWdtZW50cywgY29ycmVjdGVkIGZvciB0aGUgU05BUAotKiAgIAloZWFkZXIgbGVuZ3RoIGFuZCBUeXBlIGZpZWxkIGFuZCBpZ25vcmluZyB0aGUgRGVzdGluYXRpb24gQWRkcmVzcywgU291cmNlIEFkZHJlc3MgYW5kIExlbmd0aCBmaWVsZAotKiAJICAtIHRoZSBhcHByb3ByaWF0ZSBzbmFwIGhlYWRlciAoVHVubmVsIG9yIDEwNDIsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgdGhlIHR5cGUgZmllbGQpLgotKgotKiAJIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgZmlyc3QgdHdvIGRlc2NyaXB0b3JzIGlzIGFkanVzdGVkIGFjY29yZGluZ2x5OgotKiAJICAtIHRoZSBmaXJzdCBkZXNjcmlwdG9yIGNvdW50IGlzIGNoYW5nZWQgZnJvbSAweDNBIHRvIDB4NEUgKEhGU19UWVBFKSwgd2hpY2ggbWF0Y2hlcyAweDNBICsgMTIgKyAyICsgNgotKiAJICAtIHRoZSBzZWNvbmQgZGVzY3JpcHRvciBjb3VudCBpcyBkZWNyZWFzZWQgYnkgMTIsIGJlaW5nIHRoZSBtb3ZlZCBhZGRyZXNzaW5nIGluZm9ybWF0aW9uCi0qIAkgIC0gdGhlIHNlY29uZCBkZXNjcmlwdG9yIChwaHlzaWNhbCkgYnVmZmVyIGFkZHJlc3MgaXMgaW5jcmVhc2VkIGJ5IDEyLgotKgotKiBXaGVuIHRoZSBkZXNjcmlwdG9ycyBhcmUgcmV0dXJuZWQgYnkgaGNmX2RtYV90eF9nZXQsIHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgZmlyc3QgdHdvIGRlc2NyaXB0b3JzIGlzCi0qIHVuZG9uZS4KLSoKLSogVW5kZXIgYW55IG9mIHRoZSBhYm92ZSBzY2VuYXJpb3MsIHRoZSBhc3NlcnQgQlVGX0NOVCA8PSBCVUZfU0laRSBtdXN0IGJlIHRydWUgZm9yIGFsbCBkZXNjcmlwdG9ycwotKiBJbiBjYXNlIG9mIGVuY2Fwc3VsYXRpb24sIEJVRl9TSVpFIG9mIHRoZSAxc3QgZGVzY3JpcHRvciBpcyBhc3NlcnRlZCB0byBiZSBhdCBsZWFzdCBIRlNfVFlQRSAoMHg0RSksIHNvIGl0IGlzIE5PVCB0ZXN0ZWQuCi0qCi0qIEFzc2VydCBmYWlscyBpZgotKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KLSogLSB0eF9jbnRsIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCi0qIC0gTklDIGludGVycnVwdHMgYXJlIG5vdCBkaXNhYmxlZCB3aGlsZSByZXF1aXJlZCBieSBwYXJhbWV0ZXIgYWN0aW9uLgotKiAtIGluIGNhc2UgZW5jYXBzdWxhdGlvbiBieSB0aGUgSENGIGlzIHNlbGVjdGVkOgotKgkgIC0JVGhlIEZyYW1lTGlzdCBkb2VzIG5vdCBjb25zaXN0cyBvZiBhdCBsZWFzdCAyIERlc2NyaXB0b3JzLgotKgkgIC0JVGhlIGZpcnN0IGRhdGFidWZmZXIgZG9lcyBub3QgY29udGFpbiBleGFjdGx5IHRoZSAoc3BhY2UgZm9yKSB0aGUgODAyLjExIGhlYWRlciAoPT0gMjggd29yZHMpCi0qCSAgLQlUaGUgZmlyc3QgZGF0YWJ1ZmZlciBkb2VzIG5vdCBoYXZlIGEgc2l6ZSB0byBhZGRpdGlvbmFsbHkgYWNjb21tb2RhdGUgdGhlIDgwMi4zIGhlYWRlciBhbmQgdGhlCi0qCQlTTkFQIGhlYWRlciBvZiB0aGUgZnJhbWUgYWZ0ZXIgZW5jYXBzdWxhdGlvbiAoPT0gMzkgd29yZHMpLgotKgkgIC0JVGhlIHNlY29uZCBkYXRhYnVmZmVyIGRvZXMgbm90IGNvbnRhaW4gYXQgbGVhc3QgREEsIFNBIGFuZCAndHlwZS9sZW5ndGgnICg9PTE0IGJ5dGVzIG9yIDcgd29yZHMpCi0qISEgVGhlIDJuZCBwYXJ0IG9mIHRoZSBsaXN0IG9mIGFzc2VydHMgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHB1dF9mcmFtZV9sc3QsIGluIG9yZGVyIHRvIGdldAotKiEhIHRoZW0gaW4gdGhlIFdDSS1zcGVjICEhISEKLSogLSBETUEgaXMgbm90IGVuYWJsZWQKLSogLSBkZXNjcmlwdG9yIGxpc3QgaXMgTlVMTAotKiAtIGEgZGVzY3JpcHRvciBpbiB0aGUgZGVzY3JpcHRvciBsaXN0IGlzIG5vdCBkb3VibGUgd29yZCBhbGlnbmVkCi0qIC0gYSBjb3VudCBvZiBzaXplIGZpZWxkIG9mIGEgZGVzY3JpcHRvciBjb250YWlucyBjb250cm9sIGJpdHMsIGkuZS4gYml0cyBpbiB0aGUgaGlnaCBvcmRlciBuaWJibGUuCi0qIC0gdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IGEgInNpbmdsZXRvbiIgRGVzY3JpcHRvckxpc3QuCi0qIC0gdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IHRoZSBmaXJzdCBEZXNjcmlwdG9yIHN1cHBsaWVkCi0qIC0gYSBub25fRE1BIGRlc2NyaXB0b3IgaXMgc3VwcGxpZWQgYmVmb3JlIHRoZSBERUxXQSBEZXNjcmlwdG9yIGlzIHN1cHBsaWVkCi0qISEgLSBQb3NzaWJseSBtb3JlIGNoZWNrcyBjb3VsZCBiZSBhZGRlZCAhISEhISEhISEhISEhCi0qLkRJQUdSQU0KLSoKLSouTk9USUNFCi0qCi0qLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgotKgotKgotKjE6CVdyaXRlIHR4X2NudGwgcGFyYW1ldGVyIHRvIEhGU19UWF9DTlRMIGZpZWxkIGludG8gdGhlIEhlcm1lcy1zcGVjaWZpYyBoZWFkZXIgaW4gYnVmZmVyIDEKLSo0OglkZXRlcm1pbmUgd2hldGhlciBlbmNhcHN1bGF0aW9uIGlzIG5lZWRlZCBhbmQgd3JpdGUgdGhlIHR5cGUgKHR1bm5lbCBvciAxMDQyKSBhbHJlYWR5IGF0IHRoZSBhcHByb3ByaWF0ZQotKglvZmZzZXQgaW4gdGhlIDFzdCBidWZmZXIKLSo2OglCdWlsZCB0aGUgZW5jYXBzdWFsdGlvbiBlbnZlbG9wcGUgaW4gdGhlIGZyZWUgc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgMXN0IGJ1ZmZlcgotKgktIENvcHkgREEvU0EgZmllbGRzIGZyb20gdGhlIDJuZCBidWZmZXIKLSogICAtIENhbGN1bGF0ZSB0b3RhbCBsZW5ndGggb2YgdGhlIG1lc3NhZ2UgKHNuYXAtaGVhZGVyICsgdHlwZS1maWVsZCArIHRoZSBsZW5ndGggb2YgYWxsIGJ1ZmZlciBmcmFnbWVudHMKLSogICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgODAyLjMgZnJhbWUgKGkuZSBhbGwgZGVzY3JpcHRvcnMgZXhjZXB0IHRoZSBmaXJzdCksIGJ1dCBub3QgdGhlIERlc3RpbmF0aW9uQWRkcmVzcywKLSogICAgIFNvdXJjZUFkZHJlc3MgYW5kIGxlbmd0aC1maWVsZCkKLSogICAgIEFzc2VydCB0aGUgbWVzc2FnZSBsZW5ndGgKLSoJICBXcml0ZSBsZW5ndGguIE5vdGUgdGhhdCB0aGUgbWVzc2FnZSBpcyBpbiBCRSBmb3JtYXQsIGhlbmNlIG9uIExFIHBsYXRmb3JtcyB0aGUgbGVuZ3RoIG11c3QgYmUgY29udmVydGVkCi0qCSAgOz8gVEhJUyBJUyBOT1QgV0hBVCBDVVJSRU5UTFkgSVMgSU1QTEVNRU5URUQKLSoJLSBXcml0ZSBzbmFwIGhlYWRlci4gTm90ZSB0aGF0IHRoZSBsYXN0IGJ5dGUgb2YgdGhlIHNuYXAgaGVhZGVyIGlzIE5PVCBjb3BpZWQsIHRoYXQgYnl0ZSBpcyBhbHJlYWR5IGluCi0qCSAgcGxhY2UgYXMgcmVzdWx0IG9mIHRoZSBjYWxsIHRvIGhjZl9lbmNhcC4KLSoJTm90ZSB0aGF0IHRoZXJlIGFyZSBtYW55IHdheXMgdG8gc2tpbiBhIGNhdC4gVG8gZXhwcmVzcyB0aGUgb2Zmc2V0cyBpbiB0aGUgMXN0IGJ1ZmZlciB3aGlsZSB3cml0aW5nCi0qCXRoZSBzbmFwIGhlYWRlciwgSEZTX1RZUEUgaXMgY2hvc2VuIGFzIGEgcmVmZXJlbmNlIHBvaW50IHRvIG1ha2UgaXQgZWFzaWVyIHRvIGdyYXNwIHRoYXQgdGhlIHNuYXAgaGVhZGVyCi0qCWFuZCBlbmNhcHN1YWx0aW9uIHR5cGUgYXJlIGF0IGxlYXN0IHJlbGF0aXZlIGluIHRoZSByaWdodC4KLSo4Ogltb2RpZnkgMXN0IGRlc2NyaXB0b3IgdG8gcmVmbGVjdCBtb3ZlZCBwYXJ0IG9mIHRoZSA4MDIuMyBoZWFkZXIgKyBTbmFwLWhlYWRlcgotKgltb2RpZnkgMm5kIGRlc2NyaXB0b3IgdG8gc2tpcCB0aGUgbW92ZWQgcGFydCBvZiB0aGUgODAyLjMgaGVhZGVyIChEQS9TQQotKjEwOiBzZXQgZWFjaCBkZXNjcmlwdG9yIHRvICdETUEgb3duZWQnLCAgY2xlYXIgYWxsIG90aGVyIGNvbnRyb2wgYml0cy4KLSoJU2V0IFNPUCBiaXQgb24gZmlyc3QgZGVzY3JpcHRvci4gU2V0IEVPUCBiaXQgb24gbGFzdCBkZXNjcmlwdG9yLgotKjEyOiBFaXRoZXIgYXBwZW5kIHRoZSBjdXJyZW50IGZyYW1lIHRvIGFuIGV4aXN0aW5nIGRlc2NyaXB0b3IgbGlzdCBvcgotKjE0OiBjcmVhdGUgYSBsaXN0IGJlZ2lubmluZyB3aXRoIHRoZSBjdXJyZW50IGZyYW1lCi0qMTY6IHJlbWVtYmVyIHRoZSBuZXcgZW5kIG9mIHRoZSBsaXN0Ci0qMjA6IGhhbmQgdGhlIGZyYW1lIG92ZXIgdG8gdGhlIERNQSBlbmdpbmUKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqCisgKi5NT0RVTEUgICAgICAgIHZvaWQgaGNmX2RtYV90eF9wdXQoIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AsIGhjZl8xNiB0eF9jbnRsICkKKyAqLlBVUlBPU0UgICAgICAgcHV0cyBhIHBhY2tldCBpbiB0aGUgVHggRE1BIHF1ZXVlIGluIGhvc3QgcmFtIGFuZCBraWNrcyBvZmYgdGhlIFR4RG1hIGVuZ2luZS4KKyAqICAgICAgICAgICAgICAgc3VwcGx5IHRoZSBUeC1ERUxXQSBkZXNjcmlwdG9yLgorICoKKyAqLkFSR1VNRU5UUworICogICBpZmJwICAgICAgICBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyAqICAgZGVzY3AgICAgICAgYWRkcmVzcyBvZiBUeCBEZXNjcmlwdG9yIENoYWluIChpLmUuIGEgc2luZ2xlIFR4IGZyYW1lKQorICogICB0eF9jbnRsICAgICBpbmRpY2F0ZXMgTUFDLXBvcnQgYW5kIChIZXJtZXMpIG9wdGlvbnMKKyAqCisgKi5SRVRVUk5TICAgICAgIE4uQS4KKyAqCisgKi5ERVNDUklQVElPTgorICogVGhlIEhDRiBjYW4gYmUgdXNlZCBpbiAyIGZhc2hpb25zOiB3aXRoIGFuZCB3aXRob3V0IGVuY2Fwc3VsYXRpb24gZm9yIGRhdGEgdHJhbnNmZXIuCisgKiBUaGlzIGlzIGNvbnRyb2xsZWQgYXQgY29tcGlsZSB0aW1lIGJ5IHRoZSBIQ0ZfRU5DIGJpdCBvZiB0aGUgSENGX0VOQ0FQIHN5c3RlbSBjb25zdGFudC4KKyAqCisgKiBSZWdhcmRsZXNzIG9mIHRoZSBIQ0ZfRU5DQVAgc3lzdGVtIGNvbnN0YW50LCB0aGUgZGVzY3JpcHRvciBsaXN0IGNyZWF0ZWQgdG8gZGVzY3JpYmUgdGhlIGZyYW1lIHRvIGJlCisgKiB0cmFuc21pdHRlZCwgbXVzdCBzdXBwbHkgc3BhY2UgdG8gY29udGFpbiB0aGUgODAyLjExIGhlYWRlciwgcHJlY2VkaW5nIHRoZSBhY3R1YWwgZnJhbWUgdG8gYmUgdHJhbnNtaXR0ZWQuCisgKiBCYXNpY2FsbHksIHRoaXMgb25seSBzdXBwbGllcyB3b3JraW5nIHN0b3JhZ2UgdG8gdGhlIEhDRiB3aGljaCBwYXNzZXMgdGhpcyBvbiB0byB0aGUgRE1BIGVuZ2luZS4KKyAqIEFzIGEgY29uc2VxdWVuY2UgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc3BhY2UgZG8gbm90IG1hdHRlci4KKyAqIE5ldmVydGhlbGVzcyBCVUZfQ05UIG11c3QgdGFrZSBpbiBhY2NvdW50IHRoaXMgc3RvcmFnZS4KKyAqIFRoaXMgd29ya2luZyBzcGFjZSB0byBjb250YWluIHRoZSA4MDIuMTEgaGVhZGVyIG1heSBub3QgYmUgZnJhZ21lbnRlZCwgdGhlIGZpcnN0IGJ1ZmZlciBtdXN0IGJlCisgKiBzdWZmaWNpZW50bHkgbGFyZ2UgdG8gY29udGFpbiBhdCBsZWFzdCB0aGUgODAyLjExIGhlYWRlciwgaS5lLiBIRlNfQUREUl9ERVNUICgyOSB3b3JkcyBvciAweDNBIGJ5dGVzKS4KKyAqIFRoaXMgd2F5LCB0aGUgSENGIGNhbiBzaW1wbHksIHJlZ2FyZGxlc3Mgd2hldGhlciBvciBub3QgdGhlIEhDRiBlbmNhcHN1bGF0ZXMgdGhlIGZyYW1lLCB3cml0ZSB0aGUgcGFyYW1ldGVyCisgKiB0eF9jbnRsIGF0IG9mZnNldCAweDM2IChIRlNfVFhfQ05UTCkgaW4gdGhlIGZpcnN0IGJ1ZmZlci4KKyAqIE5vdGUgdGhhdCBpdCBpcyBhbGxvd2VkIHRvIGhhdmUgcGFydCBvciBhbGwgb2YgdGhlIGFjdHVhbCBmcmFtZSByZXByZXNlbnRlZCBieSB0aGUgZmlyc3QgZGVzY3JpcHRvciBhcyBsb25nCisgKiBhcyB0aGUgcmVxdWlyZW1lbnQgZm9yIHN0b3JhZ2UgZm9yIHRoZSA4MDIuMTEgaGVhZGVyIGlzIG1ldCwgaS5lLiB0aGUgODAyLjMgZnJhbWUgc3RhcnRzIGF0IG9mZnNldAorICogSEZTX0FERFJfREVTVC4KKyAqIEV4Y2VwdCBmb3IgdGhlIEFzc2VydCBvbiB0aGUgMXN0IGJ1ZmZlciBpbiBjYXNlIG9mIEVuY2Fwc3VhbHRpb24sIHRoZSBTSVpFIGZpZWxkcyBhcmUgaWdub3JlZC4KKyAqCisgKiBJbiBjYXNlIHRoZSBlbmNhcHN1bGF0aW9uIGZlYXR1cmUgaXMgY29tcGlsZWQgaW4sIHRoZXJlIGFyZSB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzLgorICogbyBUaGUgQlVGX0NOVCBvZiB0aGUgZmlyc3QgYnVmZmVyIGNoYW5nZXMgZnJvbSBhIG1pbmltdW0gb2YgMHgzQSBieXRlcyB0byBleGFjdGx5IDB4M0EsIGkuZS4gdGhlIHdvcmtzcGFjZQorICogICB0byBzdG9yZSB0aGUgODAyLjExIGhlYWRlcgorICogbyBUaGUgQlVGX1NJWkUgb2YgdGhlIGZpcnN0IGJ1ZmZlciBpcyBhdCBsZWFzdCB0aGUgc3BhY2UgbmVlZGVkIHRvIHN0b3JlIHRoZQorICogICAtIDgwMi4xMSBoZWFkZXIgKDI5IHdvcmRzKQorICogICAtIDgwMi4zIGhlYWRlciwgaS5lLiAxMiBieXRlcyBhZGRyZXNzaW5nIGluZm9ybWF0aW9uIGFuZCAyIGJ5dGVzIGxlbmd0aCBmaWVsZAorICogICAtIDYgYnl0ZXMgU05BUC1oZWFkZXIKKyAqICAgVGhpcyByZXN1bHRzIGluIDM5IHdvcmRzIG9yIDB4NEUgYnl0ZXMgb3IgSEZTX1RZUEUuCisgKiAgIE5vdGUgdGhhdCBpZiB0aGUgQlVGX1NJWkUgaXMgbGFyZ2VyIHRoYW4gMHg0RSwgdGhpcyBzdXJwbHVzIGlzIG5vdCB1c2VkLgorICogbyBUaGUgYWN0dWFsIGZyYW1lIGJlZ2lucyBpbiB0aGUgMm5kIGRlc2NyaXB0b3IgKHdoaWNoIGlzIGFscmVhZHkgaW1wbGllZCBieSB0aGUgQlVGX0NOVCA9PSAweDNBIHJlcXVpcmVtZW50KSBhbmQgdGhlIGFzc29jaWF0ZWQgYnVmZmVyIGNvbnRhaW5zIGF0IGxlYXN0IHRoZSA4MDIuMyBoZWFkZXIsIGkuZS4gdGhlIDE0IGJ5dGVzIHJlcHJlc2VudGluZyBhZGRyZXNzaW5nIGluZm9ybWF0aW9uIGFuZCBsZW5ndGgvdHlwZSBmaWVsZAorICoKKyAqICAgV2hlbiB0aGUgSENGIGRvZXMgbm90IGVuY2Fwc3VsYXRlcyAoaS5lLiBsZW5ndGgvdHlwZSBmaWVsZCA8PSAxNTAwKSwgIG5vIGNoYW5nZXMgYXJlIG1hZGUgdG8gZGVzY3JpcHRvcnMKKyAqICAgb3IgYnVmZmVycy4KKyAqCisgKiAgIFdoZW4gdGhlIEhDRiBhY3R1YWxseSBlbmNhcHN1bGF0ZXMgKGkuZS4gbGVuZ3RoL3R5cGUgZmllbGQgPiAxNTAwKSwgaXQgc3VjY2Vzc2l2ZWx5IHdyaXRlcywgc3RhcnRpbmcgYXQKKyAqICAgb2Zmc2V0IEhGU19BRERSX0RFU1QgKDB4M0EpIGluIHRoZSBmaXJzdCBidWZmZXI6CisgKiAgICAgLSB0aGUgODAyLjMgYWRkcmVzc2luZyBpbmZvcm1hdGlvbiwgY29waWVkIGZyb20gdGhlIGJlZ2luIG9mIHRoZSBzZWNvbmQgYnVmZmVyCisgKiAgICAgLSB0aGUgZnJhbWUgbGVuZ3RoLCBkZXJpdmVkIGZyb20gdGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgaW5kaXZpZHVhbCBmcmFnbWVudHMsIGNvcnJlY3RlZCBmb3IgdGhlIFNOQVAKKyAqICAgICAgIGhlYWRlciBsZW5ndGggYW5kIFR5cGUgZmllbGQgYW5kIGlnbm9yaW5nIHRoZSBEZXN0aW5hdGlvbiBBZGRyZXNzLCBTb3VyY2UgQWRkcmVzcyBhbmQgTGVuZ3RoIGZpZWxkCisgKiAgICAgLSB0aGUgYXBwcm9wcmlhdGUgc25hcCBoZWFkZXIgKFR1bm5lbCBvciAxMDQyLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSB0eXBlIGZpZWxkKS4KKyAqCisgKiAgICBUaGUgaW5mb3JtYXRpb24gaW4gdGhlIGZpcnN0IHR3byBkZXNjcmlwdG9ycyBpcyBhZGp1c3RlZCBhY2NvcmRpbmdseToKKyAqICAgICAtIHRoZSBmaXJzdCBkZXNjcmlwdG9yIGNvdW50IGlzIGNoYW5nZWQgZnJvbSAweDNBIHRvIDB4NEUgKEhGU19UWVBFKSwgd2hpY2ggbWF0Y2hlcyAweDNBICsgMTIgKyAyICsgNgorICogICAgIC0gdGhlIHNlY29uZCBkZXNjcmlwdG9yIGNvdW50IGlzIGRlY3JlYXNlZCBieSAxMiwgYmVpbmcgdGhlIG1vdmVkIGFkZHJlc3NpbmcgaW5mb3JtYXRpb24KKyAqICAgICAtIHRoZSBzZWNvbmQgZGVzY3JpcHRvciAocGh5c2ljYWwpIGJ1ZmZlciBhZGRyZXNzIGlzIGluY3JlYXNlZCBieSAxMi4KKyAqCisgKiBXaGVuIHRoZSBkZXNjcmlwdG9ycyBhcmUgcmV0dXJuZWQgYnkgaGNmX2RtYV90eF9nZXQsIHRoZSB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgZmlyc3QgdHdvIGRlc2NyaXB0b3JzIGlzCisgKiB1bmRvbmUuCisgKgorICogVW5kZXIgYW55IG9mIHRoZSBhYm92ZSBzY2VuYXJpb3MsIHRoZSBhc3NlcnQgQlVGX0NOVCA8PSBCVUZfU0laRSBtdXN0IGJlIHRydWUgZm9yIGFsbCBkZXNjcmlwdG9ycworICogSW4gY2FzZSBvZiBlbmNhcHN1bGF0aW9uLCBCVUZfU0laRSBvZiB0aGUgMXN0IGRlc2NyaXB0b3IgaXMgYXNzZXJ0ZWQgdG8gYmUgYXQgbGVhc3QgSEZTX1RZUEUgKDB4NEUpLCBzbyBpdCBpcyBOT1QgdGVzdGVkLgorICoKKyAqIEFzc2VydCBmYWlscyBpZgorICogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCisgKiAtIHR4X2NudGwgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KKyAqIC0gTklDIGludGVycnVwdHMgYXJlIG5vdCBkaXNhYmxlZCB3aGlsZSByZXF1aXJlZCBieSBwYXJhbWV0ZXIgYWN0aW9uLgorICogLSBpbiBjYXNlIGVuY2Fwc3VsYXRpb24gYnkgdGhlIEhDRiBpcyBzZWxlY3RlZDoKKyAqICAgICAtIFRoZSBGcmFtZUxpc3QgZG9lcyBub3QgY29uc2lzdHMgb2YgYXQgbGVhc3QgMiBEZXNjcmlwdG9ycy4KKyAqICAgICAtIFRoZSBmaXJzdCBkYXRhYnVmZmVyIGRvZXMgbm90IGNvbnRhaW4gZXhhY3RseSB0aGUgKHNwYWNlIGZvcikgdGhlIDgwMi4xMSBoZWFkZXIgKD09IDI4IHdvcmRzKQorICogICAgIC0gVGhlIGZpcnN0IGRhdGFidWZmZXIgZG9lcyBub3QgaGF2ZSBhIHNpemUgdG8gYWRkaXRpb25hbGx5IGFjY29tbW9kYXRlIHRoZSA4MDIuMyBoZWFkZXIgYW5kIHRoZQorICogICAgICAgU05BUCBoZWFkZXIgb2YgdGhlIGZyYW1lIGFmdGVyIGVuY2Fwc3VsYXRpb24gKD09IDM5IHdvcmRzKS4KKyAqICAgICAtIFRoZSBzZWNvbmQgZGF0YWJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGF0IGxlYXN0IERBLCBTQSBhbmQgJ3R5cGUvbGVuZ3RoJyAoPT0xNCBieXRlcyBvciA3IHdvcmRzKQorICohISBUaGUgMm5kIHBhcnQgb2YgdGhlIGxpc3Qgb2YgYXNzZXJ0cyBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggcHV0X2ZyYW1lX2xzdCwgaW4gb3JkZXIgdG8gZ2V0CisgKiEhIHRoZW0gaW4gdGhlIFdDSS1zcGVjICEhISEKKyAqIC0gRE1BIGlzIG5vdCBlbmFibGVkCisgKiAtIGRlc2NyaXB0b3IgbGlzdCBpcyBOVUxMCisgKiAtIGEgZGVzY3JpcHRvciBpbiB0aGUgZGVzY3JpcHRvciBsaXN0IGlzIG5vdCBkb3VibGUgd29yZCBhbGlnbmVkCisgKiAtIGEgY291bnQgb2Ygc2l6ZSBmaWVsZCBvZiBhIGRlc2NyaXB0b3IgY29udGFpbnMgY29udHJvbCBiaXRzLCBpLmUuIGJpdHMgaW4gdGhlIGhpZ2ggb3JkZXIgbmliYmxlLgorICogLSB0aGUgREVMV0EgZGVzY3JpcHRvciBpcyBub3QgYSAic2luZ2xldG9uIiBEZXNjcmlwdG9yTGlzdC4KKyAqIC0gdGhlIERFTFdBIGRlc2NyaXB0b3IgaXMgbm90IHRoZSBmaXJzdCBEZXNjcmlwdG9yIHN1cHBsaWVkCisgKiAtIGEgbm9uX0RNQSBkZXNjcmlwdG9yIGlzIHN1cHBsaWVkIGJlZm9yZSB0aGUgREVMV0EgRGVzY3JpcHRvciBpcyBzdXBwbGllZAorICohISAtIFBvc3NpYmx5IG1vcmUgY2hlY2tzIGNvdWxkIGJlIGFkZGVkICEhISEhISEhISEhISEKKyAqLkRJQUdSQU0KKyAqCisgKi5OT1RJQ0UKKyAqCisgKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KKyAqCisgKgorICoxOiBXcml0ZSB0eF9jbnRsIHBhcmFtZXRlciB0byBIRlNfVFhfQ05UTCBmaWVsZCBpbnRvIHRoZSBIZXJtZXMtc3BlY2lmaWMgaGVhZGVyIGluIGJ1ZmZlciAxCisgKjQ6IGRldGVybWluZSB3aGV0aGVyIGVuY2Fwc3VsYXRpb24gaXMgbmVlZGVkIGFuZCB3cml0ZSB0aGUgdHlwZSAodHVubmVsIG9yIDEwNDIpIGFscmVhZHkgYXQgdGhlIGFwcHJvcHJpYXRlCisgKiAgIG9mZnNldCBpbiB0aGUgMXN0IGJ1ZmZlcgorICo2OiBCdWlsZCB0aGUgZW5jYXBzdWFsdGlvbiBlbnZlbG9wcGUgaW4gdGhlIGZyZWUgc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgMXN0IGJ1ZmZlcgorICogICAtIENvcHkgREEvU0EgZmllbGRzIGZyb20gdGhlIDJuZCBidWZmZXIKKyAqICAgLSBDYWxjdWxhdGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlIChzbmFwLWhlYWRlciArIHR5cGUtZmllbGQgKyB0aGUgbGVuZ3RoIG9mIGFsbCBidWZmZXIgZnJhZ21lbnRzCisgKiAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSA4MDIuMyBmcmFtZSAoaS5lIGFsbCBkZXNjcmlwdG9ycyBleGNlcHQgdGhlIGZpcnN0KSwgYnV0IG5vdCB0aGUgRGVzdGluYXRpb25BZGRyZXNzLAorICogICAgIFNvdXJjZUFkZHJlc3MgYW5kIGxlbmd0aC1maWVsZCkKKyAqICAgICBBc3NlcnQgdGhlIG1lc3NhZ2UgbGVuZ3RoCisgKiAgICAgV3JpdGUgbGVuZ3RoLiBOb3RlIHRoYXQgdGhlIG1lc3NhZ2UgaXMgaW4gQkUgZm9ybWF0LCBoZW5jZSBvbiBMRSBwbGF0Zm9ybXMgdGhlIGxlbmd0aCBtdXN0IGJlIGNvbnZlcnRlZAorICogICAgIDs/IFRISVMgSVMgTk9UIFdIQVQgQ1VSUkVOVExZIElTIElNUExFTUVOVEVECisgKiAgIC0gV3JpdGUgc25hcCBoZWFkZXIuIE5vdGUgdGhhdCB0aGUgbGFzdCBieXRlIG9mIHRoZSBzbmFwIGhlYWRlciBpcyBOT1QgY29waWVkLCB0aGF0IGJ5dGUgaXMgYWxyZWFkeSBpbgorICogICAgIHBsYWNlIGFzIHJlc3VsdCBvZiB0aGUgY2FsbCB0byBoY2ZfZW5jYXAuCisgKiAgIE5vdGUgdGhhdCB0aGVyZSBhcmUgbWFueSB3YXlzIHRvIHNraW4gYSBjYXQuIFRvIGV4cHJlc3MgdGhlIG9mZnNldHMgaW4gdGhlIDFzdCBidWZmZXIgd2hpbGUgd3JpdGluZworICogICB0aGUgc25hcCBoZWFkZXIsIEhGU19UWVBFIGlzIGNob3NlbiBhcyBhIHJlZmVyZW5jZSBwb2ludCB0byBtYWtlIGl0IGVhc2llciB0byBncmFzcCB0aGF0IHRoZSBzbmFwIGhlYWRlcgorICogICBhbmQgZW5jYXBzdWFsdGlvbiB0eXBlIGFyZSBhdCBsZWFzdCByZWxhdGl2ZSBpbiB0aGUgcmlnaHQuCisgKjg6IG1vZGlmeSAxc3QgZGVzY3JpcHRvciB0byByZWZsZWN0IG1vdmVkIHBhcnQgb2YgdGhlIDgwMi4zIGhlYWRlciArIFNuYXAtaGVhZGVyCisgKiAgIG1vZGlmeSAybmQgZGVzY3JpcHRvciB0byBza2lwIHRoZSBtb3ZlZCBwYXJ0IG9mIHRoZSA4MDIuMyBoZWFkZXIgKERBL1NBCisgKjEwOiBzZXQgZWFjaCBkZXNjcmlwdG9yIHRvICdETUEgb3duZWQnLCAgY2xlYXIgYWxsIG90aGVyIGNvbnRyb2wgYml0cy4KKyAqICAgU2V0IFNPUCBiaXQgb24gZmlyc3QgZGVzY3JpcHRvci4gU2V0IEVPUCBiaXQgb24gbGFzdCBkZXNjcmlwdG9yLgorICoxMjogRWl0aGVyIGFwcGVuZCB0aGUgY3VycmVudCBmcmFtZSB0byBhbiBleGlzdGluZyBkZXNjcmlwdG9yIGxpc3Qgb3IKKyAqMTQ6IGNyZWF0ZSBhIGxpc3QgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnJlbnQgZnJhbWUKKyAqMTY6IHJlbWVtYmVyIHRoZSBuZXcgZW5kIG9mIHRoZSBsaXN0CisgKjIwOiBoYW5kIHRoZSBmcmFtZSBvdmVyIHRvIHRoZSBETUEgZW5naW5lCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZAogaGNmX2RtYV90eF9wdXQoIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AsIGhjZl8xNiB0eF9jbnRsICkKIHsKLURFU0NfU1RSQ1QJKnAgPSBkZXNjcC0+bmV4dF9kZXNjX2FkZHI7Ci1pbnQJCQlpOworCURFU0NfU1RSQ1QgICpwID0gZGVzY3AtPm5leHRfZGVzY19hZGRyOworCWludCAgICAgICAgIGk7CiAKICNpZiBIQ0ZfQVNTRVJUCiAJaW50IHggPSBpZmJwLT5JRkJfRldJZGVudGl0eS5jb21wX2lkID09IENPTVBfSURfRldfQVAgPyB0eF9jbnRsICYgfkhGU19UWF9DTlRMX1BPUlQgOiB0eF9jbnRsOwotCUhDRkFTU0VSVCggKHggJiB+SENGX1RYX0NOVExfTUFTSyApID09IDAsIHR4X2NudGwgKQorCUhDRkFTU0VSVCggKHggJiB+SENGX1RYX0NOVExfTUFTSyApID09IDAsIHR4X2NudGwgKTsKICNlbmRpZiAvLyBIQ0ZfQVNTRVJUCi0JSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9ETUFfVFhfUFVULCAweERBMDMgKQotCUhDRkFTU0VSVCggaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQywgaWZicC0+SUZCX01hZ2ljICkKLQlIQ0ZBU1NFUlRfSU5UCi0JSENGQVNTRVJUKCAoIGlmYnAtPklGQl9DbnRsT3B0ICYgKFVTRV9ETUF8RE1BX0VOQUJMRUQpICkgPT0gKFVTRV9ETUF8RE1BX0VOQUJMRUQpLCBpZmJwLT5JRkJfQ250bE9wdCkKKwlIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0RNQV9UWF9QVVQsIDB4REEwMyApOworCUhDRkFTU0VSVCggaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQywgaWZicC0+SUZCX01hZ2ljICk7CisJSENGQVNTRVJUX0lOVDsKKwlIQ0ZBU1NFUlQoICggaWZicC0+SUZCX0NudGxPcHQgJiAoVVNFX0RNQXxETUFfRU5BQkxFRCkgKSA9PSAoVVNFX0RNQXxETUFfRU5BQkxFRCksIGlmYnAtPklGQl9DbnRsT3B0KTsKIAogCWlmICggZGVzY3AtPmJ1Zl9hZGRyICkgewotCQkqKGhjZl8xNiopKGRlc2NwLT5idWZfYWRkciArIEhGU19UWF9DTlRMKSA9IHR4X2NudGw7CQkJCQkJCQkJCQkvKjEqLworCQkqKGhjZl8xNiopKGRlc2NwLT5idWZfYWRkciArIEhGU19UWF9DTlRMKSA9IHR4X2NudGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjEqLwogI2lmIChIQ0ZfRU5DQVApID09IEhDRl9FTkMKLQkJSENGQVNTRVJUKCBkZXNjcC0+bmV4dF9kZXNjX2FkZHIsIDAgKQkJCQkJCQkJCS8vYXQgbGVhc3QgMiBkZXNjcmlwb3JzCi0JCUhDRkFTU0VSVCggZGVzY3AtPkJVRl9DTlQgPT0gSEZTX0FERFJfREVTVCwgZGVzY3AtPkJVRl9DTlQgKQkvL2V4YWN0IGxlbmd0aCByZXF1aXJlZCBmb3IgMXN0IGJ1ZmZlcgotCQlIQ0ZBU1NFUlQoIGRlc2NwLT5CVUZfU0laRSA+PSBIQ0ZfRE1BX1RYX0JVRjFfU0laRSwgZGVzY3AtPkJVRl9TSVpFICkJLy9taW5pbWFsIHN0b3JhZ2UgZm9yIGVuY2Fwc3VsYXRpb24KLQkJSENGQVNTRVJUKCBwLT5CVUZfQ05UID49IDE0LCBwLT5CVUZfQ05UICk7CQkJCQkvL2F0IGxlYXN0IERBLCBTQSBhbmQgJ3R5cGUnIGluIDJuZCBidWZmZXIKKwkJSENGQVNTRVJUKCBkZXNjcC0+bmV4dF9kZXNjX2FkZHIsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYXQgbGVhc3QgMiBkZXNjcmlwb3JzCisJCUhDRkFTU0VSVCggZGVzY3AtPkJVRl9DTlQgPT0gSEZTX0FERFJfREVTVCwgZGVzY3AtPkJVRl9DTlQgKTsgICAgLy9leGFjdCBsZW5ndGggcmVxdWlyZWQgZm9yIDFzdCBidWZmZXIKKwkJSENGQVNTRVJUKCBkZXNjcC0+QlVGX1NJWkUgPj0gSENGX0RNQV9UWF9CVUYxX1NJWkUsIGRlc2NwLT5CVUZfU0laRSApOyAgIC8vbWluaW1hbCBzdG9yYWdlIGZvciBlbmNhcHN1bGF0aW9uCisJCUhDRkFTU0VSVCggcC0+QlVGX0NOVCA+PSAxNCwgcC0+QlVGX0NOVCApOyAgICAgICAgICAgICAgICAgIC8vYXQgbGVhc3QgREEsIFNBIGFuZCAndHlwZScgaW4gMm5kIGJ1ZmZlcgogCi0jaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0NDWAotCQkvKiBpZiB3ZSBhcmUgZG9pbmcgUFBLICsvLSBDTUlDLCBvciB3ZSBhcmUgc2VuZGluZyBhIEREUCBmcmFtZSAqLwotCQlpZiAoICggaWZicC0+SUZCX0NLSVBTdGF0ID09IEhDRl9BQ1RfQ0NYX09OICkgfHwKLQkJCSAoICggcC0+QlVGX0NOVCA+PSAyMCApCQkgJiYgKCBpZmJwLT5JRkJfQ0tJUFN0YXQgPT0gSENGX0FDVF9DQ1hfT0ZGICkgJiYKLQkJCSAoIHAtPmJ1Zl9hZGRyWzEyXSA9PSAweEFBICkgJiYgKCBwLT5idWZfYWRkclsxM10gPT0gMHhBQSApICYmCi0JCQkgKCBwLT5idWZfYWRkclsxNF0gPT0gMHgwMyApICYmICggcC0+YnVmX2FkZHJbMTVdID09IDB4MDAgKSAmJgotCQkJICggcC0+YnVmX2FkZHJbMTZdID09IDB4NDAgKSAmJiAoIHAtPmJ1Zl9hZGRyWzE3XSA9PSAweDk2ICkgJiYKLQkJCSAoIHAtPmJ1Zl9hZGRyWzE4XSA9PSAweDAwICkgJiYgKCBwLT5idWZfYWRkclsxOV0gPT0gMHgwMCApKSkKLQkJewotCQkJLyogY29weSB0aGUgREEvU0EgdG8gdGhlIGZpcnN0IGJ1ZmZlciAqLwotCQkJZm9yICggaSA9IDA7IGkgPCBIQ0ZfREFTQV9TSVpFOyBpKysgKSB7Ci0JCQkJZGVzY3AtPmJ1Zl9hZGRyW2kgKyBIRlNfQUREUl9ERVNUXSA9IHAtPmJ1Zl9hZGRyW2ldOworCQlkZXNjcC0+YnVmX2FkZHJbSEZTX1RZUEUtMV0gPSBoY2ZfZW5jYXAoJmRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+YnVmX2FkZHJbSENGX0RBU0FfU0laRV0pOyAgICAgICAvKjQqLworCQlpZiAoIGRlc2NwLT5idWZfYWRkcltIRlNfVFlQRS0xXSAhPSBFTkNfTk9ORSApIHsKKwkJCWZvciAoIGk9MDsgaSA8IEhDRl9EQVNBX1NJWkU7IGkrKyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyo2Ki8KKwkJCQlkZXNjcC0+YnVmX2FkZHJbaSArIEhGU19BRERSX0RFU1RdID0gZGVzY3AtPm5leHRfZGVzY19hZGRyLT5idWZfYWRkcltpXTsKIAkJCX0KLQkJCS8qIGNhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBzZWNvbmQgZnJhZ21lbnQgb25seSAqLwotCQkJaSA9IDA7Ci0JCQlkbyB7IGkgKz0gcC0+QlVGX0NOVDsgfSB3aGlsZSggcCA9IHAtPm5leHRfZGVzY19hZGRyICk7Ci0JCQlpIC09IEhDRl9EQVNBX1NJWkUgOwotCQkJLyogY29udmVydCB0aGUgbGVuZ3RoIGZpZWxkIHRvIGJpZyBlbmRpYW4sIHVzaW5nIHRoZSBlbmRpYW4gZnJpZW5kbHkgbWFjcm9zICovCi0JCQlpID0gQ05WX1NIT1JUX1RPX0JJRyhpKTsJCS8vISEgdGhpcyBjb252ZXJ0cyBPTkxZIG9uIExFIHBsYXRmb3JtcywgaG93IGRvZXMgdGhhdCByZWxhdGUgdG8gdGhlIG5vbi1DQ1ggY29kZQotCQkJKihoY2ZfMTYqKSgmZGVzY3AtPmJ1Zl9hZGRyW0hGU19MRU5dKSA9IChoY2ZfMTYpaTsKLQkJCWRlc2NwLT5CVUZfQ05UID0gSEZTX0RBVDsKLQkJCS8vIG1vZGlmeSAybmQgZGVzY3JpcHRvciB0byBza2lwIHRoZSAnRGEvU2EnIGZpZWxkcwotCQkJZGVzY3AtPm5leHRfZGVzY19hZGRyLT5idWZfcGh5c19hZGRyICs9IEhDRl9EQVNBX1NJWkU7Ci0JCQlkZXNjcC0+bmV4dF9kZXNjX2FkZHItPkJVRl9DTlQJCSAtPSBIQ0ZfREFTQV9TSVpFOwotCQl9Ci0JCWVsc2UKLSNlbmRpZiAvLyBIQ0ZfVFlQRV9DQ1gKLQkJewotCQkJZGVzY3AtPmJ1Zl9hZGRyW0hGU19UWVBFLTFdID0gaGNmX2VuY2FwKCZkZXNjcC0+bmV4dF9kZXNjX2FkZHItPmJ1Zl9hZGRyW0hDRl9EQVNBX1NJWkVdKTsJCS8qNCovCi0JCQlpZiAoIGRlc2NwLT5idWZfYWRkcltIRlNfVFlQRS0xXSAhPSBFTkNfTk9ORSApIHsKLQkJCQlmb3IgKCBpPTA7IGkgPCBIQ0ZfREFTQV9TSVpFOyBpKysgKSB7CQkJCQkJCQkJCQkJCQkvKjYqLwotCQkJCQlkZXNjcC0+YnVmX2FkZHJbaSArIEhGU19BRERSX0RFU1RdID0gZGVzY3AtPm5leHRfZGVzY19hZGRyLT5idWZfYWRkcltpXTsKLQkJCQl9Ci0JCQkJaSA9IHNpemVvZihzbmFwX2hlYWRlcikgKyAyIC0gKCAyKjYgKyAyICk7Ci0JCQkJZG8geyBpICs9IHAtPkJVRl9DTlQ7IH0gd2hpbGUgKCAoIHAgPSBwLT5uZXh0X2Rlc2NfYWRkciApICE9IE5VTEwgKTsKLQkJCQkqKGhjZl8xNiopKCZkZXNjcC0+YnVmX2FkZHJbSEZTX0xFTl0pID0gQ05WX0VORF9TSE9SVChpKTsJLy8hISB0aGlzIGNvbnZlcnRzIG9uIEFMTCBwbGF0Zm9ybXMsIGhvdyBkb2VzIHRoYXQgcmVsYXRlIHRvIHRoZSBDQ1ggY29kZQotCQkJCWZvciAoIGk9MDsgaSA8IHNpemVvZihzbmFwX2hlYWRlcikgLSAxOyBpKyspIHsKLQkJCQkJZGVzY3AtPmJ1Zl9hZGRyW0hGU19UWVBFIC0gc2l6ZW9mKHNuYXBfaGVhZGVyKSArIGldID0gc25hcF9oZWFkZXJbaV07Ci0JCQkJfQotCQkJCWRlc2NwLT5CVUZfQ05UID0gSEZTX1RZUEU7CQkJCQkJCQkJCQkJCQkJCQkvKjgqLwotCQkJCWRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+YnVmX3BoeXNfYWRkcgkrPSBIQ0ZfREFTQV9TSVpFOwotCQkJCWRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+QlVGX0NOVAkJCS09IEhDRl9EQVNBX1NJWkU7CisJCQlpID0gc2l6ZW9mKHNuYXBfaGVhZGVyKSArIDIgLSAoIDIqNiArIDIgKTsKKwkJCWRvIHsgaSArPSBwLT5CVUZfQ05UOyB9IHdoaWxlICggKCBwID0gcC0+bmV4dF9kZXNjX2FkZHIgKSAhPSBOVUxMICk7CisJCQkqKGhjZl8xNiopKCZkZXNjcC0+YnVmX2FkZHJbSEZTX0xFTl0pID0gQ05WX0VORF9TSE9SVChpKTsgICAvLyEhIHRoaXMgY29udmVydHMgb24gQUxMIHBsYXRmb3JtcywgaG93IGRvZXMgdGhhdCByZWxhdGUgdG8gdGhlIENDWCBjb2RlCisJCQlmb3IgKCBpPTA7IGkgPCBzaXplb2Yoc25hcF9oZWFkZXIpIC0gMTsgaSsrKSB7CisJCQkJZGVzY3AtPmJ1Zl9hZGRyW0hGU19UWVBFIC0gc2l6ZW9mKHNuYXBfaGVhZGVyKSArIGldID0gc25hcF9oZWFkZXJbaV07CiAJCQl9CisJCQlkZXNjcC0+QlVGX0NOVCA9IEhGU19UWVBFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qOCovCisJCQlkZXNjcC0+bmV4dF9kZXNjX2FkZHItPmJ1Zl9waHlzX2FkZHIgICAgKz0gSENGX0RBU0FfU0laRTsKKwkJCWRlc2NwLT5uZXh0X2Rlc2NfYWRkci0+QlVGX0NOVCAgICAgICAgICAtPSBIQ0ZfREFTQV9TSVpFOwogCQl9CiAjZW5kaWYgLy8gSENGX0VOQwotICAgIH0KKwl9CiAJcHV0X2ZyYW1lX2xzdCggaWZicCwgZGVzY3AsIERNQV9UWCApOwotCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9ETUFfVFhfUFVUICkKKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfRE1BX1RYX1BVVCApOwogfSAvLyBoY2ZfZG1hX3R4X3B1dAogCiAjZW5kaWYgLy8gSENGX0RNQQogCi0jaWYgKEhDRl9ETF9PTkxZKSA9PSAwCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qLk1PRFVMRQkJaGNmXzggaGNmX2VuY2FwKCB3Y2lfYnVmcCB0eXBlICkKLSouUFVSUE9TRQkJdGVzdCB3aGV0aGVyIFJGQzEwNDIgb3IgQnJpZGdlLVR1bm5lbCBlbmNhcHN1bGF0aW9uIGlzIG5lZWRlZC4KLSoKLSouQVJHVU1FTlRTCi0qCXR5cGUJCShGYXIpIHBvaW50ZXIgdG8gdGhlIChCaWcgRW5kaWFuKSBUeXBlL0xlbmd0aCBmaWVsZCBpbiB0aGUgbWVzc2FnZQotKgotKi5SRVRVUk5TCi0qCUVOQ19OT05FCQlsZW4vdHlwZSBpcyAibGVuIiAoIChCSUdfRU5ESUFOKXR5cGUgPD0gMTUwMCApCi0qCUVOQ19UVU5ORUwJCWxlbi90eXBlIGlzICJ0eXBlIiBhbmQgMHg4MEYzIG9yIDB4ODEzNwotKglFTkNfMTA0MgkJbGVuL3R5cGUgaXMgInR5cGUiIGJ1dCBub3QgMHg4MEYzIG9yIDB4ODEzNwotKgotKi5DT05ESVRJT05TCi0qCU5JQyBJbnRlcnJ1cHRzCWQuYwotKgotKi5ERVNDUklQVElPTgotKiBUeXBlIG11c3QgcG9pbnQgdG8gdGhlIExlbi9UeXBlIGZpZWxkIG9mIHRoZSBtZXNzYWdlLCB0aGlzIGlzIHRoZSAyLWJ5dGUgZmllbGQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIDYgYnl0ZQotKiBEZXN0aW5hdGlvbiBBZGRyZXNzIGFuZCA2IGJ5dGUgU291cmNlIEFkZHJlc3MuICBUaGUgMiBzdWNjZXNzaXZlIGJ5dGVzIGFkZHJlc3NlZCBieSB0eXBlIGFyZSBpbnRlcnByZXRlZCBhcwotKiBhIEJpZyBFbmRpYW4gdmFsdWUuICBJZiB0aGF0IHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxNTAwLCB0aGUgbWVzc2FnZSBpcyBhc3N1bWVkIHRvIGJlIGluIDgwMi4zCi0qIGZvcm1hdC4gIE90aGVyd2lzZSB0aGUgbWVzc2FnZSBpcyBhc3N1bWVkIHRvIGJlIGluIEV0aGVybmV0LUlJIGZvcm1hdC4gIERlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgTGVuL1R5cCwKLSogQnJpZGdlIFR1bm5lbCBvciBSRkMxMDQyIGVuY2Fwc3VsYXRpb24gaXMgbmVlZGVkLgotKgotKi5ESUFHUkFNCi0qCi0qICAxOglwcmVzdW1lIDgwMi4zLCBoZW5jZSBwcmVzZXQgcmV0dXJuIHZhbHVlIGF0IEVOQ19OT05FCi0qICAyOgljb252ZXJ0IHR5cGUgZnJvbSAibmV0d29yayIgRW5kaWFuIGZvcm1hdCB0byBuYXRpdmUgRW5kaWFuCi0qICA0Ogl0aGUgbGl0bXVzIHRlc3QgdG8gZGlzdGluZ3Vpc2ggdHlwZSBhbmQgbGVuLgotKglUaGUgaGFyZCBjb2RlICJtYWdpYyIgdmFsdWUgb2YgMTUwMCBpcyBpbnRlbnRpb25hbCBhbmQgc2hvdWxkIE5PVCBiZSByZXBsYWNlZCBieSBhIG1uZW1vbmljIGJlY2F1c2UgaXQgaXMKLSoJbm90IHJlbGF0ZWQgYXQgYWxsIHRvIHRoZSBtYXhpbXVtIGZyYW1lIHNpemUgc3VwcG9ydGVkICBieSB0aGUgSGVybWVzLgotKiAgNjoJY2hlY2sgdHlwZSBhZ2FpbnN0OgotKgkJMHg4MEYzCS8vQXBwbGVUYWxrIEFkZHJlc3MgUmVzb2x1dGlvbiBQcm90b2NvbCAoQUFSUCkKLSoJCTB4ODEzNwkvL0lQWAotKgl0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgZW5jYXBzdWxhdGlvbgotKgotKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZiBIQ0ZfRU5DQVAJLy9pLmUgSENGX0VOQyBvciBIQ0ZfRU5DX1NVUAotI2lmICEgKCAoSENGX0VOQ0FQKSAmIEhDRl9FTkNfU1VQICkKLUhDRl9TVEFUSUMKLSNlbmRpZiAvLyBIQ0ZfRU5DQVAKLWhjZl84CisgKgorICouTU9EVUxFICAgICAgICBoY2ZfOCBoY2ZfZW5jYXAoIHdjaV9idWZwIHR5cGUgKQorICouUFVSUE9TRSAgICAgICB0ZXN0IHdoZXRoZXIgUkZDMTA0MiBvciBCcmlkZ2UtVHVubmVsIGVuY2Fwc3VsYXRpb24gaXMgbmVlZGVkLgorICoKKyAqLkFSR1VNRU5UUworICogICB0eXBlICAgICAgICAoRmFyKSBwb2ludGVyIHRvIHRoZSAoQmlnIEVuZGlhbikgVHlwZS9MZW5ndGggZmllbGQgaW4gdGhlIG1lc3NhZ2UKKyAqCisgKi5SRVRVUk5TCisgKiAgIEVOQ19OT05FICAgICAgICBsZW4vdHlwZSBpcyAibGVuIiAoIChCSUdfRU5ESUFOKXR5cGUgPD0gMTUwMCApCisgKiAgIEVOQ19UVU5ORUwgICAgICBsZW4vdHlwZSBpcyAidHlwZSIgYW5kIDB4ODBGMyBvciAweDgxMzcKKyAqICAgRU5DXzEwNDIgICAgICAgIGxlbi90eXBlIGlzICJ0eXBlIiBidXQgbm90IDB4ODBGMyBvciAweDgxMzcKKyAqCisgKi5DT05ESVRJT05TCisgKiAgIE5JQyBJbnRlcnJ1cHRzICBkLmMKKyAqCisgKi5ERVNDUklQVElPTgorICogVHlwZSBtdXN0IHBvaW50IHRvIHRoZSBMZW4vVHlwZSBmaWVsZCBvZiB0aGUgbWVzc2FnZSwgdGhpcyBpcyB0aGUgMi1ieXRlIGZpZWxkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSA2IGJ5dGUKKyAqIERlc3RpbmF0aW9uIEFkZHJlc3MgYW5kIDYgYnl0ZSBTb3VyY2UgQWRkcmVzcy4gIFRoZSAyIHN1Y2Nlc3NpdmUgYnl0ZXMgYWRkcmVzc2VkIGJ5IHR5cGUgYXJlIGludGVycHJldGVkIGFzCisgKiBhIEJpZyBFbmRpYW4gdmFsdWUuICBJZiB0aGF0IHZhbHVlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxNTAwLCB0aGUgbWVzc2FnZSBpcyBhc3N1bWVkIHRvIGJlIGluIDgwMi4zCisgKiBmb3JtYXQuICBPdGhlcndpc2UgdGhlIG1lc3NhZ2UgaXMgYXNzdW1lZCB0byBiZSBpbiBFdGhlcm5ldC1JSSBmb3JtYXQuICBEZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIExlbi9UeXAsCisgKiBCcmlkZ2UgVHVubmVsIG9yIFJGQzEwNDIgZW5jYXBzdWxhdGlvbiBpcyBuZWVkZWQuCisgKgorICouRElBR1JBTQorICoKKyAqICAxOiAgIHByZXN1bWUgODAyLjMsIGhlbmNlIHByZXNldCByZXR1cm4gdmFsdWUgYXQgRU5DX05PTkUKKyAqICAyOiAgIGNvbnZlcnQgdHlwZSBmcm9tICJuZXR3b3JrIiBFbmRpYW4gZm9ybWF0IHRvIG5hdGl2ZSBFbmRpYW4KKyAqICA0OiAgIHRoZSBsaXRtdXMgdGVzdCB0byBkaXN0aW5ndWlzaCB0eXBlIGFuZCBsZW4uCisgKiAgIFRoZSBoYXJkIGNvZGUgIm1hZ2ljIiB2YWx1ZSBvZiAxNTAwIGlzIGludGVudGlvbmFsIGFuZCBzaG91bGQgTk9UIGJlIHJlcGxhY2VkIGJ5IGEgbW5lbW9uaWMgYmVjYXVzZSBpdCBpcworICogICBub3QgcmVsYXRlZCBhdCBhbGwgdG8gdGhlIG1heGltdW0gZnJhbWUgc2l6ZSBzdXBwb3J0ZWQgIGJ5IHRoZSBIZXJtZXMuCisgKiAgNjogICBjaGVjayB0eXBlIGFnYWluc3Q6CisgKiAgICAgICAweDgwRjMgIC8vQXBwbGVUYWxrIEFkZHJlc3MgUmVzb2x1dGlvbiBQcm90b2NvbCAoQUFSUCkKKyAqICAgICAgIDB4ODEzNyAgLy9JUFgKKyAqICAgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGVuY2Fwc3VsYXRpb24KKyAqCisgKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworSENGX1NUQVRJQyBoY2ZfOAogaGNmX2VuY2FwKCB3Y2lfYnVmcCB0eXBlICkKIHsKIAotaGNmXzgJcmMgPSBFTkNfTk9ORTsJCQkJCQkJCQkJCQkJCQkJCQkJCQkvKiAxICovCi1oY2ZfMTYJdCA9IChoY2ZfMTYpKCp0eXBlPDw4KSArICoodHlwZSsxKTsJCQkJCQkJCQkJCQkJCQkJLyogMiAqLworCWhjZl84ICAgcmMgPSBFTkNfTk9ORTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMSAqLworCWhjZl8xNiAgdCA9IChoY2ZfMTYpKCp0eXBlPDw4KSArICoodHlwZSsxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMiAqLwogCi0JaWYgKCB0ID4gMTUwMCApIHsJCQkJCQkJCQkJCQkJCQkJCQkJCQkvKiA0ICovCisJaWYgKCB0ID4gMTUwMCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQgKi8KIAkJaWYgKCB0ID09IDB4ODEzNyB8fCB0ID09IDB4ODBGMyApIHsKLQkJCXJjID0gRU5DX1RVTk5FTDsJCQkJCQkJCQkJCQkJCQkJCQkJLyogNiAqLworCQkJcmMgPSBFTkNfVFVOTkVMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2ICovCiAJCX0gZWxzZSB7CiAJCQlyYyA9IEVOQ18xMDQyOwogCQl9CiAJfQogCXJldHVybiByYzsKIH0gLy8gaGNmX2VuY2FwCi0jZW5kaWYgLy8gSENGX0VOQ0FQCi0jZW5kaWYgLy8gSENGX0RMX09OTFkKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qLk1PRFVMRQkJaW50IGhjZl9nZXRfaW5mbyggSUZCUCBpZmJwLCBMVFZQIGx0dnAgKQotKi5QVVJQT1NFCQlPYnRhaW5zIHRyYW5zaWVudCBhbmQgcGVyc2lzdGVudCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIENhcmQgYW5kIGZyb20gdGhlIEhDRi4KLSoKLSouQVJHVU1FTlRTCi0qCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawotKglsdHZwCQlhZGRyZXNzIG9mIExlbmd0aFR5cGVWYWx1ZSBzdHJ1Y3R1cmUgc3BlY2lmeWluZyB0aGUgIndoYXQiIGFuZCB0aGUgImhvdyBtdWNoIiBvZiB0aGUKLSoJCQkJaW5mb3JtYXRpb24gdG8gYmUgY29sbGVjdGVkIGZyb20gdGhlIEhDRiBvciBmcm9tIHRoZSBIZXJtZXMKLSoKLSouUkVUVVJOUwotKglIQ0ZfRVJSX0xFTgkJCVRoZSBwcm92aWRlZCBidWZmZXIgd2FzIHRvbyBzbWFsbAotKglIQ0ZfU1VDQ0VTUwkJCVN1Y2Nlc3MKLSohIQl2aWEgY21kX2V4ZSAoIHR5cGUgPj0gQ0ZHX1JJRF9GV19NSU4gKQotKglIQ0ZfRVJSX05PX05JQwkJTklDIHJlbW92ZWQgZHVyaW5nIHJldHJpZXZhbAotKglIQ0ZfRVJSX1RJTUVfT1VUCUV4cGVjdGVkIEhlcm1lcyBldmVudCBkaWQgbm90IG9jY3VyIGluIGV4cGVjdGVkIHRpbWUKLSohIQl2aWEgY21kX2V4ZSBhbmQgc2V0dXBfYmFwICh0eXBlID49IENGR19SSURfRldfTUlOICkKLSoJSENGX0VSUl9ERUZVTkNUXy4uLglIQ0YgaXMgaW4gZGVmdW5jdCBtb2RlIChiaXRzIDB4N0YgcmVmbGVjdCBjYXVzZSkKLSoKLSouREVTQ1JJUFRJT04KLSogVGhlIFQtZmllbGQgb2YgdGhlIExUVi1yZWNvcmQgKHByb3ZpZGVkIGJ5IHRoZSBNU0YgaW4gcGFyYW1ldGVyIGx0dnApIHNwZWNpZmllcyB0aGUgUklEIHdhbnRlZC4gVGhlIFJJRAotKiBpbmZvcm1hdGlvbiBpZGVudGlmaWVkIGJ5IHRoZSBULWZpZWxkIGlzIGNvcGllZCBpbnRvIHRoZSBWLWZpZWxkLgotKiBPbiBlbnRyeSwgdGhlIEwtZmllbGQgc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIsIGFsc28gY2FsbGVkIHRoZSAiSW5pdGlhbCBEYXRhTGVuZ3RoIi4gVGhlIEwtdmFsdWUKLSogaW5jbHVkZXMgdGhlIHNpemUgb2YgdGhlIFQtZmllbGQsIGJ1dCBub3QgdGhlIHNpemUgb2YgdGhlIEwtZmllbGQgaXRzZWxmLgotKiBPbiByZXR1cm4sIHRoZSBMLWZpZWxkIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHdvcmRzIGFjdHVhbGx5IGNvbnRhaW5lZCBieSB0aGUgVHlwZSBhbmQgVmFsdWUgZmllbGRzLgotKiBBcyB0aGUgc2l6ZSBvZiB0aGUgVHlwZSBmaWVsZCBpbiB0aGUgTFRWLXJlY29yZCBpcyBpbmNsdWRlZCBpbiB0aGUgIkluaXRpYWwgRGF0YUxlbmd0aCIgb2YgdGhlIHJlY29yZCwgdGhlCi0qIFYtZmllbGQgY2FuIGNvbnRhaW4gYXQgbW9zdCAiSW5pdGlhbCBEYXRhTGVuZ3RoIiAtIDEgd29yZHMgb2YgZGF0YS4KLSogQ29weWluZyBzdG9wcyBpZiBlaXRoZXIgdGhlIGNvbXBsZXRlIEluZm9ybWF0aW9uIGlzIGNvcGllZCBvciBpZiB0aGUgbnVtYmVyIG9mIHdvcmRzIGluZGljYXRlZCBieSB0aGUKLSogIkluaXRpYWwgRGF0YUxlbmd0aCIgd2VyZSBjb3BpZWQuICBUaGUgIkluaXRpYWwgRGF0YUxlbmd0aCIgYWN0cyBhcyBhIHNhZmUgZ3VhcmQgYWdhaW5zdCBDb25maWd1cmF0aW9uCi0qIEluZm9ybWF0aW9uIGJsb2NrcyB0aGF0IGhhdmUgZGlmZmVyZW50IHNpemVzIGZvciBkaWZmZXJlbnQgRi9XIHZlcnNpb25zLCBlLmcuIHdoZW4gbGF0ZXIgdmVyc2lvbnMgc3VwcG9ydAotKiBtb3JlIHRhbGxpZXMgdGhhbiBlYXJsaWVyIHZlcnNpb25zLgotKiBJZiB0aGUgc2l6ZSBvZiBWYWx1ZSBmaWVsZCBvZiB0aGUgUklEIGV4Y2VlZHMgdGhlIHNpemUgb2YgdGhlICJJbml0aWFsIERhdGFMZW5ndGgiIC0xLCBhcyBtdWNoIGRhdGEKLSogYXMgZml0cyBpcyBjb3BpZWQsIGFuZCBhbiBlcnJvciBzdGF0dXMgb2YgSENGX0VSUl9MRU4gaXMgcmV0dXJuZWQuCi0qCi0qIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgTVNGIHRvIGRldGVjdCBjYXJkIHJlbW92YWwgYW5kIHJlLWluc2VydGlvbiBhbmQgbm90IGNhbGwgdGhlIEhDRiB3aGVuIHRoZQotKiBOSUMgaXMgYWJzZW50LiBUaGUgTVNGIGNhbm5vdCwgaG93ZXZlciwgdGltZWx5IGRldGVjdCBhIENhcmQgcmVtb3ZhbCBpZiB0aGUgQ2FyZCBpcyByZW1vdmVkIHdoaWxlCi0qIGhjZl9nZXRfaW5mbyBpcyBpbiBwcm9ncmVzcy4gIFRoZXJlZm9yZSwgdGhlIEhDRiBwZXJmb3JtcyBpdHMgb3duIGNoZWNrIG9uIENhcmQgcHJlc2VuY2UgYWZ0ZXIgdGhlIHJlYWQKLSogb3BlcmF0aW9uIG9mIHRoZSBOSUMgZGF0YS4gIElmIHRoZSBDYXJkIGlzIG5vdCBwcmVzZW50IG9yIHJlbW92ZWQgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgaGNmX2dldF9pbmZvLAotKiBIQ0ZfRVJSX05PX05JQyBpcyByZXR1cm5lZCBhbmQgdGhlIGNvbnRlbnQgb2YgdGhlIERhdGEgQnVmZmVyIGlzIHVucHJlZGljdGFibGUuIFRoaXMgY2hlY2sgaXMgbm90IHBlcmZvcm1lZAotKiBpbiBjYXNlIG9mIHRoZSAiSENGIGVtYmVkZGVkIiBwc2V1ZG8gUklEcyBsaWtlIENGR19UQUxMSUVTLgotKgotKiBBc3NlcnQgZmFpbHMgaWYKLSogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCi0qIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbgotKglhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yIG11bHRpLXRocmVhZGluZy4KLSogLSBsdHZwIGlzIGEgTlVMTCBwb2ludGVyLgotKiAtIGxlbmd0aCBmaWVsZCBvZiB0aGUgTFRWLXJlY29yZCBhdCBlbnRyeSBpcyAwIG9yIDEgb3IgaGFzIGFuIGV4Y2Vzc2l2ZSB2YWx1ZSAoaS5lLiBleGNlZWRzIEhDRl9NQVhfTFRWKS4KLSogLSB0eXBlIGZpZWxkIG9mIHRoZSBMVFYtcmVjb3JkIGlzIGludmFsaWQuCi0qCi0qLkRJQUdSQU0KLSoJSGNmX2dldF9tYl9pbmZvIGNvcGllcyB0aGUgY29udGVudHMgb2YgdGhlIG9sZGVzdCBNYWlsQm94IEluZm8gYmxvY2sgaW4gdGhlIE1haWxCb3ggdG8gUEMgUkFNLiBJZiBsZW4gaXMKLSoJbGVzcyB0aGFuIHRoZSBzaXplIG9mIHRoZSBNYWlsQm94IEluZm8gYmxvY2ssIG9ubHkgYXMgbXVjaCBhcyBmaXRzIGluIHRoZSBQQyBSQU0gYnVmZmVyIGlzIGNvcGllZC4gQWZ0ZXIKLSoJdGhlIGNvcHlpbmcgdGhlIE1haWxCb3ggUmVhZCBwb2ludGVyIGlzIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIG5leHQgTWFpbEJveCBJbmZvIGJsb2NrLCBoZW5jZSB0aGUKLSoJcmVtYWluZGVyIG9mIGFuICJvdmVyc2l6ZWQiIE1haWxCb3ggSW5mbyBibG9jayBpcyBsb3N0LiBUaGUgdHJ1bmNhdGlvbiBvZiB0aGUgTWFpbEJveCBJbmZvIGJsb2NrIGlzIE5PVAotKglyZWZsZWN0ZWQgaW4gdGhlIHJldHVybiBzdGF0dXMuIE5vdGUgdGhhdCBoY2ZfZ2V0X2luZm8gZ3VhcmFudGVlcyB0aGUgbGVuZ3RoIG9mIHRoZSBQQyBSQU0gYnVmZmVyIG1lZXRzCi0qCXRoZSBtaW5pbXVtIHJlcXVpcmVtZW50cyBvZiBhdCBsZWFzdCAyLCBzbyBubyBQQyBSQU0gYnVmZmVyIG92ZXJydW4uCi0qCi0qCUNhbGxpbmcgaGNmX2dldF9tYl9pbmZvIHdoZW4gdGhlaXIgaXMgbm8gTWFpbEJveCBJbmZvIGJsb2NrIGF2YWlsYWJsZSBvciB3aGVuIHRoZXJlIGlzIG5vIE1haWxCb3ggYXQgYWxsLAotKglyZXN1bHRzIGluIGEgIk5VTEwiIE1haWxCb3ggSW5mbyBibG9jay4KLSoKLSoxMjoJc2VlIE5PVElDRQotKjE3OiBUaGUgcmV0dXJuIHN0YXR1cyBvZiBjbWRfd2FpdCBhbmQgdGhlIGZpcnN0IGhjZmlvX2luX3N0cmluZyBjYW4gYmUgaWdub3JlZCwgYmVjYXVzZSB3aGVuIG9uZSBmYWlscywgdGhlCi0qCW90aGVyIGZhaWxzIHZpYSB0aGUgSUZCX0RlZnVuY3RTdGF0IG1lY2hhbmlzbQotKjIwOiAiSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKSIgaXMgbm90IHN1aXRhYmxlIGJlY2F1c2UgdGhpcyB3aWxsIGFsd2F5cyB0cmlnZ2VyIGFzIHNpZGUgZWZmZWN0IG9mCi0qCXRoZSBIQ0ZBU1NFUlQgaW4gaGNmX3B1dF9pbmZvIHdoaWNoIGNhbGxzIGhjZl9nZXRfaW5mbyB0byBmaWd1cmUgb3V0IHdoZXRoZXIgdGhlIFJJRCBleGlzdHMgYXQgYWxsLgorICoKKyAqLk1PRFVMRSAgICAgICAgaW50IGhjZl9nZXRfaW5mbyggSUZCUCBpZmJwLCBMVFZQIGx0dnAgKQorICouUFVSUE9TRSAgICAgICBPYnRhaW5zIHRyYW5zaWVudCBhbmQgcGVyc2lzdGVudCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIENhcmQgYW5kIGZyb20gdGhlIEhDRi4KKyAqCisgKi5BUkdVTUVOVFMKKyAqICAgaWZicCAgICAgICAgYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisgKiAgIGx0dnAgICAgICAgIGFkZHJlc3Mgb2YgTGVuZ3RoVHlwZVZhbHVlIHN0cnVjdHVyZSBzcGVjaWZ5aW5nIHRoZSAid2hhdCIgYW5kIHRoZSAiaG93IG11Y2giIG9mIHRoZQorICogICAgICAgICAgICAgICBpbmZvcm1hdGlvbiB0byBiZSBjb2xsZWN0ZWQgZnJvbSB0aGUgSENGIG9yIGZyb20gdGhlIEhlcm1lcworICoKKyAqLlJFVFVSTlMKKyAqICAgSENGX0VSUl9MRU4gICAgICAgICBUaGUgcHJvdmlkZWQgYnVmZmVyIHdhcyB0b28gc21hbGwKKyAqICAgSENGX1NVQ0NFU1MgICAgICAgICBTdWNjZXNzCisgKiEhIHZpYSBjbWRfZXhlICggdHlwZSA+PSBDRkdfUklEX0ZXX01JTiApCisgKiAgIEhDRl9FUlJfTk9fTklDICAgICAgTklDIHJlbW92ZWQgZHVyaW5nIHJldHJpZXZhbAorICogICBIQ0ZfRVJSX1RJTUVfT1VUICAgIEV4cGVjdGVkIEhlcm1lcyBldmVudCBkaWQgbm90IG9jY3VyIGluIGV4cGVjdGVkIHRpbWUKKyAqISEgdmlhIGNtZF9leGUgYW5kIHNldHVwX2JhcCAodHlwZSA+PSBDRkdfUklEX0ZXX01JTiApCisgKiAgIEhDRl9FUlJfREVGVU5DVF8uLi4gSENGIGlzIGluIGRlZnVuY3QgbW9kZSAoYml0cyAweDdGIHJlZmxlY3QgY2F1c2UpCisgKgorICouREVTQ1JJUFRJT04KKyAqIFRoZSBULWZpZWxkIG9mIHRoZSBMVFYtcmVjb3JkIChwcm92aWRlZCBieSB0aGUgTVNGIGluIHBhcmFtZXRlciBsdHZwKSBzcGVjaWZpZXMgdGhlIFJJRCB3YW50ZWQuIFRoZSBSSUQKKyAqIGluZm9ybWF0aW9uIGlkZW50aWZpZWQgYnkgdGhlIFQtZmllbGQgaXMgY29waWVkIGludG8gdGhlIFYtZmllbGQuCisgKiBPbiBlbnRyeSwgdGhlIEwtZmllbGQgc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIsIGFsc28gY2FsbGVkIHRoZSAiSW5pdGlhbCBEYXRhTGVuZ3RoIi4gVGhlIEwtdmFsdWUKKyAqIGluY2x1ZGVzIHRoZSBzaXplIG9mIHRoZSBULWZpZWxkLCBidXQgbm90IHRoZSBzaXplIG9mIHRoZSBMLWZpZWxkIGl0c2VsZi4KKyAqIE9uIHJldHVybiwgdGhlIEwtZmllbGQgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2Ygd29yZHMgYWN0dWFsbHkgY29udGFpbmVkIGJ5IHRoZSBUeXBlIGFuZCBWYWx1ZSBmaWVsZHMuCisgKiBBcyB0aGUgc2l6ZSBvZiB0aGUgVHlwZSBmaWVsZCBpbiB0aGUgTFRWLXJlY29yZCBpcyBpbmNsdWRlZCBpbiB0aGUgIkluaXRpYWwgRGF0YUxlbmd0aCIgb2YgdGhlIHJlY29yZCwgdGhlCisgKiBWLWZpZWxkIGNhbiBjb250YWluIGF0IG1vc3QgIkluaXRpYWwgRGF0YUxlbmd0aCIgLSAxIHdvcmRzIG9mIGRhdGEuCisgKiBDb3B5aW5nIHN0b3BzIGlmIGVpdGhlciB0aGUgY29tcGxldGUgSW5mb3JtYXRpb24gaXMgY29waWVkIG9yIGlmIHRoZSBudW1iZXIgb2Ygd29yZHMgaW5kaWNhdGVkIGJ5IHRoZQorICogIkluaXRpYWwgRGF0YUxlbmd0aCIgd2VyZSBjb3BpZWQuICBUaGUgIkluaXRpYWwgRGF0YUxlbmd0aCIgYWN0cyBhcyBhIHNhZmUgZ3VhcmQgYWdhaW5zdCBDb25maWd1cmF0aW9uCisgKiBJbmZvcm1hdGlvbiBibG9ja3MgdGhhdCBoYXZlIGRpZmZlcmVudCBzaXplcyBmb3IgZGlmZmVyZW50IEYvVyB2ZXJzaW9ucywgZS5nLiB3aGVuIGxhdGVyIHZlcnNpb25zIHN1cHBvcnQKKyAqIG1vcmUgdGFsbGllcyB0aGFuIGVhcmxpZXIgdmVyc2lvbnMuCisgKiBJZiB0aGUgc2l6ZSBvZiBWYWx1ZSBmaWVsZCBvZiB0aGUgUklEIGV4Y2VlZHMgdGhlIHNpemUgb2YgdGhlICJJbml0aWFsIERhdGFMZW5ndGgiIC0xLCBhcyBtdWNoIGRhdGEKKyAqIGFzIGZpdHMgaXMgY29waWVkLCBhbmQgYW4gZXJyb3Igc3RhdHVzIG9mIEhDRl9FUlJfTEVOIGlzIHJldHVybmVkLgorICoKKyAqIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgTVNGIHRvIGRldGVjdCBjYXJkIHJlbW92YWwgYW5kIHJlLWluc2VydGlvbiBhbmQgbm90IGNhbGwgdGhlIEhDRiB3aGVuIHRoZQorICogTklDIGlzIGFic2VudC4gVGhlIE1TRiBjYW5ub3QsIGhvd2V2ZXIsIHRpbWVseSBkZXRlY3QgYSBDYXJkIHJlbW92YWwgaWYgdGhlIENhcmQgaXMgcmVtb3ZlZCB3aGlsZQorICogaGNmX2dldF9pbmZvIGlzIGluIHByb2dyZXNzLiAgVGhlcmVmb3JlLCB0aGUgSENGIHBlcmZvcm1zIGl0cyBvd24gY2hlY2sgb24gQ2FyZCBwcmVzZW5jZSBhZnRlciB0aGUgcmVhZAorICogb3BlcmF0aW9uIG9mIHRoZSBOSUMgZGF0YS4gIElmIHRoZSBDYXJkIGlzIG5vdCBwcmVzZW50IG9yIHJlbW92ZWQgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgaGNmX2dldF9pbmZvLAorICogSENGX0VSUl9OT19OSUMgaXMgcmV0dXJuZWQgYW5kIHRoZSBjb250ZW50IG9mIHRoZSBEYXRhIEJ1ZmZlciBpcyB1bnByZWRpY3RhYmxlLiBUaGlzIGNoZWNrIGlzIG5vdCBwZXJmb3JtZWQKKyAqIGluIGNhc2Ugb2YgdGhlICJIQ0YgZW1iZWRkZWQiIHBzZXVkbyBSSURzIGxpa2UgQ0ZHX1RBTExJRVMuCisgKgorICogQXNzZXJ0IGZhaWxzIGlmCisgKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZS4KKyAqIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbgorICogICBhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yIG11bHRpLXRocmVhZGluZy4KKyAqIC0gbHR2cCBpcyBhIE5VTEwgcG9pbnRlci4KKyAqIC0gbGVuZ3RoIGZpZWxkIG9mIHRoZSBMVFYtcmVjb3JkIGF0IGVudHJ5IGlzIDAgb3IgMSBvciBoYXMgYW4gZXhjZXNzaXZlIHZhbHVlIChpLmUuIGV4Y2VlZHMgSENGX01BWF9MVFYpLgorICogLSB0eXBlIGZpZWxkIG9mIHRoZSBMVFYtcmVjb3JkIGlzIGludmFsaWQuCisgKgorICouRElBR1JBTQorICogICBIY2ZfZ2V0X21iX2luZm8gY29waWVzIHRoZSBjb250ZW50cyBvZiB0aGUgb2xkZXN0IE1haWxCb3ggSW5mbyBibG9jayBpbiB0aGUgTWFpbEJveCB0byBQQyBSQU0uIElmIGxlbiBpcworICogICBsZXNzIHRoYW4gdGhlIHNpemUgb2YgdGhlIE1haWxCb3ggSW5mbyBibG9jaywgb25seSBhcyBtdWNoIGFzIGZpdHMgaW4gdGhlIFBDIFJBTSBidWZmZXIgaXMgY29waWVkLiBBZnRlcgorICogICB0aGUgY29weWluZyB0aGUgTWFpbEJveCBSZWFkIHBvaW50ZXIgaXMgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgbmV4dCBNYWlsQm94IEluZm8gYmxvY2ssIGhlbmNlIHRoZQorICogICByZW1haW5kZXIgb2YgYW4gIm92ZXJzaXplZCIgTWFpbEJveCBJbmZvIGJsb2NrIGlzIGxvc3QuIFRoZSB0cnVuY2F0aW9uIG9mIHRoZSBNYWlsQm94IEluZm8gYmxvY2sgaXMgTk9UCisgKiAgIHJlZmxlY3RlZCBpbiB0aGUgcmV0dXJuIHN0YXR1cy4gTm90ZSB0aGF0IGhjZl9nZXRfaW5mbyBndWFyYW50ZWVzIHRoZSBsZW5ndGggb2YgdGhlIFBDIFJBTSBidWZmZXIgbWVldHMKKyAqICAgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnRzIG9mIGF0IGxlYXN0IDIsIHNvIG5vIFBDIFJBTSBidWZmZXIgb3ZlcnJ1bi4KKyAqCisgKiAgIENhbGxpbmcgaGNmX2dldF9tYl9pbmZvIHdoZW4gdGhlaXIgaXMgbm8gTWFpbEJveCBJbmZvIGJsb2NrIGF2YWlsYWJsZSBvciB3aGVuIHRoZXJlIGlzIG5vIE1haWxCb3ggYXQgYWxsLAorICogICByZXN1bHRzIGluIGEgIk5VTEwiIE1haWxCb3ggSW5mbyBibG9jay4KKyAqCisgKjEyOiAgICBzZWUgTk9USUNFCisgKjE3OiBUaGUgcmV0dXJuIHN0YXR1cyBvZiBjbWRfd2FpdCBhbmQgdGhlIGZpcnN0IGhjZmlvX2luX3N0cmluZyBjYW4gYmUgaWdub3JlZCwgYmVjYXVzZSB3aGVuIG9uZSBmYWlscywgdGhlCisgKiAgIG90aGVyIGZhaWxzIHZpYSB0aGUgSUZCX0RlZnVuY3RTdGF0IG1lY2hhbmlzbQorICoyMDogIkhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjICkiIGlzIG5vdCBzdWl0YWJsZSBiZWNhdXNlIHRoaXMgd2lsbCBhbHdheXMgdHJpZ2dlciBhcyBzaWRlIGVmZmVjdCBvZgorICogICB0aGUgSENGQVNTRVJUIGluIGhjZl9wdXRfaW5mbyB3aGljaCBjYWxscyBoY2ZfZ2V0X2luZm8gdG8gZmlndXJlIG91dCB3aGV0aGVyIHRoZSBSSUQgZXhpc3RzIGF0IGFsbC4KIAotKi5OT1RJQ0UKLSoKLSoJIkhDRiBlbWJlZGRlZCIgcHNldWRvIFJJRHM6Ci0qCUNGR19NQl9JTkZPLCBDRkdfVEFMTElFUywgQ0ZHX0RSVl9JREVOVElUWSwgQ0ZHX0RSVl9TVVBfUkFOR0UsIENGR19EUlZfQUNUX1JBTkdFU19QUkksCi0qCUNGR19EUlZfQUNUX1JBTkdFU19TVEEsIENGR19EUlZfQUNUX1JBTkdFU19IU0kKLSoJTm90ZSB0aGUgSENGX0VSUl9MRU4gaXMgTk9UIGFkZXF1YXRlbHkgc2V0LCB3aGVuIEwgPj0gMiBidXQgbGVzcyB0aGFuIG5lZWRlZAotKgotKglSZW1hcmtzOiBUcmFuc2ZlcnMgb3BlcmF0aW9uIGluZm9ybWF0aW9uIGFuZCB0cmFuc2llbnQgYW5kIHBlcnNpc3RlbnQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZQotKglDYXJkIGFuZCBmcm9tIHRoZSBIQ0YgdG8gdGhlIE1TRi4KLSoJVGhlIGV4YWN0IGxheW91dCBvZiB0aGUgcHJvdmlkZWQgZGF0YSBzdHJ1Y3R1cmUgZGVwZW5kcyBvbiB0aGUgYWN0aW9uIGNvZGUuIENvcHlpbmcgc3RvcHMgaWYgZWl0aGVyIHRoZQotKgljb21wbGV0ZSBDb25maWd1cmF0aW9uIEluZm9ybWF0aW9uIGlzIGNvcGllZCBvciBpZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluZGljYXRlZCBieSBsZW4gaXMgY29waWVkLiAgTGVuCi0qCWFjdHMgYXMgYSBzYWZlIGd1YXJkIGFnYWluc3QgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbiBibG9ja3Mgd2hpY2ggaGF2ZSBkaWZmZXJlbnQgc2l6ZXMgZm9yIGRpZmZlcmVudAotKglIZXJtZXMgdmVyc2lvbnMsIGUuZy4gd2hlbiBsYXRlciB2ZXJzaW9ucyBzdXBwb3J0IG1vcmUgdGFsbGllcyB0aGFuIGVhcmxpZXIgdmVyc2lvbnMuIEl0IGlzIGEgY29uc2Npb3VzCi0qCWRlY2lzaW9uIHRoYXQgdW51c2VkIHBhcnRzIG9mIHRoZSBQQyBSQU0gYnVmZmVyIGFyZSBub3QgY2xlYXJlZC4KLSoKLSoJUmVtYXJrczogVGhlIG9ubHkgZXJyb3IgYWdhaW5zdCB3aGljaCBpcyBwcm90ZWN0ZWQgaXMgdGhlICJSZWFkIGVycm9yIiBhcyByZXN1bHQgb2YgQ2FyZCByZW1vdmFsLiBPbmx5IHRoZQotKglsYXN0IGhjZl9pb19zdHJpbmcgbmVlZCB0byBiZSBwcm90ZWN0ZWQgYmVjYXVzZSBpZiB0aGUgZmlyc3QgZmFpbHMgdGhlIHNlY29uZCB3aWxsIGZhaWwgYXMgd2VsbC4gQ2hlY2tpbmcKLSoJZm9yIGNtZF9leGUgZXJyb3JzIGlzIHN1cHBvc2VkIHN1cGVyZmx1b3VzIGJlY2F1c2UgcHJvYmxlbXMgaW4gY21kX2V4ZSBhcmUgYWxyZWFkeSBjYXVnaHQgb3Igd2lsbCBiZQotKgljYXVnaHQgYnkgaGNmX2VuYWJsZS4KLSoKLSoJQ0ZHX01CX0lORk86IGNvcHkgdGhlIG9sZGVzdCBNYWlsQm94IEluZm8gQmxvY2sgb3IgdGhlICJudWxsIiBibG9jayBpZiBub25lIGF2YWlsYWJsZS4KLSoKLSoJVGhlIG1lY2hhbmlzbSB0byBIQ0ZfQVNTRVJUIG9uIGludmFsaWQgdHlwLWNvZGVzIGluIHRoZSBMVFYgcmVjb3JkIGlzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgc3RyYXRlZ3k6Ci0qCSAgLSBkdXJpbmcgdGhlIHBzZXVkby1hc3luY2hyb25vdXMgSGVybWVzIGNvbW1hbmRzIChkaWFnbm9zZSwgZG93bmxvYWQpCW9ubHkgQ0ZHX01CX0lORk8gaXMgYWNjZXB0YWJsZQotKgkgIC0Jc29tZSBjb2RlcyAoZS5nLiBDRkdfVEFMTElFUykgYXJlIGV4cGxpY2l0bHkgaGFuZGxlZCBieSB0aGUgSENGIHdoaWNoIGltcGxpZXMgdGhhdCB0aGVzZSBjb2RlcwotKgkJYXJlIHZhbGlkCi0qCSAgLSBhbGwgb3RoZXIgY29kZXMgaW4gdGhlIHJhbmdlIDB4RkMwMCB0aHJvdWdoIDB4RkZGRiBhcmUgcGFzc2VkIHRvIHRoZSBIZXJtZXMuICBUaGUgSGVybWVzIHJldHVybnMgYW4KLSoJCUxUViByZWNvcmQgd2l0aCBhIHplcm8gdmFsdWUgaW4gdGhlIEwtZmllbGQgZm9yIGFsbCBUeXAtY29kZXMgaXQgZG9lcyBub3QgcmVjb2duaXplLiBUaGlzIGlzCi0qCQlkZWZpbmVkIGFuZCBpbnRlbmRlZCBiZWhhdmlvciwgc28gSENGX0FTU0VSVCBkb2VzIG5vdCBjYXRjaCBvbiB0aGlzIHBoZW5vbWVuYS4KLSoJICAtCWFsbCByZW1haW5pbmcgY29kZXMgYXJlIGludmFsaWQgYW5kIGNhdXNlIGFuIEFTU0VSVC4KLSoKLSouQ09ORElUSU9OUwotKiBJbiBjYXNlIG9mIFVTQiwgSENGX01BWF9NU0cgOz9VU0VEOz8gdG8gbGltaXQgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgY2FuIGJlIHJldHJpZXZlZCB2aWEgaGNmX2dldF9pbmZvLgotKgotKgotKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqLk5PVElDRQorICoKKyAqICAgIkhDRiBlbWJlZGRlZCIgcHNldWRvIFJJRHM6CisgKiAgIENGR19NQl9JTkZPLCBDRkdfVEFMTElFUywgQ0ZHX0RSVl9JREVOVElUWSwgQ0ZHX0RSVl9TVVBfUkFOR0UsIENGR19EUlZfQUNUX1JBTkdFU19QUkksCisgKiAgIENGR19EUlZfQUNUX1JBTkdFU19TVEEsIENGR19EUlZfQUNUX1JBTkdFU19IU0kKKyAqICAgTm90ZSB0aGUgSENGX0VSUl9MRU4gaXMgTk9UIGFkZXF1YXRlbHkgc2V0LCB3aGVuIEwgPj0gMiBidXQgbGVzcyB0aGFuIG5lZWRlZAorICoKKyAqICAgUmVtYXJrczogVHJhbnNmZXJzIG9wZXJhdGlvbiBpbmZvcm1hdGlvbiBhbmQgdHJhbnNpZW50IGFuZCBwZXJzaXN0ZW50IGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZnJvbSB0aGUKKyAqICAgQ2FyZCBhbmQgZnJvbSB0aGUgSENGIHRvIHRoZSBNU0YuCisgKiAgIFRoZSBleGFjdCBsYXlvdXQgb2YgdGhlIHByb3ZpZGVkIGRhdGEgc3RydWN0dXJlIGRlcGVuZHMgb24gdGhlIGFjdGlvbiBjb2RlLiBDb3B5aW5nIHN0b3BzIGlmIGVpdGhlciB0aGUKKyAqICAgY29tcGxldGUgQ29uZmlndXJhdGlvbiBJbmZvcm1hdGlvbiBpcyBjb3BpZWQgb3IgaWYgdGhlIG51bWJlciBvZiBieXRlcyBpbmRpY2F0ZWQgYnkgbGVuIGlzIGNvcGllZC4gIExlbgorICogICBhY3RzIGFzIGEgc2FmZSBndWFyZCBhZ2FpbnN0IENvbmZpZ3VyYXRpb24gSW5mb3JtYXRpb24gYmxvY2tzIHdoaWNoIGhhdmUgZGlmZmVyZW50IHNpemVzIGZvciBkaWZmZXJlbnQKKyAqICAgSGVybWVzIHZlcnNpb25zLCBlLmcuIHdoZW4gbGF0ZXIgdmVyc2lvbnMgc3VwcG9ydCBtb3JlIHRhbGxpZXMgdGhhbiBlYXJsaWVyIHZlcnNpb25zLiBJdCBpcyBhIGNvbnNjaW91cworICogICBkZWNpc2lvbiB0aGF0IHVudXNlZCBwYXJ0cyBvZiB0aGUgUEMgUkFNIGJ1ZmZlciBhcmUgbm90IGNsZWFyZWQuCisgKgorICogICBSZW1hcmtzOiBUaGUgb25seSBlcnJvciBhZ2FpbnN0IHdoaWNoIGlzIHByb3RlY3RlZCBpcyB0aGUgIlJlYWQgZXJyb3IiIGFzIHJlc3VsdCBvZiBDYXJkIHJlbW92YWwuIE9ubHkgdGhlCisgKiAgIGxhc3QgaGNmX2lvX3N0cmluZyBuZWVkIHRvIGJlIHByb3RlY3RlZCBiZWNhdXNlIGlmIHRoZSBmaXJzdCBmYWlscyB0aGUgc2Vjb25kIHdpbGwgZmFpbCBhcyB3ZWxsLiBDaGVja2luZworICogICBmb3IgY21kX2V4ZSBlcnJvcnMgaXMgc3VwcG9zZWQgc3VwZXJmbHVvdXMgYmVjYXVzZSBwcm9ibGVtcyBpbiBjbWRfZXhlIGFyZSBhbHJlYWR5IGNhdWdodCBvciB3aWxsIGJlCisgKiAgIGNhdWdodCBieSBoY2ZfZW5hYmxlLgorICoKKyAqICAgQ0ZHX01CX0lORk86IGNvcHkgdGhlIG9sZGVzdCBNYWlsQm94IEluZm8gQmxvY2sgb3IgdGhlICJudWxsIiBibG9jayBpZiBub25lIGF2YWlsYWJsZS4KKyAqCisgKiAgIFRoZSBtZWNoYW5pc20gdG8gSENGX0FTU0VSVCBvbiBpbnZhbGlkIHR5cC1jb2RlcyBpbiB0aGUgTFRWIHJlY29yZCBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHN0cmF0ZWd5OgorICogICAgIC0gZHVyaW5nIHRoZSBwc2V1ZG8tYXN5bmNocm9ub3VzIEhlcm1lcyBjb21tYW5kcyAoZGlhZ25vc2UsIGRvd25sb2FkKSBvbmx5IENGR19NQl9JTkZPIGlzIGFjY2VwdGFibGUKKyAqICAgICAtIHNvbWUgY29kZXMgKGUuZy4gQ0ZHX1RBTExJRVMpIGFyZSBleHBsaWNpdGx5IGhhbmRsZWQgYnkgdGhlIEhDRiB3aGljaCBpbXBsaWVzIHRoYXQgdGhlc2UgY29kZXMKKyAqICAgICAgIGFyZSB2YWxpZAorICogICAgIC0gYWxsIG90aGVyIGNvZGVzIGluIHRoZSByYW5nZSAweEZDMDAgdGhyb3VnaCAweEZGRkYgYXJlIHBhc3NlZCB0byB0aGUgSGVybWVzLiAgVGhlIEhlcm1lcyByZXR1cm5zIGFuCisgKiAgICAgICBMVFYgcmVjb3JkIHdpdGggYSB6ZXJvIHZhbHVlIGluIHRoZSBMLWZpZWxkIGZvciBhbGwgVHlwLWNvZGVzIGl0IGRvZXMgbm90IHJlY29nbml6ZS4gVGhpcyBpcworICogICAgICAgZGVmaW5lZCBhbmQgaW50ZW5kZWQgYmVoYXZpb3IsIHNvIEhDRl9BU1NFUlQgZG9lcyBub3QgY2F0Y2ggb24gdGhpcyBwaGVub21lbmEuCisgKiAgICAgLSBhbGwgcmVtYWluaW5nIGNvZGVzIGFyZSBpbnZhbGlkIGFuZCBjYXVzZSBhbiBBU1NFUlQuCisgKgorICouQ09ORElUSU9OUworICogSW4gY2FzZSBvZiBVU0IsIEhDRl9NQVhfTVNHIDs/VVNFRDs/IHRvIGxpbWl0IHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgdmlhIGhjZl9nZXRfaW5mby4KKyAqCisgKgorICouRU5ERE9DICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGludAogaGNmX2dldF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cCApCiB7CiAKLWludAkJCXJjID0gSENGX1NVQ0NFU1M7Ci1oY2ZfMTYJCWxlbiA9IGx0dnAtPmxlbjsKLWhjZl8xNgkJdHlwZSA9IGx0dnAtPnR5cDsKLXdjaV9yZWNvcmRwCXAgPSAmbHR2cC0+bGVuOwkJLy9kZXN0aW5hdGlvbiB3b3JkIHBvaW50ZXIgKGluIExUViByZWNvcmQpCi1oY2ZfMTYJCSpxID0gTlVMTDsJCQkJLyogc291cmNlIHdvcmQgcG9pbnRlciAgTm90ZSEhIERPUyBDT00gY2FuJ3QgY29wZSB3aXRoIEZBUgotCQkJCQkJCQkJICogYXMgYSBjb25zZXF1ZW5jZSBNYWlsQm94IG11c3QgYmUgbmVhciB3aGljaCBpcyB1c3VhbGx5IHRydWUgYW55d2F5Ci0JCQkJCQkJCQkgKi8KLWludAkJCWk7CisJaW50ICAgICAgICAgcmMgPSBIQ0ZfU1VDQ0VTUzsKKwloY2ZfMTYgICAgICBsZW4gPSBsdHZwLT5sZW47CisJaGNmXzE2ICAgICAgdHlwZSA9IGx0dnAtPnR5cDsKKwl3Y2lfcmVjb3JkcCBwID0gJmx0dnAtPmxlbjsgICAgIC8vZGVzdGluYXRpb24gd29yZCBwb2ludGVyIChpbiBMVFYgcmVjb3JkKQorCWhjZl8xNiAgICAgICpxID0gTlVMTDsgICAgICAgICAgICAgIC8qIHNvdXJjZSB3b3JkIHBvaW50ZXIgIE5vdGUhISBET1MgQ09NIGNhbid0IGNvcGUgd2l0aCBGQVIKKwkJCQkJICAgICAqIGFzIGEgY29uc2VxdWVuY2UgTWFpbEJveCBtdXN0IGJlIG5lYXIgd2hpY2ggaXMgdXN1YWxseSB0cnVlIGFueXdheQorCQkJCQkgICAgICovCisJaW50ICAgICAgICAgaTsKIAotCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfR0VUX0lORk8sIGx0dnAtPnR5cCApCi0JSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKQotCUhDRkFTU0VSVF9JTlQKLQlIQ0ZBU1NFUlQoIGx0dnAsIDAgKQotCUhDRkFTU0VSVCggMSA8IGx0dnAtPmxlbiAmJiBsdHZwLT5sZW4gPD0gSENGX01BWF9MVFYgKyAxLCBNRVJHRV8yKCBsdHZwLT50eXAsIGx0dnAtPmxlbiApICkKKwlIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0dFVF9JTkZPLCBsdHZwLT50eXAgKTsKKwlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApOworCUhDRkFTU0VSVF9JTlQ7CisJSENGQVNTRVJUKCBsdHZwLCAwICk7CisJSENGQVNTRVJUKCAxIDwgbHR2cC0+bGVuICYmIGx0dnAtPmxlbiA8PSBIQ0ZfTUFYX0xUViArIDEsIE1FUkdFXzIoIGx0dnAtPnR5cCwgbHR2cC0+bGVuICkgKTsKIAotCWx0dnAtPmxlbiA9IDA7CQkJCQkJCQkvL2RlZmF1bHQgdG86IE5vIEluZm8gQXZhaWxhYmxlCi0jaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lEIHx8IChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIgLy9maWx0ZXIgb3V0IGFsbCBzcGVjaWFscworCWx0dnAtPmxlbiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kZWZhdWx0IHRvOiBObyBJbmZvIEF2YWlsYWJsZQorCS8vZmlsdGVyIG91dCBhbGwgc3BlY2lhbHMKIAlmb3IgKCBpID0gMDsgKCBxID0geHh4eFtpXSApICE9IE5VTEwgJiYgcVsxXSAhPSB0eXBlOyBpKysgKSAvKk5PUCovOwotI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQgLyBIQ0ZfRVhUX01CCisKICNpZiBIQ0ZfVEFMTElFUwotCWlmICggdHlwZSA9PSBDRkdfVEFMTElFUyApIHsJCQkJCQkJCQkJCQkJLyozKi8KKwlpZiAoIHR5cGUgPT0gQ0ZHX1RBTExJRVMgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qMyovCiAJCSh2b2lkKWhjZl9hY3Rpb24oIGlmYnAsIEhDRl9BQ1RfVEFMTElFUyApOwogCQlxID0gKGhjZl8xNiopJmlmYnAtPklGQl9UYWxseUxlbjsKIAl9CiAjZW5kaWYgLy8gSENGX1RBTExJRVMKLSNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX01CCisKIAlpZiAoIHR5cGUgPT0gQ0ZHX01CX0lORk8gKSB7CiAJCWlmICggaWZicC0+SUZCX01CSW5mb0xlbiApIHsKIAkJCWlmICggaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJScF0gPT0gMHhGRkZGICkgewogCQkJCWlmYnAtPklGQl9NQlJwID0gMDsgLy87P1Byb2JhYmx5IHN1cGVyZmx1b3VzCiAJCQl9CiAJCQlxID0gJmlmYnAtPklGQl9NQnBbaWZicC0+SUZCX01CUnBdOwotCQkJaWZicC0+SUZCX01CUnAgKz0gKnEgKyAxOwkvL3VwZGF0ZSByZWFkIHBvaW50ZXIKKwkJCWlmYnAtPklGQl9NQlJwICs9ICpxICsgMTsgICAvL3VwZGF0ZSByZWFkIHBvaW50ZXIKIAkJCWlmICggaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJScF0gPT0gMHhGRkZGICkgewogCQkJCWlmYnAtPklGQl9NQlJwID0gMDsKIAkJCX0KIAkJCWlmYnAtPklGQl9NQkluZm9MZW4gPSBpZmJwLT5JRkJfTUJwW2lmYnAtPklGQl9NQlJwXTsKIAkJfQogCX0KLSNlbmRpZiAvLyBIQ0ZfRVhUX01CCi0JaWYgKCBxICE9IE5VTEwgKSB7CQkJCQkJLy9hIHNwZWNpYWwgb3IgQ0ZHX1RBTExJRVMgb3IgQ0ZHX01CX0lORk8KLQkJaSA9IG1pbiggbGVuLCAqcSApICsgMTsJCQkJLy90b3RhbCBzaXplIG9mIGRlc3RpbmF0aW9uIChpbmNsdWRpbmcgVC1maWVsZCkKKworCWlmICggcSAhPSBOVUxMICkgeyAgICAgICAgICAgICAgICAgICAgICAvL2Egc3BlY2lhbCBvciBDRkdfVEFMTElFUyBvciBDRkdfTUJfSU5GTworCQlpID0gbWluKCBsZW4sICpxICkgKyAxOyAgICAgICAgICAgICAvL3RvdGFsIHNpemUgb2YgZGVzdGluYXRpb24gKGluY2x1ZGluZyBULWZpZWxkKQogCQl3aGlsZSAoIGktLSApIHsKIAkJCSpwKysgPSAqcTsKICNpZiAoSENGX1RBTExJRVMpICYgSENGX1RBTExJRVNfUkVTRVQKQEAgLTIwNzcsNTAgKzIwMDEsNTAgQEAKICNlbmRpZiAvLyBIQ0ZfVEFMTElFU19SRVNFVAogCQkJcSsrOwogCQl9Ci0JfSBlbHNlIHsJCQkJCQkJCS8vIG5vdCBhIHNwZWNpYWwgbm9yIENGR19UQUxMSUVTIG5vciBDRkdfTUJfSU5GTwotCQlpZiAoIHR5cGUgPT0gQ0ZHX0NOVExfT1BUICkgewkJCQkJCQkJCQkvL3JlYWQgYmFjayBlZmZlY3RpdmUgb3B0aW9ucworCX0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBzcGVjaWFsIG5vciBDRkdfVEFMTElFUyBub3IgQ0ZHX01CX0lORk8KKwkJaWYgKCB0eXBlID09IENGR19DTlRMX09QVCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JlYWQgYmFjayBlZmZlY3RpdmUgb3B0aW9ucwogCQkJbHR2cC0+bGVuID0gMjsKIAkJCWx0dnAtPnZhbFswXSA9IGlmYnAtPklGQl9DbnRsT3B0OwogI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTklDX0FDQ0VTUwogCQl9IGVsc2UgaWYgKCB0eXBlID09IENGR19QUk9EX0RBVEEgKSB7ICAvL29ubHkgbmVlZGVkIGZvciBzb21lIHRlc3QgdG9vbCBvbiB0b3Agb2YgSC1JSSBORElTIGRyaXZlcgotaGNmX2lvCQlpb19wb3J0Owotd2NpX2J1ZnAJcHQ7CQkJCQkvL3BvaW50ZXIgd2l0aCB0aGUgInJpZ2h0IiB0eXBlLCBqdXN0IHRvIGhlbHAgZWFzZSB3cml0aW5nIG1hY3JvcyB3aXRoIGVtYmVkZGVkIGFzc2VtYmx5CisJCQloY2ZfaW8gICAgICBpb19wb3J0OworCQkJd2NpX2J1ZnAgICAgcHQ7ICAgICAgICAgICAgICAgICAvL3BvaW50ZXIgd2l0aCB0aGUgInJpZ2h0IiB0eXBlLCBqdXN0IHRvIGhlbHAgZWFzZSB3cml0aW5nIG1hY3JvcyB3aXRoIGVtYmVkZGVkIGFzc2VtYmx5CiAJCQlPUFcoIEhSRUdfQVVYX1BBR0UsIChoY2ZfMTYpKFBMVUdfREFUQV9PRkZTRVQgPj4gNykgKTsKIAkJCU9QVyggSFJFR19BVVhfT0ZGU0VULCAoaGNmXzE2KShQTFVHX0RBVEFfT0ZGU0VUICYgMHg3RSkgKTsKLQkJCWlvX3BvcnQgPSBpZmJwLT5JRkJfSU9CYXNlICsgSFJFR19BVVhfREFUQTsJCS8vdG8gcHJldmVudCBzaWRlIGVmZmVjdHMgb2YgdGhlIE1TRi1kZWZpbmVkIG1hY3JvCi0JCQlwID0gbHR2cC0+dmFsOwkJCQkJLy9kZXN0aW5hdGlvbiBjaGFyIHBvaW50ZXIgKGluIExUViByZWNvcmQpCisJCQlpb19wb3J0ID0gaWZicC0+SUZCX0lPQmFzZSArIEhSRUdfQVVYX0RBVEE7ICAgICAvL3RvIHByZXZlbnQgc2lkZSBlZmZlY3RzIG9mIHRoZSBNU0YtZGVmaW5lZCBtYWNybworCQkJcCA9IGx0dnAtPnZhbDsgICAgICAgICAgICAgICAgICAvL2Rlc3RpbmF0aW9uIGNoYXIgcG9pbnRlciAoaW4gTFRWIHJlY29yZCkKIAkJCWkgPSBsZW4gLSAxOwogCQkJaWYgKGkgPiAwICkgewotCQkJCXB0ID0gKHdjaV9idWZwKXA7CS8vanVzdCB0byBoZWxwIGVhc2Ugd3JpdGluZyBtYWNyb3Mgd2l0aCBlbWJlZGRlZCBhc3NlbWJseQorCQkJCXB0ID0gKHdjaV9idWZwKXA7ICAgLy9qdXN0IHRvIGhlbHAgZWFzZSB3cml0aW5nIG1hY3JvcyB3aXRoIGVtYmVkZGVkIGFzc2VtYmx5CiAJCQkJSU5fUE9SVF9TVFJJTkdfOF8xNiggaW9fcG9ydCwgcHQsIGkgKTsgLy9zcGFjZSB1c2VkIGJ5IFQ6IC0xCiAJCQl9CiAJCX0gZWxzZSBpZiAoIHR5cGUgPT0gQ0ZHX0NNRF9IQ0YgKSB7CiAjZGVmaW5lIFAgKChDRkdfQ01EX0hDRl9TVFJDVCBGQVIgKilsdHZwKQotCQkJSENGQVNTRVJUKCBQLT5jbWQgPT0gQ0ZHX0NNRF9IQ0ZfUkVHX0FDQ0VTUywgUC0+Y21kICkJCS8vb25seSBIZXJtZXMgcmVnaXN0ZXIgYWNjZXNzIHN1cHBvcnRlZAorCQkJSENGQVNTRVJUKCBQLT5jbWQgPT0gQ0ZHX0NNRF9IQ0ZfUkVHX0FDQ0VTUywgUC0+Y21kICk7ICAgICAgIC8vb25seSBIZXJtZXMgcmVnaXN0ZXIgYWNjZXNzIHN1cHBvcnRlZAogCQkJaWYgKCBQLT5jbWQgPT0gQ0ZHX0NNRF9IQ0ZfUkVHX0FDQ0VTUyApIHsKLQkJCQlIQ0ZBU1NFUlQoIFAtPm1vZGUgPCBpZmJwLT5JRkJfSU9CYXNlLCBQLT5tb2RlICkJCS8vQ2hlY2sgUmVnaXN0ZXIgc3BhY2UKLQkJCQlsdHZwLT5sZW4gPSBtaW4oIGxlbiwgNCApOwkJCQkJCQkJLy9SRVNUT1JFIGx0diBsZW5ndGgKKwkJCQlIQ0ZBU1NFUlQoIFAtPm1vZGUgPCBpZmJwLT5JRkJfSU9CYXNlLCBQLT5tb2RlICk7ICAgICAgICAvL0NoZWNrIFJlZ2lzdGVyIHNwYWNlCisJCQkJbHR2cC0+bGVuID0gbWluKCBsZW4sIDQgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1JFU1RPUkUgbHR2IGxlbmd0aAogCQkJCVAtPmFkZF9pbmZvID0gSVBXKCBQLT5tb2RlICk7CiAJCQl9CiAjdW5kZWYgUAogI2VuZGlmIC8vIEhDRl9FWFRfTklDX0FDQ0VTUwogI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfUFJJTlRGCi0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBDRkdfRldfUFJJTlRGKSB7Ci0gICAgICAgICAgIHJjID0gZndfcHJpbnRmKGlmYnAsIChDRkdfRldfUFJJTlRGX1NUUkNUKilsdHZwKTsKKwkJfSBlbHNlIGlmICh0eXBlID09IENGR19GV19QUklOVEYpIHsKKwkJCXJjID0gZndfcHJpbnRmKGlmYnAsIChDRkdfRldfUFJJTlRGX1NUUkNUKilsdHZwKTsKICNlbmRpZiAvLyBIQ0ZfQVNTRVJUX1BSSU5URgogCQl9IGVsc2UgaWYgKCB0eXBlID49IENGR19SSURfRldfTUlOICkgewogLy87PyBieSB1c2luZyBIQ01EX0JVU1kgb3B0aW9uIHdoZW4gY2FsbGluZyBjbWRfZXhlLCB1c2luZyBhIGdldF9mcmFnIHdpdGggbGVuZ3RoIDAganVzdCB0byBzZXQgdXAgdGhlCiAvLzs/IEJBUCBhbmQgY2FsbGluZyBjbWRfY21wbCwgeW91IGNvdWxkIG1lcmdlIHRoZSAyIEJ1c3kgd2FpdHMuIFdoZXRoZXIgdGhpcyByZWFsbHkgaGVscHMgKGFuZCB3aGF0CiAvLzs/IHdvdWxkIGJlIHRoZSBvcHRpbWFsIHNlcXVlbmNlIGluIGNtZF9leGUgYW5kIGdldF9mcmFnKSB3b3VsZCBoYXZlIHRvIGJlIE1FQVNVUkVECi0vKjE3Ki8JCWlmICggKCByYyA9IGNtZF9leGUoIGlmYnAsIEhDTURfQUNDRVNTLCB0eXBlICkgKSA9PSBIQ0ZfU1VDQ0VTUyAmJgorCQkvKjE3Ki8gIGlmICggKCByYyA9IGNtZF9leGUoIGlmYnAsIEhDTURfQUNDRVNTLCB0eXBlICkgKSA9PSBIQ0ZfU1VDQ0VTUyAmJgogCQkJCSAoIHJjID0gc2V0dXBfYmFwKCBpZmJwLCB0eXBlLCAwLCBJT19JTiApICkgPT0gSENGX1NVQ0NFU1MgKSB7CiAJCQkJZ2V0X2ZyYWcoIGlmYnAsICh3Y2lfYnVmcCkmbHR2cC0+bGVuLCAyKmxlbisyIEJFX1BBUigyKSApOwotCQkJCWlmICggSVBXKCBIUkVHX1NUQVQgKSA9PSAweEZGRkYgKSB7CQkJCQkvL05JQyByZW1vdmFsIHRlc3QKKwkJCQlpZiAoIElQVyggSFJFR19TVEFUICkgPT0gMHhGRkZGICkgeyAgICAgICAgICAgICAgICAgLy9OSUMgcmVtb3ZhbCB0ZXN0CiAJCQkJCWx0dnAtPmxlbiA9IDA7Ci0JCQkJCUhDRkFTU0VSVCggRE9fQVNTRVJULCB0eXBlICkKKwkJCQkJSENGQVNTRVJUKCBET19BU1NFUlQsIHR5cGUgKTsKIAkJCQl9CiAJCQl9Ci0vKjEyKi8JfSBlbHNlIEhDRkFTU0VSVCggRE9fQVNTRVJULCB0eXBlICkgLypOT1AqLzsgLy9OT1AgaW4gY2FzZSBIQ0ZBU1NFUlQgaXMgZHVtbXkKKwkvKjEyKi8gIH0gZWxzZSBIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgdHlwZSApIC8qTk9QKi87IC8vTk9QIGluIGNhc2UgSENGQVNTRVJUIGlzIGR1bW15CiAJfQogCWlmICggbGVuIDwgbHR2cC0+bGVuICkgewogCQlsdHZwLT5sZW4gPSBsZW47CkBAIC0yMTI5LDcyMSArMjA1Myw2NzYgQEAKIAkJfQogCX0KIAlIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTIHx8ICggcmMgPT0gSENGX0VSUl9MRU4gJiYgaWZicC0+SUZCX0Fzc2VydFRyYWNlICYgMTw8SENGX1RSQUNFX1BVVF9JTkZPICksCi0JCQkgICBNRVJHRV8yKCB0eXBlLCByYyApICkJCQkJCQkJCQkJCQkJCQkJLyoyMCovCi0JSENGTE9HRVhJVCggSENGX1RSQUNFX0dFVF9JTkZPICkKKwkJICAgTUVSR0VfMiggdHlwZSwgcmMgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjIwKi8KKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfR0VUX0lORk8gKTsKIAlyZXR1cm4gcmM7CiB9IC8vIGhjZl9nZXRfaW5mbwogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSouTU9EVUxFCQlpbnQgaGNmX3B1dF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cCApCi0qLlBVUlBPU0UJCVRyYW5zZmVycyBvcGVyYXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gdG8gdGhlIENhcmQgYW5kIHRvIHRoZSBIQ0YuCi0qCi0qLkFSR1VNRU5UUwotKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKLSoJbHR2cAkJc3BlY2lmaWVzIHRoZSBSSUQgKGFzIGRlZmluZWQgYnkgSGVybWVzIEkvRikgb3IgcHNldWRvLVJJRCAoYXMgZGVmaW5lZCBieSBXQ0kpCi0qCi0qLlJFVFVSTlMKLSoJSENGX1NVQ0NFU1MKLSohIQl2aWEgY21kX2V4ZQotKglIQ0ZfRVJSX05PX05JQyAJCU5JQyByZW1vdmVkIGR1cmluZyBkYXRhIHJldHJpZXZhbAotKglIQ0ZfRVJSX1RJTUVfT1VUCUV4cGVjdGVkIEYvVyBldmVudCBkaWQgbm90IG9jY3VyIGluIHRpbWUKLSoJSENGX0VSUl9ERUZVTkNUXy4uLgotKiEhCXZpYSBkb3dubG9hZAkJCQlDRkdfRExOVl9TVEFSVCA8PSB0eXBlIDw9IENGR19ETF9TVE9QCi0qISEJdmlhIHB1dF9pbmZvCQkJCUNGR19SSURfQ0ZHX01JTiA8PSB0eXBlIDw9IENGR19SSURfQ0ZHX01BWAotKiEhCXZpYSBwdXRfZnJhZwotKgotKi5ERVNDUklQVElPTgotKiBUaGUgTC1maWVsZCBvZiB0aGUgTFRWLXJlY29yZCAocHJvdmlkZWQgYnkgdGhlIE1TRiBpbiBwYXJhbWV0ZXIgbHR2cCkgc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIuCi0qIFRoZSBMLXZhbHVlIGluY2x1ZGVzIHRoZSBzaXplIG9mIHRoZSBULWZpZWxkLCBidXQgbm90IHRoZSBzaXplIG9mIHRoZSBMLWZpZWxkLgotKiBUaGUgVC0gZmllbGQgc3BlY2lmaWVzIHRoZSBSSUQgcGxhY2VkIGluIHRoZSBWLWZpZWxkIGJ5IHRoZSBNU0YuCi0qCi0qIE5vdCBhbGwgQ0ZHLWNvZGVzIGNhbiBiZSB1c2VkIGZvciBoY2ZfcHV0X2luZm8uICBUaGUgZm9sbG93aW5nIENGRy1jb2RlcyBhcmUgdmFsaWQgZm9yIGhjZl9wdXRfaW5mbzoKLSogbyBPbmUgb2YgdGhlIENGRy1jb2RlcyBpbiB0aGUgZ3JvdXAgIk5ldHdvcmsgUGFyYW1ldGVycywgU3RhdGljIENvbmZpZ3VyYXRpb24gRW50aXRpZXMiCi0qIENoYW5nZXMgbWFkZSBieSBoY2ZfcHV0X2luZm8gdG8gQ0ZHX2NvZGVzIGluIHRoaXMgZ3JvdXAgd2lsbCBub3QgYWZmZWN0IHRoZSBGL1cKLSogYW5kIEhDRiBiZWhhdmlvciB1bnRpbCBoY2ZfY250bF9wb3J0KCBIQ0ZfUE9SVF9FTkFCTEUpIGlzIGNhbGxlZC4KLSogbyBPbmUgb2YgdGhlIENGRy1jb2RlcyBpbiB0aGUgZ3JvdXAgIk5ldHdvcmsgUGFyYW1ldGVycywgRHluYW1pYyBDb25maWd1cmF0aW9uIEVudGl0aWVzIgotKiBDaGFuZ2VzIG1hZGUgYnkgaGNmX3B1dF9pbmZvIHRvIENGR19jb2RlcyB3aWxsIGFmZmVjdCB0aGUgRi9XIGFuZCBIQ0YgYmVoYXZpb3IgaW1tZWRpYXRlbHkuCi0qIG8gQ0ZHX1BST0cuCi0qIFRoaXMgY29kZSBpcyB1c2VkIHRvIGluaXRpYXRlIGFuZCB0ZXJtaW5hdGUgdGhlIHByb2Nlc3MgdG8gZG93bmxvYWQgZGF0YSBlaXRoZXIgdG8KLSogdm9sYXRpbGUgb3IgdG8gbm9uLXZvbGF0aWxlIFJBTSBvbiB0aGUgTklDIGFzIHdlbGwgYXMgZm9yIHRoZSBhY3R1YWwgZG93bmxvYWQuCi0qIG8gQ0ZHLWNvZGVzIHJlbGF0ZWQgdG8gdGhlIEhDRiBiZWhhdmlvci4KLSogVGhlIHJlbGF0ZWQgQ0ZHLWNvZGVzIGFyZToKLSogIC0gQ0ZHX1JFR19NQgotKiAgLSBDRkdfUkVHX0FTU0VSVF9SVE5QCi0qICAtIENGR19SRUdfSU5GT19MT0cKLSogIC0gQ0ZHX0NNRF9OSUMKLSogIC0gQ0ZHX0NNRF9ET05HTEUKLSogIC0gQ0ZHX0NNRF9IQ0YKLSogIC0gQ0ZHX05PVElGWQotKgotKiBBbGwgTFRWLXJlY29yZHMgInVua25vd24iIHRvIHRoZSBIQ0YgYXJlIGZvcndhcmRlZCB0byB0aGUgRi9XLgotKgotKiBBc3NlcnQgZmFpbHMgaWYKLSogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCi0qIC0gbHR2cCBpcyBhIE5VTEwgcG9pbnRlci4KLSogLSBoY2ZfcHV0X2luZm8gd2FzIGNhbGxlZCB3aXRob3V0IHByaW9yIGNhbGwgdG8gaGNmX2Nvbm5lY3QKLSogLSB0eXBlIGZpZWxkIG9mIHRoZSBMVFYtcmVjb3JkIGlzIGludmFsaWQsIGkuZS4gbmVpdGhlciBIQ0Ygbm9yIEYvVyBjYW4gaGFuZGxlIHRoZSB2YWx1ZS4KLSogLSBsZW5ndGggZmllbGQgb2YgdGhlIExUVi1yZWNvcmQgYXQgZW50cnkgaXMgbGVzcyB0aGFuIDEgb3IgZXhjZWVkcyBNQVhfTFRWX1NJWkUuCi0qIC0gcmVnaXN0ZXJpbmcgYSBNYWlsQm94IHdpdGggc2l6ZSBsZXNzIHRoYW4gNjAgb3IgYSBub24tYWxpZ25lZCBidWZmZXIgYWRkcmVzcyBpcyB1c2VkLgotKiAtIHJlZW50cmFuY3ksIG1heSBiZSAgY2F1c2VkIGJ5IGNhbGxpbmcgaGNmX2Z1bmN0aW9ucyB3aXRob3V0IGFkZXF1YXRlIHByb3RlY3Rpb24gYWdhaW5zdAotKglOSUMgaW50ZXJydXB0cyBvciBtdWx0aS10aHJlYWRpbmcuCi0qCi0qLkRJQUdSQU0KLSoKLSouTk9USUNFCi0qCVJlbWFya3M6ICBJbiBjYXNlIG9mIEhlcm1lcyBDb25maWd1cmF0aW9uIExUVnMsIHRoZSBjb2RlcyBmb3IgdGhlIHR5cGUgYXJlICJjbGV2ZXJseSIgY2hvc2VuIHRvIGJlCi0qCWlkZW50aWNhbCB0byB0aGUgUklELiBIZXJtZXMgQ29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpcyBjb3BpZWQgZnJvbSB0aGUgcHJvdmlkZWQgZGF0YSBzdHJ1Y3R1cmUgaW50byB0aGUKLSoJQ2FyZC4KLSoJSW4gY2FzZSBvZiBIQ0YgQ29uZmlndXJhdGlvbiBMVFZzLCB0aGUgdHlwZSB2YWx1ZXMgYXJlIGNob3NlbiBpbiBhIHJhbmdlIHdoaWNoIGRvZXMgbm90IG92ZXJsYXAgdGhlCi0qCVJJRC1yYW5nZS4KLSoKLSoyMDoKLSoKLSouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKgorICouTU9EVUxFICAgICAgICBpbnQgaGNmX3B1dF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cCApCisgKi5QVVJQT1NFICAgICAgIFRyYW5zZmVycyBvcGVyYXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gdG8gdGhlIENhcmQgYW5kIHRvIHRoZSBIQ0YuCisgKgorICouQVJHVU1FTlRTCisgKiAgIGlmYnAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworICogICBsdHZwICAgICAgICBzcGVjaWZpZXMgdGhlIFJJRCAoYXMgZGVmaW5lZCBieSBIZXJtZXMgSS9GKSBvciBwc2V1ZG8tUklEIChhcyBkZWZpbmVkIGJ5IFdDSSkKKyAqCisgKi5SRVRVUk5TCisgKiAgIEhDRl9TVUNDRVNTCisgKiEhIHZpYSBjbWRfZXhlCisgKiAgIEhDRl9FUlJfTk9fTklDICAgICAgTklDIHJlbW92ZWQgZHVyaW5nIGRhdGEgcmV0cmlldmFsCisgKiAgIEhDRl9FUlJfVElNRV9PVVQgICAgRXhwZWN0ZWQgRi9XIGV2ZW50IGRpZCBub3Qgb2NjdXIgaW4gdGltZQorICogICBIQ0ZfRVJSX0RFRlVOQ1RfLi4uCisgKiEhIHZpYSBkb3dubG9hZCAgICAgICAgICAgICAgICBDRkdfRExOVl9TVEFSVCA8PSB0eXBlIDw9IENGR19ETF9TVE9QCisgKiEhIHZpYSBwdXRfaW5mbyAgICAgICAgICAgICAgICBDRkdfUklEX0NGR19NSU4gPD0gdHlwZSA8PSBDRkdfUklEX0NGR19NQVgKKyAqISEgdmlhIHB1dF9mcmFnCisgKgorICouREVTQ1JJUFRJT04KKyAqIFRoZSBMLWZpZWxkIG9mIHRoZSBMVFYtcmVjb3JkIChwcm92aWRlZCBieSB0aGUgTVNGIGluIHBhcmFtZXRlciBsdHZwKSBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KKyAqIFRoZSBMLXZhbHVlIGluY2x1ZGVzIHRoZSBzaXplIG9mIHRoZSBULWZpZWxkLCBidXQgbm90IHRoZSBzaXplIG9mIHRoZSBMLWZpZWxkLgorICogVGhlIFQtIGZpZWxkIHNwZWNpZmllcyB0aGUgUklEIHBsYWNlZCBpbiB0aGUgVi1maWVsZCBieSB0aGUgTVNGLgorICoKKyAqIE5vdCBhbGwgQ0ZHLWNvZGVzIGNhbiBiZSB1c2VkIGZvciBoY2ZfcHV0X2luZm8uICBUaGUgZm9sbG93aW5nIENGRy1jb2RlcyBhcmUgdmFsaWQgZm9yIGhjZl9wdXRfaW5mbzoKKyAqIG8gT25lIG9mIHRoZSBDRkctY29kZXMgaW4gdGhlIGdyb3VwICJOZXR3b3JrIFBhcmFtZXRlcnMsIFN0YXRpYyBDb25maWd1cmF0aW9uIEVudGl0aWVzIgorICogQ2hhbmdlcyBtYWRlIGJ5IGhjZl9wdXRfaW5mbyB0byBDRkdfY29kZXMgaW4gdGhpcyBncm91cCB3aWxsIG5vdCBhZmZlY3QgdGhlIEYvVworICogYW5kIEhDRiBiZWhhdmlvciB1bnRpbCBoY2ZfY250bF9wb3J0KCBIQ0ZfUE9SVF9FTkFCTEUpIGlzIGNhbGxlZC4KKyAqIG8gT25lIG9mIHRoZSBDRkctY29kZXMgaW4gdGhlIGdyb3VwICJOZXR3b3JrIFBhcmFtZXRlcnMsIER5bmFtaWMgQ29uZmlndXJhdGlvbiBFbnRpdGllcyIKKyAqIENoYW5nZXMgbWFkZSBieSBoY2ZfcHV0X2luZm8gdG8gQ0ZHX2NvZGVzIHdpbGwgYWZmZWN0IHRoZSBGL1cgYW5kIEhDRiBiZWhhdmlvciBpbW1lZGlhdGVseS4KKyAqIG8gQ0ZHX1BST0cuCisgKiBUaGlzIGNvZGUgaXMgdXNlZCB0byBpbml0aWF0ZSBhbmQgdGVybWluYXRlIHRoZSBwcm9jZXNzIHRvIGRvd25sb2FkIGRhdGEgZWl0aGVyIHRvCisgKiB2b2xhdGlsZSBvciB0byBub24tdm9sYXRpbGUgUkFNIG9uIHRoZSBOSUMgYXMgd2VsbCBhcyBmb3IgdGhlIGFjdHVhbCBkb3dubG9hZC4KKyAqIG8gQ0ZHLWNvZGVzIHJlbGF0ZWQgdG8gdGhlIEhDRiBiZWhhdmlvci4KKyAqIFRoZSByZWxhdGVkIENGRy1jb2RlcyBhcmU6CisgKiAgLSBDRkdfUkVHX01CCisgKiAgLSBDRkdfUkVHX0FTU0VSVF9SVE5QCisgKiAgLSBDRkdfUkVHX0lORk9fTE9HCisgKiAgLSBDRkdfQ01EX05JQworICogIC0gQ0ZHX0NNRF9ET05HTEUKKyAqICAtIENGR19DTURfSENGCisgKiAgLSBDRkdfTk9USUZZCisgKgorICogQWxsIExUVi1yZWNvcmRzICJ1bmtub3duIiB0byB0aGUgSENGIGFyZSBmb3J3YXJkZWQgdG8gdGhlIEYvVy4KKyAqCisgKiBBc3NlcnQgZmFpbHMgaWYKKyAqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlLgorICogLSBsdHZwIGlzIGEgTlVMTCBwb2ludGVyLgorICogLSBoY2ZfcHV0X2luZm8gd2FzIGNhbGxlZCB3aXRob3V0IHByaW9yIGNhbGwgdG8gaGNmX2Nvbm5lY3QKKyAqIC0gdHlwZSBmaWVsZCBvZiB0aGUgTFRWLXJlY29yZCBpcyBpbnZhbGlkLCBpLmUuIG5laXRoZXIgSENGIG5vciBGL1cgY2FuIGhhbmRsZSB0aGUgdmFsdWUuCisgKiAtIGxlbmd0aCBmaWVsZCBvZiB0aGUgTFRWLXJlY29yZCBhdCBlbnRyeSBpcyBsZXNzIHRoYW4gMSBvciBleGNlZWRzIE1BWF9MVFZfU0laRS4KKyAqIC0gcmVnaXN0ZXJpbmcgYSBNYWlsQm94IHdpdGggc2l6ZSBsZXNzIHRoYW4gNjAgb3IgYSBub24tYWxpZ25lZCBidWZmZXIgYWRkcmVzcyBpcyB1c2VkLgorICogLSByZWVudHJhbmN5LCBtYXkgYmUgIGNhdXNlZCBieSBjYWxsaW5nIGhjZl9mdW5jdGlvbnMgd2l0aG91dCBhZGVxdWF0ZSBwcm90ZWN0aW9uIGFnYWluc3QKKyAqICAgTklDIGludGVycnVwdHMgb3IgbXVsdGktdGhyZWFkaW5nLgorICoKKyAqLkRJQUdSQU0KKyAqCisgKi5OT1RJQ0UKKyAqICAgUmVtYXJrczogIEluIGNhc2Ugb2YgSGVybWVzIENvbmZpZ3VyYXRpb24gTFRWcywgdGhlIGNvZGVzIGZvciB0aGUgdHlwZSBhcmUgImNsZXZlcmx5IiBjaG9zZW4gdG8gYmUKKyAqICAgaWRlbnRpY2FsIHRvIHRoZSBSSUQuIEhlcm1lcyBDb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGNvcGllZCBmcm9tIHRoZSBwcm92aWRlZCBkYXRhIHN0cnVjdHVyZSBpbnRvIHRoZQorICogICBDYXJkLgorICogICBJbiBjYXNlIG9mIEhDRiBDb25maWd1cmF0aW9uIExUVnMsIHRoZSB0eXBlIHZhbHVlcyBhcmUgY2hvc2VuIGluIGEgcmFuZ2Ugd2hpY2ggZG9lcyBub3Qgb3ZlcmxhcCB0aGUKKyAqICAgUklELXJhbmdlLgorICoKKyAqMjA6CisgKgorICouRU5ERE9DICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogaW50CiBoY2ZfcHV0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwICkKIHsKLWludCByYyA9IEhDRl9TVUNDRVNTOworCWludCByYyA9IEhDRl9TVUNDRVNTOwogCi0JSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9QVVRfSU5GTywgbHR2cC0+dHlwICkKLQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9NYWdpYyA9PSBIQ0ZfTUFHSUMsIGlmYnAtPklGQl9NYWdpYyApCi0JSENGQVNTRVJUX0lOVAotCUhDRkFTU0VSVCggbHR2cCwgMCApCi0JSENGQVNTRVJUKCAxIDwgbHR2cC0+bGVuICYmIGx0dnAtPmxlbiA8PSBIQ0ZfTUFYX0xUViArIDEsIGx0dnAtPmxlbiApCisJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9QVVRfSU5GTywgbHR2cC0+dHlwICk7CisJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKTsKKwlIQ0ZBU1NFUlRfSU5UOworCUhDRkFTU0VSVCggbHR2cCwgMCApOworCUhDRkFTU0VSVCggMSA8IGx0dnAtPmxlbiAmJiBsdHZwLT5sZW4gPD0gSENGX01BWF9MVFYgKyAxLCBsdHZwLT5sZW4gKTsKIAotCQkJCQkJCQkJCQkvL2FsbCBjb2RlcyBiZXR3ZWVuIDB4RkEwMCBhbmQgMHhGQ0ZGIGFyZSBwYXNzZWQgdG8gSGVybWVzCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWxsIGNvZGVzIGJldHdlZW4gMHhGQTAwIGFuZCAweEZDRkYgYXJlIHBhc3NlZCB0byBIZXJtZXMKICNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCi0gewloY2ZfMTYgaTsKLQloY2ZfMzIgRkFSICoga2V5X3A7CisJeworCQloY2ZfMTYgaTsKKwkJaGNmXzMyIEZBUiAqIGtleV9wOwogCi0JaWYgKCBsdHZwLT50eXAgPT0gQ0ZHX0FERF9US0lQX0RFRkFVTFRfS0VZIHx8IGx0dnAtPnR5cCA9PSBDRkdfQUREX1RLSVBfTUFQUEVEX0tFWSApIHsKLQkJa2V5X3AgPSAoaGNmXzMyKikoKENGR19BRERfVEtJUF9NQVBQRURfS0VZX1NUUkNUIEZBUiAqKWx0dnApLT50eF9taWNfa2V5OwotCQlpID0gVFhfS0VZOwkJLy9pLmUuIFR4S2V5SW5kaWNhdG9yID09IDEsIEtleUlEID09IDAKLQkJaWYgKCBsdHZwLT50eXAgPT0gQ0ZHX0FERF9US0lQX0RFRkFVTFRfS0VZICkgewotCQkJa2V5X3AgPSAoaGNmXzMyKikoKENGR19BRERfVEtJUF9ERUZBVUxUX0tFWV9TVFJDVCBGQVIgKilsdHZwKS0+dHhfbWljX2tleTsKLQkJCWkgPSBDTlZfTElUVExFX1RPX1NIT1JUKCgoQ0ZHX0FERF9US0lQX0RFRkFVTFRfS0VZX1NUUkNUIEZBUiAqKWx0dnApLT50a2lwX2tleV9pZF9pbmZvKTsKKwkJaWYgKCBsdHZwLT50eXAgPT0gQ0ZHX0FERF9US0lQX0RFRkFVTFRfS0VZIHx8IGx0dnAtPnR5cCA9PSBDRkdfQUREX1RLSVBfTUFQUEVEX0tFWSApIHsKKwkJCWtleV9wID0gKGhjZl8zMiopKChDRkdfQUREX1RLSVBfTUFQUEVEX0tFWV9TVFJDVCBGQVIgKilsdHZwKS0+dHhfbWljX2tleTsKKwkJCWkgPSBUWF9LRVk7ICAgICAvL2kuZS4gVHhLZXlJbmRpY2F0b3IgPT0gMSwgS2V5SUQgPT0gMAorCQkJaWYgKCBsdHZwLT50eXAgPT0gQ0ZHX0FERF9US0lQX0RFRkFVTFRfS0VZICkgeworCQkJCWtleV9wID0gKGhjZl8zMiopKChDRkdfQUREX1RLSVBfREVGQVVMVF9LRVlfU1RSQ1QgRkFSICopbHR2cCktPnR4X21pY19rZXk7CisJCQkJaSA9IENOVl9MSVRUTEVfVE9fU0hPUlQoKChDRkdfQUREX1RLSVBfREVGQVVMVF9LRVlfU1RSQ1QgRkFSICopbHR2cCktPnRraXBfa2V5X2lkX2luZm8pOworCQkJfQorCQkJaWYgKCBpICYgVFhfS0VZICkgeyAvKiBUeEtleUluZGljYXRvciA9PSAxCisJCQkJCSAgICAgICAoZWl0aGVyIHJlYWxseSBzZXQgYnkgTVNGIGluIGNhc2Ugb2YgREVGQVVMVCBvciBmYWtlZCBieSBIQ0YgaW4gY2FzZSBvZiBNQVBQRUQgKSAqLworCQkJCWlmYnAtPklGQl9NSUNUeENudGwgPSAoaGNmXzE2KSggSEZTX1RYX0NOVExfTUlDIHwgKGkgJiBLRVlfSUQgKTw8OCApOworCQkJCWlmYnAtPklGQl9NSUNUeEtleVswXSA9IENOVl9MT05HUF9UT19MSVRUTEUoIGtleV9wICk7CisJCQkJaWZicC0+SUZCX01JQ1R4S2V5WzFdID0gQ05WX0xPTkdQX1RPX0xJVFRMRSggKGtleV9wKzEpICk7CisJCQl9CisJCQlpID0gKCBpICYgS0VZX0lEICkgKiAyOworCQkJaWZicC0+SUZCX01JQ1J4S2V5W2ldICAgPSBDTlZfTE9OR1BfVE9fTElUVExFKCAoa2V5X3ArMikgKTsKKwkJCWlmYnAtPklGQl9NSUNSeEtleVtpKzFdID0gQ05WX0xPTkdQX1RPX0xJVFRMRSggKGtleV9wKzMpICk7CiAJCX0KLQkJaWYgKCBpICYgVFhfS0VZICkgewkvKiBUeEtleUluZGljYXRvciA9PSAxCi0JCQkJCQkJICAgKGVpdGhlciByZWFsbHkgc2V0IGJ5IE1TRiBpbiBjYXNlIG9mIERFRkFVTFQgb3IgZmFrZWQgYnkgSENGIGluIGNhc2Ugb2YgTUFQUEVEICkgKi8KLQkJCWlmYnAtPklGQl9NSUNUeENudGwgPSAoaGNmXzE2KSggSEZTX1RYX0NOVExfTUlDIHwgKGkgJiBLRVlfSUQgKTw8OCApOwotCQkJaWZicC0+SUZCX01JQ1R4S2V5WzBdID0gQ05WX0xPTkdQX1RPX0xJVFRMRSgga2V5X3AgKTsKLQkJCWlmYnAtPklGQl9NSUNUeEtleVsxXSA9IENOVl9MT05HUF9UT19MSVRUTEUoIChrZXlfcCsxKSApOwotCQl9Ci0JCWkgPSAoIGkgJiBLRVlfSUQgKSAqIDI7Ci0JCWlmYnAtPklGQl9NSUNSeEtleVtpXSAgID0gQ05WX0xPTkdQX1RPX0xJVFRMRSggKGtleV9wKzIpICk7Ci0JCWlmYnAtPklGQl9NSUNSeEtleVtpKzFdID0gQ05WX0xPTkdQX1RPX0xJVFRMRSggKGtleV9wKzMpICk7Ci0JfQogI2RlZmluZSBQICgoQ0ZHX1JFTU9WRV9US0lQX0RFRkFVTFRfS0VZX1NUUkNUIEZBUiAqKWx0dnApCi0JaWYgKCAoIGx0dnAtPnR5cCA9PSBDRkdfUkVNT1ZFX1RLSVBfTUFQUEVEX0tFWSApCXx8Ci0JCSAoIGx0dnAtPnR5cCA9PSBDRkdfUkVNT1ZFX1RLSVBfREVGQVVMVF9LRVkgJiYKLQkJICAgKCAoaWZicC0+SUZCX01JQ1R4Q250bCA+PiA4KSAmIEtFWV9JRCApID09IENOVl9TSE9SVF9UT19MSVRUTEUoUC0+dGtpcF9rZXlfaWQgKQotCQkgKQotCQkpIHsgaWZicC0+SUZCX01JQ1R4Q250bCA9IDA7IH0JCS8vZGlzYWJsZSBNSUMtZW5naW5lCisJCWlmICggKCBsdHZwLT50eXAgPT0gQ0ZHX1JFTU9WRV9US0lQX01BUFBFRF9LRVkgKSAgICB8fAorCQkgICAgICggbHR2cC0+dHlwID09IENGR19SRU1PVkVfVEtJUF9ERUZBVUxUX0tFWSAmJgorCQkgICAgICAgKCAoaWZicC0+SUZCX01JQ1R4Q250bCA+PiA4KSAmIEtFWV9JRCApID09IENOVl9TSE9SVF9UT19MSVRUTEUoUC0+dGtpcF9rZXlfaWQgKQorCQkJICAgICApCisJCQkpIHsgaWZicC0+SUZCX01JQ1R4Q250bCA9IDA7IH0gICAgICAvL2Rpc2FibGUgTUlDLWVuZ2luZQogI3VuZGVmIFAKLSB9CisJfQogI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQogCiAJaWYgKCBsdHZwLT50eXAgPT0gQ0ZHX1BST0cgKSB7CiAJCXJjID0gZG93bmxvYWQoIGlmYnAsIChDRkdfUFJPR19TVFJDVCBGQVIgKilsdHZwICk7CiAJfSBlbHNlIHN3aXRjaCAobHR2cC0+dHlwKSB7CiAjaWYgKEhDRl9BU1NFUlQpICYgSENGX0FTU0VSVF9SVF9NU0ZfUlROCi0JICBjYXNlIENGR19SRUdfQVNTRVJUX1JUTlA6CQkJCQkJCQkJCQkvL1JlZ2lzdGVyIE1TRiBSb3V0aW5lcworCQljYXNlIENGR19SRUdfQVNTRVJUX1JUTlA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1JlZ2lzdGVyIE1TRiBSb3V0aW5lcwogI2RlZmluZSBQICgoQ0ZHX1JFR19BU1NFUlRfUlROUF9TVFJDVCBGQVIgKilsdHZwKQotCQlpZmJwLT5JRkJfQXNzZXJ0UnRuID0gUC0+cnRucDsKLS8vCQlpZmJwLT5JRkJfQXNzZXJ0THZsID0gUC0+bHZsOwkJLy9UT0RPIG5vdCB5ZXQgc3VwcG9ydGVkIHNvIGRlZmF1bHQgaXMgc2V0IGluIGhjZl9jb25uZWN0Ci0JCUhDRkFTU0VSVCggRE9fQVNTRVJULCBNRVJHRV8yKCBIQ0ZfQVNTRVJULCAweENBRjEgKSApCS8vanVzdCB0byBwcm9vZiB0aGF0IHRoZSBjb21wbGV0ZSBhc3NlcnQgbWFjaGluZXJ5IGlzIHdvcmtpbmcKKwkJCWlmYnAtPklGQl9Bc3NlcnRSdG4gPSBQLT5ydG5wOworLy8JCQlpZmJwLT5JRkJfQXNzZXJ0THZsID0gUC0+bHZsOyAgICAgICAvL1RPRE8gbm90IHlldCBzdXBwb3J0ZWQgc28gZGVmYXVsdCBpcyBzZXQgaW4gaGNmX2Nvbm5lY3QKKwkJCUhDRkFTU0VSVCggRE9fQVNTRVJULCBNRVJHRV8yKCBIQ0ZfQVNTRVJULCAweENBRjEgKSApOyAgIC8vanVzdCB0byBwcm9vZiB0aGF0IHRoZSBjb21wbGV0ZSBhc3NlcnQgbWFjaGluZXJ5IGlzIHdvcmtpbmcKICN1bmRlZiBQCi0JCWJyZWFrOworCQkJYnJlYWs7CiAjZW5kaWYgLy8gSENGX0FTU0VSVF9SVF9NU0ZfUlROCiAjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JTkZPX0xPRwotCSAgY2FzZSBDRkdfUkVHX0lORk9fTE9HOgkJCQkJCQkJCQkJLy9SZWdpc3RlciBMb2cgZmlsdGVyCi0JCWlmYnAtPklGQl9SSURMb2dwID0gKChDRkdfUklEX0xPR19TVFJDVCBGQVIqKWx0dnApLT5yZWNvcmRwOwotCQlicmVhazsKKwkJY2FzZSBDRkdfUkVHX0lORk9fTE9HOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9SZWdpc3RlciBMb2cgZmlsdGVyCisJCQlpZmJwLT5JRkJfUklETG9ncCA9ICgoQ0ZHX1JJRF9MT0dfU1RSQ1QgRkFSKilsdHZwKS0+cmVjb3JkcDsKKwkJCWJyZWFrOwogI2VuZGlmIC8vIEhDRl9FWFRfSU5GT19MT0cKLQkgIGNhc2UgQ0ZHX0NOVExfT1BUOgkJCQkJCQkJCQkJCS8vb3ZlcnJ1bGUgb3B0aW9uCi0JCUhDRkFTU0VSVCggKCBsdHZwLT52YWxbMF0gJiB+KFVTRV9ETUEgfCBVU0VfMTZCSVQpICkgPT0gMCwgbHR2cC0+dmFsWzBdICkKLQkJaWYgKCAoIGx0dnAtPnZhbFswXSAmIFVTRV9ETUEgKSA9PSAwICkgaWZicC0+SUZCX0NudGxPcHQgJj0gflVTRV9ETUE7Ci0JCWlmYnAtPklGQl9DbnRsT3B0IHw9ICBsdHZwLT52YWxbMF0gJiBVU0VfMTZCSVQ7Ci0JCWJyZWFrOwotI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKLQkgIGNhc2UgQ0ZHX1JFR19NQjoJCQkJCQkJCQkJCQkJLy9SZWdpc3RlciBNYWlsQm94CisJCWNhc2UgQ0ZHX0NOVExfT1BUOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vb3ZlcnJ1bGUgb3B0aW9uCisJCQlIQ0ZBU1NFUlQoICggbHR2cC0+dmFsWzBdICYgfihVU0VfRE1BIHwgVVNFXzE2QklUKSApID09IDAsIGx0dnAtPnZhbFswXSApOworCQkJaWYgKCAoIGx0dnAtPnZhbFswXSAmIFVTRV9ETUEgKSA9PSAwICkgaWZicC0+SUZCX0NudGxPcHQgJj0gflVTRV9ETUE7CisJCQlpZmJwLT5JRkJfQ250bE9wdCB8PSAgbHR2cC0+dmFsWzBdICYgVVNFXzE2QklUOworCQkJYnJlYWs7CisKKwkJY2FzZSBDRkdfUkVHX01COiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9SZWdpc3RlciBNYWlsQm94CiAjZGVmaW5lIFAgKChDRkdfUkVHX01CX1NUUkNUIEZBUiAqKWx0dnApCi0JCUhDRkFTU0VSVCggKCAoaGNmXzMyKVAtPm1iX2FkZHIgJiAweDAwMDEgKSA9PSAwLCAoaGNmXzMyKVAtPm1iX2FkZHIgKQotCQlIQ0ZBU1NFUlQoIChQKS0+bWJfc2l6ZSA+PSA2MCwgKFApLT5tYl9zaXplICkKLQkJaWZicC0+SUZCX01CcCA9IFAtPm1iX2FkZHI7Ci0JCS8qIGlmIG5vIE1CIHByZXNlbnQsIHNpemUgbXVzdCBiZSAwIGZvciA7P3RoZSBvbGQ7PyBwdXRfaW5mb19tYiB0byB3b3JrIGNvcnJlY3RseSAqLwotCQlpZmJwLT5JRkJfTUJTaXplID0gaWZicC0+SUZCX01CcCA9PSBOVUxMID8gMCA6IFAtPm1iX3NpemU7Ci0JCWlmYnAtPklGQl9NQldwID0gaWZicC0+SUZCX01CUnAJPSAwOwotCQlpZmJwLT5JRkJfTUJwWzBdID0gMDsJCQkJCQkJCQkJCS8vZmxhZyB0aGUgTWFpbEJveCBhcyBlbXB0eQotCQlpZmJwLT5JRkJfTUJJbmZvTGVuID0gMDsKLQkJSENGQVNTRVJUKCBpZmJwLT5JRkJfTUJTaXplID49IDYwIHx8IGlmYnAtPklGQl9NQnAgPT0gTlVMTCwgaWZicC0+SUZCX01CU2l6ZSApCisJCQlIQ0ZBU1NFUlQoICggKGhjZl8zMilQLT5tYl9hZGRyICYgMHgwMDAxICkgPT0gMCwgKGhjZl8zMilQLT5tYl9hZGRyICk7CisJCQlIQ0ZBU1NFUlQoIChQKS0+bWJfc2l6ZSA+PSA2MCwgKFApLT5tYl9zaXplICk7CisJCQlpZmJwLT5JRkJfTUJwID0gUC0+bWJfYWRkcjsKKwkJCS8qIGlmIG5vIE1CIHByZXNlbnQsIHNpemUgbXVzdCBiZSAwIGZvciA7P3RoZSBvbGQ7PyBwdXRfaW5mb19tYiB0byB3b3JrIGNvcnJlY3RseSAqLworCQkJaWZicC0+SUZCX01CU2l6ZSA9IGlmYnAtPklGQl9NQnAgPT0gTlVMTCA/IDAgOiBQLT5tYl9zaXplOworCQkJaWZicC0+SUZCX01CV3AgPSBpZmJwLT5JRkJfTUJScCA9IDA7CisJCQlpZmJwLT5JRkJfTUJwWzBdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9mbGFnIHRoZSBNYWlsQm94IGFzIGVtcHR5CisJCQlpZmJwLT5JRkJfTUJJbmZvTGVuID0gMDsKKwkJCUhDRkFTU0VSVCggaWZicC0+SUZCX01CU2l6ZSA+PSA2MCB8fCBpZmJwLT5JRkJfTUJwID09IE5VTEwsIGlmYnAtPklGQl9NQlNpemUgKTsKICN1bmRlZiBQCi0JCWJyZWFrOwotCSAgY2FzZSBDRkdfTUJfSU5GTzoJCQkJCQkJCQkJCQkJLy9zdG9yZSBNYWlsQm94SW5mb0Jsb2NrCi0JCXJjID0gcHV0X2luZm9fbWIoIGlmYnAsIChDRkdfTUJfSU5GT19TVFJDVCBGQVIgKilsdHZwICk7Ci0JCWJyZWFrOwotI2VuZGlmIC8vIEhDRl9FWFRfTUIKKwkJCWJyZWFrOworCQljYXNlIENGR19NQl9JTkZPOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3N0b3JlIE1haWxCb3hJbmZvQmxvY2sKKwkJCXJjID0gcHV0X2luZm9fbWIoIGlmYnAsIChDRkdfTUJfSU5GT19TVFJDVCBGQVIgKilsdHZwICk7CisJCQlicmVhazsKIAogI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTklDX0FDQ0VTUwotCSAgY2FzZSBDRkdfQ01EX05JQzoKKwkJY2FzZSBDRkdfQ01EX05JQzoKICNkZWZpbmUgUCAoKENGR19DTURfTklDX1NUUkNUIEZBUiAqKWx0dnApCi0JCU9QVyggSFJFR19QQVJBTV8yLCBQLT5wYXJtMiApOwotCQlPUFcoIEhSRUdfUEFSQU1fMSwgUC0+cGFybTEgKTsKLQkJcmMgPSBjbWRfZXhlKCBpZmJwLCBQLT5jbWQsIFAtPnBhcm0wICk7Ci0JCVAtPmhjZl9zdGF0ID0gKGhjZl8xNilyYzsKLQkJUC0+c3RhdCA9IElQVyggSFJFR19TVEFUICk7Ci0JCVAtPnJlc3AwID0gSVBXKCBIUkVHX1JFU1BfMCApOwotCQlQLT5yZXNwMSA9IElQVyggSFJFR19SRVNQXzEgKTsKLQkJUC0+cmVzcDIgPSBJUFcoIEhSRUdfUkVTUF8yICk7Ci0JCVAtPmlmYl9lcnJfY21kID0gaWZicC0+SUZCX0VyckNtZDsKLQkJUC0+aWZiX2Vycl9xdWFsaWZpZXIgPSBpZmJwLT5JRkJfRXJyUXVhbGlmaWVyOworCQkJT1BXKCBIUkVHX1BBUkFNXzIsIFAtPnBhcm0yICk7CisJCQlPUFcoIEhSRUdfUEFSQU1fMSwgUC0+cGFybTEgKTsKKwkJCXJjID0gY21kX2V4ZSggaWZicCwgUC0+Y21kLCBQLT5wYXJtMCApOworCQkJUC0+aGNmX3N0YXQgPSAoaGNmXzE2KXJjOworCQkJUC0+c3RhdCA9IElQVyggSFJFR19TVEFUICk7CisJCQlQLT5yZXNwMCA9IElQVyggSFJFR19SRVNQXzAgKTsKKwkJCVAtPnJlc3AxID0gSVBXKCBIUkVHX1JFU1BfMSApOworCQkJUC0+cmVzcDIgPSBJUFcoIEhSRUdfUkVTUF8yICk7CisJCQlQLT5pZmJfZXJyX2NtZCA9IGlmYnAtPklGQl9FcnJDbWQ7CisJCQlQLT5pZmJfZXJyX3F1YWxpZmllciA9IGlmYnAtPklGQl9FcnJRdWFsaWZpZXI7CiAjdW5kZWYgUAotCQlicmVhazsKLQkgIGNhc2UgQ0ZHX0NNRF9IQ0Y6CisJCQlicmVhazsKKwkJY2FzZSBDRkdfQ01EX0hDRjoKICNkZWZpbmUgUCAoKENGR19DTURfSENGX1NUUkNUIEZBUiAqKWx0dnApCi0JCUhDRkFTU0VSVCggUC0+Y21kID09IENGR19DTURfSENGX1JFR19BQ0NFU1MsIFAtPmNtZCApCQkvL29ubHkgSGVybWVzIHJlZ2lzdGVyIGFjY2VzcyBzdXBwb3J0ZWQKLQkJaWYgKCBQLT5jbWQgPT0gQ0ZHX0NNRF9IQ0ZfUkVHX0FDQ0VTUyApIHsKLQkJCUhDRkFTU0VSVCggUC0+bW9kZSA8IGlmYnAtPklGQl9JT0Jhc2UsIFAtPm1vZGUgKQkJLy9DaGVjayBSZWdpc3RlciBzcGFjZQotCQkJT1BXKCBQLT5tb2RlLCBQLT5hZGRfaW5mbyk7Ci0JCX0KKwkJCUhDRkFTU0VSVCggUC0+Y21kID09IENGR19DTURfSENGX1JFR19BQ0NFU1MsIFAtPmNtZCApOyAgICAgICAvL29ubHkgSGVybWVzIHJlZ2lzdGVyIGFjY2VzcyBzdXBwb3J0ZWQKKwkJCWlmICggUC0+Y21kID09IENGR19DTURfSENGX1JFR19BQ0NFU1MgKSB7CisJCQkJSENGQVNTRVJUKCBQLT5tb2RlIDwgaWZicC0+SUZCX0lPQmFzZSwgUC0+bW9kZSApOyAgICAgICAgLy9DaGVjayBSZWdpc3RlciBzcGFjZQorCQkJCU9QVyggUC0+bW9kZSwgUC0+YWRkX2luZm8pOworCQkJfQogI3VuZGVmIFAKLQkJYnJlYWs7CisJCQlicmVhazsKICNlbmRpZiAvLyBIQ0ZfRVhUX05JQ19BQ0NFU1MKIAogI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfUFJJTlRGCi0gICAgICBjYXNlIENGR19GV19QUklOVEZfQlVGRkVSX0xPQ0FUSU9OOgotICAgICAgICBpZmJwLT5JRkJfRndQZkJ1ZmYgPSAqKENGR19GV19QUklOVEZfQlVGRkVSX0xPQ0FUSU9OX1NUUkNUKilsdHZwOwotICAgICAgICBicmVhazsKKwkJY2FzZSBDRkdfRldfUFJJTlRGX0JVRkZFUl9MT0NBVElPTjoKKwkJCWlmYnAtPklGQl9Gd1BmQnVmZiA9ICooQ0ZHX0ZXX1BSSU5URl9CVUZGRVJfTE9DQVRJT05fU1RSQ1QqKWx0dnA7CisJCQlicmVhazsKICNlbmRpZiAvLyBIQ0ZfQVNTRVJUX1BSSU5URgogCi0JICBkZWZhdWx0OgkJCQkJCS8vcGFzcyBldmVyeXRoaW5nIHVua25vd24gYWJvdmUgdGhlICJGSUQiIHJhbmdlIHRvIHRoZSBIZXJtZXMgb3IgRG9uZ2xlCi0JCXJjID0gcHV0X2luZm8oIGlmYnAsIGx0dnAgKTsKLQl9Ci0JLy9ETyBOT1QgISEhIEhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjICkJCQkJCQkJCQkJCQkvKiAyMCAqLwotCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9QVVRfSU5GTyApCisJCWRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgIC8vcGFzcyBldmVyeXRoaW5nIHVua25vd24gYWJvdmUgdGhlICJGSUQiIHJhbmdlIHRvIHRoZSBIZXJtZXMgb3IgRG9uZ2xlCisJCQlyYyA9IHB1dF9pbmZvKCBpZmJwLCBsdHZwICk7CisJCX0KKwkvL0RPIE5PVCAhISEgSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIwICovCisJSENGTE9HRVhJVCggSENGX1RSQUNFX1BVVF9JTkZPICk7CiAJcmV0dXJuIHJjOwogfSAvLyBoY2ZfcHV0X2luZm8KIAogCi0jaWYgKEhDRl9ETF9PTkxZKSA9PSAwCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qLk1PRFVMRQkJaW50IGhjZl9yY3ZfbXNnKCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCB1bnNpZ25lZCBpbnQgb2Zmc2V0ICkKLSouUFVSUE9TRQkJQWxsOiBkZWNhcHN1bGF0ZSBhIG1lc3NhZ2UuCi0qCQkJCXByZS1IZXJtZXNJSS41OiB2ZXJpZnkgTUlDLgotKgkJCQlub24tVVNCLCBub24tRE1BIG1vZGU6IFRyYW5zZmVyIGEgbWVzc2FnZSBmcm9tIHRoZSBOSUMgdG8gdGhlIEhvc3QgYW5kIGFja25vd2xlZGdlIHJlY2VwdGlvbi4KLSoJCQkJVVNCOiBUcmFuc2Zvcm0gYSBtZXNzYWdlIGZyb20gcHJvcHJpZXRhcnkgVVNCIGZvcm1hdCB0byA4MDIuMyBmb3JtYXQKLSoKLSouQVJHVU1FTlRTCi0qCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawotKglkZXNjcAkJUG9pbnRlciB0byB0aGUgRGVzY3JpcHRvciBMaXN0IGxvY2F0aW9uLgotKglvZmZzZXQJCVVTQjogbm90IHVzZWQKLSoJCQkJbm9uLVVTQjogc3BlY2lmaWVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRhdGEgdG8gYmUgb2J0YWluZWQgKDAgY29ycmVzcG9uZHMgd2l0aCBEZXN0QWRkciBmaWVsZAotKgkJCQlvZiBmcmFtZSkuCi0qCi0qLlJFVFVSTlMKLSoJSENGX1NVQ0NFU1MJCQlObyBTU04gZXJyb3IgKCBvciBIQ0ZfRVJSX01JQyBhbHJlYWR5IHJlcG9ydGVkIGJ5IGhjZl9zZXJ2aWNlX25pYykKLSoJSENGX0VSUl9NSUMJCQltZXNzYWdlIGNvbnRhaW5zIGFuIGVycm9uZW91cyBNSUMgKCBIQ0ZfU1VDQ0VTUyBpcyByZXBvcnRlZCBpZiBIQ0ZfRVJSX01JQyBpcyBhbHJlYWR5Ci0qCQkJCQkJcmVwb3J0ZWQgYnkgaGNmX3NlcnZpY2VfbmljKQotKiAJSENGX0VSUl9OT19OSUMJCU5JQyByZW1vdmVkIGR1cmluZyBkYXRhIHJldHJpZXZhbAotKiAJSENGX0VSUl9ERUZVTkNULi4uCi0qCi0qLkRFU0NSSVBUSU9OCi0qIFRoZSBSZWNlaXZlIE1lc3NhZ2UgRnVuY3Rpb24gY2FuIGJlIGV4ZWN1dGVkIGJ5IHRoZSBNU0YgdG8gb2J0YWluIHRoZSBEYXRhIEluZm8gZmllbGRzIG9mIHRoZSBtZXNzYWdlIHRoYXQKLSogaXMgcmVwb3J0ZWQgdG8gYmUgYXZhaWxhYmxlIGJ5IHRoZSBTZXJ2aWNlIE5JQyBGdW5jdGlvbi4KLSoKLSogVGhlIFJlY2VpdmUgTWVzc2FnZSBGdW5jdGlvbiBjb3BpZXMgdGhlIG1lc3NhZ2UgZGF0YSBhdmFpbGFibGUgaW4gdGhlIENhcmQgbWVtb3J5IGludG8gYSBidWZmZXIgc3RydWN0dXJlCi0qIHByb3ZpZGVkIGJ5IHRoZSBNU0YuCi0qIE9ubHkgZGF0YSBvZiB0aGUgbWVzc2FnZSBpbmRpY2F0ZWQgYnkgdGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uIGNhbiBiZSBvYnRhaW5lZC4KLSogRXhlY3V0aW9uIG9mIHRoZSBTZXJ2aWNlIE5JQyBmdW5jdGlvbiBtYXkgcmVzdWx0IGluIHRoZSBhdmFpbGFiaWxpdHkgb2YgYSBuZXcgbWVzc2FnZSwgYnV0IGl0IGRlZmluaXRlbHkKLSogbWFrZXMgdGhlIG1lc3NhZ2UgcmVwb3J0ZWQgYnkgdGhlIHByZWNlZGluZyBTZXJ2aWNlIE5JQyBmdW5jdGlvbiwgdW5hdmFpbGFibGUuCi0qCi0qIGluIG5vbi1VU0Ivbm9uLURNQSBtb2RlLCBoY2ZfcmN2X21zZyBzdGFydHMgdGhlIGNvcHkgcHJvY2VzcyBhdCB0aGUgKG5vbi1uZWdhdGl2ZSkgb2Zmc2V0IHJlcXVlc3RlZCBieSB0aGUKLSogcGFyYW1ldGVyIG9mZnNldCwgcmVsYXRpdmUgdG8gSEZTX0FERFJfREVTVCwgZS5nIG9mZnNldCAwIHN0YXJ0cyBjb3B5aW5nIGZyb20gdGhlIERlc3RpbmF0aW9uIEFkZHJlc3MsIHRoZQotKiB2ZXJ5IGJlZ2luIG9mIHRoZSA4MDIuMyBmcmFtZSBtZXNzYWdlLiBPZmZzZXQgbXVzdCBlaXRoZXIgbGF5IHdpdGhpbiB0aGUgcGFydCBvZiB0aGUgODAyLjMgZnJhbWUgYXMgc3RvcmVkCi0qIGJ5IGhjZl9zZXJ2aWNlX25pYyBpbiB0aGUgbG9va2FoZWFkIGJ1ZmZlciBvciBiZSBqdXN0IGJlaGluZCBpdCwgaS5lLiB0aGUgZmlyc3QgYnl0ZSBub3QgeWV0IHJlYWQuCi0qIFdoZW4gb2Zmc2V0IGlzIHdpdGhpbiBsb29rYWhlYWQsIGRhdGEgaXMgY29waWVkIGZyb20gbG9va2FoZWFkLgotKiBXaGVuIG9mZnNldCBpcyBiZXlvbmQgbG9va2FoZWFkLCBkYXRhIGlzIHJlYWQgZGlyZWN0bHkgZnJvbSBSeEZTIGluIE5JQyB3aXRoIGRpc3JlZ2FyZCBvZiB0aGUgYWN0dWFsIHZhbHVlCi0qIG9mIG9mZnNldAotKgotKi5OT1RJQ0U6Ci0qIG8gYXQgZW50cnk6IGxvb2sgYWhlYWQgYnVmZmVyIGFzIHBhc3NlZCB3aXRoIGhjZl9zZXJ2aWNlX25pYyBpcyBzdGlsbCBhY2Nlc3NpYmxlIGFuZCB1bmNoYW5nZWQKLSogbyBhdCBleGl0OiBSZWNlaXZlIEZyYW1lIGluIE5JQyBtZW1vcnkgaXMgcmVsZWFzZWQKLSoKLSogRGVzY3JpcHRpb246Ci0qIFN0YXJ0aW5nIGF0IHRoZSBieXRlIGluZGljYXRlZCBieSB0aGUgT2Zmc2V0IHZhbHVlLCB0aGUgYnl0ZXMgYXJlIGNvcGllZCBmcm9tIHRoZSBEYXRhIEluZm8KLSogUGFydCBvZiB0aGUgY3VycmVudCBSZWNlaXZlIEZyYW1lIFN0cnVjdHVyZSB0byB0aGUgSG9zdCBtZW1vcnkgZGF0YSBidWZmZXIgc3RydWN0dXJlCi0qIGlkZW50aWZpZWQgYnkgZGVzY3AuCi0qIFRoZSBtYXhpbXVtIHZhbHVlIGZvciBPZmZzZXQgaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIG9mIHRoZSA4MDIuMyBmcmFtZSByZWFkIGludG8gdGhlCi0qIGxvb2sgYWhlYWQgYnVmZmVyIGJ5IGhjZl9zZXJ2aWNlX25pYyAoaS5lLiB0aGUgbG9vayBhaGVhZCBidWZmZXIgc2l6ZSBtaW51cwotKiBDb250cm9sIGFuZCA4MDIuMTEgZmllbGRzKQotKiBJZiBPZmZzZXQgaXMgbGVzcyB0aGFuIHRoZSBtYXhpbXVtIHZhbHVlLCBjb3B5aW5nIHN0YXJ0cyBmcm9tIHRoZSBsb29rIGFoZWFkIGJ1ZmZlciB0aWxsIHRoZQotKiBlbmQgb2YgdGhhdCBidWZmZXIgaXMgcmVhY2hlZAotKiBUaGVuIChvciBpZiB0aGUgbWF4aW11bSB2YWx1ZSBpcyBzcGVjaWZpZWQgZm9yIE9mZnNldCksIHRoZQotKiBtZXNzYWdlIGlzIGRpcmVjdGx5IGNvcGllZCBmcm9tIE5JQyBtZW1vcnkgdG8gSG9zdCBtZW1vcnkuCi0qIElmIGFuIGludmFsaWQgKGkuZS4gdG9vIGxhcmdlKSBvZmZzZXQgaXMgc3BlY2lmaWVkLCBhbiBhc3NlcnQgY2F0Y2hlcyBidXQgdGhlIGJ1ZmZlciBjb250ZW50cyBhcmUKLSogdW5kZWZpbmVkLgotKiBDb3B5aW5nIHN0b3BzIGlmIGVpdGhlcjoKLSogbyB0aGUgZW5kIG9mIHRoZSA4MDIuMyBmcmFtZSBpcyByZWFjaGVkCi0qIG8gdGhlIERlc2NyaXB0b3Igd2l0aCBhIE5VTEwgcG9pbnRlciBpbiB0aGUgbmV4dF9kZXNjX2FkZHIgZmllbGQgaXMgcmVhY2hlZAotKgotKiBXaGVuIHRoZSBjb3B5aW5nIHN0b3BzLCB0aGUgcmVjZWl2ZXIgaXMgYWNrJ2VkLCB0aHVzIGZyZWVpbmcgdGhlIE5JQyBtZW1vcnkgd2hlcmUgdGhlIGZyYW1lIGlzIHN0b3JlZAotKiBBcyBhIGNvbnNlcXVlbmNlLCBoY2ZfcmN2X21zZyBjYW4gb25seSBiZSBjYWxsZWQgb25jZSBmb3IgYW55IHBhcnRpY3VsYXIgUnggZnJhbWUuCi0qCi0qIEZvciB0aGUgdGltZSBiZWluZyAoUENJIEJ1cyBtYXN0ZXJpbmcgbm90IHlldCBzdXBwb3J0ZWQpLCBvbmx5IHRoZSBmb2xsb3dpbmcgZmllbGRzIG9mIGVhY2gKLSogb2YgdGhlIGRlc2NyaXB0b3JzIGluIHRoZSBkZXNjcmlwdG9yIGxpc3QgbXVzdCBiZSBzZXQgYnkgdGhlIE1TRjoKLSogbyBidWZfY250bC5idWZfZGltWzFdCi0qIG8gKm5leHRfZGVzY19hZGRyCi0qIG8gKmJ1Zl9hZGRyCi0qIEF0IHJldHVybiBmcm9tIGhjZl9yY3ZfbXNnLCB0aGUgZmllbGQgYnVmX2NudGwuYnVmX2RpbVswXSBvZiB0aGUgdXNlZCBEZXNjcmlwdG9ycyByZWZsZWN0cwotKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIgY29ycmVzcG9uZGluZyB3aXRoIHRoZSBEZXNjcmlwdG9yLgotKiBPbiB0aGUgbGFzdCB1c2VkIERlc2NyaXB0b3IsIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gaXMgbGVzcyBvciBlcXVhbCB0byBidWZfY250bC5idWZfZGltWzFdLgotKiBPbiBhbGwgcHJlY2VkaW5nIERlc2NyaXB0b3JzIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gaXMgZXF1YWwgdG8gYnVmX2NudGwuYnVmX2RpbVsxXS4KLSogT24gYWxsIHN1Y2NlZWRpbmcgKHVudXNlZCkgRGVzY3JpcHRvcnMsIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gaXMgemVyby4KLSogTm90ZTogdGhpcyBJL0YgaXMgYmFzZWQgb24gdGhlIGFzc3VtcHRpb25zIGhvdyB0aGUgSS9GIG5lZWRlZCBmb3IgUENJIEJ1cyBtYXN0ZXJpbmcgd2lsbAotKiBiZSwgc28gaXQgbWF5IGNoYW5nZS4KLSoKLSogVGhlIG1vc3QgbGlrZWx5IGhhbmRsaW5nIG9mIEhDRl9FUlJfTk9fTklDIGJ5IHRoZSBNU0YgaXMgdG8gZHJvcCB0aGUgYWxyZWFkeSBjb3BpZWQKLSogZGF0YSBhcyBlbGVnYW50bHkgYXMgcG9zc2libGUgdW5kZXIgdGhlIGNvbnN0cmFpbnRzIGFuZCByZXF1aXJlbWVudHMgcG9zZWQgYnkgdGhlIChOKU9TLgotKiBJZiBubyByZWNlaXZlZCBGcmFtZSBTdHJ1Y3R1cmUgaXMgcGVuZGluZywgIlN1Y2Nlc3MiIHJhdGhlciB0aGFuICJSZWFkIGVycm9yIiBpcyByZXR1cm5lZC4KLSogVGhpcyBlcnJvciBjb25zdGl0dXRlcyBhIGxvZ2ljIGZsYXcgaW4gdGhlIE1TRgotKiBUaGUgSENGIGNhbiBvbmx5IGNhdGNoIGEgbWlub3JpdHkgb2YgdGhpcwotKiB0eXBlIG9mIGVycm9ycwotKiBCYXNlZCBvbiBjb25zaXN0ZW5jeSBpZGVhcywgdGhlIEhDRiBjYXRjaGVzIG5vbmUgb2YgdGhlc2UgZXJyb3JzLgotKgotKiBBc3NlcnQgZmFpbHMgaWYKLSogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUKLSogLSB0aGVyZSBpcyBubyB1bmFja25vd2xlZGdlZCBSeC1tZXNzYWdlIGF2YWlsYWJsZQotKiAtIG9mZnNldCBpcyBvdXQgb2YgcmFuZ2UgKG91dHNpZGUgbG9vayBhaGVhZCBidWZmZXIpCi0qIC0gZGVzY3AgaXMgYSBOVUxMIHBvaW50ZXIKLSogLSBhbnkgb2YgdGhlIGRlc2NyaXB0b3JzIGlzIG5vdCBkb3VibGUgd29yZCBhbGlnbmVkCi0qIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbgotKiAJYWdhaW5zdCBOSUMgaW50ZXJydXB0cyBvciBtdWx0aS10aHJlYWRpbmcuCi0qIC0gSW50ZXJydXB0cyBhcmUgZW5hYmxlZC4KLSoKLSouRElBR1JBTQotKgotKi5OT1RJQ0UKLSogLSBieSB1c2luZyB1bnNpZ25lZCBpbnQgYXMgdHlwZSBmb3Igb2Zmc2V0LCBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IG5lZ2F0aXZlIG9mZnNldHMKLSogLSBBc3NlcnRpbmcgb24gYmVpbmcgZW5hYmxlZC9wcmVzZW50IGlzIHN1cGVyZmx1b3VzLCBzaW5jZSBhIG5vbi16ZXJvIElGQl9sYWwgaW1wbGllcyB0aGF0IGhjZl9zZXJ2aWNlX25pYwotKiAgIHdhcyBjYWxsZWQgYW5kIGRldGVjdGVkIGEgUngtbWVzc2FnZS4gQSB6ZXJvIElGQl9sYWwgd2lsbCBzZXQgdGhlIEJVRl9DTlQgZmllbGQgb2YgYXQgbGVhc3QgdGhlIGZpcnN0Ci0qICAgZGVzY3JpcHRvciB0byB6ZXJvLgotKgotKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqCisgKi5NT0RVTEUgICAgICAgIGludCBoY2ZfcmN2X21zZyggSUZCUCBpZmJwLCBERVNDX1NUUkNUICpkZXNjcCwgdW5zaWduZWQgaW50IG9mZnNldCApCisgKi5QVVJQT1NFICAgICAgIEFsbDogZGVjYXBzdWxhdGUgYSBtZXNzYWdlLgorICogICAgICAgICAgICAgICBwcmUtSGVybWVzSUkuNTogdmVyaWZ5IE1JQy4KKyAqICAgICAgICAgICAgICAgbm9uLVVTQiwgbm9uLURNQSBtb2RlOiBUcmFuc2ZlciBhIG1lc3NhZ2UgZnJvbSB0aGUgTklDIHRvIHRoZSBIb3N0IGFuZCBhY2tub3dsZWRnZSByZWNlcHRpb24uCisgKiAgICAgICAgICAgICAgIFVTQjogVHJhbnNmb3JtIGEgbWVzc2FnZSBmcm9tIHByb3ByaWV0YXJ5IFVTQiBmb3JtYXQgdG8gODAyLjMgZm9ybWF0CisgKgorICouQVJHVU1FTlRTCisgKiAgIGlmYnAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworICogICBkZXNjcCAgICAgICBQb2ludGVyIHRvIHRoZSBEZXNjcmlwdG9yIExpc3QgbG9jYXRpb24uCisgKiAgIG9mZnNldCAgICAgIFVTQjogbm90IHVzZWQKKyAqICAgICAgICAgICAgICAgbm9uLVVTQjogc3BlY2lmaWVzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRhdGEgdG8gYmUgb2J0YWluZWQgKDAgY29ycmVzcG9uZHMgd2l0aCBEZXN0QWRkciBmaWVsZAorICogICAgICAgICAgICAgICBvZiBmcmFtZSkuCisgKgorICouUkVUVVJOUworICogICBIQ0ZfU1VDQ0VTUyAgICAgICAgIE5vIFdQQSBlcnJvciAoIG9yIEhDRl9FUlJfTUlDIGFscmVhZHkgcmVwb3J0ZWQgYnkgaGNmX3NlcnZpY2VfbmljKQorICogICBIQ0ZfRVJSX01JQyAgICAgICAgIG1lc3NhZ2UgY29udGFpbnMgYW4gZXJyb25lb3VzIE1JQyAoIEhDRl9TVUNDRVNTIGlzIHJlcG9ydGVkIGlmIEhDRl9FUlJfTUlDIGlzIGFscmVhZHkKKyAqICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZCBieSBoY2Zfc2VydmljZV9uaWMpCisgKiAgIEhDRl9FUlJfTk9fTklDICAgICAgTklDIHJlbW92ZWQgZHVyaW5nIGRhdGEgcmV0cmlldmFsCisgKiAgIEhDRl9FUlJfREVGVU5DVC4uLgorICoKKyAqLkRFU0NSSVBUSU9OCisgKiBUaGUgUmVjZWl2ZSBNZXNzYWdlIEZ1bmN0aW9uIGNhbiBiZSBleGVjdXRlZCBieSB0aGUgTVNGIHRvIG9idGFpbiB0aGUgRGF0YSBJbmZvIGZpZWxkcyBvZiB0aGUgbWVzc2FnZSB0aGF0CisgKiBpcyByZXBvcnRlZCB0byBiZSBhdmFpbGFibGUgYnkgdGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uLgorICoKKyAqIFRoZSBSZWNlaXZlIE1lc3NhZ2UgRnVuY3Rpb24gY29waWVzIHRoZSBtZXNzYWdlIGRhdGEgYXZhaWxhYmxlIGluIHRoZSBDYXJkIG1lbW9yeSBpbnRvIGEgYnVmZmVyIHN0cnVjdHVyZQorICogcHJvdmlkZWQgYnkgdGhlIE1TRi4KKyAqIE9ubHkgZGF0YSBvZiB0aGUgbWVzc2FnZSBpbmRpY2F0ZWQgYnkgdGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uIGNhbiBiZSBvYnRhaW5lZC4KKyAqIEV4ZWN1dGlvbiBvZiB0aGUgU2VydmljZSBOSUMgZnVuY3Rpb24gbWF5IHJlc3VsdCBpbiB0aGUgYXZhaWxhYmlsaXR5IG9mIGEgbmV3IG1lc3NhZ2UsIGJ1dCBpdCBkZWZpbml0ZWx5CisgKiBtYWtlcyB0aGUgbWVzc2FnZSByZXBvcnRlZCBieSB0aGUgcHJlY2VkaW5nIFNlcnZpY2UgTklDIGZ1bmN0aW9uLCB1bmF2YWlsYWJsZS4KKyAqCisgKiBpbiBub24tVVNCL25vbi1ETUEgbW9kZSwgaGNmX3Jjdl9tc2cgc3RhcnRzIHRoZSBjb3B5IHByb2Nlc3MgYXQgdGhlIChub24tbmVnYXRpdmUpIG9mZnNldCByZXF1ZXN0ZWQgYnkgdGhlCisgKiBwYXJhbWV0ZXIgb2Zmc2V0LCByZWxhdGl2ZSB0byBIRlNfQUREUl9ERVNULCBlLmcgb2Zmc2V0IDAgc3RhcnRzIGNvcHlpbmcgZnJvbSB0aGUgRGVzdGluYXRpb24gQWRkcmVzcywgdGhlCisgKiB2ZXJ5IGJlZ2luIG9mIHRoZSA4MDIuMyBmcmFtZSBtZXNzYWdlLiBPZmZzZXQgbXVzdCBlaXRoZXIgbGF5IHdpdGhpbiB0aGUgcGFydCBvZiB0aGUgODAyLjMgZnJhbWUgYXMgc3RvcmVkCisgKiBieSBoY2Zfc2VydmljZV9uaWMgaW4gdGhlIGxvb2thaGVhZCBidWZmZXIgb3IgYmUganVzdCBiZWhpbmQgaXQsIGkuZS4gdGhlIGZpcnN0IGJ5dGUgbm90IHlldCByZWFkLgorICogV2hlbiBvZmZzZXQgaXMgd2l0aGluIGxvb2thaGVhZCwgZGF0YSBpcyBjb3BpZWQgZnJvbSBsb29rYWhlYWQuCisgKiBXaGVuIG9mZnNldCBpcyBiZXlvbmQgbG9va2FoZWFkLCBkYXRhIGlzIHJlYWQgZGlyZWN0bHkgZnJvbSBSeEZTIGluIE5JQyB3aXRoIGRpc3JlZ2FyZCBvZiB0aGUgYWN0dWFsIHZhbHVlCisgKiBvZiBvZmZzZXQKKyAqCisgKi5OT1RJQ0U6CisgKiBvIGF0IGVudHJ5OiBsb29rIGFoZWFkIGJ1ZmZlciBhcyBwYXNzZWQgd2l0aCBoY2Zfc2VydmljZV9uaWMgaXMgc3RpbGwgYWNjZXNzaWJsZSBhbmQgdW5jaGFuZ2VkCisgKiBvIGF0IGV4aXQ6IFJlY2VpdmUgRnJhbWUgaW4gTklDIG1lbW9yeSBpcyByZWxlYXNlZAorICoKKyAqIERlc2NyaXB0aW9uOgorICogU3RhcnRpbmcgYXQgdGhlIGJ5dGUgaW5kaWNhdGVkIGJ5IHRoZSBPZmZzZXQgdmFsdWUsIHRoZSBieXRlcyBhcmUgY29waWVkIGZyb20gdGhlIERhdGEgSW5mbworICogUGFydCBvZiB0aGUgY3VycmVudCBSZWNlaXZlIEZyYW1lIFN0cnVjdHVyZSB0byB0aGUgSG9zdCBtZW1vcnkgZGF0YSBidWZmZXIgc3RydWN0dXJlCisgKiBpZGVudGlmaWVkIGJ5IGRlc2NwLgorICogVGhlIG1heGltdW0gdmFsdWUgZm9yIE9mZnNldCBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgb2YgdGhlIDgwMi4zIGZyYW1lIHJlYWQgaW50byB0aGUKKyAqIGxvb2sgYWhlYWQgYnVmZmVyIGJ5IGhjZl9zZXJ2aWNlX25pYyAoaS5lLiB0aGUgbG9vayBhaGVhZCBidWZmZXIgc2l6ZSBtaW51cworICogQ29udHJvbCBhbmQgODAyLjExIGZpZWxkcykKKyAqIElmIE9mZnNldCBpcyBsZXNzIHRoYW4gdGhlIG1heGltdW0gdmFsdWUsIGNvcHlpbmcgc3RhcnRzIGZyb20gdGhlIGxvb2sgYWhlYWQgYnVmZmVyIHRpbGwgdGhlCisgKiBlbmQgb2YgdGhhdCBidWZmZXIgaXMgcmVhY2hlZAorICogVGhlbiAob3IgaWYgdGhlIG1heGltdW0gdmFsdWUgaXMgc3BlY2lmaWVkIGZvciBPZmZzZXQpLCB0aGUKKyAqIG1lc3NhZ2UgaXMgZGlyZWN0bHkgY29waWVkIGZyb20gTklDIG1lbW9yeSB0byBIb3N0IG1lbW9yeS4KKyAqIElmIGFuIGludmFsaWQgKGkuZS4gdG9vIGxhcmdlKSBvZmZzZXQgaXMgc3BlY2lmaWVkLCBhbiBhc3NlcnQgY2F0Y2hlcyBidXQgdGhlIGJ1ZmZlciBjb250ZW50cyBhcmUKKyAqIHVuZGVmaW5lZC4KKyAqIENvcHlpbmcgc3RvcHMgaWYgZWl0aGVyOgorICogbyB0aGUgZW5kIG9mIHRoZSA4MDIuMyBmcmFtZSBpcyByZWFjaGVkCisgKiBvIHRoZSBEZXNjcmlwdG9yIHdpdGggYSBOVUxMIHBvaW50ZXIgaW4gdGhlIG5leHRfZGVzY19hZGRyIGZpZWxkIGlzIHJlYWNoZWQKKyAqCisgKiBXaGVuIHRoZSBjb3B5aW5nIHN0b3BzLCB0aGUgcmVjZWl2ZXIgaXMgYWNrJ2VkLCB0aHVzIGZyZWVpbmcgdGhlIE5JQyBtZW1vcnkgd2hlcmUgdGhlIGZyYW1lIGlzIHN0b3JlZAorICogQXMgYSBjb25zZXF1ZW5jZSwgaGNmX3Jjdl9tc2cgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UgZm9yIGFueSBwYXJ0aWN1bGFyIFJ4IGZyYW1lLgorICoKKyAqIEZvciB0aGUgdGltZSBiZWluZyAoUENJIEJ1cyBtYXN0ZXJpbmcgbm90IHlldCBzdXBwb3J0ZWQpLCBvbmx5IHRoZSBmb2xsb3dpbmcgZmllbGRzIG9mIGVhY2gKKyAqIG9mIHRoZSBkZXNjcmlwdG9ycyBpbiB0aGUgZGVzY3JpcHRvciBsaXN0IG11c3QgYmUgc2V0IGJ5IHRoZSBNU0Y6CisgKiBvIGJ1Zl9jbnRsLmJ1Zl9kaW1bMV0KKyAqIG8gKm5leHRfZGVzY19hZGRyCisgKiBvICpidWZfYWRkcgorICogQXQgcmV0dXJuIGZyb20gaGNmX3Jjdl9tc2csIHRoZSBmaWVsZCBidWZfY250bC5idWZfZGltWzBdIG9mIHRoZSB1c2VkIERlc2NyaXB0b3JzIHJlZmxlY3RzCisgKiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIgY29ycmVzcG9uZGluZyB3aXRoIHRoZSBEZXNjcmlwdG9yLgorICogT24gdGhlIGxhc3QgdXNlZCBEZXNjcmlwdG9yLCBidWZfY250bC5idWZfZGltWzBdIGlzIGxlc3Mgb3IgZXF1YWwgdG8gYnVmX2NudGwuYnVmX2RpbVsxXS4KKyAqIE9uIGFsbCBwcmVjZWRpbmcgRGVzY3JpcHRvcnMgYnVmX2NudGwuYnVmX2RpbVswXSBpcyBlcXVhbCB0byBidWZfY250bC5idWZfZGltWzFdLgorICogT24gYWxsIHN1Y2NlZWRpbmcgKHVudXNlZCkgRGVzY3JpcHRvcnMsIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0gaXMgemVyby4KKyAqIE5vdGU6IHRoaXMgSS9GIGlzIGJhc2VkIG9uIHRoZSBhc3N1bXB0aW9ucyBob3cgdGhlIEkvRiBuZWVkZWQgZm9yIFBDSSBCdXMgbWFzdGVyaW5nIHdpbGwKKyAqIGJlLCBzbyBpdCBtYXkgY2hhbmdlLgorICoKKyAqIFRoZSBtb3N0IGxpa2VseSBoYW5kbGluZyBvZiBIQ0ZfRVJSX05PX05JQyBieSB0aGUgTVNGIGlzIHRvIGRyb3AgdGhlIGFscmVhZHkgY29waWVkCisgKiBkYXRhIGFzIGVsZWdhbnRseSBhcyBwb3NzaWJsZSB1bmRlciB0aGUgY29uc3RyYWludHMgYW5kIHJlcXVpcmVtZW50cyBwb3NlZCBieSB0aGUgKE4pT1MuCisgKiBJZiBubyByZWNlaXZlZCBGcmFtZSBTdHJ1Y3R1cmUgaXMgcGVuZGluZywgIlN1Y2Nlc3MiIHJhdGhlciB0aGFuICJSZWFkIGVycm9yIiBpcyByZXR1cm5lZC4KKyAqIFRoaXMgZXJyb3IgY29uc3RpdHV0ZXMgYSBsb2dpYyBmbGF3IGluIHRoZSBNU0YKKyAqIFRoZSBIQ0YgY2FuIG9ubHkgY2F0Y2ggYSBtaW5vcml0eSBvZiB0aGlzCisgKiB0eXBlIG9mIGVycm9ycworICogQmFzZWQgb24gY29uc2lzdGVuY3kgaWRlYXMsIHRoZSBIQ0YgY2F0Y2hlcyBub25lIG9mIHRoZXNlIGVycm9ycy4KKyAqCisgKiBBc3NlcnQgZmFpbHMgaWYKKyAqIC0gaWZicCBoYXMgYSByZWNvZ25pemFibGUgb3V0LW9mLXJhbmdlIHZhbHVlCisgKiAtIHRoZXJlIGlzIG5vIHVuYWNrbm93bGVkZ2VkIFJ4LW1lc3NhZ2UgYXZhaWxhYmxlCisgKiAtIG9mZnNldCBpcyBvdXQgb2YgcmFuZ2UgKG91dHNpZGUgbG9vayBhaGVhZCBidWZmZXIpCisgKiAtIGRlc2NwIGlzIGEgTlVMTCBwb2ludGVyCisgKiAtIGFueSBvZiB0aGUgZGVzY3JpcHRvcnMgaXMgbm90IGRvdWJsZSB3b3JkIGFsaWduZWQKKyAqIC0gcmVlbnRyYW5jeSwgbWF5IGJlICBjYXVzZWQgYnkgY2FsbGluZyBoY2ZfZnVuY3Rpb25zIHdpdGhvdXQgYWRlcXVhdGUgcHJvdGVjdGlvbgorICogICBhZ2FpbnN0IE5JQyBpbnRlcnJ1cHRzIG9yIG11bHRpLXRocmVhZGluZy4KKyAqIC0gSW50ZXJydXB0cyBhcmUgZW5hYmxlZC4KKyAqCisgKi5ESUFHUkFNCisgKgorICouTk9USUNFCisgKiAtIGJ5IHVzaW5nIHVuc2lnbmVkIGludCBhcyB0eXBlIGZvciBvZmZzZXQsIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgbmVnYXRpdmUgb2Zmc2V0cworICogLSBBc3NlcnRpbmcgb24gYmVpbmcgZW5hYmxlZC9wcmVzZW50IGlzIHN1cGVyZmx1b3VzLCBzaW5jZSBhIG5vbi16ZXJvIElGQl9sYWwgaW1wbGllcyB0aGF0IGhjZl9zZXJ2aWNlX25pYworICogICB3YXMgY2FsbGVkIGFuZCBkZXRlY3RlZCBhIFJ4LW1lc3NhZ2UuIEEgemVybyBJRkJfbGFsIHdpbGwgc2V0IHRoZSBCVUZfQ05UIGZpZWxkIG9mIGF0IGxlYXN0IHRoZSBmaXJzdAorICogICBkZXNjcmlwdG9yIHRvIHplcm8uCisgKgorICouRU5ERE9DICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGludAogaGNmX3Jjdl9tc2coIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AsIHVuc2lnbmVkIGludCBvZmZzZXQgKQogewotaW50CQkJcmMgPSBIQ0ZfU1VDQ0VTUzsKLXdjaV9idWZwCWNwOwkJCQkJCQkJCQkvL2NoYXIgb3JpZW50ZWQgd29ya2luZyBwb2ludGVyCi1oY2ZfMTYJCWk7Ci1pbnQJCQl0b3RfbGVuID0gaWZicC0+SUZCX1J4TGVuIC0gb2Zmc2V0OwkJLy90b3RhbCBsZW5ndGgKLXdjaV9idWZwCWxhcCA9IGlmYnAtPklGQl9sYXAgKyBvZmZzZXQ7CQkJLy9zdGFydCBhZGRyZXNzIGluIExvb2tBaGVhZCBCdWZmZXIKLWhjZl8xNgkJbGFsID0gaWZicC0+SUZCX2xhbCAtIG9mZnNldDsJCQkvL2F2YWlsYWJsZSBkYXRhIHdpdGhpbiBMb29rQWhlYWQgQnVmZmVyCi1oY2ZfMTYJCWo7CisJaW50ICAgICAgICAgcmMgPSBIQ0ZfU1VDQ0VTUzsKKwl3Y2lfYnVmcCAgICBjcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jaGFyIG9yaWVudGVkIHdvcmtpbmcgcG9pbnRlcgorCWhjZl8xNiAgICAgIGk7CisJaW50ICAgICAgICAgdG90X2xlbiA9IGlmYnAtPklGQl9SeExlbiAtIG9mZnNldDsgICAgIC8vdG90YWwgbGVuZ3RoCisJd2NpX2J1ZnAgICAgbGFwID0gaWZicC0+SUZCX2xhcCArIG9mZnNldDsgICAgICAgICAgIC8vc3RhcnQgYWRkcmVzcyBpbiBMb29rQWhlYWQgQnVmZmVyCisJaGNmXzE2ICAgICAgbGFsID0gaWZicC0+SUZCX2xhbCAtIG9mZnNldDsgICAgICAgICAgIC8vYXZhaWxhYmxlIGRhdGEgd2l0aGluIExvb2tBaGVhZCBCdWZmZXIKKwloY2ZfMTYgICAgICBqOwogCi0JSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9SQ1ZfTVNHLCBvZmZzZXQgKQotCUhDRkFTU0VSVCggaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQywgaWZicC0+SUZCX01hZ2ljICkKLQlIQ0ZBU1NFUlRfSU5UCi0JSENGQVNTRVJUKCBkZXNjcCwgSENGX1RSQUNFX1JDVl9NU0cgKQotCUhDRkFTU0VSVCggaWZicC0+SUZCX1J4TGVuLCBIQ0ZfVFJBQ0VfUkNWX01TRyApCi0JSENGQVNTRVJUKCBpZmJwLT5JRkJfUnhMZW4gPj0gb2Zmc2V0LCBNRVJHRV8yKCBvZmZzZXQsIGlmYnAtPklGQl9SeExlbiApICkKLQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9sYWwgPj0gb2Zmc2V0LCBvZmZzZXQgKQotCUhDRkFTU0VSVCggKGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSkgPT0gMCwgMHhEQURBICkKKwlIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX1JDVl9NU0csIG9mZnNldCApOworCUhDRkFTU0VSVCggaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQywgaWZicC0+SUZCX01hZ2ljICk7CisJSENGQVNTRVJUX0lOVDsKKwlIQ0ZBU1NFUlQoIGRlc2NwLCBIQ0ZfVFJBQ0VfUkNWX01TRyApOworCUhDRkFTU0VSVCggaWZicC0+SUZCX1J4TGVuLCBIQ0ZfVFJBQ0VfUkNWX01TRyApOworCUhDRkFTU0VSVCggaWZicC0+SUZCX1J4TGVuID49IG9mZnNldCwgTUVSR0VfMiggb2Zmc2V0LCBpZmJwLT5JRkJfUnhMZW4gKSApOworCUhDRkFTU0VSVCggaWZicC0+SUZCX2xhbCA+PSBvZmZzZXQsIG9mZnNldCApOworCUhDRkFTU0VSVCggKGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSkgPT0gMCwgMHhEQURBICk7CiAKIAlpZiAoIHRvdF9sZW4gPCAwICkgewotCQlsYWwgPSAwOyB0b3RfbGVuID0gMDsJCQkJLy9zdXBwcmVzcyBhbGwgY29weWluZyBhY3Rpdml0eSBpbiB0aGUgZG8tLXdoaWxlIGxvb3AKKwkJbGFsID0gMDsgdG90X2xlbiA9IDA7ICAgICAgICAgICAgICAgLy9zdXBwcmVzcyBhbGwgY29weWluZyBhY3Rpdml0eSBpbiB0aGUgZG8tLXdoaWxlIGxvb3AKIAl9Ci0JZG8gewkJCQkJCQkJCS8vbG9vcCBvdmVyIGFsbCBhdmFpbGFibGUgZnJhZ21lbnRzCisJZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbG9vcCBvdmVyIGFsbCBhdmFpbGFibGUgZnJhZ21lbnRzCiAJCS8vIG9ibm94aW91cyBoY2YuYygxNDgwKSA6IHdhcm5pbmcgQzQ3Njk6IGNvbnZlcnNpb24gb2YgbmVhciBwb2ludGVyIHRvIGxvbmcgaW50ZWdlcgotCQlIQ0ZBU1NFUlQoICgoaGNmXzMyKWRlc2NwICYgMyApID09IDAsIChoY2ZfMzIpZGVzY3AgKQorCQlIQ0ZBU1NFUlQoICgoaGNmXzMyKWRlc2NwICYgMyApID09IDAsIChoY2ZfMzIpZGVzY3AgKTsKIAkJY3AgPSBkZXNjcC0+YnVmX2FkZHI7Ci0JCWogPSBtaW4oIChoY2ZfMTYpdG90X2xlbiwgZGVzY3AtPkJVRl9TSVpFICk7CS8vbWluaW11bSBvZiAid2hhdCdzYCBhdmFpbGFibGUiIGFuZCBmcmFnbWVudCBzaXplCisJCWogPSBtaW4oIChoY2ZfMTYpdG90X2xlbiwgZGVzY3AtPkJVRl9TSVpFICk7ICAgIC8vbWluaW11bSBvZiAid2hhdCdzYCBhdmFpbGFibGUiIGFuZCBmcmFnbWVudCBzaXplCiAJCWRlc2NwLT5CVUZfQ05UID0gajsKLQkJdG90X2xlbiAtPSBqOwkJCQkJCS8vYWRqdXN0IGxlbmd0aCBzdGlsbCB0byBnbwotCQlpZiAoIGxhbCApIHsJCQkJCQkvL2lmIGxvb2thaGVhZCBCdWZmZXIgbm90IHlldCBjb21wbGV0ZWx5IGNvcGllZAotCQkJaSA9IG1pbiggbGFsLCBqICk7CQkJCS8vbWluaW11bSBvZiAid2hhdCdzIGF2YWlsYWJsZSIgaW4gTG9va0FoZWFkIGFuZCBmcmFnbWVudCBzaXplCi0JCQlsYWwgLT0gaTsJCQkJCQkvL2FkanVzdCBsZW5ndGggc3RpbGwgYXZhaWxhYmxlIGluIExvb2tBaGVhZAotCQkJaiAtPSBpOwkJCQkJCQkvL2FkanVzdCBsZW5ndGggc3RpbGwgYXZhaWxhYmxlIGluIGN1cnJlbnQgZnJhZ21lbnQKKwkJdG90X2xlbiAtPSBqOyAgICAgICAgICAgICAgICAgICAgICAgLy9hZGp1c3QgbGVuZ3RoIHN0aWxsIHRvIGdvCisJCWlmICggbGFsICkgeyAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgbG9va2FoZWFkIEJ1ZmZlciBub3QgeWV0IGNvbXBsZXRlbHkgY29waWVkCisJCQlpID0gbWluKCBsYWwsIGogKTsgICAgICAgICAgICAgIC8vbWluaW11bSBvZiAid2hhdCdzIGF2YWlsYWJsZSIgaW4gTG9va0FoZWFkIGFuZCBmcmFnbWVudCBzaXplCisJCQlsYWwgLT0gaTsgICAgICAgICAgICAgICAgICAgICAgIC8vYWRqdXN0IGxlbmd0aCBzdGlsbCBhdmFpbGFibGUgaW4gTG9va0FoZWFkCisJCQlqIC09IGk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vYWRqdXN0IGxlbmd0aCBzdGlsbCBhdmFpbGFibGUgaW4gY3VycmVudCBmcmFnbWVudAogCQkJLyo7PyB3aGlsZSBsb29wIGNvdWxkIGJlIGltcHJvdmVkIGJ5IG1vdmluZyB3b3JkcyBidXQgdGhhdCBpcyBjb21wbGljYXRlZCBvbiBwbGF0Zm9ybXMgd2l0aAogCQkJICogYWxpZ25tZW50IHJlcXVpcmVtZW50cyovCiAJCQl3aGlsZSAoIGktLSApICpjcCsrID0gKmxhcCsrOwogCQl9Ci0JCWlmICggaiApIHsJLy9pZiBMb29rQWhlYWQgQnVmZmVyIGV4aGF1c3RlZCBidXQgc3RpbGwgc3BhY2UgaW4gZnJhZ21lbnQsIGNvcHkgZGlyZWN0bHkgZnJvbSBOSUMgUkFNCisJCWlmICggaiApIHsgIC8vaWYgTG9va0FoZWFkIEJ1ZmZlciBleGhhdXN0ZWQgYnV0IHN0aWxsIHNwYWNlIGluIGZyYWdtZW50LCBjb3B5IGRpcmVjdGx5IGZyb20gTklDIFJBTQogCQkJZ2V0X2ZyYWcoIGlmYnAsIGNwLCBqIEJFX1BBUigwKSApOwogCQkJQ0FMQ19SWF9NSUMoIGNwLCBqICk7CiAJCX0KIAl9IHdoaWxlICggKCBkZXNjcCA9IGRlc2NwLT5uZXh0X2Rlc2NfYWRkciApICE9IE5VTEwgKTsKICNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCiAJaWYgKCBpZmJwLT5JRkJfUnhGSUQgKSB7Ci0JCXJjID0gY2hlY2tfbWljKCBpZmJwICk7CQkJCS8vcHJldmVudHMgTUlDIGVycm9yIHJlcG9ydCBpZiBoY2Zfc2VydmljZV9uaWMgYWxyZWFkeSBjb25zdW1lZCBhbGwKKwkJcmMgPSBjaGVja19taWMoIGlmYnAgKTsgICAgICAgICAgICAgLy9wcmV2ZW50cyBNSUMgZXJyb3IgcmVwb3J0IGlmIGhjZl9zZXJ2aWNlX25pYyBhbHJlYWR5IGNvbnN1bWVkIGFsbAogCX0KICNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKLQkodm9pZCloY2ZfYWN0aW9uKCBpZmJwLCBIQ0ZfQUNUX1JYX0FDSyApOwkJLy9vbmx5IDEgc2hvdCB0byBnZXQgdGhlIGRhdGEsIHNvIGZyZWUgdGhlIHJlc291cmNlcyBpbiB0aGUgTklDCi0JSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKQotCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9SQ1ZfTVNHICkKKwkodm9pZCloY2ZfYWN0aW9uKCBpZmJwLCBIQ0ZfQUNUX1JYX0FDSyApOyAgICAgICAvL29ubHkgMSBzaG90IHRvIGdldCB0aGUgZGF0YSwgc28gZnJlZSB0aGUgcmVzb3VyY2VzIGluIHRoZSBOSUMKKwlIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyApOworCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9SQ1ZfTVNHICk7CiAJcmV0dXJuIHJjOwogfSAvLyBoY2ZfcmN2X21zZwotI2VuZGlmIC8vIEhDRl9ETF9PTkxZCiAKIAotI2lmIChIQ0ZfRExfT05MWSkgPT0gMAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKi5NT0RVTEUJCWludCBoY2Zfc2VuZF9tc2coIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AsIGhjZl8xNiB0eF9jbnRsICkKLSouUFVSUE9TRQkJRW5jYXBzdWxhdGUgYSBtZXNzYWdlIGFuZCBhcHBlbmQgcGFkZGluZyBhbmQgTUlDLgotKgkJCQlub24tVVNCOiBUcmFuc2ZlcnMgdGhlIHJlc3VsdGluZyBtZXNzYWdlIGZyb20gSG9zdCB0byBOSUMgYW5kIGluaXRpYXRlcyB0cmFuc21pc3Npb24uCi0qCQkJCVVTQjogVHJhbnNmZXIgcmVzdWx0aW5nIG1lc3NhZ2UgaW50byBhIGZsYXQgYnVmZmVyLgotKgotKi5BUkdVTUVOVFMKLSoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCi0qCWRlc2NwCQlwb2ludGVyIHRvIHRoZSBEZXNjcmlwdG9yTGlzdCBvciBOVUxMCi0qCXR4X2NudGwJCWluZGljYXRlcyBNQUMtcG9ydCBhbmQgKEhlcm1lcykgb3B0aW9ucwotKgkJCQkJSEZTX1RYX0NOVExfU1BFQ1RSQUxJTksKLSoJCQkJCUhGU19UWF9DTlRMX1BSSU8KLSoJCQkJCUhGU19UWF9DTlRMX1RYX09LCi0qCQkJCQlIRlNfVFhfQ05UTF9UWF9FWAotKgkJCQkJSEZTX1RYX0NOVExfVFhfREVMQVkKLSoJCQkJCUhGU19UWF9DTlRMX1RYX0NPTlQKLSoJCQkJCUhDRl9QT1JUXzAJCQkJIE1BQyBQb3J0IDAgKGRlZmF1bHQpCi0qCQkJCQlIQ0ZfUE9SVF8xIChBUCBvbmx5KQkgTUFDIFBvcnQgMQotKgkJCQkJSENGX1BPUlRfMiAoQVAgb25seSkJIE1BQyBQb3J0IDIKLSoJCQkJCUhDRl9QT1JUXzMgKEFQIG9ubHkpCSBNQUMgUG9ydCAzCi0qCQkJCQlIQ0ZfUE9SVF80IChBUCBvbmx5KQkgTUFDIFBvcnQgNAotKgkJCQkJSENGX1BPUlRfNSAoQVAgb25seSkJIE1BQyBQb3J0IDUKLSoJCQkJCUhDRl9QT1JUXzYgKEFQIG9ubHkpCSBNQUMgUG9ydCA2Ci0qCi0qLlJFVFVSTlMKLSoJSENGX1NVQ0NFU1MKLSoJSENGX0VSUl9ERUZVTkNUXy4uCi0qCUhDRl9FUlJfVElNRV9PVVQKLSoKLSouREVTQ1JJUFRJT046Ci0qIFRoZSBTZW5kIE1lc3NhZ2UgRnVuY3Rpb24gZW1ib2RpZXMgMiBmdW5jdGlvbnM6Ci0qIG8gdHJhbnNmZXJzIGEgbWVzc2FnZSAoaW5jbHVkaW5nIE1BQyBoZWFkZXIpIGZyb20gdGhlIHByb3ZpZGVkIGJ1ZmZlciBzdHJ1Y3R1cmUgaW4gSG9zdCBtZW1vcnkgdG8gdGhlIFRyYW5zbWl0Ci0qIEZyYW1lIFN0cnVjdHVyZSAoVHhGUykgaW4gTklDIG1lbW9yeS4KLSogbyBJc3N1ZSBhIHNlbmQgY29tbWFuZCB0byB0aGUgRi9XIHRvIGFjdHVhbGx5IHRyYW5zbWl0IHRoZSBjb250ZW50cyBvZiB0aGUgVHhGUy4KLSoKLSogQ29udHJvbCBpcyBiYXNlZCBvbiB0aGUgUmVzb3VyY2UgSW5kaWNhdG9yIElGQl9Sc2NJbmQuCi0qIFRoZSBSZXNvdXJjZSBJbmRpY2F0b3IgaXMgbWFpbnRhaW5lZCBieSB0aGUgSENGIGFuZCBzaG91bGQgb25seSBiZSBpbnRlcnByZXRlZCBidXQgbm90IGNoYW5nZWQgYnkgdGhlIE1TRi4KLSogVGhlIE1TRiBtdXN0IGNoZWNrIElGQl9Sc2NJbmQgdG8gYmUgbm9uLXplcm8gYmVmb3JlIGV4ZWN1dGluZyB0aGUgY2FsbCB0byB0aGUgU2VuZCBNZXNzYWdlIEZ1bmN0aW9uLgotKiBXaGVuIG5vIHJlc291cmNlcyBhcmUgYXZhaWxhYmxlLCB0aGUgTVNGIG11c3QgaGFuZGxlIHRoZSBxdWV1aW5nIG9mIHRoZSBUcmFuc21pdCBmcmFtZSBhbmQgY2hlY2sgdGhlCi0qIFJlc291cmNlIEluZGljYXRvciBwZXJpb2RpY2FsbHkgYWZ0ZXIgY2FsbGluZyBoY2Zfc2VydmljZV9uaWMuCi0qCi0qIFRoZSBTZW5kIE1lc3NhZ2UgRnVuY3Rpb25zIHRyYW5zZmVycyBhIG1lc3NhZ2UgdG8gTklDIG1lbW9yeSB3aGVuIGl0IGlzIGNhbGxlZCB3aXRoIGEgbm9uLU5VTEwgZGVzY3AuCi0qIEJlZm9yZSB0aGUgU2VuZCBNZXNzYWdlIEZ1bmN0aW9uIGlzIGludm9rZWQgdGhpcyB3YXksIHRoZSBSZXNvdXJjZSBJbmRpY2F0b3IgKElGQl9Sc2NJbmQpIG11c3QgYmUgY2hlY2tlZC4KLSogSWYgdGhlIFJlc291cmNlIGlzIG5vdCBhdmFpbGFibGUsIFNlbmQgTWVzc2FnZSBGdW5jdGlvbiBleGVjdXRpb24gbXVzdCBiZSBwb3N0cG9uZWQgdW50aWwgYWZ0ZXIgcHJvY2Vzc2luZyBvZgotKiBhIG5leHQgaGNmX3NlcnZpY2VfbmljIGl0IGFwcGVhcnMgdGhhdCB0aGUgUmVzb3VyY2UgaGFzIGJlY29tZSBhdmFpbGFibGUuCi0qIFRoZSBtZXNzYWdlIGlzIGNvcGllZCBmcm9tIHRoZSBidWZmZXIgc3RydWN0dXJlIGlkZW50aWZpZWQgYnkgZGVzY3AgdG8gdGhlIE5JQy4KLSogQ29weWluZyBzdG9wcyBpZiBhIE5VTEwgcG9pbnRlciBpbiB0aGUgbmV4dF9kZXNjX2FkZHIgZmllbGQgaXMgcmVhY2hlZC4KLSogSGNmX3NlbmRfbXNnIGRvZXMgbm90IGNoZWNrIGZvciB0cmFuc21pdCBidWZmZXIgb3ZlcmZsb3csIGJlY2F1c2UgdGhlIEYvVyBkb2VzIHRoaXMgcHJvdGVjdGlvbi4KLSogSW4gY2FzZSBvZiBhIHRyYW5zbWl0IGJ1ZmZlciBvdmVyZmxvdywgdGhlIHN1cnBsdXMgd2hpY2ggZG9lcyBub3QgZml0IGluIHRoZSBidWZmZXIgaXMgc2ltcGx5IGRyb3BwZWQuCi0qCi0qIFRoZSBTZW5kIE1lc3NhZ2UgRnVuY3Rpb24gYWN0aXZhdGVzIHRoZSBGL1cgdG8gYWN0dWFsbHkgc2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgbWVkaXVtIHdoZW4gdGhlCi0qIEhGU19UWF9DTlRMX1RYX0RFTEFZIGJpdCBvZiB0aGUgdHhfY250bCBwYXJhbWV0ZXIgaXMgbm90IHNldC4KLSogSWYgdGhlIGRlc2NwIHBhcmFtZXRlciBvZiB0aGUgY3VycmVudCBjYWxsIGlzIG5vbi1OVUxMLCB0aGUgbWVzc2FnZSBhcyByZXByZXNlbnRlZCBieSBkZXNjcCBpcyBzZW5kLgotKiBJZiB0aGUgZGVzY3AgcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGNhbGwgaXMgTlVMTCwgYW5kIGlmIHRoZSBwcmVjZWRpbmcgY2FsbCBvZiB0aGUgU2VuZCBNZXNzYWdlIEZ1bmN0aW9uIGhhZAotKiBhIG5vbi1OVUxMIGRlc2NwIGFuZCB0aGUgcHJlY2VkaW5nIGNhbGwgaGFkIHRoZSBIRlNfVFhfQ05UTF9UWF9ERUxBWSBiaXQgb2YgdHhfY250bCBzZXQsIHRoZW4gdGhlIG1lc3NhZ2UgYXMKLSogcmVwcmVzZW50ZWQgYnkgdGhlIGRlc2NwIG9mIHRoZSBwcmVjZWRpbmcgY2FsbCBpcyBzZW5kLgotKgotKiBIY2Zfc2VuZF9tc2cgc3VwcG9ydHMgZW5jYXBzdWxhdGlvbiAoc2VlIEhDRl9FTkNBUCkgb2YgRXRoZXJuZXQtSUkgZnJhbWVzLgotKiBBbiBFdGhlcm5ldC1JSSBmcmFtZSBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgVHJhbnNtaXQgRnJhbWUgc3RydWN0dXJlIGFzIGFuIDgwMi4zIGZyYW1lLgotKiBIY2Zfc2VuZF9tc2cgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFuIDgwMi4zIGFuZCBhbiBFdGhlcm5ldC1JSSBmcmFtZSBieSBsb29raW5nIGF0IHRoZSBkYXRhIGxlbmd0aC90eXBlIGZpZWxkCi0qIG9mIHRoZSBmcmFtZS4gSWYgdGhpcyBmaWVsZCBjb250YWlucyBhIHZhbHVlIGxhcmdlciB0aGFuIDE1MTQsIHRoZSBmcmFtZSBpcyBjb25zaWRlcmVkIHRvIGJlIGFuIEV0aGVybmV0LUlJCi0qIGZyYW1lLCBvdGhlcndpc2UgaXQgaXMgdHJlYXRlZCBhcyBhbiA4MDIuMyBmcmFtZS4KLSogVG8gZWFzZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSENGLCB0aGlzIHR5cGUvdHlwZSBmaWVsZCBtdXN0IGJlIGxvY2F0ZWQgaW4gdGhlIGZpcnN0IGRlc2NyaXB0b3Igc3RydWN0dXJlLAotKiBpLmUuIHRoZSAxc3QgZnJhZ21lbnQgbXVzdCBoYXZlIGEgc2l6ZSBvZiBhdCBsZWFzdCAxNCAodG8gY29udGFpbiBEZXN0QWRkciwgU3JjQWRkciBhbmQgTGVuL1R5cGUgZmllbGQpLgotKiBBbiBFdGhlcm5ldC1JSSBmcmFtZSBpcyBlbmNhcHN1bGF0ZWQgYnkgaW5zZXJ0aW5nIGEgU05BUCBoZWFkZXIgYmV0d2VlbiB0aGUgYWRkcmVzc2luZyBpbmZvcm1hdGlvbiBhbmQgdGhlCi0qIHR5cGUgZmllbGQuICBUaGlzIGluc2VydGlvbiBpcyB0cmFuc3BhcmVudCBmb3IgdGhlIE1TRi4KLSogVGhlIEhDRiBjb250YWlucyBhIGZpeGVkIHRhYmxlIHRoYXQgc3RvcmVzIGEgbnVtYmVyIG9mIHR5cGVzLiBJZiB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IHRoZSB0eXBlL3R5cGUgZmllbGQKLSogb2NjdXJzIGluIHRoaXMgdGFibGUsIEJyaWRnZSBUdW5uZWwgRW5jYXBzdWxhdGlvbiBpcyB1c2VkLCBvdGhlcndpc2UgUkZDMTA0MiBlbmNhcHN1bGF0aW9uIGlzIHVzZWQuCi0qIEJyaWRnZSBUdW5uZWwgdXNlcwlBQSBBQSAwMyAwMCAwMCBGOCBhcyBTTkFQIGhlYWRlciwKLSogUkZDMTA0MiB1c2VzCUFBIEFBIDAzIDAwIDAwIDAwIGFzIFNOQVAgaGVhZGVyLgotKiBUaGUgdGFibGUgY3VycmVudGx5IGNvbnRhaW5zOgotKiAwIDB4ODBGMwlBcHBsZVRhbGsgQWRkcmVzcyBSZXNvbHV0aW9uIFByb3RvY29sIChBQVJQKQotKiAwIDB4ODEzNwlJUFgKLSoKLSogVGhlIGFsZ29yaXRobSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIDgwMi4zIGFuZCBFdGhlcm5ldC1JSSBmcmFtZXMgbGltaXRzIHRoZSBtYXhpbXVtIGxlbmd0aCBmb3IgZnJhbWVzIG9mCi0qIDgwMi4zIGZyYW1lcyB0byAxNTE0IGJ5dGVzLgotKiBFbmNhcHN1bGF0aW9uIGNhbiBiZSBzdXBwcmVzc2VkIGJ5IG1lYW5zIG9mIHRoZSBzeXN0ZW0gY29uc3RhbnQgSENGX0VOQ0FQLCBlLmcuIHRvIHN1cHBvcnQgcHJvcHJpZXRhcnkKLSogcHJvdG9jb2xzIHdpdGggODAyLjMgbGlrZSBmcmFtZXMgd2l0aCBhIHNpemUgbGFyZ2VyIHRoYW4gMTUxNCBieXRlcy4KLSoKLSogSW4gY2FzZSB0aGUgSENGIGVuY2Fwc3VsYXRlcyB0aGUgZnJhbWUsIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBpcyBhY3R1YWxseSB0cmFuc21pdHRlZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZQotKiBjdW11bGF0aXZlIHZhbHVlIG9mIHRoZSBidWZfY250bC5idWZfZGltWzBdIGZpZWxkcy4KLSogSW4gY2FzZSB0aGUgSENGIGRvZXMgbm90IGVuY2Fwc3VsYXRlIHRoZSBmcmFtZSwgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGlzIGFjdHVhbGx5IHRyYW5zbWl0dGVkIGlzIG5vdAotKiBkZXRlcm1pbmVkIGJ5IHRoZSBjdW11bGF0aXZlIHZhbHVlIG9mIHRoZSBidWZfY250bC5idWZfZGltW0RFU0NfQ05UTF9DTlRdIGZpZWxkcyBvZiB0aGUgZGVzY19zdHJjdCdzIGJ1dCBieQotKiB0aGUgTGVuZ3RoIGZpZWxkIG9mIHRoZSA4MDIuMyBmcmFtZS4KLSogSWYgdGhlcmUgaXMgYSBjb25mbGljdCBiZXR3ZWVuIHRoZSBjdW11bGF0aXZlIHZhbHVlIG9mIHRoZSBidWZfY250bC5idWZfZGltWzBdIGZpZWxkcyBhbmQgdGhlCi0qIDgwMi4zIExlbmd0aCBmaWVsZCB0aGUgODAyLjMgTGVuZ3RoIGZpZWxkIGRldGVybWluZXMgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSB0cmFuc21pdHRlZCBieSB0aGUgTklDIHdoaWxlCi0qIHRoZSBjdW11bGF0aXZlIHZhbHVlIG9mIHRoZSBidWZfY250bC5idWZfZGltWzBdIGZpZWxkcyBkZXRlcm1pbmVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgTUlDLCBoZW5jZSBhIG1pc21hdGNoCi0qIHdpbGwgcmVzdWx0IGluIE1JQyBlcnJvcnMgb24gdGhlIFJlY2VpdmluZyBzaWRlLgotKiBDdXJyZW50bHkgdGhpcyBwcm9ibGVtIGlzIGZsYWdnZWQgb24gdGhlIFRyYW5zbWl0IHNpZGUgYnkgYW4gQXNzZXJ0LgotKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBvZiBlYWNoIG9mIHRoZSBkZXNjcmlwdG9ycyBpbiB0aGUgZGVzY3JpcHRvciBsaXN0IG11c3QgYmUgc2V0IGJ5IHRoZSBNU0Y6Ci0qIG8gYnVmX2NudGwuYnVmX2RpbVswXQotKiBvICpuZXh0X2Rlc2NfYWRkcgotKiBvICpidWZfYWRkcgotKgotKiBBbGwgYml0cyBvZiB0aGUgdHhfY250bCBwYXJhbWV0ZXIgZXhjZXB0IEhGU19UWF9DTlRMX1RYX0RFTEFZIGFuZCB0aGUgSENGX1BPUlQjIGJpdHMgYXJlIHBhc3NlZCB0byB0aGUgRi9XIHZpYQotKiB0aGUgSEZTX1RYX0NOVEwgZmllbGQgb2YgdGhlIFR4RlMuCi0qCi0qIE5vdGUgdGhhdCBoY2Zfc2VuZF9tc2cgZG9lcyBub3QgZGV0ZWN0IE5JQyBhYnNlbmNlLiAgVGhlIE1TRiBpcyBzdXBwb3NlZCB0byBoYXZlIGl0cyBvd24gLXBsYXRmb3JtIGRlcGVuZGVudC0KLSogd2F5IHRvIHJlY29nbml6ZSBjYXJkIHJlbW92YWwvaW5zZXJ0aW9uLgotKiBUaGUgdG90YWwgc3lzdGVtIG11c3QgYmUgcm9idXN0IGFnYWluc3QgY2FyZCByZW1vdmFsIGFuZCB0aGVyZSBpcyBubyBwcmluY2lwYWwgZGlmZmVyZW5jZSBiZXR3ZWVuIGNhcmQgcmVtb3ZhbAotKiBqdXN0IGFmdGVyIGhjZl9zZW5kX21zZyByZXR1cm5zIGJ1dCBiZWZvcmUgdGhlIGFjdHVhbCB0cmFuc21pc3Npb24gdG9vayBwbGFjZSBvciBzb21ldGltZSBlYXJsaWVyLgotKgotKiBBc3NlcnQgZmFpbHMgaWYKLSogLSBpZmJwIGhhcyBhIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUKLSogLSBkZXNjcCBpcyBhIE5VTEwgcG9pbnRlcgotKiAtIG5vIHJlc291cmNlcyBmb3IgUElGIGF2YWlsYWJsZS4KLSogLSBJbnRlcnJ1cHRzIGFyZSBlbmFibGVkLgotKiAtIHJlZW50cmFuY3ksIG1heSBiZSAgY2F1c2VkIGJ5IGNhbGxpbmcgaGNmX2Z1bmN0aW9ucyB3aXRob3V0IGFkZXF1YXRlIHByb3RlY3Rpb24KLSoJYWdhaW5zdCBOSUMgaW50ZXJydXB0cyBvciBtdWx0aS10aHJlYWRpbmcuCi0qCi0qLkRJQUdSQU0KLSo0Oglmb3IgdGhlIG5vcm1hbCBjYXNlIChpLmUuIG5vIEhGU19UWF9DTlRMX1RYX0RFTEFZIG9wdGlvbiBhY3RpdmUpLCBhIGZpZCBpcyBhY3F1aXJlZCB2aWEgdGhlCi0qCXJvdXRpbmUgZ2V0X2ZpZC4gIElmIG5vIEZJRCBpcyBhY3F1aXJlZCwgdGhlIHJlbWFpbmRlciBpcyBza2lwcGVkIHdpdGhvdXQgYW4gZXJyb3Igbm90aWZpY2F0aW9uLiAgQWZ0ZXIKLSoJYWxsLCB0aGUgTVNGIGlzIG5vdCBzdXBwb3NlZCB0byBjYWxsIGhjZl9zZW5kX21zZyB3aGVuIG5vIFJlc291cmNlIGlzIGF2YWlsYWJsZS4KLSo3OglUaGUgQ29udHJvbEZpZWxkIG9mIHRoZSBUeEZTIGlzIHdyaXR0ZW4uICBTaW5jZSBwdXRfZnJhZyBjYW4gb25seSByZXR1cm4gdGhlIGZhdGFsIERlZnVuY3Qgb3IgIk5vIE5JQyIsIHRoZQotKglyZXR1cm4gc3RhdHVzIGNhbiBiZSBpZ25vcmVkIGJlY2F1c2Ugd2hlbiBpdCBmYWlscywgY21kX3dhaXQgd2lsbCBmYWlsIGFzIHdlbGwuICAoc2VlIGFsc28gdGhlIG5vdGUgb24gdGhlCi0qCW5lZWQgZm9yIGEgcmV0dXJuIGNvZGUgYmVsb3cpLgotKglOb3RlIHRoYXQgSEZTX1RYX0NOVEwgaGFzIGRpZmZlcmVudCB2YWx1ZXMgZm9yIEgtSSwgSC1JL1NTTiBhbmQgSC1JSSBhbmQgSEZTX0FERFJfREVTVCBoYXMgZGlmZmVyZW50Ci0qCXZhbHVlcyBmb3IgSC1JIChyZWdhcmRsZXNzIG9mIFNTTikgYW5kIEgtSUkuCi0qCUJ5IHdyaXRpbmcgMTcsIDEgb3IgMiAoIGltcGx5aW5nIDE2LCAwIG9yIDEgZ2FyYmFnZSB3b3JkIGFmdGVyIEhGU19UWF9DTlRMKSB0aGUgQkFQIGp1c3QgZ2V0cyB0bwotKglIRlNfQUREUl9ERVNUIGZvciBILUksIEgtSS9TU04gYW5kIEgtSUkgcmVzcGVjdGl2ZWx5LgotKjEwOiBpZiBuZWl0aGVyIGVuY2Fwc3VsYXRpb24gbm9yIE1JQyBjYWxjdWxhdGlvbiBpcyBuZWVkZWQsIHNwbGl0dGluZyB0aGUgZmlyc3QgZnJhZ21lbnQgaW4gdHdvIGRvZXMgbm90Ci0qCXJlYWxseSBoZWxwIGJ1dCBpdCBtYWtlcyB0aGUgZmxvdyBlYXNpZXIgdG8gZm9sbG93IHRvIGRvIG5vdCBvcHRpbWl6ZSBvbiB0aGlzIGRpZmZlcmVuY2UKLSoKLSoJaGNmX3NlbmRfbXNnIGNoZWNrcyB3aGV0aGVyIHRoZSBmcmFtZSBpcyBhbiBFdGhlcm5ldC1JSSByYXRoZXIgdGhhbiBhbiAib2ZmaWNpYWwiIDgwMi4zIGZyYW1lLgotKglUaGUgRS1JSSBjaGVjayBpcyBiYXNlZCBvbiB0aGUgbGVuZ3RoL3R5cGUgZmllbGQgaW4gdGhlIE1BQyBoZWFkZXIuIElmIHRoaXMgZmllbGQgaGFzIGEgdmFsdWUgbGFyZ2VyIHRoYW4KLSoJMTUwMCwgRS1JSSBpcyBhc3N1bWVkLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyB0ZXN0IGZhaWxzIGlmIHRoZSBsZW5ndGgvdHlwZSBmaWVsZCBpcyBub3QgaW4gdGhlIGZpcnN0Ci0qCWRlc2NyaXB0b3IuICBJZiBFLUlJIGlzIHJlY29nbml6ZWQsIGEgU05BUCBoZWFkZXIgaXMgaW5zZXJ0ZWQuIFRoaXMgU05BUCBoZWFkZXIgcmVwcmVzZW50cyBlaXRoZXIgUkZDMTA0MgotKglvciBCcmlkZ2UtVHVubmVsIGVuY2Fwc3VsYXRpb24sIGRlcGVuZGluZyBvbiB0aGUgcmV0dXJuIHN0YXR1cyBvZiB0aGUgc3VwcG9ydCByb3V0aW5lIGhjZl9lbmNhcC4KLSoKLSouTk9USUNFCi0qCWhjZl9zZW5kX21zZyBsZWF2ZXMgdGhlIHJlc3BvbnNpYmlsaXR5IHRvIG9ubHkgc2VuZCBtZXNzYWdlcyBvbiBlbmFibGVkIHBvcnRzIGF0IHRoZSBNU0YgbGV2ZWwuCi0qCVRoaXMgaXMgY29uc2lkZXJlZCB0aGUgc3RyYXRlZ3kgd2hpY2ggaXMgc3VmZmljaWVudGx5IGFkZXF1YXRlIGZvciBhbGwgInJvYnVzdCIgTVNGcywgaGF2ZSB0aGUgbGVhc3QKLSoJcHJvY2Vzc29yIHV0aWxpemF0aW9uIGFuZCBiZWluZyBzdGlsbCBhY2NlcHRhYmxlIHJvYnVzdCBhdCB0aGUgV0NJICEhISEhCi0qCi0qCWhjZl9zZW5kX21zZyBkb2VzIG5vdCBORUVEIGEgcmV0dXJuIHZhbHVlIHRvIHJlcG9ydCBOSUMgYWJzZW5jZSBvciByZW1vdmFsIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mCi0qCWhjZl9zZW5kX21zZygpLCBiZWNhdXNlIHRoZSBNU0YgYW5kIGhpZ2hlciBsYXllcnMgbXVzdCBiZSBhYmxlIHRvIGNvcGUgYW55d2F5IHdpdGggdGhlIE5JQyBiZWluZyByZW1vdmVkCi0qCWFmdGVyIGEgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIGhjZl9zZW5kX21zZygpIGJ1dCBiZWZvcmUgdGhlIGFjdHVhbCB0cmFuc21pc3Npb24gdG9vayBwbGFjZS4KLSoJVG8gYWNjb21tb2RhdGUgdXNlciBleHBlY3RhdGlvbnMgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyByZXBvcnQgTklDIGFic2VuY2UuCi0qCURlZnVuY3QgYmxvY2tzIGFsbCBOSUMgYWNjZXNzIGFuZCB3aWxsIChhbHNvKSBiZSByZXBvcnRlZCBvbiBhIG51bWJlciBvZiBvdGhlciBjYWxscy4KLSoKLSoJaGNmX3NlbmRfbXNnIGRvZXMgbm90IGNoZWNrIGZvciB0cmFuc21pdCBidWZmZXIgb3ZlcmZsb3cgYmVjYXVzZSB0aGUgSGVybWVzIGRvZXMgdGhpcyBwcm90ZWN0aW9uLgotKglJbiBjYXNlIG9mIGEgdHJhbnNtaXQgYnVmZmVyIG92ZXJmbG93LCB0aGUgc3VycGx1cyB3aGljaCBkb2VzIG5vdCBmaXQgaW4gdGhlIGJ1ZmZlciBpcyBzaW1wbHkgZHJvcHBlZC4KLSoJTm90ZSB0aGF0IHRoaXMgcG9zc2libHkgcmVzdWx0cyBpbiB0aGUgdHJhbnNtaXNzaW9uIG9mIGluY29tcGxldGUgZnJhbWVzLgotKgotKglBZnRlciBzb21lIGRlbGliZXJhdGlvbiB3aXRoIEYvVyB0ZWFtLCBpdCBpcyBkZWNpZGVkIHRoYXQgLSBiZWluZyBpbiB0aGUgdHdpbGlnaHQgem9uZSBvZiBub3Qga25vd2luZwotKgl3aGV0aGVyIHRoZSBwcm9ibGVtIGF0IGhhbmQgaXMgYW4gTVNGIGJ1ZywgSENGIGJ1ZiwgRi9XIGJ1ZywgSC9XIG1hbGZ1bmN0aW9uIG9yIGV2ZW4gc29tZXRoaW5nIGVsc2UgLSB0aGVyZQotKglpcyBubyAiYmVzdCB0aGluZyB0byBkbyIgaW4gY2FzZSBvZiBhIGZhaWxpbmcgc2VuZCwgaGVuY2UgdGhlIEhDRiBjb25zaWRlcnMgdGhlIFR4RklEIG93bmVyc2hpcCB0byBiZSB0YWtlbgotKglvdmVyIGJ5IHRoZSBGL1cgYW5kIGhvcGVzIGZvciBhbiBBbGxvY2F0ZSBldmVudCBpbiBkdWUgdGltZQotKgotKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqCisgKi5NT0RVTEUgICAgICAgIGludCBoY2Zfc2VuZF9tc2coIElGQlAgaWZicCwgREVTQ19TVFJDVCAqZGVzY3AsIGhjZl8xNiB0eF9jbnRsICkKKyAqLlBVUlBPU0UgICAgICAgRW5jYXBzdWxhdGUgYSBtZXNzYWdlIGFuZCBhcHBlbmQgcGFkZGluZyBhbmQgTUlDLgorICogICAgICAgICAgICAgICBub24tVVNCOiBUcmFuc2ZlcnMgdGhlIHJlc3VsdGluZyBtZXNzYWdlIGZyb20gSG9zdCB0byBOSUMgYW5kIGluaXRpYXRlcyB0cmFuc21pc3Npb24uCisgKiAgICAgICAgICAgICAgIFVTQjogVHJhbnNmZXIgcmVzdWx0aW5nIG1lc3NhZ2UgaW50byBhIGZsYXQgYnVmZmVyLgorICoKKyAqLkFSR1VNRU5UUworICogICBpZmJwICAgICAgICBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyAqICAgZGVzY3AgICAgICAgcG9pbnRlciB0byB0aGUgRGVzY3JpcHRvckxpc3Qgb3IgTlVMTAorICogICB0eF9jbnRsICAgICBpbmRpY2F0ZXMgTUFDLXBvcnQgYW5kIChIZXJtZXMpIG9wdGlvbnMKKyAqICAgICAgICAgICAgICAgICAgIEhGU19UWF9DTlRMX1NQRUNUUkFMSU5LCisgKiAgICAgICAgICAgICAgICAgICBIRlNfVFhfQ05UTF9QUklPCisgKiAgICAgICAgICAgICAgICAgICBIRlNfVFhfQ05UTF9UWF9PSworICogICAgICAgICAgICAgICAgICAgSEZTX1RYX0NOVExfVFhfRVgKKyAqICAgICAgICAgICAgICAgICAgIEhGU19UWF9DTlRMX1RYX0RFTEFZCisgKiAgICAgICAgICAgICAgICAgICBIRlNfVFhfQ05UTF9UWF9DT05UCisgKiAgICAgICAgICAgICAgICAgICBIQ0ZfUE9SVF8wICAgICAgICAgICAgICAgTUFDIFBvcnQgMCAoZGVmYXVsdCkKKyAqICAgICAgICAgICAgICAgICAgIEhDRl9QT1JUXzEgKEFQIG9ubHkpICAgICBNQUMgUG9ydCAxCisgKiAgICAgICAgICAgICAgICAgICBIQ0ZfUE9SVF8yIChBUCBvbmx5KSAgICAgTUFDIFBvcnQgMgorICogICAgICAgICAgICAgICAgICAgSENGX1BPUlRfMyAoQVAgb25seSkgICAgIE1BQyBQb3J0IDMKKyAqICAgICAgICAgICAgICAgICAgIEhDRl9QT1JUXzQgKEFQIG9ubHkpICAgICBNQUMgUG9ydCA0CisgKiAgICAgICAgICAgICAgICAgICBIQ0ZfUE9SVF81IChBUCBvbmx5KSAgICAgTUFDIFBvcnQgNQorICogICAgICAgICAgICAgICAgICAgSENGX1BPUlRfNiAoQVAgb25seSkgICAgIE1BQyBQb3J0IDYKKyAqCisgKi5SRVRVUk5TCisgKiAgIEhDRl9TVUNDRVNTCisgKiAgIEhDRl9FUlJfREVGVU5DVF8uLgorICogICBIQ0ZfRVJSX1RJTUVfT1VUCisgKgorICouREVTQ1JJUFRJT046CisgKiBUaGUgU2VuZCBNZXNzYWdlIEZ1bmN0aW9uIGVtYm9kaWVzIDIgZnVuY3Rpb25zOgorICogbyB0cmFuc2ZlcnMgYSBtZXNzYWdlIChpbmNsdWRpbmcgTUFDIGhlYWRlcikgZnJvbSB0aGUgcHJvdmlkZWQgYnVmZmVyIHN0cnVjdHVyZSBpbiBIb3N0IG1lbW9yeSB0byB0aGUgVHJhbnNtaXQKKyAqIEZyYW1lIFN0cnVjdHVyZSAoVHhGUykgaW4gTklDIG1lbW9yeS4KKyAqIG8gSXNzdWUgYSBzZW5kIGNvbW1hbmQgdG8gdGhlIEYvVyB0byBhY3R1YWxseSB0cmFuc21pdCB0aGUgY29udGVudHMgb2YgdGhlIFR4RlMuCisgKgorICogQ29udHJvbCBpcyBiYXNlZCBvbiB0aGUgUmVzb3VyY2UgSW5kaWNhdG9yIElGQl9Sc2NJbmQuCisgKiBUaGUgUmVzb3VyY2UgSW5kaWNhdG9yIGlzIG1haW50YWluZWQgYnkgdGhlIEhDRiBhbmQgc2hvdWxkIG9ubHkgYmUgaW50ZXJwcmV0ZWQgYnV0IG5vdCBjaGFuZ2VkIGJ5IHRoZSBNU0YuCisgKiBUaGUgTVNGIG11c3QgY2hlY2sgSUZCX1JzY0luZCB0byBiZSBub24temVybyBiZWZvcmUgZXhlY3V0aW5nIHRoZSBjYWxsIHRvIHRoZSBTZW5kIE1lc3NhZ2UgRnVuY3Rpb24uCisgKiBXaGVuIG5vIHJlc291cmNlcyBhcmUgYXZhaWxhYmxlLCB0aGUgTVNGIG11c3QgaGFuZGxlIHRoZSBxdWV1aW5nIG9mIHRoZSBUcmFuc21pdCBmcmFtZSBhbmQgY2hlY2sgdGhlCisgKiBSZXNvdXJjZSBJbmRpY2F0b3IgcGVyaW9kaWNhbGx5IGFmdGVyIGNhbGxpbmcgaGNmX3NlcnZpY2VfbmljLgorICoKKyAqIFRoZSBTZW5kIE1lc3NhZ2UgRnVuY3Rpb25zIHRyYW5zZmVycyBhIG1lc3NhZ2UgdG8gTklDIG1lbW9yeSB3aGVuIGl0IGlzIGNhbGxlZCB3aXRoIGEgbm9uLU5VTEwgZGVzY3AuCisgKiBCZWZvcmUgdGhlIFNlbmQgTWVzc2FnZSBGdW5jdGlvbiBpcyBpbnZva2VkIHRoaXMgd2F5LCB0aGUgUmVzb3VyY2UgSW5kaWNhdG9yIChJRkJfUnNjSW5kKSBtdXN0IGJlIGNoZWNrZWQuCisgKiBJZiB0aGUgUmVzb3VyY2UgaXMgbm90IGF2YWlsYWJsZSwgU2VuZCBNZXNzYWdlIEZ1bmN0aW9uIGV4ZWN1dGlvbiBtdXN0IGJlIHBvc3Rwb25lZCB1bnRpbCBhZnRlciBwcm9jZXNzaW5nIG9mCisgKiBhIG5leHQgaGNmX3NlcnZpY2VfbmljIGl0IGFwcGVhcnMgdGhhdCB0aGUgUmVzb3VyY2UgaGFzIGJlY29tZSBhdmFpbGFibGUuCisgKiBUaGUgbWVzc2FnZSBpcyBjb3BpZWQgZnJvbSB0aGUgYnVmZmVyIHN0cnVjdHVyZSBpZGVudGlmaWVkIGJ5IGRlc2NwIHRvIHRoZSBOSUMuCisgKiBDb3B5aW5nIHN0b3BzIGlmIGEgTlVMTCBwb2ludGVyIGluIHRoZSBuZXh0X2Rlc2NfYWRkciBmaWVsZCBpcyByZWFjaGVkLgorICogSGNmX3NlbmRfbXNnIGRvZXMgbm90IGNoZWNrIGZvciB0cmFuc21pdCBidWZmZXIgb3ZlcmZsb3csIGJlY2F1c2UgdGhlIEYvVyBkb2VzIHRoaXMgcHJvdGVjdGlvbi4KKyAqIEluIGNhc2Ugb2YgYSB0cmFuc21pdCBidWZmZXIgb3ZlcmZsb3csIHRoZSBzdXJwbHVzIHdoaWNoIGRvZXMgbm90IGZpdCBpbiB0aGUgYnVmZmVyIGlzIHNpbXBseSBkcm9wcGVkLgorICoKKyAqIFRoZSBTZW5kIE1lc3NhZ2UgRnVuY3Rpb24gYWN0aXZhdGVzIHRoZSBGL1cgdG8gYWN0dWFsbHkgc2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgbWVkaXVtIHdoZW4gdGhlCisgKiBIRlNfVFhfQ05UTF9UWF9ERUxBWSBiaXQgb2YgdGhlIHR4X2NudGwgcGFyYW1ldGVyIGlzIG5vdCBzZXQuCisgKiBJZiB0aGUgZGVzY3AgcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGNhbGwgaXMgbm9uLU5VTEwsIHRoZSBtZXNzYWdlIGFzIHJlcHJlc2VudGVkIGJ5IGRlc2NwIGlzIHNlbmQuCisgKiBJZiB0aGUgZGVzY3AgcGFyYW1ldGVyIG9mIHRoZSBjdXJyZW50IGNhbGwgaXMgTlVMTCwgYW5kIGlmIHRoZSBwcmVjZWRpbmcgY2FsbCBvZiB0aGUgU2VuZCBNZXNzYWdlIEZ1bmN0aW9uIGhhZAorICogYSBub24tTlVMTCBkZXNjcCBhbmQgdGhlIHByZWNlZGluZyBjYWxsIGhhZCB0aGUgSEZTX1RYX0NOVExfVFhfREVMQVkgYml0IG9mIHR4X2NudGwgc2V0LCB0aGVuIHRoZSBtZXNzYWdlIGFzCisgKiByZXByZXNlbnRlZCBieSB0aGUgZGVzY3Agb2YgdGhlIHByZWNlZGluZyBjYWxsIGlzIHNlbmQuCisgKgorICogSGNmX3NlbmRfbXNnIHN1cHBvcnRzIGVuY2Fwc3VsYXRpb24gKHNlZSBIQ0ZfRU5DQVApIG9mIEV0aGVybmV0LUlJIGZyYW1lcy4KKyAqIEFuIEV0aGVybmV0LUlJIGZyYW1lIGlzIHRyYW5zZmVycmVkIHRvIHRoZSBUcmFuc21pdCBGcmFtZSBzdHJ1Y3R1cmUgYXMgYW4gODAyLjMgZnJhbWUuCisgKiBIY2Zfc2VuZF9tc2cgZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFuIDgwMi4zIGFuZCBhbiBFdGhlcm5ldC1JSSBmcmFtZSBieSBsb29raW5nIGF0IHRoZSBkYXRhIGxlbmd0aC90eXBlIGZpZWxkCisgKiBvZiB0aGUgZnJhbWUuIElmIHRoaXMgZmllbGQgY29udGFpbnMgYSB2YWx1ZSBsYXJnZXIgdGhhbiAxNTE0LCB0aGUgZnJhbWUgaXMgY29uc2lkZXJlZCB0byBiZSBhbiBFdGhlcm5ldC1JSQorICogZnJhbWUsIG90aGVyd2lzZSBpdCBpcyB0cmVhdGVkIGFzIGFuIDgwMi4zIGZyYW1lLgorICogVG8gZWFzZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSENGLCB0aGlzIHR5cGUvdHlwZSBmaWVsZCBtdXN0IGJlIGxvY2F0ZWQgaW4gdGhlIGZpcnN0IGRlc2NyaXB0b3Igc3RydWN0dXJlLAorICogaS5lLiB0aGUgMXN0IGZyYWdtZW50IG11c3QgaGF2ZSBhIHNpemUgb2YgYXQgbGVhc3QgMTQgKHRvIGNvbnRhaW4gRGVzdEFkZHIsIFNyY0FkZHIgYW5kIExlbi9UeXBlIGZpZWxkKS4KKyAqIEFuIEV0aGVybmV0LUlJIGZyYW1lIGlzIGVuY2Fwc3VsYXRlZCBieSBpbnNlcnRpbmcgYSBTTkFQIGhlYWRlciBiZXR3ZWVuIHRoZSBhZGRyZXNzaW5nIGluZm9ybWF0aW9uIGFuZCB0aGUKKyAqIHR5cGUgZmllbGQuICBUaGlzIGluc2VydGlvbiBpcyB0cmFuc3BhcmVudCBmb3IgdGhlIE1TRi4KKyAqIFRoZSBIQ0YgY29udGFpbnMgYSBmaXhlZCB0YWJsZSB0aGF0IHN0b3JlcyBhIG51bWJlciBvZiB0eXBlcy4gSWYgdGhlIHZhbHVlIHNwZWNpZmllZCBieSB0aGUgdHlwZS90eXBlIGZpZWxkCisgKiBvY2N1cnMgaW4gdGhpcyB0YWJsZSwgQnJpZGdlIFR1bm5lbCBFbmNhcHN1bGF0aW9uIGlzIHVzZWQsIG90aGVyd2lzZSBSRkMxMDQyIGVuY2Fwc3VsYXRpb24gaXMgdXNlZC4KKyAqIEJyaWRnZSBUdW5uZWwgdXNlcyAgICBBQSBBQSAwMyAwMCAwMCBGOCBhcyBTTkFQIGhlYWRlciwKKyAqIFJGQzEwNDIgdXNlcyAgQUEgQUEgMDMgMDAgMDAgMDAgYXMgU05BUCBoZWFkZXIuCisgKiBUaGUgdGFibGUgY3VycmVudGx5IGNvbnRhaW5zOgorICogMCAweDgwRjMgIEFwcGxlVGFsayBBZGRyZXNzIFJlc29sdXRpb24gUHJvdG9jb2wgKEFBUlApCisgKiAwIDB4ODEzNyAgSVBYCisgKgorICogVGhlIGFsZ29yaXRobSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIDgwMi4zIGFuZCBFdGhlcm5ldC1JSSBmcmFtZXMgbGltaXRzIHRoZSBtYXhpbXVtIGxlbmd0aCBmb3IgZnJhbWVzIG9mCisgKiA4MDIuMyBmcmFtZXMgdG8gMTUxNCBieXRlcy4KKyAqIEVuY2Fwc3VsYXRpb24gY2FuIGJlIHN1cHByZXNzZWQgYnkgbWVhbnMgb2YgdGhlIHN5c3RlbSBjb25zdGFudCBIQ0ZfRU5DQVAsIGUuZy4gdG8gc3VwcG9ydCBwcm9wcmlldGFyeQorICogcHJvdG9jb2xzIHdpdGggODAyLjMgbGlrZSBmcmFtZXMgd2l0aCBhIHNpemUgbGFyZ2VyIHRoYW4gMTUxNCBieXRlcy4KKyAqCisgKiBJbiBjYXNlIHRoZSBIQ0YgZW5jYXBzdWxhdGVzIHRoZSBmcmFtZSwgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGlzIGFjdHVhbGx5IHRyYW5zbWl0dGVkIGlzIGRldGVybWluZWQgYnkgdGhlCisgKiBjdW11bGF0aXZlIHZhbHVlIG9mIHRoZSBidWZfY250bC5idWZfZGltWzBdIGZpZWxkcy4KKyAqIEluIGNhc2UgdGhlIEhDRiBkb2VzIG5vdCBlbmNhcHN1bGF0ZSB0aGUgZnJhbWUsIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBpcyBhY3R1YWxseSB0cmFuc21pdHRlZCBpcyBub3QKKyAqIGRldGVybWluZWQgYnkgdGhlIGN1bXVsYXRpdmUgdmFsdWUgb2YgdGhlIGJ1Zl9jbnRsLmJ1Zl9kaW1bREVTQ19DTlRMX0NOVF0gZmllbGRzIG9mIHRoZSBkZXNjX3N0cmN0J3MgYnV0IGJ5CisgKiB0aGUgTGVuZ3RoIGZpZWxkIG9mIHRoZSA4MDIuMyBmcmFtZS4KKyAqIElmIHRoZXJlIGlzIGEgY29uZmxpY3QgYmV0d2VlbiB0aGUgY3VtdWxhdGl2ZSB2YWx1ZSBvZiB0aGUgYnVmX2NudGwuYnVmX2RpbVswXSBmaWVsZHMgYW5kIHRoZQorICogODAyLjMgTGVuZ3RoIGZpZWxkIHRoZSA4MDIuMyBMZW5ndGggZmllbGQgZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHRyYW5zbWl0dGVkIGJ5IHRoZSBOSUMgd2hpbGUKKyAqIHRoZSBjdW11bGF0aXZlIHZhbHVlIG9mIHRoZSBidWZfY250bC5idWZfZGltWzBdIGZpZWxkcyBkZXRlcm1pbmVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgTUlDLCBoZW5jZSBhIG1pc21hdGNoCisgKiB3aWxsIHJlc3VsdCBpbiBNSUMgZXJyb3JzIG9uIHRoZSBSZWNlaXZpbmcgc2lkZS4KKyAqIEN1cnJlbnRseSB0aGlzIHByb2JsZW0gaXMgZmxhZ2dlZCBvbiB0aGUgVHJhbnNtaXQgc2lkZSBieSBhbiBBc3NlcnQuCisgKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBvZiBlYWNoIG9mIHRoZSBkZXNjcmlwdG9ycyBpbiB0aGUgZGVzY3JpcHRvciBsaXN0IG11c3QgYmUgc2V0IGJ5IHRoZSBNU0Y6CisgKiBvIGJ1Zl9jbnRsLmJ1Zl9kaW1bMF0KKyAqIG8gKm5leHRfZGVzY19hZGRyCisgKiBvICpidWZfYWRkcgorICoKKyAqIEFsbCBiaXRzIG9mIHRoZSB0eF9jbnRsIHBhcmFtZXRlciBleGNlcHQgSEZTX1RYX0NOVExfVFhfREVMQVkgYW5kIHRoZSBIQ0ZfUE9SVCMgYml0cyBhcmUgcGFzc2VkIHRvIHRoZSBGL1cgdmlhCisgKiB0aGUgSEZTX1RYX0NOVEwgZmllbGQgb2YgdGhlIFR4RlMuCisgKgorICogTm90ZSB0aGF0IGhjZl9zZW5kX21zZyBkb2VzIG5vdCBkZXRlY3QgTklDIGFic2VuY2UuICBUaGUgTVNGIGlzIHN1cHBvc2VkIHRvIGhhdmUgaXRzIG93biAtcGxhdGZvcm0gZGVwZW5kZW50LQorICogd2F5IHRvIHJlY29nbml6ZSBjYXJkIHJlbW92YWwvaW5zZXJ0aW9uLgorICogVGhlIHRvdGFsIHN5c3RlbSBtdXN0IGJlIHJvYnVzdCBhZ2FpbnN0IGNhcmQgcmVtb3ZhbCBhbmQgdGhlcmUgaXMgbm8gcHJpbmNpcGFsIGRpZmZlcmVuY2UgYmV0d2VlbiBjYXJkIHJlbW92YWwKKyAqIGp1c3QgYWZ0ZXIgaGNmX3NlbmRfbXNnIHJldHVybnMgYnV0IGJlZm9yZSB0aGUgYWN0dWFsIHRyYW5zbWlzc2lvbiB0b29rIHBsYWNlIG9yIHNvbWV0aW1lIGVhcmxpZXIuCisgKgorICogQXNzZXJ0IGZhaWxzIGlmCisgKiAtIGlmYnAgaGFzIGEgcmVjb2duaXphYmxlIG91dC1vZi1yYW5nZSB2YWx1ZQorICogLSBkZXNjcCBpcyBhIE5VTEwgcG9pbnRlcgorICogLSBubyByZXNvdXJjZXMgZm9yIFBJRiBhdmFpbGFibGUuCisgKiAtIEludGVycnVwdHMgYXJlIGVuYWJsZWQuCisgKiAtIHJlZW50cmFuY3ksIG1heSBiZSAgY2F1c2VkIGJ5IGNhbGxpbmcgaGNmX2Z1bmN0aW9ucyB3aXRob3V0IGFkZXF1YXRlIHByb3RlY3Rpb24KKyAqICAgYWdhaW5zdCBOSUMgaW50ZXJydXB0cyBvciBtdWx0aS10aHJlYWRpbmcuCisgKgorICouRElBR1JBTQorICo0OiBmb3IgdGhlIG5vcm1hbCBjYXNlIChpLmUuIG5vIEhGU19UWF9DTlRMX1RYX0RFTEFZIG9wdGlvbiBhY3RpdmUpLCBhIGZpZCBpcyBhY3F1aXJlZCB2aWEgdGhlCisgKiAgIHJvdXRpbmUgZ2V0X2ZpZC4gIElmIG5vIEZJRCBpcyBhY3F1aXJlZCwgdGhlIHJlbWFpbmRlciBpcyBza2lwcGVkIHdpdGhvdXQgYW4gZXJyb3Igbm90aWZpY2F0aW9uLiAgQWZ0ZXIKKyAqICAgYWxsLCB0aGUgTVNGIGlzIG5vdCBzdXBwb3NlZCB0byBjYWxsIGhjZl9zZW5kX21zZyB3aGVuIG5vIFJlc291cmNlIGlzIGF2YWlsYWJsZS4KKyAqNzogVGhlIENvbnRyb2xGaWVsZCBvZiB0aGUgVHhGUyBpcyB3cml0dGVuLiAgU2luY2UgcHV0X2ZyYWcgY2FuIG9ubHkgcmV0dXJuIHRoZSBmYXRhbCBEZWZ1bmN0IG9yICJObyBOSUMiLCB0aGUKKyAqICAgcmV0dXJuIHN0YXR1cyBjYW4gYmUgaWdub3JlZCBiZWNhdXNlIHdoZW4gaXQgZmFpbHMsIGNtZF93YWl0IHdpbGwgZmFpbCBhcyB3ZWxsLiAgKHNlZSBhbHNvIHRoZSBub3RlIG9uIHRoZQorICogICBuZWVkIGZvciBhIHJldHVybiBjb2RlIGJlbG93KS4KKyAqICAgTm90ZSB0aGF0IEhGU19UWF9DTlRMIGhhcyBkaWZmZXJlbnQgdmFsdWVzIGZvciBILUksIEgtSS9XUEEgYW5kIEgtSUkgYW5kIEhGU19BRERSX0RFU1QgaGFzIGRpZmZlcmVudAorICogICB2YWx1ZXMgZm9yIEgtSSAocmVnYXJkbGVzcyBvZiBXUEEpIGFuZCBILUlJLgorICogICBCeSB3cml0aW5nIDE3LCAxIG9yIDIgKCBpbXBseWluZyAxNiwgMCBvciAxIGdhcmJhZ2Ugd29yZCBhZnRlciBIRlNfVFhfQ05UTCkgdGhlIEJBUCBqdXN0IGdldHMgdG8KKyAqICAgSEZTX0FERFJfREVTVCBmb3IgSC1JLCBILUkvV1BBIGFuZCBILUlJIHJlc3BlY3RpdmVseS4KKyAqMTA6IGlmIG5laXRoZXIgZW5jYXBzdWxhdGlvbiBub3IgTUlDIGNhbGN1bGF0aW9uIGlzIG5lZWRlZCwgc3BsaXR0aW5nIHRoZSBmaXJzdCBmcmFnbWVudCBpbiB0d28gZG9lcyBub3QKKyAqICAgcmVhbGx5IGhlbHAgYnV0IGl0IG1ha2VzIHRoZSBmbG93IGVhc2llciB0byBmb2xsb3cgdG8gZG8gbm90IG9wdGltaXplIG9uIHRoaXMgZGlmZmVyZW5jZQorICoKKyAqICAgaGNmX3NlbmRfbXNnIGNoZWNrcyB3aGV0aGVyIHRoZSBmcmFtZSBpcyBhbiBFdGhlcm5ldC1JSSByYXRoZXIgdGhhbiBhbiAib2ZmaWNpYWwiIDgwMi4zIGZyYW1lLgorICogICBUaGUgRS1JSSBjaGVjayBpcyBiYXNlZCBvbiB0aGUgbGVuZ3RoL3R5cGUgZmllbGQgaW4gdGhlIE1BQyBoZWFkZXIuIElmIHRoaXMgZmllbGQgaGFzIGEgdmFsdWUgbGFyZ2VyIHRoYW4KKyAqICAgMTUwMCwgRS1JSSBpcyBhc3N1bWVkLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyB0ZXN0IGZhaWxzIGlmIHRoZSBsZW5ndGgvdHlwZSBmaWVsZCBpcyBub3QgaW4gdGhlIGZpcnN0CisgKiAgIGRlc2NyaXB0b3IuICBJZiBFLUlJIGlzIHJlY29nbml6ZWQsIGEgU05BUCBoZWFkZXIgaXMgaW5zZXJ0ZWQuIFRoaXMgU05BUCBoZWFkZXIgcmVwcmVzZW50cyBlaXRoZXIgUkZDMTA0MgorICogICBvciBCcmlkZ2UtVHVubmVsIGVuY2Fwc3VsYXRpb24sIGRlcGVuZGluZyBvbiB0aGUgcmV0dXJuIHN0YXR1cyBvZiB0aGUgc3VwcG9ydCByb3V0aW5lIGhjZl9lbmNhcC4KKyAqCisgKi5OT1RJQ0UKKyAqICAgaGNmX3NlbmRfbXNnIGxlYXZlcyB0aGUgcmVzcG9uc2liaWxpdHkgdG8gb25seSBzZW5kIG1lc3NhZ2VzIG9uIGVuYWJsZWQgcG9ydHMgYXQgdGhlIE1TRiBsZXZlbC4KKyAqICAgVGhpcyBpcyBjb25zaWRlcmVkIHRoZSBzdHJhdGVneSB3aGljaCBpcyBzdWZmaWNpZW50bHkgYWRlcXVhdGUgZm9yIGFsbCAicm9idXN0IiBNU0ZzLCBoYXZlIHRoZSBsZWFzdAorICogICBwcm9jZXNzb3IgdXRpbGl6YXRpb24gYW5kIGJlaW5nIHN0aWxsIGFjY2VwdGFibGUgcm9idXN0IGF0IHRoZSBXQ0kgISEhISEKKyAqCisgKiAgIGhjZl9zZW5kX21zZyBkb2VzIG5vdCBORUVEIGEgcmV0dXJuIHZhbHVlIHRvIHJlcG9ydCBOSUMgYWJzZW5jZSBvciByZW1vdmFsIGR1cmluZyB0aGUgZXhlY3V0aW9uIG9mCisgKiAgIGhjZl9zZW5kX21zZygpLCBiZWNhdXNlIHRoZSBNU0YgYW5kIGhpZ2hlciBsYXllcnMgbXVzdCBiZSBhYmxlIHRvIGNvcGUgYW55d2F5IHdpdGggdGhlIE5JQyBiZWluZyByZW1vdmVkCisgKiAgIGFmdGVyIGEgc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mIGhjZl9zZW5kX21zZygpIGJ1dCBiZWZvcmUgdGhlIGFjdHVhbCB0cmFuc21pc3Npb24gdG9vayBwbGFjZS4KKyAqICAgVG8gYWNjb21tb2RhdGUgdXNlciBleHBlY3RhdGlvbnMgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyByZXBvcnQgTklDIGFic2VuY2UuCisgKiAgIERlZnVuY3QgYmxvY2tzIGFsbCBOSUMgYWNjZXNzIGFuZCB3aWxsIChhbHNvKSBiZSByZXBvcnRlZCBvbiBhIG51bWJlciBvZiBvdGhlciBjYWxscy4KKyAqCisgKiAgIGhjZl9zZW5kX21zZyBkb2VzIG5vdCBjaGVjayBmb3IgdHJhbnNtaXQgYnVmZmVyIG92ZXJmbG93IGJlY2F1c2UgdGhlIEhlcm1lcyBkb2VzIHRoaXMgcHJvdGVjdGlvbi4KKyAqICAgSW4gY2FzZSBvZiBhIHRyYW5zbWl0IGJ1ZmZlciBvdmVyZmxvdywgdGhlIHN1cnBsdXMgd2hpY2ggZG9lcyBub3QgZml0IGluIHRoZSBidWZmZXIgaXMgc2ltcGx5IGRyb3BwZWQuCisgKiAgIE5vdGUgdGhhdCB0aGlzIHBvc3NpYmx5IHJlc3VsdHMgaW4gdGhlIHRyYW5zbWlzc2lvbiBvZiBpbmNvbXBsZXRlIGZyYW1lcy4KKyAqCisgKiAgIEFmdGVyIHNvbWUgZGVsaWJlcmF0aW9uIHdpdGggRi9XIHRlYW0sIGl0IGlzIGRlY2lkZWQgdGhhdCAtIGJlaW5nIGluIHRoZSB0d2lsaWdodCB6b25lIG9mIG5vdCBrbm93aW5nCisgKiAgIHdoZXRoZXIgdGhlIHByb2JsZW0gYXQgaGFuZCBpcyBhbiBNU0YgYnVnLCBIQ0YgYnVmLCBGL1cgYnVnLCBIL1cgbWFsZnVuY3Rpb24gb3IgZXZlbiBzb21ldGhpbmcgZWxzZSAtIHRoZXJlCisgKiAgIGlzIG5vICJiZXN0IHRoaW5nIHRvIGRvIiBpbiBjYXNlIG9mIGEgZmFpbGluZyBzZW5kLCBoZW5jZSB0aGUgSENGIGNvbnNpZGVycyB0aGUgVHhGSUQgb3duZXJzaGlwIHRvIGJlIHRha2VuCisgKiAgIG92ZXIgYnkgdGhlIEYvVyBhbmQgaG9wZXMgZm9yIGFuIEFsbG9jYXRlIGV2ZW50IGluIGR1ZSB0aW1lCisgKgorICouRU5ERE9DICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIGludAogaGNmX3NlbmRfbXNnKCBJRkJQIGlmYnAsIERFU0NfU1RSQ1QgKmRlc2NwLCBoY2ZfMTYgdHhfY250bCApCiB7Ci1pbnQJCQlyYyA9IEhDRl9TVUNDRVNTOwotREVTQ19TVFJDVAkqcCAvKiA9IGRlc2NwKi87CQkvL3dvcmtpbmcgcG9pbnRlcgotaGNmXzE2CQlsZW47CQkJCQkvLyB0b3RhbCBieXRlIGNvdW50Ci1oY2ZfMTYJCWk7CisJaW50ICAgICAgICAgcmMgPSBIQ0ZfU1VDQ0VTUzsKKwlERVNDX1NUUkNUICAqcCAvKiA9IGRlc2NwKi87ICAgICAgICAvL3dvcmtpbmcgcG9pbnRlcgorCWhjZl8xNiAgICAgIGxlbjsgICAgICAgICAgICAgICAgICAgIC8vIHRvdGFsIGJ5dGUgY291bnQKKwloY2ZfMTYgICAgICBpOwogCi1oY2ZfMTYJCWZpZCA9IDA7CisJaGNmXzE2ICAgICAgZmlkID0gMDsKIAotCUhDRkFTU0VSVCggaWZicC0+SUZCX1JzY0luZCB8fCBkZXNjcCA9PSBOVUxMLCBpZmJwLT5JRkJfUnNjSW5kICkKLQlIQ0ZBU1NFUlQoIChpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEpID09IDAsIDB4REFEQiApCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfUnNjSW5kIHx8IGRlc2NwID09IE5VTEwsIGlmYnAtPklGQl9Sc2NJbmQgKTsKKwlIQ0ZBU1NFUlQoIChpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEpID09IDAsIDB4REFEQiApOwogCi0JSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9TRU5EX01TRywgdHhfY250bCApCi0JSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKQotCUhDRkFTU0VSVF9JTlQKKwlIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX1NFTkRfTVNHLCB0eF9jbnRsICk7CisJSENGQVNTRVJUKCBpZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDLCBpZmJwLT5JRkJfTWFnaWMgKTsKKwlIQ0ZBU1NFUlRfSU5UOwogCS8qIG9ibm94aW91cyBjOi9oY2YvaGNmLmMoMTQ4MCkgOiB3YXJuaW5nIEM0NzY5OiBjb252ZXJzaW9uIG9mIG5lYXIgcG9pbnRlciB0byBsb25nIGludGVnZXIsCiAJICogc28gc2tpcCAqLwotCUhDRkFTU0VSVCggKChoY2ZfMzIpZGVzY3AgJiAzICkgPT0gMCwgKGhjZl8zMilkZXNjcCApCisJSENGQVNTRVJUKCAoKGhjZl8zMilkZXNjcCAmIDMgKSA9PSAwLCAoaGNmXzMyKWRlc2NwICk7CiAjaWYgSENGX0FTU0VSVAotewlpbnQgeCA9IGlmYnAtPklGQl9GV0lkZW50aXR5LmNvbXBfaWQgPT0gQ09NUF9JRF9GV19BUCA/IHR4X2NudGwgJiB+SEZTX1RYX0NOVExfUE9SVCA6IHR4X2NudGw7Ci0JSENGQVNTRVJUKCAoeCAmIH5IQ0ZfVFhfQ05UTF9NQVNLICkgPT0gMCwgdHhfY250bCApCi19CisJeyAgIGludCB4ID0gaWZicC0+SUZCX0ZXSWRlbnRpdHkuY29tcF9pZCA9PSBDT01QX0lEX0ZXX0FQID8gdHhfY250bCAmIH5IRlNfVFhfQ05UTF9QT1JUIDogdHhfY250bDsKKwkJSENGQVNTRVJUKCAoeCAmIH5IQ0ZfVFhfQ05UTF9NQVNLICkgPT0gMCwgdHhfY250bCApOworCX0KICNlbmRpZiAvLyBIQ0ZfQVNTRVJUCiAKLQlpZiAoIGRlc2NwICkgaWZicC0+SUZCX1R4RklEID0gMDsJCQkJLy9jYW5jZWwgYSBwcmUtcHV0IG1lc3NhZ2UKKwlpZiAoIGRlc2NwICkgaWZicC0+SUZCX1R4RklEID0gMDsgICAgICAgICAgICAgICAvL2NhbmNlbCBhIHByZS1wdXQgbWVzc2FnZQogCi0jaWYgKEhDRl9FWFQpICYgSENGX0VYVF9UWF9DT05UCQkJCS8vIENvbnRpbnVvdXMgdHJhbnNtaXQgdGVzdAotCWlmICggdHhfY250bCA9PSBIRlNfVFhfQ05UTF9UWF9DT05UICkgewotCSAJZmlkID0gZ2V0X2ZpZChpZmJwKTsKLQkgCWlmIChmaWQgIT0gMCApIHsKLQkJCQkJCQkJCQkJLy9zZXR1cCBCQVAgdG8gYmVnaW4gb2YgVHhGUwotCQkJKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBmaWQsIDAsIElPX09VVCApOwotCQkJCQkJCQkJCQkvL2NvcHkgYWxsIHRoZSBmcmFnbWVudHMgaW4gYSB0cmFuc3BhcmVudCBmYXNoaW9uCi0JCSAJZm9yICggcCA9IGRlc2NwOyBwOyBwID0gcC0+bmV4dF9kZXNjX2FkZHIgKSB7Ci0JCQkvKiBvYm5veGlvdXMgd2FybmluZyBDNDc2OTogY29udmVyc2lvbiBvZiBuZWFyIHBvaW50ZXIgdG8gbG9uZyBpbnRlZ2VyICovCi0JCQkJSENGQVNTRVJUKCAoKGhjZl8zMilwICYgMyApID09IDAsIChoY2ZfMzIpcCApCi0JCQkJcHV0X2ZyYWcoIGlmYnAsIHAtPmJ1Zl9hZGRyLCBwLT5CVUZfQ05UIEJFX1BBUigwKSApOwotCQkJfQotCQkJcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX1RIRVNFVVMgfCBIQ01EX0JVU1kgfCBIQ01EX1NUQVJUUFJFQU1CTEUsIGZpZCApOwotCQkJaWYgKCBpZmJwLT5JRkJfUnNjSW5kID09IDAgKSB7Ci0JCQkJaWZicC0+SUZCX1JzY0luZCA9IGdldF9maWQoIGlmYnAgKTsKLQkJCX0KLQkJfQotCQkJCQkJCQkJCQkvLyBlZW4gc2xlY2h0IHZvb3JiZWVsZCBkb2V0IGdvZWQgdm9sZ2VuIDs/Ci0JCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9TRU5EX01TRyApCi0JCXJldHVybiByYzsKLQl9Ci0jZW5kaWYgLy8gSENGX0VYVF9UWF9DT05UCi0JCQkJCQkJCQkvKiB0aGUgZm9sbG93aW5nIGluaXRpYWxpemF0aW9uIGNvZGUgaXMgcmVkdW5kYW50IGZvciBhIHByZS1wdXQgbWVzc2FnZQotCQkJCQkJCQkJICogYnV0IG1vdmluZyBpdCBpbnNpZGUgdGhlICJpZiBmaWQiIGxvZ2ljIG1ha2VzIHRoZSBtZXJnaW5nIHdpdGggdGhlCi0JCQkJCQkJCQkgKiBVU0IgZmxvdyBhd2t3YXJkCi0JCQkJCQkJCQkgKi8KKwkvKiB0aGUgZm9sbG93aW5nIGluaXRpYWxpemF0aW9uIGNvZGUgaXMgcmVkdW5kYW50IGZvciBhIHByZS1wdXQgbWVzc2FnZQorCSAqIGJ1dCBtb3ZpbmcgaXQgaW5zaWRlIHRoZSAiaWYgZmlkIiBsb2dpYyBtYWtlcyB0aGUgbWVyZ2luZyB3aXRoIHRoZQorCSAqIFVTQiBmbG93IGF3a3dhcmQKKwkgKi8KICNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCiAJdHhfY250bCB8PSBpZmJwLT5JRkJfTUlDVHhDbnRsOwogI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQogCWZpZCA9IGlmYnAtPklGQl9UeEZJRDsKLQlpZiAoZmlkID09IDAgJiYgKCBmaWQgPSBnZXRfZmlkKCBpZmJwICkgKSAhPSAwICkgCQkvKiA0ICovCi0JCQkvKiBza2lwIHRoZSBuZXh0IGNvbXBvdW5kIHN0YXRlbWVudCBpZjoKLQkJCSAgIC0gcHJlLXB1dCBtZXNzYWdlIG9yCi0JCQkgICAtIG5vIGZpZCBhdmFpbGFibGUgKHdoaWNoIHNob3VsZCBuZXZlciBvY2N1ciBpZiB0aGUgTVNGIGFkaGVyZXMgdG8gdGhlIFdDSSkKLQkJCSAqLwotCXsJCS8vIHRvIG1hdGNoIHRoZSBjbG9zaW5nIGN1cmx5IGJyYWNrZXQgb2YgYWJvdmUgImlmIiBpbiBjYXNlIG9mIEhDRl9UWVBFX1VTQgotCQkJCQkJCQkJCQkvL2NhbGN1bGF0ZSB0b3RhbCBsZW5ndGggOz8gc3VwZXJmbHVvdXMgdW5sZXNzIENDWCBvciBFbmNhcHN1bGF0aW9uCisJaWYgKGZpZCA9PSAwICYmICggZmlkID0gZ2V0X2ZpZCggaWZicCApICkgIT0gMCApICAgICAgICAvKiA0ICovCisJCS8qIHNraXAgdGhlIG5leHQgY29tcG91bmQgc3RhdGVtZW50IGlmOgorCQkgICAtIHByZS1wdXQgbWVzc2FnZSBvcgorCQkgICAtIG5vIGZpZCBhdmFpbGFibGUgKHdoaWNoIHNob3VsZCBuZXZlciBvY2N1ciBpZiB0aGUgTVNGIGFkaGVyZXMgdG8gdGhlIFdDSSkKKwkJKi8KKwl7ICAgICAgIC8vIHRvIG1hdGNoIHRoZSBjbG9zaW5nIGN1cmx5IGJyYWNrZXQgb2YgYWJvdmUgImlmIiBpbiBjYXNlIG9mIEhDRl9UWVBFX1VTQgorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY2FsY3VsYXRlIHRvdGFsIGxlbmd0aCA7PyBzdXBlcmZsdW91cyB1bmxlc3MgQ0NYIG9yIEVuY2Fwc3VsYXRpb24KIAkJbGVuID0gMDsKIAkJcCA9IGRlc2NwOwogCQlkbyBsZW4gKz0gcC0+QlVGX0NOVDsgd2hpbGUgKCAoIHAgPSBwLT5uZXh0X2Rlc2NfYWRkciApICE9IE5VTEwgKTsKIAkJcCA9IGRlc2NwOwotLy87PwlIQ0ZBU1NFUlQoIGxlbiA8PSBIQ0ZfTUFYX01TRywgbGVuICkKLS8qNyovCSh2b2lkKXNldHVwX2JhcCggaWZicCwgZmlkLCBIRlNfVFhfQ05UTCwgSU9fT1VUICk7CisvLzs/CQlIQ0ZBU1NFUlQoIGxlbiA8PSBIQ0ZfTUFYX01TRywgbGVuICk7CisJLyo3Ki8gICAodm9pZClzZXR1cF9iYXAoIGlmYnAsIGZpZCwgSEZTX1RYX0NOVEwsIElPX09VVCApOwogI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9UWF9ERUxBWQotCQlIQ0ZBU1NFUlQoICggZGVzY3AgIT0gTlVMTCApIF4gKCB0eF9jbnRsICYgSEZTX1RYX0NOVExfVFhfREVMQVkgKSwgdHhfY250bCApCisJCUhDRkFTU0VSVCggKCBkZXNjcCAhPSBOVUxMICkgXiAoIHR4X2NudGwgJiBIRlNfVFhfQ05UTF9UWF9ERUxBWSApLCB0eF9jbnRsICk7CiAJCWlmICggdHhfY250bCAmIEhGU19UWF9DTlRMX1RYX0RFTEFZICkgewotCQkJdHhfY250bCAmPSB+SEZTX1RYX0NOVExfVFhfREVMQVk7CQkvLyEhSEZTX1RYX0NOVExfVFhfREVMQVkgbm8gbG9uZ2VyIGF2YWlsYWJsZQorCQkJdHhfY250bCAmPSB+SEZTX1RYX0NOVExfVFhfREVMQVk7ICAgICAgIC8vISFIRlNfVFhfQ05UTF9UWF9ERUxBWSBubyBsb25nZXIgYXZhaWxhYmxlCiAJCQlpZmJwLT5JRkJfVHhGSUQgPSBmaWQ7Ci0JCQlmaWQgPSAwOwkJCQkJCQkJLy8hIWZpZCBubyBsb25nZXIgYXZhaWxhYmxlLCBiZSBjYXJlZnVsIHdoZW4gbW9kaWZ5aW5nIGNvZGUKKwkJCWZpZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyEhZmlkIG5vIGxvbmdlciBhdmFpbGFibGUsIGJlIGNhcmVmdWwgd2hlbiBtb2RpZnlpbmcgY29kZQogCQl9CiAjZW5kaWYgLy8gSENGX1RZUEVfVFhfREVMQVkKIAkJT1BXKCBIUkVHX0RBVEFfMSwgdHhfY250bCApIDsKIAkJT1BXKCBIUkVHX0RBVEFfMSwgMCApOwotI2lmICEgKCAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYICkKLQkJSENGQVNTRVJUKCBwLT5CVUZfQ05UID49IDE0LCBwLT5CVUZfQ05UICkKLQkJCQkJCQkJCQkJLyogYXNzdW1lIERlc3RBZGRyL1NyY0FkZHIvTGVuL1R5cGUgQUxXQVlTIGNvbnRhaW5lZCBpbiAxc3QgZnJhZ21lbnQKLQkJCQkJCQkJCQkJICogb3RoZXJ3aXNlIGxpZmUgZ2V0cyB0b28gY3VtYmVyc29tZSBmb3IgTUlDIGFuZCBFbmNhcHN1bGF0aW9uICEhISEhISEhCi0JCWlmICggcC0+QlVGX0NOVCA+PSAxNCApIHsJYWx0ZXJuYXRpdmVseTogYWRkIGEgc2FmZXR5IGVzY2FwZSAhISEhISEhISEhISEgfQkqLwotI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAotCQlDQUxDX1RYX01JQyggTlVMTCwgLTEgKTsJCS8vaW5pdGlhbGl6ZSBNSUMKLS8qMTAqLwlwdXRfZnJhZyggaWZicCwgcC0+YnVmX2FkZHIsIEhDRl9EQVNBX1NJWkUgQkVfUEFSKDApICk7CS8vd3JpdGUgREEsIFNBIHdpdGggTUlDIGNhbGN1bGF0aW9uCi0JCUNBTENfVFhfTUlDKCBwLT5idWZfYWRkciwgSENGX0RBU0FfU0laRSApOwkJLy9NSUMgb3ZlciBEQSwgU0EKLQkJQ0FMQ19UWF9NSUMoIG51bGxfYWRkciwgNCApOwkJLy9NSUMgb3ZlciAodmlydHVhbCkgcHJpb3JpdHkgZmllbGQKLSNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYCi0JCS8vISFiZSBjYXJlZnVsIGRvIG5vdCB1c2UgcG9zaXRpdmUgdGVzdCBvbiBIQ0ZfQUNUX0NDWF9PRkYsIGJlY2F1c2UgSUZCX0NLSVBTdGF0IGlzIGluaXRpYWxseSAwCi0JCWlmKCggaWZicC0+SUZCX0NLSVBTdGF0ID09IEhDRl9BQ1RfQ0NYX09OICkgfHwKLSAgICAgICAgICAgKChHRVRfQlVGX0NOVChwKSA+PSAyMCApICAgJiYgKCBpZmJwLT5JRkJfQ0tJUFN0YXQgPT0gSENGX0FDVF9DQ1hfT0ZGICkgJiYKLSAgICAgICAgICAgIChwLT5idWZfYWRkclsxMl0gPT0gMHhBQSkgJiYgKHAtPmJ1Zl9hZGRyWzEzXSA9PSAweEFBKSAmJgotICAgICAgICAgICAgKHAtPmJ1Zl9hZGRyWzE0XSA9PSAweDAzKSAmJiAocC0+YnVmX2FkZHJbMTVdID09IDB4MDApICYmCi0gICAgICAgICAgICAocC0+YnVmX2FkZHJbMTZdID09IDB4NDApICYmIChwLT5idWZfYWRkclsxN10gPT0gMHg5NikgJiYKLSAgICAgICAgICAgIChwLT5idWZfYWRkclsxOF0gPT0gMHgwMCkgJiYgKHAtPmJ1Zl9hZGRyWzE5XSA9PSAweDAwKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGkgPSBIQ0ZfREFTQV9TSVpFOwogCi0gICAgICAgICAgICBPUFcoIEhSRUdfREFUQV8xLCBDTlZfU0hPUlRfVE9fQklHKCBsZW4gLSBpICkpOworCQlIQ0ZBU1NFUlQoIHAtPkJVRl9DTlQgPj0gMTQsIHAtPkJVRl9DTlQgKTsKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhc3N1bWUgRGVzdEFkZHIvU3JjQWRkci9MZW4vVHlwZSBBTFdBWVMgY29udGFpbmVkIGluIDFzdCBmcmFnbWVudAorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIG90aGVyd2lzZSBsaWZlIGdldHMgdG9vIGN1bWJlcnNvbWUgZm9yIE1JQyBhbmQgRW5jYXBzdWxhdGlvbiAhISEhISEhIQorCQkgaWYgKCBwLT5CVUZfQ05UID49IDE0ICkgeyAgIGFsdGVybmF0aXZlbHk6IGFkZCBhIHNhZmV0eSBlc2NhcGUgISEhISEhISEhISEhIH0gICAqLwogCi0gICAgICAgICAgICAvKiBuZWVkIHRvIHNlbmQgb3V0IHRoZSByZW1haW5kZXIgb2YgdGhlIGZyYWdtZW50ICovCi0JCQlwdXRfZnJhZyggaWZicCwgJnAtPmJ1Zl9hZGRyW2ldLCBHRVRfQlVGX0NOVChwKSAtIGkgQkVfUEFSKDApICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotI2VuZGlmIC8vIEhDRl9UWVBFX0NDWAotCQl7Ci0JCQkJCQkJCQkJCS8vaWYgZW5jYXBzdWxhdGlvbiBuZWVkZWQKKwkJQ0FMQ19UWF9NSUMoIE5VTEwsIC0xICk7ICAgICAgICAvL2luaXRpYWxpemUgTUlDCisJLyoxMCovICBwdXRfZnJhZyggaWZicCwgcC0+YnVmX2FkZHIsIEhDRl9EQVNBX1NJWkUgQkVfUEFSKDApICk7IC8vd3JpdGUgREEsIFNBIHdpdGggTUlDIGNhbGN1bGF0aW9uCisJCUNBTENfVFhfTUlDKCBwLT5idWZfYWRkciwgSENGX0RBU0FfU0laRSApOyAgICAgIC8vTUlDIG92ZXIgREEsIFNBCisJCUNBTENfVFhfTUlDKCBudWxsX2FkZHIsIDQgKTsgICAgICAgIC8vTUlDIG92ZXIgKHZpcnR1YWwpIHByaW9yaXR5IGZpZWxkCisKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgZW5jYXBzdWxhdGlvbiBuZWVkZWQKICNpZiAoSENGX0VOQ0FQKSA9PSBIQ0ZfRU5DCi0JCQkJCQkJCQkJCS8vd3JpdGUgbGVuZ3RoICh3aXRoIFNOQVAtaGVhZGVyLFR5cGUsIHdpdGhvdXQgLy9EQSxTQSxMZW5ndGggKSBubyBNSUMgY2FsYy4KLQkJCWlmICggKCBzbmFwX2hlYWRlcltzaXplb2Yoc25hcF9oZWFkZXIpLTFdID0gaGNmX2VuY2FwKCAmcC0+YnVmX2FkZHJbSENGX0RBU0FfU0laRV0gKSApICE9IEVOQ19OT05FICkgewotCQkJCU9QVyggSFJFR19EQVRBXzEsIENOVl9FTkRfU0hPUlQoIGxlbiArIChzaXplb2Yoc25hcF9oZWFkZXIpICsgMikgLSAoIDIqNiArIDIgKSApICk7Ci0JCQkJCQkJCQkJCS8vd3JpdGUgc3BsaWNlIHdpdGggTUlDIGNhbGN1bGF0aW9uCi0JCQkJcHV0X2ZyYWcoIGlmYnAsIHNuYXBfaGVhZGVyLCBzaXplb2Yoc25hcF9oZWFkZXIpIEJFX1BBUigwKSApOwotCQkJCUNBTENfVFhfTUlDKCBzbmFwX2hlYWRlciwgc2l6ZW9mKHNuYXBfaGVhZGVyKSApOwkvL01JQyBvdmVyIDYgYnl0ZSBTTkFQCi0JCQkJaSA9IEhDRl9EQVNBX1NJWkU7Ci0JCQl9IGVsc2UKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vd3JpdGUgbGVuZ3RoICh3aXRoIFNOQVAtaGVhZGVyLFR5cGUsIHdpdGhvdXQgLy9EQSxTQSxMZW5ndGggKSBubyBNSUMgY2FsYy4KKwkJaWYgKCAoIHNuYXBfaGVhZGVyW3NpemVvZihzbmFwX2hlYWRlciktMV0gPSBoY2ZfZW5jYXAoICZwLT5idWZfYWRkcltIQ0ZfREFTQV9TSVpFXSApICkgIT0gRU5DX05PTkUgKSB7CisJCQlPUFcoIEhSRUdfREFUQV8xLCBDTlZfRU5EX1NIT1JUKCBsZW4gKyAoc2l6ZW9mKHNuYXBfaGVhZGVyKSArIDIpIC0gKCAyKjYgKyAyICkgKSApOworCQkJCSAgICAgICAgICAgICAgICAvL3dyaXRlIHNwbGljZSB3aXRoIE1JQyBjYWxjdWxhdGlvbgorCQkJcHV0X2ZyYWcoIGlmYnAsIHNuYXBfaGVhZGVyLCBzaXplb2Yoc25hcF9oZWFkZXIpIEJFX1BBUigwKSApOworCQkJQ0FMQ19UWF9NSUMoIHNuYXBfaGVhZGVyLCBzaXplb2Yoc25hcF9oZWFkZXIpICk7ICAgIC8vTUlDIG92ZXIgNiBieXRlIFNOQVAKKwkJCWkgPSBIQ0ZfREFTQV9TSVpFOworCQl9IGVsc2UKICNlbmRpZiAvLyBIQ0ZfRU5DCi0JCQl7Ci0JCQkJT1BXKCBIUkVHX0RBVEFfMSwgKih3Y2lfcmVjb3JkcCkmcC0+YnVmX2FkZHJbSENGX0RBU0FfU0laRV0gKTsKLQkJCQlpID0gMTQ7Ci0JCQl9Ci0JCQkJCQkJCQkJCS8vY29tcGxldGUgMXN0IGZyYWdtZW50IHN0YXJ0aW5nIHdpdGggVHlwZSB3aXRoIE1JQyBjYWxjdWxhdGlvbgotCQkJcHV0X2ZyYWcoIGlmYnAsICZwLT5idWZfYWRkcltpXSwgcC0+QlVGX0NOVCAtIGkgQkVfUEFSKDApICk7Ci0JCQlDQUxDX1RYX01JQyggJnAtPmJ1Zl9hZGRyW2ldLCBwLT5CVUZfQ05UIC0gaSApOworCQl7CisJCQlPUFcoIEhSRUdfREFUQV8xLCAqKHdjaV9yZWNvcmRwKSZwLT5idWZfYWRkcltIQ0ZfREFTQV9TSVpFXSApOworCQkJaSA9IDE0OwogCQl9Ci0JCQkJCQkJCQkJCS8vZG8gdGhlIHJlbWFpbmluZyBmcmFnbWVudHMgd2l0aCBNSUMgY2FsY3VsYXRpb24KKwkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vY29tcGxldGUgMXN0IGZyYWdtZW50IHN0YXJ0aW5nIHdpdGggVHlwZSB3aXRoIE1JQyBjYWxjdWxhdGlvbgorCQlwdXRfZnJhZyggaWZicCwgJnAtPmJ1Zl9hZGRyW2ldLCBwLT5CVUZfQ05UIC0gaSBCRV9QQVIoMCkgKTsKKwkJQ0FMQ19UWF9NSUMoICZwLT5idWZfYWRkcltpXSwgcC0+QlVGX0NOVCAtIGkgKTsKKworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZG8gdGhlIHJlbWFpbmluZyBmcmFnbWVudHMgd2l0aCBNSUMgY2FsY3VsYXRpb24KIAkJd2hpbGUgKCAoIHAgPSBwLT5uZXh0X2Rlc2NfYWRkciApICE9IE5VTEwgKSB7CiAJCQkvKiBvYm5veGlvdXMgYzovaGNmL2hjZi5jKDE0ODApIDogd2FybmluZyBDNDc2OTogY29udmVyc2lvbiBvZiBuZWFyIHBvaW50ZXIgdG8gbG9uZyBpbnRlZ2VyLAogCQkJICogc28gc2tpcCAqLwotCQkJSENGQVNTRVJUKCAoKGhjZl8zMilwICYgMyApID09IDAsIChoY2ZfMzIpcCApCisJCQlIQ0ZBU1NFUlQoICgoaGNmXzMyKXAgJiAzICkgPT0gMCwgKGhjZl8zMilwICk7CiAJCQlwdXRfZnJhZyggaWZicCwgcC0+YnVmX2FkZHIsIHAtPkJVRl9DTlQgQkVfUEFSKDApICk7CiAJCQlDQUxDX1RYX01JQyggcC0+YnVmX2FkZHIsIHAtPkJVRl9DTlQgKTsKIAkJfQotCQkJCQkJCQkJCQkvL3BhZCBtZXNzYWdlLCBmaW5hbGl6ZSBNSUMgY2FsY3VsYXRpb24gYW5kIHdyaXRlIE1JQyB0byBOSUMKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3BhZCBtZXNzYWdlLCBmaW5hbGl6ZSBNSUMgY2FsY3VsYXRpb24gYW5kIHdyaXRlIE1JQyB0byBOSUMKIAkJcHV0X2ZyYWdfZmluYWxpemUoIGlmYnAgKTsKIAl9CiAJaWYgKCBmaWQgKSB7Ci0vKjE2Ki8JcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX0JVU1kgfCBIQ01EX1RYIHwgSENNRF9SRUNMLCBmaWQgKTsKKwkvKjE2Ki8gIHJjID0gY21kX2V4ZSggaWZicCwgSENNRF9CVVNZIHwgSENNRF9UWCB8IEhDTURfUkVDTCwgZmlkICk7CiAJCWlmYnAtPklGQl9UeEZJRCA9IDA7Ci0JCQkvKiBwcm9iYWJseSB0aGlzIChpLmUuIG5vIFJzY0luZCBBTkQgIkhSRUdfRVZfQUxMT0MiKSBhdCB0aGlzIHBvaW50IGluIHRpbWUgb2NjdXJzIHNvIGluZnJlcXVlbnQsCi0JCQkgKiB0aGF0IGl0IG1pZ2h0IGp1c3QgYXMgd2VsbCBiZSBhY2NlcHRhYmxlIHRvIHNraXAgdGhpcwotCQkJICogIm9wdGltaXphdGlvbiIgY29kZSBhbmQgaGFuZGxlIHRoYXQgYWRkaXRpb25hbCBpbnRlcnJ1cHQgb25jZSBpbiBhIHdoaWxlCi0JCQkgKi8KKwkJLyogcHJvYmFibHkgdGhpcyAoaS5lLiBubyBSc2NJbmQgQU5EICJIUkVHX0VWX0FMTE9DIikgYXQgdGhpcyBwb2ludCBpbiB0aW1lIG9jY3VycyBzbyBpbmZyZXF1ZW50LAorCQkgKiB0aGF0IGl0IG1pZ2h0IGp1c3QgYXMgd2VsbCBiZSBhY2NlcHRhYmxlIHRvIHNraXAgdGhpcworCQkgKiAib3B0aW1pemF0aW9uIiBjb2RlIGFuZCBoYW5kbGUgdGhhdCBhZGRpdGlvbmFsIGludGVycnVwdCBvbmNlIGluIGEgd2hpbGUKKwkJICovCiAvLyAxODAgZGVncmVlIGVycm9yIGluIGxvZ2ljIDs/ICNpZiBBTExPQ18xNQotLyoyMCovCWlmICggaWZicC0+SUZCX1JzY0luZCA9PSAwICkgeworCS8qMjAqLyAgaWYgKCBpZmJwLT5JRkJfUnNjSW5kID09IDAgKSB7CiAJCQlpZmJwLT5JRkJfUnNjSW5kID0gZ2V0X2ZpZCggaWZicCApOwogCQl9CiAvLyAjZW5kaWYgLy8gQUxMT0NfMTUKIAl9Ci0vLwlIQ0ZBU1NFUlQoIGxldmVsOjppZmJwLT5JRkJfUnNjSW5kLCBpZmJwLT5JRkJfUnNjSW5kICkKLQlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfU0VORF9NU0cgKQorLy8JSENGQVNTRVJUKCBsZXZlbDo6aWZicC0+SUZCX1JzY0luZCwgaWZicC0+SUZCX1JzY0luZCApOworCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9TRU5EX01TRyApOwogCXJldHVybiByYzsKIH0gLy8gaGNmX3NlbmRfbXNnCi0jZW5kaWYgLy8gSENGX0RMX09OTFkKIAogCi0jaWYgKEhDRl9ETF9PTkxZKSA9PSAwCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qLk1PRFVMRQkJaW50IGhjZl9zZXJ2aWNlX25pYyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCB1bnNpZ25lZCBpbnQgbGVuICkKLSouUFVSUE9TRQkJU2VydmljZXMgKG1vc3QpIE5JQyBldmVudHMuCi0qCQkJCVByb3ZpZGVzIHJlY2VpdmVkIG1lc3NhZ2UKLSoJCQkJUHJvdmlkZXMgc3RhdHVzIGluZm9ybWF0aW9uLgotKgotKi5BUkdVTUVOVFMKLSoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCi0qICBJbiBub24tRE1BIG1vZGU6Ci0qCWJ1ZnAJCWFkZHJlc3Mgb2YgY2hhciBidWZmZXIsIHN1ZmZpY2llbnRseSBsYXJnZSB0byBob2xkIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBSeEZTIHVwIHRocm91Z2ggSEZTX1RZUEUKLSoJbGVuCQkJbGVuZ3RoIGluIGJ5dGVzIG9mIGJ1ZmZlciBzcGVjaWZpZWQgYnkgYnVmcAotKgkJCQl2YWx1ZSBiZXR3ZWVuIEhGU19UWVBFICsgMiBhbmQgSEZTX0FERFJfREVTVCArIEhDRl9NQVhfTVNHCi0qCi0qLlJFVFVSTlMKLSoJSENGX1NVQ0NFU1MKLSoJSENGX0VSUl9NSUMJbWVzc2FnZSBjb250YWlucyBhbiBlcnJvbmVvdXMgTUlDIChvbmx5IGlmIGZyYW1lIGZpdHMgY29tcGxldGVseSBpbiBidWZwKQotKgotKi5ERVNDUklQVElPTgotKgotKiBNU0YtYWNjZXNzaWJsZSBmaWVsZHMgb2YgUmVzdWx0IEJsb2NrCi0qIC0gSUZCX1J4TGVuCQkJMCBvciBGcmFtZSBzaXplLgotKiAtIElGQl9NQkluZm9MZW4JCTAgb3IgdGhlIEwtZmllbGQgb2YgdGhlIG9sZGVzdCBNQklCLgotKiAtIElGQl9Sc2NJbmQKLSogLSBJRkJfSENGX1RhbGxpZXMJCXVwZGF0ZWQgaWYgYSBjb3JyZXNwb25kaW5nIGV2ZW50IG9jY3VycmVkLgotKiAtIElGQl9OSUNfVGFsbGllcwkJdXBkYXRlZCBpZiBhIFRhbGx5IEluZm8gZnJhbWUgcmVjZWl2ZWQgZnJvbSB0aGUgTklDLgotKiAtIElGQl9EbWFQYWNrZXRzCi0qIC0gSUZCX1R4RnNTdGF0Ci0qIC0gSUZCX1R4RnNTd1N1cAotKiAtIElGQl9MaW5rU3RhdAkJcmVmbGVjdHMgbmV3IGxpbmsgc3RhdHVzIG9yIDB4MDAwMCBpZiBubyBjaGFuZ2UgcmVsYXRpdmUgdG8gcHJldmlvdXMgaGNmX3NlcnZpY2VfbmljIGNhbGwuCisgKgorICouTU9EVUxFICAgICAgICBpbnQgaGNmX3NlcnZpY2VfbmljKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIHVuc2lnbmVkIGludCBsZW4gKQorICouUFVSUE9TRSAgICAgICBTZXJ2aWNlcyAobW9zdCkgTklDIGV2ZW50cy4KKyAqICAgICAgICAgICAgICAgUHJvdmlkZXMgcmVjZWl2ZWQgbWVzc2FnZQorICogICAgICAgICAgICAgICBQcm92aWRlcyBzdGF0dXMgaW5mb3JtYXRpb24uCisgKgorICouQVJHVU1FTlRTCisgKiAgIGlmYnAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworICogIEluIG5vbi1ETUEgbW9kZToKKyAqICAgYnVmcCAgICAgICAgYWRkcmVzcyBvZiBjaGFyIGJ1ZmZlciwgc3VmZmljaWVudGx5IGxhcmdlIHRvIGhvbGQgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIFJ4RlMgdXAgdGhyb3VnaCBIRlNfVFlQRQorICogICBsZW4gICAgICAgICBsZW5ndGggaW4gYnl0ZXMgb2YgYnVmZmVyIHNwZWNpZmllZCBieSBidWZwCisgKiAgICAgICAgICAgICAgIHZhbHVlIGJldHdlZW4gSEZTX1RZUEUgKyAyIGFuZCBIRlNfQUREUl9ERVNUICsgSENGX01BWF9NU0cKKyAqCisgKi5SRVRVUk5TCisgKiAgIEhDRl9TVUNDRVNTCisgKiAgIEhDRl9FUlJfTUlDIG1lc3NhZ2UgY29udGFpbnMgYW4gZXJyb25lb3VzIE1JQyAob25seSBpZiBmcmFtZSBmaXRzIGNvbXBsZXRlbHkgaW4gYnVmcCkKKyAqCisgKi5ERVNDUklQVElPTgorICoKKyAqIE1TRi1hY2Nlc3NpYmxlIGZpZWxkcyBvZiBSZXN1bHQgQmxvY2sKKyAqIC0gSUZCX1J4TGVuICAgICAgICAgICAwIG9yIEZyYW1lIHNpemUuCisgKiAtIElGQl9NQkluZm9MZW4gICAgICAgMCBvciB0aGUgTC1maWVsZCBvZiB0aGUgb2xkZXN0IE1CSUIuCisgKiAtIElGQl9Sc2NJbmQKKyAqIC0gSUZCX0hDRl9UYWxsaWVzICAgICB1cGRhdGVkIGlmIGEgY29ycmVzcG9uZGluZyBldmVudCBvY2N1cnJlZC4KKyAqIC0gSUZCX05JQ19UYWxsaWVzICAgICB1cGRhdGVkIGlmIGEgVGFsbHkgSW5mbyBmcmFtZSByZWNlaXZlZCBmcm9tIHRoZSBOSUMuCisgKiAtIElGQl9EbWFQYWNrZXRzCisgKiAtIElGQl9UeEZzU3RhdAorICogLSBJRkJfVHhGc1N3U3VwCisgKiAtIElGQl9MaW5rU3RhdCAgICAgICAgcmVmbGVjdHMgbmV3IGxpbmsgc3RhdHVzIG9yIDB4MDAwMCBpZiBubyBjaGFuZ2UgcmVsYXRpdmUgdG8gcHJldmlvdXMgaGNmX3NlcnZpY2VfbmljIGNhbGwuCiBvcgotKiAtIElGQl9MaW5rU3RhdAkJbGluayBzdGF0dXMsIDB4ODAwMCByZWZsZWN0cyBjaGFuZ2UgcmVsYXRpdmUgdG8gcHJldmlvdXMgaGNmX3NlcnZpY2VfbmljIGNhbGwuCisqIC0gSUZCX0xpbmtTdGF0ICAgICAgICBsaW5rIHN0YXR1cywgMHg4MDAwIHJlZmxlY3RzIGNoYW5nZSByZWxhdGl2ZSB0byBwcmV2aW91cyBoY2Zfc2VydmljZV9uaWMgY2FsbC4KICoKICogV2hlbiBJRkJfTUJJbmZvTGVuIGlzIG5vbi16ZXJvLCBhdCBsZWFzdCBvbmUgTUJJQiBpcyBhdmFpbGFibGUuCiAqCi0qIElGQl9SeExlbglyZWZsZWN0cyB0aGUgbnVtYmVyIG9mIHJlY2VpdmVkIGJ5dGVzIGluIDgwMi4zIHZpZXcgKEluY2x1ZGluZyBEZXN0QWRkciwgU3JjQWRkciBhbmQgTGVuZ3RoLAorKiBJRkJfUnhMZW4gcmVmbGVjdHMgdGhlIG51bWJlciBvZiByZWNlaXZlZCBieXRlcyBpbiA4MDIuMyB2aWV3IChJbmNsdWRpbmcgRGVzdEFkZHIsIFNyY0FkZHIgYW5kIExlbmd0aCwKICogZXhjbHVkaW5nIE1JQy1wYWRkaW5nLCBNSUMgYW5kIHN1bSBjaGVjaykgb2YgYWN0aXZlIFJ4IEZyYW1lIFN0cnVjdHVyZS4gSWYgbm8gUnggRGF0YSBzIGF2YWlsYWJsZSwgSUZCX1J4TGVuCiAqIGVxdWFscyAweDAwMDAuCiAqIFJlcGVhdGVkIGV4ZWN1dGlvbiBjYXVzZXMgdGhlIFNlcnZpY2UgTklDIEZ1bmN0aW9uIHRvIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgc3Vic2VxdWVudGx5IHJlY2VpdmVkCkBAIC0yODkxLDE1MCArMjc3MCwxNTAgQEAKICogc3BlY2lmaWMgcmVxdWlyZW1lbnRzIG9mIHRoYXQgZW52aXJvbm1lbnQgdG8gdHJhbnNsYXRlIHRoZSBpbnRlcnJ1cHQgc3RyYXRlZ3kgdG8gYSBwb2xsZWQgc3RyYXRlZ3kuCiAqCiAqIGhjZl9zZXJ2aWNlX25pYyBzZXJ2aWNlcyB0aGUgZm9sbG93aW5nIEhlcm1lcyBldmVudHM6Ci0qIC0gSFJFR19FVl9JTkZPCQlBc3luY2hyb25vdXMgSW5mb3JtYXRpb24gRnJhbWUKLSogLSBIUkVHX0VWX0lORk9fRFJPUAlXTUFDIGRpZCBub3QgaGF2ZSBzdWZmaWNpZW50IFJBTSB0byBidWlsZCBVbnNvbGljaXRlZCBJbmZvcm1hdGlvbiBGcmFtZQotKiAtIEhSRUdfRVZfVFhfRVhDCQkoaWYgYXBwbGljYWJsZSwgaS5lLiBzZWxlY3RlZCB2aWEgSENGX0VYVF9JTlRfVFhfRVggYml0IG9mIEhDRl9FWFQpCi0qIC0gSFJFR19FVl9TTEVFUF9SRVEJKGlmIGFwcGxpY2FibGUsIGkuZS4gc2VsZWN0ZWQgdmlhIEhDRl9ERFMvSENGX0NEUyBiaXQgb2YgSENGX1NMRUVQKQorKiAtIEhSRUdfRVZfSU5GTyAgICAgICAgQXN5bmNocm9ub3VzIEluZm9ybWF0aW9uIEZyYW1lCisqIC0gSFJFR19FVl9JTkZPX0RST1AgICBXTUFDIGRpZCBub3QgaGF2ZSBzdWZmaWNpZW50IFJBTSB0byBidWlsZCBVbnNvbGljaXRlZCBJbmZvcm1hdGlvbiBGcmFtZQorKiAtIEhSRUdfRVZfVFhfRVhDICAgICAgKGlmIGFwcGxpY2FibGUsIGkuZS4gc2VsZWN0ZWQgdmlhIEhDRl9FWFRfSU5UX1RYX0VYIGJpdCBvZiBIQ0ZfRVhUKQorKiAtIEhSRUdfRVZfU0xFRVBfUkVRICAgKGlmIGFwcGxpY2FibGUsIGkuZS4gc2VsZWN0ZWQgdmlhIEhDRl9ERFMvSENGX0NEUyBiaXQgb2YgSENGX1NMRUVQKQogKiAqKiBpbiBub25fRE1BIG1vZGUKLSogLSBIUkVHX0VWX0FMTE9DCQlBc3luY2hyb25vdXMgcGFydCBvZiBBbGxvY2F0aW9uL1JlY2xhaW0gY29tcGxldGVkIHdoaWxlIG91dCBvZiByZXNvdXJjZXMgYXQKLSogCQkJCQkJY29tcGxldGlvbiBvZiBoY2Zfc2VuZF9tc2cvbm90aWZ5Ci0qIC0gSFJFR19FVl9SWAkJCXRoZSBkZXRlY3Rpb24gb2YgdGhlIGF2YWlsYWJpbGl0eSBvZiByZWNlaXZlZCBtZXNzYWdlcwotKiAJCQkJCQlpbmNsdWRpbmcgV2F2ZUxBTiBNYW5hZ2VtZW50IFByb3RvY29sIChXTVApIG1lc3NhZ2UgcHJvY2Vzc2luZworKiAtIEhSRUdfRVZfQUxMT0MgICAgICAgQXN5bmNocm9ub3VzIHBhcnQgb2YgQWxsb2NhdGlvbi9SZWNsYWltIGNvbXBsZXRlZCB3aGlsZSBvdXQgb2YgcmVzb3VyY2VzIGF0CisqICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uIG9mIGhjZl9zZW5kX21zZy9ub3RpZnkKKyogLSBIUkVHX0VWX1JYICAgICAgICAgIHRoZSBkZXRlY3Rpb24gb2YgdGhlIGF2YWlsYWJpbGl0eSBvZiByZWNlaXZlZCBtZXNzYWdlcworKiAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIFdhdmVMQU4gTWFuYWdlbWVudCBQcm90b2NvbCAoV01QKSBtZXNzYWdlIHByb2Nlc3NpbmcKICogKiogaW4gRE1BIG1vZGUKICogLSBIUkVHX0VWX1JETUFECiAqIC0gSFJFR19FVl9URE1BRAogKiEhIGhjZl9zZXJ2aWNlX25pYyBkb2VzIG5vdCBzZXJ2aWNlIHRoZSBmb2xsb3dpbmcgSGVybWVzIGV2ZW50czoKLSohISAJSFJFR19FVl9UWCAJCQkodGhlICJPSyIgVHggRXZlbnQpIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgYnkgdGhlIFdDSSwgaWYgaXQgb2NjdXJzIGl0IGlzIHVuY2xlYXIKLSohISAJCQkJCQl3aGF0IHRoZSBjYXVzZSBpcywgc28gbm8gbWVhbmluZ2Z1bCBzdHJhdGVneSBpcyBhdmFpbGFibGUuIE5vdCBhY2tpbmcgdGhlIGJpdCBpcwotKiEhIAkJCQkJCXByb2JhYmx5IHRoZSBiZXN0IGhlbHAgdGhhdCBjYW4gYmUgZ2l2ZW4gdG8gdGhlIGRlYnVnZ2VyLgotKiEhIAlIUkVHX0VWX0NNRAkJCWhhbmRsZWQgaW4gY21kX3dhaXQuCi0qISEgCUhSRUdfRVZfRldfRE1BIAkJKGkuZS4gSFJFR19FVl9SWERNQSwgSFJFR19FVl9UWERNQSBhbmRfRVZfTFBFU0MpIGFyZSBlaXRoZXIgbm90IHVzZWQgb3IgdXNlZAotKiEhIAkJCQkJCWJldHdlZW4gdGhlIEYvVyBhbmQgdGhlIERNQSBlbmdpbmUuCi0qISEgCUhSRUdfRVZfQUNLX1JFR19SRUFEWSBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIEgtSUkgKGkuZS4gbm90IEhJSS41IGFuZCB1cCwgc2VlIERBV0EpCisqISEgICAgIEhSRUdfRVZfVFggICAgICAgICAgKHRoZSAiT0siIFR4IEV2ZW50KSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGJ5IHRoZSBXQ0ksIGlmIGl0IG9jY3VycyBpdCBpcyB1bmNsZWFyCisqISEgICAgICAgICAgICAgICAgICAgICAgICAgd2hhdCB0aGUgY2F1c2UgaXMsIHNvIG5vIG1lYW5pbmdmdWwgc3RyYXRlZ3kgaXMgYXZhaWxhYmxlLiBOb3QgYWNraW5nIHRoZSBiaXQgaXMKKyohISAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iYWJseSB0aGUgYmVzdCBoZWxwIHRoYXQgY2FuIGJlIGdpdmVuIHRvIHRoZSBkZWJ1Z2dlci4KKyohISAgICAgSFJFR19FVl9DTUQgICAgICAgICBoYW5kbGVkIGluIGNtZF93YWl0LgorKiEhICAgICBIUkVHX0VWX0ZXX0RNQSAgICAgIChpLmUuIEhSRUdfRVZfUlhETUEsIEhSRUdfRVZfVFhETUEgYW5kX0VWX0xQRVNDKSBhcmUgZWl0aGVyIG5vdCB1c2VkIG9yIHVzZWQKKyohISAgICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIHRoZSBGL1cgYW5kIHRoZSBETUEgZW5naW5lLgorKiEhICAgICBIUkVHX0VWX0FDS19SRUdfUkVBRFkgaXMgb25seSBhcHBsaWNhYmxlIGZvciBILUlJIChpLmUuIG5vdCBISUkuNSBhbmQgdXAsIHNlZSBEQVdBKQogKgotKglJZiwgaW4gbm9uLURNQSBtb2RlLCBhIFJ4IG1lc3NhZ2UgaXMgYXZhaWxhYmxlLCBpdHMgbGVuZ3RoIGlzIHJlZmxlY3RlZCBieSB0aGUgSUZCX1J4TGVuIGZpZWxkIG9mIHRoZSBJRkIuCi0qCVRoaXMgbGVuZ3RoIHJlZmxlY3RzIHRoZSBkYXRhIGl0c2VsZiBhbmQgdGhlIERlc3RpbmF0aW9uIEFkZHJlc3MsIFNvdXJjZSBBZGRyZXNzIGFuZCBEYXRhTGVuZ3RoL1R5cGUgZmllbGQKLSoJYnV0IG5vdCB0aGUgU05BUC1oZWFkZXIgaW4gY2FzZSBvZiBkZWNhcHN1bGF0aW9uIGJ5IHRoZSBIQ0YuICBJZiBubyBtZXNzYWdlIGlzIGF2YWlsYWJsZSwgSUZCX1J4TGVuIGlzCi0qCXplcm8uICBGb3JtZXIgdmVyc2lvbnMgb2YgdGhlIEhDRiBoYW5kbGVkIFdNUCBtZXNzYWdlcyBhbmQgc3VwcG9ydGVkIGEgIm1vbml0b3IiIG1vZGUgaW4gaGNmX3NlcnZpY2VfbmljLAotKgl3aGljaCBkZXBvc2l0ZWQgY2VydGFpbiBvciBhbGwgUnggbWVzc2FnZXMgaW4gdGhlIE1haWxCb3guIFRoZSByZXNwb25zaWJpbGl0eSB0byBoYW5kbGUgdGhlc2UgZnJhbWVzIGlzCi0qCW1vdmVkIHRvIHRoZSBNU0YuIFRoZSBIQ0Ygb2ZmZXJzIGFzIHN1cHBvcnRzIGhjZl9wdXRfaW5mbyB3aXRoIENGR19NQl9JTkZPIGFzIHBhcmFtZXRlciB0byBlbXVsYXRlIHRoZSBvbGQKLSogCWltcGxlbWVudGF0aW9uIHVuZGVyIGNvbnRyb2wgb2YgdGhlIE1TRi4KKyogICBJZiwgaW4gbm9uLURNQSBtb2RlLCBhIFJ4IG1lc3NhZ2UgaXMgYXZhaWxhYmxlLCBpdHMgbGVuZ3RoIGlzIHJlZmxlY3RlZCBieSB0aGUgSUZCX1J4TGVuIGZpZWxkIG9mIHRoZSBJRkIuCisqICAgVGhpcyBsZW5ndGggcmVmbGVjdHMgdGhlIGRhdGEgaXRzZWxmIGFuZCB0aGUgRGVzdGluYXRpb24gQWRkcmVzcywgU291cmNlIEFkZHJlc3MgYW5kIERhdGFMZW5ndGgvVHlwZSBmaWVsZAorKiAgIGJ1dCBub3QgdGhlIFNOQVAtaGVhZGVyIGluIGNhc2Ugb2YgZGVjYXBzdWxhdGlvbiBieSB0aGUgSENGLiAgSWYgbm8gbWVzc2FnZSBpcyBhdmFpbGFibGUsIElGQl9SeExlbiBpcworKiAgIHplcm8uICBGb3JtZXIgdmVyc2lvbnMgb2YgdGhlIEhDRiBoYW5kbGVkIFdNUCBtZXNzYWdlcyBhbmQgc3VwcG9ydGVkIGEgIm1vbml0b3IiIG1vZGUgaW4gaGNmX3NlcnZpY2VfbmljLAorKiAgIHdoaWNoIGRlcG9zaXRlZCBjZXJ0YWluIG9yIGFsbCBSeCBtZXNzYWdlcyBpbiB0aGUgTWFpbEJveC4gVGhlIHJlc3BvbnNpYmlsaXR5IHRvIGhhbmRsZSB0aGVzZSBmcmFtZXMgaXMKKyogICBtb3ZlZCB0byB0aGUgTVNGLiBUaGUgSENGIG9mZmVycyBhcyBzdXBwb3J0cyBoY2ZfcHV0X2luZm8gd2l0aCBDRkdfTUJfSU5GTyBhcyBwYXJhbWV0ZXIgdG8gZW11bGF0ZSB0aGUgb2xkCisqICAgaW1wbGVtZW50YXRpb24gdW5kZXIgY29udHJvbCBvZiB0aGUgTVNGLgogKgogKiAqKlJ4IEJ1ZmZlciBmcmVlIHN0cmF0ZWd5Ci0qCVdoZW4gaGNmX3NlcnZpY2VfbmljIHJlcG9ydHMgdGhlIGF2YWlsYWJpbGl0eSBvZiBhIG5vbi1ETUEgbWVzc2FnZSwgdGhlIE1TRiBjYW4gYWNjZXNzIHRoYXQgbWVzc2FnZSBieQotKgltZWFucyBvZiBoY2ZfcmN2X21zZy4gSXQgbXVzdCBiZSBwcmV2ZW50ZWQgdGhhdCB0aGUgTEFOIENvbnRyb2xsZXIgd3JpdGVzIG5ldyBkYXRhIGluIHRoZSBOSUMgYnVmZmVyCi0qCWJlZm9yZSB0aGUgTVNGIGlzIGZpbmlzaGVkIHdpdGggdGhlIGN1cnJlbnQgbWVzc2FnZS4gVGhlIE5JQyBidWZmZXIgaXMgcmV0dXJuZWQgdG8gdGhlIExBTiBDb250cm9sbGVyCi0qCXdoZW46Ci0qCSAtIHRoZSBjb21wbGV0ZSBmcmFtZSBmaXRzIGluIHRoZSBsb29rYWhlYWQgYnVmZmVyIG9yCi0qCSAtIGhjZl9yY3ZfbXNnIGlzIGNhbGxlZCBvcgotKgkgLSBoY2ZfYWN0aW9uIHdpdGggSENGX0FDVF9SWCBpcyBjYWxsZWQgb3IKLSoJIC0gaGNmX3NlcnZpY2VfbmljIGlzIGNhbGxlZCBhZ2FpbgotKglJdCBjYW4gYmUgcmVhc29uZWQgdGhhdCBoY2ZfYWN0aW9uKCBJTlRfT04gKSBzaG91bGQgbm90IGJlIGdpdmVuIGJlZm9yZSB0aGUgTVNGIGhhcyBjb21wbGV0ZWx5IHByb2Nlc3NlZAotKglhIHJlcG9ydGVkIFJ4LWZyYW1lLiBUaGUgcmVhc29uIGlzIHRoYXQgdGhlIElOVF9PTiBhY3Rpb24gaXMgZ3VhcmFudGVlZCB0byBjYXVzZSBhIChSeC0paW50ZXJydXB0ICh0aGUKLSoJTVNGIGlzIHByb2Nlc3NpbmcgYSBSeC1mcmFtZSwgaGVuY2UgdGhlIFJ4LWV2ZW50IGJpdCBpbiB0aGUgSGVybWVzIHJlZ2lzdGVyIG11c3QgYmUgYWN0aXZlKS4gVGhpcwotKglpbnRlcnJ1cHQgd2lsbCBjYXVzZSBoY2Zfc2VydmljZV9uaWMgdG8gYmUgY2FsbGVkLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBhY2staW5nIG9mIHRoZSAibGFzdCIgUngtZXZlbnQKLSoJdG8gdGhlIEhlcm1lcywgY2F1c2luZyB0aGUgSGVybWVzIHRvIGRpc2NhcmQgdGhlIGFzc29jaWF0ZWQgTklDIFJBTSBidWZmZXIuCisqICAgV2hlbiBoY2Zfc2VydmljZV9uaWMgcmVwb3J0cyB0aGUgYXZhaWxhYmlsaXR5IG9mIGEgbm9uLURNQSBtZXNzYWdlLCB0aGUgTVNGIGNhbiBhY2Nlc3MgdGhhdCBtZXNzYWdlIGJ5CisqICAgbWVhbnMgb2YgaGNmX3Jjdl9tc2cuIEl0IG11c3QgYmUgcHJldmVudGVkIHRoYXQgdGhlIExBTiBDb250cm9sbGVyIHdyaXRlcyBuZXcgZGF0YSBpbiB0aGUgTklDIGJ1ZmZlcgorKiAgIGJlZm9yZSB0aGUgTVNGIGlzIGZpbmlzaGVkIHdpdGggdGhlIGN1cnJlbnQgbWVzc2FnZS4gVGhlIE5JQyBidWZmZXIgaXMgcmV0dXJuZWQgdG8gdGhlIExBTiBDb250cm9sbGVyCisqICAgd2hlbjoKKyogICAgLSB0aGUgY29tcGxldGUgZnJhbWUgZml0cyBpbiB0aGUgbG9va2FoZWFkIGJ1ZmZlciBvcgorKiAgICAtIGhjZl9yY3ZfbXNnIGlzIGNhbGxlZCBvcgorKiAgICAtIGhjZl9hY3Rpb24gd2l0aCBIQ0ZfQUNUX1JYIGlzIGNhbGxlZCBvcgorKiAgICAtIGhjZl9zZXJ2aWNlX25pYyBpcyBjYWxsZWQgYWdhaW4KKyogICBJdCBjYW4gYmUgcmVhc29uZWQgdGhhdCBoY2ZfYWN0aW9uKCBJTlRfT04gKSBzaG91bGQgbm90IGJlIGdpdmVuIGJlZm9yZSB0aGUgTVNGIGhhcyBjb21wbGV0ZWx5IHByb2Nlc3NlZAorKiAgIGEgcmVwb3J0ZWQgUngtZnJhbWUuIFRoZSByZWFzb24gaXMgdGhhdCB0aGUgSU5UX09OIGFjdGlvbiBpcyBndWFyYW50ZWVkIHRvIGNhdXNlIGEgKFJ4LSlpbnRlcnJ1cHQgKHRoZQorKiAgIE1TRiBpcyBwcm9jZXNzaW5nIGEgUngtZnJhbWUsIGhlbmNlIHRoZSBSeC1ldmVudCBiaXQgaW4gdGhlIEhlcm1lcyByZWdpc3RlciBtdXN0IGJlIGFjdGl2ZSkuIFRoaXMKKyogICBpbnRlcnJ1cHQgd2lsbCBjYXVzZSBoY2Zfc2VydmljZV9uaWMgdG8gYmUgY2FsbGVkLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBhY2staW5nIG9mIHRoZSAibGFzdCIgUngtZXZlbnQKKyogICB0byB0aGUgSGVybWVzLCBjYXVzaW5nIHRoZSBIZXJtZXMgdG8gZGlzY2FyZCB0aGUgYXNzb2NpYXRlZCBOSUMgUkFNIGJ1ZmZlci4KICogQXNzZXJ0IGZhaWxzIGlmCiAqIC0gaWZicCBpcyB6ZXJvIG9yIG90aGVyIHJlY29nbml6YWJsZSBvdXQtb2YtcmFuZ2UgdmFsdWUuCiAqIC0gaGNmX3NlcnZpY2VfbmljIGlzIGNhbGxlZCB3aXRob3V0IGEgcHJpb3IgY2FsbCB0byBoY2ZfY29ubmVjdC4KICogLSBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkLgogKiAtIHJlZW50cmFuY3ksIG1heSBiZSAgY2F1c2VkIGJ5IGNhbGxpbmcgaGNmX2Z1bmN0aW9ucyB3aXRob3V0IGFkZXF1YXRlIHByb3RlY3Rpb24KLSoJYWdhaW5zdCBOSUMgaW50ZXJydXB0cyBvciBtdWx0aS10aHJlYWRpbmcuCisqICAgYWdhaW5zdCBOSUMgaW50ZXJydXB0cyBvciBtdWx0aS10aHJlYWRpbmcuCiAqCiAqCiAqLkRJQUdSQU0KLSoxOglJRkJfTGlua1N0YXQgaXMgY2xlYXJlZCwgaWYgYSBMaW5rU3RhdHVzIGZyYW1lIGlzIHJlY2VpdmVkLCBJRkJfTGlua1N0YXQgd2lsbCBiZSB1cGRhdGVkIGFjY29yZGluZ2x5Ci0qCWJ5IGlzcl9pbmZvLgorKjE6IElGQl9MaW5rU3RhdCBpcyBjbGVhcmVkLCBpZiBhIExpbmtTdGF0dXMgZnJhbWUgaXMgcmVjZWl2ZWQsIElGQl9MaW5rU3RhdCB3aWxsIGJlIHVwZGF0ZWQgYWNjb3JkaW5nbHkKKyogICBieSBpc3JfaW5mby4KIG9yCi0qMToJSUZCX0xpbmtTdGF0IGNoYW5nZSBpbmRpY2F0aW9uIGlzIGNsZWFyZWQuIElmIGEgTGlua1N0YXR1cyBmcmFtZSBpcyByZWNlaXZlZCwgSUZCX0xpbmtTdGF0IHdpbGwgYmUgdXBkYXRlZAotKglhY2NvcmRpbmdseSBieSBpc3JfaW5mby4KKyoxOiBJRkJfTGlua1N0YXQgY2hhbmdlIGluZGljYXRpb24gaXMgY2xlYXJlZC4gSWYgYSBMaW5rU3RhdHVzIGZyYW1lIGlzIHJlY2VpdmVkLCBJRkJfTGlua1N0YXQgd2lsbCBiZSB1cGRhdGVkCisqICAgYWNjb3JkaW5nbHkgYnkgaXNyX2luZm8uCiAqMjogSUZCX1J4TGVuIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgdGhlIE5JQyBwcmVzZW5jZSBjaGVjayBvdGhlcndpc2U6Ci0qCSAtCXRoaXMgdmFsdWUgbWF5IHN0YXkgbm9uLXplcm8gaWYgdGhlIE5JQyBpcyBwdWxsZWQgb3V0IGF0IGFuIGluY29udmVuaWVudCBtb21lbnQuCi0qCSAtCXRoZSBSeEFjayBvbiBhIHplcm8tRklEIG5lZWRzIGEgemVyby12YWx1ZSBmb3IgSUZCX1J4TGVuIHRvIHdvcmsKLSoJIE5vdGUgdGhhdCBhcyBzaWRlLWVmZmVjdCBvZiB0aGUgaGNmX2FjdGlvbiBjYWxsLCB0aGUgcmVtYWluZGVyIG9mIFJ4IHJlbGF0ZWQgaW5mbyBpcyByZS1pbml0aWFsaXplZCBhcwotKgkgd2VsbC4KLSo0OglJbiBjYXNlIG9mIERlZnVuY3QgbW9kZSwgdGhlIGluZm9ybWF0aW9uIHN1cHBsaWVkIGJ5IEhlcm1lcyBpcyB1bnJlbGlhYmxlLCBzbyB0aGUgYm9keSBvZgotKgloY2Zfc2VydmljZV9uaWMgaXMgc2tpcHBlZC4gU2luY2UgaGNmX2NudGwgdHVybnMgaW50byBhIE5PUCBpZiBQcmltYXJ5IG9yIFN0YXRpb24gRi9XIGlzIGluY29tcGF0aWJsZSwKLSoJaGNmX3NlcnZpY2VfbmljIGlzIGFsc28gc2tpcHBlZCBpbiB0aG9zZSBjYXNlcy4KLSoJVG8gcHJldmVudCB0aGF0IGhjZl9zZXJ2aWNlX25pYyByZXBvcnRzIGJvZ3VzIGluZm9ybWF0aW9uIHRvIHRoZSBNU0Ygd2l0aCBhbGwgLSBwb3NzaWJseSBkaWZmaWN1bHQgdG8KLSoJZGVidWcgLSB1bmRlc2lyYWJsZSBzaWRlIGVmZmVjdHMsIGl0IGlzIHBhcmFtb3VudCB0byBjaGVjayB0aGUgTklDIHByZXNlbmNlLiBJbiBmb3JtZXIgZGF5cyB0aGUgcHJlc2VuY2UKLSoJdGVzdCB3YXMgYmFzZWQgb24gdGhlIEhlcm1lcyByZWdpc3RlciBIUkVHX1NXXzAuIFNpbmNlIGluIEhDRl9BQ1RfSU5UX09GRiBpcyBjaG9zZW4gZm9yIHN0cmF0ZWd5IGJhc2VkIG9uCi0qCUhSRUdfRVZfU1RBVCwgdGhpcyBpcyBub3cgYWxzbyB1c2VkIGluIGhjZl9zZXJ2aWNlX25pYy4gVGhlIG1vdGl2YXRpb24gdG8gY2hhbmdlIHN0cmF0ZWd5IGlzIHBhcnRseQotKglkdWUgdG8gaW5jb25zaXN0ZW50IEYvVyBpbXBsZW1lbnRhdGlvbnMgd2l0aCByZXNwZWN0IHRvIEhSRUdfU1dfMCBtYW5pcHVsYXRpb24gYXJvdW5kIHJlc2V0IGFuZCBkb3dubG9hZC4KLSoJTm90ZSB0aGF0IGluIHBvbGxlZCBlbnZpcm9ubWVudHMgQ2FyZCBSZW1vdmFsIGlzIG5vdCBkZXRlY3RlZCBieSBJTlRfT0ZGIHdoaWNoIG1ha2VzIHRoZSBjaGVjayBpbgotKgloY2Zfc2VydmljZV9uaWMgZXZlbiBtb3JlIGltcG9ydGFudC4KLSo4OglUaGUgZXZlbnQgc3RhdHVzIHJlZ2lzdGVyIG9mIHRoZSBIZXJtZXMgaXMgc2FtcGxlZAotKglUaGUgYXNzZXJ0IGNoZWNrcyBmb3IgdW5leHBlY3RlZCBldmVudHMgOz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8uCi0qCSAtIEhSRUdfRVZfSU5GT19EUk9QIGlzIGV4cGxpY2l0bHkgZXhjbHVkZWQgZnJvbSB0aGUgYWNjZXB0YWJsZSBIUkVHX0VWX1NUQVQgYml0cyBiZWNhdXNlIGl0IGluZGljYXRlcwotKgkgICBhIHRvbyBoZWF2aWx5IGxvYWRlZCBzeXN0ZW0uCi0qCSAtIEhSRUdfRVZfQUNLX1JFR19SRUFEWSBpcyAweDAwMDAgZm9yIEgtSSAoYW5kIGhvcGVmdWxseSBILUlJLjUpCisqICAgIC0gIHRoaXMgdmFsdWUgbWF5IHN0YXkgbm9uLXplcm8gaWYgdGhlIE5JQyBpcyBwdWxsZWQgb3V0IGF0IGFuIGluY29udmVuaWVudCBtb21lbnQuCisqICAgIC0gIHRoZSBSeEFjayBvbiBhIHplcm8tRklEIG5lZWRzIGEgemVyby12YWx1ZSBmb3IgSUZCX1J4TGVuIHRvIHdvcmsKKyogICAgTm90ZSB0aGF0IGFzIHNpZGUtZWZmZWN0IG9mIHRoZSBoY2ZfYWN0aW9uIGNhbGwsIHRoZSByZW1haW5kZXIgb2YgUnggcmVsYXRlZCBpbmZvIGlzIHJlLWluaXRpYWxpemVkIGFzCisqICAgIHdlbGwuCisqNDogSW4gY2FzZSBvZiBEZWZ1bmN0IG1vZGUsIHRoZSBpbmZvcm1hdGlvbiBzdXBwbGllZCBieSBIZXJtZXMgaXMgdW5yZWxpYWJsZSwgc28gdGhlIGJvZHkgb2YKKyogICBoY2Zfc2VydmljZV9uaWMgaXMgc2tpcHBlZC4gU2luY2UgaGNmX2NudGwgdHVybnMgaW50byBhIE5PUCBpZiBQcmltYXJ5IG9yIFN0YXRpb24gRi9XIGlzIGluY29tcGF0aWJsZSwKKyogICBoY2Zfc2VydmljZV9uaWMgaXMgYWxzbyBza2lwcGVkIGluIHRob3NlIGNhc2VzLgorKiAgIFRvIHByZXZlbnQgdGhhdCBoY2Zfc2VydmljZV9uaWMgcmVwb3J0cyBib2d1cyBpbmZvcm1hdGlvbiB0byB0aGUgTVNGIHdpdGggYWxsIC0gcG9zc2libHkgZGlmZmljdWx0IHRvCisqICAgZGVidWcgLSB1bmRlc2lyYWJsZSBzaWRlIGVmZmVjdHMsIGl0IGlzIHBhcmFtb3VudCB0byBjaGVjayB0aGUgTklDIHByZXNlbmNlLiBJbiBmb3JtZXIgZGF5cyB0aGUgcHJlc2VuY2UKKyogICB0ZXN0IHdhcyBiYXNlZCBvbiB0aGUgSGVybWVzIHJlZ2lzdGVyIEhSRUdfU1dfMC4gU2luY2UgaW4gSENGX0FDVF9JTlRfT0ZGIGlzIGNob3NlbiBmb3Igc3RyYXRlZ3kgYmFzZWQgb24KKyogICBIUkVHX0VWX1NUQVQsIHRoaXMgaXMgbm93IGFsc28gdXNlZCBpbiBoY2Zfc2VydmljZV9uaWMuIFRoZSBtb3RpdmF0aW9uIHRvIGNoYW5nZSBzdHJhdGVneSBpcyBwYXJ0bHkKKyogICBkdWUgdG8gaW5jb25zaXN0ZW50IEYvVyBpbXBsZW1lbnRhdGlvbnMgd2l0aCByZXNwZWN0IHRvIEhSRUdfU1dfMCBtYW5pcHVsYXRpb24gYXJvdW5kIHJlc2V0IGFuZCBkb3dubG9hZC4KKyogICBOb3RlIHRoYXQgaW4gcG9sbGVkIGVudmlyb25tZW50cyBDYXJkIFJlbW92YWwgaXMgbm90IGRldGVjdGVkIGJ5IElOVF9PRkYgd2hpY2ggbWFrZXMgdGhlIGNoZWNrIGluCisqICAgaGNmX3NlcnZpY2VfbmljIGV2ZW4gbW9yZSBpbXBvcnRhbnQuCisqODogVGhlIGV2ZW50IHN0YXR1cyByZWdpc3RlciBvZiB0aGUgSGVybWVzIGlzIHNhbXBsZWQKKyogICBUaGUgYXNzZXJ0IGNoZWNrcyBmb3IgdW5leHBlY3RlZCBldmVudHMgOz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8uCisqICAgIC0gSFJFR19FVl9JTkZPX0RST1AgaXMgZXhwbGljaXRseSBleGNsdWRlZCBmcm9tIHRoZSBhY2NlcHRhYmxlIEhSRUdfRVZfU1RBVCBiaXRzIGJlY2F1c2UgaXQgaW5kaWNhdGVzCisqICAgICAgYSB0b28gaGVhdmlseSBsb2FkZWQgc3lzdGVtLgorKiAgICAtIEhSRUdfRVZfQUNLX1JFR19SRUFEWSBpcyAweDAwMDAgZm9yIEgtSSAoYW5kIGhvcGVmdWxseSBILUlJLjUpCiAqCiAqCi0qCUhSRUdfRVZfVFhfRVhDIGlzIGFjY2VwdGVkICh2aWEgSFJFR19FVl9UWF9FWFQpIGlmIGFuZCBvbmx5IGlmIEhDRl9FWFRfSU5UX1RYX0VYIHNldCBpbiB0aGUgSENGX0VYVAotKglkZWZpbml0aW9uIGF0IGNvbXBpbGUgdGltZS4KLSoJVGhlIGZvbGxvd2luZyBhY3Rpdml0aWVzIGFyZSBoYW5kbGVkOgotKgkgLQlBbGxvYyBldmVudHMgYXJlIGhhbmRsZWQgYnkgaGNmX3NlbmRfbXNnIChhbmQgbm90aWZ5KS4gT25seSBpZiB0aGVyZSBpcyBubyAic3BhcmUiIHJlc291cmNlLCB0aGUKLSoJCWFsbG9jIGV2ZW50IGlzIHN1cGVyZmljaWFsbHkgc2VydmljZWQgYnkgaGNmX3NlcnZpY2VfbmljIHRvIGNyZWF0ZSBhIHBzZXVkby1yZXNvdXJjZSB3aXRoIHZhbHVlCi0qCQkweDAwMS4gVGhpcyB2YWx1ZSBpcyByZWNvZ25pemVkIGJ5IGdldF9maWQgKGNhbGxlZCBieSBoY2Zfc2VuZF9tc2cgYW5kIG5vdGlmeSkgd2hlcmUgdGhlIHJlYWwKLSoJCVR4RmlkIGlzIHJldHJpZXZlZCBhbmQgdGhlIEhlcm1lcyBpcyBhY2tlZCBhbmQgLSBob3BlZnVsbHkgLSB0aGUgIm5vcm1hbCIgY2FzZSB3aXRoIGEgc3BhcmUgVHhGaWQKLSoJCWluIElGQl9Sc2NJbmQgaXMgcmVzdG9yZWQuCi0qCSAtCUluZm8gZHJvcCBldmVudHMgYXJlIGhhbmRsZWQgYnkgaW5jcmVtZW50aW5nIGEgdGFsbHkKLSoJIC0JTGlua0V2ZW50IChpbmNsdWRpbmcgc29saWNpdGVkIGFuZCB1bnNvbGljaXRlZCB0YWxsaWVzKSBhcmUgaGFuZGxlZCBieSBwcm9jZWR1cmUgaXNyX2luZm8uCi0qCS0JVHhFeCAoaWYgc2VsZWN0ZWQgYXQgY29tcGlsZSB0aW1lKSBpcyBoYW5kbGVkIGJ5IGNvcHlpbmcgdGhlIHNpZ25pZmljYW50IHBhcnQgb2YgdGhlIFR4RlMKLSoJCWludG8gdGhlIElGQiBmb3IgZnVydGhlciBwcm9jZXNzaW5nIGJ5IHRoZSBNU0YuCi0qCQlOb3RlIHRoZSBjb21wbGljYXRpb24gb2YgdGhlIHplcm8tRklEIHByb3RlY3Rpb24gc3ViLXNjaGVtZSBpbiBEQVdBLgotKglOb3RlLCB0aGUgQWNrIG9mIGFsbCBvZiBhYm92ZSBldmVudHMgaXMgaGFuZGxlZCBhdCB0aGUgZW5kIG9mIGhjZl9zZXJ2aWNlX25pYworKiAgIEhSRUdfRVZfVFhfRVhDIGlzIGFjY2VwdGVkICh2aWEgSFJFR19FVl9UWF9FWFQpIGlmIGFuZCBvbmx5IGlmIEhDRl9FWFRfSU5UX1RYX0VYIHNldCBpbiB0aGUgSENGX0VYVAorKiAgIGRlZmluaXRpb24gYXQgY29tcGlsZSB0aW1lLgorKiAgIFRoZSBmb2xsb3dpbmcgYWN0aXZpdGllcyBhcmUgaGFuZGxlZDoKKyogICAgLSAgQWxsb2MgZXZlbnRzIGFyZSBoYW5kbGVkIGJ5IGhjZl9zZW5kX21zZyAoYW5kIG5vdGlmeSkuIE9ubHkgaWYgdGhlcmUgaXMgbm8gInNwYXJlIiByZXNvdXJjZSwgdGhlCisqICAgICAgIGFsbG9jIGV2ZW50IGlzIHN1cGVyZmljaWFsbHkgc2VydmljZWQgYnkgaGNmX3NlcnZpY2VfbmljIHRvIGNyZWF0ZSBhIHBzZXVkby1yZXNvdXJjZSB3aXRoIHZhbHVlCisqICAgICAgIDB4MDAxLiBUaGlzIHZhbHVlIGlzIHJlY29nbml6ZWQgYnkgZ2V0X2ZpZCAoY2FsbGVkIGJ5IGhjZl9zZW5kX21zZyBhbmQgbm90aWZ5KSB3aGVyZSB0aGUgcmVhbAorKiAgICAgICBUeEZpZCBpcyByZXRyaWV2ZWQgYW5kIHRoZSBIZXJtZXMgaXMgYWNrZWQgYW5kIC0gaG9wZWZ1bGx5IC0gdGhlICJub3JtYWwiIGNhc2Ugd2l0aCBhIHNwYXJlIFR4RmlkCisqICAgICAgIGluIElGQl9Sc2NJbmQgaXMgcmVzdG9yZWQuCisqICAgIC0gIEluZm8gZHJvcCBldmVudHMgYXJlIGhhbmRsZWQgYnkgaW5jcmVtZW50aW5nIGEgdGFsbHkKKyogICAgLSAgTGlua0V2ZW50IChpbmNsdWRpbmcgc29saWNpdGVkIGFuZCB1bnNvbGljaXRlZCB0YWxsaWVzKSBhcmUgaGFuZGxlZCBieSBwcm9jZWR1cmUgaXNyX2luZm8uCisqICAgLSAgIFR4RXggKGlmIHNlbGVjdGVkIGF0IGNvbXBpbGUgdGltZSkgaXMgaGFuZGxlZCBieSBjb3B5aW5nIHRoZSBzaWduaWZpY2FudCBwYXJ0IG9mIHRoZSBUeEZTCisqICAgICAgIGludG8gdGhlIElGQiBmb3IgZnVydGhlciBwcm9jZXNzaW5nIGJ5IHRoZSBNU0YuCisqICAgICAgIE5vdGUgdGhlIGNvbXBsaWNhdGlvbiBvZiB0aGUgemVyby1GSUQgcHJvdGVjdGlvbiBzdWItc2NoZW1lIGluIERBV0EuCisqICAgTm90ZSwgdGhlIEFjayBvZiBhbGwgb2YgYWJvdmUgZXZlbnRzIGlzIGhhbmRsZWQgYXQgdGhlIGVuZCBvZiBoY2Zfc2VydmljZV9uaWMKICoxNjogSW4gY2FzZSBvZiAgbm9uLURNQSAoIGVpdGhlciBub3QgY29tcGlsZWQgaW4gb3IgZHVlIHRvIGEgcnVuLXRpbWUgY2hvaWNlKToKLSoJSWYgYW4gUngtZnJhbWUgaXMgYXZhaWxhYmxlLCBmaXJzdCB0aGUgRklEIG9mIHRoYXQgZnJhbWUgaXMgcmVhZCwgaW5jbHVkaW5nIHRoZSBjb21wbGljYXRpb24gb2YgdGhlCi0qCXplcm8tRklEIHByb3RlY3Rpb24gc3ViLXNjaGVtZSBpbiBEQVdBLiBOb3RlIHRoYXQgc3VjaCBhIHplcm8tRklEIGlzIGFja25vd2xlZGdlZCBhdCB0aGUgZW5kIG9mCi0qCWhjZl9zZXJ2aWNlX25pYyBhbmQgdGhhdCB0aGlzIGRlcGVuZHMgb24gdGhlIElGQl9SeExlbiBpbml0aWFsaXphdGlvbiBpbiB0aGUgYmVnaW4gb2YgaGNmX3NlcnZpY2VfbmljLgotKglUaGUgQXNzZXJ0IHZhbGlkYXRlcyB0aGUgSENGIGFzc3VtcHRpb24gYWJvdXQgSGVybWVzIGltcGxlbWVudGF0aW9uIHVwb24gd2hpY2ggdGhlIHJhbmdlIG9mCi0qCVBzZXVkby1SSURzIGlzIGJhc2VkLgotKglUaGVuIHRoZSBjb250cm9sIGZpZWxkcyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIDgwMi4zIGZyYW1lIGFyZSByZWFkIGZyb20gdGhlIE5JQyBpbnRvIHRoZSBsb29rYWhlYWQgYnVmZmVyLgotKglUaGUgc3RhdHVzIGZpZWxkIGlzIGNvbnZlcnRlZCB0byBuYXRpdmUgRW5kaWFuZXNzLgotKglUaGUgbGVuZ3RoIGlzLCBhZnRlciBpbXBsaWNpdCBFbmRpYW5lc3MgY29udmVyc2lvbiBpZiBuZWVkZWQsIGFuZCBhZGp1c3RtZW50IGZvciB0aGUgMTQgYnl0ZXMgb2YgdGhlCi0qCTgwMi4zIE1BQyBoZWFkZXIsIHN0b3JlZCBpbiBJRkJfUnhMZW4uCi0qCUluIE1BQyBNb25pdG9yIG1vZGUsIDgwMi4xMSBjb250cm9sIGZyYW1lcyB3aXRoIGEgVE9UQUwgbGVuZ3RoIG9mIDE0IGFyZSByZWNlaXZlZCwgc28gd2l0aG91dCB0aGlzCi0qCWxlbmd0aCBhZGp1c3RtZW50LCBJRkJfUnhMZW4gY291bGQgbm90IGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggdGhlc2UgZnJhbWVzIGZyb20gIm5vIGZyYW1lIi4KLSoJTm8gTUlDIGNhbGN1bGF0aW9uIHByb2Nlc3NlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWFkaW5nIG9mIHRoZXNlIENvbnRyb2wgZmllbGRzLgorKiAgIElmIGFuIFJ4LWZyYW1lIGlzIGF2YWlsYWJsZSwgZmlyc3QgdGhlIEZJRCBvZiB0aGF0IGZyYW1lIGlzIHJlYWQsIGluY2x1ZGluZyB0aGUgY29tcGxpY2F0aW9uIG9mIHRoZQorKiAgIHplcm8tRklEIHByb3RlY3Rpb24gc3ViLXNjaGVtZSBpbiBEQVdBLiBOb3RlIHRoYXQgc3VjaCBhIHplcm8tRklEIGlzIGFja25vd2xlZGdlZCBhdCB0aGUgZW5kIG9mCisqICAgaGNmX3NlcnZpY2VfbmljIGFuZCB0aGF0IHRoaXMgZGVwZW5kcyBvbiB0aGUgSUZCX1J4TGVuIGluaXRpYWxpemF0aW9uIGluIHRoZSBiZWdpbiBvZiBoY2Zfc2VydmljZV9uaWMuCisqICAgVGhlIEFzc2VydCB2YWxpZGF0ZXMgdGhlIEhDRiBhc3N1bXB0aW9uIGFib3V0IEhlcm1lcyBpbXBsZW1lbnRhdGlvbiB1cG9uIHdoaWNoIHRoZSByYW5nZSBvZgorKiAgIFBzZXVkby1SSURzIGlzIGJhc2VkLgorKiAgIFRoZW4gdGhlIGNvbnRyb2wgZmllbGRzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgODAyLjMgZnJhbWUgYXJlIHJlYWQgZnJvbSB0aGUgTklDIGludG8gdGhlIGxvb2thaGVhZCBidWZmZXIuCisqICAgVGhlIHN0YXR1cyBmaWVsZCBpcyBjb252ZXJ0ZWQgdG8gbmF0aXZlIEVuZGlhbmVzcy4KKyogICBUaGUgbGVuZ3RoIGlzLCBhZnRlciBpbXBsaWNpdCBFbmRpYW5lc3MgY29udmVyc2lvbiBpZiBuZWVkZWQsIGFuZCBhZGp1c3RtZW50IGZvciB0aGUgMTQgYnl0ZXMgb2YgdGhlCisqICAgODAyLjMgTUFDIGhlYWRlciwgc3RvcmVkIGluIElGQl9SeExlbi4KKyogICBJbiBNQUMgTW9uaXRvciBtb2RlLCA4MDIuMTEgY29udHJvbCBmcmFtZXMgd2l0aCBhIFRPVEFMIGxlbmd0aCBvZiAxNCBhcmUgcmVjZWl2ZWQsIHNvIHdpdGhvdXQgdGhpcworKiAgIGxlbmd0aCBhZGp1c3RtZW50LCBJRkJfUnhMZW4gY291bGQgbm90IGJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggdGhlc2UgZnJhbWVzIGZyb20gIm5vIGZyYW1lIi4KKyogICBObyBNSUMgY2FsY3VsYXRpb24gcHJvY2Vzc2VzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlYWRpbmcgb2YgdGhlc2UgQ29udHJvbCBmaWVsZHMuCiAqMjY6IFRoaXMgbGVuZ3RoIHRlc3QgZmVlbHMgbGlrZSBzdXBlcmZsdW91cyByb2J1c3RuZXNzIGFnYWluc3QgbWFsZm9ybWVkIGZyYW1lcywgYnV0IGl0IHR1cm5lZCBvdXQgdG8gYmUKLSoJbmVlZGVkIGluIHRoZSByZWFsIChob3N0aWxlKSB3b3JsZC4KLSoJVGhlIGRlY2Fwc3VsYXRpb24gY2hlY2sgbmVlZHMgc3VmZmljaWVudCBkYXRhIHRvIHJlcHJlc2VudCBEQSwgU0EsIEwsIFNOQVAgYW5kIFR5cGUgd2hpY2ggYW1vdW50cyB0bwotKgkyMiBieXRlcy4gSW4gTUFDIE1vbml0b3IgbW9kZSwgODAyLjExIGNvbnRyb2wgZnJhbWVzIHdpdGggYSBzbWFsbGVyIGxlbmd0aCBhcmUgcmVjZWl2ZWQuIFRvIHByZXZlbnQKLSoJdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gZ29lcyBoYXl3aXJlLCBhIGNoZWNrIG9uIHRoZSBsZW5ndGggaXMgbmVlZGVkLgotKglUaGUgYWN0dWFsIGRlY2Fwc3VsYXRpb24gdGFrZXMgcGxhY2Ugb24gdGhlIGZseSBpbiB0aGUgY29weWluZyBwcm9jZXNzIGJ5IG92ZXJ3cml0aW5nIHRoZSBTTkFQIGhlYWRlci4KLSoJTm90ZSB0aGF0IGluIGNhc2Ugb2YgZGVjYXBzdWxhdGlvbiB0aGUgU05BUCBoZWFkZXIgaXMgbm90IHBhc3NlZCB0byB0aGUgTVNGLCBoZW5jZSBJRkJfUnhMZW4gbXVzdCBiZQotKgljb21wZW5zYXRlZCBmb3IgdGhlIFNOQVAgaGVhZGVyIGxlbmd0aC4KLSoJVGhlIDIyIGJ5dGVzIG5lZWRlZCBmb3IgZGVjYXBzdWxhdGlvbiBhcmUgKG1vcmUgdGhhbikgc3VmZmljaWVudCBmb3IgdGhlIGV4Y2VwdGlvbmFsIGhhbmRsaW5nIG9mIHRoZQotKglNSUMgYWxnb3JpdGhtIG9mIHRoZSBMLWZpZWxkIChyZXBsYWNpbmcgdGhlIDIgYnl0ZSBMLWZpZWxkIHdpdGggNCAweDAwIGJ5dGVzKS4KLSozMDogVGhlIDEyIGluIHRoZSBuby1TU04gYnJhbmNoIGNvcnJlc3BvbmRzIHdpdGggdGhlIGdldF9mcmFnLCB0aGUgMiB3aXRoIHRoZSBJUFcgb2YgdGhlIFNTTiBicmFuY2gKKyogICBuZWVkZWQgaW4gdGhlIHJlYWwgKGhvc3RpbGUpIHdvcmxkLgorKiAgIFRoZSBkZWNhcHN1bGF0aW9uIGNoZWNrIG5lZWRzIHN1ZmZpY2llbnQgZGF0YSB0byByZXByZXNlbnQgREEsIFNBLCBMLCBTTkFQIGFuZCBUeXBlIHdoaWNoIGFtb3VudHMgdG8KKyogICAyMiBieXRlcy4gSW4gTUFDIE1vbml0b3IgbW9kZSwgODAyLjExIGNvbnRyb2wgZnJhbWVzIHdpdGggYSBzbWFsbGVyIGxlbmd0aCBhcmUgcmVjZWl2ZWQuIFRvIHByZXZlbnQKKyogICB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBnb2VzIGhheXdpcmUsIGEgY2hlY2sgb24gdGhlIGxlbmd0aCBpcyBuZWVkZWQuCisqICAgVGhlIGFjdHVhbCBkZWNhcHN1bGF0aW9uIHRha2VzIHBsYWNlIG9uIHRoZSBmbHkgaW4gdGhlIGNvcHlpbmcgcHJvY2VzcyBieSBvdmVyd3JpdGluZyB0aGUgU05BUCBoZWFkZXIuCisqICAgTm90ZSB0aGF0IGluIGNhc2Ugb2YgZGVjYXBzdWxhdGlvbiB0aGUgU05BUCBoZWFkZXIgaXMgbm90IHBhc3NlZCB0byB0aGUgTVNGLCBoZW5jZSBJRkJfUnhMZW4gbXVzdCBiZQorKiAgIGNvbXBlbnNhdGVkIGZvciB0aGUgU05BUCBoZWFkZXIgbGVuZ3RoLgorKiAgIFRoZSAyMiBieXRlcyBuZWVkZWQgZm9yIGRlY2Fwc3VsYXRpb24gYXJlIChtb3JlIHRoYW4pIHN1ZmZpY2llbnQgZm9yIHRoZSBleGNlcHRpb25hbCBoYW5kbGluZyBvZiB0aGUKKyogICBNSUMgYWxnb3JpdGhtIG9mIHRoZSBMLWZpZWxkIChyZXBsYWNpbmcgdGhlIDIgYnl0ZSBMLWZpZWxkIHdpdGggNCAweDAwIGJ5dGVzKS4KKyozMDogVGhlIDEyIGluIHRoZSBuby1XUEEgYnJhbmNoIGNvcnJlc3BvbmRzIHdpdGggdGhlIGdldF9mcmFnLCB0aGUgMiB3aXRoIHRoZSBJUFcgb2YgdGhlIFdQQSBicmFuY2gKICozMjogSWYgSGVybWVzIHJlcG9ydGVkIE1JQy1wcmVzZW5jZSwgdGhhbiB0aGUgTUlDIGVuZ2luZSBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBub24tZHVtbXkgTUlDIGNhbGN1bGF0aW9uCi0qCXJvdXRpbmUgYWRkcmVzcyBhbmQgYXBwcm9wcmlhdGUga2V5LgorKiAgIHJvdXRpbmUgYWRkcmVzcyBhbmQgYXBwcm9wcmlhdGUga2V5LgogKjM0OiBUaGUgOCBieXRlcyBhZnRlciB0aGUgREEsIFNBLCBMIGFyZSByZWFkIGFuZCBpdCBpcyBjaGVja2VkIHdoZXRoZXIgZGVjYXBzdWxhdGlvbiBpcyBuZWVkZWQgaS5lLjoKLSoJICAtIHRoZSBIZXJtZXMgcmVwb3J0ZWQgVHVubmVsIGVuY2Fwc3VsYXRpb24gb3IKLSoJICAtIHRoZSBIZXJtZXMgcmVwb3J0ZWQgMTA0MiBFbmNhcHN1bGF0aW9uIGFuZCBoY2ZfZW5jYXAgcmVwb3J0cyB0aGF0IHRoZSBIQ0Ygd291bGQgbm90IGhhdmUgdXNlZAotKgkJMTA0MiBhcyB0aGUgZW5jYXBzdWxhdGlvbiBtZWNoYW5pc20KLSoJTm90ZSB0aGF0IHRoZSBmaXJzdCBmaWVsZCBvZiB0aGUgUnhGUyBpbiBidWZwIGhhcyBOYXRpdmUgRW5kaWFuZXNzIGR1ZSB0byB0aGUgY29udmVyc2lvbiBkb25lIGJ5IHRoZQotKglCRV9QQVIgaW4gZ2V0X2ZyYWcuCisqICAgICAtIHRoZSBIZXJtZXMgcmVwb3J0ZWQgVHVubmVsIGVuY2Fwc3VsYXRpb24gb3IKKyogICAgIC0gdGhlIEhlcm1lcyByZXBvcnRlZCAxMDQyIEVuY2Fwc3VsYXRpb24gYW5kIGhjZl9lbmNhcCByZXBvcnRzIHRoYXQgdGhlIEhDRiB3b3VsZCBub3QgaGF2ZSB1c2VkCisqICAgICAgIDEwNDIgYXMgdGhlIGVuY2Fwc3VsYXRpb24gbWVjaGFuaXNtCisqICAgTm90ZSB0aGF0IHRoZSBmaXJzdCBmaWVsZCBvZiB0aGUgUnhGUyBpbiBidWZwIGhhcyBOYXRpdmUgRW5kaWFuZXNzIGR1ZSB0byB0aGUgY29udmVyc2lvbiBkb25lIGJ5IHRoZQorKiAgIEJFX1BBUiBpbiBnZXRfZnJhZy4KICozNjogVGhlIFR5cGUgZmllbGQgaXMgdGhlIG9ubHkgd29yZCBrZXB0IChhZnRlciBtb3ZpbmcpIG9mIHRoZSBqdXN0IHJlYWQgOCBieXRlcywgaXQgaXMgbW92ZWQgdG8gdGhlCi0qCUwtZmllbGQuICBUaGUgb3JpZ2luYWwgTC1maWVsZCBhbmQgNiBieXRlIFNOQVAgaGVhZGVyIGFyZSBkaXNjYXJkZWQsIHNvIElGQl9SeExlbiBhbmQgYnVmX2FkZHIgbXVzdAotKgliZSBhZGp1c3RlZCBieSA4LgorKiAgIEwtZmllbGQuICBUaGUgb3JpZ2luYWwgTC1maWVsZCBhbmQgNiBieXRlIFNOQVAgaGVhZGVyIGFyZSBkaXNjYXJkZWQsIHNvIElGQl9SeExlbiBhbmQgYnVmX2FkZHIgbXVzdAorKiAgIGJlIGFkanVzdGVkIGJ5IDguCiAqNDA6IERldGVybWluZSBob3cgbXVjaCBvZiB0aGUgZnJhbWUgKHN0YXJ0aW5nIHdpdGggREEpIGZpdHMgaW4gdGhlIExvb2thaGVhZCBidWZmZXIsIHRoZW4gcmVhZCB0aGUgbm90LXlldAotKglyZWFkIGRhdGEgaW50byB0aGUgbG9va2FoZWFkIGJ1ZmZlci4KLSoJSWYgdGhlIGxvb2thaGVhZCBidWZmZXIgY29udGFpbnMgdGhlIGNvbXBsZXRlIG1lc3NhZ2UsIGNoZWNrIHRoZSBNSUMuIFRoZSBtYWpvcml0eSBjb25zaWRlcmVkIHRoaXMKLSoJSS9GIG1vcmUgYXBwcm9wcmlhdGUgdGhlbiBoYXZlIHRoZSBNU0YgY2FsbCBoY2ZfZ2V0X2RhdGEgb25seSB0byBjaGVjayB0aGUgTUlDLgorKiAgIHJlYWQgZGF0YSBpbnRvIHRoZSBsb29rYWhlYWQgYnVmZmVyLgorKiAgIElmIHRoZSBsb29rYWhlYWQgYnVmZmVyIGNvbnRhaW5zIHRoZSBjb21wbGV0ZSBtZXNzYWdlLCBjaGVjayB0aGUgTUlDLiBUaGUgbWFqb3JpdHkgY29uc2lkZXJlZCB0aGlzCisqICAgSS9GIG1vcmUgYXBwcm9wcmlhdGUgdGhlbiBoYXZlIHRoZSBNU0YgY2FsbCBoY2ZfZ2V0X2RhdGEgb25seSB0byBjaGVjayB0aGUgTUlDLgogKjQ0OiBTaW5jZSB0aGUgY29tcGxldGUgbWVzc2FnZSBpcyBjb3BpZWQgZnJvbSBOSUMgUkFNIHRvIFBDIFJBTSwgdGhlIFJ4IGNhbiBiZSBhY2tub3dsZWRnZWQgdG8gdGhlIEhlcm1lcwotKgl0byBvcHRpbWl6ZSB0aGUgZmxvdyAoIGEgYmV0dGVyIGNoYW5jZSB0byBnZXQgbmV3IFJ4IGRhdGEgaW4gdGhlIG5leHQgcGFzcyB0aHJvdWdoIGhjZl9zZXJ2aWNlX25pYyApLgotKglUaGlzIGFja25vd2xlZGdlbWVudCBjYW4gbm90IGJlIGRvbmUgdmlhIGhjZl9hY3Rpb24oIEhDRl9BQ1RfUlhfQUNLICkgYmVjYXVzZSB0aGlzIGFsc28gY2xlYXJzCi0qCUlGQl9SeExFTiB0aHVzIGNvcnJ1cHRpbmcgdGhlIEkvRiB0byB0aGUgTVNGLgorKiAgIHRvIG9wdGltaXplIHRoZSBmbG93ICggYSBiZXR0ZXIgY2hhbmNlIHRvIGdldCBuZXcgUnggZGF0YSBpbiB0aGUgbmV4dCBwYXNzIHRocm91Z2ggaGNmX3NlcnZpY2VfbmljICkuCisqICAgVGhpcyBhY2tub3dsZWRnZW1lbnQgY2FuIG5vdCBiZSBkb25lIHZpYSBoY2ZfYWN0aW9uKCBIQ0ZfQUNUX1JYX0FDSyApIGJlY2F1c2UgdGhpcyBhbHNvIGNsZWFycworKiAgIElGQl9SeExFTiB0aHVzIGNvcnJ1cHRpbmcgdGhlIEkvRiB0byB0aGUgTVNGLgogKjs/OiBJbiBjYXNlIG9mIERNQSAoY29tcGlsZWQgaW4gYW5kIGFjdGl2YXRlZCk6CiAKIAogKjU0OiBMaW1pdGluZyB0aGUgbnVtYmVyIG9mIHBsYWNlcyB3aGVyZSB0aGUgRi9XIGlzIGFja2VkIChlLmcuIHRoZSBtZXJnaW5nIG9mIHRoZSBSeC1BQ0sgd2l0aCB0aGUgb3RoZXIKLSoJQUNLcyksIGlzIHN1cHBvc2VkIHRvIGRpbWluaXNoIHRoZSBwb3RlbnRpYWwgb2YgcmFjZSBjb25kaXRpb25zIGluIHRoZSBGL1cuCi0qCU5vdGUgMTogVGhlIENNRCBldmVudCBpcyBhY2tub3dsZWRnZWQgaW4gY21kX2NtcGwKLSoJTm90ZSAyOiBIUkVHX0VWX0FDS19SRUdfUkVBRFkgaXMgMHgwMDAwIGZvciBILUkgKGFuZCBob3BlZnVsbHkgSC1JSS41KQotKglOb3RlIDM6IFRoZSBBTExPQyBldmVudCBpcyBhY2tub3dsZWRnZWQgaW4gZ2V0X2ZpZCAoZXhjZXB0IGZvciB0aGUgaW5pdGlhbGl6YXRpb24gZmxvdykKKyogICBBQ0tzKSwgaXMgc3VwcG9zZWQgdG8gZGltaW5pc2ggdGhlIHBvdGVudGlhbCBvZiByYWNlIGNvbmRpdGlvbnMgaW4gdGhlIEYvVy4KKyogICBOb3RlIDE6IFRoZSBDTUQgZXZlbnQgaXMgYWNrbm93bGVkZ2VkIGluIGNtZF9jbXBsCisqICAgTm90ZSAyOiBIUkVHX0VWX0FDS19SRUdfUkVBRFkgaXMgMHgwMDAwIGZvciBILUkgKGFuZCBob3BlZnVsbHkgSC1JSS41KQorKiAgIE5vdGUgMzogVGhlIEFMTE9DIGV2ZW50IGlzIGFja25vd2xlZGdlZCBpbiBnZXRfZmlkIChleGNlcHQgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmbG93KQogKgogKi5OT1RJQ0UKICogVGhlIE5vbi1ETUEgSFJFR19FVl9SWCBpcyBoYW5kbGVkIGRpZmZlcmVudCBjb21wYXJlZCB3aXRoIHRoZSBvdGhlciBGL1cgZXZlbnRzLgpAQCAtMzA0Nyw1MSArMjkyNiw1MSBAQAogKgogKi5OT1RJQ0UKICogVGhlIG1pbmltdW0gc2l6ZSBmb3IgTGVuIG11c3Qgc3VwcGx5IHNwYWNlIGZvcjoKLSogLQlhbiBGL1cgZGVwZW5kZW50IG51bWJlciBvZiBieXRlcyBvZiBDb250cm9sIEluZm8gZmllbGQgaW5jbHVkaW5nIHRoZSA4MDIuMTEgSGVhZGVyIGZpZWxkCi0qIC0JRGVzdGluYXRpb24gQWRkcmVzcwotKiAtCVNvdXJjZSBBZGRyZXNzCi0qIC0JTGVuZ3RoIGZpZWxkCi0qIC0JWyBTTkFQIEhlYWRlcl0KLSogLQlbIEV0aGVybmV0LUlJIFR5cGVdCisqIC0gYW4gRi9XIGRlcGVuZGVudCBudW1iZXIgb2YgYnl0ZXMgb2YgQ29udHJvbCBJbmZvIGZpZWxkIGluY2x1ZGluZyB0aGUgODAyLjExIEhlYWRlciBmaWVsZAorKiAtIERlc3RpbmF0aW9uIEFkZHJlc3MKKyogLSBTb3VyY2UgQWRkcmVzcworKiAtIExlbmd0aCBmaWVsZAorKiAtIFsgU05BUCBIZWFkZXJdCisqIC0gWyBFdGhlcm5ldC1JSSBUeXBlXQogKiBUaGlzIHJlc3VsdHMgaW4gNjggZm9yIEhlcm1lcy1JIGFuZCA4MCBmb3IgSGVybWVzLUlJCiAqIFRoaXMgd2F5IHRoZSBtaW5pbXVtIGFtb3VudCBvZiBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUgbmVlZGVkIGJ5IHRoZSBIQ0YgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGZyYW1lCiAqIG11c3QgYmUgZGVjYXBzdWxhdGVkLgotKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KKyouRU5ERE9DICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbnQKIGhjZl9zZXJ2aWNlX25pYyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCB1bnNpZ25lZCBpbnQgbGVuICkKIHsKIAotaW50CQkJcmMgPSBIQ0ZfU1VDQ0VTUzsKLWhjZl8xNgkJc3RhdDsKLXdjaV9idWZwCWJ1Zl9hZGRyOwotaGNmXzE2IAkJaTsKKwlpbnQgICAgICAgICByYyA9IEhDRl9TVUNDRVNTOworCWhjZl8xNiAgICAgIHN0YXQ7CisJd2NpX2J1ZnAgICAgYnVmX2FkZHI7CisJaGNmXzE2ICAgICAgaTsKIAotCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfU0VSVklDRV9OSUMsIGlmYnAtPklGQl9JbnRPZmZDbnQgKQotCUhDRkFTU0VSVCggaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQywgaWZicC0+SUZCX01hZ2ljICkKLQlIQ0ZBU1NFUlRfSU5UCisJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9TRVJWSUNFX05JQywgaWZicC0+SUZCX0ludE9mZkNudCApOworCUhDRkFTU0VSVCggaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQywgaWZicC0+SUZCX01hZ2ljICk7CisJSENGQVNTRVJUX0lOVDsKIAotCWlmYnAtPklGQl9MaW5rU3RhdCA9IDA7IC8vIDs/IHRvIGJlIG9ic29sZXRlZCBBU0FQCQkJCQkJCQkJCQkJLyogMSovCi0JaWZicC0+SUZCX0RTTGlua1N0YXQgJj0gfkNGR19MSU5LX1NUQVRfQ0hBTkdFOwkJCQkJCQkJCQkJCQkvKiAxKi8KLQkodm9pZCloY2ZfYWN0aW9uKCBpZmJwLCBIQ0ZfQUNUX1JYX0FDSyApOwkJCQkJCQkJCQkJCQkJLyogMiovCi0JaWYgKCBpZmJwLT5JRkJfQ2FyZFN0YXQgPT0gMCAmJiAoIHN0YXQgPSBJUFcoIEhSRUdfRVZfU1RBVCApICkgIT0gMHhGRkZGICkgewkJCQkJLyogNCovCisJaWZicC0+SUZCX0xpbmtTdGF0ID0gMDsgLy8gOz8gdG8gYmUgb2Jzb2xldGVkIEFTQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMSovCisJaWZicC0+SUZCX0RTTGlua1N0YXQgJj0gfkNGR19MSU5LX1NUQVRfQ0hBTkdFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMSovCisJKHZvaWQpaGNmX2FjdGlvbiggaWZicCwgSENGX0FDVF9SWF9BQ0sgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMiovCisJaWYgKCBpZmJwLT5JRkJfQ2FyZFN0YXQgPT0gMCAmJiAoIHN0YXQgPSBJUFcoIEhSRUdfRVZfU1RBVCApICkgIT0gMHhGRkZGICkgeyAgICAgICAgICAgICAgICAgICAgLyogNCovCiAvKgkJSUZfTk9UX0RNQSggSENGQVNTRVJUKCAhKCBzdGF0ICYgfkhSRUdfRVZfQkFTSUNfTUFTSywgc3RhdCApICkKICAqCQlJRl9OT1RfVVNFX0RNQSggSENGQVNTRVJUKCAhKCBzdGF0ICYgfkhSRUdfRVZfQkFTSUNfTUFTSywgc3RhdCApICkKICAqCQlJRl9VU0VfRE1BKCBIQ0ZBU1NFUlQoICEoIHN0YXQgJiB+KCBIUkVHX0VWX0JBU0lDX01BU0sgXiAoIEhSRUdfRVZfLi4uRE1BLi4uLiApLCBzdGF0ICkgKQogICovCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLyogOCovCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4Ki8KIAkJaWYgKCBpZmJwLT5JRkJfUnNjSW5kID09IDAgJiYgc3RhdCAmIEhSRUdfRVZfQUxMT0MgKSB7IC8vTm90ZTogSUZCX1JzY0luZCBpcyBBTFdBWVMgMSBmb3IgRE1BCiAJCQlpZmJwLT5JRkJfUnNjSW5kID0gMTsKIAkJfQotCQlJRl9UQUxMWSggaWYgKCBzdGF0ICYgSFJFR19FVl9JTkZPX0RST1AgKSBpZmJwLT5JRkJfSENGX1RhbGxpZXMuTm9CdWZJbmZvKys7ICkKKwkJSUZfVEFMTFkoIGlmICggc3RhdCAmIEhSRUdfRVZfSU5GT19EUk9QICkgeyBpZmJwLT5JRkJfSENGX1RhbGxpZXMuTm9CdWZJbmZvKys7IH0gKTsKICNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX0lOVF9USUNLCiAJCWlmICggc3RhdCAmIEhSRUdfRVZfVElDSyApIHsKIAkJCWlmYnAtPklGQl9UaWNrQ250Kys7CiAJCX0KICNpZiAwIC8vIChIQ0ZfU0xFRVApICYgSENGX0REUwogCQlpZiAoIGlmYnAtPklGQl9UaWNrQ250ID09IDMgJiYgKCBpZmJwLT5JRkJfRFNMaW5rU3RhdCAmIENGR19MSU5LX1NUQVRfQ09OTkVDVEVEICkgPT0gMCApIHsKLUNGR19ERFNfVElDS19USU1FX1NUUkNUIGx0djsKKwkJCUNGR19ERFNfVElDS19USU1FX1NUUkNUIGx0djsKIAkJCS8vIDIgc2Vjb25kIHBlcmlvZCAod2l0aCAxIHRpY2sgdW5jZXJ0YW50eSkgaW4gbm90LWNvbm5lY3RlZCBtb2RlIC0tPmdvIGludG8gRFNfT09SCiAJCQloY2ZfYWN0aW9uKCBpZmJwLCBIQ0ZfQUNUX1NMRUVQICk7CiAJCQlpZmJwLT5JRkJfRFNMaW5rU3RhdCB8PSBDRkdfTElOS19TVEFUX0RTX09PUjsgLy9zZXQgT3V0T2ZSYW5nZQpAQCAtMzEwMCw3ICsyOTc5LDcgQEAKIAkJCWx0di50aWNrX3RpbWUgPSAoICggaWZicC0+SUZCX0RTTGlua1N0YXQgJiBDRkdfTElOS19TVEFUX1RJTUVSICkgKyAweDEwICkgKjY0OyAvLzc4IGlzIG1vcmUgcmlnaHQKIAkJCWhjZl9wdXRfaW5mbyggaWZicCwgKExUVlApJmx0diApOwogCQkJcHJpbnRrKCAiPDU+UHJlcGFyaW5nIGZvciBzbGVlcCwgbGlua19zdGF0dXM6ICUwNFgsIHRpbWVyIDogJWRcbiIsCi0JCQkJCWlmYnAtPklGQl9EU0xpbmtTdGF0LCBsdHYudGlja190aW1lICk7Ly87P3JlbW92ZSBtZSAxIGRheQorCQkJCWlmYnAtPklGQl9EU0xpbmtTdGF0LCBsdHYudGlja190aW1lICk7Ly87P3JlbW92ZSBtZSAxIGRheQogCQkJaWZicC0+SUZCX1RpY2tDbnQrKzsgLy87P2p1c3QgdG8gbWFrZSBzdXJlIHdlIGRvIG5vdCBrZWVwIG9uIHByaW50aW5nIGFib3ZlIG1lc3NhZ2UKIAkJCWlmICggbHR2LnRpY2tfdGltZSA8IDMwMCAqIDEyNSApIGlmYnAtPklGQl9EU0xpbmtTdGF0ICs9IDB4MDAxMDsKIApAQCAtMzExMiw3ICsyOTkxLDcgQEAKIAkJfQogI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfSU5UX1RYX0VYCiAJCWlmICggc3RhdCAmIEhSRUdfRVZfVFhfRVhUICYmICggaSA9IElQVyggSFJFR19UWF9DT01QTF9GSUQgKSApICE9IDAgLypEQVdBKi8gKSB7Ci0JCQlEQVdBX1pFUk9fRklEKCBIUkVHX1RYX0NPTVBMX0ZJRCApCisJCQlEQVdBX1pFUk9fRklEKCBIUkVHX1RYX0NPTVBMX0ZJRCApOwogCQkJKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBpLCAwLCBJT19JTiApOwogCQkJZ2V0X2ZyYWcoIGlmYnAsICZpZmJwLT5JRkJfVHhGc1N0YXQsIEhGU19TV1NVUCBCRV9QQVIoMSkgKTsKIAkJfQpAQCAtMzEyMSwxMTAgKzMwMDAsMTAzIEBACiAjaWYgSENGX0RNQQogCQlpZiAoICEoIGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSApICkgLy8hISBiZSBhd2FyZSBvZiB0aGUgbG9naWNhbCBpbmRlbnRhdGlvbnMKICNlbmRpZiAvLyBIQ0ZfRE1BCi0vKjE2Ki8JICBpZiAoIHN0YXQgJiBIUkVHX0VWX1JYICYmICggaWZicC0+SUZCX1J4RklEID0gSVBXKCBIUkVHX1JYX0ZJRCApICkgIT0gMCApIHsgLy9pZiAwIHRoZW4gREFXQV9BQ0sKLQkJCUhDRkFTU0VSVCggYnVmcCwgbGVuICkKLQkJCUhDRkFTU0VSVCggbGVuID49IEhGU19EQVQgKyAyLCBsZW4gKQotCQkJREFXQV9aRVJPX0ZJRCggSFJFR19SWF9GSUQgKQotCQkJSENGQVNTRVJUKCBpZmJwLT5JRkJfUnhGSUQgPCBDRkdfUFJPRF9EQVRBLCBpZmJwLT5JRkJfUnhGSUQpCi0JCQkodm9pZClzZXR1cF9iYXAoIGlmYnAsIGlmYnAtPklGQl9SeEZJRCwgMCwgSU9fSU4gKTsKLQkJCWdldF9mcmFnKCBpZmJwLCBidWZwLCBIRlNfQUREUl9ERVNUIEJFX1BBUigxKSApOwotCQkJaWZicC0+SUZCX2xhcCA9IGJ1Zl9hZGRyID0gYnVmcCArIEhGU19BRERSX0RFU1Q7Ci0JCQlpZmJwLT5JRkJfUnhMZW4gPSAoaGNmXzE2KShidWZwW0hGU19EQVRfTEVOXSArIChidWZwW0hGU19EQVRfTEVOKzFdPDw4KSArIDIqNiArIDIpOwotLyoyNiovCQlpZiAoIGlmYnAtPklGQl9SeExlbiA+PSAyMiApIHsJCS8vIGNvbnZlbmllbnQgZm9yIE1JQyBjYWxjdWxhdGlvbiAoNSBEV3MgKyAxICJza2lwcGVkIiBXKQotCQkJCQkJCQkJCQkJLy8uICBnZXQgREEsU0EsTGVuL1R5cGUgYW5kIChTTkFQLFR5cGUgb3IgOCBkYXRhIGJ5dGVzKQotLyozMCovCQkJZ2V0X2ZyYWcoIGlmYnAsIGJ1Zl9hZGRyLCAyMiBCRV9QQVIoMCkgKTsKLS8qMzIqLwkJCUNBTENfUlhfTUlDKCBidWZwLCAtMSApOwkJLy8uICBpbml0aWFsaXplIE1JQwotCQkJCUNBTENfUlhfTUlDKCBidWZfYWRkciwgSENGX0RBU0FfU0laRSApOwkvLy4gIE1JQyBvdmVyIERBLCBTQQotCQkJCUNBTENfUlhfTUlDKCBudWxsX2FkZHIsIDQgKTsJLy8uICBNSUMgb3ZlciAodmlydHVhbCkgcHJpb3JpdHkgZmllbGQKLQkJCQlDQUxDX1JYX01JQyggYnVmX2FkZHIrMTQsIDggKTsJLy8uICBza2lwIExlbiwgTUlDIG92ZXIgU05BUCxUeXBlIG9yIDggZGF0YSBieXRlcykKLQkJCQlidWZfYWRkciArPSAyMjsKLSNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfQ0NYCi0vLyEhYmUgY2FyZWZ1bCBkbyBub3QgdXNlIHBvc2l0aXZlIHRlc3Qgb24gSENGX0FDVF9DQ1hfT0ZGLCBiZWNhdXNlIElGQl9DS0lQU3RhdCBpcyBpbml0aWFsbHkgMAotCQkJCWlmKCBpZmJwLT5JRkJfQ0tJUFN0YXQgIT0gSENGX0FDVF9DQ1hfT04gICkKLSNlbmRpZiAvLyBIQ0ZfVFlQRV9DQ1gKLQkJCQl7CisJCS8qMTYqLyAgaWYgKCBzdGF0ICYgSFJFR19FVl9SWCAmJiAoIGlmYnAtPklGQl9SeEZJRCA9IElQVyggSFJFR19SWF9GSUQgKSApICE9IDAgKSB7IC8vaWYgMCB0aGVuIERBV0FfQUNLCisJCQkJSENGQVNTRVJUKCBidWZwLCBsZW4gKTsKKwkJCQlIQ0ZBU1NFUlQoIGxlbiA+PSBIRlNfREFUICsgMiwgbGVuICk7CisJCQkJREFXQV9aRVJPX0ZJRCggSFJFR19SWF9GSUQgKTsKKwkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9SeEZJRCA8IENGR19QUk9EX0RBVEEsIGlmYnAtPklGQl9SeEZJRCk7CisJCQkJKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBpZmJwLT5JRkJfUnhGSUQsIDAsIElPX0lOICk7CisJCQkJZ2V0X2ZyYWcoIGlmYnAsIGJ1ZnAsIEhGU19BRERSX0RFU1QgQkVfUEFSKDEpICk7CisJCQkJaWZicC0+SUZCX2xhcCA9IGJ1Zl9hZGRyID0gYnVmcCArIEhGU19BRERSX0RFU1Q7CisJCQkJaWZicC0+SUZCX1J4TGVuID0gKGhjZl8xNikoYnVmcFtIRlNfREFUX0xFTl0gKyAoYnVmcFtIRlNfREFUX0xFTisxXTw8OCkgKyAyKjYgKyAyKTsKKwkJCS8qMjYqLyAgaWYgKCBpZmJwLT5JRkJfUnhMZW4gPj0gMjIgKSB7ICAvLyBjb252ZW5pZW50IGZvciBNSUMgY2FsY3VsYXRpb24gKDUgRFdzICsgMSAic2tpcHBlZCIgVykKKwkJCQkJCQkJLy8uICBnZXQgREEsU0EsTGVuL1R5cGUgYW5kIChTTkFQLFR5cGUgb3IgOCBkYXRhIGJ5dGVzKQorCQkJCS8qMzAqLyAgZ2V0X2ZyYWcoIGlmYnAsIGJ1Zl9hZGRyLCAyMiBCRV9QQVIoMCkgKTsKKwkJCQkvKjMyKi8gIENBTENfUlhfTUlDKCBidWZwLCAtMSApOyAgICAgICAgLy8uICBpbml0aWFsaXplIE1JQworCQkJCQlDQUxDX1JYX01JQyggYnVmX2FkZHIsIEhDRl9EQVNBX1NJWkUgKTsgLy8uICBNSUMgb3ZlciBEQSwgU0EKKwkJCQkJQ0FMQ19SWF9NSUMoIG51bGxfYWRkciwgNCApOyAgICAvLy4gIE1JQyBvdmVyICh2aXJ0dWFsKSBwcmlvcml0eSBmaWVsZAorCQkJCQlDQUxDX1JYX01JQyggYnVmX2FkZHIrMTQsIDggKTsgIC8vLiAgc2tpcCBMZW4sIE1JQyBvdmVyIFNOQVAsVHlwZSBvciA4IGRhdGEgYnl0ZXMpCisJCQkJCWJ1Zl9hZGRyICs9IDIyOwogI2lmIChIQ0ZfRU5DQVApID09IEhDRl9FTkMKLQkJCQkJSENGQVNTRVJUKCBsZW4gPj0gSEZTX0RBVCArIDIgKyBzaXplb2Yoc25hcF9oZWFkZXIpLCBsZW4gKQotLyozNCovIAkJCQlpID0gKih3Y2lfcmVjb3JkcCkmYnVmcFtIRlNfU1RBVF0gJiAoIEhGU19TVEFUX01TR19UWVBFIHwgSEZTX1NUQVRfRVJSICk7CisJCQkJCUhDRkFTU0VSVCggbGVuID49IEhGU19EQVQgKyAyICsgc2l6ZW9mKHNuYXBfaGVhZGVyKSwgbGVuICk7CisJCQkJLyozNCovICBpID0gKih3Y2lfcmVjb3JkcCkmYnVmcFtIRlNfU1RBVF0gJiAoIEhGU19TVEFUX01TR19UWVBFIHwgSEZTX1NUQVRfRVJSICk7CiAJCQkJCWlmICggaSA9PSBIRlNfU1RBVF9UVU5ORUwgfHwKLQkJCQkJCSAoIGkgPT0gSEZTX1NUQVRfMTA0MiAmJiBoY2ZfZW5jYXAoICh3Y2lfYnVmcCkmYnVmcFtIRlNfVFlQRV0gKSAhPSBFTkNfVFVOTkVMICkgKSB7Ci0JCQkJCQkJCQkJCQkvLy4gIGNvcHkgRS1JSSBUeXBlIHRvIDgwMi4zIExFTiBmaWVsZAotLyozNiovCQkJCQlidWZwW0hGU19MRU4gIF0gPSBidWZwW0hGU19UWVBFICBdOworCQkJCQkgICAgICggaSA9PSBIRlNfU1RBVF8xMDQyICYmIGhjZl9lbmNhcCggKHdjaV9idWZwKSZidWZwW0hGU19UWVBFXSApICE9IEVOQ19UVU5ORUwgKSApIHsKKwkJCQkJCQkgICAgICAgICAgICAgICAgLy8uICBjb3B5IEUtSUkgVHlwZSB0byA4MDIuMyBMRU4gZmllbGQKKwkJCQkvKjM2Ki8gIGJ1ZnBbSEZTX0xFTiAgXSA9IGJ1ZnBbSEZTX1RZUEUgIF07CiAJCQkJCQlidWZwW0hGU19MRU4rMV0gPSBidWZwW0hGU19UWVBFKzFdOwotCQkJCQkJCQkJCQkJLy8uICBkaXNjYXJkIFNuYXAgYnkgb3ZlcndyaXRpbmcgd2l0aCBkYXRhCisJCQkJCQkJICAgICAgICAgICAgICAgIC8vLiAgZGlzY2FyZCBTbmFwIGJ5IG92ZXJ3cml0aW5nIHdpdGggZGF0YQogCQkJCQkJaWZicC0+SUZCX1J4TGVuIC09IChIRlNfVFlQRSAtIEhGU19MRU4pOwogCQkJCQkJYnVmX2FkZHIgLT0gKCBIRlNfVFlQRSAtIEhGU19MRU4gKTsgLy8gdGhpcyBoYXBwZW5zIHRvIGJyaW5nIHVzIGF0IGEgRFcgYm91bmRhcnkgb2YgMzYKIAkJCQkJfQogI2VuZGlmIC8vIEhDRl9FTkMKIAkJCQl9Ci0JCQl9Ci0vKjQwKi8JCWlmYnAtPklGQl9sYWwgPSBtaW4oIChoY2ZfMTYpKGxlbiAtIEhGU19BRERSX0RFU1QpLCBpZmJwLT5JRkJfUnhMZW4gKTsKLQkJCWkgPSBpZmJwLT5JRkJfbGFsIC0gKCBidWZfYWRkciAtICggYnVmcCArIEhGU19BRERSX0RFU1QgKSApOwotCQkJZ2V0X2ZyYWcoIGlmYnAsIGJ1Zl9hZGRyLCBpIEJFX1BBUigwKSApOwotCQkJQ0FMQ19SWF9NSUMoIGJ1Zl9hZGRyLCBpICk7CisJCQkvKjQwKi8gIGlmYnAtPklGQl9sYWwgPSBtaW4oIChoY2ZfMTYpKGxlbiAtIEhGU19BRERSX0RFU1QpLCBpZmJwLT5JRkJfUnhMZW4gKTsKKwkJCQlpID0gaWZicC0+SUZCX2xhbCAtICggYnVmX2FkZHIgLSAoIGJ1ZnAgKyBIRlNfQUREUl9ERVNUICkgKTsKKwkJCQlnZXRfZnJhZyggaWZicCwgYnVmX2FkZHIsIGkgQkVfUEFSKDApICk7CisJCQkJQ0FMQ19SWF9NSUMoIGJ1Zl9hZGRyLCBpICk7CiAjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQotCQkJaWYgKCBpZmJwLT5JRkJfbGFsID09IGlmYnAtPklGQl9SeExlbiApIHsKLQkJCQlyYyA9IGNoZWNrX21pYyggaWZicCApOwotCQkJfQorCQkJCWlmICggaWZicC0+SUZCX2xhbCA9PSBpZmJwLT5JRkJfUnhMZW4gKSB7CisJCQkJCXJjID0gY2hlY2tfbWljKCBpZmJwICk7CisJCQkJfQogI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQotLyo0NCovCQlpZiAoIGxlbiAtIEhGU19BRERSX0RFU1QgPj0gaWZicC0+SUZCX1J4TGVuICkgewotCQkJCWlmYnAtPklGQl9SeEZJRCA9IDA7Ci0JCQl9IGVsc2UgeyAvKiBJRkJfUnhGSUQgaXMgY2xlYXJlZCwgc28gIHlvdSBkbyBub3QgZ2V0IGFub3RoZXIgUnhfQWNrIGF0IG5leHQgZW50cnkgb2YgaGNmX3NlcnZpY2VfbmljICovCi0JCQkJc3RhdCAmPSAoaGNmXzE2KX5IUkVHX0VWX1JYOwkvL2Rvbid0IGFjayBSeCBpZiBwcm9jZXNzaW5nIG5vdCB5ZXQgY29tcGxldGVkCisJCQkvKjQ0Ki8gIGlmICggbGVuIC0gSEZTX0FERFJfREVTVCA+PSBpZmJwLT5JRkJfUnhMZW4gKSB7CisJCQkJCWlmYnAtPklGQl9SeEZJRCA9IDA7CisJCQkJfSBlbHNlIHsgLyogSUZCX1J4RklEIGlzIGNsZWFyZWQsIHNvICB5b3UgZG8gbm90IGdldCBhbm90aGVyIFJ4X0FjayBhdCBuZXh0IGVudHJ5IG9mIGhjZl9zZXJ2aWNlX25pYyAqLworCQkJCQlzdGF0ICY9IChoY2ZfMTYpfkhSRUdfRVZfUlg7ICAgIC8vZG9uJ3QgYWNrIFJ4IGlmIHByb2Nlc3Npbmcgbm90IHlldCBjb21wbGV0ZWQKKwkJCQl9CiAJCQl9Ci0JCX0KIAkJLy8gaW4gY2FzZSBvZiBETUE6IHNpZ25hbCBhdmFpbGFiaWxpdHkgb2YgcnggYW5kL29yIHR4IHBhY2tldHMgdG8gTVNGCi0JCUlGX1VTRV9ETUEoIGlmYnAtPklGQl9EbWFQYWNrZXRzIHw9IHN0YXQgJiAoIEhSRUdfRVZfUkRNQUQgfCBIUkVHX0VWX1RETUFEICk7ICkKKwkJSUZfVVNFX0RNQSggaWZicC0+SUZCX0RtYVBhY2tldHMgfD0gc3RhdCAmICggSFJFR19FVl9SRE1BRCB8IEhSRUdfRVZfVERNQUQgKSApOwogCQkvLyBybGF2IDogcGVuZGluZyBIUkVHX0VWX1JETUFEIG9yIEhSRUdfRVZfVERNQUQgZXZlbnRzIGdldCBhY2tub3dsZWRnZWQgaGVyZS4KLS8qNTQqLwlzdGF0ICY9IChoY2ZfMTYpfiggSFJFR19FVl9TTEVFUF9SRVEgfCBIUkVHX0VWX0NNRCB8IEhSRUdfRVZfQUNLX1JFR19SRUFEWSB8IEhSRUdfRVZfQUxMT0MgfCBIUkVHX0VWX0ZXX0RNQSApOwotLy9hIHBvc2l0aXZlIG1hc2sgd291bGQgYmUgZWFzaWVyIHRvIHVuZGVyc3RhbmQgLyo1NCovCXN0YXQgJj0gKGhjZl8xNil+KCBIUkVHX0VWX1NMRUVQX1JFUSB8IEhSRUdfRVZfQ01EIHwgSFJFR19FVl9BQ0tfUkVHX1JFQURZIHwgSFJFR19FVl9BTExPQyB8IEhSRUdfRVZfRldfRE1BICk7Ci0JCUlGX1VTRV9ETUEoIHN0YXQgJj0gKGhjZl8xNil+SFJFR19FVl9SWDsgKQorCS8qNTQqLyAgc3RhdCAmPSAoaGNmXzE2KX4oIEhSRUdfRVZfU0xFRVBfUkVRIHwgSFJFR19FVl9DTUQgfCBIUkVHX0VWX0FDS19SRUdfUkVBRFkgfCBIUkVHX0VWX0FMTE9DIHwgSFJFR19FVl9GV19ETUEgKTsKKy8vYSBwb3NpdGl2ZSBtYXNrIHdvdWxkIGJlIGVhc2llciB0byB1bmRlcnN0YW5kIC8qNTQqLyAgc3RhdCAmPSAoaGNmXzE2KX4oIEhSRUdfRVZfU0xFRVBfUkVRIHwgSFJFR19FVl9DTUQgfCBIUkVHX0VWX0FDS19SRUdfUkVBRFkgfCBIUkVHX0VWX0FMTE9DIHwgSFJFR19FVl9GV19ETUEgKTsKKwkJSUZfVVNFX0RNQSggc3RhdCAmPSAoaGNmXzE2KX5IUkVHX0VWX1JYICk7CiAJCWlmICggc3RhdCApIHsKLQkJCURBV0FfQUNLKCBzdGF0ICk7CS8qREFXQSovCisJCQlEQVdBX0FDSyggc3RhdCApOyAgIC8qREFXQSovCiAJCX0KIAl9Ci0JSENGTE9HRVhJVCggSENGX1RSQUNFX1NFUlZJQ0VfTklDICkKKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfU0VSVklDRV9OSUMgKTsKIAlyZXR1cm4gcmM7CiB9IC8vIGhjZl9zZXJ2aWNlX25pYwotI2VuZGlmIC8vIEhDRl9ETF9PTkxZCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKiogSCBDIEYgICBTIFUgUCBQIE8gUiBUICAgUiBPIFUgVCBJIE4gRSBTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoqKioqKioqKioqKioqKioqKioqKioqKioqIEggQyBGICAgUyBVIFAgUCBPIFIgVCAgIFIgTyBVIFQgSSBOIEUgUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKi5TVUJNT0RVTEUJCXZvaWQgY2FsY19taWMoIGhjZl8zMiogcCwgaGNmXzMyIG0gKQotKi5QVVJQT1NFCQljYWxjdWxhdGUgTUlDIG9uIGEgcXVhZCBieXRlLgotKgotKi5BUkdVTUVOVFMKLSoJcAkJCWFkZHJlc3Mgb2YgdGhlIE1JQwotKgltCQkJMzIgYml0IHZhbHVlIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgTUlDIGNhbGN1bGF0aW9uIGVuZ2luZQotKgotKi5SRVRVUk5TCQlOLkEuCi0qCi0qLkRFU0NSSVBUSU9OCi0qIGNhbGNfbWljIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTUlDIGFsZ29yaXRobS4gSXQgaXMgYSBtb25rZXktc2VlIG1vbmtleS1kbyBjb3B5IG9mCi0qIE1pY2hhZWw6OmFwcGVuZEJ5dGUoKQotKiBvZiBBcHBlbmRpeCBDIG9mIC4uLi4uLi4uLi4KLSoKLSoKLSouRElBR1JBTQotKgotKi5OT1RJQ0UKLSouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKgorICouU1VCTU9EVUxFICAgICB2b2lkIGNhbGNfbWljKCBoY2ZfMzIqIHAsIGhjZl8zMiBtICkKKyAqLlBVUlBPU0UgICAgICAgY2FsY3VsYXRlIE1JQyBvbiBhIHF1YWQgYnl0ZS4KKyAqCisgKi5BUkdVTUVOVFMKKyAqICAgcCAgICAgICAgICAgYWRkcmVzcyBvZiB0aGUgTUlDCisgKiAgIG0gICAgICAgICAgIDMyIGJpdCB2YWx1ZSB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIE1JQyBjYWxjdWxhdGlvbiBlbmdpbmUKKyAqCisgKi5SRVRVUk5TICAgICAgIE4uQS4KKyAqCisgKi5ERVNDUklQVElPTgorICogY2FsY19taWMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNSUMgYWxnb3JpdGhtLiBJdCBpcyBhIG1vbmtleS1zZWUgbW9ua2V5LWRvIGNvcHkgb2YKKyAqIE1pY2hhZWw6OmFwcGVuZEJ5dGUoKQorICogb2YgQXBwZW5kaXggQyBvZiAuLi4uLi4uLi4uCisgKgorICoKKyAqLkRJQUdSQU0KKyAqCisgKi5OT1RJQ0UKKyAqLkVORERPQyAgICAgICAgICAgICAgICBFTkQgRE9DVU1FTlRBVElPTgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCiAKICNkZWZpbmUgUk9MMzIoIEEsIG4gKSAoICgoQSkgPDwgKG4pKSB8ICggKChBKT4+KDMyLShuKSkpICAmICggKDFVTCA8PCAobikpIC0gMSApICkgKQogI2RlZmluZSBST1IzMiggQSwgbiApIFJPTDMyKCAoQSksIDMyLShuKSApCiAKLSNkZWZpbmUgTAkqcAotI2RlZmluZSBSCSoocCsxKQorI2RlZmluZSBMICAgKnAKKyNkZWZpbmUgUiAgICoocCsxKQogCiB2b2lkCiBjYWxjX21pYyggaGNmXzMyKiBwLCBoY2ZfMzIgbSApCkBAIC0zMjUwLDM4ICszMTIyLDM4IEBACiAKICNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qLlNVQk1PRFVMRQkJdm9pZCBjYWxjX21pY19yeF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIHAsIGludCBsZW4gKQotKi5QVVJQT1NFCQljYWxjdWxhdGUgTUlDIG9uIGEgc2luZ2xlIGZyYWdtZW50LgotKgotKi5BUkdVTUVOVFMKLSoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCi0qCWJ1ZnAJCShieXRlKSBhZGRyZXNzIG9mIGJ1ZmZlcgotKglsZW4JCQlsZW5ndGggaW4gYnl0ZXMgb2YgYnVmZmVyIHNwZWNpZmllZCBieSBidWZwCi0qCi0qLlJFVFVSTlMJCU4uQS4KLSoKLSouREVTQ1JJUFRJT04KLSogY2FsY19taWNfcnhfZnJhZyAuLi4uLi4uLgotKgotKiBUaGUgTUlDIGlzIGxvY2F0ZWQgaW4gdGhlIElGQi4KLSogVGhlIE1JQyBpcyBzZXBhcmF0ZSBmb3IgVHggYW5kIFJ4LCB0aHVzIGFsbG93aW5nIGhjZl9zZW5kX21zZyB0byBvY2N1ciBiZXR3ZWVuIGhjZl9zZXJ2aWNlX25pYyBhbmQKLSogaGNmX3Jjdl9tc2cuCi0qCi0qCi0qLkRJQUdSQU0KLSoKLSouTk9USUNFCi0qLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoKKyAqLlNVQk1PRFVMRSAgICAgdm9pZCBjYWxjX21pY19yeF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIHAsIGludCBsZW4gKQorICouUFVSUE9TRSAgICAgICBjYWxjdWxhdGUgTUlDIG9uIGEgc2luZ2xlIGZyYWdtZW50LgorICoKKyAqLkFSR1VNRU5UUworICogICBpZmJwICAgICAgICBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyAqICAgYnVmcCAgICAgICAgKGJ5dGUpIGFkZHJlc3Mgb2YgYnVmZmVyCisgKiAgIGxlbiAgICAgICAgIGxlbmd0aCBpbiBieXRlcyBvZiBidWZmZXIgc3BlY2lmaWVkIGJ5IGJ1ZnAKKyAqCisgKi5SRVRVUk5TICAgICAgIE4uQS4KKyAqCisgKi5ERVNDUklQVElPTgorICogY2FsY19taWNfcnhfZnJhZyAuLi4uLi4uLgorICoKKyAqIFRoZSBNSUMgaXMgbG9jYXRlZCBpbiB0aGUgSUZCLgorICogVGhlIE1JQyBpcyBzZXBhcmF0ZSBmb3IgVHggYW5kIFJ4LCB0aHVzIGFsbG93aW5nIGhjZl9zZW5kX21zZyB0byBvY2N1ciBiZXR3ZWVuIGhjZl9zZXJ2aWNlX25pYyBhbmQKKyAqIGhjZl9yY3ZfbXNnLgorICoKKyAqCisgKi5ESUFHUkFNCisgKgorICouTk9USUNFCisgKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZAogY2FsY19taWNfcnhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICkKIHsKLXN0YXRpYyB1bmlvbiB7IGhjZl8zMiB4MzI7IGhjZl8xNiB4MTZbMl07IGhjZl84IHg4WzRdOyB9IHg7CS8vKiBhcmVhIHRvIGFjY3VtdWxhdGUgNCBieXRlcyBpbnB1dCBmb3IgTUlDIGVuZ2luZQotaW50IGk7CisJc3RhdGljIHVuaW9uIHsgaGNmXzMyIHgzMjsgaGNmXzE2IHgxNlsyXTsgaGNmXzggeDhbNF07IH0geDsgLy8qIGFyZWEgdG8gYWNjdW11bGF0ZSA0IGJ5dGVzIGlucHV0IGZvciBNSUMgZW5naW5lCisJaW50IGk7CiAKLQlpZiAoIGxlbiA9PSAtMSApIHsJCQkJCQkJCS8vaW5pdGlhbGl6ZSBNSUMgaG91c2VrZWVwaW5nCisJaWYgKCBsZW4gPT0gLTEgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pbml0aWFsaXplIE1JQyBob3VzZWtlZXBpbmcKIAkJaSA9ICood2NpX3JlY29yZHApJnBbSEZTX1NUQVRdOwogCQkvKiBpID0gQ05WX1NIT1JUUF9UT19MSVRUTEUoJnBbSEZTX1NUQVRdKTsgc2hvdWxkIG5vdCBiZSBuZWVkZSB0byBwcmV2ZW50IGFsaWdubWVudCBwb3JvYmxlbXMKIAkJICogc2luY2UgbGVuID09IC0xIGlmIGFuZCBvbmx5IGlmIHAgaXMgbG9va2FoYWVhZCBidWZmZXIgd2hpY2ggTVVTVCBiZSB3b3JkIGFsaWduZWQKQEAgLTMyODksMTIgKzMxNjEsMTIgQEAKIAkJICovCiAKIAkJaWYgKCAoIGkgJiBIRlNfU1RBVF9NSUMgKSA9PSAwICkgewotCQkJaWZicC0+SUZCX01JQ1J4Q2FycnkgPSAweEZGRkY7CQkJLy9zdXBwcmVzcyBNSUMgY2FsY3VsYXRpb24KKwkJCWlmYnAtPklGQl9NSUNSeENhcnJ5ID0gMHhGRkZGOyAgICAgICAgICAvL3N1cHByZXNzIE1JQyBjYWxjdWxhdGlvbgogCQl9IGVsc2UgewogCQkJaWZicC0+SUZCX01JQ1J4Q2FycnkgPSAwOwotLy8qCU5vdGUgdGhhdCAiY29pbmNpZGVudGFsbHkiIHRoZSBiaXQgcG9zaXRpb25zIHVzZWQgaW4gSEZTX1NUQVQKLS8vKgljb3JyZXNwb25kIHdpdGggdGhlIG9mZnNldCBvZiB0aGUga2V5IGluIElGQl9NSUNLZXkKLQkJCWkgPSAoIGkgJiBIRlNfU1RBVF9NSUNfS0VZX0lEICkgPj4gMTA7CS8qIGNvaW5jaWRlbnRhbGx5IG5vIHNoaWZ0IG5lZWRlZCBmb3IgaSBpdHNlbGYgKi8KKy8vKiBOb3RlIHRoYXQgImNvaW5jaWRlbnRhbGx5IiB0aGUgYml0IHBvc2l0aW9ucyB1c2VkIGluIEhGU19TVEFUCisvLyogY29ycmVzcG9uZCB3aXRoIHRoZSBvZmZzZXQgb2YgdGhlIGtleSBpbiBJRkJfTUlDS2V5CisJCQlpID0gKCBpICYgSEZTX1NUQVRfTUlDX0tFWV9JRCApID4+IDEwOyAgLyogY29pbmNpZGVudGFsbHkgbm8gc2hpZnQgbmVlZGVkIGZvciBpIGl0c2VsZiAqLwogCQkJaWZicC0+SUZCX01JQ1J4WzBdID0gQ05WX0xPTkdfVE9fTElUVExFKGlmYnAtPklGQl9NSUNSeEtleVtpICBdKTsKIAkJCWlmYnAtPklGQl9NSUNSeFsxXSA9IENOVl9MT05HX1RPX0xJVFRMRShpZmJwLT5JRkJfTUlDUnhLZXlbaSsxXSk7CiAJCX0KQEAgLTMzMDgsMTEgKzMxODAsMTEgQEAKIAkJCQlpZmJwLT5JRkJfTUlDUnhDYXJyeSA9IDQ7CiAJCQkJbGVuIC09IDQ7CiAJCQl9Ci0JCX0gZWxzZSB3aGlsZSAoIGlmYnAtPklGQl9NSUNSeENhcnJ5IDwgNCAmJiBsZW4gKSB7CQkvL25vdGUgZm9yIGhjZl8xNiBhcHBsaWVzOiAweEZGRkYgPiA0Ci0JCQl4Lng4W2lmYnAtPklGQl9NSUNSeENhcnJ5KytdID0gKnArKzsKLQkJCWxlbi0tOwotCQl9Ci0JCXdoaWxlICggaWZicC0+SUZCX01JQ1J4Q2FycnkgPT0gNCApIHsJLy9jb250cml2ZWQgc28gd2UgaGF2ZSBvbmx5IDEgY2FsbCB0byBjYWxjX21pYyBzbyB3ZSBjb3VsZCBicmluZyBpdCBpbi1saW5lCisJCX0gZWxzZSB3aGlsZSAoIGlmYnAtPklGQl9NSUNSeENhcnJ5IDwgNCAmJiBsZW4gKSB7ICAgICAgLy9ub3RlIGZvciBoY2ZfMTYgYXBwbGllczogMHhGRkZGID4gNAorCQkJCXgueDhbaWZicC0+SUZCX01JQ1J4Q2FycnkrK10gPSAqcCsrOworCQkJCWxlbi0tOworCQkJfQorCQl3aGlsZSAoIGlmYnAtPklGQl9NSUNSeENhcnJ5ID09IDQgKSB7ICAgLy9jb250cml2ZWQgc28gd2UgaGF2ZSBvbmx5IDEgY2FsbCB0byBjYWxjX21pYyBzbyB3ZSBjb3VsZCBicmluZyBpdCBpbi1saW5lCiAJCQljYWxjX21pYyggaWZicC0+SUZCX01JQ1J4LCB4LngzMiApOwogCQkJeC54MzIgPSBDTlZfTE9OR1BfVE9fTElUVExFKHApOwogCQkJcCArPSA0OwpAQCAtMzMyOCw5MiArMzIwMCw5MiBAQAogCiAjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKi5TVUJNT0RVTEUJCXZvaWQgY2FsY19taWNfdHhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICkKLSouUFVSUE9TRQkJY2FsY3VsYXRlIE1JQyBvbiBhIHNpbmdsZSBmcmFnbWVudC4KLSoKLSouQVJHVU1FTlRTCi0qCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawotKglidWZwCQkoYnl0ZSkgYWRkcmVzcyBvZiBidWZmZXIKLSoJbGVuCQkJbGVuZ3RoIGluIGJ5dGVzIG9mIGJ1ZmZlciBzcGVjaWZpZWQgYnkgYnVmcAotKgotKi5SRVRVUk5TCQlOLkEuCi0qCi0qLkRFU0NSSVBUSU9OCi0qIGNhbGNfbWljX3R4X2ZyYWcgLi4uLi4uLi4KLSoKLSogVGhlIE1JQyBpcyBsb2NhdGVkIGluIHRoZSBJRkIuCi0qIFRoZSBNSUMgaXMgc2VwYXJhdGUgZm9yIFR4IGFuZCBSeCwgdGh1cyBhbGxvd2luZyBoY2Zfc2VuZF9tc2cgdG8gb2NjdXIgYmV0d2VlbiBoY2Zfc2VydmljZV9uaWMgYW5kCi0qIGhjZl9yY3ZfbXNnLgotKgotKgotKi5ESUFHUkFNCi0qCi0qLk5PVElDRQotKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqCisgKi5TVUJNT0RVTEUgICAgIHZvaWQgY2FsY19taWNfdHhfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBwLCBpbnQgbGVuICkKKyAqLlBVUlBPU0UgICAgICAgY2FsY3VsYXRlIE1JQyBvbiBhIHNpbmdsZSBmcmFnbWVudC4KKyAqCisgKi5BUkdVTUVOVFMKKyAqICAgaWZicCAgICAgICAgYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisgKiAgIGJ1ZnAgICAgICAgIChieXRlKSBhZGRyZXNzIG9mIGJ1ZmZlcgorICogICBsZW4gICAgICAgICBsZW5ndGggaW4gYnl0ZXMgb2YgYnVmZmVyIHNwZWNpZmllZCBieSBidWZwCisgKgorICouUkVUVVJOUyAgICAgICBOLkEuCisgKgorICouREVTQ1JJUFRJT04KKyAqIGNhbGNfbWljX3R4X2ZyYWcgLi4uLi4uLi4KKyAqCisgKiBUaGUgTUlDIGlzIGxvY2F0ZWQgaW4gdGhlIElGQi4KKyAqIFRoZSBNSUMgaXMgc2VwYXJhdGUgZm9yIFR4IGFuZCBSeCwgdGh1cyBhbGxvd2luZyBoY2Zfc2VuZF9tc2cgdG8gb2NjdXIgYmV0d2VlbiBoY2Zfc2VydmljZV9uaWMgYW5kCisgKiBoY2ZfcmN2X21zZy4KKyAqCisgKgorICouRElBR1JBTQorICoKKyAqLk5PVElDRQorICouRU5ERE9DICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQKIGNhbGNfbWljX3R4X2ZyYWcoIElGQlAgaWZicCwgd2NpX2J1ZnAgcCwgaW50IGxlbiApCiB7Ci1zdGF0aWMgdW5pb24geyBoY2ZfMzIgeDMyOyBoY2ZfMTYgeDE2WzJdOyBoY2ZfOCB4OFs0XTsgfSB4OwkvLyogYXJlYSB0byBhY2N1bXVsYXRlIDQgYnl0ZXMgaW5wdXQgZm9yIE1JQyBlbmdpbmUKKwlzdGF0aWMgdW5pb24geyBoY2ZfMzIgeDMyOyBoY2ZfMTYgeDE2WzJdOyBoY2ZfOCB4OFs0XTsgfSB4OyAvLyogYXJlYSB0byBhY2N1bXVsYXRlIDQgYnl0ZXMgaW5wdXQgZm9yIE1JQyBlbmdpbmUKIAotCQkJCQkJCQkJCQkJCQkvL2lmIGluaXRpYWxpemF0aW9uIHJlcXVlc3QKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiBpbml0aWFsaXphdGlvbiByZXF1ZXN0CiAJaWYgKCBsZW4gPT0gLTEgKSB7Ci0JCQkJCQkJCQkJCQkJCS8vLiAgcHJlc3VtZSBNSUMgY2FsY3VsYXRpb24gZGlzYWJsZWQKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIHByZXN1bWUgTUlDIGNhbGN1bGF0aW9uIGRpc2FibGVkCiAJCWlmYnAtPklGQl9NSUNUeENhcnJ5ID0gMHhGRkZGOwotCQkJCQkJCQkJCQkJCQkvLy4gIGlmIE1JQyBjYWxjdWxhdGlvbiBlbmFibGVkCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICBpZiBNSUMgY2FsY3VsYXRpb24gZW5hYmxlZAogCQlpZiAoIGlmYnAtPklGQl9NSUNUeENudGwgKSB7Ci0JCQkJCQkJCQkJCQkJCS8vLiAgLiAgY2xlYXIgTUlDIGNhcnJ5CisJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIGNsZWFyIE1JQyBjYXJyeQogCQkJaWZicC0+SUZCX01JQ1R4Q2FycnkgPSAwOwotCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGluaXRpYWxpemUgTUlDLWVuZ2luZQotCQkJaWZicC0+SUZCX01JQ1R4WzBdID0gQ05WX0xPTkdfVE9fTElUVExFKGlmYnAtPklGQl9NSUNUeEtleVswXSk7CS8qVHggYWx3YXlzIHVzZXMgS2V5IDAgKi8KKwkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgaW5pdGlhbGl6ZSBNSUMtZW5naW5lCisJCQlpZmJwLT5JRkJfTUlDVHhbMF0gPSBDTlZfTE9OR19UT19MSVRUTEUoaWZicC0+SUZCX01JQ1R4S2V5WzBdKTsgLypUeCBhbHdheXMgdXNlcyBLZXkgMCAqLwogCQkJaWZicC0+SUZCX01JQ1R4WzFdID0gQ05WX0xPTkdfVE9fTElUVExFKGlmYnAtPklGQl9NSUNUeEtleVsxXSk7CiAJCX0KLQkJCQkJCQkJCQkJCQkJLy9lbHNlCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lbHNlCiAJfSBlbHNlIHsKLQkJCQkJCQkJCQkJCQkJLy8uICBpZiBNSUMgZW5hYmxlZCAoVHgpIC8gaWYgTUlDIHByZXNlbnQgKFJ4KQotCQkJCQkJCQkJCQkJCQkvLy4gIGFuZCBubyBjYXJyeSBmcm9tIHByZXZpb3VzIGNhbGNfbWljX2ZyYWcKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIGlmIE1JQyBlbmFibGVkIChUeCkgLyBpZiBNSUMgcHJlc2VudCAoUngpCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICBhbmQgbm8gY2FycnkgZnJvbSBwcmV2aW91cyBjYWxjX21pY19mcmFnCiAJCWlmICggaWZicC0+SUZCX01JQ1R4Q2FycnkgPT0gMCApIHsKLQkJCQkJCQkJCQkJCQkJLy8uICAuICBwcmVzZXQgYWNjdSB3aXRoIDQgYnl0ZXMgZnJvbSBidWZmZXIKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgcHJlc2V0IGFjY3Ugd2l0aCA0IGJ5dGVzIGZyb20gYnVmZmVyCiAJCQl4LngzMiA9IENOVl9MT05HUF9UT19MSVRUTEUocCk7Ci0JCQkJCQkJCQkJCQkJCS8vLiAgLiAgYWRqdXN0IHBvaW50ZXIgYWNjb3JkaW5nbHkKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgYWRqdXN0IHBvaW50ZXIgYWNjb3JkaW5nbHkKIAkJCXAgKz0gNDsKLQkJCQkJCQkJCQkJCQkJLy8uICAuICBpZiBidWZmZXIgY29udGFpbmVkIGxlc3MgdGhlbiA0IGJ5dGVzCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIGlmIGJ1ZmZlciBjb250YWluZWQgbGVzcyB0aGVuIDQgYnl0ZXMKIAkJCWlmICggbGVuIDwgNCApIHsKLQkJCQkJCQkJCQkJCQkJLy8uICAuICAuICBwcm9tb3RlIHZhbGlkIGJ5dGVzIGluIGFjY3UgdG8gY2FycnkKLQkJCQkJCQkJCQkJCQkJLy8uICAuICAuICBmbGFnIGFjY3UgdG8gY29udGFpbiBpbmNvbXBsZXRlIGRvdWJsZSB3b3JkCisJCQkJICAgICAgICAgICAgICAgIC8vLiAgLiAgLiAgcHJvbW90ZSB2YWxpZCBieXRlcyBpbiBhY2N1IHRvIGNhcnJ5CisJCQkJICAgICAgICAgICAgICAgIC8vLiAgLiAgLiAgZmxhZyBhY2N1IHRvIGNvbnRhaW4gaW5jb21wbGV0ZSBkb3VibGUgd29yZAogCQkJCWlmYnAtPklGQl9NSUNUeENhcnJ5ID0gKGhjZl8xNilsZW47Ci0JCQkJCQkJCQkJCQkJCS8vLiAgLiAgZWxzZQorCQkJCSAgICAgICAgICAgICAgICAvLy4gIC4gIGVsc2UKIAkJCX0gZWxzZSB7Ci0JCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgZmxhZyBhY2N1IHRvIGNvbnRhaW4gY29tcGxldGUgZG91YmxlIHdvcmQKKwkJCQkgICAgICAgICAgICAgICAgLy8uICAuICAuICBmbGFnIGFjY3UgdG8gY29udGFpbiBjb21wbGV0ZSBkb3VibGUgd29yZAogCQkJCWlmYnAtPklGQl9NSUNUeENhcnJ5ID0gNDsKLQkJCQkJCQkJCQkJCQkJLy8uICAuICBhZGp1c3QgcmVtYWluaW5nIGJ1ZmZlciBsZW5ndGgKKwkJCQkgICAgICAgICAgICAgICAgLy8uICAuICBhZGp1c3QgcmVtYWluaW5nIGJ1ZmZlciBsZW5ndGgKIAkJCQlsZW4gLT0gNDsKIAkJCX0KLQkJCQkJCQkJCQkJCQkJLy8uICBlbHNlIGlmIE1JQyBlbmFibGVkCi0JCQkJCQkJCQkJCQkJCS8vLiAgYW5kIGlmIGNhcnJ5IGJ5dGVzIGZyb20gcHJldmlvdXMgY2FsY19taWNfdHhfZnJhZwotCQkJCQkJCQkJCQkJCQkvLy4gIC4gIG1vdmUgKDEtMykgYnl0ZXMgZnJvbSBjYXJyeSBpbnRvIGFjY3UKLQkJfSBlbHNlIHdoaWxlICggaWZicC0+SUZCX01JQ1R4Q2FycnkgPCA0ICYmIGxlbiApIHsJCS8qIG5vdGUgZm9yIGhjZl8xNiBhcHBsaWVzOiAweEZGRkYgPiA0ICovCi0JCQl4Lng4W2lmYnAtPklGQl9NSUNUeENhcnJ5KytdID0gKnArKzsKLQkJCWxlbi0tOwotCQl9Ci0JCQkJCQkJCQkJCQkJCS8vLiAgd2hpbGUgYWNjdSBjb250YWlucyBjb21wbGV0ZSBkb3VibGUgd29yZAotCQkJCQkJCQkJCQkJCQkvLy4gIGFuZCBNSUMgZW5hYmxlZAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICBlbHNlIGlmIE1JQyBlbmFibGVkCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIGFuZCBpZiBjYXJyeSBieXRlcyBmcm9tIHByZXZpb3VzIGNhbGNfbWljX3R4X2ZyYWcKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgbW92ZSAoMS0zKSBieXRlcyBmcm9tIGNhcnJ5IGludG8gYWNjdQorCQl9IGVsc2Ugd2hpbGUgKCBpZmJwLT5JRkJfTUlDVHhDYXJyeSA8IDQgJiYgbGVuICkgeyAgICAgIC8qIG5vdGUgZm9yIGhjZl8xNiBhcHBsaWVzOiAweEZGRkYgPiA0ICovCisJCQkJeC54OFtpZmJwLT5JRkJfTUlDVHhDYXJyeSsrXSA9ICpwKys7CisJCQkJbGVuLS07CisJCQl9CisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICB3aGlsZSBhY2N1IGNvbnRhaW5zIGNvbXBsZXRlIGRvdWJsZSB3b3JkCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICBhbmQgTUlDIGVuYWJsZWQKIAkJd2hpbGUgKCBpZmJwLT5JRkJfTUlDVHhDYXJyeSA9PSA0ICkgewotCQkJCQkJCQkJCQkJCQkvLy4gIC4gIHBhc3MgYWNjdSB0byBNSUMgZW5naW5lCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIHBhc3MgYWNjdSB0byBNSUMgZW5naW5lCiAJCQljYWxjX21pYyggaWZicC0+SUZCX01JQ1R4LCB4LngzMiApOwotCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGNvcHkgbmV4dCA0IGJ5dGVzIGZyb20gYnVmZmVyIHRvIGFjY3UKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgY29weSBuZXh0IDQgYnl0ZXMgZnJvbSBidWZmZXIgdG8gYWNjdQogCQkJeC54MzIgPSBDTlZfTE9OR1BfVE9fTElUVExFKHApOwotCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGFkanVzdCBidWZmZXIgcG9pbnRlcgorCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICBhZGp1c3QgYnVmZmVyIHBvaW50ZXIKIAkJCXAgKz0gNDsKLQkJCQkJCQkJCQkJCQkJLy8uICAuICBpZiBidWZmZXIgY29udGFpbmVkIGxlc3MgdGhlbiA0IGJ5dGVzCi0JCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgcHJvbW90ZSB2YWxpZCBieXRlcyBpbiBhY2N1IHRvIGNhcnJ5Ci0JCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgZmxhZyBhY2N1IHRvIGNvbnRhaW4gaW5jb21wbGV0ZSBkb3VibGUgd29yZAorCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICBpZiBidWZmZXIgY29udGFpbmVkIGxlc3MgdGhlbiA0IGJ5dGVzCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIC4gIHByb21vdGUgdmFsaWQgYnl0ZXMgaW4gYWNjdSB0byBjYXJyeQorCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICAuICBmbGFnIGFjY3UgdG8gY29udGFpbiBpbmNvbXBsZXRlIGRvdWJsZSB3b3JkCiAJCQlpZiAoIGxlbiA8IDQgKSB7CiAJCQkJaWZicC0+SUZCX01JQ1R4Q2FycnkgPSAoaGNmXzE2KWxlbjsKIAkJCX0KLQkJCQkJCQkJCQkJCQkJLy8uICAuICBhZGp1c3QgcmVtYWluaW5nIGJ1ZmZlciBsZW5ndGgKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgYWRqdXN0IHJlbWFpbmluZyBidWZmZXIgbGVuZ3RoCiAJCQlsZW4gLT0gNDsKIAkJfQogCX0KQEAgLTM0MjMsMzgxICszMjk1LDM3OSBAQAogCiAjaWYgSENGX1BST1RfVElNRQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKi5TVUJNT0RVTEUJCXZvaWQgY2FsaWJyYXRlKCBJRkJQIGlmYnAgKQotKi5QVVJQT1NFCQljYWxpYnJhdGVzIHRoZSBTL1cgcHJvdGVjdGlvbiBjb3VudGVyIGFnYWluc3QgdGhlIEhlcm1lcyBUaW1lciB0aWNrLgotKgotKi5BUkdVTUVOVFMKLSoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCi0qCi0qLlJFVFVSTlMJCU4uQS4KLSoKLSouREVTQ1JJUFRJT04KLSogY2FsaWJyYXRlcyB0aGUgUy9XIHByb3RlY3Rpb24gY291bnRlciBhZ2FpbnN0IHRoZSBIZXJtZXMgVGltZXIgdGljawotKiBJRkJfVGlja0luaSBpcyB0aGUgdmFsdWUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBTL1cgcHJvdGVjdGlvbiBjb3VudGVyIHN1Y2ggdGhhdCB0aGUgZXhwaXJhdGlvbiBwZXJpb2QKLSogbW9yZSBvciBsZXNzIGluZGVwZW5kZW50IG9mIHRoZSBwcm9jZXNzb3Igc3BlZWQuIElmIElGQl9UaWNrSW5pIGlzIG5vdCB5ZXQgY2FsaWJyYXRlZCwgaXQgaXMgZG9uZSBub3cuCi0qIFRoaXMgY2FsaWJyYXRpb24gaXMgInJlYXNvbmFibHkiIGFjY3VyYXRlIGJlY2F1c2UgdGhlIEhlcm1lcyBpcyBpbiBhIHF1aWV0IHN0YXRlIGFzIGEgcmVzdWx0IG9mIHRoZQotKiBJbml0aWFsaXplIGNvbW1hbmQuCi0qCi0qCi0qLkRJQUdSQU0KLSoKLSoxOglJRkJfVGlja0luaSBpcyBpbml0aWFsaXplZCBhdCBJTklfVElDS19JTkkgYnkgaGNmX2Nvbm5lY3QuIElmIGNhbGlicmF0ZSBzdWNjZWVkcywgSUZCX1RpY2tJbmkgaXMKLSoJZ3VhcmFudGVlZCB0byBiZSBjaGFuZ2VkLiBBcyBhIGNvbnNlcXVlbmNlIHRoZXJlIHdpbGwgYmUgb25seSAxIHNob3QgYXQgY2FsaWJyYXRpb24gKHJlZ2FyZGxlc3Mgb2YgdGhlCi0qCW51bWJlciBvZiBpbml0IGNhbGxzKSB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcy4KLSoyOglDYWxpYnJhdGlvbiBpcyBkb25lIEhDRl9QUk9UX1RJTUVfQ05UIHRpbWVzLiBUaGlzIGRpbWluaXNoIHRoZSBlZmZlY3RzIG9mIGppdHRlciBhbmQgaW50ZXJmZXJlbmNlLAotKgllc3BlY2lhbGx5IGluIGEgcHJlLWVtcHRpdmUgZW52aXJvbm1lbnQuIEhDRl9QUk9UX1RJTUVfQ05UIGlzIGluIHRoZSByYW5nZSBvZiAxNiB0aHJvdWdoIDMyIGFuZCBkZXJpdmVkCi0qCWZyb20gdGhlIEhDRl9QUk9UX1RJTUUgc3BlY2lmaWVkIGJ5IHRoZSBNU0YgcHJvZ3JhbW1lci4gVGhlIGRpdmlzb3IgbmVlZGVkIHRvIHNjYWxlIEhDRl9QUk9UX1RJTUUgaW50byB0aGUKLSoJMTYtMzIgcmFuZ2UsIGlzIHVzZWQgYXMgYSBtdWx0aXBsaWNhdG9yIGFmdGVyIHRoZSBjYWxpYnJhdGlvbiwgdG8gc2NhbGUgdGhlIGZvdW5kIHZhbHVlIGJhY2sgdG8gdGhlCi0qCXJlcXVlc3RlZCByYW5nZS4gVGhpcyB3YXkgYSBjb21wcm9taXNlIGlzIGFjaGlldmVkIGJldHdlZW4gYWNjdXJhY3kgYW5kIGR1cmF0aW9uIG9mIHRoZSBjYWxpYnJhdGlvbgotKglwcm9jZXNzLgotKjM6CUFja25vd2xlZGdlIHRoZSBUaW1lciBUaWNrIEV2ZW50LgotKglFYWNoIGN5Y2xlIGlzIGxpbWl0ZWQgdG8gYXQgbW9zdCBJTklfVElDS19JTkkgc2FtcGxlcyBvZiB0aGUgVGltZXJUaWNrIHN0YXR1cyBvZiB0aGUgSGVybWVzLgotKglTaW5jZSB0aGUgc3RhcnQgb2YgY2FsaWJyYXRlIGlzIHVucmVsYXRlZCB0byB0aGUgSGVybWVzIEludGVybmFsIFRpbWVyLCB0aGUgZmlyc3QgaW50ZXJ2YWwgbWF5IGxhc3QgZnJvbSAwCi0qCXRvIHRoZSBub3JtYWwgaW50ZXJ2YWwsIGFsbCBzdWJzZXF1ZW50IGludGVydmFscyBzaG91bGQgYmUgdGhlIGZ1bGwgbGVuZ3RoIG9mIHRoZSBIZXJtZXMgVGljayBpbnRlcnZhbC4KLSoJVGhlIEhlcm1lcyBUaW1lciBUaWNrIGlzIG5vdCByZXByb2dyYW1tZWQgYnkgdGhlIEhDRiwgaGVuY2UgaXQgaXMgcnVubmluZyBhdCB0aGUgZGVmYXVsdCBvZiAxMCBrCi0qCW1pY3Jvc2Vjb25kcy4KLSo0OglJZiB0aGUgVGltZXIgVGljayBFdmVudCBpcyBjb250aW51b3VzbHkgdXAgKHByb3RfY250IHN0aWxsIGhhcyB0aGUgdmFsdWUgSU5JX1RJQ0tfSU5JKSBvciBubyBUaW1lciBUaWNrCi0qCUV2ZW50IG9jY3VycmVkIGJlZm9yZSB0aGUgcHJvdGVjdGlvbiBjb3VudGVyIGV4cGlyZWQsIHJlc2V0IElGQl9UaWNrSW5pIHRvIElOSV9USUNLX0lOSSwKLSoJc2V0IHRoZSBkZWZ1bmN0IGJpdCBvZiBJRkJfQ2FyZFN0YXQgKHRodXMgcmVuZGVyaW5nIHRoZSBIZXJtZXMgaW5vcGVyYWJsZSkgYW5kIGV4aXQgdGhlIGNhbGlicmF0ZSByb3V0aW5lLgotKjg6CWlmYnAtPklGQl9UaWNrSW5pIGlzIG11bHRpcGxpZWQgdG8gc2NhbGUgdGhlIGZvdW5kIHZhbHVlIGJhY2sgdG8gdGhlIHJlcXVlc3RlZCByYW5nZSBhcyBleHBsYWluZWQgdW5kZXIgMi4KLSoKLSouTk9USUNFCi0qIG8gQWx0aG91Z2ggdGhlcmUgYXJlIGEgbnVtYmVyIG9mIHZpZXdwb2ludHMgcG9zc2libGUsIGNhbGlicmF0ZSgpIHVzZXMgYXMgZXJyb3Igc3RyYXRlZ3kgdGhhdCBhIHNpbmdsZQotKglmYWlsdXJlIG9mIHRoZSBIZXJtZXMgVGltZXJUaWNrIGlzIGNvbnNpZGVyZWQgZmF0YWwuCi0qIG8gVGhlcmUgaXMgbm8gaGFyZCBhbmQgY29uY3JldGUgdGltZS1vdXQgdmFsdWUgZGVmaW5lZCBmb3IgSGVybWVzIGFjdGl2aXRpZXMuIFRoZSBkZWZhdWx0IDEgc2Vjb25kcyBpcwotKgliZWxpZXZlZCB0byBiZSBzdWZmaWNpZW50bHkgInJlbGF4ZWQiIGZvciByZWFsIGxpZmUgYW5kIHRvIGJlIHN1ZmZpY2llbnRseSBzaG9ydCB0byBiZSBzdGlsbCB1c2VmdWwgaW4gYW4KLSoJZW52aXJvbm1lbnQgd2l0aCBodW1hbnMuCi0qIG8gTm90ZSB0aGF0IHZpYSBJRkJfRGVmdW5jdFN0YXQgdGltZSBvdXRzIGluIGNtZF93YWl0IGFuZCBpbiBoY2Zpb19zdHJpbmcgYmxvY2sgYWxsIEhlcm1lcyBhY2Nlc3MgdGlsbCB0aGUKLSoJbmV4dCBpbml0IHNvIGZ1bmN0aW9ucyB3aGljaCBjYWxsIGEgbWl4IG9mIGNtZF93YWl0IGFuZCBoY2Zpb19zdHJpbmcgb25seSBuZWVkIHRvIGNoZWNrIHRoZSByZXR1cm4gc3RhdHVzCi0qCW9mIHRoZSBsYXN0IGNhbGwKLSogbyBUaGUgcmV0dXJuIGNvZGUgaXMgcHJlc2V0IGF0IFRpbWUgb3V0LgotKglUaGUgYWRkaXRpb25hbCBjb21wbGljYXRpb24gdGhhdCBubyBjYWxpYnJhdGVkIHZhbHVlIGZvciB0aGUgcHJvdGVjdGlvbiBjb3VudCBjYW4gYmUgYXNzdW1lZCBzaW5jZQotKgljYWxpYnJhdGUoKSBkb2VzIG5vdCB5ZXQgaGF2ZSBkZXRlcm1pbmVkIGEgY2FsaWJyYXRlZCB2YWx1ZSAoYSBjYXRjaCAyMiksIGlzIGhhbmRsZWQgYnkgc2V0dGluZyB0aGUKLSoJaW5pdGlhbCB2YWx1ZSBhdCBJTklfVElDS19JTkkgKGJ5IGhjZl9jb25uZWN0KS4gVGhpcyBhcHByb2FjaCBpcyBjb25zaWRlcmVkIHNhZmUsIGJlY2F1c2U6Ci0qCSAgLSB0aGUgSENGIGRvZXMgbm90IHVzZSB0aGUgcGlwZWxpbmUgbWVjaGFuaXNtIG9mIEhlcm1lcyBjb21tYW5kcy4KLSoJICAtIHRoZSBsaWtlbGlob29kIG9mIGZhaWx1cmUgKHRoZSBvbmx5IHRpbWUgd2hlbiBwcm90ZWN0aW9uIGNvdW50IGlzIHJlbGV2YW50KSBpcyBzbWFsbC4KLSoJICAtIHRoZSB0aW1lIHdpbGwgYmUgc3VmZmljaWVudGx5IGxhcmdlIG9uIGEgZmFzdCBtYWNoaW5lIChidXN5IGJpdCBkcm9wcyBvbiBnb29kIE5JQyBiZWZvcmUgY291bnRlcgotKgkJZXhwaXJlcykKLSoJICAtIHRoZSB0aW1lIHdpbGwgYmUgc3VmZmljaWVudGx5IHNtYWxsIG9uIGEgc2xvdyBtYWNoaW5lIChjb3VudGVyIGV4cGlyZXMgb24gYmFkIE5JQyBiZWZvcmUgdGhlIGVuZCB1c2VyCi0qCSAgCXN3aXRjaGVzIHRoZSBwb3dlciBvZmYgaW4gZGVzcGFpcgotKglUaGUgdGltZSBuZWVkZWQgdG8gd3JhcCBhIDMyIGJpdCBjb3VudGVyIGFyb3VuZCBpcyBsb25nZXIgdGhhbiBtYW55IGh1bWFucyB3YW50IHRvIHdhaXQsIGhlbmNlIHRoZSBtb3JlIG9yCi0qCWxlc3MgYXJiaXRyYXJ5IHZhbHVlIG9mIDB4NDAwMDBMIGlzIGNob3NlbiwgYXNzdW1pbmcgaXQgZG9lcyBub3QgdGFrZSB0b28gbG9uZyBvbiBhbiBYVCBhbmQgaXMgbm90IHRvbwotKglzaG9ydCBvbiBhIHNjcmVhbS1tYWNoaW5lLgotKgotKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqCisgKi5TVUJNT0RVTEUgICAgIHZvaWQgY2FsaWJyYXRlKCBJRkJQIGlmYnAgKQorICouUFVSUE9TRSAgICAgICBjYWxpYnJhdGVzIHRoZSBTL1cgcHJvdGVjdGlvbiBjb3VudGVyIGFnYWluc3QgdGhlIEhlcm1lcyBUaW1lciB0aWNrLgorICoKKyAqLkFSR1VNRU5UUworICogICBpZmJwICAgICAgICBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyAqCisgKi5SRVRVUk5TICAgICAgIE4uQS4KKyAqCisgKi5ERVNDUklQVElPTgorICogY2FsaWJyYXRlcyB0aGUgUy9XIHByb3RlY3Rpb24gY291bnRlciBhZ2FpbnN0IHRoZSBIZXJtZXMgVGltZXIgdGljaworICogSUZCX1RpY2tJbmkgaXMgdGhlIHZhbHVlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgUy9XIHByb3RlY3Rpb24gY291bnRlciBzdWNoIHRoYXQgdGhlIGV4cGlyYXRpb24gcGVyaW9kCisgKiBtb3JlIG9yIGxlc3MgaW5kZXBlbmRlbnQgb2YgdGhlIHByb2Nlc3NvciBzcGVlZC4gSWYgSUZCX1RpY2tJbmkgaXMgbm90IHlldCBjYWxpYnJhdGVkLCBpdCBpcyBkb25lIG5vdy4KKyAqIFRoaXMgY2FsaWJyYXRpb24gaXMgInJlYXNvbmFibHkiIGFjY3VyYXRlIGJlY2F1c2UgdGhlIEhlcm1lcyBpcyBpbiBhIHF1aWV0IHN0YXRlIGFzIGEgcmVzdWx0IG9mIHRoZQorICogSW5pdGlhbGl6ZSBjb21tYW5kLgorICoKKyAqCisgKi5ESUFHUkFNCisgKgorICoxOiBJRkJfVGlja0luaSBpcyBpbml0aWFsaXplZCBhdCBJTklfVElDS19JTkkgYnkgaGNmX2Nvbm5lY3QuIElmIGNhbGlicmF0ZSBzdWNjZWVkcywgSUZCX1RpY2tJbmkgaXMKKyAqICAgZ3VhcmFudGVlZCB0byBiZSBjaGFuZ2VkLiBBcyBhIGNvbnNlcXVlbmNlIHRoZXJlIHdpbGwgYmUgb25seSAxIHNob3QgYXQgY2FsaWJyYXRpb24gKHJlZ2FyZGxlc3Mgb2YgdGhlCisgKiAgIG51bWJlciBvZiBpbml0IGNhbGxzKSB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcy4KKyAqMjogQ2FsaWJyYXRpb24gaXMgZG9uZSBIQ0ZfUFJPVF9USU1FX0NOVCB0aW1lcy4gVGhpcyBkaW1pbmlzaCB0aGUgZWZmZWN0cyBvZiBqaXR0ZXIgYW5kIGludGVyZmVyZW5jZSwKKyAqICAgZXNwZWNpYWxseSBpbiBhIHByZS1lbXB0aXZlIGVudmlyb25tZW50LiBIQ0ZfUFJPVF9USU1FX0NOVCBpcyBpbiB0aGUgcmFuZ2Ugb2YgMTYgdGhyb3VnaCAzMiBhbmQgZGVyaXZlZAorICogICBmcm9tIHRoZSBIQ0ZfUFJPVF9USU1FIHNwZWNpZmllZCBieSB0aGUgTVNGIHByb2dyYW1tZXIuIFRoZSBkaXZpc29yIG5lZWRlZCB0byBzY2FsZSBIQ0ZfUFJPVF9USU1FIGludG8gdGhlCisgKiAgIDE2LTMyIHJhbmdlLCBpcyB1c2VkIGFzIGEgbXVsdGlwbGljYXRvciBhZnRlciB0aGUgY2FsaWJyYXRpb24sIHRvIHNjYWxlIHRoZSBmb3VuZCB2YWx1ZSBiYWNrIHRvIHRoZQorICogICByZXF1ZXN0ZWQgcmFuZ2UuIFRoaXMgd2F5IGEgY29tcHJvbWlzZSBpcyBhY2hpZXZlZCBiZXR3ZWVuIGFjY3VyYWN5IGFuZCBkdXJhdGlvbiBvZiB0aGUgY2FsaWJyYXRpb24KKyAqICAgcHJvY2Vzcy4KKyAqMzogQWNrbm93bGVkZ2UgdGhlIFRpbWVyIFRpY2sgRXZlbnQuCisgKiAgIEVhY2ggY3ljbGUgaXMgbGltaXRlZCB0byBhdCBtb3N0IElOSV9USUNLX0lOSSBzYW1wbGVzIG9mIHRoZSBUaW1lclRpY2sgc3RhdHVzIG9mIHRoZSBIZXJtZXMuCisgKiAgIFNpbmNlIHRoZSBzdGFydCBvZiBjYWxpYnJhdGUgaXMgdW5yZWxhdGVkIHRvIHRoZSBIZXJtZXMgSW50ZXJuYWwgVGltZXIsIHRoZSBmaXJzdCBpbnRlcnZhbCBtYXkgbGFzdCBmcm9tIDAKKyAqICAgdG8gdGhlIG5vcm1hbCBpbnRlcnZhbCwgYWxsIHN1YnNlcXVlbnQgaW50ZXJ2YWxzIHNob3VsZCBiZSB0aGUgZnVsbCBsZW5ndGggb2YgdGhlIEhlcm1lcyBUaWNrIGludGVydmFsLgorICogICBUaGUgSGVybWVzIFRpbWVyIFRpY2sgaXMgbm90IHJlcHJvZ3JhbW1lZCBieSB0aGUgSENGLCBoZW5jZSBpdCBpcyBydW5uaW5nIGF0IHRoZSBkZWZhdWx0IG9mIDEwIGsKKyAqICAgbWljcm9zZWNvbmRzLgorICo0OiBJZiB0aGUgVGltZXIgVGljayBFdmVudCBpcyBjb250aW51b3VzbHkgdXAgKHByb3RfY250IHN0aWxsIGhhcyB0aGUgdmFsdWUgSU5JX1RJQ0tfSU5JKSBvciBubyBUaW1lciBUaWNrCisgKiAgIEV2ZW50IG9jY3VycmVkIGJlZm9yZSB0aGUgcHJvdGVjdGlvbiBjb3VudGVyIGV4cGlyZWQsIHJlc2V0IElGQl9UaWNrSW5pIHRvIElOSV9USUNLX0lOSSwKKyAqICAgc2V0IHRoZSBkZWZ1bmN0IGJpdCBvZiBJRkJfQ2FyZFN0YXQgKHRodXMgcmVuZGVyaW5nIHRoZSBIZXJtZXMgaW5vcGVyYWJsZSkgYW5kIGV4aXQgdGhlIGNhbGlicmF0ZSByb3V0aW5lLgorICo4OiBpZmJwLT5JRkJfVGlja0luaSBpcyBtdWx0aXBsaWVkIHRvIHNjYWxlIHRoZSBmb3VuZCB2YWx1ZSBiYWNrIHRvIHRoZSByZXF1ZXN0ZWQgcmFuZ2UgYXMgZXhwbGFpbmVkIHVuZGVyIDIuCisgKgorICouTk9USUNFCisgKiBvIEFsdGhvdWdoIHRoZXJlIGFyZSBhIG51bWJlciBvZiB2aWV3cG9pbnRzIHBvc3NpYmxlLCBjYWxpYnJhdGUoKSB1c2VzIGFzIGVycm9yIHN0cmF0ZWd5IHRoYXQgYSBzaW5nbGUKKyAqICAgZmFpbHVyZSBvZiB0aGUgSGVybWVzIFRpbWVyVGljayBpcyBjb25zaWRlcmVkIGZhdGFsLgorICogbyBUaGVyZSBpcyBubyBoYXJkIGFuZCBjb25jcmV0ZSB0aW1lLW91dCB2YWx1ZSBkZWZpbmVkIGZvciBIZXJtZXMgYWN0aXZpdGllcy4gVGhlIGRlZmF1bHQgMSBzZWNvbmRzIGlzCisgKiAgIGJlbGlldmVkIHRvIGJlIHN1ZmZpY2llbnRseSAicmVsYXhlZCIgZm9yIHJlYWwgbGlmZSBhbmQgdG8gYmUgc3VmZmljaWVudGx5IHNob3J0IHRvIGJlIHN0aWxsIHVzZWZ1bCBpbiBhbgorICogICBlbnZpcm9ubWVudCB3aXRoIGh1bWFucy4KKyAqIG8gTm90ZSB0aGF0IHZpYSBJRkJfRGVmdW5jdFN0YXQgdGltZSBvdXRzIGluIGNtZF93YWl0IGFuZCBpbiBoY2Zpb19zdHJpbmcgYmxvY2sgYWxsIEhlcm1lcyBhY2Nlc3MgdGlsbCB0aGUKKyAqICAgbmV4dCBpbml0IHNvIGZ1bmN0aW9ucyB3aGljaCBjYWxsIGEgbWl4IG9mIGNtZF93YWl0IGFuZCBoY2Zpb19zdHJpbmcgb25seSBuZWVkIHRvIGNoZWNrIHRoZSByZXR1cm4gc3RhdHVzCisgKiAgIG9mIHRoZSBsYXN0IGNhbGwKKyAqIG8gVGhlIHJldHVybiBjb2RlIGlzIHByZXNldCBhdCBUaW1lIG91dC4KKyAqICAgVGhlIGFkZGl0aW9uYWwgY29tcGxpY2F0aW9uIHRoYXQgbm8gY2FsaWJyYXRlZCB2YWx1ZSBmb3IgdGhlIHByb3RlY3Rpb24gY291bnQgY2FuIGJlIGFzc3VtZWQgc2luY2UKKyAqICAgY2FsaWJyYXRlKCkgZG9lcyBub3QgeWV0IGhhdmUgZGV0ZXJtaW5lZCBhIGNhbGlicmF0ZWQgdmFsdWUgKGEgY2F0Y2ggMjIpLCBpcyBoYW5kbGVkIGJ5IHNldHRpbmcgdGhlCisgKiAgIGluaXRpYWwgdmFsdWUgYXQgSU5JX1RJQ0tfSU5JIChieSBoY2ZfY29ubmVjdCkuIFRoaXMgYXBwcm9hY2ggaXMgY29uc2lkZXJlZCBzYWZlLCBiZWNhdXNlOgorICogICAgIC0gdGhlIEhDRiBkb2VzIG5vdCB1c2UgdGhlIHBpcGVsaW5lIG1lY2hhbmlzbSBvZiBIZXJtZXMgY29tbWFuZHMuCisgKiAgICAgLSB0aGUgbGlrZWxpaG9vZCBvZiBmYWlsdXJlICh0aGUgb25seSB0aW1lIHdoZW4gcHJvdGVjdGlvbiBjb3VudCBpcyByZWxldmFudCkgaXMgc21hbGwuCisgKiAgICAgLSB0aGUgdGltZSB3aWxsIGJlIHN1ZmZpY2llbnRseSBsYXJnZSBvbiBhIGZhc3QgbWFjaGluZSAoYnVzeSBiaXQgZHJvcHMgb24gZ29vZCBOSUMgYmVmb3JlIGNvdW50ZXIKKyAqICAgICAgIGV4cGlyZXMpCisgKiAgICAgLSB0aGUgdGltZSB3aWxsIGJlIHN1ZmZpY2llbnRseSBzbWFsbCBvbiBhIHNsb3cgbWFjaGluZSAoY291bnRlciBleHBpcmVzIG9uIGJhZCBOSUMgYmVmb3JlIHRoZSBlbmQgdXNlcgorICogICAgICAgc3dpdGNoZXMgdGhlIHBvd2VyIG9mZiBpbiBkZXNwYWlyCisgKiAgIFRoZSB0aW1lIG5lZWRlZCB0byB3cmFwIGEgMzIgYml0IGNvdW50ZXIgYXJvdW5kIGlzIGxvbmdlciB0aGFuIG1hbnkgaHVtYW5zIHdhbnQgdG8gd2FpdCwgaGVuY2UgdGhlIG1vcmUgb3IKKyAqICAgbGVzcyBhcmJpdHJhcnkgdmFsdWUgb2YgMHg0MDAwMEwgaXMgY2hvc2VuLCBhc3N1bWluZyBpdCBkb2VzIG5vdCB0YWtlIHRvbyBsb25nIG9uIGFuIFhUIGFuZCBpcyBub3QgdG9vCisgKiAgIHNob3J0IG9uIGEgc2NyZWFtLW1hY2hpbmUuCisgKgorICouRU5ERE9DICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIEhDRl9TVEFUSUMgdm9pZAogY2FsaWJyYXRlKCBJRkJQIGlmYnAgKQogewotaW50CQljbnQgPSBIQ0ZfUFJPVF9USU1FX0NOVDsKLWhjZl8zMglwcm90X2NudDsKKwlpbnQgICAgIGNudCA9IEhDRl9QUk9UX1RJTUVfQ05UOworCWhjZl8zMiAgcHJvdF9jbnQ7CiAKIAlIQ0ZUUkFDRSggaWZicCwgSENGX1RSQUNFX0NBTElCUkFURSApOwotCWlmICggaWZicC0+SUZCX1RpY2tJbmkgPT0gSU5JX1RJQ0tfSU5JICkgewkJCQkJCQkJCQkJCQkvKjEqLwotCQlpZmJwLT5JRkJfVGlja0luaSA9IDA7CQkJCQkJCQkJCQkJCQkJCQkvKjIqLwotCQkJd2hpbGUgKCBjbnQtLSApIHsKLQkJCQlwcm90X2NudCA9IElOSV9USUNLX0lOSTsKLQkJCQlPUFcoIEhSRUdfRVZfQUNLLCBIUkVHX0VWX1RJQ0sgKTsJCQkJCQkJCQkJCQkvKjMqLwotCQkJCXdoaWxlICggKElQVyggSFJFR19FVl9TVEFUICkgJiBIUkVHX0VWX1RJQ0spID09IDAgJiYgLS1wcm90X2NudCApIHsKLQkJCQkJaWZicC0+SUZCX1RpY2tJbmkrKzsKLQkJCQl9Ci0JCQkJaWYgKCBwcm90X2NudCA9PSAwIHx8IHByb3RfY250ID09IElOSV9USUNLX0lOSSApIHsJCQkJCQkJCS8qNCovCi0JCQkJCWlmYnAtPklGQl9UaWNrSW5pID0gSU5JX1RJQ0tfSU5JOwotCQkJCQlpZmJwLT5JRkJfRGVmdW5jdFN0YXQgPSBIQ0ZfRVJSX0RFRlVOQ1RfVElNRVI7Ci0JCQkJCWlmYnAtPklGQl9DYXJkU3RhdCB8PSBDQVJEX1NUQVRfREVGVU5DVDsKLQkJCQkJSENGQVNTRVJUKCBET19BU1NFUlQsIHByb3RfY250ICkKLQkJCQl9CisJaWYgKCBpZmJwLT5JRkJfVGlja0luaSA9PSBJTklfVElDS19JTkkgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjEqLworCQlpZmJwLT5JRkJfVGlja0luaSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoyKi8KKwkJd2hpbGUgKCBjbnQtLSApIHsKKwkJCXByb3RfY250ID0gSU5JX1RJQ0tfSU5JOworCQkJT1BXKCBIUkVHX0VWX0FDSywgSFJFR19FVl9USUNLICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjMqLworCQkJd2hpbGUgKCAoSVBXKCBIUkVHX0VWX1NUQVQgKSAmIEhSRUdfRVZfVElDSykgPT0gMCAmJiAtLXByb3RfY250ICkgeworCQkJCWlmYnAtPklGQl9UaWNrSW5pKys7CiAJCQl9Ci0JCWlmYnAtPklGQl9UaWNrSW5pIDw8PSBIQ0ZfUFJPVF9USU1FX1NIRlQ7CQkJCQkJCQkJCQkJLyo4Ki8KKwkJCWlmICggcHJvdF9jbnQgPT0gMCB8fCBwcm90X2NudCA9PSBJTklfVElDS19JTkkgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyo0Ki8KKwkJCQlpZmJwLT5JRkJfVGlja0luaSA9IElOSV9USUNLX0lOSTsKKwkJCQlpZmJwLT5JRkJfRGVmdW5jdFN0YXQgPSBIQ0ZfRVJSX0RFRlVOQ1RfVElNRVI7CisJCQkJaWZicC0+SUZCX0NhcmRTdGF0IHw9IENBUkRfU1RBVF9ERUZVTkNUOworCQkJCUhDRkFTU0VSVCggRE9fQVNTRVJULCBwcm90X2NudCApOworCQkJfQorCQl9CisJCWlmYnAtPklGQl9UaWNrSW5pIDw8PSBIQ0ZfUFJPVF9USU1FX1NIRlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjgqLwogCX0KIAlIQ0ZUUkFDRSggaWZicCwgSENGX1RSQUNFX0NBTElCUkFURSB8IEhDRl9UUkFDRV9FWElUICk7CiB9IC8vIGNhbGlicmF0ZQogI2VuZGlmIC8vIEhDRl9QUk9UX1RJTUUKIAogCi0jaWYgKEhDRl9ETF9PTkxZKSA9PSAwCiAjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKi5TVUJNT0RVTEUJCWludCBjaGVja19taWMoIElGQlAgaWZicCApCi0qLlBVUlBPU0UJCXZlcmlmaWVzIHRoZSBNSUMgb2YgYSByZWNlaXZlZCBub24tVVNCIGZyYW1lLgotKgotKi5BUkdVTUVOVFMKLSoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCi0qCi0qLlJFVFVSTlMKLSoJSENGX1NVQ0NFU1MKLSoJSENGX0VSUl9NSUMKLSoKLSouREVTQ1JJUFRJT04KLSoKLSoKLSouRElBR1JBTQotKgotKjQ6CXRlc3Qgd2hldGhlciBvciBub3QgYSBNSUMgaXMgcmVwb3J0ZWQgYnkgdGhlIEhlcm1lcwotKjE0OiB0aGUgY2FsY3VsYXRlZCBNSUMgYW5kIHRoZSByZWNlaXZlZCBNSUMgYXJlIGNvbXBhcmVkLCB0aGUgcmV0dXJuIHN0YXR1cyBpcyBzZXQgd2hlbiB0aGVyZSBpcyBhIG1pc21hdGNoCi0qCi0qLk5PVElDRQotKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqCisgKi5TVUJNT0RVTEUgICAgIGludCBjaGVja19taWMoIElGQlAgaWZicCApCisgKi5QVVJQT1NFICAgICAgIHZlcmlmaWVzIHRoZSBNSUMgb2YgYSByZWNlaXZlZCBub24tVVNCIGZyYW1lLgorICoKKyAqLkFSR1VNRU5UUworICogICBpZmJwICAgICAgICBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyAqCisgKi5SRVRVUk5TCisgKiAgIEhDRl9TVUNDRVNTCisgKiAgIEhDRl9FUlJfTUlDCisgKgorICouREVTQ1JJUFRJT04KKyAqCisgKgorICouRElBR1JBTQorICoKKyAqNDogdGVzdCB3aGV0aGVyIG9yIG5vdCBhIE1JQyBpcyByZXBvcnRlZCBieSB0aGUgSGVybWVzCisgKjE0OiB0aGUgY2FsY3VsYXRlZCBNSUMgYW5kIHRoZSByZWNlaXZlZCBNSUMgYXJlIGNvbXBhcmVkLCB0aGUgcmV0dXJuIHN0YXR1cyBpcyBzZXQgd2hlbiB0aGVyZSBpcyBhIG1pc21hdGNoCisgKgorICouTk9USUNFCisgKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogaW50CiBjaGVja19taWMoIElGQlAgaWZicCApCiB7Ci1pbnQJCXJjID0gSENGX1NVQ0NFU1M7Ci1oY2ZfMzIgeDMyWzJdOwkJCQkvLyogYXJlYSB0byBzYXZlIHJjdmQgOCBieXRlcyBNSUMKKwlpbnQgICAgIHJjID0gSENGX1NVQ0NFU1M7CisJaGNmXzMyIHgzMlsyXTsgICAgICAgICAgICAgIC8vKiBhcmVhIHRvIHNhdmUgcmN2ZCA4IGJ5dGVzIE1JQwogCi0JCQkJCQkJCQkJCQkJLy9pZiBNSUMgcHJlc2VudCBpbiBSeEZTCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgTUlDIHByZXNlbnQgaW4gUnhGUwogCWlmICggKih3Y2lfcmVjb3JkcCkmaWZicC0+SUZCX2xhcFstSEZTX0FERFJfREVTVF0gJiBIRlNfU1RBVF9NSUMgKSB7Ci0JLy9vciBpZiAoIGlmYnAtPklGQl9NSUNSeENhcnJ5ICE9IDB4RkZGRiApCi0JCUNBTENfUlhfTUlDKCBtaWNfcGFkLCA4ICk7CQkJCQkvLy4gIHByb2Nlc3MgdXAgdG8gMyByZW1haW5pbmcgYnl0ZXMgb2YgZGF0YSBhbmQgYXBwZW5kIDUgdG8gOCBieXRlcyBvZiBwYWRkaW5nIHRvIE1JQyBjYWxjdWxhdGlvbgorCQkvL29yIGlmICggaWZicC0+SUZCX01JQ1J4Q2FycnkgIT0gMHhGRkZGICkKKwkJQ0FMQ19SWF9NSUMoIG1pY19wYWQsIDggKTsgICAgICAgICAgICAgICAgICAvLy4gIHByb2Nlc3MgdXAgdG8gMyByZW1haW5pbmcgYnl0ZXMgb2YgZGF0YSBhbmQgYXBwZW5kIDUgdG8gOCBieXRlcyBvZiBwYWRkaW5nIHRvIE1JQyBjYWxjdWxhdGlvbgogCQlnZXRfZnJhZyggaWZicCwgKHdjaV9idWZwKXgzMiwgOCBCRV9QQVIoMCkpOy8vLiAgZ2V0IDggYnl0ZSBNSUMgZnJvbSBOSUMKLQkJCQkJCQkJCQkJCQkvLy4gIGlmIGNhbGN1bGF0ZWQgYW5kIHJlY2VpdmVkIE1JQyBkbyBub3QgbWF0Y2gKLQkJCQkJCQkJCQkJCQkvLy4gIC4gIHNldCBzdGF0dXMgYXQgSENGX0VSUl9NSUMKLS8qMTQqLyAgaWYgKCB4MzJbMF0gIT0gQ05WX0xJVFRMRV9UT19MT05HKGlmYnAtPklGQl9NSUNSeFswXSkgfHwKLSAgICAgICAgCSB4MzJbMV0gIT0gQ05WX0xJVFRMRV9UT19MT05HKGlmYnAtPklGQl9NSUNSeFsxXSkJICApIHsKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIGlmIGNhbGN1bGF0ZWQgYW5kIHJlY2VpdmVkIE1JQyBkbyBub3QgbWF0Y2gKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIHNldCBzdGF0dXMgYXQgSENGX0VSUl9NSUMKKwkvKjE0Ki8gIGlmICggeDMyWzBdICE9IENOVl9MSVRUTEVfVE9fTE9ORyhpZmJwLT5JRkJfTUlDUnhbMF0pIHx8CisJCSAgICAgeDMyWzFdICE9IENOVl9MSVRUTEVfVE9fTE9ORyhpZmJwLT5JRkJfTUlDUnhbMV0pICAgICApIHsKIAkJCXJjID0gSENGX0VSUl9NSUM7CiAJCX0KIAl9Ci0JCQkJCQkJCQkJCQkJLy9yZXR1cm4gc3RhdHVzCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIHN0YXR1cwogCXJldHVybiByYzsKIH0gLy8gY2hlY2tfbWljCiAjZW5kaWYgLy8gSENGX1RZUEVfV1BBCi0jZW5kaWYgLy8gSENGX0RMX09OTFkKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qLlNVQk1PRFVMRQkJaW50IGNtZF9jbXBsKCBJRkJQIGlmYnAgKQotKi5QVVJQT1NFCQl3YWl0cyBmb3IgSGVybWVzIENvbW1hbmQgQ29tcGxldGlvbi4KLSoKLSouQVJHVU1FTlRTCi0qCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawotKgotKi5SRVRVUk5TCi0qCUlGQl9EZWZ1bmN0U3RhdAotKglIQ0ZfRVJSX1RJTUVfT1VUCi0qCUhDRl9FUlJfREVGVU5DVF9DTURfU0VRCi0qCUhDRl9TVUNDRVNTCi0qCi0qLkRFU0NSSVBUSU9OCi0qCi0qCi0qLkRJQUdSQU0KLSoKLSoyOglPbmNlIGNtZF9jbXBsIGlzIGNhbGxlZCwgdGhlIEJ1c3kgb3B0aW9uIGJpdCBpbiBJRkJfQ21kIG11c3QgYmUgY2xlYXJlZAotKjQ6CUlmIFN0YXR1cyByZWdpc3RlciBhbmQgY29tbWFuZCBjb2RlIGRvbid0IG1hdGNoIGVpdGhlcjoKLSoJIC0gdGhlIEhlcm1lcyBhbmQgSG9zdCBhcmUgb3V0IG9mIHN5bmMgKCBhIGZhdGFsIGVycm9yKQotKgkgLSBlcnJvciBiaXRzIGFyZSByZXBvcnRlZCB2aWEgdGhlIFN0YXR1cyBSZWdpc3Rlci4KLSoJT3V0IG9mIHN5bmMgaXMgY29uc2lkZXJlZCBmYXRhbCBhbmQgYnJpbmdzIHRoZSBIQ0YgaW4gRGVmdW5jdCBtb2RlCi0qCUVycm9ycyByZXBvcnRlZCB2aWEgdGhlIFN0YXR1cyBSZWdpc3RlciBzaG91bGQgYmUgY2F1c2VkIGJ5IHNlcXVlbmNlIHZpb2xhdGlvbnMgaW4gSGVybWVzIGNvbW1hbmQKLSoJc2VxdWVuY2VzIGFuZCBoZW5jZSB0aGVzZSBidWdzIHNob3VsZCBoYXZlIGJlZW4gZm91bmQgZHVyaW5nIGVuZ2luZWVyaW5nIHRlc3RpbmcuIFNpbmNlIHRoZXJlIGlzIG5vCi0qCXN0cmF0ZWd5IHRvIGNvcGUgd2l0aCB0aGlzIHByb2JsZW0sIGl0IG1pZ2h0IGFzIHdlbGwgYmUgaWdub3JlZCBhdCBydW4gdGltZS4gTm90ZSB0aGF0IGZvciBhbnkgcGFydGljdWxhcgotKglzaXR1YXRpb24gd2hlcmUgYSBzdHJhdGVneSBpcyBmb3JtdWxhdGVkIHRvIGhhbmRsZSB0aGUgY29uc2VxdWVuY2VzIG9mIGEgcGFydGljdWxhciBidWcgY2F1c2luZyBhCi0qCXBhcnRpY3VsYXIgRXJyb3Igc2l0dWF0aW9uIHJlcG9ydGVkIHZpYSB0aGUgU3RhdHVzIFJlZ2lzdGVyLCB0aGUgYnVnIHNob3VsZCBiZSByZW1vdmVkIHJhdGhlciB0aGFuIGFkZGluZwotKglsb2dpYyB0byBjb3BlIHdpdGggdGhlIGNvbnNlcXVlbmNlcyBvZiB0aGUgYnVnLgotKglUaGVyZSBoYXZlIGJlZW4gSENGIHZlcnNpb25zIHdoZXJlIGFuIGVycm9yIHJlcG9ydCB2aWEgdGhlIFN0YXR1cyBSZWdpc3RlciBldmVuIGJyb3VnaHQgdGhlIEhDRiBpbiBkZWZ1bmN0Ci0qCW1vZGUgKGFsdGhvdWdoIGl0IHdhcyBub3QgeWV0IG5hbWVkIGxpa2UgdGhhdCBhdCB0aGF0IHRpbWUpLiBUaGlzIGlzIHBhcnRpY3VsYXIgdW5kZXNpcmFibGUgYmVoYXZpb3IgZm9yIGEKLSoJZ2VuZXJhbCBsaWJyYXJ5LgotKglTaW1wbHkgcmVwb3J0aW5nIHRoZSBlcnJvciAoYXMgImludGVyZXN0aW5nIikgaXMgZGViYXRhYmxlLiBUaGVyZSBhbHNvIGhhdmUgYmVlbiBIQ0YgdmVyc2lvbnMgd2l0aCB0aGlzCi0qCXN0cmF0ZWd5IHVzaW5nIHRoZSAidmFndWUiIEhDRl9GQUlMVVJFIGNvZGUuCi0qCVRoZSBlcnJvciBpcyByZXBvcnRlZCB2aWE6Ci0qCSAtIE1pc2NFcnIgdGFsbHkgb2YgdGhlIEhDRiBUYWxseSBzZXQKLSoJIC0gdGhlIChpbmZvcm1hdGl2ZSkgZmllbGRzIElGQl9FcnJDbWQgYW5kIElGQl9FcnJRdWFsaWZpZXIKLSoJIC0gdGhlIGFzc2VydCBtZWNoYW5pc20KLSo4OglIZXJlIHRoZSBEZWZ1bmN0IGNhc2UgYW5kIHRoZSBTdGF0dXMgZXJyb3IgYXJlIHNlcGFyYXRlbHkgdHJlYXRlZAotKgotKgotKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqCisgKi5TVUJNT0RVTEUgICAgIGludCBjbWRfY21wbCggSUZCUCBpZmJwICkKKyAqLlBVUlBPU0UgICAgICAgd2FpdHMgZm9yIEhlcm1lcyBDb21tYW5kIENvbXBsZXRpb24uCisgKgorICouQVJHVU1FTlRTCisgKiAgIGlmYnAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworICoKKyAqLlJFVFVSTlMKKyAqICAgSUZCX0RlZnVuY3RTdGF0CisgKiAgIEhDRl9FUlJfVElNRV9PVVQKKyAqICAgSENGX0VSUl9ERUZVTkNUX0NNRF9TRVEKKyAqICAgSENGX1NVQ0NFU1MKKyAqCisgKi5ERVNDUklQVElPTgorICoKKyAqCisgKi5ESUFHUkFNCisgKgorICoyOiBPbmNlIGNtZF9jbXBsIGlzIGNhbGxlZCwgdGhlIEJ1c3kgb3B0aW9uIGJpdCBpbiBJRkJfQ21kIG11c3QgYmUgY2xlYXJlZAorICo0OiBJZiBTdGF0dXMgcmVnaXN0ZXIgYW5kIGNvbW1hbmQgY29kZSBkb24ndCBtYXRjaCBlaXRoZXI6CisgKiAgICAtIHRoZSBIZXJtZXMgYW5kIEhvc3QgYXJlIG91dCBvZiBzeW5jICggYSBmYXRhbCBlcnJvcikKKyAqICAgIC0gZXJyb3IgYml0cyBhcmUgcmVwb3J0ZWQgdmlhIHRoZSBTdGF0dXMgUmVnaXN0ZXIuCisgKiAgIE91dCBvZiBzeW5jIGlzIGNvbnNpZGVyZWQgZmF0YWwgYW5kIGJyaW5ncyB0aGUgSENGIGluIERlZnVuY3QgbW9kZQorICogICBFcnJvcnMgcmVwb3J0ZWQgdmlhIHRoZSBTdGF0dXMgUmVnaXN0ZXIgc2hvdWxkIGJlIGNhdXNlZCBieSBzZXF1ZW5jZSB2aW9sYXRpb25zIGluIEhlcm1lcyBjb21tYW5kCisgKiAgIHNlcXVlbmNlcyBhbmQgaGVuY2UgdGhlc2UgYnVncyBzaG91bGQgaGF2ZSBiZWVuIGZvdW5kIGR1cmluZyBlbmdpbmVlcmluZyB0ZXN0aW5nLiBTaW5jZSB0aGVyZSBpcyBubworICogICBzdHJhdGVneSB0byBjb3BlIHdpdGggdGhpcyBwcm9ibGVtLCBpdCBtaWdodCBhcyB3ZWxsIGJlIGlnbm9yZWQgYXQgcnVuIHRpbWUuIE5vdGUgdGhhdCBmb3IgYW55IHBhcnRpY3VsYXIKKyAqICAgc2l0dWF0aW9uIHdoZXJlIGEgc3RyYXRlZ3kgaXMgZm9ybXVsYXRlZCB0byBoYW5kbGUgdGhlIGNvbnNlcXVlbmNlcyBvZiBhIHBhcnRpY3VsYXIgYnVnIGNhdXNpbmcgYQorICogICBwYXJ0aWN1bGFyIEVycm9yIHNpdHVhdGlvbiByZXBvcnRlZCB2aWEgdGhlIFN0YXR1cyBSZWdpc3RlciwgdGhlIGJ1ZyBzaG91bGQgYmUgcmVtb3ZlZCByYXRoZXIgdGhhbiBhZGRpbmcKKyAqICAgbG9naWMgdG8gY29wZSB3aXRoIHRoZSBjb25zZXF1ZW5jZXMgb2YgdGhlIGJ1Zy4KKyAqICAgVGhlcmUgaGF2ZSBiZWVuIEhDRiB2ZXJzaW9ucyB3aGVyZSBhbiBlcnJvciByZXBvcnQgdmlhIHRoZSBTdGF0dXMgUmVnaXN0ZXIgZXZlbiBicm91Z2h0IHRoZSBIQ0YgaW4gZGVmdW5jdAorICogICBtb2RlIChhbHRob3VnaCBpdCB3YXMgbm90IHlldCBuYW1lZCBsaWtlIHRoYXQgYXQgdGhhdCB0aW1lKS4gVGhpcyBpcyBwYXJ0aWN1bGFyIHVuZGVzaXJhYmxlIGJlaGF2aW9yIGZvciBhCisgKiAgIGdlbmVyYWwgbGlicmFyeS4KKyAqICAgU2ltcGx5IHJlcG9ydGluZyB0aGUgZXJyb3IgKGFzICJpbnRlcmVzdGluZyIpIGlzIGRlYmF0YWJsZS4gVGhlcmUgYWxzbyBoYXZlIGJlZW4gSENGIHZlcnNpb25zIHdpdGggdGhpcworICogICBzdHJhdGVneSB1c2luZyB0aGUgInZhZ3VlIiBIQ0ZfRkFJTFVSRSBjb2RlLgorICogICBUaGUgZXJyb3IgaXMgcmVwb3J0ZWQgdmlhOgorICogICAgLSBNaXNjRXJyIHRhbGx5IG9mIHRoZSBIQ0YgVGFsbHkgc2V0CisgKiAgICAtIHRoZSAoaW5mb3JtYXRpdmUpIGZpZWxkcyBJRkJfRXJyQ21kIGFuZCBJRkJfRXJyUXVhbGlmaWVyCisgKiAgICAtIHRoZSBhc3NlcnQgbWVjaGFuaXNtCisgKjg6IEhlcmUgdGhlIERlZnVuY3QgY2FzZSBhbmQgdGhlIFN0YXR1cyBlcnJvciBhcmUgc2VwYXJhdGVseSB0cmVhdGVkCisgKgorICoKKyAqLkVORERPQyAgICAgICAgICAgICAgICBFTkQgRE9DVU1FTlRBVElPTgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBIQ0ZfU1RBVElDIGludAogY21kX2NtcGwoIElGQlAgaWZicCApCiB7CiAKLVBST1RfQ05UX0lOSQotaW50CQlyYyA9IEhDRl9TVUNDRVNTOwotaGNmXzE2CXN0YXQ7CisJUFJPVF9DTlRfSU5JOworCWludCAgICAgcmMgPSBIQ0ZfU1VDQ0VTUzsKKwloY2ZfMTYgIHN0YXQ7CiAKLQlIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0NNRF9DUEwsIGlmYnAtPklGQl9DbWQgKQotCWlmYnAtPklGQl9DbWQgJj0gfkhDTURfQlVTWTsJCQkJCQkJCQkJCQkvKiAyICovCi0JSENGX1dBSVRfV0hJTEUoIChJUFcoIEhSRUdfRVZfU1RBVCkgJiBIUkVHX0VWX0NNRCkgPT0gMCApOwkJCQkJLyogNCAqLworCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfQ01EX0NQTCwgaWZicC0+SUZCX0NtZCApOworCWlmYnAtPklGQl9DbWQgJj0gfkhDTURfQlVTWTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyICovCisJSENGX1dBSVRfV0hJTEUoIChJUFcoIEhSRUdfRVZfU1RBVCkgJiBIUkVHX0VWX0NNRCkgPT0gMCApOyAgICAgICAgICAgICAgICAgIC8qIDQgKi8KIAlzdGF0ID0gSVBXKCBIUkVHX1NUQVQgKTsKICNpZiBIQ0ZfUFJPVF9USU1FCiAJaWYgKCBwcm90X2NudCA9PSAwICkgewotCQlJRl9UQUxMWSggaWZicC0+SUZCX0hDRl9UYWxsaWVzLk1pc2NFcnIrKzsgKQorCQlJRl9UQUxMWSggaWZicC0+SUZCX0hDRl9UYWxsaWVzLk1pc2NFcnIrKyApOwogCQlyYyA9IEhDRl9FUlJfVElNRV9PVVQ7Ci0JCUhDRkFTU0VSVCggRE9fQVNTRVJULCBpZmJwLT5JRkJfQ21kICkKKwkJSENGQVNTRVJUKCBET19BU1NFUlQsIGlmYnAtPklGQl9DbWQgKTsKIAl9IGVsc2UKICNlbmRpZiAvLyBIQ0ZfUFJPVF9USU1FCiAJewogCQlEQVdBX0FDSyggSFJFR19FVl9DTUQgKTsKLS8qNCovCWlmICggc3RhdCAhPSAoaWZicC0+SUZCX0NtZCAmIEhDTURfQ01EX0NPREUpICkgewotLyo4Ki8JCWlmICggKCAoc3RhdCBeIGlmYnAtPklGQl9DbWQgKSAmIEhDTURfQ01EX0NPREUpICE9IDAgKSB7CisJLyo0Ki8gICBpZiAoIHN0YXQgIT0gKGlmYnAtPklGQl9DbWQgJiBIQ01EX0NNRF9DT0RFKSApIHsKKwkJLyo4Ki8gICBpZiAoICggKHN0YXQgXiBpZmJwLT5JRkJfQ21kICkgJiBIQ01EX0NNRF9DT0RFKSAhPSAwICkgewogCQkJCXJjID0gaWZicC0+SUZCX0RlZnVuY3RTdGF0ID0gSENGX0VSUl9ERUZVTkNUX0NNRF9TRVE7CiAJCQkJaWZicC0+SUZCX0NhcmRTdGF0IHw9IENBUkRfU1RBVF9ERUZVTkNUOwogCQkJfQotCQkJSUZfVEFMTFkoIGlmYnAtPklGQl9IQ0ZfVGFsbGllcy5NaXNjRXJyKys7ICkKKwkJCUlGX1RBTExZKCBpZmJwLT5JRkJfSENGX1RhbGxpZXMuTWlzY0VycisrICk7CiAJCQlpZmJwLT5JRkJfRXJyQ21kID0gc3RhdDsKIAkJCWlmYnAtPklGQl9FcnJRdWFsaWZpZXIgPSBJUFcoIEhSRUdfUkVTUF8wICk7Ci0JCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgTUVSR0VfMiggSVBXKCBIUkVHX1BBUkFNXzAgKSwgaWZicC0+SUZCX0NtZCApICkKLQkJCUhDRkFTU0VSVCggRE9fQVNTRVJULCBNRVJHRV8yKCBpZmJwLT5JRkJfRXJyUXVhbGlmaWVyLCBpZmJwLT5JRkJfRXJyQ21kICkgKQorCQkJSENGQVNTRVJUKCBET19BU1NFUlQsIE1FUkdFXzIoIElQVyggSFJFR19QQVJBTV8wICksIGlmYnAtPklGQl9DbWQgKSApOworCQkJSENGQVNTRVJUKCBET19BU1NFUlQsIE1FUkdFXzIoIGlmYnAtPklGQl9FcnJRdWFsaWZpZXIsIGlmYnAtPklGQl9FcnJDbWQgKSApOwogCQl9CiAJfQotCUhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjKQotCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9DTURfQ1BMICkKKwlIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCByYyk7CisJSENGTE9HRVhJVCggSENGX1RSQUNFX0NNRF9DUEwgKTsKIAlyZXR1cm4gcmM7CiB9IC8vIGNtZF9jbXBsCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKi5TVUJNT0RVTEUJCWludCBjbWRfZXhlKCBJRkJQIGlmYnAsIGludCBjbWRfY29kZSwgaW50IHBhcl8wICkKLSouUFVSUE9TRQkJRXhlY3V0ZXMgc3luY2hyb25vdXMgcGFydCBvZiBIZXJtZXMgQ29tbWFuZCBhbmQgLSBvcHRpb25hbGx5IC0gd2FpdHMgZm9yIENvbW1hbmQgQ29tcGxldGlvbi4KLSoKLSouQVJHVU1FTlRTCi0qCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawotKgljbWRfY29kZQotKglwYXJfMAotKgotKi5SRVRVUk5TCi0qCUlGQl9EZWZ1bmN0U3RhdAotKglIQ0ZfRVJSX0RFRlVOQ1RfQ01EX1NFUQotKglIQ0ZfU1VDQ0VTUwotKglIQ0ZfRVJSX1RPX0JFX0FEREVECTw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8Ci0qCi0qLkRFU0NSSVBUSU9OCi0qIEV4ZWN1dGVzIHN5bmNocm9ub3VzIEhlcm1lcyBDb21tYW5kIGFuZCB3YWl0cyBmb3IgQ29tbWFuZCBDb21wbGV0aW9uCi0qCi0qIFRoZSBnZW5lcmFsIEhDRiBzdHJhdGVneSBpcyB0byB3YWl0IGZvciBjb21tYW5kIGNvbXBsZXRpb24uIEFzIGEgY29uc2VxdWVuY2U6Ci0qIC0gdGhlIHJlYWQgb2YgdGhlIGJ1c3kgYml0IGJlZm9yZSB3cml0aW5nIHRoZSBjb21tYW5kIHJlZ2lzdGVyIGlzIHN1cGVyZmx1b3VzCi0qIC0gdGhlIEhlcm1lcyByZXF1aXJlbWVudCB0aGF0IG5vIElucXVpcnkgY29tbWFuZCBtYXkgYmUgZXhlY3V0ZWQgaWYgdGhlcmUgaXMgc3RpbGwgYW4gdW5hY2tub3dsZWRnZWQKLSoJSW5xdWlyeSBjb21tYW5kIG91dHN0YW5kaW5nLCBpcyBhdXRvbWF0aWNhbGx5IG1ldC4KLSogVGhlIFR4IGNvbW1hbmQgdXNlcyB0aGUgIkJ1c3kiIGJpdCBpbiB0aGUgY21kX2NvZGUgcGFyYW1ldGVyIHRvIGRldmlhdGUgZnJvbSB0aGlzIGdlbmVyYWwgSENGIHN0cmF0ZWd5LgotKiBUaGUgaWRlYSBpcyB0aGF0IGJ5IG5vdCBidXN5LXdhaXRpbmcgb24gY29tcGxldGlvbiBvZiB0aGlzIGZyZXF1ZW50bHkgdXNlZCBjb21tYW5kIHRoZSBwcm9jZXNzb3IKLSogdXRpbGl6YXRpb24gaXMgZGltaW5pc2hlZCB3aGlsZSB1c2luZyB0aGUgYnVzeS13YWl0IG9uIGFsbCBvdGhlciBzZWxkb20gdXNlZCBjb21tYW5kcyB0aGUgZmxvdyBpcyBrZXB0Ci0qIHNpbXBsZS4KLSoKLSoKLSoKLSouRElBR1JBTQotKgotKjE6CXNraXAgdGhlIGJvZHkgb2YgY21kX2V4ZSB3aGVuIGluIGRlZnVuY3QgbW9kZSBvciB3aGVuIC0gYmFzZWQgb24gdGhlIFMvVyBTdXBwb3J0IHJlZ2lzdGVyIHdyaXRlIGFuZAotKglyZWFkIGJhY2sgdGVzdCAtIHRoZXJlIGlzIGFwcGFyZW50bHkgbm8gTklDLgotKglOb3RlOiB3ZSBnYXZlIHVwIG9uIHRoZSAib2xkIiBzdHJhdGVneSB0byB3cml0ZSB0aGUgUy9XIFN1cHBvcnQgcmVnaXN0ZXIgYXQgbWFnaWMgb25seSB3aGVuIG5lZWRlZC4gRHVlIHRvCi0qCXRoZSBpbnRyaWNhdGVuZXNzIG9mIEhlcm1lcyBGL1cgdmFyaWV0aWVzICggd2hpY2ggYmVoYXZlIGRpZmZlcmVudGx5IGFzIGZhciBhcyBjb3JydXB0aW9uIG9mIHRoZSBTL1cKLSoJU3VwcG9ydCByZWdpc3RlciBpcyBpbnZvbHZlZCksIHRoZSBpbmNyZWFzaW5nIG51bWJlciBvZiBIZXJtZXMgY29tbWFuZHMgd2hpY2ggZG8gYW4gaW1wbGljaXQgaW5pdGlhbGl6ZQotKgkodGh1cyBtb2RpZnlpbmcgdGhlIFMvVyBTdXBwb3J0IHJlZ2lzdGVyKSBhbmQgdGhlIHdvcmthcm91bmRzIG9mIHNvbWUgT1MvU3VwcG9ydCBTL1cgaW5kdWNlZCBhc3BlY3RzIChlLmcuCi0qCXRoZSBTeXN0ZW0gU29mdCBsaWJyYXJ5IGF0IFdpbk5UIHdoaWNoIHBvc3Rwb25lcyB0aGUgYWN0dWFsIG1hcHBpbmcgb2YgSS9PIHNwYWNlIHVwIHRvIDMwIHNlY29uZHMgYWZ0ZXIKLSoJZ2l2aW5nIHRoZSBnby1haGVhZCksIHRoZSAibWFnaWMiIHN0cmF0ZWd5IGlzIG5vdyByZWR1Y2VkIHRvIGEgc2ltcGxlIHdyaXRlIGFuZCByZWFkIGJhY2suIFRoaXMgbWVhbnMgdGhhdAotKglwcm9ibGVtcyBsaWtlIGEgYnVnIHRyYW1waW5nIG92ZXIgdGhlIG1lbW9yeSBtYXBwZWQgSGVybWVzIHJlZ2lzdGVycyB3aWxsIG5vIGxvbmdlciBiZSBub3RpY2VkIGFzIHNpZGUKLSoJZWZmZWN0IG9mIHRoZSBTL1cgU3VwcG9ydCByZWdpc3RlciBjaGVjay4KLSoyOgljaGVjayB3aGV0aGVyIHRoZSBwcmVjZWRpbmcgY29tbWFuZCBza2lwcGVkIHRoZSBidXN5IHdhaXQgYW5kIGlmIHNvLCBjaGVjayBmb3IgY29tbWFuZCBjb21wbGV0aW9uCi0qCi0qLk5PVElDRQotKi5FTkRET0MJCQkJRU5EIERPQ1VNRU5UQVRJT04KLSoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqCisgKi5TVUJNT0RVTEUgICAgIGludCBjbWRfZXhlKCBJRkJQIGlmYnAsIGludCBjbWRfY29kZSwgaW50IHBhcl8wICkKKyAqLlBVUlBPU0UgICAgICAgRXhlY3V0ZXMgc3luY2hyb25vdXMgcGFydCBvZiBIZXJtZXMgQ29tbWFuZCBhbmQgLSBvcHRpb25hbGx5IC0gd2FpdHMgZm9yIENvbW1hbmQgQ29tcGxldGlvbi4KKyAqCisgKi5BUkdVTUVOVFMKKyAqICAgaWZicCAgICAgICAgYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisgKiAgIGNtZF9jb2RlCisgKiAgIHBhcl8wCisgKgorICouUkVUVVJOUworICogICBJRkJfRGVmdW5jdFN0YXQKKyAqICAgSENGX0VSUl9ERUZVTkNUX0NNRF9TRVEKKyAqICAgSENGX1NVQ0NFU1MKKyAqICAgSENGX0VSUl9UT19CRV9BRERFRCA8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PAorICoKKyAqLkRFU0NSSVBUSU9OCisgKiBFeGVjdXRlcyBzeW5jaHJvbm91cyBIZXJtZXMgQ29tbWFuZCBhbmQgd2FpdHMgZm9yIENvbW1hbmQgQ29tcGxldGlvbgorICoKKyAqIFRoZSBnZW5lcmFsIEhDRiBzdHJhdGVneSBpcyB0byB3YWl0IGZvciBjb21tYW5kIGNvbXBsZXRpb24uIEFzIGEgY29uc2VxdWVuY2U6CisgKiAtIHRoZSByZWFkIG9mIHRoZSBidXN5IGJpdCBiZWZvcmUgd3JpdGluZyB0aGUgY29tbWFuZCByZWdpc3RlciBpcyBzdXBlcmZsdW91cworICogLSB0aGUgSGVybWVzIHJlcXVpcmVtZW50IHRoYXQgbm8gSW5xdWlyeSBjb21tYW5kIG1heSBiZSBleGVjdXRlZCBpZiB0aGVyZSBpcyBzdGlsbCBhbiB1bmFja25vd2xlZGdlZAorICogICBJbnF1aXJ5IGNvbW1hbmQgb3V0c3RhbmRpbmcsIGlzIGF1dG9tYXRpY2FsbHkgbWV0LgorICogVGhlIFR4IGNvbW1hbmQgdXNlcyB0aGUgIkJ1c3kiIGJpdCBpbiB0aGUgY21kX2NvZGUgcGFyYW1ldGVyIHRvIGRldmlhdGUgZnJvbSB0aGlzIGdlbmVyYWwgSENGIHN0cmF0ZWd5LgorICogVGhlIGlkZWEgaXMgdGhhdCBieSBub3QgYnVzeS13YWl0aW5nIG9uIGNvbXBsZXRpb24gb2YgdGhpcyBmcmVxdWVudGx5IHVzZWQgY29tbWFuZCB0aGUgcHJvY2Vzc29yCisgKiB1dGlsaXphdGlvbiBpcyBkaW1pbmlzaGVkIHdoaWxlIHVzaW5nIHRoZSBidXN5LXdhaXQgb24gYWxsIG90aGVyIHNlbGRvbSB1c2VkIGNvbW1hbmRzIHRoZSBmbG93IGlzIGtlcHQKKyAqIHNpbXBsZS4KKyAqCisgKgorICoKKyAqLkRJQUdSQU0KKyAqCisgKjE6IHNraXAgdGhlIGJvZHkgb2YgY21kX2V4ZSB3aGVuIGluIGRlZnVuY3QgbW9kZSBvciB3aGVuIC0gYmFzZWQgb24gdGhlIFMvVyBTdXBwb3J0IHJlZ2lzdGVyIHdyaXRlIGFuZAorICogICByZWFkIGJhY2sgdGVzdCAtIHRoZXJlIGlzIGFwcGFyZW50bHkgbm8gTklDLgorICogICBOb3RlOiB3ZSBnYXZlIHVwIG9uIHRoZSAib2xkIiBzdHJhdGVneSB0byB3cml0ZSB0aGUgUy9XIFN1cHBvcnQgcmVnaXN0ZXIgYXQgbWFnaWMgb25seSB3aGVuIG5lZWRlZC4gRHVlIHRvCisgKiAgIHRoZSBpbnRyaWNhdGVuZXNzIG9mIEhlcm1lcyBGL1cgdmFyaWV0aWVzICggd2hpY2ggYmVoYXZlIGRpZmZlcmVudGx5IGFzIGZhciBhcyBjb3JydXB0aW9uIG9mIHRoZSBTL1cKKyAqICAgU3VwcG9ydCByZWdpc3RlciBpcyBpbnZvbHZlZCksIHRoZSBpbmNyZWFzaW5nIG51bWJlciBvZiBIZXJtZXMgY29tbWFuZHMgd2hpY2ggZG8gYW4gaW1wbGljaXQgaW5pdGlhbGl6ZQorICogICAodGh1cyBtb2RpZnlpbmcgdGhlIFMvVyBTdXBwb3J0IHJlZ2lzdGVyKSBhbmQgdGhlIHdvcmthcm91bmRzIG9mIHNvbWUgT1MvU3VwcG9ydCBTL1cgaW5kdWNlZCBhc3BlY3RzIChlLmcuCisgKiAgIHRoZSBTeXN0ZW0gU29mdCBsaWJyYXJ5IGF0IFdpbk5UIHdoaWNoIHBvc3Rwb25lcyB0aGUgYWN0dWFsIG1hcHBpbmcgb2YgSS9PIHNwYWNlIHVwIHRvIDMwIHNlY29uZHMgYWZ0ZXIKKyAqICAgZ2l2aW5nIHRoZSBnby1haGVhZCksIHRoZSAibWFnaWMiIHN0cmF0ZWd5IGlzIG5vdyByZWR1Y2VkIHRvIGEgc2ltcGxlIHdyaXRlIGFuZCByZWFkIGJhY2suIFRoaXMgbWVhbnMgdGhhdAorICogICBwcm9ibGVtcyBsaWtlIGEgYnVnIHRyYW1waW5nIG92ZXIgdGhlIG1lbW9yeSBtYXBwZWQgSGVybWVzIHJlZ2lzdGVycyB3aWxsIG5vIGxvbmdlciBiZSBub3RpY2VkIGFzIHNpZGUKKyAqICAgZWZmZWN0IG9mIHRoZSBTL1cgU3VwcG9ydCByZWdpc3RlciBjaGVjay4KKyAqMjogY2hlY2sgd2hldGhlciB0aGUgcHJlY2VkaW5nIGNvbW1hbmQgc2tpcHBlZCB0aGUgYnVzeSB3YWl0IGFuZCBpZiBzbywgY2hlY2sgZm9yIGNvbW1hbmQgY29tcGxldGlvbgorICoKKyAqLk5PVElDRQorICouRU5ERE9DICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogSENGX1NUQVRJQyBpbnQKLWNtZF9leGUoIElGQlAgaWZicCwgaGNmXzE2IGNtZF9jb2RlLCBoY2ZfMTYgcGFyXzAgKQkvL2lmIEhDTURfQlVTWSBvZiBjbWRfY29kZSBzZXQsIHRoZW4gZG8gTk9UIHdhaXQgZm9yIGNvbXBsZXRpb24KK2NtZF9leGUoIElGQlAgaWZicCwgaGNmXzE2IGNtZF9jb2RlLCBoY2ZfMTYgcGFyXzAgKSAvL2lmIEhDTURfQlVTWSBvZiBjbWRfY29kZSBzZXQsIHRoZW4gZG8gTk9UIHdhaXQgZm9yIGNvbXBsZXRpb24KIHsKLWludCByYzsKKwlpbnQgcmM7CiAKLQlIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0NNRF9FWEUsIGNtZF9jb2RlICkKLQlIQ0ZBU1NFUlQoIChjbWRfY29kZSAmIEhDTURfQ01EX0NPREUpICE9IEhDTURfVFggfHwgY21kX2NvZGUgJiBIQ01EX0JVU1ksIGNtZF9jb2RlICkgLy9UeCBtdXN0IGhhdmUgQnVzeSBiaXQgc2V0CisJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9DTURfRVhFLCBjbWRfY29kZSApOworCUhDRkFTU0VSVCggKGNtZF9jb2RlICYgSENNRF9DTURfQ09ERSkgIT0gSENNRF9UWCB8fCBjbWRfY29kZSAmIEhDTURfQlVTWSwgY21kX2NvZGUgKTsgLy9UeCBtdXN0IGhhdmUgQnVzeSBiaXQgc2V0CiAJT1BXKCBIUkVHX1NXXzAsIEhDRl9NQUdJQyApOwotCWlmICggSVBXKCBIUkVHX1NXXzAgKSA9PSBIQ0ZfTUFHSUMgKSB7CQkJCQkJCQkJCQkJCQkvKiAxICovCisJaWYgKCBJUFcoIEhSRUdfU1dfMCApID09IEhDRl9NQUdJQyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxICovCiAJCXJjID0gaWZicC0+SUZCX0RlZnVuY3RTdGF0OwogCX0KIAllbHNlIHJjID0gSENGX0VSUl9OT19OSUM7CiAJaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHsKIAkJLy87P2lzIHRoaXMgYSBob3QgaWRlYSwgYmV0dGVyIE1FQVNVUkUgcGVyZm9ybWFuY2UgaW1wYWN0Ci0vKjIqLwlpZiAoIGlmYnAtPklGQl9DbWQgJiBIQ01EX0JVU1kgKSB7CisJLyoyKi8gICBpZiAoIGlmYnAtPklGQl9DbWQgJiBIQ01EX0JVU1kgKSB7CiAJCQlyYyA9IGNtZF9jbXBsKCBpZmJwICk7CiAJCX0KIAkJT1BXKCBIUkVHX1BBUkFNXzAsIHBhcl8wICk7CiAJCU9QVyggSFJFR19DTUQsIGNtZF9jb2RlICZ+SENNRF9CVVNZICk7CiAJCWlmYnAtPklGQl9DbWQgPSBjbWRfY29kZTsKLQkJaWYgKCAoY21kX2NvZGUgJiBIQ01EX0JVU1kpID09IDAgKSB7CS8vOz9pcyB0aGlzIGEgaG90IGlkZWEsIGJldHRlciBNRUFTVVJFIHBlcmZvcm1hbmNlIGltcGFjdAorCQlpZiAoIChjbWRfY29kZSAmIEhDTURfQlVTWSkgPT0gMCApIHsgICAgLy87P2lzIHRoaXMgYSBob3QgaWRlYSwgYmV0dGVyIE1FQVNVUkUgcGVyZm9ybWFuY2UgaW1wYWN0CiAJCQlyYyA9IGNtZF9jbXBsKCBpZmJwICk7CiAJCX0KIAl9Ci0JSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgTUVSR0VfMiggcmMsIGNtZF9jb2RlICkgKQotCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9DTURfRVhFICkKKwlIQ0ZBU1NFUlQoIHJjID09IEhDRl9TVUNDRVNTLCBNRVJHRV8yKCByYywgY21kX2NvZGUgKSApOworCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9DTURfRVhFICk7CiAJcmV0dXJuIHJjOwogfSAvLyBjbWRfZXhlCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKi5TVUJNT0RVTEUJCWludCBkb3dubG9hZCggSUZCUCBpZmJwLCBDRkdfUFJPR19TVFJDVCBGQVIgKmx0dnAgKQotKi5QVVJQT1NFCQlkb3dubG9hZHMgRi9XIGltYWdlIGludG8gTklDIGFuZCBpbml0aWF0ZXMgZXhlY3V0aW9uIG9mIHRoZSBkb3dubG9hZGVkIEYvVy4KLSoKLSouQVJHVU1FTlRTCi0qCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawotKglsdHZwCQlzcGVjaWZpZXMgdGhlIHBzZXVkby1SSUQgKGFzIGRlZmluZWQgYnkgV0NJKQotKgotKi5SRVRVUk5TCi0qCi0qLkRFU0NSSVBUSU9OCi0qCi0qCi0qLkRJQUdSQU0KLSoxOglGaXJzdCwgQWNrIGV2ZXJ5dGhpbmcgdG8gdW5ibG9jayBhIChwb3NzaWJseSkgYmxvY2tlZCBjbWQgcGlwZSBsaW5lCi0qCU5vdGUgMTogaXQgaXMgdmVyeSBsaWtlbHkgdGhhdCBhbiBBbGxvYyBldmVudCBpcyBwZW5kaW5nIGFuZCB2ZXJ5IHdlbGwgcG9zc2libGUgdGhhdCBhIChTZW5kKSBDbWQgZXZlbnQgaXMKLSoJcGVuZGluZwotKglOb3RlIDI6IGl0IGlzIGFzc3VtZWQgdGhhdCB0aGlzIHN0cmF0ZWd5IHRha2VzIGF3YXkgdGhlIG5lZWQgdG8gYWNrIGV2ZXJ5IGNvbmNlaXZhYmxlIGV2ZW50IGFmdGVyIGFuCi0qCUhlcm1lcyBJbml0aWFsaXplCi0qCi0qCi0qLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoKKyAqLlNVQk1PRFVMRSAgICAgaW50IGRvd25sb2FkKCBJRkJQIGlmYnAsIENGR19QUk9HX1NUUkNUIEZBUiAqbHR2cCApCisgKi5QVVJQT1NFICAgICAgIGRvd25sb2FkcyBGL1cgaW1hZ2UgaW50byBOSUMgYW5kIGluaXRpYXRlcyBleGVjdXRpb24gb2YgdGhlIGRvd25sb2FkZWQgRi9XLgorICoKKyAqLkFSR1VNRU5UUworICogICBpZmJwICAgICAgICBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyAqICAgbHR2cCAgICAgICAgc3BlY2lmaWVzIHRoZSBwc2V1ZG8tUklEIChhcyBkZWZpbmVkIGJ5IFdDSSkKKyAqCisgKi5SRVRVUk5TCisgKgorICouREVTQ1JJUFRJT04KKyAqCisgKgorICouRElBR1JBTQorICoxOiBGaXJzdCwgQWNrIGV2ZXJ5dGhpbmcgdG8gdW5ibG9jayBhIChwb3NzaWJseSkgYmxvY2tlZCBjbWQgcGlwZSBsaW5lCisgKiAgIE5vdGUgMTogaXQgaXMgdmVyeSBsaWtlbHkgdGhhdCBhbiBBbGxvYyBldmVudCBpcyBwZW5kaW5nIGFuZCB2ZXJ5IHdlbGwgcG9zc2libGUgdGhhdCBhIChTZW5kKSBDbWQgZXZlbnQgaXMKKyAqICAgcGVuZGluZworICogICBOb3RlIDI6IGl0IGlzIGFzc3VtZWQgdGhhdCB0aGlzIHN0cmF0ZWd5IHRha2VzIGF3YXkgdGhlIG5lZWQgdG8gYWNrIGV2ZXJ5IGNvbmNlaXZhYmxlIGV2ZW50IGFmdGVyIGFuCisgKiAgIEhlcm1lcyBJbml0aWFsaXplCisgKgorICoKKyAqLkVORERPQyAgICAgICAgICAgICAgICBFTkQgRE9DVU1FTlRBVElPTgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBIQ0ZfU1RBVElDIGludAotZG93bmxvYWQoIElGQlAgaWZicCwgQ0ZHX1BST0dfU1RSQ1QgRkFSICpsdHZwICkJCQkJCQkvL0hlcm1lcy1JSSBkb3dubG9hZCAodm9sYXRpbGUgb25seSkKK2Rvd25sb2FkKCBJRkJQIGlmYnAsIENGR19QUk9HX1NUUkNUIEZBUiAqbHR2cCApICAgICAgICAgICAgICAgICAgICAgLy9IZXJtZXMtSUkgZG93bmxvYWQgKHZvbGF0aWxlIG9ubHkpCiB7Ci1oY2ZfMTYJCQkJaTsKLWludAkJCQkJcmMgPSBIQ0ZfU1VDQ0VTUzsKLXdjaV9idWZwCQkJY3A7Ci1oY2ZfaW8JCQkJaW9fcG9ydCA9IGlmYnAtPklGQl9JT0Jhc2UgKyBIUkVHX0FVWF9EQVRBOworCWhjZl8xNiAgICAgICAgICAgICAgaTsKKwlpbnQgICAgICAgICAgICAgICAgIHJjID0gSENGX1NVQ0NFU1M7CisJd2NpX2J1ZnAgICAgICAgICAgICBjcDsKKwloY2ZfaW8gICAgICAgICAgICAgIGlvX3BvcnQgPSBpZmJwLT5JRkJfSU9CYXNlICsgSFJFR19BVVhfREFUQTsKIAotCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfREwsIGx0dnAtPnR5cCApCisJSENGTE9HRU5UUlkoIEhDRl9UUkFDRV9ETCwgbHR2cC0+dHlwICk7CiAjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1BSRUxPQURFRAotCUhDRkFTU0VSVCggRE9fQVNTRVJULCBsdHZwLT5tb2RlICkKKwlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgbHR2cC0+bW9kZSApOwogI2Vsc2UKLQkJCQkJCQkJCQkJCQkvL2lmIGluaXRpYWwgInByb2dyYW0iIExUVgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIGluaXRpYWwgInByb2dyYW0iIExUVgogCWlmICggaWZicC0+SUZCX0RMTW9kZSA9PSBDRkdfUFJPR19TVE9QICYmIGx0dnAtPm1vZGUgPT0gQ0ZHX1BST0dfVk9MQVRJTEUpIHsKLQkJCQkJCQkJCQkJCQkvLy4gIHN3aXRjaCBIZXJtZXMgdG8gaW5pdGlhbCBtb2RlCi0vKjEqLwlPUFcoIEhSRUdfRVZfQUNLLCB+SFJFR19FVl9TTEVFUF9SRVEgKTsKLQkJcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX0lOSSwgMCApOwkvKiBIQ01EX0lOSSBjYW4gbm90IGJlIHBhcnQgb2YgaW5pdCgpIGJlY2F1c2UgdGhhdCBpcyBjYWxsZWQgb24KLQkJCQkJCQkJCQkJICogb3RoZXIgb2NjYXNpb25zIGFzIHdlbGwgKi8KKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIHN3aXRjaCBIZXJtZXMgdG8gaW5pdGlhbCBtb2RlCisJLyoxKi8gICBPUFcoIEhSRUdfRVZfQUNLLCB+SFJFR19FVl9TTEVFUF9SRVEgKTsKKwkJcmMgPSBjbWRfZXhlKCBpZmJwLCBIQ01EX0lOSSwgMCApOyAgLyogSENNRF9JTkkgY2FuIG5vdCBiZSBwYXJ0IG9mIGluaXQoKSBiZWNhdXNlIHRoYXQgaXMgY2FsbGVkIG9uCisJCQkJCQkgICAgICogb3RoZXIgb2NjYXNpb25zIGFzIHdlbGwgKi8KIAkJcmMgPSBpbml0KCBpZmJwICk7CiAJfQotCQkJCQkJCQkJCQkJCS8vaWYgZmluYWwgInByb2dyYW0iIExUVgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIGZpbmFsICJwcm9ncmFtIiBMVFYKIAlpZiAoIGx0dnAtPm1vZGUgPT0gQ0ZHX1BST0dfU1RPUCAmJiBpZmJwLT5JRkJfRExNb2RlID09IENGR19QUk9HX1ZPTEFUSUxFKSB7Ci0JCQkJCQkJCQkJCQkJLy8uICBzdGFydCB0ZXJ0aWFyeSAob3Igc2Vjb25kYXJ5KQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgc3RhcnQgdGVydGlhcnkgKG9yIHNlY29uZGFyeSkKIAkJT1BXKCBIUkVHX1BBUkFNXzEsIChoY2ZfMTYpKGx0dnAtPm5pY19hZGRyID4+IDE2KSApOwogCQlyYyA9IGNtZF9leGUoIGlmYnAsIEhDTURfRVhFQ1VURSwgKGhjZl8xNikgbHR2cC0+bmljX2FkZHIgKTsKIAkJaWYgKHJjID09IEhDRl9TVUNDRVNTKSB7Ci0JCQlyYyA9IGluaXQoIGlmYnAgKTsJLyo7PyBkbyB3ZSByZWFsbHkgd2FudCB0byBza2lwIGluaXQgaWYgY21kX2V4ZSBmYWlsZWQsIGkuZS4KLQkJCQkJCQkJICoJIElGQl9GV19Db21wX0lkIGlzIHRoYW4gcG9zc2libHkgaW5jb3JyZWN0ICovCi0JICAJfQotCQkJCQkJCQkJCQkJCS8vZWxzZSAobm9uLWZpbmFsKQorCQkJcmMgPSBpbml0KCBpZmJwICk7ICAvKjs/IGRvIHdlIHJlYWxseSB3YW50IHRvIHNraXAgaW5pdCBpZiBjbWRfZXhlIGZhaWxlZCwgaS5lLgorCQkJCQkgICAgICogICBJRkJfRldfQ29tcF9JZCBpcyB0aGFuIHBvc3NpYmx5IGluY29ycmVjdCAqLworCQl9CisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lbHNlIChub24tZmluYWwpCiAJfSBlbHNlIHsKLQkJCQkJCQkJCQkJCQkvLy4gIGlmIG1vZGUgPT0gUmVhZGJhY2sgU0VFUFJPTQotI2lmIDAJLy87PyBhcyBsb25nIGFzIHRoZSBuZXh0IGlmIGNvbnRhaW5zIGEgaGFyZCBjb2RlZCAwLCBtaWdodCBhcyB3ZWxsIGxlYXZlIGl0IG91dCBldmVuIG1vcmUgb2J2aW91cworCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgaWYgbW9kZSA9PSBSZWFkYmFjayBTRUVQUk9NCisjaWYgMCAgIC8vOz8gYXMgbG9uZyBhcyB0aGUgbmV4dCBpZiBjb250YWlucyBhIGhhcmQgY29kZWQgMCwgbWlnaHQgYXMgd2VsbCBsZWF2ZSBpdCBvdXQgZXZlbiBtb3JlIG9idmlvdXMKIAkJaWYgKCAwIC8qbGVuIGlzIGRlZmluaXRlbHkgbm90IHdhbnQgd2Ugd2FudDs/Ki8gJiYgbHR2cC0+bW9kZSA9PSBDRkdfUFJPR19TRUVQUk9NX1JFQURCQUNLICkgewogCQkJT1BXKCBIUkVHX1BBUkFNXzEsIChoY2ZfMTYpKGx0dnAtPm5pY19hZGRyID4+IDE2KSApOwotCQkJT1BXKCBIUkVHX1BBUkFNXzIsIE1VTF9CWV8yKGx0dnAtPmxlbiAtIDQpKTsKLQkJCQkJCQkJCQkJCQkvLy4gIC4gIHBlcmZvcm0gSGVybWVzIHByb2cgY21kIHdpdGggYXBwcm9wcmlhdGUgbW9kZSBiaXRzCisJCQlPUFcoIEhSRUdfUEFSQU1fMiwgKGhjZl8xNikoKGx0dnAtPmxlbiAtIDQpIDw8IDEpICk7CisJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIHBlcmZvcm0gSGVybWVzIHByb2cgY21kIHdpdGggYXBwcm9wcmlhdGUgbW9kZSBiaXRzCiAJCQlyYyA9IGNtZF9leGUoIGlmYnAsIEhDTURfUFJPR1JBTSB8IGx0dnAtPm1vZGUsIChoY2ZfMTYpbHR2cC0+bmljX2FkZHIgKTsKLQkJCQkJCQkJCQkJCQkvLy4gIC4gIHNldCB1cCBOSUMgUkFNIGFkZHJlc3NhYmlsaXR5IGFjY29yZGluZyBSZXNwMC0xCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIHNldCB1cCBOSUMgUkFNIGFkZHJlc3NhYmlsaXR5IGFjY29yZGluZyBSZXNwMC0xCiAJCQlPUFcoIEhSRUdfQVVYX1BBR0UsICAgSVBXKCBIUkVHX1JFU1BfMSkgKTsKIAkJCU9QVyggSFJFR19BVVhfT0ZGU0VULCBJUFcoIEhSRUdfUkVTUF8wKSApOwotCQkJCQkJCQkJCQkJCS8vLiAgLiAgc2V0IHVwIEwtZmllbGQgb2YgTFRWIGFjY29yZGluZyBSZXNwMgorCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICBzZXQgdXAgTC1maWVsZCBvZiBMVFYgYWNjb3JkaW5nIFJlc3AyCiAJCQlpID0gKCBJUFcoIEhSRUdfUkVTUF8yICkgKyAxICkgLyAyOyAgLy8gaSBjb250YWlucyBtYXggYnVmZmVyIHNpemUgaW4gd29yZHMsIGEgcHJvYmFibHkgbm90IHZlcnkgdXNlZnVsIHBpZWNlIG9mIGluZm9ybWF0aW9uIDs/CiAvKk5pY28ncyBjb2RlIGJhc2VkIG9uIGkgaXMgdGhlICJyZWFsIGFtb3VudCBvZiBkYXRhIGF2YWlsYWJsZSIKIAkJCWlmICggbHR2cC0+bGVuIC0gNCA8IGkgKSByYyA9IEhDRl9FUlJfTEVOOwpAQCAtMzgxMCwxMjYgKzM2ODAsMTI1IEBACiAJCQkJbHR2cC0+bGVuID0gaSArIDQ7CiAJCQl9CiAqLwotCQkJCQkJCQkJCQkJCS8vLiAgLiAgY29weSBkYXRhIGZyb20gTklDIHZpYSBBVVggcG9ydCB0byBMVFYKLQkJCWNwID0gKHdjaV9idWZwKWx0dnAtPmhvc3RfYWRkcjsJCQkJCQkvKklOX1BPUlRfU1RSSU5HXzhfMTYgbWFjcm8gbWF5IG1vZGlmeSBpdHMgcGFyYW1ldGVycyovCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIGNvcHkgZGF0YSBmcm9tIE5JQyB2aWEgQVVYIHBvcnQgdG8gTFRWCisJCQljcCA9ICh3Y2lfYnVmcClsdHZwLT5ob3N0X2FkZHI7ICAgICAgICAgICAgICAgICAgICAgLypJTl9QT1JUX1NUUklOR184XzE2IG1hY3JvIG1heSBtb2RpZnkgaXRzIHBhcmFtZXRlcnMqLwogCQkJaSA9IGx0dnAtPmxlbiAtIDQ7Ci0JCQlJTl9QT1JUX1NUUklOR184XzE2KCBpb19wb3J0LCBjcCwgaSApOwkJLy8hISFXT1JEIGxlbmd0aCwgY3AgTVVTVCBiZSBhIGNoYXIgcG9pbnRlcgkvLyAkJCBjaGFyCi0JCQkJCQkJCQkJCQkJLy8uICBlbHNlIChub24tZmluYWwgcHJvZ3JhbW1pbmcpCisJCQlJTl9QT1JUX1NUUklOR184XzE2KCBpb19wb3J0LCBjcCwgaSApOyAgICAgIC8vISEhV09SRCBsZW5ndGgsIGNwIE1VU1QgYmUgYSBjaGFyIHBvaW50ZXIgLy8gJCQgY2hhcgorCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICBlbHNlIChub24tZmluYWwgcHJvZ3JhbW1pbmcpCiAJCX0gZWxzZQogI2VuZGlmIC8vOz8gYXMgbG9uZyBhcyB0aGUgYWJvdmUgaWYgY29udGFpbnMgYSBoYXJkIGNvZGVkIDAsIG1pZ2h0IGFzIHdlbGwgbGVhdmUgaXQgb3V0IGV2ZW4gbW9yZSBvYnZpb3VzCi0JCXsJCQkJCQkJCQkJCS8vLiAgLiAgZ2V0IG51bWJlciBvZiB3b3JkcyB0byBwcm9ncmFtCi0JCQlIQ0ZBU1NFUlQoIGx0dnAtPnNlZ21lbnRfc2l6ZSwgKmx0dnAtPmhvc3RfYWRkciApCisJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICBnZXQgbnVtYmVyIG9mIHdvcmRzIHRvIHByb2dyYW0KKwkJCUhDRkFTU0VSVCggbHR2cC0+c2VnbWVudF9zaXplLCAqbHR2cC0+aG9zdF9hZGRyICk7CiAJCQlpID0gbHR2cC0+c2VnbWVudF9zaXplLzI7Ci0JCQkJCQkJCQkJCQkJLy8uICAuICBjb3B5IGRhdGEgKHdvcmRzKSBmcm9tIExUViB2aWEgQVVYIHBvcnQgdG8gTklDCi0JCQljcCA9ICh3Y2lfYnVmcClsdHZwLT5ob3N0X2FkZHI7CQkJCQkJLy9PVVRfUE9SVF9TVFJJTkdfOF8xNiBtYWNybyBtYXkgbW9kaWZ5IGl0cyBwYXJhbWV0ZXJzCi0JCQkJCQkJCQkJCQkJLy8uICAuICBpZiBtb2RlID09IHZvbGF0aWxlIHByb2dyYW1taW5nCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIGNvcHkgZGF0YSAod29yZHMpIGZyb20gTFRWIHZpYSBBVVggcG9ydCB0byBOSUMKKwkJCWNwID0gKHdjaV9idWZwKWx0dnAtPmhvc3RfYWRkcjsgICAgICAgICAgICAgICAgICAgICAvL09VVF9QT1JUX1NUUklOR184XzE2IG1hY3JvIG1heSBtb2RpZnkgaXRzIHBhcmFtZXRlcnMKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgaWYgbW9kZSA9PSB2b2xhdGlsZSBwcm9ncmFtbWluZwogCQkJaWYgKCBsdHZwLT5tb2RlID09IENGR19QUk9HX1ZPTEFUSUxFICkgewotCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgc2V0IHVwIE5JQyBSQU0gYWRkcmVzc2FiaWxpdHkgdmlhIEFVWCBwb3J0CisJCQkJICAgICAgICAgICAgICAgIC8vLiAgLiAgLiAgc2V0IHVwIE5JQyBSQU0gYWRkcmVzc2FiaWxpdHkgdmlhIEFVWCBwb3J0CiAJCQkJT1BXKCBIUkVHX0FVWF9QQUdFLCAoaGNmXzE2KShsdHZwLT5uaWNfYWRkciA+PiAxNiA8PCA5IHwgKGx0dnAtPm5pY19hZGRyICYgMHhGRkZGKSA+PiA3ICkgKTsKIAkJCQlPUFcoIEhSRUdfQVVYX09GRlNFVCwgKGhjZl8xNikobHR2cC0+bmljX2FkZHIgJiAweDAwN0UpICk7Ci0JCQkJT1VUX1BPUlRfU1RSSU5HXzhfMTYoIGlvX3BvcnQsIGNwLCBpICk7CQkvLyEhIVdPUkQgbGVuZ3RoLCBjcCBNVVNUIGJlIGEgY2hhciBwb2ludGVyCisJCQkJT1VUX1BPUlRfU1RSSU5HXzhfMTYoIGlvX3BvcnQsIGNwLCBpICk7ICAgICAvLyEhIVdPUkQgbGVuZ3RoLCBjcCBNVVNUIGJlIGEgY2hhciBwb2ludGVyCiAJCQl9CiAJCX0KIAl9Ci0JaWZicC0+SUZCX0RMTW9kZSA9IGx0dnAtPm1vZGU7CQkJCQkvL3NhdmUgc3RhdGUgaW4gSUZCX0RMTW9kZQorCWlmYnAtPklGQl9ETE1vZGUgPSBsdHZwLT5tb2RlOyAgICAgICAgICAgICAgICAgIC8vc2F2ZSBzdGF0ZSBpbiBJRkJfRExNb2RlCiAjZW5kaWYgLy8gSENGX1RZUEVfUFJFTE9BREVECi0JSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKQotCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9ETCApCisJSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKTsKKwlIQ0ZMT0dFWElUKCBIQ0ZfVFJBQ0VfREwgKTsKIAlyZXR1cm4gcmM7CiB9IC8vIGRvd25sb2FkCiAKIAogI2lmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfUFJJTlRGCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ2VydGFpbiBIZXJtZXMtSUkgZmlybXdhcmUgdmVyc2lvbnMgY2FuIGdlbmVyYXRlCi0qIGRlYnVnIGluZm9ybWF0aW9uLiBUaGlzIGRlYnVnIGluZm9ybWF0aW9uIGlzCi0qIGNvbnRhaW5lZCBpbiBhIGJ1ZmZlciBpbiBuaWMtUkFNLCBhbmQgY2FuIGJlIHJlYWQKLSogdmlhIHRoZSBhdXggcG9ydC4KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICogQ2VydGFpbiBIZXJtZXMtSUkgZmlybXdhcmUgdmVyc2lvbnMgY2FuIGdlbmVyYXRlCisgKiBkZWJ1ZyBpbmZvcm1hdGlvbi4gVGhpcyBkZWJ1ZyBpbmZvcm1hdGlvbiBpcworICogY29udGFpbmVkIGluIGEgYnVmZmVyIGluIG5pYy1SQU0sIGFuZCBjYW4gYmUgcmVhZAorICogdmlhIHRoZSBhdXggcG9ydC4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIEhDRl9TVEFUSUMgaW50CiBmd19wcmludGYoSUZCUCBpZmJwLCBDRkdfRldfUFJJTlRGX1NUUkNUIEZBUiAqbHR2cCkKIHsKLSAgICBpbnQgcmMgPSBIQ0ZfU1VDQ0VTUzsKLSAgICBoY2ZfMTYgZndfY250OwotLy8gICAgaGNmXzMyIERiTXNnQnVmZmVyID0gMHgyOUQyLCBEYk1zZ0NvdW50PSAweDAwMDAyOUQwOwotLy8gICAgaGNmXzE2IERiTXNnU2l6ZT0weDAwMDAwMDgwOwotICAgIGhjZl8zMiBEYk1zZ0J1ZmZlcjsKLSAgICBDRkdfRldfUFJJTlRGX0JVRkZFUl9MT0NBVElPTl9TVFJDVCAqcCA9ICZpZmJwLT5JRkJfRndQZkJ1ZmY7Ci0gICAgbHR2cC0+bGVuID0gMTsKLSAgICBpZiAoIHAtPkRiTXNnU2l6ZSAhPSAwICkgewotICAgICAgICAvLyBmaXJzdCwgY2hlY2sgdGhlIGNvdW50ZXIgaW4gbmljLVJBTSBhbmQgY29tcGFyZSBpdCB0byB0aGUgbGF0ZXN0IGNvdW50ZXIgdmFsdWUgb2YgdGhlIEhDRgotICAgICAgICBPUFcoIEhSRUdfQVVYX1BBR0UsIChoY2ZfMTYpKHAtPkRiTXNnQ291bnQgPj4gNykgKTsKLSAgICAgICAgT1BXKCBIUkVHX0FVWF9PRkZTRVQsIChoY2ZfMTYpKHAtPkRiTXNnQ291bnQgJiAweDdFKSApOwotICAgICAgICBmd19jbnQgPSAoKElQVyggSFJFR19BVVhfREFUQSkgPj4xICkgJiAoKGhjZl8xNilwLT5EYk1zZ1NpemUgLSAxKSk7Ci0gICAgICAgIGlmICggZndfY250ICE9IGlmYnAtPklGQl9EYmdQcmludEZfQ250ICkgewotLy8gICAgRGJnUHJpbnQoImZ3X2NudD0lZCBJRkJfRGJnUHJpbnRGX0NudD0lZFxuIiwgZndfY250LCBpZmJwLT5JRkJfRGJnUHJpbnRGX0NudCk7Ci0gICAgICAgICAgICBEYk1zZ0J1ZmZlciA9IHAtPkRiTXNnQnVmZmVyICsgaWZicC0+SUZCX0RiZ1ByaW50Rl9DbnQgKiA2OyAvLyBlYWNoIGVudHJ5IGlzIDMgd29yZHMKLSAgICAgICAgICAgIE9QVyggSFJFR19BVVhfUEFHRSwgKGhjZl8xNikoRGJNc2dCdWZmZXIgPj4gNykgKTsKLSAgICAgICAgICAgIE9QVyggSFJFR19BVVhfT0ZGU0VULCAoaGNmXzE2KShEYk1zZ0J1ZmZlciAmIDB4N0UpICk7Ci0gICAgICAgICAgICBsdHZwLT5tc2dfaWQgICAgID0gSVBXKEhSRUdfQVVYX0RBVEEpOwotICAgICAgICAgICAgbHR2cC0+bXNnX3BhciAgICA9IElQVyhIUkVHX0FVWF9EQVRBKTsKLSAgICAgICAgICAgIGx0dnAtPm1zZ190c3RhbXAgPSBJUFcoSFJFR19BVVhfREFUQSk7Ci0gICAgICAgICAgICBsdHZwLT5sZW4gPSA0OwotICAgICAgICAgICAgaWZicC0+SUZCX0RiZ1ByaW50Rl9DbnQrKzsKLSAgICAgICAgICAgIGlmYnAtPklGQl9EYmdQcmludEZfQ250ICY9IChwLT5EYk1zZ1NpemUgLSAxKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmM7CisJaW50IHJjID0gSENGX1NVQ0NFU1M7CisJaGNmXzE2IGZ3X2NudDsKKy8vCWhjZl8zMiBEYk1zZ0J1ZmZlciA9IDB4MjlEMiwgRGJNc2dDb3VudD0gMHgwMDAwMjlEMDsKKy8vCWhjZl8xNiBEYk1zZ1NpemU9MHgwMDAwMDA4MDsKKwloY2ZfMzIgRGJNc2dCdWZmZXI7CisJQ0ZHX0ZXX1BSSU5URl9CVUZGRVJfTE9DQVRJT05fU1RSQ1QgKnAgPSAmaWZicC0+SUZCX0Z3UGZCdWZmOworCWx0dnAtPmxlbiA9IDE7CisJaWYgKCBwLT5EYk1zZ1NpemUgIT0gMCApIHsKKwkJLy8gZmlyc3QsIGNoZWNrIHRoZSBjb3VudGVyIGluIG5pYy1SQU0gYW5kIGNvbXBhcmUgaXQgdG8gdGhlIGxhdGVzdCBjb3VudGVyIHZhbHVlIG9mIHRoZSBIQ0YKKwkJT1BXKCBIUkVHX0FVWF9QQUdFLCAoaGNmXzE2KShwLT5EYk1zZ0NvdW50ID4+IDcpICk7CisJCU9QVyggSFJFR19BVVhfT0ZGU0VULCAoaGNmXzE2KShwLT5EYk1zZ0NvdW50ICYgMHg3RSkgKTsKKwkJZndfY250ID0gKChJUFcoIEhSRUdfQVVYX0RBVEEpID4+MSApICYgKChoY2ZfMTYpcC0+RGJNc2dTaXplIC0gMSkpOworCQlpZiAoIGZ3X2NudCAhPSBpZmJwLT5JRkJfRGJnUHJpbnRGX0NudCApIHsKKy8vCQkJRGJnUHJpbnQoImZ3X2NudD0lZCBJRkJfRGJnUHJpbnRGX0NudD0lZFxuIiwgZndfY250LCBpZmJwLT5JRkJfRGJnUHJpbnRGX0NudCk7CisJCQlEYk1zZ0J1ZmZlciA9IHAtPkRiTXNnQnVmZmVyICsgaWZicC0+SUZCX0RiZ1ByaW50Rl9DbnQgKiA2OyAvLyBlYWNoIGVudHJ5IGlzIDMgd29yZHMKKwkJCU9QVyggSFJFR19BVVhfUEFHRSwgKGhjZl8xNikoRGJNc2dCdWZmZXIgPj4gNykgKTsKKwkJCU9QVyggSFJFR19BVVhfT0ZGU0VULCAoaGNmXzE2KShEYk1zZ0J1ZmZlciAmIDB4N0UpICk7CisJCQlsdHZwLT5tc2dfaWQgICAgID0gSVBXKEhSRUdfQVVYX0RBVEEpOworCQkJbHR2cC0+bXNnX3BhciAgICA9IElQVyhIUkVHX0FVWF9EQVRBKTsKKwkJCWx0dnAtPm1zZ190c3RhbXAgPSBJUFcoSFJFR19BVVhfREFUQSk7CisJCQlsdHZwLT5sZW4gPSA0OworCQkJaWZicC0+SUZCX0RiZ1ByaW50Rl9DbnQrKzsKKwkJCWlmYnAtPklGQl9EYmdQcmludEZfQ250ICY9IChwLT5EYk1zZ1NpemUgLSAxKTsKKwkJfQorCX0KKwlyZXR1cm4gcmM7CiB9OwogI2VuZGlmIC8vIEhDRl9BU1NFUlRfUFJJTlRGCiAKIAotI2lmIChIQ0ZfRExfT05MWSkgPT0gMAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKi5TVUJNT0RVTEUJCWhjZl8xNiBnZXRfZmlkKCBJRkJQIGlmYnAgKQotKi5QVVJQT1NFCQlnZXQgYWxsb2NhdGVkIEZJRCBmb3IgZWl0aGVyIHRyYW5zbWl0IG9yIG5vdGlmeS4KLSoKLSouQVJHVU1FTlRTCi0qCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawotKgotKi5SRVRVUk5TCi0qCTAJbm8gRklEIGF2YWlsYWJsZQotKgk8PjAJRklEIG51bWJlcgotKgotKi5ERVNDUklQVElPTgotKgotKgotKi5ESUFHUkFNCi0qCVRoZSBwcmVmZXJlbmNlIGlzIHRvIHVzZSBhICJwZW5kaW5nIiBhbGxvYy4gSWYgbm8gYWxsb2MgaXMgcGVuZGluZywgdGhlbiAtIGlmIGF2YWlsYWJsZSAtIHRoZSAic3BhcmUiIEZJRAotKglpcyB1c2VkLgotKglJZiB0aGUgc3BhcmUgRklEIGlzIHVzZWQsIElGQl9Sc2NJbmQgKHJlcHJlc2VudGluZyB0aGUgc3BhcmUgRklEKSBtdXN0IGJlIGNsZWFyZWQKLSoJSWYgdGhlIHBlbmRpbmcgYWxsb2MgaXMgdXNlZCwgdGhlIGFsbG9jIGV2ZW50IG11c3QgYmUgYWNrbm93bGVkZ2VkIHRvIHRoZSBIZXJtZXMuCi0qCUluIGNhc2UgdGhlIHNwYXJlIEZJRCB3YXMgZGVwbGV0ZWQgYW5kIHRoZSBJRkJfUnNjSW5kIGhhcyBiZWVuICJmYWtlZCIgYXMgcHNldWRvIHJlc291cmNlIHdpdGggYSAweDAwMDEKLSoJdmFsdWUgYnkgaGNmX3NlcnZpY2VfbmljLCBJRkJfUnNjSW5kIGhhcyB0byBiZSAiY29ycmVjdGVkIiBhZ2FpbiB0byBpdHMgMHgwMDAwIHZhbHVlLgotKgotKglOb3RlIHRoYXQgZHVlIHRvIHRoZSBIZXJtZXMtSUkgSC9XIHByb2JsZW1zIHdoaWNoIGFyZSBpbnRlbmRlZCB0byBiZSB3b3JrZWQgYXJvdW5kIGJ5IERBV0EsIHRoZSBBbGxvYyBiaXQKLSoJaW4gdGhlIEV2ZW50IHJlZ2lzdGVyIGlzIG5vIGxvbmdlciBhIHJlbGlhYmxlIGluZGljYXRpb24gb2YgdGhlIHByZXNlbmNlL2Fic2VuY2Ugb2YgYSBGSUQuIFRoZSAiQ2xlYXIgRklEIgotKglwYXJ0IG9mIHRoZSBEQVdBIGxvZ2ljLCB0b2dldGhlciB3aXRoIHRoZSBjaG9pY2Ugb2YgdGhlIGRlZmluaXRpb24gb2YgdGhlIHJldHVybiBpbmZvcm1hdGlvbiBmcm9tIGdldF9maWQsCi0qCWhhbmRsZSB0aGlzIGF1dG9tYXRpY2FsbHksIGkuZS4gd2l0aG91dCBhZGRpdGlvbmFsIGNvZGUgaW4gZ2V0X2ZpZC4KLSouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKgorICouU1VCTU9EVUxFICAgICBoY2ZfMTYgZ2V0X2ZpZCggSUZCUCBpZmJwICkKKyAqLlBVUlBPU0UgICAgICAgZ2V0IGFsbG9jYXRlZCBGSUQgZm9yIGVpdGhlciB0cmFuc21pdCBvciBub3RpZnkuCisgKgorICouQVJHVU1FTlRTCisgKiAgIGlmYnAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworICoKKyAqLlJFVFVSTlMKKyAqICAgMCAgIG5vIEZJRCBhdmFpbGFibGUKKyAqICAgPD4wIEZJRCBudW1iZXIKKyAqCisgKi5ERVNDUklQVElPTgorICoKKyAqCisgKi5ESUFHUkFNCisgKiAgIFRoZSBwcmVmZXJlbmNlIGlzIHRvIHVzZSBhICJwZW5kaW5nIiBhbGxvYy4gSWYgbm8gYWxsb2MgaXMgcGVuZGluZywgdGhlbiAtIGlmIGF2YWlsYWJsZSAtIHRoZSAic3BhcmUiIEZJRAorICogICBpcyB1c2VkLgorICogICBJZiB0aGUgc3BhcmUgRklEIGlzIHVzZWQsIElGQl9Sc2NJbmQgKHJlcHJlc2VudGluZyB0aGUgc3BhcmUgRklEKSBtdXN0IGJlIGNsZWFyZWQKKyAqICAgSWYgdGhlIHBlbmRpbmcgYWxsb2MgaXMgdXNlZCwgdGhlIGFsbG9jIGV2ZW50IG11c3QgYmUgYWNrbm93bGVkZ2VkIHRvIHRoZSBIZXJtZXMuCisgKiAgIEluIGNhc2UgdGhlIHNwYXJlIEZJRCB3YXMgZGVwbGV0ZWQgYW5kIHRoZSBJRkJfUnNjSW5kIGhhcyBiZWVuICJmYWtlZCIgYXMgcHNldWRvIHJlc291cmNlIHdpdGggYSAweDAwMDEKKyAqICAgdmFsdWUgYnkgaGNmX3NlcnZpY2VfbmljLCBJRkJfUnNjSW5kIGhhcyB0byBiZSAiY29ycmVjdGVkIiBhZ2FpbiB0byBpdHMgMHgwMDAwIHZhbHVlLgorICoKKyAqICAgTm90ZSB0aGF0IGR1ZSB0byB0aGUgSGVybWVzLUlJIEgvVyBwcm9ibGVtcyB3aGljaCBhcmUgaW50ZW5kZWQgdG8gYmUgd29ya2VkIGFyb3VuZCBieSBEQVdBLCB0aGUgQWxsb2MgYml0CisgKiAgIGluIHRoZSBFdmVudCByZWdpc3RlciBpcyBubyBsb25nZXIgYSByZWxpYWJsZSBpbmRpY2F0aW9uIG9mIHRoZSBwcmVzZW5jZS9hYnNlbmNlIG9mIGEgRklELiBUaGUgIkNsZWFyIEZJRCIKKyAqICAgcGFydCBvZiB0aGUgREFXQSBsb2dpYywgdG9nZXRoZXIgd2l0aCB0aGUgY2hvaWNlIG9mIHRoZSBkZWZpbml0aW9uIG9mIHRoZSByZXR1cm4gaW5mb3JtYXRpb24gZnJvbSBnZXRfZmlkLAorICogICBoYW5kbGUgdGhpcyBhdXRvbWF0aWNhbGx5LCBpLmUuIHdpdGhvdXQgYWRkaXRpb25hbCBjb2RlIGluIGdldF9maWQuCisgKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogSENGX1NUQVRJQyBoY2ZfMTYKIGdldF9maWQoIElGQlAgaWZicCApCiB7CiAKLWhjZl8xNiBmaWQgPSAwOworCWhjZl8xNiBmaWQgPSAwOwogI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUgKSA9PSAwCi1QUk9UX0NOVF9JTkkKKwlQUk9UX0NOVF9JTkk7CiAjZW5kaWYgLy8gSENGX1RZUEVfSElJNQogCi0JSUZfRE1BKCBIQ0ZBU1NFUlQoIShpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV9ETUEpLCBpZmJwLT5JRkJfQ250bE9wdCkgKQorCUlGX0RNQSggSENGQVNTRVJUKCEoaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfRE1BKSwgaWZicC0+SUZCX0NudGxPcHQpICk7CiAKIAlpZiAoIElQVyggSFJFR19FVl9TVEFUKSAmIEhSRUdfRVZfQUxMT0MpIHsKIAkJZmlkID0gSVBXKCBIUkVHX0FMTE9DX0ZJRCApOwotCQlIQ0ZBU1NFUlQoIGZpZCwgaWZicC0+SUZCX1JzY0luZCApCi0JCURBV0FfWkVST19GSUQoIEhSRUdfQUxMT0NfRklEICkKKwkJSENGQVNTRVJUKCBmaWQsIGlmYnAtPklGQl9Sc2NJbmQgKTsKKwkJREFXQV9aRVJPX0ZJRCggSFJFR19BTExPQ19GSUQgKTsKICNpZiAoIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1ICkgPT0gMAogCQlIQ0ZfV0FJVF9XSElMRSggKCBJUFcoIEhSRUdfRVZfU1RBVCApICYgSFJFR19FVl9BQ0tfUkVHX1JFQURZICkgPT0gMCApOwotCQlIQ0ZBU1NFUlQoIHByb3RfY250LCBJUFcoIEhSRUdfRVZfU1RBVCApICkKKwkJSENGQVNTRVJUKCBwcm90X2NudCwgSVBXKCBIUkVHX0VWX1NUQVQgKSApOwogI2VuZGlmIC8vIEhDRl9UWVBFX0hJSTUKLQkJREFXQV9BQ0soIEhSRUdfRVZfQUxMT0MgKTsJCQkvLyEhbm90ZSB0aGF0IEhSRUdfRVZfQUxMT0MgaXMgd3JpdHRlbiBvbmx5IG9uY2UKKwkJREFXQV9BQ0soIEhSRUdfRVZfQUxMT0MgKTsgICAgICAgICAgLy8hIW5vdGUgdGhhdCBIUkVHX0VWX0FMTE9DIGlzIHdyaXR0ZW4gb25seSBvbmNlCiAvLyAxODAgZGVncmVlIGVycm9yIGluIGxvZ2ljIDs/ICNpZiBBTExPQ18xNQogCQlpZiAoIGlmYnAtPklGQl9Sc2NJbmQgPT0gMSApIHsKIAkJCWlmYnAtPklGQl9Sc2NJbmQgPSAwOwpAQCAtMzk0MywxMjAgKzM4MTIsMTE5IEBACiAJfQogCXJldHVybiBmaWQ7CiB9IC8vIGdldF9maWQKLSNlbmRpZiAvLyBIQ0ZfRExfT05MWQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSouU1VCTU9EVUxFCQl2b2lkIGdldF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIGludCBsZW4gQkVfUEFSKCBpbnQgd29yZF9sZW4gKSApCi0qLlBVUlBPU0UJCXJlYWRzIHdpdGggMTYvMzIgYml0IEkvTyB2aWEgQkFQMSBwb3J0IGZyb20gTklDIFJBTSB0byBIb3N0IG1lbW9yeS4KLSoKLSouQVJHVU1FTlRTCi0qCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawotKglidWZwCQkoYnl0ZSkgYWRkcmVzcyBvZiBidWZmZXIKLSoJbGVuCQkJbGVuZ3RoIGluIGJ5dGVzIG9mIGJ1ZmZlciBzcGVjaWZpZWQgYnkgYnVmcAotKgl3b3JkX2xlbglCaWcgRW5kaWFuIG9ubHk6IG51bWJlciBvZiBsZWFkaW5nIGJ5dGVzIHRvIHN3YXAgaW4gcGFpcnMKLSoKLSouUkVUVVJOUwkJTi5BLgotKgotKi5ERVNDUklQVElPTgotKiBwcm9jZXNzIHRoZSBzaW5nbGUgYnl0ZSAoaWYgYXBwbGljYWJsZSkgcmVhZCBieSB0aGUgcHJldmlvdXMgZ2V0X2ZyYWcgYW5kIGNvcHkgbGVuIChvciBsZW4tMSkgYnl0ZXMgZnJvbQotKiBOSUMgdG8gYnVmcC4KLSogT24gYSBCaWcgRW5kaWFuIHBsYXRmb3JtLCB0aGUgcGFyYW1ldGVyIHdvcmRfbGVuIGNvbnRyb2xzIHRoZSBudW1iZXIgb2YgbGVhZGluZyBieXRlcyB3aG9zZSBlbmRpYW5lc3MgaXMKLSogY29udmVydGVkIChpLmUuIGJ5dGUgc3dhcHBlZCkKLSoKLSoKLSouRElBR1JBTQotKjEwOiBUaGUgUENNQ0lBIGNhcmQgY2FuIGJlIHJlbW92ZWQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgdHJhbnNmZXIuIEJ5IGRlcG9zaXRpbmcgYSAibWFnaWMgbnVtYmVyIiBpbiB0aGUKLSoJSFJFR19TV18wIHJlZ2lzdGVyIG9mIHRoZSBIZXJtZXMgYXQgaW5pdGlhbGl6YXRpb24gdGltZSBhbmQgYnkgdmVyaWZ5aW5nIHRoaXMgcmVnaXN0ZXIsIGl0IGNhbiBiZQotKglkZXRlcm1pbmVkIHdoZXRoZXIgdGhlIGNhcmQgaXMgc3RpbGwgcHJlc2VudC4gVGhlIHJldHVybiBzdGF0dXMgaXMgc2V0IGFjY29yZGluZ2x5LgotKglDbGVhcmluZyB0aGUgYnVmZmVyIGlzIGEgKHJlbGF0aXZlKSBjaGVhcCB3YXkgdG8gcHJldmVudCB0aGF0IGZhaWxpbmcgSS9PIHJlc3VsdHMgaW4gcnVuLWF3YXkgYmVoYXZpb3IKLSoJYmVjYXVzZSB0aGUgZ2FyYmFnZSBpbiB0aGUgYnVmZmVyIGlzIGludGVycHJldGVkIGJ5IHRoZSBjYWxsZXIgaXJyZXNwZWN0aXZlIG9mIHRoZSByZXR1cm4gc3RhdHVzIChlLmcuCi0qCWhjZl9zZXJ2aWNlX25pYyBoYXMgdGhpcyBiZWhhdmlvcikuCi0qCi0qLk5PVElDRQotKglJdCB0dXJucyBvdXQgRE9TIE9ESSB1c2VzIHplcm8gbGVuZ3RoIGZyYWdtZW50cy4gVGhlIEhDRiBjb2RlIGNhbiBjb3BlIHdpdGggaXQsIGJ1dCBhcyBhIGNvbnNlcXVlbmNlLCBubwotKglBc3NlcnQgb24gbGVuIGlzIHBvc3NpYmxlCi0qCi0qLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoKKyAqLlNVQk1PRFVMRSAgICAgdm9pZCBnZXRfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCBpbnQgbGVuIEJFX1BBUiggaW50IHdvcmRfbGVuICkgKQorICouUFVSUE9TRSAgICAgICByZWFkcyB3aXRoIDE2LzMyIGJpdCBJL08gdmlhIEJBUDEgcG9ydCBmcm9tIE5JQyBSQU0gdG8gSG9zdCBtZW1vcnkuCisgKgorICouQVJHVU1FTlRTCisgKiAgIGlmYnAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworICogICBidWZwICAgICAgICAoYnl0ZSkgYWRkcmVzcyBvZiBidWZmZXIKKyAqICAgbGVuICAgICAgICAgbGVuZ3RoIGluIGJ5dGVzIG9mIGJ1ZmZlciBzcGVjaWZpZWQgYnkgYnVmcAorICogICB3b3JkX2xlbiAgICBCaWcgRW5kaWFuIG9ubHk6IG51bWJlciBvZiBsZWFkaW5nIGJ5dGVzIHRvIHN3YXAgaW4gcGFpcnMKKyAqCisgKi5SRVRVUk5TICAgICAgIE4uQS4KKyAqCisgKi5ERVNDUklQVElPTgorICogcHJvY2VzcyB0aGUgc2luZ2xlIGJ5dGUgKGlmIGFwcGxpY2FibGUpIHJlYWQgYnkgdGhlIHByZXZpb3VzIGdldF9mcmFnIGFuZCBjb3B5IGxlbiAob3IgbGVuLTEpIGJ5dGVzIGZyb20KKyAqIE5JQyB0byBidWZwLgorICogT24gYSBCaWcgRW5kaWFuIHBsYXRmb3JtLCB0aGUgcGFyYW1ldGVyIHdvcmRfbGVuIGNvbnRyb2xzIHRoZSBudW1iZXIgb2YgbGVhZGluZyBieXRlcyB3aG9zZSBlbmRpYW5lc3MgaXMKKyAqIGNvbnZlcnRlZCAoaS5lLiBieXRlIHN3YXBwZWQpCisgKgorICoKKyAqLkRJQUdSQU0KKyAqMTA6IFRoZSBQQ01DSUEgY2FyZCBjYW4gYmUgcmVtb3ZlZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSB0cmFuc2Zlci4gQnkgZGVwb3NpdGluZyBhICJtYWdpYyBudW1iZXIiIGluIHRoZQorICogICBIUkVHX1NXXzAgcmVnaXN0ZXIgb2YgdGhlIEhlcm1lcyBhdCBpbml0aWFsaXphdGlvbiB0aW1lIGFuZCBieSB2ZXJpZnlpbmcgdGhpcyByZWdpc3RlciwgaXQgY2FuIGJlCisgKiAgIGRldGVybWluZWQgd2hldGhlciB0aGUgY2FyZCBpcyBzdGlsbCBwcmVzZW50LiBUaGUgcmV0dXJuIHN0YXR1cyBpcyBzZXQgYWNjb3JkaW5nbHkuCisgKiAgIENsZWFyaW5nIHRoZSBidWZmZXIgaXMgYSAocmVsYXRpdmUpIGNoZWFwIHdheSB0byBwcmV2ZW50IHRoYXQgZmFpbGluZyBJL08gcmVzdWx0cyBpbiBydW4tYXdheSBiZWhhdmlvcgorICogICBiZWNhdXNlIHRoZSBnYXJiYWdlIGluIHRoZSBidWZmZXIgaXMgaW50ZXJwcmV0ZWQgYnkgdGhlIGNhbGxlciBpcnJlc3BlY3RpdmUgb2YgdGhlIHJldHVybiBzdGF0dXMgKGUuZy4KKyAqICAgaGNmX3NlcnZpY2VfbmljIGhhcyB0aGlzIGJlaGF2aW9yKS4KKyAqCisgKi5OT1RJQ0UKKyAqICAgSXQgdHVybnMgb3V0IERPUyBPREkgdXNlcyB6ZXJvIGxlbmd0aCBmcmFnbWVudHMuIFRoZSBIQ0YgY29kZSBjYW4gY29wZSB3aXRoIGl0LCBidXQgYXMgYSBjb25zZXF1ZW5jZSwgbm8KKyAqICAgQXNzZXJ0IG9uIGxlbiBpcyBwb3NzaWJsZQorICoKKyAqLkVORERPQyAgICAgICAgICAgICAgICBFTkQgRE9DVU1FTlRBVElPTgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBIQ0ZfU1RBVElDIHZvaWQKIGdldF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIGludCBsZW4gQkVfUEFSKCBpbnQgd29yZF9sZW4gKSApCiB7Ci1oY2ZfaW8JCWlvX3BvcnQgPSBpZmJwLT5JRkJfSU9CYXNlICsgSFJFR19EQVRBXzE7CS8vQkFQIGRhdGEgcmVnaXN0ZXIKLXdjaV9idWZwCXAgPSBidWZwOwkJCQkJCQkJCS8vd29ya2luZyBwb2ludGVyCi1pbnQJCQlpOwkJCQkJCQkJCQkJLy9wcmV2ZW50IHNpZGUgZWZmZWN0cyBmcm9tIG1hY3JvCi1pbnQJCQlqOworCWhjZl9pbyAgICAgIGlvX3BvcnQgPSBpZmJwLT5JRkJfSU9CYXNlICsgSFJFR19EQVRBXzE7ICAgLy9CQVAgZGF0YSByZWdpc3RlcgorCXdjaV9idWZwICAgIHAgPSBidWZwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93b3JraW5nIHBvaW50ZXIKKwlpbnQgICAgICAgICBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJldmVudCBzaWRlIGVmZmVjdHMgZnJvbSBtYWNybworCWludCAgICAgICAgIGo7CiAKLQlIQ0ZBU1NFUlQoICgoaGNmXzMyKWJ1ZnAgJiAoSENGX0FMSUdOLTEpICkgPT0gMCwgKGhjZl8zMilidWZwICkKKwlIQ0ZBU1NFUlQoICgoaGNmXzMyKWJ1ZnAgJiAoSENGX0FMSUdOLTEpICkgPT0gMCwgKGhjZl8zMilidWZwICk7CiAKLS8qMToJaGVyZSByZWNvdmVyeSBsb2dpYyBmb3IgaW50ZXJ2ZW5pbmcgQkFQIGFjY2VzcyBiZXR3ZWVuIGhjZl9zZXJ2aWNlX25pYyBhbmQgaGNmX3Jjdl9tc2cgQ09VTEQgYmUgYWRkZWQKLSAqIAlpZiBjdXJyZW50IGFjY2VzcyBpcyBSeEluaXRpYWwKLSAqIAkuICBwZXJzaXN0ZW50X29mZnNldCArPSBsZW4KKy8qMTogICAgaGVyZSByZWNvdmVyeSBsb2dpYyBmb3IgaW50ZXJ2ZW5pbmcgQkFQIGFjY2VzcyBiZXR3ZWVuIGhjZl9zZXJ2aWNlX25pYyBhbmQgaGNmX3Jjdl9tc2cgQ09VTEQgYmUgYWRkZWQKKyAqICBpZiBjdXJyZW50IGFjY2VzcyBpcyBSeEluaXRpYWwKKyAqICAuICBwZXJzaXN0ZW50X29mZnNldCArPSBsZW4KICAqLwogCiAJaSA9IGxlbjsKLQkJCQkJCQkJCQkJCQkvL2lmIGJ1ZmZlciBsZW5ndGggPiAwIGFuZCBjYXJyeSBmcm9tIHByZXZpb3VzIGdldF9mcmFnCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgYnVmZmVyIGxlbmd0aCA+IDAgYW5kIGNhcnJ5IGZyb20gcHJldmlvdXMgZ2V0X2ZyYWcKIAlpZiAoIGkgJiYgaWZicC0+SUZCX0NhcnJ5SW4gKSB7Ci0JCQkJCQkJCQkJCQkJLy8uICBtb3ZlIGNhcnJ5IHRvIGJ1ZmZlcgotCQkJCQkJCQkJCQkJCS8vLiAgYWRqdXN0IGJ1ZmZlciBsZW5ndGggYW5kIHBvaW50ZXIgYWNjb3JkaW5nbHkKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIG1vdmUgY2FycnkgdG8gYnVmZmVyCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICBhZGp1c3QgYnVmZmVyIGxlbmd0aCBhbmQgcG9pbnRlciBhY2NvcmRpbmdseQogCQkqcCsrID0gKGhjZl84KShpZmJwLT5JRkJfQ2FycnlJbj4+OCk7CiAJCWktLTsKLQkJCQkJCQkJCQkJCQkvLy4gIGNsZWFyIGNhcnJ5IGZsYWcKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIGNsZWFyIGNhcnJ5IGZsYWcKIAkJaWZicC0+SUZCX0NhcnJ5SW4gPSAwOwogCX0KICNpZiAoSENGX0lPKSAmIEhDRl9JT18zMkJJVFMKIAkvL3NraXAgemVyby1sZW5ndGggSS9PLCBzaW5nbGUgYnl0ZSBJL08gYW5kIEkvTyBub3Qgd29ydGh3aGlsZSAoaS5lLiBsZXNzIHRoYW4gNiBieXRlcylmb3IgRFcgbG9naWMKLQkJCQkJCQkJCQkJCQkvL2lmIGJ1ZmZlciBsZW5ndGggPj0gNiBhbmQgMzIgYml0cyBJL08gc3VwcG9ydAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIGJ1ZmZlciBsZW5ndGggPj0gNiBhbmQgMzIgYml0cyBJL08gc3VwcG9ydAogCWlmICggIShpZmJwLT5JRkJfQ250bE9wdCAmIFVTRV8xNkJJVCkgJiYgaSA+PSA2ICkgewotaGNmXzMyIEZBUgkqcDQ7IC8vcHJldmVudCBzaWRlIGVmZmVjdHMgZnJvbSBtYWNybwotCQlpZiAoICggKGhjZl8zMilwICYgMHgxICkgPT0gMCApIHsJCQkvLy4gIGlmIGJ1ZmZlciBhdCBsZWFzdCB3b3JkIGFsaWduZWQKLQkJCWlmICggKGhjZl8zMilwICYgMHgyICkgewkJCQkvLy4gIC4gIGlmIGJ1ZmZlciBub3QgZG91YmxlIHdvcmQgYWxpZ25lZAotCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgcmVhZCBzaW5nbGUgd29yZCB0byBnZXQgZG91YmxlIHdvcmQgYWxpZ25lZAorCQloY2ZfMzIgRkFSICAqcDQ7IC8vcHJldmVudCBzaWRlIGVmZmVjdHMgZnJvbSBtYWNybworCQlpZiAoICggKGhjZl8zMilwICYgMHgxICkgPT0gMCApIHsgICAgICAgICAgIC8vLiAgaWYgYnVmZmVyIGF0IGxlYXN0IHdvcmQgYWxpZ25lZAorCQkJaWYgKCAoaGNmXzMyKXAgJiAweDIgKSB7ICAgICAgICAgICAgLy8uICAuICBpZiBidWZmZXIgbm90IGRvdWJsZSB3b3JkIGFsaWduZWQKKwkJCQkJCQkgICAgLy8uICAuICAuICByZWFkIHNpbmdsZSB3b3JkIHRvIGdldCBkb3VibGUgd29yZCBhbGlnbmVkCiAJCQkJKih3Y2lfcmVjb3JkcClwID0gSU5fUE9SVF9XT1JEKCBpb19wb3J0ICk7Ci0JCQkJCQkJCQkJCQkJLy8uICAuICAuICBhZGp1c3QgYnVmZmVyIGxlbmd0aCBhbmQgcG9pbnRlciBhY2NvcmRpbmdseQorCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIC4gIGFkanVzdCBidWZmZXIgbGVuZ3RoIGFuZCBwb2ludGVyIGFjY29yZGluZ2x5CiAJCQkJcCArPSAyOwogCQkJCWkgLT0gMjsKIAkJCX0KLQkJCQkJCQkJCQkJCQkvLy4gIC4gIHJlYWQgYXMgbWFueSBkb3VibGUgd29yZCBhcyBwb3NzaWJsZQorCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICByZWFkIGFzIG1hbnkgZG91YmxlIHdvcmQgYXMgcG9zc2libGUKIAkJCXA0ID0gKGhjZl8zMiBGQVIgKilwOwogCQkJaiA9IGkvNDsKIAkJCUlOX1BPUlRfU1RSSU5HXzMyKCBpb19wb3J0LCBwNCwgaiApOwotCQkJCQkJCQkJCQkJCS8vLiAgLiAgYWRqdXN0IGJ1ZmZlciBsZW5ndGggYW5kIHBvaW50ZXIgYWNjb3JkaW5nbHkKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgYWRqdXN0IGJ1ZmZlciBsZW5ndGggYW5kIHBvaW50ZXIgYWNjb3JkaW5nbHkKIAkJCXAgKz0gaSAmIH4weDAwMDM7CiAJCQlpICY9IDB4MDAwMzsKIAkJfQogCX0KICNlbmRpZiAvLyBIQ0ZfSU9fMzJCSVRTCi0JCQkJCQkJCQkJCQkJLy9pZiBubyAzMi1iaXQgc3VwcG9ydCBPUiBieXRlIGFsaWduZWQgT1IgMS0zIGJ5dGVzIGxlZnQKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiBubyAzMi1iaXQgc3VwcG9ydCBPUiBieXRlIGFsaWduZWQgT1IgMS0zIGJ5dGVzIGxlZnQKIAlpZiAoIGkgKSB7Ci0JCQkJCQkJCQkJCQkJLy8uICByZWFkIGFzIG1hbnkgd29yZCBhcyBwb3NzaWJsZSBpbiAiYWxpZ25tZW50IHNhZmUiIHdheQorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgcmVhZCBhcyBtYW55IHdvcmQgYXMgcG9zc2libGUgaW4gImFsaWdubWVudCBzYWZlIiB3YXkKIAkJaiA9IGkvMjsKIAkJSU5fUE9SVF9TVFJJTkdfOF8xNiggaW9fcG9ydCwgcCwgaiApOwotCQkJCQkJCQkJCQkJCS8vLiAgaWYgMSBieXRlIGxlZnQKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIGlmIDEgYnl0ZSBsZWZ0CiAJCWlmICggaSAmIDB4MDAwMSApIHsKLQkJCQkJCQkJCQkJCQkvLy4gIC4gIHJlYWQgMSB3b3JkCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIHJlYWQgMSB3b3JkCiAJCQlpZmJwLT5JRkJfQ2FycnlJbiA9IElOX1BPUlRfV09SRCggaW9fcG9ydCApOwotCQkJCQkJCQkJCQkJCS8vLiAgLiAgc3RvcmUgTFNCIGluIGxhc3QgY2hhciBvZiBidWZmZXIKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgc3RvcmUgTFNCIGluIGxhc3QgY2hhciBvZiBidWZmZXIKIAkJCWJ1ZnBbbGVuLTFdID0gKGhjZl84KWlmYnAtPklGQl9DYXJyeUluOwotCQkJCQkJCQkJCQkJCS8vLiAgLiAgc2F2ZSBNU0IgaW4gY2FycnksIHNldCBjYXJyeSBmbGFnCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIHNhdmUgTVNCIGluIGNhcnJ5LCBzZXQgY2FycnkgZmxhZwogCQkJaWZicC0+SUZCX0NhcnJ5SW4gfD0gMHgxOwogCQl9CiAJfQogI2lmIEhDRl9CSUdfRU5ESUFOCi0JSENGQVNTRVJUKCB3b3JkX2xlbiA9PSAwIHx8IHdvcmRfbGVuID09IDIgfHwgd29yZF9sZW4gPT0gNCwgd29yZF9sZW4gKQotCUhDRkFTU0VSVCggd29yZF9sZW4gPT0gMCB8fCAoKGhjZl8zMilidWZwICYgMSApID09IDAsIChoY2ZfMzIpYnVmcCApCi0JSENGQVNTRVJUKCB3b3JkX2xlbiA8PSBsZW4sIE1FUkdFMiggd29yZF9sZW4sIGxlbiApICkKKwlIQ0ZBU1NFUlQoIHdvcmRfbGVuID09IDAgfHwgd29yZF9sZW4gPT0gMiB8fCB3b3JkX2xlbiA9PSA0LCB3b3JkX2xlbiApOworCUhDRkFTU0VSVCggd29yZF9sZW4gPT0gMCB8fCAoKGhjZl8zMilidWZwICYgMSApID09IDAsIChoY2ZfMzIpYnVmcCApOworCUhDRkFTU0VSVCggd29yZF9sZW4gPD0gbGVuLCBNRVJHRTIoIHdvcmRfbGVuLCBsZW4gKSApOwogCS8vc2VlIHB1dF9mcmFnIGZvciBhbiBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiwgYnV0IGJlIGNhcmVmdWwgYWJvdXQgd2hhdCBhcmUgaW50J3MgYW5kIHdoYXQgYXJlCiAJLy9oY2ZfMTYncwotCWlmICggd29yZF9sZW4gKSB7CQkJCQkJCQkvLy4gIGlmIHRoZXJlIGlzIGFueXRoaW5nIHRvIGNvbnZlcnQKLWhjZl84IGM7Ci0JCWMgPSBidWZwWzFdOwkJCQkJCQkJLy8uICAuICBjb252ZXJ0IHRoZSAxc3QgaGNmXzE2CisJaWYgKCB3b3JkX2xlbiApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byBjb252ZXJ0CisJCWhjZl84IGM7CisJCWMgPSBidWZwWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICBjb252ZXJ0IHRoZSAxc3QgaGNmXzE2CiAJCWJ1ZnBbMV0gPSBidWZwWzBdOwogCQlidWZwWzBdID0gYzsKLQkJaWYgKCB3b3JkX2xlbiA+IDEgKSB7CQkJCQkJLy8uICAuICBpZiB0aGVyZSBpcyB0byBjb252ZXJ0IG1vcmUgdGhhbiAxIHdvcmQgKCBpLmUgMiApCi0JCQljID0gYnVmcFszXTsJCQkJCQkJLy8uICAuICAuICBjb252ZXJ0IHRoZSAybmQgaGNmXzE2CisJCWlmICggd29yZF9sZW4gPiAxICkgeyAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICBpZiB0aGVyZSBpcyB0byBjb252ZXJ0IG1vcmUgdGhhbiAxIHdvcmQgKCBpLmUgMiApCisJCQljID0gYnVmcFszXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICAuICBjb252ZXJ0IHRoZSAybmQgaGNmXzE2CiAJCQlidWZwWzNdID0gYnVmcFsyXTsKIAkJCWJ1ZnBbMl0gPSBjOwogCQl9CkBAIC00MDY1LDEwOCArMzkzMywxMDggQEAKIH0gLy8gZ2V0X2ZyYWcKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKi5TVUJNT0RVTEUJCWludCBpbml0KCBJRkJQIGlmYnAgKQotKi5QVVJQT1NFCQlIYW5kbGVzIGNvbW1vbiBpbml0aWFsaXphdGlvbiBhc3BlY3RzIChILUkgaW5pdCwgY2FsaWJyYXRpb24sIGNvbmZpZy5tbmdtdCwgYWxsb2NhdGlvbikuCi0qCi0qLkFSR1VNRU5UUwotKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKLSoKLSouUkVUVVJOUwotKglIQ0ZfRVJSX0lOQ09NUF9QUkkKLSoJSENGX0VSUl9JTkNPTVBfRlcKLSoJSENGX0VSUl9USU1FX09VVAotKgk+PmhjZl9nZXRfaW5mbwotKgkJSENGX0VSUl9OT19OSUMKLSoJCUhDRl9FUlJfTEVOCi0qCi0qLkRFU0NSSVBUSU9OCi0qIGluaXQgd2lsbCBzdWNjZXNzaXZlbHk6Ci0qIC0gaW4gY2FzZSBvZiBhIChub24tcHJlbG9hZGVkKSBILUksIGluaXRpYWxpemUgdGhlIE5JQwotKiAtIGNhbGlicmF0ZSB0aGUgUy9XIHByb3RlY3Rpb24gdGltZXIgYWdhaW5zdCB0aGUgSGVybWVzIFRpbWVyCi0qIC0gY29sbGVjdCBIU0ksICJhY3RpdmUiIEYvVyBDb25maWd1cmF0aW9uIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24KLSogLSBpbiBjYXNlIGFjdGl2ZSBGL1cgaXMgUHJpbWFyeSBGL1c6IGNvbGxlY3QgUHJpbWFyeSBGL1cgQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50IEluZm9ybWF0aW9uCi0qIC0gY2hlY2sgSFNJIGFuZCBQcmltYXJ5IEYvVyBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEhDRgotKiAtIGluIGNhc2UgYWN0aXZlIEYvVyBpcyBTdGF0aW9uIG9yIEFQIEYvVzogY2hlY2sgU3RhdGlvbiBvciBBUCBGL1cgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBIQ0YKLSogLSBpbiBjYXNlIGFjdGl2ZSBGL1cgaXMgbm90IFByaW1hcnkgRi9XOiBhbGxvY2F0ZSBGSURzIHRvIGJlIHVzZWQgaW4gdHJhbnNtaXQvbm90aWZ5IHByb2Nlc3MKLSoKLSoKLSouRElBR1JBTQotKjI6CWRyb3AgYWxsIGVycm9yIHN0YXR1cyBiaXRzIGluIElGQl9DYXJkU3RhdCBzaW5jZSB0aGV5IGFyZSBleHBlY3RlZCB0byBiZSByZS1ldmFsdWF0ZWQuCi0qNDoJQWNrIGV2ZXJ5dGhpbmcgZXhjZXB0IEhSRUdfRVZfU0xFRVBfUkVRLiBJdCBpcyB2ZXJ5IGxpa2VseSB0aGF0IGFuIEFsbG9jIGV2ZW50IGlzIHBlbmRpbmcgYW5kCi0qCXZlcnkgd2VsbCBwb3NzaWJsZSB0aGF0IGEgU2VuZCBDbWQgZXZlbnQgaXMgcGVuZGluZy4gQWNraW5nIEhSRUdfRVZfU0xFRVBfUkVRIGlzIGhhbmRsZWQgYnkgaGNmX2FjdGlvbigKLSoJSENGX0FDVF9JTlRfT04gKSAhISEKLSoxMDogQ2FsaWJyYXRlIHRoZSBTL1cgdGltZS1vdXQgcHJvdGVjdGlvbiBtZWNoYW5pc20gYnkgY2FsbGluZyBjYWxpYnJhdGUoKS4gTm90ZSB0aGF0IHBvc3NpYmxlIGVycm9ycwotKglpbiB0aGUgY2FsaWJyYXRpb24gcHJvY2VzcyBhcmUgbm9yIHJlcG9ydGVkIGJ5IGluaXQgYnV0IHdpbGwgc2hvdyB1cCB2aWEgdGhlIGRlZnVuY3QgbWVjaGFuaXNtIGluCi0qCXN1YnNlcXVlbnQgaGNmLWNhbGxzLgotKjE0OiB1c2JfY2hlY2tfY29tcCgpIGlzIGNhbGxlZCB0byBoYXZlIHRoZSBtaW5pbWFsIHZpc3VhbCBjbHV0dGVyIGZvciB0aGUgbGVnYWN5IEgtSSBVU0IgZG9uZ2xlCi0qCWNvbXBhdGliaWxpdHkgY2hlY2suCi0qMTY6IFRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50IHJlbGF0ZWQgaW5mb3JtYXRpb24gaXMgcmV0cmlldmVkIGZyb20gdGhlIE5JQzoKLSoJIC0gSFNJIHN1cHBsaWVyCi0qCSAtIEYvVyBJZGVudGl0eQotKgkgLSBGL1cgc3VwcGxpZXIKLSoJIGlmIGFwcHJvcHJpYXRlOgotKgkgLSBQUkkgSWRlbnRpdHkKLSoJIC0gUFJJIHN1cHBsaWVyCi0qCSBhcHByb3ByaWF0ZSBtZWFucyBvbiBILUk6IGFsd2F5cwotKgkgYW5kIG9uIEgtSUkgaWYgRi9XIHN1cHBsaWVyIHJlZmxlY3RzIGEgcHJpbWFyeSAoaS5lLiBvbmx5IGFmdGVyIGFuIEhlcm1lcyBSZXNldCBvciBJbml0Ci0qCSBjb21tYW5kKS4KLSoJIFFVRVNUSU9OIDs/ICEhISEhISBzaG91bGQsIEZvciBlYWNoIG9mIHRoZSBhYm92ZSBSSURzIHRoZSBFbmRpYW5lc3MgaXMgY29udmVydGVkIHRvIG5hdGl2ZSBFbmRpYW5lc3MuCi0qCSBPbmx5IHRoZSByZXR1cm4gY29kZSBvZiB0aGUgZmlyc3QgaGNmX2dldF9pbmZvIGlzIHVzZWQuIEFsbCBoY2ZfZ2V0X2luZm8gY2FsbHMgYXJlIG1hZGUsIHJlZ2FyZGxlc3Mgb2YKLSoJIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUgb2YgdGhlIDFzdCBoY2ZfZ2V0X2luZm8uIFRoZSBhc3N1bXB0aW9ucyBhcmU6Ci0qCSAgLSBpZiBhbnkgY2FsbCBmYWlscywgdGhleSBhbGwgZmFpbCwgc28gcmVtZW1iZXJpbmcgdGhlIHJlc3VsdCBvZiB0aGUgMXN0IGNhbGwgaXMgYWRlcXVhdGUKLSoJICAtIGEgZmFpbGluZyBjYWxsIHdpbGwgb3ZlcndyaXRlIHRoZSBMLWZpZWxkIHdpdGggYSAweDAwMDAgdmFsdWUsIHdoaWNoIHNlcnZpY2VzIGJvdGggYXMgYW4KLSoJCWVycm9yIGluZGljYXRpb24gZm9yIHRoZSB2YWx1ZXMgY2FjaGVkIGluIHRoZSBJRkIgYXMgbWFraW5nIG1tZF9jaGVja19jb21wIGZhaWwuCi0qCSBJbiBjYXNlIG9mIEgtSSwgd2hlbiBnZXR0aW5nIHRoZSBGL1cgaWRlbnRpdHkgZmFpbHMsIHRoZSBGL1cgaXMgYXNzdW1lZCB0byBiZSBILUkgQVAgRi9XIHByZS1kYXRpbmcKLSoJIHZlcnNpb24gOS4wIGFuZCB0aGUgRi9XIElkZW50aXR5IGFuZCBTdXBwbGllciBhcmUgZmFrZWQgYWNjb3JkaW5nbHkuCi0qCSBJbiBjYXNlIG9mIEgtSUksIHRoZSBQcmltYXJ5LCBTdGF0aW9uIGFuZCBBUCBJZGVudGl0eSBhcmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgRi9XIElkZW50aXR5LgotKgkgVGhlIHNhbWUgYXBwbGllcyB0byB0aGUgU3VwcGxpZXIgaW5mb3JtYXRpb24uIEFzIGEgY29uc2VxdWVuY2UgdGhlIFBSSSBpbmZvcm1hdGlvbiBjYW4gbm8gbG9uZ2VyIGJlCi0qCSByZXRyaWV2ZWQgd2hlbiBhIFRlcnRpYXJ5IHJ1bnMuIFRvIGFjY29tbW9kYXRlIE1TRnMgYW5kIFV0aWxpdGllcyB3aG8gZGVwZW5kIG9uIFBSSSBpbmZvcm1hdGlvbiBiZWluZwotKgkgYXZhaWxhYmxlIGF0IGFueSB0aW1lLCB0aGlzIGluZm9ybWF0aW9uIGlzIGNhY2hlZCBpbiB0aGUgSUZCLiBJbiB0aGlzIGNhY2hlIHRoZSBnZW5lcmljICJGL1ciIHZhbHVlIG9mCi0qCSB0aGUgdHlwLWZpZWxkcyBpcyBvdmVyd3JpdHRlbiB3aXRoIHRoZSBzcGVjaWZpYyAobGVnYWN5KSAiUFJJIiB2YWx1ZXMuIFRvIGFjdHVhbGx5IHJlLXJvdXRlIHRoZSAobGVnYWN5KQotKgkgUFJJIHJlcXVlc3QgdmlhIGhjZl9nZXRfaW5mbywgdGhlIHh4eHgtdGFibGUgbXVzdCBiZSBzZXQuICBJbiBjYXNlIG9mIEgtSSwgdGhpcyBjYWNoaW5nLCBtb2RpZnlpbmcgYW5kCi0qCSByZS1yb3V0aW5nIGlzIG5vdCBuZWVkZWQgYmVjYXVzZSBQUkkgaW5mb3JtYXRpb24gaXMgYWx3YXlzIGF2YWlsYWJsZSBkaXJlY3RseSBmcm9tIHRoZSBOSUMuIEZvcgotKgkgY29uc2lzdGVuY3kgdGhlIGNhY2hpbmcgZmllbGRzIGluIHRoZSBJRkIgYXJlIGZpbGxlZCB3aXRoIHRoZSBQUkkgaW5mb3JtYXRpb24gYW55d2F5LgotKjE4OiBtZGRfY2hlY2tfY29tcCgpIGlzIGNhbGxlZCB0byBjaGVjayB0aGUgU3VwcGxpZXIgVmFyaWFudCBhbmQgUmFuZ2Ugb2YgdGhlIEhvc3QtUy9XIEkvRiAoSFNJKSBhbmQgdGhlCi0qCVByaW1hcnkgRmlybXdhcmUgVmFyaWFudCBhbmQgUmFuZ2UgYWdhaW5zdCB0aGUgVG9wIGFuZCBCb3R0b20gbGV2ZWwgc3VwcG9ydGVkIGJ5IHRoaXMgSENGLiAgSWYgZWl0aGVyIG9mCi0qCXRoZXNlIHRlc3RzIGZhaWxzLCB0aGUgQ0FSRF9TVEFUX0lOQ09NUF9QUkkgYml0IG9mIElGQl9DYXJkU3RhdCBpcyBzZXQKLSoJTm90ZTogVGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBhIHByaW1hcnkgZXhjZXB0IGR1cmluZyBwcm9kdWN0aW9uLCBzbyB0aGlzIG1ha2VzIHRoZSBIQ0YgaW4gaXRzIGN1cnJlbnQgZm9ybQotKgl1bnN1aXRhYmxlIGZvciBtYW51ZmFjdHVyaW5nIHRlc3Qgc3lzdGVtcyBsaWtlIHRoZSBGVFMuIFRoaXMgY2FuIGJlIHJlbWVkaWVkIGJ5IGFuIGFkZGluZyBhIHRlc3QgbGlrZQotKglpZmJwLT5JRkJfUFJJU3VwLmlkID09IENPTVBfSURfUFJJCi0qMjA6IEluIGNhc2UgdGhlcmUgaXMgVGVydGlhcnkgRi9XIGFuZCB0aGlzIEYvVyBpcyBTdGF0aW9uIEYvVywgdGhlIFN1cHBsaWVyIFZhcmlhbnQgYW5kIFJhbmdlIG9mIHRoZSBTdGF0aW9uCi0qCUZpcm13YXJlIGZ1bmN0aW9uIGFzIHJldHJpZXZlZCBmcm9tIHRoZSBIZXJtZXMgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBUb3AgYW5kIEJvdHRvbSBsZXZlbCBzdXBwb3J0ZWQgYnkKLSoJdGhpcyBIQ0YuCi0qCU5vdGU6IDs/IHRoZSB0ZXJ0aWFyeSBGL1cgY29tcGF0aWJpbGl0eSBjaGVja3MgY291bGQgYmUgbW92ZWQgdG8gdGhlIERIRiwgd2hpY2ggYWxyZWFkeSBoYXMgY2hlY2tlZCB0aGUKLSoJQ0ZJIGFuZCBNRkkgY29tcGF0aWJpbGl0eSBvZiB0aGUgaW1hZ2Ugd2l0aCB0aGUgTklDIGJlZm9yZSB0aGUgaW1hZ2Ugd2FzIGRvd25sb2FkZWQuCi0qMjg6IEluIGNhc2Ugb2Ygbm9uLVByaW1hcnkgRi9XOiBhbGxvY2F0ZXMgYW5kIGFja25vd2xlZGdlIGEgKFRYIG9yIE5vdGlmeSkgRklEIGFuZCBhbGxvY2F0ZXMgd2l0aG91dAotKglhY2tub3dsZWRnZSBhbm90aGVyIChUWCBvciBOb3RpZnkpIEZJRCAodGhlIHNvLWNhbGxlZCAxLjUgYWxsb2Mgc2NoZW1lKSB3aXRoIHRoZSBmb2xsb3dpbmcgc3RlcHM6Ci0qCS0gZXhlY3V0ZSB0aGUgYWxsb2NhdGUgY29tbWFuZCBieSBjYWxsaW5nIGNtZF9leGUKLSoJLSB3YWl0IHRpbGwgZWl0aGVyIHRoZSBhbGxvYyBldmVudCBvciBhIHRpbWUtb3V0IG9jY3VycwotKgktIHJlZ2FyZGxlc3Mgd2hldGhlciB0aGUgYWxsb2MgZXZlbnQgb2NjdXJzLCBjYWxsIGdldF9maWQgdG8KLSoJICAtIHJlYWQgdGhlIEZJRCBhbmQgc2F2ZSBpdCBpbiBJRkJfUnNjSW5kIHRvIGJlIHVzZWQgYXMgInNwYXJlIEZJRCIKLSoJICAtIGFja25vd2xlZGdlIHRoZSBhbGxvYyBldmVudAotKgkgIC0gZG8gYW5vdGhlciAiaGFsZiIgYWxsb2NhdGUgdG8gY29tcGxldGUgdGhlICIxLjUgQWxsb2Mgc2NoZW1lIgotKgkgIE5vdGUgdGhhdCBhYm92ZSAzIHN0ZXBzIGRvIG5vdCBoYXJtIGFuZCB0aHVzIGdpdmUgdGhlICJjaGVhcGVzdCIgYWNjZXB0YWJsZSBzdHJhdGVneS4KLSoJICBJZiBhIHRpbWUtb3V0IG9jY3VycmVkLCB0aGVuIHJlcG9ydCB0aW1lIG91dCBzdGF0dXMgKGFmdGVyIGFsbCkKLSoKLSouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKgorICouU1VCTU9EVUxFICAgICBpbnQgaW5pdCggSUZCUCBpZmJwICkKKyAqLlBVUlBPU0UgICAgICAgSGFuZGxlcyBjb21tb24gaW5pdGlhbGl6YXRpb24gYXNwZWN0cyAoSC1JIGluaXQsIGNhbGlicmF0aW9uLCBjb25maWcubW5nbXQsIGFsbG9jYXRpb24pLgorICoKKyAqLkFSR1VNRU5UUworICogICBpZmJwICAgICAgICBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyAqCisgKi5SRVRVUk5TCisgKiAgIEhDRl9FUlJfSU5DT01QX1BSSQorICogICBIQ0ZfRVJSX0lOQ09NUF9GVworICogICBIQ0ZfRVJSX1RJTUVfT1VUCisgKiAgID4+aGNmX2dldF9pbmZvCisgKiAgICAgICBIQ0ZfRVJSX05PX05JQworICogICAgICAgSENGX0VSUl9MRU4KKyAqCisgKi5ERVNDUklQVElPTgorICogaW5pdCB3aWxsIHN1Y2Nlc3NpdmVseToKKyAqIC0gaW4gY2FzZSBvZiBhIChub24tcHJlbG9hZGVkKSBILUksIGluaXRpYWxpemUgdGhlIE5JQworICogLSBjYWxpYnJhdGUgdGhlIFMvVyBwcm90ZWN0aW9uIHRpbWVyIGFnYWluc3QgdGhlIEhlcm1lcyBUaW1lcgorICogLSBjb2xsZWN0IEhTSSwgImFjdGl2ZSIgRi9XIENvbmZpZ3VyYXRpb24gTWFuYWdlbWVudCBJbmZvcm1hdGlvbgorICogLSBpbiBjYXNlIGFjdGl2ZSBGL1cgaXMgUHJpbWFyeSBGL1c6IGNvbGxlY3QgUHJpbWFyeSBGL1cgQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50IEluZm9ybWF0aW9uCisgKiAtIGNoZWNrIEhTSSBhbmQgUHJpbWFyeSBGL1cgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBIQ0YKKyAqIC0gaW4gY2FzZSBhY3RpdmUgRi9XIGlzIFN0YXRpb24gb3IgQVAgRi9XOiBjaGVjayBTdGF0aW9uIG9yIEFQIEYvVyBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEhDRgorICogLSBpbiBjYXNlIGFjdGl2ZSBGL1cgaXMgbm90IFByaW1hcnkgRi9XOiBhbGxvY2F0ZSBGSURzIHRvIGJlIHVzZWQgaW4gdHJhbnNtaXQvbm90aWZ5IHByb2Nlc3MKKyAqCisgKgorICouRElBR1JBTQorICoyOiBkcm9wIGFsbCBlcnJvciBzdGF0dXMgYml0cyBpbiBJRkJfQ2FyZFN0YXQgc2luY2UgdGhleSBhcmUgZXhwZWN0ZWQgdG8gYmUgcmUtZXZhbHVhdGVkLgorICo0OiBBY2sgZXZlcnl0aGluZyBleGNlcHQgSFJFR19FVl9TTEVFUF9SRVEuIEl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgYW4gQWxsb2MgZXZlbnQgaXMgcGVuZGluZyBhbmQKKyAqICAgdmVyeSB3ZWxsIHBvc3NpYmxlIHRoYXQgYSBTZW5kIENtZCBldmVudCBpcyBwZW5kaW5nLiBBY2tpbmcgSFJFR19FVl9TTEVFUF9SRVEgaXMgaGFuZGxlZCBieSBoY2ZfYWN0aW9uKAorICogICBIQ0ZfQUNUX0lOVF9PTiApICEhIQorICoxMDogQ2FsaWJyYXRlIHRoZSBTL1cgdGltZS1vdXQgcHJvdGVjdGlvbiBtZWNoYW5pc20gYnkgY2FsbGluZyBjYWxpYnJhdGUoKS4gTm90ZSB0aGF0IHBvc3NpYmxlIGVycm9ycworICogICBpbiB0aGUgY2FsaWJyYXRpb24gcHJvY2VzcyBhcmUgbm9yIHJlcG9ydGVkIGJ5IGluaXQgYnV0IHdpbGwgc2hvdyB1cCB2aWEgdGhlIGRlZnVuY3QgbWVjaGFuaXNtIGluCisgKiAgIHN1YnNlcXVlbnQgaGNmLWNhbGxzLgorICoxNDogdXNiX2NoZWNrX2NvbXAoKSBpcyBjYWxsZWQgdG8gaGF2ZSB0aGUgbWluaW1hbCB2aXN1YWwgY2x1dHRlciBmb3IgdGhlIGxlZ2FjeSBILUkgVVNCIGRvbmdsZQorICogICBjb21wYXRpYmlsaXR5IGNoZWNrLgorICoxNjogVGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQgcmVsYXRlZCBpbmZvcm1hdGlvbiBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgTklDOgorICogICAgLSBIU0kgc3VwcGxpZXIKKyAqICAgIC0gRi9XIElkZW50aXR5CisgKiAgICAtIEYvVyBzdXBwbGllcgorICogICAgaWYgYXBwcm9wcmlhdGU6CisgKiAgICAtIFBSSSBJZGVudGl0eQorICogICAgLSBQUkkgc3VwcGxpZXIKKyAqICAgIGFwcHJvcHJpYXRlIG1lYW5zIG9uIEgtSTogYWx3YXlzCisgKiAgICBhbmQgb24gSC1JSSBpZiBGL1cgc3VwcGxpZXIgcmVmbGVjdHMgYSBwcmltYXJ5IChpLmUuIG9ubHkgYWZ0ZXIgYW4gSGVybWVzIFJlc2V0IG9yIEluaXQKKyAqICAgIGNvbW1hbmQpLgorICogICAgUVVFU1RJT04gOz8gISEhISEhIHNob3VsZCwgRm9yIGVhY2ggb2YgdGhlIGFib3ZlIFJJRHMgdGhlIEVuZGlhbmVzcyBpcyBjb252ZXJ0ZWQgdG8gbmF0aXZlIEVuZGlhbmVzcy4KKyAqICAgIE9ubHkgdGhlIHJldHVybiBjb2RlIG9mIHRoZSBmaXJzdCBoY2ZfZ2V0X2luZm8gaXMgdXNlZC4gQWxsIGhjZl9nZXRfaW5mbyBjYWxscyBhcmUgbWFkZSwgcmVnYXJkbGVzcyBvZgorICogICAgdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0aGUgMXN0IGhjZl9nZXRfaW5mby4gVGhlIGFzc3VtcHRpb25zIGFyZToKKyAqICAgICAtIGlmIGFueSBjYWxsIGZhaWxzLCB0aGV5IGFsbCBmYWlsLCBzbyByZW1lbWJlcmluZyB0aGUgcmVzdWx0IG9mIHRoZSAxc3QgY2FsbCBpcyBhZGVxdWF0ZQorICogICAgIC0gYSBmYWlsaW5nIGNhbGwgd2lsbCBvdmVyd3JpdGUgdGhlIEwtZmllbGQgd2l0aCBhIDB4MDAwMCB2YWx1ZSwgd2hpY2ggc2VydmljZXMgYm90aCBhcyBhbgorICogICAgICAgZXJyb3IgaW5kaWNhdGlvbiBmb3IgdGhlIHZhbHVlcyBjYWNoZWQgaW4gdGhlIElGQiBhcyBtYWtpbmcgbW1kX2NoZWNrX2NvbXAgZmFpbC4KKyAqICAgIEluIGNhc2Ugb2YgSC1JLCB3aGVuIGdldHRpbmcgdGhlIEYvVyBpZGVudGl0eSBmYWlscywgdGhlIEYvVyBpcyBhc3N1bWVkIHRvIGJlIEgtSSBBUCBGL1cgcHJlLWRhdGluZworICogICAgdmVyc2lvbiA5LjAgYW5kIHRoZSBGL1cgSWRlbnRpdHkgYW5kIFN1cHBsaWVyIGFyZSBmYWtlZCBhY2NvcmRpbmdseS4KKyAqICAgIEluIGNhc2Ugb2YgSC1JSSwgdGhlIFByaW1hcnksIFN0YXRpb24gYW5kIEFQIElkZW50aXR5IGFyZSBtZXJnZWQgaW50byBhIHNpbmdsZSBGL1cgSWRlbnRpdHkuCisgKiAgICBUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSBTdXBwbGllciBpbmZvcm1hdGlvbi4gQXMgYSBjb25zZXF1ZW5jZSB0aGUgUFJJIGluZm9ybWF0aW9uIGNhbiBubyBsb25nZXIgYmUKKyAqICAgIHJldHJpZXZlZCB3aGVuIGEgVGVydGlhcnkgcnVucy4gVG8gYWNjb21tb2RhdGUgTVNGcyBhbmQgVXRpbGl0aWVzIHdobyBkZXBlbmQgb24gUFJJIGluZm9ybWF0aW9uIGJlaW5nCisgKiAgICBhdmFpbGFibGUgYXQgYW55IHRpbWUsIHRoaXMgaW5mb3JtYXRpb24gaXMgY2FjaGVkIGluIHRoZSBJRkIuIEluIHRoaXMgY2FjaGUgdGhlIGdlbmVyaWMgIkYvVyIgdmFsdWUgb2YKKyAqICAgIHRoZSB0eXAtZmllbGRzIGlzIG92ZXJ3cml0dGVuIHdpdGggdGhlIHNwZWNpZmljIChsZWdhY3kpICJQUkkiIHZhbHVlcy4gVG8gYWN0dWFsbHkgcmUtcm91dGUgdGhlIChsZWdhY3kpCisgKiAgICBQUkkgcmVxdWVzdCB2aWEgaGNmX2dldF9pbmZvLCB0aGUgeHh4eC10YWJsZSBtdXN0IGJlIHNldC4gIEluIGNhc2Ugb2YgSC1JLCB0aGlzIGNhY2hpbmcsIG1vZGlmeWluZyBhbmQKKyAqICAgIHJlLXJvdXRpbmcgaXMgbm90IG5lZWRlZCBiZWNhdXNlIFBSSSBpbmZvcm1hdGlvbiBpcyBhbHdheXMgYXZhaWxhYmxlIGRpcmVjdGx5IGZyb20gdGhlIE5JQy4gRm9yCisgKiAgICBjb25zaXN0ZW5jeSB0aGUgY2FjaGluZyBmaWVsZHMgaW4gdGhlIElGQiBhcmUgZmlsbGVkIHdpdGggdGhlIFBSSSBpbmZvcm1hdGlvbiBhbnl3YXkuCisgKjE4OiBtZGRfY2hlY2tfY29tcCgpIGlzIGNhbGxlZCB0byBjaGVjayB0aGUgU3VwcGxpZXIgVmFyaWFudCBhbmQgUmFuZ2Ugb2YgdGhlIEhvc3QtUy9XIEkvRiAoSFNJKSBhbmQgdGhlCisgKiAgIFByaW1hcnkgRmlybXdhcmUgVmFyaWFudCBhbmQgUmFuZ2UgYWdhaW5zdCB0aGUgVG9wIGFuZCBCb3R0b20gbGV2ZWwgc3VwcG9ydGVkIGJ5IHRoaXMgSENGLiAgSWYgZWl0aGVyIG9mCisgKiAgIHRoZXNlIHRlc3RzIGZhaWxzLCB0aGUgQ0FSRF9TVEFUX0lOQ09NUF9QUkkgYml0IG9mIElGQl9DYXJkU3RhdCBpcyBzZXQKKyAqICAgTm90ZTogVGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBhIHByaW1hcnkgZXhjZXB0IGR1cmluZyBwcm9kdWN0aW9uLCBzbyB0aGlzIG1ha2VzIHRoZSBIQ0YgaW4gaXRzIGN1cnJlbnQgZm9ybQorICogICB1bnN1aXRhYmxlIGZvciBtYW51ZmFjdHVyaW5nIHRlc3Qgc3lzdGVtcyBsaWtlIHRoZSBGVFMuIFRoaXMgY2FuIGJlIHJlbWVkaWVkIGJ5IGFuIGFkZGluZyBhIHRlc3QgbGlrZQorICogICBpZmJwLT5JRkJfUFJJU3VwLmlkID09IENPTVBfSURfUFJJCisgKjIwOiBJbiBjYXNlIHRoZXJlIGlzIFRlcnRpYXJ5IEYvVyBhbmQgdGhpcyBGL1cgaXMgU3RhdGlvbiBGL1csIHRoZSBTdXBwbGllciBWYXJpYW50IGFuZCBSYW5nZSBvZiB0aGUgU3RhdGlvbgorICogICBGaXJtd2FyZSBmdW5jdGlvbiBhcyByZXRyaWV2ZWQgZnJvbSB0aGUgSGVybWVzIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgVG9wIGFuZCBCb3R0b20gbGV2ZWwgc3VwcG9ydGVkIGJ5CisgKiAgIHRoaXMgSENGLgorICogICBOb3RlOiA7PyB0aGUgdGVydGlhcnkgRi9XIGNvbXBhdGliaWxpdHkgY2hlY2tzIGNvdWxkIGJlIG1vdmVkIHRvIHRoZSBESEYsIHdoaWNoIGFscmVhZHkgaGFzIGNoZWNrZWQgdGhlCisgKiAgIENGSSBhbmQgTUZJIGNvbXBhdGliaWxpdHkgb2YgdGhlIGltYWdlIHdpdGggdGhlIE5JQyBiZWZvcmUgdGhlIGltYWdlIHdhcyBkb3dubG9hZGVkLgorICoyODogSW4gY2FzZSBvZiBub24tUHJpbWFyeSBGL1c6IGFsbG9jYXRlcyBhbmQgYWNrbm93bGVkZ2UgYSAoVFggb3IgTm90aWZ5KSBGSUQgYW5kIGFsbG9jYXRlcyB3aXRob3V0CisgKiAgIGFja25vd2xlZGdlIGFub3RoZXIgKFRYIG9yIE5vdGlmeSkgRklEICh0aGUgc28tY2FsbGVkIDEuNSBhbGxvYyBzY2hlbWUpIHdpdGggdGhlIGZvbGxvd2luZyBzdGVwczoKKyAqICAgLSBleGVjdXRlIHRoZSBhbGxvY2F0ZSBjb21tYW5kIGJ5IGNhbGxpbmcgY21kX2V4ZQorICogICAtIHdhaXQgdGlsbCBlaXRoZXIgdGhlIGFsbG9jIGV2ZW50IG9yIGEgdGltZS1vdXQgb2NjdXJzCisgKiAgIC0gcmVnYXJkbGVzcyB3aGV0aGVyIHRoZSBhbGxvYyBldmVudCBvY2N1cnMsIGNhbGwgZ2V0X2ZpZCB0bworICogICAgIC0gcmVhZCB0aGUgRklEIGFuZCBzYXZlIGl0IGluIElGQl9Sc2NJbmQgdG8gYmUgdXNlZCBhcyAic3BhcmUgRklEIgorICogICAgIC0gYWNrbm93bGVkZ2UgdGhlIGFsbG9jIGV2ZW50CisgKiAgICAgLSBkbyBhbm90aGVyICJoYWxmIiBhbGxvY2F0ZSB0byBjb21wbGV0ZSB0aGUgIjEuNSBBbGxvYyBzY2hlbWUiCisgKiAgICAgTm90ZSB0aGF0IGFib3ZlIDMgc3RlcHMgZG8gbm90IGhhcm0gYW5kIHRodXMgZ2l2ZSB0aGUgImNoZWFwZXN0IiBhY2NlcHRhYmxlIHN0cmF0ZWd5LgorICogICAgIElmIGEgdGltZS1vdXQgb2NjdXJyZWQsIHRoZW4gcmVwb3J0IHRpbWUgb3V0IHN0YXR1cyAoYWZ0ZXIgYWxsKQorICoKKyAqLkVORERPQyAgICAgICAgICAgICAgICBFTkQgRE9DVU1FTlRBVElPTgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBIQ0ZfU1RBVElDIGludAogaW5pdCggSUZCUCBpZmJwICkKIHsKIAotaW50CXJjID0gSENGX1NVQ0NFU1M7CisJaW50IHJjID0gSENGX1NVQ0NFU1M7CiAKLQlIQ0ZMT0dFTlRSWSggSENGX1RSQUNFX0lOSVQsIDAgKQorCUhDRkxPR0VOVFJZKCBIQ0ZfVFJBQ0VfSU5JVCwgMCApOwogCi0JaWZicC0+SUZCX0NhcmRTdGF0ID0gMDsJCQkJCQkJCQkJCQkJCQkJCQkJLyogMiovCi0JT1BXKCBIUkVHX0VWX0FDSywgfkhSRUdfRVZfU0xFRVBfUkVRICk7IAkJCQkJCQkJCQkJLyogNCovCi0JSUZfUFJPVF9USU1FKCBjYWxpYnJhdGUoIGlmYnAgKTsgKSAJCQkJCQkJCQkJCQkJLyoxMCovCisJaWZicC0+SUZCX0NhcmRTdGF0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMiovCisJT1BXKCBIUkVHX0VWX0FDSywgfkhSRUdfRVZfU0xFRVBfUkVRICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNCovCisJSUZfUFJPVF9USU1FKCBjYWxpYnJhdGUoIGlmYnAgKSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoxMCovCiAjaWYgMCAvLyBPT1IKLQlpZmJwLT5JRkJfRldJZGVudGl0eS5sZW4gPSAyOwkJCQkJCQkvL21pc3VzZSB0aGUgSUZCIHNwYWNlIGZvciBhIHB1dAorCWlmYnAtPklGQl9GV0lkZW50aXR5LmxlbiA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9taXN1c2UgdGhlIElGQiBzcGFjZSBmb3IgYSBwdXQKIAlpZmJwLT5JRkJfRldJZGVudGl0eS50eXAgPSBDRkdfVElDS19USU1FOwotCWlmYnAtPklGQl9GV0lkZW50aXR5LmNvbXBfaWQgPSAoMTAwMCoxMDAwKS8xMDI0ICsgMTsJLy9yb3VnaGx5IDEgc2Vjb25kCisJaWZicC0+SUZCX0ZXSWRlbnRpdHkuY29tcF9pZCA9ICgxMDAwKjEwMDApLzEwMjQgKyAxOyAgICAvL3JvdWdobHkgMSBzZWNvbmQKIAloY2ZfcHV0X2luZm8oIGlmYnAsIChMVFZQKSZpZmJwLT5JRkJfRldJZGVudGl0eS5sZW4gKTsKICNlbmRpZiAvLyBPT1IKIAlpZmJwLT5JRkJfRldJZGVudGl0eS5sZW4gPSBzaXplb2YoQ0ZHX0ZXX0lERU5USVRZX1NUUkNUKS9zaXplb2YoaGNmXzE2KSAtIDE7CkBAIC00MTc5LDggKzQwNDcsOCBAQAogCWlmYnAtPklGQl9GV0lkZW50aXR5LnZlcnNpb25fbWFqb3IgPSBDTlZfTElUVExFX1RPX1NIT1JUKCBpZmJwLT5JRkJfRldJZGVudGl0eS52ZXJzaW9uX21ham9yICk7CiAJaWZicC0+SUZCX0ZXSWRlbnRpdHkudmVyc2lvbl9taW5vciA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV0lkZW50aXR5LnZlcnNpb25fbWlub3IgKTsKICNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgotI2lmIGRlZmluZWQgTVNGX0NPTVBPTkVOVF9JRAkJCQkJCQkJCQkJCQkJCQkJCS8qMTQqLwotCWlmICggcmMgPT0gSENGX1NVQ0NFU1MgKSB7CQkJCQkJCQkJCQkJCQkJCQkJLyoxNiovCisjaWYgZGVmaW5lZCBNU0ZfQ09NUE9ORU5UX0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoxNCovCisJaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoxNiovCiAJCWlmYnAtPklGQl9IU0lTdXAubGVuID0gc2l6ZW9mKENGR19TVVBfUkFOR0VfU1RSQ1QpL3NpemVvZihoY2ZfMTYpIC0gMTsKIAkJaWZicC0+SUZCX0hTSVN1cC50eXAgPSBDRkdfTklDX0hTSV9TVVBfUkFOR0U7CiAJCXJjID0gaGNmX2dldF9pbmZvKCBpZmJwLCAoTFRWUCkmaWZicC0+SUZCX0hTSVN1cC5sZW4gKTsKQEAgLTQyMDcsMTMzICs0MDc1LDEzMiBAQAogCQlpZmJwLT5JRkJfRldTdXAudG9wICAgICA9IENOVl9MSVRUTEVfVE9fU0hPUlQoIGlmYnAtPklGQl9GV1N1cC50b3AgKTsKICNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgogCi0JCWlmICggaWZicC0+SUZCX0ZXU3VwLmlkID09IENPTVBfSURfUFJJICkgewkJCQkJCQkJCQkJCS8qIDIwKi8KLWludCBpID0gc2l6ZW9mKCBDRkdfRldfSURFTlRJVFlfU1RSQ1QpICsgc2l6ZW9mKENGR19TVVBfUkFOR0VfU1RSQ1QgKTsKKwkJaWYgKCBpZmJwLT5JRkJfRldTdXAuaWQgPT0gQ09NUF9JRF9QUkkgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIwKi8KKwkJCWludCBpID0gc2l6ZW9mKCBDRkdfRldfSURFTlRJVFlfU1RSQ1QpICsgc2l6ZW9mKENGR19TVVBfUkFOR0VfU1RSQ1QgKTsKIAkJCXdoaWxlICggaS0tICkgKChoY2ZfOCopKCZpZmJwLT5JRkJfUFJJSWRlbnRpdHkpKVtpXSA9ICgoaGNmXzgqKSgmaWZicC0+SUZCX0ZXSWRlbnRpdHkpKVtpXTsKIAkJCWlmYnAtPklGQl9QUklJZGVudGl0eS50eXAgPSBDRkdfUFJJX0lERU5USVRZOwogCQkJaWZicC0+SUZCX1BSSVN1cC50eXAgPSBDRkdfUFJJX1NVUF9SQU5HRTsKIAkJCXh4eHhbeHh4eF9QUklfSURFTlRJVFlfT0ZGU0VUXSA9ICZpZmJwLT5JRkJfUFJJSWRlbnRpdHkubGVuOwogCQkJeHh4eFt4eHh4X1BSSV9JREVOVElUWV9PRkZTRVQrMV0gPSAmaWZicC0+SUZCX1BSSVN1cC5sZW47CiAJCX0KLQkJaWYgKCAhbW1kX2NoZWNrX2NvbXAoICh2b2lkKikmY2ZnX2Rydl9hY3RfcmFuZ2VzX2hzaSwgJmlmYnAtPklGQl9IU0lTdXApCQkJCSAvKiAyMiovCisJCWlmICggIW1tZF9jaGVja19jb21wKCAodm9pZCopJmNmZ19kcnZfYWN0X3Jhbmdlc19oc2ksICZpZmJwLT5JRkJfSFNJU3VwKSAgICAgICAgICAgICAgICAgLyogMjIqLwogI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1BSRUxPQURFRCApID09IDAKIC8vOz8gdGhlIFBSSSBjb21wYXRpYmlsaXR5IGNoZWNrIGlzIG9ubHkgcmVsZXZhbnQgZm9yIERIRgotCQkJIHx8ICFtbWRfY2hlY2tfY29tcCggKHZvaWQqKSZjZmdfZHJ2X2FjdF9yYW5nZXNfcHJpLCAmaWZicC0+SUZCX1BSSVN1cCkKKwkJICAgICB8fCAhbW1kX2NoZWNrX2NvbXAoICh2b2lkKikmY2ZnX2Rydl9hY3RfcmFuZ2VzX3ByaSwgJmlmYnAtPklGQl9QUklTdXApCiAjZW5kaWYgLy8gSENGX1RZUEVfUFJFTE9BREVECi0JCSAgICkgeworCQkJKSB7CiAJCQlpZmJwLT5JRkJfQ2FyZFN0YXQgPSBDQVJEX1NUQVRfSU5DT01QX1BSSTsKIAkJCXJjID0gSENGX0VSUl9JTkNPTVBfUFJJOwogCQl9Ci0JCWlmICggKCBpZmJwLT5JRkJfRldTdXAuaWQgPT0gQ09NUF9JRF9TVEEgJiYJIW1tZF9jaGVja19jb21wKCAodm9pZCopJmNmZ19kcnZfYWN0X3Jhbmdlc19zdGEsICZpZmJwLT5JRkJfRldTdXApICkgfHwKLQkJCSAoIGlmYnAtPklGQl9GV1N1cC5pZCA9PSBDT01QX0lEX0FQRiAmJiAhbW1kX2NoZWNrX2NvbXAoICh2b2lkKikmY2ZnX2Rydl9hY3RfcmFuZ2VzX2FwZiwgJmlmYnAtPklGQl9GV1N1cCkgKQotCQkgICApIHsJCQkJCQkJCQkJCQkJCQkJCQkJCQkvKiAyNCAqLworCQlpZiAoICggaWZicC0+SUZCX0ZXU3VwLmlkID09IENPTVBfSURfU1RBICYmICFtbWRfY2hlY2tfY29tcCggKHZvaWQqKSZjZmdfZHJ2X2FjdF9yYW5nZXNfc3RhLCAmaWZicC0+SUZCX0ZXU3VwKSApIHx8CisJCSAgICAgKCBpZmJwLT5JRkJfRldTdXAuaWQgPT0gQ09NUF9JRF9BUEYgJiYgIW1tZF9jaGVja19jb21wKCAodm9pZCopJmNmZ19kcnZfYWN0X3Jhbmdlc19hcGYsICZpZmJwLT5JRkJfRldTdXApICkKKwkJCSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyNCAqLwogCQkJaWZicC0+SUZCX0NhcmRTdGF0IHw9IENBUkRfU1RBVF9JTkNPTVBfRlc7CiAJCQlyYyA9IEhDRl9FUlJfSU5DT01QX0ZXOwogCQl9CiAJfQogI2VuZGlmIC8vIE1TRl9DT01QT05FTlRfSUQKLSNpZiAoSENGX0RMX09OTFkpID09IDAJCQkJCQkJCQkJCQkJCQkJCQkJLyogMjggKi8KKwogCWlmICggcmMgPT0gSENGX1NVQ0NFU1MgJiYgaWZicC0+SUZCX0ZXSWRlbnRpdHkuY29tcF9pZCA+PSBDT01QX0lEX0ZXX1NUQSApIHsKLVBST1RfQ05UX0lOSQorCQlQUk9UX0NOVF9JTkk7CiAJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkqIHJsYXY6IHRoZSBETUEgZW5naW5lIG5lZWRzIHRoZSBob3N0IHRvIGNhdXNlIGEgJ2hhbmdpbmcgYWxsb2MgZXZlbnQnIGZvciBpdCB0byBjb25zdW1lLgotCQkqIG5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIHJpZ2h0IHNwb3QgaW4gdGhlIEhDRiwgdGhpbmtpbmcgYWJvdXQgaGNmX2VuYWJsZS4uLgotCQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwkJICogcmxhdjogdGhlIERNQSBlbmdpbmUgbmVlZHMgdGhlIGhvc3QgdG8gY2F1c2UgYSAnaGFuZ2luZyBhbGxvYyBldmVudCcgZm9yIGl0IHRvIGNvbnN1bWUuCisJCSAqIG5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIHJpZ2h0IHNwb3QgaW4gdGhlIEhDRiwgdGhpbmtpbmcgYWJvdXQgaGNmX2VuYWJsZS4uLgorCQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAJCXJjID0gY21kX2V4ZSggaWZicCwgSENNRF9BTExPQywgMCApOwogLy8gMTgwIGRlZ3JlZSBlcnJvciBpbiBsb2dpYyA7PyAjaWYgQUxMT0NfMTUKLS8vCQlpZmJwLT5JRkJfUnNjSW5kID0gMTsJLy9sZXQncyBob3BlIHRoYXQgYnkgdGhlIHRpbWUgaGNmX3NlbmRfbXNnIGlzYSBjYWxsZWQsIHRoZXJlIHdpbGwgYmUgYSBGSUQKKy8vCQlpZmJwLT5JRkJfUnNjSW5kID0gMTsgICAvL2xldCdzIGhvcGUgdGhhdCBieSB0aGUgdGltZSBoY2Zfc2VuZF9tc2cgaXNhIGNhbGxlZCwgdGhlcmUgd2lsbCBiZSBhIEZJRAogLy8jZWxzZQogCQlpZiAoIHJjID09IEhDRl9TVUNDRVNTICkgewogCQkJSENGX1dBSVRfV0hJTEUoIChJUFcoIEhSRUdfRVZfU1RBVCApICYgSFJFR19FVl9BTExPQykgPT0gMCApOwotCQkJSUZfUFJPVF9USU1FKCBIQ0ZBU1NFUlQocHJvdF9jbnQsIElQVyggSFJFR19FVl9TVEFUICkgKSAvKk5PUCovOykKKwkJCUlGX1BST1RfVElNRSggSENGQVNTRVJUKHByb3RfY250LCBJUFcoIEhSRUdfRVZfU1RBVCApKSApOwogI2lmIEhDRl9ETUEKIAkJCWlmICggISAoIGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSApICkKICNlbmRpZiAvLyBIQ0ZfRE1BCiAJCQl7CiAJCQkJaWZicC0+SUZCX1JzY0luZCA9IGdldF9maWQoIGlmYnAgKTsKLQkJCQlIQ0ZBU1NFUlQoIGlmYnAtPklGQl9Sc2NJbmQsIDAgKQorCQkJCUhDRkFTU0VSVCggaWZicC0+SUZCX1JzY0luZCwgMCApOwogCQkJCWNtZF9leGUoIGlmYnAsIEhDTURfQUxMT0MsIDAgKTsKLQkJCQlJRl9QUk9UX1RJTUUoIGlmICggcHJvdF9jbnQgPT0gMCApIHJjID0gSENGX0VSUl9USU1FX09VVDsgKQorCQkJCUlGX1BST1RfVElNRSggaWYgKCBwcm90X2NudCA9PSAwICkgcmMgPSBIQ0ZfRVJSX1RJTUVfT1VUICk7CiAJCQl9CiAJCX0KIC8vI2VuZGlmIC8vIEFMTE9DXzE1CiAJfQotI2VuZGlmIC8vIEhDRl9ETF9PTkxZCi0JSENGQVNTRVJUKCByYyA9PSBIQ0ZfU1VDQ0VTUywgcmMgKQotCUhDRkxPR0VYSVQoIEhDRl9UUkFDRV9JTklUICkKKworCUhDRkFTU0VSVCggcmMgPT0gSENGX1NVQ0NFU1MsIHJjICk7CisJSENGTE9HRVhJVCggSENGX1RSQUNFX0lOSVQgKTsKIAlyZXR1cm4gcmM7CiB9IC8vIGluaXQKIAotI2lmIChIQ0ZfRExfT05MWSkgPT0gMAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKi5TVUJNT0RVTEUJCXZvaWQgaXNyX2luZm8oIElGQlAgaWZicCApCi0qLlBVUlBPU0UJCWhhbmRsZXMgbGluayBldmVudHMuCi0qCi0qLkFSR1VNRU5UUwotKglpZmJwCQlhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKLSoKLSouUkVUVVJOUwkJTi5BLgotKgotKi5ERVNDUklQVElPTgotKgotKgotKi5ESUFHUkFNCi0qMToJRmlyc3QgdGhlIEZJRCBudW1iZXIgY29ycmVzcG9uZGluZyB3aXRoIHRoZSBJbmZvRXZlbnQgaXMgZGV0ZXJtaW5lZC4KLSoJTm90ZSB0aGUgY29tcGxpY2F0aW9uIG9mIHRoZSB6ZXJvLUZJRCBwcm90ZWN0aW9uIHN1Yi1zY2hlbWUgaW4gREFXQS4KLSoJTmV4dCB0aGUgTC1maWVsZCBhbmQgdGhlIFQtZmllbGQgYXJlIGZldGNoZWQgaW50byBzY3JhdGNoIGJ1ZmZlciBpbmZvLgotKjI6CUluIGNhc2Ugb2YgdGFsbGllcywgdGhlIDE2IGJpdHMgSGVybWVzIHZhbHVlcyBhcmUgYWNjdW11bGF0ZWQgaW4gdGhlIElGQiBpbnRvIDMyIGJpdHMgdmFsdWVzLiBJbmZvWzBdCi0qCWlzIChleHBlY3RlZCB0byBiZSkgSENGX05JQ19UQUxfQ05UICsgMS4gVGhlIGNvbnRyYXB0aW9uICJ3aGlsZSAoIGluZm9bMF0tLSA+MSApIiByYXRoZXIgdGhhbgotKgkid2hpbGUgKCAtLWluZm9bMF0gKSIgaXMgdXNlZCBiZWNhdXNlIGl0IGlzIGRhbmdlcm91cyB0byBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgVmFsdWUgZmllbGQgYnkKLSoJZGVjcmVtZW50aW5nIGluZm9bMF0uIEFzIGEgcmVzdWx0IG9mIGEgYnVnIGluIHNvbWUgdmVyc2lvbiBvZiB0aGUgRi9XLCBpbmZvWzBdIG1heSBiZSAwLCByZXN1bHRpbmcKLSoJaW4gYSB2ZXJ5IGxvbmcgbG9vcCBpbiB0aGUgcHJlLWRlY3JlbWVudCBsb2dpYy4KLSo0OglJbiBjYXNlIG9mIGEgbGluayBzdGF0dXMgZnJhbWUsIHRoZSBpbmZvcm1hdGlvbiBpcyBjb3BpZWQgdG8gdGhlIElGQiBmaWVsZCBJRkJfbGlua1N0YXQKLSo2OglBbGwgb3RoZXIgdGhhbiBUYWxsaWVzIChpbmNsdWRpbmcgInVua25vd24iIG9uZXMpIGFyZSBjaGVja2VkIGFnYWluc3QgdGhlIHNlbGVjdGlvbiBzZXQgYnkgdGhlIE1TRgotKgl2aWEgQ0ZHX1JJRF9MT0cuIElmIGEgbWF0Y2ggaXMgZm91bmQgb3IgdGhlIHNlbGVjdGlvbiBzZXQgaGFzIHRoZSB3aWxkLWNhcmQgdHlwZSAoaS5lIG5vbi1OVUxMIGJ1ZmZlcgotKglwb2ludGVyIGF0IHRoZSB0ZXJtaW5hdGluZyB6ZXJvLXR5cGUpLCB0aGUgZnJhbWUgaXMgY29waWVkIHRvIHRoZSAodHlwZS1zcGVjaWZpYykgbG9nIGJ1ZmZlci4KLSoJTm90ZSB0aGF0IHRvIGFjY3VtdWxhdGUgdGFsbGllcyBpbnRvIElGQiBBTkQgdG8gbG9nIHRoZW0gb3IgdG8gbG9nIGEgZnJhbWUgd2hlbiBhIHNwZWNpZmljIG1hdGNoIG9jY3VyZXMKLSoJQU5EIGJhc2VkIG9uIHRoZSB3aWxkLWNhcmQgc2VsZWN0aW9uLCB5b3UgaGF2ZSB0byBjYWxsIHNldHVwX2JhcCBhZ2FpbiBhZnRlciB0aGUgMXN0IGNvcHkuCi0qCi0qLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoKKyAqLlNVQk1PRFVMRSAgICAgdm9pZCBpc3JfaW5mbyggSUZCUCBpZmJwICkKKyAqLlBVUlBPU0UgICAgICAgaGFuZGxlcyBsaW5rIGV2ZW50cy4KKyAqCisgKi5BUkdVTUVOVFMKKyAqICAgaWZicCAgICAgICAgYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisgKgorICouUkVUVVJOUyAgICAgICBOLkEuCisgKgorICouREVTQ1JJUFRJT04KKyAqCisgKgorICouRElBR1JBTQorICoxOiBGaXJzdCB0aGUgRklEIG51bWJlciBjb3JyZXNwb25kaW5nIHdpdGggdGhlIEluZm9FdmVudCBpcyBkZXRlcm1pbmVkLgorICogICBOb3RlIHRoZSBjb21wbGljYXRpb24gb2YgdGhlIHplcm8tRklEIHByb3RlY3Rpb24gc3ViLXNjaGVtZSBpbiBEQVdBLgorICogICBOZXh0IHRoZSBMLWZpZWxkIGFuZCB0aGUgVC1maWVsZCBhcmUgZmV0Y2hlZCBpbnRvIHNjcmF0Y2ggYnVmZmVyIGluZm8uCisgKjI6IEluIGNhc2Ugb2YgdGFsbGllcywgdGhlIDE2IGJpdHMgSGVybWVzIHZhbHVlcyBhcmUgYWNjdW11bGF0ZWQgaW4gdGhlIElGQiBpbnRvIDMyIGJpdHMgdmFsdWVzLiBJbmZvWzBdCisgKiAgIGlzIChleHBlY3RlZCB0byBiZSkgSENGX05JQ19UQUxfQ05UICsgMS4gVGhlIGNvbnRyYXB0aW9uICJ3aGlsZSAoIGluZm9bMF0tLSA+MSApIiByYXRoZXIgdGhhbgorICogICAid2hpbGUgKCAtLWluZm9bMF0gKSIgaXMgdXNlZCBiZWNhdXNlIGl0IGlzIGRhbmdlcm91cyB0byBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiB0aGUgVmFsdWUgZmllbGQgYnkKKyAqICAgZGVjcmVtZW50aW5nIGluZm9bMF0uIEFzIGEgcmVzdWx0IG9mIGEgYnVnIGluIHNvbWUgdmVyc2lvbiBvZiB0aGUgRi9XLCBpbmZvWzBdIG1heSBiZSAwLCByZXN1bHRpbmcKKyAqICAgaW4gYSB2ZXJ5IGxvbmcgbG9vcCBpbiB0aGUgcHJlLWRlY3JlbWVudCBsb2dpYy4KKyAqNDogSW4gY2FzZSBvZiBhIGxpbmsgc3RhdHVzIGZyYW1lLCB0aGUgaW5mb3JtYXRpb24gaXMgY29waWVkIHRvIHRoZSBJRkIgZmllbGQgSUZCX2xpbmtTdGF0CisgKjY6IEFsbCBvdGhlciB0aGFuIFRhbGxpZXMgKGluY2x1ZGluZyAidW5rbm93biIgb25lcykgYXJlIGNoZWNrZWQgYWdhaW5zdCB0aGUgc2VsZWN0aW9uIHNldCBieSB0aGUgTVNGCisgKiAgIHZpYSBDRkdfUklEX0xPRy4gSWYgYSBtYXRjaCBpcyBmb3VuZCBvciB0aGUgc2VsZWN0aW9uIHNldCBoYXMgdGhlIHdpbGQtY2FyZCB0eXBlIChpLmUgbm9uLU5VTEwgYnVmZmVyCisgKiAgIHBvaW50ZXIgYXQgdGhlIHRlcm1pbmF0aW5nIHplcm8tdHlwZSksIHRoZSBmcmFtZSBpcyBjb3BpZWQgdG8gdGhlICh0eXBlLXNwZWNpZmljKSBsb2cgYnVmZmVyLgorICogICBOb3RlIHRoYXQgdG8gYWNjdW11bGF0ZSB0YWxsaWVzIGludG8gSUZCIEFORCB0byBsb2cgdGhlbSBvciB0byBsb2cgYSBmcmFtZSB3aGVuIGEgc3BlY2lmaWMgbWF0Y2ggb2NjdXJlcworICogICBBTkQgYmFzZWQgb24gdGhlIHdpbGQtY2FyZCBzZWxlY3Rpb24sIHlvdSBoYXZlIHRvIGNhbGwgc2V0dXBfYmFwIGFnYWluIGFmdGVyIHRoZSAxc3QgY29weS4KKyAqCisgKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogSENGX1NUQVRJQyB2b2lkCiBpc3JfaW5mbyggSUZCUCBpZmJwICkKIHsKLWhjZl8xNglpbmZvWzJdLCBmaWQ7CisJaGNmXzE2ICBpbmZvWzJdLCBmaWQ7CiAjaWYgKEhDRl9FWFQpICYgSENGX0VYVF9JTkZPX0xPRwotUklEX0xPR1AJcmlkcCA9IGlmYnAtPklGQl9SSURMb2dwOwkvL05VTEwgb3IgcG9pbnRlciB0byBhcnJheSBvZiBSSURfTE9HIHN0cnVjdHVyZXMgKHRlcm1pbmF0ZWQgYnkgemVybyB0eXApCisJUklEX0xPR1AgICAgcmlkcCA9IGlmYnAtPklGQl9SSURMb2dwOyAgIC8vTlVMTCBvciBwb2ludGVyIHRvIGFycmF5IG9mIFJJRF9MT0cgc3RydWN0dXJlcyAodGVybWluYXRlZCBieSB6ZXJvIHR5cCkKICNlbmRpZiAvLyBIQ0ZfRVhUX0lORk9fTE9HCiAKLQlIQ0ZUUkFDRSggaWZicCwgSENGX1RSQUNFX0lTUl9JTkZPICk7CQkJCQkJCQkJCQkJCQkJCS8qIDEgKi8KKwlIQ0ZUUkFDRSggaWZicCwgSENGX1RSQUNFX0lTUl9JTkZPICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMSAqLwogCWZpZCA9IElQVyggSFJFR19JTkZPX0ZJRCApOwotCURBV0FfWkVST19GSUQoIEhSRUdfSU5GT19GSUQgKQorCURBV0FfWkVST19GSUQoIEhSRUdfSU5GT19GSUQgKTsKIAlpZiAoIGZpZCApIHsKIAkJKHZvaWQpc2V0dXBfYmFwKCBpZmJwLCBmaWQsIDAsIElPX0lOICk7CiAJCWdldF9mcmFnKCBpZmJwLCAod2NpX2J1ZnApaW5mbywgNCBCRV9QQVIoMikgKTsKLQkJSENGQVNTRVJUKCBpbmZvWzBdIDw9IEhDRl9NQVhfTFRWICsgMSwgTUVSR0VfMiggaW5mb1sxXSwgaW5mb1swXSApICkgIC8vOz8gYSBzbWFsbGVyIHZhbHVlIG1ha2VzIG1vcmUgc2Vuc2UKLSNpZiAoSENGX1RBTExJRVMpICYgSENGX1RBTExJRVNfTklDCQkvL0hlcm1lcyB0YWxseSBzdXBwb3J0CisJCUhDRkFTU0VSVCggaW5mb1swXSA8PSBIQ0ZfTUFYX0xUViArIDEsIE1FUkdFXzIoIGluZm9bMV0sIGluZm9bMF0gKSApOyAgLy87PyBhIHNtYWxsZXIgdmFsdWUgbWFrZXMgbW9yZSBzZW5zZQorI2lmIChIQ0ZfVEFMTElFUykgJiBIQ0ZfVEFMTElFU19OSUMgICAgIC8vSGVybWVzIHRhbGx5IHN1cHBvcnQKIAkJaWYgKCBpbmZvWzFdID09IENGR19UQUxMSUVTICkgewotaGNmXzMyCSpwOwotLyoyKi8JCWlmICggaW5mb1swXSA+IEhDRl9OSUNfVEFMX0NOVCApIHsKKwkJCWhjZl8zMiAgKnA7CisJCS8qMiovICAgaWYgKCBpbmZvWzBdID4gSENGX05JQ19UQUxfQ05UICkgewogCQkJCWluZm9bMF0gPSBIQ0ZfTklDX1RBTF9DTlQgKyAxOwogCQkJfQogCQkJcCA9IChoY2ZfMzIqKSZpZmJwLT5JRkJfTklDX1RhbGxpZXM7Ci0JCQl3aGlsZSAoIGluZm9bMF0tLSA+MSApICpwKysgKz0gSVBXKCBIUkVHX0RBVEFfMSApOwkvL3JlcXVlc3QgbWF5IHJldHVybiB6ZXJvIGxlbmd0aAorCQkJd2hpbGUgKCBpbmZvWzBdLS0gPjEgKSAqcCsrICs9IElQVyggSFJFR19EQVRBXzEgKTsgIC8vcmVxdWVzdCBtYXkgcmV0dXJuIHplcm8gbGVuZ3RoCiAJCX0KIAkJZWxzZQogI2VuZGlmIC8vIEhDRl9UQUxMSUVTX05JQwogCQl7Ci0vKjQqLwkJaWYgKCBpbmZvWzFdID09IENGR19MSU5LX1NUQVQgKSB7CisJCS8qNCovICAgaWYgKCBpbmZvWzFdID09IENGR19MSU5LX1NUQVQgKSB7CiAJCQkJaWZicC0+SUZCX0xpbmtTdGF0ID0gSVBXKCBIUkVHX0RBVEFfMSApOwogCQkJfQogI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfSU5GT19MT0cKLS8qNiovCQl3aGlsZSAoIDEgKSB7CisJCS8qNiovICAgd2hpbGUgKCAxICkgewogCQkJCWlmICggcmlkcC0+dHlwID09IDAgfHwgcmlkcC0+dHlwID09IGluZm9bMV0gKSB7CiAJCQkJCWlmICggcmlkcC0+YnVmcCApIHsKLQkJCQkJCUhDRkFTU0VSVCggcmlkcC0+bGVuID49IDIsIHJpZHAtPnR5cCApCi0JCQkJCQlyaWRwLT5idWZwWzBdID0gbWluKChoY2ZfMTYpKHJpZHAtPmxlbiAtIDEpLCBpbmZvWzBdICk7IAkvL3NhdmUgTAotCQkJCQkJcmlkcC0+YnVmcFsxXSA9IGluZm9bMV07CQkJCQkJLy9zYXZlIFQKKwkJCQkJCUhDRkFTU0VSVCggcmlkcC0+bGVuID49IDIsIHJpZHAtPnR5cCApOworCQkJCQkJcmlkcC0+YnVmcFswXSA9IG1pbigoaGNmXzE2KShyaWRwLT5sZW4gLSAxKSwgaW5mb1swXSApOyAgICAgLy9zYXZlIEwKKwkJCQkJCXJpZHAtPmJ1ZnBbMV0gPSBpbmZvWzFdOyAgICAgICAgICAgICAgICAgICAgICAgIC8vc2F2ZSBUCiAJCQkJCQlnZXRfZnJhZyggaWZicCwgKHdjaV9idWZwKSZyaWRwLT5idWZwWzJdLCAocmlkcC0+YnVmcFswXSAtIDEpKjIgQkVfUEFSKDApICk7CiAJCQkJCX0KIAkJCQkJYnJlYWs7CkBAIC00MzQ2LDg0ICs0MjEzLDgyIEBACiAJfQogCXJldHVybjsKIH0gLy8gaXNyX2luZm8KLSNlbmRpZiAvLyBIQ0ZfRExfT05MWQogCiAvLwogLy8KIC8vICNlbmRpZiAvLyBIQ0ZfVEFMTElFU19OSUMKLS8vIC8qNCovCWlmICggaW5mb1sxXSA9PSBDRkdfTElOS19TVEFUICkgewotLy8gCQkJaWZicC0+SUZCX0RTTGlua1N0YXQgPSBJUFcoIEhSRUdfREFUQV8xICkgfCBDRkdfTElOS19TVEFUX0NIQU5HRTsJLy9jb3JydXB0cyBCQVAgISEgOz8KLS8vIAkJCWlmYnAtPklGQl9MaW5rU3RhdCA9IGlmYnAtPklGQl9EU0xpbmtTdGF0ICYgQ0ZHX0xJTktfU1RBVF9GVzsgLy87PyB0byBiZSBvYnNvbGV0ZWQKLS8vIAkJCXByaW50ayggIjw0PmxpbmtzdGF0dXM6ICUwNHhcbiIsIGlmYnAtPklGQl9EU0xpbmtTdGF0ICk7CQkvLzs/cmVtb3ZlIG1lIDEgZGF5CisvLyAvKjQqLyAgICBpZiAoIGluZm9bMV0gPT0gQ0ZHX0xJTktfU1RBVCApIHsKKy8vICAgICAgICAgIGlmYnAtPklGQl9EU0xpbmtTdGF0ID0gSVBXKCBIUkVHX0RBVEFfMSApIHwgQ0ZHX0xJTktfU1RBVF9DSEFOR0U7ICAgLy9jb3JydXB0cyBCQVAgISEgOz8KKy8vICAgICAgICAgIGlmYnAtPklGQl9MaW5rU3RhdCA9IGlmYnAtPklGQl9EU0xpbmtTdGF0ICYgQ0ZHX0xJTktfU1RBVF9GVzsgLy87PyB0byBiZSBvYnNvbGV0ZWQKKy8vICAgICAgICAgIHByaW50ayggIjw0PmxpbmtzdGF0dXM6ICUwNHhcbiIsIGlmYnAtPklGQl9EU0xpbmtTdGF0ICk7ICAgICAgICAvLzs/cmVtb3ZlIG1lIDEgZGF5CiAvLyAjaWYgKEhDRl9TTEVFUCkgJiBIQ0ZfRERTCi0vLyAJCQlpZiAoICggaWZicC0+SUZCX0RTTGlua1N0YXQgJiBDRkdfTElOS19TVEFUX0NPTk5FQ1RFRCApID09IDAgKSB7IAkvL2V2ZW4gdmFsdWVzIGFyZSBkaXNjb25uZWN0ZWQgZXRjLgotLy8gCQkJCWlmYnAtPklGQl9UaWNrQ250ID0gMDsJCQkJLy9zdGFydCAyIHNlY29uZCBwZXJpb2QgKHdpdGggMSB0aWNrIHVuY2VydGFudHkpCi0vLyAJCQkJcHJpbnRrKCAiPDU+aXNyX2luZm86IEF3YWl0Q29ubmVjdGlvbiBwaGFzZSBzdGFydGVkLCBJRkJfVGlja0NudCA9IDBcbiIgKTsJCS8vOz9yZW1vdmUgbWUgMSBkYXkKLS8vIAkJCX0KKy8vICAgICAgICAgIGlmICggKCBpZmJwLT5JRkJfRFNMaW5rU3RhdCAmIENGR19MSU5LX1NUQVRfQ09OTkVDVEVEICkgPT0gMCApIHsgICAgLy9ldmVuIHZhbHVlcyBhcmUgZGlzY29ubmVjdGVkIGV0Yy4KKy8vICAgICAgICAgICAgICBpZmJwLT5JRkJfVGlja0NudCA9IDA7ICAgICAgICAgICAgICAvL3N0YXJ0IDIgc2Vjb25kIHBlcmlvZCAod2l0aCAxIHRpY2sgdW5jZXJ0YW50eSkKKy8vICAgICAgICAgICAgICBwcmludGsoICI8NT5pc3JfaW5mbzogQXdhaXRDb25uZWN0aW9uIHBoYXNlIHN0YXJ0ZWQsIElGQl9UaWNrQ250ID0gMFxuIiApOyAgICAgIC8vOz9yZW1vdmUgbWUgMSBkYXkKKy8vICAgICAgICAgIH0KIC8vICNlbmRpZiAvLyBIQ0ZfRERTCi0vLyAJCX0KKy8vICAgICAgfQogLy8gI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfSU5GT19MT0cKLS8vIC8qNiovCXdoaWxlICggMSApIHsKLS8vIAkJCWlmICggcmlkcC0+dHlwID09IDAgfHwgcmlkcC0+dHlwID09IGluZm9bMV0gKSB7Ci0vLyAJCQkJaWYgKCByaWRwLT5idWZwICkgewotLy8gCQkJCQlIQ0ZBU1NFUlQoIHJpZHAtPmxlbiA+PSAyLCByaWRwLT50eXAgKQotLy8gCQkJCQkodm9pZClzZXR1cF9iYXAoIGlmYnAsIGZpZCwgMiwgSU9fSU4gKTsJCQkvL3Jlc3RvcmUgQkFQIGZvciB0YWxsaWVzLCBsaW5rc3RhdCBhbmQgc3BlY2lmaWMgdHlwZSBmb2xsb3dlZCBieSB3aWxkIGNhcmQKLS8vIAkJCQkJcmlkcC0+YnVmcFswXSA9IG1pbiggcmlkcC0+bGVuIC0gMSwgaW5mb1swXSApOyAJLy9zYXZlIEwKLS8vIAkJCQkJZ2V0X2ZyYWcoIGlmYnAsICh3Y2lfYnVmcCkmcmlkcC0+YnVmcFsxXSwgcmlkcC0+YnVmcFswXSoyIEJFX1BBUigwKSApOwotLy8gCQkJCX0KLS8vIAkJCQlicmVhazsgLy87P3RoaXMgYnJlYWsgaXMgbm8gbG9uZ2VyIG5lZWRlZCBkdWUgdG8gc2V0dXBfYmFwIGJ1dCBsZXRzIGNvbmNlbnRyYXRlIG9uIEREUyBmaXJzdAotLy8gCQkJfQotLy8gCQkJcmlkcCsrOwotLy8gCQl9CisvLyAvKjYqLyAgICB3aGlsZSAoIDEgKSB7CisvLyAgICAgICAgICBpZiAoIHJpZHAtPnR5cCA9PSAwIHx8IHJpZHAtPnR5cCA9PSBpbmZvWzFdICkgeworLy8gICAgICAgICAgICAgIGlmICggcmlkcC0+YnVmcCApIHsKKy8vICAgICAgICAgICAgICAgICAgSENGQVNTRVJUKCByaWRwLT5sZW4gPj0gMiwgcmlkcC0+dHlwICk7CisvLyAgICAgICAgICAgICAgICAgICh2b2lkKXNldHVwX2JhcCggaWZicCwgZmlkLCAyLCBJT19JTiApOyAgICAgICAgIC8vcmVzdG9yZSBCQVAgZm9yIHRhbGxpZXMsIGxpbmtzdGF0IGFuZCBzcGVjaWZpYyB0eXBlIGZvbGxvd2VkIGJ5IHdpbGQgY2FyZAorLy8gICAgICAgICAgICAgICAgICByaWRwLT5idWZwWzBdID0gbWluKCByaWRwLT5sZW4gLSAxLCBpbmZvWzBdICk7ICAvL3NhdmUgTAorLy8gICAgICAgICAgICAgICAgICBnZXRfZnJhZyggaWZicCwgKHdjaV9idWZwKSZyaWRwLT5idWZwWzFdLCByaWRwLT5idWZwWzBdKjIgQkVfUEFSKDApICk7CisvLyAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgICAgIGJyZWFrOyAvLzs/dGhpcyBicmVhayBpcyBubyBsb25nZXIgbmVlZGVkIGR1ZSB0byBzZXR1cF9iYXAgYnV0IGxldHMgY29uY2VudHJhdGUgb24gRERTIGZpcnN0CisvLyAgICAgICAgICB9CisvLyAgICAgICAgICByaWRwKys7CisvLyAgICAgIH0KIC8vICNlbmRpZiAvLyBIQ0ZfRVhUX0lORk9fTE9HCi0vLyAJfQotLy8gCUhDRlRSQUNFKCBpZmJwLCBIQ0ZfVFJBQ0VfSVNSX0lORk8gfCBIQ0ZfVFJBQ0VfRVhJVCApOworLy8gIH0KKy8vICBIQ0ZUUkFDRSggaWZicCwgSENGX1RSQUNFX0lTUl9JTkZPIHwgSENGX1RSQUNFX0VYSVQgKTsKIC8vCiAvLwogLy8KIC8vCi0vLwlyZXR1cm47CisvLyAgcmV0dXJuOwogLy99IC8vIGlzcl9pbmZvCi0vLyNlbmRpZiAvLyBIQ0ZfRExfT05MWQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSoKLSouU1VCTU9EVUxFCQl2b2lkIG1kZF9hc3NlcnQoIElGQlAgaWZicCwgdW5zaWduZWQgaW50IGxpbmVfbnVtYmVyLCBoY2ZfMzIgcSApCi0qLlBVUlBPU0UJCWZpbHRlcnMgYXNzZXJ0IG9uIGxldmVsIGFuZCBpbnRlcmZhY2VzIHRvIHRoZSBNU0Ygc3VwcGxpZWQgbXNmX2Fzc2VydCByb3V0aW5lLgotKgotKi5BUkdVTUVOVFMKLSoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCi0qCWxpbmVfbnVtYmVyCWxpbmUgbnVtYmVyIG9mIHRoZSBsaW5lIHdoaWNoIGNhdXNlZCB0aGUgYXNzZXJ0Ci0qCXEJCQlxdWFsaWZpZXIsIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gd2hpY2ggbWF5IGdpdmUgYSBjbHVlIGFib3V0IHRoZSBwcm9ibGVtCi0qCi0qLlJFVFVSTlMJCU4uQS4KLSoKLSouREVTQ1JJUFRJT04KLSoKLSoKLSouRElBR1JBTQotKgotKi5OT1RJQ0UKLSogbWRkX2Fzc2VydCBoYXMgYmVlbiB0aHJvdWdoIGEgdHVybW9pbCwgcmVuYW1pbmcgaGNmX2Fzc2VydCB0byBhc3NlcnQgYW5kIGhjZl9hc3NlcnQgYWdhaW4gYW5kIHN1cHBvcnRpbmcgb2ZmCi0qIGFuZCBvbiBiZWluZyBjYWxsZWQgZnJvbSB0aGUgTVNGIGxldmVsIGFuZCBvdGhlciAoIGltbWF0dXJlICkgTW9kdWxhckRyaXZlckRldmVsb3BtZW50IG1vZHVsZXMgbGlrZSBESEYgYW5kCi0qIE1NRC4KLSAqICEhISEgVGhlIGFzc2VydCByb3V0aW5lIGlzIG5vdCBhbiBoY2ZfLi4uLi4gcm91dGluZSBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBtYXkgYmUgY2FsbGVkIGJ5IHRoZSBNU0YsCi0gKgkJaG93ZXZlciBpdCBpcyBjYWxsZWQgZnJvbSBtbWQuYyBhbmQgZGhmLmMsIHNvIGl0IG11c3QgYmUgZXh0ZXJuYWwuCi0gKgkJVG8gcHJldmVudCBuYW1lc3BhY2UgcG9sbHV0aW9uIGl0IG5lZWRzIGEgcHJlZml4LCB0byBwcmV2ZW50IHRoYXQgTVNGIHByb2dyYW1tZXJzIHRoaW5rIHRoYXQKLSAqCQl0aGV5IGFyZSBhbGxvd2VkIHRvIGNhbGwgdGhlIGFzc2VydCBsb2dpYywgdGhlIHByZWZpeCBIQ0YgY2FuJ3QgYmUgdXNlZCwgc28gTUREIGlzIHNlbGVjdGVkISEhIQogICoKLSogV2hlbiBjYWxsZWQgZnJvbSB0aGUgREhGIG1vZHVsZSB0aGUgbGluZSBudW1iZXIgaXMgaW5jcmVtZW50ZWQgYnkgREhGX0ZJTEVfTkFNRV9PRkZTRVQgYW5kIHdoZW4gY2FsbGVkIGZyb20KLSogdGhlIE1NRCBtb2R1bGUgYnkgTU1EX0ZJTEVfTkFNRV9PRkZTRVQuCi0qCi0qLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICouU1VCTU9EVUxFICAgICB2b2lkIG1kZF9hc3NlcnQoIElGQlAgaWZicCwgdW5zaWduZWQgaW50IGxpbmVfbnVtYmVyLCBoY2ZfMzIgcSApCisgKi5QVVJQT1NFICAgICAgIGZpbHRlcnMgYXNzZXJ0IG9uIGxldmVsIGFuZCBpbnRlcmZhY2VzIHRvIHRoZSBNU0Ygc3VwcGxpZWQgbXNmX2Fzc2VydCByb3V0aW5lLgorICoKKyAqLkFSR1VNRU5UUworICogICBpZmJwICAgICAgICBhZGRyZXNzIG9mIHRoZSBJbnRlcmZhY2UgQmxvY2sKKyAqICAgbGluZV9udW1iZXIgbGluZSBudW1iZXIgb2YgdGhlIGxpbmUgd2hpY2ggY2F1c2VkIHRoZSBhc3NlcnQKKyAqICAgcSAgICAgICAgICAgcXVhbGlmaWVyLCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdoaWNoIG1heSBnaXZlIGEgY2x1ZSBhYm91dCB0aGUgcHJvYmxlbQorICoKKyAqLlJFVFVSTlMgICAgICAgTi5BLgorICoKKyAqLkRFU0NSSVBUSU9OCisgKgorICoKKyAqLkRJQUdSQU0KKyAqCisgKi5OT1RJQ0UKKyAqIG1kZF9hc3NlcnQgaGFzIGJlZW4gdGhyb3VnaCBhIHR1cm1vaWwsIHJlbmFtaW5nIGhjZl9hc3NlcnQgdG8gYXNzZXJ0IGFuZCBoY2ZfYXNzZXJ0IGFnYWluIGFuZCBzdXBwb3J0aW5nIG9mZgorICogYW5kIG9uIGJlaW5nIGNhbGxlZCBmcm9tIHRoZSBNU0YgbGV2ZWwgYW5kIG90aGVyICggaW1tYXR1cmUgKSBNb2R1bGFyRHJpdmVyRGV2ZWxvcG1lbnQgbW9kdWxlcyBsaWtlIERIRiBhbmQKKyAqIE1NRC4KKyAqICEhISEgVGhlIGFzc2VydCByb3V0aW5lIGlzIG5vdCBhbiBoY2ZfLi4uLi4gcm91dGluZSBpbiB0aGUgc2Vuc2UgdGhhdCBpdCBtYXkgYmUgY2FsbGVkIGJ5IHRoZSBNU0YsCisgKiAgICAgIGhvd2V2ZXIgaXQgaXMgY2FsbGVkIGZyb20gbW1kLmMgYW5kIGRoZi5jLCBzbyBpdCBtdXN0IGJlIGV4dGVybmFsLgorICogICAgICBUbyBwcmV2ZW50IG5hbWVzcGFjZSBwb2xsdXRpb24gaXQgbmVlZHMgYSBwcmVmaXgsIHRvIHByZXZlbnQgdGhhdCBNU0YgcHJvZ3JhbW1lcnMgdGhpbmsgdGhhdAorICogICAgICB0aGV5IGFyZSBhbGxvd2VkIHRvIGNhbGwgdGhlIGFzc2VydCBsb2dpYywgdGhlIHByZWZpeCBIQ0YgY2FuJ3QgYmUgdXNlZCwgc28gTUREIGlzIHNlbGVjdGVkISEhIQorICoKKyAqIFdoZW4gY2FsbGVkIGZyb20gdGhlIERIRiBtb2R1bGUgdGhlIGxpbmUgbnVtYmVyIGlzIGluY3JlbWVudGVkIGJ5IERIRl9GSUxFX05BTUVfT0ZGU0VUIGFuZCB3aGVuIGNhbGxlZCBmcm9tCisgKiB0aGUgTU1EIG1vZHVsZSBieSBNTURfRklMRV9OQU1FX09GRlNFVC4KKyAqCisgKi5FTkRET0MgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmIEhDRl9BU1NFUlQKIHZvaWQKIG1kZF9hc3NlcnQoIElGQlAgaWZicCwgdW5zaWduZWQgaW50IGxpbmVfbnVtYmVyLCBoY2ZfMzIgcSApCiB7Ci1oY2ZfMTYJcnVuX3RpbWVfZmxhZyA9IGlmYnAtPklGQl9Bc3NlcnRMdmw7CisJaGNmXzE2ICBydW5fdGltZV9mbGFnID0gaWZicC0+SUZCX0Fzc2VydEx2bDsKIAogCWlmICggcnVuX3RpbWVfZmxhZyAvKiA+IDs/Pz8/Pz8gKi8gKSB7IC8vcHJldmVudCByZWN1cnNpdmUgYmVoYXZpb3IsIGxhdGVyIHRvIGJlIGV4dGVuZGVkIHRvIGxldmVsIGZpbHRlcmluZwogCQlpZmJwLT5JRkJfQXNzZXJ0UXVhbGlmaWVyID0gcTsKQEAgLTQ0NDAsNzQgKzQzMDUsNzQgQEAKIAkJT1BXKCBIUkVHX1NXXzIsIChoY2ZfMTYpKHEgPj4gMTYgKSApOwogI2VuZGlmIC8vIEhDRl9BU1NFUlRfU1dfU1VQCiAKLSNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX01CICYmIChIQ0ZfQVNTRVJUKSAmIEhDRl9BU1NFUlRfTUIKLQkJaWZicC0+SUZCX0Fzc2VydEx2bCA9IDA7CQkJCQkJCQkJLy8gcHJldmVudCByZWN1cnNpdmUgYmVoYXZpb3IKKyNpZiAoSENGX0FTU0VSVCkgJiBIQ0ZfQVNTRVJUX01CCisJCWlmYnAtPklGQl9Bc3NlcnRMdmwgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgcmVjdXJzaXZlIGJlaGF2aW9yCiAJCWhjZl9wdXRfaW5mbyggaWZicCwgKExUVlApJmlmYnAtPklGQl9Bc3NlcnRTdHJjdCApOwotCQlpZmJwLT5JRkJfQXNzZXJ0THZsID0gcnVuX3RpbWVfZmxhZzsJCQkJCQkvLyByZXN0b3JlIGFwcHJvcHJpYXRlIGZpbHRlciBsZXZlbAotI2VuZGlmIC8vIEhDRl9FWFRfTUIgLyBIQ0ZfQVNTRVJUX01CCisJCWlmYnAtPklGQl9Bc3NlcnRMdmwgPSBydW5fdGltZV9mbGFnOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgYXBwcm9wcmlhdGUgZmlsdGVyIGxldmVsCisjZW5kaWYgLy8gSENGX0FTU0VSVF9NQgogCX0KIH0gLy8gbWRkX2Fzc2VydAogI2VuZGlmIC8vIEhDRl9BU1NFUlQKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qLlNVQk1PRFVMRQkJdm9pZCBwdXRfZnJhZyggSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCBpbnQgbGVuIEJFX1BBUiggaW50IHdvcmRfbGVuICkgKQotKi5QVVJQT1NFCQl3cml0ZXMgd2l0aCAxNi8zMiBiaXQgSS9PIHZpYSBCQVAxIHBvcnQgZnJvbSBIb3N0IG1lbW9yeSB0byBOSUMgUkFNLgotKgotKi5BUkdVTUVOVFMKLSoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCi0qCWJ1ZnAJCShieXRlKSBhZGRyZXNzIG9mIGJ1ZmZlcgotKglsZW4JCQlsZW5ndGggaW4gYnl0ZXMgb2YgYnVmZmVyIHNwZWNpZmllZCBieSBidWZwCi0qCXdvcmRfbGVuCUJpZyBFbmRpYW4gb25seTogbnVtYmVyIG9mIGxlYWRpbmcgYnl0ZXMgdG8gc3dhcCBpbiBwYWlycwotKgotKi5SRVRVUk5TCQlOLkEuCi0qCi0qLkRFU0NSSVBUSU9OCi0qIHByb2Nlc3MgdGhlIHNpbmdsZSBieXRlIChpZiBhcHBsaWNhYmxlKSBub3QgeWV0IHdyaXR0ZW4gYnkgdGhlIHByZXZpb3VzIHB1dF9mcmFnIGFuZCBjb3B5IGxlbgotKiAob3IgbGVuLTEpIGJ5dGVzIGZyb20gYnVmcCB0byBOSUMuCi0qCi0qCi0qLkRJQUdSQU0KLSoKLSouTk9USUNFCi0qCUl0IHR1cm5zIG91dCBET1MgT0RJIHVzZXMgemVybyBsZW5ndGggZnJhZ21lbnRzLiBUaGUgSENGIGNvZGUgY2FuIGNvcGUgd2l0aCBpdCwgYnV0IGFzIGEgY29uc2VxdWVuY2UsIG5vCi0qCUFzc2VydCBvbiBsZW4gaXMgcG9zc2libGUKLSoKLSouRU5ERE9DCQkJCUVORCBET0NVTUVOVEFUSU9OCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKgorICouU1VCTU9EVUxFICAgICB2b2lkIHB1dF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIGludCBsZW4gQkVfUEFSKCBpbnQgd29yZF9sZW4gKSApCisgKi5QVVJQT1NFICAgICAgIHdyaXRlcyB3aXRoIDE2LzMyIGJpdCBJL08gdmlhIEJBUDEgcG9ydCBmcm9tIEhvc3QgbWVtb3J5IHRvIE5JQyBSQU0uCisgKgorICouQVJHVU1FTlRTCisgKiAgIGlmYnAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworICogICBidWZwICAgICAgICAoYnl0ZSkgYWRkcmVzcyBvZiBidWZmZXIKKyAqICAgbGVuICAgICAgICAgbGVuZ3RoIGluIGJ5dGVzIG9mIGJ1ZmZlciBzcGVjaWZpZWQgYnkgYnVmcAorICogICB3b3JkX2xlbiAgICBCaWcgRW5kaWFuIG9ubHk6IG51bWJlciBvZiBsZWFkaW5nIGJ5dGVzIHRvIHN3YXAgaW4gcGFpcnMKKyAqCisgKi5SRVRVUk5TICAgICAgIE4uQS4KKyAqCisgKi5ERVNDUklQVElPTgorICogcHJvY2VzcyB0aGUgc2luZ2xlIGJ5dGUgKGlmIGFwcGxpY2FibGUpIG5vdCB5ZXQgd3JpdHRlbiBieSB0aGUgcHJldmlvdXMgcHV0X2ZyYWcgYW5kIGNvcHkgbGVuCisgKiAob3IgbGVuLTEpIGJ5dGVzIGZyb20gYnVmcCB0byBOSUMuCisgKgorICoKKyAqLkRJQUdSQU0KKyAqCisgKi5OT1RJQ0UKKyAqICAgSXQgdHVybnMgb3V0IERPUyBPREkgdXNlcyB6ZXJvIGxlbmd0aCBmcmFnbWVudHMuIFRoZSBIQ0YgY29kZSBjYW4gY29wZSB3aXRoIGl0LCBidXQgYXMgYSBjb25zZXF1ZW5jZSwgbm8KKyAqICAgQXNzZXJ0IG9uIGxlbiBpcyBwb3NzaWJsZQorICoKKyAqLkVORERPQyAgICAgICAgICAgICAgICBFTkQgRE9DVU1FTlRBVElPTgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBIQ0ZfU1RBVElDIHZvaWQKIHB1dF9mcmFnKCBJRkJQIGlmYnAsIHdjaV9idWZwIGJ1ZnAsIGludCBsZW4gQkVfUEFSKCBpbnQgd29yZF9sZW4gKSApCiB7Ci1oY2ZfaW8JCWlvX3BvcnQgPSBpZmJwLT5JRkJfSU9CYXNlICsgSFJFR19EQVRBXzE7CS8vQkFQIGRhdGEgcmVnaXN0ZXIKLWludAkJCWk7CQkJCQkJCQkJCQkvL3ByZXZlbnQgc2lkZSBlZmZlY3RzIGZyb20gbWFjcm8KLWhjZl8xNgkJajsKLQlIQ0ZBU1NFUlQoICgoaGNmXzMyKWJ1ZnAgJiAoSENGX0FMSUdOLTEpICkgPT0gMCwgKGhjZl8zMilidWZwICkKKwloY2ZfaW8gICAgICBpb19wb3J0ID0gaWZicC0+SUZCX0lPQmFzZSArIEhSRUdfREFUQV8xOyAgIC8vQkFQIGRhdGEgcmVnaXN0ZXIKKwlpbnQgICAgICAgICBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJldmVudCBzaWRlIGVmZmVjdHMgZnJvbSBtYWNybworCWhjZl8xNiAgICAgIGo7CisJSENGQVNTRVJUKCAoKGhjZl8zMilidWZwICYgKEhDRl9BTElHTi0xKSApID09IDAsIChoY2ZfMzIpYnVmcCApOwogI2lmIEhDRl9CSUdfRU5ESUFOCi0JSENGQVNTRVJUKCB3b3JkX2xlbiA9PSAwIHx8IHdvcmRfbGVuID09IDIgfHwgd29yZF9sZW4gPT0gNCwgd29yZF9sZW4gKQotCUhDRkFTU0VSVCggd29yZF9sZW4gPT0gMCB8fCAoKGhjZl8zMilidWZwICYgMSApID09IDAsIChoY2ZfMzIpYnVmcCApCi0JSENGQVNTRVJUKCB3b3JkX2xlbiA8PSBsZW4sIE1FUkdFXzIoIHdvcmRfbGVuLCBsZW4gKSApCisJSENGQVNTRVJUKCB3b3JkX2xlbiA9PSAwIHx8IHdvcmRfbGVuID09IDIgfHwgd29yZF9sZW4gPT0gNCwgd29yZF9sZW4gKTsKKwlIQ0ZBU1NFUlQoIHdvcmRfbGVuID09IDAgfHwgKChoY2ZfMzIpYnVmcCAmIDEgKSA9PSAwLCAoaGNmXzMyKWJ1ZnAgKTsKKwlIQ0ZBU1NFUlQoIHdvcmRfbGVuIDw9IGxlbiwgTUVSR0VfMiggd29yZF9sZW4sIGxlbiApICk7CiAKLQlpZiAoIHdvcmRfbGVuICkgewkJCQkJCQkJCS8vaWYgdGhlcmUgaXMgYW55dGhpbmcgdG8gY29udmVydAotIAkJCQkJCQkJCQkJCQkJLy8uICBjb252ZXJ0IGFuZCB3cml0ZSB0aGUgMXN0IGhjZl8xNgorCWlmICggd29yZF9sZW4gKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmIHRoZXJlIGlzIGFueXRoaW5nIHRvIGNvbnZlcnQKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIGNvbnZlcnQgYW5kIHdyaXRlIHRoZSAxc3QgaGNmXzE2CiAJCWogPSBidWZwWzFdIHwgYnVmcFswXTw8ODsKIAkJT1VUX1BPUlRfV09SRCggaW9fcG9ydCwgaiApOwotCQkJCQkJCQkJCQkJCQkvLy4gIHVwZGF0ZSBwb2ludGVyIGFuZCBjb3VudGVyIGFjY29yZGluZ2x5CisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICB1cGRhdGUgcG9pbnRlciBhbmQgY291bnRlciBhY2NvcmRpbmdseQogCQlsZW4gLT0gMjsKIAkJYnVmcCArPSAyOwotCQlpZiAoIHdvcmRfbGVuID4gMSApIHsJCQkJCQkJLy8uICBpZiB0aGVyZSBpcyB0byBjb252ZXJ0IG1vcmUgdGhhbiAxIHdvcmQgKCBpLmUgMiApCi0gCQkJCQkJCQkJCQkJCQkvLy4gIC4gIGNvbnZlcnQgYW5kIHdyaXRlIHRoZSAybmQgaGNmXzE2Ci0JCQlqID0gYnVmcFsxXSB8IGJ1ZnBbMF08PDg7CS8qYnVmcCBpcyBhbHJlYWR5IGluY3JlbWVudGVkIGJ5IDIqLworCQlpZiAoIHdvcmRfbGVuID4gMSApIHsgICAgICAgICAgIC8vLiAgaWYgdGhlcmUgaXMgdG8gY29udmVydCBtb3JlIHRoYW4gMSB3b3JkICggaS5lIDIgKQorCQkJICAgICAgICAgICAgICAgICAgICAgICAgLy8uICAuICBjb252ZXJ0IGFuZCB3cml0ZSB0aGUgMm5kIGhjZl8xNgorCQkJaiA9IGJ1ZnBbMV0gfCBidWZwWzBdPDw4OyAgIC8qYnVmcCBpcyBhbHJlYWR5IGluY3JlbWVudGVkIGJ5IDIqLwogCQkJT1VUX1BPUlRfV09SRCggaW9fcG9ydCwgaiApOwotCQkJCQkJCQkJCQkJCQkvLy4gIC4gIHVwZGF0ZSBwb2ludGVyIGFuZCBjb3VudGVyIGFjY29yZGluZ2x5CisJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIHVwZGF0ZSBwb2ludGVyIGFuZCBjb3VudGVyIGFjY29yZGluZ2x5CiAJCQlsZW4gLT0gMjsKIAkJCWJ1ZnAgKz0gMjsKIAkJfQogCX0KICNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgogCWkgPSBsZW47Ci0JaWYgKCBpICYmIGlmYnAtPklGQl9DYXJyeU91dCApIHsJCQkJCS8vc2tpcCB6ZXJvLWxlbmd0aAorCWlmICggaSAmJiBpZmJwLT5JRkJfQ2FycnlPdXQgKSB7ICAgICAgICAgICAgICAgICAgICAvL3NraXAgemVyby1sZW5ndGgKIAkJaiA9ICgoKmJ1ZnApPDw4KSArICggaWZicC0+SUZCX0NhcnJ5T3V0ICYgMHhGRiApOwogCQlPVVRfUE9SVF9XT1JEKCBpb19wb3J0LCBqICk7CiAJCWJ1ZnArKzsgaS0tOwpAQCAtNDUxNSwzNSArNDM4MCwzNSBAQAogCX0KICNpZiAoSENGX0lPKSAmIEhDRl9JT18zMkJJVFMKIAkvL3NraXAgemVyby1sZW5ndGggSS9PLCBzaW5nbGUgYnl0ZSBJL08gYW5kIEkvTyBub3Qgd29ydGh3aGlsZSAoaS5lLiBsZXNzIHRoYW4gNiBieXRlcylmb3IgRFcgbG9naWMKLQkJCQkJCQkJCQkJCQkvL2lmIGJ1ZmZlciBsZW5ndGggPj0gNiBhbmQgMzIgYml0cyBJL08gc3VwcG9ydAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiBidWZmZXIgbGVuZ3RoID49IDYgYW5kIDMyIGJpdHMgSS9PIHN1cHBvcnQKIAlpZiAoICEoaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfMTZCSVQpICYmIGkgPj0gNiApIHsKLWhjZl8zMiBGQVIJKnA0OyAvL3ByZXZlbnQgc2lkZSBlZmZlY3RzIGZyb20gbWFjcm8KLQkJaWYgKCAoIChoY2ZfMzIpYnVmcCAmIDB4MSApID09IDAgKSB7CQkJLy8uICBpZiBidWZmZXIgYXQgbGVhc3Qgd29yZCBhbGlnbmVkCi0JCQlpZiAoIChoY2ZfMzIpYnVmcCAmIDB4MiApIHsJCQkJLy8uICAuICBpZiBidWZmZXIgbm90IGRvdWJsZSB3b3JkIGFsaWduZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJLy8uICAuICAuICB3cml0ZSBhIHNpbmdsZSB3b3JkIHRvIGdldCBkb3VibGUgd29yZCBhbGlnbmVkCi0JCQkJaiA9ICood2NpX3JlY29yZHApYnVmcDsJCS8vanVzdCB0byBoZWxwIGVhc2Ugd3JpdGluZyBtYWNyb3Mgd2l0aCBlbWJlZGRlZCBhc3NlbWJseQorCQloY2ZfMzIgRkFSICAqcDQ7IC8vcHJldmVudCBzaWRlIGVmZmVjdHMgZnJvbSBtYWNybworCQlpZiAoICggKGhjZl8zMilidWZwICYgMHgxICkgPT0gMCApIHsgICAgICAgICAgICAvLy4gIGlmIGJ1ZmZlciBhdCBsZWFzdCB3b3JkIGFsaWduZWQKKwkJCWlmICggKGhjZl8zMilidWZwICYgMHgyICkgeyAgICAgICAgICAgICAvLy4gIC4gIGlmIGJ1ZmZlciBub3QgZG91YmxlIHdvcmQgYWxpZ25lZAorCQkJCQkJCQkvLy4gIC4gIC4gIHdyaXRlIGEgc2luZ2xlIHdvcmQgdG8gZ2V0IGRvdWJsZSB3b3JkIGFsaWduZWQKKwkJCQlqID0gKih3Y2lfcmVjb3JkcClidWZwOyAgICAgLy9qdXN0IHRvIGhlbHAgZWFzZSB3cml0aW5nIG1hY3JvcyB3aXRoIGVtYmVkZGVkIGFzc2VtYmx5CiAJCQkJT1VUX1BPUlRfV09SRCggaW9fcG9ydCwgaiApOwotCQkJCQkJCQkJCQkJCS8vLiAgLiAgLiAgYWRqdXN0IGJ1ZmZlciBsZW5ndGggYW5kIHBvaW50ZXIgYWNjb3JkaW5nbHkKKwkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgLiAgLiAgYWRqdXN0IGJ1ZmZlciBsZW5ndGggYW5kIHBvaW50ZXIgYWNjb3JkaW5nbHkKIAkJCQlidWZwICs9IDI7IGkgLT0gMjsKIAkJCX0KLQkJCQkJCQkJCQkJCQkvLy4gIC4gIHdyaXRlIGFzIG1hbnkgZG91YmxlIHdvcmQgYXMgcG9zc2libGUKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIHdyaXRlIGFzIG1hbnkgZG91YmxlIHdvcmQgYXMgcG9zc2libGUKIAkJCXA0ID0gKGhjZl8zMiBGQVIgKilidWZwOwogCQkJaiA9IChoY2ZfMTYpaS80OwogCQkJT1VUX1BPUlRfU1RSSU5HXzMyKCBpb19wb3J0LCBwNCwgaiApOwotCQkJCQkJCQkJCQkJCS8vLiAgLiAgYWRqdXN0IGJ1ZmZlciBsZW5ndGggYW5kIHBvaW50ZXIgYWNjb3JkaW5nbHkKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIGFkanVzdCBidWZmZXIgbGVuZ3RoIGFuZCBwb2ludGVyIGFjY29yZGluZ2x5CiAJCQlidWZwICs9IGkgJiB+MHgwMDAzOwogCQkJaSAmPSAweDAwMDM7CiAJCX0KIAl9CiAjZW5kaWYgLy8gSENGX0lPXzMyQklUUwotCQkJCQkJCQkJCQkJCS8vaWYgbm8gMzItYml0IHN1cHBvcnQgT1IgYnl0ZSBhbGlnbmVkIE9SIDEgd29yZCBsZWZ0CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgbm8gMzItYml0IHN1cHBvcnQgT1IgYnl0ZSBhbGlnbmVkIE9SIDEgd29yZCBsZWZ0CiAJaWYgKCBpICkgewotCQkJCQkJCQkJCQkJCS8vLiAgaWYgb2RkIG51bWJlciBvZiBieXRlcyBsZWZ0CisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8uICBpZiBvZGQgbnVtYmVyIG9mIGJ5dGVzIGxlZnQKIAkJaWYgKCBpICYgMHgwMDAxICkgewotCQkJCQkJCQkJCQkJCS8vLiAgLiAgc2F2ZSBsZWZ0IG92ZXIgYnl0ZSAoYmVmb3JlIGJ1ZnAgaXMgY29ycnVwdGVkKSBpbiBjYXJyeSwgc2V0IGNhcnJ5IGZsYWcKLQkJCWlmYnAtPklGQl9DYXJyeU91dCA9IChoY2ZfMTYpYnVmcFtpLTFdIHwgMHgwMTAwOwkvL25vdGUgdGhhdCBpIGFuZCBidWZwIGFyZSBhbHdheXMgc2ltdWx0YW5lb3VzbHkgbW9kaWZpZWQsICZidWZwW2ktMV0gaXMgaW52YXJpYW50CisJCQkgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIC4gIHNhdmUgbGVmdCBvdmVyIGJ5dGUgKGJlZm9yZSBidWZwIGlzIGNvcnJ1cHRlZCkgaW4gY2FycnksIHNldCBjYXJyeSBmbGFnCisJCQlpZmJwLT5JRkJfQ2FycnlPdXQgPSAoaGNmXzE2KWJ1ZnBbaS0xXSB8IDB4MDEwMDsgICAgLy9ub3RlIHRoYXQgaSBhbmQgYnVmcCBhcmUgYWx3YXlzIHNpbXVsdGFuZW91c2x5IG1vZGlmaWVkLCAmYnVmcFtpLTFdIGlzIGludmFyaWFudAogCQl9Ci0JCQkJCQkJCQkJCQkJLy8uICB3cml0ZSBhcyBtYW55IHdvcmQgYXMgcG9zc2libGUgaW4gImFsaWdubWVudCBzYWZlIiB3YXkKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy4gIHdyaXRlIGFzIG1hbnkgd29yZCBhcyBwb3NzaWJsZSBpbiAiYWxpZ25tZW50IHNhZmUiIHdheQogCQlqID0gKGhjZl8xNilpLzI7CiAJCU9VVF9QT1JUX1NUUklOR184XzE2KCBpb19wb3J0LCBidWZwLCBqICk7CiAJfQpAQCAtNDU1MSwxMTcgKzQ0MTYsMTE3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKi5TVUJNT0RVTEUJCXZvaWQgcHV0X2ZyYWdfZmluYWxpemUoIElGQlAgaWZicCApCi0qLlBVUlBPU0UJCWNsZWFudXAgYWZ0ZXIgcHV0X2ZyYWcgZm9yIHRyYWlsaW5nIG9kZCBieXRlIGFuZCBNSUMgdHJhbnNmZXIgdG8gTklDLgotKgotKi5BUkdVTUVOVFMKLSoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCi0qCi0qLlJFVFVSTlMJCU4uQS4KLSoKLSouREVTQ1JJUFRJT04KLSogZmluYWxpemUgdGhlIE1JQyBjYWxjdWxhdGlvbiB3aXRoIHRoZSBwYWRkaW5nIHBhdHRlcm4sIG91dHB1dCB0aGUgbGFzdCBieXRlIChpZiBhcHBsaWNhYmxlKQotKiBvZiB0aGUgbWVzc2FnZSBhbmQgdGhlIE1JQyB0byB0aGUgVHhGUwotKgotKgotKi5ESUFHUkFNCi0qMjoJMSBieXRlIG9mIHRoZSBsYXN0IHB1dF9mcmFnIG1heSBiZSBzdGlsbCBpbiBJRkJfQ2FycnlPdXQgKCB0aGUgcHV0X2ZyYWcgY2FycnkgaG9sZGVyICksIHNvIC4uLi4uLi4uCi0qCTEgLSAzIGJ5dGVzIG9mIHRoZSBsYXN0IHB1dF9mcmFnIG1heSBiZSBzdGlsbCBpbiBJRkJfdHhfMzIgKCB0aGUgTUlDIGVuZ2luZSBjYXJyeSBob2xkZXIgKSwgc28gLi4uLi4uLi4KLSoJVGhlIGNhbGwgdG8gdGhlIE1JQyBjYWxjdWxhdGlvbiByb3V0aW5lIGZlZWRzIHRoZXNlIHJlbWFpbmluZyBieXRlcyAoaWYgYW55KSBvZiBwdXRfZnJhZyBhbmQgdGhlCi0qCWp1c3QgYXMgbWFueSBieXRlcyBvZiB0aGUgcGFkZGluZyBhcyBuZWVkZWQgdG8gdGhlIE1JQyBjYWxjdWxhdGlvbiBlbmdpbmUuIE5vdGUgdGhhdCB0aGUgInVubmVlZGVkIiBwYWQKLSoJYnl0ZXMgc2ltcGx5IGVuZCB1cCBpbiB0aGUgTUlDIGVuZ2luZSBjYXJyeSBob2xkZXIgYW5kIGFyZSBuZXZlciB1c2VkLgotKjg6CXdyaXRlIHRoZSByZW1haW5kZXIgb2YgdGhlIE1JQyBhbmQgcG9zc2libGUgc29tZSBnYXJiYWdlIHRvIE5JQyBSQU0KLSoJTm90ZTogaSBpcyBhbHdheXMgNCAoYSBsb29wLWludmFyaWFudCBvZiB0aGUgd2hpbGUgaW4gcG9pbnQgMikKLSoKLSouTk9USUNFCi0qCi0qLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoKKyAqLlNVQk1PRFVMRSAgICAgdm9pZCBwdXRfZnJhZ19maW5hbGl6ZSggSUZCUCBpZmJwICkKKyAqLlBVUlBPU0UgICAgICAgY2xlYW51cCBhZnRlciBwdXRfZnJhZyBmb3IgdHJhaWxpbmcgb2RkIGJ5dGUgYW5kIE1JQyB0cmFuc2ZlciB0byBOSUMuCisgKgorICouQVJHVU1FTlRTCisgKiAgIGlmYnAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworICoKKyAqLlJFVFVSTlMgICAgICAgTi5BLgorICoKKyAqLkRFU0NSSVBUSU9OCisgKiBmaW5hbGl6ZSB0aGUgTUlDIGNhbGN1bGF0aW9uIHdpdGggdGhlIHBhZGRpbmcgcGF0dGVybiwgb3V0cHV0IHRoZSBsYXN0IGJ5dGUgKGlmIGFwcGxpY2FibGUpCisgKiBvZiB0aGUgbWVzc2FnZSBhbmQgdGhlIE1JQyB0byB0aGUgVHhGUworICoKKyAqCisgKi5ESUFHUkFNCisgKjI6IDEgYnl0ZSBvZiB0aGUgbGFzdCBwdXRfZnJhZyBtYXkgYmUgc3RpbGwgaW4gSUZCX0NhcnJ5T3V0ICggdGhlIHB1dF9mcmFnIGNhcnJ5IGhvbGRlciApLCBzbyAuLi4uLi4uLgorICogICAxIC0gMyBieXRlcyBvZiB0aGUgbGFzdCBwdXRfZnJhZyBtYXkgYmUgc3RpbGwgaW4gSUZCX3R4XzMyICggdGhlIE1JQyBlbmdpbmUgY2FycnkgaG9sZGVyICksIHNvIC4uLi4uLi4uCisgKiAgIFRoZSBjYWxsIHRvIHRoZSBNSUMgY2FsY3VsYXRpb24gcm91dGluZSBmZWVkcyB0aGVzZSByZW1haW5pbmcgYnl0ZXMgKGlmIGFueSkgb2YgcHV0X2ZyYWcgYW5kIHRoZQorICogICBqdXN0IGFzIG1hbnkgYnl0ZXMgb2YgdGhlIHBhZGRpbmcgYXMgbmVlZGVkIHRvIHRoZSBNSUMgY2FsY3VsYXRpb24gZW5naW5lLiBOb3RlIHRoYXQgdGhlICJ1bm5lZWRlZCIgcGFkCisgKiAgIGJ5dGVzIHNpbXBseSBlbmQgdXAgaW4gdGhlIE1JQyBlbmdpbmUgY2FycnkgaG9sZGVyIGFuZCBhcmUgbmV2ZXIgdXNlZC4KKyAqODogd3JpdGUgdGhlIHJlbWFpbmRlciBvZiB0aGUgTUlDIGFuZCBwb3NzaWJsZSBzb21lIGdhcmJhZ2UgdG8gTklDIFJBTQorICogICBOb3RlOiBpIGlzIGFsd2F5cyA0IChhIGxvb3AtaW52YXJpYW50IG9mIHRoZSB3aGlsZSBpbiBwb2ludCAyKQorICoKKyAqLk5PVElDRQorICoKKyAqLkVORERPQyAgICAgICAgICAgICAgICBFTkQgRE9DVU1FTlRBVElPTgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBIQ0ZfU1RBVElDIHZvaWQKIHB1dF9mcmFnX2ZpbmFsaXplKCBJRkJQIGlmYnAgKQogewogI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKLQlpZiAoIGlmYnAtPklGQl9NSUNUeENhcnJ5ICE9IDB4RkZGRikgewkJLy9pZiBNSUMgY2FsY3VsYXRpb24gYWN0aXZlCi0JCUNBTENfVFhfTUlDKCBtaWNfcGFkLCA4KTsJCQkJLy8uICBmZWVkICh1cCB0byA4IGJ5dGVzIG9mKSB2aXJ0dWFsIHBhZGRpbmcgdG8gTUlDIGVuZ2luZQotCQkJCQkJCQkJCQkJLy8uICB3cml0ZSAocG9zc2libHkpIHRyYWlsaW5nIGJ5dGUgKyAobW9zdCBvZikgTUlDCisJaWYgKCBpZmJwLT5JRkJfTUlDVHhDYXJyeSAhPSAweEZGRkYpIHsgICAgICAvL2lmIE1JQyBjYWxjdWxhdGlvbiBhY3RpdmUKKwkJQ0FMQ19UWF9NSUMoIG1pY19wYWQsIDgpOyAgICAgICAgICAgICAgIC8vLiAgZmVlZCAodXAgdG8gOCBieXRlcyBvZikgdmlydHVhbCBwYWRkaW5nIHRvIE1JQyBlbmdpbmUKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLiAgd3JpdGUgKHBvc3NpYmx5KSB0cmFpbGluZyBieXRlICsgKG1vc3Qgb2YpIE1JQwogCQlwdXRfZnJhZyggaWZicCwgKHdjaV9idWZwKWlmYnAtPklGQl9NSUNUeCwgOCBCRV9QQVIoMCkgKTsKIAl9CiAjZW5kaWYgLy8gSENGX1RZUEVfV1BBCi0JcHV0X2ZyYWcoIGlmYnAsIG51bGxfYWRkciwgMSBCRV9QQVIoMCkgKTsJLy93cml0ZSAocG9zc2libHkpIHRyYWlsaW5nIGRhdGEgb3IgTUlDIGJ5dGUKKwlwdXRfZnJhZyggaWZicCwgbnVsbF9hZGRyLCAxIEJFX1BBUigwKSApOyAgIC8vd3JpdGUgKHBvc3NpYmx5KSB0cmFpbGluZyBkYXRhIG9yIE1JQyBieXRlCiB9IC8vIHB1dF9mcmFnX2ZpbmFsaXplCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKi5TVUJNT0RVTEUJCWludCBwdXRfaW5mbyggSUZCUCBpZmJwLCBMVFZQIGx0dnAgKQotKi5QVVJQT1NFCQlzdXBwb3J0IHJvdXRpbmUgdG8gaGFuZGxlIHRoZSAiYmFzaWMiIHRhc2sgb2YgaGNmX3B1dF9pbmZvIHRvIHBhc3MgUklEcyB0byB0aGUgTklDLgotKgotKi5BUkdVTUVOVFMKLSoJaWZicAkJYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCi0qCWx0dnAJCWFkZHJlc3MgaW4gTklDIFJBTSB3aGVyZSBMVlQtcmVjb3JkcyBhcmUgbG9jYXRlZAotKgotKi5SRVRVUk5TCi0qCUhDRl9TVUNDRVNTCi0qCT4+cHV0X2ZyYWcKLSoJPj5jbWRfd2FpdAotKgotKi5ERVNDUklQVElPTgotKgotKgotKi5ESUFHUkFNCi0qMjA6IGRvIG5vdCB3cml0ZSBSSURzIHRvIE5JQ3Mgd2hpY2ggaGF2ZSBpbmNvbXBhdGlibGUgRmlybXdhcmUKLSoyNDogSWYgdGhlIFJJRCBkb2VzIG5vdCBleGlzdCwgdGhlIEwtZmllbGQgaXMgc2V0IHRvIHplcm8uCi0qCU5vdGUgdGhhdCBzb21lIFJJRHMgY2FuIG5vdCBiZSByZWFkLCBlLmcuIHRoZSBwc2V1ZG8gUklEcyBmb3IgZGlyZWN0IEhlcm1lcyBjb21tYW5kcyBhbmQgQ0ZHX0RFRkFVTFRfS0VZUwotKjI4OiBJZiB0aGUgUklEIGlzIHdyaXR0ZW4gc3VjY2Vzc2Z1bCwgcGFzcyBpdCB0byB0aGUgTklDIGJ5IG1lYW5zIG9mIGFuIEFjY2VzcyBXcml0ZSBjb21tYW5kCi0qCi0qLk5PVElDRQotKglUaGUgbWVjaGFuaXNtIHRvIEhDRl9BU1NFUlQgb24gaW52YWxpZCB0eXAtY29kZXMgaW4gdGhlIExUViByZWNvcmQgaXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBzdHJhdGVneToKLSoJICAtCXNvbWUgY29kZXMgKGUuZy4gQ0ZHX1JFR19NQikgYXJlIGV4cGxpY2l0bHkgaGFuZGxlZCBieSB0aGUgSENGIHdoaWNoIGltcGxpZXMgdGhhdCB0aGVzZSBjb2RlcwotKgkJYXJlIHZhbGlkLiBUaGVzZSBjb2RlcyBhcmUgYWxyZWFkeSBjb25zdW1lZCBieSBoY2ZfcHV0X2luZm8uCi0qCSAgLSBhbGwgb3RoZXIgY29kZXMgYXJlIHBhc3NlZCB0byB0aGUgSGVybWVzLiBCZWZvcmUgdGhlIHB1dCBhY3Rpb24gaXMgZXhlY3V0ZWQsIGhjZl9nZXRfaW5mbyBpcyBjYWxsZWQKLSoJCXdpdGggYW4gTFRWIHJlY29yZCB3aXRoIGEgdmFsdWUgb2YgMSBpbgl0aGUgTC1maWVsZCBhbmQgdGhlIGludGVuZGVkIHB1dCBhY3Rpb24gdHlwZSBpbiB0aGUgVHlwLWNvZGUKLSoJCWZpZWxkLiBJZiB0aGUgcHV0IGFjdGlvbiB0eXBlIGlzIHZhbGlkLCBpdCBpcyBhbHNvIHZhbGlkIGFzIGEgZ2V0IGFjdGlvbiB0eXBlIGNvZGUgLSBleGNlcHQKLSoJCWZvciBDRkdfREVGQVVMVF9LRVlTIGFuZCBDRkdfQUREX1RLSVBfREVGQVVMVF9LRVkgLSBzbyB0aGUgSENGX0FTU0VSVCBsb2dpYyBvZiBoY2ZfZ2V0X2luZm8gc2hvdWxkCi0qCQlub3QgY2F0Y2guCi0qCi0qLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICoKKyAqLlNVQk1PRFVMRSAgICAgaW50IHB1dF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cCApCisgKi5QVVJQT1NFICAgICAgIHN1cHBvcnQgcm91dGluZSB0byBoYW5kbGUgdGhlICJiYXNpYyIgdGFzayBvZiBoY2ZfcHV0X2luZm8gdG8gcGFzcyBSSURzIHRvIHRoZSBOSUMuCisgKgorICouQVJHVU1FTlRTCisgKiAgIGlmYnAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jaworICogICBsdHZwICAgICAgICBhZGRyZXNzIGluIE5JQyBSQU0gd2hlcmUgTFZULXJlY29yZHMgYXJlIGxvY2F0ZWQKKyAqCisgKi5SRVRVUk5TCisgKiAgIEhDRl9TVUNDRVNTCisgKiAgID4+cHV0X2ZyYWcKKyAqICAgPj5jbWRfd2FpdAorICoKKyAqLkRFU0NSSVBUSU9OCisgKgorICoKKyAqLkRJQUdSQU0KKyAqMjA6IGRvIG5vdCB3cml0ZSBSSURzIHRvIE5JQ3Mgd2hpY2ggaGF2ZSBpbmNvbXBhdGlibGUgRmlybXdhcmUKKyAqMjQ6IElmIHRoZSBSSUQgZG9lcyBub3QgZXhpc3QsIHRoZSBMLWZpZWxkIGlzIHNldCB0byB6ZXJvLgorICogICBOb3RlIHRoYXQgc29tZSBSSURzIGNhbiBub3QgYmUgcmVhZCwgZS5nLiB0aGUgcHNldWRvIFJJRHMgZm9yIGRpcmVjdCBIZXJtZXMgY29tbWFuZHMgYW5kIENGR19ERUZBVUxUX0tFWVMKKyAqMjg6IElmIHRoZSBSSUQgaXMgd3JpdHRlbiBzdWNjZXNzZnVsLCBwYXNzIGl0IHRvIHRoZSBOSUMgYnkgbWVhbnMgb2YgYW4gQWNjZXNzIFdyaXRlIGNvbW1hbmQKKyAqCisgKi5OT1RJQ0UKKyAqICAgVGhlIG1lY2hhbmlzbSB0byBIQ0ZfQVNTRVJUIG9uIGludmFsaWQgdHlwLWNvZGVzIGluIHRoZSBMVFYgcmVjb3JkIGlzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgc3RyYXRlZ3k6CisgKiAgICAgLSBzb21lIGNvZGVzIChlLmcuIENGR19SRUdfTUIpIGFyZSBleHBsaWNpdGx5IGhhbmRsZWQgYnkgdGhlIEhDRiB3aGljaCBpbXBsaWVzIHRoYXQgdGhlc2UgY29kZXMKKyAqICAgICAgIGFyZSB2YWxpZC4gVGhlc2UgY29kZXMgYXJlIGFscmVhZHkgY29uc3VtZWQgYnkgaGNmX3B1dF9pbmZvLgorICogICAgIC0gYWxsIG90aGVyIGNvZGVzIGFyZSBwYXNzZWQgdG8gdGhlIEhlcm1lcy4gQmVmb3JlIHRoZSBwdXQgYWN0aW9uIGlzIGV4ZWN1dGVkLCBoY2ZfZ2V0X2luZm8gaXMgY2FsbGVkCisgKiAgICAgICB3aXRoIGFuIExUViByZWNvcmQgd2l0aCBhIHZhbHVlIG9mIDEgaW4gdGhlIEwtZmllbGQgYW5kIHRoZSBpbnRlbmRlZCBwdXQgYWN0aW9uIHR5cGUgaW4gdGhlIFR5cC1jb2RlCisgKiAgICAgICBmaWVsZC4gSWYgdGhlIHB1dCBhY3Rpb24gdHlwZSBpcyB2YWxpZCwgaXQgaXMgYWxzbyB2YWxpZCBhcyBhIGdldCBhY3Rpb24gdHlwZSBjb2RlIC0gZXhjZXB0CisgKiAgICAgICBmb3IgQ0ZHX0RFRkFVTFRfS0VZUyBhbmQgQ0ZHX0FERF9US0lQX0RFRkFVTFRfS0VZIC0gc28gdGhlIEhDRl9BU1NFUlQgbG9naWMgb2YgaGNmX2dldF9pbmZvIHNob3VsZAorICogICAgICAgbm90IGNhdGNoLgorICoKKyAqLkVORERPQyAgICAgICAgICAgICAgICBFTkQgRE9DVU1FTlRBVElPTgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBIQ0ZfU1RBVElDIGludAotcHV0X2luZm8oIElGQlAgaWZicCwgTFRWUCBsdHZwCSkKK3B1dF9pbmZvKCBJRkJQIGlmYnAsIExUVlAgbHR2cCAgKQogewogCi1pbnQgcmMgPSBIQ0ZfU1VDQ0VTUzsKKwlpbnQgcmMgPSBIQ0ZfU1VDQ0VTUzsKIAotCUhDRkFTU0VSVCggaWZicC0+SUZCX0NhcmRTdGF0ID09IDAsIE1FUkdFXzIoIGx0dnAtPnR5cCwgaWZicC0+SUZCX0NhcmRTdGF0ICkgKQotCUhDRkFTU0VSVCggQ0ZHX1JJRF9DRkdfTUlOIDw9IGx0dnAtPnR5cCAmJiBsdHZwLT50eXAgPD0gQ0ZHX1JJRF9DRkdfTUFYLCBsdHZwLT50eXAgKQorCUhDRkFTU0VSVCggaWZicC0+SUZCX0NhcmRTdGF0ID09IDAsIE1FUkdFXzIoIGx0dnAtPnR5cCwgaWZicC0+SUZCX0NhcmRTdGF0ICkgKTsKKwlIQ0ZBU1NFUlQoIENGR19SSURfQ0ZHX01JTiA8PSBsdHZwLT50eXAgJiYgbHR2cC0+dHlwIDw9IENGR19SSURfQ0ZHX01BWCwgbHR2cC0+dHlwICk7CiAKLQlpZiAoIGlmYnAtPklGQl9DYXJkU3RhdCA9PSAwICYmCQkJCQkJCQkJCQkJCQkJCS8qIDIwKi8KLQkJICggKCBDRkdfUklEX0NGR19NSU4gPD0gbHR2cC0+dHlwICAgICYmIGx0dnAtPnR5cCA8PSBDRkdfUklEX0NGR19NQVggKSB8fAotCQkgICAoIENGR19SSURfRU5HX01JTiA8PSBsdHZwLT50eXAgLyogJiYgbHR2cC0+dHlwIDw9IDB4RkZGRiAqLyAgICAgICApICAgICApICkgeworCWlmICggaWZicC0+SUZCX0NhcmRTdGF0ID09IDAgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMjAqLworCSAgICAgKCAoIENGR19SSURfQ0ZHX01JTiA8PSBsdHZwLT50eXAgICAgJiYgbHR2cC0+dHlwIDw9IENGR19SSURfQ0ZHX01BWCApIHx8CisJICAgICAgICggQ0ZHX1JJRF9FTkdfTUlOIDw9IGx0dnAtPnR5cCAvKiAmJiBsdHZwLT50eXAgPD0gMHhGRkZGICovICAgICAgICkgICAgICkgKSB7CiAjaWYgSENGX0FTU0VSVCAvL0ZDQzgsIEZDQjAsIEZDQjQsIEZDQjYsIEZDQjcsIEZDQjgsIEZDQzAsIEZDQzQsIEZDQkMsIEZDQkQsIEZDQkUsIEZDQkYKLSB7Ci0gaGNmXzE2CQl0ID0gbHR2cC0+dHlwOwotIExUVl9TVFJDVCAJeCA9IHsgMiwgdCwgezB9IH07CQkJCQkJCQkJCQkJCQkJLyoyNCovCi0JaGNmX2dldF9pbmZvKCBpZmJwLCAoTFRWUCkmeCApOwotCWlmICggeC5sZW4gPT0gMCAmJgotCQkgKCB0ICE9IENGR19ERUZBVUxUX0tFWVMgJiYgdCAhPSBDRkdfQUREX1RLSVBfREVGQVVMVF9LRVkgJiYgdCAhPSBDRkdfUkVNT1ZFX1RLSVBfREVGQVVMVF9LRVkgJiYKLQkJICAgdCAhPSBDRkdfQUREX1RLSVBfTUFQUEVEX0tFWSAmJiB0ICE9IENGR19SRU1PVkVfVEtJUF9NQVBQRURfS0VZICYmCi0JCSAgIHQgIT0gQ0ZHX0hBTkRPVkVSX0FERFIgJiYgdCAhPSBDRkdfRElTQVNTT0NJQVRFX0FERFIgJiYKLQkJICAgdCAhPSBDRkdfRkNCQyAmJiB0ICE9IENGR19GQ0JEICYmIHQgIT0gQ0ZHX0ZDQkUgJiYgdCAhPSBDRkdfRkNCRiAmJgotCQkgICB0ICE9IENGR19ERUFVVEhFTlRJQ0FURV9BRERSCi0JCSApCi0JCSkgewotCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgbHR2cC0+dHlwICkKKwkJeworCQkJaGNmXzE2ICAgICB0ID0gbHR2cC0+dHlwOworCQkJTFRWX1NUUkNUICB4ID0geyAyLCB0LCB7MH0gfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoyNCovCisJCQloY2ZfZ2V0X2luZm8oIGlmYnAsIChMVFZQKSZ4ICk7CisJCQlpZiAoIHgubGVuID09IDAgJiYKKwkJCSAgICAgKCB0ICE9IENGR19ERUZBVUxUX0tFWVMgJiYgdCAhPSBDRkdfQUREX1RLSVBfREVGQVVMVF9LRVkgJiYgdCAhPSBDRkdfUkVNT1ZFX1RLSVBfREVGQVVMVF9LRVkgJiYKKwkJCSAgICAgICB0ICE9IENGR19BRERfVEtJUF9NQVBQRURfS0VZICYmIHQgIT0gQ0ZHX1JFTU9WRV9US0lQX01BUFBFRF9LRVkgJiYKKwkJCSAgICAgICB0ICE9IENGR19IQU5ET1ZFUl9BRERSICYmIHQgIT0gQ0ZHX0RJU0FTU09DSUFURV9BRERSICYmCisJCQkgICAgICAgdCAhPSBDRkdfRkNCQyAmJiB0ICE9IENGR19GQ0JEICYmIHQgIT0gQ0ZHX0ZDQkUgJiYgdCAhPSBDRkdfRkNCRiAmJgorCQkJICAgICAgIHQgIT0gQ0ZHX0RFQVVUSEVOVElDQVRFX0FERFIKKwkJCQkgICAgICkKKwkJCQkpIHsKKwkJCQlIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgbHR2cC0+dHlwICk7CisJCQl9CiAJCX0KLSB9CiAjZW5kaWYgLy8gSENGX0FTU0VSVAogCiAJCXJjID0gc2V0dXBfYmFwKCBpZmJwLCBsdHZwLT50eXAsIDAsIElPX09VVCApOwogCQlwdXRfZnJhZyggaWZicCwgKHdjaV9idWZwKWx0dnAsIDIqbHR2cC0+bGVuICsgMiBCRV9QQVIoMikgKTsKLS8qMjgqLwlpZiAoIHJjID09IEhDRl9TVUNDRVNTICkgeworCS8qMjgqLyAgaWYgKCByYyA9PSBIQ0ZfU1VDQ0VTUyApIHsKIAkJCXJjID0gY21kX2V4ZSggaWZicCwgSENNRF9BQ0NFU1MgKyBIQ01EX0FDQ0VTU19XUklURSwgbHR2cC0+dHlwICk7CiAJCX0KIAl9CkBAIC00NjY5LDIxNCArNDUzNCwyMDkgQEAKIH0gLy8gcHV0X2luZm8KIAogCi0jaWYgKEhDRl9ETF9PTkxZKSA9PSAwCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qLlNVQk1PRFVMRQkJaW50IHB1dF9pbmZvX21iKCBJRkJQIGlmYnAsIENGR19NQl9JTkZPX1NUUkNUIEZBUiAqIGx0dnAgKQotKi5QVVJQT1NFCSAJYWNjdW11bGF0ZXMgYSAoIHNlcmllcyBvZikgYnVmZmVycyBpbnRvIGEgc2luZ2xlIEluZm8gYmxvY2sgaW50byB0aGUgTWFpbEJveC4KLSoKLSouQVJHVU1FTlRTCi0qCWlmYnAJCWFkZHJlc3Mgb2YgdGhlIEludGVyZmFjZSBCbG9jawotKglsdHZwCQlhZGRyZXNzIG9mIHN0cnVjdHVyZSBzcGVjaWZ5aW5nIHRoZSAidHlwZSIgYW5kIHRoZSBmcmFnbWVudHMgb2YgdGhlIGluZm9ybWF0aW9uIHRvIGJlIHN5bnRoZXNpemVkCi0qCQkJCWFzIGFuIExUViBpbnRvIHRoZSBNYWlsQm94Ci0qCi0qLlJFVFVSTlMKLSoKLSouREVTQ1JJUFRJT04KLSogSWYgdGhlIGRhdGEgZG9lcyBub3QgZml0IChpbmNsdWRpbmcgbm8gTWFpbEJveCBpcyBhdmFpbGFibGUpLCB0aGUgSUZCX01CVGFsbHkgaXMgaW5jcmVtZW50ZWQgYW5kIGFuCi0qIGVycm9yIHN0YXR1cyBpcyByZXR1cm5lZC4KLSogSENGX0FTU0VSVCBkb2VzIG5vdCBjYXRjaC4KLSogQ2FsbGluZyBwdXRfaW5mb19tYiB3aGVuIHRoZWlyIGlzIG5vIE1haWxCb3ggYXZhaWxhYmxlLCBpcyBjb25zaWRlcmVkIGEgZGVzaWduIGVycm9yIGluIHRoZSBNU0YuCi0qCi0qIE5vdGUgdGhhdCB0aGVyZSBpcyBhbHdheXMgYXQgbGVhc3QgMSB3b3JkIG9mIHVudXNlZCBzcGFjZSBpbiB0aGUgbWFpbCBib3guCi0qIEFzIGEgY29uc2VxdWVuY2U6Ci0qIC0gbm8gcHJvYmxlbSBpbiBwb2ludGVyIGFyaXRobWV0aWMgKE1CX1JQID09IE1CX1dQIG1lYW5zIHVuYW1iaWd1b3VzbHkgbWFpbCBib3ggaXMgY29tcGxldGVseSBlbXB0eQotKiAtIFRoZXJlIGlzIGFsd2F5cyBmcmVlIHNwYWNlIHRvIHdyaXRlIGFuIEwgZmllbGQgd2l0aCBhIHZhbHVlIG9mIHplcm8gYWZ0ZXIgZWFjaCBNQl9JbmZvIGJsb2NrLiAgVGhpcwotKiAgIGFsbG93cyBmb3IgYW4gZWFzeSBzY2FuIG1lY2hhbmlzbSBpbiB0aGUgImdldCBNQl9JbmZvIGJsb2NrIiBsb2dpYy4KLSoKLSoKLSouRElBR1JBTQotKjE6CUNhbGN1bGF0ZSBMIGZpZWxkIG9mIHRoZSBNQklCLCBpLmUuIDEgZm9yIHRoZSBULWZpZWxkICsgdGhlIGN1bXVsYXRpdmUgbGVuZ3RoIG9mIHRoZSBmcmFnbWVudHMuCi0qMjoJVGhlIGZyZWUgc3BhY2UgaW4gdGhlIE1haWxCb3ggaXMgY2FsY3VsYXRlZCAoMmE6IGZyZWUgcGFydCBmcm9tIFdyaXRlIFB0ciB0byBSZWFkIFB0ciwgMmI6IGZyZWUgcGFydAotKgl0dXJucyBvdXQgdG8gd3JhcCBhcm91bmQpIC4gSWYgdGhpcyBzcGFjZSBzdWZmaWNlcyB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIHdvcmRzIHJlZmxlY3RlZCBieSBsZW4gKFQtZmllbGQKLSoJKyBWYWx1ZS1maWVsZCkgcGx1cyB0aGUgYWRkaXRpb25hbCBNYWlsQm94IEluZm8gTC1maWVsZCArIGEgdHJhaWxpbmcgMCB0byBhY3QgYXMgdGhlIEwtZmllbGQgb2YgYSB0cmFpbGluZwotKglkdW1teSBvciBlbXB0eSBMVFYgcmVjb3JkLCB0aGVuIGEgTWFpbEJveCBJbmZvIGJsb2NrIGlzIGJ1aWxkIGluIHRoZSBNYWlsQm94IGNvbnNpc3Rpbmcgb2YKLSoJICAtIHRoZSB2YWx1ZSBsZW4gaW4gdGhlIGZpcnN0IHdvcmQKLSoJICAtIHR5cGUgaW4gdGhlIHNlY29uZCB3b3JkCi0qCSAgLSBhIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBmcmFnbWVudHMgaW4gdGhlIHNlY29uZCBhbmQgaGlnaGVyIHdvcmQKLSoKLSo0OglTaW5jZSBwdXRfaW5mb19tYigpIGNhbiBtb3JlIG9yIGxlc3MgZGlyZWN0bHkgYmUgY2FsbGVkIGZyb20gdGhlIE1TRiBsZXZlbCwgdGhlIEkvRiBtdXN0IGJlIHJvYnVzdAotKglhZ2FpbnN0IG91dC1vZi1yYW5nZSB2YXJpYWJsZXMuIEFzIGZhaWxzYWZlIGNvZGluZywgdGhlIE1CIHVwZGF0ZSBpcyBza2lwcGVkIGJ5IGNoYW5naW5nIHRsZW4gdG8gMCBpZgotKglsZW4gPT0gMDsgVGhpcyB3aWxsIGluZGlyZWN0bHkgY2F1c2UgYW4gYXNzZXJ0IGFzIHJlc3VsdCBvZiB0aGUgdmlvbGF0aW9uIG9mIHRoZSBuZXh0IGlmIGNsYXVzZS4KLSo2OglDaGVjayB3aGV0aGVyIHRoZSBmcmVlIHNwYWNlIGluIE1haWxCb3ggc3VmZmljZXMgKHRoaXMgY292ZXJzIHRoZSBjb21wbGV0ZSBhYnNlbmNlIG9mIHRoZSBNYWlsQm94KS4KLSoJTm90ZSB0aGF0IGxlbiBpcyB1bnNpZ25lZCwgc28gZXZlbiBNU0YgSS9GIHZpb2xhdGlvbiB3b3JrcyBvdXQgTy5LLgotKglUaGUgJzInIGluIHRoZSBleHByZXNzaW9uICJsZW4rMiIgaXMgdXNlZCBiZWNhdXNlIDEgd29yZCBpcyBuZWVkZWQgZm9yIEwgaXRzZWxmIGFuZCAxIHdvcmQgaXMgbmVlZGVkCi0qCWZvciB0aGUgemVyby1zZW50aW5lbAotKjg6CXVwZGF0ZSBNYWlsQm94IEluZm8gbGVuZ3RoIHJlcG9ydCB0byBNU0Ygd2l0aCAib2xkZXN0IiBNQiBJbmZvIEJsb2NrIHNpemUuIEJlIGNhcmVmdWwgaGVyZSwgaWYgeW91IGdldAotKgloZXJlIGJlZm9yZSB0aGUgTWFpbEJveCBpcyByZWdpc3RlcmVkLCB5b3UgY2FuJ3QgcmVhZCBmcm9tIHRoZSBidWZmZXIgYWRkcmVzc2VkIGJ5IElGQl9NQnAgKGl0IGlzIHRoZQotKglOdWxsIGJ1ZmZlcikgc28gZG9uJ3QgbW92ZSB0aGlzIGNvZGUgdGlsbCB0aGUgZW5kIG9mIHRoaXMgcm91dGluZSBidXQga2VlcCBpdCB3aGVyZSB0aGVyZSBpcyBnYXJ1YW50ZWVkCi0qCWEgYnVmZmVyLgotKgotKi5OT1RJQ0UKLSoJYm91bmRhcnkgdGVzdGluZyBkZXBlbmRzIG9uIHRoZSBmYWN0IHRoYXQgSUZCX01CU2l6ZSBpcyBndWFyYW50ZWVkIHRvIGJlIHplcm8gaWYgbm8gTWFpbEJveCBpcyBwcmVzZW50LAotKglhbmQgdG8gYSBsZXNzZXIgZGVncmVlLCB0aGF0IElGQl9NQldwID0gSUZCX01CUnAgPSAwCi0qCi0qLkVORERPQwkJCQlFTkQgRE9DVU1FTlRBVElPTgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfTUIKKyAqCisgKi5TVUJNT0RVTEUgICAgIGludCBwdXRfaW5mb19tYiggSUZCUCBpZmJwLCBDRkdfTUJfSU5GT19TVFJDVCBGQVIgKiBsdHZwICkKKyAqLlBVUlBPU0UgICAgICAgYWNjdW11bGF0ZXMgYSAoIHNlcmllcyBvZikgYnVmZmVycyBpbnRvIGEgc2luZ2xlIEluZm8gYmxvY2sgaW50byB0aGUgTWFpbEJveC4KKyAqCisgKi5BUkdVTUVOVFMKKyAqICAgaWZicCAgICAgICAgYWRkcmVzcyBvZiB0aGUgSW50ZXJmYWNlIEJsb2NrCisgKiAgIGx0dnAgICAgICAgIGFkZHJlc3Mgb2Ygc3RydWN0dXJlIHNwZWNpZnlpbmcgdGhlICJ0eXBlIiBhbmQgdGhlIGZyYWdtZW50cyBvZiB0aGUgaW5mb3JtYXRpb24gdG8gYmUgc3ludGhlc2l6ZWQKKyAqICAgICAgICAgICAgICAgYXMgYW4gTFRWIGludG8gdGhlIE1haWxCb3gKKyAqCisgKi5SRVRVUk5TCisgKgorICouREVTQ1JJUFRJT04KKyAqIElmIHRoZSBkYXRhIGRvZXMgbm90IGZpdCAoaW5jbHVkaW5nIG5vIE1haWxCb3ggaXMgYXZhaWxhYmxlKSwgdGhlIElGQl9NQlRhbGx5IGlzIGluY3JlbWVudGVkIGFuZCBhbgorICogZXJyb3Igc3RhdHVzIGlzIHJldHVybmVkLgorICogSENGX0FTU0VSVCBkb2VzIG5vdCBjYXRjaC4KKyAqIENhbGxpbmcgcHV0X2luZm9fbWIgd2hlbiB0aGVpciBpcyBubyBNYWlsQm94IGF2YWlsYWJsZSwgaXMgY29uc2lkZXJlZCBhIGRlc2lnbiBlcnJvciBpbiB0aGUgTVNGLgorICoKKyAqIE5vdGUgdGhhdCB0aGVyZSBpcyBhbHdheXMgYXQgbGVhc3QgMSB3b3JkIG9mIHVudXNlZCBzcGFjZSBpbiB0aGUgbWFpbCBib3guCisgKiBBcyBhIGNvbnNlcXVlbmNlOgorICogLSBubyBwcm9ibGVtIGluIHBvaW50ZXIgYXJpdGhtZXRpYyAoTUJfUlAgPT0gTUJfV1AgbWVhbnMgdW5hbWJpZ3VvdXNseSBtYWlsIGJveCBpcyBjb21wbGV0ZWx5IGVtcHR5CisgKiAtIFRoZXJlIGlzIGFsd2F5cyBmcmVlIHNwYWNlIHRvIHdyaXRlIGFuIEwgZmllbGQgd2l0aCBhIHZhbHVlIG9mIHplcm8gYWZ0ZXIgZWFjaCBNQl9JbmZvIGJsb2NrLiAgVGhpcworICogICBhbGxvd3MgZm9yIGFuIGVhc3kgc2NhbiBtZWNoYW5pc20gaW4gdGhlICJnZXQgTUJfSW5mbyBibG9jayIgbG9naWMuCisgKgorICoKKyAqLkRJQUdSQU0KKyAqMTogQ2FsY3VsYXRlIEwgZmllbGQgb2YgdGhlIE1CSUIsIGkuZS4gMSBmb3IgdGhlIFQtZmllbGQgKyB0aGUgY3VtdWxhdGl2ZSBsZW5ndGggb2YgdGhlIGZyYWdtZW50cy4KKyAqMjogVGhlIGZyZWUgc3BhY2UgaW4gdGhlIE1haWxCb3ggaXMgY2FsY3VsYXRlZCAoMmE6IGZyZWUgcGFydCBmcm9tIFdyaXRlIFB0ciB0byBSZWFkIFB0ciwgMmI6IGZyZWUgcGFydAorICogICB0dXJucyBvdXQgdG8gd3JhcCBhcm91bmQpIC4gSWYgdGhpcyBzcGFjZSBzdWZmaWNlcyB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIHdvcmRzIHJlZmxlY3RlZCBieSBsZW4gKFQtZmllbGQKKyAqICAgKyBWYWx1ZS1maWVsZCkgcGx1cyB0aGUgYWRkaXRpb25hbCBNYWlsQm94IEluZm8gTC1maWVsZCArIGEgdHJhaWxpbmcgMCB0byBhY3QgYXMgdGhlIEwtZmllbGQgb2YgYSB0cmFpbGluZworICogICBkdW1teSBvciBlbXB0eSBMVFYgcmVjb3JkLCB0aGVuIGEgTWFpbEJveCBJbmZvIGJsb2NrIGlzIGJ1aWxkIGluIHRoZSBNYWlsQm94IGNvbnNpc3Rpbmcgb2YKKyAqICAgICAtIHRoZSB2YWx1ZSBsZW4gaW4gdGhlIGZpcnN0IHdvcmQKKyAqICAgICAtIHR5cGUgaW4gdGhlIHNlY29uZCB3b3JkCisgKiAgICAgLSBhIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBmcmFnbWVudHMgaW4gdGhlIHNlY29uZCBhbmQgaGlnaGVyIHdvcmQKKyAqCisgKjQ6IFNpbmNlIHB1dF9pbmZvX21iKCkgY2FuIG1vcmUgb3IgbGVzcyBkaXJlY3RseSBiZSBjYWxsZWQgZnJvbSB0aGUgTVNGIGxldmVsLCB0aGUgSS9GIG11c3QgYmUgcm9idXN0CisgKiAgIGFnYWluc3Qgb3V0LW9mLXJhbmdlIHZhcmlhYmxlcy4gQXMgZmFpbHNhZmUgY29kaW5nLCB0aGUgTUIgdXBkYXRlIGlzIHNraXBwZWQgYnkgY2hhbmdpbmcgdGxlbiB0byAwIGlmCisgKiAgIGxlbiA9PSAwOyBUaGlzIHdpbGwgaW5kaXJlY3RseSBjYXVzZSBhbiBhc3NlcnQgYXMgcmVzdWx0IG9mIHRoZSB2aW9sYXRpb24gb2YgdGhlIG5leHQgaWYgY2xhdXNlLgorICo2OiBDaGVjayB3aGV0aGVyIHRoZSBmcmVlIHNwYWNlIGluIE1haWxCb3ggc3VmZmljZXMgKHRoaXMgY292ZXJzIHRoZSBjb21wbGV0ZSBhYnNlbmNlIG9mIHRoZSBNYWlsQm94KS4KKyAqICAgTm90ZSB0aGF0IGxlbiBpcyB1bnNpZ25lZCwgc28gZXZlbiBNU0YgSS9GIHZpb2xhdGlvbiB3b3JrcyBvdXQgTy5LLgorICogICBUaGUgJzInIGluIHRoZSBleHByZXNzaW9uICJsZW4rMiIgaXMgdXNlZCBiZWNhdXNlIDEgd29yZCBpcyBuZWVkZWQgZm9yIEwgaXRzZWxmIGFuZCAxIHdvcmQgaXMgbmVlZGVkCisgKiAgIGZvciB0aGUgemVyby1zZW50aW5lbAorICo4OiB1cGRhdGUgTWFpbEJveCBJbmZvIGxlbmd0aCByZXBvcnQgdG8gTVNGIHdpdGggIm9sZGVzdCIgTUIgSW5mbyBCbG9jayBzaXplLiBCZSBjYXJlZnVsIGhlcmUsIGlmIHlvdSBnZXQKKyAqICAgaGVyZSBiZWZvcmUgdGhlIE1haWxCb3ggaXMgcmVnaXN0ZXJlZCwgeW91IGNhbid0IHJlYWQgZnJvbSB0aGUgYnVmZmVyIGFkZHJlc3NlZCBieSBJRkJfTUJwIChpdCBpcyB0aGUKKyAqICAgTnVsbCBidWZmZXIpIHNvIGRvbid0IG1vdmUgdGhpcyBjb2RlIHRpbGwgdGhlIGVuZCBvZiB0aGlzIHJvdXRpbmUgYnV0IGtlZXAgaXQgd2hlcmUgdGhlcmUgaXMgZ2FydWFudGVlZAorICogICBhIGJ1ZmZlci4KKyAqCisgKi5OT1RJQ0UKKyAqICAgYm91bmRhcnkgdGVzdGluZyBkZXBlbmRzIG9uIHRoZSBmYWN0IHRoYXQgSUZCX01CU2l6ZSBpcyBndWFyYW50ZWVkIHRvIGJlIHplcm8gaWYgbm8gTWFpbEJveCBpcyBwcmVzZW50LAorICogICBhbmQgdG8gYSBsZXNzZXIgZGVncmVlLCB0aGF0IElGQl9NQldwID0gSUZCX01CUnAgPSAwCisgKgorICouRU5ERE9DICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogSENGX1NUQVRJQyBpbnQKIHB1dF9pbmZvX21iKCBJRkJQIGlmYnAsIENGR19NQl9JTkZPX1NUUkNUIEZBUiAqIGx0dnAgKQogewogCi1pbnQJCQlyYyA9IEhDRl9TVUNDRVNTOwotaGNmXzE2CQlpOwkJCQkJCS8vd29yayBjb3VudGVyCi1oY2ZfMTYJCSpkcDsJCQkJCS8vZGVzdGluYXRpb24gcG9pbnRlciAoaW4gTWFpbEJveCkKLXdjaV9yZWNvcmRwCXNwOwkJCQkJCS8vc291cmNlIHBvaW50ZXIKLWhjZl8xNgkJbGVuOwkJCQkJLy90b3RhbCBsZW5ndGggdG8gY29weSB0byBNYWlsQm94Ci1oY2ZfMTYJCXRsZW47CQkJCQkvL2ZyZWUgbGVuZ3RoL3dvcmtpbmcgbGVuZ3RoL29mZnNldCBpbiBXTVAgZnJhbWUKKwlpbnQgICAgICAgICByYyA9IEhDRl9TVUNDRVNTOworCWhjZl8xNiAgICAgIGk7ICAgICAgICAgICAgICAgICAgICAgIC8vd29yayBjb3VudGVyCisJaGNmXzE2ICAgICAgKmRwOyAgICAgICAgICAgICAgICAgICAgLy9kZXN0aW5hdGlvbiBwb2ludGVyIChpbiBNYWlsQm94KQorCXdjaV9yZWNvcmRwIHNwOyAgICAgICAgICAgICAgICAgICAgIC8vc291cmNlIHBvaW50ZXIKKwloY2ZfMTYgICAgICBsZW47ICAgICAgICAgICAgICAgICAgICAvL3RvdGFsIGxlbmd0aCB0byBjb3B5IHRvIE1haWxCb3gKKwloY2ZfMTYgICAgICB0bGVuOyAgICAgICAgICAgICAgICAgICAvL2ZyZWUgbGVuZ3RoL3dvcmtpbmcgbGVuZ3RoL29mZnNldCBpbiBXTVAgZnJhbWUKIAogCWlmICggaWZicC0+SUZCX01CcCA9PSBOVUxMICkgcmV0dXJuIHJjOyAgLy87P25vdCBzdWZmaWNpZW50Ci0JSENGQVNTRVJUKCBpZmJwLT5JRkJfTUJwICE9IE5VTEwsIDAgKQkJCQkJLy8hISFiZSBjYXJlZnVsLCBkb24ndCBnZXQgaW50byBhbiBlbmRsZXNzIHJlY3Vyc2lvbgotCUhDRkFTU0VSVCggaWZicC0+SUZCX01CU2l6ZSwgMCApCisJSENGQVNTRVJUKCBpZmJwLT5JRkJfTUJwICE9IE5VTEwsIDAgKTsgICAgICAgICAgICAgICAgICAgLy8hISFiZSBjYXJlZnVsLCBkb24ndCBnZXQgaW50byBhbiBlbmRsZXNzIHJlY3Vyc2lvbgorCUhDRkFTU0VSVCggaWZicC0+SUZCX01CU2l6ZSwgMCApOwogCi0JbGVuID0gMTsJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8qIDEgKi8KKwlsZW4gPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMSAqLwogCWZvciAoIGkgPSAwOyBpIDwgbHR2cC0+ZnJhZ19jbnQ7IGkrKyApIHsKIAkJbGVuICs9IGx0dnAtPmZyYWdfYnVmW2ldLmZyYWdfbGVuOwogCX0KIAlpZiAoIGlmYnAtPklGQl9NQlJwID4gaWZicC0+SUZCX01CV3AgKSB7Ci0JCXRsZW4gPSBpZmJwLT5JRkJfTUJScCAtIGlmYnAtPklGQl9NQldwOwkJCQkJCQkJCQkJCQkJCS8qIDJhKi8KKwkJdGxlbiA9IGlmYnAtPklGQl9NQlJwIC0gaWZicC0+SUZCX01CV3A7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMmEqLwogCX0gZWxzZSB7CiAJCWlmICggaWZicC0+SUZCX01CUnAgPT0gaWZicC0+SUZCX01CV3AgKSB7Ci0JCQlpZmJwLT5JRkJfTUJScCA9IGlmYnAtPklGQl9NQldwID0gMDsJLy8gb3B0aW1pemUgV3JhcHBpbmcKKwkJCWlmYnAtPklGQl9NQlJwID0gaWZicC0+SUZCX01CV3AgPSAwOyAgICAvLyBvcHRpbWl6ZSBXcmFwcGluZwogCQl9Ci0JCXRsZW4gPSBpZmJwLT5JRkJfTUJTaXplIC0gaWZicC0+SUZCX01CV3A7CQkJCQkJCQkJCQkJCQkvKiAyYiovCi0JCWlmICggKCB0bGVuIDw9IGxlbiArIDIgKSAmJiAoIGxlbiArIDIgPCBpZmJwLT5JRkJfTUJScCApICkgewkvL2lmIHRyYWlsaW5nIHNwYWNlIGlzIHRvbyBzbWFsbCBidXQKLQkJCQkJCQkJCQkJCQkJCQkJLy8JIGxlYWRpbmcgc3BhY2UgaXMgc3VmZmljaWVudGx5IGxhcmdlCi0JCQlpZmJwLT5JRkJfTUJwW2lmYnAtPklGQl9NQldwXSA9IDB4RkZGRjsJCQkJCS8vZmxhZyBkdW1teSBMVFYgdG8gZmlsbCB0aGUgdHJhaWxpbmcgc3BhY2UKLQkJCWlmYnAtPklGQl9NQldwID0gMDsJCQkJCQkJCQkJLy9yZXNldCBXcml0ZVBvaW50ZXIgdG8gYmVnaW4gb2YgTWFpbEJveAotCQkJdGxlbiA9IGlmYnAtPklGQl9NQlJwOwkJCQkJCQkJCS8vZ2V0IG5ldyBhdmFpbGFibGUgc3BhY2Ugc2l6ZQorCQl0bGVuID0gaWZicC0+SUZCX01CU2l6ZSAtIGlmYnAtPklGQl9NQldwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyYiovCisJCWlmICggKCB0bGVuIDw9IGxlbiArIDIgKSAmJiAoIGxlbiArIDIgPCBpZmJwLT5JRkJfTUJScCApICkgeyAgICAvL2lmIHRyYWlsaW5nIHNwYWNlIGlzIHRvbyBzbWFsbCBidXQKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBsZWFkaW5nIHNwYWNlIGlzIHN1ZmZpY2llbnRseSBsYXJnZQorCQkJaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJXcF0gPSAweEZGRkY7ICAgICAgICAgICAgICAgICAvL2ZsYWcgZHVtbXkgTFRWIHRvIGZpbGwgdGhlIHRyYWlsaW5nIHNwYWNlCisJCQlpZmJwLT5JRkJfTUJXcCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVzZXQgV3JpdGVQb2ludGVyIHRvIGJlZ2luIG9mIE1haWxCb3gKKwkJCXRsZW4gPSBpZmJwLT5JRkJfTUJScDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXQgbmV3IGF2YWlsYWJsZSBzcGFjZSBzaXplCiAJCX0KIAl9CiAJZHAgPSAmaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJXcF07CiAJaWYgKCBsZW4gPT0gMCApIHsKIAkJdGxlbiA9IDA7IC8vOz8gd2hhdCBpcyB0aGlzIGdvb2QgZm9yCiAJfQotCWlmICggbGVuICsgMiA+PSB0bGVuICl7CQkJCQkJCQkJCQkJCQkJCQkJCQkvKiA2ICovCisJaWYgKCBsZW4gKyAyID49IHRsZW4gKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDYgKi8KIAkJLy9EbyBOb3QgQVNTRVJULCB0aGlzIGlzIGEgbm9ybWFsIGNvbmRpdGlvbgotCQlJRl9UQUxMWSggaWZicC0+SUZCX0hDRl9UYWxsaWVzLk5vQnVmTUIrKzsgKSAvKk5PUCB0byBjb3ZlciBhZ2FpbnN0IGFuYWxvbWllcyB3aXRoIGVtcHR5IGNvbXBvdW5kKi87CisJCUlGX1RBTExZKCBpZmJwLT5JRkJfSENGX1RhbGxpZXMuTm9CdWZNQisrICk7CiAJCXJjID0gSENGX0VSUl9MRU47CiAJfSBlbHNlIHsKLQkJKmRwKysgPSBsZW47CQkJCQkJCQkJLy93cml0ZSBMZW4gKD0gc2l6ZSBvZiBUK1YgaW4gd29yZHMgdG8gTUJfSW5mbyBibG9jawotCQkqZHArKyA9IGx0dnAtPmJhc2VfdHlwOwkJCQkJCQkvL3dyaXRlIFR5cGUgdG8gTUJfSW5mbyBibG9jawotCQlpZmJwLT5JRkJfTUJXcCArPSBsZW4gKyAxOwkJCQkJCS8vdXBkYXRlIFdyaXRlUG9pbnRlciBvZiBNYWlsQm94Ci0JCWZvciAoIGkgPSAwOyBpIDwgbHR2cC0+ZnJhZ19jbnQ7IGkrKyApIHsJCQkJLy8gcHJvY2VzcyBlYWNoIG9mIHRoZSBmcmFnbWVudHMKKwkJKmRwKysgPSBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy93cml0ZSBMZW4gKD0gc2l6ZSBvZiBUK1YgaW4gd29yZHMgdG8gTUJfSW5mbyBibG9jaworCQkqZHArKyA9IGx0dnAtPmJhc2VfdHlwOyAgICAgICAgICAgICAgICAgICAgICAgICAvL3dyaXRlIFR5cGUgdG8gTUJfSW5mbyBibG9jaworCQlpZmJwLT5JRkJfTUJXcCArPSBsZW4gKyAxOyAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSBXcml0ZVBvaW50ZXIgb2YgTWFpbEJveAorCQlmb3IgKCBpID0gMDsgaSA8IGx0dnAtPmZyYWdfY250OyBpKysgKSB7ICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgZWFjaCBvZiB0aGUgZnJhZ21lbnRzCiAJCQlzcCA9IGx0dnAtPmZyYWdfYnVmW2ldLmZyYWdfYWRkcjsKIAkJCWxlbiA9IGx0dnAtPmZyYWdfYnVmW2ldLmZyYWdfbGVuOwogCQkJd2hpbGUgKCBsZW4tLSApICpkcCsrID0gKnNwKys7CiAJCX0KLQkJaWZicC0+SUZCX01CcFtpZmJwLT5JRkJfTUJXcF0gPSAwOwkJCQkvL3RvIGFzc3VyZSBnZXRfaW5mbyBmb3IgQ0ZHX01CX0lORk8gc3RvcHMKLQkJaWZicC0+SUZCX01CSW5mb0xlbiA9IGlmYnAtPklGQl9NQnBbaWZicC0+SUZCX01CUnBdOwkJCQkJCQkJCQkJLyogOCAqLworCQlpZmJwLT5JRkJfTUJwW2lmYnAtPklGQl9NQldwXSA9IDA7ICAgICAgICAgICAgICAvL3RvIGFzc3VyZSBnZXRfaW5mbyBmb3IgQ0ZHX01CX0lORk8gc3RvcHMKKwkJaWZicC0+SUZCX01CSW5mb0xlbiA9IGlmYnAtPklGQl9NQnBbaWZicC0+SUZCX01CUnBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOCAqLwogCX0KIAlyZXR1cm4gcmM7CiB9IC8vIHB1dF9pbmZvX21iCiAKLSNlbmRpZiAvLyBIQ0ZfRVhUX01CCi0jZW5kaWYgLy8gSENGX0RMX09OTFkKLQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qCi0qLlNVQk1PRFVMRQkJaW50IHNldHVwX2JhcCggSUZCUCBpZmJwLCBoY2ZfMTYgZmlkLCBpbnQgb2Zmc2V0LCBpbnQgdHlwZSApCi0qLlBVUlBPU0UJCXNldCB1cCBkYXRhIGFjY2VzcyB0byBOSUMgUkFNIHZpYSBCQVBfMS4KLSoKLSouQVJHVU1FTlRTCi0qCWlmYnAJCQlhZGRyZXNzIG9mIEkvRiBCbG9jawotKglmaWQJCQkJRklEL1JJRAotKglvZmZzZXQJCQkhIWV2ZW4hISBvZmZzZXQgaW4gRklEL1JJRAotKgl0eXBlCQkJSU9fSU4sIElPX09VVAotKgotKi5SRVRVUk5TCi0qCUhDRl9TVUNDRVNTCQkJCQlPLksKLSoJSENGX0VSUl9OT19OSUMJCQkJY2FyZCBpcyByZW1vdmVkCi0qCUhDRl9FUlJfREVGVU5DVF9USU1FX09VVAlGYXRhbCBtYWxmdW5jdGlvbiBkZXRlY3RlZAotKglIQ0ZfRVJSX0RFRlVOQ1RfLi4uLi4JCWlmIGFuZCBvbmx5IGlmIElGQl9EZWZ1bmN0U3RhdCA8PiAwCi0qCi0qLkRFU0NSSVBUSU9OCi0qCi0qIEEgbm9uLXplcm8gcmV0dXJuIHN0YXR1cyBpbmRpY2F0ZXM6Ci0qIC0gdGhlIE5JQyBpcyBjb25zaWRlcmVkIG5vbm9wZXJhdGlvbmFsLCBlLmcuIGR1ZSB0byBhIHRpbWUtb3V0IG9mIHNvbWUgSGVybWVzIGFjdGl2aXR5IGluIHRoZSBwYXN0Ci0qIC0gQkFQXzEgY291bGQgbm90IHByb3Blcmx5IGJlIGluaXRpYWxpemVkCi0qIC0gdGhlIGNhcmQgaXMgcmVtb3ZlZCBiZWZvcmUgY29tcGxldGlvbiBvZiB0aGUgZGF0YSB0cmFuc2ZlcgotKiBJbiBhbGwgb3RoZXIgY2FzZXMsIGEgemVybyBpcyByZXR1cm5lZC4KLSogQkFQIEluaXRpYWxpemF0aW9uIGZhaWx1cmUgaW5kaWNhdGVzIGFuIEgvVyBlcnJvciB3aGljaCBpcyB2ZXJ5IGxpa2VseSB0byBzaWduYWwgY29tcGxldGUgSC9XIGZhaWx1cmUuCi0qIE9uY2UgYSBCQVAgSW5pdGlhbGl6YXRpb24gZmFpbHVyZSBoYXMgb2NjdXJyZWQgYWxsIHN1YnNlcXVlbnQgaW50ZXJhY3Rpb25zIHdpdGggdGhlIEhlcm1lcyB3aWxsIHJldHVybiBhCi0qICJkZWZ1bmN0IiBzdGF0dXMgdGlsbCB0aGUgSGVybWVzIGlzIHJlLWluaXRpYWxpemVkIGJ5IG1lYW5zIG9mIGFuIGhjZl9jb25uZWN0LgotKgotKiBBIEJBUCBpcyBhIHNldCBvZiByZWdpc3RlcnMgKE9mZnNldCwgU2VsZWN0IGFuZCBEYXRhKSBvZmZlcmluZyByZWFkL3dyaXRlIGFjY2VzcyB0byBhIHBhcnRpY3VsYXIgRklEIG9yCi0qIFJJRC4gVGhpcyBhY2Nlc3MgaXMgYmFzZWQgb24gYSBhdXRvLWluY3JlbWVudCBmZWF0dXJlLgotKiBUaGVyZSBhcmUgdHdvIEJBUHMgYnV0IHRoZXNlIGRheXMgdGhlIEhDRiB1c2VzIG9ubHkgQkFQXzEgYW5kIGxlYXZlcyBCQVBfMCB0byB0aGUgUENJIEJ1c21hc3RlcmluZyBIL1cuCi0qCi0qIFRoZSBCQVAtbWVjaGFuaXNtIGlzIGJhc2VkIG9uIHRoZSBCdXN5IGJpdCBpbiB0aGUgT2Zmc2V0IHJlZ2lzdGVyIChzZWUgdGhlIEhlcm1lcyBkZWZpbml0aW9uKS4gVGhlIHdhaXRpbmcKLSogZm9yIEJ1c3kgbXVzdCBvY2N1ciBiZXR3ZWVuIHdyaXRpbmcgdGhlIE9mZnNldCByZWdpc3RlciBhbmQgYWNjZXNzaW5nIHRoZSBEYXRhIHJlZ2lzdGVyLiBUaGUKLSogaW1wbGVtZW50YXRpb24gdG8gd2FpdCBmb3IgdGhlIEJ1c3kgYml0IGRyb3AgYWZ0ZXIgZWFjaCB3cml0ZSB0byB0aGUgT2Zmc2V0IHJlZ2lzdGVyLCBpbXBsaWVzIHRoYXQgdGhlCi0qIHJlcXVpcmVtZW50IHRoYXQgdGhlIEJ1c3kgYml0IGlzIGxvdyAgYmVmb3JlIHRoZSBTZWxlY3QgcmVnaXN0ZXIgaXMgd3JpdHRlbiwgaXMgYXV0b21hdGljYWxseSBtZXQuCi0qIEJBUC1zZXR1cCBtYXkgYmUgdGltZSBjb25zdW1pbmcgKGUuZy4gMzgwIHVzZWMgZm9yIGxhcmdlIG9mZnNldHMgb2NjdXJzIGZyZXF1ZW50bHkpLiBUaGUgd2FpdCBmb3IgQnVzeSBiaXQKLSogZHJvcCBpcyBwcm90ZWN0ZWQgYnkgYSBsb29wIGNvdW50ZXIsIHdoaWNoIGlzIGluaXRpYWxpemVkIHdpdGggSUZCX1RpY2tJbmksIHdoaWNoIGlzIGNhbGlicmF0ZWQgaW4gaW5pdC4KLSoKLSogVGhlIE5JQyBJL0YgaXMgb3B0aW1pemVkIGZvciB3b3JkIHRyYW5zZmVyIGFuZCBjYW4gb25seSBoYW5kbGUgd29yZCB0cmFuc2ZlciBhdCBhIHdvcmQgYm91bmRhcnkgaW4gTklDCi0qIFJBTS4gVGhlIGludGVuZGVkIHNvbHV0aW9uIGZvciB0cmFuc2ZlciBvZiBhIHNpbmdsZSBieXRlIGhhcyBtdWx0aXBsZSBIL1cgZmxhd3MuIFRoZXJlIGhhdmUgYmVlbiBkaWZmZXJlbnQKLSogUy9XIFdvcmthcm91bmQgc3RyYXRlZ2llcy4gUklEIGFjY2VzcyBpcyBoY2ZfMTYgYmFzZWQgYnkgIm5hdHVyZSIsIHNvIG5vIGJ5dGUgYWNjZXNzIHByb2JsZW1zLiAgRm9yIFR4L1J4Ci0qIEZJRCBhY2Nlc3MsICB0aGUgYnl0ZSBsb2dpYyBiZWNhbWUgb2Jzb2xldGUgYnkgYWJzb3JiaW5nIGl0IGluIHRoZSBkb3VibGUgd29yZCBvcmllbnRlZCBuYXR1cmUgb2YgdGhlIE1JQwotKiBmZWF0dXJlLgotKgotKgotKi5ESUFHUkFNCi0qCi0qMjoJdGhlIHRlc3Qgb24gcmMgY2hlY2tzIHdoZXRoZXIgdGhlIEhDRiB3ZW50IGludG8gImRlZnVuY3QiIG1vZGUgKCBlLmcuIEJBUCBpbml0aWFsaXphdGlvbiBvciBhIGNhbGwgdG8KLSoJY21kX3dhaXQgZGlkIGV2ZXIgZmFpbCkuCi0qNDoJdGhlIHNlbGVjdCByZWdpc3RlciBhbmQgb2Zmc2V0IHJlZ2lzdGVyIGFyZSBzZXQKLSoJdGhlIG9mZnNldCByZWdpc3RlciBpcyBtb25pdG9yZWQgdGlsbCBhIHN1Y2Nlc3NmdWwgY29uZGl0aW9uIChubyBidXN5IGJpdCkgaXMgZGV0ZWN0ZWQgb3IgdGlsbCB0aGUKLSoJKGNhbGlicmF0ZWQpIHByb3RlY3Rpb24gY291bnRlciBleHBpcmVzCi0qCUlmIHRoZSBjb3VudGVyIGV4cGlyZXMsIHRoaXMgaXMgcmVmbGVjdGVkIGluIElGQl9EZWZ1bmN0U3RhdCwgc28gYWxsIHN1YnNlcXVlbnQgY2FsbHMgdG8gc2V0dXBfYmFwIGZhaWwKLSoJaW1tZWRpYXRlbHkgKCBzZWUgMikKLSo2Oglpbml0aWFsaXphdGlvbiBvZiB0aGUgY2FycnkgYXMgdXNlZCBieSBwZXQvZ2V0X2ZyYWcKLSo4OglIUkVHX09GRlNFVF9FUlIgaXMgaWdub3JlZCBhcyBlcnJvciBiZWNhdXNlOgotKgkgYTogdGhlIEhlcm1lcyBpcyByb2J1c3QgYWdhaW5zdCBpdAotKgkgYjogaXQgaXMgbm90IGtub3duIHdoYXQgY2F1c2VzIGl0IChwcm9iYWJseSBhIGJ1ZyksIGhlbmNlIG5vIHN0cmF0ZWd5IGNhbiBiZSBzcGVjaWZpZWQgd2hpY2ggbGV2ZWwgaXMKLSoJCXRvIGhhbmRsZSB0aGlzIGVycm9yIGluIHdoaWNoIHdheS4gSW4gdGhlIHBhc3QsIGl0IGNvdWxkIGJlIGluZHVjZWQgYnkgdGhlIE1TRiBsZXZlbCwgZS5nLiBieSBjYWxsaW5nCi0qCQloY2ZfcmN2X21zZyB3aGlsZSB0aGVyZSB3YXMgbm8gUngtRklEIGF2YWlsYWJsZS4gU2luY2UgdGhpcyBpcyBhbiBNU0YtZXJyb3Igd2hpY2ggaXMgY2F1Z2h0IGJ5IEFTU0VSVCwKLSoJCXRoZXJlIGlzIG5vIHJ1bi10aW1lIGFjdGlvbiByZXF1aXJlZCBieSB0aGUgSENGLgotKglMdW1waW5nIHRoZSBPZmZzZXQgZXJyb3IgaW4gd2l0aCB0aGUgQnVzeSBiaXQgZXJyb3IsIGFzIGhhcyBiZWVuIGRvbmUgaW4gdGhlIHBhc3QgdHVybnMgb3V0IHRvIGJlIGEKLSoJZGlzYXN0ZXIgb3IgYSBsaWZlIHNhdmVyLCBqdXN0IGRlcGVuZGluZyBvbiB3aGF0IHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgaXMuIFNpbmNlIG5vIHByZWRpY3Rpb24gY2FuIGJlCi0qCWRvbmUgYWJvdXQgdGhlIGZ1dHVyZSwgaXQgaXMgImZlbHQiIHRvIGJlIHRoZSBiZXN0IHN0cmF0ZWd5IHRvIGlnbm9yZSB0aGlzIGVycm9yLiBPbmUgZGF5IHRoZSBjb2RlIHdhcwotKglhY2NvbXBhbmllZCBieSB0aGUgZm9sbG93aW5nIGNvbW1lbnQ6Ci0qCS8vCWlnbm9yZSBIUkVHX09GRlNFVF9FUlIsIHNvbWVvbmUsIHN1cHBvc2VkbHkgdGhlIE1TRiBwcm9ncmFtbWVyIDspIG1hZGUgYSBidWcuIFNpbmNlIHdlIGRvbid0IGtub3cKLSoJLy8Jd2hhdCBpcyBnb2luZyBvbiwgd2UgbWlnaHQgYXMgd2VsbCBnbyBvbiAtIHVuZGVyIG1hbmFnZW1lbnQgcHJlc3N1cmUgLSBieSBpZ25vcmluZyBpdAotKgotKi5FTkRET0MgICAgICAgICAgICAgICAgICAgICAgICAgIEVORCBET0NVTUVOVEFUSU9OCi0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgKgorICouU1VCTU9EVUxFICAgICBpbnQgc2V0dXBfYmFwKCBJRkJQIGlmYnAsIGhjZl8xNiBmaWQsIGludCBvZmZzZXQsIGludCB0eXBlICkKKyAqLlBVUlBPU0UgICAgICAgc2V0IHVwIGRhdGEgYWNjZXNzIHRvIE5JQyBSQU0gdmlhIEJBUF8xLgorICoKKyAqLkFSR1VNRU5UUworICogICBpZmJwICAgICAgICAgICAgYWRkcmVzcyBvZiBJL0YgQmxvY2sKKyAqICAgZmlkICAgICAgICAgICAgIEZJRC9SSUQKKyAqICAgb2Zmc2V0ICAgICAgICAgICEhZXZlbiEhIG9mZnNldCBpbiBGSUQvUklECisgKiAgIHR5cGUgICAgICAgICAgICBJT19JTiwgSU9fT1VUCisgKgorICouUkVUVVJOUworICogICBIQ0ZfU1VDQ0VTUyAgICAgICAgICAgICAgICAgTy5LCisgKiAgIEhDRl9FUlJfTk9fTklDICAgICAgICAgICAgICBjYXJkIGlzIHJlbW92ZWQKKyAqICAgSENGX0VSUl9ERUZVTkNUX1RJTUVfT1VUICAgIEZhdGFsIG1hbGZ1bmN0aW9uIGRldGVjdGVkCisgKiAgIEhDRl9FUlJfREVGVU5DVF8uLi4uLiAgICAgICBpZiBhbmQgb25seSBpZiBJRkJfRGVmdW5jdFN0YXQgPD4gMAorICoKKyAqLkRFU0NSSVBUSU9OCisgKgorICogQSBub24temVybyByZXR1cm4gc3RhdHVzIGluZGljYXRlczoKKyAqIC0gdGhlIE5JQyBpcyBjb25zaWRlcmVkIG5vbm9wZXJhdGlvbmFsLCBlLmcuIGR1ZSB0byBhIHRpbWUtb3V0IG9mIHNvbWUgSGVybWVzIGFjdGl2aXR5IGluIHRoZSBwYXN0CisgKiAtIEJBUF8xIGNvdWxkIG5vdCBwcm9wZXJseSBiZSBpbml0aWFsaXplZAorICogLSB0aGUgY2FyZCBpcyByZW1vdmVkIGJlZm9yZSBjb21wbGV0aW9uIG9mIHRoZSBkYXRhIHRyYW5zZmVyCisgKiBJbiBhbGwgb3RoZXIgY2FzZXMsIGEgemVybyBpcyByZXR1cm5lZC4KKyAqIEJBUCBJbml0aWFsaXphdGlvbiBmYWlsdXJlIGluZGljYXRlcyBhbiBIL1cgZXJyb3Igd2hpY2ggaXMgdmVyeSBsaWtlbHkgdG8gc2lnbmFsIGNvbXBsZXRlIEgvVyBmYWlsdXJlLgorICogT25jZSBhIEJBUCBJbml0aWFsaXphdGlvbiBmYWlsdXJlIGhhcyBvY2N1cnJlZCBhbGwgc3Vic2VxdWVudCBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgSGVybWVzIHdpbGwgcmV0dXJuIGEKKyAqICJkZWZ1bmN0IiBzdGF0dXMgdGlsbCB0aGUgSGVybWVzIGlzIHJlLWluaXRpYWxpemVkIGJ5IG1lYW5zIG9mIGFuIGhjZl9jb25uZWN0LgorICoKKyAqIEEgQkFQIGlzIGEgc2V0IG9mIHJlZ2lzdGVycyAoT2Zmc2V0LCBTZWxlY3QgYW5kIERhdGEpIG9mZmVyaW5nIHJlYWQvd3JpdGUgYWNjZXNzIHRvIGEgcGFydGljdWxhciBGSUQgb3IKKyAqIFJJRC4gVGhpcyBhY2Nlc3MgaXMgYmFzZWQgb24gYSBhdXRvLWluY3JlbWVudCBmZWF0dXJlLgorICogVGhlcmUgYXJlIHR3byBCQVBzIGJ1dCB0aGVzZSBkYXlzIHRoZSBIQ0YgdXNlcyBvbmx5IEJBUF8xIGFuZCBsZWF2ZXMgQkFQXzAgdG8gdGhlIFBDSSBCdXNtYXN0ZXJpbmcgSC9XLgorICoKKyAqIFRoZSBCQVAtbWVjaGFuaXNtIGlzIGJhc2VkIG9uIHRoZSBCdXN5IGJpdCBpbiB0aGUgT2Zmc2V0IHJlZ2lzdGVyIChzZWUgdGhlIEhlcm1lcyBkZWZpbml0aW9uKS4gVGhlIHdhaXRpbmcKKyAqIGZvciBCdXN5IG11c3Qgb2NjdXIgYmV0d2VlbiB3cml0aW5nIHRoZSBPZmZzZXQgcmVnaXN0ZXIgYW5kIGFjY2Vzc2luZyB0aGUgRGF0YSByZWdpc3Rlci4gVGhlCisgKiBpbXBsZW1lbnRhdGlvbiB0byB3YWl0IGZvciB0aGUgQnVzeSBiaXQgZHJvcCBhZnRlciBlYWNoIHdyaXRlIHRvIHRoZSBPZmZzZXQgcmVnaXN0ZXIsIGltcGxpZXMgdGhhdCB0aGUKKyAqIHJlcXVpcmVtZW50IHRoYXQgdGhlIEJ1c3kgYml0IGlzIGxvdyAgYmVmb3JlIHRoZSBTZWxlY3QgcmVnaXN0ZXIgaXMgd3JpdHRlbiwgaXMgYXV0b21hdGljYWxseSBtZXQuCisgKiBCQVAtc2V0dXAgbWF5IGJlIHRpbWUgY29uc3VtaW5nIChlLmcuIDM4MCB1c2VjIGZvciBsYXJnZSBvZmZzZXRzIG9jY3VycyBmcmVxdWVudGx5KS4gVGhlIHdhaXQgZm9yIEJ1c3kgYml0CisgKiBkcm9wIGlzIHByb3RlY3RlZCBieSBhIGxvb3AgY291bnRlciwgd2hpY2ggaXMgaW5pdGlhbGl6ZWQgd2l0aCBJRkJfVGlja0luaSwgd2hpY2ggaXMgY2FsaWJyYXRlZCBpbiBpbml0LgorICoKKyAqIFRoZSBOSUMgSS9GIGlzIG9wdGltaXplZCBmb3Igd29yZCB0cmFuc2ZlciBhbmQgY2FuIG9ubHkgaGFuZGxlIHdvcmQgdHJhbnNmZXIgYXQgYSB3b3JkIGJvdW5kYXJ5IGluIE5JQworICogUkFNLiBUaGUgaW50ZW5kZWQgc29sdXRpb24gZm9yIHRyYW5zZmVyIG9mIGEgc2luZ2xlIGJ5dGUgaGFzIG11bHRpcGxlIEgvVyBmbGF3cy4gVGhlcmUgaGF2ZSBiZWVuIGRpZmZlcmVudAorICogUy9XIFdvcmthcm91bmQgc3RyYXRlZ2llcy4gUklEIGFjY2VzcyBpcyBoY2ZfMTYgYmFzZWQgYnkgIm5hdHVyZSIsIHNvIG5vIGJ5dGUgYWNjZXNzIHByb2JsZW1zLiAgRm9yIFR4L1J4CisgKiBGSUQgYWNjZXNzLCAgdGhlIGJ5dGUgbG9naWMgYmVjYW1lIG9ic29sZXRlIGJ5IGFic29yYmluZyBpdCBpbiB0aGUgZG91YmxlIHdvcmQgb3JpZW50ZWQgbmF0dXJlIG9mIHRoZSBNSUMKKyAqIGZlYXR1cmUuCisgKgorICoKKyAqLkRJQUdSQU0KKyAqCisgKjI6IHRoZSB0ZXN0IG9uIHJjIGNoZWNrcyB3aGV0aGVyIHRoZSBIQ0Ygd2VudCBpbnRvICJkZWZ1bmN0IiBtb2RlICggZS5nLiBCQVAgaW5pdGlhbGl6YXRpb24gb3IgYSBjYWxsIHRvCisgKiAgIGNtZF93YWl0IGRpZCBldmVyIGZhaWwpLgorICo0OiB0aGUgc2VsZWN0IHJlZ2lzdGVyIGFuZCBvZmZzZXQgcmVnaXN0ZXIgYXJlIHNldAorICogICB0aGUgb2Zmc2V0IHJlZ2lzdGVyIGlzIG1vbml0b3JlZCB0aWxsIGEgc3VjY2Vzc2Z1bCBjb25kaXRpb24gKG5vIGJ1c3kgYml0KSBpcyBkZXRlY3RlZCBvciB0aWxsIHRoZQorICogICAoY2FsaWJyYXRlZCkgcHJvdGVjdGlvbiBjb3VudGVyIGV4cGlyZXMKKyAqICAgSWYgdGhlIGNvdW50ZXIgZXhwaXJlcywgdGhpcyBpcyByZWZsZWN0ZWQgaW4gSUZCX0RlZnVuY3RTdGF0LCBzbyBhbGwgc3Vic2VxdWVudCBjYWxscyB0byBzZXR1cF9iYXAgZmFpbAorICogICBpbW1lZGlhdGVseSAoIHNlZSAyKQorICo2OiBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2FycnkgYXMgdXNlZCBieSBwZXQvZ2V0X2ZyYWcKKyAqODogSFJFR19PRkZTRVRfRVJSIGlzIGlnbm9yZWQgYXMgZXJyb3IgYmVjYXVzZToKKyAqICAgIGE6IHRoZSBIZXJtZXMgaXMgcm9idXN0IGFnYWluc3QgaXQKKyAqICAgIGI6IGl0IGlzIG5vdCBrbm93biB3aGF0IGNhdXNlcyBpdCAocHJvYmFibHkgYSBidWcpLCBoZW5jZSBubyBzdHJhdGVneSBjYW4gYmUgc3BlY2lmaWVkIHdoaWNoIGxldmVsIGlzCisgKiAgICAgICB0byBoYW5kbGUgdGhpcyBlcnJvciBpbiB3aGljaCB3YXkuIEluIHRoZSBwYXN0LCBpdCBjb3VsZCBiZSBpbmR1Y2VkIGJ5IHRoZSBNU0YgbGV2ZWwsIGUuZy4gYnkgY2FsbGluZworICogICAgICAgaGNmX3Jjdl9tc2cgd2hpbGUgdGhlcmUgd2FzIG5vIFJ4LUZJRCBhdmFpbGFibGUuIFNpbmNlIHRoaXMgaXMgYW4gTVNGLWVycm9yIHdoaWNoIGlzIGNhdWdodCBieSBBU1NFUlQsCisgKiAgICAgICB0aGVyZSBpcyBubyBydW4tdGltZSBhY3Rpb24gcmVxdWlyZWQgYnkgdGhlIEhDRi4KKyAqICAgTHVtcGluZyB0aGUgT2Zmc2V0IGVycm9yIGluIHdpdGggdGhlIEJ1c3kgYml0IGVycm9yLCBhcyBoYXMgYmVlbiBkb25lIGluIHRoZSBwYXN0IHR1cm5zIG91dCB0byBiZSBhCisgKiAgIGRpc2FzdGVyIG9yIGEgbGlmZSBzYXZlciwganVzdCBkZXBlbmRpbmcgb24gd2hhdCB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIGlzLiBTaW5jZSBubyBwcmVkaWN0aW9uIGNhbiBiZQorICogICBkb25lIGFib3V0IHRoZSBmdXR1cmUsIGl0IGlzICJmZWx0IiB0byBiZSB0aGUgYmVzdCBzdHJhdGVneSB0byBpZ25vcmUgdGhpcyBlcnJvci4gT25lIGRheSB0aGUgY29kZSB3YXMKKyAqICAgYWNjb21wYW5pZWQgYnkgdGhlIGZvbGxvd2luZyBjb21tZW50OgorICogICAvLyAgaWdub3JlIEhSRUdfT0ZGU0VUX0VSUiwgc29tZW9uZSwgc3VwcG9zZWRseSB0aGUgTVNGIHByb2dyYW1tZXIgOykgbWFkZSBhIGJ1Zy4gU2luY2Ugd2UgZG9uJ3Qga25vdworICogICAvLyAgd2hhdCBpcyBnb2luZyBvbiwgd2UgbWlnaHQgYXMgd2VsbCBnbyBvbiAtIHVuZGVyIG1hbmFnZW1lbnQgcHJlc3N1cmUgLSBieSBpZ25vcmluZyBpdAorICoKKyAqLkVORERPQyAgICAgICAgICAgICAgICAgICAgICAgICAgRU5EIERPQ1VNRU5UQVRJT04KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogSENGX1NUQVRJQyBpbnQKIHNldHVwX2JhcCggSUZCUCBpZmJwLCBoY2ZfMTYgZmlkLCBpbnQgb2Zmc2V0LCBpbnQgdHlwZSApCiB7Ci1QUk9UX0NOVF9JTkkKLWludAlyYzsKKwlQUk9UX0NOVF9JTkk7CisJaW50IHJjOwogCiAJSENGVFJBQ0UoIGlmYnAsIEhDRl9UUkFDRV9TVFJJTyApOwogCXJjID0gaWZicC0+SUZCX0RlZnVuY3RTdGF0OwotCWlmIChyYyA9PSBIQ0ZfU1VDQ0VTUykgewkJCQkJCQkJCQkvKjIqLwotCQlPUFcoIEhSRUdfU0VMRUNUXzEsIGZpZCApOwkJCQkJCQkJCQkJCQkJCQkvKjQqLworCWlmIChyYyA9PSBIQ0ZfU1VDQ0VTUykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKjIqLworCQlPUFcoIEhSRUdfU0VMRUNUXzEsIGZpZCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyo0Ki8KIAkJT1BXKCBIUkVHX09GRlNFVF8xLCBvZmZzZXQgKTsKIAkJaWYgKCB0eXBlID09IElPX0lOICkgewogCQkJaWZicC0+SUZCX0NhcnJ5SW4gPSAwOwogCQl9CiAJCWVsc2UgaWZicC0+SUZCX0NhcnJ5T3V0ID0gMDsKIAkJSENGX1dBSVRfV0hJTEUoIElQVyggSFJFR19PRkZTRVRfMSkgJiBIQ01EX0JVU1kgKTsKLQkJSENGQVNTRVJUKCAhKCBJUFcoIEhSRUdfT0ZGU0VUXzEpICYgSFJFR19PRkZTRVRfRVJSICksIE1FUkdFXzIoIGZpZCwgb2Zmc2V0ICkgKQkJCS8qOCovCisJCUhDRkFTU0VSVCggISggSVBXKCBIUkVHX09GRlNFVF8xKSAmIEhSRUdfT0ZGU0VUX0VSUiApLCBNRVJHRV8yKCBmaWQsIG9mZnNldCApICk7ICAgICAgICAgLyo4Ki8KIAkJaWYgKCBwcm90X2NudCA9PSAwICkgewotCQkJSENGQVNTRVJUKCBET19BU1NFUlQsIE1FUkdFXzIoIGZpZCwgb2Zmc2V0ICkgKQorCQkJSENGQVNTRVJUKCBET19BU1NFUlQsIE1FUkdFXzIoIGZpZCwgb2Zmc2V0ICkgKTsKIAkJCXJjID0gaWZicC0+SUZCX0RlZnVuY3RTdGF0ID0gSENGX0VSUl9ERUZVTkNUX1RJTUVfT1VUOwogCQkJaWZicC0+SUZCX0NhcmRTdGF0IHw9IENBUkRfU1RBVF9ERUZVTkNUOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9oY2YuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZi5oCmluZGV4IDJjZDU3MzkuLjAwMDk5NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZi5oCkBAIC0zMDEsMTMgKzMwMSwxMSBAQAogI2lmIChIQ0ZfRVhUKSAmIEhDRl9FWFRfSU5UX1RJQ0sKICAgaW50CQkJSUZCX1RpY2tDbnQ7CQkJLy8gSGVybWVzIFRpbWVyIFRpY2sgQ291bnRlcgogI2VuZGlmIC8vIEhDRl9FWFRfSU5UX1RJQ0sKLSNpZiAoSENGX0VYVCkgJiBIQ0ZfRVhUX01CCiAgIGhjZl8xNiAJICAgKklGQl9NQnA7CQkJCS8vIHBvaW50ZXIgdG8gdGhlIE1haWxCb3gKICAgaGNmXzE2CQlJRkJfTUJTaXplOwkJCQkvLyBzaXplIG9mIHRoZSBNYWlsQm94CiAgIGhjZl8xNgkJSUZCX01CV3A7CQkJCS8vIHplcm8tYmFzZWQgd3JpdGUgaW5kZXggaW50byB0aGUgTWFpbEJveAogICBoY2ZfMTYJCUlGQl9NQlJwOwkJCQkvLyB6ZXJvLWJhc2VkIHJlYWQgIGluZGV4IGludG8gdGhlIE1haWxCb3gKICAgaGNmXzE2CQlJRkJfTUJJbmZvTGVuOwkJCS8vIGNvbnRlbnRzIG9mIEwtZmllbGQgb2YgdGhlIG9sZGVzdCBhdmFpbGFibGUgTWFpbEJveEluZm9CbG9jawotI2VuZGlmIC8vIEhDRl9FWFRfTUIKICNpZiAoSENGX1RZUEUpICYgSENGX1RZUEVfV1BBCiAgIGhjZl8xNgkJSUZCX01JQ1R4Q250bDsJCQkvLyBNSUMgYml0IGFuZCBLZXkgaW5kZXggaW4gVHhDb250cm9sIGZpZWxkIG9mIFR4RlMKICAgaGNmXzMyCQlJRkJfTUlDVHhLZXlbMl07CQkvLyBjYWxjdWxhdGluZyBrZXkKQEAgLTMzNSwxMiArMzMzLDcgQEAKICAgIENGR19GV19QUklOVEZfQlVGRkVSX0xPQ0FUSU9OX1NUUkNUIElGQl9Gd1BmQnVmZjsKICNlbmRpZiAvLyBIQ0ZfQVNTRVJUX1BSSU5URgogI2VuZGlmIC8vIEhDRl9BU1NFUlQKLSNpZiAhIGRlZmluZWQgSENGX0lOVF9PRkYKICAgaGNmXzE2IHZvbGF0aWxlIElGQl9JbnRPZmZDbnQ7CQkvLyAweEZGRkYgYmFzZWQgSENGX0FDVF9JTlRfT0ZGIG5lc3RpbmcgY291bnRlciwgRGVlcFNsZWVwIGZsYWcKLSNlbmRpZiAvLyBIQ0ZfSU5UX09GRgotI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9DQ1gKLSAgaGNmXzE2ICAgICAgICAgSUZCX0NLSVBTdGF0OwkJCS8vIENLSVAgU3RhdHVzIGZsYWcKLSNlbmRpZiAvLyBIQ0ZfVFlQRV9DQ1gKICNpZiAoSENGX1RBTExJRVMpICYgKCBIQ0ZfVEFMTElFU19OSUMgfCBIQ0ZfVEFMTElFU19IQ0YgKQkvL0hlcm1lcyBhbmQvb3IgSENGIHRhbGx5IHN1cHBvcnQKICAgaGNmXzMyCQlJRkJfU2lsbHlfeW91X3Nob3VsZF9hbGlnbjsJLy87PwogICBoY2ZfMTYJCUlGQl9UYWxseUxlbjsJCQkvLyBUYWxseSBsZW5ndGggKHRvIGJ1aWxkIGFuIExUVikKQEAgLTM4Miw5ICszNzUsNiBAQAogCiBFWFRFUk5fQyBpbnQJCSBoY2ZfYWN0aW9uCQkJKElGQlAgaWZicCwgaGNmXzE2IGNtZCApOwogRVhURVJOX0MgaW50CQkgaGNmX2Nvbm5lY3QJCShJRkJQIGlmYnAsIGhjZl9pbyBpb19iYXNlICk7Ci0jaWYgKEhDRl9FTkNBUCkgJiBIQ0ZfRU5DX1NVUAotRVhURVJOX0MgaGNmXzggCQkgaGNmX2VuY2FwCQkJKHdjaV9idWZwIHR5cGUgKTsKLSNlbmRpZiAvLyBIQ0ZfRU5DX1NVUAogRVhURVJOX0MgaW50CQkgaGNmX2dldF9pbmZvCQkoSUZCUCBpZmJwLCBMVFZQIGx0dnAgKTsKIEVYVEVSTl9DIGludAkJIGhjZl9zZXJ2aWNlX25pYwkoSUZCUCBpZmJwLCB3Y2lfYnVmcCBidWZwLCB1bnNpZ25lZCBpbnQgbGVuICk7CiBFWFRFUk5fQyBpbnQJCSBoY2ZfY250bAkJCShJRkJQIGlmYnAsIGhjZl8xNiBjbWQgKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZmNmZy5oIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvaGNmY2ZnLmgKaW5kZXggODM0NzViMS4uNzU0NWJjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvaGNmY2ZnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvaGNmY2ZnLmgKQEAgLTMwMCw0OTMgKzMwMCw2IEBACiAjZGVmaW5lIEhDRl9UQUxMSUVTX0hDRgkJCTB4MDAwMgkvLyBIQ0YgVGFsbGllcyBhY2N1bXVsYXRlZCBpbiBJRkIKICNkZWZpbmUgSENGX1RBTExJRVNfUkVTRVQJCTB4ODAwMAkvLyBUYWxsaWVzIGluIElGQiBhcmUgcmVzZXQgd2hlbiByZXBvcnRlZCB2aWEgaGNmX2dldF9pbmZvCiAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE0gSSBOIEkgUCBPIFIgVCAgICBOIEQgSSBTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgZGVmaW5lZCBXVkxBTl80MSB8fCBkZWZpbmVkIFdWTEFOXzQ4IHx8IGRlZmluZWQgV1ZMQU5fNTIgfHwgZGVmaW5lZCBfV0lOMzJfV0NFCi0KLSNpZm5kZWYgV1ZMQU5fNDYKLSNkZWZpbmUgSENGX0VYVCAgIChIQ0ZfRVhUX0lORk9fTE9HIHwgSENGX0VYVF9NQiB8IEhDRl9FWFRfTklDX0FDQ0VTUyApCi0jZWxzZQotI2RlZmluZSBIQ0ZfRVhUICggSENGX0VYVF9UWF9DT05UIHwgSENGX0VYVF9JTkZPX0xPRyB8IEhDRl9FWFRfTUIgfCBIQ0ZfRVhUX05JQ19BQ0NFU1MgKQotI2VuZGlmCi0jZGVmaW5lIEhDRl9ETFYgMQkJCS8vSC1JIGxlZ2FjeSwgc3VwZXJmbHVvdXMgZm9yIEgtSUkKLQotI2lmZGVmIF9XSU4zMl9XQ0UKLSNkZWZpbmUgSENGX0lPICAgICBIQ0ZfSU9fTUVNCi0jZGVmaW5lIEhDRl9ETUEJCTAJCQkvLyBUbyBlbmFibGUgRE1BCi0jZW5kaWYKLQotI2lmIF9WQVJJQU5UID09IDcKLSNkZWZpbmUgSENGX1NMRUVQIEhDRl9DRFMKLSNlbmRpZiAvLyBfVkFSSUFOVCA9PSA3Ci0KLSNpZiBfVkFSSUFOVCA9PSA1IHx8IF9WQVJJQU5UID09IDYKLSNkZWZpbmUgX1dBUlAKLSNkZWZpbmUgX0FFUwotI2RlZmluZSBIQ0ZfU0xFRVAgSENGX0NEUwotI2lmIF9WQVJJQU5UID09IDYKLS8vISAjZGVmaW5lIF9SU04KLSNlbmRpZiAvLyBfVkFSSUFOVCA9PSA2Ci0jaWZuZGVmIF9XSU4zMl9XQ0UKLSNkZWZpbmUgSENGX0lPICAgICBIQ0ZfSU9fMzJCSVRTCi0jZGVmaW5lIEhDRl9ETUEJCTEJCQkvLyBUbyBlbmFibGUgRE1BCi0jZW5kaWYKLSNlbmRpZiAvLyBfVkFSSUFOVCA9PSA1IHx8IF9WQVJJQU5UID09IDYKLQotCi0vL0hXaSBmb3IgbWlncmF0aW9uIHB1cnBvc2VzIEkgZGVmaW5lZCBhIGRlZmluZSB3aGljaCB3aWxsIGJlIFRSVUUgZm9yIEFMTCBkcml2ZXJzCi0vL01lYW5pbmcgdGhhdCBfQ0NYIGRlZmluZWQgY29kZSB3aGljaCB3ZSB0aGluayB3aWxsIGdldCBhIGFsbCBkcml2ZXIgT0sgZmxhZyBjYW4gYmUgZGVmaW5lZCBmcm9tIF9DQ1ggdG8gX0NDWF9PSwotI2lmIGRlZmluZWQgV1ZMQU5fNDggLy8gJiYgIWRlZmluZWQgX1dJTjMyX1dDRQotI2lmIF9WQVJJQU5UID09IDQgfHwgX1ZBUklBTlQgPT0gNgotI2RlZmluZSBfQ0NYX09LCQkxCi0jZW5kaWYgLy8gX1ZBUklBTlQgPT0gNCB8fCBfVkFSSUFOVCA9PSA2Ci0jZW5kaWYgLy8gV1ZMQU5fNDgKLQotLy8jaWYgIWRlZmluZWQgV1ZMQU5fNDYKLSNpZiBkZWZpbmVkIFdWTEFOXzQ4Ci0jaWYgX1ZBUklBTlQgPT0gNCB8fCBfVkFSSUFOVCA9PSA2Ci0jZGVmaW5lIF9DQ1gKLSNkZWZpbmUgSENGX01BWF9NU0dfQ0tJUF9QQURESU5HICAgIDg2IC8vLCB1c2UgODYgZm9yIHJ4IGZyYWdtZW50YXRpb24uIDI4IGlzIGVudWYgZm9yIE1JQytQUEsgZW5jYXBzdWxhdGlvbgotI2RlZmluZSBIQ0ZfTUFYX01TRwkJCQkJKCAxNTE0ICsgSENGX01BWF9NU0dfQ0tJUF9QQURESU5HICApIC8vIG5lZWQgZXh0cmEgcGFkZGluZyBmb3IgQ0tJUCAobmVlZCB0byBzdWJ0cmFjdCAyOCBmb3IgTkRJUykKLSNlbmRpZiAvLyBfVkFSSUFOVCA9PSA0IHx8IF9WQVJJQU5UID09IDYKLSNlbmRpZiAvLyBXVkxBTl80OAotLy8jZW5kaWYgLy8gV1ZMQU5fNDYKLQotI2lmICFkZWZpbmVkIFdWTEFOXzQ2Ci0jZGVmaW5lIF9QRUVLCi0jZW5kaWYKLQotI2lmbmRlZiBfV0lOMzJfV0NFCi0vLyBBU1NFUlQgYWxyZWFkeSB1c2VkIGJ5IFdpbkNFLi4uCi0jaWZkZWYgQVNTRVJUCi0jdW5kZWYgQVNTRVJUCi0jZGVmaW5lICBBU1NFUlQoeCkgQVNTRVJUREVCVUdNU0coKHgpLCAoVEVYVCgiU0lNVUxBVEUgQVNTRVJUOiIpKSkKLSNlbmRpZgotI2VuZGlmCi0KLQotI2lmIGRlZmluZWQgV1ZMQU5fNDEKLSNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAkJCUNPTVBfSURfTUlOSVBPUlRfTkRJU18zMQotI2VuZGlmIC8vIFdWTEFOXzQxCi0jaWYgZGVmaW5lZCBXVkxBTl80OCAmJiAhZGVmaW5lZCBfV0lOMzJfV0NFCi0jZGVmaW5lCU1TRl9DT01QT05FTlRfSUQJCQlDT01QX0lEX01JTklQT1JUX05ESVNfNTAKLSNlbmRpZiAvLyBXVkxBTl80OCAvIF9XSU4zMl9XQ0UKLSNpZiBkZWZpbmVkIFdWTEFOXzUyICYmICFkZWZpbmVkIF9XSU4zMl9XQ0UKLSNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAkJCUNPTVBfSURfTUlOSVBPUlRfTkRJU180MAotI2VuZGlmIC8vIFdWTEFOXzUyIC8gX1dJTjMyX1dDRQotI2lmIGRlZmluZWQgV1ZMQU5fNDYKLSNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAkJCUNPTVBfSURfV0lOX0NFCi0jZW5kaWYgLy8gX1dJTjMyX1dDRQotCi0jZGVmaW5lCU1TRl9DT01QT05FTlRfVkFSCQkJX1ZBUklBTlQKLQotI2RlZmluZQlUMV9fSENGX1RZUEUJCQkJCShIQ0ZfVFlQRV9OT05FKQotCi0jZGVmaW5lIFQyX19IQ0ZfVFlQRQkJCQkJKFQxX19IQ0ZfVFlQRSkKLQotI2lmZGVmIF9XQVJQCi0jZGVmaW5lIFQzX19IQ0ZfVFlQRQkJCQkJKFQyX19IQ0ZfVFlQRSB8IEhDRl9UWVBFX0hJSTUgfCBIQ0ZfVFlQRV9XQVJQICkKLSNlbHNlCi0jaWYgX1ZBUklBTlQgPT0gNwotI2RlZmluZSBUM19fSENGX1RZUEUJCQkJCShUMl9fSENGX1RZUEUgfCBIQ0ZfVFlQRV9ISUk1KQotI2Vsc2UgLy8gX1ZBUklBTlQgPT0gNwotI2RlZmluZSBUM19fSENGX1RZUEUJCQkJCShUMl9fSENGX1RZUEUpCi0jZW5kaWYgLy8gX1ZBUklBTlQgPT0gNwotI2VuZGlmIC8vIF9XQVJQCi0KLSNpZmRlZiBfQ0NYX09LCi0jZGVmaW5lIFQ0X19IQ0ZfVFlQRQkJCQkJKFQzX19IQ0ZfVFlQRSB8IEhDRl9UWVBFX0NDWCkKLSNlbHNlCi0jZGVmaW5lIFQ0X19IQ0ZfVFlQRQkJCQkJKFQzX19IQ0ZfVFlQRSkKLSNlbmRpZiAvLyBfQ0NYX09LCi0KLS8vbm90IHN1aXRhYmxlIGZvciBILUlJICNkZWZpbmUgSENGX0NGR19TVEFfMV9CT1RUT00gICAgICAgIAkxNgotCi0vLyBEZWZhdWx0IFdQQSBpbiBPTiBmb3IgYWxsIGRyaXZlcnMgZXhjZXB0IGZvciBXQVJQIGRyaXZlcgotI2lmZGVmIF9XQVJQCi0jZGVmaW5lIFQ1X19IQ0ZfVFlQRQkJCQkJKFQ0X19IQ0ZfVFlQRSkKLSNlbHNlIC8vIF9XQVJQCi0jZGVmaW5lIFQ1X19IQ0ZfVFlQRQkJCQkJKFQ0X19IQ0ZfVFlQRSB8IEhDRl9UWVBFX1dQQSkKLSNlbmRpZiAvLyBfV0FSUAotCi0jZGVmaW5lIEhDRl9UWVBFCQkJCQkJKFQ1X19IQ0ZfVFlQRSkKLQotLy8gVGhpcyBpcyBuZWVkZWQgdG8gZ2V0IGF1eF9jdHJsKCkgZnJvbSB0aGUgSENGIGZvciBXbEZyZWV6ZUFuZER1bXAoKQotI2lmIChkZWZpbmVkIERCRyAmJiBEQkcgIT0gMCkKLSNpZm5kZWYgU1RBVElDCi0jZGVmaW5lIFNUQVRJQwotI2VuZGlmCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkIFNPRlRST05JQ1NfQ09ERSAmJiAhZGVmaW5lZCBfQVBJRExMICYmICFkZWZpbmVkIF9XSU4zMl9XQ0UKLSNpbmNsdWRlIDxuZGlzLmg+Ci0jZW5kaWYgLy8gU09GVFJPTklDU19DT0RFIC8gX0FQSURMTCAvIF9XSU4zMl9XQ0UKLSNpZiBkZWZpbmVkIF9XSU4zMl9XQ0UKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jaW5jbHVkZSA8d2lubnQuaD4KLSNlbmRpZiAgLy8gX1dJTjMyX1dDRQotI2luY2x1ZGUgInZlcnNpb24uaCIKLQotI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkJVFBJX01BSk9SX1ZFUlNJT04KLSNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJCVRQSV9NSU5PUl9WRVJTSU9OCi0KLSNpZiAhZGVmaW5lZCBfQVBJRExMICYmICFkZWZpbmVkIF9XSU4zMl9XQ0UKLQotX19pbmxpbmUgVUNIQVIgTkRJU19JTl9CWVRFKCBVTE9ORyBwb3J0ICkKLXsKLSAgICBVQ0hBUiB2YWx1ZTsKLSAgICBOZGlzUmF3UmVhZFBvcnRVY2hhcihwb3J0ICwgJnZhbHVlKTsKLSAgICByZXR1cm4gKHZhbHVlKTsKLX0KLQotX19pbmxpbmUgVUxPTkcgTkRJU19JTl9MT05HKCBVTE9ORyBwb3J0ICkKLXsKLSAgICBVTE9ORyB2YWx1ZTsKLSAgICBOZGlzUmF3UmVhZFBvcnRVbG9uZyhwb3J0ICwgJnZhbHVlKTsKLSAgICByZXR1cm4gKHZhbHVlKTsKLX0KLV9faW5saW5lIFVTSE9SVCBORElTX0lOX1dPUkQoIFVMT05HIHBvcnQgKQotewotICAgIFVTSE9SVCB2YWx1ZTsKLSAgICBOZGlzUmF3UmVhZFBvcnRVc2hvcnQocG9ydCAsICZ2YWx1ZSk7Ci0gICAgcmV0dXJuICh2YWx1ZSk7Ci19Ci0KLSNkZWZpbmUgSU5fUE9SVF9EV09SRChwb3J0KQkJCU5ESVNfSU5fTE9ORyggKFVMT05HKSAocG9ydCkgKQotI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkJCQlORElTX0lOX1dPUkQoIChVTE9ORykgKHBvcnQpICkKLSNkZWZpbmUgT1VUX1BPUlRfRFdPUkQocG9ydCwgdmFsdWUpCU5kaXNSYXdXcml0ZVBvcnRVbG9uZygoVUxPTkcpIChwb3J0KSAsIHZhbHVlKQotI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQlOZGlzUmF3V3JpdGVQb3J0VXNob3J0KChVTE9ORykgKHBvcnQpICwgKFVTSE9SVCkgKHZhbHVlKSkKLQotI2RlZmluZSAgSU5fUE9SVF9TVFJJTkdfOF8xNihwb3J0LCBhZGRyLCBsZW4pCUlOX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGFkZHIsIGxlbikKLSNkZWZpbmUgIE9VVF9QT1JUX1NUUklOR184XzE2KHBvcnQsIGFkZHIsIGxlbikJT1VUX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGFkZHIsIGxlbikKLQotI2RlZmluZSBJTl9QT1JUX1NUUklOR18zMihwb3J0LCBhZGRyLCBsZW4pCQl7CQkJCQlcCi0JTmRpc1Jhd1JlYWRQb3J0QnVmZmVyVWxvbmcocG9ydCwgYWRkciwgKGxlbikpOwkJCQkJXAotfQotCi0jZGVmaW5lIE9VVF9QT1JUX1NUUklOR18zMihwb3J0LCBhZGRyLCBsZW4pCXsJCQkJCQlcCi0JTmRpc1Jhd1dyaXRlUG9ydEJ1ZmZlclVsb25nKHBvcnQsIGFkZHIsIChsZW4pKTsJCQkJCVwKLX0KLQotI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNihwb3J0LCBhZGRyLCBsZW4pCU5kaXNSYXdSZWFkUG9ydEJ1ZmZlclVzaG9ydChwb3J0LCBhZGRyLCAobGVuKSk7Ci0jZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNihwb3J0LCBhZGRyLCBsZW4pCU5kaXNSYXdXcml0ZVBvcnRCdWZmZXJVc2hvcnQocG9ydCwgYWRkciwgKGxlbikpOwotCi0jZW5kaWYgLy8gIF9BUElETEwgLyBfV0lOMzJfV0NFCi0KLSNpZiBkZWZpbmVkIF9XSU4zMl9XQ0UKLQotI2RlZmluZSBIQ0ZfQUxJR04gMgotI2RlZmluZSBIQ0ZfTUVNX0lPCQkJCQkxIC8vIG92ZXJydWxlIHN0YW5kYXJkIFBvcnQgSS9PIHdpdGggTWVtb3J5IG1hcHBlZCBJL08KLSNkZWZpbmUgSENGX1BST1RfVElNRQkJCQk0OQotCi0jZGVmaW5lICAJCUlOX1BPUlRfQllURQkJCUNFX0lOX1BPUlRfQllURQotI2RlZmluZSAgCQlPVVRfUE9SVF9CWVRFCQkJQ0VfT1VUX1BPUlRfQllURQotI2RlZmluZSAgCQlJTl9QT1JUX1dPUkQJCQlDRV9JTl9QT1JUX1dPUkQKLSNkZWZpbmUgIAkJT1VUX1BPUlRfV09SRAkJCUNFX09VVF9QT1JUX1dPUkQKLSNkZWZpbmUgIAkJSU5fUE9SVF9TVFJJTkdfMTYJCUNFX0lOX1BPUlRfU1RSSU5HCi0jZGVmaW5lICAJCU9VVF9QT1JUX1NUUklOR18xNgkJQ0VfT1VUX1BPUlRfU1RSSU5HCi0KLWV4dGVybiBoY2ZfOCAgQ0VfSU5fUE9SVF9CWVRFKGhjZl8zMiBwb3J0KTsKLWV4dGVybiB2b2lkICAgQ0VfT1VUX1BPUlRfQllURShoY2ZfMzIgcG9ydCwgaGNmXzggdmFsdWUpOwotZXh0ZXJuIGhjZl8xNiBDRV9JTl9QT1JUX1dPUkQoaGNmXzMyIHBvcnQpOwotZXh0ZXJuIHZvaWQgICBDRV9PVVRfUE9SVF9XT1JEKGhjZl8zMiBwb3J0LCBoY2ZfMTYgdmFsdWUpOwotZXh0ZXJuIHZvaWQgICBDRV9JTl9QT1JUX1NUUklORyhoY2ZfMzIgcG9ydCwgdm9pZCAqYWRkciwgaGNmXzE2IGxlbik7Ci1leHRlcm4gdm9pZCAgIENFX09VVF9QT1JUX1NUUklORyhoY2ZfMzIgcG9ydCwgdm9pZCAqYWRkciwgaGNmXzE2IGxlbik7Ci0KLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkIF9ERUJVRyB8fCAoZGVmaW5lZCBEQkcgJiYgREJHICE9IDApCi0jZGVmaW5lIEhDRl9BU1NFUlQgKCBIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROIHwgSENGX0FTU0VSVF9SVF9NU0ZfUlROIHwgSENGX0FTU0VSVF9QUklOVEYgKSAvLzB4QzAwMQotLy8jZGVmaW5lIEhDRl9BU1NFUlQgKCBIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROIHwgSENGX0FTU0VSVF9SVF9NU0ZfUlROIHwgSENGX0FTU0VSVF9QUklOVEYgfCBIQ0ZfQVNTRVJUX01CICkgLy9qdXN0IHRvIHRlc3QKLSNlbmRpZiAvLyBfREVCVUcgfHwgREJHCi0KLSNpZiBkZWZpbmVkIERFQlVHIHx8IGRlZmluZWQgX0RFQlVHIHx8IChkZWZpbmVkIERCRyAmJiBEQkcgIT0gMCkKLSNpZmRlZiBfV0lOMzJfV0NFCi0jZGVmaW5lIERCR0EyVyhEQkdTVFIpCUNlQ29udmVydEFuc2lUb1VuaWNvZGVMZW4oKGNoYXIqKURCR1NUUikKLSNkZWZpbmUgT1VUUFVUREVCVUdNU0coZHByaW50Zl9leHApCQkJKCh2b2lkKSgoISBaT05FX0RFQlVHKSA/IDA6Y2VfZGVidWdfb3V0IGRwcmludGZfZXhwKSkKLSNkZWZpbmUgQVNTRVJUREVCVUdNU0coY29uZCwgZHByaW50Zl9leHApCQkJKCh2b2lkKSgoY29uZCkgPyAwOmNlX2RlYnVnX291dCBkcHJpbnRmX2V4cCkpCi0KLSNkZWZpbmUgWk9ORV9FUlJPUiAgICAgIERFQlVHWk9ORSgwKQotI2RlZmluZSBaT05FX1dBUk4gICAgICAgREVCVUdaT05FKDEpCi0jZGVmaW5lIFpPTkVfRlVOQ1RJT04gICBERUJVR1pPTkUoMikKLSNkZWZpbmUgWk9ORV9JTklUICAgICAgIERFQlVHWk9ORSgzKQotI2RlZmluZSBaT05FX0lOVFIgICAgICAgREVCVUdaT05FKDQpCi0jZGVmaW5lIFpPTkVfUkNWICAgICAgICBERUJVR1pPTkUoNSkKLSNkZWZpbmUgWk9ORV9YTUlUCQlERUJVR1pPTkUoNikKLSNkZWZpbmUgWk9ORV9BU1NFUlQgCURFQlVHWk9ORSg3KQotI2RlZmluZSBaT05FX0RFQlVHIAkJREVCVUdaT05FKDgpCi0jZGVmaW5lIFpPTkVfT0VNIAkJREVCVUdaT05FKDkpCi0jZGVmaW5lIFpPTkVfSENGCQlERUJVR1pPTkUoMTApCi0jZGVmaW5lIFpPTkVfUE9SVElPCQlERUJVR1pPTkUoMTEpCi0jZGVmaW5lIFpPTkVfTE9HVE9GSUxFCURFQlVHWk9ORSgxNSkKLQotI2Vsc2UgLy8gIShfV0lOMzJfV0NFKQotCi0jZGVmaW5lIE9VVFBVVERFQlVHTVNHKGRwcmludGZfZXhwKQkJCQkJKCh2b2lkKSAoRGJnUHJpbnQgZHByaW50Zl9leHApKQotLy8gdGhlIGFzc2VydGRlYnVnbXNnIG1hY3JvIHdpbGwgcHJpbnQgZmlsZW5hbWUsIGxpbmUgZm9sbG93ZWQgYnkgYSBjYWxsZXItZGVmaW5lZCB0ZXh0LCB3aGVuIGNvbmQgPT0gMAotI2RlZmluZSBBU1NFUlRERUJVR01TRyhjb25kLCBwcmludCkJKCh2b2lkKSgoY29uZCkgPyAwOiAoRGJnUHJpbnQoIiVzICVzOiVkIC0gIiwgcHJpbnQsIF9fRklMRV9fLCBfX0xJTkVfXykpKSkKLQotI2RlZmluZSBaT05FX0VSUk9SICAgICAgMQotI2RlZmluZSBaT05FX1dBUk4gICAgICAgMQotI2RlZmluZSBaT05FX0ZVTkNUSU9OICAgMQotI2RlZmluZSBaT05FX0lOSVQgICAgICAgMQotI2RlZmluZSBaT05FX0lOVFIgICAgICAgMQotI2RlZmluZSBaT05FX1JDViAgICAgICAgMQotI2RlZmluZSBaT05FX1hNSVQJCTEKLSNkZWZpbmUgWk9ORV9BU1NFUlQgCTEKLSNkZWZpbmUgWk9ORV9ERUJVRyAJCTEKLSNkZWZpbmUgWk9ORV9PRU0gCQkxCi0jZGVmaW5lIFpPTkVfSENGCQkxCi0jZGVmaW5lIFpPTkVfUE9SVElPCQkxCi0jZGVmaW5lIFpPTkVfTE9HVE9GSUxFCTEKLQotI2VuZGlmIC8vIF9XSU4zMl9XQ0UKLSNpZm5kZWYgREJHQTJXCi0jZGVmaW5lIERCR0EyVwotI2VuZGlmCS8vIERCR0EyVwotCi0jZWxzZSAvLyAhKGRlZmluZWQgREVCVUcgfHwgZGVmaW5lZCBfREVCVUcgfHwgKGRlZmluZWQgREJHICYmIERCRyAhPSAwKSApCi0jZGVmaW5lIE9VVFBVVERFQlVHTVNHKGRwcmludGZfZXhwKQotI2RlZmluZSBBU1NFUlRERUJVR01TRyhjb25kLCBkcHJpbnRmX2V4cCkKLSNlbmRpZiAvLyBERUJVRyAvIERCRwotCi0jaWYgIWRlZmluZWQgSENGX01BWF9NU0dfQ0tJUF9QQURESU5HCi0jZGVmaW5lIEhDRl9NQVhfTVNHX0NLSVBfUEFERElORyAwCi0jZW5kaWYgLy8gCQlIQ0ZfTUFYX01TR19DS0lQX1BBRERJTkcKLQotI2lmICFkZWZpbmVkCUhDRl9NQVhfTVNHCi0jZGVmaW5lCQkJSENGX01BWF9NU0cJCQkJMTUxNAotI2VuZGlmIC8vIAkJSENGX01BWF9NU0cKLQotI2RlZmluZQkJCUhDRl9MRUdBQ1kJCQkxCS8vOz9udiBqZSBtb2V0IHdhdAotCi0jZW5kaWYgLy9XVkxBTl80MSAvIFdWTEFOXzQ4IC8gV1ZMQU5fNTIgLyBfV0lOMzJfV0NFCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqICBQIEEgQyBLIEUgVCAgIEQgUiBJIFYgRSBSICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRCBPIFMgICBPIEQgSSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIGRlZmluZWQgV1ZMQU5fNDIgfHwgZGVmaW5lZCBXVkxBTl80MwotCi0jcHJhZ21hIHdhcm5pbmcgKCBkaXNhYmxlOiA0MDAxICkKLSNkZWZpbmUgRkFSICBfX2ZhcgkJCQkJCQkJCQkvL3NlZ21lbnRlZCAxNiBiaXRzIG1vZGUKLSNkZWZpbmUgQkFTRUQgX19iYXNlZChfX3NlZ25hbWUoIl9DT0RFIikpCQkJCS8vZm9yY2UgYWxsIHRoZSAiY29uc3QiIHN0cnVjdHVyZXMgaW4gdGhlIENPREUgc2VnbWVudAotCi0vLyNkZWZpbmUgSENGX0lPICAgICAwCQkJCQkJCQkJLy9ubyBETUEsIG5vIDMyIGJpdHMKLQotLy9+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4gVG8gZWFzZSB0ZXN0aW5nIHRoZSBkaWZmZXJlbnQgb3B0aW9ucyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLQotI2RlZmluZQlIQ0ZfRVhUCQkJCQkJSENGX0VYVF9NQgotI2RlZmluZSBIQ0ZfUFJPVF9USU1FCQkJCTQ5CQkJCQkvLzQ5KjEwMjQwIG1pY3Jvc2Vjb25kcyBIL1cgZmFpbHVyZSBwcm90ZWN0aW9uIHRpbWVyCi0KLS8vfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+IFRvIGVhc2UgdGVzdGluZyB0aGUgZGlmZmVyZW50IG9wdGlvbnMgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgQ09ORklHVVJBVElPTiBNQU5BR0VNRU5UICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIFdWTEFOXzQyCi0jZGVmaW5lCU1TRl9DT01QT05FTlRfSUQJCQlDT01QX0lEX1BBQ0tFVAotI2RlZmluZQlNU0ZfQ09NUE9ORU5UX1ZBUgkJCTEKLSNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIJCTYKLSNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJCTEyCi0jZW5kaWYgLy8gV1ZMQU5fNDIKLQotI2lmZGVmIFdWTEFOXzQzCi0jZGVmaW5lCU1TRl9DT01QT05FTlRfSUQJCQlDT01QX0lEX09ESV8xNgotI2RlZmluZQlNU0ZfQ09NUE9ORU5UX1ZBUgkJCTEKLSNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIJCTYKLSNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJCTEwCi0jZW5kaWYgLy8gV1ZMQU5fNDMKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBJTlBVVCAvIE9VVFBVVCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBIXzJfSU5DCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjb25pby5oPgotI2lmIDEgLy90ZW1vcmFyeSB1c2UgZnVuY3Rpb25zIGRlZmluZWQgaW4gaGNmLmMKLSNpZm5kZWYgX0RFQlVHCi0jcHJhZ21hIGludHJpbnNpYyggX2lucCwgX2lucHcsIF9vdXRwLCBfb3V0cHcgKQotI2VuZGlmIC8vIF9ERUJVRwotCi0jZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJCSgoaGNmXzE2KV9pbnB3KCAoaGNmX2lvKShwb3J0KSApKQotI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQkoKHZvaWQpX291dHB3KCAoaGNmX2lvKShwb3J0KSwgdmFsdWUgKSkKLQotI2lmIDEJCS8vIEMgaW1wbGVtZW50YXRpb24gd2hpY2ggbGV0IHRoZSBwcm9jZXNzb3IgaGFuZGxlIHRoZSB3b3JkLWF0LWJ5dGUtYm91bmRhcnkgcHJvYmxlbQotI2RlZmluZSBJTl9QT1JUX1NUUklOR184XzE2KCBwb3J0LCBhZGRyLCBuKQkJd2hpbGUgKG4tLSkgXAotCXsgKihoY2ZfMTYgRkFSKilhZGRyID0gSU5fUE9SVF9XT1JEKCBwb3J0ICk7ICgoaGNmXzggRkFSKilhZGRyKSs9MjsgfQotI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfOF8xNiggcG9ydCwgYWRkciwgbikJd2hpbGUgKG4tLSkgXAotCXsgT1VUX1BPUlRfV09SRCggcG9ydCwgKihoY2ZfMTYgRkFSKilhZGRyICkgOyAoKGhjZl84IEZBUiopYWRkcikrPTI7IH0KLSNlbGlmIDAJCS8vIEMgaW1wbGVtZW50YXRpb24gd2hpY2ggaGFuZGxlcyB0aGUgd29yZC1hdC1ieXRlLWJvdW5kYXJ5IHByb2JsZW0KLSNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfOF8xNiggcG9ydCwgYWRkciwgbikJCXdoaWxlICggbi0tICkgXAotCXsgaGNmXzE2IGkgPSBJTl9QT1JUX1dPUkQocG9ydCk7ICooKGhjZl84IEZBUiopYWRkcikrKyA9IChoY2ZfOClpOyAqKChoY2ZfOCBGQVIqKWFkZHIpKysgPSAoaGNmXzgpKGk+PjgpO30KLSNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzhfMTYoIHBvcnQsIGFkZHIsIG4pCXdoaWxlICggbi0tICkgXAotCXsgT1VUX1BPUlRfV09SRCggcG9ydCwgKigoaGNmXzggRkFSKilhZGRyKSB8ICooKChoY2ZfOCBGQVIqKWFkZHIpKzEpPDw4ICApOyAoaGNmXzggRkFSKilhZGRyKz0yOyB9Ci0jZWxzZQkJCQkJCQkJCQkJCS8vIEFzc2VtYmxlciBpbXBsZW1lbnRhdGlvbgotI2RlZmluZSBJTl9QT1JUX1NUUklOR184XzE2KCBwb3J0LCBhZGRyLCBuKSBfX2FzbQlcCi17CQkJCQkJCQkJCQkJCVwKLQlfX2FzbSBwdXNoIGRpCQkJCQkJCQkJXAotCV9fYXNtIHB1c2ggZXMJCQkJCQkJCQlcCi0JX19hc20gbW92IGN4LG4JCQkJCQkJCQlcCi0JX19hc20gbGVzIGRpLGFkZHIJCQkJCQkJCVwKLQlfX2FzbSBtb3YgZHgscG9ydAkJCQkJCQkJXAotCV9fYXNtIHJlcCBpbnN3CQkJCQkJCQkJXAotCV9fYXNtIHBvcCBlcwkJCQkJCQkJCVwKLQlfX2FzbSBwb3AgZGkJCQkJCQkJCQlcCi19Ci0KLSNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzhfMTYoIHBvcnQsIGFkZHIsIG4pIF9fYXNtCVwKLXsJCQkJCQkJCQkJCQkJXAotCV9fYXNtIHB1c2ggc2kJCQkJCQkJCQlcCi0JX19hc20gcHVzaCBkcwkJCQkJCQkJCVwKLQlfX2FzbSBtb3YgY3gsbgkJCQkJCQkJCVwKLQlfX2FzbSBsZHMgc2ksYWRkcgkJCQkJCQkJXAotCV9fYXNtIG1vdiBkeCxwb3J0CQkJCQkJCQlcCi0JX19hc20gcmVwIG91dHN3CQkJCQkJCQkJXAotCV9fYXNtIHBvcCBkcwkJCQkJCQkJCVwKLQlfX2FzbSBwb3Agc2kJCQkJCQkJCQlcCi19Ci0KLSNlbmRpZiAvLyBBc20gb3IgQyBpbXBsZW1lbnRhdGlvbgotI2RlZmluZSBJTl9QT1JUX1NUUklOR18zMiggcG9ydCwgYWRkciwgbikJeyBpbnQgbjIgPSAyKm47IElOX1BPUlRfU1RSSU5HXzhfMTYocG9ydCwgYWRkciwgbjIpIH0KLSNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzMyKCBwb3J0LCBhZGRyLCBuKQl7IGludCBuMiA9IDIqbjsgT1VUX1BPUlRfU1RSSU5HXzhfMTYocG9ydCwgYWRkciwgbjIpIH0KLSNlbmRpZiAvLyAwIC8vdGVtb3JhcnkgdXNlIGZ1bmN0aW9ucyBkZWZpbmVkIGluIGhjZi5jCi0jZW5kaWYgLy8gSF8yX0lOQwotCi0jZW5kaWYJLy8gV1ZMQU5fNDIgLyBXVkxBTl80MwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqICBEIE8gUyAgSCAtIEkgLyBJSSAgTCBPIEEgRCBFIFIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgZGVmaW5lZCBIMF9MRFIgfHwgZGVmaW5lZCBIMV9MRFIgfHwgZGVmaW5lZCBIMl9MRFIgfHwgZGVmaW5lZCBINV9MRFIKLQotI2lmIGRlZmluZWQgSDBfTERSCQkJCS8vaW1wbGllcyBILUkKLSNkZWZpbmUgSENGX0RMVgkJMAkJCS8vSC1JIGxlZ2FjeSwgbWVhbmluZ2xlc3MgdW5kZXIgSC1JSQotI2RlZmluZSBIQ0ZfRExOVgkxCQkJLy9ILUkgbGVnYWN5LCBtZWFuaW5nbGVzcyB1bmRlciBILUlJCi0jZW5kaWYgLy8gSDBfTERSCi0KLSNpZiBkZWZpbmVkIEgxX0xEUiAJCQkJLy9pbXBsaWVzIEgtSQotI2RlZmluZSBIQ0ZfRExWCQkxCQkJLy9ILUkgbGVnYWN5LCBtZWFuaW5nbGVzcyB1bmRlciBILUlJCi0jZGVmaW5lIEhDRl9ETE5WCTAJCQkvL0gtSSBsZWdhY3ksIG1lYW5pbmdsZXNzIHVuZGVyIEgtSUkKLSNlbmRpZiAvLyBIMV9MRFIgLyBIMl9MRFIKLQotLy8jaWYgZGVmaW5lZCBIMl9MRFIgOiBub3QgbmVlZGVkLCBILUlJIGRlZmF1bHRzIGFyZSBPLksgZm9yIEgyX0xEUgotCi0jaWZkZWYgSDVfTERSCi0jZGVmaW5lIEhDRl9UWVBFCQkJKEhDRl9UWVBFX0hJSTUgfCBIQ0ZfVFlQRV9XQVJQICkKLS8vOz8gd2h5IGRvZXMgb25seSB0aGlzIHN1YnNldCBvZiB0aGUgSF9MRFJzIG5lZWQgSENGX1RZUEUgdG8gYmUgZGVmaW5lZCBoZXJlCi0jZW5kaWYKLQotI2RlZmluZSBIQ0ZfQVNTRVJUCQkJSENGX0FTU0VSVF9MTktfTVNGX1JUTgkvL3N1cHBvcnQgZHluYW1pYyBsaW5raW5nIG9mIG1zZl9hc3NlcnQgcm91dGluZQotI2RlZmluZSBIQ0ZfRU5DQVAJCQkwCi0jZGVmaW5lIEhDRl9JTlRfT04JCQkwCi0jZGVmaW5lIEhDRl9UQUxMSUVTCQkJMAotCi0jZGVmaW5lCU1TRl9DT01QT05FTlRfSUQJCQlDT01QX0lEX09ESV8xNiAvLzs/QnkgbGFjayBvZiBhbnkgYmV0dGVyCi0jZGVmaW5lCU1TRl9DT01QT05FTlRfVkFSCQkJMQotI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkJMAotI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUgkJMAotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjb25pby5oPgotI2lmIGRlZmluZWQgTkRFQlVHCi0jcHJhZ21hIGludHJpbnNpYyggX2lucCwgX2lucHcsIF9vdXRwLCBfb3V0cHcgKQotI2VuZGlmIC8vIE5ERUJVRwotCi0jaWYgMAkJCQkJCS8vdXNlIDAgdG8gcmVwbGFjZSBJL08gTWFjcm9zIHdpdGggbG9nZ2luZyBmYWNpbGl0eQotI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkJCQkoKGhjZl8xNilfaW5wdyggKGhjZl9pbykocG9ydCkgKSkKLSNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJKCh2b2lkKV9vdXRwdyggKGhjZl9pbykocG9ydCksIHZhbHVlICkpCi0jZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBuKQlcCi0JCXdoaWxlICggbi0tICkgeyAqKGhjZl8xNiBGQVIqKWFkZHIgPSBJTl9QT1JUX1dPUkQoIHBvcnQgKTsgKGNhc3QpYWRkciArPSAyOyB9Ci0jZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbikJXAotCQl3aGlsZSAoIG4tLSApIHsgT1VUX1BPUlRfV09SRCggcG9ydCwgKihoY2ZfMTYgRkFSKilhZGRyICkgOyAoY2FzdClhZGRyICArPSAyOyB9Ci0jZW5kaWYJCQkJCQkvL3VzZSAwIHRvIHJlcGxhY2UgSS9PIE1hY3JvcyB3aXRoIGxvZ2dpbmcgZmFjaWxpdHkKLQotI2VuZGlmCS8vIEgwX0xEUiAvIEgxX0xEUiAvIEgyX0xEUgotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqICBIIEMgRiAgRCBFIE0gTyAgUCBSIE8gRyBSIEEgTSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgZGVmaW5lZCBIQ0ZfREVNTwotCi0jZGVmaW5lIEhDRl9ETFYJCTEJCQkJLy87P3Nob3VsZCBiZWNvbWUgdGhlIGRlZmF1bHQgIWRlZmF1bHRzIHRvIDEgYW55d2F5IGZvciBILUlJCi0vLyNkZWZpbmUgSENGX0RMTlYJMAkJCQkvL2RlZmF1bHRzIHRvIDAgYW55d2F5IGZvciBILUlJCi0KLSNkZWZpbmUgSENGX0FTU0VSVAlIQ0ZfQVNTRVJUX0xOS19NU0ZfUlROCQkJLy9zdXBwb3J0IGR5bmFtaWMgbGlua2luZyBvZiBtc2ZfYXNzZXJ0IHJvdXRpbmUKLQotI2RlZmluZSBIQ0ZfRU5DQVAJCQkwCi0jZGVmaW5lIEhDRl9JTlRfT04JCQkwCi0jZGVmaW5lIEhDRl9UQUxMSUVTCQkJKCBIQ0ZfVEFMTElFU19OSUMgfCBIQ0ZfVEFMTElFU19IQ0YgKQotCi0vLyNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAkJTk8gY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50Ci0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGNvbmlvLmg+Ci0jaWYgZGVmaW5lZCBOREVCVUcKLSNwcmFnbWEgaW50cmluc2ljKCBfaW5wLCBfaW5wdywgX291dHAsIF9vdXRwdyApCi0jZW5kaWYgLy8gTkRFQlVHCi0KLSNpZiAwCQkJCQkJLy91c2UgMCB0byByZXBsYWNlIEkvTyBNYWNyb3Mgd2l0aCBsb2dnaW5nIGZhY2lsaXR5Ci0jZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJCSgoaGNmXzE2KV9pbnB3KCAoaGNmX2lvKShwb3J0KSApKQotI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQkoKHZvaWQpX291dHB3KCAoaGNmX2lvKShwb3J0KSwgdmFsdWUgKSkKLSNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKLQkJd2hpbGUgKCBuLS0gKSB7ICooaGNmXzE2IEZBUiopYWRkciA9IElOX1BPUlRfV09SRCggcG9ydCApOyAoY2FzdClhZGRyICs9IDI7IH0KLSNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBuKQlcCi0JCXdoaWxlICggbi0tICkgeyBPVVRfUE9SVF9XT1JEKCBwb3J0LCAqKGhjZl8xNiBGQVIqKWFkZHIgKSA7IChjYXN0KWFkZHIgICs9IDI7IH0KLSNlbmRpZgkJCQkJCS8vdXNlIDAgdG8gcmVwbGFjZSBJL08gTWFjcm9zIHdpdGggbG9nZ2luZyBmYWNpbGl0eQotCi0jZW5kaWYJLy8gSENGX0RFTU8KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE0gQSBDICBPIFMgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIGRlZmluZWQgV1ZMQU5fNDUKLQotI2luY2x1ZGUgIlZlcnNpb24uaCIKLQotI2RlZmluZSBNU0ZfQ09NUE9ORU5UX0lEICAgICAgICAgICAgQ09NUF9JRF9NQUNfT1MKLSNkZWZpbmUgTVNGX0NPTVBPTkVOVF9WQVIgICAgICAgICAgIFZBUklBTlQKLSNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIgICAgIFZFUlNJT05fTUFKT1IKLSNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIgICAgIFZFUlNJT05fTUlOT1IKLQotI2RlZmluZSBNQUNfT1MgICAgICAgICAgICAgICAgICAgICAgMQotCi0jZGVmaW5lIEhDRl9CSUdfRU5ESUFOIDEgICAgICAgCQkvLyBzZWxlY3RzIEJpZyBFbmRpYW4gKGEuay5hLiBNb3Rvcm9sYSksIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdAotCi0jaWYgZGVmaW5lZCBERUJVRwotI2RlZmluZSBIQ0ZfQVNTRVJUCUhDRl9BU1NFUlRfTUIJLy8gbG9nZ2luZyB2aWEgTWFpbGJveAotI2VuZGlmIC8vIERFQlVHCi0KLSNpZmRlZiAgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8vIF9fY3BsdXNwbHVzCi1leHRlcm4gdm9sYXRpbGUgdW5zaWduZWQgY2hhciAqTWFjSU9hZGRyOwotZXh0ZXJuIGhjZl8xNiBJTl9QT1JUX1dPUkQoaGNmXzE2IHBvcnQpOwotZXh0ZXJuIHZvaWQgICBPVVRfUE9SVF9XT1JEKGhjZl8xNiBwb3J0LCBoY2ZfMTYgdmFsdWUpOwotZXh0ZXJuIHZvaWQgICBJTl9QT1JUX1NUUklOR18xNihoY2ZfMTYgcG9ydCwgdm9pZCAqYWRkciwgaGNmXzE2IGxlbik7Ci1leHRlcm4gdm9pZCAgIE9VVF9QT1JUX1NUUklOR18xNihoY2ZfMTYgcG9ydCwgdm9pZCAqYWRkciwgaGNmXzE2IGxlbik7Ci0KLSNkZWZpbmUgU3dhcEJ5dGVzKHQpICAgICgoKHQpID4+IDgpICsgKCgodCkgJiAweGZmKSA8PCA4KSkKLQotI2lmZGVmICBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8vIF9fY3BsdXNwbHVzCi0KLSNlbmRpZiAgLy8gV1ZMQU5fNDUKLQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBMIEkgTiBVIFggICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTgwMywxNiArMzE2LDI1IEBACiAvLyNkZWZpbmUgSENGX1NMRUVQIChIQ0ZfQ0RTIHwgSENGX0REUyApCiAjZGVmaW5lIEhDRl9TTEVFUCAoSENGX0NEUykKIAotLy8jZGVmaW5lIEhDRl9UWVBFICAgIChIQ0ZfVFlQRV9ISUk1fEhDRl9UWVBFX1NUQXxIQ0ZfVFlQRV9BUCkKKy8qIE5vdGU6IE5vbi1XQVJQIGZpcm13YXJlIGFsbCBzdXBwb3J0IFdQQS4gSG93ZXZlciB0aGUgb3JpZ2luYWwgQWdlcmUKKyAqIGxpbnV4IGRyaXZlciBkb2VzIG5vdCBlbmFibGUgV1BBLiBFbmFibGluZyBXUEEgaGVyZSBjYXVzZXMgd2hhdGV2ZXIKKyAqIHByZWxpbWluYXJ5IFdQQSBsb2dpYyB0byBiZSBpbmNsdWRlZCwgc29tZSBvZiB3aGljaCBtYXkgYmUgc3BlY2lmaWMKKyAqIHRvIEhFUk1FU0kuCisgKgorICogVmFyaW91cyBjb21tZW50IGFyZSBjbGVhciB0aGF0IFdBUlAgYW5kIFdQQSBhcmUgbm90IGNvbXBhdGlibGUKKyAqICh3aGljaCBtYXkganVzdCBtZWFuIFdBUlAgZG9lcyBXUEEgaW4gYSBkaWZmZXJlbnQgZmFzaGlvbikuCisgKi8KKworLyogI2RlZmluZSBIQ0ZfVFlQRSAgICAoSENGX1RZUEVfSElJNXxIQ0ZfVFlQRV9TVEF8SENGX1RZUEVfQVApICovCiAjaWZkZWYgSEVSTUVTMjUKICNpZmRlZiBXQVJQCiAjZGVmaW5lIEhDRl9UWVBFICAgICggSENGX1RZUEVfV0FSUCB8IEhDRl9UWVBFX0hJSTUgKQogI2Vsc2UKLSNkZWZpbmUgSENGX1RZUEUgICAgSENGX1RZUEVfSElJNQotI2VuZGlmIC8vIFdBUlAKKyNkZWZpbmUgSENGX1RZUEUgICAgKEhDRl9UWVBFX0hJSTUgfCBIQ0ZfVFlQRV9XUEEpCisjZW5kaWYgLyogV0FSUCAqLwogI2Vsc2UKLSNkZWZpbmUgSENGX1RZUEUgICAgSENGX1RZUEVfTk9ORQotI2VuZGlmIC8vIEhFUk1FUzI1CisjZGVmaW5lIEhDRl9UWVBFICAgIEhDRl9UWVBFX1dQQQorI2VuZGlmIC8qIEhFUk1FUzI1ICovCiAKICNpZmRlZiBFTkFCTEVfRE1BCiAjZGVmaW5lIEhDRl9ETUEJCTEKQEAgLTkzNCwxNiArNDU2LDYgQEAKICNkZWZpbmUgIElOX1BPUlRfU1RSSU5HXzhfMTYocG9ydCwgYWRkciwgbGVuKQlJTl9QT1JUX1NUUklOR18xNihwb3J0LCBhZGRyLCBsZW4pCiAjZGVmaW5lICBPVVRfUE9SVF9TVFJJTkdfOF8xNihwb3J0LCBhZGRyLCBsZW4pCU9VVF9QT1JUX1NUUklOR18xNihwb3J0LCBhZGRyLCBsZW4pCiAKLQotI2lmbmRlZiBPVVRQVVRERUJVR01TRwotI2RlZmluZSBPVVRQVVRERUJVR01TRyhkcHJpbnRmX2V4cCkKLSNlbmRpZgotCi0KLSNpZm5kZWYgQVNTRVJUREVCVUdNU0cKLSNkZWZpbmUgQVNTRVJUREVCVUdNU0coY29uZCwgZHByaW50Zl9leHApCi0jZW5kaWYKLQogI2lmbmRlZiBDRkdfU0NBTl9DSEFOTkVMU18yR0haCiAjZGVmaW5lIENGR19TQ0FOX0NIQU5ORUxTXzJHSFogMHhGQ0MyCiAjZW5kaWYgLyogQ0ZHX1NDQU5fQ0hBTk5FTFNfMkdIWiAqLwpAQCAtOTUxLDEwNDMgKzQ2Myw2IEBACiAjZGVmaW5lIEhDRl9NQVhfTVNHIDE2MDAgLy9nZXQgZ29pbmcgOz8KICNlbmRpZgkvLyBXVkxBTl80OQogCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFEgTiBYICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgZGVmaW5lZCAgX19RTlhfXyB8fCBkZWZpbmVkIFdWTEFOXzUwCi0KLSNkZWZpbmUgTVNGX0NPTVBPTkVOVF9JRAkJMCAgIC8vQWx0aG91Z2ggdGhlcmUgaXMgbm8gRFVJIHN1cHBvcnQsIHdlIG5lZWQgdGhpcyB0byBnZXQgLi4uCi0jZGVmaW5lIE1TRl9DT01QT05FTlRfVkFSCQkwCS8vLi4uY29tcGF0aWJpbHR5IGNoZWNrIHRvIGZ1bmN0aW9uCi0jZGVmaW5lIE1TRl9DT01QT05FTlRfTUFKT1JfVkVSCTAJLy8uLi47P3RoaXMgaXMgd29ydGggbG9va2luZyBpbnRvIHRvIG1ha2UgdGhpcyBhIG1vcmUKLSNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJMAkvLy4uLiJkZWZpbmVkIiBJL0Ygc28gT0VNZXJzIGNhbiBmaWd1cmUgb3V0IHdoYXQgdG8gZG8KLQotI2luY2x1ZGUgPGNvbmlvLmg+Ci0KLSNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJKChoY2ZfMTYpaW5wdyggKGhjZl9pbykocG9ydCkgKSkKLSNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJKG91dHB3KCAoaGNmX2lvKShwb3J0KSwgKGhjZl8xNikgKHZhbHVlKSApKQotLyoKLSNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKLQkJd2hpbGUgKCBuLS0gKSB7ICooaGNmXzE2KilhZGRyID0gSU5fUE9SVF9XT1JEKCBwb3J0ICk7IChjYXN0KWFkZHIgKz0gMjsgfQotI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKLQkJd2hpbGUgKCBuLS0gKSB7IE9VVF9QT1JUX1dPUkQoIHBvcnQsICooaGNmXzE2KilhZGRyICkgOyAoY2FzdClhZGRyICArPSAyOyB9Ci0qLwotCi0jZW5kaWYJLy8gUU5YIC8gV1ZMQU5fNTAKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBCIEUgTyBTICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIGRlZmluZWQgIF9fQkVPU19fCi0KLSNkZWZpbmUgTVNGX0NPTVBPTkVOVF9JRAkJMCAgIC8vQWx0aG91Z2ggdGhlcmUgaXMgbm8gRFVJIHN1cHBvcnQsIHdlIG5lZWQgdGhpcyB0byBnZXQgLi4uCi0jZGVmaW5lIE1TRl9DT01QT05FTlRfVkFSCQkwCS8vLi4uY29tcGF0aWJpbHR5IGNoZWNrIHRvIGZ1bmN0aW9uCi0jZGVmaW5lIE1TRl9DT01QT05FTlRfTUFKT1JfVkVSCTAJLy8uLi47P3RoaXMgaXMgd29ydGggbG9va2luZyBpbnRvIHRvIG1ha2UgdGhpcyBhIG1vcmUKLSNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJMAkvLy4uLiJkZWZpbmVkIiBJL0Ygc28gT0VNZXJzIGNhbiBmaWd1cmUgb3V0IHdoYXQgdG8gZG8KLQotI2luY2x1ZGUgPGRyaXZlcnMvRHJpdmVycy5oPgotI2luY2x1ZGUgPGRyaXZlcnMvS2VybmVsRXhwb3J0Lmg+Ci0KLXVpbnQ4IHJlYWRfaW9fOCAoaW50KTsKLXZvaWQgd3JpdGVfaW9fOCAoaW50LCB1aW50OCk7Ci11aW50MTYgcmVhZF9pb18xNiAoaW50KTsKLXZvaWQgd3JpdGVfaW9fMTYgKGludCwgdWludDE2KTsKLQotI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkJCQkoKGhjZl8xNilyZWFkX2lvXzE2KCAoaGNmX2lvKShwb3J0KSApKQotI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQkod3JpdGVfaW9fMTYoIChoY2ZfaW8pKHBvcnQpLCAoaGNmXzE2KSAodmFsdWUpICkpCi0vKgotI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbikJXAotCQl3aGlsZSAoIG4tLSApIHsgKihoY2ZfMTYqKWFkZHIgPSBJTl9QT1JUX1dPUkQoIHBvcnQgKTsgKGNhc3QpYWRkciArPSAyOyB9Ci0jZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbikJXAotCQl3aGlsZSAoIG4tLSApIHsgT1VUX1BPUlRfV09SRCggcG9ydCwgKihoY2ZfMTYqKWFkZHIgKSA7IChjYXN0KWFkZHIgICs9IDI7IH0KLSovCi0jZW5kaWYJLy8gX19CRU9TX18KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFUgUyBCICAgRCBPIE4gRyBMIEUgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIGRlZmluZWQgVVNCCi0jaW5jbHVkZSAiZ3BpZi5oIgotCi0jZGVmaW5lCU1TRl9DT01QT05FTlRfTUFKT1JfVkVSCQkwCi0jZGVmaW5lCU1TRl9DT01QT05FTlRfTUlOT1JfVkVSCQkxCi0KLSNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJKEhlcm1lc19JT19SZWFkKCAoaGNmXzgpKHBvcnQpKSkKLSNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJKEhlcm1lc19JT19Xcml0ZSggKGhjZl84KXBvcnQsIC8qKGhjZl8xNikqLyh2YWx1ZSkgKSApCi0vKiAhISEhIE5PVEUgVVNCIHN1cHBvcnRzIG9ubHkgMTYtYml0cyBJL08gYW5kIG5vIDgtYml0cyBJL08KLSAqIGFzIGEgY29uc2VxdWVuY2UgdGhlIElOXy9PVVRfUE9SVF9TVFJJTkdfMTYgbWFjcm9zIHVzZSBoY2ZfMTYqIHJhdGhlciB0aGFuIGhjZl84IHBvaW50ZXJzCi0gKiB0byBnZXQgbW9yZSBvcHRpbWFsIGNvZGUKLSAqIHRoZXJlZm9yZSB0aGUgcG9pbnRlcnMgYXJlIGluY3JlbWVudGVkIGJ5IDEgKHdoaWNoIG1lYW5zIHR3byAiYnl0ZXMiKSByYXRoZXIgdGhhbiBieSAyCi0gKi8KLS8vI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbikJd2hpbGUgKCBuLS0gKSB7ICooKGhjZl8xNiopYWRkcikrKyA9IElOX1BPUlRfV09SRCggcG9ydCApOyB9Ci0vLyNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBuKQl3aGlsZSAoIG4tLSApIHsgT1VUX1BPUlRfV09SRCggcG9ydCwgKigoaGNmXzE2KilhZGRyKSsrICk7IH0KLSNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGRzdCwgbikJd2hpbGUgKCBuLS0gKSB7ICpkc3QrKyA9IElOX1BPUlRfV09SRCggcG9ydCApOyB9Ci0jZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNiggcG9ydCwgc3JjLCBuKQl3aGlsZSAoIG4tLSApIHsgT1VUX1BPUlRfV09SRCggcG9ydCwgKnNyYysrICk7IH0KLQotLy8jZGVmaW5lIEhDRl9UWVBFCSggSENGX1RZUEVfQVAgfCBIQ0ZfVFlQRV9XUEEgKQotI2RlZmluZSBIQ0ZfVFlQRQlIQ0ZfVFlQRV9XUEEKLQotI2VuZGlmCS8vIFVTQgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBGcmVlQlNEICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIGRlZmluZWQgX19GUkVFX0JTRF9fCi0KLSNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAkJCUNPTVBfSURfRnJlZUJTRAotI2RlZmluZQlNU0ZfQ09NUE9ORU5UX1ZBUgkJCTEKLSNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIJCTEKLSNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJCTAKLQotI2RlZmluZSBIQ0ZfSU8gCQkJCQkJSENGX0lPX01FTQkJLy8gb3ZlcnJ1bGUgc3RhbmRhcmQgUG9ydCBJL08gd2l0aCBNZW1vcnkgbWFwcGVkIEkvTwotCi0jaW5jbHVkZSA8bWFjaGluZS9jcHVmdW5jLmg+Ci0KLSNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJKChoY2ZfMTYpaW53KCAoaGNmX2lvKShwb3J0KSApKQotI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQkob3V0dygoaGNmX2lvKShwb3J0KSwgKGhjZl8xNikodmFsdWUpKSkKLQotLyoKLSNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKLQkJd2hpbGUgKCBuLS0gKSB7ICooaGNmXzE2KilhZGRyID0gSU5fUE9SVF9XT1JEKCBwb3J0ICk7IChjYXN0KWFkZHIgKz0gMjsgfQotI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKLQkJd2hpbGUgKCBuLS0gKSB7IE9VVF9QT1JUX1dPUkQoIHBvcnQsICooaGNmXzE2KilhZGRyICkgOyAoY2FzdClhZGRyICArPSAyOyB9Ci0qLwotI2VuZGlmCS8vIF9fRlJFRV9CU0RfXwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFcgQSBWIEUgUCBPIEkgTiBUICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgZGVmaW5lZCBXVkxBTl84MQkvKiBCT1JMQU5EQyAqLwotCi0jZGVmaW5lIEVYVEVSTl9DICBleHRlcm4JLy8gbmVlZGVkIGJlY2F1c2UgREhGIHVzZXMgdGhpcyBpbnN0ZWFkIG9mICdleHRlcm4nCi0KLSNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRAlDT01QX0lEX0FQMQotI2RlZmluZQlNU0ZfQ09NUE9ORU5UX1ZBUgkJCTEKLSNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIJCTQKLSNkZWZpbmUJTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJCTAKLQotI2RlZmluZSBIQ0ZfUFJPVF9USU1FCQkJCTQ5CS8vNDkqMTAyNDAgbWljcm9zZWNvbmRzIEgvVyBmYWlsdXJlIHByb3RlY3Rpb24gdGltZXIKLQotLy8jZGVmaW5lIEhDRl9BU1NFUlQJSENGX0FTU0VSVF9NQgkvLyBsb2dnaW5nIHZpYSBNYWlsYm94CS8qIGRlYnVnIGJ1aWxkIG9ubHkgKi8KLQotI2lmICFkZWZpbmVkIEZBUgotI2RlZmluZSBGQVIgIGZhcgkJCQkJCS8vIHNlZ21lbnRlZCAxNiBiaXRzIG1vZGUKLSNlbmRpZiAvLyBGQVIKLQotI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkJCQkJCShpbnBvcnQoIChoY2ZfaW8pKHBvcnQpICkpCi0jZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpCQkJKG91dHBvcnQoIChoY2ZfaW8pKHBvcnQpLCB2YWx1ZSApKQotCi0jZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGFkZHIsIGxlbikJXAotCWFzbSB7IHB1c2ggZGk7IHB1c2ggZXM7IG1vdiBjeCxsZW47IGxlcyBkaSxhZGRyOyBtb3YgZHgscG9ydDsgcmVwIGluc3c7IHBvcCBlczsgcG9wIGRpIH0KLQotI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbGVuKQlcCi0JYXNtIHsgcHVzaCBzaTsgcHVzaCBkczsgbW92IGN4LGxlbjsgbGRzIHNpLGFkZHI7IG1vdiBkeCxwb3J0OyByZXAgb3V0c3c7IHBvcCBkczsgcG9wIHNpIH0KLQotI2VuZGlmIC8vIFdWTEFOXzgxCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgVyBBIFYgRSBMIEEgVSBOIEMgSCAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgZGVmaW5lZCBXVkxBVU5DSAotCi0jaW5jbHVkZSAiRHJpdmVyWC5oIgotZXh0ZXJuIEhXREVWSUNFKglnX3BEZXZpY2U7Ci0KLS8vI2RlZmluZQlNU0ZfQ09NUE9ORU5UX0lECQkJMCAgLy87PyB0byBnZXQgYXJvdW5kIGJyb3dzZXIgcHJvYmxlbQotCi0jZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQlId0lucHcoIGdfcERldmljZSwgcG9ydCApCi0jZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpCUh3T3V0cHcoIGdfcERldmljZSwgcG9ydCwgdmFsdWUgKQotCi0KLS8vIEMgaW1wbGVtZW50YXRpb24gd2hpY2ggbGV0IHRoZSBwcm9jZXNzb3IgaGFuZGxlIHRoZSB3b3JkLWF0LWJ5dGUtYm91bmRhcnkgcHJvYmxlbQotLyoKLSNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIG4pCVwKLQkJd2hpbGUgKCBuLS0gKSB7ICooaGNmXzE2IEZBUiopYWRkciA9IElOX1BPUlRfV09SRCggcG9ydCApOyAoY2FzdClhZGRyICs9IDI7IH0KLSNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBuKQlcCi0JCXdoaWxlICggbi0tICkgeyBPVVRfUE9SVF9XT1JEKCBwb3J0LCAqKGhjZl8xNiBGQVIqKWFkZHIgKSA7IChjYXN0KWFkZHIgICs9IDI7IH0KLSovCi0jZW5kaWYgLy8gV1ZMQVVOQ0gKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgVyBDIEkgVCBTIFQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmIGRlZmluZWQgV0NJVFNUCi0jZGVmaW5lIE1TRl9DT01QT05FTlRfSUQJCTAgICAvL0FsdGhvdWdoIHRoZXJlIGlzIG5vIERVSSBzdXBwb3J0LCB3ZSBuZWVkIHRoaXMgdG8gZ2V0IC4uLgotI2RlZmluZSBNU0ZfQ09NUE9ORU5UX1ZBUgkJMAkvLy4uLmNvbXBhdGliaWx0eSBjaGVjayB0byBmdW5jdGlvbgotI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkwCS8vLi4uOz90aGlzIGlzIHdvcnRoIGxvb2tpbmcgaW50byB0byBtYWtlIHRoaXMgYSBtb3JlCi0jZGVmaW5lIE1TRl9DT01QT05FTlRfTUlOT1JfVkVSCTAJLy8uLi4iZGVmaW5lZCIgSS9GIHNvIE9FTWVycyBjYW4gZmlndXJlIG91dCB3aGF0IHRvIGRvCi0KLS8vI2RlZmluZSBIQ0ZfRU5DQVAJCQkJSENGX0VOQ19OT05FCS8vdG8gZ2V0IGdvaW5nCi0vL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBUbyBlYXNlIHRlc3RpbmcgdGhlIGRpZmZlcmVudCBvcHRpb25zIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotI2RlZmluZSBIQ0ZfVFlQRSAoSENGX1RZUEVfV1BBIHwgSENGX1RZUEVfUFJFTE9BREVEKSAvLyBIZXJtZXMtSSBmb3IgSENGNiwgSUkgZm9yIEhDRjcKLSNkZWZpbmUgCQlIQ0ZfRE1BCQkJCTEKLS8vI2RlZmluZSBMTEIJLy8hISEhTUlDIERlYnVnIE9ubHkKLSNpZiBkZWZpbmVkIExMQiAmJiAhKChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEpCi1lcnI6IG5vIExMQiB1bmxlc3MgU1NOOwotI2VuZGlmIC8vIExMQiAvIEhDRl9UWVBFX1dQQQotLy8jZGVmaW5lIEhDRl9BTElHTiAyCi0jZGVmaW5lIEhDRl9ETFYJCTEJCQkvL2p1c3QgdG8gY2hhbmdlIG1lbW9yeSBsYXlvdXQgPz8/Pzs/Ci0vL35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiBUbyBlYXNlIHRlc3RpbmcgdGhlIGRpZmZlcmVudCBvcHRpb25zIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotCi0jZGVmaW5lIEhDRl9BU1NFUlQJSENGX0FTU0VSVF9TV19TVVAJLy8gbG9nZ2luZyB2aWEgSGVybWVzIHN1cHBvcnQgcmVnaXN0ZXJyCi0vLyNkZWZpbmUgSENGX0FTU0VSVAkJSENGX0FTU0VSVF9NQgkJLy8gbG9nZ2luZyB2aWEgTWFpbGJveAotCi0jaWYgZGVmaW5lZCBfX0dOVUNfXwotI2luY2x1ZGUgInN0ZGlvLmgiCi0vLyNpbmNsdWRlICJ1bmlzdGQuaCIJLy9pb3Blcm0gICBsaWJjNQotI2luY2x1ZGUgInN5cy9pby5oIgkvL2lvcGVybSAgIGdsaWJjCi0jZGVmaW5lIGV4dGVybgkJLy9zZWUgSU8gUG9ydCBQcm9ncmFtbWluZyBtaW5pLUhPV1RPCi0vLyNpbmNsdWRlICJhc20vaW8uaCIJLy8KLSNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJaW53KCAoaGNmX2lvKShwb3J0KSApCi0jZGVmaW5lIElOX1BPUlRfRFdPUkQocG9ydCkJCQlpbmwoIChoY2ZfaW8pKHBvcnQpICkKLSNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJb3V0dyggKGhjZl9pbykocG9ydCksIChoY2ZfMTYpKHZhbHVlKSApCi0jZGVmaW5lIE9VVF9QT1JUX0RXT1JEKHBvcnQsIHZhbHVlKQlvdXRsKCAoaGNmX2lvKShwb3J0KSwgKGhjZl8xNikodmFsdWUpICkKLSNlbHNlCi0jcHJhZ21hIHdhcm5pbmcgKCBkaXNhYmxlOiA0MDAxICkKLSNkZWZpbmUgRkFSICBfX2ZhcgkJCQkJLy8gc2VnbWVudGVkIDE2IGJpdHMgbW9kZQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxjb25pby5oPgotI2lmbmRlZiBfREVCVUcKLSNwcmFnbWEgaW50cmluc2ljKCBfaW5wLCBfaW5wdywgX291dHAsIF9vdXRwdyApCi0jZW5kaWYgLy8gX0RFQlVHCi0KLSNpZmRlZiBMT0cKLWV4dGVybiBGSUxFKiB1dG1fbG9nZmlsZTsKLWhjZl8xNglpcHcoIGhjZl8xNiBwb3J0ICk7Ci1oY2ZfOAlpcGIoIGhjZl8xNiBwb3J0ICk7Ci12b2lkCW9wdyggaGNmXzE2IHBvcnQsIGhjZl8xNiB2YWx1ZSApOwotdm9pZAlvcGIoIGhjZl8xNiBwb3J0LCBoY2ZfOCB2YWx1ZSApOwotCi0jZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJCWlwdyggKGhjZl9pbykocG9ydCkgKQotI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQlvcHcoIChoY2ZfaW8pKHBvcnQpLCAoaGNmXzE2KSh2YWx1ZSkgKQotI2Vsc2UgLy8gTE9HCi0jZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJCSgoaGNmXzE2KV9pbnB3KCAoaGNmX2lvKShwb3J0KSApKQotI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQkoKHZvaWQpX291dHB3KCAoaGNmX2lvKShwb3J0KSwgdmFsdWUgKSkKLSNlbmRpZiAvLyBMT0cKLQotI2lmIDEgLy9BU00gZXhhbXBsZQotI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbGVuKSBfX2FzbQkJXAotewkJCQkJCQkJCQkJCQkJXAotCV9fYXNtIHB1c2ggZGkJCQkJCQkJCQkJXAotCV9fYXNtIHB1c2ggZXMJCQkJCQkJCQkJXAotCV9fYXNtIG1vdiBjeCxsZW4JCQkJCQkJCQlcCi0JX19hc20gbGVzIGRpLGFkZHIJCQkJCQkJCQlcCi0JX19hc20gbW92IGR4LHBvcnQJCQkJCQkJCQlcCi0JX19hc20gcmVwIGluc3cJCQkJCQkJCQkJXAotCV9fYXNtIHBvcCBlcwkJCQkJCQkJCQlcCi0JX19hc20gcG9wIGRpCQkJCQkJCQkJCVwKLX0KLQotI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYoIHBvcnQsIGFkZHIsIGxlbikgX19hc20JCVwKLXsJCQkJCQkJCQkJCQkJCVwKLQlfX2FzbSBwdXNoIHNpCQkJCQkJCQkJCVwKLQlfX2FzbSBwdXNoIGRzCQkJCQkJCQkJCVwKLQlfX2FzbSBtb3YgY3gsbGVuCQkJCQkJCQkJXAotCV9fYXNtIGxkcyBzaSxhZGRyCQkJCQkJCQkJXAotCV9fYXNtIG1vdiBkeCxwb3J0CQkJCQkJCQkJXAotCV9fYXNtIHJlcCBvdXRzdwkJCQkJCQkJCQlcCi0JX19hc20gcG9wIGRzCQkJCQkJCQkJCVwKLQlfX2FzbSBwb3Agc2kJCQkJCQkJCQkJXAotfQotCi0jZW5kaWYJLy8gYXNtIGV4YW1wbGUKLQotI2VuZGlmIC8vIF9fR0NDX18KLQotI2lmICEgZGVmaW5lZCBJTl9QT1JUX1NUUklOR18xNgotI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbikgIHdoaWxlIChuLS0pIFwKLQl7ICooaGNmXzE2IEZBUiopYWRkciA9IElOX1BPUlRfV09SRCggcG9ydCApOyAoKGhjZl8xNiBGQVIqKWFkZHIpKys7IH0KLSNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBuKSB3aGlsZSAobi0tKSBcCi0JeyBPVVRfUE9SVF9XT1JEKCBwb3J0LCAqKGhjZl8xNiBGQVIqKWFkZHIgKTsgKChoY2ZfMTYgRkFSKilhZGRyKSsrOyB9Ci0jZW5kaWYgLy8gSU5fUE9SVF9TVFJJTkdfMTYKLQotI2VuZGlmCS8vIFdDSVRTVAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgTW90b3JvbGEgUG93ZXIgUEMgODAwIGZhbWlseSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGtub3duIHVzZXJzOiBMSEBJCi0gKi8KLQotI2lmIGRlZmluZWQgSV9NUEM4WFgKLQotI2RlZmluZSBNU0ZfQ09NUE9ORU5UX1ZBUgkJMAotI2RlZmluZSBNU0ZfQ09NUE9ORU5UX0lECQkwCi0jZGVmaW5lIE1TRl9DT01QT05FTlRfTUFKT1JfVkVSCTEKLSNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NSU5PUl9WRVIJMAotCi0jZGVmaW5lIEhDRl9IU0lfVkFSCQkJCTEKLQotI2RlZmluZSBIQ0ZfQklHX0VORElBTgkJCTEKLSNkZWZpbmUgSENGX0lPIAkJCQkJSENGX0lPX01FTQkJLy8gb3ZlcnJ1bGUgc3RhbmRhcmQgUG9ydCBJL08gd2l0aCBNZW1vcnkgbWFwcGVkIEkvTwotCi0jaW5jbHVkZSAib19wb3J0YmwuaCIKLSNpbmNsdWRlICJpcGNtY2lhLmgiCi10eXBlZGVmIG9fdWludDhfdCAgaGNmXzg7Ci10eXBlZGVmIG9fdWludDE2X3QgaGNmXzE2OwotdHlwZWRlZiBvX3VpbnQzMl90IGhjZl8zMjsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZkZWYgX2xpbnQKLSNlbHNlCi1hc20gaGNmXzE2IElOX1BPUlRfV09SRChpbnQgcG9ydCkKLXsKLSUgcmVnIHBvcnQKLSAgICBsaGJyeCByMyxyMCxwb3J0Ci0gICAgZWllaW8KLX0KLSNlbmRpZiAvLyBfbGludAotCi0KLSNpZmRlZiBfbGludAotI2Vsc2UKLWFzbSB2b2lkIE9VVF9QT1JUX1dPUkQoaW50IHBvcnQsIGhjZl8xNiB2YWx1ZSkKLXsKLSUgcmVnIHBvcnQsIHZhbHVlCi0gICAgc3RoYnJ4IHZhbHVlLHIwLHBvcnQKLSAgICBlaWVpbwotfQotI2VuZGlmIC8vIF9saW50Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbGVuKSAgICAgICAgICAgICAgIFwKLSAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHVuc2lnbmVkIGwgPSAobGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGhjZl8xNiAqZCA9ICh2b2xhdGlsZSBoY2ZfMTYgKikoYWRkcik7ICAgICAgICAgIFwKLSAgICAgIHdoaWxlIChsLS0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICpkKysgPSAqKHZvbGF0aWxlIGhjZl8xNiAqKShwb3J0KTsgICAgICAgICAgIFwKLSAgICAgICAgIEVJRUlPKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIH0KLQotI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbGVuKSAgICAgICAgICAgXAotICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgdW5zaWduZWQgbCA9IChsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaGNmXzE2ICpzID0gKHZvbGF0aWxlIGhjZl8xNiAqKShhZGRyKTsgICAgICAgICAgXAotICAgICAgd2hpbGUgKGwtLSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgKih2b2xhdGlsZSBoY2ZfMTYgKikocG9ydCkgPSAqcysrOyAgICAgICAgICAgXAotICAgICAgICAgRUlFSU8oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgfQotCi0jZW5kaWYJLy8gSV9NUEM4WFgKLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgIERpYWIgb3IgSGlnaCBDIDI5SyAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIGtub3duIHVzZXJzOiBHS0BDCi0gKi8KLQotI2lmIGRlZmluZWQgX0FNMjlLCi0KLSNkZWZpbmUgTVNGX0NPTVBPTkVOVF9WQVIJCTAKLSNkZWZpbmUgTVNGX0NPTVBPTkVOVF9JRAkJQ09NUF9JRF9BUDEKLSNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIJMQotI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUgkwCi0KLSNkZWZpbmUgSENGX0JJR19FTkRJQU4JCQkxCi0jZGVmaW5lIEhDRl9JTyAJCQkJCUhDRl9JT19NRU0JCS8vIG92ZXJydWxlIHN0YW5kYXJkIFBvcnQgSS9PIHdpdGggTWVtb3J5IG1hcHBlZCBJL08KLQotI2RlZmluZSBTd2FwQnl0ZXModCkgICAgLypsaW50IC1lNTcyKi8oKCh0KSA+PiA4KSArICgoKHQpICYgMHhmZikgPDwgOCkpLypsaW50ICtlNTcyKi8KLQotI2lmIGRlZmluZWQgX19wcGMKLSAgICAjaWZuZGVmIF9fR05VQ19fCi0gICAgICAgICNkZWZpbmUgX19hc21fXyAgICAgYXNtCi0gICAgI2VuZGlmCi0KLSAgICAjaWYgISBkZWZpbmVkIF9saW50Ci0gICAgICAgICNkZWZpbmUgRUlFSU8oKSAgICAgX19hc21fXygiIGVpZWlvIikKLSAgICAjZWxzZQotICAgICAgICAjZGVmaW5lIEVJRUlPKCkKLSAgICAjZW5kaWYKLQotICAgIHN0YXRpYyBoY2ZfMTYgSU5fUE9SVF9XT1JEKGludCBwb3J0KSB7Ci0gICAgICAgIGhjZl8xNiB2YWx1ZSA9ICoodm9sYXRpbGUgaGNmXzE2ICopKHBvcnQpOyBFSUVJTygpOwotICAgICAgICB2YWx1ZSA9IFN3YXBCeXRlcyh2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAjZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpICAgICAgXAotICAgICAgICAgICAgeyAqKHZvbGF0aWxlIGhjZl8xNiAqKShwb3J0KSA9IFN3YXBCeXRlcyh2YWx1ZSk7IEVJRUlPKCk7IH0KLSNlbHNlCi0gICAgI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkgKCoodm9sYXRpbGUgaGNmXzE2ICopKHBvcnQpKQotICAgICNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkgKCoodm9sYXRpbGUgaGNmXzE2ICopKHBvcnQpID0gKHZhbHVlKSkKLSNlbmRpZiAvLyBfX3BwYwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBsZW4pICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsID0gKGxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICBoY2ZfMTYgdCwgKmQgPSAodm9sYXRpbGUgaGNmXzE2ICopKGFkZHIpOyAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobC0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IElOX1BPUlRfV09SRChwb3J0KTsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmQrKyA9IFN3YXBCeXRlcyh0KTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBsZW4pICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsID0gKGxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICBoY2ZfMTYgdCwgKnMgPSAodm9sYXRpbGUgaGNmXzE2ICopKGFkZHIpOyAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGwtLSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAqcysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVF9QT1JUX1dPUkQocG9ydCwgU3dhcEJ5dGVzKHQpKTsgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0jaWYgUFJPRFVDVCA9PSA5MTUwCi0gICAgI2RlZmluZSBIQ0ZfQVNTRVJUCUhDRl9BU1NFUlRfTUIJLy8gbG9nZ2luZyB2aWEgTWFpbGJveAotICAgICN1bmRlZiBNU0ZfQ09NUE9ORU5UX0lECi0jZW5kaWYgLy8gOTE1MAotCi0jZW5kaWYJLy8gX0FNMjlLCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNUEM4NjAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBrbm93biB1c2VyczogUlIKLSAqLwotCi0jaWYgZGVmaW5lZCBDUFUKLSNpZiBDUFUgPT0gUFBDODYwCi0KLSNkZWZpbmUgTVNGX0NPTVBPTkVOVF9WQVIJCTAKLSNkZWZpbmUgTVNGX0NPTVBPTkVOVF9JRAkJMAotI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkxCi0jZGVmaW5lIE1TRl9DT01QT05FTlRfTUlOT1JfVkVSCTAKLQotI2RlZmluZSBIQ0ZfQklHX0VORElBTgkJCTEKLSNkZWZpbmUgSENGX0lPIAkJCQkJSENGX0lPX01FTQkJLy8gb3ZlcnJ1bGUgc3RhbmRhcmQgUG9ydCBJL08gd2l0aCBNZW1vcnkgbWFwcGVkIEkvTwotCi0jZGVmaW5lIFN3YXBCeXRlcyh0KSAgICAvKmxpbnQgLWU1NzIqLygoKHQpID4+IDgpICsgKCgodCkgJiAweGZmKSA8PCA4KSkvKmxpbnQgK2U1NzIqLwotCi0jaWZuZGVmIF9fR05VQ19fCi0gICAgI2RlZmluZSBfX2FzbV9fICAgICBhc20KLSNlbmRpZgotCi0jaWYgISBkZWZpbmVkIF9saW50Ci0gICAgI2RlZmluZSBFSUVJTygpICAgICBfX2FzbV9fKCIgZWllaW8iKQotI2Vsc2UKLSAgICAjZGVmaW5lIEVJRUlPKCkKLSNlbmRpZgotCi1zdGF0aWMgaGNmXzE2IElOX1BPUlRfV09SRChpbnQgcG9ydCkgewotICAgIGhjZl8xNiB2YWx1ZSA9ICoodm9sYXRpbGUgaGNmXzE2ICopKHBvcnQpOyBFSUVJTygpOwotICAgIHZhbHVlID0gU3dhcEJ5dGVzKHZhbHVlKTsKLSAgICByZXR1cm4gdmFsdWU7Ci0gICAgI2lmZGVmIF9fR05VQ19fCi0gICAgICAgIC8qIHRoZSBmb2xsb3dpbmcgc2VydmVzIHRvIGF2b2lkIHRoZSBjb21waWxlciB3YXJuaW5ncyB0aGF0Ci0gICAgICAgICAqIElOX1BPUlRfV09SRCgpIGlzIG5vdCB1c2VkIGluIHNvbWUgZmlsZXMgKi8KLSAgICAgICAgKHZvaWQpSU5fUE9SVF9XT1JEOwotICAgICNlbmRpZgotfQotCi0jZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpICAgICAgXAotICAgICAgICB7ICoodm9sYXRpbGUgaGNmXzE2ICopKHBvcnQpID0gU3dhcEJ5dGVzKHZhbHVlKTsgRUlFSU8oKTsgfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBsZW4pICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsID0gKGxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICBoY2ZfMTYgdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBoY2ZfMTYgKmQgPSAodm9sYXRpbGUgaGNmXzE2ICopKGFkZHIpOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobC0tKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IElOX1BPUlRfV09SRChwb3J0KTsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKmQrKyA9IFN3YXBCeXRlcyh0KTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBhZGRyLCBsZW4pICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsID0gKGxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICBoY2ZfMTYgdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBoY2ZfMTYgKnMgPSAodm9sYXRpbGUgaGNmXzE2ICopKGFkZHIpOyAgXAotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGwtLSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAqcysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVF9QT1JUX1dPUkQocG9ydCwgU3dhcEJ5dGVzKHQpKTsgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0jaWYgUFJPRFVDVCA9PSA5MTUwCi0gICAgI2RlZmluZSBIQ0ZfQVNTRVJUCUhDRl9BU1NFUlRfTUIJLy8gbG9nZ2luZyB2aWEgTWFpbGJveAotICAgICN1bmRlZiBNU0ZfQ09NUE9ORU5UX0lECi0jZW5kaWYKLQotI2VuZGlmCS8qIFBQQzg2MCAqLwotI2VuZGlmCS8qIENQVSAqLwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqICBNaWNyb3RlYyBSZXNlYXJjaCA4MFg4NiBDb21waWxlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgMAotCi0vLyN1bmRlZiBIQ0ZfVFlQRQkJCQkJCQkJCS8vIEhlcm1lcy1JIFN0YXRpb24gRi9XIHdpdGhvdXQgU1NOIHN1cHBvcnQKLQotI2RlZmluZSBNU0ZfQ09NUE9ORU5UX1ZBUiAgICAgICAwCi0jZGVmaW5lIE1TRl9DT01QT05FTlRfSUQgICAgICAgIDAKLSNkZWZpbmUgTVNGX0NPTVBPTkVOVF9NQUpPUl9WRVIgMQotI2RlZmluZSBNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUiAwCi0KLWV4dGVybiBpbnQgZmFyIGlucCggaW50ICk7Ci1leHRlcm4gdm9pZCBmYXIgb3V0cCggaW50LCBpbnQgKTsKLWV4dGVybiBpbnQgZmFyIGlucHcoIGludCApOwotZXh0ZXJuIHZvaWQgZmFyIG91dHB3KCBpbnQsIGludCApOwotCi0jZGVmaW5lIElOX1BPUlRfV09SRChwb3J0KQkJKChoY2ZfMTYpaW5wdyggKGhjZl9pbykocG9ydCkgKSkKLSNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJKCh2b2lkKW91dHB3KCAoaGNmX2lvKShwb3J0KSwgdmFsdWUgKSkKLQotI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbGVuKSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbCA9IChsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgaGNmXzE2ICpkID0gKGhjZl8xNiAqKShhZGRyKTsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGwtLSkgKmQrKyA9ICBJTl9QT1JUX1dPUkQocG9ydCk7ICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0jZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbGVuKSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbCA9IChsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgaGNmXzE2ICpzID0gKGhjZl8xNiAqKShhZGRyKTsgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsLS0pIE9VVF9QT1JUX1dPUkQocG9ydCwgKnMrKyk7ICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgkvKiBNaWNyb3RlYyA4MFg4NiBDIENvbXBpbGVyICovCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgVyBBIFYgRSBMIEEgTiAgRSBDICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBrbm93biB1c2VyczogS00KLSAqLwotCi0jaWZkZWYgbWM2ODMwMgotCi0jZGVmaW5lCU1TRl9DT01QT05FTlRfSUQJCQlDT01QX0lEX0VDCi0KLSNpbmNsdWRlIDx2ZXJzaW9uLmg+Ci0KLSNkZWZpbmUJTVNGX0NPTVBPTkVOVF9WQVIJCQkxCi0jZGVmaW5lCU1TRl9DT01QT05FTlRfTUFKT1JfVkVSCQlNQUpPUl9WRVJTSU9OCi0jZGVmaW5lCU1TRl9DT01QT05FTlRfTUlOT1JfVkVSCQlNSU5PUl9WRVJTSU9OCi0KLSNkZWZpbmUgSENGX0JJR19FTkRJQU4JCQkJMQotI2RlZmluZSBIQ0ZfSU8gCQkJCQkJSENGX0lPX01FTQkJLy8gb3ZlcnJ1bGUgc3RhbmRhcmQgUG9ydCBJL08gd2l0aCBNZW1vcnkgbWFwcGVkIEkvTwotCi0jZGVmaW5lIFN3YXBCeXRlcyh0KQkvKmxpbnQgLWU1NzIqLygoKHQpID4+IDgpICsgKCgodCkgJiAweGZmKSA8PCA4KSkvKmxpbnQgK2U1NzIqLwotCi0jZGVmaW5lIFBDTUNJQV9BRERSRVNTIDB4YzgwMDAwVUwKLQotI2RlZmluZSBJTl9QT1JUXzJCWVRFUyhwb3J0KQkJCSAoKihoY2ZfMTYgKikocG9ydCkpCi0jaWYgMAotc3RhdGljIGhjZl8xNiBJTl9QT1JUX1dPUkQoaGNmXzMyIHBvcnQpIC8vIHNob3VsZCBiZSBoY2ZfaW8sIG5vdCBoY2ZfMzIKLXsKLSAgaGNmXzE2IHdvcmQgPSBJTl9QT1JUXzJCWVRFUyhwb3J0KTsKLSAgcmV0dXJuIFN3YXBCeXRlcyh3b3JkKTsKLX0KLSNlbHNlCi1zdGF0aWMgaGNmXzE2IHN3YXBfdmFyOwotI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkgXAotICAoKChzd2FwX3ZhciA9IElOX1BPUlRfMkJZVEVTKHBvcnQpKSA+PiA4KSArICgoKHN3YXBfdmFyKSAmIDB4ZmYpIDw8IDgpKQotI2VuZGlmCi0jZGVmaW5lIE9VVF9QT1JUXzJCWVRFUyhwb3J0LCB2YWx1ZSkJICgqKGhjZl8xNiAqKShwb3J0KSA9IChoY2ZfMTYpKHZhbHVlKSkKLSNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkJCSBPVVRfUE9SVF8yQllURVMocG9ydCwgU3dhcEJ5dGVzKHZhbHVlKSkKLQotLyoKLSNkZWZpbmUgSU5fUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbGVuKQkgIFwKLQl3aGlsZSAoKGxlbiktLSkgeyooaGNmXzE2ICopKGFkZHIpID0gSU5fUE9SVF8yQllURVMocG9ydCk7ICgoY2FzdClhZGRyKSArPSAyOyB9Ci0jZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNihwb3J0LCBhZGRyLCBsZW4pCSAgXAotCXdoaWxlICgobGVuKS0tKSB7T1VUX1BPUlRfMkJZVEVTKChwb3J0KSwgKihoY2ZfMTYgKikoYWRkcikpIDsgKChjYXN0KWFkZHIpICArPSAyOyB9Ci0qLwotCi0jZW5kaWYJLyogbWM2ODMwMiAqLwotCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE5HQVAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgZGVmaW5lZCBfX1ZYX1dPUktTX18JLyogVnhXb3JrcyAqLwotCi0jaWYgZGVmaW5lZCBXTENfU1RBVElPTgotLy8jdW5kZWYgSENGX1RZUEUgCQkJCS8qIEhlcm1lcy1JIFN0YXRpb24gRi9XIHdpdGhvdXQgU1NOIHN1cHBvcnQgKi8KLSNkZWZpbmUgTVNGX0NPTVBPTkVOVF9JRAlDT01QX0lEX1ZYX1dPUktTX0VORFNUQQotI2Vsc2UKLSNkZWZpbmUgTVNGX0NPTVBPTkVOVF9JRAlDT01QX0lEX1ZYX1dPUktTX0VOREFQCi0jZW5kaWYJLy8gV0xDX1NUQVRJT04KLQotI2RlZmluZSBIQ0ZfWUlFTEQgKHRhc2tEZWxheSgwKSA9PSAwKQotCi0jZGVmaW5lICAgIE1TRl9DT01QT05FTlRfVkFSICAgICAgICAgICAgICAxCi0jZGVmaW5lICAgIE1TRl9DT01QT05FTlRfTUFKT1JfVkVSICAgICAgICAxCi0jZGVmaW5lICAgIE1TRl9DT01QT05FTlRfTUlOT1JfVkVSICAgICAgICAwCi0KLS8vICNkZWZpbmUgSENGX0FTU0VSVAlIQ0ZfQVNTRVJUX01CCS8vIGxvZ2dpbmcgdmlhIE1haWxib3gKLQotI2lmIGRlZmluZWQgUEM0ODZCU1AKLQotI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkgICAgICAgICAgICAoc3lzSW5Xb3JkICgoaGNmX2lvKShwb3J0KSkpCi0jZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCwgdmFsdWUpICAgICAgICAoc3lzT3V0V29yZCAoKGhjZl9pbykocG9ydCksIChoY2ZfMTYpICh2YWx1ZSkpKQotI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNihwb3J0LCBhZGRyLCBuKSAgICAgICAgKHN5c0luV29yZFN0cmluZyAoKGhjZl9pbykocG9ydCksIGFkZHIsIG4pKQotI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYocG9ydCwgYWRkciwgbikgICAgICAgIChzeXNPdXRXb3JkU3RyaW5nICgoaGNmX2lvKShwb3J0KSwgYWRkciwgbikpCi0KLSNlbGlmIGRlZmluZWQgQVMyMDAwQlNQCi0KLSNkZWZpbmUgSENGX0lPIAkJCQkJCUhDRl9JT19NRU0JCS8vIG92ZXJydWxlIHN0YW5kYXJkIFBvcnQgSS9PIHdpdGggTWVtb3J5IG1hcHBlZCBJL08KLQotLyogRGVmaW5lIFBDSSBzdHVmZiBoZXJlLiAqLwotdW5zaWduZWQgc2hvcnQgc3lzUmVhZDE2KCB1bnNpZ25lZCBzaG9ydCAqcG9ydCApOwotdm9pZCBzeXNXcml0ZTE2KCB1bnNpZ25lZCBzaG9ydCAqcG9ydCwgdW5zaWduZWQgc2hvcnQgdmFsdWUgKTsKLQotI2RlZmluZSBQQ0lfSU5fQllURSggcG9ydCApIFwKLQkqKHVuc2lnbmVkIGNoYXIgKikoIHBvcnQgKQotCi0jZGVmaW5lIFBDSV9JTl9XT1JEKCBwb3J0ICkgXAotCXN5c1JlYWQxNiggKHVuc2lnbmVkIHNob3J0ICopKCBwb3J0ICkgKQotCi0jZGVmaW5lIFBDSV9PVVRfQllURSggcG9ydCwgdmFsdWUgKSBcCi0JKih1bnNpZ25lZCBjaGFyICopKCBwb3J0ICkgPSAodW5zaWduZWQgY2hhcikoIHZhbHVlICkKLQotI2RlZmluZSBQQ0lfT1VUX1dPUkQoIHBvcnQsIHZhbHVlICkgXAotCXN5c1dyaXRlMTYoICh1bnNpZ25lZCBzaG9ydCAqKSggcG9ydCApLCAodW5zaWduZWQgc2hvcnQpKCB2YWx1ZSApICkKLQotI2RlZmluZSBJTl9QT1JUX1dPUkQoIHBvcnQgKSBcCi0JUENJX0lOX1dPUkQoIHBvcnQgKQotCi0jZGVmaW5lIE9VVF9QT1JUX1dPUkQoIHBvcnQsIHZhbHVlICkgXAotCVBDSV9PVVRfV09SRCggcG9ydCwgdmFsdWUgKQotCi0jZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KCBwb3J0LCBidWYsIGxlbiApIFwKLQlkbyB7IFwKLQkJaGNmXzE2ICpwOyBcCi0JIFwKLQkgCWZvciAoIHAgPSAoaGNmXzE2ICopKGJ1Zik7IHAgPCAmKCAoaGNmXzE2ICopKGJ1ZikgKVsgKGludClsZW4gXTsgcCsrICkgeyBcCi0JCQkqcCA9IFBDSV9JTl9XT1JEKCBwb3J0ICk7IFwKLQkJfSBcCi0JfSB3aGlsZSAoIDAgKQotCi0jZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNiggcG9ydCwgYnVmLCBsZW4gKSBcCi0JZG8geyBcCi0JCWNvbnN0IGhjZl8xNiAqcDsgXAotCSBcCi0JIAlmb3IgKCBwID0gKGNvbnN0IGhjZl8xNiAqKSggYnVmICk7IHAgPCAmKCAoY29uc3QgaGNmXzE2ICopKGJ1ZikgKVsgKGludClsZW4gXTsgcCsrICkgeyBcCi0JCQlQQ0lfT1VUX1dPUkQoIHBvcnQsICpwICk7IFwKLQkJfSBcCi0JfSB3aGlsZSAoIDAgKQotCi0jZWxpZiBkZWZpbmVkIEZBRFM4NjBCU1AgLyogZWxpZiBkZWZpbmVkIEFTMjAwMEJTUCAqLwotCi0jZGVmaW5lIEhDRl9CSUdfRU5ESUFOIDEKLQotI2RlZmluZSBIQ0ZfSU8gCQkJCQkJSENGX0lPX01FTQkJLy8gb3ZlcnJ1bGUgc3RhbmRhcmQgUG9ydCBJL08gd2l0aCBNZW1vcnkgbWFwcGVkIEkvTwotCi0jaWZuZGVmIF9fR05VQ19fCi0gICAgI2RlZmluZSBfX2FzbV9fICAgICBhc20KLSNlbmRpZgotCi0jaWYgISBkZWZpbmVkIF9saW50Ci0gICAgI2RlZmluZSBFSUVJTygpICAgICBfX2FzbV9fKCIgZWllaW8iKQotI2Vsc2UKLSAgICAjZGVmaW5lIEVJRUlPKCkKLSNlbmRpZgotCi1zdGF0aWMgaGNmXzE2IElOX1BPUlRfV09SRChpbnQgcG9ydCkgewotICAgIGhjZl8xNiB2YWx1ZSA9ICoodm9sYXRpbGUgaGNmXzE2ICopKHBvcnQpOyBFSUVJTygpOwotICAgIHZhbHVlID0gKCh2YWx1ZSAmIDB4ZmYwMCkgPj4gOCkgKyAoKHZhbHVlICYgMHgwMGZmKSA8PCA4KTsKLS8qICB2YWx1ZSA9IENOVl9MSVRUTEVfVE9fU0hPUlQodmFsdWUpOyAqLwotICAgIHJldHVybiB2YWx1ZTsKLSAgICAjaWZkZWYgX19HTlVDX18KLSAgICAgICAgLyogdGhlIGZvbGxvd2luZyBzZXJ2ZXMgdG8gYXZvaWQgdGhlIGNvbXBpbGVyIHdhcm5pbmdzIHRoYXQKLSAgICAgICAgICogSU5fUE9SVF9XT1JEKCkgaXMgbm90IHVzZWQgaW4gc29tZSBmaWxlcyAqLwotICAgICAgICAodm9pZClJTl9QT1JUX1dPUkQ7Ci0gICAgI2VuZGlmCi19Ci0KLSNkZWZpbmUgT1VUX1BPUlRfV09SRChwb3J0LCB2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgeyAqKHZvbGF0aWxlIGhjZl8xNiAqKShwb3J0KSA9IENOVl9TSE9SVF9UT19MSVRUTEUodmFsdWUpOyBFSUVJTygpOyB9Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbGVuKSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbCA9IChsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgaGNmXzE2ICpkID0gKHZvbGF0aWxlIGhjZl8xNiAqKShhZGRyKTsgXAotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGwtLSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkKysgPSAqKHZvbGF0aWxlIGhjZl8xNiAqKShwb3J0KTsgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVJRUlPKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0jZGVmaW5lIE9VVF9QT1JUX1NUUklOR18xNiggcG9ydCwgYWRkciwgbGVuKSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbCA9IChsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgaGNmXzE2ICpzID0gKHZvbGF0aWxlIGhjZl8xNiAqKShhZGRyKTsgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsLS0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHZvbGF0aWxlIGhjZl8xNiAqKShwb3J0KSA9ICpzKys7ICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFSUVJTygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotI2VsaWYgZGVmaW5lZCBEQVlUT05BQlNQCi0KLSNkZWZpbmUgSENGX0JJR19FTkRJQU4gMQotCi0jZGVmaW5lIEhDRl9JTyAJCQkJCQlIQ0ZfSU9fTUVNCQkvLyBvdmVycnVsZSBzdGFuZGFyZCBQb3J0IEkvTyB3aXRoIE1lbW9yeSBtYXBwZWQgSS9PCi0KLSNpZm5kZWYgX19HTlVDX18KLSAgICAjZGVmaW5lIF9fYXNtX18gICAgIGFzbQotI2VuZGlmCi0KLSNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpICAgICAgICAgICAgICAoc3lzT3Jpbm9jb0luV29yZCgodW5zaWduZWQgbG9uZykocG9ydCkpKQotI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsdmFsdWUpICAgICAgIChzeXNPcmlub2NvT3V0V29yZCgodW5zaWduZWQgbG9uZykocG9ydCksICh1bnNpZ25lZCBzaG9ydCkodmFsdWUpKSkKLQotI2RlZmluZSBJTl9QT1JUX1NUUklOR18xNihwb3J0LGFkZHIsbGVuKSAgIChzeXNPcmlub2NvSW5TdHJpbmcoKHBvcnQpLCAoYWRkciksIChsZW4pKSkKLSNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KHBvcnQsYWRkcixsZW4pICAgKHN5c09yaW5vY29PdXRTdHJpbmcoKHBvcnQpLCAoYWRkciksIChsZW4pKSkKLQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgICAgc3lzT3Jpbm9jb0luQnl0ZSAgICAodW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB1bnNpZ25lZCBzaG9ydCAgIHN5c09yaW5vY29JbldvcmQgICAgKHVuc2lnbmVkIGxvbmcgcG9ydCk7Ci1leHRlcm4gdm9pZCAgICAgICAgICAgICBzeXNPcmlub2NvSW5TdHJpbmcgICh1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIHNob3J0IGxlbik7Ci0KLWV4dGVybiB2b2lkICAgICAgICAgICAgIHN5c09yaW5vY29PdXRCeXRlICAgKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgY2hhciB2YWx1ZSk7Ci1leHRlcm4gdm9pZCAgICAgICAgICAgICBzeXNPcmlub2NvT3V0V29yZCAgICh1bnNpZ25lZCBsb25nIHBvcnQsIHVuc2lnbmVkIHNob3J0IHZhbHVlKTsKLWV4dGVybiB2b2lkICAgICAgICAgICAgIHN5c09yaW5vY29PdXRTdHJpbmcgKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuKTsKLQotI2VsaWYgZGVmaW5lZCBBTFBIQV9CU1AKLQotI2RlZmluZSBIQ0ZfQklHX0VORElBTiAxCi0KLSNkZWZpbmUgSENGX0lPIAkJCQkJCUhDRl9JT19NRU0JCS8vIG92ZXJydWxlIHN0YW5kYXJkIFBvcnQgSS9PIHdpdGggTWVtb3J5IG1hcHBlZCBJL08KLQotI2lmbmRlZiBfX0dOVUNfXwotICAgICNkZWZpbmUgX19hc21fXyAgICAgYXNtCi0jZW5kaWYKLQotI2RlZmluZSBJTl9QT1JUX1dPUkQocG9ydCkgICAgICAgICAgICAgIChzeXNPcmlub2NvSW5Xb3JkKCh1bnNpZ25lZCBsb25nKShwb3J0KSkpCi0jZGVmaW5lIE9VVF9QT1JUX1dPUkQocG9ydCx2YWx1ZSkgICAgICAgKHN5c09yaW5vY29PdXRXb3JkKCh1bnNpZ25lZCBsb25nKShwb3J0KSwgKHVuc2lnbmVkIHNob3J0KSh2YWx1ZSkpKQotCi0jZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KHBvcnQsYWRkcixsZW4pICAgKHN5c09yaW5vY29JblN0cmluZygocG9ydCksIChhZGRyKSwgKGxlbikpKQotI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYocG9ydCxhZGRyLGxlbikgICAoc3lzT3Jpbm9jb091dFN0cmluZygocG9ydCksIChhZGRyKSwgKGxlbikpKQotCi1leHRlcm4gdW5zaWduZWQgY2hhciAgICBzeXNPcmlub2NvSW5CeXRlICAgICh1bnNpZ25lZCBsb25nIHBvcnQpOwotZXh0ZXJuIHVuc2lnbmVkIHNob3J0ICAgc3lzT3Jpbm9jb0luV29yZCAgICAodW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB2b2lkICAgICAgICAgICAgIHN5c09yaW5vY29JblN0cmluZyAgKHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuKTsKLQotZXh0ZXJuIHZvaWQgICAgICAgICAgICAgc3lzT3Jpbm9jb091dEJ5dGUgICAodW5zaWduZWQgbG9uZyBwb3J0LCB1bnNpZ25lZCBjaGFyIHZhbHVlKTsKLWV4dGVybiB2b2lkICAgICAgICAgICAgIHN5c09yaW5vY29PdXRXb3JkICAgKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgc2hvcnQgdmFsdWUpOwotZXh0ZXJuIHZvaWQgICAgICAgICAgICAgc3lzT3Jpbm9jb091dFN0cmluZyAodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBzaG9ydCBsZW4pOwotCi0jZWxzZQotCi1lcnI6IC8qIGNvbW1lbnRlZCBoZXJlICovIC8qCSJCU1AgaXMgbm90IGRlZmluZWQuLi4iICovCi0KLSNlbmRpZgkvKiBlbHNlIFBDNDg2QlNQICovCi0KLSNlbmRpZgkvLyBfX1ZYX1dPUktTX18KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICBWWFdPUktTLiBNb3Rvcm9sYSBTYW5kcG9pbnQgUG93ZXJQQyA4MjRYICoqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBfX1ZYX1dPUktTX1NBTkRQT0lOVF84MjRYX18KLQotI2luY2x1ZGUgPHZ4V29ya3MuaD4KLSNpbmNsdWRlIDxzeXNMaWIuaD4KLSNpbmNsdWRlIDx0YXNrTGliLmg+Ci0KLSNpZmRlZiBXVkxBTl81MwotI2RlZmluZQlNU0ZfQ09NUE9ORU5UX0lEICAgICAgICAgICAgQ09NUF9JRF9WWF9XT1JLU19FTkRTVEEKLSNlbmRpZiAvKiBXVkxBTl81MyAqLwotCi0jaWZkZWYgV1ZMQU5fNTQKLSNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRCAgICAgICAgICAgIENPTVBfSURfVlhfV09SS1NfRU5EQVAKLSNlbmRpZiAvKiBXVkxBTl81NCAqLwotCi0jaWZkZWYgV1ZMQU5fNTYKLSNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRCAgICAgICAgICAgIENPTVBfSURfVlhfV09SS1NfRU5ECi0jZW5kaWYgLyogV1ZMQU5fNTYgKi8KLQotI2lmICFkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQKLSNlcnJvciAieW91IG11c3QgZGVmaW5lIGFuIE1TRiBjb21wb25lbnQgSUQ6IFdWTEFOXzUzLCBXVkxBTl81NCwgV1ZMQU5fNTYiCi0jZW5kaWYKLQotI2RlZmluZQlNU0ZfQ09NUE9ORU5UX1ZBUgkJCTEKLQotI2RlZmluZSBIQ0ZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgIEhDRl9FWFRfSU5GT19MT0cKLSNkZWZpbmUgSENGX1NMRUVQICAgICAgICAgICAgICAgICAgICAgICAoIEhDRl9DRFMgfCBIQ0ZfRERTICkKLS8vI2RlZmluZSBIQ0ZfU0xFRVAgICAgICAgICAgICAgICAgICAgICAgICggSENGX0REUyApCi0KLSNpZm5kZWYgSENGX0FDVF9XQUtFVVAKLSNkZWZpbmUgSENGX0FDVF9XQUtFVVAgICAgICAgICAgICAgICAgICAweDFECi0jZW5kaWYgLy8gSENGX0FDVF9XQUtFVVAKLQotI2lmIGRlZmluZWQgRkFUTklDIHwgZGVmaW5lZCBCRUFHTEVfSDI1MwotI2RlZmluZSBUMV9fSENGX1RZUEUgICAgICAgICAgICAgICAgICAgIEhDRl9UWVBFX1NUQQotI2Vsc2UKLSNkZWZpbmUgVDFfX0hDRl9UWVBFICAgICAgICAgICAgICAgICAgICBIQ0ZfVFlQRV9BUCB8IEhDRl9UWVBFX1NUQQotI2VuZGlmCi0KLSNpZmRlZiBIRVJNRVNfVVNCCi0jZGVmaW5lIFQyX19IQ0ZfVFlQRQkJCQkJKFQxX19IQ0ZfVFlQRSB8IEhDRl9UWVBFX1VTQikKLSNlbHNlIC8vIEhFUk1FU19VU0IKLSNkZWZpbmUgVDJfX0hDRl9UWVBFCQkJCQkoVDFfX0hDRl9UWVBFKQotI2VuZGlmIC8vIEhFUk1FU19VU0IKLQotI2lmZGVmIF9XQVJQCi0jZGVmaW5lIFQzX19IQ0ZfVFlQRQkJCQkJKFQyX19IQ0ZfVFlQRSB8IEhDRl9UWVBFX0hJSTUpCi0jZWxzZSAvLyBfV0FSUAotI2RlZmluZSBUM19fSENGX1RZUEUJCQkJCShUMl9fSENGX1RZUEUgfCBIQ0ZfVFlQRV9XUEEgfCBIQ0ZfVFlQRV9ISUkpCi0jZW5kaWYgLy8gV0FSUAotCi0jaWZkZWYgX0NDWAotI2RlZmluZSBUNF9fSENGX1RZUEUJCQkJCShUM19fSENGX1RZUEUgfCBIQ0ZfVFlQRV9DQ1gpCi0jZWxzZSAvLyBfV0FSUAotI2RlZmluZSBUNF9fSENGX1RZUEUJCQkJCShUM19fSENGX1RZUEUpCi0jZW5kaWYgLy8gX0NDWAotCi0jZGVmaW5lIFQ1X19IQ0ZfVFlQRQkJCQkJKFQ0X19IQ0ZfVFlQRSkKLQotLy8gRGVmYXVsdCB0byBUWVBFX0FQICsgU1NOIQotI2RlZmluZSBIQ0ZfVFlQRQkJCQkJCShUNV9fSENGX1RZUEUgKQotCi0KLQotI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkJMgotI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUgkJMAotCi0jZGVmaW5lIEhDRl9JTyAgICAgICAgICAgICAgICAgICAgICBIQ0ZfSU9fTUVNCi0jZGVmaW5lIEhDRl9ETUEgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEhDRl9NRU1fSU8gICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIEhDRl9CSUdfRU5ESUFOICAgICAgICAgICAgICAxCi0KLS8vI2RlZmluZSBzdXBwb3J0XzMyYml0cyAxCi0KLSNkZWZpbmUgSU5fUE9SVF9XT1JEKHBvcnQpCQkJICAgICAgICAoc3lzSW5Xb3JkKCAoaGNmX2lvKShwb3J0KSApKQotI2RlZmluZSBPVVRfUE9SVF9XT1JEKHBvcnQsIHZhbHVlKQkgICAgICAgIChzeXNPdXRXb3JkKCAoaGNmX2lvKShwb3J0KSwgKGhjZl8xNikodmFsdWUpICkpCi0jZGVmaW5lIElOX1BPUlRfRFdPUkQocG9ydCkJCQkgICAgICAgIChzeXNJbkxvbmcoIChoY2ZfaW8pKHBvcnQpICkpCi0jZGVmaW5lIE9VVF9QT1JUX0RXT1JEKHBvcnQsIHZhbHVlKQkgICAgICAgIChzeXNPdXRMb25nKCAoaGNmX2lvKShwb3J0KSwgKGhjZl8xNikodmFsdWUpICkpCi0jZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGRzdCwgbikJICAgIChzeXNJbldvcmRTdHJpbmcoKGhjZl9pbykocG9ydCksIChoY2ZfMTYgKilkc3QsIG4pKQotI2RlZmluZSBPVVRfUE9SVF9TVFJJTkdfMTYocG9ydCwgc3JjLCBuKSAgICAoc3lzT3V0V29yZFN0cmluZygoaGNmX2lvKShwb3J0KSwgKGhjZl8xNiAqKXNyYywgbikpCi0KLSNpZmRlZiBXVkxBTl9ERUJVRwotI2RlZmluZSBEQkcgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBfREVCVUcgICAgICAgICAgICAgICAgICAgICAgMQotI2VuZGlmCi0KLS8qIHdlJ2xsIG5lZWQgdG8gYWRkIHRoZXNlIHByaW50cyBzb21lZGF5ICovCi0jZGVmaW5lIE9VVFBVVERFQlVHTVNHKGRwcmludGZfZXhwKQotI2RlZmluZSBBU1NFUlRERUJVR01TRyhjb25kLCBkcHJpbnRmX2V4cCkKLQotI2RlZmluZSBIQ0ZfSU5URVJGQUNFX0NPTk5FQ1QoaWZicCkKLSNkZWZpbmUgSENGX0lOVEVSRkFDRV9ESVNDT05ORUNUKGlmYnApCi0jZGVmaW5lIEhDRl9FTlRFUl9JTlRFUkZBQ0VfRlVOQ1QoaWJmYikKLSNkZWZpbmUgSENGX0xFQVZFX0lOVEVSRkFDRV9GVU5DVChpZmJwKQotCi0jZGVmaW5lIENOVl9FTkRfSU5UKHcpICAgICggKChoY2ZfMTYpKHcpICYgMHgwMEZGKSA8PCA4IHwgKChoY2ZfMTYpKHcpICYgMHhGRjAwKSA+PiA4ICkKLSNkZWZpbmUgQ05WX0xJVFRMRV9UT19JTlQodykJQ05WX0VORF9JTlQodykKLSNkZWZpbmUgQ05WX0lOVF9UT19MSVRUTEUodykJQ05WX0xJVFRMRV9UT19JTlQodykKLQotI2VuZGlmIC8qIF9fVlhfV09SS1NfU0FORFBPSU5UXzgyNFhfXyAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFZYV09SS1MuIEFSTSBUODMwMCBJUFBob25lICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWYgZGVmaW5lZCggSVBUX1Q4MzAwICkgfHwgZGVmaW5lZCggSVBUX1Q4MzA3ICkKLQotI2luY2x1ZGUgPHZ4V29ya3MuaD4KLSNpbmNsdWRlIDxzeXNMaWIuaD4KLSNpbmNsdWRlIDx0YXNrTGliLmg+Ci0KLSNkZWZpbmUgSENGX0FMSUdOICAgICAgICAgICAgICAgICAgIDQgICAgICAgLyogZGVmYXVsdCB0byA0IGJ5dGUgYWxpZ25tZW50ICovCi0KLSNkZWZpbmUgQkVBR0xFX0gyNTMJLyogSGVybWVzIDIuNS4zIGJ1aWxkLCBiZXR0ZXIgdG8gYmUgaW4gdGhlIHByb2plY3QgZmlsZSAqLwotI2RlZmluZSBPT1JfRERTCQkvKiBIZXJtZXMgMi41LjMgYnVpbGQsIGJldHRlciB0byBiZSBpbiB0aGUgcHJvamVjdCBmaWxlICovCi0jZGVmaW5lIEZBVE5JQwotCi0KLSNpZmRlZiBXVkxBTl81MwotI2RlZmluZQlNU0ZfQ09NUE9ORU5UX0lEICAgICAgICAgICAgQ09NUF9JRF9WWF9XT1JLU19FTkRTVEEKLSNlbmRpZiAvKiBXVkxBTl81MyAqLwotCi0jaWZkZWYgV1ZMQU5fNTQKLSNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRCAgICAgICAgICAgIENPTVBfSURfVlhfV09SS1NfRU5EQVAKLSNlbmRpZiAvKiBXVkxBTl81NCAqLwotCi0jaWZkZWYgV1ZMQU5fNTYKLSNkZWZpbmUJTVNGX0NPTVBPTkVOVF9JRCAgICAgICAgICAgIENPTVBfSURfVlhfV09SS1NfRU5ECi0jZW5kaWYgLyogV1ZMQU5fNTYgKi8KLQotI2lmICFkZWZpbmVkIE1TRl9DT01QT05FTlRfSUQKLSNlcnJvciAieW91IG11c3QgZGVmaW5lIGFuIE1TRiBjb21wb25lbnQgSUQ6IFdWTEFOXzUzLCBXVkxBTl81NCwgV1ZMQU5fNTYiCi0jZW5kaWYKLQotI2RlZmluZQlNU0ZfQ09NUE9ORU5UX1ZBUgkJCTEKLQotI2RlZmluZSBIQ0ZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgIEhDRl9FWFRfSU5GT19MT0cKLS8vI2RlZmluZSBIQ0ZfRVhUICAgICAgICAgICAgICAgICAgICAgICAgIEhDRl9FWFRfSU5GT19MT0cgfCBIQ0ZfRVhUX01CCi0jZGVmaW5lIEhDRl9TTEVFUCAgICAgICAgICAgICAgICAgICAgICAgKCBIQ0ZfQ0RTIHwgSENGX0REUyApCi0vLyNkZWZpbmUgSENGX1NMRUVQICAgICAgICAgICAgICAgICAgICAgICAoIEhDRl9ERFMgKQotCi0jaWZuZGVmIEhDRl9BQ1RfV0FLRVVQCi0jZGVmaW5lIEhDRl9BQ1RfV0FLRVVQICAgICAgICAgICAgICAgICAgMHgxRAotI2VuZGlmIC8vIEhDRl9BQ1RfV0FLRVVQCi0KLSNpZiBkZWZpbmVkIEZBVE5JQyB8fCBkZWZpbmVkIEJFQUdMRV9IMjUzCi0jZGVmaW5lIFQxX19IQ0ZfVFlQRSAgICAgICAgICAgICAgICAgICAgSENGX1RZUEVfU1RBCi0jZWxzZQotLy8jZGVmaW5lIFQxX19IQ0ZfVFlQRSAgICAgICAgICAgICAgICAgICAgSENGX1RZUEVfQVAgfCBIQ0ZfVFlQRV9TVEEKLSNkZWZpbmUgVDFfX0hDRl9UWVBFICAgICAgICAgICAgICAgICAgICBIQ0ZfVFlQRV9TVEEJCS8qIGR6LCBTdGF0aW9uIGNvZGUgb25seSAqLwotI2VuZGlmCi0KLSNpZmRlZiBIRVJNRVNfVVNCCi0jZGVmaW5lIFQyX19IQ0ZfVFlQRQkJCQkJKFQxX19IQ0ZfVFlQRSB8IEhDRl9UWVBFX1VTQikKLSNlbHNlIC8vIEhFUk1FU19VU0IKLSNkZWZpbmUgVDJfX0hDRl9UWVBFCQkJCQkoVDFfX0hDRl9UWVBFKQotI2VuZGlmIC8vIEhFUk1FU19VU0IKLQotI2lmZGVmIF9XQVJQCi0jZGVmaW5lIFQzX19IQ0ZfVFlQRQkJCQkJKFQyX19IQ0ZfVFlQRSB8IEhDRl9UWVBFX0hJSTUpCi0jZWxzZSAvLyBfV0FSUAotI2RlZmluZSBUM19fSENGX1RZUEUJCQkJCShUMl9fSENGX1RZUEUgfCBIQ0ZfVFlQRV9XUEEgfCBIQ0ZfVFlQRV9ISUkpCi0vLyNkZWZpbmUgVDNfX0hDRl9UWVBFCQkJCQkoVDJfX0hDRl9UWVBFIHwgSENGX1RZUEVfSElJKQkvKiBkei4gbm8gV1BBIHN1cHBvcnQgYXQgdGhpcyB0aW1lLCB0ZXN0IGNvZGUgKi8KLSNlbmRpZiAvLyBXQVJQCi0KLSNpZmRlZiBfQ0NYCi0jZGVmaW5lIFQ0X19IQ0ZfVFlQRQkJCQkJKFQzX19IQ0ZfVFlQRSB8IEhDRl9UWVBFX0NDWCkKLSNlbHNlIC8vIF9XQVJQCi0jZGVmaW5lIFQ0X19IQ0ZfVFlQRQkJCQkJKFQzX19IQ0ZfVFlQRSkKLSNlbmRpZiAvLyBfQ0NYCi0KLSNkZWZpbmUgVDVfX0hDRl9UWVBFCQkJCQkoVDRfX0hDRl9UWVBFKQotCi0vLyBEZWZhdWx0IHRvIFRZUEVfQVAgKyBTU04hCi0jZGVmaW5lIEhDRl9UWVBFCQkJCQkJKFQ1X19IQ0ZfVFlQRSApCi0KLQotI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01BSk9SX1ZFUgkJMgotI2RlZmluZQlNU0ZfQ09NUE9ORU5UX01JTk9SX1ZFUgkJMAotCi0jZGVmaW5lIEhDRl9JTyAgICAgICAgICAgICAgICAgICAgICBIQ0ZfSU9fTUVNCi0jZGVmaW5lIEhDRl9ETUEgICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEhDRl9NRU1fSU8gICAgICAgICAgICAgICAgICAxCi0KLQotLyogRW5kaWFuIGlzIGRldGVybWluZWQgYnkgdnhXb3JrcyBwcm9qZWN0IGNvbXBpbGUgb3B0aW9uICovCi0jaWYgKF9CWVRFX09SREVSID09IF9CSUdfRU5ESUFOKQotI3VuZGVmICBIQ0ZfTElUVExFX0VORElBTgotI2RlZmluZSBIQ0ZfQklHX0VORElBTiAgICAgICAgICAgICAgMQotI2VuZGlmCi0KLQotI2RlZmluZSBDTlZfRU5EKHcpICAgICggKChoY2ZfMTYpKHcpICYgMHgwMEZGKSA8PCA4IHwgKChoY2ZfMTYpKHcpICYgMHhGRjAwKSA+PiA4ICkKLSNpZiBkZWZpbmVkIEhDRl9CSUdfRU5ESUFOCi0vLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEIgSSBHICAgRSBOIEQgSSBBIE4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotI2RlZmluZSBDTlZfTElUVExFX1RPX0lOVCh3KSAgICBDTlZfRU5EKHcpCS8vICAgIGVuZGlhbmVzcyBjb252ZXJzaW9uIG5lZWRlZAotI2RlZmluZSBDTlZfQklHX1RPX0lOVCh3KQkJKHcpCQkJLy8gbm8gZW5kaWFuZXNzIGNvbnZlcnNpb24gbmVlZGVkCi0jZWxzZQotLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTCBJIFQgVCBMIEUgICBFIE4gRCBJIEEgTiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0jZGVmaW5lIENOVl9MSVRUTEVfVE9fSU5UKHcpIAkodykJCQkvLyBubyBlbmRpYW5lc3MgY29udmVyc2lvbiBuZWVkZWQKLSNkZWZpbmUgQ05WX0JJR19UT19JTlQodykgICAgICAgQ05WX0VORCh3KQkvLyAgICBlbmRpYW5lc3MgY29udmVyc2lvbiBuZWVkZWQKLSNlbmRpZiAvLyBIQ0ZfQklHX0VORElBTgotCi0vLyBjb252ZXJzaW9uIG1hY3JvcyB3aGljaCBjYW4gYmUgZXhwcmVzc2VkIGluIG90aGVyIG1hY3JvcwotI2RlZmluZSBDTlZfSU5UX1RPX0xJVFRMRSh3KQlDTlZfTElUVExFX1RPX0lOVCh3KQotI2RlZmluZSBDTlZfSU5UX1RPX0JJRyh3KQkJQ05WX0JJR19UT19JTlQodykKLQotCi0KLSNkZWZpbmUgSU5fUE9SVF9XT1JEKCBwb3J0ICkgICAgICAgICAgICAqKCh2b2xhdGlsZSBoY2ZfMTYgKikoIHBvcnQgKSkKLSNkZWZpbmUgT1VUX1BPUlRfV09SRCggcG9ydCwgdmFsdWUgKSAgICAqKCh2b2xhdGlsZSBoY2ZfMTYgKikoIHBvcnQgKSkgPSAoKGhjZl8xNikoIHZhbHVlICkpCi0vLyNkZWZpbmUgSU5fUE9SVF9CWVRFKCBwb3J0ICkgICAgICAgICAgICAqKCh2b2xhdGlsZSBoY2ZfOCAqKSggcG9ydCApKQotCi0jZGVmaW5lIElOX1BPUlRfU1RSSU5HKCBwb3J0LCBhZGRyLCBsZW4pIHsJCVwKLQl1bnNpZ25lZCBsID0gbGVuOwkJCQkJCQkJXAotCWhjZl8xNiAgKmQgPSAoaGNmXzE2ICopKGFkZHIpOwkJCQkJXAotCWhjZl8xNiAgIHQ7CQkJCQkJCQkJCVwKLQl3aGlsZSAobC0tKSB7CQkJCQkJCQkJXAotCQl0ID0gSU5fUE9SVF9XT1JEKHBvcnQpOwkJCQkJCVwKLQkJKmQrKyA9IENOVl9MSVRUTEVfVE9fSU5UKHQpOwkJCQlcCi0JfQkJCQkJCQkJCQkJCVwKLX0gLy8gSU5fUE9SVF9TVFJJTkcKLQotI2RlZmluZSBPVVRfUE9SVF9TVFJJTkcoIHBvcnQsIGFkZHIsIGxlbikgewkJXAotCXVuc2lnbmVkIGwgPSAobGVuKTsJCQkJCQkJCVwKLQloY2ZfMTYgICpzID0gKGhjZl8xNiAqKShhZGRyKTsJCQkJCVwKLQloY2ZfMTYgICB0OwkJCQkJCQkJCQlcCi0Jd2hpbGUgKGwtLSkgewkJCQkJCQkJCVwKLQkJdCA9ICpzKys7CQkJCQkJCQkJXAotCQl0ID0gQ05WX0xJVFRMRV9UT19JTlQodCk7CQkJCQlcCi0JCU9VVF9QT1JUX1dPUkQocG9ydCwgdCk7CQkJCQkJXAotCX0JCQkJCQkJCQkJCQlcCi19IC8vIE9VVF9QT1JUX1NUUklORwotCi0jZGVmaW5lIElOX1BPUlRfU1RSSU5HXzE2KHBvcnQsIGRzdCwgbikJICAgIHsJXAotCXVuc2lnbmVkIGwgPSAobik7CQkJCQkJCQlcCi0JaGNmXzE2ICAqZCA9IChoY2ZfMTYgKikoZHN0KTsJCQkJCVwKLQl3aGlsZSAobC0tKSB7CQkJCQkJCQkJXAotCQkqZCsrID0gSU5fUE9SVF9XT1JEKHBvcnQpOwkJCQkJXAotCX0JCQkJCQkJCQkJCQlcCi19IC8vIElOX1BPUlRfU1RSSU5HXzE2Ci0KLSNkZWZpbmUgT1VUX1BPUlRfU1RSSU5HXzE2KHBvcnQsIHNyYywgbikJewlcCi0JaGNmXzE2ICAgdDsJCQkJCQkJCQkJXAotCWludCBsID0gKG4pOwkJCQkJCQkJCVwKLQloY2ZfMTYgICpzID0gKGhjZl8xNiAqKShzcmMpOwkJCQkJXAotCXdoaWxlIChsLS0pIHsJCQkJCQkJCQlcCi0JCXQgPSAqcysrOwkJCQkJCQkJCVwKLQkJT1VUX1BPUlRfV09SRChwb3J0LCB0KTsJCQkJCQlcCi0JfQkJCQkJCQkJCQkJCVwKLX0gLy8gT1VUX1BPUlRfU1RSSU5HXzE2Ci0KLS8qICNkZWZpbmUgSENGX1lJRUxEICAgICAgICAgICAgICAgICAgICAgICAodGFza0RlbGF5KDApID09IDApICovCi0KLQotCi0jaWZkZWYgV1ZMQU5fREVCVUcKLSNkZWZpbmUgREJHICAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgX0RFQlVHICAgICAgICAgICAgICAgICAgICAgIDEKLSNlbmRpZgotCi0vKiB3ZSdsbCBuZWVkIHRvIGFkZCB0aGVzZSBwcmludHMgc29tZWRheSAqLwotI2RlZmluZSBPVVRQVVRERUJVR01TRyhkcHJpbnRmX2V4cCkKLSNkZWZpbmUgQVNTRVJUREVCVUdNU0coY29uZCwgZHByaW50Zl9leHApCi0KLSNkZWZpbmUgSENGX0lOVEVSRkFDRV9DT05ORUNUKGlmYnApCi0jZGVmaW5lIEhDRl9JTlRFUkZBQ0VfRElTQ09OTkVDVChpZmJwKQotI2RlZmluZSBIQ0ZfRU5URVJfSU5URVJGQUNFX0ZVTkNUKGliZmIpCi0jZGVmaW5lIEhDRl9MRUFWRV9JTlRFUkZBQ0VfRlVOQ1QoaWZicCkKLQotI2RlZmluZSBzeXNJbldvcmQob2Zmc2V0QWRkcikgIElOX1BPUlRfV09SRChvZmZzZXRBZGRyKQotI2RlZmluZSBzeXNJbkJ5dGUob2Zmc2V0QWRkcikgIElOX1BPUlRfQllURShvZmZzZXRBZGRyKQotI2RlZmluZSBzeXNPdXRXb3JkKGFkZHIsIHZhbHVlKSBPVVRfUE9SVF9XT1JEKGFkZHIsIHZhbHVlKQotCi0jZW5kaWYgLypJUFRfVDgzMDAgKi8KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMjAwMywxMCArNDc4LDYgQEAKICNkZWZpbmUgCQlIQ0ZfQklHX0VORElBTgkJMAogI2VuZGlmIC8vIAkJSENGX0JJR19FTkRJQU4KIAotI2lmICEgZGVmaW5lZAlIQ0ZfRExfT05MWQotI2RlZmluZSAJCUhDRl9ETF9PTkxZCQkJMAotI2VuZGlmIC8vIAkJSENGX0RMX09OTFkKLQogI2lmICEgZGVmaW5lZAlIQ0ZfRE1BCiAjZGVmaW5lIAkJSENGX0RNQQkJCQkwCiAjZW5kaWYgLy8gCQlIQ0ZfRE1BCkBAIC0yMDE1LDE0ICs0ODYsNiBAQAogI2RlZmluZQkJCUhDRl9FTkNBUAkJCUhDRl9FTkMKICNlbmRpZiAvLwkJSENGX0VOQ0FQCiAKLSNpZiAhIGRlZmluZWQJSENGX0VOVFJZCi0jZGVmaW5lCQkJSENGX0VOVFJZKCBpZmJwICkKLSNlbmRpZiAvLwkJSENGX0VOVFJZCi0KLSNpZiAhIGRlZmluZWQJSENGX0VYSVQKLSNkZWZpbmUJCQlIQ0ZfRVhJVCggaWZicCApCi0jZW5kaWYgLy8JCUhDRl9FWElUCi0KICNpZiAhIGRlZmluZWQJSENGX0VYVAogI2RlZmluZQkJCUhDRl9FWFQJCQkJMAogI2VuZGlmIC8vCQlIQ0ZfRVhUCkBAIC0yMDY0LDExICs1MjcsNiBAQAogI2RlZmluZQkJCUhDRl9CSUdfRU5ESUFOCQkxCQkvL2p1c3QgZm9yIGNvbnZlbmllbmNlIG9mIGdlbmVyYXRpbmcgY2ZnX2hjZl9vcHQKICNlbmRpZiAvLwkgCUhDRl9CSUdfRU5ESUFOCiAKLSNpZgkJCQlIQ0ZfRExfT05MWQotI3VuZGVmCQkJSENGX0RMX09OTFkKLSNkZWZpbmUJCQlIQ0ZfRExfT05MWQkJCTEJCS8vanVzdCBmb3IgY29udmVuaWVuY2Ugb2YgZ2VuZXJhdGluZyBjZmdfaGNmX29wdAotI2VuZGlmIC8vCQlIQ0ZfRExfT05MWQotCiAjaWYJCQkJSENGX0RNQQogI3VuZGVmCQkJSENGX0RNQQogI2RlZmluZQkJCUhDRl9ETUEJCQkJMQkJLy9qdXN0IGZvciBjb252ZW5pZW5jZSBvZiBnZW5lcmF0aW5nIGNmZ19oY2Zfb3B0CkBAIC0yMjQ0LDIxICs3MDIsOSBAQAogI2RlZmluZQkJCVRFWFQoeCkJeAogI2VuZGlmIC8vCQlURVhUCiAKLSNpZiAhZGVmaW5lZAlfVENIQVJfREVGSU5FRAotI2RlZmluZSAJCVRDSEFSCWNoYXIKLSNlbmRpZiAvLwkJX1RDSEFSX0RFRklORUQKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKiBDIE8gTiBGIEwgSSBDIFQgICBEIEUgVCBFIEMgVCBJIE8gTiAgJiAgUiBFIFMgTyBMIFUgVCBJIE8gTiAqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIGRlZmluZWQgSENGX0xJVFRMRV9FTkRJQU4KLWVycjogSENGX0xJVFRMRV9FTkRJQU4gaXMgb2Jzb2xldGU7Ci0jZW5kaWYgLy8gCUhDRl9MSVRUTEVfRU5ESUFOCi0KLSNpZiBkZWZpbmVkIEhDRl9JTlRfT0ZGCi1lcnI6IEhDRl9JTlRfT0ZGIGlzIG9ic29sZXRlOwotI2VuZGlmIC8vSENGX0lOVF9PRkYKLQogI2lmIEhDRl9BTElHTiAhPSAxICYmIEhDRl9BTElHTiAhPSAyICYmIEhDRl9BTElHTiAhPSA0ICYmIEhDRl9BTElHTiAhPSA4CiBlcnI6IGludmFsaWQgdmFsdWUgZm9yIEhDRl9BTElHTjsKICNlbmRpZiAvLyBIQ0ZfQUxJR04KQEAgLTIyNzYsMTAgKzcyMiw2IEBACiBlcnI6IGludmFsaWQgdmFsdWUgZm9yIEhDRl9CSUdfRU5ESUFOOwogI2VuZGlmIC8vIEhDRl9CSUdfRU5ESUFOCiAKLSNpZiBIQ0ZfRExfT05MWSAhPSAwICYmIEhDRl9ETF9PTkxZICE9IDEKLWVycjogaW52YWxpZCB2YWx1ZSBmb3IgSENGX0RMX09OTFk7Ci0jZW5kaWYgLy8gSENGX0RMX09OTFkKLQogI2lmIEhDRl9ETUEgIT0gMCAmJiBIQ0ZfRE1BICE9IDEKIGVycjogaW52YWxpZCB2YWx1ZSBmb3IgSENGX0RNQTsKICNlbmRpZiAvLyBIQ0ZfRE1BCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9oY2ZkZWYuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZmRlZi5oCmluZGV4IGNiMTk2NmQuLmE2MmI1M2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZmRlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL2hjZmRlZi5oCkBAIC0xLDI4NiArMSwyNDkgQEAKLQotLy8gICB2aW06dHc9MTEwOnRzPTQ6CiAjaWZuZGVmIEhDRkRFRkNfSAogI2RlZmluZSBIQ0ZERUZDX0ggMQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBGSUxFCSA6IEhDRkRFRi5ICi0qCi0qIERBVEUgICA6ICREYXRlOiAyMDA0LzA4LzA1IDExOjQ3OjEwICQgICAkUmV2aXNpb246IDEuOCAkCi0qIE9yaWdpbmFsOiAyMDA0LzA1LzI4IDE0OjA1OjM1ICAgIFJldmlzaW9uOiAxLjU5ICAgICAgVGFnOiBoY2Y3X3QyMDA0MDYwMl8wMQotKiBPcmlnaW5hbDogMjAwNC8wNS8xMyAxNTozMTo0NSAgICBSZXZpc2lvbjogMS41MyAgICAgIFRhZzogaGNmN190N18yMDA0MDUxM18wMQotKiBPcmlnaW5hbDogMjAwNC8wNC8xNSAwOToyNDo0MiAgICBSZXZpc2lvbjogMS40NCAgICAgIFRhZzogaGNmN190N18yMDA0MDQxNV8wMQotKiBPcmlnaW5hbDogMjAwNC8wNC8xMyAxNDoyMjo0NSAgICBSZXZpc2lvbjogMS40MyAgICAgIFRhZzogdDdfMjAwNDA0MTNfMDEKLSogT3JpZ2luYWw6IDIwMDQvMDQvMDEgMTU6MzI6NTUgICAgUmV2aXNpb246IDEuNDAgICAgICBUYWc6IHQ3XzIwMDQwNDAxXzAxCi0qIE9yaWdpbmFsOiAyMDA0LzAzLzEwIDE1OjM5OjI4ICAgIFJldmlzaW9uOiAxLjM2ICAgICAgVGFnOiB0MjAwNDAzMTBfMDEKLSogT3JpZ2luYWw6IDIwMDQvMDMvMDMgMTQ6MTA6MTIgICAgUmV2aXNpb246IDEuMzQgICAgICBUYWc6IHQyMDA0MDMwNF8wMQotKiBPcmlnaW5hbDogMjAwNC8wMy8wMiAwOToyNzoxMiAgICBSZXZpc2lvbjogMS4zMiAgICAgIFRhZzogdDIwMDQwMzAyXzAzCi0qIE9yaWdpbmFsOiAyMDA0LzAyLzI0IDEzOjAwOjI5ICAgIFJldmlzaW9uOiAxLjI5ICAgICAgVGFnOiB0MjAwNDAyMjRfMDEKLSogT3JpZ2luYWw6IDIwMDQvMDIvMTggMTc6MTM6NTcgICAgUmV2aXNpb246IDEuMjYgICAgICBUYWc6IHQyMDA0MDIxOV8wMQotKgotKiBBVVRIT1IgOiBOaWNvIFZhbHN0ZXIKLSoKLSogU1BFQ0lGSUNBVElPTjogLi4uLi4uLi4uLi4KLSoKLSogREVTQyAgIDogRGVmaW5pdGlvbnMgYW5kIFByb3RvdHlwZXMgZm9yIEhDRiBvbmx5Ci0qCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKgotKiBTT0ZUV0FSRSBMSUNFTlNFCi0qCi0qIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zLAotKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCi0qIHNvZnR3YXJlIGluZGljYXRlcyB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMuICBJZiB5b3UgZG8KLSogbm90IGFncmVlIHdpdGggdGhlc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMsIGRvIG5vdCB1c2UgdGhlIHNvZnR3YXJlLgotKgotKiBDT1BZUklHSFQgqSAxOTk0IC0gMTk5NQlieSBBVCZULgkJCQlBbGwgUmlnaHRzIFJlc2VydmVkCi0qIENPUFlSSUdIVCCpIDE5OTYgLSAyMDAwIGJ5IEx1Y2VudCBUZWNobm9sb2dpZXMuCUFsbCBSaWdodHMgUmVzZXJ2ZWQKLSogQ09QWVJJR0hUIKkgMjAwMSAtIDIwMDQJYnkgQWdlcmUgU3lzdGVtcyBJbmMuCUFsbCBSaWdodHMgUmVzZXJ2ZWQKLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotKgotKiAuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpcwotKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcwotKiAgICB3ZWxsIGFzIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSogICAgZGlzdHJpYnV0aW9uLgotKgotKiAuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKLSogICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgotKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSoKLSogLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFnZXJlIFN5c3RlbXMgSW5jLiBub3IgdGhlIG5hbWVzIG9mIHRoZSBjb250cmlidXRvcnMKLSogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0qICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotKgotKiBEaXNjbGFpbWVyCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAotKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi0qIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBBTlkKLSogVVNFLCBNT0RJRklDQVRJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRISVMgU09GVFdBUkUgSVMgU09MRUxZIEFUIFRIRSBVU0VSUyBPV04KLSogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQotKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0qIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIENPTlRSQUNULCBTVFJJQ1QKLSogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKLSogREFNQUdFLgotKgotKgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAqCisgKiBGSUxFICAgOiBIQ0ZERUYuSAorICoKKyAqIERBVEUgICA6ICREYXRlOiAyMDA0LzA4LzA1IDExOjQ3OjEwICQgICAkUmV2aXNpb246IDEuOCAkCisgKiBPcmlnaW5hbDogMjAwNC8wNS8yOCAxNDowNTozNSAgICBSZXZpc2lvbjogMS41OSAgICAgIFRhZzogaGNmN190MjAwNDA2MDJfMDEKKyAqIE9yaWdpbmFsOiAyMDA0LzA1LzEzIDE1OjMxOjQ1ICAgIFJldmlzaW9uOiAxLjUzICAgICAgVGFnOiBoY2Y3X3Q3XzIwMDQwNTEzXzAxCisgKiBPcmlnaW5hbDogMjAwNC8wNC8xNSAwOToyNDo0MiAgICBSZXZpc2lvbjogMS40NCAgICAgIFRhZzogaGNmN190N18yMDA0MDQxNV8wMQorICogT3JpZ2luYWw6IDIwMDQvMDQvMTMgMTQ6MjI6NDUgICAgUmV2aXNpb246IDEuNDMgICAgICBUYWc6IHQ3XzIwMDQwNDEzXzAxCisgKiBPcmlnaW5hbDogMjAwNC8wNC8wMSAxNTozMjo1NSAgICBSZXZpc2lvbjogMS40MCAgICAgIFRhZzogdDdfMjAwNDA0MDFfMDEKKyAqIE9yaWdpbmFsOiAyMDA0LzAzLzEwIDE1OjM5OjI4ICAgIFJldmlzaW9uOiAxLjM2ICAgICAgVGFnOiB0MjAwNDAzMTBfMDEKKyAqIE9yaWdpbmFsOiAyMDA0LzAzLzAzIDE0OjEwOjEyICAgIFJldmlzaW9uOiAxLjM0ICAgICAgVGFnOiB0MjAwNDAzMDRfMDEKKyAqIE9yaWdpbmFsOiAyMDA0LzAzLzAyIDA5OjI3OjEyICAgIFJldmlzaW9uOiAxLjMyICAgICAgVGFnOiB0MjAwNDAzMDJfMDMKKyAqIE9yaWdpbmFsOiAyMDA0LzAyLzI0IDEzOjAwOjI5ICAgIFJldmlzaW9uOiAxLjI5ICAgICAgVGFnOiB0MjAwNDAyMjRfMDEKKyAqIE9yaWdpbmFsOiAyMDA0LzAyLzE4IDE3OjEzOjU3ICAgIFJldmlzaW9uOiAxLjI2ICAgICAgVGFnOiB0MjAwNDAyMTlfMDEKKyAqCisgKiBBVVRIT1IgOiBOaWNvIFZhbHN0ZXIKKyAqCisgKiBTUEVDSUZJQ0FUSU9OOiAuLi4uLi4uLi4uLgorICoKKyAqIERFU0MgICA6IERlZmluaXRpb25zIGFuZCBQcm90b3R5cGVzIGZvciBIQ0Ygb25seQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCisgKiBTT0ZUV0FSRSBMSUNFTlNFCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCisgKiB3aGljaCB5b3Ugc2hvdWxkIHJlYWQgY2FyZWZ1bGx5IGJlZm9yZSB1c2luZyB0aGUgc29mdHdhcmUuICBVc2luZyB0aGlzCisgKiBzb2Z0d2FyZSBpbmRpY2F0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiAgSWYgeW91IGRvCisgKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCisgKgorICogQ09QWVJJR0hUIKkgMTk5NCAtIDE5OTUgICBieSBBVCZULiAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiBDT1BZUklHSFQgqSAxOTk2IC0gMjAwMCBieSBMdWNlbnQgVGVjaG5vbG9naWVzLiAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqIENPUFlSSUdIVCCpIDIwMDEgLSAyMDA0ICAgYnkgQWdlcmUgU3lzdGVtcyBJbmMuICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9ucywgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCisgKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgRGlzY2xhaW1lciBhcyBjb21tZW50cyBpbiB0aGUgY29kZSBhcworICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBEaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgKiAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiAuIE5laXRoZXIgdGhlIG5hbWUgb2YgQWdlcmUgU3lzdGVtcyBJbmMuIG5vciB0aGUgbmFtZXMgb2YgdGhlIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBEaXNjbGFpbWVyCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgSU5GUklOR0VNRU5UIEFORCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCisgKiBVU0UsIE1PRElGSUNBVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhJUyBTT0ZUV0FSRSBJUyBTT0xFTFkgQVQgVEhFIFVTRVJTIE9XTgorICogUklTSy4gSU4gTk8gRVZFTlQgU0hBTEwgQUdFUkUgU1lTVEVNUyBJTkMuIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAorICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyAqIERBTUFHRS4KKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIFAgUiBFIEYgSSBYIEUgUyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy9JRkJfCQlJbnRlcmZhY2UgQmxvY2sKLS8vSENNRF8JCUhlcm1lcyBDb21tYW5kCi0vL0hGU18JCUhlcm1lcyAoVHJhbnNtaXQvUmVjZWl2ZSkgRnJhbWUgU3RydWN0dXJlCi0vL0hSRUdfCQlIZXJtZXMgUmVnaXN0ZXIKKy8vSUZCXyAgICAgIEludGVyZmFjZSBCbG9jaworLy9IQ01EXyAgICAgSGVybWVzIENvbW1hbmQKKy8vSEZTXyAgICAgIEhlcm1lcyAoVHJhbnNtaXQvUmVjZWl2ZSkgRnJhbWUgU3RydWN0dXJlCisvL0hSRUdfICAgICBIZXJtZXMgUmVnaXN0ZXIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZiAwIC8vCi0jZGVmaW5lIEJJVDAgIDB4MDAwMQotI2RlZmluZSBCSVQxICAweDAwMDIKLSNkZWZpbmUgQklUMiAgMHgwMDA0Ci0jZGVmaW5lIEJJVDMgIDB4MDAwOAotI2RlZmluZSBCSVQ0ICAweDAwMTAKLSNkZWZpbmUgQklUNSAgMHgwMDIwCi0jZGVmaW5lIEJJVDYgIDB4MDA0MAotI2RlZmluZSBCSVQ3ICAweDAwODAKLSNkZWZpbmUgQklUOCAgMHgwMTAwCi0jZGVmaW5lIEJJVDkgIDB4MDIwMAotI2RlZmluZSBCSVQxMCAweDA0MDAKLSNkZWZpbmUgQklUMTEgMHgwODAwCi0jZGVmaW5lIEJJVDEyIDB4MTAwMAotI2RlZmluZSBCSVQxMyAweDIwMDAKLSNkZWZpbmUgQklUMTQgMHg0MDAwCi0jZGVmaW5lIEJJVDE1IDB4ODAwMAotI2RlZmluZSBCSVQxNiAweDAwMDEwMDAwCi0jZGVmaW5lIEJJVDE3IDB4MDAwMjAwMDAKLSNkZWZpbmUgQklUMTggMHgwMDA0MDAwMAotI2RlZmluZSBCSVQxOSAweDAwMDgwMDAwCi0jZGVmaW5lIEJJVDIwIDB4MDAxMDAwMDAKLSNkZWZpbmUgQklUMjEgMHgwMDIwMDAwMAotI2RlZmluZSBCSVQyMiAweDAwNDAwMDAwCi0jZGVmaW5lIEJJVDIzIDB4MDA4MDAwMDAKLSNkZWZpbmUgQklUMjQgMHgwMTAwMDAwMAotI2RlZmluZSBCSVQyNSAweDAyMDAwMDAwCi0jZGVmaW5lIEJJVDI2IDB4MDQwMDAwMDAKLSNkZWZpbmUgQklUMjcgMHgwODAwMDAwMAotI2RlZmluZSBCSVQyOCAweDEwMDAwMDAwCi0jZGVmaW5lIEJJVDI5IDB4MjAwMDAwMDAKLSNkZWZpbmUgQklUMzAgMHg0MDAwMDAwMAotI2RlZmluZSBCSVQzMSAweDgwMDAwMDAwCi0jZW5kaWYgLy8gMAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBHRU5FUkFMIEVRVUFURVMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIAotI2RlZmluZSBIQ0ZfTUFHSUMJCQkJMHg3RDM3CS8vICJ9NyIgSGFuZGxlIHZhbGlkYXRpb24KKyNkZWZpbmUgSENGX01BR0lDICAgICAgICAgICAgICAgMHg3RDM3ICAvLyAifTciIEhhbmRsZSB2YWxpZGF0aW9uCiAKLSNkZWZpbmUJUExVR19EQVRBX09GRlNFVCAgICAgICAgMHgwMDAwMDgwMAkvL25lZWRlZCBieSBzb21lIHRlc3QgdG9vbCBvbiB0b3Agb2YgSC1JSSBORElTIGRyaXZlcgorI2RlZmluZSBQTFVHX0RBVEFfT0ZGU0VUICAgICAgICAweDAwMDAwODAwICAvL25lZWRlZCBieSBzb21lIHRlc3QgdG9vbCBvbiB0b3Agb2YgSC1JSSBORElTIGRyaXZlcgogCi0jZGVmaW5lIElOSV9USUNLX0lOSQkJCTB4MDAwNDAwMDBMCisjZGVmaW5lIElOSV9USUNLX0lOSSAgICAgICAgICAgIDB4MDAwNDAwMDBMCiAKLSNkZWZpbmUgSU9fSU4JCQkJCTAJCS8vaGNmaW9faW5fc3RyaW5nCi0jZGVmaW5lIElPX09VVAkJCQkJMQkJLy9oY2Zpb19vdXRfc3RyaW5nCisjZGVmaW5lIElPX0lOICAgICAgICAgICAgICAgICAgIDAgICAgICAgLy9oY2Zpb19pbl9zdHJpbmcKKyNkZWZpbmUgSU9fT1VUICAgICAgICAgICAgICAgICAgMSAgICAgICAvL2hjZmlvX291dF9zdHJpbmcKIAogLy9ET19BU1NFUlQsIGNyZWF0ZSBhbiBhcnRpZmljaWFsIEZBTFNFIHRvIGZvcmNlIGFuIEFTU0VSVCB3aXRob3V0IHRoZSBuYXN0eSBjb21waWxlciB3YXJuaW5nCi0jZGVmaW5lIERPX0FTU0VSVAkJCQkoIGFzc2VydF9pZmJwLT5JRkJfTWFnaWMgIT0gSENGX01BR0lDICYmIGFzc2VydF9pZmJwLT5JRkJfTWFnaWMgPT0gSENGX01BR0lDICkKLSNkZWZpbmUgTlRfQVNTRVJUCQkJCTB4MDAwMAkJLy8sIE5FVkVSX1RFU1RFRAotI2RlZmluZSBORVZFUl9URVNURUQJCQlNRVJHRV8yKCAweEVGRkUsIDB4RkVFRiApCi0jZGVmaW5lIFNFX0FTU0VSVAkJCQkweDVFRkYJCS8qIFNpZGUgRWZmZWN0LCBIQ0ZBU1NFUlQgaW52b2thdGlvbiB3aGljaCBhcmUgb25seSBjYWxsZWQgZm9yIHRoZQotCQkJCQkJCQkJCQkgKiBzaWRlIGVmZmVjdCBhbmQgd2hpY2ggc2hvdWxkIG5ldmVyIHRyaWdnZXIgKi8KLSNkZWZpbmUgREhGX0ZJTEVfTkFNRV9PRkZTRVQJMTAwMDAJCS8vdG8gZGlzdGluZ3Vpc2ggREhGIGZyb20gSENGIGFzc2VydHMgYnkgbWVhbnMgb2YgbGluZSBudW1iZXIKLSNkZWZpbmUgTU1EX0ZJTEVfTkFNRV9PRkZTRVQJMjAwMDAJCS8vdG8gZGlzdGluZ3Vpc2ggTU1EIGZyb20gSENGIGFzc2VydHMgYnkgbWVhbnMgb2YgbGluZSBudW1iZXIKKyNkZWZpbmUgRE9fQVNTRVJUICAgICAgICAgICAgICAgKCBhc3NlcnRfaWZicC0+SUZCX01hZ2ljICE9IEhDRl9NQUdJQyAmJiBhc3NlcnRfaWZicC0+SUZCX01hZ2ljID09IEhDRl9NQUdJQyApCisjZGVmaW5lIE5UX0FTU0VSVCAgICAgICAgICAgICAgIDB4MDAwMCAgICAgIC8vLCBORVZFUl9URVNURUQKKyNkZWZpbmUgTkVWRVJfVEVTVEVEICAgICAgICAgICAgTUVSR0VfMiggMHhFRkZFLCAweEZFRUYgKQorI2RlZmluZSBTRV9BU1NFUlQgICAgICAgICAgICAgICAweDVFRkYgICAgICAvKiBTaWRlIEVmZmVjdCwgSENGQVNTRVJUIGludm9rYXRpb24gd2hpY2ggYXJlIG9ubHkgY2FsbGVkIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2lkZSBlZmZlY3QgYW5kIHdoaWNoIHNob3VsZCBuZXZlciB0cmlnZ2VyICovCisjZGVmaW5lIERIRl9GSUxFX05BTUVfT0ZGU0VUICAgIDEwMDAwICAgICAgIC8vdG8gZGlzdGluZ3Vpc2ggREhGIGZyb20gSENGIGFzc2VydHMgYnkgbWVhbnMgb2YgbGluZSBudW1iZXIKKyNkZWZpbmUgTU1EX0ZJTEVfTkFNRV9PRkZTRVQgICAgMjAwMDAgICAgICAgLy90byBkaXN0aW5ndWlzaCBNTUQgZnJvbSBIQ0YgYXNzZXJ0cyBieSBtZWFucyBvZiBsaW5lIG51bWJlcgogCiAvLyB0cmFjZSBjb2RlcyB1c2VkIHRvCiAvLyAxOiBwcm9maWxlIGV4ZWN1dGlvbiB0aW1lcyB2aWEgSENGX1RSQUNFIGFuZCBIQ0ZfVFJBQ0VfVkFMVUUKIC8vIDI6IGhpZXJhcmNoaWNhbCBmbG93IGluZm9ybWF0aW9uIHZpYSBIQ0ZMT0dFTlRSWSAvIEhDRkxPR0VYSVQKIAotLy8jZGVmaW5lIEhDRl9UUkFDRV9DT05ORUNUCQl1c2VsZXNzCi0vLyNkZWZpbmUgSENGX1RSQUNFX0RJU0NPTk5FQ1QJdXNlbGVzcwotI2RlZmluZSBIQ0ZfVFJBQ0VfQUNUSU9OCQkweDAwMDAgIC8vIDB4MDAwMQotI2RlZmluZSBIQ0ZfVFJBQ0VfQ05UTAkJCTB4MDAwMSAgLy8gMHgwMDAyCi0jZGVmaW5lIEhDRl9UUkFDRV9ETUFfUlhfR0VUCTB4MDAwMiAgLy8gMHgwMDA0Ci0jZGVmaW5lIEhDRl9UUkFDRV9ETUFfUlhfUFVUCTB4MDAwMyAgLy8gMHgwMDA4Ci0jZGVmaW5lIEhDRl9UUkFDRV9ETUFfVFhfR0VUCTB4MDAwNCAgLy8gMHgwMDEwCi0jZGVmaW5lIEhDRl9UUkFDRV9ETUFfVFhfUFVUCTB4MDAwNSAgLy8gMHgwMDIwCi0jZGVmaW5lIEhDRl9UUkFDRV9HRVRfSU5GTwkJMHgwMDA2ICAvLyAweDAwNDAKLSNkZWZpbmUgSENGX1RSQUNFX1BVVF9JTkZPCQkweDAwMDcgIC8vIDB4MDA4MAotI2RlZmluZSBIQ0ZfVFJBQ0VfUkNWX01TRwkJMHgwMDA4ICAvLyAweDAxMDAKLSNkZWZpbmUgSENGX1RSQUNFX1NFTkRfTVNHCQkweDAwMDkgIC8vIDB4MDIwMAotI2RlZmluZSBIQ0ZfVFJBQ0VfU0VSVklDRV9OSUMJMHgwMDBBICAvLyAweDA0MDAKKy8vI2RlZmluZSBIQ0ZfVFJBQ0VfQ09OTkVDVCAgICAgdXNlbGVzcworLy8jZGVmaW5lIEhDRl9UUkFDRV9ESVNDT05ORUNUICB1c2VsZXNzCisjZGVmaW5lIEhDRl9UUkFDRV9BQ1RJT04gICAgICAgIDB4MDAwMCAgLy8gMHgwMDAxCisjZGVmaW5lIEhDRl9UUkFDRV9DTlRMICAgICAgICAgIDB4MDAwMSAgLy8gMHgwMDAyCisjZGVmaW5lIEhDRl9UUkFDRV9ETUFfUlhfR0VUICAgIDB4MDAwMiAgLy8gMHgwMDA0CisjZGVmaW5lIEhDRl9UUkFDRV9ETUFfUlhfUFVUICAgIDB4MDAwMyAgLy8gMHgwMDA4CisjZGVmaW5lIEhDRl9UUkFDRV9ETUFfVFhfR0VUICAgIDB4MDAwNCAgLy8gMHgwMDEwCisjZGVmaW5lIEhDRl9UUkFDRV9ETUFfVFhfUFVUICAgIDB4MDAwNSAgLy8gMHgwMDIwCisjZGVmaW5lIEhDRl9UUkFDRV9HRVRfSU5GTyAgICAgIDB4MDAwNiAgLy8gMHgwMDQwCisjZGVmaW5lIEhDRl9UUkFDRV9QVVRfSU5GTyAgICAgIDB4MDAwNyAgLy8gMHgwMDgwCisjZGVmaW5lIEhDRl9UUkFDRV9SQ1ZfTVNHICAgICAgIDB4MDAwOCAgLy8gMHgwMTAwCisjZGVmaW5lIEhDRl9UUkFDRV9TRU5EX01TRyAgICAgIDB4MDAwOSAgLy8gMHgwMjAwCisjZGVmaW5lIEhDRl9UUkFDRV9TRVJWSUNFX05JQyAgIDB4MDAwQSAgLy8gMHgwNDAwCiAvLyAjZGVmaW5lIEhDRl9UUkFDRV8gICAgICAgICAgIDB4MDAwQyAgLy8gMHgxMDAwCiAvLyAjZGVmaW5lIEhDRl9UUkFDRV8gICAgICAgICAgIDB4MDAwRCAgLy8gMHgyMDAwCiAvLyAjZGVmaW5lIEhDRl9UUkFDRV8gICAgICAgICAgIDB4MDAwRSAgLy8gMHg0MDAwCiAvLyAjZGVmaW5lIEhDRl9UUkFDRV8gICAgICAgICAgIDB4MDAwRiAgLy8gMHg4MDAwCi0vLwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBIQ0ZfVFJBQ0VfLi4uIGNvZGVzIGJlbG93IDB4MDAxMCBhcmUgYXNzZXJ0ZWQgb24gcmUtZW50cnkKLSNkZWZpbmUgSENGX1RSQUNFX0FDVElPTl9LTFVER0UJMHgwMDEwICAvKiBvbmNlIHlvdSBzdGFydCBpbnRyb2R1Y2luZyBrbHVkZ2VzIHRoZXJlIGlzIG5vIGVuZCB0byBpdAotCQkJCQkJCQkJCSAqIHRoaXMgaXMgYW4gZXNjYXBlIHRvIGRvIG5vdCBhc3NlcnQgb24gcmUtZW50cmFuY3kgcHJvYmxlbSBjYXVzZWQKLQkJCQkJCQkJCQkgKiBieSBIQ0ZfQUNUX0lOVF9GT1JDRV9PTiB1c2VkIHRvIGdldCBNaWNyb3NvZnRzIE5ESVMgZHJpdmVycyBnb2luZwotCQkJCQkJCQkJCSAqLwotI2RlZmluZSBIQ0ZfVFJBQ0VfU1RSSU8JCQkweDAwMjAKLSNkZWZpbmUgSENGX1RSQUNFX0FMTE9DCQkJMFgwMDIxCi0jZGVmaW5lIEhDRl9UUkFDRV9ETAkJCTBYMDAyMwotI2RlZmluZSBIQ0ZfVFJBQ0VfSVNSX0lORk8JCTBYMDAyNAotI2RlZmluZSBIQ0ZfVFJBQ0VfQ0FMSUJSQVRFCQkweDAwMjYKKy8vICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBIQ0ZfVFJBQ0VfLi4uIGNvZGVzIGJlbG93IDB4MDAxMCBhcmUgYXNzZXJ0ZWQgb24gcmUtZW50cnkKKyNkZWZpbmUgSENGX1RSQUNFX0FDVElPTl9LTFVER0UgMHgwMDEwICAvKiBvbmNlIHlvdSBzdGFydCBpbnRyb2R1Y2luZyBrbHVkZ2VzIHRoZXJlIGlzIG5vIGVuZCB0byBpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoaXMgaXMgYW4gZXNjYXBlIHRvIGRvIG5vdCBhc3NlcnQgb24gcmUtZW50cmFuY3kgcHJvYmxlbSBjYXVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBieSBIQ0ZfQUNUX0lOVF9GT1JDRV9PTiB1c2VkIHRvIGdldCBNaWNyb3NvZnRzIE5ESVMgZHJpdmVycyBnb2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQ0ZfVFJBQ0VfU1RSSU8gICAgICAgICAweDAwMjAKKyNkZWZpbmUgSENGX1RSQUNFX0FMTE9DICAgICAgICAgMFgwMDIxCisjZGVmaW5lIEhDRl9UUkFDRV9ETCAgICAgICAgICAgIDBYMDAyMworI2RlZmluZSBIQ0ZfVFJBQ0VfSVNSX0lORk8gICAgICAwWDAwMjQKKyNkZWZpbmUgSENGX1RSQUNFX0NBTElCUkFURSAgICAgMHgwMDI2CiAKLSNkZWZpbmUgSENGX1RSQUNFX0NNRF9DUEwgCQkweDAwNDAKLSNkZWZpbmUgSENGX1RSQUNFX0NNRF9FWEUJCTB4MDA0MQotI2RlZmluZSBIQ0ZfVFJBQ0VfR0VUX0ZJRAkJMHgwMDQyCi0jZGVmaW5lIEhDRl9UUkFDRV9HRVRfRlJBRwkJMHgwMDQzCi0jZGVmaW5lIEhDRl9UUkFDRV9JTklUCQkJMHgwMDQ0Ci0jZGVmaW5lIEhDRl9UUkFDRV9QVVRfRlJBRwkJMHgwMDQ1Ci0jZGVmaW5lIEhDRl9UUkFDRV9TRVRVUF9CQVAJCTB4MDA0NgorI2RlZmluZSBIQ0ZfVFJBQ0VfQ01EX0NQTCAgICAgICAweDAwNDAKKyNkZWZpbmUgSENGX1RSQUNFX0NNRF9FWEUgICAgICAgMHgwMDQxCisjZGVmaW5lIEhDRl9UUkFDRV9HRVRfRklEICAgICAgIDB4MDA0MgorI2RlZmluZSBIQ0ZfVFJBQ0VfR0VUX0ZSQUcgICAgICAweDAwNDMKKyNkZWZpbmUgSENGX1RSQUNFX0lOSVQgICAgICAgICAgMHgwMDQ0CisjZGVmaW5lIEhDRl9UUkFDRV9QVVRfRlJBRyAgICAgIDB4MDA0NQorI2RlZmluZSBIQ0ZfVFJBQ0VfU0VUVVBfQkFQICAgICAweDAwNDYKIAotI2RlZmluZQlIQ0ZfVFJBQ0VfRVhJVCAJCQkweDgwMDAJLy8gS2VpbCBDIHdhcm5zICJsb25nIGNvbnN0YW50IHRydW5jYXRlZCB0byBpbnQiCisjZGVmaW5lIEhDRl9UUkFDRV9FWElUICAgICAgICAgIDB4ODAwMCAgLy8gS2VpbCBDIHdhcm5zICJsb25nIGNvbnN0YW50IHRydW5jYXRlZCB0byBpbnQiCiAKLS8vI2RlZmluZSBCQVBfMAkJCQkJSFJFR19EQVRBXzAJCS8vVXNlZCBieSBETUEgY29udHJvbGxlciB0byBhY2Nlc3MgTklDIFJBTQotI2RlZmluZSBCQVBfMQkJCQkJSFJFR19EQVRBXzEJCS8vVXNlZCBieSBIQ0YgdG8gYWNjZXNzIE5JQyBSQU0KKy8vI2RlZmluZSBCQVBfMCAgICAgICAgICAgICAgICAgSFJFR19EQVRBXzAgICAgIC8vVXNlZCBieSBETUEgY29udHJvbGxlciB0byBhY2Nlc3MgTklDIFJBTQorI2RlZmluZSBCQVBfMSAgICAgICAgICAgICAgICAgICBIUkVHX0RBVEFfMSAgICAgLy9Vc2VkIGJ5IEhDRiB0byBhY2Nlc3MgTklDIFJBTQogCiAKIC8vKioqKioqKioqKioqKioqKioqKioqKioqKiBIZXJtZXMgUmVjZWl2ZS9UcmFuc21pdCBGcmFtZSBTdHJ1Y3R1cmVzCiAvL0hGU19TVEFUCiAvL3NlZSBNTUQuSCBmb3IgSEZTX1NUQVRfRVJSCi0jZGVmaW5lIAlIRlNfU1RBVF9NU0dfVFlQRQkweEUwMDAJLy9IZXJtZXMgcmVwb3J0ZWQgTWVzc2FnZSBUeXBlCi0jZGVmaW5lIAlIRlNfU1RBVF9NSUNfS0VZX0lECTB4MTgwMAkvL01JQyBrZXkgdXNlZCAoaWYgYW55KQotI2RlZmluZSAJSEZTX1NUQVRfMTA0MgkJMHgyMDAwCS8vUkZDMTA0MiBFbmNvZGVkCi0jZGVmaW5lIAlIRlNfU1RBVF9UVU5ORUwJCTB4NDAwMAkvL0JyaWRnZS1UdW5uZWwgRW5jb2RlZAotI2RlZmluZSAJSEZTX1NUQVRfV01QX01TRwkweDYwMDAJLy9XYXZlTEFOLUlJIE1hbmFnZW1lbnQgUHJvdG9jb2wgRnJhbWUKKyNkZWZpbmUgICAgIEhGU19TVEFUX01TR19UWVBFICAgMHhFMDAwICAvL0hlcm1lcyByZXBvcnRlZCBNZXNzYWdlIFR5cGUKKyNkZWZpbmUgICAgIEhGU19TVEFUX01JQ19LRVlfSUQgMHgxODAwICAvL01JQyBrZXkgdXNlZCAoaWYgYW55KQorI2RlZmluZSAgICAgSEZTX1NUQVRfMTA0MiAgICAgICAweDIwMDAgIC8vUkZDMTA0MiBFbmNvZGVkCisjZGVmaW5lICAgICBIRlNfU1RBVF9UVU5ORUwgICAgIDB4NDAwMCAgLy9CcmlkZ2UtVHVubmVsIEVuY29kZWQKKyNkZWZpbmUgICAgIEhGU19TVEFUX1dNUF9NU0cgICAgMHg2MDAwICAvL1dhdmVMQU4tSUkgTWFuYWdlbWVudCBQcm90b2NvbCBGcmFtZQogI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKLSNkZWZpbmUgCUhGU19TVEFUX01JQwkJMHgwMDEwCS8vRnJhbWUgY29udGFpbnMgTUlDICAvLzs/IHJlLWluc3RhdGUgd2hlbiBGL1cgcmVhZHkKKyNkZWZpbmUgICAgIEhGU19TVEFUX01JQyAgICAgICAgMHgwMDEwICAvL0ZyYW1lIGNvbnRhaW5zIE1JQyAgLy87PyByZS1pbnN0YXRlIHdoZW4gRi9XIHJlYWR5CiAjZW5kaWYKIAogLy8qKioqKioqKioqKioqKioqKioqKioqKioqIEhlcm1lcyBSZWdpc3RlciBPZmZzZXRzIGFuZCBDb21tYW5kIGJpdHMKLSNkZWZpbmUgSFJFR19JT19SQU5HRQkJCTB4ODAJCS8vSS9PIFJhbmdlIHVzZWQgYnkgSGVybWVzCisjZGVmaW5lIEhSRUdfSU9fUkFOR0UgICAgICAgICAgIDB4ODAgICAgICAgIC8vSS9PIFJhbmdlIHVzZWQgYnkgSGVybWVzCiAKIAogLy8qKioqKioqKioqKioqKioqKioqKioqKioqIENvbW1hbmQvU3RhdHVzCi0jZGVmaW5lIEhSRUdfQ01ECQkJCTB4MDAJCS8vCi0jZGVmaW5lIAlIQ01EX0NNRF9DT0RFCQkJMHgzRgotI2RlZmluZSBIUkVHX1BBUkFNXzAJCQkweDAyCQkvLwotI2RlZmluZSBIUkVHX1BBUkFNXzEJCQkweDA0CQkvLwotI2RlZmluZSBIUkVHX1BBUkFNXzIJCQkweDA2CQkvLwotI2RlZmluZSBIUkVHX1NUQVQJCQkJMHgwOAkJLy8KLSNkZWZpbmUgCUhSRUdfU1RBVF9DTURfQ09ERQkJMHgwMDNGCS8vCi0jZGVmaW5lCQlIUkVHX1NUQVRfRElBR19FUlIJCTB4MDEwMAotI2RlZmluZQkJSFJFR19TVEFUX0lOUVVJUkVfRVJSCTB4MDUwMAotI2RlZmluZSAJSFJFR19TVEFUX0NNRF9SRVNVTFQJMHg3RjAwCS8vCi0jZGVmaW5lIEhSRUdfUkVTUF8wCQkJCTB4MEEJCS8vCi0jZGVmaW5lIEhSRUdfUkVTUF8xCQkJCTB4MEMJCS8vCi0jZGVmaW5lIEhSRUdfUkVTUF8yCQkJCTB4MEUJCS8vCisjZGVmaW5lIEhSRUdfQ01EICAgICAgICAgICAgICAgIDB4MDAgICAgICAgIC8vCisjZGVmaW5lICAgICBIQ01EX0NNRF9DT0RFICAgICAgICAgICAweDNGCisjZGVmaW5lIEhSRUdfUEFSQU1fMCAgICAgICAgICAgIDB4MDIgICAgICAgIC8vCisjZGVmaW5lIEhSRUdfUEFSQU1fMSAgICAgICAgICAgIDB4MDQgICAgICAgIC8vCisjZGVmaW5lIEhSRUdfUEFSQU1fMiAgICAgICAgICAgIDB4MDYgICAgICAgIC8vCisjZGVmaW5lIEhSRUdfU1RBVCAgICAgICAgICAgICAgIDB4MDggICAgICAgIC8vCisjZGVmaW5lICAgICBIUkVHX1NUQVRfQ01EX0NPREUgICAgICAweDAwM0YgIC8vCisjZGVmaW5lICAgICBIUkVHX1NUQVRfRElBR19FUlIgICAgICAweDAxMDAKKyNkZWZpbmUgICAgIEhSRUdfU1RBVF9JTlFVSVJFX0VSUiAgIDB4MDUwMAorI2RlZmluZSAgICAgSFJFR19TVEFUX0NNRF9SRVNVTFQgICAgMHg3RjAwICAvLworI2RlZmluZSBIUkVHX1JFU1BfMCAgICAgICAgICAgICAweDBBICAgICAgICAvLworI2RlZmluZSBIUkVHX1JFU1BfMSAgICAgICAgICAgICAweDBDICAgICAgICAvLworI2RlZmluZSBIUkVHX1JFU1BfMiAgICAgICAgICAgICAweDBFICAgICAgICAvLwogCiAKIC8vKioqKioqKioqKioqKioqKioqKioqKioqKiBGSUQgTWFuYWdlbWVudAotI2RlZmluZSBIUkVHX0lORk9fRklECQkJMHgxMAkJLy8KLSNkZWZpbmUgSFJFR19SWF9GSUQJCQkJMHgyMAkJLy8KLSNkZWZpbmUgSFJFR19BTExPQ19GSUQgIAkJMHgyMgkJLy8KLSNkZWZpbmUgSFJFR19UWF9DT01QTF9GSUQgIAkJMHgyNAkJLy8KKyNkZWZpbmUgSFJFR19JTkZPX0ZJRCAgICAgICAgICAgMHgxMCAgICAgICAgLy8KKyNkZWZpbmUgSFJFR19SWF9GSUQgICAgICAgICAgICAgMHgyMCAgICAgICAgLy8KKyNkZWZpbmUgSFJFR19BTExPQ19GSUQgICAgICAgICAgMHgyMiAgICAgICAgLy8KKyNkZWZpbmUgSFJFR19UWF9DT01QTF9GSUQgICAgICAgMHgyNCAgICAgICAgLy8KIAogCiAvLyoqKioqKioqKioqKioqKioqKioqKioqKiogQkFQCiAvLzIwMDMxMDMwIEhXaSBJbnNlcnRlZCB0aGlzIGFnYWluIGJlY2F1c2UgdGhlIGRvbmdsZSBjb2RlIHVzZXMgdGhpcyAoR1BJRi5DKQotLy8jZGVmaW5lIEhSRUdfU0VMRUNUXzAJCQkweDE4CQkvLwotLy8jZGVmaW5lIEhSRUdfT0ZGU0VUXzAJCQkweDFDCQkvLwotLy8jZGVmaW5lIEhSRUdfREFUQV8wCQkJMHgzNgkJLy8KKy8vI2RlZmluZSBIUkVHX1NFTEVDVF8wICAgICAgICAgMHgxOCAgICAgICAgLy8KKy8vI2RlZmluZSBIUkVHX09GRlNFVF8wICAgICAgICAgMHgxQyAgICAgICAgLy8KKy8vI2RlZmluZSBIUkVHX0RBVEFfMCAgICAgICAgICAgMHgzNiAgICAgICAgLy8KIAotLy8jZGVmaW5lIAlIUkVHX09GRlNFVF9CVVNZCQkweDgwMDAJLy8gdXNlIEhDTURfQlVTWQotI2RlZmluZSAJSFJFR19PRkZTRVRfRVJSCQkJMHg0MDAwCS8vCi0vL3JzcnZkICNkZWZpbmUgCUhSRUdfT0ZGU0VUX0RBVEFfT0ZGU0VUCTB4MEZGRgkvLworLy8jZGVmaW5lICAgSFJFR19PRkZTRVRfQlVTWSAgICAgICAgMHg4MDAwICAvLyB1c2UgSENNRF9CVVNZCisjZGVmaW5lICAgICBIUkVHX09GRlNFVF9FUlIgICAgICAgICAweDQwMDAgIC8vCisvL3JzcnZkICNkZWZpbmUgICAgIEhSRUdfT0ZGU0VUX0RBVEFfT0ZGU0VUIDB4MEZGRiAgLy8KIAotI2RlZmluZSBIUkVHX1NFTEVDVF8xCQkJMHgxQQkJLy8KLSNkZWZpbmUgSFJFR19PRkZTRVRfMQkJCTB4MUUJCS8vCi0jZGVmaW5lIEhSRUdfREFUQV8xCQkJCTB4MzgJCS8vCisjZGVmaW5lIEhSRUdfU0VMRUNUXzEgICAgICAgICAgIDB4MUEgICAgICAgIC8vCisjZGVmaW5lIEhSRUdfT0ZGU0VUXzEgICAgICAgICAgIDB4MUUgICAgICAgIC8vCisjZGVmaW5lIEhSRUdfREFUQV8xICAgICAgICAgICAgIDB4MzggICAgICAgIC8vCiAKIAogLy8qKioqKioqKioqKioqKioqKioqKioqKioqIEV2ZW50Ci0jZGVmaW5lIEhSRUdfRVZfU1RBVAkJCTB4MzAJCS8vCi0jZGVmaW5lIEhSRUdfSU5UX0VOCQkJCTB4MzIJCS8vCi0jZGVmaW5lIEhSRUdfRVZfQUNLCQkJCTB4MzQJCS8vCisjZGVmaW5lIEhSRUdfRVZfU1RBVCAgICAgICAgICAgIDB4MzAgICAgICAgIC8vCisjZGVmaW5lIEhSRUdfSU5UX0VOICAgICAgICAgICAgIDB4MzIgICAgICAgIC8vCisjZGVmaW5lIEhSRUdfRVZfQUNLICAgICAgICAgICAgIDB4MzQgICAgICAgIC8vCiAKLSNkZWZpbmUgICAgSFJFR19FVl9USUNLCQkJCTB4ODAwMAkvL0F1eGlsaWFyeSBUaW1lciBUaWNrCi0vLyNkZWZpbmUgIEhSRUdfRVZfUkVTCQkJCTB4NDAwMAkvL0gtSSBvbmx5OiBIL1cgZXJyb3IgKFdhaXQgVGltZS1vdXQpCi0jZGVmaW5lICAgIEhSRUdfRVZfSU5GT19EUk9QCQkweDIwMDAJLy9XTUFDIGRpZCBub3QgaGF2ZSBzdWZmaWNpZW50IFJBTSB0byBidWlsZCBVbnNvbGxpY2l0ZWQgRnJhbWUKKyNkZWZpbmUgICAgSFJFR19FVl9USUNLICAgICAgICAgICAgIDB4ODAwMCAgLy9BdXhpbGlhcnkgVGltZXIgVGljaworLy8jZGVmaW5lICBIUkVHX0VWX1JFUyAgICAgICAgICAgICAgMHg0MDAwICAvL0gtSSBvbmx5OiBIL1cgZXJyb3IgKFdhaXQgVGltZS1vdXQpCisjZGVmaW5lICAgIEhSRUdfRVZfSU5GT19EUk9QICAgICAgICAweDIwMDAgIC8vV01BQyBkaWQgbm90IGhhdmUgc3VmZmljaWVudCBSQU0gdG8gYnVpbGQgVW5zb2xsaWNpdGVkIEZyYW1lCiAjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUKLSNkZWZpbmUgICAgSFJFR19FVl9BQ0tfUkVHX1JFQURZCTB4MDAwMAorI2RlZmluZSAgICBIUkVHX0VWX0FDS19SRUdfUkVBRFkgICAgMHgwMDAwCiAjZWxzZQotI2RlZmluZSAgICBIUkVHX0VWX0FDS19SRUdfUkVBRFkJMHgxMDAwCS8vV29ya2Fyb3VuZCBLbHVkZ2UgYml0IGZvciBILUlJIChub3QgSC1JSS41KQorI2RlZmluZSAgICBIUkVHX0VWX0FDS19SRUdfUkVBRFkgICAgMHgxMDAwICAvL1dvcmthcm91bmQgS2x1ZGdlIGJpdCBmb3IgSC1JSSAobm90IEgtSUkuNSkKICNlbmRpZiAvLyBIQ0ZfVFlQRV9ISUk1CiAjaWYgKEhDRl9TTEVFUCkgJiAoIEhDRl9DRFMgfCBIQ0ZfRERTICkKLSNkZWZpbmUgICAgSFJFR19FVl9TTEVFUF9SRVEJCTB4MDgwMAorI2RlZmluZSAgICBIUkVHX0VWX1NMRUVQX1JFUSAgICAgICAgMHgwODAwCiAjZWxzZQotI2RlZmluZSAgICBIUkVHX0VWX1NMRUVQX1JFUQkJMHgwMDAwCisjZGVmaW5lICAgIEhSRUdfRVZfU0xFRVBfUkVRICAgICAgICAweDAwMDAKICNlbmRpZiAvLyBIQ0ZfQ0RTIC8gSENGX0REUwogI2lmIEhDRl9ETUEKLS8vI2RlZmluZSAgICBIUkVHX0VWX0xQRVNDCQkJMHgwNDAwIC8vIGZpcm13YXJlIHNldHMgdGhpcyBiaXQgYW5kIGNsZWFycyBpdCwgbm90IGZvciBob3N0IHVzYWdlLgotI2RlZmluZSAgICBIUkVHX0VWX1JETUFECQkJMHgwMjAwIC8vIHJ4IGZyYW1lIGluIGhvc3QgbWVtb3J5Ci0jZGVmaW5lICAgIEhSRUdfRVZfVERNQUQJCQkweDAxMDAgLy8gdHggZnJhbWUgaW4gaG9zdCBtZW1vcnkgcHJvY2Vzc2VkCi0vLyNkZWZpbmUgICAgSFJFR19FVl9SWERNQQkJCTB4MDA0MCAvLyBmaXJtd2FyZSBraWNrcyBvZmYgRE1BIGVuZ2luZSAoYml0IGlzIG5vdCBmb3IgaG9zdCB1c2FnZSkKLS8vI2RlZmluZSAgICBIUkVHX0VWX1RYRE1BCQkJMHgwMDIwIC8vIGZpcm13YXJlIGtpY2tzIG9mZiBETUEgZW5naW5lIChiaXQgaXMgbm90IGZvciBob3N0IHVzYWdlKQotI2RlZmluZSAgICBIUkVHX0VWX0ZXX0RNQQkJCTB4MDQ2MCAvLyBmaXJtd2FyZSAvIERNQSBlbmdpbmUgSS9GIChiaXRzIGFyZSBub3QgZm9yIGhvc3QgdXNhZ2UpCisvLyNkZWZpbmUgICAgSFJFR19FVl9MUEVTQyAgICAgICAgICAweDA0MDAgLy8gZmlybXdhcmUgc2V0cyB0aGlzIGJpdCBhbmQgY2xlYXJzIGl0LCBub3QgZm9yIGhvc3QgdXNhZ2UuCisjZGVmaW5lICAgIEhSRUdfRVZfUkRNQUQgICAgICAgICAgICAweDAyMDAgLy8gcnggZnJhbWUgaW4gaG9zdCBtZW1vcnkKKyNkZWZpbmUgICAgSFJFR19FVl9URE1BRCAgICAgICAgICAgIDB4MDEwMCAvLyB0eCBmcmFtZSBpbiBob3N0IG1lbW9yeSBwcm9jZXNzZWQKKy8vI2RlZmluZSAgICBIUkVHX0VWX1JYRE1BICAgICAgICAgIDB4MDA0MCAvLyBmaXJtd2FyZSBraWNrcyBvZmYgRE1BIGVuZ2luZSAoYml0IGlzIG5vdCBmb3IgaG9zdCB1c2FnZSkKKy8vI2RlZmluZSAgICBIUkVHX0VWX1RYRE1BICAgICAgICAgIDB4MDAyMCAvLyBmaXJtd2FyZSBraWNrcyBvZmYgRE1BIGVuZ2luZSAoYml0IGlzIG5vdCBmb3IgaG9zdCB1c2FnZSkKKyNkZWZpbmUgICAgSFJFR19FVl9GV19ETUEgICAgICAgICAgIDB4MDQ2MCAvLyBmaXJtd2FyZSAvIERNQSBlbmdpbmUgSS9GIChiaXRzIGFyZSBub3QgZm9yIGhvc3QgdXNhZ2UpCiAjZWxzZQotI2RlZmluZSAgICBIUkVHX0VWX0ZXX0RNQQkJCTB4MDAwMAorI2RlZmluZSAgICBIUkVHX0VWX0ZXX0RNQSAgICAgICAgICAgMHgwMDAwCiAjZW5kaWYgLy8gSENGX0RNQQotI2RlZmluZSAgICBIUkVHX0VWX0lORk8JCQkJMHgwMDgwCS8vIEFzeW5jaHJvbm91cyBJbmZvcm1hdGlvbiBGcmFtZQotI2RlZmluZSAgICBIUkVHX0VWX0NNRAkJCQkweDAwMTAJLy8gQ29tbWFuZCBjb21wbGV0ZWQsIFN0YXR1cyBhbmQgUmVzcG9uc2UgYXZhaWxhYmxlCi0jZGVmaW5lICAgIEhSRUdfRVZfQUxMT0MJCQkweDAwMDgJLy8gQXN5bmNocm9ub3VzIHBhcnQgb2YgQWxsb2NhdGlvbi9SZWNsYWltIGNvbXBsZXRlZAotI2RlZmluZSAgICBIUkVHX0VWX1RYX0VYQwkJCTB4MDAwNAkvLyBBc3luY2hyb25vdXMgVHJhbnNtaXNzaW9uIHVuc3VjY2Vzc2Z1bCBjb21wbGV0ZWQKLSNkZWZpbmUgICAgSFJFR19FVl9UWAkJCQkweDAwMDIJLy8gQXN5bmNocm9ub3VzIFRyYW5zbWlzc2lvbiBzdWNjZXNzZnVsIGNvbXBsZXRlZAotI2RlZmluZSAgICBIUkVHX0VWX1JYCQkJCTB4MDAwMQkvLyBBc3luY2hyb25vdXMgUmVjZWl2ZSBGcmFtZQorI2RlZmluZSAgICBIUkVHX0VWX0lORk8gICAgICAgICAgICAgMHgwMDgwICAvLyBBc3luY2hyb25vdXMgSW5mb3JtYXRpb24gRnJhbWUKKyNkZWZpbmUgICAgSFJFR19FVl9DTUQgICAgICAgICAgICAgIDB4MDAxMCAgLy8gQ29tbWFuZCBjb21wbGV0ZWQsIFN0YXR1cyBhbmQgUmVzcG9uc2UgYXZhaWxhYmxlCisjZGVmaW5lICAgIEhSRUdfRVZfQUxMT0MgICAgICAgICAgICAweDAwMDggIC8vIEFzeW5jaHJvbm91cyBwYXJ0IG9mIEFsbG9jYXRpb24vUmVjbGFpbSBjb21wbGV0ZWQKKyNkZWZpbmUgICAgSFJFR19FVl9UWF9FWEMgICAgICAgICAgIDB4MDAwNCAgLy8gQXN5bmNocm9ub3VzIFRyYW5zbWlzc2lvbiB1bnN1Y2Nlc3NmdWwgY29tcGxldGVkCisjZGVmaW5lICAgIEhSRUdfRVZfVFggICAgICAgICAgICAgICAweDAwMDIgIC8vIEFzeW5jaHJvbm91cyBUcmFuc21pc3Npb24gc3VjY2Vzc2Z1bCBjb21wbGV0ZWQKKyNkZWZpbmUgICAgSFJFR19FVl9SWCAgICAgICAgICAgICAgIDB4MDAwMSAgLy8gQXN5bmNocm9ub3VzIFJlY2VpdmUgRnJhbWUKIAotI2RlZmluZSAgICBIUkVHX0VWX1RYX0VYVCAJCQkoIChIQ0ZfRVhUKSAmIChIQ0ZfRVhUX0lOVF9UWF9FWCB8IEhDRl9FWFRfSU5UX1RJQ0sgKSApCi0JCQkJCQkJCQkvKiBIUkVHX0VWX1RYX0VYVCA6PSAweDAwMDAgb3IgSFJFR19FVl9UWF9FWEMgYW5kL29yIEhSRUdfRVZfVElDSwotCQkJCQkJCQkJICogY291bGQgYmUgZXh0ZW5kZWQgd2l0aCBIUkVHX0VWX1RYICovCisjZGVmaW5lICAgIEhSRUdfRVZfVFhfRVhUICAgICAgICAgICAoIChIQ0ZfRVhUKSAmIChIQ0ZfRVhUX0lOVF9UWF9FWCB8IEhDRl9FWFRfSU5UX1RJQ0sgKSApCisvKiBIUkVHX0VWX1RYX0VYVCA6PSAweDAwMDAgb3IgSFJFR19FVl9UWF9FWEMgYW5kL29yIEhSRUdfRVZfVElDSworICogY291bGQgYmUgZXh0ZW5kZWQgd2l0aCBIUkVHX0VWX1RYICovCiAjaWYgSENGX0VYVF9JTlRfVFhfRVggIT0gSFJFR19FVl9UWF9FWEMKIGVycjogdGhlc2UgdmFsdWVzIHNob3VsZCBtYXRjaDsKICNlbmRpZiAvLyBIQ0ZfRVhUX0lOVF9UWF9FWCAvIEhSRUdfRVZfVFhfRVhDCkBAIC0yOTAsOTcgKzI1Myw5NyBAQAogI2VuZGlmIC8vIEhDRl9FWFRfSU5UX1RJQ0sgLyBIUkVHX0VWX1RJQ0sKIAogLy8qKioqKioqKioqKioqKioqKioqKioqKioqIEhvc3QgU29mdHdhcmUKLSNkZWZpbmUgSFJFR19TV18wCQkJCTB4MjgJCS8vCi0jZGVmaW5lIEhSRUdfU1dfMQkJCQkweDJBCQkvLwotI2RlZmluZSBIUkVHX1NXXzIJCQkJMHgyQwkJLy8KLS8vcnNydmQgI2RlZmluZSBIUkVHX1NXXzMJCTB4MkUJCS8vCisjZGVmaW5lIEhSRUdfU1dfMCAgICAgICAgICAgICAgIDB4MjggICAgICAgIC8vCisjZGVmaW5lIEhSRUdfU1dfMSAgICAgICAgICAgICAgIDB4MkEgICAgICAgIC8vCisjZGVmaW5lIEhSRUdfU1dfMiAgICAgICAgICAgICAgIDB4MkMgICAgICAgIC8vCisvL3JzcnZkICNkZWZpbmUgSFJFR19TV18zICAgICAgIDB4MkUgICAgICAgIC8vCiAvLyoqKioqKioqKioqKioqKioqKioqKioqKiogQ29udHJvbCBhbmQgQXV4aWxpYXJ5IFBvcnQKIAotI2RlZmluZSBIUkVHX0lPCQkJCQkweDEyCi0jZGVmaW5lCQlIUkVHX0lPX1NSRVNFVAkJCTB4MDAwMQotI2RlZmluZQkJSFJFR19JT19XQUtFVVBfQVNZTkMJMHgwMDAyCi0jZGVmaW5lCQlIUkVHX0lPX1dPS0VOX1VQCQkweDAwMDQKLSNkZWZpbmUgSFJFR19DTlRMCQkJCTB4MTQJCS8vCi0vLyNkZWZpbmUJCUhSRUdfQ05UTF9XQUtFVVBfU1lOQwkweDAwMDEKLSNkZWZpbmUJCUhSRUdfQ05UTF9BVVhfRU5BX1NUQVQJMHhDMDAwCi0jZGVmaW5lCQlIUkVHX0NOVExfQVVYX0RJU19TVEFUCTB4MDAwMAotI2RlZmluZQkJSFJFR19DTlRMX0FVWF9FTkFfQ05UTAkweDgwMDAKLSNkZWZpbmUJCUhSRUdfQ05UTF9BVVhfRElTX0NOVEwJMHg0MDAwCi0jZGVmaW5lCQlIUkVHX0NOVExfQVVYX0RTRAkJMHgyMDAwCi0jZGVmaW5lCQlIUkVHX0NOVExfQVVYX0VOQQkJKEhSRUdfQ05UTF9BVVhfRU5BX0NOVEwgfCBIUkVHX0NOVExfQVVYX0RJU19DTlRMICkKLSNkZWZpbmUgSFJFR19TUEFSRQkJCQkweDE2CQkvLwotI2RlZmluZSBIUkVHX0FVWF9QQUdFCQkJMHgzQQkJLy8KLSNkZWZpbmUgSFJFR19BVVhfT0ZGU0VUCQkJMHgzQwkJLy8KLSNkZWZpbmUgSFJFR19BVVhfREFUQQkJCTB4M0UJCS8vCisjZGVmaW5lIEhSRUdfSU8gICAgICAgICAgICAgICAgIDB4MTIKKyNkZWZpbmUgICAgIEhSRUdfSU9fU1JFU0VUICAgICAgICAgIDB4MDAwMQorI2RlZmluZSAgICAgSFJFR19JT19XQUtFVVBfQVNZTkMgICAgMHgwMDAyCisjZGVmaW5lICAgICBIUkVHX0lPX1dPS0VOX1VQICAgICAgICAweDAwMDQKKyNkZWZpbmUgSFJFR19DTlRMICAgICAgICAgICAgICAgMHgxNCAgICAgICAgLy8KKy8vI2RlZmluZSAgICAgICBIUkVHX0NOVExfV0FLRVVQX1NZTkMgICAweDAwMDEKKyNkZWZpbmUgICAgIEhSRUdfQ05UTF9BVVhfRU5BX1NUQVQgIDB4QzAwMAorI2RlZmluZSAgICAgSFJFR19DTlRMX0FVWF9ESVNfU1RBVCAgMHgwMDAwCisjZGVmaW5lICAgICBIUkVHX0NOVExfQVVYX0VOQV9DTlRMICAweDgwMDAKKyNkZWZpbmUgICAgIEhSRUdfQ05UTF9BVVhfRElTX0NOVEwgIDB4NDAwMAorI2RlZmluZSAgICAgSFJFR19DTlRMX0FVWF9EU0QgICAgICAgMHgyMDAwCisjZGVmaW5lICAgICBIUkVHX0NOVExfQVVYX0VOQSAgICAgICAoSFJFR19DTlRMX0FVWF9FTkFfQ05UTCB8IEhSRUdfQ05UTF9BVVhfRElTX0NOVEwgKQorI2RlZmluZSBIUkVHX1NQQVJFICAgICAgICAgICAgICAweDE2ICAgICAgICAvLworI2RlZmluZSBIUkVHX0FVWF9QQUdFICAgICAgICAgICAweDNBICAgICAgICAvLworI2RlZmluZSBIUkVHX0FVWF9PRkZTRVQgICAgICAgICAweDNDICAgICAgICAvLworI2RlZmluZSBIUkVHX0FVWF9EQVRBICAgICAgICAgICAweDNFICAgICAgICAvLwogCiAjaWYgSENGX0RNQQogLy8qKioqKioqKioqKioqKioqKioqKioqKioqIERNQSAoYnVzIG1hc3RlcmluZykKLQkvLyBCZSBjYXJlZnVsIHRvIHVzZSB0aGVzZSByZWdpc3RlcnMgb25seSBhdCBhIGdlbnVpbmUgMzIgYml0cyBOSUMKLQkvLyBPbiAxNiBiaXRzIE5JQ3MsIHRoZXNlIGFkZHJlc3NlcyBhcmUgbWFwcGVkIGludG8gdGhlIHJhbmdlIDB4MDAgdGhyb3VnaCAweDNGIHdpdGggYWxsIGNvbnNlcXVlbmNlcwotCS8vIHRoZXJlb2YsIGUuZy4gIEhSRUdfRE1BX0NUUkwgcmVnaXN0ZXIgbWFwcyB0byBIUkVHX0NNRC4KLSNkZWZpbmUgSFJFR19ETUFfQ1RSTAkJCQkJCTB4MDA0MAotI2RlZmluZSBIUkVHX1RYRE1BX1BUUjMyCQkJCQkweDAwNDQKLSNkZWZpbmUgSFJFR19UWERNQV9QUklPX1BUUjMyCQkJCTB4MDA0OAotI2RlZmluZSBIUkVHX1RYRE1BX0hJUFJJT19QVFIzMgkJCQkweDAwNEMKLSNkZWZpbmUgSFJFR19SWERNQV9QVFIzMgkJCQkJMHgwMDUwCi0jZGVmaW5lIEhSRUdfQ0FSRERFVEVDVF8xCQkJCQkweDAwN0MgLy8gY29udGFpbnMgN0QzNwotI2RlZmluZSBIUkVHX0NBUkRERVRFQ1RfMgkJCQkJMHgwMDdFIC8vIGNvbnRhaW5zIDdERTcKLSNkZWZpbmUgSFJFR19GUkVFVElNRVIJCQkJCQkweDAwNTgKLSNkZWZpbmUgSFJFR19ETUFfUlhfQ05UCQkJCQkJMHgwMDI2CisvLyBCZSBjYXJlZnVsIHRvIHVzZSB0aGVzZSByZWdpc3RlcnMgb25seSBhdCBhIGdlbnVpbmUgMzIgYml0cyBOSUMKKy8vIE9uIDE2IGJpdHMgTklDcywgdGhlc2UgYWRkcmVzc2VzIGFyZSBtYXBwZWQgaW50byB0aGUgcmFuZ2UgMHgwMCB0aHJvdWdoIDB4M0Ygd2l0aCBhbGwgY29uc2VxdWVuY2VzCisvLyB0aGVyZW9mLCBlLmcuICBIUkVHX0RNQV9DVFJMIHJlZ2lzdGVyIG1hcHMgdG8gSFJFR19DTUQuCisjZGVmaW5lIEhSRUdfRE1BX0NUUkwgICAgICAgICAgICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBIUkVHX1RYRE1BX1BUUjMyICAgICAgICAgICAgICAgICAgICAweDAwNDQKKyNkZWZpbmUgSFJFR19UWERNQV9QUklPX1BUUjMyICAgICAgICAgICAgICAgMHgwMDQ4CisjZGVmaW5lIEhSRUdfVFhETUFfSElQUklPX1BUUjMyICAgICAgICAgICAgIDB4MDA0QworI2RlZmluZSBIUkVHX1JYRE1BX1BUUjMyICAgICAgICAgICAgICAgICAgICAweDAwNTAKKyNkZWZpbmUgSFJFR19DQVJEREVURUNUXzEgICAgICAgICAgICAgICAgICAgMHgwMDdDIC8vIGNvbnRhaW5zIDdEMzcKKyNkZWZpbmUgSFJFR19DQVJEREVURUNUXzIgICAgICAgICAgICAgICAgICAgMHgwMDdFIC8vIGNvbnRhaW5zIDdERTcKKyNkZWZpbmUgSFJFR19GUkVFVElNRVIgICAgICAgICAgICAgICAgICAgICAgMHgwMDU4CisjZGVmaW5lIEhSRUdfRE1BX1JYX0NOVCAgICAgICAgICAgICAgICAgICAgIDB4MDAyNgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIERlZmluZXMgZm9yIHRoZSBiaXRzIGluIHRoZSBEbWFDb250cm9sIHJlZ2lzdGVyIChANDBoKQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYSFdFTgkJCQkweDgwMDAwMDAwIC8vIGhpZ2ggd29yZCBlbmFibGUgYml0Ci0jZGVmaW5lIEhSRUdfRE1BX0NUUkxfUlhSRVNFVAkJCQkweDQwMDAwMDAwIC8vIHR4IGRtYSBpbml0IGJpdAotI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYQkFQMQkJCQlCSVQyOQotI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYX1NUQUxMRUQJCQlCSVQyOAotI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYQVVUT0FDS19ETUFET05FCQlCSVQyNyAvLyBubyBob3N0IGludm9sdmVtZW50IHJlcS4gZm9yIFRETUFET05FIGV2ZW50Ci0jZGVmaW5lIEhSRUdfRE1BX0NUUkxfUlhBVVRPQUNLX0lORk8JCUJJVDI2IC8vIG5vIGhvc3QgaW52b2x2ZW1lbnQgcmVxLiBmb3IgYWxsb2MgZXZlbnQKLSNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWEFVVE9BQ0tfRE1BRU4JCTB4MDIwMDAwMDAgLy8gbm8gaG9zdCBpbnZvbHZlbWVudCByZXEuIGZvciBUeERNQWVuIGV2ZW50Ci0jZGVmaW5lIEhSRUdfRE1BX0NUUkxfUlhBVVRPQUNLX1JYCQkJMHgwMTAwMDAwMCAvLyBubyBob3N0IGludm9sdmVtZW50IHJlcS4gZm9yIHR4IGV2ZW50Ci0jZGVmaW5lIEhSRUdfRE1BX0NUUkxfUlhfQlVTWQkJCQlCSVQyMyAvLyByZWFkIG9ubHkgYml0Ci0vLyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWF9SQlVGQ09OVF9QTEFJTgkJMAkgIC8vIGJpdHMgMjEuLjIwCi0vLyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWF9NT0RFX1BMQUlOX0RNQQkJMAkgIC8vIG1vZGUgMAotI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYX01PREVfU0lOR0xFX1BBQ0tFVAkweDAwMDEwMDAwIC8vIG1vZGUgMQotI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYX01PREVfTVVMVElfUEFDS0VUCTB4MDAwMjAwMDAgLy8gbW9kZSAyCi0vLyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWF9NT0RFX0RJU0FCTEUJCSgweDAwMDIwMDAwfDB4MDAwMTAwMDApIC8vIGRpc2FibGUgdHggZG1hIGVuZ2luZQotI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYSFdFTgkJCQkweDgwMDAgLy8gbG93IHdvcmQgZW5hYmxlIGJpdAotI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYUkVTRVQJCQkJMHg0MDAwIC8vIHJ4IGRtYSBpbml0IGJpdAotI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYQkFQMQkJCQlCSVQxMwotI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYQVVUT0FDS19ETUFET05FCQlCSVQxMSAvLyBubyBob3N0IGludm9sdmVtZW50IHJlcS4gZm9yIFJ4RE1BRE9ORSBldmVudAotI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYQVVUT0FDS19ETUFFTgkJMHgwMDAwMDQwMCAvLyBubyBob3N0IGludm9sdmVtZW50IHJlcS4gZm9yIFJ4RE1BZW4gZXZlbnQKLSNkZWZpbmUgSFJFR19ETUFfQ1RSTF9UWEFVVE9BQ0tfRE1BQUxMT0MJMHgwMDAwMDIwMCAgLy8gbm8gaG9zdCBpbnZvbHZlbWVudCByZXEuIGZvciBpbmZvIGV2ZW50Ci0jZGVmaW5lIEhSRUdfRE1BX0NUUkxfVFhBVVRPQUNLX1RYCQkJMHgwMDAwMDEwMCAgLy8gbm8gaG9zdCBpbnZvbHZlbWVudCByZXEuIGZvciByeCBldmVudAotI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYX0JVU1kJCQkJQklUNyAgLy8gcmVhZCBvbmx5IGJpdAotLy8jZGVmaW5lIEhSRUdfRE1BX0NUUkxfVFhfVEJVRkNPTlRfUExBSU4JCTAJICAvLyBiaXRzIDYuLjUKLS8vI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYX01PREVfUExBSU5fRE1BCQkwCSAgLy8gbW9kZSAwCi0jZGVmaW5lIEhSRUdfRE1BX0NUUkxfVFhfTU9ERV9TSU5HTEVfUEFDS0VUCUJJVDAgLy8gbW9kZSAxCi0jZGVmaW5lIEhSRUdfRE1BX0NUUkxfVFhfTU9ERV9NVUxUSV9QQUNLRVQJMHgwMDAwMDAwMiAvLyBtb2RlIDIKLS8vI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYX01PREVfRElTQUJMRQkJKDB4MDAwMDAwMDF8MHgwMDAwMDAwMikgLy8gZGlzYWJsZSB0eCBkbWEgZW5naW5lCisgKiBEZWZpbmVzIGZvciB0aGUgYml0cyBpbiB0aGUgRG1hQ29udHJvbCByZWdpc3RlciAoQDQwaCkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfUlhIV0VOICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAgLy8gaGlnaCB3b3JkIGVuYWJsZSBiaXQKKyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWFJFU0VUICAgICAgICAgICAgICAgMHg0MDAwMDAwMCAvLyB0eCBkbWEgaW5pdCBiaXQKKyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWEJBUDEgICAgICAgICAgICAgICAgQklUMjkKKyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWF9TVEFMTEVEICAgICAgICAgICAgQklUMjgKKyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWEFVVE9BQ0tfRE1BRE9ORSAgICAgQklUMjcgLy8gbm8gaG9zdCBpbnZvbHZlbWVudCByZXEuIGZvciBURE1BRE9ORSBldmVudAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYQVVUT0FDS19JTkZPICAgICAgICBCSVQyNiAvLyBubyBob3N0IGludm9sdmVtZW50IHJlcS4gZm9yIGFsbG9jIGV2ZW50CisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfUlhBVVRPQUNLX0RNQUVOICAgICAgIDB4MDIwMDAwMDAgLy8gbm8gaG9zdCBpbnZvbHZlbWVudCByZXEuIGZvciBUeERNQWVuIGV2ZW50CisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfUlhBVVRPQUNLX1JYICAgICAgICAgIDB4MDEwMDAwMDAgLy8gbm8gaG9zdCBpbnZvbHZlbWVudCByZXEuIGZvciB0eCBldmVudAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1JYX0JVU1kgICAgICAgICAgICAgICBCSVQyMyAvLyByZWFkIG9ubHkgYml0CisvLyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWF9SQlVGQ09OVF9QTEFJTiAgICAgICAwICAgICAvLyBiaXRzIDIxLi4yMAorLy8jZGVmaW5lIEhSRUdfRE1BX0NUUkxfUlhfTU9ERV9QTEFJTl9ETUEgICAgICAgMCAgICAgLy8gbW9kZSAwCisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfUlhfTU9ERV9TSU5HTEVfUEFDS0VUIDB4MDAwMTAwMDAgLy8gbW9kZSAxCisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfUlhfTU9ERV9NVUxUSV9QQUNLRVQgIDB4MDAwMjAwMDAgLy8gbW9kZSAyCisvLyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9SWF9NT0RFX0RJU0FCTEUgICAgICgweDAwMDIwMDAwfDB4MDAwMTAwMDApIC8vIGRpc2FibGUgdHggZG1hIGVuZ2luZQorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYSFdFTiAgICAgICAgICAgICAgICAweDgwMDAgLy8gbG93IHdvcmQgZW5hYmxlIGJpdAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYUkVTRVQgICAgICAgICAgICAgICAweDQwMDAgLy8gcnggZG1hIGluaXQgYml0CisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfVFhCQVAxICAgICAgICAgICAgICAgIEJJVDEzCisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfVFhBVVRPQUNLX0RNQURPTkUgICAgIEJJVDExIC8vIG5vIGhvc3QgaW52b2x2ZW1lbnQgcmVxLiBmb3IgUnhETUFET05FIGV2ZW50CisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfVFhBVVRPQUNLX0RNQUVOICAgICAgIDB4MDAwMDA0MDAgLy8gbm8gaG9zdCBpbnZvbHZlbWVudCByZXEuIGZvciBSeERNQWVuIGV2ZW50CisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfVFhBVVRPQUNLX0RNQUFMTE9DICAgIDB4MDAwMDAyMDAgIC8vIG5vIGhvc3QgaW52b2x2ZW1lbnQgcmVxLiBmb3IgaW5mbyBldmVudAorI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYQVVUT0FDS19UWCAgICAgICAgICAweDAwMDAwMTAwICAvLyBubyBob3N0IGludm9sdmVtZW50IHJlcS4gZm9yIHJ4IGV2ZW50CisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfVFhfQlVTWSAgICAgICAgICAgICAgIEJJVDcgIC8vIHJlYWQgb25seSBiaXQKKy8vI2RlZmluZSBIUkVHX0RNQV9DVFJMX1RYX1RCVUZDT05UX1BMQUlOICAgICAgIDAgICAgIC8vIGJpdHMgNi4uNQorLy8jZGVmaW5lIEhSRUdfRE1BX0NUUkxfVFhfTU9ERV9QTEFJTl9ETUEgICAgICAgMCAgICAgLy8gbW9kZSAwCisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfVFhfTU9ERV9TSU5HTEVfUEFDS0VUIEJJVDAgLy8gbW9kZSAxCisjZGVmaW5lIEhSRUdfRE1BX0NUUkxfVFhfTU9ERV9NVUxUSV9QQUNLRVQgIDB4MDAwMDAwMDIgLy8gbW9kZSAyCisvLyNkZWZpbmUgSFJFR19ETUFfQ1RSTF9UWF9NT0RFX0RJU0FCTEUgICAgICgweDAwMDAwMDAxfDB4MDAwMDAwMDIpIC8vIGRpc2FibGUgdHggZG1hIGVuZ2luZQogCiAvL2NvbmZpZ3VyYXRpb24gRFdPUkQgdG8gY29uZmlndXJlIERNQSBmb3IgbW9kZTIgb3BlcmF0aW9uLCB1c2luZyBCQVAwIGFzIHRoZSBETUEgQkFQLgogI2RlZmluZSBETUFfQ1RSTFNUQVRfR08gKEhSRUdfRE1BX0NUUkxfUlhIV0VOIHwgSFJFR19ETUFfQ1RSTF9SWF9NT0RFX01VTFRJX1BBQ0tFVCB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVHX0RNQV9DVFJMX1JYQVVUT0FDS19ETUFFTiB8IEhSRUdfRE1BX0NUUkxfUlhBVVRPQUNLX1JYIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgIEhSRUdfRE1BX0NUUkxfVFhIV0VOIHwgLyo7P0hSRUdfRE1BX0NUUkxfVFhfVEJVRkNPTlRfUExBSU4gfCovIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBIUkVHX0RNQV9DVFJMX1RYX01PREVfTVVMVElfUEFDS0VUIHwgSFJFR19ETUFfQ1RSTF9UWEFVVE9BQ0tfRE1BRU4gfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBIUkVHX0RNQV9DVFJMX1RYX01PREVfTVVMVElfUEFDS0VUIHwgSFJFR19ETUFfQ1RSTF9UWEFVVE9BQ0tfRE1BRU4gfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgSFJFR19ETUFfQ1RSTF9UWEFVVE9BQ0tfRE1BQUxMT0MpCiAKIC8vY29uZmlndXJhdGlvbiBEV09SRCB0byByZXNldCBib3RoIHRoZSBUeCBhbmQgUnggRE1BIGVuZ2luZXMKICNkZWZpbmUgRE1BX0NUUkxTVEFUX1JFU0VUIChIUkVHX0RNQV9DVFJMX1JYSFdFTiB8IEhSRUdfRE1BX0NUUkxfUlhSRVNFVCB8IEhSRUdfRE1BX0NUUkxfVFhIV0VOIHwgSFJFR19ETUFfQ1RSTF9UWFJFU0VUKQogCi0vLyNkZWZpbmUgREVTQ19ETUFfT1dORUQgICAgIAkJMHg4MDAwMDAwMCAJCQkJCS8vIEJJVDMxCi0jZGVmaW5lIERFU0NfRE1BX09XTkVEICAgICAJCTB4ODAwMAkgCQkJCQkvLyBCSVQzMQotI2RlZmluZSBERVNDX1NPUCAgIAkJCSAJMHg4MDAwIAkJCQkJCS8vIEJJVDE1Ci0jZGVmaW5lIERFU0NfRU9QICAgCQkJIAkweDQwMDAgCQkJCQkJLy8gQklUMTQKKy8vI2RlZmluZSBERVNDX0RNQV9PV05FRCAgICAgICAgICAgIDB4ODAwMDAwMDAgICAgICAgICAgICAgICAgICAvLyBCSVQzMQorI2RlZmluZSBERVNDX0RNQV9PV05FRCAgICAgICAgICAweDgwMDAgICAgICAgICAgICAgICAgICAgICAgLy8gQklUMzEKKyNkZWZpbmUgREVTQ19TT1AgICAgICAgICAgICAgICAgMHg4MDAwICAgICAgICAgICAgICAgICAgICAgIC8vIEJJVDE1CisjZGVmaW5lIERFU0NfRU9QICAgICAgICAgICAgICAgIDB4NDAwMCAgICAgICAgICAgICAgICAgICAgICAvLyBCSVQxNAogCi0jZGVmaW5lIERNQV9SWAkJCQkwCi0jZGVmaW5lIERNQV9UWAkJCQkxCisjZGVmaW5lIERNQV9SWCAgICAgICAgICAgICAgMAorI2RlZmluZSBETUFfVFggICAgICAgICAgICAgIDEKIAotLy8gI2RlZmluZSBJRkJfUnhGaXJzdERlc2MJCUlGQl9GaXJzdERlc2NbRE1BX1JYXQotLy8gI2RlZmluZSBJRkJfVHhGaXJzdERlc2MJCUlGQl9GaXJzdERlc2NbRE1BX1RYXQotLy8gI2RlZmluZSBJRkJfUnhMYXN0RGVzYwkJSUZCX0xhc3REZXNjW0RNQV9SWF0KLS8vICNkZWZpbmUgSUZCX1R4TGFzdERlc2MJCUlGQl9MYXN0RGVzY1tETUFfVFhdCisvLyAjZGVmaW5lIElGQl9SeEZpcnN0RGVzYyAgICAgIElGQl9GaXJzdERlc2NbRE1BX1JYXQorLy8gI2RlZmluZSBJRkJfVHhGaXJzdERlc2MgICAgICBJRkJfRmlyc3REZXNjW0RNQV9UWF0KKy8vICNkZWZpbmUgSUZCX1J4TGFzdERlc2MgICAgICAgSUZCX0xhc3REZXNjW0RNQV9SWF0KKy8vICNkZWZpbmUgSUZCX1R4TGFzdERlc2MgICAgICAgSUZCX0xhc3REZXNjW0RNQV9UWF0KIAogI2VuZGlmIC8vIEhDRl9ETUEKIC8vCkBAIC0zOTAsOTYgKzM1Myw5NiBAQAogCiAKIC8vIEhlcm1lcyBDb21tYW5kIENvZGVzIGFuZCBRdWFsaWZpZXIgYml0cwotI2RlZmluZSAJSENNRF9CVVNZCQkJMHg4MDAwCS8vIEJ1c3kgYml0LCBhcHBsaWNhYmxlIGZvciBhbGwgY29tbWFuZHMKLSNkZWZpbmUgSENNRF9JTkkJCQkJMHgwMDAwCS8vCi0jZGVmaW5lIEhDTURfRU5BQkxFCQkJCUhDRl9DTlRMX0VOQUJMRQkJLy8gMHgwMDAxCi0jZGVmaW5lIEhDTURfRElTQUJMRQkJCUhDRl9DTlRMX0RJU0FCTEUJLy8gMHgwMDAyCi0jZGVmaW5lIEhDTURfQ09OTkVDVAkJCUhDRl9DTlRMX0NPTk5FQ1QJLy8gMHgwMDAzCi0jZGVmaW5lIEhDTURfRVhFQ1VURQkJCTB4MDAwNAkvLwotI2RlZmluZSBIQ01EX0RJU0NPTk5FQ1QJCQlIQ0ZfQ05UTF9ESVNDT05ORUNUCS8vIDB4MDAwNQotI2RlZmluZSBIQ01EX1NMRUVQCQkJCTB4MDAwNgkvLwotI2RlZmluZSBIQ01EX0NPTlRJTlVFCQkJSENGX0NOVExfQ09OVElOVUUJLy8gMHgwMDA3Ci0jZGVmaW5lIAlIQ01EX1JFVFJZCQkJMHgwMTAwCS8vIFJldHJ5IGJpdAotI2RlZmluZSBIQ01EX0FMTE9DCQkJCTB4MDAwQQkvLwotI2RlZmluZSBIQ01EX1RYCQkJCQkweDAwMEIJLy8KLSNkZWZpbmUgCUhDTURfUkVDTAkJCTB4MDEwMAkvLyBSZWNsYWltIGJpdCwgYXBwbGljYWJsZSBmb3IgVHggYW5kIElucXVpcmUKLSNkZWZpbmUgSENNRF9JTlFVSVJFCQkJMHgwMDExCS8vCi0jZGVmaW5lIEhDTURfQUNDRVNTCQkJCTB4MDAyMQkvLwotI2RlZmluZSAJSENNRF9BQ0NFU1NfV1JJVEUJMHgwMTAwCS8vIFdyaXRlIGJpdAotI2RlZmluZSBIQ01EX1BST0dSQU0JCQkweDAwMjIJLy8KLSNkZWZpbmUgSENNRF9SRUFEX01JRgkJCTB4MDAzMAotI2RlZmluZSBIQ01EX1dSSVRFX01JRgkJCTB4MDAzMQotI2RlZmluZSBIQ01EX1RIRVNFVVMJCQkweDAwMzgKLSNkZWZpbmUgCUhDTURfU1RBUlRQUkVBTUJMRSAgMHgwRTAwCS8vIFN0YXJ0IGNvbnRpbnVvdXMgcHJlYW1ibGUgVHgKLSNkZWZpbmUgCUhDTURfU1RPUAkJCTB4MEYwMAkvLyBTdG9wIFRoZXNldXMgdGVzdCBtb2RlCisjZGVmaW5lICAgICBIQ01EX0JVU1kgICAgICAgICAgIDB4ODAwMCAgLy8gQnVzeSBiaXQsIGFwcGxpY2FibGUgZm9yIGFsbCBjb21tYW5kcworI2RlZmluZSBIQ01EX0lOSSAgICAgICAgICAgICAgICAweDAwMDAgIC8vCisjZGVmaW5lIEhDTURfRU5BQkxFICAgICAgICAgICAgIEhDRl9DTlRMX0VOQUJMRSAgICAgLy8gMHgwMDAxCisjZGVmaW5lIEhDTURfRElTQUJMRSAgICAgICAgICAgIEhDRl9DTlRMX0RJU0FCTEUgICAgLy8gMHgwMDAyCisjZGVmaW5lIEhDTURfQ09OTkVDVCAgICAgICAgICAgIEhDRl9DTlRMX0NPTk5FQ1QgICAgLy8gMHgwMDAzCisjZGVmaW5lIEhDTURfRVhFQ1VURSAgICAgICAgICAgIDB4MDAwNCAgLy8KKyNkZWZpbmUgSENNRF9ESVNDT05ORUNUICAgICAgICAgSENGX0NOVExfRElTQ09OTkVDVCAvLyAweDAwMDUKKyNkZWZpbmUgSENNRF9TTEVFUCAgICAgICAgICAgICAgMHgwMDA2ICAvLworI2RlZmluZSBIQ01EX0NPTlRJTlVFICAgICAgICAgICBIQ0ZfQ05UTF9DT05USU5VRSAgIC8vIDB4MDAwNworI2RlZmluZSAgICAgSENNRF9SRVRSWSAgICAgICAgICAweDAxMDAgIC8vIFJldHJ5IGJpdAorI2RlZmluZSBIQ01EX0FMTE9DICAgICAgICAgICAgICAweDAwMEEgIC8vCisjZGVmaW5lIEhDTURfVFggICAgICAgICAgICAgICAgIDB4MDAwQiAgLy8KKyNkZWZpbmUgICAgIEhDTURfUkVDTCAgICAgICAgICAgMHgwMTAwICAvLyBSZWNsYWltIGJpdCwgYXBwbGljYWJsZSBmb3IgVHggYW5kIElucXVpcmUKKyNkZWZpbmUgSENNRF9JTlFVSVJFICAgICAgICAgICAgMHgwMDExICAvLworI2RlZmluZSBIQ01EX0FDQ0VTUyAgICAgICAgICAgICAweDAwMjEgIC8vCisjZGVmaW5lICAgICBIQ01EX0FDQ0VTU19XUklURSAgIDB4MDEwMCAgLy8gV3JpdGUgYml0CisjZGVmaW5lIEhDTURfUFJPR1JBTSAgICAgICAgICAgIDB4MDAyMiAgLy8KKyNkZWZpbmUgSENNRF9SRUFEX01JRiAgICAgICAgICAgMHgwMDMwCisjZGVmaW5lIEhDTURfV1JJVEVfTUlGICAgICAgICAgIDB4MDAzMQorI2RlZmluZSBIQ01EX1RIRVNFVVMgICAgICAgICAgICAweDAwMzgKKyNkZWZpbmUgICAgIEhDTURfU1RBUlRQUkVBTUJMRSAgMHgwRTAwICAvLyBTdGFydCBjb250aW51b3VzIHByZWFtYmxlIFR4CisjZGVmaW5lICAgICBIQ01EX1NUT1AgICAgICAgICAgIDB4MEYwMCAgLy8gU3RvcCBUaGVzZXVzIHRlc3QgbW9kZQogCiAKIC8vQ29uZmlndXJhdGlvbiBNYW5hZ2VtZW50CiAvLwogCi0jZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19QUklfM19CT1RUT00JMQkvLyBEZWZhdWx0IEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBQcmltYXJ5IEZpcm13YXJlIC0gZHJpdmVyIEkvRgotI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfUFJJXzNfVE9QCTEJLy8gRGVmYXVsdCBUb3AgICAgQ29tcGF0aWJpbGl0eSBmb3IgUHJpbWFyeSBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSV8zX0JPVFRPTSAxICAgLy8gRGVmYXVsdCBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgUHJpbWFyeSBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSV8zX1RPUCAgICAxICAgLy8gRGVmYXVsdCBUb3AgICAgQ29tcGF0aWJpbGl0eSBmb3IgUHJpbWFyeSBGaXJtd2FyZSAtIGRyaXZlciBJL0YKIAotI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzRfQk9UVE9NCTEJLy8gRGVmYXVsdCBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgSC9XIC0gZHJpdmVyIEkvRgotI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzRfVE9QCTEJLy8gRGVmYXVsdCBUb3AgICAgQ29tcGF0aWJpbGl0eSBmb3IgSC9XIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzRfQk9UVE9NIDEgICAvLyBEZWZhdWx0IEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBIL1cgLSBkcml2ZXIgSS9GCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9UT1AgICAgMSAgIC8vIERlZmF1bHQgVG9wICAgIENvbXBhdGliaWxpdHkgZm9yIEgvVyAtIGRyaXZlciBJL0YKIAotI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfQk9UVE9NCTEJLy8gRGVmYXVsdCBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgSC9XIC0gZHJpdmVyIEkvRgotI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfVE9QCTEJLy8gRGVmYXVsdCBUb3AgICAgQ29tcGF0aWJpbGl0eSBmb3IgSC9XIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfQk9UVE9NIDEgICAvLyBEZWZhdWx0IEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBIL1cgLSBkcml2ZXIgSS9GCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNV9UT1AgICAgMSAgIC8vIERlZmF1bHQgVG9wICAgIENvbXBhdGliaWxpdHkgZm9yIEgvVyAtIGRyaXZlciBJL0YKIAogI2lmIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9XUEEKLSNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8xX0JPVFRPTQkxNgkvLyBEZWZhdWx0IEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBBUCBGaXJtd2FyZSAtIGRyaXZlciBJL0YKLSNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8xX1RPUCAgICAxNgkvLyBEZWZhdWx0IFRvcCAgICBDb21wYXRpYmlsaXR5IGZvciBBUCBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8xX0JPVFRPTSAxNiAgLy8gRGVmYXVsdCBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19BUEZfMV9UT1AgICAgMTYgIC8vIERlZmF1bHQgVG9wICAgIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgogI2Vsc2UgIC8vOz8gaXMgdGhpcyBSRUFMTFkgTy5LLgotI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzFfQk9UVE9NCTEJLy8gRGVmYXVsdCBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCi0jZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19BUEZfMV9UT1AgICAgMQkvLyBEZWZhdWx0IFRvcCAgICBDb21wYXRpYmlsaXR5IGZvciBBUCBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8xX0JPVFRPTSAxICAgLy8gRGVmYXVsdCBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19BUEZfMV9UT1AgICAgMSAgIC8vIERlZmF1bHQgVG9wICAgIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgogI2VuZGlmIC8vIEhDRl9UWVBFX1dQQQogCi0jZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19BUEZfMl9CT1RUT00JMgkvLyBEZWZhdWx0IEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBBUCBGaXJtd2FyZSAtIGRyaXZlciBJL0YKLSNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX1RPUCAgICAyCS8vIERlZmF1bHQgVG9wICAgIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfQk9UVE9NIDIgICAvLyBEZWZhdWx0IEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBBUCBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX1RPUCAgICAyICAgLy8gRGVmYXVsdCBUb3AgICAgQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCiAKLSNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8zX0JPVFRPTQkxCS8vIERlZmF1bHQgQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgotI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzNfVE9QICAgIDEJLy8gRGVmYXVsdCBUb3AgICAgQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19BUEZfM19CT1RUT00gMSAgIC8vIERlZmF1bHQgQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzNfVE9QICAgIDEgICAvLyBEZWZhdWx0IFRvcCAgICBDb21wYXRpYmlsaXR5IGZvciBBUCBGaXJtd2FyZSAtIGRyaXZlciBJL0YKIAotI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzRfQk9UVE9NCTEJLy8gRGVmYXVsdCBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCi0jZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19BUEZfNF9UT1AgICAgMQkvLyBEZWZhdWx0IFRvcCAgICBDb21wYXRpYmlsaXR5IGZvciBBUCBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl80X0JPVFRPTSAxICAgLy8gRGVmYXVsdCBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19BUEZfNF9UT1AgICAgMSAgIC8vIERlZmF1bHQgVG9wICAgIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgogCiAjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUKLSNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX0JPVFRPTQk2CS8vIERlZmF1bHQgQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIFN0YXRpb24gRmlybXdhcmUgLSBkcml2ZXIgSS9GCi0jZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9UT1AgICAgNgkvLyBEZWZhdWx0IFRvcCAgICBDb21wYXRpYmlsaXR5IGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzJfQk9UVE9NIDYgICAvLyBEZWZhdWx0IEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzJfVE9QICAgIDYgICAvLyBEZWZhdWx0IFRvcCAgICBDb21wYXRpYmlsaXR5IGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgogI2Vsc2UgLy8gKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUKLSNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX0JPVFRPTQkxCS8vIERlZmF1bHQgQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIFN0YXRpb24gRmlybXdhcmUgLSBkcml2ZXIgSS9GCi0jZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9UT1AgICAgMgkvLyBEZWZhdWx0IFRvcCAgICBDb21wYXRpYmlsaXR5IGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzJfQk9UVE9NIDEgICAvLyBEZWZhdWx0IEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzJfVE9QICAgIDIgICAvLyBEZWZhdWx0IFRvcCAgICBDb21wYXRpYmlsaXR5IGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgogI2VuZGlmIC8vIChIQ0ZfVFlQRSkgJiBIQ0ZfVFlQRV9ISUk1CiAKLSNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8zX0JPVFRPTQkxCS8vIERlZmF1bHQgQm90dG9tIENvbXBhdGliaWxpdHkgZm9yIFN0YXRpb24gRmlybXdhcmUgLSBkcml2ZXIgSS9GCi0jZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19TVEFfM19UT1AgICAgMQkvLyBEZWZhdWx0IFRvcCAgICBDb21wYXRpYmlsaXR5IGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzNfQk9UVE9NIDEgICAvLyBEZWZhdWx0IEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzNfVE9QICAgIDEgICAvLyBEZWZhdWx0IFRvcCAgICBDb21wYXRpYmlsaXR5IGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgogCi0jZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19TVEFfNF9CT1RUT00JMQkvLyBEZWZhdWx0IEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgotI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzRfVE9QICAgIDEJLy8gRGVmYXVsdCBUb3AgICAgQ29tcGF0aWJpbGl0eSBmb3IgU3RhdGlvbiBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV80X0JPVFRPTSAxICAgLy8gRGVmYXVsdCBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgU3RhdGlvbiBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV80X1RPUCAgICAxICAgLy8gRGVmYXVsdCBUb3AgICAgQ29tcGF0aWJpbGl0eSBmb3IgU3RhdGlvbiBGaXJtd2FyZSAtIGRyaXZlciBJL0YKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICNpZiBkZWZpbmVkIEhDRl9DRkdfUFJJXzFfVE9QIHx8IGRlZmluZWQgSENGX0NGR19QUklfMV9CT1RUT00KLWVycjogUFJJXzEgbm90IHN1cHBvcnRlZCBmb3IgSC1JOwkvLyBDb21wYXRpYmlsaXR5IGZvciBQcmltYXJ5IEZpcm13YXJlIC0gZHJpdmVyIEkvRgorZXJyOiBQUklfMSBub3Qgc3VwcG9ydGVkIGZvciBILUk7ICAgLy8gQ29tcGF0aWJpbGl0eSBmb3IgUHJpbWFyeSBGaXJtd2FyZSAtIGRyaXZlciBJL0YKICNlbmRpZiAvLyBIQ0ZfQ0ZHX1BSSV8xX1RPUCAvIEhDRl9DRkdfUFJJXzFfQk9UVE9NCiAKICNpZiBkZWZpbmVkIEhDRl9DRkdfUFJJXzJfVE9QIHx8IGRlZmluZWQgSENGX0NGR19QUklfMl9CT1RUT00KLWVycjogUFJJXzIgbm90IHN1cHBvcnRlZCBmb3IgSC1JOwkvLyBDb21wYXRpYmlsaXR5IGZvciBQcmltYXJ5IEZpcm13YXJlIC0gZHJpdmVyIEkvRgorZXJyOiBQUklfMiBub3Qgc3VwcG9ydGVkIGZvciBILUk7ICAgLy8gQ29tcGF0aWJpbGl0eSBmb3IgUHJpbWFyeSBGaXJtd2FyZSAtIGRyaXZlciBJL0YKICNlbmRpZiAvLyBIQ0ZfQ0ZHX1BSSV8yX1RPUCAvIEhDRl9DRkdfUFJJXzJfQk9UVE9NCiAKLSNpZmRlZiBIQ0ZfQ0ZHX1BSSV8zX1RPUAkJCQkJCQkJCS8vIFRvcCBDb21wYXRpYmlsaXR5IGZvciBQcmltYXJ5IEZpcm13YXJlIC0gZHJpdmVyIEkvRgotI2lmIEhDRl9DRkdfUFJJXzNfVE9QID09IDAgfHwgXAorI2lmZGVmIEhDRl9DRkdfUFJJXzNfVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG9wIENvbXBhdGliaWxpdHkgZm9yIFByaW1hcnkgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjaWYgSENGX0NGR19QUklfM19UT1AgPT0gMCB8fAkJCQkJCVwKIAlDRkdfRFJWX0FDVF9SQU5HRVNfUFJJXzNfQk9UVE9NIDw9IEhDRl9DRkdfUFJJXzNfVE9QICYmIEhDRl9DRkdfUFJJXzNfVE9QIDw9IENGR19EUlZfQUNUX1JBTkdFU19QUklfM19UT1AKICN1bmRlZiBDRkdfRFJWX0FDVF9SQU5HRVNfUFJJXzNfVE9QCi0jZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19QUklfM19UT1AJSENGX0NGR19QUklfM19UT1AKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSV8zX1RPUCAgICBIQ0ZfQ0ZHX1BSSV8zX1RPUAogI2Vsc2UKIGVycjogOwogI2VuZGlmCiAjZW5kaWYgLy8gSENGX0NGR19QUklfM19UT1AKIAotI2lmZGVmIEhDRl9DRkdfUFJJXzNfQk9UVE9NICAgICAgICAgICAgICAgICAgICAgICAJCQkvLyBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgUHJpbWFyeSBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNpZmRlZiBIQ0ZfQ0ZHX1BSSV8zX0JPVFRPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBQcmltYXJ5IEZpcm13YXJlIC0gZHJpdmVyIEkvRgogI2lmIENGR19EUlZfQUNUX1JBTkdFU19QUklfM19CT1RUT00gPD0gSENGX0NGR19QUklfM19CT1RUT00gJiYgSENGX0NGR19QUklfM19CT1RUT00gPD0gQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSV8zX1RPUAogI3VuZGVmIENGR19EUlZfQUNUX1JBTkdFU19QUklfM19CT1RUT00KLSNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1BSSV8zX0JPVFRPTQlIQ0ZfQ0ZHX1BSSV8zX0JPVFRPTQorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfUFJJXzNfQk9UVE9NIEhDRl9DRkdfUFJJXzNfQk9UVE9NCiAjZWxzZQogZXJyOiA7CiAjZW5kaWYKQEAgLTQ4OCw3NyArNDUxLDc3IEBACiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjaWYgZGVmaW5lZCBIQ0ZfQ0ZHX0hTSV8wX1RPUCB8fCBkZWZpbmVkIEhDRl9DRkdfSFNJXzBfQk9UVE9NCi1lcnI6IEhTSV8wIG5vdCBzdXBwb3J0ZWQgZm9yIEgtSTsJLy8gQ29tcGF0aWJpbGl0eSBmb3IgSFNJIEkvRgorZXJyOiBIU0lfMCBub3Qgc3VwcG9ydGVkIGZvciBILUk7ICAgLy8gQ29tcGF0aWJpbGl0eSBmb3IgSFNJIEkvRgogI2VuZGlmIC8vIEhDRl9DRkdfSFNJXzBfVE9QIC8gSENGX0NGR19IU0lfMF9CT1RUT00KIAogI2lmIGRlZmluZWQgSENGX0NGR19IU0lfMV9UT1AgfHwgZGVmaW5lZCBIQ0ZfQ0ZHX0hTSV8xX0JPVFRPTQotZXJyOiBIU0lfMSBub3Qgc3VwcG9ydGVkIGZvciBILUk7CS8vIENvbXBhdGliaWxpdHkgZm9yIEhTSSBJL0YKK2VycjogSFNJXzEgbm90IHN1cHBvcnRlZCBmb3IgSC1JOyAgIC8vIENvbXBhdGliaWxpdHkgZm9yIEhTSSBJL0YKICNlbmRpZiAvLyBIQ0ZfQ0ZHX0hTSV8xX1RPUCAvIEhDRl9DRkdfSFNJXzFfQk9UVE9NCiAKICNpZiBkZWZpbmVkIEhDRl9DRkdfSFNJXzJfVE9QIHx8IGRlZmluZWQgSENGX0NGR19IU0lfMl9CT1RUT00KLWVycjogSFNJXzIgbm90IHN1cHBvcnRlZCBmb3IgSC1JOwkvLyBDb21wYXRpYmlsaXR5IGZvciBIU0kgSS9GCitlcnI6IEhTSV8yIG5vdCBzdXBwb3J0ZWQgZm9yIEgtSTsgICAvLyBDb21wYXRpYmlsaXR5IGZvciBIU0kgSS9GCiAjZW5kaWYgLy8gSENGX0NGR19IU0lfMl9UT1AgLyBIQ0ZfQ0ZHX0hTSV8yX0JPVFRPTQogCiAjaWYgZGVmaW5lZCBIQ0ZfQ0ZHX0hTSV8zX1RPUCB8fCBkZWZpbmVkIEhDRl9DRkdfSFNJXzNfQk9UVE9NCi1lcnI6IEhTSV8zIG5vdCBzdXBwb3J0ZWQgZm9yIEgtSTsJLy8gQ29tcGF0aWJpbGl0eSBmb3IgSFNJIEkvRgorZXJyOiBIU0lfMyBub3Qgc3VwcG9ydGVkIGZvciBILUk7ICAgLy8gQ29tcGF0aWJpbGl0eSBmb3IgSFNJIEkvRgogI2VuZGlmIC8vIEhDRl9DRkdfSFNJXzNfVE9QIC8gSENGX0NGR19IU0lfM19CT1RUT00KIAotI2lmZGVmIEhDRl9DRkdfSFNJXzRfVE9QIAkJCQkJCQkJCS8vIFRvcCBDb21wYXRpYmlsaXR5IGZvciBIU0kgSS9GCi0jaWYgSENGX0NGR19IU0lfNF9UT1AgPT0gMCB8fCBcCisjaWZkZWYgSENGX0NGR19IU0lfNF9UT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUb3AgQ29tcGF0aWJpbGl0eSBmb3IgSFNJIEkvRgorI2lmIEhDRl9DRkdfSFNJXzRfVE9QID09IDAgfHwJCQkJCQlcCiAJQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV80X0JPVFRPTSA8PSBDRl9DRkdfSFNJXzRfVE9QICYmIEhDRl9DRkdfSFNJXzRfVE9QIDw9IENGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9UT1AKICN1bmRlZiBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzRfVE9QCi0jZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9UT1AJSENGX0NGR19IU0lfNF9UT1AKKyNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV80X1RPUCAgICBIQ0ZfQ0ZHX0hTSV80X1RPUAogI2Vsc2UKIGVycjogOwogI2VuZGlmCiAjZW5kaWYgLy8gSENGX0NGR19IU0lfNF9UT1AKIAotI2lmZGVmIEhDRl9DRkdfSFNJXzRfQk9UVE9NCQkJCQkJCQkvLyBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgSFNJIEkvRgorI2lmZGVmIEhDRl9DRkdfSFNJXzRfQk9UVE9NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgSFNJIEkvRgogI2lmIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9CT1RUT00gPD0gSENGX0NGR19IU0lfNF9CT1RUT00gJiYgSENGX0NGR19IU0lfNF9CT1RUT00gPD0gQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV80X1RPUAogI3VuZGVmIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNF9CT1RUT00KLSNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV80X0JPVFRPTQlIQ0ZfQ0ZHX0hTSV80X0JPVFRPTQorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzRfQk9UVE9NIEhDRl9DRkdfSFNJXzRfQk9UVE9NCiAjZWxzZQogZXJyOiA7CiAjZW5kaWYKICNlbmRpZiAvLyBIQ0ZfQ0ZHX0hTSV80X0JPVFRPTQogCi0jaWZkZWYgSENGX0NGR19IU0lfNV9UT1AgCQkJCQkJCQkJLy8gVG9wIENvbXBhdGliaWxpdHkgZm9yIEhTSSBJL0YKLSNpZiBIQ0ZfQ0ZHX0hTSV81X1RPUCA9PSAwIHx8IFwKKyNpZmRlZiBIQ0ZfQ0ZHX0hTSV81X1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvcCBDb21wYXRpYmlsaXR5IGZvciBIU0kgSS9GCisjaWYgSENGX0NGR19IU0lfNV9UT1AgPT0gMCB8fAkJCQkJCVwKIAlDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfQk9UVE9NIDw9IENGX0NGR19IU0lfNV9UT1AgJiYgSENGX0NGR19IU0lfNV9UT1AgPD0gQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV81X1RPUAogI3VuZGVmIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNV9UT1AKLSNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV81X1RPUAlIQ0ZfQ0ZHX0hTSV81X1RPUAorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfVE9QICAgIEhDRl9DRkdfSFNJXzVfVE9QCiAjZWxzZQogZXJyOiA7CiAjZW5kaWYKICNlbmRpZiAvLyBIQ0ZfQ0ZHX0hTSV81X1RPUAogCi0jaWZkZWYgSENGX0NGR19IU0lfNV9CT1RUT00JCQkJCQkJCS8vIEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBIU0kgSS9GCisjaWZkZWYgSENGX0NGR19IU0lfNV9CT1RUT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBIU0kgSS9GCiAjaWYgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV81X0JPVFRPTSA8PSBIQ0ZfQ0ZHX0hTSV81X0JPVFRPTSAmJiBIQ0ZfQ0ZHX0hTSV81X0JPVFRPTSA8PSBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfVE9QCiAjdW5kZWYgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0hTSV81X0JPVFRPTQotI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfSFNJXzVfQk9UVE9NCUhDRl9DRkdfSFNJXzVfQk9UVE9NCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19IU0lfNV9CT1RUT00gSENGX0NGR19IU0lfNV9CT1RUT00KICNlbHNlCiBlcnI6IDsKICNlbmRpZgogI2VuZGlmIC8vIEhDRl9DRkdfSFNJXzVfQk9UVE9NCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogI2lmIGRlZmluZWQgSENGX0NGR19BUEZfMV9UT1AgfHwgZGVmaW5lZCBIQ0ZfQ0ZHX0FQRl8xX0JPVFRPTQotZXJyOiBBUEZfMSBub3Qgc3VwcG9ydGVkIGZvciBILUk7CS8vIENvbXBhdGliaWxpdHkgZm9yIEFQIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorZXJyOiBBUEZfMSBub3Qgc3VwcG9ydGVkIGZvciBILUk7ICAgLy8gQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCiAjZW5kaWYgLy8gSENGX0NGR19BUEZfMV9UT1AgLyBIQ0ZfQ0ZHX0FQRl8xX0JPVFRPTQogCi0jaWZkZWYgSENGX0NGR19BUEZfMl9UT1AgICAgICAgICAgICAgICAgICAJCQkJCS8vIFRvcCBDb21wYXRpYmlsaXR5IGZvciBBUCBGaXJtd2FyZSAtIGRyaXZlciBJL0YKLSNpZiBIQ0ZfQ0ZHX0FQRl8yX1RPUCA9PSAwIHx8IFwKKyNpZmRlZiBIQ0ZfQ0ZHX0FQRl8yX1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRvcCBDb21wYXRpYmlsaXR5IGZvciBBUCBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNpZiBIQ0ZfQ0ZHX0FQRl8yX1RPUCA9PSAwIHx8CQkJCQkJXAogCUNGR19EUlZfQUNUX1JBTkdFU19BUEZfMl9CT1RUT00gPD0gSENGX0NGR19BUEZfMl9UT1AgJiYgSENGX0NGR19BUEZfMl9UT1AgPD0gQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX1RPUAogI3VuZGVmIENGR19EUlZfQUNUX1JBTkdFU19BUEZfMl9UT1AKLSNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX1RPUAlIQ0ZfQ0ZHX0FQRl8yX1RPUAorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfVE9QICAgIEhDRl9DRkdfQVBGXzJfVE9QCiAjZWxzZQogZXJyOiA7CiAjZW5kaWYKICNlbmRpZiAvLyBIQ0ZfQ0ZHX0FQRl9UT1AKIAotI2lmZGVmIEhDRl9DRkdfQVBGXzJfQk9UVE9NICAgICAgICAgICAgICAgICAgICAgICAJCQkvLyBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCisjaWZkZWYgSENGX0NGR19BUEZfMl9CT1RUT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgQVAgRmlybXdhcmUgLSBkcml2ZXIgSS9GCiAjaWYgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX0JPVFRPTSA8PSBIQ0ZfQ0ZHX0FQRl8yX0JPVFRPTSAmJiBIQ0ZfQ0ZHX0FQRl8yX0JPVFRPTSA8PSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfVE9QCiAjdW5kZWYgQ0ZHX0RSVl9BQ1RfUkFOR0VTX0FQRl8yX0JPVFRPTQotI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfQVBGXzJfQk9UVE9NCUhDRl9DRkdfQVBGXzJfQk9UVE9NCisjZGVmaW5lIENGR19EUlZfQUNUX1JBTkdFU19BUEZfMl9CT1RUT00gSENGX0NGR19BUEZfMl9CT1RUT00KICNlbHNlCiBlcnI6IDsKICNlbmRpZgpAQCAtNTY2LDIzICs1MjksMjMgQEAKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICNpZiBkZWZpbmVkIEhDRl9DRkdfU1RBXzFfVE9QIHx8IGRlZmluZWQgSENGX0NGR19TVEFfMV9CT1RUT00KLWVycjogU1RBXzEgbm90IHN1cHBvcnRlZCBmb3IgSC1JOwkvLyBDb21wYXRpYmlsaXR5IGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgorZXJyOiBTVEFfMSBub3Qgc3VwcG9ydGVkIGZvciBILUk7ICAgLy8gQ29tcGF0aWJpbGl0eSBmb3IgU3RhdGlvbiBGaXJtd2FyZSAtIGRyaXZlciBJL0YKICNlbmRpZiAvLyBIQ0ZfQ0ZHX1NUQV8xX1RPUCAvIEhDRl9DRkdfU1RBXzFfQk9UVE9NCiAKLSNpZmRlZiBIQ0ZfQ0ZHX1NUQV8yX1RPUCAgICAgICAgICAgICAgICAgIAkJCQkJLy8gVG9wIENvbXBhdGliaWxpdHkgZm9yIFN0YXRpb24gRmlybXdhcmUgLSBkcml2ZXIgSS9GCi0jaWYgSENGX0NGR19TVEFfMl9UT1AgPT0gMCB8fCBcCisjaWZkZWYgSENGX0NGR19TVEFfMl9UT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUb3AgQ29tcGF0aWJpbGl0eSBmb3IgU3RhdGlvbiBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNpZiBIQ0ZfQ0ZHX1NUQV8yX1RPUCA9PSAwIHx8CQkJCQkJXAogCUNGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9CT1RUT00gPD0gSENGX0NGR19TVEFfMl9UT1AgJiYgSENGX0NGR19TVEFfMl9UT1AgPD0gQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX1RPUAogI3VuZGVmIENGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9UT1AKLSNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX1RPUAlIQ0ZfQ0ZHX1NUQV8yX1RPUAorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzJfVE9QICAgIEhDRl9DRkdfU1RBXzJfVE9QCiAjZWxzZQogZXJyOiA7CiAjZW5kaWYKICNlbmRpZiAvLyBIQ0ZfQ0ZHX1NUQV9UT1AKIAotI2lmZGVmIEhDRl9DRkdfU1RBXzJfQk9UVE9NICAgICAgICAgICAgICAgICAgICAgICAJCQkvLyBCb3R0b20gQ29tcGF0aWJpbGl0eSBmb3IgU3RhdGlvbiBGaXJtd2FyZSAtIGRyaXZlciBJL0YKKyNpZmRlZiBIQ0ZfQ0ZHX1NUQV8yX0JPVFRPTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJvdHRvbSBDb21wYXRpYmlsaXR5IGZvciBTdGF0aW9uIEZpcm13YXJlIC0gZHJpdmVyIEkvRgogI2lmIENGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9CT1RUT00gPD0gSENGX0NGR19TVEFfMl9CT1RUT00gJiYgSENGX0NGR19TVEFfMl9CT1RUT00gPD0gQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX1RPUAogI3VuZGVmIENGR19EUlZfQUNUX1JBTkdFU19TVEFfMl9CT1RUT00KLSNkZWZpbmUgQ0ZHX0RSVl9BQ1RfUkFOR0VTX1NUQV8yX0JPVFRPTQlIQ0ZfQ0ZHX1NUQV8yX0JPVFRPTQorI2RlZmluZSBDRkdfRFJWX0FDVF9SQU5HRVNfU1RBXzJfQk9UVE9NIEhDRl9DRkdfU1RBXzJfQk9UVE9NCiAjZWxzZQogZXJyOiA7CiAjZW5kaWYKQEAgLTU5NCw5MSArNTU3LDgxIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZkZWYgSENGX1NMRUVQCi0jaWYgZGVmaW5lZCBNU0ZfV0FJVAotZXJyOiBNU0Ygc2hvdWxkIG5vIGxvbmdlciBzdXBwbHkgdGhpcyBtYWNybzsKKyNkZWZpbmUgTVNGX1dBSVQoeCkgZG8gewkJCQkJCVwKKwkJUFJPVF9DTlRfSU5JOwkJCQkJCVwKKwkJSENGX1dBSVRfV0hJTEUoKElQVyhIUkVHX0lPKSAmIEhSRUdfSU9fV09LRU5fVVApID09IDApOyBcCisJCUhDRkFTU0VSVCggcHJvdF9jbnQsIElQVyggSFJFR19JTyApICk7CQkJXAorCX0gd2hpbGUgKDApCiAjZWxzZQotI2RlZmluZSBNU0ZfV0FJVCh4KSAJCQkJCQkJCQkJCQkJCQkJCQkJXAotCXsgUFJPVF9DTlRfSU5JCQkJCQkJCQkJCQkJCQlcCi0JCUhDRl9XQUlUX1dISUxFKCAoIElQVyggSFJFR19JTyApICYgSFJFR19JT19XT0tFTl9VUCApID09IDAgKTsJCQkJCQlcCi0JCUhDRkFTU0VSVCggcHJvdF9jbnQsIElQVyggSFJFR19JTyApICkJCQkJCQkJXAotCX0KLSNlbmRpZiAvLyBNU0ZfV0FJVAotI2Vsc2UKLSNkZWZpbmUgTVNGX1dBSVQoeCkJLypOT1AqLworI2RlZmluZSBNU0ZfV0FJVCh4KSBkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYgLy8gSENGX1NMRUVQCiAKLSNkZWZpbmUgTE9GKHgpIAkJCShzaXplb2YoeCkvc2l6ZW9mKGhjZl8xNiktMSkKLQotI2RlZmluZSBNVUxfQllfMiggeCApCSggKHgpIDw8IDEgKQkJCQkJCS8vdXNlZCB0byBtdWx0aXBseSBieSAyCi0jZGVmaW5lIERJVl9CWV8yKCB4ICkJKCAoeCkgPj4gMSApCQkJCQkJLy91c2VkIHRvIGRpdmlkZSBieSAyCisjZGVmaW5lIExPRih4KSAgICAgICAgICAoc2l6ZW9mKHgpL3NpemVvZihoY2ZfMTYpLTEpCiAKIC8vcmVzb2x2ZSBwcm9ibGVtcyBvbiBmb3Igc29tZSAxNiBiaXRzIGNvbXBpbGVycyB0byBjcmVhdGUgMzIgYml0IHZhbHVlcwotI2RlZmluZSBNRVJHRV8yKCBodywgbHcgKQkoICggKChoY2ZfMzIpKGh3KSkgPDwgMTYgKSB8ICgoaGNmXzE2KShsdykpICkKKyNkZWZpbmUgTUVSR0VfMiggaHcsIGx3ICkgICAoICggKChoY2ZfMzIpKGh3KSkgPDwgMTYgKSB8ICgoaGNmXzE2KShsdykpICkKIAogI2lmICEgZGVmaW5lZCBIQ0ZfU1RBVElDCi0jZGVmaW5lCQkgIEhDRl9TVEFUSUMJc3RhdGljCi0jZW5kaWYgLy8JICBIQ0ZfU1RBVElDCisjZGVmaW5lICAgICAgIEhDRl9TVEFUSUMgICAgc3RhdGljCisjZW5kaWYgLy8gICAgIEhDRl9TVEFUSUMKIAogI2lmICggKEhDRl9UWVBFKSAmIEhDRl9UWVBFX0hJSTUgKSA9PSAwCi0jZGVmaW5lIERBV0FfQUNLKCBtYXNrKSB7CQkJCQkJCQkJCQkJCVwKLQlPUFcoIEhSRUdfRVZfQUNLLCBtYXNrIHwgSFJFR19FVl9BQ0tfUkVHX1JFQURZICk7CQkJCQkJXAotCU9QVyggSFJFR19FVl9BQ0ssIChtYXNrICYgfkhSRUdfRVZfQUxMT0MpIHwgSFJFR19FVl9BQ0tfUkVHX1JFQURZICk7IAl9Ci0jZGVmaW5lIERBV0FfWkVST19GSUQocmVnKSBPUFcoIHJlZywgMCApOworI2RlZmluZSBEQVdBX0FDSyggbWFzaykgZG8gewkJCQkJCVwKKwkJT1BXKCBIUkVHX0VWX0FDSywgbWFzayB8IEhSRUdfRVZfQUNLX1JFR19SRUFEWSApOwlcCisJCU9QVyggSFJFR19FVl9BQ0ssIChtYXNrICYgfkhSRUdfRVZfQUxMT0MpIHwgSFJFR19FVl9BQ0tfUkVHX1JFQURZICk7IFwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBEQVdBX1pFUk9fRklEKHJlZykgT1BXKCByZWcsIDAgKQogI2Vsc2UKLSNkZWZpbmUgREFXQV9BQ0soIG1hc2spICAgT1BXKCBIUkVHX0VWX0FDSywgbWFzayApOwotI2RlZmluZSBEQVdBX1pFUk9fRklEKHJlZykKKyNkZWZpbmUgREFXQV9BQ0soIG1hc2spICAgT1BXKCBIUkVHX0VWX0FDSywgbWFzayApCisjZGVmaW5lIERBV0FfWkVST19GSUQocmVnKSBkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYgLy8gSENGX1RZUEVfSElJNQogCiAjaWYgKEhDRl9UWVBFKSAmIEhDRl9UWVBFX1dQQQotI2RlZmluZQlDQUxDX1JYX01JQyggcCwgbGVuICkgY2FsY19taWNfcnhfZnJhZyggaWZicCwgcCwgbGVuICkKLSNkZWZpbmUJQ0FMQ19UWF9NSUMoIHAsIGxlbiApIGNhbGNfbWljX3R4X2ZyYWcoIGlmYnAsIHAsIGxlbiApCi0jZGVmaW5lIElGX1NTTih4KSAgeAotI2RlZmluZSBJRl9OT1RfU1NOKHgpCisjZGVmaW5lIENBTENfUlhfTUlDKCBwLCBsZW4gKSBjYWxjX21pY19yeF9mcmFnKCBpZmJwLCBwLCBsZW4gKQorI2RlZmluZSBDQUxDX1RYX01JQyggcCwgbGVuICkgY2FsY19taWNfdHhfZnJhZyggaWZicCwgcCwgbGVuICkKICNlbHNlCi0jZGVmaW5lCUNBTENfUlhfTUlDKCBwLCBsZW4gKQotI2RlZmluZQlDQUxDX1RYX01JQyggcCwgbGVuICkKKyNkZWZpbmUgQ0FMQ19SWF9NSUMoIHAsIGxlbiApCisjZGVmaW5lIENBTENfVFhfTUlDKCBwLCBsZW4gKQogI2RlZmluZSBNSUNfUlhfUlROKCBtaWMsIGR3ICkKICNkZWZpbmUgTUlDX1RYX1JUTiggbWljLCBkdyApCi0jZGVmaW5lIElGX1NTTih4KQotI2RlZmluZSBJRl9OT1RfU1NOKHgpIHgKICNlbmRpZiAvLyBIQ0ZfVFlQRV9XUEEKIAotI2lmIEhDRl9UQUxMSUVTICYgSENGX1RBTExJRVNfSENGCQkvL0hDRiB0YWxseSBzdXBwb3J0Ci0jZGVmaW5lIElGX1RBTExZKHgpICB4CisjaWYgSENGX1RBTExJRVMgJiBIQ0ZfVEFMTElFU19IQ0YgICAgICAgLy9IQ0YgdGFsbHkgc3VwcG9ydAorI2RlZmluZSBJRl9UQUxMWSh4KSBkbyB7IHg7IH0gd2hpbGUgKDApCiAjZWxzZQotI2RlZmluZSBJRl9UQUxMWSh4KQorI2RlZmluZSBJRl9UQUxMWSh4KSBkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYgLy8gSENGX1RBTExJRVNfSENGCiAKIAogI2lmIEhDRl9ETUEKLSNkZWZpbmUgSUZfRE1BKHgpCQkJeAotI2RlZmluZSBJRl9OT1RfRE1BKHgpCi0jZGVmaW5lIElGX1VTRV9ETUEoeCkgCQlpZiAoICAgaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfRE1BICApIHgKLSNkZWZpbmUgSUZfTk9UX1VTRV9ETUEoeCkJaWYgKCAhKGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSkgKSB4CisjZGVmaW5lIElGX0RNQSh4KSAgICAgICAgICAgZG8geyB4OyB9IHdoaWxlKDApCisjZGVmaW5lIElGX05PVF9ETUEoeCkgICAgICAgZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIElGX1VTRV9ETUEoeCkgICAgICAgaWYgKCAgIGlmYnAtPklGQl9DbnRsT3B0ICYgVVNFX0RNQSAgKSB7IHg7IH0KKyNkZWZpbmUgSUZfTk9UX1VTRV9ETUEoeCkgICBpZiAoICEoaWZicC0+SUZCX0NudGxPcHQgJiBVU0VfRE1BKSApIHsgeDsgfQogI2Vsc2UKLSNkZWZpbmUgSUZfRE1BKHgpCi0jZGVmaW5lIElGX05PVF9ETUEoeCkJCXgKLSNkZWZpbmUgSUZfVVNFX0RNQSh4KQotI2RlZmluZSBJRl9OT1RfVVNFX0RNQSh4KSAJeAorI2RlZmluZSBJRl9ETUEoeCkgICAgICAgICAgIGRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBJRl9OT1RfRE1BKHgpICAgICAgIGRvIHsgeDsgfSB3aGlsZSgwKQorI2RlZmluZSBJRl9VU0VfRE1BKHgpICAgICAgIGRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBJRl9OT1RfVVNFX0RNQSh4KSAgIGRvIHsgeDsgfSB3aGlsZSgwKQogI2VuZGlmIC8vIEhDRl9ETUEKIAogCiAjZGVmaW5lIElQVyh4KSAoKGhjZl8xNilJTl9QT1JUX1dPUkQoIGlmYnAtPklGQl9JT0Jhc2UgKyAoeCkgKSApCiAjZGVmaW5lIE9QVyh4LCB5KSBPVVRfUE9SVF9XT1JEKCBpZmJwLT5JRkJfSU9CYXNlICsgKHgpLCB5ICkKLQkvKiBtYWtlIHN1cmUgdGhlIGltcGxlbWVudGF0aW9uIG9mIEhDRl9XQUlUX1dISUxFIGlzIHN1Y2ggdGhhdCB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgSENGX1dBSVRfV0hJTEUgY2FsbHMKLQkgKiBpbiBhIHJvdyBhbmQgdGhhdCB3aGVuIG9uZSBmYWlscyBhbGwgc3Vic2VxdWVudCBmYWlsIGltbWVkaWF0ZWx5IHdpdGhvdXQgcmVpbml0aWFsaXphdGlvbiBvZiBwcm90X2NudAotCSAqLworLyogbWFrZSBzdXJlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBIQ0ZfV0FJVF9XSElMRSBpcyBzdWNoIHRoYXQgdGhlcmUgbWF5IGJlIG11bHRpcGxlIEhDRl9XQUlUX1dISUxFIGNhbGxzCisgKiBpbiBhIHJvdyBhbmQgdGhhdCB3aGVuIG9uZSBmYWlscyBhbGwgc3Vic2VxdWVudCBmYWlsIGltbWVkaWF0ZWx5IHdpdGhvdXQgcmVpbml0aWFsaXphdGlvbiBvZiBwcm90X2NudAorICovCiAjaWYgSENGX1BST1RfVElNRSA9PSAwCi0jZGVmaW5lIFBST1RfQ05UX0lOSQotI2RlZmluZSBJRl9QUk9UX1RJTUUoeCkKKyNkZWZpbmUgUFJPVF9DTlRfSU5JICAgIGRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBJRl9QUk9UX1RJTUUoeCkgZG8geyB9IHdoaWxlKDApCiAjaWYgZGVmaW5lZCBIQ0ZfWUlFTEQKLSNkZWZpbmUgSENGX1dBSVRfV0hJTEUoIHggKSB3aGlsZSAoICh4KSAmJiAoSENGX1lJRUxEKSApIC8qTk9QKi87CisjZGVmaW5lIEhDRl9XQUlUX1dISUxFKCB4ICkgZG8geyB9IHdoaWxlKCAoeCkgJiYgKEhDRl9ZSUVMRCkgKQogI2Vsc2UKLSNkZWZpbmUgSENGX1dBSVRfV0hJTEUoIHggKSB3aGlsZSAoIHggKSAvKk5PUCovOworI2RlZmluZSBIQ0ZfV0FJVF9XSElMRSggeCApIGRvIHsgfSB3aGlsZSAoIHggKQogI2VuZGlmIC8vIEhDRl9ZSUVMRAogI2Vsc2UKLSNkZWZpbmUgUFJPVF9DTlRfSU5JIAloY2ZfMzIgcHJvdF9jbnQgPSBpZmJwLT5JRkJfVGlja0luaTsKLSNkZWZpbmUgSUZfUFJPVF9USU1FKHgpCXgKKyNkZWZpbmUgUFJPVF9DTlRfSU5JICAgIGhjZl8zMiBwcm90X2NudCA9IGlmYnAtPklGQl9UaWNrSW5pCisjZGVmaW5lIElGX1BST1RfVElNRSh4KSBkbyB7IHg7IH0gd2hpbGUoMCkKICNpZiBkZWZpbmVkIEhDRl9ZSUVMRAogI2RlZmluZSBIQ0ZfV0FJVF9XSElMRSggeCApIHdoaWxlICggcHJvdF9jbnQgJiYgKHgpICYmIChIQ0ZfWUlFTEQpICkgcHJvdF9jbnQtLTsKICNlbHNlCkBAIC02OTcsNyArNjUwLDcgQEAKICNlbmRpZiAvLyBIQ0ZfRVhfSU5UCiAKICNpZiAwIC8vZ2V0IGNvbXBpbGVyIGdvaW5nCi0jaWYgSENGX0VYX0lOVF9USUNLCSE9IEhSRUdfRVZfVElDSworI2lmIEhDRl9FWF9JTlRfVElDSyAhPSBIUkVHX0VWX1RJQ0sKIDs/IG91dCBkYXRlZCBjaGVja2luZwogZXJyOiBzb21lb25lIHJlZGVmaW5lZCB0aGVzZSBtYWNyb3Mgd2hpbGUgdGhlIGltcGxlbWVuYXRpb24gYXNzdW1lcyB0aGV5IGFyZSBlcXVhbDsKICNlbmRpZgpAQCAtNzIxLDM5ICs2NzQsMzcgQEAKICAqIG9uIHRoZSBpZi1zdGF0ZW1lbnQKICAqLwogI2lmIEhDRl9BU1NFUlQKLSNkZWZpbmUgSENGQVNTRVJUKHgscSkge2lmICghKHgpKSB7bWRkX2Fzc2VydCggICAgICAgIGlmYnAsIF9fTElORV9fICAgICAgICAgICAgICAgICAgICwgcSApO319CisjZGVmaW5lIEhDRkFTU0VSVCh4LHEpIGRvIHsgaWYgKCEoeCkpIHttZGRfYXNzZXJ0KGlmYnAsIF9fTElORV9fLCBxICk7fSB9IHdoaWxlKDApCiAjZGVmaW5lIE1NREFTU0VSVCh4LHEpIHtpZiAoISh4KSkge21kZF9hc3NlcnQoIGFzc2VydF9pZmJwLCBfX0xJTkVfXyArIEZJTEVfTkFNRV9PRkZTRVQsIHEgKTt9fQogCi0jZGVmaW5lIEhDRkxPR0VOVFJZKCB3aGVyZSwgd2hhdCApIAkJCQkJCQkJCQkJCQkJXAote2lmICggKGlmYnAtPklGQl9Bc3NlcnRXaGVyZSA9IHdoZXJlKSA8PSAxNSApIHsJCQkJCQkJCQkJCVwKLQlIQ0ZfRU5UUlkoIGlmYnAgKTsgCQkJCQkJCQkJCQkJCQkJCQlcCi0JSENGQVNTRVJUKCAoaWZicC0+SUZCX0Fzc2VydFRyYWNlICYgMTw8KCh3aGVyZSkmMHhGKSkgPT0gMCwgaWZicC0+SUZCX0Fzc2VydFRyYWNlICk7CQlcCi0JaWZicC0+SUZCX0Fzc2VydFRyYWNlIHw9IDE8PCgod2hlcmUpJjB4Rik7CQkJCQkJCQkJCQkJXAotCX0JCQkJCQkJCQkJCQkJCQkJCQkJCQlcCi1IQ0ZUUkFDRShpZmJwLCB3aGVyZSApCQkJCQkJCQkJCQkJCQkJCQlcCi1IQ0ZUUkFDRVZBTFVFKGlmYnAsIHdoYXQgKQkJCQkJCQkJCQkJCQkJCQlcCi19CisjZGVmaW5lIEhDRkxPR0VOVFJZKCB3aGVyZSwgd2hhdCApIGRvIHsJCQkJCVwKKwkJaWYgKCAoaWZicC0+SUZCX0Fzc2VydFdoZXJlID0gd2hlcmUpIDw9IDE1ICkgewkJXAorCQkJSENGQVNTRVJUKCAoaWZicC0+SUZCX0Fzc2VydFRyYWNlICYgMTw8KCh3aGVyZSkmMHhGKSkgPT0gMCwgaWZicC0+SUZCX0Fzc2VydFRyYWNlICk7IFwKKwkJCWlmYnAtPklGQl9Bc3NlcnRUcmFjZSB8PSAxPDwoKHdoZXJlKSYweEYpOwlcCisJCX0JCQkJCQkJXAorCQlIQ0ZUUkFDRShpZmJwLCB3aGVyZSApOwkJCQkJXAorCQlIQ0ZUUkFDRVZBTFVFKGlmYnAsIHdoYXQgKTsJCQkJXAorCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgSENGTE9HRVhJVCggd2hlcmUgKSAJCQkJCQkJCQkJCQkJCQlcCi17aWYgKCAoaWZicC0+SUZCX0Fzc2VydFdoZXJlID0gd2hlcmUpIDw9IDE1ICkgewkJCQkJCQkJCQkJXAotICAJSENGX0VYSVQoIGlmYnAgKTsgCQkJCQkJCQkJCQkJCQkJCQlcCi0JaWZicC0+SUZCX0Fzc2VydFRyYWNlICY9IH4oMTw8KCh3aGVyZSkmMHhGKSk7CQkJCQkJCQkJCQkJXAotCX0JCQkJCQkgCQkJCQkJCQkJCQkJCQkJXAotSENGVFJBQ0UoaWZicCwgKHdoZXJlKXxIQ0ZfVFJBQ0VfRVhJVCApCQkJCQkJCQkJCQkJCVwKLX0KKyNkZWZpbmUgSENGTE9HRVhJVCggd2hlcmUgKSBkbyB7CQkJCQlcCisJCWlmICggKGlmYnAtPklGQl9Bc3NlcnRXaGVyZSA9IHdoZXJlKSA8PSAxNSApIHsJCVwKKwkJCWlmYnAtPklGQl9Bc3NlcnRUcmFjZSAmPSB+KDE8PCgod2hlcmUpJjB4RikpOwlcCisJCX0JCQkJCQkJXAorCQlIQ0ZUUkFDRShpZmJwLCAod2hlcmUpfEhDRl9UUkFDRV9FWElUICk7CQlcCisJfSB3aGlsZSAoMCkKIAogI2Vsc2UgLy8gSENGX0FTU0VSVAotI2RlZmluZSBIQ0ZBU1NFUlQoIHgsIHEgKQorI2RlZmluZSBIQ0ZBU1NFUlQoIHgsIHEgKSBkbyB7IH0gd2hpbGUoMCkKICNkZWZpbmUgTU1EQVNTRVJUKCB4LCBxICkKLSNkZWZpbmUgSENGTE9HRU5UUlkoIHdoZXJlLCB3aGF0ICkgCSAgCXtIQ0ZfRU5UUlkoIGlmYnAgKTt9Ci0jZGVmaW5lIEhDRkxPR0VYSVQoIHdoZXJlICkgCQkgIAl7SENGX0VYSVQoIGlmYnAgKTt9CisjZGVmaW5lIEhDRkxPR0VOVFJZKCB3aGVyZSwgd2hhdCApIGRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBIQ0ZMT0dFWElUKCB3aGVyZSApICAgICAgICBkbyB7IH0gd2hpbGUoMCkKICNlbmRpZiAvLyBIQ0ZfQVNTRVJUCiAKICNpZiBIQ0ZfSU5UX09OCiAvKiA7PyBIQ0ZBU1NFUlRfSU5UCiAgKiAjaWYgKEhDRl9TTEVFUCkgJiBIQ0ZfRERTCiAgKiAjZGVmaW5lIEhDRkFTU0VSVF9JTlQgSENGQVNTRVJUKCBpZmJwLT5JRkJfSW50T2ZmQ250ICE9IDB4RkZGRiAmJiBpZmJwLT5JRkJfSW50T2ZmQ250ICE9IDB4RkZGRSwgXAotICogCQkJCQkJCQkgaWZicC0+SUZCX0ludE9mZkNudCApCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmJwLT5JRkJfSW50T2ZmQ250ICkKICAqICNlbHNlCiAgKi8KICNkZWZpbmUgSENGQVNTRVJUX0lOVCBIQ0ZBU1NFUlQoIGlmYnAtPklGQl9JbnRPZmZDbnQgIT0gMHhGRkZGLCBpZmJwLT5JRkJfSW50T2ZmQ250ICkKQEAgLTc2NCwxOCArNzE1LDE4IEBACiAKIAogI2lmIGRlZmluZWQgSENGX1RSQUNFCi0jZGVmaW5lIEhDRlRSQUNFKGlmYnAsIHdoZXJlICkJICAge09QVyggSFJFR19TV18xLCB3aGVyZSApO30KLS8vI2RlZmluZSBIQ0ZUUkFDRShpZmJwLCB3aGVyZSApCSAgIHtIQ0ZBU1NFUlQoIERPX0FTU0VSVCwgd2hlcmUgKTt9Ci0jZGVmaW5lIEhDRlRSQUNFVkFMVUUoaWZicCwgd2hhdCApIHtPUFcoIEhSRUdfU1dfMiwgd2hhdCAgKTt9CisjZGVmaW5lIEhDRlRSQUNFKGlmYnAsIHdoZXJlICkgICAgIGRvIHtPUFcoIEhSRUdfU1dfMSwgd2hlcmUgKTt9IHdoaWxlKDApCisvLyNkZWZpbmUgSENGVFJBQ0UoaWZicCwgd2hlcmUgKSAgICAgICB7SENGQVNTRVJUKCBET19BU1NFUlQsIHdoZXJlICk7fQorI2RlZmluZSBIQ0ZUUkFDRVZBTFVFKGlmYnAsIHdoYXQgKSBkbyB7T1BXKCBIUkVHX1NXXzIsIHdoYXQgICk7fSB3aGlsZSAoMCkKIC8vI2RlZmluZSBIQ0ZUUkFDRVZBTFVFKGlmYnAsIHdoYXQgKSB7SENGQVNTRVJUKCBET19BU1NFUlQsIHdoYXQgICk7fQogI2Vsc2UKLSNkZWZpbmUgSENGVFJBQ0UoaWZicCwgd2hlcmUgKQotI2RlZmluZSBIQ0ZUUkFDRVZBTFVFKGlmYnAsIHdoYXQgKQorI2RlZmluZSBIQ0ZUUkFDRShpZmJwLCB3aGVyZSApICAgICBkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgSENGVFJBQ0VWQUxVRShpZmJwLCB3aGF0ICkgZG8geyB9IHdoaWxlKDApCiAjZW5kaWYgLy8gSENGX1RSQUNFCiAKIAogI2lmIEhDRl9CSUdfRU5ESUFOCi0jZGVmaW5lIEJFX1BBUih4KQkJCQkseAorI2RlZmluZSBCRV9QQVIoeCkgICAgICAgICAgICAgICAseAogI2Vsc2UKICNkZWZpbmUgQkVfUEFSKHgpCiAjZW5kaWYgLy8gSENGX0JJR19FTkRJQU4KQEAgLTc4OSwxMyArNzQwLDEzIEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWYgSENGX0FTU0VSVAotZXh0ZXJuIElGQlAgQkFTRUQgYXNzZXJ0X2lmYnA7CQkJLy90byBtYWtlIGFzc2VydHMgZWFzaWx5IHdvcmsgdW5kZXIgTU1EIGFuZCBESEYKLUVYVEVSTl9DIHZvaWQJCSBtZGRfYXNzZXJ0CQkJKElGQlAgaWZicCwgdW5zaWduZWQgaW50IGxpbmVfbnVtYmVyLCBoY2ZfMzIgcSApOworZXh0ZXJuIElGQlAgQkFTRUQgYXNzZXJ0X2lmYnA7ICAgICAgICAgIC8vdG8gbWFrZSBhc3NlcnRzIGVhc2lseSB3b3JrIHVuZGVyIE1NRCBhbmQgREhGCitFWFRFUk5fQyB2b2lkICAgICAgICBtZGRfYXNzZXJ0ICAgICAgICAgKElGQlAgaWZicCwgdW5zaWduZWQgaW50IGxpbmVfbnVtYmVyLCBoY2ZfMzIgcSApOwogI2VuZGlmIC8vSENGX0FTU0VSVAogCi0jaWYgISAoIChIQ0ZfSU8pICYgSENGX0lPXzMyQklUUyApCQkJCS8vIGRlZmluZWQgMTYgYml0cyBvbmx5CisjaWYgISAoIChIQ0ZfSU8pICYgSENGX0lPXzMyQklUUyApICAgICAgICAgICAgICAvLyBkZWZpbmVkIDE2IGJpdHMgb25seQogI3VuZGVmIE9VVF9QT1JUX1NUUklOR18zMgogI3VuZGVmIElOX1BPUlRfU1RSSU5HXzMyCiAjZW5kaWYgLy8gSENGX0lPCi0jZW5kaWYJLy9IQ0ZERUZDX0gKKyNlbmRpZiAgLy9IQ0ZERUZDX0gKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvbWRkLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9tZGQuaAppbmRleCA1YWE5ZWI4Li5iMDJlM2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9tZGQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi9tZGQuaApAQCAtNDQ0LDcgKzQ0NCw3IEBACiAJCSB0eF9taWNfa2V5WzRdLCByeF9taWNfa2V5WzRdIAkJCQkJCSApCS8qCQkJCQkJCQkJCSAgICAgICAJCSovCiAgWDYoIENGR19BRERfVEtJUF9NQVBQRURfS0VZLAlic3NpZFszXSwgdGtpcF9rZXlbOF0sIAkJIFwKIAkJIHRzY1s0XSwgcnNjWzRdLCB0eF9taWNfa2V5WzRdLCByeF9taWNfa2V5WzRdIAkJICkJLyoJCQkJCQkJCQkJICAgICAgIAkJKi8KLSBYMSggQ0ZHX1NFVF9TU05fQVVUSEVOVElDQVRJT05fU1VJVEUsIAkJCQkJCSBcCisgWDEoIENGR19TRVRfV1BBX0FVVEhFTlRJQ0FUSU9OX1NVSVRFLCAJCQkJCQkgXAogCQkgc3NuX2F1dGhlbnRpY2F0aW9uX3N1aXRlCQkJCQkJCSApCS8qCQkJCQkJCQkJCQkgICAJCSovCiAgWDEoIENGR19SRU1PVkVfVEtJUF9ERUZBVUxUX0tFWSx0a2lwX2tleV9pZAkJCQkgKQkvKgkJCQkJCQkJCQkJICAgCQkqLwogIFgxKCBDRkdfVElDS19USU1FLAkJCQl0aWNrX3RpbWUJCQkJCSApCS8qQXV4aWxpYXJ5IFRpbWVyIHRpY2sgaW50ZXJ2YWwJCQkJCQkqLwpAQCAtNTI1LDcgKzUyNSw3IEBACiAgWDEoIENGR19PV05fTUFDX0FERFIsCQkJbWFjX2FkZHJbM10JCQkJCQkJICkgLypbQVBdIFVuaXF1ZSBsb2NhbCBub2RlIE1BQyBBZGRyZXNzCQkJCQkJKi8KICBYMyggQ0ZHX1BDRl9JTkZPLAkJCQltZWRpdW1fb2NjdXBhbmN5X2xpbWl0LCAJCQkgXAogCQkgCQkJCQkJY2ZwX3BlcmlvZCwgY2ZwX21heF9kdXJhdGlvbiAJCSApIC8qW0FQXSBQb2ludCBDb29yZGluYXRpb24gRnVuY3Rpb24gY2FwYWJpbGl0eSBpbmZvCQkqLwotIFgxKCBDRkdfQ1VSX1NTTl9JTkZPX0VMRU1FTlQsIHNzbl9pbmZvX2VsZW1lbnRbMV0JCQkJIAkgKSAvKiAgICAJCQkJCQkJCQkJCQkJKi8KKyBYMSggQ0ZHX0NVUl9XUEFfSU5GT19FTEVNRU5ULCBzc25faW5mb19lbGVtZW50WzFdCQkJCSAJICkgLyogICAgCQkJCQkJCQkJCQkJCSovCiAgWDQoIENGR19DVVJfVEtJUF9JVl9JTkZPLCAJCQkJCQkJCQkJCSBcCiAJCSB0a2lwX3NlcV9jbnQwWzRdLCB0a2lwX3NlcV9jbnQxWzRdLCAJCQkJCQkgXAogCQkgdGtpcF9zZXFfY250Mls0XSwgdGtpcF9zZXFfY250M1s0XSAgCQkJCQkJICkgLyogICAgCQkJCQkJCQkJCQkJCSovCkBAIC04MDIsNyArODAyLDcgQEAKICNkZWZpbmUgQ0ZHX1BDRl9JTkZPCQkJCQkweEZEODcJLy9bQVBdIFBvaW50IENvb3JkaW5hdGlvbiBGdW5jdGlvbiBjYXBhYmlsaXR5IGluZm8KIC8vKlJFU0VSVkVEKiAjZGVmaW5lIENGR19ISUdIRVNUX0JBU0lDX1JBVEUJCQkweEZEODgJLy8KICNkZWZpbmUgQ0ZHX0NVUl9DT1VOVFJZX0lORk8JCQkweEZEODkJLy8KLSNkZWZpbmUgQ0ZHX0NVUl9TU05fSU5GT19FTEVNRU5UCQkweEZEOEEJLy8KKyNkZWZpbmUgQ0ZHX0NVUl9XUEFfSU5GT19FTEVNRU5UCQkweEZEOEEJLy8KICNkZWZpbmUgQ0ZHX0NVUl9US0lQX0lWX0lORk8JCQkweEZEOEIJLy8KICNkZWZpbmUgQ0ZHX0NVUl9BU1NPQ19SRVFfSU5GTwkJCTB4RkQ4QwkvLwogI2RlZmluZSBDRkdfQ1VSX0FTU09DX1JFU1BfSU5GTwkJCTB4RkQ4RAkvLwpAQCAtODkzLDIwICs4OTMsMjAgQEAKIAogLy9IRlNfVFhfQ05UTAogLyogTm90ZSB0aGF0IHRoZSBIQ0ZfLi4uLiBTeXN0ZW0gQ29uc3RhbnRzIGluZmx1ZW5jZSB0aGUgSEZTXy4uLi4gdmFsdWVzIGJlbG93Ci0gKiAJCQkJCQkJCUgtSQkJSC1JCSB8CUgtSUkJSC1JSQlILUlJLjUKLSAqCQkJCQkJCQkJCVdQQQkgfAkJCVdQQQotICogSEZTX1RYX0NOVExfVFhfT0sJCQkwMDAyCTAwMDIgfAkwMDAyCTAwMDIJIE4vQQk8PDw8PDw8PGRlcHJlY2F0ZWQKLSAqIEhGU19UWF9DTlRMX1RYX0VYCQkJMDAwNAkwMDA0IHwJMDAwNAkwMDA0CSBOL0EKLSAqIEhGU19UWF9DTlRMX01JQwkJCQkgTi9BCTAwMTAgfAkgTi9BCTAwMTAJIE4vQQotICogSEZTX1RYX0NOVExfVElECQkJCSBOL0EJIE4vQSB8CSBOL0EJIE4vQQkwMDBGCi0gKiBIRlNfVFhfQ05UTF9TRVJWSUNFX0NMQVNTCSBOL0EJIE4vQSB8CSBOL0EJIE4vQQkwMEMwCi0gKiBIRlNfVFhfQ05UTF9QT1JUCQkJCTA3MDAJMDcwMCB8CTA3MDAJMDcwMAkwNzAwCi0gKiBIRlNfVFhfQ05UTF9NSUNfS0VZX0lECQkxODAwCTE4MDAgfAkwMDAwCTE4MDAJIE4vQQotICogSEZTX1RYX0NOVExfQ0tJUAkJCQkwMDAwCTAwMDAgfAkwMDAwCTIwMDAJMjAwMAotICogSEZTX1RYX0NOVExfVFhfREVMQVkJCQk0MDAwCTQwMDAgfAk0MDAwCTQwMDAJIE4vQQotICogSEZTX1RYX0NOVExfQUNUSU9OCQkJIE4vQQkgTi9BIHwJIE4vQQkgTi9BCTQwMDAKLSAqIAkJCQkJCQkJPT09PQk9PT09IHwJPT09PQk9PT09CT09PT0KLSAqIAkJCQkJCQkJNUYwNgk1RjE2IHwJNDcwNgk3RjA2CTY3Q0YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSC1JICAgICBILUkgIHwgIEgtSUkgICAgSC1JSSAgICBILUlJLjUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUEEgIHwgICAgICAgICAgV1BBCisgKiBIRlNfVFhfQ05UTF9UWF9PSyAgICAgICAgICAgIDAwMDIgICAgMDAwMiB8ICAwMDAyICAgIDAwMDIgICAgIE4vQSAgICA8PDw8PDw8PGRlcHJlY2F0ZWQKKyAqIEhGU19UWF9DTlRMX1RYX0VYICAgICAgICAgICAgMDAwNCAgICAwMDA0IHwgIDAwMDQgICAgMDAwNCAgICAgTi9BCisgKiBIRlNfVFhfQ05UTF9NSUMgICAgICAgICAgICAgICBOL0EgICAgMDAxMCB8ICAgTi9BICAgIDAwMTAgICAgIE4vQQorICogSEZTX1RYX0NOVExfVElEICAgICAgICAgICAgICAgTi9BICAgICBOL0EgfCAgIE4vQSAgICAgTi9BICAgIDAwMEYKKyAqIEhGU19UWF9DTlRMX1NFUlZJQ0VfQ0xBU1MgICAgIE4vQSAgICAgTi9BIHwgICBOL0EgICAgIE4vQSAgICAwMEMwCisgKiBIRlNfVFhfQ05UTF9QT1JUICAgICAgICAgICAgIDA3MDAgICAgMDcwMCB8ICAwNzAwICAgIDA3MDAgICAgMDcwMAorICogSEZTX1RYX0NOVExfTUlDX0tFWV9JRCAgICAgICAxODAwICAgIDE4MDAgfCAgMDAwMCAgICAxODAwICAgICBOL0EKKyAqIEhGU19UWF9DTlRMX0NLSVAgICAgICAgICAgICAgMDAwMCAgICAwMDAwIHwgIDAwMDAgICAgMjAwMCAgICAyMDAwCisgKiBIRlNfVFhfQ05UTF9UWF9ERUxBWSAgICAgICAgIDQwMDAgICAgNDAwMCB8ICA0MDAwICAgIDQwMDAgICAgIE4vQQorICogSEZTX1RYX0NOVExfQUNUSU9OICAgICAgICAgICAgTi9BICAgICBOL0EgfCAgIE4vQSAgICAgTi9BICAgIDQwMDAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT09PSAgICA9PT09IHwgID09PT0gICAgPT09PSAgICA9PT09CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDVGMDYgICAgNUYxNiB8ICA0NzA2ICAgIDdGMDYgICAgNjdDRgogICoKICAqIEhDRl9UWF9DTlRMX01BU0sgc3BlY2lmaWVzIHRoZSBiaXRzIGFsbG93ZWQgb24gdGhlIEhvc3QgSS9GCiAgKiBub3RlOiBiaXQgMHg0MDAwIGhhcyBkaWZmZXJlbnQgbWVhbmluZyBmb3IgSC1JSSBhbmQgSC1JSS41CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9jcy5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfY3MuYwppbmRleCBhM2E3MjdjLi4zMjE1ODAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9jcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2NzLmMKQEAgLTUwMSwxMTcgKzUwMSwzIEBACiAJcmV0dXJuIGxpbmstPm9wZW47CiB9IC8qIHdsX2FkYXB0ZXJfaXNfb3BlbiAqLwogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotCi0jaWYgREJHCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKglEYmdFdmVudCgpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqICBERVNDUklQVElPTjoKLSAqCi0gKiAgICAgIENvbnZlcnRzIHRoZSBjYXJkIHNlcml2Y2VzIGV2ZW50cyB0byB0ZXh0IGZvciBkZWJ1Z2dpbmcuCi0gKgotICogIFBBUkFNRVRFUlM6Ci0gKgotICogICAgICBtYXNrICAgIC0gYSBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgZXJyb3IocykgYmVpbmcgcmVwb3J0ZWQgYnkgQ2FyZAotICogICAgICAgICAgICAgICAgU2VydmljZXMuCi0gKgotICogIFJFVFVSTlM6Ci0gKgotICogICAgICBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZXJyb3IocykKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgY2hhciAqRGJnRXZlbnQoaW50IG1hc2spCi17Ci0Jc3RhdGljIGNoYXIgRGJnQnVmZmVyWzI1Nl07Ci0JY2hhciAqcEJ1ZjsKLQkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotCXBCdWYgICAgPSBEYmdCdWZmZXI7Ci0JKnBCdWYgICA9ICdcMCc7Ci0KLQotCWlmIChtYXNrICYgQ1NfRVZFTlRfV1JJVEVfUFJPVEVDVCkKLQkJc3RyY2F0KHBCdWYsICJXUklURV9QUk9URUNUICIpOwotCi0JaWYgKG1hc2sgJiBDU19FVkVOVF9DQVJEX0xPQ0spCi0JCXN0cmNhdChwQnVmLCAiQ0FSRF9MT0NLICIpOwotCi0JaWYgKG1hc2sgJiBDU19FVkVOVF9DQVJEX0lOU0VSVElPTikKLQkJc3RyY2F0KHBCdWYsICJDQVJEX0lOU0VSVElPTiAiKTsKLQotCWlmIChtYXNrICYgQ1NfRVZFTlRfQ0FSRF9SRU1PVkFMKQotCQlzdHJjYXQocEJ1ZiwgIkNBUkRfUkVNT1ZBTCAiKTsKLQotCWlmIChtYXNrICYgQ1NfRVZFTlRfQkFUVEVSWV9ERUFEKQotCQlzdHJjYXQocEJ1ZiwgIkJBVFRFUllfREVBRCAiKTsKLQotCWlmIChtYXNrICYgQ1NfRVZFTlRfQkFUVEVSWV9MT1cpCi0JCXN0cmNhdChwQnVmLCAiQkFUVEVSWV9MT1cgIik7Ci0KLQlpZiAobWFzayAmIENTX0VWRU5UX1JFQURZX0NIQU5HRSkKLQkJc3RyY2F0KHBCdWYsICJSRUFEWV9DSEFOR0UgIik7Ci0KLQlpZiAobWFzayAmIENTX0VWRU5UX0NBUkRfREVURUNUKQotCQlzdHJjYXQocEJ1ZiwgIkNBUkRfREVURUNUICIpOwotCi0JaWYgKG1hc2sgJiBDU19FVkVOVF9SRVNFVF9SRVFVRVNUKQotCQlzdHJjYXQocEJ1ZiwgIlJFU0VUX1JFUVVFU1QgIik7Ci0KLQlpZiAobWFzayAmIENTX0VWRU5UX1JFU0VUX1BIWVNJQ0FMKQotCQlzdHJjYXQocEJ1ZiwgIlJFU0VUX1BIWVNJQ0FMICIpOwotCi0JaWYgKG1hc2sgJiBDU19FVkVOVF9DQVJEX1JFU0VUKQotCQlzdHJjYXQocEJ1ZiwgIkNBUkRfUkVTRVQgIik7Ci0KLQlpZiAobWFzayAmIENTX0VWRU5UX1JFR0lTVFJBVElPTl9DT01QTEVURSkKLQkJc3RyY2F0KHBCdWYsICJSRUdJU1RSQVRJT05fQ09NUExFVEUgIik7Ci0KLQkvKiBpZiAobWFzayAmIENTX0VWRU5UX1JFU0VUX0NPTVBMRVRFKQotCQlzdHJjYXQocEJ1ZiwgIlJFU0VUX0NPTVBMRVRFICIpOyAqLwotCi0JaWYgKG1hc2sgJiBDU19FVkVOVF9QTV9TVVNQRU5EKQotCQlzdHJjYXQocEJ1ZiwgIlBNX1NVU1BFTkQgIik7Ci0KLQlpZiAobWFzayAmIENTX0VWRU5UX1BNX1JFU1VNRSkKLQkJc3RyY2F0KHBCdWYsICJQTV9SRVNVTUUgIik7Ci0KLQlpZiAobWFzayAmIENTX0VWRU5UX0lOU0VSVElPTl9SRVFVRVNUKQotCQlzdHJjYXQocEJ1ZiwgIklOU0VSVElPTl9SRVFVRVNUICIpOwotCi0JaWYgKG1hc2sgJiBDU19FVkVOVF9FSkVDVElPTl9SRVFVRVNUKQotCQlzdHJjYXQocEJ1ZiwgIkVKRUNUSU9OX1JFUVVFU1QgIik7Ci0KLQlpZiAobWFzayAmIENTX0VWRU5UX01URF9SRVFVRVNUKQotCQlzdHJjYXQocEJ1ZiwgIk1URF9SRVFVRVNUICIpOwotCi0JaWYgKG1hc2sgJiBDU19FVkVOVF9FUkFTRV9DT01QTEVURSkKLQkJc3RyY2F0KHBCdWYsICJFUkFTRV9DT01QTEVURSAiKTsKLQotCWlmIChtYXNrICYgQ1NfRVZFTlRfUkVRVUVTVF9BVFRFTlRJT04pCi0JCXN0cmNhdChwQnVmLCAiUkVRVUVTVF9BVFRFTlRJT04gIik7Ci0KLQlpZiAobWFzayAmIENTX0VWRU5UX0NCX0RFVEVDVCkKLQkJc3RyY2F0KHBCdWYsICJDQl9ERVRFQ1QgIik7Ci0KLQlpZiAobWFzayAmIENTX0VWRU5UXzNWQ0FSRCkKLQkJc3RyY2F0KHBCdWYsICIzVkNBUkQgIik7Ci0KLQlpZiAobWFzayAmIENTX0VWRU5UX1hWQ0FSRCkKLQkJc3RyY2F0KHBCdWYsICJYVkNBUkQgIik7Ci0KLQotCWlmICgqcEJ1ZikgewotCQlwQnVmW3N0cmxlbihwQnVmKSAtIDFdID0gJ1wwJzsKLQl9IGVsc2UgewotCQlpZiAobWFzayAhPSAweDApCi0JCQlzcHJpbnRmKHBCdWYsICI8PDB4JTA4eD4+IiwgbWFzayk7Ci0JfQotCi0JcmV0dXJuIHBCdWY7Ci19IC8qIERiZ0V2ZW50ICovCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0jZW5kaWYgIC8qIERCRyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfaW50ZXJuYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX2ludGVybmFsLmgKaW5kZXggYjYxYzllYi4uNTc1MzQwOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9pbnRlcm5hbC5oCkBAIC03NCwxNSArNzQsOCBAQAogI2luY2x1ZGUgPHBjbWNpYS9kcy5oPgogI2VuZGlmICAvLyBCVVNfUENNQ0lBCiAKLSNpZmRlZiBIQVNfV0lSRUxFU1NfRVhURU5TSU9OUwogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+Ci0jaWYgV0lSRUxFU1NfRVhUID4gMTMKICNpbmNsdWRlIDxuZXQvaXdfaGFuZGxlci5oPgotI2VuZGlmIC8vIFdJUkVMRVNTX0VYVCA+IDEzCi0jZGVmaW5lIFVTRV9EQk0KLSNkZWZpbmUgUkVUVVJOX0NVUlJFTlRfTkVUV09SS05BTUUKLSNkZWZpbmUgVVNFX0ZSRVFVRU5DWQotI2VuZGlmIC8vIEhBU19XSVJFTEVTU19FWFRFTlNJT05TLwogCiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCkBAIC04OTAsNyArODgzLDcgQEAKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcmVnaXN0ZXJlZDsKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgaXNfaGFuZGxpbmdfaW50OwogCWludCAgICAgICAgICAgICAgICAgICAgICAgICBmaXJtd2FyZV9wcmVzZW50OwotCWNoYXIgICAgICAgICAgICAgICAgICAgICAgICBzeXNmc0NyZWF0ZWQ7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIHN5c2ZzQ3JlYXRlZDsKIAlDRkdfRFJWX0lORk9fU1RSQ1QgICAgICAgICAgZHJpdmVySW5mbzsKIAlDRkdfSURFTlRJVFlfU1RSQ1QgICAgICAgICAgZHJpdmVySWRlbnRpdHk7CiAJQ0ZHX0ZXX0lERU5USVRZX1NUUkNUICAgICAgIFN0YXRpb25JZGVudGl0eTsKQEAgLTk4Nyw2ICs5ODAsMTIgQEAKICNpZmRlZiBVU0VfV0RTCiAJV1ZMQU5fV0RTX0lGICAgICAgICAgICAgICAgIHdkc19wb3J0W05VTV9XRFNfUE9SVFNdOwogI2VuZGlmIC8vIFVTRV9XRFMKKworCS8qIFRyYWNrIHdoZXRoZXIgdGhlIGNhcmQgaXMgdXNpbmcgV0VQIGVuY3J5cHRpb24gb3IgV1BBCisJICogc28gd2Uga25vdyB3aGF0IHRvIGRpc2FibGUgbmV4dCB0aW1lIHRocm91Z2guCisJICogIElXX0VOQ09ERV9BTEdfTk9ORSwgSVdfRU5DT0RFX0FMR19XRVAsIElXX0VOQ09ERV9BTEdfVEtJUAorCSAqLworCWludCB3ZXh0X2VuYzsKIH07IC8vIHdsX3ByaXZhdGUKIAogI2RlZmluZSB3bF9wcml2KGRldikgKChzdHJ1Y3Qgd2xfcHJpdmF0ZSAqKSBuZXRkZXZfcHJpdihkZXYpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfbWFpbi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfbWFpbi5jCmluZGV4IDZkNDVhYjMuLjQ4M2VlZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX21haW4uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9tYWluLmMKQEAgLTE5OTMsOCArMTk5MywxMCBAQAogCWxwLT5sdHZSZWNvcmQudHlwICAgICAgID0gQ0ZHX1NFVF9XUEFfQVVUSF9LRVlfTUdNVF9TVUlURTsKIAlscC0+bHR2UmVjb3JkLnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKCBscC0+QXV0aEtleU1nbXRTdWl0ZSApOwogCWhjZl9zdGF0dXMgPSBoY2ZfcHV0X2luZm8oICZscC0+aGNmQ3R4LCAoTFRWUCkmKCBscC0+bHR2UmVjb3JkICkpOwotCS8qIFdFUCBLZXlzICovCi0Jd2xfc2V0X3dlcF9rZXlzKCBscCApOworCisJLyogSWYgV0VQIChvciBubykga2V5cyBhcmUgYmVpbmcgdXNlZCwgd3JpdGUgKG9yIGNsZWFyKSB0aGVtICovCisJaWYgKGxwLT53ZXh0X2VuYyAhPSBJV19FTkNPREVfQUxHX1RLSVApCisJCXdsX3NldF93ZXBfa2V5cyhscCk7CiAKIAkvKiBDb3VudHJ5IENvZGUgKi8KIAkvKiBjb3VudHJ5SW5mbywgbHR2Q291bnRyeUluZm8sIENGR19DTkZfQ09VTlRSWV9JTkZPICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9uZXRkZXYuYyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX25ldGRldi5jCmluZGV4IGIyMTUxNWYuLjVhMmIzMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX25ldGRldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX25ldGRldi5jCkBAIC0yMTcsNyArMjE3LDcgQEAKIAogICAgIC8qIFRoZSBvbmx5IHRoaW5nIHdlIGNhcmUgYWJvdXQgaGVyZSBpcyBhIHBvcnQgY2hhbmdlLiBTaW5jZSB0aGlzIG5vdCBuZWVkZWQsCiAgICAgICAgaWdub3JlIHRoZSByZXF1ZXN0LiAqLwotICAgIERCR19UUkFDRSggRGJnSW5mbywgIiVzOiAlcyBjYWxsZWQuXG4iLCBkZXYtPm5hbWUsIF9fRlVOQ19fICk7CisgICAgREJHX1RSQUNFKERiZ0luZm8sICIlczogJXMgY2FsbGVkLlxuIiwgZGV2LT5uYW1lLCBfX2Z1bmNfXyk7CiAKICAgICBEQkdfTEVBVkUoIERiZ0luZm8gKTsKICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3N5c2ZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF9zeXNmcy5jCmluZGV4IDliODMzYjMuLjE1MDhmMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfc3lzZnMuYwpAQCAtMTIwLDE3ICsxMjAsMTkgQEAKIAogdm9pZCByZWdpc3Rlcl93bGFnc19zeXNmcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewotICAgIHN0cnVjdCBkZXZpY2UgKmRldiA9ICYobmV0LT5kZXYpOwotICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYobmV0KTsKLQotICAgIGxwLT5zeXNmc0NyZWF0ZWQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJndsYWdzX2dyb3VwKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmKG5ldC0+ZGV2KTsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KG5ldCk7CisJaW50IGVycjsKKwllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJndsYWdzX2dyb3VwKTsKKwlpZiAoIWVycikKKwkJbHAtPnN5c2ZzQ3JlYXRlZCA9IHRydWU7CiB9CiAKIHZvaWQgdW5yZWdpc3Rlcl93bGFnc19zeXNmcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewotICAgIHN0cnVjdCBkZXZpY2UgKmRldiA9ICYobmV0LT5kZXYpOwotICAgIHN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYobmV0KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmKG5ldC0+ZGV2KTsKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KG5ldCk7CiAKLSAgICBpZiAobHAtPnN5c2ZzQ3JlYXRlZCkKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgJndsYWdzX2dyb3VwKTsKKwlpZiAobHAtPnN5c2ZzQ3JlYXRlZCkKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXYtPmtvYmosICZ3bGFnc19ncm91cCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF92ZXJzaW9uLmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF92ZXJzaW9uLmgKaW5kZXggYTVmYWFkYS4uZmQzNzA0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfdmVyc2lvbi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3ZlcnNpb24uaApAQCAtMTQzLDcgKzE0Myw4IEBACiAJCQkJCQkJIiBmb3IgIiBCVVNfVFlQRSAiLCAiIAkJCQkJCQkJCQkJICAgCSBcCiAJCQkJCQkJTU9EVUxFX0RBVEUgIiBieSAiIFZFTkRPUl9OQU1FCiAKLSNkZWZpbmUgV0lSRUxFU1NfU1VQUE9SVCAgICAxNSAgLy8gVGhlIHZlcnNpb24gb2Ygd2lyZWxlc3MgZXh0ZW5zaW9ucyB3ZSBzdXBwb3J0CisvKiBUaGUgdmVyc2lvbiBvZiB3aXJlbGVzcyBleHRlbnNpb25zIHdlIHN1cHBvcnQgKi8KKyNkZWZpbmUgV0lSRUxFU1NfU1VQUE9SVCAgICAyMQogCiAvLyNkZWZpbmUgREJHX01PRF9OQU1FICAgICAgICAgRFJJVkVSX05BTUUgIjoiIEJVU19UWVBFICI6IiBIV19UWVBFICI6IiBGV19UWVBFCiAjZGVmaW5lIERCR19NT0RfTkFNRSAgICAgICAgTU9EVUxFX05BTUUKQEAgLTE1Nyw5ICsxNTgsNiBAQAogICogVGhlcmUgZG9lc24ndCBzZWVtIHRvIGJlIGEgZGlmZmVyZW5jZSBmb3IgUENNQ0lBIGFuZCBQQ0kgYW55bW9yZSwgYXQgbGVhc3QKICAqIGZvciBQQ01DSUEgdGhlIHNhbWUgZGVmaW5lcyBhcmUgbmVlZGVkIG5vdyBhcyBwcmV2aW91c2x5IG9ubHkgdXNlZCBmb3IgUENJCiAgKi8KLSNpZiBVU0VfV0VYVAotI2RlZmluZSBIQVNfV0lSRUxFU1NfRVhURU5TSU9OUwotI2VuZGlmICAvLyBVU0VfV0VYVAogCiAjZGVmaW5lIE5FV19NVUxUSUNBU1QKICNkZWZpbmUgQUxMT0NfU0tCKGxlbikgICBkZXZfYWxsb2Nfc2tiKGxlbisyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfd2V4dC5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfd2V4dC5jCmluZGV4IDUyMmEzMTAuLjhhYzVlMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3dleHQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF93ZXh0LmMKQEAgLTc1LDIwICs3NSw2IEBACiAjaW5jbHVkZSA8d2xfd2V4dC5oPgogI2luY2x1ZGUgPHdsX3ByaXYuaD4KIAotCi0KLS8qIElmIFdJUkVMRVNTX0VYVCBpcyBub3QgZGVmaW5lZCAoYXMgYSByZXN1bHQgb2YgSEFTX1dJUkVMRVNTX0VYVEVOU0lPTlMKLSAgICNpbmNsdWRpbmcgbGludXgvd2lyZWxlc3MuaCksIHRoZW4gdGhlc2UgZnVuY3Rpb25zIGRvIG5vdCBuZWVkIHRvIGJlIGluY2x1ZGVkCi0gICBpbiB0aGUgYnVpbGQuICovCi0jaWZkZWYgV0lSRUxFU1NfRVhUCi0KLSNkZWZpbmUgSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgYnVmLCBlbmQsIGl3ZSwgbGVuKSBcCi0gICAgaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgYnVmLCBlbmQsIGl3ZSwgbGVuKQotI2RlZmluZSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBidWYsIGVuZCwgaXdlLCBtc2cpIFwKLSAgICBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBidWYsIGVuZCwgaXdlLCBtc2cpCi0KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogZ2xvYmFsIGRlZmluaXRpb25zCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtOTcsNyArODMsMjIzIEBACiAjZW5kaWYgIC8vIERCRwogCiAKKy8qIFNldCB1cCB0aGUgTFRWIHRvIHByb2dyYW0gdGhlIGFwcHJvcHJpYXRlIGtleSAqLworc3RhdGljIGludCBoZXJtZXNfc2V0X3RraXBfa2V5cyhsdHZfdCAqbHR2LCB1MTYga2V5X2lkeCwgdTggKmFkZHIsCisJCQkJaW50IHNldF90eCwgdTggKnNlcSwgdTggKmtleSwgc2l6ZV90IGtleV9sZW4pCit7CisJaW50IHJldCA9IC1FSU5WQUw7CisJaW50IGJ1Zl9pZHggPSAwOworCWhjZl84IHRzY1tJV19FTkNPREVfU0VRX01BWF9TSVpFXSA9CisJCXsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCB9OwogCisJREJHX0VOVEVSKERiZ0luZm8pOworCisJLyoKKwkgKiBDaGVjayB0aGUga2V5IGluZGV4IGhlcmU7IGlmIDAsIGxvYWQgYXMgUGFpcndpc2UgS2V5LCBvdGhlcndpc2UsCisJICogbG9hZCBhcyBhIGdyb3VwIGtleS4gTm90ZSB0aGF0IGZvciB0aGUgSGVybWVzLCB0aGUgUklEcyBmb3IKKwkgKiBncm91cC9wYWlyd2lzZSBrZXlzIGFyZSBkaWZmZXJlbnQgZnJvbSBlYWNoIG90aGVyIGFuZCBkaWZmZXJlbnQKKwkgKiB0aGFuIHRoZSBkZWZhdWx0IFdFUCBrZXlzIGFzIHdlbGwuCisJICovCisJc3dpdGNoIChrZXlfaWR4KSB7CisJY2FzZSAwOgorCQlsdHYtPmxlbiA9IDI4OworCQlsdHYtPnR5cCA9IENGR19BRERfVEtJUF9NQVBQRURfS0VZOworCisJCS8qIExvYWQgdGhlIEJTU0lEICovCisJCW1lbWNweSgmbHR2LT51LnU4W2J1Zl9pZHhdLCBhZGRyLCBFVEhfQUxFTik7CisJCWJ1Zl9pZHggKz0gRVRIX0FMRU47CisKKwkJLyogTG9hZCB0aGUgVEtJUCBrZXkgKi8KKwkJbWVtY3B5KCZsdHYtPnUudThbYnVmX2lkeF0sICZrZXlbMF0sIDE2KTsKKwkJYnVmX2lkeCArPSAxNjsKKworCQkvKiBMb2FkIHRoZSBUU0MgKi8KKwkJbWVtY3B5KCZsdHYtPnUudThbYnVmX2lkeF0sIHRzYywgSVdfRU5DT0RFX1NFUV9NQVhfU0laRSk7CisJCWJ1Zl9pZHggKz0gSVdfRU5DT0RFX1NFUV9NQVhfU0laRTsKKworCQkvKiBMb2FkIHRoZSBSU0MgKi8KKwkJbWVtY3B5KCZsdHYtPnUudThbYnVmX2lkeF0sIHNlcSwgSVdfRU5DT0RFX1NFUV9NQVhfU0laRSk7CisJCWJ1Zl9pZHggKz0gSVdfRU5DT0RFX1NFUV9NQVhfU0laRTsKKworCQkvKiBMb2FkIHRoZSBUeE1JQyBrZXkgKi8KKwkJbWVtY3B5KCZsdHYtPnUudThbYnVmX2lkeF0sICZrZXlbMTZdLCA4KTsKKwkJYnVmX2lkeCArPSA4OworCisJCS8qIExvYWQgdGhlIFJ4TUlDIGtleSAqLworCQltZW1jcHkoJmx0di0+dS51OFtidWZfaWR4XSwgJmtleVsyNF0sIDgpOworCisJCXJldCA9IDA7CisJCWJyZWFrOworCWNhc2UgMToKKwljYXNlIDI6CisJY2FzZSAzOgorCQlsdHYtPmxlbiA9IDI2OworCQlsdHYtPnR5cCA9IENGR19BRERfVEtJUF9ERUZBVUxUX0tFWTsKKworCQkvKiBMb2FkIHRoZSBrZXkgSW5kZXggKi8KKworCQkvKiBJZiB0aGlzIGlzIGEgVHggS2V5LCBzZXQgYml0IDgwMDAgKi8KKwkJaWYgKHNldF90eCkKKwkJCWtleV9pZHggfD0gMHg4MDAwOworCQlsdHYtPnUudTE2W2J1Zl9pZHhdID0gY3B1X3RvX2xlMTYoa2V5X2lkeCk7CisJCWJ1Zl9pZHggKz0gMjsKKworCQkvKiBMb2FkIHRoZSBSU0MgKi8KKwkJbWVtY3B5KCZsdHYtPnUudThbYnVmX2lkeF0sIHNlcSwgSVdfRU5DT0RFX1NFUV9NQVhfU0laRSk7CisJCWJ1Zl9pZHggKz0gSVdfRU5DT0RFX1NFUV9NQVhfU0laRTsKKworCQkvKiBMb2FkIHRoZSBUS0lQLCBUeE1JQywgYW5kIFJ4TUlDIGtleXMgaW4gb25lIHNob3QsIGJlY2F1c2UgaW4KKwkJICAgQ0ZHX0FERF9US0lQX0RFRkFVTFRfS0VZIHRoZXkgYXJlIGJhY2stdG8tYmFjayAqLworCQltZW1jcHkoJmx0di0+dS51OFtidWZfaWR4XSwga2V5LCBrZXlfbGVuKTsKKwkJYnVmX2lkeCArPSBrZXlfbGVuOworCisJCS8qIExvYWQgdGhlIFRTQyAqLworCQltZW1jcHkoJmx0di0+dS51OFtidWZfaWR4XSwgdHNjLCBJV19FTkNPREVfU0VRX01BWF9TSVpFKTsKKworCQlyZXQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlEQkdfTEVBVkUoRGJnSW5mbyk7CisJcmV0dXJuIHJldDsKK30KKworLyogU2V0IHVwIHRoZSBMVFYgdG8gY2xlYXIgdGhlIGFwcHJvcHJpYXRlIGtleSAqLworc3RhdGljIGludCBoZXJtZXNfY2xlYXJfdGtpcF9rZXlzKGx0dl90ICpsdHYsIHUxNiBrZXlfaWR4LCB1OCAqYWRkcikKK3sKKwlpbnQgcmV0OworCisJc3dpdGNoIChrZXlfaWR4KSB7CisJY2FzZSAwOgorCQlpZiAobWVtY21wKGFkZHIsICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYiLCBFVEhfQUxFTikgIT0gMCkgeworCQkJbHR2LT5sZW4gPSA3OworCQkJbHR2LT50eXAgPSBDRkdfUkVNT1ZFX1RLSVBfTUFQUEVEX0tFWTsKKwkJCW1lbWNweSgmbHR2LT51LnU4WzBdLCBhZGRyLCBFVEhfQUxFTik7CisJCQlyZXQgPSAwOworCQl9CisJCWJyZWFrOworCWNhc2UgMToKKwljYXNlIDI6CisJY2FzZSAzOgorCQkvKiBDbGVhciB0aGUgR3JvdXAgVEtJUCBrZXlzIGJ5IGluZGV4ICovCisJCWx0di0+bGVuID0gMjsKKwkJbHR2LT50eXAgPSBDRkdfUkVNT1ZFX1RLSVBfREVGQVVMVF9LRVk7CisJCWx0di0+dS51MTZbMF0gPSBjcHVfdG9fbGUxNihrZXlfaWR4KTsKKworCQlyZXQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBTZXQgdGhlIFdFUCBrZXlzIGluIHRoZSB3bF9wcml2YXRlIHN0cnVjdHVyZSAqLworc3RhdGljIGludCBoZXJtZXNfc2V0X3dlcF9rZXlzKHN0cnVjdCB3bF9wcml2YXRlICpscCwgdTE2IGtleV9pZHgsCisJCQkgICAgICAgdTggKmtleSwgc2l6ZV90IGtleV9sZW4sCisJCQkgICAgICAgYm9vbCBlbmFibGUsIGJvb2wgc2V0X3R4KQoreworCWhjZl84ICBlbmNyeXB0aW9uX3N0YXRlID0gbHAtPkVuYWJsZUVuY3J5cHRpb247CisJaW50IHRrID0gbHAtPlRyYW5zbWl0S2V5SUQgLSAxOwkvKiBjdXJyZW50IGtleSAqLworCWludCByZXQgPSAwOworCisJLyogSXMgZW5jcnlwdGlvbiBzdXBwb3J0ZWQ/ICovCisJaWYgKCF3bF9oYXNfd2VwKCYobHAtPmhjZkN0eCkpKSB7CisJCURCR19XQVJOSU5HKERiZ0luZm8sICJXRVAgbm90IHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZVxuIik7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dDsKKwl9CisKKwlEQkdfTk9USUNFKERiZ0luZm8sICJwb2ludGVyOiAlcCwgbGVuZ3RoOiAlZFxuIiwKKwkJICAga2V5LCBrZXlfbGVuKTsKKworCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBrZXkgKi8KKwlzd2l0Y2ggKGtleV9sZW4pIHsKKwljYXNlIE1JTl9LRVlfU0laRToKKwljYXNlIE1BWF9LRVlfU0laRToKKworCQkvKiBDaGVjayB0aGUgaW5kZXggKi8KKwkJaWYgKChrZXlfaWR4IDwgMCkgfHwgKGtleV9pZHggPj0gTUFYX0tFWVMpKQorCQkJa2V5X2lkeCA9IHRrOworCisJCS8qIENsZWFudXAgKi8KKwkJbWVtc2V0KGxwLT5EZWZhdWx0S2V5cy5rZXlba2V5X2lkeF0ua2V5LCAwLCBNQVhfS0VZX1NJWkUpOworCisJCS8qIENvcHkgdGhlIGtleSBpbiB0aGUgZHJpdmVyICovCisJCW1lbWNweShscC0+RGVmYXVsdEtleXMua2V5W2tleV9pZHhdLmtleSwga2V5LCBrZXlfbGVuKTsKKworCQkvKiBTZXQgdGhlIGxlbmd0aCAqLworCQlscC0+RGVmYXVsdEtleXMua2V5W2tleV9pZHhdLmxlbiA9IGtleV9sZW47CisKKwkJREJHX05PVElDRShEYmdJbmZvLCAiZW5jb2RpbmcubGVuZ3RoOiAlZFxuIiwga2V5X2xlbik7CisJCURCR19OT1RJQ0UoRGJnSW5mbywgInNldCBrZXk6ICVzKCVkKSBbJWRdXG4iLAorCQkJICAgbHAtPkRlZmF1bHRLZXlzLmtleVtrZXlfaWR4XS5rZXksCisJCQkgICBscC0+RGVmYXVsdEtleXMua2V5W2tleV9pZHhdLmxlbiwga2V5X2lkeCk7CisKKwkJLyogRW5hYmxlIFdFUCAoaWYgcG9zc2libGUpICovCisJCWlmICgoa2V5X2lkeCA9PSB0aykgJiYgKGxwLT5EZWZhdWx0S2V5cy5rZXlbdGtdLmxlbiA+IDApKQorCQkJbHAtPkVuYWJsZUVuY3J5cHRpb24gPSAxOworCisJCWJyZWFrOworCisJY2FzZSAwOgorCQkvKiBEbyB3ZSB3YW50IHRvIGp1c3Qgc2V0IHRoZSBjdXJyZW50IHRyYW5zbWl0IGtleT8gKi8KKwkJaWYgKHNldF90eCAmJiAoa2V5X2lkeCA+PSAwKSAmJiAoa2V5X2lkeCA8IE1BWF9LRVlTKSkgeworCQkJREJHX05PVElDRShEYmdJbmZvLCAiaW5kZXg6ICVkOyBsZW46ICVkXG4iLCBrZXlfaWR4LAorCQkJCSAgIGxwLT5EZWZhdWx0S2V5cy5rZXlba2V5X2lkeF0ubGVuKTsKKworCQkJaWYgKGxwLT5EZWZhdWx0S2V5cy5rZXlba2V5X2lkeF0ubGVuID4gMCkgeworCQkJCWxwLT5UcmFuc21pdEtleUlEICAgID0ga2V5X2lkeCArIDE7CisJCQkJbHAtPkVuYWJsZUVuY3J5cHRpb24gPSAxOworCQkJfSBlbHNlIHsKKwkJCQlEQkdfV0FSTklORyhEYmdJbmZvLCAiUHJvYmxlbSBzZXR0aW5nIHRoZSBjdXJyZW50IFR4S2V5XG4iKTsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJfQorCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJREJHX1dBUk5JTkcoRGJnSW5mbywgIkludmFsaWQgS2V5IGxlbmd0aFxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFJlYWQgdGhlIGZsYWdzICovCisJaWYgKGVuYWJsZSkgeworCQlscC0+RW5hYmxlRW5jcnlwdGlvbiA9IDE7CisJCWxwLT53ZXh0X2VuYyA9IElXX0VOQ09ERV9BTEdfV0VQOworCX0gZWxzZSB7CisJCWxwLT5FbmFibGVFbmNyeXB0aW9uID0gMDsJLyogZGlzYWJsZSBlbmNyeXB0aW9uICovCisJCWxwLT53ZXh0X2VuYyA9IElXX0VOQ09ERV9BTEdfTk9ORTsKKwl9CisKKwlEQkdfVFJBQ0UoRGJnSW5mbywgImVuY3J5cHRpb25fc3RhdGUgOiAgICAgJWRcbiIsIGVuY3J5cHRpb25fc3RhdGUpOworCURCR19UUkFDRShEYmdJbmZvLCAibHAtPkVuYWJsZUVuY3J5cHRpb24gOiAlZFxuIiwgbHAtPkVuYWJsZUVuY3J5cHRpb24pOworCURCR19UUkFDRShEYmdJbmZvLCAiZXJxLT5sZW5ndGggICAgICAgICAgOiAlZFxuIiwga2V5X2xlbik7CisKKwkvKiBXcml0ZSB0aGUgY2hhbmdlcyB0byB0aGUgY2FyZCAqLworCWlmIChyZXQgPT0gMCkgeworCQlEQkdfTk9USUNFKERiZ0luZm8sICJlbmNyeXB0OiAlZCwgSUQ6ICVkXG4iLCBscC0+RW5hYmxlRW5jcnlwdGlvbiwKKwkJCSAgIGxwLT5UcmFuc21pdEtleUlEKTsKKworCQlpZiAobHAtPkVuYWJsZUVuY3J5cHRpb24gPT0gZW5jcnlwdGlvbl9zdGF0ZSkgeworCQkJaWYgKGtleV9sZW4gIT0gMCkgeworCQkJCS8qIER5bmFtaWMgV0VQIGtleSB1cGRhdGUgKi8KKwkJCQl3bF9zZXRfd2VwX2tleXMobHApOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogVG8gc3dpdGNoIGVuY3J5cHRpb24gb24vb2ZmLCBzb2Z0IHJlc2V0IGlzCisJCQkgKiByZXF1aXJlZCAqLworCQkJd2xfYXBwbHkobHApOworCQl9CisJfQorCitvdXQ6CisJcmV0dXJuIHJldDsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCXdpcmVsZXNzX2NvbW1pdCgpCkBAIC0zMjQsMTYgKzUyNiw4IEBACiAJaWYoIHJldCA9PSBIQ0ZfU1VDQ0VTUyApIHsKIAkJaGNmXzE2IGNoYW5uZWwgPSBDTlZfTElUVExFX1RPX0lOVCggbHAtPmx0dlJlY29yZC51LnUxNlswXSApOwogCi0jaWZkZWYgVVNFX0ZSRVFVRU5DWQotCiAJCWZyZXEtPm0gPSB3bF9nZXRfZnJlcV9mcm9tX2NoYW4oIGNoYW5uZWwgKSAqIDEwMDAwMDsKIAkJZnJlcS0+ZSA9IDE7Ci0jZWxzZQotCi0JCWZyZXEtPm0gPSBjaGFubmVsOwotCQlmcmVxLT5lID0gMDsKLQotI2VuZGlmIC8qIFVTRV9GUkVRVUVOQ1kgKi8KIAl9CiAKICAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKQEAgLTQ2MCw4ICs2NTQsNiBAQAogCiAKIAkvKiBMaW5rIHF1YWxpdHkgKi8KLSNpZmRlZiBVU0VfREJNCi0KIAlyYW5nZS0+bWF4X3F1YWwucXVhbCAgICAgPSAodV9jaGFyKUhDRl9NQVhfQ09NTV9RVUFMSVRZOwogCiAJLyogSWYgdGhlIHZhbHVlIHJldHVybmVkIGluIC9wcm9jL25ldC93aXJlbGVzcyBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gcmFuZ2UsCkBAIC00NzAsMTMgKzY2Miw2IEBACiAKIAlyYW5nZS0+bWF4X3F1YWwubGV2ZWwgICA9ICh1X2NoYXIpKCBkYm0oIEhDRl9NSU5fU0lHTkFMX0xFVkVMICkgLSAxICk7CiAJcmFuZ2UtPm1heF9xdWFsLm5vaXNlICAgPSAodV9jaGFyKSggZGJtKCBIQ0ZfTUlOX05PSVNFX0xFVkVMICkgLSAxICk7Ci0jZWxzZQotCi0JcmFuZ2UtPm1heF9xdWFsLnF1YWwgICAgPSAxMDA7Ci0JcmFuZ2UtPm1heF9xdWFsLmxldmVsICAgPSAxMDA7Ci0JcmFuZ2UtPm1heF9xdWFsLm5vaXNlICAgPSAxMDA7Ci0KLSNlbmRpZiAvKiBVU0VfREJNICovCiAKIAogCS8qIFNldCBhdmFpbGFibGUgcmF0ZXMgKi8KQEAgLTUwOCw4ICs2OTMsNiBAQAogCiAJLyogRW5jcnlwdGlvbiAqLwogCi0jaWYgV0lSRUxFU1NfRVhUID4gOAotCiAJLyogSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMgKi8KIAl3bF91bmxvY2sobHAsICZmbGFncyk7CiAJd2xfbG9jayggbHAsICZmbGFncyApOwpAQCAtNTI2LDI2ICs3MDksMTcgQEAKIAkJcmFuZ2UtPm1heF9lbmNvZGluZ190b2tlbnMgICA9IE1BWF9LRVlTOwogCX0KIAotI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDggKi8KLQogCS8qIFR4IFBvd2VyIEluZm8gKi8KIAlyYW5nZS0+dHhwb3dlcl9jYXBhICA9IElXX1RYUE9XX01XQVRUOwogCXJhbmdlLT5udW1fdHhwb3dlciAgID0gMTsKIAlyYW5nZS0+dHhwb3dlclswXSAgICA9IFJBRElPX1RYX1BPV0VSX01XQVRUOwogCi0jaWYgV0lSRUxFU1NfRVhUID4gMTAKLQogCS8qIFdpcmVsZXNzIEV4dGVuc2lvbiBJbmZvICovCiAJcmFuZ2UtPndlX3ZlcnNpb25fY29tcGlsZWQgICA9IFdJUkVMRVNTX0VYVDsKIAlyYW5nZS0+d2VfdmVyc2lvbl9zb3VyY2UgICAgID0gV0lSRUxFU1NfU1VQUE9SVDsKIAogCS8vIFJldHJ5IExpbWl0cyBhbmQgTGlmZXRpbWUgLSBOT1QgU1VQUE9SVEVECiAKLSNlbmRpZgotCi0KLSNpZiBXSVJFTEVTU19FWFQgPiAxMQotCiAJLyogSG9sZGluZyB0aGUgbG9jayB0b28gbG9uZywgbWFrZSBhIGdhcCB0byBhbGxvdyBvdGhlciBwcm9jZXNzZXMgKi8KIAl3bF91bmxvY2sobHAsICZmbGFncyk7CiAJd2xfbG9jayggbHAsICZmbGFncyApOwpAQCAtNTU1LDE4ICs3MjksMTggQEAKIAlyYW5nZS0+YXZnX3F1YWwgPSBscC0+d3N0YXRzLnF1YWw7CiAJREJHX1RSQUNFKCBEYmdJbmZvLCAid2xfd2lyZWxlc3Nfc3RhdHMgZG9uZVxuIiApOwogCi0jZW5kaWYKLQogCS8qIEV2ZW50IGNhcGFiaWxpdHkgKGtlcm5lbCArIGRyaXZlcikgKi8KLQlyYW5nZS0+ZXZlbnRfY2FwYVswXSA9IChJV19FVkVOVF9DQVBBX0tfMCB8Ci0JCQkJSVdfRVZFTlRfQ0FQQV9NQVNLKFNJT0NHSVdBUCkgfAotCQkJCUlXX0VWRU5UX0NBUEFfTUFTSyhTSU9DR0lXU0NBTikpOwotCXJhbmdlLT5ldmVudF9jYXBhWzFdID0gSVdfRVZFTlRfQ0FQQV9LXzE7Ci0JcmFuZ2UtPmV2ZW50X2NhcGFbNF0gPSAoSVdfRVZFTlRfQ0FQQV9NQVNLKElXRVZSRUdJU1RFUkVEKSB8Ci0JCQkJSVdfRVZFTlRfQ0FQQV9NQVNLKElXRVZDVVNUT00pIHwKLQkJCQlJV19FVkVOVF9DQVBBX01BU0soSVdFVkVYUElSRUQpKTsKKwlJV19FVkVOVF9DQVBBX1NFVF9LRVJORUwocmFuZ2UtPmV2ZW50X2NhcGEpOworCUlXX0VWRU5UX0NBUEFfU0VUKHJhbmdlLT5ldmVudF9jYXBhLCBTSU9DR0lXQVApOworCUlXX0VWRU5UX0NBUEFfU0VUKHJhbmdlLT5ldmVudF9jYXBhLCBTSU9DR0lXU0NBTik7CisJSVdfRVZFTlRfQ0FQQV9TRVQocmFuZ2UtPmV2ZW50X2NhcGEsIElXRVZSRUdJU1RFUkVEKTsKKwlJV19FVkVOVF9DQVBBX1NFVChyYW5nZS0+ZXZlbnRfY2FwYSwgSVdFVkVYUElSRUQpOworCUlXX0VWRU5UX0NBUEFfU0VUKHJhbmdlLT5ldmVudF9jYXBhLCBJV0VWTUlDSEFFTE1JQ0ZBSUxVUkUpOworCUlXX0VWRU5UX0NBUEFfU0VUKHJhbmdlLT5ldmVudF9jYXBhLCBJV0VWQVNTT0NSRVFJRSk7CisJSVdfRVZFTlRfQ0FQQV9TRVQocmFuZ2UtPmV2ZW50X2NhcGEsIElXRVZBU1NPQ1JFU1BJRSk7CiAKIAlyYW5nZS0+ZW5jX2NhcGEgPSBJV19FTkNfQ0FQQV9XUEEgfCBJV19FTkNfQ0FQQV9DSVBIRVJfVEtJUDsKKwlyYW5nZS0+c2Nhbl9jYXBhID0gSVdfU0NBTl9DQVBBX05PTkU7CiAKIG91dF91bmxvY2s6CiAgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CkBAIC0xMDc1LDkgKzEyNDksNiBAQAogCQkvKiBDb3B5IHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSB1c2VyIGJ1ZmZlciAqLwogCQlkYXRhLT5sZW5ndGggPSBwTmFtZS0+bGVuZ3RoOwogCi0JCS8qIE5PVEU6IE51bGwgdGVybWluYXRpbmcgaXMgbmVjZXNzYXJ5IGZvciBwcm9wZXIgZGlzcGxheSBvZiB0aGUgU1NJRCBpbgotCQkgICB0aGUgd2lyZWxlc3MgdG9vbHMgKi8KLQkJZGF0YS0+bGVuZ3RoID0gcE5hbWUtPmxlbmd0aCArIDE7CiAJCWlmKCBwTmFtZS0+bGVuZ3RoIDwgSENGX01BWF9OQU1FX0xFTiApIHsKIAkJCXBOYW1lLT5uYW1lW3BOYW1lLT5sZW5ndGhdID0gJ1wwJzsKIAkJfQpAQCAtMTA4Nyw3ICsxMjU4LDYgQEAKIAogI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBCiAJCQkJCS8vOz9zaG91bGQgd2UgcmV0dXJuIGFuIGVycm9yIHN0YXR1cyBpbiBBUCBtb2RlCi0jaWZkZWYgUkVUVVJOX0NVUlJFTlRfTkVUV09SS05BTUUKIAogCQkvKiBpZiBkZXNpcmVkIGlzIG51bGwgKCJhbnkiKSwgcmV0dXJuIGN1cnJlbnQgb3IgImFueSIgKi8KIAkJaWYoIHBOYW1lLT5uYW1lWzBdID09ICdcMCcgKSB7CkBAIC0xMTA0LDExICsxMjc0LDcgQEAKIAkJCQlwTmFtZS0+bGVuZ3RoID0gQ05WX0xJVFRMRV9UT19JTlQoIHBOYW1lLT5sZW5ndGggKTsKIAogCQkJCS8qIENvcHkgdGhlIGluZm9ybWF0aW9uIGludG8gdGhlIHVzZXIgYnVmZmVyICovCi0JCQkJZGF0YS0+bGVuZ3RoID0gcE5hbWUtPmxlbmd0aCArIDE7Ci0JCQkJaWYoIHBOYW1lLT5sZW5ndGggPCBIQ0ZfTUFYX05BTUVfTEVOICkgewotCQkJCQlwTmFtZS0+bmFtZVtwTmFtZS0+bGVuZ3RoXSA9ICdcMCc7Ci0JCQkJfQotCisJCQkJZGF0YS0+bGVuZ3RoID0gcE5hbWUtPmxlbmd0aDsKIAkJCQlkYXRhLT5mbGFncyA9IDE7CiAJCQl9IGVsc2UgewogCQkJCXJldCA9IC1FRkFVTFQ7CkBAIC0xMTE2LDExICsxMjgyLDggQEAKIAkJCX0KIAkJfQogCi0jZW5kaWYgLy8gUkVUVVJOX0NVUlJFTlRfTkVUV09SS05BTUUKICNlbmRpZiAvLyBIQ0ZfU1RBCiAKLQkJZGF0YS0+bGVuZ3RoLS07Ci0KIAkJaWYgKHBOYW1lLT5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSkgewogCQkJcmV0ID0gLUVGQVVMVDsKIAkJCWdvdG8gb3V0X3VubG9jazsKQEAgLTExNjksMTU2ICsxMzMyLDM5IEBACiB7CiAJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50ICAgICByZXQgPSAwOworCWludCBrZXlfaWR4ID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwlpbnQgcmV0ID0gMDsKKwlib29sIGVuYWJsZSA9IHRydWU7CiAKLSNpZiAxIC8vOz8gI2lmIFdJUkVMRVNTX0VYVCA+IDggLSB1c2VkIHVuY29uZGl0aW9uYWxseSBpbiB0aGUgcmVzdCBvZiB0aGUgY29kZS4uLgotCWhjZl84ICAgZW5jcnlwdGlvbl9zdGF0ZTsKLSNlbmRpZiAvLyBXSVJFTEVTU19FWFQgPiA4Ci0JLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCURCR19FTlRFUihEYmdJbmZvKTsKIAotCi0JREJHX0ZVTkMoICJ3aXJlbGVzc19zZXRfZW5jb2RlIiApOwotCURCR19FTlRFUiggRGJnSW5mbyApOwotCi0JaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CisJaWYgKGxwLT5wb3J0U3RhdGUgPT0gV1ZMQU5fUE9SVF9TVEFURV9ESVNBQkxFRCkgewogCQlyZXQgPSAtRUJVU1k7CiAJCWdvdG8gb3V0OwogCX0KIAotCXdsX2xvY2soIGxwLCAmZmxhZ3MgKTsKKwlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkKKwkJZW5hYmxlID0gZmFsc2U7CiAKLSAgICAJd2xfYWN0X2ludF9vZmYoIGxwICk7CisJd2xfbG9jayhscCwgJmZsYWdzKTsKIAotCS8qIElzIGVuY3J5cHRpb24gc3VwcG9ydGVkPyAqLwotCWlmKCAhd2xfaGFzX3dlcCggJiggbHAtPmhjZkN0eCApKSkgewotCQlEQkdfV0FSTklORyggRGJnSW5mbywgIldFUCBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlXG4iICk7Ci0JCXJldCA9IC1FT1BOT1RTVVBQOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQorCXdsX2FjdF9pbnRfb2ZmKGxwKTsKIAotCURCR19OT1RJQ0UoIERiZ0luZm8sICJwb2ludGVyOiAlcCwgbGVuZ3RoOiAlZCwgZmxhZ3M6ICUjeFxuIiwKLQkJCQlrZXlidWYsIGVycS0+bGVuZ3RoLAotCQkJCWVycS0+ZmxhZ3MpOwotCi0JLyogU2F2ZSBzdGF0ZSBvZiBFbmNyeXB0aW9uIHN3aXRjaCAqLwotCWVuY3J5cHRpb25fc3RhdGUgPSBscC0+RW5hYmxlRW5jcnlwdGlvbjsKLQotCS8qIEJhc2ljIGNoZWNraW5nOiBkbyB3ZSBoYXZlIGEga2V5IHRvIHNldD8gKi8KLQlpZigoZXJxLT5sZW5ndGgpICE9IDApIHsKLQkJaW50IGluZGV4ICAgPSAoIGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVggKSAtIDE7Ci0JCWludCB0ayAgICAgID0gbHAtPlRyYW5zbWl0S2V5SUQgLSAxOwkJLy8gY3VycmVudCBrZXkKLQotCi0JCS8qIENoZWNrIHRoZSBzaXplIG9mIHRoZSBrZXkgKi8KLQkJc3dpdGNoKGVycS0+bGVuZ3RoKSB7Ci0JCWNhc2UgMDoKLQkJCWJyZWFrOwotCi0JCWNhc2UgTUlOX0tFWV9TSVpFOgotCQljYXNlIE1BWF9LRVlfU0laRToKLQotCQkJLyogQ2hlY2sgdGhlIGluZGV4ICovCi0JCQlpZigoIGluZGV4IDwgMCApIHx8ICggaW5kZXggPj0gTUFYX0tFWVMgKSkgewotCQkJCWluZGV4ID0gdGs7Ci0JCQl9Ci0KLQkJCS8qIENsZWFudXAgKi8KLQkJCW1lbXNldCggbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ua2V5LCAwLCBNQVhfS0VZX1NJWkUgKTsKLQotCQkJLyogQ29weSB0aGUga2V5IGluIHRoZSBkcml2ZXIgKi8KLQkJCW1lbWNweSggbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ua2V5LCBrZXlidWYsIGVycS0+bGVuZ3RoKTsKLQotCQkJLyogU2V0IHRoZSBsZW5ndGggKi8KLQkJCWxwLT5EZWZhdWx0S2V5cy5rZXlbaW5kZXhdLmxlbiA9IGVycS0+bGVuZ3RoOwotCi0JCQlEQkdfTk9USUNFKCBEYmdJbmZvLCAiZW5jb2RpbmcubGVuZ3RoOiAlZFxuIiwgZXJxLT5sZW5ndGggKTsKLQkJCURCR19OT1RJQ0UoIERiZ0luZm8sICJzZXQga2V5OiAlcyglZCkgWyVkXVxuIiwgbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ua2V5LAotCQkJCQkJbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ubGVuLCBpbmRleCApOwotCi0JCQkvKiBFbmFibGUgV0VQIChpZiBwb3NzaWJsZSkgKi8KLQkJCWlmKCggaW5kZXggPT0gdGsgKSAmJiAoIGxwLT5EZWZhdWx0S2V5cy5rZXlbdGtdLmxlbiA+IDAgKSkgewotCQkJCWxwLT5FbmFibGVFbmNyeXB0aW9uID0gMTsKLQkJCX0KLQotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiSW52YWxpZCBLZXkgbGVuZ3RoXG4iICk7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBvdXRfdW5sb2NrOwotCQl9Ci0JfSBlbHNlIHsKLQkJaW50IGluZGV4ID0gKCBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYICkgLSAxOwotCi0KLQkJLyogRG8gd2Ugd2FudCB0byBqdXN0IHNldCB0aGUgY3VycmVudCB0cmFuc21pdCBrZXk/ICovCi0JCWlmKCggaW5kZXggPj0gMCApICYmICggaW5kZXggPCBNQVhfS0VZUyApKSB7Ci0JCQlEQkdfTk9USUNFKCBEYmdJbmZvLCAiaW5kZXg6ICVkOyBsZW46ICVkXG4iLCBpbmRleCwKLQkJCQkJCWxwLT5EZWZhdWx0S2V5cy5rZXlbaW5kZXhdLmxlbiApOwotCi0JCQlpZiggbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ubGVuID4gMCApIHsKLQkJCQlscC0+VHJhbnNtaXRLZXlJRCAgICAgICA9IGluZGV4ICsgMTsKLQkJCQlscC0+RW5hYmxlRW5jcnlwdGlvbiAgICA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiUHJvYmxlbSBzZXR0aW5nIHRoZSBjdXJyZW50IFR4S2V5XG4iICk7Ci0JCQkJREJHX0xFQVZFKCBEYmdJbmZvICk7Ci0JCQkJcmV0ID0gLUVJTlZBTDsKLQkJCX0KLQkJfQotCX0KLQotCS8qIFJlYWQgdGhlIGZsYWdzICovCi0JaWYoIGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQgKSB7Ci0JCWxwLT5FbmFibGVFbmNyeXB0aW9uID0gMDsJLy8gZGlzYWJsZSBlbmNyeXB0aW9uCi0JfSBlbHNlIHsKLQkJbHAtPkVuYWJsZUVuY3J5cHRpb24gPSAxOwotCX0KLQotCWlmKCBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQgKSB7Ci0JCURCR19XQVJOSU5HKCBEYmdJbmZvLCAiSVdfRU5DT0RFX1JFU1RSSUNURUQgaW52YWxpZFxuIiApOwotCQlyZXQgPSAtRUlOVkFMOwkJLy8gSW52YWxpZAotCX0KLQotCURCR19UUkFDRSggRGJnSW5mbywgImVuY3J5cHRpb25fc3RhdGUgOiAgICAgICAlZFxuIiwgZW5jcnlwdGlvbl9zdGF0ZSApOwotCURCR19UUkFDRSggRGJnSW5mbywgImxwLT5FbmFibGVFbmNyeXB0aW9uIDogICAlZFxuIiwgbHAtPkVuYWJsZUVuY3J5cHRpb24gKTsKLQlEQkdfVFJBQ0UoIERiZ0luZm8sICJlcnEtPmxlbmd0aCAgICAgICAgICAgIDogJWRcbiIsCi0JCQkgICBlcnEtPmxlbmd0aCk7Ci0JREJHX1RSQUNFKCBEYmdJbmZvLCAiZXJxLT5mbGFncyAgICAgICAgICAgICA6IDB4JXhcbiIsCi0JCQkgICBlcnEtPmZsYWdzKTsKLQotCS8qIFdyaXRlIHRoZSBjaGFuZ2VzIHRvIHRoZSBjYXJkICovCi0JaWYoIHJldCA9PSAwICkgewotCQlEQkdfTk9USUNFKCBEYmdJbmZvLCAiZW5jcnlwdDogJWQsIElEOiAlZFxuIiwgbHAtPkVuYWJsZUVuY3J5cHRpb24sCi0JCQkJCWxwLT5UcmFuc21pdEtleUlEICk7Ci0KLQkJaWYoIGxwLT5FbmFibGVFbmNyeXB0aW9uID09IGVuY3J5cHRpb25fc3RhdGUgKSB7Ci0JCQlpZiggZXJxLT5sZW5ndGggIT0gMCApIHsKLQkJCQkvKiBEeW5hbWljIFdFUCBrZXkgdXBkYXRlICovCi0JCQkJd2xfc2V0X3dlcF9rZXlzKCBscCApOwotCQkJfQotCQl9IGVsc2UgewotCQkJLyogVG8gc3dpdGNoIGVuY3J5cHRpb24gb24vb2ZmLCBzb2Z0IHJlc2V0IGlzIHJlcXVpcmVkICovCi0JCQl3bF9hcHBseSggbHAgKTsKLQkJfQotCX0KKwlyZXQgPSBoZXJtZXNfc2V0X3dlcF9rZXlzKGxwLCBrZXlfaWR4LCBrZXlidWYsIGVycS0+bGVuZ3RoLAorCQkJCSAgZW5hYmxlLCB0cnVlKTsKIAogCS8qIFNlbmQgYW4gZXZlbnQgdGhhdCBFbmNyeXB0aW9uIGhhcyBiZWVuIHNldCAqLwotCXdsX3dleHRfZXZlbnRfZW5jb2RlKCBkZXYgKTsKKwlpZiAocmV0ID09IDApCisJCXdsX3dleHRfZXZlbnRfZW5jb2RlKGRldik7CiAKLW91dF91bmxvY2s6Ci0KLSAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKKwl3bF9hY3RfaW50X29uKGxwKTsKIAogCXdsX3VubG9jayhscCwgJmZsYWdzKTsKIAogb3V0OgotCURCR19MRUFWRSggRGJnSW5mbyApOworCURCR19MRUFWRShEYmdJbmZvKTsKIAlyZXR1cm4gcmV0OwotfSAvLyB3aXJlbGVzc19zZXRfZW5jb2RlCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0KLQorfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJd2lyZWxlc3NfZ2V0X2VuY29kZSgpCkBAIC0yMDIzLDExICsyMDY5LDkgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0jaWYgV0lSRUxFU1NfRVhUID4gOAogCWlmKCBydHMtPmRpc2FibGVkICkgewogCQlydGhyID0gMjM0NzsKIAl9Ci0jZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gOCAqLwogCiAJaWYoKCBydGhyIDwgMjU2ICkgfHwgKCBydGhyID4gMjM0NyApKSB7CiAJCXJldCA9IC1FSU5WQUw7CkBAIC0yMDk1LDEyICsyMTM5LDggQEAKIAogCXJ0cy0+dmFsdWUgPSBscC0+UlRTVGhyZXNob2xkOwogCi0jaWYgV0lSRUxFU1NfRVhUID4gOAotCiAJcnRzLT5kaXNhYmxlZCA9ICggcnRzLT52YWx1ZSA9PSAyMzQ3ICk7CiAKLSNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiA4ICovCi0KIAlydHMtPmZpeGVkID0gMTsKIAogICAgIAl3bF9hY3RfaW50X29uKCBscCApOwpAQCAtMjUyNyw4ICsyNTY3LDYgQEAKIAogCiAKLSNpZiBXSVJFTEVTU19FWFQgPiAxMwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJd2lyZWxlc3Nfc2V0X3NjYW4oKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI3MzcsOCArMjc3NSw4IEBACiAJCW1lbWNweSggaXdlLnUuYXBfYWRkci5zYV9kYXRhLCBwcm9iZV9yZXNwLT5CU1NJRCwgRVRIX0FMRU4pOwogCQlpd2UubGVuICAgICAgICAgICAgICAgICA9IElXX0VWX0FERFJfTEVOOwogCi0JCWJ1ZiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGJ1ZiwgYnVmX2VuZCwgJml3ZSwgSVdfRVZfQUREUl9MRU4pOwotCisJCWJ1ZiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGJ1ZiwgYnVmX2VuZCwKKwkJCQkJICAgJml3ZSwgSVdfRVZfQUREUl9MRU4pOwogCiAJCS8qIFVzZSB0aGUgbW9kZSB0byBpbmRpY2F0ZSBpZiBpdCdzIGEgc3RhdGlvbiBvciBBUCAqLwogCQkvKiBXb24ndCBhbHdheXMgYmUgYW4gQVAgaWYgaW4gSUJTUyBtb2RlICovCkBAIC0yNzU0LDggKzI3OTIsOCBAQAogCiAJCWl3ZS5sZW4gPSBJV19FVl9VSU5UX0xFTjsKIAotCQlidWYgPSBJV0VfU1RSRUFNX0FERF9FVkVOVChpbmZvLCBidWYsIGJ1Zl9lbmQsICZpd2UsIElXX0VWX1VJTlRfTEVOKTsKLQorCQlidWYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBidWYsIGJ1Zl9lbmQsCisJCQkJCSAgICZpd2UsIElXX0VWX1VJTlRfTEVOKTsKIAogCQkvKiBBbnkgcXVhbGl0eSBpbmZvcm1hdGlvbiAqLwogCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwpAQCAtMjc2Nyw3ICsyODA1LDggQEAKIAkJaXdlLnUucXVhbC51cGRhdGVkICA9IGxwLT5wcm9iZV9yZXN1bHRzLnNjYW5fY29tcGxldGUgfCBJV19RVUFMX0RCTTsKIAkJaXdlLmxlbiAgICAgICAgICAgICA9IElXX0VWX1FVQUxfTEVOOwogCi0JCWJ1ZiA9IElXRV9TVFJFQU1fQUREX0VWRU5UKGluZm8sIGJ1ZiwgYnVmX2VuZCwgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOworCQlidWYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBidWYsIGJ1Zl9lbmQsCisJCQkJCSAgICZpd2UsIElXX0VWX1FVQUxfTEVOKTsKIAogCiAJCS8qIEVTU0lEIGluZm9ybWF0aW9uICovCkBAIC0yNzc4LDcgKzI4MTcsOCBAQAogCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBwcm9iZV9yZXNwLT5yYXdEYXRhWzFdOwogCQkJaXdlLnUuZGF0YS5mbGFncyA9IDE7CiAKLQkJCWJ1ZiA9IElXRV9TVFJFQU1fQUREX1BPSU5UKGluZm8sIGJ1ZiwgYnVmX2VuZCwgJml3ZSwgJnByb2JlX3Jlc3AtPnJhd0RhdGFbMl0pOworCQkJYnVmID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgYnVmLCBidWZfZW5kLAorCQkJCQkgICAgICAgJml3ZSwgJnByb2JlX3Jlc3AtPnJhd0RhdGFbMl0pOwogCQl9CiAKIApAQCAtMjc5Niw3ICsyODM2LDcgQEAKIAkJCWl3ZS51LmRhdGEuZmxhZ3MgfD0gSVdfRU5DT0RFX0RJU0FCTEVEOwogCQl9CiAKLQkJYnVmID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgYnVmLCBidWZfZW5kLCAmaXdlLCBOVUxMKTsKKwkJYnVmID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgYnVmLCBidWZfZW5kLCAmaXdlLCBOVUxMKTsKIAogCiAJCS8qIEZyZXF1ZW5jeSBJbmZvICovCkBAIC0yODA3LDEwICsyODQ3LDEwIEBACiAJCWl3ZS51LmZyZXEubSA9IHdsX3BhcnNlX2RzX2llKCBwcm9iZV9yZXNwICk7CiAJCWl3ZS51LmZyZXEuZSA9IDA7CiAKLQkJYnVmID0gSVdFX1NUUkVBTV9BRERfRVZFTlQoaW5mbywgYnVmLCBidWZfZW5kLCAmaXdlLCBJV19FVl9GUkVRX0xFTik7CisJCWJ1ZiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGJ1ZiwgYnVmX2VuZCwKKwkJCQkJICAgJml3ZSwgSVdfRVZfRlJFUV9MRU4pOwogCiAKLSNpZiBXSVJFTEVTU19FWFQgPiAxNAogCQkvKiBDdXN0b20gaW5mbyAoQmVhY29uIEludGVydmFsKSAqLwogCQltZW1zZXQoICZpd2UsIDAsIHNpemVvZiggaXdlICkpOwogCQltZW1zZXQoIG1zZywgMCwgc2l6ZW9mKCBtc2cgKSk7CkBAIC0yODE5LDI3ICsyODU5LDI1IEBACiAJCXNwcmludGYoIG1zZywgImJlYWNvbl9pbnRlcnZhbD0lZCIsIHByb2JlX3Jlc3AtPmJlYWNvbkludGVydmFsICk7CiAJCWl3ZS51LmRhdGEubGVuZ3RoID0gc3RybGVuKCBtc2cgKTsKIAotCQlidWYgPSBJV0VfU1RSRUFNX0FERF9QT0lOVChpbmZvLCBidWYsIGJ1Zl9lbmQsICZpd2UsIG1zZyk7CisJCWJ1ZiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGJ1ZiwgYnVmX2VuZCwgJml3ZSwgbXNnKTsKIAogCi0JCS8qIEN1c3RvbSBpbmZvIChXUEEtSUUpICovCisJCS8qIFdQQS1JRSAqLwogCQl3cGFfaWUgPSBOVUxMOwogCQl3cGFfaWVfbGVuID0gMDsKIAogCQl3cGFfaWUgPSB3bF9wYXJzZV93cGFfaWUoIHByb2JlX3Jlc3AsICZ3cGFfaWVfbGVuICk7CiAJCWlmKCB3cGFfaWUgIT0gTlVMTCApIHsKLQkJCW1lbXNldCggJml3ZSwgMCwgc2l6ZW9mKCBpd2UgKSk7Ci0JCQltZW1zZXQoIG1zZywgMCwgc2l6ZW9mKCBtc2cgKSk7CisJCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwogCi0JCQlpd2UuY21kID0gSVdFVkNVU1RPTTsKLQkJCXNwcmludGYoIG1zZywgIndwYV9pZT0lcyIsIHdsX3ByaW50X3dwYV9pZSggd3BhX2llLCB3cGFfaWVfbGVuICkpOwotCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oIG1zZyApOworCQkJaXdlLmNtZCA9IElXRVZHRU5JRTsKKwkJCWl3ZS51LmRhdGEubGVuZ3RoID0gd3BhX2llX2xlbjsKIAotCQkJYnVmID0gSVdFX1NUUkVBTV9BRERfUE9JTlQoaW5mbywgYnVmLCBidWZfZW5kLCAmaXdlLCBtc2cpOworCQkJYnVmID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgYnVmLCBidWZfZW5kLAorCQkJCQkJICAgJml3ZSwgd3BhX2llKTsKIAkJfQogCiAJCS8qIEFkZCBvdGhlciBjdXN0b20gaW5mbyBpbiBmb3JtYXR0ZWQgc3RyaW5nIGZvcm1hdCBhcyBuZWVkZWQuLi4gKi8KLSNlbmRpZgogCX0KIAogCWRhdGEtPmxlbmd0aCA9IGJ1ZiAtIGV4dHJhOwpAQCAtMjg1NiwxMCArMjg5NCwyNCBAQAogfSAvLyB3aXJlbGVzc19nZXRfc2NhbgogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAotI2VuZGlmICAvLyBXSVJFTEVTU19FWFQgPiAxMwotCi0KLSNpZiBXSVJFTEVTU19FWFQgPiAxNworI2lmIERCRworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdXRoX25hbWVzW10gPSB7CisJIklXX0FVVEhfV1BBX1ZFUlNJT04iLAorCSJJV19BVVRIX0NJUEhFUl9QQUlSV0lTRSIsCisJIklXX0FVVEhfQ0lQSEVSX0dST1VQIiwKKwkiSVdfQVVUSF9LRVlfTUdNVCIsCisJIklXX0FVVEhfVEtJUF9DT1VOVEVSTUVBU1VSRVMiLAorCSJJV19BVVRIX0RST1BfVU5FTkNSWVBURUQiLAorCSJJV19BVVRIXzgwMjExX0FVVEhfQUxHIiwKKwkiSVdfQVVUSF9XUEFfRU5BQkxFRCIsCisJIklXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0wiLAorCSJJV19BVVRIX1JPQU1JTkdfQ09OVFJPTCIsCisJIklXX0FVVEhfUFJJVkFDWV9JTlZPS0VEIiwKKwkiSVdfQVVUSF9DSVBIRVJfR1JPVVBfTUdNVCIsCisJIklXX0FVVEhfTUZQIiwKKwkiVW5zdXBwb3J0ZWQiCit9OworI2VuZGlmCiAKIHN0YXRpYyBpbnQgd2lyZWxlc3Nfc2V0X2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKQEAgLTI4NjcsMTQgKzI5MTksMTUgQEAKIHsKIAlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQJCQkgICAgICByZXQ7Ci0JaW50CQkJICAgICAgaXdhX2lkeCA9IGRhdGEtPmZsYWdzICYgSVdfQVVUSF9JTkRFWDsKLQlpbnQJCQkgICAgICBpd2FfdmFsID0gZGF0YS0+dmFsdWU7CisJbHR2X3QgbHR2OworCWludCByZXQ7CisJaW50IGl3YV9pZHggPSBkYXRhLT5mbGFncyAmIElXX0FVVEhfSU5ERVg7CisJaW50IGl3YV92YWwgPSBkYXRhLT52YWx1ZTsKIAogCURCR19GVU5DKCAid2lyZWxlc3Nfc2V0X2F1dGgiICk7CiAJREJHX0VOVEVSKCBEYmdJbmZvICk7CiAKLQlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwlpZiAobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMjg4Myw4OSArMjkzNiwxMDIgQEAKIAogICAgIAl3bF9hY3RfaW50X29mZiggbHAgKTsKIAorCWlmIChpd2FfaWR4ID4gSVdfQVVUSF9NRlApCisJCWl3YV9pZHggPSBJV19BVVRIX01GUCArIDE7CisJREJHX1RSQUNFKERiZ0luZm8sICIlc1xuIiwgYXV0aF9uYW1lc1tpd2FfaWR4XSk7CiAJc3dpdGNoIChpd2FfaWR4KSB7Ci0JCWNhc2UgSVdfQVVUSF9XUEFfVkVSU0lPTjoKLQkJCURCR19UUkFDRSggRGJnSW5mbywgIklXX0FVVEhfV1BBX1ZFUlNJT05cbiIpOwotCQkJLyogV2UgZG8gc3VwcG9ydCBXUEEgb25seTsgaG93IHNob3VsZCBESVNBQkxFRCBiZSB0cmVhdGVkPyAqLwotCQkJaWYgKGl3YV92YWwgPT0gSVdfQVVUSF9XUEFfVkVSU0lPTl9XUEEpCi0JCQkJcmV0ID0gMDsKLQkJCWVsc2UKLQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJV19BVVRIX1dQQV9FTkFCTEVEOgotCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSVdfQVVUSF9XUEFfRU5BQkxFRDogdmFsID0gJWRcbiIsIGl3YV92YWwpOwotCQkJaWYgKGl3YV92YWwpCi0JCQkJbHAtPkVuYWJsZUVuY3J5cHRpb24gPSAyOwotCQkJZWxzZQotCQkJCWxwLT5FbmFibGVFbmNyeXB0aW9uID0gMDsKKwljYXNlIElXX0FVVEhfV1BBX1ZFUlNJT046CisJCS8qIFdlIGRvIHN1cHBvcnQgV1BBICovCisJCWlmICgoaXdhX3ZhbCA9PSBJV19BVVRIX1dQQV9WRVJTSU9OX1dQQSkgfHwKKwkJICAgIChpd2FfdmFsID09IElXX0FVVEhfV1BBX1ZFUlNJT05fRElTQUJMRUQpKQogCQkJcmV0ID0gMDsKLQkJCWJyZWFrOworCQllbHNlCisJCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKIAotCQljYXNlIElXX0FVVEhfVEtJUF9DT1VOVEVSTUVBU1VSRVM6Ci0JCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19BVVRIX1RLSVBfQ09VTlRFUk1FQVNVUkVTXG4iKTsKLQkJCWxwLT5kcml2ZXJFbmFibGUgPSAhaXdhX3ZhbDsKLQkJCWlmKGxwLT5kcml2ZXJFbmFibGUpCi0JCQkJaGNmX2NudGwoJihscC0+aGNmQ3R4KSwgSENGX0NOVExfRU5BQkxFIHwgSENGX1BPUlRfMCk7Ci0JCQllbHNlCi0JCQkJaGNmX2NudGwoJihscC0+aGNmQ3R4KSwgSENGX0NOVExfRElTQUJMRSB8IEhDRl9QT1JUXzApOworCWNhc2UgSVdfQVVUSF9XUEFfRU5BQkxFRDoKKwkJREJHX1RSQUNFKERiZ0luZm8sICJ2YWwgPSAlZFxuIiwgaXdhX3ZhbCk7CisJCWlmIChpd2FfdmFsKQorCQkJbHAtPkVuYWJsZUVuY3J5cHRpb24gPSAyOworCQllbHNlCisJCQlscC0+RW5hYmxlRW5jcnlwdGlvbiA9IDA7CisKKwkJLyogV3JpdGUgc3RyYWlnaHQgdG8gdGhlIGNhcmQgKi8KKwkJbHR2LmxlbiA9IDI7CisJCWx0di50eXAgPSBDRkdfQ05GX0VOQ1JZUFRJT047CisJCWx0di51LnUxNlswXSA9IGNwdV90b19sZTE2KGxwLT5FbmFibGVFbmNyeXB0aW9uKTsKKwkJcmV0ID0gaGNmX3B1dF9pbmZvKCZscC0+aGNmQ3R4LCAoTFRWUCkmbHR2KTsKKworCQlicmVhazsKKworCWNhc2UgSVdfQVVUSF9US0lQX0NPVU5URVJNRUFTVVJFUzoKKworCQkvKiBJbW1lZGlhdGVseSBkaXNhYmxlIGNhcmQgKi8KKwkJbHAtPmRyaXZlckVuYWJsZSA9ICFpd2FfdmFsOworCQlpZiAobHAtPmRyaXZlckVuYWJsZSkKKwkJCWhjZl9jbnRsKCYobHAtPmhjZkN0eCksIEhDRl9DTlRMX0VOQUJMRSB8IEhDRl9QT1JUXzApOworCQllbHNlCisJCQloY2ZfY250bCgmKGxwLT5oY2ZDdHgpLCBIQ0ZfQ05UTF9ESVNBQkxFIHwgSENGX1BPUlRfMCk7CisJCXJldCA9IDA7CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIX01GUDoKKwkJLyogTWFuYWdlbWVudCBGcmFtZSBQcm90ZWN0aW9uIG5vdCBzdXBwb3J0ZWQuCisJCSAqIE9ubHkgZmFpbCBpZiBzZXQgdG8gcmVxdWlyZWQuCisJCSAqLworCQlpZiAoaXdhX3ZhbCA9PSBJV19BVVRIX01GUF9SRVFVSVJFRCkKKwkJCXJldCA9IC1FSU5WQUw7CisJCWVsc2UKIAkJCXJldCA9IDA7Ci0JCQlicmVhazsKKwkJYnJlYWs7CiAKLQkJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6Ci0JCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19BVVRIX0RST1BfVU5FTkNSWVBURURcbiIpOwotCQkJLyogV2UgZG8gbm90IGFjdHVhbGx5IGRvIGFueXRoaW5nIGhlcmUsIGp1c3QgdG8gc2lsZW5jZQotCQkJICogd3BhX3N1cHBsaWNhbnQgKi8KLQkJCXJldCA9IDA7Ci0JCQlicmVhazsKKwljYXNlIElXX0FVVEhfS0VZX01HTVQ6CiAKLQkJY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKLQkJCURCR19UUkFDRSggRGJnSW5mbywgIklXX0FVVEhfQ0lQSEVSX1BBSVJXSVNFXG4iKTsKLQkJCS8qIG5vdCBpbXBsZW1lbnRlZCwgcmV0dXJuIGFuIGVycm9yICovCisJCS8qIFJlY29yZCByZXF1aXJlZCBtYW5hZ2VtZW50IHN1aXRlLgorCQkgKiBXaWxsIHRha2UgZWZmZWN0IG9uIG5leHQgY29tbWl0ICovCisJCWlmIChpd2FfdmFsICE9IDApCisJCQlscC0+QXV0aEtleU1nbXRTdWl0ZSA9IDQ7CisJCWVsc2UKKwkJCWxwLT5BdXRoS2V5TWdtdFN1aXRlID0gMDsKKworCQlyZXQgPSAtRUlOUFJPR1JFU1M7CisJCWJyZWFrOworCisJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgorCisJCS8qIEp1c3QgcmVjb3JkIHdoZXRoZXIgb3BlbiBvciBzaGFyZWQgaXMgcmVxdWlyZWQuCisJCSAqIFdpbGwgdGFrZSBlZmZlY3Qgb24gbmV4dCBjb21taXQgKi8KKwkJcmV0ID0gLUVJTlBST0dSRVNTOworCisJCWlmIChpd2FfdmFsICYgSVdfQVVUSF9BTEdfU0hBUkVEX0tFWSkKKwkJCWxwLT5hdXRoZW50aWNhdGlvbiA9IDE7CisJCWVsc2UgaWYgKGl3YV92YWwgJiBJV19BVVRIX0FMR19PUEVOX1NZU1RFTSkKKwkJCWxwLT5hdXRoZW50aWNhdGlvbiA9IDA7CisJCWVsc2UKIAkJCXJldCA9IC1FSU5WQUw7Ci0JCQlicmVhazsKKwkJYnJlYWs7CiAKLQkJY2FzZSBJV19BVVRIX0NJUEhFUl9HUk9VUDoKLQkJCURCR19UUkFDRSggRGJnSW5mbywgIklXX0FVVEhfQ0lQSEVSX0dST1VQXG4iKTsKLQkJCS8qIG5vdCBpbXBsZW1lbnRlZCwgcmV0dXJuIGFuIGVycm9yICovCi0JCQlyZXQgPSAtRUlOVkFMOwotCQkJYnJlYWs7CisJY2FzZSBJV19BVVRIX0RST1BfVU5FTkNSWVBURUQ6CisJCS8qIE9ubHkgbmVlZGVkIGZvciBBUCAqLworCQlscC0+RXhjbHVkZVVuZW5jcnlwdGVkID0gaXdhX3ZhbDsKKwkJcmV0ID0gLUVJTlBST0dSRVNTOworCQlicmVhazsKIAotCQljYXNlIElXX0FVVEhfS0VZX01HTVQ6Ci0JCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19BVVRIX0tFWV9NR01UXG4iKTsKLQkJCS8qIG5vdCBpbXBsZW1lbnRlZCwgcmV0dXJuIGFuIGVycm9yICovCi0JCQlyZXQgPSAtRUlOVkFMOwotCQkJYnJlYWs7CisJY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKKwljYXNlIElXX0FVVEhfQ0lQSEVSX0dST1VQOgorCWNhc2UgSVdfQVVUSF9SWF9VTkVOQ1JZUFRFRF9FQVBPTDoKKwljYXNlIElXX0FVVEhfUk9BTUlOR19DT05UUk9MOgorCWNhc2UgSVdfQVVUSF9QUklWQUNZX0lOVk9LRUQ6CisJCS8qIE5vdCB1c2VkLiBNYXkgbmVlZCB0byBkbyBzb21ldGhpbmcgd2l0aAorCQkgKiBDSVBIRVJfUEFJUldJU0UgYW5kIENJUEhFUl9HUk9VUCovCisJCXJldCA9IC1FSU5QUk9HUkVTUzsKKwkJYnJlYWs7CiAKLQkJY2FzZSBJV19BVVRIXzgwMjExX0FVVEhfQUxHOgotCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSVdfQVVUSF84MDIxMV9BVVRIX0FMR1xuIik7Ci0JCQkvKiBub3QgaW1wbGVtZW50ZWQsIHJldHVybiBhbiBlcnJvciAqLwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCi0JCWNhc2UgSVdfQVVUSF9SWF9VTkVOQ1JZUFRFRF9FQVBPTDoKLQkJCURCR19UUkFDRSggRGJnSW5mbywgIklXX0FVVEhfUlhfVU5FTkNSWVBURURfRUFQT0xcbiIpOwotCQkJLyogbm90IGltcGxlbWVudGVkLCByZXR1cm4gYW4gZXJyb3IgKi8KLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQotCQljYXNlIElXX0FVVEhfUk9BTUlOR19DT05UUk9MOgotCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSVdfQVVUSF9ST0FNSU5HX0NPTlRST0xcbiIpOwotCQkJLyogbm90IGltcGxlbWVudGVkLCByZXR1cm4gYW4gZXJyb3IgKi8KLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQotCQljYXNlIElXX0FVVEhfUFJJVkFDWV9JTlZPS0VEOgotCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSVdfQVVUSF9QUklWQUNZX0lOVk9LRURcbiIpOwotCQkJLyogbm90IGltcGxlbWVudGVkLCByZXR1cm4gYW4gZXJyb3IgKi8KLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiSVdfQVVUSF8/PyAoJWQpIHVua25vd25cbiIsIGl3YV9pZHgpOwotCQkJLyogcmV0dXJuIGFuIGVycm9yICovCi0JCQlyZXQgPSAtRUlOVkFMOwotCQkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREJHX1RSQUNFKERiZ0luZm8sICJJV19BVVRIXz8/ICglZCkgdW5rbm93blxuIiwgaXdhX2lkeCk7CisJCS8qIHJldHVybiBhbiBlcnJvciAqLworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJYnJlYWs7CiAJfQogCiAgICAgCXdsX2FjdF9pbnRfb24oIGxwICk7CkBAIC0yOTc5LDI4OSArMzA0NSwxNzUgQEAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKIAotCi1zdGF0aWMgaW50IGhlcm1lc19zZXRfa2V5KGx0dl90ICpsdHYsIGludCBhbGcsIGludCBrZXlfaWR4LCB1OCAqYWRkciwKLQkJCSAgaW50IHNldF90eCwgdTggKnNlcSwgdTggKmtleSwgc2l6ZV90IGtleV9sZW4pCitzdGF0aWMgdm9pZCBmbHVzaF90eChzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHApCiB7Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0JLy8gaW50ICAgY291bnQgPSAwOwotCWludCAgIGJ1Zl9pZHggPSAwOwotCWhjZl84IHRzY1tJV19FTkNPREVfU0VRX01BWF9TSVpFXSA9Ci0JCXsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCB9OwotCi0JREJHX0ZVTkMoICJoZXJtZXNfc2V0X2tleSIgKTsKLQlEQkdfRU5URVIoIERiZ0luZm8gKTsKKwlsdHZfdCBsdHY7CisJaW50IGNvdW50OwogCiAJLyoKLSAgICAgICAgICogQ2hlY2sgdGhlIGtleSBpbmRleCBoZXJlOyBpZiAwLCBsb2FkIGFzIFBhaXJ3aXNlIEtleSwgb3RoZXJ3aXNlLAotICAgICAgICAgKiBsb2FkIGFzIGEgZ3JvdXAga2V5LiBOb3RlIHRoYXQgZm9yIHRoZSBIZXJtZXMsIHRoZSBSSURzIGZvcgotICAgICAgICAgKiBncm91cC9wYXJpd2lzZSBrZXlzIGFyZSBkaWZmZXJlbnQgZnJvbSBlYWNoIG90aGVyIGFuZCBkaWZmZXJlbnQKLSAgICAgICAgICogdGhhbiB0aGUgZGVmYXVsdCBXRVAga2V5cyBhcyB3ZWxsLgotICAgICAgICAgKi8KLQlzd2l0Y2ggKGFsZykKLQl7CisJICogTWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgbm8gZGF0YSBxdWV1ZWQgdXAgaW4gdGhlIGZpcm13YXJlCisJICogYmVmb3JlIHNldHRpbmcgdGhlIFRLSVAga2V5cy4gSWYgdGhpcyBjaGVjayBpcyBub3QKKwkgKiBwZXJmb3JtZWQsIHNvbWUgZGF0YSBtYXkgYmUgc2VudCBvdXQgd2l0aCBpbmNvcnJlY3QgTUlDCisJICogYW5kIGNhdXNlIHN5bmNocm9uaXphcmlvbiBlcnJvcnMgd2l0aCB0aGUgQVAKKwkgKi8KKwkvKiBDaGVjayBldmVyeSAxbXMgZm9yIDEwMG1zICovCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMTAwOyBjb3VudCsrKSB7CisJCXVkZWxheSgxMDAwKTsKKworCQlsdHYubGVuID0gMjsKKwkJbHR2LnR5cCA9IDB4RkQ5MTsgIC8qIFRoaXMgUklEIG5vdCBkZWZpbmVkIGluIEhDRiB5ZXQhISEgKi8KKwkJbHR2LnUudTE2WzBdID0gMDsKKworCQloY2ZfZ2V0X2luZm8oJihscC0+aGNmQ3R4KSwgKExUVlApJmx0dik7CisKKwkJaWYgKGx0di51LnUxNlswXSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGNvdW50ID49IDEwMCkKKwkJREJHX1RSQUNFKERiZ0luZm8sICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgVHhRIGZsdXNoIVxuIik7CisKK30KKworc3RhdGljIGludCB3aXJlbGVzc19zZXRfZW5jb2RlZXh0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgc3RydWN0IGl3X3BvaW50ICplcnEsIGNoYXIgKmtleWJ1ZikKK3sKKwlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCWludCBrZXlfaWR4ID0gKGVycS0+ZmxhZ3MgJiBJV19FTkNPREVfSU5ERVgpIC0gMTsKKwlsdHZfdCBsdHY7CisJc3RydWN0IGl3X2VuY29kZV9leHQgKmV4dCA9IChzdHJ1Y3QgaXdfZW5jb2RlX2V4dCAqKWtleWJ1ZjsKKwlib29sIGVuYWJsZSA9IHRydWU7CisJYm9vbCBzZXRfdHggPSBmYWxzZTsKKworCURCR19FTlRFUihEYmdJbmZvKTsKKworCWlmIChscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZXJxLT5mbGFncyAmIElXX0VOQ09ERV9ESVNBQkxFRCkgeworCQlleHQtPmFsZyA9IElXX0VOQ09ERV9BTEdfTk9ORTsKKwkJZW5hYmxlID0gZmFsc2U7CisJfQorCisJaWYgKGV4dC0+ZXh0X2ZsYWdzICYgSVdfRU5DT0RFX0VYVF9TRVRfVFhfS0VZKQorCQlzZXRfdHggPSB0cnVlOworCisJd2xfbG9jayhscCwgJmZsYWdzKTsKKworCXdsX2FjdF9pbnRfb2ZmKGxwKTsKKworCW1lbXNldCgmbHR2LCAwLCBzaXplb2YobHR2KSk7CisKKwlzd2l0Y2ggKGV4dC0+YWxnKSB7CiAJY2FzZSBJV19FTkNPREVfQUxHX1RLSVA6Ci0JCURCR19UUkFDRSggRGJnSW5mbywgIklXX0VOQ09ERV9BTEdfVEtJUDoga2V5KCVkKVxuIiwga2V5X2lkeCk7Ci0jaWYgMAotCQkvKgotICAgICAgICAgICAgICAgICAqIE1ha2Ugc3VyZSB0aGF0IHRoZXJlIGlzIG5vIGRhdGEgcXVldWVkIHVwIGluIHRoZSBmaXJtd2FyZQotICAgICAgICAgICAgICAgICAqIGJlZm9yZSBzZXR0aW5nIHRoZSBUS0lQIGtleXMuIElmIHRoaXMgY2hlY2sgaXMgbm90Ci0gICAgICAgICAgICAgICAgICogcGVyZm9ybWVkLCBzb21lIGRhdGEgbWF5IGJlIHNlbnQgb3V0IHdpdGggaW5jb3JyZWN0IE1JQwotICAgICAgICAgICAgICAgICAqIGFuZCBjYXVzZSBzeW5jaHJvbml6YXJpb24gZXJyb3JzIHdpdGggdGhlIEFQCi0gICAgICAgICAgICAgICAgICovCi0JCS8qIENoZWNrIGV2ZXJ5IDFtcyBmb3IgMTAwbXMgKi8KLQkJZm9yKCBjb3VudCA9IDA7IGNvdW50IDwgMTAwOyBjb3VudCsrICkKLQkJewotCQkJdXNsZWVwKCAxMDAwICk7CisJCURCR19UUkFDRShEYmdJbmZvLCAiSVdfRU5DT0RFX0FMR19US0lQOiBrZXkoJWQpXG4iLCBrZXlfaWR4KTsKIAotCQkJbHR2LmxlbiA9IDI7Ci0JCQlsdHYudHlwID0gMHhGRDkxOyAgLy8gVGhpcyBSSUQgbm90IGRlZmluZWQgaW4gSENGIHlldCEhIQotCQkJbHR2LnUudTE2WzBdID0gMDsKLQotCQkJd2xfZ2V0X2luZm8oIHNvY2ssICZsdHYsIGlmbmFtZSApOwotCi0JCQlpZiggbHR2LnUudTE2WzBdID09IDAgKQotCQkJewotCQkJCWJyZWFrOwotCQkJfQorCQlpZiAoc2l6ZW9mKGV4dC0+cnhfc2VxKSAhPSA4KSB7CisJCQlEQkdfVFJBQ0UoRGJnSW5mbywgInJ4X3NlcSBzaXplIG1pc21hdGNoXG4iKTsKKwkJCURCR19MRUFWRShEYmdJbmZvKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF91bmxvY2s7CiAJCX0KIAotCQlpZiggY291bnQgPT0gMTAwICkKLQkJewotCQkJd3BhX3ByaW50ZiggTVNHX0RFQlVHLCAiVGltZWQgb3V0IHdhaXRpbmcgZm9yIFR4USEiICk7Ci0JCX0KLSNlbmRpZgorCQlyZXQgPSBoZXJtZXNfc2V0X3RraXBfa2V5cygmbHR2LCBrZXlfaWR4LCBleHQtPmFkZHIuc2FfZGF0YSwKKwkJCQkJICAgc2V0X3R4LAorCQkJCQkgICBleHQtPnJ4X3NlcSwgZXh0LT5rZXksIGV4dC0+a2V5X2xlbik7CiAKLQkJc3dpdGNoIChrZXlfaWR4KSB7Ci0JCWNhc2UgMDoKLQkJCWx0di0+bGVuID0gMjg7Ci0JCQlsdHYtPnR5cCA9IENGR19BRERfVEtJUF9NQVBQRURfS0VZOwotCi0JCQkvKiBMb2FkIHRoZSBCU1NJRCAqLwotCQkJbWVtY3B5KCZsdHYtPnUudThbYnVmX2lkeF0sIGFkZHIsIEVUSF9BTEVOKTsKLQkJCWJ1Zl9pZHggKz0gRVRIX0FMRU47Ci0KLQkJCS8qIExvYWQgdGhlIFRLSVAga2V5ICovCi0JCQltZW1jcHkoJmx0di0+dS51OFtidWZfaWR4XSwgJmtleVswXSwgMTYpOwotCQkJYnVmX2lkeCArPSAxNjsKLQotCQkJLyogTG9hZCB0aGUgVFNDICovCi0JCQltZW1jcHkoJmx0di0+dS51OFtidWZfaWR4XSwgdHNjLCBJV19FTkNPREVfU0VRX01BWF9TSVpFKTsKLQkJCWJ1Zl9pZHggKz0gSVdfRU5DT0RFX1NFUV9NQVhfU0laRTsKLQotCQkJLyogTG9hZCB0aGUgUlNDICovCi0JCQltZW1jcHkoJmx0di0+dS51OFtidWZfaWR4XSwgc2VxLCBJV19FTkNPREVfU0VRX01BWF9TSVpFKTsKLQkJCWJ1Zl9pZHggKz0gSVdfRU5DT0RFX1NFUV9NQVhfU0laRTsKLQotCQkJLyogTG9hZCB0aGUgVHhNSUMga2V5ICovCi0JCQltZW1jcHkoJmx0di0+dS51OFtidWZfaWR4XSwgJmtleVsxNl0sIDgpOwotCQkJYnVmX2lkeCArPSA4OwotCi0JCQkvKiBMb2FkIHRoZSBSeE1JQyBrZXkgKi8KLQkJCW1lbWNweSgmbHR2LT51LnU4W2J1Zl9pZHhdLCAma2V5WzI0XSwgOCk7Ci0KLQkJCXJldCA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQljYXNlIDI6Ci0JCWNhc2UgMzoKLQkJCWx0di0+bGVuID0gMjY7Ci0JCQlsdHYtPnR5cCA9IENGR19BRERfVEtJUF9ERUZBVUxUX0tFWTsKLQotCQkJLyogTG9hZCB0aGUga2V5IEluZGV4ICovCi0JCQlsdHYtPnUudTE2W2J1Zl9pZHhdID0ga2V5X2lkeDsKLQkJCS8qIElmIHRoaXMgaXMgYSBUeCBLZXksIHNldCBiaXQgODAwMCAqLwotCQkJaWYoc2V0X3R4KQotCQkJCWx0di0+dS51MTZbYnVmX2lkeF0gfD0gMHg4MDAwOwotCQkJYnVmX2lkeCArPSAyOwotCi0JCQkvKiBMb2FkIHRoZSBSU0MgKi8KLQkJCW1lbWNweSgmbHR2LT51LnU4W2J1Zl9pZHhdLCBzZXEsIElXX0VOQ09ERV9TRVFfTUFYX1NJWkUpOwotCQkJYnVmX2lkeCArPSBJV19FTkNPREVfU0VRX01BWF9TSVpFOwotCi0JCQkvKiBMb2FkIHRoZSBUS0lQLCBUeE1JQywgYW5kIFJ4TUlDIGtleXMgaW4gb25lIHNob3QsIGJlY2F1c2UgaW4KLQkJCSAgIENGR19BRERfVEtJUF9ERUZBVUxUX0tFWSB0aGV5IGFyZSBiYWNrLXRvLWJhY2sgKi8KLQkJCW1lbWNweSgmbHR2LT51LnU4W2J1Zl9pZHhdLCBrZXksIGtleV9sZW4pOwotCQkJYnVmX2lkeCArPSBrZXlfbGVuOwotCi0JCQkvKiBMb2FkIHRoZSBUU0MgKi8KLQkJCW1lbWNweSgmbHR2LT51LnU4W2J1Zl9pZHhdLCB0c2MsIElXX0VOQ09ERV9TRVFfTUFYX1NJWkUpOwotCi0JCQlsdHYtPnUudTE2WzBdID0gQ05WX0lOVF9UT19MSVRUTEUobHR2LT51LnUxNlswXSk7Ci0KLQkJCXJldCA9IDA7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOworCQlpZiAocmV0ICE9IDApIHsKKwkJCURCR19UUkFDRShEYmdJbmZvLCAiaGVybWVzX3NldF90a2lwX2tleXMgcmV0dXJuZWQgIT0gMCwga2V5IG5vdCBzZXRcbiIpOworCQkJZ290byBvdXRfdW5sb2NrOwogCQl9CiAKKwkJZmx1c2hfdHgobHApOworCisJCWxwLT53ZXh0X2VuYyA9IElXX0VOQ09ERV9BTEdfVEtJUDsKKworCQkvKiBXcml0ZSB0aGUga2V5ICovCisJCXJldCA9IGhjZl9wdXRfaW5mbygmKGxwLT5oY2ZDdHgpLCAoTFRWUCkmbHR2KTsKIAkJYnJlYWs7CiAKIAljYXNlIElXX0VOQ09ERV9BTEdfV0VQOgotCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19FTkNPREVfQUxHX1dFUDoga2V5KCVkKVxuIiwga2V5X2lkeCk7CisJCURCR19UUkFDRShEYmdJbmZvLCAiSVdfRU5DT0RFX0FMR19XRVA6IGtleSglZClcbiIsIGtleV9pZHgpOworCisJCWlmIChlcnEtPmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpIHsKKwkJCURCR19XQVJOSU5HKERiZ0luZm8sICJJV19FTkNPREVfUkVTVFJJQ1RFRCBpbnZhbGlkXG4iKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKworCQlyZXQgPSBoZXJtZXNfc2V0X3dlcF9rZXlzKGxwLCBrZXlfaWR4LCBleHQtPmtleSwgZXh0LT5rZXlfbGVuLAorCQkJCQkgIGVuYWJsZSwgc2V0X3R4KTsKKwogCQlicmVhazsKIAogCWNhc2UgSVdfRU5DT0RFX0FMR19DQ01QOgotCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19FTkNPREVfQUxHX0NDTVA6IGtleSglZClcbiIsIGtleV9pZHgpOworCQlEQkdfVFJBQ0UoRGJnSW5mbywgIklXX0VOQ09ERV9BTEdfQ0NNUDoga2V5KCVkKVxuIiwga2V5X2lkeCk7CisJCXJldCA9IC1FT1BOT1RTVVBQOwogCQlicmVhazsKIAogCWNhc2UgSVdfRU5DT0RFX0FMR19OT05FOgotCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19FTkNPREVfQUxHX05PTkU6IGtleSglZClcbiIsIGtleV9pZHgpOwotCQlzd2l0Y2ggKGtleV9pZHgpIHsKLQkJY2FzZSAwOgotCQkJaWYgKG1lbWNtcChhZGRyLCAiXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIiwgRVRIX0FMRU4pICE9IDApIHsKLQkJCS8vaWYgKGFkZHIgIT0gTlVMTCkgewotCQkJCWx0di0+bGVuID0gNzsKLQkJCQlsdHYtPnR5cCA9IENGR19SRU1PVkVfVEtJUF9NQVBQRURfS0VZOwotCQkJCW1lbWNweSgmbHR2LT51LnU4WzBdLCBhZGRyLCBFVEhfQUxFTik7Ci0JCQkJcmV0ID0gMDsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCWNhc2UgMjoKLQkJY2FzZSAzOgotCQkJLyogQ2xlYXIgdGhlIEdyb3VwIFRLSVAga2V5cyBieSBpbmRleCAqLwotCQkJbHR2LT5sZW4gPSAyOwotCQkJbHR2LT50eXAgPSBDRkdfUkVNT1ZFX1RLSVBfREVGQVVMVF9LRVk7Ci0JCQlsdHYtPnUudTE2WzBdID0ga2V5X2lkeDsKKwkJREJHX1RSQUNFKERiZ0luZm8sICJJV19FTkNPREVfQUxHX05PTkU6IGtleSglZClcbiIsIGtleV9pZHgpOwogCisJCWlmIChscC0+d2V4dF9lbmMgPT0gSVdfRU5DT0RFX0FMR19US0lQKSB7CisJCQlyZXQgPSBoZXJtZXNfY2xlYXJfdGtpcF9rZXlzKCZsdHYsIGtleV9pZHgsCisJCQkJCQkgICAgIGV4dC0+YWRkci5zYV9kYXRhKTsKKwkJCWZsdXNoX3R4KGxwKTsKKwkJCWxwLT53ZXh0X2VuYyA9IElXX0VOQ09ERV9BTEdfTk9ORTsKKwkJCXJldCA9IGhjZl9wdXRfaW5mbygmKGxwLT5oY2ZDdHgpLCAoTFRWUCkmbHR2KTsKKworCQl9IGVsc2UgaWYgKGxwLT53ZXh0X2VuYyA9PSBJV19FTkNPREVfQUxHX1dFUCkgeworCQkJcmV0ID0gaGVybWVzX3NldF93ZXBfa2V5cyhscCwga2V5X2lkeCwKKwkJCQkJCSAgZXh0LT5rZXksIGV4dC0+a2V5X2xlbiwKKwkJCQkJCSAgZmFsc2UsIGZhbHNlKTsKKwkJfSBlbHNlIHsKIAkJCXJldCA9IDA7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwogCQl9CisKIAkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlEQkdfVFJBQ0UoIERiZ0luZm8sICJJV19FTkNPREVfPz86IGtleSglZClcbiIsIGtleV9pZHgpOworCQlyZXQgPSAtRU9QTk9UU1VQUDsKIAkJYnJlYWs7CiAJfQogCi0JREJHX0xFQVZFKCBEYmdJbmZvICk7Ci0JcmV0dXJuIHJldDsKLX0gLy8gaGVybWVzX3NldF9rZXkKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLQotCi1zdGF0aWMgaW50IHdpcmVsZXNzX3NldF9lbmNvZGVleHQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJCXN0cnVjdCBpd19wb2ludCAqZXJxLCBjaGFyICprZXlidWYpCi17Ci0Jc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50CQkJICAgICAgcmV0OwotCWludCBrZXlfaWR4ID0gKGVycS0+ZmxhZ3MmSVdfRU5DT0RFX0lOREVYKSAtIDE7Ci0JbHR2X3QgbHR2OwotCXN0cnVjdCBpd19lbmNvZGVfZXh0ICpleHQgPSAoc3RydWN0IGl3X2VuY29kZV9leHQgKilrZXlidWY7Ci0KLQlEQkdfRlVOQyggIndpcmVsZXNzX3NldF9lbmNvZGVleHQiICk7Ci0JREJHX0VOVEVSKCBEYmdJbmZvICk7Ci0KLQlpZihscC0+cG9ydFN0YXRlID09IFdWTEFOX1BPUlRfU1RBVEVfRElTQUJMRUQpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoc2l6ZW9mKGV4dC0+cnhfc2VxKSAhPSA4KSB7Ci0JCURCR19UUkFDRShEYmdJbmZvLCAicnpfc2VxIHNpemUgbWlzbWF0Y2hcbiIpOwotCQlEQkdfTEVBVkUoRGJnSW5mbyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCS8qIEhhbmRsZSBXRVAga2V5cyB2aWEgdGhlIG9sZCBzZXQgZW5jb2RlIHByb2NlZHVyZSAqLwotCWlmKGV4dC0+YWxnID09IElXX0VOQ09ERV9BTEdfV0VQKSB7Ci0JCXN0cnVjdCBpd19wb2ludCAgd2VwX2VycTsKLQkJY2hhciAgICAgICAgICAgICp3ZXBfa2V5YnVmOwotCi0JCS8qIEJ1aWxkIHJlcXVlc3Qgc3RydWN0dXJlICovCi0JCXdlcF9lcnEuZmxhZ3MgID0gZXJxLT5mbGFnczsgICAvLyB0YWtlIG92ZXIgZmxhZ3Mgd2l0aCBrZXkgaW5kZXgKLQkJd2VwX2VycS5sZW5ndGggPSBleHQtPmtleV9sZW47IC8vIHRha2UgbGVuZ3RoIGZyb20gZXh0ZW5kZWQga2V5IGluZm8KLQkJd2VwX2tleWJ1ZiAgICAgPSBleHQtPmtleTsgICAgIC8vIHBvaW50ZXIgdG8gdGhlIGtleSB0ZXh0Ci0KLQkJLyogQ2FsbCB3aXJlbGVzc19zZXRfZW5jb2RlIHRvdCBoYW5kbGUgdGhlIFdFUCBrZXkgKi8KLQkJcmV0ID0gd2lyZWxlc3Nfc2V0X2VuY29kZShkZXYsIGluZm8sICZ3ZXBfZXJxLCB3ZXBfa2V5YnVmKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyogUHJvY2VlZCBmb3IgZXh0ZW5kZWQgZW5jb2RlIGZ1bmN0aW9ucyBmb3IgV0FQIGFuZCBOT05FICovCi0Jd2xfbG9jayggbHAsICZmbGFncyApOwotCi0gICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOwotCi0JbWVtc2V0KCZsdHYsIDAsIHNpemVvZihsdHYpKTsKLQlyZXQgPSBoZXJtZXNfc2V0X2tleSgmbHR2LCBleHQtPmFsZywga2V5X2lkeCwgZXh0LT5hZGRyLnNhX2RhdGEsCi0JCQkJZXh0LT5leHRfZmxhZ3MgJiBJV19FTkNPREVfRVhUX1NFVF9UWF9LRVksCi0JCQkJZXh0LT5yeF9zZXEsIGV4dC0+a2V5LCBleHQtPmtleV9sZW4pOwotCi0JaWYgKHJldCAhPSAwKSB7Ci0JCURCR19UUkFDRSggRGJnSW5mbywgImhlcm1lc19zZXRfa2V5IHJldHVybmVkICE9IDAsIGtleSBub3Qgc2V0XG4iKTsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0KLQotCS8qIFB1dCB0aGUga2V5IGluIEhDRiAqLwotCXJldCA9IGhjZl9wdXRfaW5mbygmKGxwLT5oY2ZDdHgpLCAoTFRWUCkmbHR2KTsKLQogb3V0X3VubG9jazoKLQlpZihyZXQgPT0gSENGX1NVQ0NFU1MpIHsKLQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiUHV0IGtleSBpbmZvIHN1Y2Nlc1xuIik7Ci0JfSBlbHNlIHsKLQkJREJHX1RSQUNFKCBEYmdJbmZvLCAiUHV0IGtleSBpbmZvIGZhaWxlZCwga2V5IG5vdCBzZXRcbiIpOwotCX0KIAotICAgIAl3bF9hY3RfaW50X29uKCBscCApOworCXdsX2FjdF9pbnRfb24obHApOwogCiAJd2xfdW5sb2NrKGxwLCAmZmxhZ3MpOwogCiBvdXQ6Ci0JREJHX0xFQVZFKCBEYmdJbmZvICk7Ci0JcmV0dXJuIHJldDsKLX0gLy8gd2lyZWxlc3Nfc2V0X2VuY29kZWV4dAotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotCi0KLXN0YXRpYyBpbnQgd2lyZWxlc3NfZ2V0X2dlbmllKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCSAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCi0JCQkJCSAgIHN0cnVjdCBpd19wb2ludCAqZGF0YSwgY2hhciAqZXh0cmEpCi0KLXsKLQlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgICByZXQgPSAwOwotCWx0dl90IGx0djsKLQotCURCR19GVU5DKCAid2lyZWxlc3NfZ2V0X2dlbmllIiApOwotCURCR19FTlRFUiggRGJnSW5mbyApOwotCi0JaWYobHAtPnBvcnRTdGF0ZSA9PSBXVkxBTl9QT1JUX1NUQVRFX0RJU0FCTEVEKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQotCi0Jd2xfbG9jayggbHAsICZmbGFncyApOwotCi0gICAgCXdsX2FjdF9pbnRfb2ZmKCBscCApOwotCi0JbWVtc2V0KCZsdHYsIDAsIHNpemVvZihsdHYpKTsKLQlsdHYubGVuID0gMjsKLQlsdHYudHlwID0gQ0ZHX1NFVF9XUEFfQVVUSF9LRVlfTUdNVF9TVUlURTsKLQlscC0+QXV0aEtleU1nbXRTdWl0ZSA9IGx0di51LnUxNlswXSA9IDQ7Ci0JbHR2LnUudTE2WzBdICA9IENOVl9JTlRfVE9fTElUVExFKGx0di51LnUxNlswXSk7Ci0KLQlyZXQgPSBoY2ZfcHV0X2luZm8oJihscC0+aGNmQ3R4KSwgKExUVlApJmx0dik7Ci0KLSAgICAJd2xfYWN0X2ludF9vbiggbHAgKTsKLQotCXdsX3VubG9jayhscCwgJmZsYWdzKTsKLQotb3V0OgotCURCR19MRUFWRSggRGJnSW5mbyApOworCURCR19MRUFWRShEYmdJbmZvKTsKIAlyZXR1cm4gcmV0OwogfQogLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAogCi0jZW5kaWYgLy8gV0lSRUxFU1NfRVhUID4gMTcKKworc3RhdGljIGludCB3aXJlbGVzc19zZXRfZ2VuaWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCisJCQkgICAgICBzdHJ1Y3QgaXdfcG9pbnQgKmRhdGEsIGNoYXIgKmV4dHJhKQorCit7CisJaW50ICAgcmV0ID0gMDsKKworCURCR19FTlRFUihEYmdJbmZvKTsKKworCS8qIFdlIGNhbid0IHdyaXRlIHRoaXMgdG8gdGhlIGNhcmQsIGJ1dCBhcHBhcmVudGx5IHRoaXMKKwkgKiBvcGVyYXRpb24gbmVlZHMgdG8gc3VjY2VlZCAqLworCXJldCA9IDA7CisKKwlEQkdfTEVBVkUoRGJnSW5mbyk7CisJcmV0dXJuIHJldDsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCXdsX3dpcmVsZXNzX3N0YXRzKCkKQEAgLTMzMTYsNyArMzI2OCw2IEBACiAJCWlmKCBzdGF0dXMgPT0gSENGX1NVQ0NFU1MgKSB7CiAJCQlwUXVhbCA9IChDRkdfQ09NTVNfUVVBTElUWV9TVFJDVCAqKSYoIGxwLT5sdHZSZWNvcmQgKTsKIAotI2lmZGVmIFVTRV9EQk0KIAkJCXBTdGF0cy0+cXVhbC5xdWFsICA9ICh1X2NoYXIpIENOVl9MSVRUTEVfVE9fSU5UKCBwUXVhbC0+Y29tc19xdWFsICk7CiAJCQlwU3RhdHMtPnF1YWwubGV2ZWwgPSAodV9jaGFyKSBkYm0oIENOVl9MSVRUTEVfVE9fSU5UKCBwUXVhbC0+c2lnbmFsX2x2bCApKTsKIAkJCXBTdGF0cy0+cXVhbC5ub2lzZSA9ICh1X2NoYXIpIGRibSggQ05WX0xJVFRMRV9UT19JTlQoIHBRdWFsLT5ub2lzZV9sdmwgKSk7CkBAIC0zMzI1LDIzICszMjc2LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJV19RVUFMX0xFVkVMX1VQREFURUQgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElXX1FVQUxfTk9JU0VfVVBEQVRFRCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVdfUVVBTF9EQk0pOwotI2Vsc2UKLQkJCXBTdGF0cy0+cXVhbC5xdWFsID0gcGVyY2VudCggQ05WX0xJVFRMRV9UT19JTlQoIHBRdWFsLT5jb21zX3F1YWwgKSwKLQkJCQkJCSAgICAgSENGX01JTl9DT01NX1FVQUxJVFksCi0JCQkJCQkgICAgIEhDRl9NQVhfQ09NTV9RVUFMSVRZICk7Ci0KLQkJCXBTdGF0cy0+cXVhbC5sZXZlbCA9IHBlcmNlbnQoIENOVl9MSVRUTEVfVE9fSU5UKCBwUXVhbC0+c2lnbmFsX2x2bCApLAotCQkJCQkJICAgICAgSENGX01JTl9TSUdOQUxfTEVWRUwsCi0JCQkJCQkgICAgICBIQ0ZfTUFYX1NJR05BTF9MRVZFTCApOwotCi0JCQlwU3RhdHMtPnF1YWwubm9pc2UgPSBwZXJjZW50KCBDTlZfTElUVExFX1RPX0lOVCggcFF1YWwtPm5vaXNlX2x2bCApLAotCQkJCQkJICAgICAgSENGX01JTl9OT0lTRV9MRVZFTCwKLQkJCQkJCSAgICAgIEhDRl9NQVhfTk9JU0VfTEVWRUwgKTsKLQotCQkJcFN0YXRzLT5xdWFsLnVwZGF0ZWQgfD0gKElXX1FVQUxfUVVBTF9VUERBVEVEICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVdfUVVBTF9MRVZFTF9VUERBVEVEIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJV19RVUFMX05PSVNFX1VQREFURUQpOwotI2VuZGlmIC8qIFVTRV9EQk0gKi8KIAkJfSBlbHNlIHsKIAkJCW1lbXNldCggJiggcFN0YXRzLT5xdWFsICksIDAsIHNpemVvZiggcFN0YXRzLT5xdWFsICkpOwogCQl9CkBAIC0zNTEyLDcgKzM0NDYsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgd2xfd2V4dF9ldmVudF9mcmVxKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKIHsKLSNpZiBXSVJFTEVTU19FWFQgPiAxMwogCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKIAlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CiAJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMzUyNCw3ICszNDU3LDYgQEAKIAl3cnF1LmZyZXEuZSA9IDA7CiAKIAl3aXJlbGVzc19zZW5kX2V2ZW50KCBkZXYsIFNJT0NTSVdGUkVRLCAmd3JxdSwgTlVMTCApOwotI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEzICovCiAKIAlyZXR1cm47CiB9IC8vIHdsX3dleHRfZXZlbnRfZnJlcQpAQCAtMzU1NCw3ICszNDg2LDYgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB2b2lkIHdsX3dleHRfZXZlbnRfbW9kZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCiB7Ci0jaWYgV0lSRUxFU1NfRVhUID4gMTMKIAl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CiAJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOwogCS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTM1NjksNyArMzUwMCw2IEBACiAJfQogCiAJd2lyZWxlc3Nfc2VuZF9ldmVudCggZGV2LCBTSU9DU0lXTU9ERSwgJndycXUsIE5VTEwgKTsKLSNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxMyAqLwogCiAJcmV0dXJuOwogfSAvLyB3bF93ZXh0X2V2ZW50X21vZGUKQEAgLTM1OTksNyArMzUyOSw2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCB3bF93ZXh0X2V2ZW50X2Vzc2lkKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKIHsKLSNpZiBXSVJFTEVTU19FWFQgPiAxMwogCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKIAlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CiAJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtMzYxNiw3ICszNTQ1LDYgQEAKIAl3cnF1LmVzc2lkLmZsYWdzICAgPSAxOwogCiAJd2lyZWxlc3Nfc2VuZF9ldmVudCggZGV2LCBTSU9DU0lXRVNTSUQsICZ3cnF1LCBscC0+TmV0d29ya05hbWUgKTsKLSNlbmRpZiAvKiBXSVJFTEVTU19FWFQgPiAxMyAqLwogCiAJcmV0dXJuOwogfSAvLyB3bF93ZXh0X2V2ZW50X2Vzc2lkCkBAIC0zNjQ2LDcgKzM1NzQsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgd2xfd2V4dF9ldmVudF9lbmNvZGUoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQogewotI2lmIFdJUkVMRVNTX0VYVCA+IDEzCiAJdW5pb24gaXdyZXFfZGF0YSB3cnF1OwogCXN0cnVjdCB3bF9wcml2YXRlICpscCA9IHdsX3ByaXYoZGV2KTsKIAlpbnQgaW5kZXggPSAwOwpAQCAtMzY4OCw3ICszNjE1LDYgQEAKIAogCXdpcmVsZXNzX3NlbmRfZXZlbnQoIGRldiwgU0lPQ1NJV0VOQ09ERSwgJndycXUsCiAJCQkJCQkgbHAtPkRlZmF1bHRLZXlzLmtleVtpbmRleF0ua2V5ICk7Ci0jZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTMgKi8KIAogCXJldHVybjsKIH0gLy8gd2xfd2V4dF9ldmVudF9lbmNvZGUKQEAgLTM3MTgsNyArMzY0NCw2IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdm9pZCB3bF93ZXh0X2V2ZW50X2FwKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKIHsKLSNpZiBXSVJFTEVTU19FWFQgPiAxMwogCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKIAlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CiAJaW50IHN0YXR1czsKQEAgLTM3NDcsOCArMzY3Miw2IEBACiAJCXdpcmVsZXNzX3NlbmRfZXZlbnQoIGRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCApOwogCX0KIAotI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDEzICovCi0KIAlyZXR1cm47CiB9IC8vIHdsX3dleHRfZXZlbnRfYXAKIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCkBAIC0zNzc2LDcgKzM2OTksNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgd2xfd2V4dF9ldmVudF9zY2FuX2NvbXBsZXRlKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKIHsKLSNpZiBXSVJFTEVTU19FWFQgPiAxMwogCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKIAkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTM3ODUsNyArMzcwNyw2IEBACiAKIAl3cnF1LmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwogCXdpcmVsZXNzX3NlbmRfZXZlbnQoIGRldiwgU0lPQ0dJV1NDQU4sICZ3cnF1LCBOVUxMICk7Ci0jZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTMgKi8KIAogCXJldHVybjsKIH0gLy8gd2xfd2V4dF9ldmVudF9zY2FuX2NvbXBsZXRlCkBAIC0zODE1LDcgKzM3MzYsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgd2xfd2V4dF9ldmVudF9uZXdfc3RhKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKIHsKLSNpZiBXSVJFTEVTU19FWFQgPiAxNAogCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKIAkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKQEAgLTM4MjYsNyArMzc0Niw2IEBACiAJbWVtY3B5KCB3cnF1LmFkZHIuc2FfZGF0YSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4gKTsKIAl3cnF1LmFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwogCXdpcmVsZXNzX3NlbmRfZXZlbnQoIGRldiwgSVdFVlJFR0lTVEVSRUQsICZ3cnF1LCBOVUxMICk7Ci0jZW5kaWYgLyogV0lSRUxFU1NfRVhUID4gMTQgKi8KIAogCXJldHVybjsKIH0gLy8gd2xfd2V4dF9ldmVudF9uZXdfc3RhCkBAIC0zODU2LDcgKzM3NzUsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgd2xfd2V4dF9ldmVudF9leHBpcmVkX3N0YSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCiB7Ci0jaWYgV0lSRUxFU1NfRVhUID4gMTQKIAl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CiAJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC0zODY2LDcgKzM3ODQsNiBAQAogCW1lbWNweSggd3JxdS5hZGRyLnNhX2RhdGEsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOICk7CiAJd3JxdS5hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKIAl3aXJlbGVzc19zZW5kX2V2ZW50KCBkZXYsIElXRVZFWFBJUkVELCAmd3JxdSwgTlVMTCApOwotI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDE0ICovCiAKIAlyZXR1cm47CiB9IC8vIHdsX3dleHRfZXZlbnRfZXhwaXJlZF9zdGEKQEAgLTM4OTUsMTAgKzM4MTIsOSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgd2xfd2V4dF9ldmVudF9taWNfZmFpbGVkKCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ICkKIHsKLSNpZiBXSVJFTEVTU19FWFQgPiAxNAotCWNoYXIgICAgICAgICAgICAgICBtc2dbNTEyXTsKIAl1bmlvbiBpd3JlcV9kYXRhICAgd3JxdTsKIAlzdHJ1Y3Qgd2xfcHJpdmF0ZSAqbHAgPSB3bF9wcml2KGRldik7CisJc3RydWN0IGl3X21pY2hhZWxtaWNmYWlsdXJlIHd4bWljOwogCWludCAgICAgICAgICAgICAgICBrZXlfaWR4OwogCWNoYXIgICAgICAgICAgICAgICphZGRyMTsKIAljaGFyICAgICAgICAgICAgICAqYWRkcjI7CkBAIC0zOTIwLDMxICszODM2LDE3IEBACiAJREJHX1BSSU5UKCAiTUlDIEZBSUwgLSBLRVkgVVNFRCA6ICVkLCBTVEFUVVMgOiAweCUwNHhcbiIsIGtleV9pZHgsCiAJCQkgICBoZHItPnN0YXR1cyApOwogCi0JbWVtc2V0KCAmd3JxdSwgMCwgc2l6ZW9mKCB3cnF1ICkpOwotCW1lbXNldCggbXNnLCAwLCBzaXplb2YoIG1zZyApKTsKKwltZW1zZXQoJndycXUsIDAsIHNpemVvZih3cnF1KSk7CisJbWVtc2V0KCZ3eG1pYywgMCwgc2l6ZW9mKHd4bWljKSk7CiAKKwl3eG1pYy5mbGFncyA9IGtleV9pZHggJiBJV19NSUNGQUlMVVJFX0tFWV9JRDsKKwl3eG1pYy5mbGFncyB8PSAoYWRkcjFbMF0gJiAxKSA/CisJCUlXX01JQ0ZBSUxVUkVfR1JPVVAgOiBJV19NSUNGQUlMVVJFX1BBSVJXSVNFOworCXd4bWljLnNyY19hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwltZW1jcHkod3htaWMuc3JjX2FkZHIuc2FfZGF0YSwgYWRkcjIsIEVUSF9BTEVOKTsKIAotCS8qIEJlY2F1c2UgTUlDIGZhaWx1cmVzIGFyZSBub3QgcGFydCBvZiB0aGUgV2lyZWxlc3MgRXh0ZW5zaW9ucyB5ZXQsIHRoZXkKLQkgICBtdXN0IGJlIHBhc3NlZCBhcyBhIHN0cmluZyB1c2luZyBhbiBJV0VWQ1VTVE9NIGV2ZW50LiBJbiBvcmRlciBmb3IgdGhlCi0JICAgZXZlbnQgdG8gYmUgZWZmZWN0aXZlLCB0aGUgc3RyaW5nIGZvcm1hdCBtdXN0IGJlIGtub3duIGJ5IGJvdGggdGhlCi0JICAgZHJpdmVyIGFuZCB0aGUgc3VwcGxpY2FudC4gVGhlIGZvbGxvd2luZyBpcyB0aGUgc3RyaW5nIGZvcm1hdCB1c2VkIGJ5IHRoZQotCSAgIGhvc3RhcCBwcm9qZWN0J3MgV1BBIHN1cHBsaWNhbnQsIGFuZCB3aWxsIGJlIHVzZWQgaGVyZSB1bnRpbCB0aGUgV2lyZWxlc3MKLQkgICBFeHRlbnNpb25zIGludGVyZmFjZSBhZGRzIHRoaXMgc3VwcG9ydDoKLQotCSAgIE1MTUUtTUlDSEFFTE1JQ0ZBSUxVUkUuaW5kaWNhdGlvbihrZXlpZD0jIGJyb2FkY2FzdC91bmljYXN0IGFkZHI9YWRkcjIpCi0gICAqLwotCi0JLyogTk9URTogRm9ybWF0IG9mIE1BQyBhZGRyZXNzICh1c2luZyBjb2xvbnMgdG8gc2VwYXJhdGUgYnl0ZXMpIG1heSBjYXVzZQotCQkJIGEgcHJvYmxlbSBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlIHN1cHBsaWNhbnQsIGlmIHRoZXkgZXZlcgotCQkJIGFjdHVhbGx5IHBhcnNlIHRoZXNlIHBhcmFtZXRlcnMgKi8KLSNpZiBEQkcKLQlzcHJpbnRmKG1zZywgIk1MTUUtTUlDSEFFTE1JQ0ZBSUxVUkUuaW5kaWNhdGlvbihrZXlpZD0lZCAlc2Nhc3QgIgotCQkJImFkZHI9JXBNKSIsIGtleV9pZHgsIGFkZHIxWzBdICYgMHgwMSA/ICJicm9hZCIgOiAidW5pIiwKLQkJCWFkZHIyKTsKLSNlbmRpZgotCXdycXUuZGF0YS5sZW5ndGggPSBzdHJsZW4oIG1zZyApOwotCXdpcmVsZXNzX3NlbmRfZXZlbnQoIGRldiwgSVdFVkNVU1RPTSwgJndycXUsIG1zZyApOwotI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDE0ICovCisJd3JxdS5kYXRhLmxlbmd0aCA9IHNpemVvZih3eG1pYyk7CisJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIElXRVZNSUNIQUVMTUlDRkFJTFVSRSwgJndycXUsIChjaGFyICopJnd4bWljKTsKIAogCXJldHVybjsKIH0gLy8gd2xfd2V4dF9ldmVudF9taWNfZmFpbGVkCkBAIC0zOTc0LDggKzM4NzYsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHZvaWQgd2xfd2V4dF9ldmVudF9hc3NvY19pZSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCiB7Ci0jaWYgV0lSRUxFU1NfRVhUID4gMTQKLQljaGFyICAgICAgICAgICAgICAgbXNnWzUxMl07CiAJdW5pb24gaXdyZXFfZGF0YSAgIHdycXU7CiAJc3RydWN0IHdsX3ByaXZhdGUgKmxwID0gd2xfcHJpdihkZXYpOwogCWludCBzdGF0dXM7CkBAIC0zOTg2LDcgKzM4ODYsNiBAQAogCiAKIAltZW1zZXQoICZ3cnF1LCAwLCBzaXplb2YoIHdycXUgKSk7Ci0JbWVtc2V0KCBtc2csIDAsIHNpemVvZiggbXNnICkpOwogCiAJLyogUmV0cmlldmUgdGhlIEFzc29jaWF0aW9uIFJlcXVlc3QgSUUgKi8KIAlscC0+bHR2UmVjb3JkLmxlbiA9IDQ1OwpAQCAtMzk5OSwyNCArMzg5OCwxOCBAQAogCQltZW1jcHkoICZkYXRhLnJhd0RhdGEsICYoIGxwLT5sdHZSZWNvcmQudS51OFsxXSApLCA4OCApOwogCQl3cGFfaWUgPSB3bF9wYXJzZV93cGFfaWUoICZkYXRhLCAmbGVuZ3RoICk7CiAKLQkJLyogQmVjYXVzZSB0aGlzIGV2ZW50IChBc3NvY2lhdGlvbiBXUEEtSUUpIGlzIG5vdCBwYXJ0IG9mIHRoZSBXaXJlbGVzcwotCQlFeHRlbnNpb25zIHlldCwgaXQgbXVzdCBiZSBwYXNzZWQgYXMgYSBzdHJpbmcgdXNpbmcgYW4gSVdFVkNVU1RPTSBldmVudC4KLQkJSW4gb3JkZXIgZm9yIHRoZSBldmVudCB0byBiZSBlZmZlY3RpdmUsIHRoZSBzdHJpbmcgZm9ybWF0IG11c3QgYmUga25vd24KLQkJYnkgYm90aCB0aGUgZHJpdmVyIGFuZCB0aGUgc3VwcGxpY2FudC4gVGhlIGZvbGxvd2luZyBpcyB0aGUgc3RyaW5nIGZvcm1hdAotCQl1c2VkIGJ5IHRoZSBob3N0YXAgcHJvamVjdCdzIFdQQSBzdXBwbGljYW50LCBhbmQgd2lsbCBiZSB1c2VkIGhlcmUgdW50aWwKLQkJdGhlIFdpcmVsZXNzIEV4dGVuc2lvbnMgaW50ZXJmYWNlIGFkZHMgdGhpcyBzdXBwb3J0OgotCi0JCUFTU09DSU5GTyhSZXFJRXM9V1BBLUlFIFJlc3BJRXM9V1BBLUlFKQotCQkqLwotCiAJCWlmKCBsZW5ndGggIT0gMCApCiAJCXsKLQkJCXNwcmludGYoIG1zZywgIkFTU09DSU5GTyhSZXFJRXM9JXMpIiwgd2xfcHJpbnRfd3BhX2llKCB3cGFfaWUsIGxlbmd0aCApKTsKLQkJCXdycXUuZGF0YS5sZW5ndGggPSBzdHJsZW4oIG1zZyApOwotCQkJd2lyZWxlc3Nfc2VuZF9ldmVudCggZGV2LCBJV0VWQ1VTVE9NLCAmd3JxdSwgbXNnICk7CisJCQl3cnF1LmRhdGEubGVuZ3RoID0gd3BhX2llWzFdICsgMjsKKwkJCXdpcmVsZXNzX3NlbmRfZXZlbnQoZGV2LCBJV0VWQVNTT0NSRVFJRSwKKwkJCQkJICAgICZ3cnF1LCB3cGFfaWUpOworCisJCQkvKiBUaGlzIGJpdCBpcyBhIGhhY2suIFdlIHNlbmQgdGhlIHJlc3BpZQorCQkJICogZXZlbnQgYXQgdGhlIHNhbWUgdGltZSAqLworCQkJd2lyZWxlc3Nfc2VuZF9ldmVudChkZXYsIElXRVZBU1NPQ1JFU1BJRSwKKwkJCQkJICAgICZ3cnF1LCB3cGFfaWUpOwogCQl9CiAJfQotI2VuZGlmIC8qIFdJUkVMRVNTX0VYVCA+IDE0ICovCiAKIAlyZXR1cm47CiB9ICAvLyB3bF93ZXh0X2V2ZW50X2Fzc29jX2llCkBAIC00MDI1LDY2ICszOTE4LDM5IEBACiAKIHN0YXRpYyBjb25zdCBpd19oYW5kbGVyIHdsX2hhbmRsZXJbXSA9CiB7Ci0gICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2NvbW1pdCwgICAgICAgICAgIC8qIFNJT0NTSVdDT01NSVQgKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X3Byb3RvY29sLCAgICAgLyogU0lPQ0dJV05BTUUgKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV05XSUQgKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV05XSUQgKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3Nfc2V0X2ZyZXF1ZW5jeSwgICAgLyogU0lPQ1NJV0ZSRVEgKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X2ZyZXF1ZW5jeSwgICAgLyogU0lPQ0dJV0ZSRVEgKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3Nfc2V0X3BvcnR0eXBlLCAgICAgLyogU0lPQ1NJV01PREUgKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X3BvcnR0eXBlLCAgICAgLyogU0lPQ0dJV01PREUgKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3Nfc2V0X3NlbnNpdGl2aXR5LCAgLyogU0lPQ1NJV1NFTlMgKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X3NlbnNpdGl2aXR5LCAgLyogU0lPQ0dJV1NFTlMgKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCAsICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1JBTkdFICovCi0gICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9yYW5nZSwgICAgICAgIC8qIFNJT0NHSVdSQU5HRSAqLwotICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMICwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUFJJViAqLwotICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMIC8qIGtlcm5lbCBjb2RlICovLCAgICAvKiBTSU9DR0lXUFJJViAqLwotICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMICwgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXU1RBVFMgKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCAvKiBrZXJuZWwgY29kZSAqLywgICAgLyogU0lPQ0dJV1NUQVRTICovCi0gICAgICAgICAgICAgICAgaXdfaGFuZGxlcl9zZXRfc3B5LCAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdTUFkgKi8KLSAgICAgICAgICAgICAgICBpd19oYW5kbGVyX2dldF9zcHksICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1NQWSAqLwotICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXVEhSU1BZICovCi0gICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdUSFJTUFkgKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV0FQICovCisJSVdfSEFORExFUihTSU9DU0lXQ09NTUlULCAoaXdfaGFuZGxlcikgd2lyZWxlc3NfY29tbWl0KSwKKwlJV19IQU5ETEVSKFNJT0NHSVdOQU1FLCAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X3Byb3RvY29sKSwKKwlJV19IQU5ETEVSKFNJT0NTSVdGUkVRLCAoaXdfaGFuZGxlcikgd2lyZWxlc3Nfc2V0X2ZyZXF1ZW5jeSksCisJSVdfSEFORExFUihTSU9DR0lXRlJFUSwgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9mcmVxdWVuY3kpLAorCUlXX0hBTkRMRVIoU0lPQ1NJV01PREUsIChpd19oYW5kbGVyKSB3aXJlbGVzc19zZXRfcG9ydHR5cGUpLAorCUlXX0hBTkRMRVIoU0lPQ0dJV01PREUsIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfcG9ydHR5cGUpLAorCUlXX0hBTkRMRVIoU0lPQ1NJV1NFTlMsIChpd19oYW5kbGVyKSB3aXJlbGVzc19zZXRfc2Vuc2l0aXZpdHkpLAorCUlXX0hBTkRMRVIoU0lPQ0dJV1NFTlMsIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfc2Vuc2l0aXZpdHkpLAorCUlXX0hBTkRMRVIoU0lPQ0dJV1JBTkdFLCAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X3JhbmdlKSwKKwlJV19IQU5ETEVSKFNJT0NTSVdTUFksIGl3X2hhbmRsZXJfc2V0X3NweSksCisJSVdfSEFORExFUihTSU9DR0lXU1BZLCBpd19oYW5kbGVyX2dldF9zcHkpLAogI2lmIDEgLy87PyAoSENGX1RZUEUpICYgSENGX1RZUEVfU1RBCi0gICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9ic3NpZCwgICAgICAgIC8qIFNJT0NHSVdBUCAqLwotI2Vsc2UKLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV0FQICovCisJSVdfSEFORExFUihTSU9DR0lXQVAsIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfYnNzaWQpLAogI2VuZGlmCi0gICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NTSVdNTE1FICovCi0gICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9hcF9saXN0LCAgICAgIC8qIFNJT0NHSVdBUExJU1QgKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3Nfc2V0X3NjYW4sICAgICAgICAgLyogU0lPQ1NJV1NDQU4gKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X3NjYW4sICAgICAgICAgLyogU0lPQ0dJV1NDQU4gKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3Nfc2V0X2Vzc2lkLCAgICAgICAgLyogU0lPQ1NJV0VTU0lEICovCi0gICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9lc3NpZCwgICAgICAgIC8qIFNJT0NHSVdFU1NJRCAqLwotICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19zZXRfbmlja25hbWUsICAgICAvKiBTSU9DU0lXTklDS04gKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X25pY2tuYW1lLCAgICAgLyogU0lPQ0dJV05JQ0tOICovCi0gICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogLS0gaG9sZSAtLSAqLwotICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19zZXRfcmF0ZSwgICAgICAgICAvKiBTSU9DU0lXUkFURSAqLwotICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfcmF0ZSwgICAgICAgICAvKiBTSU9DR0lXUkFURSAqLwotICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19zZXRfcnRzX3RocmVzaG9sZCwvKiBTSU9DU0lXUlRTICovCi0gICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9ydHNfdGhyZXNob2xkLC8qIFNJT0NHSVdSVFMgKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV0ZSQUcgKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV0ZSQUcgKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ1NJV1RYUE9XICovCi0gICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF90eF9wb3dlciwgICAgIC8qIFNJT0NHSVdUWFBPVyAqLwotICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUkVUUlkgKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV1JFVFJZICovCi0gICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX3NldF9lbmNvZGUsICAgICAgIC8qIFNJT0NTSVdFTkNPREUgKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X2VuY29kZSwgICAgICAgLyogU0lPQ0dJV0VOQ09ERSAqLwotICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19zZXRfcG93ZXIsICAgICAgICAvKiBTSU9DU0lXUE9XRVIgKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X3Bvd2VyLCAgICAgICAgLyogU0lPQ0dJV1BPV0VSICovCi0gICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIC0tIGhvbGUgLS0gKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogLS0gaG9sZSAtLSAqLwotICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfZ2VuaWUsICAgICAgICAvKiBTSU9DU0lXR0VOSUUgKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV0dFTklFICovCi0gICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX3NldF9hdXRoLCAgICAgICAgIC8qIFNJT0NTSVdBVVRIICovCi0gICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIE5VTEwsICAgICAgICAgICAgICAgICAgICAgIC8qIFNJT0NHSVdBVVRIICovCi0gICAgICAgICAgICAgICAgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX3NldF9lbmNvZGVleHQsICAgIC8qIFNJT0NTSVdFTkNPREVFWFQgKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogU0lPQ0dJV0VOQ09ERUVYVCAqLwotICAgICAgICAgICAgICAgIChpd19oYW5kbGVyKSBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAvKiBTSU9DU0lXUE1LU0EgKi8KLSAgICAgICAgICAgICAgICAoaXdfaGFuZGxlcikgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgLyogLS0gaG9sZSAtLSAqLworCUlXX0hBTkRMRVIoU0lPQ0dJV0FQTElTVCwgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9hcF9saXN0KSwKKwlJV19IQU5ETEVSKFNJT0NTSVdTQ0FOLCAoaXdfaGFuZGxlcikgd2lyZWxlc3Nfc2V0X3NjYW4pLAorCUlXX0hBTkRMRVIoU0lPQ0dJV1NDQU4sIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfc2NhbiksCisJSVdfSEFORExFUihTSU9DU0lXRVNTSUQsIChpd19oYW5kbGVyKSB3aXJlbGVzc19zZXRfZXNzaWQpLAorCUlXX0hBTkRMRVIoU0lPQ0dJV0VTU0lELCAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X2Vzc2lkKSwKKwlJV19IQU5ETEVSKFNJT0NTSVdOSUNLTiwgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX3NldF9uaWNrbmFtZSksCisJSVdfSEFORExFUihTSU9DR0lXTklDS04sIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfbmlja25hbWUpLAorCUlXX0hBTkRMRVIoU0lPQ1NJV1JBVEUsIChpd19oYW5kbGVyKSB3aXJlbGVzc19zZXRfcmF0ZSksCisJSVdfSEFORExFUihTSU9DR0lXUkFURSwgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX2dldF9yYXRlKSwKKwlJV19IQU5ETEVSKFNJT0NTSVdSVFMsIChpd19oYW5kbGVyKSB3aXJlbGVzc19zZXRfcnRzX3RocmVzaG9sZCksCisJSVdfSEFORExFUihTSU9DR0lXUlRTLCAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X3J0c190aHJlc2hvbGQpLAorCUlXX0hBTkRMRVIoU0lPQ0dJV1RYUE9XLCAoaXdfaGFuZGxlcikgd2lyZWxlc3NfZ2V0X3R4X3Bvd2VyKSwKKwlJV19IQU5ETEVSKFNJT0NTSVdFTkNPREUsIChpd19oYW5kbGVyKSB3aXJlbGVzc19zZXRfZW5jb2RlKSwKKwlJV19IQU5ETEVSKFNJT0NHSVdFTkNPREUsIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfZW5jb2RlKSwKKwlJV19IQU5ETEVSKFNJT0NTSVdQT1dFUiwgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX3NldF9wb3dlciksCisJSVdfSEFORExFUihTSU9DR0lXUE9XRVIsIChpd19oYW5kbGVyKSB3aXJlbGVzc19nZXRfcG93ZXIpLAorCUlXX0hBTkRMRVIoU0lPQ1NJV0dFTklFLCAoaXdfaGFuZGxlcikgd2lyZWxlc3Nfc2V0X2dlbmllKSwKKwlJV19IQU5ETEVSKFNJT0NTSVdBVVRILCAoaXdfaGFuZGxlcikgd2lyZWxlc3Nfc2V0X2F1dGgpLAorCUlXX0hBTkRMRVIoU0lPQ1NJV0VOQ09ERUVYVCwgKGl3X2hhbmRsZXIpIHdpcmVsZXNzX3NldF9lbmNvZGVleHQpLAogfTsKIAogc3RhdGljIGNvbnN0IGl3X2hhbmRsZXIgd2xfcHJpdmF0ZV9oYW5kbGVyW10gPQpAQCAtNDEyMCw1ICszOTg2LDMgQEAKICAgICAgICAgLnN0YW5kYXJkICAgICAgICAgICA9IChpd19oYW5kbGVyICopIHdsX2hhbmRsZXIsCiAgICAgICAgIC5nZXRfd2lyZWxlc3Nfc3RhdHMgPSB3bF9nZXRfd2lyZWxlc3Nfc3RhdHMsCiB9OwotCi0jZW5kaWYgLy8gV0lSRUxFU1NfRVhUCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF93ZXh0LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMi93bF93ZXh0LmgKaW5kZXggMzlkMzlhNC4uYTcxMzA1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDIvd2xfd2V4dC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyL3dsX3dleHQuaApAQCAtNjIsOSArNjIsNiBAQAogI2RlZmluZSBfX1dMX1dFWFRfSF9fCiAKIAotI2lmZGVmIFdJUkVMRVNTX0VYVAotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgZnVuY3Rpb24gcHJvdG95cGVzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtODgsOSArODUsNCBAQAogCiBleHRlcm4gY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHdsX2l3X2hhbmRsZXJfZGVmOwogCi0jZWxzZQotI2Vycm9yIFdJUkVMRVNTX0VYVAotI2VuZGlmIC8vIFdJUkVMRVNTX0VYVAotCi0KICNlbmRpZiAgLy8gX19XTF9XRVhUX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3dsYWdzNDlfaDI1L01ha2VmaWxlCmluZGV4IDdkNGI1NjMuLjZlMDE1OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy93bGFnczQ5X2gyNS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhZ3M0OV9oMjUvTWFrZWZpbGUKQEAgLTExLDExICsxMSw5IEBACiAjCiAjICBJZiB5b3Ugd2FudCB0byBidWlsZCBBUCBzdXBwb3J0ICh1bnRlc3RlZCksIGNvbW1lbnQgb3V0IC1EU1RBX09OTFkKIAotSU5TVEFMTERJUiA6PSAvbGliL21vZHVsZXMvJChzaGVsbCB1bmFtZSAtcikva2VybmVsL2RyaXZlcnMvbmV0L3dpcmVsZXNzCiBjY2ZsYWdzLXkgOj0gLUkkKEtFUk5FTERJUikvaW5jbHVkZQogY2NmbGFncy15ICs9IC1JJChzcmMpIFwKIAkJLURCVVNfUENNQ0lBIFwKLQkJLURVU0VfV1BBIFwKIAkJLURVU0VfV0VYVCBcCiAJCS1EU1RBX09OTFkgXAogCQktRFdWTEFOXzQ5IFwKQEAgLTM5LDEwICszNyw2IEBACiBlbmRpZgogZW5kaWYKIAotIyBJZiBLRVJORUxSRUxFQVNFIGlzIGRlZmluZWQsIHdlJ3ZlIGJlZW4gaW52b2tlZCBmcm9tIHRoZQotIyBrZXJuZWwgYnVpbGQgc3lzdGVtIGFuZCBjYW4gdXNlIGl0cyBsYW5ndWFnZS4KLWlmbmVxICgkKEtFUk5FTFJFTEVBU0UpLCkKLQogb2JqLW0JCSs9ICQoV0xOQU1FKS5vCiAKICQoV0xOQU1FKS15ICs9CXdsX3Byb2ZpbGUubyBcCkBAIC01OSwyMyArNTMsMyBAQAogCiAkKFdMTkFNRSktJChDT05GSUdfU1lTRlMpCSs9IHdsX3N5c2ZzLm8KIAotIyBPdGhlcndpc2Ugd2Ugd2VyZSBjYWxsZWQgZGlyZWN0bHkgZnJvbSB0aGUgY29tbWFuZAotIyBsaW5lOyBpbnZva2UgdGhlIGtlcm5lbCBidWlsZCBzeXN0ZW0uCi1lbHNlCi0JS0VSTkVMRElSID89IC9saWIvbW9kdWxlcy8kKHNoZWxsIHVuYW1lIC1yKS9idWlsZAotCVBXRCA6PSAkKHNoZWxsIHB3ZCkKLQotZGVmYXVsdDoKLQkkKE1BS0UpIC1DICQoS0VSTkVMRElSKSBNPSQoUFdEKSBtb2R1bGVzCi1lbmRpZgotCi1jbGVhbjoKLQlybSAtZnIgKi5vICoua28gKi5tb2QuYyAqLm1vZC5vIC4qLiouY21kIE1vZHVsZS5zeW12ZXJzIFwKLQkJTW9kdWxlLm1hcmtlcnMgbW9kdWxlcy5vcmRlciAudG1wX3ZlcnNpb25zCi0KLWluc3RhbGw6IGRlZmF1bHQKLQktcm1tb2QgJChXTE5BTUUpCi0JaW5zdGFsbCAtZCAkKElOU1RBTExESVIpCi0JaW5zdGFsbCAtbSAwNjQ0IC1vIHJvb3QgLWcgcm9vdCAkKFdMTkFNRSkua28gJChJTlNUQUxMRElSKQotCS9zYmluL2RlcG1vZCAtYXEKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1RPRE8gYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvVE9ETwppbmRleCBjODVmZjVlLi4xM2Q5YmMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvVE9ETworKysgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvVE9ETwpAQCAtNSw3ICs1LDYgQEAKIAogVE9ETzoKIC0gY2xlYW4gdXBzCi0tIGZpeCBidWlsZCB3YXJuaW5ncyB3aGVuIG1vZHVsZQogLSBzb3J0IG91dCBkdXAgaWRzIHdpdGggU2lTIGRyaXZlcgogLSByZW1vdmUgdXNlbGVzcy93cm9uZy91bnVzZWQgI2lmZGVmL2NvZGUvLi4uCiAtIGZpeCBwcmludGsgdXNhZ2VzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW4uaCBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lfbWFpbi5oCmluZGV4IGY2Y2QyMmQuLjcxYWViZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lfbWFpbi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lfbWFpbi5oCkBAIC0xMSwxMiArMTEsNiBAQAogCiAjZGVmaW5lIFhHSUZBSUwoeCkgZG8geyBwcmludGsoeCAiXG4iKTsgcmV0dXJuIC1FSU5WQUw7IH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgVkVSX01BSk9SICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFZFUl9NSU5PUiAgICAgICAgICAgICAgICAgOAotI2RlZmluZSBWRVJfTEVWRUwgICAgICAgICAgICAgICAgIDEKLQotI2RlZmluZSBEUklWRVJfREVTQyAgIlhHSSBWb2xhcmkgRnJhbWUgQnVmZmVyIE1vZHVsZSBWZXJzaW9uIDAuOC4xIgotCiAjaWZuZGVmIFBDSV9WRU5ET1JfSURfWEcKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9YRyAgICAgICAgICAweDE4Q0EKICNlbmRpZgpAQCAtMzcsMTIgKzMxLDYgQEAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9YR18yNyAgICAgIDB4MDI3CiAjZW5kaWYKIAotCi0KLSNkZWZpbmUgWEdJX0lPVFlQRTEgdm9pZCBfX2lvbWVtCi0jZGVmaW5lIFhHSV9JT1RZUEUyIF9faW9tZW0KLSNkZWZpbmUgWEdJSU5JVFNUQVRJQyBzdGF0aWMKLQogc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKHhnaWZiX3BjaV90YWJsZSkgPSB7CiAJe1BDSV9WRU5ET1JfSURfWEcsIFBDSV9ERVZJQ0VfSURfWEdfMjAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCiAJIDAsIDAsIDB9LApAQCAtNTgsNjEgKzQ2LDI5IEBACiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgeGdpZmJfcGNpX3RhYmxlKTsKIAogLyogVG8gYmUgaW5jbHVkZWQgaW4gZmIuaCAqLwotI2lmbmRlZiBGQl9BQ0NFTF9YR0lfR0xBTU9VUl8yCi0jZGVmaW5lIEZCX0FDQ0VMX1hHSV9HTEFNT1VSXzIgIDQwCS8qIFhHSSAzMTUsIDY1MCwgNzQwCQkqLwotI2VuZGlmCiAjaWZuZGVmIEZCX0FDQ0VMX1hHSV9YQUJSRQogI2RlZmluZSBGQl9BQ0NFTF9YR0lfWEFCUkUgICAgICA0MQkvKiBYR0kgMzMwICgiWGFicmUiKQkJKi8KICNlbmRpZgogCi0jZGVmaW5lIE1BWF9ST01fU0NBTiAgICAgICAgICAgICAgMHgxMDAwMAotCi0jZGVmaW5lIFNFUV9BRFIgICAgICAgICAgICAgICAgICAgMHgxNAogI2RlZmluZSBTRVFfREFUQSAgICAgICAgICAgICAgICAgIDB4MTUKLSNkZWZpbmUgREFDX0FEUiAgICAgICAgICAgICAgICAgICAweDE4Ci0jZGVmaW5lIERBQ19EQVRBICAgICAgICAgICAgICAgICAgMHgxOQotI2RlZmluZSBDUlRDX0FEUiAgICAgICAgICAgICAgICAgIDB4MjQKLSNkZWZpbmUgQ1JUQ19EQVRBICAgICAgICAgICAgICAgICAweDI1Ci0jZGVmaW5lIERBQzJfQURSICAgICAgICAgICAgICAgICAgKDB4MTYtMHgzMCkKLSNkZWZpbmUgREFDMl9EQVRBICAgICAgICAgICAgICAgICAoMHgxNy0weDMwKQotI2RlZmluZSBWQl9QQVJUMV9BRFIgICAgICAgICAgICAgICgweDA0LTB4MzApCi0jZGVmaW5lIFZCX1BBUlQxX0RBVEEgICAgICAgICAgICAgKDB4MDUtMHgzMCkKLSNkZWZpbmUgVkJfUEFSVDJfQURSICAgICAgICAgICAgICAoMHgxMC0weDMwKQotI2RlZmluZSBWQl9QQVJUMl9EQVRBICAgICAgICAgICAgICgweDExLTB4MzApCi0jZGVmaW5lIFZCX1BBUlQzX0FEUiAgICAgICAgICAgICAgKDB4MTItMHgzMCkKLSNkZWZpbmUgVkJfUEFSVDNfREFUQSAgICAgICAgICAgICAoMHgxMy0weDMwKQotI2RlZmluZSBWQl9QQVJUNF9BRFIgICAgICAgICAgICAgICgweDE0LTB4MzApCi0jZGVmaW5lIFZCX1BBUlQ0X0RBVEEgICAgICAgICAgICAgKDB4MTUtMHgzMCkKIAotI2RlZmluZSBYR0lTUgkJCSAgWEdJX1ByLlAzYzQKLSNkZWZpbmUgWEdJQ1IgICAgICAgICAgICAgICAgICAgICBYR0lfUHIuUDNkNAotI2RlZmluZSBYR0lEQUNBICAgICAgICAgICAgICAgICAgIFhHSV9Qci5QM2M4Ci0jZGVmaW5lIFhHSURBQ0QgICAgICAgICAgICAgICAgICAgWEdJX1ByLlAzYzkKLSNkZWZpbmUgWEdJUEFSVDEgICAgICAgICAgICAgICAgICBYR0lfUHIuUGFydDFQb3J0Ci0jZGVmaW5lIFhHSVBBUlQyICAgICAgICAgICAgICAgICAgWEdJX1ByLlBhcnQyUG9ydAotI2RlZmluZSBYR0lQQVJUMyAgICAgICAgICAgICAgICAgIFhHSV9Qci5QYXJ0M1BvcnQKLSNkZWZpbmUgWEdJUEFSVDQgICAgICAgICAgICAgICAgICBYR0lfUHIuUGFydDRQb3J0Ci0jZGVmaW5lIFhHSVBBUlQ1ICAgICAgICAgICAgICAgICAgWEdJX1ByLlBhcnQ1UG9ydAorI2RlZmluZSBYR0lTUgkJCSAgKHhnaWZiX2luZm8tPmRldl9pbmZvLlAzYzQpCisjZGVmaW5lIFhHSUNSCQkJICAoeGdpZmJfaW5mby0+ZGV2X2luZm8uUDNkNCkKKyNkZWZpbmUgWEdJREFDQQkJCSAgKHhnaWZiX2luZm8tPmRldl9pbmZvLlAzYzgpCisjZGVmaW5lIFhHSURBQ0QJCQkgICh4Z2lmYl9pbmZvLT5kZXZfaW5mby5QM2M5KQorI2RlZmluZSBYR0lQQVJUMQkJICAoeGdpZmJfaW5mby0+ZGV2X2luZm8uUGFydDFQb3J0KQorI2RlZmluZSBYR0lQQVJUMgkJICAoeGdpZmJfaW5mby0+ZGV2X2luZm8uUGFydDJQb3J0KQorI2RlZmluZSBYR0lQQVJUMwkJICAoeGdpZmJfaW5mby0+ZGV2X2luZm8uUGFydDNQb3J0KQorI2RlZmluZSBYR0lQQVJUNAkJICAoeGdpZmJfaW5mby0+ZGV2X2luZm8uUGFydDRQb3J0KQorI2RlZmluZSBYR0lQQVJUNQkJICAoeGdpZmJfaW5mby0+ZGV2X2luZm8uUGFydDVQb3J0KQogI2RlZmluZSBYR0lEQUMyQSAgICAgICAgICAgICAgICAgIFhHSVBBUlQ1CiAjZGVmaW5lIFhHSURBQzJEICAgICAgICAgICAgICAgICAgKFhHSVBBUlQ1ICsgMSkKLSNkZWZpbmUgWEdJTUlTQ1IgICAgICAgICAgICAgICAgICAoWEdJX1ByLlJlbElPICsgMHgxYykKLSNkZWZpbmUgWEdJSU5QU1RBVAkJICAoWEdJX1ByLlJlbElPICsgMHgyYSkKIAogI2RlZmluZSBJTkRfWEdJX1BBU1NXT1JEICAgICAgICAgIDB4MDUgIC8qIFNScyAqLwotI2RlZmluZSBJTkRfWEdJX0NPTE9SX01PREUgICAgICAgIDB4MDYKICNkZWZpbmUgSU5EX1hHSV9SQU1EQUNfQ09OVFJPTCAgICAweDA3CiAjZGVmaW5lIElORF9YR0lfRFJBTV9TSVpFICAgICAgICAgMHgxNAotI2RlZmluZSBJTkRfWEdJX1NDUkFUQ0hfUkVHXzE2ICAgIDB4MTYKLSNkZWZpbmUgSU5EX1hHSV9TQ1JBVENIX1JFR18xNyAgICAweDE3Ci0jZGVmaW5lIElORF9YR0lfU0NSQVRDSF9SRUdfMUEgICAgMHgxQQogI2RlZmluZSBJTkRfWEdJX01PRFVMRV9FTkFCTEUgICAgIDB4MUUKICNkZWZpbmUgSU5EX1hHSV9QQ0lfQUREUkVTU19TRVQgICAweDIwCi0jZGVmaW5lIElORF9YR0lfVFVSQk9RVUVVRV9BRFIgICAgMHgyNgotI2RlZmluZSBJTkRfWEdJX1RVUkJPUVVFVUVfU0VUICAgIDB4MjcKLSNkZWZpbmUgSU5EX1hHSV9QT1dFUl9PTl9UUkFQICAgICAweDM4Ci0jZGVmaW5lIElORF9YR0lfUE9XRVJfT05fVFJBUDIgICAgMHgzOQotI2RlZmluZSBJTkRfWEdJX0NNRFFVRVVFX1NFVCAgICAgIDB4MjYKLSNkZWZpbmUgSU5EX1hHSV9DTURRVUVVRV9USFJFU0hPTEQgIDB4MjcKIAogI2RlZmluZSBJTkRfWEdJX1NDUkFUQ0hfUkVHX0NSMzAgIDB4MzAgIC8qIENScyAqLwogI2RlZmluZSBJTkRfWEdJX1NDUkFUQ0hfUkVHX0NSMzEgIDB4MzEKQEAgLTEyMCwyMyArNzYsMTAgQEAKICNkZWZpbmUgSU5EX1hHSV9TQ1JBVENIX1JFR19DUjMzICAweDMzCiAjZGVmaW5lIElORF9YR0lfTENEX1BBTkVMICAgICAgICAgMHgzNgogI2RlZmluZSBJTkRfWEdJX1NDUkFUQ0hfUkVHX0NSMzcgIDB4MzcKLSNkZWZpbmUgSU5EX1hHSV9BR1BfSU9fUEFEICAgICAgICAweDQ4CiAKLSNkZWZpbmUgSU5EX0JSSV9EUkFNX1NUQVRVUyAgICAgICAweDYzIC8qIFBDSSBjb25maWcgbWVtb3J5IHNpemUgb2Zmc2V0ICovCi0KLSNkZWZpbmUgTU1JT19RVUVVRV9QSFlCQVNFICAgICAgICAweDg1QzAKLSNkZWZpbmUgTU1JT19RVUVVRV9XUklURVBPUlQgICAgICAweDg1QzQKLSNkZWZpbmUgTU1JT19RVUVVRV9SRUFEUE9SVCAgICAgICAweDg1QzgKLQotI2RlZmluZSBJTkRfWEdJX0NSVDJfV1JJVEVfRU5BQkxFXzMwMCAweDI0CiAjZGVmaW5lIElORF9YR0lfQ1JUMl9XUklURV9FTkFCTEVfMzE1IDB4MkYKIAogI2RlZmluZSBYR0lfUEFTU1dPUkQgICAgICAgICAgICAgIDB4ODYgIC8qIFNSMDUgKi8KLSNkZWZpbmUgWEdJX0lOVEVSTEFDRURfTU9ERSAgICAgICAweDIwICAvKiBTUjA2ICovCi0jZGVmaW5lIFhHSV84QlBQX0NPTE9SX01PREUgICAgICAgMHgwCi0jZGVmaW5lIFhHSV8xNUJQUF9DT0xPUl9NT0RFICAgICAgMHgxCi0jZGVmaW5lIFhHSV8xNkJQUF9DT0xPUl9NT0RFICAgICAgMHgyCi0jZGVmaW5lIFhHSV8zMkJQUF9DT0xPUl9NT0RFICAgICAgMHg0CiAKICNkZWZpbmUgWEdJX0RSQU1fU0laRV9NQVNLICAgICAweEYwICAvKlNSMTQgKi8KICNkZWZpbmUgWEdJX0RSQU1fU0laRV8xTUIgICAgICAweDAwCkBAIC0xNDgsMjcgKzkxLDYgQEAKICNkZWZpbmUgWEdJX0RSQU1fU0laRV82NE1CICAgICAweDA2CiAjZGVmaW5lIFhHSV9EUkFNX1NJWkVfMTI4TUIgICAgMHgwNwogI2RlZmluZSBYR0lfRFJBTV9TSVpFXzI1Nk1CICAgIDB4MDgKLSNkZWZpbmUgWEdJX0RBVEFfQlVTX01BU0sgICAgICAweDAyCi0jZGVmaW5lIFhHSV9EQVRBX0JVU182NCAgICAgICAgMHgwMAotI2RlZmluZSBYR0lfREFUQV9CVVNfMTI4ICAgICAgIDB4MDEKLSNkZWZpbmUgWEdJX0RVQUxfQ0hBTk5FTF9NQVNLICAweDBDCi0jZGVmaW5lIFhHSV9TSU5HTEVfQ0hBTk5FTF8xX1JBTksgMHgwCi0jZGVmaW5lIFhHSV9TSU5HTEVfQ0hBTk5FTF8yX1JBTksgMHgxCi0jZGVmaW5lIFhHSV9BU1lNX0REUgkJICAweDAyCi0jZGVmaW5lIFhHSV9EVUFMX0NIQU5ORUxfMV9SQU5LCSAgMHgzCi0KLSNkZWZpbmUgWEdJNTUwX0RSQU1fU0laRV9NQVNLICAgICAweDNGICAvKiA1NTAvNjUwLzc0MCBTUjE0ICovCi0jZGVmaW5lIFhHSTU1MF9EUkFNX1NJWkVfNE1CICAgICAgMHgwMAotI2RlZmluZSBYR0k1NTBfRFJBTV9TSVpFXzhNQiAgICAgIDB4MDEKLSNkZWZpbmUgWEdJNTUwX0RSQU1fU0laRV8xNk1CICAgICAweDAzCi0jZGVmaW5lIFhHSTU1MF9EUkFNX1NJWkVfMjRNQiAgICAgMHgwNQotI2RlZmluZSBYR0k1NTBfRFJBTV9TSVpFXzMyTUIgICAgIDB4MDcKLSNkZWZpbmUgWEdJNTUwX0RSQU1fU0laRV82NE1CICAgICAweDBGCi0jZGVmaW5lIFhHSTU1MF9EUkFNX1NJWkVfOTZNQiAgICAgMHgxNwotI2RlZmluZSBYR0k1NTBfRFJBTV9TSVpFXzEyOE1CICAgIDB4MUYKLSNkZWZpbmUgWEdJNTUwX0RSQU1fU0laRV8yNTZNQiAgICAweDNGCi0KLSNkZWZpbmUgWEdJX1NDUkFUQ0hfUkVHXzFBX01BU0sgICAweDEwCiAKICNkZWZpbmUgWEdJX0VOQUJMRV8yRCAgICAgICAgICAgICAweDQwICAvKiBTUjFFICovCiAKQEAgLTE3Niw3ICs5OCw2IEBACiAjZGVmaW5lIFhHSV9QQ0lfQUREUl9FTkFCTEUgICAgICAgMHg4MAogCiAjZGVmaW5lIFhHSV9TSU1VTFRBTkVPVVNfVklFV19FTkFCTEUgIDB4MDEgIC8qIENSMzAgKi8KLSNkZWZpbmUgWEdJX01PREVfU0VMRUNUX0NSVDIgICAgICAweDAyCiAjZGVmaW5lIFhHSV9WQl9PVVRQVVRfQ09NUE9TSVRFICAgMHgwNAogI2RlZmluZSBYR0lfVkJfT1VUUFVUX1NWSURFTyAgICAgIDB4MDgKICNkZWZpbmUgWEdJX1ZCX09VVFBVVF9TQ0FSVCAgICAgICAweDEwCkBAIC0xOTksMTE4ICsxMjAsMzQgQEAKIAkJCQkgICBYR0lfVkJfU0NBUlQgfCBYR0lfVkJfSElWSVNJT058WEdJX1ZCX1lQQlBSKQogCiAjZGVmaW5lIFhHSV9FWFRFUk5BTF9DSElQX01BU0sJCSAgIDB4MEUgIC8qIENSMzcgKi8KLSNkZWZpbmUgWEdJX0VYVEVSTkFMX0NISVBfWEdJMzAxICAgICAgICAgICAweDAxICAvKiBpbiBDUjM3IDw8IDEgISAqLwotI2RlZmluZSBYR0lfRVhURVJOQUxfQ0hJUF9MVkRTICAgICAgICAgICAgIDB4MDIgIC8qIGluIENSMzcgPDwgMSAhICovCi0jZGVmaW5lIFhHSV9FWFRFUk5BTF9DSElQX1RSVU1QSU9OICAgICAgICAgMHgwMyAgLyogaW4gQ1IzNyA8PCAxICEgKi8KLSNkZWZpbmUgWEdJX0VYVEVSTkFMX0NISVBfTFZEU19DSFJPTlRFTCAgICAweDA0ICAvKiBpbiBDUjM3IDw8IDEgISAqLwotI2RlZmluZSBYR0lfRVhURVJOQUxfQ0hJUF9DSFJPTlRFTCAgICAgICAgIDB4MDUgIC8qIGluIENSMzcgPDwgMSAhICovCiAjZGVmaW5lIFhHSTMxMF9FWFRFUk5BTF9DSElQX0xWRFMgICAgICAgICAgMHgwMiAgLyogaW4gQ1IzNyA8PCAxICEgKi8KICNkZWZpbmUgWEdJMzEwX0VYVEVSTkFMX0NISVBfTFZEU19DSFJPTlRFTCAweDAzICAvKiBpbiBDUjM3IDw8IDEgISAqLwogCi0jZGVmaW5lIFhHSV9BR1BfMlggICAgICAgICAgICAgICAgMHgyMCAgLyogQ1I0OCAqLwotCi0jZGVmaW5lIEJSSV9EUkFNX1NJWkVfTUFTSyAgICAgICAgMHg3MCAgLyogUENJIGJyaWRnZSBjb25maWcgZGF0YSAqLwotI2RlZmluZSBCUklfRFJBTV9TSVpFXzJNQiAgICAgICAgIDB4MDAKLSNkZWZpbmUgQlJJX0RSQU1fU0laRV80TUIgICAgICAgICAweDAxCi0jZGVmaW5lIEJSSV9EUkFNX1NJWkVfOE1CICAgICAgICAgMHgwMgotI2RlZmluZSBCUklfRFJBTV9TSVpFXzE2TUIgICAgICAgIDB4MDMKLSNkZWZpbmUgQlJJX0RSQU1fU0laRV8zMk1CICAgICAgICAweDA0Ci0jZGVmaW5lIEJSSV9EUkFNX1NJWkVfNjRNQiAgICAgICAgMHgwNQotCi0jZGVmaW5lIFNSX0JVRkZFUl9TSVpFICAgICAgICAgICAgNQotI2RlZmluZSBDUl9CVUZGRVJfU0laRSAgICAgICAgICAgIDUKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLSBHbG9iYWwgVmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLS8qIEZiY29uIHZhcmlhYmxlcyAqLwotc3RhdGljIHN0cnVjdCBmYl9pbmZvICpmYl9pbmZvOwotCi0KLXN0YXRpYyBpbnQgICAgdmlkZW9fdHlwZSA9IEZCX1RZUEVfUEFDS0VEX1BJWEVMUzsKLQotc3RhdGljIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBkZWZhdWx0X3ZhciA9IHsKLQkueHJlcwkJPSAwLAotCS55cmVzCQk9IDAsCi0JLnhyZXNfdmlydHVhbAk9IDAsCi0JLnlyZXNfdmlydHVhbAk9IDAsCi0JLnhvZmZzZXQJPSAwLAotCS55b2Zmc2V0CT0gMCwKLQkuYml0c19wZXJfcGl4ZWwJPSAwLAotCS5ncmF5c2NhbGUJPSAwLAotCS5yZWQJCT0gezAsIDgsIDB9LAotCS5ncmVlbgkJPSB7MCwgOCwgMH0sCi0JLmJsdWUJCT0gezAsIDgsIDB9LAotCS50cmFuc3AJCT0gezAsIDAsIDB9LAotCS5ub25zdGQJCT0gMCwKLQkuYWN0aXZhdGUJPSBGQl9BQ1RJVkFURV9OT1csCi0JLmhlaWdodAkJPSAtMSwKLQkud2lkdGgJCT0gLTEsCi0JLmFjY2VsX2ZsYWdzCT0gMCwKLQkucGl4Y2xvY2sJPSAwLAotCS5sZWZ0X21hcmdpbgk9IDAsCi0JLnJpZ2h0X21hcmdpbgk9IDAsCi0JLnVwcGVyX21hcmdpbgk9IDAsCi0JLmxvd2VyX21hcmdpbgk9IDAsCi0JLmhzeW5jX2xlbgk9IDAsCi0JLnZzeW5jX2xlbgk9IDAsCi0JLnN5bmMJCT0gMCwKLQkudm1vZGUJCT0gRkJfVk1PREVfTk9OSU5URVJMQUNFRCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gWEdJZmJfZml4ID0gewotCS5pZAkJPSAiWEdJIiwKLQkudHlwZQkJPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFMsCi0JLnhwYW5zdGVwCT0gMSwKLQkueXBhbnN0ZXAJPSAxLAotfTsKLXN0YXRpYyBjaGFyIG15aWRbMjBdOwotc3RhdGljIHUzMiBwc2V1ZG9fcGFsZXR0ZVsxN107Ci0KLQogLyogZGlzcGxheSBzdGF0dXMgKi8KLXN0YXRpYyBpbnQgWEdJZmJfb2ZmID0gMDsKLXN0YXRpYyBpbnQgWEdJZmJfY3J0MW9mZiA9IDA7CitzdGF0aWMgaW50IFhHSWZiX2NydDFvZmY7CiBzdGF0aWMgaW50IFhHSWZiX2ZvcmNlY3J0MSA9IC0xOwotc3RhdGljIGludCBYR0lmYl91c2Vyb20gPSAwOwotLypzdGF0aWMgaW50IFhHSWZiX3VzZW9lbSA9IC0xOyAqLworc3RhdGljIGludCBYR0lmYl91c2Vyb20gOwogCiAvKiBnbG9iYWwgZmxhZ3MgKi8KLXN0YXRpYyBpbnQgWEdJZmJfcmVnaXN0ZXJlZDsKLXN0YXRpYyBpbnQgWEdJZmJfdHZtb2RlID0gMDsKLXN0YXRpYyBpbnQgWEdJZmJfcGRjID0gMDsKLXN0YXRpYyBpbnQgZW5hYmxlX2RzdG4gPSAwOworc3RhdGljIGludCBYR0lmYl90dm1vZGU7CitzdGF0aWMgaW50IGVuYWJsZV9kc3RuOwogc3RhdGljIGludCBYR0lmYl95cGFuID0gLTE7CiAKLQotc3RhdGljIGludCBYR0lmYl9DUlQyX3dyaXRlX2VuYWJsZSA9IDA7Ci0KIC8qIFRXOiBDUlQyIHR5cGUgKGZvciBvdmVycmlkaW5nIGF1dG9kZXRlY3Rpb24pICovCiBzdGF0aWMgaW50IFhHSWZiX2NydDJ0eXBlID0gLTE7CiAvKiBQUjogVHYgcGx1ZyB0eXBlIChmb3Igb3ZlcnJpZGluZyBhdXRvZGV0ZWN0aW9uKSAqLwogc3RhdGljIGludCBYR0lmYl90dnBsdWcgPSAtMTsKIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJZmJfZGV0ZWN0ZWRwZGMgPSAwOwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBYR0lmYl9kZXRlY3RlZGxjZGEgPSAweGZmOwotCi0KLQotCiAvKiBUVzogRm9yIGlvY3RsIFhHSUZCX0dFVF9JTkZPICovCiAvKiBYR0lmYl9pbmZvIFhHSWZiaW5mbzsgKi8KIAotLyogVFc6IEhhcmR3YXJlIGV4dGVuc2lvbjsgY29udGFpbnMgZGF0YSBvbiBoYXJkd2FyZSAqLwotc3RhdGljIHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gWEdJaHdfZXh0OwotCi0vKiBUVzogWEdJIHByaXZhdGUgc3RydWN0dXJlICovCi1zdGF0aWMgc3RydWN0IHZiX2RldmljZV9pbmZvICBYR0lfUHI7Ci0KICNkZWZpbmUgTURfWEdJMzAwIDEKICNkZWZpbmUgTURfWEdJMzE1IDIKIAogLyogbW9kZSB0YWJsZSAqLwotLyogTk9UIGNvbnN0IC0gd2lsbCBiZSBwYXRjaGVkIGZvciAxMjgweDk2MCBtb2RlIG51bWJlciBjaGFvcyByZWFzb25zICovCi1zdGF0aWMgc3RydWN0IF9YR0liaW9zX21vZGUgeworc3RhdGljIGNvbnN0IHN0cnVjdCBfWEdJYmlvc19tb2RlIHsKIAljaGFyIG5hbWVbMTVdOwogCXU4IG1vZGVfbm87CiAJdTE2IHZlc2FfbW9kZV9ub18xOyAgLyogIlhHSSBkZWZpbmVkIiBWRVNBIG1vZGUgbnVtYmVyICovCkBAIC0zMjMsOSArMTYwLDYgQEAKIAl1MTYgcm93czsKIAl1OCAgY2hpcHNldDsKIH0gWEdJYmlvc19tb2RlW10gPSB7Ci0jZGVmaW5lIE1PREVfSU5ERVhfTk9ORSAgICAgICAgICAgMCAgLyogVFc6IGluZGV4IGZvciBtb2RlPW5vbmUgKi8KLQl7Im5vbmUiLCAgICAgICAgIDB4RkYsIDB4MDAwMCwgMHgwMDAwLCAgICAwLCAgICAwLCAgMCwgMCwgICAwLCAgMCwKLQkgTURfWEdJMzAwfE1EX1hHSTMxNX0sICAvKiBUVzogZm9yIG1vZGUgIm5vbmUiICovCiAJeyIzMjB4MjQweDE2IiwgICAweDU2LCAweDAwMDAsIDB4MDAwMCwgIDMyMCwgIDI0MCwgMTYsIDEsICA0MCwgMTUsCiAJIE1EX1hHSTMxNX0sCiAJeyIzMjB4NDgweDgiLCAgICAweDVBLCAweDAwMDAsIDB4MDAwMCwgIDMyMCwgIDQ4MCwgIDgsIDEsICA0MCwgMzAsCkBAIC0zNjUsMTEgKzE5OSw5IEBACiAJIE1EX1hHSTMwMHxNRF9YR0kzMTV9LAogCXsiODAweDQ4MHgzMiIsICAgMHg3NiwgMHgwMDAwLCAweDAwMDAsICA4MDAsICA0ODAsIDMyLCAxLCAxMDAsIDMwLAogCSBNRF9YR0kzMDB8TURfWEdJMzE1fSwKLSNkZWZpbmUgREVGQVVMVF9NT0RFICAgICAgICAgICAgICAyMSAvKiBUVzogaW5kZXggZm9yIDgwMHg2MDB4OCAqLwotI2RlZmluZSBERUZBVUxUX0xDRE1PREUgICAgICAgICAgIDIxIC8qIFRXOiBpbmRleCBmb3IgODAweDYwMHg4ICovCi0jZGVmaW5lIERFRkFVTFRfVFZNT0RFICAgICAgICAgICAgMjEgLyogVFc6IGluZGV4IGZvciA4MDB4NjAweDggKi8KIAl7IjgwMHg2MDB4OCIsICAgIDB4MzAsIDB4MDEwMywgMHgwMTAzLCAgODAwLCAgNjAwLCAgOCwgMSwgMTAwLCAzNywKIAkgTURfWEdJMzAwfE1EX1hHSTMxNX0sCisjZGVmaW5lIERFRkFVTFRfTU9ERSAgICAgICAgICAgICAgMjAgLyogaW5kZXggZm9yIDgwMHg2MDB4MTYgKi8KIAl7IjgwMHg2MDB4MTYiLCAgIDB4NDcsIDB4MDExNCwgMHgwMTE0LCAgODAwLCAgNjAwLCAxNiwgMSwgMTAwLCAzNywKIAkgTURfWEdJMzAwfE1EX1hHSTMxNX0sCiAJeyI4MDB4NjAweDI0IiwgICAweDYzLCAweDAxM2IsIDB4MDExNSwgIDgwMCwgIDYwMCwgMzIsIDEsIDEwMCwgMzcsCkBAIC00MjQsOSArMjU2LDggQEAKIAkgTURfWEdJMzE1fSwKIAl7IjEyODB4NzY4eDMyIiwgIDB4MjUsIDB4MDAwMCwgMHgwMDAwLCAxMjgwLCAgNzY4LCAzMiwgMSwgMTYwLCA0OCwKIAkgTURfWEdJMzE1fSwKLSNkZWZpbmUgTU9ERUlOREVYXzEyODB4OTYwIDQ4CiAJeyIxMjgweDk2MHg4IiwgICAweDdDLCAweDAwMDAsIDB4MDAwMCwgMTI4MCwgIDk2MCwgIDgsIDEsIDE2MCwgNjAsCi0JIE1EX1hHSTMwMHxNRF9YR0kzMTV9LCAgLyogVFc6IE1vZGVudW1iZXJzIGJlaW5nIHBhdGNoZWQgKi8KKwkgTURfWEdJMzAwfE1EX1hHSTMxNX0sCiAJeyIxMjgweDk2MHgxNiIsICAweDdELCAweDAwMDAsIDB4MDAwMCwgMTI4MCwgIDk2MCwgMTYsIDEsIDE2MCwgNjAsCiAJIE1EX1hHSTMwMHxNRF9YR0kzMTV9LAogCXsiMTI4MHg5NjB4MjQiLCAgMHg3RSwgMHgwMDAwLCAweDAwMDAsIDEyODAsICA5NjAsIDMyLCAxLCAxNjAsIDYwLApAQCAtNDc2LDE2ICszMDcsNiBAQAogCXsiXDAiLCAweDAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfQogfTsKIAotLyogbW9kZS1yZWxhdGVkIHZhcmlhYmxlcyAqLwotI2lmZGVmIE1PRFVMRQotc3RhdGljIGludCB4Z2lmYl9tb2RlX2lkeCA9IDE7Ci0jZWxzZQotc3RhdGljIGludCB4Z2lmYl9tb2RlX2lkeCA9IC0xOyAvKiBVc2UgYSBkZWZhdWx0IG1vZGUgaWYgd2UgYXJlCi0JCQkJCWluc2lkZSB0aGUga2VybmVsICovCi0jZW5kaWYKLXN0YXRpYyB1OCAgWEdJZmJfbW9kZV9ubyAgPSAwOwotc3RhdGljIHU4ICBYR0lmYl9yYXRlX2lkeCA9IDA7Ci0KIC8qIFRXOiBDUjM2IGV2YWx1YXRpb24gKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBYR0kzMDBwYW5lbHR5cGVbXSA9IHsKIAkgTENEX1VOS05PV04sICBMQ0RfODAweDYwMCwgTENEXzEwMjR4NzY4LCBMQ0RfMTI4MHgxMDI0LApAQCAtNTA1LDE5ICszMjYsMTkgQEAKIAlpbnQgdHZwbHVnX25vOwogfSBYR0lfY3J0MnR5cGVbXSA9IHsKIAl7Ik5PTkUiLAkwLAkJLTF9LAotCXsiTENEIiwJCURJU1BUWVBFX0xDRCwJLTF9LAotCXsiVFYiLAkJRElTUFRZUEVfVFYsCS0xfSwKLQl7IlZHQSIsCQlESVNQVFlQRV9DUlQyLAktMX0sCi0JeyJTVklERU8iLAlESVNQVFlQRV9UViwJVFZQTFVHX1NWSURFT30sCi0JeyJDT01QT1NJVEUiLAlESVNQVFlQRV9UViwJVFZQTFVHX0NPTVBPU0lURX0sCi0JeyJTQ0FSVCIsCURJU1BUWVBFX1RWLAlUVlBMVUdfU0NBUlR9LAorCXsiTENEIiwJCVhHSUZCX0RJU1BfTENELAktMX0sCisJeyJUViIsCQlYR0lGQl9ESVNQX1RWLAktMX0sCisJeyJWR0EiLAkJWEdJRkJfRElTUF9DUlQsCS0xfSwKKwl7IlNWSURFTyIsCVhHSUZCX0RJU1BfVFYsCVRWUExVR19TVklERU99LAorCXsiQ09NUE9TSVRFIiwJWEdJRkJfRElTUF9UViwJVFZQTFVHX0NPTVBPU0lURX0sCisJeyJTQ0FSVCIsCVhHSUZCX0RJU1BfVFYsCVRWUExVR19TQ0FSVH0sCiAJeyJub25lIiwJMCwJCS0xfSwKLQl7ImxjZCIsCQlESVNQVFlQRV9MQ0QsCS0xfSwKLQl7InR2IiwJCURJU1BUWVBFX1RWLAktMX0sCi0JeyJ2Z2EiLAkJRElTUFRZUEVfQ1JUMiwJLTF9LAotCXsic3ZpZGVvIiwJRElTUFRZUEVfVFYsCVRWUExVR19TVklERU99LAotCXsiY29tcG9zaXRlIiwJRElTUFRZUEVfVFYsCVRWUExVR19DT01QT1NJVEV9LAotCXsic2NhcnQiLAlESVNQVFlQRV9UViwJVFZQTFVHX1NDQVJUfSwKKwl7ImxjZCIsCQlYR0lGQl9ESVNQX0xDRCwJLTF9LAorCXsidHYiLAkJWEdJRkJfRElTUF9UViwJLTF9LAorCXsidmdhIiwJCVhHSUZCX0RJU1BfQ1JULAktMX0sCisJeyJzdmlkZW8iLAlYR0lGQl9ESVNQX1RWLAlUVlBMVUdfU1ZJREVPfSwKKwl7ImNvbXBvc2l0ZSIsCVhHSUZCX0RJU1BfVFYsCVRWUExVR19DT01QT1NJVEV9LAorCXsic2NhcnQiLAlYR0lGQl9ESVNQX1RWLAlUVlBMVUdfU0NBUlR9LAogCXsiXDAiLAkJLTEsCQktMX0KIH07CiAKQEAgLTc0MCw2ICs1NjEsNSBAQAogfTsKIAogc3RhdGljIGludCAgICAgICAgICAgZmlsdGVyID0gLTE7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBmaWx0ZXJfdGI7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL1hHSV9tYWluXzI2LmMgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYwppbmRleCA0NDAzZTVmLi4zNmRiMjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYwpAQCAtMjgsMTAgKzI4LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KIAotI2lmbmRlZiBYR0lGQl9QQU4KLSNkZWZpbmUgWEdJRkJfUEFOCi0jZW5kaWYKLQogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaWZkZWYgQ09ORklHX01UUlIKICNpbmNsdWRlIDxhc20vbXRyci5oPgpAQCAtNDUsMTUgKzQxLDE3IEBACiAjaW5jbHVkZSAidmJfc2V0bW9kZS5oIgogCiAjZGVmaW5lIEluZGV4X0NSX0dQSU9fUmVnMSAweDQ4Ci0jZGVmaW5lIEluZGV4X0NSX0dQSU9fUmVnMiAweDQ5CiAjZGVmaW5lIEluZGV4X0NSX0dQSU9fUmVnMyAweDRhCiAKICNkZWZpbmUgR1BJT0dfRU4gICAgKDE8PDYpCi0jZGVmaW5lIEdQSU9HX1dSSVRFICgxPDw2KQogI2RlZmluZSBHUElPR19SRUFEICAoMTw8MSkKIAogI2RlZmluZSBYR0lGQl9ST01fU0laRQk2NTUzNgogCitzdGF0aWMgY2hhciAqbW9kZTsKK3N0YXRpYyBpbnQgdmVzYSA9IC0xOworc3RhdGljIHVuc2lnbmVkIGludCByZWZyZXNoX3JhdGU7CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hY3JvIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogI3VuZGVmIFhHSUZCREVCVUcKQEAgLTE0Myw5ICsxNDEsNiBAQAogfQogI2VuZGlmCiAKLS8qIGRhdGEgZm9yIFhHSSBjb21wb25lbnRzICovCi1zdHJ1Y3QgdmlkZW9faW5mbyB4Z2lfdmlkZW9faW5mbzsKLQogI2lmIDEKICNkZWZpbmUgREVCVUdQUk4oeCkKICNlbHNlCkBAIC0zOTAsNDQgKzM4NSw2IEBACiAKIH0KIAotLyogLS0tLS0tLS0tLS0tIEludGVyZmFjZSBmb3IgaW5pdCAmIG1vZGUgc3dpdGNoaW5nIGNvZGUgLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBYR0lmYl9xdWVyeV9WR0FfY29uZmlnX3NwYWNlKAotCQlzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpwWEdJaHdfZXh0LCB1bnNpZ25lZCBsb25nIG9mZnNldCwKLQkJdW5zaWduZWQgbG9uZyBzZXQsIHVuc2lnbmVkIGxvbmcgKnZhbHVlKQotewotCXN0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7Ci0Jc3RhdGljIHVuc2lnbmVkIGNoYXIgaW5pdCA9IDAsIHZhbGlkX3BkZXYgPSAwOwotCi0JaWYgKCFzZXQpCi0JCURQUklOVEsoIlhHSWZiOiBHZXQgVkdBIG9mZnNldCAweCVseFxuIiwgb2Zmc2V0KTsKLQllbHNlCi0JCURQUklOVEsoIlhHSWZiOiBTZXQgb2Zmc2V0IDB4JWx4IHRvIDB4JWx4XG4iLCBvZmZzZXQsICp2YWx1ZSk7Ci0KLQlpZiAoIWluaXQpIHsKLQkJaW5pdCA9IDE7Ci0JCXBkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfVkVORE9SX0lEX1hHLCB4Z2lfdmlkZW9faW5mby5jaGlwX2lkLAotCQkJCXBkZXYpOwotCQlpZiAocGRldikgewotCQkJdmFsaWRfcGRldiA9IDE7Ci0JCQlwY2lfZGV2X3B1dChwZGV2KTsKLQkJfQotCX0KLQotCWlmICghdmFsaWRfcGRldikgewotCQlwcmludGsoS0VSTl9ERUJVRyAiWEdJZmI6IENhbid0IGZpbmQgWEdJICVkIFZHQSBkZXZpY2UuXG4iLAotCQkJCXhnaV92aWRlb19pbmZvLmNoaXBfaWQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoc2V0ID09IDApCi0JCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBvZmZzZXQsICh1MzIgKikgdmFsdWUpOwotCWVsc2UKLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBvZmZzZXQsICh1MzIpKCp2YWx1ZSkpOwotCi0JcmV0dXJuIDE7Ci19Ci0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLSBJbnRlcm5hbCBoZWxwZXIgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogc3RhdGljIGludCBYR0lmYl9HZXRYRzIxRGVmYXVsdExWRFNNb2RlSWR4KHZvaWQpCkBAIC00NDUsNDggKzQwMiwyNiBAQAogCQkJCSYmIChYR0liaW9zX21vZGVbWEdJZmJfbW9kZV9pZHhdLnlyZXMKIAkJCQkJCT09IFhHSTIxX0xDRENhcExpc3RbMF0uTFZEU1ZERSkKIAkJCQkmJiAoWEdJYmlvc19tb2RlW1hHSWZiX21vZGVfaWR4XS5icHAgPT0gOCkpIHsKLQkJCVhHSWZiX21vZGVfbm8gPSBYR0liaW9zX21vZGVbWEdJZmJfbW9kZV9pZHhdLm1vZGVfbm87CiAJCQlmb3VuZF9tb2RlID0gMTsKIAkJCWJyZWFrOwogCQl9CiAJCVhHSWZiX21vZGVfaWR4Kys7CiAJfQogCWlmICghZm91bmRfbW9kZSkKLQkJWEdJZmJfbW9kZV9pZHggPSAwOworCQlYR0lmYl9tb2RlX2lkeCA9IC0xOwogCiAJcmV0dXJuIFhHSWZiX21vZGVfaWR4OwogfQogCi1zdGF0aWMgdm9pZCBYR0lmYl9zZWFyY2hfbW9kZShjb25zdCBjaGFyICpuYW1lKQorc3RhdGljIHZvaWQgWEdJZmJfc2VhcmNoX21vZGUoc3RydWN0IHhnaWZiX3ZpZGVvX2luZm8gKnhnaWZiX2luZm8sCisJCQkgICAgICBjb25zdCBjaGFyICpuYW1lKQogewogCWludCBpID0gMCwgaiA9IDAsIGw7CiAKLQlpZiAobmFtZSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiWEdJZmI6IEludGVybmFsIGVycm9yLCB1c2luZyBkZWZhdWx0IG1vZGUuXG4iKTsKLQkJeGdpZmJfbW9kZV9pZHggPSBERUZBVUxUX01PREU7Ci0JCWlmICgoeGdpX3ZpZGVvX2luZm8uY2hpcCA9PSBYRzIxKQotCQkJCSYmICgoeGdpX3ZpZGVvX2luZm8uZGlzcF9zdGF0ZSAmIERJU1BUWVBFX0RJU1AyKQotCQkJCQkJPT0gRElTUFRZUEVfTENEKSkgewotCQkJeGdpZmJfbW9kZV9pZHggPSBYR0lmYl9HZXRYRzIxRGVmYXVsdExWRFNNb2RlSWR4KCk7Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCWlmICghc3RyY21wKG5hbWUsIFhHSWJpb3NfbW9kZVtNT0RFX0lOREVYX05PTkVdLm5hbWUpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiWEdJZmI6IE1vZGUgJ25vbmUnIG5vdCBzdXBwb3J0ZWQgYW55bW9yZS4gVXNpbmcgZGVmYXVsdC5cbiIpOwotCQl4Z2lmYl9tb2RlX2lkeCA9IERFRkFVTFRfTU9ERTsKLQkJaWYgKCh4Z2lfdmlkZW9faW5mby5jaGlwID09IFhHMjEpCi0JCQkJJiYgKCh4Z2lfdmlkZW9faW5mby5kaXNwX3N0YXRlICYgRElTUFRZUEVfRElTUDIpCi0JCQkJCQk9PSBESVNQVFlQRV9MQ0QpKSB7Ci0JCQl4Z2lmYl9tb2RlX2lkeCA9IFhHSWZiX0dldFhHMjFEZWZhdWx0TFZEU01vZGVJZHgoKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCiAJd2hpbGUgKFhHSWJpb3NfbW9kZVtpXS5tb2RlX25vICE9IDApIHsKIAkJbCA9IG1pbihzdHJsZW4obmFtZSksIHN0cmxlbihYR0liaW9zX21vZGVbaV0ubmFtZSkpOwogCQlpZiAoIXN0cm5jbXAobmFtZSwgWEdJYmlvc19tb2RlW2ldLm5hbWUsIGwpKSB7Ci0JCQl4Z2lmYl9tb2RlX2lkeCA9IGk7CisJCQl4Z2lmYl9pbmZvLT5tb2RlX2lkeCA9IGk7CiAJCQlqID0gMTsKIAkJCWJyZWFrOwogCQl9CkBAIC00OTYsODIgKzQzMSw2NiBAQAogCQlwcmludGsoS0VSTl9JTkZPICJYR0lmYjogSW52YWxpZCBtb2RlICclcydcbiIsIG5hbWUpOwogfQogCi1zdGF0aWMgdm9pZCBYR0lmYl9zZWFyY2hfdmVzYW1vZGUodW5zaWduZWQgaW50IHZlc2Ftb2RlKQorc3RhdGljIHZvaWQgWEdJZmJfc2VhcmNoX3Zlc2Ftb2RlKHN0cnVjdCB4Z2lmYl92aWRlb19pbmZvICp4Z2lmYl9pbmZvLAorCQkJCSAgdW5zaWduZWQgaW50IHZlc2Ftb2RlKQogewogCWludCBpID0gMCwgaiA9IDA7CiAKLQlpZiAodmVzYW1vZGUgPT0gMCkgewotCi0JCXByaW50ayhLRVJOX0VSUiAiWEdJZmI6IE1vZGUgJ25vbmUnIG5vdCBzdXBwb3J0ZWQgYW55bW9yZS4gVXNpbmcgZGVmYXVsdC5cbiIpOwotCQl4Z2lmYl9tb2RlX2lkeCA9IERFRkFVTFRfTU9ERTsKLQkJaWYgKCh4Z2lfdmlkZW9faW5mby5jaGlwID09IFhHMjEpCi0JCQkJJiYgKCh4Z2lfdmlkZW9faW5mby5kaXNwX3N0YXRlICYgRElTUFRZUEVfRElTUDIpCi0JCQkJCQk9PSBESVNQVFlQRV9MQ0QpKSB7Ci0JCQl4Z2lmYl9tb2RlX2lkeCA9IFhHSWZiX0dldFhHMjFEZWZhdWx0TFZEU01vZGVJZHgoKTsKLQkJfQotCQlyZXR1cm47Ci0JfQorCWlmICh2ZXNhbW9kZSA9PSAwKQorCQlnb3RvIGludmFsaWQ7CiAKIAl2ZXNhbW9kZSAmPSAweDFkZmY7IC8qIENsZWFuIFZFU0EgbW9kZSBudW1iZXIgZnJvbSBvdGhlciBmbGFncyAqLwogCiAJd2hpbGUgKFhHSWJpb3NfbW9kZVtpXS5tb2RlX25vICE9IDApIHsKIAkJaWYgKChYR0liaW9zX21vZGVbaV0udmVzYV9tb2RlX25vXzEgPT0gdmVzYW1vZGUpIHx8CiAJCSAgICAoWEdJYmlvc19tb2RlW2ldLnZlc2FfbW9kZV9ub18yID09IHZlc2Ftb2RlKSkgewotCQkJeGdpZmJfbW9kZV9pZHggPSBpOworCQkJeGdpZmJfaW5mby0+bW9kZV9pZHggPSBpOwogCQkJaiA9IDE7CiAJCQlicmVhazsKIAkJfQogCQlpKys7CiAJfQorCitpbnZhbGlkOgogCWlmICghaikKIAkJcHJpbnRrKEtFUk5fSU5GTyAiWEdJZmI6IEludmFsaWQgVkVTQSBtb2RlIDB4JXgnXG4iLCB2ZXNhbW9kZSk7CiB9CiAKLXN0YXRpYyBpbnQgWEdJZmJfR2V0WEcyMUxWRFNEYXRhKHZvaWQpCitzdGF0aWMgaW50IFhHSWZiX0dldFhHMjFMVkRTRGF0YShzdHJ1Y3QgeGdpZmJfdmlkZW9faW5mbyAqeGdpZmJfaW5mbykKIHsKIAl1OCB0bXA7Ci0JdW5zaWduZWQgY2hhciAqcERhdGE7CisJdm9pZCBfX2lvbWVtICpkYXRhID0geGdpZmJfaW5mby0+bW1pb192YmFzZSArIDB4MjAwMDA7CiAJaW50IGksIGosIGs7CiAKIAl0bXAgPSB4Z2lmYl9yZWdfZ2V0KFhHSVNSLCAweDFlKTsKIAl4Z2lmYl9yZWdfc2V0KFhHSVNSLCAweDFlLCB0bXAgfCA0KTsKIAotCXBEYXRhID0geGdpX3ZpZGVvX2luZm8ubW1pb192YmFzZSArIDB4MjAwMDA7Ci0JaWYgKChwRGF0YVsweDBdID09IDB4NTUpICYmCi0JICAgIChwRGF0YVsweDFdID09IDB4QUEpICYmCi0JICAgIChwRGF0YVsweDY1XSAmIDB4MSkpIHsKLQkJaSA9IHBEYXRhWzB4MzE2XSB8IChwRGF0YVsweDMxN10gPDwgOCk7Ci0JCWogPSBwRGF0YVtpIC0gMV07CisJaWYgKChyZWFkYihkYXRhKSA9PSAweDU1KSAmJgorCSAgICAocmVhZGIoZGF0YSArIDEpID09IDB4QUEpICYmCisJICAgIChyZWFkYihkYXRhICsgMHg2NSkgJiAweDEpKSB7CisJCWkgPSByZWFkdyhkYXRhICsgMHgzMTYpOworCQlqID0gcmVhZGIoZGF0YSArIGkgLSAxKTsKIAkJaWYgKGogPT0gMHhmZikKIAkJCWogPSAxOwogCiAJCWsgPSAwOwogCQlkbyB7Ci0JCQlYR0kyMV9MQ0RDYXBMaXN0W2tdLkxWRFNfQ2FwYWJpbGl0eSA9IHBEYXRhW2ldCi0JCQkJCXwgKHBEYXRhW2kgKyAxXSA8PCA4KTsKLQkJCVhHSTIxX0xDRENhcExpc3Rba10uTFZEU0hUID0gcERhdGFbaSArIDJdIHwgKHBEYXRhW2kKLQkJCQkJKyAzXSA8PCA4KTsKLQkJCVhHSTIxX0xDRENhcExpc3Rba10uTFZEU1ZUID0gcERhdGFbaSArIDRdIHwgKHBEYXRhW2kKLQkJCQkJKyA1XSA8PCA4KTsKLQkJCVhHSTIxX0xDRENhcExpc3Rba10uTFZEU0hERSA9IHBEYXRhW2kgKyA2XSB8IChwRGF0YVtpCi0JCQkJCSsgN10gPDwgOCk7Ci0JCQlYR0kyMV9MQ0RDYXBMaXN0W2tdLkxWRFNWREUgPSBwRGF0YVtpICsgOF0gfCAocERhdGFbaQotCQkJCQkrIDldIDw8IDgpOwotCQkJWEdJMjFfTENEQ2FwTGlzdFtrXS5MVkRTSEZQID0gcERhdGFbaSArIDEwXSB8IChwRGF0YVtpCi0JCQkJCSsgMTFdIDw8IDgpOwotCQkJWEdJMjFfTENEQ2FwTGlzdFtrXS5MVkRTVkZQID0gcERhdGFbaSArIDEyXSB8IChwRGF0YVtpCi0JCQkJCSsgMTNdIDw8IDgpOwotCQkJWEdJMjFfTENEQ2FwTGlzdFtrXS5MVkRTSFNZTkMgPSBwRGF0YVtpICsgMTRdCi0JCQkJCXwgKHBEYXRhW2kgKyAxNV0gPDwgOCk7Ci0JCQlYR0kyMV9MQ0RDYXBMaXN0W2tdLkxWRFNWU1lOQyA9IHBEYXRhW2kgKyAxNl0KLQkJCQkJfCAocERhdGFbaSArIDE3XSA8PCA4KTsKLQkJCVhHSTIxX0xDRENhcExpc3Rba10uVkNMS0RhdGExID0gcERhdGFbaSArIDE4XTsKLQkJCVhHSTIxX0xDRENhcExpc3Rba10uVkNMS0RhdGEyID0gcERhdGFbaSArIDE5XTsKLQkJCVhHSTIxX0xDRENhcExpc3Rba10uUFNDX1MxID0gcERhdGFbaSArIDIwXTsKLQkJCVhHSTIxX0xDRENhcExpc3Rba10uUFNDX1MyID0gcERhdGFbaSArIDIxXTsKLQkJCVhHSTIxX0xDRENhcExpc3Rba10uUFNDX1MzID0gcERhdGFbaSArIDIyXTsKLQkJCVhHSTIxX0xDRENhcExpc3Rba10uUFNDX1M0ID0gcERhdGFbaSArIDIzXTsKLQkJCVhHSTIxX0xDRENhcExpc3Rba10uUFNDX1M1ID0gcERhdGFbaSArIDI0XTsKKwkJCVhHSTIxX0xDRENhcExpc3Rba10uTFZEU19DYXBhYmlsaXR5ID0gcmVhZHcoZGF0YSArIGkpOworCQkJWEdJMjFfTENEQ2FwTGlzdFtrXS5MVkRTSFQgPSByZWFkdyhkYXRhICsgaSArIDIpOworCQkJWEdJMjFfTENEQ2FwTGlzdFtrXS5MVkRTVlQgPSByZWFkdyhkYXRhICsgaSArIDQpOworCQkJWEdJMjFfTENEQ2FwTGlzdFtrXS5MVkRTSERFID0gcmVhZHcoZGF0YSArIGkgKyA2KTsKKwkJCVhHSTIxX0xDRENhcExpc3Rba10uTFZEU1ZERSA9IHJlYWR3KGRhdGEgKyBpICsgOCk7CisJCQlYR0kyMV9MQ0RDYXBMaXN0W2tdLkxWRFNIRlAgPSByZWFkdyhkYXRhICsgaSArIDEwKTsKKwkJCVhHSTIxX0xDRENhcExpc3Rba10uTFZEU1ZGUCA9IHJlYWR3KGRhdGEgKyBpICsgMTIpOworCQkJWEdJMjFfTENEQ2FwTGlzdFtrXS5MVkRTSFNZTkMgPSByZWFkdyhkYXRhICsgaSArIDE0KTsKKwkJCVhHSTIxX0xDRENhcExpc3Rba10uTFZEU1ZTWU5DID0gcmVhZHcoZGF0YSArIGkgKyAxNik7CisJCQlYR0kyMV9MQ0RDYXBMaXN0W2tdLlZDTEtEYXRhMSA9IHJlYWRiKGRhdGEgKyBpICsgMTgpOworCQkJWEdJMjFfTENEQ2FwTGlzdFtrXS5WQ0xLRGF0YTIgPSByZWFkYihkYXRhICsgaSArIDE5KTsKKwkJCVhHSTIxX0xDRENhcExpc3Rba10uUFNDX1MxID0gcmVhZGIoZGF0YSArIGkgKyAyMCk7CisJCQlYR0kyMV9MQ0RDYXBMaXN0W2tdLlBTQ19TMiA9IHJlYWRiKGRhdGEgKyBpICsgMjEpOworCQkJWEdJMjFfTENEQ2FwTGlzdFtrXS5QU0NfUzMgPSByZWFkYihkYXRhICsgaSArIDIyKTsKKwkJCVhHSTIxX0xDRENhcExpc3Rba10uUFNDX1M0ID0gcmVhZGIoZGF0YSArIGkgKyAyMyk7CisJCQlYR0kyMV9MQ0RDYXBMaXN0W2tdLlBTQ19TNSA9IHJlYWRiKGRhdGEgKyBpICsgMjQpOwogCQkJaSArPSAyNTsKIAkJCWotLTsKIAkJCWsrKzsKQEAgLTU4MiwxMyArNTAxLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgWEdJZmJfdmFsaWRhdGVfbW9kZShpbnQgbXlpbmRleCkKK3N0YXRpYyBpbnQgWEdJZmJfdmFsaWRhdGVfbW9kZShzdHJ1Y3QgeGdpZmJfdmlkZW9faW5mbyAqeGdpZmJfaW5mbywgaW50IG15aW5kZXgpCiB7CiAJdTE2IHhyZXMsIHlyZXM7CisJc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqaHdfaW5mbyA9ICZ4Z2lmYl9pbmZvLT5od19pbmZvOwogCi0JaWYgKHhnaV92aWRlb19pbmZvLmNoaXAgPT0gWEcyMSkgewotCQlpZiAoKHhnaV92aWRlb19pbmZvLmRpc3Bfc3RhdGUgJiBESVNQVFlQRV9ESVNQMikKLQkJCQk9PSBESVNQVFlQRV9MQ0QpIHsKKwlpZiAoeGdpZmJfaW5mby0+Y2hpcCA9PSBYRzIxKSB7CisJCWlmICh4Z2lmYl9pbmZvLT5kaXNwbGF5MiA9PSBYR0lGQl9ESVNQX0xDRCkgewogCQkJeHJlcyA9IFhHSTIxX0xDRENhcExpc3RbMF0uTFZEU0hERTsKIAkJCXlyZXMgPSBYR0kyMV9MQ0RDYXBMaXN0WzBdLkxWRFNWREU7CiAJCQlpZiAoWEdJYmlvc19tb2RlW215aW5kZXhdLnhyZXMgPiB4cmVzKQpAQCAtNjA3LDE1ICs1MjYsMTUgQEAKIAl9CiAKIAkvKiBGSVhNRTogZm9yIG5vdywgYWxsIGlzIHZhbGlkIG9uIFhHMjcgKi8KLQlpZiAoeGdpX3ZpZGVvX2luZm8uY2hpcCA9PSBYRzI3KQorCWlmICh4Z2lmYl9pbmZvLT5jaGlwID09IFhHMjcpCiAJCXJldHVybiBteWluZGV4OwogCiAJaWYgKCEoWEdJYmlvc19tb2RlW215aW5kZXhdLmNoaXBzZXQgJiBNRF9YR0kzMTUpKQogCQlyZXR1cm4gLTE7CiAKLQlzd2l0Y2ggKHhnaV92aWRlb19pbmZvLmRpc3Bfc3RhdGUgJiBESVNQVFlQRV9ESVNQMikgewotCWNhc2UgRElTUFRZUEVfTENEOgotCQlzd2l0Y2ggKFhHSWh3X2V4dC51bENSVDJMQ0RUeXBlKSB7CisJc3dpdGNoICh4Z2lmYl9pbmZvLT5kaXNwbGF5MikgeworCWNhc2UgWEdJRkJfRElTUF9MQ0Q6CisJCXN3aXRjaCAoaHdfaW5mby0+dWxDUlQyTENEVHlwZSkgewogCQljYXNlIExDRF82NDB4NDgwOgogCQkJeHJlcyA9IDY0MDsKIAkJCXlyZXMgPSA0ODA7CkBAIC02NzEsMTMgKzU5MCwxMyBAQAogCQkJcmV0dXJuIC0xOwogCQlpZiAoWEdJYmlvc19tb2RlW215aW5kZXhdLnlyZXMgPiB5cmVzKQogCQkJcmV0dXJuIC0xOwotCQlpZiAoKFhHSWh3X2V4dC51bEV4dGVybmFsQ2hpcCA9PSAweDAxKSB8fCAvKiBMVkRTICovCi0JCSAgICAoWEdJaHdfZXh0LnVsRXh0ZXJuYWxDaGlwID09IDB4MDUpKSB7IC8qIExWRFMrQ2hyb250ZWwgKi8KKwkJaWYgKChod19pbmZvLT51bEV4dGVybmFsQ2hpcCA9PSAweDAxKSB8fCAvKiBMVkRTICovCisJCSAgICAoaHdfaW5mby0+dWxFeHRlcm5hbENoaXAgPT0gMHgwNSkpIHsgLyogTFZEUytDaHJvbnRlbCAqLwogCQkJc3dpdGNoIChYR0liaW9zX21vZGVbbXlpbmRleF0ueHJlcykgewogCQkJY2FzZSA1MTI6CiAJCQkJaWYgKFhHSWJpb3NfbW9kZVtteWluZGV4XS55cmVzICE9IDUxMikKIAkJCQkJcmV0dXJuIC0xOwotCQkJCWlmIChYR0lod19leHQudWxDUlQyTENEVHlwZSA9PSBMQ0RfMTAyNHg2MDApCisJCQkJaWYgKGh3X2luZm8tPnVsQ1JUMkxDRFR5cGUgPT0gTENEXzEwMjR4NjAwKQogCQkJCQlyZXR1cm4gLTE7CiAJCQkJYnJlYWs7CiAJCQljYXNlIDY0MDoKQEAgLTY5NSwxMyArNjE0LDEzIEBACiAJCQkJICAgIChYR0liaW9zX21vZGVbbXlpbmRleF0ueXJlcyAhPSA3NjgpKQogCQkJCQlyZXR1cm4gLTE7CiAJCQkJaWYgKChYR0liaW9zX21vZGVbbXlpbmRleF0ueXJlcyA9PSA2MDApICYmCi0JCQkJICAgIChYR0lod19leHQudWxDUlQyTENEVHlwZSAhPSBMQ0RfMTAyNHg2MDApKQorCQkJCSAgICAoaHdfaW5mby0+dWxDUlQyTENEVHlwZSAhPSBMQ0RfMTAyNHg2MDApKQogCQkJCQlyZXR1cm4gLTE7CiAJCQkJYnJlYWs7CiAJCQljYXNlIDExNTI6CiAJCQkJaWYgKChYR0liaW9zX21vZGVbbXlpbmRleF0ueXJlcykgIT0gNzY4KQogCQkJCQlyZXR1cm4gLTE7Ci0JCQkJaWYgKFhHSWh3X2V4dC51bENSVDJMQ0RUeXBlICE9IExDRF8xMTUyeDc2OCkKKwkJCQlpZiAoaHdfaW5mby0+dWxDUlQyTENEVHlwZSAhPSBMQ0RfMTE1Mng3NjgpCiAJCQkJCXJldHVybiAtMTsKIAkJCQlicmVhazsKIAkJCWNhc2UgMTI4MDoKQEAgLTcwOSw3ICs2MjgsNyBAQAogCQkJCSAgICAoWEdJYmlvc19tb2RlW215aW5kZXhdLnlyZXMgIT0gMTAyNCkpCiAJCQkJCXJldHVybiAtMTsKIAkJCQlpZiAoKFhHSWJpb3NfbW9kZVtteWluZGV4XS55cmVzID09IDc2OCkgJiYKLQkJCQkgICAgKFhHSWh3X2V4dC51bENSVDJMQ0RUeXBlICE9IExDRF8xMjgweDc2OCkpCisJCQkJICAgIChod19pbmZvLT51bENSVDJMQ0RUeXBlICE9IExDRF8xMjgweDc2OCkpCiAJCQkJCXJldHVybiAtMTsKIAkJCQlicmVhazsKIAkJCWNhc2UgMTQwMDoKQEAgLTc0Nyw3ICs2NjYsNyBAQAogCQkJCSAgICAoWEdJYmlvc19tb2RlW215aW5kZXhdLnlyZXMgIT0gMTAyNCkpCiAJCQkJCXJldHVybiAtMTsKIAkJCQlpZiAoWEdJYmlvc19tb2RlW215aW5kZXhdLnlyZXMgPT0gOTYwKSB7Ci0JCQkJCWlmIChYR0lod19leHQudWxDUlQyTENEVHlwZSA9PQorCQkJCQlpZiAoaHdfaW5mby0+dWxDUlQyTENEVHlwZSA9PQogCQkJCQkgICAgTENEXzE0MDB4MTA1MCkKIAkJCQkJCXJldHVybiAtMTsKIAkJCQl9CkBAIC03NjUsMjggKzY4NCwyOCBAQAogCQkJfQogCQl9CiAJCWJyZWFrOwotCWNhc2UgRElTUFRZUEVfVFY6CisJY2FzZSBYR0lGQl9ESVNQX1RWOgogCQlzd2l0Y2ggKFhHSWJpb3NfbW9kZVtteWluZGV4XS54cmVzKSB7CiAJCWNhc2UgNTEyOgogCQljYXNlIDY0MDoKIAkJY2FzZSA4MDA6CiAJCQlicmVhazsKIAkJY2FzZSA3MjA6Ci0JCQlpZiAoeGdpX3ZpZGVvX2luZm8uVFZfdHlwZSA9PSBUVk1PREVfTlRTQykgeworCQkJaWYgKHhnaWZiX2luZm8tPlRWX3R5cGUgPT0gVFZNT0RFX05UU0MpIHsKIAkJCQlpZiAoWEdJYmlvc19tb2RlW215aW5kZXhdLnlyZXMgIT0gNDgwKQogCQkJCQlyZXR1cm4gLTE7Ci0JCQl9IGVsc2UgaWYgKHhnaV92aWRlb19pbmZvLlRWX3R5cGUgPT0gVFZNT0RFX1BBTCkgeworCQkJfSBlbHNlIGlmICh4Z2lmYl9pbmZvLT5UVl90eXBlID09IFRWTU9ERV9QQUwpIHsKIAkJCQlpZiAoWEdJYmlvc19tb2RlW215aW5kZXhdLnlyZXMgIT0gNTc2KQogCQkJCQlyZXR1cm4gLTE7CiAJCQl9CiAJCQkvKiAgVFc6IExWRFMvQ0hST05URUwgZG9lcyBub3Qgc3VwcG9ydCA3MjAgKi8KLQkJCWlmICh4Z2lfdmlkZW9faW5mby5oYXNWQiA9PSBIQVNWQl9MVkRTX0NIUk9OVEVMIHx8Ci0JCQkgICAgeGdpX3ZpZGVvX2luZm8uaGFzVkIgPT0gSEFTVkJfQ0hST05URUwpIHsKKwkJCWlmICh4Z2lmYl9pbmZvLT5oYXNWQiA9PSBIQVNWQl9MVkRTX0NIUk9OVEVMIHx8CisJCQkgICAgeGdpZmJfaW5mby0+aGFzVkIgPT0gSEFTVkJfQ0hST05URUwpIHsKIAkJCQlyZXR1cm4gLTE7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSAxMDI0OgotCQkJaWYgKHhnaV92aWRlb19pbmZvLlRWX3R5cGUgPT0gVFZNT0RFX05UU0MpIHsKKwkJCWlmICh4Z2lmYl9pbmZvLT5UVl90eXBlID09IFRWTU9ERV9OVFNDKSB7CiAJCQkJaWYgKFhHSWJpb3NfbW9kZVtteWluZGV4XS5icHAgPT0gMzIpCiAJCQkJCXJldHVybiAtMTsKIAkJCX0KQEAgLTc5NSwxMCArNzE0LDEyIEBACiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJYnJlYWs7Ci0JY2FzZSBESVNQVFlQRV9DUlQyOgorCWNhc2UgWEdJRkJfRElTUF9DUlQ6CiAJCWlmIChYR0liaW9zX21vZGVbbXlpbmRleF0ueHJlcyA+IDEyODApCiAJCQlyZXR1cm4gLTE7CiAJCWJyZWFrOworCWNhc2UgWEdJRkJfRElTUF9OT05FOgorCQlicmVhazsKIAl9CiAJcmV0dXJuIG15aW5kZXg7CiAKQEAgLTgyMyw0OSArNzQ0LDUyIEBACiAJCXByaW50ayhLRVJOX0lORk8gIlhHSWZiOiBJbnZhbGlkIENSVDIgdHlwZTogJXNcbiIsIG5hbWUpOwogfQogCi1zdGF0aWMgdTggWEdJZmJfc2VhcmNoX3JlZnJlc2hfcmF0ZSh1bnNpZ25lZCBpbnQgcmF0ZSkKK3N0YXRpYyB1OCBYR0lmYl9zZWFyY2hfcmVmcmVzaF9yYXRlKHN0cnVjdCB4Z2lmYl92aWRlb19pbmZvICp4Z2lmYl9pbmZvLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgcmF0ZSkKIHsKIAl1MTYgeHJlcywgeXJlczsKIAlpbnQgaSA9IDA7CiAKLQl4cmVzID0gWEdJYmlvc19tb2RlW3hnaWZiX21vZGVfaWR4XS54cmVzOwotCXlyZXMgPSBYR0liaW9zX21vZGVbeGdpZmJfbW9kZV9pZHhdLnlyZXM7CisJeHJlcyA9IFhHSWJpb3NfbW9kZVt4Z2lmYl9pbmZvLT5tb2RlX2lkeF0ueHJlczsKKwl5cmVzID0gWEdJYmlvc19tb2RlW3hnaWZiX2luZm8tPm1vZGVfaWR4XS55cmVzOwogCi0JWEdJZmJfcmF0ZV9pZHggPSAwOworCXhnaWZiX2luZm8tPnJhdGVfaWR4ID0gMDsKIAl3aGlsZSAoKFhHSWZiX3ZyYXRlW2ldLmlkeCAhPSAwKSAmJiAoWEdJZmJfdnJhdGVbaV0ueHJlcyA8PSB4cmVzKSkgewogCQlpZiAoKFhHSWZiX3ZyYXRlW2ldLnhyZXMgPT0geHJlcykgJiYKIAkJICAgIChYR0lmYl92cmF0ZVtpXS55cmVzID09IHlyZXMpKSB7CiAJCQlpZiAoWEdJZmJfdnJhdGVbaV0ucmVmcmVzaCA9PSByYXRlKSB7Ci0JCQkJWEdJZmJfcmF0ZV9pZHggPSBYR0lmYl92cmF0ZVtpXS5pZHg7CisJCQkJeGdpZmJfaW5mby0+cmF0ZV9pZHggPSBYR0lmYl92cmF0ZVtpXS5pZHg7CiAJCQkJYnJlYWs7CiAJCQl9IGVsc2UgaWYgKFhHSWZiX3ZyYXRlW2ldLnJlZnJlc2ggPiByYXRlKSB7CiAJCQkJaWYgKChYR0lmYl92cmF0ZVtpXS5yZWZyZXNoIC0gcmF0ZSkgPD0gMykgewogCQkJCQlEUFJJTlRLKCJYR0lmYjogQWRqdXN0aW5nIHJhdGUgZnJvbSAlZCB1cCB0byAlZFxuIiwKIAkJCQkJCXJhdGUsIFhHSWZiX3ZyYXRlW2ldLnJlZnJlc2gpOwotCQkJCQlYR0lmYl9yYXRlX2lkeCA9IFhHSWZiX3ZyYXRlW2ldLmlkeDsKLQkJCQkJeGdpX3ZpZGVvX2luZm8ucmVmcmVzaF9yYXRlID0KKwkJCQkJeGdpZmJfaW5mby0+cmF0ZV9pZHggPQorCQkJCQkJWEdJZmJfdnJhdGVbaV0uaWR4OworCQkJCQl4Z2lmYl9pbmZvLT5yZWZyZXNoX3JhdGUgPQogCQkJCQkJWEdJZmJfdnJhdGVbaV0ucmVmcmVzaDsKIAkJCQl9IGVsc2UgaWYgKCgocmF0ZSAtIFhHSWZiX3ZyYXRlW2kgLSAxXS5yZWZyZXNoKQogCQkJCQkJPD0gMikgJiYgKFhHSWZiX3ZyYXRlW2ldLmlkeAogCQkJCQkJIT0gMSkpIHsKIAkJCQkJRFBSSU5USygiWEdJZmI6IEFkanVzdGluZyByYXRlIGZyb20gJWQgZG93biB0byAlZFxuIiwKIAkJCQkJCXJhdGUsIFhHSWZiX3ZyYXRlW2ktMV0ucmVmcmVzaCk7Ci0JCQkJCVhHSWZiX3JhdGVfaWR4ID0gWEdJZmJfdnJhdGVbaSAtIDFdLmlkeDsKLQkJCQkJeGdpX3ZpZGVvX2luZm8ucmVmcmVzaF9yYXRlID0KKwkJCQkJeGdpZmJfaW5mby0+cmF0ZV9pZHggPQorCQkJCQkJWEdJZmJfdnJhdGVbaSAtIDFdLmlkeDsKKwkJCQkJeGdpZmJfaW5mby0+cmVmcmVzaF9yYXRlID0KIAkJCQkJCVhHSWZiX3ZyYXRlW2kgLSAxXS5yZWZyZXNoOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCX0gZWxzZSBpZiAoKHJhdGUgLSBYR0lmYl92cmF0ZVtpXS5yZWZyZXNoKSA8PSAyKSB7CiAJCQkJRFBSSU5USygiWEdJZmI6IEFkanVzdGluZyByYXRlIGZyb20gJWQgZG93biB0byAlZFxuIiwKIAkJCQkJcmF0ZSwgWEdJZmJfdnJhdGVbaV0ucmVmcmVzaCk7Ci0JCQkJWEdJZmJfcmF0ZV9pZHggPSBYR0lmYl92cmF0ZVtpXS5pZHg7CisJCQkJeGdpZmJfaW5mby0+cmF0ZV9pZHggPSBYR0lmYl92cmF0ZVtpXS5pZHg7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAkJaSsrOwogCX0KLQlpZiAoWEdJZmJfcmF0ZV9pZHggPiAwKSB7Ci0JCXJldHVybiBYR0lmYl9yYXRlX2lkeDsKKwlpZiAoeGdpZmJfaW5mby0+cmF0ZV9pZHggPiAwKSB7CisJCXJldHVybiB4Z2lmYl9pbmZvLT5yYXRlX2lkeDsKIAl9IGVsc2UgewogCQlwcmludGsoS0VSTl9JTkZPICJYR0lmYjogVW5zdXBwb3J0ZWQgcmF0ZSAlZCBmb3IgJWR4JWRcbiIsCiAJCSAgICAgICByYXRlLCB4cmVzLCB5cmVzKTsKQEAgLTg5MSwxMyArODE1LDE0IEBACiAKIC8qIC0tLS0tLS0tLS0tIEZCRGV2IHJlbGF0ZWQgcm91dGluZXMgZm9yIGFsbCBzZXJpZXMgLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIHZvaWQgWEdJZmJfYnBwX3RvX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKK3N0YXRpYyB2b2lkIFhHSWZiX2JwcF90b192YXIoc3RydWN0IHhnaWZiX3ZpZGVvX2luZm8gKnhnaWZiX2luZm8sCisJCQkgICAgIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQogewogCXN3aXRjaCAodmFyLT5iaXRzX3Blcl9waXhlbCkgewogCWNhc2UgODoKIAkJdmFyLT5yZWQub2Zmc2V0ID0gdmFyLT5ncmVlbi5vZmZzZXQgPSB2YXItPmJsdWUub2Zmc2V0ID0gMDsKIAkJdmFyLT5yZWQubGVuZ3RoID0gdmFyLT5ncmVlbi5sZW5ndGggPSB2YXItPmJsdWUubGVuZ3RoID0gNjsKLQkJeGdpX3ZpZGVvX2luZm8udmlkZW9fY21hcF9sZW4gPSAyNTY7CisJCXhnaWZiX2luZm8tPnZpZGVvX2NtYXBfbGVuID0gMjU2OwogCQlicmVhazsKIAljYXNlIDE2OgogCQl2YXItPnJlZC5vZmZzZXQgPSAxMTsKQEAgLTkwOCw3ICs4MzMsNyBAQAogCQl2YXItPmJsdWUubGVuZ3RoID0gNTsKIAkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMDsKIAkJdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKLQkJeGdpX3ZpZGVvX2luZm8udmlkZW9fY21hcF9sZW4gPSAxNjsKKwkJeGdpZmJfaW5mby0+dmlkZW9fY21hcF9sZW4gPSAxNjsKIAkJYnJlYWs7CiAJY2FzZSAzMjoKIAkJdmFyLT5yZWQub2Zmc2V0ID0gMTY7CkBAIC05MTksNDUgKzg0NCw0NSBAQAogCQl2YXItPmJsdWUubGVuZ3RoID0gODsKIAkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMjQ7CiAJCXZhci0+dHJhbnNwLmxlbmd0aCA9IDg7Ci0JCXhnaV92aWRlb19pbmZvLnZpZGVvX2NtYXBfbGVuID0gMTY7CisJCXhnaWZiX2luZm8tPnZpZGVvX2NtYXBfbGVuID0gMTY7CiAJCWJyZWFrOwogCX0KIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFNldE1vZGUgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgdm9pZCBYR0lmYl9wcmVfc2V0bW9kZSh2b2lkKQorc3RhdGljIHZvaWQgWEdJZmJfcHJlX3NldG1vZGUoc3RydWN0IHhnaWZiX3ZpZGVvX2luZm8gKnhnaWZiX2luZm8pCiB7CiAJdTggY3IzMCA9IDAsIGNyMzEgPSAwOwogCiAJY3IzMSA9IHhnaWZiX3JlZ19nZXQoWEdJQ1IsIDB4MzEpOwogCWNyMzEgJj0gfjB4NjA7CiAKLQlzd2l0Y2ggKHhnaV92aWRlb19pbmZvLmRpc3Bfc3RhdGUgJiBESVNQVFlQRV9ESVNQMikgewotCWNhc2UgRElTUFRZUEVfQ1JUMjoKKwlzd2l0Y2ggKHhnaWZiX2luZm8tPmRpc3BsYXkyKSB7CisJY2FzZSBYR0lGQl9ESVNQX0NSVDoKIAkJY3IzMCA9IChYR0lfVkJfT1VUUFVUX0NSVDIgfCBYR0lfU0lNVUxUQU5FT1VTX1ZJRVdfRU5BQkxFKTsKIAkJY3IzMSB8PSBYR0lfRFJJVkVSX01PREU7CiAJCWJyZWFrOwotCWNhc2UgRElTUFRZUEVfTENEOgorCWNhc2UgWEdJRkJfRElTUF9MQ0Q6CiAJCWNyMzAgPSAoWEdJX1ZCX09VVFBVVF9MQ0QgfCBYR0lfU0lNVUxUQU5FT1VTX1ZJRVdfRU5BQkxFKTsKIAkJY3IzMSB8PSBYR0lfRFJJVkVSX01PREU7CiAJCWJyZWFrOwotCWNhc2UgRElTUFRZUEVfVFY6Ci0JCWlmICh4Z2lfdmlkZW9faW5mby5UVl90eXBlID09IFRWTU9ERV9ISVZJU0lPTikKKwljYXNlIFhHSUZCX0RJU1BfVFY6CisJCWlmICh4Z2lmYl9pbmZvLT5UVl90eXBlID09IFRWTU9ERV9ISVZJU0lPTikKIAkJCWNyMzAgPSAoWEdJX1ZCX09VVFBVVF9ISVZJU0lPTgogCQkJCQl8IFhHSV9TSU1VTFRBTkVPVVNfVklFV19FTkFCTEUpOwotCQllbHNlIGlmICh4Z2lfdmlkZW9faW5mby5UVl9wbHVnID09IFRWUExVR19TVklERU8pCisJCWVsc2UgaWYgKHhnaWZiX2luZm8tPlRWX3BsdWcgPT0gVFZQTFVHX1NWSURFTykKIAkJCWNyMzAgPSAoWEdJX1ZCX09VVFBVVF9TVklERU8KIAkJCQkJfCBYR0lfU0lNVUxUQU5FT1VTX1ZJRVdfRU5BQkxFKTsKLQkJZWxzZSBpZiAoeGdpX3ZpZGVvX2luZm8uVFZfcGx1ZyA9PSBUVlBMVUdfQ09NUE9TSVRFKQorCQllbHNlIGlmICh4Z2lmYl9pbmZvLT5UVl9wbHVnID09IFRWUExVR19DT01QT1NJVEUpCiAJCQljcjMwID0gKFhHSV9WQl9PVVRQVVRfQ09NUE9TSVRFCiAJCQkJCXwgWEdJX1NJTVVMVEFORU9VU19WSUVXX0VOQUJMRSk7Ci0JCWVsc2UgaWYgKHhnaV92aWRlb19pbmZvLlRWX3BsdWcgPT0gVFZQTFVHX1NDQVJUKQorCQllbHNlIGlmICh4Z2lmYl9pbmZvLT5UVl9wbHVnID09IFRWUExVR19TQ0FSVCkKIAkJCWNyMzAgPSAoWEdJX1ZCX09VVFBVVF9TQ0FSVAogCQkJCQl8IFhHSV9TSU1VTFRBTkVPVVNfVklFV19FTkFCTEUpOwogCQljcjMxIHw9IFhHSV9EUklWRVJfTU9ERTsKIAotCQlpZiAoWEdJZmJfdHZtb2RlID09IDEgfHwgeGdpX3ZpZGVvX2luZm8uVFZfdHlwZSA9PSBUVk1PREVfUEFMKQorCQlpZiAoWEdJZmJfdHZtb2RlID09IDEgfHwgeGdpZmJfaW5mby0+VFZfdHlwZSA9PSBUVk1PREVfUEFMKQogCQkJY3IzMSB8PSAweDAxOwogCQllbHNlCiAJCQljcjMxICY9IH4weDAxOwpAQCAtOTY5LDEwICs4OTQsMTEgQEAKIAogCXhnaWZiX3JlZ19zZXQoWEdJQ1IsIElORF9YR0lfU0NSQVRDSF9SRUdfQ1IzMCwgY3IzMCk7CiAJeGdpZmJfcmVnX3NldChYR0lDUiwgSU5EX1hHSV9TQ1JBVENIX1JFR19DUjMxLCBjcjMxKTsKLQl4Z2lmYl9yZWdfc2V0KFhHSUNSLCBJTkRfWEdJX1NDUkFUQ0hfUkVHX0NSMzMsIChYR0lmYl9yYXRlX2lkeCAmIDB4MEYpKTsKKwl4Z2lmYl9yZWdfc2V0KFhHSUNSLCBJTkRfWEdJX1NDUkFUQ0hfUkVHX0NSMzMsCisJCQkJCQkoeGdpZmJfaW5mby0+cmF0ZV9pZHggJiAweDBGKSk7CiB9CiAKLXN0YXRpYyB2b2lkIFhHSWZiX3Bvc3Rfc2V0bW9kZSh2b2lkKQorc3RhdGljIHZvaWQgWEdJZmJfcG9zdF9zZXRtb2RlKHN0cnVjdCB4Z2lmYl92aWRlb19pbmZvICp4Z2lmYl9pbmZvKQogewogCXU4IHJlZzsKIAl1bnNpZ25lZCBjaGFyIGRvaXQgPSAxOwpAQCAtOTgyLDIxICs5MDgsMjEgQEAKIAl4Z2lmYl9yZWdfYW5kX29yKFhHSVNSLDB4MEUsIDB4RjAsIDB4MDEpOwogCSp0ZXN0KgogCSovCi0JaWYgKHhnaV92aWRlb19pbmZvLnZpZGVvX2JwcCA9PSA4KSB7CisJaWYgKHhnaWZiX2luZm8tPnZpZGVvX2JwcCA9PSA4KSB7CiAJCS8qIFRXOiBXZSBjYW4ndCBzd2l0Y2ggb2ZmIENSVDEgb24gTFZEUy9DaHJvbnRlbAogCQkgKiBpbiA4YnBwIE1vZGVzICovCi0JCWlmICgoeGdpX3ZpZGVvX2luZm8uaGFzVkIgPT0gSEFTVkJfTFZEUykgfHwKLQkJICAgICh4Z2lfdmlkZW9faW5mby5oYXNWQiA9PSBIQVNWQl9MVkRTX0NIUk9OVEVMKSkgeworCQlpZiAoKHhnaWZiX2luZm8tPmhhc1ZCID09IEhBU1ZCX0xWRFMpIHx8CisJCSAgICAoeGdpZmJfaW5mby0+aGFzVkIgPT0gSEFTVkJfTFZEU19DSFJPTlRFTCkpIHsKIAkJCWRvaXQgPSAwOwogCQl9CiAJCS8qIFRXOiBXZSBjYW4ndCBzd2l0Y2ggb2ZmIENSVDEgb24gMzAxQi1ESAogCQkgKiBpbiA4YnBwIE1vZGVzIGlmIHVzaW5nIExDRCAqLwotCQlpZiAoeGdpX3ZpZGVvX2luZm8uZGlzcF9zdGF0ZSAmIERJU1BUWVBFX0xDRCkKKwkJaWYgKHhnaWZiX2luZm8tPmRpc3BsYXkyID09IFhHSUZCX0RJU1BfTENEKQogCQkJZG9pdCA9IDA7CiAJfQogCiAJLyogVFc6IFdlIGNhbid0IHN3aXRjaCBvZmYgQ1JUMSBpZiBicmlkZ2UgaXMgaW4gc2xhdmUgbW9kZSAqLwotCWlmICh4Z2lfdmlkZW9faW5mby5oYXNWQiAhPSBIQVNWQl9OT05FKSB7CisJaWYgKHhnaWZiX2luZm8tPmhhc1ZCICE9IEhBU1ZCX05PTkUpIHsKIAkJcmVnID0geGdpZmJfcmVnX2dldChYR0lQQVJUMSwgMHgwMCk7CiAKIAkJaWYgKChyZWcgJiAweDUwKSA9PSAweDEwKQpAQCAtMTAxNSw0OSArOTQxLDU0IEBACiAKIAl4Z2lmYl9yZWdfYW5kKFhHSVNSLCBJTkRfWEdJX1JBTURBQ19DT05UUk9MLCB+MHgwNCk7CiAKLQlpZiAoKHhnaV92aWRlb19pbmZvLmRpc3Bfc3RhdGUgJiBESVNQVFlQRV9UVikgJiYgKHhnaV92aWRlb19pbmZvLmhhc1ZCCi0JCQk9PSBIQVNWQl8zMDEpKSB7CisJaWYgKHhnaWZiX2luZm8tPmRpc3BsYXkyID09IFhHSUZCX0RJU1BfVFYgJiYKKwkgICAgeGdpZmJfaW5mby0+aGFzVkIgPT0gSEFTVkJfMzAxKSB7CiAKIAkJcmVnID0geGdpZmJfcmVnX2dldChYR0lQQVJUNCwgMHgwMSk7CiAKIAkJaWYgKHJlZyA8IDB4QjApIHsgLyogU2V0IGZpbHRlciBmb3IgWEdJMzAxICovCi0JCQlzd2l0Y2ggKHhnaV92aWRlb19pbmZvLnZpZGVvX3dpZHRoKSB7CisJCQlpbnQgZmlsdGVyX3RiOworCisJCQlzd2l0Y2ggKHhnaWZiX2luZm8tPnZpZGVvX3dpZHRoKSB7CiAJCQljYXNlIDMyMDoKLQkJCQlmaWx0ZXJfdGIgPSAoeGdpX3ZpZGVvX2luZm8uVFZfdHlwZSA9PQorCQkJCWZpbHRlcl90YiA9ICh4Z2lmYl9pbmZvLT5UVl90eXBlID09CiAJCQkJCSAgICAgVFZNT0RFX05UU0MpID8gNCA6IDEyOwogCQkJCWJyZWFrOwogCQkJY2FzZSA2NDA6Ci0JCQkJZmlsdGVyX3RiID0gKHhnaV92aWRlb19pbmZvLlRWX3R5cGUgPT0KKwkJCQlmaWx0ZXJfdGIgPSAoeGdpZmJfaW5mby0+VFZfdHlwZSA9PQogCQkJCQkgICAgIFRWTU9ERV9OVFNDKSA/IDUgOiAxMzsKIAkJCQlicmVhazsKIAkJCWNhc2UgNzIwOgotCQkJCWZpbHRlcl90YiA9ICh4Z2lfdmlkZW9faW5mby5UVl90eXBlID09CisJCQkJZmlsdGVyX3RiID0gKHhnaWZiX2luZm8tPlRWX3R5cGUgPT0KIAkJCQkJICAgICBUVk1PREVfTlRTQykgPyA2IDogMTQ7CiAJCQkJYnJlYWs7CiAJCQljYXNlIDgwMDoKLQkJCQlmaWx0ZXJfdGIgPSAoeGdpX3ZpZGVvX2luZm8uVFZfdHlwZSA9PQorCQkJCWZpbHRlcl90YiA9ICh4Z2lmYl9pbmZvLT5UVl90eXBlID09CiAJCQkJCSAgICAgVFZNT0RFX05UU0MpID8gNyA6IDE1OwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKKwkJCQlmaWx0ZXJfdGIgPSAwOwogCQkJCWZpbHRlciA9IC0xOwogCQkJCWJyZWFrOwogCQkJfQotCQkJeGdpZmJfcmVnX29yKFhHSVBBUlQxLCBYR0lmYl9DUlQyX3dyaXRlX2VuYWJsZSwgMHgwMSk7CisJCQl4Z2lmYl9yZWdfb3IoWEdJUEFSVDEsCisJCQkJICAgICBJTkRfWEdJX0NSVDJfV1JJVEVfRU5BQkxFXzMxNSwKKwkJCQkgICAgIDB4MDEpOwogCi0JCQlpZiAoeGdpX3ZpZGVvX2luZm8uVFZfdHlwZSA9PSBUVk1PREVfTlRTQykgeworCQkJaWYgKHhnaWZiX2luZm8tPlRWX3R5cGUgPT0gVFZNT0RFX05UU0MpIHsKIAogCQkJCXhnaWZiX3JlZ19hbmQoWEdJUEFSVDIsIDB4M2EsIDB4MWYpOwogCi0JCQkJaWYgKHhnaV92aWRlb19pbmZvLlRWX3BsdWcgPT0gVFZQTFVHX1NWSURFTykgeworCQkJCWlmICh4Z2lmYl9pbmZvLT5UVl9wbHVnID09IFRWUExVR19TVklERU8pIHsKIAogCQkJCQl4Z2lmYl9yZWdfYW5kKFhHSVBBUlQyLCAweDMwLCAweGRmKTsKIAotCQkJCX0gZWxzZSBpZiAoeGdpX3ZpZGVvX2luZm8uVFZfcGx1ZworCQkJCX0gZWxzZSBpZiAoeGdpZmJfaW5mby0+VFZfcGx1ZwogCQkJCQkJPT0gVFZQTFVHX0NPTVBPU0lURSkgewogCiAJCQkJCXhnaWZiX3JlZ19vcihYR0lQQVJUMiwgMHgzMCwgMHgyMCk7CiAKLQkJCQkJc3dpdGNoICh4Z2lfdmlkZW9faW5mby52aWRlb193aWR0aCkgeworCQkJCQlzd2l0Y2ggKHhnaWZiX2luZm8tPnZpZGVvX3dpZHRoKSB7CiAJCQkJCWNhc2UgNjQwOgogCQkJCQkJeGdpZmJfcmVnX3NldChYR0lQQVJUMiwKIAkJCQkJCQkgICAgICAweDM1LApAQCAtMTEwMywyMCArMTAzNCwyMCBAQAogCQkJCQl9CiAJCQkJfQogCi0JCQl9IGVsc2UgaWYgKHhnaV92aWRlb19pbmZvLlRWX3R5cGUgPT0gVFZNT0RFX1BBTCkgeworCQkJfSBlbHNlIGlmICh4Z2lmYl9pbmZvLT5UVl90eXBlID09IFRWTU9ERV9QQUwpIHsKIAogCQkJCXhnaWZiX3JlZ19hbmQoWEdJUEFSVDIsIDB4M0EsIDB4MUYpOwogCi0JCQkJaWYgKHhnaV92aWRlb19pbmZvLlRWX3BsdWcgPT0gVFZQTFVHX1NWSURFTykgeworCQkJCWlmICh4Z2lmYl9pbmZvLT5UVl9wbHVnID09IFRWUExVR19TVklERU8pIHsKIAogCQkJCQl4Z2lmYl9yZWdfYW5kKFhHSVBBUlQyLCAweDMwLCAweERGKTsKIAotCQkJCX0gZWxzZSBpZiAoeGdpX3ZpZGVvX2luZm8uVFZfcGx1ZworCQkJCX0gZWxzZSBpZiAoeGdpZmJfaW5mby0+VFZfcGx1ZwogCQkJCQkJPT0gVFZQTFVHX0NPTVBPU0lURSkgewogCiAJCQkJCXhnaWZiX3JlZ19vcihYR0lQQVJUMiwgMHgzMCwgMHgyMCk7CiAKLQkJCQkJc3dpdGNoICh4Z2lfdmlkZW9faW5mby52aWRlb193aWR0aCkgeworCQkJCQlzd2l0Y2ggKHhnaWZiX2luZm8tPnZpZGVvX3dpZHRoKSB7CiAJCQkJCWNhc2UgNjQwOgogCQkJCQkJeGdpZmJfcmVnX3NldChYR0lQQVJUMiwKIAkJCQkJCQkgICAgICAweDM1LApAQCAtMTIwMyw3ICsxMTM0LDggQEAKIHN0YXRpYyBpbnQgWEdJZmJfZG9fc2V0X3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgaW50IGlzYWN0aXZlLAogCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKLQorCXN0cnVjdCB4Z2lmYl92aWRlb19pbmZvICp4Z2lmYl9pbmZvID0gaW5mby0+cGFyOworCXN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKmh3X2luZm8gPSAmeGdpZmJfaW5mby0+aHdfaW5mbzsKIAl1bnNpZ25lZCBpbnQgaHRvdGFsID0gdmFyLT5sZWZ0X21hcmdpbiArIHZhci0+eHJlcyArIHZhci0+cmlnaHRfbWFyZ2luCiAJCQkrIHZhci0+aHN5bmNfbGVuOwogCXVuc2lnbmVkIGludCB2dG90YWwgPSB2YXItPnVwcGVyX21hcmdpbiArIHZhci0+eXJlcyArIHZhci0+bG93ZXJfbWFyZ2luCkBAIC0xMjQxLDU4ICsxMTczLDYxIEBACiAJaWYgKHZhci0+cGl4Y2xvY2sgJiYgaHRvdGFsICYmIHZ0b3RhbCkgewogCQlkcmF0ZSA9IDEwMDAwMDAwMDAgLyB2YXItPnBpeGNsb2NrOwogCQlocmF0ZSA9IChkcmF0ZSAqIDEwMDApIC8gaHRvdGFsOwotCQl4Z2lfdmlkZW9faW5mby5yZWZyZXNoX3JhdGUgPSAodW5zaWduZWQgaW50KSAoaHJhdGUgKiAyCisJCXhnaWZiX2luZm8tPnJlZnJlc2hfcmF0ZSA9ICh1bnNpZ25lZCBpbnQpIChocmF0ZSAqIDIKIAkJCQkvIHZ0b3RhbCk7CiAJfSBlbHNlIHsKLQkJeGdpX3ZpZGVvX2luZm8ucmVmcmVzaF9yYXRlID0gNjA7CisJCXhnaWZiX2luZm8tPnJlZnJlc2hfcmF0ZSA9IDYwOwogCX0KIAogCXByaW50ayhLRVJOX0RFQlVHICJYR0lmYjogQ2hhbmdlIG1vZGUgdG8gJWR4JWR4JWQtJWRIelxuIiwKIAkgICAgICAgdmFyLT54cmVzLAogCSAgICAgICB2YXItPnlyZXMsCiAJICAgICAgIHZhci0+Yml0c19wZXJfcGl4ZWwsCi0JICAgICAgIHhnaV92aWRlb19pbmZvLnJlZnJlc2hfcmF0ZSk7CisJICAgICAgIHhnaWZiX2luZm8tPnJlZnJlc2hfcmF0ZSk7CiAKLQlvbGRfbW9kZSA9IHhnaWZiX21vZGVfaWR4OwotCXhnaWZiX21vZGVfaWR4ID0gMDsKKwlvbGRfbW9kZSA9IHhnaWZiX2luZm8tPm1vZGVfaWR4OworCXhnaWZiX2luZm8tPm1vZGVfaWR4ID0gMDsKIAotCXdoaWxlICgoWEdJYmlvc19tb2RlW3hnaWZiX21vZGVfaWR4XS5tb2RlX25vICE9IDApCi0JCQkmJiAoWEdJYmlvc19tb2RlW3hnaWZiX21vZGVfaWR4XS54cmVzIDw9IHZhci0+eHJlcykpIHsKLQkJaWYgKChYR0liaW9zX21vZGVbeGdpZmJfbW9kZV9pZHhdLnhyZXMgPT0gdmFyLT54cmVzKQotCQkJCSYmIChYR0liaW9zX21vZGVbeGdpZmJfbW9kZV9pZHhdLnlyZXMKLQkJCQkJCT09IHZhci0+eXJlcykKLQkJCQkmJiAoWEdJYmlvc19tb2RlW3hnaWZiX21vZGVfaWR4XS5icHAKKwl3aGlsZSAoKFhHSWJpb3NfbW9kZVt4Z2lmYl9pbmZvLT5tb2RlX2lkeF0ubW9kZV9ubyAhPSAwKSAmJgorCSAgICAgICAoWEdJYmlvc19tb2RlW3hnaWZiX2luZm8tPm1vZGVfaWR4XS54cmVzIDw9IHZhci0+eHJlcykpIHsKKwkJaWYgKChYR0liaW9zX21vZGVbeGdpZmJfaW5mby0+bW9kZV9pZHhdLnhyZXMgPT0gdmFyLT54cmVzKSAmJgorCQkgICAgKFhHSWJpb3NfbW9kZVt4Z2lmYl9pbmZvLT5tb2RlX2lkeF0ueXJlcyA9PSB2YXItPnlyZXMpICYmCisJCSAgICAoWEdJYmlvc19tb2RlW3hnaWZiX2luZm8tPm1vZGVfaWR4XS5icHAKIAkJCQkJCT09IHZhci0+Yml0c19wZXJfcGl4ZWwpKSB7Ci0JCQlYR0lmYl9tb2RlX25vID0gWEdJYmlvc19tb2RlW3hnaWZiX21vZGVfaWR4XS5tb2RlX25vOwogCQkJZm91bmRfbW9kZSA9IDE7CiAJCQlicmVhazsKIAkJfQotCQl4Z2lmYl9tb2RlX2lkeCsrOworCQl4Z2lmYl9pbmZvLT5tb2RlX2lkeCsrOwogCX0KIAogCWlmIChmb3VuZF9tb2RlKQotCQl4Z2lmYl9tb2RlX2lkeCA9IFhHSWZiX3ZhbGlkYXRlX21vZGUoeGdpZmJfbW9kZV9pZHgpOworCQl4Z2lmYl9pbmZvLT5tb2RlX2lkeCA9IFhHSWZiX3ZhbGlkYXRlX21vZGUoeGdpZmJfaW5mbywKKwkJCQkJCQl4Z2lmYl9pbmZvLT5tb2RlX2lkeCk7CiAJZWxzZQotCQl4Z2lmYl9tb2RlX2lkeCA9IC0xOworCQl4Z2lmYl9pbmZvLT5tb2RlX2lkeCA9IC0xOwogCi0JaWYgKHhnaWZiX21vZGVfaWR4IDwgMCkgeworCWlmICh4Z2lmYl9pbmZvLT5tb2RlX2lkeCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJYR0lmYjogTW9kZSAlZHglZHglZCBub3Qgc3VwcG9ydGVkXG4iLAogCQkgICAgICAgdmFyLT54cmVzLCB2YXItPnlyZXMsIHZhci0+Yml0c19wZXJfcGl4ZWwpOwotCQl4Z2lmYl9tb2RlX2lkeCA9IG9sZF9tb2RlOworCQl4Z2lmYl9pbmZvLT5tb2RlX2lkeCA9IG9sZF9tb2RlOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoWEdJZmJfc2VhcmNoX3JlZnJlc2hfcmF0ZSh4Z2lfdmlkZW9faW5mby5yZWZyZXNoX3JhdGUpID09IDApIHsKLQkJWEdJZmJfcmF0ZV9pZHggPSBYR0liaW9zX21vZGVbeGdpZmJfbW9kZV9pZHhdLnJhdGVfaWR4OwotCQl4Z2lfdmlkZW9faW5mby5yZWZyZXNoX3JhdGUgPSA2MDsKKwlpZiAoWEdJZmJfc2VhcmNoX3JlZnJlc2hfcmF0ZSh4Z2lmYl9pbmZvLAorCQkJCSAgICAgIHhnaWZiX2luZm8tPnJlZnJlc2hfcmF0ZSkgPT0gMCkgeworCQl4Z2lmYl9pbmZvLT5yYXRlX2lkeCA9CisJCQlYR0liaW9zX21vZGVbeGdpZmJfaW5mby0+bW9kZV9pZHhdLnJhdGVfaWR4OworCQl4Z2lmYl9pbmZvLT5yZWZyZXNoX3JhdGUgPSA2MDsKIAl9CiAKIAlpZiAoaXNhY3RpdmUpIHsKIAotCQlYR0lmYl9wcmVfc2V0bW9kZSgpOwotCQlpZiAoWEdJU2V0TW9kZU5ldygmWEdJaHdfZXh0LCBYR0lmYl9tb2RlX25vKSA9PSAwKSB7CisJCVhHSWZiX3ByZV9zZXRtb2RlKHhnaWZiX2luZm8pOworCQlpZiAoWEdJU2V0TW9kZU5ldyhod19pbmZvLAorCQkJCSAgWEdJYmlvc19tb2RlW3hnaWZiX2luZm8tPm1vZGVfaWR4XS5tb2RlX25vKQorCQkJCQk9PSAwKSB7CiAJCQlwcmludGsoS0VSTl9FUlIgIlhHSWZiOiBTZXR0aW5nIG1vZGVbMHgleF0gZmFpbGVkXG4iLAotCQkJICAgICAgIFhHSWZiX21vZGVfbm8pOworCQkJICAgICAgIFhHSWJpb3NfbW9kZVt4Z2lmYl9pbmZvLT5tb2RlX2lkeF0ubW9kZV9ubyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlpbmZvLT5maXgubGluZV9sZW5ndGggPSAoKGluZm8tPnZhci54cmVzX3ZpcnR1YWwKQEAgLTEzMDUsNjYgKzEyNDAsNjggQEAKIAkJCSAgICAgIDB4MEUsCiAJCQkgICAgICAoaW5mby0+Zml4LmxpbmVfbGVuZ3RoICYgMHhmZjAwKSA+PiA4KTsKIAotCQlYR0lmYl9wb3N0X3NldG1vZGUoKTsKKwkJWEdJZmJfcG9zdF9zZXRtb2RlKHhnaWZiX2luZm8pOwogCiAJCURQUklOVEsoIlhHSWZiOiBTZXQgbmV3IG1vZGU6ICVkeCVkeCVkLSVkXG4iLAotCQkJCVhHSWJpb3NfbW9kZVt4Z2lmYl9tb2RlX2lkeF0ueHJlcywKLQkJCQlYR0liaW9zX21vZGVbeGdpZmJfbW9kZV9pZHhdLnlyZXMsCi0JCQkJWEdJYmlvc19tb2RlW3hnaWZiX21vZGVfaWR4XS5icHAsCi0JCQkJeGdpX3ZpZGVvX2luZm8ucmVmcmVzaF9yYXRlKTsKKwkJCQlYR0liaW9zX21vZGVbeGdpZmJfaW5mby0+bW9kZV9pZHhdLnhyZXMsCisJCQkJWEdJYmlvc19tb2RlW3hnaWZiX2luZm8tPm1vZGVfaWR4XS55cmVzLAorCQkJCVhHSWJpb3NfbW9kZVt4Z2lmYl9pbmZvLT5tb2RlX2lkeF0uYnBwLAorCQkJCXhnaWZiX2luZm8tPnJlZnJlc2hfcmF0ZSk7CiAKLQkJeGdpX3ZpZGVvX2luZm8udmlkZW9fYnBwID0gWEdJYmlvc19tb2RlW3hnaWZiX21vZGVfaWR4XS5icHA7Ci0JCXhnaV92aWRlb19pbmZvLnZpZGVvX3Z3aWR0aCA9IGluZm8tPnZhci54cmVzX3ZpcnR1YWw7Ci0JCXhnaV92aWRlb19pbmZvLnZpZGVvX3dpZHRoID0gWEdJYmlvc19tb2RlW3hnaWZiX21vZGVfaWR4XS54cmVzOwotCQl4Z2lfdmlkZW9faW5mby52aWRlb192aGVpZ2h0ID0gaW5mby0+dmFyLnlyZXNfdmlydHVhbDsKLQkJeGdpX3ZpZGVvX2luZm8udmlkZW9faGVpZ2h0ID0gWEdJYmlvc19tb2RlW3hnaWZiX21vZGVfaWR4XS55cmVzOwotCQl4Z2lfdmlkZW9faW5mby5vcmdfeCA9IHhnaV92aWRlb19pbmZvLm9yZ195ID0gMDsKLQkJeGdpX3ZpZGVvX2luZm8udmlkZW9fbGluZWxlbmd0aCA9IGluZm8tPnZhci54cmVzX3ZpcnR1YWwKLQkJCQkqICh4Z2lfdmlkZW9faW5mby52aWRlb19icHAgPj4gMyk7Ci0JCXN3aXRjaCAoeGdpX3ZpZGVvX2luZm8udmlkZW9fYnBwKSB7CisJCXhnaWZiX2luZm8tPnZpZGVvX2JwcCA9IFhHSWJpb3NfbW9kZVt4Z2lmYl9pbmZvLT5tb2RlX2lkeF0uYnBwOworCQl4Z2lmYl9pbmZvLT52aWRlb192d2lkdGggPSBpbmZvLT52YXIueHJlc192aXJ0dWFsOworCQl4Z2lmYl9pbmZvLT52aWRlb193aWR0aCA9CisJCQlYR0liaW9zX21vZGVbeGdpZmJfaW5mby0+bW9kZV9pZHhdLnhyZXM7CisJCXhnaWZiX2luZm8tPnZpZGVvX3ZoZWlnaHQgPSBpbmZvLT52YXIueXJlc192aXJ0dWFsOworCQl4Z2lmYl9pbmZvLT52aWRlb19oZWlnaHQgPQorCQkJWEdJYmlvc19tb2RlW3hnaWZiX2luZm8tPm1vZGVfaWR4XS55cmVzOworCQl4Z2lmYl9pbmZvLT5vcmdfeCA9IHhnaWZiX2luZm8tPm9yZ195ID0gMDsKKwkJeGdpZmJfaW5mby0+dmlkZW9fbGluZWxlbmd0aCA9IGluZm8tPnZhci54cmVzX3ZpcnR1YWwKKwkJCQkqICh4Z2lmYl9pbmZvLT52aWRlb19icHAgPj4gMyk7CisJCXN3aXRjaCAoeGdpZmJfaW5mby0+dmlkZW9fYnBwKSB7CiAJCWNhc2UgODoKLQkJCXhnaV92aWRlb19pbmZvLkRzdENvbG9yID0gMHgwMDAwOwotCQkJeGdpX3ZpZGVvX2luZm8uWEdJMzEwX0FjY2VsRGVwdGggPSAweDAwMDAwMDAwOwotCQkJeGdpX3ZpZGVvX2luZm8udmlkZW9fY21hcF9sZW4gPSAyNTY7CisJCQl4Z2lmYl9pbmZvLT5Ec3RDb2xvciA9IDB4MDAwMDsKKwkJCXhnaWZiX2luZm8tPlhHSTMxMF9BY2NlbERlcHRoID0gMHgwMDAwMDAwMDsKKwkJCXhnaWZiX2luZm8tPnZpZGVvX2NtYXBfbGVuID0gMjU2OwogI2lmIGRlZmluZWQoX19wb3dlcnBjX18pCiAJCQljcl9kYXRhID0geGdpZmJfcmVnX2dldChYR0lDUiwgMHg0RCk7CiAJCQl4Z2lmYl9yZWdfc2V0KFhHSUNSLCAweDRELCAoY3JfZGF0YSAmIDB4RTApKTsKICNlbmRpZgogCQkJYnJlYWs7CiAJCWNhc2UgMTY6Ci0JCQl4Z2lfdmlkZW9faW5mby5Ec3RDb2xvciA9IDB4ODAwMDsKLQkJCXhnaV92aWRlb19pbmZvLlhHSTMxMF9BY2NlbERlcHRoID0gMHgwMDAxMDAwMDsKKwkJCXhnaWZiX2luZm8tPkRzdENvbG9yID0gMHg4MDAwOworCQkJeGdpZmJfaW5mby0+WEdJMzEwX0FjY2VsRGVwdGggPSAweDAwMDEwMDAwOwogI2lmIGRlZmluZWQoX19wb3dlcnBjX18pCiAJCQljcl9kYXRhID0geGdpZmJfcmVnX2dldChYR0lDUiwgMHg0RCk7CiAJCQl4Z2lmYl9yZWdfc2V0KFhHSUNSLCAweDRELCAoKGNyX2RhdGEgJiAweEUwKSB8IDB4MEIpKTsKICNlbmRpZgotCQkJeGdpX3ZpZGVvX2luZm8udmlkZW9fY21hcF9sZW4gPSAxNjsKKwkJCXhnaWZiX2luZm8tPnZpZGVvX2NtYXBfbGVuID0gMTY7CiAJCQlicmVhazsKIAkJY2FzZSAzMjoKLQkJCXhnaV92aWRlb19pbmZvLkRzdENvbG9yID0gMHhDMDAwOwotCQkJeGdpX3ZpZGVvX2luZm8uWEdJMzEwX0FjY2VsRGVwdGggPSAweDAwMDIwMDAwOwotCQkJeGdpX3ZpZGVvX2luZm8udmlkZW9fY21hcF9sZW4gPSAxNjsKKwkJCXhnaWZiX2luZm8tPkRzdENvbG9yID0gMHhDMDAwOworCQkJeGdpZmJfaW5mby0+WEdJMzEwX0FjY2VsRGVwdGggPSAweDAwMDIwMDAwOworCQkJeGdpZmJfaW5mby0+dmlkZW9fY21hcF9sZW4gPSAxNjsKICNpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQogCQkJY3JfZGF0YSA9IHhnaWZiX3JlZ19nZXQoWEdJQ1IsIDB4NEQpOwogCQkJeGdpZmJfcmVnX3NldChYR0lDUiwgMHg0RCwgKChjcl9kYXRhICYgMHhFMCkgfCAweDE1KSk7CiAjZW5kaWYKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJeGdpX3ZpZGVvX2luZm8udmlkZW9fY21hcF9sZW4gPSAxNjsKKwkJCXhnaWZiX2luZm8tPnZpZGVvX2NtYXBfbGVuID0gMTY7CiAJCQlwcmludGsoS0VSTl9FUlIgIlhHSWZiOiBVbnN1cHBvcnRlZCBkZXB0aCAlZCIsCi0JCQkgICAgICAgeGdpX3ZpZGVvX2luZm8udmlkZW9fYnBwKTsKKwkJCSAgICAgICB4Z2lmYl9pbmZvLT52aWRlb19icHApOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0JWEdJZmJfYnBwX3RvX3Zhcih2YXIpOyAvKnVwZGF0ZSBBUkdCIGluZm8qLworCVhHSWZiX2JwcF90b192YXIoeGdpZmJfaW5mbywgdmFyKTsgLyp1cGRhdGUgQVJHQiBpbmZvKi8KIAlERUJVR1BSTigiRW5kIG9mIGRvX3NldF92YXIiKTsKIAogCWR1bXBWR0FSZWcoKTsKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIFhHSUZCX1BBTgotc3RhdGljIGludCBYR0lmYl9wYW5fdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQorc3RhdGljIGludCBYR0lmYl9wYW5fdmFyKHN0cnVjdCB4Z2lmYl92aWRlb19pbmZvICp4Z2lmYl9pbmZvLAorCQkJIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQogewogCXVuc2lnbmVkIGludCBiYXNlOwogCkBAIC0xNDAzLDggKzEzNDAsOCBAQAogCXhnaWZiX3JlZ19zZXQoWEdJU1IsIDB4MzcsIChiYXNlID4+IDI0KSAmIDB4MDMpOwogCXhnaWZiX3JlZ19hbmRfb3IoWEdJU1IsIDB4MzcsIDB4REYsIChiYXNlID4+IDIxKSAmIDB4MDQpOwogCi0JaWYgKHhnaV92aWRlb19pbmZvLmRpc3Bfc3RhdGUgJiBESVNQVFlQRV9ESVNQMikgewotCQl4Z2lmYl9yZWdfb3IoWEdJUEFSVDEsIFhHSWZiX0NSVDJfd3JpdGVfZW5hYmxlLCAweDAxKTsKKwlpZiAoeGdpZmJfaW5mby0+ZGlzcGxheTIgIT0gWEdJRkJfRElTUF9OT05FKSB7CisJCXhnaWZiX3JlZ19vcihYR0lQQVJUMSwgSU5EX1hHSV9DUlQyX1dSSVRFX0VOQUJMRV8zMTUsIDB4MDEpOwogCQl4Z2lmYl9yZWdfc2V0KFhHSVBBUlQxLCAweDA2LCAoYmFzZSAmIDB4RkYpKTsKIAkJeGdpZmJfcmVnX3NldChYR0lQQVJUMSwgMHgwNSwgKChiYXNlID4+IDgpICYgMHhGRikpOwogCQl4Z2lmYl9yZWdfc2V0KFhHSVBBUlQxLCAweDA0LCAoKGJhc2UgPj4gMTYpICYgMHhGRikpOwpAQCAtMTQxNiw3ICsxMzUzLDYgQEAKIAkvKiBwcmludGsoIkVuZCBvZiBwYW5fdmFyIik7ICovCiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKIAogc3RhdGljIGludCBYR0lmYl9vcGVuKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgdXNlcikKIHsKQEAgLTE0NDksNiArMTM4NSw4IEBACiBzdGF0aWMgaW50IFhHSWZiX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwKIAkJdW5zaWduZWQgYmx1ZSwgdW5zaWduZWQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKKwlzdHJ1Y3QgeGdpZmJfdmlkZW9faW5mbyAqeGdpZmJfaW5mbyA9IGluZm8tPnBhcjsKKwogCWlmIChyZWdubyA+PSBYR0lmYl9nZXRfY21hcF9sZW4oJmluZm8tPnZhcikpCiAJCXJldHVybiAxOwogCkBAIC0xNDU4LDcgKzEzOTYsNyBAQAogCQlvdXRiKChyZWQgPj4gMTApLCBYR0lEQUNEKTsKIAkJb3V0YigoZ3JlZW4gPj4gMTApLCBYR0lEQUNEKTsKIAkJb3V0YigoYmx1ZSA+PiAxMCksIFhHSURBQ0QpOwotCQlpZiAoeGdpX3ZpZGVvX2luZm8uZGlzcF9zdGF0ZSAmIERJU1BUWVBFX0RJU1AyKSB7CisJCWlmICh4Z2lmYl9pbmZvLT5kaXNwbGF5MiAhPSBYR0lGQl9ESVNQX05PTkUpIHsKIAkJCW91dGIocmVnbm8sIFhHSURBQzJBKTsKIAkJCW91dGIoKHJlZCA+PiA4KSwgWEdJREFDMkQpOwogCQkJb3V0YigoZ3JlZW4gPj4gOCksIFhHSURBQzJEKTsKQEAgLTE0ODYsMzAgKzE0MjQsMjggQEAKIHN0YXRpYyBpbnQgWEdJZmJfZ2V0X2ZpeChzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8gKmZpeCwgaW50IGNvbiwKIAkJc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CisJc3RydWN0IHhnaWZiX3ZpZGVvX2luZm8gKnhnaWZiX2luZm8gPSBpbmZvLT5wYXI7CisKIAlERUJVR1BSTigiaW5zaWRlIGdldF9maXgiKTsKIAltZW1zZXQoZml4LCAwLCBzaXplb2Yoc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvKSk7CiAKLQlzdHJjcHkoZml4LT5pZCwgbXlpZCk7CisJZml4LT5zbWVtX3N0YXJ0ID0geGdpZmJfaW5mby0+dmlkZW9fYmFzZTsKIAotCWZpeC0+c21lbV9zdGFydCA9IHhnaV92aWRlb19pbmZvLnZpZGVvX2Jhc2U7CisJZml4LT5zbWVtX2xlbiA9IHhnaWZiX2luZm8tPnZpZGVvX3NpemU7CiAKLQlmaXgtPnNtZW1fbGVuID0geGdpX3ZpZGVvX2luZm8udmlkZW9fc2l6ZTsKLQotCWZpeC0+dHlwZSA9IHZpZGVvX3R5cGU7CisJZml4LT50eXBlID0gRkJfVFlQRV9QQUNLRURfUElYRUxTOwogCWZpeC0+dHlwZV9hdXggPSAwOwotCWlmICh4Z2lfdmlkZW9faW5mby52aWRlb19icHAgPT0gOCkKKwlpZiAoeGdpZmJfaW5mby0+dmlkZW9fYnBwID09IDgpCiAJCWZpeC0+dmlzdWFsID0gRkJfVklTVUFMX1BTRVVET0NPTE9SOwogCWVsc2UKIAkJZml4LT52aXN1YWwgPSBGQl9WSVNVQUxfRElSRUNUQ09MT1I7CiAJZml4LT54cGFuc3RlcCA9IDA7Ci0jaWZkZWYgWEdJRkJfUEFOCiAJaWYgKFhHSWZiX3lwYW4pCiAJCWZpeC0+eXBhbnN0ZXAgPSAxOwotI2VuZGlmCiAJZml4LT55d3JhcHN0ZXAgPSAwOwotCWZpeC0+bGluZV9sZW5ndGggPSB4Z2lfdmlkZW9faW5mby52aWRlb19saW5lbGVuZ3RoOwotCWZpeC0+bW1pb19zdGFydCA9IHhnaV92aWRlb19pbmZvLm1taW9fYmFzZTsKLQlmaXgtPm1taW9fbGVuID0geGdpX3ZpZGVvX2luZm8ubW1pb19zaXplOworCWZpeC0+bGluZV9sZW5ndGggPSB4Z2lmYl9pbmZvLT52aWRlb19saW5lbGVuZ3RoOworCWZpeC0+bW1pb19zdGFydCA9IHhnaWZiX2luZm8tPm1taW9fYmFzZTsKKwlmaXgtPm1taW9fbGVuID0geGdpZmJfaW5mby0+bW1pb19zaXplOwogCWZpeC0+YWNjZWwgPSBGQl9BQ0NFTF9YR0lfWEFCUkU7CiAKIAlERUJVR1BSTigiZW5kIG9mIGdldF9maXgiKTsKQEAgLTE1MzEsNiArMTQ2Nyw3IEBACiAKIHN0YXRpYyBpbnQgWEdJZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKIHsKKwlzdHJ1Y3QgeGdpZmJfdmlkZW9faW5mbyAqeGdpZmJfaW5mbyA9IGluZm8tPnBhcjsKIAl1bnNpZ25lZCBpbnQgaHRvdGFsID0gdmFyLT5sZWZ0X21hcmdpbiArIHZhci0+eHJlcyArIHZhci0+cmlnaHRfbWFyZ2luCiAJCQkrIHZhci0+aHN5bmNfbGVuOwogCXVuc2lnbmVkIGludCB2dG90YWwgPSAwOwpAQCAtMTU2MSwxNSArMTQ5OCwxNSBAQAogCWlmICh2YXItPnBpeGNsb2NrICYmIGh0b3RhbCAmJiB2dG90YWwpIHsKIAkJZHJhdGUgPSAxMDAwMDAwMDAwIC8gdmFyLT5waXhjbG9jazsKIAkJaHJhdGUgPSAoZHJhdGUgKiAxMDAwKSAvIGh0b3RhbDsKLQkJeGdpX3ZpZGVvX2luZm8ucmVmcmVzaF9yYXRlID0KKwkJeGdpZmJfaW5mby0+cmVmcmVzaF9yYXRlID0KIAkJCSh1bnNpZ25lZCBpbnQpIChocmF0ZSAqIDIgLyB2dG90YWwpOwogCQlwcmludGsoS0VSTl9ERUJVRwogCQkJIiVzOiBwaXhjbG9jayA9ICVkICxodG90YWw9JWQsIHZ0b3RhbD0lZFxuIgogCQkJIiVzOiBkcmF0ZT0lZCwgaHJhdGU9JWQsIHJlZnJlc2hfcmF0ZT0lZFxuIiwKIAkJCV9fZnVuY19fLCB2YXItPnBpeGNsb2NrLCBodG90YWwsIHZ0b3RhbCwKLQkJCV9fZnVuY19fLCBkcmF0ZSwgaHJhdGUsIHhnaV92aWRlb19pbmZvLnJlZnJlc2hfcmF0ZSk7CisJCQlfX2Z1bmNfXywgZHJhdGUsIGhyYXRlLCB4Z2lmYl9pbmZvLT5yZWZyZXNoX3JhdGUpOwogCX0gZWxzZSB7Ci0JCXhnaV92aWRlb19pbmZvLnJlZnJlc2hfcmF0ZSA9IDYwOworCQl4Z2lmYl9pbmZvLT5yZWZyZXNoX3JhdGUgPSA2MDsKIAl9CiAKIAkvKgpAQCAtMTU5MSw3ICsxNTI4LDcgQEAKIAkJaWYgKChYR0liaW9zX21vZGVbc2VhcmNoX2lkeF0ueHJlcyA9PSB2YXItPnhyZXMpICYmCiAJCQkoWEdJYmlvc19tb2RlW3NlYXJjaF9pZHhdLnlyZXMgPT0gdmFyLT55cmVzKSAmJgogCQkJKFhHSWJpb3NfbW9kZVtzZWFyY2hfaWR4XS5icHAgPT0gdmFyLT5iaXRzX3Blcl9waXhlbCkpIHsKLQkJCWlmIChYR0lmYl92YWxpZGF0ZV9tb2RlKHNlYXJjaF9pZHgpID4gMCkgeworCQkJaWYgKFhHSWZiX3ZhbGlkYXRlX21vZGUoeGdpZmJfaW5mbywgc2VhcmNoX2lkeCkgPiAwKSB7CiAJCQkJZm91bmRfbW9kZSA9IDE7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0xNjA5LDcgKzE1NDYsOCBAQAogCQkJICAgICh2YXItPnlyZXMgPD0gWEdJYmlvc19tb2RlW3NlYXJjaF9pZHhdLnlyZXMpICYmCiAJCQkgICAgKHZhci0+Yml0c19wZXJfcGl4ZWwgPT0KIAkJCSAgICAgWEdJYmlvc19tb2RlW3NlYXJjaF9pZHhdLmJwcCkpIHsKLQkJCQlpZiAoWEdJZmJfdmFsaWRhdGVfbW9kZShzZWFyY2hfaWR4KSA+IDApIHsKKwkJCQlpZiAoWEdJZmJfdmFsaWRhdGVfbW9kZSh4Z2lmYl9pbmZvLAorCQkJCQkJCXNlYXJjaF9pZHgpID4gMCkgewogCQkJCQlmb3VuZF9tb2RlID0gMTsKIAkJCQkJYnJlYWs7CiAJCQkJfQpAQCAtMTYzMiw3ICsxNTcwLDcgQEAKIAkvKiBUVzogVE9ETzogQ2hlY2sgdGhlIHJlZnJlc2ggcmF0ZSAqLwogCiAJLyogQWRhcHQgUkdCIHNldHRpbmdzICovCi0JWEdJZmJfYnBwX3RvX3Zhcih2YXIpOworCVhHSWZiX2JwcF90b192YXIoeGdpZmJfaW5mbywgdmFyKTsKIAogCS8qIFNhbml0eSBjaGVjayBmb3Igb2Zmc2V0cyAqLwogCWlmICh2YXItPnhvZmZzZXQgPCAwKQpAQCAtMTY0OCw3ICsxNTg2LDcgQEAKIAl9IC8qIGVsc2UgeyAqLwogCQkvKiBUVzogTm93IHBhdGNoIHlyZXNfdmlydHVhbCBpZiB3ZSB1c2UgcGFubmluZyAqLwogCQkvKiBNYXkgSSBkbyB0aGlzPyAqLwotCQkvKiB2YXItPnlyZXNfdmlydHVhbCA9IHhnaV92aWRlb19pbmZvLmhlYXBzdGFydCAvCisJCS8qIHZhci0+eXJlc192aXJ0dWFsID0geGdpZmJfaW5mby0+aGVhcHN0YXJ0IC8KIAkJCSh2YXItPnhyZXMgKiAodmFyLT5iaXRzX3Blcl9waXhlbCA+PiAzKSk7ICovCiAJCS8qIGlmICh2YXItPnlyZXNfdmlydHVhbCA8PSB2YXItPnlyZXMpIHsgKi8KIAkJLyogVFc6IFBhcmFub2lhIGNoZWNrICovCkBAIC0xNjczLDExICsxNjExLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBYR0lGQl9QQU4KIHN0YXRpYyBpbnQgWEdJZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCiAJCXN0cnVjdCBmYl9pbmZvICppbmZvKQogewogCWludCBlcnI7CisJc3RydWN0IHhnaWZiX3ZpZGVvX2luZm8gKnhnaWZiX2luZm8gPSBpbmZvLT5wYXI7CiAKIAkvKiBwcmludGsoIlxuSW5zaWRlIHBhbl9kaXNwbGF5OlxuIik7ICovCiAKQEAgLTE2OTYsNyArMTYzNCw3IEBACiAJCQkJCQk+IGluZm8tPnZhci55cmVzX3ZpcnR1YWwpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JZXJyID0gWEdJZmJfcGFuX3Zhcih2YXIpOworCWVyciA9IFhHSWZiX3Bhbl92YXIoeGdpZmJfaW5mbywgdmFyKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtMTcxMCwxMCArMTY0OCwxMCBAQAogCS8qIHByaW50aygiRW5kIG9mIHBhbl9kaXNwbGF5XG4iKTsgKi8KIAlyZXR1cm4gMDsKIH0KLSNlbmRpZgogCiBzdGF0aWMgaW50IFhHSWZiX2JsYW5rKGludCBibGFuaywgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CisJc3RydWN0IHhnaWZiX3ZpZGVvX2luZm8gKnhnaWZiX2luZm8gPSBpbmZvLT5wYXI7CiAJdTggcmVnOwogCiAJcmVnID0geGdpZmJfcmVnX2dldChYR0lDUiwgMHgxNyk7CkBAIC0xNzM2LDkgKzE2NzQsNyBAQAogCS5mYl9jaGVja192YXIgPSBYR0lmYl9jaGVja192YXIsCiAJLmZiX3NldF9wYXIgPSBYR0lmYl9zZXRfcGFyLAogCS5mYl9zZXRjb2xyZWcgPSBYR0lmYl9zZXRjb2xyZWcsCi0jaWZkZWYgWEdJRkJfUEFOCiAJLmZiX3Bhbl9kaXNwbGF5ID0gWEdJZmJfcGFuX2Rpc3BsYXksCi0jZW5kaWYKIAkuZmJfYmxhbmsgPSBYR0lmYl9ibGFuaywKIAkuZmJfZmlsbHJlY3QgPSBjZmJfZmlsbHJlY3QsCiAJLmZiX2NvcHlhcmVhID0gY2ZiX2NvcHlhcmVhLApAQCAtMTc1MCw1MSArMTY4Niw1MSBAQAogCiAvKiBmb3IgWEdJIDMxNS81NTAvNjUwLzc0MC8zMzAgKi8KIAotc3RhdGljIGludCBYR0lmYl9nZXRfZHJhbV9zaXplKHZvaWQpCitzdGF0aWMgaW50IFhHSWZiX2dldF9kcmFtX3NpemUoc3RydWN0IHhnaWZiX3ZpZGVvX2luZm8gKnhnaWZiX2luZm8pCiB7CiAKIAl1OCBDaGFubmVsTnVtLCB0bXA7CiAJdTggcmVnID0gMDsKIAogCS8qIHhvcmcgZHJpdmVyIHNldHMgMzJNQiAqIDEgY2hhbm5lbCAqLwotCWlmICh4Z2lfdmlkZW9faW5mby5jaGlwID09IFhHMjcpCisJaWYgKHhnaWZiX2luZm8tPmNoaXAgPT0gWEcyNykKIAkJeGdpZmJfcmVnX3NldChYR0lTUiwgSU5EX1hHSV9EUkFNX1NJWkUsIDB4NTEpOwogCiAJcmVnID0geGdpZmJfcmVnX2dldChYR0lTUiwgSU5EX1hHSV9EUkFNX1NJWkUpOwogCXN3aXRjaCAoKHJlZyAmIFhHSV9EUkFNX1NJWkVfTUFTSykgPj4gNCkgewogCWNhc2UgWEdJX0RSQU1fU0laRV8xTUI6Ci0JCXhnaV92aWRlb19pbmZvLnZpZGVvX3NpemUgPSAweDEwMDAwMDsKKwkJeGdpZmJfaW5mby0+dmlkZW9fc2l6ZSA9IDB4MTAwMDAwOwogCQlicmVhazsKIAljYXNlIFhHSV9EUkFNX1NJWkVfMk1COgotCQl4Z2lfdmlkZW9faW5mby52aWRlb19zaXplID0gMHgyMDAwMDA7CisJCXhnaWZiX2luZm8tPnZpZGVvX3NpemUgPSAweDIwMDAwMDsKIAkJYnJlYWs7CiAJY2FzZSBYR0lfRFJBTV9TSVpFXzRNQjoKLQkJeGdpX3ZpZGVvX2luZm8udmlkZW9fc2l6ZSA9IDB4NDAwMDAwOworCQl4Z2lmYl9pbmZvLT52aWRlb19zaXplID0gMHg0MDAwMDA7CiAJCWJyZWFrOwogCWNhc2UgWEdJX0RSQU1fU0laRV84TUI6Ci0JCXhnaV92aWRlb19pbmZvLnZpZGVvX3NpemUgPSAweDgwMDAwMDsKKwkJeGdpZmJfaW5mby0+dmlkZW9fc2l6ZSA9IDB4ODAwMDAwOwogCQlicmVhazsKIAljYXNlIFhHSV9EUkFNX1NJWkVfMTZNQjoKLQkJeGdpX3ZpZGVvX2luZm8udmlkZW9fc2l6ZSA9IDB4MTAwMDAwMDsKKwkJeGdpZmJfaW5mby0+dmlkZW9fc2l6ZSA9IDB4MTAwMDAwMDsKIAkJYnJlYWs7CiAJY2FzZSBYR0lfRFJBTV9TSVpFXzMyTUI6Ci0JCXhnaV92aWRlb19pbmZvLnZpZGVvX3NpemUgPSAweDIwMDAwMDA7CisJCXhnaWZiX2luZm8tPnZpZGVvX3NpemUgPSAweDIwMDAwMDA7CiAJCWJyZWFrOwogCWNhc2UgWEdJX0RSQU1fU0laRV82NE1COgotCQl4Z2lfdmlkZW9faW5mby52aWRlb19zaXplID0gMHg0MDAwMDAwOworCQl4Z2lmYl9pbmZvLT52aWRlb19zaXplID0gMHg0MDAwMDAwOwogCQlicmVhazsKIAljYXNlIFhHSV9EUkFNX1NJWkVfMTI4TUI6Ci0JCXhnaV92aWRlb19pbmZvLnZpZGVvX3NpemUgPSAweDgwMDAwMDA7CisJCXhnaWZiX2luZm8tPnZpZGVvX3NpemUgPSAweDgwMDAwMDA7CiAJCWJyZWFrOwogCWNhc2UgWEdJX0RSQU1fU0laRV8yNTZNQjoKLQkJeGdpX3ZpZGVvX2luZm8udmlkZW9fc2l6ZSA9IDB4MTAwMDAwMDA7CisJCXhnaWZiX2luZm8tPnZpZGVvX3NpemUgPSAweDEwMDAwMDAwOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLTE7CiAJfQogCiAJdG1wID0gKHJlZyAmIDB4MGMpID4+IDI7Ci0Jc3dpdGNoICh4Z2lfdmlkZW9faW5mby5jaGlwKSB7CisJc3dpdGNoICh4Z2lmYl9pbmZvLT5jaGlwKSB7CiAJY2FzZSBYRzIwOgogCWNhc2UgWEcyMToKIAljYXNlIFhHMjc6CkBAIC0xODMwLDI1ICsxNzY2LDI1IEBACiAJCWJyZWFrOwogCX0KIAotCXhnaV92aWRlb19pbmZvLnZpZGVvX3NpemUgPSB4Z2lfdmlkZW9faW5mby52aWRlb19zaXplICogQ2hhbm5lbE51bTsKKwl4Z2lmYl9pbmZvLT52aWRlb19zaXplID0geGdpZmJfaW5mby0+dmlkZW9fc2l6ZSAqIENoYW5uZWxOdW07CiAJLyogUExpYWQgZml4ZWQgZm9yIGJlbmNobWFya2luZyBhbmQgZmIgc2V0ICovCi0JLyogeGdpX3ZpZGVvX2luZm8udmlkZW9fc2l6ZSA9IDB4MjAwMDAwOyAqLyAvKiAxMDI0eDc2OHgxNiAqLwotCS8qIHhnaV92aWRlb19pbmZvLnZpZGVvX3NpemUgPSAweDEwMDAwMDA7ICovIC8qIGJlbmNobWFyayAqLworCS8qIHhnaWZiX2luZm8tPnZpZGVvX3NpemUgPSAweDIwMDAwMDsgKi8gLyogMTAyNHg3Njh4MTYgKi8KKwkvKiB4Z2lmYl9pbmZvLT52aWRlb19zaXplID0gMHgxMDAwMDAwOyAqLyAvKiBiZW5jaG1hcmsgKi8KIAogCXByaW50aygiWEdJZmI6IFNSMTQ9JXggRHJhbVN6aWUgJXggQ2hhbm5lbE51bSAleFxuIiwKIAkgICAgICAgcmVnLAotCSAgICAgICB4Z2lfdmlkZW9faW5mby52aWRlb19zaXplLCBDaGFubmVsTnVtKTsKKwkgICAgICAgeGdpZmJfaW5mby0+dmlkZW9fc2l6ZSwgQ2hhbm5lbE51bSk7CiAJcmV0dXJuIDA7CiAKIH0KIAotc3RhdGljIHZvaWQgWEdJZmJfZGV0ZWN0X1ZCKHZvaWQpCitzdGF0aWMgdm9pZCBYR0lmYl9kZXRlY3RfVkIoc3RydWN0IHhnaWZiX3ZpZGVvX2luZm8gKnhnaWZiX2luZm8pCiB7CiAJdTggY3IzMiwgdGVtcCA9IDA7CiAKLQl4Z2lfdmlkZW9faW5mby5UVl9wbHVnID0geGdpX3ZpZGVvX2luZm8uVFZfdHlwZSA9IDA7CisJeGdpZmJfaW5mby0+VFZfcGx1ZyA9IHhnaWZiX2luZm8tPlRWX3R5cGUgPSAwOwogCi0Jc3dpdGNoICh4Z2lfdmlkZW9faW5mby5oYXNWQikgeworCXN3aXRjaCAoeGdpZmJfaW5mby0+aGFzVkIpIHsKIAljYXNlIEhBU1ZCX0xWRFNfQ0hST05URUw6CiAJY2FzZSBIQVNWQl9DSFJPTlRFTDoKIAkJYnJlYWs7CkBAIC0xODcxLDM1ICsxODA3LDM1IEBACiAKIAlpZiAoWEdJZmJfY3J0MnR5cGUgIT0gLTEpCiAJCS8qIFRXOiBPdmVycmlkZSB3aXRoIG9wdGlvbiAqLwotCQl4Z2lfdmlkZW9faW5mby5kaXNwX3N0YXRlID0gWEdJZmJfY3J0MnR5cGU7CisJCXhnaWZiX2luZm8tPmRpc3BsYXkyID0gWEdJZmJfY3J0MnR5cGU7CiAJZWxzZSBpZiAoY3IzMiAmIFhHSV9WQl9UVikKLQkJeGdpX3ZpZGVvX2luZm8uZGlzcF9zdGF0ZSA9IERJU1BUWVBFX1RWOworCQl4Z2lmYl9pbmZvLT5kaXNwbGF5MiA9IFhHSUZCX0RJU1BfVFY7CiAJZWxzZSBpZiAoY3IzMiAmIFhHSV9WQl9MQ0QpCi0JCXhnaV92aWRlb19pbmZvLmRpc3Bfc3RhdGUgPSBESVNQVFlQRV9MQ0Q7CisJCXhnaWZiX2luZm8tPmRpc3BsYXkyID0gWEdJRkJfRElTUF9MQ0Q7CiAJZWxzZSBpZiAoY3IzMiAmIFhHSV9WQl9DUlQyKQotCQl4Z2lfdmlkZW9faW5mby5kaXNwX3N0YXRlID0gRElTUFRZUEVfQ1JUMjsKKwkJeGdpZmJfaW5mby0+ZGlzcGxheTIgPSBYR0lGQl9ESVNQX0NSVDsKIAllbHNlCi0JCXhnaV92aWRlb19pbmZvLmRpc3Bfc3RhdGUgPSAwOworCQl4Z2lmYl9pbmZvLT5kaXNwbGF5MiA9IFhHSUZCX0RJU1BfTk9ORTsKIAogCWlmIChYR0lmYl90dnBsdWcgIT0gLTEpCiAJCS8qIFBSL1RXOiBPdmVycmlkZSB3aXRoIG9wdGlvbiAqLwotCQl4Z2lfdmlkZW9faW5mby5UVl9wbHVnID0gWEdJZmJfdHZwbHVnOworCQl4Z2lmYl9pbmZvLT5UVl9wbHVnID0gWEdJZmJfdHZwbHVnOwogCWVsc2UgaWYgKGNyMzIgJiBYR0lfVkJfSElWSVNJT04pIHsKLQkJeGdpX3ZpZGVvX2luZm8uVFZfdHlwZSA9IFRWTU9ERV9ISVZJU0lPTjsKLQkJeGdpX3ZpZGVvX2luZm8uVFZfcGx1ZyA9IFRWUExVR19TVklERU87CisJCXhnaWZiX2luZm8tPlRWX3R5cGUgPSBUVk1PREVfSElWSVNJT047CisJCXhnaWZiX2luZm8tPlRWX3BsdWcgPSBUVlBMVUdfU1ZJREVPOwogCX0gZWxzZSBpZiAoY3IzMiAmIFhHSV9WQl9TVklERU8pCi0JCXhnaV92aWRlb19pbmZvLlRWX3BsdWcgPSBUVlBMVUdfU1ZJREVPOworCQl4Z2lmYl9pbmZvLT5UVl9wbHVnID0gVFZQTFVHX1NWSURFTzsKIAllbHNlIGlmIChjcjMyICYgWEdJX1ZCX0NPTVBPU0lURSkKLQkJeGdpX3ZpZGVvX2luZm8uVFZfcGx1ZyA9IFRWUExVR19DT01QT1NJVEU7CisJCXhnaWZiX2luZm8tPlRWX3BsdWcgPSBUVlBMVUdfQ09NUE9TSVRFOwogCWVsc2UgaWYgKGNyMzIgJiBYR0lfVkJfU0NBUlQpCi0JCXhnaV92aWRlb19pbmZvLlRWX3BsdWcgPSBUVlBMVUdfU0NBUlQ7CisJCXhnaWZiX2luZm8tPlRWX3BsdWcgPSBUVlBMVUdfU0NBUlQ7CiAKLQlpZiAoeGdpX3ZpZGVvX2luZm8uVFZfdHlwZSA9PSAwKSB7CisJaWYgKHhnaWZiX2luZm8tPlRWX3R5cGUgPT0gMCkgewogCQl0ZW1wID0geGdpZmJfcmVnX2dldChYR0lDUiwgMHgzOCk7CiAJCWlmICh0ZW1wICYgMHgxMCkKLQkJCXhnaV92aWRlb19pbmZvLlRWX3R5cGUgPSBUVk1PREVfUEFMOworCQkJeGdpZmJfaW5mby0+VFZfdHlwZSA9IFRWTU9ERV9QQUw7CiAJCWVsc2UKLQkJCXhnaV92aWRlb19pbmZvLlRWX3R5cGUgPSBUVk1PREVfTlRTQzsKKwkJCXhnaWZiX2luZm8tPlRWX3R5cGUgPSBUVk1PREVfTlRTQzsKIAl9CiAKIAkvKiBUVzogQ29weSBmb3JjZUNSVDEgb3B0aW9uIHRvIENSVDFvZmYgaWYgb3B0aW9uIGlzIGdpdmVuICovCkBAIC0xOTExLDM3ICsxODQ3LDM3IEBACiAJfQogfQogCi1zdGF0aWMgaW50IFhHSWZiX2hhc19WQih2b2lkKQorc3RhdGljIGludCBYR0lmYl9oYXNfVkIoc3RydWN0IHhnaWZiX3ZpZGVvX2luZm8gKnhnaWZiX2luZm8pCiB7CiAJdTggdmJfY2hpcGlkOwogCiAJdmJfY2hpcGlkID0geGdpZmJfcmVnX2dldChYR0lQQVJUNCwgMHgwMCk7CiAJc3dpdGNoICh2Yl9jaGlwaWQpIHsKIAljYXNlIDB4MDE6Ci0JCXhnaV92aWRlb19pbmZvLmhhc1ZCID0gSEFTVkJfMzAxOworCQl4Z2lmYl9pbmZvLT5oYXNWQiA9IEhBU1ZCXzMwMTsKIAkJYnJlYWs7CiAJY2FzZSAweDAyOgotCQl4Z2lfdmlkZW9faW5mby5oYXNWQiA9IEhBU1ZCXzMwMjsKKwkJeGdpZmJfaW5mby0+aGFzVkIgPSBIQVNWQl8zMDI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXhnaV92aWRlb19pbmZvLmhhc1ZCID0gSEFTVkJfTk9ORTsKKwkJeGdpZmJfaW5mby0+aGFzVkIgPSBIQVNWQl9OT05FOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyB2b2lkIFhHSWZiX2dldF9WQl90eXBlKHZvaWQpCitzdGF0aWMgdm9pZCBYR0lmYl9nZXRfVkJfdHlwZShzdHJ1Y3QgeGdpZmJfdmlkZW9faW5mbyAqeGdpZmJfaW5mbykKIHsKIAl1OCByZWc7CiAKLQlpZiAoIVhHSWZiX2hhc19WQigpKSB7CisJaWYgKCFYR0lmYl9oYXNfVkIoeGdpZmJfaW5mbykpIHsKIAkJcmVnID0geGdpZmJfcmVnX2dldChYR0lDUiwgSU5EX1hHSV9TQ1JBVENIX1JFR19DUjM3KTsKIAkJc3dpdGNoICgocmVnICYgWEdJX0VYVEVSTkFMX0NISVBfTUFTSykgPj4gMSkgewogCQljYXNlIFhHSTMxMF9FWFRFUk5BTF9DSElQX0xWRFM6Ci0JCQl4Z2lfdmlkZW9faW5mby5oYXNWQiA9IEhBU1ZCX0xWRFM7CisJCQl4Z2lmYl9pbmZvLT5oYXNWQiA9IEhBU1ZCX0xWRFM7CiAJCQlicmVhazsKIAkJY2FzZSBYR0kzMTBfRVhURVJOQUxfQ0hJUF9MVkRTX0NIUk9OVEVMOgotCQkJeGdpX3ZpZGVvX2luZm8uaGFzVkIgPSBIQVNWQl9MVkRTX0NIUk9OVEVMOworCQkJeGdpZmJfaW5mby0+aGFzVkIgPSBIQVNWQl9MVkRTX0NIUk9OVEVMOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKQEAgLTE5NDksNDkgKzE4ODUsNDcgQEAKIAl9CiB9CiAKLVhHSUlOSVRTVEFUSUMgaW50IF9faW5pdCBYR0lmYl9zZXR1cChjaGFyICpvcHRpb25zKQorc3RhdGljIGludCBfX2luaXQgeGdpZmJfb3B0dmFsKGNoYXIgKmZ1bGxvcHQsIGludCB2YWxpZHgpCit7CisJdW5zaWduZWQgbG9uZyBscmVzOworCisJaWYgKGtzdHJ0b3VsKGZ1bGxvcHQgKyB2YWxpZHgsIDAsICZscmVzKSA8IDAgfHwgbHJlcyA+IElOVF9NQVgpIHsKKwkJcHJfZXJyKCJ4Z2lmYjogaW52YWxpZCB2YWx1ZSBmb3Igb3B0aW9uOiAlc1xuIiwgZnVsbG9wdCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gbHJlczsKK30KKworc3RhdGljIGludCBfX2luaXQgWEdJZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKIHsKIAljaGFyICp0aGlzX29wdDsKIAotCXhnaV92aWRlb19pbmZvLnJlZnJlc2hfcmF0ZSA9IDA7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJYR0lmYjogT3B0aW9ucyAlc1xuIiwgb3B0aW9ucyk7Ci0KIAlpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKQogCQlyZXR1cm4gMDsKIAorCXByX2luZm8oInhnaWZiOiBvcHRpb25zOiAlc1xuIiwgb3B0aW9ucyk7CisKIAl3aGlsZSAoKHRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CiAKIAkJaWYgKCEqdGhpc19vcHQpCiAJCQljb250aW51ZTsKIAogCQlpZiAoIXN0cm5jbXAodGhpc19vcHQsICJtb2RlOiIsIDUpKSB7Ci0JCQlYR0lmYl9zZWFyY2hfbW9kZSh0aGlzX29wdCArIDUpOworCQkJbW9kZSA9IHRoaXNfb3B0ICsgNTsKIAkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZlc2E6IiwgNSkpIHsKLQkJCVhHSWZiX3NlYXJjaF92ZXNhbW9kZShzaW1wbGVfc3RydG91bCgKLQkJCQkJCXRoaXNfb3B0ICsgNSwgTlVMTCwgMCkpOwotCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAibW9kZToiLCA1KSkgewotCQkJWEdJZmJfc2VhcmNoX21vZGUodGhpc19vcHQgKyA1KTsKLQkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZlc2E6IiwgNSkpIHsKLQkJCVhHSWZiX3NlYXJjaF92ZXNhbW9kZShzaW1wbGVfc3RydG91bCgKLQkJCQkJCXRoaXNfb3B0ICsgNSwgTlVMTCwgMCkpOworCQkJdmVzYSA9IHhnaWZiX29wdHZhbCh0aGlzX29wdCwgNSk7CiAJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2cmF0ZToiLCA2KSkgewotCQkJeGdpX3ZpZGVvX2luZm8ucmVmcmVzaF9yYXRlID0gc2ltcGxlX3N0cnRvdWwoCi0JCQkJCQl0aGlzX29wdCArIDYsIE5VTEwsIDApOworCQkJcmVmcmVzaF9yYXRlID0geGdpZmJfb3B0dmFsKHRoaXNfb3B0LCA2KTsKIAkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInJhdGU6IiwgNSkpIHsKLQkJCXhnaV92aWRlb19pbmZvLnJlZnJlc2hfcmF0ZSA9IHNpbXBsZV9zdHJ0b3VsKAotCQkJCQkJdGhpc19vcHQgKyA1LCBOVUxMLCAwKTsKLQkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgIm9mZiIsIDMpKSB7Ci0JCQlYR0lmYl9vZmYgPSAxOworCQkJcmVmcmVzaF9yYXRlID0geGdpZmJfb3B0dmFsKHRoaXNfb3B0LCA1KTsKIAkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgImNydDFvZmYiLCA3KSkgewogCQkJWEdJZmJfY3J0MW9mZiA9IDE7CiAJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJmaWx0ZXI6IiwgNykpIHsKLQkJCWZpbHRlciA9IChpbnQpc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA3LCBOVUxMLCAwKTsKKwkJCWZpbHRlciA9IHhnaWZiX29wdHZhbCh0aGlzX29wdCwgNyk7CiAJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJmb3JjZWNydDJ0eXBlOiIsIDE0KSkgewogCQkJWEdJZmJfc2VhcmNoX2NydDJ0eXBlKHRoaXNfb3B0ICsgMTQpOwogCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAiZm9yY2VjcnQxOiIsIDEwKSkgewotCQkJWEdJZmJfZm9yY2VjcnQxID0gKGludClzaW1wbGVfc3RydG91bCgKLQkJCQkJCXRoaXNfb3B0ICsgMTAsIE5VTEwsIDApOworCQkJWEdJZmJfZm9yY2VjcnQxID0geGdpZmJfb3B0dmFsKHRoaXNfb3B0LCAxMCk7CiAJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ0dm1vZGU6IiwgNykpIHsKIAkJCVhHSWZiX3NlYXJjaF90dnN0ZCh0aGlzX29wdCArIDcpOwogCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidHZzdGFuZGFyZDoiLCAxMSkpIHsKQEAgLTE5OTksMzIgKzE5MzMsMTUgQEAKIAkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgImRzdG4iLCA0KSkgewogCQkJZW5hYmxlX2RzdG4gPSAxOwogCQkJLyogVFc6IERTVE4gb3ZlcnJ1bGVzIGZvcmNlY3J0MnR5cGUgKi8KLQkJCVhHSWZiX2NydDJ0eXBlID0gRElTUFRZUEVfTENEOwotCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAicGRjOiIsIDQpKSB7Ci0JCQlYR0lmYl9wZGMgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDQsIE5VTEwsIDApOwotCQkJaWYgKFhHSWZiX3BkYyAmIH4weDNjKSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiWEdJZmI6IElsbGVnYWwgcGRjIHBhcmFtZXRlclxuIik7Ci0JCQkJWEdJZmJfcGRjID0gMDsKLQkJCX0KKwkJCVhHSWZiX2NydDJ0eXBlID0gWEdJRkJfRElTUF9MQ0Q7CiAJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJub3lwYW4iLCA2KSkgewogCQkJWEdJZmJfeXBhbiA9IDA7CiAJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ1c2Vyb206IiwgNykpIHsKLQkJCVhHSWZiX3VzZXJvbSA9IChpbnQpc2ltcGxlX3N0cnRvdWwoCi0JCQkJCQl0aGlzX29wdCArIDcsIE5VTEwsIDApOwotCQkJLyogfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInVzZW9lbToiLCA3KSkgeyAqLwotCQkJLyogWEdJZmJfdXNlb2VtID0gKGludClzaW1wbGVfc3RydG91bCgKLQkJCQkJCXRoaXNfb3B0ICsgNywgTlVMTCwgMCk7ICovCisJCQlYR0lmYl91c2Vyb20gPSB4Z2lmYl9vcHR2YWwodGhpc19vcHQsIDcpOwogCQl9IGVsc2UgewotCQkJWEdJZmJfc2VhcmNoX21vZGUodGhpc19vcHQpOwotCQkJLyogcHJpbnRrKEtFUk5fSU5GTyAiWEdJZmI6IEludmFsaWQgb3B0aW9uICVzXG4iLAotCQkJCSAgdGhpc19vcHQpOyAqLworCQkJbW9kZSA9IHRoaXNfb3B0OwogCQl9Ci0KLQkJLyogVFc6IFBhbm5pbmcgb25seSB3aXRoIGFjY2VsZXJhdGlvbiAqLwotCQlYR0lmYl95cGFuID0gMDsKLQogCX0KLQlwcmludGsoIlxueGdpZmI6IG91dGEgeGdpZmJfc2V0dXAgMzQ1MCIpOwogCXJldHVybiAwOwogfQogCkBAIC0yMDU2LDQ0ICsxOTczLDQ2IEBACiAJdTggcmVnLCByZWcxOwogCXU4IENSNDgsIENSMzg7CiAJaW50IHJldDsKKwlib29sIHhnaTIxX2RydmxjZGNhcGxpc3QgPSBmYWxzZTsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbzsKKwlzdHJ1Y3QgeGdpZmJfdmlkZW9faW5mbyAqeGdpZmJfaW5mbzsKKwlzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpod19pbmZvOwogCi0JaWYgKFhHSWZiX29mZikKLQkJcmV0dXJuIC1FTlhJTzsKLQotCVhHSWZiX3JlZ2lzdGVyZWQgPSAwOwotCi0JbWVtc2V0KCZYR0lod19leHQsIDAsIHNpemVvZihzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvKSk7Ci0JZmJfaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3QgZmJfaW5mbyksICZwZGV2LT5kZXYpOworCWZiX2luZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2YoKnhnaWZiX2luZm8pLCAmcGRldi0+ZGV2KTsKIAlpZiAoIWZiX2luZm8pCiAJCXJldHVybiAtRU5PTUVNOwogCi0JeGdpX3ZpZGVvX2luZm8uY2hpcF9pZCA9IHBkZXYtPmRldmljZTsKKwl4Z2lmYl9pbmZvID0gZmJfaW5mby0+cGFyOworCWh3X2luZm8gPSAmeGdpZmJfaW5mby0+aHdfaW5mbzsKKwl4Z2lmYl9pbmZvLT5mYl9pbmZvID0gZmJfaW5mbzsKKwl4Z2lmYl9pbmZvLT5jaGlwX2lkID0gcGRldi0+ZGV2aWNlOwogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYsCiAJCQkgICAgIFBDSV9SRVZJU0lPTl9JRCwKLQkJCSAgICAgJnhnaV92aWRlb19pbmZvLnJldmlzaW9uX2lkKTsKLQlYR0lod19leHQuakNoaXBSZXZpc2lvbiA9IHhnaV92aWRlb19pbmZvLnJldmlzaW9uX2lkOworCQkJICAgICAmeGdpZmJfaW5mby0+cmV2aXNpb25faWQpOworCWh3X2luZm8tPmpDaGlwUmV2aXNpb24gPSB4Z2lmYl9pbmZvLT5yZXZpc2lvbl9pZDsKIAotCXhnaV92aWRlb19pbmZvLnBjaWJ1cyA9IHBkZXYtPmJ1cy0+bnVtYmVyOwotCXhnaV92aWRlb19pbmZvLnBjaXNsb3QgPSBQQ0lfU0xPVChwZGV2LT5kZXZmbik7Ci0JeGdpX3ZpZGVvX2luZm8ucGNpZnVuYyA9IFBDSV9GVU5DKHBkZXYtPmRldmZuKTsKLQl4Z2lfdmlkZW9faW5mby5zdWJzeXN2ZW5kb3IgPSBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yOwotCXhnaV92aWRlb19pbmZvLnN1YnN5c2RldmljZSA9IHBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CisJeGdpZmJfaW5mby0+cGNpYnVzID0gcGRldi0+YnVzLT5udW1iZXI7CisJeGdpZmJfaW5mby0+cGNpc2xvdCA9IFBDSV9TTE9UKHBkZXYtPmRldmZuKTsKKwl4Z2lmYl9pbmZvLT5wY2lmdW5jID0gUENJX0ZVTkMocGRldi0+ZGV2Zm4pOworCXhnaWZiX2luZm8tPnN1YnN5c3ZlbmRvciA9IHBkZXYtPnN1YnN5c3RlbV92ZW5kb3I7CisJeGdpZmJfaW5mby0+c3Vic3lzZGV2aWNlID0gcGRldi0+c3Vic3lzdGVtX2RldmljZTsKIAotCXhnaV92aWRlb19pbmZvLnZpZGVvX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMCk7Ci0JeGdpX3ZpZGVvX2luZm8ubW1pb19iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDEpOwotCXhnaV92aWRlb19pbmZvLm1taW9fc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSk7Ci0JeGdpX3ZpZGVvX2luZm8udmdhX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMikgKyAweDMwOwotCVhHSWh3X2V4dC5waklPQWRkcmVzcyA9ICh1bnNpZ25lZCBjaGFyICopeGdpX3ZpZGVvX2luZm8udmdhX2Jhc2U7CisJeGdpZmJfaW5mby0+dmlkZW9fYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwl4Z2lmYl9pbmZvLT5tbWlvX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CisJeGdpZmJfaW5mby0+bW1pb19zaXplID0gcGNpX3Jlc291cmNlX2xlbihwZGV2LCAxKTsKKwl4Z2lmYl9pbmZvLT52Z2FfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKSArIDB4MzA7CisJaHdfaW5mby0+cGpJT0FkZHJlc3MgPSAodW5zaWduZWQgY2hhciAqKXhnaWZiX2luZm8tPnZnYV9iYXNlOwogCS8qIFhHSV9Qci5SZWxJTyAgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKSwgMTI4KSArIDB4MzA7ICovCiAJcHJpbnRrKCJYR0lmYjogUmVsb2NhdGUgSU8gYWRkcmVzczogJWx4IFslMDhseF1cbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nKXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAyKSwgWEdJX1ByLlJlbElPKTsKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDIpLAorCSAgICAgICB4Z2lmYl9pbmZvLT5kZXZfaW5mby5SZWxJTyk7CiAKIAlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBlcnJvcjsKIAl9CiAKLQlYR0lSZWdJbml0KCZYR0lfUHIsICh1bnNpZ25lZCBsb25nKVhHSWh3X2V4dC5waklPQWRkcmVzcyk7CisJWEdJUmVnSW5pdCgmeGdpZmJfaW5mby0+ZGV2X2luZm8sICh1bnNpZ25lZCBsb25nKWh3X2luZm8tPnBqSU9BZGRyZXNzKTsKIAogCXhnaWZiX3JlZ19zZXQoWEdJU1IsIElORF9YR0lfUEFTU1dPUkQsIFhHSV9QQVNTV09SRCk7CiAJcmVnMSA9IHhnaWZiX3JlZ19nZXQoWEdJU1IsIElORF9YR0lfUEFTU1dPUkQpOwpAQCAtMjEwNCw0MTcgKzIwMjMsNDEzIEBACiAJCWdvdG8gZXJyb3I7CiAJfQogCi0Jc3dpdGNoICh4Z2lfdmlkZW9faW5mby5jaGlwX2lkKSB7CisJc3dpdGNoICh4Z2lmYl9pbmZvLT5jaGlwX2lkKSB7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX1hHXzIwOgogCQl4Z2lmYl9yZWdfb3IoWEdJQ1IsIEluZGV4X0NSX0dQSU9fUmVnMywgR1BJT0dfRU4pOwogCQlDUjQ4ID0geGdpZmJfcmVnX2dldChYR0lDUiwgSW5kZXhfQ1JfR1BJT19SZWcxKTsKIAkJaWYgKENSNDgmR1BJT0dfUkVBRCkKLQkJCXhnaV92aWRlb19pbmZvLmNoaXAgPSBYRzIxOworCQkJeGdpZmJfaW5mby0+Y2hpcCA9IFhHMjE7CiAJCWVsc2UKLQkJCXhnaV92aWRlb19pbmZvLmNoaXAgPSBYRzIwOwotCQlYR0lmYl9DUlQyX3dyaXRlX2VuYWJsZSA9IElORF9YR0lfQ1JUMl9XUklURV9FTkFCTEVfMzE1OworCQkJeGdpZmJfaW5mby0+Y2hpcCA9IFhHMjA7CiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9YR180MDoKLQkJeGdpX3ZpZGVvX2luZm8uY2hpcCA9IFhHNDA7Ci0JCVhHSWZiX0NSVDJfd3JpdGVfZW5hYmxlID0gSU5EX1hHSV9DUlQyX1dSSVRFX0VOQUJMRV8zMTU7CisJCXhnaWZiX2luZm8tPmNoaXAgPSBYRzQwOwogCQlicmVhazsKIAljYXNlIFBDSV9ERVZJQ0VfSURfWEdfNDE6Ci0JCXhnaV92aWRlb19pbmZvLmNoaXAgPSBYRzQxOwotCQlYR0lmYl9DUlQyX3dyaXRlX2VuYWJsZSA9IElORF9YR0lfQ1JUMl9XUklURV9FTkFCTEVfMzE1OworCQl4Z2lmYl9pbmZvLT5jaGlwID0gWEc0MTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lfREVWSUNFX0lEX1hHXzQyOgotCQl4Z2lfdmlkZW9faW5mby5jaGlwID0gWEc0MjsKLQkJWEdJZmJfQ1JUMl93cml0ZV9lbmFibGUgPSBJTkRfWEdJX0NSVDJfV1JJVEVfRU5BQkxFXzMxNTsKKwkJeGdpZmJfaW5mby0+Y2hpcCA9IFhHNDI7CiAJCWJyZWFrOwogCWNhc2UgUENJX0RFVklDRV9JRF9YR18yNzoKLQkJeGdpX3ZpZGVvX2luZm8uY2hpcCA9IFhHMjc7Ci0JCVhHSWZiX0NSVDJfd3JpdGVfZW5hYmxlID0gSU5EX1hHSV9DUlQyX1dSSVRFX0VOQUJMRV8zMTU7CisJCXhnaWZiX2luZm8tPmNoaXAgPSBYRzI3OwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIGVycm9yOwogCX0KIAotCXByaW50aygiWEdJZmI6Y2hpcGlkID0gJXhcbiIsIHhnaV92aWRlb19pbmZvLmNoaXApOwotCVhHSWh3X2V4dC5qQ2hpcFR5cGUgPSB4Z2lfdmlkZW9faW5mby5jaGlwOworCXByaW50aygiWEdJZmI6Y2hpcGlkID0gJXhcbiIsIHhnaWZiX2luZm8tPmNoaXApOworCWh3X2luZm8tPmpDaGlwVHlwZSA9IHhnaWZiX2luZm8tPmNoaXA7CiAKLQlpZiAoKHhnaV92aWRlb19pbmZvLmNoaXAgPT0gWEcyMSkgfHwgKFhHSWZiX3VzZXJvbSkpIHsKLQkJWEdJaHdfZXh0LnBqVmlydHVhbFJvbUJhc2UgPSB4Z2lmYl9jb3B5X3JvbShwZGV2KTsKLQkJaWYgKFhHSWh3X2V4dC5walZpcnR1YWxSb21CYXNlKQorCWlmICgoeGdpZmJfaW5mby0+Y2hpcCA9PSBYRzIxKSB8fCAoWEdJZmJfdXNlcm9tKSkgeworCQlod19pbmZvLT5walZpcnR1YWxSb21CYXNlID0geGdpZmJfY29weV9yb20ocGRldik7CisJCWlmIChod19pbmZvLT5walZpcnR1YWxSb21CYXNlKQogCQkJcHJpbnRrKEtFUk5fSU5GTyAiWEdJZmI6IFZpZGVvIFJPTSBmb3VuZCBhbmQgbWFwcGVkIHRvICVwXG4iLAotCQkJICAgICAgIFhHSWh3X2V4dC5walZpcnR1YWxSb21CYXNlKTsKKwkJCSAgICAgICBod19pbmZvLT5walZpcnR1YWxSb21CYXNlKTsKIAkJZWxzZQogCQkJcHJpbnRrKEtFUk5fSU5GTyAiWEdJZmI6IFZpZGVvIFJPTSBub3QgZm91bmRcbiIpOwogCX0gZWxzZSB7Ci0JCVhHSWh3X2V4dC5walZpcnR1YWxSb21CYXNlID0gTlVMTDsKKwkJaHdfaW5mby0+cGpWaXJ0dWFsUm9tQmFzZSA9IE5VTEw7CiAJCXByaW50ayhLRVJOX0lORk8gIlhHSWZiOiBWaWRlbyBST00gdXNhZ2UgZGlzYWJsZWRcbiIpOwogCX0KLQlYR0lod19leHQucFF1ZXJ5VkdBQ29uZmlnU3BhY2UgPSAmWEdJZmJfcXVlcnlfVkdBX2NvbmZpZ19zcGFjZTsKIAotCWlmIChYR0lmYl9nZXRfZHJhbV9zaXplKCkpIHsKKwlpZiAoWEdJZmJfZ2V0X2RyYW1fc2l6ZSh4Z2lmYl9pbmZvKSkgewogCQlwcmludGsoS0VSTl9JTkZPICJYR0lmYjogRmF0YWwgZXJyb3I6IFVuYWJsZSB0byBkZXRlcm1pbmUgUkFNIHNpemUuXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBlcnJvcjsKIAl9CiAKLQlpZiAoKHhnaWZiX21vZGVfaWR4IDwgMCkgfHwKLQkgICAgKChYR0liaW9zX21vZGVbeGdpZmJfbW9kZV9pZHhdLm1vZGVfbm8pICE9IDB4RkYpKSB7Ci0JCS8qIEVuYWJsZSBQQ0lfTElORUFSX0FERFJFU1NJTkcgYW5kIE1NSU9fRU5BQkxFICAqLwotCQl4Z2lmYl9yZWdfb3IoWEdJU1IsCi0JCQkgICAgIElORF9YR0lfUENJX0FERFJFU1NfU0VULAotCQkJICAgICAoWEdJX1BDSV9BRERSX0VOQUJMRSB8IFhHSV9NRU1fTUFQX0lPX0VOQUJMRSkpOwotCQkvKiBFbmFibGUgMkQgYWNjZWxlcmF0b3IgZW5naW5lICovCi0JCXhnaWZiX3JlZ19vcihYR0lTUiwgSU5EX1hHSV9NT0RVTEVfRU5BQkxFLCBYR0lfRU5BQkxFXzJEKTsKLQl9CisJLyogRW5hYmxlIFBDSV9MSU5FQVJfQUREUkVTU0lORyBhbmQgTU1JT19FTkFCTEUgICovCisJeGdpZmJfcmVnX29yKFhHSVNSLAorCQkgICAgIElORF9YR0lfUENJX0FERFJFU1NfU0VULAorCQkgICAgIChYR0lfUENJX0FERFJfRU5BQkxFIHwgWEdJX01FTV9NQVBfSU9fRU5BQkxFKSk7CisJLyogRW5hYmxlIDJEIGFjY2VsZXJhdG9yIGVuZ2luZSAqLworCXhnaWZiX3JlZ19vcihYR0lTUiwgSU5EX1hHSV9NT0RVTEVfRU5BQkxFLCBYR0lfRU5BQkxFXzJEKTsKIAotCVhHSWh3X2V4dC51bFZpZGVvTWVtb3J5U2l6ZSA9IHhnaV92aWRlb19pbmZvLnZpZGVvX3NpemU7CisJaHdfaW5mby0+dWxWaWRlb01lbW9yeVNpemUgPSB4Z2lmYl9pbmZvLT52aWRlb19zaXplOwogCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oeGdpX3ZpZGVvX2luZm8udmlkZW9fYmFzZSwKLQkJCQl4Z2lfdmlkZW9faW5mby52aWRlb19zaXplLAorCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHhnaWZiX2luZm8tPnZpZGVvX2Jhc2UsCisJCQkJeGdpZmJfaW5mby0+dmlkZW9fc2l6ZSwKIAkJCQkiWEdJZmIgRkIiKSkgewogCQlwcmludGsoInVuYWJsZSByZXF1ZXN0IG1lbW9yeSBzaXplICV4IiwKLQkJICAgICAgIHhnaV92aWRlb19pbmZvLnZpZGVvX3NpemUpOworCQkgICAgICAgeGdpZmJfaW5mby0+dmlkZW9fc2l6ZSk7CiAJCXByaW50ayhLRVJOX0VSUiAiWEdJZmI6IEZhdGFsIGVycm9yOiBVbmFibGUgdG8gcmVzZXJ2ZSBmcmFtZSBidWZmZXIgbWVtb3J5XG4iKTsKIAkJcHJpbnRrKEtFUk5fRVJSICJYR0lmYjogSXMgdGhlcmUgYW5vdGhlciBmcmFtZWJ1ZmZlciBkcml2ZXIgYWN0aXZlP1xuIik7CiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyb3I7CiAJfQogCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oeGdpX3ZpZGVvX2luZm8ubW1pb19iYXNlLAotCQkJCXhnaV92aWRlb19pbmZvLm1taW9fc2l6ZSwKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbih4Z2lmYl9pbmZvLT5tbWlvX2Jhc2UsCisJCQkJeGdpZmJfaW5mby0+bW1pb19zaXplLAogCQkJCSJYR0lmYiBNTUlPIikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJYR0lmYjogRmF0YWwgZXJyb3I6IFVuYWJsZSB0byByZXNlcnZlIE1NSU8gcmVnaW9uXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBlcnJvcl8wOwogCX0KIAotCXhnaV92aWRlb19pbmZvLnZpZGVvX3ZiYXNlID0gWEdJaHdfZXh0LnBqVmlkZW9NZW1vcnlBZGRyZXNzID0KLQlpb3JlbWFwKHhnaV92aWRlb19pbmZvLnZpZGVvX2Jhc2UsIHhnaV92aWRlb19pbmZvLnZpZGVvX3NpemUpOwotCXhnaV92aWRlb19pbmZvLm1taW9fdmJhc2UgPSBpb3JlbWFwKHhnaV92aWRlb19pbmZvLm1taW9fYmFzZSwKLQkJCQkJICAgIHhnaV92aWRlb19pbmZvLm1taW9fc2l6ZSk7CisJeGdpZmJfaW5mby0+dmlkZW9fdmJhc2UgPSBod19pbmZvLT5walZpZGVvTWVtb3J5QWRkcmVzcyA9CisJaW9yZW1hcCh4Z2lmYl9pbmZvLT52aWRlb19iYXNlLCB4Z2lmYl9pbmZvLT52aWRlb19zaXplKTsKKwl4Z2lmYl9pbmZvLT5tbWlvX3ZiYXNlID0gaW9yZW1hcCh4Z2lmYl9pbmZvLT5tbWlvX2Jhc2UsCisJCQkJCSAgICB4Z2lmYl9pbmZvLT5tbWlvX3NpemUpOwogCiAJcHJpbnRrKEtFUk5fSU5GTyAiWEdJZmI6IEZyYW1lYnVmZmVyIGF0IDB4JWx4LCBtYXBwZWQgdG8gMHglcCwgc2l6ZSAlZGtcbiIsCi0JICAgICAgIHhnaV92aWRlb19pbmZvLnZpZGVvX2Jhc2UsCi0JICAgICAgIHhnaV92aWRlb19pbmZvLnZpZGVvX3ZiYXNlLAotCSAgICAgICB4Z2lfdmlkZW9faW5mby52aWRlb19zaXplIC8gMTAyNCk7CisJICAgICAgIHhnaWZiX2luZm8tPnZpZGVvX2Jhc2UsCisJICAgICAgIHhnaWZiX2luZm8tPnZpZGVvX3ZiYXNlLAorCSAgICAgICB4Z2lmYl9pbmZvLT52aWRlb19zaXplIC8gMTAyNCk7CiAKIAlwcmludGsoS0VSTl9JTkZPICJYR0lmYjogTU1JTyBhdCAweCVseCwgbWFwcGVkIHRvIDB4JXAsIHNpemUgJWxka1xuIiwKLQkgICAgICAgeGdpX3ZpZGVvX2luZm8ubW1pb19iYXNlLCB4Z2lfdmlkZW9faW5mby5tbWlvX3ZiYXNlLAotCSAgICAgICB4Z2lfdmlkZW9faW5mby5tbWlvX3NpemUgLyAxMDI0KTsKKwkgICAgICAgeGdpZmJfaW5mby0+bW1pb19iYXNlLCB4Z2lmYl9pbmZvLT5tbWlvX3ZiYXNlLAorCSAgICAgICB4Z2lmYl9pbmZvLT5tbWlvX3NpemUgLyAxMDI0KTsKIAlwcmludGsoIlhHSWZiOiBYR0lJbml0TmV3KCkgLi4uIik7Ci0JaWYgKFhHSUluaXROZXcoJlhHSWh3X2V4dCkpCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIHhnaWZiX2luZm8pOworCWlmIChYR0lJbml0TmV3KHBkZXYpKQogCQlwcmludGsoIk9LXG4iKTsKIAllbHNlCiAJCXByaW50aygiRmFpbFxuIik7CiAKLQl4Z2lfdmlkZW9faW5mby5tdHJyID0gKHVuc2lnbmVkIGludCkgMDsKKwl4Z2lmYl9pbmZvLT5tdHJyID0gKHVuc2lnbmVkIGludCkgMDsKIAotCWlmICgoeGdpZmJfbW9kZV9pZHggPCAwKSB8fAotCSAgICAoKFhHSWJpb3NfbW9kZVt4Z2lmYl9tb2RlX2lkeF0ubW9kZV9ubykgIT0gMHhGRikpIHsKLQkJeGdpX3ZpZGVvX2luZm8uaGFzVkIgPSBIQVNWQl9OT05FOwotCQlpZiAoKHhnaV92aWRlb19pbmZvLmNoaXAgPT0gWEcyMCkgfHwKLQkJICAgICh4Z2lfdmlkZW9faW5mby5jaGlwID09IFhHMjcpKSB7Ci0JCQl4Z2lfdmlkZW9faW5mby5oYXNWQiA9IEhBU1ZCX05PTkU7Ci0JCX0gZWxzZSBpZiAoeGdpX3ZpZGVvX2luZm8uY2hpcCA9PSBYRzIxKSB7Ci0JCQlDUjM4ID0geGdpZmJfcmVnX2dldChYR0lDUiwgMHgzOCk7Ci0JCQlpZiAoKENSMzgmMHhFMCkgPT0gMHhDMCkgewotCQkJCXhnaV92aWRlb19pbmZvLmRpc3Bfc3RhdGUgPSBESVNQVFlQRV9MQ0Q7Ci0JCQkJaWYgKCFYR0lmYl9HZXRYRzIxTFZEU0RhdGEoKSkgewotCQkJCQlpbnQgbTsKLQkJCQkJZm9yIChtID0gMDsgbSA8IHNpemVvZihYR0kyMV9MQ0RDYXBMaXN0KS9zaXplb2Yoc3RydWN0IFhHSTIxX0xWRFNDYXBTdHJ1Y3QpOyBtKyspIHsKLQkJCQkJCWlmICgoWEdJMjFfTENEQ2FwTGlzdFttXS5MVkRTSERFID09IFhHSWJpb3NfbW9kZVt4Z2lmYl9tb2RlX2lkeF0ueHJlcykgJiYKLQkJCQkJCSAgICAoWEdJMjFfTENEQ2FwTGlzdFttXS5MVkRTVkRFID09IFhHSWJpb3NfbW9kZVt4Z2lmYl9tb2RlX2lkeF0ueXJlcykpIHsKLQkJCQkJCQl4Z2lmYl9yZWdfc2V0KFhHSV9Qci5QM2Q0LCAweDM2LCBtKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoKENSMzgmMHhFMCkgPT0gMHg2MCkgewotCQkJCXhnaV92aWRlb19pbmZvLmhhc1ZCID0gSEFTVkJfQ0hST05URUw7Ci0JCQl9IGVsc2UgewotCQkJCXhnaV92aWRlb19pbmZvLmhhc1ZCID0gSEFTVkJfTk9ORTsKLQkJCX0KKwl4Z2lmYl9pbmZvLT5oYXNWQiA9IEhBU1ZCX05PTkU7CisJaWYgKCh4Z2lmYl9pbmZvLT5jaGlwID09IFhHMjApIHx8CisJICAgICh4Z2lmYl9pbmZvLT5jaGlwID09IFhHMjcpKSB7CisJCXhnaWZiX2luZm8tPmhhc1ZCID0gSEFTVkJfTk9ORTsKKwl9IGVsc2UgaWYgKHhnaWZiX2luZm8tPmNoaXAgPT0gWEcyMSkgeworCQlDUjM4ID0geGdpZmJfcmVnX2dldChYR0lDUiwgMHgzOCk7CisJCWlmICgoQ1IzOCYweEUwKSA9PSAweEMwKSB7CisJCQl4Z2lmYl9pbmZvLT5kaXNwbGF5MiA9IFhHSUZCX0RJU1BfTENEOworCQkJaWYgKCFYR0lmYl9HZXRYRzIxTFZEU0RhdGEoeGdpZmJfaW5mbykpCisJCQkJeGdpMjFfZHJ2bGNkY2FwbGlzdCA9IHRydWU7CisJCX0gZWxzZSBpZiAoKENSMzgmMHhFMCkgPT0gMHg2MCkgeworCQkJeGdpZmJfaW5mby0+aGFzVkIgPSBIQVNWQl9DSFJPTlRFTDsKIAkJfSBlbHNlIHsKLQkJCVhHSWZiX2dldF9WQl90eXBlKCk7CisJCQl4Z2lmYl9pbmZvLT5oYXNWQiA9IEhBU1ZCX05PTkU7CiAJCX0KKwl9IGVsc2UgeworCQlYR0lmYl9nZXRfVkJfdHlwZSh4Z2lmYl9pbmZvKTsKKwl9CiAKLQkJWEdJaHdfZXh0LnVqVkJDaGlwSUQgPSBWQl9DSElQX1VOS05PV047CisJaHdfaW5mby0+dWpWQkNoaXBJRCA9IFZCX0NISVBfVU5LTk9XTjsKIAotCQlYR0lod19leHQudWxFeHRlcm5hbENoaXAgPSAwOworCWh3X2luZm8tPnVsRXh0ZXJuYWxDaGlwID0gMDsKIAotCQlzd2l0Y2ggKHhnaV92aWRlb19pbmZvLmhhc1ZCKSB7Ci0JCWNhc2UgSEFTVkJfMzAxOgotCQkJcmVnID0geGdpZmJfcmVnX2dldChYR0lQQVJUNCwgMHgwMSk7Ci0JCQlpZiAocmVnID49IDB4RTApIHsKLQkJCQlYR0lod19leHQudWpWQkNoaXBJRCA9IFZCX0NISVBfMzAyTFY7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiWEdJZmI6IFhHSTMwMkxWIGJyaWRnZSBkZXRlY3RlZCAocmV2aXNpb24gMHglMDJ4KVxuIiwgcmVnKTsKLQkJCX0gZWxzZSBpZiAocmVnID49IDB4RDApIHsKLQkJCQlYR0lod19leHQudWpWQkNoaXBJRCA9IFZCX0NISVBfMzAxTFY7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiWEdJZmI6IFhHSTMwMUxWIGJyaWRnZSBkZXRlY3RlZCAocmV2aXNpb24gMHglMDJ4KVxuIiwgcmVnKTsKLQkJCX0KLQkJCS8qIGVsc2UgaWYgKHJlZyA+PSAweEIwKSB7Ci0JCQkJWEdJaHdfZXh0LnVqVkJDaGlwSUQgPSBWQl9DSElQXzMwMUI7Ci0JCQkJcmVnMSA9IHhnaWZiX3JlZ19nZXQoWEdJUEFSVDQsIDB4MjMpOwotCQkJCXByaW50aygiWEdJZmI6IFhHSTMwMUIgYnJpZGdlIGRldGVjdGVkXG4iKTsKLQkJCX0gKi8KLQkJCWVsc2UgewotCQkJCVhHSWh3X2V4dC51alZCQ2hpcElEID0gVkJfQ0hJUF8zMDE7Ci0JCQkJcHJpbnRrKCJYR0lmYjogWEdJMzAxIGJyaWRnZSBkZXRlY3RlZFxuIik7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBIQVNWQl8zMDI6Ci0JCQlyZWcgPSB4Z2lmYl9yZWdfZ2V0KFhHSVBBUlQ0LCAweDAxKTsKLQkJCWlmIChyZWcgPj0gMHhFMCkgewotCQkJCVhHSWh3X2V4dC51alZCQ2hpcElEID0gVkJfQ0hJUF8zMDJMVjsKLQkJCQlwcmludGsoS0VSTl9JTkZPICJYR0lmYjogWEdJMzAyTFYgYnJpZGdlIGRldGVjdGVkIChyZXZpc2lvbiAweCUwMngpXG4iLCByZWcpOwotCQkJfSBlbHNlIGlmIChyZWcgPj0gMHhEMCkgewotCQkJCVhHSWh3X2V4dC51alZCQ2hpcElEID0gVkJfQ0hJUF8zMDFMVjsKLQkJCQlwcmludGsoS0VSTl9JTkZPICJYR0lmYjogWEdJMzAyTFYgYnJpZGdlIGRldGVjdGVkIChyZXZpc2lvbiAweCUwMngpXG4iLCByZWcpOwotCQkJfSBlbHNlIGlmIChyZWcgPj0gMHhCMCkgewotCQkJCXJlZzEgPSB4Z2lmYl9yZWdfZ2V0KFhHSVBBUlQ0LCAweDIzKTsKLQotCQkJCVhHSWh3X2V4dC51alZCQ2hpcElEID0gVkJfQ0hJUF8zMDJCOwotCi0JCQl9IGVsc2UgewotCQkJCVhHSWh3X2V4dC51alZCQ2hpcElEID0gVkJfQ0hJUF8zMDI7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiWEdJZmI6IFhHSTMwMiBicmlkZ2UgZGV0ZWN0ZWRcbiIpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSEFTVkJfTFZEUzoKLQkJCVhHSWh3X2V4dC51bEV4dGVybmFsQ2hpcCA9IDB4MTsKLQkJCXByaW50ayhLRVJOX0lORk8gIlhHSWZiOiBMVkRTIHRyYW5zbWl0dGVyIGRldGVjdGVkXG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIEhBU1ZCX1RSVU1QSU9OOgotCQkJWEdJaHdfZXh0LnVsRXh0ZXJuYWxDaGlwID0gMHgyOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiWEdJZmI6IFRydW1waW9uIFp1cmFjIExWRFMgc2NhbGVyIGRldGVjdGVkXG4iKTsKLQkJCWJyZWFrOwotCQljYXNlIEhBU1ZCX0NIUk9OVEVMOgotCQkJWEdJaHdfZXh0LnVsRXh0ZXJuYWxDaGlwID0gMHg0OwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiWEdJZmI6IENocm9udGVsIFRWIGVuY29kZXIgZGV0ZWN0ZWRcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgSEFTVkJfTFZEU19DSFJPTlRFTDoKLQkJCVhHSWh3X2V4dC51bEV4dGVybmFsQ2hpcCA9IDB4NTsKLQkJCXByaW50ayhLRVJOX0lORk8gIlhHSWZiOiBMVkRTIHRyYW5zbWl0dGVyIGFuZCBDaHJvbnRlbCBUViBlbmNvZGVyIGRldGVjdGVkXG4iKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiWEdJZmI6IE5vIG9yIHVua25vd24gYnJpZGdlIHR5cGUgZGV0ZWN0ZWRcbiIpOwotCQkJYnJlYWs7CisJc3dpdGNoICh4Z2lmYl9pbmZvLT5oYXNWQikgeworCWNhc2UgSEFTVkJfMzAxOgorCQlyZWcgPSB4Z2lmYl9yZWdfZ2V0KFhHSVBBUlQ0LCAweDAxKTsKKwkJaWYgKHJlZyA+PSAweEUwKSB7CisJCQlod19pbmZvLT51alZCQ2hpcElEID0gVkJfQ0hJUF8zMDJMVjsKKwkJCXByaW50ayhLRVJOX0lORk8gIlhHSWZiOiBYR0kzMDJMViBicmlkZ2UgZGV0ZWN0ZWQgKHJldmlzaW9uIDB4JTAyeClcbiIsIHJlZyk7CisJCX0gZWxzZSBpZiAocmVnID49IDB4RDApIHsKKwkJCWh3X2luZm8tPnVqVkJDaGlwSUQgPSBWQl9DSElQXzMwMUxWOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiWEdJZmI6IFhHSTMwMUxWIGJyaWRnZSBkZXRlY3RlZCAocmV2aXNpb24gMHglMDJ4KVxuIiwgcmVnKTsKIAkJfQorCQkvKiBlbHNlIGlmIChyZWcgPj0gMHhCMCkgeworCQkJaHdfaW5mby0+dWpWQkNoaXBJRCA9IFZCX0NISVBfMzAxQjsKKwkJCXJlZzEgPSB4Z2lmYl9yZWdfZ2V0KFhHSVBBUlQ0LCAweDIzKTsKKwkJCXByaW50aygiWEdJZmI6IFhHSTMwMUIgYnJpZGdlIGRldGVjdGVkXG4iKTsKKwkJfSAqLworCQllbHNlIHsKKwkJCWh3X2luZm8tPnVqVkJDaGlwSUQgPSBWQl9DSElQXzMwMTsKKwkJCXByaW50aygiWEdJZmI6IFhHSTMwMSBicmlkZ2UgZGV0ZWN0ZWRcbiIpOworCQl9CisJCWJyZWFrOworCWNhc2UgSEFTVkJfMzAyOgorCQlyZWcgPSB4Z2lmYl9yZWdfZ2V0KFhHSVBBUlQ0LCAweDAxKTsKKwkJaWYgKHJlZyA+PSAweEUwKSB7CisJCQlod19pbmZvLT51alZCQ2hpcElEID0gVkJfQ0hJUF8zMDJMVjsKKwkJCXByaW50ayhLRVJOX0lORk8gIlhHSWZiOiBYR0kzMDJMViBicmlkZ2UgZGV0ZWN0ZWQgKHJldmlzaW9uIDB4JTAyeClcbiIsIHJlZyk7CisJCX0gZWxzZSBpZiAocmVnID49IDB4RDApIHsKKwkJCWh3X2luZm8tPnVqVkJDaGlwSUQgPSBWQl9DSElQXzMwMUxWOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiWEdJZmI6IFhHSTMwMkxWIGJyaWRnZSBkZXRlY3RlZCAocmV2aXNpb24gMHglMDJ4KVxuIiwgcmVnKTsKKwkJfSBlbHNlIGlmIChyZWcgPj0gMHhCMCkgeworCQkJcmVnMSA9IHhnaWZiX3JlZ19nZXQoWEdJUEFSVDQsIDB4MjMpOwogCi0JCWlmICh4Z2lfdmlkZW9faW5mby5oYXNWQiAhPSBIQVNWQl9OT05FKQotCQkJWEdJZmJfZGV0ZWN0X1ZCKCk7CisJCQlod19pbmZvLT51alZCQ2hpcElEID0gVkJfQ0hJUF8zMDJCOwogCi0JCWlmICh4Z2lfdmlkZW9faW5mby5kaXNwX3N0YXRlICYgRElTUFRZUEVfRElTUDIpIHsKLQkJCWlmIChYR0lmYl9jcnQxb2ZmKQotCQkJCXhnaV92aWRlb19pbmZvLmRpc3Bfc3RhdGUgfD0gRElTUE1PREVfU0lOR0xFOwotCQkJZWxzZQotCQkJCXhnaV92aWRlb19pbmZvLmRpc3Bfc3RhdGUgfD0gKERJU1BNT0RFX01JUlJPUiB8Ci0JCQkJCQkJICAgICAgRElTUFRZUEVfQ1JUMSk7CiAJCX0gZWxzZSB7Ci0JCQl4Z2lfdmlkZW9faW5mby5kaXNwX3N0YXRlID0gRElTUE1PREVfU0lOR0xFIHwKLQkJCQkJCSAgICBESVNQVFlQRV9DUlQxOworCQkJaHdfaW5mby0+dWpWQkNoaXBJRCA9IFZCX0NISVBfMzAyOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiWEdJZmI6IFhHSTMwMiBicmlkZ2UgZGV0ZWN0ZWRcbiIpOwogCQl9CisJCWJyZWFrOworCWNhc2UgSEFTVkJfTFZEUzoKKwkJaHdfaW5mby0+dWxFeHRlcm5hbENoaXAgPSAweDE7CisJCXByaW50ayhLRVJOX0lORk8gIlhHSWZiOiBMVkRTIHRyYW5zbWl0dGVyIGRldGVjdGVkXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBIQVNWQl9UUlVNUElPTjoKKwkJaHdfaW5mby0+dWxFeHRlcm5hbENoaXAgPSAweDI7CisJCXByaW50ayhLRVJOX0lORk8gIlhHSWZiOiBUcnVtcGlvbiBadXJhYyBMVkRTIHNjYWxlciBkZXRlY3RlZFxuIik7CisJCWJyZWFrOworCWNhc2UgSEFTVkJfQ0hST05URUw6CisJCWh3X2luZm8tPnVsRXh0ZXJuYWxDaGlwID0gMHg0OworCQlwcmludGsoS0VSTl9JTkZPICJYR0lmYjogQ2hyb250ZWwgVFYgZW5jb2RlciBkZXRlY3RlZFxuIik7CisJCWJyZWFrOworCWNhc2UgSEFTVkJfTFZEU19DSFJPTlRFTDoKKwkJaHdfaW5mby0+dWxFeHRlcm5hbENoaXAgPSAweDU7CisJCXByaW50ayhLRVJOX0lORk8gIlhHSWZiOiBMVkRTIHRyYW5zbWl0dGVyIGFuZCBDaHJvbnRlbCBUViBlbmNvZGVyIGRldGVjdGVkXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fSU5GTyAiWEdJZmI6IE5vIG9yIHVua25vd24gYnJpZGdlIHR5cGUgZGV0ZWN0ZWRcbiIpOworCQlicmVhazsKKwl9CiAKLQkJaWYgKHhnaV92aWRlb19pbmZvLmRpc3Bfc3RhdGUgJiBESVNQVFlQRV9MQ0QpIHsKLQkJCWlmICghZW5hYmxlX2RzdG4pIHsKLQkJCQlyZWcgPSB4Z2lmYl9yZWdfZ2V0KFhHSUNSLCBJTkRfWEdJX0xDRF9QQU5FTCk7Ci0JCQkJcmVnICY9IDB4MGY7Ci0JCQkJWEdJaHdfZXh0LnVsQ1JUMkxDRFR5cGUgPSBYR0kzMTBwYW5lbHR5cGVbcmVnXTsKKwlpZiAoeGdpZmJfaW5mby0+aGFzVkIgIT0gSEFTVkJfTk9ORSkKKwkJWEdJZmJfZGV0ZWN0X1ZCKHhnaWZiX2luZm8pOwogCisJaWYgKHhnaWZiX2luZm8tPmRpc3BsYXkyID09IFhHSUZCX0RJU1BfTENEKSB7CisJCWlmICghZW5hYmxlX2RzdG4pIHsKKwkJCXJlZyA9IHhnaWZiX3JlZ19nZXQoWEdJQ1IsIElORF9YR0lfTENEX1BBTkVMKTsKKwkJCXJlZyAmPSAweDBmOworCQkJaHdfaW5mby0+dWxDUlQyTENEVHlwZSA9IFhHSTMxMHBhbmVsdHlwZVtyZWddOworCisJCX0gZWxzZSB7CisJCQkvKiBUVzogRlNUTi9EU1ROICovCisJCQlod19pbmZvLT51bENSVDJMQ0RUeXBlID0gTENEXzMyMHg0ODA7CisJCX0KKwl9CisKKwlpZiAoKGh3X2luZm8tPnVqVkJDaGlwSUQgPT0gVkJfQ0hJUF8zMDJCKSB8fAorCQkJKGh3X2luZm8tPnVqVkJDaGlwSUQgPT0gVkJfQ0hJUF8zMDFMVikgfHwKKwkJCShod19pbmZvLT51alZCQ2hpcElEID09IFZCX0NISVBfMzAyTFYpKSB7CisJCWludCB0bXA7CisJCXRtcCA9IHhnaWZiX3JlZ19nZXQoWEdJQ1IsIDB4MzQpOworCQlpZiAodG1wIDw9IDB4MTMpIHsKKwkJCS8qIEN1cnJlbnRseSBvbiBMQ0RBPworCQkJICooU29tZSBCSU9TZXMgbGVhdmUgQ1IzOCkgKi8KKwkJCXRtcCA9IHhnaWZiX3JlZ19nZXQoWEdJQ1IsIDB4MzgpOworCQkJaWYgKCh0bXAgJiAweDAzKSA9PSAweDAzKSB7CisJCQkJLyogWEdJX1ByLlhHSV9Vc2VMQ0RBID0gMTsgKi8KIAkJCX0gZWxzZSB7Ci0JCQkJLyogVFc6IEZTVE4vRFNUTiAqLwotCQkJCVhHSWh3X2V4dC51bENSVDJMQ0RUeXBlID0gTENEXzMyMHg0ODA7Ci0JCQl9Ci0JCX0KLQotCQlYR0lmYl9kZXRlY3RlZHBkYyA9IDA7Ci0KLQkJWEdJZmJfZGV0ZWN0ZWRsY2RhID0gMHhmZjsKLQotCQkvKiBUVzogVHJ5IHRvIGZpbmQgYWJvdXQgTENEQSAqLwotCi0JCWlmICgoWEdJaHdfZXh0LnVqVkJDaGlwSUQgPT0gVkJfQ0hJUF8zMDJCKSB8fAotCQkJCShYR0lod19leHQudWpWQkNoaXBJRCA9PSBWQl9DSElQXzMwMUxWKSB8fAotCQkJCShYR0lod19leHQudWpWQkNoaXBJRCA9PSBWQl9DSElQXzMwMkxWKSkgewotCQkJaW50IHRtcDsKLQkJCXRtcCA9IHhnaWZiX3JlZ19nZXQoWEdJQ1IsIDB4MzQpOwotCQkJaWYgKHRtcCA8PSAweDEzKSB7CiAJCQkJLyogQ3VycmVudGx5IG9uIExDREE/Ci0JCQkJICooU29tZSBCSU9TZXMgbGVhdmUgQ1IzOCkgKi8KLQkJCQl0bXAgPSB4Z2lmYl9yZWdfZ2V0KFhHSUNSLCAweDM4KTsKLQkJCQlpZiAoKHRtcCAmIDB4MDMpID09IDB4MDMpIHsKKwkJCQkgKihTb21lIG5ld2VyIEJJT1NlcyBzZXQgRDAgaW4gQ1IzNSkgKi8KKwkJCQl0bXAgPSB4Z2lmYl9yZWdfZ2V0KFhHSUNSLCAweDM1KTsKKwkJCQlpZiAodG1wICYgMHgwMSkgewogCQkJCQkvKiBYR0lfUHIuWEdJX1VzZUxDREEgPSAxOyAqLwogCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIEN1cnJlbnRseSBvbiBMQ0RBPwotCQkJCQkgKihTb21lIG5ld2VyIEJJT1NlcyBzZXQgRDAgaW4gQ1IzNSkgKi8KLQkJCQkJdG1wID0geGdpZmJfcmVnX2dldChYR0lDUiwgMHgzNSk7Ci0JCQkJCWlmICh0bXAgJiAweDAxKSB7Ci0JCQkJCQkvKiBYR0lfUHIuWEdJX1VzZUxDREEgPSAxOyAqLwotCQkJCQl9IGVsc2UgewotCQkJCQkJdG1wID0geGdpZmJfcmVnX2dldChYR0lDUiwKLQkJCQkJCQkJICAgIDB4MzApOwotCQkJCQkJaWYgKHRtcCAmIDB4MjApIHsKLQkJCQkJCQl0bXAgPSB4Z2lmYl9yZWdfZ2V0KAotCQkJCQkJCQlYR0lQQVJUMSwgMHgxMyk7Ci0JCQkJCQkJaWYgKHRtcCAmIDB4MDQpIHsKLQkJCQkJCQkJLyogWEdJX1ByLlhHSV9Vc2VMQ0RBID0gMTsgKi8KLQkJCQkJCQl9CisJCQkJCXRtcCA9IHhnaWZiX3JlZ19nZXQoWEdJQ1IsCisJCQkJCQkJICAgIDB4MzApOworCQkJCQlpZiAodG1wICYgMHgyMCkgeworCQkJCQkJdG1wID0geGdpZmJfcmVnX2dldCgKKwkJCQkJCQlYR0lQQVJUMSwgMHgxMyk7CisJCQkJCQlpZiAodG1wICYgMHgwNCkgeworCQkJCQkJCS8qIFhHSV9Qci5YR0lfVXNlTENEQSA9IDE7ICovCiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0KIAkJfQogCi0JCWlmICh4Z2lmYl9tb2RlX2lkeCA+PSAwKQotCQkJeGdpZmJfbW9kZV9pZHggPSBYR0lmYl92YWxpZGF0ZV9tb2RlKHhnaWZiX21vZGVfaWR4KTsKKwl9CiAKLQkJaWYgKHhnaWZiX21vZGVfaWR4IDwgMCkgewotCQkJc3dpdGNoICh4Z2lfdmlkZW9faW5mby5kaXNwX3N0YXRlICYgRElTUFRZUEVfRElTUDIpIHsKLQkJCWNhc2UgRElTUFRZUEVfTENEOgotCQkJCXhnaWZiX21vZGVfaWR4ID0gREVGQVVMVF9MQ0RNT0RFOwotCQkJCWlmICh4Z2lfdmlkZW9faW5mby5jaGlwID09IFhHMjEpCi0JCQkJCXhnaWZiX21vZGVfaWR4ID0KLQkJCQkJICAgIFhHSWZiX0dldFhHMjFEZWZhdWx0TFZEU01vZGVJZHgoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRElTUFRZUEVfVFY6Ci0JCQkJeGdpZmJfbW9kZV9pZHggPSBERUZBVUxUX1RWTU9ERTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJeGdpZmJfbW9kZV9pZHggPSBERUZBVUxUX01PREU7CisJeGdpZmJfaW5mby0+bW9kZV9pZHggPSAtMTsKKworCWlmIChtb2RlKQorCQlYR0lmYl9zZWFyY2hfbW9kZSh4Z2lmYl9pbmZvLCBtb2RlKTsKKwllbHNlIGlmICh2ZXNhICE9IC0xKQorCQlYR0lmYl9zZWFyY2hfdmVzYW1vZGUoeGdpZmJfaW5mbywgdmVzYSk7CisKKwlpZiAoeGdpZmJfaW5mby0+bW9kZV9pZHggPj0gMCkKKwkJeGdpZmJfaW5mby0+bW9kZV9pZHggPQorCQkJWEdJZmJfdmFsaWRhdGVfbW9kZSh4Z2lmYl9pbmZvLCB4Z2lmYl9pbmZvLT5tb2RlX2lkeCk7CisKKwlpZiAoeGdpZmJfaW5mby0+bW9kZV9pZHggPCAwKSB7CisJCWlmICh4Z2lmYl9pbmZvLT5kaXNwbGF5MiA9PSBYR0lGQl9ESVNQX0xDRCAmJgorCQkgICAgeGdpZmJfaW5mby0+Y2hpcCA9PSBYRzIxKQorCQkJeGdpZmJfaW5mby0+bW9kZV9pZHggPQorCQkJCVhHSWZiX0dldFhHMjFEZWZhdWx0TFZEU01vZGVJZHgoKTsKKwkJZWxzZQorCQkJeGdpZmJfaW5mby0+bW9kZV9pZHggPSBERUZBVUxUX01PREU7CisJfQorCisJaWYgKHhnaWZiX2luZm8tPm1vZGVfaWR4IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBzdXBwb3J0ZWQgdmlkZW8gbW9kZSBmb3VuZFxuIik7CisJCWdvdG8gZXJyb3JfMTsKKwl9CisKKwlpZiAoeGdpMjFfZHJ2bGNkY2FwbGlzdCkgeworCQlpbnQgbTsKKworCQlmb3IgKG0gPSAwOyBtIDwgQVJSQVlfU0laRShYR0kyMV9MQ0RDYXBMaXN0KTsgbSsrKQorCQkJaWYgKChYR0kyMV9MQ0RDYXBMaXN0W21dLkxWRFNIREUgPT0KKwkJCQlYR0liaW9zX21vZGVbeGdpZmJfaW5mby0+bW9kZV9pZHhdLnhyZXMpICYmCisJCQkgICAgKFhHSTIxX0xDRENhcExpc3RbbV0uTFZEU1ZERSA9PQorCQkJCVhHSWJpb3NfbW9kZVt4Z2lmYl9pbmZvLT5tb2RlX2lkeF0ueXJlcykpIHsKKwkJCQl4Z2lmYl9yZWdfc2V0KHhnaWZiX2luZm8tPmRldl9pbmZvLlAzZDQsCisJCQkJCSAgICAgIDB4MzYsCisJCQkJCSAgICAgIG0pOwogCQkJCWJyZWFrOwogCQkJfQorCX0KKworCS8qIHlpbGluIHNldCBkZWZhdWx0IHJlZnJlc2ggcmF0ZSAqLworCXhnaWZiX2luZm8tPnJlZnJlc2hfcmF0ZSA9IHJlZnJlc2hfcmF0ZTsKKwlpZiAoeGdpZmJfaW5mby0+cmVmcmVzaF9yYXRlID09IDApCisJCXhnaWZiX2luZm8tPnJlZnJlc2hfcmF0ZSA9IDYwOworCWlmIChYR0lmYl9zZWFyY2hfcmVmcmVzaF9yYXRlKHhnaWZiX2luZm8sCisJCQl4Z2lmYl9pbmZvLT5yZWZyZXNoX3JhdGUpID09IDApIHsKKwkJeGdpZmJfaW5mby0+cmF0ZV9pZHggPQorCQkJWEdJYmlvc19tb2RlW3hnaWZiX2luZm8tPm1vZGVfaWR4XS5yYXRlX2lkeDsKKwkJeGdpZmJfaW5mby0+cmVmcmVzaF9yYXRlID0gNjA7CisJfQorCisJeGdpZmJfaW5mby0+dmlkZW9fYnBwID0gWEdJYmlvc19tb2RlW3hnaWZiX2luZm8tPm1vZGVfaWR4XS5icHA7CisJeGdpZmJfaW5mby0+dmlkZW9fdndpZHRoID0KKwkJeGdpZmJfaW5mby0+dmlkZW9fd2lkdGggPQorCQkJWEdJYmlvc19tb2RlW3hnaWZiX2luZm8tPm1vZGVfaWR4XS54cmVzOworCXhnaWZiX2luZm8tPnZpZGVvX3ZoZWlnaHQgPQorCQl4Z2lmYl9pbmZvLT52aWRlb19oZWlnaHQgPQorCQkJWEdJYmlvc19tb2RlW3hnaWZiX2luZm8tPm1vZGVfaWR4XS55cmVzOworCXhnaWZiX2luZm8tPm9yZ194ID0geGdpZmJfaW5mby0+b3JnX3kgPSAwOworCXhnaWZiX2luZm8tPnZpZGVvX2xpbmVsZW5ndGggPQorCQl4Z2lmYl9pbmZvLT52aWRlb193aWR0aCAqCisJCSh4Z2lmYl9pbmZvLT52aWRlb19icHAgPj4gMyk7CisJc3dpdGNoICh4Z2lmYl9pbmZvLT52aWRlb19icHApIHsKKwljYXNlIDg6CisJCXhnaWZiX2luZm8tPkRzdENvbG9yID0gMHgwMDAwOworCQl4Z2lmYl9pbmZvLT5YR0kzMTBfQWNjZWxEZXB0aCA9IDB4MDAwMDAwMDA7CisJCXhnaWZiX2luZm8tPnZpZGVvX2NtYXBfbGVuID0gMjU2OworCQlicmVhazsKKwljYXNlIDE2OgorCQl4Z2lmYl9pbmZvLT5Ec3RDb2xvciA9IDB4ODAwMDsKKwkJeGdpZmJfaW5mby0+WEdJMzEwX0FjY2VsRGVwdGggPSAweDAwMDEwMDAwOworCQl4Z2lmYl9pbmZvLT52aWRlb19jbWFwX2xlbiA9IDE2OworCQlicmVhazsKKwljYXNlIDMyOgorCQl4Z2lmYl9pbmZvLT5Ec3RDb2xvciA9IDB4QzAwMDsKKwkJeGdpZmJfaW5mby0+WEdJMzEwX0FjY2VsRGVwdGggPSAweDAwMDIwMDAwOworCQl4Z2lmYl9pbmZvLT52aWRlb19jbWFwX2xlbiA9IDE2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQl4Z2lmYl9pbmZvLT52aWRlb19jbWFwX2xlbiA9IDE2OworCQlwcmludGsoS0VSTl9JTkZPICJYR0lmYjogVW5zdXBwb3J0ZWQgZGVwdGggJWQiLAorCQkgICAgICAgeGdpZmJfaW5mby0+dmlkZW9fYnBwKTsKKwkJYnJlYWs7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyAiWEdJZmI6IERlZmF1bHQgbW9kZSBpcyAlZHglZHglZCAoJWRIeilcbiIsCisJICAgICAgIHhnaWZiX2luZm8tPnZpZGVvX3dpZHRoLAorCSAgICAgICB4Z2lmYl9pbmZvLT52aWRlb19oZWlnaHQsCisJICAgICAgIHhnaWZiX2luZm8tPnZpZGVvX2JwcCwKKwkgICAgICAgeGdpZmJfaW5mby0+cmVmcmVzaF9yYXRlKTsKKworCWZiX2luZm8tPnZhci5yZWQubGVuZ3RoCQk9IDg7CisJZmJfaW5mby0+dmFyLmdyZWVuLmxlbmd0aAk9IDg7CisJZmJfaW5mby0+dmFyLmJsdWUubGVuZ3RoCT0gODsKKwlmYl9pbmZvLT52YXIuYWN0aXZhdGUJCT0gRkJfQUNUSVZBVEVfTk9XOworCWZiX2luZm8tPnZhci5oZWlnaHQJCT0gLTE7CisJZmJfaW5mby0+dmFyLndpZHRoCQk9IC0xOworCWZiX2luZm8tPnZhci52bW9kZQkJPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEOworCWZiX2luZm8tPnZhci54cmVzCQk9IHhnaWZiX2luZm8tPnZpZGVvX3dpZHRoOworCWZiX2luZm8tPnZhci54cmVzX3ZpcnR1YWwJPSB4Z2lmYl9pbmZvLT52aWRlb193aWR0aDsKKwlmYl9pbmZvLT52YXIueXJlcwkJPSB4Z2lmYl9pbmZvLT52aWRlb19oZWlnaHQ7CisJZmJfaW5mby0+dmFyLnlyZXNfdmlydHVhbAk9IHhnaWZiX2luZm8tPnZpZGVvX2hlaWdodDsKKwlmYl9pbmZvLT52YXIuYml0c19wZXJfcGl4ZWwJPSB4Z2lmYl9pbmZvLT52aWRlb19icHA7CisKKwlYR0lmYl9icHBfdG9fdmFyKHhnaWZiX2luZm8sICZmYl9pbmZvLT52YXIpOworCisJZmJfaW5mby0+dmFyLnBpeGNsb2NrID0gKHUzMikgKDEwMDAwMDAwMDAgLworCQkJWEdJZmJfbW9kZV9yYXRlX3RvX2RjbG9jaygmeGdpZmJfaW5mby0+ZGV2X2luZm8sCisJCQkJaHdfaW5mbywKKwkJCQlYR0liaW9zX21vZGVbeGdpZmJfaW5mby0+bW9kZV9pZHhdLm1vZGVfbm8sCisJCQkJeGdpZmJfaW5mby0+cmF0ZV9pZHgpKTsKKworCWlmIChYR0lmYl9tb2RlX3JhdGVfdG9fZGRhdGEoJnhnaWZiX2luZm8tPmRldl9pbmZvLCBod19pbmZvLAorCQlYR0liaW9zX21vZGVbeGdpZmJfaW5mby0+bW9kZV9pZHhdLm1vZGVfbm8sCisJCXhnaWZiX2luZm8tPnJhdGVfaWR4LAorCQkmZmJfaW5mby0+dmFyLmxlZnRfbWFyZ2luLAorCQkmZmJfaW5mby0+dmFyLnJpZ2h0X21hcmdpbiwKKwkJJmZiX2luZm8tPnZhci51cHBlcl9tYXJnaW4sCisJCSZmYl9pbmZvLT52YXIubG93ZXJfbWFyZ2luLAorCQkmZmJfaW5mby0+dmFyLmhzeW5jX2xlbiwKKwkJJmZiX2luZm8tPnZhci52c3luY19sZW4sCisJCSZmYl9pbmZvLT52YXIuc3luYywKKwkJJmZiX2luZm8tPnZhci52bW9kZSkpIHsKKworCQlpZiAoKGZiX2luZm8tPnZhci52bW9kZSAmIEZCX1ZNT0RFX01BU0spID09CisJCSAgICBGQl9WTU9ERV9JTlRFUkxBQ0VEKSB7CisJCQlmYl9pbmZvLT52YXIueXJlcyA8PD0gMTsKKwkJCWZiX2luZm8tPnZhci55cmVzX3ZpcnR1YWwgPDw9IDE7CisJCX0gZWxzZSBpZiAoKGZiX2luZm8tPnZhci52bW9kZSAmIEZCX1ZNT0RFX01BU0spID09CisJCQkgICBGQl9WTU9ERV9ET1VCTEUpIHsKKwkJCWZiX2luZm8tPnZhci5waXhjbG9jayA+Pj0gMTsKKwkJCWZiX2luZm8tPnZhci55cmVzID4+PSAxOworCQkJZmJfaW5mby0+dmFyLnlyZXNfdmlydHVhbCA+Pj0gMTsKIAkJfQogCi0JCVhHSWZiX21vZGVfbm8gPSBYR0liaW9zX21vZGVbeGdpZmJfbW9kZV9pZHhdLm1vZGVfbm87CisJfQogCi0JCS8qIHlpbGluIHNldCBkZWZhdWx0IHJlZnJlc2ggcmF0ZSAqLwotCQlpZiAoeGdpX3ZpZGVvX2luZm8ucmVmcmVzaF9yYXRlID09IDApCi0JCQl4Z2lfdmlkZW9faW5mby5yZWZyZXNoX3JhdGUgPSA2MDsKLQkJaWYgKFhHSWZiX3NlYXJjaF9yZWZyZXNoX3JhdGUoCi0JCQkJeGdpX3ZpZGVvX2luZm8ucmVmcmVzaF9yYXRlKSA9PSAwKSB7Ci0JCQlYR0lmYl9yYXRlX2lkeCA9IFhHSWJpb3NfbW9kZVt4Z2lmYl9tb2RlX2lkeF0ucmF0ZV9pZHg7Ci0JCQl4Z2lfdmlkZW9faW5mby5yZWZyZXNoX3JhdGUgPSA2MDsKLQkJfQorCXN0cm5jcHkoZmJfaW5mby0+Zml4LmlkLCAiWEdJIiwgc2l6ZW9mKGZiX2luZm8tPmZpeC5pZCkgLSAxKTsKKwlmYl9pbmZvLT5maXgudHlwZQk9IEZCX1RZUEVfUEFDS0VEX1BJWEVMUzsKKwlmYl9pbmZvLT5maXgueHBhbnN0ZXAJPSAxOworCWZiX2luZm8tPmZpeC55cGFuc3RlcAk9IDE7CiAKLQkJeGdpX3ZpZGVvX2luZm8udmlkZW9fYnBwID0gWEdJYmlvc19tb2RlW3hnaWZiX21vZGVfaWR4XS5icHA7Ci0JCXhnaV92aWRlb19pbmZvLnZpZGVvX3Z3aWR0aCA9Ci0JCQl4Z2lfdmlkZW9faW5mby52aWRlb193aWR0aCA9Ci0JCQkJWEdJYmlvc19tb2RlW3hnaWZiX21vZGVfaWR4XS54cmVzOwotCQl4Z2lfdmlkZW9faW5mby52aWRlb192aGVpZ2h0ID0KLQkJCXhnaV92aWRlb19pbmZvLnZpZGVvX2hlaWdodCA9Ci0JCQkJWEdJYmlvc19tb2RlW3hnaWZiX21vZGVfaWR4XS55cmVzOwotCQl4Z2lfdmlkZW9faW5mby5vcmdfeCA9IHhnaV92aWRlb19pbmZvLm9yZ195ID0gMDsKLQkJeGdpX3ZpZGVvX2luZm8udmlkZW9fbGluZWxlbmd0aCA9Ci0JCQl4Z2lfdmlkZW9faW5mby52aWRlb193aWR0aCAqCi0JCQkoeGdpX3ZpZGVvX2luZm8udmlkZW9fYnBwID4+IDMpOwotCQlzd2l0Y2ggKHhnaV92aWRlb19pbmZvLnZpZGVvX2JwcCkgewotCQljYXNlIDg6Ci0JCQl4Z2lfdmlkZW9faW5mby5Ec3RDb2xvciA9IDB4MDAwMDsKLQkJCXhnaV92aWRlb19pbmZvLlhHSTMxMF9BY2NlbERlcHRoID0gMHgwMDAwMDAwMDsKLQkJCXhnaV92aWRlb19pbmZvLnZpZGVvX2NtYXBfbGVuID0gMjU2OwotCQkJYnJlYWs7Ci0JCWNhc2UgMTY6Ci0JCQl4Z2lfdmlkZW9faW5mby5Ec3RDb2xvciA9IDB4ODAwMDsKLQkJCXhnaV92aWRlb19pbmZvLlhHSTMxMF9BY2NlbERlcHRoID0gMHgwMDAxMDAwMDsKLQkJCXhnaV92aWRlb19pbmZvLnZpZGVvX2NtYXBfbGVuID0gMTY7Ci0JCQlicmVhazsKLQkJY2FzZSAzMjoKLQkJCXhnaV92aWRlb19pbmZvLkRzdENvbG9yID0gMHhDMDAwOwotCQkJeGdpX3ZpZGVvX2luZm8uWEdJMzEwX0FjY2VsRGVwdGggPSAweDAwMDIwMDAwOwotCQkJeGdpX3ZpZGVvX2luZm8udmlkZW9fY21hcF9sZW4gPSAxNjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJeGdpX3ZpZGVvX2luZm8udmlkZW9fY21hcF9sZW4gPSAxNjsKLQkJCXByaW50ayhLRVJOX0lORk8gIlhHSWZiOiBVbnN1cHBvcnRlZCBkZXB0aCAlZCIsCi0JCQkgICAgICAgeGdpX3ZpZGVvX2luZm8udmlkZW9fYnBwKTsKLQkJCWJyZWFrOwotCQl9CisJZmJfaW5mby0+ZmxhZ3MgPSBGQklORk9fRkxBR19ERUZBVUxUOworCWZiX2luZm8tPnNjcmVlbl9iYXNlID0geGdpZmJfaW5mby0+dmlkZW9fdmJhc2U7CisJZmJfaW5mby0+ZmJvcHMgPSAmWEdJZmJfb3BzOworCVhHSWZiX2dldF9maXgoJmZiX2luZm8tPmZpeCwgLTEsIGZiX2luZm8pOworCWZiX2luZm8tPnBzZXVkb19wYWxldHRlID0geGdpZmJfaW5mby0+cHNldWRvX3BhbGV0dGU7CiAKLQkJcHJpbnRrKEtFUk5fSU5GTyAiWEdJZmI6IERlZmF1bHQgbW9kZSBpcyAlZHglZHglZCAoJWRIeilcbiIsCi0JCSAgICAgICB4Z2lfdmlkZW9faW5mby52aWRlb193aWR0aCwKLQkJICAgICAgIHhnaV92aWRlb19pbmZvLnZpZGVvX2hlaWdodCwKLQkJICAgICAgIHhnaV92aWRlb19pbmZvLnZpZGVvX2JwcCwKLQkJICAgICAgIHhnaV92aWRlb19pbmZvLnJlZnJlc2hfcmF0ZSk7Ci0KLQkJZGVmYXVsdF92YXIueHJlcyA9Ci0JCQlkZWZhdWx0X3Zhci54cmVzX3ZpcnR1YWwgPQotCQkJCXhnaV92aWRlb19pbmZvLnZpZGVvX3dpZHRoOwotCQlkZWZhdWx0X3Zhci55cmVzID0KLQkJCWRlZmF1bHRfdmFyLnlyZXNfdmlydHVhbCA9Ci0JCQkJeGdpX3ZpZGVvX2luZm8udmlkZW9faGVpZ2h0OwotCQlkZWZhdWx0X3Zhci5iaXRzX3Blcl9waXhlbCA9IHhnaV92aWRlb19pbmZvLnZpZGVvX2JwcDsKLQotCQlYR0lmYl9icHBfdG9fdmFyKCZkZWZhdWx0X3Zhcik7Ci0KLQkJZGVmYXVsdF92YXIucGl4Y2xvY2sgPSAodTMyKSAoMTAwMDAwMDAwMCAvCi0JCQkJWEdJZmJfbW9kZV9yYXRlX3RvX2RjbG9jaygmWEdJX1ByLCAmWEdJaHdfZXh0LAotCQkJCQkJWEdJZmJfbW9kZV9ubywgWEdJZmJfcmF0ZV9pZHgpKTsKLQotCQlpZiAoWEdJZmJfbW9kZV9yYXRlX3RvX2RkYXRhKCZYR0lfUHIsICZYR0lod19leHQsCi0JCQlYR0lmYl9tb2RlX25vLCBYR0lmYl9yYXRlX2lkeCwKLQkJCSZkZWZhdWx0X3Zhci5sZWZ0X21hcmdpbiwgJmRlZmF1bHRfdmFyLnJpZ2h0X21hcmdpbiwKLQkJCSZkZWZhdWx0X3Zhci51cHBlcl9tYXJnaW4sICZkZWZhdWx0X3Zhci5sb3dlcl9tYXJnaW4sCi0JCQkmZGVmYXVsdF92YXIuaHN5bmNfbGVuLCAmZGVmYXVsdF92YXIudnN5bmNfbGVuLAotCQkJJmRlZmF1bHRfdmFyLnN5bmMsICZkZWZhdWx0X3Zhci52bW9kZSkpIHsKLQotCQkJaWYgKChkZWZhdWx0X3Zhci52bW9kZSAmIEZCX1ZNT0RFX01BU0spID09Ci0JCQkgICAgRkJfVk1PREVfSU5URVJMQUNFRCkgewotCQkJCWRlZmF1bHRfdmFyLnlyZXMgPDw9IDE7Ci0JCQkJZGVmYXVsdF92YXIueXJlc192aXJ0dWFsIDw8PSAxOwotCQkJfSBlbHNlIGlmICgoZGVmYXVsdF92YXIudm1vZGUgJiBGQl9WTU9ERV9NQVNLKSA9PQotCQkJCSAgIEZCX1ZNT0RFX0RPVUJMRSkgewotCQkJCWRlZmF1bHRfdmFyLnBpeGNsb2NrID4+PSAxOwotCQkJCWRlZmF1bHRfdmFyLnlyZXMgPj49IDE7Ci0JCQkJZGVmYXVsdF92YXIueXJlc192aXJ0dWFsID4+PSAxOwotCQkJfQotCi0JCX0KLQotCQlmYl9pbmZvLT5mbGFncyA9IEZCSU5GT19GTEFHX0RFRkFVTFQ7Ci0JCWZiX2luZm8tPnZhciA9IGRlZmF1bHRfdmFyOwotCQlmYl9pbmZvLT5maXggPSBYR0lmYl9maXg7Ci0JCWZiX2luZm8tPnBhciA9ICZ4Z2lfdmlkZW9faW5mbzsKLQkJZmJfaW5mby0+c2NyZWVuX2Jhc2UgPSB4Z2lfdmlkZW9faW5mby52aWRlb192YmFzZTsKLQkJZmJfaW5mby0+ZmJvcHMgPSAmWEdJZmJfb3BzOwotCQlYR0lmYl9nZXRfZml4KCZmYl9pbmZvLT5maXgsIC0xLCBmYl9pbmZvKTsKLQkJZmJfaW5mby0+cHNldWRvX3BhbGV0dGUgPSBwc2V1ZG9fcGFsZXR0ZTsKLQotCQlmYl9hbGxvY19jbWFwKCZmYl9pbmZvLT5jbWFwLCAyNTYgLCAwKTsKKwlmYl9hbGxvY19jbWFwKCZmYl9pbmZvLT5jbWFwLCAyNTYgLCAwKTsKIAogI2lmZGVmIENPTkZJR19NVFJSCi0JCXhnaV92aWRlb19pbmZvLm10cnIgPSBtdHJyX2FkZCgKLQkJCSh1bnNpZ25lZCBpbnQpIHhnaV92aWRlb19pbmZvLnZpZGVvX2Jhc2UsCi0JCQkodW5zaWduZWQgaW50KSB4Z2lfdmlkZW9faW5mby52aWRlb19zaXplLAotCQkJTVRSUl9UWVBFX1dSQ09NQiwgMSk7Ci0JCWlmICh4Z2lfdmlkZW9faW5mby5tdHJyKQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiWEdJZmI6IEFkZGVkIE1UUlJzXG4iKTsKKwl4Z2lmYl9pbmZvLT5tdHJyID0gbXRycl9hZGQoeGdpZmJfaW5mby0+dmlkZW9fYmFzZSwKKwkJeGdpZmJfaW5mby0+dmlkZW9fc2l6ZSwgTVRSUl9UWVBFX1dSQ09NQiwgMSk7CisJaWYgKHhnaWZiX2luZm8tPm10cnIgPj0gMCkKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwgImFkZGVkIE1UUlJcbiIpOwogI2VuZGlmCiAKLQkJaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGZiX2luZm8pIDwgMCkgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gZXJyb3JfMTsKLQkJfQotCi0JCVhHSWZiX3JlZ2lzdGVyZWQgPSAxOwotCi0JCXByaW50ayhLRVJOX0lORk8gImZiJWQ6ICVzIGZyYW1lIGJ1ZmZlciBkZXZpY2UsIFZlcnNpb24gJWQuJWQuJTAyZFxuIiwKLQkJICAgICAgIGZiX2luZm8tPm5vZGUsIG15aWQsIFZFUl9NQUpPUiwgVkVSX01JTk9SLCBWRVJfTEVWRUwpOwotCisJaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGZiX2luZm8pIDwgMCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yX210cnI7CiAJfQogCiAJZHVtcFZHQVJlZygpOwogCiAJcmV0dXJuIDA7CiAKK2Vycm9yX210cnI6CisjaWZkZWYgQ09ORklHX01UUlIKKwlpZiAoeGdpZmJfaW5mby0+bXRyciA+PSAwKQorCQltdHJyX2RlbCh4Z2lmYl9pbmZvLT5tdHJyLCB4Z2lmYl9pbmZvLT52aWRlb19iYXNlLAorCQkJeGdpZmJfaW5mby0+dmlkZW9fc2l6ZSk7CisjZW5kaWYgLyogQ09ORklHX01UUlIgKi8KIGVycm9yXzE6Ci0JaW91bm1hcCh4Z2lfdmlkZW9faW5mby5tbWlvX3ZiYXNlKTsKLQlpb3VubWFwKHhnaV92aWRlb19pbmZvLnZpZGVvX3ZiYXNlKTsKLQlyZWxlYXNlX21lbV9yZWdpb24oeGdpX3ZpZGVvX2luZm8ubW1pb19iYXNlLCB4Z2lfdmlkZW9faW5mby5tbWlvX3NpemUpOworCWlvdW5tYXAoeGdpZmJfaW5mby0+bW1pb192YmFzZSk7CisJaW91bm1hcCh4Z2lmYl9pbmZvLT52aWRlb192YmFzZSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHhnaWZiX2luZm8tPm1taW9fYmFzZSwgeGdpZmJfaW5mby0+bW1pb19zaXplKTsKIGVycm9yXzA6Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHhnaV92aWRlb19pbmZvLnZpZGVvX2Jhc2UsCi0JCQkgICB4Z2lfdmlkZW9faW5mby52aWRlb19zaXplKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oeGdpZmJfaW5mby0+dmlkZW9fYmFzZSwgeGdpZmJfaW5mby0+dmlkZW9fc2l6ZSk7CiBlcnJvcjoKLQl2ZnJlZShYR0lod19leHQucGpWaXJ0dWFsUm9tQmFzZSk7CisJdmZyZWUoaHdfaW5mby0+cGpWaXJ0dWFsUm9tQmFzZSk7CiAJZnJhbWVidWZmZXJfcmVsZWFzZShmYl9pbmZvKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjUyNSwxMyArMjQ0MCwyMCBAQAogCiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgeGdpZmJfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogeworCXN0cnVjdCB4Z2lmYl92aWRlb19pbmZvICp4Z2lmYl9pbmZvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBmYl9pbmZvICpmYl9pbmZvID0geGdpZmJfaW5mby0+ZmJfaW5mbzsKKwogCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoZmJfaW5mbyk7Ci0JaW91bm1hcCh4Z2lfdmlkZW9faW5mby5tbWlvX3ZiYXNlKTsKLQlpb3VubWFwKHhnaV92aWRlb19pbmZvLnZpZGVvX3ZiYXNlKTsKLQlyZWxlYXNlX21lbV9yZWdpb24oeGdpX3ZpZGVvX2luZm8ubW1pb19iYXNlLCB4Z2lfdmlkZW9faW5mby5tbWlvX3NpemUpOwotCXJlbGVhc2VfbWVtX3JlZ2lvbih4Z2lfdmlkZW9faW5mby52aWRlb19iYXNlLAotCQkJICAgeGdpX3ZpZGVvX2luZm8udmlkZW9fc2l6ZSk7Ci0JdmZyZWUoWEdJaHdfZXh0LnBqVmlydHVhbFJvbUJhc2UpOworI2lmZGVmIENPTkZJR19NVFJSCisJaWYgKHhnaWZiX2luZm8tPm10cnIgPj0gMCkKKwkJbXRycl9kZWwoeGdpZmJfaW5mby0+bXRyciwgeGdpZmJfaW5mby0+dmlkZW9fYmFzZSwKKwkJCXhnaWZiX2luZm8tPnZpZGVvX3NpemUpOworI2VuZGlmIC8qIENPTkZJR19NVFJSICovCisJaW91bm1hcCh4Z2lmYl9pbmZvLT5tbWlvX3ZiYXNlKTsKKwlpb3VubWFwKHhnaWZiX2luZm8tPnZpZGVvX3ZiYXNlKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oeGdpZmJfaW5mby0+bW1pb19iYXNlLCB4Z2lmYl9pbmZvLT5tbWlvX3NpemUpOworCXJlbGVhc2VfbWVtX3JlZ2lvbih4Z2lmYl9pbmZvLT52aWRlb19iYXNlLCB4Z2lmYl9pbmZvLT52aWRlb19zaXplKTsKKwl2ZnJlZSh4Z2lmYl9pbmZvLT5od19pbmZvLnBqVmlydHVhbFJvbUJhc2UpOwogCWZyYW1lYnVmZmVyX3JlbGVhc2UoZmJfaW5mbyk7CiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogfQpAQCAtMjU0Myw3ICsyNDY1LDcgQEAKIAkucmVtb3ZlID0gX19kZXZleGl0X3AoeGdpZmJfcmVtb3ZlKQogfTsKIAotWEdJSU5JVFNUQVRJQyBpbnQgX19pbml0IHhnaWZiX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHhnaWZiX2luaXQodm9pZCkKIHsKIAljaGFyICpvcHRpb24gPSBOVUxMOwogCkBAIC0yNTU0LDkgKzI0NzYsNyBAQAogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ4Z2lmYl9kcml2ZXIpOwogfQogCi0jaWZuZGVmIE1PRFVMRQogbW9kdWxlX2luaXQoeGdpZmJfaW5pdCk7Ci0jZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgTU9EVUxFICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjU2NCwxNTQgKzI0ODQsMzIgQEAKIAogI2lmZGVmIE1PRFVMRQogCi1zdGF0aWMgY2hhciAqbW9kZSA9IE5VTEw7Ci1zdGF0aWMgaW50IHZlc2EgPSAwOwotc3RhdGljIHVuc2lnbmVkIGludCByYXRlID0gMDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgbWVtID0gMDsKLXN0YXRpYyBjaGFyICpmb3JjZWNydDJ0eXBlID0gTlVMTDsKLXN0YXRpYyBpbnQgZm9yY2VjcnQxID0gLTE7Ci1zdGF0aWMgaW50IHBkYyA9IC0xOwotc3RhdGljIGludCBwZGMxID0gLTE7Ci1zdGF0aWMgaW50IG5veXBhbiA9IC0xOwotc3RhdGljIGludCB1c2Vyb20gPSAtMTsKLXN0YXRpYyBpbnQgdXNlb2VtID0gLTE7Ci1zdGF0aWMgY2hhciAqdHZzdGFuZGFyZCA9IE5VTEw7Ci1zdGF0aWMgaW50IG5vY3J0MnJhdGUgPSAwOwotc3RhdGljIGludCBzY2FsZWxjZCA9IC0xOwotc3RhdGljIGNoYXIgKnNwZWNpYWx0aW1pbmcgPSBOVUxMOwotc3RhdGljIGludCBsdmRzaGwgPSAtMTsKLXN0YXRpYyBpbnQgdHZ4cG9zb2Zmc2V0ID0gMCwgdHZ5cG9zb2Zmc2V0ID0gMDsKLSNpZiAhZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX194ODZfNjRfXykKLXN0YXRpYyBpbnQgcmVzZXRjYXJkID0gMDsKLXN0YXRpYyBpbnQgdmlkZW9yYW0gPSAwOwotI2VuZGlmCi0KIE1PRFVMRV9ERVNDUklQVElPTigiWjcgWjkgWjlTIFoxMSBmcmFtZWJ1ZmZlciBkZXZpY2UgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJYR0lURUNIICwgT3RoZXJzIik7CiAKLW1vZHVsZV9wYXJhbShtZW0sIGludCwgMCk7Ci1tb2R1bGVfcGFyYW0obm95cGFuLCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKHVzZXJvbSwgaW50LCAwKTsKLW1vZHVsZV9wYXJhbSh1c2VvZW0sIGludCwgMCk7CiBtb2R1bGVfcGFyYW0obW9kZSwgY2hhcnAsIDApOwogbW9kdWxlX3BhcmFtKHZlc2EsIGludCwgMCk7Ci1tb2R1bGVfcGFyYW0ocmF0ZSwgaW50LCAwKTsKLW1vZHVsZV9wYXJhbShmb3JjZWNydDEsIGludCwgMCk7Ci1tb2R1bGVfcGFyYW0oZm9yY2VjcnQydHlwZSwgY2hhcnAsIDApOwotbW9kdWxlX3BhcmFtKHNjYWxlbGNkLCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKHBkYywgaW50LCAwKTsKLW1vZHVsZV9wYXJhbShwZGMxLCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKHNwZWNpYWx0aW1pbmcsIGNoYXJwLCAwKTsKLW1vZHVsZV9wYXJhbShsdmRzaGwsIGludCwgMCk7Ci1tb2R1bGVfcGFyYW0odHZzdGFuZGFyZCwgY2hhcnAsIDApOwotbW9kdWxlX3BhcmFtKHR2eHBvc29mZnNldCwgaW50LCAwKTsKLW1vZHVsZV9wYXJhbSh0dnlwb3NvZmZzZXQsIGludCwgMCk7CiBtb2R1bGVfcGFyYW0oZmlsdGVyLCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKG5vY3J0MnJhdGUsIGludCwgMCk7Ci0jaWYgIWRlZmluZWQoX19pMzg2X18pICYmICFkZWZpbmVkKF9feDg2XzY0X18pCi1tb2R1bGVfcGFyYW0ocmVzZXRjYXJkLCBpbnQsIDApOwotbW9kdWxlX3BhcmFtKHZpZGVvcmFtLCBpbnQsIDApOwotI2VuZGlmCi0KLU1PRFVMRV9QQVJNX0RFU0Mobm95cGFuLAotCQkiXG5JZiBzZXQgdG8gYW55dGhpbmcgb3RoZXIgdGhhbiAwLCB5LXBhbm5pbmcgd2lsbCBiZSBkaXNhYmxlZCBhbmQgc2Nyb2xsaW5nXG4iCi0JCSJ3aWxsIGJlIHBlcmZvcm1lZCBieSByZWRyYXdpbmcgdGhlIHNjcmVlbi4gKGRlZmF1bHQ6IDApXG4iKTsKIAogTU9EVUxFX1BBUk1fREVTQyhtb2RlLAotCQkiXG5TZWxlY3RzIHRoZSBkZXNpcmVkIGRlZmF1bHQgZGlzcGxheSBtb2RlIGluIHRoZSBmb3JtYXQgWHhZeERlcHRoLFxuIgotCQkiZWcuIDEwMjR4NzY4eDE2LiBPdGhlciBmb3JtYXRzIHN1cHBvcnRlZCBpbmNsdWRlIFh4WS1EZXB0aCBhbmRcbiIKLQkJIlh4WS1EZXB0aEBSYXRlLiBJZiB0aGUgcGFyYW1ldGVyIGlzIG9ubHkgb25lIChkZWNpbWFsIG9yIGhleGFkZWNpbWFsKVxuIgotCQkibnVtYmVyLCBpdCB3aWxsIGJlIGludGVycHJldGVkIGFzIGEgVkVTQSBtb2RlIG51bWJlci4gKGRlZmF1bHQ6IDgwMHg2MDB4OClcbiIpOworCSJcblNlbGVjdHMgdGhlIGRlc2lyZWQgZGVmYXVsdCBkaXNwbGF5IG1vZGUgaW4gdGhlIGZvcm1hdCBYeFl4RGVwdGgsXG4iCisJImVnLiAxMDI0eDc2OHgxNi5cbiIpOwogCiBNT0RVTEVfUEFSTV9ERVNDKHZlc2EsCi0JCSJcblNlbGVjdHMgdGhlIGRlc2lyZWQgZGVmYXVsdCBkaXNwbGF5IG1vZGUgYnkgVkVTQSBkZWZpbmVkIG1vZGUgbnVtYmVyLCBlZy5cbiIKLQkJIjB4MTE3IChkZWZhdWx0OiAweDAxMDMpXG4iKTsKLQotTU9EVUxFX1BBUk1fREVTQyhyYXRlLAotCQkiXG5TZWxlY3RzIHRoZSBkZXNpcmVkIHZlcnRpY2FsIHJlZnJlc2ggcmF0ZSBmb3IgQ1JUMSAoZXh0ZXJuYWwgVkdBKSBpbiBIei5cbiIKLQkJIklmIHRoZSBtb2RlIGlzIHNwZWNpZmllZCBpbiB0aGUgZm9ybWF0IFh4WS1EZXB0aEBSYXRlLCB0aGlzIHBhcmFtZXRlclxuIgotCQkid2lsbCBiZSBpZ25vcmVkIChkZWZhdWx0OiA2MClcbiIpOwotCi1NT0RVTEVfUEFSTV9ERVNDKGZvcmNlY3J0MSwKLQkJIlxuTm9ybWFsbHksIHRoZSBkcml2ZXIgYXV0b2RldGVjdHMgd2hldGhlciBvciBub3QgQ1JUMSAoZXh0ZXJuYWwgVkdBKSBpc1xuIgotCQkiY29ubmVjdGVkLiBXaXRoIHRoaXMgb3B0aW9uLCB0aGUgZGV0ZWN0aW9uIGNhbiBiZSBvdmVycmlkZGVuICgxPUNSVDEgT04sXG4iCi0JCSIwPUNSVDEgT0ZGKSAoZGVmYXVsdDogW2F1dG9kZXRlY3RlZF0pXG4iKTsKLQotTU9EVUxFX1BBUk1fREVTQyhmb3JjZWNydDJ0eXBlLAotCQkiXG5JZiB0aGlzIG9wdGlvbiBpcyBvbWl0dGVkLCB0aGUgZHJpdmVyIGF1dG9kZXRlY3RzIENSVDIgb3V0cHV0IGRldmljZXMsIHN1Y2ggYXNcbiIKLQkJIkxDRCwgVFYgb3Igc2Vjb25kYXJ5IFZHQS4gV2l0aCB0aGlzIG9wdGlvbiwgdGhpcyBhdXRvZGV0ZWN0aW9uIGNhbiBiZVxuIgotCQkib3ZlcnJpZGRlbi4gUG9zc2libGUgcGFyYW1ldGVycyBhcmUgTENELCBUViwgVkdBIG9yIE5PTkUuIE5PTkUgZGlzYWJsZXMgQ1JUMi5cbiIKLQkJIk9uIHN5c3RlbXMgd2l0aCBhIFNpUyB2aWRlbyBicmlkZ2UsIHBhcmFtZXRlcnMgU1ZJREVPLCBDT01QT1NJVEUgb3IgU0NBUlQgY2FuXG4iCi0JCSJiZSB1c2VkIGluc3RlYWQgb2YgVFYgdG8gb3ZlcnJpZGUgdGhlIFRWIGRldGVjdGlvbi4gRnVydGhlcm1vcmUsIG9uIHN5c3RlbXNcbiIKLQkJIndpdGggYSBTaVMgdmlkZW8gYnJpZGdlLCBTVklERU8rQ09NUE9TSVRFLCBISVZJU0lPTiwgWVBCUFI0ODBJLCBZUEJQUjQ4MFAsXG4iCi0JCSJZUEJQUjcyMFAgYW5kIFlQQlBSMTA4MEkgYXJlIHVuZGVyc3Rvb2QuIEhvd2V2ZXIsIHdoZXRoZXIgb3Igbm90IHRoZXNlIHdvcmtcbiIKLQkJImRlcGVuZHMgb24gdGhlIHZlcnkgaGFyZHdhcmUgaW4gdXNlLiAoZGVmYXVsdDogW2F1dG9kZXRlY3RlZF0pXG4iKTsKLQotTU9EVUxFX1BBUk1fREVTQyhzY2FsZWxjZCwKLQkJIlxuU2V0dGluZyB0aGlzIHRvIDEgd2lsbCBmb3JjZSB0aGUgZHJpdmVyIHRvIHNjYWxlIHRoZSBMQ0QgaW1hZ2UgdG8gdGhlIHBhbmVsJ3NcbiIKLQkJIm5hdGl2ZSByZXNvbHV0aW9uLiBTZXR0aW5nIGl0IHRvIDAgd2lsbCBkaXNhYmxlIHNjYWxpbmc7IExWRFMgcGFuZWxzIHdpbGxcbiIKLQkJInNob3cgYmxhY2sgYmFycyBhcm91bmQgdGhlIGltYWdlLCBUTURTIHBhbmVscyB3aWxsIHByb2JhYmx5IGRvIHRoZSBzY2FsaW5nXG4iCi0JCSJ0aGVtc2VsdmVzLiBEZWZhdWx0OiAxIG9uIExWRFMgcGFuZWxzLCAwIG9uIFRNRFMgcGFuZWxzXG4iKTsKLQotTU9EVUxFX1BBUk1fREVTQyhwZGMsCi0JCSJcblRoaXMgaXMgZm9yIG1hbnVhbGx5IHNlbGVjdGluZyB0aGUgTENEIHBhbmVsIGRlbGF5IGNvbXBlbnNhdGlvbi4gVGhlIGRyaXZlclxuIgotCQkic2hvdWxkIGRldGVjdCB0aGlzIGNvcnJlY3RseSBpbiBtb3N0IGNhc2VzOyBob3dldmVyLCBzb21ldGltZXMgdGhpcyBpcyBub3RcbiIKLQkJInBvc3NpYmxlLiBJZiB5b3Ugc2VlICdzbWFsbCB3YXZlcycgb24gdGhlIExDRCwgdHJ5IHNldHRpbmcgdGhpcyB0byA0LCAzMiBvciAyNFxuIgotCQkib24gYSAzMDAgc2VyaWVzIGNoaXBzZXQ7IDYgb24gYSAzMTUgc2VyaWVzIGNoaXBzZXQuIElmIHRoZSBwcm9ibGVtIHBlcnNpc3RzLFxuIgotCQkidHJ5IG90aGVyIHZhbHVlcyAob24gMzAwIHNlcmllczogYmV0d2VlbiA0IGFuZCA2MCBpbiBzdGVwcyBvZiA0OyBvbiAzMTUgc2VyaWVzOlxuIgotCQkiYW55IHZhbHVlIGZyb20gMCB0byAzMSkuIChkZWZhdWx0OiBhdXRvZGV0ZWN0ZWQsIGlmIExDRCBpcyBhY3RpdmUgZHVyaW5nIHN0YXJ0KVxuIik7Ci0KLU1PRFVMRV9QQVJNX0RFU0MocGRjMSwKLQkJIlxuVGhpcyBpcyBzYW1lIGFzIHBkYywgYnV0IGZvciBMQ0QtdmlhIENSVDEuIEhlbmNlLCB0aGlzIGlzIGZvciB0aGUgMzE1LzMzMFxuIgotCQkic2VyaWVzIG9ubHkuIChkZWZhdWx0OiBhdXRvZGV0ZWN0ZWQgaWYgTENEIGlzIGluIExDRC12aWEtQ1JUMSBtb2RlIGR1cmluZ1xuIgotCQkic3RhcnR1cCkgLSBOb3RlOiBjdXJyZW50bHksIHRoaXMgaGFzIG5vIGVmZmVjdCBiZWNhdXNlIExDRC12aWEtQ1JUMSBpcyBub3RcbiIKLQkJImltcGxlbWVudGVkIHlldC5cbiIpOwotCi1NT0RVTEVfUEFSTV9ERVNDKHNwZWNpYWx0aW1pbmcsCi0JCSJcblBsZWFzZSByZWZlciB0byBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgb3B0aW9uLlxuIik7Ci0KLU1PRFVMRV9QQVJNX0RFU0MobHZkc2hsLAotCQkiXG5QbGVhc2UgcmVmZXIgdG8gZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIG9wdGlvbi5cbiIpOwotCi1NT0RVTEVfUEFSTV9ERVNDKHR2c3RhbmRhcmQsCi0JCSJcblRoaXMgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIEJJT1MgZGVmYXVsdCBmb3IgdGhlIFRWIHN0YW5kYXJkLiBWYWxpZCBjaG9pY2VzIGFyZVxuIgotCQkicGFsLCBudHNjLCBwYWxtIGFuZCBwYWxuLiAoZGVmYXVsdDogW2F1dG87IHBhbCBvciBudHNjIG9ubHldKVxuIik7Ci0KLU1PRFVMRV9QQVJNX0RFU0ModHZ4cG9zb2Zmc2V0LAotCQkiXG5SZWxvY2F0ZSBUViBvdXRwdXQgaG9yaXpvbnRhbGx5LiBQb3NzaWJsZSBwYXJhbWV0ZXJzOiAtMzIgdGhyb3VnaCAzMi5cbiIKLQkJIkRlZmF1bHQ6IDBcbiIpOwotCi1NT0RVTEVfUEFSTV9ERVNDKHR2eXBvc29mZnNldCwKLQkJIlxuUmVsb2NhdGUgVFYgb3V0cHV0IHZlcnRpY2FsbHkuIFBvc3NpYmxlIHBhcmFtZXRlcnM6IC0zMiB0aHJvdWdoIDMyLlxuIgotCQkiRGVmYXVsdDogMFxuIik7CisJIlxuU2VsZWN0cyB0aGUgZGVzaXJlZCBkZWZhdWx0IGRpc3BsYXkgbW9kZSBieSBWRVNBIG1vZGUgbnVtYmVyLCBlZy5cbiIKKwkiMHgxMTcuXG4iKTsKIAogTU9EVUxFX1BBUk1fREVTQyhmaWx0ZXIsCiAJCSJcblNlbGVjdHMgVFYgZmxpY2tlciBmaWx0ZXIgdHlwZSAob25seSBmb3Igc3lzdGVtcyB3aXRoIGEgU2lTMzAxIHZpZGVvIGJyaWRnZSkuXG4iCiAJCSIoUG9zc2libGUgdmFsdWVzIDAtNywgZGVmYXVsdDogW25vIGZpbHRlcl0pXG4iKTsKIAotTU9EVUxFX1BBUk1fREVTQyhub2NydDJyYXRlLAotCQkiXG5TZXR0aW5nIHRoaXMgdG8gMSB3aWxsIGZvcmNlIHRoZSBkcml2ZXIgdG8gdXNlIHRoZSBkZWZhdWx0IHJlZnJlc2ggcmF0ZSBmb3JcbiIKLQkJIkNSVDIgaWYgQ1JUMiB0eXBlIGlzIFZHQS4gKGRlZmF1bHQ6IDAsIHVzZSBzYW1lIHJhdGUgYXMgQ1JUMSlcbiIpOwotCi1zdGF0aWMgaW50IF9faW5pdCB4Z2lmYl9pbml0X21vZHVsZSh2b2lkKQotewotCXByaW50aygiXG5YR0lmYl9pbml0X21vZHVsZSIpOwotCWlmIChtb2RlKQotCQlYR0lmYl9zZWFyY2hfbW9kZShtb2RlKTsKLQllbHNlIGlmICh2ZXNhICE9IC0xKQotCQlYR0lmYl9zZWFyY2hfdmVzYW1vZGUodmVzYSk7Ci0KLQlyZXR1cm4geGdpZmJfaW5pdCgpOwotfQotCiBzdGF0aWMgdm9pZCBfX2V4aXQgeGdpZmJfcmVtb3ZlX21vZHVsZSh2b2lkKQogewogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmeGdpZmJfZHJpdmVyKTsKIAlwcmludGsoS0VSTl9ERUJVRyAieGdpZmI6IE1vZHVsZSB1bmxvYWRlZFxuIik7CiB9CiAKLW1vZHVsZV9pbml0KHhnaWZiX2luaXRfbW9kdWxlKTsKIG1vZHVsZV9leGl0KHhnaWZiX3JlbW92ZV9tb2R1bGUpOwogCiAjZW5kaWYJLyogIC9NT0RVTEUgICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJZmIuaCBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lmYi5oCmluZGV4IDQ1YjYwMTUuLjc2MTE4NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lmYi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lmYi5oCkBAIC0zLDE1ICszLDE1IEBACiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCi0jZGVmaW5lIERJU1BUWVBFX0NSVDEgICAgICAgMHgwMDAwMDAwOEwKLSNkZWZpbmUgRElTUFRZUEVfQ1JUMiAgICAgICAweDAwMDAwMDA0TAotI2RlZmluZSBESVNQVFlQRV9MQ0QgICAgICAgIDB4MDAwMDAwMDJMCi0jZGVmaW5lIERJU1BUWVBFX1RWICAgICAgICAgMHgwMDAwMDAwMUwKLSNkZWZpbmUgRElTUFRZUEVfRElTUDEgICAgICBESVNQVFlQRV9DUlQxCi0jZGVmaW5lIERJU1BUWVBFX0RJU1AyICAgICAgKERJU1BUWVBFX0NSVDIgfCBESVNQVFlQRV9MQ0QgfCBESVNQVFlQRV9UVikKLSNkZWZpbmUgRElTUE1PREVfU0lOR0xFCSAgICAweDAwMDAwMDIwTAotI2RlZmluZSBESVNQTU9ERV9NSVJST1IJICAgIDB4MDAwMDAwMTBMCi0jZGVmaW5lIERJU1BNT0RFX0RVQUxWSUVXICAgMHgwMDAwMDA0MEwKKyNpbmNsdWRlICJ2Yl9zdHJ1Y3QuaCIKKyNpbmNsdWRlICJ2Z2F0eXBlcy5oIgorCitlbnVtIHhnaWZiX2Rpc3BsYXlfdHlwZSB7CisJWEdJRkJfRElTUF9OT05FID0gMCwKKwlYR0lGQl9ESVNQX0NSVCwKKwlYR0lGQl9ESVNQX0xDRCwKKwlYR0lGQl9ESVNQX1RWLAorfTsKIAogI2RlZmluZSBIQVNWQl9OT05FCSAgICAweDAwCiAjZGVmaW5lIEhBU1ZCXzMwMQkgICAgMHgwMQpAQCAtMTksMTMgKzE5LDggQEAKICNkZWZpbmUgSEFTVkJfVFJVTVBJT04JICAgIDB4MDQKICNkZWZpbmUgSEFTVkJfTFZEU19DSFJPTlRFTCAweDEwCiAjZGVmaW5lIEhBU1ZCXzMwMgkgICAgMHgyMAotI2RlZmluZSBIQVNWQl8zMDMJICAgIDB4NDAKICNkZWZpbmUgSEFTVkJfQ0hST05URUwJICAgIDB4ODAKIAotI2lmbmRlZiBYR0lGQl9JRAotI2RlZmluZSBYR0lGQl9JRAkweDUzNDk1MzQ2IC8qIElkZW50aWZ5IG15c2VsZiB3aXRoICdYR0lGJyAqLwotI2VuZGlmCi0KIGVudW0gWEdJX0NISVBfVFlQRSB7CiAJWEc0MCA9IDMyLAogCVhHNDEsCkBAIC00NywxMSArNDIsNiBAQAogfTsKIAogZW51bSB4Z2lfdHZfcGx1ZyB7IC8qIHZpY2tpQDAzMDIyNiAqLwotLyoJVFZQTFVHX0xlZ2FjeSA9IDAsICovCi0vKglUVlBMVUdfQ09NUE9TSVRFLCAgKi8KLS8qCVRWUExVR19TVklERU8sCSAgICovCi0vKglUVlBMVUdfU0NBUlQsCSAgICovCi0vKglUVlBMVUdfVE9UQUwJICAgKi8KIAlUVlBMVUdfVU5LTk9XTiA9IDAsCiAJVFZQTFVHX0NPTVBPU0lURSA9IDEsCiAJVFZQTFVHX1NWSURFTyA9IDIsCkBAIC02NCwxNCArNTQsMjMgQEAKIAlUVlBMVUdfVE9UQUwKIH07CiAKLXN0cnVjdCB2aWRlb19pbmZvIHsKK3N0cnVjdCB4Z2lmYl92aWRlb19pbmZvIHsKKwlzdHJ1Y3QgZmJfaW5mbyAqZmJfaW5mbzsKKwlzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvIGh3X2luZm87CisJc3RydWN0IHZiX2RldmljZV9pbmZvIGRldl9pbmZvOworCisJaW50IG1vZGVfaWR4OworCWludCByYXRlX2lkeDsKKworCXUzMiBwc2V1ZG9fcGFsZXR0ZVsxN107CisKIAlpbnQgICAgICAgICAgIGNoaXBfaWQ7CiAJdW5zaWduZWQgaW50ICB2aWRlb19zaXplOwogCXVuc2lnbmVkIGxvbmcgdmlkZW9fYmFzZTsKLQljaGFyCSAgICAgICp2aWRlb192YmFzZTsKKwl2b2lkIF9faW9tZW0gKnZpZGVvX3ZiYXNlOwogCXVuc2lnbmVkIGxvbmcgbW1pb19iYXNlOwogCXVuc2lnbmVkIGxvbmcgbW1pb19zaXplOwotCWNoYXIJICAgICAgKm1taW9fdmJhc2U7CisJdm9pZCBfX2lvbWVtICptbWlvX3ZiYXNlOwogCXVuc2lnbmVkIGxvbmcgdmdhX2Jhc2U7CiAJdW5zaWduZWQgbG9uZyBtdHJyOwogCkBAIC04Niw3ICs4NSw3IEBACiAJaW50ICAgIHZpZGVvX2xpbmVsZW5ndGg7CiAJdW5zaWduZWQgaW50IHJlZnJlc2hfcmF0ZTsKIAotCXVuc2lnbmVkIGxvbmcgZGlzcF9zdGF0ZTsKKwllbnVtIHhnaWZiX2Rpc3BsYXlfdHlwZSBkaXNwbGF5MjsgLyogdGhlIHNlY29uZCBkaXNwbGF5IG91dHB1dCB0eXBlICovCiAJdW5zaWduZWQgY2hhciBoYXNWQjsKIAl1bnNpZ25lZCBjaGFyIFRWX3R5cGU7CiAJdW5zaWduZWQgY2hhciBUVl9wbHVnOwpAQCAtMTA4LDcgKzEwNyw0IEBACiAJY2hhciByZXNlcnZlZFsyMzZdOwogfTsKIAotCi1leHRlcm4gc3RydWN0IHZpZGVvX2luZm8geGdpX3ZpZGVvX2luZm87Ci0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX2RlZi5oIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX2RlZi5oCmluZGV4IDMzOWMwNzEuLjViZWVlZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9kZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfZGVmLmgKQEAgLTMsMjYxICszLDQ4IEBACiAjaWZuZGVmIF9JTklUREVGXwogI2RlZmluZSBfSU5JVERFRl8KIAotI2lmbmRlZiBOZXdTY3JhdGNoCi0jZGVmaW5lIE5ld1NjcmF0Y2gKLSNlbmRpZgotLyogc2hhbXBvbyAqLwotCi0jZGVmaW5lIFNFUV9BRERSRVNTX1BPUlQgICAgICAgICAgICAweDAwMTQKLSNkZWZpbmUgU0VRX0RBVEFfUE9SVCAgICAgICAgICAgICAgIDB4MDAxNQotI2RlZmluZSBNSVNDX09VVFBVVF9SRUdfUkVBRF9QT1JUICAgMHgwMDFDCi0jZGVmaW5lIE1JU0NfT1VUUFVUX1JFR19XUklURV9QT1JUICAweDAwMTIKLSNkZWZpbmUgR1JBUEhfREFUQV9QT1JUICAgICAgICAgICAgIDB4MUYKLSNkZWZpbmUgR1JBUEhfQUREUkVTU19QT1JUICAgICAgICAgIDB4MUUKLSNkZWZpbmUgWEdJX01BU0tfRFVBTF9DSElQICAgICAgICAgIDB4MDQgIC8qIFNSM0EgKi8KLSNkZWZpbmUgQ1JUQ19BRERSRVNTX1BPUlRfQ09MT1IgICAgIDB4MDAyNAotI2RlZmluZSBWSURFT19TVUJTWVNURU1fRU5BQkxFX1BPUlQgMHgwMDEzCi0jZGVmaW5lIFBDSV9DT01NQU5EICAgICAgICAgICAgICAgICAweDA0Ci0KLS8qIH5zaGFtcG9vICovCi0KLQotI2RlZmluZSBWQl9YR0kzMDEgICAgICAgMHgwMDAxIC8qMzAxYiovCi0jZGVmaW5lIFZCX1hHSTMwMUIgICAgICAweDAwMDIKLSNkZWZpbmUgVkJfWEdJMzAyQiAgICAgIDB4MDAwNAotI2RlZmluZSBWQl9YR0kzMDFMViAgICAgMHgwMDA4IC8qMzAxbHYqLwotI2RlZmluZSBWQl9YR0kzMDJMViAgICAgMHgwMDEwCiAjZGVmaW5lIFZCX1hHSTMwMUMgICAgICAweDAwMjAgLyogZm9yIDMwMUMgKi8KLSNkZWZpbmUgIFZCX05vTENEICAgICAgIDB4ODAwMAogLyplbmQgMzAxYiovCiAKLSNkZWZpbmUgVkJfWVBiUHJJbmZvICAgIDB4MDcgICAvKjMwMWx2Ki8KLSNkZWZpbmUgVkJfWVBiUHI1MjVpICAgIDB4MDAKICNkZWZpbmUgVkJfWVBiUHI1MjVwICAgIDB4MDEKICNkZWZpbmUgVkJfWVBiUHI3NTBwICAgIDB4MDIKICNkZWZpbmUgVkJfWVBiUHIxMDgwaSAgIDB4MDMKIAotLyogI2RlZmluZSBDUlQxTGVuIDE3ICovCiAjZGVmaW5lIExWRFNDUlQxTGVuICAgICAxNQotI2RlZmluZSBDSFRWUmVnRGF0YUxlbiAgNQogCi0vKiAjZGVmaW5lIE1vZGVJbmZvRmxhZyAweDA3ICovCi0vKiAjZGVmaW5lIElzVGV4dE1vZGUgMHgwNyAqLwotLyogI2RlZmluZSBNb2RlVGV4dCAweDAwICovCi0vKiAjZGVmaW5lIE1vZGVDR0EgMHgwMSAqLwotLyogI2RlZmluZSBNb2RlRUdBIDB4MDIgKi8KLS8qICNkZWZpbmUgTW9kZVZHQSAweDAzICovCi0vKiAjZGVmaW5lIE1vZGUxNUJwcCAweDA0ICovCi0vKiAjZGVmaW5lIE1vZGUxNkJwcCAweDA1ICovCi0vKiAjZGVmaW5lIE1vZGUyNEJwcCAweDA2ICovCi0vKiAjZGVmaW5lIE1vZGUzMkJwcCAweDA3ICovCi0KLS8qICNkZWZpbmUgREFDSW5mb0ZsYWcgMHgxOCAqLwotLyogI2RlZmluZSBNZW1vcnlJbmZvRmxhZyAweDFFMCAqLwotLyogI2RlZmluZSBNZW1vcnlTaXplU2hpZnQgMHgwNSAqLwotCi0jZGVmaW5lIENoYXJ4OERvdCAgICAgICAgICAgICAgIDB4MDIwMAotI2RlZmluZSBMaW5lQ29tcGFyZU9mZiAgICAgICAgICAweDA0MDAKLSNkZWZpbmUgQ1JUMk1vZGUgICAgICAgICAgICAgICAgMHgwODAwCi0jZGVmaW5lIEhhbGZEQ0xLICAgICAgICAgICAgICAgIDB4MTAwMAotI2RlZmluZSBOb1N1cHBvcnRTaW11VFYgICAgICAgICAweDIwMDAKLSNkZWZpbmUgRG91YmxlU2Nhbk1vZGUgICAgICAgICAgMHg4MDAwCi0KLSNkZWZpbmUgU3VwcG9ydEFsbENSVDIgICAgICAgICAgMHgwMDc4Ci0jZGVmaW5lIFN1cHBvcnRUViAgICAgICAgICAgICAgIDB4MDAwOAotI2RlZmluZSBTdXBwb3J0SGlWaXNpb25UViAgICAgICAweDAwMTAKLSNkZWZpbmUgU3VwcG9ydExDRCAgICAgICAgICAgICAgMHgwMDIwCi0jZGVmaW5lIFN1cHBvcnRSQU1EQUMyICAgICAgICAgIDB4MDA0MAotI2RlZmluZSBOb1N1cHBvcnRUViAgICAgICAgICAgICAweDAwNzAKLSNkZWZpbmUgTm9TdXBwb3J0SGlWaXNpb25UViAgICAgMHgwMDYwCi0jZGVmaW5lIE5vU3VwcG9ydExDRCAgICAgICAgICAgIDB4MDA1OAogI2RlZmluZSBTdXBwb3J0Q0hUViAgICAgICAgICAgICAweDA4MDAKICNkZWZpbmUgU3VwcG9ydENSVDJpbjMwMUMgICAgICAgMHgwMTAwICAvKiBmb3IgMzAxQyAqLwotI2RlZmluZSBTdXBwb3J0VFYxMDI0ICAgICAgICAgICAweDA4MDAgIC8qMzAxYiovCi0jZGVmaW5lIFN1cHBvcnRZUGJQciAgICAgICAgICAgIDB4MTAwMCAgLyozMDFsdiovCi0jZGVmaW5lIEludGVybGFjZU1vZGUgICAgICAgICAgIDB4MDA4MAotI2RlZmluZSBTeW5jUFAgICAgICAgICAgICAgICAgICAweDAwMDAKLSNkZWZpbmUgU3luY1BOICAgICAgICAgICAgICAgICAgMHg0MDAwCi0jZGVmaW5lIFN5bmNOUCAgICAgICAgICAgICAgICAgIDB4ODAwMAotLyogI2RlZmluZSBTeW5jTk4gMHhjMDAwICovCi0jZGVmaW5lIEVDTEtpbmRleDAgICAgICAgICAgICAgIDB4MDAwMAotI2RlZmluZSBFQ0xLaW5kZXgxICAgICAgICAgICAgICAweDAxMDAKLSNkZWZpbmUgRUNMS2luZGV4MiAgICAgICAgICAgICAgMHgwMjAwCi0jZGVmaW5lIEVDTEtpbmRleDMgICAgICAgICAgICAgIDB4MDMwMAotI2RlZmluZSBFQ0xLaW5kZXg0ICAgICAgICAgICAgICAweDA0MDAKLQotI2RlZmluZSBTZXRTaW11U2Nhbk1vZGUgICAgICAgICAweDAwMDEKLSNkZWZpbmUgU3dpdGNoVG9DUlQyICAgICAgICAgICAgMHgwMDAyCi0vKiAjZGVmaW5lIFNldENSVDJUb1RWIDB4MDA5QyAqLwotI2RlZmluZSBTZXRDUlQyVG9BVklERU8gICAgICAgICAweDAwMDQKLSNkZWZpbmUgU2V0Q1JUMlRvU1ZJREVPICAgICAgICAgMHgwMDA4Ci0jZGVmaW5lIFNldENSVDJUb1NDQVJUICAgICAgICAgIDB4MDAxMAotI2RlZmluZSBTZXRDUlQyVG9MQ0QgICAgICAgICAgICAweDAwMjAKLSNkZWZpbmUgU2V0Q1JUMlRvUkFNREFDICAgICAgICAgMHgwMDQwCi0jZGVmaW5lIFNldENSVDJUb0hpVmlzaW9uVFYgICAgIDB4MDA4MAotI2RlZmluZSBTZXROVFNDVFYgICAgICAgICAgICAgICAweDAwMDAKLS8qICNkZWZpbmUgU2V0UEFMVFYgMHgwMTAwICovCi0jZGVmaW5lIFNldEluU2xhdmVNb2RlICAgICAgICAgIDB4MDIwMAotI2RlZmluZSBTZXROb3RTaW11TW9kZSAgICAgICAgICAweDA0MDAKLSNkZWZpbmUgU2V0Tm90U2ltdVRWTW9kZSAgICAgICAgMHgwNDAwCi0jZGVmaW5lIFNldERpc3BEZXZTd2l0Y2ggICAgICAgIDB4MDgwMAotI2RlZmluZSBMb2FkREFDRmxhZyAgICAgICAgICAgICAweDEwMDAKLSNkZWZpbmUgRGlzYWJsZUNSVDJEaXNwbGF5ICAgICAgMHgyMDAwCi0jZGVmaW5lIERyaXZlck1vZGUgICAgICAgICAgICAgIDB4NDAwMAotI2RlZmluZSBIb3RLZXlTd2l0Y2ggICAgICAgICAgICAweDgwMDAKICNkZWZpbmUgU2V0Q0hUVk92ZXJTY2FuICAgICAgICAgMHg4MDAwCi0vKiAjZGVmaW5lIFNldENSVDJUb0xDREEgMHg4MDAwIDMwMWIgKi8KICNkZWZpbmUgUGFuZWxSR0IxOEJpdCAgICAgICAgICAgMHgwMTAwCiAjZGVmaW5lIFBhbmVsUkdCMjRCaXQgICAgICAgICAgIDB4MDAwMAogCi0jZGVmaW5lIFRWT3ZlclNjYW4gICAgICAgICAgICAgIDB4MTAKLSNkZWZpbmUgVFZPdmVyU2NhblNoaWZ0ICAgICAgICAgNAotI2RlZmluZSBDbGVhckJ1ZmZlckZsYWcgICAgICAgICAweDIwCi0jZGVmaW5lIEVuYWJsZUR1YWxFZGdlICAgICAgICAgIDB4MDEgLyozMDFiKi8KLSNkZWZpbmUgU2V0VG9MQ0RBICAgICAgICAgICAgICAgMHgwMgotCi0jZGVmaW5lIFlQYlByTW9kZUluZm8gICAgICAgICAgIDB4MzgKLS8qICNkZWZpbmUgWVBiUHJNb2RlNTI1aSAweDAwICovCi0vKiAjZGVmaW5lIFlQYlByTW9kZTUyNXAgMHgwOCAqLwotLyogI2RlZmluZSBZUGJQck1vZGU3NTBwIDB4MTAgKi8KLS8qICNkZWZpbmUgWVBiUHJNb2RlMTA4MGkgMHgxOCAqLwotCi0jZGVmaW5lIFNldFNDQVJUT3V0cHV0ICAgICAgICAgIDB4MDEKLSNkZWZpbmUgQm9hcmRUVlR5cGUgICAgICAgICAgICAgMHgwMgotI2RlZmluZSAgRW5hYmxlUEFMTU4gICAgICAgICAgICAweDQwCi0vKiAjZGVmaW5lIFByb2dyYW1taW5nQ1JUMiAweDAxICovCi0vKiAjZGVmaW5lIFRWU2ltdU1vZGUgMHgwMiAqLwotLyogI2RlZmluZSBSUExMRElWMlhPIDB4MDQgKi8KLS8qICNkZWZpbmUgTENEVkVTQVRpbWluZyAweDA4ICovCi0vKiAjZGVmaW5lIEVuYWJsZUxWRFNEREEgMHgxMCAqLwotI2RlZmluZSBTZXREaXNwRGV2U3dpdGNoRmxhZyAgICAweDIwCi0jZGVmaW5lIENoZWNrV2luRG9zICAgICAgICAgICAgIDB4NDAKLSNkZWZpbmUgU2V0SkRPU01vZGUgICAgICAgICAgICAgMHg4MAotCiAjZGVmaW5lIFBhbmVsMzIweDQ4MCAgICAgICAgICAgIDB4MDcgLypmc3RuKi8KIC8qIFt5Y2NoZW5dIDAyLzEyLzAzIE1vZGlmeSBmb3IgTXVsdGktU3luYy4gTENEIFN1cHBvcnQgKi8KICNkZWZpbmUgUGFuZWxSZXNJbmZvICAgICAgICAgICAgMHgxRiAvKiBDUjM2IFBhbmVsIFR5cGUvTENEUmVzSW5mbyAqLwotI2RlZmluZSBQYW5lbFJlZkluZm8gICAgICAgICAgICAweDYwCiAjZGVmaW5lIFBhbmVsODAweDYwMCAgICAgICAgICAgIDB4MDEKICNkZWZpbmUgUGFuZWwxMDI0eDc2OCAgICAgICAgICAgMHgwMgogI2RlZmluZSBQYW5lbDEwMjR4NzY4eDc1ICAgICAgICAweDIyCiAjZGVmaW5lIFBhbmVsMTI4MHgxMDI0ICAgICAgICAgIDB4MDMKICNkZWZpbmUgUGFuZWwxMjgweDEwMjR4NzUgICAgICAgMHgyMwogI2RlZmluZSBQYW5lbDY0MHg0ODAgICAgICAgICAgICAweDA0Ci0jZGVmaW5lIFBhbmVsMTAyNHg2MDAgICAgICAgICAgIDB4MDUKLSNkZWZpbmUgUGFuZWwxMTUyeDg2NCAgICAgICAgICAgMHgwNgogI2RlZmluZSBQYW5lbDEyODB4OTYwICAgICAgICAgICAweDA3Ci0jZGVmaW5lIFBhbmVsMTE1Mng3NjggICAgICAgICAgIDB4MDgKICNkZWZpbmUgUGFuZWwxNDAweDEwNTAgICAgICAgICAgMHgwOQotI2RlZmluZSBQYW5lbDEyODB4NzY4ICAgICAgICAgICAweDBBCiAjZGVmaW5lIFBhbmVsMTYwMHgxMjAwICAgICAgICAgIDB4MEIKIAogI2RlZmluZSBQYW5lbFJlZjYwSHogICAgICAgICAgICAweDAwCiAjZGVmaW5lIFBhbmVsUmVmNzVIeiAgICAgICAgICAgIDB4MjAKLSNkZWZpbmUgTENEUkdCMThCaXQgICAgICAgICAgICAgMHgwMQotCi0jZGVmaW5lIEV4dENoaXBUcnVtcGlvbiAgICAgICAgIDB4MDYKLSNkZWZpbmUgRXh0Q2hpcENINzAwNSAgICAgICAgICAgMHgwOAotI2RlZmluZSBFeHRDaGlwTWl0YWNUViAgICAgICAgICAweDBhCi0jZGVmaW5lIExDRE5vbkV4cGFuZGluZyAgICAgICAgIDB4MTAKLSNkZWZpbmUgTENETm9uRXhwYW5kaW5nU2hpZnQgICAgNAotI2RlZmluZSBMQ0RTeW5jICAgICAgICAgICAgICAgICAweDIwCi0jZGVmaW5lIExDRFN5bmNCaXQgICAgICAgICAgICAgIDB4ZTAKLSNkZWZpbmUgTENEU3luY1NoaWZ0ICAgICAgICAgICAgNgotCi0vKiAjZGVmaW5lIEREQzJEZWxheVRpbWUgMzAwICovCiAKICNkZWZpbmUgQ1JUMkRpc3BsYXlGbGFnICAgICAgICAgMHgyMDAwCi0vKiAjZGVmaW5lIExDRERhdGFMZW4gOCAqLwotLyogI2RlZmluZSBIaVRWRGF0YUxlbiAxMiAqLwotLyogI2RlZmluZSBUVkRhdGFMZW4gMTYgKi8KLS8qICNkZWZpbmUgU2V0UEFMVFYgMHgwMTAwICovCi0jZGVmaW5lIEhhbGZEQ0xLICAgICAgICAgICAgICAgIDB4MTAwMAotI2RlZmluZSBOVFNDSFQgICAgICAgICAgICAgICAgICAxNzE2Ci0jZGVmaW5lIE5UU0NWVCAgICAgICAgICAgICAgICAgIDUyNQotI2RlZmluZSBQQUxIVCAgICAgICAgICAgICAgICAgICAxNzI4Ci0jZGVmaW5lIFBBTFZUICAgICAgICAgICAgICAgICAgIDYyNQotI2RlZmluZSBTdEhpVFZIVCAgICAgICAgICAgICAgICA4OTIKLSNkZWZpbmUgU3RIaVRWVlQgICAgICAgICAgICAgICAgMTEyNgotI2RlZmluZSBTdEhpVGV4dFRWSFQgICAgICAgICAgICAxMDAwCi0jZGVmaW5lIFN0SGlUZXh0VFZWVCAgICAgICAgICAgIDExMjYKLSNkZWZpbmUgRXh0SGlUVkhUICAgICAgICAgICAgICAgMjEwMAotI2RlZmluZSBFeHRIaVRWVlQgICAgICAgICAgICAgICAxMTI1Ci0KLSNkZWZpbmUgU3Q3NTBwVFZIVCAgICAgICAgICAgICAgMTcxNgotI2RlZmluZSBTdDc1MHBUVlZUICAgICAgICAgICAgICAgNTI1Ci0jZGVmaW5lIEV4dDc1MHBUVkhUICAgICAgICAgICAgIDE3MTYKLSNkZWZpbmUgRXh0NzUwcFRWVlQgICAgICAgICAgICAgIDUyNQotI2RlZmluZSBTdDUyNXBUVkhUICAgICAgICAgICAgICAxNzE2Ci0jZGVmaW5lIFN0NTI1cFRWVlQgICAgICAgICAgICAgICA1MjUKLSNkZWZpbmUgRXh0NTI1cFRWSFQgICAgICAgICAgICAgMTcxNgotI2RlZmluZSBFeHQ1MjVwVFZWVCAgICAgICAgICAgICAgNTI1Ci0jZGVmaW5lIFN0NTI1aVRWSFQgICAgICAgICAgICAgIDE3MTYKLSNkZWZpbmUgU3Q1MjVpVFZWVCAgICAgICAgICAgICAgIDUyNQotI2RlZmluZSBFeHQ1MjVpVFZIVCAgICAgICAgICAgICAxNzE2Ci0jZGVmaW5lIEV4dDUyNWlUVlZUICAgICAgICAgICAgICA1MjUKLQotI2RlZmluZSBWQ0xLU3RhcnRGcmVxICAgICAgICAgICAyNQotI2RlZmluZSBTb2Z0RHJhbVR5cGUgICAgICAgICAgICAweDgwCi0jZGVmaW5lIFZDTEs0MCAgICAgICAgICAgICAgICAgIDB4MDQKLQotI2RlZmluZSBWQ0xLMTYyICAgICAgICAgICAgICAgICAweDIxCi0KLSNkZWZpbmUgTENEUkdCMThCaXQgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBMb2FkREFDRmxhZyAgICAgICAgICAgICAweDEwMDAKLSNkZWZpbmUgQWZ0ZXJMb2NrQ1JUMiAgICAgICAgICAgMHg0MDAwCi0jZGVmaW5lIFNldENSVDJUb0FWSURFTyAgICAgICAgIDB4MDAwNAotI2RlZmluZSBTZXRDUlQyVG9TQ0FSVCAgICAgICAgICAweDAwMTAKLSNkZWZpbmUgRXh0MlN0cnVjdFNpemUgICAgICAgICAgNQotCiAKICNkZWZpbmUgWVBiUHI1MjVpVkNMSyAgICAgICAgICAgMHgwM0IKICNkZWZpbmUgWVBiUHI1MjVpVkNMS18yICAgICAgICAgMHgwM0EKIAotI2RlZmluZSBTd2l0Y2hUb0NSVDIgICAgICAgICAgICAweDAwMDIKLS8qICNkZWZpbmUgTENEVkVTQVRpbWluZyAweDA4ICovCi0jZGVmaW5lIFNldFNDQVJUT3V0cHV0ICAgICAgICAgIDB4MDEKLSNkZWZpbmUgQVZJREVPU2Vuc2UgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBTVklERU9TZW5zZSAgICAgICAgICAgICAweDAyCi0jZGVmaW5lIFNDQVJUU2Vuc2UgICAgICAgICAgICAgIDB4MDQKLSNkZWZpbmUgTENEU2Vuc2UgICAgICAgICAgICAgICAgMHgwOAotI2RlZmluZSBNb25pdG9yMVNlbnNlICAgICAgICAgICAweDIwCi0jZGVmaW5lIE1vbml0b3IyU2Vuc2UgICAgICAgICAgIDB4MTAKLSNkZWZpbmUgSGlUVlNlbnNlICAgICAgICAgICAgICAgMHg0MAotI2RlZmluZSBCb2FyZFRWVHlwZSAgICAgICAgICAgICAweDAyCi0jZGVmaW5lIEhvdFBsdWdGdW5jdGlvbiAgICAgICAgIDB4MDgKLSNkZWZpbmUgU3RTdHJ1Y3RTaXplICAgICAgICAgICAgMHgwNgotCi0KICNkZWZpbmUgWEdJX0NSVDJfUE9SVF8wMCAgICAgICAgKDB4MDAgLSAweDAzMCkKICNkZWZpbmUgWEdJX0NSVDJfUE9SVF8wNCAgICAgICAgKDB4MDQgLSAweDAzMCkKICNkZWZpbmUgWEdJX0NSVDJfUE9SVF8xMCAgICAgICAgKDB4MTAgLSAweDMwKQogI2RlZmluZSBYR0lfQ1JUMl9QT1JUXzEyICAgICAgICAoMHgxMiAtIDB4MzApCiAjZGVmaW5lIFhHSV9DUlQyX1BPUlRfMTQgICAgICAgICgweDE0IC0gMHgzMCkKIAotCi0jZGVmaW5lIExDRE5vbkV4cGFuZGluZyAgICAgICAgIDB4MTAKLSNkZWZpbmUgQURSX0NSVDJQdHJEYXRhICAgICAgICAgMHgyMEUKLSNkZWZpbmUgb2Zmc2V0X1p1cmFjICAgICAgICAgICAgMHgyMTAKLSNkZWZpbmUgQURSX0xWRFNEZXNQdHJEYXRhICAgICAgMHgyMTIKLSNkZWZpbmUgQURSX0xWRFNDUlQxRGF0YVB0ciAgICAgMHgyMTQKLSNkZWZpbmUgQURSX0NIVFZWQ0xLUHRyICAgICAgICAgMHgyMTYKLSNkZWZpbmUgQURSX0NIVFZSZWdEYXRhUHRyICAgICAgMHgyMTgKLQotI2RlZmluZSBMVkRTRGF0YUxlbiAgICAgICAgICAgICA2Ci0vKiAjZGVmaW5lIEVuYWJsZUxWRFNEREEgMHgxMCAqLwotLyogI2RlZmluZSBMVkRTRGVzRGF0YUxlbiAzICovCi0jZGVmaW5lIEFjdGl2ZU5vbkV4cGFuZGluZyAgICAgIDB4NDAKLSNkZWZpbmUgQWN0aXZlTm9uRXhwYW5kaW5nU2hpZnQgNgotLyogI2RlZmluZSBBY3RpdmVQQUwgMHgyMCAqLwotI2RlZmluZSBBY3RpdmVQQUxTaGlmdCAgICAgICAgICA1Ci0vKiAjZGVmaW5lIE1vZGVTd2l0Y2hTdGF0dXMgMHgwRiAqLwotI2RlZmluZSBTb2Z0VFZUeXBlICAgICAgICAgICAgICAweDQwCi0jZGVmaW5lIFNvZnRTZXR0aW5nQWRkciAgICAgICAgIDB4NTIKLSNkZWZpbmUgTW9kZVNldHRpbmdBZGRyICAgICAgICAgMHg1MwotCi0vKiAjZGVmaW5lIFNlbGVjdENSVDFSYXRlIDB4NCAqLwotCiAjZGVmaW5lIF9QYW5lbFR5cGUwMCAgICAgICAgICAgICAweDAwCiAjZGVmaW5lIF9QYW5lbFR5cGUwMSAgICAgICAgICAgICAweDA4CiAjZGVmaW5lIF9QYW5lbFR5cGUwMiAgICAgICAgICAgICAweDEwCkBAIC0yNzUsMTczICs2MiwyNiBAQAogI2RlZmluZSBfUGFuZWxUeXBlMEUgICAgICAgICAgICAgMHg3MAogI2RlZmluZSBfUGFuZWxUeXBlMEYgICAgICAgICAgICAgMHg3OAogCi0vKiAxOiBYR0kgaXMgcHJpbWFyeSB2Z2EgMDpYR0kgaXMgc2Vjb25kYXJ5IHZnYSAqLwotI2RlZmluZSBQUklNQVJZX1ZHQSAgICAgICAgICAgICAwCi0jZGVmaW5lIEJJT1NJRENvZGVBZGRyICAgICAgICAgIDB4MjM1Ci0jZGVmaW5lIE9FTVV0aWxJRENvZGVBZGRyICAgICAgIDB4MjM3Ci0jZGVmaW5lIFZCTW9kZUlEVGFibGVBZGRyICAgICAgIDB4MjM5Ci0jZGVmaW5lIE9FTVRWUHRyQWRkciAgICAgICAgICAgIDB4MjQxCi0jZGVmaW5lIFBoYXNlVGFibGVBZGRyICAgICAgICAgIDB4MjQzCi0jZGVmaW5lIE5UU0NGaWx0ZXJUYWJsZUFkZHIgICAgIDB4MjQ1Ci0jZGVmaW5lIFBBTEZpbHRlclRhYmxlQWRkciAgICAgIDB4MjQ3Ci0jZGVmaW5lIE9FTUxDRFB0cl8xQWRkciAgICAgICAgIDB4MjQ5Ci0jZGVmaW5lIE9FTUxDRFB0cl8yQWRkciAgICAgICAgIDB4MjRCCi0jZGVmaW5lIExDREhQb3NUYWJsZV8xQWRkciAgICAgIDB4MjRECi0jZGVmaW5lIExDREhQb3NUYWJsZV8yQWRkciAgICAgIDB4MjRGCi0jZGVmaW5lIExDRFZQb3NUYWJsZV8xQWRkciAgICAgIDB4MjUxCi0jZGVmaW5lIExDRFZQb3NUYWJsZV8yQWRkciAgICAgIDB4MjUzCi0jZGVmaW5lIE9FTUxDRFBJRFRhYmxlQWRkciAgICAgIDB4MjU1Ci0KLSNkZWZpbmUgVkJNb2RlU3RydWN0U2l6ZSAgICAgICAgNQotI2RlZmluZSBQaGFzZVRhYmxlU2l6ZSAgICAgICAgICA0Ci0jZGVmaW5lIEZpbHRlclRhYmxlU2l6ZSAgICAgICAgIDQKLSNkZWZpbmUgTENESFBvc1RhYmxlU2l6ZSAgICAgICAgNwotI2RlZmluZSBMQ0RWUG9zVGFibGVTaXplICAgICAgICA1Ci0jZGVmaW5lIE9FTUxWRFNQSURUYWJsZVNpemUgICAgIDQKLSNkZWZpbmUgTFZEU0hQb3NUYWJsZVNpemUgICAgICAgNAotI2RlZmluZSBMVkRTVlBvc1RhYmxlU2l6ZSAgICAgICA2Ci0KLSNkZWZpbmUgVkJfTW9kZUlEICAgICAgICAgICAgICAgMAotI2RlZmluZSBWQl9UVlRhYmxlSW5kZXggICAgICAgICAxCi0jZGVmaW5lIFZCX0xDRFRhYmxlSW5kZXggICAgICAgIDIKLSNkZWZpbmUgVkJfTENESEluZGV4ICAgICAgICAgICAgMwotI2RlZmluZSBWQl9MQ0RWSW5kZXggICAgICAgICAgICA0Ci0KLSNkZWZpbmUgT0VNTENERW5hYmxlICAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIE9FTUxDRERlbGF5RW5hYmxlICAgICAgIDB4MDAwMgotI2RlZmluZSBPRU1MQ0RQT1NFbmFibGUgICAgICAgICAweDAwMDQKLSNkZWZpbmUgT0VNVFZFbmFibGUgICAgICAgICAgICAgMHgwMTAwCi0jZGVmaW5lIE9FTVRWRGVsYXlFbmFibGUgICAgICAgIDB4MDIwMAotI2RlZmluZSBPRU1UVkZsaWNrZXJFbmFibGUgICAgICAweDA0MDAKLSNkZWZpbmUgT0VNVFZQaGFzZUVuYWJsZSAgICAgICAgMHgwODAwCi0jZGVmaW5lIE9FTVRWRmlsdGVyRW5hYmxlICAgICAgIDB4MTAwMAotCi0jZGVmaW5lIE9FTUxDRFBhbmVsSURTdXBwb3J0ICAgIDB4MDA4MAotCi0vKiAjZGVmaW5lIExDRFZFU0FUaW1pbmcgMHgwMDAxIC8vTENEIEluZm8gQ1IzNyAqLwotLyogI2RlZmluZSBFbmFibGVMVkRTRERBIDB4MDAwMiAqLwotI2RlZmluZSBFbmFibGVTY2FsaW5nTENEICAgICAgICAweDAwMDgKLSNkZWZpbmUgU2V0UFdERW5hYmxlICAgICAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIFNldExDRHRvTm9uRXhwYW5kaW5nICAgIDB4MDAxMAotLyogI2RlZmluZSBTZXRMQ0RQb2xhcml0eSAweDAwRTAgKi8KLSNkZWZpbmUgU2V0TENERHVhbExpbmsgICAgICAgICAgMHgwMTAwCi0jZGVmaW5lIFNldExDRExvd1Jlc29sdXRpb24gICAgIDB4MDIwMAotI2RlZmluZSBTZXRMQ0RTdGRNb2RlICAgICAgICAgICAweDA0MDAKLSNkZWZpbmUgU2V0VFZTdGRNb2RlICAgICAgICAgICAgMHgwMjAwCi0jZGVmaW5lIFNldFRWTG93UmVzb2x1dGlvbiAgICAgIDB4MDQwMAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgZm9yIDMxMAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgU29mdERSQU1UeXBlICAgICAgICAweDgwCi0jZGVmaW5lIFNvZnRTZXR0aW5nX09GRlNFVCAgMHg1MgotI2RlZmluZSBTUjA3X09GRlNFVCAgMHg3QwotI2RlZmluZSBTUjE1X09GRlNFVCAgMHg3RAotI2RlZmluZSBTUjE2X09GRlNFVCAgMHg4MQotI2RlZmluZSBTUjE3X09GRlNFVCAgMHg4NQotI2RlZmluZSBTUjE5X09GRlNFVCAgMHg4RAotI2RlZmluZSBTUjFGX09GRlNFVCAgMHg5OQotI2RlZmluZSBTUjIxX09GRlNFVCAgMHg5QQotI2RlZmluZSBTUjIyX09GRlNFVCAgMHg5QgotI2RlZmluZSBTUjIzX09GRlNFVCAgMHg5QwotI2RlZmluZSBTUjI0X09GRlNFVCAgMHg5RAotI2RlZmluZSBTUjI1X09GRlNFVCAgMHg5RQotI2RlZmluZSBTUjMxX09GRlNFVCAgMHg5RgotI2RlZmluZSBTUjMyX09GRlNFVCAgMHhBMAotI2RlZmluZSBTUjMzX09GRlNFVCAgMHhBMQotCi0jZGVmaW5lIENSNDBfT0ZGU0VUICAweEEyCi0jZGVmaW5lIFNSMjVfMV9PRkZTRVQgIDB4RjYKLSNkZWZpbmUgQ1I0OV9PRkZTRVQgIDB4RjcKLQotI2RlZmluZSBWQjMxMERhdGFfMV8yX09mZnNldCAgMHhCNgotI2RlZmluZSBWQjMxMERhdGFfNF9EX09mZnNldCAgMHhCNwotI2RlZmluZSBWQjMxMERhdGFfNF9FX09mZnNldCAgMHhCOAotI2RlZmluZSBWQjMxMERhdGFfNF8xMF9PZmZzZXQgMHhCQgotCi0jZGVmaW5lIFJHQlNlbnNlRGF0YU9mZnNldCAgICAweEJECi0jZGVmaW5lIFlDU2Vuc2VEYXRhT2Zmc2V0ICAgICAweEJGCi0jZGVmaW5lIFZpZGVvU2Vuc2VEYXRhT2Zmc2V0ICAweEMxCi0jZGVmaW5lIE91dHB1dFNlbGVjdE9mZnNldCAgICAweEYzCi0KLSNkZWZpbmUgRUNMS19NQ0xLX0RJU1RBTkNFICAgICAgICAweDE0Ci0jZGVmaW5lIFZCSU9TVGFibGVQb2ludGVyU3RhcnQgICAgMHgyMDAKLSNkZWZpbmUgU3RhbmRUYWJsZVB0ck9mZnNldCAgICAgICAoVkJJT1NUYWJsZVBvaW50ZXJTdGFydCsweDAyKQotI2RlZmluZSBFTW9kZUlEVGFibGVQdHJPZmZzZXQgICAgIChWQklPU1RhYmxlUG9pbnRlclN0YXJ0KzB4MDQpCi0jZGVmaW5lIENSVDFUYWJsZVB0ck9mZnNldCAgICAgICAgKFZCSU9TVGFibGVQb2ludGVyU3RhcnQrMHgwNikKLSNkZWZpbmUgU2NyZWVuT2Zmc2V0UHRyT2Zmc2V0ICAgICAoVkJJT1NUYWJsZVBvaW50ZXJTdGFydCsweDA4KQotI2RlZmluZSBWQ0xLRGF0YVB0ck9mZnNldCAgICAgICAgIChWQklPU1RhYmxlUG9pbnRlclN0YXJ0KzB4MEEpCi0jZGVmaW5lIE1DTEtEYXRhUHRyT2Zmc2V0ICAgICAgICAgKFZCSU9TVGFibGVQb2ludGVyU3RhcnQrMHgwRSkKLSNkZWZpbmUgQ1JUMlB0ckRhdGFQdHJPZmZzZXQgICAgICAoVkJJT1NUYWJsZVBvaW50ZXJTdGFydCsweDEwKQotI2RlZmluZSBUVkFudGlGbGlja1B0ck9mZnNldCAgICAgIChWQklPU1RhYmxlUG9pbnRlclN0YXJ0KzB4MTIpCi0jZGVmaW5lIFRWRGVsYXlQdHIxT2Zmc2V0ICAgICAgICAgKFZCSU9TVGFibGVQb2ludGVyU3RhcnQrMHgxNCkKLSNkZWZpbmUgVFZQaGFzZUluY3JQdHIxT2Zmc2V0ICAgICAoVkJJT1NUYWJsZVBvaW50ZXJTdGFydCsweDE2KQotI2RlZmluZSBUVllGaWx0ZXJQdHIxT2Zmc2V0ICAgICAgIChWQklPU1RhYmxlUG9pbnRlclN0YXJ0KzB4MTgpCi0jZGVmaW5lIExDRERlbGF5UHRyMU9mZnNldCAgICAgICAgKFZCSU9TVGFibGVQb2ludGVyU3RhcnQrMHgyMCkKLSNkZWZpbmUgVFZFZGdlUHRyMU9mZnNldCAgICAgICAgICAoVkJJT1NUYWJsZVBvaW50ZXJTdGFydCsweDI0KQotI2RlZmluZSBDUlQyRGVsYXkxT2Zmc2V0ICAgICAgICAgIChWQklPU1RhYmxlUG9pbnRlclN0YXJ0KzB4MjgpCi0jZGVmaW5lIExDRERhdGFEZXNPZmZzZXQgICAgICAgICAgKFZCSU9TVGFibGVQb2ludGVyU3RhcnQtMHgwMikKLSNkZWZpbmUgTENERGF0YVB0ck9mZnNldCAgICAgICAgICAoVkJJT1NUYWJsZVBvaW50ZXJTdGFydCsweDJBKQotI2RlZmluZSBMQ0REZXNEYXRhUHRyT2Zmc2V0ICAgICAgIChWQklPU1RhYmxlUG9pbnRlclN0YXJ0KzB4MkMpCiAvKiBhZGQgTENERGF0YUxpc3QgZm9yIEdldExDRFB0ciAqLwogI2RlZmluZSBMQ0REYXRhTGlzdCAgICAgICAgICAgICAgIChWQklPU1RhYmxlUG9pbnRlclN0YXJ0KzB4MjIpCi0vKiBhZGQgVFZEYXRhTGlzdCBmb3IgR2V0VFZQdHIgKi8KLSNkZWZpbmUgVFZEYXRhTGlzdCAgICAgICAgICAgICAgICAoVkJJT1NUYWJsZVBvaW50ZXJTdGFydCsweDM2KQogLyogICovCiAvKiBNb2RpZnkgZnJvbSAzMTAuaW5jICovCiAvKiAgKi8KIC8qICAqLwogCi0KLSNkZWZpbmUgU2hvd01zZ0ZsYWcgICAgICAgICAgICAgICAgICAweDIwICAgIC8qIFNvZnRTZXR0aW5nICovCi0jZGVmaW5lIFNob3dWRVNBRmxhZyAgICAgICAgICAgICAgICAgMHgxMAotI2RlZmluZSBIb3RQbHVnRnVuY3Rpb24gICAgICAgICAgICAgIDB4MDgKICNkZWZpbmUgTW9kZVNvZnRTZXR0aW5nICAgICAgICAgICAgICAweDA0Ci0jZGVmaW5lIFRWU29mdFNldHRpbmcgICAgICAgICAgICAgICAgMHgwMgotI2RlZmluZSBMQ0RTb2Z0U2V0dGluZyAgICAgICAgICAgICAgIDB4MDEKIAotI2RlZmluZSBHYXRpbmdDUlRpbkxDREEgICAgICAgICAgICAgIDB4MTAKLSNkZWZpbmUgU2V0SGlUVk91dHB1dCAgICAgICAgICAgICAgICAweDA4Ci0jZGVmaW5lIFNldFlQYlByT3V0cHV0ICAgICAgICAgICAgICAgMHgwNAogI2RlZmluZSBCb2FyZFRWVHlwZSAgICAgICAgICAgICAgICAgIDB4MDIKLSNkZWZpbmUgU2V0U0NBUlRPdXRwdXQgICAgICAgICAgICAgICAweDAxCi0KLS8qIFRWTW9kZVNldHRpbmcsIE90aGVycyBhcyBzYW1lIGFzIENSMzAgKi8KLSNkZWZpbmUgTW9kZVNldHRpbmdZUGJQciAgICAgICAgICAgICAweDAyCi0KLS8qIFRWTW9kZVNldHRpbmcgc2FtZSBhcyBDUjM1ICovCi0KLS8qIExDRE1vZGVTZXR0aW5nIHNhbWUgYXMgQ1IzNyAqLwotCi0jZGVmaW5lIEVuYWJsZU5ld1RWRm9udCAgICAgICAgICAgICAgMHgxMCAgICAvKiBNaXNjQ2FwYWJpbGl0eSAqLwotCi0jZGVmaW5lIEVuYWJsZUxDRE91dHB1dCAgICAgICAgICAgICAgMHg4MCAgICAvKiBMQ0RDZmdTZXR0aW5nICovCiAKICNkZWZpbmUgU29mdERSQU1UeXBlICAgICAgICAgICAgICAgICAweDgwICAgIC8qIERSQU1TZXR0aW5nICovCi0jZGVmaW5lIFNvZnREUkFNQ29uZmlnICAgICAgICAgICAgICAgMHg0MAotI2RlZmluZSBNb3NTZWxEUkFNVHlwZSAgICAgICAgICAgICAgIDB4MjAKLSNkZWZpbmUgU0RSQU0gICAgICAgICAgICAgICAgICAgICAgICAwMDBoCi0jZGVmaW5lIFNHUkFNICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBFU0RSQU0gICAgICAgICAgICAgICAgICAgICAgIDB4MDIKLQotI2RlZmluZSBFbmFibGVBR1BDZmdTZXR0aW5nICAgICAgICAgIDB4MDEgICAgLyogQUdQQ2ZnU2V0dGluZyAqLwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tIFNldE1vZGUgU3RhY2sgKi8KICNkZWZpbmUgQ1JUMUxlbiAgICAgICAgICAgMTUKICNkZWZpbmUgVkNMS0xlbiAgICAgICAgICAgNAotI2RlZmluZSBEZWZUaHJlc2hvbGQgICAgICAweDAxMDAKLSNkZWZpbmUgRXh0UmVnc1NpemUgICAgICAgKCg1Nys4KzM3KzcwKzYzKzI4Kzc2OCsxKS82NCsxKQotCi0jZGVmaW5lIFZHQV9YR0kzMTUgICAgICAgIDB4MDAwMSAgICAgICAvKiBWR0EgVHlwZSBJbmZvICovCi0jZGVmaW5lIFZHQV9TTmV3aXMzMTVlICAgIDB4MDAwMiAgICAgICAvKiAzMTUgc2VyaWVzICovCi0jZGVmaW5lIFZHQV9YR0k1NTAgICAgICAgIDB4MDAwNAotI2RlZmluZSBWR0FfWEdJNjQwICAgICAgICAweDAwMDgKLSNkZWZpbmUgVkdBX1hHSTc0MCAgICAgICAgMHgwMDEwCi0jZGVmaW5lIFZHQV9YR0k2NTAgICAgICAgIDB4MDAyMAotI2RlZmluZSBWR0FfWEdJNjUwTSAgICAgICAweDAwNDAKLSNkZWZpbmUgVkdBX1hHSTY1MSAgICAgICAgMHgwMDgwCiAjZGVmaW5lIFZHQV9YR0kzNDAgICAgICAgIDB4MDAwMSAgICAgICAvKiAzNDAgc2VyaWVzICovCi0jZGVmaW5lIFZHQV9YR0kzMzAgICAgICAgIDB4MDAwMSAgICAgICAvKiAzMzAgc2VyaWVzICovCi0jZGVmaW5lIFZHQV9YR0k2NjAgICAgICAgIDB4MDAwMSAgICAgICAvKiA2NjAgc2VyaWVzICovCiAKICNkZWZpbmUgVkJfWEdJMzAxICAgICAgICAgMHgwMDAxICAgICAgIC8qIFZCIFR5cGUgSW5mbyAqLwogI2RlZmluZSBWQl9YR0kzMDFCICAgICAgICAweDAwMDIgICAgICAgLyogMzAxIHNlcmllcyAqLwpAQCAtNDUwLDM0ICs5MCwxNiBAQAogI2RlZmluZSBWQl9YR0kzMDFMViAgICAgICAweDAwMDgKICNkZWZpbmUgVkJfWEdJMzAyTFYgICAgICAgMHgwMDEwCiAjZGVmaW5lIFZCX0xWRFNfTlMgICAgICAgIDB4MDAwMSAgICAgICAvKiAzcmQgcGFydHkgY2hpcCAqLwotI2RlZmluZSBWQl9DSDcwMTcgICAgICAgICAweDAwMDIKLSNkZWZpbmUgVkJfQ0g3MDA3ICAgICAgICAgMHgwMDgwICAgICAgIC8qIFtCaWxseV0gMDcvMDUvMDMgKi8KLS8qICNkZWZpbmUgVkJfTFZEU19TSSAweDAwMDQgKi8KIAogI2RlZmluZSBNb2RlSW5mb0ZsYWcgICAgICAweDAwMDcKLSNkZWZpbmUgSXNUZXh0TW9kZSAgICAgICAgMHgwMDA3CiAjZGVmaW5lIE1vZGVUZXh0ICAgICAgICAgIDB4MDAwMAotI2RlZmluZSBNb2RlQ0dBICAgICAgICAgICAweDAwMDEKICNkZWZpbmUgTW9kZUVHQSAgICAgICAgICAgMHgwMDAyICAgIC8qIDE2IGNvbG9ycyBtb2RlICovCiAjZGVmaW5lIE1vZGVWR0EgICAgICAgICAgIDB4MDAwMyAgICAvKiAyNTYgY29sb3JzIG1vZGUgKi8KLSNkZWZpbmUgTW9kZTE1QnBwICAgICAgICAgMHgwMDA0ICAgIC8qIDE1IEJwcCBDb2xvciBNb2RlICovCi0jZGVmaW5lIE1vZGUxNkJwcCAgICAgICAgIDB4MDAwNSAgICAvKiAxNiBCcHAgQ29sb3IgTW9kZSAqLwotI2RlZmluZSBNb2RlMjRCcHAgICAgICAgICAweDAwMDYgICAgLyogMjQgQnBwIENvbG9yIE1vZGUgKi8KLSNkZWZpbmUgTW9kZTMyQnBwICAgICAgICAgMHgwMDA3ICAgIC8qIDMyIEJwcCBDb2xvciBNb2RlICovCiAKICNkZWZpbmUgREFDSW5mb0ZsYWcgICAgICAgMHgwMDE4Ci0jZGVmaW5lIE1PTk9EQUMgICAgICAgICAgIDB4MDAwMAotI2RlZmluZSBDR0FEQUMgICAgICAgICAgICAweDAwMDgKLSNkZWZpbmUgRUdBREFDICAgICAgICAgICAgMHgwMDEwCi0jZGVmaW5lIFZHQURBQyAgICAgICAgICAgIDB4MDAxOAogCiAjZGVmaW5lIE1lbW9yeUluZm9GbGFnICAgIDB4MDFlMAogI2RlZmluZSBNZW1vcnlTaXplU2hpZnQgICA1Ci0jZGVmaW5lIE5lZWQxTVNpemUgICAgICAgIDB4MDAwMAotI2RlZmluZSBOZWVkMk1TaXplICAgICAgICAweDAwMjAKLSNkZWZpbmUgTmVlZDRNU2l6ZSAgICAgICAgMHgwMDYwCi0jZGVmaW5lIE5lZWQ4TVNpemUgICAgICAgIDB4MDBlMAotI2RlZmluZSBOZWVkMTZNU2l6ZSAgICAgICAweDAxZTAKIAogI2RlZmluZSBDaGFyeDhEb3QgICAgICAgICAweDAyMDAKICNkZWZpbmUgTGluZUNvbXBhcmVPZmYgICAgMHgwNDAwCkBAIC00ODcsMTEgKzEwOSw3IEBACiAjZGVmaW5lIERvdWJsZVNjYW5Nb2RlICAgIDB4ODAwMAogCiAvKiAtLS0tLS0tLS0tLS0tLSBFeHRfSW5mb0ZsYWcgKi8KLSNkZWZpbmUgU3VwcG9ydE1vZGVJbmZvICAgICAweDAwMDcKLSNkZWZpbmUgU3VwcG9ydDI1NiAgICAgICAgICAweDAwMDMKLSNkZWZpbmUgU3VwcG9ydDE1QnBwICAgICAgICAweDAwMDQKICNkZWZpbmUgU3VwcG9ydDE2QnBwICAgICAgICAweDAwMDUKLSNkZWZpbmUgU3VwcG9ydDI0QnBwICAgICAgICAweDAwMDYKICNkZWZpbmUgU3VwcG9ydDMyQnBwICAgICAgICAweDAwMDcKIAogI2RlZmluZSBTdXBwb3J0QWxsQ1JUMiAgICAgIDB4MDA3OApAQCAtNTEzLDcgKzEzMSw2IEBACiAvKiAtLS0tLS0tLS0tLS0tLSBTZXRNb2RlIFN0YWNrL1NjcmF0Y2ggKi8KICNkZWZpbmUgU2V0U2ltdVNjYW5Nb2RlICAgICAweDAwMDEgICAgLyogVkJJbmZvL0NSMzAgJiBDUjMxICovCiAjZGVmaW5lIFN3aXRjaFRvQ1JUMiAgICAgICAgMHgwMDAyCi0jZGVmaW5lIFNldENSVDJUb1RWMSAgICAgICAgMHgwMDlDCiAjZGVmaW5lIFNldENSVDJUb1RWICAgICAgICAgMHgwODlDCiAjZGVmaW5lIFNldENSVDJUb0FWSURFTyAgICAgMHgwMDA0CiAjZGVmaW5lIFNldENSVDJUb1NWSURFTyAgICAgMHgwMDA4CkBAIC01MjQsMjMgKzE0MSwxNCBAQAogI2RlZmluZSBTZXRDUlQyVG9MQ0RBICAgICAgIDB4MDEwMAogI2RlZmluZSBTZXRJblNsYXZlTW9kZSAgICAgIDB4MDIwMAogI2RlZmluZSBTZXROb3RTaW11TW9kZSAgICAgIDB4MDQwMAotI2RlZmluZSBIS0V2ZW50TW9kZSAgICAgICAgIDB4MDgwMAogI2RlZmluZSBTZXRDUlQyVG9ZUGJQciAgICAgIDB4MDgwMAogI2RlZmluZSBMb2FkREFDRmxhZyAgICAgICAgIDB4MTAwMAogI2RlZmluZSBEaXNhYmxlQ1JUMkRpc3BsYXkgIDB4MjAwMAogI2RlZmluZSBEcml2ZXJNb2RlICAgICAgICAgIDB4NDAwMAogI2RlZmluZSBTZXRDUlQyVG9EdWFsRWRnZSAgIDB4ODAwMAotI2RlZmluZSBIb3RLZXlTd2l0Y2ggICAgICAgIDB4ODAwMAogCiAjZGVmaW5lIFByb2dyYW1taW5nQ1JUMiAgICAgMHgwMDAxICAgICAgIC8qIFNldCBGbGFnICovCi0jZGVmaW5lIEVuYWJsZVZDTW9kZSAgICAgICAgMHgwMDAyCi0jZGVmaW5lIFNldEhLRXZlbnRNb2RlICAgICAgMHgwMDA0CiAjZGVmaW5lIFJlc2VydmVUVk9wdGlvbiAgICAgMHgwMDA4Ci0jZGVmaW5lIERpc2FibGVSZWxvY2F0ZUlPICAgMHgwMDEwCi0jZGVmaW5lIFdpbjl4RE9TTW9kZSAgICAgICAgMHgwMDIwCi0jZGVmaW5lIEpET1NNb2RlICAgICAgICAgICAgMHgwMDQwCi0vKiAjZGVmaW5lIFNldFdpbjl4Zm9ySmFwIDB4MDA4MCAvLyBub3QgdXNlZCBub3cgKi8KLS8qICNkZWZpbmUgU2V0V2luOXhmb3JLb3JlYSAweDAxMDAgLy8gbm90IHVzZWQgbm93ICovCiAjZGVmaW5lIEdhdGluZ0NSVCAgICAgICAgICAgMHgwODAwCiAjZGVmaW5lIERpc2FibGVDaEIgICAgICAgICAgMHgxMDAwCiAjZGVmaW5lIEVuYWJsZUNoQiAgICAgICAgICAgMHgyMDAwCkBAIC01NTIsMTUgKzE2MCwxMSBAQAogI2RlZmluZSBTZXROVFNDSiAgICAgICAgICAgIDB4MDAwMgogI2RlZmluZSBTZXRQQUxNVFYgICAgICAgICAgIDB4MDAwNAogI2RlZmluZSBTZXRQQUxOVFYgICAgICAgICAgIDB4MDAwOAotI2RlZmluZSBTZXRDSFRWVW5kZXJTY2FuICAgIDB4MDAwMAotLyogI2RlZmluZSBTZXRDSFRWT3ZlclNjYW4gMHgwMDEwICovCiAjZGVmaW5lIFNldFlQYlByTW9kZTUyNWkgICAgIDB4MDAyMAogI2RlZmluZSBTZXRZUGJQck1vZGU1MjVwICAgICAweDAwNDAKICNkZWZpbmUgU2V0WVBiUHJNb2RlNzUwcCAgICAgMHgwMDgwCiAjZGVmaW5lIFNldFlQYlByTW9kZTEwODBpICAgIDB4MDEwMAotI2RlZmluZSBTZXRUVlN0ZE1vZGUgICAgICAgICAweDAyMDAKICNkZWZpbmUgU2V0VFZMb3dSZXNvbHV0aW9uICAgMHgwNDAwCi0jZGVmaW5lIFNldFRWU2ltdU1vZGUgICAgICAgIDB4MDgwMAogI2RlZmluZSBUVlNpbXVNb2RlICAgICAgICAgICAweDA4MDAKICNkZWZpbmUgUlBMTERJVjJYTyAgICAgICAgICAgMHgxMDAwCiAjZGVmaW5lIE5UU0MxMDI0eDc2OCAgICAgICAgIDB4MjAwMApAQCAtNTcxLDM4ICsxNzUsMjAgQEAKICNkZWZpbmUgRW5hYmxlU2NhbGluZ0xDRCAgICAgMHgwMDA4CiAjZGVmaW5lIFNldFBXREVuYWJsZSAgICAgICAgIDB4MDAwNAogI2RlZmluZSBTZXRMQ0R0b05vbkV4cGFuZGluZyAweDAwMTAKLSNkZWZpbmUgU2V0TENEUG9sYXJpdHkgICAgICAgMHgwMGUwCiAjZGVmaW5lIFNldExDRER1YWxMaW5rICAgICAgIDB4MDEwMAogI2RlZmluZSBTZXRMQ0RMb3dSZXNvbHV0aW9uICAweDAyMDAKICNkZWZpbmUgU2V0TENEU3RkTW9kZSAgICAgICAgMHgwNDAwCiAKIC8qIExDRCBDYXBhYmlsaXR5IHNoYW1wb28gKi8KICNkZWZpbmUgRGVmYXVsdExDRENhcCAgICAgICAgMHg4MGVhCi0jZGVmaW5lIFJMVkRTREhMMDAgICAgICAgICAgIDB4MDAwMAotI2RlZmluZSBSTFZEU0RITDAxICAgICAgICAgICAweDAwMDEKLSNkZWZpbmUgUkxWRFNESEwxMCAgICAgICAgICAgMHgwMDAyIC8qIGRlZmF1bHQgKi8KLSNkZWZpbmUgUkxWRFNESEwxMSAgICAgICAgICAgMHgwMDAzCiAjZGVmaW5lIEVuYWJsZUxDRDI0YnBwICAgICAgIDB4MDAwNCAvKiBkZWZhdWx0ICovCiAjZGVmaW5lIERpc2FibGVMQ0QyNGJwcCAgICAgIDB4MDAwMAotI2RlZmluZSBSTFZEU0Nsa1NGVDAgICAgICAgICAweDAwMDAKLSNkZWZpbmUgUkxWRFNDbGtTRlQxICAgICAgICAgMHgwMDA4IC8qIGRlZmF1bHQgKi8KLSNkZWZpbmUgRW5hYmxlTFZEU0RDQmFsICAgICAgMHgwMDEwCi0jZGVmaW5lIERpc2FibGVMVkRTRENCYWwgICAgIDB4MDAwMCAvKiBkZWZhdWx0ICovCi0jZGVmaW5lIFNpbmdsZVBvbGFyaXR5ICAgICAgIDB4MDAyMCAvKiBkZWZhdWx0ICovCi0jZGVmaW5lIE11bHRpUG9sYXJpdHkgICAgICAgIDB4MDAwMAogI2RlZmluZSBMQ0RQb2xhcml0eSAgICAgICAgICAweDAwYzAgLyogZGVmYXVsdDogU3luY05OICovCi0jZGVmaW5lIExDRFNpbmdsZUxpbmsgICAgICAgIDB4MDAwMCAvKiBkZWZhdWx0ICovCiAjZGVmaW5lIExDRER1YWxMaW5rICAgICAgICAgIDB4MDEwMAogI2RlZmluZSBFbmFibGVTcGVjdHJ1bSAgICAgICAweDAyMDAKLSNkZWZpbmUgRGlzYWJsZVNwZWN0cnVtICAgICAgMHgwMDAwIC8qIGRlZmF1bHQgKi8KICNkZWZpbmUgUFdERW5hYmxlICAgICAgICAgICAgMHgwNDAwCi0jZGVmaW5lIFBXRERpc2FibGUgICAgICAgICAgIDB4MDAwMCAvKiBkZWZhdWx0ICovCi0jZGVmaW5lIFBXTUVuYWJsZSAgICAgICAgICAgIDB4MDgwMAotI2RlZmluZSBQV01EaXNhYmxlICAgICAgICAgICAweDAwMDAgLyogZGVmYXVsdCAqLwogI2RlZmluZSBFbmFibGVWQkNMS0RSVkxPVyAgICAweDQwMDAKLSNkZWZpbmUgRW5hYmxlVkJDTEtEUlZIaWdoICAgMHgwMDAwIC8qIGRlZmF1bHQgKi8KICNkZWZpbmUgRW5hYmxlUExMU1BMT1cgICAgICAgMHg4MDAwCi0jZGVmaW5lIEVuYWJsZVBMTFNQSGlnaCAgICAgIDB4MDAwMCAvKiBkZWZhdWx0ICovCiAKICNkZWZpbmUgTENEQlRvQSAgICAgICAgICAgICAgMHgyMCAgIC8qIExDRCBTZXRGbGFnICovCiAjZGVmaW5lIFN0TENEQlRvQSAgICAgICAgICAgIDB4NDAKQEAgLTYxNiwxODcgKzIwMiw1MSBAQAogI2RlZmluZSBNb25pdG9yMVNlbnNlICAgICAgICAweDIwCiAjZGVmaW5lIEhpVFZTZW5zZSAgICAgICAgICAgIDB4NDAKIAotI2lmZGVmIE5ld1NjcmF0Y2gKICNkZWZpbmUgWVBiUHJTZW5zZSAgICAgICAgICAgMHg4MCAgIC8qIE5FVyBTQ1JBVENIICovCi0jZW5kaWYKIAogI2RlZmluZSBUVlNlbnNlICAgICAgICAgICAgICAweGM3CiAKICNkZWZpbmUgVFZPdmVyU2NhbiAgICAgICAgICAgMHgxMCAgICAgICAgICAgICAgIC8qIENSMzUgKi8KLSNkZWZpbmUgVFZPdmVyU2NhblNoaWZ0ICAgICAgNAogCi0jaWZkZWYgTmV3U2NyYXRjaAotI2RlZmluZSBOVFNDTW9kZSAgICAgICAgICAgICAweDAwCi0jZGVmaW5lIFBBTE1vZGUgICAgICAgICAgICAgIDB4MDAKLSNkZWZpbmUgTlRTQ0pNb2RlICAgICAgICAgICAgMHgwMgotI2RlZmluZSBQQUxNTk1vZGUgICAgICAgICAgICAweDBjCiAjZGVmaW5lIFlQYlByTW9kZSAgICAgICAgICAgIDB4ZTAKICNkZWZpbmUgWVBiUHJNb2RlNTI1aSAgICAgICAgMHgwMAogI2RlZmluZSBZUGJQck1vZGU1MjVwICAgICAgICAweDIwCiAjZGVmaW5lIFlQYlByTW9kZTc1MHAgICAgICAgIDB4NDAKICNkZWZpbmUgWVBiUHJNb2RlMTA4MGkgICAgICAgMHg2MAotI2Vsc2UgICAgICAgICAgICAgICAgICAgIC8qIE9sZCBTY3JhdGNoICovCi0jZGVmaW5lIENsZWFyQnVmZmVyRmxhZyAgICAgIDB4MjAKLSNlbmRpZgogCiAKICNkZWZpbmUgTENEUkdCMThCaXQgICAgICAgICAgMHgwMSAgICAgICAgICAgICAgIC8qIENSMzcgKi8KICNkZWZpbmUgTENETm9uRXhwYW5kaW5nICAgICAgMHgxMAotI2RlZmluZSBMQ0ROb25FeHBhbmRpbmdTaGlmdCA0CiAjZGVmaW5lIExDRFN5bmMgICAgICAgICAgICAgIDB4MjAKICNkZWZpbmUgTENEU3luY0JpdCAgICAgICAgICAgMHhlMCAvKiBIL1YgcG9sYXJpdHkgJiBzeW5jIElEICovCi0jZGVmaW5lIExDRFN5bmNTaGlmdCAgICAgICAgIDYKIAotI2lmZGVmIE5ld1NjcmF0Y2gKICNkZWZpbmUgU2NhbGluZ0xDRCAgICAgICAgICAgMHgwOAotI2Vsc2UgIC8qIE9sZCBTY3JhdGNoICovCi0jZGVmaW5lIEV4dENoaXBUeXBlICAgICAgICAgIDB4MGUKLSNkZWZpbmUgRXh0Q2hpcDMwMSAgICAgICAgICAgMHgwMgotI2RlZmluZSBFeHRDaGlwTFZEUyAgICAgICAgICAweDA0Ci0jZGVmaW5lIEV4dENoaXBDSDcwMTkgICAgICAgIDB4MDYKLSNkZWZpbmUgU2NhbGluZ0xDRCAgICAgICAgICAgMHgxMAotI2VuZGlmCiAKICNkZWZpbmUgRW5hYmxlRHVhbEVkZ2UgICAgICAgMHgwMSAvKiBDUjM4ICovCiAjZGVmaW5lIFNldFRvTENEQSAgICAgICAgICAgIDB4MDIKLSNpZmRlZiBOZXdTY3JhdGNoCiAjZGVmaW5lIFNldFlQYlByICAgICAgICAgICAgIDB4MDQKLSNkZWZpbmUgRGlzYWJsZUNoYW5uZWxBICAgICAgMHgwOAotI2RlZmluZSBEaXNhYmxlQ2hhbm5lbEIgICAgICAweDEwCi0jZGVmaW5lIEV4dENoaXBUeXBlICAgICAgICAgIDB4ZTAKLSNkZWZpbmUgRXh0Q2hpcDMwMSAgICAgICAgICAgMHgyMAotI2RlZmluZSBFeHRDaGlwTFZEUyAgICAgICAgICAweDQwCi0jZGVmaW5lIEV4dENoaXBDSDcwMTkgICAgICAgIDB4NjAKLSNlbHNlICAgICAgICAgICAgICAgICAgICAvKiBPbGQgU2NyYXRjaCAqLwotI2RlZmluZSBZUGJQclNlbnNlICAgICAgICAgICAweDA0Ci0jZGVmaW5lIFNldFlQYlByICAgICAgICAgICAgIDB4MDgKLSNkZWZpbmUgWVBiUHJNb2RlICAgICAgICAgICAgMHgzMAotI2RlZmluZSBZUGJQck1vZGU1MjVpICAgICAgICAweDAwCi0jZGVmaW5lIFlQYlByTW9kZTUyNXAgICAgICAgIDB4MTAKLSNkZWZpbmUgWVBiUHJNb2RlNzUwcCAgICAgICAgMHgyMAotI2RlZmluZSBZUGJQck1vZGUxMDgwaSAgICAgICAweDMwCi0jZGVmaW5lIFBBTE1OTW9kZSAgICAgICAgICAgIDB4YzAKLSNlbmRpZgogCi0jZGVmaW5lIEJhY2tsaWdodENvbnRyb2xCaXQgIDB4MDEgLyogQ1IzQSAqLwotI2RlZmluZSBXaW45eGZvckphcCAgICAgICAgICAweDQwCi0jZGVmaW5lIFdpbjl4Zm9yS29yZWEgICAgICAgIDB4ODAKLQotI2RlZmluZSBGb3JjZU1EQml0cyAgICAgICAgICAweDA3IC8qIENSM0IgKi8KLSNkZWZpbmUgRm9yY2VNRF9KRE9TICAgICAgICAgMHgwMAotI2RlZmluZSBGb3JjZU1EXzY0MHg0MDBUICAgICAweDAxCi0jZGVmaW5lIEZvcmNlTURfNjQweDM1MFQgICAgIDB4MDIKLSNkZWZpbmUgRm9yY2VNRF83MjB4NDAwVCAgICAgMHgwMwotI2RlZmluZSBGb3JjZU1EXzY0MHg0ODBFICAgICAweDA0Ci0jZGVmaW5lIEZvcmNlTURfNjQweDQwMEUgICAgIDB4MDUKLSNkZWZpbmUgRm9yY2VQMUJpdCAgICAgICAgICAgMHgxMAotI2RlZmluZSBGb3JjZVAyQml0ICAgICAgICAgICAweDIwCi0jZGVmaW5lIEVuYWJsZUZvcmNlTURpbkJJT1MgIDB4NDAKLSNkZWZpbmUgRW5hYmxlRm9yY2VNRGluRHJ2ICAgMHg4MAotCi0jaWZkZWYgTmV3U2NyYXRjaCAvKiBOZXcgU2NyYXRjaCAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBWVU1BIEluZm9ybWF0aW9uICovCi0jZGVmaW5lIExDRFNldHRpbmdGcm9tQ01PUyAgICAweDA0IC8qIENSM0MgKi8KLSNkZWZpbmUgVFZTZXR0aW5nRnJvbUNNT1MgICAgIDB4MDgKICNkZWZpbmUgRGlzcGxheURldmljZUZyb21DTU9TIDB4MTAKLSNkZWZpbmUgSEtTdXBwb3J0SW5TQklPUyAgICAgIDB4MjAKLSNkZWZpbmUgT1NEU3VwcG9ydEluU0JJT1MgICAgIDB4NDAKLSNkZWZpbmUgRGlzYWJsZUxvZ28gICAgICAgICAgIDB4ODAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBISyBFdm5ldCBEZWZpbml0aW9uICovCi0jZGVmaW5lIEhLRXZlbnQgICAgICAgICAgICAgICAweDBmIC8qIENSM0QgKi8KLSNkZWZpbmUgSEtfTW9kZVN3aXRjaCAgICAgICAgIDB4MDEKLSNkZWZpbmUgSEtfRXhwYW5kaW5nICAgICAgICAgIDB4MDIKLSNkZWZpbmUgSEtfT3ZlclNjYW4gICAgICAgICAgIDB4MDMKLSNkZWZpbmUgSEtfQnJpZ2h0bmVzcyAgICAgICAgIDB4MDQKLSNkZWZpbmUgSEtfQ29udHJhc3QgICAgICAgICAgIDB4MDUKLSNkZWZpbmUgSEtfTXV0ZSAgICAgICAgICAgICAgIDB4MDYKLSNkZWZpbmUgSEtfVm9sdW1lICAgICAgICAgICAgIDB4MDcKICNkZWZpbmUgTW9kZVN3aXRjaFN0YXR1cyAgICAgIDB4ZjAKICNkZWZpbmUgQWN0aXZlQ1JUMSAgICAgICAgICAgIDB4MTAKICNkZWZpbmUgQWN0aXZlTENEICAgICAgICAgICAgIDB4MDAyMAogI2RlZmluZSBBY3RpdmVUViAgICAgICAgICAgICAgMHg0MAogI2RlZmluZSBBY3RpdmVDUlQyICAgICAgICAgICAgMHg4MAogCi0jZGVmaW5lIFRWU3dpdGNoU3RhdHVzICAgICAgICAweDFmIC8qIENSM0UgKi8KICNkZWZpbmUgQWN0aXZlQVZpZGVvICAgICAgICAgIDB4MDEKICNkZWZpbmUgQWN0aXZlU1ZpZGVvICAgICAgICAgIDB4MDIKICNkZWZpbmUgQWN0aXZlU0NBUlQgICAgICAgICAgIDB4MDQKICNkZWZpbmUgQWN0aXZlSGlUViAgICAgICAgICAgIDB4MDgKICNkZWZpbmUgQWN0aXZlWVBiUHIgICAgICAgICAgIDB4MTAKIAotI2RlZmluZSBFbmFibGVIS0V2ZW50ICAgICAgICAgMHgwMSAvKiBDUjNGICovCi0jZGVmaW5lIEVuYWJsZU9TREV2ZW50ICAgICAgICAweDAyCi0jZGVmaW5lIFN0YXJ0T1NERXZlbnQgICAgICAgICAweDA0Ci0jZGVmaW5lIElnbm9yZUhLRXZlbnQgICAgICAgICAweDA4Ci0jZGVmaW5lIElnbm9yZU9TREV2ZW50ICAgICAgICAweDEwCi0jZWxzZSAgICAgICAgICAgICAgICAgICAgLyogT2xkIFNjcmF0Y2ggKi8KLSNkZWZpbmUgT1NEX1NCSU9TICAgICAgICAgICAgICAgMHgwMiAvKiBTUjE3ICovCi0jZGVmaW5lIERpc2FibGVMb2dvICAgICAgICAgICAgIDB4MDQKLSNkZWZpbmUgU2VsZWN0S0RPUyAgICAgICAgICAgICAgMHgwOAotI2RlZmluZSBLb3JXaW5Nb2RlICAgICAgICAgICAgICAweDEwCi0jZGVmaW5lIEtvck1vZGUzQml0ICAgICAgICAgICAgIDB4MDAyMAotI2RlZmluZSBQU0NDdHJsQml0ICAgICAgICAgICAgICAweDQwCi0jZGVmaW5lIE5QU0NDdHJsQml0U2hpZnQgICAgICAgIDYKLSNkZWZpbmUgQmx1ZVNjcmVlbkJpdCAgICAgICAgICAgMHg4MAotCi0jZGVmaW5lIEhLRXZlbnQgICAgICAgICAgICAgICAgIDB4MGYgLyogQ1I3OSAqLwotI2RlZmluZSBIS19Nb2RlU3dpdGNoICAgICAgICAgICAweDAxCi0jZGVmaW5lIEhLX0V4cGFuZGluZyAgICAgICAgICAgIDB4MDIKLSNkZWZpbmUgSEtfT3ZlclNjYW4gICAgICAgICAgICAgMHgwMwotI2RlZmluZSBIS19CcmlnaHRuZXNzICAgICAgICAgICAweDA0Ci0jZGVmaW5lIEhLX0NvbnRyYXN0ICAgICAgICAgICAgIDB4MDUKLSNkZWZpbmUgSEtfTXV0ZSAgICAgICAgICAgICAgICAgMHgwNgotI2RlZmluZSBIS19Wb2x1bWUgICAgICAgICAgICAgICAweDA3Ci0jZGVmaW5lIEFjdGl2ZVBBTCAgICAgICAgICAgICAgIDB4MDAyMAotI2RlZmluZSBBY3RpdmVQQUxTaGlmdCAgICAgICAgICA1Ci0jZGVmaW5lIEFjdGl2ZU5vbkV4cGFuZGluZyAgICAgIDB4NDAKLSNkZWZpbmUgQWN0aXZlTm9uRXhwYW5kaW5nU2hpZnQgNgotI2RlZmluZSBBY3RpdmVPdmVyU2NhbiAgICAgICAgICAweDgwCi0jZGVmaW5lIEFjdGl2ZU92ZXJTY2FuU2hpZnQgICAgIDcKLQotI2RlZmluZSBNb2RlU3dpdGNoU3RhdHVzICAgICAgICAweDBiIC8qIFNSMTUgKi8KLSNkZWZpbmUgQWN0aXZlQ1JUMSAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBBY3RpdmVMQ0QgICAgICAgICAgICAgICAweDAyCi0jZGVmaW5lIEFjdGl2ZUNSVDIgICAgICAgICAgICAgIDB4MDgKLQotI2RlZmluZSBUVlN3aXRjaFN0YXR1cyAgICAgICAgICAweGYwIC8qIFNSMTYgKi8KLSNkZWZpbmUgVFZDb25maWdTaGlmdCAgICAgICAgICAgMwotI2RlZmluZSBBY3RpdmVUViAgICAgICAgICAgICAgICAweDAxCi0jZGVmaW5lIEFjdGl2ZVlQYlByICAgICAgICAgICAgIDB4MDQKLSNkZWZpbmUgQWN0aXZlQVZpZGVvICAgICAgICAgICAgMHgxMAotI2RlZmluZSBBY3RpdmVTVmlkZW8gICAgICAgICAgICAweDAwMjAKLSNkZWZpbmUgQWN0aXZlU0NBUlQgICAgICAgICAgICAgMHg0MAotI2RlZmluZSBBY3RpdmVIaVRWICAgICAgICAgICAgICAweDgwCi0KLSNkZWZpbmUgRW5hYmxlSEtFdmVudCAgICAgICAgICAgMHgwMSAvKiBDUjdBICovCi0jZGVmaW5lIEVuYWJsZU9TREV2ZW50ICAgICAgICAgIDB4MDIKLSNkZWZpbmUgU3RhcnRPU0RFdmVudCAgICAgICAgICAgMHgwNAotI2RlZmluZSBDTU9TU3VwcG9ydCAgICAgICAgICAgICAweDA4Ci0jZGVmaW5lIEhvdEtleVN1cHBvcnQgICAgICAgICAgIDB4MTAKLSNkZWZpbmUgSW5nb3JlSEtPU0RFdmVudCAgICAgICAgMHgyMAotI2VuZGlmCi0KLS8qIC8vLS0tLS0tLS0tLS0tLSBNaXNjLiBEZWZpbml0aW9uICovCi0jZGVmaW5lIFNlbGVjdENSVDFSYXRlICAgICAgICAgICAgICAgMDBoCi0vKiAjZGVmaW5lIFNlbGVjdENSVDJSYXRlIDA0aCAqLwotCi0jZGVmaW5lIEREQzFEZWxheVRpbWUgICAgICAgICAgIDEwMDAKLSNpZmRlZiBUUlVNUElPTgotI2RlZmluZSBEREMyRGVsYXlUaW1lICAgICAgICAgICAxNQotI2Vsc2UKLSNkZWZpbmUgRERDMkRlbGF5VGltZSAgICAgICAgICAgMTUwCi0jZW5kaWYKLQotI2RlZmluZSBSX0ZBQ1RPUiAgICAgICAgICAgICAgICAwNERoCi0jZGVmaW5lIEdfRkFDVE9SICAgICAgICAgICAgICAgIDA5N2gKLSNkZWZpbmUgQl9GQUNUT1IgICAgICAgICAgICAgICAgMDFDaAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiB0cmFuc2xhdGVkIGZyb20gYXNtIGNvZGUgMzAxZGVmLmggKi8KIC8qICAqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAjZGVmaW5lIExDRERhdGFMZW4gICAgICAgICAgIDgKLSNkZWZpbmUgSGlUVkRhdGFMZW4gICAgICAgICAgMTIKICNkZWZpbmUgVFZEYXRhTGVuICAgICAgICAgICAgMTIKICNkZWZpbmUgTFZEU0NSVDFMZW5fSCAgICAgICAgOAogI2RlZmluZSBMVkRTQ1JUMUxlbl9WICAgICAgICA3CkBAIC04MDYsNyArMjU2LDYgQEAKICNkZWZpbmUgTFZEU0Rlc0RhdGFMZW4yICAgICAgOAogI2RlZmluZSBMQ0REZXNEYXRhTGVuMiAgICAgICA4CiAjZGVmaW5lIENIVFZSZWdMZW4gICAgICAgICAgIDE2Ci0jZGVmaW5lIENITFZSZWdMZW4gICAgICAgICAgIDEyCiAKICNkZWZpbmUgU3RIaVRWSFQgICAgICAgICAgICAgODkyCiAjZGVmaW5lIFN0SGlUVlZUICAgICAgICAgICAgIDExMjYKQEAgLTgxNyw3ICsyNjYsNiBAQAogI2RlZmluZSBOVFNDSFQgICAgICAgICAgICAgICAxNzE2CiAjZGVmaW5lIE5UU0NWVCAgICAgICAgICAgICAgICA1MjUKICNkZWZpbmUgTlRTQzEwMjR4NzY4SFQgICAgICAgMTkwOAotI2RlZmluZSBOVFNDMTAyNHg3NjhWVCAgICAgICAgNTI1CiAjZGVmaW5lIFBBTEhUICAgICAgICAgICAgICAgIDE3MjgKICNkZWZpbmUgUEFMVlQgICAgICAgICAgICAgICAgIDYyNQogCkBAIC04MjgsOCArMjc2LDYgQEAKICNkZWZpbmUgWVBiUHJUVjc1MHBIVCAgICAgICAgMTY1MAogI2RlZmluZSBZUGJQclRWNzUwcFZUICAgICAgICAgNzUwCiAKLSNkZWZpbmUgQ1JUMlZDTEtTZWwgICAgICAgICAgMHhjMAotCiAjZGVmaW5lIENSVDJEZWxheTEgICAgICAgICAgIDB4MDQgLyogWEdJMzAxICovCiAjZGVmaW5lIENSVDJEZWxheTIgICAgICAgICAgIDB4MEEgLyogMzAxQiwzMDIgKi8KIApAQCAtODQ2LDU3ICsyOTIsNDEgQEAKICNkZWZpbmUgVkNMSzUyXzQwNiAgICAgICAgICAgMHgwOQogI2RlZmluZSBWQ0xLNTZfMjUgICAgICAgICAgICAweDBBCiAjZGVmaW5lIFZDTEs2NSAgICAgICAgICAgICAgIDB4MEIKLSNkZWZpbmUgVkNMSzY3Xzc2NSAgICAgICAgICAgMHgwQwogI2RlZmluZSBWQ0xLNjhfMTc5ICAgICAgICAgICAweDBECiAjZGVmaW5lIFZDTEs3Ml84NTIgICAgICAgICAgIDB4MEUKICNkZWZpbmUgVkNMSzc1ICAgICAgICAgICAgICAgMHgwRgotI2RlZmluZSBWQ0xLNzVfOCAgICAgICAgICAgICAweDEwCiAjZGVmaW5lIFZDTEs3OF83NSAgICAgICAgICAgIDB4MTEKICNkZWZpbmUgVkNMSzc5XzQxMSAgICAgICAgICAgMHgxMgogI2RlZmluZSBWQ0xLODNfOTUgICAgICAgICAgICAweDEzCi0jZGVmaW5lIFZDTEs4NF84ICAgICAgICAgICAgIDB4MTQKICNkZWZpbmUgVkNMSzg2XzYgICAgICAgICAgICAgMHgxNQogI2RlZmluZSBWQ0xLOTRfNSAgICAgICAgICAgICAweDE2Ci0jZGVmaW5lIFZDTEsxMDRfOTk4ICAgICAgICAgIDB4MTcKLSNkZWZpbmUgVkNMSzEwNV84ODIgICAgICAgICAgMHgxOAogI2RlZmluZSBWQ0xLMTA4XzIgICAgICAgICAgICAweDE5Ci0jZGVmaW5lIFZDTEsxMDlfMTc1ICAgICAgICAgIDB4MUEKICNkZWZpbmUgVkNMSzExM18zMDkgICAgICAgICAgMHgxQgogI2RlZmluZSBWQ0xLMTE2XzQwNiAgICAgICAgICAweDFDCi0jZGVmaW5lIFZDTEsxMzJfMjU4ICAgICAgICAgIDB4MUQKICNkZWZpbmUgVkNMSzEzNV81ICAgICAgICAgICAgMHgxRQogI2RlZmluZSBWQ0xLMTM5XzA1NCAgICAgICAgICAweDFGCiAjZGVmaW5lIFZDTEsxNTdfNSAgICAgICAgICAgIDB4MjAKICNkZWZpbmUgVkNMSzE2MiAgICAgICAgICAgICAgMHgyMQogI2RlZmluZSBWQ0xLMTc1ICAgICAgICAgICAgICAweDIyCiAjZGVmaW5lIFZDTEsxODkgICAgICAgICAgICAgIDB4MjMKLSNkZWZpbmUgVkNMSzE5NF80ICAgICAgICAgICAgMHgyNAogI2RlZmluZSBWQ0xLMjAyXzUgICAgICAgICAgICAweDI1CiAjZGVmaW5lIFZDTEsyMjlfNSAgICAgICAgICAgIDB4MjYKICNkZWZpbmUgVkNMSzIzNCAgICAgICAgICAgICAgMHgyNwotI2RlZmluZSBWQ0xLMjUyXzY5OSAgICAgICAgICAweDI4CiAjZGVmaW5lIFZDTEsyNTRfODE3ICAgICAgICAgIDB4MjkKLSNkZWZpbmUgVkNMSzI2NV83MjggICAgICAgICAgMHgyQQogI2RlZmluZSBWQ0xLMjY2Xzk1MiAgICAgICAgICAweDJCCiAjZGVmaW5lIFZDTEsyNjlfNjU1ICAgICAgICAgIDB4MkMKLSNkZWZpbmUgVkNMSzI3Ml8wNDIgICAgICAgICAgMHgyRAogI2RlZmluZSBWQ0xLMjc3XzAxNSAgICAgICAgICAweDJFCi0jZGVmaW5lIFZDTEsyODZfMzU5ICAgICAgICAgIDB4MkYKICNkZWZpbmUgVkNMSzI5MV8xMzIgICAgICAgICAgMHgzMAogI2RlZmluZSBWQ0xLMjkxXzc2NiAgICAgICAgICAweDMxCi0jZGVmaW5lIFZDTEszMDlfNzg5ICAgICAgICAgIDB4MzIKICNkZWZpbmUgVkNMSzMxNV8xOTUgICAgICAgICAgMHgzMwogI2RlZmluZSBWQ0xLMzIzXzU4NiAgICAgICAgICAweDM0CiAjZGVmaW5lIFZDTEszMzBfNjE1ICAgICAgICAgIDB4MzUKLSNkZWZpbmUgVkNMSzMzMl8xNzcgICAgICAgICAgMHgzNgogI2RlZmluZSBWQ0xLMzQwXzQ3NyAgICAgICAgICAweDM3CiAjZGVmaW5lIFZDTEszNzVfODQ3ICAgICAgICAgIDB4MzgKICNkZWZpbmUgVkNMSzM4OF82MzEgICAgICAgICAgMHgzOQogI2RlZmluZSBWQ0xLMTI1Xzk5OSAgICAgICAgICAweDUxCiAjZGVmaW5lIFZDTEsxNDhfNSAgICAgICAgICAgIDB4NTIKLSNkZWZpbmUgVkNMSzE3OF85OTIgICAgICAgICAgMHg1NAogI2RlZmluZSBWQ0xLMjE3XzMyNSAgICAgICAgICAweDU1Ci0jZGVmaW5lIFZDTEsyOTlfNTA1ICAgICAgICAgIDB4NTYKICNkZWZpbmUgWVBiUHI3NTBwVkNMSyAgICAgICAgMHg1NwogCiAjZGVmaW5lIFRWVkNMS0RJVjIgICAgICAgICAgIDB4M0EKQEAgLTkwNiw0NSArMzM2LDEzIEBACiAjZGVmaW5lIEhpVFZTaW11VkNMSyAgICAgICAgIDB4M0UKICNkZWZpbmUgSGlUVlRleHRWQ0xLICAgICAgICAgMHgzRgogI2RlZmluZSBWQ0xLMzlfNzcgICAgICAgICAgICAweDQwCi0vKiAjZGVmaW5lIFlQYlByNzUwcFZDTEsgMHgwRiAqLwogI2RlZmluZSBZUGJQcjUyNXBWQ0xLICAgICAgICAgICAweDNBCi0vKiAjZGVmaW5lIDs7WVBiUHI1MjVpVkNMSyAweDNCICovCi0vKiAjZGVmaW5lIDs7WVBiUHI1MjVpVkNMS18yIDB4M0EgKi8KICNkZWZpbmUgTlRTQzEwMjRWQ0xLICAgICAgICAgMHg0MQotI2RlZmluZSBWQ0xLMjVfMTc1XzQxICAgICAgICAweDQyIC8qIDsgU2NhbGVMQ0QgKi8KLSNkZWZpbmUgVkNMSzI1XzE3NV80MiAgICAgICAgMHg0MwotI2RlZmluZSBWQ0xLMjhfMzIyXzQzICAgICAgICAweDQ0Ci0jZGVmaW5lIFZDTEs0MF80NCAgICAgICAgICAgIDB4NDUKLSNkZWZpbmUgVkNMS1FWR0FfMSAgICAgICAgICAgMHg0NiAvKiA7IFFWR0EgKi8KLSNkZWZpbmUgVkNMS1FWR0FfMiAgICAgICAgICAgMHg0NwotI2RlZmluZSBWQ0xLUVZHQV8zICAgICAgICAgICAweDQ4CiAjZGVmaW5lIFZDTEszNV8yICAgICAgICAgICAgIDB4NDkgLyogOyA4MDB4NDgwICovCiAjZGVmaW5lIFZDTEsxMjJfNjEgICAgICAgICAgIDB4NEEKICNkZWZpbmUgVkNMSzgwXzM1MCAgICAgICAgICAgMHg0QgogI2RlZmluZSBWQ0xLMTA3XzM4NSAgICAgICAgICAweDRDCiAKLSNkZWZpbmUgQ0hUVlZDTEszMF8yICAgICAgICAgMHg1MCAvKiA7O0NIVFYgKi8KLSNkZWZpbmUgQ0hUVlZDTEsyOF8xICAgICAgICAgMHg1MQotI2RlZmluZSBDSFRWVkNMSzQzXzYgICAgICAgICAweDUyCi0jZGVmaW5lIENIVFZWQ0xLMjZfNCAgICAgICAgIDB4NTMKLSNkZWZpbmUgQ0hUVlZDTEsyNF82ICAgICAgICAgMHg1NAotI2RlZmluZSBDSFRWVkNMSzQ3XzggICAgICAgICAweDU1Ci0jZGVmaW5lIENIVFZWQ0xLMzFfNSAgICAgICAgIDB4NTYKLSNkZWZpbmUgQ0hUVlZDTEsyNl8yICAgICAgICAgMHg1NwotI2RlZmluZSBDSFRWVkNMSzM5ICAgICAgICAgICAweDU4Ci0jZGVmaW5lIENIVFZWQ0xLMzYgICAgICAgICAgIDB4NTkKLQotI2RlZmluZSBDSDcwMDdUVlZDTEszMF8yICAgICAweDAwIC8qIFtCaWxseV0gMjAwNy8wNS8xOCBGb3IgQ0g3MDA3ICovCi0jZGVmaW5lIENINzAwN1RWVkNMSzI4XzEgICAgIDB4MDEKLSNkZWZpbmUgQ0g3MDA3VFZWQ0xLNDNfNiAgICAgMHgwMgotI2RlZmluZSBDSDcwMDdUVlZDTEsyNl80ICAgICAweDAzCi0jZGVmaW5lIENINzAwN1RWVkNMSzI0XzYgICAgIDB4MDQKLSNkZWZpbmUgQ0g3MDA3VFZWQ0xLNDdfOCAgICAgMHgwNQotI2RlZmluZSBDSDcwMDdUVlZDTEszMV81ICAgICAweDA2Ci0jZGVmaW5lIENINzAwN1RWVkNMSzI2XzIgICAgIDB4MDcKLSNkZWZpbmUgQ0g3MDA3VFZWQ0xLMzkgICAgICAgMHgwOAotI2RlZmluZSBDSDcwMDdUVlZDTEszNiAgICAgICAweDA5Ci0KICNkZWZpbmUgUkVTMzIweDIwMCAgICAgICAgICAgMHgwMAogI2RlZmluZSBSRVMzMjB4MjQwICAgICAgICAgICAweDAxCiAjZGVmaW5lIFJFUzQwMHgzMDAgICAgICAgICAgIDB4MDIKQEAgLTEwMTgsNSArNDE2LDQgQEAKICNkZWZpbmUgUkVTMTI4MHg5NjB4ODUgICAgICAgMHg0NgogI2RlZmluZSBSRVMxMjgweDk2MHgxMjAgICAgICAweDQ3CiAKLSNkZWZpbmUgTEZCRFJBTVRyYXAgICAgICAgICAgMHgzMAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfZXh0LmggYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfZXh0LmgKaW5kZXggODE0YTQ0Ni4uMGIxZjU1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX2V4dC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9leHQuaApAQCAtMSwyNiArMSw2IEBACiAjaWZuZGVmIF9WQkVYVF8KICNkZWZpbmUgX1ZCRVhUXwogCi1zdHJ1Y3QgRFdPUkRSRUdTIHsKLQl1bnNpZ25lZCBsb25nIEVheCwgRWJ4LCBFY3gsIEVkeCwgRXNpLCBFZGksIEVicDsKLX07Ci0KLXN0cnVjdCBXT1JEUkVHUyB7Ci0JdW5zaWduZWQgc2hvcnQgIGF4LCBoaV9heCwgYngsIGhpX2J4LCBjeCwgaGlfY3gsIGR4LCBoaV9keCwgc2ksCi0JCQloaV9zaSwgZGksIGhpX2RpLCBicCwgaGlfYnA7Ci19OwotCi1zdHJ1Y3QgQllURVJFR1MgewotCXVuc2lnbmVkIGNoYXIgICBhbCwgYWgsIGhpX2FsLCBoaV9haCwgYmwsIGJoLCBoaV9ibCwgaGlfYmgsIGNsLCBjaCwKLQkJCWhpX2NsLCBoaV9jaCwgZGwsIGRoLCBoaV9kbCwgaGlfZGg7Ci19OwotCi10eXBlZGVmIHVuaW9uIF9YODZfUkVHUyB7Ci0Jc3RydWN0ICBEV09SRFJFR1MgZTsKLQlzdHJ1Y3QgIFdPUkRSRUdTIHg7Ci0Jc3RydWN0ICBCWVRFUkVHUyBoOwotfSBYODZfUkVHUywgKlBYODZfUkVHUzsKLQogZXh0ZXJuIHZvaWQgWEdJX0dldFNlbnNlU3RhdHVzKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLAogCQkJICAgICAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbyk7CiBleHRlcm4gdW5zaWduZWQgc2hvcnQgWEdJTmV3X1NlbnNlTENEKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9pbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfaW5pdC5jCmluZGV4IDQ5M2I1MzIuLjllODkwYTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfaW5pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9pbml0LmMKQEAgLTEsNyArMSw4IEBACi0jaW5jbHVkZSAidmdhdHlwZXMuaCIKLQogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4gLyogdWRlbGF5ICovCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlICJ2Z2F0eXBlcy5oIgogI2luY2x1ZGUgIlhHSWZiLmgiCiAKICNpbmNsdWRlICJ2Yl9kZWYuaCIKQEAgLTE0LDE1ICsxNSwxMyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJTmV3X0NoYW5uZWxBQiwgWEdJTmV3X0RhdGFCdXNXaWR0aDsKLQotc3RhdGljIHVuc2lnbmVkIHNob3J0IFhHSU5ld19ERFJEUkFNX1RZUEUzNDBbNF1bNV0gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgWEdJTmV3X0REUkRSQU1fVFlQRTM0MFs0XVs1XSA9IHsKIAl7IDIsIDEzLCA5LCA2NCwgMHg0NX0sCiAJeyAyLCAxMiwgOSwgMzIsIDB4MzV9LAogCXsgMiwgMTIsIDgsIDE2LCAweDMxfSwKIAl7IDIsIDExLCA4LCAgOCwgMHgyMX0gfTsKIAotc3RhdGljIHVuc2lnbmVkIHNob3J0IFhHSU5ld19ERFJEUkFNX1RZUEUyMFsxMl1bNV0gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgWEdJTmV3X0REUkRSQU1fVFlQRTIwWzEyXVs1XSA9IHsKIAl7IDIsIDE0LCAxMSwgMTI4LCAweDVEfSwKIAl7IDIsIDE0LCAxMCwgNjQsIDB4NTl9LAogCXsgMiwgMTMsIDExLCA2NCwgMHg0RH0sCkBAIC0zNiw4ICszNSw2IEBACiAJeyAyLCAxMiwgIDksICA4LCAweDM1fSwKIAl7IDIsIDEyLCAgOCwgIDQsIDB4MzF9IH07CiAKLXN0YXRpYyBpbnQgWEdJTmV3X1JBTVR5cGU7Ci0KIHN0YXRpYyB1bnNpZ25lZCBjaGFyCiBYR0lOZXdfR2V0WEcyMERSQU1UeXBlKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLAogCQkgICAgICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQpAQCAtMTExLDE0ICsxMDgsMTggQEAKIAl9CiAKIAl1ZGVsYXkoNjApOwotCXhnaWZiX3JlZ19zZXQoUDNjNCwgMHgxOCwgcFZCSW5mby0+U1IxNVsyXVtYR0lOZXdfUkFNVHlwZV0pOyAvKiBTUjE4ICovCisJeGdpZmJfcmVnX3NldChQM2M0LAorCQkgICAgICAweDE4LAorCQkgICAgICBwVkJJbmZvLT5TUjE1WzJdW3BWQkluZm8tPnJhbV90eXBlXSk7IC8qIFNSMTggKi8KIAl4Z2lmYl9yZWdfc2V0KFAzYzQsIDB4MTksIDB4MDEpOwogCXhnaWZiX3JlZ19zZXQoUDNjNCwgMHgxNiwgcFZCSW5mby0+U1IxNlswXSk7CiAJeGdpZmJfcmVnX3NldChQM2M0LCAweDE2LCBwVkJJbmZvLT5TUjE2WzFdKTsKIAltZGVsYXkoMSk7CiAJeGdpZmJfcmVnX3NldChQM2M0LCAweDFCLCAweDAzKTsKIAl1ZGVsYXkoNTAwKTsKLQl4Z2lmYl9yZWdfc2V0KFAzYzQsIDB4MTgsIHBWQkluZm8tPlNSMTVbMl1bWEdJTmV3X1JBTVR5cGVdKTsgLyogU1IxOCAqLworCXhnaWZiX3JlZ19zZXQoUDNjNCwKKwkJICAgICAgMHgxOCwKKwkJICAgICAgcFZCSW5mby0+U1IxNVsyXVtwVkJJbmZvLT5yYW1fdHlwZV0pOyAvKiBTUjE4ICovCiAJeGdpZmJfcmVnX3NldChQM2M0LCAweDE5LCAweDAwKTsKIAl4Z2lmYl9yZWdfc2V0KFAzYzQsIDB4MTYsIHBWQkluZm8tPlNSMTZbMl0pOwogCXhnaWZiX3JlZ19zZXQoUDNjNCwgMHgxNiwgcFZCSW5mby0+U1IxNlszXSk7CkBAIC0xMzEsMjMgKzEzMiwyMyBAQAogCiAJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LAogCQkgICAgICAweDI4LAotCQkgICAgICBwVkJJbmZvLT5NQ0xLRGF0YVtYR0lOZXdfUkFNVHlwZV0uU1IyOCk7CisJCSAgICAgIHBWQkluZm8tPk1DTEtEYXRhW3BWQkluZm8tPnJhbV90eXBlXS5TUjI4KTsKIAl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsCiAJCSAgICAgIDB4MjksCi0JCSAgICAgIHBWQkluZm8tPk1DTEtEYXRhW1hHSU5ld19SQU1UeXBlXS5TUjI5KTsKKwkJICAgICAgcFZCSW5mby0+TUNMS0RhdGFbcFZCSW5mby0+cmFtX3R5cGVdLlNSMjkpOwogCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNjNCwKIAkJICAgICAgMHgyQSwKLQkJICAgICAgcFZCSW5mby0+TUNMS0RhdGFbWEdJTmV3X1JBTVR5cGVdLlNSMkEpOworCQkgICAgICBwVkJJbmZvLT5NQ0xLRGF0YVtwVkJJbmZvLT5yYW1fdHlwZV0uU1IyQSk7CiAKIAl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsCiAJCSAgICAgIDB4MkUsCi0JCSAgICAgIHBWQkluZm8tPkVDTEtEYXRhW1hHSU5ld19SQU1UeXBlXS5TUjJFKTsKKwkJICAgICAgcFZCSW5mby0+RUNMS0RhdGFbcFZCSW5mby0+cmFtX3R5cGVdLlNSMkUpOwogCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNjNCwKIAkJICAgICAgMHgyRiwKLQkJICAgICAgcFZCSW5mby0+RUNMS0RhdGFbWEdJTmV3X1JBTVR5cGVdLlNSMkYpOworCQkgICAgICBwVkJJbmZvLT5FQ0xLRGF0YVtwVkJJbmZvLT5yYW1fdHlwZV0uU1IyRik7CiAJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LAogCQkgICAgICAweDMwLAotCQkgICAgICBwVkJJbmZvLT5FQ0xLRGF0YVtYR0lOZXdfUkFNVHlwZV0uU1IzMCk7CisJCSAgICAgIHBWQkluZm8tPkVDTEtEYXRhW3BWQkluZm8tPnJhbV90eXBlXS5TUjMwKTsKIAogCS8qIFtWaWNlbnRdIDIwMDQvMDcvMDcsCiAJICogV2hlbiBYRzQyIEVDTEsgPSBNQ0xLID0gMjA3TUh6LCBTZXQgU1IzMiBEWzE6MF0gPSAxMGIgKi8KQEAgLTE1NSwxMiArMTU2LDEyIEBACiAJICogTW9kaWZ5IFNSMzIgdmFsdWUsIHdoZW4gTUNMSz0yMDdNSFosIEVMQ0s9MjUwTUh6LAogCSAqIFNldCBTUjMyIERbMTowXSA9IDEwYiAqLwogCWlmIChId0RldmljZUV4dGVuc2lvbi0+akNoaXBUeXBlID09IFhHNDIpIHsKLQkJaWYgKChwVkJJbmZvLT5NQ0xLRGF0YVtYR0lOZXdfUkFNVHlwZV0uU1IyOCA9PSAweDFDKSAmJgotCQkgICAgKHBWQkluZm8tPk1DTEtEYXRhW1hHSU5ld19SQU1UeXBlXS5TUjI5ID09IDB4MDEpICYmCi0JCSAgICAoKChwVkJJbmZvLT5FQ0xLRGF0YVtYR0lOZXdfUkFNVHlwZV0uU1IyRSA9PSAweDFDKSAmJgotCQkgICAgICAocFZCSW5mby0+RUNMS0RhdGFbWEdJTmV3X1JBTVR5cGVdLlNSMkYgPT0gMHgwMSkpIHx8Ci0JCSAgICAgKChwVkJJbmZvLT5FQ0xLRGF0YVtYR0lOZXdfUkFNVHlwZV0uU1IyRSA9PSAweDIyKSAmJgotCQkgICAgICAocFZCSW5mby0+RUNMS0RhdGFbWEdJTmV3X1JBTVR5cGVdLlNSMkYgPT0gMHgwMSkpKSkKKwkJaWYgKChwVkJJbmZvLT5NQ0xLRGF0YVtwVkJJbmZvLT5yYW1fdHlwZV0uU1IyOCA9PSAweDFDKSAmJgorCQkgICAgKHBWQkluZm8tPk1DTEtEYXRhW3BWQkluZm8tPnJhbV90eXBlXS5TUjI5ID09IDB4MDEpICYmCisJCSAgICAoKChwVkJJbmZvLT5FQ0xLRGF0YVtwVkJJbmZvLT5yYW1fdHlwZV0uU1IyRSA9PSAweDFDKSAmJgorCQkgICAgICAocFZCSW5mby0+RUNMS0RhdGFbcFZCSW5mby0+cmFtX3R5cGVdLlNSMkYgPT0gMHgwMSkpIHx8CisJCSAgICAgKChwVkJJbmZvLT5FQ0xLRGF0YVtwVkJJbmZvLT5yYW1fdHlwZV0uU1IyRSA9PSAweDIyKSAmJgorCQkgICAgICAocFZCSW5mby0+RUNMS0RhdGFbcFZCSW5mby0+cmFtX3R5cGVdLlNSMkYgPT0gMHgwMSkpKSkKIAkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNjNCwKIAkJCQkgICAgICAweDMyLAogCQkJCSAgICAgICgodW5zaWduZWQgY2hhcikgeGdpZmJfcmVnX2dldCgKQEAgLTE3Myw4ICsxNzQsNyBAQAogCQkJdW5zaWduZWQgbG9uZyBQM2M0LCBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7CiAJdW5zaWduZWQgbG9uZyBQM2Q0ID0gUDNjNCArIDB4MTA7Ci0JWEdJTmV3X1JBTVR5cGUgPSAoaW50KSBYR0lOZXdfR2V0WEcyMERSQU1UeXBlKEh3RGV2aWNlRXh0ZW5zaW9uLAotCQkJCQkJICAgICAgcFZCSW5mbyk7CisJcFZCSW5mby0+cmFtX3R5cGUgPSBYR0lOZXdfR2V0WEcyMERSQU1UeXBlKEh3RGV2aWNlRXh0ZW5zaW9uLCBwVkJJbmZvKTsKIAlYR0lOZXdfU2V0TWVtb3J5Q2xvY2soSHdEZXZpY2VFeHRlbnNpb24sIHBWQkluZm8pOwogCiAJLyogU2V0IERvdWJsZSBGcmVxdWVuY3kgKi8KQEAgLTI0OSw4ICsyNDksNyBAQAogewogCXVuc2lnbmVkIGxvbmcgUDNkNCA9IFAzYzQgKyAweDEwOwogCi0JWEdJTmV3X1JBTVR5cGUgPSAoaW50KSBYR0lOZXdfR2V0WEcyMERSQU1UeXBlKEh3RGV2aWNlRXh0ZW5zaW9uLAotCQkJCQkJICAgICAgcFZCSW5mbyk7CisJcFZCSW5mby0+cmFtX3R5cGUgPSBYR0lOZXdfR2V0WEcyMERSQU1UeXBlKEh3RGV2aWNlRXh0ZW5zaW9uLCBwVkJJbmZvKTsKIAlYR0lOZXdfU2V0TWVtb3J5Q2xvY2soSHdEZXZpY2VFeHRlbnNpb24sIHBWQkluZm8pOwogCiAJeGdpZmJfcmVnX3NldChQM2Q0LCAweDk3LCAweDExKTsgLyogQ1I5NyAqLwpAQCAtMzA2LDcgKzMwNSw5IEBACiAJeGdpZmJfcmVnX3NldChQM2M0LCAweDE2LCAweDAwKTsKIAl4Z2lmYl9yZWdfc2V0KFAzYzQsIDB4MTYsIDB4ODApOwogCXVkZWxheSg2MCk7Ci0JeGdpZmJfcmVnX3NldChQM2M0LCAweDE4LCBwVkJJbmZvLT5TUjE1WzJdW1hHSU5ld19SQU1UeXBlXSk7IC8qIFNSMTggKi8KKwl4Z2lmYl9yZWdfc2V0KFAzYzQsCisJCSAgICAgIDB4MTgsCisJCSAgICAgIHBWQkluZm8tPlNSMTVbMl1bcFZCSW5mby0+cmFtX3R5cGVdKTsgLyogU1IxOCAqLwogCS8qIHhnaWZiX3JlZ19zZXQoUDNjNCwgMHgxOCwgMHgzMSk7ICovCiAJeGdpZmJfcmVnX3NldChQM2M0LCAweDE5LCAweDAxKTsKIAl4Z2lmYl9yZWdfc2V0KFAzYzQsIDB4MTYsIDB4MDMpOwpAQCAtMzE1LDcgKzMxNiw5IEBACiAJeGdpZmJfcmVnX3NldChQM2M0LCAweDFCLCAweDAzKTsKIAl1ZGVsYXkoNTAwKTsKIAkvKiB4Z2lmYl9yZWdfc2V0KFAzYzQsIDB4MTgsIDB4MzEpOyAqLwotCXhnaWZiX3JlZ19zZXQoUDNjNCwgMHgxOCwgcFZCSW5mby0+U1IxNVsyXVtYR0lOZXdfUkFNVHlwZV0pOyAvKiBTUjE4ICovCisJeGdpZmJfcmVnX3NldChQM2M0LAorCQkgICAgICAweDE4LAorCQkgICAgICBwVkJJbmZvLT5TUjE1WzJdW3BWQkluZm8tPnJhbV90eXBlXSk7IC8qIFNSMTggKi8KIAl4Z2lmYl9yZWdfc2V0KFAzYzQsIDB4MTksIDB4MDApOwogCXhnaWZiX3JlZ19zZXQoUDNjNCwgMHgxNiwgMHgwMyk7CiAJeGdpZmJfcmVnX3NldChQM2M0LCAweDE2LCAweDgzKTsKQEAgLTMzMiwxMyArMzM1LDEzIEBACiAJCVhHSU5ld19TZXRNZW1vcnlDbG9jayhId0RldmljZUV4dGVuc2lvbiwgcFZCSW5mbyk7CiAJCXhnaWZiX3JlZ19zZXQoUDNkNCwKIAkJCSAgICAgIDB4ODIsCi0JCQkgICAgICBwVkJJbmZvLT5DUjQwWzExXVtYR0lOZXdfUkFNVHlwZV0pOyAvKiBDUjgyICovCisJCQkgICAgICBwVkJJbmZvLT5DUjQwWzExXVtwVkJJbmZvLT5yYW1fdHlwZV0pOyAvKiBDUjgyICovCiAJCXhnaWZiX3JlZ19zZXQoUDNkNCwKIAkJCSAgICAgIDB4ODUsCi0JCQkgICAgICBwVkJJbmZvLT5DUjQwWzEyXVtYR0lOZXdfUkFNVHlwZV0pOyAvKiBDUjg1ICovCisJCQkgICAgICBwVkJJbmZvLT5DUjQwWzEyXVtwVkJJbmZvLT5yYW1fdHlwZV0pOyAvKiBDUjg1ICovCiAJCXhnaWZiX3JlZ19zZXQoUDNkNCwKIAkJCSAgICAgIDB4ODYsCi0JCQkgICAgICBwVkJJbmZvLT5DUjQwWzEzXVtYR0lOZXdfUkFNVHlwZV0pOyAvKiBDUjg2ICovCisJCQkgICAgICBwVkJJbmZvLT5DUjQwWzEzXVtwVkJJbmZvLT5yYW1fdHlwZV0pOyAvKiBDUjg2ICovCiAKIAkJeGdpZmJfcmVnX3NldChQM2Q0LCAweDk4LCAweDAxKTsKIAkJeGdpZmJfcmVnX3NldChQM2Q0LCAweDlBLCAweDAyKTsKQEAgLTM1MywxNSArMzU2LDE1IEBACiAJCQkvKiBDUjgyICovCiAJCQl4Z2lmYl9yZWdfc2V0KFAzZDQsCiAJCQkJICAgICAgMHg4MiwKLQkJCQkgICAgICBwVkJJbmZvLT5DUjQwWzExXVtYR0lOZXdfUkFNVHlwZV0pOworCQkJCSAgICAgIHBWQkluZm8tPkNSNDBbMTFdW3BWQkluZm8tPnJhbV90eXBlXSk7CiAJCQkvKiBDUjg1ICovCiAJCQl4Z2lmYl9yZWdfc2V0KFAzZDQsCiAJCQkJICAgICAgMHg4NSwKLQkJCQkgICAgICBwVkJJbmZvLT5DUjQwWzEyXVtYR0lOZXdfUkFNVHlwZV0pOworCQkJCSAgICAgIHBWQkluZm8tPkNSNDBbMTJdW3BWQkluZm8tPnJhbV90eXBlXSk7CiAJCQkvKiBDUjg2ICovCiAJCQl4Z2lmYl9yZWdfc2V0KFAzZDQsCiAJCQkJICAgICAgMHg4NiwKLQkJCQkgICAgICBwVkJJbmZvLT5DUjQwWzEzXVtYR0lOZXdfUkFNVHlwZV0pOworCQkJCSAgICAgIHBWQkluZm8tPkNSNDBbMTNdW3BWQkluZm8tPnJhbV90eXBlXSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXhnaWZiX3JlZ19zZXQoUDNkNCwgMHg4MiwgMHg4OCk7CkBAIC0zNzIsNyArMzc1LDcgQEAKIAkJCXhnaWZiX3JlZ19nZXQoUDNkNCwgMHg4Nik7CiAJCQl4Z2lmYl9yZWdfc2V0KFAzZDQsCiAJCQkJICAgICAgMHg4NiwKLQkJCQkgICAgICBwVkJJbmZvLT5DUjQwWzEzXVtYR0lOZXdfUkFNVHlwZV0pOworCQkJCSAgICAgIHBWQkluZm8tPkNSNDBbMTNdW3BWQkluZm8tPnJhbV90eXBlXSk7CiAJCQl4Z2lmYl9yZWdfc2V0KFAzZDQsIDB4ODIsIDB4NzcpOwogCQkJeGdpZmJfcmVnX3NldChQM2Q0LCAweDg1LCAweDAwKTsKIApAQCAtMzg1LDExICszODgsMTEgQEAKIAkJCS8qIENSODUgKi8KIAkJCXhnaWZiX3JlZ19zZXQoUDNkNCwKIAkJCQkgICAgICAweDg1LAotCQkJCSAgICAgIHBWQkluZm8tPkNSNDBbMTJdW1hHSU5ld19SQU1UeXBlXSk7CisJCQkJICAgICAgcFZCSW5mby0+Q1I0MFsxMl1bcFZCSW5mby0+cmFtX3R5cGVdKTsKIAkJCS8qIENSODIgKi8KIAkJCXhnaWZiX3JlZ19zZXQoUDNkNCwKIAkJCQkgICAgICAweDgyLAotCQkJCSAgICAgIHBWQkluZm8tPkNSNDBbMTFdW1hHSU5ld19SQU1UeXBlXSk7CisJCQkJICAgICAgcFZCSW5mby0+Q1I0MFsxMV1bcFZCSW5mby0+cmFtX3R5cGVdKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTQxNCwxNiArNDE3LDE4IEBACiAJeGdpZmJfcmVnX3NldChQM2Q0LCAweDg2LCAweDg4KTsKIAl4Z2lmYl9yZWdfZ2V0KFAzZDQsIDB4ODYpOyAvKiBJbnNlcnQgcmVhZCBjb21tYW5kIGZvciBkZWxheSAqLwogCS8qIENSODYgKi8KLQl4Z2lmYl9yZWdfc2V0KFAzZDQsIDB4ODYsIHBWQkluZm8tPkNSNDBbMTNdW1hHSU5ld19SQU1UeXBlXSk7CisJeGdpZmJfcmVnX3NldChQM2Q0LCAweDg2LCBwVkJJbmZvLT5DUjQwWzEzXVtwVkJJbmZvLT5yYW1fdHlwZV0pOwogCXhnaWZiX3JlZ19zZXQoUDNkNCwgMHg4MiwgMHg3Nyk7CiAJeGdpZmJfcmVnX3NldChQM2Q0LCAweDg1LCAweDAwKTsKIAl4Z2lmYl9yZWdfZ2V0KFAzZDQsIDB4ODUpOyAvKiBJbnNlcnQgcmVhZCBjb21tYW5kIGZvciBkZWxheSAqLwogCXhnaWZiX3JlZ19zZXQoUDNkNCwgMHg4NSwgMHg4OCk7CiAJeGdpZmJfcmVnX2dldChQM2Q0LCAweDg1KTsgLyogSW5zZXJ0IHJlYWQgY29tbWFuZCBmb3IgZGVsYXkgKi8KLQl4Z2lmYl9yZWdfc2V0KFAzZDQsIDB4ODUsIHBWQkluZm8tPkNSNDBbMTJdW1hHSU5ld19SQU1UeXBlXSk7IC8qIENSODUgKi8KKwl4Z2lmYl9yZWdfc2V0KFAzZDQsCisJCSAgICAgIDB4ODUsCisJCSAgICAgIHBWQkluZm8tPkNSNDBbMTJdW3BWQkluZm8tPnJhbV90eXBlXSk7IC8qIENSODUgKi8KIAlpZiAoSHdEZXZpY2VFeHRlbnNpb24tPmpDaGlwVHlwZSA9PSBYRzI3KQogCQkvKiBDUjgyICovCi0JCXhnaWZiX3JlZ19zZXQoUDNkNCwgMHg4MiwgcFZCSW5mby0+Q1I0MFsxMV1bWEdJTmV3X1JBTVR5cGVdKTsKKwkJeGdpZmJfcmVnX3NldChQM2Q0LCAweDgyLCBwVkJJbmZvLT5DUjQwWzExXVtwVkJJbmZvLT5yYW1fdHlwZV0pOwogCWVsc2UKIAkJeGdpZmJfcmVnX3NldChQM2Q0LCAweDgyLCAweEE4KTsgLyogQ1I4MiAqLwogCkBAIC00NDMsMTUgKzQ0OCwxNSBAQAogCiAJdW5zaWduZWQgbG9uZyBQM2Q0ID0gUG9ydCwgUDNjNCA9IFBvcnQgLSAweDEwOwogCi0JeGdpZmJfcmVnX3NldChQM2Q0LCAweDZELCBwVkJJbmZvLT5DUjQwWzhdW1hHSU5ld19SQU1UeXBlXSk7Ci0JeGdpZmJfcmVnX3NldChQM2Q0LCAweDY4LCBwVkJJbmZvLT5DUjQwWzVdW1hHSU5ld19SQU1UeXBlXSk7Ci0JeGdpZmJfcmVnX3NldChQM2Q0LCAweDY5LCBwVkJJbmZvLT5DUjQwWzZdW1hHSU5ld19SQU1UeXBlXSk7Ci0JeGdpZmJfcmVnX3NldChQM2Q0LCAweDZBLCBwVkJJbmZvLT5DUjQwWzddW1hHSU5ld19SQU1UeXBlXSk7CisJeGdpZmJfcmVnX3NldChQM2Q0LCAweDZELCBwVkJJbmZvLT5DUjQwWzhdW3BWQkluZm8tPnJhbV90eXBlXSk7CisJeGdpZmJfcmVnX3NldChQM2Q0LCAweDY4LCBwVkJJbmZvLT5DUjQwWzVdW3BWQkluZm8tPnJhbV90eXBlXSk7CisJeGdpZmJfcmVnX3NldChQM2Q0LCAweDY5LCBwVkJJbmZvLT5DUjQwWzZdW3BWQkluZm8tPnJhbV90eXBlXSk7CisJeGdpZmJfcmVnX3NldChQM2Q0LCAweDZBLCBwVkJJbmZvLT5DUjQwWzddW3BWQkluZm8tPnJhbV90eXBlXSk7CiAKIAl0ZW1wMiA9IDA7CiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQkvKiBDUjZCIERRUyBmaW5lIHR1bmUgZGVsYXkgKi8KLQkJdGVtcCA9IHBWQkluZm8tPkNSNkJbWEdJTmV3X1JBTVR5cGVdW2ldOworCQl0ZW1wID0gcFZCSW5mby0+Q1I2QltwVkJJbmZvLT5yYW1fdHlwZV1baV07CiAJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKIAkJCXRlbXAxID0gKCh0ZW1wID4+ICgyICogaikpICYgMHgwMykgPDwgMjsKIAkJCXRlbXAyIHw9IHRlbXAxOwpAQCAtNDY2LDcgKzQ3MSw3IEBACiAJdGVtcDIgPSAwOwogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKIAkJLyogQ1I2RSBEUU0gZmluZSB0dW5lIGRlbGF5ICovCi0JCXRlbXAgPSBwVkJJbmZvLT5DUjZFW1hHSU5ld19SQU1UeXBlXVtpXTsKKwkJdGVtcCA9IHBWQkluZm8tPkNSNkVbcFZCSW5mby0+cmFtX3R5cGVdW2ldOwogCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CiAJCQl0ZW1wMSA9ICgodGVtcCA+PiAoMiAqIGopKSAmIDB4MDMpIDw8IDI7CiAJCQl0ZW1wMiB8PSB0ZW1wMTsKQEAgLTQ4NSw3ICs0OTAsNyBAQAogCQl0ZW1wMiA9IDA7CiAJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKIAkJCS8qIENSNkYgRFEgZmluZSB0dW5lIGRlbGF5ICovCi0JCQl0ZW1wID0gcFZCSW5mby0+Q1I2RltYR0lOZXdfUkFNVHlwZV1bOCAqIGsgKyBpXTsKKwkJCXRlbXAgPSBwVkJJbmZvLT5DUjZGW3BWQkluZm8tPnJhbV90eXBlXVs4ICogayArIGldOwogCQkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgewogCQkJCXRlbXAxID0gKHRlbXAgPj4gKDIgKiBqKSkgJiAweDAzOwogCQkJCXRlbXAyIHw9IHRlbXAxOwpAQCAtNDk5LDEyICs1MDQsMTYgQEAKIAkJdGVtcDMgKz0gMHgwMTsKIAl9CiAKLQl4Z2lmYl9yZWdfc2V0KFAzZDQsIDB4ODAsIHBWQkluZm8tPkNSNDBbOV1bWEdJTmV3X1JBTVR5cGVdKTsgLyogQ1I4MCAqLwotCXhnaWZiX3JlZ19zZXQoUDNkNCwgMHg4MSwgcFZCSW5mby0+Q1I0MFsxMF1bWEdJTmV3X1JBTVR5cGVdKTsgLyogQ1I4MSAqLworCXhnaWZiX3JlZ19zZXQoUDNkNCwKKwkJICAgICAgMHg4MCwKKwkJICAgICAgcFZCSW5mby0+Q1I0MFs5XVtwVkJJbmZvLT5yYW1fdHlwZV0pOyAvKiBDUjgwICovCisJeGdpZmJfcmVnX3NldChQM2Q0LAorCQkgICAgICAweDgxLAorCQkgICAgICBwVkJJbmZvLT5DUjQwWzEwXVtwVkJJbmZvLT5yYW1fdHlwZV0pOyAvKiBDUjgxICovCiAKIAl0ZW1wMiA9IDB4ODA7CiAJLyogQ1I4OSB0ZXJtaW5hdG9yIHR5cGUgc2VsZWN0ICovCi0JdGVtcCA9IHBWQkluZm8tPkNSODlbWEdJTmV3X1JBTVR5cGVdWzBdOworCXRlbXAgPSBwVkJJbmZvLT5DUjg5W3BWQkluZm8tPnJhbV90eXBlXVswXTsKIAlmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CiAJCXRlbXAxID0gKHRlbXAgPj4gKDIgKiBqKSkgJiAweDAzOwogCQl0ZW1wMiB8PSB0ZW1wMTsKQEAgLTUxNCw0NSArNTIzLDQ5IEBACiAJCXRlbXAyICs9IDB4MTA7CiAJfQogCi0JdGVtcCA9IHBWQkluZm8tPkNSODlbWEdJTmV3X1JBTVR5cGVdWzFdOworCXRlbXAgPSBwVkJJbmZvLT5DUjg5W3BWQkluZm8tPnJhbV90eXBlXVsxXTsKIAl0ZW1wMSA9IHRlbXAgJiAweDAzOwogCXRlbXAyIHw9IHRlbXAxOwogCXhnaWZiX3JlZ19zZXQoUDNkNCwgMHg4OSwgdGVtcDIpOwogCi0JdGVtcCA9IHBWQkluZm8tPkNSNDBbM11bWEdJTmV3X1JBTVR5cGVdOworCXRlbXAgPSBwVkJJbmZvLT5DUjQwWzNdW3BWQkluZm8tPnJhbV90eXBlXTsKIAl0ZW1wMSA9IHRlbXAgJiAweDBGOwogCXRlbXAyID0gKHRlbXAgPj4gNCkgJiAweDA3OwogCXRlbXAzID0gdGVtcCAmIDB4ODA7CiAJeGdpZmJfcmVnX3NldChQM2Q0LCAweDQ1LCB0ZW1wMSk7IC8qIENSNDUgKi8KIAl4Z2lmYl9yZWdfc2V0KFAzZDQsIDB4OTksIHRlbXAyKTsgLyogQ1I5OSAqLwogCXhnaWZiX3JlZ19vcihQM2Q0LCAweDQwLCB0ZW1wMyk7IC8qIENSNDBfRFs3XSAqLwotCXhnaWZiX3JlZ19zZXQoUDNkNCwgMHg0MSwgcFZCSW5mby0+Q1I0MFswXVtYR0lOZXdfUkFNVHlwZV0pOyAvKiBDUjQxICovCisJeGdpZmJfcmVnX3NldChQM2Q0LAorCQkgICAgICAweDQxLAorCQkgICAgICBwVkJJbmZvLT5DUjQwWzBdW3BWQkluZm8tPnJhbV90eXBlXSk7IC8qIENSNDEgKi8KIAogCWlmIChId0RldmljZUV4dGVuc2lvbi0+akNoaXBUeXBlID09IFhHMjcpCiAJCXhnaWZiX3JlZ19zZXQoUDNkNCwgMHg4RiwgKnBWQkluZm8tPnBDUjhGKTsgLyogQ1I4RiAqLwogCiAJZm9yIChqID0gMDsgaiA8PSA2OyBqKyspIC8qIENSOTAgLSBDUjk2ICovCiAJCXhnaWZiX3JlZ19zZXQoUDNkNCwgKDB4OTAgKyBqKSwKLQkJCQlwVkJJbmZvLT5DUjQwWzE0ICsgal1bWEdJTmV3X1JBTVR5cGVdKTsKKwkJCQlwVkJJbmZvLT5DUjQwWzE0ICsgal1bcFZCSW5mby0+cmFtX3R5cGVdKTsKIAogCWZvciAoaiA9IDA7IGogPD0gMjsgaisrKSAvKiBDUkMzIC0gQ1JDNSAqLwogCQl4Z2lmYl9yZWdfc2V0KFAzZDQsICgweEMzICsgaiksCi0JCQkJcFZCSW5mby0+Q1I0MFsyMSArIGpdW1hHSU5ld19SQU1UeXBlXSk7CisJCQkJcFZCSW5mby0+Q1I0MFsyMSArIGpdW3BWQkluZm8tPnJhbV90eXBlXSk7CiAKIAlmb3IgKGogPSAwOyBqIDwgMjsgaisrKSAvKiBDUjhBIC0gQ1I4QiAqLwogCQl4Z2lmYl9yZWdfc2V0KFAzZDQsICgweDhBICsgaiksCi0JCQkJcFZCSW5mby0+Q1I0MFsxICsgal1bWEdJTmV3X1JBTVR5cGVdKTsKKwkJCQlwVkJJbmZvLT5DUjQwWzEgKyBqXVtwVkJJbmZvLT5yYW1fdHlwZV0pOwogCiAJaWYgKChId0RldmljZUV4dGVuc2lvbi0+akNoaXBUeXBlID09IFhHNDEpIHx8CiAJICAgIChId0RldmljZUV4dGVuc2lvbi0+akNoaXBUeXBlID09IFhHNDIpKQogCQl4Z2lmYl9yZWdfc2V0KFAzZDQsIDB4OEMsIDB4ODcpOwogCi0JeGdpZmJfcmVnX3NldChQM2Q0LCAweDU5LCBwVkJJbmZvLT5DUjQwWzRdW1hHSU5ld19SQU1UeXBlXSk7IC8qIENSNTkgKi8KKwl4Z2lmYl9yZWdfc2V0KFAzZDQsCisJCSAgICAgIDB4NTksCisJCSAgICAgIHBWQkluZm8tPkNSNDBbNF1bcFZCSW5mby0+cmFtX3R5cGVdKTsgLyogQ1I1OSAqLwogCiAJeGdpZmJfcmVnX3NldChQM2Q0LCAweDgzLCAweDA5KTsgLyogQ1I4MyAqLwogCXhnaWZiX3JlZ19zZXQoUDNkNCwgMHg4NywgMHgwMCk7IC8qIENSODcgKi8KIAl4Z2lmYl9yZWdfc2V0KFAzZDQsIDB4Q0YsICpwVkJJbmZvLT5wQ1JDRik7IC8qIENSQ0YgKi8KLQlpZiAoWEdJTmV3X1JBTVR5cGUpIHsKKwlpZiAocFZCSW5mby0+cmFtX3R5cGUpIHsKIAkJLyogeGdpZmJfcmVnX3NldChQM2M0LCAweDE3LCAweEMwKTsgKi8gLyogU1IxNyBERFJJSSAqLwogCQl4Z2lmYl9yZWdfc2V0KFAzYzQsIDB4MTcsIDB4ODApOyAvKiBTUjE3IEREUklJICovCiAJCWlmIChId0RldmljZUV4dGVuc2lvbi0+akNoaXBUeXBlID09IFhHMjcpCkBAIC01NzAsMTEgKzU4MywxMyBAQAogCQl4Z2lmYl9yZWdfc2V0KFAzZDQsIDB4QjAsIDB4ODApOyAvKiBERFJJSSBEdWFsIGZyZXF1ZW5jeSBtb2RlICovCiAJCVhHSU5ld19ERFIyX0RlZmF1bHRSZWdpc3RlcihId0RldmljZUV4dGVuc2lvbiwgUDNkNCwgcFZCSW5mbyk7CiAJfQotCXhnaWZiX3JlZ19zZXQoUDNjNCwgMHgxQiwgcFZCSW5mby0+U1IxNVszXVtYR0lOZXdfUkFNVHlwZV0pOyAvKiBTUjFCICovCisJeGdpZmJfcmVnX3NldChQM2M0LAorCQkgICAgICAweDFCLAorCQkgICAgICBwVkJJbmZvLT5TUjE1WzNdW3BWQkluZm8tPnJhbV90eXBlXSk7IC8qIFNSMUIgKi8KIH0KIAogc3RhdGljIHZvaWQgWEdJTmV3X1NldERSQU1TaXppbmdUeXBlKGludCBpbmRleCwKLQkJdW5zaWduZWQgc2hvcnQgRFJBTVRZUEVfVEFCTEVbXVs1XSwKKwkJY29uc3QgdW5zaWduZWQgc2hvcnQgRFJBTVRZUEVfVEFCTEVbXVs1XSwKIAkJc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewogCXVuc2lnbmVkIHNob3J0IGRhdGE7CkBAIC01ODYsMTQgKzYwMSwxNCBAQAogfQogCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgWEdJTmV3X1NldERSQU1TaXplUmVnKGludCBpbmRleCwKLQkJdW5zaWduZWQgc2hvcnQgRFJBTVRZUEVfVEFCTEVbXVs1XSwKKwkJY29uc3QgdW5zaWduZWQgc2hvcnQgRFJBTVRZUEVfVEFCTEVbXVs1XSwKIAkJc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewogCXVuc2lnbmVkIHNob3J0IGRhdGEgPSAwLCBtZW1zaXplID0gMDsKIAlpbnQgUmFua1NpemU7CiAJdW5zaWduZWQgY2hhciBDaGFubmVsTm87CiAKLQlSYW5rU2l6ZSA9IERSQU1UWVBFX1RBQkxFW2luZGV4XVszXSAqIFhHSU5ld19EYXRhQnVzV2lkdGggLyAzMjsKKwlSYW5rU2l6ZSA9IERSQU1UWVBFX1RBQkxFW2luZGV4XVszXSAqIHBWQkluZm8tPnJhbV9idXMgLyAzMjsKIAlkYXRhID0geGdpZmJfcmVnX2dldChwVkJJbmZvLT5QM2M0LCAweDEzKTsKIAlkYXRhICY9IDB4ODA7CiAKQEAgLTYwMiwxMCArNjE3LDEwIEBACiAKIAlkYXRhID0gMDsKIAotCWlmIChYR0lOZXdfQ2hhbm5lbEFCID09IDMpCisJaWYgKHBWQkluZm8tPnJhbV9jaGFubmVsID09IDMpCiAJCUNoYW5uZWxObyA9IDQ7CiAJZWxzZQotCQlDaGFubmVsTm8gPSBYR0lOZXdfQ2hhbm5lbEFCOworCQlDaGFubmVsTm8gPSBwVkJJbmZvLT5yYW1fY2hhbm5lbDsKIAogCWlmIChDaGFubmVsTm8gKiBSYW5rU2l6ZSA8PSAyNTYpIHsKIAkJd2hpbGUgKChSYW5rU2l6ZSA+Pj0gMSkgPiAwKQpAQCAtNjE5LDggKzYzNCw4IEBACiAJCQkgICAgICAoeGdpZmJfcmVnX2dldChwVkJJbmZvLT5QM2M0LCAweDE0KSAmIDB4MEYpIHwKIAkJCSAgICAgICAoZGF0YSAmIDB4RjApKTsKIAotCQkvKiBkYXRhIHw9IFhHSU5ld19DaGFubmVsQUIgPDwgMjsgKi8KLQkJLyogZGF0YSB8PSAoWEdJTmV3X0RhdGFCdXNXaWR0aCAvIDY0KSA8PCAxOyAqLworCQkvKiBkYXRhIHw9IHBWQkluZm8tPnJhbV9jaGFubmVsIDw8IDI7ICovCisJCS8qIGRhdGEgfD0gKHBWQkluZm8tPnJhbV9idXMgLyA2NCkgPDwgMTsgKi8KIAkJLyogeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LCAweDE0LCBkYXRhKTsgKi8KIAogCQkvKiBzaG91bGQgZGVsYXkgKi8KQEAgLTYzMCwxNCArNjQ1LDE0IEBACiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBYR0lOZXdfU2V0RFJBTVNpemUyMFJlZyhpbnQgaW5kZXgsCi0JCXVuc2lnbmVkIHNob3J0IERSQU1UWVBFX1RBQkxFW11bNV0sCisJCWNvbnN0IHVuc2lnbmVkIHNob3J0IERSQU1UWVBFX1RBQkxFW11bNV0sCiAJCXN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKIAl1bnNpZ25lZCBzaG9ydCBkYXRhID0gMCwgbWVtc2l6ZSA9IDA7CiAJaW50IFJhbmtTaXplOwogCXVuc2lnbmVkIGNoYXIgQ2hhbm5lbE5vOwogCi0JUmFua1NpemUgPSBEUkFNVFlQRV9UQUJMRVtpbmRleF1bM10gKiBYR0lOZXdfRGF0YUJ1c1dpZHRoIC8gODsKKwlSYW5rU2l6ZSA9IERSQU1UWVBFX1RBQkxFW2luZGV4XVszXSAqIHBWQkluZm8tPnJhbV9idXMgLyA4OwogCWRhdGEgPSB4Z2lmYl9yZWdfZ2V0KHBWQkluZm8tPlAzYzQsIDB4MTMpOwogCWRhdGEgJj0gMHg4MDsKIApAQCAtNjQ2LDEwICs2NjEsMTAgQEAKIAogCWRhdGEgPSAwOwogCi0JaWYgKFhHSU5ld19DaGFubmVsQUIgPT0gMykKKwlpZiAocFZCSW5mby0+cmFtX2NoYW5uZWwgPT0gMykKIAkJQ2hhbm5lbE5vID0gNDsKIAllbHNlCi0JCUNoYW5uZWxObyA9IFhHSU5ld19DaGFubmVsQUI7CisJCUNoYW5uZWxObyA9IHBWQkluZm8tPnJhbV9jaGFubmVsOwogCiAJaWYgKENoYW5uZWxObyAqIFJhbmtTaXplIDw9IDI1NikgewogCQl3aGlsZSAoKFJhbmtTaXplID4+PSAxKSA+IDApCkBAIC02NjQsOCArNjc5LDggQEAKIAkJCQkoZGF0YSAmIDB4RjApKTsKIAkJdWRlbGF5KDE1KTsKIAotCQkvKiBkYXRhIHw9IFhHSU5ld19DaGFubmVsQUIgPDwgMjsgKi8KLQkJLyogZGF0YSB8PSAoWEdJTmV3X0RhdGFCdXNXaWR0aCAvIDY0KSA8PCAxOyAqLworCQkvKiBkYXRhIHw9IHBWQkluZm8tPnJhbV9jaGFubmVsIDw8IDI7ICovCisJCS8qIGRhdGEgfD0gKHBWQkluZm8tPnJhbV9idXMgLyA2NCkgPDwgMTsgKi8KIAkJLyogeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LCAweDE0LCBkYXRhKTsgKi8KIAogCQkvKiBzaG91bGQgZGVsYXkgKi8KQEAgLTY3OSwxMiArNjk0LDEzIEBACiB7CiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBQb3NpdGlvbiA9IDA7CisJdm9pZCBfX2lvbWVtICpmYmFkZHIgPSBwVkJJbmZvLT5GQkFkZHI7CiAKLQkqKCh1bnNpZ25lZCBsb25nICopIChwVkJJbmZvLT5GQkFkZHIgKyBQb3NpdGlvbikpID0gUG9zaXRpb247CisJd3JpdGVsKFBvc2l0aW9uLCBmYmFkZHIgKyBQb3NpdGlvbik7CiAKIAlmb3IgKGkgPSBTdGFydEFkZHI7IGkgPD0gU3RvcEFkZHI7IGkrKykgewogCQlQb3NpdGlvbiA9IDEgPDwgaTsKLQkJKigodW5zaWduZWQgbG9uZyAqKSAocFZCSW5mby0+RkJBZGRyICsgUG9zaXRpb24pKSA9IFBvc2l0aW9uOworCQl3cml0ZWwoUG9zaXRpb24sIGZiYWRkciArIFBvc2l0aW9uKTsKIAl9CiAKIAl1ZGVsYXkoNTAwKTsgLyogW1ZpY2VudF0gMjAwNC8wNC8xNi4KQEAgLTY5MiwxMyArNzA4LDEyIEBACiAKIAlQb3NpdGlvbiA9IDA7CiAKLQlpZiAoKCoodW5zaWduZWQgbG9uZyAqKSAocFZCSW5mby0+RkJBZGRyICsgUG9zaXRpb24pKSAhPSBQb3NpdGlvbikKKwlpZiAocmVhZGwoZmJhZGRyICsgUG9zaXRpb24pICE9IFBvc2l0aW9uKQogCQlyZXR1cm4gMDsKIAogCWZvciAoaSA9IFN0YXJ0QWRkcjsgaSA8PSBTdG9wQWRkcjsgaSsrKSB7CiAJCVBvc2l0aW9uID0gMSA8PCBpOwotCQlpZiAoKCoodW5zaWduZWQgbG9uZyAqKSAocFZCSW5mby0+RkJBZGRyICsgUG9zaXRpb24pKSAhPQotCQkgICAgUG9zaXRpb24pCisJCWlmIChyZWFkbChmYmFkZHIgKyBQb3NpdGlvbikgIT0gUG9zaXRpb24pCiAJCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIDE7CkBAIC03MjksMTQgKzc0NCwxNCBAQAogCWNhc2UgWEcyMToKIAkJZGF0YSA9IHhnaWZiX3JlZ19nZXQocFZCSW5mby0+UDNkNCwgMHg5Nyk7CiAJCWRhdGEgPSBkYXRhICYgMHgwMTsKLQkJWEdJTmV3X0NoYW5uZWxBQiA9IDE7IC8qIFhHMjAgIkpVU1QiIG9uZSBjaGFubmVsICovCisJCXBWQkluZm8tPnJhbV9jaGFubmVsID0gMTsgLyogWEcyMCAiSlVTVCIgb25lIGNoYW5uZWwgKi8KIAogCQlpZiAoZGF0YSA9PSAwKSB7IC8qIFNpbmdsZV8zMl8xNiAqLwogCiAJCQlpZiAoKEh3RGV2aWNlRXh0ZW5zaW9uLT51bFZpZGVvTWVtb3J5U2l6ZSAtIDEpCiAJCQkJCT4gMHgxMDAwMDAwKSB7CiAKLQkJCQlYR0lOZXdfRGF0YUJ1c1dpZHRoID0gMzI7IC8qIDMyIGJpdHMgKi8KKwkJCQlwVkJJbmZvLT5yYW1fYnVzID0gMzI7IC8qIDMyIGJpdHMgKi8KIAkJCQkvKiAyMmJpdCArIDIgcmFuayArIDMyYml0ICovCiAJCQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LCAweDEzLCAweEIxKTsKIAkJCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsIDB4MTQsIDB4NTIpOwpAQCAtNzY1LDcgKzc4MCw3IEBACiAKIAkJCWlmICgoSHdEZXZpY2VFeHRlbnNpb24tPnVsVmlkZW9NZW1vcnlTaXplIC0gMSkgPgogCQkJICAgIDB4ODAwMDAwKSB7Ci0JCQkJWEdJTmV3X0RhdGFCdXNXaWR0aCA9IDE2OyAvKiAxNiBiaXRzICovCisJCQkJcFZCSW5mby0+cmFtX2J1cyA9IDE2OyAvKiAxNiBiaXRzICovCiAJCQkJLyogMjJiaXQgKyAyIHJhbmsgKyAxNmJpdCAqLwogCQkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNjNCwgMHgxMywgMHhCMSk7CiAJCQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LCAweDE0LCAweDQxKTsKQEAgLTc4Myw3ICs3OTgsNyBAQAogCQl9IGVsc2UgeyAvKiBEdWFsXzE2XzggKi8KIAkJCWlmICgoSHdEZXZpY2VFeHRlbnNpb24tPnVsVmlkZW9NZW1vcnlTaXplIC0gMSkgPgogCQkJICAgIDB4ODAwMDAwKSB7Ci0JCQkJWEdJTmV3X0RhdGFCdXNXaWR0aCA9IDE2OyAvKiAxNiBiaXRzICovCisJCQkJcFZCSW5mby0+cmFtX2J1cyA9IDE2OyAvKiAxNiBiaXRzICovCiAJCQkJLyogKDB4MzE6MTJ4OHgyKSAyMmJpdCArIDIgcmFuayAqLwogCQkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNjNCwgMHgxMywgMHhCMSk7CiAJCQkJLyogMHg0MToxNk14MTYgYml0Ki8KQEAgLTgxNCw3ICs4MjksNyBAQAogCiAJCQlpZiAoKEh3RGV2aWNlRXh0ZW5zaW9uLT51bFZpZGVvTWVtb3J5U2l6ZSAtIDEpID4KIAkJCSAgICAweDQwMDAwMCkgewotCQkJCVhHSU5ld19EYXRhQnVzV2lkdGggPSA4OyAvKiA4IGJpdHMgKi8KKwkJCQlwVkJJbmZvLT5yYW1fYnVzID0gODsgLyogOCBiaXRzICovCiAJCQkJLyogKDB4MzE6MTJ4OHgyKSAyMmJpdCArIDIgcmFuayAqLwogCQkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNjNCwgMHgxMywgMHhCMSk7CiAJCQkJLyogMHgzMDo4TXg4IGJpdCovCkBAIC04MzMsMjEgKzg0OCwyMSBAQAogCQlicmVhazsKIAogCWNhc2UgWEcyNzoKLQkJWEdJTmV3X0RhdGFCdXNXaWR0aCA9IDE2OyAvKiAxNiBiaXRzICovCi0JCVhHSU5ld19DaGFubmVsQUIgPSAxOyAvKiBTaW5nbGUgY2hhbm5lbCAqLworCQlwVkJJbmZvLT5yYW1fYnVzID0gMTY7IC8qIDE2IGJpdHMgKi8KKwkJcFZCSW5mby0+cmFtX2NoYW5uZWwgPSAxOyAvKiBTaW5nbGUgY2hhbm5lbCAqLwogCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsIDB4MTQsIDB4NTEpOyAvKiAzMk14MTYgYml0Ki8KIAkJYnJlYWs7CiAJY2FzZSBYRzQxOgogCQlpZiAoWEdJTmV3X0NoZWNrRnJlcXVlbmNlKHBWQkluZm8pID09IDEpIHsKLQkJCVhHSU5ld19EYXRhQnVzV2lkdGggPSAzMjsgLyogMzIgYml0cyAqLwotCQkJWEdJTmV3X0NoYW5uZWxBQiA9IDM7IC8qIFF1YWQgQ2hhbm5lbCAqLworCQkJcFZCSW5mby0+cmFtX2J1cyA9IDMyOyAvKiAzMiBiaXRzICovCisJCQlwVkJJbmZvLT5yYW1fY2hhbm5lbCA9IDM7IC8qIFF1YWQgQ2hhbm5lbCAqLwogCQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LCAweDEzLCAweEExKTsKIAkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNjNCwgMHgxNCwgMHg0Qyk7CiAKIAkJCWlmIChYR0lOZXdfUmVhZFdyaXRlUmVzdCgyNSwgMjMsIHBWQkluZm8pID09IDEpCiAJCQkJcmV0dXJuOwogCi0JCQlYR0lOZXdfQ2hhbm5lbEFCID0gMjsgLyogRHVhbCBjaGFubmVscyAqLworCQkJcFZCSW5mby0+cmFtX2NoYW5uZWwgPSAyOyAvKiBEdWFsIGNoYW5uZWxzICovCiAJCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsIDB4MTQsIDB4NDgpOwogCiAJCQlpZiAoWEdJTmV3X1JlYWRXcml0ZVJlc3QoMjQsIDIzLCBwVkJJbmZvKSA9PSAxKQpAQCAtODU4LDcgKzg3Myw3IEBACiAJCQlpZiAoWEdJTmV3X1JlYWRXcml0ZVJlc3QoMjQsIDIzLCBwVkJJbmZvKSA9PSAxKQogCQkJCXJldHVybjsKIAotCQkJWEdJTmV3X0NoYW5uZWxBQiA9IDM7CisJCQlwVkJJbmZvLT5yYW1fY2hhbm5lbCA9IDM7CiAJCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsIDB4MTMsIDB4MjEpOwogCQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LCAweDE0LCAweDNDKTsKIApAQCAtODcyLDE1ICs4ODcsMTUgQEAKIAkJCWVsc2UKIAkJCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsIDB4MTQsIDB4MzkpOwogCQl9IGVsc2UgeyAvKiBERFIgKi8KLQkJCVhHSU5ld19EYXRhQnVzV2lkdGggPSA2NDsgLyogNjQgYml0cyAqLwotCQkJWEdJTmV3X0NoYW5uZWxBQiA9IDI7IC8qIER1YWwgY2hhbm5lbHMgKi8KKwkJCXBWQkluZm8tPnJhbV9idXMgPSA2NDsgLyogNjQgYml0cyAqLworCQkJcFZCSW5mby0+cmFtX2NoYW5uZWwgPSAyOyAvKiBEdWFsIGNoYW5uZWxzICovCiAJCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsIDB4MTMsIDB4QTEpOwogCQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LCAweDE0LCAweDVBKTsKIAogCQkJaWYgKFhHSU5ld19SZWFkV3JpdGVSZXN0KDI1LCAyNCwgcFZCSW5mbykgPT0gMSkKIAkJCQlyZXR1cm47CiAKLQkJCVhHSU5ld19DaGFubmVsQUIgPSAxOyAvKiBTaW5nbGUgY2hhbm5lbHMgKi8KKwkJCXBWQkluZm8tPnJhbV9jaGFubmVsID0gMTsgLyogU2luZ2xlIGNoYW5uZWxzICovCiAJCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsIDB4MTQsIDB4NTIpOwogCiAJCQlpZiAoWEdJTmV3X1JlYWRXcml0ZVJlc3QoMjQsIDIzLCBwVkJJbmZvKSA9PSAxKQpAQCAtODkxLDE0ICs5MDYsMTQgQEAKIAkJCWlmIChYR0lOZXdfUmVhZFdyaXRlUmVzdCgyNCwgMjMsIHBWQkluZm8pID09IDEpCiAJCQkJcmV0dXJuOwogCi0JCQlYR0lOZXdfQ2hhbm5lbEFCID0gMjsgLyogRHVhbCBjaGFubmVscyAqLworCQkJcFZCSW5mby0+cmFtX2NoYW5uZWwgPSAyOyAvKiBEdWFsIGNoYW5uZWxzICovCiAJCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsIDB4MTMsIDB4MjEpOwogCQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LCAweDE0LCAweDRBKTsKIAogCQkJaWYgKFhHSU5ld19SZWFkV3JpdGVSZXN0KDI0LCAyMywgcFZCSW5mbykgPT0gMSkKIAkJCQlyZXR1cm47CiAKLQkJCVhHSU5ld19DaGFubmVsQUIgPSAxOyAvKiBTaW5nbGUgY2hhbm5lbHMgKi8KKwkJCXBWQkluZm8tPnJhbV9jaGFubmVsID0gMTsgLyogU2luZ2xlIGNoYW5uZWxzICovCiAJCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsIDB4MTQsIDB4NDIpOwogCiAJCQlpZiAoWEdJTmV3X1JlYWRXcml0ZVJlc3QoOCwgNCwgcFZCSW5mbykgPT0gMSkKQEAgLTkxOCw4ICs5MzMsOCBAQAogCQkgSXQncyBEaWZmZXJlbnQgZnJvbSBPdGhlciBYRzQwIFNlcmllcy4KIAkJICovCiAJCWlmIChYR0lOZXdfQ2hlY2tGcmVxdWVuY2UocFZCSW5mbykgPT0gMSkgeyAvKiBERFJJSSwgRERSMnggKi8KLQkJCVhHSU5ld19EYXRhQnVzV2lkdGggPSAzMjsgLyogMzIgYml0cyAqLwotCQkJWEdJTmV3X0NoYW5uZWxBQiA9IDI7IC8qIDIgQ2hhbm5lbCAqLworCQkJcFZCSW5mby0+cmFtX2J1cyA9IDMyOyAvKiAzMiBiaXRzICovCisJCQlwVkJJbmZvLT5yYW1fY2hhbm5lbCA9IDI7IC8qIDIgQ2hhbm5lbCAqLwogCQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LCAweDEzLCAweEExKTsKIAkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNjNCwgMHgxNCwgMHg0NCk7CiAKQEAgLTkzMSw3ICs5NDYsNyBAQAogCQkJaWYgKFhHSU5ld19SZWFkV3JpdGVSZXN0KDIzLCAyMiwgcFZCSW5mbykgPT0gMSkKIAkJCQlyZXR1cm47CiAKLQkJCVhHSU5ld19DaGFubmVsQUIgPSAxOyAvKiBTaW5nbGUgQ2hhbm5lbCAqLworCQkJcFZCSW5mby0+cmFtX2NoYW5uZWwgPSAxOyAvKiBTaW5nbGUgQ2hhbm5lbCAqLwogCQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LCAweDEzLCAweEExKTsKIAkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNjNCwgMHgxNCwgMHg0MCk7CiAKQEAgLTk0Miw4ICs5NTcsOCBAQAogCQkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNjNCwgMHgxNCwgMHgzMCk7CiAJCQl9CiAJCX0gZWxzZSB7IC8qIEREUiAqLwotCQkJWEdJTmV3X0RhdGFCdXNXaWR0aCA9IDY0OyAvKiA2NCBiaXRzICovCi0JCQlYR0lOZXdfQ2hhbm5lbEFCID0gMTsgLyogMSBjaGFubmVscyAqLworCQkJcFZCSW5mby0+cmFtX2J1cyA9IDY0OyAvKiA2NCBiaXRzICovCisJCQlwVkJJbmZvLT5yYW1fY2hhbm5lbCA9IDE7IC8qIDEgY2hhbm5lbHMgKi8KIAkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNjNCwgMHgxMywgMHhBMSk7CiAJCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsIDB4MTQsIDB4NTIpOwogCkBAIC05NjAsMTUgKzk3NSwxNSBAQAogCWRlZmF1bHQ6IC8qIFhHNDAgKi8KIAogCQlpZiAoWEdJTmV3X0NoZWNrRnJlcXVlbmNlKHBWQkluZm8pID09IDEpIHsgLyogRERSSUkgKi8KLQkJCVhHSU5ld19EYXRhQnVzV2lkdGggPSAzMjsgLyogMzIgYml0cyAqLwotCQkJWEdJTmV3X0NoYW5uZWxBQiA9IDM7CisJCQlwVkJJbmZvLT5yYW1fYnVzID0gMzI7IC8qIDMyIGJpdHMgKi8KKwkJCXBWQkluZm8tPnJhbV9jaGFubmVsID0gMzsKIAkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNjNCwgMHgxMywgMHhBMSk7CiAJCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsIDB4MTQsIDB4NEMpOwogCiAJCQlpZiAoWEdJTmV3X1JlYWRXcml0ZVJlc3QoMjUsIDIzLCBwVkJJbmZvKSA9PSAxKQogCQkJCXJldHVybjsKIAotCQkJWEdJTmV3X0NoYW5uZWxBQiA9IDI7IC8qIDIgY2hhbm5lbHMgKi8KKwkJCXBWQkluZm8tPnJhbV9jaGFubmVsID0gMjsgLyogMiBjaGFubmVscyAqLwogCQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LCAweDE0LCAweDQ4KTsKIAogCQkJaWYgKFhHSU5ld19SZWFkV3JpdGVSZXN0KDI0LCAyMywgcFZCSW5mbykgPT0gMSkKQEAgLTk3OCwxNCArOTkzLDE0IEBACiAJCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsIDB4MTQsIDB4M0MpOwogCiAJCQlpZiAoWEdJTmV3X1JlYWRXcml0ZVJlc3QoMjQsIDIzLCBwVkJJbmZvKSA9PSAxKSB7Ci0JCQkJWEdJTmV3X0NoYW5uZWxBQiA9IDM7IC8qIDQgY2hhbm5lbHMgKi8KKwkJCQlwVkJJbmZvLT5yYW1fY2hhbm5lbCA9IDM7IC8qIDQgY2hhbm5lbHMgKi8KIAkJCX0gZWxzZSB7Ci0JCQkJWEdJTmV3X0NoYW5uZWxBQiA9IDI7IC8qIDIgY2hhbm5lbHMgKi8KKwkJCQlwVkJJbmZvLT5yYW1fY2hhbm5lbCA9IDI7IC8qIDIgY2hhbm5lbHMgKi8KIAkJCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsIDB4MTQsIDB4MzgpOwogCQkJfQogCQl9IGVsc2UgeyAvKiBERFIgKi8KLQkJCVhHSU5ld19EYXRhQnVzV2lkdGggPSA2NDsgLyogNjQgYml0cyAqLwotCQkJWEdJTmV3X0NoYW5uZWxBQiA9IDI7IC8qIDIgY2hhbm5lbHMgKi8KKwkJCXBWQkluZm8tPnJhbV9idXMgPSA2NDsgLyogNjQgYml0cyAqLworCQkJcFZCSW5mby0+cmFtX2NoYW5uZWwgPSAyOyAvKiAyIGNoYW5uZWxzICovCiAJCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsIDB4MTMsIDB4QTEpOwogCQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LCAweDE0LCAweDVBKTsKIApAQCAtMTAyMSw3ICsxMDM2LDcgQEAKIAkJCWlmIChtZW1zaXplID09IDApCiAJCQkJY29udGludWU7CiAKLQkJCWFkZHIgPSBtZW1zaXplICsgKFhHSU5ld19DaGFubmVsQUIgLSAyKSArIDIwOworCQkJYWRkciA9IG1lbXNpemUgKyAocFZCSW5mby0+cmFtX2NoYW5uZWwgLSAyKSArIDIwOwogCQkJaWYgKChId0RldmljZUV4dGVuc2lvbi0+dWxWaWRlb01lbW9yeVNpemUgLSAxKSA8CiAJCQkgICAgKHVuc2lnbmVkIGxvbmcpICgxIDw8IGFkZHIpKQogCQkJCWNvbnRpbnVlOwpAQCAtMTA0MSw3ICsxMDU2LDcgQEAKIAkJCWlmIChtZW1zaXplID09IDApCiAJCQkJY29udGludWU7CiAKLQkJCWFkZHIgPSBtZW1zaXplICsgKFhHSU5ld19DaGFubmVsQUIgLSAyKSArIDIwOworCQkJYWRkciA9IG1lbXNpemUgKyAocFZCSW5mby0+cmFtX2NoYW5uZWwgLSAyKSArIDIwOwogCQkJaWYgKChId0RldmljZUV4dGVuc2lvbi0+dWxWaWRlb01lbW9yeVNpemUgLSAxKSA8CiAJCQkgICAgKHVuc2lnbmVkIGxvbmcpICgxIDw8IGFkZHIpKQogCQkJCWNvbnRpbnVlOwpAQCAtMTQyOCw4ICsxNDQzLDEwIEBACiAJcmV0dXJuIHRlbXA7CiB9CiAKLXVuc2lnbmVkIGNoYXIgWEdJSW5pdE5ldyhzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbikKK3Vuc2lnbmVkIGNoYXIgWEdJSW5pdE5ldyhzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKKwlzdHJ1Y3QgeGdpZmJfdmlkZW9faW5mbyAqeGdpZmJfaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiA9ICZ4Z2lmYl9pbmZvLT5od19pbmZvOwogCXN0cnVjdCB2Yl9kZXZpY2VfaW5mbyBWQklORjsKIAlzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8gPSAmVkJJTkY7CiAJdW5zaWduZWQgY2hhciBpLCB0ZW1wID0gMCwgdGVtcDE7CkBAIC0xNDM4LDggKzE0NTUsNiBAQAogCiAJLyogdW5zaWduZWQgbG9uZyBqLCBrOyAqLwogCi0JdW5zaWduZWQgbG9uZyBUZW1wOwotCiAJcFZCSW5mby0+Uk9NQWRkciA9IEh3RGV2aWNlRXh0ZW5zaW9uLT5walZpcnR1YWxSb21CYXNlOwogCiAJcFZCSW5mby0+RkJBZGRyID0gSHdEZXZpY2VFeHRlbnNpb24tPnBqVmlkZW9NZW1vcnlBZGRyZXNzOwpAQCAtMTU1MSw4ICsxNTY2LDcgQEAKIAogCS8qIDMuU2V0TWVtb3J5Q2xvY2sKIAotCSBYR0lOZXdfUkFNVHlwZSA9IChpbnQpWEdJTmV3X0dldFhHMjBEUkFNVHlwZShId0RldmljZUV4dGVuc2lvbiwKLQkJCQkJCSAgICAgIHBWQkluZm8pOworCXBWQkluZm8tPnJhbV90eXBlID0gWEdJTmV3X0dldFhHMjBEUkFNVHlwZShId0RldmljZUV4dGVuc2lvbiwgcFZCSW5mbyk7CiAJKi8KIAogCXByaW50aygiMTEiKTsKQEAgLTE1NzksNiArMTU5Myw4IEBACiAJcHJpbnRrKCIxMiIpOwogCiAJaWYgKEh3RGV2aWNlRXh0ZW5zaW9uLT5qQ2hpcFR5cGUgPCBYRzIwKSB7IC8qIGt1a3UgMjAwNC8wNi8yNSAqLworCQl1MzIgVGVtcDsKKwogCQkvKiBTZXQgQUdQIFJhdGUgKi8KIAkJLyoKIAkJdGVtcDEgPSB4Z2lmYl9yZWdfZ2V0KHBWQkluZm8tPlAzYzQsIDB4M0IpOwpAQCAtMTY0NSwxMCArMTY2MSw3IEBACiAJCS8qICAgICAgICBpZiAoQ2hpcHNldElEID09IDB4MjUzMDgwODYpICovCiAJCS8qICAgICAgICAgICAgeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2Q0LCAweDc3LCAweEYwKTsgKi8KIAotCQlId0RldmljZUV4dGVuc2lvbi0+cFF1ZXJ5VkdBQ29uZmlnU3BhY2UoSHdEZXZpY2VFeHRlbnNpb24sCi0JCQkJCQkJMHg1MCwKLQkJCQkJCQkwLAotCQkJCQkJCSZUZW1wKTsgLyogR2V0ICovCisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDUwLCAmVGVtcCk7CiAJCVRlbXAgPj49IDIwOwogCQlUZW1wICY9IDB4RjsKIApAQCAtMTczMiwxNSArMTc0NSw2IEBACiAKIAlwcmludGsoIjE4MyIpOwogCS8qIFhHSU5ld19EZXRlY3RNb25pdG9yKEh3RGV2aWNlRXh0ZW5zaW9uKTsgKi8KLQlwVkJJbmZvLT5JRl9ERUZfQ0g3MDA3ID0gMDsKLQlpZiAoKEh3RGV2aWNlRXh0ZW5zaW9uLT5qQ2hpcFR5cGUgPT0gWEcyMSkgJiYKLQkgICAgKHBWQkluZm8tPklGX0RFRl9DSDcwMDcpKSB7Ci0JCXByaW50aygiMTg0Iik7Ci0JCS8qIHNlbnNlIENSVDIgKi8KLQkJWEdJX0dldFNlbnNlU3RhdHVzKEh3RGV2aWNlRXh0ZW5zaW9uLCBwVkJJbmZvKTsKLQkJcHJpbnRrKCIxODUiKTsKLQotCX0KIAlpZiAoSHdEZXZpY2VFeHRlbnNpb24tPmpDaGlwVHlwZSA9PSBYRzIxKSB7CiAJCXByaW50aygiMTg2Iik7CiAKQEAgLTE3NjMsOCArMTc2Nyw3IEBACiAJfQogCXByaW50aygiMTkiKTsKIAotCVhHSU5ld19SQU1UeXBlID0gKGludCkgWEdJTmV3X0dldFhHMjBEUkFNVHlwZShId0RldmljZUV4dGVuc2lvbiwKLQkJCQkJCSAgICAgIHBWQkluZm8pOworCXBWQkluZm8tPnJhbV90eXBlID0gWEdJTmV3X0dldFhHMjBEUkFNVHlwZShId0RldmljZUV4dGVuc2lvbiwgcFZCSW5mbyk7CiAKIAlYR0lOZXdfU2V0RFJBTURlZmF1bHRSZWdpc3RlcjM0MChId0RldmljZUV4dGVuc2lvbiwKIAkJCQkJIHBWQkluZm8tPlAzZDQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfaW5pdC5oIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX2luaXQuaAppbmRleCA2Yjc3MjMwLi5hMjdiNGZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfaW5pdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9pbml0LmgKQEAgLTEsNiArMSw2IEBACiAjaWZuZGVmIF9WQklOSVRfCiAjZGVmaW5lIF9WQklOSVRfCi1leHRlcm4gdW5zaWduZWQgY2hhciBYR0lJbml0TmV3KHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uKTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIFhHSUluaXROZXcoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwogZXh0ZXJuIHN0cnVjdCBYR0kyMV9MVkRTQ2FwU3RydWN0ICBYR0kyMV9MQ0RDYXBMaXN0WzEzXTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfc2V0bW9kZS5jIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX3NldG1vZGUuYwppbmRleCBkYzRkNmU2Li44MWMwY2M0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfc2V0bW9kZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9zZXRtb2RlLmMKQEAgLTgsMTcgKzgsMTUgQEAKICNpbmNsdWRlICJ2Yl9kZWYuaCIKICNpbmNsdWRlICJ2Z2F0eXBlcy5oIgogI2luY2x1ZGUgInZiX3N0cnVjdC5oIgorI2luY2x1ZGUgInZiX2luaXQuaCIKICNpbmNsdWRlICJ2Yl91dGlsLmgiCiAjaW5jbHVkZSAidmJfdGFibGUuaCIKICNpbmNsdWRlICJ2Yl9zZXRtb2RlLmgiCiAKIAogI2RlZmluZSAgSW5kZXhNYXNrIDB4ZmYKLSNpZm5kZWYgWEdJX01BU0tfRFVBTF9DSElQCi0jZGVmaW5lIFhHSV9NQVNLX0RVQUxfQ0hJUAkgIDB4MDQgIC8qIFNSM0EgKi8KLSNlbmRpZgogCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgWEdJTmV3X01EQV9EQUNbXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBYR0lOZXdfTURBX0RBQ1tdID0gewogCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCiAJMHgxNSwgMHgxNSwgMHgxNSwgMHgxNSwgMHgxNSwgMHgxNSwgMHgxNSwgMHgxNSwKIAkweDE1LCAweDE1LCAweDE1LCAweDE1LCAweDE1LCAweDE1LCAweDE1LCAweDE1LApAQCAtMjgsNyArMjYsNyBAQAogCTB4MTUsIDB4MTUsIDB4MTUsIDB4MTUsIDB4MTUsIDB4MTUsIDB4MTUsIDB4MTUsCiAJMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRiwgMHgzRn07CiAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBYR0lOZXdfQ0dBX0RBQ1tdID0geworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IFhHSU5ld19DR0FfREFDW10gPSB7CiAJMHgwMCwgMHgxMCwgMHgwNCwgMHgxNCwgMHgwMSwgMHgxMSwgMHgwOSwgMHgxNSwKIAkweDAwLCAweDEwLCAweDA0LCAweDE0LCAweDAxLCAweDExLCAweDA5LCAweDE1LAogCTB4MkEsIDB4M0EsIDB4MkUsIDB4M0UsIDB4MkIsIDB4M0IsIDB4MkYsIDB4M0YsCkBAIC0zOCw3ICszNiw3IEBACiAJMHgyQSwgMHgzQSwgMHgyRSwgMHgzRSwgMHgyQiwgMHgzQiwgMHgyRiwgMHgzRiwKIAkweDJBLCAweDNBLCAweDJFLCAweDNFLCAweDJCLCAweDNCLCAweDJGLCAweDNGfTsKIAotc3RhdGljIHVuc2lnbmVkIHNob3J0IFhHSU5ld19FR0FfREFDW10gPSB7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgWEdJTmV3X0VHQV9EQUNbXSA9IHsKIAkweDAwLCAweDEwLCAweDA0LCAweDE0LCAweDAxLCAweDExLCAweDA1LCAweDE1LAogCTB4MjAsIDB4MzAsIDB4MjQsIDB4MzQsIDB4MjEsIDB4MzEsIDB4MjUsIDB4MzUsCiAJMHgwOCwgMHgxOCwgMHgwQywgMHgxQywgMHgwOSwgMHgxOSwgMHgwRCwgMHgxRCwKQEAgLTQ4LDcgKzQ2LDcgQEAKIAkweDBBLCAweDFBLCAweDBFLCAweDFFLCAweDBCLCAweDFCLCAweDBGLCAweDFGLAogCTB4MkEsIDB4M0EsIDB4MkUsIDB4M0UsIDB4MkIsIDB4M0IsIDB4MkYsIDB4M0Z9OwogCi1zdGF0aWMgdW5zaWduZWQgc2hvcnQgWEdJTmV3X1ZHQV9EQUNbXSA9IHsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBYR0lOZXdfVkdBX0RBQ1tdID0gewogCTB4MDAsIDB4MTAsIDB4MDQsIDB4MTQsIDB4MDEsIDB4MTEsIDB4MDksIDB4MTUsCiAJMHgyQSwgMHgzQSwgMHgyRSwgMHgzRSwgMHgyQiwgMHgzQiwgMHgyRiwgMHgzRiwKIAkweDAwLCAweDA1LCAweDA4LCAweDBCLCAweDBFLCAweDExLCAweDE0LCAweDE4LApAQCAtMTQ0LDExICsxNDIsNiBAQAogCXBWQkluZm8tPlRpbWluZ1YgPSAoc3RydWN0IFhHSV9UaW1pbmdWU3RydWN0ICopIFhHSV9UaW1pbmdWOwogCXBWQkluZm8tPlVwZGF0ZUNSVDEgPSAoc3RydWN0IFhHSV9YRzIxQ1JUMVN0cnVjdCAqKSBYR0lfVXBkYXRlQ1JUMVRhYmxlOwogCi0JcFZCSW5mby0+Q0hUVlZDTEtVTlRTQyA9IFhHSTMzMF9DSFRWVkNMS1VOVFNDOwotCXBWQkluZm8tPkNIVFZWQ0xLT05UU0MgPSBYR0kzMzBfQ0hUVlZDTEtPTlRTQzsKLQlwVkJJbmZvLT5DSFRWVkNMS1VQQUwgPSBYR0kzMzBfQ0hUVlZDTEtVUEFMOwotCXBWQkluZm8tPkNIVFZWQ0xLT1BBTCA9IFhHSTMzMF9DSFRWVkNMS09QQUw7Ci0KIAkvKiAzMTAgY3VzdG9taXphdGlvbiByZWxhdGVkICovCiAJaWYgKChwVkJJbmZvLT5WQlR5cGUgJiBWQl9YR0kzMDFMVikgfHwgKHBWQkluZm8tPlZCVHlwZSAmIFZCX1hHSTMwMkxWKSkKIAkJcFZCSW5mby0+TENEQ2FwTGlzdCA9IFhHSV9MQ0RETENhcExpc3Q7CkBAIC0yMDcsMTkgKzIwMCw2IEBACiAJcmV0dXJuIGluZGV4OyAvKiBHZXQgcFZCSW5mby0+U3RhbmRUYWJsZSBpbmRleCAqLwogfQogCi0vKgotdW5zaWduZWQgY2hhciBYR0lfU2V0QklPU0RhdGEodW5zaWduZWQgc2hvcnQgTW9kZU5vLAotCQkJICAgICAgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpIHsKLQlyZXR1cm4gKDApOwotfQotKi8KLQotLyogdW5zaWduZWQgY2hhciBYR0lfQ2xlYXJCYW5rUmVncyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCi0JCQkJICAgdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgpIHsKLQlyZXR1cm4oIDAgKSA7Ci19Ci0qLwotCiBzdGF0aWMgdm9pZCBYR0lfU2V0U2VxUmVncyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCiAJCQkgICB1bnNpZ25lZCBzaG9ydCBTdGFuZFRhYmxlSW5kZXgsCiAJCQkgICB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKQEAgLTQ5MCwxMSArNDcwLDYgQEAKIAkJCX0KIAkJfQogCX0gZWxzZSB7IC8qIGZvciBMVkRTICovCi0JCWlmIChwVkJJbmZvLT5JRl9ERUZfQ0g3MDA1ID09IDEpIHsKLQkJCWlmIChwVkJJbmZvLT5WQkluZm8gJiBTZXRDUlQyVG9UVikKLQkJCQl0ZW1wYXggfD0gU3VwcG9ydENIVFY7Ci0JCX0KLQogCQlpZiAocFZCSW5mby0+VkJJbmZvICYgU2V0Q1JUMlRvTENEKSB7CiAJCQl0ZW1wYXggfD0gU3VwcG9ydExDRDsKIApAQCAtMTAwMSwxNCArOTc2LDEwIEBACiAJfQogfQogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qIEZ1bmN0aW9uIDogWEdJX1NldFhHMjFMQ0QgKi8KLS8qIElucHV0IDogKi8KLS8qIE91dHB1dCA6IEZDTEsgZHV0eSBjeWNsZSwgRkNMSyBkZWxheSBjb21wZW5zYXRpb24gKi8KLS8qIERlc2NyaXB0aW9uIDogQWxsIHZhbHVlcyBzZXQgemVybyAqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1zdGF0aWMgdm9pZCBYR0lfU2V0WEcyMUxDRChzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8sCi0JCXVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCwgdW5zaWduZWQgc2hvcnQgTW9kZU5vKQorc3RhdGljIHZvaWQgeGdpZmJfc2V0X2xjZChpbnQgY2hpcF9pZCwKKwkJCSAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvLAorCQkJICB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCisJCQkgIHVuc2lnbmVkIHNob3J0IE1vZGVObykKIHsKIAl1bnNpZ25lZCBzaG9ydCBEYXRhLCBUZW1wLCBiM0NDOwogCXVuc2lnbmVkIHNob3J0IFhHSV9QM2NjOwpAQCAtMTAxOSw2ICs5OTAsMTUgQEAKIAl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzZDQsIDB4MkYsIDB4MDApOwogCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNkNCwgMHg0NiwgMHgwMCk7CiAJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2Q0LCAweDQ3LCAweDAwKTsKKworCWlmIChjaGlwX2lkID09IFhHMjcpIHsKKwkJVGVtcCA9IHhnaWZiX3JlZ19nZXQocFZCSW5mby0+UDNkNCwgMHgzNyk7CisJCWlmICgoVGVtcCAmIDB4MDMpID09IDApIHsgLyogZHVhbCAxMiAqLworCQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2Q0LCAweDQ2LCAweDEzKTsKKwkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNkNCwgMHg0NywgMHgxMyk7CisJCX0KKwl9CisKIAlpZiAoKCgqcFZCSW5mby0+cERWT1NldHRpbmcpICYgMHhDMCkgPT0gMHhDMCkgewogCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzZDQsIDB4MkUsICpwVkJJbmZvLT5wQ1IyRSk7CiAJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNkNCwgMHgyRiwgKnBWQkluZm8tPnBDUjJGKTsKQEAgLTEwMjYsNjUgKzEwMDYsMTYgQEAKIAkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2Q0LCAweDQ3LCAqcFZCSW5mby0+cENSNDcpOwogCX0KIAotCVRlbXAgPSB4Z2lmYl9yZWdfZ2V0KHBWQkluZm8tPlAzZDQsIDB4MzcpOwotCi0JaWYgKFRlbXAgJiAweDAxKSB7Ci0JCXhnaWZiX3JlZ19vcihwVkJJbmZvLT5QM2M0LCAweDA2LCAweDQwKTsgLyogMTggYml0cyBGUCAqLwotCQl4Z2lmYl9yZWdfb3IocFZCSW5mby0+UDNjNCwgMHgwOSwgMHg0MCk7Ci0JfQotCi0JeGdpZmJfcmVnX29yKHBWQkluZm8tPlAzYzQsIDB4MUUsIDB4MDEpOyAvKiBOZWdhdGl2ZSBibGFuayBwb2xhcml0eSAqLwotCi0JeGdpZmJfcmVnX2FuZChwVkJJbmZvLT5QM2M0LCAweDMwLCB+MHgyMCk7Ci0JeGdpZmJfcmVnX2FuZChwVkJJbmZvLT5QM2M0LCAweDM1LCB+MHg4MCk7Ci0KLQlpZiAoTW9kZU5vIDw9IDB4MTMpIHsKLQkJYjNDQyA9ICh1bnNpZ25lZCBjaGFyKSBpbmIoWEdJX1AzY2MpOwotCQlpZiAoYjNDQyAmIDB4NDApCi0JCQkvKiBIc3luYyBwb2xhcml0eSAqLwotCQkJeGdpZmJfcmVnX29yKHBWQkluZm8tPlAzYzQsIDB4MzAsIDB4MjApOwotCQlpZiAoYjNDQyAmIDB4ODApCi0JCQkvKiBWc3luYyBwb2xhcml0eSAqLwotCQkJeGdpZmJfcmVnX29yKHBWQkluZm8tPlAzYzQsIDB4MzUsIDB4ODApOworCWlmIChjaGlwX2lkID09IFhHMjcpIHsKKwkJWEdJX1NldFhHMjdGUEJpdHMocFZCSW5mbyk7CiAJfSBlbHNlIHsKLQkJRGF0YSA9IHBWQkluZm8tPlJlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0luZm9GbGFnOwotCQlpZiAoRGF0YSAmIDB4NDAwMCkKLQkJCS8qIEhzeW5jIHBvbGFyaXR5ICovCi0JCQl4Z2lmYl9yZWdfb3IocFZCSW5mby0+UDNjNCwgMHgzMCwgMHgyMCk7Ci0JCWlmIChEYXRhICYgMHg4MDAwKQotCQkJLyogVnN5bmMgcG9sYXJpdHkgKi8KLQkJCXhnaWZiX3JlZ19vcihwVkJJbmZvLT5QM2M0LCAweDM1LCAweDgwKTsKKwkJVGVtcCA9IHhnaWZiX3JlZ19nZXQocFZCSW5mby0+UDNkNCwgMHgzNyk7CisJCWlmIChUZW1wICYgMHgwMSkgeworCQkJLyogMTggYml0cyBGUCAqLworCQkJeGdpZmJfcmVnX29yKHBWQkluZm8tPlAzYzQsIDB4MDYsIDB4NDApOworCQkJeGdpZmJfcmVnX29yKHBWQkluZm8tPlAzYzQsIDB4MDksIDB4NDApOworCQl9CiAJfQotfQotCi1zdGF0aWMgdm9pZCBYR0lfU2V0WEcyN0xDRChzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8sCi0JCQkgICB1bnNpZ25lZCBzaG9ydCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCi0JCQkgICB1bnNpZ25lZCBzaG9ydCBNb2RlTm8pCi17Ci0JdW5zaWduZWQgc2hvcnQgRGF0YSwgVGVtcCwgYjNDQzsKLQl1bnNpZ25lZCBzaG9ydCBYR0lfUDNjYzsKLQotCVhHSV9QM2NjID0gcFZCSW5mby0+UDNjYzsKLQotCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNkNCwgMHgyRSwgMHgwMCk7Ci0JeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2Q0LCAweDJGLCAweDAwKTsKLQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzZDQsIDB4NDYsIDB4MDApOwotCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNkNCwgMHg0NywgMHgwMCk7Ci0KLQlUZW1wID0geGdpZmJfcmVnX2dldChwVkJJbmZvLT5QM2Q0LCAweDM3KTsKLQlpZiAoKFRlbXAgJiAweDAzKSA9PSAwKSB7IC8qIGR1YWwgMTIgKi8KLQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2Q0LCAweDQ2LCAweDEzKTsKLQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2Q0LCAweDQ3LCAweDEzKTsKLQl9Ci0KLQlpZiAoKCgqcFZCSW5mby0+cERWT1NldHRpbmcpICYgMHhDMCkgPT0gMHhDMCkgewotCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzZDQsIDB4MkUsICpwVkJJbmZvLT5wQ1IyRSk7Ci0JCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNkNCwgMHgyRiwgKnBWQkluZm8tPnBDUjJGKTsKLQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2Q0LCAweDQ2LCAqcFZCSW5mby0+cENSNDYpOwotCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzZDQsIDB4NDcsICpwVkJJbmZvLT5wQ1I0Nyk7Ci0JfQotCi0JWEdJX1NldFhHMjdGUEJpdHMocFZCSW5mbyk7CiAKIAl4Z2lmYl9yZWdfb3IocFZCSW5mby0+UDNjNCwgMHgxRSwgMHgwMSk7IC8qIE5lZ2F0aXZlIGJsYW5rIHBvbGFyaXR5ICovCiAKQEAgLTEzMzYsOCArMTI2Nyw2IEBACiAJCXN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLAogCQlzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCiB7Ci0JdW5zaWduZWQgc2hvcnQgdGVtcGJ4OwotCiAJdW5zaWduZWQgc2hvcnQgTENEWGxhdDFWQ0xLWzRdID0geyBWQ0xLNjUgKyAyLAogCQkJCQkgICBWQ0xLNjUgKyAyLAogCQkJCQkgICBWQ0xLNjUgKyAyLApAQCAtMTM1OCw3ICsxMjg3LDYgQEAKIAogCXVuc2lnbmVkIHNob3J0IENSVDJJbmRleCwgVkNMS0luZGV4OwogCXVuc2lnbmVkIHNob3J0IG1vZGVmbGFnLCByZXNpbmZvOwotCXVuc2lnbmVkIGNoYXIgKkNIVFZWQ0xLUHRyID0gTlVMTDsKIAogCWlmIChNb2RlTm8gPD0gMHgxMykgewogCQkvKiBzaStTdF9SZXNJbmZvICovCkBAIC0xNDU5LDQ3ICsxMzg3LDE1IEBACiAJCWVsc2UKIAkJCVZDTEtJbmRleCA9IENSVDJJbmRleDsKIAotCQlpZiAocFZCSW5mby0+SUZfREVGX0NINzAwNSA9PSAxKSB7Ci0JCQlpZiAoIShwVkJJbmZvLT5WQkluZm8gJiBTZXRDUlQyVG9MQ0QpKSB7Ci0JCQkJVkNMS0luZGV4ICY9IDB4MWY7Ci0JCQkJdGVtcGJ4ID0gMDsKLQotCQkJCWlmIChwVkJJbmZvLT5WQkluZm8gJiBTZXRQQUxUVikKLQkJCQkJdGVtcGJ4ICs9IDI7Ci0KLQkJCQlpZiAocFZCSW5mby0+VkJJbmZvICYgU2V0Q0hUVk92ZXJTY2FuKQotCQkJCQl0ZW1wYnggKz0gMTsKLQotCQkJCXN3aXRjaCAodGVtcGJ4KSB7Ci0JCQkJY2FzZSAwOgotCQkJCQlDSFRWVkNMS1B0ciA9IHBWQkluZm8tPkNIVFZWQ0xLVU5UU0M7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMToKLQkJCQkJQ0hUVlZDTEtQdHIgPSBwVkJJbmZvLT5DSFRWVkNMS09OVFNDOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDI6Ci0JCQkJCUNIVFZWQ0xLUHRyID0gcFZCSW5mby0+Q0hUVlZDTEtVUEFMOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDM6Ci0JCQkJCUNIVFZWQ0xLUHRyID0gcFZCSW5mby0+Q0hUVlZDTEtPUEFMOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlWQ0xLSW5kZXggPSBDSFRWVkNMS1B0cltWQ0xLSW5kZXhdOwotCQkJfQotCQl9IGVsc2UgewotCQkJVkNMS0luZGV4ID0gVkNMS0luZGV4ID4+IDY7Ci0JCQlpZiAoKHBWQkluZm8tPkxDRFJlc0luZm8gPT0gUGFuZWw4MDB4NjAwKSB8fAotCQkJICAgIChwVkJJbmZvLT5MQ0RSZXNJbmZvID09IFBhbmVsMzIweDQ4MCkpCi0JCQkJVkNMS0luZGV4ID0gTFZEU1hsYXQxVkNMS1tWQ0xLSW5kZXhdOwotCQkJZWxzZSBpZiAoKHBWQkluZm8tPkxDRFJlc0luZm8gPT0gUGFuZWwxMDI0eDc2OCkgfHwKLQkJCQkgKHBWQkluZm8tPkxDRFJlc0luZm8gPT0gUGFuZWwxMDI0eDc2OHg3NSkpCi0JCQkJVkNMS0luZGV4ID0gTFZEU1hsYXQyVkNMS1tWQ0xLSW5kZXhdOwotCQkJZWxzZQotCQkJCVZDTEtJbmRleCA9IExWRFNYbGF0M1ZDTEtbVkNMS0luZGV4XTsKLQkJfQorCQlWQ0xLSW5kZXggPSBWQ0xLSW5kZXggPj4gNjsKKwkJaWYgKChwVkJJbmZvLT5MQ0RSZXNJbmZvID09IFBhbmVsODAweDYwMCkgfHwKKwkJICAgIChwVkJJbmZvLT5MQ0RSZXNJbmZvID09IFBhbmVsMzIweDQ4MCkpCisJCQlWQ0xLSW5kZXggPSBMVkRTWGxhdDFWQ0xLW1ZDTEtJbmRleF07CisJCWVsc2UgaWYgKChwVkJJbmZvLT5MQ0RSZXNJbmZvID09IFBhbmVsMTAyNHg3NjgpIHx8CisJCQkgKHBWQkluZm8tPkxDRFJlc0luZm8gPT0gUGFuZWwxMDI0eDc2OHg3NSkpCisJCQlWQ0xLSW5kZXggPSBMVkRTWGxhdDJWQ0xLW1ZDTEtJbmRleF07CisJCWVsc2UKKwkJCVZDTEtJbmRleCA9IExWRFNYbGF0M1ZDTEtbVkNMS0luZGV4XTsKIAl9CiAJLyogVkNMS0luZGV4ID0gVkNMS0luZGV4JkluZGV4TWFzazsgKi8KIApAQCAtMTc3MSw2MCArMTY2Nyw2IEBACiAKIH0KIAotLyoKLXZvaWQgWEdJX1Zlc2FMb3dSZXNvbHV0aW9uKHVuc2lnbmVkIHNob3J0IE1vZGVObywKLQkJCSAgIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAotCQkJICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQotewotCXVuc2lnbmVkIHNob3J0IG1vZGVmbGFnOwotCi0JaWYgKE1vZGVObyA+IDB4MTMpCi0JCW1vZGVmbGFnID0gcFZCSW5mby0+RU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0JZWxzZQotCQltb2RlZmxhZyA9IHBWQkluZm8tPlNNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7Ci0KLQlpZiAoTW9kZU5vID4gMHgxMykgewotCQlpZiAobW9kZWZsYWcgJiBEb3VibGVTY2FuTW9kZSkgewotCQkJaWYgKG1vZGVmbGFnICYgSGFsZkRDTEspIHsKLQkJCQlpZiAocFZCSW5mby0+VkJUeXBlICYgVkJfWEdJMzAxQiB8Ci0JCQkJCQkgICAgICBWQl9YR0kzMDJCIHwKLQkJCQkJCSAgICAgIFZCX1hHSTMwMUxWIHwKLQkJCQkJCSAgICAgIFZCX1hHSTMwMkxWIHwKLQkJCQkJCSAgICAgIFZCX1hHSTMwMUMpKSB7Ci0JCQkJCWlmICghKHBWQkluZm8tPlZCSW5mbyAmCi0JCQkJCSAgICAgU2V0Q1JUMlRvUkFNREFDKSkgewotCQkJCQkJaWYgKHBWQkluZm8tPlZCSW5mbyAmCi0JCQkJCQkgICAgU2V0SW5TbGF2ZU1vZGUpIHsKLQkJCQkJCQl4Z2lmYl9yZWdfYW5kX29yKAotCQkJCQkJCQlwVkJJbmZvLT5QM2M0LAotCQkJCQkJCQkweDAxLAotCQkJCQkJCQkweGY3LAotCQkJCQkJCQkweDAwKTsKLQkJCQkJCQl4Z2lmYl9yZWdfYW5kX29yKAotCQkJCQkJCQlwVkJJbmZvLT5QM2M0LAotCQkJCQkJCQkweDBmLAotCQkJCQkJCQkweDdmLAotCQkJCQkJCQkweDAwKTsKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QM2M0LAotCQkJCQkJIDB4MGYsCi0JCQkJCQkgMHhmZiwKLQkJCQkJCSAweDgwKTsKLQkJCQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzYzQsCi0JCQkJCQkgMHgwMSwKLQkJCQkJCSAweGY3LAotCQkJCQkJIDB4MDApOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzYzQsIDB4MGYsIDB4N2YsIDB4MDApOwotfQotKi8KLQogc3RhdGljIHZvaWQgWEdJX1dyaXRlREFDKHVuc2lnbmVkIHNob3J0IGRsLAogCQkJIHVuc2lnbmVkIHNob3J0IGFoLAogCQkJIHVuc2lnbmVkIHNob3J0IGFsLApAQCAtMTg1OSw3ICsxNzAxLDggQEAKIAkJc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewogCXVuc2lnbmVkIHNob3J0IGRhdGEsIGRhdGEyLCB0aW1lLCBpLCBqLCBrLCBtLCBuLCBvLCBzaSwgZGksIGJ4LCBkbCwgYWwsCi0JCQlhaCwgZGgsICp0YWJsZSA9IE5VTEw7CisJCQlhaCwgZGg7CisJY29uc3QgdW5zaWduZWQgc2hvcnQgKnRhYmxlID0gTlVMTDsKIAogCWlmIChNb2RlTm8gPD0gMHgxMykKIAkJZGF0YSA9IHBWQkluZm8tPlNNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfTW9kZUZsYWc7CkBAIC0yMDYxLDEwICsxOTA0LDggQEAKIAogCXN3aXRjaCAodGVtcGJ4KSB7CiAJY2FzZSAwOgotCQl0ZW1wZGkgPSBYR0lfRVBMTENEQ1JUMVB0cl9IOwotCQlicmVhazsKIAljYXNlIDE6Ci0JCXRlbXBkaSA9IFhHSV9FUExMQ0RDUlQxUHRyX1Y7CisJCXRlbXBkaSA9IHhnaWZiX2VwbGxjZF9jcnQxOwogCQlicmVhazsKIAljYXNlIDI6CiAJCXRlbXBkaSA9IFhHSV9FUExMQ0REYXRhUHRyOwpAQCAtMjMxNCwxMCArMjE1NSw4IEBACiAJCQlyZXR1cm4gJlhHSV9DZXRMQ0QxMjgweDEwMjREYXRhW3RlbXBhbF07CiAJCQlicmVhazsKIAkJY2FzZSA2OgotCQkJcmV0dXJuICZYR0lfRXh0TENEMTQwMHgxMDUwRGF0YVt0ZW1wYWxdOwotCQkJYnJlYWs7CiAJCWNhc2UgNzoKLQkJCXJldHVybiAmWEdJX1N0TENEMTQwMHgxMDUwRGF0YVt0ZW1wYWxdOworCQkJcmV0dXJuICZ4Z2lmYl9sY2RfMTQwMHgxMDUwW3RlbXBhbF07CiAJCQlicmVhazsKIAkJY2FzZSA4OgogCQkJcmV0dXJuICZYR0lfQ2V0TENEMTQwMHgxMDUwRGF0YVt0ZW1wYWxdOwpAQCAtMjM0MSwxMCArMjE4MCw4IEBACiAJCQlyZXR1cm4gJlhHSV9DZXRMQ0QxMDI0eDc2OHg3NURhdGFbdGVtcGFsXTsKIAkJCWJyZWFrOwogCQljYXNlIDE1OgotCQkJcmV0dXJuICZYR0lfRXh0TENEMTI4MHgxMDI0eDc1RGF0YVt0ZW1wYWxdOwotCQkJYnJlYWs7CiAJCWNhc2UgMTY6Ci0JCQlyZXR1cm4gJlhHSV9TdExDRDEyODB4MTAyNHg3NURhdGFbdGVtcGFsXTsKKwkJCXJldHVybiAmeGdpZmJfbGNkXzEyODB4MTAyNHg3NVt0ZW1wYWxdOwogCQkJYnJlYWs7CiAJCWNhc2UgMTc6CiAJCQlyZXR1cm4gJlhHSV9DZXRMQ0QxMjgweDEwMjR4NzVEYXRhW3RlbXBhbF07CkBAIC0yMzg4LDE4ICsyMjI1LDEyIEBACiAJCQkJcmV0dXJuICZYR0lfQ2V0TENERGVzMTI4MHgxMDI0RGF0YVt0ZW1wYWxdOwogCQkJYnJlYWs7CiAJCWNhc2UgNjoKLQkJCWlmICgocFZCSW5mby0+VkJUeXBlICYgVkJfWEdJMzAxTFYpIHx8Ci0JCQkgICAgKHBWQkluZm8tPlZCVHlwZSAmIFZCX1hHSTMwMkxWKSkKLQkJCQlyZXR1cm4gJlhHSV9FeHRMQ0RETERlczE0MDB4MTA1MERhdGFbdGVtcGFsXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gJlhHSV9FeHRMQ0REZXMxNDAweDEwNTBEYXRhW3RlbXBhbF07Ci0JCQlicmVhazsKIAkJY2FzZSA3OgogCQkJaWYgKChwVkJJbmZvLT5WQlR5cGUgJiBWQl9YR0kzMDFMVikgfHwKIAkJCSAgICAocFZCSW5mby0+VkJUeXBlICYgVkJfWEdJMzAyTFYpKQotCQkJCXJldHVybiAmWEdJX1N0TENERExEZXMxNDAweDEwNTBEYXRhW3RlbXBhbF07CisJCQkJcmV0dXJuICZ4Z2lmYl9sY2RkbGRlc18xNDAweDEwNTBbdGVtcGFsXTsKIAkJCWVsc2UKLQkJCQlyZXR1cm4gJlhHSV9TdExDRERlczE0MDB4MTA1MERhdGFbdGVtcGFsXTsKKwkJCQlyZXR1cm4gJnhnaWZiX2xjZGRlc18xNDAweDEwNTBbdGVtcGFsXTsKIAkJCWJyZWFrOwogCQljYXNlIDg6CiAJCQlyZXR1cm4gJlhHSV9DZXRMQ0REZXMxNDAweDEwNTBEYXRhW3RlbXBhbF07CkBAIC0yNDI1LDI3ICsyMjU2LDE5IEBACiAJCQlyZXR1cm4gJlhHSV9Ob1NjYWxpbmdEZXNEYXRhW3RlbXBhbF07CiAJCQlicmVhazsKIAkJY2FzZSAxMzoKLQkJCXJldHVybiAmWEdJX0V4dExDRERlczEwMjR4NzY4eDc1RGF0YVt0ZW1wYWxdOwotCQkJYnJlYWs7CiAJCWNhc2UgMTQ6Ci0JCQlyZXR1cm4gJlhHSV9TdExDRERlczEwMjR4NzY4eDc1RGF0YVt0ZW1wYWxdOworCQkJcmV0dXJuICZ4Z2lmYl9sY2RkZXNfMTAyNHg3Njh4NzVbdGVtcGFsXTsKIAkJCWJyZWFrOwogCQljYXNlIDE1OgogCQkJcmV0dXJuICZYR0lfQ2V0TENERGVzMTAyNHg3Njh4NzVEYXRhW3RlbXBhbF07CiAJCQlicmVhazsKIAkJY2FzZSAxNjoKLQkJCWlmICgocFZCSW5mby0+VkJUeXBlICYgVkJfWEdJMzAxTFYpIHx8Ci0JCQkgICAgKHBWQkluZm8tPlZCVHlwZSAmIFZCX1hHSTMwMkxWKSkKLQkJCQlyZXR1cm4gJlhHSV9FeHRMQ0RETERlczEyODB4MTAyNHg3NURhdGFbdGVtcGFsXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gJlhHSV9FeHRMQ0REZXMxMjgweDEwMjR4NzVEYXRhW3RlbXBhbF07Ci0JCQlicmVhazsKIAkJY2FzZSAxNzoKIAkJCWlmICgocFZCSW5mby0+VkJUeXBlICYgVkJfWEdJMzAxTFYpIHx8CiAJCQkgICAgKHBWQkluZm8tPlZCVHlwZSAmIFZCX1hHSTMwMkxWKSkKLQkJCQlyZXR1cm4gJlhHSV9TdExDRERMRGVzMTI4MHgxMDI0eDc1RGF0YVt0ZW1wYWxdOworCQkJCXJldHVybiAmeGdpZmJfbGNkZGxkZXNfMTI4MHgxMDI0eDc1W3RlbXBhbF07CiAJCQllbHNlCi0JCQkJcmV0dXJuICZYR0lfU3RMQ0REZXMxMjgweDEwMjR4NzVEYXRhW3RlbXBhbF07CisJCQkJcmV0dXJuICZ4Z2lmYl9sY2RkZXNfMTI4MHgxMDI0eDc1W3RlbXBhbF07CiAJCQlicmVhazsKIAkJY2FzZSAxODoKIAkJCWlmICgocFZCSW5mby0+VkJUeXBlICYgVkJfWEdJMzAxTFYpIHx8CkBAIC0yNDk5LDE4ICsyMzIyLDEzIEBACiAJc3dpdGNoICh0ZW1wYngpIHsKIAljYXNlIDA6CiAJCXRlbXBkaSA9IE5VTEw7IC8qRVBMQ0hUVkNSVDFQdHJfSDsqLwotCQlpZiAocFZCSW5mby0+SUZfREVGX0NINzAwNyA9PSAxKQotCQkJdGVtcGRpID0gWEdJX0VQTENIVFZDUlQxUHRyOwotCiAJCWJyZWFrOwogCWNhc2UgMToKIAkJdGVtcGRpID0gTlVMTDsgLypFUExDSFRWQ1JUMVB0cl9WOyovCi0JCWlmIChwVkJJbmZvLT5JRl9ERUZfQ0g3MDA3ID09IDEpCi0JCQl0ZW1wZGkgPSBYR0lfRVBMQ0hUVkNSVDFQdHI7Ci0KIAkJYnJlYWs7CiAJY2FzZSAyOgotCQl0ZW1wZGkgPSBYR0lfRVBMQ0hUVkRhdGFQdHI7CisJY2FzZSA2OgorCQl0ZW1wZGkgPSB4Z2lmYl9jaHJvbnRlbF90djsKIAkJYnJlYWs7CiAJY2FzZSAzOgogCQl0ZW1wZGkgPSBOVUxMOwpAQCAtMjUyMSw5ICsyMzM5LDYgQEAKIAljYXNlIDU6CiAJCXRlbXBkaSA9IE5VTEw7CiAJCWJyZWFrOwotCWNhc2UgNjoKLQkJdGVtcGRpID0gWEdJX0VQTENIVFZSZWdQdHI7Ci0JCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KQEAgLTI2MjUsNyArMjQ0MCw2IEBACiB7CiAJdW5zaWduZWQgc2hvcnQgdGVtcGJ4OwogCXN0cnVjdCBYR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgKkxDRFB0ciA9IE5VTEw7Ci0Jc3RydWN0IFhHSTMzMF9DSFRWRGF0YVN0cnVjdCAqVFZQdHIgPSBOVUxMOwogCiAJdGVtcGJ4ID0gMjsKIApAQCAtMjYzOCwxNyArMjQ1Miw2IEBACiAJCXBWQkluZm8tPkhUID0gTENEUHRyLT5MQ0RIVDsKIAkJcFZCSW5mby0+VlQgPSBMQ0RQdHItPkxDRFZUOwogCX0KLQlpZiAocFZCSW5mby0+SUZfREVGX0NINzAxNyA9PSAxKSB7Ci0JCWlmIChwVkJJbmZvLT5WQkluZm8gJiBTZXRDUlQyVG9UVikgewotCQkJVFZQdHIgPSAoc3RydWN0IFhHSTMzMF9DSFRWRGF0YVN0cnVjdCAqKSBYR0lfR2V0VFZQdHIoCi0JCQkJCXRlbXBieCwgTW9kZU5vLCBNb2RlSWRJbmRleCwKLQkJCQkJUmVmcmVzaFJhdGVUYWJsZUluZGV4LCBwVkJJbmZvKTsKLQkJCXBWQkluZm8tPlZHQUhUID0gVFZQdHItPlZHQUhUOwotCQkJcFZCSW5mby0+VkdBVlQgPSBUVlB0ci0+VkdBVlQ7Ci0JCQlwVkJJbmZvLT5IVCA9IFRWUHRyLT5MQ0RIVDsKLQkJCXBWQkluZm8tPlZUID0gVFZQdHItPkxDRFZUOwotCQl9Ci0JfQogCiAJaWYgKHBWQkluZm8tPlZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkgewogCQlpZiAoIShwVkJJbmZvLT5MQ0RJbmZvICYgKFNldExDRHRvTm9uRXhwYW5kaW5nCkBAIC0yNjgxLDkgKzI0ODQsNiBAQAogCXVuc2lnbmVkIHNob3J0IHRlbXBieCwgaTsKIAlzdHJ1Y3QgWEdJX0xWRFNDUlQxSERhdGFTdHJ1Y3QgKkxDRFB0ciA9IE5VTEw7CiAJc3RydWN0IFhHSV9MVkRTQ1JUMVZEYXRhU3RydWN0ICpMQ0RQdHIxID0gTlVMTDsKLQkvKiBzdHJ1Y3QgWEdJMzMwX0NIVFZEYXRhU3RydWN0ICpUVlB0ciA9IE5VTEw7ICovCi0Jc3RydWN0IFhHSV9DSDcwMDdUVl9UaW1pbmdIU3RydWN0ICpDSDcwMDdUVl9UaW1pbmdIUHRyID0gTlVMTDsKLQlzdHJ1Y3QgWEdJX0NINzAwN1RWX1RpbWluZ1ZTdHJ1Y3QgKkNINzAwN1RWX1RpbWluZ1ZQdHIgPSBOVUxMOwogCiAJaWYgKE1vZGVObyA8PSAweDEzKQogCQlpbmRleCA9IHBWQkluZm8tPlNNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uU3RfQ1JUMkNSVEM7CkBAIC0yNjkyLDExMyArMjQ5MiwzNiBAQAogCiAJaW5kZXggPSBpbmRleCAmIEluZGV4TWFzazsKIAotCWlmICgocFZCSW5mby0+SUZfREVGX1NjYWxlTENEID09IDApIHx8Ci0JICAgICgocFZCSW5mby0+SUZfREVGX1NjYWxlTENEID09IDEpICYmCi0JICAgICghKHBWQkluZm8tPkxDREluZm8gJiBFbmFibGVTY2FsaW5nTENEKSkpKSB7Ci0JCXRlbXBieCA9IDA7CisJdGVtcGJ4ID0gMDsKIAotCQlpZiAocFZCSW5mby0+VkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEpKSB7Ci0JCQlMQ0RQdHIgPSAoc3RydWN0IFhHSV9MVkRTQ1JUMUhEYXRhU3RydWN0ICopCi0JCQkJCVhHSV9HZXRMY2RQdHIodGVtcGJ4LCBNb2RlTm8sCi0JCQkJCQkgICAgICBNb2RlSWRJbmRleCwKLQkJCQkJCSAgICAgIFJlZnJlc2hSYXRlVGFibGVJbmRleCwKLQkJCQkJCSAgICAgIHBWQkluZm8pOworCWlmIChwVkJJbmZvLT5WQkluZm8gJiAoU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvTENEQSkpIHsKKwkJTENEUHRyID0gKHN0cnVjdCBYR0lfTFZEU0NSVDFIRGF0YVN0cnVjdCAqKQorCQkJCVhHSV9HZXRMY2RQdHIodGVtcGJ4LCBNb2RlTm8sCisJCQkJCSAgICAgIE1vZGVJZEluZGV4LAorCQkJCQkgICAgICBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCisJCQkJCSAgICAgIHBWQkluZm8pOwogCi0JCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQkJCXBWQkluZm8tPlRpbWluZ0hbMF0uZGF0YVtpXSA9IExDRFB0clswXS5SZWdbaV07Ci0JCX0KLQotCQlpZiAocFZCSW5mby0+SUZfREVGX0NINzAwNyA9PSAxKSB7Ci0JCQlpZiAocFZCSW5mby0+VkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKLQkJCQlDSDcwMDdUVl9UaW1pbmdIUHRyID0KLQkJCQkJKHN0cnVjdCBYR0lfQ0g3MDA3VFZfVGltaW5nSFN0cnVjdCAqKQotCQkJCQkJWEdJX0dldFRWUHRyKAotCQkJCQkJCXRlbXBieCwKLQkJCQkJCQlNb2RlTm8sCi0JCQkJCQkJTW9kZUlkSW5kZXgsCi0JCQkJCQkJUmVmcmVzaFJhdGVUYWJsZUluZGV4LAotCQkJCQkJCXBWQkluZm8pOwotCi0JCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJCQkJcFZCSW5mby0+VGltaW5nSFswXS5kYXRhW2ldID0KLQkJCQkJCUNINzAwN1RWX1RpbWluZ0hQdHJbMF0uZGF0YVtpXTsKLQkJCX0KLQkJfQotCi0JCS8qIGlmIChwVkJJbmZvLT5JRl9ERUZfQ0g3MDE3ID09IDEpIHsKLQkJCWlmIChwVkJJbmZvLT5WQkluZm8gJiBTZXRDUlQyVG9UVikKLQkJCQlUVlB0ciA9IChzdHJ1Y3QgWEdJMzMwX0NIVFZEYXRhU3RydWN0ICopCi0JCQkJCQlYR0lfR2V0VFZQdHIoCi0JCQkJCQkJdGVtcGJ4LAotCQkJCQkJCU1vZGVObywKLQkJCQkJCQlNb2RlSWRJbmRleCwKLQkJCQkJCQlSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCi0JCQkJCQkJcFZCSW5mbyk7Ci0JCX0KLQkJKi8KLQotCQlYR0lfU2V0Q1JUMVRpbWluZ19IKHBWQkluZm8sIEh3RGV2aWNlRXh0ZW5zaW9uKTsKLQotCQlpZiAocFZCSW5mby0+SUZfREVGX0NINzAwNyA9PSAxKSB7Ci0JCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsIDB4MkUsCi0JCQkJCUNINzAwN1RWX1RpbWluZ0hQdHJbMF0uZGF0YVs4XSk7Ci0JCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsIDB4MkYsCi0JCQkJCUNINzAwN1RWX1RpbWluZ0hQdHJbMF0uZGF0YVs5XSk7Ci0JCX0KLQotCQl0ZW1wYnggPSAxOwotCi0JCWlmIChwVkJJbmZvLT5WQkluZm8gJiAoU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvTENEQSkpIHsKLQkJCUxDRFB0cjEgPSAoc3RydWN0IFhHSV9MVkRTQ1JUMVZEYXRhU3RydWN0ICopCi0JCQkJCVhHSV9HZXRMY2RQdHIoCi0JCQkJCQl0ZW1wYngsCi0JCQkJCQlNb2RlTm8sCi0JCQkJCQlNb2RlSWRJbmRleCwKLQkJCQkJCVJlZnJlc2hSYXRlVGFibGVJbmRleCwKLQkJCQkJCXBWQkluZm8pOwotCQkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKLQkJCQlwVkJJbmZvLT5UaW1pbmdWWzBdLmRhdGFbaV0gPSBMQ0RQdHIxWzBdLlJlZ1tpXTsKLQkJfQotCi0JCWlmIChwVkJJbmZvLT5JRl9ERUZfQ0g3MDA3ID09IDEpIHsKLQkJCWlmIChwVkJJbmZvLT5WQkluZm8gJiBTZXRDUlQyVG9UVikgewotCQkJCUNINzAwN1RWX1RpbWluZ1ZQdHIgPQotCQkJCQkoc3RydWN0IFhHSV9DSDcwMDdUVl9UaW1pbmdWU3RydWN0ICopCi0JCQkJCQlYR0lfR2V0VFZQdHIoCi0JCQkJCQkJdGVtcGJ4LAotCQkJCQkJCU1vZGVObywKLQkJCQkJCQlNb2RlSWRJbmRleCwKLQkJCQkJCQlSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCi0JCQkJCQkJcFZCSW5mbyk7Ci0KLQkJCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQotCQkJCQlwVkJJbmZvLT5UaW1pbmdWWzBdLmRhdGFbaV0gPQotCQkJCQkJQ0g3MDA3VFZfVGltaW5nVlB0clswXS5kYXRhW2ldOwotCQkJfQotCQl9Ci0JCS8qIGlmIChwVkJJbmZvLT5JRl9ERUZfQ0g3MDE3ID09IDEpIHsKLQkJCWlmIChwVkJJbmZvLT5WQkluZm8gJiBTZXRDUlQyVG9UVikKLQkJCQlUVlB0ciA9IChzdHJ1Y3QgWEdJMzMwX0NIVFZEYXRhU3RydWN0ICopCi0JCQkJCVhHSV9HZXRUVlB0cih0ZW1wYngsCi0JCQkJCQkgICAgIE1vZGVObywKLQkJCQkJCSAgICAgTW9kZUlkSW5kZXgsCi0JCQkJCQkgICAgIFJlZnJlc2hSYXRlVGFibGVJbmRleCwKLQkJCQkJCSAgICAgcFZCSW5mbyk7Ci0JCX0KLQkJKi8KLQotCQlYR0lfU2V0Q1JUMVRpbWluZ19WKE1vZGVJZEluZGV4LCBNb2RlTm8sIHBWQkluZm8pOwotCi0JCWlmIChwVkJJbmZvLT5JRl9ERUZfQ0g3MDA3ID09IDEpIHsKLQkJCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UDNjNCwgMHgzMywgfjB4MDEsCi0JCQkJCUNINzAwN1RWX1RpbWluZ1ZQdHJbMF0uZGF0YVs3XSAmIDB4MDEpOwotCQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LCAweDM0LAotCQkJCQlDSDcwMDdUVl9UaW1pbmdWUHRyWzBdLmRhdGFbOF0pOwotCQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LCAweDNGLAotCQkJCQlDSDcwMDdUVl9UaW1pbmdWUHRyWzBdLmRhdGFbOV0pOwotCi0JCX0KKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCXBWQkluZm8tPlRpbWluZ0hbMF0uZGF0YVtpXSA9IExDRFB0clswXS5SZWdbaV07CiAJfQorCisJWEdJX1NldENSVDFUaW1pbmdfSChwVkJJbmZvLCBId0RldmljZUV4dGVuc2lvbik7CisKKwl0ZW1wYnggPSAxOworCisJaWYgKHBWQkluZm8tPlZCSW5mbyAmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkgeworCQlMQ0RQdHIxID0gKHN0cnVjdCBYR0lfTFZEU0NSVDFWRGF0YVN0cnVjdCAqKQorCQkJCVhHSV9HZXRMY2RQdHIoCisJCQkJCXRlbXBieCwKKwkJCQkJTW9kZU5vLAorCQkJCQlNb2RlSWRJbmRleCwKKwkJCQkJUmVmcmVzaFJhdGVUYWJsZUluZGV4LAorCQkJCQlwVkJJbmZvKTsKKwkJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKwkJCXBWQkluZm8tPlRpbWluZ1ZbMF0uZGF0YVtpXSA9IExDRFB0cjFbMF0uUmVnW2ldOworCX0KKworCVhHSV9TZXRDUlQxVGltaW5nX1YoTW9kZUlkSW5kZXgsIE1vZGVObywgcFZCSW5mbyk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBYR0lfR2V0TENEQ2FwUHRyKHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKQEAgLTI4ODcsMjg3ICsyNjEwLDI2MyBAQAogCWVsc2UKIAkJbW9kZWZsYWcgPSBwVkJJbmZvLT5TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X01vZGVGbGFnOwogCi0JaWYgKCEocFZCSW5mby0+U2V0RmxhZyAmIFdpbjl4RE9TTW9kZSkpIHsKLQkJaWYgKChwVkJJbmZvLT5JRl9ERUZfQ0g3MDE3ID09IDApIHx8IChwVkJJbmZvLT5WQkluZm8KLQkJCQkmIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQyVG9MQ0RBKSkpIHsKLQkJCWlmIChwVkJJbmZvLT5JRl9ERUZfT0VNVXRpbCA9PSAxKSB7Ci0JCQkJdGVtcGJ4ID0gODsKLQkJCQlMQ0RQdHIgPSAoc3RydWN0IFhHSTMzMF9MQ0REYXRhRGVzU3RydWN0ICopCi0JCQkJCVhHSV9HZXRMY2RQdHIodGVtcGJ4LAotCQkJCQkJICAgICAgTW9kZU5vLAotCQkJCQkJICAgICAgTW9kZUlkSW5kZXgsCi0JCQkJCQkgICAgICBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCi0JCQkJCQkgICAgICBwVkJJbmZvKTsKLQkJCX0KKwl0ZW1wYnggPSAzOworCWlmIChwVkJJbmZvLT5MQ0RJbmZvICYgRW5hYmxlU2NhbGluZ0xDRCkKKwkJTENEUHRyMSA9CisJCSAgICAoc3RydWN0IFhHSTMzMF9MQ0REYXRhRGVzU3RydWN0MiAqKQorCQkJCVhHSV9HZXRMY2RQdHIoCisJCQkJCSAgdGVtcGJ4LAorCQkJCQkgIE1vZGVObywKKwkJCQkJICBNb2RlSWRJbmRleCwKKwkJCQkJICBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCisJCQkJCSAgcFZCSW5mbyk7CisJZWxzZQorCQlMQ0RQdHIgPQorCQkgICAgKHN0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCAqKQorCQkJCVhHSV9HZXRMY2RQdHIoCisJCQkJCSAgdGVtcGJ4LAorCQkJCQkgIE1vZGVObywKKwkJCQkJICBNb2RlSWRJbmRleCwKKwkJCQkJICBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCisJCQkJCSAgcFZCSW5mbyk7CiAKLQkJCWlmICgocFZCSW5mby0+SUZfREVGX09FTVV0aWwgPT0gMCkgfHwKLQkJCSAgICAoTENEUHRyID09IE5VTEwpKSB7Ci0JCQkJdGVtcGJ4ID0gMzsKLQkJCQlpZiAocFZCSW5mby0+TENESW5mbyAmIEVuYWJsZVNjYWxpbmdMQ0QpCi0JCQkJCUxDRFB0cjEgPQotCQkJCQkgICAgKHN0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdDIgKikKLQkJCQkJCQlYR0lfR2V0TGNkUHRyKAotCQkJCQkJCSAgdGVtcGJ4LAotCQkJCQkJCSAgTW9kZU5vLAotCQkJCQkJCSAgTW9kZUlkSW5kZXgsCi0JCQkJCQkJICBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCi0JCQkJCQkJICBwVkJJbmZvKTsKLQkJCQllbHNlCi0JCQkJCUxDRFB0ciA9Ci0JCQkJCSAgICAoc3RydWN0IFhHSTMzMF9MQ0REYXRhRGVzU3RydWN0ICopCi0JCQkJCQkJWEdJX0dldExjZFB0cigKLQkJCQkJCQkgIHRlbXBieCwKLQkJCQkJCQkgIE1vZGVObywKLQkJCQkJCQkgIE1vZGVJZEluZGV4LAotCQkJCQkJCSAgUmVmcmVzaFJhdGVUYWJsZUluZGV4LAotCQkJCQkJCSAgcFZCSW5mbyk7Ci0JCQl9CisJWEdJX0dldExDRFN5bmMoJnRlbXBheCwgJnRlbXBieCwgcFZCSW5mbyk7CisJcHVzaDEgPSB0ZW1wYng7CisJcHVzaDIgPSB0ZW1wYXg7CiAKLQkJCVhHSV9HZXRMQ0RTeW5jKCZ0ZW1wYXgsICZ0ZW1wYngsIHBWQkluZm8pOwotCQkJcHVzaDEgPSB0ZW1wYng7Ci0JCQlwdXNoMiA9IHRlbXBheDsKLQotCQkJLyogR2V0TENEUmVzSW5mbyAqLwotCQkJaWYgKChwVkJJbmZvLT5MQ0RSZXNJbmZvID09IFBhbmVsMTAyNHg3NjgpIHx8Ci0JCQkgICAgKHBWQkluZm8tPkxDRFJlc0luZm8gPT0gUGFuZWwxMDI0eDc2OHg3NSkpIHsKLQkJCQl0ZW1wYXggPSAxMDI0OwotCQkJCXRlbXBieCA9IDc2ODsKLQkJCX0gZWxzZSBpZiAoKHBWQkluZm8tPkxDRFJlc0luZm8gPT0gUGFuZWwxMjgweDEwMjQpIHx8Ci0JCQkJICAgKHBWQkluZm8tPkxDRFJlc0luZm8gPT0gUGFuZWwxMjgweDEwMjR4NzUpKSB7Ci0JCQkJdGVtcGF4ID0gMTI4MDsKLQkJCQl0ZW1wYnggPSAxMDI0OwotCQkJfSBlbHNlIGlmIChwVkJJbmZvLT5MQ0RSZXNJbmZvID09IFBhbmVsMTQwMHgxMDUwKSB7Ci0JCQkJdGVtcGF4ID0gMTQwMDsKLQkJCQl0ZW1wYnggPSAxMDUwOwotCQkJfSBlbHNlIHsKLQkJCQl0ZW1wYXggPSAxNjAwOwotCQkJCXRlbXBieCA9IDEyMDA7Ci0JCQl9Ci0KLQkJCWlmIChwVkJJbmZvLT5MQ0RJbmZvICYgU2V0TENEdG9Ob25FeHBhbmRpbmcpIHsKLQkJCQlwVkJJbmZvLT5IREUgPSB0ZW1wYXg7Ci0JCQkJcFZCSW5mby0+VkRFID0gdGVtcGJ4OwotCQkJCXBWQkluZm8tPlZHQUhERSA9IHRlbXBheDsKLQkJCQlwVkJJbmZvLT5WR0FWREUgPSB0ZW1wYng7Ci0JCQl9Ci0KLQkJCWlmICgocFZCSW5mby0+SUZfREVGX1NjYWxlTENEID09IDEpICYmCi0JCQkgICAgKHBWQkluZm8tPkxDREluZm8gJiBFbmFibGVTY2FsaW5nTENEKSkgewotCQkJCXRlbXBheCA9IHBWQkluZm8tPkhERTsKLQkJCQl0ZW1wYnggPSBwVkJJbmZvLT5WREU7Ci0JCQl9Ci0KLQkJCXRlbXBheCA9IHBWQkluZm8tPkhUOwotCi0JCQlpZiAocFZCSW5mby0+TENESW5mbyAmIEVuYWJsZVNjYWxpbmdMQ0QpCi0JCQkJdGVtcGJ4ID0gTENEUHRyMS0+TENESERFUzsKLQkJCWVsc2UKLQkJCQl0ZW1wYnggPSBMQ0RQdHItPkxDREhERVM7Ci0KLQkJCXRlbXBjeCA9IHBWQkluZm8tPkhERTsKLQkJCXRlbXBieCA9IHRlbXBieCAmIDB4MGZmZjsKLQkJCXRlbXBjeCArPSB0ZW1wYng7Ci0KLQkJCWlmICh0ZW1wY3ggPj0gdGVtcGF4KQotCQkJCXRlbXBjeCAtPSB0ZW1wYXg7Ci0KLQkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDFQb3J0LCAweDFBLCB0ZW1wYnggJiAweDA3KTsKLQotCQkJdGVtcGN4ID0gdGVtcGN4ID4+IDM7Ci0JCQl0ZW1wYnggPSB0ZW1wYnggPj4gMzsKLQotCQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MVBvcnQsIDB4MTYsCi0JCQkJCSh1bnNpZ25lZCBzaG9ydCkgKHRlbXBieCAmIDB4ZmYpKTsKLQkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDFQb3J0LCAweDE3LAotCQkJCQkodW5zaWduZWQgc2hvcnQpICh0ZW1wY3ggJiAweGZmKSk7Ci0KLQkJCXRlbXBheCA9IHBWQkluZm8tPkhUOwotCi0JCQlpZiAocFZCSW5mby0+TENESW5mbyAmIEVuYWJsZVNjYWxpbmdMQ0QpCi0JCQkJdGVtcGJ4ID0gTENEUHRyMS0+TENESFJTOwotCQkJZWxzZQotCQkJCXRlbXBieCA9IExDRFB0ci0+TENESFJTOwotCi0JCQl0ZW1wY3ggPSBwdXNoMjsKLQotCQkJaWYgKHBWQkluZm8tPkxDREluZm8gJiBFbmFibGVTY2FsaW5nTENEKQotCQkJCXRlbXBjeCA9IExDRFB0cjEtPkxDREhTeW5jOwotCi0JCQl0ZW1wY3ggKz0gdGVtcGJ4OwotCi0JCQlpZiAodGVtcGN4ID49IHRlbXBheCkKLQkJCQl0ZW1wY3ggLT0gdGVtcGF4OwotCi0JCQl0ZW1wYXggPSB0ZW1wYnggJiAweDA3OwotCQkJdGVtcGF4ID0gdGVtcGF4ID4+IDU7Ci0JCQl0ZW1wY3ggPSB0ZW1wY3ggPj4gMzsKLQkJCXRlbXBieCA9IHRlbXBieCA+PiAzOwotCi0JCQl0ZW1wY3ggJj0gMHgxZjsKLQkJCXRlbXBheCB8PSB0ZW1wY3g7Ci0KLQkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDFQb3J0LCAweDE1LCB0ZW1wYXgpOwotCQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MVBvcnQsIDB4MTQsCi0JCQkJCSh1bnNpZ25lZCBzaG9ydCkgKHRlbXBieCAmIDB4ZmYpKTsKLQotCQkJdGVtcGF4ID0gcFZCSW5mby0+VlQ7Ci0JCQlpZiAocFZCSW5mby0+TENESW5mbyAmIEVuYWJsZVNjYWxpbmdMQ0QpCi0JCQkJdGVtcGJ4ID0gTENEUHRyMS0+TENEVkRFUzsKLQkJCWVsc2UKLQkJCQl0ZW1wYnggPSBMQ0RQdHItPkxDRFZERVM7Ci0JCQl0ZW1wY3ggPSBwVkJJbmZvLT5WREU7Ci0KLQkJCXRlbXBieCA9IHRlbXBieCAmIDB4MGZmZjsKLQkJCXRlbXBjeCArPSB0ZW1wYng7Ci0JCQlpZiAodGVtcGN4ID49IHRlbXBheCkKLQkJCQl0ZW1wY3ggLT0gdGVtcGF4OwotCi0JCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQxUG9ydCwgMHgxYiwKLQkJCQkJKHVuc2lnbmVkIHNob3J0KSAodGVtcGJ4ICYgMHhmZikpOwotCQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MVBvcnQsIDB4MWMsCi0JCQkJCSh1bnNpZ25lZCBzaG9ydCkgKHRlbXBjeCAmIDB4ZmYpKTsKLQotCQkJdGVtcGJ4ID0gKHRlbXBieCA+PiA4KSAmIDB4MDc7Ci0JCQl0ZW1wY3ggPSAodGVtcGN4ID4+IDgpICYgMHgwNzsKLQotCQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MVBvcnQsIDB4MWQsCi0JCQkJCSh1bnNpZ25lZCBzaG9ydCkgKCh0ZW1wY3ggPDwgMykKLQkJCQkJCQl8IHRlbXBieCkpOwotCi0JCQl0ZW1wYXggPSBwVkJJbmZvLT5WVDsKLQkJCWlmIChwVkJJbmZvLT5MQ0RJbmZvICYgRW5hYmxlU2NhbGluZ0xDRCkKLQkJCQl0ZW1wYnggPSBMQ0RQdHIxLT5MQ0RWUlM7Ci0JCQllbHNlCi0JCQkJdGVtcGJ4ID0gTENEUHRyLT5MQ0RWUlM7Ci0KLQkJCS8qIHRlbXBieCA9IHRlbXBieCA+PiA0OyAqLwotCQkJdGVtcGN4ID0gcHVzaDE7Ci0KLQkJCWlmIChwVkJJbmZvLT5MQ0RJbmZvICYgRW5hYmxlU2NhbGluZ0xDRCkKLQkJCQl0ZW1wY3ggPSBMQ0RQdHIxLT5MQ0RWU3luYzsKLQotCQkJdGVtcGN4ICs9IHRlbXBieDsKLQkJCWlmICh0ZW1wY3ggPj0gdGVtcGF4KQotCQkJCXRlbXBjeCAtPSB0ZW1wYXg7Ci0KLQkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDFQb3J0LCAweDE4LAotCQkJCQkodW5zaWduZWQgc2hvcnQpICh0ZW1wYnggJiAweGZmKSk7Ci0JCQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlBhcnQxUG9ydCwgMHgxOSwgfjB4MGYsCi0JCQkJCSh1bnNpZ25lZCBzaG9ydCkgKHRlbXBjeCAmIDB4MGYpKTsKLQotCQkJdGVtcGF4ID0gKCh0ZW1wYnggPj4gOCkgJiAweDA3KSA8PCAzOwotCi0JCQl0ZW1wYnggPSBwVkJJbmZvLT5WR0FWREU7Ci0JCQlpZiAodGVtcGJ4ICE9IHBWQkluZm8tPlZERSkKLQkJCQl0ZW1wYXggfD0gMHg0MDsKLQotCQkJaWYgKHBWQkluZm8tPkxDREluZm8gJiBFbmFibGVMVkRTRERBKQotCQkJCXRlbXBheCB8PSAweDQwOwotCi0JCQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlBhcnQxUG9ydCwgMHgxYSwgMHgwNywKLQkJCQkJdGVtcGF4KTsKLQotCQkJdGVtcGN4ID0gcFZCSW5mby0+VkdBVlQ7Ci0JCQl0ZW1wYnggPSBwVkJJbmZvLT5WREU7Ci0JCQl0ZW1wYXggPSBwVkJJbmZvLT5WR0FWREU7Ci0JCQl0ZW1wY3ggLT0gdGVtcGF4OwotCi0JCQl0ZW1wID0gdGVtcGF4OyAvKiAwNDMwIHlsc2hpZWggKi8KLQkJCXRlbXAxID0gKHRlbXAgPDwgMTgpIC8gdGVtcGJ4OwotCi0JCQl0ZW1wZHggPSAodW5zaWduZWQgc2hvcnQpICgodGVtcCA8PCAxOCkgJSB0ZW1wYngpOwotCi0JCQlpZiAodGVtcGR4ICE9IDApCi0JCQkJdGVtcDEgKz0gMTsKLQotCQkJdGVtcDIgPSB0ZW1wMTsKLQkJCXB1c2gzID0gdGVtcDI7Ci0KLQkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDFQb3J0LCAweDM3LAotCQkJCQkodW5zaWduZWQgc2hvcnQpICh0ZW1wMiAmIDB4ZmYpKTsKLQkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDFQb3J0LCAweDM2LAotCQkJCQkodW5zaWduZWQgc2hvcnQpICgodGVtcDIgPj4gOCkgJiAweGZmKSk7Ci0KLQkJCXRlbXBieCA9ICh1bnNpZ25lZCBzaG9ydCkgKHRlbXAyID4+IDE2KTsKLQkJCXRlbXBheCA9IHRlbXBieCAmIDB4MDM7Ci0KLQkJCXRlbXBieCA9IHBWQkluZm8tPlZHQVZERTsKLQkJCWlmICh0ZW1wYnggPT0gcFZCSW5mby0+VkRFKQotCQkJCXRlbXBheCB8PSAweDA0OwotCi0JCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQxUG9ydCwgMHgzNSwgdGVtcGF4KTsKLQotCQkJaWYgKHBWQkluZm8tPlZCVHlwZSAmIFZCX1hHSTMwMUMpIHsKLQkJCQl0ZW1wMiA9IHB1c2gzOwotCQkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDRQb3J0LAotCQkJCQkgICAgICAweDNjLAotCQkJCQkgICAgICAodW5zaWduZWQgc2hvcnQpICh0ZW1wMiAmIDB4ZmYpKTsKLQkJCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQ0UG9ydCwKLQkJCQkJICAgICAgMHgzYiwKLQkJCQkJICAgICAgKHVuc2lnbmVkIHNob3J0KSAoKHRlbXAyID4+IDgpICYKLQkJCQkJICAgICAgMHhmZikpOwotCQkJCXRlbXBieCA9ICh1bnNpZ25lZCBzaG9ydCkgKHRlbXAyID4+IDE2KTsKLQkJCQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlBhcnQ0UG9ydCwgMHgzYSwKLQkJCQkJCX4weGMwLAotCQkJCQkJKHVuc2lnbmVkIHNob3J0KSAoKHRlbXBieCAmCi0JCQkJCQkJCSAgIDB4ZmYpIDw8IDYpKTsKLQotCQkJCXRlbXBjeCA9IHBWQkluZm8tPlZHQVZERTsKLQkJCQlpZiAodGVtcGN4ID09IHBWQkluZm8tPlZERSkKLQkJCQkJeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QYXJ0NFBvcnQsCi0JCQkJCQkJMHgzMCwgfjB4MGMsIDB4MDApOwotCQkJCWVsc2UKLQkJCQkJeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QYXJ0NFBvcnQsCi0JCQkJCQkJMHgzMCwgfjB4MGMsIDB4MDgpOwotCQkJfQotCi0JCQl0ZW1wY3ggPSBwVkJJbmZvLT5WR0FIREU7Ci0JCQl0ZW1wYnggPSBwVkJJbmZvLT5IREU7Ci0KLQkJCXRlbXAxID0gdGVtcGN4IDw8IDE2OwotCi0JCQl0ZW1wYXggPSAodW5zaWduZWQgc2hvcnQpICh0ZW1wMSAvIHRlbXBieCk7Ci0KLQkJCWlmICgodGVtcGJ4ICYgMHhmZmZmKSA9PSAodGVtcGN4ICYgMHhmZmZmKSkKLQkJCQl0ZW1wYXggPSA2NTUzNTsKLQotCQkJdGVtcDMgPSB0ZW1wYXg7Ci0JCQl0ZW1wMSA9IHBWQkluZm8tPlZHQUhERSA8PCAxNjsKLQotCQkJdGVtcDEgLz0gdGVtcDM7Ci0JCQl0ZW1wMyA9IHRlbXAzIDw8IDE2OwotCQkJdGVtcDEgLT0gMTsKLQotCQkJdGVtcDMgPSAodGVtcDMgJiAweGZmZmYwMDAwKSArICh0ZW1wMSAmIDB4ZmZmZik7Ci0KLQkJCXRlbXBheCA9ICh1bnNpZ25lZCBzaG9ydCkgKHRlbXAzICYgMHhmZik7Ci0JCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQxUG9ydCwgMHgxZiwgdGVtcGF4KTsKLQotCQkJdGVtcDEgPSBwVkJJbmZvLT5WR0FWREUgPDwgMTg7Ci0JCQl0ZW1wMSA9IHRlbXAxIC8gcHVzaDM7Ci0JCQl0ZW1wYnggPSAodW5zaWduZWQgc2hvcnQpICh0ZW1wMSAmIDB4ZmZmZik7Ci0KLQkJCWlmIChwVkJJbmZvLT5MQ0RSZXNJbmZvID09IFBhbmVsMTAyNHg3NjgpCi0JCQkJdGVtcGJ4IC09IDE7Ci0KLQkJCXRlbXBheCA9ICgodGVtcGJ4ID4+IDgpICYgMHhmZikgPDwgMzsKLQkJCXRlbXBheCB8PSAodW5zaWduZWQgc2hvcnQpICgodGVtcDMgPj4gOCkgJiAweDA3KTsKLQkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDFQb3J0LCAweDIwLAotCQkJCQkodW5zaWduZWQgc2hvcnQpICh0ZW1wYXggJiAweGZmKSk7Ci0JCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQxUG9ydCwgMHgyMSwKLQkJCQkJKHVuc2lnbmVkIHNob3J0KSAodGVtcGJ4ICYgMHhmZikpOwotCi0JCQl0ZW1wMyA9IHRlbXAzID4+IDE2OwotCi0JCQlpZiAobW9kZWZsYWcgJiBIYWxmRENMSykKLQkJCQl0ZW1wMyA9IHRlbXAzID4+IDE7Ci0KLQkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDFQb3J0LCAweDIyLAotCQkJCQkodW5zaWduZWQgc2hvcnQpICgodGVtcDMgPj4gOCkgJiAweGZmKSk7Ci0JCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQxUG9ydCwgMHgyMywKLQkJCQkJKHVuc2lnbmVkIHNob3J0KSAodGVtcDMgJiAweGZmKSk7Ci0JCX0KKwkvKiBHZXRMQ0RSZXNJbmZvICovCisJaWYgKChwVkJJbmZvLT5MQ0RSZXNJbmZvID09IFBhbmVsMTAyNHg3NjgpIHx8CisJICAgIChwVkJJbmZvLT5MQ0RSZXNJbmZvID09IFBhbmVsMTAyNHg3Njh4NzUpKSB7CisJCXRlbXBheCA9IDEwMjQ7CisJCXRlbXBieCA9IDc2ODsKKwl9IGVsc2UgaWYgKChwVkJJbmZvLT5MQ0RSZXNJbmZvID09IFBhbmVsMTI4MHgxMDI0KSB8fAorCQkgICAocFZCSW5mby0+TENEUmVzSW5mbyA9PSBQYW5lbDEyODB4MTAyNHg3NSkpIHsKKwkJdGVtcGF4ID0gMTI4MDsKKwkJdGVtcGJ4ID0gMTAyNDsKKwl9IGVsc2UgaWYgKHBWQkluZm8tPkxDRFJlc0luZm8gPT0gUGFuZWwxNDAweDEwNTApIHsKKwkJdGVtcGF4ID0gMTQwMDsKKwkJdGVtcGJ4ID0gMTA1MDsKKwl9IGVsc2UgeworCQl0ZW1wYXggPSAxNjAwOworCQl0ZW1wYnggPSAxMjAwOwogCX0KKworCWlmIChwVkJJbmZvLT5MQ0RJbmZvICYgU2V0TENEdG9Ob25FeHBhbmRpbmcpIHsKKwkJcFZCSW5mby0+SERFID0gdGVtcGF4OworCQlwVkJJbmZvLT5WREUgPSB0ZW1wYng7CisJCXBWQkluZm8tPlZHQUhERSA9IHRlbXBheDsKKwkJcFZCSW5mby0+VkdBVkRFID0gdGVtcGJ4OworCX0KKworCXRlbXBheCA9IHBWQkluZm8tPkhUOworCisJaWYgKHBWQkluZm8tPkxDREluZm8gJiBFbmFibGVTY2FsaW5nTENEKQorCQl0ZW1wYnggPSBMQ0RQdHIxLT5MQ0RIREVTOworCWVsc2UKKwkJdGVtcGJ4ID0gTENEUHRyLT5MQ0RIREVTOworCisJdGVtcGN4ID0gcFZCSW5mby0+SERFOworCXRlbXBieCA9IHRlbXBieCAmIDB4MGZmZjsKKwl0ZW1wY3ggKz0gdGVtcGJ4OworCisJaWYgKHRlbXBjeCA+PSB0ZW1wYXgpCisJCXRlbXBjeCAtPSB0ZW1wYXg7CisKKwl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQxUG9ydCwgMHgxQSwgdGVtcGJ4ICYgMHgwNyk7CisKKwl0ZW1wY3ggPSB0ZW1wY3ggPj4gMzsKKwl0ZW1wYnggPSB0ZW1wYnggPj4gMzsKKworCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDFQb3J0LCAweDE2LAorCQkJKHVuc2lnbmVkIHNob3J0KSAodGVtcGJ4ICYgMHhmZikpOworCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDFQb3J0LCAweDE3LAorCQkJKHVuc2lnbmVkIHNob3J0KSAodGVtcGN4ICYgMHhmZikpOworCisJdGVtcGF4ID0gcFZCSW5mby0+SFQ7CisKKwlpZiAocFZCSW5mby0+TENESW5mbyAmIEVuYWJsZVNjYWxpbmdMQ0QpCisJCXRlbXBieCA9IExDRFB0cjEtPkxDREhSUzsKKwllbHNlCisJCXRlbXBieCA9IExDRFB0ci0+TENESFJTOworCisJdGVtcGN4ID0gcHVzaDI7CisKKwlpZiAocFZCSW5mby0+TENESW5mbyAmIEVuYWJsZVNjYWxpbmdMQ0QpCisJCXRlbXBjeCA9IExDRFB0cjEtPkxDREhTeW5jOworCisJdGVtcGN4ICs9IHRlbXBieDsKKworCWlmICh0ZW1wY3ggPj0gdGVtcGF4KQorCQl0ZW1wY3ggLT0gdGVtcGF4OworCisJdGVtcGF4ID0gdGVtcGJ4ICYgMHgwNzsKKwl0ZW1wYXggPSB0ZW1wYXggPj4gNTsKKwl0ZW1wY3ggPSB0ZW1wY3ggPj4gMzsKKwl0ZW1wYnggPSB0ZW1wYnggPj4gMzsKKworCXRlbXBjeCAmPSAweDFmOworCXRlbXBheCB8PSB0ZW1wY3g7CisKKwl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQxUG9ydCwgMHgxNSwgdGVtcGF4KTsKKwl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQxUG9ydCwgMHgxNCwKKwkJCSh1bnNpZ25lZCBzaG9ydCkgKHRlbXBieCAmIDB4ZmYpKTsKKworCXRlbXBheCA9IHBWQkluZm8tPlZUOworCWlmIChwVkJJbmZvLT5MQ0RJbmZvICYgRW5hYmxlU2NhbGluZ0xDRCkKKwkJdGVtcGJ4ID0gTENEUHRyMS0+TENEVkRFUzsKKwllbHNlCisJCXRlbXBieCA9IExDRFB0ci0+TENEVkRFUzsKKwl0ZW1wY3ggPSBwVkJJbmZvLT5WREU7CisKKwl0ZW1wYnggPSB0ZW1wYnggJiAweDBmZmY7CisJdGVtcGN4ICs9IHRlbXBieDsKKwlpZiAodGVtcGN4ID49IHRlbXBheCkKKwkJdGVtcGN4IC09IHRlbXBheDsKKworCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDFQb3J0LCAweDFiLAorCQkJKHVuc2lnbmVkIHNob3J0KSAodGVtcGJ4ICYgMHhmZikpOworCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDFQb3J0LCAweDFjLAorCQkJKHVuc2lnbmVkIHNob3J0KSAodGVtcGN4ICYgMHhmZikpOworCisJdGVtcGJ4ID0gKHRlbXBieCA+PiA4KSAmIDB4MDc7CisJdGVtcGN4ID0gKHRlbXBjeCA+PiA4KSAmIDB4MDc7CisKKwl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQxUG9ydCwgMHgxZCwKKwkJCSh1bnNpZ25lZCBzaG9ydCkgKCh0ZW1wY3ggPDwgMykKKwkJCQkJfCB0ZW1wYngpKTsKKworCXRlbXBheCA9IHBWQkluZm8tPlZUOworCWlmIChwVkJJbmZvLT5MQ0RJbmZvICYgRW5hYmxlU2NhbGluZ0xDRCkKKwkJdGVtcGJ4ID0gTENEUHRyMS0+TENEVlJTOworCWVsc2UKKwkJdGVtcGJ4ID0gTENEUHRyLT5MQ0RWUlM7CisKKwkvKiB0ZW1wYnggPSB0ZW1wYnggPj4gNDsgKi8KKwl0ZW1wY3ggPSBwdXNoMTsKKworCWlmIChwVkJJbmZvLT5MQ0RJbmZvICYgRW5hYmxlU2NhbGluZ0xDRCkKKwkJdGVtcGN4ID0gTENEUHRyMS0+TENEVlN5bmM7CisKKwl0ZW1wY3ggKz0gdGVtcGJ4OworCWlmICh0ZW1wY3ggPj0gdGVtcGF4KQorCQl0ZW1wY3ggLT0gdGVtcGF4OworCisJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MVBvcnQsIDB4MTgsCisJCQkodW5zaWduZWQgc2hvcnQpICh0ZW1wYnggJiAweGZmKSk7CisJeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QYXJ0MVBvcnQsIDB4MTksIH4weDBmLAorCQkJKHVuc2lnbmVkIHNob3J0KSAodGVtcGN4ICYgMHgwZikpOworCisJdGVtcGF4ID0gKCh0ZW1wYnggPj4gOCkgJiAweDA3KSA8PCAzOworCisJdGVtcGJ4ID0gcFZCSW5mby0+VkdBVkRFOworCWlmICh0ZW1wYnggIT0gcFZCSW5mby0+VkRFKQorCQl0ZW1wYXggfD0gMHg0MDsKKworCWlmIChwVkJJbmZvLT5MQ0RJbmZvICYgRW5hYmxlTFZEU0REQSkKKwkJdGVtcGF4IHw9IDB4NDA7CisKKwl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlBhcnQxUG9ydCwgMHgxYSwgMHgwNywKKwkJCQl0ZW1wYXgpOworCisJdGVtcGN4ID0gcFZCSW5mby0+VkdBVlQ7CisJdGVtcGJ4ID0gcFZCSW5mby0+VkRFOworCXRlbXBheCA9IHBWQkluZm8tPlZHQVZERTsKKwl0ZW1wY3ggLT0gdGVtcGF4OworCisJdGVtcCA9IHRlbXBheDsgLyogMDQzMCB5bHNoaWVoICovCisJdGVtcDEgPSAodGVtcCA8PCAxOCkgLyB0ZW1wYng7CisKKwl0ZW1wZHggPSAodW5zaWduZWQgc2hvcnQpICgodGVtcCA8PCAxOCkgJSB0ZW1wYngpOworCisJaWYgKHRlbXBkeCAhPSAwKQorCQl0ZW1wMSArPSAxOworCisJdGVtcDIgPSB0ZW1wMTsKKwlwdXNoMyA9IHRlbXAyOworCisJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MVBvcnQsIDB4MzcsCisJCQkodW5zaWduZWQgc2hvcnQpICh0ZW1wMiAmIDB4ZmYpKTsKKwl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQxUG9ydCwgMHgzNiwKKwkJCSh1bnNpZ25lZCBzaG9ydCkgKCh0ZW1wMiA+PiA4KSAmIDB4ZmYpKTsKKworCXRlbXBieCA9ICh1bnNpZ25lZCBzaG9ydCkgKHRlbXAyID4+IDE2KTsKKwl0ZW1wYXggPSB0ZW1wYnggJiAweDAzOworCisJdGVtcGJ4ID0gcFZCSW5mby0+VkdBVkRFOworCWlmICh0ZW1wYnggPT0gcFZCSW5mby0+VkRFKQorCQl0ZW1wYXggfD0gMHgwNDsKKworCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDFQb3J0LCAweDM1LCB0ZW1wYXgpOworCisJaWYgKHBWQkluZm8tPlZCVHlwZSAmIFZCX1hHSTMwMUMpIHsKKwkJdGVtcDIgPSBwdXNoMzsKKwkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0NFBvcnQsCisJCQkgICAgICAweDNjLAorCQkJICAgICAgKHVuc2lnbmVkIHNob3J0KSAodGVtcDIgJiAweGZmKSk7CisJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDRQb3J0LAorCQkJICAgICAgMHgzYiwKKwkJCSAgICAgICh1bnNpZ25lZCBzaG9ydCkgKCh0ZW1wMiA+PiA4KSAmCisJCQkgICAgICAweGZmKSk7CisJCXRlbXBieCA9ICh1bnNpZ25lZCBzaG9ydCkgKHRlbXAyID4+IDE2KTsKKwkJeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QYXJ0NFBvcnQsIDB4M2EsCisJCQkJfjB4YzAsCisJCQkJKHVuc2lnbmVkIHNob3J0KSAoKHRlbXBieCAmCisJCQkJCQkgICAweGZmKSA8PCA2KSk7CisKKwkJdGVtcGN4ID0gcFZCSW5mby0+VkdBVkRFOworCQlpZiAodGVtcGN4ID09IHBWQkluZm8tPlZERSkKKwkJCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UGFydDRQb3J0LAorCQkJCQkweDMwLCB+MHgwYywgMHgwMCk7CisJCWVsc2UKKwkJCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UGFydDRQb3J0LAorCQkJCQkweDMwLCB+MHgwYywgMHgwOCk7CisJfQorCisJdGVtcGN4ID0gcFZCSW5mby0+VkdBSERFOworCXRlbXBieCA9IHBWQkluZm8tPkhERTsKKworCXRlbXAxID0gdGVtcGN4IDw8IDE2OworCisJdGVtcGF4ID0gKHVuc2lnbmVkIHNob3J0KSAodGVtcDEgLyB0ZW1wYngpOworCisJaWYgKCh0ZW1wYnggJiAweGZmZmYpID09ICh0ZW1wY3ggJiAweGZmZmYpKQorCQl0ZW1wYXggPSA2NTUzNTsKKworCXRlbXAzID0gdGVtcGF4OworCXRlbXAxID0gcFZCSW5mby0+VkdBSERFIDw8IDE2OworCisJdGVtcDEgLz0gdGVtcDM7CisJdGVtcDMgPSB0ZW1wMyA8PCAxNjsKKwl0ZW1wMSAtPSAxOworCisJdGVtcDMgPSAodGVtcDMgJiAweGZmZmYwMDAwKSArICh0ZW1wMSAmIDB4ZmZmZik7CisKKwl0ZW1wYXggPSAodW5zaWduZWQgc2hvcnQpICh0ZW1wMyAmIDB4ZmYpOworCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDFQb3J0LCAweDFmLCB0ZW1wYXgpOworCisJdGVtcDEgPSBwVkJJbmZvLT5WR0FWREUgPDwgMTg7CisJdGVtcDEgPSB0ZW1wMSAvIHB1c2gzOworCXRlbXBieCA9ICh1bnNpZ25lZCBzaG9ydCkgKHRlbXAxICYgMHhmZmZmKTsKKworCWlmIChwVkJJbmZvLT5MQ0RSZXNJbmZvID09IFBhbmVsMTAyNHg3NjgpCisJCXRlbXBieCAtPSAxOworCisJdGVtcGF4ID0gKCh0ZW1wYnggPj4gOCkgJiAweGZmKSA8PCAzOworCXRlbXBheCB8PSAodW5zaWduZWQgc2hvcnQpICgodGVtcDMgPj4gOCkgJiAweDA3KTsKKwl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQxUG9ydCwgMHgyMCwKKwkJCSh1bnNpZ25lZCBzaG9ydCkgKHRlbXBheCAmIDB4ZmYpKTsKKwl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQxUG9ydCwgMHgyMSwKKwkJCSh1bnNpZ25lZCBzaG9ydCkgKHRlbXBieCAmIDB4ZmYpKTsKKworCXRlbXAzID0gdGVtcDMgPj4gMTY7CisKKwlpZiAobW9kZWZsYWcgJiBIYWxmRENMSykKKwkJdGVtcDMgPSB0ZW1wMyA+PiAxOworCisJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MVBvcnQsIDB4MjIsCisJCQkodW5zaWduZWQgc2hvcnQpICgodGVtcDMgPj4gOCkgJiAweGZmKSk7CisJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MVBvcnQsIDB4MjMsCisJCQkodW5zaWduZWQgc2hvcnQpICh0ZW1wMyAmIDB4ZmYpKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0zMTgyLDExICsyODgxLDYgQEAKIAl1bnNpZ25lZCBzaG9ydCBpbmRleDsKIAogCWlmIChwVkJJbmZvLT5WQkluZm8gJiAoU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvTENEQSkpIHsKLQkJaWYgKHBWQkluZm8tPklGX0RFRl9TY2FsZUxDRCA9PSAxKSB7Ci0JCQlpZiAocFZCSW5mby0+TENESW5mbyAmIEVuYWJsZVNjYWxpbmdMQ0QpCi0JCQkJcmV0dXJuOwotCQl9Ci0KIAkJLyogaW5kZXggPSBYR0lfR2V0TENEQ2FwUHRyKHBWQkluZm8pOyAqLwogCQlpbmRleCA9IFhHSV9HZXRMQ0RDYXBQdHIxKHBWQkluZm8pOwogCkBAIC0zMjA3LDkgKzI5MDEsNyBAQAogewogCiAJdW5zaWduZWQgc2hvcnQgaW5kZXgsIG1vZGVmbGFnOwotCXVuc2lnbmVkIHNob3J0IHRlbXBieDsKIAl1bnNpZ25lZCBjaGFyIHRlbXBhbDsKLQl1bnNpZ25lZCBjaGFyICpDSFRWVkNMS1B0ciA9IE5VTEw7CiAKIAlpZiAoTW9kZU5vIDw9IDB4MTMpCiAJCS8qIHNpK1N0X1Jlc0luZm8gKi8KQEAgLTMyNjcsOTUgKzI5NTksOCBAQAogCQkJaWYgKHBWQkluZm8tPlZCSW5mbyAmIFNldENSVDJUb1RWKQogCQkJCXJldHVybiB0ZW1wYWw7CiAJCX0KLQkJLyogZWxzZSBpZiAoKHBWQkluZm8tPklGX0RFRl9DSDcwMTc9PTEpICYmCi0JCQkgICAgKHBWQkluZm8tPlZCVHlwZSZWQl9DSDcwMTcpKSB7Ci0JCQlpZiAoTW9kZU5vPD0weDEzKQotCQkJCSp0ZW1wYWwgPSBwVkJJbmZvLT5TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLgotCQkJCQkJU3RfQ1JUMkNSVEM7Ci0JCQllbHNlCi0JCQkJKnRlbXBhbCA9IHBWQkluZm8tPlJlZkluZGV4WwotCQkJCQlSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9DUlQyQ1JUQzsKLQkJCSp0ZW1wYWwgPSAqdGVtcGFsICYgMHgxRjsKLQkJCXRlbXBieCA9IDA7Ci0JCQlpZiAocFZCSW5mby0+VFZJbmZvICYgU2V0UEFMVFYpCi0JCQkJdGVtcGJ4ID0gdGVtcGJ4ICsgMjsKLQkJCWlmIChwVkJJbmZvLT5UVkluZm8gJiBTZXRDSFRWT3ZlclNjYW4pCi0JCQkJdGVtcGJ4Kys7Ci0JCQl0ZW1wYnggPSB0ZW1wYnggPDwgMTsKLQkJfSAqLwogCX0gLyoge0VuZCBvZiBWQn0gKi8KIAotCWlmICgocFZCSW5mby0+SUZfREVGX0NINzAwNyA9PSAxKSAmJgotCSAgICAocFZCSW5mby0+VkJUeXBlICYgVkJfQ0g3MDA3KSkgeyAvKiBbQmlsbHldIDA3LzA1LzA4IENINzAwNyAqLwotCQkvKiBWaWRlb0RlYnVnUHJpbnQoKAotCQkJMCwKLQkJCSJYR0lfR2V0VkNMS1B0cjogcFZCSW5mby0+SUZfREVGX0NINzAwNz09MVxuIikpOyAqLwotCQlpZiAoKHBWQkluZm8tPlZCSW5mbyAmIFNldENSVDJUb1RWKSkgewotCQkJaWYgKE1vZGVObyA8PSAweDEzKSB7Ci0JCQkJdGVtcGFsID0gcFZCSW5mby0+U01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS4KLQkJCQkJU3RfQ1JUMkNSVEM7Ci0JCQl9IGVsc2UgewotCQkJCXRlbXBhbCA9IHBWQkluZm8tPlJlZkluZGV4WwotCQkJCQlSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9DUlQyQ1JUQzsKLQkJCX0KLQotCQkJdGVtcGFsID0gdGVtcGFsICYgMHgwRjsKLQkJCXRlbXBieCA9IDA7Ci0KLQkJCWlmIChwVkJJbmZvLT5UVkluZm8gJiBTZXRQQUxUVikKLQkJCQl0ZW1wYnggPSB0ZW1wYnggKyAyOwotCi0JCQlpZiAocFZCSW5mby0+VFZJbmZvICYgU2V0Q0hUVk92ZXJTY2FuKQotCQkJCXRlbXBieCsrOwotCi0JCQkvKiogdGVtcGJ4ID0gdGVtcGJ4IDw8IDE7IENINzAwNyA/ICoqLwotCi0JCQkvKiBbQmlsbHldMDcvMDUvMjkgQ0g3MDA3ICovCi0JCQlpZiAocFZCSW5mby0+SUZfREVGX0NINzAwNyA9PSAxKSB7Ci0JCQkJc3dpdGNoICh0ZW1wYngpIHsKLQkJCQljYXNlIDA6Ci0JCQkJCUNIVFZWQ0xLUHRyID0gWEdJNzAwN19DSFRWVkNMS1VOVFNDOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDE6Ci0JCQkJCUNIVFZWQ0xLUHRyID0gWEdJNzAwN19DSFRWVkNMS09OVFNDOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDI6Ci0JCQkJCUNIVFZWQ0xLUHRyID0gWEdJNzAwN19DSFRWVkNMS1VQQUw7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzoKLQkJCQkJQ0hUVlZDTEtQdHIgPSBYR0k3MDA3X0NIVFZWQ0xLT1BBTDsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJYnJlYWs7Ci0KLQkJCQl9Ci0JCQl9Ci0JCQkvKiBlbHNlIHsKLQkJCQlzd2l0Y2godGVtcGJ4KSB7Ci0JCQkJY2FzZSAwOgotCQkJCQlDSFRWVkNMS1B0ciA9IHBWQkluZm8tPkNIVFZWQ0xLVU5UU0M7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMToKLQkJCQkJQ0hUVlZDTEtQdHIgPSBwVkJJbmZvLT5DSFRWVkNMS09OVFNDOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDI6Ci0JCQkJCUNIVFZWQ0xLUHRyID0gcFZCSW5mby0+Q0hUVlZDTEtVUEFMOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDM6Ci0JCQkJCUNIVFZWQ0xLUHRyID0gcFZCSW5mby0+Q0hUVlZDTEtPUEFMOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkqLwotCi0JCQl0ZW1wYWwgPSBDSFRWVkNMS1B0clt0ZW1wYWxdOwotCQkJcmV0dXJuIHRlbXBhbDsKLQkJfQotCi0JfQotCiAJdGVtcGFsID0gKHVuc2lnbmVkIGNoYXIpIGluYigocFZCSW5mby0+UDNjYSArIDB4MDIpKTsKIAl0ZW1wYWwgPSB0ZW1wYWwgPj4gMjsKIAl0ZW1wYWwgJj0gMHgwMzsKQEAgLTMzNzQsMTMgKzI5NzksNyBAQAogc3RhdGljIHZvaWQgWEdJX0dldFZDTEtMZW4odW5zaWduZWQgY2hhciB0ZW1wYWwsIHVuc2lnbmVkIGNoYXIgKmRpXzAsCiAJCXVuc2lnbmVkIGNoYXIgKmRpXzEsIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLQlpZiAocFZCSW5mby0+SUZfREVGX0NINzAwNyA9PSAxKSB7IC8qIFtCaWxseV0gMjAwNy8wNS8xNiAqLwotCQkvKiBWaWRlb0RlYnVnUHJpbnQoKAotCQkJMCwKLQkJCSJYR0lfR2V0VkNMS0xlbjogcFZCSW5mby0+SUZfREVGX0NINzAwNz09MVxuIikpOyAqLwotCQkqZGlfMCA9ICh1bnNpZ25lZCBjaGFyKSBYR0lfQ0g3MDA3VkNMS0RhdGFbdGVtcGFsXS5TUjJCOwotCQkqZGlfMSA9ICh1bnNpZ25lZCBjaGFyKSBYR0lfQ0g3MDA3VkNMS0RhdGFbdGVtcGFsXS5TUjJDOwotCX0gZWxzZSBpZiAocFZCSW5mby0+VkJUeXBlICYgKFZCX1hHSTMwMSB8IFZCX1hHSTMwMUIgfCBWQl9YR0kzMDJCCisJaWYgKHBWQkluZm8tPlZCVHlwZSAmIChWQl9YR0kzMDEgfCBWQl9YR0kzMDFCIHwgVkJfWEdJMzAyQgogCQkJfCBWQl9YR0kzMDFMViB8IFZCX1hHSTMwMkxWIHwgVkJfWEdJMzAxQykpIHsKIAkJaWYgKCghKHBWQkluZm8tPlZCSW5mbyAmIFNldENSVDJUb0xDREEpKSAmJiAocFZCSW5mby0+U2V0RmxhZwogCQkJCSYgUHJvZ3JhbW1pbmdDUlQyKSkgewpAQCAtMzQwOCwxMCArMzAwNyw3IEBACiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzZDQsIDB4MzEsIH4weDMwLAogCQkJCSh1bnNpZ25lZCBzaG9ydCkgKDB4MTAgKiBpKSk7Ci0JCWlmIChwVkJJbmZvLT5JRl9ERUZfQ0g3MDA3ID09IDEpIHsKLQkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNjNCwgMHgyYiwgZGlfMCk7Ci0JCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsIDB4MmMsIGRpXzEpOwotCQl9IGVsc2UgaWYgKCghKHBWQkluZm8tPlZCSW5mbyAmIFNldENSVDJUb0xDREEpKQorCQlpZiAoKCEocFZCSW5mby0+VkJJbmZvICYgU2V0Q1JUMlRvTENEQSkpCiAJCQkJJiYgKCEocFZCSW5mby0+VkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpKSkgewogCQkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LCAweDJlLCBkaV8wKTsKIAkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNjNCwgMHgyZiwgZGlfMSk7CkBAIC0zNTI2LDEwICszMTIyLDYgQEAKIHsKIAl1bnNpZ25lZCBzaG9ydCBmbGFnLCB0ZW1wYngsIHRlbXBhaDsKIAotCWlmIChwVkJJbmZvLT5JRl9ERUZfQ0g3MDA3ID09IDEpIHsKLQkJcFZCSW5mby0+VkJUeXBlID0gVkJfQ0g3MDA3OwotCQlyZXR1cm47Ci0JfQogCWlmIChwVkJJbmZvLT5JRl9ERUZfTFZEUyA9PSAwKSB7CiAJCXRlbXBieCA9IFZCX1hHSTMwMkI7CiAJCWZsYWcgPSB4Z2lmYl9yZWdfZ2V0KHBWQkluZm8tPlBhcnQ0UG9ydCwgMHgwMCk7CkBAIC0zNTY2LDEzICszMTU4LDYgQEAKIAkJfQogCQlwVkJJbmZvLT5WQlR5cGUgPSB0ZW1wYng7CiAJfQotCS8qCi0JZWxzZSBpZiAocFZCSW5mby0+SUZfREVGX0NINzAxNyA9PSAxKQotCQlwVkJJbmZvLT5WQlR5cGUgPSBWQl9DSDcwMTc7Ci0JZWxzZSAvL0xWRFMKLQkJcFZCSW5mby0+VkJUeXBlID0gVkJfTFZEU19OUzsKLQkgKi8KLQogfQogCiB2b2lkIFhHSV9HZXRWQkluZm8odW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKQEAgLTM2MzAsMTcgKzMyMTUsNiBAQAogCQkJCQkJCQkgIFNldENSVDJUb0xDREE7CiAJCQkJCQl9CiAJCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHBWQkluZm8tPklGX0RFRl9DSDcwMTcgPT0gMSkgewotCQkJCQlpZiAocFZCSW5mby0+VkJUeXBlICYgVkJfQ0g3MDE3KSB7Ci0JCQkJCQlpZiAodGVtcCAmIEVuYWJsZUR1YWxFZGdlKSB7Ci0JCQkJCQkJdGVtcGJ4IHw9Ci0JCQkJCQkJICAgIFNldENSVDJUb0R1YWxFZGdlOwotCi0JCQkJCQkJaWYgKHRlbXAgJiBTZXRUb0xDREEpCi0JCQkJCQkJCXRlbXBieCB8PQotCQkJCQkJCQkgIFNldENSVDJUb0xDREE7Ci0JCQkJCQl9Ci0JCQkJCX0KIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTM2NTAsMTEgKzMyMjQsNyBAQAogCQkJaWYgKCgocFZCSW5mby0+SUZfREVGX0xWRFMgPT0gMCkgJiYKIAkJCSAgICAoKHBWQkluZm8tPlZCVHlwZSAmIFZCX1hHSTMwMUxWKSB8fAogCQkJICAgIChwVkJJbmZvLT5WQlR5cGUgJiBWQl9YR0kzMDJMVikgfHwKLQkJCSAgICAocFZCSW5mby0+VkJUeXBlICYgVkJfWEdJMzAxQykpKSB8fAotCQkJICAgICgocFZCSW5mby0+SUZfREVGX0NINzAxNyA9PSAxKSAmJgotCQkJICAgIChwVkJJbmZvLT5WQlR5cGUgJiBWQl9DSDcwMTcpKSB8fAotCQkJICAgICgocFZCSW5mby0+SUZfREVGX0NINzAwNyA9PSAxKSAmJgotCQkJICAgIChwVkJJbmZvLT5WQlR5cGUgJiBWQl9DSDcwMDcpKSkgeworCQkJICAgIChwVkJJbmZvLT5WQlR5cGUgJiBWQl9YR0kzMDFDKSkpKSB7CiAJCQkJaWYgKHRlbXAgJiBTZXRZUGJQcikgeyAvKiB0ZW1wID0gQ1IzOCAqLwogCQkJCQlpZiAocFZCSW5mby0+SUZfREVGX0hpVmlzaW9uID09IDEpIHsKIAkJCQkJCS8qIHNoYW1wb28gYWRkIGZvciBuZXcKQEAgLTM2OTMsMTUgKzMyNjMsNyBAQAogCQkJCQl0ZW1wID0gMHgwMTdDOwogCQkJfQogCQl9IGVsc2UgeyAvKiAzbmQgcGFydHkgY2hpcCAqLwotCQkJaWYgKHBWQkluZm8tPklGX0RFRl9DSDcwMTcgPT0gMSkKLQkJCQl0ZW1wID0gKFNldENSVDJUb1RWIHwKLQkJCQkJU2V0Q1JUMlRvTENEIHwKLQkJCQkJU2V0Q1JUMlRvTENEQSk7Ci0JCQkvKiBbQmlsbHldIDA3LzA1LzAzICovCi0JCQllbHNlIGlmIChwVkJJbmZvLT5JRl9ERUZfQ0g3MDA3ID09IDEpCi0JCQkJdGVtcCA9IFNldENSVDJUb1RWOwotCQkJZWxzZQotCQkJCXRlbXAgPSBTZXRDUlQyVG9MQ0Q7CisJCQl0ZW1wID0gU2V0Q1JUMlRvTENEOwogCQl9CiAKIAkJaWYgKCEodGVtcGJ4ICYgdGVtcCkpIHsKQEAgLTM3ODksMzQgKzMzNTEsNiBAQAogCQkJCQkJdGVtcGJ4IHw9IChTZXRJblNsYXZlTW9kZSB8CiAJCQkJCQkJICAgU2V0U2ltdVNjYW5Nb2RlKTsKIAkJCQl9Ci0KLQkJCQlpZiAocFZCSW5mby0+SUZfREVGX1ZpZGVvQ2FwdHVyZSA9PSAxKSB7Ci0JCQkJCWlmICgoKEh3RGV2aWNlRXh0ZW5zaW9uLT5qQ2hpcFR5cGUgPT0KLQkJCQkJICAgICAgWEc0MCkgJiYKLQkJCQkJICAgICAocFZCSW5mby0+U2V0X1ZHQVR5cGUgPT0gWEc0MCkpIHx8Ci0JCQkJCSAgICAoKEh3RGV2aWNlRXh0ZW5zaW9uLT5qQ2hpcFR5cGUgPT0KLQkJCQkJICAgICAgWEc0MSkgJiYKLQkJCQkJICAgICAocFZCSW5mby0+U2V0X1ZHQVR5cGUgPT0gWEc0MSkpIHx8Ci0JCQkJCSAgICAoKEh3RGV2aWNlRXh0ZW5zaW9uLT5qQ2hpcFR5cGUgPT0KLQkJCQkJICAgICAgWEc0MikgJiYKLQkJCQkJICAgICAocFZCSW5mby0+U2V0X1ZHQVR5cGUgPT0gWEc0MikpIHx8Ci0JCQkJCSAgICAoKEh3RGV2aWNlRXh0ZW5zaW9uLT5qQ2hpcFR5cGUgPT0KLQkJCQkJICAgICAgWEc0NSkgJiYKLQkJCQkJICAgICAocFZCSW5mby0+U2V0X1ZHQVR5cGUgPT0gWEc0NSkpKSB7Ci0JCQkJCQlpZiAoTW9kZU5vIDw9IDEzKSB7Ci0JCQkJCQkJaWYgKCEodGVtcGJ4ICYKLQkJCQkJCQkgICAgIFNldENSVDJUb1JBTURBQykpIHsKLQkJCQkJCQkJLypDUlQyIG5vdCBuZWVkCi0JCQkJCQkJCSAqIHRvIHN1cHBvcnQqLwotCQkJCQkJCQl0ZW1wYnggJj0KLQkJCQkJCQkJICAoMHgwMEZGIHwKLQkJCQkJCQkJICAoflNldEluU2xhdmVNb2RlKSk7Ci0JCQkJCQkJCXBWQkluZm8tPlNldEZsYWcKLQkJCQkJCQkJCQl8PSBFbmFibGVWQ01vZGU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQogCQkJfQogCiAJCQkvKiBMQ0QrVFYgY2FuJ3Qgc3VwcG9ydCBpbiBzbGF2ZSBtb2RlCkBAIC0zODgzLDIwICszNDE3LDYgQEAKIAkJCSovCiAJCX0KIAotCQlpZiAocFZCSW5mby0+SUZfREVGX0NINzAxNyA9PSAxKSB7Ci0JCQl0ZW1wYnggPSB4Z2lmYl9yZWdfZ2V0KHBWQkluZm8tPlAzZDQsIDB4MzUpOwotCi0JCQlpZiAodGVtcGJ4ICYgVFZPdmVyU2NhbikKLQkJCQl0ZW1wYnggfD0gU2V0Q0hUVk92ZXJTY2FuOwotCQl9Ci0KLQkJaWYgKHBWQkluZm8tPklGX0RFRl9DSDcwMDcgPT0gMSkgeyAvKiBbQmlsbHldIDA3LzA1LzA0ICovCi0JCQl0ZW1wYnggPSB4Z2lmYl9yZWdfZ2V0KHBWQkluZm8tPlAzZDQsIDB4MzUpOwotCi0JCQlpZiAodGVtcGJ4ICYgVFZPdmVyU2NhbikKLQkJCQl0ZW1wYnggfD0gU2V0Q0hUVk92ZXJTY2FuOwotCQl9Ci0KIAkJaWYgKHBWQkluZm8tPklGX0RFRl9MVkRTID09IDApIHsKIAkJCWlmIChwVkJJbmZvLT5WQkluZm8gJiBTZXRDUlQyVG9TQ0FSVCkKIAkJCQl0ZW1wYnggfD0gU2V0UEFMVFY7CkBAIC00MDAzLDkgKzM1MjMsNiBAQAogCiAJLyogRW5kIG9mIExDRDc1ICovCiAKLQlpZiAocFZCSW5mby0+SUZfREVGX09FTVV0aWwgPT0gMSkKLQkJcFZCSW5mby0+TENEVHlwZUluZm8gPSAodGVtcCAmIDB4ZjApID4+IDQ7Ci0KIAlpZiAoIShwVkJJbmZvLT5WQkluZm8gJiAoU2V0Q1JUMlRvTENEIHwgU2V0Q1JUMlRvTENEQSkpKQogCQlyZXR1cm4gMDsKIApAQCAtNDAxNSw5ICszNTMyLDYgQEAKIAogCXRlbXAgJj0gKFNjYWxpbmdMQ0QgfCBMQ0ROb25FeHBhbmRpbmcgfCBMQ0RTeW5jQml0IHwgU2V0UFdERW5hYmxlKTsKIAotCWlmICgocFZCSW5mby0+SUZfREVGX1NjYWxlTENEID09IDEpICYmICh0ZW1wICYgTENETm9uRXhwYW5kaW5nKSkKLQkJdGVtcCAmPSB+RW5hYmxlU2NhbGluZ0xDRDsKLQogCXRlbXBieCB8PSB0ZW1wOwogCiAJTENESWRJbmRleCA9IFhHSV9HZXRMQ0RDYXBQdHIxKHBWQkluZm8pOwpAQCAtNDAzMSwxMSArMzU0NSw2IEBACiAJCX0KIAl9CiAKLQlpZiAocFZCSW5mby0+SUZfREVGX0NINzAxNyA9PSAxKSB7Ci0JCWlmICh0ZW1wYXggJiBMQ0REdWFsTGluaykKLQkJCXRlbXBieCB8PSBTZXRMQ0REdWFsTGluazsKLQl9Ci0KIAlpZiAocFZCSW5mby0+SUZfREVGX0xWRFMgPT0gMCkgewogCQlpZiAoKHBWQkluZm8tPkxDRFJlc0luZm8gPT0gUGFuZWwxNDAweDEwNTApICYmIChwVkJJbmZvLT5WQkluZm8KIAkJCQkmIFNldENSVDJUb0xDRCkgJiYgKE1vZGVObyA+IDB4MTMpICYmIChyZXNpbmZvCkBAIC00MDc3LDE2ICszNTg2LDYgQEAKIAogCXBWQkluZm8tPkxDREluZm8gPSB0ZW1wYng7CiAKLQlpZiAocFZCSW5mby0+SUZfREVGX1BXRCA9PSAxKSB7Ci0JCWlmIChwVkJJbmZvLT5MQ0RJbmZvICYgU2V0UFdERW5hYmxlKSB7Ci0JCQlpZiAoKHBWQkluZm8tPlZCVHlwZSAmIFZCX1hHSTMwMkxWKSB8fAotCQkJICAgIChwVkJJbmZvLT5WQlR5cGUgJiBWQl9YR0kzMDFDKSkgewotCQkJCWlmICghKHRlbXBheCAmIFBXREVuYWJsZSkpCi0JCQkJCXBWQkluZm8tPkxDREluZm8gJj0gflNldFBXREVuYWJsZTsKLQkJCX0KLQkJfQotCX0KLQogCWlmIChwVkJJbmZvLT5JRl9ERUZfTFZEUyA9PSAwKSB7CiAJCWlmICh0ZW1wYXggJiAoTG9ja0xDREJUb0EgfCBTdExDREJUb0EpKSB7CiAJCQlpZiAocFZCSW5mby0+VkJJbmZvICYgU2V0SW5TbGF2ZU1vZGUpIHsKQEAgLTQxNjksMTAyICszNjY4LDYgQEAKIAlyZXR1cm4gMTsKIH0KIAotLyogd2luMjAwMCBNTSBhZGFwdGVyIG5vdCBzdXBwb3J0IHN0YW5kYXJkIG1vZGUhICovCi0KLSNpZiAwCi1zdGF0aWMgdW5zaWduZWQgY2hhciBYR0lOZXdfQ2hlY2tNZW1vcnlTaXplKAotCQlzdHJ1Y3QgeGdpX2h3X2RldmljZV9pbmZvICpId0RldmljZUV4dGVuc2lvbiwKLQkJdW5zaWduZWQgc2hvcnQgTW9kZU5vLAotCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKLQkJc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQotewotCXVuc2lnbmVkIHNob3J0IG1lbW9yeXNpemUsIG1vZGVmbGFnLCB0ZW1wLCB0ZW1wMSwgdG1wOwotCi0JLyoKLQlpZiAoKEh3RGV2aWNlRXh0ZW5zaW9uLT5qQ2hpcFR5cGUgPT0gWEdJXzY1MCkgfHwKLQkoSHdEZXZpY2VFeHRlbnNpb24tPmpDaGlwVHlwZSA9PSBYR0lfNjUwTSkpIHsKLQkJcmV0dXJuIDE7Ci0JfQotCSovCi0KLQlpZiAoTW9kZU5vIDw9IDB4MTMpCi0JCW1vZGVmbGFnID0gcFZCSW5mby0+U01vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5TdF9Nb2RlRmxhZzsKLQllbHNlCi0JCW1vZGVmbGFnID0gcFZCSW5mby0+RU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0KLQkvKiBNb2RlVHlwZSA9IG1vZGVmbGFnJk1vZGVJbmZvRmxhZzsgLy8gR2V0IG1vZGUgdHlwZSAqLwotCi0JbWVtb3J5c2l6ZSA9IG1vZGVmbGFnICYgTWVtb3J5SW5mb0ZsYWc7Ci0JbWVtb3J5c2l6ZSA9IG1lbW9yeXNpemUgPiBNZW1vcnlTaXplU2hpZnQ7Ci0JbWVtb3J5c2l6ZSsrOyAvKiBHZXQgbWVtb3J5IHNpemUgKi8KLQotCXRlbXAgPSB4Z2lmYl9yZWdfZ2V0KHBWQkluZm8tPlAzYzQsIDB4MTQpOyAvKiBHZXQgRFJBTSBTaXplICovCi0JdG1wID0gdGVtcDsKLQotCWlmIChId0RldmljZUV4dGVuc2lvbi0+akNoaXBUeXBlID09IFhHNDApIHsKLQkJLyogbWVtb3J5IHNpemUgcGVyIGNoYW5uZWwgU1IxNFs3OjRdICovCi0JCXRlbXAgPSAxIDw8ICgodGVtcCAmIDB4MEYwKSA+PiA0KTsKLQkJaWYgKCh0bXAgJiAweDBjKSA9PSAweDBDKSB7IC8qIFF1YWwgY2hhbm5lbHMgKi8KLQkJCXRlbXAgPDw9IDI7Ci0JCX0gZWxzZSBpZiAoKHRtcCAmIDB4MGMpID09IDB4MDgpIHsgLyogRHVhbCBjaGFubmVscyAqLwotCQkJdGVtcCA8PD0gMTsKLQkJfQotCX0gZWxzZSBpZiAoSHdEZXZpY2VFeHRlbnNpb24tPmpDaGlwVHlwZSA9PSBYRzQyKSB7Ci0JCS8qIG1lbW9yeSBzaXplIHBlciBjaGFubmVsIFNSMTRbNzo0XSAqLwotCQl0ZW1wID0gMSA8PCAoKHRlbXAgJiAweDBGMCkgPj4gNCk7Ci0JCWlmICgodG1wICYgMHgwNCkgPT0gMHgwNCkgeyAvKiBEdWFsIGNoYW5uZWxzICovCi0JCQl0ZW1wIDw8PSAxOwotCQl9Ci0JfSBlbHNlIGlmIChId0RldmljZUV4dGVuc2lvbi0+akNoaXBUeXBlID09IFhHNDUpIHsKLQkJLyogbWVtb3J5IHNpemUgcGVyIGNoYW5uZWwgU1IxNFs3OjRdICovCi0JCXRlbXAgPSAxIDw8ICgodGVtcCAmIDB4MEYwKSA+PiA0KTsKLQkJaWYgKCh0bXAgJiAweDBjKSA9PSAweDBDKSB7IC8qIFF1YWwgY2hhbm5lbHMgKi8KLQkJCXRlbXAgPDw9IDI7Ci0JCX0gZWxzZSBpZiAoKHRtcCAmIDB4MGMpID09IDB4MDgpIHsgLyogdHJpcGxlIGNoYW5uZWxzICovCi0JCQl0ZW1wMSA9IHRlbXA7Ci0JCQl0ZW1wIDw8PSAxOwotCQkJdGVtcCArPSB0ZW1wMTsKLQkJfSBlbHNlIGlmICgodG1wICYgMHgwYykgPT0gMHgwNCkgeyAvKiBEdWFsIGNoYW5uZWxzICovCi0JCQl0ZW1wIDw8PSAxOwotCQl9Ci0JfQotCWlmICh0ZW1wIDwgbWVtb3J5c2l6ZSkKLQkJcmV0dXJuIDA7Ci0JZWxzZQotCQlyZXR1cm4gMTsKLX0KLSNlbmRpZgotCi0vKgotdm9pZCBYR0lOZXdfSXNMb3dSZXNvbHV0aW9uKHVuc2lnbmVkIHNob3J0IE1vZGVObywKLQkJCSAgICB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKLQkJCSAgICB1bnNpZ25lZCBjaGFyIFhHSU5ld19DaGVja01lbW9yeVNpemUoCi0JCQkJc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sCi0JCQkJdW5zaWduZWQgc2hvcnQgTW9kZU5vLAotCQkJCXVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAotCQkJCXN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKLXsKLQl1bnNpZ25lZCBzaG9ydCBkYXRhIDsKLQl1bnNpZ25lZCBzaG9ydCBNb2RlRmxhZyA7Ci0KLQlkYXRhID0geGdpZmJfcmVnX2dldChwVkJJbmZvLT5QM2M0LCAweDBGKTsKLQlkYXRhICY9IDB4N0Y7Ci0JeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LCAweDBGLCBkYXRhKTsKLQotCWlmIChNb2RlTm8gPiAweDEzKSB7Ci0JCU1vZGVGbGFnID0gcFZCSW5mby0+RU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7Ci0JCWlmICgoTW9kZUZsYWcgJiBIYWxmRENMSykgJiYgKE1vZGVGbGFnICYgRG91YmxlU2Nhbk1vZGUpKSB7Ci0JCQlkYXRhID0geGdpZmJfcmVnX2dldChwVkJJbmZvLT5QM2M0LCAweDBGKTsKLQkJCWRhdGEgfD0gMHg4MDsKLQkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNjNCwgMHgwRiwgZGF0YSk7Ci0JCQlkYXRhID0geGdpZmJfcmVnX2dldChwVkJJbmZvLT5QM2M0LCAweDAxKTsKLQkJCWRhdGEgJj0gMHhGNzsKLQkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNjNCwgMHgwMSwgZGF0YSk7Ci0JCX0KLQl9Ci19Ci0qLwotCiBzdGF0aWMgdW5zaWduZWQgY2hhciBYRzIxR1BJT0RhdGFUcmFuc2Zlcih1bnNpZ25lZCBjaGFyIHVqRGF0ZSkKIHsKIAl1bnNpZ25lZCBjaGFyIHVqUmV0ID0gMDsKQEAgLTQzNDgsMTAgKzM3NTEsNiBAQAogCiAJfQogCi0JLyogW0JpbGx5XSAwNy8wNS8yMyBGb3IgQ0g3MDA3ICovCi0JaWYgKHBWQkluZm8tPklGX0RFRl9DSDcwMDcgPT0gMSkgewotCX0KLQogCWlmIChwWEdJSFdERS0+akNoaXBUeXBlID09IFhHMjcpIHsKIAkJaWYgKHBWQkluZm8tPklGX0RFRl9MVkRTID09IDEpIHsKIAkJCWlmICghKFhHSV9YRzI3R2V0UFNDVmFsdWUocFZCSW5mbykgJiAweDEpKSB7CkBAIC00Mzg4LDEyICszNzg3LDYgQEAKIAkJfQogCX0KIAotCWlmIChwVkJJbmZvLT5JRl9ERUZfQ0g3MDA3ID09IDEpIHsgLyogW0JpbGx5XSAwNy8wNS8yMyBGb3IgQ0g3MDA3ICovCi0JCS8qIGlmIChJc0NINzAwN1RWTW9kZShwVkJJbmZvKSA9PSAwKSAqLwotCQl7Ci0JCX0KLQl9Ci0KIAlpZiAocFhHSUhXREUtPmpDaGlwVHlwZSA9PSBYRzI3KSB7CiAJCWlmICgoWEdJX1hHMjdHZXRQU0NWYWx1ZShwVkJJbmZvKSAmIDB4MikpIHsKIAkJCS8qIExWRFMgYmFja2xpZ2h0IG9mZiAqLwpAQCAtNDQxOCwyMCArMzgxMSw5IEBACiAJCWJyZWFrOwogfQogCi0jaWYgMAotc3RhdGljIHZvaWQgWEdJX1dhaXREaXNwbGF5KHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKLXsKLQl3aGlsZSAoIShpbmIocFZCSW5mby0+UDNkYSkgJiAweDAxKSkKLQkJOwotCXdoaWxlIChpbmIocFZCSW5mby0+UDNkYSkgJiAweDAxKQotCQk7Ci19Ci0jZW5kaWYKLQogc3RhdGljIHZvaWQgWEdJX0F1dG9UaHJlc2hvbGQoc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewotCWlmICghKHBWQkluZm8tPlNldEZsYWcgJiBXaW45eERPU01vZGUpKQotCQl4Z2lmYl9yZWdfb3IocFZCSW5mby0+UGFydDFQb3J0LCAweDAxLCAweDQwKTsKKwl4Z2lmYl9yZWdfb3IocFZCSW5mby0+UGFydDFQb3J0LCAweDAxLCAweDQwKTsKIH0KIAogc3RhdGljIHZvaWQgWEdJX1NhdmVDUlQySW5mbyh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCkBAIC01MDI2LDExICs0NDA4LDYgQEAKIAl0ZW1wY3ggPSAocFZCSW5mby0+VkdBVlQgLSAxKTsKIAl0ZW1wID0gdGVtcGN4ICYgMHgwMEZGOwogCi0JaWYgKHBWQkluZm8tPklGX0RFRl9DSDcwMDUgPT0gMSkgewotCQlpZiAocFZCSW5mby0+VkJJbmZvICYgMHgwQykKLQkJCXRlbXAtLTsKLQl9Ci0KIAl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQxUG9ydCwgMHgwRSwgdGVtcCk7CiAJdGVtcGJ4ID0gcFZCSW5mby0+VkdBVkRFIC0gMTsKIAl0ZW1wID0gdGVtcGJ4ICYgMHgwMEZGOwpAQCAtNjE3NiwyNyArNTU1MywyNCBAQAogCQl0ZW1wYnggPSBwVkJJbmZvLT5WREU7CiAJfQogCi0JaWYgKHRlbXBheCA8IHRlbXBieCkKLQkJcmV0dXJuICZFbmxhcmdlVGFwNFRpbWluZ1swXTsKLQllbHNlIGlmICh0ZW1wYXggPT0gdGVtcGJ4KQotCQlyZXR1cm4gJk5vU2NhbGVUYXA0VGltaW5nWzBdOyAvKiAxOjEgKi8KKwlpZiAodGVtcGF4IDw9IHRlbXBieCkKKwkJcmV0dXJuICZ4Z2lmYl90YXA0X3RpbWluZ1swXTsKIAllbHNlCi0JCVRhcDRUaW1pbmdQdHIgPSBOVFNDVGFwNFRpbWluZzsgLyogTlRTQyAqLworCQlUYXA0VGltaW5nUHRyID0geGdpZmJfbnRzY181MjVfdGFwNF90aW1pbmc7IC8qIE5UU0MgKi8KIAogCWlmIChwVkJJbmZvLT5UVkluZm8gJiBTZXRQQUxUVikKIAkJVGFwNFRpbWluZ1B0ciA9IFBBTFRhcDRUaW1pbmc7CiAKIAlpZiAocFZCSW5mby0+VkJJbmZvICYgU2V0Q1JUMlRvWVBiUHIpIHsKLQkJaWYgKHBWQkluZm8tPlRWSW5mbyAmIFNldFlQYlByTW9kZTUyNWkpCi0JCQlUYXA0VGltaW5nUHRyID0gWVBiUHI1MjVpVGFwNFRpbWluZzsKLQkJaWYgKHBWQkluZm8tPlRWSW5mbyAmIFNldFlQYlByTW9kZTUyNXApCi0JCQlUYXA0VGltaW5nUHRyID0gWVBiUHI1MjVwVGFwNFRpbWluZzsKKwkJaWYgKChwVkJJbmZvLT5UVkluZm8gJiBTZXRZUGJQck1vZGU1MjVpKSB8fAorCQkJKHBWQkluZm8tPlRWSW5mbyAmIFNldFlQYlByTW9kZTUyNXApKQorCQkJVGFwNFRpbWluZ1B0ciA9IHhnaWZiX250c2NfNTI1X3RhcDRfdGltaW5nOwogCQlpZiAocFZCSW5mby0+VFZJbmZvICYgU2V0WVBiUHJNb2RlNzUwcCkKIAkJCVRhcDRUaW1pbmdQdHIgPSBZUGJQcjc1MHBUYXA0VGltaW5nOwogCX0KIAogCWlmIChwVkJJbmZvLT5WQkluZm8gJiBTZXRDUlQyVG9IaVZpc2lvblRWKQotCQlUYXA0VGltaW5nUHRyID0gSGlUVlRhcDRUaW1pbmc7CisJCVRhcDRUaW1pbmdQdHIgPSB4Z2lmYl90YXA0X3RpbWluZzsKIAogCWkgPSAwOwogCXdoaWxlIChUYXA0VGltaW5nUHRyW2ldLkRFICE9IDB4RkZGRikgewpAQCAtNjIxNiwxMCArNTU5MCw2IEBACiAJaWYgKCEocFZCSW5mby0+VkJUeXBlICYgVkJfWEdJMzAxQykpCiAJCXJldHVybjsKIAotI2lmbmRlZiBUYXA0Ci0JeGdpZmJfcmVnX2FuZChwVkJJbmZvLT5QYXJ0MlBvcnQsIDB4NEUsIDB4RUIpOyAvKiBEaXNhYmxlIFRhcDQgKi8KLSNlbHNlICAgICAgICAgICAgLyogVGFwNCBTZXR0aW5nICovCi0KIAlUYXA0VGltaW5nUHRyID0gWEdJX0dldFRhcDRQdHIoMCwgcFZCSW5mbyk7IC8qIFNldCBIb3Jpem9udGFsIFNjYWxpbmcgKi8KIAlmb3IgKGkgPSAweDgwLCBqID0gMDsgaSA8PSAweEJGOyBpKyssIGorKykKIAkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MlBvcnQsIGksIFRhcDRUaW1pbmdQdHItPlJlZ1tqXSk7CkBAIC02MjQxLDcgKzU2MTEsNiBAQAogCWVsc2UKIAkJLyogRW5hYmxlIEguU2NhbGluZyAqLwogCQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlBhcnQyUG9ydCwgMHg0RSwgfjB4MTQsIDB4MTApOwotI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIFhHSV9TZXRHcm91cDModW5zaWduZWQgc2hvcnQgTW9kZU5vLCB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKQEAgLTY3NDIsMjA0ICs2MTExLDEwIEBACiAKIH0KIAotc3RhdGljIHZvaWQgWEdJX1NldFhHMjFMVkRTUGFyYSh1bnNpZ25lZCBzaG9ydCBNb2RlTm8sCi0JCQkJdW5zaWduZWQgc2hvcnQgTW9kZUlkSW5kZXgsCi0JCQkJc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQotewotCXVuc2lnbmVkIGNoYXIgdGVtcCwgTWlzY2RhdGE7Ci0JdW5zaWduZWQgc2hvcnQgeHJlcywgeXJlcywgbW9kZWZsYWcsIHJlc2luZGV4LCBsdmRzdGFibGVpbmRleDsKLQl1bnNpZ25lZCBzaG9ydCBMVkRTSFQsIExWRFNIQlMsIExWRFNIUlMsIExWRFNIUkUsIExWRFNIQkU7Ci0JdW5zaWduZWQgc2hvcnQgTFZEU1ZULCBMVkRTVkJTLCBMVkRTVlJTLCBMVkRTVlJFLCBMVkRTVkJFOwotCXVuc2lnbmVkIHNob3J0IHZhbHVlOwotCi0JbHZkc3RhYmxlaW5kZXggPSBYR0lfR2V0TFZEU09FTVRhYmxlSW5kZXgocFZCSW5mbyk7Ci0KLQl0ZW1wID0gKHVuc2lnbmVkIGNoYXIpICgocFZCSW5mby0+WEcyMV9MVkRTQ2FwTGlzdFtsdmRzdGFibGVpbmRleF0uCi0JCQkJCQlMVkRTX0NhcGFiaWxpdHkgJgotCQkJCShMQ0RQb2xhcml0eSA8PCA4KSkgPj4gOCk7Ci0JdGVtcCAmPSBMQ0RQb2xhcml0eTsKLQlNaXNjZGF0YSA9ICh1bnNpZ25lZCBjaGFyKSBpbmIocFZCSW5mby0+UDNjYyk7Ci0KLQlvdXRiKChNaXNjZGF0YSAmIDB4M0YpIHwgdGVtcCwgcFZCSW5mby0+UDNjMik7Ci0KLQl0ZW1wID0gKHVuc2lnbmVkIGNoYXIpIChwVkJJbmZvLT5YRzIxX0xWRFNDYXBMaXN0W2x2ZHN0YWJsZWluZGV4XS4KLQkJCQkJCUxWRFNfQ2FwYWJpbGl0eSAmIExDRFBvbGFyaXR5KTsKLQkvKiBTUjM1WzddIEZQIFZTeW5jIHBvbGFyaXR5ICovCi0JeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QM2M0LCAweDM1LCB+MHg4MCwgdGVtcCAmIDB4ODApOwotCS8qIFNSMzBbNV0gRlAgSFN5bmMgcG9sYXJpdHkgKi8KLQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzYzQsIDB4MzAsIH4weDIwLCAodGVtcCAmIDB4NDApID4+IDEpOwotCi0JWEdJX1NldFhHMjFGUEJpdHMocFZCSW5mbyk7Ci0JcmVzaW5kZXggPSBYR0lfR2V0UmVzSW5mbyhNb2RlTm8sIE1vZGVJZEluZGV4LCBwVkJJbmZvKTsKLQlpZiAoTW9kZU5vIDw9IDB4MTMpIHsKLQkJeHJlcyA9IHBWQkluZm8tPlN0UmVzSW5mb1tyZXNpbmRleF0uSFRvdGFsOwotCQl5cmVzID0gcFZCSW5mby0+U3RSZXNJbmZvW3Jlc2luZGV4XS5WVG90YWw7Ci0JCS8qIHNpK1N0X1Jlc0luZm8gKi8KLQkJbW9kZWZsYWcgPSBwVkJJbmZvLT5TTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLlN0X01vZGVGbGFnOwotCX0gZWxzZSB7Ci0JCXhyZXMgPSBwVkJJbmZvLT5Nb2RlUmVzSW5mb1tyZXNpbmRleF0uSFRvdGFsOyAvKiB4cmVzLT5heCAqLwotCQl5cmVzID0gcFZCSW5mby0+TW9kZVJlc0luZm9bcmVzaW5kZXhdLlZUb3RhbDsgLyogeXJlcy0+YnggKi8KLQkJLyogc2krU3RfTW9kZUZsYWcgKi8KLQkJbW9kZWZsYWcgPSBwVkJJbmZvLT5FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9Nb2RlRmxhZzsKLQl9Ci0KLQlpZiAoIShtb2RlZmxhZyAmIENoYXJ4OERvdCkpCi0JCXhyZXMgPSB4cmVzICogOCAvIDk7Ci0KLQlMVkRTSFQgPSBwVkJJbmZvLT5YRzIxX0xWRFNDYXBMaXN0W2x2ZHN0YWJsZWluZGV4XS5MVkRTSFQ7Ci0KLQlMVkRTSEJTID0geHJlcyArIChwVkJJbmZvLT5YRzIxX0xWRFNDYXBMaXN0W2x2ZHN0YWJsZWluZGV4XS5MVkRTSERFCi0JCQktIHhyZXMpIC8gMjsKLQlpZiAoKE1vZGVObyA8PSAweDEzKSAmJiAobW9kZWZsYWcgJiBIYWxmRENMSykpCi0JCUxWRFNIQlMgLT0geHJlcyAvIDQ7Ci0KLQlpZiAoTFZEU0hCUyA+IExWRFNIVCkKLQkJTFZEU0hCUyAtPSBMVkRTSFQ7Ci0KLQlMVkRTSFJTID0gTFZEU0hCUyArIHBWQkluZm8tPlhHMjFfTFZEU0NhcExpc3RbbHZkc3RhYmxlaW5kZXhdLkxWRFNIRlA7Ci0JaWYgKExWRFNIUlMgPiBMVkRTSFQpCi0JCUxWRFNIUlMgLT0gTFZEU0hUOwotCi0JTFZEU0hSRSA9IExWRFNIUlMgKyBwVkJJbmZvLT5YRzIxX0xWRFNDYXBMaXN0W2x2ZHN0YWJsZWluZGV4XS5MVkRTSFNZTkM7Ci0JaWYgKExWRFNIUkUgPiBMVkRTSFQpCi0JCUxWRFNIUkUgLT0gTFZEU0hUOwotCi0JTFZEU0hCRSA9IExWRFNIQlMgKyBMVkRTSFQKLQkJCS0gcFZCSW5mby0+WEcyMV9MVkRTQ2FwTGlzdFtsdmRzdGFibGVpbmRleF0uTFZEU0hERTsKLQotCUxWRFNWVCA9IHBWQkluZm8tPlhHMjFfTFZEU0NhcExpc3RbbHZkc3RhYmxlaW5kZXhdLkxWRFNWVDsKLQotCUxWRFNWQlMgPSB5cmVzICsgKHBWQkluZm8tPlhHMjFfTFZEU0NhcExpc3RbbHZkc3RhYmxlaW5kZXhdLkxWRFNWREUKLQkJCS0geXJlcykgLyAyOwotCWlmICgoTW9kZU5vID4gMHgxMykgJiYgKG1vZGVmbGFnICYgRG91YmxlU2Nhbk1vZGUpKQotCQlMVkRTVkJTICs9IHlyZXMgLyAyOwotCi0JaWYgKExWRFNWQlMgPiBMVkRTVlQpCi0JCUxWRFNWQlMgLT0gTFZEU1ZUOwotCi0JTFZEU1ZSUyA9IExWRFNWQlMgKyBwVkJJbmZvLT5YRzIxX0xWRFNDYXBMaXN0W2x2ZHN0YWJsZWluZGV4XS5MVkRTVkZQOwotCWlmIChMVkRTVlJTID4gTFZEU1ZUKQotCQlMVkRTVlJTIC09IExWRFNWVDsKLQotCUxWRFNWUkUgPSBMVkRTVlJTICsgcFZCSW5mby0+WEcyMV9MVkRTQ2FwTGlzdFtsdmRzdGFibGVpbmRleF0uTFZEU1ZTWU5DOwotCWlmIChMVkRTVlJFID4gTFZEU1ZUKQotCQlMVkRTVlJFIC09IExWRFNWVDsKLQotCUxWRFNWQkUgPSBMVkRTVkJTICsgTFZEU1ZUCi0JCQktIHBWQkluZm8tPlhHMjFfTFZEU0NhcExpc3RbbHZkc3RhYmxlaW5kZXhdLkxWRFNWREU7Ci0KLQl0ZW1wID0gKHVuc2lnbmVkIGNoYXIpIHhnaWZiX3JlZ19nZXQocFZCSW5mby0+UDNkNCwgMHgxMSk7Ci0JeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2Q0LCAweDExLCB0ZW1wICYgMHg3Zik7IC8qIFVubG9jayBDUlRDICovCi0KLQlpZiAoIShtb2RlZmxhZyAmIENoYXJ4OERvdCkpCi0JCXhnaWZiX3JlZ19vcihwVkJJbmZvLT5QM2M0LCAweDEsIDB4MSk7Ci0KLQkvKiBIVCBTUjBCWzE6MF0gQ1IwMCAqLwotCXZhbHVlID0gKExWRFNIVCA+PiAzKSAtIDU7Ci0JeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QM2M0LCAweDBCLCB+MHgwMywgKHZhbHVlICYgMHgzMDApID4+IDgpOwotCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNkNCwgMHgwLCAodmFsdWUgJiAweEZGKSk7Ci0KLQkvKiBIQlMgU1IwQls1OjRdIENSMDIgKi8KLQl2YWx1ZSA9IChMVkRTSEJTID4+IDMpIC0gMTsKLQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzYzQsIDB4MEIsIH4weDMwLCAodmFsdWUgJiAweDMwMCkgPj4gNCk7Ci0JeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2Q0LCAweDIsICh2YWx1ZSAmIDB4RkYpKTsKLQotCS8qIEhCRSBTUjBDWzE6MF0gQ1IwNVs3XSBDUjAzWzQ6MF0gKi8KLQl2YWx1ZSA9IChMVkRTSEJFID4+IDMpIC0gMTsKLQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzYzQsIDB4MEMsIH4weDAzLCAodmFsdWUgJiAweEMwKSA+PiA2KTsKLQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzZDQsIDB4MDUsIH4weDgwLCAodmFsdWUgJiAweDIwKSA8PCAyKTsKLQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzZDQsIDB4MDMsIH4weDFGLCB2YWx1ZSAmIDB4MUYpOwotCi0JLyogSFJTIFNSMEJbNzo2XSBDUjA0ICovCi0JdmFsdWUgPSAoTFZEU0hSUyA+PiAzKSArIDI7Ci0JeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QM2M0LCAweDBCLCB+MHhDMCwgKHZhbHVlICYgMHgzMDApID4+IDIpOwotCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNkNCwgMHg0LCAodmFsdWUgJiAweEZGKSk7Ci0KLQkvKiBQYW5lbCBIUlMgU1IyRlsxOjBdIFNSMkVbNzowXSAgKi8KLQl2YWx1ZS0tOwotCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UDNjNCwgMHgyRiwgfjB4MDMsICh2YWx1ZSAmIDB4MzAwKSA+PiA4KTsKLQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsIDB4MkUsICh2YWx1ZSAmIDB4RkYpKTsKLQotCS8qIEhSRSBTUjBDWzJdIENSMDVbNDowXSAqLwotCXZhbHVlID0gKExWRFNIUkUgPj4gMykgKyAyOwotCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UDNjNCwgMHgwQywgfjB4MDQsICh2YWx1ZSAmIDB4MjApID4+IDMpOwotCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UDNkNCwgMHgwNSwgfjB4MUYsIHZhbHVlICYgMHgxRik7Ci0KLQkvKiBQYW5lbCBIUkUgU1IyRls3OjJdICAqLwotCXZhbHVlLS07Ci0JeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QM2M0LCAweDJGLCB+MHhGQywgdmFsdWUgPDwgMik7Ci0KLQkvKiBWVCBTUjBBWzBdIENSMDdbNV1bMF0gQ1IwNiAqLwotCXZhbHVlID0gTFZEU1ZUIC0gMjsKLQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzYzQsIDB4MEEsIH4weDAxLCAodmFsdWUgJiAweDQwMCkgPj4gMTApOwotCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UDNkNCwgMHgwNywgfjB4MjAsICh2YWx1ZSAmIDB4MjAwKSA+PiA0KTsKLQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzZDQsIDB4MDcsIH4weDAxLCAodmFsdWUgJiAweDEwMCkgPj4gOCk7Ci0JeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2Q0LCAweDA2LCAodmFsdWUgJiAweEZGKSk7Ci0KLQkvKiBWQlMgU1IwQVsyXSBDUjA5WzVdIENSMDdbM10gQ1IxNSAqLwotCXZhbHVlID0gTFZEU1ZCUyAtIDE7Ci0JeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QM2M0LCAweDBBLCB+MHgwNCwgKHZhbHVlICYgMHg0MDApID4+IDgpOwotCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UDNkNCwgMHgwOSwgfjB4MjAsICh2YWx1ZSAmIDB4MjAwKSA+PiA0KTsKLQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzZDQsIDB4MDcsIH4weDA4LCAodmFsdWUgJiAweDEwMCkgPj4gNSk7Ci0JeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2Q0LCAweDE1LCAodmFsdWUgJiAweEZGKSk7Ci0KLQkvKiBWQkUgU1IwQVs0XSBDUjE2ICovCi0JdmFsdWUgPSBMVkRTVkJFIC0gMTsKLQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzYzQsIDB4MEEsIH4weDEwLCAodmFsdWUgJiAweDEwMCkgPj4gNCk7Ci0JeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2Q0LCAweDE2LCAodmFsdWUgJiAweEZGKSk7Ci0KLQkvKiBWUlMgU1IwQVszXSBDUjdbN11bMl0gQ1IxMCAqLwotCXZhbHVlID0gTFZEU1ZSUyAtIDE7Ci0JeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QM2M0LCAweDBBLCB+MHgwOCwgKHZhbHVlICYgMHg0MDApID4+IDcpOwotCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UDNkNCwgMHgwNywgfjB4ODAsICh2YWx1ZSAmIDB4MjAwKSA+PiAyKTsKLQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzZDQsIDB4MDcsIH4weDA0LCAodmFsdWUgJiAweDEwMCkgPj4gNik7Ci0JeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2Q0LCAweDEwLCAodmFsdWUgJiAweEZGKSk7Ci0KLQkvKiBQYW5lbCBWUlMgU1IzRlsxOjBdIFNSMzRbNzowXSBTUjMzWzBdICovCi0JeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QM2M0LCAweDNGLCB+MHgwMywgKHZhbHVlICYgMHg2MDApID4+IDkpOwotCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNjNCwgMHgzNCwgKHZhbHVlID4+IDEpICYgMHhGRik7Ci0JeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QM2Q0LCAweDMzLCB+MHgwMSwgdmFsdWUgJiAweDAxKTsKLQotCS8qIFZSRSBTUjBBWzVdIENSMTFbMzowXSAqLwotCXZhbHVlID0gTFZEU1ZSRSAtIDE7Ci0JeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QM2M0LCAweDBBLCB+MHgyMCwgKHZhbHVlICYgMHgxMCkgPDwgMSk7Ci0JeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QM2Q0LCAweDExLCB+MHgwRiwgdmFsdWUgJiAweDBGKTsKLQotCS8qIFBhbmVsIFZSRSBTUjNGWzc6Ml0gKi8vKiBTUjNGWzddIGhhcyB0byBiZSAwLCBoL3cgYnVnICovCi0JeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QM2M0LCAweDNGLCB+MHhGQywgKHZhbHVlIDw8IDIpICYgMHg3Qyk7Ci0KLQlmb3IgKHRlbXAgPSAwLCB2YWx1ZSA9IDA7IHRlbXAgPCAzOyB0ZW1wKyspIHsKLQotCQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzYzQsIDB4MzEsIH4weDMwLCB2YWx1ZSk7Ci0JCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNjNCwKLQkJCSAgICAgIDB4MkIsCi0JCQkgICAgICBwVkJJbmZvLT5YRzIxX0xWRFNDYXBMaXN0W2x2ZHN0YWJsZWluZGV4XS4KLQkJCQkJCVZDTEtEYXRhMSk7Ci0JCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNjNCwKLQkJCSAgICAgIDB4MkMsCi0JCQkgICAgICBwVkJJbmZvLT5YRzIxX0xWRFNDYXBMaXN0W2x2ZHN0YWJsZWluZGV4XS4KLQkJCQkJCVZDTEtEYXRhMik7Ci0JCXZhbHVlICs9IDB4MTA7Ci0JfQotCi0JaWYgKCEobW9kZWZsYWcgJiBDaGFyeDhEb3QpKSB7Ci0JCWluYihwVkJJbmZvLT5QM2RhKTsgLyogcmVzZXQgM2RhICovCi0JCW91dGIoMHgxMywgcFZCSW5mby0+UDNjMCk7IC8qIHNldCBpbmRleCAqLwotCQkvKiBzZXQgZGF0YSwgcGFubmluZyA9IDAsIHNoaWZ0IGxlZnQgMSBkb3QqLwotCQlvdXRiKDB4MDAsIHBWQkluZm8tPlAzYzApOwotCi0JCWluYihwVkJJbmZvLT5QM2RhKTsgLyogRW5hYmxlIEF0dHJpYnV0ZSAqLwotCQlvdXRiKDB4MjAsIHBWQkluZm8tPlAzYzApOwotCi0JCWluYihwVkJJbmZvLT5QM2RhKTsgLyogcmVzZXQgM2RhICovCi0JfQotCi19Ci0KLS8qIG5vIHNoYWRvdyBjYXNlICovCi1zdGF0aWMgdm9pZCBYR0lfU2V0WEcyN0xWRFNQYXJhKHVuc2lnbmVkIHNob3J0IE1vZGVObywKLQkJCQl1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKLQkJCQlzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCitzdGF0aWMgdm9pZCB4Z2lmYl9zZXRfbHZkcyhpbnQgY2hpcF9pZCwKKwkJCSAgIHVuc2lnbmVkIHNob3J0IE1vZGVObywKKwkJCSAgIHVuc2lnbmVkIHNob3J0IE1vZGVJZEluZGV4LAorCQkJICAgc3RydWN0IHZiX2RldmljZV9pbmZvICpwVkJJbmZvKQogewogCXVuc2lnbmVkIGNoYXIgdGVtcCwgTWlzY2RhdGE7CiAJdW5zaWduZWQgc2hvcnQgeHJlcywgeXJlcywgbW9kZWZsYWcsIHJlc2luZGV4LCBsdmRzdGFibGVpbmRleDsKQEAgLTY5NjMsNyArNjEzOCwxMSBAQAogCS8qIFNSMzBbNV0gRlAgSFN5bmMgcG9sYXJpdHkgKi8KIAl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzYzQsIDB4MzAsIH4weDIwLCAodGVtcCAmIDB4NDApID4+IDEpOwogCi0JWEdJX1NldFhHMjdGUEJpdHMocFZCSW5mbyk7CisJaWYgKGNoaXBfaWQgPT0gWEcyNykKKwkJWEdJX1NldFhHMjdGUEJpdHMocFZCSW5mbyk7CisJZWxzZQorCQlYR0lfU2V0WEcyMUZQQml0cyhwVkJJbmZvKTsKKwogCXJlc2luZGV4ID0gWEdJX0dldFJlc0luZm8oTW9kZU5vLCBNb2RlSWRJbmRleCwgcFZCSW5mbyk7CiAJaWYgKE1vZGVObyA8PSAweDEzKSB7CiAJCXhyZXMgPSBwVkJJbmZvLT5TdFJlc0luZm9bcmVzaW5kZXhdLkhUb3RhbDsKQEAgLTcwOTAsOSArNjI2OSwxOCBAQAogCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UDNkNCwgMHgwNywgfjB4MDQsICh2YWx1ZSAmIDB4MTAwKSA+PiA2KTsKIAl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzZDQsIDB4MTAsICh2YWx1ZSAmIDB4RkYpKTsKIAotCS8qIFBhbmVsIFZSUyBTUjM1WzI6MF0gU1IzNFs3OjBdICovCi0JeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QM2M0LCAweDM1LCB+MHgwNywgKHZhbHVlICYgMHg3MDApID4+IDgpOwotCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNjNCwgMHgzNCwgdmFsdWUgJiAweEZGKTsKKwlpZiAoY2hpcF9pZCA9PSBYRzI3KSB7CisJCS8qIFBhbmVsIFZSUyBTUjM1WzI6MF0gU1IzNFs3OjBdICovCisJCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UDNjNCwgMHgzNSwgfjB4MDcsCisJCQkJCSh2YWx1ZSAmIDB4NzAwKSA+PiA4KTsKKwkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2M0LCAweDM0LCB2YWx1ZSAmIDB4RkYpOworCX0gZWxzZSB7CisJCS8qIFBhbmVsIFZSUyBTUjNGWzE6MF0gU1IzNFs3OjBdIFNSMzNbMF0gKi8KKwkJeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QM2M0LCAweDNGLCB+MHgwMywKKwkJCQkJKHZhbHVlICYgMHg2MDApID4+IDkpOworCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzYzQsIDB4MzQsICh2YWx1ZSA+PiAxKSAmIDB4RkYpOworCQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzZDQsIDB4MzMsIH4weDAxLCB2YWx1ZSAmIDB4MDEpOworCX0KIAogCS8qIFZSRSBTUjBBWzVdIENSMTFbMzowXSAqLwogCXZhbHVlID0gTFZEU1ZSRSAtIDE7CkBAIC03MTAwLDcgKzYyODgsMTMgQEAKIAl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzZDQsIDB4MTEsIH4weDBGLCB2YWx1ZSAmIDB4MEYpOwogCiAJLyogUGFuZWwgVlJFIFNSM0ZbNzoyXSAqLwotCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UDNjNCwgMHgzRiwgfjB4RkMsICh2YWx1ZSA8PCAyKSAmIDB4RkMpOworCWlmIChjaGlwX2lkID09IFhHMjcpCisJCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UDNjNCwgMHgzRiwgfjB4RkMsCisJCQkJCSh2YWx1ZSA8PCAyKSAmIDB4RkMpOworCWVsc2UKKwkJLyogU1IzRls3XSBoYXMgdG8gYmUgMCwgaC93IGJ1ZyAqLworCQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzYzQsIDB4M0YsIH4weEZDLAorCQkJCQkodmFsdWUgPDwgMikgJiAweDdDKTsKIAogCWZvciAodGVtcCA9IDAsIHZhbHVlID0gMDsgdGVtcCA8IDM7IHRlbXArKykgewogCkBAIC03MjA5LDMwICs2NDAzLDYgQEAKIHsKIAl1bnNpZ25lZCBzaG9ydCB0ZW1wYWggPSAwOwogCi0JaWYgKHBWQkluZm8tPlNldEZsYWcgPT0gV2luOXhET1NNb2RlKQotCQlyZXR1cm47Ci0KLQkvKgotCWlmIChDSDcwMTcpIHsKLQkJaWYgKCEocFZCSW5mby0+VkJJbmZvICYKLQkJICAgIChTZXRDUlQyVG9MQ0QgfCBTZXRDUlQydG9MQ0RBKSkgfHwKLQkJICAgIChYR0lfRGlzYWJsZUNoSVNMQ0QocFZCSW5mbykpKSB7Ci0JCQlpZiAoIVhHSV9Jc0xDRE9OKHBWQkluZm8pKSB7Ci0JCQkJaWYgKERJU0NIQVJHRSkgewotCQkJCQl0ZW1wYnggPSBYR0lOZXdfR2V0Q0g3MDA1KDB4NjEpOwotCQkJCQkvLyBmaXJzdCB0aW1lIHdlIHBvd2VyIHVwCi0JCQkJCWlmICh0ZW1wYnggPCAweDAxKQotCQkJCQkJLy8gYW5kIGRpc2FibGUgcG93ZXIgc2VxdWVuY2UKLQkJCQkJCVhHSU5ld19TZXRDSDcwMDUoMHgwMDY2KTsKLQkJCQkJZWxzZQotCQkJCQkJLy8gbGVhdmUgVkREIG9uIC0gZGlzYWJsZSBwb3dlcgotCQkJCQkJWEdJTmV3X1NldENINzAwNSgweDVmNjYpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkqLwotCiAJaWYgKHBWQkluZm8tPlZCVHlwZSAmIChWQl9YR0kzMDFCIHwgVkJfWEdJMzAyQiB8IFZCX1hHSTMwMUxWCiAJCQl8IFZCX1hHSTMwMkxWIHwgVkJfWEdJMzAxQykpIHsKIAkJdGVtcGFoID0gMHgzRjsKQEAgLTc3MTIsMjggKzY4ODIsMTYgQEAKIAljYXNlIDB4MDI6CiAJY2FzZSAweDA1OgogCWNhc2UgMHgwRDoKLQkJZmlsdGVyUHRyID0gUEFMTVlGaWx0ZXIxOwotCQlicmVhazsKLQogCWNhc2UgMHgwMzoKLQkJZmlsdGVyUHRyID0gUEFMTllGaWx0ZXIxOworCQlmaWx0ZXJQdHIgPSB4Z2lmYl9wYWxtbl95ZmlsdGVyMTsKIAkJYnJlYWs7CiAKIAljYXNlIDB4MDg6CiAJY2FzZSAweDBDOgotCQlmaWx0ZXJQdHIgPSBOVFNDWUZpbHRlcjI7Ci0JCWJyZWFrOwotCiAJY2FzZSAweDBBOgotCQlmaWx0ZXJQdHIgPSBQQUxNWUZpbHRlcjI7Ci0JCWJyZWFrOwotCiAJY2FzZSAweDBCOgotCQlmaWx0ZXJQdHIgPSBQQUxOWUZpbHRlcjI7Ci0JCWJyZWFrOwotCiAJY2FzZSAweDA5OgotCQlmaWx0ZXJQdHIgPSBQQUxZRmlsdGVyMjsKKwkJZmlsdGVyUHRyID0geGdpZmJfeWZpbHRlcjI7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTc3ODIsOSArNjk0MCw2IEBACiAJCQkgICAgICB1bnNpZ25lZCBzaG9ydCBNb2RlSWRJbmRleCwKIAkJCSAgICAgIHN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKLQlpZiAocFZCSW5mby0+U2V0RmxhZyAmIFdpbjl4RE9TTW9kZSkKLQkJcmV0dXJuOwotCiAJLyogR2V0UGFydDFJTygpOyAqLwogCVhHSV9TZXREZWxheUNvbXAocFZCSW5mbyk7CiAKQEAgLTgwMzMsMTMgKzcxODgsNiBAQAogCiB9CiAKLXZvaWQgWEdJX09wZW5DUlRDKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKkh3RGV2aWNlRXh0ZW5zaW9uLAotCQlzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gKnBWQkluZm8pCi17Ci0JdW5zaWduZWQgc2hvcnQgdGVtcGJ4OwotCXRlbXBieCA9IDA7Ci19Ci0KIHZvaWQgWEdJX1VuTG9ja0NSVDIoc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyAqSHdEZXZpY2VFeHRlbnNpb24sCiAJCXN0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqcFZCSW5mbykKIHsKQEAgLTgxMzcsMTMgKzcyODUsNiBAQAogCWVsc2UKIAkJbW9kZWZsYWcgPSBwVkJJbmZvLT5FTW9kZUlEVGFibGVbTW9kZUlkSW5kZXhdLkV4dF9Nb2RlRmxhZzsKIAotCWlmIChwVkJJbmZvLT5JRl9ERUZfQ0g3MDA1ID09IDEpIHsKLQkJaWYgKHBWQkluZm8tPlZCSW5mbyAmIFNldENSVDJUb1RWKSB7Ci0JCQlpZiAobW9kZWZsYWcgJiBIYWxmRENMSykKLQkJCQlyZXR1cm4gMDsKLQkJfQotCX0KLQogCWlmIChNb2RlTm8gPCAweDE0KQogCQlyZXR1cm4gMHhGRkZGOwogCkBAIC04MTU4LDExICs3Mjk5LDYgQEAKIAkJaW5kZXgtLTsKIAogCWlmIChwVkJJbmZvLT5TZXRGbGFnICYgUHJvZ3JhbW1pbmdDUlQyKSB7Ci0JCWlmIChwVkJJbmZvLT5JRl9ERUZfQ0g3MDA1ID09IDEpIHsKLQkJCWlmIChwVkJJbmZvLT5WQkluZm8gJiBTZXRDUlQyVG9UVikKLQkJCQlpbmRleCA9IDA7Ci0JCX0KLQogCQlpZiAocFZCSW5mby0+VkJJbmZvICYgKFNldENSVDJUb0xDRCB8IFNldENSVDJUb0xDREEpKSB7CiAJCQlpZiAocFZCSW5mby0+SUZfREVGX0xWRFMgPT0gMCkgewogCQkJCWlmIChwVkJJbmZvLT5WQlR5cGUgJiAoVkJfWEdJMzAxQiB8IFZCX1hHSTMwMkIKQEAgLTg0MDEsMTYgKzc1MzcsNiBAQAogewogCXVuc2lnbmVkIHNob3J0IHRlbXBhaDsKIAotCWlmIChwVkJJbmZvLT5TZXRGbGFnID09IFdpbjl4RE9TTW9kZSkgewotCQlpZiAocFZCSW5mby0+VkJUeXBlICYgKFZCX1hHSTMwMUIgfCBWQl9YR0kzMDJCIHwgVkJfWEdJMzAxTFYKLQkJCQl8IFZCX1hHSTMwMkxWIHwgVkJfWEdJMzAxQykpIHsKLQkJCVhHSV9EaXNwbGF5T24oSHdEZXZpY2VFeHRlbnNpb24sIHBWQkluZm8pOwotCQkJcmV0dXJuOwotCQl9IGVsc2UKLQkJCS8qIExWRFMgb3IgQ0g3MDE3ICovCi0JCQlyZXR1cm47Ci0JfQotCiAJaWYgKHBWQkluZm8tPlZCVHlwZSAmIChWQl9YR0kzMDFCIHwgVkJfWEdJMzAyQiB8IFZCX1hHSTMwMUxWCiAJCQl8IFZCX1hHSTMwMkxWIHwgVkJfWEdJMzAxQykpIHsKIAkJaWYgKCEocFZCSW5mby0+U2V0RmxhZyAmIERpc2FibGVDaEEpKSB7CkBAIC04NTExLDExICs3NjM3LDYgQEAKIAkJLyogRW5hYmxlUGFydDRfMUYgKi8KIAkJeGdpZmJfcmVnX29yKHBWQkluZm8tPlBhcnQ0UG9ydCwgMHgxRiwgdGVtcGFoKTsKIAotCQlpZiAocFZCSW5mby0+U2V0RmxhZyAmIFdpbjl4RE9TTW9kZSkgewotCQkJWEdJX0Rpc3BsYXlPbihId0RldmljZUV4dGVuc2lvbiwgcFZCSW5mbyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQogCQlpZiAoIShwVkJJbmZvLT5TZXRGbGFnICYgRGlzYWJsZUNoQSkpIHsKIAkJCVhHSV9WQkxvbmdXYWl0KHBWQkluZm8pOwogCQkJaWYgKCEocFZCSW5mby0+U2V0RmxhZyAmIEdhdGluZ0NSVCkpIHsKQEAgLTg2MjksMjEgKzc3NTAsMTIgQEAKIAkJCVhHSV9VcGRhdGVYRzIxQ1JUQyhNb2RlTm8sIHBWQkluZm8sCiAJCQkJCVJlZnJlc2hSYXRlVGFibGVJbmRleCk7CiAKLQkJCWlmIChId0RldmljZUV4dGVuc2lvbi0+akNoaXBUeXBlID09IFhHMjcpCi0JCQkJWEdJX1NldFhHMjdMQ0QocFZCSW5mbywgUmVmcmVzaFJhdGVUYWJsZUluZGV4LAotCQkJCQkJTW9kZU5vKTsKLQkJCWVsc2UKLQkJCQlYR0lfU2V0WEcyMUxDRChwVkJJbmZvLCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsCi0JCQkJCQlNb2RlTm8pOworCQkJeGdpZmJfc2V0X2xjZChId0RldmljZUV4dGVuc2lvbi0+akNoaXBUeXBlLAorCQkJCQlwVkJJbmZvLCBSZWZyZXNoUmF0ZVRhYmxlSW5kZXgsIE1vZGVObyk7CiAKLQkJCWlmIChwVkJJbmZvLT5JRl9ERUZfTFZEUyA9PSAxKSB7Ci0JCQkJaWYgKEh3RGV2aWNlRXh0ZW5zaW9uLT5qQ2hpcFR5cGUgPT0gWEcyNykKLQkJCQkJWEdJX1NldFhHMjdMVkRTUGFyYShNb2RlTm8sCi0JCQkJCQkJTW9kZUlkSW5kZXgsIHBWQkluZm8pOwotCQkJCWVsc2UKLQkJCQkJWEdJX1NldFhHMjFMVkRTUGFyYShNb2RlTm8sCi0JCQkJCQkJTW9kZUlkSW5kZXgsIHBWQkluZm8pOwotCQkJfQorCQkJaWYgKHBWQkluZm8tPklGX0RFRl9MVkRTID09IDEpCisJCQkJeGdpZmJfc2V0X2x2ZHMoSHdEZXZpY2VFeHRlbnNpb24tPmpDaGlwVHlwZSwKKwkJCQkJCU1vZGVObywgTW9kZUlkSW5kZXgsIHBWQkluZm8pOwogCQkJLyogUC4gT04gKi8KIAkJCS8qIHhnaWZiX3JlZ19vcihwVkJJbmZvLT5QM2Q0LCAweDQ4LCAweDIwKTsgKi8KIAkJfQpAQCAtODY3MSwxNCArNzc4Myw3IEBACiAJcFZCSW5mby0+Uk9NQWRkciA9IEh3RGV2aWNlRXh0ZW5zaW9uLT5walZpcnR1YWxSb21CYXNlOwogCXBWQkluZm8tPkJhc2VBZGRyID0gKHVuc2lnbmVkIGxvbmcpIEh3RGV2aWNlRXh0ZW5zaW9uLT5waklPQWRkcmVzczsKIAlwVkJJbmZvLT5JRl9ERUZfTFZEUyA9IDA7Ci0JcFZCSW5mby0+SUZfREVGX0NINzAwNSA9IDA7CiAJcFZCSW5mby0+SUZfREVGX0xDREEgPSAxOwotCXBWQkluZm8tPklGX0RFRl9DSDcwMTcgPSAwOwotCXBWQkluZm8tPklGX0RFRl9DSDcwMDcgPSAwOyAvKiBbQmlsbHldIDIwMDcvMDUvMTQgKi8KLQlwVkJJbmZvLT5JRl9ERUZfVmlkZW9DYXB0dXJlID0gMDsKLQlwVkJJbmZvLT5JRl9ERUZfU2NhbGVMQ0QgPSAwOwotCXBWQkluZm8tPklGX0RFRl9PRU1VdGlsID0gMDsKLQlwVkJJbmZvLT5JRl9ERUZfUFdEID0gMDsKIAogCWlmIChId0RldmljZUV4dGVuc2lvbi0+akNoaXBUeXBlID49IFhHMjApIHsgLyoga3VrdSAyMDA0LzA2LzI1ICovCiAJCXBWQkluZm8tPklGX0RFRl9ZUGJQciA9IDA7CkBAIC04NzQ4LDcgKzc4NTMsNiBAQAogCQlYR0lfR2V0VFZJbmZvKE1vZGVObywgTW9kZUlkSW5kZXgsIHBWQkluZm8pOwogCQlYR0lfR2V0TENESW5mbyhNb2RlTm8sIE1vZGVJZEluZGV4LCBwVkJJbmZvKTsKIAkJWEdJX0Rpc2FibGVCcmlkZ2UoSHdEZXZpY2VFeHRlbnNpb24sIHBWQkluZm8pOwotCQkvKiBYR0lfT3BlbkNSVEMoSHdEZXZpY2VFeHRlbnNpb24sIHBWQkluZm8pOyAqLwogCiAJCWlmIChwVkJJbmZvLT5WQkluZm8gJiAoU2V0U2ltdVNjYW5Nb2RlIHwgU2V0Q1JUMlRvTENEQSkpIHsKIAkJCVhHSV9TZXRDUlQxR3JvdXAoSHdEZXZpY2VFeHRlbnNpb24sIE1vZGVObywKQEAgLTg4MDgsOCArNzkxMiw3IEBACiAJCX0KIAogCQlwVkJJbmZvLT5TZXRGbGFnID0gMDsKLQkJaWYgKHBWQkluZm8tPklGX0RFRl9DSDcwMDcgIT0gMSkKLQkJCXBWQkluZm8tPlZCSW5mbyA9IERpc2FibGVDUlQyRGlzcGxheTsKKwkJcFZCSW5mby0+VkJJbmZvID0gRGlzYWJsZUNSVDJEaXNwbGF5OwogCiAJCVhHSV9EaXNwbGF5T2ZmKEh3RGV2aWNlRXh0ZW5zaW9uLCBwVkJJbmZvKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX3N0cnVjdC5oIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX3N0cnVjdC5oCmluZGV4IDM3N2QyN2MuLmY5YWRlNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9zdHJ1Y3QuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfc3RydWN0LmgKQEAgLTEsMTYgKzEsNiBAQAogI2lmbmRlZiBfVkJfU1RSVUNUXwogI2RlZmluZSBfVkJfU1RSVUNUXwogCi0jaWZkZWYgX0lOSVRORVdfCi0jZGVmaW5lIEVYVEVSTgotI2Vsc2UKLSNkZWZpbmUgRVhURVJOIGV4dGVybgotI2VuZGlmCi0KLXN0cnVjdCBYR0lfUGFuZWxEZWxheVRibFN0cnVjdCB7Ci0JdW5zaWduZWQgY2hhciB0aW1lclsyXTsKLX07Ci0KIHN0cnVjdCBYR0lfTENERGF0YVN0cnVjdCB7CiAJdW5zaWduZWQgc2hvcnQgUlZCSENNQVg7CiAJdW5zaWduZWQgc2hvcnQgUlZCSENGQUNUOwpAQCAtNDUsMjQgKzM1LDYgQEAKIAl1bnNpZ25lZCBjaGFyIFJZNENPRTsKIH07CiAKLXN0cnVjdCBYR0lfTFZEU0RhdGFTdHJ1Y3QgewotCXVuc2lnbmVkIHNob3J0IFZHQUhUOwotCXVuc2lnbmVkIHNob3J0IFZHQVZUOwotCXVuc2lnbmVkIHNob3J0IExDREhUOwotCXVuc2lnbmVkIHNob3J0IExDRFZUOwotfTsKLQotc3RydWN0IFhHSV9MVkRTRGVzU3RydWN0IHsKLQl1bnNpZ25lZCBzaG9ydCBMQ0RIREVTOwotCXVuc2lnbmVkIHNob3J0IExDRFZERVM7Ci19OwotCi1zdHJ1Y3QgWEdJX0xWRFNDUlQxRGF0YVN0cnVjdCB7Ci0JdW5zaWduZWQgY2hhciBDUlsxNV07Ci19OwotCi0vKmFkZCBmb3IgTENEQSovCi0KIHN0cnVjdCBYR0lfU3RTdHJ1Y3QgewogCXVuc2lnbmVkIGNoYXIgU3RfTW9kZUlEOwogCXVuc2lnbmVkIHNob3J0IFN0X01vZGVGbGFnOwpAQCAtMTQ2LDEwICsxMTgsNiBAQAogCXVuc2lnbmVkIGNoYXIgIFlDaGFyOwogfTsKIAotc3RydWN0IFhHSV9MQ0ROQkRlc1N0cnVjdCB7Ci0JdW5zaWduZWQgY2hhciBOQlsxMl07Ci19OwotCiAvKmFkZCBmb3IgbmV3IFVOSVZHQUJJT1MqLwogc3RydWN0IFhHSV9MQ0REZXNTdHJ1Y3QgewogCXVuc2lnbmVkIHNob3J0IExDREhERVM7CkBAIC0xNjUsMTIgKzEzMyw2IEBACiAJdW5zaWduZWQgc2hvcnQgREFUQVBUUjsKIH07CiAKLXN0cnVjdCBYR0lfVFZUYWJsRGF0YVN0cnVjdCB7Ci0JdW5zaWduZWQgc2hvcnQgTUFTSzsKLQl1bnNpZ25lZCBzaG9ydCBDQVA7Ci0JdW5zaWduZWQgc2hvcnQgREFUQVBUUjsKLX07Ci0KIHN0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCB7CiAJdW5zaWduZWQgc2hvcnQgTENESERFUzsKIAl1bnNpZ25lZCBzaG9ydCBMQ0RIUlM7CkBAIC0yNDYsMjIgKzIwOCwxMCBAQAogCXVuc2lnbmVkIGNoYXIgZGF0YVs3XTsKIH07CiAKLXN0cnVjdCBYR0lfQ0g3MDA3VFZfVGltaW5nSFN0cnVjdCB7Ci0JdW5zaWduZWQgY2hhciBkYXRhWzEwXTsKLX07Ci0KLXN0cnVjdCBYR0lfQ0g3MDA3VFZfVGltaW5nVlN0cnVjdCB7Ci0JdW5zaWduZWQgY2hhciBkYXRhWzEwXTsKLX07Ci0KIHN0cnVjdCBYR0lfWEcyMUNSVDFTdHJ1Y3QgewogCXVuc2lnbmVkIGNoYXIgTW9kZUlELCBDUjAyLCBDUjAzLCBDUjE1LCBDUjE2OwogfTsKIAotc3RydWN0IFhHSTMzMF9DSFRWUmVnRGF0YVN0cnVjdCB7Ci0JdW5zaWduZWQgY2hhciBSZWdbMTZdOwotfTsKLQogc3RydWN0IFhHSTMzMF9MQ0RDYXBTdHJ1Y3QgewogCXVuc2lnbmVkIGNoYXIJTENEX0lEOwogCXVuc2lnbmVkIHNob3J0CUxDRF9DYXBhYmlsaXR5OwpAQCAtMzI0LDE4ICsyNzQsNiBAQAogCXVuc2lnbmVkIGNoYXIgIFJlZ1s2NF07ICAgLyogQzAtRkYgKi8KIH07CiAKLXN0cnVjdCBYR0lfTmV3X1N0YW5kVGFibGVTdHJ1Y3QgewotCXVuc2lnbmVkIGNoYXIgIENSVF9DT0xTOwotCXVuc2lnbmVkIGNoYXIgIFJPV1M7Ci0JdW5zaWduZWQgY2hhciAgQ0hBUl9IRUlHSFQ7Ci0JdW5zaWduZWQgc2hvcnQgQ1JUX0xFTjsKLQl1bnNpZ25lZCBjaGFyICBTUls0XTsKLQl1bnNpZ25lZCBjaGFyICBNSVNDOwotCXVuc2lnbmVkIGNoYXIgIENSVENbMHgxOV07Ci0JdW5zaWduZWQgY2hhciAgQVRUUlsweDE0XTsKLQl1bnNpZ25lZCBjaGFyICBHUkNbOV07Ci19OwotCiBzdHJ1Y3QgdmJfZGV2aWNlX2luZm8gewogCXVuc2lnbmVkIGNoYXIgIElTWFBET1M7CiAJdW5zaWduZWQgbG9uZyAgIFAzYzQsIFAzZDQsIFAzYzAsIFAzY2UsIFAzYzIsIFAzY2M7CkBAIC0zNTAsMTIgKzI4OCwxMCBAQAogCXVuc2lnbmVkIHNob3J0ICAgTW9kZVR5cGU7CiAJLyogLElGX0RFRl9GU1ROOyBhZGQgZm9yIGRzdG4gKi8KIAl1bnNpZ25lZCBzaG9ydCAgIElGX0RFRl9MVkRTLCBJRl9ERUZfVFJVTVBJT04sIElGX0RFRl9EU1ROOwotCXVuc2lnbmVkIHNob3J0ICAgSUZfREVGX0NSVDJNb25pdG9yLCBJRl9ERUZfVmlkZW9DYXB0dXJlOwotCXVuc2lnbmVkIHNob3J0ICAgSUZfREVGX0xDREEsIElGX0RFRl9DSDcwMTcsIElGX0RFRl9ZUGJQciwKLQkJCSBJRl9ERUZfU2NhbGVMQ0QsIElGX0RFRl9PRU1VdGlsLCBJRl9ERUZfUFdEOworCXVuc2lnbmVkIHNob3J0ICAgSUZfREVGX0NSVDJNb25pdG9yOworCXVuc2lnbmVkIHNob3J0ICAgSUZfREVGX0xDREEsIElGX0RFRl9ZUGJQcjsKIAl1bnNpZ25lZCBzaG9ydCAgIElGX0RFRl9FeHBMaW5rOwotCXVuc2lnbmVkIHNob3J0ICAgSUZfREVGX0NINzAwNSwgSUZfREVGX0hpVmlzaW9uOwotCXVuc2lnbmVkIHNob3J0ICAgSUZfREVGX0NINzAwNzsgLyogQmlsbHkgMjAwNy8wNS8wMyAqLworCXVuc2lnbmVkIHNob3J0ICAgSUZfREVGX0hpVmlzaW9uOwogCXVuc2lnbmVkIHNob3J0ICAgTENEUmVzSW5mbywgTENEVHlwZUluZm8sIFZCVHlwZTsvKjMwMWIqLwogCXVuc2lnbmVkIHNob3J0ICAgVkJJbmZvLCBUVkluZm8sIExDREluZm8sIFNldF9WR0FUeXBlOwogCXVuc2lnbmVkIHNob3J0ICAgVkJFeHRJbmZvOy8qMzAxbHYqLwpAQCAtMzY0LDcgKzMwMCw3IEBACiAJdW5zaWduZWQgc2hvcnQgICBTZWxlY3RDUlQyUmF0ZTsKIAogCXVuc2lnbmVkIGNoYXIgKlJPTUFkZHI7Ci0JdW5zaWduZWQgY2hhciAqRkJBZGRyOworCXZvaWQgX19pb21lbSAqRkJBZGRyOwogCXVuc2lnbmVkIGxvbmcgQmFzZUFkZHI7CiAJdW5zaWduZWQgbG9uZyBSZWxJTzsKIApAQCAtNDIwLDEwICszNTYsNiBAQAogCiAJdW5zaWduZWQgY2hhciAgICpYR0lfVFZEZWxheUxpc3Q7CiAJdW5zaWduZWQgY2hhciAgICpYR0lfVFZEZWxheUxpc3QyOwotCXVuc2lnbmVkIGNoYXIgICAqQ0hUVlZDTEtVTlRTQzsKLQl1bnNpZ25lZCBjaGFyICAgKkNIVFZWQ0xLT05UU0M7Ci0JdW5zaWduZWQgY2hhciAgICpDSFRWVkNMS1VQQUw7Ci0JdW5zaWduZWQgY2hhciAgICpDSFRWVkNMS09QQUw7CiAJdW5zaWduZWQgY2hhciAgICpOVFNDVGltaW5nOwogCXVuc2lnbmVkIGNoYXIgICAqUEFMVGltaW5nOwogCXVuc2lnbmVkIGNoYXIgICAqSGlUVkV4dFRpbWluZzsKQEAgLTQ2MCwyMyArMzkyLDEwIEBACiAJc3RydWN0IFhHSV9TdFJlc0luZm9TdHJ1Y3QgICAqU3RSZXNJbmZvOwogCXN0cnVjdCBYR0lfTW9kZVJlc0luZm9TdHJ1Y3QgKk1vZGVSZXNJbmZvOwogCXN0cnVjdCBYR0lfWEcyMUNSVDFTdHJ1Y3QJICAqVXBkYXRlQ1JUMTsKKworCWludCByYW1fdHlwZTsKKwlpbnQgcmFtX2NoYW5uZWw7CisJaW50IHJhbV9idXM7CiB9OyAgLyogX3N0cnVjdCB2Yl9kZXZpY2VfaW5mbyAqLwogCi0KLXN0cnVjdCBUaW1pbmdJbmZvIHsKLQl1bnNpZ25lZCBzaG9ydCBIb3Jpem9udGFsX0FDVElWRTsKLQl1bnNpZ25lZCBzaG9ydCBIb3Jpem9udGFsX0ZQOwotCXVuc2lnbmVkIHNob3J0IEhvcml6b250YWxfU1lOQzsKLQl1bnNpZ25lZCBzaG9ydCBIb3Jpem9udGFsX0JQOwotCXVuc2lnbmVkIHNob3J0IFZlcnRpY2FsX0FDVElWRTsKLQl1bnNpZ25lZCBzaG9ydCBWZXJ0aWNhbF9GUDsKLQl1bnNpZ25lZCBzaG9ydCBWZXJ0aWNhbF9TWU5DOwotCXVuc2lnbmVkIHNob3J0IFZlcnRpY2FsX0JQOwotCWRvdWJsZQkgICAgICAgRENMSzsKLQl1bnNpZ25lZCBjaGFyICBGcmFtZVJhdGU7Ci0JdW5zaWduZWQgY2hhciAgSW50ZXJsYWNlOwotCXVuc2lnbmVkIHNob3J0IE1hcmdpbjsKLX07Ci0KLSNkZWZpbmUgX1ZCX1NUUlVDVF8KICNlbmRpZiAvKiBfVkJfU1RSVUNUXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX3RhYmxlLmggYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfdGFibGUuaAppbmRleCBkMTBkZTQ4Li5iODFhYzc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfdGFibGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfdGFibGUuaApAQCAtMSw1ICsxLDMgQEAKLSNkZWZpbmUgIFRhcDQKLQogLyogeWlsaW4gbW9kaWZ5IGZvciB4Z2kyMCAqLwogc3RhdGljIHN0cnVjdCBYR0lfTUNMS0RhdGFTdHJ1Y3QgWEdJMzQwTmV3X01DTEtEYXRhW10gPSB7CiAJezB4MTYsIDB4MDEsIDB4MDEsIDE2Nn0sCkBAIC0xMDksNjIgKzEwNywxMiBAQAogCXsweDAwLCAweDAwLCAweDAwLCAweDAwfQogfTsKIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJMzQwX0NSNkVbOF1bNF0gPSB7Ci0JezB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAotCXsweDAwLCAweDAwLCAweDAwLCAweDAwfSwKLQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCi0JezB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAotCXsweDAwLCAweDAwLCAweDAwLCAweDAwfSwKLQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCi0JezB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAotCXsweDAwLCAweDAwLCAweDAwLCAweDAwfQotfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSTM0MF9DUjZFWzhdWzRdOwogCi1zdGF0aWMgdW5zaWduZWQgY2hhciBYR0kzNDBfQ1I2Rls4XVszMl0gPSB7Ci0JezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAotCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwKLQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCi0JezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAotCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwKLQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLQkgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCi0JezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0JIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAotCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotCSAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfQotfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSTM0MF9DUjZGWzhdWzMyXTsKIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJMzQwX0NSODlbOF1bMl0gPSB7Ci0JezB4MDAsIDB4MDB9LAotCXsweDAwLCAweDAwfSwKLQl7MHgwMCwgMHgwMH0sCi0JezB4MDAsIDB4MDB9LAotCXsweDAwLCAweDAwfSwKLQl7MHgwMCwgMHgwMH0sCi0JezB4MDAsIDB4MDB9LAotCXsweDAwLCAweDAwfQotfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSTM0MF9DUjg5WzhdWzJdOworCiAvKiBDUjQ3LENSNDgsQ1I0OSxDUjRBLENSNEIsQ1I0QyxDUjcwLENSNzEsQ1I3NCxDUjc1LENSNzYsQ1I3NyAqLwogc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJMzQwX0FHUFJlZ1sxMl0gPSB7CiAJMHgyOCwgMHgyMywgMHgwMCwgMHgyMCwgMHgwMCwgMHgyMCwKQEAgLTE3Myw0MSArMTIxLDEwIEBACiAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSTM0MF9TUjE2WzRdID0gezB4MDMsIDB4ODMsIDB4MDMsIDB4ODN9OwogCi0jaWYgMAotc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJMzMwX1NSMTVfMVs4XVs4XSA9IHsKLQl7MHgwLCAweDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDB9LAotCXsweDUsIDB4MTUsIDB4MTUsIDB4MTUsIDB4MTUsIDB4MTUsIDB4MDAsIDB4MDB9LAotCXsweGJhLCAweGJhLCAweGJhLCAweGJhLCAweEJBLCAweEJBLCAweDAwLCAweDAwfSwKLQl7MHg1NSwgMHg1NywgMHg1NywgMHhBQiwgMHhBQiwgMHhBQiwgMHgwMCwgMHgwMH0sCi0JezB4NjAsIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzQsIDB4MDAsIDB4MDB9LAotCXsweDAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODMsIDB4ODMsIDB4MDAsIDB4MDB9LAotCXsweDUwLCAweDUwLCAweDUwLCAweDNDLCAweDNDLCAweDNDLCAweDAwLCAweDAwfSwKLQl7MHgwLCAweGE1LCAweGZiLCAweGY2LCAweEY2LCAweEY2LCAweDAwLCAweDAwfQotfTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJMzMwX2NyNDBfMVsxNV1bOF0gPSB7Ci0JezB4NjYsIDB4NDAsIDB4NDAsIDB4MjgsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDB9LAotCXsweDY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwKLQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCi0JezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEYsIDB4MEYsIDB4MDAsIDB4MDB9LAotCXsweDAwLCAweGYwLCAweGYwLCAweGYwLCAweEYwLCAweEYwLCAweDAwLCAweDAwfSwKLQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCi0JezB4MTAsIDB4MTAsIDB4MTAsIDB4MTAsIDB4MjAsIDB4MjAsIDB4MDAsIDB4MDB9LAotCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwKLQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH0sCi0JezB4ODgsIDB4ODgsIDB4ODgsIDB4QUEsIDB4QUMsIDB4QUMsIDB4MDAsIDB4MDB9LAotCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwKLQl7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMH0sCi0JezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9LAotCXsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSwKLQl7MHgwMCwgMHhBMiwgMHgwMCwgMHgwMCwgMHhBMiwgMHhBMiwgMHgwMCwgMHgwMH0sCi19OwotI2VuZGlmCi0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSTMzMF9zcjI1W10gPSB7MHgwMCwgMHgwfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSTMzMF9zcjI1WzJdOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJMzMwX3NyMzEgPSAweGMwOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJMzMwX3NyMzIgPSAweDExOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJMzMwX1NSMzMgPSAweDAwOworc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJMzMwX1NSMzM7CiBzdGF0aWMgdW5zaWduZWQgY2hhciBYRzQwX0NSQ0YgPSAweDEzOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgWEc0MF9EUkFNVHlwZURlZmluaXRpb24gPSAweEZGIDsKIApAQCAtODE2LDEzICs3MzMsOSBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgWEdJX1RpbWluZ0hTdHJ1Y3QgWEdJX1RpbWluZ0hbXSA9IHsKLQl7IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfSB9Ci19Oworc3RhdGljIHN0cnVjdCBYR0lfVGltaW5nSFN0cnVjdCBYR0lfVGltaW5nSFsxXTsKIAotc3RhdGljIHN0cnVjdCBYR0lfVGltaW5nVlN0cnVjdCBYR0lfVGltaW5nVltdID0gewotCXsgezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9IH0KLX07CitzdGF0aWMgc3RydWN0IFhHSV9UaW1pbmdWU3RydWN0IFhHSV9UaW1pbmdWWzFdOwogCiBzdGF0aWMgc3RydWN0IFhHSV9YRzIxQ1JUMVN0cnVjdCBYR0lfVXBkYXRlQ1JUMVRhYmxlW10gPSB7CiAJezB4MDEsIDB4MjcsIDB4OTEsIDB4OGYsIDB4YzB9LAkvKiAwMCAqLwpAQCAtMTAwNywxMTIgKzkyMCw2IEBACiAJICAweDAzLCAweERFLCAweEMwLCAweDg0LCAweEJGLCAweDA0LCAweDkwfSB9ICAvKiAweDQ3ICovCiB9OwogCi0jaWYgMAotc3RhdGljIHN0cnVjdCBYR0kzMzBfQ0hUVlJlZ0RhdGFTdHJ1Y3QgWEdJX0NIVFZSZWdVTlRTQ1tdID0gewotCS8qIEluZGV4OiAwMDBoLCAwMDFoLCAwMDJoLCAwMDRoLCAwMDNoLCAwMDVoLCAwMDZoLCAwMDdoLAotCQkgIDAwOGgsIDAxNWgsIDAxRmgsIDAwQ2gsIDAwRGgsIDAwRWgsIDAwRmgsIDAxMGggKi8KLQkvKiAwMCAoNjQweDIwMCw2NDB4NDAwKSAqLwotCXsgezB4NEEsIDB4NzcsIDB4QkIsIDB4OTQsIDB4ODQsIDB4NDgsIDB4RkUsIDB4NTAsCi0JICAgMHgwNCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSAgfSB9LAotCS8qIDAxICg2NDB4MzUwKSAqLwotCXsgezB4NEEsIDB4NzcsIDB4QkIsIDB4OTQsIDB4ODQsIDB4NDgsIDB4RkUsIDB4NTAsCi0JICAgMHgwNCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSAgfSB9LAotCS8qIDAyICg3MjB4NDAwKSAqLwotCXsgezB4NEEsIDB4NzcsIDB4QkIsIDB4OTQsIDB4ODQsIDB4NDgsIDB4RkUsIDB4NTAsCi0JICAgMHgwNCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSAgfSB9LAotCS8qIDAzICg3MjB4MzUwKSAqLwotCXsgezB4NEEsIDB4NzcsIDB4QkIsIDB4OTQsIDB4ODQsIDB4NDgsIDB4RkUsIDB4NTAsCi0JICAgMHgwNCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSAgfSB9LAotCS8qIDA0ICg2NDB4NDgwKSA7OzUvNi8wMiAqLwotCXsgezB4NkEsIDB4NzcsIDB4QkIsIDB4NkUsIDB4ODQsIDB4MkUsIDB4MDIsIDB4NUEsCi0JICAgMHgwNCwgMHgwMCwgMHg4MCwgMHgyMCwgMHg3RSwgMHg4MCwgMHg5NywgMHgwMCAgfSB9LAotCS8qIDA1ICg4MDB4NjAwKSA7OzEvMTIvMDIgKi8KLQl7IHsweENGLCAweDc3LCAweEI3LCAweEM4LCAweDg0LCAweDNCLCAweDAyLCAweDVBLAotCSAgIDB4MDQsIDB4MDAsIDB4ODAsIDB4MTksIDB4ODgsIDB4QUUsIDB4QTMsIDB4MDAgIH0gfSwKLQkvKiAwNiAoMTAyNHg3NjgpIDs7NS82LzAyICovCi0JeyB7MHhFRSwgMHg3NywgMHhCQiwgMHg2NiwgMHg4NywgMHgzMiwgMHgwMSwgMHg1QSwKLQkgICAweDA0LCAweDAwLCAweDgwLCAweDFCLCAweEQ0LCAweDJGLCAweDZGLCAweDAwICB9IH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgWEdJMzMwX0NIVFZSZWdEYXRhU3RydWN0IFhHSV9DSFRWUmVnT05UU0NbXSA9IHsKLQkvKiBJbmRleDogMDAwaCwgMDAxaCwgMDAyaCwgMDA0aCwgMDAzaCwgMDA1aCwgMDA2aCwgMDA3aCwKLQkJICAwMDhoLCAwMTVoLCAwMUZoLCAwMENoLCAwMERoLCAwMEVoLCAwMEZoLCAwMTBoICovCi0JLyogMDAgKDY0MHgyMDAsNjQweDQwMCkgKi8KLQl7IHsweDQ5LCAweDc3LCAweEJCLCAweDdCLCAweDg0LCAweDM0LCAweDAwLCAweDUwLAotCSAgIDB4MDQsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDF9IH0sCi0JLyogMDEgKDY0MHgzNTApICovCi0JeyB7MHg0OSwgMHg3NywgMHhCQiwgMHg3QiwgMHg4NCwgMHgzNCwgMHgwMCAsIDB4NTAsCi0JICAgMHgwNCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMX0gfSwKLQkvKiAwMiAoNzIweDQwMCkgKi8KLQl7IHsweDQ5LCAweDc3LCAweEJCLCAweDdCLCAweDg0LCAweDM0LCAweDAwICwgMHg1MCwKLQkgICAweDA0LCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxfSB9LAotCS8qIDAzICg3MjB4MzUwKSAqLwotCXsgezB4NDksIDB4NzcsIDB4QkIsIDB4N0IsIDB4ODQsIDB4MzQsIDB4MDAgLCAweDUwLAotCSAgIDB4MDQsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDF9IH0sCi0JLyogMDQgKDY0MHg0ODApIDs7NS82LzAyICovCi0JeyB7MHg2OSwgMHg3NywgMHhCQiwgMHg2RSwgMHg4NCwgMHgxRSwgMHgwMCAsIDB4NUEsCi0JICAgMHgwNCwgMHgwMCwgMHg4MCwgMHgyNSwgMHgxQSwgMHg4MCwgMHgyNiwgMHgwMH0gfSwKLQkvKiAwNSAoODAweDYwMCkgOzs1LzYvMDIgKi8KLQl7IHsweENFLCAweDc3LCAweEI3LCAweEI2LCAweDgzLCAweDJDLCAweDAyICwgMHg1QSwKLQkgICAweDA0LCAweDAwLCAweDgwLCAweDFDLCAweDAwLCAweDgyLCAweDk3LCAweDAwfSB9LAotCS8qIDA2ICgxMDI0eDc2OCkgOzs1LzYvMDIgKi8KLQl7IHsweEVELCAweDc3LCAweEJCLCAweDY2LCAweDhDLCAweDIxLCAweDAyICwgMHg1QSwKLQkgICAweDA0LCAweDAwLCAweDgwLCAweDFGLCAweEEwLCAweDdFLCAweDczLCAweDAwfSB9Ci19OwotCi1zdGF0aWMgc3RydWN0IFhHSTMzMF9DSFRWUmVnRGF0YVN0cnVjdCBYR0lfQ0hUVlJlZ1VQQUxbXSA9IHsKLQkvKiBJbmRleDogMDAwaCwgMDAxaCwgMDAyaCwgMDA0aCwgMDAzaCwgMDA1aCwgMDA2aCwgMDA3aCwKLQkJICAwMDhoLCAwMTVoLCAwMUZoLCAwMENoLCAwMERoLCAwMEVoLCAwMEZoLCAwMTBoICovCi0JLyogOyAwMCAoNjQweDIwMCw2NDB4NDAwKSAqLwotCXsgezB4NDEsIDB4N0YsIDB4QjcsIDB4MzQsIDB4QUQsIDB4NTAsIDB4MzQsIDB4ODMsCi0JICAgMHgwNSwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMX0gfSwKLQkvKiA7IDAxICg2NDB4MzUwKSAqLwotCXsgezB4NDEsIDB4N0YsIDB4QjcsIDB4ODAsIDB4ODUsIDB4NTAsIDB4MDAsIDB4ODMsCi0JICAgMHgwNSwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMX0gfSwKLQkvKiA7IDAyICg3MjB4NDAwKSAqLwotCXsgezB4NDEsIDB4N0YsIDB4QjcsIDB4MzQsIDB4QUQsIDB4NTAsIDB4MzQsIDB4ODMsCi0JICAgMHgwNSwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMX0gfSwKLQkvKiA7IDAzICg3MjB4MzUwKSAqLwotCXsgezB4NDEsIDB4N0YsIDB4QjcsIDB4MTIsIDB4ODUsIDB4NTAsIDB4MDAsIDB4ODMsCi0JICAgMHgwNSwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMX0gfSwKLQkvKiA7IDA0ICg2NDB4NDgwKSAqLwotCXsgezB4NjEsIDB4N0YsIDB4QjcsIDB4OTksIDB4ODQsIDB4MzUsIDB4MDQsIDB4NUEsCi0JICAgMHgwNSwgMHgwMCwgMHg4MCwgMHgyNiwgMHgyQSwgMHg1NSwgMHg1RCwgMHgwMH0gfSwKLQkvKiA7IDA1ICg4MDB4NjAwKSA7OzEvMTIvMDIgKi8KLQl7IHsweEMzLCAweDdGLCAweEI3LCAweDdBLCAweDg0LCAweDQwLCAweDAyLCAweDVBLAotCSAgIDB4MDUsIDB4MDAsIDB4ODAsIDB4MUYsIDB4ODQsIDB4M0QsIDB4MjgsIDB4MDB9IH0sCi0JLyogOyAwNiAoMTAyNHg3NjgpIDs7MS8xMi8wMiAqLwotCXsgezB4RTUsIDB4N0YsIDB4QjcsIDB4MUQsIDB4QTcsIDB4M0UsIDB4MDQsIDB4NUEsCi0JICAgMHgwNSwgMHgwMCwgMHg4MCwgMHgyMCwgMHgzRSwgMHhFNCwgMHgyMiwgMHgwMH0gfQotfTsKLQotc3RhdGljIHN0cnVjdCBYR0kzMzBfQ0hUVlJlZ0RhdGFTdHJ1Y3QgWEdJX0NIVFZSZWdPUEFMW10gPSB7Ci0JLyogSW5kZXg6IDAwMCwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwMywgMHgwNSwgMHgwNiwgMHgwNywKLQkJICAweDA4LCAweDE1LCAweDFGLCAweDBDLCAweDBELCAweDBFLCAweDBGLCAweDEwaCAqLwotCS8qIDAwICg2NDB4MjAwLDY0MHg0MDApICovCi0JeyB7MHg0MSwgMHg3RiwgMHhCNywgMHgzNiwgMHhBRCwgMHg1MCwgMHgzNCwgMHg4MywKLQkgICAweDA1LCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxfSB9LAotCS8qIDAxICg2NDB4MzUwKSAqLwotCXsgezB4NDEsIDB4N0YsIDB4QjcsIDB4ODYsIDB4ODUsIDB4NTAsIDB4MDAsIDB4ODMsCi0JICAgMHgwNSwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMX0gfSwKLQkvKiAwMiAoNzIweDQwMCkgKi8KLQl7IHsweDQxLCAweDdGLCAweEI3LCAweDM2LCAweEFELCAweDUwLCAweDM0LCAweDgzLAotCSAgIDB4MDUsIDB4MDAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDF9IH0sCi0JLyogMDMgKDcyMHgzNTApICovCi0JeyB7MHg0MSwgMHg3RiwgMHhCNywgMHg4NiwgMHg4NSwgMHg1MCwgMHgwMCwgMHg4MywKLQkgICAweDA1LCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxfSB9LAotCS8qIDA0ICg2NDB4NDgwKSAqLwotCXsgezB4NjEsIDB4N0YsIDB4QjcsIDB4OTksIDB4ODQsIDB4MzUsIDB4MDQsIDB4NUEsCi0JICAgMHgwNSwgMHgwMCwgMHg4MCwgMHgyNiwgMHgyQSwgMHg1NSwgMHg1RCwgMHgwMH0gfSwKLQkvKiAwNSAoODAweDYwMCkgOzsxLzEyLzAyICovCi0JeyB7MHhDMSwgMHg3RiwgMHhCNywgMHg0RCwgMHg4QywgMHgxRSwgMHgzMSwgMHg1QSwKLQkgICAweDA1LCAweDAwLCAweDgwLCAweDI2LCAweDc4LCAweDE5LCAweDM0LCAweDAwfSB9LAotCS8qIDA2ICgxMDI0eDc2OCkgOzsxLzEyLzAyICovCi0JeyB7MHhFNCwgMHg3RiwgMHhCNywgMHgxRSwgMHhBRiwgMHgyOSwgMHgzNywgMHg1QSwKLQkgICAweDA1LCAweDAwLCAweDgwLCAweDI1LCAweDhDLCAweEIyLCAweDJBLCAweDAwfSB9Ci19OwotI2VuZGlmCi0KIHN0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSV9DSDcwMTdMVjEwMjR4NzY4W10gPSB7CiAJMHg2MCwgMHgwMiwgMHgwMCwgMHgwNywgMHg0MCwgMHhFRCwKIAkweEEzLCAweEM4LCAweEM3LCAweEFDLCAweEUwLCAweDAyfTsKQEAgLTExNTEsMTYgKzk1OCw2IEBACiAJezEsICAxLCAgMTM0NCwgODA2LCAxMzQ0LCA4MDZ9CiB9OwogCi0vKnN0cnVjdCBYR0kzMzBfTENERGF0YVN0cnVjdCAgWEdJX1N0MkxDRDEwMjR4NzY4RGF0YVtdID0gewotCXs2MiwgIDI1LCA4MDAsICA1NDYsIDEzNDQsIDgwNn0sCi0JezMyLCAgMTUsIDkzMCwgIDU0NiwgMTM0NCwgODA2fSwKLQl7NjIsICAyNSwgODAwLCAgNTQ2LCAxMzQ0LCA4MDZ9LAotCXsxMDQsIDQ1LCA5NDUsICA0OTYsIDEzNDQsIDgwNn0sCi0JezYyLCAgMjUsIDgwMCwgIDU0NiwgMTM0NCwgODA2fSwKLQl7MzEsICAxOCwgMTAwOCwgNjI0LCAxMzQ0LCA4MDZ9LAotCXsxLCAgIDEsICAxMzQ0LCA4MDYsIDEzNDQsIDgwNn0KLX07Ki8KLQogc3RhdGljIHN0cnVjdCBYR0kzMzBfTENERGF0YVN0cnVjdCAgWEdJX0NldExDRDEwMjR4NzY4RGF0YVtdID0gewogCXsxLCAxLCAxMzQ0LCA4MDYsIDEzNDQsIDgwNn0sIC8qIDsgMDAgKDMyMHgyMDAsMzIweDQwMCwKIAkJCQkJICAgICAgIDY0MHgyMDAsNjQweDQwMCkgKi8KQEAgLTExOTQsMTkgKzk5MSw2IEBACiAJezEsICAgMSwgICAxNjg4LCAxMDY2LCAxNjg4LCAxMDY2fQogfTsKIAotI2lmIDAKLXN0YXRpYyBzdHJ1Y3QgWEdJMzMwX0xDRERhdGFTdHJ1Y3QgIFhHSV9TdDJMQ0QxMjgweDEwMjREYXRhW10gPSB7Ci0JezIyLCAgNSwgIDgwMCwgIDUxMCwgIDE2NTAsIDEwODh9LAotCXsyMiwgIDUsICA4MDAsICA1MTAsICAxNjUwLCAxMDg4fSwKLQl7MTc2LCA0NSwgOTAwLCAgNTEwLCAgMTY1MCwgMTA4OH0sCi0JezE3NiwgNDUsIDkwMCwgIDUxMCwgIDE2NTAsIDEwODh9LAotCXsyMiwgIDUsICA4MDAsICA1MTAsICAxNjUwLCAxMDg4fSwKLQl7MTMsICA1LCAgMTAyNCwgNjc1LCAgMTU2MCwgMTE1Mn0sCi0JezE2LCAgOSwgIDEyNjYsIDgwNCwgIDE2ODgsIDEwNzJ9LAotCXsxLCAgIDEsICAxNjg4LCAxMDY2LCAxNjg4LCAxMDY2fQotfTsKLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IFhHSTMzMF9MQ0REYXRhU3RydWN0ICBYR0lfQ2V0TENEMTI4MHgxMDI0RGF0YVtdID0gewogCXsxLCAxLCAxNjg4LCAxMDY2LCAxNjg4LCAxMDY2fSwgLyogMDAgKDMyMHgyMDAsMzIweDQwMCwKIAkJCQkJICAgICAgIDY0MHgyMDAsNjQweDQwMCkgKi8KQEAgLTEyMjAsMjEgKzEwMDQsNyBAQAogCXsxLCAxLCAxNjg4LCAxMDY2LCAxNjg4LCAxMDY2fSAgLyogMDggKDE0MDB4MTA1MHg2MEh6KSAqLwogfTsKIAotc3RhdGljIHN0cnVjdCBYR0kzMzBfTENERGF0YVN0cnVjdCAgWEdJX1N0TENEMTQwMHgxMDUwRGF0YVtdID0gewotCXsyMTEsIDEwMCwgMjEwMCwgNDA4LCAgMTY4OCwgMTA2Nn0sIC8qIDAwICgzMjB4MjAwLDMyMHg0MDAsCi0JCQkJCQkgICA2NDB4MjAwLDY0MHg0MDApICovCi0JezIxMSwgNjQsICAxNTM2LCAzNTgsICAxNjg4LCAxMDY2fSwgLyogMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KLQl7MjExLCAxMDAsIDIxMDAsIDQwOCwgIDE2ODgsIDEwNjZ9LCAvKiAwMiAoMzYweDQwMCw3MjB4NDAwKSAqLwotCXsyMTEsIDY0LCAgMTUzNiwgMzU4LCAgMTY4OCwgMTA2Nn0sIC8qIDAzICg3MjB4MzUwKSAqLwotCXsyMTEsIDQ4LCAgODQwLCAgNDg4LCAgMTY4OCwgMTA2Nn0sIC8qIDA0ICg2NDB4NDgweDYwSHopICovCi0JezIxMSwgNzIsICAxMDA4LCA2MDksICAxNjg4LCAxMDY2fSwgLyogMDUgKDgwMHg2MDB4NjBIeikgKi8KLQl7MjExLCAxMjgsIDE0MDAsIDc3NiwgIDE2ODgsIDEwNjZ9LCAvKiAwNiAoMTAyNHg3Njh4NjBIeikgKi8KLQl7MSwgICAxLCAgIDE2ODgsIDEwNjYsIDE2ODgsIDEwNjZ9LCAvKiAwNyAoMTI4MHgxMDI0eDYwSHoKLQkJCQkJCSAgdy9vIFNjYWxpbmcpICovCi0JezEsICAgMSwgICAxNjg4LCAxMDY2LCAxNjg4LCAxMDY2fSAgLyogMDggKDE0MDB4MTA1MHg2MEh6KSAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBYR0kzMzBfTENERGF0YVN0cnVjdCAgWEdJX0V4dExDRDE0MDB4MTA1MERhdGFbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgWEdJMzMwX0xDRERhdGFTdHJ1Y3QgeGdpZmJfbGNkXzE0MDB4MTA1MFtdID0gewogCXsyMTEsIDEwMCwgMjEwMCwgNDA4LCAgMTY4OCwgMTA2Nn0sIC8qIDAwICgzMjB4MjAwLDMyMHg0MDAsCiAJCQkJCQkgICA2NDB4MjAwLDY0MHg0MDApICovCiAJezIxMSwgNjQsICAxNTM2LCAzNTgsICAxNjg4LCAxMDY2fSwgLyogMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTEzMTUsMTkgKzEwODUsNiBAQAogCXsxLCAgMSwgIDEzMTIsIDgwMCwgMTMxMiwgODAwfSAgLyogOyAwNiAoMTAyNHg3Njh4NzVIeikgKi8KIH07CiAKLSNpZiAwCi1zdGF0aWMgc3RydWN0IFhHSTMzMF9MQ0REYXRhU3RydWN0ICBYR0lfU3RMQ0QxMDI0eDc2OHg3NURhdGFbXSA9IHsKLQl7NDIsIDI1LCAxNTM2LCA0MTksIDEzNDQsIDgwNn0sIC8qIDsgMDAgKDMyMHgyMDAsMzIweDQwMCwKLQkJCQkJCSA2NDB4MjAwLDY0MHg0MDApICovCi0JezQ4LCAyNSwgMTUzNiwgMzY5LCAxMzQ0LCA4MDZ9LCAvKiA7IDAxICgzMjB4MzUwLDY0MHgzNTApICovCi0JezQyLCAyNSwgMTUzNiwgNDE5LCAxMzQ0LCA4MDZ9LCAvKiA7IDAyICgzNjB4NDAwLDcyMHg0MDApICovCi0JezQ4LCAyNSwgMTUzNiwgMzY5LCAxMzQ0LCA4MDZ9LCAvKiA7IDAzICg3MjB4MzUwKSAqLwotCXs4LCAgNSwgIDEzMTIsIDUwMCwgMTMxMiwgODAwfSwgLyogOyAwNCAoNjQweDQ4MHg3NUh6KSAqLwotCXs0MSwgMjUsIDEwMjQsIDYyNSwgMTMxMiwgODAwfSwgLyogOyAwNSAoODAweDYwMHg3NUh6KSAqLwotCXsxLCAgMSwgIDEzMTIsIDgwMCwgMTMxMiwgODAwfSAgLyogOyAwNiAoMTAyNHg3Njh4NzVIeikgKi8KLX07Ci0jZW5kaWYKLQogc3RhdGljIHN0cnVjdCBYR0kzMzBfTENERGF0YVN0cnVjdCAgWEdJX0NldExDRDEwMjR4NzY4eDc1RGF0YVtdID0gewogCXsxLCAxLCAxMzEyLCA4MDAsIDEzMTIsIDgwMH0sIC8qIDsgMDAgKDMyMHgyMDAsMzIweDQwMCwKIAkJCQkJICAgICAgIDY0MHgyMDAsNjQweDQwMCkgKi8KQEAgLTEzMzksMTkgKzEwOTYsNyBAQAogCXsxLCAxLCAxMzEyLCA4MDAsIDEzMTIsIDgwMH0gIC8qIDsgMDYgKDEwMjR4NzY4eDc1SHopICovCiB9OwogCi1zdGF0aWMgc3RydWN0IFhHSTMzMF9MQ0REYXRhU3RydWN0ICBYR0lfRXh0TENEMTI4MHgxMDI0eDc1RGF0YVtdID0gewotCXsyMTEsIDYwLCAgMTAyNCwgNTAxLCAgMTY4OCwgMTA2Nn0sIC8qIDsgMDAgKDMyMHgyMDAsMzIweDQwMCwKLQkJCQkJCSAgICAgNjQweDIwMCw2NDB4NDAwKSAqLwotCXsyMTEsIDYwLCAgMTAyNCwgNTA4LCAgMTY4OCwgMTA2Nn0sIC8qIDsgMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KLQl7MjExLCA2MCwgIDEwMjQsIDUwMSwgIDE2ODgsIDEwNjZ9LCAvKiA7IDAyICgzNjB4NDAwLDcyMHg0MDApICovCi0JezIxMSwgNjAsICAxMDI0LCA1MDgsICAxNjg4LCAxMDY2fSwgLyogOyAwMyAoNzIweDM1MCkgKi8KLQl7MjExLCA0NSwgIDc2OCwgIDQ5OCwgIDE2ODgsIDEwNjZ9LCAvKiA7IDA0ICg2NDB4NDgweDc1SHopICovCi0JezIxMSwgNzUsICAxMDI0LCA2MjUsICAxNjg4LCAxMDY2fSwgLyogOyAwNSAoODAweDYwMHg3NUh6KSAqLwotCXsyMTEsIDEyMCwgMTI4MCwgNzk4LCAgMTY4OCwgMTA2Nn0sIC8qIDsgMDYgKDEwMjR4NzY4eDc1SHopICovCi0JezEsICAgMSwgICAxNjg4LCAxMDY2LCAxNjg4LCAxMDY2fSAgLyogOyAwNyAoMTI4MHgxMDI0eDc1SHopICovCi19OwotCi1zdGF0aWMgc3RydWN0IFhHSTMzMF9MQ0REYXRhU3RydWN0ICBYR0lfU3RMQ0QxMjgweDEwMjR4NzVEYXRhW10gPSB7CitzdGF0aWMgc3RydWN0IFhHSTMzMF9MQ0REYXRhU3RydWN0IHhnaWZiX2xjZF8xMjgweDEwMjR4NzVbXSA9IHsKIAl7MjExLCA2MCwgIDEwMjQsIDUwMSwgIDE2ODgsIDEwNjZ9LCAvKiA7IDAwICgzMjB4MjAwLDMyMHg0MDAsCiAJCQkJCQkgICAgIDY0MHgyMDAsNjQweDQwMCkgKi8KIAl7MjExLCA2MCwgIDEwMjQsIDUwOCwgIDE2ODgsIDEwNjZ9LCAvKiA7IDAxICgzMjB4MzUwLDY0MHgzNTApICovCkBAIC0xNDg3LDcgKzEyMzIsNyBAQAogCXs5LCAgICAxMzM3LCAxMDY1LCAxMDI0fSAvKiAwNyAoMTI4MHgxMDI0eDYwSHopICovCiB9OwogCi1zdGF0aWMgc3RydWN0IFhHSTMzMF9MQ0REYXRhRGVzU3RydWN0ICBYR0lfU3RMQ0RETERlczE0MDB4MTA1MERhdGFbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgeGdpZmJfbGNkZGxkZXNfMTQwMHgxMDUwW10gPSB7CiAJezE4LCAgIDE0NjQsIDAsICAgIDEwNTF9LCAvKiAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KIAl7MTgsICAgMTQ2NCwgMCwgICAgMTA1MX0sIC8qIDAxICgzMjB4MzUwLDY0MHgzNTApICovCiAJezE4LCAgIDE0NjQsIDAsICAgIDEwNTF9LCAvKiAwMiAoMzYweDQwMCw3MjB4NDAwKSAqLwpAQCAtMTQ5OSwzMSArMTI0NCw3IEBACiAJezE4LCAgIDE0NjQsIDAsICAgIDEwNTF9ICAvKiAwOCAoMTQwMHgxMDUweDYwSHopICovCiB9OwogCi1zdGF0aWMgc3RydWN0IFhHSTMzMF9MQ0REYXRhRGVzU3RydWN0ICBYR0lfRXh0TENERExEZXMxNDAweDEwNTBEYXRhW10gPSB7Ci0JezE4LCAgIDE0NjQsIDAsICAgIDEwNTF9LCAvKiAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KLQl7MTgsICAgMTQ2NCwgMCwgICAgMTA1MX0sIC8qIDAxICgzMjB4MzUwLDY0MHgzNTApICovCi0JezE4LCAgIDE0NjQsIDAsICAgIDEwNTF9LCAvKiAwMiAoMzYweDQwMCw3MjB4NDAwKSAqLwotCXsxOCwgICAxNDY0LCAwLCAgICAxMDUxfSwgLyogMDMgKDcyMHgzNTApICovCi0JezE4LCAgIDE0NjQsIDAsICAgIDEwNTF9LCAvKiAwNCAoNjQweDQ4MHg2MEh6KSAqLwotCXsxOCwgICAxNDY0LCAwLCAgICAxMDUxfSwgLyogMDUgKDgwMHg2MDB4NjBIeikgKi8KLQl7MTgsICAgMTQ2NCwgMCwgICAgMTA1MX0sIC8qIDA2ICgxMDI0eDc2OHg2MEh6KSAqLwotCXsxNjQ2LCAxNDA2LCAxMDUzLCAxMDM4fSwgLyogMDcgKDEyODB4MTAyNHg2MEh6KSAqLwotCXsxOCwgICAxNDY0LCAwLCAgICAxMDUxfSAgLyogMDggKDE0MDB4MTA1MHg2MEh6KSAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX1N0TENERGVzMTQwMHgxMDUwRGF0YVtdID0gewotCXs5LCAgICAxNDU1LCAwLCAgICAxMDUxfSwgLyogMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCi0JezksICAgIDE0NTUsIDAsICAgIDEwNTF9LCAvKiAwMSAoMzIweDM1MCw2NDB4MzUwKSAqLwotCXs5LCAgICAxNDU1LCAwLCAgICAxMDUxfSwgLyogMDIgKDM2MHg0MDAsNzIweDQwMCkgKi8KLQl7OSwgICAgMTQ1NSwgMCwgICAgMTA1MX0sIC8qIDAzICg3MjB4MzUwKSAqLwotCXs5LCAgICAxNDU1LCAwLCAgICAxMDUxfSwgLyogMDQgKDY0MHg0ODB4NjBIeikgKi8KLQl7OSwgICAgMTQ1NSwgMCwgICAgMTA1MX0sIC8qIDA1ICg4MDB4NjAweDYwSHopICovCi0JezksICAgIDE0NTUsIDAsICAgIDEwNTF9LCAvKiAwNiAoMTAyNHg3Njh4NjBIeikgKi8KLQl7MTYzNywgMTM5NywgMTA1MywgMTAzOH0sIC8qIDA3ICgxMjgweDEwMjR4NjBIeikgKi8KLQl7OSwgICAgMTQ1NSwgMCwgICAgMTA1MX0gIC8qIDA4ICgxNDAweDEwNTB4NjBIeikgKi8KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgIFhHSV9FeHRMQ0REZXMxNDAweDEwNTBEYXRhW10gPSB7CitzdGF0aWMgc3RydWN0IFhHSTMzMF9MQ0REYXRhRGVzU3RydWN0IHhnaWZiX2xjZGRlc18xNDAweDEwNTBbXSA9IHsKIAl7OSwgICAgMTQ1NSwgMCwgICAgMTA1MX0sIC8qIDAwICgzMjB4MjAwLDMyMHg0MDAsNjQweDIwMCw2NDB4NDAwKSAqLwogCXs5LCAgICAxNDU1LCAwLCAgICAxMDUxfSwgLyogMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KIAl7OSwgICAgMTQ1NSwgMCwgICAgMTA1MX0sIC8qIDAyICgzNjB4NDAwLDcyMHg0MDApICovCkBAIC0xNjI0LDE3ICsxMzQ1LDcgQEAKIH07CiAKIC8qIDs7MTAyNHg3Njh4NzVIeiAqLwotc3RhdGljIHN0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX0V4dExDRERlczEwMjR4NzY4eDc1RGF0YVtdID0gewotCXs5LCAxMDQ5LCAwLCA3Njl9LCAvKiA7IDAwICgzMjB4MjAwLDMyMHg0MDAsNjQweDIwMCw2NDB4NDAwKSAqLwotCXs5LCAxMDQ5LCAwLCA3Njl9LCAvKiA7IDAxICgzMjB4MzUwLDY0MHgzNTApICovCi0JezksIDEwNDksIDAsIDc2OX0sIC8qIDsgMDIgKDM2MHg0MDAsNzIweDQwMCkgKi8KLQl7OSwgMTA0OSwgMCwgNzY5fSwgLyogOyAwMyAoNzIweDM1MCkgKi8KLQl7OSwgMTA0OSwgMCwgNzY5fSwgLyogOyAwNCAoNjQweDQ4MHg3NUh6KSAqLwotCXs5LCAxMDQ5LCAwLCA3Njl9LCAvKiA7IDA1ICg4MDB4NjAweDc1SHopICovCi0JezksIDEwNDksIDAsIDc2OX0gIC8qIDsgMDYgKDEwMjR4NzY4eDc1SHopICovCi19OwotCi1zdGF0aWMgc3RydWN0IFhHSTMzMF9MQ0REYXRhRGVzU3RydWN0ICBYR0lfU3RMQ0REZXMxMDI0eDc2OHg3NURhdGFbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgWEdJMzMwX0xDRERhdGFEZXNTdHJ1Y3QgeGdpZmJfbGNkZGVzXzEwMjR4NzY4eDc1W10gPSB7CiAJezksIDEwNDksIDAsIDc2OX0sIC8qIDsgMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAJezksIDEwNDksIDAsIDc2OX0sIC8qIDsgMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KIAl7OSwgMTA0OSwgMCwgNzY5fSwgLyogOyAwMiAoMzYweDQwMCw3MjB4NDAwKSAqLwpAQCAtMTY1NiwxOCArMTM2Nyw3IEBACiB9OwogCiAvKiA7OzEyODB4MTAyNHg3NUh6ICovCi1zdGF0aWMgc3RydWN0IFhHSTMzMF9MQ0REYXRhRGVzU3RydWN0ICBYR0lfRXh0TENERExEZXMxMjgweDEwMjR4NzVEYXRhW10gPSB7Ci0JezE4LCAxMzE0LCAwLCAxMDI1fSwgLyogOyAwMCAoMzIweDIwMCwzMjB4NDAwLDY0MHgyMDAsNjQweDQwMCkgKi8KLQl7MTgsIDEzMTQsIDAsIDEwMjV9LCAvKiA7IDAxICgzMjB4MzUwLDY0MHgzNTApICovCi0JezE4LCAxMzE0LCAwLCAxMDI1fSwgLyogOyAwMiAoMzYweDQwMCw3MjB4NDAwKSAqLwotCXsxOCwgMTMxNCwgMCwgMTAyNX0sIC8qIDsgMDMgKDcyMHgzNTApICovCi0JezE4LCAxMzE0LCAwLCAxMDI1fSwgLyogOyAwNCAoNjQweDQ4MHg2MEh6KSAqLwotCXsxOCwgMTMxNCwgMCwgMTAyNX0sIC8qIDsgMDUgKDgwMHg2MDB4NjBIeikgKi8KLQl7MTgsIDEzMTQsIDAsIDEwMjV9LCAvKiA7IDA2ICgxMDI0eDc2OHg2MEh6KSAqLwotCXsxOCwgMTMxNCwgMCwgMTAyNX0gIC8qIDsgMDcgKDEyODB4MTAyNHg2MEh6KSAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX1N0TENERExEZXMxMjgweDEwMjR4NzVEYXRhW10gPSB7CitzdGF0aWMgc3RydWN0IFhHSTMzMF9MQ0REYXRhRGVzU3RydWN0IHhnaWZiX2xjZGRsZGVzXzEyODB4MTAyNHg3NVtdID0gewogCXsxOCwgMTMxNCwgMCwgMTAyNX0sIC8qIDsgMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAJezE4LCAxMzE0LCAwLCAxMDI1fSwgLyogOyAwMSAoMzIweDM1MCw2NDB4MzUwKSAqLwogCXsxOCwgMTMxNCwgMCwgMTAyNX0sIC8qIDsgMDIgKDM2MHg0MDAsNzIweDQwMCkgKi8KQEAgLTE2OTEsMTggKzEzOTEsNyBAQAogfTsKIAogLyogOzsxMjgweDEwMjR4NzVIeiAqLwotc3RhdGljIHN0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX0V4dExDRERlczEyODB4MTAyNHg3NURhdGFbXSA9IHsKLQl7OSwgMTMwNSwgMCwgMTAyNX0sIC8qIDsgMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCi0JezksIDEzMDUsIDAsIDEwMjV9LCAvKiA7IDAxICgzMjB4MzUwLDY0MHgzNTApICovCi0JezksIDEzMDUsIDAsIDEwMjV9LCAvKiA7IDAyICgzNjB4NDAwLDcyMHg0MDApICovCi0JezksIDEzMDUsIDAsIDEwMjV9LCAvKiA7IDAzICg3MjB4MzUwKSAqLwotCXs5LCAxMzA1LCAwLCAxMDI1fSwgLyogOyAwNCAoNjQweDQ4MHg2MEh6KSAqLwotCXs5LCAxMzA1LCAwLCAxMDI1fSwgLyogOyAwNSAoODAweDYwMHg2MEh6KSAqLwotCXs5LCAxMzA1LCAwLCAxMDI1fSwgLyogOyAwNiAoMTAyNHg3Njh4NjBIeikgKi8KLQl7OSwgMTMwNSwgMCwgMTAyNX0gIC8qIDsgMDcgKDEyODB4MTAyNHg2MEh6KSAqLwotfTsKLQotc3RhdGljIHN0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCAgWEdJX1N0TENERGVzMTI4MHgxMDI0eDc1RGF0YVtdID0geworc3RhdGljIHN0cnVjdCBYR0kzMzBfTENERGF0YURlc1N0cnVjdCB4Z2lmYl9sY2RkZXNfMTI4MHgxMDI0eDc1W10gPSB7CiAJezksIDEzMDUsIDAsIDEwMjV9LCAvKiA7IDAwICgzMjB4MjAwLDMyMHg0MDAsNjQweDIwMCw2NDB4NDAwKSAqLwogCXs5LCAxMzA1LCAwLCAxMDI1fSwgLyogOyAwMSAoMzIweDM1MCw2NDB4MzUwKSAqLwogCXs5LCAxMzA1LCAwLCAxMDI1fSwgLyogOyAwMiAoMzYweDQwMCw3MjB4NDAwKSAqLwpAQCAtMjA0MSw2MyArMTczMCw2IEBACiAJMHgxOCwgMHgxRCwgMHgyMywgMHgyOCwgMHg0QywgMHhBQSwgMHgwMQogfTsKIAotI2lmIDAKLXN0YXRpYyBzdHJ1Y3QgWEdJX1BhbmVsRGVsYXlUYmxTdHJ1Y3QgWEdJMzMwX1BhbmVsRGVsYXlUYmxbXSA9IHsKLQl7IHsweDAwLCAweDAwfSB9LAotCXsgezB4MDAsIDB4MDB9IH0sCi0JeyB7MHgwMCwgMHgwMH0gfSwKLQl7IHsweDAwLCAweDAwfSB9LAotCXsgezB4MDAsIDB4MDB9IH0sCi0JeyB7MHgwMCwgMHgwMH0gfSwKLQl7IHsweDAwLCAweDAwfSB9LAotCXsgezB4MDAsIDB4MDB9IH0sCi0JeyB7MHgwMCwgMHgwMH0gfSwKLQl7IHsweDAwLCAweDAwfSB9LAotCXsgezB4MDAsIDB4MDB9IH0sCi0JeyB7MHgwMCwgMHgwMH0gfSwKLQl7IHsweDAwLCAweDAwfSB9LAotCXsgezB4MDAsIDB4MDB9IH0sCi0JeyB7MHgwMCwgMHgwMH0gfSwKLQl7IHsweDAwLCAweDAwfSB9Ci19OwotCi1zdGF0aWMgc3RydWN0IFhHSTMzMF9MVkRTRGF0YVN0cnVjdCAgWEdJMzMwX0xWRFMzMjB4NDgwRGF0YV8xW10gPSB7Ci0Jezg0OCwgIDQzMywgNDAwLCAgNTI1fSwKLQl7ODQ4LCAgMzg5LCA0MDAsICA1MjV9LAotCXs4NDgsICA0MzMsIDQwMCwgIDUyNX0sCi0Jezg0OCwgIDM4OSwgNDAwLCAgNTI1fSwKLQl7ODQ4LCAgNTE4LCA0MDAsICA1MjV9LAotCXsxMDU2LCA2MjgsIDQwMCwgIDUyNX0sCi0JezQwMCwgIDUyNSwgNDAwLCAgNTI1fSwKLQl7ODAwLCAgNDQ5LCAxMDAwLCA2NDR9LAotCXs4MDAsICA1MjUsIDEwMDAsIDYzNX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgWEdJMzMwX0xWRFNEYXRhU3RydWN0ICBYR0kzMzBfTFZEUzgwMHg2MDBEYXRhXzFbXSA9IHsKLQl7ODQ4LCAgNDMzLCAxMDYwLCA2Mjl9LAotCXs4NDgsICAzODksIDEwNjAsIDYyOX0sCi0Jezg0OCwgIDQzMywgMTA2MCwgNjI5fSwKLQl7ODQ4LCAgMzg5LCAxMDYwLCA2Mjl9LAotCXs4NDgsICA1MTgsIDEwNjAsIDYyOX0sCi0JezEwNTYsIDYyOCwgMTA1NiwgNjI4fSwKLQl7MTA1NiwgNjI4LCAxMDU2LCA2Mjh9LAotCXs4MDAsICA0NDksIDEwMDAsIDY0NH0sCi0JezgwMCwgIDUyNSwgMTAwMCwgNjM1fQotfTsKLQotc3RhdGljIHN0cnVjdCBYR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgIFhHSTMzMF9MVkRTODAweDYwMERhdGFfMltdID0gewotCXsxMDU2LCA2MjgsIDEwNTYsIDYyOH0sCi0JezEwNTYsIDYyOCwgMTA1NiwgNjI4fSwKLQl7MTA1NiwgNjI4LCAxMDU2LCA2Mjh9LAotCXsxMDU2LCA2MjgsIDEwNTYsIDYyOH0sCi0JezEwNTYsIDYyOCwgMTA1NiwgNjI4fSwKLQl7MTA1NiwgNjI4LCAxMDU2LCA2Mjh9LAotCXsxMDU2LCA2MjgsIDEwNTYsIDYyOH0sCi0JezgwMCwgIDQ0OSwgMTAwMCwgNjQ0fSwKLQl7ODAwLCAgNTI1LCAxMDAwLCA2MzV9Ci19OwotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3QgWEdJMzMwX0xWRFNEYXRhU3RydWN0ICBYR0lfTFZEUzEwMjR4NzY4RGF0YV8xW10gPSB7CiAJeyA5NjAsIDQzOCwgMTM0NCwgODA2fSwJLyogMDAgKDMyMHgyMDAsMzIweDQwMCw2NDB4MjAwLDY0MHg0MDApICovCiAJeyA5NjAsIDM4OCwgMTM0NCwgODA2fSwJLyogMDEgKDMyMHgzNTAsNjQweDM1MCkgKi8KQEAgLTIxNDMsNzkgKzE3NzUsNyBAQAogCXs4MDAsICA0NDksIDEyODAsIDgwMX0sCiAJezgwMCwgIDUyNSwgMTI4MCwgODEzfQogfTsKLS8qCi1zdHJ1Y3QgWEdJMzMwX0xWRFNEYXRhU3RydWN0ICBYR0lfTFZEUzEyODB4NzY4RGF0YV8xW10gPSB7Ci0Jezc2OCwgIDQzOCwgMTQwOCwgODA2fSwKLQl7NzY4LCAgMzg4LCAxNDA4LCA4MDZ9LAotCXs3NjgsICA0MzgsIDE0MDgsIDgwNn0sCi0Jezc2OCwgIDM4OCwgMTQwOCwgODA2fSwKLQl7NzY4LCAgNTE4LCAxNDA4LCA4MDZ9LAotCXs5MjgsICA2MzgsIDE0MDgsIDgwNn0sCi0JezE0MDgsIDgwNiwgMTQwOCwgODA2fSwKLQl7MTQwOCwgODA2LCAxNDA4LCA4MDZ9LAotCXsxNDA4LCA4MDYsIDE0MDgsIDgwNn0KLX07CiAKLXN0cnVjdCBYR0kzMzBfTFZEU0RhdGFTdHJ1Y3QgIFhHSV9MVkRTMTI4MHg3NjhEYXRhXzJbXSA9IHsKLQl7MTQwOCwgODA2LCAxNDA4LCA4MDZ9LAotCXsxNDA4LCA4MDYsIDE0MDgsIDgwNn0sCi0JezE0MDgsIDgwNiwgMTQwOCwgODA2fSwKLQl7MTQwOCwgODA2LCAxNDA4LCA4MDZ9LAotCXsxNDA4LCA4MDYsIDE0MDgsIDgwNn0sCi0JezE0MDgsIDgwNiwgMTQwOCwgODA2fSwKLQl7MTQwOCwgODA2LCAxNDA4LCA4MDZ9LAotCXsxNDA4LCA4MDYsIDE0MDgsIDgwNn0sCi0JezE0MDgsIDgwNiwgMTQwOCwgODA2fQotfTsKLQotc3RydWN0IFhHSTMzMF9MVkRTRGF0YVN0cnVjdCAgWEdJX0xWRFMxMjgweDc2OE5EYXRhXzFbXSA9IHsKLQl7NzA0LCAgNDM4LCAxMzQ0LCA4MDZ9LAotCXs3MDQsICAzODgsIDEzNDQsIDgwNn0sCi0JezcwNCwgIDQzOCwgMTM0NCwgODA2fSwKLQl7NzA0LCAgMzg4LCAxMzQ0LCA4MDZ9LAotCXs3MDQsICA1MTgsIDEzNDQsIDgwNn0sCi0Jezg2NCwgIDYzOCwgMTM0NCwgODA2fSwKLQl7MTA4OCwgODA2LCAxMzQ0LCA4MDZ9LAotCXsxMzQ0LCA4MDYsIDEzNDQsIDgwNn0sCi0JezEzNDQsIDgwNiwgMTM0NCwgODA2fQotfTsKLQotc3RydWN0IFhHSTMzMF9MVkRTRGF0YVN0cnVjdCAgWEdJX0xWRFMxMjgweDc2OE5EYXRhXzJbXSA9IHsKLQl7MTM0NCwgODA2LCAxMzQ0LCA4MDZ9LAotCXsxMzQ0LCA4MDYsIDEzNDQsIDgwNn0sCi0JezEzNDQsIDgwNiwgMTM0NCwgODA2fSwKLQl7MTM0NCwgODA2LCAxMzQ0LCA4MDZ9LAotCXsxMzQ0LCA4MDYsIDEzNDQsIDgwNn0sCi0JezEzNDQsIDgwNiwgMTM0NCwgODA2fSwKLQl7MTM0NCwgODA2LCAxMzQ0LCA4MDZ9LAotCXsxMzQ0LCA4MDYsIDEzNDQsIDgwNn0sCi0JezEzNDQsIDgwNiwgMTM0NCwgODA2fQotfTsKLQotc3RydWN0IFhHSTMzMF9MVkRTRGF0YVN0cnVjdCAgWEdJX0xWRFMxMjgweDc2OFNEYXRhXzFbXSA9IHsKLQl7MTA0OCwgNDM4LCAxNjg4LCA4MDZ9LAotCXsxMDQ4LCAzODgsIDE2ODgsIDgwNn0sCi0JezExNDgsIDQzOCwgMTY4OCwgODA2fSwKLQl7MTE0OCwgMzg4LCAxNjg4LCA4MDZ9LAotCXsxMDQ4LCA1MTgsIDE2ODgsIDgwNn0sCi0JezEyMDgsIDYzOCwgMTY4OCwgODA2fSwKLQl7MTQzMiwgODA2LCAxNjg4LCA4MDZ9LAotCXsxNjg4LCA4MDYsIDE2ODgsIDgwNn0sCi0JezE2ODgsIDgwNiwgMTY4OCwgODA2fQotfTsKLQotc3RydWN0IFhHSTMzMF9MVkRTRGF0YVN0cnVjdCAgWEdJX0xWRFMxMjgweDc2OFNEYXRhXzJbXSA9IHsKLQl7MTY4OCwgODA2LCAxNjg4LCA4MDZ9LAotCXsxNjg4LCA4MDYsIDE2ODgsIDgwNn0sCi0JezE2ODgsIDgwNiwgMTY4OCwgODA2fSwKLQl7MTY4OCwgODA2LCAxNjg4LCA4MDZ9LAotCXsxNjg4LCA4MDYsIDE2ODgsIDgwNn0sCi0JezE2ODgsIDgwNiwgMTY4OCwgODA2fSwKLQl7MTY4OCwgODA2LCAxNjg4LCA4MDZ9LAotCXsxNjg4LCA4MDYsIDE2ODgsIDgwNn0sCi0JezE2ODgsIDgwNiwgMTY4OCwgODA2fQotfTsKLSovCiBzdGF0aWMgc3RydWN0IFhHSTMzMF9MVkRTRGF0YVN0cnVjdCAgWEdJX0xWRFMxNDAweDEwNTBEYXRhXzFbXSA9IHsKIAl7OTI4LCAgIDQxNiwgMTY4OCwgMTA2Nn0sCiAJezkyOCwgICAzNjYsIDE2ODgsIDEwNjZ9LApAQCAtMjUwMiwyMCArMjA2Miw2IEBACiAJezAsIDEzMjgsICAgMCwgIDc3MSwgMTEyLCA2fSAgLyogOyAwQSAoMTI4MHg3Njh4NzVIeikgKi8KIH07CiAKLSNpZiAwCi1zdGF0aWMgc3RydWN0IFhHSTMzMF9MVkRTRGF0YVN0cnVjdCAgWEdJMzMwX0xWRFM2NDB4NDgwRGF0YV8xW10gPSB7Ci0JeyA4MDAsIDQ0OSwgIDgwMCwgNDQ5fSwKLQl7IDgwMCwgNDQ5LCAgODAwLCA0NDl9LAotCXsgODAwLCA0NDksICA4MDAsIDQ0OX0sCi0JeyA4MDAsIDQ0OSwgIDgwMCwgNDQ5fSwKLQl7IDgwMCwgNTI1LCAgODAwLCA1MjV9LAotCXsxMDU2LCA2MjgsIDEwNTYsIDYyOH0sCi0JezEwNTYsIDYyOCwgMTA1NiwgNjI4fSwKLQl7MTA1NiwgNjI4LCAxMDU2LCA2Mjh9LAotCXsxMDU2LCA2MjgsIDEwNTYsIDYyOH0KLX07Ci0jZW5kaWYKLQogc3RhdGljIHN0cnVjdCBYR0kzMzBfQ0hUVkRhdGFTdHJ1Y3QgIFhHSV9DSFRWVU5UU0NEYXRhW10gPSB7CiAJeyA4NDAsIDYwMCwgIDg0MCwgNjAwfSwKIAl7IDg0MCwgNjAwLCAgODQwLCA2MDB9LApAQCAtMjgwNSw2OCArMjM1MSw2IEBACiAJeyB7MHgyOCwgMHg1QSwgMHgxMywgMHg4NywgMHhGRiwgMHgyOSwgMHhBOX0gfSAvKiA7IDA1ICh4MTAyNCkgKi8KIH07CiAKLSNpZiAwCi1zdGF0aWMgc3RydWN0IFhHSV9MVkRTQ1JUMURhdGFTdHJ1Y3QgIFhHSV9DSFRWQ1JUMVVOVFNDW10gPSB7Ci0JeyB7MHg2NCwgMHg0ZiwgMHg4OCwgMHg1NiwgMHg5ZiwgMHg1NiwgMHgzZSwKLQkgIDB4ZTgsIDB4ODQsIDB4OGYsIDB4NTcsIDB4MjAsIDB4MDAsIDB4MDEsIDB4MDAgfSB9LAotCXsgezB4NjQsIDB4NGYsIDB4ODgsIDB4NTYsIDB4OWYsIDB4NTYsIDB4M2UsCi0JICAweGQwLCAweDgyLCAweDVkLCAweDU3LCAweDAwLCAweDAwLCAweDAxLCAweDAwIH0gfSwKLQl7IHsweDY0LCAweDRmLCAweDg4LCAweDU2LCAweDlmLCAweDU2LCAweDNlLAotCSAgMHhlOCwgMHg4NCwgMHg4ZiwgMHg1NywgMHgyMCwgMHgwMCwgMHgwMSwgMHgwMCB9IH0sCi0JeyB7MHg2NCwgMHg0ZiwgMHg4OCwgMHg1NiwgMHg5ZiwgMHg1NiwgMHgzZSwKLQkgIDB4ZDAsIDB4ODIsIDB4NWQsIDB4NTcsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAgfSB9LAotCXsgezB4NWQsIDB4NGYsIDB4ODEsIDB4NTMsIDB4OWMsIDB4NTYsIDB4YmEsCi0JICAweDE4LCAweDg0LCAweGRmLCAweDU3LCAweDAwLCAweDAwLCAweDAxLCAweDAwIH0gfSwKLQl7IHsweDgwLCAweDYzLCAweDg0LCAweDZjLCAweDE3LCAweGVjLCAweGYwLAotCSAgeDkwLCAweDhjLCAweDU3LCAweGVkLCAweDIwLCAweDAwLCAweDA2LCAweDAxIH0gfQotfTsKLQotc3RhdGljIHN0cnVjdCBYR0lfTFZEU0NSVDFEYXRhU3RydWN0ICBYR0lfQ0hUVkNSVDFPTlRTQ1tdID0gewotCXsgezB4NjQsIDB4NGYsIDB4ODgsIDB4NWEsIDB4OWYsIDB4MGIsIDB4M2UsCi0JICAweGMwLCAweDg0LCAweDhmLCAweDBjLCAweDIwLCAweDAwLCAweDAxLCAweDAwIH0gfSwKLQl7IHsweDY0LCAweDRmLCAweDg4LCAweDVhLCAweDlmLCAweDBiLCAweDNlLAotCSAgMHhiMCwgMHg4ZCwgMHg1ZCwgMHgwYywgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCB9IH0sCi0JeyB7MHg2NCwgMHg0ZiwgMHg4OCwgMHg1YSwgMHg5ZiwgMHgwYiwgMHgzZSwKLQkgIDB4YzAsIDB4ODQsIDB4OGYsIDB4MGMsIDB4MjAsIDB4MDAsIDB4MDEsIDB4MDAgfSB9LAotCXsgezB4NjQsIDB4NGYsIDB4ODgsIDB4NWEsIDB4OWYsIDB4MGIsIDB4M2UsCi0JICAweGIwLCAweDhkLCAweDVkLCAweDBjLCAweDAwLCAweDAwLCAweDAxLCAweDAwIH0gfSwKLQl7IHsweDVkLCAweDRmLCAweDgxLCAweDU2LCAweDljLCAweDBiLCAweDNlLAotCSAgMHhlOCwgMHg4NCwgMHhkZiwgMHgwYywgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCB9IH0sCi0JeyB7MHg3ZCwgMHg2MywgMHg4MSwgMHg2YSwgMHgxNiwgMHhiYSwgMHhmMCwKLQkgIHg3ZiwgMHg4NiwgMHg1NywgMHhiYiwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMSB9IH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgWEdJX0xWRFNDUlQxRGF0YVN0cnVjdCAgWEdJX0NIVFZDUlQxVVBBTFtdID0gewotCXsgezB4NzksIDB4NGYsIDB4OWQsIDB4NWEsIDB4OTAsIDB4NmYsIDB4M2UsCi0JICAweGY4LCAweDgzLCAweDhmLCAweDcwLCAweDIwLCAweDAwLCAweDA1LCAweDAwIH0gfSwKLQl7IHsweDc5LCAweDRmLCAweDlkLCAweDVhLCAweDkwLCAweDZmLCAweDNlLAotCSAgMHhkZSwgMHg4MSwgMHg1ZCwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwNSwgMHgwMCB9IH0sCi0JeyB7MHg3OSwgMHg0ZiwgMHg5ZCwgMHg1YSwgMHg5MCwgMHg2ZiwgMHgzZSwKLQkgIDB4ZjgsIDB4ODMsIDB4OGYsIDB4NzAsIDB4MjAsIDB4MDAsIDB4MDUsIDB4MDAgfSB9LAotCXsgezB4NzksIDB4NGYsIDB4OWQsIDB4NWEsIDB4OTAsIDB4NmYsIDB4M2UsCi0JICAweGRlLCAweDgxLCAweDVkLCAweDcwLCAweDAwLCAweDAwLCAweDA1LCAweDAwIH0gfSwKLQl7IHsweDY0LCAweDRmLCAweDg4LCAweDU1LCAweDgwLCAweGVjLCAweGJhLAotCSAgMHg1MCwgMHg4NCwgMHhkZiwgMHhlZCwgMHgwMCwgMHgwMCwgMHgwNSwgMHgwMCB9IH0sCi0JeyB7MHg3MCwgMHg2MywgMHg5NCwgMHg2OCwgMHg4ZCwgMHg0MiwgMHhmMSwKLQkgIHhjOCwgMHg4YywgMHg1NywgMHhlOSwgMHgyMCwgMHgwMCwgMHgwNSwgMHgwMSB9IH0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgWEdJX0xWRFNDUlQxRGF0YVN0cnVjdCAgWEdJX0NIVFZDUlQxT1BBTFtdID0gewotCXsgezB4NzksIDB4NGYsIDB4OWQsIDB4NWEsIDB4OTAsIDB4NmYsIDB4M2UsCi0JICAweGYwLCAweDgzLCAweDhmLCAweDcwLCAweDIwLCAweDAwLCAweDA1LCAweDAwIH0gfSwKLQl7IHsweDc5LCAweDRmLCAweDlkLCAweDVhLCAweDkwLCAweDZmLCAweDNlLAotCSAgMHhkZSwgMHg4MSwgMHg1ZCwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwNSwgMHgwMCB9IH0sCi0JeyB7MHg3OSwgMHg0ZiwgMHg5ZCwgMHg1YSwgMHg5MCwgMHg2ZiwgMHgzZSwKLQkgIDB4ZjAsIDB4ODMsIDB4OGYsIDB4NzAsIDB4MjAsIDB4MDAsIDB4MDUsIDB4MDAgfSB9LAotCXsgezB4NzksIDB4NGYsIDB4OWQsIDB4NWEsIDB4OTAsIDB4NmYsIDB4M2UsCi0JICAweGRlLCAweDgxLCAweDVkLCAweDcwLCAweDAwLCAweDAwLCAweDA1LCAweDAwIH0gfSwKLQl7IHsweDY0LCAweDRmLCAweDg4LCAweDU1LCAweDgwLCAweDZmLCAweGJhLAotCSAgMHgyMCwgMHg4MywgMHhkZiwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwNSwgMHgwMCB9IH0sCi0JeyB7MHg3MywgMHg2MywgMHg5NywgMHg2OSwgMHg4ZSwgMHhlYywgMHhmMCwKLQkgIHg5MCwgMHg4YywgMHg1NywgMHhlZCwgMHgyMCwgMHgwMCwgMHgwNSwgMHgwMSB9IH0KLX07Ci0jZW5kaWYKLQogLyphZGQgZm9yIG5ldyBVTklWR0FCSU9TKi8KIHN0YXRpYyBzdHJ1Y3QgWEdJMzMwX0xDRERhdGFUYWJsU3RydWN0IFhHSV9MQ0REYXRhVGFibGVbXSA9IHsKIAl7UGFuZWwxMDI0eDc2OCwgMHgwMDE5LCAweDAwMDEsIDB9LCAvKiBYR0lfRXh0TENEMTAyNHg3NjhEYXRhICovCkBAIC0yOTE4LDMzICsyNDAyLDE4IEBACiAJezB4RkYsIDB4MDAwMCwgMHgwMDAwLCAwfQogfTsKIAotc3RhdGljIHN0cnVjdCBYR0kzMzBfTENERGF0YVRhYmxTdHJ1Y3QgWEdJX0VQTExDRENSVDFQdHJfSFtdID0gewotCXtQYW5lbDEwMjR4NzY4LCAweDAwMTgsIDB4MDAwMCwgMH0sIC8qIFhHSV9MVkRTQ1JUMTEwMjR4NzY4XzFfSCAqLwotCXtQYW5lbDEwMjR4NzY4LCAweDAwMTgsIDB4MDAxMCwgMX0sIC8qIFhHSV9MVkRTQ1JUMTEwMjR4NzY4XzJfSCAqLwotCXtQYW5lbDEyODB4MTAyNCwgMHgwMDE4LCAweDAwMDAsIDJ9LCAvKiBYR0lfTFZEU0NSVDExMjgweDEwMjRfMV9IICovCi0Je1BhbmVsMTI4MHgxMDI0LCAweDAwMTgsIDB4MDAxMCwgM30sIC8qIFhHSV9MVkRTQ1JUMTEyODB4MTAyNF8yX0ggKi8KLQl7UGFuZWwxNDAweDEwNTAsIDB4MDAxOCwgMHgwMDAwLCA0fSwgLyogWEdJX0xWRFNDUlQxMTQwMHgxMDUwXzFfSCAqLwotCXtQYW5lbDE0MDB4MTA1MCwgMHgwMDE4LCAweDAwMTAsIDV9LCAvKiBYR0lfTFZEU0NSVDExNDAweDEwNTBfMl9IICovCi0Je1BhbmVsMTYwMHgxMjAwLCAweDAwMTgsIDB4MDAwMCwgNn0sIC8qIFhHSV9MVkRTQ1JUMTE2MDB4MTIwMF8xX0ggKi8KLQl7UGFuZWwxMDI0eDc2OHg3NSwgMHgwMDE4LCAweDAwMDAsIDd9LCAvKiBYR0lfTFZEU0NSVDExMDI0eDc2OF8xX0h4NzUgKi8KLQl7UGFuZWwxMDI0eDc2OHg3NSwgMHgwMDE4LCAweDAwMTAsIDh9LCAvKiBYR0lfTFZEU0NSVDExMDI0eDc2OF8yX0h4NzUgKi8KLQl7UGFuZWwxMjgweDEwMjR4NzUsIDB4MDAxOCwgMHgwMDAwLCA5fSwgLypYR0lfTFZEU0NSVDExMjgweDEwMjRfMV9IeDc1Ki8KLQl7UGFuZWwxMjgweDEwMjR4NzUsIDB4MDAxOCwgMHgwMDEwLCAxMH0sLypYR0lfTFZEU0NSVDExMjgweDEwMjRfMl9IeDc1Ki8KLQl7MHhGRiwgMHgwMDAwLCAweDAwMDAsIDB9Ci19OwotCi1zdGF0aWMgc3RydWN0IFhHSTMzMF9MQ0REYXRhVGFibFN0cnVjdCBYR0lfRVBMTENEQ1JUMVB0cl9WW10gPSB7Ci0Je1BhbmVsMTAyNHg3NjgsIDB4MDAxOCwgMHgwMDAwLCAwfSwgLyogWEdJX0xWRFNDUlQxMTAyNHg3NjhfMV9WICovCi0Je1BhbmVsMTAyNHg3NjgsIDB4MDAxOCwgMHgwMDEwLCAxfSwgLyogWEdJX0xWRFNDUlQxMTAyNHg3NjhfMl9WICovCi0Je1BhbmVsMTI4MHgxMDI0LCAweDAwMTgsIDB4MDAwMCwgMn0sIC8qIFhHSV9MVkRTQ1JUMTEyODB4MTAyNF8xX1YgKi8KLQl7UGFuZWwxMjgweDEwMjQsIDB4MDAxOCwgMHgwMDEwLCAzfSwgLyogWEdJX0xWRFNDUlQxMTI4MHgxMDI0XzJfViAqLwotCXtQYW5lbDE0MDB4MTA1MCwgMHgwMDE4LCAweDAwMDAsIDR9LCAvKiBYR0lfTFZEU0NSVDExNDAweDEwNTBfMV9WICovCi0Je1BhbmVsMTQwMHgxMDUwLCAweDAwMTgsIDB4MDAxMCwgNX0sIC8qIFhHSV9MVkRTQ1JUMTE0MDB4MTA1MF8yX1YgKi8KLQl7UGFuZWwxNjAweDEyMDAsIDB4MDAxOCwgMHgwMDAwLCA2fSwgLyogWEdJX0xWRFNDUlQxMTYwMHgxMjAwXzFfViAqLwotCXtQYW5lbDEwMjR4NzY4eDc1LCAweDAwMTgsIDB4MDAwMCwgN30sIC8qIFhHSV9MVkRTQ1JUMTEwMjR4NzY4XzFfVng3NSAqLwotCXtQYW5lbDEwMjR4NzY4eDc1LCAweDAwMTgsIDB4MDAxMCwgOH0sIC8qIFhHSV9MVkRTQ1JUMTEwMjR4NzY4XzJfVng3NSAqLwotCXtQYW5lbDEyODB4MTAyNHg3NSwgMHgwMDE4LCAweDAwMDAsIDl9LCAvKlhHSV9MVkRTQ1JUMTEyODB4MTAyNF8xX1Z4NzUqLwotCXtQYW5lbDEyODB4MTAyNHg3NSwgMHgwMDE4LCAweDAwMTAsIDEwfSwvKlhHSV9MVkRTQ1JUMTEyODB4MTAyNF8yX1Z4NzUqLworc3RhdGljIHN0cnVjdCBYR0kzMzBfTENERGF0YVRhYmxTdHJ1Y3QgeGdpZmJfZXBsbGNkX2NydDFbXSA9IHsKKwl7UGFuZWwxMDI0eDc2OCwgMHgwMDE4LCAweDAwMDAsIDB9LCAvKiBYR0lfTFZEU0NSVDExMDI0eDc2OF8xICovCisJe1BhbmVsMTAyNHg3NjgsIDB4MDAxOCwgMHgwMDEwLCAxfSwgLyogWEdJX0xWRFNDUlQxMTAyNHg3NjhfMiAqLworCXtQYW5lbDEyODB4MTAyNCwgMHgwMDE4LCAweDAwMDAsIDJ9LCAvKiBYR0lfTFZEU0NSVDExMjgweDEwMjRfMSAqLworCXtQYW5lbDEyODB4MTAyNCwgMHgwMDE4LCAweDAwMTAsIDN9LCAvKiBYR0lfTFZEU0NSVDExMjgweDEwMjRfMiAqLworCXtQYW5lbDE0MDB4MTA1MCwgMHgwMDE4LCAweDAwMDAsIDR9LCAvKiBYR0lfTFZEU0NSVDExNDAweDEwNTBfMSAqLworCXtQYW5lbDE0MDB4MTA1MCwgMHgwMDE4LCAweDAwMTAsIDV9LCAvKiBYR0lfTFZEU0NSVDExNDAweDEwNTBfMiAqLworCXtQYW5lbDE2MDB4MTIwMCwgMHgwMDE4LCAweDAwMDAsIDZ9LCAvKiBYR0lfTFZEU0NSVDExNjAweDEyMDBfMSAqLworCXtQYW5lbDEwMjR4NzY4eDc1LCAweDAwMTgsIDB4MDAwMCwgN30sIC8qIFhHSV9MVkRTQ1JUMTEwMjR4NzY4XzF4NzUgKi8KKwl7UGFuZWwxMDI0eDc2OHg3NSwgMHgwMDE4LCAweDAwMTAsIDh9LCAvKiBYR0lfTFZEU0NSVDExMDI0eDc2OF8yeDc1ICovCisJe1BhbmVsMTI4MHgxMDI0eDc1LCAweDAwMTgsIDB4MDAwMCwgOX0sIC8qWEdJX0xWRFNDUlQxMTI4MHgxMDI0XzF4NzUqLworCXtQYW5lbDEyODB4MTAyNHg3NSwgMHgwMDE4LCAweDAwMTAsIDEwfSwvKlhHSV9MVkRTQ1JUMTEyODB4MTAyNF8yeDc1Ki8KIAl7MHhGRiwgMHgwMDAwLCAweDAwMDAsIDB9CiB9OwogCkBAIC0zMDA3LDQzICsyNDc2LDEyIEBACiAJezB4ZmZmZiwgMHgwMDAwLCAxMn0gIC8qIEVORCAqLwogfTsKIAotI2lmIDAKLXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBUVkxlbkxpc3RbXSA9IHsKLQlMVkRTQ1JUMUxlbl9ILAotCUxWRFNDUlQxTGVuX1YsCi0JTFZEU0RhdGFMZW4sCi0JMCwKLQlUVkRhdGFMZW4sCi0JMCwKLQkwLAotCUNIVFZSZWdMZW4KLX07Ci0jZW5kaWYKLQotLyogQ2hyb250ZWwgNzAxNyBUViBDUlQxIFRpbWluZyBMaXN0ICovCi1zdGF0aWMgc3RydWN0IFhHSTMzMF9UVkRhdGFUYWJsU3RydWN0IFhHSV9FUExDSFRWQ1JUMVB0cltdID0gewotCXsweDAwMTEsIDB4MDAwMCwgMH0sIC8qIFhHSV9DSFRWQ1JUMVVOVFNDICovCi0JezB4MDAxMSwgMHgwMDEwLCAxfSwgLyogWEdJX0NIVFZDUlQxT05UU0MgKi8KLQl7MHgwMDExLCAweDAwMDEsIDJ9LCAvKiBYR0lfQ0hUVkNSVDFVUEFMICovCi0JezB4MDAxMSwgMHgwMDExLCAzfSwgLyogWEdJX0NIVFZDUlQxT1BBTCAqLwotCXsweEZGRkYsIDB4MDAwMCwgNH0KLX07Ci0KLS8qIDs7Q2hyb250ZWwgNzAxNyBUViBUaW1pbmcgTGlzdCAqLwotc3RhdGljIHN0cnVjdCBYR0kzMzBfVFZEYXRhVGFibFN0cnVjdCBYR0lfRVBMQ0hUVkRhdGFQdHJbXSA9IHsKLQl7MHgwMDExLCAweDAwMDAsIDB9LCAvKiBYR0lfQ0hUVlVOVFNDRGF0YSAqLwotCXsweDAwMTEsIDB4MDAxMCwgMX0sIC8qIFhHSV9DSFRWT05UU0NEYXRhICovCi0JezB4MDAxMSwgMHgwMDAxLCAyfSwgLyogWEdJX0NIVFZVUEFMRGF0YSAqLwotCXsweDAwMTEsIDB4MDAxMSwgM30sIC8qIFhHSV9DSFRWT1BBTERhdGEgKi8KLQl7MHhGRkZGLCAweDAwMDAsIDR9Ci19OwotCi0vKiA7O0Nocm9udGVsIDcwMTcgVFYgUmVnLiBMaXN0ICovCi1zdGF0aWMgc3RydWN0IFhHSTMzMF9UVkRhdGFUYWJsU3RydWN0IFhHSV9FUExDSFRWUmVnUHRyW10gPSB7Ci0JezB4MDAxMSwgMHgwMDAwLCAwfSwgLyogWEdJX0NIVFZSZWdVTlRTQyAqLwotCXsweDAwMTEsIDB4MDAxMCwgMX0sIC8qIFhHSV9DSFRWUmVnT05UU0MgKi8KLQl7MHgwMDExLCAweDAwMDEsIDJ9LCAvKiBYR0lfQ0hUVlJlZ1VQQUwgKi8KLQl7MHgwMDExLCAweDAwMTEsIDN9LCAvKiBYR0lfQ0hUVlJlZ09QQUwgKi8KKy8qIENocm9udGVsIDcwMTcgVFYgTGlzdCAqLworc3RhdGljIHN0cnVjdCBYR0kzMzBfVFZEYXRhVGFibFN0cnVjdCB4Z2lmYl9jaHJvbnRlbF90dltdID0geworCXsweDAwMTEsIDB4MDAwMCwgMH0sIC8qIFVOVFNDICovCisJezB4MDAxMSwgMHgwMDEwLCAxfSwgLyogT05UU0MgKi8KKwl7MHgwMDExLCAweDAwMDEsIDJ9LCAvKiBVUEFMICovCisJezB4MDAxMSwgMHgwMDExLCAzfSwgLyogT1BBTCAqLwogCXsweEZGRkYsIDB4MDAwMCwgNH0KIH07CiAKQEAgLTMwNjAsNDQgKzI0OTgsNiBAQAogCTAKIH07CiAKLSNpZiAwCi0vKiA2NjAsIER1YWwgbGluayAqLwotc3RhdGljIHN0cnVjdCBYR0kzMzBfTENEQ2FwU3RydWN0ICBYR0k2NjBfTENERExDYXBMaXN0W10gPSB7Ci0vKiBMQ0RDYXAxMDI0eDc2OCAqLwotCXtQYW5lbDEwMjR4NzY4LCBEZWZhdWx0TENEQ2FwLCAwLCAweDAxNCwgMHg4OCwgMHgwNiwgVkNMSzY1LAotCSAweDZDLCAweEMzLCAweDM1LCAweDYyLCAweDAyLCAweDE0LCAweDBBLCAweDAyLCAweDAwLAotCSAweDMwLCAweDEwLCAweDVBLCAweDEwLCAweDEwLCAweDBBLCAweEMwLCAweDI4LCAweDEwfSwKLS8qIExDRENhcDEyODB4MTAyNCAqLwotCXtQYW5lbDEyODB4MTAyNCwgTENERHVhbExpbmsrRGVmYXVsdExDRENhcCwgU3RMQ0RCVG9BLAotCTB4MDUzLCAweDcwLCAweDAzLCBWQ0xLMTA4XzIsCi0JIDB4NzAsIDB4NDQsIDB4RjgsIDB4MkYsIDB4MDIsIDB4MTQsIDB4MEEsIDB4MDIsIDB4MDAsCi0JIDB4MzAsIDB4MTAsIDB4NUEsIDB4MTAsIDB4MTAsIDB4MEEsIDB4QzAsIDB4MzAsIDB4MTB9LAotLyogTENEQ2FwMTQwMHgxMDUwICovCi0Je1BhbmVsMTQwMHgxMDUwLCBMQ0REdWFsTGluaytEZWZhdWx0TENEQ2FwLCBTdExDREJUb0EsCi0JMHgwNTMsIDB4NzAsIDB4MDMsIFZDTEsxMDhfMiwKLQkgMHg3MCwgMHg0NCwgMHhGOCwgMHgyRiwgMHgwMiwgMHgxNCwgMHgwQSwgMHgwMiwgMHgwMCwKLQkgMHgzMCwgMHgxMCwgMHg1QSwgMHgxMCwgMHgxMCwgMHgwQSwgMHhDMCwgMHgzMCwgMHgxMH0sCi0vKiBMQ0RDYXAxNjAweDEyMDAgKi8KLQl7UGFuZWwxNjAweDEyMDAsIExDRER1YWxMaW5rK0RlZmF1bHRMQ0RDYXAsIExDRFRvRnVsbCwKLQkweDA1MywgMHhDMCwgMHgwMywgVkNMSzE2MiwKLQkgMHg0MywgMHgyMiwgMHg3MCwgMHgyNCwgMHgwMiwgMHgxNCwgMHgwQSwgMHgwMiwgMHgwMCwKLQkgMHgzMCwgMHgxMCwgMHg1QSwgMHgxMCwgMHgxMCwgMHgwQSwgMHhDMCwgMHgzMCwgMHgxMH0sCi0vKiBMQ0RDYXAxMDI0eDc2OHg3NSAqLwotCXtQYW5lbDEwMjR4NzY4eDc1LCBEZWZhdWx0TENEQ2FwLCAwLCAweDAxNCwgMHg2MCwgMCwgVkNMSzc4Xzc1LAotCSAweDJCLCAweDYxLCAweDJCLCAweDYxLCAweDAyLCAweDE0LCAweDBBLCAweDAyLCAweDAwLAotCSAweDMwLCAweDEwLCAweDVBLCAweDEwLCAweDEwLCAweDBBLCAweEMwLCAweDI4LCAweDEwfSwKLS8qIExDRENhcDEyODB4MTAyNHg3NSAqLwotCXtQYW5lbDEyODB4MTAyNHg3NSwgTENERHVhbExpbmsrRGVmYXVsdExDRENhcCwgU3RMQ0RCVG9BLAotCTB4MDUzLCAweDkwLCAweDAzLCBWQ0xLMTM1XzUsCi0JIDB4NTQsIDB4NDIsIDB4NEEsIDB4NjEsIDB4MDIsIDB4MTQsIDB4MEEsIDB4MDIsIDB4MDAsCi0JIDB4MzAsIDB4MTAsIDB4NUEsIDB4MTAsIDB4MTAsIDB4MEEsIDB4QzAsIDB4MzAsIDB4MTB9LAotLyogTENEQ2FwRGVmYXVsdCAqLwotCXsweEZGLCBEZWZhdWx0TENEQ2FwLCAwLCAweDA1MywgMHg4OCwgMHgwNiwgVkNMSzY1LAotCTB4NkMsIDB4QzMsIDB4MzUsIDB4NjIsIDB4MDIsIDB4MTQsIDB4MEEsIDB4MDIsIDB4MDAsCi0JMHgzMCwgMHgxMCwgMHg1QSwgMHgxMCwgMHgxMCwgMHgwQSwgMHhDMCwgMHgyOCwgMHgxMH0KLX07Ci0jZW5kaWYKLQogLyogRHVhbCBsaW5rIG9ubHkgKi8KIHN0YXRpYyBzdHJ1Y3QgWEdJMzMwX0xDRENhcFN0cnVjdCAgWEdJX0xDRERMQ2FwTGlzdFtdID0gewogLyogTENEQ2FwMTAyNHg3NjggKi8KQEAgLTMxMzQsNDAgKzI1MzQsNiBAQAogCTB4MzAsIDB4MTAsIDB4NUEsIDB4MTAsIDB4MTAsIDB4MEEsIDB4QzAsIDB4MjgsIDB4MTB9CiB9OwogCi0jaWYgMAotc3RhdGljIHN0cnVjdCBYR0kzMzBfTENEQ2FwU3RydWN0ICBYR0k2NjBfTENEQ2FwTGlzdFtdID0gewotLyogTENEQ2FwMTAyNHg3NjggKi8KLQl7UGFuZWwxMDI0eDc2OCwgRGVmYXVsdExDRENhcCwgMCwgMHgwMTQsIDB4ODgsIDB4MDYsIFZDTEs2NSwKLQkweDZDLCAweEMzLCAweDM1LCAweDYyLCAweDAyLCAweDE0LCAweDBBLCAweDAyLCAweDAwLAotCTB4MzAsIDB4MTAsIDB4NUEsIDB4MTAsIDB4MTAsIDB4MEEsIDB4QzAsIDB4MjgsIDB4MTB9LAotLyogTENEQ2FwMTI4MHgxMDI0ICovCi0Je1BhbmVsMTI4MHgxMDI0LCBEZWZhdWx0TENEQ2FwLCBTdExDREJUb0EsIDB4MDUzLCAweDcwLCAweDAzLCBWQ0xLMTA4XzIsCi0JMHg3MCwgMHg0NCwgMHhGOCwgMHgyRiwgMHgwMiwgMHgxNCwgMHgwQSwgMHgwMiwgMHgwMCwKLQkweDMwLCAweDEwLCAweDVBLCAweDEwLCAweDEwLCAweDBBLCAweEMwLCAweDMwLCAweDEwfSwKLS8qIExDRENhcDE0MDB4MTA1MCAqLwotCXtQYW5lbDE0MDB4MTA1MCwgRGVmYXVsdExDRENhcCwgU3RMQ0RCVG9BLCAweDA1MywgMHg3MCwgMHgwMywgVkNMSzEwOF8yLAotCSAweDcwLCAweDQ0LCAweEY4LCAweDJGLCAweDAyLCAweDE0LCAweDBBLCAweDAyLCAweDAwLAotCSAweDMwLCAweDEwLCAweDVBLCAweDEwLCAweDEwLCAweDBBLCAweEMwLCAweDMwLCAweDEwfSwKLS8qIExDRENhcDE2MDB4MTIwMCAqLwotCXtQYW5lbDE2MDB4MTIwMCwgRGVmYXVsdExDRENhcCwgTENEVG9GdWxsLCAweDA1MywgMHhDMCwgMHgwMywgVkNMSzE2MiwKLQkgMHg1QSwgMHgyMywgMHg1QSwgMHgyMywgMHgwMiwgMHgxNCwgMHgwQSwgMHgwMiwgMHgwMCwKLQkgMHgzMCwgMHgxMCwgMHg1QSwgMHgxMCwgMHgxMCwgMHgwQSwgMHhDMCwgMHgzMCwgMHgxMH0sCi0vKiBMQ0RDYXAxMDI0eDc2OHg3NSAqLwotCXtQYW5lbDEwMjR4NzY4eDc1LCBEZWZhdWx0TENEQ2FwLCAwLCAweDAxNCwgMHg2MCwgMCwgVkNMSzc4Xzc1LAotCSAweDJCLCAweDYxLCAweDJCLCAweDYxLCAweDAyLCAweDE0LCAweDBBLCAweDAyLCAweDAwLAotCSAweDMwLCAweDEwLCAweDVBLCAweDEwLCAweDEwLCAweDBBLCAweEMwLCAweDI4LCAweDEwfSwKLS8qIExDRENhcDEyODB4MTAyNHg3NSAqLwotCXtQYW5lbDEyODB4MTAyNHg3NSwgKyBEZWZhdWx0TENEQ2FwLCBTdExDREJUb0EsCi0JMHgwNTMsIDB4OTAsIDB4MDMsIFZDTEsxMzVfNSwKLQkgMHg1NCwgMHg0MiwgMHg0QSwgMHg2MSwgMHgwMiwgMHgxNCwgMHgwQSwgMHgwMiwgMHgwMCwKLQkgMHgzMCwgMHgxMCwgMHg1QSwgMHgxMCwgMHgxMCwgMHgwQSwgMHhDMCwgMHgzMCwgMHgxMH0sCi0vKiBMQ0RDYXBEZWZhdWx0ICovCi0JezB4RkYsIERlZmF1bHRMQ0RDYXAsIDAsIDB4MDUzLCAweDg4LCAweDA2LCBWQ0xLNjUsCi0JMHg2QywgMHhDMywgMHgzNSwgMHg2MiwgMHgwMiwgMHgxNCwgMHgwQSwgMHgwMiwgMHgwMCwKLQkweDMwLCAweDEwLCAweDVBLCAweDEwLCAweDEwLCAweDBBLCAweEMwLCAweDI4LCAweDEwfQotfTsKLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IFhHSTMzMF9MQ0RDYXBTdHJ1Y3QgIFhHSV9MQ0RDYXBMaXN0W10gPSB7CiAvKiBMQ0RDYXAxMDI0eDc2OCAqLwogCXtQYW5lbDEwMjR4NzY4LCBEZWZhdWx0TENEQ2FwLCAwLCAweDAxMiwgMHg4OCwgMHgwNiwgVkNMSzY1LApAQCAtMzM4NCwxNjkgKzI3NTAsNiBAQAogCTB4MzAsIDB4NDcsIDB4MzcsIDEwMjQsIDc2OH0sLyogNDggMTAyNHg3Njh4MTYwSHogKi8KIH07CiAKLQotI2lmIDAKLXN0YXRpYyBzdHJ1Y3QgWEdJMzMwX1ZDTEtEYXRhU3RydWN0IFhHSTMzMF9WQ0xLRGF0YVtdID0gewotCXsweDFiLCAweGUxLCAgMjV9LCAvKiAweDAgKi8KLQl7MHg0ZSwgMHhlNCwgIDI4fSwgLyogMHgxICovCi0JezB4NTcsIDB4ZTQsICAzMX0sIC8qIDB4MiAqLwotCXsweGMzLCAweGM4LCAgMzZ9LCAvKiAweDMgKi8KLQl7MHg0MiwgMHhlMiwgIDQwfSwgLyogMHg0ICovCi0JezB4ZmUsIDB4Y2QsICA0M30sIC8qIDB4NSAqLwotCXsweDVkLCAweGM0LCAgNDR9LCAvKiAweDYgKi8KLQl7MHg1MiwgMHhlMiwgIDQ5fSwgLyogMHg3ICovCi0JezB4NTMsIDB4ZTIsICA1MH0sIC8qIDB4OCAqLwotCXsweDc0LCAweDY3LCAgNTJ9LCAvKiAweDkgKi8KLQl7MHg2ZCwgMHg2NiwgIDU2fSwgLyogMHhhICovCi0JezB4NmMsIDB4YzMsICA2NX0sIC8qIDB4YiAqLwotCXsweDQ2LCAweDQ0LCAgNjd9LCAvKiAweGMgKi8KLQl7MHhiMSwgMHg0NiwgIDY4fSwgLyogMHhkICovCi0JezB4ZDMsIDB4NGEsICA3Mn0sIC8qIDB4ZSAqLwotCXsweDI5LCAweDYxLCAgNzV9LCAvKiAweGYgKi8KLQl7MHg2ZSwgMHg0NiwgIDc2fSwgLyogMHgxMCAqLwotCXsweDJiLCAweDYxLCAgNzh9LCAvKiAweDExICovCi0JezB4MzEsIDB4NDIsICA3OX0sIC8qIDB4MTIgKi8KLQl7MHhhYiwgMHg0NCwgIDgzfSwgLyogMHgxMyAqLwotCXsweDQ2LCAweDI1LCAgODR9LCAvKiAweDE0ICovCi0JezB4NzgsIDB4MjksICA4Nn0sIC8qIDB4MTUgKi8KLQl7MHg2MiwgMHg0NCwgIDk0fSwgLyogMHgxNiAqLwotCXsweDJiLCAweDQxLCAxMDR9LCAvKiAweDE3ICovCi0JezB4M2EsIDB4MjMsIDEwNX0sIC8qIDB4MTggKi8KLQl7MHg3MCwgMHg0NCwgMTA4fSwgLyogMHgxOSAqLwotCXsweDNjLCAweDIzLCAxMDl9LCAvKiAweDFhICovCi0JezB4NWUsIDB4NDMsIDExM30sIC8qIDB4MWIgKi8KLQl7MHhiYywgMHg0NCwgMTE2fSwgLyogMHgxYyAqLwotCXsweGUwLCAweDQ2LCAxMzJ9LCAvKiAweDFkICovCi0JezB4NTQsIDB4NDIsIDEzNX0sIC8qIDB4MWUgKi8KLQl7MHhlYSwgMHgyYSwgMTM5fSwgLyogMHgxZiAqLwotCXsweDQxLCAweDIyLCAxNTd9LCAvKiAweDIwICovCi0JezB4NzAsIDB4MjQsIDE2Mn0sIC8qIDB4MjEgKi8KLQl7MHgzMCwgMHgyMSwgMTc1fSwgLyogMHgyMiAqLwotCXsweDRlLCAweDIyLCAxODl9LCAvKiAweDIzICovCi0JezB4ZGUsIDB4MjYsIDE5NH0sIC8qIDB4MjQgKi8KLQl7MHg2MiwgMHgwNiwgMjAyfSwgLyogMHgyNSAqLwotCXsweDNmLCAweDAzLCAyMjl9LCAvKiAweDI2ICovCi0JezB4YjgsIDB4MDYsIDIzNH0sIC8qIDB4MjcgKi8KLQl7MHgzNCwgMHgwMiwgMjUzfSwgLyogMHgyOCAqLwotCXsweDU4LCAweDA0LCAyNTV9LCAvKiAweDI5ICovCi0JezB4MjQsIDB4MDEsIDI2NX0sIC8qIDB4MmEgKi8KLQl7MHg5YiwgMHgwMiwgMjY3fSwgLyogMHgyYiAqLwotCXsweDcwLCAweDA1LCAyNzB9LCAvKiAweDJjICovCi0JezB4MjUsIDB4MDEsIDI3Mn0sIC8qIDB4MmQgKi8KLQl7MHg5YywgMHgwMiwgMjc3fSwgLyogMHgyZSAqLwotCXsweDI3LCAweDAxLCAyODZ9LCAvKiAweDJmICovCi0JezB4M2MsIDB4MDIsIDI5MX0sIC8qIDB4MzAgKi8KLQl7MHhlZiwgMHgwYSwgMjkyfSwgLyogMHgzMSAqLwotCXsweGY2LCAweDBhLCAzMTB9LCAvKiAweDMyICovCi0JezB4OTUsIDB4MDEsIDMxNX0sIC8qIDB4MzMgKi8KLQl7MHhmMCwgMHgwOSwgMzI0fSwgLyogMHgzNCAqLwotCXsweGZlLCAweDBhLCAzMzF9LCAvKiAweDM1ICovCi0JezB4ZjMsIDB4MDksIDMzMn0sIC8qIDB4MzYgKi8KLQl7MHhlYSwgMHgwOCwgMzQwfSwgLyogMHgzNyAqLwotCXsweGU4LCAweDA3LCAzNzZ9LCAvKiAweDM4ICovCi0JezB4ZGUsIDB4MDYsIDM4OX0sIC8qIDB4MzkgKi8KLQl7MHg1MiwgMHgyYSwgIDU0fSwgLyogMHgzYSAqLwotCXsweDUyLCAweDZhLCAgMjd9LCAvKiAweDNiICovCi0JezB4NjIsIDB4MjQsICA3MH0sIC8qIDB4M2MgKi8KLQl7MHg2MiwgMHg2NCwgIDcwfSwgLyogMHgzZCAqLwotCXsweGE4LCAweDRjLCAgMzB9LCAvKiAweDNlICovCi0JezB4MjAsIDB4MjYsICAzM30sIC8qIDB4M2YgKi8KLQl7MHgzMSwgMHhjMiwgIDM5fSwgLyogMHg0MCAqLwotCXsweDYwLCAweDM2LCAgMzB9LCAvKiAweDQxICovCi0JezB4NDAsIDB4NEEsICAyOH0sIC8qIDB4NDIgKi8KLQl7MHg5RiwgMHg0NiwgIDQ0fSwgLyogMHg0MyAqLwotCXsweDk3LCAweDJDLCAgMjZ9LCAvKiAweDQ0ICovCi0JezB4NDQsIDB4RTQsICAyNX0sIC8qIDB4NDUgKi8KLQl7MHg3RSwgMHgzMiwgIDQ3fSwgLyogMHg0NiAqLwotCXsweDA4LCAweDI0LCAgMzF9LCAvKiAweDQ3ICovCi0JezB4OTcsIDB4MmMsICAyNn0sIC8qIDB4NDggKi8KLQl7MHhDRSwgMHgzYywgIDM5fSwgLyogMHg0OSAqLwotCXsweDUyLCAweDRBLCAgMzZ9LCAvKiAweDRhICovCi0JezB4MkMsIDB4NjEsICA5NX0sIC8qIDB4NGIgKi8KLQl7MHg3OCwgMHgyNywgMTA4fSwgLyogMHg0YyAqLwotCXsweDY2LCAweDQzLCAxMjN9LCAgLyogMHg0ZCAqLwotCXsweDJjLCAweDYxLCAgODB9LCAgLyogMHg0ZSAqLwotCXsweDNiLCAweDYxLCAxMDh9ICAvKiAweDRmICovCi19OwotCi1zdGF0aWMgc3RydWN0IFhHSV9WQlZDTEtEYXRhU3RydWN0IFhHSTMzMF9WQlZDTEtEYXRhW10gPSB7Ci0JezB4MWIsIDB4ZTEsICAyNX0sIC8qIDB4MCAqLwotCXsweDRlLCAweGU0LCAgMjh9LCAvKiAweDEgKi8KLQl7MHg1NywgMHhlNCwgIDMxfSwgLyogMHgyICovCi0JezB4YzMsIDB4YzgsICAzNn0sIC8qIDB4MyAqLwotCXsweDQyLCAweDQ3LCAgNDB9LCAvKiAweDQgKi8KLQl7MHhmZSwgMHhjZCwgIDQzfSwgLyogMHg1ICovCi0JezB4NWQsIDB4YzQsICA0NH0sIC8qIDB4NiAqLwotCXsweDUyLCAweDQ3LCAgNDl9LCAvKiAweDcgKi8KLQl7MHg1MywgMHg0NywgIDUwfSwgLyogMHg4ICovCi0JezB4NzQsIDB4NjcsICA1Mn0sIC8qIDB4OSAqLwotCXsweDZkLCAweDY2LCAgNTZ9LCAvKiAweGEgKi8KLQl7MHg1YSwgMHg2NCwgIDY1fSwgLyogMHhiICovCi0JezB4NDYsIDB4NDQsICA2N30sIC8qIDB4YyAqLwotCXsweGIxLCAweDQ2LCAgNjh9LCAvKiAweGQgKi8KLQl7MHhkMywgMHg0YSwgIDcyfSwgLyogMHhlICovCi0JezB4MjksIDB4NjEsICA3NX0sIC8qIDB4ZiAqLwotCXsweDZkLCAweDQ2LCAgNzV9LCAvKiAweDEwICovCi0JezB4NDEsIDB4NDMsICA3OH0sIC8qIDB4MTEgKi8KLQl7MHgzMSwgMHg0MiwgIDc5fSwgLyogMHgxMiAqLwotCXsweGFiLCAweDQ0LCAgODN9LCAvKiAweDEzICovCi0JezB4NDYsIDB4MjUsICA4NH0sIC8qIDB4MTQgKi8KLQl7MHg3OCwgMHgyOSwgIDg2fSwgLyogMHgxNSAqLwotCXsweDYyLCAweDQ0LCAgOTR9LCAvKiAweDE2ICovCi0JezB4MmIsIDB4MjIsIDEwNH0sIC8qIDB4MTcgKi8KLQl7MHg0OSwgMHgyNCwgMTA1fSwgLyogMHgxOCAqLwotCXsweGY4LCAweDJmLCAxMDh9LCAvKiAweDE5ICovCi0JezB4M2MsIDB4MjMsIDEwOX0sIC8qIDB4MWEgKi8KLQl7MHg1ZSwgMHg0MywgMTEzfSwgLyogMHgxYiAqLwotCXsweGJjLCAweDQ0LCAxMTZ9LCAvKiAweDFjICovCi0JezB4ZTAsIDB4NDYsIDEzMn0sIC8qIDB4MWQgKi8KLQl7MHhkNCwgMHgyOCwgMTM1fSwgLyogMHgxZSAqLwotCXsweGVhLCAweDJhLCAxMzl9LCAvKiAweDFmICovCi0JezB4NDEsIDB4MjIsIDE1N30sIC8qIDB4MjAgKi8KLQl7MHg3MCwgMHgyNCwgMTYyfSwgLyogMHgyMSAqLwotCXsweDMwLCAweDIxLCAxNzV9LCAvKiAweDIyICovCi0JezB4NGUsIDB4MjIsIDE4OX0sIC8qIDB4MjMgKi8KLQl7MHhkZSwgMHgyNiwgMTk0fSwgLyogMHgyNCAqLwotCXsweDcwLCAweDA3LCAyMDJ9LCAvKiAweDI1ICovCi0JezB4M2YsIDB4MDMsIDIyOX0sIC8qIDB4MjYgKi8KLQl7MHhiOCwgMHgwNiwgMjM0fSwgLyogMHgyNyAqLwotCXsweDM0LCAweDAyLCAyNTN9LCAvKiAweDI4ICovCi0JezB4NTgsIDB4MDQsIDI1NX0sIC8qIDB4MjkgKi8KLQl7MHgyNCwgMHgwMSwgMjY1fSwgLyogMHgyYSAqLwotCXsweDliLCAweDAyLCAyNjd9LCAvKiAweDJiICovCi0JezB4NzAsIDB4MDUsIDI3MH0sIC8qIDB4MmMgKi8KLQl7MHgyNSwgMHgwMSwgMjcyfSwgLyogMHgyZCAqLwotCXsweDljLCAweDAyLCAyNzd9LCAvKiAweDJlICovCi0JezB4MjcsIDB4MDEsIDI4Nn0sIC8qIDB4MmYgKi8KLQl7MHgzYywgMHgwMiwgMjkxfSwgLyogMHgzMCAqLwotCXsweGVmLCAweDBhLCAyOTJ9LCAvKiAweDMxICovCi0JezB4ZjYsIDB4MGEsIDMxMH0sIC8qIDB4MzIgKi8KLQl7MHg5NSwgMHgwMSwgMzE1fSwgLyogMHgzMyAqLwotCXsweGYwLCAweDA5LCAzMjR9LCAvKiAweDM0ICovCi0JezB4ZmUsIDB4MGEsIDMzMX0sIC8qIDB4MzUgKi8KLQl7MHhmMywgMHgwOSwgMzMyfSwgLyogMHgzNiAqLwotCXsweGVhLCAweDA4LCAzNDB9LCAvKiAweDM3ICovCi0JezB4ZTgsIDB4MDcsIDM3Nn0sIC8qIDB4MzggKi8KLQl7MHhkZSwgMHgwNiwgMzg5fSwgLyogMHgzOSAqLwotCXsweDUyLCAweDJhLCAgNTR9LCAvKiAweDNhICovCi0JezB4NTIsIDB4NmEsICAyN30sIC8qIDB4M2IgKi8KLQl7MHg2MiwgMHgyNCwgIDcwfSwgLyogMHgzYyAqLwotCXsweDYyLCAweDY0LCAgNzB9LCAvKiAweDNkICovCi0JezB4YTgsIDB4NGMsICAzMH0sIC8qIDB4M2UgKi8KLQl7MHgyMCwgMHgyNiwgIDMzfSwgLyogMHgzZiAqLwotCXsweDMxLCAweGMyLCAgMzl9LCAvKiAweDQwICovCi0JezB4MmUsIDB4NDgsICAyNX0sIC8qIDB4NDEgKi8KLQl7MHgyNCwgMHg0NiwgIDI1fSwgLyogMHg0MiAqLwotCXsweDI2LCAweDY0LCAgMjh9LCAvKiAweDQzICovCi0JezB4MzcsIDB4NjQsICA0MH0sIC8qIDB4NDQgKi8KLQl7MHhhMSwgMHg0MiwgMTA4fSwgLyogMHg0NSAqLwotCXsweDM3LCAweDYxLCAxMDB9LCAvKiAweDQ2ICovCi0JezB4NzgsIDB4MjcsIDEwOH0sIC8qIDB4NDcgKi8KLQl7MHg1ZSwgMHg2NCwgNjh9LCAgLyogMHg0OCBjaGlhd2VuIGZvciBmdWoxMjgweDc2OCovCi0JezB4NzAsIDB4NDQsIDEwOH0sIC8qIDB4NDkgY2hpYXdlbiBmb3IgMTQwMHgxMDUwKi8KLX07Ci0jZW5kaWYKLQogc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJMzMwX1NjcmVlbk9mZnNldFtdID0gewogCTB4MTQsIDB4MTksIDB4MjAsIDB4MjgsIDB4MzIsIDB4NDAsCiAJMHg1MCwgMHg2NCwgMHg3OCwgMHg4MCwgMHgyZCwgMHgzNSwKQEAgLTM1OTEsNDkgKzI3OTQsMTYgQEAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSTMzMF9Tb2Z0U2V0dGluZyA9IDB4MzA7CiBzdGF0aWMgdW5zaWduZWQgY2hhciBYR0kzMzBfU1IwNyA9IDB4MTg7CiAKLSNpZiAwCi1zdGF0aWMgdW5zaWduZWQgY2hhciBYR0kzMzBOZXdfU1IxNVs4XVs4XSA9IHsKLQl7IDB4MCwgIDB4NCwgMHg2MCwgMHg2MH0sCi0JeyAweGYsICAweGYsICAweGYsICAweGZ9LAotCXsweGJhLCAweGJhLCAweGJhLCAweGJhfSwKLQl7MHhhOSwgMHhhOSwgMHhhYywgMHhhY30sCi0JezB4YTAsIDB4YTAsIDB4YTAsIDB4YTh9LAotCXsgMHgwLCAgMHgwLCAgMHgyLCAgMHgyfSwKLQl7MHgzMCwgMHgzMCwgMHg0MCwgMHg0MH0sCi0JeyAweDAsIDB4YTUsIDB4ZmIsIDB4ZjZ9Ci19OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBYR0kzMzBOZXdfQ1I0MFs1XVs4XSA9IHsKLQl7MHg3NywgMHg3NywgMHg0NCwgMHg0NH0sCi0JezB4NzcsIDB4NzcsIDB4NDQsIDB4NDR9LAotCXsgMHgwLCAgMHgwLCAgMHgwLCAgMHgwfSwKLQl7MHg1YiwgMHg1YiwgMHhhYiwgMHhhYn0sCi0JeyAweDAsICAweDAsIDB4ZjAsIDB4Zjh9Ci19OwotI2VuZGlmCi0KIHN0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSTMzMF9DUjQ5W10gPSB7MHhhYSwgMHg4OH07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBYR0kzMzBfU1IxRiA9IDB4MDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSTMzMF9TUjFGOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJMzMwX1NSMjEgPSAweGEzOwotI2lmIDAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSTMzMF82NTBfU1IyMSA9IDB4YTc7Ci0jZW5kaWYKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSTMzMF9TUjIyID0gMHhmYjsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSTMzMF9TUjIzID0gMHhmNjsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSTMzMF9TUjI0ID0gMHhkOwogCi0jaWYgMAotc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJNjYwX1NSMjEgPSAweGEzOy8qIDIwMDMuMDMxMiAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJNjYwX1NSMjIgPSAweGYzOy8qIDIwMDMuMDMxMiAqLwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBYR0kzMzBfTFZEU19TUjMyID0gMHgwMDsgICAvKiB5bmxhaSBmb3IgNjUwIExWRFMgKi8KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSTMzMF9MVkRTX1NSMzMgPSAweDAwOwkvKiBjaGlhd2VuIGZvciA2NTAgTFZEUyAqLwotc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJMzMwXzY1MF9TUjMxID0gMHg0MDsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSTMzMF82NTBfU1IzMyA9IDB4MDQ7Ci0jZW5kaWYKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSTMzMF9DUlQyRGF0YV8xXzIgPSAweDA7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBYR0kzMzBfQ1JUMkRhdGFfNF9EID0gMHgwOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJMzMwX0NSVDJEYXRhXzRfRSA9IDB4MDsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSTMzMF9DUlQyRGF0YV8xXzI7CitzdGF0aWMgdW5zaWduZWQgY2hhciBYR0kzMzBfQ1JUMkRhdGFfNF9EOworc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJMzMwX0NSVDJEYXRhXzRfRTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSTMzMF9DUlQyRGF0YV80XzEwID0gMHg4MDsKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBYR0kzMzBfUkdCU2Vuc2VEYXRhID0gMHhkMTsKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBYR0kzMzBfVmlkZW9TZW5zZURhdGEgPSAweGI5OwpAQCAtMzY0MSwyMiArMjgxMSwxNCBAQAogc3RhdGljIHVuc2lnbmVkIHNob3J0IFhHSTMzMF9SR0JTZW5zZURhdGEyID0gMHgwMTkwOyAgICAgLyozMDFiKi8KIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBYR0kzMzBfVmlkZW9TZW5zZURhdGEyID0gMHgwMTEwOwogc3RhdGljIHVuc2lnbmVkIHNob3J0IFhHSTMzMF9ZQ1NlbnNlRGF0YTIgPSAweDAxNkI7Ci0jaWYgMAotc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJMzMwX05UU0NQaGFzZVtdID0gezB4MjEsIDB4ZWQsIDB4OGEsIDB4OH07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBYR0kzMzBfUEFMUGhhc2VbXSA9IHsweDJhLCAweDUsIDB4ZDMsIDB4MH07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBYR0kzMzBfTlRTQ1BoYXNlMltdID0gezB4MjEsIDB4RjAsIDB4N0IsIDB4RDZ9Oy8qMzAxYiovCi1zdGF0aWMgdW5zaWduZWQgY2hhciBYR0kzMzBfUEFMUGhhc2UyW10gPSB7MHgyYSwgMHgwOSwgMHg4NiwgMHhlOX07Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBYR0kzMzBfUEFMTVBoYXNlW10gPSB7MHgyMSwgMHhFNCwgMHgyRSwgMHg5Qn07ICAgLypwYWxtbiovCi1zdGF0aWMgdW5zaWduZWQgY2hhciBYR0kzMzBfUEFMTlBoYXNlW10gPSB7MHgyMSwgMHhGNCwgMHgzRSwgMHhCQX07Ci0jZW5kaWYKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIFhHNDBfSTJDRGVmaW5pdGlvbiA9IDB4MDAgOworc3RhdGljIHVuc2lnbmVkIGNoYXIgWEc0MF9JMkNEZWZpbml0aW9uOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgWEcyMF9DUjk3ID0gMHgxMCA7CiAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIFhHMjFfRFZPU2V0dGluZyA9IDB4MDAgOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgWEcyMV9DUjJFID0gMHgwMCA7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBYRzIxX0NSMkYgPSAweDAwIDsKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIFhHMjFfQ1I0NiA9IDB4MDAgOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgWEcyMV9DUjQ3ID0gMHgwMCA7CitzdGF0aWMgdW5zaWduZWQgY2hhciBYRzIxX0RWT1NldHRpbmc7CitzdGF0aWMgdW5zaWduZWQgY2hhciBYRzIxX0NSMkU7CitzdGF0aWMgdW5zaWduZWQgY2hhciBYRzIxX0NSMkY7CitzdGF0aWMgdW5zaWduZWQgY2hhciBYRzIxX0NSNDY7CitzdGF0aWMgdW5zaWduZWQgY2hhciBYRzIxX0NSNDc7CiAKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIFhHMjdfQ1I5NyA9IDB4QzEgOwogc3RhdGljIHVuc2lnbmVkIGNoYXIgWEcyN19TUjM2ID0gMHgzMCA7CkBAIC0zNjY0LDY4ICsyODI2LDEwIEBACiBzdGF0aWMgdW5zaWduZWQgY2hhciBYRzI3X0NSRDBbXSA9IHsKIAkwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDgyLCAweDAwLCAweDY2LCAweDAxLCAweDAwCiB9Owotc3RhdGljIHVuc2lnbmVkIGNoYXIgWEcyN19DUkRFW10gPSB7MCwgMH07CitzdGF0aWMgdW5zaWduZWQgY2hhciBYRzI3X0NSREVbMl07CiBzdGF0aWMgdW5zaWduZWQgY2hhciBYRzI3X1NSNDAgPSAweDA0IDsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIFhHMjdfU1I0MSA9IDB4MDAgOwogCi1zdGF0aWMgdW5zaWduZWQgY2hhciBYR0kzMzBfQ0hUVlZDTEtVTlRTQ1tdID0gezB4MDB9OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBYR0kzMzBfQ0hUVlZDTEtPTlRTQ1tdID0gezB4MDB9OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBYR0kzMzBfQ0hUVlZDTEtVUEFMW10gPSB7MHgwMH07Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSTMzMF9DSFRWVkNMS09QQUxbXSA9IHsweDAwfTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJNzAwN19DSFRWVkNMS1VOVFNDW10gPSB7Ci0JQ0g3MDA3VFZWQ0xLMzBfMiwKLQlDSDcwMDdUVlZDTEszMF8yLAotCUNINzAwN1RWVkNMSzMwXzIsCi0JQ0g3MDA3VFZWQ0xLMzBfMiwKLQlDSDcwMDdUVlZDTEsyOF8xLAotCUNINzAwN1RWVkNMSzQ3XzgKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSTcwMDdfQ0hUVlZDTEtPTlRTQ1tdID0gewotCUNINzAwN1RWVkNMSzI2XzQsCi0JQ0g3MDA3VFZWQ0xLMjZfNCwKLQlDSDcwMDdUVlZDTEsyNl80LAotCUNINzAwN1RWVkNMSzI2XzQsCi0JQ0g3MDA3VFZWQ0xLMjRfNiwKLQlDSDcwMDdUVlZDTEs0M182Ci19OwotCi1zdGF0aWMgdW5zaWduZWQgY2hhciBYR0k3MDA3X0NIVFZWQ0xLVVBBTFtdID0gewotCUNINzAwN1RWVkNMSzMxXzUsCi0JQ0g3MDA3VFZWQ0xLMzFfNSwKLQlDSDcwMDdUVlZDTEszMV81LAotCUNINzAwN1RWVkNMSzMxXzUsCi0JQ0g3MDA3VFZWQ0xLMjZfMiwKLQlDSDcwMDdUVlZDTEszOQotfTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJNzAwN19DSFRWVkNMS09QQUxbXSA9IHsKLQlDSDcwMDdUVlZDTEszMV81LAotCUNINzAwN1RWVkNMSzMxXzUsCi0JQ0g3MDA3VFZWQ0xLMzFfNSwKLQlDSDcwMDdUVlZDTEszMV81LAotCUNINzAwN1RWVkNMSzI2XzIsCi0JQ0g3MDA3VFZWQ0xLMzYKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgWEdJMzMwX1ZDTEtEYXRhU3RydWN0IFhHSV9DSDcwMDdWQ0xLRGF0YVtdID0gewotCXsweDYwLCAweDM2LCAzMH0sICAvKiAwIDMwLjIgTUhaICovCi0JezB4NDAsIDB4NEEsIDI4fSwgIC8qIDEgMjguMTkgTUhaICovCi0JezB4OUYsIDB4NDYsIDQ0fSwgIC8qIDIgNDMuNiBNSFogKi8KLQl7MHg5NywgMHgyQywgMjZ9LCAgLyogMyAyNi40IE1IWiAqLwotCXsweDQ0LCAweEU0LCAyNX0sICAvKiA0IDI0LjYgTUhaICovCi0JezB4N0UsIDB4MzIsIDQ3fSwgIC8qIDUgNDcuODMyIE1IWiAqLwotCXsweDhBLCAweDI0LCAzMX0sICAvKiA2IDMxLjUgTUhaICovCi0JezB4OTcsIDB4MkMsIDI2fSwgIC8qIDcgMjYuMiBNSFogKi8KLQl7MHhDRSwgMHgzQywgMzl9LCAgLyogOCAzOSBNSFogICAqLwotCXsweDUyLCAweDRBLCAzNn0sICAvKiA5IDM2IE1IWiAgICovCi0JezB4RkYsIDB4MDAsICAwfSAgIC8qIEVuZCBtYXJrICAgICAgKi8KLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgWEdJMzMwX1ZDTEtEYXRhU3RydWN0IFhHSV9WQ0xLRGF0YVtdID0gewogCS8qIFNSMkIsU1IyQyxTUjJEICovCiAJezB4MUIsIDB4RTEsICAyNX0sIC8qIDAwICgyNS4xNzVNSHopICovCkBAIC0zODA1LDIxICsyOTA5LDYgQEAKIAl7MHg2NiwgMHg0MywgMTIzfSwgLyogNEEgKDEyMi42MU1oeikgKi8KIAl7MHgyQywgMHg2MSwgIDgwfSwgLyogNEIgKDgwLjM1ME1oeikgKi8KIAl7MHgzQiwgMHg2MSwgMTA4fSwgLyogNEMgKDEwNy4zODVNaHopICovCi0vKgotCXsweDYwLCAweDM2LCAzMH0sLy8gNEQgKDMwLjIwME1IeikgICB9Ly8gTm8gdXNlCi0JezB4NjAsIDB4MzYsIDMwfSwvLyA0RSAoMzAuMjAwTUh6KSAgIH0vLyBObyB1c2UKLQl7MHg2MCwgMHgzNiwgMzB9LC8vIDRGICgzMC4yMDBNSHopICAgfS8vIE5vIHVzZQotCXsweDYwLCAweDM2LCAzMH0sLy8gNTAgKDMwLjIwME1IeikgICB9Ly8gQ0hUVgotCXsweDQwLCAweDRBLCAyOH0sLy8gNTEgKDI4LjE5ME1IeikKLQl7MHg5RiwgMHg0NiwgNDR9LC8vIDUyICg0My42MDBNSHopCi0JezB4OTcsIDB4MkMsIDI2fSwvLyA1MyAoMjYuNDAwTUh6KQotCXsweDQ0LCAweEU0LCAyNX0sLy8gNTQgKDI0LjYwME1IeikKLQl7MHg3RSwgMHgzMiwgNDd9LC8vIDU1ICg0Ny44MzJNSHopCi0JezB4OEEsIDB4MjQsIDMxfSwvLyA1NiAoMzEuNTAwTUh6KQotCXsweDk3LCAweDJDLCAyNn0sLy8gNTcgKDI2LjIwME1IeikKLQl7MHhDRSwgMHgzQywgMzl9LC8vIDU4ICgzOS4wMDBNSHopCi0JezB4NTIsIDB4NEEsIDM2fSwvLyA1OSAoMzYuMDAwTUh6KQotKi8KIAl7MHg2OSwgMHg2MSwgMTkxfSwgLyogNEQgKDE5MC45Nk1IeiApICovCiAJezB4NEYsIDB4MjIsIDE5Mn0sIC8qIDRFICgxOTIuMDY5TUh6KSAqLwogCXsweDI4LCAweDI2LCAzMjJ9LCAvKiA0RiAoMzIyLjI3M01IeikgKi8KQEAgLTM5MTIsMjEgKzMwMDEsNiBAQAogCXsweDY2LCAweDQzLCAxMjN9LCAvKiA0QSAoMTIyLjYxTWh6KSAqLwogCXsweDJDLCAweDYxLCA4MCB9LCAvKiA0QiAoODAuMzUwTWh6KSAqLwogCXsweDNCLCAweDYxLCAxMDh9LCAvKiA0QyAoMTA3LjM4NU1oeikgKi8KLS8qCi0JezB4NjAsIDB4MzYsIDMwfSwgLy8gNEQgKDMwLjIwME1IeikgICB9Ly8gTm8gdXNlCi0JezB4NjAsIDB4MzYsIDMwfSwgLy8gNEUgKDMwLjIwME1IeikgICB9Ly8gTm8gdXNlCi0JezB4NjAsIDB4MzYsIDMwfSwgLy8gNEYgKDMwLjIwME1IeikgICB9Ly8gTm8gdXNlCi0JezB4NjAsIDB4MzYsIDMwfSwgLy8gNTAgKDMwLjIwME1IeikgICB9Ly8gQ0hUVgotCXsweDQwLCAweDRBLCAyOH0sIC8vIDUxICgyOC4xOTBNSHopCi0JezB4OUYsIDB4NDYsIDQ0fSwgLy8gNTIgKDQzLjYwME1IeikKLQl7MHg5NywgMHgyQywgMjZ9LCAvLyA1MyAoMjYuNDAwTUh6KQotCXsweDQ0LCAweEU0LCAyNX0sIC8vIDU0ICgyNC42MDBNSHopCi0JezB4N0UsIDB4MzIsIDQ3fSwgLy8gNTUgKDQ3LjgzMk1IeikKLQl7MHg4QSwgMHgyNCwgMzF9LCAvLyA1NiAoMzEuNTAwTUh6KQotCXsweDk3LCAweDJDLCAyNn0sIC8vIDU3ICgyNi4yMDBNSHopCi0JezB4Q0UsIDB4M0MsIDM5fSwgLy8gNTggKDM5LjAwME1IeikKLQl7MHg1MiwgMHg0QSwgMzZ9LCAvLyA1OSAoMzYuMDAwTUh6KQotKi8KIAl7MHg2OSwgMHg2MSwgMTkxfSwgLyogNEQgKDE5MC45Nk1IeiApICovCiAJezB4NEYsIDB4MjIsIDE5Mn0sIC8qIDRFICgxOTIuMDY5TUh6KSAqLwogCXsweDI4LCAweDI2LCAzMjJ9LCAvKiA0RiAoMzIyLjI3M01IeikgKi8KQEAgLTM5NDEsMzggKzMwMTUsNiBAQAogCXsweEZGLCAweDAwLCAgIDB9ICAvKiBFbmQgbWFyayAqLwogfTsKIAotI2lmIDAKLXN0YXRpYyB1bnNpZ25lZCBjaGFyIFhHSTY2MF9UVkRlbGF5TGlzdFtdID0gewotCTB4NDQsIC8qIDsgMCBFeHROVFNDRGVsYXkgKi8KLQkweDQ0LCAvKiA7IDEgU3ROVFNDRGVsYXkgKi8KLQkweDQ0LCAvKiA7IDIgRXh0UEFMRGVsYXkgKi8KLQkweDQ0LCAvKiA7IDMgU3RQQUxEZWxheSAqLwotCTB4NDQsIC8qIDsgNCBFeHRIaVRWRGVsYXkoMTA4MGkpICovCi0JMHg0NCwgLyogOyA1IFN0SGlUVkRlbGF5KDEwODBpKSAqLwotCTB4NDQsIC8qIDsgNiBFeHRZUGJQckRlbGF5KDUyNWkpICovCi0JMHg0NCwgLyogOyA3IFN0WVBiUHJEZWFseSg1MjVpKSAqLwotCTB4NDQsIC8qIDsgOCBFeHRZUGJQckRlbGF5KDUyNXApICovCi0JMHg0NCwgLyogOyA5IFN0WVBiUHJEZWFseSg1MjVwKSAqLwotCTB4NDQsIC8qIDsgQSBFeHRZUGJQckRlbGF5KDc1MHApICovCi0JMHg0NCAgLyogOyBCIFN0WVBiUHJEZWFseSg3NTBwKSAqLwotfTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJNjYwX1RWRGVsYXlMaXN0MltdID0gewotCTB4NDQsIC8qIDsgMCBFeHROVFNDRGVsYXkgKi8KLQkweDQ0LCAvKiA7IDEgU3ROVFNDRGVsYXkgKi8KLQkweDQ0LCAvKiA7IDIgRXh0UEFMRGVsYXkgKi8KLQkweDQ0LCAvKiA7IDMgU3RQQUxEZWxheSAqLwotCTB4NDQsIC8qIDsgNCBFeHRIaVRWRGVsYXkgKi8KLQkweDQ0LCAvKiA7IDUgU3RIaVRWRGVsYXkgKi8KLQkweDQ0LCAvKiA7IDYgRXh0WVBiUHJEZWxheSg1MjVpKSAqLwotCTB4NDQsIC8qIDsgNyBTdFlQYlByRGVhbHkoNTI1aSkgKi8KLQkweDQ0LCAvKiA7IDggRXh0WVBiUHJEZWxheSg1MjVwKSAqLwotCTB4NDQsIC8qIDsgOSBTdFlQYlByRGVhbHkoNTI1cCkgKi8KLQkweDQ0LCAvKiA7IEEgRXh0WVBiUHJEZWxheSg3NTBwKSAqLwotCTB4NDQgIC8qIDsgQiBTdFlQYlByRGVhbHkoNzUwcCkgKi8KLX07Ci0jZW5kaWYKLQogc3RhdGljIHVuc2lnbmVkIGNoYXIgWEdJMzAxVFZEZWxheUxpc3RbXSA9IHsKIAkweDIyLCAvKiA7IDAgRXh0TlRTQ0RlbGF5ICovCiAJMHgyMiwgLyogOyAxIFN0TlRTQ0RlbGF5ICovCkBAIC00MDYyLDcgKzMxMDQsNyBAQAogCTB4RkMsIDB4RkIsIDB4MTQsIDB4MkEgIC8qIDYgOiA4MDB4IGdyYS4gbW9kZSAqLwogfTsKIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgUEFMTVlGaWx0ZXIxW10gPSB7CitzdGF0aWMgdW5zaWduZWQgY2hhciB4Z2lmYl9wYWxtbl95ZmlsdGVyMVtdID0gewogCTB4MDAsIDB4RjQsIDB4MTAsIDB4MzgsIC8qIDAgOiAzMjB4IHRleHQgbW9kZSAqLwogCTB4MDAsIDB4RjQsIDB4MTAsIDB4MzgsIC8qIDEgOiAzNjB4IHRleHQgbW9kZSAqLwogCTB4RUIsIDB4MDQsIDB4MTAsIDB4MTgsIC8qIDIgOiA2NDB4IHRleHQgbW9kZSAqLwpAQCAtNDA3Myw1MSArMzExNSw3IEBACiAJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiAgLyogRW5kIG9mIFRhYmxlICovCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgY2hhciBQQUxOWUZpbHRlcjFbXSA9IHsKLQkweDAwLCAweEY0LCAweDEwLCAweDM4LCAvKiAwIDogMzIweCB0ZXh0IG1vZGUgKi8KLQkweDAwLCAweEY0LCAweDEwLCAweDM4LCAvKiAxIDogMzYweCB0ZXh0IG1vZGUgKi8KLQkweEVCLCAweDA0LCAweDEwLCAweDE4LCAvKiAyIDogNjQweCB0ZXh0IG1vZGUgKi8KLQkweEY3LCAweDA2LCAweDE5LCAweDE0LCAvKiAzIDogNzIweCB0ZXh0IG1vZGUgKi8KLQkweDAwLCAweEY0LCAweDEwLCAweDM4LCAvKiA0IDogMzIweCBncmEuIG1vZGUgKi8KLQkweEVCLCAweDA0LCAweDI1LCAweDE4LCAvKiA1IDogNjQweCBncmEuIG1vZGUgKi8KLQkweEVCLCAweDE1LCAweDI1LCAweEY2LCAvKiA2IDogODAweCBncmEuIG1vZGUgKi8KLQkweEZGLCAweEZGLCAweEZGLCAweEZGICAvKiBFbmQgb2YgVGFibGUgKi8KLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIE5UU0NZRmlsdGVyMltdID0gewotCTB4RkYsIDB4MDMsIDB4MDIsIDB4RjYsIDB4RkMsIDB4MjcsIDB4NDYsIC8qIDAgOiAzMjB4IHRleHQgbW9kZSAqLwotCTB4MDEsIDB4MDIsIDB4RkUsIDB4RjcsIDB4MDMsIDB4MjcsIDB4M0MsIC8qIDEgOiAzNjB4IHRleHQgbW9kZSAqLwotCTB4RkYsIDB4MDMsIDB4MDIsIDB4RjYsIDB4RkMsIDB4MjcsIDB4NDYsIC8qIDIgOiA2NDB4IHRleHQgbW9kZSAqLwotCTB4MDEsIDB4MDIsIDB4RkUsIDB4RjcsIDB4MDMsIDB4MjcsIDB4M0MsIC8qIDMgOiA3MjB4IHRleHQgbW9kZSAqLwotCTB4RkYsIDB4MDMsIDB4MDIsIDB4RjYsIDB4RkMsIDB4MjcsIDB4NDYsIC8qIDQgOiAzMjB4IGdyYS4gbW9kZSAqLwotCTB4RkYsIDB4MDMsIDB4MDIsIDB4RjYsIDB4RkMsIDB4MjcsIDB4NDYsIC8qIDUgOiA2NDB4IGdyYS4gbW9kZSAqLwotCTB4MDEsIDB4MDEsIDB4RkMsIDB4RjgsIDB4MDgsIDB4MjYsIDB4MzgsIC8qIDYgOiA4MDB4IGdyYS4gbW9kZSAqLwotCTB4RkYsIDB4RkYsIDB4RkMsIDB4MDAsIDB4MEYsIDB4MjIsIDB4MjggIC8qIDcgOiAxMDI0eGdyYS4gbW9kZSAqLwotfTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgUEFMWUZpbHRlcjJbXSA9IHsKLQkweEZGLCAweDAzLCAweDAyLCAweEY2LCAweEZDLCAweDI3LCAweDQ2LCAvKiAwIDogMzIweCB0ZXh0IG1vZGUgKi8KLQkweDAxLCAweDAyLCAweEZFLCAweEY3LCAweDAzLCAweDI3LCAweDNDLCAvKiAxIDogMzYweCB0ZXh0IG1vZGUgKi8KLQkweEZGLCAweDAzLCAweDAyLCAweEY2LCAweEZDLCAweDI3LCAweDQ2LCAvKiAyIDogNjQweCB0ZXh0IG1vZGUgKi8KLQkweDAxLCAweDAyLCAweEZFLCAweEY3LCAweDAzLCAweDI3LCAweDNDLCAvKiAzIDogNzIweCB0ZXh0IG1vZGUgKi8KLQkweEZGLCAweDAzLCAweDAyLCAweEY2LCAweEZDLCAweDI3LCAweDQ2LCAvKiA0IDogMzIweCBncmEuIG1vZGUgKi8KLQkweEZGLCAweDAzLCAweDAyLCAweEY2LCAweEZDLCAweDI3LCAweDQ2LCAvKiA1IDogNjQweCBncmEuIG1vZGUgKi8KLQkweDAxLCAweDAxLCAweEZDLCAweEY4LCAweDA4LCAweDI2LCAweDM4LCAvKiA2IDogODAweCBncmEuIG1vZGUgKi8KLQkweEZGLCAweEZGLCAweEZDLCAweDAwLCAweDBGLCAweDIyLCAweDI4ICAvKiA3IDogMTAyNHhncmEuIG1vZGUgKi8KLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBjaGFyIFBBTE1ZRmlsdGVyMltdID0gewotCTB4RkYsIDB4MDMsIDB4MDIsIDB4RjYsIDB4RkMsIDB4MjcsIDB4NDYsIC8qIDAgOiAzMjB4IHRleHQgbW9kZSAqLwotCTB4MDEsIDB4MDIsIDB4RkUsIDB4RjcsIDB4MDMsIDB4MjcsIDB4M0MsIC8qIDEgOiAzNjB4IHRleHQgbW9kZSAqLwotCTB4RkYsIDB4MDMsIDB4MDIsIDB4RjYsIDB4RkMsIDB4MjcsIDB4NDYsIC8qIDIgOiA2NDB4IHRleHQgbW9kZSAqLwotCTB4MDEsIDB4MDIsIDB4RkUsIDB4RjcsIDB4MDMsIDB4MjcsIDB4M0MsIC8qIDMgOiA3MjB4IHRleHQgbW9kZSAqLwotCTB4RkYsIDB4MDMsIDB4MDIsIDB4RjYsIDB4RkMsIDB4MjcsIDB4NDYsIC8qIDQgOiAzMjB4IGdyYS4gbW9kZSAqLwotCTB4RkYsIDB4MDMsIDB4MDIsIDB4RjYsIDB4RkMsIDB4MjcsIDB4NDYsIC8qIDUgOiA2NDB4IGdyYS4gbW9kZSAqLwotCTB4MDEsIDB4MDEsIDB4RkMsIDB4RjgsIDB4MDgsIDB4MjYsIDB4MzgsIC8qIDYgOiA4MDB4IGdyYS4gbW9kZSAqLwotCTB4RkYsIDB4RkYsIDB4RkMsIDB4MDAsIDB4MEYsIDB4MjIsIDB4MjggIC8qIDcgOiAxMDI0eGdyYS4gbW9kZSAqLwotfTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgUEFMTllGaWx0ZXIyW10gPSB7CitzdGF0aWMgdW5zaWduZWQgY2hhciB4Z2lmYl95ZmlsdGVyMltdID0gewogCTB4RkYsIDB4MDMsIDB4MDIsIDB4RjYsIDB4RkMsIDB4MjcsIDB4NDYsIC8qIDAgOiAzMjB4IHRleHQgbW9kZSAqLwogCTB4MDEsIDB4MDIsIDB4RkUsIDB4RjcsIDB4MDMsIDB4MjcsIDB4M0MsIC8qIDEgOiAzNjB4IHRleHQgbW9kZSAqLwogCTB4RkYsIDB4MDMsIDB4MDIsIDB4RjYsIDB4RkMsIDB4MjcsIDB4NDYsIC8qIDIgOiA2NDB4IHRleHQgbW9kZSAqLwpAQCAtNDEzNCwzNSArMzEzMiw3IEBACiAJMHg1OCwgMHhlNCwgMHg3MywgMHhkMCwgMHgxMwogfTsKIAotc3RhdGljIHN0cnVjdCBYR0kzMDFDX1RhcDRUaW1pbmdTdHJ1Y3QgSGlUVlRhcDRUaW1pbmdbXSA9IHsKLQl7MCwgewotCTB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4N0YsIDB4MjAsIDB4MDIsIDB4N0YsIC8qIDsgQzAtQzcgKi8KLQkweDdELCAweDIwLCAweDA0LCAweDdGLCAweDdELCAweDFGLCAweDA2LCAweDdFLCAvKiA7IEM4LUNGICovCi0JMHg3QywgMHgxRCwgMHgwOSwgMHg3RSwgMHg3QywgMHgxQiwgMHgwQiwgMHg3RSwgLyogOyBEMC1ENyAqLwotCTB4N0MsIDB4MTksIDB4MEUsIDB4N0QsIDB4N0MsIDB4MTcsIDB4MTEsIDB4N0MsIC8qIDsgRDgtREYgKi8KLQkweDdDLCAweDE0LCAweDE0LCAweDdDLCAweDdDLCAweDExLCAweDE3LCAweDdDLCAvKiA7IEUwLUU3ICovCi0JMHg3RCwgMHgwRSwgMHgxOSwgMHg3QywgMHg3RSwgMHgwQiwgMHgxQiwgMHg3QywgLyogOyBFQS1FRiAqLwotCTB4N0UsIDB4MDksIDB4MUQsIDB4N0MsIDB4N0YsIDB4MDYsIDB4MUYsIDB4N0MsIC8qIDsgRjAtRjcgKi8KLQkweDdGLCAweDA0LCAweDIwLCAweDdELCAweDAwLCAweDAyLCAweDIwLCAweDdFICAvKiA7IEY4LUZGICovCi0JfQotCX0KLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgWEdJMzAxQ19UYXA0VGltaW5nU3RydWN0IEVubGFyZ2VUYXA0VGltaW5nW10gPSB7Ci0JezAsIHsKLQkweDAwLCAweDIwLCAweDAwLCAweDAwLCAweDdGLCAweDIwLCAweDAyLCAweDdGLCAvKiA7IEMwLUM3ICovCi0JMHg3RCwgMHgyMCwgMHgwNCwgMHg3RiwgMHg3RCwgMHgxRiwgMHgwNiwgMHg3RSwgLyogOyBDOC1DRiAqLwotCTB4N0MsIDB4MUQsIDB4MDksIDB4N0UsIDB4N0MsIDB4MUIsIDB4MEIsIDB4N0UsIC8qIDsgRDAtRDcgKi8KLQkweDdDLCAweDE5LCAweDBFLCAweDdELCAweDdDLCAweDE3LCAweDExLCAweDdDLCAvKiA7IEQ4LURGICovCi0JMHg3QywgMHgxNCwgMHgxNCwgMHg3QywgMHg3QywgMHgxMSwgMHgxNywgMHg3QywgLyogOyBFMC1FNyAqLwotCTB4N0QsIDB4MEUsIDB4MTksIDB4N0MsIDB4N0UsIDB4MEIsIDB4MUIsIDB4N0MsIC8qIDsgRUEtRUYgKi8KLQkweDdFLCAweDA5LCAweDFELCAweDdDLCAweDdGLCAweDA2LCAweDFGLCAweDdDLCAvKiA7IEYwLUY3ICovCi0JMHg3RiwgMHgwNCwgMHgyMCwgMHg3RCwgMHgwMCwgMHgwMiwgMHgyMCwgMHg3RSAgIC8qIDsgRjgtRkYgKi8KLQl9Ci0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBYR0kzMDFDX1RhcDRUaW1pbmdTdHJ1Y3QgTm9TY2FsZVRhcDRUaW1pbmdbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgWEdJMzAxQ19UYXA0VGltaW5nU3RydWN0IHhnaWZiX3RhcDRfdGltaW5nW10gPSB7CiAJezAsIHsKIAkweDAwLCAweDIwLCAweDAwLCAweDAwLCAweDdGLCAweDIwLCAweDAyLCAweDdGLCAvKiA7IEMwLUM3ICovCiAJMHg3RCwgMHgyMCwgMHgwNCwgMHg3RiwgMHg3RCwgMHgxRiwgMHgwNiwgMHg3RSwgLyogOyBDOC1DRiAqLwpAQCAtNDIxMiw3ICszMTgyLDcgQEAKIAl9CiB9OwogCi1zdGF0aWMgc3RydWN0IFhHSTMwMUNfVGFwNFRpbWluZ1N0cnVjdCBOVFNDVGFwNFRpbWluZ1tdID0geworc3RhdGljIHN0cnVjdCBYR0kzMDFDX1RhcDRUaW1pbmdTdHJ1Y3QgeGdpZmJfbnRzY181MjVfdGFwNF90aW1pbmdbXSA9IHsKIAl7NDgwLAl7CiAJCTB4MDQsIDB4MUEsIDB4MDQsIDB4N0UsIDB4MDMsIDB4MUEsIDB4MDYsIDB4N0QsIC8qIDsgQzAtQzcgKi8KIAkJMHgwMSwgMHgxQSwgMHgwOCwgMHg3RCwgMHgwMCwgMHgxOSwgMHgwQSwgMHg3RCwgLyogOyBDOC1DRiAqLwpAQCAtNDI0OCw3OCArMzIxOCw2IEBACiAJfQogfTsKIAotc3RhdGljIHN0cnVjdCBYR0kzMDFDX1RhcDRUaW1pbmdTdHJ1Y3QgWVBiUHI1MjVwVGFwNFRpbWluZ1tdID0gewotCXs0ODAsCXsKLQkJMHgwNCwgMHgxQSwgMHgwNCwgMHg3RSwgMHgwMywgMHgxQSwgMHgwNiwgMHg3RCwgLyogOyBDMC1DNyAqLwotCQkweDAxLCAweDFBLCAweDA4LCAweDdELCAweDAwLCAweDE5LCAweDBBLCAweDdELCAvKiA7IEM4LUNGICovCi0JCTB4N0YsIDB4MTksIDB4MEMsIDB4N0MsIDB4N0UsIDB4MTgsIDB4MEUsIDB4N0MsIC8qIDsgRDAtRDcgKi8KLQkJMHg3RSwgMHgxNywgMHgxMCwgMHg3QiwgMHg3RCwgMHgxNSwgMHgxMiwgMHg3QywgLyogOyBEOC1ERiAqLwotCQkweDdELCAweDEzLCAweDEzLCAweDdELCAweDdDLCAweDEyLCAweDE1LCAweDdELCAvKiA7IEUwLUU3ICovCi0JCTB4N0MsIDB4MTAsIDB4MTcsIDB4N0QsIDB4N0MsIDB4MEUsIDB4MTgsIDB4N0UsIC8qIDsgRUEtRUYgKi8KLQkJMHg3RCwgMHgwQywgMHgxOSwgMHg3RSwgMHg3RCwgMHgwQSwgMHgxOSwgMHgwMCwgLyogOyBGMC1GNyAqLwotCQkweDdELCAweDA4LCAweDFBLCAweDAxLCAweDdFLCAweDA2LCAweDFBLCAweDAyICAvKiA7IEY4LUZGICovCi0JCX0KLQl9LAotCXs2MDAsCXsKLQkJMHgwNywgMHgxNCwgMHgwNywgMHg3RSwgMHgwNiwgMHgxNCwgMHgwOSwgMHg3RCwgLyogOyBDMC1DNyAqLwotCQkweDA1LCAweDE0LCAweDBBLCAweDdELCAweDA0LCAweDEzLCAweDBCLCAweDdFLCAvKiA7IEM4LUNGICovCi0JCTB4MDMsIDB4MTMsIDB4MEMsIDB4N0UsIDB4MDIsIDB4MTIsIDB4MEQsIDB4N0YsIC8qIDsgRDAtRDcgKi8KLQkJMHgwMSwgMHgxMiwgMHgwRSwgMHg3RiwgMHgwMSwgMHgxMSwgMHgwRiwgMHg3RiwgLyogOyBEOC1ERiAqLwotCQkweDAxLCAweDEwLCAweDEwLCAweDAwLCAweDdGLCAweDBGLCAweDExLCAweDAxLCAvKiA7IEUwLUU3ICovCi0JCTB4N0YsIDB4MEUsIDB4MTIsIDB4MDEsIDB4N0UsIDB4MEQsIDB4MTIsIDB4MDMsIC8qIDsgRUEtRUYgKi8KLQkJMHg3RSwgMHgwQywgMHgxMywgMHgwMywgMHg3RSwgMHgwQiwgMHgxMywgMHgwNCwgLyogOyBGMC1GNyAqLwotCQkweDdFLCAweDBBLCAweDE0LCAweDA0LCAweDdELCAweDA5LCAweDE0LCAweDA2ICAvKiA7IEY4LUZGICovCi0JCX0KLQl9LAotCXsweEZGRkYsIHsKLQkJMHgwOSwgMHgwRiwgMHgwOSwgMHg3RiwgMHgwOCwgMHgwRiwgMHgwOSwgMHgwMCwgLyogOyBDMC1DNyAqLwotCQkweDA3LCAweDBGLCAweDBBLCAweDAwLCAweDA2LCAweDBGLCAweDBBLCAweDAxLCAvKiA7IEM4LUNGICovCi0JCTB4MDYsIDB4MEUsIDB4MEIsIDB4MDEsIDB4MDUsIDB4MEUsIDB4MEIsIDB4MDIsIC8qIDsgRDAtRDcgKi8KLQkJMHgwNCwgMHgwRSwgMHgwQywgMHgwMiwgMHgwNCwgMHgwRCwgMHgwQywgMHgwMywgLyogOyBEOC1ERiAqLwotCQkweDAzLCAweDBELCAweDBELCAweDAzLCAweDAyLCAweDBDLCAweDBELCAweDA1LCAvKiA7IEUwLUU3ICovCi0JCTB4MDIsIDB4MEMsIDB4MEUsIDB4MDQsIDB4MDEsIDB4MEIsIDB4MEUsIDB4MDYsIC8qIDsgRUEtRUYgKi8KLQkJMHgwMSwgMHgwQiwgMHgwRSwgMHgwNiwgMHgwMCwgMHgwQSwgMHgwRiwgMHgwNywgLyogOyBGMC1GNyAqLwotCQkweDAwLCAweDBBLCAweDBGLCAweDA3LCAweDAwLCAweDA5LCAweDBGLCAweDA4ICAvKiA7IEY4LUZGICovCi0JCX0KLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IFhHSTMwMUNfVGFwNFRpbWluZ1N0cnVjdCBZUGJQcjUyNWlUYXA0VGltaW5nW10gPSB7Ci0JezQ4MCwJewotCQkweDA0LCAweDFBLCAweDA0LCAweDdFLCAweDAzLCAweDFBLCAweDA2LCAweDdELCAvKiA7IEMwLUM3ICovCi0JCTB4MDEsIDB4MUEsIDB4MDgsIDB4N0QsIDB4MDAsIDB4MTksIDB4MEEsIDB4N0QsIC8qIDsgQzgtQ0YgKi8KLQkJMHg3RiwgMHgxOSwgMHgwQywgMHg3QywgMHg3RSwgMHgxOCwgMHgwRSwgMHg3QywgLyogOyBEMC1ENyAqLwotCQkweDdFLCAweDE3LCAweDEwLCAweDdCLCAweDdELCAweDE1LCAweDEyLCAweDdDLCAvKiA7IEQ4LURGICovCi0JCTB4N0QsIDB4MTMsIDB4MTMsIDB4N0QsIDB4N0MsIDB4MTIsIDB4MTUsIDB4N0QsIC8qIDsgRTAtRTcgKi8KLQkJMHg3QywgMHgxMCwgMHgxNywgMHg3RCwgMHg3QywgMHgwRSwgMHgxOCwgMHg3RSwgLyogOyBFQS1FRiAqLwotCQkweDdELCAweDBDLCAweDE5LCAweDdFLCAweDdELCAweDBBLCAweDE5LCAweDAwLCAvKiA7IEYwLUY3ICovCi0JCTB4N0QsIDB4MDgsIDB4MUEsIDB4MDEsIDB4N0UsIDB4MDYsIDB4MUEsIDB4MDIgIC8qIDsgRjgtRkYgKi8KLQkJfQotCX0sCi0JezYwMCwJewotCQkweDA3LCAweDE0LCAweDA3LCAweDdFLCAweDA2LCAweDE0LCAweDA5LCAweDdELCAvKiA7IEMwLUM3ICovCi0JCTB4MDUsIDB4MTQsIDB4MEEsIDB4N0QsIDB4MDQsIDB4MTMsIDB4MEIsIDB4N0UsIC8qIDsgQzgtQ0YgKi8KLQkJMHgwMywgMHgxMywgMHgwQywgMHg3RSwgMHgwMiwgMHgxMiwgMHgwRCwgMHg3RiwgLyogOyBEMC1ENyAqLwotCQkweDAxLCAweDEyLCAweDBFLCAweDdGLCAweDAxLCAweDExLCAweDBGLCAweDdGLCAvKiA7IEQ4LURGICovCi0JCTB4MDEsIDB4MTAsIDB4MTAsIDB4MDAsIDB4N0YsIDB4MEYsIDB4MTEsIDB4MDEsIC8qIDsgRTAtRTcgKi8KLQkJMHg3RiwgMHgwRSwgMHgxMiwgMHgwMSwgMHg3RSwgMHgwRCwgMHgxMiwgMHgwMywgLyogOyBFQS1FRiAqLwotCQkweDdFLCAweDBDLCAweDEzLCAweDAzLCAweDdFLCAweDBCLCAweDEzLCAweDA0LCAvKiA7IEYwLUY3ICovCi0JCTB4N0UsIDB4MEEsIDB4MTQsIDB4MDQsIDB4N0QsIDB4MDksIDB4MTQsIDB4MDYgIC8qIDsgRjgtRkYgKi8KLQkJfQotCX0sCi0JezB4RkZGRiwgewotCQkweDA5LCAweDBGLCAweDA5LCAweDdGLCAweDA4LCAweDBGLCAweDA5LCAweDAwLCAvKiA7IEMwLUM3ICovCi0JCTB4MDcsIDB4MEYsIDB4MEEsIDB4MDAsIDB4MDYsIDB4MEYsIDB4MEEsIDB4MDEsIC8qIDsgQzgtQ0YgKi8KLQkJMHgwNiwgMHgwRSwgMHgwQiwgMHgwMSwgMHgwNSwgMHgwRSwgMHgwQiwgMHgwMiwgLyogOyBEMC1ENyAqLwotCQkweDA0LCAweDBFLCAweDBDLCAweDAyLCAweDA0LCAweDBELCAweDBDLCAweDAzLCAvKiA7IEQ4LURGICovCi0JCTB4MDMsIDB4MEQsIDB4MEQsIDB4MDMsIDB4MDIsIDB4MEMsIDB4MEQsIDB4MDUsIC8qIDsgRTAtRTcgKi8KLQkJMHgwMiwgMHgwQywgMHgwRSwgMHgwNCwgMHgwMSwgMHgwQiwgMHgwRSwgMHgwNiwgLyogOyBFQS1FRiAqLwotCQkweDAxLCAweDBCLCAweDBFLCAweDA2LCAweDAwLCAweDBBLCAweDBGLCAweDA3LCAvKiA7IEYwLUY3ICovCi0JCTB4MDAsIDB4MEEsIDB4MEYsIDB4MDcsIDB4MDAsIDB4MDksIDB4MEYsIDB4MDggIC8qIDsgRjgtRkYgKi8KLQkJfQotCX0KLX07Ci0KIHN0YXRpYyBzdHJ1Y3QgWEdJMzAxQ19UYXA0VGltaW5nU3RydWN0IFlQYlByNzUwcFRhcDRUaW1pbmdbXSA9IHsKIAl7MHhGRkZGLCB7CiAJCSAweDA1LCAweDE5LCAweDA1LCAweDdELCAweDAzLCAweDE5LCAweDA2LCAweDdFLCAvKiA7IEMwLUM3ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfdXRpbC5jIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX3V0aWwuYwppbmRleCBlYTJiNzk1Li5iNWM5OTg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfdXRpbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl91dGlsLmMKQEAgLTEsMTAgKzEsMTEgQEAKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKICNpbmNsdWRlICJ2Yl9kZWYuaCIKICNpbmNsdWRlICJ2Z2F0eXBlcy5oIgogI2luY2x1ZGUgInZiX3N0cnVjdC5oIgogCiAjaW5jbHVkZSAiWEdJZmIuaCIKLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpbmNsdWRlICJ2Yl91dGlsLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Z2F0eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZnYXR5cGVzLmgKaW5kZXggNWFlYjNhNC4uOWI5MzliNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZnYXR5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZnYXR5cGVzLmgKQEAgLTQ3LDE4ICs0NywxMyBAQAogfTsKICNlbmRpZgogCi1zdHJ1Y3QgWEdJX0RTUmVnIHsKLQl1bnNpZ25lZCBjaGFyIGpJZHg7Ci0JdW5zaWduZWQgY2hhciBqVmFsOwotfTsKLQogc3RydWN0IHhnaV9od19kZXZpY2VfaW5mbyB7CiAJdW5zaWduZWQgbG9uZyB1bEV4dGVybmFsQ2hpcDsgLyogTk8gVkIgb3Igb3RoZXIgdmlkZW8gYnJpZGdlKi8KIAkJCQkgICAgICAvKiBpZiB1alZCQ2hpcElEID0gVkJfQ0hJUF9VTktOT1dOLCAqLwogCiAJdW5zaWduZWQgY2hhciAqcGpWaXJ0dWFsUm9tQmFzZTsgLyogUk9NIGltYWdlICovCiAKLQl1bnNpZ25lZCBjaGFyICpwalZpZGVvTWVtb3J5QWRkcmVzczsvKiBiYXNlIHZpcnR1YWwgbWVtb3J5IGFkZHJlc3MgKi8KKwl2b2lkIF9faW9tZW0gKnBqVmlkZW9NZW1vcnlBZGRyZXNzOy8qIGJhc2UgdmlydHVhbCBtZW1vcnkgYWRkcmVzcyAqLwogCQkJCQkgICAgLyogb2YgTGluZWFyIFZHQSBtZW1vcnkgKi8KIAogCXVuc2lnbmVkIGxvbmcgdWxWaWRlb01lbW9yeVNpemU7IC8qIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUKQEAgLTc4LDEwICs3Myw2IEBACiAJCQkJICAvKiAiWEdJX1ZCX0NISVBfVFlQRSIgKi8KIAogCXVuc2lnbmVkIGxvbmcgdWxDUlQyTENEVHlwZTsgLyogZGVmaW5lZCBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUgdHlwZSAqLwotCi0JdW5zaWduZWQgY2hhcigqcFF1ZXJ5VkdBQ29uZmlnU3BhY2UpKHN0cnVjdCB4Z2lfaHdfZGV2aWNlX2luZm8gKiwKLQkJCQkJICAgIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCi0JCQkJCSAgICB1bnNpZ25lZCBsb25nICopOwogfTsKIAogLyogQWRkaXRpb25hbCBJT0NUTCBmb3IgY29tbXVuaWNhdGlvbiB4Z2lmYiA8PiBYIGRyaXZlciAgICAgICAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy96Y2FjaGUvemNhY2hlLW1haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy96Y2FjaGUvemNhY2hlLW1haW4uYwppbmRleCA0NjJmYmMyLi41NmMxZjljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvemNhY2hlL3pjYWNoZS1tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3pjYWNoZS96Y2FjaGUtbWFpbi5jCkBAIC02NTEsNyArNjUxLDcgQEAKIC8qCiAgKiBieXRlIGNvdW50IGRlZmluaW5nIHBvb3IgKm1lYW4qIGNvbXByZXNzaW9uOyBwYWdlcyB3aXRoIGdyZWF0ZXIgenNpemUKICAqIHdpbGwgYmUgcmVqZWN0ZWQgdW50aWwgc3VmZmljaWVudCBiZXR0ZXItY29tcHJlc3NlZCBwYWdlcyBhcmUgYWNjZXB0ZWQKLSAqIGRyaXZpbmcgdGhlIG1hbiBiZWxvdyB0aGlzIHRocmVzaG9sZAorICogZHJpdmluZyB0aGUgbWVhbiBiZWxvdyB0aGlzIHRocmVzaG9sZAogICovCiBzdGF0aWMgdW5zaWduZWQgaW50IHp2X21heF9tZWFuX3pzaXplID0gKFBBR0VfU0laRSAvIDgpICogNTsKIApAQCAtOTYyLDE1ICs5NjIsNiBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgemNhY2hlX2ZhaWxlZF9nZXRfZnJlZV9wYWdlczsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHpjYWNoZV9mYWlsZWRfYWxsb2M7CiBzdGF0aWMgdW5zaWduZWQgbG9uZyB6Y2FjaGVfcHV0X3RvX2ZsdXNoOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgemNhY2hlX2Fib3J0ZWRfcHJlbG9hZDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHpjYWNoZV9hYm9ydGVkX3NocmluazsKLQotLyoKLSAqIEVuc3VyZSB0aGF0IG1lbW9yeSBhbGxvY2F0aW9uIHJlcXVlc3RzIGluIHpjYWNoZSBkb24ndCByZXN1bHQKLSAqIGluIGRpcmVjdCByZWNsYWltIHJlcXVlc3RzIHZpYSB0aGUgc2hyaW5rZXIsIHdoaWNoIHdvdWxkIGNhdXNlCi0gKiBhbiBpbmZpbml0ZSBsb29wLiAgTWF5YmUgYSBHRlAgZmxhZyB3b3VsZCBiZSBiZXR0ZXI/Ci0gKi8KLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soemNhY2hlX2RpcmVjdF9yZWNsYWltX2xvY2spOwogCiAvKgogICogZm9yIG5vdywgdXNlZCBuYW1lZCBzbGFicyBzbyBjYW4gZWFzaWx5IHRyYWNrIHVzYWdlOyBsYXRlciBjYW4KQEAgLTEwMDksMTAgKzEwMDAsNiBAQAogCQlnb3RvIG91dDsKIAlpZiAodW5saWtlbHkoemNhY2hlX29ial9jYWNoZSA9PSBOVUxMKSkKIAkJZ290byBvdXQ7Ci0JaWYgKCFzcGluX3RyeWxvY2soJnpjYWNoZV9kaXJlY3RfcmVjbGFpbV9sb2NrKSkgewotCQl6Y2FjaGVfYWJvcnRlZF9wcmVsb2FkKys7Ci0JCWdvdG8gb3V0OwotCX0KIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAlrcCA9ICZfX2dldF9jcHVfdmFyKHpjYWNoZV9wcmVsb2Fkcyk7CiAJd2hpbGUgKGtwLT5uciA8IEFSUkFZX1NJWkUoa3AtPm9iam5vZGVzKSkgewpAQCAtMTAyMSw3ICsxMDA4LDcgQEAKIAkJCQlaQ0FDSEVfR0ZQX01BU0spOwogCQlpZiAodW5saWtlbHkob2Jqbm9kZSA9PSBOVUxMKSkgewogCQkJemNhY2hlX2ZhaWxlZF9hbGxvYysrOwotCQkJZ290byB1bmxvY2tfb3V0OworCQkJZ290byBvdXQ7CiAJCX0KIAkJcHJlZW1wdF9kaXNhYmxlKCk7CiAJCWtwID0gJl9fZ2V0X2NwdV92YXIoemNhY2hlX3ByZWxvYWRzKTsKQEAgLTEwMzQsMTMgKzEwMjEsMTMgQEAKIAlvYmogPSBrbWVtX2NhY2hlX2FsbG9jKHpjYWNoZV9vYmpfY2FjaGUsIFpDQUNIRV9HRlBfTUFTSyk7CiAJaWYgKHVubGlrZWx5KG9iaiA9PSBOVUxMKSkgewogCQl6Y2FjaGVfZmFpbGVkX2FsbG9jKys7Ci0JCWdvdG8gdW5sb2NrX291dDsKKwkJZ290byBvdXQ7CiAJfQogCXBhZ2UgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZShaQ0FDSEVfR0ZQX01BU0spOwogCWlmICh1bmxpa2VseShwYWdlID09IE5VTEwpKSB7CiAJCXpjYWNoZV9mYWlsZWRfZ2V0X2ZyZWVfcGFnZXMrKzsKIAkJa21lbV9jYWNoZV9mcmVlKHpjYWNoZV9vYmpfY2FjaGUsIG9iaik7Ci0JCWdvdG8gdW5sb2NrX291dDsKKwkJZ290byBvdXQ7CiAJfQogCXByZWVtcHRfZGlzYWJsZSgpOwogCWtwID0gJl9fZ2V0X2NwdV92YXIoemNhY2hlX3ByZWxvYWRzKTsKQEAgLTEwNTMsOCArMTA0MCw2IEBACiAJZWxzZQogCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZSk7CiAJcmV0ID0gMDsKLXVubG9ja19vdXQ6Ci0Jc3Bpbl91bmxvY2soJnpjYWNoZV9kaXJlY3RfcmVjbGFpbV9sb2NrKTsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTM1Nyw4ICsxMzQyLDE0IEBACiAJCQlrcC0+b2Jqbm9kZXNba3AtPm5yIC0gMV0gPSBOVUxMOwogCQkJa3AtPm5yLS07CiAJCX0KLQkJa21lbV9jYWNoZV9mcmVlKHpjYWNoZV9vYmpfY2FjaGUsIGtwLT5vYmopOwotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpa3AtPnBhZ2UpOworCQlpZiAoa3AtPm9iaikgeworCQkJa21lbV9jYWNoZV9mcmVlKHpjYWNoZV9vYmpfY2FjaGUsIGtwLT5vYmopOworCQkJa3AtPm9iaiA9IE5VTEw7CisJCX0KKwkJaWYgKGtwLT5wYWdlKSB7CisJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpa3AtPnBhZ2UpOworCQkJa3AtPnBhZ2UgPSBOVUxMOworCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtMTQyMyw4ICsxNDE0LDYgQEAKIFpDQUNIRV9TWVNGU19STyhmYWlsZWRfZ2V0X2ZyZWVfcGFnZXMpOwogWkNBQ0hFX1NZU0ZTX1JPKGZhaWxlZF9hbGxvYyk7CiBaQ0FDSEVfU1lTRlNfUk8ocHV0X3RvX2ZsdXNoKTsKLVpDQUNIRV9TWVNGU19STyhhYm9ydGVkX3ByZWxvYWQpOwotWkNBQ0hFX1NZU0ZTX1JPKGFib3J0ZWRfc2hyaW5rKTsKIFpDQUNIRV9TWVNGU19STyhjb21wcmVzc19wb29yKTsKIFpDQUNIRV9TWVNGU19STyhtZWFuX2NvbXByZXNzX3Bvb3IpOwogWkNBQ0hFX1NZU0ZTX1JPX0FUT01JQyh6YnVkX2N1cnJfcmF3X3BhZ2VzKTsKQEAgLTE0NjYsOCArMTQ1NSw2IEBACiAJJnpjYWNoZV9mYWlsZWRfZ2V0X2ZyZWVfcGFnZXNfYXR0ci5hdHRyLAogCSZ6Y2FjaGVfZmFpbGVkX2FsbG9jX2F0dHIuYXR0ciwKIAkmemNhY2hlX3B1dF90b19mbHVzaF9hdHRyLmF0dHIsCi0JJnpjYWNoZV9hYm9ydGVkX3ByZWxvYWRfYXR0ci5hdHRyLAotCSZ6Y2FjaGVfYWJvcnRlZF9zaHJpbmtfYXR0ci5hdHRyLAogCSZ6Y2FjaGVfemJ1ZF91bmJ1ZGRpZWRfbGlzdF9jb3VudHNfYXR0ci5hdHRyLAogCSZ6Y2FjaGVfemJ1ZF9jdW11bF9jaHVua19jb3VudHNfYXR0ci5hdHRyLAogCSZ6Y2FjaGVfenZfY3Vycl9kaXN0X2NvdW50c19hdHRyLmF0dHIsCkBAIC0xNTA3LDExICsxNDk0LDcgQEAKIAkJaWYgKCEoZ2ZwX21hc2sgJiBfX0dGUF9GUykpCiAJCQkvKiBkb2VzIHRoaXMgY2FzZSByZWFsbHkgbmVlZCB0byBiZSBza2lwcGVkPyAqLwogCQkJZ290byBvdXQ7Ci0JCWlmIChzcGluX3RyeWxvY2soJnpjYWNoZV9kaXJlY3RfcmVjbGFpbV9sb2NrKSkgewotCQkJemJ1ZF9ldmljdF9wYWdlcyhucik7Ci0JCQlzcGluX3VubG9jaygmemNhY2hlX2RpcmVjdF9yZWNsYWltX2xvY2spOwotCQl9IGVsc2UKLQkJCXpjYWNoZV9hYm9ydGVkX3NocmluaysrOworCQl6YnVkX2V2aWN0X3BhZ2VzKG5yKTsKIAl9CiAJcmV0ID0gKGludClhdG9taWNfcmVhZCgmemNhY2hlX3pidWRfY3Vycl9yYXdfcGFnZXMpOwogb3V0OgpAQCAtMTY2OCw3ICsxNjUxLDcgQEAKIAlpZiAoY2xpID09IE5VTEwpCiAJCWdvdG8gb3V0OwogCWF0b21pY19pbmMoJmNsaS0+cmVmY291bnQpOwotCXBvb2wgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdG1lbV9wb29sKSwgR0ZQX0tFUk5FTCk7CisJcG9vbCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0bWVtX3Bvb2wpLCBHRlBfQVRPTUlDKTsKIAlpZiAocG9vbCA9PSBOVUxMKSB7CiAJCXByX2luZm8oInpjYWNoZTogcG9vbCBjcmVhdGlvbiBmYWlsZWQ6IG91dCBvZiBtZW1vcnlcbiIpOwogCQlnb3RvIG91dDsKQEAgLTE3OTgsOCArMTc4MSwxMCBAQAogLyoKICAqIFN3aXp6bGluZyBpbmNyZWFzZXMgb2JqZWN0cyBwZXIgc3dhcHR5cGUsIGluY3JlYXNpbmcgdG1lbSBjb25jdXJyZW5jeQogICogZm9yIGhlYXZ5IHN3YXBsb2Fkcy4gIExhdGVyLCBsYXJnZXIgbnJfY3B1cyAtPiBsYXJnZXIgU1dJWl9CSVRTCisgKiBTZXR0aW5nIFNXSVpfQklUUyB0byAyNyBiYXNpY2FsbHkgcmVjb25zdHJ1Y3RzIHRoZSBzd2FwIGVudHJ5IGZyb20KKyAqIGZyb250c3dhcF9nZXRfcGFnZSgpCiAgKi8KLSNkZWZpbmUgU1dJWl9CSVRTCQk0CisjZGVmaW5lIFNXSVpfQklUUwkJMjcKICNkZWZpbmUgU1dJWl9NQVNLCQkoKDEgPDwgU1dJWl9CSVRTKSAtIDEpCiAjZGVmaW5lIF9vc3dpeihfdHlwZSwgX2luZCkJKChfdHlwZSA8PCBTV0laX0JJVFMpIHwgKF9pbmQgJiBTV0laX01BU0spKQogI2RlZmluZSBpc3dpeihfaW5kKQkJKF9pbmQgPj4gU1dJWl9CSVRTKQpAQCAtMTk5Myw3ICsxOTc4LDcgQEAKIAkJcHJfaW5mbygiemNhY2hlOiBmcm9udHN3YXAgZW5hYmxlZCB1c2luZyBrZXJuZWwgIgogCQkJInRyYW5zY2VuZGVudCBtZW1vcnkgYW5kIHh2bWFsbG9jXG4iKTsKIAkJaWYgKG9sZF9vcHMuaW5pdCAhPSBOVUxMKQotCQkJcHJfd2FybmluZygia3RtZW06IGZyb250c3dhcF9vcHMgb3ZlcnJpZGRlbiIpOworCQkJcHJfd2FybmluZygiemNhY2hlOiBmcm9udHN3YXBfb3BzIG92ZXJyaWRkZW4iKTsKIAl9CiAjZW5kaWYKIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy96cmFtL3pyYW1fZHJ2LmMgYi9kcml2ZXJzL3N0YWdpbmcvenJhbS96cmFtX2Rydi5jCmluZGV4IGQ3MGVjMWEuLmI5OTI2ZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy96cmFtL3pyYW1fZHJ2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3pyYW0venJhbV9kcnYuYwpAQCAtMzcsMTAgKzM3LDEwIEBACiAKIC8qIEdsb2JhbHMgKi8KIHN0YXRpYyBpbnQgenJhbV9tYWpvcjsKLXN0cnVjdCB6cmFtICpkZXZpY2VzOworc3RydWN0IHpyYW0gKnpyYW1fZGV2aWNlczsKIAogLyogTW9kdWxlIHBhcmFtcyAoZG9jdW1lbnRhdGlvbiBhdCBlbmQpICovCi11bnNpZ25lZCBpbnQgbnVtX2RldmljZXM7Cit1bnNpZ25lZCBpbnQgenJhbV9udW1fZGV2aWNlczsKIAogc3RhdGljIHZvaWQgenJhbV9zdGF0X2luYyh1MzIgKnYpCiB7CkBAIC01NjAsMjcgKzU2MCwzNCBAQAogewogCXN0cnVjdCB6cmFtICp6cmFtID0gcXVldWUtPnF1ZXVlZGF0YTsKIAorCWlmICh1bmxpa2VseSghenJhbS0+aW5pdF9kb25lKSAmJiB6cmFtX2luaXRfZGV2aWNlKHpyYW0pKQorCQlnb3RvIGVycm9yOworCisJZG93bl9yZWFkKCZ6cmFtLT5pbml0X2xvY2spOworCWlmICh1bmxpa2VseSghenJhbS0+aW5pdF9kb25lKSkKKwkJZ290byBlcnJvcl91bmxvY2s7CisKIAlpZiAoIXZhbGlkX2lvX3JlcXVlc3QoenJhbSwgYmlvKSkgewogCQl6cmFtX3N0YXQ2NF9pbmMoenJhbSwgJnpyYW0tPnN0YXRzLmludmFsaWRfaW8pOwotCQliaW9faW9fZXJyb3IoYmlvKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYgKHVubGlrZWx5KCF6cmFtLT5pbml0X2RvbmUpICYmIHpyYW1faW5pdF9kZXZpY2UoenJhbSkpIHsKLQkJYmlvX2lvX2Vycm9yKGJpbyk7Ci0JCXJldHVybiAwOworCQlnb3RvIGVycm9yX3VubG9jazsKIAl9CiAKIAlfX3pyYW1fbWFrZV9yZXF1ZXN0KHpyYW0sIGJpbywgYmlvX2RhdGFfZGlyKGJpbykpOworCXVwX3JlYWQoJnpyYW0tPmluaXRfbG9jayk7CiAKIAlyZXR1cm4gMDsKKworZXJyb3JfdW5sb2NrOgorCXVwX3JlYWQoJnpyYW0tPmluaXRfbG9jayk7CitlcnJvcjoKKwliaW9faW9fZXJyb3IoYmlvKTsKKwlyZXR1cm4gMDsKIH0KIAotdm9pZCB6cmFtX3Jlc2V0X2RldmljZShzdHJ1Y3QgenJhbSAqenJhbSkKK3ZvaWQgX196cmFtX3Jlc2V0X2RldmljZShzdHJ1Y3QgenJhbSAqenJhbSkKIHsKIAlzaXplX3QgaW5kZXg7CiAKLQltdXRleF9sb2NrKCZ6cmFtLT5pbml0X2xvY2spOwogCXpyYW0tPmluaXRfZG9uZSA9IDA7CiAKIAkvKiBGcmVlIHZhcmlvdXMgcGVyLWRldmljZSBidWZmZXJzICovCkBAIC02MTcsNyArNjI0LDEzIEBACiAJbWVtc2V0KCZ6cmFtLT5zdGF0cywgMCwgc2l6ZW9mKHpyYW0tPnN0YXRzKSk7CiAKIAl6cmFtLT5kaXNrc2l6ZSA9IDA7Ci0JbXV0ZXhfdW5sb2NrKCZ6cmFtLT5pbml0X2xvY2spOworfQorCit2b2lkIHpyYW1fcmVzZXRfZGV2aWNlKHN0cnVjdCB6cmFtICp6cmFtKQoreworCWRvd25fd3JpdGUoJnpyYW0tPmluaXRfbG9jayk7CisJX196cmFtX3Jlc2V0X2RldmljZSh6cmFtKTsKKwl1cF93cml0ZSgmenJhbS0+aW5pdF9sb2NrKTsKIH0KIAogaW50IHpyYW1faW5pdF9kZXZpY2Uoc3RydWN0IHpyYW0gKnpyYW0pCkBAIC02MjUsMTAgKzYzOCwxMCBAQAogCWludCByZXQ7CiAJc2l6ZV90IG51bV9wYWdlczsKIAotCW11dGV4X2xvY2soJnpyYW0tPmluaXRfbG9jayk7CisJZG93bl93cml0ZSgmenJhbS0+aW5pdF9sb2NrKTsKIAogCWlmICh6cmFtLT5pbml0X2RvbmUpIHsKLQkJbXV0ZXhfdW5sb2NrKCZ6cmFtLT5pbml0X2xvY2spOworCQl1cF93cml0ZSgmenJhbS0+aW5pdF9sb2NrKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC02MzgsMjQgKzY1MSwyMiBAQAogCWlmICghenJhbS0+Y29tcHJlc3Nfd29ya21lbSkgewogCQlwcl9lcnIoIkVycm9yIGFsbG9jYXRpbmcgY29tcHJlc3NvciB3b3JraW5nIG1lbW9yeSFcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWw7CisJCWdvdG8gZmFpbF9ub190YWJsZTsKIAl9CiAKIAl6cmFtLT5jb21wcmVzc19idWZmZXIgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoX19HRlBfWkVSTywgMSk7CiAJaWYgKCF6cmFtLT5jb21wcmVzc19idWZmZXIpIHsKIAkJcHJfZXJyKCJFcnJvciBhbGxvY2F0aW5nIGNvbXByZXNzb3IgYnVmZmVyIHNwYWNlXG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBmYWlsOworCQlnb3RvIGZhaWxfbm9fdGFibGU7CiAJfQogCiAJbnVtX3BhZ2VzID0genJhbS0+ZGlza3NpemUgPj4gUEFHRV9TSElGVDsKIAl6cmFtLT50YWJsZSA9IHZ6YWxsb2MobnVtX3BhZ2VzICogc2l6ZW9mKCp6cmFtLT50YWJsZSkpOwogCWlmICghenJhbS0+dGFibGUpIHsKIAkJcHJfZXJyKCJFcnJvciBhbGxvY2F0aW5nIHpyYW0gYWRkcmVzcyB0YWJsZVxuIik7Ci0JCS8qIFRvIHByZXZlbnQgYWNjZXNzaW5nIHRhYmxlIGVudHJpZXMgZHVyaW5nIGNsZWFudXAgKi8KLQkJenJhbS0+ZGlza3NpemUgPSAwOwogCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGZhaWw7CisJCWdvdG8gZmFpbF9ub190YWJsZTsKIAl9CiAKIAlzZXRfY2FwYWNpdHkoenJhbS0+ZGlzaywgenJhbS0+ZGlza3NpemUgPj4gU0VDVE9SX1NISUZUKTsKQEAgLTY3MSwyMCArNjgyLDIzIEBACiAJfQogCiAJenJhbS0+aW5pdF9kb25lID0gMTsKLQltdXRleF91bmxvY2soJnpyYW0tPmluaXRfbG9jayk7CisJdXBfd3JpdGUoJnpyYW0tPmluaXRfbG9jayk7CiAKIAlwcl9kZWJ1ZygiSW5pdGlhbGl6YXRpb24gZG9uZSFcbiIpOwogCXJldHVybiAwOwogCitmYWlsX25vX3RhYmxlOgorCS8qIFRvIHByZXZlbnQgYWNjZXNzaW5nIHRhYmxlIGVudHJpZXMgZHVyaW5nIGNsZWFudXAgKi8KKwl6cmFtLT5kaXNrc2l6ZSA9IDA7CiBmYWlsOgotCW11dGV4X3VubG9jaygmenJhbS0+aW5pdF9sb2NrKTsKLQl6cmFtX3Jlc2V0X2RldmljZSh6cmFtKTsKLQorCV9fenJhbV9yZXNldF9kZXZpY2UoenJhbSk7CisJdXBfd3JpdGUoJnpyYW0tPmluaXRfbG9jayk7CiAJcHJfZXJyKCJJbml0aWFsaXphdGlvbiBmYWlsZWQ6IGVycj0lZFxuIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIHpyYW1fc2xvdF9mcmVlX25vdGlmeShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCB1bnNpZ25lZCBsb25nIGluZGV4KQorc3RhdGljIHZvaWQgenJhbV9zbG90X2ZyZWVfbm90aWZ5KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCQkJdW5zaWduZWQgbG9uZyBpbmRleCkKIHsKIAlzdHJ1Y3QgenJhbSAqenJhbTsKIApAQCAtNzAzLDcgKzcxNyw3IEBACiAJaW50IHJldCA9IDA7CiAKIAlpbml0X3J3c2VtKCZ6cmFtLT5sb2NrKTsKLQltdXRleF9pbml0KCZ6cmFtLT5pbml0X2xvY2spOworCWluaXRfcndzZW0oJnpyYW0tPmluaXRfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnpyYW0tPnN0YXQ2NF9sb2NrKTsKIAogCXpyYW0tPnF1ZXVlID0gYmxrX2FsbG9jX3F1ZXVlKEdGUF9LRVJORUwpOwpAQCAtNzgwLDkgKzc5NCw5IEBACiB7CiAJaW50IHJldCwgZGV2X2lkOwogCi0JaWYgKG51bV9kZXZpY2VzID4gbWF4X251bV9kZXZpY2VzKSB7CisJaWYgKHpyYW1fbnVtX2RldmljZXMgPiBtYXhfbnVtX2RldmljZXMpIHsKIAkJcHJfd2FybmluZygiSW52YWxpZCB2YWx1ZSBmb3IgbnVtX2RldmljZXM6ICV1XG4iLAotCQkJCW51bV9kZXZpY2VzKTsKKwkJCQl6cmFtX251bV9kZXZpY2VzKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNzk0LDIxICs4MDgsMjEgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKCFudW1fZGV2aWNlcykgeworCWlmICghenJhbV9udW1fZGV2aWNlcykgewogCQlwcl9pbmZvKCJudW1fZGV2aWNlcyBub3Qgc3BlY2lmaWVkLiBVc2luZyBkZWZhdWx0OiAxXG4iKTsKLQkJbnVtX2RldmljZXMgPSAxOworCQl6cmFtX251bV9kZXZpY2VzID0gMTsKIAl9CiAKIAkvKiBBbGxvY2F0ZSB0aGUgZGV2aWNlIGFycmF5IGFuZCBpbml0aWFsaXplIGVhY2ggb25lICovCi0JcHJfaW5mbygiQ3JlYXRpbmcgJXUgZGV2aWNlcyAuLi5cbiIsIG51bV9kZXZpY2VzKTsKLQlkZXZpY2VzID0ga3phbGxvYyhudW1fZGV2aWNlcyAqIHNpemVvZihzdHJ1Y3QgenJhbSksIEdGUF9LRVJORUwpOwotCWlmICghZGV2aWNlcykgeworCXByX2luZm8oIkNyZWF0aW5nICV1IGRldmljZXMgLi4uXG4iLCB6cmFtX251bV9kZXZpY2VzKTsKKwl6cmFtX2RldmljZXMgPSBremFsbG9jKHpyYW1fbnVtX2RldmljZXMgKiBzaXplb2Yoc3RydWN0IHpyYW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXpyYW1fZGV2aWNlcykgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIHVucmVnaXN0ZXI7CiAJfQogCi0JZm9yIChkZXZfaWQgPSAwOyBkZXZfaWQgPCBudW1fZGV2aWNlczsgZGV2X2lkKyspIHsKLQkJcmV0ID0gY3JlYXRlX2RldmljZSgmZGV2aWNlc1tkZXZfaWRdLCBkZXZfaWQpOworCWZvciAoZGV2X2lkID0gMDsgZGV2X2lkIDwgenJhbV9udW1fZGV2aWNlczsgZGV2X2lkKyspIHsKKwkJcmV0ID0gY3JlYXRlX2RldmljZSgmenJhbV9kZXZpY2VzW2Rldl9pZF0sIGRldl9pZCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGZyZWVfZGV2aWNlczsKIAl9CkBAIC04MTcsOCArODMxLDggQEAKIAogZnJlZV9kZXZpY2VzOgogCXdoaWxlIChkZXZfaWQpCi0JCWRlc3Ryb3lfZGV2aWNlKCZkZXZpY2VzWy0tZGV2X2lkXSk7Ci0Ja2ZyZWUoZGV2aWNlcyk7CisJCWRlc3Ryb3lfZGV2aWNlKCZ6cmFtX2RldmljZXNbLS1kZXZfaWRdKTsKKwlrZnJlZSh6cmFtX2RldmljZXMpOwogdW5yZWdpc3RlcjoKIAl1bnJlZ2lzdGVyX2Jsa2Rldih6cmFtX21ham9yLCAienJhbSIpOwogb3V0OgpAQCAtODMwLDggKzg0NCw4IEBACiAJaW50IGk7CiAJc3RydWN0IHpyYW0gKnpyYW07CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2RldmljZXM7IGkrKykgewotCQl6cmFtID0gJmRldmljZXNbaV07CisJZm9yIChpID0gMDsgaSA8IHpyYW1fbnVtX2RldmljZXM7IGkrKykgeworCQl6cmFtID0gJnpyYW1fZGV2aWNlc1tpXTsKIAogCQlkZXN0cm95X2RldmljZSh6cmFtKTsKIAkJaWYgKHpyYW0tPmluaXRfZG9uZSkKQEAgLTg0MCwxMiArODU0LDEyIEBACiAKIAl1bnJlZ2lzdGVyX2Jsa2Rldih6cmFtX21ham9yLCAienJhbSIpOwogCi0Ja2ZyZWUoZGV2aWNlcyk7CisJa2ZyZWUoenJhbV9kZXZpY2VzKTsKIAlwcl9kZWJ1ZygiQ2xlYW51cCBkb25lIVxuIik7CiB9CiAKLW1vZHVsZV9wYXJhbShudW1fZGV2aWNlcywgdWludCwgMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKG51bV9kZXZpY2VzLCAiTnVtYmVyIG9mIHpyYW0gZGV2aWNlcyIpOworbW9kdWxlX3BhcmFtKHpyYW1fbnVtX2RldmljZXMsIHVpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh6cmFtX251bV9kZXZpY2VzLCAiTnVtYmVyIG9mIHpyYW0gZGV2aWNlcyIpOwogCiBtb2R1bGVfaW5pdCh6cmFtX2luaXQpOwogbW9kdWxlX2V4aXQoenJhbV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy96cmFtL3pyYW1fZHJ2LmggYi9kcml2ZXJzL3N0YWdpbmcvenJhbS96cmFtX2Rydi5oCmluZGV4IGFiZTUyMjEuLmU1Y2QyNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy96cmFtL3pyYW1fZHJ2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3pyYW0venJhbV9kcnYuaApAQCAtNDcsNyArNDcsNyBAQAogICogUGFnZXMgdGhhdCBjb21wcmVzcyB0byBzaXplIGdyZWF0ZXIgdGhhbiB0aGlzIGFyZSBzdG9yZWQKICAqIHVuY29tcHJlc3NlZCBpbiBtZW1vcnkuCiAgKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBtYXhfenBhZ2Vfc2l6ZSA9IFBBR0VfU0laRSAvIDQgKiAzOworc3RhdGljIGNvbnN0IHNpemVfdCBtYXhfenBhZ2Vfc2l6ZSA9IFBBR0VfU0laRSAvIDQgKiAzOwogCiAvKgogICogTk9URTogbWF4X3pwYWdlX3NpemUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG86CkBAIC0xMTIsOCArMTEyLDggQEAKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcXVldWU7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2s7CiAJaW50IGluaXRfZG9uZTsKLQkvKiBQcmV2ZW50IGNvbmN1cnJlbnQgZXhlY3V0aW9uIG9mIGRldmljZSBpbml0IGFuZCByZXNldCAqLwotCXN0cnVjdCBtdXRleCBpbml0X2xvY2s7CisJLyogUHJldmVudCBjb25jdXJyZW50IGV4ZWN1dGlvbiBvZiBkZXZpY2UgaW5pdCwgcmVzZXQgYW5kIFIvVyByZXF1ZXN0ICovCisJc3RydWN0IHJ3X3NlbWFwaG9yZSBpbml0X2xvY2s7CiAJLyoKIAkgKiBUaGlzIGlzIHRoZSBsaW1pdCBvbiBhbW91bnQgb2YgKnVuY29tcHJlc3NlZCogd29ydGggb2YgZGF0YQogCSAqIHdlIGNhbiBzdG9yZSBpbiBhIGRpc2suCkBAIC0xMjMsMTMgKzEyMywxMyBAQAogCXN0cnVjdCB6cmFtX3N0YXRzIHN0YXRzOwogfTsKIAotZXh0ZXJuIHN0cnVjdCB6cmFtICpkZXZpY2VzOwotZXh0ZXJuIHVuc2lnbmVkIGludCBudW1fZGV2aWNlczsKK2V4dGVybiBzdHJ1Y3QgenJhbSAqenJhbV9kZXZpY2VzOworZXh0ZXJuIHVuc2lnbmVkIGludCB6cmFtX251bV9kZXZpY2VzOwogI2lmZGVmIENPTkZJR19TWVNGUwogZXh0ZXJuIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgenJhbV9kaXNrX2F0dHJfZ3JvdXA7CiAjZW5kaWYKIAogZXh0ZXJuIGludCB6cmFtX2luaXRfZGV2aWNlKHN0cnVjdCB6cmFtICp6cmFtKTsKLWV4dGVybiB2b2lkIHpyYW1fcmVzZXRfZGV2aWNlKHN0cnVjdCB6cmFtICp6cmFtKTsKK2V4dGVybiB2b2lkIF9fenJhbV9yZXNldF9kZXZpY2Uoc3RydWN0IHpyYW0gKnpyYW0pOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy96cmFtL3pyYW1fc3lzZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy96cmFtL3pyYW1fc3lzZnMuYwppbmRleCBhNzBjYzAxLi4wZWE4ZWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvenJhbS96cmFtX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3pyYW0venJhbV9zeXNmcy5jCkBAIC0zNCw4ICszNCw4IEBACiAJaW50IGk7CiAJc3RydWN0IHpyYW0gKnpyYW0gPSBOVUxMOwogCi0JZm9yIChpID0gMDsgaSA8IG51bV9kZXZpY2VzOyBpKyspIHsKLQkJenJhbSA9ICZkZXZpY2VzW2ldOworCWZvciAoaSA9IDA7IGkgPCB6cmFtX251bV9kZXZpY2VzOyBpKyspIHsKKwkJenJhbSA9ICZ6cmFtX2RldmljZXNbaV07CiAJCWlmIChkaXNrX3RvX2Rldih6cmFtLT5kaXNrKSA9PSBkZXYpCiAJCQlicmVhazsKIAl9CkBAIC01NSwxOSArNTUsMjMgQEAKIAkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKIHsKIAlpbnQgcmV0OworCXU2NCBkaXNrc2l6ZTsKIAlzdHJ1Y3QgenJhbSAqenJhbSA9IGRldl90b196cmFtKGRldik7CiAKKwlyZXQgPSBzdHJpY3Rfc3RydG91bGwoYnVmLCAxMCwgJmRpc2tzaXplKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZG93bl93cml0ZSgmenJhbS0+aW5pdF9sb2NrKTsKIAlpZiAoenJhbS0+aW5pdF9kb25lKSB7CisJCXVwX3dyaXRlKCZ6cmFtLT5pbml0X2xvY2spOwogCQlwcl9pbmZvKCJDYW5ub3QgY2hhbmdlIGRpc2tzaXplIGZvciBpbml0aWFsaXplZCBkZXZpY2VcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCXJldCA9IHN0cmljdF9zdHJ0b3VsbChidWYsIDEwLCAmenJhbS0+ZGlza3NpemUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQl6cmFtLT5kaXNrc2l6ZSA9IFBBR0VfQUxJR04oenJhbS0+ZGlza3NpemUpOworCXpyYW0tPmRpc2tzaXplID0gUEFHRV9BTElHTihkaXNrc2l6ZSk7CiAJc2V0X2NhcGFjaXR5KHpyYW0tPmRpc2ssIHpyYW0tPmRpc2tzaXplID4+IFNFQ1RPUl9TSElGVCk7CisJdXBfd3JpdGUoJnpyYW0tPmluaXRfbG9jayk7CiAKIAlyZXR1cm4gbGVuOwogfQpAQCAtMTA2LDggKzExMCwxMCBAQAogCWlmIChiZGV2KQogCQlmc3luY19iZGV2KGJkZXYpOwogCisJZG93bl93cml0ZSgmenJhbS0+aW5pdF9sb2NrKTsKIAlpZiAoenJhbS0+aW5pdF9kb25lKQotCQl6cmFtX3Jlc2V0X2RldmljZSh6cmFtKTsKKwkJX196cmFtX3Jlc2V0X2RldmljZSh6cmFtKTsKKwl1cF93cml0ZSgmenJhbS0+aW5pdF9sb2NrKTsKIAogCXJldHVybiBsZW47CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvaHlwZXJ2LmggYi9pbmNsdWRlL2xpbnV4L2h5cGVydi5oCnNpbWlsYXJpdHkgaW5kZXggODUlCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9odi9oeXBlcnYuaApyZW5hbWUgdG8gaW5jbHVkZS9saW51eC9oeXBlcnYuaAppbmRleCAxNzQ3YTI0Li4xMmVjMzI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvaHlwZXJ2LmgKKysrIGIvaW5jbHVkZS9saW51eC9oeXBlcnYuaApAQCAtMjcsMTggKzI3LDE0IEBACiAKICNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC91dWlkLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CiAKIAotI2luY2x1ZGUgPGFzbS9oeXBlcnYuaD4KLQotc3RydWN0IGh2X2d1aWQgewotCXVuc2lnbmVkIGNoYXIgZGF0YVsxNl07Ci19OwotCiAjZGVmaW5lIE1BWF9QQUdFX0JVRkZFUl9DT1VOVAkJCQkxNgogI2RlZmluZSBNQVhfTVVMVElQQUdFX0JVRkZFUl9DT1VOVAkJCTMyIC8qIDEyOEsgKi8KIApAQCAtMTU2LDggKzE1Miw4IEBACiAgKiBzdHJ1Y3QgY29udGFpbnMgdGhlIGZ1bmRhbWVudGFsIGluZm9ybWF0aW9uIGFib3V0IGFuIG9mZmVyLgogICovCiBzdHJ1Y3Qgdm1idXNfY2hhbm5lbF9vZmZlciB7Ci0Jc3RydWN0IGh2X2d1aWQgaWZfdHlwZTsKLQlzdHJ1Y3QgaHZfZ3VpZCBpZl9pbnN0YW5jZTsKKwl1dWlkX2xlIGlmX3R5cGU7CisJdXVpZF9sZSBpZl9pbnN0YW5jZTsKIAl1NjQgaW50X2xhdGVuY3k7IC8qIGluIDEwMG5zIHVuaXRzICovCiAJdTMyIGlmX3JldmlzaW9uOwogCXUzMiBzZXJ2ZXJfY3R4X3NpemU7CS8qIGluIGJ5dGVzICovCkBAIC01MjYsOCArNTIyLDggQEAKIHN0cnVjdCB2bWJ1c19jaGFubmVsX2RlYnVnX2luZm8gewogCXUzMiByZWxpZDsKIAllbnVtIHZtYnVzX2NoYW5uZWxfc3RhdGUgc3RhdGU7Ci0Jc3RydWN0IGh2X2d1aWQgaW50ZXJmYWNldHlwZTsKLQlzdHJ1Y3QgaHZfZ3VpZCBpbnRlcmZhY2VfaW5zdGFuY2U7CisJdXVpZF9sZSBpbnRlcmZhY2V0eXBlOworCXV1aWRfbGUgaW50ZXJmYWNlX2luc3RhbmNlOwogCXUzMiBtb25pdG9yaWQ7CiAJdTMyIHNlcnZlcm1vbml0b3JfcGVuZGluZzsKIAl1MzIgc2VydmVybW9uaXRvcl9sYXRlbmN5OwpAQCAtNTgyLDExICs1NzgsNiBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogCiAJZW51bSB2bWJ1c19jaGFubmVsX3N0YXRlIHN0YXRlOwotCS8qCi0JICogRm9yIHV0aWwgY2hhbm5lbHMsIHN0YXNoIHRoZQotCSAqIHRoZSBzZXJ2aWNlIGluZGV4IGZvciBlYXN5IGFjY2Vzcy4KLQkgKi8KLQlzOCB1dGlsX2luZGV4OwogCiAJc3RydWN0IHZtYnVzX2NoYW5uZWxfb2ZmZXJfY2hhbm5lbCBvZmZlcm1zZzsKIAkvKgpAQCAtNjE1LDggKzYwNiw2IEBACiAJdm9pZCAqY2hhbm5lbF9jYWxsYmFja19jb250ZXh0OwogfTsKIAotdm9pZCBmcmVlX2NoYW5uZWwoc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWwpOwotCiB2b2lkIHZtYnVzX29ubWVzc2FnZSh2b2lkICpjb250ZXh0KTsKIAogaW50IHZtYnVzX3JlcXVlc3Rfb2ZmZXJzKHZvaWQpOwpAQCAtNzAyLDc5ICs2OTEsNiBAQAogCiBleHRlcm4gdm9pZCB2bWJ1c19vbnRpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKLQotI2RlZmluZSBMT1dPUkQoZHcpICgodW5zaWduZWQgc2hvcnQpKGR3KSkKLSNkZWZpbmUgSElXT1JEKGR3KSAoKHVuc2lnbmVkIHNob3J0KSgoKHVuc2lnbmVkIGludCkgKGR3KSA+PiAxNikgJiAweEZGRkYpKQotCi0KLSNkZWZpbmUgVk1CVVMJCQkJMHgwMDAxCi0jZGVmaW5lIFNUT1JWU0MJCQkJMHgwMDAyCi0jZGVmaW5lIE5FVFZTQwkJCQkweDAwMDQKLSNkZWZpbmUgSU5QVVRWU0MJCQkweDAwMDgKLSNkZWZpbmUgQkxLVlNDCQkJCTB4MDAxMAotI2RlZmluZSBWTUJVU19EUlYJCQkweDAxMDAKLSNkZWZpbmUgU1RPUlZTQ19EUlYJCQkweDAyMDAKLSNkZWZpbmUgTkVUVlNDX0RSVgkJCTB4MDQwMAotI2RlZmluZSBJTlBVVFZTQ19EUlYJCTB4MDgwMAotI2RlZmluZSBCTEtWU0NfRFJWCQkJMHgxMDAwCi0KLSNkZWZpbmUgQUxMX01PRFVMRVMJCQkoVk1CVVMJCXxcCi0JCQkJCQkJU1RPUlZTQwkJfFwKLQkJCQkJCQlORVRWU0MJCXxcCi0JCQkJCQkJSU5QVVRWU0MJfFwKLQkJCQkJCQlCTEtWU0MJCXxcCi0JCQkJCQkJVk1CVVNfRFJWCXxcCi0JCQkJCQkJU1RPUlZTQ19EUlYJfFwKLQkJCQkJCQlORVRWU0NfRFJWCXxcCi0JCQkJCQkJSU5QVVRWU0NfRFJWfFwKLQkJCQkJCQlCTEtWU0NfRFJWKQotCi0vKiBMb2dnaW5nIExldmVsICovCi0jZGVmaW5lIEVSUk9SX0xWTAkJCQkzCi0jZGVmaW5lIFdBUk5JTkdfTFZMCQkJCTQKLSNkZWZpbmUgSU5GT19MVkwJCQkJNgotI2RlZmluZSBERUJVR19MVkwJCQkJNwotI2RlZmluZSBERUJVR19MVkxfRU5URVJFWElUCQkJOAotI2RlZmluZSBERUJVR19SSU5HX0xWTAkJCQk5Ci0KLWV4dGVybiB1bnNpZ25lZCBpbnQgdm1idXNfbG9nbGV2ZWw7Ci0KLSNkZWZpbmUgRFBSSU5UKG1vZCwgbHZsLCBmbXQsIGFyZ3MuLi4pIGRvIHtcCi0JaWYgKChtb2QgJiAoSElXT1JEKHZtYnVzX2xvZ2xldmVsKSkpICYmCVwKLQkgICAgKGx2bCA8PSBMT1dPUkQodm1idXNfbG9nbGV2ZWwpKSkJXAotCQlwcmludGsoS0VSTl9ERUJVRyAjbW9kIjogJXMoKSAiIGZtdCAiXG4iLCBfX2Z1bmNfXywgIyMgYXJncyk7XAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgRFBSSU5UX0RCRyhtb2QsIGZtdCwgYXJncy4uLikgZG8ge1wKLQlpZiAoKG1vZCAmIChISVdPUkQodm1idXNfbG9nbGV2ZWwpKSkgJiYJCVwKLQkgICAgKERFQlVHX0xWTCA8PSBMT1dPUkQodm1idXNfbG9nbGV2ZWwpKSkJXAotCQlwcmludGsoS0VSTl9ERUJVRyAjbW9kIjogJXMoKSAiIGZtdCAiXG4iLCBfX2Z1bmNfXywgIyMgYXJncyk7XAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgRFBSSU5UX0lORk8obW9kLCBmbXQsIGFyZ3MuLi4pIGRvIHtcCi0JaWYgKChtb2QgJiAoSElXT1JEKHZtYnVzX2xvZ2xldmVsKSkpICYmCQlcCi0JICAgIChJTkZPX0xWTCA8PSBMT1dPUkQodm1idXNfbG9nbGV2ZWwpKSkJXAotCQlwcmludGsoS0VSTl9JTkZPICNtb2QiOiAiIGZtdCAiXG4iLCAjIyBhcmdzKTtcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBEUFJJTlRfV0FSTihtb2QsIGZtdCwgYXJncy4uLikgZG8ge1wKLQlpZiAoKG1vZCAmIChISVdPUkQodm1idXNfbG9nbGV2ZWwpKSkgJiYJCVwKLQkgICAgKFdBUk5JTkdfTFZMIDw9IExPV09SRCh2bWJ1c19sb2dsZXZlbCkpKQlcCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgI21vZCI6IFdBUk5JTkchICIgZm10ICJcbiIsICMjIGFyZ3MpO1wKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIERQUklOVF9FUlIobW9kLCBmbXQsIGFyZ3MuLi4pIGRvIHtcCi0JaWYgKChtb2QgJiAoSElXT1JEKHZtYnVzX2xvZ2xldmVsKSkpICYmCQlcCi0JICAgIChFUlJPUl9MVkwgPD0gTE9XT1JEKHZtYnVzX2xvZ2xldmVsKSkpCVwKLQkJcHJpbnRrKEtFUk5fRVJSICNtb2QiOiAlcygpIEVSUk9SISEgIiBmbXQgIlxuIiwJXAotCQkgICAgICAgX19mdW5jX18sICMjIGFyZ3MpO1wKLQl9IHdoaWxlICgwKQotCi0KLQotc3RydWN0IGh2X2RyaXZlcjsKLXN0cnVjdCBodl9kZXZpY2U7Ci0KIHN0cnVjdCBodl9kZXZfcG9ydF9pbmZvIHsKIAl1MzIgaW50X21hc2s7CiAJdTMyIHJlYWRfaWR4OwpAQCAtNzgzLDM0ICs2OTksMTcgQEAKIAl1MzIgYnl0ZXNfYXZhaWxfdG93cml0ZTsKIH07CiAKLXN0cnVjdCBodl9kZXZpY2VfaW5mbyB7Ci0JdTMyIGNobl9pZDsKLQl1MzIgY2huX3N0YXRlOwotCXN0cnVjdCBodl9ndWlkIGNobl90eXBlOwotCXN0cnVjdCBodl9ndWlkIGNobl9pbnN0YW5jZTsKLQotCXUzMiBtb25pdG9yX2lkOwotCXUzMiBzZXJ2ZXJfbW9uaXRvcl9wZW5kaW5nOwotCXUzMiBzZXJ2ZXJfbW9uaXRvcl9sYXRlbmN5OwotCXUzMiBzZXJ2ZXJfbW9uaXRvcl9jb25uX2lkOwotCXUzMiBjbGllbnRfbW9uaXRvcl9wZW5kaW5nOwotCXUzMiBjbGllbnRfbW9uaXRvcl9sYXRlbmN5OwotCXUzMiBjbGllbnRfbW9uaXRvcl9jb25uX2lkOwotCi0Jc3RydWN0IGh2X2Rldl9wb3J0X2luZm8gaW5ib3VuZDsKLQlzdHJ1Y3QgaHZfZGV2X3BvcnRfaW5mbyBvdXRib3VuZDsKLX07Ci0KIC8qIEJhc2UgZHJpdmVyIG9iamVjdCAqLwogc3RydWN0IGh2X2RyaXZlciB7CiAJY29uc3QgY2hhciAqbmFtZTsKIAogCS8qIHRoZSBkZXZpY2UgdHlwZSBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIgKi8KLQlzdHJ1Y3QgaHZfZ3VpZCBkZXZfdHlwZTsKKwl1dWlkX2xlIGRldl90eXBlOworCWNvbnN0IHN0cnVjdCBodl92bWJ1c19kZXZpY2VfaWQgKmlkX3RhYmxlOwogCiAJc3RydWN0IGRldmljZV9kcml2ZXIgZHJpdmVyOwogCi0JaW50ICgqcHJvYmUpKHN0cnVjdCBodl9kZXZpY2UgKik7CisJaW50ICgqcHJvYmUpKHN0cnVjdCBodl9kZXZpY2UgKiwgY29uc3Qgc3RydWN0IGh2X3ZtYnVzX2RldmljZV9pZCAqKTsKIAlpbnQgKCpyZW1vdmUpKHN0cnVjdCBodl9kZXZpY2UgKik7CiAJdm9pZCAoKnNodXRkb3duKShzdHJ1Y3QgaHZfZGV2aWNlICopOwogCkBAIC04MTksMTcgKzcxOCwxNCBAQAogLyogQmFzZSBkZXZpY2Ugb2JqZWN0ICovCiBzdHJ1Y3QgaHZfZGV2aWNlIHsKIAkvKiB0aGUgZGV2aWNlIHR5cGUgaWQgb2YgdGhpcyBkZXZpY2UgKi8KLQlzdHJ1Y3QgaHZfZ3VpZCBkZXZfdHlwZTsKKwl1dWlkX2xlIGRldl90eXBlOwogCiAJLyogdGhlIGRldmljZSBpbnN0YW5jZSBpZCBvZiB0aGlzIGRldmljZSAqLwotCXN0cnVjdCBodl9ndWlkIGRldl9pbnN0YW5jZTsKKwl1dWlkX2xlIGRldl9pbnN0YW5jZTsKIAogCXN0cnVjdCBkZXZpY2UgZGV2aWNlOwogCiAJc3RydWN0IHZtYnVzX2NoYW5uZWwgKmNoYW5uZWw7Ci0KLQkvKiBEZXZpY2UgZXh0ZW5zaW9uOyAqLwotCXZvaWQgKmV4dDsKIH07CiAKIApAQCAtODQzLDEwICs3MzksMzQgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKGQsIHN0cnVjdCBodl9kcml2ZXIsIGRyaXZlcik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBodl9zZXRfZHJ2ZGF0YShzdHJ1Y3QgaHZfZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldmljZSwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqaHZfZ2V0X2RydmRhdGEoc3RydWN0IGh2X2RldmljZSAqZGV2KQoreworCXJldHVybiBkZXZfZ2V0X2RydmRhdGEoJmRldi0+ZGV2aWNlKTsKK30KIAogLyogVm1idXMgaW50ZXJmYWNlICovCi1pbnQgdm1idXNfY2hpbGRfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpOwotdm9pZCB2bWJ1c19jaGlsZF9kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2KTsKKyNkZWZpbmUgdm1idXNfZHJpdmVyX3JlZ2lzdGVyKGRyaXZlcikJXAorCV9fdm1idXNfZHJpdmVyX3JlZ2lzdGVyKGRyaXZlciwgVEhJU19NT0RVTEUsIEtCVUlMRF9NT0ROQU1FKQoraW50IF9fbXVzdF9jaGVjayBfX3ZtYnVzX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgaHZfZHJpdmVyICpodl9kcml2ZXIsCisJCQkJCSBzdHJ1Y3QgbW9kdWxlICpvd25lciwKKwkJCQkJIGNvbnN0IGNoYXIgKm1vZF9uYW1lKTsKK3ZvaWQgdm1idXNfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IGh2X2RyaXZlciAqaHZfZHJpdmVyKTsKKworLyoqCisgKiBWTUJVU19ERVZJQ0UgLSBtYWNybyB1c2VkIHRvIGRlc2NyaWJlIGEgc3BlY2lmaWMgaHlwZXJ2IHZtYnVzIGRldmljZQorICoKKyAqIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBjcmVhdGUgYSBzdHJ1Y3QgaHZfdm1idXNfZGV2aWNlX2lkIHRoYXQgbWF0Y2hlcyBhCisgKiBzcGVjaWZpYyBkZXZpY2UuCisgKi8KKyNkZWZpbmUgVk1CVVNfREVWSUNFKGcwLCBnMSwgZzIsIGczLCBnNCwgZzUsIGc2LCBnNywJXAorCQkgICAgIGc4LCBnOSwgZ2EsIGdiLCBnYywgZ2QsIGdlLCBnZikJXAorCS5ndWlkID0geyBnMCwgZzEsIGcyLCBnMywgZzQsIGc1LCBnNiwgZzcsCVwKKwkJICBnOCwgZzksIGdhLCBnYiwgZ2MsIGdkLCBnZSwgZ2YgfSwKIAogLyoKICAqIENvbW1vbiBoZWFkZXIgZm9yIEh5cGVyLVYgSUNzCkBAIC04NjgsNiArNzg4LDE5IEBACiAjZGVmaW5lIEhWX0VSUk9SX05PVF9TVVBQT1JURUQJCTB4ODAwNzAwMzIKICNkZWZpbmUgSFZfRVJST1JfTUFDSElORV9MT0NLRUQJCTB4ODAwNzA0RjcKIAorLyoKKyAqIFdoaWxlIHdlIHdhbnQgdG8gaGFuZGxlIHV0aWwgc2VydmljZXMgYXMgcmVndWxhciBkZXZpY2VzLAorICogdGhlcmUgaXMgb25seSBvbmUgaW5zdGFuY2Ugb2YgZWFjaCBvZiB0aGVzZSBzZXJ2aWNlczsgc28KKyAqIHdlIHN0YXRpY2FsbHkgYWxsb2NhdGUgdGhlIHNlcnZpY2Ugc3BlY2lmaWMgc3RhdGUuCisgKi8KKworc3RydWN0IGh2X3V0aWxfc2VydmljZSB7CisJdTggKnJlY3ZfYnVmZmVyOworCXZvaWQgKCp1dGlsX2NiKSh2b2lkICopOworCWludCAoKnV0aWxfaW5pdCkoc3RydWN0IGh2X3V0aWxfc2VydmljZSAqKTsKKwl2b2lkICgqdXRpbF9kZWluaXQpKHZvaWQpOworfTsKKwogc3RydWN0IHZtYnVzcGlwZV9oZHIgewogCXUzMiBmbGFnczsKIAl1MzIgbXNnc2l6ZTsKQEAgLTkyNiwyMyArODU5LDE1IEBACiAJdTggZmxhZ3M7CiB9IF9fcGFja2VkOwogCi0vKiBJbmRleCBmb3IgZWFjaCBJQyBzdHJ1Y3QgaW4gYXJyYXkgaHZfY2JfdXRpbHNbXSAqLwotI2RlZmluZSBIVl9TSFVURE9XTl9NU0cJCTAKLSNkZWZpbmUgSFZfVElNRVNZTkNfTVNHCQkxCi0jZGVmaW5lIEhWX0hFQVJUQkVBVF9NU0cJMgotI2RlZmluZSBIVl9LVlBfTVNHCQkzCi0KIHN0cnVjdCBoeXBlcnZfc2VydmljZV9jYWxsYmFjayB7CiAJdTggbXNnX3R5cGU7CiAJY2hhciAqbG9nX21zZzsKLQl1bnNpZ25lZCBjaGFyIGRhdGFbMTZdOworCXV1aWRfbGUgZGF0YTsKIAlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqY2hhbm5lbDsKIAl2b2lkICgqY2FsbGJhY2spICh2b2lkICpjb250ZXh0KTsKIH07CiAKLWV4dGVybiB2b2lkIHByZXBfbmVnb3RpYXRlX3Jlc3Aoc3RydWN0IGljbXNnX2hkciAqLAotCQkJCXN0cnVjdCBpY21zZ19uZWdvdGlhdGUgKiwgdTggKik7Ci1leHRlcm4gdm9pZCBjaG5fY2JfbmVnb3RpYXRlKHZvaWQgKik7Ci1leHRlcm4gc3RydWN0IGh5cGVydl9zZXJ2aWNlX2NhbGxiYWNrIGh2X2NiX3V0aWxzW107CitleHRlcm4gdm9pZCB2bWJ1c19wcmVwX25lZ290aWF0ZV9yZXNwKHN0cnVjdCBpY21zZ19oZHIgKiwKKwkJCQkgICAgICBzdHJ1Y3QgaWNtc2dfbmVnb3RpYXRlICosIHU4ICopOwogCiAjZW5kaWYgLyogX0hZUEVSVl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vZF9kZXZpY2V0YWJsZS5oIGIvaW5jbHVkZS9saW51eC9tb2RfZGV2aWNldGFibGUuaAppbmRleCBhZTI4ZTkzLi40Njg4MTljIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZF9kZXZpY2V0YWJsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW9kX2RldmljZXRhYmxlLmgKQEAgLTQwNSw2ICs0MDUsMTUgQEAKIH07CiAjZGVmaW5lIFZJUlRJT19ERVZfQU5ZX0lECTB4ZmZmZmZmZmYKIAorLyoKKyAqIEZvciBIeXBlci1WIGRldmljZXMgd2UgdXNlIHRoZSBkZXZpY2UgZ3VpZCBhcyB0aGUgaWQuCisgKi8KK3N0cnVjdCBodl92bWJ1c19kZXZpY2VfaWQgeworCV9fdTggZ3VpZFsxNl07CisJa2VybmVsX3Vsb25nX3QgZHJpdmVyX2RhdGEJLyogRGF0YSBwcml2YXRlIHRvIHRoZSBkcml2ZXIgKi8KKwkJCV9fYXR0cmlidXRlX18oKGFsaWduZWQoc2l6ZW9mKGtlcm5lbF91bG9uZ190KSkpKTsKK307CisKIC8qIGkyYyAqLwogCiAjZGVmaW5lIEkyQ19OQU1FX1NJWkUJMjAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYyBiL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYwppbmRleCBlMjZlMmZiLi5mOTM2ZDFmIDEwMDY0NAotLS0gYS9zY3JpcHRzL21vZC9maWxlMmFsaWFzLmMKKysrIGIvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jCkBAIC03MzUsNiArNzM1LDI3IEBACiAJcmV0dXJuIDE7CiB9CiAKKy8qCisgKiBMb29rcyBsaWtlOiB2bWJ1czpndWlkCisgKiBFYWNoIGJ5dGUgb2YgdGhlIGd1aWQgd2lsbCBiZSByZXByZXNlbnRlZCBieSB0d28gaGV4IGNoYXJhY3RlcnMKKyAqIGluIHRoZSBuYW1lLgorICovCisKK3N0YXRpYyBpbnQgZG9fdm1idXNfZW50cnkoY29uc3QgY2hhciAqZmlsZW5hbWUsIHN0cnVjdCBodl92bWJ1c19kZXZpY2VfaWQgKmlkLAorCQkJICBjaGFyICphbGlhcykKK3sKKwlpbnQgaTsKKwljaGFyIGd1aWRfbmFtZVsoKHNpemVvZihpZC0+Z3VpZCkgKyAxKSkgKiAyXTsKKworCWZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKGlkLT5ndWlkKSAqIDIpOyBpICs9IDIpCisJCXNwcmludGYoJmd1aWRfbmFtZVtpXSwgIiUwMngiLCBpZC0+Z3VpZFtpLzJdKTsKKworCXN0cmNweShhbGlhcywgInZtYnVzOiIpOworCXN0cmNhdChhbGlhcywgZ3VpZF9uYW1lKTsKKworCXJldHVybiAxOworfQorCiAvKiBMb29rcyBsaWtlOiBpMmM6UyAqLwogc3RhdGljIGludCBkb19pMmNfZW50cnkoY29uc3QgY2hhciAqZmlsZW5hbWUsIHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCwKIAkJCWNoYXIgKmFsaWFzKQpAQCAtOTk0LDYgKzEwMTUsMTAgQEAKIAkJZG9fdGFibGUoc3ltdmFsLCBzeW0tPnN0X3NpemUsCiAJCQkgc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fZGV2aWNlX2lkKSwgInZpcnRpbyIsCiAJCQkgZG9fdmlydGlvX2VudHJ5LCBtb2QpOworCWVsc2UgaWYgKHN5bV9pcyhzeW1uYW1lLCAiX19tb2Rfdm1idXNfZGV2aWNlX3RhYmxlIikpCisJCWRvX3RhYmxlKHN5bXZhbCwgc3ltLT5zdF9zaXplLAorCQkJIHNpemVvZihzdHJ1Y3QgaHZfdm1idXNfZGV2aWNlX2lkKSwgInZtYnVzIiwKKwkJCSBkb192bWJ1c19lbnRyeSwgbW9kKTsKIAllbHNlIGlmIChzeW1faXMoc3ltbmFtZSwgIl9fbW9kX2kyY19kZXZpY2VfdGFibGUiKSkKIAkJZG9fdGFibGUoc3ltdmFsLCBzeW0tPnN0X3NpemUsCiAJCQkgc2l6ZW9mKHN0cnVjdCBpMmNfZGV2aWNlX2lkKSwgImkyYyIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaHYvdG9vbHMvaHZfa3ZwX2RhZW1vbi5jIGIvdG9vbHMvaHYvaHZfa3ZwX2RhZW1vbi5jCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIGRyaXZlcnMvc3RhZ2luZy9odi90b29scy9odl9rdnBfZGFlbW9uLmMKcmVuYW1lIHRvIHRvb2xzL2h2L2h2X2t2cF9kYWVtb24uYwppbmRleCBhNGE0MDdmLi4xMTIyNGVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaHYvdG9vbHMvaHZfa3ZwX2RhZW1vbi5jCisrKyBiL3Rvb2xzL2h2L2h2X2t2cF9kYWVtb24uYwpAQCAtMTE2LDcgKzExNiwxNiBAQAogCiAJdW5hbWUoJnV0c19idWYpOwogCW9zX2J1aWxkID0gdXRzX2J1Zi5yZWxlYXNlOwotCXByb2Nlc3Nvcl9hcmNoPSB1dHNfYnVmLm1hY2hpbmU7CisJcHJvY2Vzc29yX2FyY2ggPSB1dHNfYnVmLm1hY2hpbmU7CisKKwkvKgorCSAqIFRoZSBjdXJyZW50IHdpbmRvd3MgaG9zdCAod2luNykgZXhwZWN0cyB0aGUgYnVpbGQKKwkgKiBzdHJpbmcgdG8gYmUgb2YgdGhlIGZvcm06IHgueS56CisJICogU3RyaXAgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiB3ZSBtYXkgaGF2ZS4KKwkgKi8KKwlwID0gc3RyY2hyKG9zX2J1aWxkLCAnLScpOworCWlmIChwKQorCQkqcCA9ICdcMCc7CiAKIAlmaWxlID0gZm9wZW4oIi9ldGMvU3VTRS1yZWxlYXNlIiwgInIiKTsKIAlpZiAoZmlsZSAhPSBOVUxMKQpAQCAtMjY0LDIyICsyNzMsMjAgQEAKIGt2cF9nZXRfZG9tYWluX25hbWUoY2hhciAqYnVmZmVyLCBpbnQgbGVuZ3RoKQogewogCXN0cnVjdCBhZGRyaW5mbwloaW50cywgKmluZm8gOwotCWdldGhvc3RuYW1lKGJ1ZmZlciwgbGVuZ3RoKTsKIAlpbnQgZXJyb3IgPSAwOwogCisJZ2V0aG9zdG5hbWUoYnVmZmVyLCBsZW5ndGgpOwogCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwogCWhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ7IC8qR2V0IG9ubHkgaXB2NCBhZGRyaW5mby4gKi8KIAloaW50cy5haV9zb2NrdHlwZSA9IFNPQ0tfU1RSRUFNOwogCWhpbnRzLmFpX2ZsYWdzID0gQUlfQ0FOT05OQU1FOwogCi0JZXJyb3IgPSBnZXRhZGRyaW5mbyhidWZmZXIsICJodHRwIiwgJmhpbnRzLCAmaW5mbyk7CisJZXJyb3IgPSBnZXRhZGRyaW5mbyhidWZmZXIsIE5VTEwsICZoaW50cywgJmluZm8pOwogCWlmIChlcnJvciAhPSAwKSB7CiAJCXN0cmNweShidWZmZXIsICJnZXRhZGRyaW5mbyBmYWlsZWRcbiIpOwotCQllcnJvciA9IDE7Ci0JCWdvdG8gZ2V0X2RvbWFpbl9kb25lOworCQlyZXR1cm4gZXJyb3I7CiAJfQogCXN0cmNweShidWZmZXIsIGluZm8tPmFpX2Nhbm9ubmFtZSk7Ci1nZXRfZG9tYWluX2RvbmU6CiAJZnJlZWFkZHJpbmZvKGluZm8pOwogCXJldHVybiBlcnJvcjsKIH0K